diff --git a/build/three.cjs b/build/three.cjs index 03bd422b1428d3..7db97ff6005cc7 100644 --- a/build/three.cjs +++ b/build/three.cjs @@ -5,7 +5,7 @@ */ 'use strict'; -const REVISION = '175'; +const REVISION = '176dev'; /** * Represents mouse buttons and interaction types in context of controls. @@ -75761,3 +75761,4 @@ exports.ZeroFactor = ZeroFactor; exports.ZeroSlopeEnding = ZeroSlopeEnding; exports.ZeroStencilOp = ZeroStencilOp; exports.createCanvasElement = createCanvasElement; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhyZWUuY2pzIiwic291cmNlcyI6WyIuLi9zcmMvY29uc3RhbnRzLmpzIiwiLi4vc3JjL2NvcmUvRXZlbnREaXNwYXRjaGVyLmpzIiwiLi4vc3JjL21hdGgvTWF0aFV0aWxzLmpzIiwiLi4vc3JjL21hdGgvVmVjdG9yMi5qcyIsIi4uL3NyYy9tYXRoL01hdHJpeDMuanMiLCIuLi9zcmMvdXRpbHMuanMiLCIuLi9zcmMvbWF0aC9Db2xvck1hbmFnZW1lbnQuanMiLCIuLi9zcmMvZXh0cmFzL0ltYWdlVXRpbHMuanMiLCIuLi9zcmMvdGV4dHVyZXMvU291cmNlLmpzIiwiLi4vc3JjL3RleHR1cmVzL1RleHR1cmUuanMiLCIuLi9zcmMvbWF0aC9WZWN0b3I0LmpzIiwiLi4vc3JjL2NvcmUvUmVuZGVyVGFyZ2V0LmpzIiwiLi4vc3JjL3JlbmRlcmVycy9XZWJHTFJlbmRlclRhcmdldC5qcyIsIi4uL3NyYy90ZXh0dXJlcy9EYXRhQXJyYXlUZXh0dXJlLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9XZWJHTEFycmF5UmVuZGVyVGFyZ2V0LmpzIiwiLi4vc3JjL3RleHR1cmVzL0RhdGEzRFRleHR1cmUuanMiLCIuLi9zcmMvcmVuZGVyZXJzL1dlYkdMM0RSZW5kZXJUYXJnZXQuanMiLCIuLi9zcmMvbWF0aC9RdWF0ZXJuaW9uLmpzIiwiLi4vc3JjL21hdGgvVmVjdG9yMy5qcyIsIi4uL3NyYy9tYXRoL0JveDMuanMiLCIuLi9zcmMvbWF0aC9TcGhlcmUuanMiLCIuLi9zcmMvbWF0aC9SYXkuanMiLCIuLi9zcmMvbWF0aC9NYXRyaXg0LmpzIiwiLi4vc3JjL21hdGgvRXVsZXIuanMiLCIuLi9zcmMvY29yZS9MYXllcnMuanMiLCIuLi9zcmMvY29yZS9PYmplY3QzRC5qcyIsIi4uL3NyYy9tYXRoL1RyaWFuZ2xlLmpzIiwiLi4vc3JjL21hdGgvQ29sb3IuanMiLCIuLi9zcmMvbWF0ZXJpYWxzL01hdGVyaWFsLmpzIiwiLi4vc3JjL21hdGVyaWFscy9NZXNoQmFzaWNNYXRlcmlhbC5qcyIsIi4uL3NyYy9leHRyYXMvRGF0YVV0aWxzLmpzIiwiLi4vc3JjL2NvcmUvQnVmZmVyQXR0cmlidXRlLmpzIiwiLi4vc3JjL2NvcmUvQnVmZmVyR2VvbWV0cnkuanMiLCIuLi9zcmMvb2JqZWN0cy9NZXNoLmpzIiwiLi4vc3JjL2dlb21ldHJpZXMvQm94R2VvbWV0cnkuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvVW5pZm9ybXNVdGlscy5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9kZWZhdWx0X3ZlcnRleC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL2RlZmF1bHRfZnJhZ21lbnQuZ2xzbC5qcyIsIi4uL3NyYy9tYXRlcmlhbHMvU2hhZGVyTWF0ZXJpYWwuanMiLCIuLi9zcmMvY2FtZXJhcy9DYW1lcmEuanMiLCIuLi9zcmMvY2FtZXJhcy9QZXJzcGVjdGl2ZUNhbWVyYS5qcyIsIi4uL3NyYy9jYW1lcmFzL0N1YmVDYW1lcmEuanMiLCIuLi9zcmMvdGV4dHVyZXMvQ3ViZVRleHR1cmUuanMiLCIuLi9zcmMvcmVuZGVyZXJzL1dlYkdMQ3ViZVJlbmRlclRhcmdldC5qcyIsIi4uL3NyYy9vYmplY3RzL0dyb3VwLmpzIiwiLi4vc3JjL3JlbmRlcmVycy93ZWJ4ci9XZWJYUkNvbnRyb2xsZXIuanMiLCIuLi9zcmMvc2NlbmVzL0ZvZ0V4cDIuanMiLCIuLi9zcmMvc2NlbmVzL0ZvZy5qcyIsIi4uL3NyYy9zY2VuZXMvU2NlbmUuanMiLCIuLi9zcmMvY29yZS9JbnRlcmxlYXZlZEJ1ZmZlci5qcyIsIi4uL3NyYy9jb3JlL0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlLmpzIiwiLi4vc3JjL21hdGVyaWFscy9TcHJpdGVNYXRlcmlhbC5qcyIsIi4uL3NyYy9vYmplY3RzL1Nwcml0ZS5qcyIsIi4uL3NyYy9vYmplY3RzL0xPRC5qcyIsIi4uL3NyYy9vYmplY3RzL1NraW5uZWRNZXNoLmpzIiwiLi4vc3JjL29iamVjdHMvQm9uZS5qcyIsIi4uL3NyYy90ZXh0dXJlcy9EYXRhVGV4dHVyZS5qcyIsIi4uL3NyYy9vYmplY3RzL1NrZWxldG9uLmpzIiwiLi4vc3JjL2NvcmUvSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlLmpzIiwiLi4vc3JjL29iamVjdHMvSW5zdGFuY2VkTWVzaC5qcyIsIi4uL3NyYy9tYXRoL1BsYW5lLmpzIiwiLi4vc3JjL21hdGgvRnJ1c3R1bS5qcyIsIi4uL3NyYy9vYmplY3RzL0JhdGNoZWRNZXNoLmpzIiwiLi4vc3JjL21hdGVyaWFscy9MaW5lQmFzaWNNYXRlcmlhbC5qcyIsIi4uL3NyYy9vYmplY3RzL0xpbmUuanMiLCIuLi9zcmMvb2JqZWN0cy9MaW5lU2VnbWVudHMuanMiLCIuLi9zcmMvb2JqZWN0cy9MaW5lTG9vcC5qcyIsIi4uL3NyYy9tYXRlcmlhbHMvUG9pbnRzTWF0ZXJpYWwuanMiLCIuLi9zcmMvb2JqZWN0cy9Qb2ludHMuanMiLCIuLi9zcmMvdGV4dHVyZXMvVmlkZW9UZXh0dXJlLmpzIiwiLi4vc3JjL3RleHR1cmVzL1ZpZGVvRnJhbWVUZXh0dXJlLmpzIiwiLi4vc3JjL3RleHR1cmVzL0ZyYW1lYnVmZmVyVGV4dHVyZS5qcyIsIi4uL3NyYy90ZXh0dXJlcy9Db21wcmVzc2VkVGV4dHVyZS5qcyIsIi4uL3NyYy90ZXh0dXJlcy9Db21wcmVzc2VkQXJyYXlUZXh0dXJlLmpzIiwiLi4vc3JjL3RleHR1cmVzL0NvbXByZXNzZWRDdWJlVGV4dHVyZS5qcyIsIi4uL3NyYy90ZXh0dXJlcy9DYW52YXNUZXh0dXJlLmpzIiwiLi4vc3JjL3RleHR1cmVzL0RlcHRoVGV4dHVyZS5qcyIsIi4uL3NyYy9leHRyYXMvY29yZS9DdXJ2ZS5qcyIsIi4uL3NyYy9leHRyYXMvY3VydmVzL0VsbGlwc2VDdXJ2ZS5qcyIsIi4uL3NyYy9leHRyYXMvY3VydmVzL0FyY0N1cnZlLmpzIiwiLi4vc3JjL2V4dHJhcy9jdXJ2ZXMvQ2F0bXVsbFJvbUN1cnZlMy5qcyIsIi4uL3NyYy9leHRyYXMvY29yZS9JbnRlcnBvbGF0aW9ucy5qcyIsIi4uL3NyYy9leHRyYXMvY3VydmVzL0N1YmljQmV6aWVyQ3VydmUuanMiLCIuLi9zcmMvZXh0cmFzL2N1cnZlcy9DdWJpY0JlemllckN1cnZlMy5qcyIsIi4uL3NyYy9leHRyYXMvY3VydmVzL0xpbmVDdXJ2ZS5qcyIsIi4uL3NyYy9leHRyYXMvY3VydmVzL0xpbmVDdXJ2ZTMuanMiLCIuLi9zcmMvZXh0cmFzL2N1cnZlcy9RdWFkcmF0aWNCZXppZXJDdXJ2ZS5qcyIsIi4uL3NyYy9leHRyYXMvY3VydmVzL1F1YWRyYXRpY0JlemllckN1cnZlMy5qcyIsIi4uL3NyYy9leHRyYXMvY3VydmVzL1NwbGluZUN1cnZlLmpzIiwiLi4vc3JjL2V4dHJhcy9jb3JlL0N1cnZlUGF0aC5qcyIsIi4uL3NyYy9leHRyYXMvY29yZS9QYXRoLmpzIiwiLi4vc3JjL2dlb21ldHJpZXMvTGF0aGVHZW9tZXRyeS5qcyIsIi4uL3NyYy9nZW9tZXRyaWVzL0NhcHN1bGVHZW9tZXRyeS5qcyIsIi4uL3NyYy9nZW9tZXRyaWVzL0NpcmNsZUdlb21ldHJ5LmpzIiwiLi4vc3JjL2dlb21ldHJpZXMvQ3lsaW5kZXJHZW9tZXRyeS5qcyIsIi4uL3NyYy9nZW9tZXRyaWVzL0NvbmVHZW9tZXRyeS5qcyIsIi4uL3NyYy9nZW9tZXRyaWVzL1BvbHloZWRyb25HZW9tZXRyeS5qcyIsIi4uL3NyYy9nZW9tZXRyaWVzL0RvZGVjYWhlZHJvbkdlb21ldHJ5LmpzIiwiLi4vc3JjL2dlb21ldHJpZXMvRWRnZXNHZW9tZXRyeS5qcyIsIi4uL3NyYy9leHRyYXMvY29yZS9TaGFwZS5qcyIsIi4uL3NyYy9leHRyYXMvbGliL2VhcmN1dC5qcyIsIi4uL3NyYy9leHRyYXMvRWFyY3V0LmpzIiwiLi4vc3JjL2V4dHJhcy9TaGFwZVV0aWxzLmpzIiwiLi4vc3JjL2dlb21ldHJpZXMvRXh0cnVkZUdlb21ldHJ5LmpzIiwiLi4vc3JjL2dlb21ldHJpZXMvSWNvc2FoZWRyb25HZW9tZXRyeS5qcyIsIi4uL3NyYy9nZW9tZXRyaWVzL09jdGFoZWRyb25HZW9tZXRyeS5qcyIsIi4uL3NyYy9nZW9tZXRyaWVzL1BsYW5lR2VvbWV0cnkuanMiLCIuLi9zcmMvZ2VvbWV0cmllcy9SaW5nR2VvbWV0cnkuanMiLCIuLi9zcmMvZ2VvbWV0cmllcy9TaGFwZUdlb21ldHJ5LmpzIiwiLi4vc3JjL2dlb21ldHJpZXMvU3BoZXJlR2VvbWV0cnkuanMiLCIuLi9zcmMvZ2VvbWV0cmllcy9UZXRyYWhlZHJvbkdlb21ldHJ5LmpzIiwiLi4vc3JjL2dlb21ldHJpZXMvVG9ydXNHZW9tZXRyeS5qcyIsIi4uL3NyYy9nZW9tZXRyaWVzL1RvcnVzS25vdEdlb21ldHJ5LmpzIiwiLi4vc3JjL2dlb21ldHJpZXMvVHViZUdlb21ldHJ5LmpzIiwiLi4vc3JjL2dlb21ldHJpZXMvV2lyZWZyYW1lR2VvbWV0cnkuanMiLCIuLi9zcmMvbWF0ZXJpYWxzL1NoYWRvd01hdGVyaWFsLmpzIiwiLi4vc3JjL21hdGVyaWFscy9SYXdTaGFkZXJNYXRlcmlhbC5qcyIsIi4uL3NyYy9tYXRlcmlhbHMvTWVzaFN0YW5kYXJkTWF0ZXJpYWwuanMiLCIuLi9zcmMvbWF0ZXJpYWxzL01lc2hQaHlzaWNhbE1hdGVyaWFsLmpzIiwiLi4vc3JjL21hdGVyaWFscy9NZXNoUGhvbmdNYXRlcmlhbC5qcyIsIi4uL3NyYy9tYXRlcmlhbHMvTWVzaFRvb25NYXRlcmlhbC5qcyIsIi4uL3NyYy9tYXRlcmlhbHMvTWVzaE5vcm1hbE1hdGVyaWFsLmpzIiwiLi4vc3JjL21hdGVyaWFscy9NZXNoTGFtYmVydE1hdGVyaWFsLmpzIiwiLi4vc3JjL21hdGVyaWFscy9NZXNoRGVwdGhNYXRlcmlhbC5qcyIsIi4uL3NyYy9tYXRlcmlhbHMvTWVzaERpc3RhbmNlTWF0ZXJpYWwuanMiLCIuLi9zcmMvbWF0ZXJpYWxzL01lc2hNYXRjYXBNYXRlcmlhbC5qcyIsIi4uL3NyYy9tYXRlcmlhbHMvTGluZURhc2hlZE1hdGVyaWFsLmpzIiwiLi4vc3JjL2FuaW1hdGlvbi9BbmltYXRpb25VdGlscy5qcyIsIi4uL3NyYy9tYXRoL0ludGVycG9sYW50LmpzIiwiLi4vc3JjL21hdGgvaW50ZXJwb2xhbnRzL0N1YmljSW50ZXJwb2xhbnQuanMiLCIuLi9zcmMvbWF0aC9pbnRlcnBvbGFudHMvTGluZWFySW50ZXJwb2xhbnQuanMiLCIuLi9zcmMvbWF0aC9pbnRlcnBvbGFudHMvRGlzY3JldGVJbnRlcnBvbGFudC5qcyIsIi4uL3NyYy9hbmltYXRpb24vS2V5ZnJhbWVUcmFjay5qcyIsIi4uL3NyYy9hbmltYXRpb24vdHJhY2tzL0Jvb2xlYW5LZXlmcmFtZVRyYWNrLmpzIiwiLi4vc3JjL2FuaW1hdGlvbi90cmFja3MvQ29sb3JLZXlmcmFtZVRyYWNrLmpzIiwiLi4vc3JjL2FuaW1hdGlvbi90cmFja3MvTnVtYmVyS2V5ZnJhbWVUcmFjay5qcyIsIi4uL3NyYy9tYXRoL2ludGVycG9sYW50cy9RdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQuanMiLCIuLi9zcmMvYW5pbWF0aW9uL3RyYWNrcy9RdWF0ZXJuaW9uS2V5ZnJhbWVUcmFjay5qcyIsIi4uL3NyYy9hbmltYXRpb24vdHJhY2tzL1N0cmluZ0tleWZyYW1lVHJhY2suanMiLCIuLi9zcmMvYW5pbWF0aW9uL3RyYWNrcy9WZWN0b3JLZXlmcmFtZVRyYWNrLmpzIiwiLi4vc3JjL2FuaW1hdGlvbi9BbmltYXRpb25DbGlwLmpzIiwiLi4vc3JjL2xvYWRlcnMvQ2FjaGUuanMiLCIuLi9zcmMvbG9hZGVycy9Mb2FkaW5nTWFuYWdlci5qcyIsIi4uL3NyYy9sb2FkZXJzL0xvYWRlci5qcyIsIi4uL3NyYy9sb2FkZXJzL0ZpbGVMb2FkZXIuanMiLCIuLi9zcmMvbG9hZGVycy9BbmltYXRpb25Mb2FkZXIuanMiLCIuLi9zcmMvbG9hZGVycy9Db21wcmVzc2VkVGV4dHVyZUxvYWRlci5qcyIsIi4uL3NyYy9sb2FkZXJzL0ltYWdlTG9hZGVyLmpzIiwiLi4vc3JjL2xvYWRlcnMvQ3ViZVRleHR1cmVMb2FkZXIuanMiLCIuLi9zcmMvbG9hZGVycy9EYXRhVGV4dHVyZUxvYWRlci5qcyIsIi4uL3NyYy9sb2FkZXJzL1RleHR1cmVMb2FkZXIuanMiLCIuLi9zcmMvbGlnaHRzL0xpZ2h0LmpzIiwiLi4vc3JjL2xpZ2h0cy9IZW1pc3BoZXJlTGlnaHQuanMiLCIuLi9zcmMvbGlnaHRzL0xpZ2h0U2hhZG93LmpzIiwiLi4vc3JjL2xpZ2h0cy9TcG90TGlnaHRTaGFkb3cuanMiLCIuLi9zcmMvbGlnaHRzL1Nwb3RMaWdodC5qcyIsIi4uL3NyYy9saWdodHMvUG9pbnRMaWdodFNoYWRvdy5qcyIsIi4uL3NyYy9saWdodHMvUG9pbnRMaWdodC5qcyIsIi4uL3NyYy9jYW1lcmFzL09ydGhvZ3JhcGhpY0NhbWVyYS5qcyIsIi4uL3NyYy9saWdodHMvRGlyZWN0aW9uYWxMaWdodFNoYWRvdy5qcyIsIi4uL3NyYy9saWdodHMvRGlyZWN0aW9uYWxMaWdodC5qcyIsIi4uL3NyYy9saWdodHMvQW1iaWVudExpZ2h0LmpzIiwiLi4vc3JjL2xpZ2h0cy9SZWN0QXJlYUxpZ2h0LmpzIiwiLi4vc3JjL21hdGgvU3BoZXJpY2FsSGFybW9uaWNzMy5qcyIsIi4uL3NyYy9saWdodHMvTGlnaHRQcm9iZS5qcyIsIi4uL3NyYy9sb2FkZXJzL01hdGVyaWFsTG9hZGVyLmpzIiwiLi4vc3JjL2xvYWRlcnMvTG9hZGVyVXRpbHMuanMiLCIuLi9zcmMvY29yZS9JbnN0YW5jZWRCdWZmZXJHZW9tZXRyeS5qcyIsIi4uL3NyYy9sb2FkZXJzL0J1ZmZlckdlb21ldHJ5TG9hZGVyLmpzIiwiLi4vc3JjL2xvYWRlcnMvT2JqZWN0TG9hZGVyLmpzIiwiLi4vc3JjL2xvYWRlcnMvSW1hZ2VCaXRtYXBMb2FkZXIuanMiLCIuLi9zcmMvYXVkaW8vQXVkaW9Db250ZXh0LmpzIiwiLi4vc3JjL2xvYWRlcnMvQXVkaW9Mb2FkZXIuanMiLCIuLi9zcmMvY2FtZXJhcy9TdGVyZW9DYW1lcmEuanMiLCIuLi9zcmMvY2FtZXJhcy9BcnJheUNhbWVyYS5qcyIsIi4uL3NyYy9jb3JlL0Nsb2NrLmpzIiwiLi4vc3JjL2F1ZGlvL0F1ZGlvTGlzdGVuZXIuanMiLCIuLi9zcmMvYXVkaW8vQXVkaW8uanMiLCIuLi9zcmMvYXVkaW8vUG9zaXRpb25hbEF1ZGlvLmpzIiwiLi4vc3JjL2F1ZGlvL0F1ZGlvQW5hbHlzZXIuanMiLCIuLi9zcmMvYW5pbWF0aW9uL1Byb3BlcnR5TWl4ZXIuanMiLCIuLi9zcmMvYW5pbWF0aW9uL1Byb3BlcnR5QmluZGluZy5qcyIsIi4uL3NyYy9hbmltYXRpb24vQW5pbWF0aW9uT2JqZWN0R3JvdXAuanMiLCIuLi9zcmMvYW5pbWF0aW9uL0FuaW1hdGlvbkFjdGlvbi5qcyIsIi4uL3NyYy9hbmltYXRpb24vQW5pbWF0aW9uTWl4ZXIuanMiLCIuLi9zcmMvY29yZS9SZW5kZXJUYXJnZXQzRC5qcyIsIi4uL3NyYy9jb3JlL1JlbmRlclRhcmdldEFycmF5LmpzIiwiLi4vc3JjL2NvcmUvVW5pZm9ybS5qcyIsIi4uL3NyYy9jb3JlL1VuaWZvcm1zR3JvdXAuanMiLCIuLi9zcmMvY29yZS9JbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlci5qcyIsIi4uL3NyYy9jb3JlL0dMQnVmZmVyQXR0cmlidXRlLmpzIiwiLi4vc3JjL2NvcmUvUmF5Y2FzdGVyLmpzIiwiLi4vc3JjL21hdGgvU3BoZXJpY2FsLmpzIiwiLi4vc3JjL21hdGgvQ3lsaW5kcmljYWwuanMiLCIuLi9zcmMvbWF0aC9NYXRyaXgyLmpzIiwiLi4vc3JjL21hdGgvQm94Mi5qcyIsIi4uL3NyYy9tYXRoL0xpbmUzLmpzIiwiLi4vc3JjL2hlbHBlcnMvU3BvdExpZ2h0SGVscGVyLmpzIiwiLi4vc3JjL2hlbHBlcnMvU2tlbGV0b25IZWxwZXIuanMiLCIuLi9zcmMvaGVscGVycy9Qb2ludExpZ2h0SGVscGVyLmpzIiwiLi4vc3JjL2hlbHBlcnMvSGVtaXNwaGVyZUxpZ2h0SGVscGVyLmpzIiwiLi4vc3JjL2hlbHBlcnMvR3JpZEhlbHBlci5qcyIsIi4uL3NyYy9oZWxwZXJzL1BvbGFyR3JpZEhlbHBlci5qcyIsIi4uL3NyYy9oZWxwZXJzL0RpcmVjdGlvbmFsTGlnaHRIZWxwZXIuanMiLCIuLi9zcmMvaGVscGVycy9DYW1lcmFIZWxwZXIuanMiLCIuLi9zcmMvaGVscGVycy9Cb3hIZWxwZXIuanMiLCIuLi9zcmMvaGVscGVycy9Cb3gzSGVscGVyLmpzIiwiLi4vc3JjL2hlbHBlcnMvUGxhbmVIZWxwZXIuanMiLCIuLi9zcmMvaGVscGVycy9BcnJvd0hlbHBlci5qcyIsIi4uL3NyYy9oZWxwZXJzL0F4ZXNIZWxwZXIuanMiLCIuLi9zcmMvZXh0cmFzL2NvcmUvU2hhcGVQYXRoLmpzIiwiLi4vc3JjL2V4dHJhcy9Db250cm9scy5qcyIsIi4uL3NyYy9leHRyYXMvVGV4dHVyZVV0aWxzLmpzIiwiLi4vc3JjL1RocmVlLkNvcmUuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYmdsL1dlYkdMQW5pbWF0aW9uLmpzIiwiLi4vc3JjL3JlbmRlcmVycy93ZWJnbC9XZWJHTEF0dHJpYnV0ZXMuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvYWxwaGFoYXNoX2ZyYWdtZW50Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvYWxwaGFoYXNoX3BhcnNfZnJhZ21lbnQuZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9hbHBoYW1hcF9mcmFnbWVudC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL2FscGhhbWFwX3BhcnNfZnJhZ21lbnQuZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9hbHBoYXRlc3RfZnJhZ21lbnQuZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9hbHBoYXRlc3RfcGFyc19mcmFnbWVudC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL2FvbWFwX2ZyYWdtZW50Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvYW9tYXBfcGFyc19mcmFnbWVudC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL2JhdGNoaW5nX3BhcnNfdmVydGV4Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvYmF0Y2hpbmdfdmVydGV4Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvYmVnaW5fdmVydGV4Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvYmVnaW5ub3JtYWxfdmVydGV4Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvYnNkZnMuZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9pcmlkZXNjZW5jZV9mcmFnbWVudC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL2J1bXBtYXBfcGFyc19mcmFnbWVudC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL2NsaXBwaW5nX3BsYW5lc19mcmFnbWVudC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL2NsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvY2xpcHBpbmdfcGxhbmVzX3ZlcnRleC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL2NvbG9yX2ZyYWdtZW50Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvY29sb3JfcGFyc19mcmFnbWVudC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL2NvbG9yX3BhcnNfdmVydGV4Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvY29sb3JfdmVydGV4Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvY29tbW9uLmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvY3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvZGVmYXVsdG5vcm1hbF92ZXJ0ZXguZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9kaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXguZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9kaXNwbGFjZW1lbnRtYXBfdmVydGV4Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvZW1pc3NpdmVtYXBfZnJhZ21lbnQuZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9lbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvY29sb3JzcGFjZV9mcmFnbWVudC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL2NvbG9yc3BhY2VfcGFyc19mcmFnbWVudC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL2Vudm1hcF9mcmFnbWVudC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL2Vudm1hcF9jb21tb25fcGFyc19mcmFnbWVudC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL2Vudm1hcF9wYXJzX2ZyYWdtZW50Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvZW52bWFwX3BhcnNfdmVydGV4Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvZW52bWFwX3ZlcnRleC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL2ZvZ192ZXJ0ZXguZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9mb2dfcGFyc192ZXJ0ZXguZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9mb2dfZnJhZ21lbnQuZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9mb2dfcGFyc19mcmFnbWVudC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL2dyYWRpZW50bWFwX3BhcnNfZnJhZ21lbnQuZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9saWdodG1hcF9wYXJzX2ZyYWdtZW50Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvbGlnaHRzX2xhbWJlcnRfZnJhZ21lbnQuZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9saWdodHNfbGFtYmVydF9wYXJzX2ZyYWdtZW50Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvbGlnaHRzX3BhcnNfYmVnaW4uZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9lbnZtYXBfcGh5c2ljYWxfcGFyc19mcmFnbWVudC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL2xpZ2h0c190b29uX2ZyYWdtZW50Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvbGlnaHRzX3Rvb25fcGFyc19mcmFnbWVudC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL2xpZ2h0c19waG9uZ19mcmFnbWVudC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL2xpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvbGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvbGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQuZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9saWdodHNfZnJhZ21lbnRfYmVnaW4uZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9saWdodHNfZnJhZ21lbnRfbWFwcy5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL2xpZ2h0c19mcmFnbWVudF9lbmQuZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9sb2dkZXB0aGJ1Zl9mcmFnbWVudC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL2xvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQuZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9sb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL2xvZ2RlcHRoYnVmX3ZlcnRleC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL21hcF9mcmFnbWVudC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL21hcF9wYXJzX2ZyYWdtZW50Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvbWFwX3BhcnRpY2xlX2ZyYWdtZW50Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvbWFwX3BhcnRpY2xlX3BhcnNfZnJhZ21lbnQuZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9tZXRhbG5lc3NtYXBfZnJhZ21lbnQuZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9tZXRhbG5lc3NtYXBfcGFyc19mcmFnbWVudC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL21vcnBoaW5zdGFuY2VfdmVydGV4Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvbW9ycGhjb2xvcl92ZXJ0ZXguZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9tb3JwaG5vcm1hbF92ZXJ0ZXguZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9tb3JwaHRhcmdldF9wYXJzX3ZlcnRleC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL21vcnBodGFyZ2V0X3ZlcnRleC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL25vcm1hbF9mcmFnbWVudF9iZWdpbi5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL25vcm1hbF9mcmFnbWVudF9tYXBzLmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvbm9ybWFsX3BhcnNfZnJhZ21lbnQuZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9ub3JtYWxfcGFyc192ZXJ0ZXguZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9ub3JtYWxfdmVydGV4Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvbm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQuZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9jbGVhcmNvYXRfbm9ybWFsX2ZyYWdtZW50X2JlZ2luLmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvY2xlYXJjb2F0X25vcm1hbF9mcmFnbWVudF9tYXBzLmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvY2xlYXJjb2F0X3BhcnNfZnJhZ21lbnQuZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9pcmlkZXNjZW5jZV9wYXJzX2ZyYWdtZW50Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvb3BhcXVlX2ZyYWdtZW50Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvcGFja2luZy5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL3ByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQuZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9wcm9qZWN0X3ZlcnRleC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL2RpdGhlcmluZ19mcmFnbWVudC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL2RpdGhlcmluZ19wYXJzX2ZyYWdtZW50Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvcm91Z2huZXNzbWFwX2ZyYWdtZW50Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvcm91Z2huZXNzbWFwX3BhcnNfZnJhZ21lbnQuZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9zaGFkb3dtYXBfcGFyc19mcmFnbWVudC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL3NoYWRvd21hcF9wYXJzX3ZlcnRleC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL3NoYWRvd21hcF92ZXJ0ZXguZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9zaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQuZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9za2luYmFzZV92ZXJ0ZXguZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9za2lubmluZ19wYXJzX3ZlcnRleC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL3NraW5uaW5nX3ZlcnRleC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL3NraW5ub3JtYWxfdmVydGV4Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvc3BlY3VsYXJtYXBfZnJhZ21lbnQuZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9zcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvdG9uZW1hcHBpbmdfZnJhZ21lbnQuZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay90b25lbWFwcGluZ19wYXJzX2ZyYWdtZW50Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvdHJhbnNtaXNzaW9uX2ZyYWdtZW50Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvdHJhbnNtaXNzaW9uX3BhcnNfZnJhZ21lbnQuZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay91dl9wYXJzX2ZyYWdtZW50Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvdXZfcGFyc192ZXJ0ZXguZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay91dl92ZXJ0ZXguZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay93b3JsZHBvc192ZXJ0ZXguZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJMaWIvYmFja2dyb3VuZC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckxpYi9iYWNrZ3JvdW5kQ3ViZS5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckxpYi9jdWJlLmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyTGliL2RlcHRoLmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyTGliL2Rpc3RhbmNlUkdCQS5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckxpYi9lcXVpcmVjdC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckxpYi9saW5lZGFzaGVkLmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyTGliL21lc2hiYXNpYy5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckxpYi9tZXNobGFtYmVydC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckxpYi9tZXNobWF0Y2FwLmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyTGliL21lc2hub3JtYWwuZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJMaWIvbWVzaHBob25nLmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyTGliL21lc2hwaHlzaWNhbC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckxpYi9tZXNodG9vbi5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckxpYi9wb2ludHMuZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJMaWIvc2hhZG93Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyTGliL3Nwcml0ZS5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1VuaWZvcm1zTGliLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckxpYi5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2ViZ2wvV2ViR0xCYWNrZ3JvdW5kLmpzIiwiLi4vc3JjL3JlbmRlcmVycy93ZWJnbC9XZWJHTEJpbmRpbmdTdGF0ZXMuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYmdsL1dlYkdMQnVmZmVyUmVuZGVyZXIuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYmdsL1dlYkdMQ2FwYWJpbGl0aWVzLmpzIiwiLi4vc3JjL3JlbmRlcmVycy93ZWJnbC9XZWJHTENsaXBwaW5nLmpzIiwiLi4vc3JjL3JlbmRlcmVycy93ZWJnbC9XZWJHTEN1YmVNYXBzLmpzIiwiLi4vc3JjL2V4dHJhcy9QTVJFTUdlbmVyYXRvci5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2ViZ2wvV2ViR0xDdWJlVVZNYXBzLmpzIiwiLi4vc3JjL3JlbmRlcmVycy93ZWJnbC9XZWJHTEV4dGVuc2lvbnMuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYmdsL1dlYkdMR2VvbWV0cmllcy5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2ViZ2wvV2ViR0xJbmRleGVkQnVmZmVyUmVuZGVyZXIuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYmdsL1dlYkdMSW5mby5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2ViZ2wvV2ViR0xNb3JwaHRhcmdldHMuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYmdsL1dlYkdMT2JqZWN0cy5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2ViZ2wvV2ViR0xVbmlmb3Jtcy5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2ViZ2wvV2ViR0xTaGFkZXIuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYmdsL1dlYkdMUHJvZ3JhbS5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2ViZ2wvV2ViR0xTaGFkZXJDYWNoZS5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2ViZ2wvV2ViR0xQcm9ncmFtcy5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2ViZ2wvV2ViR0xQcm9wZXJ0aWVzLmpzIiwiLi4vc3JjL3JlbmRlcmVycy93ZWJnbC9XZWJHTFJlbmRlckxpc3RzLmpzIiwiLi4vc3JjL3JlbmRlcmVycy93ZWJnbC9XZWJHTExpZ2h0cy5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2ViZ2wvV2ViR0xSZW5kZXJTdGF0ZXMuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyTGliL3ZzbS5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy93ZWJnbC9XZWJHTFNoYWRvd01hcC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2ViZ2wvV2ViR0xTdGF0ZS5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2ViZ2wvV2ViR0xUZXh0dXJlcy5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2ViZ2wvV2ViR0xVdGlscy5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2VieHIvV2ViWFJEZXB0aFNlbnNpbmcuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYnhyL1dlYlhSTWFuYWdlci5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2ViZ2wvV2ViR0xNYXRlcmlhbHMuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYmdsL1dlYkdMVW5pZm9ybXNHcm91cHMuanMiLCIuLi9zcmMvcmVuZGVyZXJzL1dlYkdMUmVuZGVyZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IFJFVklTSU9OID0gJzE3NmRldic7XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyBtb3VzZSBidXR0b25zIGFuZCBpbnRlcmFjdGlvbiB0eXBlcyBpbiBjb250ZXh0IG9mIGNvbnRyb2xzLlxyXG4gKlxyXG4gKiBAdHlwZSB7Q29uc3RhbnRzTW91c2V9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IE1PVVNFID0geyBMRUZUOiAwLCBNSURETEU6IDEsIFJJR0hUOiAyLCBST1RBVEU6IDAsIERPTExZOiAxLCBQQU46IDIgfTtcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIHRvdWNoIGludGVyYWN0aW9uIHR5cGVzIGluIGNvbnRleHQgb2YgY29udHJvbHMuXHJcbiAqXHJcbiAqIEB0eXBlIHtDb25zdGFudHNUb3VjaH1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgVE9VQ0ggPSB7IFJPVEFURTogMCwgUEFOOiAxLCBET0xMWV9QQU46IDIsIERPTExZX1JPVEFURTogMyB9O1xyXG5cclxuLyoqXHJcbiAqIERpc2FibGVzIGZhY2UgY3VsbGluZy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgQ3VsbEZhY2VOb25lID0gMDtcclxuXHJcbi8qKlxyXG4gKiBDdWxscyBiYWNrIGZhY2VzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBDdWxsRmFjZUJhY2sgPSAxO1xyXG5cclxuLyoqXHJcbiAqIEN1bGxzIGZyb250IGZhY2VzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBDdWxsRmFjZUZyb250ID0gMjtcclxuXHJcbi8qKlxyXG4gKiBDdWxscyBib3RoIGZyb250IGFuZCBiYWNrIGZhY2VzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBDdWxsRmFjZUZyb250QmFjayA9IDM7XHJcblxyXG4vKipcclxuICogR2l2ZXMgdW5maWx0ZXJlZCBzaGFkb3cgbWFwcyAtIGZhc3Rlc3QsIGJ1dCBsb3dlc3QgcXVhbGl0eS5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgQmFzaWNTaGFkb3dNYXAgPSAwO1xyXG5cclxuLyoqXHJcbiAqIEZpbHRlcnMgc2hhZG93IG1hcHMgdXNpbmcgdGhlIFBlcmNlbnRhZ2UtQ2xvc2VyIEZpbHRlcmluZyAoUENGKSBhbGdvcml0aG0uXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFBDRlNoYWRvd01hcCA9IDE7XHJcblxyXG4vKipcclxuICogRmlsdGVycyBzaGFkb3cgbWFwcyB1c2luZyB0aGUgUGVyY2VudGFnZS1DbG9zZXIgRmlsdGVyaW5nIChQQ0YpIGFsZ29yaXRobSB3aXRoXHJcbiAqIGJldHRlciBzb2Z0IHNoYWRvd3MgZXNwZWNpYWxseSB3aGVuIHVzaW5nIGxvdy1yZXNvbHV0aW9uIHNoYWRvdyBtYXBzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBQQ0ZTb2Z0U2hhZG93TWFwID0gMjtcclxuXHJcbi8qKlxyXG4gKiBGaWx0ZXJzIHNoYWRvdyBtYXBzIHVzaW5nIHRoZSBWYXJpYW5jZSBTaGFkb3cgTWFwIChWU00pIGFsZ29yaXRobS5cclxuICogV2hlbiB1c2luZyBWU01TaGFkb3dNYXAgYWxsIHNoYWRvdyByZWNlaXZlcnMgd2lsbCBhbHNvIGNhc3Qgc2hhZG93cy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgVlNNU2hhZG93TWFwID0gMztcclxuXHJcbi8qKlxyXG4gKiBPbmx5IGZyb250IGZhY2VzIGFyZSByZW5kZXJlZC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgRnJvbnRTaWRlID0gMDtcclxuXHJcbi8qKlxyXG4gKiBPbmx5IGJhY2sgZmFjZXMgYXJlIHJlbmRlcmVkLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBCYWNrU2lkZSA9IDE7XHJcblxyXG4vKipcclxuICogQm90aCBmcm9udCBhbmQgYmFjayBmYWNlcyBhcmUgcmVuZGVyZWQuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IERvdWJsZVNpZGUgPSAyO1xyXG5cclxuLyoqXHJcbiAqIE5vIGJsZW5kaW5nIGlzIHBlcmZvcm1lZCB3aGljaCBlZmZlY3RpdmVseSBkaXNhYmxlc1xyXG4gKiBhbHBoYSB0cmFuc3BhcmVuY3kuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IE5vQmxlbmRpbmcgPSAwO1xyXG5cclxuLyoqXHJcbiAqIFRoZSBkZWZhdWx0IGJsZW5kaW5nLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBOb3JtYWxCbGVuZGluZyA9IDE7XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyBhZGRpdGl2ZSBibGVuZGluZy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgQWRkaXRpdmVCbGVuZGluZyA9IDI7XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyBzdWJ0cmFjdGl2ZSBibGVuZGluZy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgU3VidHJhY3RpdmVCbGVuZGluZyA9IDM7XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyBtdWx0aXBseSBibGVuZGluZy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTXVsdGlwbHlCbGVuZGluZyA9IDQ7XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyBjdXN0b20gYmxlbmRpbmcuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEN1c3RvbUJsZW5kaW5nID0gNTtcclxuXHJcbi8qKlxyXG4gKiBBIGBzb3VyY2UgKyBkZXN0aW5hdGlvbmAgYmxlbmRpbmcgZXF1YXRpb24uXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEFkZEVxdWF0aW9uID0gMTAwO1xyXG5cclxuLyoqXHJcbiAqIEEgYHNvdXJjZSAtIGRlc3RpbmF0aW9uYCBibGVuZGluZyBlcXVhdGlvbi5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgU3VidHJhY3RFcXVhdGlvbiA9IDEwMTtcclxuXHJcbi8qKlxyXG4gKiBBIGBkZXN0aW5hdGlvbiAtIHNvdXJjZWAgYmxlbmRpbmcgZXF1YXRpb24uXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFJldmVyc2VTdWJ0cmFjdEVxdWF0aW9uID0gMTAyO1xyXG5cclxuLyoqXHJcbiAqIEEgYmxlbmQgZXF1YXRpb24gdGhhdCB1c2VzIHRoZSBtaW5pbXVtIG9mIHNvdXJjZSBhbmQgZGVzdGluYXRpb24uXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IE1pbkVxdWF0aW9uID0gMTAzO1xyXG5cclxuLyoqXHJcbiAqIEEgYmxlbmQgZXF1YXRpb24gdGhhdCB1c2VzIHRoZSBtYXhpbXVtIG9mIHNvdXJjZSBhbmQgZGVzdGluYXRpb24uXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IE1heEVxdWF0aW9uID0gMTA0O1xyXG5cclxuLyoqXHJcbiAqIE11bHRpcGxpZXMgYWxsIGNvbG9ycyBieSBgMGAuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFplcm9GYWN0b3IgPSAyMDA7XHJcblxyXG4vKipcclxuICogTXVsdGlwbGllcyBhbGwgY29sb3JzIGJ5IGAxYC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgT25lRmFjdG9yID0gMjAxO1xyXG5cclxuLyoqXHJcbiAqIE11bHRpcGxpZXMgYWxsIGNvbG9ycyBieSB0aGUgc291cmNlIGNvbG9ycy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgU3JjQ29sb3JGYWN0b3IgPSAyMDI7XHJcblxyXG4vKipcclxuICogTXVsdGlwbGllcyBhbGwgY29sb3JzIGJ5IGAxYCBtaW51cyBlYWNoIHNvdXJjZSBjb2xvci5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgT25lTWludXNTcmNDb2xvckZhY3RvciA9IDIwMztcclxuXHJcbi8qKlxyXG4gKiBNdWx0aXBsaWVzIGFsbCBjb2xvcnMgYnkgdGhlIHNvdXJjZSBhbHBoYSB2YWx1ZS5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgU3JjQWxwaGFGYWN0b3IgPSAyMDQ7XHJcblxyXG4vKipcclxuICogTXVsdGlwbGllcyBhbGwgY29sb3JzIGJ5IDEgbWludXMgdGhlIHNvdXJjZSBhbHBoYSB2YWx1ZS5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgT25lTWludXNTcmNBbHBoYUZhY3RvciA9IDIwNTtcclxuXHJcbi8qKlxyXG4gKiBNdWx0aXBsaWVzIGFsbCBjb2xvcnMgYnkgdGhlIGRlc3RpbmF0aW9uIGFscGhhIHZhbHVlLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBEc3RBbHBoYUZhY3RvciA9IDIwNjtcclxuXHJcbi8qKlxyXG4gKiBNdWx0aXBsaWVzIGFsbCBjb2xvcnMgYnkgYDFgIG1pbnVzIHRoZSBkZXN0aW5hdGlvbiBhbHBoYSB2YWx1ZS5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgT25lTWludXNEc3RBbHBoYUZhY3RvciA9IDIwNztcclxuXHJcbi8qKlxyXG4gKiBNdWx0aXBsaWVzIGFsbCBjb2xvcnMgYnkgdGhlIGRlc3RpbmF0aW9uIGNvbG9yLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBEc3RDb2xvckZhY3RvciA9IDIwODtcclxuXHJcbi8qKlxyXG4gKiBNdWx0aXBsaWVzIGFsbCBjb2xvcnMgYnkgYDFgIG1pbnVzIGVhY2ggZGVzdGluYXRpb24gY29sb3IuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IE9uZU1pbnVzRHN0Q29sb3JGYWN0b3IgPSAyMDk7XHJcblxyXG4vKipcclxuICogTXVsdGlwbGllcyB0aGUgUkdCIGNvbG9ycyBieSB0aGUgc21hbGxlciBvZiBlaXRoZXIgdGhlIHNvdXJjZSBhbHBoYVxyXG4gKiB2YWx1ZSBvciB0aGUgdmFsdWUgb2YgYDFgIG1pbnVzIHRoZSBkZXN0aW5hdGlvbiBhbHBoYSB2YWx1ZS4gVGhlIGFscGhhXHJcbiAqIHZhbHVlIGlzIG11bHRpcGxpZWQgYnkgYDFgLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBTcmNBbHBoYVNhdHVyYXRlRmFjdG9yID0gMjEwO1xyXG5cclxuLyoqXHJcbiAqIE11bHRpcGxpZXMgYWxsIGNvbG9ycyBieSBhIGNvbnN0YW50IGNvbG9yLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBDb25zdGFudENvbG9yRmFjdG9yID0gMjExO1xyXG5cclxuLyoqXHJcbiAqIE11bHRpcGxpZXMgYWxsIGNvbG9ycyBieSBgMWAgbWludXMgYSBjb25zdGFudCBjb2xvci5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgT25lTWludXNDb25zdGFudENvbG9yRmFjdG9yID0gMjEyO1xyXG5cclxuLyoqXHJcbiAqIE11bHRpcGxpZXMgYWxsIGNvbG9ycyBieSBhIGNvbnN0YW50IGFscGhhIHZhbHVlLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBDb25zdGFudEFscGhhRmFjdG9yID0gMjEzO1xyXG5cclxuLyoqXHJcbiAqIE11bHRpcGxpZXMgYWxsIGNvbG9ycyBieSAxIG1pbnVzIGEgY29uc3RhbnQgYWxwaGEgdmFsdWUuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IE9uZU1pbnVzQ29uc3RhbnRBbHBoYUZhY3RvciA9IDIxNDtcclxuXHJcbi8qKlxyXG4gKiBOZXZlciBwYXNzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBOZXZlckRlcHRoID0gMDtcclxuXHJcbi8qKlxyXG4gKiBBbHdheXMgcGFzcy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgQWx3YXlzRGVwdGggPSAxO1xyXG5cclxuLyoqXHJcbiAqIFBhc3MgaWYgdGhlIGluY29taW5nIHZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgZGVwdGggYnVmZmVyIHZhbHVlLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBMZXNzRGVwdGggPSAyO1xyXG5cclxuLyoqXHJcbiAqIFBhc3MgaWYgdGhlIGluY29taW5nIHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgZGVwdGggYnVmZmVyIHZhbHVlLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBMZXNzRXF1YWxEZXB0aCA9IDM7XHJcblxyXG4vKipcclxuICogUGFzcyBpZiB0aGUgaW5jb21pbmcgdmFsdWUgZXF1YWxzIHRoZSBkZXB0aCBidWZmZXIgdmFsdWUuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEVxdWFsRGVwdGggPSA0O1xyXG5cclxuLyoqXHJcbiAqIFBhc3MgaWYgdGhlIGluY29taW5nIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgZGVwdGggYnVmZmVyIHZhbHVlLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBHcmVhdGVyRXF1YWxEZXB0aCA9IDU7XHJcblxyXG4vKipcclxuICogUGFzcyBpZiB0aGUgaW5jb21pbmcgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSBkZXB0aCBidWZmZXIgdmFsdWUuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEdyZWF0ZXJEZXB0aCA9IDY7XHJcblxyXG4vKipcclxuICogUGFzcyBpZiB0aGUgaW5jb21pbmcgdmFsdWUgaXMgbm90IGVxdWFsIHRvIHRoZSBkZXB0aCBidWZmZXIgdmFsdWUuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IE5vdEVxdWFsRGVwdGggPSA3O1xyXG5cclxuLyoqXHJcbiAqIE11bHRpcGxpZXMgdGhlIGVudmlyb25tZW50IG1hcCBjb2xvciB3aXRoIHRoZSBzdXJmYWNlIGNvbG9yLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBNdWx0aXBseU9wZXJhdGlvbiA9IDA7XHJcblxyXG4vKipcclxuICogVXNlcyByZWZsZWN0aXZpdHkgdG8gYmxlbmQgYmV0d2VlbiB0aGUgdHdvIGNvbG9ycy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTWl4T3BlcmF0aW9uID0gMTtcclxuXHJcbi8qKlxyXG4gKiBBZGRzIHRoZSB0d28gY29sb3JzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBBZGRPcGVyYXRpb24gPSAyO1xyXG5cclxuLyoqXHJcbiAqIE5vIHRvbmUgbWFwcGluZyBpcyBhcHBsaWVkLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBOb1RvbmVNYXBwaW5nID0gMDtcclxuXHJcbi8qKlxyXG4gKiBMaW5lYXIgdG9uZSBtYXBwaW5nLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBMaW5lYXJUb25lTWFwcGluZyA9IDE7XHJcblxyXG4vKipcclxuICogUmVpbmhhcmQgdG9uZSBtYXBwaW5nLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBSZWluaGFyZFRvbmVNYXBwaW5nID0gMjtcclxuXHJcbi8qKlxyXG4gKiBDaW5lb24gdG9uZSBtYXBwaW5nLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBDaW5lb25Ub25lTWFwcGluZyA9IDM7XHJcblxyXG4vKipcclxuICogQUNFUyBGaWxtaWMgdG9uZSBtYXBwaW5nLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBBQ0VTRmlsbWljVG9uZU1hcHBpbmcgPSA0O1xyXG5cclxuLyoqXHJcbiAqIEN1c3RvbSB0b25lIG1hcHBpbmcuXHJcbiAqXHJcbiAqIEV4cGVjdHMgYSBjdXN0b20gaW1wbGVtZW50YXRpb24gYnkgbW9kaWZ5aW5nIHNoYWRlciBjb2RlIG9mIHRoZSBtYXRlcmlhbCdzIGZyYWdtZW50IHNoYWRlci5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgQ3VzdG9tVG9uZU1hcHBpbmcgPSA1O1xyXG5cclxuLyoqXHJcbiAqIEFnWCB0b25lIG1hcHBpbmcuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEFnWFRvbmVNYXBwaW5nID0gNjtcclxuXHJcbi8qKlxyXG4gKiBOZXV0cmFsIHRvbmUgbWFwcGluZy5cclxuICpcclxuICogSW1wbGVtZW50YXRpb24gYmFzZWQgb24gdGhlIEtocm9ub3MgM0QgQ29tbWVyY2UgR3JvdXAgc3RhbmRhcmQgdG9uZSBtYXBwaW5nLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBOZXV0cmFsVG9uZU1hcHBpbmcgPSA3O1xyXG5cclxuLyoqXHJcbiAqIFRoZSBza2lubmVkIG1lc2ggc2hhcmVzIHRoZSBzYW1lIHdvcmxkIHNwYWNlIGFzIHRoZSBza2VsZXRvbi5cclxuICpcclxuICogQHR5cGUge3N0cmluZ31cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgQXR0YWNoZWRCaW5kTW9kZSA9ICdhdHRhY2hlZCc7XHJcblxyXG4vKipcclxuICogVGhlIHNraW5uZWQgbWVzaCBkb2VzIG5vdCBzaGFyZSB0aGUgc2FtZSB3b3JsZCBzcGFjZSBhcyB0aGUgc2tlbGV0b24uXHJcbiAqIFRoaXMgaXMgdXNlZnVsIHdoZW4gYSBza2VsZXRvbiBpcyBzaGFyZWQgYWNyb3NzIG11bHRpcGxlIHNraW5uZWQgbWVzaGVzLlxyXG4gKlxyXG4gKiBAdHlwZSB7c3RyaW5nfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBEZXRhY2hlZEJpbmRNb2RlID0gJ2RldGFjaGVkJztcclxuXHJcbi8qKlxyXG4gKiBNYXBzIHRleHR1cmVzIHVzaW5nIHRoZSBnZW9tZXRyeSdzIFVWIGNvb3JkaW5hdGVzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBVVk1hcHBpbmcgPSAzMDA7XHJcblxyXG4vKipcclxuICogUmVmbGVjdGlvbiBtYXBwaW5nIGZvciBjdWJlIHRleHR1cmVzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBDdWJlUmVmbGVjdGlvbk1hcHBpbmcgPSAzMDE7XHJcblxyXG4vKipcclxuICogUmVmcmFjdGlvbiBtYXBwaW5nIGZvciBjdWJlIHRleHR1cmVzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBDdWJlUmVmcmFjdGlvbk1hcHBpbmcgPSAzMDI7XHJcblxyXG4vKipcclxuICogUmVmbGVjdGlvbiBtYXBwaW5nIGZvciBlcXVpcmVjdGFuZ3VsYXIgdGV4dHVyZXMuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nID0gMzAzO1xyXG5cclxuLyoqXHJcbiAqIFJlZnJhY3Rpb24gbWFwcGluZyBmb3IgZXF1aXJlY3Rhbmd1bGFyIHRleHR1cmVzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZyA9IDMwNDtcclxuXHJcbi8qKlxyXG4gKiBSZWZsZWN0aW9uIG1hcHBpbmcgZm9yIFBNUkVNIHRleHR1cmVzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBDdWJlVVZSZWZsZWN0aW9uTWFwcGluZyA9IDMwNjtcclxuXHJcbi8qKlxyXG4gKiBUaGUgdGV4dHVyZSB3aWxsIHNpbXBseSByZXBlYXQgdG8gaW5maW5pdHkuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFJlcGVhdFdyYXBwaW5nID0gMTAwMDtcclxuXHJcbi8qKlxyXG4gKiBUaGUgbGFzdCBwaXhlbCBvZiB0aGUgdGV4dHVyZSBzdHJldGNoZXMgdG8gdGhlIGVkZ2Ugb2YgdGhlIG1lc2guXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IENsYW1wVG9FZGdlV3JhcHBpbmcgPSAxMDAxO1xyXG5cclxuLyoqXHJcbiAqIFRoZSB0ZXh0dXJlIHdpbGwgcmVwZWF0cyB0byBpbmZpbml0eSwgbWlycm9yaW5nIG9uIGVhY2ggcmVwZWF0LlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nID0gMTAwMjtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgdGV4dHVyZSBlbGVtZW50IHRoYXQgaXMgbmVhcmVzdCAoaW4gTWFuaGF0dGFuIGRpc3RhbmNlKVxyXG4gKiB0byB0aGUgc3BlY2lmaWVkIHRleHR1cmUgY29vcmRpbmF0ZXMuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IE5lYXJlc3RGaWx0ZXIgPSAxMDAzO1xyXG5cclxuLyoqXHJcbiAqIENob29zZXMgdGhlIG1pcG1hcCB0aGF0IG1vc3QgY2xvc2VseSBtYXRjaGVzIHRoZSBzaXplIG9mIHRoZSBwaXhlbCBiZWluZyB0ZXh0dXJlZFxyXG4gKiBhbmQgdXNlcyB0aGUgYE5lYXJlc3RGaWx0ZXJgIGNyaXRlcmlvbiAodGhlIHRleGVsIG5lYXJlc3QgdG8gdGhlIGNlbnRlciBvZiB0aGUgcGl4ZWwpXHJcbiAqIHRvIHByb2R1Y2UgYSB0ZXh0dXJlIHZhbHVlLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBOZWFyZXN0TWlwbWFwTmVhcmVzdEZpbHRlciA9IDEwMDQ7XHJcbmV4cG9ydCBjb25zdCBOZWFyZXN0TWlwTWFwTmVhcmVzdEZpbHRlciA9IDEwMDQ7IC8vIGxlZ2FjeVxyXG5cclxuLyoqXHJcbiAqIENob29zZXMgdGhlIHR3byBtaXBtYXBzIHRoYXQgbW9zdCBjbG9zZWx5IG1hdGNoIHRoZSBzaXplIG9mIHRoZSBwaXhlbCBiZWluZyB0ZXh0dXJlZCBhbmRcclxuICogdXNlcyB0aGUgYE5lYXJlc3RGaWx0ZXJgIGNyaXRlcmlvbiB0byBwcm9kdWNlIGEgdGV4dHVyZSB2YWx1ZSBmcm9tIGVhY2ggbWlwbWFwLlxyXG4gKiBUaGUgZmluYWwgdGV4dHVyZSB2YWx1ZSBpcyBhIHdlaWdodGVkIGF2ZXJhZ2Ugb2YgdGhvc2UgdHdvIHZhbHVlcy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTmVhcmVzdE1pcG1hcExpbmVhckZpbHRlciA9IDEwMDU7XHJcbmV4cG9ydCBjb25zdCBOZWFyZXN0TWlwTWFwTGluZWFyRmlsdGVyID0gMTAwNTsgLy8gbGVnYWN5XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgd2VpZ2h0ZWQgYXZlcmFnZSBvZiB0aGUgZm91ciB0ZXh0dXJlIGVsZW1lbnRzIHRoYXQgYXJlIGNsb3Nlc3QgdG8gdGhlIHNwZWNpZmllZFxyXG4gKiB0ZXh0dXJlIGNvb3JkaW5hdGVzLCBhbmQgY2FuIGluY2x1ZGUgaXRlbXMgd3JhcHBlZCBvciByZXBlYXRlZCBmcm9tIG90aGVyIHBhcnRzIG9mIGEgdGV4dHVyZSxcclxuICogZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZXMgb2YgYHdyYXBTYCBhbmQgYHdyYXBUYCwgYW5kIG9uIHRoZSBleGFjdCBtYXBwaW5nLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBMaW5lYXJGaWx0ZXIgPSAxMDA2O1xyXG5cclxuLyoqXHJcbiAqIENob29zZXMgdGhlIG1pcG1hcCB0aGF0IG1vc3QgY2xvc2VseSBtYXRjaGVzIHRoZSBzaXplIG9mIHRoZSBwaXhlbCBiZWluZyB0ZXh0dXJlZCBhbmQgdXNlc1xyXG4gKiB0aGUgYExpbmVhckZpbHRlcmAgY3JpdGVyaW9uIChhIHdlaWdodGVkIGF2ZXJhZ2Ugb2YgdGhlIGZvdXIgdGV4ZWxzIHRoYXQgYXJlIGNsb3Nlc3QgdG8gdGhlXHJcbiAqIGNlbnRlciBvZiB0aGUgcGl4ZWwpIHRvIHByb2R1Y2UgYSB0ZXh0dXJlIHZhbHVlLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBMaW5lYXJNaXBtYXBOZWFyZXN0RmlsdGVyID0gMTAwNztcclxuZXhwb3J0IGNvbnN0IExpbmVhck1pcE1hcE5lYXJlc3RGaWx0ZXIgPSAxMDA3OyAvLyBsZWdhY3lcclxuXHJcbi8qKlxyXG4gKiBDaG9vc2VzIHRoZSB0d28gbWlwbWFwcyB0aGF0IG1vc3QgY2xvc2VseSBtYXRjaCB0aGUgc2l6ZSBvZiB0aGUgcGl4ZWwgYmVpbmcgdGV4dHVyZWQgYW5kIHVzZXNcclxuICogdGhlIGBMaW5lYXJGaWx0ZXJgIGNyaXRlcmlvbiB0byBwcm9kdWNlIGEgdGV4dHVyZSB2YWx1ZSBmcm9tIGVhY2ggbWlwbWFwLiBUaGUgZmluYWwgdGV4dHVyZSB2YWx1ZVxyXG4gKiBpcyBhIHdlaWdodGVkIGF2ZXJhZ2Ugb2YgdGhvc2UgdHdvIHZhbHVlcy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyID0gMTAwODtcclxuZXhwb3J0IGNvbnN0IExpbmVhck1pcE1hcExpbmVhckZpbHRlciA9IDEwMDg7IC8vIGxlZ2FjeVxyXG5cclxuLyoqXHJcbiAqIEFuIHVuc2lnbmVkIGJ5dGUgZGF0YSB0eXBlIGZvciB0ZXh0dXJlcy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgVW5zaWduZWRCeXRlVHlwZSA9IDEwMDk7XHJcblxyXG4vKipcclxuICogQSBieXRlIGRhdGEgdHlwZSBmb3IgdGV4dHVyZXMuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEJ5dGVUeXBlID0gMTAxMDtcclxuXHJcbi8qKlxyXG4gKiBBIHNob3J0IGRhdGEgdHlwZSBmb3IgdGV4dHVyZXMuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFNob3J0VHlwZSA9IDEwMTE7XHJcblxyXG4vKipcclxuICogQW4gdW5zaWduZWQgc2hvcnQgZGF0YSB0eXBlIGZvciB0ZXh0dXJlcy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgVW5zaWduZWRTaG9ydFR5cGUgPSAxMDEyO1xyXG5cclxuLyoqXHJcbiAqIEFuIGludCBkYXRhIHR5cGUgZm9yIHRleHR1cmVzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBJbnRUeXBlID0gMTAxMztcclxuXHJcbi8qKlxyXG4gKiBBbiB1bnNpZ25lZCBpbnQgZGF0YSB0eXBlIGZvciB0ZXh0dXJlcy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgVW5zaWduZWRJbnRUeXBlID0gMTAxNDtcclxuXHJcbi8qKlxyXG4gKiBBIGZsb2F0IGRhdGEgdHlwZSBmb3IgdGV4dHVyZXMuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEZsb2F0VHlwZSA9IDEwMTU7XHJcblxyXG4vKipcclxuICogQSBoYWxmIGZsb2F0IGRhdGEgdHlwZSBmb3IgdGV4dHVyZXMuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEhhbGZGbG9hdFR5cGUgPSAxMDE2O1xyXG5cclxuLyoqXHJcbiAqIEFuIHVuc2lnbmVkIHNob3J0IDRfNF80XzQgKHBhY2tlZCkgZGF0YSB0eXBlIGZvciB0ZXh0dXJlcy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgVW5zaWduZWRTaG9ydDQ0NDRUeXBlID0gMTAxNztcclxuXHJcbi8qKlxyXG4gKiBBbiB1bnNpZ25lZCBzaG9ydCA1XzVfNV8xIChwYWNrZWQpIGRhdGEgdHlwZSBmb3IgdGV4dHVyZXMuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFVuc2lnbmVkU2hvcnQ1NTUxVHlwZSA9IDEwMTg7XHJcblxyXG4vKipcclxuICogQW4gdW5zaWduZWQgaW50IDI0XzggZGF0YSB0eXBlIGZvciB0ZXh0dXJlcy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgVW5zaWduZWRJbnQyNDhUeXBlID0gMTAyMDtcclxuXHJcbi8qKlxyXG4gKiBBbiB1bnNpZ25lZCBpbnQgNV85XzlfOSAocGFja2VkKSBkYXRhIHR5cGUgZm9yIHRleHR1cmVzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBVbnNpZ25lZEludDU5OTlUeXBlID0gMzU5MDI7XHJcblxyXG4vKipcclxuICogRGlzY2FyZHMgdGhlIHJlZCwgZ3JlZW4gYW5kIGJsdWUgY29tcG9uZW50cyBhbmQgcmVhZHMganVzdCB0aGUgYWxwaGEgY29tcG9uZW50LlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBBbHBoYUZvcm1hdCA9IDEwMjE7XHJcblxyXG4vKipcclxuICogRGlzY2FyZHMgdGhlIGFscGhhIGNvbXBvbmVudCBhbmQgcmVhZHMgdGhlIHJlZCwgZ3JlZW4gYW5kIGJsdWUgY29tcG9uZW50LlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBSR0JGb3JtYXQgPSAxMDIyO1xyXG5cclxuLyoqXHJcbiAqIFJlYWRzIHRoZSByZWQsIGdyZWVuLCBibHVlIGFuZCBhbHBoYSBjb21wb25lbnRzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBSR0JBRm9ybWF0ID0gMTAyMztcclxuXHJcbi8qKlxyXG4gKiByZWFkcyBlYWNoIGVsZW1lbnQgYXMgYSBzaW5nbGUgbHVtaW5hbmNlIGNvbXBvbmVudC4gVGhpcyBpcyB0aGVuIGNvbnZlcnRlZCB0byBhIGZsb2F0aW5nIHBvaW50LFxyXG4gKiBjbGFtcGVkIHRvIHRoZSByYW5nZSBgWzAsMV1gLCBhbmQgdGhlbiBhc3NlbWJsZWQgaW50byBhbiBSR0JBIGVsZW1lbnQgYnkgcGxhY2luZyB0aGUgbHVtaW5hbmNlIHZhbHVlXHJcbiAqIGluIHRoZSByZWQsIGdyZWVuIGFuZCBibHVlIGNoYW5uZWxzLCBhbmQgYXR0YWNoaW5nIDEuMCB0byB0aGUgYWxwaGEgY2hhbm5lbC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTHVtaW5hbmNlRm9ybWF0ID0gMTAyNDtcclxuXHJcbi8qKlxyXG4gKiBSZWFkcyBlYWNoIGVsZW1lbnQgYXMgYSBsdW1pbmFuY2UvYWxwaGEgZG91YmxlLiBUaGUgc2FtZSBwcm9jZXNzIG9jY3VycyBhcyBmb3IgdGhlIGBMdW1pbmFuY2VGb3JtYXRgLFxyXG4gKiBleGNlcHQgdGhhdCB0aGUgYWxwaGEgY2hhbm5lbCBtYXkgaGF2ZSB2YWx1ZXMgb3RoZXIgdGhhbiBgMS4wYC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTHVtaW5hbmNlQWxwaGFGb3JtYXQgPSAxMDI1O1xyXG5cclxuLyoqXHJcbiAqIFJlYWRzIGVhY2ggZWxlbWVudCBhcyBhIHNpbmdsZSBkZXB0aCB2YWx1ZSwgY29udmVydHMgaXQgdG8gZmxvYXRpbmcgcG9pbnQsIGFuZCBjbGFtcHMgdG8gdGhlIHJhbmdlIGBbMCwxXWAuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IERlcHRoRm9ybWF0ID0gMTAyNjtcclxuXHJcbi8qKlxyXG4gKiBSZWFkcyBlYWNoIGVsZW1lbnQgaXMgYSBwYWlyIG9mIGRlcHRoIGFuZCBzdGVuY2lsIHZhbHVlcy4gVGhlIGRlcHRoIGNvbXBvbmVudCBvZiB0aGUgcGFpciBpcyBpbnRlcnByZXRlZCBhc1xyXG4gKiBpbiBgRGVwdGhGb3JtYXRgLiBUaGUgc3RlbmNpbCBjb21wb25lbnQgaXMgaW50ZXJwcmV0ZWQgYmFzZWQgb24gdGhlIGRlcHRoICsgc3RlbmNpbCBpbnRlcm5hbCBmb3JtYXQuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IERlcHRoU3RlbmNpbEZvcm1hdCA9IDEwMjc7XHJcblxyXG4vKipcclxuICogRGlzY2FyZHMgdGhlIGdyZWVuLCBibHVlIGFuZCBhbHBoYSBjb21wb25lbnRzIGFuZCByZWFkcyBqdXN0IHRoZSByZWQgY29tcG9uZW50LlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBSZWRGb3JtYXQgPSAxMDI4O1xyXG5cclxuLyoqXHJcbiAqIERpc2NhcmRzIHRoZSBncmVlbiwgYmx1ZSBhbmQgYWxwaGEgY29tcG9uZW50cyBhbmQgcmVhZHMganVzdCB0aGUgcmVkIGNvbXBvbmVudC4gVGhlIHRleGVscyBhcmUgcmVhZCBhcyBpbnRlZ2VycyBpbnN0ZWFkIG9mIGZsb2F0aW5nIHBvaW50LlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBSZWRJbnRlZ2VyRm9ybWF0ID0gMTAyOTtcclxuXHJcbi8qKlxyXG4gKiBEaXNjYXJkcyB0aGUgYWxwaGEsIGFuZCBibHVlIGNvbXBvbmVudHMgYW5kIHJlYWRzIHRoZSByZWQsIGFuZCBncmVlbiBjb21wb25lbnRzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBSR0Zvcm1hdCA9IDEwMzA7XHJcblxyXG4vKipcclxuICogRGlzY2FyZHMgdGhlIGFscGhhLCBhbmQgYmx1ZSBjb21wb25lbnRzIGFuZCByZWFkcyB0aGUgcmVkLCBhbmQgZ3JlZW4gY29tcG9uZW50cy4gVGhlIHRleGVscyBhcmUgcmVhZCBhcyBpbnRlZ2VycyBpbnN0ZWFkIG9mIGZsb2F0aW5nIHBvaW50LlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBSR0ludGVnZXJGb3JtYXQgPSAxMDMxO1xyXG5cclxuLyoqXHJcbiAqIERpc2NhcmRzIHRoZSBhbHBoYSBjb21wb25lbnQgYW5kIHJlYWRzIHRoZSByZWQsIGdyZWVuIGFuZCBibHVlIGNvbXBvbmVudC4gVGhlIHRleGVscyBhcmUgcmVhZCBhcyBpbnRlZ2VycyBpbnN0ZWFkIG9mIGZsb2F0aW5nIHBvaW50LlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBSR0JJbnRlZ2VyRm9ybWF0ID0gMTAzMjtcclxuXHJcbi8qKlxyXG4gKiBSZWFkcyB0aGUgcmVkLCBncmVlbiwgYmx1ZSBhbmQgYWxwaGEgY29tcG9uZW50cy4gVGhlIHRleGVscyBhcmUgcmVhZCBhcyBpbnRlZ2VycyBpbnN0ZWFkIG9mIGZsb2F0aW5nIHBvaW50LlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBSR0JBSW50ZWdlckZvcm1hdCA9IDEwMzM7XHJcblxyXG4vKipcclxuICogQSBEWFQxLWNvbXByZXNzZWQgaW1hZ2UgaW4gYW4gUkdCIGltYWdlIGZvcm1hdC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUkdCX1MzVENfRFhUMV9Gb3JtYXQgPSAzMzc3NjtcclxuXHJcbi8qKlxyXG4gKiBBIERYVDEtY29tcHJlc3NlZCBpbWFnZSBpbiBhbiBSR0IgaW1hZ2UgZm9ybWF0IHdpdGggYSBzaW1wbGUgb24vb2ZmIGFscGhhIHZhbHVlLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBSR0JBX1MzVENfRFhUMV9Gb3JtYXQgPSAzMzc3NztcclxuXHJcbi8qKlxyXG4gKiBBIERYVDMtY29tcHJlc3NlZCBpbWFnZSBpbiBhbiBSR0JBIGltYWdlIGZvcm1hdC4gQ29tcGFyZWQgdG8gYSAzMi1iaXQgUkdCQSB0ZXh0dXJlLCBpdCBvZmZlcnMgNDoxIGNvbXByZXNzaW9uLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBSR0JBX1MzVENfRFhUM19Gb3JtYXQgPSAzMzc3ODtcclxuXHJcbi8qKlxyXG4gKiBBIERYVDUtY29tcHJlc3NlZCBpbWFnZSBpbiBhbiBSR0JBIGltYWdlIGZvcm1hdC4gSXQgYWxzbyBwcm92aWRlcyBhIDQ6MSBjb21wcmVzc2lvbiwgYnV0IGRpZmZlcnMgdG8gdGhlIERYVDNcclxuICogY29tcHJlc3Npb24gaW4gaG93IHRoZSBhbHBoYSBjb21wcmVzc2lvbiBpcyBkb25lLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBSR0JBX1MzVENfRFhUNV9Gb3JtYXQgPSAzMzc3OTtcclxuXHJcbi8qKlxyXG4gKiBQVlJUQyBSR0IgY29tcHJlc3Npb24gaW4gNC1iaXQgbW9kZS4gT25lIGJsb2NrIGZvciBlYWNoIDTDlzQgcGl4ZWxzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBSR0JfUFZSVENfNEJQUFYxX0Zvcm1hdCA9IDM1ODQwO1xyXG5cclxuLyoqXHJcbiAqIFBWUlRDIFJHQiBjb21wcmVzc2lvbiBpbiAyLWJpdCBtb2RlLiBPbmUgYmxvY2sgZm9yIGVhY2ggOMOXNCBwaXhlbHMuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFJHQl9QVlJUQ18yQlBQVjFfRm9ybWF0ID0gMzU4NDE7XHJcblxyXG4vKipcclxuICogUFZSVEMgUkdCQSBjb21wcmVzc2lvbiBpbiA0LWJpdCBtb2RlLiBPbmUgYmxvY2sgZm9yIGVhY2ggNMOXNCBwaXhlbHMuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFJHQkFfUFZSVENfNEJQUFYxX0Zvcm1hdCA9IDM1ODQyO1xyXG5cclxuLyoqXHJcbiAqIFBWUlRDIFJHQkEgY29tcHJlc3Npb24gaW4gMi1iaXQgbW9kZS4gT25lIGJsb2NrIGZvciBlYWNoIDjDlzQgcGl4ZWxzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBSR0JBX1BWUlRDXzJCUFBWMV9Gb3JtYXQgPSAzNTg0MztcclxuXHJcbi8qKlxyXG4gKiBFVEMxIFJHQiBmb3JtYXQuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFJHQl9FVEMxX0Zvcm1hdCA9IDM2MTk2O1xyXG5cclxuLyoqXHJcbiAqIEVUQzIgUkdCIGZvcm1hdC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUkdCX0VUQzJfRm9ybWF0ID0gMzc0OTI7XHJcblxyXG4vKipcclxuICogRVRDMiBSR0JBIGZvcm1hdC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUkdCQV9FVEMyX0VBQ19Gb3JtYXQgPSAzNzQ5NjtcclxuXHJcbi8qKlxyXG4gKiBBU1RDIFJHQkEgNHg0IGZvcm1hdC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUkdCQV9BU1RDXzR4NF9Gb3JtYXQgPSAzNzgwODtcclxuXHJcbi8qKlxyXG4gKiBBU1RDIFJHQkEgNXg0IGZvcm1hdC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUkdCQV9BU1RDXzV4NF9Gb3JtYXQgPSAzNzgwOTtcclxuXHJcbi8qKlxyXG4gKiBBU1RDIFJHQkEgNXg1IGZvcm1hdC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUkdCQV9BU1RDXzV4NV9Gb3JtYXQgPSAzNzgxMDtcclxuXHJcbi8qKlxyXG4gKiBBU1RDIFJHQkEgNng1IGZvcm1hdC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUkdCQV9BU1RDXzZ4NV9Gb3JtYXQgPSAzNzgxMTtcclxuXHJcbi8qKlxyXG4gKiBBU1RDIFJHQkEgNng2IGZvcm1hdC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUkdCQV9BU1RDXzZ4Nl9Gb3JtYXQgPSAzNzgxMjtcclxuXHJcbi8qKlxyXG4gKiBBU1RDIFJHQkEgOHg1IGZvcm1hdC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUkdCQV9BU1RDXzh4NV9Gb3JtYXQgPSAzNzgxMztcclxuXHJcbi8qKlxyXG4gKiBBU1RDIFJHQkEgOHg2IGZvcm1hdC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUkdCQV9BU1RDXzh4Nl9Gb3JtYXQgPSAzNzgxNDtcclxuXHJcbi8qKlxyXG4gKiBBU1RDIFJHQkEgOHg4IGZvcm1hdC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUkdCQV9BU1RDXzh4OF9Gb3JtYXQgPSAzNzgxNTtcclxuXHJcbi8qKlxyXG4gKiBBU1RDIFJHQkEgMTB4NSBmb3JtYXQuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFJHQkFfQVNUQ18xMHg1X0Zvcm1hdCA9IDM3ODE2O1xyXG5cclxuLyoqXHJcbiAqIEFTVEMgUkdCQSAxMHg2IGZvcm1hdC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUkdCQV9BU1RDXzEweDZfRm9ybWF0ID0gMzc4MTc7XHJcblxyXG4vKipcclxuICogQVNUQyBSR0JBIDEweDggZm9ybWF0LlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBSR0JBX0FTVENfMTB4OF9Gb3JtYXQgPSAzNzgxODtcclxuXHJcbi8qKlxyXG4gKiBBU1RDIFJHQkEgMTB4MTAgZm9ybWF0LlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBSR0JBX0FTVENfMTB4MTBfRm9ybWF0ID0gMzc4MTk7XHJcblxyXG4vKipcclxuICogQVNUQyBSR0JBIDEyeDEwIGZvcm1hdC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUkdCQV9BU1RDXzEyeDEwX0Zvcm1hdCA9IDM3ODIwO1xyXG5cclxuLyoqXHJcbiAqIEFTVEMgUkdCQSAxMngxMiBmb3JtYXQuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFJHQkFfQVNUQ18xMngxMl9Gb3JtYXQgPSAzNzgyMTtcclxuXHJcbi8qKlxyXG4gKiBCUFRDIFJHQkEgZm9ybWF0LlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBSR0JBX0JQVENfRm9ybWF0ID0gMzY0OTI7XHJcblxyXG4vKipcclxuICogQlBUQyBTaWduZWQgUkdCIGZvcm1hdC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUkdCX0JQVENfU0lHTkVEX0Zvcm1hdCA9IDM2NDk0O1xyXG5cclxuLyoqXHJcbiAqIEJQVEMgVW5zaWduZWQgUkdCIGZvcm1hdC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUkdCX0JQVENfVU5TSUdORURfRm9ybWF0ID0gMzY0OTU7XHJcblxyXG4vKipcclxuICogUkdUQzEgUmVkIGZvcm1hdC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUkVEX1JHVEMxX0Zvcm1hdCA9IDM2MjgzO1xyXG5cclxuLyoqXHJcbiAqIFJHVEMxIFNpZ25lZCBSZWQgZm9ybWF0LlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBTSUdORURfUkVEX1JHVEMxX0Zvcm1hdCA9IDM2Mjg0O1xyXG5cclxuLyoqXHJcbiAqIFJHVEMyIFJlZCBHcmVlbiBmb3JtYXQuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFJFRF9HUkVFTl9SR1RDMl9Gb3JtYXQgPSAzNjI4NTtcclxuXHJcbi8qKlxyXG4gKiBSR1RDMiBTaWduZWQgUmVkIEdyZWVuIGZvcm1hdC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgU0lHTkVEX1JFRF9HUkVFTl9SR1RDMl9Gb3JtYXQgPSAzNjI4NjtcclxuXHJcbi8qKlxyXG4gKiBBbmltYXRpb25zIGFyZSBwbGF5ZWQgb25jZS5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTG9vcE9uY2UgPSAyMjAwO1xyXG5cclxuLyoqXHJcbiAqIEFuaW1hdGlvbnMgYXJlIHBsYXllZCB3aXRoIGEgY2hvc2VuIG51bWJlciBvZiByZXBldGl0aW9ucywgZWFjaCB0aW1lIGp1bXBpbmcgZnJvbVxyXG4gKiB0aGUgZW5kIG9mIHRoZSBjbGlwIGRpcmVjdGx5IHRvIGl0cyBiZWdpbm5pbmcuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IExvb3BSZXBlYXQgPSAyMjAxO1xyXG5cclxuLyoqXHJcbiAqIEFuaW1hdGlvbnMgYXJlIHBsYXllZCB3aXRoIGEgY2hvc2VuIG51bWJlciBvZiByZXBldGl0aW9ucywgYWx0ZXJuYXRlbHkgcGxheWluZyBmb3J3YXJkXHJcbiAqIGFuZCBiYWNrd2FyZC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTG9vcFBpbmdQb25nID0gMjIwMjtcclxuXHJcbi8qKlxyXG4gKiBEaXNjcmV0ZSBpbnRlcnBvbGF0aW9uIG1vZGUgZm9yIGtleWZyYW1lIHRyYWNrcy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgSW50ZXJwb2xhdGVEaXNjcmV0ZSA9IDIzMDA7XHJcblxyXG4vKipcclxuICogTGluZWFyIGludGVycG9sYXRpb24gbW9kZSBmb3Iga2V5ZnJhbWUgdHJhY2tzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBJbnRlcnBvbGF0ZUxpbmVhciA9IDIzMDE7XHJcblxyXG4vKipcclxuICogU21vb3RoIGludGVycG9sYXRpb24gbW9kZSBmb3Iga2V5ZnJhbWUgdHJhY2tzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBJbnRlcnBvbGF0ZVNtb290aCA9IDIzMDI7XHJcblxyXG4vKipcclxuICogWmVybyBjdXJ2YXR1cmUgZW5kaW5nIGZvciBhbmltYXRpb25zLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBaZXJvQ3VydmF0dXJlRW5kaW5nID0gMjQwMDtcclxuXHJcbi8qKlxyXG4gKiBaZXJvIHNsb3BlIGVuZGluZyBmb3IgYW5pbWF0aW9ucy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgWmVyb1Nsb3BlRW5kaW5nID0gMjQwMTtcclxuXHJcbi8qKlxyXG4gKiBXcmFwIGFyb3VuZCBlbmRpbmcgZm9yIGFuaW1hdGlvbnMuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFdyYXBBcm91bmRFbmRpbmcgPSAyNDAyO1xyXG5cclxuLyoqXHJcbiAqIERlZmF1bHQgYW5pbWF0aW9uIGJsZW5kIG1vZGUuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IE5vcm1hbEFuaW1hdGlvbkJsZW5kTW9kZSA9IDI1MDA7XHJcblxyXG4vKipcclxuICogQWRkaXRpdmUgYW5pbWF0aW9uIGJsZW5kIG1vZGUuIENhbiBiZSB1c2VkIHRvIGxheWVyIG1vdGlvbnMgb24gdG9wIG9mXHJcbiAqIGVhY2ggb3RoZXIgdG8gYnVpbGQgY29tcGxleCBwZXJmb3JtYW5jZXMgZnJvbSBzbWFsbGVyIHJlLXVzYWJsZSBhc3NldHMuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEFkZGl0aXZlQW5pbWF0aW9uQmxlbmRNb2RlID0gMjUwMTtcclxuXHJcbi8qKlxyXG4gKiBGb3IgZXZlcnkgdGhyZWUgdmVydGljZXMgZHJhdyBhIHNpbmdsZSB0cmlhbmdsZS5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgVHJpYW5nbGVzRHJhd01vZGUgPSAwO1xyXG5cclxuLyoqXHJcbiAqIEZvciBlYWNoIHZlcnRleCBkcmF3IGEgdHJpYW5nbGUgZnJvbSB0aGUgbGFzdCB0aHJlZSB2ZXJ0aWNlcy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgVHJpYW5nbGVTdHJpcERyYXdNb2RlID0gMTtcclxuXHJcbi8qKlxyXG4gKiBGb3IgZWFjaCB2ZXJ0ZXggZHJhdyBhIHRyaWFuZ2xlIGZyb20gdGhlIGZpcnN0IHZlcnRleCBhbmQgdGhlIGxhc3QgdHdvIHZlcnRpY2VzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBUcmlhbmdsZUZhbkRyYXdNb2RlID0gMjtcclxuXHJcbi8qKlxyXG4gKiBCYXNpYyBkZXB0aCBwYWNraW5nLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBCYXNpY0RlcHRoUGFja2luZyA9IDMyMDA7XHJcblxyXG4vKipcclxuICogQSBkZXB0aCB2YWx1ZSBpcyBwYWNrZWQgaW50byAzMiBiaXQgUkdCQS5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUkdCQURlcHRoUGFja2luZyA9IDMyMDE7XHJcblxyXG4vKipcclxuICogQSBkZXB0aCB2YWx1ZSBpcyBwYWNrZWQgaW50byAyNCBiaXQgUkdCLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBSR0JEZXB0aFBhY2tpbmcgPSAzMjAyO1xyXG5cclxuLyoqXHJcbiAqIEEgZGVwdGggdmFsdWUgaXMgcGFja2VkIGludG8gMTYgYml0IFJHLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBSR0RlcHRoUGFja2luZyA9IDMyMDM7XHJcblxyXG4vKipcclxuICogTm9ybWFsIGluZm9ybWF0aW9uIGlzIHJlbGF0aXZlIHRvIHRoZSB1bmRlcmx5aW5nIHN1cmZhY2UuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFRhbmdlbnRTcGFjZU5vcm1hbE1hcCA9IDA7XHJcblxyXG4vKipcclxuICogTm9ybWFsIGluZm9ybWF0aW9uIGlzIHJlbGF0aXZlIHRvIHRoZSBvYmplY3Qgb3JpZW50YXRpb24uXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IE9iamVjdFNwYWNlTm9ybWFsTWFwID0gMTtcclxuXHJcbi8vIENvbG9yIHNwYWNlIHN0cmluZyBpZGVudGlmaWVycywgbWF0Y2hpbmcgQ1NTIENvbG9yIE1vZHVsZSBMZXZlbCA0IGFuZCBXZWJHUFUgbmFtZXMgd2hlcmUgYXZhaWxhYmxlLlxyXG5cclxuLyoqXHJcbiAqIE5vIGNvbG9yIHNwYWNlLlxyXG4gKlxyXG4gKiBAdHlwZSB7c3RyaW5nfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBOb0NvbG9yU3BhY2UgPSAnJztcclxuXHJcbi8qKlxyXG4gKiBzUkdCIGNvbG9yIHNwYWNlLlxyXG4gKlxyXG4gKiBAdHlwZSB7c3RyaW5nfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBTUkdCQ29sb3JTcGFjZSA9ICdzcmdiJztcclxuXHJcbi8qKlxyXG4gKiBzUkdCLWxpbmVhciBjb2xvciBzcGFjZS5cclxuICpcclxuICogQHR5cGUge3N0cmluZ31cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTGluZWFyU1JHQkNvbG9yU3BhY2UgPSAnc3JnYi1saW5lYXInO1xyXG5cclxuLyoqXHJcbiAqIExpbmVhciB0cmFuc2ZlciBmdW5jdGlvbi5cclxuICpcclxuICogQHR5cGUge3N0cmluZ31cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTGluZWFyVHJhbnNmZXIgPSAnbGluZWFyJztcclxuXHJcbi8qKlxyXG4gKiBzUkdCIHRyYW5zZmVyIGZ1bmN0aW9uLlxyXG4gKlxyXG4gKiBAdHlwZSB7c3RyaW5nfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBTUkdCVHJhbnNmZXIgPSAnc3JnYic7XHJcblxyXG4vKipcclxuICogU2V0cyB0aGUgc3RlbmNpbCBidWZmZXIgdmFsdWUgdG8gYDBgLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBaZXJvU3RlbmNpbE9wID0gMDtcclxuXHJcbi8qKlxyXG4gKiBLZWVwcyB0aGUgY3VycmVudCB2YWx1ZS5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgS2VlcFN0ZW5jaWxPcCA9IDc2ODA7XHJcblxyXG4vKipcclxuICogU2V0cyB0aGUgc3RlbmNpbCBidWZmZXIgdmFsdWUgdG8gdGhlIHNwZWNpZmllZCByZWZlcmVuY2UgdmFsdWUuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFJlcGxhY2VTdGVuY2lsT3AgPSA3NjgxO1xyXG5cclxuLyoqXHJcbiAqIEluY3JlbWVudHMgdGhlIGN1cnJlbnQgc3RlbmNpbCBidWZmZXIgdmFsdWUuIENsYW1wcyB0byB0aGUgbWF4aW11bSByZXByZXNlbnRhYmxlIHVuc2lnbmVkIHZhbHVlLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBJbmNyZW1lbnRTdGVuY2lsT3AgPSA3NjgyO1xyXG5cclxuLyoqXHJcbiAqIERlY3JlbWVudHMgdGhlIGN1cnJlbnQgc3RlbmNpbCBidWZmZXIgdmFsdWUuIENsYW1wcyB0byBgMGAuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IERlY3JlbWVudFN0ZW5jaWxPcCA9IDc2ODM7XHJcblxyXG4vKipcclxuICogSW5jcmVtZW50cyB0aGUgY3VycmVudCBzdGVuY2lsIGJ1ZmZlciB2YWx1ZS4gV3JhcHMgc3RlbmNpbCBidWZmZXIgdmFsdWUgdG8gemVybyB3aGVuIGluY3JlbWVudGluZ1xyXG4gKiB0aGUgbWF4aW11bSByZXByZXNlbnRhYmxlIHVuc2lnbmVkIHZhbHVlLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBJbmNyZW1lbnRXcmFwU3RlbmNpbE9wID0gMzQwNTU7XHJcblxyXG4vKipcclxuICogRGVjcmVtZW50cyB0aGUgY3VycmVudCBzdGVuY2lsIGJ1ZmZlciB2YWx1ZS4gV3JhcHMgc3RlbmNpbCBidWZmZXIgdmFsdWUgdG8gdGhlIG1heGltdW0gcmVwcmVzZW50YWJsZVxyXG4gKiB1bnNpZ25lZCB2YWx1ZSB3aGVuIGRlY3JlbWVudGluZyBhIHN0ZW5jaWwgYnVmZmVyIHZhbHVlIG9mIGAwYC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgRGVjcmVtZW50V3JhcFN0ZW5jaWxPcCA9IDM0MDU2O1xyXG5cclxuLyoqXHJcbiAqIEludmVydHMgdGhlIGN1cnJlbnQgc3RlbmNpbCBidWZmZXIgdmFsdWUgYml0d2lzZS5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgSW52ZXJ0U3RlbmNpbE9wID0gNTM4NjtcclxuXHJcbi8qKlxyXG4gKiBXaWxsIG5ldmVyIHJldHVybiB0cnVlLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBOZXZlclN0ZW5jaWxGdW5jID0gNTEyO1xyXG5cclxuLyoqXHJcbiAqIFdpbGwgcmV0dXJuIHRydWUgaWYgdGhlIHN0ZW5jaWwgcmVmZXJlbmNlIHZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgY3VycmVudCBzdGVuY2lsIHZhbHVlLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBMZXNzU3RlbmNpbEZ1bmMgPSA1MTM7XHJcblxyXG4vKipcclxuICogV2lsbCByZXR1cm4gdHJ1ZSBpZiB0aGUgc3RlbmNpbCByZWZlcmVuY2UgdmFsdWUgaXMgZXF1YWwgdG8gdGhlIGN1cnJlbnQgc3RlbmNpbCB2YWx1ZS5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgRXF1YWxTdGVuY2lsRnVuYyA9IDUxNDtcclxuXHJcbi8qKlxyXG4gKiBXaWxsIHJldHVybiB0cnVlIGlmIHRoZSBzdGVuY2lsIHJlZmVyZW5jZSB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGN1cnJlbnQgc3RlbmNpbCB2YWx1ZS5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTGVzc0VxdWFsU3RlbmNpbEZ1bmMgPSA1MTU7XHJcblxyXG4vKipcclxuICogV2lsbCByZXR1cm4gdHJ1ZSBpZiB0aGUgc3RlbmNpbCByZWZlcmVuY2UgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IHN0ZW5jaWwgdmFsdWUuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEdyZWF0ZXJTdGVuY2lsRnVuYyA9IDUxNjtcclxuXHJcbi8qKlxyXG4gKiBXaWxsIHJldHVybiB0cnVlIGlmIHRoZSBzdGVuY2lsIHJlZmVyZW5jZSB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gdGhlIGN1cnJlbnQgc3RlbmNpbCB2YWx1ZS5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTm90RXF1YWxTdGVuY2lsRnVuYyA9IDUxNztcclxuXHJcbi8qKlxyXG4gKiBXaWxsIHJldHVybiB0cnVlIGlmIHRoZSBzdGVuY2lsIHJlZmVyZW5jZSB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGN1cnJlbnQgc3RlbmNpbCB2YWx1ZS5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgR3JlYXRlckVxdWFsU3RlbmNpbEZ1bmMgPSA1MTg7XHJcblxyXG4vKipcclxuICogV2lsbCBhbHdheXMgcmV0dXJuIHRydWUuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEFsd2F5c1N0ZW5jaWxGdW5jID0gNTE5O1xyXG5cclxuLyoqXHJcbiAqIE5ldmVyIHBhc3MuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IE5ldmVyQ29tcGFyZSA9IDUxMjtcclxuXHJcbi8qKlxyXG4gKiBQYXNzIGlmIHRoZSBpbmNvbWluZyB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIHRleHR1cmUgdmFsdWUuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IExlc3NDb21wYXJlID0gNTEzO1xyXG5cclxuLyoqXHJcbiAqIFBhc3MgaWYgdGhlIGluY29taW5nIHZhbHVlIGVxdWFscyB0aGUgdGV4dHVyZSB2YWx1ZS5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgRXF1YWxDb21wYXJlID0gNTE0O1xyXG5cclxuLyoqXHJcbiAqIFBhc3MgaWYgdGhlIGluY29taW5nIHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgdGV4dHVyZSB2YWx1ZS5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTGVzc0VxdWFsQ29tcGFyZSA9IDUxNTtcclxuXHJcbi8qKlxyXG4gKiBQYXNzIGlmIHRoZSBpbmNvbWluZyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIHRleHR1cmUgdmFsdWUuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEdyZWF0ZXJDb21wYXJlID0gNTE2O1xyXG5cclxuLyoqXHJcbiAqIFBhc3MgaWYgdGhlIGluY29taW5nIHZhbHVlIGlzIG5vdCBlcXVhbCB0byB0aGUgdGV4dHVyZSB2YWx1ZS5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTm90RXF1YWxDb21wYXJlID0gNTE3O1xyXG5cclxuLyoqXHJcbiAqIFBhc3MgaWYgdGhlIGluY29taW5nIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgdGV4dHVyZSB2YWx1ZS5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgR3JlYXRlckVxdWFsQ29tcGFyZSA9IDUxODtcclxuXHJcbi8qKlxyXG4gKiBBbHdheXMgcGFzcy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgQWx3YXlzQ29tcGFyZSA9IDUxOTtcclxuXHJcbi8qKlxyXG4gKiBUaGUgY29udGVudHMgYXJlIGludGVuZGVkIHRvIGJlIHNwZWNpZmllZCBvbmNlIGJ5IHRoZSBhcHBsaWNhdGlvbiwgYW5kIHVzZWQgbWFueVxyXG4gKiB0aW1lcyBhcyB0aGUgc291cmNlIGZvciBkcmF3aW5nIGFuZCBpbWFnZSBzcGVjaWZpY2F0aW9uIGNvbW1hbmRzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBTdGF0aWNEcmF3VXNhZ2UgPSAzNTA0NDtcclxuXHJcbi8qKlxyXG4gKiBUaGUgY29udGVudHMgYXJlIGludGVuZGVkIHRvIGJlIHJlc3BlY2lmaWVkIHJlcGVhdGVkbHkgYnkgdGhlIGFwcGxpY2F0aW9uLCBhbmRcclxuICogdXNlZCBtYW55IHRpbWVzIGFzIHRoZSBzb3VyY2UgZm9yIGRyYXdpbmcgYW5kIGltYWdlIHNwZWNpZmljYXRpb24gY29tbWFuZHMuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IER5bmFtaWNEcmF3VXNhZ2UgPSAzNTA0ODtcclxuXHJcbi8qKlxyXG4gKiBUaGUgY29udGVudHMgYXJlIGludGVuZGVkIHRvIGJlIHNwZWNpZmllZCBvbmNlIGJ5IHRoZSBhcHBsaWNhdGlvbiwgYW5kIHVzZWQgYXQgbW9zdFxyXG4gKiBhIGZldyB0aW1lcyBhcyB0aGUgc291cmNlIGZvciBkcmF3aW5nIGFuZCBpbWFnZSBzcGVjaWZpY2F0aW9uIGNvbW1hbmRzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBTdHJlYW1EcmF3VXNhZ2UgPSAzNTA0MDtcclxuXHJcbi8qKlxyXG4gKiBUaGUgY29udGVudHMgYXJlIGludGVuZGVkIHRvIGJlIHNwZWNpZmllZCBvbmNlIGJ5IHJlYWRpbmcgZGF0YSBmcm9tIHRoZSAzRCBBUEksIGFuZCBxdWVyaWVkXHJcbiAqIG1hbnkgdGltZXMgYnkgdGhlIGFwcGxpY2F0aW9uLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBTdGF0aWNSZWFkVXNhZ2UgPSAzNTA0NTtcclxuXHJcbi8qKlxyXG4gKiBUaGUgY29udGVudHMgYXJlIGludGVuZGVkIHRvIGJlIHJlc3BlY2lmaWVkIHJlcGVhdGVkbHkgYnkgcmVhZGluZyBkYXRhIGZyb20gdGhlIDNEIEFQSSwgYW5kIHF1ZXJpZWRcclxuICogbWFueSB0aW1lcyBieSB0aGUgYXBwbGljYXRpb24uXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IER5bmFtaWNSZWFkVXNhZ2UgPSAzNTA0OTtcclxuXHJcbi8qKlxyXG4gKiBUaGUgY29udGVudHMgYXJlIGludGVuZGVkIHRvIGJlIHNwZWNpZmllZCBvbmNlIGJ5IHJlYWRpbmcgZGF0YSBmcm9tIHRoZSAzRCBBUEksIGFuZCBxdWVyaWVkIGF0IG1vc3RcclxuICogYSBmZXcgdGltZXMgYnkgdGhlIGFwcGxpY2F0aW9uXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFN0cmVhbVJlYWRVc2FnZSA9IDM1MDQxO1xyXG5cclxuLyoqXHJcbiAqIFRoZSBjb250ZW50cyBhcmUgaW50ZW5kZWQgdG8gYmUgc3BlY2lmaWVkIG9uY2UgYnkgcmVhZGluZyBkYXRhIGZyb20gdGhlIDNEIEFQSSwgYW5kIHVzZWQgbWFueSB0aW1lcyBhc1xyXG4gKiB0aGUgc291cmNlIGZvciBXZWJHTCBkcmF3aW5nIGFuZCBpbWFnZSBzcGVjaWZpY2F0aW9uIGNvbW1hbmRzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBTdGF0aWNDb3B5VXNhZ2UgPSAzNTA0NjtcclxuXHJcbi8qKlxyXG4gKiBUaGUgY29udGVudHMgYXJlIGludGVuZGVkIHRvIGJlIHJlc3BlY2lmaWVkIHJlcGVhdGVkbHkgYnkgcmVhZGluZyBkYXRhIGZyb20gdGhlIDNEIEFQSSwgYW5kIHVzZWQgbWFueSB0aW1lc1xyXG4gKiBhcyB0aGUgc291cmNlIGZvciBXZWJHTCBkcmF3aW5nIGFuZCBpbWFnZSBzcGVjaWZpY2F0aW9uIGNvbW1hbmRzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBEeW5hbWljQ29weVVzYWdlID0gMzUwNTA7XHJcblxyXG4vKipcclxuICogVGhlIGNvbnRlbnRzIGFyZSBpbnRlbmRlZCB0byBiZSBzcGVjaWZpZWQgb25jZSBieSByZWFkaW5nIGRhdGEgZnJvbSB0aGUgM0QgQVBJLCBhbmQgdXNlZCBhdCBtb3N0IGEgZmV3IHRpbWVzXHJcbiAqIGFzIHRoZSBzb3VyY2UgZm9yIFdlYkdMIGRyYXdpbmcgYW5kIGltYWdlIHNwZWNpZmljYXRpb24gY29tbWFuZHMuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFN0cmVhbUNvcHlVc2FnZSA9IDM1MDQyO1xyXG5cclxuLyoqXHJcbiAqIEdMU0wgMSBzaGFkZXIgY29kZS5cclxuICpcclxuICogQHR5cGUge3N0cmluZ31cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgR0xTTDEgPSAnMTAwJztcclxuXHJcbi8qKlxyXG4gKiBHTFNMIDMgc2hhZGVyIGNvZGUuXHJcbiAqXHJcbiAqIEB0eXBlIHtzdHJpbmd9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEdMU0wzID0gJzMwMCBlcyc7XHJcblxyXG4vKipcclxuICogV2ViR0wgY29vcmRpbmF0ZSBzeXN0ZW0uXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFdlYkdMQ29vcmRpbmF0ZVN5c3RlbSA9IDIwMDA7XHJcblxyXG4vKipcclxuICogV2ViR1BVIGNvb3JkaW5hdGUgc3lzdGVtLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBXZWJHUFVDb29yZGluYXRlU3lzdGVtID0gMjAwMTtcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIHRoZSBkaWZmZXJlbnQgdGltZXN0YW1wIHF1ZXJ5IHR5cGVzLlxyXG4gKlxyXG4gKiBAdHlwZSB7Q29uc3RhbnRzVGltZXN0YW1wUXVlcnl9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFRpbWVzdGFtcFF1ZXJ5ID0ge1xyXG5cdENPTVBVVEU6ICdjb21wdXRlJyxcclxuXHRSRU5ERVI6ICdyZW5kZXInXHJcbn07XHJcblxyXG4vKipcclxuICogVGhpcyB0eXBlIHJlcHJlc2VudHMgbW91c2UgYnV0dG9ucyBhbmQgaW50ZXJhY3Rpb24gdHlwZXMgaW4gY29udGV4dCBvZiBjb250cm9scy5cclxuICpcclxuICogQHR5cGVkZWYge09iamVjdH0gQ29uc3RhbnRzTW91c2VcclxuICogQHByb3BlcnR5IHtudW1iZXJ9IE1JRERMRSAtIFRoZSBsZWZ0IG1vdXNlIGJ1dHRvbi5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IExFRlQgLSBUaGUgbWlkZGxlIG1vdXNlIGJ1dHRvbi5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFJJR0hUIC0gVGhlIHJpZ2h0IG1vdXNlIGJ1dHRvbi5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFJPVEFURSAtIEEgcm90YXRlIGludGVyYWN0aW9uLlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gRE9MTFkgLSBBIGRvbGx5IGludGVyYWN0aW9uLlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gUEFOIC0gQSBwYW4gaW50ZXJhY3Rpb24uXHJcbiAqKi9cclxuXHJcbi8qKlxyXG4gKiBUaGlzIHR5cGUgcmVwcmVzZW50cyB0b3VjaCBpbnRlcmFjdGlvbiB0eXBlcyBpbiBjb250ZXh0IG9mIGNvbnRyb2xzLlxyXG4gKlxyXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDb25zdGFudHNUb3VjaFxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gUk9UQVRFIC0gQSByb3RhdGUgaW50ZXJhY3Rpb24uXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBQQU4gLSBBIHBhbiBpbnRlcmFjdGlvbi5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IERPTExZX1BBTiAtIFRoZSBkb2xseS1wYW4gaW50ZXJhY3Rpb24uXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBET0xMWV9ST1RBVEUgLSBBIGRvbGx5LXJvdGF0ZSBpbnRlcmFjdGlvbi5cclxuICoqL1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgdHlwZSByZXByZXNlbnRzIHRoZSBkaWZmZXJlbnQgdGltZXN0YW1wIHF1ZXJ5IHR5cGVzLlxyXG4gKlxyXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDb25zdGFudHNUaW1lc3RhbXBRdWVyeVxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQ09NUFVURSAtIEEgYGNvbXB1dGVgIHRpbWVzdGFtcCBxdWVyeS5cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IFJFTkRFUiAtIEEgYHJlbmRlcmAgdGltZXN0YW1wIHF1ZXJ5LlxyXG4gKiovXHJcbiIsIi8qKlxyXG4gKiBUaGlzIG1vZHVsZXMgYWxsb3dzIHRvIGRpc3BhdGNoIGV2ZW50IG9iamVjdHMgb24gY3VzdG9tIEphdmFTY3JpcHQgb2JqZWN0cy5cclxuICpcclxuICogTWFpbiByZXBvc2l0b3J5OiBbZXZlbnRkaXNwYXRjaGVyLmpzXXtAbGluayBodHRwczovL2dpdGh1Yi5jb20vbXJkb29iL2V2ZW50ZGlzcGF0Y2hlci5qcy99XHJcbiAqXHJcbiAqIENvZGUgRXhhbXBsZTpcclxuICogYGBganNcclxuICogY2xhc3MgQ2FyIGV4dGVuZHMgRXZlbnREaXNwYXRjaGVyIHtcclxuICogXHRzdGFydCgpIHtcclxuICpcdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdzdGFydCcsIG1lc3NhZ2U6ICd2cm9vbSB2cm9vbSEnIH0gKTtcclxuICpcdH1cclxuICp9O1xyXG4gKlxyXG4gKiAvLyBVc2luZyBldmVudHMgd2l0aCB0aGUgY3VzdG9tIG9iamVjdFxyXG4gKiBjb25zdCBjYXIgPSBuZXcgQ2FyKCk7XHJcbiAqIGNhci5hZGRFdmVudExpc3RlbmVyKCAnc3RhcnQnLCBmdW5jdGlvbiAoIGV2ZW50ICkge1xyXG4gKiBcdGFsZXJ0KCBldmVudC5tZXNzYWdlICk7XHJcbiAqIH0gKTtcclxuICpcclxuICogY2FyLnN0YXJ0KCk7XHJcbiAqIGBgYFxyXG4gKi9cclxuY2xhc3MgRXZlbnREaXNwYXRjaGVyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyB0aGUgZ2l2ZW4gZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGdpdmVuIGV2ZW50IHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSB0eXBlIG9mIGV2ZW50IHRvIGxpc3RlbiB0by5cclxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciAtIFRoZSBmdW5jdGlvbiB0aGF0IGdldHMgY2FsbGVkIHdoZW4gdGhlIGV2ZW50IGlzIGZpcmVkLlxyXG5cdCAqL1xyXG5cdGFkZEV2ZW50TGlzdGVuZXIoIHR5cGUsIGxpc3RlbmVyICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5fbGlzdGVuZXJzID09PSB1bmRlZmluZWQgKSB0aGlzLl9saXN0ZW5lcnMgPSB7fTtcclxuXHJcblx0XHRjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnM7XHJcblxyXG5cdFx0aWYgKCBsaXN0ZW5lcnNbIHR5cGUgXSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0bGlzdGVuZXJzWyB0eXBlIF0gPSBbXTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBsaXN0ZW5lcnNbIHR5cGUgXS5pbmRleE9mKCBsaXN0ZW5lciApID09PSAtIDEgKSB7XHJcblxyXG5cdFx0XHRsaXN0ZW5lcnNbIHR5cGUgXS5wdXNoKCBsaXN0ZW5lciApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gZXZlbnQgbGlzdGVuZXIgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIGdpdmVuIGV2ZW50IHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSB0eXBlIG9mIGV2ZW50LlxyXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIC0gVGhlIGxpc3RlbmVyIHRvIGNoZWNrLlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGdpdmVuIGV2ZW50IGxpc3RlbmVyIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBnaXZlbiBldmVudCB0eXBlLlxyXG5cdCAqL1xyXG5cdGhhc0V2ZW50TGlzdGVuZXIoIHR5cGUsIGxpc3RlbmVyICkge1xyXG5cclxuXHRcdGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycztcclxuXHJcblx0XHRpZiAoIGxpc3RlbmVycyA9PT0gdW5kZWZpbmVkICkgcmV0dXJuIGZhbHNlO1xyXG5cclxuXHRcdHJldHVybiBsaXN0ZW5lcnNbIHR5cGUgXSAhPT0gdW5kZWZpbmVkICYmIGxpc3RlbmVyc1sgdHlwZSBdLmluZGV4T2YoIGxpc3RlbmVyICkgIT09IC0gMTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW1vdmVzIHRoZSBnaXZlbiBldmVudCBsaXN0ZW5lciBmcm9tIHRoZSBnaXZlbiBldmVudCB0eXBlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBUaGUgdHlwZSBvZiBldmVudC5cclxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciAtIFRoZSBsaXN0ZW5lciB0byByZW1vdmUuXHJcblx0ICovXHJcblx0cmVtb3ZlRXZlbnRMaXN0ZW5lciggdHlwZSwgbGlzdGVuZXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzO1xyXG5cclxuXHRcdGlmICggbGlzdGVuZXJzID09PSB1bmRlZmluZWQgKSByZXR1cm47XHJcblxyXG5cdFx0Y29uc3QgbGlzdGVuZXJBcnJheSA9IGxpc3RlbmVyc1sgdHlwZSBdO1xyXG5cclxuXHRcdGlmICggbGlzdGVuZXJBcnJheSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Y29uc3QgaW5kZXggPSBsaXN0ZW5lckFycmF5LmluZGV4T2YoIGxpc3RlbmVyICk7XHJcblxyXG5cdFx0XHRpZiAoIGluZGV4ICE9PSAtIDEgKSB7XHJcblxyXG5cdFx0XHRcdGxpc3RlbmVyQXJyYXkuc3BsaWNlKCBpbmRleCwgMSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEaXNwYXRjaGVzIGFuIGV2ZW50IG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBldmVudCAtIFRoZSBldmVudCB0aGF0IGdldHMgZmlyZWQuXHJcblx0ICovXHJcblx0ZGlzcGF0Y2hFdmVudCggZXZlbnQgKSB7XHJcblxyXG5cdFx0Y29uc3QgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzO1xyXG5cclxuXHRcdGlmICggbGlzdGVuZXJzID09PSB1bmRlZmluZWQgKSByZXR1cm47XHJcblxyXG5cdFx0Y29uc3QgbGlzdGVuZXJBcnJheSA9IGxpc3RlbmVyc1sgZXZlbnQudHlwZSBdO1xyXG5cclxuXHRcdGlmICggbGlzdGVuZXJBcnJheSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0ZXZlbnQudGFyZ2V0ID0gdGhpcztcclxuXHJcblx0XHRcdC8vIE1ha2UgYSBjb3B5LCBpbiBjYXNlIGxpc3RlbmVycyBhcmUgcmVtb3ZlZCB3aGlsZSBpdGVyYXRpbmcuXHJcblx0XHRcdGNvbnN0IGFycmF5ID0gbGlzdGVuZXJBcnJheS5zbGljZSggMCApO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gYXJyYXkubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0YXJyYXlbIGkgXS5jYWxsKCB0aGlzLCBldmVudCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZXZlbnQudGFyZ2V0ID0gbnVsbDtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBFdmVudERpc3BhdGNoZXIgfTtcclxuIiwiY29uc3QgX2x1dCA9IFsgJzAwJywgJzAxJywgJzAyJywgJzAzJywgJzA0JywgJzA1JywgJzA2JywgJzA3JywgJzA4JywgJzA5JywgJzBhJywgJzBiJywgJzBjJywgJzBkJywgJzBlJywgJzBmJywgJzEwJywgJzExJywgJzEyJywgJzEzJywgJzE0JywgJzE1JywgJzE2JywgJzE3JywgJzE4JywgJzE5JywgJzFhJywgJzFiJywgJzFjJywgJzFkJywgJzFlJywgJzFmJywgJzIwJywgJzIxJywgJzIyJywgJzIzJywgJzI0JywgJzI1JywgJzI2JywgJzI3JywgJzI4JywgJzI5JywgJzJhJywgJzJiJywgJzJjJywgJzJkJywgJzJlJywgJzJmJywgJzMwJywgJzMxJywgJzMyJywgJzMzJywgJzM0JywgJzM1JywgJzM2JywgJzM3JywgJzM4JywgJzM5JywgJzNhJywgJzNiJywgJzNjJywgJzNkJywgJzNlJywgJzNmJywgJzQwJywgJzQxJywgJzQyJywgJzQzJywgJzQ0JywgJzQ1JywgJzQ2JywgJzQ3JywgJzQ4JywgJzQ5JywgJzRhJywgJzRiJywgJzRjJywgJzRkJywgJzRlJywgJzRmJywgJzUwJywgJzUxJywgJzUyJywgJzUzJywgJzU0JywgJzU1JywgJzU2JywgJzU3JywgJzU4JywgJzU5JywgJzVhJywgJzViJywgJzVjJywgJzVkJywgJzVlJywgJzVmJywgJzYwJywgJzYxJywgJzYyJywgJzYzJywgJzY0JywgJzY1JywgJzY2JywgJzY3JywgJzY4JywgJzY5JywgJzZhJywgJzZiJywgJzZjJywgJzZkJywgJzZlJywgJzZmJywgJzcwJywgJzcxJywgJzcyJywgJzczJywgJzc0JywgJzc1JywgJzc2JywgJzc3JywgJzc4JywgJzc5JywgJzdhJywgJzdiJywgJzdjJywgJzdkJywgJzdlJywgJzdmJywgJzgwJywgJzgxJywgJzgyJywgJzgzJywgJzg0JywgJzg1JywgJzg2JywgJzg3JywgJzg4JywgJzg5JywgJzhhJywgJzhiJywgJzhjJywgJzhkJywgJzhlJywgJzhmJywgJzkwJywgJzkxJywgJzkyJywgJzkzJywgJzk0JywgJzk1JywgJzk2JywgJzk3JywgJzk4JywgJzk5JywgJzlhJywgJzliJywgJzljJywgJzlkJywgJzllJywgJzlmJywgJ2EwJywgJ2ExJywgJ2EyJywgJ2EzJywgJ2E0JywgJ2E1JywgJ2E2JywgJ2E3JywgJ2E4JywgJ2E5JywgJ2FhJywgJ2FiJywgJ2FjJywgJ2FkJywgJ2FlJywgJ2FmJywgJ2IwJywgJ2IxJywgJ2IyJywgJ2IzJywgJ2I0JywgJ2I1JywgJ2I2JywgJ2I3JywgJ2I4JywgJ2I5JywgJ2JhJywgJ2JiJywgJ2JjJywgJ2JkJywgJ2JlJywgJ2JmJywgJ2MwJywgJ2MxJywgJ2MyJywgJ2MzJywgJ2M0JywgJ2M1JywgJ2M2JywgJ2M3JywgJ2M4JywgJ2M5JywgJ2NhJywgJ2NiJywgJ2NjJywgJ2NkJywgJ2NlJywgJ2NmJywgJ2QwJywgJ2QxJywgJ2QyJywgJ2QzJywgJ2Q0JywgJ2Q1JywgJ2Q2JywgJ2Q3JywgJ2Q4JywgJ2Q5JywgJ2RhJywgJ2RiJywgJ2RjJywgJ2RkJywgJ2RlJywgJ2RmJywgJ2UwJywgJ2UxJywgJ2UyJywgJ2UzJywgJ2U0JywgJ2U1JywgJ2U2JywgJ2U3JywgJ2U4JywgJ2U5JywgJ2VhJywgJ2ViJywgJ2VjJywgJ2VkJywgJ2VlJywgJ2VmJywgJ2YwJywgJ2YxJywgJ2YyJywgJ2YzJywgJ2Y0JywgJ2Y1JywgJ2Y2JywgJ2Y3JywgJ2Y4JywgJ2Y5JywgJ2ZhJywgJ2ZiJywgJ2ZjJywgJ2ZkJywgJ2ZlJywgJ2ZmJyBdO1xyXG5cclxubGV0IF9zZWVkID0gMTIzNDU2NztcclxuXHJcblxyXG5jb25zdCBERUcyUkFEID0gTWF0aC5QSSAvIDE4MDtcclxuY29uc3QgUkFEMkRFRyA9IDE4MCAvIE1hdGguUEk7XHJcblxyXG4vKipcclxuICogR2VuZXJhdGUgYSBbVVVJRF17QGxpbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVW5pdmVyc2FsbHlfdW5pcXVlX2lkZW50aWZpZXJ9XHJcbiAqICh1bml2ZXJzYWxseSB1bmlxdWUgaWRlbnRpZmllcikuXHJcbiAqXHJcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIFVVSUQuXHJcbiAqL1xyXG5mdW5jdGlvbiBnZW5lcmF0ZVVVSUQoKSB7XHJcblxyXG5cdC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTA1MDM0L2hvdy10by1jcmVhdGUtYS1ndWlkLXV1aWQtaW4tamF2YXNjcmlwdC8yMTk2MzEzNiMyMTk2MzEzNlxyXG5cclxuXHRjb25zdCBkMCA9IE1hdGgucmFuZG9tKCkgKiAweGZmZmZmZmZmIHwgMDtcclxuXHRjb25zdCBkMSA9IE1hdGgucmFuZG9tKCkgKiAweGZmZmZmZmZmIHwgMDtcclxuXHRjb25zdCBkMiA9IE1hdGgucmFuZG9tKCkgKiAweGZmZmZmZmZmIHwgMDtcclxuXHRjb25zdCBkMyA9IE1hdGgucmFuZG9tKCkgKiAweGZmZmZmZmZmIHwgMDtcclxuXHRjb25zdCB1dWlkID0gX2x1dFsgZDAgJiAweGZmIF0gKyBfbHV0WyBkMCA+PiA4ICYgMHhmZiBdICsgX2x1dFsgZDAgPj4gMTYgJiAweGZmIF0gKyBfbHV0WyBkMCA+PiAyNCAmIDB4ZmYgXSArICctJyArXHJcblx0XHRcdF9sdXRbIGQxICYgMHhmZiBdICsgX2x1dFsgZDEgPj4gOCAmIDB4ZmYgXSArICctJyArIF9sdXRbIGQxID4+IDE2ICYgMHgwZiB8IDB4NDAgXSArIF9sdXRbIGQxID4+IDI0ICYgMHhmZiBdICsgJy0nICtcclxuXHRcdFx0X2x1dFsgZDIgJiAweDNmIHwgMHg4MCBdICsgX2x1dFsgZDIgPj4gOCAmIDB4ZmYgXSArICctJyArIF9sdXRbIGQyID4+IDE2ICYgMHhmZiBdICsgX2x1dFsgZDIgPj4gMjQgJiAweGZmIF0gK1xyXG5cdFx0XHRfbHV0WyBkMyAmIDB4ZmYgXSArIF9sdXRbIGQzID4+IDggJiAweGZmIF0gKyBfbHV0WyBkMyA+PiAxNiAmIDB4ZmYgXSArIF9sdXRbIGQzID4+IDI0ICYgMHhmZiBdO1xyXG5cclxuXHQvLyAudG9Mb3dlckNhc2UoKSBoZXJlIGZsYXR0ZW5zIGNvbmNhdGVuYXRlZCBzdHJpbmdzIHRvIHNhdmUgaGVhcCBtZW1vcnkgc3BhY2UuXHJcblx0cmV0dXJuIHV1aWQudG9Mb3dlckNhc2UoKTtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDbGFtcHMgdGhlIGdpdmVuIHZhbHVlIGJldHdlZW4gbWluIGFuZCBtYXguXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjbGFtcC5cclxuICogQHBhcmFtIHtudW1iZXJ9IG1pbiAtIFRoZSBtaW4gdmFsdWUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBtYXggLSBUaGUgbWF4IHZhbHVlLlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBjbGFtcGVkIHZhbHVlLlxyXG4gKi9cclxuZnVuY3Rpb24gY2xhbXAoIHZhbHVlLCBtaW4sIG1heCApIHtcclxuXHJcblx0cmV0dXJuIE1hdGgubWF4KCBtaW4sIE1hdGgubWluKCBtYXgsIHZhbHVlICkgKTtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb21wdXRlcyB0aGUgRXVjbGlkZWFuIG1vZHVsbyBvZiB0aGUgZ2l2ZW4gcGFyYW1ldGVycyB0aGF0XHJcbiAqIGlzIGAoICggbiAlIG0gKSArIG0gKSAlIG1gLlxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gbiAtIFRoZSBmaXJzdCBwYXJhbWV0ZXIuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBtIC0gVGhlIHNlY29uZCBwYXJhbWV0ZXIuXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIEV1Y2xpZGVhbiBtb2R1bG8uXHJcbiAqL1xyXG5mdW5jdGlvbiBldWNsaWRlYW5Nb2R1bG8oIG4sIG0gKSB7XHJcblxyXG5cdC8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL01vZHVsb19vcGVyYXRpb25cclxuXHJcblx0cmV0dXJuICggKCBuICUgbSApICsgbSApICUgbTtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBQZXJmb3JtcyBhIGxpbmVhciBtYXBwaW5nIGZyb20gcmFuZ2UgYDxhMSwgYTI+YCB0byByYW5nZSBgPGIxLCBiMj5gXHJcbiAqIGZvciB0aGUgZ2l2ZW4gdmFsdWUuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHZhbHVlIHRvIGJlIG1hcHBlZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGExIC0gTWluaW11bSB2YWx1ZSBmb3IgcmFuZ2UgQS5cclxuICogQHBhcmFtIHtudW1iZXJ9IGEyIC0gTWF4aW11bSB2YWx1ZSBmb3IgcmFuZ2UgQS5cclxuICogQHBhcmFtIHtudW1iZXJ9IGIxIC0gTWluaW11bSB2YWx1ZSBmb3IgcmFuZ2UgQi5cclxuICogQHBhcmFtIHtudW1iZXJ9IGIyIC0gTWF4aW11bSB2YWx1ZSBmb3IgcmFuZ2UgQi5cclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgbWFwcGVkIHZhbHVlLlxyXG4gKi9cclxuZnVuY3Rpb24gbWFwTGluZWFyKCB4LCBhMSwgYTIsIGIxLCBiMiApIHtcclxuXHJcblx0cmV0dXJuIGIxICsgKCB4IC0gYTEgKSAqICggYjIgLSBiMSApIC8gKCBhMiAtIGExICk7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgcGVyY2VudGFnZSBpbiB0aGUgY2xvc2VkIGludGVydmFsIGBbMCwgMV1gIG9mIHRoZSBnaXZlbiB2YWx1ZVxyXG4gKiBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIHBvaW50LlxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBzdGFydCBwb2ludFxyXG4gKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSBlbmQgcG9pbnQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIEEgdmFsdWUgYmV0d2VlbiBzdGFydCBhbmQgZW5kLlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBpbnRlcnBvbGF0aW9uIGZhY3Rvci5cclxuICovXHJcbmZ1bmN0aW9uIGludmVyc2VMZXJwKCB4LCB5LCB2YWx1ZSApIHtcclxuXHJcblx0Ly8gaHR0cHM6Ly93d3cuZ2FtZWRldi5uZXQvdHV0b3JpYWxzL3Byb2dyYW1taW5nL2dlbmVyYWwtYW5kLWdhbWVwbGF5LXByb2dyYW1taW5nL2ludmVyc2UtbGVycC1hLXN1cGVyLXVzZWZ1bC15ZXQtb2Z0ZW4tb3Zlcmxvb2tlZC1mdW5jdGlvbi1yNTIzMC9cclxuXHJcblx0aWYgKCB4ICE9PSB5ICkge1xyXG5cclxuXHRcdHJldHVybiAoIHZhbHVlIC0geCApIC8gKCB5IC0geCApO1xyXG5cclxuXHR9IGVsc2Uge1xyXG5cclxuXHRcdHJldHVybiAwO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIHZhbHVlIGxpbmVhcmx5IGludGVycG9sYXRlZCBmcm9tIHR3byBrbm93biBwb2ludHMgYmFzZWQgb24gdGhlIGdpdmVuIGludGVydmFsIC1cclxuICogYHQgPSAwYCB3aWxsIHJldHVybiBgeGAgYW5kIGB0ID0gMWAgd2lsbCByZXR1cm4gYHlgLlxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBzdGFydCBwb2ludFxyXG4gKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSBlbmQgcG9pbnQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB0IC0gVGhlIGludGVycG9sYXRpb24gZmFjdG9yIGluIHRoZSBjbG9zZWQgaW50ZXJ2YWwgYFswLCAxXWAuXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGludGVycG9sYXRlZCB2YWx1ZS5cclxuICovXHJcbmZ1bmN0aW9uIGxlcnAoIHgsIHksIHQgKSB7XHJcblxyXG5cdHJldHVybiAoIDEgLSB0ICkgKiB4ICsgdCAqIHk7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogU21vb3RobHkgaW50ZXJwb2xhdGUgYSBudW1iZXIgZnJvbSBgeGAgdG8gYHlgIGluICBhIHNwcmluZy1saWtlIG1hbm5lciB1c2luZyBhIGRlbHRhXHJcbiAqIHRpbWUgdG8gbWFpbnRhaW4gZnJhbWUgcmF0ZSBpbmRlcGVuZGVudCBtb3ZlbWVudC4gRm9yIGRldGFpbHMsIHNlZVxyXG4gKiBbRnJhbWUgcmF0ZSBpbmRlcGVuZGVudCBkYW1waW5nIHVzaW5nIGxlcnBde0BsaW5rIGh0dHA6Ly93d3cucm9yeWRyaXNjb2xsLmNvbS8yMDE2LzAzLzA3L2ZyYW1lLXJhdGUtaW5kZXBlbmRlbnQtZGFtcGluZy11c2luZy1sZXJwL30uXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGN1cnJlbnQgcG9pbnQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHRhcmdldCBwb2ludC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGxhbWJkYSAtIEEgaGlnaGVyIGxhbWJkYSB2YWx1ZSB3aWxsIG1ha2UgdGhlIG1vdmVtZW50IG1vcmUgc3VkZGVuLFxyXG4gKiBhbmQgYSBsb3dlciB2YWx1ZSB3aWxsIG1ha2UgdGhlIG1vdmVtZW50IG1vcmUgZ3JhZHVhbC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGR0IC0gRGVsdGEgdGltZSBpbiBzZWNvbmRzLlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBpbnRlcnBvbGF0ZWQgdmFsdWUuXHJcbiAqL1xyXG5mdW5jdGlvbiBkYW1wKCB4LCB5LCBsYW1iZGEsIGR0ICkge1xyXG5cclxuXHRyZXR1cm4gbGVycCggeCwgeSwgMSAtIE1hdGguZXhwKCAtIGxhbWJkYSAqIGR0ICkgKTtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgdmFsdWUgdGhhdCBhbHRlcm5hdGVzIGJldHdlZW4gYDBgIGFuZCB0aGUgZ2l2ZW4gYGxlbmd0aGAgcGFyYW1ldGVyLlxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB2YWx1ZSB0byBwaW5ncG9uZy5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9MV0gLSBUaGUgcG9zaXRpdmUgdmFsdWUgdGhlIGZ1bmN0aW9uIHdpbGwgcGluZ3BvbmcgdG8uXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGFsdGVybmF0ZWQgdmFsdWUuXHJcbiAqL1xyXG5mdW5jdGlvbiBwaW5ncG9uZyggeCwgbGVuZ3RoID0gMSApIHtcclxuXHJcblx0Ly8gaHR0cHM6Ly93d3cuZGVzbW9zLmNvbS9jYWxjdWxhdG9yL3Zjc2pueXo3eDRcclxuXHJcblx0cmV0dXJuIGxlbmd0aCAtIE1hdGguYWJzKCBldWNsaWRlYW5Nb2R1bG8oIHgsIGxlbmd0aCAqIDIgKSAtIGxlbmd0aCApO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSB2YWx1ZSBpbiB0aGUgcmFuZ2UgYFswLDFdYCB0aGF0IHJlcHJlc2VudHMgdGhlIHBlcmNlbnRhZ2UgdGhhdCBgeGAgaGFzXHJcbiAqIG1vdmVkIGJldHdlZW4gYG1pbmAgYW5kIGBtYXhgLCBidXQgc21vb3RoZWQgb3Igc2xvd2VkIGRvd24gdGhlIGNsb3NlciBgeGAgaXMgdG9cclxuICogdGhlIGBtaW5gIGFuZCBgbWF4YC5cclxuICpcclxuICogU2VlIFtTbW9vdGhzdGVwXXtAbGluayBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1Ntb290aHN0ZXB9IGZvciBtb3JlIGRldGFpbHMuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHZhbHVlIHRvIGV2YWx1YXRlIGJhc2VkIG9uIGl0cyBwb3NpdGlvbiBiZXR3ZWVuIG1pbiBhbmQgbWF4LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gbWluIC0gVGhlIG1pbiB2YWx1ZS4gQW55IHggdmFsdWUgYmVsb3cgbWluIHdpbGwgYmUgYDBgLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gbWF4IC0gVGhlIG1heCB2YWx1ZS4gQW55IHggdmFsdWUgYWJvdmUgbWF4IHdpbGwgYmUgYDFgLlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBhbHRlcm5hdGVkIHZhbHVlLlxyXG4gKi9cclxuZnVuY3Rpb24gc21vb3Roc3RlcCggeCwgbWluLCBtYXggKSB7XHJcblxyXG5cdGlmICggeCA8PSBtaW4gKSByZXR1cm4gMDtcclxuXHRpZiAoIHggPj0gbWF4ICkgcmV0dXJuIDE7XHJcblxyXG5cdHggPSAoIHggLSBtaW4gKSAvICggbWF4IC0gbWluICk7XHJcblxyXG5cdHJldHVybiB4ICogeCAqICggMyAtIDIgKiB4ICk7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQSBbdmFyaWF0aW9uIG9uIHNtb290aHN0ZXBde0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1Ntb290aHN0ZXAjVmFyaWF0aW9uc31cclxuICogdGhhdCBoYXMgemVybyAxc3QgYW5kIDJuZCBvcmRlciBkZXJpdmF0aXZlcyBhdCB4PTAgYW5kIHg9MS5cclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUgYmFzZWQgb24gaXRzIHBvc2l0aW9uIGJldHdlZW4gbWluIGFuZCBtYXguXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBtaW4gLSBUaGUgbWluIHZhbHVlLiBBbnkgeCB2YWx1ZSBiZWxvdyBtaW4gd2lsbCBiZSBgMGAuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBtYXggLSBUaGUgbWF4IHZhbHVlLiBBbnkgeCB2YWx1ZSBhYm92ZSBtYXggd2lsbCBiZSBgMWAuXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGFsdGVybmF0ZWQgdmFsdWUuXHJcbiAqL1xyXG5mdW5jdGlvbiBzbW9vdGhlcnN0ZXAoIHgsIG1pbiwgbWF4ICkge1xyXG5cclxuXHRpZiAoIHggPD0gbWluICkgcmV0dXJuIDA7XHJcblx0aWYgKCB4ID49IG1heCApIHJldHVybiAxO1xyXG5cclxuXHR4ID0gKCB4IC0gbWluICkgLyAoIG1heCAtIG1pbiApO1xyXG5cclxuXHRyZXR1cm4geCAqIHggKiB4ICogKCB4ICogKCB4ICogNiAtIDE1ICkgKyAxMCApO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSByYW5kb20gaW50ZWdlciBmcm9tIGA8bG93LCBoaWdoPmAgaW50ZXJ2YWwuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBsb3cgLSBUaGUgbG93ZXIgdmFsdWUgYm91bmRhcnkuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBoaWdoIC0gVGhlIHVwcGVyIHZhbHVlIGJvdW5kYXJ5XHJcbiAqIEByZXR1cm4ge251bWJlcn0gQSByYW5kb20gaW50ZWdlci5cclxuICovXHJcbmZ1bmN0aW9uIHJhbmRJbnQoIGxvdywgaGlnaCApIHtcclxuXHJcblx0cmV0dXJuIGxvdyArIE1hdGguZmxvb3IoIE1hdGgucmFuZG9tKCkgKiAoIGhpZ2ggLSBsb3cgKyAxICkgKTtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgcmFuZG9tIGZsb2F0IGZyb20gYDxsb3csIGhpZ2g+YCBpbnRlcnZhbC5cclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IGxvdyAtIFRoZSBsb3dlciB2YWx1ZSBib3VuZGFyeS5cclxuICogQHBhcmFtIHtudW1iZXJ9IGhpZ2ggLSBUaGUgdXBwZXIgdmFsdWUgYm91bmRhcnlcclxuICogQHJldHVybiB7bnVtYmVyfSBBIHJhbmRvbSBmbG9hdC5cclxuICovXHJcbmZ1bmN0aW9uIHJhbmRGbG9hdCggbG93LCBoaWdoICkge1xyXG5cclxuXHRyZXR1cm4gbG93ICsgTWF0aC5yYW5kb20oKSAqICggaGlnaCAtIGxvdyApO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSByYW5kb20gaW50ZWdlciBmcm9tIGA8LXJhbmdlLzIsIHJhbmdlLzI+YCBpbnRlcnZhbC5cclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHJhbmdlIC0gRGVmaW5lcyB0aGUgdmFsdWUgcmFuZ2UuXHJcbiAqIEByZXR1cm4ge251bWJlcn0gQSByYW5kb20gZmxvYXQuXHJcbiAqL1xyXG5mdW5jdGlvbiByYW5kRmxvYXRTcHJlYWQoIHJhbmdlICkge1xyXG5cclxuXHRyZXR1cm4gcmFuZ2UgKiAoIDAuNSAtIE1hdGgucmFuZG9tKCkgKTtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgZGV0ZXJtaW5pc3RpYyBwc2V1ZG8tcmFuZG9tIGZsb2F0IGluIHRoZSBpbnRlcnZhbCBgWzAsIDFdYC5cclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IFtzXSAtIFRoZSBpbnRlZ2VyIHNlZWQuXHJcbiAqIEByZXR1cm4ge251bWJlcn0gQSByYW5kb20gZmxvYXQuXHJcbiAqL1xyXG5mdW5jdGlvbiBzZWVkZWRSYW5kb20oIHMgKSB7XHJcblxyXG5cdGlmICggcyAhPT0gdW5kZWZpbmVkICkgX3NlZWQgPSBzO1xyXG5cclxuXHQvLyBNdWxiZXJyeTMyIGdlbmVyYXRvclxyXG5cclxuXHRsZXQgdCA9IF9zZWVkICs9IDB4NkQyQjc5RjU7XHJcblxyXG5cdHQgPSBNYXRoLmltdWwoIHQgXiB0ID4+PiAxNSwgdCB8IDEgKTtcclxuXHJcblx0dCBePSB0ICsgTWF0aC5pbXVsKCB0IF4gdCA+Pj4gNywgdCB8IDYxICk7XHJcblxyXG5cdHJldHVybiAoICggdCBeIHQgPj4+IDE0ICkgPj4+IDAgKSAvIDQyOTQ5NjcyOTY7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQ29udmVydHMgZGVncmVlcyB0byByYWRpYW5zLlxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gZGVncmVlcyAtIEEgdmFsdWUgaW4gZGVncmVlcy5cclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgY29udmVydGVkIHZhbHVlIGluIHJhZGlhbnMuXHJcbiAqL1xyXG5mdW5jdGlvbiBkZWdUb1JhZCggZGVncmVlcyApIHtcclxuXHJcblx0cmV0dXJuIGRlZ3JlZXMgKiBERUcyUkFEO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIENvbnZlcnRzIHJhZGlhbnMgdG8gZGVncmVlcy5cclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHJhZGlhbnMgLSBBIHZhbHVlIGluIHJhZGlhbnMuXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGNvbnZlcnRlZCB2YWx1ZSBpbiBkZWdyZWVzLlxyXG4gKi9cclxuZnVuY3Rpb24gcmFkVG9EZWcoIHJhZGlhbnMgKSB7XHJcblxyXG5cdHJldHVybiByYWRpYW5zICogUkFEMkRFRztcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gbnVtYmVyIGlzIGEgcG93ZXIgb2YgdHdvLlxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2suXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGdpdmVuIG51bWJlciBpcyBhIHBvd2VyIG9mIHR3byBvciBub3QuXHJcbiAqL1xyXG5mdW5jdGlvbiBpc1Bvd2VyT2ZUd28oIHZhbHVlICkge1xyXG5cclxuXHRyZXR1cm4gKCB2YWx1ZSAmICggdmFsdWUgLSAxICkgKSA9PT0gMCAmJiB2YWx1ZSAhPT0gMDtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBzbWFsbGVzdCBwb3dlciBvZiB0d28gdGhhdCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGdpdmVuIG51bWJlci5cclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIGZpbmQgYSBQT1QgZm9yLlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBzbWFsbGVzdCBwb3dlciBvZiB0d28gdGhhdCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGdpdmVuIG51bWJlci5cclxuICovXHJcbmZ1bmN0aW9uIGNlaWxQb3dlck9mVHdvKCB2YWx1ZSApIHtcclxuXHJcblx0cmV0dXJuIE1hdGgucG93KCAyLCBNYXRoLmNlaWwoIE1hdGgubG9nKCB2YWx1ZSApIC8gTWF0aC5MTjIgKSApO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIGxhcmdlc3QgcG93ZXIgb2YgdHdvIHRoYXQgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBnaXZlbiBudW1iZXIuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBmaW5kIGEgUE9UIGZvci5cclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgbGFyZ2VzdCBwb3dlciBvZiB0d28gdGhhdCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGdpdmVuIG51bWJlci5cclxuICovXHJcbmZ1bmN0aW9uIGZsb29yUG93ZXJPZlR3byggdmFsdWUgKSB7XHJcblxyXG5cdHJldHVybiBNYXRoLnBvdyggMiwgTWF0aC5mbG9vciggTWF0aC5sb2coIHZhbHVlICkgLyBNYXRoLkxOMiApICk7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogU2V0cyB0aGUgZ2l2ZW4gcXVhdGVybmlvbiBmcm9tIHRoZSBbSW50cmluc2ljIFByb3BlciBFdWxlciBBbmdsZXNde0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0V1bGVyX2FuZ2xlc31cclxuICogZGVmaW5lZCBieSB0aGUgZ2l2ZW4gYW5nbGVzIGFuZCBvcmRlci5cclxuICpcclxuICogUm90YXRpb25zIGFyZSBhcHBsaWVkIHRvIHRoZSBheGVzIGluIHRoZSBvcmRlciBzcGVjaWZpZWQgYnkgb3JkZXI6XHJcbiAqIHJvdGF0aW9uIGJ5IGFuZ2xlIGBhYCBpcyBhcHBsaWVkIGZpcnN0LCB0aGVuIGJ5IGFuZ2xlIGBiYCwgdGhlbiBieSBhbmdsZSBgY2AuXHJcbiAqXHJcbiAqIEBwYXJhbSB7UXVhdGVybmlvbn0gcSAtIFRoZSBxdWF0ZXJuaW9uIHRvIHNldC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGEgLSBUaGUgcm90YXRpb24gYXBwbGllZCB0byB0aGUgZmlyc3QgYXhpcywgaW4gcmFkaWFucy5cclxuICogQHBhcmFtIHtudW1iZXJ9IGIgLSBUaGUgcm90YXRpb24gYXBwbGllZCB0byB0aGUgc2Vjb25kIGF4aXMsIGluIHJhZGlhbnMuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBjIC0gVGhlIHJvdGF0aW9uIGFwcGxpZWQgdG8gdGhlIHRoaXJkIGF4aXMsIGluIHJhZGlhbnMuXHJcbiAqIEBwYXJhbSB7KCdYWVgnfCdYWlgnfCdZWFknfCdZWlknfCdaWFonfCdaWVonKX0gb3JkZXIgLSBBIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSBheGVzIG9yZGVyLlxyXG4gKi9cclxuZnVuY3Rpb24gc2V0UXVhdGVybmlvbkZyb21Qcm9wZXJFdWxlciggcSwgYSwgYiwgYywgb3JkZXIgKSB7XHJcblxyXG5cdGNvbnN0IGNvcyA9IE1hdGguY29zO1xyXG5cdGNvbnN0IHNpbiA9IE1hdGguc2luO1xyXG5cclxuXHRjb25zdCBjMiA9IGNvcyggYiAvIDIgKTtcclxuXHRjb25zdCBzMiA9IHNpbiggYiAvIDIgKTtcclxuXHJcblx0Y29uc3QgYzEzID0gY29zKCAoIGEgKyBjICkgLyAyICk7XHJcblx0Y29uc3QgczEzID0gc2luKCAoIGEgKyBjICkgLyAyICk7XHJcblxyXG5cdGNvbnN0IGMxXzMgPSBjb3MoICggYSAtIGMgKSAvIDIgKTtcclxuXHRjb25zdCBzMV8zID0gc2luKCAoIGEgLSBjICkgLyAyICk7XHJcblxyXG5cdGNvbnN0IGMzXzEgPSBjb3MoICggYyAtIGEgKSAvIDIgKTtcclxuXHRjb25zdCBzM18xID0gc2luKCAoIGMgLSBhICkgLyAyICk7XHJcblxyXG5cdHN3aXRjaCAoIG9yZGVyICkge1xyXG5cclxuXHRcdGNhc2UgJ1hZWCc6XHJcblx0XHRcdHEuc2V0KCBjMiAqIHMxMywgczIgKiBjMV8zLCBzMiAqIHMxXzMsIGMyICogYzEzICk7XHJcblx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdGNhc2UgJ1laWSc6XHJcblx0XHRcdHEuc2V0KCBzMiAqIHMxXzMsIGMyICogczEzLCBzMiAqIGMxXzMsIGMyICogYzEzICk7XHJcblx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdGNhc2UgJ1pYWic6XHJcblx0XHRcdHEuc2V0KCBzMiAqIGMxXzMsIHMyICogczFfMywgYzIgKiBzMTMsIGMyICogYzEzICk7XHJcblx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdGNhc2UgJ1haWCc6XHJcblx0XHRcdHEuc2V0KCBjMiAqIHMxMywgczIgKiBzM18xLCBzMiAqIGMzXzEsIGMyICogYzEzICk7XHJcblx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdGNhc2UgJ1lYWSc6XHJcblx0XHRcdHEuc2V0KCBzMiAqIGMzXzEsIGMyICogczEzLCBzMiAqIHMzXzEsIGMyICogYzEzICk7XHJcblx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdGNhc2UgJ1pZWic6XHJcblx0XHRcdHEuc2V0KCBzMiAqIHMzXzEsIHMyICogYzNfMSwgYzIgKiBzMTMsIGMyICogYzEzICk7XHJcblx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdGRlZmF1bHQ6XHJcblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdGhVdGlsczogLnNldFF1YXRlcm5pb25Gcm9tUHJvcGVyRXVsZXIoKSBlbmNvdW50ZXJlZCBhbiB1bmtub3duIG9yZGVyOiAnICsgb3JkZXIgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIERlbm9ybWFsaXplcyB0aGUgZ2l2ZW4gdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiB0eXBlZCBhcnJheS5cclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIGRlbm9ybWFsaXplLlxyXG4gKiBAcGFyYW0ge1R5cGVkQXJyYXl9IGFycmF5IC0gVGhlIHR5cGVkIGFycmF5IHRoYXQgZGVmaW5lcyB0aGUgZGF0YSB0eXBlIG9mIHRoZSB2YWx1ZS5cclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgZGVub3JtYWxpemUgKGZsb2F0KSB2YWx1ZSBpbiB0aGUgcmFuZ2UgYFswLDFdYC5cclxuICovXHJcbmZ1bmN0aW9uIGRlbm9ybWFsaXplKCB2YWx1ZSwgYXJyYXkgKSB7XHJcblxyXG5cdHN3aXRjaCAoIGFycmF5LmNvbnN0cnVjdG9yICkge1xyXG5cclxuXHRcdGNhc2UgRmxvYXQzMkFycmF5OlxyXG5cclxuXHRcdFx0cmV0dXJuIHZhbHVlO1xyXG5cclxuXHRcdGNhc2UgVWludDMyQXJyYXk6XHJcblxyXG5cdFx0XHRyZXR1cm4gdmFsdWUgLyA0Mjk0OTY3Mjk1LjA7XHJcblxyXG5cdFx0Y2FzZSBVaW50MTZBcnJheTpcclxuXHJcblx0XHRcdHJldHVybiB2YWx1ZSAvIDY1NTM1LjA7XHJcblxyXG5cdFx0Y2FzZSBVaW50OEFycmF5OlxyXG5cclxuXHRcdFx0cmV0dXJuIHZhbHVlIC8gMjU1LjA7XHJcblxyXG5cdFx0Y2FzZSBJbnQzMkFycmF5OlxyXG5cclxuXHRcdFx0cmV0dXJuIE1hdGgubWF4KCB2YWx1ZSAvIDIxNDc0ODM2NDcuMCwgLSAxLjAgKTtcclxuXHJcblx0XHRjYXNlIEludDE2QXJyYXk6XHJcblxyXG5cdFx0XHRyZXR1cm4gTWF0aC5tYXgoIHZhbHVlIC8gMzI3NjcuMCwgLSAxLjAgKTtcclxuXHJcblx0XHRjYXNlIEludDhBcnJheTpcclxuXHJcblx0XHRcdHJldHVybiBNYXRoLm1heCggdmFsdWUgLyAxMjcuMCwgLSAxLjAgKTtcclxuXHJcblx0XHRkZWZhdWx0OlxyXG5cclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnSW52YWxpZCBjb21wb25lbnQgdHlwZS4nICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBOb3JtYWxpemVzIHRoZSBnaXZlbiB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHR5cGVkIGFycmF5LlxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgZmxvYXQgdmFsdWUgaW4gdGhlIHJhbmdlIGBbMCwxXWAgdG8gbm9ybWFsaXplLlxyXG4gKiBAcGFyYW0ge1R5cGVkQXJyYXl9IGFycmF5IC0gVGhlIHR5cGVkIGFycmF5IHRoYXQgZGVmaW5lcyB0aGUgZGF0YSB0eXBlIG9mIHRoZSB2YWx1ZS5cclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgbm9ybWFsaXplIHZhbHVlLlxyXG4gKi9cclxuZnVuY3Rpb24gbm9ybWFsaXplKCB2YWx1ZSwgYXJyYXkgKSB7XHJcblxyXG5cdHN3aXRjaCAoIGFycmF5LmNvbnN0cnVjdG9yICkge1xyXG5cclxuXHRcdGNhc2UgRmxvYXQzMkFycmF5OlxyXG5cclxuXHRcdFx0cmV0dXJuIHZhbHVlO1xyXG5cclxuXHRcdGNhc2UgVWludDMyQXJyYXk6XHJcblxyXG5cdFx0XHRyZXR1cm4gTWF0aC5yb3VuZCggdmFsdWUgKiA0Mjk0OTY3Mjk1LjAgKTtcclxuXHJcblx0XHRjYXNlIFVpbnQxNkFycmF5OlxyXG5cclxuXHRcdFx0cmV0dXJuIE1hdGgucm91bmQoIHZhbHVlICogNjU1MzUuMCApO1xyXG5cclxuXHRcdGNhc2UgVWludDhBcnJheTpcclxuXHJcblx0XHRcdHJldHVybiBNYXRoLnJvdW5kKCB2YWx1ZSAqIDI1NS4wICk7XHJcblxyXG5cdFx0Y2FzZSBJbnQzMkFycmF5OlxyXG5cclxuXHRcdFx0cmV0dXJuIE1hdGgucm91bmQoIHZhbHVlICogMjE0NzQ4MzY0Ny4wICk7XHJcblxyXG5cdFx0Y2FzZSBJbnQxNkFycmF5OlxyXG5cclxuXHRcdFx0cmV0dXJuIE1hdGgucm91bmQoIHZhbHVlICogMzI3NjcuMCApO1xyXG5cclxuXHRcdGNhc2UgSW50OEFycmF5OlxyXG5cclxuXHRcdFx0cmV0dXJuIE1hdGgucm91bmQoIHZhbHVlICogMTI3LjAgKTtcclxuXHJcblx0XHRkZWZhdWx0OlxyXG5cclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnSW52YWxpZCBjb21wb25lbnQgdHlwZS4nICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAY2xhc3NcclxuICogQGNsYXNzZGVzYyBBIGNvbGxlY3Rpb24gb2YgbWF0aCB1dGlsaXR5IGZ1bmN0aW9ucy5cclxuICogQGhpZGVjb25zdHJ1Y3RvclxyXG4gKi9cclxuY29uc3QgTWF0aFV0aWxzID0ge1xyXG5cdERFRzJSQUQ6IERFRzJSQUQsXHJcblx0UkFEMkRFRzogUkFEMkRFRyxcclxuXHQvKipcclxuXHQgKiBHZW5lcmF0ZSBhIFtVVUlEXXtAbGluayBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Vbml2ZXJzYWxseV91bmlxdWVfaWRlbnRpZmllcn1cclxuXHQgKiAodW5pdmVyc2FsbHkgdW5pcXVlIGlkZW50aWZpZXIpLlxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEBtZXRob2RcclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBVVUlELlxyXG5cdCAqL1xyXG5cdGdlbmVyYXRlVVVJRDogZ2VuZXJhdGVVVUlELFxyXG5cdC8qKlxyXG5cdCAqIENsYW1wcyB0aGUgZ2l2ZW4gdmFsdWUgYmV0d2VlbiBtaW4gYW5kIG1heC5cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAbWV0aG9kXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNsYW1wLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBtaW4gLSBUaGUgbWluIHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBtYXggLSBUaGUgbWF4IHZhbHVlLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGNsYW1wZWQgdmFsdWUuXHJcblx0ICovXHJcblx0Y2xhbXA6IGNsYW1wLFxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSBFdWNsaWRlYW4gbW9kdWxvIG9mIHRoZSBnaXZlbiBwYXJhbWV0ZXJzIHRoYXRcclxuXHQgKiBpcyBgKCAoIG4gJSBtICkgKyBtICkgJSBtYC5cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAbWV0aG9kXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IG4gLSBUaGUgZmlyc3QgcGFyYW1ldGVyLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBtIC0gVGhlIHNlY29uZCBwYXJhbWV0ZXIuXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgRXVjbGlkZWFuIG1vZHVsby5cclxuXHQgKi9cclxuXHRldWNsaWRlYW5Nb2R1bG86IGV1Y2xpZGVhbk1vZHVsbyxcclxuXHQvKipcclxuXHQgKiBQZXJmb3JtcyBhIGxpbmVhciBtYXBwaW5nIGZyb20gcmFuZ2UgYDxhMSwgYTI+YCB0byByYW5nZSBgPGIxLCBiMj5gXHJcblx0ICogZm9yIHRoZSBnaXZlbiB2YWx1ZS5cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAbWV0aG9kXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgdmFsdWUgdG8gYmUgbWFwcGVkLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhMSAtIE1pbmltdW0gdmFsdWUgZm9yIHJhbmdlIEEuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGEyIC0gTWF4aW11bSB2YWx1ZSBmb3IgcmFuZ2UgQS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYjEgLSBNaW5pbXVtIHZhbHVlIGZvciByYW5nZSBCLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBiMiAtIE1heGltdW0gdmFsdWUgZm9yIHJhbmdlIEIuXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgbWFwcGVkIHZhbHVlLlxyXG5cdCAqL1xyXG5cdG1hcExpbmVhcjogbWFwTGluZWFyLFxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHBlcmNlbnRhZ2UgaW4gdGhlIGNsb3NlZCBpbnRlcnZhbCBgWzAsIDFdYCBvZiB0aGUgZ2l2ZW4gdmFsdWVcclxuXHQgKiBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIHBvaW50LlxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEBtZXRob2RcclxuXHQgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBzdGFydCBwb2ludFxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIGVuZCBwb2ludC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBBIHZhbHVlIGJldHdlZW4gc3RhcnQgYW5kIGVuZC5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBpbnRlcnBvbGF0aW9uIGZhY3Rvci5cclxuXHQgKi9cclxuXHRpbnZlcnNlTGVycDogaW52ZXJzZUxlcnAsXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIHZhbHVlIGxpbmVhcmx5IGludGVycG9sYXRlZCBmcm9tIHR3byBrbm93biBwb2ludHMgYmFzZWQgb24gdGhlIGdpdmVuIGludGVydmFsIC1cclxuXHQgKiBgdCA9IDBgIHdpbGwgcmV0dXJuIGB4YCBhbmQgYHQgPSAxYCB3aWxsIHJldHVybiBgeWAuXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQG1ldGhvZFxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHN0YXJ0IHBvaW50XHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgZW5kIHBvaW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0IC0gVGhlIGludGVycG9sYXRpb24gZmFjdG9yIGluIHRoZSBjbG9zZWQgaW50ZXJ2YWwgYFswLCAxXWAuXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgaW50ZXJwb2xhdGVkIHZhbHVlLlxyXG5cdCAqL1xyXG5cdGxlcnA6IGxlcnAsXHJcblx0LyoqXHJcblx0ICogU21vb3RobHkgaW50ZXJwb2xhdGUgYSBudW1iZXIgZnJvbSBgeGAgdG8gYHlgIGluICBhIHNwcmluZy1saWtlIG1hbm5lciB1c2luZyBhIGRlbHRhXHJcblx0ICogdGltZSB0byBtYWludGFpbiBmcmFtZSByYXRlIGluZGVwZW5kZW50IG1vdmVtZW50LiBGb3IgZGV0YWlscywgc2VlXHJcblx0ICogW0ZyYW1lIHJhdGUgaW5kZXBlbmRlbnQgZGFtcGluZyB1c2luZyBsZXJwXXtAbGluayBodHRwOi8vd3d3LnJvcnlkcmlzY29sbC5jb20vMjAxNi8wMy8wNy9mcmFtZS1yYXRlLWluZGVwZW5kZW50LWRhbXBpbmctdXNpbmctbGVycC99LlxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEBtZXRob2RcclxuXHQgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBjdXJyZW50IHBvaW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHRhcmdldCBwb2ludC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbGFtYmRhIC0gQSBoaWdoZXIgbGFtYmRhIHZhbHVlIHdpbGwgbWFrZSB0aGUgbW92ZW1lbnQgbW9yZSBzdWRkZW4sXHJcblx0ICogYW5kIGEgbG93ZXIgdmFsdWUgd2lsbCBtYWtlIHRoZSBtb3ZlbWVudCBtb3JlIGdyYWR1YWwuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGR0IC0gRGVsdGEgdGltZSBpbiBzZWNvbmRzLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGludGVycG9sYXRlZCB2YWx1ZS5cclxuXHQgKi9cclxuXHRkYW1wOiBkYW1wLFxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSB2YWx1ZSB0aGF0IGFsdGVybmF0ZXMgYmV0d2VlbiBgMGAgYW5kIHRoZSBnaXZlbiBgbGVuZ3RoYCBwYXJhbWV0ZXIuXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQG1ldGhvZFxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHZhbHVlIHRvIHBpbmdwb25nLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPTFdIC0gVGhlIHBvc2l0aXZlIHZhbHVlIHRoZSBmdW5jdGlvbiB3aWxsIHBpbmdwb25nIHRvLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGFsdGVybmF0ZWQgdmFsdWUuXHJcblx0ICovXHJcblx0cGluZ3Bvbmc6IHBpbmdwb25nLFxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSB2YWx1ZSBpbiB0aGUgcmFuZ2UgYFswLDFdYCB0aGF0IHJlcHJlc2VudHMgdGhlIHBlcmNlbnRhZ2UgdGhhdCBgeGAgaGFzXHJcblx0ICogbW92ZWQgYmV0d2VlbiBgbWluYCBhbmQgYG1heGAsIGJ1dCBzbW9vdGhlZCBvciBzbG93ZWQgZG93biB0aGUgY2xvc2VyIGB4YCBpcyB0b1xyXG5cdCAqIHRoZSBgbWluYCBhbmQgYG1heGAuXHJcblx0ICpcclxuXHQgKiBTZWUgW1Ntb290aHN0ZXBde0BsaW5rIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU21vb3Roc3RlcH0gZm9yIG1vcmUgZGV0YWlscy5cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAbWV0aG9kXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUgYmFzZWQgb24gaXRzIHBvc2l0aW9uIGJldHdlZW4gbWluIGFuZCBtYXguXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IG1pbiAtIFRoZSBtaW4gdmFsdWUuIEFueSB4IHZhbHVlIGJlbG93IG1pbiB3aWxsIGJlIGAwYC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbWF4IC0gVGhlIG1heCB2YWx1ZS4gQW55IHggdmFsdWUgYWJvdmUgbWF4IHdpbGwgYmUgYDFgLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGFsdGVybmF0ZWQgdmFsdWUuXHJcblx0ICovXHJcblx0c21vb3Roc3RlcDogc21vb3Roc3RlcCxcclxuXHQvKipcclxuXHQgKiBBIFt2YXJpYXRpb24gb24gc21vb3Roc3RlcF17QGxpbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU21vb3Roc3RlcCNWYXJpYXRpb25zfVxyXG5cdCAqIHRoYXQgaGFzIHplcm8gMXN0IGFuZCAybmQgb3JkZXIgZGVyaXZhdGl2ZXMgYXQgeD0wIGFuZCB4PTEuXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQG1ldGhvZFxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHZhbHVlIHRvIGV2YWx1YXRlIGJhc2VkIG9uIGl0cyBwb3NpdGlvbiBiZXR3ZWVuIG1pbiBhbmQgbWF4LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBtaW4gLSBUaGUgbWluIHZhbHVlLiBBbnkgeCB2YWx1ZSBiZWxvdyBtaW4gd2lsbCBiZSBgMGAuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IG1heCAtIFRoZSBtYXggdmFsdWUuIEFueSB4IHZhbHVlIGFib3ZlIG1heCB3aWxsIGJlIGAxYC5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBhbHRlcm5hdGVkIHZhbHVlLlxyXG5cdCAqL1xyXG5cdHNtb290aGVyc3RlcDogc21vb3RoZXJzdGVwLFxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSByYW5kb20gaW50ZWdlciBmcm9tIGA8bG93LCBoaWdoPmAgaW50ZXJ2YWwuXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQG1ldGhvZFxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBsb3cgLSBUaGUgbG93ZXIgdmFsdWUgYm91bmRhcnkuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGhpZ2ggLSBUaGUgdXBwZXIgdmFsdWUgYm91bmRhcnlcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IEEgcmFuZG9tIGludGVnZXIuXHJcblx0ICovXHJcblx0cmFuZEludDogcmFuZEludCxcclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgcmFuZG9tIGZsb2F0IGZyb20gYDxsb3csIGhpZ2g+YCBpbnRlcnZhbC5cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAbWV0aG9kXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGxvdyAtIFRoZSBsb3dlciB2YWx1ZSBib3VuZGFyeS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaGlnaCAtIFRoZSB1cHBlciB2YWx1ZSBib3VuZGFyeVxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gQSByYW5kb20gZmxvYXQuXHJcblx0ICovXHJcblx0cmFuZEZsb2F0OiByYW5kRmxvYXQsXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIHJhbmRvbSBpbnRlZ2VyIGZyb20gYDwtcmFuZ2UvMiwgcmFuZ2UvMj5gIGludGVydmFsLlxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEBtZXRob2RcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gcmFuZ2UgLSBEZWZpbmVzIHRoZSB2YWx1ZSByYW5nZS5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IEEgcmFuZG9tIGZsb2F0LlxyXG5cdCAqL1xyXG5cdHJhbmRGbG9hdFNwcmVhZDogcmFuZEZsb2F0U3ByZWFkLFxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBkZXRlcm1pbmlzdGljIHBzZXVkby1yYW5kb20gZmxvYXQgaW4gdGhlIGludGVydmFsIGBbMCwgMV1gLlxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEBtZXRob2RcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3NdIC0gVGhlIGludGVnZXIgc2VlZC5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IEEgcmFuZG9tIGZsb2F0LlxyXG5cdCAqL1xyXG5cdHNlZWRlZFJhbmRvbTogc2VlZGVkUmFuZG9tLFxyXG5cdC8qKlxyXG5cdCAqIENvbnZlcnRzIGRlZ3JlZXMgdG8gcmFkaWFucy5cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAbWV0aG9kXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGRlZ3JlZXMgLSBBIHZhbHVlIGluIGRlZ3JlZXMuXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgY29udmVydGVkIHZhbHVlIGluIHJhZGlhbnMuXHJcblx0ICovXHJcblx0ZGVnVG9SYWQ6IGRlZ1RvUmFkLFxyXG5cdC8qKlxyXG5cdCAqIENvbnZlcnRzIHJhZGlhbnMgdG8gZGVncmVlcy5cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAbWV0aG9kXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHJhZGlhbnMgLSBBIHZhbHVlIGluIHJhZGlhbnMuXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgY29udmVydGVkIHZhbHVlIGluIGRlZ3JlZXMuXHJcblx0ICovXHJcblx0cmFkVG9EZWc6IHJhZFRvRGVnLFxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBnaXZlbiBudW1iZXIgaXMgYSBwb3dlciBvZiB0d28uXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQG1ldGhvZFxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVjay5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBnaXZlbiBudW1iZXIgaXMgYSBwb3dlciBvZiB0d28gb3Igbm90LlxyXG5cdCAqL1xyXG5cdGlzUG93ZXJPZlR3bzogaXNQb3dlck9mVHdvLFxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHNtYWxsZXN0IHBvd2VyIG9mIHR3byB0aGF0IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgZ2l2ZW4gbnVtYmVyLlxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEBtZXRob2RcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gZmluZCBhIFBPVCBmb3IuXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgc21hbGxlc3QgcG93ZXIgb2YgdHdvIHRoYXQgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBnaXZlbiBudW1iZXIuXHJcblx0ICovXHJcblx0Y2VpbFBvd2VyT2ZUd286IGNlaWxQb3dlck9mVHdvLFxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGxhcmdlc3QgcG93ZXIgb2YgdHdvIHRoYXQgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBnaXZlbiBudW1iZXIuXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQG1ldGhvZFxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBmaW5kIGEgUE9UIGZvci5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBsYXJnZXN0IHBvd2VyIG9mIHR3byB0aGF0IGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgZ2l2ZW4gbnVtYmVyLlxyXG5cdCAqL1xyXG5cdGZsb29yUG93ZXJPZlR3bzogZmxvb3JQb3dlck9mVHdvLFxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGdpdmVuIHF1YXRlcm5pb24gZnJvbSB0aGUgW0ludHJpbnNpYyBQcm9wZXIgRXVsZXIgQW5nbGVzXXtAbGluayBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FdWxlcl9hbmdsZXN9XHJcblx0ICogZGVmaW5lZCBieSB0aGUgZ2l2ZW4gYW5nbGVzIGFuZCBvcmRlci5cclxuXHQgKlxyXG5cdCAqIFJvdGF0aW9ucyBhcmUgYXBwbGllZCB0byB0aGUgYXhlcyBpbiB0aGUgb3JkZXIgc3BlY2lmaWVkIGJ5IG9yZGVyOlxyXG5cdCAqIHJvdGF0aW9uIGJ5IGFuZ2xlIGBhYCBpcyBhcHBsaWVkIGZpcnN0LCB0aGVuIGJ5IGFuZ2xlIGBiYCwgdGhlbiBieSBhbmdsZSBgY2AuXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQG1ldGhvZFxyXG5cdCAqIEBwYXJhbSB7UXVhdGVybmlvbn0gcSAtIFRoZSBxdWF0ZXJuaW9uIHRvIHNldC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYSAtIFRoZSByb3RhdGlvbiBhcHBsaWVkIHRvIHRoZSBmaXJzdCBheGlzLCBpbiByYWRpYW5zLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBiIC0gVGhlIHJvdGF0aW9uIGFwcGxpZWQgdG8gdGhlIHNlY29uZCBheGlzLCBpbiByYWRpYW5zLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBjIC0gVGhlIHJvdGF0aW9uIGFwcGxpZWQgdG8gdGhlIHRoaXJkIGF4aXMsIGluIHJhZGlhbnMuXHJcblx0ICogQHBhcmFtIHsoJ1hZWCd8J1haWCd8J1lYWSd8J1laWSd8J1pYWid8J1pZWicpfSBvcmRlciAtIEEgc3RyaW5nIHNwZWNpZnlpbmcgdGhlIGF4ZXMgb3JkZXIuXHJcblx0ICovXHJcblx0c2V0UXVhdGVybmlvbkZyb21Qcm9wZXJFdWxlcjogc2V0UXVhdGVybmlvbkZyb21Qcm9wZXJFdWxlcixcclxuXHQvKipcclxuXHQgKiBOb3JtYWxpemVzIHRoZSBnaXZlbiB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHR5cGVkIGFycmF5LlxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEBtZXRob2RcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgZmxvYXQgdmFsdWUgaW4gdGhlIHJhbmdlIGBbMCwxXWAgdG8gbm9ybWFsaXplLlxyXG5cdCAqIEBwYXJhbSB7VHlwZWRBcnJheX0gYXJyYXkgLSBUaGUgdHlwZWQgYXJyYXkgdGhhdCBkZWZpbmVzIHRoZSBkYXRhIHR5cGUgb2YgdGhlIHZhbHVlLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIG5vcm1hbGl6ZSB2YWx1ZS5cclxuXHQgKi9cclxuXHRub3JtYWxpemU6IG5vcm1hbGl6ZSxcclxuXHQvKipcclxuXHQgKiBEZW5vcm1hbGl6ZXMgdGhlIGdpdmVuIHZhbHVlIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gdHlwZWQgYXJyYXkuXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQG1ldGhvZFxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBkZW5vcm1hbGl6ZS5cclxuXHQgKiBAcGFyYW0ge1R5cGVkQXJyYXl9IGFycmF5IC0gVGhlIHR5cGVkIGFycmF5IHRoYXQgZGVmaW5lcyB0aGUgZGF0YSB0eXBlIG9mIHRoZSB2YWx1ZS5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBkZW5vcm1hbGl6ZSAoZmxvYXQpIHZhbHVlIGluIHRoZSByYW5nZSBgWzAsMV1gLlxyXG5cdCAqL1xyXG5cdGRlbm9ybWFsaXplOiBkZW5vcm1hbGl6ZVxyXG59O1xyXG5cclxuZXhwb3J0IHtcclxuXHRERUcyUkFELFxyXG5cdFJBRDJERUcsXHJcblx0Z2VuZXJhdGVVVUlELFxyXG5cdGNsYW1wLFxyXG5cdGV1Y2xpZGVhbk1vZHVsbyxcclxuXHRtYXBMaW5lYXIsXHJcblx0aW52ZXJzZUxlcnAsXHJcblx0bGVycCxcclxuXHRkYW1wLFxyXG5cdHBpbmdwb25nLFxyXG5cdHNtb290aHN0ZXAsXHJcblx0c21vb3RoZXJzdGVwLFxyXG5cdHJhbmRJbnQsXHJcblx0cmFuZEZsb2F0LFxyXG5cdHJhbmRGbG9hdFNwcmVhZCxcclxuXHRzZWVkZWRSYW5kb20sXHJcblx0ZGVnVG9SYWQsXHJcblx0cmFkVG9EZWcsXHJcblx0aXNQb3dlck9mVHdvLFxyXG5cdGNlaWxQb3dlck9mVHdvLFxyXG5cdGZsb29yUG93ZXJPZlR3byxcclxuXHRzZXRRdWF0ZXJuaW9uRnJvbVByb3BlckV1bGVyLFxyXG5cdG5vcm1hbGl6ZSxcclxuXHRkZW5vcm1hbGl6ZSxcclxuXHRNYXRoVXRpbHNcclxufTtcclxuIiwiaW1wb3J0IHsgY2xhbXAgfSBmcm9tICcuL01hdGhVdGlscy5qcyc7XHJcblxyXG4vKipcclxuICogQ2xhc3MgcmVwcmVzZW50aW5nIGEgMkQgdmVjdG9yLiBBIDJEIHZlY3RvciBpcyBhbiBvcmRlcmVkIHBhaXIgb2YgbnVtYmVyc1xyXG4gKiAobGFiZWxlZCB4IGFuZCB5KSwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gcmVwcmVzZW50IGEgbnVtYmVyIG9mIHRoaW5ncywgc3VjaCBhczpcclxuICpcclxuICogLSBBIHBvaW50IGluIDJEIHNwYWNlIChpLmUuIGEgcG9zaXRpb24gb24gYSBwbGFuZSkuXHJcbiAqIC0gQSBkaXJlY3Rpb24gYW5kIGxlbmd0aCBhY3Jvc3MgYSBwbGFuZS4gSW4gdGhyZWUuanMgdGhlIGxlbmd0aCB3aWxsXHJcbiAqIGFsd2F5cyBiZSB0aGUgRXVjbGlkZWFuIGRpc3RhbmNlKHN0cmFpZ2h0LWxpbmUgZGlzdGFuY2UpIGZyb20gYCgwLCAwKWAgdG8gYCh4LCB5KWBcclxuICogYW5kIHRoZSBkaXJlY3Rpb24gaXMgYWxzbyBtZWFzdXJlZCBmcm9tIGAoMCwgMClgIHRvd2FyZHMgYCh4LCB5KWAuXHJcbiAqIC0gQW55IGFyYml0cmFyeSBvcmRlcmVkIHBhaXIgb2YgbnVtYmVycy5cclxuICpcclxuICogVGhlcmUgYXJlIG90aGVyIHRoaW5ncyBhIDJEIHZlY3RvciBjYW4gYmUgdXNlZCB0byByZXByZXNlbnQsIHN1Y2ggYXNcclxuICogbW9tZW50dW0gdmVjdG9ycywgY29tcGxleCBudW1iZXJzIGFuZCBzbyBvbiwgaG93ZXZlciB0aGVzZSBhcmUgdGhlIG1vc3RcclxuICogY29tbW9uIHVzZXMgaW4gdGhyZWUuanMuXHJcbiAqXHJcbiAqIEl0ZXJhdGluZyB0aHJvdWdoIGEgdmVjdG9yIGluc3RhbmNlIHdpbGwgeWllbGQgaXRzIGNvbXBvbmVudHMgYCh4LCB5KWAgaW5cclxuICogdGhlIGNvcnJlc3BvbmRpbmcgb3JkZXIuXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGEgPSBuZXcgVEhSRUUuVmVjdG9yMiggMCwgMSApO1xyXG4gKlxyXG4gKiAvL25vIGFyZ3VtZW50czsgd2lsbCBiZSBpbml0aWFsaXNlZCB0byAoMCwgMClcclxuICogY29uc3QgYiA9IG5ldyBUSFJFRS5WZWN0b3IyKCApO1xyXG4gKlxyXG4gKiBjb25zdCBkID0gYS5kaXN0YW5jZVRvKCBiICk7XHJcbiAqIGBgYFxyXG4gKi9cclxuY2xhc3MgVmVjdG9yMiB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgMkQgdmVjdG9yLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt4PTBdIC0gVGhlIHggdmFsdWUgb2YgdGhpcyB2ZWN0b3IuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt5PTBdIC0gVGhlIHkgdmFsdWUgb2YgdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHggPSAwLCB5ID0gMCApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdFZlY3RvcjIucHJvdG90eXBlLmlzVmVjdG9yMiA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgeCB2YWx1ZSBvZiB0aGlzIHZlY3Rvci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnggPSB4O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHkgdmFsdWUgb2YgdGhpcyB2ZWN0b3IuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy55ID0geTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBbGlhcyBmb3Ige0BsaW5rIFZlY3RvcjIjeH0uXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdCAqL1xyXG5cdGdldCB3aWR0aCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy54O1xyXG5cclxuXHR9XHJcblxyXG5cdHNldCB3aWR0aCggdmFsdWUgKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gdmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWxpYXMgZm9yIHtAbGluayBWZWN0b3IyI3l9LlxyXG5cdCAqXHJcblx0ICogQHR5cGUge251bWJlcn1cclxuXHQgKi9cclxuXHRnZXQgaGVpZ2h0KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnk7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0IGhlaWdodCggdmFsdWUgKSB7XHJcblxyXG5cdFx0dGhpcy55ID0gdmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdmVjdG9yIGNvbXBvbmVudHMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB2YWx1ZSBvZiB0aGUgeCBjb21wb25lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmFsdWUgb2YgdGhlIHkgY29tcG9uZW50LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHNldCggeCwgeSApIHtcclxuXHJcblx0XHR0aGlzLnggPSB4O1xyXG5cdFx0dGhpcy55ID0geTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB2ZWN0b3IgY29tcG9uZW50cyB0byB0aGUgc2FtZSB2YWx1ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzY2FsYXIgLSBUaGUgdmFsdWUgdG8gc2V0IGZvciBhbGwgdmVjdG9yIGNvbXBvbmVudHMuXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0c2V0U2NhbGFyKCBzY2FsYXIgKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gc2NhbGFyO1xyXG5cdFx0dGhpcy55ID0gc2NhbGFyO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHZlY3RvcidzIHggY29tcG9uZW50IHRvIHRoZSBnaXZlbiB2YWx1ZVxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgdmFsdWUgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHNldFgoIHggKSB7XHJcblxyXG5cdFx0dGhpcy54ID0geDtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB2ZWN0b3IncyB5IGNvbXBvbmVudCB0byB0aGUgZ2l2ZW4gdmFsdWVcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHZhbHVlIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRzZXRZKCB5ICkge1xyXG5cclxuXHRcdHRoaXMueSA9IHk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWxsb3dzIHRvIHNldCBhIHZlY3RvciBjb21wb25lbnQgd2l0aCBhbiBpbmRleC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBjb21wb25lbnQgaW5kZXguIGAwYCBlcXVhbHMgdG8geCwgYDFgIGVxdWFscyB0byB5LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBzZXQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0c2V0Q29tcG9uZW50KCBpbmRleCwgdmFsdWUgKSB7XHJcblxyXG5cdFx0c3dpdGNoICggaW5kZXggKSB7XHJcblxyXG5cdFx0XHRjYXNlIDA6IHRoaXMueCA9IHZhbHVlOyBicmVhaztcclxuXHRcdFx0Y2FzZSAxOiB0aGlzLnkgPSB2YWx1ZTsgYnJlYWs7XHJcblx0XHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvciggJ2luZGV4IGlzIG91dCBvZiByYW5nZTogJyArIGluZGV4ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSB2ZWN0b3IgY29tcG9uZW50IHdoaWNoIG1hdGNoZXMgdGhlIGdpdmVuIGluZGV4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGNvbXBvbmVudCBpbmRleC4gYDBgIGVxdWFscyB0byB4LCBgMWAgZXF1YWxzIHRvIHkuXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBBIHZlY3RvciBjb21wb25lbnQgdmFsdWUuXHJcblx0ICovXHJcblx0Z2V0Q29tcG9uZW50KCBpbmRleCApIHtcclxuXHJcblx0XHRzd2l0Y2ggKCBpbmRleCApIHtcclxuXHJcblx0XHRcdGNhc2UgMDogcmV0dXJuIHRoaXMueDtcclxuXHRcdFx0Y2FzZSAxOiByZXR1cm4gdGhpcy55O1xyXG5cdFx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoICdpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICcgKyBpbmRleCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbmV3IHZlY3RvciB3aXRoIGNvcGllZCB2YWx1ZXMgZnJvbSB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gQSBjbG9uZSBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNsb25lKCkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy54LCB0aGlzLnkgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gdmVjdG9yIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IHYgLSBUaGUgdmVjdG9yIHRvIGNvcHkuXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0Y29weSggdiApIHtcclxuXHJcblx0XHR0aGlzLnggPSB2Lng7XHJcblx0XHR0aGlzLnkgPSB2Lnk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyB0aGUgZ2l2ZW4gdmVjdG9yIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IHYgLSBUaGUgdmVjdG9yIHRvIGFkZC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRhZGQoIHYgKSB7XHJcblxyXG5cdFx0dGhpcy54ICs9IHYueDtcclxuXHRcdHRoaXMueSArPSB2Lnk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyB0aGUgZ2l2ZW4gc2NhbGFyIHZhbHVlIHRvIGFsbCBjb21wb25lbnRzIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gcyAtIFRoZSBzY2FsYXIgdG8gYWRkLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGFkZFNjYWxhciggcyApIHtcclxuXHJcblx0XHR0aGlzLnggKz0gcztcclxuXHRcdHRoaXMueSArPSBzO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgdGhlIGdpdmVuIHZlY3RvcnMgYW5kIHN0b3JlcyB0aGUgcmVzdWx0IGluIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IGEgLSBUaGUgZmlyc3QgdmVjdG9yLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gYiAtIFRoZSBzZWNvbmQgdmVjdG9yLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGFkZFZlY3RvcnMoIGEsIGIgKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gYS54ICsgYi54O1xyXG5cdFx0dGhpcy55ID0gYS55ICsgYi55O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgdGhlIGdpdmVuIHZlY3RvciBzY2FsZWQgYnkgdGhlIGdpdmVuIGZhY3RvciB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSB2IC0gVGhlIHZlY3Rvci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gcyAtIFRoZSBmYWN0b3IgdGhhdCBzY2FsZXMgYHZgLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGFkZFNjYWxlZFZlY3RvciggdiwgcyApIHtcclxuXHJcblx0XHR0aGlzLnggKz0gdi54ICogcztcclxuXHRcdHRoaXMueSArPSB2LnkgKiBzO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFN1YnRyYWN0cyB0aGUgZ2l2ZW4gdmVjdG9yIGZyb20gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gdiAtIFRoZSB2ZWN0b3IgdG8gc3VidHJhY3QuXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0c3ViKCB2ICkge1xyXG5cclxuXHRcdHRoaXMueCAtPSB2Lng7XHJcblx0XHR0aGlzLnkgLT0gdi55O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFN1YnRyYWN0cyB0aGUgZ2l2ZW4gc2NhbGFyIHZhbHVlIGZyb20gYWxsIGNvbXBvbmVudHMgb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzIC0gVGhlIHNjYWxhciB0byBzdWJ0cmFjdC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRzdWJTY2FsYXIoIHMgKSB7XHJcblxyXG5cdFx0dGhpcy54IC09IHM7XHJcblx0XHR0aGlzLnkgLT0gcztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTdWJ0cmFjdHMgdGhlIGdpdmVuIHZlY3RvcnMgYW5kIHN0b3JlcyB0aGUgcmVzdWx0IGluIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IGEgLSBUaGUgZmlyc3QgdmVjdG9yLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gYiAtIFRoZSBzZWNvbmQgdmVjdG9yLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHN1YlZlY3RvcnMoIGEsIGIgKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gYS54IC0gYi54O1xyXG5cdFx0dGhpcy55ID0gYS55IC0gYi55O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE11bHRpcGxpZXMgdGhlIGdpdmVuIHZlY3RvciB3aXRoIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IHYgLSBUaGUgdmVjdG9yIHRvIG11bHRpcGx5LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdG11bHRpcGx5KCB2ICkge1xyXG5cclxuXHRcdHRoaXMueCAqPSB2Lng7XHJcblx0XHR0aGlzLnkgKj0gdi55O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE11bHRpcGxpZXMgdGhlIGdpdmVuIHNjYWxhciB2YWx1ZSB3aXRoIGFsbCBjb21wb25lbnRzIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc2NhbGFyIC0gVGhlIHNjYWxhciB0byBtdWx0aXBseS5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRtdWx0aXBseVNjYWxhciggc2NhbGFyICkge1xyXG5cclxuXHRcdHRoaXMueCAqPSBzY2FsYXI7XHJcblx0XHR0aGlzLnkgKj0gc2NhbGFyO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERpdmlkZXMgdGhpcyBpbnN0YW5jZSBieSB0aGUgZ2l2ZW4gdmVjdG9yLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSB2IC0gVGhlIHZlY3RvciB0byBkaXZpZGUuXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0ZGl2aWRlKCB2ICkge1xyXG5cclxuXHRcdHRoaXMueCAvPSB2Lng7XHJcblx0XHR0aGlzLnkgLz0gdi55O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERpdmlkZXMgdGhpcyB2ZWN0b3IgYnkgdGhlIGdpdmVuIHNjYWxhci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzY2FsYXIgLSBUaGUgc2NhbGFyIHRvIGRpdmlkZS5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRkaXZpZGVTY2FsYXIoIHNjYWxhciApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseVNjYWxhciggMSAvIHNjYWxhciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE11bHRpcGxpZXMgdGhpcyB2ZWN0b3IgKHdpdGggYW4gaW1wbGljaXQgMSBhcyB0aGUgM3JkIGNvbXBvbmVudCkgYnlcclxuXHQgKiB0aGUgZ2l2ZW4gM3gzIG1hdHJpeC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4M30gbSAtIFRoZSBtYXRyaXggdG8gYXBwbHkuXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0YXBwbHlNYXRyaXgzKCBtICkge1xyXG5cclxuXHRcdGNvbnN0IHggPSB0aGlzLngsIHkgPSB0aGlzLnk7XHJcblx0XHRjb25zdCBlID0gbS5lbGVtZW50cztcclxuXHJcblx0XHR0aGlzLnggPSBlWyAwIF0gKiB4ICsgZVsgMyBdICogeSArIGVbIDYgXTtcclxuXHRcdHRoaXMueSA9IGVbIDEgXSAqIHggKyBlWyA0IF0gKiB5ICsgZVsgNyBdO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIElmIHRoaXMgdmVjdG9yJ3MgeCBvciB5IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgZ2l2ZW4gdmVjdG9yJ3MgeCBvciB5XHJcblx0ICogdmFsdWUsIHJlcGxhY2UgdGhhdCB2YWx1ZSB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIG1pbiB2YWx1ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gdiAtIFRoZSB2ZWN0b3IuXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0bWluKCB2ICkge1xyXG5cclxuXHRcdHRoaXMueCA9IE1hdGgubWluKCB0aGlzLngsIHYueCApO1xyXG5cdFx0dGhpcy55ID0gTWF0aC5taW4oIHRoaXMueSwgdi55ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSWYgdGhpcyB2ZWN0b3IncyB4IG9yIHkgdmFsdWUgaXMgbGVzcyB0aGFuIHRoZSBnaXZlbiB2ZWN0b3IncyB4IG9yIHlcclxuXHQgKiB2YWx1ZSwgcmVwbGFjZSB0aGF0IHZhbHVlIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgbWF4IHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSB2IC0gVGhlIHZlY3Rvci5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRtYXgoIHYgKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gTWF0aC5tYXgoIHRoaXMueCwgdi54ICk7XHJcblx0XHR0aGlzLnkgPSBNYXRoLm1heCggdGhpcy55LCB2LnkgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJZiB0aGlzIHZlY3RvcidzIHggb3IgeSB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIG1heCB2ZWN0b3IncyB4IG9yIHlcclxuXHQgKiB2YWx1ZSwgaXQgaXMgcmVwbGFjZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUuXHJcblx0ICogSWYgdGhpcyB2ZWN0b3IncyB4IG9yIHkgdmFsdWUgaXMgbGVzcyB0aGFuIHRoZSBtaW4gdmVjdG9yJ3MgeCBvciB5IHZhbHVlLFxyXG5cdCAqIGl0IGlzIHJlcGxhY2VkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSBtaW4gLSBUaGUgbWluaW11bSB4IGFuZCB5IHZhbHVlcy5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IG1heCAtIFRoZSBtYXhpbXVtIHggYW5kIHkgdmFsdWVzIGluIHRoZSBkZXNpcmVkIHJhbmdlLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGNsYW1wKCBtaW4sIG1heCApIHtcclxuXHJcblx0XHQvLyBhc3N1bWVzIG1pbiA8IG1heCwgY29tcG9uZW50d2lzZVxyXG5cclxuXHRcdHRoaXMueCA9IGNsYW1wKCB0aGlzLngsIG1pbi54LCBtYXgueCApO1xyXG5cdFx0dGhpcy55ID0gY2xhbXAoIHRoaXMueSwgbWluLnksIG1heC55ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSWYgdGhpcyB2ZWN0b3IncyB4IG9yIHkgdmFsdWVzIGFyZSBncmVhdGVyIHRoYW4gdGhlIG1heCB2YWx1ZSwgdGhleSBhcmVcclxuXHQgKiByZXBsYWNlZCBieSB0aGUgbWF4IHZhbHVlLlxyXG5cdCAqIElmIHRoaXMgdmVjdG9yJ3MgeCBvciB5IHZhbHVlcyBhcmUgbGVzcyB0aGFuIHRoZSBtaW4gdmFsdWUsIHRoZXkgYXJlXHJcblx0ICogcmVwbGFjZWQgYnkgdGhlIG1pbiB2YWx1ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBtaW5WYWwgLSBUaGUgbWluaW11bSB2YWx1ZSB0aGUgY29tcG9uZW50cyB3aWxsIGJlIGNsYW1wZWQgdG8uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IG1heFZhbCAtIFRoZSBtYXhpbXVtIHZhbHVlIHRoZSBjb21wb25lbnRzIHdpbGwgYmUgY2xhbXBlZCB0by5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRjbGFtcFNjYWxhciggbWluVmFsLCBtYXhWYWwgKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gY2xhbXAoIHRoaXMueCwgbWluVmFsLCBtYXhWYWwgKTtcclxuXHRcdHRoaXMueSA9IGNsYW1wKCB0aGlzLnksIG1pblZhbCwgbWF4VmFsICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSWYgdGhpcyB2ZWN0b3IncyBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIHRoZSBtYXggdmFsdWUsIGl0IGlzIHJlcGxhY2VkIGJ5XHJcblx0ICogdGhlIG1heCB2YWx1ZS5cclxuXHQgKiBJZiB0aGlzIHZlY3RvcidzIGxlbmd0aCBpcyBsZXNzIHRoYW4gdGhlIG1pbiB2YWx1ZSwgaXQgaXMgcmVwbGFjZWQgYnkgdGhlXHJcblx0ICogbWluIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IG1pbiAtIFRoZSBtaW5pbXVtIHZhbHVlIHRoZSB2ZWN0b3IgbGVuZ3RoIHdpbGwgYmUgY2xhbXBlZCB0by5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbWF4IC0gVGhlIG1heGltdW0gdmFsdWUgdGhlIHZlY3RvciBsZW5ndGggd2lsbCBiZSBjbGFtcGVkIHRvLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGNsYW1wTGVuZ3RoKCBtaW4sIG1heCApIHtcclxuXHJcblx0XHRjb25zdCBsZW5ndGggPSB0aGlzLmxlbmd0aCgpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmRpdmlkZVNjYWxhciggbGVuZ3RoIHx8IDEgKS5tdWx0aXBseVNjYWxhciggY2xhbXAoIGxlbmd0aCwgbWluLCBtYXggKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBjb21wb25lbnRzIG9mIHRoaXMgdmVjdG9yIGFyZSByb3VuZGVkIGRvd24gdG8gdGhlIG5lYXJlc3QgaW50ZWdlciB2YWx1ZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGZsb29yKCkge1xyXG5cclxuXHRcdHRoaXMueCA9IE1hdGguZmxvb3IoIHRoaXMueCApO1xyXG5cdFx0dGhpcy55ID0gTWF0aC5mbG9vciggdGhpcy55ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGNvbXBvbmVudHMgb2YgdGhpcyB2ZWN0b3IgYXJlIHJvdW5kZWQgdXAgdG8gdGhlIG5lYXJlc3QgaW50ZWdlciB2YWx1ZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGNlaWwoKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gTWF0aC5jZWlsKCB0aGlzLnggKTtcclxuXHRcdHRoaXMueSA9IE1hdGguY2VpbCggdGhpcy55ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGNvbXBvbmVudHMgb2YgdGhpcyB2ZWN0b3IgYXJlIHJvdW5kZWQgdG8gdGhlIG5lYXJlc3QgaW50ZWdlciB2YWx1ZVxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0cm91bmQoKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gTWF0aC5yb3VuZCggdGhpcy54ICk7XHJcblx0XHR0aGlzLnkgPSBNYXRoLnJvdW5kKCB0aGlzLnkgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgY29tcG9uZW50cyBvZiB0aGlzIHZlY3RvciBhcmUgcm91bmRlZCB0b3dhcmRzIHplcm8gKHVwIGlmIG5lZ2F0aXZlLFxyXG5cdCAqIGRvd24gaWYgcG9zaXRpdmUpIHRvIGFuIGludGVnZXIgdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRyb3VuZFRvWmVybygpIHtcclxuXHJcblx0XHR0aGlzLnggPSBNYXRoLnRydW5jKCB0aGlzLnggKTtcclxuXHRcdHRoaXMueSA9IE1hdGgudHJ1bmMoIHRoaXMueSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEludmVydHMgdGhpcyB2ZWN0b3IgLSBpLmUuIHNldHMgeCA9IC14IGFuZCB5ID0gLXkuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRuZWdhdGUoKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gLSB0aGlzLng7XHJcblx0XHR0aGlzLnkgPSAtIHRoaXMueTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDYWxjdWxhdGVzIHRoZSBkb3QgcHJvZHVjdCBvZiB0aGUgZ2l2ZW4gdmVjdG9yIHdpdGggdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gdiAtIFRoZSB2ZWN0b3IgdG8gY29tcHV0ZSB0aGUgZG90IHByb2R1Y3Qgd2l0aC5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSByZXN1bHQgb2YgdGhlIGRvdCBwcm9kdWN0LlxyXG5cdCAqL1xyXG5cdGRvdCggdiApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy54ICogdi54ICsgdGhpcy55ICogdi55O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENhbGN1bGF0ZXMgdGhlIGNyb3NzIHByb2R1Y3Qgb2YgdGhlIGdpdmVuIHZlY3RvciB3aXRoIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IHYgLSBUaGUgdmVjdG9yIHRvIGNvbXB1dGUgdGhlIGNyb3NzIHByb2R1Y3Qgd2l0aC5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSByZXN1bHQgb2YgdGhlIGNyb3NzIHByb2R1Y3QuXHJcblx0ICovXHJcblx0Y3Jvc3MoIHYgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMueCAqIHYueSAtIHRoaXMueSAqIHYueDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB0aGUgc3F1YXJlIG9mIHRoZSBFdWNsaWRlYW4gbGVuZ3RoIChzdHJhaWdodC1saW5lIGxlbmd0aCkgZnJvbVxyXG5cdCAqICgwLCAwKSB0byAoeCwgeSkuIElmIHlvdSBhcmUgY29tcGFyaW5nIHRoZSBsZW5ndGhzIG9mIHZlY3RvcnMsIHlvdSBzaG91bGRcclxuXHQgKiBjb21wYXJlIHRoZSBsZW5ndGggc3F1YXJlZCBpbnN0ZWFkIGFzIGl0IGlzIHNsaWdodGx5IG1vcmUgZWZmaWNpZW50IHRvIGNhbGN1bGF0ZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIHNxdWFyZSBsZW5ndGggb2YgdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0bGVuZ3RoU3EoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB0aGUgIEV1Y2xpZGVhbiBsZW5ndGggKHN0cmFpZ2h0LWxpbmUgbGVuZ3RoKSBmcm9tICgwLCAwKSB0byAoeCwgeSkuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBsZW5ndGggb2YgdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0bGVuZ3RoKCkge1xyXG5cclxuXHRcdHJldHVybiBNYXRoLnNxcnQoIHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSBNYW5oYXR0YW4gbGVuZ3RoIG9mIHRoaXMgdmVjdG9yLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgbGVuZ3RoIG9mIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdG1hbmhhdHRhbkxlbmd0aCgpIHtcclxuXHJcblx0XHRyZXR1cm4gTWF0aC5hYnMoIHRoaXMueCApICsgTWF0aC5hYnMoIHRoaXMueSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnZlcnRzIHRoaXMgdmVjdG9yIHRvIGEgdW5pdCB2ZWN0b3IgLSB0aGF0IGlzLCBzZXRzIGl0IGVxdWFsIHRvIGEgdmVjdG9yXHJcblx0ICogd2l0aCB0aGUgc2FtZSBkaXJlY3Rpb24gYXMgdGhpcyBvbmUsIGJ1dCB3aXRoIGEgdmVjdG9yIGxlbmd0aCBvZiBgMWAuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRub3JtYWxpemUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKCB0aGlzLmxlbmd0aCgpIHx8IDEgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB0aGUgYW5nbGUgaW4gcmFkaWFucyBvZiB0aGlzIHZlY3RvciB3aXRoIHJlc3BlY3QgdG8gdGhlIHBvc2l0aXZlIHgtYXhpcy5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGFuZ2xlIGluIHJhZGlhbnMuXHJcblx0ICovXHJcblx0YW5nbGUoKSB7XHJcblxyXG5cdFx0Y29uc3QgYW5nbGUgPSBNYXRoLmF0YW4yKCAtIHRoaXMueSwgLSB0aGlzLnggKSArIE1hdGguUEk7XHJcblxyXG5cdFx0cmV0dXJuIGFuZ2xlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGFuZ2xlIGJldHdlZW4gdGhlIGdpdmVuIHZlY3RvciBhbmQgdGhpcyBpbnN0YW5jZSBpbiByYWRpYW5zLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSB2IC0gVGhlIHZlY3RvciB0byBjb21wdXRlIHRoZSBhbmdsZSB3aXRoLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGFuZ2xlIGluIHJhZGlhbnMuXHJcblx0ICovXHJcblx0YW5nbGVUbyggdiApIHtcclxuXHJcblx0XHRjb25zdCBkZW5vbWluYXRvciA9IE1hdGguc3FydCggdGhpcy5sZW5ndGhTcSgpICogdi5sZW5ndGhTcSgpICk7XHJcblxyXG5cdFx0aWYgKCBkZW5vbWluYXRvciA9PT0gMCApIHJldHVybiBNYXRoLlBJIC8gMjtcclxuXHJcblx0XHRjb25zdCB0aGV0YSA9IHRoaXMuZG90KCB2ICkgLyBkZW5vbWluYXRvcjtcclxuXHJcblx0XHQvLyBjbGFtcCwgdG8gaGFuZGxlIG51bWVyaWNhbCBwcm9ibGVtc1xyXG5cclxuXHRcdHJldHVybiBNYXRoLmFjb3MoIGNsYW1wKCB0aGV0YSwgLSAxLCAxICkgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgZ2l2ZW4gdmVjdG9yIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IHYgLSBUaGUgdmVjdG9yIHRvIGNvbXB1dGUgdGhlIGRpc3RhbmNlIHRvLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGRpc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGRpc3RhbmNlVG8oIHYgKSB7XHJcblxyXG5cdFx0cmV0dXJuIE1hdGguc3FydCggdGhpcy5kaXN0YW5jZVRvU3F1YXJlZCggdiApICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgdGhlIHNxdWFyZWQgZGlzdGFuY2UgZnJvbSB0aGUgZ2l2ZW4gdmVjdG9yIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICogSWYgeW91IGFyZSBqdXN0IGNvbXBhcmluZyB0aGUgZGlzdGFuY2Ugd2l0aCBhbm90aGVyIGRpc3RhbmNlLCB5b3Ugc2hvdWxkIGNvbXBhcmVcclxuXHQgKiB0aGUgZGlzdGFuY2Ugc3F1YXJlZCBpbnN0ZWFkIGFzIGl0IGlzIHNsaWdodGx5IG1vcmUgZWZmaWNpZW50IHRvIGNhbGN1bGF0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gdiAtIFRoZSB2ZWN0b3IgdG8gY29tcHV0ZSB0aGUgc3F1YXJlZCBkaXN0YW5jZSB0by5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBzcXVhcmVkIGRpc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGRpc3RhbmNlVG9TcXVhcmVkKCB2ICkge1xyXG5cclxuXHRcdGNvbnN0IGR4ID0gdGhpcy54IC0gdi54LCBkeSA9IHRoaXMueSAtIHYueTtcclxuXHRcdHJldHVybiBkeCAqIGR4ICsgZHkgKiBkeTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB0aGUgTWFuaGF0dGFuIGRpc3RhbmNlIGZyb20gdGhlIGdpdmVuIHZlY3RvciB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSB2IC0gVGhlIHZlY3RvciB0byBjb21wdXRlIHRoZSBNYW5oYXR0YW4gZGlzdGFuY2UgdG8uXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgTWFuaGF0dGFuIGRpc3RhbmNlLlxyXG5cdCAqL1xyXG5cdG1hbmhhdHRhbkRpc3RhbmNlVG8oIHYgKSB7XHJcblxyXG5cdFx0cmV0dXJuIE1hdGguYWJzKCB0aGlzLnggLSB2LnggKSArIE1hdGguYWJzKCB0aGlzLnkgLSB2LnkgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoaXMgdmVjdG9yIHRvIGEgdmVjdG9yIHdpdGggdGhlIHNhbWUgZGlyZWN0aW9uIGFzIHRoaXMgb25lLCBidXRcclxuXHQgKiB3aXRoIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCAtIFRoZSBuZXcgbGVuZ3RoIG9mIHRoaXMgdmVjdG9yLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHNldExlbmd0aCggbGVuZ3RoICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKCBsZW5ndGggKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBMaW5lYXJseSBpbnRlcnBvbGF0ZXMgYmV0d2VlbiB0aGUgZ2l2ZW4gdmVjdG9yIGFuZCB0aGlzIGluc3RhbmNlLCB3aGVyZVxyXG5cdCAqIGFscGhhIGlzIHRoZSBwZXJjZW50IGRpc3RhbmNlIGFsb25nIHRoZSBsaW5lIC0gYWxwaGEgPSAwIHdpbGwgYmUgdGhpc1xyXG5cdCAqIHZlY3RvciwgYW5kIGFscGhhID0gMSB3aWxsIGJlIHRoZSBnaXZlbiBvbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IHYgLSBUaGUgdmVjdG9yIHRvIGludGVycG9sYXRlIHRvd2FyZHMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFscGhhIC0gVGhlIGludGVycG9sYXRpb24gZmFjdG9yLCB0eXBpY2FsbHkgaW4gdGhlIGNsb3NlZCBpbnRlcnZhbCBgWzAsIDFdYC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRsZXJwKCB2LCBhbHBoYSApIHtcclxuXHJcblx0XHR0aGlzLnggKz0gKCB2LnggLSB0aGlzLnggKSAqIGFscGhhO1xyXG5cdFx0dGhpcy55ICs9ICggdi55IC0gdGhpcy55ICkgKiBhbHBoYTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBMaW5lYXJseSBpbnRlcnBvbGF0ZXMgYmV0d2VlbiB0aGUgZ2l2ZW4gdmVjdG9ycywgd2hlcmUgYWxwaGEgaXMgdGhlIHBlcmNlbnRcclxuXHQgKiBkaXN0YW5jZSBhbG9uZyB0aGUgbGluZSAtIGFscGhhID0gMCB3aWxsIGJlIGZpcnN0IHZlY3RvciwgYW5kIGFscGhhID0gMSB3aWxsXHJcblx0ICogYmUgdGhlIHNlY29uZCBvbmUuIFRoZSByZXN1bHQgaXMgc3RvcmVkIGluIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IHYxIC0gVGhlIGZpcnN0IHZlY3Rvci5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IHYyIC0gVGhlIHNlY29uZCB2ZWN0b3IuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFscGhhIC0gVGhlIGludGVycG9sYXRpb24gZmFjdG9yLCB0eXBpY2FsbHkgaW4gdGhlIGNsb3NlZCBpbnRlcnZhbCBgWzAsIDFdYC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRsZXJwVmVjdG9ycyggdjEsIHYyLCBhbHBoYSApIHtcclxuXHJcblx0XHR0aGlzLnggPSB2MS54ICsgKCB2Mi54IC0gdjEueCApICogYWxwaGE7XHJcblx0XHR0aGlzLnkgPSB2MS55ICsgKCB2Mi55IC0gdjEueSApICogYWxwaGE7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyB2ZWN0b3IgaXMgZXF1YWwgd2l0aCB0aGUgZ2l2ZW4gb25lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSB2IC0gVGhlIHZlY3RvciB0byB0ZXN0IGZvciBlcXVhbGl0eS5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoaXMgdmVjdG9yIGlzIGVxdWFsIHdpdGggdGhlIGdpdmVuIG9uZS5cclxuXHQgKi9cclxuXHRlcXVhbHMoIHYgKSB7XHJcblxyXG5cdFx0cmV0dXJuICggKCB2LnggPT09IHRoaXMueCApICYmICggdi55ID09PSB0aGlzLnkgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhpcyB2ZWN0b3IncyB4IHZhbHVlIHRvIGJlIGBhcnJheVsgb2Zmc2V0IF1gIGFuZCB5XHJcblx0ICogdmFsdWUgdG8gYmUgYGFycmF5WyBvZmZzZXQgKyAxIF1gLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBhcnJheSAtIEFuIGFycmF5IGhvbGRpbmcgdGhlIHZlY3RvciBjb21wb25lbnQgdmFsdWVzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0PTBdIC0gVGhlIG9mZnNldCBpbnRvIHRoZSBhcnJheS5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRmcm9tQXJyYXkoIGFycmF5LCBvZmZzZXQgPSAwICkge1xyXG5cclxuXHRcdHRoaXMueCA9IGFycmF5WyBvZmZzZXQgXTtcclxuXHRcdHRoaXMueSA9IGFycmF5WyBvZmZzZXQgKyAxIF07XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogV3JpdGVzIHRoZSBjb21wb25lbnRzIG9mIHRoaXMgdmVjdG9yIHRvIHRoZSBnaXZlbiBhcnJheS4gSWYgbm8gYXJyYXkgaXMgcHJvdmlkZWQsXHJcblx0ICogdGhlIG1ldGhvZCByZXR1cm5zIGEgbmV3IGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBbYXJyYXk9W11dIC0gVGhlIHRhcmdldCBhcnJheSBob2xkaW5nIHRoZSB2ZWN0b3IgY29tcG9uZW50cy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW29mZnNldD0wXSAtIEluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBhcnJheS5cclxuXHQgKiBAcmV0dXJuIHtBcnJheTxudW1iZXI+fSBUaGUgdmVjdG9yIGNvbXBvbmVudHMuXHJcblx0ICovXHJcblx0dG9BcnJheSggYXJyYXkgPSBbXSwgb2Zmc2V0ID0gMCApIHtcclxuXHJcblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0aGlzLng7XHJcblx0XHRhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGhpcy55O1xyXG5cclxuXHRcdHJldHVybiBhcnJheTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBjb21wb25lbnRzIG9mIHRoaXMgdmVjdG9yIGZyb20gdGhlIGdpdmVuIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0J1ZmZlckF0dHJpYnV0ZX0gYXR0cmlidXRlIC0gVGhlIGJ1ZmZlciBhdHRyaWJ1dGUgaG9sZGluZyB2ZWN0b3IgZGF0YS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggaW50byB0aGUgYXR0cmlidXRlLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGZyb21CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgaW5kZXggKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gYXR0cmlidXRlLmdldFgoIGluZGV4ICk7XHJcblx0XHR0aGlzLnkgPSBhdHRyaWJ1dGUuZ2V0WSggaW5kZXggKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSb3RhdGVzIHRoaXMgdmVjdG9yIGFyb3VuZCB0aGUgZ2l2ZW4gY2VudGVyIGJ5IHRoZSBnaXZlbiBhbmdsZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gY2VudGVyIC0gVGhlIHBvaW50IGFyb3VuZCB3aGljaCB0byByb3RhdGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFuZ2xlIC0gVGhlIGFuZ2xlIHRvIHJvdGF0ZSwgaW4gcmFkaWFucy5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRyb3RhdGVBcm91bmQoIGNlbnRlciwgYW5nbGUgKSB7XHJcblxyXG5cdFx0Y29uc3QgYyA9IE1hdGguY29zKCBhbmdsZSApLCBzID0gTWF0aC5zaW4oIGFuZ2xlICk7XHJcblxyXG5cdFx0Y29uc3QgeCA9IHRoaXMueCAtIGNlbnRlci54O1xyXG5cdFx0Y29uc3QgeSA9IHRoaXMueSAtIGNlbnRlci55O1xyXG5cclxuXHRcdHRoaXMueCA9IHggKiBjIC0geSAqIHMgKyBjZW50ZXIueDtcclxuXHRcdHRoaXMueSA9IHggKiBzICsgeSAqIGMgKyBjZW50ZXIueTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIGVhY2ggY29tcG9uZW50IG9mIHRoaXMgdmVjdG9yIHRvIGEgcHNldWRvLXJhbmRvbSB2YWx1ZSBiZXR3ZWVuIGAwYCBhbmRcclxuXHQgKiBgMWAsIGV4Y2x1ZGluZyBgMWAuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRyYW5kb20oKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gTWF0aC5yYW5kb20oKTtcclxuXHRcdHRoaXMueSA9IE1hdGgucmFuZG9tKCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0KlsgU3ltYm9sLml0ZXJhdG9yIF0oKSB7XHJcblxyXG5cdFx0eWllbGQgdGhpcy54O1xyXG5cdFx0eWllbGQgdGhpcy55O1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBWZWN0b3IyIH07XHJcbiIsIi8qKlxyXG4gKiBSZXByZXNlbnRzIGEgM3gzIG1hdHJpeC5cclxuICpcclxuICogQSBOb3RlIG9uIFJvdy1NYWpvciBhbmQgQ29sdW1uLU1ham9yIE9yZGVyaW5nOlxyXG4gKlxyXG4gKiBUaGUgY29uc3RydWN0b3IgYW5kIHtAbGluayBNYXRyaXgzI3NldH0gbWV0aG9kIHRha2UgYXJndW1lbnRzIGluXHJcbiAqIFtyb3ctbWFqb3Jde0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1Jvdy1fYW5kX2NvbHVtbi1tYWpvcl9vcmRlciNDb2x1bW4tbWFqb3Jfb3JkZXJ9XHJcbiAqIG9yZGVyLCB3aGlsZSBpbnRlcm5hbGx5IHRoZXkgYXJlIHN0b3JlZCBpbiB0aGUge0BsaW5rIE1hdHJpeDMjZWxlbWVudHN9IGFycmF5IGluIGNvbHVtbi1tYWpvciBvcmRlci5cclxuICogVGhpcyBtZWFucyB0aGF0IGNhbGxpbmc6XHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IG0gPSBuZXcgVEhSRUUuTWF0cml4KCk7XHJcbiAqIG0uc2V0KCAxMSwgMTIsIDEzLFxyXG4gKiAgICAgICAgMjEsIDIyLCAyMyxcclxuICogICAgICAgIDMxLCAzMiwgMzMgKTtcclxuICogYGBgXHJcbiAqIHdpbGwgcmVzdWx0IGluIHRoZSBlbGVtZW50cyBhcnJheSBjb250YWluaW5nOlxyXG4gKiBgYGBqc1xyXG4gKiBtLmVsZW1lbnRzID0gWyAxMSwgMjEsIDMxLFxyXG4gKiAgICAgICAgICAgICAgICAxMiwgMjIsIDMyLFxyXG4gKiAgICAgICAgICAgICAgICAxMywgMjMsIDMzIF07XHJcbiAqIGBgYFxyXG4gKiBhbmQgaW50ZXJuYWxseSBhbGwgY2FsY3VsYXRpb25zIGFyZSBwZXJmb3JtZWQgdXNpbmcgY29sdW1uLW1ham9yIG9yZGVyaW5nLlxyXG4gKiBIb3dldmVyLCBhcyB0aGUgYWN0dWFsIG9yZGVyaW5nIG1ha2VzIG5vIGRpZmZlcmVuY2UgbWF0aGVtYXRpY2FsbHkgYW5kXHJcbiAqIG1vc3QgcGVvcGxlIGFyZSB1c2VkIHRvIHRoaW5raW5nIGFib3V0IG1hdHJpY2VzIGluIHJvdy1tYWpvciBvcmRlciwgdGhlXHJcbiAqIHRocmVlLmpzIGRvY3VtZW50YXRpb24gc2hvd3MgbWF0cmljZXMgaW4gcm93LW1ham9yIG9yZGVyLiBKdXN0IGJlYXIgaW5cclxuICogbWluZCB0aGF0IGlmIHlvdSBhcmUgcmVhZGluZyB0aGUgc291cmNlIGNvZGUsIHlvdSdsbCBoYXZlIHRvIHRha2UgdGhlXHJcbiAqIHRyYW5zcG9zZSBvZiBhbnkgbWF0cmljZXMgb3V0bGluZWQgaGVyZSB0byBtYWtlIHNlbnNlIG9mIHRoZSBjYWxjdWxhdGlvbnMuXHJcbiAqL1xyXG5jbGFzcyBNYXRyaXgzIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyAzeDMgbWF0cml4LiBUaGUgYXJndW1lbnRzIGFyZSBzdXBwb3NlZCB0byBiZVxyXG5cdCAqIGluIHJvdy1tYWpvciBvcmRlci4gSWYgbm8gYXJndW1lbnRzIGFyZSBwcm92aWRlZCwgdGhlIGNvbnN0cnVjdG9yXHJcblx0ICogaW5pdGlhbGl6ZXMgdGhlIG1hdHJpeCBhcyBhbiBpZGVudGl0eSBtYXRyaXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW24xMV0gLSAxLTEgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuMTJdIC0gMS0yIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjEzXSAtIDEtMyBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW24yMV0gLSAyLTEgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuMjJdIC0gMi0yIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjIzXSAtIDItMyBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW24zMV0gLSAzLTEgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuMzJdIC0gMy0yIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjMzXSAtIDMtMyBtYXRyaXggZWxlbWVudC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbjExLCBuMTIsIG4xMywgbjIxLCBuMjIsIG4yMywgbjMxLCBuMzIsIG4zMyApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdE1hdHJpeDMucHJvdG90eXBlLmlzTWF0cml4MyA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGNvbHVtbi1tYWpvciBsaXN0IG9mIG1hdHJpeCB2YWx1ZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PG51bWJlcj59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZWxlbWVudHMgPSBbXHJcblxyXG5cdFx0XHQxLCAwLCAwLFxyXG5cdFx0XHQwLCAxLCAwLFxyXG5cdFx0XHQwLCAwLCAxXHJcblxyXG5cdFx0XTtcclxuXHJcblx0XHRpZiAoIG4xMSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0dGhpcy5zZXQoIG4xMSwgbjEyLCBuMTMsIG4yMSwgbjIyLCBuMjMsIG4zMSwgbjMyLCBuMzMgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZWxlbWVudHMgb2YgdGhlIG1hdHJpeC5UaGUgYXJndW1lbnRzIGFyZSBzdXBwb3NlZCB0byBiZVxyXG5cdCAqIGluIHJvdy1tYWpvciBvcmRlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjExXSAtIDEtMSBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW24xMl0gLSAxLTIgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuMTNdIC0gMS0zIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjIxXSAtIDItMSBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW24yMl0gLSAyLTIgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuMjNdIC0gMi0zIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjMxXSAtIDMtMSBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW24zMl0gLSAzLTIgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuMzNdIC0gMy0zIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdHNldCggbjExLCBuMTIsIG4xMywgbjIxLCBuMjIsIG4yMywgbjMxLCBuMzIsIG4zMyApIHtcclxuXHJcblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XHJcblxyXG5cdFx0dGVbIDAgXSA9IG4xMTsgdGVbIDEgXSA9IG4yMTsgdGVbIDIgXSA9IG4zMTtcclxuXHRcdHRlWyAzIF0gPSBuMTI7IHRlWyA0IF0gPSBuMjI7IHRlWyA1IF0gPSBuMzI7XHJcblx0XHR0ZVsgNiBdID0gbjEzOyB0ZVsgNyBdID0gbjIzOyB0ZVsgOCBdID0gbjMzO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhpcyBtYXRyaXggdG8gdGhlIDN4MyBpZGVudGl0eSBtYXRyaXguXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtNYXRyaXgzfSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRpZGVudGl0eSgpIHtcclxuXHJcblx0XHR0aGlzLnNldChcclxuXHJcblx0XHRcdDEsIDAsIDAsXHJcblx0XHRcdDAsIDEsIDAsXHJcblx0XHRcdDAsIDAsIDFcclxuXHJcblx0XHQpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvcGllcyB0aGUgdmFsdWVzIG9mIHRoZSBnaXZlbiBtYXRyaXggdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4M30gbSAtIFRoZSBtYXRyaXggdG8gY29weS5cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXgzfSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRjb3B5KCBtICkge1xyXG5cclxuXHRcdGNvbnN0IHRlID0gdGhpcy5lbGVtZW50cztcclxuXHRcdGNvbnN0IG1lID0gbS5lbGVtZW50cztcclxuXHJcblx0XHR0ZVsgMCBdID0gbWVbIDAgXTsgdGVbIDEgXSA9IG1lWyAxIF07IHRlWyAyIF0gPSBtZVsgMiBdO1xyXG5cdFx0dGVbIDMgXSA9IG1lWyAzIF07IHRlWyA0IF0gPSBtZVsgNCBdOyB0ZVsgNSBdID0gbWVbIDUgXTtcclxuXHRcdHRlWyA2IF0gPSBtZVsgNiBdOyB0ZVsgNyBdID0gbWVbIDcgXTsgdGVbIDggXSA9IG1lWyA4IF07XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRXh0cmFjdHMgdGhlIGJhc2lzIG9mIHRoaXMgbWF0cml4IGludG8gdGhlIHRocmVlIGF4aXMgdmVjdG9ycyBwcm92aWRlZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30geEF4aXMgLSBUaGUgYmFzaXMncyB4IGF4aXMuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB5QXhpcyAtIFRoZSBiYXNpcydzIHkgYXhpcy5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHpBeGlzIC0gVGhlIGJhc2lzJ3MgeiBheGlzLlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdGV4dHJhY3RCYXNpcyggeEF4aXMsIHlBeGlzLCB6QXhpcyApIHtcclxuXHJcblx0XHR4QXhpcy5zZXRGcm9tTWF0cml4M0NvbHVtbiggdGhpcywgMCApO1xyXG5cdFx0eUF4aXMuc2V0RnJvbU1hdHJpeDNDb2x1bW4oIHRoaXMsIDEgKTtcclxuXHRcdHpBeGlzLnNldEZyb21NYXRyaXgzQ29sdW1uKCB0aGlzLCAyICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0IHRoaXMgbWF0cml4IHRvIHRoZSB1cHBlciAzeDMgbWF0cml4IG9mIHRoZSBnaXZlbiA0eDQgbWF0cml4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRyaXg0fSBtIC0gVGhlIDR4NCBtYXRyaXguXHJcblx0ICogQHJldHVybiB7TWF0cml4M30gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0c2V0RnJvbU1hdHJpeDQoIG0gKSB7XHJcblxyXG5cdFx0Y29uc3QgbWUgPSBtLmVsZW1lbnRzO1xyXG5cclxuXHRcdHRoaXMuc2V0KFxyXG5cclxuXHRcdFx0bWVbIDAgXSwgbWVbIDQgXSwgbWVbIDggXSxcclxuXHRcdFx0bWVbIDEgXSwgbWVbIDUgXSwgbWVbIDkgXSxcclxuXHRcdFx0bWVbIDIgXSwgbWVbIDYgXSwgbWVbIDEwIF1cclxuXHJcblx0XHQpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBvc3QtbXVsdGlwbGllcyB0aGlzIG1hdHJpeCBieSB0aGUgZ2l2ZW4gM3gzIG1hdHJpeC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4M30gbSAtIFRoZSBtYXRyaXggdG8gbXVsdGlwbHkgd2l0aC5cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXgzfSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRtdWx0aXBseSggbSApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKCB0aGlzLCBtICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUHJlLW11bHRpcGxpZXMgdGhpcyBtYXRyaXggYnkgdGhlIGdpdmVuIDN4MyBtYXRyaXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDN9IG0gLSBUaGUgbWF0cml4IHRvIG11bHRpcGx5IHdpdGguXHJcblx0ICogQHJldHVybiB7TWF0cml4M30gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0cHJlbXVsdGlwbHkoIG0gKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyggbSwgdGhpcyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE11bHRpcGxlcyB0aGUgZ2l2ZW4gM3gzIG1hdHJpY2VzIGFuZCBzdG9yZXMgdGhlIHJlc3VsdFxyXG5cdCAqIGluIHRoaXMgbWF0cml4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRyaXgzfSBhIC0gVGhlIGZpcnN0IG1hdHJpeC5cclxuXHQgKiBAcGFyYW0ge01hdHJpeDN9IGIgLSBUaGUgc2Vjb25kIG1hdHJpeC5cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXgzfSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRtdWx0aXBseU1hdHJpY2VzKCBhLCBiICkge1xyXG5cclxuXHRcdGNvbnN0IGFlID0gYS5lbGVtZW50cztcclxuXHRcdGNvbnN0IGJlID0gYi5lbGVtZW50cztcclxuXHRcdGNvbnN0IHRlID0gdGhpcy5lbGVtZW50cztcclxuXHJcblx0XHRjb25zdCBhMTEgPSBhZVsgMCBdLCBhMTIgPSBhZVsgMyBdLCBhMTMgPSBhZVsgNiBdO1xyXG5cdFx0Y29uc3QgYTIxID0gYWVbIDEgXSwgYTIyID0gYWVbIDQgXSwgYTIzID0gYWVbIDcgXTtcclxuXHRcdGNvbnN0IGEzMSA9IGFlWyAyIF0sIGEzMiA9IGFlWyA1IF0sIGEzMyA9IGFlWyA4IF07XHJcblxyXG5cdFx0Y29uc3QgYjExID0gYmVbIDAgXSwgYjEyID0gYmVbIDMgXSwgYjEzID0gYmVbIDYgXTtcclxuXHRcdGNvbnN0IGIyMSA9IGJlWyAxIF0sIGIyMiA9IGJlWyA0IF0sIGIyMyA9IGJlWyA3IF07XHJcblx0XHRjb25zdCBiMzEgPSBiZVsgMiBdLCBiMzIgPSBiZVsgNSBdLCBiMzMgPSBiZVsgOCBdO1xyXG5cclxuXHRcdHRlWyAwIF0gPSBhMTEgKiBiMTEgKyBhMTIgKiBiMjEgKyBhMTMgKiBiMzE7XHJcblx0XHR0ZVsgMyBdID0gYTExICogYjEyICsgYTEyICogYjIyICsgYTEzICogYjMyO1xyXG5cdFx0dGVbIDYgXSA9IGExMSAqIGIxMyArIGExMiAqIGIyMyArIGExMyAqIGIzMztcclxuXHJcblx0XHR0ZVsgMSBdID0gYTIxICogYjExICsgYTIyICogYjIxICsgYTIzICogYjMxO1xyXG5cdFx0dGVbIDQgXSA9IGEyMSAqIGIxMiArIGEyMiAqIGIyMiArIGEyMyAqIGIzMjtcclxuXHRcdHRlWyA3IF0gPSBhMjEgKiBiMTMgKyBhMjIgKiBiMjMgKyBhMjMgKiBiMzM7XHJcblxyXG5cdFx0dGVbIDIgXSA9IGEzMSAqIGIxMSArIGEzMiAqIGIyMSArIGEzMyAqIGIzMTtcclxuXHRcdHRlWyA1IF0gPSBhMzEgKiBiMTIgKyBhMzIgKiBiMjIgKyBhMzMgKiBiMzI7XHJcblx0XHR0ZVsgOCBdID0gYTMxICogYjEzICsgYTMyICogYjIzICsgYTMzICogYjMzO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE11bHRpcGxpZXMgZXZlcnkgY29tcG9uZW50IG9mIHRoZSBtYXRyaXggYnkgdGhlIGdpdmVuIHNjYWxhci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzIC0gVGhlIHNjYWxhci5cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXgzfSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRtdWx0aXBseVNjYWxhciggcyApIHtcclxuXHJcblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XHJcblxyXG5cdFx0dGVbIDAgXSAqPSBzOyB0ZVsgMyBdICo9IHM7IHRlWyA2IF0gKj0gcztcclxuXHRcdHRlWyAxIF0gKj0gczsgdGVbIDQgXSAqPSBzOyB0ZVsgNyBdICo9IHM7XHJcblx0XHR0ZVsgMiBdICo9IHM7IHRlWyA1IF0gKj0gczsgdGVbIDggXSAqPSBzO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIGFuZCByZXR1cm5zIHRoZSBkZXRlcm1pbmFudCBvZiB0aGlzIG1hdHJpeC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGRldGVybWluYW50LlxyXG5cdCAqL1xyXG5cdGRldGVybWluYW50KCkge1xyXG5cclxuXHRcdGNvbnN0IHRlID0gdGhpcy5lbGVtZW50cztcclxuXHJcblx0XHRjb25zdCBhID0gdGVbIDAgXSwgYiA9IHRlWyAxIF0sIGMgPSB0ZVsgMiBdLFxyXG5cdFx0XHRkID0gdGVbIDMgXSwgZSA9IHRlWyA0IF0sIGYgPSB0ZVsgNSBdLFxyXG5cdFx0XHRnID0gdGVbIDYgXSwgaCA9IHRlWyA3IF0sIGkgPSB0ZVsgOCBdO1xyXG5cclxuXHRcdHJldHVybiBhICogZSAqIGkgLSBhICogZiAqIGggLSBiICogZCAqIGkgKyBiICogZiAqIGcgKyBjICogZCAqIGggLSBjICogZSAqIGc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW52ZXJ0cyB0aGlzIG1hdHJpeCwgdXNpbmcgdGhlIFthbmFseXRpYyBtZXRob2Rde0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0ludmVydGlibGVfbWF0cml4I0FuYWx5dGljX3NvbHV0aW9ufS5cclxuXHQgKiBZb3UgY2FuIG5vdCBpbnZlcnQgd2l0aCBhIGRldGVybWluYW50IG9mIHplcm8uIElmIHlvdSBhdHRlbXB0IHRoaXMsIHRoZSBtZXRob2QgcHJvZHVjZXNcclxuXHQgKiBhIHplcm8gbWF0cml4IGluc3RlYWQuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtNYXRyaXgzfSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRpbnZlcnQoKSB7XHJcblxyXG5cdFx0Y29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzLFxyXG5cclxuXHRcdFx0bjExID0gdGVbIDAgXSwgbjIxID0gdGVbIDEgXSwgbjMxID0gdGVbIDIgXSxcclxuXHRcdFx0bjEyID0gdGVbIDMgXSwgbjIyID0gdGVbIDQgXSwgbjMyID0gdGVbIDUgXSxcclxuXHRcdFx0bjEzID0gdGVbIDYgXSwgbjIzID0gdGVbIDcgXSwgbjMzID0gdGVbIDggXSxcclxuXHJcblx0XHRcdHQxMSA9IG4zMyAqIG4yMiAtIG4zMiAqIG4yMyxcclxuXHRcdFx0dDEyID0gbjMyICogbjEzIC0gbjMzICogbjEyLFxyXG5cdFx0XHR0MTMgPSBuMjMgKiBuMTIgLSBuMjIgKiBuMTMsXHJcblxyXG5cdFx0XHRkZXQgPSBuMTEgKiB0MTEgKyBuMjEgKiB0MTIgKyBuMzEgKiB0MTM7XHJcblxyXG5cdFx0aWYgKCBkZXQgPT09IDAgKSByZXR1cm4gdGhpcy5zZXQoIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgKTtcclxuXHJcblx0XHRjb25zdCBkZXRJbnYgPSAxIC8gZGV0O1xyXG5cclxuXHRcdHRlWyAwIF0gPSB0MTEgKiBkZXRJbnY7XHJcblx0XHR0ZVsgMSBdID0gKCBuMzEgKiBuMjMgLSBuMzMgKiBuMjEgKSAqIGRldEludjtcclxuXHRcdHRlWyAyIF0gPSAoIG4zMiAqIG4yMSAtIG4zMSAqIG4yMiApICogZGV0SW52O1xyXG5cclxuXHRcdHRlWyAzIF0gPSB0MTIgKiBkZXRJbnY7XHJcblx0XHR0ZVsgNCBdID0gKCBuMzMgKiBuMTEgLSBuMzEgKiBuMTMgKSAqIGRldEludjtcclxuXHRcdHRlWyA1IF0gPSAoIG4zMSAqIG4xMiAtIG4zMiAqIG4xMSApICogZGV0SW52O1xyXG5cclxuXHRcdHRlWyA2IF0gPSB0MTMgKiBkZXRJbnY7XHJcblx0XHR0ZVsgNyBdID0gKCBuMjEgKiBuMTMgLSBuMjMgKiBuMTEgKSAqIGRldEludjtcclxuXHRcdHRlWyA4IF0gPSAoIG4yMiAqIG4xMSAtIG4yMSAqIG4xMiApICogZGV0SW52O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRyYW5zcG9zZXMgdGhpcyBtYXRyaXggaW4gcGxhY2UuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtNYXRyaXgzfSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHR0cmFuc3Bvc2UoKSB7XHJcblxyXG5cdFx0bGV0IHRtcDtcclxuXHRcdGNvbnN0IG0gPSB0aGlzLmVsZW1lbnRzO1xyXG5cclxuXHRcdHRtcCA9IG1bIDEgXTsgbVsgMSBdID0gbVsgMyBdOyBtWyAzIF0gPSB0bXA7XHJcblx0XHR0bXAgPSBtWyAyIF07IG1bIDIgXSA9IG1bIDYgXTsgbVsgNiBdID0gdG1wO1xyXG5cdFx0dG1wID0gbVsgNSBdOyBtWyA1IF0gPSBtWyA3IF07IG1bIDcgXSA9IHRtcDtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB0aGUgbm9ybWFsIG1hdHJpeCB3aGljaCBpcyB0aGUgaW52ZXJzZSB0cmFuc3Bvc2Ugb2YgdGhlIHVwcGVyXHJcblx0ICogbGVmdCAzeDMgcG9ydGlvbiBvZiB0aGUgZ2l2ZW4gNHg0IG1hdHJpeC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4NH0gbWF0cml4NCAtIFRoZSA0eDQgbWF0cml4LlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdGdldE5vcm1hbE1hdHJpeCggbWF0cml4NCApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5zZXRGcm9tTWF0cml4NCggbWF0cml4NCApLmludmVydCgpLnRyYW5zcG9zZSgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRyYW5zcG9zZXMgdGhpcyBtYXRyaXggaW50byB0aGUgc3VwcGxpZWQgYXJyYXksIGFuZCByZXR1cm5zIGl0c2VsZiB1bmNoYW5nZWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IHIgLSBBbiBhcnJheSB0byBzdG9yZSB0aGUgdHJhbnNwb3NlZCBtYXRyaXggZWxlbWVudHMuXHJcblx0ICogQHJldHVybiB7TWF0cml4M30gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0dHJhbnNwb3NlSW50b0FycmF5KCByICkge1xyXG5cclxuXHRcdGNvbnN0IG0gPSB0aGlzLmVsZW1lbnRzO1xyXG5cclxuXHRcdHJbIDAgXSA9IG1bIDAgXTtcclxuXHRcdHJbIDEgXSA9IG1bIDMgXTtcclxuXHRcdHJbIDIgXSA9IG1bIDYgXTtcclxuXHRcdHJbIDMgXSA9IG1bIDEgXTtcclxuXHRcdHJbIDQgXSA9IG1bIDQgXTtcclxuXHRcdHJbIDUgXSA9IG1bIDcgXTtcclxuXHRcdHJbIDYgXSA9IG1bIDIgXTtcclxuXHRcdHJbIDcgXSA9IG1bIDUgXTtcclxuXHRcdHJbIDggXSA9IG1bIDggXTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBVViB0cmFuc2Zvcm0gbWF0cml4IGZyb20gb2Zmc2V0LCByZXBlYXQsIHJvdGF0aW9uLCBhbmQgY2VudGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHR4IC0gT2Zmc2V0IHguXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHR5IC0gT2Zmc2V0IHkuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHN4IC0gUmVwZWF0IHguXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHN5IC0gUmVwZWF0IHkuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHJvdGF0aW9uIC0gUm90YXRpb24sIGluIHJhZGlhbnMuIFBvc2l0aXZlIHZhbHVlcyByb3RhdGUgY291bnRlcmNsb2Nrd2lzZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gY3ggLSBDZW50ZXIgeCBvZiByb3RhdGlvbi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gY3kgLSBDZW50ZXIgeSBvZiByb3RhdGlvblxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdHNldFV2VHJhbnNmb3JtKCB0eCwgdHksIHN4LCBzeSwgcm90YXRpb24sIGN4LCBjeSApIHtcclxuXHJcblx0XHRjb25zdCBjID0gTWF0aC5jb3MoIHJvdGF0aW9uICk7XHJcblx0XHRjb25zdCBzID0gTWF0aC5zaW4oIHJvdGF0aW9uICk7XHJcblxyXG5cdFx0dGhpcy5zZXQoXHJcblx0XHRcdHN4ICogYywgc3ggKiBzLCAtIHN4ICogKCBjICogY3ggKyBzICogY3kgKSArIGN4ICsgdHgsXHJcblx0XHRcdC0gc3kgKiBzLCBzeSAqIGMsIC0gc3kgKiAoIC0gcyAqIGN4ICsgYyAqIGN5ICkgKyBjeSArIHR5LFxyXG5cdFx0XHQwLCAwLCAxXHJcblx0XHQpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNjYWxlcyB0aGlzIG1hdHJpeCB3aXRoIHRoZSBnaXZlbiBzY2FsYXIgdmFsdWVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHN4IC0gVGhlIGFtb3VudCB0byBzY2FsZSBpbiB0aGUgWCBheGlzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzeSAtIFRoZSBhbW91bnQgdG8gc2NhbGUgaW4gdGhlIFkgYXhpcy5cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXgzfSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRzY2FsZSggc3gsIHN5ICkge1xyXG5cclxuXHRcdHRoaXMucHJlbXVsdGlwbHkoIF9tMy5tYWtlU2NhbGUoIHN4LCBzeSApICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUm90YXRlcyB0aGlzIG1hdHJpeCBieSB0aGUgZ2l2ZW4gYW5nbGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdGhldGEgLSBUaGUgcm90YXRpb24gaW4gcmFkaWFucy5cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXgzfSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRyb3RhdGUoIHRoZXRhICkge1xyXG5cclxuXHRcdHRoaXMucHJlbXVsdGlwbHkoIF9tMy5tYWtlUm90YXRpb24oIC0gdGhldGEgKSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRyYW5zbGF0ZXMgdGhpcyBtYXRyaXggYnkgdGhlIGdpdmVuIHNjYWxhciB2YWx1ZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdHggLSBUaGUgYW1vdW50IHRvIHRyYW5zbGF0ZSBpbiB0aGUgWCBheGlzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0eSAtIFRoZSBhbW91bnQgdG8gdHJhbnNsYXRlIGluIHRoZSBZIGF4aXMuXHJcblx0ICogQHJldHVybiB7TWF0cml4M30gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0dHJhbnNsYXRlKCB0eCwgdHkgKSB7XHJcblxyXG5cdFx0dGhpcy5wcmVtdWx0aXBseSggX20zLm1ha2VUcmFuc2xhdGlvbiggdHgsIHR5ICkgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvLyBmb3IgMkQgVHJhbnNmb3Jtc1xyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoaXMgbWF0cml4IGFzIGEgMkQgdHJhbnNsYXRpb24gdHJhbnNmb3JtLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ8VmVjdG9yMn0geCAtIFRoZSBhbW91bnQgdG8gdHJhbnNsYXRlIGluIHRoZSBYIGF4aXMgb3IgYWx0ZXJuYXRpdmVseSBhIHRyYW5zbGF0aW9uIHZlY3Rvci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSBhbW91bnQgdG8gdHJhbnNsYXRlIGluIHRoZSBZIGF4aXMuXHJcblx0ICogQHJldHVybiB7TWF0cml4M30gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0bWFrZVRyYW5zbGF0aW9uKCB4LCB5ICkge1xyXG5cclxuXHRcdGlmICggeC5pc1ZlY3RvcjIgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnNldChcclxuXHJcblx0XHRcdFx0MSwgMCwgeC54LFxyXG5cdFx0XHRcdDAsIDEsIHgueSxcclxuXHRcdFx0XHQwLCAwLCAxXHJcblxyXG5cdFx0XHQpO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR0aGlzLnNldChcclxuXHJcblx0XHRcdFx0MSwgMCwgeCxcclxuXHRcdFx0XHQwLCAxLCB5LFxyXG5cdFx0XHRcdDAsIDAsIDFcclxuXHJcblx0XHRcdCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhpcyBtYXRyaXggYXMgYSAyRCByb3RhdGlvbmFsIHRyYW5zZm9ybWF0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHRoZXRhIC0gVGhlIHJvdGF0aW9uIGluIHJhZGlhbnMuXHJcblx0ICogQHJldHVybiB7TWF0cml4M30gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0bWFrZVJvdGF0aW9uKCB0aGV0YSApIHtcclxuXHJcblx0XHQvLyBjb3VudGVyY2xvY2t3aXNlXHJcblxyXG5cdFx0Y29uc3QgYyA9IE1hdGguY29zKCB0aGV0YSApO1xyXG5cdFx0Y29uc3QgcyA9IE1hdGguc2luKCB0aGV0YSApO1xyXG5cclxuXHRcdHRoaXMuc2V0KFxyXG5cclxuXHRcdFx0YywgLSBzLCAwLFxyXG5cdFx0XHRzLCBjLCAwLFxyXG5cdFx0XHQwLCAwLCAxXHJcblxyXG5cdFx0KTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoaXMgbWF0cml4IGFzIGEgMkQgc2NhbGUgdHJhbnNmb3JtLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgYW1vdW50IHRvIHNjYWxlIGluIHRoZSBYIGF4aXMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgYW1vdW50IHRvIHNjYWxlIGluIHRoZSBZIGF4aXMuXHJcblx0ICogQHJldHVybiB7TWF0cml4M30gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0bWFrZVNjYWxlKCB4LCB5ICkge1xyXG5cclxuXHRcdHRoaXMuc2V0KFxyXG5cclxuXHRcdFx0eCwgMCwgMCxcclxuXHRcdFx0MCwgeSwgMCxcclxuXHRcdFx0MCwgMCwgMVxyXG5cclxuXHRcdCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBtYXRyaXggaXMgZXF1YWwgd2l0aCB0aGUgZ2l2ZW4gb25lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRyaXgzfSBtYXRyaXggLSBUaGUgbWF0cml4IHRvIHRlc3QgZm9yIGVxdWFsaXR5LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyBtYXRyaXggaXMgZXF1YWwgd2l0aCB0aGUgZ2l2ZW4gb25lLlxyXG5cdCAqL1xyXG5cdGVxdWFscyggbWF0cml4ICkge1xyXG5cclxuXHRcdGNvbnN0IHRlID0gdGhpcy5lbGVtZW50cztcclxuXHRcdGNvbnN0IG1lID0gbWF0cml4LmVsZW1lbnRzO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDk7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHRlWyBpIF0gIT09IG1lWyBpIF0gKSByZXR1cm4gZmFsc2U7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGVsZW1lbnRzIG9mIHRoZSBtYXRyaXggZnJvbSB0aGUgZ2l2ZW4gYXJyYXkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IGFycmF5IC0gVGhlIG1hdHJpeCBlbGVtZW50cyBpbiBjb2x1bW4tbWFqb3Igb3JkZXIuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXQ9MF0gLSBJbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgYXJyYXkuXHJcblx0ICogQHJldHVybiB7TWF0cml4M30gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0ZnJvbUFycmF5KCBhcnJheSwgb2Zmc2V0ID0gMCApIHtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCA5OyBpICsrICkge1xyXG5cclxuXHRcdFx0dGhpcy5lbGVtZW50c1sgaSBdID0gYXJyYXlbIGkgKyBvZmZzZXQgXTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogV3JpdGVzIHRoZSBlbGVtZW50cyBvZiB0aGlzIG1hdHJpeCB0byB0aGUgZ2l2ZW4gYXJyYXkuIElmIG5vIGFycmF5IGlzIHByb3ZpZGVkLFxyXG5cdCAqIHRoZSBtZXRob2QgcmV0dXJucyBhIG5ldyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gW2FycmF5PVtdXSAtIFRoZSB0YXJnZXQgYXJyYXkgaG9sZGluZyB0aGUgbWF0cml4IGVsZW1lbnRzIGluIGNvbHVtbi1tYWpvciBvcmRlci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW29mZnNldD0wXSAtIEluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBhcnJheS5cclxuXHQgKiBAcmV0dXJuIHtBcnJheTxudW1iZXI+fSBUaGUgbWF0cml4IGVsZW1lbnRzIGluIGNvbHVtbi1tYWpvciBvcmRlci5cclxuXHQgKi9cclxuXHR0b0FycmF5KCBhcnJheSA9IFtdLCBvZmZzZXQgPSAwICkge1xyXG5cclxuXHRcdGNvbnN0IHRlID0gdGhpcy5lbGVtZW50cztcclxuXHJcblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0ZVsgMCBdO1xyXG5cdFx0YXJyYXlbIG9mZnNldCArIDEgXSA9IHRlWyAxIF07XHJcblx0XHRhcnJheVsgb2Zmc2V0ICsgMiBdID0gdGVbIDIgXTtcclxuXHJcblx0XHRhcnJheVsgb2Zmc2V0ICsgMyBdID0gdGVbIDMgXTtcclxuXHRcdGFycmF5WyBvZmZzZXQgKyA0IF0gPSB0ZVsgNCBdO1xyXG5cdFx0YXJyYXlbIG9mZnNldCArIDUgXSA9IHRlWyA1IF07XHJcblxyXG5cdFx0YXJyYXlbIG9mZnNldCArIDYgXSA9IHRlWyA2IF07XHJcblx0XHRhcnJheVsgb2Zmc2V0ICsgNyBdID0gdGVbIDcgXTtcclxuXHRcdGFycmF5WyBvZmZzZXQgKyA4IF0gPSB0ZVsgOCBdO1xyXG5cclxuXHRcdHJldHVybiBhcnJheTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbWF0cml4IHdpdGggY29waWVkIHZhbHVlcyBmcm9tIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtNYXRyaXgzfSBBIGNsb25lIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y2xvbmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuZnJvbUFycmF5KCB0aGlzLmVsZW1lbnRzICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmNvbnN0IF9tMyA9IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDMoKTtcclxuXHJcbmV4cG9ydCB7IE1hdHJpeDMgfTtcclxuIiwiZnVuY3Rpb24gYXJyYXlNaW4oIGFycmF5ICkge1xyXG5cclxuXHRpZiAoIGFycmF5Lmxlbmd0aCA9PT0gMCApIHJldHVybiBJbmZpbml0eTtcclxuXHJcblx0bGV0IG1pbiA9IGFycmF5WyAwIF07XHJcblxyXG5cdGZvciAoIGxldCBpID0gMSwgbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGw7ICsrIGkgKSB7XHJcblxyXG5cdFx0aWYgKCBhcnJheVsgaSBdIDwgbWluICkgbWluID0gYXJyYXlbIGkgXTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gbWluO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gYXJyYXlNYXgoIGFycmF5ICkge1xyXG5cclxuXHRpZiAoIGFycmF5Lmxlbmd0aCA9PT0gMCApIHJldHVybiAtIEluZmluaXR5O1xyXG5cclxuXHRsZXQgbWF4ID0gYXJyYXlbIDAgXTtcclxuXHJcblx0Zm9yICggbGV0IGkgPSAxLCBsID0gYXJyYXkubGVuZ3RoOyBpIDwgbDsgKysgaSApIHtcclxuXHJcblx0XHRpZiAoIGFycmF5WyBpIF0gPiBtYXggKSBtYXggPSBhcnJheVsgaSBdO1xyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiBtYXg7XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBhcnJheU5lZWRzVWludDMyKCBhcnJheSApIHtcclxuXHJcblx0Ly8gYXNzdW1lcyBsYXJnZXIgdmFsdWVzIHVzdWFsbHkgb24gbGFzdFxyXG5cclxuXHRmb3IgKCBsZXQgaSA9IGFycmF5Lmxlbmd0aCAtIDE7IGkgPj0gMDsgLS0gaSApIHtcclxuXHJcblx0XHRpZiAoIGFycmF5WyBpIF0gPj0gNjU1MzUgKSByZXR1cm4gdHJ1ZTsgLy8gYWNjb3VudCBmb3IgUFJJTUlUSVZFX1JFU1RBUlRfRklYRURfSU5ERVgsICMyNDU2NVxyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiBmYWxzZTtcclxuXHJcbn1cclxuXHJcbmNvbnN0IFRZUEVEX0FSUkFZUyA9IHtcclxuXHRJbnQ4QXJyYXk6IEludDhBcnJheSxcclxuXHRVaW50OEFycmF5OiBVaW50OEFycmF5LFxyXG5cdFVpbnQ4Q2xhbXBlZEFycmF5OiBVaW50OENsYW1wZWRBcnJheSxcclxuXHRJbnQxNkFycmF5OiBJbnQxNkFycmF5LFxyXG5cdFVpbnQxNkFycmF5OiBVaW50MTZBcnJheSxcclxuXHRJbnQzMkFycmF5OiBJbnQzMkFycmF5LFxyXG5cdFVpbnQzMkFycmF5OiBVaW50MzJBcnJheSxcclxuXHRGbG9hdDMyQXJyYXk6IEZsb2F0MzJBcnJheSxcclxuXHRGbG9hdDY0QXJyYXk6IEZsb2F0NjRBcnJheVxyXG59O1xyXG5cclxuZnVuY3Rpb24gZ2V0VHlwZWRBcnJheSggdHlwZSwgYnVmZmVyICkge1xyXG5cclxuXHRyZXR1cm4gbmV3IFRZUEVEX0FSUkFZU1sgdHlwZSBdKCBidWZmZXIgKTtcclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnROUyggbmFtZSApIHtcclxuXHJcblx0cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyggJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnLCBuYW1lICk7XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVDYW52YXNFbGVtZW50KCkge1xyXG5cclxuXHRjb25zdCBjYW52YXMgPSBjcmVhdGVFbGVtZW50TlMoICdjYW52YXMnICk7XHJcblx0Y2FudmFzLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG5cdHJldHVybiBjYW52YXM7XHJcblxyXG59XHJcblxyXG5jb25zdCBfY2FjaGUgPSB7fTtcclxuXHJcbmZ1bmN0aW9uIHdhcm5PbmNlKCBtZXNzYWdlICkge1xyXG5cclxuXHRpZiAoIG1lc3NhZ2UgaW4gX2NhY2hlICkgcmV0dXJuO1xyXG5cclxuXHRfY2FjaGVbIG1lc3NhZ2UgXSA9IHRydWU7XHJcblxyXG5cdGNvbnNvbGUud2FybiggbWVzc2FnZSApO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gcHJvYmVBc3luYyggZ2wsIHN5bmMsIGludGVydmFsICkge1xyXG5cclxuXHRyZXR1cm4gbmV3IFByb21pc2UoIGZ1bmN0aW9uICggcmVzb2x2ZSwgcmVqZWN0ICkge1xyXG5cclxuXHRcdGZ1bmN0aW9uIHByb2JlKCkge1xyXG5cclxuXHRcdFx0c3dpdGNoICggZ2wuY2xpZW50V2FpdFN5bmMoIHN5bmMsIGdsLlNZTkNfRkxVU0hfQ09NTUFORFNfQklULCAwICkgKSB7XHJcblxyXG5cdFx0XHRcdGNhc2UgZ2wuV0FJVF9GQUlMRUQ6XHJcblx0XHRcdFx0XHRyZWplY3QoKTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRjYXNlIGdsLlRJTUVPVVRfRVhQSVJFRDpcclxuXHRcdFx0XHRcdHNldFRpbWVvdXQoIHByb2JlLCBpbnRlcnZhbCApO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0XHRyZXNvbHZlKCk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHNldFRpbWVvdXQoIHByb2JlLCBpbnRlcnZhbCApO1xyXG5cclxuXHR9ICk7XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiB0b05vcm1hbGl6ZWRQcm9qZWN0aW9uTWF0cml4KCBwcm9qZWN0aW9uTWF0cml4ICkge1xyXG5cclxuXHRjb25zdCBtID0gcHJvamVjdGlvbk1hdHJpeC5lbGVtZW50cztcclxuXHJcblx0Ly8gQ29udmVydCBbLTEsIDFdIHRvIFswLCAxXSBwcm9qZWN0aW9uIG1hdHJpeFxyXG5cdG1bIDIgXSA9IDAuNSAqIG1bIDIgXSArIDAuNSAqIG1bIDMgXTtcclxuXHRtWyA2IF0gPSAwLjUgKiBtWyA2IF0gKyAwLjUgKiBtWyA3IF07XHJcblx0bVsgMTAgXSA9IDAuNSAqIG1bIDEwIF0gKyAwLjUgKiBtWyAxMSBdO1xyXG5cdG1bIDE0IF0gPSAwLjUgKiBtWyAxNCBdICsgMC41ICogbVsgMTUgXTtcclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHRvUmV2ZXJzZWRQcm9qZWN0aW9uTWF0cml4KCBwcm9qZWN0aW9uTWF0cml4ICkge1xyXG5cclxuXHRjb25zdCBtID0gcHJvamVjdGlvbk1hdHJpeC5lbGVtZW50cztcclxuXHRjb25zdCBpc1BlcnNwZWN0aXZlTWF0cml4ID0gbVsgMTEgXSA9PT0gLSAxO1xyXG5cclxuXHQvLyBSZXZlcnNlIFswLCAxXSBwcm9qZWN0aW9uIG1hdHJpeFxyXG5cdGlmICggaXNQZXJzcGVjdGl2ZU1hdHJpeCApIHtcclxuXHJcblx0XHRtWyAxMCBdID0gLSBtWyAxMCBdIC0gMTtcclxuXHRcdG1bIDE0IF0gPSAtIG1bIDE0IF07XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0bVsgMTAgXSA9IC0gbVsgMTAgXTtcclxuXHRcdG1bIDE0IF0gPSAtIG1bIDE0IF0gKyAxO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBhcnJheU1pbiwgYXJyYXlNYXgsIGFycmF5TmVlZHNVaW50MzIsIGdldFR5cGVkQXJyYXksIGNyZWF0ZUVsZW1lbnROUywgY3JlYXRlQ2FudmFzRWxlbWVudCwgd2Fybk9uY2UsIHByb2JlQXN5bmMsIHRvTm9ybWFsaXplZFByb2plY3Rpb25NYXRyaXgsIHRvUmV2ZXJzZWRQcm9qZWN0aW9uTWF0cml4IH07XHJcbiIsImltcG9ydCB7IFNSR0JDb2xvclNwYWNlLCBMaW5lYXJTUkdCQ29sb3JTcGFjZSwgU1JHQlRyYW5zZmVyLCBMaW5lYXJUcmFuc2ZlciwgTm9Db2xvclNwYWNlIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgTWF0cml4MyB9IGZyb20gJy4vTWF0cml4My5qcyc7XHJcblxyXG5jb25zdCBMSU5FQVJfUkVDNzA5X1RPX1hZWiA9IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDMoKS5zZXQoXHJcblx0MC40MTIzOTA4LCAwLjM1NzU4NDMsIDAuMTgwNDgwOCxcclxuXHQwLjIxMjYzOTAsIDAuNzE1MTY4NywgMC4wNzIxOTIzLFxyXG5cdDAuMDE5MzMwOCwgMC4xMTkxOTQ4LCAwLjk1MDUzMjJcclxuKTtcclxuXHJcbmNvbnN0IFhZWl9UT19MSU5FQVJfUkVDNzA5ID0gLypAX19QVVJFX18qLyBuZXcgTWF0cml4MygpLnNldChcclxuXHQzLjI0MDk2OTksIC0gMS41MzczODMyLCAtIDAuNDk4NjEwOCxcclxuXHQtIDAuOTY5MjQzNiwgMS44NzU5Njc1LCAwLjA0MTU1NTEsXHJcblx0MC4wNTU2MzAxLCAtIDAuMjAzOTc3MCwgMS4wNTY5NzE1XHJcbik7XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVDb2xvck1hbmFnZW1lbnQoKSB7XHJcblxyXG5cdGNvbnN0IENvbG9yTWFuYWdlbWVudCA9IHtcclxuXHJcblx0XHRlbmFibGVkOiB0cnVlLFxyXG5cclxuXHRcdHdvcmtpbmdDb2xvclNwYWNlOiBMaW5lYXJTUkdCQ29sb3JTcGFjZSxcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEltcGxlbWVudGF0aW9ucyBvZiBzdXBwb3J0ZWQgY29sb3Igc3BhY2VzLlxyXG5cdFx0ICpcclxuXHRcdCAqIFJlcXVpcmVkOlxyXG5cdFx0ICpcdC0gcHJpbWFyaWVzOiBjaHJvbWF0aWNpdHkgY29vcmRpbmF0ZXMgWyByeCByeSBneCBneSBieCBieSBdXHJcblx0XHQgKlx0LSB3aGl0ZVBvaW50OiByZWZlcmVuY2Ugd2hpdGUgWyB4IHkgXVxyXG5cdFx0ICpcdC0gdHJhbnNmZXI6IHRyYW5zZmVyIGZ1bmN0aW9uIChwcmUtZGVmaW5lZClcclxuXHRcdCAqXHQtIHRvWFlaOiBNYXRyaXgzIFJHQiB0byBYWVogdHJhbnNmb3JtXHJcblx0XHQgKlx0LSBmcm9tWFlaOiBNYXRyaXgzIFhZWiB0byBSR0IgdHJhbnNmb3JtXHJcblx0XHQgKlx0LSBsdW1pbmFuY2VDb2VmZmljaWVudHM6IFJHQiBsdW1pbmFuY2UgY29lZmZpY2llbnRzXHJcblx0XHQgKlxyXG5cdFx0ICogT3B0aW9uYWw6XHJcblx0XHQgKiAgLSBvdXRwdXRDb2xvclNwYWNlQ29uZmlnOiB7IGRyYXdpbmdCdWZmZXJDb2xvclNwYWNlOiBDb2xvclNwYWNlIH1cclxuXHRcdCAqICAtIHdvcmtpbmdDb2xvclNwYWNlQ29uZmlnOiB7IHVucGFja0NvbG9yU3BhY2U6IENvbG9yU3BhY2UgfVxyXG5cdFx0ICpcclxuXHRcdCAqIFJlZmVyZW5jZTpcclxuXHRcdCAqIC0gaHR0cHM6Ly93d3cucnVzc2VsbGNvdHRyZWxsLmNvbS9waG90by9tYXRyaXhDYWxjdWxhdG9yLmh0bVxyXG5cdFx0ICovXHJcblx0XHRzcGFjZXM6IHt9LFxyXG5cclxuXHRcdGNvbnZlcnQ6IGZ1bmN0aW9uICggY29sb3IsIHNvdXJjZUNvbG9yU3BhY2UsIHRhcmdldENvbG9yU3BhY2UgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMuZW5hYmxlZCA9PT0gZmFsc2UgfHwgc291cmNlQ29sb3JTcGFjZSA9PT0gdGFyZ2V0Q29sb3JTcGFjZSB8fCAhIHNvdXJjZUNvbG9yU3BhY2UgfHwgISB0YXJnZXRDb2xvclNwYWNlICkge1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gY29sb3I7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMuc3BhY2VzWyBzb3VyY2VDb2xvclNwYWNlIF0udHJhbnNmZXIgPT09IFNSR0JUcmFuc2ZlciApIHtcclxuXHJcblx0XHRcdFx0Y29sb3IuciA9IFNSR0JUb0xpbmVhciggY29sb3IuciApO1xyXG5cdFx0XHRcdGNvbG9yLmcgPSBTUkdCVG9MaW5lYXIoIGNvbG9yLmcgKTtcclxuXHRcdFx0XHRjb2xvci5iID0gU1JHQlRvTGluZWFyKCBjb2xvci5iICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMuc3BhY2VzWyBzb3VyY2VDb2xvclNwYWNlIF0ucHJpbWFyaWVzICE9PSB0aGlzLnNwYWNlc1sgdGFyZ2V0Q29sb3JTcGFjZSBdLnByaW1hcmllcyApIHtcclxuXHJcblx0XHRcdFx0Y29sb3IuYXBwbHlNYXRyaXgzKCB0aGlzLnNwYWNlc1sgc291cmNlQ29sb3JTcGFjZSBdLnRvWFlaICk7XHJcblx0XHRcdFx0Y29sb3IuYXBwbHlNYXRyaXgzKCB0aGlzLnNwYWNlc1sgdGFyZ2V0Q29sb3JTcGFjZSBdLmZyb21YWVogKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggdGhpcy5zcGFjZXNbIHRhcmdldENvbG9yU3BhY2UgXS50cmFuc2ZlciA9PT0gU1JHQlRyYW5zZmVyICkge1xyXG5cclxuXHRcdFx0XHRjb2xvci5yID0gTGluZWFyVG9TUkdCKCBjb2xvci5yICk7XHJcblx0XHRcdFx0Y29sb3IuZyA9IExpbmVhclRvU1JHQiggY29sb3IuZyApO1xyXG5cdFx0XHRcdGNvbG9yLmIgPSBMaW5lYXJUb1NSR0IoIGNvbG9yLmIgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBjb2xvcjtcclxuXHJcblx0XHR9LFxyXG5cclxuXHRcdGZyb21Xb3JraW5nQ29sb3JTcGFjZTogZnVuY3Rpb24gKCBjb2xvciwgdGFyZ2V0Q29sb3JTcGFjZSApIHtcclxuXHJcblx0XHRcdHJldHVybiB0aGlzLmNvbnZlcnQoIGNvbG9yLCB0aGlzLndvcmtpbmdDb2xvclNwYWNlLCB0YXJnZXRDb2xvclNwYWNlICk7XHJcblxyXG5cdFx0fSxcclxuXHJcblx0XHR0b1dvcmtpbmdDb2xvclNwYWNlOiBmdW5jdGlvbiAoIGNvbG9yLCBzb3VyY2VDb2xvclNwYWNlICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIHRoaXMuY29udmVydCggY29sb3IsIHNvdXJjZUNvbG9yU3BhY2UsIHRoaXMud29ya2luZ0NvbG9yU3BhY2UgKTtcclxuXHJcblx0XHR9LFxyXG5cclxuXHRcdGdldFByaW1hcmllczogZnVuY3Rpb24gKCBjb2xvclNwYWNlICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIHRoaXMuc3BhY2VzWyBjb2xvclNwYWNlIF0ucHJpbWFyaWVzO1xyXG5cclxuXHRcdH0sXHJcblxyXG5cdFx0Z2V0VHJhbnNmZXI6IGZ1bmN0aW9uICggY29sb3JTcGFjZSApIHtcclxuXHJcblx0XHRcdGlmICggY29sb3JTcGFjZSA9PT0gTm9Db2xvclNwYWNlICkgcmV0dXJuIExpbmVhclRyYW5zZmVyO1xyXG5cclxuXHRcdFx0cmV0dXJuIHRoaXMuc3BhY2VzWyBjb2xvclNwYWNlIF0udHJhbnNmZXI7XHJcblxyXG5cdFx0fSxcclxuXHJcblx0XHRnZXRMdW1pbmFuY2VDb2VmZmljaWVudHM6IGZ1bmN0aW9uICggdGFyZ2V0LCBjb2xvclNwYWNlID0gdGhpcy53b3JraW5nQ29sb3JTcGFjZSApIHtcclxuXHJcblx0XHRcdHJldHVybiB0YXJnZXQuZnJvbUFycmF5KCB0aGlzLnNwYWNlc1sgY29sb3JTcGFjZSBdLmx1bWluYW5jZUNvZWZmaWNpZW50cyApO1xyXG5cclxuXHRcdH0sXHJcblxyXG5cdFx0ZGVmaW5lOiBmdW5jdGlvbiAoIGNvbG9yU3BhY2VzICkge1xyXG5cclxuXHRcdFx0T2JqZWN0LmFzc2lnbiggdGhpcy5zcGFjZXMsIGNvbG9yU3BhY2VzICk7XHJcblxyXG5cdFx0fSxcclxuXHJcblx0XHQvLyBJbnRlcm5hbCBBUElzXHJcblxyXG5cdFx0X2dldE1hdHJpeDogZnVuY3Rpb24gKCB0YXJnZXRNYXRyaXgsIHNvdXJjZUNvbG9yU3BhY2UsIHRhcmdldENvbG9yU3BhY2UgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gdGFyZ2V0TWF0cml4XHJcblx0XHRcdFx0LmNvcHkoIHRoaXMuc3BhY2VzWyBzb3VyY2VDb2xvclNwYWNlIF0udG9YWVogKVxyXG5cdFx0XHRcdC5tdWx0aXBseSggdGhpcy5zcGFjZXNbIHRhcmdldENvbG9yU3BhY2UgXS5mcm9tWFlaICk7XHJcblxyXG5cdFx0fSxcclxuXHJcblx0XHRfZ2V0RHJhd2luZ0J1ZmZlckNvbG9yU3BhY2U6IGZ1bmN0aW9uICggY29sb3JTcGFjZSApIHtcclxuXHJcblx0XHRcdHJldHVybiB0aGlzLnNwYWNlc1sgY29sb3JTcGFjZSBdLm91dHB1dENvbG9yU3BhY2VDb25maWcuZHJhd2luZ0J1ZmZlckNvbG9yU3BhY2U7XHJcblxyXG5cdFx0fSxcclxuXHJcblx0XHRfZ2V0VW5wYWNrQ29sb3JTcGFjZTogZnVuY3Rpb24gKCBjb2xvclNwYWNlID0gdGhpcy53b3JraW5nQ29sb3JTcGFjZSApIHtcclxuXHJcblx0XHRcdHJldHVybiB0aGlzLnNwYWNlc1sgY29sb3JTcGFjZSBdLndvcmtpbmdDb2xvclNwYWNlQ29uZmlnLnVucGFja0NvbG9yU3BhY2U7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9O1xyXG5cclxuXHQvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcblx0ICogc1JHQiBkZWZpbml0aW9uc1xyXG5cdCAqL1xyXG5cclxuXHRjb25zdCBSRUM3MDlfUFJJTUFSSUVTID0gWyAwLjY0MCwgMC4zMzAsIDAuMzAwLCAwLjYwMCwgMC4xNTAsIDAuMDYwIF07XHJcblx0Y29uc3QgUkVDNzA5X0xVTUlOQU5DRV9DT0VGRklDSUVOVFMgPSBbIDAuMjEyNiwgMC43MTUyLCAwLjA3MjIgXTtcclxuXHRjb25zdCBENjUgPSBbIDAuMzEyNywgMC4zMjkwIF07XHJcblxyXG5cdENvbG9yTWFuYWdlbWVudC5kZWZpbmUoIHtcclxuXHJcblx0XHRbIExpbmVhclNSR0JDb2xvclNwYWNlIF06IHtcclxuXHRcdFx0cHJpbWFyaWVzOiBSRUM3MDlfUFJJTUFSSUVTLFxyXG5cdFx0XHR3aGl0ZVBvaW50OiBENjUsXHJcblx0XHRcdHRyYW5zZmVyOiBMaW5lYXJUcmFuc2ZlcixcclxuXHRcdFx0dG9YWVo6IExJTkVBUl9SRUM3MDlfVE9fWFlaLFxyXG5cdFx0XHRmcm9tWFlaOiBYWVpfVE9fTElORUFSX1JFQzcwOSxcclxuXHRcdFx0bHVtaW5hbmNlQ29lZmZpY2llbnRzOiBSRUM3MDlfTFVNSU5BTkNFX0NPRUZGSUNJRU5UUyxcclxuXHRcdFx0d29ya2luZ0NvbG9yU3BhY2VDb25maWc6IHsgdW5wYWNrQ29sb3JTcGFjZTogU1JHQkNvbG9yU3BhY2UgfSxcclxuXHRcdFx0b3V0cHV0Q29sb3JTcGFjZUNvbmZpZzogeyBkcmF3aW5nQnVmZmVyQ29sb3JTcGFjZTogU1JHQkNvbG9yU3BhY2UgfVxyXG5cdFx0fSxcclxuXHJcblx0XHRbIFNSR0JDb2xvclNwYWNlIF06IHtcclxuXHRcdFx0cHJpbWFyaWVzOiBSRUM3MDlfUFJJTUFSSUVTLFxyXG5cdFx0XHR3aGl0ZVBvaW50OiBENjUsXHJcblx0XHRcdHRyYW5zZmVyOiBTUkdCVHJhbnNmZXIsXHJcblx0XHRcdHRvWFlaOiBMSU5FQVJfUkVDNzA5X1RPX1hZWixcclxuXHRcdFx0ZnJvbVhZWjogWFlaX1RPX0xJTkVBUl9SRUM3MDksXHJcblx0XHRcdGx1bWluYW5jZUNvZWZmaWNpZW50czogUkVDNzA5X0xVTUlOQU5DRV9DT0VGRklDSUVOVFMsXHJcblx0XHRcdG91dHB1dENvbG9yU3BhY2VDb25maWc6IHsgZHJhd2luZ0J1ZmZlckNvbG9yU3BhY2U6IFNSR0JDb2xvclNwYWNlIH1cclxuXHRcdH0sXHJcblxyXG5cdH0gKTtcclxuXHJcblx0cmV0dXJuIENvbG9yTWFuYWdlbWVudDtcclxuXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBDb2xvck1hbmFnZW1lbnQgPSAvKkBfX1BVUkVfXyovIGNyZWF0ZUNvbG9yTWFuYWdlbWVudCgpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIFNSR0JUb0xpbmVhciggYyApIHtcclxuXHJcblx0cmV0dXJuICggYyA8IDAuMDQwNDUgKSA/IGMgKiAwLjA3NzM5OTM4MDggOiBNYXRoLnBvdyggYyAqIDAuOTQ3ODY3Mjk4NiArIDAuMDUyMTMyNzAxNCwgMi40ICk7XHJcblxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gTGluZWFyVG9TUkdCKCBjICkge1xyXG5cclxuXHRyZXR1cm4gKCBjIDwgMC4wMDMxMzA4ICkgPyBjICogMTIuOTIgOiAxLjA1NSAqICggTWF0aC5wb3coIGMsIDAuNDE2NjYgKSApIC0gMC4wNTU7XHJcblxyXG59XHJcbiIsImltcG9ydCB7IGNyZWF0ZUVsZW1lbnROUyB9IGZyb20gJy4uL3V0aWxzLmpzJztcclxuaW1wb3J0IHsgU1JHQlRvTGluZWFyIH0gZnJvbSAnLi4vbWF0aC9Db2xvck1hbmFnZW1lbnQuanMnO1xyXG5cclxubGV0IF9jYW52YXM7XHJcblxyXG4vKipcclxuICogQSBjbGFzcyBjb250YWluaW5nIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBpbWFnZXMuXHJcbiAqXHJcbiAqIEBoaWRlY29uc3RydWN0b3JcclxuICovXHJcbmNsYXNzIEltYWdlVXRpbHMge1xyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgZGF0YSBVUkkgY29udGFpbmluZyBhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBpbWFnZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7KEhUTUxJbWFnZUVsZW1lbnR8SFRNTENhbnZhc0VsZW1lbnQpfSBpbWFnZSAtIFRoZSBpbWFnZSBvYmplY3QuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFt0eXBlPSdpbWFnZS9wbmcnXSAtIEluZGljYXRlcyB0aGUgaW1hZ2UgZm9ybWF0LlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGRhdGEgVVJJLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBnZXREYXRhVVJMKCBpbWFnZSwgdHlwZSA9ICdpbWFnZS9wbmcnICkge1xyXG5cclxuXHRcdGlmICggL15kYXRhOi9pLnRlc3QoIGltYWdlLnNyYyApICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIGltYWdlLnNyYztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQgPT09ICd1bmRlZmluZWQnICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIGltYWdlLnNyYztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0bGV0IGNhbnZhcztcclxuXHJcblx0XHRpZiAoIGltYWdlIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQgKSB7XHJcblxyXG5cdFx0XHRjYW52YXMgPSBpbWFnZTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0aWYgKCBfY2FudmFzID09PSB1bmRlZmluZWQgKSBfY2FudmFzID0gY3JlYXRlRWxlbWVudE5TKCAnY2FudmFzJyApO1xyXG5cclxuXHRcdFx0X2NhbnZhcy53aWR0aCA9IGltYWdlLndpZHRoO1xyXG5cdFx0XHRfY2FudmFzLmhlaWdodCA9IGltYWdlLmhlaWdodDtcclxuXHJcblx0XHRcdGNvbnN0IGNvbnRleHQgPSBfY2FudmFzLmdldENvbnRleHQoICcyZCcgKTtcclxuXHJcblx0XHRcdGlmICggaW1hZ2UgaW5zdGFuY2VvZiBJbWFnZURhdGEgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnRleHQucHV0SW1hZ2VEYXRhKCBpbWFnZSwgMCwgMCApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0Y29udGV4dC5kcmF3SW1hZ2UoIGltYWdlLCAwLCAwLCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjYW52YXMgPSBfY2FudmFzO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gY2FudmFzLnRvRGF0YVVSTCggdHlwZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnZlcnRzIHRoZSBnaXZlbiBzUkdCIGltYWdlIGRhdGEgdG8gbGluZWFyIGNvbG9yIHNwYWNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHsoSFRNTEltYWdlRWxlbWVudHxIVE1MQ2FudmFzRWxlbWVudHxJbWFnZUJpdG1hcHxPYmplY3QpfSBpbWFnZSAtIFRoZSBpbWFnZSBvYmplY3QuXHJcblx0ICogQHJldHVybiB7SFRNTENhbnZhc0VsZW1lbnR8T2JqZWN0fSBUaGUgY29udmVydGVkIGltYWdlLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBzUkdCVG9MaW5lYXIoIGltYWdlICkge1xyXG5cclxuXHRcdGlmICggKCB0eXBlb2YgSFRNTEltYWdlRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgaW1hZ2UgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50ICkgfHxcclxuXHRcdFx0KCB0eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGltYWdlIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQgKSB8fFxyXG5cdFx0XHQoIHR5cGVvZiBJbWFnZUJpdG1hcCAhPT0gJ3VuZGVmaW5lZCcgJiYgaW1hZ2UgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCApICkge1xyXG5cclxuXHRcdFx0Y29uc3QgY2FudmFzID0gY3JlYXRlRWxlbWVudE5TKCAnY2FudmFzJyApO1xyXG5cclxuXHRcdFx0Y2FudmFzLndpZHRoID0gaW1hZ2Uud2lkdGg7XHJcblx0XHRcdGNhbnZhcy5oZWlnaHQgPSBpbWFnZS5oZWlnaHQ7XHJcblxyXG5cdFx0XHRjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoICcyZCcgKTtcclxuXHRcdFx0Y29udGV4dC5kcmF3SW1hZ2UoIGltYWdlLCAwLCAwLCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0ICk7XHJcblxyXG5cdFx0XHRjb25zdCBpbWFnZURhdGEgPSBjb250ZXh0LmdldEltYWdlRGF0YSggMCwgMCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCApO1xyXG5cdFx0XHRjb25zdCBkYXRhID0gaW1hZ2VEYXRhLmRhdGE7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0ZGF0YVsgaSBdID0gU1JHQlRvTGluZWFyKCBkYXRhWyBpIF0gLyAyNTUgKSAqIDI1NTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnRleHQucHV0SW1hZ2VEYXRhKCBpbWFnZURhdGEsIDAsIDAgKTtcclxuXHJcblx0XHRcdHJldHVybiBjYW52YXM7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggaW1hZ2UuZGF0YSApIHtcclxuXHJcblx0XHRcdGNvbnN0IGRhdGEgPSBpbWFnZS5kYXRhLnNsaWNlKCAwICk7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSB8fCBkYXRhIGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXkgKSB7XHJcblxyXG5cdFx0XHRcdFx0ZGF0YVsgaSBdID0gTWF0aC5mbG9vciggU1JHQlRvTGluZWFyKCBkYXRhWyBpIF0gLyAyNTUgKSAqIDI1NSApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdC8vIGFzc3VtaW5nIGZsb2F0XHJcblxyXG5cdFx0XHRcdFx0ZGF0YVsgaSBdID0gU1JHQlRvTGluZWFyKCBkYXRhWyBpIF0gKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHRkYXRhOiBkYXRhLFxyXG5cdFx0XHRcdHdpZHRoOiBpbWFnZS53aWR0aCxcclxuXHRcdFx0XHRoZWlnaHQ6IGltYWdlLmhlaWdodFxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5JbWFnZVV0aWxzLnNSR0JUb0xpbmVhcigpOiBVbnN1cHBvcnRlZCBpbWFnZSB0eXBlLiBObyBjb2xvciBzcGFjZSBjb252ZXJzaW9uIGFwcGxpZWQuJyApO1xyXG5cdFx0XHRyZXR1cm4gaW1hZ2U7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBJbWFnZVV0aWxzIH07XHJcbiIsImltcG9ydCB7IEltYWdlVXRpbHMgfSBmcm9tICcuLi9leHRyYXMvSW1hZ2VVdGlscy5qcyc7XHJcbmltcG9ydCB7IGdlbmVyYXRlVVVJRCB9IGZyb20gJy4uL21hdGgvTWF0aFV0aWxzLmpzJztcclxuXHJcbmxldCBfc291cmNlSWQgPSAwO1xyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgdGhlIGRhdGEgc291cmNlIG9mIGEgdGV4dHVyZS5cclxuICpcclxuICogVGhlIG1haW4gcHVycG9zZSBvZiB0aGlzIGNsYXNzIGlzIHRvIGRlY291cGxlIHRoZSBkYXRhIGRlZmluaXRpb24gZnJvbSB0aGUgdGV4dHVyZVxyXG4gKiBkZWZpbml0aW9uIHNvIHRoZSBzYW1lIGRhdGEgY2FuIGJlIHVzZWQgd2l0aCBtdWx0aXBsZSB0ZXh0dXJlIGluc3RhbmNlcy5cclxuICovXHJcbmNsYXNzIFNvdXJjZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgdmlkZW8gdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7YW55fSBbZGF0YT1udWxsXSAtIFRoZSBkYXRhIGRlZmluaXRpb24gb2YgYSB0ZXh0dXJlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBkYXRhID0gbnVsbCApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNTb3VyY2UgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIElEIG9mIHRoZSBzb3VyY2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQG5hbWUgU291cmNlI2lkXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKi9cclxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ2lkJywgeyB2YWx1ZTogX3NvdXJjZUlkICsrIH0gKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBVVUlEIG9mIHRoZSBzb3VyY2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnV1aWQgPSBnZW5lcmF0ZVVVSUQoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBkYXRhIGRlZmluaXRpb24gb2YgYSB0ZXh0dXJlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHthbnl9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGF0YSA9IGRhdGE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIHByb3BlcnR5IGlzIG9ubHkgcmVsZXZhbnQgd2hlbiB7QGxpbmsgU291cmNlI25lZWRzVXBkYXRlfSBpcyBzZXQgdG8gYHRydWVgIGFuZFxyXG5cdFx0ICogcHJvdmlkZXMgbW9yZSBjb250cm9sIG9uIGhvdyB0ZXh0dXJlIGRhdGEgc2hvdWxkIGJlIHByb2Nlc3NlZC4gV2hlbiBgZGF0YVJlYWR5YCBpcyBzZXRcclxuXHRcdCAqIHRvIGBmYWxzZWAsIHRoZSBlbmdpbmUgcGVyZm9ybXMgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIChpZiBuZWNlc3NhcnkpIGJ1dCBkb2VzIG5vdCB0cmFuc2ZlclxyXG5cdFx0ICogdGhlIGRhdGEgaW50byB0aGUgR1BVIG1lbW9yeS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kYXRhUmVhZHkgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBzdGFydHMgYXQgYDBgIGFuZCBjb3VudHMgaG93IG1hbnkgdGltZXMge0BsaW5rIFNvdXJjZSNuZWVkc1VwZGF0ZX0gaXMgc2V0IHRvIGB0cnVlYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudmVyc2lvbiA9IDA7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogV2hlbiB0aGUgcHJvcGVydHkgaXMgc2V0IHRvIGB0cnVlYCwgdGhlIGVuZ2luZSBhbGxvY2F0ZXMgdGhlIG1lbW9yeVxyXG5cdCAqIGZvciB0aGUgdGV4dHVyZSAoaWYgbmVjZXNzYXJ5KSBhbmQgdHJpZ2dlcnMgdGhlIGFjdHVhbCB0ZXh0dXJlIHVwbG9hZFxyXG5cdCAqIHRvIHRoZSBHUFUgbmV4dCB0aW1lIHRoZSBzb3VyY2UgaXMgdXNlZC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0ICogQHBhcmFtIHtib29sZWFufSB2YWx1ZVxyXG5cdCAqL1xyXG5cdHNldCBuZWVkc1VwZGF0ZSggdmFsdWUgKSB7XHJcblxyXG5cdFx0aWYgKCB2YWx1ZSA9PT0gdHJ1ZSApIHRoaXMudmVyc2lvbiArKztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXJpYWxpemVzIHRoZSBzb3VyY2UgaW50byBKU09OLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHs/KE9iamVjdHxzdHJpbmcpfSBtZXRhIC0gQW4gb3B0aW9uYWwgdmFsdWUgaG9sZGluZyBtZXRhIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZXJpYWxpemF0aW9uLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdH0gQSBKU09OIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNlcmlhbGl6ZWQgc291cmNlLlxyXG5cdCAqIEBzZWUge0BsaW5rIE9iamVjdExvYWRlciNwYXJzZX1cclxuXHQgKi9cclxuXHR0b0pTT04oIG1ldGEgKSB7XHJcblxyXG5cdFx0Y29uc3QgaXNSb290T2JqZWN0ID0gKCBtZXRhID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIG1ldGEgPT09ICdzdHJpbmcnICk7XHJcblxyXG5cdFx0aWYgKCAhIGlzUm9vdE9iamVjdCAmJiBtZXRhLmltYWdlc1sgdGhpcy51dWlkIF0gIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHJldHVybiBtZXRhLmltYWdlc1sgdGhpcy51dWlkIF07XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IG91dHB1dCA9IHtcclxuXHRcdFx0dXVpZDogdGhpcy51dWlkLFxyXG5cdFx0XHR1cmw6ICcnXHJcblx0XHR9O1xyXG5cclxuXHRcdGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7XHJcblxyXG5cdFx0aWYgKCBkYXRhICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0bGV0IHVybDtcclxuXHJcblx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggZGF0YSApICkge1xyXG5cclxuXHRcdFx0XHQvLyBjdWJlIHRleHR1cmVcclxuXHJcblx0XHRcdFx0dXJsID0gW107XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGRhdGEubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGRhdGFbIGkgXS5pc0RhdGFUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0dXJsLnB1c2goIHNlcmlhbGl6ZUltYWdlKCBkYXRhWyBpIF0uaW1hZ2UgKSApO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHR1cmwucHVzaCggc2VyaWFsaXplSW1hZ2UoIGRhdGFbIGkgXSApICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHQvLyB0ZXh0dXJlXHJcblxyXG5cdFx0XHRcdHVybCA9IHNlcmlhbGl6ZUltYWdlKCBkYXRhICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRvdXRwdXQudXJsID0gdXJsO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoICEgaXNSb290T2JqZWN0ICkge1xyXG5cclxuXHRcdFx0bWV0YS5pbWFnZXNbIHRoaXMudXVpZCBdID0gb3V0cHV0O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gb3V0cHV0O1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBzZXJpYWxpemVJbWFnZSggaW1hZ2UgKSB7XHJcblxyXG5cdGlmICggKCB0eXBlb2YgSFRNTEltYWdlRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgaW1hZ2UgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50ICkgfHxcclxuXHRcdCggdHlwZW9mIEhUTUxDYW52YXNFbGVtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBpbWFnZSBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50ICkgfHxcclxuXHRcdCggdHlwZW9mIEltYWdlQml0bWFwICE9PSAndW5kZWZpbmVkJyAmJiBpbWFnZSBpbnN0YW5jZW9mIEltYWdlQml0bWFwICkgKSB7XHJcblxyXG5cdFx0Ly8gZGVmYXVsdCBpbWFnZXNcclxuXHJcblx0XHRyZXR1cm4gSW1hZ2VVdGlscy5nZXREYXRhVVJMKCBpbWFnZSApO1xyXG5cclxuXHR9IGVsc2Uge1xyXG5cclxuXHRcdGlmICggaW1hZ2UuZGF0YSApIHtcclxuXHJcblx0XHRcdC8vIGltYWdlcyBvZiBEYXRhVGV4dHVyZVxyXG5cclxuXHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHRkYXRhOiBBcnJheS5mcm9tKCBpbWFnZS5kYXRhICksXHJcblx0XHRcdFx0d2lkdGg6IGltYWdlLndpZHRoLFxyXG5cdFx0XHRcdGhlaWdodDogaW1hZ2UuaGVpZ2h0LFxyXG5cdFx0XHRcdHR5cGU6IGltYWdlLmRhdGEuY29uc3RydWN0b3IubmFtZVxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5UZXh0dXJlOiBVbmFibGUgdG8gc2VyaWFsaXplIFRleHR1cmUuJyApO1xyXG5cdFx0XHRyZXR1cm4ge307XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBTb3VyY2UgfTtcclxuIiwiaW1wb3J0IHsgRXZlbnREaXNwYXRjaGVyIH0gZnJvbSAnLi4vY29yZS9FdmVudERpc3BhdGNoZXIuanMnO1xyXG5pbXBvcnQge1xyXG5cdE1pcnJvcmVkUmVwZWF0V3JhcHBpbmcsXHJcblx0Q2xhbXBUb0VkZ2VXcmFwcGluZyxcclxuXHRSZXBlYXRXcmFwcGluZyxcclxuXHRVbnNpZ25lZEJ5dGVUeXBlLFxyXG5cdFJHQkFGb3JtYXQsXHJcblx0TGluZWFyTWlwbWFwTGluZWFyRmlsdGVyLFxyXG5cdExpbmVhckZpbHRlcixcclxuXHRVVk1hcHBpbmcsXHJcblx0Tm9Db2xvclNwYWNlLFxyXG59IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IGdlbmVyYXRlVVVJRCB9IGZyb20gJy4uL21hdGgvTWF0aFV0aWxzLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uL21hdGgvVmVjdG9yMi5qcyc7XHJcbmltcG9ydCB7IE1hdHJpeDMgfSBmcm9tICcuLi9tYXRoL01hdHJpeDMuanMnO1xyXG5pbXBvcnQgeyBTb3VyY2UgfSBmcm9tICcuL1NvdXJjZS5qcyc7XHJcblxyXG5sZXQgX3RleHR1cmVJZCA9IDA7XHJcblxyXG4vKipcclxuICogQmFzZSBjbGFzcyBmb3IgYWxsIHRleHR1cmVzLlxyXG4gKlxyXG4gKiBOb3RlOiBBZnRlciB0aGUgaW5pdGlhbCB1c2Ugb2YgYSB0ZXh0dXJlLCBpdHMgZGltZW5zaW9ucywgZm9ybWF0LCBhbmQgdHlwZVxyXG4gKiBjYW5ub3QgYmUgY2hhbmdlZC4gSW5zdGVhZCwgY2FsbCB7QGxpbmsgVGV4dHVyZSNkaXNwb3NlfSBvbiB0aGUgdGV4dHVyZSBhbmQgaW5zdGFudGlhdGUgYSBuZXcgb25lLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgRXZlbnREaXNwYXRjaGVyXHJcbiAqL1xyXG5jbGFzcyBUZXh0dXJlIGV4dGVuZHMgRXZlbnREaXNwYXRjaGVyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHs/T2JqZWN0fSBbaW1hZ2U9VGV4dHVyZS5ERUZBVUxUX0lNQUdFXSAtIFRoZSBpbWFnZSBob2xkaW5nIHRoZSB0ZXh0dXJlIGRhdGEuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFttYXBwaW5nPVRleHR1cmUuREVGQVVMVF9NQVBQSU5HXSAtIFRoZSB0ZXh0dXJlIG1hcHBpbmcuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt3cmFwUz1DbGFtcFRvRWRnZVdyYXBwaW5nXSAtIFRoZSB3cmFwUyB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3dyYXBUPUNsYW1wVG9FZGdlV3JhcHBpbmddIC0gVGhlIHdyYXBUIHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbWFnRmlsdGVyPUxpbmVhckZpbHRlcl0gLSBUaGUgbWFnIGZpbHRlciB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW21pbkZpbHRlcj1MaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXJdIC0gVGhlIG1pbiBmaWx0ZXIgdmFsdWUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtmb3JtYXQ9UkdCQUZvcm1hdF0gLSBUaGUgdGV4dHVyZSBmb3JtYXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt0eXBlPVVuc2lnbmVkQnl0ZVR5cGVdIC0gVGhlIHRleHR1cmUgdHlwZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2FuaXNvdHJvcHk9VGV4dHVyZS5ERUZBVUxUX0FOSVNPVFJPUFldIC0gVGhlIGFuaXNvdHJvcHkgdmFsdWUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtjb2xvclNwYWNlPU5vQ29sb3JTcGFjZV0gLSBUaGUgY29sb3Igc3BhY2UuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGltYWdlID0gVGV4dHVyZS5ERUZBVUxUX0lNQUdFLCBtYXBwaW5nID0gVGV4dHVyZS5ERUZBVUxUX01BUFBJTkcsIHdyYXBTID0gQ2xhbXBUb0VkZ2VXcmFwcGluZywgd3JhcFQgPSBDbGFtcFRvRWRnZVdyYXBwaW5nLCBtYWdGaWx0ZXIgPSBMaW5lYXJGaWx0ZXIsIG1pbkZpbHRlciA9IExpbmVhck1pcG1hcExpbmVhckZpbHRlciwgZm9ybWF0ID0gUkdCQUZvcm1hdCwgdHlwZSA9IFVuc2lnbmVkQnl0ZVR5cGUsIGFuaXNvdHJvcHkgPSBUZXh0dXJlLkRFRkFVTFRfQU5JU09UUk9QWSwgY29sb3JTcGFjZSA9IE5vQ29sb3JTcGFjZSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1RleHR1cmUgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIElEIG9mIHRoZSB0ZXh0dXJlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBuYW1lIFRleHR1cmUjaWRcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqL1xyXG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCAnaWQnLCB7IHZhbHVlOiBfdGV4dHVyZUlkICsrIH0gKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBVVUlEIG9mIHRoZSBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXVpZCA9IGdlbmVyYXRlVVVJRCgpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG5hbWUgb2YgdGhlIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubmFtZSA9ICcnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGRhdGEgZGVmaW5pdGlvbiBvZiBhIHRleHR1cmUuIEEgcmVmZXJlbmNlIHRvIHRoZSBkYXRhIHNvdXJjZSBjYW4gYmVcclxuXHRcdCAqIHNoYXJlZCBhY3Jvc3MgdGV4dHVyZXMuIFRoaXMgaXMgb2Z0ZW4gdXNlZnVsIGluIGNvbnRleHQgb2Ygc3ByaXRlc2hlZXRzXHJcblx0XHQgKiB3aGVyZSBtdWx0aXBsZSB0ZXh0dXJlcyByZW5kZXIgdGhlIHNhbWUgZGF0YSBidXQgd2l0aCBkaWZmZXJlbnQgdGV4dHVyZVxyXG5cdFx0ICogdHJhbnNmb3JtYXRpb25zLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtTb3VyY2V9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc291cmNlID0gbmV3IFNvdXJjZSggaW1hZ2UgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIGFycmF5IGhvbGRpbmcgdXNlci1kZWZpbmVkIG1pcG1hcHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PE9iamVjdD59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWlwbWFwcyA9IFtdO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG93IHRoZSB0ZXh0dXJlIGlzIGFwcGxpZWQgdG8gdGhlIG9iamVjdC4gVGhlIHZhbHVlIGBVVk1hcHBpbmdgXHJcblx0XHQgKiBpcyB0aGUgZGVmYXVsdCwgd2hlcmUgdGV4dHVyZSBvciB1diBjb29yZGluYXRlcyBhcmUgdXNlZCB0byBhcHBseSB0aGUgbWFwLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoVVZNYXBwaW5nfEN1YmVSZWZsZWN0aW9uTWFwcGluZ3xDdWJlUmVmcmFjdGlvbk1hcHBpbmd8RXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmd8RXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmd8Q3ViZVVWUmVmbGVjdGlvbk1hcHBpbmcpfVxyXG5cdFx0ICogQGRlZmF1bHQgVVZNYXBwaW5nXHJcblx0XHQqL1xyXG5cdFx0dGhpcy5tYXBwaW5nID0gbWFwcGluZztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIExldHMgeW91IHNlbGVjdCB0aGUgdXYgYXR0cmlidXRlIHRvIG1hcCB0aGUgdGV4dHVyZSB0by4gYDBgIGZvciBgdXZgLFxyXG5cdFx0ICogYDFgIGZvciBgdXYxYCwgYDJgIGZvciBgdXYyYCBhbmQgYDNgIGZvciBgdXYzYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNoYW5uZWwgPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBkZWZpbmVzIGhvdyB0aGUgdGV4dHVyZSBpcyB3cmFwcGVkIGhvcml6b250YWxseSBhbmQgY29ycmVzcG9uZHMgdG9cclxuXHRcdCAqICpVKiBpbiBVViBtYXBwaW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoUmVwZWF0V3JhcHBpbmd8Q2xhbXBUb0VkZ2VXcmFwcGluZ3xNaXJyb3JlZFJlcGVhdFdyYXBwaW5nKX1cclxuXHRcdCAqIEBkZWZhdWx0IENsYW1wVG9FZGdlV3JhcHBpbmdcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy53cmFwUyA9IHdyYXBTO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBkZWZpbmVzIGhvdyB0aGUgdGV4dHVyZSBpcyB3cmFwcGVkIGhvcml6b250YWxseSBhbmQgY29ycmVzcG9uZHMgdG9cclxuXHRcdCAqICpWKiBpbiBVViBtYXBwaW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoUmVwZWF0V3JhcHBpbmd8Q2xhbXBUb0VkZ2VXcmFwcGluZ3xNaXJyb3JlZFJlcGVhdFdyYXBwaW5nKX1cclxuXHRcdCAqIEBkZWZhdWx0IENsYW1wVG9FZGdlV3JhcHBpbmdcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy53cmFwVCA9IHdyYXBUO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG93IHRoZSB0ZXh0dXJlIGlzIHNhbXBsZWQgd2hlbiBhIHRleGVsIGNvdmVycyBtb3JlIHRoYW4gb25lIHBpeGVsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoTmVhcmVzdEZpbHRlcnxOZWFyZXN0TWlwbWFwTmVhcmVzdEZpbHRlcnxOZWFyZXN0TWlwbWFwTGluZWFyRmlsdGVyfExpbmVhckZpbHRlcnxMaW5lYXJNaXBtYXBOZWFyZXN0RmlsdGVyfExpbmVhck1pcG1hcExpbmVhckZpbHRlcil9XHJcblx0XHQgKiBAZGVmYXVsdCBMaW5lYXJGaWx0ZXJcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tYWdGaWx0ZXIgPSBtYWdGaWx0ZXI7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3cgdGhlIHRleHR1cmUgaXMgc2FtcGxlZCB3aGVuIGEgdGV4ZWwgY292ZXJzIGxlc3MgdGhhbiBvbmUgcGl4ZWwuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeyhOZWFyZXN0RmlsdGVyfE5lYXJlc3RNaXBtYXBOZWFyZXN0RmlsdGVyfE5lYXJlc3RNaXBtYXBMaW5lYXJGaWx0ZXJ8TGluZWFyRmlsdGVyfExpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXJ8TGluZWFyTWlwbWFwTGluZWFyRmlsdGVyKX1cclxuXHRcdCAqIEBkZWZhdWx0IExpbmVhck1pcG1hcExpbmVhckZpbHRlclxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1pbkZpbHRlciA9IG1pbkZpbHRlcjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0YWtlbiBhbG9uZyB0aGUgYXhpcyB0aHJvdWdoIHRoZSBwaXhlbCB0aGF0IGhhcyB0aGVcclxuXHRcdCAqIGhpZ2hlc3QgZGVuc2l0eSBvZiB0ZXhlbHMuIEJ5IGRlZmF1bHQsIHRoaXMgdmFsdWUgaXMgYDFgLiBBIGhpZ2hlciB2YWx1ZVxyXG5cdFx0ICogZ2l2ZXMgYSBsZXNzIGJsdXJyeSByZXN1bHQgdGhhbiBhIGJhc2ljIG1pcG1hcCwgYXQgdGhlIGNvc3Qgb2YgbW9yZVxyXG5cdFx0ICogdGV4dHVyZSBzYW1wbGVzIGJlaW5nIHVzZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hbmlzb3Ryb3B5ID0gYW5pc290cm9weTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBmb3JtYXQgb2YgdGhlIHRleHR1cmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IFJHQkFGb3JtYXRcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5mb3JtYXQgPSBmb3JtYXQ7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZGVmYXVsdCBpbnRlcm5hbCBmb3JtYXQgaXMgZGVyaXZlZCBmcm9tIHtAbGluayBUZXh0dXJlI2Zvcm1hdH0gYW5kIHtAbGluayBUZXh0dXJlI3R5cGV9IGFuZFxyXG5cdFx0ICogZGVmaW5lcyBob3cgdGhlIHRleHR1cmUgZGF0YSBpcyBnb2luZyB0byBiZSBzdG9yZWQgb24gdGhlIEdQVS5cclxuXHRcdCAqXHJcblx0XHQgKiBUaGlzIHByb3BlcnR5IGFsbG93cyB0byBvdmVyd3JpdGUgdGhlIGRlZmF1bHQgZm9ybWF0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/c3RyaW5nfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmludGVybmFsRm9ybWF0ID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBkYXRhIHR5cGUgb2YgdGhlIHRleHR1cmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IFVuc2lnbmVkQnl0ZVR5cGVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50eXBlID0gdHlwZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvdyBtdWNoIGEgc2luZ2xlIHJlcGV0aXRpb24gb2YgdGhlIHRleHR1cmUgaXMgb2Zmc2V0IGZyb20gdGhlIGJlZ2lubmluZyxcclxuXHRcdCAqIGluIGVhY2ggZGlyZWN0aW9uIFUgYW5kIFYuIFR5cGljYWwgcmFuZ2UgaXMgYDAuMGAgdG8gYDEuMGAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjJ9XHJcblx0XHQgKiBAZGVmYXVsdCAoMCwwKVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm9mZnNldCA9IG5ldyBWZWN0b3IyKCAwLCAwICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3cgbWFueSB0aW1lcyB0aGUgdGV4dHVyZSBpcyByZXBlYXRlZCBhY3Jvc3MgdGhlIHN1cmZhY2UsIGluIGVhY2hcclxuXHRcdCAqIGRpcmVjdGlvbiBVIGFuZCBWLiBJZiByZXBlYXQgaXMgc2V0IGdyZWF0ZXIgdGhhbiBgMWAgaW4gZWl0aGVyIGRpcmVjdGlvbixcclxuXHRcdCAqIHRoZSBjb3JyZXNwb25kaW5nIHdyYXAgcGFyYW1ldGVyIHNob3VsZCBhbHNvIGJlIHNldCB0byBgUmVwZWF0V3JhcHBpbmdgXHJcblx0XHQgKiBvciBgTWlycm9yZWRSZXBlYXRXcmFwcGluZ2AgdG8gYWNoaWV2ZSB0aGUgZGVzaXJlZCB0aWxpbmcgZWZmZWN0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3IyfVxyXG5cdFx0ICogQGRlZmF1bHQgKDEsMSlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yZXBlYXQgPSBuZXcgVmVjdG9yMiggMSwgMSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHBvaW50IGFyb3VuZCB3aGljaCByb3RhdGlvbiBvY2N1cnMuIEEgdmFsdWUgb2YgYCgwLjUsIDAuNSlgIGNvcnJlc3BvbmRzXHJcblx0XHQgKiB0byB0aGUgY2VudGVyIG9mIHRoZSB0ZXh0dXJlLiBEZWZhdWx0IGlzIGAoMCwgMClgLCB0aGUgbG93ZXIgbGVmdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yMn1cclxuXHRcdCAqIEBkZWZhdWx0ICgwLDApXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2VudGVyID0gbmV3IFZlY3RvcjIoIDAsIDAgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvdyBtdWNoIHRoZSB0ZXh0dXJlIGlzIHJvdGF0ZWQgYXJvdW5kIHRoZSBjZW50ZXIgcG9pbnQsIGluIHJhZGlhbnMuXHJcblx0XHQgKiBQb3NpdGl2ZSB2YWx1ZXMgYXJlIGNvdW50ZXItY2xvY2t3aXNlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucm90YXRpb24gPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0byB1cGRhdGUgdGhlIHRleHR1cmUncyB1di10cmFuc2Zvcm1hdGlvbiB7QGxpbmsgVGV4dHVyZSNtYXRyaXh9XHJcblx0XHQgKiBmcm9tIHRoZSBwcm9wZXJ0aWVzIHtAbGluayBUZXh0dXJlI29mZnNldH0sIHtAbGluayBUZXh0dXJlI3JlcGVhdH0sXHJcblx0XHQgKiB7QGxpbmsgVGV4dHVyZSNyb3RhdGlvbn0sIGFuZCB7QGxpbmsgVGV4dHVyZSNjZW50ZXJ9LlxyXG5cdFx0ICpcclxuXHRcdCAqIFNldCB0aGlzIHRvIGBmYWxzZWAgaWYgeW91IGFyZSBzcGVjaWZ5aW5nIHRoZSB1di10cmFuc2Zvcm0gbWF0cml4IGRpcmVjdGx5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHV2LXRyYW5zZm9ybWF0aW9uIG1hdHJpeCBvZiB0aGUgdGV4dHVyZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7TWF0cml4M31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tYXRyaXggPSBuZXcgTWF0cml4MygpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0byBnZW5lcmF0ZSBtaXBtYXBzIChpZiBwb3NzaWJsZSkgZm9yIGEgdGV4dHVyZS5cclxuXHRcdCAqXHJcblx0XHQgKiBTZXQgdGhpcyB0byBgZmFsc2VgIGlmIHlvdSBhcmUgY3JlYXRpbmcgbWlwbWFwcyBtYW51YWxseS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSWYgc2V0IHRvIGB0cnVlYCwgdGhlIGFscGhhIGNoYW5uZWwsIGlmIHByZXNlbnQsIGlzIG11bHRpcGxpZWQgaW50byB0aGVcclxuXHRcdCAqIGNvbG9yIGNoYW5uZWxzIHdoZW4gdGhlIHRleHR1cmUgaXMgdXBsb2FkZWQgdG8gdGhlIEdQVS5cclxuXHRcdCAqXHJcblx0XHQgKiBOb3RlIHRoYXQgdGhpcyBwcm9wZXJ0eSBoYXMgbm8gZWZmZWN0IHdoZW4gdXNpbmcgYEltYWdlQml0bWFwYC4gWW91IG5lZWQgdG9cclxuXHRcdCAqIGNvbmZpZ3VyZSBwcmVtdWx0aXBseSBhbHBoYSBvbiBiaXRtYXAgY3JlYXRpb24gaW5zdGVhZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucHJlbXVsdGlwbHlBbHBoYSA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSWYgc2V0IHRvIGB0cnVlYCwgdGhlIHRleHR1cmUgaXMgZmxpcHBlZCBhbG9uZyB0aGUgdmVydGljYWwgYXhpcyB3aGVuXHJcblx0XHQgKiB1cGxvYWRlZCB0byB0aGUgR1BVLlxyXG5cdFx0ICpcclxuXHRcdCAqIE5vdGUgdGhhdCB0aGlzIHByb3BlcnR5IGhhcyBubyBlZmZlY3Qgd2hlbiB1c2luZyBgSW1hZ2VCaXRtYXBgLiBZb3UgbmVlZCB0b1xyXG5cdFx0ICogY29uZmlndXJlIHRoZSBmbGlwIG9uIGJpdG1hcCBjcmVhdGlvbiBpbnN0ZWFkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZsaXBZID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNwZWNpZmllcyB0aGUgYWxpZ25tZW50IHJlcXVpcmVtZW50cyBmb3IgdGhlIHN0YXJ0IG9mIGVhY2ggcGl4ZWwgcm93IGluIG1lbW9yeS5cclxuXHRcdCAqIFRoZSBhbGxvd2FibGUgdmFsdWVzIGFyZSBgMWAgKGJ5dGUtYWxpZ25tZW50KSwgYDJgIChyb3dzIGFsaWduZWQgdG8gZXZlbi1udW1iZXJlZCBieXRlcyksXHJcblx0XHQgKiBgNGAgKHdvcmQtYWxpZ25tZW50KSwgYW5kIGA4YCAocm93cyBzdGFydCBvbiBkb3VibGUtd29yZCBib3VuZGFyaWVzKS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgNFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVucGFja0FsaWdubWVudCA9IDQ7XHQvLyB2YWxpZCB2YWx1ZXM6IDEsIDIsIDQsIDggKHNlZSBodHRwOi8vd3d3Lmtocm9ub3Mub3JnL29wZW5nbGVzL3Nkay9kb2NzL21hbi94aHRtbC9nbFBpeGVsU3RvcmVpLnhtbClcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRleHR1cmVzIGNvbnRhaW5pbmcgY29sb3IgZGF0YSBzaG91bGQgYmUgYW5ub3RhdGVkIHdpdGggYFNSR0JDb2xvclNwYWNlYCBvciBgTGluZWFyU1JHQkNvbG9yU3BhY2VgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKiBAZGVmYXVsdCBOb0NvbG9yU3BhY2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb2xvclNwYWNlID0gY29sb3JTcGFjZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIHN0b3JlIGN1c3RvbSBkYXRhIGFib3V0IHRoZSB0ZXh0dXJlLiBJdFxyXG5cdFx0ICogc2hvdWxkIG5vdCBob2xkIHJlZmVyZW5jZXMgdG8gZnVuY3Rpb25zIGFzIHRoZXNlIHdpbGwgbm90IGJlIGNsb25lZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVzZXJEYXRhID0ge307XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIHN0YXJ0cyBhdCBgMGAgYW5kIGNvdW50cyBob3cgbWFueSB0aW1lcyB7QGxpbmsgVGV4dHVyZSNuZWVkc1VwZGF0ZX0gaXMgc2V0IHRvIGB0cnVlYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudmVyc2lvbiA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGNhbGxiYWNrIGZ1bmN0aW9uLCBjYWxsZWQgd2hlbiB0aGUgdGV4dHVyZSBpcyB1cGRhdGVkIChlLmcuLCB3aGVuXHJcblx0XHQgKiB7QGxpbmsgVGV4dHVyZSNuZWVkc1VwZGF0ZX0gaGFzIGJlZW4gc2V0IHRvIHRydWUgYW5kIHRoZW4gdGhlIHRleHR1cmUgaXMgdXNlZCkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9GdW5jdGlvbn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5vblVwZGF0ZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBvcHRpb25hbCBiYWNrIHJlZmVyZW5jZSB0byB0aGUgdGV4dHVyZXMgcmVuZGVyIHRhcmdldC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7PyhSZW5kZXJUYXJnZXR8V2ViR0xSZW5kZXJUYXJnZXQpfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJlbmRlclRhcmdldCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBJbmRpY2F0ZXMgd2hldGhlciBhIHRleHR1cmUgYmVsb25ncyB0byBhIHJlbmRlciB0YXJnZXQgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyB0ZXh0dXJlIHNob3VsZCBiZSBwcm9jZXNzZWQgYnkgYFBNUkVNR2VuZXJhdG9yYCBvciBub3RcclxuXHRcdCAqIChvbmx5IHJlbGV2YW50IGZvciByZW5kZXIgdGFyZ2V0IHRleHR1cmVzKS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucG1yZW1WZXJzaW9uID0gMDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgaW1hZ2Ugb2JqZWN0IGhvbGRpbmcgdGhlIHRleHR1cmUgZGF0YS5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHs/T2JqZWN0fVxyXG5cdCAqL1xyXG5cdGdldCBpbWFnZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5zb3VyY2UuZGF0YTtcclxuXHJcblx0fVxyXG5cclxuXHRzZXQgaW1hZ2UoIHZhbHVlID0gbnVsbCApIHtcclxuXHJcblx0XHR0aGlzLnNvdXJjZS5kYXRhID0gdmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgdGV4dHVyZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggZnJvbSB0aGUgZnJvbSB0aGUgcHJvcGVydGllcyB7QGxpbmsgVGV4dHVyZSNvZmZzZXR9LFxyXG5cdCAqIHtAbGluayBUZXh0dXJlI3JlcGVhdH0sIHtAbGluayBUZXh0dXJlI3JvdGF0aW9ufSwgYW5kIHtAbGluayBUZXh0dXJlI2NlbnRlcn0uXHJcblx0ICovXHJcblx0dXBkYXRlTWF0cml4KCkge1xyXG5cclxuXHRcdHRoaXMubWF0cml4LnNldFV2VHJhbnNmb3JtKCB0aGlzLm9mZnNldC54LCB0aGlzLm9mZnNldC55LCB0aGlzLnJlcGVhdC54LCB0aGlzLnJlcGVhdC55LCB0aGlzLnJvdGF0aW9uLCB0aGlzLmNlbnRlci54LCB0aGlzLmNlbnRlci55ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIG5ldyB0ZXh0dXJlIHdpdGggY29waWVkIHZhbHVlcyBmcm9tIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtUZXh0dXJlfSBBIGNsb25lIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y2xvbmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvcGllcyB0aGUgdmFsdWVzIG9mIHRoZSBnaXZlbiB0ZXh0dXJlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHNvdXJjZSAtIFRoZSB0ZXh0dXJlIHRvIGNvcHkuXHJcblx0ICogQHJldHVybiB7VGV4dHVyZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0dGhpcy5uYW1lID0gc291cmNlLm5hbWU7XHJcblxyXG5cdFx0dGhpcy5zb3VyY2UgPSBzb3VyY2Uuc291cmNlO1xyXG5cdFx0dGhpcy5taXBtYXBzID0gc291cmNlLm1pcG1hcHMuc2xpY2UoIDAgKTtcclxuXHJcblx0XHR0aGlzLm1hcHBpbmcgPSBzb3VyY2UubWFwcGluZztcclxuXHRcdHRoaXMuY2hhbm5lbCA9IHNvdXJjZS5jaGFubmVsO1xyXG5cclxuXHRcdHRoaXMud3JhcFMgPSBzb3VyY2Uud3JhcFM7XHJcblx0XHR0aGlzLndyYXBUID0gc291cmNlLndyYXBUO1xyXG5cclxuXHRcdHRoaXMubWFnRmlsdGVyID0gc291cmNlLm1hZ0ZpbHRlcjtcclxuXHRcdHRoaXMubWluRmlsdGVyID0gc291cmNlLm1pbkZpbHRlcjtcclxuXHJcblx0XHR0aGlzLmFuaXNvdHJvcHkgPSBzb3VyY2UuYW5pc290cm9weTtcclxuXHJcblx0XHR0aGlzLmZvcm1hdCA9IHNvdXJjZS5mb3JtYXQ7XHJcblx0XHR0aGlzLmludGVybmFsRm9ybWF0ID0gc291cmNlLmludGVybmFsRm9ybWF0O1xyXG5cdFx0dGhpcy50eXBlID0gc291cmNlLnR5cGU7XHJcblxyXG5cdFx0dGhpcy5vZmZzZXQuY29weSggc291cmNlLm9mZnNldCApO1xyXG5cdFx0dGhpcy5yZXBlYXQuY29weSggc291cmNlLnJlcGVhdCApO1xyXG5cdFx0dGhpcy5jZW50ZXIuY29weSggc291cmNlLmNlbnRlciApO1xyXG5cdFx0dGhpcy5yb3RhdGlvbiA9IHNvdXJjZS5yb3RhdGlvbjtcclxuXHJcblx0XHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBzb3VyY2UubWF0cml4QXV0b1VwZGF0ZTtcclxuXHRcdHRoaXMubWF0cml4LmNvcHkoIHNvdXJjZS5tYXRyaXggKTtcclxuXHJcblx0XHR0aGlzLmdlbmVyYXRlTWlwbWFwcyA9IHNvdXJjZS5nZW5lcmF0ZU1pcG1hcHM7XHJcblx0XHR0aGlzLnByZW11bHRpcGx5QWxwaGEgPSBzb3VyY2UucHJlbXVsdGlwbHlBbHBoYTtcclxuXHRcdHRoaXMuZmxpcFkgPSBzb3VyY2UuZmxpcFk7XHJcblx0XHR0aGlzLnVucGFja0FsaWdubWVudCA9IHNvdXJjZS51bnBhY2tBbGlnbm1lbnQ7XHJcblx0XHR0aGlzLmNvbG9yU3BhY2UgPSBzb3VyY2UuY29sb3JTcGFjZTtcclxuXHJcblx0XHR0aGlzLnJlbmRlclRhcmdldCA9IHNvdXJjZS5yZW5kZXJUYXJnZXQ7XHJcblx0XHR0aGlzLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSA9IHNvdXJjZS5pc1JlbmRlclRhcmdldFRleHR1cmU7XHJcblxyXG5cdFx0dGhpcy51c2VyRGF0YSA9IEpTT04ucGFyc2UoIEpTT04uc3RyaW5naWZ5KCBzb3VyY2UudXNlckRhdGEgKSApO1xyXG5cclxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNlcmlhbGl6ZXMgdGhlIHRleHR1cmUgaW50byBKU09OLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHs/KE9iamVjdHxzdHJpbmcpfSBtZXRhIC0gQW4gb3B0aW9uYWwgdmFsdWUgaG9sZGluZyBtZXRhIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZXJpYWxpemF0aW9uLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdH0gQSBKU09OIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNlcmlhbGl6ZWQgdGV4dHVyZS5cclxuXHQgKiBAc2VlIHtAbGluayBPYmplY3RMb2FkZXIjcGFyc2V9XHJcblx0ICovXHJcblx0dG9KU09OKCBtZXRhICkge1xyXG5cclxuXHRcdGNvbnN0IGlzUm9vdE9iamVjdCA9ICggbWV0YSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBtZXRhID09PSAnc3RyaW5nJyApO1xyXG5cclxuXHRcdGlmICggISBpc1Jvb3RPYmplY3QgJiYgbWV0YS50ZXh0dXJlc1sgdGhpcy51dWlkIF0gIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHJldHVybiBtZXRhLnRleHR1cmVzWyB0aGlzLnV1aWQgXTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3Qgb3V0cHV0ID0ge1xyXG5cclxuXHRcdFx0bWV0YWRhdGE6IHtcclxuXHRcdFx0XHR2ZXJzaW9uOiA0LjYsXHJcblx0XHRcdFx0dHlwZTogJ1RleHR1cmUnLFxyXG5cdFx0XHRcdGdlbmVyYXRvcjogJ1RleHR1cmUudG9KU09OJ1xyXG5cdFx0XHR9LFxyXG5cclxuXHRcdFx0dXVpZDogdGhpcy51dWlkLFxyXG5cdFx0XHRuYW1lOiB0aGlzLm5hbWUsXHJcblxyXG5cdFx0XHRpbWFnZTogdGhpcy5zb3VyY2UudG9KU09OKCBtZXRhICkudXVpZCxcclxuXHJcblx0XHRcdG1hcHBpbmc6IHRoaXMubWFwcGluZyxcclxuXHRcdFx0Y2hhbm5lbDogdGhpcy5jaGFubmVsLFxyXG5cclxuXHRcdFx0cmVwZWF0OiBbIHRoaXMucmVwZWF0LngsIHRoaXMucmVwZWF0LnkgXSxcclxuXHRcdFx0b2Zmc2V0OiBbIHRoaXMub2Zmc2V0LngsIHRoaXMub2Zmc2V0LnkgXSxcclxuXHRcdFx0Y2VudGVyOiBbIHRoaXMuY2VudGVyLngsIHRoaXMuY2VudGVyLnkgXSxcclxuXHRcdFx0cm90YXRpb246IHRoaXMucm90YXRpb24sXHJcblxyXG5cdFx0XHR3cmFwOiBbIHRoaXMud3JhcFMsIHRoaXMud3JhcFQgXSxcclxuXHJcblx0XHRcdGZvcm1hdDogdGhpcy5mb3JtYXQsXHJcblx0XHRcdGludGVybmFsRm9ybWF0OiB0aGlzLmludGVybmFsRm9ybWF0LFxyXG5cdFx0XHR0eXBlOiB0aGlzLnR5cGUsXHJcblx0XHRcdGNvbG9yU3BhY2U6IHRoaXMuY29sb3JTcGFjZSxcclxuXHJcblx0XHRcdG1pbkZpbHRlcjogdGhpcy5taW5GaWx0ZXIsXHJcblx0XHRcdG1hZ0ZpbHRlcjogdGhpcy5tYWdGaWx0ZXIsXHJcblx0XHRcdGFuaXNvdHJvcHk6IHRoaXMuYW5pc290cm9weSxcclxuXHJcblx0XHRcdGZsaXBZOiB0aGlzLmZsaXBZLFxyXG5cclxuXHRcdFx0Z2VuZXJhdGVNaXBtYXBzOiB0aGlzLmdlbmVyYXRlTWlwbWFwcyxcclxuXHRcdFx0cHJlbXVsdGlwbHlBbHBoYTogdGhpcy5wcmVtdWx0aXBseUFscGhhLFxyXG5cdFx0XHR1bnBhY2tBbGlnbm1lbnQ6IHRoaXMudW5wYWNrQWxpZ25tZW50XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHRpZiAoIE9iamVjdC5rZXlzKCB0aGlzLnVzZXJEYXRhICkubGVuZ3RoID4gMCApIG91dHB1dC51c2VyRGF0YSA9IHRoaXMudXNlckRhdGE7XHJcblxyXG5cdFx0aWYgKCAhIGlzUm9vdE9iamVjdCApIHtcclxuXHJcblx0XHRcdG1ldGEudGV4dHVyZXNbIHRoaXMudXVpZCBdID0gb3V0cHV0O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gb3V0cHV0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZyZWVzIHRoZSBHUFUtcmVsYXRlZCByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHRoaXMgaW5zdGFuY2UuIENhbGwgdGhpc1xyXG5cdCAqIG1ldGhvZCB3aGVuZXZlciB0aGlzIGluc3RhbmNlIGlzIG5vIGxvbmdlciB1c2VkIGluIHlvdXIgYXBwLlxyXG5cdCAqXHJcblx0ICogQGZpcmVzIFRleHR1cmUjZGlzcG9zZVxyXG5cdCAqL1xyXG5cdGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBGaXJlcyB3aGVuIHRoZSB0ZXh0dXJlIGhhcyBiZWVuIGRpc3Bvc2VkIG9mLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBldmVudCBUZXh0dXJlI2Rpc3Bvc2VcclxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnZGlzcG9zZScgfSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRyYW5zZm9ybXMgdGhlIGdpdmVuIHV2IHZlY3RvciB3aXRoIHRoZSB0ZXh0dXJlcyB1diB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IHV2IC0gVGhlIHV2IHZlY3Rvci5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBUaGUgdHJhbnNmb3JtZWQgdXYgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHRyYW5zZm9ybVV2KCB1diApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMubWFwcGluZyAhPT0gVVZNYXBwaW5nICkgcmV0dXJuIHV2O1xyXG5cclxuXHRcdHV2LmFwcGx5TWF0cml4MyggdGhpcy5tYXRyaXggKTtcclxuXHJcblx0XHRpZiAoIHV2LnggPCAwIHx8IHV2LnggPiAxICkge1xyXG5cclxuXHRcdFx0c3dpdGNoICggdGhpcy53cmFwUyApIHtcclxuXHJcblx0XHRcdFx0Y2FzZSBSZXBlYXRXcmFwcGluZzpcclxuXHJcblx0XHRcdFx0XHR1di54ID0gdXYueCAtIE1hdGguZmxvb3IoIHV2LnggKTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRjYXNlIENsYW1wVG9FZGdlV3JhcHBpbmc6XHJcblxyXG5cdFx0XHRcdFx0dXYueCA9IHV2LnggPCAwID8gMCA6IDE7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0Y2FzZSBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nOlxyXG5cclxuXHRcdFx0XHRcdGlmICggTWF0aC5hYnMoIE1hdGguZmxvb3IoIHV2LnggKSAlIDIgKSA9PT0gMSApIHtcclxuXHJcblx0XHRcdFx0XHRcdHV2LnggPSBNYXRoLmNlaWwoIHV2LnggKSAtIHV2Lng7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdHV2LnggPSB1di54IC0gTWF0aC5mbG9vciggdXYueCApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB1di55IDwgMCB8fCB1di55ID4gMSApIHtcclxuXHJcblx0XHRcdHN3aXRjaCAoIHRoaXMud3JhcFQgKSB7XHJcblxyXG5cdFx0XHRcdGNhc2UgUmVwZWF0V3JhcHBpbmc6XHJcblxyXG5cdFx0XHRcdFx0dXYueSA9IHV2LnkgLSBNYXRoLmZsb29yKCB1di55ICk7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0Y2FzZSBDbGFtcFRvRWRnZVdyYXBwaW5nOlxyXG5cclxuXHRcdFx0XHRcdHV2LnkgPSB1di55IDwgMCA/IDAgOiAxO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdGNhc2UgTWlycm9yZWRSZXBlYXRXcmFwcGluZzpcclxuXHJcblx0XHRcdFx0XHRpZiAoIE1hdGguYWJzKCBNYXRoLmZsb29yKCB1di55ICkgJSAyICkgPT09IDEgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHR1di55ID0gTWF0aC5jZWlsKCB1di55ICkgLSB1di55O1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHR1di55ID0gdXYueSAtIE1hdGguZmxvb3IoIHV2LnkgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy5mbGlwWSApIHtcclxuXHJcblx0XHRcdHV2LnkgPSAxIC0gdXYueTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHV2O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHRpbmcgdGhpcyBwcm9wZXJ0eSB0byBgdHJ1ZWAgaW5kaWNhdGVzIHRoZSBlbmdpbmUgdGhlIHRleHR1cmVcclxuXHQgKiBtdXN0IGJlIHVwZGF0ZWQgaW4gdGhlIG5leHQgcmVuZGVyLiBUaGlzIHRyaWdnZXJzIGEgdGV4dHVyZSB1cGxvYWRcclxuXHQgKiB0byB0aGUgR1BVIGFuZCBlbnN1cmVzIGNvcnJlY3QgdGV4dHVyZSBwYXJhbWV0ZXIgY29uZmlndXJhdGlvbi5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0ICogQHBhcmFtIHtib29sZWFufSB2YWx1ZVxyXG5cdCAqL1xyXG5cdHNldCBuZWVkc1VwZGF0ZSggdmFsdWUgKSB7XHJcblxyXG5cdFx0aWYgKCB2YWx1ZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdHRoaXMudmVyc2lvbiArKztcclxuXHRcdFx0dGhpcy5zb3VyY2UubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXR0aW5nIHRoaXMgcHJvcGVydHkgdG8gYHRydWVgIGluZGljYXRlcyB0aGUgZW5naW5lIHRoZSBQTVJFTVxyXG5cdCAqIG11c3QgYmUgcmVnZW5lcmF0ZWQuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsdWVcclxuXHQgKi9cclxuXHRzZXQgbmVlZHNQTVJFTVVwZGF0ZSggdmFsdWUgKSB7XHJcblxyXG5cdFx0aWYgKCB2YWx1ZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdHRoaXMucG1yZW1WZXJzaW9uICsrO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFRoZSBkZWZhdWx0IGltYWdlIGZvciBhbGwgdGV4dHVyZXMuXHJcbiAqXHJcbiAqIEBzdGF0aWNcclxuICogQHR5cGUgez9JbWFnZX1cclxuICogQGRlZmF1bHQgbnVsbFxyXG4gKi9cclxuVGV4dHVyZS5ERUZBVUxUX0lNQUdFID0gbnVsbDtcclxuXHJcbi8qKlxyXG4gKiBUaGUgZGVmYXVsdCBtYXBwaW5nIGZvciBhbGwgdGV4dHVyZXMuXHJcbiAqXHJcbiAqIEBzdGF0aWNcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGRlZmF1bHQgVVZNYXBwaW5nXHJcbiAqL1xyXG5UZXh0dXJlLkRFRkFVTFRfTUFQUElORyA9IFVWTWFwcGluZztcclxuXHJcbi8qKlxyXG4gKiBUaGUgZGVmYXVsdCBhbmlzb3Ryb3B5IHZhbHVlIGZvciBhbGwgdGV4dHVyZXMuXHJcbiAqXHJcbiAqIEBzdGF0aWNcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGRlZmF1bHQgMVxyXG4gKi9cclxuVGV4dHVyZS5ERUZBVUxUX0FOSVNPVFJPUFkgPSAxO1xyXG5cclxuZXhwb3J0IHsgVGV4dHVyZSB9O1xyXG4iLCJpbXBvcnQgeyBjbGFtcCB9IGZyb20gJy4vTWF0aFV0aWxzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgYSA0RCB2ZWN0b3IuIEEgNEQgdmVjdG9yIGlzIGFuIG9yZGVyZWQgcXVhZHJ1cGxldCBvZiBudW1iZXJzXHJcbiAqIChsYWJlbGVkIHgsIHksIHogYW5kIHcpLCB3aGljaCBjYW4gYmUgdXNlZCB0byByZXByZXNlbnQgYSBudW1iZXIgb2YgdGhpbmdzLCBzdWNoIGFzOlxyXG4gKlxyXG4gKiAtIEEgcG9pbnQgaW4gNEQgc3BhY2UuXHJcbiAqIC0gQSBkaXJlY3Rpb24gYW5kIGxlbmd0aCBpbiA0RCBzcGFjZS4gSW4gdGhyZWUuanMgdGhlIGxlbmd0aCB3aWxsXHJcbiAqIGFsd2F5cyBiZSB0aGUgRXVjbGlkZWFuIGRpc3RhbmNlKHN0cmFpZ2h0LWxpbmUgZGlzdGFuY2UpIGZyb20gYCgwLCAwLCAwLCAwKWAgdG8gYCh4LCB5LCB6LCB3KWBcclxuICogYW5kIHRoZSBkaXJlY3Rpb24gaXMgYWxzbyBtZWFzdXJlZCBmcm9tIGAoMCwgMCwgMCwgMClgIHRvd2FyZHMgYCh4LCB5LCB6LCB3KWAuXHJcbiAqIC0gQW55IGFyYml0cmFyeSBvcmRlcmVkIHF1YWRydXBsZXQgb2YgbnVtYmVycy5cclxuICpcclxuICogVGhlcmUgYXJlIG90aGVyIHRoaW5ncyBhIDREIHZlY3RvciBjYW4gYmUgdXNlZCB0byByZXByZXNlbnQsIGhvd2V2ZXIgdGhlc2VcclxuICogYXJlIHRoZSBtb3N0IGNvbW1vbiB1c2VzIGluICp0aHJlZS5qcyouXHJcbiAqXHJcbiAqIEl0ZXJhdGluZyB0aHJvdWdoIGEgdmVjdG9yIGluc3RhbmNlIHdpbGwgeWllbGQgaXRzIGNvbXBvbmVudHMgYCh4LCB5LCB6LCB3KWAgaW5cclxuICogdGhlIGNvcnJlc3BvbmRpbmcgb3JkZXIuXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGEgPSBuZXcgVEhSRUUuVmVjdG9yNCggMCwgMSwgMCwgMCApO1xyXG4gKlxyXG4gKiAvL25vIGFyZ3VtZW50czsgd2lsbCBiZSBpbml0aWFsaXNlZCB0byAoMCwgMCwgMCwgMSlcclxuICogY29uc3QgYiA9IG5ldyBUSFJFRS5WZWN0b3I0KCApO1xyXG4gKlxyXG4gKiBjb25zdCBkID0gYS5kb3QoIGIgKTtcclxuICogYGBgXHJcbiAqL1xyXG5jbGFzcyBWZWN0b3I0IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyA0RCB2ZWN0b3IuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3g9MF0gLSBUaGUgeCB2YWx1ZSBvZiB0aGlzIHZlY3Rvci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3k9MF0gLSBUaGUgeSB2YWx1ZSBvZiB0aGlzIHZlY3Rvci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3o9MF0gLSBUaGUgeiB2YWx1ZSBvZiB0aGlzIHZlY3Rvci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3c9MV0gLSBUaGUgdyB2YWx1ZSBvZiB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggeCA9IDAsIHkgPSAwLCB6ID0gMCwgdyA9IDEgKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHRWZWN0b3I0LnByb3RvdHlwZS5pc1ZlY3RvcjQgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHggdmFsdWUgb2YgdGhpcyB2ZWN0b3IuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy54ID0geDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB5IHZhbHVlIG9mIHRoaXMgdmVjdG9yLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMueSA9IHk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgeiB2YWx1ZSBvZiB0aGlzIHZlY3Rvci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnogPSB6O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHcgdmFsdWUgb2YgdGhpcyB2ZWN0b3IuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy53ID0gdztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBbGlhcyBmb3Ige0BsaW5rIFZlY3RvcjQjen0uXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdCAqL1xyXG5cdGdldCB3aWR0aCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy56O1xyXG5cclxuXHR9XHJcblxyXG5cdHNldCB3aWR0aCggdmFsdWUgKSB7XHJcblxyXG5cdFx0dGhpcy56ID0gdmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWxpYXMgZm9yIHtAbGluayBWZWN0b3I0I3d9LlxyXG5cdCAqXHJcblx0ICogQHR5cGUge251bWJlcn1cclxuXHQgKi9cclxuXHRnZXQgaGVpZ2h0KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnc7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0IGhlaWdodCggdmFsdWUgKSB7XHJcblxyXG5cdFx0dGhpcy53ID0gdmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdmVjdG9yIGNvbXBvbmVudHMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB2YWx1ZSBvZiB0aGUgeCBjb21wb25lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmFsdWUgb2YgdGhlIHkgY29tcG9uZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB6IC0gVGhlIHZhbHVlIG9mIHRoZSB6IGNvbXBvbmVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdyAtIFRoZSB2YWx1ZSBvZiB0aGUgdyBjb21wb25lbnQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yNH0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0c2V0KCB4LCB5LCB6LCB3ICkge1xyXG5cclxuXHRcdHRoaXMueCA9IHg7XHJcblx0XHR0aGlzLnkgPSB5O1xyXG5cdFx0dGhpcy56ID0gejtcclxuXHRcdHRoaXMudyA9IHc7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdmVjdG9yIGNvbXBvbmVudHMgdG8gdGhlIHNhbWUgdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc2NhbGFyIC0gVGhlIHZhbHVlIHRvIHNldCBmb3IgYWxsIHZlY3RvciBjb21wb25lbnRzLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHNldFNjYWxhciggc2NhbGFyICkge1xyXG5cclxuXHRcdHRoaXMueCA9IHNjYWxhcjtcclxuXHRcdHRoaXMueSA9IHNjYWxhcjtcclxuXHRcdHRoaXMueiA9IHNjYWxhcjtcclxuXHRcdHRoaXMudyA9IHNjYWxhcjtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB2ZWN0b3IncyB4IGNvbXBvbmVudCB0byB0aGUgZ2l2ZW4gdmFsdWVcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHZhbHVlIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3I0fSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRzZXRYKCB4ICkge1xyXG5cclxuXHRcdHRoaXMueCA9IHg7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdmVjdG9yJ3MgeSBjb21wb25lbnQgdG8gdGhlIGdpdmVuIHZhbHVlXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB2YWx1ZSB0byBzZXQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yNH0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0c2V0WSggeSApIHtcclxuXHJcblx0XHR0aGlzLnkgPSB5O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHZlY3RvcidzIHogY29tcG9uZW50IHRvIHRoZSBnaXZlbiB2YWx1ZVxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHogLSBUaGUgdmFsdWUgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHNldFooIHogKSB7XHJcblxyXG5cdFx0dGhpcy56ID0gejtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB2ZWN0b3IncyB3IGNvbXBvbmVudCB0byB0aGUgZ2l2ZW4gdmFsdWVcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB3IC0gVGhlIHZhbHVlIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3I0fSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRzZXRXKCB3ICkge1xyXG5cclxuXHRcdHRoaXMudyA9IHc7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWxsb3dzIHRvIHNldCBhIHZlY3RvciBjb21wb25lbnQgd2l0aCBhbiBpbmRleC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBjb21wb25lbnQgaW5kZXguIGAwYCBlcXVhbHMgdG8geCwgYDFgIGVxdWFscyB0byB5LFxyXG5cdCAqIGAyYCBlcXVhbHMgdG8geiwgYDNgIGVxdWFscyB0byB3LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBzZXQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yNH0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0c2V0Q29tcG9uZW50KCBpbmRleCwgdmFsdWUgKSB7XHJcblxyXG5cdFx0c3dpdGNoICggaW5kZXggKSB7XHJcblxyXG5cdFx0XHRjYXNlIDA6IHRoaXMueCA9IHZhbHVlOyBicmVhaztcclxuXHRcdFx0Y2FzZSAxOiB0aGlzLnkgPSB2YWx1ZTsgYnJlYWs7XHJcblx0XHRcdGNhc2UgMjogdGhpcy56ID0gdmFsdWU7IGJyZWFrO1xyXG5cdFx0XHRjYXNlIDM6IHRoaXMudyA9IHZhbHVlOyBicmVhaztcclxuXHRcdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCAnaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAnICsgaW5kZXggKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHZlY3RvciBjb21wb25lbnQgd2hpY2ggbWF0Y2hlcyB0aGUgZ2l2ZW4gaW5kZXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgY29tcG9uZW50IGluZGV4LiBgMGAgZXF1YWxzIHRvIHgsIGAxYCBlcXVhbHMgdG8geSxcclxuXHQgKiBgMmAgZXF1YWxzIHRvIHosIGAzYCBlcXVhbHMgdG8gdy5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IEEgdmVjdG9yIGNvbXBvbmVudCB2YWx1ZS5cclxuXHQgKi9cclxuXHRnZXRDb21wb25lbnQoIGluZGV4ICkge1xyXG5cclxuXHRcdHN3aXRjaCAoIGluZGV4ICkge1xyXG5cclxuXHRcdFx0Y2FzZSAwOiByZXR1cm4gdGhpcy54O1xyXG5cdFx0XHRjYXNlIDE6IHJldHVybiB0aGlzLnk7XHJcblx0XHRcdGNhc2UgMjogcmV0dXJuIHRoaXMuejtcclxuXHRcdFx0Y2FzZSAzOiByZXR1cm4gdGhpcy53O1xyXG5cdFx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoICdpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICcgKyBpbmRleCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbmV3IHZlY3RvciB3aXRoIGNvcGllZCB2YWx1ZXMgZnJvbSB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7VmVjdG9yNH0gQSBjbG9uZSBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNsb25lKCkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy54LCB0aGlzLnksIHRoaXMueiwgdGhpcy53ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29waWVzIHRoZSB2YWx1ZXMgb2YgdGhlIGdpdmVuIHZlY3RvciB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfFZlY3RvcjR9IHYgLSBUaGUgdmVjdG9yIHRvIGNvcHkuXHJcblx0ICogQHJldHVybiB7VmVjdG9yNH0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0Y29weSggdiApIHtcclxuXHJcblx0XHR0aGlzLnggPSB2Lng7XHJcblx0XHR0aGlzLnkgPSB2Lnk7XHJcblx0XHR0aGlzLnogPSB2Lno7XHJcblx0XHR0aGlzLncgPSAoIHYudyAhPT0gdW5kZWZpbmVkICkgPyB2LncgOiAxO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgdGhlIGdpdmVuIHZlY3RvciB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3I0fSB2IC0gVGhlIHZlY3RvciB0byBhZGQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yNH0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0YWRkKCB2ICkge1xyXG5cclxuXHRcdHRoaXMueCArPSB2Lng7XHJcblx0XHR0aGlzLnkgKz0gdi55O1xyXG5cdFx0dGhpcy56ICs9IHYuejtcclxuXHRcdHRoaXMudyArPSB2Lnc7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyB0aGUgZ2l2ZW4gc2NhbGFyIHZhbHVlIHRvIGFsbCBjb21wb25lbnRzIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gcyAtIFRoZSBzY2FsYXIgdG8gYWRkLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGFkZFNjYWxhciggcyApIHtcclxuXHJcblx0XHR0aGlzLnggKz0gcztcclxuXHRcdHRoaXMueSArPSBzO1xyXG5cdFx0dGhpcy56ICs9IHM7XHJcblx0XHR0aGlzLncgKz0gcztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIHRoZSBnaXZlbiB2ZWN0b3JzIGFuZCBzdG9yZXMgdGhlIHJlc3VsdCBpbiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3I0fSBhIC0gVGhlIGZpcnN0IHZlY3Rvci5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjR9IGIgLSBUaGUgc2Vjb25kIHZlY3Rvci5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3I0fSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRhZGRWZWN0b3JzKCBhLCBiICkge1xyXG5cclxuXHRcdHRoaXMueCA9IGEueCArIGIueDtcclxuXHRcdHRoaXMueSA9IGEueSArIGIueTtcclxuXHRcdHRoaXMueiA9IGEueiArIGIuejtcclxuXHRcdHRoaXMudyA9IGEudyArIGIudztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIHRoZSBnaXZlbiB2ZWN0b3Igc2NhbGVkIGJ5IHRoZSBnaXZlbiBmYWN0b3IgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yNH0gdiAtIFRoZSB2ZWN0b3IuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHMgLSBUaGUgZmFjdG9yIHRoYXQgc2NhbGVzIGB2YC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3I0fSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRhZGRTY2FsZWRWZWN0b3IoIHYsIHMgKSB7XHJcblxyXG5cdFx0dGhpcy54ICs9IHYueCAqIHM7XHJcblx0XHR0aGlzLnkgKz0gdi55ICogcztcclxuXHRcdHRoaXMueiArPSB2LnogKiBzO1xyXG5cdFx0dGhpcy53ICs9IHYudyAqIHM7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3VidHJhY3RzIHRoZSBnaXZlbiB2ZWN0b3IgZnJvbSB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3I0fSB2IC0gVGhlIHZlY3RvciB0byBzdWJ0cmFjdC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3I0fSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRzdWIoIHYgKSB7XHJcblxyXG5cdFx0dGhpcy54IC09IHYueDtcclxuXHRcdHRoaXMueSAtPSB2Lnk7XHJcblx0XHR0aGlzLnogLT0gdi56O1xyXG5cdFx0dGhpcy53IC09IHYudztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTdWJ0cmFjdHMgdGhlIGdpdmVuIHNjYWxhciB2YWx1ZSBmcm9tIGFsbCBjb21wb25lbnRzIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gcyAtIFRoZSBzY2FsYXIgdG8gc3VidHJhY3QuXHJcblx0ICogQHJldHVybiB7VmVjdG9yNH0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0c3ViU2NhbGFyKCBzICkge1xyXG5cclxuXHRcdHRoaXMueCAtPSBzO1xyXG5cdFx0dGhpcy55IC09IHM7XHJcblx0XHR0aGlzLnogLT0gcztcclxuXHRcdHRoaXMudyAtPSBzO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFN1YnRyYWN0cyB0aGUgZ2l2ZW4gdmVjdG9ycyBhbmQgc3RvcmVzIHRoZSByZXN1bHQgaW4gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yNH0gYSAtIFRoZSBmaXJzdCB2ZWN0b3IuXHJcblx0ICogQHBhcmFtIHtWZWN0b3I0fSBiIC0gVGhlIHNlY29uZCB2ZWN0b3IuXHJcblx0ICogQHJldHVybiB7VmVjdG9yNH0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0c3ViVmVjdG9ycyggYSwgYiApIHtcclxuXHJcblx0XHR0aGlzLnggPSBhLnggLSBiLng7XHJcblx0XHR0aGlzLnkgPSBhLnkgLSBiLnk7XHJcblx0XHR0aGlzLnogPSBhLnogLSBiLno7XHJcblx0XHR0aGlzLncgPSBhLncgLSBiLnc7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTXVsdGlwbGllcyB0aGUgZ2l2ZW4gdmVjdG9yIHdpdGggdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yNH0gdiAtIFRoZSB2ZWN0b3IgdG8gbXVsdGlwbHkuXHJcblx0ICogQHJldHVybiB7VmVjdG9yNH0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0bXVsdGlwbHkoIHYgKSB7XHJcblxyXG5cdFx0dGhpcy54ICo9IHYueDtcclxuXHRcdHRoaXMueSAqPSB2Lnk7XHJcblx0XHR0aGlzLnogKj0gdi56O1xyXG5cdFx0dGhpcy53ICo9IHYudztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBNdWx0aXBsaWVzIHRoZSBnaXZlbiBzY2FsYXIgdmFsdWUgd2l0aCBhbGwgY29tcG9uZW50cyBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHNjYWxhciAtIFRoZSBzY2FsYXIgdG8gbXVsdGlwbHkuXHJcblx0ICogQHJldHVybiB7VmVjdG9yNH0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0bXVsdGlwbHlTY2FsYXIoIHNjYWxhciApIHtcclxuXHJcblx0XHR0aGlzLnggKj0gc2NhbGFyO1xyXG5cdFx0dGhpcy55ICo9IHNjYWxhcjtcclxuXHRcdHRoaXMueiAqPSBzY2FsYXI7XHJcblx0XHR0aGlzLncgKj0gc2NhbGFyO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE11bHRpcGxpZXMgdGhpcyB2ZWN0b3Igd2l0aCB0aGUgZ2l2ZW4gNHg0IG1hdHJpeC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4NH0gbSAtIFRoZSA0eDQgbWF0cml4LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGFwcGx5TWF0cml4NCggbSApIHtcclxuXHJcblx0XHRjb25zdCB4ID0gdGhpcy54LCB5ID0gdGhpcy55LCB6ID0gdGhpcy56LCB3ID0gdGhpcy53O1xyXG5cdFx0Y29uc3QgZSA9IG0uZWxlbWVudHM7XHJcblxyXG5cdFx0dGhpcy54ID0gZVsgMCBdICogeCArIGVbIDQgXSAqIHkgKyBlWyA4IF0gKiB6ICsgZVsgMTIgXSAqIHc7XHJcblx0XHR0aGlzLnkgPSBlWyAxIF0gKiB4ICsgZVsgNSBdICogeSArIGVbIDkgXSAqIHogKyBlWyAxMyBdICogdztcclxuXHRcdHRoaXMueiA9IGVbIDIgXSAqIHggKyBlWyA2IF0gKiB5ICsgZVsgMTAgXSAqIHogKyBlWyAxNCBdICogdztcclxuXHRcdHRoaXMudyA9IGVbIDMgXSAqIHggKyBlWyA3IF0gKiB5ICsgZVsgMTEgXSAqIHogKyBlWyAxNSBdICogdztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEaXZpZGVzIHRoaXMgaW5zdGFuY2UgYnkgdGhlIGdpdmVuIHZlY3Rvci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yNH0gdiAtIFRoZSB2ZWN0b3IgdG8gZGl2aWRlLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGRpdmlkZSggdiApIHtcclxuXHJcblx0XHR0aGlzLnggLz0gdi54O1xyXG5cdFx0dGhpcy55IC89IHYueTtcclxuXHRcdHRoaXMueiAvPSB2Lno7XHJcblx0XHR0aGlzLncgLz0gdi53O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERpdmlkZXMgdGhpcyB2ZWN0b3IgYnkgdGhlIGdpdmVuIHNjYWxhci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzY2FsYXIgLSBUaGUgc2NhbGFyIHRvIGRpdmlkZS5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3I0fSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRkaXZpZGVTY2FsYXIoIHNjYWxhciApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseVNjYWxhciggMSAvIHNjYWxhciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHgsIHkgYW5kIHogY29tcG9uZW50cyBvZiB0aGlzXHJcblx0ICogdmVjdG9yIHRvIHRoZSBxdWF0ZXJuaW9uJ3MgYXhpcyBhbmQgdyB0byB0aGUgYW5nbGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1F1YXRlcm5pb259IHEgLSBUaGUgUXVhdGVybmlvbiB0byBzZXQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yNH0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0c2V0QXhpc0FuZ2xlRnJvbVF1YXRlcm5pb24oIHEgKSB7XHJcblxyXG5cdFx0Ly8gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvZ2VvbWV0cnkvcm90YXRpb25zL2NvbnZlcnNpb25zL3F1YXRlcm5pb25Ub0FuZ2xlL2luZGV4Lmh0bVxyXG5cclxuXHRcdC8vIHEgaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkXHJcblxyXG5cdFx0dGhpcy53ID0gMiAqIE1hdGguYWNvcyggcS53ICk7XHJcblxyXG5cdFx0Y29uc3QgcyA9IE1hdGguc3FydCggMSAtIHEudyAqIHEudyApO1xyXG5cclxuXHRcdGlmICggcyA8IDAuMDAwMSApIHtcclxuXHJcblx0XHRcdHRoaXMueCA9IDE7XHJcblx0XHRcdHRoaXMueSA9IDA7XHJcblx0XHRcdHRoaXMueiA9IDA7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHRoaXMueCA9IHEueCAvIHM7XHJcblx0XHRcdHRoaXMueSA9IHEueSAvIHM7XHJcblx0XHRcdHRoaXMueiA9IHEueiAvIHM7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHgsIHkgYW5kIHogY29tcG9uZW50cyBvZiB0aGlzXHJcblx0ICogdmVjdG9yIHRvIHRoZSBheGlzIG9mIHJvdGF0aW9uIGFuZCB3IHRvIHRoZSBhbmdsZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4NH0gbSAtIEEgNHg0IG1hdHJpeCBvZiB3aGljaCB0aGUgdXBwZXIgbGVmdCAzeDMgbWF0cml4IGlzIGEgcHVyZSByb3RhdGlvbiBtYXRyaXguXHJcblx0ICogQHJldHVybiB7VmVjdG9yNH0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0c2V0QXhpc0FuZ2xlRnJvbVJvdGF0aW9uTWF0cml4KCBtICkge1xyXG5cclxuXHRcdC8vIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2dlb21ldHJ5L3JvdGF0aW9ucy9jb252ZXJzaW9ucy9tYXRyaXhUb0FuZ2xlL2luZGV4Lmh0bVxyXG5cclxuXHRcdC8vIGFzc3VtZXMgdGhlIHVwcGVyIDN4MyBvZiBtIGlzIGEgcHVyZSByb3RhdGlvbiBtYXRyaXggKGkuZSwgdW5zY2FsZWQpXHJcblxyXG5cdFx0bGV0IGFuZ2xlLCB4LCB5LCB6OyAvLyB2YXJpYWJsZXMgZm9yIHJlc3VsdFxyXG5cdFx0Y29uc3QgZXBzaWxvbiA9IDAuMDEsXHRcdC8vIG1hcmdpbiB0byBhbGxvdyBmb3Igcm91bmRpbmcgZXJyb3JzXHJcblx0XHRcdGVwc2lsb24yID0gMC4xLFx0XHQvLyBtYXJnaW4gdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiAwIGFuZCAxODAgZGVncmVlc1xyXG5cclxuXHRcdFx0dGUgPSBtLmVsZW1lbnRzLFxyXG5cclxuXHRcdFx0bTExID0gdGVbIDAgXSwgbTEyID0gdGVbIDQgXSwgbTEzID0gdGVbIDggXSxcclxuXHRcdFx0bTIxID0gdGVbIDEgXSwgbTIyID0gdGVbIDUgXSwgbTIzID0gdGVbIDkgXSxcclxuXHRcdFx0bTMxID0gdGVbIDIgXSwgbTMyID0gdGVbIDYgXSwgbTMzID0gdGVbIDEwIF07XHJcblxyXG5cdFx0aWYgKCAoIE1hdGguYWJzKCBtMTIgLSBtMjEgKSA8IGVwc2lsb24gKSAmJlxyXG5cdFx0ICAgICAoIE1hdGguYWJzKCBtMTMgLSBtMzEgKSA8IGVwc2lsb24gKSAmJlxyXG5cdFx0ICAgICAoIE1hdGguYWJzKCBtMjMgLSBtMzIgKSA8IGVwc2lsb24gKSApIHtcclxuXHJcblx0XHRcdC8vIHNpbmd1bGFyaXR5IGZvdW5kXHJcblx0XHRcdC8vIGZpcnN0IGNoZWNrIGZvciBpZGVudGl0eSBtYXRyaXggd2hpY2ggbXVzdCBoYXZlICsxIGZvciBhbGwgdGVybXNcclxuXHRcdFx0Ly8gaW4gbGVhZGluZyBkaWFnb25hbCBhbmQgemVybyBpbiBvdGhlciB0ZXJtc1xyXG5cclxuXHRcdFx0aWYgKCAoIE1hdGguYWJzKCBtMTIgKyBtMjEgKSA8IGVwc2lsb24yICkgJiZcclxuXHRcdFx0ICAgICAoIE1hdGguYWJzKCBtMTMgKyBtMzEgKSA8IGVwc2lsb24yICkgJiZcclxuXHRcdFx0ICAgICAoIE1hdGguYWJzKCBtMjMgKyBtMzIgKSA8IGVwc2lsb24yICkgJiZcclxuXHRcdFx0ICAgICAoIE1hdGguYWJzKCBtMTEgKyBtMjIgKyBtMzMgLSAzICkgPCBlcHNpbG9uMiApICkge1xyXG5cclxuXHRcdFx0XHQvLyB0aGlzIHNpbmd1bGFyaXR5IGlzIGlkZW50aXR5IG1hdHJpeCBzbyBhbmdsZSA9IDBcclxuXHJcblx0XHRcdFx0dGhpcy5zZXQoIDEsIDAsIDAsIDAgKTtcclxuXHJcblx0XHRcdFx0cmV0dXJuIHRoaXM7IC8vIHplcm8gYW5nbGUsIGFyYml0cmFyeSBheGlzXHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBvdGhlcndpc2UgdGhpcyBzaW5ndWxhcml0eSBpcyBhbmdsZSA9IDE4MFxyXG5cclxuXHRcdFx0YW5nbGUgPSBNYXRoLlBJO1xyXG5cclxuXHRcdFx0Y29uc3QgeHggPSAoIG0xMSArIDEgKSAvIDI7XHJcblx0XHRcdGNvbnN0IHl5ID0gKCBtMjIgKyAxICkgLyAyO1xyXG5cdFx0XHRjb25zdCB6eiA9ICggbTMzICsgMSApIC8gMjtcclxuXHRcdFx0Y29uc3QgeHkgPSAoIG0xMiArIG0yMSApIC8gNDtcclxuXHRcdFx0Y29uc3QgeHogPSAoIG0xMyArIG0zMSApIC8gNDtcclxuXHRcdFx0Y29uc3QgeXogPSAoIG0yMyArIG0zMiApIC8gNDtcclxuXHJcblx0XHRcdGlmICggKCB4eCA+IHl5ICkgJiYgKCB4eCA+IHp6ICkgKSB7XHJcblxyXG5cdFx0XHRcdC8vIG0xMSBpcyB0aGUgbGFyZ2VzdCBkaWFnb25hbCB0ZXJtXHJcblxyXG5cdFx0XHRcdGlmICggeHggPCBlcHNpbG9uICkge1xyXG5cclxuXHRcdFx0XHRcdHggPSAwO1xyXG5cdFx0XHRcdFx0eSA9IDAuNzA3MTA2NzgxO1xyXG5cdFx0XHRcdFx0eiA9IDAuNzA3MTA2NzgxO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdHggPSBNYXRoLnNxcnQoIHh4ICk7XHJcblx0XHRcdFx0XHR5ID0geHkgLyB4O1xyXG5cdFx0XHRcdFx0eiA9IHh6IC8geDtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggeXkgPiB6eiApIHtcclxuXHJcblx0XHRcdFx0Ly8gbTIyIGlzIHRoZSBsYXJnZXN0IGRpYWdvbmFsIHRlcm1cclxuXHJcblx0XHRcdFx0aWYgKCB5eSA8IGVwc2lsb24gKSB7XHJcblxyXG5cdFx0XHRcdFx0eCA9IDAuNzA3MTA2NzgxO1xyXG5cdFx0XHRcdFx0eSA9IDA7XHJcblx0XHRcdFx0XHR6ID0gMC43MDcxMDY3ODE7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0eSA9IE1hdGguc3FydCggeXkgKTtcclxuXHRcdFx0XHRcdHggPSB4eSAvIHk7XHJcblx0XHRcdFx0XHR6ID0geXogLyB5O1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHQvLyBtMzMgaXMgdGhlIGxhcmdlc3QgZGlhZ29uYWwgdGVybSBzbyBiYXNlIHJlc3VsdCBvbiB0aGlzXHJcblxyXG5cdFx0XHRcdGlmICggenogPCBlcHNpbG9uICkge1xyXG5cclxuXHRcdFx0XHRcdHggPSAwLjcwNzEwNjc4MTtcclxuXHRcdFx0XHRcdHkgPSAwLjcwNzEwNjc4MTtcclxuXHRcdFx0XHRcdHogPSAwO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdHogPSBNYXRoLnNxcnQoIHp6ICk7XHJcblx0XHRcdFx0XHR4ID0geHogLyB6O1xyXG5cdFx0XHRcdFx0eSA9IHl6IC8gejtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5zZXQoIHgsIHksIHosIGFuZ2xlICk7XHJcblxyXG5cdFx0XHRyZXR1cm4gdGhpczsgLy8gcmV0dXJuIDE4MCBkZWcgcm90YXRpb25cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gYXMgd2UgaGF2ZSByZWFjaGVkIGhlcmUgdGhlcmUgYXJlIG5vIHNpbmd1bGFyaXRpZXMgc28gd2UgY2FuIGhhbmRsZSBub3JtYWxseVxyXG5cclxuXHRcdGxldCBzID0gTWF0aC5zcXJ0KCAoIG0zMiAtIG0yMyApICogKCBtMzIgLSBtMjMgKSArXHJcblx0XHRcdCggbTEzIC0gbTMxICkgKiAoIG0xMyAtIG0zMSApICtcclxuXHRcdFx0KCBtMjEgLSBtMTIgKSAqICggbTIxIC0gbTEyICkgKTsgLy8gdXNlZCB0byBub3JtYWxpemVcclxuXHJcblx0XHRpZiAoIE1hdGguYWJzKCBzICkgPCAwLjAwMSApIHMgPSAxO1xyXG5cclxuXHRcdC8vIHByZXZlbnQgZGl2aWRlIGJ5IHplcm8sIHNob3VsZCBub3QgaGFwcGVuIGlmIG1hdHJpeCBpcyBvcnRob2dvbmFsIGFuZCBzaG91bGQgYmVcclxuXHRcdC8vIGNhdWdodCBieSBzaW5ndWxhcml0eSB0ZXN0IGFib3ZlLCBidXQgSSd2ZSBsZWZ0IGl0IGluIGp1c3QgaW4gY2FzZVxyXG5cclxuXHRcdHRoaXMueCA9ICggbTMyIC0gbTIzICkgLyBzO1xyXG5cdFx0dGhpcy55ID0gKCBtMTMgLSBtMzEgKSAvIHM7XHJcblx0XHR0aGlzLnogPSAoIG0yMSAtIG0xMiApIC8gcztcclxuXHRcdHRoaXMudyA9IE1hdGguYWNvcyggKCBtMTEgKyBtMjIgKyBtMzMgLSAxICkgLyAyICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdmVjdG9yIGNvbXBvbmVudHMgdG8gdGhlIHBvc2l0aW9uIGVsZW1lbnRzIG9mIHRoZVxyXG5cdCAqIGdpdmVuIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4NH0gbSAtIFRoZSA0eDQgbWF0cml4LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHNldEZyb21NYXRyaXhQb3NpdGlvbiggbSApIHtcclxuXHJcblx0XHRjb25zdCBlID0gbS5lbGVtZW50cztcclxuXHJcblx0XHR0aGlzLnggPSBlWyAxMiBdO1xyXG5cdFx0dGhpcy55ID0gZVsgMTMgXTtcclxuXHRcdHRoaXMueiA9IGVbIDE0IF07XHJcblx0XHR0aGlzLncgPSBlWyAxNSBdO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIElmIHRoaXMgdmVjdG9yJ3MgeCwgeSwgeiBvciB3IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgZ2l2ZW4gdmVjdG9yJ3MgeCwgeSwgeiBvciB3XHJcblx0ICogdmFsdWUsIHJlcGxhY2UgdGhhdCB2YWx1ZSB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIG1pbiB2YWx1ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yNH0gdiAtIFRoZSB2ZWN0b3IuXHJcblx0ICogQHJldHVybiB7VmVjdG9yNH0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0bWluKCB2ICkge1xyXG5cclxuXHRcdHRoaXMueCA9IE1hdGgubWluKCB0aGlzLngsIHYueCApO1xyXG5cdFx0dGhpcy55ID0gTWF0aC5taW4oIHRoaXMueSwgdi55ICk7XHJcblx0XHR0aGlzLnogPSBNYXRoLm1pbiggdGhpcy56LCB2LnogKTtcclxuXHRcdHRoaXMudyA9IE1hdGgubWluKCB0aGlzLncsIHYudyApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIElmIHRoaXMgdmVjdG9yJ3MgeCwgeSwgeiBvciB3IHZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgZ2l2ZW4gdmVjdG9yJ3MgeCwgeSwgeiBvciB3XHJcblx0ICogdmFsdWUsIHJlcGxhY2UgdGhhdCB2YWx1ZSB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIG1heCB2YWx1ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yNH0gdiAtIFRoZSB2ZWN0b3IuXHJcblx0ICogQHJldHVybiB7VmVjdG9yNH0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0bWF4KCB2ICkge1xyXG5cclxuXHRcdHRoaXMueCA9IE1hdGgubWF4KCB0aGlzLngsIHYueCApO1xyXG5cdFx0dGhpcy55ID0gTWF0aC5tYXgoIHRoaXMueSwgdi55ICk7XHJcblx0XHR0aGlzLnogPSBNYXRoLm1heCggdGhpcy56LCB2LnogKTtcclxuXHRcdHRoaXMudyA9IE1hdGgubWF4KCB0aGlzLncsIHYudyApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIElmIHRoaXMgdmVjdG9yJ3MgeCwgeSwgeiBvciB3IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4IHZlY3RvcidzIHgsIHksIHogb3Igd1xyXG5cdCAqIHZhbHVlLCBpdCBpcyByZXBsYWNlZCBieSB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZS5cclxuXHQgKiBJZiB0aGlzIHZlY3RvcidzIHgsIHksIHogb3IgdyB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIG1pbiB2ZWN0b3IncyB4LCB5LCB6IG9yIHcgdmFsdWUsXHJcblx0ICogaXQgaXMgcmVwbGFjZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjR9IG1pbiAtIFRoZSBtaW5pbXVtIHgsIHkgYW5kIHogdmFsdWVzLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yNH0gbWF4IC0gVGhlIG1heGltdW0geCwgeSBhbmQgeiB2YWx1ZXMgaW4gdGhlIGRlc2lyZWQgcmFuZ2UuXHJcblx0ICogQHJldHVybiB7VmVjdG9yNH0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0Y2xhbXAoIG1pbiwgbWF4ICkge1xyXG5cclxuXHRcdC8vIGFzc3VtZXMgbWluIDwgbWF4LCBjb21wb25lbnR3aXNlXHJcblxyXG5cdFx0dGhpcy54ID0gY2xhbXAoIHRoaXMueCwgbWluLngsIG1heC54ICk7XHJcblx0XHR0aGlzLnkgPSBjbGFtcCggdGhpcy55LCBtaW4ueSwgbWF4LnkgKTtcclxuXHRcdHRoaXMueiA9IGNsYW1wKCB0aGlzLnosIG1pbi56LCBtYXgueiApO1xyXG5cdFx0dGhpcy53ID0gY2xhbXAoIHRoaXMudywgbWluLncsIG1heC53ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSWYgdGhpcyB2ZWN0b3IncyB4LCB5LCB6IG9yIHcgdmFsdWVzIGFyZSBncmVhdGVyIHRoYW4gdGhlIG1heCB2YWx1ZSwgdGhleSBhcmVcclxuXHQgKiByZXBsYWNlZCBieSB0aGUgbWF4IHZhbHVlLlxyXG5cdCAqIElmIHRoaXMgdmVjdG9yJ3MgeCwgeSwgeiBvciB3IHZhbHVlcyBhcmUgbGVzcyB0aGFuIHRoZSBtaW4gdmFsdWUsIHRoZXkgYXJlXHJcblx0ICogcmVwbGFjZWQgYnkgdGhlIG1pbiB2YWx1ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBtaW5WYWwgLSBUaGUgbWluaW11bSB2YWx1ZSB0aGUgY29tcG9uZW50cyB3aWxsIGJlIGNsYW1wZWQgdG8uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IG1heFZhbCAtIFRoZSBtYXhpbXVtIHZhbHVlIHRoZSBjb21wb25lbnRzIHdpbGwgYmUgY2xhbXBlZCB0by5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3I0fSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRjbGFtcFNjYWxhciggbWluVmFsLCBtYXhWYWwgKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gY2xhbXAoIHRoaXMueCwgbWluVmFsLCBtYXhWYWwgKTtcclxuXHRcdHRoaXMueSA9IGNsYW1wKCB0aGlzLnksIG1pblZhbCwgbWF4VmFsICk7XHJcblx0XHR0aGlzLnogPSBjbGFtcCggdGhpcy56LCBtaW5WYWwsIG1heFZhbCApO1xyXG5cdFx0dGhpcy53ID0gY2xhbXAoIHRoaXMudywgbWluVmFsLCBtYXhWYWwgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJZiB0aGlzIHZlY3RvcidzIGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gdGhlIG1heCB2YWx1ZSwgaXQgaXMgcmVwbGFjZWQgYnlcclxuXHQgKiB0aGUgbWF4IHZhbHVlLlxyXG5cdCAqIElmIHRoaXMgdmVjdG9yJ3MgbGVuZ3RoIGlzIGxlc3MgdGhhbiB0aGUgbWluIHZhbHVlLCBpdCBpcyByZXBsYWNlZCBieSB0aGVcclxuXHQgKiBtaW4gdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbWluIC0gVGhlIG1pbmltdW0gdmFsdWUgdGhlIHZlY3RvciBsZW5ndGggd2lsbCBiZSBjbGFtcGVkIHRvLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBtYXggLSBUaGUgbWF4aW11bSB2YWx1ZSB0aGUgdmVjdG9yIGxlbmd0aCB3aWxsIGJlIGNsYW1wZWQgdG8uXHJcblx0ICogQHJldHVybiB7VmVjdG9yNH0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0Y2xhbXBMZW5ndGgoIG1pbiwgbWF4ICkge1xyXG5cclxuXHRcdGNvbnN0IGxlbmd0aCA9IHRoaXMubGVuZ3RoKCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKCBsZW5ndGggfHwgMSApLm11bHRpcGx5U2NhbGFyKCBjbGFtcCggbGVuZ3RoLCBtaW4sIG1heCApICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGNvbXBvbmVudHMgb2YgdGhpcyB2ZWN0b3IgYXJlIHJvdW5kZWQgZG93biB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7VmVjdG9yNH0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0Zmxvb3IoKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gTWF0aC5mbG9vciggdGhpcy54ICk7XHJcblx0XHR0aGlzLnkgPSBNYXRoLmZsb29yKCB0aGlzLnkgKTtcclxuXHRcdHRoaXMueiA9IE1hdGguZmxvb3IoIHRoaXMueiApO1xyXG5cdFx0dGhpcy53ID0gTWF0aC5mbG9vciggdGhpcy53ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGNvbXBvbmVudHMgb2YgdGhpcyB2ZWN0b3IgYXJlIHJvdW5kZWQgdXAgdG8gdGhlIG5lYXJlc3QgaW50ZWdlciB2YWx1ZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGNlaWwoKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gTWF0aC5jZWlsKCB0aGlzLnggKTtcclxuXHRcdHRoaXMueSA9IE1hdGguY2VpbCggdGhpcy55ICk7XHJcblx0XHR0aGlzLnogPSBNYXRoLmNlaWwoIHRoaXMueiApO1xyXG5cdFx0dGhpcy53ID0gTWF0aC5jZWlsKCB0aGlzLncgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgY29tcG9uZW50cyBvZiB0aGlzIHZlY3RvciBhcmUgcm91bmRlZCB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyIHZhbHVlXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtWZWN0b3I0fSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRyb3VuZCgpIHtcclxuXHJcblx0XHR0aGlzLnggPSBNYXRoLnJvdW5kKCB0aGlzLnggKTtcclxuXHRcdHRoaXMueSA9IE1hdGgucm91bmQoIHRoaXMueSApO1xyXG5cdFx0dGhpcy56ID0gTWF0aC5yb3VuZCggdGhpcy56ICk7XHJcblx0XHR0aGlzLncgPSBNYXRoLnJvdW5kKCB0aGlzLncgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgY29tcG9uZW50cyBvZiB0aGlzIHZlY3RvciBhcmUgcm91bmRlZCB0b3dhcmRzIHplcm8gKHVwIGlmIG5lZ2F0aXZlLFxyXG5cdCAqIGRvd24gaWYgcG9zaXRpdmUpIHRvIGFuIGludGVnZXIgdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtWZWN0b3I0fSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRyb3VuZFRvWmVybygpIHtcclxuXHJcblx0XHR0aGlzLnggPSBNYXRoLnRydW5jKCB0aGlzLnggKTtcclxuXHRcdHRoaXMueSA9IE1hdGgudHJ1bmMoIHRoaXMueSApO1xyXG5cdFx0dGhpcy56ID0gTWF0aC50cnVuYyggdGhpcy56ICk7XHJcblx0XHR0aGlzLncgPSBNYXRoLnRydW5jKCB0aGlzLncgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJbnZlcnRzIHRoaXMgdmVjdG9yIC0gaS5lLiBzZXRzIHggPSAteCwgeSA9IC15LCB6ID0gLXosIHcgPSAtdy5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdG5lZ2F0ZSgpIHtcclxuXHJcblx0XHR0aGlzLnggPSAtIHRoaXMueDtcclxuXHRcdHRoaXMueSA9IC0gdGhpcy55O1xyXG5cdFx0dGhpcy56ID0gLSB0aGlzLno7XHJcblx0XHR0aGlzLncgPSAtIHRoaXMudztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDYWxjdWxhdGVzIHRoZSBkb3QgcHJvZHVjdCBvZiB0aGUgZ2l2ZW4gdmVjdG9yIHdpdGggdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yNH0gdiAtIFRoZSB2ZWN0b3IgdG8gY29tcHV0ZSB0aGUgZG90IHByb2R1Y3Qgd2l0aC5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSByZXN1bHQgb2YgdGhlIGRvdCBwcm9kdWN0LlxyXG5cdCAqL1xyXG5cdGRvdCggdiApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy54ICogdi54ICsgdGhpcy55ICogdi55ICsgdGhpcy56ICogdi56ICsgdGhpcy53ICogdi53O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSBzcXVhcmUgb2YgdGhlIEV1Y2xpZGVhbiBsZW5ndGggKHN0cmFpZ2h0LWxpbmUgbGVuZ3RoKSBmcm9tXHJcblx0ICogKDAsIDAsIDAsIDApIHRvICh4LCB5LCB6LCB3KS4gSWYgeW91IGFyZSBjb21wYXJpbmcgdGhlIGxlbmd0aHMgb2YgdmVjdG9ycywgeW91IHNob3VsZFxyXG5cdCAqIGNvbXBhcmUgdGhlIGxlbmd0aCBzcXVhcmVkIGluc3RlYWQgYXMgaXQgaXMgc2xpZ2h0bHkgbW9yZSBlZmZpY2llbnQgdG8gY2FsY3VsYXRlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgc3F1YXJlIGxlbmd0aCBvZiB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRsZW5ndGhTcSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55ICsgdGhpcy56ICogdGhpcy56ICsgdGhpcy53ICogdGhpcy53O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSAgRXVjbGlkZWFuIGxlbmd0aCAoc3RyYWlnaHQtbGluZSBsZW5ndGgpIGZyb20gKDAsIDAsIDAsIDApIHRvICh4LCB5LCB6LCB3KS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGxlbmd0aCBvZiB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRsZW5ndGgoKSB7XHJcblxyXG5cdFx0cmV0dXJuIE1hdGguc3FydCggdGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55ICsgdGhpcy56ICogdGhpcy56ICsgdGhpcy53ICogdGhpcy53ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgdGhlIE1hbmhhdHRhbiBsZW5ndGggb2YgdGhpcyB2ZWN0b3IuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBsZW5ndGggb2YgdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0bWFuaGF0dGFuTGVuZ3RoKCkge1xyXG5cclxuXHRcdHJldHVybiBNYXRoLmFicyggdGhpcy54ICkgKyBNYXRoLmFicyggdGhpcy55ICkgKyBNYXRoLmFicyggdGhpcy56ICkgKyBNYXRoLmFicyggdGhpcy53ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29udmVydHMgdGhpcyB2ZWN0b3IgdG8gYSB1bml0IHZlY3RvciAtIHRoYXQgaXMsIHNldHMgaXQgZXF1YWwgdG8gYSB2ZWN0b3JcclxuXHQgKiB3aXRoIHRoZSBzYW1lIGRpcmVjdGlvbiBhcyB0aGlzIG9uZSwgYnV0IHdpdGggYSB2ZWN0b3IgbGVuZ3RoIG9mIGAxYC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdG5vcm1hbGl6ZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoIHRoaXMubGVuZ3RoKCkgfHwgMSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhpcyB2ZWN0b3IgdG8gYSB2ZWN0b3Igd2l0aCB0aGUgc2FtZSBkaXJlY3Rpb24gYXMgdGhpcyBvbmUsIGJ1dFxyXG5cdCAqIHdpdGggdGhlIHNwZWNpZmllZCBsZW5ndGguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIC0gVGhlIG5ldyBsZW5ndGggb2YgdGhpcyB2ZWN0b3IuXHJcblx0ICogQHJldHVybiB7VmVjdG9yNH0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0c2V0TGVuZ3RoKCBsZW5ndGggKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoIGxlbmd0aCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIExpbmVhcmx5IGludGVycG9sYXRlcyBiZXR3ZWVuIHRoZSBnaXZlbiB2ZWN0b3IgYW5kIHRoaXMgaW5zdGFuY2UsIHdoZXJlXHJcblx0ICogYWxwaGEgaXMgdGhlIHBlcmNlbnQgZGlzdGFuY2UgYWxvbmcgdGhlIGxpbmUgLSBhbHBoYSA9IDAgd2lsbCBiZSB0aGlzXHJcblx0ICogdmVjdG9yLCBhbmQgYWxwaGEgPSAxIHdpbGwgYmUgdGhlIGdpdmVuIG9uZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yNH0gdiAtIFRoZSB2ZWN0b3IgdG8gaW50ZXJwb2xhdGUgdG93YXJkcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYWxwaGEgLSBUaGUgaW50ZXJwb2xhdGlvbiBmYWN0b3IsIHR5cGljYWxseSBpbiB0aGUgY2xvc2VkIGludGVydmFsIGBbMCwgMV1gLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGxlcnAoIHYsIGFscGhhICkge1xyXG5cclxuXHRcdHRoaXMueCArPSAoIHYueCAtIHRoaXMueCApICogYWxwaGE7XHJcblx0XHR0aGlzLnkgKz0gKCB2LnkgLSB0aGlzLnkgKSAqIGFscGhhO1xyXG5cdFx0dGhpcy56ICs9ICggdi56IC0gdGhpcy56ICkgKiBhbHBoYTtcclxuXHRcdHRoaXMudyArPSAoIHYudyAtIHRoaXMudyApICogYWxwaGE7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTGluZWFybHkgaW50ZXJwb2xhdGVzIGJldHdlZW4gdGhlIGdpdmVuIHZlY3RvcnMsIHdoZXJlIGFscGhhIGlzIHRoZSBwZXJjZW50XHJcblx0ICogZGlzdGFuY2UgYWxvbmcgdGhlIGxpbmUgLSBhbHBoYSA9IDAgd2lsbCBiZSBmaXJzdCB2ZWN0b3IsIGFuZCBhbHBoYSA9IDEgd2lsbFxyXG5cdCAqIGJlIHRoZSBzZWNvbmQgb25lLiBUaGUgcmVzdWx0IGlzIHN0b3JlZCBpbiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3I0fSB2MSAtIFRoZSBmaXJzdCB2ZWN0b3IuXHJcblx0ICogQHBhcmFtIHtWZWN0b3I0fSB2MiAtIFRoZSBzZWNvbmQgdmVjdG9yLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhbHBoYSAtIFRoZSBpbnRlcnBvbGF0aW9uIGZhY3RvciwgdHlwaWNhbGx5IGluIHRoZSBjbG9zZWQgaW50ZXJ2YWwgYFswLCAxXWAuXHJcblx0ICogQHJldHVybiB7VmVjdG9yNH0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0bGVycFZlY3RvcnMoIHYxLCB2MiwgYWxwaGEgKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gdjEueCArICggdjIueCAtIHYxLnggKSAqIGFscGhhO1xyXG5cdFx0dGhpcy55ID0gdjEueSArICggdjIueSAtIHYxLnkgKSAqIGFscGhhO1xyXG5cdFx0dGhpcy56ID0gdjEueiArICggdjIueiAtIHYxLnogKSAqIGFscGhhO1xyXG5cdFx0dGhpcy53ID0gdjEudyArICggdjIudyAtIHYxLncgKSAqIGFscGhhO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgdmVjdG9yIGlzIGVxdWFsIHdpdGggdGhlIGdpdmVuIG9uZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yNH0gdiAtIFRoZSB2ZWN0b3IgdG8gdGVzdCBmb3IgZXF1YWxpdHkuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGlzIHZlY3RvciBpcyBlcXVhbCB3aXRoIHRoZSBnaXZlbiBvbmUuXHJcblx0ICovXHJcblx0ZXF1YWxzKCB2ICkge1xyXG5cclxuXHRcdHJldHVybiAoICggdi54ID09PSB0aGlzLnggKSAmJiAoIHYueSA9PT0gdGhpcy55ICkgJiYgKCB2LnogPT09IHRoaXMueiApICYmICggdi53ID09PSB0aGlzLncgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhpcyB2ZWN0b3IncyB4IHZhbHVlIHRvIGJlIGBhcnJheVsgb2Zmc2V0IF1gLCB5IHZhbHVlIHRvIGJlIGBhcnJheVsgb2Zmc2V0ICsgMSBdYCxcclxuXHQgKiB6IHZhbHVlIHRvIGJlIGBhcnJheVsgb2Zmc2V0ICsgMiBdYCwgdyB2YWx1ZSB0byBiZSBgYXJyYXlbIG9mZnNldCArIDMgXWAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IGFycmF5IC0gQW4gYXJyYXkgaG9sZGluZyB0aGUgdmVjdG9yIGNvbXBvbmVudCB2YWx1ZXMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXQ9MF0gLSBUaGUgb2Zmc2V0IGludG8gdGhlIGFycmF5LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGZyb21BcnJheSggYXJyYXksIG9mZnNldCA9IDAgKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gYXJyYXlbIG9mZnNldCBdO1xyXG5cdFx0dGhpcy55ID0gYXJyYXlbIG9mZnNldCArIDEgXTtcclxuXHRcdHRoaXMueiA9IGFycmF5WyBvZmZzZXQgKyAyIF07XHJcblx0XHR0aGlzLncgPSBhcnJheVsgb2Zmc2V0ICsgMyBdO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdyaXRlcyB0aGUgY29tcG9uZW50cyBvZiB0aGlzIHZlY3RvciB0byB0aGUgZ2l2ZW4gYXJyYXkuIElmIG5vIGFycmF5IGlzIHByb3ZpZGVkLFxyXG5cdCAqIHRoZSBtZXRob2QgcmV0dXJucyBhIG5ldyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gW2FycmF5PVtdXSAtIFRoZSB0YXJnZXQgYXJyYXkgaG9sZGluZyB0aGUgdmVjdG9yIGNvbXBvbmVudHMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXQ9MF0gLSBJbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgYXJyYXkuXHJcblx0ICogQHJldHVybiB7QXJyYXk8bnVtYmVyPn0gVGhlIHZlY3RvciBjb21wb25lbnRzLlxyXG5cdCAqL1xyXG5cdHRvQXJyYXkoIGFycmF5ID0gW10sIG9mZnNldCA9IDAgKSB7XHJcblxyXG5cdFx0YXJyYXlbIG9mZnNldCBdID0gdGhpcy54O1xyXG5cdFx0YXJyYXlbIG9mZnNldCArIDEgXSA9IHRoaXMueTtcclxuXHRcdGFycmF5WyBvZmZzZXQgKyAyIF0gPSB0aGlzLno7XHJcblx0XHRhcnJheVsgb2Zmc2V0ICsgMyBdID0gdGhpcy53O1xyXG5cclxuXHRcdHJldHVybiBhcnJheTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBjb21wb25lbnRzIG9mIHRoaXMgdmVjdG9yIGZyb20gdGhlIGdpdmVuIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0J1ZmZlckF0dHJpYnV0ZX0gYXR0cmlidXRlIC0gVGhlIGJ1ZmZlciBhdHRyaWJ1dGUgaG9sZGluZyB2ZWN0b3IgZGF0YS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggaW50byB0aGUgYXR0cmlidXRlLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGZyb21CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgaW5kZXggKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gYXR0cmlidXRlLmdldFgoIGluZGV4ICk7XHJcblx0XHR0aGlzLnkgPSBhdHRyaWJ1dGUuZ2V0WSggaW5kZXggKTtcclxuXHRcdHRoaXMueiA9IGF0dHJpYnV0ZS5nZXRaKCBpbmRleCApO1xyXG5cdFx0dGhpcy53ID0gYXR0cmlidXRlLmdldFcoIGluZGV4ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyBlYWNoIGNvbXBvbmVudCBvZiB0aGlzIHZlY3RvciB0byBhIHBzZXVkby1yYW5kb20gdmFsdWUgYmV0d2VlbiBgMGAgYW5kXHJcblx0ICogYDFgLCBleGNsdWRpbmcgYDFgLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7VmVjdG9yNH0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0cmFuZG9tKCkge1xyXG5cclxuXHRcdHRoaXMueCA9IE1hdGgucmFuZG9tKCk7XHJcblx0XHR0aGlzLnkgPSBNYXRoLnJhbmRvbSgpO1xyXG5cdFx0dGhpcy56ID0gTWF0aC5yYW5kb20oKTtcclxuXHRcdHRoaXMudyA9IE1hdGgucmFuZG9tKCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0KlsgU3ltYm9sLml0ZXJhdG9yIF0oKSB7XHJcblxyXG5cdFx0eWllbGQgdGhpcy54O1xyXG5cdFx0eWllbGQgdGhpcy55O1xyXG5cdFx0eWllbGQgdGhpcy56O1xyXG5cdFx0eWllbGQgdGhpcy53O1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBWZWN0b3I0IH07XHJcbiIsImltcG9ydCB7IEV2ZW50RGlzcGF0Y2hlciB9IGZyb20gJy4vRXZlbnREaXNwYXRjaGVyLmpzJztcclxuaW1wb3J0IHsgVGV4dHVyZSB9IGZyb20gJy4uL3RleHR1cmVzL1RleHR1cmUuanMnO1xyXG5pbXBvcnQgeyBMaW5lYXJGaWx0ZXIgfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3I0IH0gZnJvbSAnLi4vbWF0aC9WZWN0b3I0LmpzJztcclxuaW1wb3J0IHsgU291cmNlIH0gZnJvbSAnLi4vdGV4dHVyZXMvU291cmNlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIHJlbmRlciB0YXJnZXQgaXMgYSBidWZmZXIgd2hlcmUgdGhlIHZpZGVvIGNhcmQgZHJhd3MgcGl4ZWxzIGZvciBhIHNjZW5lXHJcbiAqIHRoYXQgaXMgYmVpbmcgcmVuZGVyZWQgaW4gdGhlIGJhY2tncm91bmQuIEl0IGlzIHVzZWQgaW4gZGlmZmVyZW50IGVmZmVjdHMsXHJcbiAqIHN1Y2ggYXMgYXBwbHlpbmcgcG9zdHByb2Nlc3NpbmcgdG8gYSByZW5kZXJlZCBpbWFnZSBiZWZvcmUgZGlzcGxheWluZyBpdFxyXG4gKiBvbiB0aGUgc2NyZWVuLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgRXZlbnREaXNwYXRjaGVyXHJcbiAqL1xyXG5jbGFzcyBSZW5kZXJUYXJnZXQgZXh0ZW5kcyBFdmVudERpc3BhdGNoZXIge1xyXG5cclxuXHQvKipcclxuXHQgKiBSZW5kZXIgdGFyZ2V0IG9wdGlvbnMuXHJcblx0ICpcclxuXHQgKiBAdHlwZWRlZiB7T2JqZWN0fSBSZW5kZXJUYXJnZXR+T3B0aW9uc1xyXG5cdCAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2dlbmVyYXRlTWlwbWFwcz1mYWxzZV0gLSBXaGV0aGVyIHRvIGdlbmVyYXRlIG1pcG1hcHMgb3Igbm90LlxyXG5cdCAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbbWFnRmlsdGVyPUxpbmVhckZpbHRlcl0gLSBUaGUgbWFnIGZpbHRlci5cclxuXHQgKiBAcHJvcGVydHkge251bWJlcn0gW21pbkZpbHRlcj1MaW5lYXJGaWx0ZXJdIC0gVGhlIG1pbiBmaWx0ZXIuXHJcblx0ICogQHByb3BlcnR5IHtudW1iZXJ9IFtmb3JtYXQ9UkdCQUZvcm1hdF0gLSBUaGUgdGV4dHVyZSBmb3JtYXQuXHJcblx0ICogQHByb3BlcnR5IHtudW1iZXJ9IFt0eXBlPVVuc2lnbmVkQnl0ZVR5cGVdIC0gVGhlIHRleHR1cmUgdHlwZS5cclxuXHQgKiBAcHJvcGVydHkgez9zdHJpbmd9IFtpbnRlcm5hbEZvcm1hdD1udWxsXSAtIFRoZSB0ZXh0dXJlJ3MgaW50ZXJuYWwgZm9ybWF0LlxyXG5cdCAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbd3JhcFM9Q2xhbXBUb0VkZ2VXcmFwcGluZ10gLSBUaGUgdGV4dHVyZSdzIHV2IHdyYXBwaW5nIG1vZGUuXHJcblx0ICogQHByb3BlcnR5IHtudW1iZXJ9IFt3cmFwVD1DbGFtcFRvRWRnZVdyYXBwaW5nXSAtIFRoZSB0ZXh0dXJlJ3MgdXYgd3JhcHBpbmcgbW9kZS5cclxuXHQgKiBAcHJvcGVydHkge251bWJlcn0gW2FuaXNvdHJvcHk9MV0gLSBUaGUgdGV4dHVyZSdzIGFuaXNvdHJvcHkgdmFsdWUuXHJcblx0ICogQHByb3BlcnR5IHtzdHJpbmd9IFtjb2xvclNwYWNlPU5vQ29sb3JTcGFjZV0gLSBUaGUgdGV4dHVyZSdzIGNvbG9yIHNwYWNlLlxyXG5cdCAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2RlcHRoQnVmZmVyPXRydWVdIC0gV2hldGhlciB0byBhbGxvY2F0ZSBhIGRlcHRoIGJ1ZmZlciBvciBub3QuXHJcblx0ICogQHByb3BlcnR5IHtib29sZWFufSBbc3RlbmNpbEJ1ZmZlcj1mYWxzZV0gLSBXaGV0aGVyIHRvIGFsbG9jYXRlIGEgc3RlbmNpbCBidWZmZXIgb3Igbm90LlxyXG5cdCAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3Jlc29sdmVEZXB0aEJ1ZmZlcj10cnVlXSAtIFdoZXRoZXIgdG8gcmVzb2x2ZSB0aGUgZGVwdGggYnVmZmVyIG9yIG5vdC5cclxuXHQgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtyZXNvbHZlU3RlbmNpbEJ1ZmZlcj10cnVlXSAtIFdoZXRoZXIgIHRvIHJlc29sdmUgdGhlIHN0ZW5jaWwgYnVmZmVyIG9yIG5vdC5cclxuXHQgKiBAcHJvcGVydHkgez9UZXh0dXJlfSBbZGVwdGhUZXh0dXJlPW51bGxdIC0gUmVmZXJlbmNlIHRvIGEgZGVwdGggdGV4dHVyZS5cclxuXHQgKiBAcHJvcGVydHkge251bWJlcn0gW3NhbXBsZXM9MF0gLSBUaGUgTVNBQSBzYW1wbGVzIGNvdW50LlxyXG5cdCAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbY291bnQ9MV0gLSBEZWZpbmVzIHRoZSBudW1iZXIgb2YgY29sb3IgYXR0YWNobWVudHMgLiBNdXN0IGJlIGF0IGxlYXN0IGAxYC5cclxuXHQgKi9cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt3aWR0aD0xXSAtIFRoZSB3aWR0aCBvZiB0aGUgcmVuZGVyIHRhcmdldC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2hlaWdodD0xXSAtIFRoZSBoZWlnaHQgb2YgdGhlIHJlbmRlciB0YXJnZXQuXHJcblx0ICogQHBhcmFtIHtSZW5kZXJUYXJnZXR+T3B0aW9uc30gW29wdGlvbnNdIC0gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCB3aWR0aCA9IDEsIGhlaWdodCA9IDEsIG9wdGlvbnMgPSB7fSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1JlbmRlclRhcmdldCA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgd2lkdGggb2YgdGhlIHJlbmRlciB0YXJnZXQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy53aWR0aCA9IHdpZHRoO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGhlaWdodCBvZiB0aGUgcmVuZGVyIHRhcmdldC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmhlaWdodCA9IGhlaWdodDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBkZXB0aCBvZiB0aGUgcmVuZGVyIHRhcmdldC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRlcHRoID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVjdGFuZ3VsYXIgYXJlYSBpbnNpZGUgdGhlIHJlbmRlciB0YXJnZXQncyB2aWV3cG9ydC4gRnJhZ21lbnRzIHRoYXQgYXJlXHJcblx0XHQgKiBvdXRzaWRlIHRoZSBhcmVhIHdpbGwgYmUgZGlzY2FyZGVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3I0fVxyXG5cdFx0ICogQGRlZmF1bHQgKDAsMCx3aWR0aCxoZWlnaHQpXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2Npc3NvciA9IG5ldyBWZWN0b3I0KCAwLCAwLCB3aWR0aCwgaGVpZ2h0ICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc2Npc3NvciB0ZXN0IHNob3VsZCBiZSBlbmFibGVkIHdoZW4gcmVuZGVyaW5nIGludG9cclxuXHRcdCAqIHRoaXMgcmVuZGVyIHRhcmdldCBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNjaXNzb3JUZXN0ID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlY3Rhbmd1bGFyIGFyZWEgcmVwcmVzZW50aW5nIHRoZSByZW5kZXIgdGFyZ2V0J3Mgdmlld3BvcnQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjR9XHJcblx0XHQgKiBAZGVmYXVsdCAoMCwwLHdpZHRoLGhlaWdodClcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52aWV3cG9ydCA9IG5ldyBWZWN0b3I0KCAwLCAwLCB3aWR0aCwgaGVpZ2h0ICk7XHJcblxyXG5cdFx0Y29uc3QgaW1hZ2UgPSB7IHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQsIGRlcHRoOiAxIH07XHJcblxyXG5cdFx0b3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oIHtcclxuXHRcdFx0Z2VuZXJhdGVNaXBtYXBzOiBmYWxzZSxcclxuXHRcdFx0aW50ZXJuYWxGb3JtYXQ6IG51bGwsXHJcblx0XHRcdG1pbkZpbHRlcjogTGluZWFyRmlsdGVyLFxyXG5cdFx0XHRkZXB0aEJ1ZmZlcjogdHJ1ZSxcclxuXHRcdFx0c3RlbmNpbEJ1ZmZlcjogZmFsc2UsXHJcblx0XHRcdHJlc29sdmVEZXB0aEJ1ZmZlcjogdHJ1ZSxcclxuXHRcdFx0cmVzb2x2ZVN0ZW5jaWxCdWZmZXI6IHRydWUsXHJcblx0XHRcdGRlcHRoVGV4dHVyZTogbnVsbCxcclxuXHRcdFx0c2FtcGxlczogMCxcclxuXHRcdFx0Y291bnQ6IDFcclxuXHRcdH0sIG9wdGlvbnMgKTtcclxuXHJcblx0XHRjb25zdCB0ZXh0dXJlID0gbmV3IFRleHR1cmUoIGltYWdlLCBvcHRpb25zLm1hcHBpbmcsIG9wdGlvbnMud3JhcFMsIG9wdGlvbnMud3JhcFQsIG9wdGlvbnMubWFnRmlsdGVyLCBvcHRpb25zLm1pbkZpbHRlciwgb3B0aW9ucy5mb3JtYXQsIG9wdGlvbnMudHlwZSwgb3B0aW9ucy5hbmlzb3Ryb3B5LCBvcHRpb25zLmNvbG9yU3BhY2UgKTtcclxuXHJcblx0XHR0ZXh0dXJlLmZsaXBZID0gZmFsc2U7XHJcblx0XHR0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IG9wdGlvbnMuZ2VuZXJhdGVNaXBtYXBzO1xyXG5cdFx0dGV4dHVyZS5pbnRlcm5hbEZvcm1hdCA9IG9wdGlvbnMuaW50ZXJuYWxGb3JtYXQ7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBhcnJheSBvZiB0ZXh0dXJlcy4gRWFjaCBjb2xvciBhdHRhY2htZW50IGlzIHJlcHJlc2VudGVkIGFzIGEgc2VwYXJhdGUgdGV4dHVyZS5cclxuXHRcdCAqIEhhcyBhdCBsZWFzdCBhIHNpbmdsZSBlbnRyeSBmb3IgdGhlIGRlZmF1bHQgY29sb3IgYXR0YWNobWVudC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8VGV4dHVyZT59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudGV4dHVyZXMgPSBbXTtcclxuXHJcblx0XHRjb25zdCBjb3VudCA9IG9wdGlvbnMuY291bnQ7XHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSArKyApIHtcclxuXHJcblx0XHRcdHRoaXMudGV4dHVyZXNbIGkgXSA9IHRleHR1cmUuY2xvbmUoKTtcclxuXHRcdFx0dGhpcy50ZXh0dXJlc1sgaSBdLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSA9IHRydWU7XHJcblx0XHRcdHRoaXMudGV4dHVyZXNbIGkgXS5yZW5kZXJUYXJnZXQgPSB0aGlzO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdG8gYWxsb2NhdGUgYSBkZXB0aCBidWZmZXIgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRlcHRoQnVmZmVyID0gb3B0aW9ucy5kZXB0aEJ1ZmZlcjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdG8gYWxsb2NhdGUgYSBzdGVuY2lsIGJ1ZmZlciBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnN0ZW5jaWxCdWZmZXIgPSBvcHRpb25zLnN0ZW5jaWxCdWZmZXI7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRvIHJlc29sdmUgdGhlIGRlcHRoIGJ1ZmZlciBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVzb2x2ZURlcHRoQnVmZmVyID0gb3B0aW9ucy5yZXNvbHZlRGVwdGhCdWZmZXI7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRvIHJlc29sdmUgdGhlIHN0ZW5jaWwgYnVmZmVyIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yZXNvbHZlU3RlbmNpbEJ1ZmZlciA9IG9wdGlvbnMucmVzb2x2ZVN0ZW5jaWxCdWZmZXI7XHJcblxyXG5cdFx0dGhpcy5fZGVwdGhUZXh0dXJlID0gb3B0aW9ucy5kZXB0aFRleHR1cmU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbnVtYmVyIG9mIE1TQUEgc2FtcGxlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBBIHZhbHVlIG9mIGAwYCBkaXNhYmxlcyBNU0FBLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2FtcGxlcyA9IG9wdGlvbnMuc2FtcGxlcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgdGV4dHVyZSByZXByZXNlbnRpbmcgdGhlIGRlZmF1bHQgY29sb3IgYXR0YWNobWVudC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtUZXh0dXJlfVxyXG5cdCAqL1xyXG5cdGdldCB0ZXh0dXJlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnRleHR1cmVzWyAwIF07XHJcblxyXG5cdH1cclxuXHJcblx0c2V0IHRleHR1cmUoIHZhbHVlICkge1xyXG5cclxuXHRcdHRoaXMudGV4dHVyZXNbIDAgXSA9IHZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdHNldCBkZXB0aFRleHR1cmUoIGN1cnJlbnQgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9kZXB0aFRleHR1cmUgIT09IG51bGwgKSB0aGlzLl9kZXB0aFRleHR1cmUucmVuZGVyVGFyZ2V0ID0gbnVsbDtcclxuXHRcdGlmICggY3VycmVudCAhPT0gbnVsbCApIGN1cnJlbnQucmVuZGVyVGFyZ2V0ID0gdGhpcztcclxuXHJcblx0XHR0aGlzLl9kZXB0aFRleHR1cmUgPSBjdXJyZW50O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEluc3RlYWQgb2Ygc2F2aW5nIHRoZSBkZXB0aCBpbiBhIHJlbmRlcmJ1ZmZlciwgYSB0ZXh0dXJlXHJcblx0ICogY2FuIGJlIHVzZWQgaW5zdGVhZCB3aGljaCBpcyB1c2VmdWwgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZ1xyXG5cdCAqIGUuZy4gaW4gY29udGV4dCBvZiBwb3N0LXByb2Nlc3NpbmcuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7P0RlcHRoVGV4dHVyZX1cclxuXHQgKiBAZGVmYXVsdCBudWxsXHJcblx0ICovXHJcblx0Z2V0IGRlcHRoVGV4dHVyZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fZGVwdGhUZXh0dXJlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHNpemUgb2YgdGhpcyByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZGVwdGg9MV0gLSBUaGUgZGVwdGguXHJcblx0ICovXHJcblx0c2V0U2l6ZSggd2lkdGgsIGhlaWdodCwgZGVwdGggPSAxICkge1xyXG5cclxuXHRcdGlmICggdGhpcy53aWR0aCAhPT0gd2lkdGggfHwgdGhpcy5oZWlnaHQgIT09IGhlaWdodCB8fCB0aGlzLmRlcHRoICE9PSBkZXB0aCApIHtcclxuXHJcblx0XHRcdHRoaXMud2lkdGggPSB3aWR0aDtcclxuXHRcdFx0dGhpcy5oZWlnaHQgPSBoZWlnaHQ7XHJcblx0XHRcdHRoaXMuZGVwdGggPSBkZXB0aDtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSB0aGlzLnRleHR1cmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLnRleHR1cmVzWyBpIF0uaW1hZ2Uud2lkdGggPSB3aWR0aDtcclxuXHRcdFx0XHR0aGlzLnRleHR1cmVzWyBpIF0uaW1hZ2UuaGVpZ2h0ID0gaGVpZ2h0O1xyXG5cdFx0XHRcdHRoaXMudGV4dHVyZXNbIGkgXS5pbWFnZS5kZXB0aCA9IGRlcHRoO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5kaXNwb3NlKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMudmlld3BvcnQuc2V0KCAwLCAwLCB3aWR0aCwgaGVpZ2h0ICk7XHJcblx0XHR0aGlzLnNjaXNzb3Iuc2V0KCAwLCAwLCB3aWR0aCwgaGVpZ2h0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIG5ldyByZW5kZXIgdGFyZ2V0IHdpdGggY29waWVkIHZhbHVlcyBmcm9tIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtSZW5kZXJUYXJnZXR9IEEgY2xvbmUgb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjbG9uZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29waWVzIHRoZSBzZXR0aW5ncyBvZiB0aGUgZ2l2ZW4gcmVuZGVyIHRhcmdldC4gVGhpcyBpcyBhIHN0cnVjdHVyYWwgY29weSBzb1xyXG5cdCAqIG5vIHJlc291cmNlcyBhcmUgc2hhcmVkIGJldHdlZW4gcmVuZGVyIHRhcmdldHMgYWZ0ZXIgdGhlIGNvcHkuIFRoYXQgaW5jbHVkZXNcclxuXHQgKiBhbGwgTVJUIHRleHR1cmVzIGFuZCB0aGUgZGVwdGggdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyVGFyZ2V0fSBzb3VyY2UgLSBUaGUgcmVuZGVyIHRhcmdldCB0byBjb3B5LlxyXG5cdCAqIEByZXR1cm4ge1JlbmRlclRhcmdldH0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0dGhpcy53aWR0aCA9IHNvdXJjZS53aWR0aDtcclxuXHRcdHRoaXMuaGVpZ2h0ID0gc291cmNlLmhlaWdodDtcclxuXHRcdHRoaXMuZGVwdGggPSBzb3VyY2UuZGVwdGg7XHJcblxyXG5cdFx0dGhpcy5zY2lzc29yLmNvcHkoIHNvdXJjZS5zY2lzc29yICk7XHJcblx0XHR0aGlzLnNjaXNzb3JUZXN0ID0gc291cmNlLnNjaXNzb3JUZXN0O1xyXG5cclxuXHRcdHRoaXMudmlld3BvcnQuY29weSggc291cmNlLnZpZXdwb3J0ICk7XHJcblxyXG5cdFx0dGhpcy50ZXh0dXJlcy5sZW5ndGggPSAwO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBzb3VyY2UudGV4dHVyZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnRleHR1cmVzWyBpIF0gPSBzb3VyY2UudGV4dHVyZXNbIGkgXS5jbG9uZSgpO1xyXG5cdFx0XHR0aGlzLnRleHR1cmVzWyBpIF0uaXNSZW5kZXJUYXJnZXRUZXh0dXJlID0gdHJ1ZTtcclxuXHRcdFx0dGhpcy50ZXh0dXJlc1sgaSBdLnJlbmRlclRhcmdldCA9IHRoaXM7XHJcblxyXG5cdFx0XHQvLyBlbnN1cmUgaW1hZ2Ugb2JqZWN0IGlzIG5vdCBzaGFyZWQsIHNlZSAjMjAzMjhcclxuXHJcblx0XHRcdGNvbnN0IGltYWdlID0gT2JqZWN0LmFzc2lnbigge30sIHNvdXJjZS50ZXh0dXJlc1sgaSBdLmltYWdlICk7XHJcblx0XHRcdHRoaXMudGV4dHVyZXNbIGkgXS5zb3VyY2UgPSBuZXcgU291cmNlKCBpbWFnZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmRlcHRoQnVmZmVyID0gc291cmNlLmRlcHRoQnVmZmVyO1xyXG5cdFx0dGhpcy5zdGVuY2lsQnVmZmVyID0gc291cmNlLnN0ZW5jaWxCdWZmZXI7XHJcblxyXG5cdFx0dGhpcy5yZXNvbHZlRGVwdGhCdWZmZXIgPSBzb3VyY2UucmVzb2x2ZURlcHRoQnVmZmVyO1xyXG5cdFx0dGhpcy5yZXNvbHZlU3RlbmNpbEJ1ZmZlciA9IHNvdXJjZS5yZXNvbHZlU3RlbmNpbEJ1ZmZlcjtcclxuXHJcblx0XHRpZiAoIHNvdXJjZS5kZXB0aFRleHR1cmUgIT09IG51bGwgKSB0aGlzLmRlcHRoVGV4dHVyZSA9IHNvdXJjZS5kZXB0aFRleHR1cmUuY2xvbmUoKTtcclxuXHJcblx0XHR0aGlzLnNhbXBsZXMgPSBzb3VyY2Uuc2FtcGxlcztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGcmVlcyB0aGUgR1BVLXJlbGF0ZWQgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGlzIGluc3RhbmNlLiBDYWxsIHRoaXNcclxuXHQgKiBtZXRob2Qgd2hlbmV2ZXIgdGhpcyBpbnN0YW5jZSBpcyBubyBsb25nZXIgdXNlZCBpbiB5b3VyIGFwcC5cclxuXHQgKlxyXG5cdCAqIEBmaXJlcyBSZW5kZXJUYXJnZXQjZGlzcG9zZVxyXG5cdCAqL1xyXG5cdGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdkaXNwb3NlJyB9ICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFJlbmRlclRhcmdldCB9O1xyXG4iLCJpbXBvcnQgeyBSZW5kZXJUYXJnZXQgfSBmcm9tICcuLi9jb3JlL1JlbmRlclRhcmdldC5qcyc7XHJcblxyXG4vKipcclxuICogQSByZW5kZXIgdGFyZ2V0IHVzZWQgaW4gY29udGV4dCBvZiB7QGxpbmsgV2ViR0xSZW5kZXJlcn0uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBSZW5kZXJUYXJnZXRcclxuICovXHJcbmNsYXNzIFdlYkdMUmVuZGVyVGFyZ2V0IGV4dGVuZHMgUmVuZGVyVGFyZ2V0IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyAzRCByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt3aWR0aD0xXSAtIFRoZSB3aWR0aCBvZiB0aGUgcmVuZGVyIHRhcmdldC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2hlaWdodD0xXSAtIFRoZSBoZWlnaHQgb2YgdGhlIHJlbmRlciB0YXJnZXQuXHJcblx0ICogQHBhcmFtIHtSZW5kZXJUYXJnZXR+T3B0aW9uc30gW29wdGlvbnNdIC0gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCB3aWR0aCA9IDEsIGhlaWdodCA9IDEsIG9wdGlvbnMgPSB7fSApIHtcclxuXHJcblx0XHRzdXBlciggd2lkdGgsIGhlaWdodCwgb3B0aW9ucyApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1dlYkdMUmVuZGVyVGFyZ2V0ID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgV2ViR0xSZW5kZXJUYXJnZXQgfTtcclxuIiwiaW1wb3J0IHsgVGV4dHVyZSB9IGZyb20gJy4vVGV4dHVyZS5qcyc7XHJcbmltcG9ydCB7IENsYW1wVG9FZGdlV3JhcHBpbmcsIE5lYXJlc3RGaWx0ZXIgfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGV4dHVyZXMgZGlyZWN0bHkgZnJvbSByYXcgYnVmZmVyIGRhdGEuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBUZXh0dXJlXHJcbiAqL1xyXG5jbGFzcyBEYXRhQXJyYXlUZXh0dXJlIGV4dGVuZHMgVGV4dHVyZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgZGF0YSBhcnJheSB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHs/VHlwZWRBcnJheX0gW2RhdGE9bnVsbF0gLSBUaGUgYnVmZmVyIGRhdGEuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt3aWR0aD0xXSAtIFRoZSB3aWR0aCBvZiB0aGUgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2hlaWdodD0xXSAtIFRoZSBoZWlnaHQgb2YgdGhlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtkZXB0aD0xXSAtIFRoZSBkZXB0aCBvZiB0aGUgdGV4dHVyZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggZGF0YSA9IG51bGwsIHdpZHRoID0gMSwgaGVpZ2h0ID0gMSwgZGVwdGggPSAxICkge1xyXG5cclxuXHRcdHN1cGVyKCBudWxsICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzRGF0YUFycmF5VGV4dHVyZSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgaW1hZ2UgZGVmaW5pdGlvbiBvZiBhIGRhdGEgdGV4dHVyZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7e2RhdGE6VHlwZWRBcnJheSx3aWR0aDpudW1iZXIsaGVpZ2h0Om51bWJlcixkZXB0aDpudW1iZXJ9fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmltYWdlID0geyBkYXRhLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCB9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG93IHRoZSB0ZXh0dXJlIGlzIHNhbXBsZWQgd2hlbiBhIHRleGVsIGNvdmVycyBtb3JlIHRoYW4gb25lIHBpeGVsLlxyXG5cdFx0ICpcclxuXHRcdCAqIE92ZXJ3cml0dGVuIGFuZCBzZXQgdG8gYE5lYXJlc3RGaWx0ZXJgIGJ5IGRlZmF1bHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeyhOZWFyZXN0RmlsdGVyfE5lYXJlc3RNaXBtYXBOZWFyZXN0RmlsdGVyfE5lYXJlc3RNaXBtYXBMaW5lYXJGaWx0ZXJ8TGluZWFyRmlsdGVyfExpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXJ8TGluZWFyTWlwbWFwTGluZWFyRmlsdGVyKX1cclxuXHRcdCAqIEBkZWZhdWx0IE5lYXJlc3RGaWx0ZXJcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tYWdGaWx0ZXIgPSBOZWFyZXN0RmlsdGVyO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG93IHRoZSB0ZXh0dXJlIGlzIHNhbXBsZWQgd2hlbiBhIHRleGVsIGNvdmVycyBsZXNzIHRoYW4gb25lIHBpeGVsLlxyXG5cdFx0ICpcclxuXHRcdCAqIE92ZXJ3cml0dGVuIGFuZCBzZXQgdG8gYE5lYXJlc3RGaWx0ZXJgIGJ5IGRlZmF1bHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeyhOZWFyZXN0RmlsdGVyfE5lYXJlc3RNaXBtYXBOZWFyZXN0RmlsdGVyfE5lYXJlc3RNaXBtYXBMaW5lYXJGaWx0ZXJ8TGluZWFyRmlsdGVyfExpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXJ8TGluZWFyTWlwbWFwTGluZWFyRmlsdGVyKX1cclxuXHRcdCAqIEBkZWZhdWx0IE5lYXJlc3RGaWx0ZXJcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5taW5GaWx0ZXIgPSBOZWFyZXN0RmlsdGVyO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBkZWZpbmVzIGhvdyB0aGUgdGV4dHVyZSBpcyB3cmFwcGVkIGluIHRoZSBkZXB0aCBhbmQgY29ycmVzcG9uZHMgdG9cclxuXHRcdCAqICpXKiBpbiBVVlcgbWFwcGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KFJlcGVhdFdyYXBwaW5nfENsYW1wVG9FZGdlV3JhcHBpbmd8TWlycm9yZWRSZXBlYXRXcmFwcGluZyl9XHJcblx0XHQgKiBAZGVmYXVsdCBDbGFtcFRvRWRnZVdyYXBwaW5nXHJcblx0XHQgKi9cclxuXHRcdHRoaXMud3JhcFIgPSBDbGFtcFRvRWRnZVdyYXBwaW5nO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0byBnZW5lcmF0ZSBtaXBtYXBzIChpZiBwb3NzaWJsZSkgZm9yIGEgdGV4dHVyZS5cclxuXHRcdCAqXHJcblx0XHQgKiBPdmVyd3JpdHRlbiBhbmQgc2V0IHRvIGBmYWxzZWAgYnkgZGVmYXVsdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBJZiBzZXQgdG8gYHRydWVgLCB0aGUgdGV4dHVyZSBpcyBmbGlwcGVkIGFsb25nIHRoZSB2ZXJ0aWNhbCBheGlzIHdoZW5cclxuXHRcdCAqIHVwbG9hZGVkIHRvIHRoZSBHUFUuXHJcblx0XHQgKlxyXG5cdFx0ICogT3ZlcndyaXR0ZW4gYW5kIHNldCB0byBgZmFsc2VgIGJ5IGRlZmF1bHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZsaXBZID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTcGVjaWZpZXMgdGhlIGFsaWdubWVudCByZXF1aXJlbWVudHMgZm9yIHRoZSBzdGFydCBvZiBlYWNoIHBpeGVsIHJvdyBpbiBtZW1vcnkuXHJcblx0XHQgKlxyXG5cdFx0ICogT3ZlcndyaXR0ZW4gYW5kIHNldCB0byBgMWAgYnkgZGVmYXVsdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51bnBhY2tBbGlnbm1lbnQgPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBzZXQgb2YgYWxsIGxheWVycyB3aGljaCBuZWVkIHRvIGJlIHVwZGF0ZWQgaW4gdGhlIHRleHR1cmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1NldDxudW1iZXI+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxheWVyVXBkYXRlcyA9IG5ldyBTZXQoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZXNjcmliZXMgdGhhdCBhIHNwZWNpZmljIGxheWVyIG9mIHRoZSB0ZXh0dXJlIG5lZWRzIHRvIGJlIHVwZGF0ZWQuXHJcblx0ICogTm9ybWFsbHkgd2hlbiB7QGxpbmsgVGV4dHVyZSNuZWVkc1VwZGF0ZX0gaXMgc2V0IHRvIGB0cnVlYCwgdGhlXHJcblx0ICogZW50aXJlIGRhdGEgdGV4dHVyZSBhcnJheSBpcyBzZW50IHRvIHRoZSBHUFUuIE1hcmtpbmcgc3BlY2lmaWNcclxuXHQgKiBsYXllcnMgd2lsbCBvbmx5IHRyYW5zbWl0IHN1YnNldHMgb2YgYWxsIG1pcG1hcHMgYXNzb2NpYXRlZCB3aXRoIGFcclxuXHQgKiBzcGVjaWZpYyBkZXB0aCBpbiB0aGUgYXJyYXkgd2hpY2ggaXMgb2Z0ZW4gbXVjaCBtb3JlIHBlcmZvcm1hbnQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbGF5ZXJJbmRleCAtIFRoZSBsYXllciBpbmRleCB0aGF0IHNob3VsZCBiZSB1cGRhdGVkLlxyXG5cdCAqL1xyXG5cdGFkZExheWVyVXBkYXRlKCBsYXllckluZGV4ICkge1xyXG5cclxuXHRcdHRoaXMubGF5ZXJVcGRhdGVzLmFkZCggbGF5ZXJJbmRleCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlc2V0cyB0aGUgbGF5ZXIgdXBkYXRlcyByZWdpc3RyeS5cclxuXHQgKi9cclxuXHRjbGVhckxheWVyVXBkYXRlcygpIHtcclxuXHJcblx0XHR0aGlzLmxheWVyVXBkYXRlcy5jbGVhcigpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBEYXRhQXJyYXlUZXh0dXJlIH07XHJcbiIsImltcG9ydCB7IFdlYkdMUmVuZGVyVGFyZ2V0IH0gZnJvbSAnLi9XZWJHTFJlbmRlclRhcmdldC5qcyc7XHJcbmltcG9ydCB7IERhdGFBcnJheVRleHR1cmUgfSBmcm9tICcuLi90ZXh0dXJlcy9EYXRhQXJyYXlUZXh0dXJlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBbiBhcnJheSByZW5kZXIgdGFyZ2V0IHVzZWQgaW4gY29udGV4dCBvZiB7QGxpbmsgV2ViR0xSZW5kZXJlcn0uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBXZWJHTFJlbmRlclRhcmdldFxyXG4gKi9cclxuY2xhc3MgV2ViR0xBcnJheVJlbmRlclRhcmdldCBleHRlbmRzIFdlYkdMUmVuZGVyVGFyZ2V0IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBhcnJheSByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt3aWR0aD0xXSAtIFRoZSB3aWR0aCBvZiB0aGUgcmVuZGVyIHRhcmdldC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2hlaWdodD0xXSAtIFRoZSBoZWlnaHQgb2YgdGhlIHJlbmRlciB0YXJnZXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtkZXB0aD0xXSAtIFRoZSBoZWlnaHQgb2YgdGhlIHJlbmRlciB0YXJnZXQuXHJcblx0ICogQHBhcmFtIHtSZW5kZXJUYXJnZXR+T3B0aW9uc30gW29wdGlvbnNdIC0gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCB3aWR0aCA9IDEsIGhlaWdodCA9IDEsIGRlcHRoID0gMSwgb3B0aW9ucyA9IHt9ICkge1xyXG5cclxuXHRcdHN1cGVyKCB3aWR0aCwgaGVpZ2h0LCBvcHRpb25zICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzV2ViR0xBcnJheVJlbmRlclRhcmdldCA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy5kZXB0aCA9IGRlcHRoO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogT3ZlcndyaXR0ZW4gd2l0aCBhIGRpZmZlcmVudCB0ZXh0dXJlIHR5cGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0RhdGFBcnJheVRleHR1cmV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudGV4dHVyZSA9IG5ldyBEYXRhQXJyYXlUZXh0dXJlKCBudWxsLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCApO1xyXG5cclxuXHRcdHRoaXMudGV4dHVyZS5pc1JlbmRlclRhcmdldFRleHR1cmUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBXZWJHTEFycmF5UmVuZGVyVGFyZ2V0IH07XHJcbiIsImltcG9ydCB7IFRleHR1cmUgfSBmcm9tICcuL1RleHR1cmUuanMnO1xyXG5pbXBvcnQgeyBDbGFtcFRvRWRnZVdyYXBwaW5nLCBOZWFyZXN0RmlsdGVyIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgdGhyZWUtZGltZW5zaW9uYWwgdGV4dHVyZSBmcm9tIHJhdyBkYXRhLCB3aXRoIHBhcmFtZXRlcnMgdG9cclxuICogZGl2aWRlIGl0IGludG8gd2lkdGgsIGhlaWdodCwgYW5kIGRlcHRoLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgVGV4dHVyZVxyXG4gKi9cclxuY2xhc3MgRGF0YTNEVGV4dHVyZSBleHRlbmRzIFRleHR1cmUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGRhdGEgYXJyYXkgdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7P1R5cGVkQXJyYXl9IFtkYXRhPW51bGxdIC0gVGhlIGJ1ZmZlciBkYXRhLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbd2lkdGg9MV0gLSBUaGUgd2lkdGggb2YgdGhlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtoZWlnaHQ9MV0gLSBUaGUgaGVpZ2h0IG9mIHRoZSB0ZXh0dXJlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZGVwdGg9MV0gLSBUaGUgZGVwdGggb2YgdGhlIHRleHR1cmUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGRhdGEgPSBudWxsLCB3aWR0aCA9IDEsIGhlaWdodCA9IDEsIGRlcHRoID0gMSApIHtcclxuXHJcblx0XHQvLyBXZSdyZSBnb2luZyB0byBhZGQgLnNldFhYWCgpIG1ldGhvZHMgZm9yIHNldHRpbmcgcHJvcGVydGllcyBsYXRlci5cclxuXHRcdC8vIFVzZXJzIGNhbiBzdGlsbCBzZXQgaW4gRGF0YTNEVGV4dHVyZSBkaXJlY3RseS5cclxuXHRcdC8vXHJcblx0XHQvL1x0Y29uc3QgdGV4dHVyZSA9IG5ldyBUSFJFRS5EYXRhM0RUZXh0dXJlKCBkYXRhLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCApO1xyXG5cdFx0Ly8gXHR0ZXh0dXJlLmFuaXNvdHJvcHkgPSAxNjtcclxuXHRcdC8vXHJcblx0XHQvLyBTZWUgIzE0ODM5XHJcblxyXG5cdFx0c3VwZXIoIG51bGwgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNEYXRhM0RUZXh0dXJlID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBpbWFnZSBkZWZpbml0aW9uIG9mIGEgZGF0YSB0ZXh0dXJlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHt7ZGF0YTpUeXBlZEFycmF5LHdpZHRoOm51bWJlcixoZWlnaHQ6bnVtYmVyLGRlcHRoOm51bWJlcn19XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaW1hZ2UgPSB7IGRhdGEsIHdpZHRoLCBoZWlnaHQsIGRlcHRoIH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3cgdGhlIHRleHR1cmUgaXMgc2FtcGxlZCB3aGVuIGEgdGV4ZWwgY292ZXJzIG1vcmUgdGhhbiBvbmUgcGl4ZWwuXHJcblx0XHQgKlxyXG5cdFx0ICogT3ZlcndyaXR0ZW4gYW5kIHNldCB0byBgTmVhcmVzdEZpbHRlcmAgYnkgZGVmYXVsdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KE5lYXJlc3RGaWx0ZXJ8TmVhcmVzdE1pcG1hcE5lYXJlc3RGaWx0ZXJ8TmVhcmVzdE1pcG1hcExpbmVhckZpbHRlcnxMaW5lYXJGaWx0ZXJ8TGluZWFyTWlwbWFwTmVhcmVzdEZpbHRlcnxMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXIpfVxyXG5cdFx0ICogQGRlZmF1bHQgTmVhcmVzdEZpbHRlclxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1hZ0ZpbHRlciA9IE5lYXJlc3RGaWx0ZXI7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3cgdGhlIHRleHR1cmUgaXMgc2FtcGxlZCB3aGVuIGEgdGV4ZWwgY292ZXJzIGxlc3MgdGhhbiBvbmUgcGl4ZWwuXHJcblx0XHQgKlxyXG5cdFx0ICogT3ZlcndyaXR0ZW4gYW5kIHNldCB0byBgTmVhcmVzdEZpbHRlcmAgYnkgZGVmYXVsdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KE5lYXJlc3RGaWx0ZXJ8TmVhcmVzdE1pcG1hcE5lYXJlc3RGaWx0ZXJ8TmVhcmVzdE1pcG1hcExpbmVhckZpbHRlcnxMaW5lYXJGaWx0ZXJ8TGluZWFyTWlwbWFwTmVhcmVzdEZpbHRlcnxMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXIpfVxyXG5cdFx0ICogQGRlZmF1bHQgTmVhcmVzdEZpbHRlclxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1pbkZpbHRlciA9IE5lYXJlc3RGaWx0ZXI7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGRlZmluZXMgaG93IHRoZSB0ZXh0dXJlIGlzIHdyYXBwZWQgaW4gdGhlIGRlcHRoIGFuZCBjb3JyZXNwb25kcyB0b1xyXG5cdFx0ICogKlcqIGluIFVWVyBtYXBwaW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoUmVwZWF0V3JhcHBpbmd8Q2xhbXBUb0VkZ2VXcmFwcGluZ3xNaXJyb3JlZFJlcGVhdFdyYXBwaW5nKX1cclxuXHRcdCAqIEBkZWZhdWx0IENsYW1wVG9FZGdlV3JhcHBpbmdcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy53cmFwUiA9IENsYW1wVG9FZGdlV3JhcHBpbmc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRvIGdlbmVyYXRlIG1pcG1hcHMgKGlmIHBvc3NpYmxlKSBmb3IgYSB0ZXh0dXJlLlxyXG5cdFx0ICpcclxuXHRcdCAqIE92ZXJ3cml0dGVuIGFuZCBzZXQgdG8gYGZhbHNlYCBieSBkZWZhdWx0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIElmIHNldCB0byBgdHJ1ZWAsIHRoZSB0ZXh0dXJlIGlzIGZsaXBwZWQgYWxvbmcgdGhlIHZlcnRpY2FsIGF4aXMgd2hlblxyXG5cdFx0ICogdXBsb2FkZWQgdG8gdGhlIEdQVS5cclxuXHRcdCAqXHJcblx0XHQgKiBPdmVyd3JpdHRlbiBhbmQgc2V0IHRvIGBmYWxzZWAgYnkgZGVmYXVsdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZmxpcFkgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNwZWNpZmllcyB0aGUgYWxpZ25tZW50IHJlcXVpcmVtZW50cyBmb3IgdGhlIHN0YXJ0IG9mIGVhY2ggcGl4ZWwgcm93IGluIG1lbW9yeS5cclxuXHRcdCAqXHJcblx0XHQgKiBPdmVyd3JpdHRlbiBhbmQgc2V0IHRvIGAxYCBieSBkZWZhdWx0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVucGFja0FsaWdubWVudCA9IDE7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IERhdGEzRFRleHR1cmUgfTtcclxuIiwiaW1wb3J0IHsgV2ViR0xSZW5kZXJUYXJnZXQgfSBmcm9tICcuL1dlYkdMUmVuZGVyVGFyZ2V0LmpzJztcclxuaW1wb3J0IHsgRGF0YTNEVGV4dHVyZSB9IGZyb20gJy4uL3RleHR1cmVzL0RhdGEzRFRleHR1cmUuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgM0QgcmVuZGVyIHRhcmdldCB1c2VkIGluIGNvbnRleHQgb2Yge0BsaW5rIFdlYkdMUmVuZGVyZXJ9LlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgV2ViR0xSZW5kZXJUYXJnZXRcclxuICovXHJcbmNsYXNzIFdlYkdMM0RSZW5kZXJUYXJnZXQgZXh0ZW5kcyBXZWJHTFJlbmRlclRhcmdldCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgM0QgcmVuZGVyIHRhcmdldC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbd2lkdGg9MV0gLSBUaGUgd2lkdGggb2YgdGhlIHJlbmRlciB0YXJnZXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtoZWlnaHQ9MV0gLSBUaGUgaGVpZ2h0IG9mIHRoZSByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZGVwdGg9MV0gLSBUaGUgaGVpZ2h0IG9mIHRoZSByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyVGFyZ2V0fk9wdGlvbnN9IFtvcHRpb25zXSAtIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggd2lkdGggPSAxLCBoZWlnaHQgPSAxLCBkZXB0aCA9IDEsIG9wdGlvbnMgPSB7fSApIHtcclxuXHJcblx0XHRzdXBlciggd2lkdGgsIGhlaWdodCwgb3B0aW9ucyApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1dlYkdMM0RSZW5kZXJUYXJnZXQgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMuZGVwdGggPSBkZXB0aDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIE92ZXJ3cml0dGVuIHdpdGggYSBkaWZmZXJlbnQgdGV4dHVyZSB0eXBlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtEYXRhM0RUZXh0dXJlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRleHR1cmUgPSBuZXcgRGF0YTNEVGV4dHVyZSggbnVsbCwgd2lkdGgsIGhlaWdodCwgZGVwdGggKTtcclxuXHJcblx0XHR0aGlzLnRleHR1cmUuaXNSZW5kZXJUYXJnZXRUZXh0dXJlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgV2ViR0wzRFJlbmRlclRhcmdldCB9O1xyXG4iLCJpbXBvcnQgeyBjbGFtcCB9IGZyb20gJy4vTWF0aFV0aWxzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBDbGFzcyBmb3IgcmVwcmVzZW50aW5nIGEgUXVhdGVybmlvbi4gUXVhdGVybmlvbnMgYXJlIHVzZWQgaW4gdGhyZWUuanMgdG8gcmVwcmVzZW50IHJvdGF0aW9ucy5cclxuICpcclxuICogSXRlcmF0aW5nIHRocm91Z2ggYSB2ZWN0b3IgaW5zdGFuY2Ugd2lsbCB5aWVsZCBpdHMgY29tcG9uZW50cyBgKHgsIHksIHosIHcpYCBpblxyXG4gKiB0aGUgY29ycmVzcG9uZGluZyBvcmRlci5cclxuICpcclxuICogTm90ZSB0aGF0IHRocmVlLmpzIGV4cGVjdHMgUXVhdGVybmlvbnMgdG8gYmUgbm9ybWFsaXplZC5cclxuICogYGBganNcclxuICogY29uc3QgcXVhdGVybmlvbiA9IG5ldyBUSFJFRS5RdWF0ZXJuaW9uKCk7XHJcbiAqIHF1YXRlcm5pb24uc2V0RnJvbUF4aXNBbmdsZSggbmV3IFRIUkVFLlZlY3RvcjMoIDAsIDEsIDAgKSwgTWF0aC5QSSAvIDIgKTtcclxuICpcclxuICogY29uc3QgdmVjdG9yID0gbmV3IFRIUkVFLlZlY3RvcjMoIDEsIDAsIDAgKTtcclxuICogdmVjdG9yLmFwcGx5UXVhdGVybmlvbiggcXVhdGVybmlvbiApO1xyXG4gKiBgYGBcclxuICovXHJcbmNsYXNzIFF1YXRlcm5pb24ge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHF1YXRlcm5pb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3g9MF0gLSBUaGUgeCB2YWx1ZSBvZiB0aGlzIHF1YXRlcm5pb24uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt5PTBdIC0gVGhlIHkgdmFsdWUgb2YgdGhpcyBxdWF0ZXJuaW9uLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbej0wXSAtIFRoZSB6IHZhbHVlIG9mIHRoaXMgcXVhdGVybmlvbi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3c9MV0gLSBUaGUgdyB2YWx1ZSBvZiB0aGlzIHF1YXRlcm5pb24uXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHggPSAwLCB5ID0gMCwgeiA9IDAsIHcgPSAxICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1F1YXRlcm5pb24gPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMuX3ggPSB4O1xyXG5cdFx0dGhpcy5feSA9IHk7XHJcblx0XHR0aGlzLl96ID0gejtcclxuXHRcdHRoaXMuX3cgPSB3O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEludGVycG9sYXRlcyBiZXR3ZWVuIHR3byBxdWF0ZXJuaW9ucyB2aWEgU0xFUlAuIFRoaXMgaW1wbGVtZW50YXRpb24gYXNzdW1lcyB0aGVcclxuXHQgKiBxdWF0ZXJuaW9uIGRhdGEgYXJlIG1hbmFnZWQgIGluIGZsYXQgYXJyYXlzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBkc3QgLSBUaGUgZGVzdGluYXRpb24gYXJyYXkuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGRzdE9mZnNldCAtIEFuIG9mZnNldCBpbnRvIHRoZSBkZXN0aW5hdGlvbiBhcnJheS5cclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IHNyYzAgLSBUaGUgc291cmNlIGFycmF5IG9mIHRoZSBmaXJzdCBxdWF0ZXJuaW9uLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzcmNPZmZzZXQwIC0gQW4gb2Zmc2V0IGludG8gdGhlIGZpcnN0IHNvdXJjZSBhcnJheS5cclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IHNyYzEgLSAgVGhlIHNvdXJjZSBhcnJheSBvZiB0aGUgc2Vjb25kIHF1YXRlcm5pb24uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHNyY09mZnNldDEgLSBBbiBvZmZzZXQgaW50byB0aGUgc2Vjb25kIHNvdXJjZSBhcnJheS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdCAtIFRoZSBpbnRlcnBvbGF0aW9uIGZhY3RvciBpbiB0aGUgcmFuZ2UgYFswLDFdYC5cclxuXHQgKiBAc2VlIHtAbGluayBRdWF0ZXJuaW9uI3NsZXJwfVxyXG5cdCAqL1xyXG5cdHN0YXRpYyBzbGVycEZsYXQoIGRzdCwgZHN0T2Zmc2V0LCBzcmMwLCBzcmNPZmZzZXQwLCBzcmMxLCBzcmNPZmZzZXQxLCB0ICkge1xyXG5cclxuXHRcdC8vIGZ1enotZnJlZSwgYXJyYXktYmFzZWQgUXVhdGVybmlvbiBTTEVSUCBvcGVyYXRpb25cclxuXHJcblx0XHRsZXQgeDAgPSBzcmMwWyBzcmNPZmZzZXQwICsgMCBdLFxyXG5cdFx0XHR5MCA9IHNyYzBbIHNyY09mZnNldDAgKyAxIF0sXHJcblx0XHRcdHowID0gc3JjMFsgc3JjT2Zmc2V0MCArIDIgXSxcclxuXHRcdFx0dzAgPSBzcmMwWyBzcmNPZmZzZXQwICsgMyBdO1xyXG5cclxuXHRcdGNvbnN0IHgxID0gc3JjMVsgc3JjT2Zmc2V0MSArIDAgXSxcclxuXHRcdFx0eTEgPSBzcmMxWyBzcmNPZmZzZXQxICsgMSBdLFxyXG5cdFx0XHR6MSA9IHNyYzFbIHNyY09mZnNldDEgKyAyIF0sXHJcblx0XHRcdHcxID0gc3JjMVsgc3JjT2Zmc2V0MSArIDMgXTtcclxuXHJcblx0XHRpZiAoIHQgPT09IDAgKSB7XHJcblxyXG5cdFx0XHRkc3RbIGRzdE9mZnNldCArIDAgXSA9IHgwO1xyXG5cdFx0XHRkc3RbIGRzdE9mZnNldCArIDEgXSA9IHkwO1xyXG5cdFx0XHRkc3RbIGRzdE9mZnNldCArIDIgXSA9IHowO1xyXG5cdFx0XHRkc3RbIGRzdE9mZnNldCArIDMgXSA9IHcwO1xyXG5cdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdCA9PT0gMSApIHtcclxuXHJcblx0XHRcdGRzdFsgZHN0T2Zmc2V0ICsgMCBdID0geDE7XHJcblx0XHRcdGRzdFsgZHN0T2Zmc2V0ICsgMSBdID0geTE7XHJcblx0XHRcdGRzdFsgZHN0T2Zmc2V0ICsgMiBdID0gejE7XHJcblx0XHRcdGRzdFsgZHN0T2Zmc2V0ICsgMyBdID0gdzE7XHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB3MCAhPT0gdzEgfHwgeDAgIT09IHgxIHx8IHkwICE9PSB5MSB8fCB6MCAhPT0gejEgKSB7XHJcblxyXG5cdFx0XHRsZXQgcyA9IDEgLSB0O1xyXG5cdFx0XHRjb25zdCBjb3MgPSB4MCAqIHgxICsgeTAgKiB5MSArIHowICogejEgKyB3MCAqIHcxLFxyXG5cdFx0XHRcdGRpciA9ICggY29zID49IDAgPyAxIDogLSAxICksXHJcblx0XHRcdFx0c3FyU2luID0gMSAtIGNvcyAqIGNvcztcclxuXHJcblx0XHRcdC8vIFNraXAgdGhlIFNsZXJwIGZvciB0aW55IHN0ZXBzIHRvIGF2b2lkIG51bWVyaWMgcHJvYmxlbXM6XHJcblx0XHRcdGlmICggc3FyU2luID4gTnVtYmVyLkVQU0lMT04gKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHNpbiA9IE1hdGguc3FydCggc3FyU2luICksXHJcblx0XHRcdFx0XHRsZW4gPSBNYXRoLmF0YW4yKCBzaW4sIGNvcyAqIGRpciApO1xyXG5cclxuXHRcdFx0XHRzID0gTWF0aC5zaW4oIHMgKiBsZW4gKSAvIHNpbjtcclxuXHRcdFx0XHR0ID0gTWF0aC5zaW4oIHQgKiBsZW4gKSAvIHNpbjtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IHREaXIgPSB0ICogZGlyO1xyXG5cclxuXHRcdFx0eDAgPSB4MCAqIHMgKyB4MSAqIHREaXI7XHJcblx0XHRcdHkwID0geTAgKiBzICsgeTEgKiB0RGlyO1xyXG5cdFx0XHR6MCA9IHowICogcyArIHoxICogdERpcjtcclxuXHRcdFx0dzAgPSB3MCAqIHMgKyB3MSAqIHREaXI7XHJcblxyXG5cdFx0XHQvLyBOb3JtYWxpemUgaW4gY2FzZSB3ZSBqdXN0IGRpZCBhIGxlcnA6XHJcblx0XHRcdGlmICggcyA9PT0gMSAtIHQgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGYgPSAxIC8gTWF0aC5zcXJ0KCB4MCAqIHgwICsgeTAgKiB5MCArIHowICogejAgKyB3MCAqIHcwICk7XHJcblxyXG5cdFx0XHRcdHgwICo9IGY7XHJcblx0XHRcdFx0eTAgKj0gZjtcclxuXHRcdFx0XHR6MCAqPSBmO1xyXG5cdFx0XHRcdHcwICo9IGY7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGRzdFsgZHN0T2Zmc2V0IF0gPSB4MDtcclxuXHRcdGRzdFsgZHN0T2Zmc2V0ICsgMSBdID0geTA7XHJcblx0XHRkc3RbIGRzdE9mZnNldCArIDIgXSA9IHowO1xyXG5cdFx0ZHN0WyBkc3RPZmZzZXQgKyAzIF0gPSB3MDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBNdWx0aXBsaWVzIHR3byBxdWF0ZXJuaW9ucy4gVGhpcyBpbXBsZW1lbnRhdGlvbiBhc3N1bWVzIHRoZSBxdWF0ZXJuaW9uIGRhdGEgYXJlIG1hbmFnZWRcclxuXHQgKiBpbiBmbGF0IGFycmF5cy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gZHN0IC0gVGhlIGRlc3RpbmF0aW9uIGFycmF5LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBkc3RPZmZzZXQgLSBBbiBvZmZzZXQgaW50byB0aGUgZGVzdGluYXRpb24gYXJyYXkuXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBzcmMwIC0gVGhlIHNvdXJjZSBhcnJheSBvZiB0aGUgZmlyc3QgcXVhdGVybmlvbi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc3JjT2Zmc2V0MCAtIEFuIG9mZnNldCBpbnRvIHRoZSBmaXJzdCBzb3VyY2UgYXJyYXkuXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBzcmMxIC0gIFRoZSBzb3VyY2UgYXJyYXkgb2YgdGhlIHNlY29uZCBxdWF0ZXJuaW9uLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzcmNPZmZzZXQxIC0gQW4gb2Zmc2V0IGludG8gdGhlIHNlY29uZCBzb3VyY2UgYXJyYXkuXHJcblx0ICogQHJldHVybiB7QXJyYXk8bnVtYmVyPn0gVGhlIGRlc3RpbmF0aW9uIGFycmF5LlxyXG5cdCAqIEBzZWUge0BsaW5rIFF1YXRlcm5pb24jbXVsdGlwbHlRdWF0ZXJuaW9uc30uXHJcblx0ICovXHJcblx0c3RhdGljIG11bHRpcGx5UXVhdGVybmlvbnNGbGF0KCBkc3QsIGRzdE9mZnNldCwgc3JjMCwgc3JjT2Zmc2V0MCwgc3JjMSwgc3JjT2Zmc2V0MSApIHtcclxuXHJcblx0XHRjb25zdCB4MCA9IHNyYzBbIHNyY09mZnNldDAgXTtcclxuXHRcdGNvbnN0IHkwID0gc3JjMFsgc3JjT2Zmc2V0MCArIDEgXTtcclxuXHRcdGNvbnN0IHowID0gc3JjMFsgc3JjT2Zmc2V0MCArIDIgXTtcclxuXHRcdGNvbnN0IHcwID0gc3JjMFsgc3JjT2Zmc2V0MCArIDMgXTtcclxuXHJcblx0XHRjb25zdCB4MSA9IHNyYzFbIHNyY09mZnNldDEgXTtcclxuXHRcdGNvbnN0IHkxID0gc3JjMVsgc3JjT2Zmc2V0MSArIDEgXTtcclxuXHRcdGNvbnN0IHoxID0gc3JjMVsgc3JjT2Zmc2V0MSArIDIgXTtcclxuXHRcdGNvbnN0IHcxID0gc3JjMVsgc3JjT2Zmc2V0MSArIDMgXTtcclxuXHJcblx0XHRkc3RbIGRzdE9mZnNldCBdID0geDAgKiB3MSArIHcwICogeDEgKyB5MCAqIHoxIC0gejAgKiB5MTtcclxuXHRcdGRzdFsgZHN0T2Zmc2V0ICsgMSBdID0geTAgKiB3MSArIHcwICogeTEgKyB6MCAqIHgxIC0geDAgKiB6MTtcclxuXHRcdGRzdFsgZHN0T2Zmc2V0ICsgMiBdID0gejAgKiB3MSArIHcwICogejEgKyB4MCAqIHkxIC0geTAgKiB4MTtcclxuXHRcdGRzdFsgZHN0T2Zmc2V0ICsgMyBdID0gdzAgKiB3MSAtIHgwICogeDEgLSB5MCAqIHkxIC0gejAgKiB6MTtcclxuXHJcblx0XHRyZXR1cm4gZHN0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSB4IHZhbHVlIG9mIHRoaXMgcXVhdGVybmlvbi5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0ICogQGRlZmF1bHQgMFxyXG5cdCAqL1xyXG5cdGdldCB4KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl94O1xyXG5cclxuXHR9XHJcblxyXG5cdHNldCB4KCB2YWx1ZSApIHtcclxuXHJcblx0XHR0aGlzLl94ID0gdmFsdWU7XHJcblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIHkgdmFsdWUgb2YgdGhpcyBxdWF0ZXJuaW9uLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge251bWJlcn1cclxuXHQgKiBAZGVmYXVsdCAwXHJcblx0ICovXHJcblx0Z2V0IHkoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX3k7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0IHkoIHZhbHVlICkge1xyXG5cclxuXHRcdHRoaXMuX3kgPSB2YWx1ZTtcclxuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgeiB2YWx1ZSBvZiB0aGlzIHF1YXRlcm5pb24uXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdCAqIEBkZWZhdWx0IDBcclxuXHQgKi9cclxuXHRnZXQgeigpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fejtcclxuXHJcblx0fVxyXG5cclxuXHRzZXQgeiggdmFsdWUgKSB7XHJcblxyXG5cdFx0dGhpcy5feiA9IHZhbHVlO1xyXG5cdFx0dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSB3IHZhbHVlIG9mIHRoaXMgcXVhdGVybmlvbi5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0ICogQGRlZmF1bHQgMVxyXG5cdCAqL1xyXG5cdGdldCB3KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl93O1xyXG5cclxuXHR9XHJcblxyXG5cdHNldCB3KCB2YWx1ZSApIHtcclxuXHJcblx0XHR0aGlzLl93ID0gdmFsdWU7XHJcblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgcXVhdGVybmlvbiBjb21wb25lbnRzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeCB2YWx1ZSBvZiB0aGlzIHF1YXRlcm5pb24uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgeSB2YWx1ZSBvZiB0aGlzIHF1YXRlcm5pb24uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHogLSBUaGUgeiB2YWx1ZSBvZiB0aGlzIHF1YXRlcm5pb24uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHcgLSBUaGUgdyB2YWx1ZSBvZiB0aGlzIHF1YXRlcm5pb24uXHJcblx0ICogQHJldHVybiB7UXVhdGVybmlvbn0gQSByZWZlcmVuY2UgdG8gdGhpcyBxdWF0ZXJuaW9uLlxyXG5cdCAqL1xyXG5cdHNldCggeCwgeSwgeiwgdyApIHtcclxuXHJcblx0XHR0aGlzLl94ID0geDtcclxuXHRcdHRoaXMuX3kgPSB5O1xyXG5cdFx0dGhpcy5feiA9IHo7XHJcblx0XHR0aGlzLl93ID0gdztcclxuXHJcblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIG5ldyBxdWF0ZXJuaW9uIHdpdGggY29waWVkIHZhbHVlcyBmcm9tIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtRdWF0ZXJuaW9ufSBBIGNsb25lIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y2xvbmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLl94LCB0aGlzLl95LCB0aGlzLl96LCB0aGlzLl93ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29waWVzIHRoZSB2YWx1ZXMgb2YgdGhlIGdpdmVuIHF1YXRlcm5pb24gdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UXVhdGVybmlvbn0gcXVhdGVybmlvbiAtIFRoZSBxdWF0ZXJuaW9uIHRvIGNvcHkuXHJcblx0ICogQHJldHVybiB7UXVhdGVybmlvbn0gQSByZWZlcmVuY2UgdG8gdGhpcyBxdWF0ZXJuaW9uLlxyXG5cdCAqL1xyXG5cdGNvcHkoIHF1YXRlcm5pb24gKSB7XHJcblxyXG5cdFx0dGhpcy5feCA9IHF1YXRlcm5pb24ueDtcclxuXHRcdHRoaXMuX3kgPSBxdWF0ZXJuaW9uLnk7XHJcblx0XHR0aGlzLl96ID0gcXVhdGVybmlvbi56O1xyXG5cdFx0dGhpcy5fdyA9IHF1YXRlcm5pb24udztcclxuXHJcblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGlzIHF1YXRlcm5pb24gZnJvbSB0aGUgcm90YXRpb24gc3BlY2lmaWVkIGJ5IHRoZSBnaXZlblxyXG5cdCAqIEV1bGVyIGFuZ2xlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7RXVsZXJ9IGV1bGVyIC0gVGhlIEV1bGVyIGFuZ2xlcy5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFt1cGRhdGU9dHJ1ZV0gLSBXaGV0aGVyIHRoZSBpbnRlcm5hbCBgb25DaGFuZ2VgIGNhbGxiYWNrIHNob3VsZCBiZSBleGVjdXRlZCBvciBub3QuXHJcblx0ICogQHJldHVybiB7UXVhdGVybmlvbn0gQSByZWZlcmVuY2UgdG8gdGhpcyBxdWF0ZXJuaW9uLlxyXG5cdCAqL1xyXG5cdHNldEZyb21FdWxlciggZXVsZXIsIHVwZGF0ZSA9IHRydWUgKSB7XHJcblxyXG5cdFx0Y29uc3QgeCA9IGV1bGVyLl94LCB5ID0gZXVsZXIuX3ksIHogPSBldWxlci5feiwgb3JkZXIgPSBldWxlci5fb3JkZXI7XHJcblxyXG5cdFx0Ly8gaHR0cDovL3d3dy5tYXRod29ya3MuY29tL21hdGxhYmNlbnRyYWwvZmlsZWV4Y2hhbmdlL1xyXG5cdFx0Ly8gXHQyMDY5Ni1mdW5jdGlvbi10by1jb252ZXJ0LWJldHdlZW4tZGNtLWV1bGVyLWFuZ2xlcy1xdWF0ZXJuaW9ucy1hbmQtZXVsZXItdmVjdG9ycy9cclxuXHRcdC8vXHRjb250ZW50L1NwaW5DYWxjLm1cclxuXHJcblx0XHRjb25zdCBjb3MgPSBNYXRoLmNvcztcclxuXHRcdGNvbnN0IHNpbiA9IE1hdGguc2luO1xyXG5cclxuXHRcdGNvbnN0IGMxID0gY29zKCB4IC8gMiApO1xyXG5cdFx0Y29uc3QgYzIgPSBjb3MoIHkgLyAyICk7XHJcblx0XHRjb25zdCBjMyA9IGNvcyggeiAvIDIgKTtcclxuXHJcblx0XHRjb25zdCBzMSA9IHNpbiggeCAvIDIgKTtcclxuXHRcdGNvbnN0IHMyID0gc2luKCB5IC8gMiApO1xyXG5cdFx0Y29uc3QgczMgPSBzaW4oIHogLyAyICk7XHJcblxyXG5cdFx0c3dpdGNoICggb3JkZXIgKSB7XHJcblxyXG5cdFx0XHRjYXNlICdYWVonOlxyXG5cdFx0XHRcdHRoaXMuX3ggPSBzMSAqIGMyICogYzMgKyBjMSAqIHMyICogczM7XHJcblx0XHRcdFx0dGhpcy5feSA9IGMxICogczIgKiBjMyAtIHMxICogYzIgKiBzMztcclxuXHRcdFx0XHR0aGlzLl96ID0gYzEgKiBjMiAqIHMzICsgczEgKiBzMiAqIGMzO1xyXG5cdFx0XHRcdHRoaXMuX3cgPSBjMSAqIGMyICogYzMgLSBzMSAqIHMyICogczM7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlICdZWFonOlxyXG5cdFx0XHRcdHRoaXMuX3ggPSBzMSAqIGMyICogYzMgKyBjMSAqIHMyICogczM7XHJcblx0XHRcdFx0dGhpcy5feSA9IGMxICogczIgKiBjMyAtIHMxICogYzIgKiBzMztcclxuXHRcdFx0XHR0aGlzLl96ID0gYzEgKiBjMiAqIHMzIC0gczEgKiBzMiAqIGMzO1xyXG5cdFx0XHRcdHRoaXMuX3cgPSBjMSAqIGMyICogYzMgKyBzMSAqIHMyICogczM7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlICdaWFknOlxyXG5cdFx0XHRcdHRoaXMuX3ggPSBzMSAqIGMyICogYzMgLSBjMSAqIHMyICogczM7XHJcblx0XHRcdFx0dGhpcy5feSA9IGMxICogczIgKiBjMyArIHMxICogYzIgKiBzMztcclxuXHRcdFx0XHR0aGlzLl96ID0gYzEgKiBjMiAqIHMzICsgczEgKiBzMiAqIGMzO1xyXG5cdFx0XHRcdHRoaXMuX3cgPSBjMSAqIGMyICogYzMgLSBzMSAqIHMyICogczM7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlICdaWVgnOlxyXG5cdFx0XHRcdHRoaXMuX3ggPSBzMSAqIGMyICogYzMgLSBjMSAqIHMyICogczM7XHJcblx0XHRcdFx0dGhpcy5feSA9IGMxICogczIgKiBjMyArIHMxICogYzIgKiBzMztcclxuXHRcdFx0XHR0aGlzLl96ID0gYzEgKiBjMiAqIHMzIC0gczEgKiBzMiAqIGMzO1xyXG5cdFx0XHRcdHRoaXMuX3cgPSBjMSAqIGMyICogYzMgKyBzMSAqIHMyICogczM7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlICdZWlgnOlxyXG5cdFx0XHRcdHRoaXMuX3ggPSBzMSAqIGMyICogYzMgKyBjMSAqIHMyICogczM7XHJcblx0XHRcdFx0dGhpcy5feSA9IGMxICogczIgKiBjMyArIHMxICogYzIgKiBzMztcclxuXHRcdFx0XHR0aGlzLl96ID0gYzEgKiBjMiAqIHMzIC0gczEgKiBzMiAqIGMzO1xyXG5cdFx0XHRcdHRoaXMuX3cgPSBjMSAqIGMyICogYzMgLSBzMSAqIHMyICogczM7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlICdYWlknOlxyXG5cdFx0XHRcdHRoaXMuX3ggPSBzMSAqIGMyICogYzMgLSBjMSAqIHMyICogczM7XHJcblx0XHRcdFx0dGhpcy5feSA9IGMxICogczIgKiBjMyAtIHMxICogYzIgKiBzMztcclxuXHRcdFx0XHR0aGlzLl96ID0gYzEgKiBjMiAqIHMzICsgczEgKiBzMiAqIGMzO1xyXG5cdFx0XHRcdHRoaXMuX3cgPSBjMSAqIGMyICogYzMgKyBzMSAqIHMyICogczM7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlF1YXRlcm5pb246IC5zZXRGcm9tRXVsZXIoKSBlbmNvdW50ZXJlZCBhbiB1bmtub3duIG9yZGVyOiAnICsgb3JkZXIgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB1cGRhdGUgPT09IHRydWUgKSB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGlzIHF1YXRlcm5pb24gZnJvbSB0aGUgZ2l2ZW4gYXhpcyBhbmQgYW5nbGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IGF4aXMgLSBUaGUgbm9ybWFsaXplZCBheGlzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhbmdsZSAtIFRoZSBhbmdsZSBpbiByYWRpYW5zLlxyXG5cdCAqIEByZXR1cm4ge1F1YXRlcm5pb259IEEgcmVmZXJlbmNlIHRvIHRoaXMgcXVhdGVybmlvbi5cclxuXHQgKi9cclxuXHRzZXRGcm9tQXhpc0FuZ2xlKCBheGlzLCBhbmdsZSApIHtcclxuXHJcblx0XHQvLyBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9nZW9tZXRyeS9yb3RhdGlvbnMvY29udmVyc2lvbnMvYW5nbGVUb1F1YXRlcm5pb24vaW5kZXguaHRtXHJcblxyXG5cdFx0Y29uc3QgaGFsZkFuZ2xlID0gYW5nbGUgLyAyLCBzID0gTWF0aC5zaW4oIGhhbGZBbmdsZSApO1xyXG5cclxuXHRcdHRoaXMuX3ggPSBheGlzLnggKiBzO1xyXG5cdFx0dGhpcy5feSA9IGF4aXMueSAqIHM7XHJcblx0XHR0aGlzLl96ID0gYXhpcy56ICogcztcclxuXHRcdHRoaXMuX3cgPSBNYXRoLmNvcyggaGFsZkFuZ2xlICk7XHJcblxyXG5cdFx0dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhpcyBxdWF0ZXJuaW9uIGZyb20gdGhlIGdpdmVuIHJvdGF0aW9uIG1hdHJpeC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4NH0gbSAtIEEgNHg0IG1hdHJpeCBvZiB3aGljaCB0aGUgdXBwZXIgM3gzIG9mIG1hdHJpeCBpcyBhIHB1cmUgcm90YXRpb24gbWF0cml4IChpLmUuIHVuc2NhbGVkKS5cclxuXHQgKiBAcmV0dXJuIHtRdWF0ZXJuaW9ufSBBIHJlZmVyZW5jZSB0byB0aGlzIHF1YXRlcm5pb24uXHJcblx0ICovXHJcblx0c2V0RnJvbVJvdGF0aW9uTWF0cml4KCBtICkge1xyXG5cclxuXHRcdC8vIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2dlb21ldHJ5L3JvdGF0aW9ucy9jb252ZXJzaW9ucy9tYXRyaXhUb1F1YXRlcm5pb24vaW5kZXguaHRtXHJcblxyXG5cdFx0Ly8gYXNzdW1lcyB0aGUgdXBwZXIgM3gzIG9mIG0gaXMgYSBwdXJlIHJvdGF0aW9uIG1hdHJpeCAoaS5lLCB1bnNjYWxlZClcclxuXHJcblx0XHRjb25zdCB0ZSA9IG0uZWxlbWVudHMsXHJcblxyXG5cdFx0XHRtMTEgPSB0ZVsgMCBdLCBtMTIgPSB0ZVsgNCBdLCBtMTMgPSB0ZVsgOCBdLFxyXG5cdFx0XHRtMjEgPSB0ZVsgMSBdLCBtMjIgPSB0ZVsgNSBdLCBtMjMgPSB0ZVsgOSBdLFxyXG5cdFx0XHRtMzEgPSB0ZVsgMiBdLCBtMzIgPSB0ZVsgNiBdLCBtMzMgPSB0ZVsgMTAgXSxcclxuXHJcblx0XHRcdHRyYWNlID0gbTExICsgbTIyICsgbTMzO1xyXG5cclxuXHRcdGlmICggdHJhY2UgPiAwICkge1xyXG5cclxuXHRcdFx0Y29uc3QgcyA9IDAuNSAvIE1hdGguc3FydCggdHJhY2UgKyAxLjAgKTtcclxuXHJcblx0XHRcdHRoaXMuX3cgPSAwLjI1IC8gcztcclxuXHRcdFx0dGhpcy5feCA9ICggbTMyIC0gbTIzICkgKiBzO1xyXG5cdFx0XHR0aGlzLl95ID0gKCBtMTMgLSBtMzEgKSAqIHM7XHJcblx0XHRcdHRoaXMuX3ogPSAoIG0yMSAtIG0xMiApICogcztcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBtMTEgPiBtMjIgJiYgbTExID4gbTMzICkge1xyXG5cclxuXHRcdFx0Y29uc3QgcyA9IDIuMCAqIE1hdGguc3FydCggMS4wICsgbTExIC0gbTIyIC0gbTMzICk7XHJcblxyXG5cdFx0XHR0aGlzLl93ID0gKCBtMzIgLSBtMjMgKSAvIHM7XHJcblx0XHRcdHRoaXMuX3ggPSAwLjI1ICogcztcclxuXHRcdFx0dGhpcy5feSA9ICggbTEyICsgbTIxICkgLyBzO1xyXG5cdFx0XHR0aGlzLl96ID0gKCBtMTMgKyBtMzEgKSAvIHM7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggbTIyID4gbTMzICkge1xyXG5cclxuXHRcdFx0Y29uc3QgcyA9IDIuMCAqIE1hdGguc3FydCggMS4wICsgbTIyIC0gbTExIC0gbTMzICk7XHJcblxyXG5cdFx0XHR0aGlzLl93ID0gKCBtMTMgLSBtMzEgKSAvIHM7XHJcblx0XHRcdHRoaXMuX3ggPSAoIG0xMiArIG0yMSApIC8gcztcclxuXHRcdFx0dGhpcy5feSA9IDAuMjUgKiBzO1xyXG5cdFx0XHR0aGlzLl96ID0gKCBtMjMgKyBtMzIgKSAvIHM7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGNvbnN0IHMgPSAyLjAgKiBNYXRoLnNxcnQoIDEuMCArIG0zMyAtIG0xMSAtIG0yMiApO1xyXG5cclxuXHRcdFx0dGhpcy5fdyA9ICggbTIxIC0gbTEyICkgLyBzO1xyXG5cdFx0XHR0aGlzLl94ID0gKCBtMTMgKyBtMzEgKSAvIHM7XHJcblx0XHRcdHRoaXMuX3kgPSAoIG0yMyArIG0zMiApIC8gcztcclxuXHRcdFx0dGhpcy5feiA9IDAuMjUgKiBzO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGlzIHF1YXRlcm5pb24gdG8gdGhlIHJvdGF0aW9uIHJlcXVpcmVkIHRvIHJvdGF0ZSB0aGUgZGlyZWN0aW9uIHZlY3RvclxyXG5cdCAqIGB2RnJvbWAgdG8gdGhlIGRpcmVjdGlvbiB2ZWN0b3IgYHZUb2AuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHZGcm9tIC0gVGhlIGZpcnN0IChub3JtYWxpemVkKSBkaXJlY3Rpb24gdmVjdG9yLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdlRvIC0gVGhlIHNlY29uZCAobm9ybWFsaXplZCkgZGlyZWN0aW9uIHZlY3Rvci5cclxuXHQgKiBAcmV0dXJuIHtRdWF0ZXJuaW9ufSBBIHJlZmVyZW5jZSB0byB0aGlzIHF1YXRlcm5pb24uXHJcblx0ICovXHJcblx0c2V0RnJvbVVuaXRWZWN0b3JzKCB2RnJvbSwgdlRvICkge1xyXG5cclxuXHRcdC8vIGFzc3VtZXMgZGlyZWN0aW9uIHZlY3RvcnMgdkZyb20gYW5kIHZUbyBhcmUgbm9ybWFsaXplZFxyXG5cclxuXHRcdGxldCByID0gdkZyb20uZG90KCB2VG8gKSArIDE7XHJcblxyXG5cdFx0aWYgKCByIDwgTnVtYmVyLkVQU0lMT04gKSB7XHJcblxyXG5cdFx0XHQvLyB2RnJvbSBhbmQgdlRvIHBvaW50IGluIG9wcG9zaXRlIGRpcmVjdGlvbnNcclxuXHJcblx0XHRcdHIgPSAwO1xyXG5cclxuXHRcdFx0aWYgKCBNYXRoLmFicyggdkZyb20ueCApID4gTWF0aC5hYnMoIHZGcm9tLnogKSApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5feCA9IC0gdkZyb20ueTtcclxuXHRcdFx0XHR0aGlzLl95ID0gdkZyb20ueDtcclxuXHRcdFx0XHR0aGlzLl96ID0gMDtcclxuXHRcdFx0XHR0aGlzLl93ID0gcjtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHRoaXMuX3ggPSAwO1xyXG5cdFx0XHRcdHRoaXMuX3kgPSAtIHZGcm9tLno7XHJcblx0XHRcdFx0dGhpcy5feiA9IHZGcm9tLnk7XHJcblx0XHRcdFx0dGhpcy5fdyA9IHI7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdC8vIGNyb3NzVmVjdG9ycyggdkZyb20sIHZUbyApOyAvLyBpbmxpbmVkIHRvIGF2b2lkIGN5Y2xpYyBkZXBlbmRlbmN5IG9uIFZlY3RvcjNcclxuXHJcblx0XHRcdHRoaXMuX3ggPSB2RnJvbS55ICogdlRvLnogLSB2RnJvbS56ICogdlRvLnk7XHJcblx0XHRcdHRoaXMuX3kgPSB2RnJvbS56ICogdlRvLnggLSB2RnJvbS54ICogdlRvLno7XHJcblx0XHRcdHRoaXMuX3ogPSB2RnJvbS54ICogdlRvLnkgLSB2RnJvbS55ICogdlRvLng7XHJcblx0XHRcdHRoaXMuX3cgPSByO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcy5ub3JtYWxpemUoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBhbmdsZSBiZXR3ZWVuIHRoaXMgcXVhdGVybmlvbiBhbmQgdGhlIGdpdmVuIG9uZSBpbiByYWRpYW5zLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtRdWF0ZXJuaW9ufSBxIC0gVGhlIHF1YXRlcm5pb24gdG8gY29tcHV0ZSB0aGUgYW5nbGUgd2l0aC5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBhbmdsZSBpbiByYWRpYW5zLlxyXG5cdCAqL1xyXG5cdGFuZ2xlVG8oIHEgKSB7XHJcblxyXG5cdFx0cmV0dXJuIDIgKiBNYXRoLmFjb3MoIE1hdGguYWJzKCBjbGFtcCggdGhpcy5kb3QoIHEgKSwgLSAxLCAxICkgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJvdGF0ZXMgdGhpcyBxdWF0ZXJuaW9uIGJ5IGEgZ2l2ZW4gYW5ndWxhciBzdGVwIHRvIHRoZSBnaXZlbiBxdWF0ZXJuaW9uLlxyXG5cdCAqIFRoZSBtZXRob2QgZW5zdXJlcyB0aGF0IHRoZSBmaW5hbCBxdWF0ZXJuaW9uIHdpbGwgbm90IG92ZXJzaG9vdCBgcWAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1F1YXRlcm5pb259IHEgLSBUaGUgdGFyZ2V0IHF1YXRlcm5pb24uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHN0ZXAgLSBUaGUgYW5ndWxhciBzdGVwIGluIHJhZGlhbnMuXHJcblx0ICogQHJldHVybiB7UXVhdGVybmlvbn0gQSByZWZlcmVuY2UgdG8gdGhpcyBxdWF0ZXJuaW9uLlxyXG5cdCAqL1xyXG5cdHJvdGF0ZVRvd2FyZHMoIHEsIHN0ZXAgKSB7XHJcblxyXG5cdFx0Y29uc3QgYW5nbGUgPSB0aGlzLmFuZ2xlVG8oIHEgKTtcclxuXHJcblx0XHRpZiAoIGFuZ2xlID09PSAwICkgcmV0dXJuIHRoaXM7XHJcblxyXG5cdFx0Y29uc3QgdCA9IE1hdGgubWluKCAxLCBzdGVwIC8gYW5nbGUgKTtcclxuXHJcblx0XHR0aGlzLnNsZXJwKCBxLCB0ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGlzIHF1YXRlcm5pb24gdG8gdGhlIGlkZW50aXR5IHF1YXRlcm5pb247IHRoYXQgaXMsIHRvIHRoZVxyXG5cdCAqIHF1YXRlcm5pb24gdGhhdCByZXByZXNlbnRzIFwibm8gcm90YXRpb25cIi5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1F1YXRlcm5pb259IEEgcmVmZXJlbmNlIHRvIHRoaXMgcXVhdGVybmlvbi5cclxuXHQgKi9cclxuXHRpZGVudGl0eSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5zZXQoIDAsIDAsIDAsIDEgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJbnZlcnRzIHRoaXMgcXVhdGVybmlvbiB2aWEge0BsaW5rIFF1YXRlcm5pb24jY29uanVnYXRlfS4gVGhlXHJcblx0ICogcXVhdGVybmlvbiBpcyBhc3N1bWVkIHRvIGhhdmUgdW5pdCBsZW5ndGguXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtRdWF0ZXJuaW9ufSBBIHJlZmVyZW5jZSB0byB0aGlzIHF1YXRlcm5pb24uXHJcblx0ICovXHJcblx0aW52ZXJ0KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmNvbmp1Z2F0ZSgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHJvdGF0aW9uYWwgY29uanVnYXRlIG9mIHRoaXMgcXVhdGVybmlvbi4gVGhlIGNvbmp1Z2F0ZSBvZiBhXHJcblx0ICogcXVhdGVybmlvbiByZXByZXNlbnRzIHRoZSBzYW1lIHJvdGF0aW9uIGluIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb24gYWJvdXRcclxuXHQgKiB0aGUgcm90YXRpb25hbCBheGlzLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7UXVhdGVybmlvbn0gQSByZWZlcmVuY2UgdG8gdGhpcyBxdWF0ZXJuaW9uLlxyXG5cdCAqL1xyXG5cdGNvbmp1Z2F0ZSgpIHtcclxuXHJcblx0XHR0aGlzLl94ICo9IC0gMTtcclxuXHRcdHRoaXMuX3kgKj0gLSAxO1xyXG5cdFx0dGhpcy5feiAqPSAtIDE7XHJcblxyXG5cdFx0dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENhbGN1bGF0ZXMgdGhlIGRvdCBwcm9kdWN0IG9mIHRoaXMgcXVhdGVybmlvbiBhbmQgdGhlIGdpdmVuIG9uZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UXVhdGVybmlvbn0gdiAtIFRoZSBxdWF0ZXJuaW9uIHRvIGNvbXB1dGUgdGhlIGRvdCBwcm9kdWN0IHdpdGguXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgcmVzdWx0IG9mIHRoZSBkb3QgcHJvZHVjdC5cclxuXHQgKi9cclxuXHRkb3QoIHYgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX3ggKiB2Ll94ICsgdGhpcy5feSAqIHYuX3kgKyB0aGlzLl96ICogdi5feiArIHRoaXMuX3cgKiB2Ll93O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSBzcXVhcmVkIEV1Y2xpZGVhbiBsZW5ndGggKHN0cmFpZ2h0LWxpbmUgbGVuZ3RoKSBvZiB0aGlzIHF1YXRlcm5pb24sXHJcblx0ICogY29uc2lkZXJlZCBhcyBhIDQgZGltZW5zaW9uYWwgdmVjdG9yLiBUaGlzIGNhbiBiZSB1c2VmdWwgaWYgeW91IGFyZSBjb21wYXJpbmcgdGhlXHJcblx0ICogbGVuZ3RocyBvZiB0d28gcXVhdGVybmlvbnMsIGFzIHRoaXMgaXMgYSBzbGlnaHRseSBtb3JlIGVmZmljaWVudCBjYWxjdWxhdGlvbiB0aGFuXHJcblx0ICoge0BsaW5rIFF1YXRlcm5pb24jbGVuZ3RofS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIHNxdWFyZWQgRXVjbGlkZWFuIGxlbmd0aC5cclxuXHQgKi9cclxuXHRsZW5ndGhTcSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5feCAqIHRoaXMuX3ggKyB0aGlzLl95ICogdGhpcy5feSArIHRoaXMuX3ogKiB0aGlzLl96ICsgdGhpcy5fdyAqIHRoaXMuX3c7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgdGhlIEV1Y2xpZGVhbiBsZW5ndGggKHN0cmFpZ2h0LWxpbmUgbGVuZ3RoKSBvZiB0aGlzIHF1YXRlcm5pb24sXHJcblx0ICogY29uc2lkZXJlZCBhcyBhIDQgZGltZW5zaW9uYWwgdmVjdG9yLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgRXVjbGlkZWFuIGxlbmd0aC5cclxuXHQgKi9cclxuXHRsZW5ndGgoKSB7XHJcblxyXG5cdFx0cmV0dXJuIE1hdGguc3FydCggdGhpcy5feCAqIHRoaXMuX3ggKyB0aGlzLl95ICogdGhpcy5feSArIHRoaXMuX3ogKiB0aGlzLl96ICsgdGhpcy5fdyAqIHRoaXMuX3cgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBOb3JtYWxpemVzIHRoaXMgcXVhdGVybmlvbiAtIHRoYXQgaXMsIGNhbGN1bGF0ZWQgdGhlIHF1YXRlcm5pb24gdGhhdCBwZXJmb3Jtc1xyXG5cdCAqIHRoZSBzYW1lIHJvdGF0aW9uIGFzIHRoaXMgb25lLCBidXQgaGFzIGEgbGVuZ3RoIGVxdWFsIHRvIGAxYC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1F1YXRlcm5pb259IEEgcmVmZXJlbmNlIHRvIHRoaXMgcXVhdGVybmlvbi5cclxuXHQgKi9cclxuXHRub3JtYWxpemUoKSB7XHJcblxyXG5cdFx0bGV0IGwgPSB0aGlzLmxlbmd0aCgpO1xyXG5cclxuXHRcdGlmICggbCA9PT0gMCApIHtcclxuXHJcblx0XHRcdHRoaXMuX3ggPSAwO1xyXG5cdFx0XHR0aGlzLl95ID0gMDtcclxuXHRcdFx0dGhpcy5feiA9IDA7XHJcblx0XHRcdHRoaXMuX3cgPSAxO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRsID0gMSAvIGw7XHJcblxyXG5cdFx0XHR0aGlzLl94ID0gdGhpcy5feCAqIGw7XHJcblx0XHRcdHRoaXMuX3kgPSB0aGlzLl95ICogbDtcclxuXHRcdFx0dGhpcy5feiA9IHRoaXMuX3ogKiBsO1xyXG5cdFx0XHR0aGlzLl93ID0gdGhpcy5fdyAqIGw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBNdWx0aXBsaWVzIHRoaXMgcXVhdGVybmlvbiBieSB0aGUgZ2l2ZW4gb25lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtRdWF0ZXJuaW9ufSBxIC0gVGhlIHF1YXRlcm5pb24uXHJcblx0ICogQHJldHVybiB7UXVhdGVybmlvbn0gQSByZWZlcmVuY2UgdG8gdGhpcyBxdWF0ZXJuaW9uLlxyXG5cdCAqL1xyXG5cdG11bHRpcGx5KCBxICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5UXVhdGVybmlvbnMoIHRoaXMsIHEgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQcmUtbXVsdGlwbGllcyB0aGlzIHF1YXRlcm5pb24gYnkgdGhlIGdpdmVuIG9uZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UXVhdGVybmlvbn0gcSAtIFRoZSBxdWF0ZXJuaW9uLlxyXG5cdCAqIEByZXR1cm4ge1F1YXRlcm5pb259IEEgcmVmZXJlbmNlIHRvIHRoaXMgcXVhdGVybmlvbi5cclxuXHQgKi9cclxuXHRwcmVtdWx0aXBseSggcSApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKCBxLCB0aGlzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTXVsdGlwbGllcyB0aGUgZ2l2ZW4gcXVhdGVybmlvbnMgYW5kIHN0b3JlcyB0aGUgcmVzdWx0IGluIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1F1YXRlcm5pb259IGEgLSBUaGUgZmlyc3QgcXVhdGVybmlvbi5cclxuXHQgKiBAcGFyYW0ge1F1YXRlcm5pb259IGIgLSBUaGUgc2Vjb25kIHF1YXRlcm5pb24uXHJcblx0ICogQHJldHVybiB7UXVhdGVybmlvbn0gQSByZWZlcmVuY2UgdG8gdGhpcyBxdWF0ZXJuaW9uLlxyXG5cdCAqL1xyXG5cdG11bHRpcGx5UXVhdGVybmlvbnMoIGEsIGIgKSB7XHJcblxyXG5cdFx0Ly8gZnJvbSBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9hbGdlYnJhL3JlYWxOb3JtZWRBbGdlYnJhL3F1YXRlcm5pb25zL2NvZGUvaW5kZXguaHRtXHJcblxyXG5cdFx0Y29uc3QgcWF4ID0gYS5feCwgcWF5ID0gYS5feSwgcWF6ID0gYS5feiwgcWF3ID0gYS5fdztcclxuXHRcdGNvbnN0IHFieCA9IGIuX3gsIHFieSA9IGIuX3ksIHFieiA9IGIuX3osIHFidyA9IGIuX3c7XHJcblxyXG5cdFx0dGhpcy5feCA9IHFheCAqIHFidyArIHFhdyAqIHFieCArIHFheSAqIHFieiAtIHFheiAqIHFieTtcclxuXHRcdHRoaXMuX3kgPSBxYXkgKiBxYncgKyBxYXcgKiBxYnkgKyBxYXogKiBxYnggLSBxYXggKiBxYno7XHJcblx0XHR0aGlzLl96ID0gcWF6ICogcWJ3ICsgcWF3ICogcWJ6ICsgcWF4ICogcWJ5IC0gcWF5ICogcWJ4O1xyXG5cdFx0dGhpcy5fdyA9IHFhdyAqIHFidyAtIHFheCAqIHFieCAtIHFheSAqIHFieSAtIHFheiAqIHFiejtcclxuXHJcblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUGVyZm9ybXMgYSBzcGhlcmljYWwgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiBxdWF0ZXJuaW9ucy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UXVhdGVybmlvbn0gcWIgLSBUaGUgdGFyZ2V0IHF1YXRlcm5pb24uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHQgLSBUaGUgaW50ZXJwb2xhdGlvbiBmYWN0b3IgaW4gdGhlIGNsb3NlZCBpbnRlcnZhbCBgWzAsIDFdYC5cclxuXHQgKiBAcmV0dXJuIHtRdWF0ZXJuaW9ufSBBIHJlZmVyZW5jZSB0byB0aGlzIHF1YXRlcm5pb24uXHJcblx0ICovXHJcblx0c2xlcnAoIHFiLCB0ICkge1xyXG5cclxuXHRcdGlmICggdCA9PT0gMCApIHJldHVybiB0aGlzO1xyXG5cdFx0aWYgKCB0ID09PSAxICkgcmV0dXJuIHRoaXMuY29weSggcWIgKTtcclxuXHJcblx0XHRjb25zdCB4ID0gdGhpcy5feCwgeSA9IHRoaXMuX3ksIHogPSB0aGlzLl96LCB3ID0gdGhpcy5fdztcclxuXHJcblx0XHQvLyBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9hbGdlYnJhL3JlYWxOb3JtZWRBbGdlYnJhL3F1YXRlcm5pb25zL3NsZXJwL1xyXG5cclxuXHRcdGxldCBjb3NIYWxmVGhldGEgPSB3ICogcWIuX3cgKyB4ICogcWIuX3ggKyB5ICogcWIuX3kgKyB6ICogcWIuX3o7XHJcblxyXG5cdFx0aWYgKCBjb3NIYWxmVGhldGEgPCAwICkge1xyXG5cclxuXHRcdFx0dGhpcy5fdyA9IC0gcWIuX3c7XHJcblx0XHRcdHRoaXMuX3ggPSAtIHFiLl94O1xyXG5cdFx0XHR0aGlzLl95ID0gLSBxYi5feTtcclxuXHRcdFx0dGhpcy5feiA9IC0gcWIuX3o7XHJcblxyXG5cdFx0XHRjb3NIYWxmVGhldGEgPSAtIGNvc0hhbGZUaGV0YTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGhpcy5jb3B5KCBxYiApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGNvc0hhbGZUaGV0YSA+PSAxLjAgKSB7XHJcblxyXG5cdFx0XHR0aGlzLl93ID0gdztcclxuXHRcdFx0dGhpcy5feCA9IHg7XHJcblx0XHRcdHRoaXMuX3kgPSB5O1xyXG5cdFx0XHR0aGlzLl96ID0gejtcclxuXHJcblx0XHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBzcXJTaW5IYWxmVGhldGEgPSAxLjAgLSBjb3NIYWxmVGhldGEgKiBjb3NIYWxmVGhldGE7XHJcblxyXG5cdFx0aWYgKCBzcXJTaW5IYWxmVGhldGEgPD0gTnVtYmVyLkVQU0lMT04gKSB7XHJcblxyXG5cdFx0XHRjb25zdCBzID0gMSAtIHQ7XHJcblx0XHRcdHRoaXMuX3cgPSBzICogdyArIHQgKiB0aGlzLl93O1xyXG5cdFx0XHR0aGlzLl94ID0gcyAqIHggKyB0ICogdGhpcy5feDtcclxuXHRcdFx0dGhpcy5feSA9IHMgKiB5ICsgdCAqIHRoaXMuX3k7XHJcblx0XHRcdHRoaXMuX3ogPSBzICogeiArIHQgKiB0aGlzLl96O1xyXG5cclxuXHRcdFx0dGhpcy5ub3JtYWxpemUoKTsgLy8gbm9ybWFsaXplIGNhbGxzIF9vbkNoYW5nZUNhbGxiYWNrKClcclxuXHJcblx0XHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBzaW5IYWxmVGhldGEgPSBNYXRoLnNxcnQoIHNxclNpbkhhbGZUaGV0YSApO1xyXG5cdFx0Y29uc3QgaGFsZlRoZXRhID0gTWF0aC5hdGFuMiggc2luSGFsZlRoZXRhLCBjb3NIYWxmVGhldGEgKTtcclxuXHRcdGNvbnN0IHJhdGlvQSA9IE1hdGguc2luKCAoIDEgLSB0ICkgKiBoYWxmVGhldGEgKSAvIHNpbkhhbGZUaGV0YSxcclxuXHRcdFx0cmF0aW9CID0gTWF0aC5zaW4oIHQgKiBoYWxmVGhldGEgKSAvIHNpbkhhbGZUaGV0YTtcclxuXHJcblx0XHR0aGlzLl93ID0gKCB3ICogcmF0aW9BICsgdGhpcy5fdyAqIHJhdGlvQiApO1xyXG5cdFx0dGhpcy5feCA9ICggeCAqIHJhdGlvQSArIHRoaXMuX3ggKiByYXRpb0IgKTtcclxuXHRcdHRoaXMuX3kgPSAoIHkgKiByYXRpb0EgKyB0aGlzLl95ICogcmF0aW9CICk7XHJcblx0XHR0aGlzLl96ID0gKCB6ICogcmF0aW9BICsgdGhpcy5feiAqIHJhdGlvQiApO1xyXG5cclxuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQZXJmb3JtcyBhIHNwaGVyaWNhbCBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHRoZSBnaXZlbiBxdWF0ZXJuaW9uc1xyXG5cdCAqIGFuZCBzdG9yZXMgdGhlIHJlc3VsdCBpbiB0aGlzIHF1YXRlcm5pb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1F1YXRlcm5pb259IHFhIC0gVGhlIHNvdXJjZSBxdWF0ZXJuaW9uLlxyXG5cdCAqIEBwYXJhbSB7UXVhdGVybmlvbn0gcWIgLSBUaGUgdGFyZ2V0IHF1YXRlcm5pb24uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHQgLSBUaGUgaW50ZXJwb2xhdGlvbiBmYWN0b3IgaW4gdGhlIGNsb3NlZCBpbnRlcnZhbCBgWzAsIDFdYC5cclxuXHQgKiBAcmV0dXJuIHtRdWF0ZXJuaW9ufSBBIHJlZmVyZW5jZSB0byB0aGlzIHF1YXRlcm5pb24uXHJcblx0ICovXHJcblx0c2xlcnBRdWF0ZXJuaW9ucyggcWEsIHFiLCB0ICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmNvcHkoIHFhICkuc2xlcnAoIHFiLCB0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGlzIHF1YXRlcm5pb24gdG8gYSB1bmlmb3JtbHkgcmFuZG9tLCBub3JtYWxpemVkIHF1YXRlcm5pb24uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtRdWF0ZXJuaW9ufSBBIHJlZmVyZW5jZSB0byB0aGlzIHF1YXRlcm5pb24uXHJcblx0ICovXHJcblx0cmFuZG9tKCkge1xyXG5cclxuXHRcdC8vIEtlbiBTaG9lbWFrZVxyXG5cdFx0Ly8gVW5pZm9ybSByYW5kb20gcm90YXRpb25zXHJcblx0XHQvLyBELiBLaXJrLCBlZGl0b3IsIEdyYXBoaWNzIEdlbXMgSUlJLCBwYWdlcyAxMjQtMTMyLiBBY2FkZW1pYyBQcmVzcywgTmV3IFlvcmssIDE5OTIuXHJcblxyXG5cdFx0Y29uc3QgdGhldGExID0gMiAqIE1hdGguUEkgKiBNYXRoLnJhbmRvbSgpO1xyXG5cdFx0Y29uc3QgdGhldGEyID0gMiAqIE1hdGguUEkgKiBNYXRoLnJhbmRvbSgpO1xyXG5cclxuXHRcdGNvbnN0IHgwID0gTWF0aC5yYW5kb20oKTtcclxuXHRcdGNvbnN0IHIxID0gTWF0aC5zcXJ0KCAxIC0geDAgKTtcclxuXHRcdGNvbnN0IHIyID0gTWF0aC5zcXJ0KCB4MCApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnNldChcclxuXHRcdFx0cjEgKiBNYXRoLnNpbiggdGhldGExICksXHJcblx0XHRcdHIxICogTWF0aC5jb3MoIHRoZXRhMSApLFxyXG5cdFx0XHRyMiAqIE1hdGguc2luKCB0aGV0YTIgKSxcclxuXHRcdFx0cjIgKiBNYXRoLmNvcyggdGhldGEyICksXHJcblx0XHQpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgcXVhdGVybmlvbiBpcyBlcXVhbCB3aXRoIHRoZSBnaXZlbiBvbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1F1YXRlcm5pb259IHF1YXRlcm5pb24gLSBUaGUgcXVhdGVybmlvbiB0byB0ZXN0IGZvciBlcXVhbGl0eS5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoaXMgcXVhdGVybmlvbiBpcyBlcXVhbCB3aXRoIHRoZSBnaXZlbiBvbmUuXHJcblx0ICovXHJcblx0ZXF1YWxzKCBxdWF0ZXJuaW9uICkge1xyXG5cclxuXHRcdHJldHVybiAoIHF1YXRlcm5pb24uX3ggPT09IHRoaXMuX3ggKSAmJiAoIHF1YXRlcm5pb24uX3kgPT09IHRoaXMuX3kgKSAmJiAoIHF1YXRlcm5pb24uX3ogPT09IHRoaXMuX3ogKSAmJiAoIHF1YXRlcm5pb24uX3cgPT09IHRoaXMuX3cgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoaXMgcXVhdGVybmlvbidzIGNvbXBvbmVudHMgZnJvbSB0aGUgZ2l2ZW4gYXJyYXkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IGFycmF5IC0gQW4gYXJyYXkgaG9sZGluZyB0aGUgcXVhdGVybmlvbiBjb21wb25lbnQgdmFsdWVzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0PTBdIC0gVGhlIG9mZnNldCBpbnRvIHRoZSBhcnJheS5cclxuXHQgKiBAcmV0dXJuIHtRdWF0ZXJuaW9ufSBBIHJlZmVyZW5jZSB0byB0aGlzIHF1YXRlcm5pb24uXHJcblx0ICovXHJcblx0ZnJvbUFycmF5KCBhcnJheSwgb2Zmc2V0ID0gMCApIHtcclxuXHJcblx0XHR0aGlzLl94ID0gYXJyYXlbIG9mZnNldCBdO1xyXG5cdFx0dGhpcy5feSA9IGFycmF5WyBvZmZzZXQgKyAxIF07XHJcblx0XHR0aGlzLl96ID0gYXJyYXlbIG9mZnNldCArIDIgXTtcclxuXHRcdHRoaXMuX3cgPSBhcnJheVsgb2Zmc2V0ICsgMyBdO1xyXG5cclxuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBXcml0ZXMgdGhlIGNvbXBvbmVudHMgb2YgdGhpcyBxdWF0ZXJuaW9uIHRvIHRoZSBnaXZlbiBhcnJheS4gSWYgbm8gYXJyYXkgaXMgcHJvdmlkZWQsXHJcblx0ICogdGhlIG1ldGhvZCByZXR1cm5zIGEgbmV3IGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBbYXJyYXk9W11dIC0gVGhlIHRhcmdldCBhcnJheSBob2xkaW5nIHRoZSBxdWF0ZXJuaW9uIGNvbXBvbmVudHMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXQ9MF0gLSBJbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgYXJyYXkuXHJcblx0ICogQHJldHVybiB7QXJyYXk8bnVtYmVyPn0gVGhlIHF1YXRlcm5pb24gY29tcG9uZW50cy5cclxuXHQgKi9cclxuXHR0b0FycmF5KCBhcnJheSA9IFtdLCBvZmZzZXQgPSAwICkge1xyXG5cclxuXHRcdGFycmF5WyBvZmZzZXQgXSA9IHRoaXMuX3g7XHJcblx0XHRhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGhpcy5feTtcclxuXHRcdGFycmF5WyBvZmZzZXQgKyAyIF0gPSB0aGlzLl96O1xyXG5cdFx0YXJyYXlbIG9mZnNldCArIDMgXSA9IHRoaXMuX3c7XHJcblxyXG5cdFx0cmV0dXJuIGFycmF5O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGNvbXBvbmVudHMgb2YgdGhpcyBxdWF0ZXJuaW9uIGZyb20gdGhlIGdpdmVuIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0J1ZmZlckF0dHJpYnV0ZX0gYXR0cmlidXRlIC0gVGhlIGJ1ZmZlciBhdHRyaWJ1dGUgaG9sZGluZyBxdWF0ZXJuaW9uIGRhdGEuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluZGV4IGludG8gdGhlIGF0dHJpYnV0ZS5cclxuXHQgKiBAcmV0dXJuIHtRdWF0ZXJuaW9ufSBBIHJlZmVyZW5jZSB0byB0aGlzIHF1YXRlcm5pb24uXHJcblx0ICovXHJcblx0ZnJvbUJ1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlLCBpbmRleCApIHtcclxuXHJcblx0XHR0aGlzLl94ID0gYXR0cmlidXRlLmdldFgoIGluZGV4ICk7XHJcblx0XHR0aGlzLl95ID0gYXR0cmlidXRlLmdldFkoIGluZGV4ICk7XHJcblx0XHR0aGlzLl96ID0gYXR0cmlidXRlLmdldFooIGluZGV4ICk7XHJcblx0XHR0aGlzLl93ID0gYXR0cmlidXRlLmdldFcoIGluZGV4ICk7XHJcblxyXG5cdFx0dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kcyBkZWZpbmVzIHRoZSBzZXJpYWxpemF0aW9uIHJlc3VsdCBvZiB0aGlzIGNsYXNzLiBSZXR1cm5zIHRoZVxyXG5cdCAqIG51bWVyaWNhbCBlbGVtZW50cyBvZiB0aGlzIHF1YXRlcm5pb24gaW4gYW4gYXJyYXkgb2YgZm9ybWF0IGBbeCwgeSwgeiwgd11gLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7QXJyYXk8bnVtYmVyPn0gVGhlIHNlcmlhbGl6ZWQgcXVhdGVybmlvbi5cclxuXHQgKi9cclxuXHR0b0pTT04oKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMudG9BcnJheSgpO1xyXG5cclxuXHR9XHJcblxyXG5cdF9vbkNoYW5nZSggY2FsbGJhY2sgKSB7XHJcblxyXG5cdFx0dGhpcy5fb25DaGFuZ2VDYWxsYmFjayA9IGNhbGxiYWNrO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdF9vbkNoYW5nZUNhbGxiYWNrKCkge31cclxuXHJcblx0KlsgU3ltYm9sLml0ZXJhdG9yIF0oKSB7XHJcblxyXG5cdFx0eWllbGQgdGhpcy5feDtcclxuXHRcdHlpZWxkIHRoaXMuX3k7XHJcblx0XHR5aWVsZCB0aGlzLl96O1xyXG5cdFx0eWllbGQgdGhpcy5fdztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgUXVhdGVybmlvbiB9O1xyXG4iLCJpbXBvcnQgeyBjbGFtcCB9IGZyb20gJy4vTWF0aFV0aWxzLmpzJztcclxuaW1wb3J0IHsgUXVhdGVybmlvbiB9IGZyb20gJy4vUXVhdGVybmlvbi5qcyc7XHJcblxyXG4vKipcclxuICogQ2xhc3MgcmVwcmVzZW50aW5nIGEgM0QgdmVjdG9yLiBBIDNEIHZlY3RvciBpcyBhbiBvcmRlcmVkIHRyaXBsZXQgb2YgbnVtYmVyc1xyXG4gKiAobGFiZWxlZCB4LCB5IGFuZCB6KSwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gcmVwcmVzZW50IGEgbnVtYmVyIG9mIHRoaW5ncywgc3VjaCBhczpcclxuICpcclxuICogLSBBIHBvaW50IGluIDNEIHNwYWNlLlxyXG4gKiAtIEEgZGlyZWN0aW9uIGFuZCBsZW5ndGggaW4gM0Qgc3BhY2UuIEluIHRocmVlLmpzIHRoZSBsZW5ndGggd2lsbFxyXG4gKiBhbHdheXMgYmUgdGhlIEV1Y2xpZGVhbiBkaXN0YW5jZShzdHJhaWdodC1saW5lIGRpc3RhbmNlKSBmcm9tIGAoMCwgMCwgMClgIHRvIGAoeCwgeSwgeilgXHJcbiAqIGFuZCB0aGUgZGlyZWN0aW9uIGlzIGFsc28gbWVhc3VyZWQgZnJvbSBgKDAsIDAsIDApYCB0b3dhcmRzIGAoeCwgeSwgeilgLlxyXG4gKiAtIEFueSBhcmJpdHJhcnkgb3JkZXJlZCB0cmlwbGV0IG9mIG51bWJlcnMuXHJcbiAqXHJcbiAqIFRoZXJlIGFyZSBvdGhlciB0aGluZ3MgYSAzRCB2ZWN0b3IgY2FuIGJlIHVzZWQgdG8gcmVwcmVzZW50LCBzdWNoIGFzXHJcbiAqIG1vbWVudHVtIHZlY3RvcnMgYW5kIHNvIG9uLCBob3dldmVyIHRoZXNlIGFyZSB0aGUgbW9zdFxyXG4gKiBjb21tb24gdXNlcyBpbiB0aHJlZS5qcy5cclxuICpcclxuICogSXRlcmF0aW5nIHRocm91Z2ggYSB2ZWN0b3IgaW5zdGFuY2Ugd2lsbCB5aWVsZCBpdHMgY29tcG9uZW50cyBgKHgsIHksIHopYCBpblxyXG4gKiB0aGUgY29ycmVzcG9uZGluZyBvcmRlci5cclxuICogYGBganNcclxuICogY29uc3QgYSA9IG5ldyBUSFJFRS5WZWN0b3IzKCAwLCAxLCAwICk7XHJcbiAqXHJcbiAqIC8vbm8gYXJndW1lbnRzOyB3aWxsIGJlIGluaXRpYWxpc2VkIHRvICgwLCAwLCAwKVxyXG4gKiBjb25zdCBiID0gbmV3IFRIUkVFLlZlY3RvcjMoICk7XHJcbiAqXHJcbiAqIGNvbnN0IGQgPSBhLmRpc3RhbmNlVG8oIGIgKTtcclxuICogYGBgXHJcbiAqL1xyXG5jbGFzcyBWZWN0b3IzIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyAzRCB2ZWN0b3IuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3g9MF0gLSBUaGUgeCB2YWx1ZSBvZiB0aGlzIHZlY3Rvci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3k9MF0gLSBUaGUgeSB2YWx1ZSBvZiB0aGlzIHZlY3Rvci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3o9MF0gLSBUaGUgeiB2YWx1ZSBvZiB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggeCA9IDAsIHkgPSAwLCB6ID0gMCApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdFZlY3RvcjMucHJvdG90eXBlLmlzVmVjdG9yMyA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgeCB2YWx1ZSBvZiB0aGlzIHZlY3Rvci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnggPSB4O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHkgdmFsdWUgb2YgdGhpcyB2ZWN0b3IuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy55ID0geTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB6IHZhbHVlIG9mIHRoaXMgdmVjdG9yLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMueiA9IHo7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdmVjdG9yIGNvbXBvbmVudHMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB2YWx1ZSBvZiB0aGUgeCBjb21wb25lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmFsdWUgb2YgdGhlIHkgY29tcG9uZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB6IC0gVGhlIHZhbHVlIG9mIHRoZSB6IGNvbXBvbmVudC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRzZXQoIHgsIHksIHogKSB7XHJcblxyXG5cdFx0aWYgKCB6ID09PSB1bmRlZmluZWQgKSB6ID0gdGhpcy56OyAvLyBzcHJpdGUuc2NhbGUuc2V0KHgseSlcclxuXHJcblx0XHR0aGlzLnggPSB4O1xyXG5cdFx0dGhpcy55ID0geTtcclxuXHRcdHRoaXMueiA9IHo7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdmVjdG9yIGNvbXBvbmVudHMgdG8gdGhlIHNhbWUgdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc2NhbGFyIC0gVGhlIHZhbHVlIHRvIHNldCBmb3IgYWxsIHZlY3RvciBjb21wb25lbnRzLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHNldFNjYWxhciggc2NhbGFyICkge1xyXG5cclxuXHRcdHRoaXMueCA9IHNjYWxhcjtcclxuXHRcdHRoaXMueSA9IHNjYWxhcjtcclxuXHRcdHRoaXMueiA9IHNjYWxhcjtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB2ZWN0b3IncyB4IGNvbXBvbmVudCB0byB0aGUgZ2l2ZW4gdmFsdWVcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHZhbHVlIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRzZXRYKCB4ICkge1xyXG5cclxuXHRcdHRoaXMueCA9IHg7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdmVjdG9yJ3MgeSBjb21wb25lbnQgdG8gdGhlIGdpdmVuIHZhbHVlXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB2YWx1ZSB0byBzZXQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0c2V0WSggeSApIHtcclxuXHJcblx0XHR0aGlzLnkgPSB5O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHZlY3RvcidzIHogY29tcG9uZW50IHRvIHRoZSBnaXZlbiB2YWx1ZVxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHogLSBUaGUgdmFsdWUgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHNldFooIHogKSB7XHJcblxyXG5cdFx0dGhpcy56ID0gejtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBbGxvd3MgdG8gc2V0IGEgdmVjdG9yIGNvbXBvbmVudCB3aXRoIGFuIGluZGV4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGNvbXBvbmVudCBpbmRleC4gYDBgIGVxdWFscyB0byB4LCBgMWAgZXF1YWxzIHRvIHksIGAyYCBlcXVhbHMgdG8gei5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHNldENvbXBvbmVudCggaW5kZXgsIHZhbHVlICkge1xyXG5cclxuXHRcdHN3aXRjaCAoIGluZGV4ICkge1xyXG5cclxuXHRcdFx0Y2FzZSAwOiB0aGlzLnggPSB2YWx1ZTsgYnJlYWs7XHJcblx0XHRcdGNhc2UgMTogdGhpcy55ID0gdmFsdWU7IGJyZWFrO1xyXG5cdFx0XHRjYXNlIDI6IHRoaXMueiA9IHZhbHVlOyBicmVhaztcclxuXHRcdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCAnaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAnICsgaW5kZXggKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHZlY3RvciBjb21wb25lbnQgd2hpY2ggbWF0Y2hlcyB0aGUgZ2l2ZW4gaW5kZXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgY29tcG9uZW50IGluZGV4LiBgMGAgZXF1YWxzIHRvIHgsIGAxYCBlcXVhbHMgdG8geSwgYDJgIGVxdWFscyB0byB6LlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gQSB2ZWN0b3IgY29tcG9uZW50IHZhbHVlLlxyXG5cdCAqL1xyXG5cdGdldENvbXBvbmVudCggaW5kZXggKSB7XHJcblxyXG5cdFx0c3dpdGNoICggaW5kZXggKSB7XHJcblxyXG5cdFx0XHRjYXNlIDA6IHJldHVybiB0aGlzLng7XHJcblx0XHRcdGNhc2UgMTogcmV0dXJuIHRoaXMueTtcclxuXHRcdFx0Y2FzZSAyOiByZXR1cm4gdGhpcy56O1xyXG5cdFx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoICdpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICcgKyBpbmRleCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbmV3IHZlY3RvciB3aXRoIGNvcGllZCB2YWx1ZXMgZnJvbSB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSBjbG9uZSBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNsb25lKCkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy54LCB0aGlzLnksIHRoaXMueiApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvcGllcyB0aGUgdmFsdWVzIG9mIHRoZSBnaXZlbiB2ZWN0b3IgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdiAtIFRoZSB2ZWN0b3IgdG8gY29weS5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRjb3B5KCB2ICkge1xyXG5cclxuXHRcdHRoaXMueCA9IHYueDtcclxuXHRcdHRoaXMueSA9IHYueTtcclxuXHRcdHRoaXMueiA9IHYuejtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIHRoZSBnaXZlbiB2ZWN0b3IgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdiAtIFRoZSB2ZWN0b3IgdG8gYWRkLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGFkZCggdiApIHtcclxuXHJcblx0XHR0aGlzLnggKz0gdi54O1xyXG5cdFx0dGhpcy55ICs9IHYueTtcclxuXHRcdHRoaXMueiArPSB2Lno7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyB0aGUgZ2l2ZW4gc2NhbGFyIHZhbHVlIHRvIGFsbCBjb21wb25lbnRzIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gcyAtIFRoZSBzY2FsYXIgdG8gYWRkLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGFkZFNjYWxhciggcyApIHtcclxuXHJcblx0XHR0aGlzLnggKz0gcztcclxuXHRcdHRoaXMueSArPSBzO1xyXG5cdFx0dGhpcy56ICs9IHM7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyB0aGUgZ2l2ZW4gdmVjdG9ycyBhbmQgc3RvcmVzIHRoZSByZXN1bHQgaW4gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gYSAtIFRoZSBmaXJzdCB2ZWN0b3IuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBiIC0gVGhlIHNlY29uZCB2ZWN0b3IuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0YWRkVmVjdG9ycyggYSwgYiApIHtcclxuXHJcblx0XHR0aGlzLnggPSBhLnggKyBiLng7XHJcblx0XHR0aGlzLnkgPSBhLnkgKyBiLnk7XHJcblx0XHR0aGlzLnogPSBhLnogKyBiLno7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyB0aGUgZ2l2ZW4gdmVjdG9yIHNjYWxlZCBieSB0aGUgZ2l2ZW4gZmFjdG9yIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN8VmVjdG9yNH0gdiAtIFRoZSB2ZWN0b3IuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHMgLSBUaGUgZmFjdG9yIHRoYXQgc2NhbGVzIGB2YC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRhZGRTY2FsZWRWZWN0b3IoIHYsIHMgKSB7XHJcblxyXG5cdFx0dGhpcy54ICs9IHYueCAqIHM7XHJcblx0XHR0aGlzLnkgKz0gdi55ICogcztcclxuXHRcdHRoaXMueiArPSB2LnogKiBzO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFN1YnRyYWN0cyB0aGUgZ2l2ZW4gdmVjdG9yIGZyb20gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdiAtIFRoZSB2ZWN0b3IgdG8gc3VidHJhY3QuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0c3ViKCB2ICkge1xyXG5cclxuXHRcdHRoaXMueCAtPSB2Lng7XHJcblx0XHR0aGlzLnkgLT0gdi55O1xyXG5cdFx0dGhpcy56IC09IHYuejtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTdWJ0cmFjdHMgdGhlIGdpdmVuIHNjYWxhciB2YWx1ZSBmcm9tIGFsbCBjb21wb25lbnRzIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gcyAtIFRoZSBzY2FsYXIgdG8gc3VidHJhY3QuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0c3ViU2NhbGFyKCBzICkge1xyXG5cclxuXHRcdHRoaXMueCAtPSBzO1xyXG5cdFx0dGhpcy55IC09IHM7XHJcblx0XHR0aGlzLnogLT0gcztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTdWJ0cmFjdHMgdGhlIGdpdmVuIHZlY3RvcnMgYW5kIHN0b3JlcyB0aGUgcmVzdWx0IGluIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IGEgLSBUaGUgZmlyc3QgdmVjdG9yLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gYiAtIFRoZSBzZWNvbmQgdmVjdG9yLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHN1YlZlY3RvcnMoIGEsIGIgKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gYS54IC0gYi54O1xyXG5cdFx0dGhpcy55ID0gYS55IC0gYi55O1xyXG5cdFx0dGhpcy56ID0gYS56IC0gYi56O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE11bHRpcGxpZXMgdGhlIGdpdmVuIHZlY3RvciB3aXRoIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHYgLSBUaGUgdmVjdG9yIHRvIG11bHRpcGx5LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdG11bHRpcGx5KCB2ICkge1xyXG5cclxuXHRcdHRoaXMueCAqPSB2Lng7XHJcblx0XHR0aGlzLnkgKj0gdi55O1xyXG5cdFx0dGhpcy56ICo9IHYuejtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBNdWx0aXBsaWVzIHRoZSBnaXZlbiBzY2FsYXIgdmFsdWUgd2l0aCBhbGwgY29tcG9uZW50cyBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHNjYWxhciAtIFRoZSBzY2FsYXIgdG8gbXVsdGlwbHkuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0bXVsdGlwbHlTY2FsYXIoIHNjYWxhciApIHtcclxuXHJcblx0XHR0aGlzLnggKj0gc2NhbGFyO1xyXG5cdFx0dGhpcy55ICo9IHNjYWxhcjtcclxuXHRcdHRoaXMueiAqPSBzY2FsYXI7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTXVsdGlwbGllcyB0aGUgZ2l2ZW4gdmVjdG9ycyBhbmQgc3RvcmVzIHRoZSByZXN1bHQgaW4gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gYSAtIFRoZSBmaXJzdCB2ZWN0b3IuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBiIC0gVGhlIHNlY29uZCB2ZWN0b3IuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0bXVsdGlwbHlWZWN0b3JzKCBhLCBiICkge1xyXG5cclxuXHRcdHRoaXMueCA9IGEueCAqIGIueDtcclxuXHRcdHRoaXMueSA9IGEueSAqIGIueTtcclxuXHRcdHRoaXMueiA9IGEueiAqIGIuejtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBcHBsaWVzIHRoZSBnaXZlbiBFdWxlciByb3RhdGlvbiB0byB0aGlzIHZlY3Rvci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7RXVsZXJ9IGV1bGVyIC0gVGhlIEV1bGVyIGFuZ2xlcy5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRhcHBseUV1bGVyKCBldWxlciApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5hcHBseVF1YXRlcm5pb24oIF9xdWF0ZXJuaW9uLnNldEZyb21FdWxlciggZXVsZXIgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFwcGxpZXMgYSByb3RhdGlvbiBzcGVjaWZpZWQgYnkgYW4gYXhpcyBhbmQgYW4gYW5nbGUgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IGF4aXMgLSBBIG5vcm1hbGl6ZWQgdmVjdG9yIHJlcHJlc2VudGluZyB0aGUgcm90YXRpb24gYXhpcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYW5nbGUgLSBUaGUgYW5nbGUgaW4gcmFkaWFucy5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRhcHBseUF4aXNBbmdsZSggYXhpcywgYW5nbGUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuYXBwbHlRdWF0ZXJuaW9uKCBfcXVhdGVybmlvbi5zZXRGcm9tQXhpc0FuZ2xlKCBheGlzLCBhbmdsZSApICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTXVsdGlwbGllcyB0aGlzIHZlY3RvciB3aXRoIHRoZSBnaXZlbiAzeDMgbWF0cml4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRyaXgzfSBtIC0gVGhlIDN4MyBtYXRyaXguXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0YXBwbHlNYXRyaXgzKCBtICkge1xyXG5cclxuXHRcdGNvbnN0IHggPSB0aGlzLngsIHkgPSB0aGlzLnksIHogPSB0aGlzLno7XHJcblx0XHRjb25zdCBlID0gbS5lbGVtZW50cztcclxuXHJcblx0XHR0aGlzLnggPSBlWyAwIF0gKiB4ICsgZVsgMyBdICogeSArIGVbIDYgXSAqIHo7XHJcblx0XHR0aGlzLnkgPSBlWyAxIF0gKiB4ICsgZVsgNCBdICogeSArIGVbIDcgXSAqIHo7XHJcblx0XHR0aGlzLnogPSBlWyAyIF0gKiB4ICsgZVsgNSBdICogeSArIGVbIDggXSAqIHo7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTXVsdGlwbGllcyB0aGlzIHZlY3RvciBieSB0aGUgZ2l2ZW4gbm9ybWFsIG1hdHJpeCBhbmQgbm9ybWFsaXplc1xyXG5cdCAqIHRoZSByZXN1bHQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDN9IG0gLSBUaGUgbm9ybWFsIG1hdHJpeC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRhcHBseU5vcm1hbE1hdHJpeCggbSApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDMoIG0gKS5ub3JtYWxpemUoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBNdWx0aXBsaWVzIHRoaXMgdmVjdG9yICh3aXRoIGFuIGltcGxpY2l0IDEgaW4gdGhlIDR0aCBkaW1lbnNpb24pIGJ5IG0sIGFuZFxyXG5cdCAqIGRpdmlkZXMgYnkgcGVyc3BlY3RpdmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDR9IG0gLSBUaGUgbWF0cml4IHRvIGFwcGx5LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGFwcGx5TWF0cml4NCggbSApIHtcclxuXHJcblx0XHRjb25zdCB4ID0gdGhpcy54LCB5ID0gdGhpcy55LCB6ID0gdGhpcy56O1xyXG5cdFx0Y29uc3QgZSA9IG0uZWxlbWVudHM7XHJcblxyXG5cdFx0Y29uc3QgdyA9IDEgLyAoIGVbIDMgXSAqIHggKyBlWyA3IF0gKiB5ICsgZVsgMTEgXSAqIHogKyBlWyAxNSBdICk7XHJcblxyXG5cdFx0dGhpcy54ID0gKCBlWyAwIF0gKiB4ICsgZVsgNCBdICogeSArIGVbIDggXSAqIHogKyBlWyAxMiBdICkgKiB3O1xyXG5cdFx0dGhpcy55ID0gKCBlWyAxIF0gKiB4ICsgZVsgNSBdICogeSArIGVbIDkgXSAqIHogKyBlWyAxMyBdICkgKiB3O1xyXG5cdFx0dGhpcy56ID0gKCBlWyAyIF0gKiB4ICsgZVsgNiBdICogeSArIGVbIDEwIF0gKiB6ICsgZVsgMTQgXSApICogdztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBcHBsaWVzIHRoZSBnaXZlbiBRdWF0ZXJuaW9uIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtRdWF0ZXJuaW9ufSBxIC0gVGhlIFF1YXRlcm5pb24uXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0YXBwbHlRdWF0ZXJuaW9uKCBxICkge1xyXG5cclxuXHRcdC8vIHF1YXRlcm5pb24gcSBpcyBhc3N1bWVkIHRvIGhhdmUgdW5pdCBsZW5ndGhcclxuXHJcblx0XHRjb25zdCB2eCA9IHRoaXMueCwgdnkgPSB0aGlzLnksIHZ6ID0gdGhpcy56O1xyXG5cdFx0Y29uc3QgcXggPSBxLngsIHF5ID0gcS55LCBxeiA9IHEueiwgcXcgPSBxLnc7XHJcblxyXG5cdFx0Ly8gdCA9IDIgKiBjcm9zcyggcS54eXosIHYgKTtcclxuXHRcdGNvbnN0IHR4ID0gMiAqICggcXkgKiB2eiAtIHF6ICogdnkgKTtcclxuXHRcdGNvbnN0IHR5ID0gMiAqICggcXogKiB2eCAtIHF4ICogdnogKTtcclxuXHRcdGNvbnN0IHR6ID0gMiAqICggcXggKiB2eSAtIHF5ICogdnggKTtcclxuXHJcblx0XHQvLyB2ICsgcS53ICogdCArIGNyb3NzKCBxLnh5eiwgdCApO1xyXG5cdFx0dGhpcy54ID0gdnggKyBxdyAqIHR4ICsgcXkgKiB0eiAtIHF6ICogdHk7XHJcblx0XHR0aGlzLnkgPSB2eSArIHF3ICogdHkgKyBxeiAqIHR4IC0gcXggKiB0ejtcclxuXHRcdHRoaXMueiA9IHZ6ICsgcXcgKiB0eiArIHF4ICogdHkgLSBxeSAqIHR4O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFByb2plY3RzIHRoaXMgdmVjdG9yIGZyb20gd29ybGQgc3BhY2UgaW50byB0aGUgY2FtZXJhJ3Mgbm9ybWFsaXplZFxyXG5cdCAqIGRldmljZSBjb29yZGluYXRlIChOREMpIHNwYWNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtDYW1lcmF9IGNhbWVyYSAtIFRoZSBjYW1lcmEuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0cHJvamVjdCggY2FtZXJhICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmFwcGx5TWF0cml4NCggY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSApLmFwcGx5TWF0cml4NCggY2FtZXJhLnByb2plY3Rpb25NYXRyaXggKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVbnByb2plY3RzIHRoaXMgdmVjdG9yIGZyb20gdGhlIGNhbWVyYSdzIG5vcm1hbGl6ZWQgZGV2aWNlIGNvb3JkaW5hdGUgKE5EQylcclxuXHQgKiBzcGFjZSBpbnRvIHdvcmxkIHNwYWNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtDYW1lcmF9IGNhbWVyYSAtIFRoZSBjYW1lcmEuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0dW5wcm9qZWN0KCBjYW1lcmEgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeEludmVyc2UgKS5hcHBseU1hdHJpeDQoIGNhbWVyYS5tYXRyaXhXb3JsZCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRyYW5zZm9ybXMgdGhlIGRpcmVjdGlvbiBvZiB0aGlzIHZlY3RvciBieSBhIG1hdHJpeCAodGhlIHVwcGVyIGxlZnQgMyB4IDNcclxuXHQgKiBzdWJzZXQgb2YgdGhlIGdpdmVuIDR4NCBtYXRyaXggYW5kIHRoZW4gbm9ybWFsaXplcyB0aGUgcmVzdWx0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRyaXg0fSBtIC0gVGhlIG1hdHJpeC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHR0cmFuc2Zvcm1EaXJlY3Rpb24oIG0gKSB7XHJcblxyXG5cdFx0Ly8gaW5wdXQ6IFRIUkVFLk1hdHJpeDQgYWZmaW5lIG1hdHJpeFxyXG5cdFx0Ly8gdmVjdG9yIGludGVycHJldGVkIGFzIGEgZGlyZWN0aW9uXHJcblxyXG5cdFx0Y29uc3QgeCA9IHRoaXMueCwgeSA9IHRoaXMueSwgeiA9IHRoaXMuejtcclxuXHRcdGNvbnN0IGUgPSBtLmVsZW1lbnRzO1xyXG5cclxuXHRcdHRoaXMueCA9IGVbIDAgXSAqIHggKyBlWyA0IF0gKiB5ICsgZVsgOCBdICogejtcclxuXHRcdHRoaXMueSA9IGVbIDEgXSAqIHggKyBlWyA1IF0gKiB5ICsgZVsgOSBdICogejtcclxuXHRcdHRoaXMueiA9IGVbIDIgXSAqIHggKyBlWyA2IF0gKiB5ICsgZVsgMTAgXSAqIHo7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubm9ybWFsaXplKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGl2aWRlcyB0aGlzIGluc3RhbmNlIGJ5IHRoZSBnaXZlbiB2ZWN0b3IuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHYgLSBUaGUgdmVjdG9yIHRvIGRpdmlkZS5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRkaXZpZGUoIHYgKSB7XHJcblxyXG5cdFx0dGhpcy54IC89IHYueDtcclxuXHRcdHRoaXMueSAvPSB2Lnk7XHJcblx0XHR0aGlzLnogLz0gdi56O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERpdmlkZXMgdGhpcyB2ZWN0b3IgYnkgdGhlIGdpdmVuIHNjYWxhci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzY2FsYXIgLSBUaGUgc2NhbGFyIHRvIGRpdmlkZS5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRkaXZpZGVTY2FsYXIoIHNjYWxhciApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseVNjYWxhciggMSAvIHNjYWxhciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIElmIHRoaXMgdmVjdG9yJ3MgeCwgeSBvciB6IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgZ2l2ZW4gdmVjdG9yJ3MgeCwgeSBvciB6XHJcblx0ICogdmFsdWUsIHJlcGxhY2UgdGhhdCB2YWx1ZSB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIG1pbiB2YWx1ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdiAtIFRoZSB2ZWN0b3IuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0bWluKCB2ICkge1xyXG5cclxuXHRcdHRoaXMueCA9IE1hdGgubWluKCB0aGlzLngsIHYueCApO1xyXG5cdFx0dGhpcy55ID0gTWF0aC5taW4oIHRoaXMueSwgdi55ICk7XHJcblx0XHR0aGlzLnogPSBNYXRoLm1pbiggdGhpcy56LCB2LnogKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJZiB0aGlzIHZlY3RvcidzIHgsIHkgb3IgeiB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIGdpdmVuIHZlY3RvcidzIHgsIHkgb3IgelxyXG5cdCAqIHZhbHVlLCByZXBsYWNlIHRoYXQgdmFsdWUgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBtYXggdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHYgLSBUaGUgdmVjdG9yLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdG1heCggdiApIHtcclxuXHJcblx0XHR0aGlzLnggPSBNYXRoLm1heCggdGhpcy54LCB2LnggKTtcclxuXHRcdHRoaXMueSA9IE1hdGgubWF4KCB0aGlzLnksIHYueSApO1xyXG5cdFx0dGhpcy56ID0gTWF0aC5tYXgoIHRoaXMueiwgdi56ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSWYgdGhpcyB2ZWN0b3IncyB4LCB5IG9yIHogdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSBtYXggdmVjdG9yJ3MgeCwgeSBvciB6XHJcblx0ICogdmFsdWUsIGl0IGlzIHJlcGxhY2VkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlLlxyXG5cdCAqIElmIHRoaXMgdmVjdG9yJ3MgeCwgeSBvciB6IHZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgbWluIHZlY3RvcidzIHgsIHkgb3IgeiB2YWx1ZSxcclxuXHQgKiBpdCBpcyByZXBsYWNlZCBieSB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gbWluIC0gVGhlIG1pbmltdW0geCwgeSBhbmQgeiB2YWx1ZXMuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBtYXggLSBUaGUgbWF4aW11bSB4LCB5IGFuZCB6IHZhbHVlcyBpbiB0aGUgZGVzaXJlZCByYW5nZS5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRjbGFtcCggbWluLCBtYXggKSB7XHJcblxyXG5cdFx0Ly8gYXNzdW1lcyBtaW4gPCBtYXgsIGNvbXBvbmVudHdpc2VcclxuXHJcblx0XHR0aGlzLnggPSBjbGFtcCggdGhpcy54LCBtaW4ueCwgbWF4LnggKTtcclxuXHRcdHRoaXMueSA9IGNsYW1wKCB0aGlzLnksIG1pbi55LCBtYXgueSApO1xyXG5cdFx0dGhpcy56ID0gY2xhbXAoIHRoaXMueiwgbWluLnosIG1heC56ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSWYgdGhpcyB2ZWN0b3IncyB4LCB5IG9yIHogdmFsdWVzIGFyZSBncmVhdGVyIHRoYW4gdGhlIG1heCB2YWx1ZSwgdGhleSBhcmVcclxuXHQgKiByZXBsYWNlZCBieSB0aGUgbWF4IHZhbHVlLlxyXG5cdCAqIElmIHRoaXMgdmVjdG9yJ3MgeCwgeSBvciB6IHZhbHVlcyBhcmUgbGVzcyB0aGFuIHRoZSBtaW4gdmFsdWUsIHRoZXkgYXJlXHJcblx0ICogcmVwbGFjZWQgYnkgdGhlIG1pbiB2YWx1ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBtaW5WYWwgLSBUaGUgbWluaW11bSB2YWx1ZSB0aGUgY29tcG9uZW50cyB3aWxsIGJlIGNsYW1wZWQgdG8uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IG1heFZhbCAtIFRoZSBtYXhpbXVtIHZhbHVlIHRoZSBjb21wb25lbnRzIHdpbGwgYmUgY2xhbXBlZCB0by5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRjbGFtcFNjYWxhciggbWluVmFsLCBtYXhWYWwgKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gY2xhbXAoIHRoaXMueCwgbWluVmFsLCBtYXhWYWwgKTtcclxuXHRcdHRoaXMueSA9IGNsYW1wKCB0aGlzLnksIG1pblZhbCwgbWF4VmFsICk7XHJcblx0XHR0aGlzLnogPSBjbGFtcCggdGhpcy56LCBtaW5WYWwsIG1heFZhbCApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIElmIHRoaXMgdmVjdG9yJ3MgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4IHZhbHVlLCBpdCBpcyByZXBsYWNlZCBieVxyXG5cdCAqIHRoZSBtYXggdmFsdWUuXHJcblx0ICogSWYgdGhpcyB2ZWN0b3IncyBsZW5ndGggaXMgbGVzcyB0aGFuIHRoZSBtaW4gdmFsdWUsIGl0IGlzIHJlcGxhY2VkIGJ5IHRoZVxyXG5cdCAqIG1pbiB2YWx1ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBtaW4gLSBUaGUgbWluaW11bSB2YWx1ZSB0aGUgdmVjdG9yIGxlbmd0aCB3aWxsIGJlIGNsYW1wZWQgdG8uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IG1heCAtIFRoZSBtYXhpbXVtIHZhbHVlIHRoZSB2ZWN0b3IgbGVuZ3RoIHdpbGwgYmUgY2xhbXBlZCB0by5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRjbGFtcExlbmd0aCggbWluLCBtYXggKSB7XHJcblxyXG5cdFx0Y29uc3QgbGVuZ3RoID0gdGhpcy5sZW5ndGgoKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoIGxlbmd0aCB8fCAxICkubXVsdGlwbHlTY2FsYXIoIGNsYW1wKCBsZW5ndGgsIG1pbiwgbWF4ICkgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgY29tcG9uZW50cyBvZiB0aGlzIHZlY3RvciBhcmUgcm91bmRlZCBkb3duIHRvIHRoZSBuZWFyZXN0IGludGVnZXIgdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRmbG9vcigpIHtcclxuXHJcblx0XHR0aGlzLnggPSBNYXRoLmZsb29yKCB0aGlzLnggKTtcclxuXHRcdHRoaXMueSA9IE1hdGguZmxvb3IoIHRoaXMueSApO1xyXG5cdFx0dGhpcy56ID0gTWF0aC5mbG9vciggdGhpcy56ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGNvbXBvbmVudHMgb2YgdGhpcyB2ZWN0b3IgYXJlIHJvdW5kZWQgdXAgdG8gdGhlIG5lYXJlc3QgaW50ZWdlciB2YWx1ZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGNlaWwoKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gTWF0aC5jZWlsKCB0aGlzLnggKTtcclxuXHRcdHRoaXMueSA9IE1hdGguY2VpbCggdGhpcy55ICk7XHJcblx0XHR0aGlzLnogPSBNYXRoLmNlaWwoIHRoaXMueiApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBjb21wb25lbnRzIG9mIHRoaXMgdmVjdG9yIGFyZSByb3VuZGVkIHRvIHRoZSBuZWFyZXN0IGludGVnZXIgdmFsdWVcclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHJvdW5kKCkge1xyXG5cclxuXHRcdHRoaXMueCA9IE1hdGgucm91bmQoIHRoaXMueCApO1xyXG5cdFx0dGhpcy55ID0gTWF0aC5yb3VuZCggdGhpcy55ICk7XHJcblx0XHR0aGlzLnogPSBNYXRoLnJvdW5kKCB0aGlzLnogKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgY29tcG9uZW50cyBvZiB0aGlzIHZlY3RvciBhcmUgcm91bmRlZCB0b3dhcmRzIHplcm8gKHVwIGlmIG5lZ2F0aXZlLFxyXG5cdCAqIGRvd24gaWYgcG9zaXRpdmUpIHRvIGFuIGludGVnZXIgdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRyb3VuZFRvWmVybygpIHtcclxuXHJcblx0XHR0aGlzLnggPSBNYXRoLnRydW5jKCB0aGlzLnggKTtcclxuXHRcdHRoaXMueSA9IE1hdGgudHJ1bmMoIHRoaXMueSApO1xyXG5cdFx0dGhpcy56ID0gTWF0aC50cnVuYyggdGhpcy56ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW52ZXJ0cyB0aGlzIHZlY3RvciAtIGkuZS4gc2V0cyB4ID0gLXgsIHkgPSAteSBhbmQgeiA9IC16LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0bmVnYXRlKCkge1xyXG5cclxuXHRcdHRoaXMueCA9IC0gdGhpcy54O1xyXG5cdFx0dGhpcy55ID0gLSB0aGlzLnk7XHJcblx0XHR0aGlzLnogPSAtIHRoaXMuejtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDYWxjdWxhdGVzIHRoZSBkb3QgcHJvZHVjdCBvZiB0aGUgZ2l2ZW4gdmVjdG9yIHdpdGggdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdiAtIFRoZSB2ZWN0b3IgdG8gY29tcHV0ZSB0aGUgZG90IHByb2R1Y3Qgd2l0aC5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSByZXN1bHQgb2YgdGhlIGRvdCBwcm9kdWN0LlxyXG5cdCAqL1xyXG5cdGRvdCggdiApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy54ICogdi54ICsgdGhpcy55ICogdi55ICsgdGhpcy56ICogdi56O1xyXG5cclxuXHR9XHJcblxyXG5cdC8vIFRPRE8gbGVuZ3RoU3F1YXJlZD9cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgdGhlIHNxdWFyZSBvZiB0aGUgRXVjbGlkZWFuIGxlbmd0aCAoc3RyYWlnaHQtbGluZSBsZW5ndGgpIGZyb21cclxuXHQgKiAoMCwgMCwgMCkgdG8gKHgsIHksIHopLiBJZiB5b3UgYXJlIGNvbXBhcmluZyB0aGUgbGVuZ3RocyBvZiB2ZWN0b3JzLCB5b3Ugc2hvdWxkXHJcblx0ICogY29tcGFyZSB0aGUgbGVuZ3RoIHNxdWFyZWQgaW5zdGVhZCBhcyBpdCBpcyBzbGlnaHRseSBtb3JlIGVmZmljaWVudCB0byBjYWxjdWxhdGUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBzcXVhcmUgbGVuZ3RoIG9mIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGxlbmd0aFNxKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkgKyB0aGlzLnogKiB0aGlzLno7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgdGhlICBFdWNsaWRlYW4gbGVuZ3RoIChzdHJhaWdodC1saW5lIGxlbmd0aCkgZnJvbSAoMCwgMCwgMCkgdG8gKHgsIHksIHopLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgbGVuZ3RoIG9mIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGxlbmd0aCgpIHtcclxuXHJcblx0XHRyZXR1cm4gTWF0aC5zcXJ0KCB0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkgKyB0aGlzLnogKiB0aGlzLnogKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB0aGUgTWFuaGF0dGFuIGxlbmd0aCBvZiB0aGlzIHZlY3Rvci5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGxlbmd0aCBvZiB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRtYW5oYXR0YW5MZW5ndGgoKSB7XHJcblxyXG5cdFx0cmV0dXJuIE1hdGguYWJzKCB0aGlzLnggKSArIE1hdGguYWJzKCB0aGlzLnkgKSArIE1hdGguYWJzKCB0aGlzLnogKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb252ZXJ0cyB0aGlzIHZlY3RvciB0byBhIHVuaXQgdmVjdG9yIC0gdGhhdCBpcywgc2V0cyBpdCBlcXVhbCB0byBhIHZlY3RvclxyXG5cdCAqIHdpdGggdGhlIHNhbWUgZGlyZWN0aW9uIGFzIHRoaXMgb25lLCBidXQgd2l0aCBhIHZlY3RvciBsZW5ndGggb2YgYDFgLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0bm9ybWFsaXplKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmRpdmlkZVNjYWxhciggdGhpcy5sZW5ndGgoKSB8fCAxICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGlzIHZlY3RvciB0byBhIHZlY3RvciB3aXRoIHRoZSBzYW1lIGRpcmVjdGlvbiBhcyB0aGlzIG9uZSwgYnV0XHJcblx0ICogd2l0aCB0aGUgc3BlY2lmaWVkIGxlbmd0aC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGggLSBUaGUgbmV3IGxlbmd0aCBvZiB0aGlzIHZlY3Rvci5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRzZXRMZW5ndGgoIGxlbmd0aCApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhciggbGVuZ3RoICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTGluZWFybHkgaW50ZXJwb2xhdGVzIGJldHdlZW4gdGhlIGdpdmVuIHZlY3RvciBhbmQgdGhpcyBpbnN0YW5jZSwgd2hlcmVcclxuXHQgKiBhbHBoYSBpcyB0aGUgcGVyY2VudCBkaXN0YW5jZSBhbG9uZyB0aGUgbGluZSAtIGFscGhhID0gMCB3aWxsIGJlIHRoaXNcclxuXHQgKiB2ZWN0b3IsIGFuZCBhbHBoYSA9IDEgd2lsbCBiZSB0aGUgZ2l2ZW4gb25lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB2IC0gVGhlIHZlY3RvciB0byBpbnRlcnBvbGF0ZSB0b3dhcmRzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhbHBoYSAtIFRoZSBpbnRlcnBvbGF0aW9uIGZhY3RvciwgdHlwaWNhbGx5IGluIHRoZSBjbG9zZWQgaW50ZXJ2YWwgYFswLCAxXWAuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0bGVycCggdiwgYWxwaGEgKSB7XHJcblxyXG5cdFx0dGhpcy54ICs9ICggdi54IC0gdGhpcy54ICkgKiBhbHBoYTtcclxuXHRcdHRoaXMueSArPSAoIHYueSAtIHRoaXMueSApICogYWxwaGE7XHJcblx0XHR0aGlzLnogKz0gKCB2LnogLSB0aGlzLnogKSAqIGFscGhhO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIExpbmVhcmx5IGludGVycG9sYXRlcyBiZXR3ZWVuIHRoZSBnaXZlbiB2ZWN0b3JzLCB3aGVyZSBhbHBoYSBpcyB0aGUgcGVyY2VudFxyXG5cdCAqIGRpc3RhbmNlIGFsb25nIHRoZSBsaW5lIC0gYWxwaGEgPSAwIHdpbGwgYmUgZmlyc3QgdmVjdG9yLCBhbmQgYWxwaGEgPSAxIHdpbGxcclxuXHQgKiBiZSB0aGUgc2Vjb25kIG9uZS4gVGhlIHJlc3VsdCBpcyBzdG9yZWQgaW4gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdjEgLSBUaGUgZmlyc3QgdmVjdG9yLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdjIgLSBUaGUgc2Vjb25kIHZlY3Rvci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYWxwaGEgLSBUaGUgaW50ZXJwb2xhdGlvbiBmYWN0b3IsIHR5cGljYWxseSBpbiB0aGUgY2xvc2VkIGludGVydmFsIGBbMCwgMV1gLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGxlcnBWZWN0b3JzKCB2MSwgdjIsIGFscGhhICkge1xyXG5cclxuXHRcdHRoaXMueCA9IHYxLnggKyAoIHYyLnggLSB2MS54ICkgKiBhbHBoYTtcclxuXHRcdHRoaXMueSA9IHYxLnkgKyAoIHYyLnkgLSB2MS55ICkgKiBhbHBoYTtcclxuXHRcdHRoaXMueiA9IHYxLnogKyAoIHYyLnogLSB2MS56ICkgKiBhbHBoYTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDYWxjdWxhdGVzIHRoZSBjcm9zcyBwcm9kdWN0IG9mIHRoZSBnaXZlbiB2ZWN0b3Igd2l0aCB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB2IC0gVGhlIHZlY3RvciB0byBjb21wdXRlIHRoZSBjcm9zcyBwcm9kdWN0IHdpdGguXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gVGhlIHJlc3VsdCBvZiB0aGUgY3Jvc3MgcHJvZHVjdC5cclxuXHQgKi9cclxuXHRjcm9zcyggdiApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5jcm9zc1ZlY3RvcnMoIHRoaXMsIHYgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDYWxjdWxhdGVzIHRoZSBjcm9zcyBwcm9kdWN0IG9mIHRoZSBnaXZlbiB2ZWN0b3JzIGFuZCBzdG9yZXMgdGhlIHJlc3VsdFxyXG5cdCAqIGluIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IGEgLSBUaGUgZmlyc3QgdmVjdG9yLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gYiAtIFRoZSBzZWNvbmQgdmVjdG9yLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGNyb3NzVmVjdG9ycyggYSwgYiApIHtcclxuXHJcblx0XHRjb25zdCBheCA9IGEueCwgYXkgPSBhLnksIGF6ID0gYS56O1xyXG5cdFx0Y29uc3QgYnggPSBiLngsIGJ5ID0gYi55LCBieiA9IGIuejtcclxuXHJcblx0XHR0aGlzLnggPSBheSAqIGJ6IC0gYXogKiBieTtcclxuXHRcdHRoaXMueSA9IGF6ICogYnggLSBheCAqIGJ6O1xyXG5cdFx0dGhpcy56ID0gYXggKiBieSAtIGF5ICogYng7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUHJvamVjdHMgdGhpcyB2ZWN0b3Igb250byB0aGUgZ2l2ZW4gb25lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB2IC0gVGhlIHZlY3RvciB0byBwcm9qZWN0IHRvLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHByb2plY3RPblZlY3RvciggdiApIHtcclxuXHJcblx0XHRjb25zdCBkZW5vbWluYXRvciA9IHYubGVuZ3RoU3EoKTtcclxuXHJcblx0XHRpZiAoIGRlbm9taW5hdG9yID09PSAwICkgcmV0dXJuIHRoaXMuc2V0KCAwLCAwLCAwICk7XHJcblxyXG5cdFx0Y29uc3Qgc2NhbGFyID0gdi5kb3QoIHRoaXMgKSAvIGRlbm9taW5hdG9yO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmNvcHkoIHYgKS5tdWx0aXBseVNjYWxhciggc2NhbGFyICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUHJvamVjdHMgdGhpcyB2ZWN0b3Igb250byBhIHBsYW5lIGJ5IHN1YnRyYWN0aW5nIHRoaXNcclxuXHQgKiB2ZWN0b3IgcHJvamVjdGVkIG9udG8gdGhlIHBsYW5lJ3Mgbm9ybWFsIGZyb20gdGhpcyB2ZWN0b3IuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHBsYW5lTm9ybWFsIC0gVGhlIHBsYW5lIG5vcm1hbC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRwcm9qZWN0T25QbGFuZSggcGxhbmVOb3JtYWwgKSB7XHJcblxyXG5cdFx0X3ZlY3Rvci5jb3B5KCB0aGlzICkucHJvamVjdE9uVmVjdG9yKCBwbGFuZU5vcm1hbCApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnN1YiggX3ZlY3RvciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlZmxlY3RzIHRoaXMgdmVjdG9yIG9mZiBhIHBsYW5lIG9ydGhvZ29uYWwgdG8gdGhlIGdpdmVuIG5vcm1hbCB2ZWN0b3IuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IG5vcm1hbCAtIFRoZSAobm9ybWFsaXplZCkgbm9ybWFsIHZlY3Rvci5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRyZWZsZWN0KCBub3JtYWwgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuc3ViKCBfdmVjdG9yLmNvcHkoIG5vcm1hbCApLm11bHRpcGx5U2NhbGFyKCAyICogdGhpcy5kb3QoIG5vcm1hbCApICkgKTtcclxuXHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGFuZ2xlIGJldHdlZW4gdGhlIGdpdmVuIHZlY3RvciBhbmQgdGhpcyBpbnN0YW5jZSBpbiByYWRpYW5zLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB2IC0gVGhlIHZlY3RvciB0byBjb21wdXRlIHRoZSBhbmdsZSB3aXRoLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGFuZ2xlIGluIHJhZGlhbnMuXHJcblx0ICovXHJcblx0YW5nbGVUbyggdiApIHtcclxuXHJcblx0XHRjb25zdCBkZW5vbWluYXRvciA9IE1hdGguc3FydCggdGhpcy5sZW5ndGhTcSgpICogdi5sZW5ndGhTcSgpICk7XHJcblxyXG5cdFx0aWYgKCBkZW5vbWluYXRvciA9PT0gMCApIHJldHVybiBNYXRoLlBJIC8gMjtcclxuXHJcblx0XHRjb25zdCB0aGV0YSA9IHRoaXMuZG90KCB2ICkgLyBkZW5vbWluYXRvcjtcclxuXHJcblx0XHQvLyBjbGFtcCwgdG8gaGFuZGxlIG51bWVyaWNhbCBwcm9ibGVtc1xyXG5cclxuXHRcdHJldHVybiBNYXRoLmFjb3MoIGNsYW1wKCB0aGV0YSwgLSAxLCAxICkgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgZ2l2ZW4gdmVjdG9yIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHYgLSBUaGUgdmVjdG9yIHRvIGNvbXB1dGUgdGhlIGRpc3RhbmNlIHRvLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGRpc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGRpc3RhbmNlVG8oIHYgKSB7XHJcblxyXG5cdFx0cmV0dXJuIE1hdGguc3FydCggdGhpcy5kaXN0YW5jZVRvU3F1YXJlZCggdiApICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgdGhlIHNxdWFyZWQgZGlzdGFuY2UgZnJvbSB0aGUgZ2l2ZW4gdmVjdG9yIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICogSWYgeW91IGFyZSBqdXN0IGNvbXBhcmluZyB0aGUgZGlzdGFuY2Ugd2l0aCBhbm90aGVyIGRpc3RhbmNlLCB5b3Ugc2hvdWxkIGNvbXBhcmVcclxuXHQgKiB0aGUgZGlzdGFuY2Ugc3F1YXJlZCBpbnN0ZWFkIGFzIGl0IGlzIHNsaWdodGx5IG1vcmUgZWZmaWNpZW50IHRvIGNhbGN1bGF0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdiAtIFRoZSB2ZWN0b3IgdG8gY29tcHV0ZSB0aGUgc3F1YXJlZCBkaXN0YW5jZSB0by5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBzcXVhcmVkIGRpc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGRpc3RhbmNlVG9TcXVhcmVkKCB2ICkge1xyXG5cclxuXHRcdGNvbnN0IGR4ID0gdGhpcy54IC0gdi54LCBkeSA9IHRoaXMueSAtIHYueSwgZHogPSB0aGlzLnogLSB2Lno7XHJcblxyXG5cdFx0cmV0dXJuIGR4ICogZHggKyBkeSAqIGR5ICsgZHogKiBkejtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB0aGUgTWFuaGF0dGFuIGRpc3RhbmNlIGZyb20gdGhlIGdpdmVuIHZlY3RvciB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB2IC0gVGhlIHZlY3RvciB0byBjb21wdXRlIHRoZSBNYW5oYXR0YW4gZGlzdGFuY2UgdG8uXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgTWFuaGF0dGFuIGRpc3RhbmNlLlxyXG5cdCAqL1xyXG5cdG1hbmhhdHRhbkRpc3RhbmNlVG8oIHYgKSB7XHJcblxyXG5cdFx0cmV0dXJuIE1hdGguYWJzKCB0aGlzLnggLSB2LnggKSArIE1hdGguYWJzKCB0aGlzLnkgLSB2LnkgKSArIE1hdGguYWJzKCB0aGlzLnogLSB2LnogKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB2ZWN0b3IgY29tcG9uZW50cyBmcm9tIHRoZSBnaXZlbiBzcGhlcmljYWwgY29vcmRpbmF0ZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1NwaGVyaWNhbH0gcyAtIFRoZSBzcGhlcmljYWwgY29vcmRpbmF0ZXMuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0c2V0RnJvbVNwaGVyaWNhbCggcyApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5zZXRGcm9tU3BoZXJpY2FsQ29vcmRzKCBzLnJhZGl1cywgcy5waGksIHMudGhldGEgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB2ZWN0b3IgY29tcG9uZW50cyBmcm9tIHRoZSBnaXZlbiBzcGhlcmljYWwgY29vcmRpbmF0ZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gcmFkaXVzIC0gVGhlIHJhZGl1cy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gcGhpIC0gVGhlIHBoaSBhbmdsZSBpbiByYWRpYW5zLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0aGV0YSAtIFRoZSB0aGV0YSBhbmdsZSBpbiByYWRpYW5zLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHNldEZyb21TcGhlcmljYWxDb29yZHMoIHJhZGl1cywgcGhpLCB0aGV0YSApIHtcclxuXHJcblx0XHRjb25zdCBzaW5QaGlSYWRpdXMgPSBNYXRoLnNpbiggcGhpICkgKiByYWRpdXM7XHJcblxyXG5cdFx0dGhpcy54ID0gc2luUGhpUmFkaXVzICogTWF0aC5zaW4oIHRoZXRhICk7XHJcblx0XHR0aGlzLnkgPSBNYXRoLmNvcyggcGhpICkgKiByYWRpdXM7XHJcblx0XHR0aGlzLnogPSBzaW5QaGlSYWRpdXMgKiBNYXRoLmNvcyggdGhldGEgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB2ZWN0b3IgY29tcG9uZW50cyBmcm9tIHRoZSBnaXZlbiBjeWxpbmRyaWNhbCBjb29yZGluYXRlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Q3lsaW5kcmljYWx9IGMgLSBUaGUgY3lsaW5kcmljYWwgY29vcmRpbmF0ZXMuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0c2V0RnJvbUN5bGluZHJpY2FsKCBjICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnNldEZyb21DeWxpbmRyaWNhbENvb3JkcyggYy5yYWRpdXMsIGMudGhldGEsIGMueSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHZlY3RvciBjb21wb25lbnRzIGZyb20gdGhlIGdpdmVuIGN5bGluZHJpY2FsIGNvb3JkaW5hdGVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHJhZGl1cyAtIFRoZSByYWRpdXMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHRoZXRhIC0gVGhlIHRoZXRhIGFuZ2xlIGluIHJhZGlhbnMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgeSB2YWx1ZS5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRzZXRGcm9tQ3lsaW5kcmljYWxDb29yZHMoIHJhZGl1cywgdGhldGEsIHkgKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gcmFkaXVzICogTWF0aC5zaW4oIHRoZXRhICk7XHJcblx0XHR0aGlzLnkgPSB5O1xyXG5cdFx0dGhpcy56ID0gcmFkaXVzICogTWF0aC5jb3MoIHRoZXRhICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdmVjdG9yIGNvbXBvbmVudHMgdG8gdGhlIHBvc2l0aW9uIGVsZW1lbnRzIG9mIHRoZVxyXG5cdCAqIGdpdmVuIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4NH0gbSAtIFRoZSA0eDQgbWF0cml4LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHNldEZyb21NYXRyaXhQb3NpdGlvbiggbSApIHtcclxuXHJcblx0XHRjb25zdCBlID0gbS5lbGVtZW50cztcclxuXHJcblx0XHR0aGlzLnggPSBlWyAxMiBdO1xyXG5cdFx0dGhpcy55ID0gZVsgMTMgXTtcclxuXHRcdHRoaXMueiA9IGVbIDE0IF07XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdmVjdG9yIGNvbXBvbmVudHMgdG8gdGhlIHNjYWxlIGVsZW1lbnRzIG9mIHRoZVxyXG5cdCAqIGdpdmVuIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4NH0gbSAtIFRoZSA0eDQgbWF0cml4LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHNldEZyb21NYXRyaXhTY2FsZSggbSApIHtcclxuXHJcblx0XHRjb25zdCBzeCA9IHRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbiggbSwgMCApLmxlbmd0aCgpO1xyXG5cdFx0Y29uc3Qgc3kgPSB0aGlzLnNldEZyb21NYXRyaXhDb2x1bW4oIG0sIDEgKS5sZW5ndGgoKTtcclxuXHRcdGNvbnN0IHN6ID0gdGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKCBtLCAyICkubGVuZ3RoKCk7XHJcblxyXG5cdFx0dGhpcy54ID0gc3g7XHJcblx0XHR0aGlzLnkgPSBzeTtcclxuXHRcdHRoaXMueiA9IHN6O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHZlY3RvciBjb21wb25lbnRzIGZyb20gdGhlIHNwZWNpZmllZCBtYXRyaXggY29sdW1uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRyaXg0fSBtIC0gVGhlIDR4NCBtYXRyaXguXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGNvbHVtbiBpbmRleC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRzZXRGcm9tTWF0cml4Q29sdW1uKCBtLCBpbmRleCApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5mcm9tQXJyYXkoIG0uZWxlbWVudHMsIGluZGV4ICogNCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHZlY3RvciBjb21wb25lbnRzIGZyb20gdGhlIHNwZWNpZmllZCBtYXRyaXggY29sdW1uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRyaXgzfSBtIC0gVGhlIDN4MyBtYXRyaXguXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGNvbHVtbiBpbmRleC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRzZXRGcm9tTWF0cml4M0NvbHVtbiggbSwgaW5kZXggKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZnJvbUFycmF5KCBtLmVsZW1lbnRzLCBpbmRleCAqIDMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB2ZWN0b3IgY29tcG9uZW50cyBmcm9tIHRoZSBnaXZlbiBFdWxlciBhbmdsZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0V1bGVyfSBlIC0gVGhlIEV1bGVyIGFuZ2xlcyB0byBzZXQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0c2V0RnJvbUV1bGVyKCBlICkge1xyXG5cclxuXHRcdHRoaXMueCA9IGUuX3g7XHJcblx0XHR0aGlzLnkgPSBlLl95O1xyXG5cdFx0dGhpcy56ID0gZS5fejtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB2ZWN0b3IgY29tcG9uZW50cyBmcm9tIHRoZSBSR0IgY29tcG9uZW50cyBvZiB0aGVcclxuXHQgKiBnaXZlbiBjb2xvci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Q29sb3J9IGMgLSBUaGUgY29sb3IgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHNldEZyb21Db2xvciggYyApIHtcclxuXHJcblx0XHR0aGlzLnggPSBjLnI7XHJcblx0XHR0aGlzLnkgPSBjLmc7XHJcblx0XHR0aGlzLnogPSBjLmI7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyB2ZWN0b3IgaXMgZXF1YWwgd2l0aCB0aGUgZ2l2ZW4gb25lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB2IC0gVGhlIHZlY3RvciB0byB0ZXN0IGZvciBlcXVhbGl0eS5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoaXMgdmVjdG9yIGlzIGVxdWFsIHdpdGggdGhlIGdpdmVuIG9uZS5cclxuXHQgKi9cclxuXHRlcXVhbHMoIHYgKSB7XHJcblxyXG5cdFx0cmV0dXJuICggKCB2LnggPT09IHRoaXMueCApICYmICggdi55ID09PSB0aGlzLnkgKSAmJiAoIHYueiA9PT0gdGhpcy56ICkgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoaXMgdmVjdG9yJ3MgeCB2YWx1ZSB0byBiZSBgYXJyYXlbIG9mZnNldCBdYCwgeSB2YWx1ZSB0byBiZSBgYXJyYXlbIG9mZnNldCArIDEgXWBcclxuXHQgKiBhbmQgeiB2YWx1ZSB0byBiZSBgYXJyYXlbIG9mZnNldCArIDIgXWAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IGFycmF5IC0gQW4gYXJyYXkgaG9sZGluZyB0aGUgdmVjdG9yIGNvbXBvbmVudCB2YWx1ZXMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXQ9MF0gLSBUaGUgb2Zmc2V0IGludG8gdGhlIGFycmF5LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGZyb21BcnJheSggYXJyYXksIG9mZnNldCA9IDAgKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gYXJyYXlbIG9mZnNldCBdO1xyXG5cdFx0dGhpcy55ID0gYXJyYXlbIG9mZnNldCArIDEgXTtcclxuXHRcdHRoaXMueiA9IGFycmF5WyBvZmZzZXQgKyAyIF07XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogV3JpdGVzIHRoZSBjb21wb25lbnRzIG9mIHRoaXMgdmVjdG9yIHRvIHRoZSBnaXZlbiBhcnJheS4gSWYgbm8gYXJyYXkgaXMgcHJvdmlkZWQsXHJcblx0ICogdGhlIG1ldGhvZCByZXR1cm5zIGEgbmV3IGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBbYXJyYXk9W11dIC0gVGhlIHRhcmdldCBhcnJheSBob2xkaW5nIHRoZSB2ZWN0b3IgY29tcG9uZW50cy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW29mZnNldD0wXSAtIEluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBhcnJheS5cclxuXHQgKiBAcmV0dXJuIHtBcnJheTxudW1iZXI+fSBUaGUgdmVjdG9yIGNvbXBvbmVudHMuXHJcblx0ICovXHJcblx0dG9BcnJheSggYXJyYXkgPSBbXSwgb2Zmc2V0ID0gMCApIHtcclxuXHJcblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0aGlzLng7XHJcblx0XHRhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGhpcy55O1xyXG5cdFx0YXJyYXlbIG9mZnNldCArIDIgXSA9IHRoaXMuejtcclxuXHJcblx0XHRyZXR1cm4gYXJyYXk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgY29tcG9uZW50cyBvZiB0aGlzIHZlY3RvciBmcm9tIHRoZSBnaXZlbiBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCdWZmZXJBdHRyaWJ1dGV9IGF0dHJpYnV0ZSAtIFRoZSBidWZmZXIgYXR0cmlidXRlIGhvbGRpbmcgdmVjdG9yIGRhdGEuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluZGV4IGludG8gdGhlIGF0dHJpYnV0ZS5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRmcm9tQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGluZGV4ICkge1xyXG5cclxuXHRcdHRoaXMueCA9IGF0dHJpYnV0ZS5nZXRYKCBpbmRleCApO1xyXG5cdFx0dGhpcy55ID0gYXR0cmlidXRlLmdldFkoIGluZGV4ICk7XHJcblx0XHR0aGlzLnogPSBhdHRyaWJ1dGUuZ2V0WiggaW5kZXggKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIGVhY2ggY29tcG9uZW50IG9mIHRoaXMgdmVjdG9yIHRvIGEgcHNldWRvLXJhbmRvbSB2YWx1ZSBiZXR3ZWVuIGAwYCBhbmRcclxuXHQgKiBgMWAsIGV4Y2x1ZGluZyBgMWAuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRyYW5kb20oKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gTWF0aC5yYW5kb20oKTtcclxuXHRcdHRoaXMueSA9IE1hdGgucmFuZG9tKCk7XHJcblx0XHR0aGlzLnogPSBNYXRoLnJhbmRvbSgpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhpcyB2ZWN0b3IgdG8gYSB1bmlmb3JtbHkgcmFuZG9tIHBvaW50IG9uIGEgdW5pdCBzcGhlcmUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRyYW5kb21EaXJlY3Rpb24oKSB7XHJcblxyXG5cdFx0Ly8gaHR0cHM6Ly9tYXRod29ybGQud29sZnJhbS5jb20vU3BoZXJlUG9pbnRQaWNraW5nLmh0bWxcclxuXHJcblx0XHRjb25zdCB0aGV0YSA9IE1hdGgucmFuZG9tKCkgKiBNYXRoLlBJICogMjtcclxuXHRcdGNvbnN0IHUgPSBNYXRoLnJhbmRvbSgpICogMiAtIDE7XHJcblx0XHRjb25zdCBjID0gTWF0aC5zcXJ0KCAxIC0gdSAqIHUgKTtcclxuXHJcblx0XHR0aGlzLnggPSBjICogTWF0aC5jb3MoIHRoZXRhICk7XHJcblx0XHR0aGlzLnkgPSB1O1xyXG5cdFx0dGhpcy56ID0gYyAqIE1hdGguc2luKCB0aGV0YSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdCpbIFN5bWJvbC5pdGVyYXRvciBdKCkge1xyXG5cclxuXHRcdHlpZWxkIHRoaXMueDtcclxuXHRcdHlpZWxkIHRoaXMueTtcclxuXHRcdHlpZWxkIHRoaXMuejtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuY29uc3QgX3ZlY3RvciA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX3F1YXRlcm5pb24gPSAvKkBfX1BVUkVfXyovIG5ldyBRdWF0ZXJuaW9uKCk7XHJcblxyXG5leHBvcnQgeyBWZWN0b3IzIH07XHJcbiIsImltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuL1ZlY3RvcjMuanMnO1xyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgYW4gYXhpcy1hbGlnbmVkIGJvdW5kaW5nIGJveCAoQUFCQikgaW4gM0Qgc3BhY2UuXHJcbiAqL1xyXG5jbGFzcyBCb3gzIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBib3VuZGluZyBib3guXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IFttaW49KEluZmluaXR5LEluZmluaXR5LEluZmluaXR5KV0gLSBBIHZlY3RvciByZXByZXNlbnRpbmcgdGhlIGxvd2VyIGJvdW5kYXJ5IG9mIHRoZSBib3guXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBbbWF4PSgtSW5maW5pdHksLUluZmluaXR5LC1JbmZpbml0eSldIC0gQSB2ZWN0b3IgcmVwcmVzZW50aW5nIHRoZSB1cHBlciBib3VuZGFyeSBvZiB0aGUgYm94LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBtaW4gPSBuZXcgVmVjdG9yMyggKyBJbmZpbml0eSwgKyBJbmZpbml0eSwgKyBJbmZpbml0eSApLCBtYXggPSBuZXcgVmVjdG9yMyggLSBJbmZpbml0eSwgLSBJbmZpbml0eSwgLSBJbmZpbml0eSApICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0JveDMgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGxvd2VyIGJvdW5kYXJ5IG9mIHRoZSBib3guXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjN9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWluID0gbWluO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHVwcGVyIGJvdW5kYXJ5IG9mIHRoZSBib3guXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjN9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWF4ID0gbWF4O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGxvd2VyIGFuZCB1cHBlciBib3VuZGFyaWVzIG9mIHRoaXMgYm94LlxyXG5cdCAqIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBtZXRob2Qgb25seSBjb3BpZXMgdGhlIHZhbHVlcyBmcm9tIHRoZSBnaXZlbiBvYmplY3RzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBtaW4gLSBUaGUgbG93ZXIgYm91bmRhcnkgb2YgdGhlIGJveC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IG1heCAtIFRoZSB1cHBlciBib3VuZGFyeSBvZiB0aGUgYm94LlxyXG5cdCAqIEByZXR1cm4ge0JveDN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgYm91bmRpbmcgYm94LlxyXG5cdCAqL1xyXG5cdHNldCggbWluLCBtYXggKSB7XHJcblxyXG5cdFx0dGhpcy5taW4uY29weSggbWluICk7XHJcblx0XHR0aGlzLm1heC5jb3B5KCBtYXggKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB1cHBlciBhbmQgbG93ZXIgYm91bmRzIG9mIHRoaXMgYm94IHNvIGl0IGVuY2xvc2VzIHRoZSBwb3NpdGlvbiBkYXRhXHJcblx0ICogaW4gdGhlIGdpdmVuIGFycmF5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBhcnJheSAtIEFuIGFycmF5IGhvbGRpbmcgM0QgcG9zaXRpb24gZGF0YS5cclxuXHQgKiBAcmV0dXJuIHtCb3gzfSBBIHJlZmVyZW5jZSB0byB0aGlzIGJvdW5kaW5nIGJveC5cclxuXHQgKi9cclxuXHRzZXRGcm9tQXJyYXkoIGFycmF5ICkge1xyXG5cclxuXHRcdHRoaXMubWFrZUVtcHR5KCk7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGlsOyBpICs9IDMgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmV4cGFuZEJ5UG9pbnQoIF92ZWN0b3IuZnJvbUFycmF5KCBhcnJheSwgaSApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHVwcGVyIGFuZCBsb3dlciBib3VuZHMgb2YgdGhpcyBib3ggc28gaXQgZW5jbG9zZXMgdGhlIHBvc2l0aW9uIGRhdGFcclxuXHQgKiBpbiB0aGUgZ2l2ZW4gYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyQXR0cmlidXRlfSBhdHRyaWJ1dGUgLSBBIGJ1ZmZlciBhdHRyaWJ1dGUgaG9sZGluZyAzRCBwb3NpdGlvbiBkYXRhLlxyXG5cdCAqIEByZXR1cm4ge0JveDN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgYm91bmRpbmcgYm94LlxyXG5cdCAqL1xyXG5cdHNldEZyb21CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApIHtcclxuXHJcblx0XHR0aGlzLm1ha2VFbXB0eSgpO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBhdHRyaWJ1dGUuY291bnQ7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHRcdHRoaXMuZXhwYW5kQnlQb2ludCggX3ZlY3Rvci5mcm9tQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGkgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB1cHBlciBhbmQgbG93ZXIgYm91bmRzIG9mIHRoaXMgYm94IHNvIGl0IGVuY2xvc2VzIHRoZSBwb3NpdGlvbiBkYXRhXHJcblx0ICogaW4gdGhlIGdpdmVuIGFycmF5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxWZWN0b3IzPn0gcG9pbnRzIC0gQW4gYXJyYXkgaG9sZGluZyAzRCBwb3NpdGlvbiBkYXRhIGFzIGluc3RhbmNlcyBvZiB7QGxpbmsgVmVjdG9yM30uXHJcblx0ICogQHJldHVybiB7Qm94M30gQSByZWZlcmVuY2UgdG8gdGhpcyBib3VuZGluZyBib3guXHJcblx0ICovXHJcblx0c2V0RnJvbVBvaW50cyggcG9pbnRzICkge1xyXG5cclxuXHRcdHRoaXMubWFrZUVtcHR5KCk7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHRcdHRoaXMuZXhwYW5kQnlQb2ludCggcG9pbnRzWyBpIF0gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2VudGVycyB0aGlzIGJveCBvbiB0aGUgZ2l2ZW4gY2VudGVyIHZlY3RvciBhbmQgc2V0cyB0aGlzIGJveCdzIHdpZHRoLCBoZWlnaHQgYW5kXHJcblx0ICogZGVwdGggdG8gdGhlIGdpdmVuIHNpemUgdmFsdWVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBjZW50ZXIgLSBUaGUgY2VudGVyIG9mIHRoZSBib3guXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBzaXplIC0gVGhlIHgsIHkgYW5kIHogZGltZW5zaW9ucyBvZiB0aGUgYm94LlxyXG5cdCAqIEByZXR1cm4ge0JveDN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgYm91bmRpbmcgYm94LlxyXG5cdCAqL1xyXG5cdHNldEZyb21DZW50ZXJBbmRTaXplKCBjZW50ZXIsIHNpemUgKSB7XHJcblxyXG5cdFx0Y29uc3QgaGFsZlNpemUgPSBfdmVjdG9yLmNvcHkoIHNpemUgKS5tdWx0aXBseVNjYWxhciggMC41ICk7XHJcblxyXG5cdFx0dGhpcy5taW4uY29weSggY2VudGVyICkuc3ViKCBoYWxmU2l6ZSApO1xyXG5cdFx0dGhpcy5tYXguY29weSggY2VudGVyICkuYWRkKCBoYWxmU2l6ZSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSB3b3JsZC1heGlzLWFsaWduZWQgYm91bmRpbmcgYm94IGZvciB0aGUgZ2l2ZW4gM0Qgb2JqZWN0XHJcblx0ICogKGluY2x1ZGluZyBpdHMgY2hpbGRyZW4pLCBhY2NvdW50aW5nIGZvciB0aGUgb2JqZWN0J3MsIGFuZCBjaGlsZHJlbidzLFxyXG5cdCAqIHdvcmxkIHRyYW5zZm9ybXMuIFRoZSBmdW5jdGlvbiBtYXkgcmVzdWx0IGluIGEgbGFyZ2VyIGJveCB0aGFuIHN0cmljdGx5IG5lY2Vzc2FyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0M0R9IG9iamVjdCAtIFRoZSAzRCBvYmplY3QgdG8gY29tcHV0ZSB0aGUgYm91bmRpbmcgYm94IGZvci5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtwcmVjaXNlPWZhbHNlXSAtIElmIHNldCB0byBgdHJ1ZWAsIHRoZSBtZXRob2QgY29tcHV0ZXMgdGhlIHNtYWxsZXN0XHJcblx0ICogd29ybGQtYXhpcy1hbGlnbmVkIGJvdW5kaW5nIGJveCBhdCB0aGUgZXhwZW5zZSBvZiBtb3JlIGNvbXB1dGF0aW9uLlxyXG5cdCAqIEByZXR1cm4ge0JveDN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgYm91bmRpbmcgYm94LlxyXG5cdCAqL1xyXG5cdHNldEZyb21PYmplY3QoIG9iamVjdCwgcHJlY2lzZSA9IGZhbHNlICkge1xyXG5cclxuXHRcdHRoaXMubWFrZUVtcHR5KCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZXhwYW5kQnlPYmplY3QoIG9iamVjdCwgcHJlY2lzZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBuZXcgYm94IHdpdGggY29waWVkIHZhbHVlcyBmcm9tIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtCb3gzfSBBIGNsb25lIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y2xvbmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvcGllcyB0aGUgdmFsdWVzIG9mIHRoZSBnaXZlbiBib3ggdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Qm94M30gYm94IC0gVGhlIGJveCB0byBjb3B5LlxyXG5cdCAqIEByZXR1cm4ge0JveDN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgYm91bmRpbmcgYm94LlxyXG5cdCAqL1xyXG5cdGNvcHkoIGJveCApIHtcclxuXHJcblx0XHR0aGlzLm1pbi5jb3B5KCBib3gubWluICk7XHJcblx0XHR0aGlzLm1heC5jb3B5KCBib3gubWF4ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTWFrZXMgdGhpcyBib3ggZW1wdHkgd2hpY2ggbWVhbnMgaW4gZW5jbG9zZXMgYSB6ZXJvIHNwYWNlIGluIDNELlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Qm94M30gQSByZWZlcmVuY2UgdG8gdGhpcyBib3VuZGluZyBib3guXHJcblx0ICovXHJcblx0bWFrZUVtcHR5KCkge1xyXG5cclxuXHRcdHRoaXMubWluLnggPSB0aGlzLm1pbi55ID0gdGhpcy5taW4ueiA9ICsgSW5maW5pdHk7XHJcblx0XHR0aGlzLm1heC54ID0gdGhpcy5tYXgueSA9IHRoaXMubWF4LnogPSAtIEluZmluaXR5O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGJveCBpbmNsdWRlcyB6ZXJvIHBvaW50cyB3aXRoaW4gaXRzIGJvdW5kcy5cclxuXHQgKiBOb3RlIHRoYXQgYSBib3ggd2l0aCBlcXVhbCBsb3dlciBhbmQgdXBwZXIgYm91bmRzIHN0aWxsIGluY2x1ZGVzIG9uZVxyXG5cdCAqIHBvaW50LCB0aGUgb25lIGJvdGggYm91bmRzIHNoYXJlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGlzIGJveCBpcyBlbXB0eSBvciBub3QuXHJcblx0ICovXHJcblx0aXNFbXB0eSgpIHtcclxuXHJcblx0XHQvLyB0aGlzIGlzIGEgbW9yZSByb2J1c3QgY2hlY2sgZm9yIGVtcHR5IHRoYW4gKCB2b2x1bWUgPD0gMCApIGJlY2F1c2Ugdm9sdW1lIGNhbiBnZXQgcG9zaXRpdmUgd2l0aCB0d28gbmVnYXRpdmUgYXhlc1xyXG5cclxuXHRcdHJldHVybiAoIHRoaXMubWF4LnggPCB0aGlzLm1pbi54ICkgfHwgKCB0aGlzLm1heC55IDwgdGhpcy5taW4ueSApIHx8ICggdGhpcy5tYXgueiA8IHRoaXMubWluLnogKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBjZW50ZXIgcG9pbnQgb2YgdGhpcyBib3guXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHRhcmdldCAtIFRoZSB0YXJnZXQgdmVjdG9yIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbWV0aG9kJ3MgcmVzdWx0LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IFRoZSBjZW50ZXIgcG9pbnQuXHJcblx0ICovXHJcblx0Z2V0Q2VudGVyKCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuaXNFbXB0eSgpID8gdGFyZ2V0LnNldCggMCwgMCwgMCApIDogdGFyZ2V0LmFkZFZlY3RvcnMoIHRoaXMubWluLCB0aGlzLm1heCApLm11bHRpcGx5U2NhbGFyKCAwLjUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBkaW1lbnNpb25zIG9mIHRoaXMgYm94LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IHZlY3RvciB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGhvZCdzIHJlc3VsdC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBUaGUgc2l6ZS5cclxuXHQgKi9cclxuXHRnZXRTaXplKCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuaXNFbXB0eSgpID8gdGFyZ2V0LnNldCggMCwgMCwgMCApIDogdGFyZ2V0LnN1YlZlY3RvcnMoIHRoaXMubWF4LCB0aGlzLm1pbiApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEV4cGFuZHMgdGhlIGJvdW5kYXJpZXMgb2YgdGhpcyBib3ggdG8gaW5jbHVkZSB0aGUgZ2l2ZW4gcG9pbnQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHBvaW50IC0gVGhlIHBvaW50IHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGJ5IHRoZSBib3VuZGluZyBib3guXHJcblx0ICogQHJldHVybiB7Qm94M30gQSByZWZlcmVuY2UgdG8gdGhpcyBib3VuZGluZyBib3guXHJcblx0ICovXHJcblx0ZXhwYW5kQnlQb2ludCggcG9pbnQgKSB7XHJcblxyXG5cdFx0dGhpcy5taW4ubWluKCBwb2ludCApO1xyXG5cdFx0dGhpcy5tYXgubWF4KCBwb2ludCApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEV4cGFuZHMgdGhpcyBib3ggZXF1aWxhdGVyYWxseSBieSB0aGUgZ2l2ZW4gdmVjdG9yLiBUaGUgd2lkdGggb2YgdGhpc1xyXG5cdCAqIGJveCB3aWxsIGJlIGV4cGFuZGVkIGJ5IHRoZSB4IGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yIGluIGJvdGhcclxuXHQgKiBkaXJlY3Rpb25zLiBUaGUgaGVpZ2h0IG9mIHRoaXMgYm94IHdpbGwgYmUgZXhwYW5kZWQgYnkgdGhlIHkgY29tcG9uZW50IG9mXHJcblx0ICogdGhlIHZlY3RvciBpbiBib3RoIGRpcmVjdGlvbnMuIFRoZSBkZXB0aCBvZiB0aGlzIGJveCB3aWxsIGJlXHJcblx0ICogZXhwYW5kZWQgYnkgdGhlIHogY29tcG9uZW50IG9mIHRoZSB2ZWN0b3IgaW4gYm90aCBkaXJlY3Rpb25zLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB2ZWN0b3IgLSBUaGUgdmVjdG9yIHRoYXQgc2hvdWxkIGV4cGFuZCB0aGUgYm91bmRpbmcgYm94LlxyXG5cdCAqIEByZXR1cm4ge0JveDN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgYm91bmRpbmcgYm94LlxyXG5cdCAqL1xyXG5cdGV4cGFuZEJ5VmVjdG9yKCB2ZWN0b3IgKSB7XHJcblxyXG5cdFx0dGhpcy5taW4uc3ViKCB2ZWN0b3IgKTtcclxuXHRcdHRoaXMubWF4LmFkZCggdmVjdG9yICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRXhwYW5kcyBlYWNoIGRpbWVuc2lvbiBvZiB0aGUgYm94IGJ5IHRoZSBnaXZlbiBzY2FsYXIuIElmIG5lZ2F0aXZlLCB0aGVcclxuXHQgKiBkaW1lbnNpb25zIG9mIHRoZSBib3ggd2lsbCBiZSBjb250cmFjdGVkLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHNjYWxhciAtIFRoZSBzY2FsYXIgdmFsdWUgdGhhdCBzaG91bGQgZXhwYW5kIHRoZSBib3VuZGluZyBib3guXHJcblx0ICogQHJldHVybiB7Qm94M30gQSByZWZlcmVuY2UgdG8gdGhpcyBib3VuZGluZyBib3guXHJcblx0ICovXHJcblx0ZXhwYW5kQnlTY2FsYXIoIHNjYWxhciApIHtcclxuXHJcblx0XHR0aGlzLm1pbi5hZGRTY2FsYXIoIC0gc2NhbGFyICk7XHJcblx0XHR0aGlzLm1heC5hZGRTY2FsYXIoIHNjYWxhciApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEV4cGFuZHMgdGhlIGJvdW5kYXJpZXMgb2YgdGhpcyBib3ggdG8gaW5jbHVkZSB0aGUgZ2l2ZW4gM0Qgb2JqZWN0IGFuZFxyXG5cdCAqIGl0cyBjaGlsZHJlbiwgYWNjb3VudGluZyBmb3IgdGhlIG9iamVjdCdzLCBhbmQgY2hpbGRyZW4ncywgd29ybGRcclxuXHQgKiB0cmFuc2Zvcm1zLiBUaGUgZnVuY3Rpb24gbWF5IHJlc3VsdCBpbiBhIGxhcmdlciBib3ggdGhhbiBzdHJpY3RseVxyXG5cdCAqIG5lY2Vzc2FyeSAodW5sZXNzIHRoZSBwcmVjaXNlIHBhcmFtZXRlciBpcyBzZXQgdG8gdHJ1ZSkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdDNEfSBvYmplY3QgLSBUaGUgM0Qgb2JqZWN0IHRoYXQgc2hvdWxkIGV4cGFuZCB0aGUgYm91bmRpbmcgYm94LlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gcHJlY2lzZSAtIElmIHNldCB0byBgdHJ1ZWAsIHRoZSBtZXRob2QgZXhwYW5kcyB0aGUgYm91bmRpbmcgYm94XHJcblx0ICogYXMgbGl0dGxlIGFzIG5lY2Vzc2FyeSBhdCB0aGUgZXhwZW5zZSBvZiBtb3JlIGNvbXB1dGF0aW9uLlxyXG5cdCAqIEByZXR1cm4ge0JveDN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgYm91bmRpbmcgYm94LlxyXG5cdCAqL1xyXG5cdGV4cGFuZEJ5T2JqZWN0KCBvYmplY3QsIHByZWNpc2UgPSBmYWxzZSApIHtcclxuXHJcblx0XHQvLyBDb21wdXRlcyB0aGUgd29ybGQtYXhpcy1hbGlnbmVkIGJvdW5kaW5nIGJveCBvZiBhbiBvYmplY3QgKGluY2x1ZGluZyBpdHMgY2hpbGRyZW4pLFxyXG5cdFx0Ly8gYWNjb3VudGluZyBmb3IgYm90aCB0aGUgb2JqZWN0J3MsIGFuZCBjaGlsZHJlbidzLCB3b3JsZCB0cmFuc2Zvcm1zXHJcblxyXG5cdFx0b2JqZWN0LnVwZGF0ZVdvcmxkTWF0cml4KCBmYWxzZSwgZmFsc2UgKTtcclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeSA9IG9iamVjdC5nZW9tZXRyeTtcclxuXHJcblx0XHRpZiAoIGdlb21ldHJ5ICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBwb3NpdGlvbkF0dHJpYnV0ZSA9IGdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJyApO1xyXG5cclxuXHRcdFx0Ly8gcHJlY2lzZSBBQUJCIGNvbXB1dGF0aW9uIGJhc2VkIG9uIHZlcnRleCBkYXRhIHJlcXVpcmVzIGF0IGxlYXN0IGEgcG9zaXRpb24gYXR0cmlidXRlLlxyXG5cdFx0XHQvLyBpbnN0YW5jaW5nIGlzbid0IHN1cHBvcnRlZCBzbyBmYXIgYW5kIHVzZXMgdGhlIG5vcm1hbCAoY29uc2VydmF0aXZlKSBjb2RlIHBhdGguXHJcblxyXG5cdFx0XHRpZiAoIHByZWNpc2UgPT09IHRydWUgJiYgcG9zaXRpb25BdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCAmJiBvYmplY3QuaXNJbnN0YW5jZWRNZXNoICE9PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBwb3NpdGlvbkF0dHJpYnV0ZS5jb3VudDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBvYmplY3QuaXNNZXNoID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0b2JqZWN0LmdldFZlcnRleFBvc2l0aW9uKCBpLCBfdmVjdG9yICk7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdF92ZWN0b3IuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyaWJ1dGUsIGkgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0X3ZlY3Rvci5hcHBseU1hdHJpeDQoIG9iamVjdC5tYXRyaXhXb3JsZCApO1xyXG5cdFx0XHRcdFx0dGhpcy5leHBhbmRCeVBvaW50KCBfdmVjdG9yICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGlmICggb2JqZWN0LmJvdW5kaW5nQm94ICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gb2JqZWN0LWxldmVsIGJvdW5kaW5nIGJveFxyXG5cclxuXHRcdFx0XHRcdGlmICggb2JqZWN0LmJvdW5kaW5nQm94ID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRcdFx0b2JqZWN0LmNvbXB1dGVCb3VuZGluZ0JveCgpO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRfYm94LmNvcHkoIG9iamVjdC5ib3VuZGluZ0JveCApO1xyXG5cclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHQvLyBnZW9tZXRyeS1sZXZlbCBib3VuZGluZyBib3hcclxuXHJcblx0XHRcdFx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nQm94ID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nQm94KCk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdF9ib3guY29weSggZ2VvbWV0cnkuYm91bmRpbmdCb3ggKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRfYm94LmFwcGx5TWF0cml4NCggb2JqZWN0Lm1hdHJpeFdvcmxkICk7XHJcblxyXG5cdFx0XHRcdHRoaXMudW5pb24oIF9ib3ggKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgY2hpbGRyZW4gPSBvYmplY3QuY2hpbGRyZW47XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdHRoaXMuZXhwYW5kQnlPYmplY3QoIGNoaWxkcmVuWyBpIF0sIHByZWNpc2UgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIHBvaW50IGxpZXMgd2l0aGluIG9yIG9uIHRoZSBib3VuZGFyaWVzIG9mIHRoaXMgYm94LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBwb2ludCAtIFRoZSBwb2ludCB0byB0ZXN0LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGJvdW5kaW5nIGJveCBjb250YWlucyB0aGUgZ2l2ZW4gcG9pbnQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGNvbnRhaW5zUG9pbnQoIHBvaW50ICkge1xyXG5cclxuXHRcdHJldHVybiBwb2ludC54ID49IHRoaXMubWluLnggJiYgcG9pbnQueCA8PSB0aGlzLm1heC54ICYmXHJcblx0XHRcdHBvaW50LnkgPj0gdGhpcy5taW4ueSAmJiBwb2ludC55IDw9IHRoaXMubWF4LnkgJiZcclxuXHRcdFx0cG9pbnQueiA+PSB0aGlzLm1pbi56ICYmIHBvaW50LnogPD0gdGhpcy5tYXguejtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIGJvdW5kaW5nIGJveCBpbmNsdWRlcyB0aGUgZW50aXJldHkgb2YgdGhlIGdpdmVuIGJvdW5kaW5nIGJveC5cclxuXHQgKiBJZiB0aGlzIGJveCBhbmQgdGhlIGdpdmVuIG9uZSBhcmUgaWRlbnRpY2FsLCB0aGlzIGZ1bmN0aW9uIGFsc28gcmV0dXJucyBgdHJ1ZWAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0JveDN9IGJveCAtIFRoZSBib3VuZGluZyBib3ggdG8gdGVzdC5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBib3VuZGluZyBib3ggY29udGFpbnMgdGhlIGdpdmVuIGJvdW5kaW5nIGJveCBvciBub3QuXHJcblx0ICovXHJcblx0Y29udGFpbnNCb3goIGJveCApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5taW4ueCA8PSBib3gubWluLnggJiYgYm94Lm1heC54IDw9IHRoaXMubWF4LnggJiZcclxuXHRcdFx0dGhpcy5taW4ueSA8PSBib3gubWluLnkgJiYgYm94Lm1heC55IDw9IHRoaXMubWF4LnkgJiZcclxuXHRcdFx0dGhpcy5taW4ueiA8PSBib3gubWluLnogJiYgYm94Lm1heC56IDw9IHRoaXMubWF4Lno7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIHBvaW50IGFzIGEgcHJvcG9ydGlvbiBvZiB0aGlzIGJveCdzIHdpZHRoLCBoZWlnaHQgYW5kIGRlcHRoLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBwb2ludCAtIEEgcG9pbnQgaW4gM0Qgc3BhY2UuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IHZlY3RvciB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGhvZCdzIHJlc3VsdC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHBvaW50IGFzIGEgcHJvcG9ydGlvbiBvZiB0aGlzIGJveCdzIHdpZHRoLCBoZWlnaHQgYW5kIGRlcHRoLlxyXG5cdCAqL1xyXG5cdGdldFBhcmFtZXRlciggcG9pbnQsIHRhcmdldCApIHtcclxuXHJcblx0XHQvLyBUaGlzIGNhbiBwb3RlbnRpYWxseSBoYXZlIGEgZGl2aWRlIGJ5IHplcm8gaWYgdGhlIGJveFxyXG5cdFx0Ly8gaGFzIGEgc2l6ZSBkaW1lbnNpb24gb2YgMC5cclxuXHJcblx0XHRyZXR1cm4gdGFyZ2V0LnNldChcclxuXHRcdFx0KCBwb2ludC54IC0gdGhpcy5taW4ueCApIC8gKCB0aGlzLm1heC54IC0gdGhpcy5taW4ueCApLFxyXG5cdFx0XHQoIHBvaW50LnkgLSB0aGlzLm1pbi55ICkgLyAoIHRoaXMubWF4LnkgLSB0aGlzLm1pbi55ICksXHJcblx0XHRcdCggcG9pbnQueiAtIHRoaXMubWluLnogKSAvICggdGhpcy5tYXgueiAtIHRoaXMubWluLnogKVxyXG5cdFx0KTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gYm91bmRpbmcgYm94IGludGVyc2VjdHMgd2l0aCB0aGlzIGJvdW5kaW5nIGJveC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Qm94M30gYm94IC0gVGhlIGJvdW5kaW5nIGJveCB0byB0ZXN0LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGdpdmVuIGJvdW5kaW5nIGJveCBpbnRlcnNlY3RzIHdpdGggdGhpcyBib3VuZGluZyBib3guXHJcblx0ICovXHJcblx0aW50ZXJzZWN0c0JveCggYm94ICkge1xyXG5cclxuXHRcdC8vIHVzaW5nIDYgc3BsaXR0aW5nIHBsYW5lcyB0byBydWxlIG91dCBpbnRlcnNlY3Rpb25zLlxyXG5cdFx0cmV0dXJuIGJveC5tYXgueCA+PSB0aGlzLm1pbi54ICYmIGJveC5taW4ueCA8PSB0aGlzLm1heC54ICYmXHJcblx0XHRcdGJveC5tYXgueSA+PSB0aGlzLm1pbi55ICYmIGJveC5taW4ueSA8PSB0aGlzLm1heC55ICYmXHJcblx0XHRcdGJveC5tYXgueiA+PSB0aGlzLm1pbi56ICYmIGJveC5taW4ueiA8PSB0aGlzLm1heC56O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBnaXZlbiBib3VuZGluZyBzcGhlcmUgaW50ZXJzZWN0cyB3aXRoIHRoaXMgYm91bmRpbmcgYm94LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTcGhlcmV9IHNwaGVyZSAtIFRoZSBib3VuZGluZyBzcGhlcmUgdG8gdGVzdC5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBnaXZlbiBib3VuZGluZyBzcGhlcmUgaW50ZXJzZWN0cyB3aXRoIHRoaXMgYm91bmRpbmcgYm94LlxyXG5cdCAqL1xyXG5cdGludGVyc2VjdHNTcGhlcmUoIHNwaGVyZSApIHtcclxuXHJcblx0XHQvLyBGaW5kIHRoZSBwb2ludCBvbiB0aGUgQUFCQiBjbG9zZXN0IHRvIHRoZSBzcGhlcmUgY2VudGVyLlxyXG5cdFx0dGhpcy5jbGFtcFBvaW50KCBzcGhlcmUuY2VudGVyLCBfdmVjdG9yICk7XHJcblxyXG5cdFx0Ly8gSWYgdGhhdCBwb2ludCBpcyBpbnNpZGUgdGhlIHNwaGVyZSwgdGhlIEFBQkIgYW5kIHNwaGVyZSBpbnRlcnNlY3QuXHJcblx0XHRyZXR1cm4gX3ZlY3Rvci5kaXN0YW5jZVRvU3F1YXJlZCggc3BoZXJlLmNlbnRlciApIDw9ICggc3BoZXJlLnJhZGl1cyAqIHNwaGVyZS5yYWRpdXMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gcGxhbmUgaW50ZXJzZWN0cyB3aXRoIHRoaXMgYm91bmRpbmcgYm94LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtQbGFuZX0gcGxhbmUgLSBUaGUgcGxhbmUgdG8gdGVzdC5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBnaXZlbiBwbGFuZSBpbnRlcnNlY3RzIHdpdGggdGhpcyBib3VuZGluZyBib3guXHJcblx0ICovXHJcblx0aW50ZXJzZWN0c1BsYW5lKCBwbGFuZSApIHtcclxuXHJcblx0XHQvLyBXZSBjb21wdXRlIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIGRvdCBwcm9kdWN0IHZhbHVlcy4gSWYgdGhvc2UgdmFsdWVzXHJcblx0XHQvLyBhcmUgb24gdGhlIHNhbWUgc2lkZSAoYmFjayBvciBmcm9udCkgb2YgdGhlIHBsYW5lLCB0aGVuIHRoZXJlIGlzIG5vIGludGVyc2VjdGlvbi5cclxuXHJcblx0XHRsZXQgbWluLCBtYXg7XHJcblxyXG5cdFx0aWYgKCBwbGFuZS5ub3JtYWwueCA+IDAgKSB7XHJcblxyXG5cdFx0XHRtaW4gPSBwbGFuZS5ub3JtYWwueCAqIHRoaXMubWluLng7XHJcblx0XHRcdG1heCA9IHBsYW5lLm5vcm1hbC54ICogdGhpcy5tYXgueDtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0bWluID0gcGxhbmUubm9ybWFsLnggKiB0aGlzLm1heC54O1xyXG5cdFx0XHRtYXggPSBwbGFuZS5ub3JtYWwueCAqIHRoaXMubWluLng7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggcGxhbmUubm9ybWFsLnkgPiAwICkge1xyXG5cclxuXHRcdFx0bWluICs9IHBsYW5lLm5vcm1hbC55ICogdGhpcy5taW4ueTtcclxuXHRcdFx0bWF4ICs9IHBsYW5lLm5vcm1hbC55ICogdGhpcy5tYXgueTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0bWluICs9IHBsYW5lLm5vcm1hbC55ICogdGhpcy5tYXgueTtcclxuXHRcdFx0bWF4ICs9IHBsYW5lLm5vcm1hbC55ICogdGhpcy5taW4ueTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBwbGFuZS5ub3JtYWwueiA+IDAgKSB7XHJcblxyXG5cdFx0XHRtaW4gKz0gcGxhbmUubm9ybWFsLnogKiB0aGlzLm1pbi56O1xyXG5cdFx0XHRtYXggKz0gcGxhbmUubm9ybWFsLnogKiB0aGlzLm1heC56O1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRtaW4gKz0gcGxhbmUubm9ybWFsLnogKiB0aGlzLm1heC56O1xyXG5cdFx0XHRtYXggKz0gcGxhbmUubm9ybWFsLnogKiB0aGlzLm1pbi56O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gKCBtaW4gPD0gLSBwbGFuZS5jb25zdGFudCAmJiBtYXggPj0gLSBwbGFuZS5jb25zdGFudCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBnaXZlbiB0cmlhbmdsZSBpbnRlcnNlY3RzIHdpdGggdGhpcyBib3VuZGluZyBib3guXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RyaWFuZ2xlfSB0cmlhbmdsZSAtIFRoZSB0cmlhbmdsZSB0byB0ZXN0LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGdpdmVuIHRyaWFuZ2xlIGludGVyc2VjdHMgd2l0aCB0aGlzIGJvdW5kaW5nIGJveC5cclxuXHQgKi9cclxuXHRpbnRlcnNlY3RzVHJpYW5nbGUoIHRyaWFuZ2xlICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5pc0VtcHR5KCkgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGNvbXB1dGUgYm94IGNlbnRlciBhbmQgZXh0ZW50c1xyXG5cdFx0dGhpcy5nZXRDZW50ZXIoIF9jZW50ZXIgKTtcclxuXHRcdF9leHRlbnRzLnN1YlZlY3RvcnMoIHRoaXMubWF4LCBfY2VudGVyICk7XHJcblxyXG5cdFx0Ly8gdHJhbnNsYXRlIHRyaWFuZ2xlIHRvIGFhYmIgb3JpZ2luXHJcblx0XHRfdjAuc3ViVmVjdG9ycyggdHJpYW5nbGUuYSwgX2NlbnRlciApO1xyXG5cdFx0X3YxLnN1YlZlY3RvcnMoIHRyaWFuZ2xlLmIsIF9jZW50ZXIgKTtcclxuXHRcdF92Mi5zdWJWZWN0b3JzKCB0cmlhbmdsZS5jLCBfY2VudGVyICk7XHJcblxyXG5cdFx0Ly8gY29tcHV0ZSBlZGdlIHZlY3RvcnMgZm9yIHRyaWFuZ2xlXHJcblx0XHRfZjAuc3ViVmVjdG9ycyggX3YxLCBfdjAgKTtcclxuXHRcdF9mMS5zdWJWZWN0b3JzKCBfdjIsIF92MSApO1xyXG5cdFx0X2YyLnN1YlZlY3RvcnMoIF92MCwgX3YyICk7XHJcblxyXG5cdFx0Ly8gdGVzdCBhZ2FpbnN0IGF4ZXMgdGhhdCBhcmUgZ2l2ZW4gYnkgY3Jvc3MgcHJvZHVjdCBjb21iaW5hdGlvbnMgb2YgdGhlIGVkZ2VzIG9mIHRoZSB0cmlhbmdsZSBhbmQgdGhlIGVkZ2VzIG9mIHRoZSBhYWJiXHJcblx0XHQvLyBtYWtlIGFuIGF4aXMgdGVzdGluZyBvZiBlYWNoIG9mIHRoZSAzIHNpZGVzIG9mIHRoZSBhYWJiIGFnYWluc3QgZWFjaCBvZiB0aGUgMyBzaWRlcyBvZiB0aGUgdHJpYW5nbGUgPSA5IGF4aXMgb2Ygc2VwYXJhdGlvblxyXG5cdFx0Ly8gYXhpc19paiA9IHVfaSB4IGZfaiAodTAsIHUxLCB1MiA9IGZhY2Ugbm9ybWFscyBvZiBhYWJiID0geCx5LHogYXhlcyB2ZWN0b3JzIHNpbmNlIGFhYmIgaXMgYXhpcyBhbGlnbmVkKVxyXG5cdFx0bGV0IGF4ZXMgPSBbXHJcblx0XHRcdDAsIC0gX2YwLnosIF9mMC55LCAwLCAtIF9mMS56LCBfZjEueSwgMCwgLSBfZjIueiwgX2YyLnksXHJcblx0XHRcdF9mMC56LCAwLCAtIF9mMC54LCBfZjEueiwgMCwgLSBfZjEueCwgX2YyLnosIDAsIC0gX2YyLngsXHJcblx0XHRcdC0gX2YwLnksIF9mMC54LCAwLCAtIF9mMS55LCBfZjEueCwgMCwgLSBfZjIueSwgX2YyLngsIDBcclxuXHRcdF07XHJcblx0XHRpZiAoICEgc2F0Rm9yQXhlcyggYXhlcywgX3YwLCBfdjEsIF92MiwgX2V4dGVudHMgKSApIHtcclxuXHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gdGVzdCAzIGZhY2Ugbm9ybWFscyBmcm9tIHRoZSBhYWJiXHJcblx0XHRheGVzID0gWyAxLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAxIF07XHJcblx0XHRpZiAoICEgc2F0Rm9yQXhlcyggYXhlcywgX3YwLCBfdjEsIF92MiwgX2V4dGVudHMgKSApIHtcclxuXHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gZmluYWxseSB0ZXN0aW5nIHRoZSBmYWNlIG5vcm1hbCBvZiB0aGUgdHJpYW5nbGVcclxuXHRcdC8vIHVzZSBhbHJlYWR5IGV4aXN0aW5nIHRyaWFuZ2xlIGVkZ2UgdmVjdG9ycyBoZXJlXHJcblx0XHRfdHJpYW5nbGVOb3JtYWwuY3Jvc3NWZWN0b3JzKCBfZjAsIF9mMSApO1xyXG5cdFx0YXhlcyA9IFsgX3RyaWFuZ2xlTm9ybWFsLngsIF90cmlhbmdsZU5vcm1hbC55LCBfdHJpYW5nbGVOb3JtYWwueiBdO1xyXG5cclxuXHRcdHJldHVybiBzYXRGb3JBeGVzKCBheGVzLCBfdjAsIF92MSwgX3YyLCBfZXh0ZW50cyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENsYW1wcyB0aGUgZ2l2ZW4gcG9pbnQgd2l0aGluIHRoZSBib3VuZHMgb2YgdGhpcyBib3guXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHBvaW50IC0gVGhlIHBvaW50IHRvIGNsYW1wLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdGFyZ2V0IC0gVGhlIHRhcmdldCB2ZWN0b3IgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBtZXRob2QncyByZXN1bHQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gVGhlIGNsYW1wZWQgcG9pbnQuXHJcblx0ICovXHJcblx0Y2xhbXBQb2ludCggcG9pbnQsIHRhcmdldCApIHtcclxuXHJcblx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIHBvaW50ICkuY2xhbXAoIHRoaXMubWluLCB0aGlzLm1heCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGV1Y2xpZGVhbiBkaXN0YW5jZSBmcm9tIGFueSBlZGdlIG9mIHRoaXMgYm94IHRvIHRoZSBzcGVjaWZpZWQgcG9pbnQuIElmXHJcblx0ICogdGhlIGdpdmVuIHBvaW50IGxpZXMgaW5zaWRlIG9mIHRoaXMgYm94LCB0aGUgZGlzdGFuY2Ugd2lsbCBiZSBgMGAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHBvaW50IC0gVGhlIHBvaW50IHRvIGNvbXB1dGUgdGhlIGRpc3RhbmNlIHRvLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGV1Y2xpZGVhbiBkaXN0YW5jZS5cclxuXHQgKi9cclxuXHRkaXN0YW5jZVRvUG9pbnQoIHBvaW50ICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmNsYW1wUG9pbnQoIHBvaW50LCBfdmVjdG9yICkuZGlzdGFuY2VUbyggcG9pbnQgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgYm91bmRpbmcgc3BoZXJlIHRoYXQgZW5jbG9zZXMgdGhpcyBib3VuZGluZyBib3guXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1NwaGVyZX0gdGFyZ2V0IC0gVGhlIHRhcmdldCBzcGhlcmUgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBtZXRob2QncyByZXN1bHQuXHJcblx0ICogQHJldHVybiB7U3BoZXJlfSBUaGUgYm91bmRpbmcgc3BoZXJlIHRoYXQgZW5jbG9zZXMgdGhpcyBib3VuZGluZyBib3guXHJcblx0ICovXHJcblx0Z2V0Qm91bmRpbmdTcGhlcmUoIHRhcmdldCApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuaXNFbXB0eSgpICkge1xyXG5cclxuXHRcdFx0dGFyZ2V0Lm1ha2VFbXB0eSgpO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR0aGlzLmdldENlbnRlciggdGFyZ2V0LmNlbnRlciApO1xyXG5cclxuXHRcdFx0dGFyZ2V0LnJhZGl1cyA9IHRoaXMuZ2V0U2l6ZSggX3ZlY3RvciApLmxlbmd0aCgpICogMC41O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGFyZ2V0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhpcyBib3VuZGluZyBib3ggYW5kIHRoZSBnaXZlbiBvbmUsIHNldHRpbmcgdGhlIHVwcGVyXHJcblx0ICogYm91bmQgb2YgdGhpcyBib3ggdG8gdGhlIGxlc3NlciBvZiB0aGUgdHdvIGJveGVzJyB1cHBlciBib3VuZHMgYW5kIHRoZVxyXG5cdCAqIGxvd2VyIGJvdW5kIG9mIHRoaXMgYm94IHRvIHRoZSBncmVhdGVyIG9mIHRoZSB0d28gYm94ZXMnIGxvd2VyIGJvdW5kcy4gSWZcclxuXHQgKiB0aGVyZSdzIG5vIG92ZXJsYXAsIG1ha2VzIHRoaXMgYm94IGVtcHR5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCb3gzfSBib3ggLSBUaGUgYm91bmRpbmcgYm94IHRvIGludGVyc2VjdCB3aXRoLlxyXG5cdCAqIEByZXR1cm4ge0JveDN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgYm91bmRpbmcgYm94LlxyXG5cdCAqL1xyXG5cdGludGVyc2VjdCggYm94ICkge1xyXG5cclxuXHRcdHRoaXMubWluLm1heCggYm94Lm1pbiApO1xyXG5cdFx0dGhpcy5tYXgubWluKCBib3gubWF4ICk7XHJcblxyXG5cdFx0Ly8gZW5zdXJlIHRoYXQgaWYgdGhlcmUgaXMgbm8gb3ZlcmxhcCwgdGhlIHJlc3VsdCBpcyBmdWxseSBlbXB0eSwgbm90IHNsaWdodGx5IGVtcHR5IHdpdGggbm9uLWluZi8raW5mIHZhbHVlcyB0aGF0IHdpbGwgY2F1c2Ugc3Vic2VxdWVuY2UgaW50ZXJzZWN0cyB0byBlcnJvbmVvdXNseSByZXR1cm4gdmFsaWQgdmFsdWVzLlxyXG5cdFx0aWYgKCB0aGlzLmlzRW1wdHkoKSApIHRoaXMubWFrZUVtcHR5KCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgdGhlIHVuaW9uIG9mIHRoaXMgYm94IGFuZCBhbm90aGVyIGFuZCB0aGUgZ2l2ZW4gb25lLCBzZXR0aW5nIHRoZSB1cHBlclxyXG5cdCAqIGJvdW5kIG9mIHRoaXMgYm94IHRvIHRoZSBncmVhdGVyIG9mIHRoZSB0d28gYm94ZXMnIHVwcGVyIGJvdW5kcyBhbmQgdGhlXHJcblx0ICogbG93ZXIgYm91bmQgb2YgdGhpcyBib3ggdG8gdGhlIGxlc3NlciBvZiB0aGUgdHdvIGJveGVzJyBsb3dlciBib3VuZHMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0JveDN9IGJveCAtIFRoZSBib3VuZGluZyBib3ggdGhhdCB3aWxsIGJlIHVuaW9uZWQgd2l0aCB0aGlzIGluc3RhbmNlLlxyXG5cdCAqIEByZXR1cm4ge0JveDN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgYm91bmRpbmcgYm94LlxyXG5cdCAqL1xyXG5cdHVuaW9uKCBib3ggKSB7XHJcblxyXG5cdFx0dGhpcy5taW4ubWluKCBib3gubWluICk7XHJcblx0XHR0aGlzLm1heC5tYXgoIGJveC5tYXggKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUcmFuc2Zvcm1zIHRoaXMgYm91bmRpbmcgYm94IGJ5IHRoZSBnaXZlbiA0eDQgdHJhbnNmb3JtYXRpb24gbWF0cml4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRyaXg0fSBtYXRyaXggLSBUaGUgdHJhbnNmb3JtYXRpb24gbWF0cml4LlxyXG5cdCAqIEByZXR1cm4ge0JveDN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgYm91bmRpbmcgYm94LlxyXG5cdCAqL1xyXG5cdGFwcGx5TWF0cml4NCggbWF0cml4ICkge1xyXG5cclxuXHRcdC8vIHRyYW5zZm9ybSBvZiBlbXB0eSBib3ggaXMgYW4gZW1wdHkgYm94LlxyXG5cdFx0aWYgKCB0aGlzLmlzRW1wdHkoKSApIHJldHVybiB0aGlzO1xyXG5cclxuXHRcdC8vIE5PVEU6IEkgYW0gdXNpbmcgYSBiaW5hcnkgcGF0dGVybiB0byBzcGVjaWZ5IGFsbCAyXjMgY29tYmluYXRpb25zIGJlbG93XHJcblx0XHRfcG9pbnRzWyAwIF0uc2V0KCB0aGlzLm1pbi54LCB0aGlzLm1pbi55LCB0aGlzLm1pbi56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsgLy8gMDAwXHJcblx0XHRfcG9pbnRzWyAxIF0uc2V0KCB0aGlzLm1pbi54LCB0aGlzLm1pbi55LCB0aGlzLm1heC56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsgLy8gMDAxXHJcblx0XHRfcG9pbnRzWyAyIF0uc2V0KCB0aGlzLm1pbi54LCB0aGlzLm1heC55LCB0aGlzLm1pbi56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsgLy8gMDEwXHJcblx0XHRfcG9pbnRzWyAzIF0uc2V0KCB0aGlzLm1pbi54LCB0aGlzLm1heC55LCB0aGlzLm1heC56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsgLy8gMDExXHJcblx0XHRfcG9pbnRzWyA0IF0uc2V0KCB0aGlzLm1heC54LCB0aGlzLm1pbi55LCB0aGlzLm1pbi56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsgLy8gMTAwXHJcblx0XHRfcG9pbnRzWyA1IF0uc2V0KCB0aGlzLm1heC54LCB0aGlzLm1pbi55LCB0aGlzLm1heC56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsgLy8gMTAxXHJcblx0XHRfcG9pbnRzWyA2IF0uc2V0KCB0aGlzLm1heC54LCB0aGlzLm1heC55LCB0aGlzLm1pbi56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsgLy8gMTEwXHJcblx0XHRfcG9pbnRzWyA3IF0uc2V0KCB0aGlzLm1heC54LCB0aGlzLm1heC55LCB0aGlzLm1heC56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsgLy8gMTExXHJcblxyXG5cdFx0dGhpcy5zZXRGcm9tUG9pbnRzKCBfcG9pbnRzICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyB0aGUgZ2l2ZW4gb2Zmc2V0IHRvIGJvdGggdGhlIHVwcGVyIGFuZCBsb3dlciBib3VuZHMgb2YgdGhpcyBib3VuZGluZyBib3gsXHJcblx0ICogZWZmZWN0aXZlbHkgbW92aW5nIGl0IGluIDNEIHNwYWNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBvZmZzZXQgLSBUaGUgb2Zmc2V0IHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gdHJhbnNsYXRlIHRoZSBib3VuZGluZyBib3guXHJcblx0ICogQHJldHVybiB7Qm94M30gQSByZWZlcmVuY2UgdG8gdGhpcyBib3VuZGluZyBib3guXHJcblx0ICovXHJcblx0dHJhbnNsYXRlKCBvZmZzZXQgKSB7XHJcblxyXG5cdFx0dGhpcy5taW4uYWRkKCBvZmZzZXQgKTtcclxuXHRcdHRoaXMubWF4LmFkZCggb2Zmc2V0ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBib3VuZGluZyBib3ggaXMgZXF1YWwgd2l0aCB0aGUgZ2l2ZW4gb25lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCb3gzfSBib3ggLSBUaGUgYm94IHRvIHRlc3QgZm9yIGVxdWFsaXR5LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyBib3VuZGluZyBib3ggaXMgZXF1YWwgd2l0aCB0aGUgZ2l2ZW4gb25lLlxyXG5cdCAqL1xyXG5cdGVxdWFscyggYm94ICkge1xyXG5cclxuXHRcdHJldHVybiBib3gubWluLmVxdWFscyggdGhpcy5taW4gKSAmJiBib3gubWF4LmVxdWFscyggdGhpcy5tYXggKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuY29uc3QgX3BvaW50cyA9IFtcclxuXHQvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCksXHJcblx0LypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpLFxyXG5cdC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKSxcclxuXHQvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCksXHJcblx0LypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpLFxyXG5cdC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKSxcclxuXHQvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCksXHJcblx0LypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpXHJcbl07XHJcblxyXG5jb25zdCBfdmVjdG9yID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5cclxuY29uc3QgX2JveCA9IC8qQF9fUFVSRV9fKi8gbmV3IEJveDMoKTtcclxuXHJcbi8vIHRyaWFuZ2xlIGNlbnRlcmVkIHZlcnRpY2VzXHJcblxyXG5jb25zdCBfdjAgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF92MSA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX3YyID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5cclxuLy8gdHJpYW5nbGUgZWRnZSB2ZWN0b3JzXHJcblxyXG5jb25zdCBfZjAgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF9mMSA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX2YyID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5cclxuY29uc3QgX2NlbnRlciA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX2V4dGVudHMgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF90cmlhbmdsZU5vcm1hbCA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX3Rlc3RBeGlzID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5cclxuZnVuY3Rpb24gc2F0Rm9yQXhlcyggYXhlcywgdjAsIHYxLCB2MiwgZXh0ZW50cyApIHtcclxuXHJcblx0Zm9yICggbGV0IGkgPSAwLCBqID0gYXhlcy5sZW5ndGggLSAzOyBpIDw9IGo7IGkgKz0gMyApIHtcclxuXHJcblx0XHRfdGVzdEF4aXMuZnJvbUFycmF5KCBheGVzLCBpICk7XHJcblx0XHQvLyBwcm9qZWN0IHRoZSBhYWJiIG9udG8gdGhlIHNlcGFyYXRpbmcgYXhpc1xyXG5cdFx0Y29uc3QgciA9IGV4dGVudHMueCAqIE1hdGguYWJzKCBfdGVzdEF4aXMueCApICsgZXh0ZW50cy55ICogTWF0aC5hYnMoIF90ZXN0QXhpcy55ICkgKyBleHRlbnRzLnogKiBNYXRoLmFicyggX3Rlc3RBeGlzLnogKTtcclxuXHRcdC8vIHByb2plY3QgYWxsIDMgdmVydGljZXMgb2YgdGhlIHRyaWFuZ2xlIG9udG8gdGhlIHNlcGFyYXRpbmcgYXhpc1xyXG5cdFx0Y29uc3QgcDAgPSB2MC5kb3QoIF90ZXN0QXhpcyApO1xyXG5cdFx0Y29uc3QgcDEgPSB2MS5kb3QoIF90ZXN0QXhpcyApO1xyXG5cdFx0Y29uc3QgcDIgPSB2Mi5kb3QoIF90ZXN0QXhpcyApO1xyXG5cdFx0Ly8gYWN0dWFsIHRlc3QsIGJhc2ljYWxseSBzZWUgaWYgZWl0aGVyIG9mIHRoZSBtb3N0IGV4dHJlbWUgb2YgdGhlIHRyaWFuZ2xlIHBvaW50cyBpbnRlcnNlY3RzIHJcclxuXHRcdGlmICggTWF0aC5tYXgoIC0gTWF0aC5tYXgoIHAwLCBwMSwgcDIgKSwgTWF0aC5taW4oIHAwLCBwMSwgcDIgKSApID4gciApIHtcclxuXHJcblx0XHRcdC8vIHBvaW50cyBvZiB0aGUgcHJvamVjdGVkIHRyaWFuZ2xlIGFyZSBvdXRzaWRlIHRoZSBwcm9qZWN0ZWQgaGFsZi1sZW5ndGggb2YgdGhlIGFhYmJcclxuXHRcdFx0Ly8gdGhlIGF4aXMgaXMgc2VwYXJhdGluZyBhbmQgd2UgY2FuIGV4aXRcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gdHJ1ZTtcclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IEJveDMgfTtcclxuIiwiaW1wb3J0IHsgQm94MyB9IGZyb20gJy4vQm94My5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuL1ZlY3RvcjMuanMnO1xyXG5cclxuY29uc3QgX2JveCA9IC8qQF9fUFVSRV9fKi8gbmV3IEJveDMoKTtcclxuY29uc3QgX3YxID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfdjIgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcblxyXG4vKipcclxuICogQW4gYW5hbHl0aWNhbCAzRCBzcGhlcmUgZGVmaW5lZCBieSBhIGNlbnRlciBhbmQgcmFkaXVzLiBUaGlzIGNsYXNzIGlzIG1haW5seVxyXG4gKiB1c2VkIGFzIGEgQm91bmRpbmcgU3BoZXJlIGZvciAzRCBvYmplY3RzLlxyXG4gKi9cclxuY2xhc3MgU3BoZXJlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBzcGhlcmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IFtjZW50ZXI9KDAsMCwwKV0gLSBUaGUgY2VudGVyIG9mIHRoZSBzcGhlcmVcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3JhZGl1cz0tMV0gLSBUaGUgcmFkaXVzIG9mIHRoZSBzcGhlcmUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGNlbnRlciA9IG5ldyBWZWN0b3IzKCksIHJhZGl1cyA9IC0gMSApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNTcGhlcmUgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNlbnRlciBvZiB0aGUgc3BoZXJlXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjN9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2VudGVyID0gY2VudGVyO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJhZGl1cyBvZiB0aGUgc3BoZXJlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmFkaXVzID0gcmFkaXVzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHNwaGVyZSdzIGNvbXBvbmVudHMgYnkgY29weWluZyB0aGUgZ2l2ZW4gdmFsdWVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBjZW50ZXIgLSBUaGUgY2VudGVyLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSByYWRpdXMgLSBUaGUgcmFkaXVzLlxyXG5cdCAqIEByZXR1cm4ge1NwaGVyZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBzcGhlcmUuXHJcblx0ICovXHJcblx0c2V0KCBjZW50ZXIsIHJhZGl1cyApIHtcclxuXHJcblx0XHR0aGlzLmNlbnRlci5jb3B5KCBjZW50ZXIgKTtcclxuXHRcdHRoaXMucmFkaXVzID0gcmFkaXVzO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSBtaW5pbXVtIGJvdW5kaW5nIHNwaGVyZSBmb3IgbGlzdCBvZiBwb2ludHMuXHJcblx0ICogSWYgdGhlIG9wdGlvbmFsIGNlbnRlciBwb2ludCBpcyBnaXZlbiwgaXQgaXMgdXNlZCBhcyB0aGUgc3BoZXJlJ3NcclxuXHQgKiBjZW50ZXIuIE90aGVyd2lzZSwgdGhlIGNlbnRlciBvZiB0aGUgYXhpcy1hbGlnbmVkIGJvdW5kaW5nIGJveFxyXG5cdCAqIGVuY29tcGFzc2luZyB0aGUgcG9pbnRzIGlzIGNhbGN1bGF0ZWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PFZlY3RvcjM+fSBwb2ludHMgLSBBIGxpc3Qgb2YgcG9pbnRzIGluIDNEIHNwYWNlLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gW29wdGlvbmFsQ2VudGVyXSAtIFRoZSBjZW50ZXIgb2YgdGhlIHNwaGVyZS5cclxuXHQgKiBAcmV0dXJuIHtTcGhlcmV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgc3BoZXJlLlxyXG5cdCAqL1xyXG5cdHNldEZyb21Qb2ludHMoIHBvaW50cywgb3B0aW9uYWxDZW50ZXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgY2VudGVyID0gdGhpcy5jZW50ZXI7XHJcblxyXG5cdFx0aWYgKCBvcHRpb25hbENlbnRlciAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Y2VudGVyLmNvcHkoIG9wdGlvbmFsQ2VudGVyICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdF9ib3guc2V0RnJvbVBvaW50cyggcG9pbnRzICkuZ2V0Q2VudGVyKCBjZW50ZXIgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0bGV0IG1heFJhZGl1c1NxID0gMDtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gcG9pbnRzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdFx0bWF4UmFkaXVzU3EgPSBNYXRoLm1heCggbWF4UmFkaXVzU3EsIGNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZCggcG9pbnRzWyBpIF0gKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnJhZGl1cyA9IE1hdGguc3FydCggbWF4UmFkaXVzU3EgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gc3BoZXJlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1NwaGVyZX0gc3BoZXJlIC0gVGhlIHNwaGVyZSB0byBjb3B5LlxyXG5cdCAqIEByZXR1cm4ge1NwaGVyZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBzcGhlcmUuXHJcblx0ICovXHJcblx0Y29weSggc3BoZXJlICkge1xyXG5cclxuXHRcdHRoaXMuY2VudGVyLmNvcHkoIHNwaGVyZS5jZW50ZXIgKTtcclxuXHRcdHRoaXMucmFkaXVzID0gc3BoZXJlLnJhZGl1cztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgc3BoZXJlIGlzIGVtcHR5ICh0aGUgcmFkaXVzIHNldCB0byBhIG5lZ2F0aXZlIG51bWJlcikuXHJcblx0ICpcclxuXHQgKiBTcGhlcmVzIHdpdGggYSByYWRpdXMgb2YgYDBgIGNvbnRhaW4gb25seSB0aGVpciBjZW50ZXIgcG9pbnQgYW5kIGFyZSBub3RcclxuXHQgKiBjb25zaWRlcmVkIHRvIGJlIGVtcHR5LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGlzIHNwaGVyZSBpcyBlbXB0eSBvciBub3QuXHJcblx0ICovXHJcblx0aXNFbXB0eSgpIHtcclxuXHJcblx0XHRyZXR1cm4gKCB0aGlzLnJhZGl1cyA8IDAgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBNYWtlcyB0aGlzIHNwaGVyZSBlbXB0eSB3aGljaCBtZWFucyBpbiBlbmNsb3NlcyBhIHplcm8gc3BhY2UgaW4gM0QuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtTcGhlcmV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgc3BoZXJlLlxyXG5cdCAqL1xyXG5cdG1ha2VFbXB0eSgpIHtcclxuXHJcblx0XHR0aGlzLmNlbnRlci5zZXQoIDAsIDAsIDAgKTtcclxuXHRcdHRoaXMucmFkaXVzID0gLSAxO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgc3BoZXJlIGNvbnRhaW5zIHRoZSBnaXZlbiBwb2ludCBpbmNsdXNpdmUgb2ZcclxuXHQgKiB0aGUgc3VyZmFjZSBvZiB0aGUgc3BoZXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBwb2ludCAtIFRoZSBwb2ludCB0byBjaGVjay5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoaXMgc3BoZXJlIGNvbnRhaW5zIHRoZSBnaXZlbiBwb2ludCBvciBub3QuXHJcblx0ICovXHJcblx0Y29udGFpbnNQb2ludCggcG9pbnQgKSB7XHJcblxyXG5cdFx0cmV0dXJuICggcG9pbnQuZGlzdGFuY2VUb1NxdWFyZWQoIHRoaXMuY2VudGVyICkgPD0gKCB0aGlzLnJhZGl1cyAqIHRoaXMucmFkaXVzICkgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBjbG9zZXN0IGRpc3RhbmNlIGZyb20gdGhlIGJvdW5kYXJ5IG9mIHRoZSBzcGhlcmUgdG8gdGhlXHJcblx0ICogZ2l2ZW4gcG9pbnQuIElmIHRoZSBzcGhlcmUgY29udGFpbnMgdGhlIHBvaW50LCB0aGUgZGlzdGFuY2Ugd2lsbFxyXG5cdCAqIGJlIG5lZ2F0aXZlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBwb2ludCAtIFRoZSBwb2ludCB0byBjb21wdXRlIHRoZSBkaXN0YW5jZSB0by5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBkaXN0YW5jZSB0byB0aGUgcG9pbnQuXHJcblx0ICovXHJcblx0ZGlzdGFuY2VUb1BvaW50KCBwb2ludCApIHtcclxuXHJcblx0XHRyZXR1cm4gKCBwb2ludC5kaXN0YW5jZVRvKCB0aGlzLmNlbnRlciApIC0gdGhpcy5yYWRpdXMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIHNwaGVyZSBpbnRlcnNlY3RzIHdpdGggdGhlIGdpdmVuIG9uZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7U3BoZXJlfSBzcGhlcmUgLSBUaGUgc3BoZXJlIHRvIHRlc3QuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGlzIHNwaGVyZSBpbnRlcnNlY3RzIHdpdGggdGhlIGdpdmVuIG9uZSBvciBub3QuXHJcblx0ICovXHJcblx0aW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICkge1xyXG5cclxuXHRcdGNvbnN0IHJhZGl1c1N1bSA9IHRoaXMucmFkaXVzICsgc3BoZXJlLnJhZGl1cztcclxuXHJcblx0XHRyZXR1cm4gc3BoZXJlLmNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZCggdGhpcy5jZW50ZXIgKSA8PSAoIHJhZGl1c1N1bSAqIHJhZGl1c1N1bSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgc3BoZXJlIGludGVyc2VjdHMgd2l0aCB0aGUgZ2l2ZW4gYm94LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCb3gzfSBib3ggLSBUaGUgYm94IHRvIHRlc3QuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGlzIHNwaGVyZSBpbnRlcnNlY3RzIHdpdGggdGhlIGdpdmVuIGJveCBvciBub3QuXHJcblx0ICovXHJcblx0aW50ZXJzZWN0c0JveCggYm94ICkge1xyXG5cclxuXHRcdHJldHVybiBib3guaW50ZXJzZWN0c1NwaGVyZSggdGhpcyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgc3BoZXJlIGludGVyc2VjdHMgd2l0aCB0aGUgZ2l2ZW4gcGxhbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1BsYW5lfSBwbGFuZSAtIFRoZSBwbGFuZSB0byB0ZXN0LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyBzcGhlcmUgaW50ZXJzZWN0cyB3aXRoIHRoZSBnaXZlbiBwbGFuZSBvciBub3QuXHJcblx0ICovXHJcblx0aW50ZXJzZWN0c1BsYW5lKCBwbGFuZSApIHtcclxuXHJcblx0XHRyZXR1cm4gTWF0aC5hYnMoIHBsYW5lLmRpc3RhbmNlVG9Qb2ludCggdGhpcy5jZW50ZXIgKSApIDw9IHRoaXMucmFkaXVzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENsYW1wcyBhIHBvaW50IHdpdGhpbiB0aGUgc3BoZXJlLiBJZiB0aGUgcG9pbnQgaXMgb3V0c2lkZSB0aGUgc3BoZXJlLCBpdFxyXG5cdCAqIHdpbGwgY2xhbXAgaXQgdG8gdGhlIGNsb3Nlc3QgcG9pbnQgb24gdGhlIGVkZ2Ugb2YgdGhlIHNwaGVyZS4gUG9pbnRzXHJcblx0ICogYWxyZWFkeSBpbnNpZGUgdGhlIHNwaGVyZSB3aWxsIG5vdCBiZSBhZmZlY3RlZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gcG9pbnQgLSBUaGUgcGxhbmUgdG8gY2xhbXAuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IHZlY3RvciB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGhvZCdzIHJlc3VsdC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBUaGUgY2xhbXBlZCBwb2ludC5cclxuXHQgKi9cclxuXHRjbGFtcFBvaW50KCBwb2ludCwgdGFyZ2V0ICkge1xyXG5cclxuXHRcdGNvbnN0IGRlbHRhTGVuZ3RoU3EgPSB0aGlzLmNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZCggcG9pbnQgKTtcclxuXHJcblx0XHR0YXJnZXQuY29weSggcG9pbnQgKTtcclxuXHJcblx0XHRpZiAoIGRlbHRhTGVuZ3RoU3EgPiAoIHRoaXMucmFkaXVzICogdGhpcy5yYWRpdXMgKSApIHtcclxuXHJcblx0XHRcdHRhcmdldC5zdWIoIHRoaXMuY2VudGVyICkubm9ybWFsaXplKCk7XHJcblx0XHRcdHRhcmdldC5tdWx0aXBseVNjYWxhciggdGhpcy5yYWRpdXMgKS5hZGQoIHRoaXMuY2VudGVyICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0YXJnZXQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIGJvdW5kaW5nIGJveCB0aGF0IGVuY2xvc2VzIHRoaXMgc3BoZXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCb3gzfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IGJveCB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGhvZCdzIHJlc3VsdC5cclxuXHQgKiBAcmV0dXJuIHtCb3gzfSBUaGUgYm91bmRpbmcgYm94IHRoYXQgZW5jbG9zZXMgdGhpcyBzcGhlcmUuXHJcblx0ICovXHJcblx0Z2V0Qm91bmRpbmdCb3goIHRhcmdldCApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuaXNFbXB0eSgpICkge1xyXG5cclxuXHRcdFx0Ly8gRW1wdHkgc3BoZXJlIHByb2R1Y2VzIGVtcHR5IGJvdW5kaW5nIGJveFxyXG5cdFx0XHR0YXJnZXQubWFrZUVtcHR5KCk7XHJcblx0XHRcdHJldHVybiB0YXJnZXQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRhcmdldC5zZXQoIHRoaXMuY2VudGVyLCB0aGlzLmNlbnRlciApO1xyXG5cdFx0dGFyZ2V0LmV4cGFuZEJ5U2NhbGFyKCB0aGlzLnJhZGl1cyApO1xyXG5cclxuXHRcdHJldHVybiB0YXJnZXQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVHJhbnNmb3JtcyB0aGlzIHNwaGVyZSB3aXRoIHRoZSBnaXZlbiA0eDQgdHJhbnNmb3JtYXRpb24gbWF0cml4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRyaXg0fSBtYXRyaXggLSBUaGUgdHJhbnNmb3JtYXRpb24gbWF0cml4LlxyXG5cdCAqIEByZXR1cm4ge1NwaGVyZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBzcGhlcmUuXHJcblx0ICovXHJcblx0YXBwbHlNYXRyaXg0KCBtYXRyaXggKSB7XHJcblxyXG5cdFx0dGhpcy5jZW50ZXIuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTtcclxuXHRcdHRoaXMucmFkaXVzID0gdGhpcy5yYWRpdXMgKiBtYXRyaXguZ2V0TWF4U2NhbGVPbkF4aXMoKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUcmFuc2xhdGVzIHRoZSBzcGhlcmUncyBjZW50ZXIgYnkgdGhlIGdpdmVuIG9mZnNldC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gb2Zmc2V0IC0gVGhlIG9mZnNldC5cclxuXHQgKiBAcmV0dXJuIHtTcGhlcmV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgc3BoZXJlLlxyXG5cdCAqL1xyXG5cdHRyYW5zbGF0ZSggb2Zmc2V0ICkge1xyXG5cclxuXHRcdHRoaXMuY2VudGVyLmFkZCggb2Zmc2V0ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRXhwYW5kcyB0aGUgYm91bmRhcmllcyBvZiB0aGlzIHNwaGVyZSB0byBpbmNsdWRlIHRoZSBnaXZlbiBwb2ludC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gcG9pbnQgLSBUaGUgcG9pbnQgdG8gaW5jbHVkZS5cclxuXHQgKiBAcmV0dXJuIHtTcGhlcmV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgc3BoZXJlLlxyXG5cdCAqL1xyXG5cdGV4cGFuZEJ5UG9pbnQoIHBvaW50ICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5pc0VtcHR5KCkgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmNlbnRlci5jb3B5KCBwb2ludCApO1xyXG5cclxuXHRcdFx0dGhpcy5yYWRpdXMgPSAwO1xyXG5cclxuXHRcdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdF92MS5zdWJWZWN0b3JzKCBwb2ludCwgdGhpcy5jZW50ZXIgKTtcclxuXHJcblx0XHRjb25zdCBsZW5ndGhTcSA9IF92MS5sZW5ndGhTcSgpO1xyXG5cclxuXHRcdGlmICggbGVuZ3RoU3EgPiAoIHRoaXMucmFkaXVzICogdGhpcy5yYWRpdXMgKSApIHtcclxuXHJcblx0XHRcdC8vIGNhbGN1bGF0ZSB0aGUgbWluaW1hbCBzcGhlcmVcclxuXHJcblx0XHRcdGNvbnN0IGxlbmd0aCA9IE1hdGguc3FydCggbGVuZ3RoU3EgKTtcclxuXHJcblx0XHRcdGNvbnN0IGRlbHRhID0gKCBsZW5ndGggLSB0aGlzLnJhZGl1cyApICogMC41O1xyXG5cclxuXHRcdFx0dGhpcy5jZW50ZXIuYWRkU2NhbGVkVmVjdG9yKCBfdjEsIGRlbHRhIC8gbGVuZ3RoICk7XHJcblxyXG5cdFx0XHR0aGlzLnJhZGl1cyArPSBkZWx0YTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRXhwYW5kcyB0aGlzIHNwaGVyZSB0byBlbmNsb3NlIGJvdGggdGhlIG9yaWdpbmFsIHNwaGVyZSBhbmQgdGhlIGdpdmVuIHNwaGVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7U3BoZXJlfSBzcGhlcmUgLSBUaGUgc3BoZXJlIHRvIGluY2x1ZGUuXHJcblx0ICogQHJldHVybiB7U3BoZXJlfSBBIHJlZmVyZW5jZSB0byB0aGlzIHNwaGVyZS5cclxuXHQgKi9cclxuXHR1bmlvbiggc3BoZXJlICkge1xyXG5cclxuXHRcdGlmICggc3BoZXJlLmlzRW1wdHkoKSApIHtcclxuXHJcblx0XHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMuaXNFbXB0eSgpICkge1xyXG5cclxuXHRcdFx0dGhpcy5jb3B5KCBzcGhlcmUgKTtcclxuXHJcblx0XHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMuY2VudGVyLmVxdWFscyggc3BoZXJlLmNlbnRlciApID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0IHRoaXMucmFkaXVzID0gTWF0aC5tYXgoIHRoaXMucmFkaXVzLCBzcGhlcmUucmFkaXVzICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdF92Mi5zdWJWZWN0b3JzKCBzcGhlcmUuY2VudGVyLCB0aGlzLmNlbnRlciApLnNldExlbmd0aCggc3BoZXJlLnJhZGl1cyApO1xyXG5cclxuXHRcdFx0dGhpcy5leHBhbmRCeVBvaW50KCBfdjEuY29weSggc3BoZXJlLmNlbnRlciApLmFkZCggX3YyICkgKTtcclxuXHJcblx0XHRcdHRoaXMuZXhwYW5kQnlQb2ludCggX3YxLmNvcHkoIHNwaGVyZS5jZW50ZXIgKS5zdWIoIF92MiApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgc3BoZXJlIGlzIGVxdWFsIHdpdGggdGhlIGdpdmVuIG9uZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7U3BoZXJlfSBzcGhlcmUgLSBUaGUgc3BoZXJlIHRvIHRlc3QgZm9yIGVxdWFsaXR5LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyBib3VuZGluZyBzcGhlcmUgaXMgZXF1YWwgd2l0aCB0aGUgZ2l2ZW4gb25lLlxyXG5cdCAqL1xyXG5cdGVxdWFscyggc3BoZXJlICkge1xyXG5cclxuXHRcdHJldHVybiBzcGhlcmUuY2VudGVyLmVxdWFscyggdGhpcy5jZW50ZXIgKSAmJiAoIHNwaGVyZS5yYWRpdXMgPT09IHRoaXMucmFkaXVzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIG5ldyBzcGhlcmUgd2l0aCBjb3BpZWQgdmFsdWVzIGZyb20gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1NwaGVyZX0gQSBjbG9uZSBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNsb25lKCkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgU3BoZXJlIH07XHJcbiIsImltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuL1ZlY3RvcjMuanMnO1xyXG5cclxuY29uc3QgX3ZlY3RvciA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX3NlZ0NlbnRlciA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX3NlZ0RpciA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX2RpZmYgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcblxyXG5jb25zdCBfZWRnZTEgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF9lZGdlMiA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX25vcm1hbCA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuXHJcbi8qKlxyXG4gKiBBIHJheSB0aGF0IGVtaXRzIGZyb20gYW4gb3JpZ2luIGluIGEgY2VydGFpbiBkaXJlY3Rpb24uIFRoZSBjbGFzcyBpcyB1c2VkIGJ5XHJcbiAqIHtAbGluayBSYXljYXN0ZXJ9IHRvIGFzc2lzdCB3aXRoIHJheWNhc3RpbmcuIFJheWNhc3RpbmcgaXMgdXNlZCBmb3JcclxuICogbW91c2UgcGlja2luZyAod29ya2luZyBvdXQgd2hhdCBvYmplY3RzIGluIHRoZSAzRCBzcGFjZSB0aGUgbW91c2UgaXMgb3ZlcilcclxuICogYW1vbmdzdCBvdGhlciB0aGluZ3MuXHJcbiAqL1xyXG5jbGFzcyBSYXkge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHJheS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gW29yaWdpbj0oMCwwLDApXSAtIFRoZSBvcmlnaW4gb2YgdGhlIHJheS5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IFtkaXJlY3Rpb249KDAsMCwtMSldIC0gVGhlIChub3JtYWxpemVkKSBkaXJlY3Rpb24gb2YgdGhlIHJheS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggb3JpZ2luID0gbmV3IFZlY3RvcjMoKSwgZGlyZWN0aW9uID0gbmV3IFZlY3RvcjMoIDAsIDAsIC0gMSApICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG9yaWdpbiBvZiB0aGUgcmF5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3IzfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm9yaWdpbiA9IG9yaWdpbjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSAobm9ybWFsaXplZCkgZGlyZWN0aW9uIG9mIHRoZSByYXkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjN9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGlyZWN0aW9uID0gZGlyZWN0aW9uO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHJheSdzIGNvbXBvbmVudHMgYnkgY29weWluZyB0aGUgZ2l2ZW4gdmFsdWVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBvcmlnaW4gLSBUaGUgb3JpZ2luLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gZGlyZWN0aW9uIC0gVGhlIGRpcmVjdGlvbi5cclxuXHQgKiBAcmV0dXJuIHtSYXl9IEEgcmVmZXJlbmNlIHRvIHRoaXMgcmF5LlxyXG5cdCAqL1xyXG5cdHNldCggb3JpZ2luLCBkaXJlY3Rpb24gKSB7XHJcblxyXG5cdFx0dGhpcy5vcmlnaW4uY29weSggb3JpZ2luICk7XHJcblx0XHR0aGlzLmRpcmVjdGlvbi5jb3B5KCBkaXJlY3Rpb24gKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gcmF5IHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JheX0gcmF5IC0gVGhlIHJheSB0byBjb3B5LlxyXG5cdCAqIEByZXR1cm4ge1JheX0gQSByZWZlcmVuY2UgdG8gdGhpcyByYXkuXHJcblx0ICovXHJcblx0Y29weSggcmF5ICkge1xyXG5cclxuXHRcdHRoaXMub3JpZ2luLmNvcHkoIHJheS5vcmlnaW4gKTtcclxuXHRcdHRoaXMuZGlyZWN0aW9uLmNvcHkoIHJheS5kaXJlY3Rpb24gKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgdmVjdG9yIHRoYXQgaXMgbG9jYXRlZCBhdCBhIGdpdmVuIGRpc3RhbmNlIGFsb25nIHRoaXMgcmF5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHQgLSBUaGUgZGlzdGFuY2UgYWxvbmcgdGhlIHJheSB0byByZXRyaWV2ZSBhIHBvc2l0aW9uIGZvci5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHRhcmdldCAtIFRoZSB0YXJnZXQgdmVjdG9yIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbWV0aG9kJ3MgcmVzdWx0LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcG9zaXRpb24gb24gdGhlIHJheS5cclxuXHQgKi9cclxuXHRhdCggdCwgdGFyZ2V0ICkge1xyXG5cclxuXHRcdHJldHVybiB0YXJnZXQuY29weSggdGhpcy5vcmlnaW4gKS5hZGRTY2FsZWRWZWN0b3IoIHRoaXMuZGlyZWN0aW9uLCB0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRqdXN0cyB0aGUgZGlyZWN0aW9uIG9mIHRoZSByYXkgdG8gcG9pbnQgYXQgdGhlIGdpdmVuIHZlY3RvciBpbiB3b3JsZCBzcGFjZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdiAtIFRoZSB0YXJnZXQgcG9zaXRpb24uXHJcblx0ICogQHJldHVybiB7UmF5fSBBIHJlZmVyZW5jZSB0byB0aGlzIHJheS5cclxuXHQgKi9cclxuXHRsb29rQXQoIHYgKSB7XHJcblxyXG5cdFx0dGhpcy5kaXJlY3Rpb24uY29weSggdiApLnN1YiggdGhpcy5vcmlnaW4gKS5ub3JtYWxpemUoKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTaGlmdCB0aGUgb3JpZ2luIG9mIHRoaXMgcmF5IGFsb25nIGl0cyBkaXJlY3Rpb24gYnkgdGhlIGdpdmVuIGRpc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHQgLSBUaGUgZGlzdGFuY2UgYWxvbmcgdGhlIHJheSB0byBpbnRlcnBvbGF0ZS5cclxuXHQgKiBAcmV0dXJuIHtSYXl9IEEgcmVmZXJlbmNlIHRvIHRoaXMgcmF5LlxyXG5cdCAqL1xyXG5cdHJlY2FzdCggdCApIHtcclxuXHJcblx0XHR0aGlzLm9yaWdpbi5jb3B5KCB0aGlzLmF0KCB0LCBfdmVjdG9yICkgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBwb2ludCBhbG9uZyB0aGlzIHJheSB0aGF0IGlzIGNsb3Nlc3QgdG8gdGhlIGdpdmVuIHBvaW50LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBwb2ludCAtIEEgcG9pbnQgaW4gM0Qgc3BhY2UgdG8gZ2V0IHRoZSBjbG9zZXQgbG9jYXRpb24gb24gdGhlIHJheSBmb3IuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IHZlY3RvciB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGhvZCdzIHJlc3VsdC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBUaGUgY2xvc2VzdCBwb2ludCBvbiB0aGlzIHJheS5cclxuXHQgKi9cclxuXHRjbG9zZXN0UG9pbnRUb1BvaW50KCBwb2ludCwgdGFyZ2V0ICkge1xyXG5cclxuXHRcdHRhcmdldC5zdWJWZWN0b3JzKCBwb2ludCwgdGhpcy5vcmlnaW4gKTtcclxuXHJcblx0XHRjb25zdCBkaXJlY3Rpb25EaXN0YW5jZSA9IHRhcmdldC5kb3QoIHRoaXMuZGlyZWN0aW9uICk7XHJcblxyXG5cdFx0aWYgKCBkaXJlY3Rpb25EaXN0YW5jZSA8IDAgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIHRoaXMub3JpZ2luICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0YXJnZXQuY29weSggdGhpcy5vcmlnaW4gKS5hZGRTY2FsZWRWZWN0b3IoIHRoaXMuZGlyZWN0aW9uLCBkaXJlY3Rpb25EaXN0YW5jZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGRpc3RhbmNlIG9mIHRoZSBjbG9zZXN0IGFwcHJvYWNoIGJldHdlZW4gdGhpcyByYXkgYW5kIHRoZSBnaXZlbiBwb2ludC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gcG9pbnQgLSBBIHBvaW50IGluIDNEIHNwYWNlIHRvIGNvbXB1dGUgdGhlIGRpc3RhbmNlIHRvLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGRpc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGRpc3RhbmNlVG9Qb2ludCggcG9pbnQgKSB7XHJcblxyXG5cdFx0cmV0dXJuIE1hdGguc3FydCggdGhpcy5kaXN0YW5jZVNxVG9Qb2ludCggcG9pbnQgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHNxdWFyZWQgZGlzdGFuY2Ugb2YgdGhlIGNsb3Nlc3QgYXBwcm9hY2ggYmV0d2VlbiB0aGlzIHJheSBhbmQgdGhlIGdpdmVuIHBvaW50LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBwb2ludCAtIEEgcG9pbnQgaW4gM0Qgc3BhY2UgdG8gY29tcHV0ZSB0aGUgZGlzdGFuY2UgdG8uXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgc3F1YXJlZCBkaXN0YW5jZS5cclxuXHQgKi9cclxuXHRkaXN0YW5jZVNxVG9Qb2ludCggcG9pbnQgKSB7XHJcblxyXG5cdFx0Y29uc3QgZGlyZWN0aW9uRGlzdGFuY2UgPSBfdmVjdG9yLnN1YlZlY3RvcnMoIHBvaW50LCB0aGlzLm9yaWdpbiApLmRvdCggdGhpcy5kaXJlY3Rpb24gKTtcclxuXHJcblx0XHQvLyBwb2ludCBiZWhpbmQgdGhlIHJheVxyXG5cclxuXHRcdGlmICggZGlyZWN0aW9uRGlzdGFuY2UgPCAwICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIHRoaXMub3JpZ2luLmRpc3RhbmNlVG9TcXVhcmVkKCBwb2ludCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRfdmVjdG9yLmNvcHkoIHRoaXMub3JpZ2luICkuYWRkU2NhbGVkVmVjdG9yKCB0aGlzLmRpcmVjdGlvbiwgZGlyZWN0aW9uRGlzdGFuY2UgKTtcclxuXHJcblx0XHRyZXR1cm4gX3ZlY3Rvci5kaXN0YW5jZVRvU3F1YXJlZCggcG9pbnQgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBzcXVhcmVkIGRpc3RhbmNlIGJldHdlZW4gdGhpcyByYXkgYW5kIHRoZSBnaXZlbiBsaW5lIHNlZ21lbnQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHYwIC0gVGhlIHN0YXJ0IHBvaW50IG9mIHRoZSBsaW5lIHNlZ21lbnQuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB2MSAtIFRoZSBlbmQgcG9pbnQgb2YgdGhlIGxpbmUgc2VnbWVudC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IFtvcHRpb25hbFBvaW50T25SYXldIC0gV2hlbiBwcm92aWRlZCwgaXQgcmVjZWl2ZXMgdGhlIHBvaW50IG9uIHRoaXMgcmF5IHRoYXQgaXMgY2xvc2VzdCB0byB0aGUgc2VnbWVudC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IFtvcHRpb25hbFBvaW50T25TZWdtZW50XSAtIFdoZW4gcHJvdmlkZWQsIGl0IHJlY2VpdmVzIHRoZSBwb2ludCBvbiB0aGUgbGluZSBzZWdtZW50IHRoYXQgaXMgY2xvc2VzdCB0byB0aGlzIHJheS5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBzcXVhcmVkIGRpc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGRpc3RhbmNlU3FUb1NlZ21lbnQoIHYwLCB2MSwgb3B0aW9uYWxQb2ludE9uUmF5LCBvcHRpb25hbFBvaW50T25TZWdtZW50ICkge1xyXG5cclxuXHRcdC8vIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL3Btam9uaWFrL0dlb21ldHJpY1Rvb2xzL2Jsb2IvbWFzdGVyL0dURW5naW5lL0luY2x1ZGUvTWF0aGVtYXRpY3MvR3RlRGlzdFJheVNlZ21lbnQuaFxyXG5cdFx0Ly8gSXQgcmV0dXJucyB0aGUgbWluIGRpc3RhbmNlIGJldHdlZW4gdGhlIHJheSBhbmQgdGhlIHNlZ21lbnRcclxuXHRcdC8vIGRlZmluZWQgYnkgdjAgYW5kIHYxXHJcblx0XHQvLyBJdCBjYW4gYWxzbyBzZXQgdHdvIG9wdGlvbmFsIHRhcmdldHMgOlxyXG5cdFx0Ly8gLSBUaGUgY2xvc2VzdCBwb2ludCBvbiB0aGUgcmF5XHJcblx0XHQvLyAtIFRoZSBjbG9zZXN0IHBvaW50IG9uIHRoZSBzZWdtZW50XHJcblxyXG5cdFx0X3NlZ0NlbnRlci5jb3B5KCB2MCApLmFkZCggdjEgKS5tdWx0aXBseVNjYWxhciggMC41ICk7XHJcblx0XHRfc2VnRGlyLmNvcHkoIHYxICkuc3ViKCB2MCApLm5vcm1hbGl6ZSgpO1xyXG5cdFx0X2RpZmYuY29weSggdGhpcy5vcmlnaW4gKS5zdWIoIF9zZWdDZW50ZXIgKTtcclxuXHJcblx0XHRjb25zdCBzZWdFeHRlbnQgPSB2MC5kaXN0YW5jZVRvKCB2MSApICogMC41O1xyXG5cdFx0Y29uc3QgYTAxID0gLSB0aGlzLmRpcmVjdGlvbi5kb3QoIF9zZWdEaXIgKTtcclxuXHRcdGNvbnN0IGIwID0gX2RpZmYuZG90KCB0aGlzLmRpcmVjdGlvbiApO1xyXG5cdFx0Y29uc3QgYjEgPSAtIF9kaWZmLmRvdCggX3NlZ0RpciApO1xyXG5cdFx0Y29uc3QgYyA9IF9kaWZmLmxlbmd0aFNxKCk7XHJcblx0XHRjb25zdCBkZXQgPSBNYXRoLmFicyggMSAtIGEwMSAqIGEwMSApO1xyXG5cdFx0bGV0IHMwLCBzMSwgc3FyRGlzdCwgZXh0RGV0O1xyXG5cclxuXHRcdGlmICggZGV0ID4gMCApIHtcclxuXHJcblx0XHRcdC8vIFRoZSByYXkgYW5kIHNlZ21lbnQgYXJlIG5vdCBwYXJhbGxlbC5cclxuXHJcblx0XHRcdHMwID0gYTAxICogYjEgLSBiMDtcclxuXHRcdFx0czEgPSBhMDEgKiBiMCAtIGIxO1xyXG5cdFx0XHRleHREZXQgPSBzZWdFeHRlbnQgKiBkZXQ7XHJcblxyXG5cdFx0XHRpZiAoIHMwID49IDAgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggczEgPj0gLSBleHREZXQgKSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBzMSA8PSBleHREZXQgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHQvLyByZWdpb24gMFxyXG5cdFx0XHRcdFx0XHQvLyBNaW5pbXVtIGF0IGludGVyaW9yIHBvaW50cyBvZiByYXkgYW5kIHNlZ21lbnQuXHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCBpbnZEZXQgPSAxIC8gZGV0O1xyXG5cdFx0XHRcdFx0XHRzMCAqPSBpbnZEZXQ7XHJcblx0XHRcdFx0XHRcdHMxICo9IGludkRldDtcclxuXHRcdFx0XHRcdFx0c3FyRGlzdCA9IHMwICogKCBzMCArIGEwMSAqIHMxICsgMiAqIGIwICkgKyBzMSAqICggYTAxICogczAgKyBzMSArIDIgKiBiMSApICsgYztcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0Ly8gcmVnaW9uIDFcclxuXHJcblx0XHRcdFx0XHRcdHMxID0gc2VnRXh0ZW50O1xyXG5cdFx0XHRcdFx0XHRzMCA9IE1hdGgubWF4KCAwLCAtICggYTAxICogczEgKyBiMCApICk7XHJcblx0XHRcdFx0XHRcdHNxckRpc3QgPSAtIHMwICogczAgKyBzMSAqICggczEgKyAyICogYjEgKSArIGM7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdC8vIHJlZ2lvbiA1XHJcblxyXG5cdFx0XHRcdFx0czEgPSAtIHNlZ0V4dGVudDtcclxuXHRcdFx0XHRcdHMwID0gTWF0aC5tYXgoIDAsIC0gKCBhMDEgKiBzMSArIGIwICkgKTtcclxuXHRcdFx0XHRcdHNxckRpc3QgPSAtIHMwICogczAgKyBzMSAqICggczEgKyAyICogYjEgKSArIGM7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGlmICggczEgPD0gLSBleHREZXQgKSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gcmVnaW9uIDRcclxuXHJcblx0XHRcdFx0XHRzMCA9IE1hdGgubWF4KCAwLCAtICggLSBhMDEgKiBzZWdFeHRlbnQgKyBiMCApICk7XHJcblx0XHRcdFx0XHRzMSA9ICggczAgPiAwICkgPyAtIHNlZ0V4dGVudCA6IE1hdGgubWluKCBNYXRoLm1heCggLSBzZWdFeHRlbnQsIC0gYjEgKSwgc2VnRXh0ZW50ICk7XHJcblx0XHRcdFx0XHRzcXJEaXN0ID0gLSBzMCAqIHMwICsgczEgKiAoIHMxICsgMiAqIGIxICkgKyBjO1xyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCBzMSA8PSBleHREZXQgKSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gcmVnaW9uIDNcclxuXHJcblx0XHRcdFx0XHRzMCA9IDA7XHJcblx0XHRcdFx0XHRzMSA9IE1hdGgubWluKCBNYXRoLm1heCggLSBzZWdFeHRlbnQsIC0gYjEgKSwgc2VnRXh0ZW50ICk7XHJcblx0XHRcdFx0XHRzcXJEaXN0ID0gczEgKiAoIHMxICsgMiAqIGIxICkgKyBjO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdC8vIHJlZ2lvbiAyXHJcblxyXG5cdFx0XHRcdFx0czAgPSBNYXRoLm1heCggMCwgLSAoIGEwMSAqIHNlZ0V4dGVudCArIGIwICkgKTtcclxuXHRcdFx0XHRcdHMxID0gKCBzMCA+IDAgKSA/IHNlZ0V4dGVudCA6IE1hdGgubWluKCBNYXRoLm1heCggLSBzZWdFeHRlbnQsIC0gYjEgKSwgc2VnRXh0ZW50ICk7XHJcblx0XHRcdFx0XHRzcXJEaXN0ID0gLSBzMCAqIHMwICsgczEgKiAoIHMxICsgMiAqIGIxICkgKyBjO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdC8vIFJheSBhbmQgc2VnbWVudCBhcmUgcGFyYWxsZWwuXHJcblxyXG5cdFx0XHRzMSA9ICggYTAxID4gMCApID8gLSBzZWdFeHRlbnQgOiBzZWdFeHRlbnQ7XHJcblx0XHRcdHMwID0gTWF0aC5tYXgoIDAsIC0gKCBhMDEgKiBzMSArIGIwICkgKTtcclxuXHRcdFx0c3FyRGlzdCA9IC0gczAgKiBzMCArIHMxICogKCBzMSArIDIgKiBiMSApICsgYztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBvcHRpb25hbFBvaW50T25SYXkgKSB7XHJcblxyXG5cdFx0XHRvcHRpb25hbFBvaW50T25SYXkuY29weSggdGhpcy5vcmlnaW4gKS5hZGRTY2FsZWRWZWN0b3IoIHRoaXMuZGlyZWN0aW9uLCBzMCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIG9wdGlvbmFsUG9pbnRPblNlZ21lbnQgKSB7XHJcblxyXG5cdFx0XHRvcHRpb25hbFBvaW50T25TZWdtZW50LmNvcHkoIF9zZWdDZW50ZXIgKS5hZGRTY2FsZWRWZWN0b3IoIF9zZWdEaXIsIHMxICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBzcXJEaXN0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEludGVyc2VjdHMgdGhpcyByYXkgd2l0aCB0aGUgZ2l2ZW4gc3BoZXJlLCByZXR1cm5pbmcgdGhlIGludGVyc2VjdGlvblxyXG5cdCAqIHBvaW50IG9yIGBudWxsYCBpZiB0aGVyZSBpcyBubyBpbnRlcnNlY3Rpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1NwaGVyZX0gc3BoZXJlIC0gVGhlIHNwaGVyZSB0byBpbnRlcnNlY3QuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IHZlY3RvciB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGhvZCdzIHJlc3VsdC5cclxuXHQgKiBAcmV0dXJuIHs/VmVjdG9yM30gVGhlIGludGVyc2VjdGlvbiBwb2ludC5cclxuXHQgKi9cclxuXHRpbnRlcnNlY3RTcGhlcmUoIHNwaGVyZSwgdGFyZ2V0ICkge1xyXG5cclxuXHRcdF92ZWN0b3Iuc3ViVmVjdG9ycyggc3BoZXJlLmNlbnRlciwgdGhpcy5vcmlnaW4gKTtcclxuXHRcdGNvbnN0IHRjYSA9IF92ZWN0b3IuZG90KCB0aGlzLmRpcmVjdGlvbiApO1xyXG5cdFx0Y29uc3QgZDIgPSBfdmVjdG9yLmRvdCggX3ZlY3RvciApIC0gdGNhICogdGNhO1xyXG5cdFx0Y29uc3QgcmFkaXVzMiA9IHNwaGVyZS5yYWRpdXMgKiBzcGhlcmUucmFkaXVzO1xyXG5cclxuXHRcdGlmICggZDIgPiByYWRpdXMyICkgcmV0dXJuIG51bGw7XHJcblxyXG5cdFx0Y29uc3QgdGhjID0gTWF0aC5zcXJ0KCByYWRpdXMyIC0gZDIgKTtcclxuXHJcblx0XHQvLyB0MCA9IGZpcnN0IGludGVyc2VjdCBwb2ludCAtIGVudHJhbmNlIG9uIGZyb250IG9mIHNwaGVyZVxyXG5cdFx0Y29uc3QgdDAgPSB0Y2EgLSB0aGM7XHJcblxyXG5cdFx0Ly8gdDEgPSBzZWNvbmQgaW50ZXJzZWN0IHBvaW50IC0gZXhpdCBwb2ludCBvbiBiYWNrIG9mIHNwaGVyZVxyXG5cdFx0Y29uc3QgdDEgPSB0Y2EgKyB0aGM7XHJcblxyXG5cdFx0Ly8gdGVzdCB0byBzZWUgaWYgdDEgaXMgYmVoaW5kIHRoZSByYXkgLSBpZiBzbywgcmV0dXJuIG51bGxcclxuXHRcdGlmICggdDEgPCAwICkgcmV0dXJuIG51bGw7XHJcblxyXG5cdFx0Ly8gdGVzdCB0byBzZWUgaWYgdDAgaXMgYmVoaW5kIHRoZSByYXk6XHJcblx0XHQvLyBpZiBpdCBpcywgdGhlIHJheSBpcyBpbnNpZGUgdGhlIHNwaGVyZSwgc28gcmV0dXJuIHRoZSBzZWNvbmQgZXhpdCBwb2ludCBzY2FsZWQgYnkgdDEsXHJcblx0XHQvLyBpbiBvcmRlciB0byBhbHdheXMgcmV0dXJuIGFuIGludGVyc2VjdCBwb2ludCB0aGF0IGlzIGluIGZyb250IG9mIHRoZSByYXkuXHJcblx0XHRpZiAoIHQwIDwgMCApIHJldHVybiB0aGlzLmF0KCB0MSwgdGFyZ2V0ICk7XHJcblxyXG5cdFx0Ly8gZWxzZSB0MCBpcyBpbiBmcm9udCBvZiB0aGUgcmF5LCBzbyByZXR1cm4gdGhlIGZpcnN0IGNvbGxpc2lvbiBwb2ludCBzY2FsZWQgYnkgdDBcclxuXHRcdHJldHVybiB0aGlzLmF0KCB0MCwgdGFyZ2V0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyByYXkgaW50ZXJzZWN0cyB3aXRoIHRoZSBnaXZlbiBzcGhlcmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1NwaGVyZX0gc3BoZXJlIC0gVGhlIHNwaGVyZSB0byBpbnRlcnNlY3QuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGlzIHJheSBpbnRlcnNlY3RzIHdpdGggdGhlIGdpdmVuIHNwaGVyZSBvciBub3QuXHJcblx0ICovXHJcblx0aW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmRpc3RhbmNlU3FUb1BvaW50KCBzcGhlcmUuY2VudGVyICkgPD0gKCBzcGhlcmUucmFkaXVzICogc3BoZXJlLnJhZGl1cyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSByYXkncyBvcmlnaW4gdG8gdGhlIGdpdmVuIHBsYW5lLiBSZXR1cm5zIGBudWxsYCBpZiB0aGUgcmF5XHJcblx0ICogZG9lcyBub3QgaW50ZXJzZWN0IHdpdGggdGhlIHBsYW5lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtQbGFuZX0gcGxhbmUgLSBUaGUgcGxhbmUgdG8gY29tcHV0ZSB0aGUgZGlzdGFuY2UgdG8uXHJcblx0ICogQHJldHVybiB7P251bWJlcn0gV2hldGhlciB0aGlzIHJheSBpbnRlcnNlY3RzIHdpdGggdGhlIGdpdmVuIHNwaGVyZSBvciBub3QuXHJcblx0ICovXHJcblx0ZGlzdGFuY2VUb1BsYW5lKCBwbGFuZSApIHtcclxuXHJcblx0XHRjb25zdCBkZW5vbWluYXRvciA9IHBsYW5lLm5vcm1hbC5kb3QoIHRoaXMuZGlyZWN0aW9uICk7XHJcblxyXG5cdFx0aWYgKCBkZW5vbWluYXRvciA9PT0gMCApIHtcclxuXHJcblx0XHRcdC8vIGxpbmUgaXMgY29wbGFuYXIsIHJldHVybiBvcmlnaW5cclxuXHRcdFx0aWYgKCBwbGFuZS5kaXN0YW5jZVRvUG9pbnQoIHRoaXMub3JpZ2luICkgPT09IDAgKSB7XHJcblxyXG5cdFx0XHRcdHJldHVybiAwO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gTnVsbCBpcyBwcmVmZXJhYmxlIHRvIHVuZGVmaW5lZCBzaW5jZSB1bmRlZmluZWQgbWVhbnMuLi4uIGl0IGlzIHVuZGVmaW5lZFxyXG5cclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHQgPSAtICggdGhpcy5vcmlnaW4uZG90KCBwbGFuZS5ub3JtYWwgKSArIHBsYW5lLmNvbnN0YW50ICkgLyBkZW5vbWluYXRvcjtcclxuXHJcblx0XHQvLyBSZXR1cm4gaWYgdGhlIHJheSBuZXZlciBpbnRlcnNlY3RzIHRoZSBwbGFuZVxyXG5cclxuXHRcdHJldHVybiB0ID49IDAgPyB0IDogbnVsbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJbnRlcnNlY3RzIHRoaXMgcmF5IHdpdGggdGhlIGdpdmVuIHBsYW5lLCByZXR1cm5pbmcgdGhlIGludGVyc2VjdGlvblxyXG5cdCAqIHBvaW50IG9yIGBudWxsYCBpZiB0aGVyZSBpcyBubyBpbnRlcnNlY3Rpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1BsYW5lfSBwbGFuZSAtIFRoZSBwbGFuZSB0byBpbnRlcnNlY3QuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IHZlY3RvciB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGhvZCdzIHJlc3VsdC5cclxuXHQgKiBAcmV0dXJuIHs/VmVjdG9yM30gVGhlIGludGVyc2VjdGlvbiBwb2ludC5cclxuXHQgKi9cclxuXHRpbnRlcnNlY3RQbGFuZSggcGxhbmUsIHRhcmdldCApIHtcclxuXHJcblx0XHRjb25zdCB0ID0gdGhpcy5kaXN0YW5jZVRvUGxhbmUoIHBsYW5lICk7XHJcblxyXG5cdFx0aWYgKCB0ID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzLmF0KCB0LCB0YXJnZXQgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIHJheSBpbnRlcnNlY3RzIHdpdGggdGhlIGdpdmVuIHBsYW5lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtQbGFuZX0gcGxhbmUgLSBUaGUgcGxhbmUgdG8gaW50ZXJzZWN0LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyByYXkgaW50ZXJzZWN0cyB3aXRoIHRoZSBnaXZlbiBwbGFuZSBvciBub3QuXHJcblx0ICovXHJcblx0aW50ZXJzZWN0c1BsYW5lKCBwbGFuZSApIHtcclxuXHJcblx0XHQvLyBjaGVjayBpZiB0aGUgcmF5IGxpZXMgb24gdGhlIHBsYW5lIGZpcnN0XHJcblxyXG5cdFx0Y29uc3QgZGlzdFRvUG9pbnQgPSBwbGFuZS5kaXN0YW5jZVRvUG9pbnQoIHRoaXMub3JpZ2luICk7XHJcblxyXG5cdFx0aWYgKCBkaXN0VG9Qb2ludCA9PT0gMCApIHtcclxuXHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBkZW5vbWluYXRvciA9IHBsYW5lLm5vcm1hbC5kb3QoIHRoaXMuZGlyZWN0aW9uICk7XHJcblxyXG5cdFx0aWYgKCBkZW5vbWluYXRvciAqIGRpc3RUb1BvaW50IDwgMCApIHtcclxuXHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyByYXkgb3JpZ2luIGlzIGJlaGluZCB0aGUgcGxhbmUgKGFuZCBpcyBwb2ludGluZyBiZWhpbmQgaXQpXHJcblxyXG5cdFx0cmV0dXJuIGZhbHNlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEludGVyc2VjdHMgdGhpcyByYXkgd2l0aCB0aGUgZ2l2ZW4gYm91bmRpbmcgYm94LCByZXR1cm5pbmcgdGhlIGludGVyc2VjdGlvblxyXG5cdCAqIHBvaW50IG9yIGBudWxsYCBpZiB0aGVyZSBpcyBubyBpbnRlcnNlY3Rpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0JveDN9IGJveCAtIFRoZSBib3ggdG8gaW50ZXJzZWN0LlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdGFyZ2V0IC0gVGhlIHRhcmdldCB2ZWN0b3IgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBtZXRob2QncyByZXN1bHQuXHJcblx0ICogQHJldHVybiB7P1ZlY3RvcjN9IFRoZSBpbnRlcnNlY3Rpb24gcG9pbnQuXHJcblx0ICovXHJcblx0aW50ZXJzZWN0Qm94KCBib3gsIHRhcmdldCApIHtcclxuXHJcblx0XHRsZXQgdG1pbiwgdG1heCwgdHltaW4sIHR5bWF4LCB0em1pbiwgdHptYXg7XHJcblxyXG5cdFx0Y29uc3QgaW52ZGlyeCA9IDEgLyB0aGlzLmRpcmVjdGlvbi54LFxyXG5cdFx0XHRpbnZkaXJ5ID0gMSAvIHRoaXMuZGlyZWN0aW9uLnksXHJcblx0XHRcdGludmRpcnogPSAxIC8gdGhpcy5kaXJlY3Rpb24uejtcclxuXHJcblx0XHRjb25zdCBvcmlnaW4gPSB0aGlzLm9yaWdpbjtcclxuXHJcblx0XHRpZiAoIGludmRpcnggPj0gMCApIHtcclxuXHJcblx0XHRcdHRtaW4gPSAoIGJveC5taW4ueCAtIG9yaWdpbi54ICkgKiBpbnZkaXJ4O1xyXG5cdFx0XHR0bWF4ID0gKCBib3gubWF4LnggLSBvcmlnaW4ueCApICogaW52ZGlyeDtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dG1pbiA9ICggYm94Lm1heC54IC0gb3JpZ2luLnggKSAqIGludmRpcng7XHJcblx0XHRcdHRtYXggPSAoIGJveC5taW4ueCAtIG9yaWdpbi54ICkgKiBpbnZkaXJ4O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGludmRpcnkgPj0gMCApIHtcclxuXHJcblx0XHRcdHR5bWluID0gKCBib3gubWluLnkgLSBvcmlnaW4ueSApICogaW52ZGlyeTtcclxuXHRcdFx0dHltYXggPSAoIGJveC5tYXgueSAtIG9yaWdpbi55ICkgKiBpbnZkaXJ5O1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR0eW1pbiA9ICggYm94Lm1heC55IC0gb3JpZ2luLnkgKSAqIGludmRpcnk7XHJcblx0XHRcdHR5bWF4ID0gKCBib3gubWluLnkgLSBvcmlnaW4ueSApICogaW52ZGlyeTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCAoIHRtaW4gPiB0eW1heCApIHx8ICggdHltaW4gPiB0bWF4ICkgKSByZXR1cm4gbnVsbDtcclxuXHJcblx0XHRpZiAoIHR5bWluID4gdG1pbiB8fCBpc05hTiggdG1pbiApICkgdG1pbiA9IHR5bWluO1xyXG5cclxuXHRcdGlmICggdHltYXggPCB0bWF4IHx8IGlzTmFOKCB0bWF4ICkgKSB0bWF4ID0gdHltYXg7XHJcblxyXG5cdFx0aWYgKCBpbnZkaXJ6ID49IDAgKSB7XHJcblxyXG5cdFx0XHR0em1pbiA9ICggYm94Lm1pbi56IC0gb3JpZ2luLnogKSAqIGludmRpcno7XHJcblx0XHRcdHR6bWF4ID0gKCBib3gubWF4LnogLSBvcmlnaW4ueiApICogaW52ZGlyejtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dHptaW4gPSAoIGJveC5tYXgueiAtIG9yaWdpbi56ICkgKiBpbnZkaXJ6O1xyXG5cdFx0XHR0em1heCA9ICggYm94Lm1pbi56IC0gb3JpZ2luLnogKSAqIGludmRpcno7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggKCB0bWluID4gdHptYXggKSB8fCAoIHR6bWluID4gdG1heCApICkgcmV0dXJuIG51bGw7XHJcblxyXG5cdFx0aWYgKCB0em1pbiA+IHRtaW4gfHwgdG1pbiAhPT0gdG1pbiApIHRtaW4gPSB0em1pbjtcclxuXHJcblx0XHRpZiAoIHR6bWF4IDwgdG1heCB8fCB0bWF4ICE9PSB0bWF4ICkgdG1heCA9IHR6bWF4O1xyXG5cclxuXHRcdC8vcmV0dXJuIHBvaW50IGNsb3Nlc3QgdG8gdGhlIHJheSAocG9zaXRpdmUgc2lkZSlcclxuXHJcblx0XHRpZiAoIHRtYXggPCAwICkgcmV0dXJuIG51bGw7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuYXQoIHRtaW4gPj0gMCA/IHRtaW4gOiB0bWF4LCB0YXJnZXQgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIHJheSBpbnRlcnNlY3RzIHdpdGggdGhlIGdpdmVuIGJveC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Qm94M30gYm94IC0gVGhlIGJveCB0byBpbnRlcnNlY3QuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGlzIHJheSBpbnRlcnNlY3RzIHdpdGggdGhlIGdpdmVuIGJveCBvciBub3QuXHJcblx0ICovXHJcblx0aW50ZXJzZWN0c0JveCggYm94ICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmludGVyc2VjdEJveCggYm94LCBfdmVjdG9yICkgIT09IG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW50ZXJzZWN0cyB0aGlzIHJheSB3aXRoIHRoZSBnaXZlbiB0cmlhbmdsZSwgcmV0dXJuaW5nIHRoZSBpbnRlcnNlY3Rpb25cclxuXHQgKiBwb2ludCBvciBgbnVsbGAgaWYgdGhlcmUgaXMgbm8gaW50ZXJzZWN0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBhIC0gVGhlIGZpcnN0IHZlcnRleCBvZiB0aGUgdHJpYW5nbGUuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBiIC0gVGhlIHNlY29uZCB2ZXJ0ZXggb2YgdGhlIHRyaWFuZ2xlLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gYyAtIFRoZSB0aGlyZCB2ZXJ0ZXggb2YgdGhlIHRyaWFuZ2xlLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gYmFja2ZhY2VDdWxsaW5nIC0gV2hldGhlciB0byB1c2UgYmFja2ZhY2UgY3VsbGluZyBvciBub3QuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IHZlY3RvciB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGhvZCdzIHJlc3VsdC5cclxuXHQgKiBAcmV0dXJuIHs/VmVjdG9yM30gVGhlIGludGVyc2VjdGlvbiBwb2ludC5cclxuXHQgKi9cclxuXHRpbnRlcnNlY3RUcmlhbmdsZSggYSwgYiwgYywgYmFja2ZhY2VDdWxsaW5nLCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0Ly8gQ29tcHV0ZSB0aGUgb2Zmc2V0IG9yaWdpbiwgZWRnZXMsIGFuZCBub3JtYWwuXHJcblxyXG5cdFx0Ly8gZnJvbSBodHRwczovL2dpdGh1Yi5jb20vcG1qb25pYWsvR2VvbWV0cmljVG9vbHMvYmxvYi9tYXN0ZXIvR1RFbmdpbmUvSW5jbHVkZS9NYXRoZW1hdGljcy9HdGVJbnRyUmF5M1RyaWFuZ2xlMy5oXHJcblxyXG5cdFx0X2VkZ2UxLnN1YlZlY3RvcnMoIGIsIGEgKTtcclxuXHRcdF9lZGdlMi5zdWJWZWN0b3JzKCBjLCBhICk7XHJcblx0XHRfbm9ybWFsLmNyb3NzVmVjdG9ycyggX2VkZ2UxLCBfZWRnZTIgKTtcclxuXHJcblx0XHQvLyBTb2x2ZSBRICsgdCpEID0gYjEqRTEgKyBiMipFMiAoUSA9IGtEaWZmLCBEID0gcmF5IGRpcmVjdGlvbixcclxuXHRcdC8vIEUxID0ga0VkZ2UxLCBFMiA9IGtFZGdlMiwgTiA9IENyb3NzKEUxLEUyKSkgYnlcclxuXHRcdC8vICAgfERvdChELE4pfCpiMSA9IHNpZ24oRG90KEQsTikpKkRvdChELENyb3NzKFEsRTIpKVxyXG5cdFx0Ly8gICB8RG90KEQsTil8KmIyID0gc2lnbihEb3QoRCxOKSkqRG90KEQsQ3Jvc3MoRTEsUSkpXHJcblx0XHQvLyAgIHxEb3QoRCxOKXwqdCA9IC1zaWduKERvdChELE4pKSpEb3QoUSxOKVxyXG5cdFx0bGV0IERkTiA9IHRoaXMuZGlyZWN0aW9uLmRvdCggX25vcm1hbCApO1xyXG5cdFx0bGV0IHNpZ247XHJcblxyXG5cdFx0aWYgKCBEZE4gPiAwICkge1xyXG5cclxuXHRcdFx0aWYgKCBiYWNrZmFjZUN1bGxpbmcgKSByZXR1cm4gbnVsbDtcclxuXHRcdFx0c2lnbiA9IDE7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggRGROIDwgMCApIHtcclxuXHJcblx0XHRcdHNpZ24gPSAtIDE7XHJcblx0XHRcdERkTiA9IC0gRGROO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gbnVsbDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0X2RpZmYuc3ViVmVjdG9ycyggdGhpcy5vcmlnaW4sIGEgKTtcclxuXHRcdGNvbnN0IERkUXhFMiA9IHNpZ24gKiB0aGlzLmRpcmVjdGlvbi5kb3QoIF9lZGdlMi5jcm9zc1ZlY3RvcnMoIF9kaWZmLCBfZWRnZTIgKSApO1xyXG5cclxuXHRcdC8vIGIxIDwgMCwgbm8gaW50ZXJzZWN0aW9uXHJcblx0XHRpZiAoIERkUXhFMiA8IDAgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gbnVsbDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgRGRFMXhRID0gc2lnbiAqIHRoaXMuZGlyZWN0aW9uLmRvdCggX2VkZ2UxLmNyb3NzKCBfZGlmZiApICk7XHJcblxyXG5cdFx0Ly8gYjIgPCAwLCBubyBpbnRlcnNlY3Rpb25cclxuXHRcdGlmICggRGRFMXhRIDwgMCApIHtcclxuXHJcblx0XHRcdHJldHVybiBudWxsO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBiMStiMiA+IDEsIG5vIGludGVyc2VjdGlvblxyXG5cdFx0aWYgKCBEZFF4RTIgKyBEZEUxeFEgPiBEZE4gKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gbnVsbDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gTGluZSBpbnRlcnNlY3RzIHRyaWFuZ2xlLCBjaGVjayBpZiByYXkgZG9lcy5cclxuXHRcdGNvbnN0IFFkTiA9IC0gc2lnbiAqIF9kaWZmLmRvdCggX25vcm1hbCApO1xyXG5cclxuXHRcdC8vIHQgPCAwLCBubyBpbnRlcnNlY3Rpb25cclxuXHRcdGlmICggUWROIDwgMCApIHtcclxuXHJcblx0XHRcdHJldHVybiBudWxsO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBSYXkgaW50ZXJzZWN0cyB0cmlhbmdsZS5cclxuXHRcdHJldHVybiB0aGlzLmF0KCBRZE4gLyBEZE4sIHRhcmdldCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRyYW5zZm9ybXMgdGhpcyByYXkgd2l0aCB0aGUgZ2l2ZW4gNHg0IHRyYW5zZm9ybWF0aW9uIG1hdHJpeC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4NH0gbWF0cml4NCAtIFRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguXHJcblx0ICogQHJldHVybiB7UmF5fSBBIHJlZmVyZW5jZSB0byB0aGlzIHJheS5cclxuXHQgKi9cclxuXHRhcHBseU1hdHJpeDQoIG1hdHJpeDQgKSB7XHJcblxyXG5cdFx0dGhpcy5vcmlnaW4uYXBwbHlNYXRyaXg0KCBtYXRyaXg0ICk7XHJcblx0XHR0aGlzLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24oIG1hdHJpeDQgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIHJheSBpcyBlcXVhbCB3aXRoIHRoZSBnaXZlbiBvbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JheX0gcmF5IC0gVGhlIHJheSB0byB0ZXN0IGZvciBlcXVhbGl0eS5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoaXMgcmF5IGlzIGVxdWFsIHdpdGggdGhlIGdpdmVuIG9uZS5cclxuXHQgKi9cclxuXHRlcXVhbHMoIHJheSApIHtcclxuXHJcblx0XHRyZXR1cm4gcmF5Lm9yaWdpbi5lcXVhbHMoIHRoaXMub3JpZ2luICkgJiYgcmF5LmRpcmVjdGlvbi5lcXVhbHMoIHRoaXMuZGlyZWN0aW9uICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIG5ldyByYXkgd2l0aCBjb3BpZWQgdmFsdWVzIGZyb20gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1JheX0gQSBjbG9uZSBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNsb25lKCkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgUmF5IH07XHJcbiIsImltcG9ydCB7IFdlYkdMQ29vcmRpbmF0ZVN5c3RlbSwgV2ViR1BVQ29vcmRpbmF0ZVN5c3RlbSB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuL1ZlY3RvcjMuanMnO1xyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgYSA0eDQgbWF0cml4LlxyXG4gKlxyXG4gKiBUaGUgbW9zdCBjb21tb24gdXNlIG9mIGEgNHg0IG1hdHJpeCBpbiAzRCBjb21wdXRlciBncmFwaGljcyBpcyBhcyBhIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC5cclxuICogRm9yIGFuIGludHJvZHVjdGlvbiB0byB0cmFuc2Zvcm1hdGlvbiBtYXRyaWNlcyBhcyB1c2VkIGluIFdlYkdMLCBjaGVjayBvdXQgW3RoaXMgdHV0b3JpYWxde0BsaW5rIGh0dHBzOi8vd3d3Lm9wZW5nbC10dXRvcmlhbC5vcmcvYmVnaW5uZXJzLXR1dG9yaWFscy90dXRvcmlhbC0zLW1hdHJpY2VzfVxyXG4gKlxyXG4gKiBUaGlzIGFsbG93cyBhIDNEIHZlY3RvciByZXByZXNlbnRpbmcgYSBwb2ludCBpbiAzRCBzcGFjZSB0byB1bmRlcmdvXHJcbiAqIHRyYW5zZm9ybWF0aW9ucyBzdWNoIGFzIHRyYW5zbGF0aW9uLCByb3RhdGlvbiwgc2hlYXIsIHNjYWxlLCByZWZsZWN0aW9uLFxyXG4gKiBvcnRob2dvbmFsIG9yIHBlcnNwZWN0aXZlIHByb2plY3Rpb24gYW5kIHNvIG9uLCBieSBiZWluZyBtdWx0aXBsaWVkIGJ5IHRoZVxyXG4gKiBtYXRyaXguIFRoaXMgaXMga25vd24gYXMgYGFwcGx5aW5nYCB0aGUgbWF0cml4IHRvIHRoZSB2ZWN0b3IuXHJcbiAqXHJcbiAqIEEgTm90ZSBvbiBSb3ctTWFqb3IgYW5kIENvbHVtbi1NYWpvciBPcmRlcmluZzpcclxuICpcclxuICogVGhlIGNvbnN0cnVjdG9yIGFuZCB7QGxpbmsgTWF0cml4MyNzZXR9IG1ldGhvZCB0YWtlIGFyZ3VtZW50cyBpblxyXG4gKiBbcm93LW1ham9yXXtAbGluayBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Sb3ctX2FuZF9jb2x1bW4tbWFqb3Jfb3JkZXIjQ29sdW1uLW1ham9yX29yZGVyfVxyXG4gKiBvcmRlciwgd2hpbGUgaW50ZXJuYWxseSB0aGV5IGFyZSBzdG9yZWQgaW4gdGhlIHtAbGluayBNYXRyaXgzI2VsZW1lbnRzfSBhcnJheSBpbiBjb2x1bW4tbWFqb3Igb3JkZXIuXHJcbiAqIFRoaXMgbWVhbnMgdGhhdCBjYWxsaW5nOlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBtID0gbmV3IFRIUkVFLk1hdHJpeDQoKTtcclxuICogbS5zZXQoIDExLCAxMiwgMTMsIDE0LFxyXG4gKiAgICAgICAgMjEsIDIyLCAyMywgMjQsXHJcbiAqICAgICAgICAzMSwgMzIsIDMzLCAzNCxcclxuICogICAgICAgIDQxLCA0MiwgNDMsIDQ0ICk7XHJcbiAqIGBgYFxyXG4gKiB3aWxsIHJlc3VsdCBpbiB0aGUgZWxlbWVudHMgYXJyYXkgY29udGFpbmluZzpcclxuICogYGBganNcclxuICogbS5lbGVtZW50cyA9IFsgMTEsIDIxLCAzMSwgNDEsXHJcbiAqICAgICAgICAgICAgICAgIDEyLCAyMiwgMzIsIDQyLFxyXG4gKiAgICAgICAgICAgICAgICAxMywgMjMsIDMzLCA0MyxcclxuICogICAgICAgICAgICAgICAgMTQsIDI0LCAzNCwgNDQgXTtcclxuICogYGBgXHJcbiAqIGFuZCBpbnRlcm5hbGx5IGFsbCBjYWxjdWxhdGlvbnMgYXJlIHBlcmZvcm1lZCB1c2luZyBjb2x1bW4tbWFqb3Igb3JkZXJpbmcuXHJcbiAqIEhvd2V2ZXIsIGFzIHRoZSBhY3R1YWwgb3JkZXJpbmcgbWFrZXMgbm8gZGlmZmVyZW5jZSBtYXRoZW1hdGljYWxseSBhbmRcclxuICogbW9zdCBwZW9wbGUgYXJlIHVzZWQgdG8gdGhpbmtpbmcgYWJvdXQgbWF0cmljZXMgaW4gcm93LW1ham9yIG9yZGVyLCB0aGVcclxuICogdGhyZWUuanMgZG9jdW1lbnRhdGlvbiBzaG93cyBtYXRyaWNlcyBpbiByb3ctbWFqb3Igb3JkZXIuIEp1c3QgYmVhciBpblxyXG4gKiBtaW5kIHRoYXQgaWYgeW91IGFyZSByZWFkaW5nIHRoZSBzb3VyY2UgY29kZSwgeW91J2xsIGhhdmUgdG8gdGFrZSB0aGVcclxuICogdHJhbnNwb3NlIG9mIGFueSBtYXRyaWNlcyBvdXRsaW5lZCBoZXJlIHRvIG1ha2Ugc2Vuc2Ugb2YgdGhlIGNhbGN1bGF0aW9ucy5cclxuICovXHJcbmNsYXNzIE1hdHJpeDQge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IDR4NCBtYXRyaXguIFRoZSBhcmd1bWVudHMgYXJlIHN1cHBvc2VkIHRvIGJlXHJcblx0ICogaW4gcm93LW1ham9yIG9yZGVyLiBJZiBubyBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLCB0aGUgY29uc3RydWN0b3JcclxuXHQgKiBpbml0aWFsaXplcyB0aGUgbWF0cml4IGFzIGFuIGlkZW50aXR5IG1hdHJpeC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjExXSAtIDEtMSBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW24xMl0gLSAxLTIgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuMTNdIC0gMS0zIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjE0XSAtIDEtNCBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW24yMV0gLSAyLTEgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuMjJdIC0gMi0yIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjIzXSAtIDItMyBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW24yNF0gLSAyLTQgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuMzFdIC0gMy0xIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjMyXSAtIDMtMiBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW24zM10gLSAzLTMgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuMzRdIC0gMy00IG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjQxXSAtIDQtMSBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW240Ml0gLSA0LTIgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuNDNdIC0gNC0zIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjQ0XSAtIDQtNCBtYXRyaXggZWxlbWVudC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbjExLCBuMTIsIG4xMywgbjE0LCBuMjEsIG4yMiwgbjIzLCBuMjQsIG4zMSwgbjMyLCBuMzMsIG4zNCwgbjQxLCBuNDIsIG40MywgbjQ0ICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0TWF0cml4NC5wcm90b3R5cGUuaXNNYXRyaXg0ID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgY29sdW1uLW1ham9yIGxpc3Qgb2YgbWF0cml4IHZhbHVlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8bnVtYmVyPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5lbGVtZW50cyA9IFtcclxuXHJcblx0XHRcdDEsIDAsIDAsIDAsXHJcblx0XHRcdDAsIDEsIDAsIDAsXHJcblx0XHRcdDAsIDAsIDEsIDAsXHJcblx0XHRcdDAsIDAsIDAsIDFcclxuXHJcblx0XHRdO1xyXG5cclxuXHRcdGlmICggbjExICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnNldCggbjExLCBuMTIsIG4xMywgbjE0LCBuMjEsIG4yMiwgbjIzLCBuMjQsIG4zMSwgbjMyLCBuMzMsIG4zNCwgbjQxLCBuNDIsIG40MywgbjQ0ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGVsZW1lbnRzIG9mIHRoZSBtYXRyaXguVGhlIGFyZ3VtZW50cyBhcmUgc3VwcG9zZWQgdG8gYmVcclxuXHQgKiBpbiByb3ctbWFqb3Igb3JkZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW24xMV0gLSAxLTEgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuMTJdIC0gMS0yIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjEzXSAtIDEtMyBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW24xNF0gLSAxLTQgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuMjFdIC0gMi0xIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjIyXSAtIDItMiBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW24yM10gLSAyLTMgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuMjRdIC0gMi00IG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjMxXSAtIDMtMSBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW24zMl0gLSAzLTIgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuMzNdIC0gMy0zIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjM0XSAtIDMtNCBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW240MV0gLSA0LTEgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuNDJdIC0gNC0yIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjQzXSAtIDQtMyBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW240NF0gLSA0LTQgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHJldHVybiB7TWF0cml4NH0gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0c2V0KCBuMTEsIG4xMiwgbjEzLCBuMTQsIG4yMSwgbjIyLCBuMjMsIG4yNCwgbjMxLCBuMzIsIG4zMywgbjM0LCBuNDEsIG40MiwgbjQzLCBuNDQgKSB7XHJcblxyXG5cdFx0Y29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzO1xyXG5cclxuXHRcdHRlWyAwIF0gPSBuMTE7IHRlWyA0IF0gPSBuMTI7IHRlWyA4IF0gPSBuMTM7IHRlWyAxMiBdID0gbjE0O1xyXG5cdFx0dGVbIDEgXSA9IG4yMTsgdGVbIDUgXSA9IG4yMjsgdGVbIDkgXSA9IG4yMzsgdGVbIDEzIF0gPSBuMjQ7XHJcblx0XHR0ZVsgMiBdID0gbjMxOyB0ZVsgNiBdID0gbjMyOyB0ZVsgMTAgXSA9IG4zMzsgdGVbIDE0IF0gPSBuMzQ7XHJcblx0XHR0ZVsgMyBdID0gbjQxOyB0ZVsgNyBdID0gbjQyOyB0ZVsgMTEgXSA9IG40MzsgdGVbIDE1IF0gPSBuNDQ7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGlzIG1hdHJpeCB0byB0aGUgNHg0IGlkZW50aXR5IG1hdHJpeC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdGlkZW50aXR5KCkge1xyXG5cclxuXHRcdHRoaXMuc2V0KFxyXG5cclxuXHRcdFx0MSwgMCwgMCwgMCxcclxuXHRcdFx0MCwgMSwgMCwgMCxcclxuXHRcdFx0MCwgMCwgMSwgMCxcclxuXHRcdFx0MCwgMCwgMCwgMVxyXG5cclxuXHRcdCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIG1hdHJpeCB3aXRoIGNvcGllZCB2YWx1ZXMgZnJvbSB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7TWF0cml4NH0gQSBjbG9uZSBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNsb25lKCkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgTWF0cml4NCgpLmZyb21BcnJheSggdGhpcy5lbGVtZW50cyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvcGllcyB0aGUgdmFsdWVzIG9mIHRoZSBnaXZlbiBtYXRyaXggdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4NH0gbSAtIFRoZSBtYXRyaXggdG8gY29weS5cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXg0fSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRjb3B5KCBtICkge1xyXG5cclxuXHRcdGNvbnN0IHRlID0gdGhpcy5lbGVtZW50cztcclxuXHRcdGNvbnN0IG1lID0gbS5lbGVtZW50cztcclxuXHJcblx0XHR0ZVsgMCBdID0gbWVbIDAgXTsgdGVbIDEgXSA9IG1lWyAxIF07IHRlWyAyIF0gPSBtZVsgMiBdOyB0ZVsgMyBdID0gbWVbIDMgXTtcclxuXHRcdHRlWyA0IF0gPSBtZVsgNCBdOyB0ZVsgNSBdID0gbWVbIDUgXTsgdGVbIDYgXSA9IG1lWyA2IF07IHRlWyA3IF0gPSBtZVsgNyBdO1xyXG5cdFx0dGVbIDggXSA9IG1lWyA4IF07IHRlWyA5IF0gPSBtZVsgOSBdOyB0ZVsgMTAgXSA9IG1lWyAxMCBdOyB0ZVsgMTEgXSA9IG1lWyAxMSBdO1xyXG5cdFx0dGVbIDEyIF0gPSBtZVsgMTIgXTsgdGVbIDEzIF0gPSBtZVsgMTMgXTsgdGVbIDE0IF0gPSBtZVsgMTQgXTsgdGVbIDE1IF0gPSBtZVsgMTUgXTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb3BpZXMgdGhlIHRyYW5zbGF0aW9uIGNvbXBvbmVudCBvZiB0aGUgZ2l2ZW4gbWF0cml4XHJcblx0ICogaW50byB0aGlzIG1hdHJpeCdzIHRyYW5zbGF0aW9uIGNvbXBvbmVudC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4NH0gbSAtIFRoZSBtYXRyaXggdG8gY29weSB0aGUgdHJhbnNsYXRpb24gY29tcG9uZW50LlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdGNvcHlQb3NpdGlvbiggbSApIHtcclxuXHJcblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHMsIG1lID0gbS5lbGVtZW50cztcclxuXHJcblx0XHR0ZVsgMTIgXSA9IG1lWyAxMiBdO1xyXG5cdFx0dGVbIDEzIF0gPSBtZVsgMTMgXTtcclxuXHRcdHRlWyAxNCBdID0gbWVbIDE0IF07XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0IHRoZSB1cHBlciAzeDMgZWxlbWVudHMgb2YgdGhpcyBtYXRyaXggdG8gdGhlIHZhbHVlcyBvZiBnaXZlbiAzeDMgbWF0cml4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRyaXgzfSBtIC0gVGhlIDN4MyBtYXRyaXguXHJcblx0ICogQHJldHVybiB7TWF0cml4NH0gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0c2V0RnJvbU1hdHJpeDMoIG0gKSB7XHJcblxyXG5cdFx0Y29uc3QgbWUgPSBtLmVsZW1lbnRzO1xyXG5cclxuXHRcdHRoaXMuc2V0KFxyXG5cclxuXHRcdFx0bWVbIDAgXSwgbWVbIDMgXSwgbWVbIDYgXSwgMCxcclxuXHRcdFx0bWVbIDEgXSwgbWVbIDQgXSwgbWVbIDcgXSwgMCxcclxuXHRcdFx0bWVbIDIgXSwgbWVbIDUgXSwgbWVbIDggXSwgMCxcclxuXHRcdFx0MCwgMCwgMCwgMVxyXG5cclxuXHRcdCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRXh0cmFjdHMgdGhlIGJhc2lzIG9mIHRoaXMgbWF0cml4IGludG8gdGhlIHRocmVlIGF4aXMgdmVjdG9ycyBwcm92aWRlZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30geEF4aXMgLSBUaGUgYmFzaXMncyB4IGF4aXMuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB5QXhpcyAtIFRoZSBiYXNpcydzIHkgYXhpcy5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHpBeGlzIC0gVGhlIGJhc2lzJ3MgeiBheGlzLlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdGV4dHJhY3RCYXNpcyggeEF4aXMsIHlBeGlzLCB6QXhpcyApIHtcclxuXHJcblx0XHR4QXhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKCB0aGlzLCAwICk7XHJcblx0XHR5QXhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKCB0aGlzLCAxICk7XHJcblx0XHR6QXhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKCB0aGlzLCAyICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZ2l2ZW4gYmFzaXMgdmVjdG9ycyB0byB0aGlzIG1hdHJpeC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30geEF4aXMgLSBUaGUgYmFzaXMncyB4IGF4aXMuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB5QXhpcyAtIFRoZSBiYXNpcydzIHkgYXhpcy5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHpBeGlzIC0gVGhlIGJhc2lzJ3MgeiBheGlzLlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdG1ha2VCYXNpcyggeEF4aXMsIHlBeGlzLCB6QXhpcyApIHtcclxuXHJcblx0XHR0aGlzLnNldChcclxuXHRcdFx0eEF4aXMueCwgeUF4aXMueCwgekF4aXMueCwgMCxcclxuXHRcdFx0eEF4aXMueSwgeUF4aXMueSwgekF4aXMueSwgMCxcclxuXHRcdFx0eEF4aXMueiwgeUF4aXMueiwgekF4aXMueiwgMCxcclxuXHRcdFx0MCwgMCwgMCwgMVxyXG5cdFx0KTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFeHRyYWN0cyB0aGUgcm90YXRpb24gY29tcG9uZW50IG9mIHRoZSBnaXZlbiBtYXRyaXhcclxuXHQgKiBpbnRvIHRoaXMgbWF0cml4J3Mgcm90YXRpb24gY29tcG9uZW50LlxyXG5cdCAqXHJcblx0ICogTm90ZTogVGhpcyBtZXRob2QgZG9lcyBub3Qgc3VwcG9ydCByZWZsZWN0aW9uIG1hdHJpY2VzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRyaXg0fSBtIC0gVGhlIG1hdHJpeC5cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXg0fSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRleHRyYWN0Um90YXRpb24oIG0gKSB7XHJcblxyXG5cdFx0Y29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzO1xyXG5cdFx0Y29uc3QgbWUgPSBtLmVsZW1lbnRzO1xyXG5cclxuXHRcdGNvbnN0IHNjYWxlWCA9IDEgLyBfdjEuc2V0RnJvbU1hdHJpeENvbHVtbiggbSwgMCApLmxlbmd0aCgpO1xyXG5cdFx0Y29uc3Qgc2NhbGVZID0gMSAvIF92MS5zZXRGcm9tTWF0cml4Q29sdW1uKCBtLCAxICkubGVuZ3RoKCk7XHJcblx0XHRjb25zdCBzY2FsZVogPSAxIC8gX3YxLnNldEZyb21NYXRyaXhDb2x1bW4oIG0sIDIgKS5sZW5ndGgoKTtcclxuXHJcblx0XHR0ZVsgMCBdID0gbWVbIDAgXSAqIHNjYWxlWDtcclxuXHRcdHRlWyAxIF0gPSBtZVsgMSBdICogc2NhbGVYO1xyXG5cdFx0dGVbIDIgXSA9IG1lWyAyIF0gKiBzY2FsZVg7XHJcblx0XHR0ZVsgMyBdID0gMDtcclxuXHJcblx0XHR0ZVsgNCBdID0gbWVbIDQgXSAqIHNjYWxlWTtcclxuXHRcdHRlWyA1IF0gPSBtZVsgNSBdICogc2NhbGVZO1xyXG5cdFx0dGVbIDYgXSA9IG1lWyA2IF0gKiBzY2FsZVk7XHJcblx0XHR0ZVsgNyBdID0gMDtcclxuXHJcblx0XHR0ZVsgOCBdID0gbWVbIDggXSAqIHNjYWxlWjtcclxuXHRcdHRlWyA5IF0gPSBtZVsgOSBdICogc2NhbGVaO1xyXG5cdFx0dGVbIDEwIF0gPSBtZVsgMTAgXSAqIHNjYWxlWjtcclxuXHRcdHRlWyAxMSBdID0gMDtcclxuXHJcblx0XHR0ZVsgMTIgXSA9IDA7XHJcblx0XHR0ZVsgMTMgXSA9IDA7XHJcblx0XHR0ZVsgMTQgXSA9IDA7XHJcblx0XHR0ZVsgMTUgXSA9IDE7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgcm90YXRpb24gY29tcG9uZW50ICh0aGUgdXBwZXIgbGVmdCAzeDMgbWF0cml4KSBvZiB0aGlzIG1hdHJpeCB0b1xyXG5cdCAqIHRoZSByb3RhdGlvbiBzcGVjaWZpZWQgYnkgdGhlIGdpdmVuIEV1bGVyIGFuZ2xlcy4gVGhlIHJlc3Qgb2ZcclxuXHQgKiB0aGUgbWF0cml4IGlzIHNldCB0byB0aGUgaWRlbnRpdHkuIERlcGVuZGluZyBvbiB0aGUge0BsaW5rIEV1bGVyI29yZGVyfSxcclxuXHQgKiB0aGVyZSBhcmUgc2l4IHBvc3NpYmxlIG91dGNvbWVzLiBTZWUgW3RoaXMgcGFnZV17QGxpbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRXVsZXJfYW5nbGVzI1JvdGF0aW9uX21hdHJpeH1cclxuXHQgKiBmb3IgYSBjb21wbGV0ZSBsaXN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtFdWxlcn0gZXVsZXIgLSBUaGUgRXVsZXIgYW5nbGVzLlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdG1ha2VSb3RhdGlvbkZyb21FdWxlciggZXVsZXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzO1xyXG5cclxuXHRcdGNvbnN0IHggPSBldWxlci54LCB5ID0gZXVsZXIueSwgeiA9IGV1bGVyLno7XHJcblx0XHRjb25zdCBhID0gTWF0aC5jb3MoIHggKSwgYiA9IE1hdGguc2luKCB4ICk7XHJcblx0XHRjb25zdCBjID0gTWF0aC5jb3MoIHkgKSwgZCA9IE1hdGguc2luKCB5ICk7XHJcblx0XHRjb25zdCBlID0gTWF0aC5jb3MoIHogKSwgZiA9IE1hdGguc2luKCB6ICk7XHJcblxyXG5cdFx0aWYgKCBldWxlci5vcmRlciA9PT0gJ1hZWicgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBhZSA9IGEgKiBlLCBhZiA9IGEgKiBmLCBiZSA9IGIgKiBlLCBiZiA9IGIgKiBmO1xyXG5cclxuXHRcdFx0dGVbIDAgXSA9IGMgKiBlO1xyXG5cdFx0XHR0ZVsgNCBdID0gLSBjICogZjtcclxuXHRcdFx0dGVbIDggXSA9IGQ7XHJcblxyXG5cdFx0XHR0ZVsgMSBdID0gYWYgKyBiZSAqIGQ7XHJcblx0XHRcdHRlWyA1IF0gPSBhZSAtIGJmICogZDtcclxuXHRcdFx0dGVbIDkgXSA9IC0gYiAqIGM7XHJcblxyXG5cdFx0XHR0ZVsgMiBdID0gYmYgLSBhZSAqIGQ7XHJcblx0XHRcdHRlWyA2IF0gPSBiZSArIGFmICogZDtcclxuXHRcdFx0dGVbIDEwIF0gPSBhICogYztcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBldWxlci5vcmRlciA9PT0gJ1lYWicgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBjZSA9IGMgKiBlLCBjZiA9IGMgKiBmLCBkZSA9IGQgKiBlLCBkZiA9IGQgKiBmO1xyXG5cclxuXHRcdFx0dGVbIDAgXSA9IGNlICsgZGYgKiBiO1xyXG5cdFx0XHR0ZVsgNCBdID0gZGUgKiBiIC0gY2Y7XHJcblx0XHRcdHRlWyA4IF0gPSBhICogZDtcclxuXHJcblx0XHRcdHRlWyAxIF0gPSBhICogZjtcclxuXHRcdFx0dGVbIDUgXSA9IGEgKiBlO1xyXG5cdFx0XHR0ZVsgOSBdID0gLSBiO1xyXG5cclxuXHRcdFx0dGVbIDIgXSA9IGNmICogYiAtIGRlO1xyXG5cdFx0XHR0ZVsgNiBdID0gZGYgKyBjZSAqIGI7XHJcblx0XHRcdHRlWyAxMCBdID0gYSAqIGM7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggZXVsZXIub3JkZXIgPT09ICdaWFknICkge1xyXG5cclxuXHRcdFx0Y29uc3QgY2UgPSBjICogZSwgY2YgPSBjICogZiwgZGUgPSBkICogZSwgZGYgPSBkICogZjtcclxuXHJcblx0XHRcdHRlWyAwIF0gPSBjZSAtIGRmICogYjtcclxuXHRcdFx0dGVbIDQgXSA9IC0gYSAqIGY7XHJcblx0XHRcdHRlWyA4IF0gPSBkZSArIGNmICogYjtcclxuXHJcblx0XHRcdHRlWyAxIF0gPSBjZiArIGRlICogYjtcclxuXHRcdFx0dGVbIDUgXSA9IGEgKiBlO1xyXG5cdFx0XHR0ZVsgOSBdID0gZGYgLSBjZSAqIGI7XHJcblxyXG5cdFx0XHR0ZVsgMiBdID0gLSBhICogZDtcclxuXHRcdFx0dGVbIDYgXSA9IGI7XHJcblx0XHRcdHRlWyAxMCBdID0gYSAqIGM7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggZXVsZXIub3JkZXIgPT09ICdaWVgnICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYWUgPSBhICogZSwgYWYgPSBhICogZiwgYmUgPSBiICogZSwgYmYgPSBiICogZjtcclxuXHJcblx0XHRcdHRlWyAwIF0gPSBjICogZTtcclxuXHRcdFx0dGVbIDQgXSA9IGJlICogZCAtIGFmO1xyXG5cdFx0XHR0ZVsgOCBdID0gYWUgKiBkICsgYmY7XHJcblxyXG5cdFx0XHR0ZVsgMSBdID0gYyAqIGY7XHJcblx0XHRcdHRlWyA1IF0gPSBiZiAqIGQgKyBhZTtcclxuXHRcdFx0dGVbIDkgXSA9IGFmICogZCAtIGJlO1xyXG5cclxuXHRcdFx0dGVbIDIgXSA9IC0gZDtcclxuXHRcdFx0dGVbIDYgXSA9IGIgKiBjO1xyXG5cdFx0XHR0ZVsgMTAgXSA9IGEgKiBjO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGV1bGVyLm9yZGVyID09PSAnWVpYJyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGFjID0gYSAqIGMsIGFkID0gYSAqIGQsIGJjID0gYiAqIGMsIGJkID0gYiAqIGQ7XHJcblxyXG5cdFx0XHR0ZVsgMCBdID0gYyAqIGU7XHJcblx0XHRcdHRlWyA0IF0gPSBiZCAtIGFjICogZjtcclxuXHRcdFx0dGVbIDggXSA9IGJjICogZiArIGFkO1xyXG5cclxuXHRcdFx0dGVbIDEgXSA9IGY7XHJcblx0XHRcdHRlWyA1IF0gPSBhICogZTtcclxuXHRcdFx0dGVbIDkgXSA9IC0gYiAqIGU7XHJcblxyXG5cdFx0XHR0ZVsgMiBdID0gLSBkICogZTtcclxuXHRcdFx0dGVbIDYgXSA9IGFkICogZiArIGJjO1xyXG5cdFx0XHR0ZVsgMTAgXSA9IGFjIC0gYmQgKiBmO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGV1bGVyLm9yZGVyID09PSAnWFpZJyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGFjID0gYSAqIGMsIGFkID0gYSAqIGQsIGJjID0gYiAqIGMsIGJkID0gYiAqIGQ7XHJcblxyXG5cdFx0XHR0ZVsgMCBdID0gYyAqIGU7XHJcblx0XHRcdHRlWyA0IF0gPSAtIGY7XHJcblx0XHRcdHRlWyA4IF0gPSBkICogZTtcclxuXHJcblx0XHRcdHRlWyAxIF0gPSBhYyAqIGYgKyBiZDtcclxuXHRcdFx0dGVbIDUgXSA9IGEgKiBlO1xyXG5cdFx0XHR0ZVsgOSBdID0gYWQgKiBmIC0gYmM7XHJcblxyXG5cdFx0XHR0ZVsgMiBdID0gYmMgKiBmIC0gYWQ7XHJcblx0XHRcdHRlWyA2IF0gPSBiICogZTtcclxuXHRcdFx0dGVbIDEwIF0gPSBiZCAqIGYgKyBhYztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gYm90dG9tIHJvd1xyXG5cdFx0dGVbIDMgXSA9IDA7XHJcblx0XHR0ZVsgNyBdID0gMDtcclxuXHRcdHRlWyAxMSBdID0gMDtcclxuXHJcblx0XHQvLyBsYXN0IGNvbHVtblxyXG5cdFx0dGVbIDEyIF0gPSAwO1xyXG5cdFx0dGVbIDEzIF0gPSAwO1xyXG5cdFx0dGVbIDE0IF0gPSAwO1xyXG5cdFx0dGVbIDE1IF0gPSAxO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHJvdGF0aW9uIGNvbXBvbmVudCBvZiB0aGlzIG1hdHJpeCB0byB0aGUgcm90YXRpb24gc3BlY2lmaWVkIGJ5XHJcblx0ICogdGhlIGdpdmVuIFF1YXRlcm5pb24gYXMgb3V0bGluZWQgW2hlcmVde0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1JvdGF0aW9uX21hdHJpeCNRdWF0ZXJuaW9ufVxyXG5cdCAqIFRoZSByZXN0IG9mIHRoZSBtYXRyaXggaXMgc2V0IHRvIHRoZSBpZGVudGl0eS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UXVhdGVybmlvbn0gcSAtIFRoZSBRdWF0ZXJuaW9uLlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdG1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKCBxICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmNvbXBvc2UoIF96ZXJvLCBxLCBfb25lICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgcm90YXRpb24gY29tcG9uZW50IG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXgsIGxvb2tpbmcgZnJvbSBgZXllYCB0b3dhcmRzXHJcblx0ICogYHRhcmdldGAsIGFuZCBvcmllbnRlZCBieSB0aGUgdXAtZGlyZWN0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBleWUgLSBUaGUgZXllIHZlY3Rvci5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHRhcmdldCAtIFRoZSB0YXJnZXQgdmVjdG9yLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdXAgLSBUaGUgdXAgdmVjdG9yLlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdGxvb2tBdCggZXllLCB0YXJnZXQsIHVwICkge1xyXG5cclxuXHRcdGNvbnN0IHRlID0gdGhpcy5lbGVtZW50cztcclxuXHJcblx0XHRfei5zdWJWZWN0b3JzKCBleWUsIHRhcmdldCApO1xyXG5cclxuXHRcdGlmICggX3oubGVuZ3RoU3EoKSA9PT0gMCApIHtcclxuXHJcblx0XHRcdC8vIGV5ZSBhbmQgdGFyZ2V0IGFyZSBpbiB0aGUgc2FtZSBwb3NpdGlvblxyXG5cclxuXHRcdFx0X3oueiA9IDE7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdF96Lm5vcm1hbGl6ZSgpO1xyXG5cdFx0X3guY3Jvc3NWZWN0b3JzKCB1cCwgX3ogKTtcclxuXHJcblx0XHRpZiAoIF94Lmxlbmd0aFNxKCkgPT09IDAgKSB7XHJcblxyXG5cdFx0XHQvLyB1cCBhbmQgeiBhcmUgcGFyYWxsZWxcclxuXHJcblx0XHRcdGlmICggTWF0aC5hYnMoIHVwLnogKSA9PT0gMSApIHtcclxuXHJcblx0XHRcdFx0X3oueCArPSAwLjAwMDE7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRfei56ICs9IDAuMDAwMTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdF96Lm5vcm1hbGl6ZSgpO1xyXG5cdFx0XHRfeC5jcm9zc1ZlY3RvcnMoIHVwLCBfeiApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRfeC5ub3JtYWxpemUoKTtcclxuXHRcdF95LmNyb3NzVmVjdG9ycyggX3osIF94ICk7XHJcblxyXG5cdFx0dGVbIDAgXSA9IF94Lng7IHRlWyA0IF0gPSBfeS54OyB0ZVsgOCBdID0gX3oueDtcclxuXHRcdHRlWyAxIF0gPSBfeC55OyB0ZVsgNSBdID0gX3kueTsgdGVbIDkgXSA9IF96Lnk7XHJcblx0XHR0ZVsgMiBdID0gX3guejsgdGVbIDYgXSA9IF95Lno7IHRlWyAxMCBdID0gX3ouejtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQb3N0LW11bHRpcGxpZXMgdGhpcyBtYXRyaXggYnkgdGhlIGdpdmVuIDR4NCBtYXRyaXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDR9IG0gLSBUaGUgbWF0cml4IHRvIG11bHRpcGx5IHdpdGguXHJcblx0ICogQHJldHVybiB7TWF0cml4NH0gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0bXVsdGlwbHkoIG0gKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyggdGhpcywgbSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFByZS1tdWx0aXBsaWVzIHRoaXMgbWF0cml4IGJ5IHRoZSBnaXZlbiA0eDQgbWF0cml4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRyaXg0fSBtIC0gVGhlIG1hdHJpeCB0byBtdWx0aXBseSB3aXRoLlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdHByZW11bHRpcGx5KCBtICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXMoIG0sIHRoaXMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBNdWx0aXBsZXMgdGhlIGdpdmVuIDR4NCBtYXRyaWNlcyBhbmQgc3RvcmVzIHRoZSByZXN1bHRcclxuXHQgKiBpbiB0aGlzIG1hdHJpeC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4NH0gYSAtIFRoZSBmaXJzdCBtYXRyaXguXHJcblx0ICogQHBhcmFtIHtNYXRyaXg0fSBiIC0gVGhlIHNlY29uZCBtYXRyaXguXHJcblx0ICogQHJldHVybiB7TWF0cml4NH0gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0bXVsdGlwbHlNYXRyaWNlcyggYSwgYiApIHtcclxuXHJcblx0XHRjb25zdCBhZSA9IGEuZWxlbWVudHM7XHJcblx0XHRjb25zdCBiZSA9IGIuZWxlbWVudHM7XHJcblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XHJcblxyXG5cdFx0Y29uc3QgYTExID0gYWVbIDAgXSwgYTEyID0gYWVbIDQgXSwgYTEzID0gYWVbIDggXSwgYTE0ID0gYWVbIDEyIF07XHJcblx0XHRjb25zdCBhMjEgPSBhZVsgMSBdLCBhMjIgPSBhZVsgNSBdLCBhMjMgPSBhZVsgOSBdLCBhMjQgPSBhZVsgMTMgXTtcclxuXHRcdGNvbnN0IGEzMSA9IGFlWyAyIF0sIGEzMiA9IGFlWyA2IF0sIGEzMyA9IGFlWyAxMCBdLCBhMzQgPSBhZVsgMTQgXTtcclxuXHRcdGNvbnN0IGE0MSA9IGFlWyAzIF0sIGE0MiA9IGFlWyA3IF0sIGE0MyA9IGFlWyAxMSBdLCBhNDQgPSBhZVsgMTUgXTtcclxuXHJcblx0XHRjb25zdCBiMTEgPSBiZVsgMCBdLCBiMTIgPSBiZVsgNCBdLCBiMTMgPSBiZVsgOCBdLCBiMTQgPSBiZVsgMTIgXTtcclxuXHRcdGNvbnN0IGIyMSA9IGJlWyAxIF0sIGIyMiA9IGJlWyA1IF0sIGIyMyA9IGJlWyA5IF0sIGIyNCA9IGJlWyAxMyBdO1xyXG5cdFx0Y29uc3QgYjMxID0gYmVbIDIgXSwgYjMyID0gYmVbIDYgXSwgYjMzID0gYmVbIDEwIF0sIGIzNCA9IGJlWyAxNCBdO1xyXG5cdFx0Y29uc3QgYjQxID0gYmVbIDMgXSwgYjQyID0gYmVbIDcgXSwgYjQzID0gYmVbIDExIF0sIGI0NCA9IGJlWyAxNSBdO1xyXG5cclxuXHRcdHRlWyAwIF0gPSBhMTEgKiBiMTEgKyBhMTIgKiBiMjEgKyBhMTMgKiBiMzEgKyBhMTQgKiBiNDE7XHJcblx0XHR0ZVsgNCBdID0gYTExICogYjEyICsgYTEyICogYjIyICsgYTEzICogYjMyICsgYTE0ICogYjQyO1xyXG5cdFx0dGVbIDggXSA9IGExMSAqIGIxMyArIGExMiAqIGIyMyArIGExMyAqIGIzMyArIGExNCAqIGI0MztcclxuXHRcdHRlWyAxMiBdID0gYTExICogYjE0ICsgYTEyICogYjI0ICsgYTEzICogYjM0ICsgYTE0ICogYjQ0O1xyXG5cclxuXHRcdHRlWyAxIF0gPSBhMjEgKiBiMTEgKyBhMjIgKiBiMjEgKyBhMjMgKiBiMzEgKyBhMjQgKiBiNDE7XHJcblx0XHR0ZVsgNSBdID0gYTIxICogYjEyICsgYTIyICogYjIyICsgYTIzICogYjMyICsgYTI0ICogYjQyO1xyXG5cdFx0dGVbIDkgXSA9IGEyMSAqIGIxMyArIGEyMiAqIGIyMyArIGEyMyAqIGIzMyArIGEyNCAqIGI0MztcclxuXHRcdHRlWyAxMyBdID0gYTIxICogYjE0ICsgYTIyICogYjI0ICsgYTIzICogYjM0ICsgYTI0ICogYjQ0O1xyXG5cclxuXHRcdHRlWyAyIF0gPSBhMzEgKiBiMTEgKyBhMzIgKiBiMjEgKyBhMzMgKiBiMzEgKyBhMzQgKiBiNDE7XHJcblx0XHR0ZVsgNiBdID0gYTMxICogYjEyICsgYTMyICogYjIyICsgYTMzICogYjMyICsgYTM0ICogYjQyO1xyXG5cdFx0dGVbIDEwIF0gPSBhMzEgKiBiMTMgKyBhMzIgKiBiMjMgKyBhMzMgKiBiMzMgKyBhMzQgKiBiNDM7XHJcblx0XHR0ZVsgMTQgXSA9IGEzMSAqIGIxNCArIGEzMiAqIGIyNCArIGEzMyAqIGIzNCArIGEzNCAqIGI0NDtcclxuXHJcblx0XHR0ZVsgMyBdID0gYTQxICogYjExICsgYTQyICogYjIxICsgYTQzICogYjMxICsgYTQ0ICogYjQxO1xyXG5cdFx0dGVbIDcgXSA9IGE0MSAqIGIxMiArIGE0MiAqIGIyMiArIGE0MyAqIGIzMiArIGE0NCAqIGI0MjtcclxuXHRcdHRlWyAxMSBdID0gYTQxICogYjEzICsgYTQyICogYjIzICsgYTQzICogYjMzICsgYTQ0ICogYjQzO1xyXG5cdFx0dGVbIDE1IF0gPSBhNDEgKiBiMTQgKyBhNDIgKiBiMjQgKyBhNDMgKiBiMzQgKyBhNDQgKiBiNDQ7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTXVsdGlwbGllcyBldmVyeSBjb21wb25lbnQgb2YgdGhlIG1hdHJpeCBieSB0aGUgZ2l2ZW4gc2NhbGFyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHMgLSBUaGUgc2NhbGFyLlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdG11bHRpcGx5U2NhbGFyKCBzICkge1xyXG5cclxuXHRcdGNvbnN0IHRlID0gdGhpcy5lbGVtZW50cztcclxuXHJcblx0XHR0ZVsgMCBdICo9IHM7IHRlWyA0IF0gKj0gczsgdGVbIDggXSAqPSBzOyB0ZVsgMTIgXSAqPSBzO1xyXG5cdFx0dGVbIDEgXSAqPSBzOyB0ZVsgNSBdICo9IHM7IHRlWyA5IF0gKj0gczsgdGVbIDEzIF0gKj0gcztcclxuXHRcdHRlWyAyIF0gKj0gczsgdGVbIDYgXSAqPSBzOyB0ZVsgMTAgXSAqPSBzOyB0ZVsgMTQgXSAqPSBzO1xyXG5cdFx0dGVbIDMgXSAqPSBzOyB0ZVsgNyBdICo9IHM7IHRlWyAxMSBdICo9IHM7IHRlWyAxNSBdICo9IHM7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgYW5kIHJldHVybnMgdGhlIGRldGVybWluYW50IG9mIHRoaXMgbWF0cml4LlxyXG5cdCAqXHJcblx0ICogQmFzZWQgb24gdGhlIG1ldGhvZCBvdXRsaW5lZCBbaGVyZV17QGxpbmsgaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvYWxnZWJyYS9tYXRyaXgvZnVuY3Rpb25zL2ludmVyc2UvZm91ckQvaW5kZXguaHRtbH0uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBkZXRlcm1pbmFudC5cclxuXHQgKi9cclxuXHRkZXRlcm1pbmFudCgpIHtcclxuXHJcblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XHJcblxyXG5cdFx0Y29uc3QgbjExID0gdGVbIDAgXSwgbjEyID0gdGVbIDQgXSwgbjEzID0gdGVbIDggXSwgbjE0ID0gdGVbIDEyIF07XHJcblx0XHRjb25zdCBuMjEgPSB0ZVsgMSBdLCBuMjIgPSB0ZVsgNSBdLCBuMjMgPSB0ZVsgOSBdLCBuMjQgPSB0ZVsgMTMgXTtcclxuXHRcdGNvbnN0IG4zMSA9IHRlWyAyIF0sIG4zMiA9IHRlWyA2IF0sIG4zMyA9IHRlWyAxMCBdLCBuMzQgPSB0ZVsgMTQgXTtcclxuXHRcdGNvbnN0IG40MSA9IHRlWyAzIF0sIG40MiA9IHRlWyA3IF0sIG40MyA9IHRlWyAxMSBdLCBuNDQgPSB0ZVsgMTUgXTtcclxuXHJcblx0XHQvL1RPRE86IG1ha2UgdGhpcyBtb3JlIGVmZmljaWVudFxyXG5cclxuXHRcdHJldHVybiAoXHJcblx0XHRcdG40MSAqIChcclxuXHRcdFx0XHQrIG4xNCAqIG4yMyAqIG4zMlxyXG5cdFx0XHRcdCAtIG4xMyAqIG4yNCAqIG4zMlxyXG5cdFx0XHRcdCAtIG4xNCAqIG4yMiAqIG4zM1xyXG5cdFx0XHRcdCArIG4xMiAqIG4yNCAqIG4zM1xyXG5cdFx0XHRcdCArIG4xMyAqIG4yMiAqIG4zNFxyXG5cdFx0XHRcdCAtIG4xMiAqIG4yMyAqIG4zNFxyXG5cdFx0XHQpICtcclxuXHRcdFx0bjQyICogKFxyXG5cdFx0XHRcdCsgbjExICogbjIzICogbjM0XHJcblx0XHRcdFx0IC0gbjExICogbjI0ICogbjMzXHJcblx0XHRcdFx0ICsgbjE0ICogbjIxICogbjMzXHJcblx0XHRcdFx0IC0gbjEzICogbjIxICogbjM0XHJcblx0XHRcdFx0ICsgbjEzICogbjI0ICogbjMxXHJcblx0XHRcdFx0IC0gbjE0ICogbjIzICogbjMxXHJcblx0XHRcdCkgK1xyXG5cdFx0XHRuNDMgKiAoXHJcblx0XHRcdFx0KyBuMTEgKiBuMjQgKiBuMzJcclxuXHRcdFx0XHQgLSBuMTEgKiBuMjIgKiBuMzRcclxuXHRcdFx0XHQgLSBuMTQgKiBuMjEgKiBuMzJcclxuXHRcdFx0XHQgKyBuMTIgKiBuMjEgKiBuMzRcclxuXHRcdFx0XHQgKyBuMTQgKiBuMjIgKiBuMzFcclxuXHRcdFx0XHQgLSBuMTIgKiBuMjQgKiBuMzFcclxuXHRcdFx0KSArXHJcblx0XHRcdG40NCAqIChcclxuXHRcdFx0XHQtIG4xMyAqIG4yMiAqIG4zMVxyXG5cdFx0XHRcdCAtIG4xMSAqIG4yMyAqIG4zMlxyXG5cdFx0XHRcdCArIG4xMSAqIG4yMiAqIG4zM1xyXG5cdFx0XHRcdCArIG4xMyAqIG4yMSAqIG4zMlxyXG5cdFx0XHRcdCAtIG4xMiAqIG4yMSAqIG4zM1xyXG5cdFx0XHRcdCArIG4xMiAqIG4yMyAqIG4zMVxyXG5cdFx0XHQpXHJcblxyXG5cdFx0KTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUcmFuc3Bvc2VzIHRoaXMgbWF0cml4IGluIHBsYWNlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7TWF0cml4NH0gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0dHJhbnNwb3NlKCkge1xyXG5cclxuXHRcdGNvbnN0IHRlID0gdGhpcy5lbGVtZW50cztcclxuXHRcdGxldCB0bXA7XHJcblxyXG5cdFx0dG1wID0gdGVbIDEgXTsgdGVbIDEgXSA9IHRlWyA0IF07IHRlWyA0IF0gPSB0bXA7XHJcblx0XHR0bXAgPSB0ZVsgMiBdOyB0ZVsgMiBdID0gdGVbIDggXTsgdGVbIDggXSA9IHRtcDtcclxuXHRcdHRtcCA9IHRlWyA2IF07IHRlWyA2IF0gPSB0ZVsgOSBdOyB0ZVsgOSBdID0gdG1wO1xyXG5cclxuXHRcdHRtcCA9IHRlWyAzIF07IHRlWyAzIF0gPSB0ZVsgMTIgXTsgdGVbIDEyIF0gPSB0bXA7XHJcblx0XHR0bXAgPSB0ZVsgNyBdOyB0ZVsgNyBdID0gdGVbIDEzIF07IHRlWyAxMyBdID0gdG1wO1xyXG5cdFx0dG1wID0gdGVbIDExIF07IHRlWyAxMSBdID0gdGVbIDE0IF07IHRlWyAxNCBdID0gdG1wO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHBvc2l0aW9uIGNvbXBvbmVudCBmb3IgdGhpcyBtYXRyaXggZnJvbSB0aGUgZ2l2ZW4gdmVjdG9yLFxyXG5cdCAqIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSByZXN0IG9mIHRoZSBtYXRyaXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcnxWZWN0b3IzfSB4IC0gVGhlIHggY29tcG9uZW50IG9mIHRoZSB2ZWN0b3Igb3IgYWx0ZXJuYXRpdmVseSB0aGUgdmVjdG9yIG9iamVjdC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB5IGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB6IC0gVGhlIHogY29tcG9uZW50IG9mIHRoZSB2ZWN0b3IuXHJcblx0ICogQHJldHVybiB7TWF0cml4NH0gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0c2V0UG9zaXRpb24oIHgsIHksIHogKSB7XHJcblxyXG5cdFx0Y29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzO1xyXG5cclxuXHRcdGlmICggeC5pc1ZlY3RvcjMgKSB7XHJcblxyXG5cdFx0XHR0ZVsgMTIgXSA9IHgueDtcclxuXHRcdFx0dGVbIDEzIF0gPSB4Lnk7XHJcblx0XHRcdHRlWyAxNCBdID0geC56O1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR0ZVsgMTIgXSA9IHg7XHJcblx0XHRcdHRlWyAxMyBdID0geTtcclxuXHRcdFx0dGVbIDE0IF0gPSB6O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJbnZlcnRzIHRoaXMgbWF0cml4LCB1c2luZyB0aGUgW2FuYWx5dGljIG1ldGhvZF17QGxpbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSW52ZXJ0aWJsZV9tYXRyaXgjQW5hbHl0aWNfc29sdXRpb259LlxyXG5cdCAqIFlvdSBjYW4gbm90IGludmVydCB3aXRoIGEgZGV0ZXJtaW5hbnQgb2YgemVyby4gSWYgeW91IGF0dGVtcHQgdGhpcywgdGhlIG1ldGhvZCBwcm9kdWNlc1xyXG5cdCAqIGEgemVybyBtYXRyaXggaW5zdGVhZC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdGludmVydCgpIHtcclxuXHJcblx0XHQvLyBiYXNlZCBvbiBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9hbGdlYnJhL21hdHJpeC9mdW5jdGlvbnMvaW52ZXJzZS9mb3VyRC9pbmRleC5odG1cclxuXHRcdGNvbnN0IHRlID0gdGhpcy5lbGVtZW50cyxcclxuXHJcblx0XHRcdG4xMSA9IHRlWyAwIF0sIG4yMSA9IHRlWyAxIF0sIG4zMSA9IHRlWyAyIF0sIG40MSA9IHRlWyAzIF0sXHJcblx0XHRcdG4xMiA9IHRlWyA0IF0sIG4yMiA9IHRlWyA1IF0sIG4zMiA9IHRlWyA2IF0sIG40MiA9IHRlWyA3IF0sXHJcblx0XHRcdG4xMyA9IHRlWyA4IF0sIG4yMyA9IHRlWyA5IF0sIG4zMyA9IHRlWyAxMCBdLCBuNDMgPSB0ZVsgMTEgXSxcclxuXHRcdFx0bjE0ID0gdGVbIDEyIF0sIG4yNCA9IHRlWyAxMyBdLCBuMzQgPSB0ZVsgMTQgXSwgbjQ0ID0gdGVbIDE1IF0sXHJcblxyXG5cdFx0XHR0MTEgPSBuMjMgKiBuMzQgKiBuNDIgLSBuMjQgKiBuMzMgKiBuNDIgKyBuMjQgKiBuMzIgKiBuNDMgLSBuMjIgKiBuMzQgKiBuNDMgLSBuMjMgKiBuMzIgKiBuNDQgKyBuMjIgKiBuMzMgKiBuNDQsXHJcblx0XHRcdHQxMiA9IG4xNCAqIG4zMyAqIG40MiAtIG4xMyAqIG4zNCAqIG40MiAtIG4xNCAqIG4zMiAqIG40MyArIG4xMiAqIG4zNCAqIG40MyArIG4xMyAqIG4zMiAqIG40NCAtIG4xMiAqIG4zMyAqIG40NCxcclxuXHRcdFx0dDEzID0gbjEzICogbjI0ICogbjQyIC0gbjE0ICogbjIzICogbjQyICsgbjE0ICogbjIyICogbjQzIC0gbjEyICogbjI0ICogbjQzIC0gbjEzICogbjIyICogbjQ0ICsgbjEyICogbjIzICogbjQ0LFxyXG5cdFx0XHR0MTQgPSBuMTQgKiBuMjMgKiBuMzIgLSBuMTMgKiBuMjQgKiBuMzIgLSBuMTQgKiBuMjIgKiBuMzMgKyBuMTIgKiBuMjQgKiBuMzMgKyBuMTMgKiBuMjIgKiBuMzQgLSBuMTIgKiBuMjMgKiBuMzQ7XHJcblxyXG5cdFx0Y29uc3QgZGV0ID0gbjExICogdDExICsgbjIxICogdDEyICsgbjMxICogdDEzICsgbjQxICogdDE0O1xyXG5cclxuXHRcdGlmICggZGV0ID09PSAwICkgcmV0dXJuIHRoaXMuc2V0KCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwICk7XHJcblxyXG5cdFx0Y29uc3QgZGV0SW52ID0gMSAvIGRldDtcclxuXHJcblx0XHR0ZVsgMCBdID0gdDExICogZGV0SW52O1xyXG5cdFx0dGVbIDEgXSA9ICggbjI0ICogbjMzICogbjQxIC0gbjIzICogbjM0ICogbjQxIC0gbjI0ICogbjMxICogbjQzICsgbjIxICogbjM0ICogbjQzICsgbjIzICogbjMxICogbjQ0IC0gbjIxICogbjMzICogbjQ0ICkgKiBkZXRJbnY7XHJcblx0XHR0ZVsgMiBdID0gKCBuMjIgKiBuMzQgKiBuNDEgLSBuMjQgKiBuMzIgKiBuNDEgKyBuMjQgKiBuMzEgKiBuNDIgLSBuMjEgKiBuMzQgKiBuNDIgLSBuMjIgKiBuMzEgKiBuNDQgKyBuMjEgKiBuMzIgKiBuNDQgKSAqIGRldEludjtcclxuXHRcdHRlWyAzIF0gPSAoIG4yMyAqIG4zMiAqIG40MSAtIG4yMiAqIG4zMyAqIG40MSAtIG4yMyAqIG4zMSAqIG40MiArIG4yMSAqIG4zMyAqIG40MiArIG4yMiAqIG4zMSAqIG40MyAtIG4yMSAqIG4zMiAqIG40MyApICogZGV0SW52O1xyXG5cclxuXHRcdHRlWyA0IF0gPSB0MTIgKiBkZXRJbnY7XHJcblx0XHR0ZVsgNSBdID0gKCBuMTMgKiBuMzQgKiBuNDEgLSBuMTQgKiBuMzMgKiBuNDEgKyBuMTQgKiBuMzEgKiBuNDMgLSBuMTEgKiBuMzQgKiBuNDMgLSBuMTMgKiBuMzEgKiBuNDQgKyBuMTEgKiBuMzMgKiBuNDQgKSAqIGRldEludjtcclxuXHRcdHRlWyA2IF0gPSAoIG4xNCAqIG4zMiAqIG40MSAtIG4xMiAqIG4zNCAqIG40MSAtIG4xNCAqIG4zMSAqIG40MiArIG4xMSAqIG4zNCAqIG40MiArIG4xMiAqIG4zMSAqIG40NCAtIG4xMSAqIG4zMiAqIG40NCApICogZGV0SW52O1xyXG5cdFx0dGVbIDcgXSA9ICggbjEyICogbjMzICogbjQxIC0gbjEzICogbjMyICogbjQxICsgbjEzICogbjMxICogbjQyIC0gbjExICogbjMzICogbjQyIC0gbjEyICogbjMxICogbjQzICsgbjExICogbjMyICogbjQzICkgKiBkZXRJbnY7XHJcblxyXG5cdFx0dGVbIDggXSA9IHQxMyAqIGRldEludjtcclxuXHRcdHRlWyA5IF0gPSAoIG4xNCAqIG4yMyAqIG40MSAtIG4xMyAqIG4yNCAqIG40MSAtIG4xNCAqIG4yMSAqIG40MyArIG4xMSAqIG4yNCAqIG40MyArIG4xMyAqIG4yMSAqIG40NCAtIG4xMSAqIG4yMyAqIG40NCApICogZGV0SW52O1xyXG5cdFx0dGVbIDEwIF0gPSAoIG4xMiAqIG4yNCAqIG40MSAtIG4xNCAqIG4yMiAqIG40MSArIG4xNCAqIG4yMSAqIG40MiAtIG4xMSAqIG4yNCAqIG40MiAtIG4xMiAqIG4yMSAqIG40NCArIG4xMSAqIG4yMiAqIG40NCApICogZGV0SW52O1xyXG5cdFx0dGVbIDExIF0gPSAoIG4xMyAqIG4yMiAqIG40MSAtIG4xMiAqIG4yMyAqIG40MSAtIG4xMyAqIG4yMSAqIG40MiArIG4xMSAqIG4yMyAqIG40MiArIG4xMiAqIG4yMSAqIG40MyAtIG4xMSAqIG4yMiAqIG40MyApICogZGV0SW52O1xyXG5cclxuXHRcdHRlWyAxMiBdID0gdDE0ICogZGV0SW52O1xyXG5cdFx0dGVbIDEzIF0gPSAoIG4xMyAqIG4yNCAqIG4zMSAtIG4xNCAqIG4yMyAqIG4zMSArIG4xNCAqIG4yMSAqIG4zMyAtIG4xMSAqIG4yNCAqIG4zMyAtIG4xMyAqIG4yMSAqIG4zNCArIG4xMSAqIG4yMyAqIG4zNCApICogZGV0SW52O1xyXG5cdFx0dGVbIDE0IF0gPSAoIG4xNCAqIG4yMiAqIG4zMSAtIG4xMiAqIG4yNCAqIG4zMSAtIG4xNCAqIG4yMSAqIG4zMiArIG4xMSAqIG4yNCAqIG4zMiArIG4xMiAqIG4yMSAqIG4zNCAtIG4xMSAqIG4yMiAqIG4zNCApICogZGV0SW52O1xyXG5cdFx0dGVbIDE1IF0gPSAoIG4xMiAqIG4yMyAqIG4zMSAtIG4xMyAqIG4yMiAqIG4zMSArIG4xMyAqIG4yMSAqIG4zMiAtIG4xMSAqIG4yMyAqIG4zMiAtIG4xMiAqIG4yMSAqIG4zMyArIG4xMSAqIG4yMiAqIG4zMyApICogZGV0SW52O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE11bHRpcGxpZXMgdGhlIGNvbHVtbnMgb2YgdGhpcyBtYXRyaXggYnkgdGhlIGdpdmVuIHZlY3Rvci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdiAtIFRoZSBzY2FsZSB2ZWN0b3IuXHJcblx0ICogQHJldHVybiB7TWF0cml4NH0gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0c2NhbGUoIHYgKSB7XHJcblxyXG5cdFx0Y29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzO1xyXG5cdFx0Y29uc3QgeCA9IHYueCwgeSA9IHYueSwgeiA9IHYuejtcclxuXHJcblx0XHR0ZVsgMCBdICo9IHg7IHRlWyA0IF0gKj0geTsgdGVbIDggXSAqPSB6O1xyXG5cdFx0dGVbIDEgXSAqPSB4OyB0ZVsgNSBdICo9IHk7IHRlWyA5IF0gKj0gejtcclxuXHRcdHRlWyAyIF0gKj0geDsgdGVbIDYgXSAqPSB5OyB0ZVsgMTAgXSAqPSB6O1xyXG5cdFx0dGVbIDMgXSAqPSB4OyB0ZVsgNyBdICo9IHk7IHRlWyAxMSBdICo9IHo7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2V0cyB0aGUgbWF4aW11bSBzY2FsZSB2YWx1ZSBvZiB0aGUgdGhyZWUgYXhlcy5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIG1heGltdW0gc2NhbGUuXHJcblx0ICovXHJcblx0Z2V0TWF4U2NhbGVPbkF4aXMoKSB7XHJcblxyXG5cdFx0Y29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzO1xyXG5cclxuXHRcdGNvbnN0IHNjYWxlWFNxID0gdGVbIDAgXSAqIHRlWyAwIF0gKyB0ZVsgMSBdICogdGVbIDEgXSArIHRlWyAyIF0gKiB0ZVsgMiBdO1xyXG5cdFx0Y29uc3Qgc2NhbGVZU3EgPSB0ZVsgNCBdICogdGVbIDQgXSArIHRlWyA1IF0gKiB0ZVsgNSBdICsgdGVbIDYgXSAqIHRlWyA2IF07XHJcblx0XHRjb25zdCBzY2FsZVpTcSA9IHRlWyA4IF0gKiB0ZVsgOCBdICsgdGVbIDkgXSAqIHRlWyA5IF0gKyB0ZVsgMTAgXSAqIHRlWyAxMCBdO1xyXG5cclxuXHRcdHJldHVybiBNYXRoLnNxcnQoIE1hdGgubWF4KCBzY2FsZVhTcSwgc2NhbGVZU3EsIHNjYWxlWlNxICkgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoaXMgbWF0cml4IGFzIGEgdHJhbnNsYXRpb24gdHJhbnNmb3JtIGZyb20gdGhlIGdpdmVuIHZlY3Rvci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfFZlY3RvcjN9IHggLSBUaGUgYW1vdW50IHRvIHRyYW5zbGF0ZSBpbiB0aGUgWCBheGlzIG9yIGFsdGVybmF0aXZlbHkgYSB0cmFuc2xhdGlvbiB2ZWN0b3IuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgYW1vdW50IHRvIHRyYW5zbGF0ZSBpbiB0aGUgWSBheGlzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB6IC0gVGhlIGFtb3VudCB0byB0cmFuc2xhdGUgaW4gdGhlIHogYXhpcy5cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXg0fSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRtYWtlVHJhbnNsYXRpb24oIHgsIHksIHogKSB7XHJcblxyXG5cdFx0aWYgKCB4LmlzVmVjdG9yMyApIHtcclxuXHJcblx0XHRcdHRoaXMuc2V0KFxyXG5cclxuXHRcdFx0XHQxLCAwLCAwLCB4LngsXHJcblx0XHRcdFx0MCwgMSwgMCwgeC55LFxyXG5cdFx0XHRcdDAsIDAsIDEsIHgueixcclxuXHRcdFx0XHQwLCAwLCAwLCAxXHJcblxyXG5cdFx0XHQpO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR0aGlzLnNldChcclxuXHJcblx0XHRcdFx0MSwgMCwgMCwgeCxcclxuXHRcdFx0XHQwLCAxLCAwLCB5LFxyXG5cdFx0XHRcdDAsIDAsIDEsIHosXHJcblx0XHRcdFx0MCwgMCwgMCwgMVxyXG5cclxuXHRcdFx0KTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGlzIG1hdHJpeCBhcyBhIHJvdGF0aW9uYWwgdHJhbnNmb3JtYXRpb24gYXJvdW5kIHRoZSBYIGF4aXMgYnlcclxuXHQgKiB0aGUgZ2l2ZW4gYW5nbGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdGhldGEgLSBUaGUgcm90YXRpb24gaW4gcmFkaWFucy5cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXg0fSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRtYWtlUm90YXRpb25YKCB0aGV0YSApIHtcclxuXHJcblx0XHRjb25zdCBjID0gTWF0aC5jb3MoIHRoZXRhICksIHMgPSBNYXRoLnNpbiggdGhldGEgKTtcclxuXHJcblx0XHR0aGlzLnNldChcclxuXHJcblx0XHRcdDEsIDAsIDAsIDAsXHJcblx0XHRcdDAsIGMsIC0gcywgMCxcclxuXHRcdFx0MCwgcywgYywgMCxcclxuXHRcdFx0MCwgMCwgMCwgMVxyXG5cclxuXHRcdCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGlzIG1hdHJpeCBhcyBhIHJvdGF0aW9uYWwgdHJhbnNmb3JtYXRpb24gYXJvdW5kIHRoZSBZIGF4aXMgYnlcclxuXHQgKiB0aGUgZ2l2ZW4gYW5nbGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdGhldGEgLSBUaGUgcm90YXRpb24gaW4gcmFkaWFucy5cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXg0fSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRtYWtlUm90YXRpb25ZKCB0aGV0YSApIHtcclxuXHJcblx0XHRjb25zdCBjID0gTWF0aC5jb3MoIHRoZXRhICksIHMgPSBNYXRoLnNpbiggdGhldGEgKTtcclxuXHJcblx0XHR0aGlzLnNldChcclxuXHJcblx0XHRcdCBjLCAwLCBzLCAwLFxyXG5cdFx0XHQgMCwgMSwgMCwgMCxcclxuXHRcdFx0LSBzLCAwLCBjLCAwLFxyXG5cdFx0XHQgMCwgMCwgMCwgMVxyXG5cclxuXHRcdCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGlzIG1hdHJpeCBhcyBhIHJvdGF0aW9uYWwgdHJhbnNmb3JtYXRpb24gYXJvdW5kIHRoZSBaIGF4aXMgYnlcclxuXHQgKiB0aGUgZ2l2ZW4gYW5nbGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdGhldGEgLSBUaGUgcm90YXRpb24gaW4gcmFkaWFucy5cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXg0fSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRtYWtlUm90YXRpb25aKCB0aGV0YSApIHtcclxuXHJcblx0XHRjb25zdCBjID0gTWF0aC5jb3MoIHRoZXRhICksIHMgPSBNYXRoLnNpbiggdGhldGEgKTtcclxuXHJcblx0XHR0aGlzLnNldChcclxuXHJcblx0XHRcdGMsIC0gcywgMCwgMCxcclxuXHRcdFx0cywgYywgMCwgMCxcclxuXHRcdFx0MCwgMCwgMSwgMCxcclxuXHRcdFx0MCwgMCwgMCwgMVxyXG5cclxuXHRcdCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGlzIG1hdHJpeCBhcyBhIHJvdGF0aW9uYWwgdHJhbnNmb3JtYXRpb24gYXJvdW5kIHRoZSBnaXZlbiBheGlzIGJ5XHJcblx0ICogdGhlIGdpdmVuIGFuZ2xlLlxyXG5cdCAqXHJcblx0ICogVGhpcyBpcyBhIHNvbWV3aGF0IGNvbnRyb3ZlcnNpYWwgYnV0IG1hdGhlbWF0aWNhbGx5IHNvdW5kIGFsdGVybmF0aXZlIHRvXHJcblx0ICogcm90YXRpbmcgdmlhIFF1YXRlcm5pb25zLiBTZWUgdGhlIGRpc2N1c3Npb24gW2hlcmVde0BsaW5rIGh0dHBzOi8vd3d3LmdhbWVkZXYubmV0L2FydGljbGVzL3Byb2dyYW1taW5nL21hdGgtYW5kLXBoeXNpY3MvZG8td2UtcmVhbGx5LW5lZWQtcXVhdGVybmlvbnMtcjExOTl9LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBheGlzIC0gVGhlIG5vcm1hbGl6ZWQgcm90YXRpb24gYXhpcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYW5nbGUgLSBUaGUgcm90YXRpb24gaW4gcmFkaWFucy5cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXg0fSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRtYWtlUm90YXRpb25BeGlzKCBheGlzLCBhbmdsZSApIHtcclxuXHJcblx0XHQvLyBCYXNlZCBvbiBodHRwOi8vd3d3LmdhbWVkZXYubmV0L3JlZmVyZW5jZS9hcnRpY2xlcy9hcnRpY2xlMTE5OS5hc3BcclxuXHJcblx0XHRjb25zdCBjID0gTWF0aC5jb3MoIGFuZ2xlICk7XHJcblx0XHRjb25zdCBzID0gTWF0aC5zaW4oIGFuZ2xlICk7XHJcblx0XHRjb25zdCB0ID0gMSAtIGM7XHJcblx0XHRjb25zdCB4ID0gYXhpcy54LCB5ID0gYXhpcy55LCB6ID0gYXhpcy56O1xyXG5cdFx0Y29uc3QgdHggPSB0ICogeCwgdHkgPSB0ICogeTtcclxuXHJcblx0XHR0aGlzLnNldChcclxuXHJcblx0XHRcdHR4ICogeCArIGMsIHR4ICogeSAtIHMgKiB6LCB0eCAqIHogKyBzICogeSwgMCxcclxuXHRcdFx0dHggKiB5ICsgcyAqIHosIHR5ICogeSArIGMsIHR5ICogeiAtIHMgKiB4LCAwLFxyXG5cdFx0XHR0eCAqIHogLSBzICogeSwgdHkgKiB6ICsgcyAqIHgsIHQgKiB6ICogeiArIGMsIDAsXHJcblx0XHRcdDAsIDAsIDAsIDFcclxuXHJcblx0XHQpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhpcyBtYXRyaXggYXMgYSBzY2FsZSB0cmFuc2Zvcm1hdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGFtb3VudCB0byBzY2FsZSBpbiB0aGUgWCBheGlzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIGFtb3VudCB0byBzY2FsZSBpbiB0aGUgWSBheGlzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB6IC0gVGhlIGFtb3VudCB0byBzY2FsZSBpbiB0aGUgWiBheGlzLlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdG1ha2VTY2FsZSggeCwgeSwgeiApIHtcclxuXHJcblx0XHR0aGlzLnNldChcclxuXHJcblx0XHRcdHgsIDAsIDAsIDAsXHJcblx0XHRcdDAsIHksIDAsIDAsXHJcblx0XHRcdDAsIDAsIHosIDAsXHJcblx0XHRcdDAsIDAsIDAsIDFcclxuXHJcblx0XHQpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhpcyBtYXRyaXggYXMgYSBzaGVhciB0cmFuc2Zvcm1hdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB4eSAtIFRoZSBhbW91bnQgdG8gc2hlYXIgWCBieSBZLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB4eiAtIFRoZSBhbW91bnQgdG8gc2hlYXIgWCBieSBaLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB5eCAtIFRoZSBhbW91bnQgdG8gc2hlYXIgWSBieSBYLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB5eiAtIFRoZSBhbW91bnQgdG8gc2hlYXIgWSBieSBaLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB6eCAtIFRoZSBhbW91bnQgdG8gc2hlYXIgWiBieSBYLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB6eSAtIFRoZSBhbW91bnQgdG8gc2hlYXIgWiBieSBZLlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdG1ha2VTaGVhciggeHksIHh6LCB5eCwgeXosIHp4LCB6eSApIHtcclxuXHJcblx0XHR0aGlzLnNldChcclxuXHJcblx0XHRcdDEsIHl4LCB6eCwgMCxcclxuXHRcdFx0eHksIDEsIHp5LCAwLFxyXG5cdFx0XHR4eiwgeXosIDEsIDAsXHJcblx0XHRcdDAsIDAsIDAsIDFcclxuXHJcblx0XHQpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhpcyBtYXRyaXggdG8gdGhlIHRyYW5zZm9ybWF0aW9uIGNvbXBvc2VkIG9mIHRoZSBnaXZlbiBwb3NpdGlvbixcclxuXHQgKiByb3RhdGlvbiAoUXVhdGVybmlvbikgYW5kIHNjYWxlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBwb3NpdGlvbiAtIFRoZSBwb3NpdGlvbiB2ZWN0b3IuXHJcblx0ICogQHBhcmFtIHtRdWF0ZXJuaW9ufSBxdWF0ZXJuaW9uIC0gVGhlIHJvdGF0aW9uIGFzIGEgUXVhdGVybmlvbi5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHNjYWxlIC0gVGhlIHNjYWxlIHZlY3Rvci5cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXg0fSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRjb21wb3NlKCBwb3NpdGlvbiwgcXVhdGVybmlvbiwgc2NhbGUgKSB7XHJcblxyXG5cdFx0Y29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzO1xyXG5cclxuXHRcdGNvbnN0IHggPSBxdWF0ZXJuaW9uLl94LCB5ID0gcXVhdGVybmlvbi5feSwgeiA9IHF1YXRlcm5pb24uX3osIHcgPSBxdWF0ZXJuaW9uLl93O1xyXG5cdFx0Y29uc3QgeDIgPSB4ICsgeCxcdHkyID0geSArIHksIHoyID0geiArIHo7XHJcblx0XHRjb25zdCB4eCA9IHggKiB4MiwgeHkgPSB4ICogeTIsIHh6ID0geCAqIHoyO1xyXG5cdFx0Y29uc3QgeXkgPSB5ICogeTIsIHl6ID0geSAqIHoyLCB6eiA9IHogKiB6MjtcclxuXHRcdGNvbnN0IHd4ID0gdyAqIHgyLCB3eSA9IHcgKiB5Miwgd3ogPSB3ICogejI7XHJcblxyXG5cdFx0Y29uc3Qgc3ggPSBzY2FsZS54LCBzeSA9IHNjYWxlLnksIHN6ID0gc2NhbGUuejtcclxuXHJcblx0XHR0ZVsgMCBdID0gKCAxIC0gKCB5eSArIHp6ICkgKSAqIHN4O1xyXG5cdFx0dGVbIDEgXSA9ICggeHkgKyB3eiApICogc3g7XHJcblx0XHR0ZVsgMiBdID0gKCB4eiAtIHd5ICkgKiBzeDtcclxuXHRcdHRlWyAzIF0gPSAwO1xyXG5cclxuXHRcdHRlWyA0IF0gPSAoIHh5IC0gd3ogKSAqIHN5O1xyXG5cdFx0dGVbIDUgXSA9ICggMSAtICggeHggKyB6eiApICkgKiBzeTtcclxuXHRcdHRlWyA2IF0gPSAoIHl6ICsgd3ggKSAqIHN5O1xyXG5cdFx0dGVbIDcgXSA9IDA7XHJcblxyXG5cdFx0dGVbIDggXSA9ICggeHogKyB3eSApICogc3o7XHJcblx0XHR0ZVsgOSBdID0gKCB5eiAtIHd4ICkgKiBzejtcclxuXHRcdHRlWyAxMCBdID0gKCAxIC0gKCB4eCArIHl5ICkgKSAqIHN6O1xyXG5cdFx0dGVbIDExIF0gPSAwO1xyXG5cclxuXHRcdHRlWyAxMiBdID0gcG9zaXRpb24ueDtcclxuXHRcdHRlWyAxMyBdID0gcG9zaXRpb24ueTtcclxuXHRcdHRlWyAxNCBdID0gcG9zaXRpb24uejtcclxuXHRcdHRlWyAxNSBdID0gMTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWNvbXBvc2VzIHRoaXMgbWF0cml4IGludG8gaXRzIHBvc2l0aW9uLCByb3RhdGlvbiBhbmQgc2NhbGUgY29tcG9uZW50c1xyXG5cdCAqIGFuZCBwcm92aWRlcyB0aGUgcmVzdWx0IGluIHRoZSBnaXZlbiBvYmplY3RzLlxyXG5cdCAqXHJcblx0ICogTm90ZTogTm90IGFsbCBtYXRyaWNlcyBhcmUgZGVjb21wb3NhYmxlIGluIHRoaXMgd2F5LiBGb3IgZXhhbXBsZSwgaWYgYW5cclxuXHQgKiBvYmplY3QgaGFzIGEgbm9uLXVuaWZvcm1seSBzY2FsZWQgcGFyZW50LCB0aGVuIHRoZSBvYmplY3QncyB3b3JsZCBtYXRyaXhcclxuXHQgKiBtYXkgbm90IGJlIGRlY29tcG9zYWJsZSwgYW5kIHRoaXMgbWV0aG9kIG1heSBub3QgYmUgYXBwcm9wcmlhdGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHBvc2l0aW9uIC0gVGhlIHBvc2l0aW9uIHZlY3Rvci5cclxuXHQgKiBAcGFyYW0ge1F1YXRlcm5pb259IHF1YXRlcm5pb24gLSBUaGUgcm90YXRpb24gYXMgYSBRdWF0ZXJuaW9uLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gc2NhbGUgLSBUaGUgc2NhbGUgdmVjdG9yLlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdGRlY29tcG9zZSggcG9zaXRpb24sIHF1YXRlcm5pb24sIHNjYWxlICkge1xyXG5cclxuXHRcdGNvbnN0IHRlID0gdGhpcy5lbGVtZW50cztcclxuXHJcblx0XHRsZXQgc3ggPSBfdjEuc2V0KCB0ZVsgMCBdLCB0ZVsgMSBdLCB0ZVsgMiBdICkubGVuZ3RoKCk7XHJcblx0XHRjb25zdCBzeSA9IF92MS5zZXQoIHRlWyA0IF0sIHRlWyA1IF0sIHRlWyA2IF0gKS5sZW5ndGgoKTtcclxuXHRcdGNvbnN0IHN6ID0gX3YxLnNldCggdGVbIDggXSwgdGVbIDkgXSwgdGVbIDEwIF0gKS5sZW5ndGgoKTtcclxuXHJcblx0XHQvLyBpZiBkZXRlcm1pbmUgaXMgbmVnYXRpdmUsIHdlIG5lZWQgdG8gaW52ZXJ0IG9uZSBzY2FsZVxyXG5cdFx0Y29uc3QgZGV0ID0gdGhpcy5kZXRlcm1pbmFudCgpO1xyXG5cdFx0aWYgKCBkZXQgPCAwICkgc3ggPSAtIHN4O1xyXG5cclxuXHRcdHBvc2l0aW9uLnggPSB0ZVsgMTIgXTtcclxuXHRcdHBvc2l0aW9uLnkgPSB0ZVsgMTMgXTtcclxuXHRcdHBvc2l0aW9uLnogPSB0ZVsgMTQgXTtcclxuXHJcblx0XHQvLyBzY2FsZSB0aGUgcm90YXRpb24gcGFydFxyXG5cdFx0X20xLmNvcHkoIHRoaXMgKTtcclxuXHJcblx0XHRjb25zdCBpbnZTWCA9IDEgLyBzeDtcclxuXHRcdGNvbnN0IGludlNZID0gMSAvIHN5O1xyXG5cdFx0Y29uc3QgaW52U1ogPSAxIC8gc3o7XHJcblxyXG5cdFx0X20xLmVsZW1lbnRzWyAwIF0gKj0gaW52U1g7XHJcblx0XHRfbTEuZWxlbWVudHNbIDEgXSAqPSBpbnZTWDtcclxuXHRcdF9tMS5lbGVtZW50c1sgMiBdICo9IGludlNYO1xyXG5cclxuXHRcdF9tMS5lbGVtZW50c1sgNCBdICo9IGludlNZO1xyXG5cdFx0X20xLmVsZW1lbnRzWyA1IF0gKj0gaW52U1k7XHJcblx0XHRfbTEuZWxlbWVudHNbIDYgXSAqPSBpbnZTWTtcclxuXHJcblx0XHRfbTEuZWxlbWVudHNbIDggXSAqPSBpbnZTWjtcclxuXHRcdF9tMS5lbGVtZW50c1sgOSBdICo9IGludlNaO1xyXG5cdFx0X20xLmVsZW1lbnRzWyAxMCBdICo9IGludlNaO1xyXG5cclxuXHRcdHF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KCBfbTEgKTtcclxuXHJcblx0XHRzY2FsZS54ID0gc3g7XHJcblx0XHRzY2FsZS55ID0gc3k7XHJcblx0XHRzY2FsZS56ID0gc3o7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyBhIHBlcnNwZWN0aXZlIHByb2plY3Rpb24gbWF0cml4LiBUaGlzIGlzIHVzZWQgaW50ZXJuYWxseSBieVxyXG5cdCAqIHtAbGluayBQZXJzcGVjdGl2ZUNhbWVyYSN1cGRhdGVQcm9qZWN0aW9uTWF0cml4fS5cclxuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGxlZnQgLSBMZWZ0IGJvdW5kYXJ5IG9mIHRoZSB2aWV3aW5nIGZydXN0dW0gYXQgdGhlIG5lYXIgcGxhbmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHJpZ2h0IC0gUmlnaHQgYm91bmRhcnkgb2YgdGhlIHZpZXdpbmcgZnJ1c3R1bSBhdCB0aGUgbmVhciBwbGFuZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdG9wIC0gVG9wIGJvdW5kYXJ5IG9mIHRoZSB2aWV3aW5nIGZydXN0dW0gYXQgdGhlIG5lYXIgcGxhbmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGJvdHRvbSAtIEJvdHRvbSBib3VuZGFyeSBvZiB0aGUgdmlld2luZyBmcnVzdHVtIGF0IHRoZSBuZWFyIHBsYW5lLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBuZWFyIC0gVGhlIGRpc3RhbmNlIGZyb20gdGhlIGNhbWVyYSB0byB0aGUgbmVhciBwbGFuZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZmFyIC0gVGhlIGRpc3RhbmNlIGZyb20gdGhlIGNhbWVyYSB0byB0aGUgZmFyIHBsYW5lLlxyXG5cdCAqIEBwYXJhbSB7KFdlYkdMQ29vcmRpbmF0ZVN5c3RlbXxXZWJHUFVDb29yZGluYXRlU3lzdGVtKX0gW2Nvb3JkaW5hdGVTeXN0ZW09V2ViR0xDb29yZGluYXRlU3lzdGVtXSAtIFRoZSBjb29yZGluYXRlIHN5c3RlbS5cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXg0fSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRtYWtlUGVyc3BlY3RpdmUoIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSwgbmVhciwgZmFyLCBjb29yZGluYXRlU3lzdGVtID0gV2ViR0xDb29yZGluYXRlU3lzdGVtICkge1xyXG5cclxuXHRcdGNvbnN0IHRlID0gdGhpcy5lbGVtZW50cztcclxuXHRcdGNvbnN0IHggPSAyICogbmVhciAvICggcmlnaHQgLSBsZWZ0ICk7XHJcblx0XHRjb25zdCB5ID0gMiAqIG5lYXIgLyAoIHRvcCAtIGJvdHRvbSApO1xyXG5cclxuXHRcdGNvbnN0IGEgPSAoIHJpZ2h0ICsgbGVmdCApIC8gKCByaWdodCAtIGxlZnQgKTtcclxuXHRcdGNvbnN0IGIgPSAoIHRvcCArIGJvdHRvbSApIC8gKCB0b3AgLSBib3R0b20gKTtcclxuXHJcblx0XHRsZXQgYywgZDtcclxuXHJcblx0XHRpZiAoIGNvb3JkaW5hdGVTeXN0ZW0gPT09IFdlYkdMQ29vcmRpbmF0ZVN5c3RlbSApIHtcclxuXHJcblx0XHRcdGMgPSAtICggZmFyICsgbmVhciApIC8gKCBmYXIgLSBuZWFyICk7XHJcblx0XHRcdGQgPSAoIC0gMiAqIGZhciAqIG5lYXIgKSAvICggZmFyIC0gbmVhciApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGNvb3JkaW5hdGVTeXN0ZW0gPT09IFdlYkdQVUNvb3JkaW5hdGVTeXN0ZW0gKSB7XHJcblxyXG5cdFx0XHRjID0gLSBmYXIgLyAoIGZhciAtIG5lYXIgKTtcclxuXHRcdFx0ZCA9ICggLSBmYXIgKiBuZWFyICkgLyAoIGZhciAtIG5lYXIgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuTWF0cml4NC5tYWtlUGVyc3BlY3RpdmUoKTogSW52YWxpZCBjb29yZGluYXRlIHN5c3RlbTogJyArIGNvb3JkaW5hdGVTeXN0ZW0gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGVbIDAgXSA9IHg7XHR0ZVsgNCBdID0gMDtcdHRlWyA4IF0gPSBhOyBcdHRlWyAxMiBdID0gMDtcclxuXHRcdHRlWyAxIF0gPSAwO1x0dGVbIDUgXSA9IHk7XHR0ZVsgOSBdID0gYjsgXHR0ZVsgMTMgXSA9IDA7XHJcblx0XHR0ZVsgMiBdID0gMDtcdHRlWyA2IF0gPSAwO1x0dGVbIDEwIF0gPSBjOyBcdHRlWyAxNCBdID0gZDtcclxuXHRcdHRlWyAzIF0gPSAwO1x0dGVbIDcgXSA9IDA7XHR0ZVsgMTEgXSA9IC0gMTtcdHRlWyAxNSBdID0gMDtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGEgb3J0aG9ncmFwaGljIHByb2plY3Rpb24gbWF0cml4LiBUaGlzIGlzIHVzZWQgaW50ZXJuYWxseSBieVxyXG5cdCAqIHtAbGluayBPcnRob2dyYXBoaWNDYW1lcmEjdXBkYXRlUHJvamVjdGlvbk1hdHJpeH0uXHJcblxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBsZWZ0IC0gTGVmdCBib3VuZGFyeSBvZiB0aGUgdmlld2luZyBmcnVzdHVtIGF0IHRoZSBuZWFyIHBsYW5lLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSByaWdodCAtIFJpZ2h0IGJvdW5kYXJ5IG9mIHRoZSB2aWV3aW5nIGZydXN0dW0gYXQgdGhlIG5lYXIgcGxhbmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHRvcCAtIFRvcCBib3VuZGFyeSBvZiB0aGUgdmlld2luZyBmcnVzdHVtIGF0IHRoZSBuZWFyIHBsYW5lLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBib3R0b20gLSBCb3R0b20gYm91bmRhcnkgb2YgdGhlIHZpZXdpbmcgZnJ1c3R1bSBhdCB0aGUgbmVhciBwbGFuZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbmVhciAtIFRoZSBkaXN0YW5jZSBmcm9tIHRoZSBjYW1lcmEgdG8gdGhlIG5lYXIgcGxhbmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGZhciAtIFRoZSBkaXN0YW5jZSBmcm9tIHRoZSBjYW1lcmEgdG8gdGhlIGZhciBwbGFuZS5cclxuXHQgKiBAcGFyYW0geyhXZWJHTENvb3JkaW5hdGVTeXN0ZW18V2ViR1BVQ29vcmRpbmF0ZVN5c3RlbSl9IFtjb29yZGluYXRlU3lzdGVtPVdlYkdMQ29vcmRpbmF0ZVN5c3RlbV0gLSBUaGUgY29vcmRpbmF0ZSBzeXN0ZW0uXHJcblx0ICogQHJldHVybiB7TWF0cml4NH0gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0bWFrZU9ydGhvZ3JhcGhpYyggbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCBuZWFyLCBmYXIsIGNvb3JkaW5hdGVTeXN0ZW0gPSBXZWJHTENvb3JkaW5hdGVTeXN0ZW0gKSB7XHJcblxyXG5cdFx0Y29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzO1xyXG5cdFx0Y29uc3QgdyA9IDEuMCAvICggcmlnaHQgLSBsZWZ0ICk7XHJcblx0XHRjb25zdCBoID0gMS4wIC8gKCB0b3AgLSBib3R0b20gKTtcclxuXHRcdGNvbnN0IHAgPSAxLjAgLyAoIGZhciAtIG5lYXIgKTtcclxuXHJcblx0XHRjb25zdCB4ID0gKCByaWdodCArIGxlZnQgKSAqIHc7XHJcblx0XHRjb25zdCB5ID0gKCB0b3AgKyBib3R0b20gKSAqIGg7XHJcblxyXG5cdFx0bGV0IHosIHpJbnY7XHJcblxyXG5cdFx0aWYgKCBjb29yZGluYXRlU3lzdGVtID09PSBXZWJHTENvb3JkaW5hdGVTeXN0ZW0gKSB7XHJcblxyXG5cdFx0XHR6ID0gKCBmYXIgKyBuZWFyICkgKiBwO1xyXG5cdFx0XHR6SW52ID0gLSAyICogcDtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBjb29yZGluYXRlU3lzdGVtID09PSBXZWJHUFVDb29yZGluYXRlU3lzdGVtICkge1xyXG5cclxuXHRcdFx0eiA9IG5lYXIgKiBwO1xyXG5cdFx0XHR6SW52ID0gLSAxICogcDtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuTWF0cml4NC5tYWtlT3J0aG9ncmFwaGljKCk6IEludmFsaWQgY29vcmRpbmF0ZSBzeXN0ZW06ICcgKyBjb29yZGluYXRlU3lzdGVtICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRlWyAwIF0gPSAyICogdztcdHRlWyA0IF0gPSAwO1x0XHR0ZVsgOCBdID0gMDsgXHRcdHRlWyAxMiBdID0gLSB4O1xyXG5cdFx0dGVbIDEgXSA9IDA7IFx0XHR0ZVsgNSBdID0gMiAqIGg7XHR0ZVsgOSBdID0gMDsgXHRcdHRlWyAxMyBdID0gLSB5O1xyXG5cdFx0dGVbIDIgXSA9IDA7IFx0XHR0ZVsgNiBdID0gMDtcdFx0dGVbIDEwIF0gPSB6SW52O1x0dGVbIDE0IF0gPSAtIHo7XHJcblx0XHR0ZVsgMyBdID0gMDsgXHRcdHRlWyA3IF0gPSAwO1x0XHR0ZVsgMTEgXSA9IDA7XHRcdHRlWyAxNSBdID0gMTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIG1hdHJpeCBpcyBlcXVhbCB3aXRoIHRoZSBnaXZlbiBvbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDR9IG1hdHJpeCAtIFRoZSBtYXRyaXggdG8gdGVzdCBmb3IgZXF1YWxpdHkuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGlzIG1hdHJpeCBpcyBlcXVhbCB3aXRoIHRoZSBnaXZlbiBvbmUuXHJcblx0ICovXHJcblx0ZXF1YWxzKCBtYXRyaXggKSB7XHJcblxyXG5cdFx0Y29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzO1xyXG5cdFx0Y29uc3QgbWUgPSBtYXRyaXguZWxlbWVudHM7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgMTY7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHRlWyBpIF0gIT09IG1lWyBpIF0gKSByZXR1cm4gZmFsc2U7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGVsZW1lbnRzIG9mIHRoZSBtYXRyaXggZnJvbSB0aGUgZ2l2ZW4gYXJyYXkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IGFycmF5IC0gVGhlIG1hdHJpeCBlbGVtZW50cyBpbiBjb2x1bW4tbWFqb3Igb3JkZXIuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXQ9MF0gLSBJbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgYXJyYXkuXHJcblx0ICogQHJldHVybiB7TWF0cml4NH0gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0ZnJvbUFycmF5KCBhcnJheSwgb2Zmc2V0ID0gMCApIHtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCAxNjsgaSArKyApIHtcclxuXHJcblx0XHRcdHRoaXMuZWxlbWVudHNbIGkgXSA9IGFycmF5WyBpICsgb2Zmc2V0IF07XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdyaXRlcyB0aGUgZWxlbWVudHMgb2YgdGhpcyBtYXRyaXggdG8gdGhlIGdpdmVuIGFycmF5LiBJZiBubyBhcnJheSBpcyBwcm92aWRlZCxcclxuXHQgKiB0aGUgbWV0aG9kIHJldHVybnMgYSBuZXcgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IFthcnJheT1bXV0gLSBUaGUgdGFyZ2V0IGFycmF5IGhvbGRpbmcgdGhlIG1hdHJpeCBlbGVtZW50cyBpbiBjb2x1bW4tbWFqb3Igb3JkZXIuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXQ9MF0gLSBJbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgYXJyYXkuXHJcblx0ICogQHJldHVybiB7QXJyYXk8bnVtYmVyPn0gVGhlIG1hdHJpeCBlbGVtZW50cyBpbiBjb2x1bW4tbWFqb3Igb3JkZXIuXHJcblx0ICovXHJcblx0dG9BcnJheSggYXJyYXkgPSBbXSwgb2Zmc2V0ID0gMCApIHtcclxuXHJcblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XHJcblxyXG5cdFx0YXJyYXlbIG9mZnNldCBdID0gdGVbIDAgXTtcclxuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0ZVsgMSBdO1xyXG5cdFx0YXJyYXlbIG9mZnNldCArIDIgXSA9IHRlWyAyIF07XHJcblx0XHRhcnJheVsgb2Zmc2V0ICsgMyBdID0gdGVbIDMgXTtcclxuXHJcblx0XHRhcnJheVsgb2Zmc2V0ICsgNCBdID0gdGVbIDQgXTtcclxuXHRcdGFycmF5WyBvZmZzZXQgKyA1IF0gPSB0ZVsgNSBdO1xyXG5cdFx0YXJyYXlbIG9mZnNldCArIDYgXSA9IHRlWyA2IF07XHJcblx0XHRhcnJheVsgb2Zmc2V0ICsgNyBdID0gdGVbIDcgXTtcclxuXHJcblx0XHRhcnJheVsgb2Zmc2V0ICsgOCBdID0gdGVbIDggXTtcclxuXHRcdGFycmF5WyBvZmZzZXQgKyA5IF0gPSB0ZVsgOSBdO1xyXG5cdFx0YXJyYXlbIG9mZnNldCArIDEwIF0gPSB0ZVsgMTAgXTtcclxuXHRcdGFycmF5WyBvZmZzZXQgKyAxMSBdID0gdGVbIDExIF07XHJcblxyXG5cdFx0YXJyYXlbIG9mZnNldCArIDEyIF0gPSB0ZVsgMTIgXTtcclxuXHRcdGFycmF5WyBvZmZzZXQgKyAxMyBdID0gdGVbIDEzIF07XHJcblx0XHRhcnJheVsgb2Zmc2V0ICsgMTQgXSA9IHRlWyAxNCBdO1xyXG5cdFx0YXJyYXlbIG9mZnNldCArIDE1IF0gPSB0ZVsgMTUgXTtcclxuXHJcblx0XHRyZXR1cm4gYXJyYXk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmNvbnN0IF92MSA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX20xID0gLypAX19QVVJFX18qLyBuZXcgTWF0cml4NCgpO1xyXG5jb25zdCBfemVybyA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoIDAsIDAsIDAgKTtcclxuY29uc3QgX29uZSA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoIDEsIDEsIDEgKTtcclxuY29uc3QgX3ggPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF95ID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfeiA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuXHJcbmV4cG9ydCB7IE1hdHJpeDQgfTtcclxuIiwiaW1wb3J0IHsgUXVhdGVybmlvbiB9IGZyb20gJy4vUXVhdGVybmlvbi5qcyc7XHJcbmltcG9ydCB7IE1hdHJpeDQgfSBmcm9tICcuL01hdHJpeDQuanMnO1xyXG5pbXBvcnQgeyBjbGFtcCB9IGZyb20gJy4vTWF0aFV0aWxzLmpzJztcclxuXHJcbmNvbnN0IF9tYXRyaXggPSAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXg0KCk7XHJcbmNvbnN0IF9xdWF0ZXJuaW9uID0gLypAX19QVVJFX18qLyBuZXcgUXVhdGVybmlvbigpO1xyXG5cclxuLyoqXHJcbiAqIEEgY2xhc3MgcmVwcmVzZW50aW5nIEV1bGVyIGFuZ2xlcy5cclxuICpcclxuICogRXVsZXIgYW5nbGVzIGRlc2NyaWJlIGEgcm90YXRpb25hbCB0cmFuc2Zvcm1hdGlvbiBieSByb3RhdGluZyBhbiBvYmplY3Qgb25cclxuICogaXRzIHZhcmlvdXMgYXhlcyBpbiBzcGVjaWZpZWQgYW1vdW50cyBwZXIgYXhpcywgYW5kIGEgc3BlY2lmaWVkIGF4aXNcclxuICogb3JkZXIuXHJcbiAqXHJcbiAqIEl0ZXJhdGluZyB0aHJvdWdoIGFuIGluc3RhbmNlIHdpbGwgeWllbGQgaXRzIGNvbXBvbmVudHMgKHgsIHksIHosXHJcbiAqIG9yZGVyKSBpbiB0aGUgY29ycmVzcG9uZGluZyBvcmRlci5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgYSA9IG5ldyBUSFJFRS5FdWxlciggMCwgMSwgMS41NywgJ1hZWicgKTtcclxuICogY29uc3QgYiA9IG5ldyBUSFJFRS5WZWN0b3IzKCAxLCAwLCAxICk7XHJcbiAqIGIuYXBwbHlFdWxlcihhKTtcclxuICogYGBgXHJcbiAqL1xyXG5jbGFzcyBFdWxlciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgZXVsZXIgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3g9MF0gLSBUaGUgYW5nbGUgb2YgdGhlIHggYXhpcyBpbiByYWRpYW5zLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbeT0wXSAtIFRoZSBhbmdsZSBvZiB0aGUgeSBheGlzIGluIHJhZGlhbnMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt6PTBdIC0gVGhlIGFuZ2xlIG9mIHRoZSB6IGF4aXMgaW4gcmFkaWFucy5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW29yZGVyPUV1bGVyLkRFRkFVTFRfT1JERVJdIC0gQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBvcmRlciB0aGF0IHRoZSByb3RhdGlvbnMgYXJlIGFwcGxpZWQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHggPSAwLCB5ID0gMCwgeiA9IDAsIG9yZGVyID0gRXVsZXIuREVGQVVMVF9PUkRFUiApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNFdWxlciA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy5feCA9IHg7XHJcblx0XHR0aGlzLl95ID0geTtcclxuXHRcdHRoaXMuX3ogPSB6O1xyXG5cdFx0dGhpcy5fb3JkZXIgPSBvcmRlcjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgYW5nbGUgb2YgdGhlIHggYXhpcyBpbiByYWRpYW5zLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge251bWJlcn1cclxuXHQgKiBAZGVmYXVsdCAwXHJcblx0ICovXHJcblx0Z2V0IHgoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX3g7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0IHgoIHZhbHVlICkge1xyXG5cclxuXHRcdHRoaXMuX3ggPSB2YWx1ZTtcclxuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgYW5nbGUgb2YgdGhlIHkgYXhpcyBpbiByYWRpYW5zLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge251bWJlcn1cclxuXHQgKiBAZGVmYXVsdCAwXHJcblx0ICovXHJcblx0Z2V0IHkoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX3k7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0IHkoIHZhbHVlICkge1xyXG5cclxuXHRcdHRoaXMuX3kgPSB2YWx1ZTtcclxuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgYW5nbGUgb2YgdGhlIHogYXhpcyBpbiByYWRpYW5zLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge251bWJlcn1cclxuXHQgKiBAZGVmYXVsdCAwXHJcblx0ICovXHJcblx0Z2V0IHooKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX3o7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0IHooIHZhbHVlICkge1xyXG5cclxuXHRcdHRoaXMuX3ogPSB2YWx1ZTtcclxuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIG9yZGVyIHRoYXQgdGhlIHJvdGF0aW9ucyBhcmUgYXBwbGllZC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0ICogQGRlZmF1bHQgJ1hZWidcclxuXHQgKi9cclxuXHRnZXQgb3JkZXIoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX29yZGVyO1xyXG5cclxuXHR9XHJcblxyXG5cdHNldCBvcmRlciggdmFsdWUgKSB7XHJcblxyXG5cdFx0dGhpcy5fb3JkZXIgPSB2YWx1ZTtcclxuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBFdWxlciBjb21wb25lbnRzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgYW5nbGUgb2YgdGhlIHggYXhpcyBpbiByYWRpYW5zLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIGFuZ2xlIG9mIHRoZSB5IGF4aXMgaW4gcmFkaWFucy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geiAtIFRoZSBhbmdsZSBvZiB0aGUgeiBheGlzIGluIHJhZGlhbnMuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtvcmRlcl0gLSBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIG9yZGVyIHRoYXQgdGhlIHJvdGF0aW9ucyBhcmUgYXBwbGllZC5cclxuXHQgKiBAcmV0dXJuIHtFdWxlcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBFdWxlciBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXQoIHgsIHksIHosIG9yZGVyID0gdGhpcy5fb3JkZXIgKSB7XHJcblxyXG5cdFx0dGhpcy5feCA9IHg7XHJcblx0XHR0aGlzLl95ID0geTtcclxuXHRcdHRoaXMuX3ogPSB6O1xyXG5cdFx0dGhpcy5fb3JkZXIgPSBvcmRlcjtcclxuXHJcblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIG5ldyBFdWxlciBpbnN0YW5jZSB3aXRoIGNvcGllZCB2YWx1ZXMgZnJvbSB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7RXVsZXJ9IEEgY2xvbmUgb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjbG9uZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuX3gsIHRoaXMuX3ksIHRoaXMuX3osIHRoaXMuX29yZGVyICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29waWVzIHRoZSB2YWx1ZXMgb2YgdGhlIGdpdmVuIEV1bGVyIGluc3RhbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0V1bGVyfSBldWxlciAtIFRoZSBFdWxlciBpbnN0YW5jZSB0byBjb3B5LlxyXG5cdCAqIEByZXR1cm4ge0V1bGVyfSBBIHJlZmVyZW5jZSB0byB0aGlzIEV1bGVyIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNvcHkoIGV1bGVyICkge1xyXG5cclxuXHRcdHRoaXMuX3ggPSBldWxlci5feDtcclxuXHRcdHRoaXMuX3kgPSBldWxlci5feTtcclxuXHRcdHRoaXMuX3ogPSBldWxlci5fejtcclxuXHRcdHRoaXMuX29yZGVyID0gZXVsZXIuX29yZGVyO1xyXG5cclxuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBhbmdsZXMgb2YgdGhpcyBFdWxlciBpbnN0YW5jZSBmcm9tIGEgcHVyZSByb3RhdGlvbiBtYXRyaXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDR9IG0gLSBBIDR4NCBtYXRyaXggb2Ygd2hpY2ggdGhlIHVwcGVyIDN4MyBvZiBtYXRyaXggaXMgYSBwdXJlIHJvdGF0aW9uIG1hdHJpeCAoaS5lLiB1bnNjYWxlZCkuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtvcmRlcl0gLSBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIG9yZGVyIHRoYXQgdGhlIHJvdGF0aW9ucyBhcmUgYXBwbGllZC5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFt1cGRhdGU9dHJ1ZV0gLSBXaGV0aGVyIHRoZSBpbnRlcm5hbCBgb25DaGFuZ2VgIGNhbGxiYWNrIHNob3VsZCBiZSBleGVjdXRlZCBvciBub3QuXHJcblx0ICogQHJldHVybiB7RXVsZXJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgRXVsZXIgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0RnJvbVJvdGF0aW9uTWF0cml4KCBtLCBvcmRlciA9IHRoaXMuX29yZGVyLCB1cGRhdGUgPSB0cnVlICkge1xyXG5cclxuXHRcdGNvbnN0IHRlID0gbS5lbGVtZW50cztcclxuXHRcdGNvbnN0IG0xMSA9IHRlWyAwIF0sIG0xMiA9IHRlWyA0IF0sIG0xMyA9IHRlWyA4IF07XHJcblx0XHRjb25zdCBtMjEgPSB0ZVsgMSBdLCBtMjIgPSB0ZVsgNSBdLCBtMjMgPSB0ZVsgOSBdO1xyXG5cdFx0Y29uc3QgbTMxID0gdGVbIDIgXSwgbTMyID0gdGVbIDYgXSwgbTMzID0gdGVbIDEwIF07XHJcblxyXG5cdFx0c3dpdGNoICggb3JkZXIgKSB7XHJcblxyXG5cdFx0XHRjYXNlICdYWVonOlxyXG5cclxuXHRcdFx0XHR0aGlzLl95ID0gTWF0aC5hc2luKCBjbGFtcCggbTEzLCAtIDEsIDEgKSApO1xyXG5cclxuXHRcdFx0XHRpZiAoIE1hdGguYWJzKCBtMTMgKSA8IDAuOTk5OTk5OSApIHtcclxuXHJcblx0XHRcdFx0XHR0aGlzLl94ID0gTWF0aC5hdGFuMiggLSBtMjMsIG0zMyApO1xyXG5cdFx0XHRcdFx0dGhpcy5feiA9IE1hdGguYXRhbjIoIC0gbTEyLCBtMTEgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHR0aGlzLl94ID0gTWF0aC5hdGFuMiggbTMyLCBtMjIgKTtcclxuXHRcdFx0XHRcdHRoaXMuX3ogPSAwO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSAnWVhaJzpcclxuXHJcblx0XHRcdFx0dGhpcy5feCA9IE1hdGguYXNpbiggLSBjbGFtcCggbTIzLCAtIDEsIDEgKSApO1xyXG5cclxuXHRcdFx0XHRpZiAoIE1hdGguYWJzKCBtMjMgKSA8IDAuOTk5OTk5OSApIHtcclxuXHJcblx0XHRcdFx0XHR0aGlzLl95ID0gTWF0aC5hdGFuMiggbTEzLCBtMzMgKTtcclxuXHRcdFx0XHRcdHRoaXMuX3ogPSBNYXRoLmF0YW4yKCBtMjEsIG0yMiApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdHRoaXMuX3kgPSBNYXRoLmF0YW4yKCAtIG0zMSwgbTExICk7XHJcblx0XHRcdFx0XHR0aGlzLl96ID0gMDtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgJ1pYWSc6XHJcblxyXG5cdFx0XHRcdHRoaXMuX3ggPSBNYXRoLmFzaW4oIGNsYW1wKCBtMzIsIC0gMSwgMSApICk7XHJcblxyXG5cdFx0XHRcdGlmICggTWF0aC5hYnMoIG0zMiApIDwgMC45OTk5OTk5ICkge1xyXG5cclxuXHRcdFx0XHRcdHRoaXMuX3kgPSBNYXRoLmF0YW4yKCAtIG0zMSwgbTMzICk7XHJcblx0XHRcdFx0XHR0aGlzLl96ID0gTWF0aC5hdGFuMiggLSBtMTIsIG0yMiApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdHRoaXMuX3kgPSAwO1xyXG5cdFx0XHRcdFx0dGhpcy5feiA9IE1hdGguYXRhbjIoIG0yMSwgbTExICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlICdaWVgnOlxyXG5cclxuXHRcdFx0XHR0aGlzLl95ID0gTWF0aC5hc2luKCAtIGNsYW1wKCBtMzEsIC0gMSwgMSApICk7XHJcblxyXG5cdFx0XHRcdGlmICggTWF0aC5hYnMoIG0zMSApIDwgMC45OTk5OTk5ICkge1xyXG5cclxuXHRcdFx0XHRcdHRoaXMuX3ggPSBNYXRoLmF0YW4yKCBtMzIsIG0zMyApO1xyXG5cdFx0XHRcdFx0dGhpcy5feiA9IE1hdGguYXRhbjIoIG0yMSwgbTExICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0dGhpcy5feCA9IDA7XHJcblx0XHRcdFx0XHR0aGlzLl96ID0gTWF0aC5hdGFuMiggLSBtMTIsIG0yMiApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSAnWVpYJzpcclxuXHJcblx0XHRcdFx0dGhpcy5feiA9IE1hdGguYXNpbiggY2xhbXAoIG0yMSwgLSAxLCAxICkgKTtcclxuXHJcblx0XHRcdFx0aWYgKCBNYXRoLmFicyggbTIxICkgPCAwLjk5OTk5OTkgKSB7XHJcblxyXG5cdFx0XHRcdFx0dGhpcy5feCA9IE1hdGguYXRhbjIoIC0gbTIzLCBtMjIgKTtcclxuXHRcdFx0XHRcdHRoaXMuX3kgPSBNYXRoLmF0YW4yKCAtIG0zMSwgbTExICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0dGhpcy5feCA9IDA7XHJcblx0XHRcdFx0XHR0aGlzLl95ID0gTWF0aC5hdGFuMiggbTEzLCBtMzMgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgJ1haWSc6XHJcblxyXG5cdFx0XHRcdHRoaXMuX3ogPSBNYXRoLmFzaW4oIC0gY2xhbXAoIG0xMiwgLSAxLCAxICkgKTtcclxuXHJcblx0XHRcdFx0aWYgKCBNYXRoLmFicyggbTEyICkgPCAwLjk5OTk5OTkgKSB7XHJcblxyXG5cdFx0XHRcdFx0dGhpcy5feCA9IE1hdGguYXRhbjIoIG0zMiwgbTIyICk7XHJcblx0XHRcdFx0XHR0aGlzLl95ID0gTWF0aC5hdGFuMiggbTEzLCBtMTEgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHR0aGlzLl94ID0gTWF0aC5hdGFuMiggLSBtMjMsIG0zMyApO1xyXG5cdFx0XHRcdFx0dGhpcy5feSA9IDA7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRkZWZhdWx0OlxyXG5cclxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5FdWxlcjogLnNldEZyb21Sb3RhdGlvbk1hdHJpeCgpIGVuY291bnRlcmVkIGFuIHVua25vd24gb3JkZXI6ICcgKyBvcmRlciApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLl9vcmRlciA9IG9yZGVyO1xyXG5cclxuXHRcdGlmICggdXBkYXRlID09PSB0cnVlICkgdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGFuZ2xlcyBvZiB0aGlzIEV1bGVyIGluc3RhbmNlIGZyb20gYSBub3JtYWxpemVkIHF1YXRlcm5pb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1F1YXRlcm5pb259IHEgLSBBIG5vcm1hbGl6ZWQgUXVhdGVybmlvbi5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW29yZGVyXSAtIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgb3JkZXIgdGhhdCB0aGUgcm90YXRpb25zIGFyZSBhcHBsaWVkLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW3VwZGF0ZT10cnVlXSAtIFdoZXRoZXIgdGhlIGludGVybmFsIGBvbkNoYW5nZWAgY2FsbGJhY2sgc2hvdWxkIGJlIGV4ZWN1dGVkIG9yIG5vdC5cclxuXHQgKiBAcmV0dXJuIHtFdWxlcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBFdWxlciBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXRGcm9tUXVhdGVybmlvbiggcSwgb3JkZXIsIHVwZGF0ZSApIHtcclxuXHJcblx0XHRfbWF0cml4Lm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKCBxICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuc2V0RnJvbVJvdGF0aW9uTWF0cml4KCBfbWF0cml4LCBvcmRlciwgdXBkYXRlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgYW5nbGVzIG9mIHRoaXMgRXVsZXIgaW5zdGFuY2UgZnJvbSB0aGUgZ2l2ZW4gdmVjdG9yLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB2IC0gVGhlIHZlY3Rvci5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW29yZGVyXSAtIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgb3JkZXIgdGhhdCB0aGUgcm90YXRpb25zIGFyZSBhcHBsaWVkLlxyXG5cdCAqIEByZXR1cm4ge0V1bGVyfSBBIHJlZmVyZW5jZSB0byB0aGlzIEV1bGVyIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldEZyb21WZWN0b3IzKCB2LCBvcmRlciA9IHRoaXMuX29yZGVyICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnNldCggdi54LCB2LnksIHYueiwgb3JkZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXNldHMgdGhlIGV1bGVyIGFuZ2xlIHdpdGggYSBuZXcgb3JkZXIgYnkgY3JlYXRpbmcgYSBxdWF0ZXJuaW9uIGZyb20gdGhpc1xyXG5cdCAqIGV1bGVyIGFuZ2xlIGFuZCB0aGVuIHNldHRpbmcgdGhpcyBldWxlciBhbmdsZSB3aXRoIHRoZSBxdWF0ZXJuaW9uIGFuZCB0aGVcclxuXHQgKiBuZXcgb3JkZXIuXHJcblx0ICpcclxuXHQgKiBXYXJuaW5nOiBUaGlzIGRpc2NhcmRzIHJldm9sdXRpb24gaW5mb3JtYXRpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW25ld09yZGVyXSAtIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgbmV3IG9yZGVyIHRoYXQgdGhlIHJvdGF0aW9ucyBhcmUgYXBwbGllZC5cclxuXHQgKiBAcmV0dXJuIHtFdWxlcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBFdWxlciBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRyZW9yZGVyKCBuZXdPcmRlciApIHtcclxuXHJcblx0XHRfcXVhdGVybmlvbi5zZXRGcm9tRXVsZXIoIHRoaXMgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5zZXRGcm9tUXVhdGVybmlvbiggX3F1YXRlcm5pb24sIG5ld09yZGVyICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBFdWxlciBpbnN0YW5jZSBpcyBlcXVhbCB3aXRoIHRoZSBnaXZlbiBvbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0V1bGVyfSBldWxlciAtIFRoZSBFdWxlciBpbnN0YW5jZSB0byB0ZXN0IGZvciBlcXVhbGl0eS5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoaXMgRXVsZXIgaW5zdGFuY2UgaXMgZXF1YWwgd2l0aCB0aGUgZ2l2ZW4gb25lLlxyXG5cdCAqL1xyXG5cdGVxdWFscyggZXVsZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuICggZXVsZXIuX3ggPT09IHRoaXMuX3ggKSAmJiAoIGV1bGVyLl95ID09PSB0aGlzLl95ICkgJiYgKCBldWxlci5feiA9PT0gdGhpcy5feiApICYmICggZXVsZXIuX29yZGVyID09PSB0aGlzLl9vcmRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhpcyBFdWxlciBpbnN0YW5jZSdzIGNvbXBvbmVudHMgdG8gdmFsdWVzIGZyb20gdGhlIGdpdmVuIGFycmF5LiBUaGUgZmlyc3QgdGhyZWVcclxuXHQgKiBlbnRyaWVzIG9mIHRoZSBhcnJheSBhcmUgYXNzaWduIHRvIHRoZSB4LHkgYW5kIHogY29tcG9uZW50cy4gQW4gb3B0aW9uYWwgZm91cnRoIGVudHJ5XHJcblx0ICogZGVmaW5lcyB0aGUgRXVsZXIgb3JkZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcixudW1iZXIsbnVtYmVyLD9zdHJpbmc+fSBhcnJheSAtIEFuIGFycmF5IGhvbGRpbmcgdGhlIEV1bGVyIGNvbXBvbmVudCB2YWx1ZXMuXHJcblx0ICogQHJldHVybiB7RXVsZXJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgRXVsZXIgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0ZnJvbUFycmF5KCBhcnJheSApIHtcclxuXHJcblx0XHR0aGlzLl94ID0gYXJyYXlbIDAgXTtcclxuXHRcdHRoaXMuX3kgPSBhcnJheVsgMSBdO1xyXG5cdFx0dGhpcy5feiA9IGFycmF5WyAyIF07XHJcblx0XHRpZiAoIGFycmF5WyAzIF0gIT09IHVuZGVmaW5lZCApIHRoaXMuX29yZGVyID0gYXJyYXlbIDMgXTtcclxuXHJcblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogV3JpdGVzIHRoZSBjb21wb25lbnRzIG9mIHRoaXMgRXVsZXIgaW5zdGFuY2UgdG8gdGhlIGdpdmVuIGFycmF5LiBJZiBubyBhcnJheSBpcyBwcm92aWRlZCxcclxuXHQgKiB0aGUgbWV0aG9kIHJldHVybnMgYSBuZXcgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcixudW1iZXIsbnVtYmVyLHN0cmluZz59IFthcnJheT1bXV0gLSBUaGUgdGFyZ2V0IGFycmF5IGhvbGRpbmcgdGhlIEV1bGVyIGNvbXBvbmVudHMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXQ9MF0gLSBJbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgYXJyYXkuXHJcblx0ICogQHJldHVybiB7QXJyYXk8bnVtYmVyLG51bWJlcixudW1iZXIsc3RyaW5nPn0gVGhlIEV1bGVyIGNvbXBvbmVudHMuXHJcblx0ICovXHJcblx0dG9BcnJheSggYXJyYXkgPSBbXSwgb2Zmc2V0ID0gMCApIHtcclxuXHJcblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0aGlzLl94O1xyXG5cdFx0YXJyYXlbIG9mZnNldCArIDEgXSA9IHRoaXMuX3k7XHJcblx0XHRhcnJheVsgb2Zmc2V0ICsgMiBdID0gdGhpcy5fejtcclxuXHRcdGFycmF5WyBvZmZzZXQgKyAzIF0gPSB0aGlzLl9vcmRlcjtcclxuXHJcblx0XHRyZXR1cm4gYXJyYXk7XHJcblxyXG5cdH1cclxuXHJcblx0X29uQ2hhbmdlKCBjYWxsYmFjayApIHtcclxuXHJcblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrID0gY2FsbGJhY2s7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0X29uQ2hhbmdlQ2FsbGJhY2soKSB7fVxyXG5cclxuXHQqWyBTeW1ib2wuaXRlcmF0b3IgXSgpIHtcclxuXHJcblx0XHR5aWVsZCB0aGlzLl94O1xyXG5cdFx0eWllbGQgdGhpcy5feTtcclxuXHRcdHlpZWxkIHRoaXMuX3o7XHJcblx0XHR5aWVsZCB0aGlzLl9vcmRlcjtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFRoZSBkZWZhdWx0IEV1bGVyIGFuZ2xlIG9yZGVyLlxyXG4gKlxyXG4gKiBAc3RhdGljXHJcbiAqIEB0eXBlIHtzdHJpbmd9XHJcbiAqIEBkZWZhdWx0ICdYWVonXHJcbiAqL1xyXG5FdWxlci5ERUZBVUxUX09SREVSID0gJ1hZWic7XHJcblxyXG5leHBvcnQgeyBFdWxlciB9O1xyXG4iLCIvKipcclxuICogQSBsYXllcnMgb2JqZWN0IGFzc2lnbnMgYW4gM0Qgb2JqZWN0IHRvIDEgb3IgbW9yZSBvZiAzMlxyXG4gKiBsYXllcnMgbnVtYmVyZWQgYDBgIHRvIGAzMWAgLSBpbnRlcm5hbGx5IHRoZSBsYXllcnMgYXJlIHN0b3JlZCBhcyBhXHJcbiAqIGJpdCBtYXNrXSwgYW5kIGJ5IGRlZmF1bHQgYWxsIDNEIG9iamVjdHMgYXJlIGEgbWVtYmVyIG9mIGxheWVyIGAwYC5cclxuICpcclxuICogVGhpcyBjYW4gYmUgdXNlZCB0byBjb250cm9sIHZpc2liaWxpdHkgLSBhbiBvYmplY3QgbXVzdCBzaGFyZSBhIGxheWVyIHdpdGhcclxuICogYSBjYW1lcmEgdG8gYmUgdmlzaWJsZSB3aGVuIHRoYXQgY2FtZXJhJ3MgdmlldyBpc1xyXG4gKiByZW5kZXJlZC5cclxuICpcclxuICogQWxsIGNsYXNzZXMgdGhhdCBpbmhlcml0IGZyb20ge0BsaW5rIE9iamVjdDNEfSBoYXZlIGFuIGBsYXllcnNgIHByb3BlcnR5IHdoaWNoXHJcbiAqIGlzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuXHJcbiAqL1xyXG5jbGFzcyBMYXllcnMge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGxheWVycyBpbnN0YW5jZSwgd2l0aCBtZW1iZXJzaGlwXHJcblx0ICogaW5pdGlhbGx5IHNldCB0byBsYXllciBgMGAuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGJpdCBtYXNrIHN0b3Jpbmcgd2hpY2ggb2YgdGhlIDMyIGxheWVycyB0aGlzIGxheWVycyBvYmplY3QgaXMgY3VycmVudGx5XHJcblx0XHQgKiBhIG1lbWJlciBvZi5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1hc2sgPSAxIHwgMDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIG1lbWJlcnNoaXAgdG8gdGhlIGdpdmVuIGxheWVyLCBhbmQgcmVtb3ZlIG1lbWJlcnNoaXAgYWxsIG90aGVyIGxheWVycy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBsYXllciAtIFRoZSBsYXllciB0byBzZXQuXHJcblx0ICovXHJcblx0c2V0KCBsYXllciApIHtcclxuXHJcblx0XHR0aGlzLm1hc2sgPSAoIDEgPDwgbGF5ZXIgfCAwICkgPj4+IDA7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyBtZW1iZXJzaGlwIG9mIHRoZSBnaXZlbiBsYXllci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBsYXllciAtIFRoZSBsYXllciB0byBlbmFibGUuXHJcblx0ICovXHJcblx0ZW5hYmxlKCBsYXllciApIHtcclxuXHJcblx0XHR0aGlzLm1hc2sgfD0gMSA8PCBsYXllciB8IDA7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyBtZW1iZXJzaGlwIHRvIGFsbCBsYXllcnMuXHJcblx0ICovXHJcblx0ZW5hYmxlQWxsKCkge1xyXG5cclxuXHRcdHRoaXMubWFzayA9IDB4ZmZmZmZmZmYgfCAwO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRvZ2dsZXMgdGhlIG1lbWJlcnNoaXAgb2YgdGhlIGdpdmVuIGxheWVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGxheWVyIC0gVGhlIGxheWVyIHRvIHRvZ2dsZS5cclxuXHQgKi9cclxuXHR0b2dnbGUoIGxheWVyICkge1xyXG5cclxuXHRcdHRoaXMubWFzayBePSAxIDw8IGxheWVyIHwgMDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW1vdmVzIG1lbWJlcnNoaXAgb2YgdGhlIGdpdmVuIGxheWVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGxheWVyIC0gVGhlIGxheWVyIHRvIGVuYWJsZS5cclxuXHQgKi9cclxuXHRkaXNhYmxlKCBsYXllciApIHtcclxuXHJcblx0XHR0aGlzLm1hc2sgJj0gfiAoIDEgPDwgbGF5ZXIgfCAwICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVtb3ZlcyB0aGUgbWVtYmVyc2hpcCBmcm9tIGFsbCBsYXllcnMuXHJcblx0ICovXHJcblx0ZGlzYWJsZUFsbCgpIHtcclxuXHJcblx0XHR0aGlzLm1hc2sgPSAwO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgYW5kIHRoZSBnaXZlbiBsYXllcnMgb2JqZWN0IGhhdmUgYXQgbGVhc3Qgb25lXHJcblx0ICogbGF5ZXIgaW4gY29tbW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtMYXllcnN9IGxheWVycyAtIFRoZSBsYXllcnMgdG8gdGVzdC5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFuIH0gV2hldGhlciB0aGlzIGFuZCB0aGUgZ2l2ZW4gbGF5ZXJzIG9iamVjdCBoYXZlIGF0IGxlYXN0IG9uZSBsYXllciBpbiBjb21tb24gb3Igbm90LlxyXG5cdCAqL1xyXG5cdHRlc3QoIGxheWVycyApIHtcclxuXHJcblx0XHRyZXR1cm4gKCB0aGlzLm1hc2sgJiBsYXllcnMubWFzayApICE9PSAwO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBnaXZlbiBsYXllciBpcyBlbmFibGVkLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGxheWVyIC0gVGhlIGxheWVyIHRvIHRlc3QuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbiB9IFdoZXRoZXIgdGhlIGdpdmVuIGxheWVyIGlzIGVuYWJsZWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGlzRW5hYmxlZCggbGF5ZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuICggdGhpcy5tYXNrICYgKCAxIDw8IGxheWVyIHwgMCApICkgIT09IDA7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBMYXllcnMgfTtcclxuIiwiaW1wb3J0IHsgUXVhdGVybmlvbiB9IGZyb20gJy4uL21hdGgvUXVhdGVybmlvbi5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBNYXRyaXg0IH0gZnJvbSAnLi4vbWF0aC9NYXRyaXg0LmpzJztcclxuaW1wb3J0IHsgRXZlbnREaXNwYXRjaGVyIH0gZnJvbSAnLi9FdmVudERpc3BhdGNoZXIuanMnO1xyXG5pbXBvcnQgeyBFdWxlciB9IGZyb20gJy4uL21hdGgvRXVsZXIuanMnO1xyXG5pbXBvcnQgeyBMYXllcnMgfSBmcm9tICcuL0xheWVycy5qcyc7XHJcbmltcG9ydCB7IE1hdHJpeDMgfSBmcm9tICcuLi9tYXRoL01hdHJpeDMuanMnO1xyXG5pbXBvcnQgeyBnZW5lcmF0ZVVVSUQgfSBmcm9tICcuLi9tYXRoL01hdGhVdGlscy5qcyc7XHJcblxyXG5sZXQgX29iamVjdDNESWQgPSAwO1xyXG5cclxuY29uc3QgX3YxID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfcTEgPSAvKkBfX1BVUkVfXyovIG5ldyBRdWF0ZXJuaW9uKCk7XHJcbmNvbnN0IF9tMSA9IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDQoKTtcclxuY29uc3QgX3RhcmdldCA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuXHJcbmNvbnN0IF9wb3NpdGlvbiA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX3NjYWxlID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfcXVhdGVybmlvbiA9IC8qQF9fUFVSRV9fKi8gbmV3IFF1YXRlcm5pb24oKTtcclxuXHJcbmNvbnN0IF94QXhpcyA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoIDEsIDAsIDAgKTtcclxuY29uc3QgX3lBeGlzID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMyggMCwgMSwgMCApO1xyXG5jb25zdCBfekF4aXMgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCAwLCAwLCAxICk7XHJcblxyXG4vKipcclxuICogRmlyZXMgd2hlbiB0aGUgb2JqZWN0IGhhcyBiZWVuIGFkZGVkIHRvIGl0cyBwYXJlbnQgb2JqZWN0LlxyXG4gKlxyXG4gKiBAZXZlbnQgT2JqZWN0M0QjYWRkZWRcclxuICogQHR5cGUge09iamVjdH1cclxuICovXHJcbmNvbnN0IF9hZGRlZEV2ZW50ID0geyB0eXBlOiAnYWRkZWQnIH07XHJcblxyXG4vKipcclxuICogRmlyZXMgd2hlbiB0aGUgb2JqZWN0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSBpdHMgcGFyZW50IG9iamVjdC5cclxuICpcclxuICogQGV2ZW50IE9iamVjdDNEI3JlbW92ZWRcclxuICogQHR5cGUge09iamVjdH1cclxuICovXHJcbmNvbnN0IF9yZW1vdmVkRXZlbnQgPSB7IHR5cGU6ICdyZW1vdmVkJyB9O1xyXG5cclxuLyoqXHJcbiAqIEZpcmVzIHdoZW4gYSBuZXcgY2hpbGQgb2JqZWN0IGhhcyBiZWVuIGFkZGVkLlxyXG4gKlxyXG4gKiBAZXZlbnQgT2JqZWN0M0QjY2hpbGRhZGRlZFxyXG4gKiBAdHlwZSB7T2JqZWN0fVxyXG4gKi9cclxuY29uc3QgX2NoaWxkYWRkZWRFdmVudCA9IHsgdHlwZTogJ2NoaWxkYWRkZWQnLCBjaGlsZDogbnVsbCB9O1xyXG5cclxuLyoqXHJcbiAqIEZpcmVzIHdoZW4gYSBuZXcgY2hpbGQgb2JqZWN0IGhhcyBiZWVuIGFkZGVkLlxyXG4gKlxyXG4gKiBAZXZlbnQgT2JqZWN0M0QjY2hpbGRyZW1vdmVkXHJcbiAqIEB0eXBlIHtPYmplY3R9XHJcbiAqL1xyXG5jb25zdCBfY2hpbGRyZW1vdmVkRXZlbnQgPSB7IHR5cGU6ICdjaGlsZHJlbW92ZWQnLCBjaGlsZDogbnVsbCB9O1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIG1vc3Qgb2JqZWN0cyBpbiB0aHJlZS5qcyBhbmQgcHJvdmlkZXMgYSBzZXQgb2ZcclxuICogcHJvcGVydGllcyBhbmQgbWV0aG9kcyBmb3IgbWFuaXB1bGF0aW5nIG9iamVjdHMgaW4gM0Qgc3BhY2UuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBFdmVudERpc3BhdGNoZXJcclxuICovXHJcbmNsYXNzIE9iamVjdDNEIGV4dGVuZHMgRXZlbnREaXNwYXRjaGVyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyAzRCBvYmplY3QuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNPYmplY3QzRCA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgSUQgb2YgdGhlIDNEIG9iamVjdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAbmFtZSBPYmplY3QzRCNpZFxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICovXHJcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsICdpZCcsIHsgdmFsdWU6IF9vYmplY3QzRElkICsrIH0gKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBVVUlEIG9mIHRoZSAzRCBvYmplY3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnV1aWQgPSBnZW5lcmF0ZVVVSUQoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBuYW1lIG9mIHRoZSAzRCBvYmplY3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5uYW1lID0gJyc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdHlwZSBwcm9wZXJ0eSBpcyB1c2VkIGZvciBkZXRlY3RpbmcgdGhlIG9iamVjdCB0eXBlXHJcblx0XHQgKiBpbiBjb250ZXh0IG9mIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50eXBlID0gJ09iamVjdDNEJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIHRoZSBwYXJlbnQgb2JqZWN0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/T2JqZWN0M0R9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucGFyZW50ID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIGFycmF5IGhvbGRpbmcgdGhlIGNoaWxkIDNEIG9iamVjdHMgb2YgdGhpcyBpbnN0YW5jZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8T2JqZWN0M0Q+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNoaWxkcmVuID0gW107XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIHRoZSBgdXBgIGRpcmVjdGlvbiBvZiB0aGUgM0Qgb2JqZWN0IHdoaWNoIGluZmx1ZW5jZXNcclxuXHRcdCAqIHRoZSBvcmllbnRhdGlvbiB2aWEgbWV0aG9kcyBsaWtlIHtAbGluayBPYmplY3QzRCNsb29rQXR9LlxyXG5cdFx0ICpcclxuXHRcdCAqIFRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgYWxsIDNEIG9iamVjdHMgaXMgZGVmaW5lZCBieSBgT2JqZWN0M0QuREVGQVVMVF9VUGAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjN9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXAgPSBPYmplY3QzRC5ERUZBVUxUX1VQLmNsb25lKCk7XHJcblxyXG5cdFx0Y29uc3QgcG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xyXG5cdFx0Y29uc3Qgcm90YXRpb24gPSBuZXcgRXVsZXIoKTtcclxuXHRcdGNvbnN0IHF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpO1xyXG5cdFx0Y29uc3Qgc2NhbGUgPSBuZXcgVmVjdG9yMyggMSwgMSwgMSApO1xyXG5cclxuXHRcdGZ1bmN0aW9uIG9uUm90YXRpb25DaGFuZ2UoKSB7XHJcblxyXG5cdFx0XHRxdWF0ZXJuaW9uLnNldEZyb21FdWxlciggcm90YXRpb24sIGZhbHNlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIG9uUXVhdGVybmlvbkNoYW5nZSgpIHtcclxuXHJcblx0XHRcdHJvdGF0aW9uLnNldEZyb21RdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uLCB1bmRlZmluZWQsIGZhbHNlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJvdGF0aW9uLl9vbkNoYW5nZSggb25Sb3RhdGlvbkNoYW5nZSApO1xyXG5cdFx0cXVhdGVybmlvbi5fb25DaGFuZ2UoIG9uUXVhdGVybmlvbkNoYW5nZSApO1xyXG5cclxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCB0aGlzLCB7XHJcblx0XHRcdC8qKlxyXG5cdFx0XHQgKiBSZXByZXNlbnRzIHRoZSBvYmplY3QncyBsb2NhbCBwb3NpdGlvbi5cclxuXHRcdFx0ICpcclxuXHRcdFx0ICogQG5hbWUgT2JqZWN0M0QjcG9zaXRpb25cclxuXHRcdFx0ICogQHR5cGUge1ZlY3RvcjN9XHJcblx0XHRcdCAqIEBkZWZhdWx0ICgwLDAsMClcclxuXHRcdFx0ICovXHJcblx0XHRcdHBvc2l0aW9uOiB7XHJcblx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxyXG5cdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXHJcblx0XHRcdFx0dmFsdWU6IHBvc2l0aW9uXHJcblx0XHRcdH0sXHJcblx0XHRcdC8qKlxyXG5cdFx0XHQgKiBSZXByZXNlbnRzIHRoZSBvYmplY3QncyBsb2NhbCByb3RhdGlvbiBhcyBFdWxlciBhbmdsZXMsIGluIHJhZGlhbnMuXHJcblx0XHRcdCAqXHJcblx0XHRcdCAqIEBuYW1lIE9iamVjdDNEI3JvdGF0aW9uXHJcblx0XHRcdCAqIEB0eXBlIHtFdWxlcn1cclxuXHRcdFx0ICogQGRlZmF1bHQgKDAsMCwwKVxyXG5cdFx0XHQgKi9cclxuXHRcdFx0cm90YXRpb246IHtcclxuXHRcdFx0XHRjb25maWd1cmFibGU6IHRydWUsXHJcblx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcclxuXHRcdFx0XHR2YWx1ZTogcm90YXRpb25cclxuXHRcdFx0fSxcclxuXHRcdFx0LyoqXHJcblx0XHRcdCAqIFJlcHJlc2VudHMgdGhlIG9iamVjdCdzIGxvY2FsIHJvdGF0aW9uIGFzIFF1YXRlcm5pb25zLlxyXG5cdFx0XHQgKlxyXG5cdFx0XHQgKiBAbmFtZSBPYmplY3QzRCNxdWF0ZXJuaW9uXHJcblx0XHRcdCAqIEB0eXBlIHtRdWF0ZXJuaW9ufVxyXG5cdFx0XHQgKi9cclxuXHRcdFx0cXVhdGVybmlvbjoge1xyXG5cdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcclxuXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxyXG5cdFx0XHRcdHZhbHVlOiBxdWF0ZXJuaW9uXHJcblx0XHRcdH0sXHJcblx0XHRcdC8qKlxyXG5cdFx0XHQgKiBSZXByZXNlbnRzIHRoZSBvYmplY3QncyBsb2NhbCBzY2FsZS5cclxuXHRcdFx0ICpcclxuXHRcdFx0ICogQG5hbWUgT2JqZWN0M0Qjc2NhbGVcclxuXHRcdFx0ICogQHR5cGUge1ZlY3RvcjN9XHJcblx0XHRcdCAqIEBkZWZhdWx0ICgxLDEsMSlcclxuXHRcdFx0ICovXHJcblx0XHRcdHNjYWxlOiB7XHJcblx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxyXG5cdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXHJcblx0XHRcdFx0dmFsdWU6IHNjYWxlXHJcblx0XHRcdH0sXHJcblx0XHRcdC8qKlxyXG5cdFx0XHQgKiBSZXByZXNlbnRzIHRoZSBvYmplY3QncyBtb2RlbC12aWV3IG1hdHJpeC5cclxuXHRcdFx0ICpcclxuXHRcdFx0ICogQG5hbWUgT2JqZWN0M0QjbW9kZWxWaWV3TWF0cml4XHJcblx0XHRcdCAqIEB0eXBlIHtNYXRyaXg0fVxyXG5cdFx0XHQgKi9cclxuXHRcdFx0bW9kZWxWaWV3TWF0cml4OiB7XHJcblx0XHRcdFx0dmFsdWU6IG5ldyBNYXRyaXg0KClcclxuXHRcdFx0fSxcclxuXHRcdFx0LyoqXHJcblx0XHRcdCAqIFJlcHJlc2VudHMgdGhlIG9iamVjdCdzIG5vcm1hbCBtYXRyaXguXHJcblx0XHRcdCAqXHJcblx0XHRcdCAqIEBuYW1lIE9iamVjdDNEI25vcm1hbE1hdHJpeFxyXG5cdFx0XHQgKiBAdHlwZSB7TWF0cml4M31cclxuXHRcdFx0ICovXHJcblx0XHRcdG5vcm1hbE1hdHJpeDoge1xyXG5cdFx0XHRcdHZhbHVlOiBuZXcgTWF0cml4MygpXHJcblx0XHRcdH1cclxuXHRcdH0gKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlcHJlc2VudHMgdGhlIG9iamVjdCdzIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBpbiBsb2NhbCBzcGFjZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7TWF0cml4NH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tYXRyaXggPSBuZXcgTWF0cml4NCgpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVwcmVzZW50cyB0aGUgb2JqZWN0J3MgdHJhbnNmb3JtYXRpb24gbWF0cml4IGluIHdvcmxkIHNwYWNlLlxyXG5cdFx0ICogSWYgdGhlIDNEIG9iamVjdCBoYXMgbm8gcGFyZW50LCB0aGVuIGl0J3MgaWRlbnRpY2FsIHRvIHRoZSBsb2NhbCB0cmFuc2Zvcm1hdGlvbiBtYXRyaXhcclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7TWF0cml4NH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tYXRyaXhXb3JsZCA9IG5ldyBNYXRyaXg0KCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGVuIHNldCB0byBgdHJ1ZWAsIHRoZSBlbmdpbmUgYXV0b21hdGljYWxseSBjb21wdXRlcyB0aGUgbG9jYWwgbWF0cml4IGZyb20gcG9zaXRpb24sXHJcblx0XHQgKiByb3RhdGlvbiBhbmQgc2NhbGUgZXZlcnkgZnJhbWUuXHJcblx0XHQgKlxyXG5cdFx0ICogVGhlIGRlZmF1bHQgdmFsdWVzIGZvciBhbGwgM0Qgb2JqZWN0cyBpcyBkZWZpbmVkIGJ5IGBPYmplY3QzRC5ERUZBVUxUX01BVFJJWF9BVVRPX1VQREFURWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IE9iamVjdDNELkRFRkFVTFRfTUFUUklYX0FVVE9fVVBEQVRFO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hlbiBzZXQgdG8gYHRydWVgLCB0aGUgZW5naW5lIGF1dG9tYXRpY2FsbHkgY29tcHV0ZXMgdGhlIHdvcmxkIG1hdHJpeCBmcm9tIHRoZSBjdXJyZW50IGxvY2FsXHJcblx0XHQgKiBtYXRyaXggYW5kIHRoZSBvYmplY3QncyB0cmFuc2Zvcm1hdGlvbiBoaWVyYXJjaHkuXHJcblx0XHQgKlxyXG5cdFx0ICogVGhlIGRlZmF1bHQgdmFsdWVzIGZvciBhbGwgM0Qgb2JqZWN0cyBpcyBkZWZpbmVkIGJ5IGBPYmplY3QzRC5ERUZBVUxUX01BVFJJWF9XT1JMRF9BVVRPX1VQREFURWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWF0cml4V29ybGRBdXRvVXBkYXRlID0gT2JqZWN0M0QuREVGQVVMVF9NQVRSSVhfV09STERfQVVUT19VUERBVEU7IC8vIGNoZWNrZWQgYnkgdGhlIHJlbmRlcmVyXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGVuIHNldCB0byBgdHJ1ZWAsIGl0IGNhbGN1bGF0ZXMgdGhlIHdvcmxkIG1hdHJpeCBpbiB0aGF0IGZyYW1lIGFuZCByZXNldHMgdGhpcyBwcm9wZXJ0eVxyXG5cdFx0ICogdG8gYGZhbHNlYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGxheWVyIG1lbWJlcnNoaXAgb2YgdGhlIDNEIG9iamVjdC4gVGhlIDNEIG9iamVjdCBpcyBvbmx5IHZpc2libGUgaWYgaXQgaGFzXHJcblx0XHQgKiBhdCBsZWFzdCBvbmUgbGF5ZXIgaW4gY29tbW9uIHdpdGggdGhlIGNhbWVyYSBpbiB1c2UuIFRoaXMgcHJvcGVydHkgY2FuIGFsc28gYmVcclxuXHRcdCAqIHVzZWQgdG8gZmlsdGVyIG91dCB1bndhbnRlZCBvYmplY3RzIGluIHJheS1pbnRlcnNlY3Rpb24gdGVzdHMgd2hlbiB1c2luZyB7QGxpbmsgUmF5Y2FzdGVyfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7TGF5ZXJzfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxheWVycyA9IG5ldyBMYXllcnMoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZW4gc2V0IHRvIGB0cnVlYCwgdGhlIDNEIG9iamVjdCBnZXRzIHJlbmRlcmVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnZpc2libGUgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hlbiBzZXQgdG8gYHRydWVgLCB0aGUgM0Qgb2JqZWN0IGdldHMgcmVuZGVyZWQgaW50byBzaGFkb3cgbWFwcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2FzdFNoYWRvdyA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hlbiBzZXQgdG8gYHRydWVgLCB0aGUgM0Qgb2JqZWN0IGlzIGFmZmVjdGVkIGJ5IHNoYWRvd3MgaW4gdGhlIHNjZW5lLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yZWNlaXZlU2hhZG93ID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGVuIHNldCB0byBgdHJ1ZWAsIHRoZSAzRCBvYmplY3QgaXMgaG9ub3JlZCBieSB2aWV3IGZydXN0dW0gY3VsbGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5mcnVzdHVtQ3VsbGVkID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgdmFsdWUgYWxsb3dzIHRoZSBkZWZhdWx0IHJlbmRlcmluZyBvcmRlciBvZiBzY2VuZSBncmFwaCBvYmplY3RzIHRvIGJlXHJcblx0XHQgKiBvdmVycmlkZGVuIGFsdGhvdWdoIG9wYXF1ZSBhbmQgdHJhbnNwYXJlbnQgb2JqZWN0cyByZW1haW4gc29ydGVkIGluZGVwZW5kZW50bHkuXHJcblx0XHQgKiBXaGVuIHRoaXMgcHJvcGVydHkgaXMgc2V0IGZvciBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgR3JvdXB9LGFsbCBkZXNjZW5kYW50c1xyXG5cdFx0ICogb2JqZWN0cyB3aWxsIGJlIHNvcnRlZCBhbmQgcmVuZGVyZWQgdG9nZXRoZXIuIFNvcnRpbmcgaXMgZnJvbSBsb3dlc3QgdG8gaGlnaGVzdFxyXG5cdFx0ICogcmVuZGVyIG9yZGVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVuZGVyT3JkZXIgPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQW4gYXJyYXkgaG9sZGluZyB0aGUgYW5pbWF0aW9uIGNsaXBzIG9mIHRoZSAzRCBvYmplY3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PEFuaW1hdGlvbkNsaXA+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFuaW1hdGlvbnMgPSBbXTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEN1c3RvbSBkZXB0aCBtYXRlcmlhbCB0byBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIHRvIHRoZSBkZXB0aCBtYXAuIENhbiBvbmx5IGJlIHVzZWRcclxuXHRcdCAqIGluIGNvbnRleHQgb2YgbWVzaGVzLiBXaGVuIHNoYWRvdy1jYXN0aW5nIHdpdGggYSB7QGxpbmsgRGlyZWN0aW9uYWxMaWdodH0gb3Ige0BsaW5rIFNwb3RMaWdodH0sXHJcblx0XHQgKiBpZiB5b3UgYXJlIG1vZGlmeWluZyB2ZXJ0ZXggcG9zaXRpb25zIGluIHRoZSB2ZXJ0ZXggc2hhZGVyIHlvdSBtdXN0IHNwZWNpZnkgYSBjdXN0b20gZGVwdGhcclxuXHRcdCAqIG1hdGVyaWFsIGZvciBwcm9wZXIgc2hhZG93cy5cclxuXHRcdCAqXHJcblx0XHQgKiBPbmx5IHJlbGV2YW50IGluIGNvbnRleHQgb2Yge0BsaW5rIFdlYkdMUmVuZGVyZXJ9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoTWF0ZXJpYWx8dW5kZWZpbmVkKX1cclxuXHRcdCAqIEBkZWZhdWx0IHVuZGVmaW5lZFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmN1c3RvbURlcHRoTWF0ZXJpYWwgPSB1bmRlZmluZWQ7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTYW1lIGFzIHtAbGluayBPYmplY3QzRCNjdXN0b21EZXB0aE1hdGVyaWFsfSwgYnV0IHVzZWQgd2l0aCB7QGxpbmsgUG9pbnRMaWdodH0uXHJcblx0XHQgKlxyXG5cdFx0ICogT25seSByZWxldmFudCBpbiBjb250ZXh0IG9mIHtAbGluayBXZWJHTFJlbmRlcmVyfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KE1hdGVyaWFsfHVuZGVmaW5lZCl9XHJcblx0XHQgKiBAZGVmYXVsdCB1bmRlZmluZWRcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jdXN0b21EaXN0YW5jZU1hdGVyaWFsID0gdW5kZWZpbmVkO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQW4gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gc3RvcmUgY3VzdG9tIGRhdGEgYWJvdXQgdGhlIDNEIG9iamVjdC4gSXRcclxuXHRcdCAqIHNob3VsZCBub3QgaG9sZCByZWZlcmVuY2VzIHRvIGZ1bmN0aW9ucyBhcyB0aGVzZSB3aWxsIG5vdCBiZSBjbG9uZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51c2VyRGF0YSA9IHt9O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEEgY2FsbGJhY2sgdGhhdCBpcyBleGVjdXRlZCBpbW1lZGlhdGVseSBiZWZvcmUgYSAzRCBvYmplY3QgaXMgcmVuZGVyZWQgdG8gYSBzaGFkb3cgbWFwLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSZW5kZXJlcnxXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcGFyYW0ge09iamVjdDNEfSBvYmplY3QgLSBUaGUgM0Qgb2JqZWN0LlxyXG5cdCAqIEBwYXJhbSB7Q2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIHRoYXQgaXMgdXNlZCB0byByZW5kZXIgdGhlIHNjZW5lLlxyXG5cdCAqIEBwYXJhbSB7Q2FtZXJhfSBzaGFkb3dDYW1lcmEgLSBUaGUgc2hhZG93IGNhbWVyYS5cclxuXHQgKiBAcGFyYW0ge0J1ZmZlckdlb21ldHJ5fSBnZW9tZXRyeSAtIFRoZSAzRCBvYmplY3QncyBnZW9tZXRyeS5cclxuXHQgKiBAcGFyYW0ge01hdGVyaWFsfSBkZXB0aE1hdGVyaWFsIC0gVGhlIGRlcHRoIG1hdGVyaWFsLlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBncm91cCAtIFRoZSBnZW9tZXRyeSBncm91cCBkYXRhLlxyXG5cdCAqL1xyXG5cdG9uQmVmb3JlU2hhZG93KCAvKiByZW5kZXJlciwgb2JqZWN0LCBjYW1lcmEsIHNoYWRvd0NhbWVyYSwgZ2VvbWV0cnksIGRlcHRoTWF0ZXJpYWwsIGdyb3VwICovICkge31cclxuXHJcblx0LyoqXHJcblx0ICogQSBjYWxsYmFjayB0aGF0IGlzIGV4ZWN1dGVkIGltbWVkaWF0ZWx5IGFmdGVyIGEgM0Qgb2JqZWN0IGlzIHJlbmRlcmVkIHRvIGEgc2hhZG93IG1hcC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyZXJ8V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcblx0ICogQHBhcmFtIHtPYmplY3QzRH0gb2JqZWN0IC0gVGhlIDNEIG9iamVjdC5cclxuXHQgKiBAcGFyYW0ge0NhbWVyYX0gY2FtZXJhIC0gVGhlIGNhbWVyYSB0aGF0IGlzIHVzZWQgdG8gcmVuZGVyIHRoZSBzY2VuZS5cclxuXHQgKiBAcGFyYW0ge0NhbWVyYX0gc2hhZG93Q2FtZXJhIC0gVGhlIHNoYWRvdyBjYW1lcmEuXHJcblx0ICogQHBhcmFtIHtCdWZmZXJHZW9tZXRyeX0gZ2VvbWV0cnkgLSBUaGUgM0Qgb2JqZWN0J3MgZ2VvbWV0cnkuXHJcblx0ICogQHBhcmFtIHtNYXRlcmlhbH0gZGVwdGhNYXRlcmlhbCAtIFRoZSBkZXB0aCBtYXRlcmlhbC5cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gZ3JvdXAgLSBUaGUgZ2VvbWV0cnkgZ3JvdXAgZGF0YS5cclxuXHQgKi9cclxuXHRvbkFmdGVyU2hhZG93KCAvKiByZW5kZXJlciwgb2JqZWN0LCBjYW1lcmEsIHNoYWRvd0NhbWVyYSwgZ2VvbWV0cnksIGRlcHRoTWF0ZXJpYWwsIGdyb3VwICovICkge31cclxuXHJcblx0LyoqXHJcblx0ICogQSBjYWxsYmFjayB0aGF0IGlzIGV4ZWN1dGVkIGltbWVkaWF0ZWx5IGJlZm9yZSBhIDNEIG9iamVjdCBpcyByZW5kZXJlZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyZXJ8V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcblx0ICogQHBhcmFtIHtPYmplY3QzRH0gb2JqZWN0IC0gVGhlIDNEIG9iamVjdC5cclxuXHQgKiBAcGFyYW0ge0NhbWVyYX0gY2FtZXJhIC0gVGhlIGNhbWVyYSB0aGF0IGlzIHVzZWQgdG8gcmVuZGVyIHRoZSBzY2VuZS5cclxuXHQgKiBAcGFyYW0ge0J1ZmZlckdlb21ldHJ5fSBnZW9tZXRyeSAtIFRoZSAzRCBvYmplY3QncyBnZW9tZXRyeS5cclxuXHQgKiBAcGFyYW0ge01hdGVyaWFsfSBtYXRlcmlhbCAtIFRoZSAzRCBvYmplY3QncyBtYXRlcmlhbC5cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gZ3JvdXAgLSBUaGUgZ2VvbWV0cnkgZ3JvdXAgZGF0YS5cclxuXHQgKi9cclxuXHRvbkJlZm9yZVJlbmRlciggLyogcmVuZGVyZXIsIHNjZW5lLCBjYW1lcmEsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXAgKi8gKSB7fVxyXG5cclxuXHQvKipcclxuXHQgKiBBIGNhbGxiYWNrIHRoYXQgaXMgZXhlY3V0ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgYSAzRCBvYmplY3QgaXMgcmVuZGVyZWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JlbmRlcmVyfFdlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0M0R9IG9iamVjdCAtIFRoZSAzRCBvYmplY3QuXHJcblx0ICogQHBhcmFtIHtDYW1lcmF9IGNhbWVyYSAtIFRoZSBjYW1lcmEgdGhhdCBpcyB1c2VkIHRvIHJlbmRlciB0aGUgc2NlbmUuXHJcblx0ICogQHBhcmFtIHtCdWZmZXJHZW9tZXRyeX0gZ2VvbWV0cnkgLSBUaGUgM0Qgb2JqZWN0J3MgZ2VvbWV0cnkuXHJcblx0ICogQHBhcmFtIHtNYXRlcmlhbH0gbWF0ZXJpYWwgLSBUaGUgM0Qgb2JqZWN0J3MgbWF0ZXJpYWwuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGdyb3VwIC0gVGhlIGdlb21ldHJ5IGdyb3VwIGRhdGEuXHJcblx0ICovXHJcblx0b25BZnRlclJlbmRlciggLyogcmVuZGVyZXIsIHNjZW5lLCBjYW1lcmEsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXAgKi8gKSB7fVxyXG5cclxuXHQvKipcclxuXHQgKiBBcHBsaWVzIHRoZSBnaXZlbiB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggdG8gdGhlIG9iamVjdCBhbmQgdXBkYXRlcyB0aGUgb2JqZWN0J3MgcG9zaXRpb24sXHJcblx0ICogcm90YXRpb24gYW5kIHNjYWxlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRyaXg0fSBtYXRyaXggLSBUaGUgdHJhbnNmb3JtYXRpb24gbWF0cml4LlxyXG5cdCAqL1xyXG5cdGFwcGx5TWF0cml4NCggbWF0cml4ICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5tYXRyaXhBdXRvVXBkYXRlICkgdGhpcy51cGRhdGVNYXRyaXgoKTtcclxuXHJcblx0XHR0aGlzLm1hdHJpeC5wcmVtdWx0aXBseSggbWF0cml4ICk7XHJcblxyXG5cdFx0dGhpcy5tYXRyaXguZGVjb21wb3NlKCB0aGlzLnBvc2l0aW9uLCB0aGlzLnF1YXRlcm5pb24sIHRoaXMuc2NhbGUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBcHBsaWVzIGEgcm90YXRpb24gcmVwcmVzZW50ZWQgYnkgZ2l2ZW4gdGhlIHF1YXRlcm5pb24gdG8gdGhlIDNEIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UXVhdGVybmlvbn0gcSAtIFRoZSBxdWF0ZXJuaW9uLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdDNEfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGFwcGx5UXVhdGVybmlvbiggcSApIHtcclxuXHJcblx0XHR0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkoIHEgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBnaXZlbiByb3RhdGlvbiByZXByZXNlbnRlZCBhcyBhbiBheGlzL2FuZ2xlIGNvdXBsZSB0byB0aGUgM0Qgb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBheGlzIC0gVGhlIChub3JtYWxpemVkKSBheGlzIHZlY3Rvci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYW5nbGUgLSBUaGUgYW5nbGUgaW4gcmFkaWFucy5cclxuXHQgKi9cclxuXHRzZXRSb3RhdGlvbkZyb21BeGlzQW5nbGUoIGF4aXMsIGFuZ2xlICkge1xyXG5cclxuXHRcdC8vIGFzc3VtZXMgYXhpcyBpcyBub3JtYWxpemVkXHJcblxyXG5cdFx0dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21BeGlzQW5nbGUoIGF4aXMsIGFuZ2xlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZ2l2ZW4gcm90YXRpb24gcmVwcmVzZW50ZWQgYXMgRXVsZXIgYW5nbGVzIHRvIHRoZSAzRCBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0V1bGVyfSBldWxlciAtIFRoZSBFdWxlciBhbmdsZXMuXHJcblx0ICovXHJcblx0c2V0Um90YXRpb25Gcm9tRXVsZXIoIGV1bGVyICkge1xyXG5cclxuXHRcdHRoaXMucXVhdGVybmlvbi5zZXRGcm9tRXVsZXIoIGV1bGVyLCB0cnVlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZ2l2ZW4gcm90YXRpb24gcmVwcmVzZW50ZWQgYXMgcm90YXRpb24gbWF0cml4IHRvIHRoZSAzRCBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDR9IG0gLSBBbHRob3VnaCBhIDR4NCBtYXRyaXggaXMgZXhwZWN0ZWQsIHRoZSB1cHBlciAzeDMgcG9ydGlvbiBtdXN0IGJlXHJcblx0ICogYSBwdXJlIHJvdGF0aW9uIG1hdHJpeCAoaS5lLCB1bnNjYWxlZCkuXHJcblx0ICovXHJcblx0c2V0Um90YXRpb25Gcm9tTWF0cml4KCBtICkge1xyXG5cclxuXHRcdC8vIGFzc3VtZXMgdGhlIHVwcGVyIDN4MyBvZiBtIGlzIGEgcHVyZSByb3RhdGlvbiBtYXRyaXggKGkuZSwgdW5zY2FsZWQpXHJcblxyXG5cdFx0dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeCggbSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGdpdmVuIHJvdGF0aW9uIHJlcHJlc2VudGVkIGFzIGEgUXVhdGVybmlvbiB0byB0aGUgM0Qgb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtRdWF0ZXJuaW9ufSBxIC0gVGhlIFF1YXRlcm5pb25cclxuXHQgKi9cclxuXHRzZXRSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKCBxICkge1xyXG5cclxuXHRcdC8vIGFzc3VtZXMgcSBpcyBub3JtYWxpemVkXHJcblxyXG5cdFx0dGhpcy5xdWF0ZXJuaW9uLmNvcHkoIHEgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSb3RhdGVzIHRoZSAzRCBvYmplY3QgYWxvbmcgYW4gYXhpcyBpbiBsb2NhbCBzcGFjZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gYXhpcyAtIFRoZSAobm9ybWFsaXplZCkgYXhpcyB2ZWN0b3IuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFuZ2xlIC0gVGhlIGFuZ2xlIGluIHJhZGlhbnMuXHJcblx0ICogQHJldHVybiB7T2JqZWN0M0R9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0cm90YXRlT25BeGlzKCBheGlzLCBhbmdsZSApIHtcclxuXHJcblx0XHQvLyByb3RhdGUgb2JqZWN0IG9uIGF4aXMgaW4gb2JqZWN0IHNwYWNlXHJcblx0XHQvLyBheGlzIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZFxyXG5cclxuXHRcdF9xMS5zZXRGcm9tQXhpc0FuZ2xlKCBheGlzLCBhbmdsZSApO1xyXG5cclxuXHRcdHRoaXMucXVhdGVybmlvbi5tdWx0aXBseSggX3ExICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUm90YXRlcyB0aGUgM0Qgb2JqZWN0IGFsb25nIGFuIGF4aXMgaW4gd29ybGQgc3BhY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IGF4aXMgLSBUaGUgKG5vcm1hbGl6ZWQpIGF4aXMgdmVjdG9yLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhbmdsZSAtIFRoZSBhbmdsZSBpbiByYWRpYW5zLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdDNEfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHJvdGF0ZU9uV29ybGRBeGlzKCBheGlzLCBhbmdsZSApIHtcclxuXHJcblx0XHQvLyByb3RhdGUgb2JqZWN0IG9uIGF4aXMgaW4gd29ybGQgc3BhY2VcclxuXHRcdC8vIGF4aXMgaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkXHJcblx0XHQvLyBtZXRob2QgYXNzdW1lcyBubyByb3RhdGVkIHBhcmVudFxyXG5cclxuXHRcdF9xMS5zZXRGcm9tQXhpc0FuZ2xlKCBheGlzLCBhbmdsZSApO1xyXG5cclxuXHRcdHRoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseSggX3ExICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUm90YXRlcyB0aGUgM0Qgb2JqZWN0IGFyb3VuZCBpdHMgWCBheGlzIGluIGxvY2FsIHNwYWNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFuZ2xlIC0gVGhlIGFuZ2xlIGluIHJhZGlhbnMuXHJcblx0ICogQHJldHVybiB7T2JqZWN0M0R9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0cm90YXRlWCggYW5nbGUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKCBfeEF4aXMsIGFuZ2xlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUm90YXRlcyB0aGUgM0Qgb2JqZWN0IGFyb3VuZCBpdHMgWSBheGlzIGluIGxvY2FsIHNwYWNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFuZ2xlIC0gVGhlIGFuZ2xlIGluIHJhZGlhbnMuXHJcblx0ICogQHJldHVybiB7T2JqZWN0M0R9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0cm90YXRlWSggYW5nbGUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKCBfeUF4aXMsIGFuZ2xlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUm90YXRlcyB0aGUgM0Qgb2JqZWN0IGFyb3VuZCBpdHMgWiBheGlzIGluIGxvY2FsIHNwYWNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFuZ2xlIC0gVGhlIGFuZ2xlIGluIHJhZGlhbnMuXHJcblx0ICogQHJldHVybiB7T2JqZWN0M0R9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0cm90YXRlWiggYW5nbGUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKCBfekF4aXMsIGFuZ2xlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVHJhbnNsYXRlIHRoZSAzRCBvYmplY3QgYnkgYSBkaXN0YW5jZSBhbG9uZyB0aGUgZ2l2ZW4gYXhpcyBpbiBsb2NhbCBzcGFjZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gYXhpcyAtIFRoZSAobm9ybWFsaXplZCkgYXhpcyB2ZWN0b3IuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGRpc3RhbmNlIC0gVGhlIGRpc3RhbmNlIGluIHdvcmxkIHVuaXRzLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdDNEfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHRyYW5zbGF0ZU9uQXhpcyggYXhpcywgZGlzdGFuY2UgKSB7XHJcblxyXG5cdFx0Ly8gdHJhbnNsYXRlIG9iamVjdCBieSBkaXN0YW5jZSBhbG9uZyBheGlzIGluIG9iamVjdCBzcGFjZVxyXG5cdFx0Ly8gYXhpcyBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWRcclxuXHJcblx0XHRfdjEuY29weSggYXhpcyApLmFwcGx5UXVhdGVybmlvbiggdGhpcy5xdWF0ZXJuaW9uICk7XHJcblxyXG5cdFx0dGhpcy5wb3NpdGlvbi5hZGQoIF92MS5tdWx0aXBseVNjYWxhciggZGlzdGFuY2UgKSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRyYW5zbGF0ZSB0aGUgM0Qgb2JqZWN0IGJ5IGEgZGlzdGFuY2UgYWxvbmcgaXRzIFgtYXhpcyBpbiBsb2NhbCBzcGFjZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBkaXN0YW5jZSAtIFRoZSBkaXN0YW5jZSBpbiB3b3JsZCB1bml0cy5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3QzRH0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHR0cmFuc2xhdGVYKCBkaXN0YW5jZSApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMoIF94QXhpcywgZGlzdGFuY2UgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUcmFuc2xhdGUgdGhlIDNEIG9iamVjdCBieSBhIGRpc3RhbmNlIGFsb25nIGl0cyBZLWF4aXMgaW4gbG9jYWwgc3BhY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZGlzdGFuY2UgLSBUaGUgZGlzdGFuY2UgaW4gd29ybGQgdW5pdHMuXHJcblx0ICogQHJldHVybiB7T2JqZWN0M0R9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0dHJhbnNsYXRlWSggZGlzdGFuY2UgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKCBfeUF4aXMsIGRpc3RhbmNlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVHJhbnNsYXRlIHRoZSAzRCBvYmplY3QgYnkgYSBkaXN0YW5jZSBhbG9uZyBpdHMgWi1heGlzIGluIGxvY2FsIHNwYWNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGRpc3RhbmNlIC0gVGhlIGRpc3RhbmNlIGluIHdvcmxkIHVuaXRzLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdDNEfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHRyYW5zbGF0ZVooIGRpc3RhbmNlICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyggX3pBeGlzLCBkaXN0YW5jZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnZlcnRzIHRoZSBnaXZlbiB2ZWN0b3IgZnJvbSB0aGlzIDNEIG9iamVjdCdzIGxvY2FsIHNwYWNlIHRvIHdvcmxkIHNwYWNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB2ZWN0b3IgLSBUaGUgdmVjdG9yIHRvIGNvbnZlcnQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gVGhlIGNvbnZlcnRlZCB2ZWN0b3IuXHJcblx0ICovXHJcblx0bG9jYWxUb1dvcmxkKCB2ZWN0b3IgKSB7XHJcblxyXG5cdFx0dGhpcy51cGRhdGVXb3JsZE1hdHJpeCggdHJ1ZSwgZmFsc2UgKTtcclxuXHJcblx0XHRyZXR1cm4gdmVjdG9yLmFwcGx5TWF0cml4NCggdGhpcy5tYXRyaXhXb3JsZCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnZlcnRzIHRoZSBnaXZlbiB2ZWN0b3IgZnJvbSB0aGlzIDNEIG9iamVjdCdzIHdvcmQgc3BhY2UgdG8gbG9jYWwgc3BhY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHZlY3RvciAtIFRoZSB2ZWN0b3IgdG8gY29udmVydC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBUaGUgY29udmVydGVkIHZlY3Rvci5cclxuXHQgKi9cclxuXHR3b3JsZFRvTG9jYWwoIHZlY3RvciApIHtcclxuXHJcblx0XHR0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCB0cnVlLCBmYWxzZSApO1xyXG5cclxuXHRcdHJldHVybiB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBfbTEuY29weSggdGhpcy5tYXRyaXhXb3JsZCApLmludmVydCgpICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUm90YXRlcyB0aGUgb2JqZWN0IHRvIGZhY2UgYSBwb2ludCBpbiB3b3JsZCBzcGFjZS5cclxuXHQgKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHN1cHBvcnQgb2JqZWN0cyBoYXZpbmcgbm9uLXVuaWZvcm1seS1zY2FsZWQgcGFyZW50KHMpLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ8VmVjdG9yM30geCAtIFRoZSB4IGNvb3JkaW5hdGUgaW4gd29ybGQgc3BhY2UuIEFsdGVybmF0aXZlbHksIGEgdmVjdG9yIHJlcHJlc2VudGluZyBhIHBvc2l0aW9uIGluIHdvcmxkIHNwYWNlXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt5XSAtIFRoZSB5IGNvb3JkaW5hdGUgaW4gd29ybGQgc3BhY2UuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt6XSAtIFRoZSB6IGNvb3JkaW5hdGUgaW4gd29ybGQgc3BhY2UuXHJcblx0ICovXHJcblx0bG9va0F0KCB4LCB5LCB6ICkge1xyXG5cclxuXHRcdC8vIFRoaXMgbWV0aG9kIGRvZXMgbm90IHN1cHBvcnQgb2JqZWN0cyBoYXZpbmcgbm9uLXVuaWZvcm1seS1zY2FsZWQgcGFyZW50KHMpXHJcblxyXG5cdFx0aWYgKCB4LmlzVmVjdG9yMyApIHtcclxuXHJcblx0XHRcdF90YXJnZXQuY29weSggeCApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRfdGFyZ2V0LnNldCggeCwgeSwgeiApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBwYXJlbnQgPSB0aGlzLnBhcmVudDtcclxuXHJcblx0XHR0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCB0cnVlLCBmYWxzZSApO1xyXG5cclxuXHRcdF9wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubWF0cml4V29ybGQgKTtcclxuXHJcblx0XHRpZiAoIHRoaXMuaXNDYW1lcmEgfHwgdGhpcy5pc0xpZ2h0ICkge1xyXG5cclxuXHRcdFx0X20xLmxvb2tBdCggX3Bvc2l0aW9uLCBfdGFyZ2V0LCB0aGlzLnVwICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdF9tMS5sb29rQXQoIF90YXJnZXQsIF9wb3NpdGlvbiwgdGhpcy51cCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KCBfbTEgKTtcclxuXHJcblx0XHRpZiAoIHBhcmVudCApIHtcclxuXHJcblx0XHRcdF9tMS5leHRyYWN0Um90YXRpb24oIHBhcmVudC5tYXRyaXhXb3JsZCApO1xyXG5cdFx0XHRfcTEuc2V0RnJvbVJvdGF0aW9uTWF0cml4KCBfbTEgKTtcclxuXHRcdFx0dGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KCBfcTEuaW52ZXJ0KCkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyB0aGUgZ2l2ZW4gM0Qgb2JqZWN0IGFzIGEgY2hpbGQgdG8gdGhpcyAzRCBvYmplY3QuIEFuIGFyYml0cmFyeSBudW1iZXIgb2ZcclxuXHQgKiBvYmplY3RzIG1heSBiZSBhZGRlZC4gQW55IGN1cnJlbnQgcGFyZW50IG9uIGFuIG9iamVjdCBwYXNzZWQgaW4gaGVyZSB3aWxsIGJlXHJcblx0ICogcmVtb3ZlZCwgc2luY2UgYW4gb2JqZWN0IGNhbiBoYXZlIGF0IG1vc3Qgb25lIHBhcmVudC5cclxuXHQgKlxyXG5cdCAqIEBmaXJlcyBPYmplY3QzRCNhZGRlZFxyXG5cdCAqIEBmaXJlcyBPYmplY3QzRCNjaGlsZGFkZGVkXHJcblx0ICogQHBhcmFtIHtPYmplY3QzRH0gb2JqZWN0IC0gVGhlIDNEIG9iamVjdCB0byBhZGQuXHJcblx0ICogQHJldHVybiB7T2JqZWN0M0R9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0YWRkKCBvYmplY3QgKSB7XHJcblxyXG5cdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoID4gMSApIHtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdHRoaXMuYWRkKCBhcmd1bWVudHNbIGkgXSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggb2JqZWN0ID09PSB0aGlzICkge1xyXG5cclxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk9iamVjdDNELmFkZDogb2JqZWN0IGNhblxcJ3QgYmUgYWRkZWQgYXMgYSBjaGlsZCBvZiBpdHNlbGYuJywgb2JqZWN0ICk7XHJcblx0XHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIG9iamVjdCAmJiBvYmplY3QuaXNPYmplY3QzRCApIHtcclxuXHJcblx0XHRcdG9iamVjdC5yZW1vdmVGcm9tUGFyZW50KCk7XHJcblx0XHRcdG9iamVjdC5wYXJlbnQgPSB0aGlzO1xyXG5cdFx0XHR0aGlzLmNoaWxkcmVuLnB1c2goIG9iamVjdCApO1xyXG5cclxuXHRcdFx0b2JqZWN0LmRpc3BhdGNoRXZlbnQoIF9hZGRlZEV2ZW50ICk7XHJcblxyXG5cdFx0XHRfY2hpbGRhZGRlZEV2ZW50LmNoaWxkID0gb2JqZWN0O1xyXG5cdFx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoIF9jaGlsZGFkZGVkRXZlbnQgKTtcclxuXHRcdFx0X2NoaWxkYWRkZWRFdmVudC5jaGlsZCA9IG51bGw7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5PYmplY3QzRC5hZGQ6IG9iamVjdCBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuT2JqZWN0M0QuJywgb2JqZWN0ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbW92ZXMgdGhlIGdpdmVuIDNEIG9iamVjdCBhcyBjaGlsZCBmcm9tIHRoaXMgM0Qgb2JqZWN0LlxyXG5cdCAqIEFuIGFyYml0cmFyeSBudW1iZXIgb2Ygb2JqZWN0cyBtYXkgYmUgcmVtb3ZlZC5cclxuXHQgKlxyXG5cdCAqIEBmaXJlcyBPYmplY3QzRCNyZW1vdmVkXHJcblx0ICogQGZpcmVzIE9iamVjdDNEI2NoaWxkcmVtb3ZlZFxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0M0R9IG9iamVjdCAtIFRoZSAzRCBvYmplY3QgdG8gcmVtb3ZlLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdDNEfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHJlbW92ZSggb2JqZWN0ICkge1xyXG5cclxuXHRcdGlmICggYXJndW1lbnRzLmxlbmd0aCA+IDEgKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLnJlbW92ZSggYXJndW1lbnRzWyBpIF0gKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBpbmRleCA9IHRoaXMuY2hpbGRyZW4uaW5kZXhPZiggb2JqZWN0ICk7XHJcblxyXG5cdFx0aWYgKCBpbmRleCAhPT0gLSAxICkge1xyXG5cclxuXHRcdFx0b2JqZWN0LnBhcmVudCA9IG51bGw7XHJcblx0XHRcdHRoaXMuY2hpbGRyZW4uc3BsaWNlKCBpbmRleCwgMSApO1xyXG5cclxuXHRcdFx0b2JqZWN0LmRpc3BhdGNoRXZlbnQoIF9yZW1vdmVkRXZlbnQgKTtcclxuXHJcblx0XHRcdF9jaGlsZHJlbW92ZWRFdmVudC5jaGlsZCA9IG9iamVjdDtcclxuXHRcdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCBfY2hpbGRyZW1vdmVkRXZlbnQgKTtcclxuXHRcdFx0X2NoaWxkcmVtb3ZlZEV2ZW50LmNoaWxkID0gbnVsbDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVtb3ZlcyB0aGlzIDNEIG9iamVjdCBmcm9tIGl0cyBjdXJyZW50IHBhcmVudC5cclxuXHQgKlxyXG5cdCAqIEBmaXJlcyBPYmplY3QzRCNyZW1vdmVkXHJcblx0ICogQGZpcmVzIE9iamVjdDNEI2NoaWxkcmVtb3ZlZFxyXG5cdCAqIEByZXR1cm4ge09iamVjdDNEfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHJlbW92ZUZyb21QYXJlbnQoKSB7XHJcblxyXG5cdFx0Y29uc3QgcGFyZW50ID0gdGhpcy5wYXJlbnQ7XHJcblxyXG5cdFx0aWYgKCBwYXJlbnQgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRwYXJlbnQucmVtb3ZlKCB0aGlzICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbW92ZXMgYWxsIGNoaWxkIG9iamVjdHMuXHJcblx0ICpcclxuXHQgKiBAZmlyZXMgT2JqZWN0M0QjcmVtb3ZlZFxyXG5cdCAqIEBmaXJlcyBPYmplY3QzRCNjaGlsZHJlbW92ZWRcclxuXHQgKiBAcmV0dXJuIHtPYmplY3QzRH0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjbGVhcigpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5yZW1vdmUoIC4uLiB0aGlzLmNoaWxkcmVuICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyB0aGUgZ2l2ZW4gM0Qgb2JqZWN0IGFzIGEgY2hpbGQgb2YgdGhpcyAzRCBvYmplY3QsIHdoaWxlIG1haW50YWluaW5nIHRoZSBvYmplY3QncyB3b3JsZFxyXG5cdCAqIHRyYW5zZm9ybS4gVGhpcyBtZXRob2QgZG9lcyBub3Qgc3VwcG9ydCBzY2VuZSBncmFwaHMgaGF2aW5nIG5vbi11bmlmb3JtbHktc2NhbGVkIG5vZGVzKHMpLlxyXG5cdCAqXHJcblx0ICogQGZpcmVzIE9iamVjdDNEI2FkZGVkXHJcblx0ICogQGZpcmVzIE9iamVjdDNEI2NoaWxkYWRkZWRcclxuXHQgKiBAcGFyYW0ge09iamVjdDNEfSBvYmplY3QgLSBUaGUgM0Qgb2JqZWN0IHRvIGF0dGFjaC5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3QzRH0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRhdHRhY2goIG9iamVjdCApIHtcclxuXHJcblx0XHQvLyBhZGRzIG9iamVjdCBhcyBhIGNoaWxkIG9mIHRoaXMsIHdoaWxlIG1haW50YWluaW5nIHRoZSBvYmplY3QncyB3b3JsZCB0cmFuc2Zvcm1cclxuXHJcblx0XHQvLyBOb3RlOiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBzdXBwb3J0IHNjZW5lIGdyYXBocyBoYXZpbmcgbm9uLXVuaWZvcm1seS1zY2FsZWQgbm9kZXMocylcclxuXHJcblx0XHR0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCB0cnVlLCBmYWxzZSApO1xyXG5cclxuXHRcdF9tMS5jb3B5KCB0aGlzLm1hdHJpeFdvcmxkICkuaW52ZXJ0KCk7XHJcblxyXG5cdFx0aWYgKCBvYmplY3QucGFyZW50ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0b2JqZWN0LnBhcmVudC51cGRhdGVXb3JsZE1hdHJpeCggdHJ1ZSwgZmFsc2UgKTtcclxuXHJcblx0XHRcdF9tMS5tdWx0aXBseSggb2JqZWN0LnBhcmVudC5tYXRyaXhXb3JsZCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRvYmplY3QuYXBwbHlNYXRyaXg0KCBfbTEgKTtcclxuXHJcblx0XHRvYmplY3QucmVtb3ZlRnJvbVBhcmVudCgpO1xyXG5cdFx0b2JqZWN0LnBhcmVudCA9IHRoaXM7XHJcblx0XHR0aGlzLmNoaWxkcmVuLnB1c2goIG9iamVjdCApO1xyXG5cclxuXHRcdG9iamVjdC51cGRhdGVXb3JsZE1hdHJpeCggZmFsc2UsIHRydWUgKTtcclxuXHJcblx0XHRvYmplY3QuZGlzcGF0Y2hFdmVudCggX2FkZGVkRXZlbnQgKTtcclxuXHJcblx0XHRfY2hpbGRhZGRlZEV2ZW50LmNoaWxkID0gb2JqZWN0O1xyXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCBfY2hpbGRhZGRlZEV2ZW50ICk7XHJcblx0XHRfY2hpbGRhZGRlZEV2ZW50LmNoaWxkID0gbnVsbDtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZWFyY2hlcyB0aHJvdWdoIHRoZSAzRCBvYmplY3QgYW5kIGl0cyBjaGlsZHJlbiwgc3RhcnRpbmcgd2l0aCB0aGUgM0Qgb2JqZWN0XHJcblx0ICogaXRzZWxmLCBhbmQgcmV0dXJucyB0aGUgZmlyc3Qgd2l0aCBhIG1hdGNoaW5nIElELlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGlkIC0gVGhlIGlkLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdDNEfHVuZGVmaW5lZH0gVGhlIGZvdW5kIDNEIG9iamVjdC4gUmV0dXJucyBgdW5kZWZpbmVkYCBpZiBubyAzRCBvYmplY3QgaGFzIGJlZW4gZm91bmQuXHJcblx0ICovXHJcblx0Z2V0T2JqZWN0QnlJZCggaWQgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlQcm9wZXJ0eSggJ2lkJywgaWQgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZWFyY2hlcyB0aHJvdWdoIHRoZSAzRCBvYmplY3QgYW5kIGl0cyBjaGlsZHJlbiwgc3RhcnRpbmcgd2l0aCB0aGUgM0Qgb2JqZWN0XHJcblx0ICogaXRzZWxmLCBhbmQgcmV0dXJucyB0aGUgZmlyc3Qgd2l0aCBhIG1hdGNoaW5nIG5hbWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdDNEfHVuZGVmaW5lZH0gVGhlIGZvdW5kIDNEIG9iamVjdC4gUmV0dXJucyBgdW5kZWZpbmVkYCBpZiBubyAzRCBvYmplY3QgaGFzIGJlZW4gZm91bmQuXHJcblx0ICovXHJcblx0Z2V0T2JqZWN0QnlOYW1lKCBuYW1lICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmdldE9iamVjdEJ5UHJvcGVydHkoICduYW1lJywgbmFtZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNlYXJjaGVzIHRocm91Z2ggdGhlIDNEIG9iamVjdCBhbmQgaXRzIGNoaWxkcmVuLCBzdGFydGluZyB3aXRoIHRoZSAzRCBvYmplY3RcclxuXHQgKiBpdHNlbGYsIGFuZCByZXR1cm5zIHRoZSBmaXJzdCB3aXRoIGEgbWF0Y2hpbmcgcHJvcGVydHkgdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS5cclxuXHQgKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBUaGUgdmFsdWUuXHJcblx0ICogQHJldHVybiB7T2JqZWN0M0R8dW5kZWZpbmVkfSBUaGUgZm91bmQgM0Qgb2JqZWN0LiBSZXR1cm5zIGB1bmRlZmluZWRgIGlmIG5vIDNEIG9iamVjdCBoYXMgYmVlbiBmb3VuZC5cclxuXHQgKi9cclxuXHRnZXRPYmplY3RCeVByb3BlcnR5KCBuYW1lLCB2YWx1ZSApIHtcclxuXHJcblx0XHRpZiAoIHRoaXNbIG5hbWUgXSA9PT0gdmFsdWUgKSByZXR1cm4gdGhpcztcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5bIGkgXTtcclxuXHRcdFx0Y29uc3Qgb2JqZWN0ID0gY2hpbGQuZ2V0T2JqZWN0QnlQcm9wZXJ0eSggbmFtZSwgdmFsdWUgKTtcclxuXHJcblx0XHRcdGlmICggb2JqZWN0ICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdHJldHVybiBvYmplY3Q7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB1bmRlZmluZWQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2VhcmNoZXMgdGhyb3VnaCB0aGUgM0Qgb2JqZWN0IGFuZCBpdHMgY2hpbGRyZW4sIHN0YXJ0aW5nIHdpdGggdGhlIDNEIG9iamVjdFxyXG5cdCAqIGl0c2VsZiwgYW5kIHJldHVybnMgYWxsIDNEIG9iamVjdHMgd2l0aCBhIG1hdGNoaW5nIHByb3BlcnR5IHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkuXHJcblx0ICogQHBhcmFtIHthbnl9IHZhbHVlIC0gVGhlIHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8T2JqZWN0M0Q+fSByZXN1bHQgLSBUaGUgbWV0aG9kIHN0b3JlcyB0aGUgcmVzdWx0IGluIHRoaXMgYXJyYXkuXHJcblx0ICogQHJldHVybiB7QXJyYXk8T2JqZWN0M0Q+fSBUaGUgZm91bmQgM0Qgb2JqZWN0cy5cclxuXHQgKi9cclxuXHRnZXRPYmplY3RzQnlQcm9wZXJ0eSggbmFtZSwgdmFsdWUsIHJlc3VsdCA9IFtdICkge1xyXG5cclxuXHRcdGlmICggdGhpc1sgbmFtZSBdID09PSB2YWx1ZSApIHJlc3VsdC5wdXNoKCB0aGlzICk7XHJcblxyXG5cdFx0Y29uc3QgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjaGlsZHJlblsgaSBdLmdldE9iamVjdHNCeVByb3BlcnR5KCBuYW1lLCB2YWx1ZSwgcmVzdWx0ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIHZlY3RvciByZXByZXNlbnRpbmcgdGhlIHBvc2l0aW9uIG9mIHRoZSAzRCBvYmplY3QgaW4gd29ybGQgc3BhY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHRhcmdldCAtIFRoZSB0YXJnZXQgdmVjdG9yIHRoZSByZXN1bHQgaXMgc3RvcmVkIHRvLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IFRoZSAzRCBvYmplY3QncyBwb3NpdGlvbiBpbiB3b3JsZCBzcGFjZS5cclxuXHQgKi9cclxuXHRnZXRXb3JsZFBvc2l0aW9uKCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0dGhpcy51cGRhdGVXb3JsZE1hdHJpeCggdHJ1ZSwgZmFsc2UgKTtcclxuXHJcblx0XHRyZXR1cm4gdGFyZ2V0LnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5tYXRyaXhXb3JsZCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBRdWF0ZXJuaW9uIHJlcHJlc2VudGluZyB0aGUgcG9zaXRpb24gb2YgdGhlIDNEIG9iamVjdCBpbiB3b3JsZCBzcGFjZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UXVhdGVybmlvbn0gdGFyZ2V0IC0gVGhlIHRhcmdldCBRdWF0ZXJuaW9uIHRoZSByZXN1bHQgaXMgc3RvcmVkIHRvLlxyXG5cdCAqIEByZXR1cm4ge1F1YXRlcm5pb259IFRoZSAzRCBvYmplY3QncyByb3RhdGlvbiBpbiB3b3JsZCBzcGFjZS5cclxuXHQgKi9cclxuXHRnZXRXb3JsZFF1YXRlcm5pb24oIHRhcmdldCApIHtcclxuXHJcblx0XHR0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCB0cnVlLCBmYWxzZSApO1xyXG5cclxuXHRcdHRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKCBfcG9zaXRpb24sIHRhcmdldCwgX3NjYWxlICk7XHJcblxyXG5cdFx0cmV0dXJuIHRhcmdldDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgdmVjdG9yIHJlcHJlc2VudGluZyB0aGUgc2NhbGUgb2YgdGhlIDNEIG9iamVjdCBpbiB3b3JsZCBzcGFjZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdGFyZ2V0IC0gVGhlIHRhcmdldCB2ZWN0b3IgdGhlIHJlc3VsdCBpcyBzdG9yZWQgdG8uXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gVGhlIDNEIG9iamVjdCdzIHNjYWxlIGluIHdvcmxkIHNwYWNlLlxyXG5cdCAqL1xyXG5cdGdldFdvcmxkU2NhbGUoIHRhcmdldCApIHtcclxuXHJcblx0XHR0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCB0cnVlLCBmYWxzZSApO1xyXG5cclxuXHRcdHRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKCBfcG9zaXRpb24sIF9xdWF0ZXJuaW9uLCB0YXJnZXQgKTtcclxuXHJcblx0XHRyZXR1cm4gdGFyZ2V0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSB2ZWN0b3IgcmVwcmVzZW50aW5nIHRoZSAoXCJsb29rXCIpIGRpcmVjdGlvbiBvZiB0aGUgM0Qgb2JqZWN0IGluIHdvcmxkIHNwYWNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IHZlY3RvciB0aGUgcmVzdWx0IGlzIHN0b3JlZCB0by5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBUaGUgM0Qgb2JqZWN0J3MgZGlyZWN0aW9uIGluIHdvcmxkIHNwYWNlLlxyXG5cdCAqL1xyXG5cdGdldFdvcmxkRGlyZWN0aW9uKCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0dGhpcy51cGRhdGVXb3JsZE1hdHJpeCggdHJ1ZSwgZmFsc2UgKTtcclxuXHJcblx0XHRjb25zdCBlID0gdGhpcy5tYXRyaXhXb3JsZC5lbGVtZW50cztcclxuXHJcblx0XHRyZXR1cm4gdGFyZ2V0LnNldCggZVsgOCBdLCBlWyA5IF0sIGVbIDEwIF0gKS5ub3JtYWxpemUoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBYnN0cmFjdCBtZXRob2QgdG8gZ2V0IGludGVyc2VjdGlvbnMgYmV0d2VlbiBhIGNhc3RlZCByYXkgYW5kIHRoaXNcclxuXHQgKiAzRCBvYmplY3QuIFJlbmRlcmFibGUgM0Qgb2JqZWN0cyBzdWNoIGFzIHtAbGluayBNZXNofSwge0BsaW5rIExpbmV9IG9yIHtAbGluayBQb2ludHN9XHJcblx0ICogaW1wbGVtZW50IHRoaXMgbWV0aG9kIGluIG9yZGVyIHRvIHVzZSByYXljYXN0aW5nLlxyXG5cdCAqXHJcblx0ICogQGFic3RyYWN0XHJcblx0ICogQHBhcmFtIHtSYXljYXN0ZXJ9IHJheWNhc3RlciAtIFRoZSByYXljYXN0ZXIuXHJcblx0ICogQHBhcmFtIHtBcnJheTxPYmplY3Q+fSBpbnRlcnNlY3RzIC0gQW4gYXJyYXkgaG9sZGluZyB0aGUgcmVzdWx0IG9mIHRoZSBtZXRob2QuXHJcblx0ICovXHJcblx0cmF5Y2FzdCggLyogcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICovICkge31cclxuXHJcblx0LyoqXHJcblx0ICogRXhlY3V0ZXMgdGhlIGNhbGxiYWNrIG9uIHRoaXMgM0Qgb2JqZWN0IGFuZCBhbGwgZGVzY2VuZGFudHMuXHJcblx0ICpcclxuXHQgKiBOb3RlOiBNb2RpZnlpbmcgdGhlIHNjZW5lIGdyYXBoIGluc2lkZSB0aGUgY2FsbGJhY2sgaXMgZGlzY291cmFnZWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayAtIEEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBhbGxvd3MgdG8gcHJvY2VzcyB0aGUgY3VycmVudCAzRCBvYmplY3QuXHJcblx0ICovXHJcblx0dHJhdmVyc2UoIGNhbGxiYWNrICkge1xyXG5cclxuXHRcdGNhbGxiYWNrKCB0aGlzICk7XHJcblxyXG5cdFx0Y29uc3QgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjaGlsZHJlblsgaSBdLnRyYXZlcnNlKCBjYWxsYmFjayApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBMaWtlIHtAbGluayBPYmplY3QzRCN0cmF2ZXJzZX0sIGJ1dCB0aGUgY2FsbGJhY2sgd2lsbCBvbmx5IGJlIGV4ZWN1dGVkIGZvciB2aXNpYmxlIDNEIG9iamVjdHMuXHJcblx0ICogRGVzY2VuZGFudHMgb2YgaW52aXNpYmxlIDNEIG9iamVjdHMgYXJlIG5vdCB0cmF2ZXJzZWQuXHJcblx0ICpcclxuXHQgKiBOb3RlOiBNb2RpZnlpbmcgdGhlIHNjZW5lIGdyYXBoIGluc2lkZSB0aGUgY2FsbGJhY2sgaXMgZGlzY291cmFnZWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayAtIEEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBhbGxvd3MgdG8gcHJvY2VzcyB0aGUgY3VycmVudCAzRCBvYmplY3QuXHJcblx0ICovXHJcblx0dHJhdmVyc2VWaXNpYmxlKCBjYWxsYmFjayApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMudmlzaWJsZSA9PT0gZmFsc2UgKSByZXR1cm47XHJcblxyXG5cdFx0Y2FsbGJhY2soIHRoaXMgKTtcclxuXHJcblx0XHRjb25zdCBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW47XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNoaWxkcmVuWyBpIF0udHJhdmVyc2VWaXNpYmxlKCBjYWxsYmFjayApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBMaWtlIHtAbGluayBPYmplY3QzRCN0cmF2ZXJzZX0sIGJ1dCB0aGUgY2FsbGJhY2sgd2lsbCBvbmx5IGJlIGV4ZWN1dGVkIGZvciBhbGwgYW5jZXN0b3JzLlxyXG5cdCAqXHJcblx0ICogTm90ZTogTW9kaWZ5aW5nIHRoZSBzY2VuZSBncmFwaCBpbnNpZGUgdGhlIGNhbGxiYWNrIGlzIGRpc2NvdXJhZ2VkLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgLSBBIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgYWxsb3dzIHRvIHByb2Nlc3MgdGhlIGN1cnJlbnQgM0Qgb2JqZWN0LlxyXG5cdCAqL1xyXG5cdHRyYXZlcnNlQW5jZXN0b3JzKCBjYWxsYmFjayApIHtcclxuXHJcblx0XHRjb25zdCBwYXJlbnQgPSB0aGlzLnBhcmVudDtcclxuXHJcblx0XHRpZiAoIHBhcmVudCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGNhbGxiYWNrKCBwYXJlbnQgKTtcclxuXHJcblx0XHRcdHBhcmVudC50cmF2ZXJzZUFuY2VzdG9ycyggY2FsbGJhY2sgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4IGluIGxvY2FsIHNwYWNlIGJ5IGNvbXB1dGluZyBpdCBmcm9tIHRoZSBjdXJyZW50XHJcblx0ICogcG9zaXRpb24sIHJvdGF0aW9uIGFuZCBzY2FsZSB2YWx1ZXMuXHJcblx0ICovXHJcblx0dXBkYXRlTWF0cml4KCkge1xyXG5cclxuXHRcdHRoaXMubWF0cml4LmNvbXBvc2UoIHRoaXMucG9zaXRpb24sIHRoaXMucXVhdGVybmlvbiwgdGhpcy5zY2FsZSApO1xyXG5cclxuXHRcdHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4IGluIHdvcmxkIHNwYWNlIG9mIHRoaXMgM0Qgb2JqZWN0cyBhbmQgaXRzIGRlc2NlbmRhbnRzLlxyXG5cdCAqXHJcblx0ICogVG8gZW5zdXJlIGNvcnJlY3QgcmVzdWx0cywgdGhpcyBtZXRob2QgYWxzbyByZWNvbXB1dGVzIHRoZSAzRCBvYmplY3QncyB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggaW5cclxuXHQgKiBsb2NhbCBzcGFjZS4gVGhlIGNvbXB1dGF0aW9uIG9mIHRoZSBsb2NhbCBhbmQgd29ybGQgbWF0cml4IGNhbiBiZSBjb250cm9sbGVkIHdpdGggdGhlXHJcblx0ICoge0BsaW5rIE9iamVjdDNEI21hdHJpeEF1dG9VcGRhdGV9IGFuZCB7QGxpbmsgT2JqZWN0M0QjbWF0cml4V29ybGRBdXRvVXBkYXRlfSBmbGFncyB3aGljaCBhcmUgYm90aFxyXG5cdCAqIGB0cnVlYCBieSBkZWZhdWx0LiAgU2V0IHRoZXNlIGZsYWdzIHRvIGBmYWxzZWAgaWYgeW91IG5lZWQgbW9yZSBjb250cm9sIG92ZXIgdGhlIHVwZGF0ZSBtYXRyaXggcHJvY2Vzcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ZvcmNlPWZhbHNlXSAtIFdoZW4gc2V0IHRvIGB0cnVlYCwgYSByZWNvbXB1dGF0aW9uIG9mIHdvcmxkIG1hdHJpY2VzIGlzIGZvcmNlZCBldmVuXHJcblx0ICogd2hlbiB7QGxpbmsgT2JqZWN0M0QjbWF0cml4V29ybGRBdXRvVXBkYXRlfSBpcyBzZXQgdG8gYGZhbHNlYC5cclxuXHQgKi9cclxuXHR1cGRhdGVNYXRyaXhXb3JsZCggZm9yY2UgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm1hdHJpeEF1dG9VcGRhdGUgKSB0aGlzLnVwZGF0ZU1hdHJpeCgpO1xyXG5cclxuXHRcdGlmICggdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlIHx8IGZvcmNlICkge1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLm1hdHJpeFdvcmxkQXV0b1VwZGF0ZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0aWYgKCB0aGlzLnBhcmVudCA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHR0aGlzLm1hdHJpeFdvcmxkLmNvcHkoIHRoaXMubWF0cml4ICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0dGhpcy5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKCB0aGlzLnBhcmVudC5tYXRyaXhXb3JsZCwgdGhpcy5tYXRyaXggKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gZmFsc2U7XHJcblxyXG5cdFx0XHRmb3JjZSA9IHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIG1ha2Ugc3VyZSBkZXNjZW5kYW50cyBhcmUgdXBkYXRlZCBpZiByZXF1aXJlZFxyXG5cclxuXHRcdGNvbnN0IGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbjtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgY2hpbGQgPSBjaGlsZHJlblsgaSBdO1xyXG5cclxuXHRcdFx0Y2hpbGQudXBkYXRlTWF0cml4V29ybGQoIGZvcmNlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFuIGFsdGVybmF0aXZlIHZlcnNpb24gb2Yge0BsaW5rIE9iamVjdDNEI3VwZGF0ZU1hdHJpeFdvcmxkfSB3aXRoIG1vcmUgY29udHJvbCBvdmVyIHRoZVxyXG5cdCAqIHVwZGF0ZSBvZiBhbmNlc3RvciBhbmQgZGVzY2VuZGFudCBub2Rlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW3VwZGF0ZVBhcmVudHM9ZmFsc2VdIFdoZXRoZXIgYW5jZXN0b3Igbm9kZXMgc2hvdWxkIGJlIHVwZGF0ZWQgb3Igbm90LlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW3VwZGF0ZUNoaWxkcmVuPWZhbHNlXSBXaGV0aGVyIGRlc2NlbmRhbnQgbm9kZXMgc2hvdWxkIGJlIHVwZGF0ZWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdHVwZGF0ZVdvcmxkTWF0cml4KCB1cGRhdGVQYXJlbnRzLCB1cGRhdGVDaGlsZHJlbiApIHtcclxuXHJcblx0XHRjb25zdCBwYXJlbnQgPSB0aGlzLnBhcmVudDtcclxuXHJcblx0XHRpZiAoIHVwZGF0ZVBhcmVudHMgPT09IHRydWUgJiYgcGFyZW50ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0cGFyZW50LnVwZGF0ZVdvcmxkTWF0cml4KCB0cnVlLCBmYWxzZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMubWF0cml4QXV0b1VwZGF0ZSApIHRoaXMudXBkYXRlTWF0cml4KCk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm1hdHJpeFdvcmxkQXV0b1VwZGF0ZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdGlmICggdGhpcy5wYXJlbnQgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdHRoaXMubWF0cml4V29ybGQuY29weSggdGhpcy5tYXRyaXggKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHRoaXMubWF0cml4V29ybGQubXVsdGlwbHlNYXRyaWNlcyggdGhpcy5wYXJlbnQubWF0cml4V29ybGQsIHRoaXMubWF0cml4ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIG1ha2Ugc3VyZSBkZXNjZW5kYW50cyBhcmUgdXBkYXRlZFxyXG5cclxuXHRcdGlmICggdXBkYXRlQ2hpbGRyZW4gPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW47XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBjaGlsZCA9IGNoaWxkcmVuWyBpIF07XHJcblxyXG5cdFx0XHRcdGNoaWxkLnVwZGF0ZVdvcmxkTWF0cml4KCBmYWxzZSwgdHJ1ZSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXJpYWxpemVzIHRoZSAzRCBvYmplY3QgaW50byBKU09OLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHs/KE9iamVjdHxzdHJpbmcpfSBtZXRhIC0gQW4gb3B0aW9uYWwgdmFsdWUgaG9sZGluZyBtZXRhIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZXJpYWxpemF0aW9uLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdH0gQSBKU09OIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNlcmlhbGl6ZWQgM0Qgb2JqZWN0LlxyXG5cdCAqIEBzZWUge0BsaW5rIE9iamVjdExvYWRlciNwYXJzZX1cclxuXHQgKi9cclxuXHR0b0pTT04oIG1ldGEgKSB7XHJcblxyXG5cdFx0Ly8gbWV0YSBpcyBhIHN0cmluZyB3aGVuIGNhbGxlZCBmcm9tIEpTT04uc3RyaW5naWZ5XHJcblx0XHRjb25zdCBpc1Jvb3RPYmplY3QgPSAoIG1ldGEgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgbWV0YSA9PT0gJ3N0cmluZycgKTtcclxuXHJcblx0XHRjb25zdCBvdXRwdXQgPSB7fTtcclxuXHJcblx0XHQvLyBtZXRhIGlzIGEgaGFzaCB1c2VkIHRvIGNvbGxlY3QgZ2VvbWV0cmllcywgbWF0ZXJpYWxzLlxyXG5cdFx0Ly8gbm90IHByb3ZpZGluZyBpdCBpbXBsaWVzIHRoYXQgdGhpcyBpcyB0aGUgcm9vdCBvYmplY3RcclxuXHRcdC8vIGJlaW5nIHNlcmlhbGl6ZWQuXHJcblx0XHRpZiAoIGlzUm9vdE9iamVjdCApIHtcclxuXHJcblx0XHRcdC8vIGluaXRpYWxpemUgbWV0YSBvYmpcclxuXHRcdFx0bWV0YSA9IHtcclxuXHRcdFx0XHRnZW9tZXRyaWVzOiB7fSxcclxuXHRcdFx0XHRtYXRlcmlhbHM6IHt9LFxyXG5cdFx0XHRcdHRleHR1cmVzOiB7fSxcclxuXHRcdFx0XHRpbWFnZXM6IHt9LFxyXG5cdFx0XHRcdHNoYXBlczoge30sXHJcblx0XHRcdFx0c2tlbGV0b25zOiB7fSxcclxuXHRcdFx0XHRhbmltYXRpb25zOiB7fSxcclxuXHRcdFx0XHRub2Rlczoge31cclxuXHRcdFx0fTtcclxuXHJcblx0XHRcdG91dHB1dC5tZXRhZGF0YSA9IHtcclxuXHRcdFx0XHR2ZXJzaW9uOiA0LjYsXHJcblx0XHRcdFx0dHlwZTogJ09iamVjdCcsXHJcblx0XHRcdFx0Z2VuZXJhdG9yOiAnT2JqZWN0M0QudG9KU09OJ1xyXG5cdFx0XHR9O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBzdGFuZGFyZCBPYmplY3QzRCBzZXJpYWxpemF0aW9uXHJcblxyXG5cdFx0Y29uc3Qgb2JqZWN0ID0ge307XHJcblxyXG5cdFx0b2JqZWN0LnV1aWQgPSB0aGlzLnV1aWQ7XHJcblx0XHRvYmplY3QudHlwZSA9IHRoaXMudHlwZTtcclxuXHJcblx0XHRpZiAoIHRoaXMubmFtZSAhPT0gJycgKSBvYmplY3QubmFtZSA9IHRoaXMubmFtZTtcclxuXHRcdGlmICggdGhpcy5jYXN0U2hhZG93ID09PSB0cnVlICkgb2JqZWN0LmNhc3RTaGFkb3cgPSB0cnVlO1xyXG5cdFx0aWYgKCB0aGlzLnJlY2VpdmVTaGFkb3cgPT09IHRydWUgKSBvYmplY3QucmVjZWl2ZVNoYWRvdyA9IHRydWU7XHJcblx0XHRpZiAoIHRoaXMudmlzaWJsZSA9PT0gZmFsc2UgKSBvYmplY3QudmlzaWJsZSA9IGZhbHNlO1xyXG5cdFx0aWYgKCB0aGlzLmZydXN0dW1DdWxsZWQgPT09IGZhbHNlICkgb2JqZWN0LmZydXN0dW1DdWxsZWQgPSBmYWxzZTtcclxuXHRcdGlmICggdGhpcy5yZW5kZXJPcmRlciAhPT0gMCApIG9iamVjdC5yZW5kZXJPcmRlciA9IHRoaXMucmVuZGVyT3JkZXI7XHJcblx0XHRpZiAoIE9iamVjdC5rZXlzKCB0aGlzLnVzZXJEYXRhICkubGVuZ3RoID4gMCApIG9iamVjdC51c2VyRGF0YSA9IHRoaXMudXNlckRhdGE7XHJcblxyXG5cdFx0b2JqZWN0LmxheWVycyA9IHRoaXMubGF5ZXJzLm1hc2s7XHJcblx0XHRvYmplY3QubWF0cml4ID0gdGhpcy5tYXRyaXgudG9BcnJheSgpO1xyXG5cdFx0b2JqZWN0LnVwID0gdGhpcy51cC50b0FycmF5KCk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPT09IGZhbHNlICkgb2JqZWN0Lm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcclxuXHJcblx0XHQvLyBvYmplY3Qgc3BlY2lmaWMgcHJvcGVydGllc1xyXG5cclxuXHRcdGlmICggdGhpcy5pc0luc3RhbmNlZE1lc2ggKSB7XHJcblxyXG5cdFx0XHRvYmplY3QudHlwZSA9ICdJbnN0YW5jZWRNZXNoJztcclxuXHRcdFx0b2JqZWN0LmNvdW50ID0gdGhpcy5jb3VudDtcclxuXHRcdFx0b2JqZWN0Lmluc3RhbmNlTWF0cml4ID0gdGhpcy5pbnN0YW5jZU1hdHJpeC50b0pTT04oKTtcclxuXHRcdFx0aWYgKCB0aGlzLmluc3RhbmNlQ29sb3IgIT09IG51bGwgKSBvYmplY3QuaW5zdGFuY2VDb2xvciA9IHRoaXMuaW5zdGFuY2VDb2xvci50b0pTT04oKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aGlzLmlzQmF0Y2hlZE1lc2ggKSB7XHJcblxyXG5cdFx0XHRvYmplY3QudHlwZSA9ICdCYXRjaGVkTWVzaCc7XHJcblx0XHRcdG9iamVjdC5wZXJPYmplY3RGcnVzdHVtQ3VsbGVkID0gdGhpcy5wZXJPYmplY3RGcnVzdHVtQ3VsbGVkO1xyXG5cdFx0XHRvYmplY3Quc29ydE9iamVjdHMgPSB0aGlzLnNvcnRPYmplY3RzO1xyXG5cclxuXHRcdFx0b2JqZWN0LmRyYXdSYW5nZXMgPSB0aGlzLl9kcmF3UmFuZ2VzO1xyXG5cdFx0XHRvYmplY3QucmVzZXJ2ZWRSYW5nZXMgPSB0aGlzLl9yZXNlcnZlZFJhbmdlcztcclxuXHJcblx0XHRcdG9iamVjdC52aXNpYmlsaXR5ID0gdGhpcy5fdmlzaWJpbGl0eTtcclxuXHRcdFx0b2JqZWN0LmFjdGl2ZSA9IHRoaXMuX2FjdGl2ZTtcclxuXHRcdFx0b2JqZWN0LmJvdW5kcyA9IHRoaXMuX2JvdW5kcy5tYXAoIGJvdW5kID0+ICgge1xyXG5cdFx0XHRcdGJveEluaXRpYWxpemVkOiBib3VuZC5ib3hJbml0aWFsaXplZCxcclxuXHRcdFx0XHRib3hNaW46IGJvdW5kLmJveC5taW4udG9BcnJheSgpLFxyXG5cdFx0XHRcdGJveE1heDogYm91bmQuYm94Lm1heC50b0FycmF5KCksXHJcblxyXG5cdFx0XHRcdHNwaGVyZUluaXRpYWxpemVkOiBib3VuZC5zcGhlcmVJbml0aWFsaXplZCxcclxuXHRcdFx0XHRzcGhlcmVSYWRpdXM6IGJvdW5kLnNwaGVyZS5yYWRpdXMsXHJcblx0XHRcdFx0c3BoZXJlQ2VudGVyOiBib3VuZC5zcGhlcmUuY2VudGVyLnRvQXJyYXkoKVxyXG5cdFx0XHR9ICkgKTtcclxuXHJcblx0XHRcdG9iamVjdC5tYXhJbnN0YW5jZUNvdW50ID0gdGhpcy5fbWF4SW5zdGFuY2VDb3VudDtcclxuXHRcdFx0b2JqZWN0Lm1heFZlcnRleENvdW50ID0gdGhpcy5fbWF4VmVydGV4Q291bnQ7XHJcblx0XHRcdG9iamVjdC5tYXhJbmRleENvdW50ID0gdGhpcy5fbWF4SW5kZXhDb3VudDtcclxuXHJcblx0XHRcdG9iamVjdC5nZW9tZXRyeUluaXRpYWxpemVkID0gdGhpcy5fZ2VvbWV0cnlJbml0aWFsaXplZDtcclxuXHRcdFx0b2JqZWN0Lmdlb21ldHJ5Q291bnQgPSB0aGlzLl9nZW9tZXRyeUNvdW50O1xyXG5cclxuXHRcdFx0b2JqZWN0Lm1hdHJpY2VzVGV4dHVyZSA9IHRoaXMuX21hdHJpY2VzVGV4dHVyZS50b0pTT04oIG1ldGEgKTtcclxuXHJcblx0XHRcdGlmICggdGhpcy5fY29sb3JzVGV4dHVyZSAhPT0gbnVsbCApIG9iamVjdC5jb2xvcnNUZXh0dXJlID0gdGhpcy5fY29sb3JzVGV4dHVyZS50b0pTT04oIG1ldGEgKTtcclxuXHJcblx0XHRcdGlmICggdGhpcy5ib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0b2JqZWN0LmJvdW5kaW5nU3BoZXJlID0ge1xyXG5cdFx0XHRcdFx0Y2VudGVyOiBvYmplY3QuYm91bmRpbmdTcGhlcmUuY2VudGVyLnRvQXJyYXkoKSxcclxuXHRcdFx0XHRcdHJhZGl1czogb2JqZWN0LmJvdW5kaW5nU3BoZXJlLnJhZGl1c1xyXG5cdFx0XHRcdH07XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMuYm91bmRpbmdCb3ggIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdG9iamVjdC5ib3VuZGluZ0JveCA9IHtcclxuXHRcdFx0XHRcdG1pbjogb2JqZWN0LmJvdW5kaW5nQm94Lm1pbi50b0FycmF5KCksXHJcblx0XHRcdFx0XHRtYXg6IG9iamVjdC5ib3VuZGluZ0JveC5tYXgudG9BcnJheSgpXHJcblx0XHRcdFx0fTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRmdW5jdGlvbiBzZXJpYWxpemUoIGxpYnJhcnksIGVsZW1lbnQgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGxpYnJhcnlbIGVsZW1lbnQudXVpZCBdID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGxpYnJhcnlbIGVsZW1lbnQudXVpZCBdID0gZWxlbWVudC50b0pTT04oIG1ldGEgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBlbGVtZW50LnV1aWQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy5pc1NjZW5lICkge1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLmJhY2tncm91bmQgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggdGhpcy5iYWNrZ3JvdW5kLmlzQ29sb3IgKSB7XHJcblxyXG5cdFx0XHRcdFx0b2JqZWN0LmJhY2tncm91bmQgPSB0aGlzLmJhY2tncm91bmQudG9KU09OKCk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIHRoaXMuYmFja2dyb3VuZC5pc1RleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRcdFx0b2JqZWN0LmJhY2tncm91bmQgPSB0aGlzLmJhY2tncm91bmQudG9KU09OKCBtZXRhICkudXVpZDtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCB0aGlzLmVudmlyb25tZW50ICYmIHRoaXMuZW52aXJvbm1lbnQuaXNUZXh0dXJlICYmIHRoaXMuZW52aXJvbm1lbnQuaXNSZW5kZXJUYXJnZXRUZXh0dXJlICE9PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRvYmplY3QuZW52aXJvbm1lbnQgPSB0aGlzLmVudmlyb25tZW50LnRvSlNPTiggbWV0YSApLnV1aWQ7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmICggdGhpcy5pc01lc2ggfHwgdGhpcy5pc0xpbmUgfHwgdGhpcy5pc1BvaW50cyApIHtcclxuXHJcblx0XHRcdG9iamVjdC5nZW9tZXRyeSA9IHNlcmlhbGl6ZSggbWV0YS5nZW9tZXRyaWVzLCB0aGlzLmdlb21ldHJ5ICk7XHJcblxyXG5cdFx0XHRjb25zdCBwYXJhbWV0ZXJzID0gdGhpcy5nZW9tZXRyeS5wYXJhbWV0ZXJzO1xyXG5cclxuXHRcdFx0aWYgKCBwYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQgJiYgcGFyYW1ldGVycy5zaGFwZXMgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0Y29uc3Qgc2hhcGVzID0gcGFyYW1ldGVycy5zaGFwZXM7XHJcblxyXG5cdFx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggc2hhcGVzICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gc2hhcGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCBzaGFwZSA9IHNoYXBlc1sgaSBdO1xyXG5cclxuXHRcdFx0XHRcdFx0c2VyaWFsaXplKCBtZXRhLnNoYXBlcywgc2hhcGUgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0c2VyaWFsaXplKCBtZXRhLnNoYXBlcywgc2hhcGVzICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aGlzLmlzU2tpbm5lZE1lc2ggKSB7XHJcblxyXG5cdFx0XHRvYmplY3QuYmluZE1vZGUgPSB0aGlzLmJpbmRNb2RlO1xyXG5cdFx0XHRvYmplY3QuYmluZE1hdHJpeCA9IHRoaXMuYmluZE1hdHJpeC50b0FycmF5KCk7XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMuc2tlbGV0b24gIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0c2VyaWFsaXplKCBtZXRhLnNrZWxldG9ucywgdGhpcy5za2VsZXRvbiApO1xyXG5cclxuXHRcdFx0XHRvYmplY3Quc2tlbGV0b24gPSB0aGlzLnNrZWxldG9uLnV1aWQ7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy5tYXRlcmlhbCAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCB0aGlzLm1hdGVyaWFsICkgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHV1aWRzID0gW107XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHRoaXMubWF0ZXJpYWwubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHR1dWlkcy5wdXNoKCBzZXJpYWxpemUoIG1ldGEubWF0ZXJpYWxzLCB0aGlzLm1hdGVyaWFsWyBpIF0gKSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdG9iamVjdC5tYXRlcmlhbCA9IHV1aWRzO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0b2JqZWN0Lm1hdGVyaWFsID0gc2VyaWFsaXplKCBtZXRhLm1hdGVyaWFscywgdGhpcy5tYXRlcmlhbCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGlmICggdGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwICkge1xyXG5cclxuXHRcdFx0b2JqZWN0LmNoaWxkcmVuID0gW107XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0b2JqZWN0LmNoaWxkcmVuLnB1c2goIHRoaXMuY2hpbGRyZW5bIGkgXS50b0pTT04oIG1ldGEgKS5vYmplY3QgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRpZiAoIHRoaXMuYW5pbWF0aW9ucy5sZW5ndGggPiAwICkge1xyXG5cclxuXHRcdFx0b2JqZWN0LmFuaW1hdGlvbnMgPSBbXTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHRoaXMuYW5pbWF0aW9ucy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGFuaW1hdGlvbiA9IHRoaXMuYW5pbWF0aW9uc1sgaSBdO1xyXG5cclxuXHRcdFx0XHRvYmplY3QuYW5pbWF0aW9ucy5wdXNoKCBzZXJpYWxpemUoIG1ldGEuYW5pbWF0aW9ucywgYW5pbWF0aW9uICkgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBpc1Jvb3RPYmplY3QgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBnZW9tZXRyaWVzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS5nZW9tZXRyaWVzICk7XHJcblx0XHRcdGNvbnN0IG1hdGVyaWFscyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEubWF0ZXJpYWxzICk7XHJcblx0XHRcdGNvbnN0IHRleHR1cmVzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS50ZXh0dXJlcyApO1xyXG5cdFx0XHRjb25zdCBpbWFnZXMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLmltYWdlcyApO1xyXG5cdFx0XHRjb25zdCBzaGFwZXMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLnNoYXBlcyApO1xyXG5cdFx0XHRjb25zdCBza2VsZXRvbnMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLnNrZWxldG9ucyApO1xyXG5cdFx0XHRjb25zdCBhbmltYXRpb25zID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS5hbmltYXRpb25zICk7XHJcblx0XHRcdGNvbnN0IG5vZGVzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS5ub2RlcyApO1xyXG5cclxuXHRcdFx0aWYgKCBnZW9tZXRyaWVzLmxlbmd0aCA+IDAgKSBvdXRwdXQuZ2VvbWV0cmllcyA9IGdlb21ldHJpZXM7XHJcblx0XHRcdGlmICggbWF0ZXJpYWxzLmxlbmd0aCA+IDAgKSBvdXRwdXQubWF0ZXJpYWxzID0gbWF0ZXJpYWxzO1xyXG5cdFx0XHRpZiAoIHRleHR1cmVzLmxlbmd0aCA+IDAgKSBvdXRwdXQudGV4dHVyZXMgPSB0ZXh0dXJlcztcclxuXHRcdFx0aWYgKCBpbWFnZXMubGVuZ3RoID4gMCApIG91dHB1dC5pbWFnZXMgPSBpbWFnZXM7XHJcblx0XHRcdGlmICggc2hhcGVzLmxlbmd0aCA+IDAgKSBvdXRwdXQuc2hhcGVzID0gc2hhcGVzO1xyXG5cdFx0XHRpZiAoIHNrZWxldG9ucy5sZW5ndGggPiAwICkgb3V0cHV0LnNrZWxldG9ucyA9IHNrZWxldG9ucztcclxuXHRcdFx0aWYgKCBhbmltYXRpb25zLmxlbmd0aCA+IDAgKSBvdXRwdXQuYW5pbWF0aW9ucyA9IGFuaW1hdGlvbnM7XHJcblx0XHRcdGlmICggbm9kZXMubGVuZ3RoID4gMCApIG91dHB1dC5ub2RlcyA9IG5vZGVzO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRvdXRwdXQub2JqZWN0ID0gb2JqZWN0O1xyXG5cclxuXHRcdHJldHVybiBvdXRwdXQ7XHJcblxyXG5cdFx0Ly8gZXh0cmFjdCBkYXRhIGZyb20gdGhlIGNhY2hlIGhhc2hcclxuXHRcdC8vIHJlbW92ZSBtZXRhZGF0YSBvbiBlYWNoIGl0ZW1cclxuXHRcdC8vIGFuZCByZXR1cm4gYXMgYXJyYXlcclxuXHRcdGZ1bmN0aW9uIGV4dHJhY3RGcm9tQ2FjaGUoIGNhY2hlICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdmFsdWVzID0gW107XHJcblx0XHRcdGZvciAoIGNvbnN0IGtleSBpbiBjYWNoZSApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgZGF0YSA9IGNhY2hlWyBrZXkgXTtcclxuXHRcdFx0XHRkZWxldGUgZGF0YS5tZXRhZGF0YTtcclxuXHRcdFx0XHR2YWx1ZXMucHVzaCggZGF0YSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIHZhbHVlcztcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIG5ldyAzRCBvYmplY3Qgd2l0aCBjb3BpZWQgdmFsdWVzIGZyb20gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JlY3Vyc2l2ZT10cnVlXSAtIFdoZW4gc2V0IHRvIGB0cnVlYCwgZGVzY2VuZGFudHMgb2YgdGhlIDNEIG9iamVjdCBhcmUgYWxzbyBjbG9uZWQuXHJcblx0ICogQHJldHVybiB7T2JqZWN0M0R9IEEgY2xvbmUgb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjbG9uZSggcmVjdXJzaXZlICkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMsIHJlY3Vyc2l2ZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvcGllcyB0aGUgdmFsdWVzIG9mIHRoZSBnaXZlbiAzRCBvYmplY3QgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0M0R9IHNvdXJjZSAtIFRoZSAzRCBvYmplY3QgdG8gY29weS5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZWN1cnNpdmU9dHJ1ZV0gLSBXaGVuIHNldCB0byBgdHJ1ZWAsIGRlc2NlbmRhbnRzIG9mIHRoZSAzRCBvYmplY3QgYXJlIGNsb25lZC5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3QzRH0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjb3B5KCBzb3VyY2UsIHJlY3Vyc2l2ZSA9IHRydWUgKSB7XHJcblxyXG5cdFx0dGhpcy5uYW1lID0gc291cmNlLm5hbWU7XHJcblxyXG5cdFx0dGhpcy51cC5jb3B5KCBzb3VyY2UudXAgKTtcclxuXHJcblx0XHR0aGlzLnBvc2l0aW9uLmNvcHkoIHNvdXJjZS5wb3NpdGlvbiApO1xyXG5cdFx0dGhpcy5yb3RhdGlvbi5vcmRlciA9IHNvdXJjZS5yb3RhdGlvbi5vcmRlcjtcclxuXHRcdHRoaXMucXVhdGVybmlvbi5jb3B5KCBzb3VyY2UucXVhdGVybmlvbiApO1xyXG5cdFx0dGhpcy5zY2FsZS5jb3B5KCBzb3VyY2Uuc2NhbGUgKTtcclxuXHJcblx0XHR0aGlzLm1hdHJpeC5jb3B5KCBzb3VyY2UubWF0cml4ICk7XHJcblx0XHR0aGlzLm1hdHJpeFdvcmxkLmNvcHkoIHNvdXJjZS5tYXRyaXhXb3JsZCApO1xyXG5cclxuXHRcdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IHNvdXJjZS5tYXRyaXhBdXRvVXBkYXRlO1xyXG5cclxuXHRcdHRoaXMubWF0cml4V29ybGRBdXRvVXBkYXRlID0gc291cmNlLm1hdHJpeFdvcmxkQXV0b1VwZGF0ZTtcclxuXHRcdHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHNvdXJjZS5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlO1xyXG5cclxuXHRcdHRoaXMubGF5ZXJzLm1hc2sgPSBzb3VyY2UubGF5ZXJzLm1hc2s7XHJcblx0XHR0aGlzLnZpc2libGUgPSBzb3VyY2UudmlzaWJsZTtcclxuXHJcblx0XHR0aGlzLmNhc3RTaGFkb3cgPSBzb3VyY2UuY2FzdFNoYWRvdztcclxuXHRcdHRoaXMucmVjZWl2ZVNoYWRvdyA9IHNvdXJjZS5yZWNlaXZlU2hhZG93O1xyXG5cclxuXHRcdHRoaXMuZnJ1c3R1bUN1bGxlZCA9IHNvdXJjZS5mcnVzdHVtQ3VsbGVkO1xyXG5cdFx0dGhpcy5yZW5kZXJPcmRlciA9IHNvdXJjZS5yZW5kZXJPcmRlcjtcclxuXHJcblx0XHR0aGlzLmFuaW1hdGlvbnMgPSBzb3VyY2UuYW5pbWF0aW9ucy5zbGljZSgpO1xyXG5cclxuXHRcdHRoaXMudXNlckRhdGEgPSBKU09OLnBhcnNlKCBKU09OLnN0cmluZ2lmeSggc291cmNlLnVzZXJEYXRhICkgKTtcclxuXHJcblx0XHRpZiAoIHJlY3Vyc2l2ZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHNvdXJjZS5jaGlsZHJlbi5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGNoaWxkID0gc291cmNlLmNoaWxkcmVuWyBpIF07XHJcblx0XHRcdFx0dGhpcy5hZGQoIGNoaWxkLmNsb25lKCkgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUaGUgZGVmYXVsdCB1cCBkaXJlY3Rpb24gZm9yIG9iamVjdHMsIGFsc28gdXNlZCBhcyB0aGUgZGVmYXVsdFxyXG4gKiBwb3NpdGlvbiBmb3Ige0BsaW5rIERpcmVjdGlvbmFsTGlnaHR9IGFuZCB7QGxpbmsgSGVtaXNwaGVyZUxpZ2h0fS5cclxuICpcclxuICogQHN0YXRpY1xyXG4gKiBAdHlwZSB7VmVjdG9yM31cclxuICogQGRlZmF1bHQgKDAsMSwwKVxyXG4gKi9cclxuT2JqZWN0M0QuREVGQVVMVF9VUCA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoIDAsIDEsIDAgKTtcclxuXHJcbi8qKlxyXG4gKiBUaGUgZGVmYXVsdCBzZXR0aW5nIGZvciB7QGxpbmsgT2JqZWN0M0QjbWF0cml4QXV0b1VwZGF0ZX0gZm9yXHJcbiAqIG5ld2x5IGNyZWF0ZWQgM0Qgb2JqZWN0cy5cclxuICpcclxuICogQHN0YXRpY1xyXG4gKiBAdHlwZSB7Ym9vbGVhbn1cclxuICogQGRlZmF1bHQgdHJ1ZVxyXG4gKi9cclxuT2JqZWN0M0QuREVGQVVMVF9NQVRSSVhfQVVUT19VUERBVEUgPSB0cnVlO1xyXG5cclxuLyoqXHJcbiAqIFRoZSBkZWZhdWx0IHNldHRpbmcgZm9yIHtAbGluayBPYmplY3QzRCNtYXRyaXhXb3JsZEF1dG9VcGRhdGV9IGZvclxyXG4gKiBuZXdseSBjcmVhdGVkIDNEIG9iamVjdHMuXHJcbiAqXHJcbiAqIEBzdGF0aWNcclxuICogQHR5cGUge2Jvb2xlYW59XHJcbiAqIEBkZWZhdWx0IHRydWVcclxuICovXHJcbk9iamVjdDNELkRFRkFVTFRfTUFUUklYX1dPUkxEX0FVVE9fVVBEQVRFID0gdHJ1ZTtcclxuXHJcbmV4cG9ydCB7IE9iamVjdDNEIH07XHJcbiIsImltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3I0IH0gZnJvbSAnLi9WZWN0b3I0LmpzJztcclxuXHJcbmNvbnN0IF92MCA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX3YxID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfdjIgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF92MyA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuXHJcbmNvbnN0IF92YWIgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF92YWMgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF92YmMgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF92YXAgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF92YnAgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF92Y3AgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcblxyXG5jb25zdCBfdjQwID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yNCgpO1xyXG5jb25zdCBfdjQxID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yNCgpO1xyXG5jb25zdCBfdjQyID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yNCgpO1xyXG5cclxuLyoqXHJcbiAqIEEgZ2VvbWV0cmljIHRyaWFuZ2xlIGFzIGRlZmluZWQgYnkgdGhyZWUgdmVjdG9ycyByZXByZXNlbnRpbmcgaXRzIHRocmVlIGNvcm5lcnMuXHJcbiAqL1xyXG5jbGFzcyBUcmlhbmdsZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgdHJpYW5nbGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IFthPSgwLDAsMCldIC0gVGhlIGZpcnN0IGNvcm5lciBvZiB0aGUgdHJpYW5nbGUuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBbYj0oMCwwLDApXSAtIFRoZSBzZWNvbmQgY29ybmVyIG9mIHRoZSB0cmlhbmdsZS5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IFtjPSgwLDAsMCldIC0gVGhlIHRoaXJkIGNvcm5lciBvZiB0aGUgdHJpYW5nbGUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGEgPSBuZXcgVmVjdG9yMygpLCBiID0gbmV3IFZlY3RvcjMoKSwgYyA9IG5ldyBWZWN0b3IzKCkgKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZmlyc3QgY29ybmVyIG9mIHRoZSB0cmlhbmdsZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yM31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hID0gYTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBzZWNvbmQgY29ybmVyIG9mIHRoZSB0cmlhbmdsZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yM31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5iID0gYjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB0aGlyZCBjb3JuZXIgb2YgdGhlIHRyaWFuZ2xlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3IzfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmMgPSBjO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSBub3JtYWwgdmVjdG9yIG9mIGEgdHJpYW5nbGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IGEgLSBUaGUgZmlyc3QgY29ybmVyIG9mIHRoZSB0cmlhbmdsZS5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IGIgLSBUaGUgc2Vjb25kIGNvcm5lciBvZiB0aGUgdHJpYW5nbGUuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBjIC0gVGhlIHRoaXJkIGNvcm5lciBvZiB0aGUgdHJpYW5nbGUuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IHZlY3RvciB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGhvZCdzIHJlc3VsdC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBUaGUgdHJpYW5nbGUncyBub3JtYWwuXHJcblx0ICovXHJcblx0c3RhdGljIGdldE5vcm1hbCggYSwgYiwgYywgdGFyZ2V0ICkge1xyXG5cclxuXHRcdHRhcmdldC5zdWJWZWN0b3JzKCBjLCBiICk7XHJcblx0XHRfdjAuc3ViVmVjdG9ycyggYSwgYiApO1xyXG5cdFx0dGFyZ2V0LmNyb3NzKCBfdjAgKTtcclxuXHJcblx0XHRjb25zdCB0YXJnZXRMZW5ndGhTcSA9IHRhcmdldC5sZW5ndGhTcSgpO1xyXG5cdFx0aWYgKCB0YXJnZXRMZW5ndGhTcSA+IDAgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gdGFyZ2V0Lm11bHRpcGx5U2NhbGFyKCAxIC8gTWF0aC5zcXJ0KCB0YXJnZXRMZW5ndGhTcSApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0YXJnZXQuc2V0KCAwLCAwLCAwICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgYSBiYXJ5Y2VudHJpYyBjb29yZGluYXRlcyBmcm9tIHRoZSBnaXZlbiB2ZWN0b3IuXHJcblx0ICogUmV0dXJucyBgbnVsbGAgaWYgdGhlIHRyaWFuZ2xlIGlzIGRlZ2VuZXJhdGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHBvaW50IC0gQSBwb2ludCBpbiAzRCBzcGFjZS5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IGEgLSBUaGUgZmlyc3QgY29ybmVyIG9mIHRoZSB0cmlhbmdsZS5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IGIgLSBUaGUgc2Vjb25kIGNvcm5lciBvZiB0aGUgdHJpYW5nbGUuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBjIC0gVGhlIHRoaXJkIGNvcm5lciBvZiB0aGUgdHJpYW5nbGUuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IHZlY3RvciB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGhvZCdzIHJlc3VsdC5cclxuXHQgKiBAcmV0dXJuIHs/VmVjdG9yM30gVGhlIGJhcnljZW50cmljIGNvb3JkaW5hdGVzIGZvciB0aGUgZ2l2ZW4gcG9pbnRcclxuXHQgKi9cclxuXHRzdGF0aWMgZ2V0QmFyeWNvb3JkKCBwb2ludCwgYSwgYiwgYywgdGFyZ2V0ICkge1xyXG5cclxuXHRcdC8vIGJhc2VkIG9uOiBodHRwOi8vd3d3LmJsYWNrcGF3bi5jb20vdGV4dHMvcG9pbnRpbnBvbHkvZGVmYXVsdC5odG1sXHJcblxyXG5cdFx0X3YwLnN1YlZlY3RvcnMoIGMsIGEgKTtcclxuXHRcdF92MS5zdWJWZWN0b3JzKCBiLCBhICk7XHJcblx0XHRfdjIuc3ViVmVjdG9ycyggcG9pbnQsIGEgKTtcclxuXHJcblx0XHRjb25zdCBkb3QwMCA9IF92MC5kb3QoIF92MCApO1xyXG5cdFx0Y29uc3QgZG90MDEgPSBfdjAuZG90KCBfdjEgKTtcclxuXHRcdGNvbnN0IGRvdDAyID0gX3YwLmRvdCggX3YyICk7XHJcblx0XHRjb25zdCBkb3QxMSA9IF92MS5kb3QoIF92MSApO1xyXG5cdFx0Y29uc3QgZG90MTIgPSBfdjEuZG90KCBfdjIgKTtcclxuXHJcblx0XHRjb25zdCBkZW5vbSA9ICggZG90MDAgKiBkb3QxMSAtIGRvdDAxICogZG90MDEgKTtcclxuXHJcblx0XHQvLyBjb2xsaW5lYXIgb3Igc2luZ3VsYXIgdHJpYW5nbGVcclxuXHRcdGlmICggZGVub20gPT09IDAgKSB7XHJcblxyXG5cdFx0XHR0YXJnZXQuc2V0KCAwLCAwLCAwICk7XHJcblx0XHRcdHJldHVybiBudWxsO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBpbnZEZW5vbSA9IDEgLyBkZW5vbTtcclxuXHRcdGNvbnN0IHUgPSAoIGRvdDExICogZG90MDIgLSBkb3QwMSAqIGRvdDEyICkgKiBpbnZEZW5vbTtcclxuXHRcdGNvbnN0IHYgPSAoIGRvdDAwICogZG90MTIgLSBkb3QwMSAqIGRvdDAyICkgKiBpbnZEZW5vbTtcclxuXHJcblx0XHQvLyBiYXJ5Y2VudHJpYyBjb29yZGluYXRlcyBtdXN0IGFsd2F5cyBzdW0gdG8gMVxyXG5cdFx0cmV0dXJuIHRhcmdldC5zZXQoIDEgLSB1IC0gdiwgdiwgdSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBnaXZlbiBwb2ludCwgd2hlbiBwcm9qZWN0ZWQgb250byB0aGUgcGxhbmUgb2YgdGhlXHJcblx0ICogdHJpYW5nbGUsIGxpZXMgd2l0aGluIHRoZSB0cmlhbmdsZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gcG9pbnQgLSBUaGUgcG9pbnQgaW4gM0Qgc3BhY2UgdG8gdGVzdC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IGEgLSBUaGUgZmlyc3QgY29ybmVyIG9mIHRoZSB0cmlhbmdsZS5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IGIgLSBUaGUgc2Vjb25kIGNvcm5lciBvZiB0aGUgdHJpYW5nbGUuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBjIC0gVGhlIHRoaXJkIGNvcm5lciBvZiB0aGUgdHJpYW5nbGUuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZ2l2ZW4gcG9pbnQsIHdoZW4gcHJvamVjdGVkIG9udG8gdGhlIHBsYW5lIG9mIHRoZVxyXG5cdCAqIHRyaWFuZ2xlLCBsaWVzIHdpdGhpbiB0aGUgdHJpYW5nbGUgb3Igbm90LlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBjb250YWluc1BvaW50KCBwb2ludCwgYSwgYiwgYyApIHtcclxuXHJcblx0XHQvLyBpZiB0aGUgdHJpYW5nbGUgaXMgZGVnZW5lcmF0ZSB0aGVuIHdlIGNhbid0IGNvbnRhaW4gYSBwb2ludFxyXG5cdFx0aWYgKCB0aGlzLmdldEJhcnljb29yZCggcG9pbnQsIGEsIGIsIGMsIF92MyApID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gKCBfdjMueCA+PSAwICkgJiYgKCBfdjMueSA+PSAwICkgJiYgKCAoIF92My54ICsgX3YzLnkgKSA8PSAxICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgdGhlIHZhbHVlIGJhcnljZW50cmljYWxseSBpbnRlcnBvbGF0ZWQgZm9yIHRoZSBnaXZlbiBwb2ludCBvbiB0aGVcclxuXHQgKiB0cmlhbmdsZS4gUmV0dXJucyBgbnVsbGAgaWYgdGhlIHRyaWFuZ2xlIGlzIGRlZ2VuZXJhdGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHBvaW50IC0gUG9zaXRpb24gb2YgaW50ZXJwb2xhdGVkIHBvaW50LlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gcDEgLSBUaGUgZmlyc3QgY29ybmVyIG9mIHRoZSB0cmlhbmdsZS5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHAyIC0gVGhlIHNlY29uZCBjb3JuZXIgb2YgdGhlIHRyaWFuZ2xlLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gcDMgLSBUaGUgdGhpcmQgY29ybmVyIG9mIHRoZSB0cmlhbmdsZS5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHYxIC0gVmFsdWUgdG8gaW50ZXJwb2xhdGUgb2YgZmlyc3QgdmVydGV4LlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdjIgLSBWYWx1ZSB0byBpbnRlcnBvbGF0ZSBvZiBzZWNvbmQgdmVydGV4LlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdjMgLSBWYWx1ZSB0byBpbnRlcnBvbGF0ZSBvZiB0aGlyZCB2ZXJ0ZXguXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IHZlY3RvciB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGhvZCdzIHJlc3VsdC5cclxuXHQgKiBAcmV0dXJuIHs/VmVjdG9yM30gVGhlIGludGVycG9sYXRlZCB2YWx1ZS5cclxuXHQgKi9cclxuXHRzdGF0aWMgZ2V0SW50ZXJwb2xhdGlvbiggcG9pbnQsIHAxLCBwMiwgcDMsIHYxLCB2MiwgdjMsIHRhcmdldCApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuZ2V0QmFyeWNvb3JkKCBwb2ludCwgcDEsIHAyLCBwMywgX3YzICkgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0YXJnZXQueCA9IDA7XHJcblx0XHRcdHRhcmdldC55ID0gMDtcclxuXHRcdFx0aWYgKCAneicgaW4gdGFyZ2V0ICkgdGFyZ2V0LnogPSAwO1xyXG5cdFx0XHRpZiAoICd3JyBpbiB0YXJnZXQgKSB0YXJnZXQudyA9IDA7XHJcblx0XHRcdHJldHVybiBudWxsO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0YXJnZXQuc2V0U2NhbGFyKCAwICk7XHJcblx0XHR0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKCB2MSwgX3YzLnggKTtcclxuXHRcdHRhcmdldC5hZGRTY2FsZWRWZWN0b3IoIHYyLCBfdjMueSApO1xyXG5cdFx0dGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggdjMsIF92My56ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRhcmdldDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB0aGUgdmFsdWUgYmFyeWNlbnRyaWNhbGx5IGludGVycG9sYXRlZCBmb3IgdGhlIGdpdmVuIGF0dHJpYnV0ZSBhbmQgaW5kaWNlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyQXR0cmlidXRlfSBhdHRyIC0gVGhlIGF0dHJpYnV0ZSB0byBpbnRlcnBvbGF0ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaTEgLSBJbmRleCBvZiBmaXJzdCB2ZXJ0ZXguXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGkyIC0gSW5kZXggb2Ygc2Vjb25kIHZlcnRleC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaTMgLSBJbmRleCBvZiB0aGlyZCB2ZXJ0ZXguXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBiYXJ5Y29vcmQgLSBUaGUgYmFyeWNvb3JkaW5hdGUgdmFsdWUgdG8gdXNlIHRvIGludGVycG9sYXRlLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdGFyZ2V0IC0gVGhlIHRhcmdldCB2ZWN0b3IgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBtZXRob2QncyByZXN1bHQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gVGhlIGludGVycG9sYXRlZCBhdHRyaWJ1dGUgdmFsdWUuXHJcblx0ICovXHJcblx0c3RhdGljIGdldEludGVycG9sYXRlZEF0dHJpYnV0ZSggYXR0ciwgaTEsIGkyLCBpMywgYmFyeWNvb3JkLCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0X3Y0MC5zZXRTY2FsYXIoIDAgKTtcclxuXHRcdF92NDEuc2V0U2NhbGFyKCAwICk7XHJcblx0XHRfdjQyLnNldFNjYWxhciggMCApO1xyXG5cclxuXHRcdF92NDAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggYXR0ciwgaTEgKTtcclxuXHRcdF92NDEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggYXR0ciwgaTIgKTtcclxuXHRcdF92NDIuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggYXR0ciwgaTMgKTtcclxuXHJcblx0XHR0YXJnZXQuc2V0U2NhbGFyKCAwICk7XHJcblx0XHR0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKCBfdjQwLCBiYXJ5Y29vcmQueCApO1xyXG5cdFx0dGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggX3Y0MSwgYmFyeWNvb3JkLnkgKTtcclxuXHRcdHRhcmdldC5hZGRTY2FsZWRWZWN0b3IoIF92NDIsIGJhcnljb29yZC56ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRhcmdldDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdHJpYW5nbGUgaXMgb3JpZW50ZWQgdG93YXJkcyB0aGUgZ2l2ZW4gZGlyZWN0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBhIC0gVGhlIGZpcnN0IGNvcm5lciBvZiB0aGUgdHJpYW5nbGUuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBiIC0gVGhlIHNlY29uZCBjb3JuZXIgb2YgdGhlIHRyaWFuZ2xlLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gYyAtIFRoZSB0aGlyZCBjb3JuZXIgb2YgdGhlIHRyaWFuZ2xlLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gZGlyZWN0aW9uIC0gVGhlIChub3JtYWxpemVkKSBkaXJlY3Rpb24gdmVjdG9yLlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHRyaWFuZ2xlIGlzIG9yaWVudGVkIHRvd2FyZHMgdGhlIGdpdmVuIGRpcmVjdGlvbiBvciBub3QuXHJcblx0ICovXHJcblx0c3RhdGljIGlzRnJvbnRGYWNpbmcoIGEsIGIsIGMsIGRpcmVjdGlvbiApIHtcclxuXHJcblx0XHRfdjAuc3ViVmVjdG9ycyggYywgYiApO1xyXG5cdFx0X3YxLnN1YlZlY3RvcnMoIGEsIGIgKTtcclxuXHJcblx0XHQvLyBzdHJpY3RseSBmcm9udCBmYWNpbmdcclxuXHRcdHJldHVybiAoIF92MC5jcm9zcyggX3YxICkuZG90KCBkaXJlY3Rpb24gKSA8IDAgKSA/IHRydWUgOiBmYWxzZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB0cmlhbmdsZSdzIHZlcnRpY2VzIGJ5IGNvcHlpbmcgdGhlIGdpdmVuIHZhbHVlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gYSAtIFRoZSBmaXJzdCBjb3JuZXIgb2YgdGhlIHRyaWFuZ2xlLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gYiAtIFRoZSBzZWNvbmQgY29ybmVyIG9mIHRoZSB0cmlhbmdsZS5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IGMgLSBUaGUgdGhpcmQgY29ybmVyIG9mIHRoZSB0cmlhbmdsZS5cclxuXHQgKiBAcmV0dXJuIHtUcmlhbmdsZX0gQSByZWZlcmVuY2UgdG8gdGhpcyB0cmlhbmdsZS5cclxuXHQgKi9cclxuXHRzZXQoIGEsIGIsIGMgKSB7XHJcblxyXG5cdFx0dGhpcy5hLmNvcHkoIGEgKTtcclxuXHRcdHRoaXMuYi5jb3B5KCBiICk7XHJcblx0XHR0aGlzLmMuY29weSggYyApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHRyaWFuZ2xlJ3MgdmVydGljZXMgYnkgY29weWluZyB0aGUgZ2l2ZW4gYXJyYXkgdmFsdWVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxWZWN0b3IzPn0gcG9pbnRzIC0gQW4gYXJyYXkgd2l0aCAzRCBwb2ludHMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGkwIC0gVGhlIGFycmF5IGluZGV4IHJlcHJlc2VudGluZyB0aGUgZmlyc3QgY29ybmVyIG9mIHRoZSB0cmlhbmdsZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaTEgLSBUaGUgYXJyYXkgaW5kZXggcmVwcmVzZW50aW5nIHRoZSBzZWNvbmQgY29ybmVyIG9mIHRoZSB0cmlhbmdsZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaTIgLSBUaGUgYXJyYXkgaW5kZXggcmVwcmVzZW50aW5nIHRoZSB0aGlyZCBjb3JuZXIgb2YgdGhlIHRyaWFuZ2xlLlxyXG5cdCAqIEByZXR1cm4ge1RyaWFuZ2xlfSBBIHJlZmVyZW5jZSB0byB0aGlzIHRyaWFuZ2xlLlxyXG5cdCAqL1xyXG5cdHNldEZyb21Qb2ludHNBbmRJbmRpY2VzKCBwb2ludHMsIGkwLCBpMSwgaTIgKSB7XHJcblxyXG5cdFx0dGhpcy5hLmNvcHkoIHBvaW50c1sgaTAgXSApO1xyXG5cdFx0dGhpcy5iLmNvcHkoIHBvaW50c1sgaTEgXSApO1xyXG5cdFx0dGhpcy5jLmNvcHkoIHBvaW50c1sgaTIgXSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHRyaWFuZ2xlJ3MgdmVydGljZXMgYnkgY29weWluZyB0aGUgZ2l2ZW4gYXR0cmlidXRlIHZhbHVlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyQXR0cmlidXRlfSBhdHRyaWJ1dGUgLSBBIGJ1ZmZlciBhdHRyaWJ1dGUgd2l0aCAzRCBwb2ludHMgZGF0YS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaTAgLSBUaGUgYXR0cmlidXRlIGluZGV4IHJlcHJlc2VudGluZyB0aGUgZmlyc3QgY29ybmVyIG9mIHRoZSB0cmlhbmdsZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaTEgLSBUaGUgYXR0cmlidXRlIGluZGV4IHJlcHJlc2VudGluZyB0aGUgc2Vjb25kIGNvcm5lciBvZiB0aGUgdHJpYW5nbGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGkyIC0gVGhlIGF0dHJpYnV0ZSBpbmRleCByZXByZXNlbnRpbmcgdGhlIHRoaXJkIGNvcm5lciBvZiB0aGUgdHJpYW5nbGUuXHJcblx0ICogQHJldHVybiB7VHJpYW5nbGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdHJpYW5nbGUuXHJcblx0ICovXHJcblx0c2V0RnJvbUF0dHJpYnV0ZUFuZEluZGljZXMoIGF0dHJpYnV0ZSwgaTAsIGkxLCBpMiApIHtcclxuXHJcblx0XHR0aGlzLmEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlLCBpMCApO1xyXG5cdFx0dGhpcy5iLmZyb21CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgaTEgKTtcclxuXHRcdHRoaXMuYy5mcm9tQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGkyICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIG5ldyB0cmlhbmdsZSB3aXRoIGNvcGllZCB2YWx1ZXMgZnJvbSB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7VHJpYW5nbGV9IEEgY2xvbmUgb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjbG9uZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29waWVzIHRoZSB2YWx1ZXMgb2YgdGhlIGdpdmVuIHRyaWFuZ2xlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RyaWFuZ2xlfSB0cmlhbmdsZSAtIFRoZSB0cmlhbmdsZSB0byBjb3B5LlxyXG5cdCAqIEByZXR1cm4ge1RyaWFuZ2xlfSBBIHJlZmVyZW5jZSB0byB0aGlzIHRyaWFuZ2xlLlxyXG5cdCAqL1xyXG5cdGNvcHkoIHRyaWFuZ2xlICkge1xyXG5cclxuXHRcdHRoaXMuYS5jb3B5KCB0cmlhbmdsZS5hICk7XHJcblx0XHR0aGlzLmIuY29weSggdHJpYW5nbGUuYiApO1xyXG5cdFx0dGhpcy5jLmNvcHkoIHRyaWFuZ2xlLmMgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB0aGUgYXJlYSBvZiB0aGUgdHJpYW5nbGUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB0cmlhbmdsZSdzIGFyZWEuXHJcblx0ICovXHJcblx0Z2V0QXJlYSgpIHtcclxuXHJcblx0XHRfdjAuc3ViVmVjdG9ycyggdGhpcy5jLCB0aGlzLmIgKTtcclxuXHRcdF92MS5zdWJWZWN0b3JzKCB0aGlzLmEsIHRoaXMuYiApO1xyXG5cclxuXHRcdHJldHVybiBfdjAuY3Jvc3MoIF92MSApLmxlbmd0aCgpICogMC41O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSBtaWRwb2ludCBvZiB0aGUgdHJpYW5nbGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHRhcmdldCAtIFRoZSB0YXJnZXQgdmVjdG9yIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbWV0aG9kJ3MgcmVzdWx0LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IFRoZSB0cmlhbmdsZSdzIG1pZHBvaW50LlxyXG5cdCAqL1xyXG5cdGdldE1pZHBvaW50KCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRhcmdldC5hZGRWZWN0b3JzKCB0aGlzLmEsIHRoaXMuYiApLmFkZCggdGhpcy5jICkubXVsdGlwbHlTY2FsYXIoIDEgLyAzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgdGhlIG5vcm1hbCBvZiB0aGUgdHJpYW5nbGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHRhcmdldCAtIFRoZSB0YXJnZXQgdmVjdG9yIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbWV0aG9kJ3MgcmVzdWx0LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IFRoZSB0cmlhbmdsZSdzIG5vcm1hbC5cclxuXHQgKi9cclxuXHRnZXROb3JtYWwoIHRhcmdldCApIHtcclxuXHJcblx0XHRyZXR1cm4gVHJpYW5nbGUuZ2V0Tm9ybWFsKCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5jLCB0YXJnZXQgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyBhIHBsYW5lIHRoZSB0cmlhbmdsZSBsaWVzIHdpdGhpbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UGxhbmV9IHRhcmdldCAtIFRoZSB0YXJnZXQgdmVjdG9yIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbWV0aG9kJ3MgcmVzdWx0LlxyXG5cdCAqIEByZXR1cm4ge1BsYW5lfSBUaGUgcGxhbmUgdGhlIHRyaWFuZ2xlIGxpZXMgd2l0aGluLlxyXG5cdCAqL1xyXG5cdGdldFBsYW5lKCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRhcmdldC5zZXRGcm9tQ29wbGFuYXJQb2ludHMoIHRoaXMuYSwgdGhpcy5iLCB0aGlzLmMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyBhIGJhcnljZW50cmljIGNvb3JkaW5hdGVzIGZyb20gdGhlIGdpdmVuIHZlY3Rvci5cclxuXHQgKiBSZXR1cm5zIGBudWxsYCBpZiB0aGUgdHJpYW5nbGUgaXMgZGVnZW5lcmF0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gcG9pbnQgLSBBIHBvaW50IGluIDNEIHNwYWNlLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdGFyZ2V0IC0gVGhlIHRhcmdldCB2ZWN0b3IgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBtZXRob2QncyByZXN1bHQuXHJcblx0ICogQHJldHVybiB7P1ZlY3RvcjN9IFRoZSBiYXJ5Y2VudHJpYyBjb29yZGluYXRlcyBmb3IgdGhlIGdpdmVuIHBvaW50XHJcblx0ICovXHJcblx0Z2V0QmFyeWNvb3JkKCBwb2ludCwgdGFyZ2V0ICkge1xyXG5cclxuXHRcdHJldHVybiBUcmlhbmdsZS5nZXRCYXJ5Y29vcmQoIHBvaW50LCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5jLCB0YXJnZXQgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB0aGUgdmFsdWUgYmFyeWNlbnRyaWNhbGx5IGludGVycG9sYXRlZCBmb3IgdGhlIGdpdmVuIHBvaW50IG9uIHRoZVxyXG5cdCAqIHRyaWFuZ2xlLiBSZXR1cm5zIGBudWxsYCBpZiB0aGUgdHJpYW5nbGUgaXMgZGVnZW5lcmF0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gcG9pbnQgLSBQb3NpdGlvbiBvZiBpbnRlcnBvbGF0ZWQgcG9pbnQuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB2MSAtIFZhbHVlIHRvIGludGVycG9sYXRlIG9mIGZpcnN0IHZlcnRleC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHYyIC0gVmFsdWUgdG8gaW50ZXJwb2xhdGUgb2Ygc2Vjb25kIHZlcnRleC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHYzIC0gVmFsdWUgdG8gaW50ZXJwb2xhdGUgb2YgdGhpcmQgdmVydGV4LlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdGFyZ2V0IC0gVGhlIHRhcmdldCB2ZWN0b3IgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBtZXRob2QncyByZXN1bHQuXHJcblx0ICogQHJldHVybiB7P1ZlY3RvcjN9IFRoZSBpbnRlcnBvbGF0ZWQgdmFsdWUuXHJcblx0ICovXHJcblx0Z2V0SW50ZXJwb2xhdGlvbiggcG9pbnQsIHYxLCB2MiwgdjMsIHRhcmdldCApIHtcclxuXHJcblx0XHRyZXR1cm4gVHJpYW5nbGUuZ2V0SW50ZXJwb2xhdGlvbiggcG9pbnQsIHRoaXMuYSwgdGhpcy5iLCB0aGlzLmMsIHYxLCB2MiwgdjMsIHRhcmdldCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBnaXZlbiBwb2ludCwgd2hlbiBwcm9qZWN0ZWQgb250byB0aGUgcGxhbmUgb2YgdGhlXHJcblx0ICogdHJpYW5nbGUsIGxpZXMgd2l0aGluIHRoZSB0cmlhbmdsZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gcG9pbnQgLSBUaGUgcG9pbnQgaW4gM0Qgc3BhY2UgdG8gdGVzdC5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBnaXZlbiBwb2ludCwgd2hlbiBwcm9qZWN0ZWQgb250byB0aGUgcGxhbmUgb2YgdGhlXHJcblx0ICogdHJpYW5nbGUsIGxpZXMgd2l0aGluIHRoZSB0cmlhbmdsZSBvciBub3QuXHJcblx0ICovXHJcblx0Y29udGFpbnNQb2ludCggcG9pbnQgKSB7XHJcblxyXG5cdFx0cmV0dXJuIFRyaWFuZ2xlLmNvbnRhaW5zUG9pbnQoIHBvaW50LCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5jICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHRyaWFuZ2xlIGlzIG9yaWVudGVkIHRvd2FyZHMgdGhlIGdpdmVuIGRpcmVjdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gZGlyZWN0aW9uIC0gVGhlIChub3JtYWxpemVkKSBkaXJlY3Rpb24gdmVjdG9yLlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHRyaWFuZ2xlIGlzIG9yaWVudGVkIHRvd2FyZHMgdGhlIGdpdmVuIGRpcmVjdGlvbiBvciBub3QuXHJcblx0ICovXHJcblx0aXNGcm9udEZhY2luZyggZGlyZWN0aW9uICkge1xyXG5cclxuXHRcdHJldHVybiBUcmlhbmdsZS5pc0Zyb250RmFjaW5nKCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5jLCBkaXJlY3Rpb24gKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIHRyaWFuZ2xlIGludGVyc2VjdHMgd2l0aCB0aGUgZ2l2ZW4gYm94LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCb3gzfSBib3ggLSBUaGUgYm94IHRvIGludGVyc2VjdC5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoaXMgdHJpYW5nbGUgaW50ZXJzZWN0cyB3aXRoIHRoZSBnaXZlbiBib3ggb3Igbm90LlxyXG5cdCAqL1xyXG5cdGludGVyc2VjdHNCb3goIGJveCApIHtcclxuXHJcblx0XHRyZXR1cm4gYm94LmludGVyc2VjdHNUcmlhbmdsZSggdGhpcyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGNsb3Nlc3QgcG9pbnQgb24gdGhlIHRyaWFuZ2xlIHRvIHRoZSBnaXZlbiBwb2ludC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gcCAtIFRoZSBwb2ludCB0byBjb21wdXRlIHRoZSBjbG9zZXN0IHBvaW50IGZvci5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHRhcmdldCAtIFRoZSB0YXJnZXQgdmVjdG9yIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbWV0aG9kJ3MgcmVzdWx0LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IFRoZSBjbG9zZXN0IHBvaW50IG9uIHRoZSB0cmlhbmdsZS5cclxuXHQgKi9cclxuXHRjbG9zZXN0UG9pbnRUb1BvaW50KCBwLCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0Y29uc3QgYSA9IHRoaXMuYSwgYiA9IHRoaXMuYiwgYyA9IHRoaXMuYztcclxuXHRcdGxldCB2LCB3O1xyXG5cclxuXHRcdC8vIGFsZ29yaXRobSB0aGFua3MgdG8gUmVhbC1UaW1lIENvbGxpc2lvbiBEZXRlY3Rpb24gYnkgQ2hyaXN0ZXIgRXJpY3NvbixcclxuXHRcdC8vIHB1Ymxpc2hlZCBieSBNb3JnYW4gS2F1Zm1hbm4gUHVibGlzaGVycywgKGMpIDIwMDUgRWxzZXZpZXIgSW5jLixcclxuXHRcdC8vIHVuZGVyIHRoZSBhY2NvbXBhbnlpbmcgbGljZW5zZTsgc2VlIGNoYXB0ZXIgNS4xLjUgZm9yIGRldGFpbGVkIGV4cGxhbmF0aW9uLlxyXG5cdFx0Ly8gYmFzaWNhbGx5LCB3ZSdyZSBkaXN0aW5ndWlzaGluZyB3aGljaCBvZiB0aGUgdm9yb25vaSByZWdpb25zIG9mIHRoZSB0cmlhbmdsZVxyXG5cdFx0Ly8gdGhlIHBvaW50IGxpZXMgaW4gd2l0aCB0aGUgbWluaW11bSBhbW91bnQgb2YgcmVkdW5kYW50IGNvbXB1dGF0aW9uLlxyXG5cclxuXHRcdF92YWIuc3ViVmVjdG9ycyggYiwgYSApO1xyXG5cdFx0X3ZhYy5zdWJWZWN0b3JzKCBjLCBhICk7XHJcblx0XHRfdmFwLnN1YlZlY3RvcnMoIHAsIGEgKTtcclxuXHRcdGNvbnN0IGQxID0gX3ZhYi5kb3QoIF92YXAgKTtcclxuXHRcdGNvbnN0IGQyID0gX3ZhYy5kb3QoIF92YXAgKTtcclxuXHRcdGlmICggZDEgPD0gMCAmJiBkMiA8PSAwICkge1xyXG5cclxuXHRcdFx0Ly8gdmVydGV4IHJlZ2lvbiBvZiBBOyBiYXJ5Y2VudHJpYyBjb29yZHMgKDEsIDAsIDApXHJcblx0XHRcdHJldHVybiB0YXJnZXQuY29weSggYSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRfdmJwLnN1YlZlY3RvcnMoIHAsIGIgKTtcclxuXHRcdGNvbnN0IGQzID0gX3ZhYi5kb3QoIF92YnAgKTtcclxuXHRcdGNvbnN0IGQ0ID0gX3ZhYy5kb3QoIF92YnAgKTtcclxuXHRcdGlmICggZDMgPj0gMCAmJiBkNCA8PSBkMyApIHtcclxuXHJcblx0XHRcdC8vIHZlcnRleCByZWdpb24gb2YgQjsgYmFyeWNlbnRyaWMgY29vcmRzICgwLCAxLCAwKVxyXG5cdFx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIGIgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgdmMgPSBkMSAqIGQ0IC0gZDMgKiBkMjtcclxuXHRcdGlmICggdmMgPD0gMCAmJiBkMSA+PSAwICYmIGQzIDw9IDAgKSB7XHJcblxyXG5cdFx0XHR2ID0gZDEgLyAoIGQxIC0gZDMgKTtcclxuXHRcdFx0Ly8gZWRnZSByZWdpb24gb2YgQUI7IGJhcnljZW50cmljIGNvb3JkcyAoMS12LCB2LCAwKVxyXG5cdFx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIGEgKS5hZGRTY2FsZWRWZWN0b3IoIF92YWIsIHYgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0X3ZjcC5zdWJWZWN0b3JzKCBwLCBjICk7XHJcblx0XHRjb25zdCBkNSA9IF92YWIuZG90KCBfdmNwICk7XHJcblx0XHRjb25zdCBkNiA9IF92YWMuZG90KCBfdmNwICk7XHJcblx0XHRpZiAoIGQ2ID49IDAgJiYgZDUgPD0gZDYgKSB7XHJcblxyXG5cdFx0XHQvLyB2ZXJ0ZXggcmVnaW9uIG9mIEM7IGJhcnljZW50cmljIGNvb3JkcyAoMCwgMCwgMSlcclxuXHRcdFx0cmV0dXJuIHRhcmdldC5jb3B5KCBjICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHZiID0gZDUgKiBkMiAtIGQxICogZDY7XHJcblx0XHRpZiAoIHZiIDw9IDAgJiYgZDIgPj0gMCAmJiBkNiA8PSAwICkge1xyXG5cclxuXHRcdFx0dyA9IGQyIC8gKCBkMiAtIGQ2ICk7XHJcblx0XHRcdC8vIGVkZ2UgcmVnaW9uIG9mIEFDOyBiYXJ5Y2VudHJpYyBjb29yZHMgKDEtdywgMCwgdylcclxuXHRcdFx0cmV0dXJuIHRhcmdldC5jb3B5KCBhICkuYWRkU2NhbGVkVmVjdG9yKCBfdmFjLCB3ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHZhID0gZDMgKiBkNiAtIGQ1ICogZDQ7XHJcblx0XHRpZiAoIHZhIDw9IDAgJiYgKCBkNCAtIGQzICkgPj0gMCAmJiAoIGQ1IC0gZDYgKSA+PSAwICkge1xyXG5cclxuXHRcdFx0X3ZiYy5zdWJWZWN0b3JzKCBjLCBiICk7XHJcblx0XHRcdHcgPSAoIGQ0IC0gZDMgKSAvICggKCBkNCAtIGQzICkgKyAoIGQ1IC0gZDYgKSApO1xyXG5cdFx0XHQvLyBlZGdlIHJlZ2lvbiBvZiBCQzsgYmFyeWNlbnRyaWMgY29vcmRzICgwLCAxLXcsIHcpXHJcblx0XHRcdHJldHVybiB0YXJnZXQuY29weSggYiApLmFkZFNjYWxlZFZlY3RvciggX3ZiYywgdyApOyAvLyBlZGdlIHJlZ2lvbiBvZiBCQ1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBmYWNlIHJlZ2lvblxyXG5cdFx0Y29uc3QgZGVub20gPSAxIC8gKCB2YSArIHZiICsgdmMgKTtcclxuXHRcdC8vIHUgPSB2YSAqIGRlbm9tXHJcblx0XHR2ID0gdmIgKiBkZW5vbTtcclxuXHRcdHcgPSB2YyAqIGRlbm9tO1xyXG5cclxuXHRcdHJldHVybiB0YXJnZXQuY29weSggYSApLmFkZFNjYWxlZFZlY3RvciggX3ZhYiwgdiApLmFkZFNjYWxlZFZlY3RvciggX3ZhYywgdyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgdHJpYW5nbGUgaXMgZXF1YWwgd2l0aCB0aGUgZ2l2ZW4gb25lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUcmlhbmdsZX0gdHJpYW5nbGUgLSBUaGUgdHJpYW5nbGUgdG8gdGVzdCBmb3IgZXF1YWxpdHkuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGlzIHRyaWFuZ2xlIGlzIGVxdWFsIHdpdGggdGhlIGdpdmVuIG9uZS5cclxuXHQgKi9cclxuXHRlcXVhbHMoIHRyaWFuZ2xlICkge1xyXG5cclxuXHRcdHJldHVybiB0cmlhbmdsZS5hLmVxdWFscyggdGhpcy5hICkgJiYgdHJpYW5nbGUuYi5lcXVhbHMoIHRoaXMuYiApICYmIHRyaWFuZ2xlLmMuZXF1YWxzKCB0aGlzLmMgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgVHJpYW5nbGUgfTtcclxuIiwiaW1wb3J0IHsgY2xhbXAsIGV1Y2xpZGVhbk1vZHVsbywgbGVycCB9IGZyb20gJy4vTWF0aFV0aWxzLmpzJztcclxuaW1wb3J0IHsgQ29sb3JNYW5hZ2VtZW50LCBTUkdCVG9MaW5lYXIsIExpbmVhclRvU1JHQiB9IGZyb20gJy4vQ29sb3JNYW5hZ2VtZW50LmpzJztcclxuaW1wb3J0IHsgU1JHQkNvbG9yU3BhY2UgfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xyXG5cclxuY29uc3QgX2NvbG9yS2V5d29yZHMgPSB7ICdhbGljZWJsdWUnOiAweEYwRjhGRiwgJ2FudGlxdWV3aGl0ZSc6IDB4RkFFQkQ3LCAnYXF1YSc6IDB4MDBGRkZGLCAnYXF1YW1hcmluZSc6IDB4N0ZGRkQ0LCAnYXp1cmUnOiAweEYwRkZGRixcclxuXHQnYmVpZ2UnOiAweEY1RjVEQywgJ2Jpc3F1ZSc6IDB4RkZFNEM0LCAnYmxhY2snOiAweDAwMDAwMCwgJ2JsYW5jaGVkYWxtb25kJzogMHhGRkVCQ0QsICdibHVlJzogMHgwMDAwRkYsICdibHVldmlvbGV0JzogMHg4QTJCRTIsXHJcblx0J2Jyb3duJzogMHhBNTJBMkEsICdidXJseXdvb2QnOiAweERFQjg4NywgJ2NhZGV0Ymx1ZSc6IDB4NUY5RUEwLCAnY2hhcnRyZXVzZSc6IDB4N0ZGRjAwLCAnY2hvY29sYXRlJzogMHhEMjY5MUUsICdjb3JhbCc6IDB4RkY3RjUwLFxyXG5cdCdjb3JuZmxvd2VyYmx1ZSc6IDB4NjQ5NUVELCAnY29ybnNpbGsnOiAweEZGRjhEQywgJ2NyaW1zb24nOiAweERDMTQzQywgJ2N5YW4nOiAweDAwRkZGRiwgJ2RhcmtibHVlJzogMHgwMDAwOEIsICdkYXJrY3lhbic6IDB4MDA4QjhCLFxyXG5cdCdkYXJrZ29sZGVucm9kJzogMHhCODg2MEIsICdkYXJrZ3JheSc6IDB4QTlBOUE5LCAnZGFya2dyZWVuJzogMHgwMDY0MDAsICdkYXJrZ3JleSc6IDB4QTlBOUE5LCAnZGFya2toYWtpJzogMHhCREI3NkIsICdkYXJrbWFnZW50YSc6IDB4OEIwMDhCLFxyXG5cdCdkYXJrb2xpdmVncmVlbic6IDB4NTU2QjJGLCAnZGFya29yYW5nZSc6IDB4RkY4QzAwLCAnZGFya29yY2hpZCc6IDB4OTkzMkNDLCAnZGFya3JlZCc6IDB4OEIwMDAwLCAnZGFya3NhbG1vbic6IDB4RTk5NjdBLCAnZGFya3NlYWdyZWVuJzogMHg4RkJDOEYsXHJcblx0J2RhcmtzbGF0ZWJsdWUnOiAweDQ4M0Q4QiwgJ2RhcmtzbGF0ZWdyYXknOiAweDJGNEY0RiwgJ2RhcmtzbGF0ZWdyZXknOiAweDJGNEY0RiwgJ2Rhcmt0dXJxdW9pc2UnOiAweDAwQ0VEMSwgJ2Rhcmt2aW9sZXQnOiAweDk0MDBEMyxcclxuXHQnZGVlcHBpbmsnOiAweEZGMTQ5MywgJ2RlZXBza3libHVlJzogMHgwMEJGRkYsICdkaW1ncmF5JzogMHg2OTY5NjksICdkaW1ncmV5JzogMHg2OTY5NjksICdkb2RnZXJibHVlJzogMHgxRTkwRkYsICdmaXJlYnJpY2snOiAweEIyMjIyMixcclxuXHQnZmxvcmFsd2hpdGUnOiAweEZGRkFGMCwgJ2ZvcmVzdGdyZWVuJzogMHgyMjhCMjIsICdmdWNoc2lhJzogMHhGRjAwRkYsICdnYWluc2Jvcm8nOiAweERDRENEQywgJ2dob3N0d2hpdGUnOiAweEY4RjhGRiwgJ2dvbGQnOiAweEZGRDcwMCxcclxuXHQnZ29sZGVucm9kJzogMHhEQUE1MjAsICdncmF5JzogMHg4MDgwODAsICdncmVlbic6IDB4MDA4MDAwLCAnZ3JlZW55ZWxsb3cnOiAweEFERkYyRiwgJ2dyZXknOiAweDgwODA4MCwgJ2hvbmV5ZGV3JzogMHhGMEZGRjAsICdob3RwaW5rJzogMHhGRjY5QjQsXHJcblx0J2luZGlhbnJlZCc6IDB4Q0Q1QzVDLCAnaW5kaWdvJzogMHg0QjAwODIsICdpdm9yeSc6IDB4RkZGRkYwLCAna2hha2knOiAweEYwRTY4QywgJ2xhdmVuZGVyJzogMHhFNkU2RkEsICdsYXZlbmRlcmJsdXNoJzogMHhGRkYwRjUsICdsYXduZ3JlZW4nOiAweDdDRkMwMCxcclxuXHQnbGVtb25jaGlmZm9uJzogMHhGRkZBQ0QsICdsaWdodGJsdWUnOiAweEFERDhFNiwgJ2xpZ2h0Y29yYWwnOiAweEYwODA4MCwgJ2xpZ2h0Y3lhbic6IDB4RTBGRkZGLCAnbGlnaHRnb2xkZW5yb2R5ZWxsb3cnOiAweEZBRkFEMiwgJ2xpZ2h0Z3JheSc6IDB4RDNEM0QzLFxyXG5cdCdsaWdodGdyZWVuJzogMHg5MEVFOTAsICdsaWdodGdyZXknOiAweEQzRDNEMywgJ2xpZ2h0cGluayc6IDB4RkZCNkMxLCAnbGlnaHRzYWxtb24nOiAweEZGQTA3QSwgJ2xpZ2h0c2VhZ3JlZW4nOiAweDIwQjJBQSwgJ2xpZ2h0c2t5Ymx1ZSc6IDB4ODdDRUZBLFxyXG5cdCdsaWdodHNsYXRlZ3JheSc6IDB4Nzc4ODk5LCAnbGlnaHRzbGF0ZWdyZXknOiAweDc3ODg5OSwgJ2xpZ2h0c3RlZWxibHVlJzogMHhCMEM0REUsICdsaWdodHllbGxvdyc6IDB4RkZGRkUwLCAnbGltZSc6IDB4MDBGRjAwLCAnbGltZWdyZWVuJzogMHgzMkNEMzIsXHJcblx0J2xpbmVuJzogMHhGQUYwRTYsICdtYWdlbnRhJzogMHhGRjAwRkYsICdtYXJvb24nOiAweDgwMDAwMCwgJ21lZGl1bWFxdWFtYXJpbmUnOiAweDY2Q0RBQSwgJ21lZGl1bWJsdWUnOiAweDAwMDBDRCwgJ21lZGl1bW9yY2hpZCc6IDB4QkE1NUQzLFxyXG5cdCdtZWRpdW1wdXJwbGUnOiAweDkzNzBEQiwgJ21lZGl1bXNlYWdyZWVuJzogMHgzQ0IzNzEsICdtZWRpdW1zbGF0ZWJsdWUnOiAweDdCNjhFRSwgJ21lZGl1bXNwcmluZ2dyZWVuJzogMHgwMEZBOUEsICdtZWRpdW10dXJxdW9pc2UnOiAweDQ4RDFDQyxcclxuXHQnbWVkaXVtdmlvbGV0cmVkJzogMHhDNzE1ODUsICdtaWRuaWdodGJsdWUnOiAweDE5MTk3MCwgJ21pbnRjcmVhbSc6IDB4RjVGRkZBLCAnbWlzdHlyb3NlJzogMHhGRkU0RTEsICdtb2NjYXNpbic6IDB4RkZFNEI1LCAnbmF2YWpvd2hpdGUnOiAweEZGREVBRCxcclxuXHQnbmF2eSc6IDB4MDAwMDgwLCAnb2xkbGFjZSc6IDB4RkRGNUU2LCAnb2xpdmUnOiAweDgwODAwMCwgJ29saXZlZHJhYic6IDB4NkI4RTIzLCAnb3JhbmdlJzogMHhGRkE1MDAsICdvcmFuZ2VyZWQnOiAweEZGNDUwMCwgJ29yY2hpZCc6IDB4REE3MEQ2LFxyXG5cdCdwYWxlZ29sZGVucm9kJzogMHhFRUU4QUEsICdwYWxlZ3JlZW4nOiAweDk4RkI5OCwgJ3BhbGV0dXJxdW9pc2UnOiAweEFGRUVFRSwgJ3BhbGV2aW9sZXRyZWQnOiAweERCNzA5MywgJ3BhcGF5YXdoaXAnOiAweEZGRUZENSwgJ3BlYWNocHVmZic6IDB4RkZEQUI5LFxyXG5cdCdwZXJ1JzogMHhDRDg1M0YsICdwaW5rJzogMHhGRkMwQ0IsICdwbHVtJzogMHhEREEwREQsICdwb3dkZXJibHVlJzogMHhCMEUwRTYsICdwdXJwbGUnOiAweDgwMDA4MCwgJ3JlYmVjY2FwdXJwbGUnOiAweDY2MzM5OSwgJ3JlZCc6IDB4RkYwMDAwLCAncm9zeWJyb3duJzogMHhCQzhGOEYsXHJcblx0J3JveWFsYmx1ZSc6IDB4NDE2OUUxLCAnc2FkZGxlYnJvd24nOiAweDhCNDUxMywgJ3NhbG1vbic6IDB4RkE4MDcyLCAnc2FuZHlicm93bic6IDB4RjRBNDYwLCAnc2VhZ3JlZW4nOiAweDJFOEI1NywgJ3NlYXNoZWxsJzogMHhGRkY1RUUsXHJcblx0J3NpZW5uYSc6IDB4QTA1MjJELCAnc2lsdmVyJzogMHhDMEMwQzAsICdza3libHVlJzogMHg4N0NFRUIsICdzbGF0ZWJsdWUnOiAweDZBNUFDRCwgJ3NsYXRlZ3JheSc6IDB4NzA4MDkwLCAnc2xhdGVncmV5JzogMHg3MDgwOTAsICdzbm93JzogMHhGRkZBRkEsXHJcblx0J3NwcmluZ2dyZWVuJzogMHgwMEZGN0YsICdzdGVlbGJsdWUnOiAweDQ2ODJCNCwgJ3Rhbic6IDB4RDJCNDhDLCAndGVhbCc6IDB4MDA4MDgwLCAndGhpc3RsZSc6IDB4RDhCRkQ4LCAndG9tYXRvJzogMHhGRjYzNDcsICd0dXJxdW9pc2UnOiAweDQwRTBEMCxcclxuXHQndmlvbGV0JzogMHhFRTgyRUUsICd3aGVhdCc6IDB4RjVERUIzLCAnd2hpdGUnOiAweEZGRkZGRiwgJ3doaXRlc21va2UnOiAweEY1RjVGNSwgJ3llbGxvdyc6IDB4RkZGRjAwLCAneWVsbG93Z3JlZW4nOiAweDlBQ0QzMiB9O1xyXG5cclxuY29uc3QgX2hzbEEgPSB7IGg6IDAsIHM6IDAsIGw6IDAgfTtcclxuY29uc3QgX2hzbEIgPSB7IGg6IDAsIHM6IDAsIGw6IDAgfTtcclxuXHJcbmZ1bmN0aW9uIGh1ZTJyZ2IoIHAsIHEsIHQgKSB7XHJcblxyXG5cdGlmICggdCA8IDAgKSB0ICs9IDE7XHJcblx0aWYgKCB0ID4gMSApIHQgLT0gMTtcclxuXHRpZiAoIHQgPCAxIC8gNiApIHJldHVybiBwICsgKCBxIC0gcCApICogNiAqIHQ7XHJcblx0aWYgKCB0IDwgMSAvIDIgKSByZXR1cm4gcTtcclxuXHRpZiAoIHQgPCAyIC8gMyApIHJldHVybiBwICsgKCBxIC0gcCApICogNiAqICggMiAvIDMgLSB0ICk7XHJcblx0cmV0dXJuIHA7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQSBDb2xvciBpbnN0YW5jZSBpcyByZXByZXNlbnRlZCBieSBSR0IgY29tcG9uZW50cyBpbiB0aGUgbGluZWFyIDxpPndvcmtpbmdcclxuICogY29sb3Igc3BhY2U8L2k+LCB3aGljaCBkZWZhdWx0cyB0byBgTGluZWFyU1JHQkNvbG9yU3BhY2VgLiBJbnB1dHNcclxuICogY29udmVudGlvbmFsbHkgdXNpbmcgYFNSR0JDb2xvclNwYWNlYCAoc3VjaCBhcyBoZXhhZGVjaW1hbHMgYW5kIENTU1xyXG4gKiBzdHJpbmdzKSBhcmUgY29udmVydGVkIHRvIHRoZSB3b3JraW5nIGNvbG9yIHNwYWNlIGF1dG9tYXRpY2FsbHkuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIC8vIGNvbnZlcnRlZCBhdXRvbWF0aWNhbGx5IGZyb20gU1JHQkNvbG9yU3BhY2UgdG8gTGluZWFyU1JHQkNvbG9yU3BhY2VcclxuICogY29uc3QgY29sb3IgPSBuZXcgVEhSRUUuQ29sb3IoKS5zZXRIZXgoIDB4MTEyMjMzICk7XHJcbiAqIGBgYFxyXG4gKiBTb3VyY2UgY29sb3Igc3BhY2VzIG1heSBiZSBzcGVjaWZpZWQgZXhwbGljaXRseSwgdG8gZW5zdXJlIGNvcnJlY3QgY29udmVyc2lvbnMuXHJcbiAqIGBgYGpzXHJcbiAqIC8vIGFzc3VtZWQgYWxyZWFkeSBMaW5lYXJTUkdCQ29sb3JTcGFjZTsgbm8gY29udmVyc2lvblxyXG4gKiBjb25zdCBjb2xvciA9IG5ldyBUSFJFRS5Db2xvcigpLnNldFJHQiggMC41LCAwLjUsIDAuNSApO1xyXG4gKlxyXG4gKiAvLyBjb252ZXJ0ZWQgZXhwbGljaXRseSBmcm9tIFNSR0JDb2xvclNwYWNlIHRvIExpbmVhclNSR0JDb2xvclNwYWNlXHJcbiAqIGNvbnN0IGNvbG9yID0gbmV3IFRIUkVFLkNvbG9yKCkuc2V0UkdCKCAwLjUsIDAuNSwgMC41LCBTUkdCQ29sb3JTcGFjZSApO1xyXG4gKiBgYGBcclxuICogSWYgVEhSRUUuQ29sb3JNYW5hZ2VtZW50IGlzIGRpc2FibGVkLCBubyBjb252ZXJzaW9ucyBvY2N1ci4gRm9yIGRldGFpbHMsXHJcbiAqIHNlZSA8aT5Db2xvciBtYW5hZ2VtZW50PC9pPi4gSXRlcmF0aW5nIHRocm91Z2ggYSBDb2xvciBpbnN0YW5jZSB3aWxsIHlpZWxkXHJcbiAqIGl0cyBjb21wb25lbnRzIChyLCBnLCBiKSBpbiB0aGUgY29ycmVzcG9uZGluZyBvcmRlci4gQSBDb2xvciBjYW4gYmUgaW5pdGlhbGlzZWRcclxuICogaW4gYW55IG9mIHRoZSBmb2xsb3dpbmcgd2F5czpcclxuICogYGBganNcclxuICogLy9lbXB0eSBjb25zdHJ1Y3RvciAtIHdpbGwgZGVmYXVsdCB3aGl0ZVxyXG4gKiBjb25zdCBjb2xvcjEgPSBuZXcgVEhSRUUuQ29sb3IoKTtcclxuICpcclxuICogLy9IZXhhZGVjaW1hbCBjb2xvciAocmVjb21tZW5kZWQpXHJcbiAqIGNvbnN0IGNvbG9yMiA9IG5ldyBUSFJFRS5Db2xvciggMHhmZjAwMDAgKTtcclxuICpcclxuICogLy9SR0Igc3RyaW5nXHJcbiAqIGNvbnN0IGNvbG9yMyA9IG5ldyBUSFJFRS5Db2xvcihcInJnYigyNTUsIDAsIDApXCIpO1xyXG4gKiBjb25zdCBjb2xvcjQgPSBuZXcgVEhSRUUuQ29sb3IoXCJyZ2IoMTAwJSwgMCUsIDAlKVwiKTtcclxuICpcclxuICogLy9YMTEgY29sb3IgbmFtZSAtIGFsbCAxNDAgY29sb3IgbmFtZXMgYXJlIHN1cHBvcnRlZC5cclxuICogLy9Ob3RlIHRoZSBsYWNrIG9mIENhbWVsQ2FzZSBpbiB0aGUgbmFtZVxyXG4gKiBjb25zdCBjb2xvcjUgPSBuZXcgVEhSRUUuQ29sb3IoICdza3libHVlJyApO1xyXG4gKiAvL0hTTCBzdHJpbmdcclxuICogY29uc3QgY29sb3I2ID0gbmV3IFRIUkVFLkNvbG9yKFwiaHNsKDAsIDEwMCUsIDUwJSlcIik7XHJcbiAqXHJcbiAqIC8vU2VwYXJhdGUgUkdCIHZhbHVlcyBiZXR3ZWVuIDAgYW5kIDFcclxuICogY29uc3QgY29sb3I3ID0gbmV3IFRIUkVFLkNvbG9yKCAxLCAwLCAwICk7XHJcbiAqIGBgYFxyXG4gKi9cclxuY2xhc3MgQ29sb3Ige1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGNvbG9yLlxyXG5cdCAqXHJcblx0ICogTm90ZSB0aGF0IHN0YW5kYXJkIG1ldGhvZCBvZiBzcGVjaWZ5aW5nIGNvbG9yIGluIHRocmVlLmpzIGlzIHdpdGggYSBoZXhhZGVjaW1hbCB0cmlwbGV0LFxyXG5cdCAqIGFuZCB0aGF0IG1ldGhvZCBpcyB1c2VkIHRocm91Z2hvdXQgdGhlIHJlc3Qgb2YgdGhlIGRvY3VtZW50YXRpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geyhudW1iZXJ8c3RyaW5nfENvbG9yKX0gW3JdIC0gVGhlIHJlZCBjb21wb25lbnQgb2YgdGhlIGNvbG9yLiBJZiBgZ2AgYW5kIGBiYCBhcmVcclxuXHQgKiBub3QgcHJvdmlkZWQsIGl0IGNhbiBiZSBoZXhhZGVjaW1hbCB0cmlwbGV0LCBhIENTUy1zdHlsZSBzdHJpbmcgb3IgYW5vdGhlciBgQ29sb3JgIGluc3RhbmNlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZ10gLSBUaGUgZ3JlZW4gY29tcG9uZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbYl0gLSBUaGUgYmx1ZSBjb21wb25lbnQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHIsIGcsIGIgKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzQ29sb3IgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJlZCBjb21wb25lbnQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBncmVlbiBjb21wb25lbnQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBibHVlIGNvbXBvbmVudC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmIgPSAxO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnNldCggciwgZywgYiApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGNvbG9ycydzIGNvbXBvbmVudHMgZnJvbSB0aGUgZ2l2ZW4gdmFsdWVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHsobnVtYmVyfHN0cmluZ3xDb2xvcil9IFtyXSAtIFRoZSByZWQgY29tcG9uZW50IG9mIHRoZSBjb2xvci4gSWYgYGdgIGFuZCBgYmAgYXJlXHJcblx0ICogbm90IHByb3ZpZGVkLCBpdCBjYW4gYmUgaGV4YWRlY2ltYWwgdHJpcGxldCwgYSBDU1Mtc3R5bGUgc3RyaW5nIG9yIGFub3RoZXIgYENvbG9yYCBpbnN0YW5jZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2ddIC0gVGhlIGdyZWVuIGNvbXBvbmVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2JdIC0gVGhlIGJsdWUgY29tcG9uZW50LlxyXG5cdCAqIEByZXR1cm4ge0NvbG9yfSBBIHJlZmVyZW5jZSB0byB0aGlzIGNvbG9yLlxyXG5cdCAqL1xyXG5cdHNldCggciwgZywgYiApIHtcclxuXHJcblx0XHRpZiAoIGcgPT09IHVuZGVmaW5lZCAmJiBiID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHQvLyByIGlzIFRIUkVFLkNvbG9yLCBoZXggb3Igc3RyaW5nXHJcblxyXG5cdFx0XHRjb25zdCB2YWx1ZSA9IHI7XHJcblxyXG5cdFx0XHRpZiAoIHZhbHVlICYmIHZhbHVlLmlzQ29sb3IgKSB7XHJcblxyXG5cdFx0XHRcdHRoaXMuY29weSggdmFsdWUgKTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgKSB7XHJcblxyXG5cdFx0XHRcdHRoaXMuc2V0SGV4KCB2YWx1ZSApO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5zZXRTdHlsZSggdmFsdWUgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGhpcy5zZXRSR0IoIHIsIGcsIGIgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgY29sb3JzJ3MgY29tcG9uZW50cyB0byB0aGUgZ2l2ZW4gc2NhbGFyIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHNjYWxhciAtIFRoZSBzY2FsYXIgdmFsdWUuXHJcblx0ICogQHJldHVybiB7Q29sb3J9IEEgcmVmZXJlbmNlIHRvIHRoaXMgY29sb3IuXHJcblx0ICovXHJcblx0c2V0U2NhbGFyKCBzY2FsYXIgKSB7XHJcblxyXG5cdFx0dGhpcy5yID0gc2NhbGFyO1xyXG5cdFx0dGhpcy5nID0gc2NhbGFyO1xyXG5cdFx0dGhpcy5iID0gc2NhbGFyO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhpcyBjb2xvciBmcm9tIGEgaGV4YWRlY2ltYWwgdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaGV4IC0gVGhlIGhleGFkZWNpbWFsIHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbY29sb3JTcGFjZT1TUkdCQ29sb3JTcGFjZV0gLSBUaGUgY29sb3Igc3BhY2UuXHJcblx0ICogQHJldHVybiB7Q29sb3J9IEEgcmVmZXJlbmNlIHRvIHRoaXMgY29sb3IuXHJcblx0ICovXHJcblx0c2V0SGV4KCBoZXgsIGNvbG9yU3BhY2UgPSBTUkdCQ29sb3JTcGFjZSApIHtcclxuXHJcblx0XHRoZXggPSBNYXRoLmZsb29yKCBoZXggKTtcclxuXHJcblx0XHR0aGlzLnIgPSAoIGhleCA+PiAxNiAmIDI1NSApIC8gMjU1O1xyXG5cdFx0dGhpcy5nID0gKCBoZXggPj4gOCAmIDI1NSApIC8gMjU1O1xyXG5cdFx0dGhpcy5iID0gKCBoZXggJiAyNTUgKSAvIDI1NTtcclxuXHJcblx0XHRDb2xvck1hbmFnZW1lbnQudG9Xb3JraW5nQ29sb3JTcGFjZSggdGhpcywgY29sb3JTcGFjZSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhpcyBjb2xvciBmcm9tIFJHQiB2YWx1ZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gciAtIFJlZCBjaGFubmVsIHZhbHVlIGJldHdlZW4gYDAuMGAgYW5kIGAxLjBgLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBnIC0gR3JlZW4gY2hhbm5lbCB2YWx1ZSBiZXR3ZWVuIGAwLjBgIGFuZCBgMS4wYC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYiAtIEJsdWUgY2hhbm5lbCB2YWx1ZSBiZXR3ZWVuIGAwLjBgIGFuZCBgMS4wYC5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW2NvbG9yU3BhY2U9Q29sb3JNYW5hZ2VtZW50LndvcmtpbmdDb2xvclNwYWNlXSAtIFRoZSBjb2xvciBzcGFjZS5cclxuXHQgKiBAcmV0dXJuIHtDb2xvcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBjb2xvci5cclxuXHQgKi9cclxuXHRzZXRSR0IoIHIsIGcsIGIsIGNvbG9yU3BhY2UgPSBDb2xvck1hbmFnZW1lbnQud29ya2luZ0NvbG9yU3BhY2UgKSB7XHJcblxyXG5cdFx0dGhpcy5yID0gcjtcclxuXHRcdHRoaXMuZyA9IGc7XHJcblx0XHR0aGlzLmIgPSBiO1xyXG5cclxuXHRcdENvbG9yTWFuYWdlbWVudC50b1dvcmtpbmdDb2xvclNwYWNlKCB0aGlzLCBjb2xvclNwYWNlICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGlzIGNvbG9yIGZyb20gUkdCIHZhbHVlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBoIC0gSHVlIHZhbHVlIGJldHdlZW4gYDAuMGAgYW5kIGAxLjBgLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzIC0gU2F0dXJhdGlvbiB2YWx1ZSBiZXR3ZWVuIGAwLjBgIGFuZCBgMS4wYC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbCAtIExpZ2h0bmVzcyB2YWx1ZSBiZXR3ZWVuIGAwLjBgIGFuZCBgMS4wYC5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW2NvbG9yU3BhY2U9Q29sb3JNYW5hZ2VtZW50LndvcmtpbmdDb2xvclNwYWNlXSAtIFRoZSBjb2xvciBzcGFjZS5cclxuXHQgKiBAcmV0dXJuIHtDb2xvcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBjb2xvci5cclxuXHQgKi9cclxuXHRzZXRIU0woIGgsIHMsIGwsIGNvbG9yU3BhY2UgPSBDb2xvck1hbmFnZW1lbnQud29ya2luZ0NvbG9yU3BhY2UgKSB7XHJcblxyXG5cdFx0Ly8gaCxzLGwgcmFuZ2VzIGFyZSBpbiAwLjAgLSAxLjBcclxuXHRcdGggPSBldWNsaWRlYW5Nb2R1bG8oIGgsIDEgKTtcclxuXHRcdHMgPSBjbGFtcCggcywgMCwgMSApO1xyXG5cdFx0bCA9IGNsYW1wKCBsLCAwLCAxICk7XHJcblxyXG5cdFx0aWYgKCBzID09PSAwICkge1xyXG5cclxuXHRcdFx0dGhpcy5yID0gdGhpcy5nID0gdGhpcy5iID0gbDtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc3QgcCA9IGwgPD0gMC41ID8gbCAqICggMSArIHMgKSA6IGwgKyBzIC0gKCBsICogcyApO1xyXG5cdFx0XHRjb25zdCBxID0gKCAyICogbCApIC0gcDtcclxuXHJcblx0XHRcdHRoaXMuciA9IGh1ZTJyZ2IoIHEsIHAsIGggKyAxIC8gMyApO1xyXG5cdFx0XHR0aGlzLmcgPSBodWUycmdiKCBxLCBwLCBoICk7XHJcblx0XHRcdHRoaXMuYiA9IGh1ZTJyZ2IoIHEsIHAsIGggLSAxIC8gMyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRDb2xvck1hbmFnZW1lbnQudG9Xb3JraW5nQ29sb3JTcGFjZSggdGhpcywgY29sb3JTcGFjZSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhpcyBjb2xvciBmcm9tIGEgQ1NTLXN0eWxlIHN0cmluZy4gRm9yIGV4YW1wbGUsIGByZ2IoMjUwLCAwLDApYCxcclxuXHQgKiBgcmdiKDEwMCUsIDAlLCAwJSlgLCBgaHNsKDAsIDEwMCUsIDUwJSlgLCBgI2ZmMDAwMGAsIGAjZjAwYCwgb3IgYHJlZGAgKCBvclxyXG5cdCAqIGFueSBbWDExIGNvbG9yIG5hbWVde0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1gxMV9jb2xvcl9uYW1lcyNDb2xvcl9uYW1lX2NoYXJ0fSAtXHJcblx0ICogYWxsIDE0MCBjb2xvciBuYW1lcyBhcmUgc3VwcG9ydGVkKS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzdHlsZSAtIENvbG9yIGFzIGEgQ1NTLXN0eWxlIHN0cmluZy5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW2NvbG9yU3BhY2U9U1JHQkNvbG9yU3BhY2VdIC0gVGhlIGNvbG9yIHNwYWNlLlxyXG5cdCAqIEByZXR1cm4ge0NvbG9yfSBBIHJlZmVyZW5jZSB0byB0aGlzIGNvbG9yLlxyXG5cdCAqL1xyXG5cdHNldFN0eWxlKCBzdHlsZSwgY29sb3JTcGFjZSA9IFNSR0JDb2xvclNwYWNlICkge1xyXG5cclxuXHRcdGZ1bmN0aW9uIGhhbmRsZUFscGhhKCBzdHJpbmcgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHN0cmluZyA9PT0gdW5kZWZpbmVkICkgcmV0dXJuO1xyXG5cclxuXHRcdFx0aWYgKCBwYXJzZUZsb2F0KCBzdHJpbmcgKSA8IDEgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkNvbG9yOiBBbHBoYSBjb21wb25lbnQgb2YgJyArIHN0eWxlICsgJyB3aWxsIGJlIGlnbm9yZWQuJyApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblxyXG5cdFx0bGV0IG07XHJcblxyXG5cdFx0aWYgKCBtID0gL14oXFx3KylcXCgoW15cXCldKilcXCkvLmV4ZWMoIHN0eWxlICkgKSB7XHJcblxyXG5cdFx0XHQvLyByZ2IgLyBoc2xcclxuXHJcblx0XHRcdGxldCBjb2xvcjtcclxuXHRcdFx0Y29uc3QgbmFtZSA9IG1bIDEgXTtcclxuXHRcdFx0Y29uc3QgY29tcG9uZW50cyA9IG1bIDIgXTtcclxuXHJcblx0XHRcdHN3aXRjaCAoIG5hbWUgKSB7XHJcblxyXG5cdFx0XHRcdGNhc2UgJ3JnYic6XHJcblx0XHRcdFx0Y2FzZSAncmdiYSc6XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBjb2xvciA9IC9eXFxzKihcXGQrKVxccyosXFxzKihcXGQrKVxccyosXFxzKihcXGQrKVxccyooPzosXFxzKihcXGQqXFwuP1xcZCspXFxzKik/JC8uZXhlYyggY29tcG9uZW50cyApICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Ly8gcmdiKDI1NSwwLDApIHJnYmEoMjU1LDAsMCwwLjUpXHJcblxyXG5cdFx0XHRcdFx0XHRoYW5kbGVBbHBoYSggY29sb3JbIDQgXSApO1xyXG5cclxuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuc2V0UkdCKFxyXG5cdFx0XHRcdFx0XHRcdE1hdGgubWluKCAyNTUsIHBhcnNlSW50KCBjb2xvclsgMSBdLCAxMCApICkgLyAyNTUsXHJcblx0XHRcdFx0XHRcdFx0TWF0aC5taW4oIDI1NSwgcGFyc2VJbnQoIGNvbG9yWyAyIF0sIDEwICkgKSAvIDI1NSxcclxuXHRcdFx0XHRcdFx0XHRNYXRoLm1pbiggMjU1LCBwYXJzZUludCggY29sb3JbIDMgXSwgMTAgKSApIC8gMjU1LFxyXG5cdFx0XHRcdFx0XHRcdGNvbG9yU3BhY2VcclxuXHRcdFx0XHRcdFx0KTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBjb2xvciA9IC9eXFxzKihcXGQrKVxcJVxccyosXFxzKihcXGQrKVxcJVxccyosXFxzKihcXGQrKVxcJVxccyooPzosXFxzKihcXGQqXFwuP1xcZCspXFxzKik/JC8uZXhlYyggY29tcG9uZW50cyApICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Ly8gcmdiKDEwMCUsMCUsMCUpIHJnYmEoMTAwJSwwJSwwJSwwLjUpXHJcblxyXG5cdFx0XHRcdFx0XHRoYW5kbGVBbHBoYSggY29sb3JbIDQgXSApO1xyXG5cclxuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuc2V0UkdCKFxyXG5cdFx0XHRcdFx0XHRcdE1hdGgubWluKCAxMDAsIHBhcnNlSW50KCBjb2xvclsgMSBdLCAxMCApICkgLyAxMDAsXHJcblx0XHRcdFx0XHRcdFx0TWF0aC5taW4oIDEwMCwgcGFyc2VJbnQoIGNvbG9yWyAyIF0sIDEwICkgKSAvIDEwMCxcclxuXHRcdFx0XHRcdFx0XHRNYXRoLm1pbiggMTAwLCBwYXJzZUludCggY29sb3JbIDMgXSwgMTAgKSApIC8gMTAwLFxyXG5cdFx0XHRcdFx0XHRcdGNvbG9yU3BhY2VcclxuXHRcdFx0XHRcdFx0KTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdGNhc2UgJ2hzbCc6XHJcblx0XHRcdFx0Y2FzZSAnaHNsYSc6XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBjb2xvciA9IC9eXFxzKihcXGQqXFwuP1xcZCspXFxzKixcXHMqKFxcZCpcXC4/XFxkKylcXCVcXHMqLFxccyooXFxkKlxcLj9cXGQrKVxcJVxccyooPzosXFxzKihcXGQqXFwuP1xcZCspXFxzKik/JC8uZXhlYyggY29tcG9uZW50cyApICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Ly8gaHNsKDEyMCw1MCUsNTAlKSBoc2xhKDEyMCw1MCUsNTAlLDAuNSlcclxuXHJcblx0XHRcdFx0XHRcdGhhbmRsZUFscGhhKCBjb2xvclsgNCBdICk7XHJcblxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5zZXRIU0woXHJcblx0XHRcdFx0XHRcdFx0cGFyc2VGbG9hdCggY29sb3JbIDEgXSApIC8gMzYwLFxyXG5cdFx0XHRcdFx0XHRcdHBhcnNlRmxvYXQoIGNvbG9yWyAyIF0gKSAvIDEwMCxcclxuXHRcdFx0XHRcdFx0XHRwYXJzZUZsb2F0KCBjb2xvclsgMyBdICkgLyAxMDAsXHJcblx0XHRcdFx0XHRcdFx0Y29sb3JTcGFjZVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0ZGVmYXVsdDpcclxuXHJcblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Db2xvcjogVW5rbm93biBjb2xvciBtb2RlbCAnICsgc3R5bGUgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2UgaWYgKCBtID0gL15cXCMoW0EtRmEtZlxcZF0rKSQvLmV4ZWMoIHN0eWxlICkgKSB7XHJcblxyXG5cdFx0XHQvLyBoZXggY29sb3JcclxuXHJcblx0XHRcdGNvbnN0IGhleCA9IG1bIDEgXTtcclxuXHRcdFx0Y29uc3Qgc2l6ZSA9IGhleC5sZW5ndGg7XHJcblxyXG5cdFx0XHRpZiAoIHNpemUgPT09IDMgKSB7XHJcblxyXG5cdFx0XHRcdC8vICNmZjBcclxuXHRcdFx0XHRyZXR1cm4gdGhpcy5zZXRSR0IoXHJcblx0XHRcdFx0XHRwYXJzZUludCggaGV4LmNoYXJBdCggMCApLCAxNiApIC8gMTUsXHJcblx0XHRcdFx0XHRwYXJzZUludCggaGV4LmNoYXJBdCggMSApLCAxNiApIC8gMTUsXHJcblx0XHRcdFx0XHRwYXJzZUludCggaGV4LmNoYXJBdCggMiApLCAxNiApIC8gMTUsXHJcblx0XHRcdFx0XHRjb2xvclNwYWNlXHJcblx0XHRcdFx0KTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIHNpemUgPT09IDYgKSB7XHJcblxyXG5cdFx0XHRcdC8vICNmZjAwMDBcclxuXHRcdFx0XHRyZXR1cm4gdGhpcy5zZXRIZXgoIHBhcnNlSW50KCBoZXgsIDE2ICksIGNvbG9yU3BhY2UgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkNvbG9yOiBJbnZhbGlkIGhleCBjb2xvciAnICsgc3R5bGUgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2UgaWYgKCBzdHlsZSAmJiBzdHlsZS5sZW5ndGggPiAwICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIHRoaXMuc2V0Q29sb3JOYW1lKCBzdHlsZSwgY29sb3JTcGFjZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoaXMgY29sb3IgZnJvbSBhIGNvbG9yIG5hbWUuIEZhc3RlciB0aGFuIHtAbGluayBDb2xvciNzZXRTdHlsZX0gaWZcclxuXHQgKiB5b3UgZG9uJ3QgbmVlZCB0aGUgb3RoZXIgQ1NTLXN0eWxlIGZvcm1hdHMuXHJcblx0ICpcclxuXHQgKiBGb3IgY29udmVuaWVuY2UsIHRoZSBsaXN0IG9mIG5hbWVzIGlzIGV4cG9zZWQgaW4gYENvbG9yLk5BTUVTYCBhcyBhIGhhc2guXHJcblx0ICogYGBganNcclxuXHQgKiBDb2xvci5OQU1FUy5hbGljZWJsdWUgLy8gcmV0dXJucyAweEYwRjhGRlxyXG5cdCAqIGBgYFxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHN0eWxlIC0gVGhlIGNvbG9yIG5hbWUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtjb2xvclNwYWNlPVNSR0JDb2xvclNwYWNlXSAtIFRoZSBjb2xvciBzcGFjZS5cclxuXHQgKiBAcmV0dXJuIHtDb2xvcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBjb2xvci5cclxuXHQgKi9cclxuXHRzZXRDb2xvck5hbWUoIHN0eWxlLCBjb2xvclNwYWNlID0gU1JHQkNvbG9yU3BhY2UgKSB7XHJcblxyXG5cdFx0Ly8gY29sb3Iga2V5d29yZHNcclxuXHRcdGNvbnN0IGhleCA9IF9jb2xvcktleXdvcmRzWyBzdHlsZS50b0xvd2VyQ2FzZSgpIF07XHJcblxyXG5cdFx0aWYgKCBoZXggIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdC8vIHJlZFxyXG5cdFx0XHR0aGlzLnNldEhleCggaGV4LCBjb2xvclNwYWNlICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdC8vIHVua25vd24gY29sb3JcclxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ29sb3I6IFVua25vd24gY29sb3IgJyArIHN0eWxlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBuZXcgY29sb3Igd2l0aCBjb3BpZWQgdmFsdWVzIGZyb20gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0NvbG9yfSBBIGNsb25lIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y2xvbmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLnIsIHRoaXMuZywgdGhpcy5iICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29waWVzIHRoZSB2YWx1ZXMgb2YgdGhlIGdpdmVuIGNvbG9yIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0NvbG9yfSBjb2xvciAtIFRoZSBjb2xvciB0byBjb3B5LlxyXG5cdCAqIEByZXR1cm4ge0NvbG9yfSBBIHJlZmVyZW5jZSB0byB0aGlzIGNvbG9yLlxyXG5cdCAqL1xyXG5cdGNvcHkoIGNvbG9yICkge1xyXG5cclxuXHRcdHRoaXMuciA9IGNvbG9yLnI7XHJcblx0XHR0aGlzLmcgPSBjb2xvci5nO1xyXG5cdFx0dGhpcy5iID0gY29sb3IuYjtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb3BpZXMgdGhlIGdpdmVuIGNvbG9yIGludG8gdGhpcyBjb2xvciwgYW5kIHRoZW4gY29udmVydHMgdGhpcyBjb2xvciBmcm9tXHJcblx0ICogYFNSR0JDb2xvclNwYWNlYCB0byBgTGluZWFyU1JHQkNvbG9yU3BhY2VgLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtDb2xvcn0gY29sb3IgLSBUaGUgY29sb3IgdG8gY29weS9jb252ZXJ0LlxyXG5cdCAqIEByZXR1cm4ge0NvbG9yfSBBIHJlZmVyZW5jZSB0byB0aGlzIGNvbG9yLlxyXG5cdCAqL1xyXG5cdGNvcHlTUkdCVG9MaW5lYXIoIGNvbG9yICkge1xyXG5cclxuXHRcdHRoaXMuciA9IFNSR0JUb0xpbmVhciggY29sb3IuciApO1xyXG5cdFx0dGhpcy5nID0gU1JHQlRvTGluZWFyKCBjb2xvci5nICk7XHJcblx0XHR0aGlzLmIgPSBTUkdCVG9MaW5lYXIoIGNvbG9yLmIgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb3BpZXMgdGhlIGdpdmVuIGNvbG9yIGludG8gdGhpcyBjb2xvciwgYW5kIHRoZW4gY29udmVydHMgdGhpcyBjb2xvciBmcm9tXHJcblx0ICogYExpbmVhclNSR0JDb2xvclNwYWNlYCB0byBgU1JHQkNvbG9yU3BhY2VgLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtDb2xvcn0gY29sb3IgLSBUaGUgY29sb3IgdG8gY29weS9jb252ZXJ0LlxyXG5cdCAqIEByZXR1cm4ge0NvbG9yfSBBIHJlZmVyZW5jZSB0byB0aGlzIGNvbG9yLlxyXG5cdCAqL1xyXG5cdGNvcHlMaW5lYXJUb1NSR0IoIGNvbG9yICkge1xyXG5cclxuXHRcdHRoaXMuciA9IExpbmVhclRvU1JHQiggY29sb3IuciApO1xyXG5cdFx0dGhpcy5nID0gTGluZWFyVG9TUkdCKCBjb2xvci5nICk7XHJcblx0XHR0aGlzLmIgPSBMaW5lYXJUb1NSR0IoIGNvbG9yLmIgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb252ZXJ0cyB0aGlzIGNvbG9yIGZyb20gYFNSR0JDb2xvclNwYWNlYCB0byBgTGluZWFyU1JHQkNvbG9yU3BhY2VgLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Q29sb3J9IEEgcmVmZXJlbmNlIHRvIHRoaXMgY29sb3IuXHJcblx0ICovXHJcblx0Y29udmVydFNSR0JUb0xpbmVhcigpIHtcclxuXHJcblx0XHR0aGlzLmNvcHlTUkdCVG9MaW5lYXIoIHRoaXMgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb252ZXJ0cyB0aGlzIGNvbG9yIGZyb20gYExpbmVhclNSR0JDb2xvclNwYWNlYCB0byBgU1JHQkNvbG9yU3BhY2VgLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Q29sb3J9IEEgcmVmZXJlbmNlIHRvIHRoaXMgY29sb3IuXHJcblx0ICovXHJcblx0Y29udmVydExpbmVhclRvU1JHQigpIHtcclxuXHJcblx0XHR0aGlzLmNvcHlMaW5lYXJUb1NSR0IoIHRoaXMgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBoZXhhZGVjaW1hbCB2YWx1ZSBvZiB0aGlzIGNvbG9yLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtjb2xvclNwYWNlPVNSR0JDb2xvclNwYWNlXSAtIFRoZSBjb2xvciBzcGFjZS5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBoZXhhZGVjaW1hbCB2YWx1ZS5cclxuXHQgKi9cclxuXHRnZXRIZXgoIGNvbG9yU3BhY2UgPSBTUkdCQ29sb3JTcGFjZSApIHtcclxuXHJcblx0XHRDb2xvck1hbmFnZW1lbnQuZnJvbVdvcmtpbmdDb2xvclNwYWNlKCBfY29sb3IuY29weSggdGhpcyApLCBjb2xvclNwYWNlICk7XHJcblxyXG5cdFx0cmV0dXJuIE1hdGgucm91bmQoIGNsYW1wKCBfY29sb3IuciAqIDI1NSwgMCwgMjU1ICkgKSAqIDY1NTM2ICsgTWF0aC5yb3VuZCggY2xhbXAoIF9jb2xvci5nICogMjU1LCAwLCAyNTUgKSApICogMjU2ICsgTWF0aC5yb3VuZCggY2xhbXAoIF9jb2xvci5iICogMjU1LCAwLCAyNTUgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGhleGFkZWNpbWFsIHZhbHVlIG9mIHRoaXMgY29sb3IgYXMgYSBzdHJpbmcgKGZvciBleGFtcGxlLCAnRkZGRkZGJykuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW2NvbG9yU3BhY2U9U1JHQkNvbG9yU3BhY2VdIC0gVGhlIGNvbG9yIHNwYWNlLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGhleGFkZWNpbWFsIHZhbHVlIGFzIGEgc3RyaW5nLlxyXG5cdCAqL1xyXG5cdGdldEhleFN0cmluZyggY29sb3JTcGFjZSA9IFNSR0JDb2xvclNwYWNlICkge1xyXG5cclxuXHRcdHJldHVybiAoICcwMDAwMDAnICsgdGhpcy5nZXRIZXgoIGNvbG9yU3BhY2UgKS50b1N0cmluZyggMTYgKSApLnNsaWNlKCAtIDYgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb252ZXJ0cyB0aGUgY29sb3JzIFJHQiB2YWx1ZXMgaW50byB0aGUgSFNMIGZvcm1hdCBhbmQgc3RvcmVzIHRoZW0gaW50byB0aGVcclxuXHQgKiBnaXZlbiB0YXJnZXQgb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHt7aDpudW1iZXIsczpudW1iZXIsbDpudW1iZXJ9fSB0YXJnZXQgLSBUaGUgdGFyZ2V0IG9iamVjdCB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGhvZCdzIHJlc3VsdC5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW2NvbG9yU3BhY2U9Q29sb3JNYW5hZ2VtZW50LndvcmtpbmdDb2xvclNwYWNlXSAtIFRoZSBjb2xvciBzcGFjZS5cclxuXHQgKiBAcmV0dXJuIHt7aDpudW1iZXIsczpudW1iZXIsbDpudW1iZXJ9fSBUaGUgSFNMIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgY29sb3IuXHJcblx0ICovXHJcblx0Z2V0SFNMKCB0YXJnZXQsIGNvbG9yU3BhY2UgPSBDb2xvck1hbmFnZW1lbnQud29ya2luZ0NvbG9yU3BhY2UgKSB7XHJcblxyXG5cdFx0Ly8gaCxzLGwgcmFuZ2VzIGFyZSBpbiAwLjAgLSAxLjBcclxuXHJcblx0XHRDb2xvck1hbmFnZW1lbnQuZnJvbVdvcmtpbmdDb2xvclNwYWNlKCBfY29sb3IuY29weSggdGhpcyApLCBjb2xvclNwYWNlICk7XHJcblxyXG5cdFx0Y29uc3QgciA9IF9jb2xvci5yLCBnID0gX2NvbG9yLmcsIGIgPSBfY29sb3IuYjtcclxuXHJcblx0XHRjb25zdCBtYXggPSBNYXRoLm1heCggciwgZywgYiApO1xyXG5cdFx0Y29uc3QgbWluID0gTWF0aC5taW4oIHIsIGcsIGIgKTtcclxuXHJcblx0XHRsZXQgaHVlLCBzYXR1cmF0aW9uO1xyXG5cdFx0Y29uc3QgbGlnaHRuZXNzID0gKCBtaW4gKyBtYXggKSAvIDIuMDtcclxuXHJcblx0XHRpZiAoIG1pbiA9PT0gbWF4ICkge1xyXG5cclxuXHRcdFx0aHVlID0gMDtcclxuXHRcdFx0c2F0dXJhdGlvbiA9IDA7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGNvbnN0IGRlbHRhID0gbWF4IC0gbWluO1xyXG5cclxuXHRcdFx0c2F0dXJhdGlvbiA9IGxpZ2h0bmVzcyA8PSAwLjUgPyBkZWx0YSAvICggbWF4ICsgbWluICkgOiBkZWx0YSAvICggMiAtIG1heCAtIG1pbiApO1xyXG5cclxuXHRcdFx0c3dpdGNoICggbWF4ICkge1xyXG5cclxuXHRcdFx0XHRjYXNlIHI6IGh1ZSA9ICggZyAtIGIgKSAvIGRlbHRhICsgKCBnIDwgYiA/IDYgOiAwICk7IGJyZWFrO1xyXG5cdFx0XHRcdGNhc2UgZzogaHVlID0gKCBiIC0gciApIC8gZGVsdGEgKyAyOyBicmVhaztcclxuXHRcdFx0XHRjYXNlIGI6IGh1ZSA9ICggciAtIGcgKSAvIGRlbHRhICsgNDsgYnJlYWs7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRodWUgLz0gNjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGFyZ2V0LmggPSBodWU7XHJcblx0XHR0YXJnZXQucyA9IHNhdHVyYXRpb247XHJcblx0XHR0YXJnZXQubCA9IGxpZ2h0bmVzcztcclxuXHJcblx0XHRyZXR1cm4gdGFyZ2V0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIFJHQiB2YWx1ZXMgb2YgdGhpcyBjb2xvciBhbmQgc3RvcmVzIHRoZW0gaW50byB0aGUgZ2l2ZW4gdGFyZ2V0IG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Q29sb3J9IHRhcmdldCAtIFRoZSB0YXJnZXQgY29sb3IgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBtZXRob2QncyByZXN1bHQuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtjb2xvclNwYWNlPUNvbG9yTWFuYWdlbWVudC53b3JraW5nQ29sb3JTcGFjZV0gLSBUaGUgY29sb3Igc3BhY2UuXHJcblx0ICogQHJldHVybiB7Q29sb3J9IFRoZSBSR0IgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBjb2xvci5cclxuXHQgKi9cclxuXHRnZXRSR0IoIHRhcmdldCwgY29sb3JTcGFjZSA9IENvbG9yTWFuYWdlbWVudC53b3JraW5nQ29sb3JTcGFjZSApIHtcclxuXHJcblx0XHRDb2xvck1hbmFnZW1lbnQuZnJvbVdvcmtpbmdDb2xvclNwYWNlKCBfY29sb3IuY29weSggdGhpcyApLCBjb2xvclNwYWNlICk7XHJcblxyXG5cdFx0dGFyZ2V0LnIgPSBfY29sb3IucjtcclxuXHRcdHRhcmdldC5nID0gX2NvbG9yLmc7XHJcblx0XHR0YXJnZXQuYiA9IF9jb2xvci5iO1xyXG5cclxuXHRcdHJldHVybiB0YXJnZXQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhpcyBjb2xvciBhcyBhIENTUyBzdHlsZSBzdHJpbmcuIEV4YW1wbGU6IGByZ2IoMjU1LDAsMClgLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtjb2xvclNwYWNlPVNSR0JDb2xvclNwYWNlXSAtIFRoZSBjb2xvciBzcGFjZS5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBDU1MgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBjb2xvci5cclxuXHQgKi9cclxuXHRnZXRTdHlsZSggY29sb3JTcGFjZSA9IFNSR0JDb2xvclNwYWNlICkge1xyXG5cclxuXHRcdENvbG9yTWFuYWdlbWVudC5mcm9tV29ya2luZ0NvbG9yU3BhY2UoIF9jb2xvci5jb3B5KCB0aGlzICksIGNvbG9yU3BhY2UgKTtcclxuXHJcblx0XHRjb25zdCByID0gX2NvbG9yLnIsIGcgPSBfY29sb3IuZywgYiA9IF9jb2xvci5iO1xyXG5cclxuXHRcdGlmICggY29sb3JTcGFjZSAhPT0gU1JHQkNvbG9yU3BhY2UgKSB7XHJcblxyXG5cdFx0XHQvLyBSZXF1aXJlcyBDU1MgQ29sb3IgTW9kdWxlIExldmVsIDQgKGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MtY29sb3ItNC8pLlxyXG5cdFx0XHRyZXR1cm4gYGNvbG9yKCR7IGNvbG9yU3BhY2UgfSAkeyByLnRvRml4ZWQoIDMgKSB9ICR7IGcudG9GaXhlZCggMyApIH0gJHsgYi50b0ZpeGVkKCAzICkgfSlgO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gYHJnYigkeyBNYXRoLnJvdW5kKCByICogMjU1ICkgfSwkeyBNYXRoLnJvdW5kKCBnICogMjU1ICkgfSwkeyBNYXRoLnJvdW5kKCBiICogMjU1ICkgfSlgO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgdGhlIGdpdmVuIEhTTCB2YWx1ZXMgdG8gdGhpcyBjb2xvcidzIHZhbHVlcy5cclxuXHQgKiBJbnRlcm5hbGx5LCB0aGlzIGNvbnZlcnRzIHRoZSBjb2xvcidzIFJHQiB2YWx1ZXMgdG8gSFNMLCBhZGRzIEhTTFxyXG5cdCAqIGFuZCB0aGVuIGNvbnZlcnRzIHRoZSBjb2xvciBiYWNrIHRvIFJHQi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBoIC0gSHVlIHZhbHVlIGJldHdlZW4gYDAuMGAgYW5kIGAxLjBgLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzIC0gU2F0dXJhdGlvbiB2YWx1ZSBiZXR3ZWVuIGAwLjBgIGFuZCBgMS4wYC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbCAtIExpZ2h0bmVzcyB2YWx1ZSBiZXR3ZWVuIGAwLjBgIGFuZCBgMS4wYC5cclxuXHQgKiBAcmV0dXJuIHtDb2xvcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBjb2xvci5cclxuXHQgKi9cclxuXHRvZmZzZXRIU0woIGgsIHMsIGwgKSB7XHJcblxyXG5cdFx0dGhpcy5nZXRIU0woIF9oc2xBICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuc2V0SFNMKCBfaHNsQS5oICsgaCwgX2hzbEEucyArIHMsIF9oc2xBLmwgKyBsICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyB0aGUgUkdCIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gY29sb3IgdG8gdGhlIFJHQiB2YWx1ZXMgb2YgdGhpcyBjb2xvci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Q29sb3J9IGNvbG9yIC0gVGhlIGNvbG9yIHRvIGFkZC5cclxuXHQgKiBAcmV0dXJuIHtDb2xvcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBjb2xvci5cclxuXHQgKi9cclxuXHRhZGQoIGNvbG9yICkge1xyXG5cclxuXHRcdHRoaXMuciArPSBjb2xvci5yO1xyXG5cdFx0dGhpcy5nICs9IGNvbG9yLmc7XHJcblx0XHR0aGlzLmIgKz0gY29sb3IuYjtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIHRoZSBSR0IgdmFsdWVzIG9mIHRoZSBnaXZlbiBjb2xvcnMgYW5kIHN0b3JlcyB0aGUgcmVzdWx0IGluIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0NvbG9yfSBjb2xvcjEgLSBUaGUgZmlyc3QgY29sb3IuXHJcblx0ICogQHBhcmFtIHtDb2xvcn0gY29sb3IyIC0gVGhlIHNlY29uZCBjb2xvci5cclxuXHQgKiBAcmV0dXJuIHtDb2xvcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBjb2xvci5cclxuXHQgKi9cclxuXHRhZGRDb2xvcnMoIGNvbG9yMSwgY29sb3IyICkge1xyXG5cclxuXHRcdHRoaXMuciA9IGNvbG9yMS5yICsgY29sb3IyLnI7XHJcblx0XHR0aGlzLmcgPSBjb2xvcjEuZyArIGNvbG9yMi5nO1xyXG5cdFx0dGhpcy5iID0gY29sb3IxLmIgKyBjb2xvcjIuYjtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIHRoZSBnaXZlbiBzY2FsYXIgdmFsdWUgdG8gdGhlIFJHQiB2YWx1ZXMgb2YgdGhpcyBjb2xvci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzIC0gVGhlIHNjYWxhciB0byBhZGQuXHJcblx0ICogQHJldHVybiB7Q29sb3J9IEEgcmVmZXJlbmNlIHRvIHRoaXMgY29sb3IuXHJcblx0ICovXHJcblx0YWRkU2NhbGFyKCBzICkge1xyXG5cclxuXHRcdHRoaXMuciArPSBzO1xyXG5cdFx0dGhpcy5nICs9IHM7XHJcblx0XHR0aGlzLmIgKz0gcztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTdWJ0cmFjdHMgdGhlIFJHQiB2YWx1ZXMgb2YgdGhlIGdpdmVuIGNvbG9yIGZyb20gdGhlIFJHQiB2YWx1ZXMgb2YgdGhpcyBjb2xvci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Q29sb3J9IGNvbG9yIC0gVGhlIGNvbG9yIHRvIHN1YnRyYWN0LlxyXG5cdCAqIEByZXR1cm4ge0NvbG9yfSBBIHJlZmVyZW5jZSB0byB0aGlzIGNvbG9yLlxyXG5cdCAqL1xyXG5cdHN1YiggY29sb3IgKSB7XHJcblxyXG5cdFx0dGhpcy5yID0gTWF0aC5tYXgoIDAsIHRoaXMuciAtIGNvbG9yLnIgKTtcclxuXHRcdHRoaXMuZyA9IE1hdGgubWF4KCAwLCB0aGlzLmcgLSBjb2xvci5nICk7XHJcblx0XHR0aGlzLmIgPSBNYXRoLm1heCggMCwgdGhpcy5iIC0gY29sb3IuYiApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE11bHRpcGxpZXMgdGhlIFJHQiB2YWx1ZXMgb2YgdGhlIGdpdmVuIGNvbG9yIHdpdGggdGhlIFJHQiB2YWx1ZXMgb2YgdGhpcyBjb2xvci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Q29sb3J9IGNvbG9yIC0gVGhlIGNvbG9yIHRvIG11bHRpcGx5LlxyXG5cdCAqIEByZXR1cm4ge0NvbG9yfSBBIHJlZmVyZW5jZSB0byB0aGlzIGNvbG9yLlxyXG5cdCAqL1xyXG5cdG11bHRpcGx5KCBjb2xvciApIHtcclxuXHJcblx0XHR0aGlzLnIgKj0gY29sb3IucjtcclxuXHRcdHRoaXMuZyAqPSBjb2xvci5nO1xyXG5cdFx0dGhpcy5iICo9IGNvbG9yLmI7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTXVsdGlwbGllcyB0aGUgZ2l2ZW4gc2NhbGFyIHZhbHVlIHdpdGggdGhlIFJHQiB2YWx1ZXMgb2YgdGhpcyBjb2xvci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzIC0gVGhlIHNjYWxhciB0byBtdWx0aXBseS5cclxuXHQgKiBAcmV0dXJuIHtDb2xvcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBjb2xvci5cclxuXHQgKi9cclxuXHRtdWx0aXBseVNjYWxhciggcyApIHtcclxuXHJcblx0XHR0aGlzLnIgKj0gcztcclxuXHRcdHRoaXMuZyAqPSBzO1xyXG5cdFx0dGhpcy5iICo9IHM7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTGluZWFybHkgaW50ZXJwb2xhdGVzIHRoaXMgY29sb3IncyBSR0IgdmFsdWVzIHRvd2FyZCB0aGUgUkdCIHZhbHVlcyBvZiB0aGVcclxuXHQgKiBnaXZlbiBjb2xvci4gVGhlIGFscGhhIGFyZ3VtZW50IGNhbiBiZSB0aG91Z2h0IG9mIGFzIHRoZSByYXRpbyBiZXR3ZWVuXHJcblx0ICogdGhlIHR3byBjb2xvcnMsIHdoZXJlIGAwLjBgIGlzIHRoaXMgY29sb3IgYW5kIGAxLjBgIGlzIHRoZSBmaXJzdCBhcmd1bWVudC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Q29sb3J9IGNvbG9yIC0gVGhlIGNvbG9yIHRvIGNvbnZlcmdlIG9uLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhbHBoYSAtIFRoZSBpbnRlcnBvbGF0aW9uIGZhY3RvciBpbiB0aGUgY2xvc2VkIGludGVydmFsIGBbMCwxXWAuXHJcblx0ICogQHJldHVybiB7Q29sb3J9IEEgcmVmZXJlbmNlIHRvIHRoaXMgY29sb3IuXHJcblx0ICovXHJcblx0bGVycCggY29sb3IsIGFscGhhICkge1xyXG5cclxuXHRcdHRoaXMuciArPSAoIGNvbG9yLnIgLSB0aGlzLnIgKSAqIGFscGhhO1xyXG5cdFx0dGhpcy5nICs9ICggY29sb3IuZyAtIHRoaXMuZyApICogYWxwaGE7XHJcblx0XHR0aGlzLmIgKz0gKCBjb2xvci5iIC0gdGhpcy5iICkgKiBhbHBoYTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBMaW5lYXJseSBpbnRlcnBvbGF0ZXMgYmV0d2VlbiB0aGUgZ2l2ZW4gY29sb3JzIGFuZCBzdG9yZXMgdGhlIHJlc3VsdCBpbiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqIFRoZSBhbHBoYSBhcmd1bWVudCBjYW4gYmUgdGhvdWdodCBvZiBhcyB0aGUgcmF0aW8gYmV0d2VlbiB0aGUgdHdvIGNvbG9ycywgd2hlcmUgYDAuMGBcclxuXHQgKiBpcyB0aGUgZmlyc3QgYW5kIGAxLjBgIGlzIHRoZSBzZWNvbmQgY29sb3IuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0NvbG9yfSBjb2xvcjEgLSBUaGUgZmlyc3QgY29sb3IuXHJcblx0ICogQHBhcmFtIHtDb2xvcn0gY29sb3IyIC0gVGhlIHNlY29uZCBjb2xvci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYWxwaGEgLSBUaGUgaW50ZXJwb2xhdGlvbiBmYWN0b3IgaW4gdGhlIGNsb3NlZCBpbnRlcnZhbCBgWzAsMV1gLlxyXG5cdCAqIEByZXR1cm4ge0NvbG9yfSBBIHJlZmVyZW5jZSB0byB0aGlzIGNvbG9yLlxyXG5cdCAqL1xyXG5cdGxlcnBDb2xvcnMoIGNvbG9yMSwgY29sb3IyLCBhbHBoYSApIHtcclxuXHJcblx0XHR0aGlzLnIgPSBjb2xvcjEuciArICggY29sb3IyLnIgLSBjb2xvcjEuciApICogYWxwaGE7XHJcblx0XHR0aGlzLmcgPSBjb2xvcjEuZyArICggY29sb3IyLmcgLSBjb2xvcjEuZyApICogYWxwaGE7XHJcblx0XHR0aGlzLmIgPSBjb2xvcjEuYiArICggY29sb3IyLmIgLSBjb2xvcjEuYiApICogYWxwaGE7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTGluZWFybHkgaW50ZXJwb2xhdGVzIHRoaXMgY29sb3IncyBIU0wgdmFsdWVzIHRvd2FyZCB0aGUgSFNMIHZhbHVlcyBvZiB0aGVcclxuXHQgKiBnaXZlbiBjb2xvci4gSXQgZGlmZmVycyBmcm9tIHtAbGluayBDb2xvciNsZXJwfSBieSBub3QgaW50ZXJwb2xhdGluZyBzdHJhaWdodFxyXG5cdCAqIGZyb20gb25lIGNvbG9yIHRvIHRoZSBvdGhlciwgYnV0IGluc3RlYWQgZ29pbmcgdGhyb3VnaCBhbGwgdGhlIGh1ZXMgaW4gYmV0d2VlblxyXG5cdCAqIHRob3NlIHR3byBjb2xvcnMuIFRoZSBhbHBoYSBhcmd1bWVudCBjYW4gYmUgdGhvdWdodCBvZiBhcyB0aGUgcmF0aW8gYmV0d2VlblxyXG5cdCAqIHRoZSB0d28gY29sb3JzLCB3aGVyZSAwLjAgaXMgdGhpcyBjb2xvciBhbmQgMS4wIGlzIHRoZSBmaXJzdCBhcmd1bWVudC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Q29sb3J9IGNvbG9yIC0gVGhlIGNvbG9yIHRvIGNvbnZlcmdlIG9uLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhbHBoYSAtIFRoZSBpbnRlcnBvbGF0aW9uIGZhY3RvciBpbiB0aGUgY2xvc2VkIGludGVydmFsIGBbMCwxXWAuXHJcblx0ICogQHJldHVybiB7Q29sb3J9IEEgcmVmZXJlbmNlIHRvIHRoaXMgY29sb3IuXHJcblx0ICovXHJcblx0bGVycEhTTCggY29sb3IsIGFscGhhICkge1xyXG5cclxuXHRcdHRoaXMuZ2V0SFNMKCBfaHNsQSApO1xyXG5cdFx0Y29sb3IuZ2V0SFNMKCBfaHNsQiApO1xyXG5cclxuXHRcdGNvbnN0IGggPSBsZXJwKCBfaHNsQS5oLCBfaHNsQi5oLCBhbHBoYSApO1xyXG5cdFx0Y29uc3QgcyA9IGxlcnAoIF9oc2xBLnMsIF9oc2xCLnMsIGFscGhhICk7XHJcblx0XHRjb25zdCBsID0gbGVycCggX2hzbEEubCwgX2hzbEIubCwgYWxwaGEgKTtcclxuXHJcblx0XHR0aGlzLnNldEhTTCggaCwgcywgbCApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGNvbG9yJ3MgUkdCIGNvbXBvbmVudHMgZnJvbSB0aGUgZ2l2ZW4gM0QgdmVjdG9yLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB2IC0gVGhlIHZlY3RvciB0byBzZXQuXHJcblx0ICogQHJldHVybiB7Q29sb3J9IEEgcmVmZXJlbmNlIHRvIHRoaXMgY29sb3IuXHJcblx0ICovXHJcblx0c2V0RnJvbVZlY3RvcjMoIHYgKSB7XHJcblxyXG5cdFx0dGhpcy5yID0gdi54O1xyXG5cdFx0dGhpcy5nID0gdi55O1xyXG5cdFx0dGhpcy5iID0gdi56O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRyYW5zZm9ybXMgdGhpcyBjb2xvciB3aXRoIHRoZSBnaXZlbiAzeDMgbWF0cml4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRyaXgzfSBtIC0gVGhlIG1hdHJpeC5cclxuXHQgKiBAcmV0dXJuIHtDb2xvcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBjb2xvci5cclxuXHQgKi9cclxuXHRhcHBseU1hdHJpeDMoIG0gKSB7XHJcblxyXG5cdFx0Y29uc3QgciA9IHRoaXMuciwgZyA9IHRoaXMuZywgYiA9IHRoaXMuYjtcclxuXHRcdGNvbnN0IGUgPSBtLmVsZW1lbnRzO1xyXG5cclxuXHRcdHRoaXMuciA9IGVbIDAgXSAqIHIgKyBlWyAzIF0gKiBnICsgZVsgNiBdICogYjtcclxuXHRcdHRoaXMuZyA9IGVbIDEgXSAqIHIgKyBlWyA0IF0gKiBnICsgZVsgNyBdICogYjtcclxuXHRcdHRoaXMuYiA9IGVbIDIgXSAqIHIgKyBlWyA1IF0gKiBnICsgZVsgOCBdICogYjtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIGNvbG9yIGlzIGVxdWFsIHdpdGggdGhlIGdpdmVuIG9uZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Q29sb3J9IGMgLSBUaGUgY29sb3IgdG8gdGVzdCBmb3IgZXF1YWxpdHkuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGlzIGJvdW5kaW5nIGNvbG9yIGlzIGVxdWFsIHdpdGggdGhlIGdpdmVuIG9uZS5cclxuXHQgKi9cclxuXHRlcXVhbHMoIGMgKSB7XHJcblxyXG5cdFx0cmV0dXJuICggYy5yID09PSB0aGlzLnIgKSAmJiAoIGMuZyA9PT0gdGhpcy5nICkgJiYgKCBjLmIgPT09IHRoaXMuYiApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhpcyBjb2xvcidzIFJHQiBjb21wb25lbnRzIGZyb20gdGhlIGdpdmVuIGFycmF5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBhcnJheSAtIEFuIGFycmF5IGhvbGRpbmcgdGhlIFJHQiB2YWx1ZXMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXQ9MF0gLSBUaGUgb2Zmc2V0IGludG8gdGhlIGFycmF5LlxyXG5cdCAqIEByZXR1cm4ge0NvbG9yfSBBIHJlZmVyZW5jZSB0byB0aGlzIGNvbG9yLlxyXG5cdCAqL1xyXG5cdGZyb21BcnJheSggYXJyYXksIG9mZnNldCA9IDAgKSB7XHJcblxyXG5cdFx0dGhpcy5yID0gYXJyYXlbIG9mZnNldCBdO1xyXG5cdFx0dGhpcy5nID0gYXJyYXlbIG9mZnNldCArIDEgXTtcclxuXHRcdHRoaXMuYiA9IGFycmF5WyBvZmZzZXQgKyAyIF07XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogV3JpdGVzIHRoZSBSR0IgY29tcG9uZW50cyBvZiB0aGlzIGNvbG9yIHRvIHRoZSBnaXZlbiBhcnJheS4gSWYgbm8gYXJyYXkgaXMgcHJvdmlkZWQsXHJcblx0ICogdGhlIG1ldGhvZCByZXR1cm5zIGEgbmV3IGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBbYXJyYXk9W11dIC0gVGhlIHRhcmdldCBhcnJheSBob2xkaW5nIHRoZSBjb2xvciBjb21wb25lbnRzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0PTBdIC0gSW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGFycmF5LlxyXG5cdCAqIEByZXR1cm4ge0FycmF5PG51bWJlcj59IFRoZSBjb2xvciBjb21wb25lbnRzLlxyXG5cdCAqL1xyXG5cdHRvQXJyYXkoIGFycmF5ID0gW10sIG9mZnNldCA9IDAgKSB7XHJcblxyXG5cdFx0YXJyYXlbIG9mZnNldCBdID0gdGhpcy5yO1xyXG5cdFx0YXJyYXlbIG9mZnNldCArIDEgXSA9IHRoaXMuZztcclxuXHRcdGFycmF5WyBvZmZzZXQgKyAyIF0gPSB0aGlzLmI7XHJcblxyXG5cdFx0cmV0dXJuIGFycmF5O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGNvbXBvbmVudHMgb2YgdGhpcyBjb2xvciBmcm9tIHRoZSBnaXZlbiBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCdWZmZXJBdHRyaWJ1dGV9IGF0dHJpYnV0ZSAtIFRoZSBidWZmZXIgYXR0cmlidXRlIGhvbGRpbmcgY29sb3IgZGF0YS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggaW50byB0aGUgYXR0cmlidXRlLlxyXG5cdCAqIEByZXR1cm4ge0NvbG9yfSBBIHJlZmVyZW5jZSB0byB0aGlzIGNvbG9yLlxyXG5cdCAqL1xyXG5cdGZyb21CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgaW5kZXggKSB7XHJcblxyXG5cdFx0dGhpcy5yID0gYXR0cmlidXRlLmdldFgoIGluZGV4ICk7XHJcblx0XHR0aGlzLmcgPSBhdHRyaWJ1dGUuZ2V0WSggaW5kZXggKTtcclxuXHRcdHRoaXMuYiA9IGF0dHJpYnV0ZS5nZXRaKCBpbmRleCApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kcyBkZWZpbmVzIHRoZSBzZXJpYWxpemF0aW9uIHJlc3VsdCBvZiB0aGlzIGNsYXNzLiBSZXR1cm5zIHRoZSBjb2xvclxyXG5cdCAqIGFzIGEgaGV4YWRlY2ltYWwgdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBoZXhhZGVjaW1hbCB2YWx1ZS5cclxuXHQgKi9cclxuXHR0b0pTT04oKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZ2V0SGV4KCk7XHJcblxyXG5cdH1cclxuXHJcblx0KlsgU3ltYm9sLml0ZXJhdG9yIF0oKSB7XHJcblxyXG5cdFx0eWllbGQgdGhpcy5yO1xyXG5cdFx0eWllbGQgdGhpcy5nO1xyXG5cdFx0eWllbGQgdGhpcy5iO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5jb25zdCBfY29sb3IgPSAvKkBfX1BVUkVfXyovIG5ldyBDb2xvcigpO1xyXG5cclxuLyoqXHJcbiAqIEEgZGljdGlvbmFyeSB3aXRoIFgxMSBjb2xvciBuYW1lcy5cclxuICpcclxuICogTm90ZSB0aGF0IG11bHRpcGxlIHdvcmRzIHN1Y2ggYXMgRGFyayBPcmFuZ2UgYmVjb21lIHRoZSBzdHJpbmcgJ2RhcmtvcmFuZ2UnLlxyXG4gKlxyXG4gKiBAc3RhdGljXHJcbiAqIEB0eXBlIHtPYmplY3R9XHJcbiAqL1xyXG5Db2xvci5OQU1FUyA9IF9jb2xvcktleXdvcmRzO1xyXG5cclxuZXhwb3J0IHsgQ29sb3IgfTtcclxuIiwiaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi9tYXRoL0NvbG9yLmpzJztcclxuaW1wb3J0IHsgRXZlbnREaXNwYXRjaGVyIH0gZnJvbSAnLi4vY29yZS9FdmVudERpc3BhdGNoZXIuanMnO1xyXG5pbXBvcnQgeyBGcm9udFNpZGUsIE5vcm1hbEJsZW5kaW5nLCBMZXNzRXF1YWxEZXB0aCwgQWRkRXF1YXRpb24sIE9uZU1pbnVzU3JjQWxwaGFGYWN0b3IsIFNyY0FscGhhRmFjdG9yLCBBbHdheXNTdGVuY2lsRnVuYywgS2VlcFN0ZW5jaWxPcCB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IGdlbmVyYXRlVVVJRCB9IGZyb20gJy4uL21hdGgvTWF0aFV0aWxzLmpzJztcclxuXHJcbmxldCBfbWF0ZXJpYWxJZCA9IDA7XHJcblxyXG4vKipcclxuICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgbWF0ZXJpYWxzLlxyXG4gKlxyXG4gKiBNYXRlcmlhbHMgZGVmaW5lIHRoZSBhcHBlYXJhbmNlIG9mIHJlbmRlcmFibGUgM0Qgb2JqZWN0cy5cclxuICpcclxuICogQGFic3RyYWN0XHJcbiAqIEBhdWdtZW50cyBFdmVudERpc3BhdGNoZXJcclxuICovXHJcbmNsYXNzIE1hdGVyaWFsIGV4dGVuZHMgRXZlbnREaXNwYXRjaGVyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBtYXRlcmlhbC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc01hdGVyaWFsID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBJRCBvZiB0aGUgbWF0ZXJpYWwuXHJcblx0XHQgKlxyXG5cdFx0ICogQG5hbWUgTWF0ZXJpYWwjaWRcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqL1xyXG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCAnaWQnLCB7IHZhbHVlOiBfbWF0ZXJpYWxJZCArKyB9ICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgVVVJRCBvZiB0aGUgbWF0ZXJpYWwuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnV1aWQgPSBnZW5lcmF0ZVVVSUQoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBuYW1lIG9mIHRoZSBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5hbWUgPSAnJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB0eXBlIHByb3BlcnR5IGlzIHVzZWQgZm9yIGRldGVjdGluZyB0aGUgb2JqZWN0IHR5cGVcclxuXHRcdCAqIGluIGNvbnRleHQgb2Ygc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnR5cGUgPSAnTWF0ZXJpYWwnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyB0aGUgYmxlbmRpbmcgdHlwZSBvZiB0aGUgbWF0ZXJpYWwuXHJcblx0XHQgKlxyXG5cdFx0ICogSXQgbXVzdCBiZSBzZXQgdG8gYEN1c3RvbUJsZW5kaW5nYCBpZiBjdXN0b20gYmxlbmRpbmcgcHJvcGVydGllcyBsaWtlXHJcblx0XHQgKiB7QGxpbmsgTWF0ZXJpYWwjYmxlbmRTcmN9LCB7QGxpbmsgTWF0ZXJpYWwjYmxlbmREc3R9IG9yIHtAbGluayBNYXRlcmlhbCNibGVuZEVxdWF0aW9ufVxyXG5cdFx0ICogc2hvdWxkIGhhdmUgYW55IGVmZmVjdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KE5vQmxlbmRpbmd8Tm9ybWFsQmxlbmRpbmd8QWRkaXRpdmVCbGVuZGluZ3xTdWJ0cmFjdGl2ZUJsZW5kaW5nfE11bHRpcGx5QmxlbmRpbmd8Q3VzdG9tQmxlbmRpbmcpfVxyXG5cdFx0ICogQGRlZmF1bHQgTm9ybWFsQmxlbmRpbmdcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ibGVuZGluZyA9IE5vcm1hbEJsZW5kaW5nO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyB3aGljaCBzaWRlIG9mIGZhY2VzIHdpbGwgYmUgcmVuZGVyZWQgLSBmcm9udCwgYmFjayBvciBib3RoLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoRnJvbnRTaWRlfEJhY2tTaWRlfERvdWJsZVNpZGUpfVxyXG5cdFx0ICogQGRlZmF1bHQgRnJvbnRTaWRlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2lkZSA9IEZyb250U2lkZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIElmIHNldCB0byBgdHJ1ZWAsIHZlcnRleCBjb2xvcnMgc2hvdWxkIGJlIHVzZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogVGhlIGVuZ2luZSBzdXBwb3J0cyBSR0IgYW5kIFJHQkEgdmVydGV4IGNvbG9ycyBkZXBlbmRpbmcgb24gd2hldGhlciBhIHRocmVlIChSR0IpIG9yXHJcblx0XHQgKiBmb3VyIChSR0JBKSBjb21wb25lbnQgY29sb3IgYnVmZmVyIGF0dHJpYnV0ZSBpcyB1c2VkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52ZXJ0ZXhDb2xvcnMgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgaG93IHRyYW5zcGFyZW50IHRoZSBtYXRlcmlhbCBpcy5cclxuXHRcdCAqIEEgdmFsdWUgb2YgYDAuMGAgaW5kaWNhdGVzIGZ1bGx5IHRyYW5zcGFyZW50LCBgMS4wYCBpcyBmdWxseSBvcGFxdWUuXHJcblx0XHQgKlxyXG5cdFx0ICogSWYgdGhlIHtAbGluayBNYXRlcmlhbCN0cmFuc3BhcmVudH0gaXMgbm90IHNldCB0byBgdHJ1ZWAsXHJcblx0XHQgKiB0aGUgbWF0ZXJpYWwgd2lsbCByZW1haW4gZnVsbHkgb3BhcXVlIGFuZCB0aGlzIHZhbHVlIHdpbGwgb25seSBhZmZlY3QgaXRzIGNvbG9yLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMub3BhY2l0eSA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIHdoZXRoZXIgdGhpcyBtYXRlcmlhbCBpcyB0cmFuc3BhcmVudC4gVGhpcyBoYXMgYW4gZWZmZWN0IG9uXHJcblx0XHQgKiByZW5kZXJpbmcgYXMgdHJhbnNwYXJlbnQgb2JqZWN0cyBuZWVkIHNwZWNpYWwgdHJlYXRtZW50IGFuZCBhcmUgcmVuZGVyZWRcclxuXHRcdCAqIGFmdGVyIG5vbi10cmFuc3BhcmVudCBvYmplY3RzLlxyXG5cdFx0ICpcclxuXHRcdCAqIFdoZW4gc2V0IHRvIHRydWUsIHRoZSBleHRlbnQgdG8gd2hpY2ggdGhlIG1hdGVyaWFsIGlzIHRyYW5zcGFyZW50IGlzXHJcblx0XHQgKiBjb250cm9sbGVkIGJ5IHtAbGluayBNYXRlcmlhbCNvcGFjaXR5fS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudHJhbnNwYXJlbnQgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEVuYWJsZXMgYWxwaGEgaGFzaGVkIHRyYW5zcGFyZW5jeSwgYW4gYWx0ZXJuYXRpdmUgdG8ge0BsaW5rIE1hdGVyaWFsI3RyYW5zcGFyZW50fSBvclxyXG5cdFx0ICoge0BsaW5rIE1hdGVyaWFsI2FscGhhVGVzdH0uIFRoZSBtYXRlcmlhbCB3aWxsIG5vdCBiZSByZW5kZXJlZCBpZiBvcGFjaXR5IGlzIGxvd2VyIHRoYW5cclxuXHRcdCAqIGEgcmFuZG9tIHRocmVzaG9sZC4gUmFuZG9taXphdGlvbiBpbnRyb2R1Y2VzIHNvbWUgZ3JhaW4gb3Igbm9pc2UsIGJ1dCBhcHByb3hpbWF0ZXMgYWxwaGFcclxuXHRcdCAqIGJsZW5kaW5nIHdpdGhvdXQgdGhlIGFzc29jaWF0ZWQgcHJvYmxlbXMgb2Ygc29ydGluZy4gVXNpbmcgVEFBIGNhbiByZWR1Y2UgdGhlIHJlc3VsdGluZyBub2lzZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYWxwaGFIYXNoID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIHRoZSBibGVuZGluZyBzb3VyY2UgZmFjdG9yLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoWmVyb0ZhY3RvcnxPbmVGYWN0b3J8U3JjQ29sb3JGYWN0b3J8T25lTWludXNTcmNDb2xvckZhY3RvcnxTcmNBbHBoYUZhY3RvcnxPbmVNaW51c1NyY0FscGhhRmFjdG9yfERzdEFscGhhRmFjdG9yfE9uZU1pbnVzRHN0QWxwaGFGYWN0b3J8RHN0Q29sb3JGYWN0b3J8T25lTWludXNEc3RDb2xvckZhY3RvcnxTcmNBbHBoYVNhdHVyYXRlRmFjdG9yfENvbnN0YW50Q29sb3JGYWN0b3J8T25lTWludXNDb25zdGFudENvbG9yRmFjdG9yfENvbnN0YW50QWxwaGFGYWN0b3J8T25lTWludXNDb25zdGFudEFscGhhRmFjdG9yKX1cclxuXHRcdCAqIEBkZWZhdWx0IFNyY0FscGhhRmFjdG9yXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYmxlbmRTcmMgPSBTcmNBbHBoYUZhY3RvcjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgdGhlIGJsZW5kaW5nIGRlc3RpbmF0aW9uIGZhY3Rvci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KFplcm9GYWN0b3J8T25lRmFjdG9yfFNyY0NvbG9yRmFjdG9yfE9uZU1pbnVzU3JjQ29sb3JGYWN0b3J8U3JjQWxwaGFGYWN0b3J8T25lTWludXNTcmNBbHBoYUZhY3RvcnxEc3RBbHBoYUZhY3RvcnxPbmVNaW51c0RzdEFscGhhRmFjdG9yfERzdENvbG9yRmFjdG9yfE9uZU1pbnVzRHN0Q29sb3JGYWN0b3J8U3JjQWxwaGFTYXR1cmF0ZUZhY3RvcnxDb25zdGFudENvbG9yRmFjdG9yfE9uZU1pbnVzQ29uc3RhbnRDb2xvckZhY3RvcnxDb25zdGFudEFscGhhRmFjdG9yfE9uZU1pbnVzQ29uc3RhbnRBbHBoYUZhY3Rvcil9XHJcblx0XHQgKiBAZGVmYXVsdCBPbmVNaW51c1NyY0FscGhhRmFjdG9yXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYmxlbmREc3QgPSBPbmVNaW51c1NyY0FscGhhRmFjdG9yO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyB0aGUgYmxlbmRpbmcgZXF1YXRpb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeyhBZGRFcXVhdGlvbnxTdWJ0cmFjdEVxdWF0aW9ufFJldmVyc2VTdWJ0cmFjdEVxdWF0aW9ufE1pbkVxdWF0aW9ufE1heEVxdWF0aW9uKX1cclxuXHRcdCAqIEBkZWZhdWx0IEFkZEVxdWF0aW9uXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYmxlbmRFcXVhdGlvbiA9IEFkZEVxdWF0aW9uO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyB0aGUgYmxlbmRpbmcgc291cmNlIGFscGhhIGZhY3Rvci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7PyhaZXJvRmFjdG9yfE9uZUZhY3RvcnxTcmNDb2xvckZhY3RvcnxPbmVNaW51c1NyY0NvbG9yRmFjdG9yfFNyY0FscGhhRmFjdG9yfE9uZU1pbnVzU3JjQWxwaGFGYWN0b3J8RHN0QWxwaGFGYWN0b3J8T25lTWludXNEc3RBbHBoYUZhY3RvcnxEc3RDb2xvckZhY3RvcnxPbmVNaW51c0RzdENvbG9yRmFjdG9yfFNyY0FscGhhU2F0dXJhdGVGYWN0b3J8Q29uc3RhbnRDb2xvckZhY3RvcnxPbmVNaW51c0NvbnN0YW50Q29sb3JGYWN0b3J8Q29uc3RhbnRBbHBoYUZhY3RvcnxPbmVNaW51c0NvbnN0YW50QWxwaGFGYWN0b3IpfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJsZW5kU3JjQWxwaGEgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyB0aGUgYmxlbmRpbmcgZGVzdGluYXRpb24gYWxwaGEgZmFjdG9yLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/KFplcm9GYWN0b3J8T25lRmFjdG9yfFNyY0NvbG9yRmFjdG9yfE9uZU1pbnVzU3JjQ29sb3JGYWN0b3J8U3JjQWxwaGFGYWN0b3J8T25lTWludXNTcmNBbHBoYUZhY3RvcnxEc3RBbHBoYUZhY3RvcnxPbmVNaW51c0RzdEFscGhhRmFjdG9yfERzdENvbG9yRmFjdG9yfE9uZU1pbnVzRHN0Q29sb3JGYWN0b3J8U3JjQWxwaGFTYXR1cmF0ZUZhY3RvcnxDb25zdGFudENvbG9yRmFjdG9yfE9uZU1pbnVzQ29uc3RhbnRDb2xvckZhY3RvcnxDb25zdGFudEFscGhhRmFjdG9yfE9uZU1pbnVzQ29uc3RhbnRBbHBoYUZhY3Rvcil9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYmxlbmREc3RBbHBoYSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIHRoZSBibGVuZGluZyBlcXVhdGlvbiBvZiB0aGUgYWxwaGEgY2hhbm5lbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7PyhBZGRFcXVhdGlvbnxTdWJ0cmFjdEVxdWF0aW9ufFJldmVyc2VTdWJ0cmFjdEVxdWF0aW9ufE1pbkVxdWF0aW9ufE1heEVxdWF0aW9uKX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ibGVuZEVxdWF0aW9uQWxwaGEgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVwcmVzZW50cyB0aGUgUkdCIHZhbHVlcyBvZiB0aGUgY29uc3RhbnQgYmxlbmQgY29sb3IuXHJcblx0XHQgKlxyXG5cdFx0ICogVGhpcyBwcm9wZXJ0eSBoYXMgb25seSBhbiBlZmZlY3Qgd2hlbiB1c2luZyBjdXN0b20gYmxlbmRpbmcgd2l0aCBgQ29uc3RhbnRDb2xvcmAgb3IgYE9uZU1pbnVzQ29uc3RhbnRDb2xvcmAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0NvbG9yfVxyXG5cdFx0ICogQGRlZmF1bHQgKDAsMCwwKVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJsZW5kQ29sb3IgPSBuZXcgQ29sb3IoIDAsIDAsIDAgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlcHJlc2VudHMgdGhlIGFscGhhIHZhbHVlIG9mIHRoZSBjb25zdGFudCBibGVuZCBjb2xvci5cclxuXHRcdCAqXHJcblx0XHQgKiBUaGlzIHByb3BlcnR5IGhhcyBvbmx5IGFuIGVmZmVjdCB3aGVuIHVzaW5nIGN1c3RvbSBibGVuZGluZyB3aXRoIGBDb25zdGFudEFscGhhYCBvciBgT25lTWludXNDb25zdGFudEFscGhhYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJsZW5kQWxwaGEgPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyB0aGUgZGVwdGggZnVuY3Rpb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeyhOZXZlckRlcHRofEFsd2F5c0RlcHRofExlc3NEZXB0aHxMZXNzRXF1YWxEZXB0aHxFcXVhbERlcHRofEdyZWF0ZXJFcXVhbERlcHRofEdyZWF0ZXJEZXB0aHxOb3RFcXVhbERlcHRoKX1cclxuXHRcdCAqIEBkZWZhdWx0IExlc3NFcXVhbERlcHRoXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGVwdGhGdW5jID0gTGVzc0VxdWFsRGVwdGg7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRvIGhhdmUgZGVwdGggdGVzdCBlbmFibGVkIHdoZW4gcmVuZGVyaW5nIHRoaXMgbWF0ZXJpYWwuXHJcblx0XHQgKiBXaGVuIHRoZSBkZXB0aCB0ZXN0IGlzIGRpc2FibGVkLCB0aGUgZGVwdGggd3JpdGUgd2lsbCBhbHNvIGJlIGltcGxpY2l0bHkgZGlzYWJsZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGVwdGhUZXN0ID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgcmVuZGVyaW5nIHRoaXMgbWF0ZXJpYWwgaGFzIGFueSBlZmZlY3Qgb24gdGhlIGRlcHRoIGJ1ZmZlci5cclxuXHRcdCAqXHJcblx0XHQgKiBXaGVuIGRyYXdpbmcgMkQgb3ZlcmxheXMgaXQgY2FuIGJlIHVzZWZ1bCB0byBkaXNhYmxlIHRoZSBkZXB0aCB3cml0aW5nIGluXHJcblx0XHQgKiBvcmRlciB0byBsYXllciBzZXZlcmFsIHRoaW5ncyB0b2dldGhlciB3aXRob3V0IGNyZWF0aW5nIHotaW5kZXggYXJ0aWZhY3RzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRlcHRoV3JpdGUgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGJpdCBtYXNrIHRvIHVzZSB3aGVuIHdyaXRpbmcgdG8gdGhlIHN0ZW5jaWwgYnVmZmVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAweGZmXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc3RlbmNpbFdyaXRlTWFzayA9IDB4ZmY7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc3RlbmNpbCBjb21wYXJpc29uIGZ1bmN0aW9uIHRvIHVzZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7TmV2ZXJTdGVuY2lsRnVuY3xMZXNzU3RlbmNpbEZ1bmN8RXF1YWxTdGVuY2lsRnVuY3xMZXNzRXF1YWxTdGVuY2lsRnVuY3xHcmVhdGVyU3RlbmNpbEZ1bmN8Tm90RXF1YWxTdGVuY2lsRnVuY3xHcmVhdGVyRXF1YWxTdGVuY2lsRnVuY3xBbHdheXNTdGVuY2lsRnVuY31cclxuXHRcdCAqIEBkZWZhdWx0IEFsd2F5c1N0ZW5jaWxGdW5jXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc3RlbmNpbEZ1bmMgPSBBbHdheXNTdGVuY2lsRnVuYztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB2YWx1ZSB0byB1c2Ugd2hlbiBwZXJmb3JtaW5nIHN0ZW5jaWwgY29tcGFyaXNvbnMgb3Igc3RlbmNpbCBvcGVyYXRpb25zLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc3RlbmNpbFJlZiA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYml0IG1hc2sgdG8gdXNlIHdoZW4gY29tcGFyaW5nIGFnYWluc3QgdGhlIHN0ZW5jaWwgYnVmZmVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAweGZmXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc3RlbmNpbEZ1bmNNYXNrID0gMHhmZjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoaWNoIHN0ZW5jaWwgb3BlcmF0aW9uIHRvIHBlcmZvcm0gd2hlbiB0aGUgY29tcGFyaXNvbiBmdW5jdGlvbiByZXR1cm5zIGBmYWxzZWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1plcm9TdGVuY2lsT3B8S2VlcFN0ZW5jaWxPcHxSZXBsYWNlU3RlbmNpbE9wfEluY3JlbWVudFN0ZW5jaWxPcHxEZWNyZW1lbnRTdGVuY2lsT3B8SW5jcmVtZW50V3JhcFN0ZW5jaWxPcHxEZWNyZW1lbnRXcmFwU3RlbmNpbE9wfEludmVydFN0ZW5jaWxPcH1cclxuXHRcdCAqIEBkZWZhdWx0IEtlZXBTdGVuY2lsT3BcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zdGVuY2lsRmFpbCA9IEtlZXBTdGVuY2lsT3A7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGljaCBzdGVuY2lsIG9wZXJhdGlvbiB0byBwZXJmb3JtIHdoZW4gdGhlIGNvbXBhcmlzb24gZnVuY3Rpb24gcmV0dXJuc1xyXG5cdFx0ICogYHRydWVgIGJ1dCB0aGUgZGVwdGggdGVzdCBmYWlscy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7WmVyb1N0ZW5jaWxPcHxLZWVwU3RlbmNpbE9wfFJlcGxhY2VTdGVuY2lsT3B8SW5jcmVtZW50U3RlbmNpbE9wfERlY3JlbWVudFN0ZW5jaWxPcHxJbmNyZW1lbnRXcmFwU3RlbmNpbE9wfERlY3JlbWVudFdyYXBTdGVuY2lsT3B8SW52ZXJ0U3RlbmNpbE9wfVxyXG5cdFx0ICogQGRlZmF1bHQgS2VlcFN0ZW5jaWxPcFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnN0ZW5jaWxaRmFpbCA9IEtlZXBTdGVuY2lsT3A7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGljaCBzdGVuY2lsIG9wZXJhdGlvbiB0byBwZXJmb3JtIHdoZW4gdGhlIGNvbXBhcmlzb24gZnVuY3Rpb24gcmV0dXJuc1xyXG5cdFx0ICogYHRydWVgIGFuZCB0aGUgZGVwdGggdGVzdCBwYXNzZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1plcm9TdGVuY2lsT3B8S2VlcFN0ZW5jaWxPcHxSZXBsYWNlU3RlbmNpbE9wfEluY3JlbWVudFN0ZW5jaWxPcHxEZWNyZW1lbnRTdGVuY2lsT3B8SW5jcmVtZW50V3JhcFN0ZW5jaWxPcHxEZWNyZW1lbnRXcmFwU3RlbmNpbE9wfEludmVydFN0ZW5jaWxPcH1cclxuXHRcdCAqIEBkZWZhdWx0IEtlZXBTdGVuY2lsT3BcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zdGVuY2lsWlBhc3MgPSBLZWVwU3RlbmNpbE9wO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciBzdGVuY2lsIG9wZXJhdGlvbnMgYXJlIHBlcmZvcm1lZCBhZ2FpbnN0IHRoZSBzdGVuY2lsIGJ1ZmZlci4gSW5cclxuXHRcdCAqIG9yZGVyIHRvIHBlcmZvcm0gd3JpdGVzIG9yIGNvbXBhcmlzb25zIGFnYWluc3QgdGhlIHN0ZW5jaWwgYnVmZmVyIHRoaXNcclxuXHRcdCAqIHZhbHVlIG11c3QgYmUgYHRydWVgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zdGVuY2lsV3JpdGUgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFVzZXItZGVmaW5lZCBjbGlwcGluZyBwbGFuZXMgc3BlY2lmaWVkIGFzIFRIUkVFLlBsYW5lIG9iamVjdHMgaW4gd29ybGRcclxuXHRcdCAqIHNwYWNlLiBUaGVzZSBwbGFuZXMgYXBwbHkgdG8gdGhlIG9iamVjdHMgdGhpcyBtYXRlcmlhbCBpcyBhdHRhY2hlZCB0by5cclxuXHRcdCAqIFBvaW50cyBpbiBzcGFjZSB3aG9zZSBzaWduZWQgZGlzdGFuY2UgdG8gdGhlIHBsYW5lIGlzIG5lZ2F0aXZlIGFyZSBjbGlwcGVkXHJcblx0XHQgKiAobm90IHJlbmRlcmVkKS4gVGhpcyByZXF1aXJlcyB7QGxpbmsgV2ViR0xSZW5kZXJlciNsb2NhbENsaXBwaW5nRW5hYmxlZH0gdG9cclxuXHRcdCAqIGJlIGB0cnVlYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P0FycmF5PFBsYW5lPn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jbGlwcGluZ1BsYW5lcyA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDaGFuZ2VzIHRoZSBiZWhhdmlvciBvZiBjbGlwcGluZyBwbGFuZXMgc28gdGhhdCBvbmx5IHRoZWlyIGludGVyc2VjdGlvbiBpc1xyXG5cdFx0ICogY2xpcHBlZCwgcmF0aGVyIHRoYW4gdGhlaXIgdW5pb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNsaXBJbnRlcnNlY3Rpb24gPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgd2hldGhlciB0byBjbGlwIHNoYWRvd3MgYWNjb3JkaW5nIHRvIHRoZSBjbGlwcGluZyBwbGFuZXMgc3BlY2lmaWVkXHJcblx0XHQgKiBvbiB0aGlzIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jbGlwU2hhZG93cyA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyB3aGljaCBzaWRlIG9mIGZhY2VzIGNhc3Qgc2hhZG93cy4gSWYgYG51bGxgLCB0aGUgc2lkZSBjYXN0aW5nIHNoYWRvd3NcclxuXHRcdCAqIGlzIGRldGVybWluZWQgYXMgZm9sbG93czpcclxuXHRcdCAqXHJcblx0XHQgKiAtIFdoZW4ge0BsaW5rIE1hdGVyaWFsI3NpZGV9IGlzIHNldCB0byBgRnJvbnRTaWRlYCwgdGhlIGJhY2sgc2lkZSBjYXN0IHNoYWRvd3MuXHJcblx0XHQgKiAtIFdoZW4ge0BsaW5rIE1hdGVyaWFsI3NpZGV9IGlzIHNldCB0byBgQmFja1NpZGVgLCB0aGUgZnJvbnQgc2lkZSBjYXN0IHNoYWRvd3MuXHJcblx0XHQgKiAtIFdoZW4ge0BsaW5rIE1hdGVyaWFsI3NpZGV9IGlzIHNldCB0byBgRG91YmxlU2lkZWAsIGJvdGggc2lkZXMgY2FzdCBzaGFkb3dzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/KEZyb250U2lkZXxCYWNrU2lkZXxEb3VibGVTaWRlKX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zaGFkb3dTaWRlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdG8gcmVuZGVyIHRoZSBtYXRlcmlhbCdzIGNvbG9yLlxyXG5cdFx0ICpcclxuXHRcdCAqIFRoaXMgY2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB7QGxpbmsgT2JqZWN0M0QjcmVuZGVyT2Rlcn0gdG8gY3JlYXRlIGludmlzaWJsZVxyXG5cdFx0ICogb2JqZWN0cyB0aGF0IG9jY2x1ZGUgb3RoZXIgb2JqZWN0cy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb2xvcldyaXRlID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIE92ZXJyaWRlIHRoZSByZW5kZXJlcidzIGRlZmF1bHQgcHJlY2lzaW9uIGZvciB0aGlzIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/KCdoaWdocCd8J21lZGl1bXAnfCdsb3dwJyl9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucHJlY2lzaW9uID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdG8gdXNlIHBvbHlnb24gb2Zmc2V0IG9yIG5vdC4gV2hlbiBlbmFibGVkLCBlYWNoIGZyYWdtZW50J3MgZGVwdGggdmFsdWUgd2lsbFxyXG5cdFx0ICogYmUgb2Zmc2V0IGFmdGVyIGl0IGlzIGludGVycG9sYXRlZCBmcm9tIHRoZSBkZXB0aCB2YWx1ZXMgb2YgdGhlIGFwcHJvcHJpYXRlIHZlcnRpY2VzLlxyXG5cdFx0ICogVGhlIG9mZnNldCBpcyBhZGRlZCBiZWZvcmUgdGhlIGRlcHRoIHRlc3QgaXMgcGVyZm9ybWVkIGFuZCBiZWZvcmUgdGhlIHZhbHVlIGlzIHdyaXR0ZW5cclxuXHRcdCAqIGludG8gdGhlIGRlcHRoIGJ1ZmZlci5cclxuXHRcdCAqXHJcblx0XHQgKiBDYW4gYmUgdXNlZnVsIGZvciByZW5kZXJpbmcgaGlkZGVuLWxpbmUgaW1hZ2VzLCBmb3IgYXBwbHlpbmcgZGVjYWxzIHRvIHN1cmZhY2VzLCBhbmQgZm9yXHJcblx0XHQgKiByZW5kZXJpbmcgc29saWRzIHdpdGggaGlnaGxpZ2h0ZWQgZWRnZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBvbHlnb25PZmZzZXQgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNwZWNpZmllcyBhIHNjYWxlIGZhY3RvciB0aGF0IGlzIHVzZWQgdG8gY3JlYXRlIGEgdmFyaWFibGUgZGVwdGggb2Zmc2V0IGZvciBlYWNoIHBvbHlnb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIElzIG11bHRpcGxpZWQgYnkgYW4gaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgdmFsdWUgdG8gY3JlYXRlIGEgY29uc3RhbnQgZGVwdGggb2Zmc2V0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucG9seWdvbk9mZnNldFVuaXRzID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdG8gYXBwbHkgZGl0aGVyaW5nIHRvIHRoZSBjb2xvciB0byByZW1vdmUgdGhlIGFwcGVhcmFuY2Ugb2YgYmFuZGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGl0aGVyaW5nID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIGFscGhhIHRvIGNvdmVyYWdlIHNob3VsZCBiZSBlbmFibGVkIG9yIG5vdC4gQ2FuIG9ubHkgYmUgdXNlZCB3aXRoIE1TQUEtZW5hYmxlZCBjb250ZXh0c1xyXG5cdFx0ICogKG1lYW5pbmcgd2hlbiB0aGUgcmVuZGVyZXIgd2FzIGNyZWF0ZWQgd2l0aCAqYW50aWFsaWFzKiBwYXJhbWV0ZXIgc2V0IHRvIGB0cnVlYCkuIEVuYWJsaW5nIHRoaXNcclxuXHRcdCAqIHdpbGwgc21vb3RoIGFsaWFzaW5nIG9uIGNsaXAgcGxhbmUgZWRnZXMgYW5kIGFscGhhVGVzdC1jbGlwcGVkIGVkZ2VzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hbHBoYVRvQ292ZXJhZ2UgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdG8gcHJlbXVsdGlwbHkgdGhlIGFscGhhICh0cmFuc3BhcmVuY3kpIHZhbHVlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wcmVtdWx0aXBsaWVkQWxwaGEgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgZG91YmxlLXNpZGVkLCB0cmFuc3BhcmVudCBvYmplY3RzIHNob3VsZCBiZSByZW5kZXJlZCB3aXRoIGEgc2luZ2xlIHBhc3Mgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIFRoZSBlbmdpbmUgcmVuZGVycyBkb3VibGUtc2lkZWQsIHRyYW5zcGFyZW50IG9iamVjdHMgd2l0aCB0d28gZHJhdyBjYWxscyAoYmFjayBmYWNlcyBmaXJzdCxcclxuXHRcdCAqIHRoZW4gZnJvbnQgZmFjZXMpIHRvIG1pdGlnYXRlIHRyYW5zcGFyZW5jeSBhcnRpZmFjdHMuIFRoZXJlIGFyZSBzY2VuYXJpb3MgaG93ZXZlciB3aGVyZSB0aGlzXHJcblx0XHQgKiBhcHByb2FjaCBwcm9kdWNlcyBubyBxdWFsaXR5IGdhaW5zIGJ1dCBzdGlsbCBkb3VibGVzIGRyYXcgY2FsbHMgZS5nLiB3aGVuIHJlbmRlcmluZyBmbGF0XHJcblx0XHQgKiB2ZWdldGF0aW9uIGxpa2UgZ3Jhc3Mgc3ByaXRlcy4gSW4gdGhlc2UgY2FzZXMsIHNldCB0aGUgYGZvcmNlU2luZ2xlUGFzc2AgZmxhZyB0byBgdHJ1ZWAgdG9cclxuXHRcdCAqIGRpc2FibGUgdGhlIHR3byBwYXNzIHJlbmRlcmluZyB0byBhdm9pZCBwZXJmb3JtYW5jZSBpc3N1ZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZvcmNlU2luZ2xlUGFzcyA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciBpdCdzIHBvc3NpYmxlIHRvIG92ZXJyaWRlIHRoZSBtYXRlcmlhbCB3aXRoIHtAbGluayBTY2VuZSNvdmVycmlkZU1hdGVyaWFsfSBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYWxsb3dPdmVycmlkZSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIHdoZXRoZXIgM0Qgb2JqZWN0cyB1c2luZyB0aGlzIG1hdGVyaWFsIGFyZSB2aXNpYmxlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnZpc2libGUgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyB3aGV0aGVyIHRoaXMgbWF0ZXJpYWwgaXMgdG9uZSBtYXBwZWQgYWNjb3JkaW5nIHRvIHRoZSByZW5kZXJlcidzIHRvbmUgbWFwcGluZyBzZXR0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEl0IGlzIGlnbm9yZWQgd2hlbiByZW5kZXJpbmcgdG8gYSByZW5kZXIgdGFyZ2V0IG9yIHVzaW5nIHBvc3QgcHJvY2Vzc2luZyBvciB3aGVuIHVzaW5nXHJcblx0XHQgKiBgV2ViR1BVUmVuZGVyZXJgLiBJbiBhbGwgdGhlc2UgY2FzZXMsIGFsbCBtYXRlcmlhbHMgYXJlIGhvbm9yZWQgYnkgdG9uZSBtYXBwaW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRvbmVNYXBwZWQgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQW4gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gc3RvcmUgY3VzdG9tIGRhdGEgYWJvdXQgdGhlIE1hdGVyaWFsLiBJdFxyXG5cdFx0ICogc2hvdWxkIG5vdCBob2xkIHJlZmVyZW5jZXMgdG8gZnVuY3Rpb25zIGFzIHRoZXNlIHdpbGwgbm90IGJlIGNsb25lZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVzZXJEYXRhID0ge307XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIHN0YXJ0cyBhdCBgMGAgYW5kIGNvdW50cyBob3cgbWFueSB0aW1lcyB7QGxpbmsgTWF0ZXJpYWwjbmVlZHNVcGRhdGV9IGlzIHNldCB0byBgdHJ1ZWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnZlcnNpb24gPSAwO1xyXG5cclxuXHRcdHRoaXMuX2FscGhhVGVzdCA9IDA7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgYWxwaGEgdmFsdWUgdG8gYmUgdXNlZCB3aGVuIHJ1bm5pbmcgYW4gYWxwaGEgdGVzdC4gVGhlIG1hdGVyaWFsXHJcblx0ICogd2lsbCBub3QgYmUgcmVuZGVyZWQgaWYgdGhlIG9wYWNpdHkgaXMgbG93ZXIgdGhhbiB0aGlzIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge251bWJlcn1cclxuXHQgKiBAcmVhZG9ubHlcclxuXHQgKiBAZGVmYXVsdCAwXHJcblx0ICovXHJcblx0Z2V0IGFscGhhVGVzdCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fYWxwaGFUZXN0O1xyXG5cclxuXHR9XHJcblxyXG5cdHNldCBhbHBoYVRlc3QoIHZhbHVlICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5fYWxwaGFUZXN0ID4gMCAhPT0gdmFsdWUgPiAwICkge1xyXG5cclxuXHRcdFx0dGhpcy52ZXJzaW9uICsrO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLl9hbHBoYVRlc3QgPSB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBbiBvcHRpb25hbCBjYWxsYmFjayB0aGF0IGlzIGV4ZWN1dGVkIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgbWF0ZXJpYWwgaXMgdXNlZCB0byByZW5kZXIgYSAzRCBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBUaGlzIG1ldGhvZCBjYW4gb25seSBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIHdpdGgge0BsaW5rIFdlYkdMUmVuZGVyZXJ9LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcGFyYW0ge1NjZW5lfSBzY2VuZSAtIFRoZSBzY2VuZS5cclxuXHQgKiBAcGFyYW0ge0NhbWVyYX0gY2FtZXJhIC0gVGhlIGNhbWVyYSB0aGF0IGlzIHVzZWQgdG8gcmVuZGVyIHRoZSBzY2VuZS5cclxuXHQgKiBAcGFyYW0ge0J1ZmZlckdlb21ldHJ5fSBnZW9tZXRyeSAtIFRoZSAzRCBvYmplY3QncyBnZW9tZXRyeS5cclxuXHQgKiBAcGFyYW0ge09iamVjdDNEfSBvYmplY3QgLSBUaGUgM0Qgb2JqZWN0LlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBncm91cCAtIFRoZSBnZW9tZXRyeSBncm91cCBkYXRhLlxyXG5cdCAqL1xyXG5cdG9uQmVmb3JlUmVuZGVyKCAvKiByZW5kZXJlciwgc2NlbmUsIGNhbWVyYSwgZ2VvbWV0cnksIG9iamVjdCwgZ3JvdXAgKi8gKSB7fVxyXG5cclxuXHQvKipcclxuXHQgKiBBbiBvcHRpb25hbCBjYWxsYmFjayB0aGF0IGlzIGV4ZWN1dGVkIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgc2hhZGVyXHJcblx0ICogcHJvZ3JhbSBpcyBjb21waWxlZC4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCB0aGUgc2hhZGVyIHNvdXJjZSBjb2RlXHJcblx0ICogYXMgYSBwYXJhbWV0ZXIuIFVzZWZ1bCBmb3IgdGhlIG1vZGlmaWNhdGlvbiBvZiBidWlsdC1pbiBtYXRlcmlhbHMuXHJcblx0ICpcclxuXHQgKiBUaGlzIG1ldGhvZCBjYW4gb25seSBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIHdpdGgge0BsaW5rIFdlYkdMUmVuZGVyZXJ9LiBUaGVcclxuXHQgKiByZWNvbW1lbmRlZCBhcHByb2FjaCB3aGVuIGN1c3RvbWl6aW5nIG1hdGVyaWFscyBpcyB0byB1c2UgYFdlYkdQVVJlbmRlcmVyYCB3aXRoIHRoZSBuZXdcclxuXHQgKiBOb2RlIE1hdGVyaWFsIHN5c3RlbSBhbmQgW1RTTF17QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL21yZG9vYi90aHJlZS5qcy93aWtpL1RocmVlLmpzLVNoYWRpbmctTGFuZ3VhZ2V9LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHt7dmVydGV4U2hhZGVyOnN0cmluZyxmcmFnbWVudFNoYWRlcjpzdHJpbmcsdW5pZm9ybXM6T2JqZWN0fX0gc2hhZGVyb2JqZWN0IC0gVGhlIG9iamVjdCBob2xkcyB0aGUgdW5pZm9ybXMgYW5kIHRoZSB2ZXJ0ZXggYW5kIGZyYWdtZW50IHNoYWRlciBzb3VyY2UuXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIEEgcmVmZXJlbmNlIHRvIHRoZSByZW5kZXJlci5cclxuXHQgKi9cclxuXHRvbkJlZm9yZUNvbXBpbGUoIC8qIHNoYWRlcm9iamVjdCwgcmVuZGVyZXIgKi8gKSB7fVxyXG5cclxuXHQvKipcclxuXHQgKiBJbiBjYXNlIHtAbGluayBNYXRlcmlhbCNvbkJlZm9yZUNvbXBpbGV9IGlzIHVzZWQsIHRoaXMgY2FsbGJhY2sgY2FuIGJlIHVzZWQgdG8gaWRlbnRpZnlcclxuXHQgKiB2YWx1ZXMgb2Ygc2V0dGluZ3MgdXNlZCBpbiBgb25CZWZvcmVDb21waWxlKClgLCBzbyB0aHJlZS5qcyBjYW4gcmV1c2UgYSBjYWNoZWRcclxuXHQgKiBzaGFkZXIgb3IgcmVjb21waWxlIHRoZSBzaGFkZXIgZm9yIHRoaXMgbWF0ZXJpYWwgYXMgbmVlZGVkLlxyXG5cdCAqXHJcblx0ICogVGhpcyBtZXRob2QgY2FuIG9ubHkgYmUgdXNlZCB3aGVuIHJlbmRlcmluZyB3aXRoIHtAbGluayBXZWJHTFJlbmRlcmVyfS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGN1c3RvbSBwcm9ncmFtIGNhY2hlIGtleS5cclxuXHQgKi9cclxuXHRjdXN0b21Qcm9ncmFtQ2FjaGVLZXkoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMub25CZWZvcmVDb21waWxlLnRvU3RyaW5nKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gc2V0IGRlZmF1bHQgdmFsdWVzIGZyb20gcGFyYW1ldGVyIG9iamVjdHMuXHJcblx0ICogSXQgaXMgYSBnZW5lcmljIGltcGxlbWVudGF0aW9uIHNvIGl0IGNhbiBiZSB1c2VkIHdpdGggZGlmZmVyZW50IHR5cGVzXHJcblx0ICogb2YgbWF0ZXJpYWxzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFt2YWx1ZXNdIC0gVGhlIG1hdGVyaWFsIHZhbHVlcyB0byBzZXQuXHJcblx0ICovXHJcblx0c2V0VmFsdWVzKCB2YWx1ZXMgKSB7XHJcblxyXG5cdFx0aWYgKCB2YWx1ZXMgPT09IHVuZGVmaW5lZCApIHJldHVybjtcclxuXHJcblx0XHRmb3IgKCBjb25zdCBrZXkgaW4gdmFsdWVzICkge1xyXG5cclxuXHRcdFx0Y29uc3QgbmV3VmFsdWUgPSB2YWx1ZXNbIGtleSBdO1xyXG5cclxuXHRcdFx0aWYgKCBuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRjb25zb2xlLndhcm4oIGBUSFJFRS5NYXRlcmlhbDogcGFyYW1ldGVyICckeyBrZXkgfScgaGFzIHZhbHVlIG9mIHVuZGVmaW5lZC5gICk7XHJcblx0XHRcdFx0Y29udGludWU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzWyBrZXkgXTtcclxuXHJcblx0XHRcdGlmICggY3VycmVudFZhbHVlID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnNvbGUud2FybiggYFRIUkVFLk1hdGVyaWFsOiAnJHsga2V5IH0nIGlzIG5vdCBhIHByb3BlcnR5IG9mIFRIUkVFLiR7IHRoaXMudHlwZSB9LmAgKTtcclxuXHRcdFx0XHRjb250aW51ZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggY3VycmVudFZhbHVlICYmIGN1cnJlbnRWYWx1ZS5pc0NvbG9yICkge1xyXG5cclxuXHRcdFx0XHRjdXJyZW50VmFsdWUuc2V0KCBuZXdWYWx1ZSApO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggKCBjdXJyZW50VmFsdWUgJiYgY3VycmVudFZhbHVlLmlzVmVjdG9yMyApICYmICggbmV3VmFsdWUgJiYgbmV3VmFsdWUuaXNWZWN0b3IzICkgKSB7XHJcblxyXG5cdFx0XHRcdGN1cnJlbnRWYWx1ZS5jb3B5KCBuZXdWYWx1ZSApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0dGhpc1sga2V5IF0gPSBuZXdWYWx1ZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2VyaWFsaXplcyB0aGUgbWF0ZXJpYWwgaW50byBKU09OLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHs/KE9iamVjdHxzdHJpbmcpfSBtZXRhIC0gQW4gb3B0aW9uYWwgdmFsdWUgaG9sZGluZyBtZXRhIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZXJpYWxpemF0aW9uLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdH0gQSBKU09OIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNlcmlhbGl6ZWQgbWF0ZXJpYWwuXHJcblx0ICogQHNlZSB7QGxpbmsgT2JqZWN0TG9hZGVyI3BhcnNlfVxyXG5cdCAqL1xyXG5cdHRvSlNPTiggbWV0YSApIHtcclxuXHJcblx0XHRjb25zdCBpc1Jvb3RPYmplY3QgPSAoIG1ldGEgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgbWV0YSA9PT0gJ3N0cmluZycgKTtcclxuXHJcblx0XHRpZiAoIGlzUm9vdE9iamVjdCApIHtcclxuXHJcblx0XHRcdG1ldGEgPSB7XHJcblx0XHRcdFx0dGV4dHVyZXM6IHt9LFxyXG5cdFx0XHRcdGltYWdlczoge31cclxuXHRcdFx0fTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IHtcclxuXHRcdFx0bWV0YWRhdGE6IHtcclxuXHRcdFx0XHR2ZXJzaW9uOiA0LjYsXHJcblx0XHRcdFx0dHlwZTogJ01hdGVyaWFsJyxcclxuXHRcdFx0XHRnZW5lcmF0b3I6ICdNYXRlcmlhbC50b0pTT04nXHJcblx0XHRcdH1cclxuXHRcdH07XHJcblxyXG5cdFx0Ly8gc3RhbmRhcmQgTWF0ZXJpYWwgc2VyaWFsaXphdGlvblxyXG5cdFx0ZGF0YS51dWlkID0gdGhpcy51dWlkO1xyXG5cdFx0ZGF0YS50eXBlID0gdGhpcy50eXBlO1xyXG5cclxuXHRcdGlmICggdGhpcy5uYW1lICE9PSAnJyApIGRhdGEubmFtZSA9IHRoaXMubmFtZTtcclxuXHJcblx0XHRpZiAoIHRoaXMuY29sb3IgJiYgdGhpcy5jb2xvci5pc0NvbG9yICkgZGF0YS5jb2xvciA9IHRoaXMuY29sb3IuZ2V0SGV4KCk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLnJvdWdobmVzcyAhPT0gdW5kZWZpbmVkICkgZGF0YS5yb3VnaG5lc3MgPSB0aGlzLnJvdWdobmVzcztcclxuXHRcdGlmICggdGhpcy5tZXRhbG5lc3MgIT09IHVuZGVmaW5lZCApIGRhdGEubWV0YWxuZXNzID0gdGhpcy5tZXRhbG5lc3M7XHJcblxyXG5cdFx0aWYgKCB0aGlzLnNoZWVuICE9PSB1bmRlZmluZWQgKSBkYXRhLnNoZWVuID0gdGhpcy5zaGVlbjtcclxuXHRcdGlmICggdGhpcy5zaGVlbkNvbG9yICYmIHRoaXMuc2hlZW5Db2xvci5pc0NvbG9yICkgZGF0YS5zaGVlbkNvbG9yID0gdGhpcy5zaGVlbkNvbG9yLmdldEhleCgpO1xyXG5cdFx0aWYgKCB0aGlzLnNoZWVuUm91Z2huZXNzICE9PSB1bmRlZmluZWQgKSBkYXRhLnNoZWVuUm91Z2huZXNzID0gdGhpcy5zaGVlblJvdWdobmVzcztcclxuXHRcdGlmICggdGhpcy5lbWlzc2l2ZSAmJiB0aGlzLmVtaXNzaXZlLmlzQ29sb3IgKSBkYXRhLmVtaXNzaXZlID0gdGhpcy5lbWlzc2l2ZS5nZXRIZXgoKTtcclxuXHRcdGlmICggdGhpcy5lbWlzc2l2ZUludGVuc2l0eSAhPT0gdW5kZWZpbmVkICYmIHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgIT09IDEgKSBkYXRhLmVtaXNzaXZlSW50ZW5zaXR5ID0gdGhpcy5lbWlzc2l2ZUludGVuc2l0eTtcclxuXHJcblx0XHRpZiAoIHRoaXMuc3BlY3VsYXIgJiYgdGhpcy5zcGVjdWxhci5pc0NvbG9yICkgZGF0YS5zcGVjdWxhciA9IHRoaXMuc3BlY3VsYXIuZ2V0SGV4KCk7XHJcblx0XHRpZiAoIHRoaXMuc3BlY3VsYXJJbnRlbnNpdHkgIT09IHVuZGVmaW5lZCApIGRhdGEuc3BlY3VsYXJJbnRlbnNpdHkgPSB0aGlzLnNwZWN1bGFySW50ZW5zaXR5O1xyXG5cdFx0aWYgKCB0aGlzLnNwZWN1bGFyQ29sb3IgJiYgdGhpcy5zcGVjdWxhckNvbG9yLmlzQ29sb3IgKSBkYXRhLnNwZWN1bGFyQ29sb3IgPSB0aGlzLnNwZWN1bGFyQ29sb3IuZ2V0SGV4KCk7XHJcblx0XHRpZiAoIHRoaXMuc2hpbmluZXNzICE9PSB1bmRlZmluZWQgKSBkYXRhLnNoaW5pbmVzcyA9IHRoaXMuc2hpbmluZXNzO1xyXG5cdFx0aWYgKCB0aGlzLmNsZWFyY29hdCAhPT0gdW5kZWZpbmVkICkgZGF0YS5jbGVhcmNvYXQgPSB0aGlzLmNsZWFyY29hdDtcclxuXHRcdGlmICggdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3MgIT09IHVuZGVmaW5lZCApIGRhdGEuY2xlYXJjb2F0Um91Z2huZXNzID0gdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3M7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmNsZWFyY29hdE1hcCAmJiB0aGlzLmNsZWFyY29hdE1hcC5pc1RleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRkYXRhLmNsZWFyY29hdE1hcCA9IHRoaXMuY2xlYXJjb2F0TWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3NNYXAgJiYgdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3NNYXAuaXNUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0ZGF0YS5jbGVhcmNvYXRSb3VnaG5lc3NNYXAgPSB0aGlzLmNsZWFyY29hdFJvdWdobmVzc01hcC50b0pTT04oIG1ldGEgKS51dWlkO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMuY2xlYXJjb2F0Tm9ybWFsTWFwICYmIHRoaXMuY2xlYXJjb2F0Tm9ybWFsTWFwLmlzVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdGRhdGEuY2xlYXJjb2F0Tm9ybWFsTWFwID0gdGhpcy5jbGVhcmNvYXROb3JtYWxNYXAudG9KU09OKCBtZXRhICkudXVpZDtcclxuXHRcdFx0ZGF0YS5jbGVhcmNvYXROb3JtYWxTY2FsZSA9IHRoaXMuY2xlYXJjb2F0Tm9ybWFsU2NhbGUudG9BcnJheSgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMuZGlzcGVyc2lvbiAhPT0gdW5kZWZpbmVkICkgZGF0YS5kaXNwZXJzaW9uID0gdGhpcy5kaXNwZXJzaW9uO1xyXG5cclxuXHRcdGlmICggdGhpcy5pcmlkZXNjZW5jZSAhPT0gdW5kZWZpbmVkICkgZGF0YS5pcmlkZXNjZW5jZSA9IHRoaXMuaXJpZGVzY2VuY2U7XHJcblx0XHRpZiAoIHRoaXMuaXJpZGVzY2VuY2VJT1IgIT09IHVuZGVmaW5lZCApIGRhdGEuaXJpZGVzY2VuY2VJT1IgPSB0aGlzLmlyaWRlc2NlbmNlSU9SO1xyXG5cdFx0aWYgKCB0aGlzLmlyaWRlc2NlbmNlVGhpY2tuZXNzUmFuZ2UgIT09IHVuZGVmaW5lZCApIGRhdGEuaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZSA9IHRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZTtcclxuXHJcblx0XHRpZiAoIHRoaXMuaXJpZGVzY2VuY2VNYXAgJiYgdGhpcy5pcmlkZXNjZW5jZU1hcC5pc1RleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRkYXRhLmlyaWRlc2NlbmNlTWFwID0gdGhpcy5pcmlkZXNjZW5jZU1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAgJiYgdGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcC5pc1RleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRkYXRhLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwID0gdGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcC50b0pTT04oIG1ldGEgKS51dWlkO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMuYW5pc290cm9weSAhPT0gdW5kZWZpbmVkICkgZGF0YS5hbmlzb3Ryb3B5ID0gdGhpcy5hbmlzb3Ryb3B5O1xyXG5cdFx0aWYgKCB0aGlzLmFuaXNvdHJvcHlSb3RhdGlvbiAhPT0gdW5kZWZpbmVkICkgZGF0YS5hbmlzb3Ryb3B5Um90YXRpb24gPSB0aGlzLmFuaXNvdHJvcHlSb3RhdGlvbjtcclxuXHJcblx0XHRpZiAoIHRoaXMuYW5pc290cm9weU1hcCAmJiB0aGlzLmFuaXNvdHJvcHlNYXAuaXNUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0ZGF0YS5hbmlzb3Ryb3B5TWFwID0gdGhpcy5hbmlzb3Ryb3B5TWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy5tYXAgJiYgdGhpcy5tYXAuaXNUZXh0dXJlICkgZGF0YS5tYXAgPSB0aGlzLm1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xyXG5cdFx0aWYgKCB0aGlzLm1hdGNhcCAmJiB0aGlzLm1hdGNhcC5pc1RleHR1cmUgKSBkYXRhLm1hdGNhcCA9IHRoaXMubWF0Y2FwLnRvSlNPTiggbWV0YSApLnV1aWQ7XHJcblx0XHRpZiAoIHRoaXMuYWxwaGFNYXAgJiYgdGhpcy5hbHBoYU1hcC5pc1RleHR1cmUgKSBkYXRhLmFscGhhTWFwID0gdGhpcy5hbHBoYU1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xyXG5cclxuXHRcdGlmICggdGhpcy5saWdodE1hcCAmJiB0aGlzLmxpZ2h0TWFwLmlzVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdGRhdGEubGlnaHRNYXAgPSB0aGlzLmxpZ2h0TWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XHJcblx0XHRcdGRhdGEubGlnaHRNYXBJbnRlbnNpdHkgPSB0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMuYW9NYXAgJiYgdGhpcy5hb01hcC5pc1RleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRkYXRhLmFvTWFwID0gdGhpcy5hb01hcC50b0pTT04oIG1ldGEgKS51dWlkO1xyXG5cdFx0XHRkYXRhLmFvTWFwSW50ZW5zaXR5ID0gdGhpcy5hb01hcEludGVuc2l0eTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aGlzLmJ1bXBNYXAgJiYgdGhpcy5idW1wTWFwLmlzVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdGRhdGEuYnVtcE1hcCA9IHRoaXMuYnVtcE1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xyXG5cdFx0XHRkYXRhLmJ1bXBTY2FsZSA9IHRoaXMuYnVtcFNjYWxlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMubm9ybWFsTWFwICYmIHRoaXMubm9ybWFsTWFwLmlzVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdGRhdGEubm9ybWFsTWFwID0gdGhpcy5ub3JtYWxNYXAudG9KU09OKCBtZXRhICkudXVpZDtcclxuXHRcdFx0ZGF0YS5ub3JtYWxNYXBUeXBlID0gdGhpcy5ub3JtYWxNYXBUeXBlO1xyXG5cdFx0XHRkYXRhLm5vcm1hbFNjYWxlID0gdGhpcy5ub3JtYWxTY2FsZS50b0FycmF5KCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy5kaXNwbGFjZW1lbnRNYXAgJiYgdGhpcy5kaXNwbGFjZW1lbnRNYXAuaXNUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0ZGF0YS5kaXNwbGFjZW1lbnRNYXAgPSB0aGlzLmRpc3BsYWNlbWVudE1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xyXG5cdFx0XHRkYXRhLmRpc3BsYWNlbWVudFNjYWxlID0gdGhpcy5kaXNwbGFjZW1lbnRTY2FsZTtcclxuXHRcdFx0ZGF0YS5kaXNwbGFjZW1lbnRCaWFzID0gdGhpcy5kaXNwbGFjZW1lbnRCaWFzO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMucm91Z2huZXNzTWFwICYmIHRoaXMucm91Z2huZXNzTWFwLmlzVGV4dHVyZSApIGRhdGEucm91Z2huZXNzTWFwID0gdGhpcy5yb3VnaG5lc3NNYXAudG9KU09OKCBtZXRhICkudXVpZDtcclxuXHRcdGlmICggdGhpcy5tZXRhbG5lc3NNYXAgJiYgdGhpcy5tZXRhbG5lc3NNYXAuaXNUZXh0dXJlICkgZGF0YS5tZXRhbG5lc3NNYXAgPSB0aGlzLm1ldGFsbmVzc01hcC50b0pTT04oIG1ldGEgKS51dWlkO1xyXG5cclxuXHRcdGlmICggdGhpcy5lbWlzc2l2ZU1hcCAmJiB0aGlzLmVtaXNzaXZlTWFwLmlzVGV4dHVyZSApIGRhdGEuZW1pc3NpdmVNYXAgPSB0aGlzLmVtaXNzaXZlTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XHJcblx0XHRpZiAoIHRoaXMuc3BlY3VsYXJNYXAgJiYgdGhpcy5zcGVjdWxhck1hcC5pc1RleHR1cmUgKSBkYXRhLnNwZWN1bGFyTWFwID0gdGhpcy5zcGVjdWxhck1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xyXG5cdFx0aWYgKCB0aGlzLnNwZWN1bGFySW50ZW5zaXR5TWFwICYmIHRoaXMuc3BlY3VsYXJJbnRlbnNpdHlNYXAuaXNUZXh0dXJlICkgZGF0YS5zcGVjdWxhckludGVuc2l0eU1hcCA9IHRoaXMuc3BlY3VsYXJJbnRlbnNpdHlNYXAudG9KU09OKCBtZXRhICkudXVpZDtcclxuXHRcdGlmICggdGhpcy5zcGVjdWxhckNvbG9yTWFwICYmIHRoaXMuc3BlY3VsYXJDb2xvck1hcC5pc1RleHR1cmUgKSBkYXRhLnNwZWN1bGFyQ29sb3JNYXAgPSB0aGlzLnNwZWN1bGFyQ29sb3JNYXAudG9KU09OKCBtZXRhICkudXVpZDtcclxuXHJcblx0XHRpZiAoIHRoaXMuZW52TWFwICYmIHRoaXMuZW52TWFwLmlzVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdGRhdGEuZW52TWFwID0gdGhpcy5lbnZNYXAudG9KU09OKCBtZXRhICkudXVpZDtcclxuXHJcblx0XHRcdGlmICggdGhpcy5jb21iaW5lICE9PSB1bmRlZmluZWQgKSBkYXRhLmNvbWJpbmUgPSB0aGlzLmNvbWJpbmU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy5lbnZNYXBSb3RhdGlvbiAhPT0gdW5kZWZpbmVkICkgZGF0YS5lbnZNYXBSb3RhdGlvbiA9IHRoaXMuZW52TWFwUm90YXRpb24udG9BcnJheSgpO1xyXG5cdFx0aWYgKCB0aGlzLmVudk1hcEludGVuc2l0eSAhPT0gdW5kZWZpbmVkICkgZGF0YS5lbnZNYXBJbnRlbnNpdHkgPSB0aGlzLmVudk1hcEludGVuc2l0eTtcclxuXHRcdGlmICggdGhpcy5yZWZsZWN0aXZpdHkgIT09IHVuZGVmaW5lZCApIGRhdGEucmVmbGVjdGl2aXR5ID0gdGhpcy5yZWZsZWN0aXZpdHk7XHJcblx0XHRpZiAoIHRoaXMucmVmcmFjdGlvblJhdGlvICE9PSB1bmRlZmluZWQgKSBkYXRhLnJlZnJhY3Rpb25SYXRpbyA9IHRoaXMucmVmcmFjdGlvblJhdGlvO1xyXG5cclxuXHRcdGlmICggdGhpcy5ncmFkaWVudE1hcCAmJiB0aGlzLmdyYWRpZW50TWFwLmlzVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdGRhdGEuZ3JhZGllbnRNYXAgPSB0aGlzLmdyYWRpZW50TWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy50cmFuc21pc3Npb24gIT09IHVuZGVmaW5lZCApIGRhdGEudHJhbnNtaXNzaW9uID0gdGhpcy50cmFuc21pc3Npb247XHJcblx0XHRpZiAoIHRoaXMudHJhbnNtaXNzaW9uTWFwICYmIHRoaXMudHJhbnNtaXNzaW9uTWFwLmlzVGV4dHVyZSApIGRhdGEudHJhbnNtaXNzaW9uTWFwID0gdGhpcy50cmFuc21pc3Npb25NYXAudG9KU09OKCBtZXRhICkudXVpZDtcclxuXHRcdGlmICggdGhpcy50aGlja25lc3MgIT09IHVuZGVmaW5lZCApIGRhdGEudGhpY2tuZXNzID0gdGhpcy50aGlja25lc3M7XHJcblx0XHRpZiAoIHRoaXMudGhpY2tuZXNzTWFwICYmIHRoaXMudGhpY2tuZXNzTWFwLmlzVGV4dHVyZSApIGRhdGEudGhpY2tuZXNzTWFwID0gdGhpcy50aGlja25lc3NNYXAudG9KU09OKCBtZXRhICkudXVpZDtcclxuXHRcdGlmICggdGhpcy5hdHRlbnVhdGlvbkRpc3RhbmNlICE9PSB1bmRlZmluZWQgJiYgdGhpcy5hdHRlbnVhdGlvbkRpc3RhbmNlICE9PSBJbmZpbml0eSApIGRhdGEuYXR0ZW51YXRpb25EaXN0YW5jZSA9IHRoaXMuYXR0ZW51YXRpb25EaXN0YW5jZTtcclxuXHRcdGlmICggdGhpcy5hdHRlbnVhdGlvbkNvbG9yICE9PSB1bmRlZmluZWQgKSBkYXRhLmF0dGVudWF0aW9uQ29sb3IgPSB0aGlzLmF0dGVudWF0aW9uQ29sb3IuZ2V0SGV4KCk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLnNpemUgIT09IHVuZGVmaW5lZCApIGRhdGEuc2l6ZSA9IHRoaXMuc2l6ZTtcclxuXHRcdGlmICggdGhpcy5zaGFkb3dTaWRlICE9PSBudWxsICkgZGF0YS5zaGFkb3dTaWRlID0gdGhpcy5zaGFkb3dTaWRlO1xyXG5cdFx0aWYgKCB0aGlzLnNpemVBdHRlbnVhdGlvbiAhPT0gdW5kZWZpbmVkICkgZGF0YS5zaXplQXR0ZW51YXRpb24gPSB0aGlzLnNpemVBdHRlbnVhdGlvbjtcclxuXHJcblx0XHRpZiAoIHRoaXMuYmxlbmRpbmcgIT09IE5vcm1hbEJsZW5kaW5nICkgZGF0YS5ibGVuZGluZyA9IHRoaXMuYmxlbmRpbmc7XHJcblx0XHRpZiAoIHRoaXMuc2lkZSAhPT0gRnJvbnRTaWRlICkgZGF0YS5zaWRlID0gdGhpcy5zaWRlO1xyXG5cdFx0aWYgKCB0aGlzLnZlcnRleENvbG9ycyA9PT0gdHJ1ZSApIGRhdGEudmVydGV4Q29sb3JzID0gdHJ1ZTtcclxuXHJcblx0XHRpZiAoIHRoaXMub3BhY2l0eSA8IDEgKSBkYXRhLm9wYWNpdHkgPSB0aGlzLm9wYWNpdHk7XHJcblx0XHRpZiAoIHRoaXMudHJhbnNwYXJlbnQgPT09IHRydWUgKSBkYXRhLnRyYW5zcGFyZW50ID0gdHJ1ZTtcclxuXHJcblx0XHRpZiAoIHRoaXMuYmxlbmRTcmMgIT09IFNyY0FscGhhRmFjdG9yICkgZGF0YS5ibGVuZFNyYyA9IHRoaXMuYmxlbmRTcmM7XHJcblx0XHRpZiAoIHRoaXMuYmxlbmREc3QgIT09IE9uZU1pbnVzU3JjQWxwaGFGYWN0b3IgKSBkYXRhLmJsZW5kRHN0ID0gdGhpcy5ibGVuZERzdDtcclxuXHRcdGlmICggdGhpcy5ibGVuZEVxdWF0aW9uICE9PSBBZGRFcXVhdGlvbiApIGRhdGEuYmxlbmRFcXVhdGlvbiA9IHRoaXMuYmxlbmRFcXVhdGlvbjtcclxuXHRcdGlmICggdGhpcy5ibGVuZFNyY0FscGhhICE9PSBudWxsICkgZGF0YS5ibGVuZFNyY0FscGhhID0gdGhpcy5ibGVuZFNyY0FscGhhO1xyXG5cdFx0aWYgKCB0aGlzLmJsZW5kRHN0QWxwaGEgIT09IG51bGwgKSBkYXRhLmJsZW5kRHN0QWxwaGEgPSB0aGlzLmJsZW5kRHN0QWxwaGE7XHJcblx0XHRpZiAoIHRoaXMuYmxlbmRFcXVhdGlvbkFscGhhICE9PSBudWxsICkgZGF0YS5ibGVuZEVxdWF0aW9uQWxwaGEgPSB0aGlzLmJsZW5kRXF1YXRpb25BbHBoYTtcclxuXHRcdGlmICggdGhpcy5ibGVuZENvbG9yICYmIHRoaXMuYmxlbmRDb2xvci5pc0NvbG9yICkgZGF0YS5ibGVuZENvbG9yID0gdGhpcy5ibGVuZENvbG9yLmdldEhleCgpO1xyXG5cdFx0aWYgKCB0aGlzLmJsZW5kQWxwaGEgIT09IDAgKSBkYXRhLmJsZW5kQWxwaGEgPSB0aGlzLmJsZW5kQWxwaGE7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmRlcHRoRnVuYyAhPT0gTGVzc0VxdWFsRGVwdGggKSBkYXRhLmRlcHRoRnVuYyA9IHRoaXMuZGVwdGhGdW5jO1xyXG5cdFx0aWYgKCB0aGlzLmRlcHRoVGVzdCA9PT0gZmFsc2UgKSBkYXRhLmRlcHRoVGVzdCA9IHRoaXMuZGVwdGhUZXN0O1xyXG5cdFx0aWYgKCB0aGlzLmRlcHRoV3JpdGUgPT09IGZhbHNlICkgZGF0YS5kZXB0aFdyaXRlID0gdGhpcy5kZXB0aFdyaXRlO1xyXG5cdFx0aWYgKCB0aGlzLmNvbG9yV3JpdGUgPT09IGZhbHNlICkgZGF0YS5jb2xvcldyaXRlID0gdGhpcy5jb2xvcldyaXRlO1xyXG5cclxuXHRcdGlmICggdGhpcy5zdGVuY2lsV3JpdGVNYXNrICE9PSAweGZmICkgZGF0YS5zdGVuY2lsV3JpdGVNYXNrID0gdGhpcy5zdGVuY2lsV3JpdGVNYXNrO1xyXG5cdFx0aWYgKCB0aGlzLnN0ZW5jaWxGdW5jICE9PSBBbHdheXNTdGVuY2lsRnVuYyApIGRhdGEuc3RlbmNpbEZ1bmMgPSB0aGlzLnN0ZW5jaWxGdW5jO1xyXG5cdFx0aWYgKCB0aGlzLnN0ZW5jaWxSZWYgIT09IDAgKSBkYXRhLnN0ZW5jaWxSZWYgPSB0aGlzLnN0ZW5jaWxSZWY7XHJcblx0XHRpZiAoIHRoaXMuc3RlbmNpbEZ1bmNNYXNrICE9PSAweGZmICkgZGF0YS5zdGVuY2lsRnVuY01hc2sgPSB0aGlzLnN0ZW5jaWxGdW5jTWFzaztcclxuXHRcdGlmICggdGhpcy5zdGVuY2lsRmFpbCAhPT0gS2VlcFN0ZW5jaWxPcCApIGRhdGEuc3RlbmNpbEZhaWwgPSB0aGlzLnN0ZW5jaWxGYWlsO1xyXG5cdFx0aWYgKCB0aGlzLnN0ZW5jaWxaRmFpbCAhPT0gS2VlcFN0ZW5jaWxPcCApIGRhdGEuc3RlbmNpbFpGYWlsID0gdGhpcy5zdGVuY2lsWkZhaWw7XHJcblx0XHRpZiAoIHRoaXMuc3RlbmNpbFpQYXNzICE9PSBLZWVwU3RlbmNpbE9wICkgZGF0YS5zdGVuY2lsWlBhc3MgPSB0aGlzLnN0ZW5jaWxaUGFzcztcclxuXHRcdGlmICggdGhpcy5zdGVuY2lsV3JpdGUgPT09IHRydWUgKSBkYXRhLnN0ZW5jaWxXcml0ZSA9IHRoaXMuc3RlbmNpbFdyaXRlO1xyXG5cclxuXHRcdC8vIHJvdGF0aW9uIChTcHJpdGVNYXRlcmlhbClcclxuXHRcdGlmICggdGhpcy5yb3RhdGlvbiAhPT0gdW5kZWZpbmVkICYmIHRoaXMucm90YXRpb24gIT09IDAgKSBkYXRhLnJvdGF0aW9uID0gdGhpcy5yb3RhdGlvbjtcclxuXHJcblx0XHRpZiAoIHRoaXMucG9seWdvbk9mZnNldCA9PT0gdHJ1ZSApIGRhdGEucG9seWdvbk9mZnNldCA9IHRydWU7XHJcblx0XHRpZiAoIHRoaXMucG9seWdvbk9mZnNldEZhY3RvciAhPT0gMCApIGRhdGEucG9seWdvbk9mZnNldEZhY3RvciA9IHRoaXMucG9seWdvbk9mZnNldEZhY3RvcjtcclxuXHRcdGlmICggdGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHMgIT09IDAgKSBkYXRhLnBvbHlnb25PZmZzZXRVbml0cyA9IHRoaXMucG9seWdvbk9mZnNldFVuaXRzO1xyXG5cclxuXHRcdGlmICggdGhpcy5saW5ld2lkdGggIT09IHVuZGVmaW5lZCAmJiB0aGlzLmxpbmV3aWR0aCAhPT0gMSApIGRhdGEubGluZXdpZHRoID0gdGhpcy5saW5ld2lkdGg7XHJcblx0XHRpZiAoIHRoaXMuZGFzaFNpemUgIT09IHVuZGVmaW5lZCApIGRhdGEuZGFzaFNpemUgPSB0aGlzLmRhc2hTaXplO1xyXG5cdFx0aWYgKCB0aGlzLmdhcFNpemUgIT09IHVuZGVmaW5lZCApIGRhdGEuZ2FwU2l6ZSA9IHRoaXMuZ2FwU2l6ZTtcclxuXHRcdGlmICggdGhpcy5zY2FsZSAhPT0gdW5kZWZpbmVkICkgZGF0YS5zY2FsZSA9IHRoaXMuc2NhbGU7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmRpdGhlcmluZyA9PT0gdHJ1ZSApIGRhdGEuZGl0aGVyaW5nID0gdHJ1ZTtcclxuXHJcblx0XHRpZiAoIHRoaXMuYWxwaGFUZXN0ID4gMCApIGRhdGEuYWxwaGFUZXN0ID0gdGhpcy5hbHBoYVRlc3Q7XHJcblx0XHRpZiAoIHRoaXMuYWxwaGFIYXNoID09PSB0cnVlICkgZGF0YS5hbHBoYUhhc2ggPSB0cnVlO1xyXG5cdFx0aWYgKCB0aGlzLmFscGhhVG9Db3ZlcmFnZSA9PT0gdHJ1ZSApIGRhdGEuYWxwaGFUb0NvdmVyYWdlID0gdHJ1ZTtcclxuXHRcdGlmICggdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGEgPT09IHRydWUgKSBkYXRhLnByZW11bHRpcGxpZWRBbHBoYSA9IHRydWU7XHJcblx0XHRpZiAoIHRoaXMuZm9yY2VTaW5nbGVQYXNzID09PSB0cnVlICkgZGF0YS5mb3JjZVNpbmdsZVBhc3MgPSB0cnVlO1xyXG5cclxuXHRcdGlmICggdGhpcy53aXJlZnJhbWUgPT09IHRydWUgKSBkYXRhLndpcmVmcmFtZSA9IHRydWU7XHJcblx0XHRpZiAoIHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID4gMSApIGRhdGEud2lyZWZyYW1lTGluZXdpZHRoID0gdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg7XHJcblx0XHRpZiAoIHRoaXMud2lyZWZyYW1lTGluZWNhcCAhPT0gJ3JvdW5kJyApIGRhdGEud2lyZWZyYW1lTGluZWNhcCA9IHRoaXMud2lyZWZyYW1lTGluZWNhcDtcclxuXHRcdGlmICggdGhpcy53aXJlZnJhbWVMaW5lam9pbiAhPT0gJ3JvdW5kJyApIGRhdGEud2lyZWZyYW1lTGluZWpvaW4gPSB0aGlzLndpcmVmcmFtZUxpbmVqb2luO1xyXG5cclxuXHRcdGlmICggdGhpcy5mbGF0U2hhZGluZyA9PT0gdHJ1ZSApIGRhdGEuZmxhdFNoYWRpbmcgPSB0cnVlO1xyXG5cclxuXHRcdGlmICggdGhpcy52aXNpYmxlID09PSBmYWxzZSApIGRhdGEudmlzaWJsZSA9IGZhbHNlO1xyXG5cclxuXHRcdGlmICggdGhpcy50b25lTWFwcGVkID09PSBmYWxzZSApIGRhdGEudG9uZU1hcHBlZCA9IGZhbHNlO1xyXG5cclxuXHRcdGlmICggdGhpcy5mb2cgPT09IGZhbHNlICkgZGF0YS5mb2cgPSBmYWxzZTtcclxuXHJcblx0XHRpZiAoIE9iamVjdC5rZXlzKCB0aGlzLnVzZXJEYXRhICkubGVuZ3RoID4gMCApIGRhdGEudXNlckRhdGEgPSB0aGlzLnVzZXJEYXRhO1xyXG5cclxuXHRcdC8vIFRPRE86IENvcGllZCBmcm9tIE9iamVjdDNELnRvSlNPTlxyXG5cclxuXHRcdGZ1bmN0aW9uIGV4dHJhY3RGcm9tQ2FjaGUoIGNhY2hlICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdmFsdWVzID0gW107XHJcblxyXG5cdFx0XHRmb3IgKCBjb25zdCBrZXkgaW4gY2FjaGUgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGRhdGEgPSBjYWNoZVsga2V5IF07XHJcblx0XHRcdFx0ZGVsZXRlIGRhdGEubWV0YWRhdGE7XHJcblx0XHRcdFx0dmFsdWVzLnB1c2goIGRhdGEgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiB2YWx1ZXM7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggaXNSb290T2JqZWN0ICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdGV4dHVyZXMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLnRleHR1cmVzICk7XHJcblx0XHRcdGNvbnN0IGltYWdlcyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEuaW1hZ2VzICk7XHJcblxyXG5cdFx0XHRpZiAoIHRleHR1cmVzLmxlbmd0aCA+IDAgKSBkYXRhLnRleHR1cmVzID0gdGV4dHVyZXM7XHJcblx0XHRcdGlmICggaW1hZ2VzLmxlbmd0aCA+IDAgKSBkYXRhLmltYWdlcyA9IGltYWdlcztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGRhdGE7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIG5ldyBtYXRlcmlhbCB3aXRoIGNvcGllZCB2YWx1ZXMgZnJvbSB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7TWF0ZXJpYWx9IEEgY2xvbmUgb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjbG9uZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29waWVzIHRoZSB2YWx1ZXMgb2YgdGhlIGdpdmVuIG1hdGVyaWFsIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdGVyaWFsfSBzb3VyY2UgLSBUaGUgbWF0ZXJpYWwgdG8gY29weS5cclxuXHQgKiBAcmV0dXJuIHtNYXRlcmlhbH0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0dGhpcy5uYW1lID0gc291cmNlLm5hbWU7XHJcblxyXG5cdFx0dGhpcy5ibGVuZGluZyA9IHNvdXJjZS5ibGVuZGluZztcclxuXHRcdHRoaXMuc2lkZSA9IHNvdXJjZS5zaWRlO1xyXG5cdFx0dGhpcy52ZXJ0ZXhDb2xvcnMgPSBzb3VyY2UudmVydGV4Q29sb3JzO1xyXG5cclxuXHRcdHRoaXMub3BhY2l0eSA9IHNvdXJjZS5vcGFjaXR5O1xyXG5cdFx0dGhpcy50cmFuc3BhcmVudCA9IHNvdXJjZS50cmFuc3BhcmVudDtcclxuXHJcblx0XHR0aGlzLmJsZW5kU3JjID0gc291cmNlLmJsZW5kU3JjO1xyXG5cdFx0dGhpcy5ibGVuZERzdCA9IHNvdXJjZS5ibGVuZERzdDtcclxuXHRcdHRoaXMuYmxlbmRFcXVhdGlvbiA9IHNvdXJjZS5ibGVuZEVxdWF0aW9uO1xyXG5cdFx0dGhpcy5ibGVuZFNyY0FscGhhID0gc291cmNlLmJsZW5kU3JjQWxwaGE7XHJcblx0XHR0aGlzLmJsZW5kRHN0QWxwaGEgPSBzb3VyY2UuYmxlbmREc3RBbHBoYTtcclxuXHRcdHRoaXMuYmxlbmRFcXVhdGlvbkFscGhhID0gc291cmNlLmJsZW5kRXF1YXRpb25BbHBoYTtcclxuXHRcdHRoaXMuYmxlbmRDb2xvci5jb3B5KCBzb3VyY2UuYmxlbmRDb2xvciApO1xyXG5cdFx0dGhpcy5ibGVuZEFscGhhID0gc291cmNlLmJsZW5kQWxwaGE7XHJcblxyXG5cdFx0dGhpcy5kZXB0aEZ1bmMgPSBzb3VyY2UuZGVwdGhGdW5jO1xyXG5cdFx0dGhpcy5kZXB0aFRlc3QgPSBzb3VyY2UuZGVwdGhUZXN0O1xyXG5cdFx0dGhpcy5kZXB0aFdyaXRlID0gc291cmNlLmRlcHRoV3JpdGU7XHJcblxyXG5cdFx0dGhpcy5zdGVuY2lsV3JpdGVNYXNrID0gc291cmNlLnN0ZW5jaWxXcml0ZU1hc2s7XHJcblx0XHR0aGlzLnN0ZW5jaWxGdW5jID0gc291cmNlLnN0ZW5jaWxGdW5jO1xyXG5cdFx0dGhpcy5zdGVuY2lsUmVmID0gc291cmNlLnN0ZW5jaWxSZWY7XHJcblx0XHR0aGlzLnN0ZW5jaWxGdW5jTWFzayA9IHNvdXJjZS5zdGVuY2lsRnVuY01hc2s7XHJcblx0XHR0aGlzLnN0ZW5jaWxGYWlsID0gc291cmNlLnN0ZW5jaWxGYWlsO1xyXG5cdFx0dGhpcy5zdGVuY2lsWkZhaWwgPSBzb3VyY2Uuc3RlbmNpbFpGYWlsO1xyXG5cdFx0dGhpcy5zdGVuY2lsWlBhc3MgPSBzb3VyY2Uuc3RlbmNpbFpQYXNzO1xyXG5cdFx0dGhpcy5zdGVuY2lsV3JpdGUgPSBzb3VyY2Uuc3RlbmNpbFdyaXRlO1xyXG5cclxuXHRcdGNvbnN0IHNyY1BsYW5lcyA9IHNvdXJjZS5jbGlwcGluZ1BsYW5lcztcclxuXHRcdGxldCBkc3RQbGFuZXMgPSBudWxsO1xyXG5cclxuXHRcdGlmICggc3JjUGxhbmVzICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0Y29uc3QgbiA9IHNyY1BsYW5lcy5sZW5ndGg7XHJcblx0XHRcdGRzdFBsYW5lcyA9IG5ldyBBcnJheSggbiApO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpICE9PSBuOyArKyBpICkge1xyXG5cclxuXHRcdFx0XHRkc3RQbGFuZXNbIGkgXSA9IHNyY1BsYW5lc1sgaSBdLmNsb25lKCk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuY2xpcHBpbmdQbGFuZXMgPSBkc3RQbGFuZXM7XHJcblx0XHR0aGlzLmNsaXBJbnRlcnNlY3Rpb24gPSBzb3VyY2UuY2xpcEludGVyc2VjdGlvbjtcclxuXHRcdHRoaXMuY2xpcFNoYWRvd3MgPSBzb3VyY2UuY2xpcFNoYWRvd3M7XHJcblxyXG5cdFx0dGhpcy5zaGFkb3dTaWRlID0gc291cmNlLnNoYWRvd1NpZGU7XHJcblxyXG5cdFx0dGhpcy5jb2xvcldyaXRlID0gc291cmNlLmNvbG9yV3JpdGU7XHJcblxyXG5cdFx0dGhpcy5wcmVjaXNpb24gPSBzb3VyY2UucHJlY2lzaW9uO1xyXG5cclxuXHRcdHRoaXMucG9seWdvbk9mZnNldCA9IHNvdXJjZS5wb2x5Z29uT2Zmc2V0O1xyXG5cdFx0dGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yID0gc291cmNlLnBvbHlnb25PZmZzZXRGYWN0b3I7XHJcblx0XHR0aGlzLnBvbHlnb25PZmZzZXRVbml0cyA9IHNvdXJjZS5wb2x5Z29uT2Zmc2V0VW5pdHM7XHJcblxyXG5cdFx0dGhpcy5kaXRoZXJpbmcgPSBzb3VyY2UuZGl0aGVyaW5nO1xyXG5cclxuXHRcdHRoaXMuYWxwaGFUZXN0ID0gc291cmNlLmFscGhhVGVzdDtcclxuXHRcdHRoaXMuYWxwaGFIYXNoID0gc291cmNlLmFscGhhSGFzaDtcclxuXHRcdHRoaXMuYWxwaGFUb0NvdmVyYWdlID0gc291cmNlLmFscGhhVG9Db3ZlcmFnZTtcclxuXHRcdHRoaXMucHJlbXVsdGlwbGllZEFscGhhID0gc291cmNlLnByZW11bHRpcGxpZWRBbHBoYTtcclxuXHRcdHRoaXMuZm9yY2VTaW5nbGVQYXNzID0gc291cmNlLmZvcmNlU2luZ2xlUGFzcztcclxuXHJcblx0XHR0aGlzLnZpc2libGUgPSBzb3VyY2UudmlzaWJsZTtcclxuXHJcblx0XHR0aGlzLnRvbmVNYXBwZWQgPSBzb3VyY2UudG9uZU1hcHBlZDtcclxuXHJcblx0XHR0aGlzLnVzZXJEYXRhID0gSlNPTi5wYXJzZSggSlNPTi5zdHJpbmdpZnkoIHNvdXJjZS51c2VyRGF0YSApICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRnJlZXMgdGhlIEdQVS1yZWxhdGVkIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhpcyBpbnN0YW5jZS4gQ2FsbCB0aGlzXHJcblx0ICogbWV0aG9kIHdoZW5ldmVyIHRoaXMgaW5zdGFuY2UgaXMgbm8gbG9uZ2VyIHVzZWQgaW4geW91ciBhcHAuXHJcblx0ICpcclxuXHQgKiBAZmlyZXMgTWF0ZXJpYWwjZGlzcG9zZVxyXG5cdCAqL1xyXG5cdGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBGaXJlcyB3aGVuIHRoZSBtYXRlcmlhbCBoYXMgYmVlbiBkaXNwb3NlZCBvZi5cclxuXHRcdCAqXHJcblx0XHQgKiBAZXZlbnQgTWF0ZXJpYWwjZGlzcG9zZVxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdkaXNwb3NlJyB9ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0dGluZyB0aGlzIHByb3BlcnR5IHRvIGB0cnVlYCBpbmRpY2F0ZXMgdGhlIGVuZ2luZSB0aGUgbWF0ZXJpYWxcclxuXHQgKiBuZWVkcyB0byBiZSByZWNvbXBpbGVkLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbHVlXHJcblx0ICovXHJcblx0c2V0IG5lZWRzVXBkYXRlKCB2YWx1ZSApIHtcclxuXHJcblx0XHRpZiAoIHZhbHVlID09PSB0cnVlICkgdGhpcy52ZXJzaW9uICsrO1xyXG5cclxuXHR9XHJcblxyXG5cdG9uQnVpbGQoIC8qIHNoYWRlcm9iamVjdCwgcmVuZGVyZXIgKi8gKSB7XHJcblxyXG5cdFx0Y29uc29sZS53YXJuKCAnTWF0ZXJpYWw6IG9uQnVpbGQoKSBoYXMgYmVlbiByZW1vdmVkLicgKTsgLy8gQGRlcHJlY2F0ZWQsIHIxNjZcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgTWF0ZXJpYWwgfTtcclxuIiwiaW1wb3J0IHsgTWF0ZXJpYWwgfSBmcm9tICcuL01hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgTXVsdGlwbHlPcGVyYXRpb24gfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uL21hdGgvQ29sb3IuanMnO1xyXG5pbXBvcnQgeyBFdWxlciB9IGZyb20gJy4uL21hdGgvRXVsZXIuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgbWF0ZXJpYWwgZm9yIGRyYXdpbmcgZ2VvbWV0cmllcyBpbiBhIHNpbXBsZSBzaGFkZWQgKGZsYXQgb3Igd2lyZWZyYW1lKSB3YXkuXHJcbiAqXHJcbiAqIFRoaXMgbWF0ZXJpYWwgaXMgbm90IGFmZmVjdGVkIGJ5IGxpZ2h0cy5cclxuICpcclxuICogQGF1Z21lbnRzIE1hdGVyaWFsXHJcbiAqL1xyXG5jbGFzcyBNZXNoQmFzaWNNYXRlcmlhbCBleHRlbmRzIE1hdGVyaWFsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBtZXNoIGJhc2ljIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbWV0ZXJzXSAtIEFuIG9iamVjdCB3aXRoIG9uZSBvciBtb3JlIHByb3BlcnRpZXNcclxuXHQgKiBkZWZpbmluZyB0aGUgbWF0ZXJpYWwncyBhcHBlYXJhbmNlLiBBbnkgcHJvcGVydHkgb2YgdGhlIG1hdGVyaWFsXHJcblx0ICogKGluY2x1ZGluZyBhbnkgcHJvcGVydHkgZnJvbSBpbmhlcml0ZWQgbWF0ZXJpYWxzKSBjYW4gYmUgcGFzc2VkXHJcblx0ICogaW4gaGVyZS4gQ29sb3IgdmFsdWVzIGNhbiBiZSBwYXNzZWQgYW55IHR5cGUgb2YgdmFsdWUgYWNjZXB0ZWRcclxuXHQgKiBieSB7QGxpbmsgQ29sb3Ijc2V0fS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVycyApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc01lc2hCYXNpY01hdGVyaWFsID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnTWVzaEJhc2ljTWF0ZXJpYWwnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQ29sb3Igb2YgdGhlIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtDb2xvcn1cclxuXHRcdCAqIEBkZWZhdWx0ICgxLDEsMSlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTsgLy8gZW1pc3NpdmVcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjb2xvciBtYXAuIE1heSBvcHRpb25hbGx5IGluY2x1ZGUgYW4gYWxwaGEgY2hhbm5lbCwgdHlwaWNhbGx5IGNvbWJpbmVkXHJcblx0XHQgKiB3aXRoIHtAbGluayBNYXRlcmlhbCN0cmFuc3BhcmVudH0gb3Ige0BsaW5rIE1hdGVyaWFsI2FscGhhVGVzdH0uIFRoZSB0ZXh0dXJlIG1hcFxyXG5cdFx0ICogY29sb3IgaXMgbW9kdWxhdGVkIGJ5IHRoZSBkaWZmdXNlIGBjb2xvcmAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbGlnaHQgbWFwLiBSZXF1aXJlcyBhIHNlY29uZCBzZXQgb2YgVVZzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5saWdodE1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBJbnRlbnNpdHkgb2YgdGhlIGJha2VkIGxpZ2h0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSAxLjA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcmVkIGNoYW5uZWwgb2YgdGhpcyB0ZXh0dXJlIGlzIHVzZWQgYXMgdGhlIGFtYmllbnQgb2NjbHVzaW9uIG1hcC5cclxuXHRcdCAqIFJlcXVpcmVzIGEgc2Vjb25kIHNldCBvZiBVVnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFvTWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEludGVuc2l0eSBvZiB0aGUgYW1iaWVudCBvY2NsdXNpb24gZWZmZWN0LiBSYW5nZSBpcyBgWzAsMV1gLCB3aGVyZSBgMGBcclxuXHRcdCAqIGRpc2FibGVzIGFtYmllbnQgb2NjbHVzaW9uLiBXaGVyZSBpbnRlbnNpdHkgaXMgYDFgIGFuZCB0aGUgQU8gbWFwJ3NcclxuXHRcdCAqIHJlZCBjaGFubmVsIGlzIGFsc28gYDFgLCBhbWJpZW50IGxpZ2h0IGlzIGZ1bGx5IG9jY2x1ZGVkIG9uIGEgc3VyZmFjZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gMS4wO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU3BlY3VsYXIgbWFwIHVzZWQgYnkgdGhlIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zcGVjdWxhck1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYWxwaGEgbWFwIGlzIGEgZ3JheXNjYWxlIHRleHR1cmUgdGhhdCBjb250cm9scyB0aGUgb3BhY2l0eSBhY3Jvc3MgdGhlXHJcblx0XHQgKiBzdXJmYWNlIChibGFjazogZnVsbHkgdHJhbnNwYXJlbnQ7IHdoaXRlOiBmdWxseSBvcGFxdWUpLlxyXG5cdFx0ICpcclxuXHRcdCAqIE9ubHkgdGhlIGNvbG9yIG9mIHRoZSB0ZXh0dXJlIGlzIHVzZWQsIGlnbm9yaW5nIHRoZSBhbHBoYSBjaGFubmVsIGlmIG9uZVxyXG5cdFx0ICogZXhpc3RzLiBGb3IgUkdCIGFuZCBSR0JBIHRleHR1cmVzLCB0aGUgcmVuZGVyZXIgd2lsbCB1c2UgdGhlIGdyZWVuIGNoYW5uZWxcclxuXHRcdCAqIHdoZW4gc2FtcGxpbmcgdGhpcyB0ZXh0dXJlIGR1ZSB0byB0aGUgZXh0cmEgYml0IG9mIHByZWNpc2lvbiBwcm92aWRlZCBmb3JcclxuXHRcdCAqIGdyZWVuIGluIERYVC1jb21wcmVzc2VkIGFuZCB1bmNvbXByZXNzZWQgUkdCIDU2NSBmb3JtYXRzLiBMdW1pbmFuY2Utb25seSBhbmRcclxuXHRcdCAqIGx1bWluYW5jZS9hbHBoYSB0ZXh0dXJlcyB3aWxsIGFsc28gc3RpbGwgd29yayBhcyBleHBlY3RlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYWxwaGFNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGVudmlyb25tZW50IG1hcC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZW52TWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByb3RhdGlvbiBvZiB0aGUgZW52aXJvbm1lbnQgbWFwIGluIHJhZGlhbnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0V1bGVyfVxyXG5cdFx0ICogQGRlZmF1bHQgKDAsMCwwKVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmVudk1hcFJvdGF0aW9uID0gbmV3IEV1bGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3cgdG8gY29tYmluZSB0aGUgcmVzdWx0IG9mIHRoZSBzdXJmYWNlJ3MgY29sb3Igd2l0aCB0aGUgZW52aXJvbm1lbnQgbWFwLCBpZiBhbnkuXHJcblx0XHQgKlxyXG5cdFx0ICogV2hlbiBzZXQgdG8gYE1peE9wZXJhdGlvbmAsIHRoZSB7QGxpbmsgTWVzaEJhc2ljTWF0ZXJpYWwjcmVmbGVjdGl2aXR5fSBpcyB1c2VkIHRvXHJcblx0XHQgKiBibGVuZCBiZXR3ZWVuIHRoZSB0d28gY29sb3JzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoTXVsdGlwbHlPcGVyYXRpb258TWl4T3BlcmF0aW9ufEFkZE9wZXJhdGlvbil9XHJcblx0XHQgKiBAZGVmYXVsdCBNdWx0aXBseU9wZXJhdGlvblxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvbWJpbmUgPSBNdWx0aXBseU9wZXJhdGlvbjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvdyBtdWNoIHRoZSBlbnZpcm9ubWVudCBtYXAgYWZmZWN0cyB0aGUgc3VyZmFjZS5cclxuXHRcdCAqIFRoZSB2YWxpZCByYW5nZSBpcyBiZXR3ZWVuIGAwYCAobm8gcmVmbGVjdGlvbnMpIGFuZCBgMWAgKGZ1bGwgcmVmbGVjdGlvbnMpLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVmbGVjdGl2aXR5ID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBpbmRleCBvZiByZWZyYWN0aW9uIChJT1IpIG9mIGFpciAoYXBwcm94aW1hdGVseSAxKSBkaXZpZGVkIGJ5IHRoZVxyXG5cdFx0ICogaW5kZXggb2YgcmVmcmFjdGlvbiBvZiB0aGUgbWF0ZXJpYWwuIEl0IGlzIHVzZWQgd2l0aCBlbnZpcm9ubWVudCBtYXBwaW5nXHJcblx0XHQgKiBtb2RlcyB7QGxpbmsgQ3ViZVJlZnJhY3Rpb25NYXBwaW5nfSBhbmQge0BsaW5rIEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nfS5cclxuXHRcdCAqIFRoZSByZWZyYWN0aW9uIHJhdGlvIHNob3VsZCBub3QgZXhjZWVkIGAxYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMC45OFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IDAuOTg7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZW5kZXJzIHRoZSBnZW9tZXRyeSBhcyBhIHdpcmVmcmFtZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMud2lyZWZyYW1lID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDb250cm9scyB0aGUgdGhpY2tuZXNzIG9mIHRoZSB3aXJlZnJhbWUuXHJcblx0XHQgKlxyXG5cdFx0ICogQ2FuIG9ubHkgYmUgdXNlZCB3aXRoIHtAbGluayBTVkdSZW5kZXJlcn0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyBhcHBlYXJhbmNlIG9mIHdpcmVmcmFtZSBlbmRzLlxyXG5cdFx0ICpcclxuXHRcdCAqIENhbiBvbmx5IGJlIHVzZWQgd2l0aCB7QGxpbmsgU1ZHUmVuZGVyZXJ9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoJ3JvdW5kJ3wnYmV2ZWwnfCdtaXRlcicpfVxyXG5cdFx0ICogQGRlZmF1bHQgJ3JvdW5kJ1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSAncm91bmQnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyBhcHBlYXJhbmNlIG9mIHdpcmVmcmFtZSBqb2ludHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQ2FuIG9ubHkgYmUgdXNlZCB3aXRoIHtAbGluayBTVkdSZW5kZXJlcn0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeygncm91bmQnfCdiZXZlbCd8J21pdGVyJyl9XHJcblx0XHQgKiBAZGVmYXVsdCAncm91bmQnXHJcblx0XHQgKi9cclxuXHRcdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSAncm91bmQnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgbWF0ZXJpYWwgaXMgYWZmZWN0ZWQgYnkgZm9nIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5mb2cgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XHJcblxyXG5cdFx0dGhpcy5tYXAgPSBzb3VyY2UubWFwO1xyXG5cclxuXHRcdHRoaXMubGlnaHRNYXAgPSBzb3VyY2UubGlnaHRNYXA7XHJcblx0XHR0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gc291cmNlLmxpZ2h0TWFwSW50ZW5zaXR5O1xyXG5cclxuXHRcdHRoaXMuYW9NYXAgPSBzb3VyY2UuYW9NYXA7XHJcblx0XHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gc291cmNlLmFvTWFwSW50ZW5zaXR5O1xyXG5cclxuXHRcdHRoaXMuc3BlY3VsYXJNYXAgPSBzb3VyY2Uuc3BlY3VsYXJNYXA7XHJcblxyXG5cdFx0dGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDtcclxuXHJcblx0XHR0aGlzLmVudk1hcCA9IHNvdXJjZS5lbnZNYXA7XHJcblx0XHR0aGlzLmVudk1hcFJvdGF0aW9uLmNvcHkoIHNvdXJjZS5lbnZNYXBSb3RhdGlvbiApO1xyXG5cdFx0dGhpcy5jb21iaW5lID0gc291cmNlLmNvbWJpbmU7XHJcblx0XHR0aGlzLnJlZmxlY3Rpdml0eSA9IHNvdXJjZS5yZWZsZWN0aXZpdHk7XHJcblx0XHR0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IHNvdXJjZS5yZWZyYWN0aW9uUmF0aW87XHJcblxyXG5cdFx0dGhpcy53aXJlZnJhbWUgPSBzb3VyY2Uud2lyZWZyYW1lO1xyXG5cdFx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoO1xyXG5cdFx0dGhpcy53aXJlZnJhbWVMaW5lY2FwID0gc291cmNlLndpcmVmcmFtZUxpbmVjYXA7XHJcblx0XHR0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gc291cmNlLndpcmVmcmFtZUxpbmVqb2luO1xyXG5cclxuXHRcdHRoaXMuZm9nID0gc291cmNlLmZvZztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgTWVzaEJhc2ljTWF0ZXJpYWwgfTtcclxuIiwiaW1wb3J0IHsgY2xhbXAgfSBmcm9tICcuLi9tYXRoL01hdGhVdGlscy5qcyc7XHJcblxyXG4vLyBGYXN0IEhhbGYgRmxvYXQgQ29udmVyc2lvbnMsIGh0dHA6Ly93d3cuZm94LXRvb2xraXQub3JnL2Z0cC9mYXN0aGFsZmZsb2F0Y29udmVyc2lvbi5wZGZcclxuXHJcbmNvbnN0IF90YWJsZXMgPSAvKkBfX1BVUkVfXyovIF9nZW5lcmF0ZVRhYmxlcygpO1xyXG5cclxuZnVuY3Rpb24gX2dlbmVyYXRlVGFibGVzKCkge1xyXG5cclxuXHQvLyBmbG9hdDMyIHRvIGZsb2F0MTYgaGVscGVyc1xyXG5cclxuXHRjb25zdCBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoIDQgKTtcclxuXHRjb25zdCBmbG9hdFZpZXcgPSBuZXcgRmxvYXQzMkFycmF5KCBidWZmZXIgKTtcclxuXHRjb25zdCB1aW50MzJWaWV3ID0gbmV3IFVpbnQzMkFycmF5KCBidWZmZXIgKTtcclxuXHJcblx0Y29uc3QgYmFzZVRhYmxlID0gbmV3IFVpbnQzMkFycmF5KCA1MTIgKTtcclxuXHRjb25zdCBzaGlmdFRhYmxlID0gbmV3IFVpbnQzMkFycmF5KCA1MTIgKTtcclxuXHJcblx0Zm9yICggbGV0IGkgPSAwOyBpIDwgMjU2OyArKyBpICkge1xyXG5cclxuXHRcdGNvbnN0IGUgPSBpIC0gMTI3O1xyXG5cclxuXHRcdC8vIHZlcnkgc21hbGwgbnVtYmVyICgwLCAtMClcclxuXHJcblx0XHRpZiAoIGUgPCAtIDI3ICkge1xyXG5cclxuXHRcdFx0YmFzZVRhYmxlWyBpIF0gPSAweDAwMDA7XHJcblx0XHRcdGJhc2VUYWJsZVsgaSB8IDB4MTAwIF0gPSAweDgwMDA7XHJcblx0XHRcdHNoaWZ0VGFibGVbIGkgXSA9IDI0O1xyXG5cdFx0XHRzaGlmdFRhYmxlWyBpIHwgMHgxMDAgXSA9IDI0O1xyXG5cclxuXHRcdFx0Ly8gc21hbGwgbnVtYmVyIChkZW5vcm0pXHJcblxyXG5cdFx0fSBlbHNlIGlmICggZSA8IC0gMTQgKSB7XHJcblxyXG5cdFx0XHRiYXNlVGFibGVbIGkgXSA9IDB4MDQwMCA+PiAoIC0gZSAtIDE0ICk7XHJcblx0XHRcdGJhc2VUYWJsZVsgaSB8IDB4MTAwIF0gPSAoIDB4MDQwMCA+PiAoIC0gZSAtIDE0ICkgKSB8IDB4ODAwMDtcclxuXHRcdFx0c2hpZnRUYWJsZVsgaSBdID0gLSBlIC0gMTtcclxuXHRcdFx0c2hpZnRUYWJsZVsgaSB8IDB4MTAwIF0gPSAtIGUgLSAxO1xyXG5cclxuXHRcdFx0Ly8gbm9ybWFsIG51bWJlclxyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGUgPD0gMTUgKSB7XHJcblxyXG5cdFx0XHRiYXNlVGFibGVbIGkgXSA9ICggZSArIDE1ICkgPDwgMTA7XHJcblx0XHRcdGJhc2VUYWJsZVsgaSB8IDB4MTAwIF0gPSAoICggZSArIDE1ICkgPDwgMTAgKSB8IDB4ODAwMDtcclxuXHRcdFx0c2hpZnRUYWJsZVsgaSBdID0gMTM7XHJcblx0XHRcdHNoaWZ0VGFibGVbIGkgfCAweDEwMCBdID0gMTM7XHJcblxyXG5cdFx0XHQvLyBsYXJnZSBudW1iZXIgKEluZmluaXR5LCAtSW5maW5pdHkpXHJcblxyXG5cdFx0fSBlbHNlIGlmICggZSA8IDEyOCApIHtcclxuXHJcblx0XHRcdGJhc2VUYWJsZVsgaSBdID0gMHg3YzAwO1xyXG5cdFx0XHRiYXNlVGFibGVbIGkgfCAweDEwMCBdID0gMHhmYzAwO1xyXG5cdFx0XHRzaGlmdFRhYmxlWyBpIF0gPSAyNDtcclxuXHRcdFx0c2hpZnRUYWJsZVsgaSB8IDB4MTAwIF0gPSAyNDtcclxuXHJcblx0XHRcdC8vIHN0YXkgKE5hTiwgSW5maW5pdHksIC1JbmZpbml0eSlcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0YmFzZVRhYmxlWyBpIF0gPSAweDdjMDA7XHJcblx0XHRcdGJhc2VUYWJsZVsgaSB8IDB4MTAwIF0gPSAweGZjMDA7XHJcblx0XHRcdHNoaWZ0VGFibGVbIGkgXSA9IDEzO1xyXG5cdFx0XHRzaGlmdFRhYmxlWyBpIHwgMHgxMDAgXSA9IDEzO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvLyBmbG9hdDE2IHRvIGZsb2F0MzIgaGVscGVyc1xyXG5cclxuXHRjb25zdCBtYW50aXNzYVRhYmxlID0gbmV3IFVpbnQzMkFycmF5KCAyMDQ4ICk7XHJcblx0Y29uc3QgZXhwb25lbnRUYWJsZSA9IG5ldyBVaW50MzJBcnJheSggNjQgKTtcclxuXHRjb25zdCBvZmZzZXRUYWJsZSA9IG5ldyBVaW50MzJBcnJheSggNjQgKTtcclxuXHJcblx0Zm9yICggbGV0IGkgPSAxOyBpIDwgMTAyNDsgKysgaSApIHtcclxuXHJcblx0XHRsZXQgbSA9IGkgPDwgMTM7IC8vIHplcm8gcGFkIG1hbnRpc3NhIGJpdHNcclxuXHRcdGxldCBlID0gMDsgLy8gemVybyBleHBvbmVudFxyXG5cclxuXHRcdC8vIG5vcm1hbGl6ZWRcclxuXHRcdHdoaWxlICggKCBtICYgMHgwMDgwMDAwMCApID09PSAwICkge1xyXG5cclxuXHRcdFx0bSA8PD0gMTtcclxuXHRcdFx0ZSAtPSAweDAwODAwMDAwOyAvLyBkZWNyZW1lbnQgZXhwb25lbnRcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0bSAmPSB+IDB4MDA4MDAwMDA7IC8vIGNsZWFyIGxlYWRpbmcgMSBiaXRcclxuXHRcdGUgKz0gMHgzODgwMDAwMDsgLy8gYWRqdXN0IGJpYXNcclxuXHJcblx0XHRtYW50aXNzYVRhYmxlWyBpIF0gPSBtIHwgZTtcclxuXHJcblx0fVxyXG5cclxuXHRmb3IgKCBsZXQgaSA9IDEwMjQ7IGkgPCAyMDQ4OyArKyBpICkge1xyXG5cclxuXHRcdG1hbnRpc3NhVGFibGVbIGkgXSA9IDB4MzgwMDAwMDAgKyAoICggaSAtIDEwMjQgKSA8PCAxMyApO1xyXG5cclxuXHR9XHJcblxyXG5cdGZvciAoIGxldCBpID0gMTsgaSA8IDMxOyArKyBpICkge1xyXG5cclxuXHRcdGV4cG9uZW50VGFibGVbIGkgXSA9IGkgPDwgMjM7XHJcblxyXG5cdH1cclxuXHJcblx0ZXhwb25lbnRUYWJsZVsgMzEgXSA9IDB4NDc4MDAwMDA7XHJcblx0ZXhwb25lbnRUYWJsZVsgMzIgXSA9IDB4ODAwMDAwMDA7XHJcblxyXG5cdGZvciAoIGxldCBpID0gMzM7IGkgPCA2MzsgKysgaSApIHtcclxuXHJcblx0XHRleHBvbmVudFRhYmxlWyBpIF0gPSAweDgwMDAwMDAwICsgKCAoIGkgLSAzMiApIDw8IDIzICk7XHJcblxyXG5cdH1cclxuXHJcblx0ZXhwb25lbnRUYWJsZVsgNjMgXSA9IDB4Yzc4MDAwMDA7XHJcblxyXG5cdGZvciAoIGxldCBpID0gMTsgaSA8IDY0OyArKyBpICkge1xyXG5cclxuXHRcdGlmICggaSAhPT0gMzIgKSB7XHJcblxyXG5cdFx0XHRvZmZzZXRUYWJsZVsgaSBdID0gMTAyNDtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIHtcclxuXHRcdGZsb2F0VmlldzogZmxvYXRWaWV3LFxyXG5cdFx0dWludDMyVmlldzogdWludDMyVmlldyxcclxuXHRcdGJhc2VUYWJsZTogYmFzZVRhYmxlLFxyXG5cdFx0c2hpZnRUYWJsZTogc2hpZnRUYWJsZSxcclxuXHRcdG1hbnRpc3NhVGFibGU6IG1hbnRpc3NhVGFibGUsXHJcblx0XHRleHBvbmVudFRhYmxlOiBleHBvbmVudFRhYmxlLFxyXG5cdFx0b2Zmc2V0VGFibGU6IG9mZnNldFRhYmxlXHJcblx0fTtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgaGFsZiBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgdmFsdWUgKEZQMTYpIGZyb20gdGhlIGdpdmVuIHNpbmdsZVxyXG4gKiBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgdmFsdWUgKEZQMzIpLlxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsIC0gQSBzaW5nbGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IHZhbHVlLlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBGUDE2IHZhbHVlLlxyXG4gKi9cclxuZnVuY3Rpb24gdG9IYWxmRmxvYXQoIHZhbCApIHtcclxuXHJcblx0aWYgKCBNYXRoLmFicyggdmFsICkgPiA2NTUwNCApIGNvbnNvbGUud2FybiggJ1RIUkVFLkRhdGFVdGlscy50b0hhbGZGbG9hdCgpOiBWYWx1ZSBvdXQgb2YgcmFuZ2UuJyApO1xyXG5cclxuXHR2YWwgPSBjbGFtcCggdmFsLCAtIDY1NTA0LCA2NTUwNCApO1xyXG5cclxuXHRfdGFibGVzLmZsb2F0Vmlld1sgMCBdID0gdmFsO1xyXG5cdGNvbnN0IGYgPSBfdGFibGVzLnVpbnQzMlZpZXdbIDAgXTtcclxuXHRjb25zdCBlID0gKCBmID4+IDIzICkgJiAweDFmZjtcclxuXHRyZXR1cm4gX3RhYmxlcy5iYXNlVGFibGVbIGUgXSArICggKCBmICYgMHgwMDdmZmZmZiApID4+IF90YWJsZXMuc2hpZnRUYWJsZVsgZSBdICk7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIHNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgdmFsdWUgKEZQMzIpIGZyb20gdGhlIGdpdmVuIGhhbGZcclxuICogcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IHZhbHVlIChGUDE2KS5cclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHZhbCAtIEEgaGFsZiBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgdmFsdWUuXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIEZQMzIgdmFsdWUuXHJcbiAqL1xyXG5mdW5jdGlvbiBmcm9tSGFsZkZsb2F0KCB2YWwgKSB7XHJcblxyXG5cdGNvbnN0IG0gPSB2YWwgPj4gMTA7XHJcblx0X3RhYmxlcy51aW50MzJWaWV3WyAwIF0gPSBfdGFibGVzLm1hbnRpc3NhVGFibGVbIF90YWJsZXMub2Zmc2V0VGFibGVbIG0gXSArICggdmFsICYgMHgzZmYgKSBdICsgX3RhYmxlcy5leHBvbmVudFRhYmxlWyBtIF07XHJcblx0cmV0dXJuIF90YWJsZXMuZmxvYXRWaWV3WyAwIF07XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQSBjbGFzcyBjb250YWluaW5nIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBkYXRhLlxyXG4gKlxyXG4gKiBAaGlkZWNvbnN0cnVjdG9yXHJcbiAqL1xyXG5jbGFzcyBEYXRhVXRpbHMge1xyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgaGFsZiBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgdmFsdWUgKEZQMTYpIGZyb20gdGhlIGdpdmVuIHNpbmdsZVxyXG5cdCAqIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCB2YWx1ZSAoRlAzMikuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdmFsIC0gQSBzaW5nbGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IHZhbHVlLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIEZQMTYgdmFsdWUuXHJcblx0ICovXHJcblx0c3RhdGljIHRvSGFsZkZsb2F0KCB2YWwgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRvSGFsZkZsb2F0KCB2YWwgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgc2luZ2xlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCB2YWx1ZSAoRlAzMikgZnJvbSB0aGUgZ2l2ZW4gaGFsZlxyXG5cdCAqIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCB2YWx1ZSAoRlAxNikuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdmFsIC0gQSBoYWxmIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCB2YWx1ZS5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBGUDMyIHZhbHVlLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBmcm9tSGFsZkZsb2F0KCB2YWwgKSB7XHJcblxyXG5cdFx0cmV0dXJuIGZyb21IYWxmRmxvYXQoIHZhbCApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQge1xyXG5cdHRvSGFsZkZsb2F0LFxyXG5cdGZyb21IYWxmRmxvYXQsXHJcblx0RGF0YVV0aWxzXHJcbn07XHJcbiIsImltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IyLmpzJztcclxuaW1wb3J0IHsgZGVub3JtYWxpemUsIG5vcm1hbGl6ZSB9IGZyb20gJy4uL21hdGgvTWF0aFV0aWxzLmpzJztcclxuaW1wb3J0IHsgU3RhdGljRHJhd1VzYWdlLCBGbG9hdFR5cGUgfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBmcm9tSGFsZkZsb2F0LCB0b0hhbGZGbG9hdCB9IGZyb20gJy4uL2V4dHJhcy9EYXRhVXRpbHMuanMnO1xyXG5cclxuY29uc3QgX3ZlY3RvciA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX3ZlY3RvcjIgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IyKCk7XHJcblxyXG5sZXQgX2lkID0gMDtcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGNsYXNzIHN0b3JlcyBkYXRhIGZvciBhbiBhdHRyaWJ1dGUgKHN1Y2ggYXMgdmVydGV4IHBvc2l0aW9ucywgZmFjZVxyXG4gKiBpbmRpY2VzLCBub3JtYWxzLCBjb2xvcnMsIFVWcywgYW5kIGFueSBjdXN0b20gYXR0cmlidXRlcyApIGFzc29jaWF0ZWQgd2l0aFxyXG4gKiBhIGdlb21ldHJ5LCB3aGljaCBhbGxvd3MgZm9yIG1vcmUgZWZmaWNpZW50IHBhc3Npbmcgb2YgZGF0YSB0byB0aGUgR1BVLlxyXG4gKlxyXG4gKiBXaGVuIHdvcmtpbmcgd2l0aCB2ZWN0b3ItbGlrZSBkYXRhLCB0aGUgYGZyb21CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgaW5kZXggKWBcclxuICogaGVscGVyIG1ldGhvZHMgb24gdmVjdG9yIGFuZCBjb2xvciBjbGFzcyBtaWdodCBiZSBoZWxwZnVsLiBFLmcuIHtAbGluayBWZWN0b3IzI2Zyb21CdWZmZXJBdHRyaWJ1dGV9LlxyXG4gKi9cclxuY2xhc3MgQnVmZmVyQXR0cmlidXRlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUeXBlZEFycmF5fSBhcnJheSAtIFRoZSBhcnJheSBob2xkaW5nIHRoZSBhdHRyaWJ1dGUgZGF0YS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaXRlbVNpemUgLSBUaGUgaXRlbSBzaXplLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW25vcm1hbGl6ZWQ9ZmFsc2VdIC0gV2hldGhlciB0aGUgZGF0YSBhcmUgbm9ybWFsaXplZCBvciBub3QuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCA9IGZhbHNlICkge1xyXG5cclxuXHRcdGlmICggQXJyYXkuaXNBcnJheSggYXJyYXkgKSApIHtcclxuXHJcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IGFycmF5IHNob3VsZCBiZSBhIFR5cGVkIEFycmF5LicgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzQnVmZmVyQXR0cmlidXRlID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBJRCBvZiB0aGUgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAbmFtZSBCdWZmZXJBdHRyaWJ1dGUjaWRcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqL1xyXG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCAnaWQnLCB7IHZhbHVlOiBfaWQgKysgfSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG5hbWUgb2YgdGhlIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5uYW1lID0gJyc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYXJyYXkgaG9sZGluZyB0aGUgYXR0cmlidXRlIGRhdGEuIEl0IHNob3VsZCBoYXZlIGBpdGVtU2l6ZSAqIG51bVZlcnRpY2VzYFxyXG5cdFx0ICogZWxlbWVudHMsIHdoZXJlIGBudW1WZXJ0aWNlc2AgaXMgdGhlIG51bWJlciBvZiB2ZXJ0aWNlcyBpbiB0aGUgYXNzb2NpYXRlZCBnZW9tZXRyeS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VHlwZWRBcnJheX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hcnJheSA9IGFycmF5O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG51bWJlciBvZiB2YWx1ZXMgb2YgdGhlIGFycmF5IHRoYXQgc2hvdWxkIGJlIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgdmVydGV4LlxyXG5cdFx0ICogRm9yIGluc3RhbmNlLCBpZiB0aGlzIGF0dHJpYnV0ZSBpcyBzdG9yaW5nIGEgMy1jb21wb25lbnQgdmVjdG9yIChzdWNoIGFzIGEgcG9zaXRpb24sXHJcblx0XHQgKiBub3JtYWwsIG9yIGNvbG9yKSwgdGhlbiB0aGUgdmFsdWUgc2hvdWxkIGJlIGAzYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLml0ZW1TaXplID0gaXRlbVNpemU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgaXRlbXMgdGhpcyBidWZmZXIgYXR0cmlidXRlIHN0b3Jlcy4gSXQgaXMgaW50ZXJuYWxseSBjb21wdXRlZFxyXG5cdFx0ICogYnkgZGl2aWRpbmcgdGhlIGBhcnJheWAgbGVuZ3RoIGJ5IHRoZSBgaXRlbVNpemVgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb3VudCA9IGFycmF5ICE9PSB1bmRlZmluZWQgPyBhcnJheS5sZW5ndGggLyBpdGVtU2l6ZSA6IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBcHBsaWVzIHRvIGludGVnZXIgZGF0YSBvbmx5LiBJbmRpY2F0ZXMgaG93IHRoZSB1bmRlcmx5aW5nIGRhdGEgaW4gdGhlIGJ1ZmZlciBtYXBzIHRvXHJcblx0XHQgKiB0aGUgdmFsdWVzIGluIHRoZSBHTFNMIGNvZGUuIEZvciBpbnN0YW5jZSwgaWYgYGFycmF5YCBpcyBhbiBpbnN0YW5jZSBvZiBgVUludDE2QXJyYXlgLFxyXG5cdFx0ICogYW5kIGBub3JtYWxpemVkYCBpcyBgdHJ1ZWAsIHRoZSB2YWx1ZXMgYDAgLSs2NTUzNWAgaW4gdGhlIGFycmF5IGRhdGEgd2lsbCBiZSBtYXBwZWQgdG9cclxuXHRcdCAqIGAwLjBmIC0gKzEuMGZgIGluIHRoZSBHTFNMIGF0dHJpYnV0ZS4gSWYgYG5vcm1hbGl6ZWRgIGlzIGBmYWxzZWAsIHRoZSB2YWx1ZXMgd2lsbCBiZSBjb252ZXJ0ZWRcclxuXHRcdCAqIHRvIGZsb2F0cyB1bm1vZGlmaWVkLCBpLmUuIGA2NTUzNWAgYmVjb21lcyBgNjU1MzUuMGZgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vcm1hbGl6ZWQgPSBub3JtYWxpemVkO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyB0aGUgaW50ZW5kZWQgdXNhZ2UgcGF0dGVybiBvZiB0aGUgZGF0YSBzdG9yZSBmb3Igb3B0aW1pemF0aW9uIHB1cnBvc2VzLlxyXG5cdFx0ICpcclxuXHRcdCAqIE5vdGU6IEFmdGVyIHRoZSBpbml0aWFsIHVzZSBvZiBhIGJ1ZmZlciwgaXRzIHVzYWdlIGNhbm5vdCBiZSBjaGFuZ2VkLiBJbnN0ZWFkLFxyXG5cdFx0ICogaW5zdGFudGlhdGUgYSBuZXcgb25lIGFuZCBzZXQgdGhlIGRlc2lyZWQgdXNhZ2UgYmVmb3JlIHRoZSBuZXh0IHJlbmRlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KFN0YXRpY0RyYXdVc2FnZXxEeW5hbWljRHJhd1VzYWdlfFN0cmVhbURyYXdVc2FnZXxTdGF0aWNSZWFkVXNhZ2V8RHluYW1pY1JlYWRVc2FnZXxTdHJlYW1SZWFkVXNhZ2V8U3RhdGljQ29weVVzYWdlfER5bmFtaWNDb3B5VXNhZ2V8U3RyZWFtQ29weVVzYWdlKX1cclxuXHRcdCAqIEBkZWZhdWx0IFN0YXRpY0RyYXdVc2FnZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVzYWdlID0gU3RhdGljRHJhd1VzYWdlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBjYW4gYmUgdXNlZCB0byBvbmx5IHVwZGF0ZSBzb21lIGNvbXBvbmVudHMgb2Ygc3RvcmVkIHZlY3RvcnMgKGZvciBleGFtcGxlLCBqdXN0IHRoZVxyXG5cdFx0ICogY29tcG9uZW50IHJlbGF0ZWQgdG8gY29sb3IpLiBVc2UgdGhlIGBhZGRVcGRhdGVSYW5nZSgpYCBmdW5jdGlvbiB0byBhZGQgcmFuZ2VzIHRvIHRoaXMgYXJyYXkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PE9iamVjdD59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXBkYXRlUmFuZ2VzID0gW107XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDb25maWd1cmVzIHRoZSBib3VuZCBHUFUgdHlwZSBmb3IgdXNlIGluIHNoYWRlcnMuXHJcblx0XHQgKlxyXG5cdFx0ICogTm90ZTogdGhpcyBvbmx5IGhhcyBhbiBlZmZlY3QgZm9yIGludGVnZXIgYXJyYXlzIGFuZCBpcyBub3QgY29uZmlndXJhYmxlIGZvciBmbG9hdCBhcnJheXMuXHJcblx0XHQgKiBGb3IgbG93ZXIgcHJlY2lzaW9uIGZsb2F0IHR5cGVzLCB1c2UgYEZsb2F0MTZCdWZmZXJBdHRyaWJ1dGVgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoRmxvYXRUeXBlfEludFR5cGUpfVxyXG5cdFx0ICogQGRlZmF1bHQgRmxvYXRUeXBlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ3B1VHlwZSA9IEZsb2F0VHlwZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgdmVyc2lvbiBudW1iZXIsIGluY3JlbWVudGVkIGV2ZXJ5IHRpbWUgdGhlIGBuZWVkc1VwZGF0ZWAgaXMgc2V0IHRvIGB0cnVlYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnZlcnNpb24gPSAwO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBleGVjdXRlZCBhZnRlciB0aGUgcmVuZGVyZXIgaGFzIHRyYW5zZmVycmVkIHRoZSBhdHRyaWJ1dGVcclxuXHQgKiBhcnJheSBkYXRhIHRvIHRoZSBHUFUuXHJcblx0ICovXHJcblx0b25VcGxvYWRDYWxsYmFjaygpIHt9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZsYWcgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIGF0dHJpYnV0ZSBoYXMgY2hhbmdlZCBhbmQgc2hvdWxkIGJlIHJlLXNlbnQgdG9cclxuXHQgKiB0aGUgR1BVLiBTZXQgdGhpcyB0byBgdHJ1ZWAgd2hlbiB5b3UgbW9kaWZ5IHRoZSB2YWx1ZSBvZiB0aGUgYXJyYXkuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0ICogQHBhcmFtIHtib29sZWFufSB2YWx1ZVxyXG5cdCAqL1xyXG5cdHNldCBuZWVkc1VwZGF0ZSggdmFsdWUgKSB7XHJcblxyXG5cdFx0aWYgKCB2YWx1ZSA9PT0gdHJ1ZSApIHRoaXMudmVyc2lvbiArKztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB1c2FnZSBvZiB0aGlzIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geyhTdGF0aWNEcmF3VXNhZ2V8RHluYW1pY0RyYXdVc2FnZXxTdHJlYW1EcmF3VXNhZ2V8U3RhdGljUmVhZFVzYWdlfER5bmFtaWNSZWFkVXNhZ2V8U3RyZWFtUmVhZFVzYWdlfFN0YXRpY0NvcHlVc2FnZXxEeW5hbWljQ29weVVzYWdlfFN0cmVhbUNvcHlVc2FnZSl9IHZhbHVlIC0gVGhlIHVzYWdlIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtCdWZmZXJBdHRyaWJ1dGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKi9cclxuXHRzZXRVc2FnZSggdmFsdWUgKSB7XHJcblxyXG5cdFx0dGhpcy51c2FnZSA9IHZhbHVlO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgYSByYW5nZSBvZiBkYXRhIGluIHRoZSBkYXRhIGFycmF5IHRvIGJlIHVwZGF0ZWQgb24gdGhlIEdQVS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCAtIFBvc2l0aW9uIGF0IHdoaWNoIHRvIHN0YXJ0IHVwZGF0ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gY291bnQgLSBUaGUgbnVtYmVyIG9mIGNvbXBvbmVudHMgdG8gdXBkYXRlLlxyXG5cdCAqL1xyXG5cdGFkZFVwZGF0ZVJhbmdlKCBzdGFydCwgY291bnQgKSB7XHJcblxyXG5cdFx0dGhpcy51cGRhdGVSYW5nZXMucHVzaCggeyBzdGFydCwgY291bnQgfSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENsZWFycyB0aGUgdXBkYXRlIHJhbmdlcy5cclxuXHQgKi9cclxuXHRjbGVhclVwZGF0ZVJhbmdlcygpIHtcclxuXHJcblx0XHR0aGlzLnVwZGF0ZVJhbmdlcy5sZW5ndGggPSAwO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvcGllcyB0aGUgdmFsdWVzIG9mIHRoZSBnaXZlbiBidWZmZXIgYXR0cmlidXRlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0J1ZmZlckF0dHJpYnV0ZX0gc291cmNlIC0gVGhlIGJ1ZmZlciBhdHRyaWJ1dGUgdG8gY29weS5cclxuXHQgKiBAcmV0dXJuIHtCdWZmZXJBdHRyaWJ1dGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHRoaXMubmFtZSA9IHNvdXJjZS5uYW1lO1xyXG5cdFx0dGhpcy5hcnJheSA9IG5ldyBzb3VyY2UuYXJyYXkuY29uc3RydWN0b3IoIHNvdXJjZS5hcnJheSApO1xyXG5cdFx0dGhpcy5pdGVtU2l6ZSA9IHNvdXJjZS5pdGVtU2l6ZTtcclxuXHRcdHRoaXMuY291bnQgPSBzb3VyY2UuY291bnQ7XHJcblx0XHR0aGlzLm5vcm1hbGl6ZWQgPSBzb3VyY2Uubm9ybWFsaXplZDtcclxuXHJcblx0XHR0aGlzLnVzYWdlID0gc291cmNlLnVzYWdlO1xyXG5cdFx0dGhpcy5ncHVUeXBlID0gc291cmNlLmdwdVR5cGU7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29waWVzIGEgdmVjdG9yIGZyb20gdGhlIGdpdmVuIGJ1ZmZlciBhdHRyaWJ1dGUgdG8gdGhpcyBvbmUuIFRoZSBzdGFydFxyXG5cdCAqIGFuZCBkZXN0aW5hdGlvbiBwb3NpdGlvbiBpbiB0aGUgYXR0cmlidXRlIGJ1ZmZlcnMgYXJlIHJlcHJlc2VudGVkIGJ5IHRoZVxyXG5cdCAqIGdpdmVuIGluZGljZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXgxIC0gVGhlIGRlc3RpbmF0aW9uIGluZGV4IGludG8gdGhpcyBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyQXR0cmlidXRlfSBhdHRyaWJ1dGUgLSBUaGUgYnVmZmVyIGF0dHJpYnV0ZSB0byBjb3B5IGZyb20uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4MiAtIFRoZSBzb3VyY2UgaW5kZXggaW50byB0aGUgZ2l2ZW4gYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKiBAcmV0dXJuIHtCdWZmZXJBdHRyaWJ1dGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y29weUF0KCBpbmRleDEsIGF0dHJpYnV0ZSwgaW5kZXgyICkge1xyXG5cclxuXHRcdGluZGV4MSAqPSB0aGlzLml0ZW1TaXplO1xyXG5cdFx0aW5kZXgyICo9IGF0dHJpYnV0ZS5pdGVtU2l6ZTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSB0aGlzLml0ZW1TaXplOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdHRoaXMuYXJyYXlbIGluZGV4MSArIGkgXSA9IGF0dHJpYnV0ZS5hcnJheVsgaW5kZXgyICsgaSBdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb3BpZXMgdGhlIGdpdmVuIGFycmF5IGRhdGEgaW50byB0aGlzIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geyhUeXBlZEFycmF5fEFycmF5KX0gYXJyYXkgLSBUaGUgYXJyYXkgdG8gY29weS5cclxuXHQgKiBAcmV0dXJuIHtCdWZmZXJBdHRyaWJ1dGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y29weUFycmF5KCBhcnJheSApIHtcclxuXHJcblx0XHR0aGlzLmFycmF5LnNldCggYXJyYXkgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBcHBsaWVzIHRoZSBnaXZlbiAzeDMgbWF0cml4IHRvIHRoZSBnaXZlbiBhdHRyaWJ1dGUuIFdvcmtzIHdpdGhcclxuXHQgKiBpdGVtIHNpemUgYDJgIGFuZCBgM2AuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDN9IG0gLSBUaGUgbWF0cml4IHRvIGFwcGx5LlxyXG5cdCAqIEByZXR1cm4ge0J1ZmZlckF0dHJpYnV0ZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRhcHBseU1hdHJpeDMoIG0gKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLml0ZW1TaXplID09PSAyICkge1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gdGhpcy5jb3VudDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdF92ZWN0b3IyLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHRoaXMsIGkgKTtcclxuXHRcdFx0XHRfdmVjdG9yMi5hcHBseU1hdHJpeDMoIG0gKTtcclxuXHJcblx0XHRcdFx0dGhpcy5zZXRYWSggaSwgX3ZlY3RvcjIueCwgX3ZlY3RvcjIueSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHRoaXMuaXRlbVNpemUgPT09IDMgKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSB0aGlzLmNvdW50OyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0X3ZlY3Rvci5mcm9tQnVmZmVyQXR0cmlidXRlKCB0aGlzLCBpICk7XHJcblx0XHRcdFx0X3ZlY3Rvci5hcHBseU1hdHJpeDMoIG0gKTtcclxuXHJcblx0XHRcdFx0dGhpcy5zZXRYWVooIGksIF92ZWN0b3IueCwgX3ZlY3Rvci55LCBfdmVjdG9yLnogKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQXBwbGllcyB0aGUgZ2l2ZW4gNHg0IG1hdHJpeCB0byB0aGUgZ2l2ZW4gYXR0cmlidXRlLiBPbmx5IHdvcmtzIHdpdGhcclxuXHQgKiBpdGVtIHNpemUgYDNgLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRyaXg0fSBtIC0gVGhlIG1hdHJpeCB0byBhcHBseS5cclxuXHQgKiBAcmV0dXJuIHtCdWZmZXJBdHRyaWJ1dGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0YXBwbHlNYXRyaXg0KCBtICkge1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHRoaXMuY291bnQ7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0X3ZlY3Rvci5mcm9tQnVmZmVyQXR0cmlidXRlKCB0aGlzLCBpICk7XHJcblxyXG5cdFx0XHRfdmVjdG9yLmFwcGx5TWF0cml4NCggbSApO1xyXG5cclxuXHRcdFx0dGhpcy5zZXRYWVooIGksIF92ZWN0b3IueCwgX3ZlY3Rvci55LCBfdmVjdG9yLnogKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQXBwbGllcyB0aGUgZ2l2ZW4gM3gzIG5vcm1hbCBtYXRyaXggdG8gdGhlIGdpdmVuIGF0dHJpYnV0ZS4gT25seSB3b3JrcyB3aXRoXHJcblx0ICogaXRlbSBzaXplIGAzYC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4M30gbSAtIFRoZSBub3JtYWwgbWF0cml4IHRvIGFwcGx5LlxyXG5cdCAqIEByZXR1cm4ge0J1ZmZlckF0dHJpYnV0ZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRhcHBseU5vcm1hbE1hdHJpeCggbSApIHtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSB0aGlzLmNvdW50OyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdF92ZWN0b3IuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggdGhpcywgaSApO1xyXG5cclxuXHRcdFx0X3ZlY3Rvci5hcHBseU5vcm1hbE1hdHJpeCggbSApO1xyXG5cclxuXHRcdFx0dGhpcy5zZXRYWVooIGksIF92ZWN0b3IueCwgX3ZlY3Rvci55LCBfdmVjdG9yLnogKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQXBwbGllcyB0aGUgZ2l2ZW4gNHg0IG1hdHJpeCB0byB0aGUgZ2l2ZW4gYXR0cmlidXRlLiBPbmx5IHdvcmtzIHdpdGhcclxuXHQgKiBpdGVtIHNpemUgYDNgIGFuZCB3aXRoIGRpcmVjdGlvbiB2ZWN0b3JzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRyaXg0fSBtIC0gVGhlIG1hdHJpeCB0byBhcHBseS5cclxuXHQgKiBAcmV0dXJuIHtCdWZmZXJBdHRyaWJ1dGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0dHJhbnNmb3JtRGlyZWN0aW9uKCBtICkge1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHRoaXMuY291bnQ7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0X3ZlY3Rvci5mcm9tQnVmZmVyQXR0cmlidXRlKCB0aGlzLCBpICk7XHJcblxyXG5cdFx0XHRfdmVjdG9yLnRyYW5zZm9ybURpcmVjdGlvbiggbSApO1xyXG5cclxuXHRcdFx0dGhpcy5zZXRYWVooIGksIF92ZWN0b3IueCwgX3ZlY3Rvci55LCBfdmVjdG9yLnogKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZ2l2ZW4gYXJyYXkgZGF0YSBpbiB0aGUgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7KFR5cGVkQXJyYXl8QXJyYXkpfSB2YWx1ZSAtIFRoZSBhcnJheSBkYXRhIHRvIHNldC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW29mZnNldD0wXSAtIFRoZSBvZmZzZXQgaW4gdGhpcyBidWZmZXIgYXR0cmlidXRlJ3MgYXJyYXkuXHJcblx0ICogQHJldHVybiB7QnVmZmVyQXR0cmlidXRlfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldCggdmFsdWUsIG9mZnNldCA9IDAgKSB7XHJcblxyXG5cdFx0Ly8gTWF0Y2hpbmcgQnVmZmVyQXR0cmlidXRlIGNvbnN0cnVjdG9yLCBkbyBub3Qgbm9ybWFsaXplIHRoZSBhcnJheS5cclxuXHRcdHRoaXMuYXJyYXkuc2V0KCB2YWx1ZSwgb2Zmc2V0ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgZ2l2ZW4gY29tcG9uZW50IG9mIHRoZSB2ZWN0b3IgYXQgdGhlIGdpdmVuIGluZGV4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluZGV4IGludG8gdGhlIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGNvbXBvbmVudCAtIFRoZSBjb21wb25lbnQgaW5kZXguXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgcmV0dXJuZWQgdmFsdWUuXHJcblx0ICovXHJcblx0Z2V0Q29tcG9uZW50KCBpbmRleCwgY29tcG9uZW50ICkge1xyXG5cclxuXHRcdGxldCB2YWx1ZSA9IHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIGNvbXBvbmVudCBdO1xyXG5cclxuXHRcdGlmICggdGhpcy5ub3JtYWxpemVkICkgdmFsdWUgPSBkZW5vcm1hbGl6ZSggdmFsdWUsIHRoaXMuYXJyYXkgKTtcclxuXHJcblx0XHRyZXR1cm4gdmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZ2l2ZW4gdmFsdWUgdG8gdGhlIGdpdmVuIGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yIGF0IHRoZSBnaXZlbiBpbmRleC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBpbnRvIHRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBjb21wb25lbnQgLSBUaGUgY29tcG9uZW50IGluZGV4LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBzZXQuXHJcblx0ICogQHJldHVybiB7QnVmZmVyQXR0cmlidXRlfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldENvbXBvbmVudCggaW5kZXgsIGNvbXBvbmVudCwgdmFsdWUgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5vcm1hbGl6ZWQgKSB2YWx1ZSA9IG5vcm1hbGl6ZSggdmFsdWUsIHRoaXMuYXJyYXkgKTtcclxuXHJcblx0XHR0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgKyBjb21wb25lbnQgXSA9IHZhbHVlO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHggY29tcG9uZW50IG9mIHRoZSB2ZWN0b3IgYXQgdGhlIGdpdmVuIGluZGV4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluZGV4IGludG8gdGhlIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgeCBjb21wb25lbnQuXHJcblx0ICovXHJcblx0Z2V0WCggaW5kZXggKSB7XHJcblxyXG5cdFx0bGV0IHggPSB0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgXTtcclxuXHJcblx0XHRpZiAoIHRoaXMubm9ybWFsaXplZCApIHggPSBkZW5vcm1hbGl6ZSggeCwgdGhpcy5hcnJheSApO1xyXG5cclxuXHRcdHJldHVybiB4O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHggY29tcG9uZW50IG9mIHRoZSB2ZWN0b3IgYXQgdGhlIGdpdmVuIGluZGV4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluZGV4IGludG8gdGhlIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgdmFsdWUgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge0J1ZmZlckF0dHJpYnV0ZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXRYKCBpbmRleCwgeCApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMubm9ybWFsaXplZCApIHggPSBub3JtYWxpemUoIHgsIHRoaXMuYXJyYXkgKTtcclxuXHJcblx0XHR0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgXSA9IHg7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgeSBjb21wb25lbnQgb2YgdGhlIHZlY3RvciBhdCB0aGUgZ2l2ZW4gaW5kZXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggaW50byB0aGUgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB5IGNvbXBvbmVudC5cclxuXHQgKi9cclxuXHRnZXRZKCBpbmRleCApIHtcclxuXHJcblx0XHRsZXQgeSA9IHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDEgXTtcclxuXHJcblx0XHRpZiAoIHRoaXMubm9ybWFsaXplZCApIHkgPSBkZW5vcm1hbGl6ZSggeSwgdGhpcy5hcnJheSApO1xyXG5cclxuXHRcdHJldHVybiB5O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHkgY29tcG9uZW50IG9mIHRoZSB2ZWN0b3IgYXQgdGhlIGdpdmVuIGluZGV4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluZGV4IGludG8gdGhlIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmFsdWUgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge0J1ZmZlckF0dHJpYnV0ZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXRZKCBpbmRleCwgeSApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMubm9ybWFsaXplZCApIHkgPSBub3JtYWxpemUoIHksIHRoaXMuYXJyYXkgKTtcclxuXHJcblx0XHR0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgKyAxIF0gPSB5O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHogY29tcG9uZW50IG9mIHRoZSB2ZWN0b3IgYXQgdGhlIGdpdmVuIGluZGV4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluZGV4IGludG8gdGhlIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgeiBjb21wb25lbnQuXHJcblx0ICovXHJcblx0Z2V0WiggaW5kZXggKSB7XHJcblxyXG5cdFx0bGV0IHogPSB0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgKyAyIF07XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5vcm1hbGl6ZWQgKSB6ID0gZGVub3JtYWxpemUoIHosIHRoaXMuYXJyYXkgKTtcclxuXHJcblx0XHRyZXR1cm4gejtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB6IGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yIGF0IHRoZSBnaXZlbiBpbmRleC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBpbnRvIHRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB6IC0gVGhlIHZhbHVlIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtCdWZmZXJBdHRyaWJ1dGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0WiggaW5kZXgsIHogKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5vcm1hbGl6ZWQgKSB6ID0gbm9ybWFsaXplKCB6LCB0aGlzLmFycmF5ICk7XHJcblxyXG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMiBdID0gejtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSB3IGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yIGF0IHRoZSBnaXZlbiBpbmRleC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBpbnRvIHRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIHcgY29tcG9uZW50LlxyXG5cdCAqL1xyXG5cdGdldFcoIGluZGV4ICkge1xyXG5cclxuXHRcdGxldCB3ID0gdGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMyBdO1xyXG5cclxuXHRcdGlmICggdGhpcy5ub3JtYWxpemVkICkgdyA9IGRlbm9ybWFsaXplKCB3LCB0aGlzLmFycmF5ICk7XHJcblxyXG5cdFx0cmV0dXJuIHc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdyBjb21wb25lbnQgb2YgdGhlIHZlY3RvciBhdCB0aGUgZ2l2ZW4gaW5kZXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggaW50byB0aGUgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdyAtIFRoZSB2YWx1ZSB0byBzZXQuXHJcblx0ICogQHJldHVybiB7QnVmZmVyQXR0cmlidXRlfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldFcoIGluZGV4LCB3ICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5ub3JtYWxpemVkICkgdyA9IG5vcm1hbGl6ZSggdywgdGhpcy5hcnJheSApO1xyXG5cclxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDMgXSA9IHc7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgeCBhbmQgeSBjb21wb25lbnQgb2YgdGhlIHZlY3RvciBhdCB0aGUgZ2l2ZW4gaW5kZXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggaW50byB0aGUgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB2YWx1ZSBmb3IgdGhlIHggY29tcG9uZW50IHRvIHNldC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB2YWx1ZSBmb3IgdGhlIHkgY29tcG9uZW50IHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtCdWZmZXJBdHRyaWJ1dGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0WFkoIGluZGV4LCB4LCB5ICkge1xyXG5cclxuXHRcdGluZGV4ICo9IHRoaXMuaXRlbVNpemU7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5vcm1hbGl6ZWQgKSB7XHJcblxyXG5cdFx0XHR4ID0gbm9ybWFsaXplKCB4LCB0aGlzLmFycmF5ICk7XHJcblx0XHRcdHkgPSBub3JtYWxpemUoIHksIHRoaXMuYXJyYXkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAwIF0gPSB4O1xyXG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAxIF0gPSB5O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHgsIHkgYW5kIHogY29tcG9uZW50IG9mIHRoZSB2ZWN0b3IgYXQgdGhlIGdpdmVuIGluZGV4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluZGV4IGludG8gdGhlIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgdmFsdWUgZm9yIHRoZSB4IGNvbXBvbmVudCB0byBzZXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmFsdWUgZm9yIHRoZSB5IGNvbXBvbmVudCB0byBzZXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHogLSBUaGUgdmFsdWUgZm9yIHRoZSB6IGNvbXBvbmVudCB0byBzZXQuXHJcblx0ICogQHJldHVybiB7QnVmZmVyQXR0cmlidXRlfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldFhZWiggaW5kZXgsIHgsIHksIHogKSB7XHJcblxyXG5cdFx0aW5kZXggKj0gdGhpcy5pdGVtU2l6ZTtcclxuXHJcblx0XHRpZiAoIHRoaXMubm9ybWFsaXplZCApIHtcclxuXHJcblx0XHRcdHggPSBub3JtYWxpemUoIHgsIHRoaXMuYXJyYXkgKTtcclxuXHRcdFx0eSA9IG5vcm1hbGl6ZSggeSwgdGhpcy5hcnJheSApO1xyXG5cdFx0XHR6ID0gbm9ybWFsaXplKCB6LCB0aGlzLmFycmF5ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMCBdID0geDtcclxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMSBdID0geTtcclxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMiBdID0gejtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB4LCB5LCB6IGFuZCB3IGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yIGF0IHRoZSBnaXZlbiBpbmRleC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBpbnRvIHRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHZhbHVlIGZvciB0aGUgeCBjb21wb25lbnQgdG8gc2V0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHZhbHVlIGZvciB0aGUgeSBjb21wb25lbnQgdG8gc2V0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB6IC0gVGhlIHZhbHVlIGZvciB0aGUgeiBjb21wb25lbnQgdG8gc2V0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB3IC0gVGhlIHZhbHVlIGZvciB0aGUgdyBjb21wb25lbnQgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge0J1ZmZlckF0dHJpYnV0ZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXRYWVpXKCBpbmRleCwgeCwgeSwgeiwgdyApIHtcclxuXHJcblx0XHRpbmRleCAqPSB0aGlzLml0ZW1TaXplO1xyXG5cclxuXHRcdGlmICggdGhpcy5ub3JtYWxpemVkICkge1xyXG5cclxuXHRcdFx0eCA9IG5vcm1hbGl6ZSggeCwgdGhpcy5hcnJheSApO1xyXG5cdFx0XHR5ID0gbm9ybWFsaXplKCB5LCB0aGlzLmFycmF5ICk7XHJcblx0XHRcdHogPSBub3JtYWxpemUoIHosIHRoaXMuYXJyYXkgKTtcclxuXHRcdFx0dyA9IG5vcm1hbGl6ZSggdywgdGhpcy5hcnJheSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDAgXSA9IHg7XHJcblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDEgXSA9IHk7XHJcblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDIgXSA9IHo7XHJcblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDMgXSA9IHc7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZ2l2ZW4gY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBleGVjdXRlZCBhZnRlciB0aGUgUmVuZGVyZXIgaGFzIHRyYW5zZmVycmVkXHJcblx0ICogdGhlIGF0dHJpYnV0ZSBhcnJheSBkYXRhIHRvIHRoZSBHUFUuIENhbiBiZSB1c2VkIHRvIHBlcmZvcm0gY2xlYW4tdXAgb3BlcmF0aW9ucyBhZnRlclxyXG5cdCAqIHRoZSB1cGxvYWQgd2hlbiBhdHRyaWJ1dGUgZGF0YSBhcmUgbm90IG5lZWRlZCBhbnltb3JlIG9uIHRoZSBDUFUgc2lkZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIC0gVGhlIGBvblVwbG9hZCgpYCBjYWxsYmFjay5cclxuXHQgKiBAcmV0dXJuIHtCdWZmZXJBdHRyaWJ1dGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0b25VcGxvYWQoIGNhbGxiYWNrICkge1xyXG5cclxuXHRcdHRoaXMub25VcGxvYWRDYWxsYmFjayA9IGNhbGxiYWNrO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBuZXcgYnVmZmVyIGF0dHJpYnV0ZSB3aXRoIGNvcGllZCB2YWx1ZXMgZnJvbSB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7QnVmZmVyQXR0cmlidXRlfSBBIGNsb25lIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y2xvbmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLmFycmF5LCB0aGlzLml0ZW1TaXplICkuY29weSggdGhpcyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNlcmlhbGl6ZXMgdGhlIGJ1ZmZlciBhdHRyaWJ1dGUgaW50byBKU09OLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7T2JqZWN0fSBBIEpTT04gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc2VyaWFsaXplZCBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqL1xyXG5cdHRvSlNPTigpIHtcclxuXHJcblx0XHRjb25zdCBkYXRhID0ge1xyXG5cdFx0XHRpdGVtU2l6ZTogdGhpcy5pdGVtU2l6ZSxcclxuXHRcdFx0dHlwZTogdGhpcy5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLFxyXG5cdFx0XHRhcnJheTogQXJyYXkuZnJvbSggdGhpcy5hcnJheSApLFxyXG5cdFx0XHRub3JtYWxpemVkOiB0aGlzLm5vcm1hbGl6ZWRcclxuXHRcdH07XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5hbWUgIT09ICcnICkgZGF0YS5uYW1lID0gdGhpcy5uYW1lO1xyXG5cdFx0aWYgKCB0aGlzLnVzYWdlICE9PSBTdGF0aWNEcmF3VXNhZ2UgKSBkYXRhLnVzYWdlID0gdGhpcy51c2FnZTtcclxuXHJcblx0XHRyZXR1cm4gZGF0YTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIENvbnZlbmllbnQgY2xhc3MgdGhhdCBjYW4gYmUgdXNlZCB3aGVuIGNyZWF0aW5nIGEgYEludDhgIGJ1ZmZlciBhdHRyaWJ1dGUgd2l0aFxyXG4gKiBhIHBsYWluIGBBcnJheWAgaW5zdGFuY2UuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBCdWZmZXJBdHRyaWJ1dGVcclxuICovXHJcbmNsYXNzIEludDhCdWZmZXJBdHRyaWJ1dGUgZXh0ZW5kcyBCdWZmZXJBdHRyaWJ1dGUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geyhBcnJheTxudW1iZXI+fEludDhBcnJheSl9IGFycmF5IC0gVGhlIGFycmF5IGhvbGRpbmcgdGhlIGF0dHJpYnV0ZSBkYXRhLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpdGVtU2l6ZSAtIFRoZSBpdGVtIHNpemUuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbbm9ybWFsaXplZD1mYWxzZV0gLSBXaGV0aGVyIHRoZSBkYXRhIGFyZSBub3JtYWxpemVkIG9yIG5vdC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkge1xyXG5cclxuXHRcdHN1cGVyKCBuZXcgSW50OEFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQ29udmVuaWVudCBjbGFzcyB0aGF0IGNhbiBiZSB1c2VkIHdoZW4gY3JlYXRpbmcgYSBgVUludDhgIGJ1ZmZlciBhdHRyaWJ1dGUgd2l0aFxyXG4gKiBhIHBsYWluIGBBcnJheWAgaW5zdGFuY2UuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBCdWZmZXJBdHRyaWJ1dGVcclxuICovXHJcbmNsYXNzIFVpbnQ4QnVmZmVyQXR0cmlidXRlIGV4dGVuZHMgQnVmZmVyQXR0cmlidXRlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHsoQXJyYXk8bnVtYmVyPnxVaW50OEFycmF5KX0gYXJyYXkgLSBUaGUgYXJyYXkgaG9sZGluZyB0aGUgYXR0cmlidXRlIGRhdGEuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGl0ZW1TaXplIC0gVGhlIGl0ZW0gc2l6ZS5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtub3JtYWxpemVkPWZhbHNlXSAtIFdoZXRoZXIgdGhlIGRhdGEgYXJlIG5vcm1hbGl6ZWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5ldyBVaW50OEFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQ29udmVuaWVudCBjbGFzcyB0aGF0IGNhbiBiZSB1c2VkIHdoZW4gY3JlYXRpbmcgYSBgVUludDhDbGFtcGVkYCBidWZmZXIgYXR0cmlidXRlIHdpdGhcclxuICogYSBwbGFpbiBgQXJyYXlgIGluc3RhbmNlLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQnVmZmVyQXR0cmlidXRlXHJcbiAqL1xyXG5jbGFzcyBVaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGUgZXh0ZW5kcyBCdWZmZXJBdHRyaWJ1dGUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geyhBcnJheTxudW1iZXI+fFVpbnQ4Q2xhbXBlZEFycmF5KX0gYXJyYXkgLSBUaGUgYXJyYXkgaG9sZGluZyB0aGUgYXR0cmlidXRlIGRhdGEuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGl0ZW1TaXplIC0gVGhlIGl0ZW0gc2l6ZS5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtub3JtYWxpemVkPWZhbHNlXSAtIFdoZXRoZXIgdGhlIGRhdGEgYXJlIG5vcm1hbGl6ZWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5ldyBVaW50OENsYW1wZWRBcnJheSggYXJyYXkgKSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIENvbnZlbmllbnQgY2xhc3MgdGhhdCBjYW4gYmUgdXNlZCB3aGVuIGNyZWF0aW5nIGEgYEludDE2YCBidWZmZXIgYXR0cmlidXRlIHdpdGhcclxuICogYSBwbGFpbiBgQXJyYXlgIGluc3RhbmNlLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQnVmZmVyQXR0cmlidXRlXHJcbiAqL1xyXG5jbGFzcyBJbnQxNkJ1ZmZlckF0dHJpYnV0ZSBleHRlbmRzIEJ1ZmZlckF0dHJpYnV0ZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7KEFycmF5PG51bWJlcj58SW50MTZBcnJheSl9IGFycmF5IC0gVGhlIGFycmF5IGhvbGRpbmcgdGhlIGF0dHJpYnV0ZSBkYXRhLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpdGVtU2l6ZSAtIFRoZSBpdGVtIHNpemUuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbbm9ybWFsaXplZD1mYWxzZV0gLSBXaGV0aGVyIHRoZSBkYXRhIGFyZSBub3JtYWxpemVkIG9yIG5vdC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkge1xyXG5cclxuXHRcdHN1cGVyKCBuZXcgSW50MTZBcnJheSggYXJyYXkgKSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIENvbnZlbmllbnQgY2xhc3MgdGhhdCBjYW4gYmUgdXNlZCB3aGVuIGNyZWF0aW5nIGEgYFVJbnQxNmAgYnVmZmVyIGF0dHJpYnV0ZSB3aXRoXHJcbiAqIGEgcGxhaW4gYEFycmF5YCBpbnN0YW5jZS5cclxuICpcclxuICogQGF1Z21lbnRzIEJ1ZmZlckF0dHJpYnV0ZVxyXG4gKi9cclxuY2xhc3MgVWludDE2QnVmZmVyQXR0cmlidXRlIGV4dGVuZHMgQnVmZmVyQXR0cmlidXRlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHsoQXJyYXk8bnVtYmVyPnxVaW50MTZBcnJheSl9IGFycmF5IC0gVGhlIGFycmF5IGhvbGRpbmcgdGhlIGF0dHJpYnV0ZSBkYXRhLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpdGVtU2l6ZSAtIFRoZSBpdGVtIHNpemUuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbbm9ybWFsaXplZD1mYWxzZV0gLSBXaGV0aGVyIHRoZSBkYXRhIGFyZSBub3JtYWxpemVkIG9yIG5vdC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkge1xyXG5cclxuXHRcdHN1cGVyKCBuZXcgVWludDE2QXJyYXkoIGFycmF5ICksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb252ZW5pZW50IGNsYXNzIHRoYXQgY2FuIGJlIHVzZWQgd2hlbiBjcmVhdGluZyBhIGBJbnQzMmAgYnVmZmVyIGF0dHJpYnV0ZSB3aXRoXHJcbiAqIGEgcGxhaW4gYEFycmF5YCBpbnN0YW5jZS5cclxuICpcclxuICogQGF1Z21lbnRzIEJ1ZmZlckF0dHJpYnV0ZVxyXG4gKi9cclxuY2xhc3MgSW50MzJCdWZmZXJBdHRyaWJ1dGUgZXh0ZW5kcyBCdWZmZXJBdHRyaWJ1dGUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geyhBcnJheTxudW1iZXI+fEludDMyQXJyYXkpfSBhcnJheSAtIFRoZSBhcnJheSBob2xkaW5nIHRoZSBhdHRyaWJ1dGUgZGF0YS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaXRlbVNpemUgLSBUaGUgaXRlbSBzaXplLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW25vcm1hbGl6ZWQ9ZmFsc2VdIC0gV2hldGhlciB0aGUgZGF0YSBhcmUgbm9ybWFsaXplZCBvciBub3QuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHtcclxuXHJcblx0XHRzdXBlciggbmV3IEludDMyQXJyYXkoIGFycmF5ICksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb252ZW5pZW50IGNsYXNzIHRoYXQgY2FuIGJlIHVzZWQgd2hlbiBjcmVhdGluZyBhIGBVSW50MzJgIGJ1ZmZlciBhdHRyaWJ1dGUgd2l0aFxyXG4gKiBhIHBsYWluIGBBcnJheWAgaW5zdGFuY2UuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBCdWZmZXJBdHRyaWJ1dGVcclxuICovXHJcbmNsYXNzIFVpbnQzMkJ1ZmZlckF0dHJpYnV0ZSBleHRlbmRzIEJ1ZmZlckF0dHJpYnV0ZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7KEFycmF5PG51bWJlcj58VWludDMyQXJyYXkpfSBhcnJheSAtIFRoZSBhcnJheSBob2xkaW5nIHRoZSBhdHRyaWJ1dGUgZGF0YS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaXRlbVNpemUgLSBUaGUgaXRlbSBzaXplLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW25vcm1hbGl6ZWQ9ZmFsc2VdIC0gV2hldGhlciB0aGUgZGF0YSBhcmUgbm9ybWFsaXplZCBvciBub3QuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHtcclxuXHJcblx0XHRzdXBlciggbmV3IFVpbnQzMkFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQ29udmVuaWVudCBjbGFzcyB0aGF0IGNhbiBiZSB1c2VkIHdoZW4gY3JlYXRpbmcgYSBgRmxvYXQxNmAgYnVmZmVyIGF0dHJpYnV0ZSB3aXRoXHJcbiAqIGEgcGxhaW4gYEFycmF5YCBpbnN0YW5jZS5cclxuICpcclxuICogVGhpcyBjbGFzcyBhdXRvbWF0aWNhbGx5IGNvbnZlcnRzIHRvIHRvIGFuZCBmcm9tIEZQMTYgc2luY2UgYEZsb2F0MTZBcnJheWAgaXMgbm90XHJcbiAqIG5hdGl2ZWx5IHN1cHBvcnRlZCBpbiBKYXZhU2NyaXB0LlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQnVmZmVyQXR0cmlidXRlXHJcbiAqL1xyXG5jbGFzcyBGbG9hdDE2QnVmZmVyQXR0cmlidXRlIGV4dGVuZHMgQnVmZmVyQXR0cmlidXRlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHsoQXJyYXk8bnVtYmVyPnxVaW50MTZBcnJheSl9IGFycmF5IC0gVGhlIGFycmF5IGhvbGRpbmcgdGhlIGF0dHJpYnV0ZSBkYXRhLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpdGVtU2l6ZSAtIFRoZSBpdGVtIHNpemUuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbbm9ybWFsaXplZD1mYWxzZV0gLSBXaGV0aGVyIHRoZSBkYXRhIGFyZSBub3JtYWxpemVkIG9yIG5vdC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkge1xyXG5cclxuXHRcdHN1cGVyKCBuZXcgVWludDE2QXJyYXkoIGFycmF5ICksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7XHJcblxyXG5cdFx0dGhpcy5pc0Zsb2F0MTZCdWZmZXJBdHRyaWJ1dGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdGdldFgoIGluZGV4ICkge1xyXG5cclxuXHRcdGxldCB4ID0gZnJvbUhhbGZGbG9hdCggdGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplIF0gKTtcclxuXHJcblx0XHRpZiAoIHRoaXMubm9ybWFsaXplZCApIHggPSBkZW5vcm1hbGl6ZSggeCwgdGhpcy5hcnJheSApO1xyXG5cclxuXHRcdHJldHVybiB4O1xyXG5cclxuXHR9XHJcblxyXG5cdHNldFgoIGluZGV4LCB4ICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5ub3JtYWxpemVkICkgeCA9IG5vcm1hbGl6ZSggeCwgdGhpcy5hcnJheSApO1xyXG5cclxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSBdID0gdG9IYWxmRmxvYXQoIHggKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHRnZXRZKCBpbmRleCApIHtcclxuXHJcblx0XHRsZXQgeSA9IGZyb21IYWxmRmxvYXQoIHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDEgXSApO1xyXG5cclxuXHRcdGlmICggdGhpcy5ub3JtYWxpemVkICkgeSA9IGRlbm9ybWFsaXplKCB5LCB0aGlzLmFycmF5ICk7XHJcblxyXG5cdFx0cmV0dXJuIHk7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0WSggaW5kZXgsIHkgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5vcm1hbGl6ZWQgKSB5ID0gbm9ybWFsaXplKCB5LCB0aGlzLmFycmF5ICk7XHJcblxyXG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMSBdID0gdG9IYWxmRmxvYXQoIHkgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHRnZXRaKCBpbmRleCApIHtcclxuXHJcblx0XHRsZXQgeiA9IGZyb21IYWxmRmxvYXQoIHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDIgXSApO1xyXG5cclxuXHRcdGlmICggdGhpcy5ub3JtYWxpemVkICkgeiA9IGRlbm9ybWFsaXplKCB6LCB0aGlzLmFycmF5ICk7XHJcblxyXG5cdFx0cmV0dXJuIHo7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0WiggaW5kZXgsIHogKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5vcm1hbGl6ZWQgKSB6ID0gbm9ybWFsaXplKCB6LCB0aGlzLmFycmF5ICk7XHJcblxyXG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMiBdID0gdG9IYWxmRmxvYXQoIHogKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHRnZXRXKCBpbmRleCApIHtcclxuXHJcblx0XHRsZXQgdyA9IGZyb21IYWxmRmxvYXQoIHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDMgXSApO1xyXG5cclxuXHRcdGlmICggdGhpcy5ub3JtYWxpemVkICkgdyA9IGRlbm9ybWFsaXplKCB3LCB0aGlzLmFycmF5ICk7XHJcblxyXG5cdFx0cmV0dXJuIHc7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0VyggaW5kZXgsIHcgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5vcm1hbGl6ZWQgKSB3ID0gbm9ybWFsaXplKCB3LCB0aGlzLmFycmF5ICk7XHJcblxyXG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMyBdID0gdG9IYWxmRmxvYXQoIHcgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHRzZXRYWSggaW5kZXgsIHgsIHkgKSB7XHJcblxyXG5cdFx0aW5kZXggKj0gdGhpcy5pdGVtU2l6ZTtcclxuXHJcblx0XHRpZiAoIHRoaXMubm9ybWFsaXplZCApIHtcclxuXHJcblx0XHRcdHggPSBub3JtYWxpemUoIHgsIHRoaXMuYXJyYXkgKTtcclxuXHRcdFx0eSA9IG5vcm1hbGl6ZSggeSwgdGhpcy5hcnJheSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDAgXSA9IHRvSGFsZkZsb2F0KCB4ICk7XHJcblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDEgXSA9IHRvSGFsZkZsb2F0KCB5ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0WFlaKCBpbmRleCwgeCwgeSwgeiApIHtcclxuXHJcblx0XHRpbmRleCAqPSB0aGlzLml0ZW1TaXplO1xyXG5cclxuXHRcdGlmICggdGhpcy5ub3JtYWxpemVkICkge1xyXG5cclxuXHRcdFx0eCA9IG5vcm1hbGl6ZSggeCwgdGhpcy5hcnJheSApO1xyXG5cdFx0XHR5ID0gbm9ybWFsaXplKCB5LCB0aGlzLmFycmF5ICk7XHJcblx0XHRcdHogPSBub3JtYWxpemUoIHosIHRoaXMuYXJyYXkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAwIF0gPSB0b0hhbGZGbG9hdCggeCApO1xyXG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAxIF0gPSB0b0hhbGZGbG9hdCggeSApO1xyXG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAyIF0gPSB0b0hhbGZGbG9hdCggeiApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdHNldFhZWlcoIGluZGV4LCB4LCB5LCB6LCB3ICkge1xyXG5cclxuXHRcdGluZGV4ICo9IHRoaXMuaXRlbVNpemU7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5vcm1hbGl6ZWQgKSB7XHJcblxyXG5cdFx0XHR4ID0gbm9ybWFsaXplKCB4LCB0aGlzLmFycmF5ICk7XHJcblx0XHRcdHkgPSBub3JtYWxpemUoIHksIHRoaXMuYXJyYXkgKTtcclxuXHRcdFx0eiA9IG5vcm1hbGl6ZSggeiwgdGhpcy5hcnJheSApO1xyXG5cdFx0XHR3ID0gbm9ybWFsaXplKCB3LCB0aGlzLmFycmF5ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMCBdID0gdG9IYWxmRmxvYXQoIHggKTtcclxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMSBdID0gdG9IYWxmRmxvYXQoIHkgKTtcclxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMiBdID0gdG9IYWxmRmxvYXQoIHogKTtcclxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMyBdID0gdG9IYWxmRmxvYXQoIHcgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIENvbnZlbmllbnQgY2xhc3MgdGhhdCBjYW4gYmUgdXNlZCB3aGVuIGNyZWF0aW5nIGEgYEZsb2F0MzJgIGJ1ZmZlciBhdHRyaWJ1dGUgd2l0aFxyXG4gKiBhIHBsYWluIGBBcnJheWAgaW5zdGFuY2UuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBCdWZmZXJBdHRyaWJ1dGVcclxuICovXHJcbmNsYXNzIEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUgZXh0ZW5kcyBCdWZmZXJBdHRyaWJ1dGUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geyhBcnJheTxudW1iZXI+fEZsb2F0MzJBcnJheSl9IGFycmF5IC0gVGhlIGFycmF5IGhvbGRpbmcgdGhlIGF0dHJpYnV0ZSBkYXRhLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpdGVtU2l6ZSAtIFRoZSBpdGVtIHNpemUuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbbm9ybWFsaXplZD1mYWxzZV0gLSBXaGV0aGVyIHRoZSBkYXRhIGFyZSBub3JtYWxpemVkIG9yIG5vdC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkge1xyXG5cclxuXHRcdHN1cGVyKCBuZXcgRmxvYXQzMkFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vL1xyXG5cclxuZXhwb3J0IHtcclxuXHRGbG9hdDMyQnVmZmVyQXR0cmlidXRlLFxyXG5cdEZsb2F0MTZCdWZmZXJBdHRyaWJ1dGUsXHJcblx0VWludDMyQnVmZmVyQXR0cmlidXRlLFxyXG5cdEludDMyQnVmZmVyQXR0cmlidXRlLFxyXG5cdFVpbnQxNkJ1ZmZlckF0dHJpYnV0ZSxcclxuXHRJbnQxNkJ1ZmZlckF0dHJpYnV0ZSxcclxuXHRVaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGUsXHJcblx0VWludDhCdWZmZXJBdHRyaWJ1dGUsXHJcblx0SW50OEJ1ZmZlckF0dHJpYnV0ZSxcclxuXHRCdWZmZXJBdHRyaWJ1dGVcclxufTtcclxuIiwiaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjIuanMnO1xyXG5pbXBvcnQgeyBCb3gzIH0gZnJvbSAnLi4vbWF0aC9Cb3gzLmpzJztcclxuaW1wb3J0IHsgRXZlbnREaXNwYXRjaGVyIH0gZnJvbSAnLi9FdmVudERpc3BhdGNoZXIuanMnO1xyXG5pbXBvcnQgeyBCdWZmZXJBdHRyaWJ1dGUsIEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUsIFVpbnQxNkJ1ZmZlckF0dHJpYnV0ZSwgVWludDMyQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi9CdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5pbXBvcnQgeyBTcGhlcmUgfSBmcm9tICcuLi9tYXRoL1NwaGVyZS5qcyc7XHJcbmltcG9ydCB7IE9iamVjdDNEIH0gZnJvbSAnLi9PYmplY3QzRC5qcyc7XHJcbmltcG9ydCB7IE1hdHJpeDQgfSBmcm9tICcuLi9tYXRoL01hdHJpeDQuanMnO1xyXG5pbXBvcnQgeyBNYXRyaXgzIH0gZnJvbSAnLi4vbWF0aC9NYXRyaXgzLmpzJztcclxuaW1wb3J0IHsgZ2VuZXJhdGVVVUlEIH0gZnJvbSAnLi4vbWF0aC9NYXRoVXRpbHMuanMnO1xyXG5pbXBvcnQgeyBhcnJheU5lZWRzVWludDMyIH0gZnJvbSAnLi4vdXRpbHMuanMnO1xyXG5cclxubGV0IF9pZCA9IDA7XHJcblxyXG5jb25zdCBfbTEgPSAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXg0KCk7XHJcbmNvbnN0IF9vYmogPSAvKkBfX1BVUkVfXyovIG5ldyBPYmplY3QzRCgpO1xyXG5jb25zdCBfb2Zmc2V0ID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfYm94ID0gLypAX19QVVJFX18qLyBuZXcgQm94MygpO1xyXG5jb25zdCBfYm94TW9ycGhUYXJnZXRzID0gLypAX19QVVJFX18qLyBuZXcgQm94MygpO1xyXG5jb25zdCBfdmVjdG9yID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5cclxuLyoqXHJcbiAqIEEgcmVwcmVzZW50YXRpb24gb2YgbWVzaCwgbGluZSwgb3IgcG9pbnQgZ2VvbWV0cnkuIEluY2x1ZGVzIHZlcnRleFxyXG4gKiBwb3NpdGlvbnMsIGZhY2UgaW5kaWNlcywgbm9ybWFscywgY29sb3JzLCBVVnMsIGFuZCBjdXN0b20gYXR0cmlidXRlc1xyXG4gKiB3aXRoaW4gYnVmZmVycywgcmVkdWNpbmcgdGhlIGNvc3Qgb2YgcGFzc2luZyBhbGwgdGhpcyBkYXRhIHRvIHRoZSBHUFUuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGdlb21ldHJ5ID0gbmV3IFRIUkVFLkJ1ZmZlckdlb21ldHJ5KCk7XHJcbiAqIC8vIGNyZWF0ZSBhIHNpbXBsZSBzcXVhcmUgc2hhcGUuIFdlIGR1cGxpY2F0ZSB0aGUgdG9wIGxlZnQgYW5kIGJvdHRvbSByaWdodFxyXG4gKiAvLyB2ZXJ0aWNlcyBiZWNhdXNlIGVhY2ggdmVydGV4IG5lZWRzIHRvIGFwcGVhciBvbmNlIHBlciB0cmlhbmdsZS5cclxuICogY29uc3QgdmVydGljZXMgPSBuZXcgRmxvYXQzMkFycmF5KCBbXHJcbiAqIFx0LTEuMCwgLTEuMCwgIDEuMCwgLy8gdjBcclxuICogXHQgMS4wLCAtMS4wLCAgMS4wLCAvLyB2MVxyXG4gKiBcdCAxLjAsICAxLjAsICAxLjAsIC8vIHYyXHJcbiAqXHJcbiAqIFx0IDEuMCwgIDEuMCwgIDEuMCwgLy8gdjNcclxuICogXHQtMS4wLCAgMS4wLCAgMS4wLCAvLyB2NFxyXG4gKiBcdC0xLjAsIC0xLjAsICAxLjAgIC8vIHY1XHJcbiAqIF0gKTtcclxuICogLy8gaXRlbVNpemUgPSAzIGJlY2F1c2UgdGhlcmUgYXJlIDMgdmFsdWVzIChjb21wb25lbnRzKSBwZXIgdmVydGV4XHJcbiAqIGdlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IFRIUkVFLkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xyXG4gKiBjb25zdCBtYXRlcmlhbCA9IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogMHhmZjAwMDAgfSApO1xyXG4gKiBjb25zdCBtZXNoID0gbmV3IFRIUkVFLk1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIEV2ZW50RGlzcGF0Y2hlclxyXG4gKi9cclxuY2xhc3MgQnVmZmVyR2VvbWV0cnkgZXh0ZW5kcyBFdmVudERpc3BhdGNoZXIge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGdlb21ldHJ5LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzQnVmZmVyR2VvbWV0cnkgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIElEIG9mIHRoZSBnZW9tZXRyeS5cclxuXHRcdCAqXHJcblx0XHQgKiBAbmFtZSBCdWZmZXJHZW9tZXRyeSNpZFxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICovXHJcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsICdpZCcsIHsgdmFsdWU6IF9pZCArKyB9ICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgVVVJRCBvZiB0aGUgZ2VvbWV0cnkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnV1aWQgPSBnZW5lcmF0ZVVVSUQoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBuYW1lIG9mIHRoZSBnZW9tZXRyeS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5hbWUgPSAnJztcclxuXHRcdHRoaXMudHlwZSA9ICdCdWZmZXJHZW9tZXRyeSc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbGxvd3MgZm9yIHZlcnRpY2VzIHRvIGJlIHJlLXVzZWQgYWNyb3NzIG11bHRpcGxlIHRyaWFuZ2xlczsgdGhpcyBpc1xyXG5cdFx0ICogY2FsbGVkIHVzaW5nIFwiaW5kZXhlZCB0cmlhbmdsZXNcIi4gRWFjaCB0cmlhbmdsZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlXHJcblx0XHQgKiBpbmRpY2VzIG9mIHRocmVlIHZlcnRpY2VzLiBUaGlzIGF0dHJpYnV0ZSB0aGVyZWZvcmUgc3RvcmVzIHRoZSBpbmRleCBvZlxyXG5cdFx0ICogZWFjaCB2ZXJ0ZXggZm9yIGVhY2ggdHJpYW5ndWxhciBmYWNlLiBJZiB0aGlzIGF0dHJpYnV0ZSBpcyBub3Qgc2V0LCB0aGVcclxuXHRcdCAqIHJlbmRlcmVyIGFzc3VtZXMgdGhhdCBlYWNoIHRocmVlIGNvbnRpZ3VvdXMgcG9zaXRpb25zIHJlcHJlc2VudCBhIHNpbmdsZSB0cmlhbmdsZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P0J1ZmZlckF0dHJpYnV0ZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pbmRleCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIChzdG9yYWdlKSBidWZmZXIgYXR0cmlidXRlIHdoaWNoIHdhcyBnZW5lcmF0ZWQgd2l0aCBhIGNvbXB1dGUgc2hhZGVyIGFuZFxyXG5cdFx0ICogbm93IGRlZmluZXMgaW5kaXJlY3QgZHJhdyBjYWxscy5cclxuXHRcdCAqXHJcblx0XHQgKiBDYW4gb25seSBiZSB1c2VkIHdpdGgge0BsaW5rIFdlYkdQVVJlbmRlcmVyfSBhbmQgYSBXZWJHUFUgYmFja2VuZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P0J1ZmZlckF0dHJpYnV0ZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pbmRpcmVjdCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGRpY3Rpb25hcnkgaGFzIGFzIGlkIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gYmUgc2V0IGFuZCBhcyB2YWx1ZVxyXG5cdFx0ICogdGhlIGJ1ZmZlciBhdHRyaWJ1dGUgdG8gc2V0IGl0IHRvLiBSYXRoZXIgdGhhbiBhY2Nlc3NpbmcgdGhpcyBwcm9wZXJ0eSBkaXJlY3RseSxcclxuXHRcdCAqIHVzZSBgc2V0QXR0cmlidXRlKClgIGFuZCBgZ2V0QXR0cmlidXRlKClgIHRvIGFjY2VzcyBhdHRyaWJ1dGVzIG9mIHRoaXMgZ2VvbWV0cnkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdDxzdHJpbmcsKEJ1ZmZlckF0dHJpYnV0ZXxJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSk+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmF0dHJpYnV0ZXMgPSB7fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZGljdGlvbmFyeSBob2xkcyB0aGUgbW9ycGggdGFyZ2V0cyBvZiB0aGUgZ2VvbWV0cnkuXHJcblx0XHQgKlxyXG5cdFx0ICogTm90ZTogT25jZSB0aGUgZ2VvbWV0cnkgaGFzIGJlZW4gcmVuZGVyZWQsIHRoZSBtb3JwaCBhdHRyaWJ1dGUgZGF0YSBjYW5ub3RcclxuXHRcdCAqIGJlIGNoYW5nZWQuIFlvdSB3aWxsIGhhdmUgdG8gY2FsbCBgZGlzcG9zZSgpPywgYW5kIGNyZWF0ZSBhIG5ldyBnZW9tZXRyeSBpbnN0YW5jZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1vcnBoQXR0cmlidXRlcyA9IHt9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVXNlZCB0byBjb250cm9sIHRoZSBtb3JwaCB0YXJnZXQgYmVoYXZpb3I7IHdoZW4gc2V0IHRvIGB0cnVlYCwgdGhlIG1vcnBoXHJcblx0XHQgKiB0YXJnZXQgZGF0YSBpcyB0cmVhdGVkIGFzIHJlbGF0aXZlIG9mZnNldHMsIHJhdGhlciB0aGFuIGFzIGFic29sdXRlXHJcblx0XHQgKiBwb3NpdGlvbnMvbm9ybWFscy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmUgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNwbGl0IHRoZSBnZW9tZXRyeSBpbnRvIGdyb3VwcywgZWFjaCBvZiB3aGljaCB3aWxsIGJlIHJlbmRlcmVkIGluIGFcclxuXHRcdCAqIHNlcGFyYXRlIGRyYXcgY2FsbC4gVGhpcyBhbGxvd3MgYW4gYXJyYXkgb2YgbWF0ZXJpYWxzIHRvIGJlIHVzZWQgd2l0aCB0aGUgZ2VvbWV0cnkuXHJcblx0XHQgKlxyXG5cdFx0ICogVXNlIGBhZGRHcm91cCgpYCBhbmQgYGNsZWFyR3JvdXBzKClgIHRvIGVkaXQgZ3JvdXBzLCByYXRoZXIgdGhhbiBtb2RpZnlpbmcgdGhpcyBhcnJheSBkaXJlY3RseS5cclxuXHRcdCAqXHJcblx0XHQgKiBFdmVyeSB2ZXJ0ZXggYW5kIGluZGV4IG11c3QgYmVsb25nIHRvIGV4YWN0bHkgb25lIGdyb3VwIOKAlCBncm91cHMgbXVzdCBub3Qgc2hhcmUgdmVydGljZXMgb3JcclxuXHRcdCAqIGluZGljZXMsIGFuZCBtdXN0IG5vdCBsZWF2ZSB2ZXJ0aWNlcyBvciBpbmRpY2VzIHVudXNlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8T2JqZWN0Pn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ncm91cHMgPSBbXTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEJvdW5kaW5nIGJveCBmb3IgdGhlIGdlb21ldHJ5IHdoaWNoIGNhbiBiZSBjYWxjdWxhdGVkIHdpdGggYGNvbXB1dGVCb3VuZGluZ0JveCgpYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Qm94M31cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ib3VuZGluZ0JveCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBCb3VuZGluZyBzcGhlcmUgZm9yIHRoZSBnZW9tZXRyeSB3aGljaCBjYW4gYmUgY2FsY3VsYXRlZCB3aXRoIGBjb21wdXRlQm91bmRpbmdTcGhlcmUoKWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1NwaGVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZXRlcm1pbmVzIHRoZSBwYXJ0IG9mIHRoZSBnZW9tZXRyeSB0byByZW5kZXIuIFRoaXMgc2hvdWxkIG5vdCBiZSBzZXQgZGlyZWN0bHksXHJcblx0XHQgKiBpbnN0ZWFkIHVzZSBgc2V0RHJhd1JhbmdlKClgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHt7c3RhcnQ6bnVtYmVyLGNvdW50Om51bWJlcn19XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZHJhd1JhbmdlID0geyBzdGFydDogMCwgY291bnQ6IEluZmluaXR5IH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byBzdG9yZSBjdXN0b20gZGF0YSBhYm91dCB0aGUgZ2VvbWV0cnkuXHJcblx0XHQgKiBJdCBzaG91bGQgbm90IGhvbGQgcmVmZXJlbmNlcyB0byBmdW5jdGlvbnMgYXMgdGhlc2Ugd2lsbCBub3QgYmUgY2xvbmVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXNlckRhdGEgPSB7fTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGlzIGdlb21ldHJ5LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7P0J1ZmZlckF0dHJpYnV0ZX0gVGhlIGluZGV4LiBSZXR1cm5zIGBudWxsYCBpZiBubyBpbmRleCBpcyBkZWZpbmVkLlxyXG5cdCAqL1xyXG5cdGdldEluZGV4KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmluZGV4O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGdpdmVuIGluZGV4IHRvIHRoaXMgZ2VvbWV0cnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj58QnVmZmVyQXR0cmlidXRlfSBpbmRleCAtIFRoZSBpbmRleCB0byBzZXQuXHJcblx0ICogQHJldHVybiB7QnVmZmVyR2VvbWV0cnl9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0SW5kZXgoIGluZGV4ICkge1xyXG5cclxuXHRcdGlmICggQXJyYXkuaXNBcnJheSggaW5kZXggKSApIHtcclxuXHJcblx0XHRcdHRoaXMuaW5kZXggPSBuZXcgKCBhcnJheU5lZWRzVWludDMyKCBpbmRleCApID8gVWludDMyQnVmZmVyQXR0cmlidXRlIDogVWludDE2QnVmZmVyQXR0cmlidXRlICkoIGluZGV4LCAxICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHRoaXMuaW5kZXggPSBpbmRleDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZ2l2ZW4gaW5kaXJlY3QgYXR0cmlidXRlIHRvIHRoaXMgZ2VvbWV0cnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0J1ZmZlckF0dHJpYnV0ZX0gaW5kaXJlY3QgLSBUaGUgYXR0cmlidXRlIGhvbGRpbmcgaW5kaXJlY3QgZHJhdyBjYWxscy5cclxuXHQgKiBAcmV0dXJuIHtCdWZmZXJHZW9tZXRyeX0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXRJbmRpcmVjdCggaW5kaXJlY3QgKSB7XHJcblxyXG5cdFx0dGhpcy5pbmRpcmVjdCA9IGluZGlyZWN0O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGluZGlyZWN0IGF0dHJpYnV0ZSBvZiB0aGlzIGdlb21ldHJ5LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7P0J1ZmZlckF0dHJpYnV0ZX0gVGhlIGluZGlyZWN0IGF0dHJpYnV0ZS4gUmV0dXJucyBgbnVsbGAgaWYgbm8gaW5kaXJlY3QgYXR0cmlidXRlIGlzIGRlZmluZWQuXHJcblx0ICovXHJcblx0Z2V0SW5kaXJlY3QoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuaW5kaXJlY3Q7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgYnVmZmVyIGF0dHJpYnV0ZSBmb3IgdGhlIGdpdmVuIG5hbWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBhdHRyaWJ1dGUgbmFtZS5cclxuXHQgKiBAcmV0dXJuIHtCdWZmZXJBdHRyaWJ1dGV8SW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGV8dW5kZWZpbmVkfSBUaGUgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKiBSZXR1cm5zIGB1bmRlZmluZWRgIGlmIG5vdCBhdHRyaWJ1dGUgaGFzIGJlZW4gZm91bmQuXHJcblx0ICovXHJcblx0Z2V0QXR0cmlidXRlKCBuYW1lICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmF0dHJpYnV0ZXNbIG5hbWUgXTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBnaXZlbiBhdHRyaWJ1dGUgZm9yIHRoZSBnaXZlbiBuYW1lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgYXR0cmlidXRlIG5hbWUuXHJcblx0ICogQHBhcmFtIHtCdWZmZXJBdHRyaWJ1dGV8SW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGV9IGF0dHJpYnV0ZSAtIFRoZSBhdHRyaWJ1dGUgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge0J1ZmZlckdlb21ldHJ5fSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldEF0dHJpYnV0ZSggbmFtZSwgYXR0cmlidXRlICkge1xyXG5cclxuXHRcdHRoaXMuYXR0cmlidXRlc1sgbmFtZSBdID0gYXR0cmlidXRlO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlbGV0ZXMgdGhlIGF0dHJpYnV0ZSBmb3IgdGhlIGdpdmVuIG5hbWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBhdHRyaWJ1dGUgbmFtZSB0byBkZWxldGUuXHJcblx0ICogQHJldHVybiB7QnVmZmVyR2VvbWV0cnl9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0ZGVsZXRlQXR0cmlidXRlKCBuYW1lICkge1xyXG5cclxuXHRcdGRlbGV0ZSB0aGlzLmF0dHJpYnV0ZXNbIG5hbWUgXTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIGdlb21ldHJ5IGhhcyBhbiBhdHRyaWJ1dGUgZm9yIHRoZSBnaXZlbiBuYW1lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgYXR0cmlidXRlIG5hbWUuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGlzIGdlb21ldHJ5IGhhcyBhbiBhdHRyaWJ1dGUgZm9yIHRoZSBnaXZlbiBuYW1lIG9yIG5vdC5cclxuXHQgKi9cclxuXHRoYXNBdHRyaWJ1dGUoIG5hbWUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuYXR0cmlidXRlc1sgbmFtZSBdICE9PSB1bmRlZmluZWQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyBhIGdyb3VwIHRvIHRoaXMgZ2VvbWV0cnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgLSBUaGUgZmlyc3QgZWxlbWVudCBpbiB0aGlzIGRyYXcgY2FsbC4gVGhhdCBpcyB0aGUgZmlyc3RcclxuXHQgKiB2ZXJ0ZXggZm9yIG5vbi1pbmRleGVkIGdlb21ldHJ5LCBvdGhlcndpc2UgdGhlIGZpcnN0IHRyaWFuZ2xlIGluZGV4LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudCAtIFNwZWNpZmllcyBob3cgbWFueSB2ZXJ0aWNlcyAob3IgaW5kaWNlcykgYXJlIHBhcnQgb2YgdGhpcyBncm91cC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW21hdGVyaWFsSW5kZXg9MF0gLSBUaGUgbWF0ZXJpYWwgYXJyYXkgaW5kZXggdG8gdXNlLlxyXG5cdCAqL1xyXG5cdGFkZEdyb3VwKCBzdGFydCwgY291bnQsIG1hdGVyaWFsSW5kZXggPSAwICkge1xyXG5cclxuXHRcdHRoaXMuZ3JvdXBzLnB1c2goIHtcclxuXHJcblx0XHRcdHN0YXJ0OiBzdGFydCxcclxuXHRcdFx0Y291bnQ6IGNvdW50LFxyXG5cdFx0XHRtYXRlcmlhbEluZGV4OiBtYXRlcmlhbEluZGV4XHJcblxyXG5cdFx0fSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENsZWFycyBhbGwgZ3JvdXBzLlxyXG5cdCAqL1xyXG5cdGNsZWFyR3JvdXBzKCkge1xyXG5cclxuXHRcdHRoaXMuZ3JvdXBzID0gW107XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZHJhdyByYW5nZSBmb3IgdGhpcyBnZW9tZXRyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCAtIFRoZSBmaXJzdCB2ZXJ0ZXggZm9yIG5vbi1pbmRleGVkIGdlb21ldHJ5LCBvdGhlcndpc2UgdGhlIGZpcnN0IHRyaWFuZ2xlIGluZGV4LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudCAtIEZvciBub24taW5kZXhlZCBCdWZmZXJHZW9tZXRyeSwgYGNvdW50YCBpcyB0aGUgbnVtYmVyIG9mIHZlcnRpY2VzIHRvIHJlbmRlci5cclxuXHQgKiBGb3IgaW5kZXhlZCBCdWZmZXJHZW9tZXRyeSwgYGNvdW50YCBpcyB0aGUgbnVtYmVyIG9mIGluZGljZXMgdG8gcmVuZGVyLlxyXG5cdCAqL1xyXG5cdHNldERyYXdSYW5nZSggc3RhcnQsIGNvdW50ICkge1xyXG5cclxuXHRcdHRoaXMuZHJhd1JhbmdlLnN0YXJ0ID0gc3RhcnQ7XHJcblx0XHR0aGlzLmRyYXdSYW5nZS5jb3VudCA9IGNvdW50O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFwcGxpZXMgdGhlIGdpdmVuIDR4NCB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggdG8gdGhlIGdlb21ldHJ5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRyaXg0fSBtYXRyaXggLSBUaGUgbWF0cml4IHRvIGFwcGx5LlxyXG5cdCAqIEByZXR1cm4ge0J1ZmZlckdlb21ldHJ5fSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGFwcGx5TWF0cml4NCggbWF0cml4ICkge1xyXG5cclxuXHRcdGNvbnN0IHBvc2l0aW9uID0gdGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xyXG5cclxuXHRcdGlmICggcG9zaXRpb24gIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHBvc2l0aW9uLmFwcGx5TWF0cml4NCggbWF0cml4ICk7XHJcblxyXG5cdFx0XHRwb3NpdGlvbi5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IG5vcm1hbCA9IHRoaXMuYXR0cmlidXRlcy5ub3JtYWw7XHJcblxyXG5cdFx0aWYgKCBub3JtYWwgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGNvbnN0IG5vcm1hbE1hdHJpeCA9IG5ldyBNYXRyaXgzKCkuZ2V0Tm9ybWFsTWF0cml4KCBtYXRyaXggKTtcclxuXHJcblx0XHRcdG5vcm1hbC5hcHBseU5vcm1hbE1hdHJpeCggbm9ybWFsTWF0cml4ICk7XHJcblxyXG5cdFx0XHRub3JtYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCB0YW5nZW50ID0gdGhpcy5hdHRyaWJ1dGVzLnRhbmdlbnQ7XHJcblxyXG5cdFx0aWYgKCB0YW5nZW50ICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHR0YW5nZW50LnRyYW5zZm9ybURpcmVjdGlvbiggbWF0cml4ICk7XHJcblxyXG5cdFx0XHR0YW5nZW50Lm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aGlzLmJvdW5kaW5nQm94ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5jb21wdXRlQm91bmRpbmdCb3goKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aGlzLmJvdW5kaW5nU3BoZXJlICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQXBwbGllcyB0aGUgcm90YXRpb24gcmVwcmVzZW50ZWQgYnkgdGhlIFF1YXRlcm5pb24gdG8gdGhlIGdlb21ldHJ5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtRdWF0ZXJuaW9ufSBxIC0gVGhlIFF1YXRlcm5pb24gdG8gYXBwbHkuXHJcblx0ICogQHJldHVybiB7QnVmZmVyR2VvbWV0cnl9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0YXBwbHlRdWF0ZXJuaW9uKCBxICkge1xyXG5cclxuXHRcdF9tMS5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbiggcSApO1xyXG5cclxuXHRcdHRoaXMuYXBwbHlNYXRyaXg0KCBfbTEgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSb3RhdGVzIHRoZSBnZW9tZXRyeSBhYm91dCB0aGUgWCBheGlzLiBUaGlzIGlzIHR5cGljYWxseSBkb25lIGFzIGEgb25lIHRpbWVcclxuXHQgKiBvcGVyYXRpb24sIGFuZCBub3QgZHVyaW5nIGEgbG9vcC4gVXNlIHtAbGluayBPYmplY3QzRCNyb3RhdGlvbn0gZm9yIHR5cGljYWxcclxuXHQgKiByZWFsLXRpbWUgbWVzaCByb3RhdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhbmdsZSAtIFRoZSBhbmdsZSBpbiByYWRpYW5zLlxyXG5cdCAqIEByZXR1cm4ge0J1ZmZlckdlb21ldHJ5fSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHJvdGF0ZVgoIGFuZ2xlICkge1xyXG5cclxuXHRcdC8vIHJvdGF0ZSBnZW9tZXRyeSBhcm91bmQgd29ybGQgeC1heGlzXHJcblxyXG5cdFx0X20xLm1ha2VSb3RhdGlvblgoIGFuZ2xlICk7XHJcblxyXG5cdFx0dGhpcy5hcHBseU1hdHJpeDQoIF9tMSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJvdGF0ZXMgdGhlIGdlb21ldHJ5IGFib3V0IHRoZSBZIGF4aXMuIFRoaXMgaXMgdHlwaWNhbGx5IGRvbmUgYXMgYSBvbmUgdGltZVxyXG5cdCAqIG9wZXJhdGlvbiwgYW5kIG5vdCBkdXJpbmcgYSBsb29wLiBVc2Uge0BsaW5rIE9iamVjdDNEI3JvdGF0aW9ufSBmb3IgdHlwaWNhbFxyXG5cdCAqIHJlYWwtdGltZSBtZXNoIHJvdGF0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFuZ2xlIC0gVGhlIGFuZ2xlIGluIHJhZGlhbnMuXHJcblx0ICogQHJldHVybiB7QnVmZmVyR2VvbWV0cnl9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0cm90YXRlWSggYW5nbGUgKSB7XHJcblxyXG5cdFx0Ly8gcm90YXRlIGdlb21ldHJ5IGFyb3VuZCB3b3JsZCB5LWF4aXNcclxuXHJcblx0XHRfbTEubWFrZVJvdGF0aW9uWSggYW5nbGUgKTtcclxuXHJcblx0XHR0aGlzLmFwcGx5TWF0cml4NCggX20xICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUm90YXRlcyB0aGUgZ2VvbWV0cnkgYWJvdXQgdGhlIFogYXhpcy4gVGhpcyBpcyB0eXBpY2FsbHkgZG9uZSBhcyBhIG9uZSB0aW1lXHJcblx0ICogb3BlcmF0aW9uLCBhbmQgbm90IGR1cmluZyBhIGxvb3AuIFVzZSB7QGxpbmsgT2JqZWN0M0Qjcm90YXRpb259IGZvciB0eXBpY2FsXHJcblx0ICogcmVhbC10aW1lIG1lc2ggcm90YXRpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYW5nbGUgLSBUaGUgYW5nbGUgaW4gcmFkaWFucy5cclxuXHQgKiBAcmV0dXJuIHtCdWZmZXJHZW9tZXRyeX0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRyb3RhdGVaKCBhbmdsZSApIHtcclxuXHJcblx0XHQvLyByb3RhdGUgZ2VvbWV0cnkgYXJvdW5kIHdvcmxkIHotYXhpc1xyXG5cclxuXHRcdF9tMS5tYWtlUm90YXRpb25aKCBhbmdsZSApO1xyXG5cclxuXHRcdHRoaXMuYXBwbHlNYXRyaXg0KCBfbTEgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUcmFuc2xhdGVzIHRoZSBnZW9tZXRyeS4gVGhpcyBpcyB0eXBpY2FsbHkgZG9uZSBhcyBhIG9uZSB0aW1lXHJcblx0ICogb3BlcmF0aW9uLCBhbmQgbm90IGR1cmluZyBhIGxvb3AuIFVzZSB7QGxpbmsgT2JqZWN0M0QjcG9zaXRpb259IGZvciB0eXBpY2FsXHJcblx0ICogcmVhbC10aW1lIG1lc2ggcm90YXRpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB4IG9mZnNldC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB5IG9mZnNldC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geiAtIFRoZSB6IG9mZnNldC5cclxuXHQgKiBAcmV0dXJuIHtCdWZmZXJHZW9tZXRyeX0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHR0cmFuc2xhdGUoIHgsIHksIHogKSB7XHJcblxyXG5cdFx0Ly8gdHJhbnNsYXRlIGdlb21ldHJ5XHJcblxyXG5cdFx0X20xLm1ha2VUcmFuc2xhdGlvbiggeCwgeSwgeiApO1xyXG5cclxuXHRcdHRoaXMuYXBwbHlNYXRyaXg0KCBfbTEgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTY2FsZXMgdGhlIGdlb21ldHJ5LiBUaGlzIGlzIHR5cGljYWxseSBkb25lIGFzIGEgb25lIHRpbWVcclxuXHQgKiBvcGVyYXRpb24sIGFuZCBub3QgZHVyaW5nIGEgbG9vcC4gVXNlIHtAbGluayBPYmplY3QzRCNzY2FsZX0gZm9yIHR5cGljYWxcclxuXHQgKiByZWFsLXRpbWUgbWVzaCByb3RhdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHggc2NhbGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgeSBzY2FsZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geiAtIFRoZSB6IHNjYWxlLlxyXG5cdCAqIEByZXR1cm4ge0J1ZmZlckdlb21ldHJ5fSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNjYWxlKCB4LCB5LCB6ICkge1xyXG5cclxuXHRcdC8vIHNjYWxlIGdlb21ldHJ5XHJcblxyXG5cdFx0X20xLm1ha2VTY2FsZSggeCwgeSwgeiApO1xyXG5cclxuXHRcdHRoaXMuYXBwbHlNYXRyaXg0KCBfbTEgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSb3RhdGVzIHRoZSBnZW9tZXRyeSB0byBmYWNlIGEgcG9pbnQgaW4gM0Qgc3BhY2UuIFRoaXMgaXMgdHlwaWNhbGx5IGRvbmUgYXMgYSBvbmUgdGltZVxyXG5cdCAqIG9wZXJhdGlvbiwgYW5kIG5vdCBkdXJpbmcgYSBsb29wLiBVc2Uge0BsaW5rIE9iamVjdDNEI2xvb2tBdH0gZm9yIHR5cGljYWxcclxuXHQgKiByZWFsLXRpbWUgbWVzaCByb3RhdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdmVjdG9yIC0gVGhlIHRhcmdldCBwb2ludC5cclxuXHQgKiBAcmV0dXJuIHtCdWZmZXJHZW9tZXRyeX0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRsb29rQXQoIHZlY3RvciApIHtcclxuXHJcblx0XHRfb2JqLmxvb2tBdCggdmVjdG9yICk7XHJcblxyXG5cdFx0X29iai51cGRhdGVNYXRyaXgoKTtcclxuXHJcblx0XHR0aGlzLmFwcGx5TWF0cml4NCggX29iai5tYXRyaXggKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDZW50ZXIgdGhlIGdlb21ldHJ5IGJhc2VkIG9uIGl0cyBib3VuZGluZyBib3guXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtCdWZmZXJHZW9tZXRyeX0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjZW50ZXIoKSB7XHJcblxyXG5cdFx0dGhpcy5jb21wdXRlQm91bmRpbmdCb3goKTtcclxuXHJcblx0XHR0aGlzLmJvdW5kaW5nQm94LmdldENlbnRlciggX29mZnNldCApLm5lZ2F0ZSgpO1xyXG5cclxuXHRcdHRoaXMudHJhbnNsYXRlKCBfb2Zmc2V0LngsIF9vZmZzZXQueSwgX29mZnNldC56ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVmaW5lcyBhIGdlb21ldHJ5IGJ5IGNyZWF0aW5nIGEgYHBvc2l0aW9uYCBhdHRyaWJ1dGUgYmFzZWQgb24gdGhlIGdpdmVuIGFycmF5IG9mIHBvaW50cy4gVGhlIGFycmF5XHJcblx0ICogY2FuIGhvbGQgMkQgb3IgM0QgdmVjdG9ycy4gV2hlbiB1c2luZyB0d28tZGltZW5zaW9uYWwgZGF0YSwgdGhlIGB6YCBjb29yZGluYXRlIGZvciBhbGwgdmVydGljZXMgaXNcclxuXHQgKiBzZXQgdG8gYDBgLlxyXG5cdCAqXHJcblx0ICogSWYgdGhlIG1ldGhvZCBpcyB1c2VkIHdpdGggYW4gZXhpc3RpbmcgYHBvc2l0aW9uYCBhdHRyaWJ1dGUsIHRoZSB2ZXJ0ZXggZGF0YSBhcmUgb3ZlcndyaXR0ZW4gd2l0aCB0aGVcclxuXHQgKiBkYXRhIGZyb20gdGhlIGFycmF5LiBUaGUgbGVuZ3RoIG9mIHRoZSBhcnJheSBtdXN0IG1hdGNoIHRoZSB2ZXJ0ZXggY291bnQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PFZlY3RvcjI+fEFycmF5PFZlY3RvcjM+fSBwb2ludHMgLSBUaGUgcG9pbnRzLlxyXG5cdCAqIEByZXR1cm4ge0J1ZmZlckdlb21ldHJ5fSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldEZyb21Qb2ludHMoIHBvaW50cyApIHtcclxuXHJcblx0XHRjb25zdCBwb3NpdGlvbkF0dHJpYnV0ZSA9IHRoaXMuZ2V0QXR0cmlidXRlKCAncG9zaXRpb24nICk7XHJcblxyXG5cdFx0aWYgKCBwb3NpdGlvbkF0dHJpYnV0ZSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Y29uc3QgcG9zaXRpb24gPSBbXTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBwb2ludCA9IHBvaW50c1sgaSBdO1xyXG5cdFx0XHRcdHBvc2l0aW9uLnB1c2goIHBvaW50LngsIHBvaW50LnksIHBvaW50LnogfHwgMCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgMyApICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGNvbnN0IGwgPSBNYXRoLm1pbiggcG9pbnRzLmxlbmd0aCwgcG9zaXRpb25BdHRyaWJ1dGUuY291bnQgKTsgLy8gbWFrZSBzdXJlIGRhdGEgZG8gbm90IGV4Y2VlZCBidWZmZXIgc2l6ZVxyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgcG9pbnQgPSBwb2ludHNbIGkgXTtcclxuXHRcdFx0XHRwb3NpdGlvbkF0dHJpYnV0ZS5zZXRYWVooIGksIHBvaW50LngsIHBvaW50LnksIHBvaW50LnogfHwgMCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBwb2ludHMubGVuZ3RoID4gcG9zaXRpb25BdHRyaWJ1dGUuY291bnQgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiBCdWZmZXIgc2l6ZSB0b28gc21hbGwgZm9yIHBvaW50cyBkYXRhLiBVc2UgLmRpc3Bvc2UoKSBhbmQgY3JlYXRlIGEgbmV3IGdlb21ldHJ5LicgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHBvc2l0aW9uQXR0cmlidXRlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgZ2VvbWV0cnksIGFuZCB1cGRhdGVzIHRoZSBgYm91bmRpbmdCb3hgIG1lbWJlci5cclxuXHQgKiBUaGUgYm91bmRpbmcgYm94IGlzIG5vdCBjb21wdXRlZCBieSB0aGUgZW5naW5lOyBpdCBtdXN0IGJlIGNvbXB1dGVkIGJ5IHlvdXIgYXBwLlxyXG5cdCAqIFlvdSBtYXkgbmVlZCB0byByZWNvbXB1dGUgdGhlIGJvdW5kaW5nIGJveCBpZiB0aGUgZ2VvbWV0cnkgdmVydGljZXMgYXJlIG1vZGlmaWVkLlxyXG5cdCAqL1xyXG5cdGNvbXB1dGVCb3VuZGluZ0JveCgpIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuYm91bmRpbmdCb3ggPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmJvdW5kaW5nQm94ID0gbmV3IEJveDMoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgcG9zaXRpb24gPSB0aGlzLmF0dHJpYnV0ZXMucG9zaXRpb247XHJcblx0XHRjb25zdCBtb3JwaEF0dHJpYnV0ZXNQb3NpdGlvbiA9IHRoaXMubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uO1xyXG5cclxuXHRcdGlmICggcG9zaXRpb24gJiYgcG9zaXRpb24uaXNHTEJ1ZmZlckF0dHJpYnV0ZSApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdCb3goKTogR0xCdWZmZXJBdHRyaWJ1dGUgcmVxdWlyZXMgYSBtYW51YWwgYm91bmRpbmcgYm94LicsIHRoaXMgKTtcclxuXHJcblx0XHRcdHRoaXMuYm91bmRpbmdCb3guc2V0KFxyXG5cdFx0XHRcdG5ldyBWZWN0b3IzKCAtIEluZmluaXR5LCAtIEluZmluaXR5LCAtIEluZmluaXR5ICksXHJcblx0XHRcdFx0bmV3IFZlY3RvcjMoICsgSW5maW5pdHksICsgSW5maW5pdHksICsgSW5maW5pdHkgKVxyXG5cdFx0XHQpO1xyXG5cclxuXHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHBvc2l0aW9uICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmJvdW5kaW5nQm94LnNldEZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uICk7XHJcblxyXG5cdFx0XHQvLyBwcm9jZXNzIG1vcnBoIGF0dHJpYnV0ZXMgaWYgcHJlc2VudFxyXG5cclxuXHRcdFx0aWYgKCBtb3JwaEF0dHJpYnV0ZXNQb3NpdGlvbiApIHtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IG1vcnBoQXR0cmlidXRlc1Bvc2l0aW9uLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IG1vcnBoQXR0cmlidXRlID0gbW9ycGhBdHRyaWJ1dGVzUG9zaXRpb25bIGkgXTtcclxuXHRcdFx0XHRcdF9ib3guc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSggbW9ycGhBdHRyaWJ1dGUgKTtcclxuXHJcblx0XHRcdFx0XHRpZiAoIHRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmUgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRfdmVjdG9yLmFkZFZlY3RvcnMoIHRoaXMuYm91bmRpbmdCb3gubWluLCBfYm94Lm1pbiApO1xyXG5cdFx0XHRcdFx0XHR0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoIF92ZWN0b3IgKTtcclxuXHJcblx0XHRcdFx0XHRcdF92ZWN0b3IuYWRkVmVjdG9ycyggdGhpcy5ib3VuZGluZ0JveC5tYXgsIF9ib3gubWF4ICk7XHJcblx0XHRcdFx0XHRcdHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludCggX3ZlY3RvciApO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHR0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoIF9ib3gubWluICk7XHJcblx0XHRcdFx0XHRcdHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludCggX2JveC5tYXggKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveC5tYWtlRW1wdHkoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBpc05hTiggdGhpcy5ib3VuZGluZ0JveC5taW4ueCApIHx8IGlzTmFOKCB0aGlzLmJvdW5kaW5nQm94Lm1pbi55ICkgfHwgaXNOYU4oIHRoaXMuYm91bmRpbmdCb3gubWluLnogKSApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdCb3goKTogQ29tcHV0ZWQgbWluL21heCBoYXZlIE5hTiB2YWx1ZXMuIFRoZSBcInBvc2l0aW9uXCIgYXR0cmlidXRlIGlzIGxpa2VseSB0byBoYXZlIE5hTiB2YWx1ZXMuJywgdGhpcyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB0aGUgYm91bmRpbmcgc3BoZXJlIG9mIHRoZSBnZW9tZXRyeSwgYW5kIHVwZGF0ZXMgdGhlIGBib3VuZGluZ1NwaGVyZWAgbWVtYmVyLlxyXG5cdCAqIFRoZSBlbmdpbmUgYXV0b21hdGljYWxseSBjb21wdXRlcyB0aGUgYm91bmRpbmcgc3BoZXJlIHdoZW4gaXQgaXMgbmVlZGVkLCBlLmcuLCBmb3IgcmF5IGNhc3Rpbmcgb3IgdmlldyBmcnVzdHVtIGN1bGxpbmcuXHJcblx0ICogWW91IG1heSBuZWVkIHRvIHJlY29tcHV0ZSB0aGUgYm91bmRpbmcgc3BoZXJlIGlmIHRoZSBnZW9tZXRyeSB2ZXJ0aWNlcyBhcmUgbW9kaWZpZWQuXHJcblx0ICovXHJcblx0Y29tcHV0ZUJvdW5kaW5nU3BoZXJlKCkge1xyXG5cclxuXHRcdGlmICggdGhpcy5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBuZXcgU3BoZXJlKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHBvc2l0aW9uID0gdGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xyXG5cdFx0Y29uc3QgbW9ycGhBdHRyaWJ1dGVzUG9zaXRpb24gPSB0aGlzLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbjtcclxuXHJcblx0XHRpZiAoIHBvc2l0aW9uICYmIHBvc2l0aW9uLmlzR0xCdWZmZXJBdHRyaWJ1dGUgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk6IEdMQnVmZmVyQXR0cmlidXRlIHJlcXVpcmVzIGEgbWFudWFsIGJvdW5kaW5nIHNwaGVyZS4nLCB0aGlzICk7XHJcblxyXG5cdFx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlLnNldCggbmV3IFZlY3RvcjMoKSwgSW5maW5pdHkgKTtcclxuXHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBwb3NpdGlvbiApIHtcclxuXHJcblx0XHRcdC8vIGZpcnN0LCBmaW5kIHRoZSBjZW50ZXIgb2YgdGhlIGJvdW5kaW5nIHNwaGVyZVxyXG5cclxuXHRcdFx0Y29uc3QgY2VudGVyID0gdGhpcy5ib3VuZGluZ1NwaGVyZS5jZW50ZXI7XHJcblxyXG5cdFx0XHRfYm94LnNldEZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uICk7XHJcblxyXG5cdFx0XHQvLyBwcm9jZXNzIG1vcnBoIGF0dHJpYnV0ZXMgaWYgcHJlc2VudFxyXG5cclxuXHRcdFx0aWYgKCBtb3JwaEF0dHJpYnV0ZXNQb3NpdGlvbiApIHtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IG1vcnBoQXR0cmlidXRlc1Bvc2l0aW9uLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IG1vcnBoQXR0cmlidXRlID0gbW9ycGhBdHRyaWJ1dGVzUG9zaXRpb25bIGkgXTtcclxuXHRcdFx0XHRcdF9ib3hNb3JwaFRhcmdldHMuc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSggbW9ycGhBdHRyaWJ1dGUgKTtcclxuXHJcblx0XHRcdFx0XHRpZiAoIHRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmUgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRfdmVjdG9yLmFkZFZlY3RvcnMoIF9ib3gubWluLCBfYm94TW9ycGhUYXJnZXRzLm1pbiApO1xyXG5cdFx0XHRcdFx0XHRfYm94LmV4cGFuZEJ5UG9pbnQoIF92ZWN0b3IgKTtcclxuXHJcblx0XHRcdFx0XHRcdF92ZWN0b3IuYWRkVmVjdG9ycyggX2JveC5tYXgsIF9ib3hNb3JwaFRhcmdldHMubWF4ICk7XHJcblx0XHRcdFx0XHRcdF9ib3guZXhwYW5kQnlQb2ludCggX3ZlY3RvciApO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRfYm94LmV4cGFuZEJ5UG9pbnQoIF9ib3hNb3JwaFRhcmdldHMubWluICk7XHJcblx0XHRcdFx0XHRcdF9ib3guZXhwYW5kQnlQb2ludCggX2JveE1vcnBoVGFyZ2V0cy5tYXggKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdF9ib3guZ2V0Q2VudGVyKCBjZW50ZXIgKTtcclxuXHJcblx0XHRcdC8vIHNlY29uZCwgdHJ5IHRvIGZpbmQgYSBib3VuZGluZ1NwaGVyZSB3aXRoIGEgcmFkaXVzIHNtYWxsZXIgdGhhbiB0aGVcclxuXHRcdFx0Ly8gYm91bmRpbmdTcGhlcmUgb2YgdGhlIGJvdW5kaW5nQm94OiBzcXJ0KDMpIHNtYWxsZXIgaW4gdGhlIGJlc3QgY2FzZVxyXG5cclxuXHRcdFx0bGV0IG1heFJhZGl1c1NxID0gMDtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBwb3NpdGlvbi5jb3VudDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRfdmVjdG9yLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBpICk7XHJcblxyXG5cdFx0XHRcdG1heFJhZGl1c1NxID0gTWF0aC5tYXgoIG1heFJhZGl1c1NxLCBjZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQoIF92ZWN0b3IgKSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gcHJvY2VzcyBtb3JwaCBhdHRyaWJ1dGVzIGlmIHByZXNlbnRcclxuXHJcblx0XHRcdGlmICggbW9ycGhBdHRyaWJ1dGVzUG9zaXRpb24gKSB7XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBtb3JwaEF0dHJpYnV0ZXNQb3NpdGlvbi5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBtb3JwaEF0dHJpYnV0ZSA9IG1vcnBoQXR0cmlidXRlc1Bvc2l0aW9uWyBpIF07XHJcblx0XHRcdFx0XHRjb25zdCBtb3JwaFRhcmdldHNSZWxhdGl2ZSA9IHRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU7XHJcblxyXG5cdFx0XHRcdFx0Zm9yICggbGV0IGogPSAwLCBqbCA9IG1vcnBoQXR0cmlidXRlLmNvdW50OyBqIDwgamw7IGogKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRfdmVjdG9yLmZyb21CdWZmZXJBdHRyaWJ1dGUoIG1vcnBoQXR0cmlidXRlLCBqICk7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIG1vcnBoVGFyZ2V0c1JlbGF0aXZlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRfb2Zmc2V0LmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBqICk7XHJcblx0XHRcdFx0XHRcdFx0X3ZlY3Rvci5hZGQoIF9vZmZzZXQgKTtcclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdG1heFJhZGl1c1NxID0gTWF0aC5tYXgoIG1heFJhZGl1c1NxLCBjZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQoIF92ZWN0b3IgKSApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5ib3VuZGluZ1NwaGVyZS5yYWRpdXMgPSBNYXRoLnNxcnQoIG1heFJhZGl1c1NxICk7XHJcblxyXG5cdFx0XHRpZiAoIGlzTmFOKCB0aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cyApICkge1xyXG5cclxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk6IENvbXB1dGVkIHJhZGl1cyBpcyBOYU4uIFRoZSBcInBvc2l0aW9uXCIgYXR0cmlidXRlIGlzIGxpa2VseSB0byBoYXZlIE5hTiB2YWx1ZXMuJywgdGhpcyApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDYWxjdWxhdGVzIGFuZCBhZGRzIGEgdGFuZ2VudCBhdHRyaWJ1dGUgdG8gdGhpcyBnZW9tZXRyeS5cclxuXHQgKlxyXG5cdCAqIFRoZSBjb21wdXRhdGlvbiBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgaW5kZXhlZCBnZW9tZXRyaWVzIGFuZCBpZiBwb3NpdGlvbiwgbm9ybWFsLCBhbmQgdXYgYXR0cmlidXRlc1xyXG5cdCAqIGFyZSBkZWZpbmVkLiBXaGVuIHVzaW5nIGEgdGFuZ2VudCBzcGFjZSBub3JtYWwgbWFwLCBwcmVmZXIgdGhlIE1pa2tUU3BhY2UgYWxnb3JpdGhtIHByb3ZpZGVkIGJ5XHJcblx0ICoge0BsaW5rIEJ1ZmZlckdlb21ldHJ5VXRpbHMjY29tcHV0ZU1pa2tUU3BhY2VUYW5nZW50c30gaW5zdGVhZC5cclxuXHQgKi9cclxuXHRjb21wdXRlVGFuZ2VudHMoKSB7XHJcblxyXG5cdFx0Y29uc3QgaW5kZXggPSB0aGlzLmluZGV4O1xyXG5cdFx0Y29uc3QgYXR0cmlidXRlcyA9IHRoaXMuYXR0cmlidXRlcztcclxuXHJcblx0XHQvLyBiYXNlZCBvbiBodHRwOi8vd3d3LnRlcmF0aG9uLmNvbS9jb2RlL3RhbmdlbnQuaHRtbFxyXG5cdFx0Ly8gKHBlciB2ZXJ0ZXggdGFuZ2VudHMpXHJcblxyXG5cdFx0aWYgKCBpbmRleCA9PT0gbnVsbCB8fFxyXG5cdFx0XHQgYXR0cmlidXRlcy5wb3NpdGlvbiA9PT0gdW5kZWZpbmVkIHx8XHJcblx0XHRcdCBhdHRyaWJ1dGVzLm5vcm1hbCA9PT0gdW5kZWZpbmVkIHx8XHJcblx0XHRcdCBhdHRyaWJ1dGVzLnV2ID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5jb21wdXRlVGFuZ2VudHMoKSBmYWlsZWQuIE1pc3NpbmcgcmVxdWlyZWQgYXR0cmlidXRlcyAoaW5kZXgsIHBvc2l0aW9uLCBub3JtYWwgb3IgdXYpJyApO1xyXG5cdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHBvc2l0aW9uQXR0cmlidXRlID0gYXR0cmlidXRlcy5wb3NpdGlvbjtcclxuXHRcdGNvbnN0IG5vcm1hbEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubm9ybWFsO1xyXG5cdFx0Y29uc3QgdXZBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLnV2O1xyXG5cclxuXHRcdGlmICggdGhpcy5oYXNBdHRyaWJ1dGUoICd0YW5nZW50JyApID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdHRoaXMuc2V0QXR0cmlidXRlKCAndGFuZ2VudCcsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIG5ldyBGbG9hdDMyQXJyYXkoIDQgKiBwb3NpdGlvbkF0dHJpYnV0ZS5jb3VudCApLCA0ICkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgdGFuZ2VudEF0dHJpYnV0ZSA9IHRoaXMuZ2V0QXR0cmlidXRlKCAndGFuZ2VudCcgKTtcclxuXHJcblx0XHRjb25zdCB0YW4xID0gW10sIHRhbjIgPSBbXTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbkF0dHJpYnV0ZS5jb3VudDsgaSArKyApIHtcclxuXHJcblx0XHRcdHRhbjFbIGkgXSA9IG5ldyBWZWN0b3IzKCk7XHJcblx0XHRcdHRhbjJbIGkgXSA9IG5ldyBWZWN0b3IzKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHZBID0gbmV3IFZlY3RvcjMoKSxcclxuXHRcdFx0dkIgPSBuZXcgVmVjdG9yMygpLFxyXG5cdFx0XHR2QyA9IG5ldyBWZWN0b3IzKCksXHJcblxyXG5cdFx0XHR1dkEgPSBuZXcgVmVjdG9yMigpLFxyXG5cdFx0XHR1dkIgPSBuZXcgVmVjdG9yMigpLFxyXG5cdFx0XHR1dkMgPSBuZXcgVmVjdG9yMigpLFxyXG5cclxuXHRcdFx0c2RpciA9IG5ldyBWZWN0b3IzKCksXHJcblx0XHRcdHRkaXIgPSBuZXcgVmVjdG9yMygpO1xyXG5cclxuXHRcdGZ1bmN0aW9uIGhhbmRsZVRyaWFuZ2xlKCBhLCBiLCBjICkge1xyXG5cclxuXHRcdFx0dkEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyaWJ1dGUsIGEgKTtcclxuXHRcdFx0dkIuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyaWJ1dGUsIGIgKTtcclxuXHRcdFx0dkMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyaWJ1dGUsIGMgKTtcclxuXHJcblx0XHRcdHV2QS5mcm9tQnVmZmVyQXR0cmlidXRlKCB1dkF0dHJpYnV0ZSwgYSApO1xyXG5cdFx0XHR1dkIuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggdXZBdHRyaWJ1dGUsIGIgKTtcclxuXHRcdFx0dXZDLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHV2QXR0cmlidXRlLCBjICk7XHJcblxyXG5cdFx0XHR2Qi5zdWIoIHZBICk7XHJcblx0XHRcdHZDLnN1YiggdkEgKTtcclxuXHJcblx0XHRcdHV2Qi5zdWIoIHV2QSApO1xyXG5cdFx0XHR1dkMuc3ViKCB1dkEgKTtcclxuXHJcblx0XHRcdGNvbnN0IHIgPSAxLjAgLyAoIHV2Qi54ICogdXZDLnkgLSB1dkMueCAqIHV2Qi55ICk7XHJcblxyXG5cdFx0XHQvLyBzaWxlbnRseSBpZ25vcmUgZGVnZW5lcmF0ZSB1diB0cmlhbmdsZXMgaGF2aW5nIGNvaW5jaWRlbnQgb3IgY29saW5lYXIgdmVydGljZXNcclxuXHJcblx0XHRcdGlmICggISBpc0Zpbml0ZSggciApICkgcmV0dXJuO1xyXG5cclxuXHRcdFx0c2Rpci5jb3B5KCB2QiApLm11bHRpcGx5U2NhbGFyKCB1dkMueSApLmFkZFNjYWxlZFZlY3RvciggdkMsIC0gdXZCLnkgKS5tdWx0aXBseVNjYWxhciggciApO1xyXG5cdFx0XHR0ZGlyLmNvcHkoIHZDICkubXVsdGlwbHlTY2FsYXIoIHV2Qi54ICkuYWRkU2NhbGVkVmVjdG9yKCB2QiwgLSB1dkMueCApLm11bHRpcGx5U2NhbGFyKCByICk7XHJcblxyXG5cdFx0XHR0YW4xWyBhIF0uYWRkKCBzZGlyICk7XHJcblx0XHRcdHRhbjFbIGIgXS5hZGQoIHNkaXIgKTtcclxuXHRcdFx0dGFuMVsgYyBdLmFkZCggc2RpciApO1xyXG5cclxuXHRcdFx0dGFuMlsgYSBdLmFkZCggdGRpciApO1xyXG5cdFx0XHR0YW4yWyBiIF0uYWRkKCB0ZGlyICk7XHJcblx0XHRcdHRhbjJbIGMgXS5hZGQoIHRkaXIgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0bGV0IGdyb3VwcyA9IHRoaXMuZ3JvdXBzO1xyXG5cclxuXHRcdGlmICggZ3JvdXBzLmxlbmd0aCA9PT0gMCApIHtcclxuXHJcblx0XHRcdGdyb3VwcyA9IFsge1xyXG5cdFx0XHRcdHN0YXJ0OiAwLFxyXG5cdFx0XHRcdGNvdW50OiBpbmRleC5jb3VudFxyXG5cdFx0XHR9IF07XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBncm91cHMubGVuZ3RoOyBpIDwgaWw7ICsrIGkgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBncm91cCA9IGdyb3Vwc1sgaSBdO1xyXG5cclxuXHRcdFx0Y29uc3Qgc3RhcnQgPSBncm91cC5zdGFydDtcclxuXHRcdFx0Y29uc3QgY291bnQgPSBncm91cC5jb3VudDtcclxuXHJcblx0XHRcdGZvciAoIGxldCBqID0gc3RhcnQsIGpsID0gc3RhcnQgKyBjb3VudDsgaiA8IGpsOyBqICs9IDMgKSB7XHJcblxyXG5cdFx0XHRcdGhhbmRsZVRyaWFuZ2xlKFxyXG5cdFx0XHRcdFx0aW5kZXguZ2V0WCggaiArIDAgKSxcclxuXHRcdFx0XHRcdGluZGV4LmdldFgoIGogKyAxICksXHJcblx0XHRcdFx0XHRpbmRleC5nZXRYKCBqICsgMiApXHJcblx0XHRcdFx0KTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgdG1wID0gbmV3IFZlY3RvcjMoKSwgdG1wMiA9IG5ldyBWZWN0b3IzKCk7XHJcblx0XHRjb25zdCBuID0gbmV3IFZlY3RvcjMoKSwgbjIgPSBuZXcgVmVjdG9yMygpO1xyXG5cclxuXHRcdGZ1bmN0aW9uIGhhbmRsZVZlcnRleCggdiApIHtcclxuXHJcblx0XHRcdG4uZnJvbUJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFsQXR0cmlidXRlLCB2ICk7XHJcblx0XHRcdG4yLmNvcHkoIG4gKTtcclxuXHJcblx0XHRcdGNvbnN0IHQgPSB0YW4xWyB2IF07XHJcblxyXG5cdFx0XHQvLyBHcmFtLVNjaG1pZHQgb3J0aG9nb25hbGl6ZVxyXG5cclxuXHRcdFx0dG1wLmNvcHkoIHQgKTtcclxuXHRcdFx0dG1wLnN1Yiggbi5tdWx0aXBseVNjYWxhciggbi5kb3QoIHQgKSApICkubm9ybWFsaXplKCk7XHJcblxyXG5cdFx0XHQvLyBDYWxjdWxhdGUgaGFuZGVkbmVzc1xyXG5cclxuXHRcdFx0dG1wMi5jcm9zc1ZlY3RvcnMoIG4yLCB0ICk7XHJcblx0XHRcdGNvbnN0IHRlc3QgPSB0bXAyLmRvdCggdGFuMlsgdiBdICk7XHJcblx0XHRcdGNvbnN0IHcgPSAoIHRlc3QgPCAwLjAgKSA/IC0gMS4wIDogMS4wO1xyXG5cclxuXHRcdFx0dGFuZ2VudEF0dHJpYnV0ZS5zZXRYWVpXKCB2LCB0bXAueCwgdG1wLnksIHRtcC56LCB3ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBncm91cHMubGVuZ3RoOyBpIDwgaWw7ICsrIGkgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBncm91cCA9IGdyb3Vwc1sgaSBdO1xyXG5cclxuXHRcdFx0Y29uc3Qgc3RhcnQgPSBncm91cC5zdGFydDtcclxuXHRcdFx0Y29uc3QgY291bnQgPSBncm91cC5jb3VudDtcclxuXHJcblx0XHRcdGZvciAoIGxldCBqID0gc3RhcnQsIGpsID0gc3RhcnQgKyBjb3VudDsgaiA8IGpsOyBqICs9IDMgKSB7XHJcblxyXG5cdFx0XHRcdGhhbmRsZVZlcnRleCggaW5kZXguZ2V0WCggaiArIDAgKSApO1xyXG5cdFx0XHRcdGhhbmRsZVZlcnRleCggaW5kZXguZ2V0WCggaiArIDEgKSApO1xyXG5cdFx0XHRcdGhhbmRsZVZlcnRleCggaW5kZXguZ2V0WCggaiArIDIgKSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB2ZXJ0ZXggbm9ybWFscyBmb3IgdGhlIGdpdmVuIHZlcnRleCBkYXRhLiBGb3IgaW5kZXhlZCBnZW9tZXRyaWVzLCB0aGUgbWV0aG9kIHNldHNcclxuXHQgKiBlYWNoIHZlcnRleCBub3JtYWwgdG8gYmUgdGhlIGF2ZXJhZ2Ugb2YgdGhlIGZhY2Ugbm9ybWFscyBvZiB0aGUgZmFjZXMgdGhhdCBzaGFyZSB0aGF0IHZlcnRleC5cclxuXHQgKiBGb3Igbm9uLWluZGV4ZWQgZ2VvbWV0cmllcywgdmVydGljZXMgYXJlIG5vdCBzaGFyZWQsIGFuZCB0aGUgbWV0aG9kIHNldHMgZWFjaCB2ZXJ0ZXggbm9ybWFsXHJcblx0ICogdG8gYmUgdGhlIHNhbWUgYXMgdGhlIGZhY2Ugbm9ybWFsLlxyXG5cdCAqL1xyXG5cdGNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCkge1xyXG5cclxuXHRcdGNvbnN0IGluZGV4ID0gdGhpcy5pbmRleDtcclxuXHRcdGNvbnN0IHBvc2l0aW9uQXR0cmlidXRlID0gdGhpcy5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKTtcclxuXHJcblx0XHRpZiAoIHBvc2l0aW9uQXR0cmlidXRlICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRsZXQgbm9ybWFsQXR0cmlidXRlID0gdGhpcy5nZXRBdHRyaWJ1dGUoICdub3JtYWwnICk7XHJcblxyXG5cdFx0XHRpZiAoIG5vcm1hbEF0dHJpYnV0ZSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRub3JtYWxBdHRyaWJ1dGUgPSBuZXcgQnVmZmVyQXR0cmlidXRlKCBuZXcgRmxvYXQzMkFycmF5KCBwb3NpdGlvbkF0dHJpYnV0ZS5jb3VudCAqIDMgKSwgMyApO1xyXG5cdFx0XHRcdHRoaXMuc2V0QXR0cmlidXRlKCAnbm9ybWFsJywgbm9ybWFsQXR0cmlidXRlICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHQvLyByZXNldCBleGlzdGluZyBub3JtYWxzIHRvIHplcm9cclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IG5vcm1hbEF0dHJpYnV0ZS5jb3VudDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdG5vcm1hbEF0dHJpYnV0ZS5zZXRYWVooIGksIDAsIDAsIDAgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgcEEgPSBuZXcgVmVjdG9yMygpLCBwQiA9IG5ldyBWZWN0b3IzKCksIHBDID0gbmV3IFZlY3RvcjMoKTtcclxuXHRcdFx0Y29uc3QgbkEgPSBuZXcgVmVjdG9yMygpLCBuQiA9IG5ldyBWZWN0b3IzKCksIG5DID0gbmV3IFZlY3RvcjMoKTtcclxuXHRcdFx0Y29uc3QgY2IgPSBuZXcgVmVjdG9yMygpLCBhYiA9IG5ldyBWZWN0b3IzKCk7XHJcblxyXG5cdFx0XHQvLyBpbmRleGVkIGVsZW1lbnRzXHJcblxyXG5cdFx0XHRpZiAoIGluZGV4ICkge1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gaW5kZXguY291bnQ7IGkgPCBpbDsgaSArPSAzICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHZBID0gaW5kZXguZ2V0WCggaSArIDAgKTtcclxuXHRcdFx0XHRcdGNvbnN0IHZCID0gaW5kZXguZ2V0WCggaSArIDEgKTtcclxuXHRcdFx0XHRcdGNvbnN0IHZDID0gaW5kZXguZ2V0WCggaSArIDIgKTtcclxuXHJcblx0XHRcdFx0XHRwQS5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbkF0dHJpYnV0ZSwgdkEgKTtcclxuXHRcdFx0XHRcdHBCLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uQXR0cmlidXRlLCB2QiApO1xyXG5cdFx0XHRcdFx0cEMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyaWJ1dGUsIHZDICk7XHJcblxyXG5cdFx0XHRcdFx0Y2Iuc3ViVmVjdG9ycyggcEMsIHBCICk7XHJcblx0XHRcdFx0XHRhYi5zdWJWZWN0b3JzKCBwQSwgcEIgKTtcclxuXHRcdFx0XHRcdGNiLmNyb3NzKCBhYiApO1xyXG5cclxuXHRcdFx0XHRcdG5BLmZyb21CdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbEF0dHJpYnV0ZSwgdkEgKTtcclxuXHRcdFx0XHRcdG5CLmZyb21CdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbEF0dHJpYnV0ZSwgdkIgKTtcclxuXHRcdFx0XHRcdG5DLmZyb21CdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbEF0dHJpYnV0ZSwgdkMgKTtcclxuXHJcblx0XHRcdFx0XHRuQS5hZGQoIGNiICk7XHJcblx0XHRcdFx0XHRuQi5hZGQoIGNiICk7XHJcblx0XHRcdFx0XHRuQy5hZGQoIGNiICk7XHJcblxyXG5cdFx0XHRcdFx0bm9ybWFsQXR0cmlidXRlLnNldFhZWiggdkEsIG5BLngsIG5BLnksIG5BLnogKTtcclxuXHRcdFx0XHRcdG5vcm1hbEF0dHJpYnV0ZS5zZXRYWVooIHZCLCBuQi54LCBuQi55LCBuQi56ICk7XHJcblx0XHRcdFx0XHRub3JtYWxBdHRyaWJ1dGUuc2V0WFlaKCB2QywgbkMueCwgbkMueSwgbkMueiApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHQvLyBub24taW5kZXhlZCBlbGVtZW50cyAodW5jb25uZWN0ZWQgdHJpYW5nbGUgc291cClcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IHBvc2l0aW9uQXR0cmlidXRlLmNvdW50OyBpIDwgaWw7IGkgKz0gMyApIHtcclxuXHJcblx0XHRcdFx0XHRwQS5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbkF0dHJpYnV0ZSwgaSArIDAgKTtcclxuXHRcdFx0XHRcdHBCLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uQXR0cmlidXRlLCBpICsgMSApO1xyXG5cdFx0XHRcdFx0cEMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyaWJ1dGUsIGkgKyAyICk7XHJcblxyXG5cdFx0XHRcdFx0Y2Iuc3ViVmVjdG9ycyggcEMsIHBCICk7XHJcblx0XHRcdFx0XHRhYi5zdWJWZWN0b3JzKCBwQSwgcEIgKTtcclxuXHRcdFx0XHRcdGNiLmNyb3NzKCBhYiApO1xyXG5cclxuXHRcdFx0XHRcdG5vcm1hbEF0dHJpYnV0ZS5zZXRYWVooIGkgKyAwLCBjYi54LCBjYi55LCBjYi56ICk7XHJcblx0XHRcdFx0XHRub3JtYWxBdHRyaWJ1dGUuc2V0WFlaKCBpICsgMSwgY2IueCwgY2IueSwgY2IueiApO1xyXG5cdFx0XHRcdFx0bm9ybWFsQXR0cmlidXRlLnNldFhZWiggaSArIDIsIGNiLngsIGNiLnksIGNiLnogKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5ub3JtYWxpemVOb3JtYWxzKCk7XHJcblxyXG5cdFx0XHRub3JtYWxBdHRyaWJ1dGUubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFbnN1cmVzIGV2ZXJ5IG5vcm1hbCB2ZWN0b3IgaW4gYSBnZW9tZXRyeSB3aWxsIGhhdmUgYSBtYWduaXR1ZGUgb2YgYDFgLiBUaGlzIHdpbGxcclxuXHQgKiBjb3JyZWN0IGxpZ2h0aW5nIG9uIHRoZSBnZW9tZXRyeSBzdXJmYWNlcy5cclxuXHQgKi9cclxuXHRub3JtYWxpemVOb3JtYWxzKCkge1xyXG5cclxuXHRcdGNvbnN0IG5vcm1hbHMgPSB0aGlzLmF0dHJpYnV0ZXMubm9ybWFsO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBub3JtYWxzLmNvdW50OyBpIDwgaWw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRfdmVjdG9yLmZyb21CdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIGkgKTtcclxuXHJcblx0XHRcdF92ZWN0b3Iubm9ybWFsaXplKCk7XHJcblxyXG5cdFx0XHRub3JtYWxzLnNldFhZWiggaSwgX3ZlY3Rvci54LCBfdmVjdG9yLnksIF92ZWN0b3IueiApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm4gYSBuZXcgbm9uLWluZGV4IHZlcnNpb24gb2YgdGhpcyBpbmRleGVkIGdlb21ldHJ5LiBJZiB0aGUgZ2VvbWV0cnlcclxuXHQgKiBpcyBhbHJlYWR5IG5vbi1pbmRleGVkLCB0aGUgbWV0aG9kIGlzIGEgTk9PUC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0J1ZmZlckdlb21ldHJ5fSBUaGUgbm9uLWluZGV4ZWQgdmVyc2lvbiBvZiB0aGlzIGluZGV4ZWQgZ2VvbWV0cnkuXHJcblx0ICovXHJcblx0dG9Ob25JbmRleGVkKCkge1xyXG5cclxuXHRcdGZ1bmN0aW9uIGNvbnZlcnRCdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgaW5kaWNlcyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGFycmF5ID0gYXR0cmlidXRlLmFycmF5O1xyXG5cdFx0XHRjb25zdCBpdGVtU2l6ZSA9IGF0dHJpYnV0ZS5pdGVtU2l6ZTtcclxuXHRcdFx0Y29uc3Qgbm9ybWFsaXplZCA9IGF0dHJpYnV0ZS5ub3JtYWxpemVkO1xyXG5cclxuXHRcdFx0Y29uc3QgYXJyYXkyID0gbmV3IGFycmF5LmNvbnN0cnVjdG9yKCBpbmRpY2VzLmxlbmd0aCAqIGl0ZW1TaXplICk7XHJcblxyXG5cdFx0XHRsZXQgaW5kZXggPSAwLCBpbmRleDIgPSAwO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gaW5kaWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIGF0dHJpYnV0ZS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlICkge1xyXG5cclxuXHRcdFx0XHRcdGluZGV4ID0gaW5kaWNlc1sgaSBdICogYXR0cmlidXRlLmRhdGEuc3RyaWRlICsgYXR0cmlidXRlLm9mZnNldDtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRpbmRleCA9IGluZGljZXNbIGkgXSAqIGl0ZW1TaXplO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBqID0gMDsgaiA8IGl0ZW1TaXplOyBqICsrICkge1xyXG5cclxuXHRcdFx0XHRcdGFycmF5MlsgaW5kZXgyICsrIF0gPSBhcnJheVsgaW5kZXggKysgXTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIGFycmF5MiwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRpZiAoIHRoaXMuaW5kZXggPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeS50b05vbkluZGV4ZWQoKTogQnVmZmVyR2VvbWV0cnkgaXMgYWxyZWFkeSBub24taW5kZXhlZC4nICk7XHJcblx0XHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeTIgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcclxuXHJcblx0XHRjb25zdCBpbmRpY2VzID0gdGhpcy5pbmRleC5hcnJheTtcclxuXHRcdGNvbnN0IGF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZXM7XHJcblxyXG5cdFx0Ly8gYXR0cmlidXRlc1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IG5hbWUgaW4gYXR0cmlidXRlcyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbIG5hbWUgXTtcclxuXHJcblx0XHRcdGNvbnN0IG5ld0F0dHJpYnV0ZSA9IGNvbnZlcnRCdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgaW5kaWNlcyApO1xyXG5cclxuXHRcdFx0Z2VvbWV0cnkyLnNldEF0dHJpYnV0ZSggbmFtZSwgbmV3QXR0cmlidXRlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIG1vcnBoIGF0dHJpYnV0ZXNcclxuXHJcblx0XHRjb25zdCBtb3JwaEF0dHJpYnV0ZXMgPSB0aGlzLm1vcnBoQXR0cmlidXRlcztcclxuXHJcblx0XHRmb3IgKCBjb25zdCBuYW1lIGluIG1vcnBoQXR0cmlidXRlcyApIHtcclxuXHJcblx0XHRcdGNvbnN0IG1vcnBoQXJyYXkgPSBbXTtcclxuXHRcdFx0Y29uc3QgbW9ycGhBdHRyaWJ1dGUgPSBtb3JwaEF0dHJpYnV0ZXNbIG5hbWUgXTsgLy8gbW9ycGhBdHRyaWJ1dGU6IGFycmF5IG9mIEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGVzXHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gbW9ycGhBdHRyaWJ1dGUubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGF0dHJpYnV0ZSA9IG1vcnBoQXR0cmlidXRlWyBpIF07XHJcblxyXG5cdFx0XHRcdGNvbnN0IG5ld0F0dHJpYnV0ZSA9IGNvbnZlcnRCdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgaW5kaWNlcyApO1xyXG5cclxuXHRcdFx0XHRtb3JwaEFycmF5LnB1c2goIG5ld0F0dHJpYnV0ZSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Z2VvbWV0cnkyLm1vcnBoQXR0cmlidXRlc1sgbmFtZSBdID0gbW9ycGhBcnJheTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Z2VvbWV0cnkyLm1vcnBoVGFyZ2V0c1JlbGF0aXZlID0gdGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZTtcclxuXHJcblx0XHQvLyBncm91cHNcclxuXHJcblx0XHRjb25zdCBncm91cHMgPSB0aGlzLmdyb3VwcztcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBncm91cHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGdyb3VwID0gZ3JvdXBzWyBpIF07XHJcblx0XHRcdGdlb21ldHJ5Mi5hZGRHcm91cCggZ3JvdXAuc3RhcnQsIGdyb3VwLmNvdW50LCBncm91cC5tYXRlcmlhbEluZGV4ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBnZW9tZXRyeTI7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2VyaWFsaXplcyB0aGUgZ2VvbWV0cnkgaW50byBKU09OLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7T2JqZWN0fSBBIEpTT04gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc2VyaWFsaXplZCBnZW9tZXRyeS5cclxuXHQgKi9cclxuXHR0b0pTT04oKSB7XHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IHtcclxuXHRcdFx0bWV0YWRhdGE6IHtcclxuXHRcdFx0XHR2ZXJzaW9uOiA0LjYsXHJcblx0XHRcdFx0dHlwZTogJ0J1ZmZlckdlb21ldHJ5JyxcclxuXHRcdFx0XHRnZW5lcmF0b3I6ICdCdWZmZXJHZW9tZXRyeS50b0pTT04nXHJcblx0XHRcdH1cclxuXHRcdH07XHJcblxyXG5cdFx0Ly8gc3RhbmRhcmQgQnVmZmVyR2VvbWV0cnkgc2VyaWFsaXphdGlvblxyXG5cclxuXHRcdGRhdGEudXVpZCA9IHRoaXMudXVpZDtcclxuXHRcdGRhdGEudHlwZSA9IHRoaXMudHlwZTtcclxuXHRcdGlmICggdGhpcy5uYW1lICE9PSAnJyApIGRhdGEubmFtZSA9IHRoaXMubmFtZTtcclxuXHRcdGlmICggT2JqZWN0LmtleXMoIHRoaXMudXNlckRhdGEgKS5sZW5ndGggPiAwICkgZGF0YS51c2VyRGF0YSA9IHRoaXMudXNlckRhdGE7XHJcblxyXG5cdFx0aWYgKCB0aGlzLnBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGNvbnN0IHBhcmFtZXRlcnMgPSB0aGlzLnBhcmFtZXRlcnM7XHJcblxyXG5cdFx0XHRmb3IgKCBjb25zdCBrZXkgaW4gcGFyYW1ldGVycyApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBwYXJhbWV0ZXJzWyBrZXkgXSAhPT0gdW5kZWZpbmVkICkgZGF0YVsga2V5IF0gPSBwYXJhbWV0ZXJzWyBrZXkgXTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBkYXRhO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBmb3Igc2ltcGxpY2l0eSB0aGUgY29kZSBhc3N1bWVzIGF0dHJpYnV0ZXMgYXJlIG5vdCBzaGFyZWQgYWNyb3NzIGdlb21ldHJpZXMsIHNlZSAjMTU4MTFcclxuXHJcblx0XHRkYXRhLmRhdGEgPSB7IGF0dHJpYnV0ZXM6IHt9IH07XHJcblxyXG5cdFx0Y29uc3QgaW5kZXggPSB0aGlzLmluZGV4O1xyXG5cclxuXHRcdGlmICggaW5kZXggIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRkYXRhLmRhdGEuaW5kZXggPSB7XHJcblx0XHRcdFx0dHlwZTogaW5kZXguYXJyYXkuY29uc3RydWN0b3IubmFtZSxcclxuXHRcdFx0XHRhcnJheTogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGluZGV4LmFycmF5IClcclxuXHRcdFx0fTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgYXR0cmlidXRlcyA9IHRoaXMuYXR0cmlidXRlcztcclxuXHJcblx0XHRmb3IgKCBjb25zdCBrZXkgaW4gYXR0cmlidXRlcyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbIGtleSBdO1xyXG5cclxuXHRcdFx0ZGF0YS5kYXRhLmF0dHJpYnV0ZXNbIGtleSBdID0gYXR0cmlidXRlLnRvSlNPTiggZGF0YS5kYXRhICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IG1vcnBoQXR0cmlidXRlcyA9IHt9O1xyXG5cdFx0bGV0IGhhc01vcnBoQXR0cmlidXRlcyA9IGZhbHNlO1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IGtleSBpbiB0aGlzLm1vcnBoQXR0cmlidXRlcyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGF0dHJpYnV0ZUFycmF5ID0gdGhpcy5tb3JwaEF0dHJpYnV0ZXNbIGtleSBdO1xyXG5cclxuXHRcdFx0Y29uc3QgYXJyYXkgPSBbXTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBhdHRyaWJ1dGVBcnJheS5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgYXR0cmlidXRlID0gYXR0cmlidXRlQXJyYXlbIGkgXTtcclxuXHJcblx0XHRcdFx0YXJyYXkucHVzaCggYXR0cmlidXRlLnRvSlNPTiggZGF0YS5kYXRhICkgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggYXJyYXkubGVuZ3RoID4gMCApIHtcclxuXHJcblx0XHRcdFx0bW9ycGhBdHRyaWJ1dGVzWyBrZXkgXSA9IGFycmF5O1xyXG5cclxuXHRcdFx0XHRoYXNNb3JwaEF0dHJpYnV0ZXMgPSB0cnVlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGhhc01vcnBoQXR0cmlidXRlcyApIHtcclxuXHJcblx0XHRcdGRhdGEuZGF0YS5tb3JwaEF0dHJpYnV0ZXMgPSBtb3JwaEF0dHJpYnV0ZXM7XHJcblx0XHRcdGRhdGEuZGF0YS5tb3JwaFRhcmdldHNSZWxhdGl2ZSA9IHRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGdyb3VwcyA9IHRoaXMuZ3JvdXBzO1xyXG5cclxuXHRcdGlmICggZ3JvdXBzLmxlbmd0aCA+IDAgKSB7XHJcblxyXG5cdFx0XHRkYXRhLmRhdGEuZ3JvdXBzID0gSlNPTi5wYXJzZSggSlNPTi5zdHJpbmdpZnkoIGdyb3VwcyApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGJvdW5kaW5nU3BoZXJlID0gdGhpcy5ib3VuZGluZ1NwaGVyZTtcclxuXHJcblx0XHRpZiAoIGJvdW5kaW5nU3BoZXJlICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0ZGF0YS5kYXRhLmJvdW5kaW5nU3BoZXJlID0ge1xyXG5cdFx0XHRcdGNlbnRlcjogYm91bmRpbmdTcGhlcmUuY2VudGVyLnRvQXJyYXkoKSxcclxuXHRcdFx0XHRyYWRpdXM6IGJvdW5kaW5nU3BoZXJlLnJhZGl1c1xyXG5cdFx0XHR9O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZGF0YTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbmV3IGdlb21ldHJ5IHdpdGggY29waWVkIHZhbHVlcyBmcm9tIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtCdWZmZXJHZW9tZXRyeX0gQSBjbG9uZSBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNsb25lKCkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gZ2VvbWV0cnkgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyR2VvbWV0cnl9IHNvdXJjZSAtIFRoZSBnZW9tZXRyeSB0byBjb3B5LlxyXG5cdCAqIEByZXR1cm4ge0J1ZmZlckdlb21ldHJ5fSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHQvLyByZXNldFxyXG5cclxuXHRcdHRoaXMuaW5kZXggPSBudWxsO1xyXG5cdFx0dGhpcy5hdHRyaWJ1dGVzID0ge307XHJcblx0XHR0aGlzLm1vcnBoQXR0cmlidXRlcyA9IHt9O1xyXG5cdFx0dGhpcy5ncm91cHMgPSBbXTtcclxuXHRcdHRoaXMuYm91bmRpbmdCb3ggPSBudWxsO1xyXG5cdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IG51bGw7XHJcblxyXG5cdFx0Ly8gdXNlZCBmb3Igc3RvcmluZyBjbG9uZWQsIHNoYXJlZCBkYXRhXHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IHt9O1xyXG5cclxuXHRcdC8vIG5hbWVcclxuXHJcblx0XHR0aGlzLm5hbWUgPSBzb3VyY2UubmFtZTtcclxuXHJcblx0XHQvLyBpbmRleFxyXG5cclxuXHRcdGNvbnN0IGluZGV4ID0gc291cmNlLmluZGV4O1xyXG5cclxuXHRcdGlmICggaW5kZXggIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnNldEluZGV4KCBpbmRleC5jbG9uZSgpICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGF0dHJpYnV0ZXNcclxuXHJcblx0XHRjb25zdCBhdHRyaWJ1dGVzID0gc291cmNlLmF0dHJpYnV0ZXM7XHJcblxyXG5cdFx0Zm9yICggY29uc3QgbmFtZSBpbiBhdHRyaWJ1dGVzICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYXR0cmlidXRlID0gYXR0cmlidXRlc1sgbmFtZSBdO1xyXG5cdFx0XHR0aGlzLnNldEF0dHJpYnV0ZSggbmFtZSwgYXR0cmlidXRlLmNsb25lKCBkYXRhICkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gbW9ycGggYXR0cmlidXRlc1xyXG5cclxuXHRcdGNvbnN0IG1vcnBoQXR0cmlidXRlcyA9IHNvdXJjZS5tb3JwaEF0dHJpYnV0ZXM7XHJcblxyXG5cdFx0Zm9yICggY29uc3QgbmFtZSBpbiBtb3JwaEF0dHJpYnV0ZXMgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBhcnJheSA9IFtdO1xyXG5cdFx0XHRjb25zdCBtb3JwaEF0dHJpYnV0ZSA9IG1vcnBoQXR0cmlidXRlc1sgbmFtZSBdOyAvLyBtb3JwaEF0dHJpYnV0ZTogYXJyYXkgb2YgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZXNcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IG1vcnBoQXR0cmlidXRlLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGFycmF5LnB1c2goIG1vcnBoQXR0cmlidXRlWyBpIF0uY2xvbmUoIGRhdGEgKSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5tb3JwaEF0dHJpYnV0ZXNbIG5hbWUgXSA9IGFycmF5O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlID0gc291cmNlLm1vcnBoVGFyZ2V0c1JlbGF0aXZlO1xyXG5cclxuXHRcdC8vIGdyb3Vwc1xyXG5cclxuXHRcdGNvbnN0IGdyb3VwcyA9IHNvdXJjZS5ncm91cHM7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gZ3JvdXBzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBncm91cCA9IGdyb3Vwc1sgaSBdO1xyXG5cdFx0XHR0aGlzLmFkZEdyb3VwKCBncm91cC5zdGFydCwgZ3JvdXAuY291bnQsIGdyb3VwLm1hdGVyaWFsSW5kZXggKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gYm91bmRpbmcgYm94XHJcblxyXG5cdFx0Y29uc3QgYm91bmRpbmdCb3ggPSBzb3VyY2UuYm91bmRpbmdCb3g7XHJcblxyXG5cdFx0aWYgKCBib3VuZGluZ0JveCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuYm91bmRpbmdCb3ggPSBib3VuZGluZ0JveC5jbG9uZSgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBib3VuZGluZyBzcGhlcmVcclxuXHJcblx0XHRjb25zdCBib3VuZGluZ1NwaGVyZSA9IHNvdXJjZS5ib3VuZGluZ1NwaGVyZTtcclxuXHJcblx0XHRpZiAoIGJvdW5kaW5nU3BoZXJlICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IGJvdW5kaW5nU3BoZXJlLmNsb25lKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGRyYXcgcmFuZ2VcclxuXHJcblx0XHR0aGlzLmRyYXdSYW5nZS5zdGFydCA9IHNvdXJjZS5kcmF3UmFuZ2Uuc3RhcnQ7XHJcblx0XHR0aGlzLmRyYXdSYW5nZS5jb3VudCA9IHNvdXJjZS5kcmF3UmFuZ2UuY291bnQ7XHJcblxyXG5cdFx0Ly8gdXNlciBkYXRhXHJcblxyXG5cdFx0dGhpcy51c2VyRGF0YSA9IHNvdXJjZS51c2VyRGF0YTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGcmVlcyB0aGUgR1BVLXJlbGF0ZWQgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGlzIGluc3RhbmNlLiBDYWxsIHRoaXNcclxuXHQgKiBtZXRob2Qgd2hlbmV2ZXIgdGhpcyBpbnN0YW5jZSBpcyBubyBsb25nZXIgdXNlZCBpbiB5b3VyIGFwcC5cclxuXHQgKlxyXG5cdCAqIEBmaXJlcyBCdWZmZXJHZW9tZXRyeSNkaXNwb3NlXHJcblx0ICovXHJcblx0ZGlzcG9zZSgpIHtcclxuXHJcblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2Rpc3Bvc2UnIH0gKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgQnVmZmVyR2VvbWV0cnkgfTtcclxuIiwiaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjIuanMnO1xyXG5pbXBvcnQgeyBTcGhlcmUgfSBmcm9tICcuLi9tYXRoL1NwaGVyZS5qcyc7XHJcbmltcG9ydCB7IFJheSB9IGZyb20gJy4uL21hdGgvUmF5LmpzJztcclxuaW1wb3J0IHsgTWF0cml4NCB9IGZyb20gJy4uL21hdGgvTWF0cml4NC5qcyc7XHJcbmltcG9ydCB7IE9iamVjdDNEIH0gZnJvbSAnLi4vY29yZS9PYmplY3QzRC5qcyc7XHJcbmltcG9ydCB7IFRyaWFuZ2xlIH0gZnJvbSAnLi4vbWF0aC9UcmlhbmdsZS5qcyc7XHJcbmltcG9ydCB7IEJhY2tTaWRlLCBGcm9udFNpZGUgfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBNZXNoQmFzaWNNYXRlcmlhbCB9IGZyb20gJy4uL21hdGVyaWFscy9NZXNoQmFzaWNNYXRlcmlhbC5qcyc7XHJcbmltcG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9CdWZmZXJHZW9tZXRyeS5qcyc7XHJcblxyXG5jb25zdCBfaW52ZXJzZU1hdHJpeCA9IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDQoKTtcclxuY29uc3QgX3JheSA9IC8qQF9fUFVSRV9fKi8gbmV3IFJheSgpO1xyXG5jb25zdCBfc3BoZXJlID0gLypAX19QVVJFX18qLyBuZXcgU3BoZXJlKCk7XHJcbmNvbnN0IF9zcGhlcmVIaXRBdCA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuXHJcbmNvbnN0IF92QSA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX3ZCID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfdkMgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcblxyXG5jb25zdCBfdGVtcEEgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF9tb3JwaEEgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcblxyXG5jb25zdCBfaW50ZXJzZWN0aW9uUG9pbnQgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF9pbnRlcnNlY3Rpb25Qb2ludFdvcmxkID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5cclxuLyoqXHJcbiAqIENsYXNzIHJlcHJlc2VudGluZyB0cmlhbmd1bGFyIHBvbHlnb24gbWVzaCBiYXNlZCBvYmplY3RzLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBnZW9tZXRyeSA9IG5ldyBUSFJFRS5Cb3hHZW9tZXRyeSggMSwgMSwgMSApO1xyXG4gKiBjb25zdCBtYXRlcmlhbCA9IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogMHhmZmZmMDAgfSApO1xyXG4gKiBjb25zdCBtZXNoID0gbmV3IFRIUkVFLk1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG4gKiBzY2VuZS5hZGQoIG1lc2ggKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBPYmplY3QzRFxyXG4gKi9cclxuY2xhc3MgTWVzaCBleHRlbmRzIE9iamVjdDNEIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBtZXNoLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCdWZmZXJHZW9tZXRyeX0gW2dlb21ldHJ5XSAtIFRoZSBtZXNoIGdlb21ldHJ5LlxyXG5cdCAqIEBwYXJhbSB7TWF0ZXJpYWx8QXJyYXk8TWF0ZXJpYWw+fSBbbWF0ZXJpYWxdIC0gVGhlIG1lc2ggbWF0ZXJpYWwuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCksIG1hdGVyaWFsID0gbmV3IE1lc2hCYXNpY01hdGVyaWFsKCkgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNNZXNoID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnTWVzaCc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbWVzaCBnZW9tZXRyeS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QnVmZmVyR2VvbWV0cnl9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ2VvbWV0cnkgPSBnZW9tZXRyeTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBtZXNoIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtNYXRlcmlhbHxBcnJheTxNYXRlcmlhbD59XHJcblx0XHQgKiBAZGVmYXVsdCBNZXNoQmFzaWNNYXRlcmlhbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1hdGVyaWFsID0gbWF0ZXJpYWw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGRpY3Rpb25hcnkgcmVwcmVzZW50aW5nIHRoZSBtb3JwaCB0YXJnZXRzIGluIHRoZSBnZW9tZXRyeS4gVGhlIGtleSBpcyB0aGVcclxuXHRcdCAqIG1vcnBoIHRhcmdldHMgbmFtZSwgdGhlIHZhbHVlIGl0cyBhdHRyaWJ1dGUgaW5kZXguIFRoaXMgbWVtYmVyIGlzIGB1bmRlZmluZWRgXHJcblx0XHQgKiBieSBkZWZhdWx0IGFuZCBvbmx5IHNldCB3aGVuIG1vcnBoIHRhcmdldHMgYXJlIGRldGVjdGVkIGluIHRoZSBnZW9tZXRyeS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0PFN0cmluZyxudW1iZXI+fHVuZGVmaW5lZH1cclxuXHRcdCAqIEBkZWZhdWx0IHVuZGVmaW5lZFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeSA9IHVuZGVmaW5lZDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIGFycmF5IG9mIHdlaWdodHMgdHlwaWNhbGx5IGluIHRoZSByYW5nZSBgWzAsMV1gIHRoYXQgc3BlY2lmeSBob3cgbXVjaCBvZiB0aGUgbW9ycGhcclxuXHRcdCAqIGlzIGFwcGxpZWQuIFRoaXMgbWVtYmVyIGlzIGB1bmRlZmluZWRgIGJ5IGRlZmF1bHQgYW5kIG9ubHkgc2V0IHdoZW4gbW9ycGggdGFyZ2V0cyBhcmVcclxuXHRcdCAqIGRldGVjdGVkIGluIHRoZSBnZW9tZXRyeS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8bnVtYmVyPnx1bmRlZmluZWR9XHJcblx0XHQgKiBAZGVmYXVsdCB1bmRlZmluZWRcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMgPSB1bmRlZmluZWQ7XHJcblxyXG5cdFx0dGhpcy51cGRhdGVNb3JwaFRhcmdldHMoKTtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UsIHJlY3Vyc2l2ZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UsIHJlY3Vyc2l2ZSApO1xyXG5cclxuXHRcdGlmICggc291cmNlLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMgPSBzb3VyY2UubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnNsaWNlKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggc291cmNlLm1vcnBoVGFyZ2V0RGljdGlvbmFyeSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0dGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnkgPSBPYmplY3QuYXNzaWduKCB7fSwgc291cmNlLm1vcnBoVGFyZ2V0RGljdGlvbmFyeSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLm1hdGVyaWFsID0gQXJyYXkuaXNBcnJheSggc291cmNlLm1hdGVyaWFsICkgPyBzb3VyY2UubWF0ZXJpYWwuc2xpY2UoKSA6IHNvdXJjZS5tYXRlcmlhbDtcclxuXHRcdHRoaXMuZ2VvbWV0cnkgPSBzb3VyY2UuZ2VvbWV0cnk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdmFsdWVzIG9mIHtAbGluayBNZXNoI21vcnBoVGFyZ2V0RGljdGlvbmFyeX0gYW5kIHtAbGluayBNZXNoI21vcnBoVGFyZ2V0SW5mbHVlbmNlc31cclxuXHQgKiB0byBtYWtlIHN1cmUgZXhpc3RpbmcgbW9ycGggdGFyZ2V0cyBjYW4gaW5mbHVlbmNlIHRoaXMgM0Qgb2JqZWN0LlxyXG5cdCAqL1xyXG5cdHVwZGF0ZU1vcnBoVGFyZ2V0cygpIHtcclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XHJcblxyXG5cdFx0Y29uc3QgbW9ycGhBdHRyaWJ1dGVzID0gZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzO1xyXG5cdFx0Y29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKCBtb3JwaEF0dHJpYnV0ZXMgKTtcclxuXHJcblx0XHRpZiAoIGtleXMubGVuZ3RoID4gMCApIHtcclxuXHJcblx0XHRcdGNvbnN0IG1vcnBoQXR0cmlidXRlID0gbW9ycGhBdHRyaWJ1dGVzWyBrZXlzWyAwIF0gXTtcclxuXHJcblx0XHRcdGlmICggbW9ycGhBdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMgPSBbXTtcclxuXHRcdFx0XHR0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeSA9IHt9O1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgbSA9IDAsIG1sID0gbW9ycGhBdHRyaWJ1dGUubGVuZ3RoOyBtIDwgbWw7IG0gKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgbmFtZSA9IG1vcnBoQXR0cmlidXRlWyBtIF0ubmFtZSB8fCBTdHJpbmcoIG0gKTtcclxuXHJcblx0XHRcdFx0XHR0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5wdXNoKCAwICk7XHJcblx0XHRcdFx0XHR0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeVsgbmFtZSBdID0gbTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBsb2NhbC1zcGFjZSBwb3NpdGlvbiBvZiB0aGUgdmVydGV4IGF0IHRoZSBnaXZlbiBpbmRleCwgdGFraW5nIGludG9cclxuXHQgKiBhY2NvdW50IHRoZSBjdXJyZW50IGFuaW1hdGlvbiBzdGF0ZSBvZiBib3RoIG1vcnBoIHRhcmdldHMgYW5kIHNraW5uaW5nLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIHZlcnRleCBpbmRleC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHRhcmdldCAtIFRoZSB0YXJnZXQgb2JqZWN0IHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbWV0aG9kJ3MgcmVzdWx0LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IFRoZSB2ZXJ0ZXggcG9zaXRpb24gaW4gbG9jYWwgc3BhY2UuXHJcblx0ICovXHJcblx0Z2V0VmVydGV4UG9zaXRpb24oIGluZGV4LCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xyXG5cdFx0Y29uc3QgcG9zaXRpb24gPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xyXG5cdFx0Y29uc3QgbW9ycGhQb3NpdGlvbiA9IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbjtcclxuXHRcdGNvbnN0IG1vcnBoVGFyZ2V0c1JlbGF0aXZlID0gZ2VvbWV0cnkubW9ycGhUYXJnZXRzUmVsYXRpdmU7XHJcblxyXG5cdFx0dGFyZ2V0LmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBpbmRleCApO1xyXG5cclxuXHRcdGNvbnN0IG1vcnBoSW5mbHVlbmNlcyA9IHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzO1xyXG5cclxuXHRcdGlmICggbW9ycGhQb3NpdGlvbiAmJiBtb3JwaEluZmx1ZW5jZXMgKSB7XHJcblxyXG5cdFx0XHRfbW9ycGhBLnNldCggMCwgMCwgMCApO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IG1vcnBoUG9zaXRpb24ubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGluZmx1ZW5jZSA9IG1vcnBoSW5mbHVlbmNlc1sgaSBdO1xyXG5cdFx0XHRcdGNvbnN0IG1vcnBoQXR0cmlidXRlID0gbW9ycGhQb3NpdGlvblsgaSBdO1xyXG5cclxuXHRcdFx0XHRpZiAoIGluZmx1ZW5jZSA9PT0gMCApIGNvbnRpbnVlO1xyXG5cclxuXHRcdFx0XHRfdGVtcEEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggbW9ycGhBdHRyaWJ1dGUsIGluZGV4ICk7XHJcblxyXG5cdFx0XHRcdGlmICggbW9ycGhUYXJnZXRzUmVsYXRpdmUgKSB7XHJcblxyXG5cdFx0XHRcdFx0X21vcnBoQS5hZGRTY2FsZWRWZWN0b3IoIF90ZW1wQSwgaW5mbHVlbmNlICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0X21vcnBoQS5hZGRTY2FsZWRWZWN0b3IoIF90ZW1wQS5zdWIoIHRhcmdldCApLCBpbmZsdWVuY2UgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGFyZ2V0LmFkZCggX21vcnBoQSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGFyZ2V0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIGludGVyc2VjdGlvbiBwb2ludHMgYmV0d2VlbiBhIGNhc3RlZCByYXkgYW5kIHRoaXMgbGluZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmF5Y2FzdGVyfSByYXljYXN0ZXIgLSBUaGUgcmF5Y2FzdGVyLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8T2JqZWN0Pn0gaW50ZXJzZWN0cyAtIFRoZSB0YXJnZXQgYXJyYXkgdGhhdCBob2xkcyB0aGUgaW50ZXJzZWN0aW9uIHBvaW50cy5cclxuXHQgKi9cclxuXHRyYXljYXN0KCByYXljYXN0ZXIsIGludGVyc2VjdHMgKSB7XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xyXG5cdFx0Y29uc3QgbWF0ZXJpYWwgPSB0aGlzLm1hdGVyaWFsO1xyXG5cdFx0Y29uc3QgbWF0cml4V29ybGQgPSB0aGlzLm1hdHJpeFdvcmxkO1xyXG5cclxuXHRcdGlmICggbWF0ZXJpYWwgPT09IHVuZGVmaW5lZCApIHJldHVybjtcclxuXHJcblx0XHQvLyB0ZXN0IHdpdGggYm91bmRpbmcgc3BoZXJlIGluIHdvcmxkIHNwYWNlXHJcblxyXG5cdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCApIGdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xyXG5cclxuXHRcdF9zcGhlcmUuY29weSggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgKTtcclxuXHRcdF9zcGhlcmUuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApO1xyXG5cclxuXHRcdC8vIGNoZWNrIGRpc3RhbmNlIGZyb20gcmF5IG9yaWdpbiB0byBib3VuZGluZyBzcGhlcmVcclxuXHJcblx0XHRfcmF5LmNvcHkoIHJheWNhc3Rlci5yYXkgKS5yZWNhc3QoIHJheWNhc3Rlci5uZWFyICk7XHJcblxyXG5cdFx0aWYgKCBfc3BoZXJlLmNvbnRhaW5zUG9pbnQoIF9yYXkub3JpZ2luICkgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0aWYgKCBfcmF5LmludGVyc2VjdFNwaGVyZSggX3NwaGVyZSwgX3NwaGVyZUhpdEF0ICkgPT09IG51bGwgKSByZXR1cm47XHJcblxyXG5cdFx0XHRpZiAoIF9yYXkub3JpZ2luLmRpc3RhbmNlVG9TcXVhcmVkKCBfc3BoZXJlSGl0QXQgKSA+ICggcmF5Y2FzdGVyLmZhciAtIHJheWNhc3Rlci5uZWFyICkgKiogMiApIHJldHVybjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gY29udmVydCByYXkgdG8gbG9jYWwgc3BhY2Ugb2YgbWVzaFxyXG5cclxuXHRcdF9pbnZlcnNlTWF0cml4LmNvcHkoIG1hdHJpeFdvcmxkICkuaW52ZXJ0KCk7XHJcblx0XHRfcmF5LmNvcHkoIHJheWNhc3Rlci5yYXkgKS5hcHBseU1hdHJpeDQoIF9pbnZlcnNlTWF0cml4ICk7XHJcblxyXG5cdFx0Ly8gdGVzdCB3aXRoIGJvdW5kaW5nIGJveCBpbiBsb2NhbCBzcGFjZVxyXG5cclxuXHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdCb3ggIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRpZiAoIF9yYXkuaW50ZXJzZWN0c0JveCggZ2VvbWV0cnkuYm91bmRpbmdCb3ggKSA9PT0gZmFsc2UgKSByZXR1cm47XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIHRlc3QgZm9yIGludGVyc2VjdGlvbnMgd2l0aCBnZW9tZXRyeVxyXG5cclxuXHRcdHRoaXMuX2NvbXB1dGVJbnRlcnNlY3Rpb25zKCByYXljYXN0ZXIsIGludGVyc2VjdHMsIF9yYXkgKTtcclxuXHJcblx0fVxyXG5cclxuXHRfY29tcHV0ZUludGVyc2VjdGlvbnMoIHJheWNhc3RlciwgaW50ZXJzZWN0cywgcmF5TG9jYWxTcGFjZSApIHtcclxuXHJcblx0XHRsZXQgaW50ZXJzZWN0aW9uO1xyXG5cclxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcclxuXHRcdGNvbnN0IG1hdGVyaWFsID0gdGhpcy5tYXRlcmlhbDtcclxuXHJcblx0XHRjb25zdCBpbmRleCA9IGdlb21ldHJ5LmluZGV4O1xyXG5cdFx0Y29uc3QgcG9zaXRpb24gPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xyXG5cdFx0Y29uc3QgdXYgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnV2O1xyXG5cdFx0Y29uc3QgdXYxID0gZ2VvbWV0cnkuYXR0cmlidXRlcy51djE7XHJcblx0XHRjb25zdCBub3JtYWwgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLm5vcm1hbDtcclxuXHRcdGNvbnN0IGdyb3VwcyA9IGdlb21ldHJ5Lmdyb3VwcztcclxuXHRcdGNvbnN0IGRyYXdSYW5nZSA9IGdlb21ldHJ5LmRyYXdSYW5nZTtcclxuXHJcblx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0Ly8gaW5kZXhlZCBidWZmZXIgZ2VvbWV0cnlcclxuXHJcblx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggbWF0ZXJpYWwgKSApIHtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IGdyb3Vwcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBncm91cCA9IGdyb3Vwc1sgaSBdO1xyXG5cdFx0XHRcdFx0Y29uc3QgZ3JvdXBNYXRlcmlhbCA9IG1hdGVyaWFsWyBncm91cC5tYXRlcmlhbEluZGV4IF07XHJcblxyXG5cdFx0XHRcdFx0Y29uc3Qgc3RhcnQgPSBNYXRoLm1heCggZ3JvdXAuc3RhcnQsIGRyYXdSYW5nZS5zdGFydCApO1xyXG5cdFx0XHRcdFx0Y29uc3QgZW5kID0gTWF0aC5taW4oIGluZGV4LmNvdW50LCBNYXRoLm1pbiggKCBncm91cC5zdGFydCArIGdyb3VwLmNvdW50ICksICggZHJhd1JhbmdlLnN0YXJ0ICsgZHJhd1JhbmdlLmNvdW50ICkgKSApO1xyXG5cclxuXHRcdFx0XHRcdGZvciAoIGxldCBqID0gc3RhcnQsIGpsID0gZW5kOyBqIDwgamw7IGogKz0gMyApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnN0IGEgPSBpbmRleC5nZXRYKCBqICk7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGIgPSBpbmRleC5nZXRYKCBqICsgMSApO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBjID0gaW5kZXguZ2V0WCggaiArIDIgKTtcclxuXHJcblx0XHRcdFx0XHRcdGludGVyc2VjdGlvbiA9IGNoZWNrR2VvbWV0cnlJbnRlcnNlY3Rpb24oIHRoaXMsIGdyb3VwTWF0ZXJpYWwsIHJheWNhc3RlciwgcmF5TG9jYWxTcGFjZSwgdXYsIHV2MSwgbm9ybWFsLCBhLCBiLCBjICk7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIGludGVyc2VjdGlvbiApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0aW50ZXJzZWN0aW9uLmZhY2VJbmRleCA9IE1hdGguZmxvb3IoIGogLyAzICk7IC8vIHRyaWFuZ2xlIG51bWJlciBpbiBpbmRleGVkIGJ1ZmZlciBzZW1hbnRpY3NcclxuXHRcdFx0XHRcdFx0XHRpbnRlcnNlY3Rpb24uZmFjZS5tYXRlcmlhbEluZGV4ID0gZ3JvdXAubWF0ZXJpYWxJbmRleDtcclxuXHRcdFx0XHRcdFx0XHRpbnRlcnNlY3RzLnB1c2goIGludGVyc2VjdGlvbiApO1xyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0Y29uc3Qgc3RhcnQgPSBNYXRoLm1heCggMCwgZHJhd1JhbmdlLnN0YXJ0ICk7XHJcblx0XHRcdFx0Y29uc3QgZW5kID0gTWF0aC5taW4oIGluZGV4LmNvdW50LCAoIGRyYXdSYW5nZS5zdGFydCArIGRyYXdSYW5nZS5jb3VudCApICk7XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gc3RhcnQsIGlsID0gZW5kOyBpIDwgaWw7IGkgKz0gMyApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBhID0gaW5kZXguZ2V0WCggaSApO1xyXG5cdFx0XHRcdFx0Y29uc3QgYiA9IGluZGV4LmdldFgoIGkgKyAxICk7XHJcblx0XHRcdFx0XHRjb25zdCBjID0gaW5kZXguZ2V0WCggaSArIDIgKTtcclxuXHJcblx0XHRcdFx0XHRpbnRlcnNlY3Rpb24gPSBjaGVja0dlb21ldHJ5SW50ZXJzZWN0aW9uKCB0aGlzLCBtYXRlcmlhbCwgcmF5Y2FzdGVyLCByYXlMb2NhbFNwYWNlLCB1diwgdXYxLCBub3JtYWwsIGEsIGIsIGMgKTtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGludGVyc2VjdGlvbiApIHtcclxuXHJcblx0XHRcdFx0XHRcdGludGVyc2VjdGlvbi5mYWNlSW5kZXggPSBNYXRoLmZsb29yKCBpIC8gMyApOyAvLyB0cmlhbmdsZSBudW1iZXIgaW4gaW5kZXhlZCBidWZmZXIgc2VtYW50aWNzXHJcblx0XHRcdFx0XHRcdGludGVyc2VjdHMucHVzaCggaW50ZXJzZWN0aW9uICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmICggcG9zaXRpb24gIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdC8vIG5vbi1pbmRleGVkIGJ1ZmZlciBnZW9tZXRyeVxyXG5cclxuXHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBtYXRlcmlhbCApICkge1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gZ3JvdXBzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGdyb3VwID0gZ3JvdXBzWyBpIF07XHJcblx0XHRcdFx0XHRjb25zdCBncm91cE1hdGVyaWFsID0gbWF0ZXJpYWxbIGdyb3VwLm1hdGVyaWFsSW5kZXggXTtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBzdGFydCA9IE1hdGgubWF4KCBncm91cC5zdGFydCwgZHJhd1JhbmdlLnN0YXJ0ICk7XHJcblx0XHRcdFx0XHRjb25zdCBlbmQgPSBNYXRoLm1pbiggcG9zaXRpb24uY291bnQsIE1hdGgubWluKCAoIGdyb3VwLnN0YXJ0ICsgZ3JvdXAuY291bnQgKSwgKCBkcmF3UmFuZ2Uuc3RhcnQgKyBkcmF3UmFuZ2UuY291bnQgKSApICk7XHJcblxyXG5cdFx0XHRcdFx0Zm9yICggbGV0IGogPSBzdGFydCwgamwgPSBlbmQ7IGogPCBqbDsgaiArPSAzICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgYSA9IGo7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGIgPSBqICsgMTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgYyA9IGogKyAyO1xyXG5cclxuXHRcdFx0XHRcdFx0aW50ZXJzZWN0aW9uID0gY2hlY2tHZW9tZXRyeUludGVyc2VjdGlvbiggdGhpcywgZ3JvdXBNYXRlcmlhbCwgcmF5Y2FzdGVyLCByYXlMb2NhbFNwYWNlLCB1diwgdXYxLCBub3JtYWwsIGEsIGIsIGMgKTtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggaW50ZXJzZWN0aW9uICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpbnRlcnNlY3Rpb24uZmFjZUluZGV4ID0gTWF0aC5mbG9vciggaiAvIDMgKTsgLy8gdHJpYW5nbGUgbnVtYmVyIGluIG5vbi1pbmRleGVkIGJ1ZmZlciBzZW1hbnRpY3NcclxuXHRcdFx0XHRcdFx0XHRpbnRlcnNlY3Rpb24uZmFjZS5tYXRlcmlhbEluZGV4ID0gZ3JvdXAubWF0ZXJpYWxJbmRleDtcclxuXHRcdFx0XHRcdFx0XHRpbnRlcnNlY3RzLnB1c2goIGludGVyc2VjdGlvbiApO1xyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0Y29uc3Qgc3RhcnQgPSBNYXRoLm1heCggMCwgZHJhd1JhbmdlLnN0YXJ0ICk7XHJcblx0XHRcdFx0Y29uc3QgZW5kID0gTWF0aC5taW4oIHBvc2l0aW9uLmNvdW50LCAoIGRyYXdSYW5nZS5zdGFydCArIGRyYXdSYW5nZS5jb3VudCApICk7XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gc3RhcnQsIGlsID0gZW5kOyBpIDwgaWw7IGkgKz0gMyApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBhID0gaTtcclxuXHRcdFx0XHRcdGNvbnN0IGIgPSBpICsgMTtcclxuXHRcdFx0XHRcdGNvbnN0IGMgPSBpICsgMjtcclxuXHJcblx0XHRcdFx0XHRpbnRlcnNlY3Rpb24gPSBjaGVja0dlb21ldHJ5SW50ZXJzZWN0aW9uKCB0aGlzLCBtYXRlcmlhbCwgcmF5Y2FzdGVyLCByYXlMb2NhbFNwYWNlLCB1diwgdXYxLCBub3JtYWwsIGEsIGIsIGMgKTtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGludGVyc2VjdGlvbiApIHtcclxuXHJcblx0XHRcdFx0XHRcdGludGVyc2VjdGlvbi5mYWNlSW5kZXggPSBNYXRoLmZsb29yKCBpIC8gMyApOyAvLyB0cmlhbmdsZSBudW1iZXIgaW4gbm9uLWluZGV4ZWQgYnVmZmVyIHNlbWFudGljc1xyXG5cdFx0XHRcdFx0XHRpbnRlcnNlY3RzLnB1c2goIGludGVyc2VjdGlvbiApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gY2hlY2tJbnRlcnNlY3Rpb24oIG9iamVjdCwgbWF0ZXJpYWwsIHJheWNhc3RlciwgcmF5LCBwQSwgcEIsIHBDLCBwb2ludCApIHtcclxuXHJcblx0bGV0IGludGVyc2VjdDtcclxuXHJcblx0aWYgKCBtYXRlcmlhbC5zaWRlID09PSBCYWNrU2lkZSApIHtcclxuXHJcblx0XHRpbnRlcnNlY3QgPSByYXkuaW50ZXJzZWN0VHJpYW5nbGUoIHBDLCBwQiwgcEEsIHRydWUsIHBvaW50ICk7XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0aW50ZXJzZWN0ID0gcmF5LmludGVyc2VjdFRyaWFuZ2xlKCBwQSwgcEIsIHBDLCAoIG1hdGVyaWFsLnNpZGUgPT09IEZyb250U2lkZSApLCBwb2ludCApO1xyXG5cclxuXHR9XHJcblxyXG5cdGlmICggaW50ZXJzZWN0ID09PSBudWxsICkgcmV0dXJuIG51bGw7XHJcblxyXG5cdF9pbnRlcnNlY3Rpb25Qb2ludFdvcmxkLmNvcHkoIHBvaW50ICk7XHJcblx0X2ludGVyc2VjdGlvblBvaW50V29ybGQuYXBwbHlNYXRyaXg0KCBvYmplY3QubWF0cml4V29ybGQgKTtcclxuXHJcblx0Y29uc3QgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKCBfaW50ZXJzZWN0aW9uUG9pbnRXb3JsZCApO1xyXG5cclxuXHRpZiAoIGRpc3RhbmNlIDwgcmF5Y2FzdGVyLm5lYXIgfHwgZGlzdGFuY2UgPiByYXljYXN0ZXIuZmFyICkgcmV0dXJuIG51bGw7XHJcblxyXG5cdHJldHVybiB7XHJcblx0XHRkaXN0YW5jZTogZGlzdGFuY2UsXHJcblx0XHRwb2ludDogX2ludGVyc2VjdGlvblBvaW50V29ybGQuY2xvbmUoKSxcclxuXHRcdG9iamVjdDogb2JqZWN0XHJcblx0fTtcclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNoZWNrR2VvbWV0cnlJbnRlcnNlY3Rpb24oIG9iamVjdCwgbWF0ZXJpYWwsIHJheWNhc3RlciwgcmF5LCB1diwgdXYxLCBub3JtYWwsIGEsIGIsIGMgKSB7XHJcblxyXG5cdG9iamVjdC5nZXRWZXJ0ZXhQb3NpdGlvbiggYSwgX3ZBICk7XHJcblx0b2JqZWN0LmdldFZlcnRleFBvc2l0aW9uKCBiLCBfdkIgKTtcclxuXHRvYmplY3QuZ2V0VmVydGV4UG9zaXRpb24oIGMsIF92QyApO1xyXG5cclxuXHRjb25zdCBpbnRlcnNlY3Rpb24gPSBjaGVja0ludGVyc2VjdGlvbiggb2JqZWN0LCBtYXRlcmlhbCwgcmF5Y2FzdGVyLCByYXksIF92QSwgX3ZCLCBfdkMsIF9pbnRlcnNlY3Rpb25Qb2ludCApO1xyXG5cclxuXHRpZiAoIGludGVyc2VjdGlvbiApIHtcclxuXHJcblx0XHRjb25zdCBiYXJ5Y29vcmQgPSBuZXcgVmVjdG9yMygpO1xyXG5cdFx0VHJpYW5nbGUuZ2V0QmFyeWNvb3JkKCBfaW50ZXJzZWN0aW9uUG9pbnQsIF92QSwgX3ZCLCBfdkMsIGJhcnljb29yZCApO1xyXG5cclxuXHRcdGlmICggdXYgKSB7XHJcblxyXG5cdFx0XHRpbnRlcnNlY3Rpb24udXYgPSBUcmlhbmdsZS5nZXRJbnRlcnBvbGF0ZWRBdHRyaWJ1dGUoIHV2LCBhLCBiLCBjLCBiYXJ5Y29vcmQsIG5ldyBWZWN0b3IyKCkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB1djEgKSB7XHJcblxyXG5cdFx0XHRpbnRlcnNlY3Rpb24udXYxID0gVHJpYW5nbGUuZ2V0SW50ZXJwb2xhdGVkQXR0cmlidXRlKCB1djEsIGEsIGIsIGMsIGJhcnljb29yZCwgbmV3IFZlY3RvcjIoKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIG5vcm1hbCApIHtcclxuXHJcblx0XHRcdGludGVyc2VjdGlvbi5ub3JtYWwgPSBUcmlhbmdsZS5nZXRJbnRlcnBvbGF0ZWRBdHRyaWJ1dGUoIG5vcm1hbCwgYSwgYiwgYywgYmFyeWNvb3JkLCBuZXcgVmVjdG9yMygpICk7XHJcblxyXG5cdFx0XHRpZiAoIGludGVyc2VjdGlvbi5ub3JtYWwuZG90KCByYXkuZGlyZWN0aW9uICkgPiAwICkge1xyXG5cclxuXHRcdFx0XHRpbnRlcnNlY3Rpb24ubm9ybWFsLm11bHRpcGx5U2NhbGFyKCAtIDEgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgZmFjZSA9IHtcclxuXHRcdFx0YTogYSxcclxuXHRcdFx0YjogYixcclxuXHRcdFx0YzogYyxcclxuXHRcdFx0bm9ybWFsOiBuZXcgVmVjdG9yMygpLFxyXG5cdFx0XHRtYXRlcmlhbEluZGV4OiAwXHJcblx0XHR9O1xyXG5cclxuXHRcdFRyaWFuZ2xlLmdldE5vcm1hbCggX3ZBLCBfdkIsIF92QywgZmFjZS5ub3JtYWwgKTtcclxuXHJcblx0XHRpbnRlcnNlY3Rpb24uZmFjZSA9IGZhY2U7XHJcblx0XHRpbnRlcnNlY3Rpb24uYmFyeWNvb3JkID0gYmFyeWNvb3JkO1xyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiBpbnRlcnNlY3Rpb247XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBNZXNoIH07XHJcbiIsImltcG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9CdWZmZXJHZW9tZXRyeS5qcyc7XHJcbmltcG9ydCB7IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgZ2VvbWV0cnkgY2xhc3MgZm9yIGEgcmVjdGFuZ3VsYXIgY3Vib2lkIHdpdGggYSBnaXZlbiB3aWR0aCwgaGVpZ2h0LCBhbmQgZGVwdGguXHJcbiAqIE9uIGNyZWF0aW9uLCB0aGUgY3Vib2lkIGlzIGNlbnRyZWQgb24gdGhlIG9yaWdpbiwgd2l0aCBlYWNoIGVkZ2UgcGFyYWxsZWwgdG8gb25lXHJcbiAqIG9mIHRoZSBheGVzLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBnZW9tZXRyeSA9IG5ldyBUSFJFRS5Cb3hHZW9tZXRyeSggMSwgMSwgMSApO1xyXG4gKiBjb25zdCBtYXRlcmlhbCA9IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogMHgwMGZmMDAgfSApO1xyXG4gKiBjb25zdCBjdWJlID0gbmV3IFRIUkVFLk1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG4gKiBzY2VuZS5hZGQoIGN1YmUgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBCdWZmZXJHZW9tZXRyeVxyXG4gKi9cclxuY2xhc3MgQm94R2VvbWV0cnkgZXh0ZW5kcyBCdWZmZXJHZW9tZXRyeSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYm94IGdlb21ldHJ5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt3aWR0aD0xXSAtIFRoZSB3aWR0aC4gVGhhdCBpcywgdGhlIGxlbmd0aCBvZiB0aGUgZWRnZXMgcGFyYWxsZWwgdG8gdGhlIFggYXhpcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2hlaWdodD0xXSAtIFRoZSBoZWlnaHQuIFRoYXQgaXMsIHRoZSBsZW5ndGggb2YgdGhlIGVkZ2VzIHBhcmFsbGVsIHRvIHRoZSBZIGF4aXMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtkZXB0aD0xXSAtIFRoZSBkZXB0aC4gVGhhdCBpcywgdGhlIGxlbmd0aCBvZiB0aGUgZWRnZXMgcGFyYWxsZWwgdG8gdGhlIFogYXhpcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3dpZHRoU2VnbWVudHM9MV0gLSBOdW1iZXIgb2Ygc2VnbWVudGVkIHJlY3Rhbmd1bGFyIGZhY2VzIGFsb25nIHRoZSB3aWR0aCBvZiB0aGUgc2lkZXMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtoZWlnaHRTZWdtZW50cz0xXSAtIE51bWJlciBvZiBzZWdtZW50ZWQgcmVjdGFuZ3VsYXIgZmFjZXMgYWxvbmcgdGhlIGhlaWdodCBvZiB0aGUgc2lkZXMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtkZXB0aFNlZ21lbnRzPTFdIC0gTnVtYmVyIG9mIHNlZ21lbnRlZCByZWN0YW5ndWxhciBmYWNlcyBhbG9uZyB0aGUgZGVwdGggb2YgdGhlIHNpZGVzLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCB3aWR0aCA9IDEsIGhlaWdodCA9IDEsIGRlcHRoID0gMSwgd2lkdGhTZWdtZW50cyA9IDEsIGhlaWdodFNlZ21lbnRzID0gMSwgZGVwdGhTZWdtZW50cyA9IDEgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnQm94R2VvbWV0cnknO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG9sZHMgdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMgdGhhdCBoYXZlIGJlZW5cclxuXHRcdCAqIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGdlb21ldHJ5LiBBbnkgbW9kaWZpY2F0aW9uXHJcblx0XHQgKiBhZnRlciBpbnN0YW50aWF0aW9uIGRvZXMgbm90IGNoYW5nZSB0aGUgZ2VvbWV0cnkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0ge1xyXG5cdFx0XHR3aWR0aDogd2lkdGgsXHJcblx0XHRcdGhlaWdodDogaGVpZ2h0LFxyXG5cdFx0XHRkZXB0aDogZGVwdGgsXHJcblx0XHRcdHdpZHRoU2VnbWVudHM6IHdpZHRoU2VnbWVudHMsXHJcblx0XHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cyxcclxuXHRcdFx0ZGVwdGhTZWdtZW50czogZGVwdGhTZWdtZW50c1xyXG5cdFx0fTtcclxuXHJcblx0XHRjb25zdCBzY29wZSA9IHRoaXM7XHJcblxyXG5cdFx0Ly8gc2VnbWVudHNcclxuXHJcblx0XHR3aWR0aFNlZ21lbnRzID0gTWF0aC5mbG9vciggd2lkdGhTZWdtZW50cyApO1xyXG5cdFx0aGVpZ2h0U2VnbWVudHMgPSBNYXRoLmZsb29yKCBoZWlnaHRTZWdtZW50cyApO1xyXG5cdFx0ZGVwdGhTZWdtZW50cyA9IE1hdGguZmxvb3IoIGRlcHRoU2VnbWVudHMgKTtcclxuXHJcblx0XHQvLyBidWZmZXJzXHJcblxyXG5cdFx0Y29uc3QgaW5kaWNlcyA9IFtdO1xyXG5cdFx0Y29uc3QgdmVydGljZXMgPSBbXTtcclxuXHRcdGNvbnN0IG5vcm1hbHMgPSBbXTtcclxuXHRcdGNvbnN0IHV2cyA9IFtdO1xyXG5cclxuXHRcdC8vIGhlbHBlciB2YXJpYWJsZXNcclxuXHJcblx0XHRsZXQgbnVtYmVyT2ZWZXJ0aWNlcyA9IDA7XHJcblx0XHRsZXQgZ3JvdXBTdGFydCA9IDA7XHJcblxyXG5cdFx0Ly8gYnVpbGQgZWFjaCBzaWRlIG9mIHRoZSBib3ggZ2VvbWV0cnlcclxuXHJcblx0XHRidWlsZFBsYW5lKCAneicsICd5JywgJ3gnLCAtIDEsIC0gMSwgZGVwdGgsIGhlaWdodCwgd2lkdGgsIGRlcHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCAwICk7IC8vIHB4XHJcblx0XHRidWlsZFBsYW5lKCAneicsICd5JywgJ3gnLCAxLCAtIDEsIGRlcHRoLCBoZWlnaHQsIC0gd2lkdGgsIGRlcHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCAxICk7IC8vIG54XHJcblx0XHRidWlsZFBsYW5lKCAneCcsICd6JywgJ3knLCAxLCAxLCB3aWR0aCwgZGVwdGgsIGhlaWdodCwgd2lkdGhTZWdtZW50cywgZGVwdGhTZWdtZW50cywgMiApOyAvLyBweVxyXG5cdFx0YnVpbGRQbGFuZSggJ3gnLCAneicsICd5JywgMSwgLSAxLCB3aWR0aCwgZGVwdGgsIC0gaGVpZ2h0LCB3aWR0aFNlZ21lbnRzLCBkZXB0aFNlZ21lbnRzLCAzICk7IC8vIG55XHJcblx0XHRidWlsZFBsYW5lKCAneCcsICd5JywgJ3onLCAxLCAtIDEsIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgNCApOyAvLyBwelxyXG5cdFx0YnVpbGRQbGFuZSggJ3gnLCAneScsICd6JywgLSAxLCAtIDEsIHdpZHRoLCBoZWlnaHQsIC0gZGVwdGgsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCA1ICk7IC8vIG56XHJcblxyXG5cdFx0Ly8gYnVpbGQgZ2VvbWV0cnlcclxuXHJcblx0XHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XHJcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcclxuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xyXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xyXG5cclxuXHRcdGZ1bmN0aW9uIGJ1aWxkUGxhbmUoIHUsIHYsIHcsIHVkaXIsIHZkaXIsIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBncmlkWCwgZ3JpZFksIG1hdGVyaWFsSW5kZXggKSB7XHJcblxyXG5cdFx0XHRjb25zdCBzZWdtZW50V2lkdGggPSB3aWR0aCAvIGdyaWRYO1xyXG5cdFx0XHRjb25zdCBzZWdtZW50SGVpZ2h0ID0gaGVpZ2h0IC8gZ3JpZFk7XHJcblxyXG5cdFx0XHRjb25zdCB3aWR0aEhhbGYgPSB3aWR0aCAvIDI7XHJcblx0XHRcdGNvbnN0IGhlaWdodEhhbGYgPSBoZWlnaHQgLyAyO1xyXG5cdFx0XHRjb25zdCBkZXB0aEhhbGYgPSBkZXB0aCAvIDI7XHJcblxyXG5cdFx0XHRjb25zdCBncmlkWDEgPSBncmlkWCArIDE7XHJcblx0XHRcdGNvbnN0IGdyaWRZMSA9IGdyaWRZICsgMTtcclxuXHJcblx0XHRcdGxldCB2ZXJ0ZXhDb3VudGVyID0gMDtcclxuXHRcdFx0bGV0IGdyb3VwQ291bnQgPSAwO1xyXG5cclxuXHRcdFx0Y29uc3QgdmVjdG9yID0gbmV3IFZlY3RvcjMoKTtcclxuXHJcblx0XHRcdC8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnNcclxuXHJcblx0XHRcdGZvciAoIGxldCBpeSA9IDA7IGl5IDwgZ3JpZFkxOyBpeSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgeSA9IGl5ICogc2VnbWVudEhlaWdodCAtIGhlaWdodEhhbGY7XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpeCA9IDA7IGl4IDwgZ3JpZFgxOyBpeCArKyApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCB4ID0gaXggKiBzZWdtZW50V2lkdGggLSB3aWR0aEhhbGY7XHJcblxyXG5cdFx0XHRcdFx0Ly8gc2V0IHZhbHVlcyB0byBjb3JyZWN0IHZlY3RvciBjb21wb25lbnRcclxuXHJcblx0XHRcdFx0XHR2ZWN0b3JbIHUgXSA9IHggKiB1ZGlyO1xyXG5cdFx0XHRcdFx0dmVjdG9yWyB2IF0gPSB5ICogdmRpcjtcclxuXHRcdFx0XHRcdHZlY3RvclsgdyBdID0gZGVwdGhIYWxmO1xyXG5cclxuXHRcdFx0XHRcdC8vIG5vdyBhcHBseSB2ZWN0b3IgdG8gdmVydGV4IGJ1ZmZlclxyXG5cclxuXHRcdFx0XHRcdHZlcnRpY2VzLnB1c2goIHZlY3Rvci54LCB2ZWN0b3IueSwgdmVjdG9yLnogKTtcclxuXHJcblx0XHRcdFx0XHQvLyBzZXQgdmFsdWVzIHRvIGNvcnJlY3QgdmVjdG9yIGNvbXBvbmVudFxyXG5cclxuXHRcdFx0XHRcdHZlY3RvclsgdSBdID0gMDtcclxuXHRcdFx0XHRcdHZlY3RvclsgdiBdID0gMDtcclxuXHRcdFx0XHRcdHZlY3RvclsgdyBdID0gZGVwdGggPiAwID8gMSA6IC0gMTtcclxuXHJcblx0XHRcdFx0XHQvLyBub3cgYXBwbHkgdmVjdG9yIHRvIG5vcm1hbCBidWZmZXJcclxuXHJcblx0XHRcdFx0XHRub3JtYWxzLnB1c2goIHZlY3Rvci54LCB2ZWN0b3IueSwgdmVjdG9yLnogKTtcclxuXHJcblx0XHRcdFx0XHQvLyB1dnNcclxuXHJcblx0XHRcdFx0XHR1dnMucHVzaCggaXggLyBncmlkWCApO1xyXG5cdFx0XHRcdFx0dXZzLnB1c2goIDEgLSAoIGl5IC8gZ3JpZFkgKSApO1xyXG5cclxuXHRcdFx0XHRcdC8vIGNvdW50ZXJzXHJcblxyXG5cdFx0XHRcdFx0dmVydGV4Q291bnRlciArPSAxO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBpbmRpY2VzXHJcblxyXG5cdFx0XHQvLyAxLiB5b3UgbmVlZCB0aHJlZSBpbmRpY2VzIHRvIGRyYXcgYSBzaW5nbGUgZmFjZVxyXG5cdFx0XHQvLyAyLiBhIHNpbmdsZSBzZWdtZW50IGNvbnNpc3RzIG9mIHR3byBmYWNlc1xyXG5cdFx0XHQvLyAzLiBzbyB3ZSBuZWVkIHRvIGdlbmVyYXRlIHNpeCAoMiozKSBpbmRpY2VzIHBlciBzZWdtZW50XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaXkgPSAwOyBpeSA8IGdyaWRZOyBpeSArKyApIHtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGl4ID0gMDsgaXggPCBncmlkWDsgaXggKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgYSA9IG51bWJlck9mVmVydGljZXMgKyBpeCArIGdyaWRYMSAqIGl5O1xyXG5cdFx0XHRcdFx0Y29uc3QgYiA9IG51bWJlck9mVmVydGljZXMgKyBpeCArIGdyaWRYMSAqICggaXkgKyAxICk7XHJcblx0XHRcdFx0XHRjb25zdCBjID0gbnVtYmVyT2ZWZXJ0aWNlcyArICggaXggKyAxICkgKyBncmlkWDEgKiAoIGl5ICsgMSApO1xyXG5cdFx0XHRcdFx0Y29uc3QgZCA9IG51bWJlck9mVmVydGljZXMgKyAoIGl4ICsgMSApICsgZ3JpZFgxICogaXk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gZmFjZXNcclxuXHJcblx0XHRcdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTtcclxuXHRcdFx0XHRcdGluZGljZXMucHVzaCggYiwgYywgZCApO1xyXG5cclxuXHRcdFx0XHRcdC8vIGluY3JlYXNlIGNvdW50ZXJcclxuXHJcblx0XHRcdFx0XHRncm91cENvdW50ICs9IDY7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIGFkZCBhIGdyb3VwIHRvIHRoZSBnZW9tZXRyeS4gdGhpcyB3aWxsIGVuc3VyZSBtdWx0aSBtYXRlcmlhbCBzdXBwb3J0XHJcblxyXG5cdFx0XHRzY29wZS5hZGRHcm91cCggZ3JvdXBTdGFydCwgZ3JvdXBDb3VudCwgbWF0ZXJpYWxJbmRleCApO1xyXG5cclxuXHRcdFx0Ly8gY2FsY3VsYXRlIG5ldyBzdGFydCB2YWx1ZSBmb3IgZ3JvdXBzXHJcblxyXG5cdFx0XHRncm91cFN0YXJ0ICs9IGdyb3VwQ291bnQ7XHJcblxyXG5cdFx0XHQvLyB1cGRhdGUgdG90YWwgbnVtYmVyIG9mIHZlcnRpY2VzXHJcblxyXG5cdFx0XHRudW1iZXJPZlZlcnRpY2VzICs9IHZlcnRleENvdW50ZXI7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLnBhcmFtZXRlcnMgPSBPYmplY3QuYXNzaWduKCB7fSwgc291cmNlLnBhcmFtZXRlcnMgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGYWN0b3J5IG1ldGhvZCBmb3IgY3JlYXRpbmcgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBmcm9tIHRoZSBnaXZlblxyXG5cdCAqIEpTT04gb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBBIEpTT04gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc2VyaWFsaXplZCBnZW9tZXRyeS5cclxuXHQgKiBAcmV0dXJuIHtCb3hHZW9tZXRyeX0gQSBuZXcgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c3RhdGljIGZyb21KU09OKCBkYXRhICkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgQm94R2VvbWV0cnkoIGRhdGEud2lkdGgsIGRhdGEuaGVpZ2h0LCBkYXRhLmRlcHRoLCBkYXRhLndpZHRoU2VnbWVudHMsIGRhdGEuaGVpZ2h0U2VnbWVudHMsIGRhdGEuZGVwdGhTZWdtZW50cyApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBCb3hHZW9tZXRyeSB9O1xyXG4iLCJpbXBvcnQgeyBDb2xvck1hbmFnZW1lbnQgfSBmcm9tICcuLi8uLi9tYXRoL0NvbG9yTWFuYWdlbWVudC5qcyc7XHJcblxyXG4vLyBVbmlmb3JtIFV0aWxpdGllc1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNsb25lVW5pZm9ybXMoIHNyYyApIHtcclxuXHJcblx0Y29uc3QgZHN0ID0ge307XHJcblxyXG5cdGZvciAoIGNvbnN0IHUgaW4gc3JjICkge1xyXG5cclxuXHRcdGRzdFsgdSBdID0ge307XHJcblxyXG5cdFx0Zm9yICggY29uc3QgcCBpbiBzcmNbIHUgXSApIHtcclxuXHJcblx0XHRcdGNvbnN0IHByb3BlcnR5ID0gc3JjWyB1IF1bIHAgXTtcclxuXHJcblx0XHRcdGlmICggcHJvcGVydHkgJiYgKCBwcm9wZXJ0eS5pc0NvbG9yIHx8XHJcblx0XHRcdFx0cHJvcGVydHkuaXNNYXRyaXgzIHx8IHByb3BlcnR5LmlzTWF0cml4NCB8fFxyXG5cdFx0XHRcdHByb3BlcnR5LmlzVmVjdG9yMiB8fCBwcm9wZXJ0eS5pc1ZlY3RvcjMgfHwgcHJvcGVydHkuaXNWZWN0b3I0IHx8XHJcblx0XHRcdFx0cHJvcGVydHkuaXNUZXh0dXJlIHx8IHByb3BlcnR5LmlzUXVhdGVybmlvbiApICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIHByb3BlcnR5LmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdVbmlmb3Jtc1V0aWxzOiBUZXh0dXJlcyBvZiByZW5kZXIgdGFyZ2V0cyBjYW5ub3QgYmUgY2xvbmVkIHZpYSBjbG9uZVVuaWZvcm1zKCkgb3IgbWVyZ2VVbmlmb3JtcygpLicgKTtcclxuXHRcdFx0XHRcdGRzdFsgdSBdWyBwIF0gPSBudWxsO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdGRzdFsgdSBdWyBwIF0gPSBwcm9wZXJ0eS5jbG9uZSgpO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBBcnJheS5pc0FycmF5KCBwcm9wZXJ0eSApICkge1xyXG5cclxuXHRcdFx0XHRkc3RbIHUgXVsgcCBdID0gcHJvcGVydHkuc2xpY2UoKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGRzdFsgdSBdWyBwIF0gPSBwcm9wZXJ0eTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIGRzdDtcclxuXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVVuaWZvcm1zKCB1bmlmb3JtcyApIHtcclxuXHJcblx0Y29uc3QgbWVyZ2VkID0ge307XHJcblxyXG5cdGZvciAoIGxldCB1ID0gMDsgdSA8IHVuaWZvcm1zLmxlbmd0aDsgdSArKyApIHtcclxuXHJcblx0XHRjb25zdCB0bXAgPSBjbG9uZVVuaWZvcm1zKCB1bmlmb3Jtc1sgdSBdICk7XHJcblxyXG5cdFx0Zm9yICggY29uc3QgcCBpbiB0bXAgKSB7XHJcblxyXG5cdFx0XHRtZXJnZWRbIHAgXSA9IHRtcFsgcCBdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gbWVyZ2VkO1xyXG5cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNsb25lVW5pZm9ybXNHcm91cHMoIHNyYyApIHtcclxuXHJcblx0Y29uc3QgZHN0ID0gW107XHJcblxyXG5cdGZvciAoIGxldCB1ID0gMDsgdSA8IHNyYy5sZW5ndGg7IHUgKysgKSB7XHJcblxyXG5cdFx0ZHN0LnB1c2goIHNyY1sgdSBdLmNsb25lKCkgKTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gZHN0O1xyXG5cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFVubGl0VW5pZm9ybUNvbG9yU3BhY2UoIHJlbmRlcmVyICkge1xyXG5cclxuXHRjb25zdCBjdXJyZW50UmVuZGVyVGFyZ2V0ID0gcmVuZGVyZXIuZ2V0UmVuZGVyVGFyZ2V0KCk7XHJcblxyXG5cdGlmICggY3VycmVudFJlbmRlclRhcmdldCA9PT0gbnVsbCApIHtcclxuXHJcblx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vbXJkb29iL3RocmVlLmpzL3B1bGwvMjM5MzcjaXNzdWVjb21tZW50LTExMTEwNjczOThcclxuXHRcdHJldHVybiByZW5kZXJlci5vdXRwdXRDb2xvclNwYWNlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tcmRvb2IvdGhyZWUuanMvaXNzdWVzLzI3ODY4XHJcblx0aWYgKCBjdXJyZW50UmVuZGVyVGFyZ2V0LmlzWFJSZW5kZXJUYXJnZXQgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIGN1cnJlbnRSZW5kZXJUYXJnZXQudGV4dHVyZS5jb2xvclNwYWNlO1xyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiBDb2xvck1hbmFnZW1lbnQud29ya2luZ0NvbG9yU3BhY2U7XHJcblxyXG59XHJcblxyXG4vLyBMZWdhY3lcclxuXHJcbmNvbnN0IFVuaWZvcm1zVXRpbHMgPSB7IGNsb25lOiBjbG9uZVVuaWZvcm1zLCBtZXJnZTogbWVyZ2VVbmlmb3JtcyB9O1xyXG5cclxuZXhwb3J0IHsgVW5pZm9ybXNVdGlscyB9O1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG52b2lkIG1haW4oKSB7XHJcblx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNCggcG9zaXRpb24sIDEuMCApO1xyXG59XHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbnZvaWQgbWFpbigpIHtcclxuXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCAxLjAsIDAuMCwgMC4wLCAxLjAgKTtcclxufVxyXG5gO1xyXG4iLCJpbXBvcnQgeyBNYXRlcmlhbCB9IGZyb20gJy4vTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyBjbG9uZVVuaWZvcm1zLCBjbG9uZVVuaWZvcm1zR3JvdXBzIH0gZnJvbSAnLi4vcmVuZGVyZXJzL3NoYWRlcnMvVW5pZm9ybXNVdGlscy5qcyc7XHJcblxyXG5pbXBvcnQgZGVmYXVsdF92ZXJ0ZXggZnJvbSAnLi4vcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvZGVmYXVsdF92ZXJ0ZXguZ2xzbC5qcyc7XHJcbmltcG9ydCBkZWZhdWx0X2ZyYWdtZW50IGZyb20gJy4uL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL2RlZmF1bHRfZnJhZ21lbnQuZ2xzbC5qcyc7XHJcblxyXG4vKipcclxuICogQSBtYXRlcmlhbCByZW5kZXJlZCB3aXRoIGN1c3RvbSBzaGFkZXJzLiBBIHNoYWRlciBpcyBhIHNtYWxsIHByb2dyYW0gd3JpdHRlbiBpbiBHTFNMLlxyXG4gKiB0aGF0IHJ1bnMgb24gdGhlIEdQVS4gWW91IG1heSB3YW50IHRvIHVzZSBhIGN1c3RvbSBzaGFkZXIgaWYgeW91IG5lZWQgdG8gaW1wbGVtZW50IGFuXHJcbiAqIGVmZmVjdCBub3QgaW5jbHVkZWQgd2l0aCBhbnkgb2YgdGhlIGJ1aWx0LWluIG1hdGVyaWFscy5cclxuICpcclxuICogVGhlcmUgYXJlIHRoZSBmb2xsb3dpbmcgbm90ZXMgdG8gYmVhciBpbiBtaW5kIHdoZW4gdXNpbmcgYSBgU2hhZGVyTWF0ZXJpYWxgOlxyXG4gKlxyXG4gKiAtIGBTaGFkZXJNYXRlcmlhbGAgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIHtAbGluayBXZWJHTFJlbmRlcmVyfS5cclxuICogLSBCdWlsdCBpbiBhdHRyaWJ1dGVzIGFuZCB1bmlmb3JtcyBhcmUgcGFzc2VkIHRvIHRoZSBzaGFkZXJzIGFsb25nIHdpdGggeW91ciBjb2RlLiBJZlxyXG4gKiB5b3UgZG9uJ3Qgd2FudCB0aGF0LCB1c2Uge0BsaW5rIFJhd1NoYWRlck1hdGVyaWFsfSBpbnN0ZWFkLlxyXG4gKiAtIFlvdSBjYW4gdXNlIHRoZSBkaXJlY3RpdmUgYCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRgIGFuZCBgI3ByYWdtYSB1bnJvbGxfbG9vcF9lbmRgXHJcbiAqIGluIG9yZGVyIHRvIHVucm9sbCBhIGBmb3JgIGxvb3AgaW4gR0xTTCBieSB0aGUgc2hhZGVyIHByZXByb2Nlc3Nvci4gVGhlIGRpcmVjdGl2ZSBoYXNcclxuICogdG8gYmUgcGxhY2VkIHJpZ2h0IGFib3ZlIHRoZSBsb29wLiBUaGUgbG9vcCBmb3JtYXR0aW5nIGhhcyB0byBjb3JyZXNwb25kIHRvIGEgZGVmaW5lZCBzdGFuZGFyZC5cclxuICogICAtIFRoZSBsb29wIGhhcyB0byBiZSBbbm9ybWFsaXplZF17QGxpbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTm9ybWFsaXplZF9sb29wfS5cclxuICogICAtIFRoZSBsb29wIHZhcmlhYmxlIGhhcyB0byBiZSAqaSouXHJcbiAqICAgLSBUaGUgdmFsdWUgYFVOUk9MTEVEX0xPT1BfSU5ERVhgIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgZXhwbGljaXRseVxyXG4gKiB2YWx1ZSBvZiAqaSogZm9yIHRoZSBnaXZlbiBpdGVyYXRpb24gYW5kIGNhbiBiZSB1c2VkIGluIHByZXByb2Nlc3NvclxyXG4gKiBzdGF0ZW1lbnRzLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBtYXRlcmlhbCA9IG5ldyBUSFJFRS5TaGFkZXJNYXRlcmlhbCgge1xyXG4gKiBcdHVuaWZvcm1zOiB7XHJcbiAqIFx0XHR0aW1lOiB7IHZhbHVlOiAxLjAgfSxcclxuICogXHRcdHJlc29sdXRpb246IHsgdmFsdWU6IG5ldyBUSFJFRS5WZWN0b3IyKCkgfVxyXG4gKiBcdH0sXHJcbiAqIFx0dmVydGV4U2hhZGVyOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggJ3ZlcnRleFNoYWRlcicgKS50ZXh0Q29udGVudCxcclxuICogXHRmcmFnbWVudFNoYWRlcjogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoICdmcmFnbWVudFNoYWRlcicgKS50ZXh0Q29udGVudFxyXG4gKiB9ICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTWF0ZXJpYWxcclxuICovXHJcbmNsYXNzIFNoYWRlck1hdGVyaWFsIGV4dGVuZHMgTWF0ZXJpYWwge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHNoYWRlciBtYXRlcmlhbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1ldGVyc10gLSBBbiBvYmplY3Qgd2l0aCBvbmUgb3IgbW9yZSBwcm9wZXJ0aWVzXHJcblx0ICogZGVmaW5pbmcgdGhlIG1hdGVyaWFsJ3MgYXBwZWFyYW5jZS4gQW55IHByb3BlcnR5IG9mIHRoZSBtYXRlcmlhbFxyXG5cdCAqIChpbmNsdWRpbmcgYW55IHByb3BlcnR5IGZyb20gaW5oZXJpdGVkIG1hdGVyaWFscykgY2FuIGJlIHBhc3NlZFxyXG5cdCAqIGluIGhlcmUuIENvbG9yIHZhbHVlcyBjYW4gYmUgcGFzc2VkIGFueSB0eXBlIG9mIHZhbHVlIGFjY2VwdGVkXHJcblx0ICogYnkge0BsaW5rIENvbG9yI3NldH0uXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHBhcmFtZXRlcnMgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNTaGFkZXJNYXRlcmlhbCA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ1NoYWRlck1hdGVyaWFsJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgY3VzdG9tIGNvbnN0YW50cyB1c2luZyBgI2RlZmluZWAgZGlyZWN0aXZlcyB3aXRoaW4gdGhlIEdMU0wgY29kZVxyXG5cdFx0ICogZm9yIGJvdGggdGhlIHZlcnRleCBzaGFkZXIgYW5kIHRoZSBmcmFnbWVudCBzaGFkZXI7IGVhY2gga2V5L3ZhbHVlIHBhaXJcclxuXHRcdCAqIHlpZWxkcyBhbm90aGVyIGRpcmVjdGl2ZS5cclxuXHRcdCAqIGBgYGpzXHJcblx0XHQgKiBkZWZpbmVzOiB7XHJcblx0XHQgKiBcdEZPTzogMTUsXHJcblx0XHQgKiBcdEJBUjogdHJ1ZVxyXG5cdFx0ICogfVxyXG5cdFx0ICogYGBgXHJcblx0XHQgKiBZaWVsZHMgdGhlIGxpbmVzOlxyXG5cdFx0ICogYGBgXHJcblx0XHQgKiAjZGVmaW5lIEZPTyAxNVxyXG5cdFx0ICogI2RlZmluZSBCQVIgdHJ1ZVxyXG5cdFx0ICogYGBgXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kZWZpbmVzID0ge307XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBvYmplY3Qgb2YgdGhlIGZvcm06XHJcblx0XHQgKiBgYGBqc1xyXG5cdFx0ICoge1xyXG5cdFx0ICogXHRcInVuaWZvcm0xXCI6IHsgdmFsdWU6IDEuMCB9LFxyXG5cdFx0ICogXHRcInVuaWZvcm0yXCI6IHsgdmFsdWU6IDIgfVxyXG5cdFx0ICogfVxyXG5cdFx0ICogYGBgXHJcblx0XHQgKiBzcGVjaWZ5aW5nIHRoZSB1bmlmb3JtcyB0byBiZSBwYXNzZWQgdG8gdGhlIHNoYWRlciBjb2RlOyBrZXlzIGFyZSB1bmlmb3JtXHJcblx0XHQgKiBuYW1lcywgdmFsdWVzIGFyZSBkZWZpbml0aW9ucyBvZiB0aGUgZm9ybVxyXG5cdFx0ICogYGBgXHJcblx0XHQgKiB7XHJcblx0XHQgKiBcdHZhbHVlOiAxLjBcclxuXHRcdCAqIH1cclxuXHRcdCAqIGBgYFxyXG5cdFx0ICogd2hlcmUgYHZhbHVlYCBpcyB0aGUgdmFsdWUgb2YgdGhlIHVuaWZvcm0uIE5hbWVzIG11c3QgbWF0Y2ggdGhlIG5hbWUgb2ZcclxuXHRcdCAqIHRoZSB1bmlmb3JtLCBhcyBkZWZpbmVkIGluIHRoZSBHTFNMIGNvZGUuIE5vdGUgdGhhdCB1bmlmb3JtcyBhcmUgcmVmcmVzaGVkXHJcblx0XHQgKiBvbiBldmVyeSBmcmFtZSwgc28gdXBkYXRpbmcgdGhlIHZhbHVlIG9mIHRoZSB1bmlmb3JtIHdpbGwgaW1tZWRpYXRlbHlcclxuXHRcdCAqIHVwZGF0ZSB0aGUgdmFsdWUgYXZhaWxhYmxlIHRvIHRoZSBHTFNMIGNvZGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51bmlmb3JtcyA9IHt9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQW4gYXJyYXkgaG9sZGluZyB1bmlmb3JtcyBncm91cHMgZm9yIGNvbmZpZ3VyaW5nIFVCT3MuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PFVuaWZvcm1zR3JvdXA+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVuaWZvcm1zR3JvdXBzID0gW107XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBWZXJ0ZXggc2hhZGVyIEdMU0wgY29kZS4gVGhpcyBpcyB0aGUgYWN0dWFsIGNvZGUgZm9yIHRoZSBzaGFkZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52ZXJ0ZXhTaGFkZXIgPSBkZWZhdWx0X3ZlcnRleDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEZyYWdtZW50IHNoYWRlciBHTFNMIGNvZGUuIFRoaXMgaXMgdGhlIGFjdHVhbCBjb2RlIGZvciB0aGUgc2hhZGVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZnJhZ21lbnRTaGFkZXIgPSBkZWZhdWx0X2ZyYWdtZW50O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQ29udHJvbHMgbGluZSB0aGlja25lc3Mgb3IgbGluZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogV2ViR0wgYW5kIFdlYkdQVSBpZ25vcmUgdGhpcyBzZXR0aW5nIGFuZCBhbHdheXMgcmVuZGVyIGxpbmUgcHJpbWl0aXZlcyB3aXRoIGFcclxuXHRcdCAqIHdpZHRoIG9mIG9uZSBwaXhlbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxpbmV3aWR0aCA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZW5kZXJzIHRoZSBnZW9tZXRyeSBhcyBhIHdpcmVmcmFtZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMud2lyZWZyYW1lID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDb250cm9scyB0aGUgdGhpY2tuZXNzIG9mIHRoZSB3aXJlZnJhbWUuXHJcblx0XHQgKlxyXG5cdFx0ICogV2ViR0wgYW5kIFdlYkdQVSBpZ25vcmUgdGhpcyBwcm9wZXJ0eSBhbmQgYWx3YXlzIHJlbmRlclxyXG5cdFx0ICogMSBwaXhlbCB3aWRlIGxpbmVzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZSB3aGV0aGVyIHRoZSBtYXRlcmlhbCBjb2xvciBpcyBhZmZlY3RlZCBieSBnbG9iYWwgZm9nIHNldHRpbmdzOyBgdHJ1ZWBcclxuXHRcdCAqIHRvIHBhc3MgZm9nIHVuaWZvcm1zIHRvIHRoZSBzaGFkZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZvZyA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyB3aGV0aGVyIHRoaXMgbWF0ZXJpYWwgdXNlcyBsaWdodGluZzsgYHRydWVgIHRvIHBhc3MgdW5pZm9ybSBkYXRhXHJcblx0XHQgKiByZWxhdGVkIHRvIGxpZ2h0aW5nIHRvIHRoaXMgc2hhZGVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5saWdodHMgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgd2hldGhlciB0aGlzIG1hdGVyaWFsIHN1cHBvcnRzIGNsaXBwaW5nOyBgdHJ1ZWAgdG8gbGV0IHRoZSByZW5kZXJlclxyXG5cdFx0ICogcGFzcyB0aGUgY2xpcHBpbmdQbGFuZXMgdW5pZm9ybS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2xpcHBpbmcgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIE92ZXJ3cml0dGVuIGFuZCBzZXQgdG8gYHRydWVgIGJ5IGRlZmF1bHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZm9yY2VTaW5nbGVQYXNzID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgb2JqZWN0IGFsbG93cyB0byBlbmFibGUgY2VydGFpbiBXZWJHTCAyIGV4dGVuc2lvbnMuXHJcblx0XHQgKlxyXG5cdFx0ICogLSBjbGlwQ3VsbERpc3RhbmNlOiBzZXQgdG8gYHRydWVgIHRvIHVzZSB2ZXJ0ZXggc2hhZGVyIGNsaXBwaW5nXHJcblx0XHQgKiAtIG11bHRpRHJhdzogc2V0IHRvIGB0cnVlYCB0byB1c2UgdmVydGV4IHNoYWRlciBtdWx0aV9kcmF3IC8gZW5hYmxlIGdsX0RyYXdJRFxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHt7Y2xpcEN1bGxEaXN0YW5jZTpmYWxzZSxtdWx0aURyYXc6ZmFsc2V9fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmV4dGVuc2lvbnMgPSB7XHJcblx0XHRcdGNsaXBDdWxsRGlzdGFuY2U6IGZhbHNlLCAvLyBzZXQgdG8gdXNlIHZlcnRleCBzaGFkZXIgY2xpcHBpbmdcclxuXHRcdFx0bXVsdGlEcmF3OiBmYWxzZSAvLyBzZXQgdG8gdXNlIHZlcnRleCBzaGFkZXIgbXVsdGlfZHJhdyAvIGVuYWJsZSBnbF9EcmF3SURcclxuXHRcdH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGVuIHRoZSByZW5kZXJlZCBnZW9tZXRyeSBkb2Vzbid0IGluY2x1ZGUgdGhlc2UgYXR0cmlidXRlcyBidXQgdGhlXHJcblx0XHQgKiBtYXRlcmlhbCBkb2VzLCB0aGVzZSBkZWZhdWx0IHZhbHVlcyB3aWxsIGJlIHBhc3NlZCB0byB0aGUgc2hhZGVycy4gVGhpc1xyXG5cdFx0ICogYXZvaWRzIGVycm9ycyB3aGVuIGJ1ZmZlciBkYXRhIGlzIG1pc3NpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogLSBjb2xvcjogWyAxLCAxLCAxIF1cclxuXHRcdCAqIC0gdXY6IFsgMCwgMCBdXHJcblx0XHQgKiAtIHV2MTogWyAwLCAwIF1cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXMgPSB7XHJcblx0XHRcdCdjb2xvcic6IFsgMSwgMSwgMSBdLFxyXG5cdFx0XHQndXYnOiBbIDAsIDAgXSxcclxuXHRcdFx0J3V2MSc6IFsgMCwgMCBdXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSWYgc2V0LCB0aGlzIGNhbGxzIFtnbC5iaW5kQXR0cmliTG9jYXRpb25de0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XZWJHTFJlbmRlcmluZ0NvbnRleHQvYmluZEF0dHJpYkxvY2F0aW9ufVxyXG5cdFx0ICogdG8gYmluZCBhIGdlbmVyaWMgdmVydGV4IGluZGV4IHRvIGFuIGF0dHJpYnV0ZSB2YXJpYWJsZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfHVuZGVmaW5lZH1cclxuXHRcdCAqIEBkZWZhdWx0IHVuZGVmaW5lZFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmluZGV4MEF0dHJpYnV0ZU5hbWUgPSB1bmRlZmluZWQ7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDYW4gYmUgdXNlZCB0byBmb3JjZSBhIHVuaWZvcm0gdXBkYXRlIHdoaWxlIGNoYW5naW5nIHVuaWZvcm1zIGluXHJcblx0XHQgKiB7QGxpbmsgT2JqZWN0M0Qjb25CZWZvcmVSZW5kZXJ9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51bmlmb3Jtc05lZWRVcGRhdGUgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgdGhlIEdMU0wgdmVyc2lvbiBvZiBjdXN0b20gc2hhZGVyIGNvZGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez8oR0xTTDF8R0xTTDMpfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdsc2xWZXJzaW9uID0gbnVsbDtcclxuXHJcblx0XHRpZiAoIHBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLmZyYWdtZW50U2hhZGVyID0gc291cmNlLmZyYWdtZW50U2hhZGVyO1xyXG5cdFx0dGhpcy52ZXJ0ZXhTaGFkZXIgPSBzb3VyY2UudmVydGV4U2hhZGVyO1xyXG5cclxuXHRcdHRoaXMudW5pZm9ybXMgPSBjbG9uZVVuaWZvcm1zKCBzb3VyY2UudW5pZm9ybXMgKTtcclxuXHRcdHRoaXMudW5pZm9ybXNHcm91cHMgPSBjbG9uZVVuaWZvcm1zR3JvdXBzKCBzb3VyY2UudW5pZm9ybXNHcm91cHMgKTtcclxuXHJcblx0XHR0aGlzLmRlZmluZXMgPSBPYmplY3QuYXNzaWduKCB7fSwgc291cmNlLmRlZmluZXMgKTtcclxuXHJcblx0XHR0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7XHJcblx0XHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7XHJcblxyXG5cdFx0dGhpcy5mb2cgPSBzb3VyY2UuZm9nO1xyXG5cdFx0dGhpcy5saWdodHMgPSBzb3VyY2UubGlnaHRzO1xyXG5cdFx0dGhpcy5jbGlwcGluZyA9IHNvdXJjZS5jbGlwcGluZztcclxuXHJcblx0XHR0aGlzLmV4dGVuc2lvbnMgPSBPYmplY3QuYXNzaWduKCB7fSwgc291cmNlLmV4dGVuc2lvbnMgKTtcclxuXHJcblx0XHR0aGlzLmdsc2xWZXJzaW9uID0gc291cmNlLmdsc2xWZXJzaW9uO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdHRvSlNPTiggbWV0YSApIHtcclxuXHJcblx0XHRjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCBtZXRhICk7XHJcblxyXG5cdFx0ZGF0YS5nbHNsVmVyc2lvbiA9IHRoaXMuZ2xzbFZlcnNpb247XHJcblx0XHRkYXRhLnVuaWZvcm1zID0ge307XHJcblxyXG5cdFx0Zm9yICggY29uc3QgbmFtZSBpbiB0aGlzLnVuaWZvcm1zICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdW5pZm9ybSA9IHRoaXMudW5pZm9ybXNbIG5hbWUgXTtcclxuXHRcdFx0Y29uc3QgdmFsdWUgPSB1bmlmb3JtLnZhbHVlO1xyXG5cclxuXHRcdFx0aWYgKCB2YWx1ZSAmJiB2YWx1ZS5pc1RleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRcdGRhdGEudW5pZm9ybXNbIG5hbWUgXSA9IHtcclxuXHRcdFx0XHRcdHR5cGU6ICd0JyxcclxuXHRcdFx0XHRcdHZhbHVlOiB2YWx1ZS50b0pTT04oIG1ldGEgKS51dWlkXHJcblx0XHRcdFx0fTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIHZhbHVlICYmIHZhbHVlLmlzQ29sb3IgKSB7XHJcblxyXG5cdFx0XHRcdGRhdGEudW5pZm9ybXNbIG5hbWUgXSA9IHtcclxuXHRcdFx0XHRcdHR5cGU6ICdjJyxcclxuXHRcdFx0XHRcdHZhbHVlOiB2YWx1ZS5nZXRIZXgoKVxyXG5cdFx0XHRcdH07XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCB2YWx1ZSAmJiB2YWx1ZS5pc1ZlY3RvcjIgKSB7XHJcblxyXG5cdFx0XHRcdGRhdGEudW5pZm9ybXNbIG5hbWUgXSA9IHtcclxuXHRcdFx0XHRcdHR5cGU6ICd2MicsXHJcblx0XHRcdFx0XHR2YWx1ZTogdmFsdWUudG9BcnJheSgpXHJcblx0XHRcdFx0fTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIHZhbHVlICYmIHZhbHVlLmlzVmVjdG9yMyApIHtcclxuXHJcblx0XHRcdFx0ZGF0YS51bmlmb3Jtc1sgbmFtZSBdID0ge1xyXG5cdFx0XHRcdFx0dHlwZTogJ3YzJyxcclxuXHRcdFx0XHRcdHZhbHVlOiB2YWx1ZS50b0FycmF5KClcclxuXHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggdmFsdWUgJiYgdmFsdWUuaXNWZWN0b3I0ICkge1xyXG5cclxuXHRcdFx0XHRkYXRhLnVuaWZvcm1zWyBuYW1lIF0gPSB7XHJcblx0XHRcdFx0XHR0eXBlOiAndjQnLFxyXG5cdFx0XHRcdFx0dmFsdWU6IHZhbHVlLnRvQXJyYXkoKVxyXG5cdFx0XHRcdH07XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCB2YWx1ZSAmJiB2YWx1ZS5pc01hdHJpeDMgKSB7XHJcblxyXG5cdFx0XHRcdGRhdGEudW5pZm9ybXNbIG5hbWUgXSA9IHtcclxuXHRcdFx0XHRcdHR5cGU6ICdtMycsXHJcblx0XHRcdFx0XHR2YWx1ZTogdmFsdWUudG9BcnJheSgpXHJcblx0XHRcdFx0fTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIHZhbHVlICYmIHZhbHVlLmlzTWF0cml4NCApIHtcclxuXHJcblx0XHRcdFx0ZGF0YS51bmlmb3Jtc1sgbmFtZSBdID0ge1xyXG5cdFx0XHRcdFx0dHlwZTogJ200JyxcclxuXHRcdFx0XHRcdHZhbHVlOiB2YWx1ZS50b0FycmF5KClcclxuXHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0ZGF0YS51bmlmb3Jtc1sgbmFtZSBdID0ge1xyXG5cdFx0XHRcdFx0dmFsdWU6IHZhbHVlXHJcblx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0Ly8gbm90ZTogdGhlIGFycmF5IHZhcmlhbnRzIHYydiwgdjN2LCB2NHYsIG00diBhbmQgdHYgYXJlIG5vdCBzdXBwb3J0ZWQgc28gZmFyXHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggT2JqZWN0LmtleXMoIHRoaXMuZGVmaW5lcyApLmxlbmd0aCA+IDAgKSBkYXRhLmRlZmluZXMgPSB0aGlzLmRlZmluZXM7XHJcblxyXG5cdFx0ZGF0YS52ZXJ0ZXhTaGFkZXIgPSB0aGlzLnZlcnRleFNoYWRlcjtcclxuXHRcdGRhdGEuZnJhZ21lbnRTaGFkZXIgPSB0aGlzLmZyYWdtZW50U2hhZGVyO1xyXG5cclxuXHRcdGRhdGEubGlnaHRzID0gdGhpcy5saWdodHM7XHJcblx0XHRkYXRhLmNsaXBwaW5nID0gdGhpcy5jbGlwcGluZztcclxuXHJcblx0XHRjb25zdCBleHRlbnNpb25zID0ge307XHJcblxyXG5cdFx0Zm9yICggY29uc3Qga2V5IGluIHRoaXMuZXh0ZW5zaW9ucyApIHtcclxuXHJcblx0XHRcdGlmICggdGhpcy5leHRlbnNpb25zWyBrZXkgXSA9PT0gdHJ1ZSApIGV4dGVuc2lvbnNbIGtleSBdID0gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBPYmplY3Qua2V5cyggZXh0ZW5zaW9ucyApLmxlbmd0aCA+IDAgKSBkYXRhLmV4dGVuc2lvbnMgPSBleHRlbnNpb25zO1xyXG5cclxuXHRcdHJldHVybiBkYXRhO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogVGhpcyB0eXBlIHJlcHJlc2VudHMgdGhlIGZpZWxkcyByZXF1aXJlZCB0byBzdG9yZSBhbmQgcnVuIHRoZSBzaGFkZXIgY29kZS5cclxuICpcclxuICogQHR5cGVkZWYge09iamVjdH0gU2hhZGVyTWF0ZXJpYWx+U2hhZGVyXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHNoYWRlci5cclxuICogQHByb3BlcnR5IHtPYmplY3Q8c3RyaW5nLCBVbmlmb3JtPn0gdW5pZm9ybXMgLSBUaGUgdW5pZm9ybXMgb2YgdGhlIHNoYWRlci5cclxuICogQHByb3BlcnR5IHtPYmplY3Q8c3RyaW5nLCBhbnk+fSBkZWZpbmVzIC0gVGhlIGRlZmluZXMgb2YgdGhlIHNoYWRlci5cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZlcnRleFNoYWRlciAtIFRoZSB2ZXJ0ZXggc2hhZGVyIGNvZGUuXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmcmFnbWVudFNoYWRlciAtIFRoZSBmcmFnbWVudCBzaGFkZXIgY29kZS5cclxuICoqL1xyXG5cclxuZXhwb3J0IHsgU2hhZGVyTWF0ZXJpYWwgfTtcclxuIiwiaW1wb3J0IHsgV2ViR0xDb29yZGluYXRlU3lzdGVtIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgTWF0cml4NCB9IGZyb20gJy4uL21hdGgvTWF0cml4NC5qcyc7XHJcbmltcG9ydCB7IE9iamVjdDNEIH0gZnJvbSAnLi4vY29yZS9PYmplY3QzRC5qcyc7XHJcblxyXG4vKipcclxuICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgY2FtZXJhcy4gVGhpcyBjbGFzcyBzaG91bGQgYWx3YXlzIGJlIGluaGVyaXRlZFxyXG4gKiB3aGVuIHlvdSBidWlsZCBhIG5ldyBjYW1lcmEuXHJcbiAqXHJcbiAqIEBhYnN0cmFjdFxyXG4gKiBAYXVnbWVudHMgT2JqZWN0M0RcclxuICovXHJcbmNsYXNzIENhbWVyYSBleHRlbmRzIE9iamVjdDNEIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBjYW1lcmEuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNDYW1lcmEgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdDYW1lcmEnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGludmVyc2Ugb2YgdGhlIGNhbWVyYSdzIHdvcmxkIG1hdHJpeC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7TWF0cml4NH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tYXRyaXhXb3JsZEludmVyc2UgPSBuZXcgTWF0cml4NCgpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNhbWVyYSdzIHByb2plY3Rpb24gbWF0cml4LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtNYXRyaXg0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnByb2plY3Rpb25NYXRyaXggPSBuZXcgTWF0cml4NCgpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGludmVyc2Ugb2YgdGhlIGNhbWVyYSdzIHByb2plY3Rpb24gbWF0cml4LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtNYXRyaXg0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlID0gbmV3IE1hdHJpeDQoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjb29yZGluYXRlIHN5c3RlbSBpbiB3aGljaCB0aGUgY2FtZXJhIGlzIHVzZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeyhXZWJHTENvb3JkaW5hdGVTeXN0ZW18V2ViR1BVQ29vcmRpbmF0ZVN5c3RlbSl9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29vcmRpbmF0ZVN5c3RlbSA9IFdlYkdMQ29vcmRpbmF0ZVN5c3RlbTtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UsIHJlY3Vyc2l2ZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UsIHJlY3Vyc2l2ZSApO1xyXG5cclxuXHRcdHRoaXMubWF0cml4V29ybGRJbnZlcnNlLmNvcHkoIHNvdXJjZS5tYXRyaXhXb3JsZEludmVyc2UgKTtcclxuXHJcblx0XHR0aGlzLnByb2plY3Rpb25NYXRyaXguY29weSggc291cmNlLnByb2plY3Rpb25NYXRyaXggKTtcclxuXHRcdHRoaXMucHJvamVjdGlvbk1hdHJpeEludmVyc2UuY29weSggc291cmNlLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlICk7XHJcblxyXG5cdFx0dGhpcy5jb29yZGluYXRlU3lzdGVtID0gc291cmNlLmNvb3JkaW5hdGVTeXN0ZW07XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIHZlY3RvciByZXByZXNlbnRpbmcgdGhlIChcImxvb2tcIikgZGlyZWN0aW9uIG9mIHRoZSAzRCBvYmplY3QgaW4gd29ybGQgc3BhY2UuXHJcblx0ICpcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyBvdmVyd3JpdHRlbiBzaW5jZSBjYW1lcmFzIGhhdmUgYSBkaWZmZXJlbnQgZm9yd2FyZCB2ZWN0b3IgY29tcGFyZWQgdG8gb3RoZXJcclxuXHQgKiAzRCBvYmplY3RzLiBBIGNhbWVyYSBsb29rcyBkb3duIGl0cyBsb2NhbCwgbmVnYXRpdmUgei1heGlzIGJ5IGRlZmF1bHQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHRhcmdldCAtIFRoZSB0YXJnZXQgdmVjdG9yIHRoZSByZXN1bHQgaXMgc3RvcmVkIHRvLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IFRoZSAzRCBvYmplY3QncyBkaXJlY3Rpb24gaW4gd29ybGQgc3BhY2UuXHJcblx0ICovXHJcblx0Z2V0V29ybGREaXJlY3Rpb24oIHRhcmdldCApIHtcclxuXHJcblx0XHRyZXR1cm4gc3VwZXIuZ2V0V29ybGREaXJlY3Rpb24oIHRhcmdldCApLm5lZ2F0ZSgpO1xyXG5cclxuXHR9XHJcblxyXG5cdHVwZGF0ZU1hdHJpeFdvcmxkKCBmb3JjZSApIHtcclxuXHJcblx0XHRzdXBlci51cGRhdGVNYXRyaXhXb3JsZCggZm9yY2UgKTtcclxuXHJcblx0XHR0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZS5jb3B5KCB0aGlzLm1hdHJpeFdvcmxkICkuaW52ZXJ0KCk7XHJcblxyXG5cdH1cclxuXHJcblx0dXBkYXRlV29ybGRNYXRyaXgoIHVwZGF0ZVBhcmVudHMsIHVwZGF0ZUNoaWxkcmVuICkge1xyXG5cclxuXHRcdHN1cGVyLnVwZGF0ZVdvcmxkTWF0cml4KCB1cGRhdGVQYXJlbnRzLCB1cGRhdGVDaGlsZHJlbiApO1xyXG5cclxuXHRcdHRoaXMubWF0cml4V29ybGRJbnZlcnNlLmNvcHkoIHRoaXMubWF0cml4V29ybGQgKS5pbnZlcnQoKTtcclxuXHJcblx0fVxyXG5cclxuXHRjbG9uZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IENhbWVyYSB9O1xyXG4iLCJpbXBvcnQgeyBDYW1lcmEgfSBmcm9tICcuL0NhbWVyYS5qcyc7XHJcbmltcG9ydCB7IFJBRDJERUcsIERFRzJSQUQgfSBmcm9tICcuLi9tYXRoL01hdGhVdGlscy5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjIuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuXHJcbmNvbnN0IF92MyA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX21pblRhcmdldCA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjIoKTtcclxuY29uc3QgX21heFRhcmdldCA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjIoKTtcclxuXHJcbi8qKlxyXG4gKiBDYW1lcmEgdGhhdCB1c2VzIFtwZXJzcGVjdGl2ZSBwcm9qZWN0aW9uXXtAbGluayBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9QZXJzcGVjdGl2ZV8oZ3JhcGhpY2FsKX0uXHJcbiAqXHJcbiAqIFRoaXMgcHJvamVjdGlvbiBtb2RlIGlzIGRlc2lnbmVkIHRvIG1pbWljIHRoZSB3YXkgdGhlIGh1bWFuIGV5ZSBzZWVzLiBJdFxyXG4gKiBpcyB0aGUgbW9zdCBjb21tb24gcHJvamVjdGlvbiBtb2RlIHVzZWQgZm9yIHJlbmRlcmluZyBhIDNEIHNjZW5lLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBjYW1lcmEgPSBuZXcgVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmEoIDQ1LCB3aWR0aCAvIGhlaWdodCwgMSwgMTAwMCApO1xyXG4gKiBzY2VuZS5hZGQoIGNhbWVyYSApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIENhbWVyYVxyXG4gKi9cclxuY2xhc3MgUGVyc3BlY3RpdmVDYW1lcmEgZXh0ZW5kcyBDYW1lcmEge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHBlcnNwZWN0aXZlIGNhbWVyYS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZm92PTUwXSAtIFRoZSB2ZXJ0aWNhbCBmaWVsZCBvZiB2aWV3LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbYXNwZWN0PTFdIC0gVGhlIGFzcGVjdCByYXRpby5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW25lYXI9MC4xXSAtIFRoZSBjYW1lcmEncyBuZWFyIHBsYW5lLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZmFyPTIwMDBdIC0gVGhlIGNhbWVyYSdzIGZhciBwbGFuZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggZm92ID0gNTAsIGFzcGVjdCA9IDEsIG5lYXIgPSAwLjEsIGZhciA9IDIwMDAgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNQZXJzcGVjdGl2ZUNhbWVyYSA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ1BlcnNwZWN0aXZlQ2FtZXJhJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB2ZXJ0aWNhbCBmaWVsZCBvZiB2aWV3LCBmcm9tIGJvdHRvbSB0byB0b3Agb2YgdmlldyxcclxuXHRcdCAqIGluIGRlZ3JlZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDUwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZm92ID0gZm92O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHpvb20gZmFjdG9yIG9mIHRoZSBjYW1lcmEuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy56b29tID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjYW1lcmEncyBuZWFyIHBsYW5lLiBUaGUgdmFsaWQgcmFuZ2UgaXMgZ3JlYXRlciB0aGFuIGAwYFxyXG5cdFx0ICogYW5kIGxlc3MgdGhhbiB0aGUgY3VycmVudCB2YWx1ZSBvZiB7QGxpbmsgUGVyc3BlY3RpdmVDYW1lcmEjZmFyfS5cclxuXHRcdCAqXHJcblx0XHQgKiBOb3RlIHRoYXQsIHVubGlrZSBmb3IgdGhlIHtAbGluayBPcnRob2dyYXBoaWNDYW1lcmF9LCBgMGAgaXMgPGVtPm5vdDwvZW0+IGFcclxuXHRcdCAqIHZhbGlkIHZhbHVlIGZvciBhIHBlcnNwZWN0aXZlIGNhbWVyYSdzIG5lYXIgcGxhbmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDAuMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5lYXIgPSBuZWFyO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNhbWVyYSdzIGZhciBwbGFuZS4gTXVzdCBiZSBncmVhdGVyIHRoYW4gdGhlXHJcblx0XHQgKiBjdXJyZW50IHZhbHVlIG9mIHtAbGluayBQZXJzcGVjdGl2ZUNhbWVyYSNuZWFyfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMjAwMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZhciA9IGZhcjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIE9iamVjdCBkaXN0YW5jZSB1c2VkIGZvciBzdGVyZW9zY29weSBhbmQgZGVwdGgtb2YtZmllbGQgZWZmZWN0cy4gVGhpc1xyXG5cdFx0ICogcGFyYW1ldGVyIGRvZXMgbm90IGluZmx1ZW5jZSB0aGUgcHJvamVjdGlvbiBtYXRyaXggdW5sZXNzIGFcclxuXHRcdCAqIHtAbGluayBTdGVyZW9DYW1lcmF9IGlzIGJlaW5nIHVzZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDEwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZm9jdXMgPSAxMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBhc3BlY3QgcmF0aW8sIHVzdWFsbHkgdGhlIGNhbnZhcyB3aWR0aCAvIGNhbnZhcyBoZWlnaHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hc3BlY3QgPSBhc3BlY3Q7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXByZXNlbnRzIHRoZSBmcnVzdHVtIHdpbmRvdyBzcGVjaWZpY2F0aW9uLiBUaGlzIHByb3BlcnR5IHNob3VsZCBub3QgYmUgZWRpdGVkXHJcblx0XHQgKiBkaXJlY3RseSBidXQgdmlhIHtAbGluayBQZXJzcGVjdGl2ZUNhbWVyYSNzZXRWaWV3T2Zmc2V0fSBhbmQge0BsaW5rIFBlcnNwZWN0aXZlQ2FtZXJhI2NsZWFyVmlld09mZnNldH0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9PYmplY3R9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudmlldyA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBGaWxtIHNpemUgdXNlZCBmb3IgdGhlIGxhcmdlciBheGlzLiBEZWZhdWx0IGlzIGAzNWAgKG1pbGxpbWV0ZXJzKS4gVGhpc1xyXG5cdFx0ICogcGFyYW1ldGVyIGRvZXMgbm90IGluZmx1ZW5jZSB0aGUgcHJvamVjdGlvbiBtYXRyaXggdW5sZXNzIHtAbGluayBQZXJzcGVjdGl2ZUNhbWVyYSNmaWxtT2Zmc2V0fVxyXG5cdFx0ICogaXMgc2V0IHRvIGEgbm9uemVybyB2YWx1ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMzVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5maWxtR2F1Z2UgPSAzNTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvcml6b250YWwgb2ZmLWNlbnRlciBvZmZzZXQgaW4gdGhlIHNhbWUgdW5pdCBhcyB7QGxpbmsgUGVyc3BlY3RpdmVDYW1lcmEjZmlsbUdhdWdlfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZpbG1PZmZzZXQgPSAwO1xyXG5cclxuXHRcdHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSwgcmVjdXJzaXZlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSwgcmVjdXJzaXZlICk7XHJcblxyXG5cdFx0dGhpcy5mb3YgPSBzb3VyY2UuZm92O1xyXG5cdFx0dGhpcy56b29tID0gc291cmNlLnpvb207XHJcblxyXG5cdFx0dGhpcy5uZWFyID0gc291cmNlLm5lYXI7XHJcblx0XHR0aGlzLmZhciA9IHNvdXJjZS5mYXI7XHJcblx0XHR0aGlzLmZvY3VzID0gc291cmNlLmZvY3VzO1xyXG5cclxuXHRcdHRoaXMuYXNwZWN0ID0gc291cmNlLmFzcGVjdDtcclxuXHRcdHRoaXMudmlldyA9IHNvdXJjZS52aWV3ID09PSBudWxsID8gbnVsbCA6IE9iamVjdC5hc3NpZ24oIHt9LCBzb3VyY2UudmlldyApO1xyXG5cclxuXHRcdHRoaXMuZmlsbUdhdWdlID0gc291cmNlLmZpbG1HYXVnZTtcclxuXHRcdHRoaXMuZmlsbU9mZnNldCA9IHNvdXJjZS5maWxtT2Zmc2V0O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIEZPViBieSBmb2NhbCBsZW5ndGggaW4gcmVzcGVjdCB0byB0aGUgY3VycmVudCB7QGxpbmsgUGVyc3BlY3RpdmVDYW1lcmEjZmlsbUdhdWdlfS5cclxuXHQgKlxyXG5cdCAqIFRoZSBkZWZhdWx0IGZpbG0gZ2F1Z2UgaXMgMzUsIHNvIHRoYXQgdGhlIGZvY2FsIGxlbmd0aCBjYW4gYmUgc3BlY2lmaWVkIGZvclxyXG5cdCAqIGEgMzVtbSAoZnVsbCBmcmFtZSkgY2FtZXJhLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGZvY2FsTGVuZ3RoIC0gVmFsdWVzIGZvciBmb2NhbCBsZW5ndGggYW5kIGZpbG0gZ2F1Z2UgbXVzdCBoYXZlIHRoZSBzYW1lIHVuaXQuXHJcblx0ICovXHJcblx0c2V0Rm9jYWxMZW5ndGgoIGZvY2FsTGVuZ3RoICkge1xyXG5cclxuXHRcdC8qKiBzZWUge0BsaW5rIGh0dHA6Ly93d3cuYm9iYXRraW5zLmNvbS9waG90b2dyYXBoeS90ZWNobmljYWwvZmllbGRfb2Zfdmlldy5odG1sfSAqL1xyXG5cdFx0Y29uc3QgdkV4dGVudFNsb3BlID0gMC41ICogdGhpcy5nZXRGaWxtSGVpZ2h0KCkgLyBmb2NhbExlbmd0aDtcclxuXHJcblx0XHR0aGlzLmZvdiA9IFJBRDJERUcgKiAyICogTWF0aC5hdGFuKCB2RXh0ZW50U2xvcGUgKTtcclxuXHRcdHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGZvY2FsIGxlbmd0aCBmcm9tIHRoZSBjdXJyZW50IHtAbGluayBQZXJzcGVjdGl2ZUNhbWVyYSNmb3Z9IGFuZFxyXG5cdCAqIHtAbGluayBQZXJzcGVjdGl2ZUNhbWVyYSNmaWxtR2F1Z2V9LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgY29tcHV0ZWQgZm9jYWwgbGVuZ3RoLlxyXG5cdCAqL1xyXG5cdGdldEZvY2FsTGVuZ3RoKCkge1xyXG5cclxuXHRcdGNvbnN0IHZFeHRlbnRTbG9wZSA9IE1hdGgudGFuKCBERUcyUkFEICogMC41ICogdGhpcy5mb3YgKTtcclxuXHJcblx0XHRyZXR1cm4gMC41ICogdGhpcy5nZXRGaWxtSGVpZ2h0KCkgLyB2RXh0ZW50U2xvcGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgY3VycmVudCB2ZXJ0aWNhbCBmaWVsZCBvZiB2aWV3IGFuZ2xlIGluIGRlZ3JlZXMgY29uc2lkZXJpbmcge0BsaW5rIFBlcnNwZWN0aXZlQ2FtZXJhI3pvb219LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgZWZmZWN0aXZlIEZPVi5cclxuXHQgKi9cclxuXHRnZXRFZmZlY3RpdmVGT1YoKSB7XHJcblxyXG5cdFx0cmV0dXJuIFJBRDJERUcgKiAyICogTWF0aC5hdGFuKFxyXG5cdFx0XHRNYXRoLnRhbiggREVHMlJBRCAqIDAuNSAqIHRoaXMuZm92ICkgLyB0aGlzLnpvb20gKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSB3aWR0aCBvZiB0aGUgaW1hZ2Ugb24gdGhlIGZpbG0uIElmIHtAbGluayBQZXJzcGVjdGl2ZUNhbWVyYSNhc3BlY3R9IGlzIGdyZWF0ZXIgdGhhbiBvclxyXG5cdCAqIGVxdWFsIHRvIG9uZSAobGFuZHNjYXBlIGZvcm1hdCksIHRoZSByZXN1bHQgZXF1YWxzIHtAbGluayBQZXJzcGVjdGl2ZUNhbWVyYSNmaWxtR2F1Z2V9LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgZmlsbSB3aWR0aC5cclxuXHQgKi9cclxuXHRnZXRGaWxtV2lkdGgoKSB7XHJcblxyXG5cdFx0Ly8gZmlsbSBub3QgY29tcGxldGVseSBjb3ZlcmVkIGluIHBvcnRyYWl0IGZvcm1hdCAoYXNwZWN0IDwgMSlcclxuXHRcdHJldHVybiB0aGlzLmZpbG1HYXVnZSAqIE1hdGgubWluKCB0aGlzLmFzcGVjdCwgMSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2Ugb24gdGhlIGZpbG0uIElmIHtAbGluayBQZXJzcGVjdGl2ZUNhbWVyYSNhc3BlY3R9IGlzIGdyZWF0ZXIgdGhhbiBvclxyXG5cdCAqIGVxdWFsIHRvIG9uZSAobGFuZHNjYXBlIGZvcm1hdCksIHRoZSByZXN1bHQgZXF1YWxzIHtAbGluayBQZXJzcGVjdGl2ZUNhbWVyYSNmaWxtR2F1Z2V9LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgZmlsbSB3aWR0aC5cclxuXHQgKi9cclxuXHRnZXRGaWxtSGVpZ2h0KCkge1xyXG5cclxuXHRcdC8vIGZpbG0gbm90IGNvbXBsZXRlbHkgY292ZXJlZCBpbiBsYW5kc2NhcGUgZm9ybWF0IChhc3BlY3QgPiAxKVxyXG5cdFx0cmV0dXJuIHRoaXMuZmlsbUdhdWdlIC8gTWF0aC5tYXgoIHRoaXMuYXNwZWN0LCAxICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgdGhlIDJEIGJvdW5kcyBvZiB0aGUgY2FtZXJhJ3Mgdmlld2FibGUgcmVjdGFuZ2xlIGF0IGEgZ2l2ZW4gZGlzdGFuY2UgYWxvbmcgdGhlIHZpZXdpbmcgZGlyZWN0aW9uLlxyXG5cdCAqIFNldHMgYG1pblRhcmdldGAgYW5kIGBtYXhUYXJnZXRgIHRvIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgbG93ZXItbGVmdCBhbmQgdXBwZXItcmlnaHQgY29ybmVycyBvZiB0aGUgdmlldyByZWN0YW5nbGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZGlzdGFuY2UgLSBUaGUgdmlld2luZyBkaXN0YW5jZS5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IG1pblRhcmdldCAtIFRoZSBsb3dlci1sZWZ0IGNvcm5lciBvZiB0aGUgdmlldyByZWN0YW5nbGUgaXMgd3JpdHRlbiBpbnRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gbWF4VGFyZ2V0IC0gVGhlIHVwcGVyLXJpZ2h0IGNvcm5lciBvZiB0aGUgdmlldyByZWN0YW5nbGUgaXMgd3JpdHRlbiBpbnRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGdldFZpZXdCb3VuZHMoIGRpc3RhbmNlLCBtaW5UYXJnZXQsIG1heFRhcmdldCApIHtcclxuXHJcblx0XHRfdjMuc2V0KCAtIDEsIC0gMSwgMC41ICkuYXBwbHlNYXRyaXg0KCB0aGlzLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlICk7XHJcblxyXG5cdFx0bWluVGFyZ2V0LnNldCggX3YzLngsIF92My55ICkubXVsdGlwbHlTY2FsYXIoIC0gZGlzdGFuY2UgLyBfdjMueiApO1xyXG5cclxuXHRcdF92My5zZXQoIDEsIDEsIDAuNSApLmFwcGx5TWF0cml4NCggdGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSApO1xyXG5cclxuXHRcdG1heFRhcmdldC5zZXQoIF92My54LCBfdjMueSApLm11bHRpcGx5U2NhbGFyKCAtIGRpc3RhbmNlIC8gX3YzLnogKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgY2FtZXJhJ3Mgdmlld2FibGUgcmVjdGFuZ2xlIGF0IGEgZ2l2ZW4gZGlzdGFuY2UgYWxvbmcgdGhlIHZpZXdpbmcgZGlyZWN0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGRpc3RhbmNlIC0gVGhlIHZpZXdpbmcgZGlzdGFuY2UuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IHZlY3RvciB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgcmVzdWx0IHdoZXJlIHggaXMgd2lkdGggYW5kIHkgaXMgaGVpZ2h0LlxyXG5cdCAqIEByZXR1cm5zIHtWZWN0b3IyfSBUaGUgdmlldyBzaXplLlxyXG5cdCAqL1xyXG5cdGdldFZpZXdTaXplKCBkaXN0YW5jZSwgdGFyZ2V0ICkge1xyXG5cclxuXHRcdHRoaXMuZ2V0Vmlld0JvdW5kcyggZGlzdGFuY2UsIF9taW5UYXJnZXQsIF9tYXhUYXJnZXQgKTtcclxuXHJcblx0XHRyZXR1cm4gdGFyZ2V0LnN1YlZlY3RvcnMoIF9tYXhUYXJnZXQsIF9taW5UYXJnZXQgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIGFuIG9mZnNldCBpbiBhIGxhcmdlciBmcnVzdHVtLiBUaGlzIGlzIHVzZWZ1bCBmb3IgbXVsdGktd2luZG93IG9yXHJcblx0ICogbXVsdGktbW9uaXRvci9tdWx0aS1tYWNoaW5lIHNldHVwcy5cclxuXHQgKlxyXG5cdCAqIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSAzeDIgbW9uaXRvcnMgYW5kIGVhY2ggbW9uaXRvciBpcyAxOTIweDEwODAgYW5kXHJcblx0ICogdGhlIG1vbml0b3JzIGFyZSBpbiBncmlkIGxpa2UgdGhpc1xyXG5cdCAqYGBgXHJcblx0ICogICArLS0tKy0tLSstLS0rXHJcblx0ICogICB8IEEgfCBCIHwgQyB8XHJcblx0ICogICArLS0tKy0tLSstLS0rXHJcblx0ICogICB8IEQgfCBFIHwgRiB8XHJcblx0ICogICArLS0tKy0tLSstLS0rXHJcblx0ICpgYGBcclxuXHQgKiB0aGVuIGZvciBlYWNoIG1vbml0b3IgeW91IHdvdWxkIGNhbGwgaXQgbGlrZSB0aGlzOlxyXG5cdCAqYGBganNcclxuXHQgKiBjb25zdCB3ID0gMTkyMDtcclxuXHQgKiBjb25zdCBoID0gMTA4MDtcclxuXHQgKiBjb25zdCBmdWxsV2lkdGggPSB3ICogMztcclxuXHQgKiBjb25zdCBmdWxsSGVpZ2h0ID0gaCAqIDI7XHJcblx0ICpcclxuXHQgKiAvLyAtLUEtLVxyXG5cdCAqIGNhbWVyYS5zZXRWaWV3T2Zmc2V0KCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHcgKiAwLCBoICogMCwgdywgaCApO1xyXG5cdCAqIC8vIC0tQi0tXHJcblx0ICogY2FtZXJhLnNldFZpZXdPZmZzZXQoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgdyAqIDEsIGggKiAwLCB3LCBoICk7XHJcblx0ICogLy8gLS1DLS1cclxuXHQgKiBjYW1lcmEuc2V0Vmlld09mZnNldCggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB3ICogMiwgaCAqIDAsIHcsIGggKTtcclxuXHQgKiAvLyAtLUQtLVxyXG5cdCAqIGNhbWVyYS5zZXRWaWV3T2Zmc2V0KCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHcgKiAwLCBoICogMSwgdywgaCApO1xyXG5cdCAqIC8vIC0tRS0tXHJcblx0ICogY2FtZXJhLnNldFZpZXdPZmZzZXQoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgdyAqIDEsIGggKiAxLCB3LCBoICk7XHJcblx0ICogLy8gLS1GLS1cclxuXHQgKiBjYW1lcmEuc2V0Vmlld09mZnNldCggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB3ICogMiwgaCAqIDEsIHcsIGggKTtcclxuXHQgKiBgYGBcclxuXHQgKlxyXG5cdCAqIE5vdGUgdGhlcmUgaXMgbm8gcmVhc29uIG1vbml0b3JzIGhhdmUgdG8gYmUgdGhlIHNhbWUgc2l6ZSBvciBpbiBhIGdyaWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZnVsbFdpZHRoIC0gVGhlIGZ1bGwgd2lkdGggb2YgbXVsdGl2aWV3IHNldHVwLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBmdWxsSGVpZ2h0IC0gVGhlIGZ1bGwgaGVpZ2h0IG9mIG11bHRpdmlldyBzZXR1cC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBob3Jpem9udGFsIG9mZnNldCBvZiB0aGUgc3ViY2FtZXJhLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHZlcnRpY2FsIG9mZnNldCBvZiB0aGUgc3ViY2FtZXJhLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiBzdWJjYW1lcmEuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2Ygc3ViY2FtZXJhLlxyXG5cdCAqL1xyXG5cdHNldFZpZXdPZmZzZXQoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgeCwgeSwgd2lkdGgsIGhlaWdodCApIHtcclxuXHJcblx0XHR0aGlzLmFzcGVjdCA9IGZ1bGxXaWR0aCAvIGZ1bGxIZWlnaHQ7XHJcblxyXG5cdFx0aWYgKCB0aGlzLnZpZXcgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnZpZXcgPSB7XHJcblx0XHRcdFx0ZW5hYmxlZDogdHJ1ZSxcclxuXHRcdFx0XHRmdWxsV2lkdGg6IDEsXHJcblx0XHRcdFx0ZnVsbEhlaWdodDogMSxcclxuXHRcdFx0XHRvZmZzZXRYOiAwLFxyXG5cdFx0XHRcdG9mZnNldFk6IDAsXHJcblx0XHRcdFx0d2lkdGg6IDEsXHJcblx0XHRcdFx0aGVpZ2h0OiAxXHJcblx0XHRcdH07XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMudmlldy5lbmFibGVkID0gdHJ1ZTtcclxuXHRcdHRoaXMudmlldy5mdWxsV2lkdGggPSBmdWxsV2lkdGg7XHJcblx0XHR0aGlzLnZpZXcuZnVsbEhlaWdodCA9IGZ1bGxIZWlnaHQ7XHJcblx0XHR0aGlzLnZpZXcub2Zmc2V0WCA9IHg7XHJcblx0XHR0aGlzLnZpZXcub2Zmc2V0WSA9IHk7XHJcblx0XHR0aGlzLnZpZXcud2lkdGggPSB3aWR0aDtcclxuXHRcdHRoaXMudmlldy5oZWlnaHQgPSBoZWlnaHQ7XHJcblxyXG5cdFx0dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVtb3ZlcyB0aGUgdmlldyBvZmZzZXQgZnJvbSB0aGUgcHJvamVjdGlvbiBtYXRyaXguXHJcblx0ICovXHJcblx0Y2xlYXJWaWV3T2Zmc2V0KCkge1xyXG5cclxuXHRcdGlmICggdGhpcy52aWV3ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy52aWV3LmVuYWJsZWQgPSBmYWxzZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgY2FtZXJhJ3MgcHJvamVjdGlvbiBtYXRyaXguIE11c3QgYmUgY2FsbGVkIGFmdGVyIGFueSBjaGFuZ2Ugb2ZcclxuXHQgKiBjYW1lcmEgcHJvcGVydGllcy5cclxuXHQgKi9cclxuXHR1cGRhdGVQcm9qZWN0aW9uTWF0cml4KCkge1xyXG5cclxuXHRcdGNvbnN0IG5lYXIgPSB0aGlzLm5lYXI7XHJcblx0XHRsZXQgdG9wID0gbmVhciAqIE1hdGgudGFuKCBERUcyUkFEICogMC41ICogdGhpcy5mb3YgKSAvIHRoaXMuem9vbTtcclxuXHRcdGxldCBoZWlnaHQgPSAyICogdG9wO1xyXG5cdFx0bGV0IHdpZHRoID0gdGhpcy5hc3BlY3QgKiBoZWlnaHQ7XHJcblx0XHRsZXQgbGVmdCA9IC0gMC41ICogd2lkdGg7XHJcblx0XHRjb25zdCB2aWV3ID0gdGhpcy52aWV3O1xyXG5cclxuXHRcdGlmICggdGhpcy52aWV3ICE9PSBudWxsICYmIHRoaXMudmlldy5lbmFibGVkICkge1xyXG5cclxuXHRcdFx0Y29uc3QgZnVsbFdpZHRoID0gdmlldy5mdWxsV2lkdGgsXHJcblx0XHRcdFx0ZnVsbEhlaWdodCA9IHZpZXcuZnVsbEhlaWdodDtcclxuXHJcblx0XHRcdGxlZnQgKz0gdmlldy5vZmZzZXRYICogd2lkdGggLyBmdWxsV2lkdGg7XHJcblx0XHRcdHRvcCAtPSB2aWV3Lm9mZnNldFkgKiBoZWlnaHQgLyBmdWxsSGVpZ2h0O1xyXG5cdFx0XHR3aWR0aCAqPSB2aWV3LndpZHRoIC8gZnVsbFdpZHRoO1xyXG5cdFx0XHRoZWlnaHQgKj0gdmlldy5oZWlnaHQgLyBmdWxsSGVpZ2h0O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBza2V3ID0gdGhpcy5maWxtT2Zmc2V0O1xyXG5cdFx0aWYgKCBza2V3ICE9PSAwICkgbGVmdCArPSBuZWFyICogc2tldyAvIHRoaXMuZ2V0RmlsbVdpZHRoKCk7XHJcblxyXG5cdFx0dGhpcy5wcm9qZWN0aW9uTWF0cml4Lm1ha2VQZXJzcGVjdGl2ZSggbGVmdCwgbGVmdCArIHdpZHRoLCB0b3AsIHRvcCAtIGhlaWdodCwgbmVhciwgdGhpcy5mYXIsIHRoaXMuY29vcmRpbmF0ZVN5c3RlbSApO1xyXG5cclxuXHRcdHRoaXMucHJvamVjdGlvbk1hdHJpeEludmVyc2UuY29weSggdGhpcy5wcm9qZWN0aW9uTWF0cml4ICkuaW52ZXJ0KCk7XHJcblxyXG5cdH1cclxuXHJcblx0dG9KU09OKCBtZXRhICkge1xyXG5cclxuXHRcdGNvbnN0IGRhdGEgPSBzdXBlci50b0pTT04oIG1ldGEgKTtcclxuXHJcblx0XHRkYXRhLm9iamVjdC5mb3YgPSB0aGlzLmZvdjtcclxuXHRcdGRhdGEub2JqZWN0Lnpvb20gPSB0aGlzLnpvb207XHJcblxyXG5cdFx0ZGF0YS5vYmplY3QubmVhciA9IHRoaXMubmVhcjtcclxuXHRcdGRhdGEub2JqZWN0LmZhciA9IHRoaXMuZmFyO1xyXG5cdFx0ZGF0YS5vYmplY3QuZm9jdXMgPSB0aGlzLmZvY3VzO1xyXG5cclxuXHRcdGRhdGEub2JqZWN0LmFzcGVjdCA9IHRoaXMuYXNwZWN0O1xyXG5cclxuXHRcdGlmICggdGhpcy52aWV3ICE9PSBudWxsICkgZGF0YS5vYmplY3QudmlldyA9IE9iamVjdC5hc3NpZ24oIHt9LCB0aGlzLnZpZXcgKTtcclxuXHJcblx0XHRkYXRhLm9iamVjdC5maWxtR2F1Z2UgPSB0aGlzLmZpbG1HYXVnZTtcclxuXHRcdGRhdGEub2JqZWN0LmZpbG1PZmZzZXQgPSB0aGlzLmZpbG1PZmZzZXQ7XHJcblxyXG5cdFx0cmV0dXJuIGRhdGE7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFBlcnNwZWN0aXZlQ2FtZXJhIH07XHJcbiIsImltcG9ydCB7IFdlYkdMQ29vcmRpbmF0ZVN5c3RlbSwgV2ViR1BVQ29vcmRpbmF0ZVN5c3RlbSB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IE9iamVjdDNEIH0gZnJvbSAnLi4vY29yZS9PYmplY3QzRC5qcyc7XHJcbmltcG9ydCB7IFBlcnNwZWN0aXZlQ2FtZXJhIH0gZnJvbSAnLi9QZXJzcGVjdGl2ZUNhbWVyYS5qcyc7XHJcblxyXG5jb25zdCBmb3YgPSAtIDkwOyAvLyBuZWdhdGl2ZSBmb3YgaXMgbm90IGFuIGVycm9yXHJcbmNvbnN0IGFzcGVjdCA9IDE7XHJcblxyXG4vKipcclxuICogQSBzcGVjaWFsIHR5cGUgb2YgY2FtZXJhIHRoYXQgaXMgcG9zaXRpb25lZCBpbiAzRCBzcGFjZSB0byByZW5kZXIgaXRzIHN1cnJvdW5kaW5ncyBpbnRvIGFcclxuICogY3ViZSByZW5kZXIgdGFyZ2V0LiBUaGUgcmVuZGVyIHRhcmdldCBjYW4gdGhlbiBiZSB1c2VkIGFzIGFuIGVudmlyb25tZW50IG1hcCBmb3IgcmVuZGVyaW5nXHJcbiAqIHJlYWx0aW1lIHJlZmxlY3Rpb25zIGluIHlvdXIgc2NlbmUuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIC8vIENyZWF0ZSBjdWJlIHJlbmRlciB0YXJnZXRcclxuICogY29uc3QgY3ViZVJlbmRlclRhcmdldCA9IG5ldyBUSFJFRS5XZWJHTEN1YmVSZW5kZXJUYXJnZXQoIDI1NiwgeyBnZW5lcmF0ZU1pcG1hcHM6IHRydWUsIG1pbkZpbHRlcjogVEhSRUUuTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyIH0gKTtcclxuICpcclxuICogLy8gQ3JlYXRlIGN1YmUgY2FtZXJhXHJcbiAqIGNvbnN0IGN1YmVDYW1lcmEgPSBuZXcgVEhSRUUuQ3ViZUNhbWVyYSggMSwgMTAwMDAwLCBjdWJlUmVuZGVyVGFyZ2V0ICk7XHJcbiAqIHNjZW5lLmFkZCggY3ViZUNhbWVyYSApO1xyXG4gKlxyXG4gKiAvLyBDcmVhdGUgY2FyXHJcbiAqIGNvbnN0IGNocm9tZU1hdGVyaWFsID0gbmV3IFRIUkVFLk1lc2hMYW1iZXJ0TWF0ZXJpYWwoIHsgY29sb3I6IDB4ZmZmZmZmLCBlbnZNYXA6IGN1YmVSZW5kZXJUYXJnZXQudGV4dHVyZSB9ICk7XHJcbiAqIGNvbnN0IGNhciA9IG5ldyBUSFJFRS5NZXNoKCBjYXJHZW9tZXRyeSwgY2hyb21lTWF0ZXJpYWwgKTtcclxuICogc2NlbmUuYWRkKCBjYXIgKTtcclxuICpcclxuICogLy8gVXBkYXRlIHRoZSByZW5kZXIgdGFyZ2V0IGN1YmVcclxuICogY2FyLnZpc2libGUgPSBmYWxzZTtcclxuICogY3ViZUNhbWVyYS5wb3NpdGlvbi5jb3B5KCBjYXIucG9zaXRpb24gKTtcclxuICogY3ViZUNhbWVyYS51cGRhdGUoIHJlbmRlcmVyLCBzY2VuZSApO1xyXG4gKlxyXG4gKiAvLyBSZW5kZXIgdGhlIHNjZW5lXHJcbiAqIGNhci52aXNpYmxlID0gdHJ1ZTtcclxuICogcmVuZGVyZXIucmVuZGVyKCBzY2VuZSwgY2FtZXJhICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgT2JqZWN0M0RcclxuICovXHJcbmNsYXNzIEN1YmVDYW1lcmEgZXh0ZW5kcyBPYmplY3QzRCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgY3ViZSBjYW1lcmEuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbmVhciAtIFRoZSBjYW1lcmEncyBuZWFyIHBsYW5lLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBmYXIgLSBUaGUgY2FtZXJhJ3MgZmFyIHBsYW5lLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xDdWJlUmVuZGVyVGFyZ2V0fSByZW5kZXJUYXJnZXQgLSBUaGUgY3ViZSByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBuZWFyLCBmYXIsIHJlbmRlclRhcmdldCApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdDdWJlQ2FtZXJhJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIHRoZSBjdWJlIHJlbmRlciB0YXJnZXQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1dlYkdMQ3ViZVJlbmRlclRhcmdldH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXQgPSByZW5kZXJUYXJnZXQ7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY3VycmVudCBhY3RpdmUgY29vcmRpbmF0ZSBzeXN0ZW0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez8oV2ViR0xDb29yZGluYXRlU3lzdGVtfFdlYkdQVUNvb3JkaW5hdGVTeXN0ZW0pfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvb3JkaW5hdGVTeXN0ZW0gPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGN1cnJlbnQgYWN0aXZlIG1pcG1hcCBsZXZlbFxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYWN0aXZlTWlwbWFwTGV2ZWwgPSAwO1xyXG5cclxuXHRcdGNvbnN0IGNhbWVyYVBYID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICk7XHJcblx0XHRjYW1lcmFQWC5sYXllcnMgPSB0aGlzLmxheWVycztcclxuXHRcdHRoaXMuYWRkKCBjYW1lcmFQWCApO1xyXG5cclxuXHRcdGNvbnN0IGNhbWVyYU5YID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICk7XHJcblx0XHRjYW1lcmFOWC5sYXllcnMgPSB0aGlzLmxheWVycztcclxuXHRcdHRoaXMuYWRkKCBjYW1lcmFOWCApO1xyXG5cclxuXHRcdGNvbnN0IGNhbWVyYVBZID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICk7XHJcblx0XHRjYW1lcmFQWS5sYXllcnMgPSB0aGlzLmxheWVycztcclxuXHRcdHRoaXMuYWRkKCBjYW1lcmFQWSApO1xyXG5cclxuXHRcdGNvbnN0IGNhbWVyYU5ZID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICk7XHJcblx0XHRjYW1lcmFOWS5sYXllcnMgPSB0aGlzLmxheWVycztcclxuXHRcdHRoaXMuYWRkKCBjYW1lcmFOWSApO1xyXG5cclxuXHRcdGNvbnN0IGNhbWVyYVBaID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICk7XHJcblx0XHRjYW1lcmFQWi5sYXllcnMgPSB0aGlzLmxheWVycztcclxuXHRcdHRoaXMuYWRkKCBjYW1lcmFQWiApO1xyXG5cclxuXHRcdGNvbnN0IGNhbWVyYU5aID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICk7XHJcblx0XHRjYW1lcmFOWi5sYXllcnMgPSB0aGlzLmxheWVycztcclxuXHRcdHRoaXMuYWRkKCBjYW1lcmFOWiApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE11c3QgYmUgY2FsbGVkIHdoZW4gdGhlIGNvb3JkaW5hdGUgc3lzdGVtIG9mIHRoZSBjdWJlIGNhbWVyYSBpcyBjaGFuZ2VkLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZUNvb3JkaW5hdGVTeXN0ZW0oKSB7XHJcblxyXG5cdFx0Y29uc3QgY29vcmRpbmF0ZVN5c3RlbSA9IHRoaXMuY29vcmRpbmF0ZVN5c3RlbTtcclxuXHJcblx0XHRjb25zdCBjYW1lcmFzID0gdGhpcy5jaGlsZHJlbi5jb25jYXQoKTtcclxuXHJcblx0XHRjb25zdCBbIGNhbWVyYVBYLCBjYW1lcmFOWCwgY2FtZXJhUFksIGNhbWVyYU5ZLCBjYW1lcmFQWiwgY2FtZXJhTlogXSA9IGNhbWVyYXM7XHJcblxyXG5cdFx0Zm9yICggY29uc3QgY2FtZXJhIG9mIGNhbWVyYXMgKSB0aGlzLnJlbW92ZSggY2FtZXJhICk7XHJcblxyXG5cdFx0aWYgKCBjb29yZGluYXRlU3lzdGVtID09PSBXZWJHTENvb3JkaW5hdGVTeXN0ZW0gKSB7XHJcblxyXG5cdFx0XHRjYW1lcmFQWC51cC5zZXQoIDAsIDEsIDAgKTtcclxuXHRcdFx0Y2FtZXJhUFgubG9va0F0KCAxLCAwLCAwICk7XHJcblxyXG5cdFx0XHRjYW1lcmFOWC51cC5zZXQoIDAsIDEsIDAgKTtcclxuXHRcdFx0Y2FtZXJhTlgubG9va0F0KCAtIDEsIDAsIDAgKTtcclxuXHJcblx0XHRcdGNhbWVyYVBZLnVwLnNldCggMCwgMCwgLSAxICk7XHJcblx0XHRcdGNhbWVyYVBZLmxvb2tBdCggMCwgMSwgMCApO1xyXG5cclxuXHRcdFx0Y2FtZXJhTlkudXAuc2V0KCAwLCAwLCAxICk7XHJcblx0XHRcdGNhbWVyYU5ZLmxvb2tBdCggMCwgLSAxLCAwICk7XHJcblxyXG5cdFx0XHRjYW1lcmFQWi51cC5zZXQoIDAsIDEsIDAgKTtcclxuXHRcdFx0Y2FtZXJhUFoubG9va0F0KCAwLCAwLCAxICk7XHJcblxyXG5cdFx0XHRjYW1lcmFOWi51cC5zZXQoIDAsIDEsIDAgKTtcclxuXHRcdFx0Y2FtZXJhTloubG9va0F0KCAwLCAwLCAtIDEgKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBjb29yZGluYXRlU3lzdGVtID09PSBXZWJHUFVDb29yZGluYXRlU3lzdGVtICkge1xyXG5cclxuXHRcdFx0Y2FtZXJhUFgudXAuc2V0KCAwLCAtIDEsIDAgKTtcclxuXHRcdFx0Y2FtZXJhUFgubG9va0F0KCAtIDEsIDAsIDAgKTtcclxuXHJcblx0XHRcdGNhbWVyYU5YLnVwLnNldCggMCwgLSAxLCAwICk7XHJcblx0XHRcdGNhbWVyYU5YLmxvb2tBdCggMSwgMCwgMCApO1xyXG5cclxuXHRcdFx0Y2FtZXJhUFkudXAuc2V0KCAwLCAwLCAxICk7XHJcblx0XHRcdGNhbWVyYVBZLmxvb2tBdCggMCwgMSwgMCApO1xyXG5cclxuXHRcdFx0Y2FtZXJhTlkudXAuc2V0KCAwLCAwLCAtIDEgKTtcclxuXHRcdFx0Y2FtZXJhTlkubG9va0F0KCAwLCAtIDEsIDAgKTtcclxuXHJcblx0XHRcdGNhbWVyYVBaLnVwLnNldCggMCwgLSAxLCAwICk7XHJcblx0XHRcdGNhbWVyYVBaLmxvb2tBdCggMCwgMCwgMSApO1xyXG5cclxuXHRcdFx0Y2FtZXJhTloudXAuc2V0KCAwLCAtIDEsIDAgKTtcclxuXHRcdFx0Y2FtZXJhTloubG9va0F0KCAwLCAwLCAtIDEgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuQ3ViZUNhbWVyYS51cGRhdGVDb29yZGluYXRlU3lzdGVtKCk6IEludmFsaWQgY29vcmRpbmF0ZSBzeXN0ZW06ICcgKyBjb29yZGluYXRlU3lzdGVtICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZvciAoIGNvbnN0IGNhbWVyYSBvZiBjYW1lcmFzICkge1xyXG5cclxuXHRcdFx0dGhpcy5hZGQoIGNhbWVyYSApO1xyXG5cclxuXHRcdFx0Y2FtZXJhLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCByZW5kZXIgdGhlIGdpdmVuIHNjZW5lIHdpdGggdGhlIGdpdmVuIHJlbmRlcmVyXHJcblx0ICogaW50byB0aGUgY3ViZSByZW5kZXIgdGFyZ2V0IG9mIHRoZSBjYW1lcmEuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geyhSZW5kZXJlcnxXZWJHTFJlbmRlcmVyKX0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcblx0ICogQHBhcmFtIHtTY2VuZX0gc2NlbmUgLSBUaGUgc2NlbmUgdG8gcmVuZGVyLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZSggcmVuZGVyZXIsIHNjZW5lICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5wYXJlbnQgPT09IG51bGwgKSB0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XHJcblxyXG5cdFx0Y29uc3QgeyByZW5kZXJUYXJnZXQsIGFjdGl2ZU1pcG1hcExldmVsIH0gPSB0aGlzO1xyXG5cclxuXHRcdGlmICggdGhpcy5jb29yZGluYXRlU3lzdGVtICE9PSByZW5kZXJlci5jb29yZGluYXRlU3lzdGVtICkge1xyXG5cclxuXHRcdFx0dGhpcy5jb29yZGluYXRlU3lzdGVtID0gcmVuZGVyZXIuY29vcmRpbmF0ZVN5c3RlbTtcclxuXHJcblx0XHRcdHRoaXMudXBkYXRlQ29vcmRpbmF0ZVN5c3RlbSgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBbIGNhbWVyYVBYLCBjYW1lcmFOWCwgY2FtZXJhUFksIGNhbWVyYU5ZLCBjYW1lcmFQWiwgY2FtZXJhTlogXSA9IHRoaXMuY2hpbGRyZW47XHJcblxyXG5cdFx0Y29uc3QgY3VycmVudFJlbmRlclRhcmdldCA9IHJlbmRlcmVyLmdldFJlbmRlclRhcmdldCgpO1xyXG5cdFx0Y29uc3QgY3VycmVudEFjdGl2ZUN1YmVGYWNlID0gcmVuZGVyZXIuZ2V0QWN0aXZlQ3ViZUZhY2UoKTtcclxuXHRcdGNvbnN0IGN1cnJlbnRBY3RpdmVNaXBtYXBMZXZlbCA9IHJlbmRlcmVyLmdldEFjdGl2ZU1pcG1hcExldmVsKCk7XHJcblxyXG5cdFx0Y29uc3QgY3VycmVudFhyRW5hYmxlZCA9IHJlbmRlcmVyLnhyLmVuYWJsZWQ7XHJcblxyXG5cdFx0cmVuZGVyZXIueHIuZW5hYmxlZCA9IGZhbHNlO1xyXG5cclxuXHRcdGNvbnN0IGdlbmVyYXRlTWlwbWFwcyA9IHJlbmRlclRhcmdldC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcztcclxuXHJcblx0XHRyZW5kZXJUYXJnZXQudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcclxuXHJcblx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCwgMCwgYWN0aXZlTWlwbWFwTGV2ZWwgKTtcclxuXHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYVBYICk7XHJcblxyXG5cdFx0cmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQsIDEsIGFjdGl2ZU1pcG1hcExldmVsICk7XHJcblx0XHRyZW5kZXJlci5yZW5kZXIoIHNjZW5lLCBjYW1lcmFOWCApO1xyXG5cclxuXHRcdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0LCAyLCBhY3RpdmVNaXBtYXBMZXZlbCApO1xyXG5cdFx0cmVuZGVyZXIucmVuZGVyKCBzY2VuZSwgY2FtZXJhUFkgKTtcclxuXHJcblx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCwgMywgYWN0aXZlTWlwbWFwTGV2ZWwgKTtcclxuXHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYU5ZICk7XHJcblxyXG5cdFx0cmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQsIDQsIGFjdGl2ZU1pcG1hcExldmVsICk7XHJcblx0XHRyZW5kZXJlci5yZW5kZXIoIHNjZW5lLCBjYW1lcmFQWiApO1xyXG5cclxuXHRcdC8vIG1pcG1hcHMgYXJlIGdlbmVyYXRlZCBkdXJpbmcgdGhlIGxhc3QgY2FsbCBvZiByZW5kZXIoKVxyXG5cdFx0Ly8gYXQgdGhpcyBwb2ludCwgYWxsIHNpZGVzIG9mIHRoZSBjdWJlIHJlbmRlciB0YXJnZXQgYXJlIGRlZmluZWRcclxuXHJcblx0XHRyZW5kZXJUYXJnZXQudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBnZW5lcmF0ZU1pcG1hcHM7XHJcblxyXG5cdFx0cmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQsIDUsIGFjdGl2ZU1pcG1hcExldmVsICk7XHJcblx0XHRyZW5kZXJlci5yZW5kZXIoIHNjZW5lLCBjYW1lcmFOWiApO1xyXG5cclxuXHRcdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggY3VycmVudFJlbmRlclRhcmdldCwgY3VycmVudEFjdGl2ZUN1YmVGYWNlLCBjdXJyZW50QWN0aXZlTWlwbWFwTGV2ZWwgKTtcclxuXHJcblx0XHRyZW5kZXJlci54ci5lbmFibGVkID0gY3VycmVudFhyRW5hYmxlZDtcclxuXHJcblx0XHRyZW5kZXJUYXJnZXQudGV4dHVyZS5uZWVkc1BNUkVNVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgQ3ViZUNhbWVyYSB9O1xyXG4iLCJpbXBvcnQgeyBUZXh0dXJlIH0gZnJvbSAnLi9UZXh0dXJlLmpzJztcclxuaW1wb3J0IHsgQ3ViZVJlZmxlY3Rpb25NYXBwaW5nIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgY3ViZSB0ZXh0dXJlIG1hZGUgdXAgb2Ygc2l4IGltYWdlcy5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgbG9hZGVyID0gbmV3IFRIUkVFLkN1YmVUZXh0dXJlTG9hZGVyKCk7XHJcbiAqIGxvYWRlci5zZXRQYXRoKCAndGV4dHVyZXMvY3ViZS9waXNhLycgKTtcclxuICpcclxuICogY29uc3QgdGV4dHVyZUN1YmUgPSBsb2FkZXIubG9hZCggW1xyXG4gKiBcdCdweC5wbmcnLCAnbngucG5nJywgJ3B5LnBuZycsICdueS5wbmcnLCAncHoucG5nJywgJ256LnBuZydcclxuICogXSApO1xyXG4gKlxyXG4gKiBjb25zdCBtYXRlcmlhbCA9IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogMHhmZmZmZmYsIGVudk1hcDogdGV4dHVyZUN1YmUgfSApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIFRleHR1cmVcclxuICovXHJcbmNsYXNzIEN1YmVUZXh0dXJlIGV4dGVuZHMgVGV4dHVyZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgY3ViZSB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxJbWFnZT59IFtpbWFnZXM9W11dIC0gQW4gYXJyYXkgaG9sZGluZyBhIGltYWdlIGZvciBlYWNoIHNpZGUgb2YgYSBjdWJlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbWFwcGluZz1DdWJlUmVmbGVjdGlvbk1hcHBpbmddIC0gVGhlIHRleHR1cmUgbWFwcGluZy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3dyYXBTPUNsYW1wVG9FZGdlV3JhcHBpbmddIC0gVGhlIHdyYXBTIHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbd3JhcFQ9Q2xhbXBUb0VkZ2VXcmFwcGluZ10gLSBUaGUgd3JhcFQgdmFsdWUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFttYWdGaWx0ZXI9TGluZWFyRmlsdGVyXSAtIFRoZSBtYWcgZmlsdGVyIHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbWluRmlsdGVyPUxpbmVhck1pcG1hcExpbmVhckZpbHRlcl0gLSBUaGUgbWluIGZpbHRlciB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2Zvcm1hdD1SR0JBRm9ybWF0XSAtIFRoZSB0ZXh0dXJlIGZvcm1hdC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3R5cGU9VW5zaWduZWRCeXRlVHlwZV0gLSBUaGUgdGV4dHVyZSB0eXBlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbYW5pc290cm9weT1UZXh0dXJlLkRFRkFVTFRfQU5JU09UUk9QWV0gLSBUaGUgYW5pc290cm9weSB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW2NvbG9yU3BhY2U9Tm9Db2xvclNwYWNlXSAtIFRoZSBjb2xvciBzcGFjZSB2YWx1ZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggaW1hZ2VzID0gW10sIG1hcHBpbmcgPSBDdWJlUmVmbGVjdGlvbk1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSwgY29sb3JTcGFjZSApIHtcclxuXHJcblx0XHRzdXBlciggaW1hZ2VzLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHksIGNvbG9yU3BhY2UgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNDdWJlVGV4dHVyZSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBJZiBzZXQgdG8gYHRydWVgLCB0aGUgdGV4dHVyZSBpcyBmbGlwcGVkIGFsb25nIHRoZSB2ZXJ0aWNhbCBheGlzIHdoZW5cclxuXHRcdCAqIHVwbG9hZGVkIHRvIHRoZSBHUFUuXHJcblx0XHQgKlxyXG5cdFx0ICogT3ZlcndyaXR0ZW4gYW5kIHNldCB0byBgZmFsc2VgIGJ5IGRlZmF1bHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZsaXBZID0gZmFsc2U7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWxpYXMgZm9yIHtAbGluayBDdWJlVGV4dHVyZSNpbWFnZX0uXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7QXJyYXk8SW1hZ2U+fVxyXG5cdCAqL1xyXG5cdGdldCBpbWFnZXMoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuaW1hZ2U7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0IGltYWdlcyggdmFsdWUgKSB7XHJcblxyXG5cdFx0dGhpcy5pbWFnZSA9IHZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBDdWJlVGV4dHVyZSB9O1xyXG4iLCJpbXBvcnQgeyBCYWNrU2lkZSwgTGluZWFyRmlsdGVyLCBMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXIsIE5vQmxlbmRpbmcgfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBNZXNoIH0gZnJvbSAnLi4vb2JqZWN0cy9NZXNoLmpzJztcclxuaW1wb3J0IHsgQm94R2VvbWV0cnkgfSBmcm9tICcuLi9nZW9tZXRyaWVzL0JveEdlb21ldHJ5LmpzJztcclxuaW1wb3J0IHsgU2hhZGVyTWF0ZXJpYWwgfSBmcm9tICcuLi9tYXRlcmlhbHMvU2hhZGVyTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyBjbG9uZVVuaWZvcm1zIH0gZnJvbSAnLi9zaGFkZXJzL1VuaWZvcm1zVXRpbHMuanMnO1xyXG5pbXBvcnQgeyBXZWJHTFJlbmRlclRhcmdldCB9IGZyb20gJy4vV2ViR0xSZW5kZXJUYXJnZXQuanMnO1xyXG5pbXBvcnQgeyBDdWJlQ2FtZXJhIH0gZnJvbSAnLi4vY2FtZXJhcy9DdWJlQ2FtZXJhLmpzJztcclxuaW1wb3J0IHsgQ3ViZVRleHR1cmUgfSBmcm9tICcuLi90ZXh0dXJlcy9DdWJlVGV4dHVyZS5qcyc7XHJcblxyXG4vKipcclxuICogQSBjdWJlIHJlbmRlciB0YXJnZXQgdXNlZCBpbiBjb250ZXh0IG9mIHtAbGluayBXZWJHTFJlbmRlcmVyfS5cclxuICpcclxuICogQGF1Z21lbnRzIFdlYkdMUmVuZGVyVGFyZ2V0XHJcbiAqL1xyXG5jbGFzcyBXZWJHTEN1YmVSZW5kZXJUYXJnZXQgZXh0ZW5kcyBXZWJHTFJlbmRlclRhcmdldCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgY3ViZSByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtzaXplPTFdIC0gVGhlIHNpemUgb2YgdGhlIHJlbmRlciB0YXJnZXQuXHJcblx0ICogQHBhcmFtIHtSZW5kZXJUYXJnZXR+T3B0aW9uc30gW29wdGlvbnNdIC0gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBzaXplID0gMSwgb3B0aW9ucyA9IHt9ICkge1xyXG5cclxuXHRcdHN1cGVyKCBzaXplLCBzaXplLCBvcHRpb25zICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0ID0gdHJ1ZTtcclxuXHJcblx0XHRjb25zdCBpbWFnZSA9IHsgd2lkdGg6IHNpemUsIGhlaWdodDogc2l6ZSwgZGVwdGg6IDEgfTtcclxuXHRcdGNvbnN0IGltYWdlcyA9IFsgaW1hZ2UsIGltYWdlLCBpbWFnZSwgaW1hZ2UsIGltYWdlLCBpbWFnZSBdO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogT3ZlcndyaXR0ZW4gd2l0aCBhIGRpZmZlcmVudCB0ZXh0dXJlIHR5cGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0RhdGFBcnJheVRleHR1cmV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudGV4dHVyZSA9IG5ldyBDdWJlVGV4dHVyZSggaW1hZ2VzLCBvcHRpb25zLm1hcHBpbmcsIG9wdGlvbnMud3JhcFMsIG9wdGlvbnMud3JhcFQsIG9wdGlvbnMubWFnRmlsdGVyLCBvcHRpb25zLm1pbkZpbHRlciwgb3B0aW9ucy5mb3JtYXQsIG9wdGlvbnMudHlwZSwgb3B0aW9ucy5hbmlzb3Ryb3B5LCBvcHRpb25zLmNvbG9yU3BhY2UgKTtcclxuXHJcblx0XHQvLyBCeSBjb252ZW50aW9uIC0tIGxpa2VseSBiYXNlZCBvbiB0aGUgUmVuZGVyTWFuIHNwZWMgZnJvbSB0aGUgMTk5MCdzIC0tIGN1YmUgbWFwcyBhcmUgc3BlY2lmaWVkIGJ5IFdlYkdMIChhbmQgdGhyZWUuanMpXHJcblx0XHQvLyBpbiBhIGNvb3JkaW5hdGUgc3lzdGVtIGluIHdoaWNoIHBvc2l0aXZlLXggaXMgdG8gdGhlIHJpZ2h0IHdoZW4gbG9va2luZyB1cCB0aGUgcG9zaXRpdmUteiBheGlzIC0tIGluIG90aGVyIHdvcmRzLFxyXG5cdFx0Ly8gaW4gYSBsZWZ0LWhhbmRlZCBjb29yZGluYXRlIHN5c3RlbS4gQnkgY29udGludWluZyB0aGlzIGNvbnZlbnRpb24sIHByZWV4aXN0aW5nIGN1YmUgbWFwcyBjb250aW51ZWQgdG8gcmVuZGVyIGNvcnJlY3RseS5cclxuXHJcblx0XHQvLyB0aHJlZS5qcyB1c2VzIGEgcmlnaHQtaGFuZGVkIGNvb3JkaW5hdGUgc3lzdGVtLiBTbyBlbnZpcm9ubWVudCBtYXBzIHVzZWQgaW4gdGhyZWUuanMgYXBwZWFyIHRvIGhhdmUgcHggYW5kIG54IHN3YXBwZWRcclxuXHRcdC8vIGFuZCB0aGUgZmxhZyBpc1JlbmRlclRhcmdldFRleHR1cmUgY29udHJvbHMgdGhpcyBjb252ZXJzaW9uLiBUaGUgZmxpcCBpcyBub3QgcmVxdWlyZWQgd2hlbiB1c2luZyBXZWJHTEN1YmVSZW5kZXJUYXJnZXQudGV4dHVyZVxyXG5cdFx0Ly8gYXMgYSBjdWJlIHRleHR1cmUgKHRoaXMgaXMgZGV0ZWN0ZWQgd2hlbiBpc1JlbmRlclRhcmdldFRleHR1cmUgaXMgc2V0IHRvIHRydWUgZm9yIGN1YmUgdGV4dHVyZXMpLlxyXG5cclxuXHRcdHRoaXMudGV4dHVyZS5pc1JlbmRlclRhcmdldFRleHR1cmUgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBvcHRpb25zLmdlbmVyYXRlTWlwbWFwcyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5nZW5lcmF0ZU1pcG1hcHMgOiBmYWxzZTtcclxuXHRcdHRoaXMudGV4dHVyZS5taW5GaWx0ZXIgPSBvcHRpb25zLm1pbkZpbHRlciAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5taW5GaWx0ZXIgOiBMaW5lYXJGaWx0ZXI7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29udmVydHMgdGhlIGdpdmVuIGVxdWlyZWN0YW5ndWxhciB0ZXh0dXJlIHRvIGEgY3ViZSBtYXAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSBlcXVpcmVjdGFuZ3VsYXIgdGV4dHVyZS5cclxuXHQgKiBAcmV0dXJuIHtXZWJHTEN1YmVSZW5kZXJUYXJnZXR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgY3ViZSByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqL1xyXG5cdGZyb21FcXVpcmVjdGFuZ3VsYXJUZXh0dXJlKCByZW5kZXJlciwgdGV4dHVyZSApIHtcclxuXHJcblx0XHR0aGlzLnRleHR1cmUudHlwZSA9IHRleHR1cmUudHlwZTtcclxuXHRcdHRoaXMudGV4dHVyZS5jb2xvclNwYWNlID0gdGV4dHVyZS5jb2xvclNwYWNlO1xyXG5cclxuXHRcdHRoaXMudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSB0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcztcclxuXHRcdHRoaXMudGV4dHVyZS5taW5GaWx0ZXIgPSB0ZXh0dXJlLm1pbkZpbHRlcjtcclxuXHRcdHRoaXMudGV4dHVyZS5tYWdGaWx0ZXIgPSB0ZXh0dXJlLm1hZ0ZpbHRlcjtcclxuXHJcblx0XHRjb25zdCBzaGFkZXIgPSB7XHJcblxyXG5cdFx0XHR1bmlmb3Jtczoge1xyXG5cdFx0XHRcdHRFcXVpcmVjdDogeyB2YWx1ZTogbnVsbCB9LFxyXG5cdFx0XHR9LFxyXG5cclxuXHRcdFx0dmVydGV4U2hhZGVyOiAvKiBnbHNsICovYFxyXG5cclxuXHRcdFx0XHR2YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uO1xyXG5cclxuXHRcdFx0XHR2ZWMzIHRyYW5zZm9ybURpcmVjdGlvbiggaW4gdmVjMyBkaXIsIGluIG1hdDQgbWF0cml4ICkge1xyXG5cclxuXHRcdFx0XHRcdHJldHVybiBub3JtYWxpemUoICggbWF0cml4ICogdmVjNCggZGlyLCAwLjAgKSApLnh5eiApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHZvaWQgbWFpbigpIHtcclxuXHJcblx0XHRcdFx0XHR2V29ybGREaXJlY3Rpb24gPSB0cmFuc2Zvcm1EaXJlY3Rpb24oIHBvc2l0aW9uLCBtb2RlbE1hdHJpeCApO1xyXG5cclxuXHRcdFx0XHRcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XHJcblx0XHRcdFx0XHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XHJcblxyXG5cdFx0XHRcdH1cclxuXHRcdFx0YCxcclxuXHJcblx0XHRcdGZyYWdtZW50U2hhZGVyOiAvKiBnbHNsICovYFxyXG5cclxuXHRcdFx0XHR1bmlmb3JtIHNhbXBsZXIyRCB0RXF1aXJlY3Q7XHJcblxyXG5cdFx0XHRcdHZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247XHJcblxyXG5cdFx0XHRcdCNpbmNsdWRlIDxjb21tb24+XHJcblxyXG5cdFx0XHRcdHZvaWQgbWFpbigpIHtcclxuXHJcblx0XHRcdFx0XHR2ZWMzIGRpcmVjdGlvbiA9IG5vcm1hbGl6ZSggdldvcmxkRGlyZWN0aW9uICk7XHJcblxyXG5cdFx0XHRcdFx0dmVjMiBzYW1wbGVVViA9IGVxdWlyZWN0VXYoIGRpcmVjdGlvbiApO1xyXG5cclxuXHRcdFx0XHRcdGdsX0ZyYWdDb2xvciA9IHRleHR1cmUyRCggdEVxdWlyZWN0LCBzYW1wbGVVViApO1xyXG5cclxuXHRcdFx0XHR9XHJcblx0XHRcdGBcclxuXHRcdH07XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSBuZXcgQm94R2VvbWV0cnkoIDUsIDUsIDUgKTtcclxuXHJcblx0XHRjb25zdCBtYXRlcmlhbCA9IG5ldyBTaGFkZXJNYXRlcmlhbCgge1xyXG5cclxuXHRcdFx0bmFtZTogJ0N1YmVtYXBGcm9tRXF1aXJlY3QnLFxyXG5cclxuXHRcdFx0dW5pZm9ybXM6IGNsb25lVW5pZm9ybXMoIHNoYWRlci51bmlmb3JtcyApLFxyXG5cdFx0XHR2ZXJ0ZXhTaGFkZXI6IHNoYWRlci52ZXJ0ZXhTaGFkZXIsXHJcblx0XHRcdGZyYWdtZW50U2hhZGVyOiBzaGFkZXIuZnJhZ21lbnRTaGFkZXIsXHJcblx0XHRcdHNpZGU6IEJhY2tTaWRlLFxyXG5cdFx0XHRibGVuZGluZzogTm9CbGVuZGluZ1xyXG5cclxuXHRcdH0gKTtcclxuXHJcblx0XHRtYXRlcmlhbC51bmlmb3Jtcy50RXF1aXJlY3QudmFsdWUgPSB0ZXh0dXJlO1xyXG5cclxuXHRcdGNvbnN0IG1lc2ggPSBuZXcgTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcblxyXG5cdFx0Y29uc3QgY3VycmVudE1pbkZpbHRlciA9IHRleHR1cmUubWluRmlsdGVyO1xyXG5cclxuXHRcdC8vIEF2b2lkIGJsdXJyZWQgcG9sZXNcclxuXHRcdGlmICggdGV4dHVyZS5taW5GaWx0ZXIgPT09IExpbmVhck1pcG1hcExpbmVhckZpbHRlciApIHRleHR1cmUubWluRmlsdGVyID0gTGluZWFyRmlsdGVyO1xyXG5cclxuXHRcdGNvbnN0IGNhbWVyYSA9IG5ldyBDdWJlQ2FtZXJhKCAxLCAxMCwgdGhpcyApO1xyXG5cdFx0Y2FtZXJhLnVwZGF0ZSggcmVuZGVyZXIsIG1lc2ggKTtcclxuXHJcblx0XHR0ZXh0dXJlLm1pbkZpbHRlciA9IGN1cnJlbnRNaW5GaWx0ZXI7XHJcblxyXG5cdFx0bWVzaC5nZW9tZXRyeS5kaXNwb3NlKCk7XHJcblx0XHRtZXNoLm1hdGVyaWFsLmRpc3Bvc2UoKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDbGVhcnMgdGhpcyBjdWJlIHJlbmRlciB0YXJnZXQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NvbG9yPXRydWVdIC0gV2hldGhlciB0aGUgY29sb3IgYnVmZmVyIHNob3VsZCBiZSBjbGVhcmVkIG9yIG5vdC5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtkZXB0aD10cnVlXSAtIFdoZXRoZXIgdGhlIGRlcHRoIGJ1ZmZlciBzaG91bGQgYmUgY2xlYXJlZCBvciBub3QuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbc3RlbmNpbD10cnVlXSAtIFdoZXRoZXIgdGhlIHN0ZW5jaWwgYnVmZmVyIHNob3VsZCBiZSBjbGVhcmVkIG9yIG5vdC5cclxuXHQgKi9cclxuXHRjbGVhciggcmVuZGVyZXIsIGNvbG9yID0gdHJ1ZSwgZGVwdGggPSB0cnVlLCBzdGVuY2lsID0gdHJ1ZSApIHtcclxuXHJcblx0XHRjb25zdCBjdXJyZW50UmVuZGVyVGFyZ2V0ID0gcmVuZGVyZXIuZ2V0UmVuZGVyVGFyZ2V0KCk7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgNjsgaSArKyApIHtcclxuXHJcblx0XHRcdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggdGhpcywgaSApO1xyXG5cclxuXHRcdFx0cmVuZGVyZXIuY2xlYXIoIGNvbG9yLCBkZXB0aCwgc3RlbmNpbCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIGN1cnJlbnRSZW5kZXJUYXJnZXQgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgV2ViR0xDdWJlUmVuZGVyVGFyZ2V0IH07XHJcbiIsImltcG9ydCB7IE9iamVjdDNEIH0gZnJvbSAnLi4vY29yZS9PYmplY3QzRC5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBpcyBhbG1vc3QgaWRlbnRpY2FsIHRvIGFuIHtAbGluayBPYmplY3QzRH0uIEl0cyBwdXJwb3NlIGlzIHRvXHJcbiAqIG1ha2Ugd29ya2luZyB3aXRoIGdyb3VwcyBvZiBvYmplY3RzIHN5bnRhY3RpY2FsbHkgY2xlYXJlci5cclxuICpcclxuICogYGBganNcclxuICogLy8gQ3JlYXRlIGEgZ3JvdXAgYW5kIGFkZCB0aGUgdHdvIGN1YmVzLlxyXG4gKiAvLyBUaGVzZSBjdWJlcyBjYW4gbm93IGJlIHJvdGF0ZWQgLyBzY2FsZWQgZXRjIGFzIGEgZ3JvdXAuXHJcbiAqIGNvbnN0IGdyb3VwID0gbmV3IFRIUkVFLkdyb3VwKCk7XHJcbiAqXHJcbiAqIGdyb3VwLmFkZCggbWVzaEEgKTtcclxuICogZ3JvdXAuYWRkKCBtZXNoQiApO1xyXG4gKlxyXG4gKiBzY2VuZS5hZGQoIGdyb3VwICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgT2JqZWN0M0RcclxuICovXHJcbmNsYXNzIEdyb3VwIGV4dGVuZHMgT2JqZWN0M0Qge1xyXG5cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0dyb3VwID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnR3JvdXAnO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBHcm91cCB9O1xyXG4iLCJpbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuaW1wb3J0IHsgR3JvdXAgfSBmcm9tICcuLi8uLi9vYmplY3RzL0dyb3VwLmpzJztcclxuXHJcbmNvbnN0IF9tb3ZlRXZlbnQgPSB7IHR5cGU6ICdtb3ZlJyB9O1xyXG5cclxuLyoqXHJcbiAqIENsYXNzIGZvciByZXByZXNlbnRpbmcgYSBYUiBjb250cm9sbGVyIHdpdGggaXRzXHJcbiAqIGRpZmZlcmVudCBjb29yZGluYXRlIHN5c3RlbXMuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5jbGFzcyBXZWJYUkNvbnRyb2xsZXIge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IFhSIGNvbnRyb2xsZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGdyb3VwIHJlcHJlc2VudGluZyB0aGUgdGFyZ2V0IHJheSBzcGFjZVxyXG5cdFx0ICogb2YgdGhlIFhSIGNvbnRyb2xsZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHs/R3JvdXB9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX3RhcmdldFJheSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGdyb3VwIHJlcHJlc2VudGluZyB0aGUgZ3JpcCBzcGFjZVxyXG5cdFx0ICogb2YgdGhlIFhSIGNvbnRyb2xsZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHs/R3JvdXB9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX2dyaXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBncm91cCByZXByZXNlbnRpbmcgdGhlIGhhbmQgc3BhY2VcclxuXHRcdCAqIG9mIHRoZSBYUiBjb250cm9sbGVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7P0dyb3VwfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9oYW5kID0gbnVsbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgZ3JvdXAgcmVwcmVzZW50aW5nIHRoZSBoYW5kIHNwYWNlIG9mIHRoZSBYUiBjb250cm9sbGVyLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7R3JvdXB9IEEgZ3JvdXAgcmVwcmVzZW50aW5nIHRoZSBoYW5kIHNwYWNlIG9mIHRoZSBYUiBjb250cm9sbGVyLlxyXG5cdCAqL1xyXG5cdGdldEhhbmRTcGFjZSgpIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuX2hhbmQgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLl9oYW5kID0gbmV3IEdyb3VwKCk7XHJcblx0XHRcdHRoaXMuX2hhbmQubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xyXG5cdFx0XHR0aGlzLl9oYW5kLnZpc2libGUgPSBmYWxzZTtcclxuXHJcblx0XHRcdHRoaXMuX2hhbmQuam9pbnRzID0ge307XHJcblx0XHRcdHRoaXMuX2hhbmQuaW5wdXRTdGF0ZSA9IHsgcGluY2hpbmc6IGZhbHNlIH07XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzLl9oYW5kO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBncm91cCByZXByZXNlbnRpbmcgdGhlIHRhcmdldCByYXkgc3BhY2Ugb2YgdGhlIFhSIGNvbnRyb2xsZXIuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtHcm91cH0gQSBncm91cCByZXByZXNlbnRpbmcgdGhlIHRhcmdldCByYXkgc3BhY2Ugb2YgdGhlIFhSIGNvbnRyb2xsZXIuXHJcblx0ICovXHJcblx0Z2V0VGFyZ2V0UmF5U3BhY2UoKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl90YXJnZXRSYXkgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLl90YXJnZXRSYXkgPSBuZXcgR3JvdXAoKTtcclxuXHRcdFx0dGhpcy5fdGFyZ2V0UmF5Lm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcclxuXHRcdFx0dGhpcy5fdGFyZ2V0UmF5LnZpc2libGUgPSBmYWxzZTtcclxuXHRcdFx0dGhpcy5fdGFyZ2V0UmF5Lmhhc0xpbmVhclZlbG9jaXR5ID0gZmFsc2U7XHJcblx0XHRcdHRoaXMuX3RhcmdldFJheS5saW5lYXJWZWxvY2l0eSA9IG5ldyBWZWN0b3IzKCk7XHJcblx0XHRcdHRoaXMuX3RhcmdldFJheS5oYXNBbmd1bGFyVmVsb2NpdHkgPSBmYWxzZTtcclxuXHRcdFx0dGhpcy5fdGFyZ2V0UmF5LmFuZ3VsYXJWZWxvY2l0eSA9IG5ldyBWZWN0b3IzKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzLl90YXJnZXRSYXk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIGdyb3VwIHJlcHJlc2VudGluZyB0aGUgZ3JpcCBzcGFjZSBvZiB0aGUgWFIgY29udHJvbGxlci5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0dyb3VwfSBBIGdyb3VwIHJlcHJlc2VudGluZyB0aGUgZ3JpcCBzcGFjZSBvZiB0aGUgWFIgY29udHJvbGxlci5cclxuXHQgKi9cclxuXHRnZXRHcmlwU3BhY2UoKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9ncmlwID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5fZ3JpcCA9IG5ldyBHcm91cCgpO1xyXG5cdFx0XHR0aGlzLl9ncmlwLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcclxuXHRcdFx0dGhpcy5fZ3JpcC52aXNpYmxlID0gZmFsc2U7XHJcblx0XHRcdHRoaXMuX2dyaXAuaGFzTGluZWFyVmVsb2NpdHkgPSBmYWxzZTtcclxuXHRcdFx0dGhpcy5fZ3JpcC5saW5lYXJWZWxvY2l0eSA9IG5ldyBWZWN0b3IzKCk7XHJcblx0XHRcdHRoaXMuX2dyaXAuaGFzQW5ndWxhclZlbG9jaXR5ID0gZmFsc2U7XHJcblx0XHRcdHRoaXMuX2dyaXAuYW5ndWxhclZlbG9jaXR5ID0gbmV3IFZlY3RvcjMoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX2dyaXA7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGlzcGF0Y2hlcyB0aGUgZ2l2ZW4gZXZlbnQgdG8gdGhlIGdyb3VwcyByZXByZXNlbnRpbmdcclxuXHQgKiB0aGUgZGlmZmVyZW50IGNvb3JkaW5hdGUgc3BhY2VzIG9mIHRoZSBYUiBjb250cm9sbGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IC0gVGhlIGV2ZW50IHRvIGRpc3BhdGNoLlxyXG5cdCAqIEByZXR1cm4ge1dlYlhSQ29udHJvbGxlcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRkaXNwYXRjaEV2ZW50KCBldmVudCApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuX3RhcmdldFJheSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuX3RhcmdldFJheS5kaXNwYXRjaEV2ZW50KCBldmVudCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMuX2dyaXAgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLl9ncmlwLmRpc3BhdGNoRXZlbnQoIGV2ZW50ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy5faGFuZCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuX2hhbmQuZGlzcGF0Y2hFdmVudCggZXZlbnQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29ubmVjdHMgdGhlIGNvbnRyb2xsZXIgd2l0aCB0aGUgZ2l2ZW4gWFIgaW5wdXQgc291cmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtYUklucHV0U291cmNlfSBpbnB1dFNvdXJjZSAtIFRoZSBpbnB1dCBzb3VyY2UuXHJcblx0ICogQHJldHVybiB7V2ViWFJDb250cm9sbGVyfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNvbm5lY3QoIGlucHV0U291cmNlICkge1xyXG5cclxuXHRcdGlmICggaW5wdXRTb3VyY2UgJiYgaW5wdXRTb3VyY2UuaGFuZCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGhhbmQgPSB0aGlzLl9oYW5kO1xyXG5cclxuXHRcdFx0aWYgKCBoYW5kICkge1xyXG5cclxuXHRcdFx0XHRmb3IgKCBjb25zdCBpbnB1dGpvaW50IG9mIGlucHV0U291cmNlLmhhbmQudmFsdWVzKCkgKSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gSW5pdGlhbGl6ZSBoYW5kIHdpdGggam9pbnRzIHdoZW4gY29ubmVjdGVkXHJcblx0XHRcdFx0XHR0aGlzLl9nZXRIYW5kSm9pbnQoIGhhbmQsIGlucHV0am9pbnQgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2Nvbm5lY3RlZCcsIGRhdGE6IGlucHV0U291cmNlIH0gKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEaXNjb25uZWN0cyB0aGUgY29udHJvbGxlciBmcm9tIHRoZSBnaXZlbiBYUiBpbnB1dCBzb3VyY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1hSSW5wdXRTb3VyY2V9IGlucHV0U291cmNlIC0gVGhlIGlucHV0IHNvdXJjZS5cclxuXHQgKiBAcmV0dXJuIHtXZWJYUkNvbnRyb2xsZXJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0ZGlzY29ubmVjdCggaW5wdXRTb3VyY2UgKSB7XHJcblxyXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdkaXNjb25uZWN0ZWQnLCBkYXRhOiBpbnB1dFNvdXJjZSB9ICk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl90YXJnZXRSYXkgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLl90YXJnZXRSYXkudmlzaWJsZSA9IGZhbHNlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMuX2dyaXAgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLl9ncmlwLnZpc2libGUgPSBmYWxzZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9oYW5kICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5faGFuZC52aXNpYmxlID0gZmFsc2U7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIGNvbnRyb2xsZXIgd2l0aCB0aGUgZ2l2ZW4gaW5wdXQgc291cmNlLCBYUiBmcmFtZSBhbmQgcmVmZXJlbmNlIHNwYWNlLlxyXG5cdCAqIFRoaXMgdXBkYXRlcyB0aGUgdHJhbnNmb3JtYXRpb25zIG9mIHRoZSBncm91cHMgdGhhdCByZXByZXNlbnQgdGhlIGRpZmZlcmVudFxyXG5cdCAqIGNvb3JkaW5hdGUgc3lzdGVtcyBvZiB0aGUgY29udHJvbGxlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7WFJJbnB1dFNvdXJjZX0gaW5wdXRTb3VyY2UgLSBUaGUgaW5wdXQgc291cmNlLlxyXG5cdCAqIEBwYXJhbSB7WFJGcmFtZX0gZnJhbWUgLSBUaGUgWFIgZnJhbWUuXHJcblx0ICogQHBhcmFtIHtYUlJlZmVyZW5jZVNwYWNlfSByZWZlcmVuY2VTcGFjZSAtIFRoZSByZWZlcmVuY2Ugc3BhY2UuXHJcblx0ICogQHJldHVybiB7V2ViWFJDb250cm9sbGVyfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZSggaW5wdXRTb3VyY2UsIGZyYW1lLCByZWZlcmVuY2VTcGFjZSApIHtcclxuXHJcblx0XHRsZXQgaW5wdXRQb3NlID0gbnVsbDtcclxuXHRcdGxldCBncmlwUG9zZSA9IG51bGw7XHJcblx0XHRsZXQgaGFuZFBvc2UgPSBudWxsO1xyXG5cclxuXHRcdGNvbnN0IHRhcmdldFJheSA9IHRoaXMuX3RhcmdldFJheTtcclxuXHRcdGNvbnN0IGdyaXAgPSB0aGlzLl9ncmlwO1xyXG5cdFx0Y29uc3QgaGFuZCA9IHRoaXMuX2hhbmQ7XHJcblxyXG5cdFx0aWYgKCBpbnB1dFNvdXJjZSAmJiBmcmFtZS5zZXNzaW9uLnZpc2liaWxpdHlTdGF0ZSAhPT0gJ3Zpc2libGUtYmx1cnJlZCcgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGhhbmQgJiYgaW5wdXRTb3VyY2UuaGFuZCApIHtcclxuXHJcblx0XHRcdFx0aGFuZFBvc2UgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHRmb3IgKCBjb25zdCBpbnB1dGpvaW50IG9mIGlucHV0U291cmNlLmhhbmQudmFsdWVzKCkgKSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gVXBkYXRlIHRoZSBqb2ludHMgZ3JvdXBzIHdpdGggdGhlIFhSSm9pbnQgcG9zZXNcclxuXHRcdFx0XHRcdGNvbnN0IGpvaW50UG9zZSA9IGZyYW1lLmdldEpvaW50UG9zZSggaW5wdXRqb2ludCwgcmVmZXJlbmNlU3BhY2UgKTtcclxuXHJcblx0XHRcdFx0XHQvLyBUaGUgdHJhbnNmb3JtIG9mIHRoaXMgam9pbnQgd2lsbCBiZSB1cGRhdGVkIHdpdGggdGhlIGpvaW50IHBvc2Ugb24gZWFjaCBmcmFtZVxyXG5cdFx0XHRcdFx0Y29uc3Qgam9pbnQgPSB0aGlzLl9nZXRIYW5kSm9pbnQoIGhhbmQsIGlucHV0am9pbnQgKTtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGpvaW50UG9zZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHRcdGpvaW50Lm1hdHJpeC5mcm9tQXJyYXkoIGpvaW50UG9zZS50cmFuc2Zvcm0ubWF0cml4ICk7XHJcblx0XHRcdFx0XHRcdGpvaW50Lm1hdHJpeC5kZWNvbXBvc2UoIGpvaW50LnBvc2l0aW9uLCBqb2ludC5yb3RhdGlvbiwgam9pbnQuc2NhbGUgKTtcclxuXHRcdFx0XHRcdFx0am9pbnQubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHRydWU7XHJcblx0XHRcdFx0XHRcdGpvaW50LmpvaW50UmFkaXVzID0gam9pbnRQb3NlLnJhZGl1cztcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0am9pbnQudmlzaWJsZSA9IGpvaW50UG9zZSAhPT0gbnVsbDtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyBDdXN0b20gZXZlbnRzXHJcblxyXG5cdFx0XHRcdC8vIENoZWNrIHBpbmNoelxyXG5cdFx0XHRcdGNvbnN0IGluZGV4VGlwID0gaGFuZC5qb2ludHNbICdpbmRleC1maW5nZXItdGlwJyBdO1xyXG5cdFx0XHRcdGNvbnN0IHRodW1iVGlwID0gaGFuZC5qb2ludHNbICd0aHVtYi10aXAnIF07XHJcblx0XHRcdFx0Y29uc3QgZGlzdGFuY2UgPSBpbmRleFRpcC5wb3NpdGlvbi5kaXN0YW5jZVRvKCB0aHVtYlRpcC5wb3NpdGlvbiApO1xyXG5cclxuXHRcdFx0XHRjb25zdCBkaXN0YW5jZVRvUGluY2ggPSAwLjAyO1xyXG5cdFx0XHRcdGNvbnN0IHRocmVzaG9sZCA9IDAuMDA1O1xyXG5cclxuXHRcdFx0XHRpZiAoIGhhbmQuaW5wdXRTdGF0ZS5waW5jaGluZyAmJiBkaXN0YW5jZSA+IGRpc3RhbmNlVG9QaW5jaCArIHRocmVzaG9sZCApIHtcclxuXHJcblx0XHRcdFx0XHRoYW5kLmlucHV0U3RhdGUucGluY2hpbmcgPSBmYWxzZTtcclxuXHRcdFx0XHRcdHRoaXMuZGlzcGF0Y2hFdmVudCgge1xyXG5cdFx0XHRcdFx0XHR0eXBlOiAncGluY2hlbmQnLFxyXG5cdFx0XHRcdFx0XHRoYW5kZWRuZXNzOiBpbnB1dFNvdXJjZS5oYW5kZWRuZXNzLFxyXG5cdFx0XHRcdFx0XHR0YXJnZXQ6IHRoaXNcclxuXHRcdFx0XHRcdH0gKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggISBoYW5kLmlucHV0U3RhdGUucGluY2hpbmcgJiYgZGlzdGFuY2UgPD0gZGlzdGFuY2VUb1BpbmNoIC0gdGhyZXNob2xkICkge1xyXG5cclxuXHRcdFx0XHRcdGhhbmQuaW5wdXRTdGF0ZS5waW5jaGluZyA9IHRydWU7XHJcblx0XHRcdFx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoIHtcclxuXHRcdFx0XHRcdFx0dHlwZTogJ3BpbmNoc3RhcnQnLFxyXG5cdFx0XHRcdFx0XHRoYW5kZWRuZXNzOiBpbnB1dFNvdXJjZS5oYW5kZWRuZXNzLFxyXG5cdFx0XHRcdFx0XHR0YXJnZXQ6IHRoaXNcclxuXHRcdFx0XHRcdH0gKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0aWYgKCBncmlwICE9PSBudWxsICYmIGlucHV0U291cmNlLmdyaXBTcGFjZSApIHtcclxuXHJcblx0XHRcdFx0XHRncmlwUG9zZSA9IGZyYW1lLmdldFBvc2UoIGlucHV0U291cmNlLmdyaXBTcGFjZSwgcmVmZXJlbmNlU3BhY2UgKTtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGdyaXBQb3NlICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Z3JpcC5tYXRyaXguZnJvbUFycmF5KCBncmlwUG9zZS50cmFuc2Zvcm0ubWF0cml4ICk7XHJcblx0XHRcdFx0XHRcdGdyaXAubWF0cml4LmRlY29tcG9zZSggZ3JpcC5wb3NpdGlvbiwgZ3JpcC5yb3RhdGlvbiwgZ3JpcC5zY2FsZSApO1xyXG5cdFx0XHRcdFx0XHRncmlwLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCBncmlwUG9zZS5saW5lYXJWZWxvY2l0eSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0Z3JpcC5oYXNMaW5lYXJWZWxvY2l0eSA9IHRydWU7XHJcblx0XHRcdFx0XHRcdFx0Z3JpcC5saW5lYXJWZWxvY2l0eS5jb3B5KCBncmlwUG9zZS5saW5lYXJWZWxvY2l0eSApO1xyXG5cclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0Z3JpcC5oYXNMaW5lYXJWZWxvY2l0eSA9IGZhbHNlO1xyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCBncmlwUG9zZS5hbmd1bGFyVmVsb2NpdHkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGdyaXAuaGFzQW5ndWxhclZlbG9jaXR5ID0gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0XHRncmlwLmFuZ3VsYXJWZWxvY2l0eS5jb3B5KCBncmlwUG9zZS5hbmd1bGFyVmVsb2NpdHkgKTtcclxuXHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGdyaXAuaGFzQW5ndWxhclZlbG9jaXR5ID0gZmFsc2U7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHRhcmdldFJheSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0aW5wdXRQb3NlID0gZnJhbWUuZ2V0UG9zZSggaW5wdXRTb3VyY2UudGFyZ2V0UmF5U3BhY2UsIHJlZmVyZW5jZVNwYWNlICk7XHJcblxyXG5cdFx0XHRcdC8vIFNvbWUgcnVudGltZXMgKG5hbWVseSBWaXZlIENvc21vcyB3aXRoIFZpdmUgT3BlblhSIFJ1bnRpbWUpIGhhdmUgb25seSBncmlwIHNwYWNlIGFuZCByYXkgc3BhY2UgaXMgZXF1YWwgdG8gaXRcclxuXHRcdFx0XHRpZiAoIGlucHV0UG9zZSA9PT0gbnVsbCAmJiBncmlwUG9zZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHRpbnB1dFBvc2UgPSBncmlwUG9zZTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoIGlucHV0UG9zZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHR0YXJnZXRSYXkubWF0cml4LmZyb21BcnJheSggaW5wdXRQb3NlLnRyYW5zZm9ybS5tYXRyaXggKTtcclxuXHRcdFx0XHRcdHRhcmdldFJheS5tYXRyaXguZGVjb21wb3NlKCB0YXJnZXRSYXkucG9zaXRpb24sIHRhcmdldFJheS5yb3RhdGlvbiwgdGFyZ2V0UmF5LnNjYWxlICk7XHJcblx0XHRcdFx0XHR0YXJnZXRSYXkubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBpbnB1dFBvc2UubGluZWFyVmVsb2NpdHkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHR0YXJnZXRSYXkuaGFzTGluZWFyVmVsb2NpdHkgPSB0cnVlO1xyXG5cdFx0XHRcdFx0XHR0YXJnZXRSYXkubGluZWFyVmVsb2NpdHkuY29weSggaW5wdXRQb3NlLmxpbmVhclZlbG9jaXR5ICk7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdHRhcmdldFJheS5oYXNMaW5lYXJWZWxvY2l0eSA9IGZhbHNlO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRpZiAoIGlucHV0UG9zZS5hbmd1bGFyVmVsb2NpdHkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHR0YXJnZXRSYXkuaGFzQW5ndWxhclZlbG9jaXR5ID0gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0dGFyZ2V0UmF5LmFuZ3VsYXJWZWxvY2l0eS5jb3B5KCBpbnB1dFBvc2UuYW5ndWxhclZlbG9jaXR5ICk7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdHRhcmdldFJheS5oYXNBbmd1bGFyVmVsb2NpdHkgPSBmYWxzZTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCBfbW92ZUV2ZW50ICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGFyZ2V0UmF5ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGFyZ2V0UmF5LnZpc2libGUgPSAoIGlucHV0UG9zZSAhPT0gbnVsbCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGdyaXAgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRncmlwLnZpc2libGUgPSAoIGdyaXBQb3NlICE9PSBudWxsICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggaGFuZCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGhhbmQudmlzaWJsZSA9ICggaGFuZFBvc2UgIT09IG51bGwgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIGdyb3VwIHJlcHJlc2VudGluZyB0aGUgaGFuZCBqb2ludCBmb3IgdGhlIGdpdmVuIGlucHV0IGpvaW50LlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge0dyb3VwfSBoYW5kIC0gVGhlIGdyb3VwIHJlcHJlc2VudGluZyB0aGUgaGFuZCBzcGFjZS5cclxuXHQgKiBAcGFyYW0ge1hSSGFuZEpvaW50fSBpbnB1dGpvaW50IC0gVGhlIFhSIGZyYW1lLlxyXG5cdCAqIEByZXR1cm4ge0dyb3VwfSBBIGdyb3VwIHJlcHJlc2VudGluZyB0aGUgaGFuZCBqb2ludCBmb3IgdGhlIGdpdmVuIGlucHV0IGpvaW50LlxyXG5cdCAqL1xyXG5cdF9nZXRIYW5kSm9pbnQoIGhhbmQsIGlucHV0am9pbnQgKSB7XHJcblxyXG5cdFx0aWYgKCBoYW5kLmpvaW50c1sgaW5wdXRqb2ludC5qb2ludE5hbWUgXSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgam9pbnQgPSBuZXcgR3JvdXAoKTtcclxuXHRcdFx0am9pbnQubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xyXG5cdFx0XHRqb2ludC52aXNpYmxlID0gZmFsc2U7XHJcblx0XHRcdGhhbmQuam9pbnRzWyBpbnB1dGpvaW50LmpvaW50TmFtZSBdID0gam9pbnQ7XHJcblxyXG5cdFx0XHRoYW5kLmFkZCggam9pbnQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGhhbmQuam9pbnRzWyBpbnB1dGpvaW50LmpvaW50TmFtZSBdO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgV2ViWFJDb250cm9sbGVyIH07XHJcbiIsImltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vbWF0aC9Db2xvci5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byBkZWZpbmUgYW4gZXhwb25lbnRpYWwgc3F1YXJlZCBmb2csXHJcbiAqIHdoaWNoIGdpdmVzIGEgY2xlYXIgdmlldyBuZWFyIHRoZSBjYW1lcmEgYW5kIGEgZmFzdGVyIHRoYW4gZXhwb25lbnRpYWxseVxyXG4gKiBkZW5zZW5pbmcgZm9nIGZhcnRoZXIgZnJvbSB0aGUgY2FtZXJhLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBzY2VuZSA9IG5ldyBUSFJFRS5TY2VuZSgpO1xyXG4gKiBzY2VuZS5mb2cgPSBuZXcgVEhSRUUuRm9nRXhwMiggMHhjY2NjY2MsIDAuMDAyICk7XHJcbiAqIGBgYFxyXG4gKi9cclxuY2xhc3MgRm9nRXhwMiB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgZm9nLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ8Q29sb3J9IGNvbG9yIC0gVGhlIGZvZydzIGNvbG9yLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZGVuc2l0eT0wLjAwMDI1XSAtIERlZmluZXMgaG93IGZhc3QgdGhlIGZvZyB3aWxsIGdyb3cgZGVuc2UuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGNvbG9yLCBkZW5zaXR5ID0gMC4wMDAyNSApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNGb2dFeHAyID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBuYW1lIG9mIHRoZSBmb2cuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5uYW1lID0gJyc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZm9nJ3MgY29sb3IuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0NvbG9yfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCBjb2xvciApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogIERlZmluZXMgaG93IGZhc3QgdGhlIGZvZyB3aWxsIGdyb3cgZGVuc2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDAuMDAwMjVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kZW5zaXR5ID0gZGVuc2l0eTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbmV3IGZvZyB3aXRoIGNvcGllZCB2YWx1ZXMgZnJvbSB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Rm9nRXhwMn0gQSBjbG9uZSBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNsb25lKCkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgRm9nRXhwMiggdGhpcy5jb2xvciwgdGhpcy5kZW5zaXR5ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2VyaWFsaXplcyB0aGUgZm9nIGludG8gSlNPTi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7PyhPYmplY3R8c3RyaW5nKX0gbWV0YSAtIEFuIG9wdGlvbmFsIHZhbHVlIGhvbGRpbmcgbWV0YSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VyaWFsaXphdGlvbi5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3R9IEEgSlNPTiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzZXJpYWxpemVkIGZvZ1xyXG5cdCAqL1xyXG5cdHRvSlNPTiggLyogbWV0YSAqLyApIHtcclxuXHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHR0eXBlOiAnRm9nRXhwMicsXHJcblx0XHRcdG5hbWU6IHRoaXMubmFtZSxcclxuXHRcdFx0Y29sb3I6IHRoaXMuY29sb3IuZ2V0SGV4KCksXHJcblx0XHRcdGRlbnNpdHk6IHRoaXMuZGVuc2l0eVxyXG5cdFx0fTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgRm9nRXhwMiB9O1xyXG4iLCJpbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uL21hdGgvQ29sb3IuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIGEgbGluZWFyIGZvZyB0aGF0IGdyb3dzIGxpbmVhcmx5IGRlbnNlclxyXG4gKiB3aXRoIHRoZSBkaXN0YW5jZS5cclxuICpcclxuICogYGBganNcclxuICogY29uc3Qgc2NlbmUgPSBuZXcgVEhSRUUuU2NlbmUoKTtcclxuICogc2NlbmUuZm9nID0gbmV3IFRIUkVFLkZvZyggMHhjY2NjY2MsIDEwLCAxNSApO1xyXG4gKiBgYGBcclxuICovXHJcbmNsYXNzIEZvZyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgZm9nLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ8Q29sb3J9IGNvbG9yIC0gVGhlIGZvZydzIGNvbG9yLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbmVhcj0xXSAtIFRoZSBtaW5pbXVtIGRpc3RhbmNlIHRvIHN0YXJ0IGFwcGx5aW5nIGZvZy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2Zhcj0xMDAwXSAtIFRoZSBtYXhpbXVtIGRpc3RhbmNlIGF0IHdoaWNoIGZvZyBzdG9wcyBiZWluZyBjYWxjdWxhdGVkIGFuZCBhcHBsaWVkLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBjb2xvciwgbmVhciA9IDEsIGZhciA9IDEwMDAgKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzRm9nID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBuYW1lIG9mIHRoZSBmb2cuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5uYW1lID0gJyc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZm9nJ3MgY29sb3IuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0NvbG9yfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCBjb2xvciApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG1pbmltdW0gZGlzdGFuY2UgdG8gc3RhcnQgYXBwbHlpbmcgZm9nLiBPYmplY3RzIHRoYXQgYXJlIGxlc3MgdGhhblxyXG5cdFx0ICogYG5lYXJgIHVuaXRzIGZyb20gdGhlIGFjdGl2ZSBjYW1lcmEgd29uJ3QgYmUgYWZmZWN0ZWQgYnkgZm9nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubmVhciA9IG5lYXI7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbWF4aW11bSBkaXN0YW5jZSBhdCB3aGljaCBmb2cgc3RvcHMgYmVpbmcgY2FsY3VsYXRlZCBhbmQgYXBwbGllZC5cclxuXHRcdCAqIE9iamVjdHMgdGhhdCBhcmUgbW9yZSB0aGFuIGBmYXJgIHVuaXRzIGF3YXkgZnJvbSB0aGUgYWN0aXZlIGNhbWVyYSB3b24ndFxyXG5cdFx0ICogYmUgYWZmZWN0ZWQgYnkgZm9nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxMDAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZmFyID0gZmFyO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBuZXcgZm9nIHdpdGggY29waWVkIHZhbHVlcyBmcm9tIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtGb2d9IEEgY2xvbmUgb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjbG9uZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IEZvZyggdGhpcy5jb2xvciwgdGhpcy5uZWFyLCB0aGlzLmZhciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNlcmlhbGl6ZXMgdGhlIGZvZyBpbnRvIEpTT04uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gez8oT2JqZWN0fHN0cmluZyl9IG1ldGEgLSBBbiBvcHRpb25hbCB2YWx1ZSBob2xkaW5nIG1ldGEgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlcmlhbGl6YXRpb24uXHJcblx0ICogQHJldHVybiB7T2JqZWN0fSBBIEpTT04gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc2VyaWFsaXplZCBmb2dcclxuXHQgKi9cclxuXHR0b0pTT04oIC8qIG1ldGEgKi8gKSB7XHJcblxyXG5cdFx0cmV0dXJuIHtcclxuXHRcdFx0dHlwZTogJ0ZvZycsXHJcblx0XHRcdG5hbWU6IHRoaXMubmFtZSxcclxuXHRcdFx0Y29sb3I6IHRoaXMuY29sb3IuZ2V0SGV4KCksXHJcblx0XHRcdG5lYXI6IHRoaXMubmVhcixcclxuXHRcdFx0ZmFyOiB0aGlzLmZhclxyXG5cdFx0fTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgRm9nIH07XHJcbiIsImltcG9ydCB7IE9iamVjdDNEIH0gZnJvbSAnLi4vY29yZS9PYmplY3QzRC5qcyc7XHJcbmltcG9ydCB7IEV1bGVyIH0gZnJvbSAnLi4vbWF0aC9FdWxlci5qcyc7XHJcblxyXG4vKipcclxuICogU2NlbmVzIGFsbG93IHlvdSB0byBzZXQgdXAgd2hhdCBpcyB0byBiZSByZW5kZXJlZCBhbmQgd2hlcmUgYnkgdGhyZWUuanMuXHJcbiAqIFRoaXMgaXMgd2hlcmUgeW91IHBsYWNlIDNEIG9iamVjdHMgbGlrZSBtZXNoZXMsIGxpbmVzIG9yIGxpZ2h0cy5cclxuICpcclxuICogQGF1Z21lbnRzIE9iamVjdDNEXHJcbiAqL1xyXG5jbGFzcyBTY2VuZSBleHRlbmRzIE9iamVjdDNEIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBzY2VuZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1NjZW5lID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnU2NlbmUnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyB0aGUgYmFja2dyb3VuZCBvZiB0aGUgc2NlbmUuIFZhbGlkIGlucHV0cyBhcmU6XHJcblx0XHQgKlxyXG5cdFx0ICogLSBBIGNvbG9yIGZvciBkZWZpbmluZyBhIHVuaWZvcm0gY29sb3JlZCBiYWNrZ3JvdW5kLlxyXG5cdFx0ICogLSBBIHRleHR1cmUgZm9yIGRlZmluaW5nIGEgKGZsYXQpIHRleHR1cmVkIGJhY2tncm91bmQuXHJcblx0XHQgKiAtIEN1YmUgdGV4dHVyZXMgb3IgZXF1aXJlY3Rhbmd1bGFyIHRleHR1cmVzIGZvciBkZWZpbmluZyBhIHNreWJveC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7PyhDb2xvcnxUZXh0dXJlKX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5iYWNrZ3JvdW5kID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNldHMgdGhlIGVudmlyb25tZW50IG1hcCBmb3IgYWxsIHBoeXNpY2FsIG1hdGVyaWFscyBpbiB0aGUgc2NlbmUuIEhvd2V2ZXIsXHJcblx0XHQgKiBpdCdzIG5vdCBwb3NzaWJsZSB0byBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgdGV4dHVyZSBhc3NpZ25lZCB0byB0aGUgYGVudk1hcGBcclxuXHRcdCAqIG1hdGVyaWFsIHByb3BlcnR5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5lbnZpcm9ubWVudCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGZvZyBpbnN0YW5jZSBkZWZpbmluZyB0aGUgdHlwZSBvZiBmb2cgdGhhdCBhZmZlY3RzIGV2ZXJ5dGhpbmdcclxuXHRcdCAqIHJlbmRlcmVkIGluIHRoZSBzY2VuZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7PyhGb2d8Rm9nRXhwMil9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZm9nID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNldHMgdGhlIGJsdXJyaW5lc3Mgb2YgdGhlIGJhY2tncm91bmQuIE9ubHkgaW5mbHVlbmNlcyBlbnZpcm9ubWVudCBtYXBzXHJcblx0XHQgKiBhc3NpZ25lZCB0byB7QGxpbmsgU2NlbmUjYmFja2dyb3VuZH0uIFZhbGlkIGlucHV0IGlzIGEgZmxvYXQgYmV0d2VlbiBgMGBcclxuXHRcdCAqIGFuZCBgMWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5iYWNrZ3JvdW5kQmx1cnJpbmVzcyA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBdHRlbnVhdGVzIHRoZSBjb2xvciBvZiB0aGUgYmFja2dyb3VuZC4gT25seSBhcHBsaWVzIHRvIGJhY2tncm91bmQgdGV4dHVyZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5iYWNrZ3JvdW5kSW50ZW5zaXR5ID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByb3RhdGlvbiBvZiB0aGUgYmFja2dyb3VuZCBpbiByYWRpYW5zLiBPbmx5IGluZmx1ZW5jZXMgZW52aXJvbm1lbnQgbWFwc1xyXG5cdFx0ICogYXNzaWduZWQgdG8ge0BsaW5rIFNjZW5lI2JhY2tncm91bmR9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtFdWxlcn1cclxuXHRcdCAqIEBkZWZhdWx0ICgwLDAsMClcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5iYWNrZ3JvdW5kUm90YXRpb24gPSBuZXcgRXVsZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEF0dGVudWF0ZXMgdGhlIGNvbG9yIG9mIHRoZSBlbnZpcm9ubWVudC4gT25seSBpbmZsdWVuY2VzIGVudmlyb25tZW50IG1hcHNcclxuXHRcdCAqIGFzc2lnbmVkIHRvIHtAbGluayBTY2VuZSNlbnZpcm9ubWVudH0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5lbnZpcm9ubWVudEludGVuc2l0eSA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcm90YXRpb24gb2YgdGhlIGVudmlyb25tZW50IG1hcCBpbiByYWRpYW5zLiBPbmx5IGluZmx1ZW5jZXMgcGh5c2ljYWwgbWF0ZXJpYWxzXHJcblx0XHQgKiBpbiB0aGUgc2NlbmUgd2hlbiB7QGxpbmsgU2NlbmUjZW52aXJvbm1lbnR9IGlzIHVzZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0V1bGVyfVxyXG5cdFx0ICogQGRlZmF1bHQgKDAsMCwwKVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmVudmlyb25tZW50Um90YXRpb24gPSBuZXcgRXVsZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEZvcmNlcyBldmVyeXRoaW5nIGluIHRoZSBzY2VuZSB0byBiZSByZW5kZXJlZCB3aXRoIHRoZSBkZWZpbmVkIG1hdGVyaWFsLiBJdCBpcyBwb3NzaWJsZVxyXG5cdFx0ICogdG8gZXhjbHVkZSBtYXRlcmlhbHMgZnJvbSBvdmVycmlkZSBieSBzZXR0aW5nIHtAbGluayBNYXRlcmlhbCNhbGxvd092ZXJyaWRlfSB0byBgZmFsc2VgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/TWF0ZXJpYWx9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMub3ZlcnJpZGVNYXRlcmlhbCA9IG51bGw7XHJcblxyXG5cdFx0aWYgKCB0eXBlb2YgX19USFJFRV9ERVZUT09MU19fICE9PSAndW5kZWZpbmVkJyApIHtcclxuXHJcblx0XHRcdF9fVEhSRUVfREVWVE9PTFNfXy5kaXNwYXRjaEV2ZW50KCBuZXcgQ3VzdG9tRXZlbnQoICdvYnNlcnZlJywgeyBkZXRhaWw6IHRoaXMgfSApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSwgcmVjdXJzaXZlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSwgcmVjdXJzaXZlICk7XHJcblxyXG5cdFx0aWYgKCBzb3VyY2UuYmFja2dyb3VuZCAhPT0gbnVsbCApIHRoaXMuYmFja2dyb3VuZCA9IHNvdXJjZS5iYWNrZ3JvdW5kLmNsb25lKCk7XHJcblx0XHRpZiAoIHNvdXJjZS5lbnZpcm9ubWVudCAhPT0gbnVsbCApIHRoaXMuZW52aXJvbm1lbnQgPSBzb3VyY2UuZW52aXJvbm1lbnQuY2xvbmUoKTtcclxuXHRcdGlmICggc291cmNlLmZvZyAhPT0gbnVsbCApIHRoaXMuZm9nID0gc291cmNlLmZvZy5jbG9uZSgpO1xyXG5cclxuXHRcdHRoaXMuYmFja2dyb3VuZEJsdXJyaW5lc3MgPSBzb3VyY2UuYmFja2dyb3VuZEJsdXJyaW5lc3M7XHJcblx0XHR0aGlzLmJhY2tncm91bmRJbnRlbnNpdHkgPSBzb3VyY2UuYmFja2dyb3VuZEludGVuc2l0eTtcclxuXHRcdHRoaXMuYmFja2dyb3VuZFJvdGF0aW9uLmNvcHkoIHNvdXJjZS5iYWNrZ3JvdW5kUm90YXRpb24gKTtcclxuXHJcblx0XHR0aGlzLmVudmlyb25tZW50SW50ZW5zaXR5ID0gc291cmNlLmVudmlyb25tZW50SW50ZW5zaXR5O1xyXG5cdFx0dGhpcy5lbnZpcm9ubWVudFJvdGF0aW9uLmNvcHkoIHNvdXJjZS5lbnZpcm9ubWVudFJvdGF0aW9uICk7XHJcblxyXG5cdFx0aWYgKCBzb3VyY2Uub3ZlcnJpZGVNYXRlcmlhbCAhPT0gbnVsbCApIHRoaXMub3ZlcnJpZGVNYXRlcmlhbCA9IHNvdXJjZS5vdmVycmlkZU1hdGVyaWFsLmNsb25lKCk7XHJcblxyXG5cdFx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gc291cmNlLm1hdHJpeEF1dG9VcGRhdGU7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0dG9KU09OKCBtZXRhICkge1xyXG5cclxuXHRcdGNvbnN0IGRhdGEgPSBzdXBlci50b0pTT04oIG1ldGEgKTtcclxuXHJcblx0XHRpZiAoIHRoaXMuZm9nICE9PSBudWxsICkgZGF0YS5vYmplY3QuZm9nID0gdGhpcy5mb2cudG9KU09OKCk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmJhY2tncm91bmRCbHVycmluZXNzID4gMCApIGRhdGEub2JqZWN0LmJhY2tncm91bmRCbHVycmluZXNzID0gdGhpcy5iYWNrZ3JvdW5kQmx1cnJpbmVzcztcclxuXHRcdGlmICggdGhpcy5iYWNrZ3JvdW5kSW50ZW5zaXR5ICE9PSAxICkgZGF0YS5vYmplY3QuYmFja2dyb3VuZEludGVuc2l0eSA9IHRoaXMuYmFja2dyb3VuZEludGVuc2l0eTtcclxuXHRcdGRhdGEub2JqZWN0LmJhY2tncm91bmRSb3RhdGlvbiA9IHRoaXMuYmFja2dyb3VuZFJvdGF0aW9uLnRvQXJyYXkoKTtcclxuXHJcblx0XHRpZiAoIHRoaXMuZW52aXJvbm1lbnRJbnRlbnNpdHkgIT09IDEgKSBkYXRhLm9iamVjdC5lbnZpcm9ubWVudEludGVuc2l0eSA9IHRoaXMuZW52aXJvbm1lbnRJbnRlbnNpdHk7XHJcblx0XHRkYXRhLm9iamVjdC5lbnZpcm9ubWVudFJvdGF0aW9uID0gdGhpcy5lbnZpcm9ubWVudFJvdGF0aW9uLnRvQXJyYXkoKTtcclxuXHJcblx0XHRyZXR1cm4gZGF0YTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgU2NlbmUgfTtcclxuIiwiaW1wb3J0IHsgZ2VuZXJhdGVVVUlEIH0gZnJvbSAnLi4vbWF0aC9NYXRoVXRpbHMuanMnO1xyXG5pbXBvcnQgeyBTdGF0aWNEcmF3VXNhZ2UgfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xyXG5cclxuLyoqXHJcbiAqIFwiSW50ZXJsZWF2ZWRcIiBtZWFucyB0aGF0IG11bHRpcGxlIGF0dHJpYnV0ZXMsIHBvc3NpYmx5IG9mIGRpZmZlcmVudCB0eXBlcyxcclxuICogKGUuZy4sIHBvc2l0aW9uLCBub3JtYWwsIHV2LCBjb2xvcikgYXJlIHBhY2tlZCBpbnRvIGEgc2luZ2xlIGFycmF5IGJ1ZmZlci5cclxuICpcclxuICogQW4gaW50cm9kdWN0aW9uIGludG8gaW50ZXJsZWF2ZWQgYXJyYXlzIGNhbiBiZSBmb3VuZCBoZXJlOiBbSW50ZXJsZWF2ZWQgYXJyYXkgYmFzaWNzXXtAbGluayBodHRwczovL2Jsb2cudG9qaWNvZGUuY29tLzIwMTEvMDUvaW50ZXJsZWF2ZWQtYXJyYXktYmFzaWNzLmh0bWx9XHJcbiAqL1xyXG5jbGFzcyBJbnRlcmxlYXZlZEJ1ZmZlciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgaW50ZXJsZWF2ZWQgYnVmZmVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUeXBlZEFycmF5fSBhcnJheSAtIEEgdHlwZWQgYXJyYXkgd2l0aCBhIHNoYXJlZCBidWZmZXIgc3RvcmluZyBhdHRyaWJ1dGUgZGF0YS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc3RyaWRlIC0gVGhlIG51bWJlciBvZiB0eXBlZC1hcnJheSBlbGVtZW50cyBwZXIgdmVydGV4LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBhcnJheSwgc3RyaWRlICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0ludGVybGVhdmVkQnVmZmVyID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgdHlwZWQgYXJyYXkgd2l0aCBhIHNoYXJlZCBidWZmZXIgc3RvcmluZyBhdHRyaWJ1dGUgZGF0YS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VHlwZWRBcnJheX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hcnJheSA9IGFycmF5O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG51bWJlciBvZiB0eXBlZC1hcnJheSBlbGVtZW50cyBwZXIgdmVydGV4LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc3RyaWRlID0gc3RyaWRlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHRvdGFsIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgYXJyYXlcclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY291bnQgPSBhcnJheSAhPT0gdW5kZWZpbmVkID8gYXJyYXkubGVuZ3RoIC8gc3RyaWRlIDogMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgdGhlIGludGVuZGVkIHVzYWdlIHBhdHRlcm4gb2YgdGhlIGRhdGEgc3RvcmUgZm9yIG9wdGltaXphdGlvbiBwdXJwb3Nlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBOb3RlOiBBZnRlciB0aGUgaW5pdGlhbCB1c2Ugb2YgYSBidWZmZXIsIGl0cyB1c2FnZSBjYW5ub3QgYmUgY2hhbmdlZC4gSW5zdGVhZCxcclxuXHRcdCAqIGluc3RhbnRpYXRlIGEgbmV3IG9uZSBhbmQgc2V0IHRoZSBkZXNpcmVkIHVzYWdlIGJlZm9yZSB0aGUgbmV4dCByZW5kZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeyhTdGF0aWNEcmF3VXNhZ2V8RHluYW1pY0RyYXdVc2FnZXxTdHJlYW1EcmF3VXNhZ2V8U3RhdGljUmVhZFVzYWdlfER5bmFtaWNSZWFkVXNhZ2V8U3RyZWFtUmVhZFVzYWdlfFN0YXRpY0NvcHlVc2FnZXxEeW5hbWljQ29weVVzYWdlfFN0cmVhbUNvcHlVc2FnZSl9XHJcblx0XHQgKiBAZGVmYXVsdCBTdGF0aWNEcmF3VXNhZ2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51c2FnZSA9IFN0YXRpY0RyYXdVc2FnZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gb25seSB1cGRhdGUgc29tZSBjb21wb25lbnRzIG9mIHN0b3JlZCB2ZWN0b3JzIChmb3IgZXhhbXBsZSwganVzdCB0aGVcclxuXHRcdCAqIGNvbXBvbmVudCByZWxhdGVkIHRvIGNvbG9yKS4gVXNlIHRoZSBgYWRkVXBkYXRlUmFuZ2UoKWAgZnVuY3Rpb24gdG8gYWRkIHJhbmdlcyB0byB0aGlzIGFycmF5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxPYmplY3Q+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVwZGF0ZVJhbmdlcyA9IFtdO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSB2ZXJzaW9uIG51bWJlciwgaW5jcmVtZW50ZWQgZXZlcnkgdGltZSB0aGUgYG5lZWRzVXBkYXRlYCBpcyBzZXQgdG8gYHRydWVgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudmVyc2lvbiA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgVVVJRCBvZiB0aGUgaW50ZXJsZWF2ZWQgYnVmZmVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51dWlkID0gZ2VuZXJhdGVVVUlEKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGV4ZWN1dGVkIGFmdGVyIHRoZSByZW5kZXJlciBoYXMgdHJhbnNmZXJyZWQgdGhlIGF0dHJpYnV0ZSBhcnJheVxyXG5cdCAqIGRhdGEgdG8gdGhlIEdQVS5cclxuXHQgKi9cclxuXHRvblVwbG9hZENhbGxiYWNrKCkge31cclxuXHJcblx0LyoqXHJcblx0ICogRmxhZyB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgYXR0cmlidXRlIGhhcyBjaGFuZ2VkIGFuZCBzaG91bGQgYmUgcmUtc2VudCB0b1xyXG5cdCAqIHRoZSBHUFUuIFNldCB0aGlzIHRvIGB0cnVlYCB3aGVuIHlvdSBtb2RpZnkgdGhlIHZhbHVlIG9mIHRoZSBhcnJheS5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbHVlXHJcblx0ICovXHJcblx0c2V0IG5lZWRzVXBkYXRlKCB2YWx1ZSApIHtcclxuXHJcblx0XHRpZiAoIHZhbHVlID09PSB0cnVlICkgdGhpcy52ZXJzaW9uICsrO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHVzYWdlIG9mIHRoaXMgaW50ZXJsZWF2ZWQgYnVmZmVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHsoU3RhdGljRHJhd1VzYWdlfER5bmFtaWNEcmF3VXNhZ2V8U3RyZWFtRHJhd1VzYWdlfFN0YXRpY1JlYWRVc2FnZXxEeW5hbWljUmVhZFVzYWdlfFN0cmVhbVJlYWRVc2FnZXxTdGF0aWNDb3B5VXNhZ2V8RHluYW1pY0NvcHlVc2FnZXxTdHJlYW1Db3B5VXNhZ2UpfSB2YWx1ZSAtIFRoZSB1c2FnZSB0byBzZXQuXHJcblx0ICogQHJldHVybiB7SW50ZXJsZWF2ZWRCdWZmZXJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW50ZXJsZWF2ZWQgYnVmZmVyLlxyXG5cdCAqL1xyXG5cdHNldFVzYWdlKCB2YWx1ZSApIHtcclxuXHJcblx0XHR0aGlzLnVzYWdlID0gdmFsdWU7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyBhIHJhbmdlIG9mIGRhdGEgaW4gdGhlIGRhdGEgYXJyYXkgdG8gYmUgdXBkYXRlZCBvbiB0aGUgR1BVLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IC0gUG9zaXRpb24gYXQgd2hpY2ggdG8gc3RhcnQgdXBkYXRlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudCAtIFRoZSBudW1iZXIgb2YgY29tcG9uZW50cyB0byB1cGRhdGUuXHJcblx0ICovXHJcblx0YWRkVXBkYXRlUmFuZ2UoIHN0YXJ0LCBjb3VudCApIHtcclxuXHJcblx0XHR0aGlzLnVwZGF0ZVJhbmdlcy5wdXNoKCB7IHN0YXJ0LCBjb3VudCB9ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2xlYXJzIHRoZSB1cGRhdGUgcmFuZ2VzLlxyXG5cdCAqL1xyXG5cdGNsZWFyVXBkYXRlUmFuZ2VzKCkge1xyXG5cclxuXHRcdHRoaXMudXBkYXRlUmFuZ2VzLmxlbmd0aCA9IDA7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29waWVzIHRoZSB2YWx1ZXMgb2YgdGhlIGdpdmVuIGludGVybGVhdmVkIGJ1ZmZlciB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtJbnRlcmxlYXZlZEJ1ZmZlcn0gc291cmNlIC0gVGhlIGludGVybGVhdmVkIGJ1ZmZlciB0byBjb3B5LlxyXG5cdCAqIEByZXR1cm4ge0ludGVybGVhdmVkQnVmZmVyfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHR0aGlzLmFycmF5ID0gbmV3IHNvdXJjZS5hcnJheS5jb25zdHJ1Y3Rvciggc291cmNlLmFycmF5ICk7XHJcblx0XHR0aGlzLmNvdW50ID0gc291cmNlLmNvdW50O1xyXG5cdFx0dGhpcy5zdHJpZGUgPSBzb3VyY2Uuc3RyaWRlO1xyXG5cdFx0dGhpcy51c2FnZSA9IHNvdXJjZS51c2FnZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb3BpZXMgYSB2ZWN0b3IgZnJvbSB0aGUgZ2l2ZW4gaW50ZXJsZWF2ZWQgYnVmZmVyIHRvIHRoaXMgb25lLiBUaGUgc3RhcnRcclxuXHQgKiBhbmQgZGVzdGluYXRpb24gcG9zaXRpb24gaW4gdGhlIGF0dHJpYnV0ZSBidWZmZXJzIGFyZSByZXByZXNlbnRlZCBieSB0aGVcclxuXHQgKiBnaXZlbiBpbmRpY2VzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4MSAtIFRoZSBkZXN0aW5hdGlvbiBpbmRleCBpbnRvIHRoaXMgaW50ZXJsZWF2ZWQgYnVmZmVyLlxyXG5cdCAqIEBwYXJhbSB7SW50ZXJsZWF2ZWRCdWZmZXJ9IGludGVybGVhdmVkQnVmZmVyIC0gVGhlIGludGVybGVhdmVkIGJ1ZmZlciB0byBjb3B5IGZyb20uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4MiAtIFRoZSBzb3VyY2UgaW5kZXggaW50byB0aGUgZ2l2ZW4gaW50ZXJsZWF2ZWQgYnVmZmVyLlxyXG5cdCAqIEByZXR1cm4ge0ludGVybGVhdmVkQnVmZmVyfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNvcHlBdCggaW5kZXgxLCBpbnRlcmxlYXZlZEJ1ZmZlciwgaW5kZXgyICkge1xyXG5cclxuXHRcdGluZGV4MSAqPSB0aGlzLnN0cmlkZTtcclxuXHRcdGluZGV4MiAqPSBpbnRlcmxlYXZlZEJ1ZmZlci5zdHJpZGU7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gdGhpcy5zdHJpZGU7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0dGhpcy5hcnJheVsgaW5kZXgxICsgaSBdID0gaW50ZXJsZWF2ZWRCdWZmZXIuYXJyYXlbIGluZGV4MiArIGkgXTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZ2l2ZW4gYXJyYXkgZGF0YSBpbiB0aGUgaW50ZXJsZWF2ZWQgYnVmZmVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHsoVHlwZWRBcnJheXxBcnJheSl9IHZhbHVlIC0gVGhlIGFycmF5IGRhdGEgdG8gc2V0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0PTBdIC0gVGhlIG9mZnNldCBpbiB0aGlzIGludGVybGVhdmVkIGJ1ZmZlcidzIGFycmF5LlxyXG5cdCAqIEByZXR1cm4ge0ludGVybGVhdmVkQnVmZmVyfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldCggdmFsdWUsIG9mZnNldCA9IDAgKSB7XHJcblxyXG5cdFx0dGhpcy5hcnJheS5zZXQoIHZhbHVlLCBvZmZzZXQgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbmV3IGludGVybGVhdmVkIGJ1ZmZlciB3aXRoIGNvcGllZCB2YWx1ZXMgZnJvbSB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtkYXRhXSAtIEFuIG9iamVjdCB3aXRoIHNoYXJlZCBhcnJheSBidWZmZXJzIHRoYXQgYWxsb3dzIHRvIHJldGFpbiBzaGFyZWQgc3RydWN0dXJlcy5cclxuXHQgKiBAcmV0dXJuIHtJbnRlcmxlYXZlZEJ1ZmZlcn0gQSBjbG9uZSBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNsb25lKCBkYXRhICkge1xyXG5cclxuXHRcdGlmICggZGF0YS5hcnJheUJ1ZmZlcnMgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGRhdGEuYXJyYXlCdWZmZXJzID0ge307XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy5hcnJheS5idWZmZXIuX3V1aWQgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHRoaXMuYXJyYXkuYnVmZmVyLl91dWlkID0gZ2VuZXJhdGVVVUlEKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggZGF0YS5hcnJheUJ1ZmZlcnNbIHRoaXMuYXJyYXkuYnVmZmVyLl91dWlkIF0gPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGRhdGEuYXJyYXlCdWZmZXJzWyB0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZCBdID0gdGhpcy5hcnJheS5zbGljZSggMCApLmJ1ZmZlcjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgYXJyYXkgPSBuZXcgdGhpcy5hcnJheS5jb25zdHJ1Y3RvciggZGF0YS5hcnJheUJ1ZmZlcnNbIHRoaXMuYXJyYXkuYnVmZmVyLl91dWlkIF0gKTtcclxuXHJcblx0XHRjb25zdCBpYiA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKCBhcnJheSwgdGhpcy5zdHJpZGUgKTtcclxuXHRcdGliLnNldFVzYWdlKCB0aGlzLnVzYWdlICk7XHJcblxyXG5cdFx0cmV0dXJuIGliO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGdpdmVuIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgZXhlY3V0ZWQgYWZ0ZXIgdGhlIFJlbmRlcmVyIGhhcyB0cmFuc2ZlcnJlZFxyXG5cdCAqIHRoZSBhcnJheSBkYXRhIHRvIHRoZSBHUFUuIENhbiBiZSB1c2VkIHRvIHBlcmZvcm0gY2xlYW4tdXAgb3BlcmF0aW9ucyBhZnRlclxyXG5cdCAqIHRoZSB1cGxvYWQgd2hlbiBkYXRhIGFyZSBub3QgbmVlZGVkIGFueW1vcmUgb24gdGhlIENQVSBzaWRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgLSBUaGUgYG9uVXBsb2FkKClgIGNhbGxiYWNrLlxyXG5cdCAqIEByZXR1cm4ge0ludGVybGVhdmVkQnVmZmVyfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdG9uVXBsb2FkKCBjYWxsYmFjayApIHtcclxuXHJcblx0XHR0aGlzLm9uVXBsb2FkQ2FsbGJhY2sgPSBjYWxsYmFjaztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXJpYWxpemVzIHRoZSBpbnRlcmxlYXZlZCBidWZmZXIgaW50byBKU09OLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtkYXRhXSAtIEFuIG9wdGlvbmFsIHZhbHVlIGhvbGRpbmcgbWV0YSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VyaWFsaXphdGlvbi5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3R9IEEgSlNPTiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzZXJpYWxpemVkIGludGVybGVhdmVkIGJ1ZmZlci5cclxuXHQgKi9cclxuXHR0b0pTT04oIGRhdGEgKSB7XHJcblxyXG5cdFx0aWYgKCBkYXRhLmFycmF5QnVmZmVycyA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0ZGF0YS5hcnJheUJ1ZmZlcnMgPSB7fTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gZ2VuZXJhdGUgVVVJRCBmb3IgYXJyYXkgYnVmZmVyIGlmIG5lY2Vzc2FyeVxyXG5cclxuXHRcdGlmICggdGhpcy5hcnJheS5idWZmZXIuX3V1aWQgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHRoaXMuYXJyYXkuYnVmZmVyLl91dWlkID0gZ2VuZXJhdGVVVUlEKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggZGF0YS5hcnJheUJ1ZmZlcnNbIHRoaXMuYXJyYXkuYnVmZmVyLl91dWlkIF0gPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGRhdGEuYXJyYXlCdWZmZXJzWyB0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZCBdID0gQXJyYXkuZnJvbSggbmV3IFVpbnQzMkFycmF5KCB0aGlzLmFycmF5LmJ1ZmZlciApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0cmV0dXJuIHtcclxuXHRcdFx0dXVpZDogdGhpcy51dWlkLFxyXG5cdFx0XHRidWZmZXI6IHRoaXMuYXJyYXkuYnVmZmVyLl91dWlkLFxyXG5cdFx0XHR0eXBlOiB0aGlzLmFycmF5LmNvbnN0cnVjdG9yLm5hbWUsXHJcblx0XHRcdHN0cmlkZTogdGhpcy5zdHJpZGVcclxuXHRcdH07XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IEludGVybGVhdmVkQnVmZmVyIH07XHJcbiIsImltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcbmltcG9ydCB7IGRlbm9ybWFsaXplLCBub3JtYWxpemUgfSBmcm9tICcuLi9tYXRoL01hdGhVdGlscy5qcyc7XHJcblxyXG5jb25zdCBfdmVjdG9yID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5cclxuLyoqXHJcbiAqIEFuIGFsdGVybmF0aXZlIHZlcnNpb24gb2YgYSBidWZmZXIgYXR0cmlidXRlIHdpdGggaW50ZXJsZWF2ZWQgZGF0YS4gSW50ZXJsZWF2ZWRcclxuICogYXR0cmlidXRlcyBzaGFyZSBhIGNvbW1vbiBpbnRlcmxlYXZlZCBkYXRhIHN0b3JhZ2UgKHtAbGluayBJbnRlcmxlYXZlZEJ1ZmZlcn0pIGFuZCByZWZlciB3aXRoXHJcbiAqIGRpZmZlcmVudCBvZmZzZXRzIGludG8gdGhlIGJ1ZmZlci5cclxuICovXHJcbmNsYXNzIEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBpbnRlcmxlYXZlZCBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtJbnRlcmxlYXZlZEJ1ZmZlcn0gaW50ZXJsZWF2ZWRCdWZmZXIgLSBUaGUgYnVmZmVyIGhvbGRpbmcgdGhlIGludGVybGVhdmVkIGRhdGEuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGl0ZW1TaXplIC0gVGhlIGl0ZW0gc2l6ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0IC0gVGhlIGF0dHJpYnV0ZSBvZmZzZXQgaW50byB0aGUgYnVmZmVyLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW25vcm1hbGl6ZWQ9ZmFsc2VdIC0gV2hldGhlciB0aGUgZGF0YSBhcmUgbm9ybWFsaXplZCBvciBub3QuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGludGVybGVhdmVkQnVmZmVyLCBpdGVtU2l6ZSwgb2Zmc2V0LCBub3JtYWxpemVkID0gZmFsc2UgKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG5hbWUgb2YgdGhlIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5uYW1lID0gJyc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYnVmZmVyIGhvbGRpbmcgdGhlIGludGVybGVhdmVkIGRhdGEuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0ludGVybGVhdmVkQnVmZmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRhdGEgPSBpbnRlcmxlYXZlZEJ1ZmZlcjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBpdGVtIHNpemUsIHNlZSB7QGxpbmsgQnVmZmVyQXR0cmlidXRlI2l0ZW1TaXplfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLml0ZW1TaXplID0gaXRlbVNpemU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYXR0cmlidXRlIG9mZnNldCBpbnRvIHRoZSBidWZmZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5vZmZzZXQgPSBvZmZzZXQ7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSBkYXRhIGFyZSBub3JtYWxpemVkIG9yIG5vdCwgc2VlIHtAbGluayBCdWZmZXJBdHRyaWJ1dGUjbm9ybWFsaXplZH1cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7SW50ZXJsZWF2ZWRCdWZmZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGl0ZW0gY291bnQgb2YgdGhpcyBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge251bWJlcn1cclxuXHQgKiBAcmVhZG9ubHlcclxuXHQgKi9cclxuXHRnZXQgY291bnQoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5jb3VudDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgYXJyYXkgaG9sZGluZyB0aGUgaW50ZXJsZWF2ZWQgYnVmZmVyIGF0dHJpYnV0ZSBkYXRhLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge1R5cGVkQXJyYXl9XHJcblx0ICovXHJcblx0Z2V0IGFycmF5KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmRhdGEuYXJyYXk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRmxhZyB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgYXR0cmlidXRlIGhhcyBjaGFuZ2VkIGFuZCBzaG91bGQgYmUgcmUtc2VudCB0b1xyXG5cdCAqIHRoZSBHUFUuIFNldCB0aGlzIHRvIGB0cnVlYCB3aGVuIHlvdSBtb2RpZnkgdGhlIHZhbHVlIG9mIHRoZSBhcnJheS5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbHVlXHJcblx0ICovXHJcblx0c2V0IG5lZWRzVXBkYXRlKCB2YWx1ZSApIHtcclxuXHJcblx0XHR0aGlzLmRhdGEubmVlZHNVcGRhdGUgPSB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBcHBsaWVzIHRoZSBnaXZlbiA0eDQgbWF0cml4IHRvIHRoZSBnaXZlbiBhdHRyaWJ1dGUuIE9ubHkgd29ya3Mgd2l0aFxyXG5cdCAqIGl0ZW0gc2l6ZSBgM2AuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDR9IG0gLSBUaGUgbWF0cml4IHRvIGFwcGx5LlxyXG5cdCAqIEByZXR1cm4ge0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGFwcGx5TWF0cml4NCggbSApIHtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSB0aGlzLmRhdGEuY291bnQ7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0X3ZlY3Rvci5mcm9tQnVmZmVyQXR0cmlidXRlKCB0aGlzLCBpICk7XHJcblxyXG5cdFx0XHRfdmVjdG9yLmFwcGx5TWF0cml4NCggbSApO1xyXG5cclxuXHRcdFx0dGhpcy5zZXRYWVooIGksIF92ZWN0b3IueCwgX3ZlY3Rvci55LCBfdmVjdG9yLnogKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQXBwbGllcyB0aGUgZ2l2ZW4gM3gzIG5vcm1hbCBtYXRyaXggdG8gdGhlIGdpdmVuIGF0dHJpYnV0ZS4gT25seSB3b3JrcyB3aXRoXHJcblx0ICogaXRlbSBzaXplIGAzYC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4M30gbSAtIFRoZSBub3JtYWwgbWF0cml4IHRvIGFwcGx5LlxyXG5cdCAqIEByZXR1cm4ge0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGFwcGx5Tm9ybWFsTWF0cml4KCBtICkge1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHRoaXMuY291bnQ7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0X3ZlY3Rvci5mcm9tQnVmZmVyQXR0cmlidXRlKCB0aGlzLCBpICk7XHJcblxyXG5cdFx0XHRfdmVjdG9yLmFwcGx5Tm9ybWFsTWF0cml4KCBtICk7XHJcblxyXG5cdFx0XHR0aGlzLnNldFhZWiggaSwgX3ZlY3Rvci54LCBfdmVjdG9yLnksIF92ZWN0b3IueiApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBcHBsaWVzIHRoZSBnaXZlbiA0eDQgbWF0cml4IHRvIHRoZSBnaXZlbiBhdHRyaWJ1dGUuIE9ubHkgd29ya3Mgd2l0aFxyXG5cdCAqIGl0ZW0gc2l6ZSBgM2AgYW5kIHdpdGggZGlyZWN0aW9uIHZlY3RvcnMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDR9IG0gLSBUaGUgbWF0cml4IHRvIGFwcGx5LlxyXG5cdCAqIEByZXR1cm4ge0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHRyYW5zZm9ybURpcmVjdGlvbiggbSApIHtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSB0aGlzLmNvdW50OyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdF92ZWN0b3IuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggdGhpcywgaSApO1xyXG5cclxuXHRcdFx0X3ZlY3Rvci50cmFuc2Zvcm1EaXJlY3Rpb24oIG0gKTtcclxuXHJcblx0XHRcdHRoaXMuc2V0WFlaKCBpLCBfdmVjdG9yLngsIF92ZWN0b3IueSwgX3ZlY3Rvci56ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGdpdmVuIGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yIGF0IHRoZSBnaXZlbiBpbmRleC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBpbnRvIHRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBjb21wb25lbnQgLSBUaGUgY29tcG9uZW50IGluZGV4LlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIHJldHVybmVkIHZhbHVlLlxyXG5cdCAqL1xyXG5cdGdldENvbXBvbmVudCggaW5kZXgsIGNvbXBvbmVudCApIHtcclxuXHJcblx0XHRsZXQgdmFsdWUgPSB0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIGNvbXBvbmVudCBdO1xyXG5cclxuXHRcdGlmICggdGhpcy5ub3JtYWxpemVkICkgdmFsdWUgPSBkZW5vcm1hbGl6ZSggdmFsdWUsIHRoaXMuYXJyYXkgKTtcclxuXHJcblx0XHRyZXR1cm4gdmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZ2l2ZW4gdmFsdWUgdG8gdGhlIGdpdmVuIGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yIGF0IHRoZSBnaXZlbiBpbmRleC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBpbnRvIHRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBjb21wb25lbnQgLSBUaGUgY29tcG9uZW50IGluZGV4LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBzZXQuXHJcblx0ICogQHJldHVybiB7SW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0Q29tcG9uZW50KCBpbmRleCwgY29tcG9uZW50LCB2YWx1ZSApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMubm9ybWFsaXplZCApIHZhbHVlID0gbm9ybWFsaXplKCB2YWx1ZSwgdGhpcy5hcnJheSApO1xyXG5cclxuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgKyBjb21wb25lbnQgXSA9IHZhbHVlO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHggY29tcG9uZW50IG9mIHRoZSB2ZWN0b3IgYXQgdGhlIGdpdmVuIGluZGV4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluZGV4IGludG8gdGhlIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgdmFsdWUgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldFgoIGluZGV4LCB4ICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5ub3JtYWxpemVkICkgeCA9IG5vcm1hbGl6ZSggeCwgdGhpcy5hcnJheSApO1xyXG5cclxuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgXSA9IHg7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgeSBjb21wb25lbnQgb2YgdGhlIHZlY3RvciBhdCB0aGUgZ2l2ZW4gaW5kZXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggaW50byB0aGUgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB2YWx1ZSB0byBzZXQuXHJcblx0ICogQHJldHVybiB7SW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0WSggaW5kZXgsIHkgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5vcm1hbGl6ZWQgKSB5ID0gbm9ybWFsaXplKCB5LCB0aGlzLmFycmF5ICk7XHJcblxyXG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDEgXSA9IHk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgeiBjb21wb25lbnQgb2YgdGhlIHZlY3RvciBhdCB0aGUgZ2l2ZW4gaW5kZXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggaW50byB0aGUgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geiAtIFRoZSB2YWx1ZSB0byBzZXQuXHJcblx0ICogQHJldHVybiB7SW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0WiggaW5kZXgsIHogKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5vcm1hbGl6ZWQgKSB6ID0gbm9ybWFsaXplKCB6LCB0aGlzLmFycmF5ICk7XHJcblxyXG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDIgXSA9IHo7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdyBjb21wb25lbnQgb2YgdGhlIHZlY3RvciBhdCB0aGUgZ2l2ZW4gaW5kZXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggaW50byB0aGUgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdyAtIFRoZSB2YWx1ZSB0byBzZXQuXHJcblx0ICogQHJldHVybiB7SW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0VyggaW5kZXgsIHcgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5vcm1hbGl6ZWQgKSB3ID0gbm9ybWFsaXplKCB3LCB0aGlzLmFycmF5ICk7XHJcblxyXG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDMgXSA9IHc7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgeCBjb21wb25lbnQgb2YgdGhlIHZlY3RvciBhdCB0aGUgZ2l2ZW4gaW5kZXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggaW50byB0aGUgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB4IGNvbXBvbmVudC5cclxuXHQgKi9cclxuXHRnZXRYKCBpbmRleCApIHtcclxuXHJcblx0XHRsZXQgeCA9IHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgXTtcclxuXHJcblx0XHRpZiAoIHRoaXMubm9ybWFsaXplZCApIHggPSBkZW5vcm1hbGl6ZSggeCwgdGhpcy5hcnJheSApO1xyXG5cclxuXHRcdHJldHVybiB4O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHkgY29tcG9uZW50IG9mIHRoZSB2ZWN0b3IgYXQgdGhlIGdpdmVuIGluZGV4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluZGV4IGludG8gdGhlIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgeSBjb21wb25lbnQuXHJcblx0ICovXHJcblx0Z2V0WSggaW5kZXggKSB7XHJcblxyXG5cdFx0bGV0IHkgPSB0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0ICsgMSBdO1xyXG5cclxuXHRcdGlmICggdGhpcy5ub3JtYWxpemVkICkgeSA9IGRlbm9ybWFsaXplKCB5LCB0aGlzLmFycmF5ICk7XHJcblxyXG5cdFx0cmV0dXJuIHk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgeiBjb21wb25lbnQgb2YgdGhlIHZlY3RvciBhdCB0aGUgZ2l2ZW4gaW5kZXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggaW50byB0aGUgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB6IGNvbXBvbmVudC5cclxuXHQgKi9cclxuXHRnZXRaKCBpbmRleCApIHtcclxuXHJcblx0XHRsZXQgeiA9IHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgKyAyIF07XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5vcm1hbGl6ZWQgKSB6ID0gZGVub3JtYWxpemUoIHosIHRoaXMuYXJyYXkgKTtcclxuXHJcblx0XHRyZXR1cm4gejtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSB3IGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yIGF0IHRoZSBnaXZlbiBpbmRleC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBpbnRvIHRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIHcgY29tcG9uZW50LlxyXG5cdCAqL1xyXG5cdGdldFcoIGluZGV4ICkge1xyXG5cclxuXHRcdGxldCB3ID0gdGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDMgXTtcclxuXHJcblx0XHRpZiAoIHRoaXMubm9ybWFsaXplZCApIHcgPSBkZW5vcm1hbGl6ZSggdywgdGhpcy5hcnJheSApO1xyXG5cclxuXHRcdHJldHVybiB3O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHggYW5kIHkgY29tcG9uZW50IG9mIHRoZSB2ZWN0b3IgYXQgdGhlIGdpdmVuIGluZGV4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluZGV4IGludG8gdGhlIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgdmFsdWUgZm9yIHRoZSB4IGNvbXBvbmVudCB0byBzZXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmFsdWUgZm9yIHRoZSB5IGNvbXBvbmVudCB0byBzZXQuXHJcblx0ICogQHJldHVybiB7SW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0WFkoIGluZGV4LCB4LCB5ICkge1xyXG5cclxuXHRcdGluZGV4ID0gaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQ7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5vcm1hbGl6ZWQgKSB7XHJcblxyXG5cdFx0XHR4ID0gbm9ybWFsaXplKCB4LCB0aGlzLmFycmF5ICk7XHJcblx0XHRcdHkgPSBub3JtYWxpemUoIHksIHRoaXMuYXJyYXkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDAgXSA9IHg7XHJcblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgMSBdID0geTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB4LCB5IGFuZCB6IGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yIGF0IHRoZSBnaXZlbiBpbmRleC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBpbnRvIHRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHZhbHVlIGZvciB0aGUgeCBjb21wb25lbnQgdG8gc2V0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHZhbHVlIGZvciB0aGUgeSBjb21wb25lbnQgdG8gc2V0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB6IC0gVGhlIHZhbHVlIGZvciB0aGUgeiBjb21wb25lbnQgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldFhZWiggaW5kZXgsIHgsIHksIHogKSB7XHJcblxyXG5cdFx0aW5kZXggPSBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldDtcclxuXHJcblx0XHRpZiAoIHRoaXMubm9ybWFsaXplZCApIHtcclxuXHJcblx0XHRcdHggPSBub3JtYWxpemUoIHgsIHRoaXMuYXJyYXkgKTtcclxuXHRcdFx0eSA9IG5vcm1hbGl6ZSggeSwgdGhpcy5hcnJheSApO1xyXG5cdFx0XHR6ID0gbm9ybWFsaXplKCB6LCB0aGlzLmFycmF5ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAwIF0gPSB4O1xyXG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDEgXSA9IHk7XHJcblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgMiBdID0gejtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB4LCB5LCB6IGFuZCB3IGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yIGF0IHRoZSBnaXZlbiBpbmRleC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBpbnRvIHRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHZhbHVlIGZvciB0aGUgeCBjb21wb25lbnQgdG8gc2V0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHZhbHVlIGZvciB0aGUgeSBjb21wb25lbnQgdG8gc2V0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB6IC0gVGhlIHZhbHVlIGZvciB0aGUgeiBjb21wb25lbnQgdG8gc2V0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB3IC0gVGhlIHZhbHVlIGZvciB0aGUgdyBjb21wb25lbnQgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldFhZWlcoIGluZGV4LCB4LCB5LCB6LCB3ICkge1xyXG5cclxuXHRcdGluZGV4ID0gaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQ7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5vcm1hbGl6ZWQgKSB7XHJcblxyXG5cdFx0XHR4ID0gbm9ybWFsaXplKCB4LCB0aGlzLmFycmF5ICk7XHJcblx0XHRcdHkgPSBub3JtYWxpemUoIHksIHRoaXMuYXJyYXkgKTtcclxuXHRcdFx0eiA9IG5vcm1hbGl6ZSggeiwgdGhpcy5hcnJheSApO1xyXG5cdFx0XHR3ID0gbm9ybWFsaXplKCB3LCB0aGlzLmFycmF5ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAwIF0gPSB4O1xyXG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDEgXSA9IHk7XHJcblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgMiBdID0gejtcclxuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAzIF0gPSB3O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBuZXcgYnVmZmVyIGF0dHJpYnV0ZSB3aXRoIGNvcGllZCB2YWx1ZXMgZnJvbSB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogSWYgbm8gcGFyYW1ldGVyIGlzIHByb3ZpZGVkLCBjbG9uaW5nIGFuIGludGVybGVhdmVkIGJ1ZmZlciBhdHRyaWJ1dGUgd2lsbCBkZS1pbnRlcmxlYXZlIGJ1ZmZlciBkYXRhLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtkYXRhXSAtIEFuIG9iamVjdCB3aXRoIGludGVybGVhdmVkIGJ1ZmZlcnMgdGhhdCBhbGxvd3MgdG8gcmV0YWluIHRoZSBpbnRlcmxlYXZlZCBwcm9wZXJ0eS5cclxuXHQgKiBAcmV0dXJuIHtCdWZmZXJBdHRyaWJ1dGV8SW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGV9IEEgY2xvbmUgb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjbG9uZSggZGF0YSApIHtcclxuXHJcblx0XHRpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUubG9nKCAnVEhSRUUuSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUuY2xvbmUoKTogQ2xvbmluZyBhbiBpbnRlcmxlYXZlZCBidWZmZXIgYXR0cmlidXRlIHdpbGwgZGUtaW50ZXJsZWF2ZSBidWZmZXIgZGF0YS4nICk7XHJcblxyXG5cdFx0XHRjb25zdCBhcnJheSA9IFtdO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdGhpcy5jb3VudDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgaW5kZXggPSBpICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0O1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaiA9IDA7IGogPCB0aGlzLml0ZW1TaXplOyBqICsrICkge1xyXG5cclxuXHRcdFx0XHRcdGFycmF5LnB1c2goIHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyBqIF0gKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIG5ldyB0aGlzLmFycmF5LmNvbnN0cnVjdG9yKCBhcnJheSApLCB0aGlzLml0ZW1TaXplLCB0aGlzLm5vcm1hbGl6ZWQgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0aWYgKCBkYXRhLmludGVybGVhdmVkQnVmZmVycyA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRkYXRhLmludGVybGVhdmVkQnVmZmVycyA9IHt9O1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBkYXRhLmludGVybGVhdmVkQnVmZmVyc1sgdGhpcy5kYXRhLnV1aWQgXSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRkYXRhLmludGVybGVhdmVkQnVmZmVyc1sgdGhpcy5kYXRhLnV1aWQgXSA9IHRoaXMuZGF0YS5jbG9uZSggZGF0YSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIG5ldyBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSggZGF0YS5pbnRlcmxlYXZlZEJ1ZmZlcnNbIHRoaXMuZGF0YS51dWlkIF0sIHRoaXMuaXRlbVNpemUsIHRoaXMub2Zmc2V0LCB0aGlzLm5vcm1hbGl6ZWQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2VyaWFsaXplcyB0aGUgYnVmZmVyIGF0dHJpYnV0ZSBpbnRvIEpTT04uXHJcblx0ICpcclxuXHQgKiBJZiBubyBwYXJhbWV0ZXIgaXMgcHJvdmlkZWQsIGNsb25pbmcgYW4gaW50ZXJsZWF2ZWQgYnVmZmVyIGF0dHJpYnV0ZSB3aWxsIGRlLWludGVybGVhdmUgYnVmZmVyIGRhdGEuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW2RhdGFdIC0gQW4gb3B0aW9uYWwgdmFsdWUgaG9sZGluZyBtZXRhIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZXJpYWxpemF0aW9uLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdH0gQSBKU09OIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNlcmlhbGl6ZWQgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKi9cclxuXHR0b0pTT04oIGRhdGEgKSB7XHJcblxyXG5cdFx0aWYgKCBkYXRhID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLmxvZyggJ1RIUkVFLkludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlLnRvSlNPTigpOiBTZXJpYWxpemluZyBhbiBpbnRlcmxlYXZlZCBidWZmZXIgYXR0cmlidXRlIHdpbGwgZGUtaW50ZXJsZWF2ZSBidWZmZXIgZGF0YS4nICk7XHJcblxyXG5cdFx0XHRjb25zdCBhcnJheSA9IFtdO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdGhpcy5jb3VudDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgaW5kZXggPSBpICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0O1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaiA9IDA7IGogPCB0aGlzLml0ZW1TaXplOyBqICsrICkge1xyXG5cclxuXHRcdFx0XHRcdGFycmF5LnB1c2goIHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyBqIF0gKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gZGUtaW50ZXJsZWF2ZSBkYXRhIGFuZCBzYXZlIGl0IGFzIGFuIG9yZGluYXJ5IGJ1ZmZlciBhdHRyaWJ1dGUgZm9yIG5vd1xyXG5cclxuXHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHRpdGVtU2l6ZTogdGhpcy5pdGVtU2l6ZSxcclxuXHRcdFx0XHR0eXBlOiB0aGlzLmFycmF5LmNvbnN0cnVjdG9yLm5hbWUsXHJcblx0XHRcdFx0YXJyYXk6IGFycmF5LFxyXG5cdFx0XHRcdG5vcm1hbGl6ZWQ6IHRoaXMubm9ybWFsaXplZFxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHQvLyBzYXZlIGFzIHRydWUgaW50ZXJsZWF2ZWQgYXR0cmlidXRlXHJcblxyXG5cdFx0XHRpZiAoIGRhdGEuaW50ZXJsZWF2ZWRCdWZmZXJzID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGRhdGEuaW50ZXJsZWF2ZWRCdWZmZXJzID0ge307XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIGRhdGEuaW50ZXJsZWF2ZWRCdWZmZXJzWyB0aGlzLmRhdGEudXVpZCBdID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGRhdGEuaW50ZXJsZWF2ZWRCdWZmZXJzWyB0aGlzLmRhdGEudXVpZCBdID0gdGhpcy5kYXRhLnRvSlNPTiggZGF0YSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHRpc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlOiB0cnVlLFxyXG5cdFx0XHRcdGl0ZW1TaXplOiB0aGlzLml0ZW1TaXplLFxyXG5cdFx0XHRcdGRhdGE6IHRoaXMuZGF0YS51dWlkLFxyXG5cdFx0XHRcdG9mZnNldDogdGhpcy5vZmZzZXQsXHJcblx0XHRcdFx0bm9ybWFsaXplZDogdGhpcy5ub3JtYWxpemVkXHJcblx0XHRcdH07XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgfTtcclxuIiwiaW1wb3J0IHsgTWF0ZXJpYWwgfSBmcm9tICcuL01hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi9tYXRoL0NvbG9yLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIG1hdGVyaWFsIGZvciByZW5kZXJpbmcgaW5zdGFuY2VzIG9mIHtAbGluayBTcHJpdGV9LlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBtYXAgPSBuZXcgVEhSRUUuVGV4dHVyZUxvYWRlcigpLmxvYWQoICd0ZXh0dXJlcy9zcHJpdGUucG5nJyApO1xyXG4gKiBjb25zdCBtYXRlcmlhbCA9IG5ldyBUSFJFRS5TcHJpdGVNYXRlcmlhbCggeyBtYXA6IG1hcCwgY29sb3I6IDB4ZmZmZmZmIH0gKTtcclxuICpcclxuICogY29uc3Qgc3ByaXRlID0gbmV3IFRIUkVFLlNwcml0ZSggbWF0ZXJpYWwgKTtcclxuICogc3ByaXRlLnNjYWxlLnNldCgyMDAsIDIwMCwgMSlcclxuICogc2NlbmUuYWRkKCBzcHJpdGUgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBNYXRlcmlhbFxyXG4gKi9cclxuY2xhc3MgU3ByaXRlTWF0ZXJpYWwgZXh0ZW5kcyBNYXRlcmlhbCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc3ByaXRlIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbWV0ZXJzXSAtIEFuIG9iamVjdCB3aXRoIG9uZSBvciBtb3JlIHByb3BlcnRpZXNcclxuXHQgKiBkZWZpbmluZyB0aGUgbWF0ZXJpYWwncyBhcHBlYXJhbmNlLiBBbnkgcHJvcGVydHkgb2YgdGhlIG1hdGVyaWFsXHJcblx0ICogKGluY2x1ZGluZyBhbnkgcHJvcGVydHkgZnJvbSBpbmhlcml0ZWQgbWF0ZXJpYWxzKSBjYW4gYmUgcGFzc2VkXHJcblx0ICogaW4gaGVyZS4gQ29sb3IgdmFsdWVzIGNhbiBiZSBwYXNzZWQgYW55IHR5cGUgb2YgdmFsdWUgYWNjZXB0ZWRcclxuXHQgKiBieSB7QGxpbmsgQ29sb3Ijc2V0fS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVycyApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1Nwcml0ZU1hdGVyaWFsID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnU3ByaXRlTWF0ZXJpYWwnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQ29sb3Igb2YgdGhlIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtDb2xvcn1cclxuXHRcdCAqIEBkZWZhdWx0ICgxLDEsMSlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjb2xvciBtYXAuIE1heSBvcHRpb25hbGx5IGluY2x1ZGUgYW4gYWxwaGEgY2hhbm5lbCwgdHlwaWNhbGx5IGNvbWJpbmVkXHJcblx0XHQgKiB3aXRoIHtAbGluayBNYXRlcmlhbCN0cmFuc3BhcmVudH0gb3Ige0BsaW5rIE1hdGVyaWFsI2FscGhhVGVzdH0uIFRoZSB0ZXh0dXJlIG1hcFxyXG5cdFx0ICogY29sb3IgaXMgbW9kdWxhdGVkIGJ5IHRoZSBkaWZmdXNlIGBjb2xvcmAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYWxwaGEgbWFwIGlzIGEgZ3JheXNjYWxlIHRleHR1cmUgdGhhdCBjb250cm9scyB0aGUgb3BhY2l0eSBhY3Jvc3MgdGhlXHJcblx0XHQgKiBzdXJmYWNlIChibGFjazogZnVsbHkgdHJhbnNwYXJlbnQ7IHdoaXRlOiBmdWxseSBvcGFxdWUpLlxyXG5cdFx0ICpcclxuXHRcdCAqIE9ubHkgdGhlIGNvbG9yIG9mIHRoZSB0ZXh0dXJlIGlzIHVzZWQsIGlnbm9yaW5nIHRoZSBhbHBoYSBjaGFubmVsIGlmIG9uZVxyXG5cdFx0ICogZXhpc3RzLiBGb3IgUkdCIGFuZCBSR0JBIHRleHR1cmVzLCB0aGUgcmVuZGVyZXIgd2lsbCB1c2UgdGhlIGdyZWVuIGNoYW5uZWxcclxuXHRcdCAqIHdoZW4gc2FtcGxpbmcgdGhpcyB0ZXh0dXJlIGR1ZSB0byB0aGUgZXh0cmEgYml0IG9mIHByZWNpc2lvbiBwcm92aWRlZCBmb3JcclxuXHRcdCAqIGdyZWVuIGluIERYVC1jb21wcmVzc2VkIGFuZCB1bmNvbXByZXNzZWQgUkdCIDU2NSBmb3JtYXRzLiBMdW1pbmFuY2Utb25seSBhbmRcclxuXHRcdCAqIGx1bWluYW5jZS9hbHBoYSB0ZXh0dXJlcyB3aWxsIGFsc28gc3RpbGwgd29yayBhcyBleHBlY3RlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYWxwaGFNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJvdGF0aW9uIG9mIHRoZSBzcHJpdGUgaW4gcmFkaWFucy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJvdGF0aW9uID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNwZWNpZmllcyB3aGV0aGVyIHNpemUgb2YgdGhlIHNwcml0ZSBpcyBhdHRlbnVhdGVkIGJ5IHRoZSBjYW1lcmEgZGVwdGggKHBlcnNwZWN0aXZlIGNhbWVyYSBvbmx5KS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zaXplQXR0ZW51YXRpb24gPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogT3ZlcndyaXR0ZW4gc2luY2Ugc3ByaXRlIG1hdGVyaWFscyBhcmUgdHJhbnNwYXJlbnRcclxuXHRcdCAqIGJ5IGRlZmF1bHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudHJhbnNwYXJlbnQgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgbWF0ZXJpYWwgaXMgYWZmZWN0ZWQgYnkgZm9nIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5mb2cgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XHJcblxyXG5cdFx0dGhpcy5tYXAgPSBzb3VyY2UubWFwO1xyXG5cclxuXHRcdHRoaXMuYWxwaGFNYXAgPSBzb3VyY2UuYWxwaGFNYXA7XHJcblxyXG5cdFx0dGhpcy5yb3RhdGlvbiA9IHNvdXJjZS5yb3RhdGlvbjtcclxuXHJcblx0XHR0aGlzLnNpemVBdHRlbnVhdGlvbiA9IHNvdXJjZS5zaXplQXR0ZW51YXRpb247XHJcblxyXG5cdFx0dGhpcy5mb2cgPSBzb3VyY2UuZm9nO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBTcHJpdGVNYXRlcmlhbCB9O1xyXG4iLCJpbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IyLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcbmltcG9ydCB7IE1hdHJpeDQgfSBmcm9tICcuLi9tYXRoL01hdHJpeDQuanMnO1xyXG5pbXBvcnQgeyBUcmlhbmdsZSB9IGZyb20gJy4uL21hdGgvVHJpYW5nbGUuanMnO1xyXG5pbXBvcnQgeyBPYmplY3QzRCB9IGZyb20gJy4uL2NvcmUvT2JqZWN0M0QuanMnO1xyXG5pbXBvcnQgeyBCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyR2VvbWV0cnkuanMnO1xyXG5pbXBvcnQgeyBJbnRlcmxlYXZlZEJ1ZmZlciB9IGZyb20gJy4uL2NvcmUvSW50ZXJsZWF2ZWRCdWZmZXIuanMnO1xyXG5pbXBvcnQgeyBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5pbXBvcnQgeyBTcHJpdGVNYXRlcmlhbCB9IGZyb20gJy4uL21hdGVyaWFscy9TcHJpdGVNYXRlcmlhbC5qcyc7XHJcblxyXG5sZXQgX2dlb21ldHJ5O1xyXG5cclxuY29uc3QgX2ludGVyc2VjdFBvaW50ID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfd29ybGRTY2FsZSA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX212UG9zaXRpb24gPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcblxyXG5jb25zdCBfYWxpZ25lZFBvc2l0aW9uID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMigpO1xyXG5jb25zdCBfcm90YXRlZFBvc2l0aW9uID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMigpO1xyXG5jb25zdCBfdmlld1dvcmxkTWF0cml4ID0gLypAX19QVVJFX18qLyBuZXcgTWF0cml4NCgpO1xyXG5cclxuY29uc3QgX3ZBID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfdkIgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF92QyA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuXHJcbmNvbnN0IF91dkEgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IyKCk7XHJcbmNvbnN0IF91dkIgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IyKCk7XHJcbmNvbnN0IF91dkMgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IyKCk7XHJcblxyXG4vKipcclxuICogQSBzcHJpdGUgaXMgYSBwbGFuZSB0aGF0IGFsd2F5cyBmYWNlcyB0b3dhcmRzIHRoZSBjYW1lcmEsIGdlbmVyYWxseSB3aXRoIGFcclxuICogcGFydGlhbGx5IHRyYW5zcGFyZW50IHRleHR1cmUgYXBwbGllZC5cclxuICpcclxuICogU3ByaXRlcyBkbyBub3QgY2FzdCBzaGFkb3dzLCBzZXR0aW5nIHtAbGluayBPYmplY3QzRCNjYXN0U2hhZG93fSB0byBgdHJ1ZWAgd2lsbFxyXG4gKiBoYXZlIG5vIGVmZmVjdC5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgbWFwID0gbmV3IFRIUkVFLlRleHR1cmVMb2FkZXIoKS5sb2FkKCAnc3ByaXRlLnBuZycgKTtcclxuICogY29uc3QgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuU3ByaXRlTWF0ZXJpYWwoIHsgbWFwOiBtYXAgfSApO1xyXG4gKlxyXG4gKiBjb25zdCBzcHJpdGUgPSBuZXcgVEhSRUUuU3ByaXRlKCBtYXRlcmlhbCApO1xyXG4gKiBzY2VuZS5hZGQoIHNwcml0ZSApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIE9iamVjdDNEXHJcbiAqL1xyXG5jbGFzcyBTcHJpdGUgZXh0ZW5kcyBPYmplY3QzRCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc3ByaXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTcHJpdGVNYXRlcmlhbH0gW21hdGVyaWFsXSAtIFRoZSBzcHJpdGUgbWF0ZXJpYWwuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG1hdGVyaWFsID0gbmV3IFNwcml0ZU1hdGVyaWFsKCkgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNTcHJpdGUgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdTcHJpdGUnO1xyXG5cclxuXHRcdGlmICggX2dlb21ldHJ5ID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRfZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcclxuXHJcblx0XHRcdGNvbnN0IGZsb2F0MzJBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoIFtcclxuXHRcdFx0XHQtIDAuNSwgLSAwLjUsIDAsIDAsIDAsXHJcblx0XHRcdFx0MC41LCAtIDAuNSwgMCwgMSwgMCxcclxuXHRcdFx0XHQwLjUsIDAuNSwgMCwgMSwgMSxcclxuXHRcdFx0XHQtIDAuNSwgMC41LCAwLCAwLCAxXHJcblx0XHRcdF0gKTtcclxuXHJcblx0XHRcdGNvbnN0IGludGVybGVhdmVkQnVmZmVyID0gbmV3IEludGVybGVhdmVkQnVmZmVyKCBmbG9hdDMyQXJyYXksIDUgKTtcclxuXHJcblx0XHRcdF9nZW9tZXRyeS5zZXRJbmRleCggWyAwLCAxLCAyLFx0MCwgMiwgMyBdICk7XHJcblx0XHRcdF9nZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSggaW50ZXJsZWF2ZWRCdWZmZXIsIDMsIDAsIGZhbHNlICkgKTtcclxuXHRcdFx0X2dlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ3V2JywgbmV3IEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKCBpbnRlcmxlYXZlZEJ1ZmZlciwgMiwgMywgZmFsc2UgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBzcHJpdGUgZ2VvbWV0cnkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0J1ZmZlckdlb21ldHJ5fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdlb21ldHJ5ID0gX2dlb21ldHJ5O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHNwcml0ZSBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7U3ByaXRlTWF0ZXJpYWx9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWF0ZXJpYWwgPSBtYXRlcmlhbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBzcHJpdGUncyBhbmNob3IgcG9pbnQsIGFuZCB0aGUgcG9pbnQgYXJvdW5kIHdoaWNoIHRoZSBzcHJpdGUgcm90YXRlcy5cclxuXHRcdCAqIEEgdmFsdWUgb2YgYCgwLjUsIDAuNSlgIGNvcnJlc3BvbmRzIHRvIHRoZSBtaWRwb2ludCBvZiB0aGUgc3ByaXRlLiBBIHZhbHVlXHJcblx0XHQgKiBvZiBgKDAsIDApYCBjb3JyZXNwb25kcyB0byB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHNwcml0ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yMn1cclxuXHRcdCAqIEBkZWZhdWx0ICgwLjUsMC41KVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNlbnRlciA9IG5ldyBWZWN0b3IyKCAwLjUsIDAuNSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIGludGVyc2VjdGlvbiBwb2ludHMgYmV0d2VlbiBhIGNhc3RlZCByYXkgYW5kIHRoaXMgc3ByaXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSYXljYXN0ZXJ9IHJheWNhc3RlciAtIFRoZSByYXljYXN0ZXIuXHJcblx0ICogQHBhcmFtIHtBcnJheTxPYmplY3Q+fSBpbnRlcnNlY3RzIC0gVGhlIHRhcmdldCBhcnJheSB0aGF0IGhvbGRzIHRoZSBpbnRlcnNlY3Rpb24gcG9pbnRzLlxyXG5cdCAqL1xyXG5cdHJheWNhc3QoIHJheWNhc3RlciwgaW50ZXJzZWN0cyApIHtcclxuXHJcblx0XHRpZiAoIHJheWNhc3Rlci5jYW1lcmEgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuU3ByaXRlOiBcIlJheWNhc3Rlci5jYW1lcmFcIiBuZWVkcyB0byBiZSBzZXQgaW4gb3JkZXIgdG8gcmF5Y2FzdCBhZ2FpbnN0IHNwcml0ZXMuJyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRfd29ybGRTY2FsZS5zZXRGcm9tTWF0cml4U2NhbGUoIHRoaXMubWF0cml4V29ybGQgKTtcclxuXHJcblx0XHRfdmlld1dvcmxkTWF0cml4LmNvcHkoIHJheWNhc3Rlci5jYW1lcmEubWF0cml4V29ybGQgKTtcclxuXHRcdHRoaXMubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIHJheWNhc3Rlci5jYW1lcmEubWF0cml4V29ybGRJbnZlcnNlLCB0aGlzLm1hdHJpeFdvcmxkICk7XHJcblxyXG5cdFx0X212UG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLm1vZGVsVmlld01hdHJpeCApO1xyXG5cclxuXHRcdGlmICggcmF5Y2FzdGVyLmNhbWVyYS5pc1BlcnNwZWN0aXZlQ2FtZXJhICYmIHRoaXMubWF0ZXJpYWwuc2l6ZUF0dGVudWF0aW9uID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdF93b3JsZFNjYWxlLm11bHRpcGx5U2NhbGFyKCAtIF9tdlBvc2l0aW9uLnogKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3Qgcm90YXRpb24gPSB0aGlzLm1hdGVyaWFsLnJvdGF0aW9uO1xyXG5cdFx0bGV0IHNpbiwgY29zO1xyXG5cclxuXHRcdGlmICggcm90YXRpb24gIT09IDAgKSB7XHJcblxyXG5cdFx0XHRjb3MgPSBNYXRoLmNvcyggcm90YXRpb24gKTtcclxuXHRcdFx0c2luID0gTWF0aC5zaW4oIHJvdGF0aW9uICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGNlbnRlciA9IHRoaXMuY2VudGVyO1xyXG5cclxuXHRcdHRyYW5zZm9ybVZlcnRleCggX3ZBLnNldCggLSAwLjUsIC0gMC41LCAwICksIF9tdlBvc2l0aW9uLCBjZW50ZXIsIF93b3JsZFNjYWxlLCBzaW4sIGNvcyApO1xyXG5cdFx0dHJhbnNmb3JtVmVydGV4KCBfdkIuc2V0KCAwLjUsIC0gMC41LCAwICksIF9tdlBvc2l0aW9uLCBjZW50ZXIsIF93b3JsZFNjYWxlLCBzaW4sIGNvcyApO1xyXG5cdFx0dHJhbnNmb3JtVmVydGV4KCBfdkMuc2V0KCAwLjUsIDAuNSwgMCApLCBfbXZQb3NpdGlvbiwgY2VudGVyLCBfd29ybGRTY2FsZSwgc2luLCBjb3MgKTtcclxuXHJcblx0XHRfdXZBLnNldCggMCwgMCApO1xyXG5cdFx0X3V2Qi5zZXQoIDEsIDAgKTtcclxuXHRcdF91dkMuc2V0KCAxLCAxICk7XHJcblxyXG5cdFx0Ly8gY2hlY2sgZmlyc3QgdHJpYW5nbGVcclxuXHRcdGxldCBpbnRlcnNlY3QgPSByYXljYXN0ZXIucmF5LmludGVyc2VjdFRyaWFuZ2xlKCBfdkEsIF92QiwgX3ZDLCBmYWxzZSwgX2ludGVyc2VjdFBvaW50ICk7XHJcblxyXG5cdFx0aWYgKCBpbnRlcnNlY3QgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHQvLyBjaGVjayBzZWNvbmQgdHJpYW5nbGVcclxuXHRcdFx0dHJhbnNmb3JtVmVydGV4KCBfdkIuc2V0KCAtIDAuNSwgMC41LCAwICksIF9tdlBvc2l0aW9uLCBjZW50ZXIsIF93b3JsZFNjYWxlLCBzaW4sIGNvcyApO1xyXG5cdFx0XHRfdXZCLnNldCggMCwgMSApO1xyXG5cclxuXHRcdFx0aW50ZXJzZWN0ID0gcmF5Y2FzdGVyLnJheS5pbnRlcnNlY3RUcmlhbmdsZSggX3ZBLCBfdkMsIF92QiwgZmFsc2UsIF9pbnRlcnNlY3RQb2ludCApO1xyXG5cdFx0XHRpZiAoIGludGVyc2VjdCA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBkaXN0YW5jZSA9IHJheWNhc3Rlci5yYXkub3JpZ2luLmRpc3RhbmNlVG8oIF9pbnRlcnNlY3RQb2ludCApO1xyXG5cclxuXHRcdGlmICggZGlzdGFuY2UgPCByYXljYXN0ZXIubmVhciB8fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSByZXR1cm47XHJcblxyXG5cdFx0aW50ZXJzZWN0cy5wdXNoKCB7XHJcblxyXG5cdFx0XHRkaXN0YW5jZTogZGlzdGFuY2UsXHJcblx0XHRcdHBvaW50OiBfaW50ZXJzZWN0UG9pbnQuY2xvbmUoKSxcclxuXHRcdFx0dXY6IFRyaWFuZ2xlLmdldEludGVycG9sYXRpb24oIF9pbnRlcnNlY3RQb2ludCwgX3ZBLCBfdkIsIF92QywgX3V2QSwgX3V2QiwgX3V2QywgbmV3IFZlY3RvcjIoKSApLFxyXG5cdFx0XHRmYWNlOiBudWxsLFxyXG5cdFx0XHRvYmplY3Q6IHRoaXNcclxuXHJcblx0XHR9ICk7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlLCByZWN1cnNpdmUgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlLCByZWN1cnNpdmUgKTtcclxuXHJcblx0XHRpZiAoIHNvdXJjZS5jZW50ZXIgIT09IHVuZGVmaW5lZCApIHRoaXMuY2VudGVyLmNvcHkoIHNvdXJjZS5jZW50ZXIgKTtcclxuXHJcblx0XHR0aGlzLm1hdGVyaWFsID0gc291cmNlLm1hdGVyaWFsO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiB0cmFuc2Zvcm1WZXJ0ZXgoIHZlcnRleFBvc2l0aW9uLCBtdlBvc2l0aW9uLCBjZW50ZXIsIHNjYWxlLCBzaW4sIGNvcyApIHtcclxuXHJcblx0Ly8gY29tcHV0ZSBwb3NpdGlvbiBpbiBjYW1lcmEgc3BhY2VcclxuXHRfYWxpZ25lZFBvc2l0aW9uLnN1YlZlY3RvcnMoIHZlcnRleFBvc2l0aW9uLCBjZW50ZXIgKS5hZGRTY2FsYXIoIDAuNSApLm11bHRpcGx5KCBzY2FsZSApO1xyXG5cclxuXHQvLyB0byBjaGVjayBpZiByb3RhdGlvbiBpcyBub3QgemVyb1xyXG5cdGlmICggc2luICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0X3JvdGF0ZWRQb3NpdGlvbi54ID0gKCBjb3MgKiBfYWxpZ25lZFBvc2l0aW9uLnggKSAtICggc2luICogX2FsaWduZWRQb3NpdGlvbi55ICk7XHJcblx0XHRfcm90YXRlZFBvc2l0aW9uLnkgPSAoIHNpbiAqIF9hbGlnbmVkUG9zaXRpb24ueCApICsgKCBjb3MgKiBfYWxpZ25lZFBvc2l0aW9uLnkgKTtcclxuXHJcblx0fSBlbHNlIHtcclxuXHJcblx0XHRfcm90YXRlZFBvc2l0aW9uLmNvcHkoIF9hbGlnbmVkUG9zaXRpb24gKTtcclxuXHJcblx0fVxyXG5cclxuXHJcblx0dmVydGV4UG9zaXRpb24uY29weSggbXZQb3NpdGlvbiApO1xyXG5cdHZlcnRleFBvc2l0aW9uLnggKz0gX3JvdGF0ZWRQb3NpdGlvbi54O1xyXG5cdHZlcnRleFBvc2l0aW9uLnkgKz0gX3JvdGF0ZWRQb3NpdGlvbi55O1xyXG5cclxuXHQvLyB0cmFuc2Zvcm0gdG8gd29ybGQgc3BhY2VcclxuXHR2ZXJ0ZXhQb3NpdGlvbi5hcHBseU1hdHJpeDQoIF92aWV3V29ybGRNYXRyaXggKTtcclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFNwcml0ZSB9O1xyXG4iLCJpbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuaW1wb3J0IHsgT2JqZWN0M0QgfSBmcm9tICcuLi9jb3JlL09iamVjdDNELmpzJztcclxuXHJcbmNvbnN0IF92MSA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX3YyID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5cclxuLyoqXHJcbiAqIEEgY29tcG9uZW50IGZvciBwcm92aWRpbmcgYSBiYXNpYyBMZXZlbCBvZiBEZXRhaWwgKExPRCkgbWVjaGFuaXNtLlxyXG4gKlxyXG4gKiBFdmVyeSBMT0QgbGV2ZWwgaXMgYXNzb2NpYXRlZCB3aXRoIGFuIG9iamVjdCwgYW5kIHJlbmRlcmluZyBjYW4gYmUgc3dpdGNoZWRcclxuICogYmV0d2VlbiB0aGVtIGF0IHRoZSBkaXN0YW5jZXMgc3BlY2lmaWVkLiBUeXBpY2FsbHkgeW91IHdvdWxkIGNyZWF0ZSwgc2F5LFxyXG4gKiB0aHJlZSBtZXNoZXMsIG9uZSBmb3IgZmFyIGF3YXkgKGxvdyBkZXRhaWwpLCBvbmUgZm9yIG1pZCByYW5nZSAobWVkaXVtXHJcbiAqIGRldGFpbCkgYW5kIG9uZSBmb3IgY2xvc2UgdXAgKGhpZ2ggZGV0YWlsKS5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgbG9kID0gbmV3IFRIUkVFLkxPRCgpO1xyXG4gKiBjb25zdCBtYXRlcmlhbCA9IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogMHhmZmZmMDAgfSApO1xyXG4gKlxyXG4gKiAvL0NyZWF0ZSBzcGhlcmVzIHdpdGggMyBsZXZlbHMgb2YgZGV0YWlsIGFuZCBjcmVhdGUgbmV3IExPRCBsZXZlbHMgZm9yIHRoZW1cclxuICogZm9yKCBsZXQgaSA9IDA7IGkgPCAzOyBpKysgKSB7XHJcbiAqXHJcbiAqIFx0Y29uc3QgZ2VvbWV0cnkgPSBuZXcgVEhSRUUuSWNvc2FoZWRyb25HZW9tZXRyeSggMTAsIDMgLSBpICk7XHJcbiAqIFx0Y29uc3QgbWVzaCA9IG5ldyBUSFJFRS5NZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuICogXHRsb2QuYWRkTGV2ZWwoIG1lc2gsIGkgKiA3NSApO1xyXG4gKlxyXG4gKiB9XHJcbiAqXHJcbiAqIHNjZW5lLmFkZCggbG9kICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgT2JqZWN0M0RcclxuICovXHJcbmNsYXNzIExPRCBleHRlbmRzIE9iamVjdDNEIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBMT0QuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNMT0QgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGN1cnJlbnQgTE9EIGluZGV4LlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9jdXJyZW50TGV2ZWwgPSAwO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdMT0QnO1xyXG5cclxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCB0aGlzLCB7XHJcblx0XHRcdC8qKlxyXG5cdFx0XHQgKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBMT0QgbGV2ZWxzLlxyXG5cdFx0XHQgKlxyXG5cdFx0XHQgKiBAbmFtZSBMT0QjbGV2ZWxzXHJcblx0XHRcdCAqIEB0eXBlIHtBcnJheTx7b2JqZWN0Ok9iamVjdDNELGRpc3RhbmNlOm51bWJlcixoeXN0ZXJlc2lzOm51bWJlcn0+fVxyXG5cdFx0XHQgKi9cclxuXHRcdFx0bGV2ZWxzOiB7XHJcblx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcclxuXHRcdFx0XHR2YWx1ZTogW11cclxuXHRcdFx0fVxyXG5cdFx0fSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgTE9EIG9iamVjdCBpcyB1cGRhdGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIHJlbmRlcmVyIHBlciBmcmFtZVxyXG5cdFx0ICogb3Igbm90LiBJZiBzZXQgdG8gYGZhbHNlYCwgeW91IGhhdmUgdG8gY2FsbCB7QGxpbmsgTE9EI3VwZGF0ZX0gaW4gdGhlXHJcblx0XHQgKiByZW5kZXIgbG9vcCBieSB5b3Vyc2VsZi5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hdXRvVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlLCBmYWxzZSApO1xyXG5cclxuXHRcdGNvbnN0IGxldmVscyA9IHNvdXJjZS5sZXZlbHM7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gbGV2ZWxzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBsZXZlbCA9IGxldmVsc1sgaSBdO1xyXG5cclxuXHRcdFx0dGhpcy5hZGRMZXZlbCggbGV2ZWwub2JqZWN0LmNsb25lKCksIGxldmVsLmRpc3RhbmNlLCBsZXZlbC5oeXN0ZXJlc2lzICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuYXV0b1VwZGF0ZSA9IHNvdXJjZS5hdXRvVXBkYXRlO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgYSBtZXNoIHRoYXQgd2lsbCBkaXNwbGF5IGF0IGEgY2VydGFpbiBkaXN0YW5jZSBhbmQgZ3JlYXRlci4gVHlwaWNhbGx5XHJcblx0ICogdGhlIGZ1cnRoZXIgYXdheSB0aGUgZGlzdGFuY2UsIHRoZSBsb3dlciB0aGUgZGV0YWlsIG9uIHRoZSBtZXNoLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3QzRH0gb2JqZWN0IC0gVGhlIDNEIG9iamVjdCB0byBkaXNwbGF5IGF0IHRoaXMgbGV2ZWwuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtkaXN0YW5jZT0wXSAtIFRoZSBkaXN0YW5jZSBhdCB3aGljaCB0byBkaXNwbGF5IHRoaXMgbGV2ZWwgb2YgZGV0YWlsLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbaHlzdGVyZXNpcz0wXSAtIFRocmVzaG9sZCB1c2VkIHRvIGF2b2lkIGZsaWNrZXJpbmcgYXQgTE9EIGJvdW5kYXJpZXMsIGFzIGEgZnJhY3Rpb24gb2YgZGlzdGFuY2UuXHJcblx0ICogQHJldHVybiB7TE9EfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGFkZExldmVsKCBvYmplY3QsIGRpc3RhbmNlID0gMCwgaHlzdGVyZXNpcyA9IDAgKSB7XHJcblxyXG5cdFx0ZGlzdGFuY2UgPSBNYXRoLmFicyggZGlzdGFuY2UgKTtcclxuXHJcblx0XHRjb25zdCBsZXZlbHMgPSB0aGlzLmxldmVscztcclxuXHJcblx0XHRsZXQgbDtcclxuXHJcblx0XHRmb3IgKCBsID0gMDsgbCA8IGxldmVscy5sZW5ndGg7IGwgKysgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGRpc3RhbmNlIDwgbGV2ZWxzWyBsIF0uZGlzdGFuY2UgKSB7XHJcblxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRsZXZlbHMuc3BsaWNlKCBsLCAwLCB7IGRpc3RhbmNlOiBkaXN0YW5jZSwgaHlzdGVyZXNpczogaHlzdGVyZXNpcywgb2JqZWN0OiBvYmplY3QgfSApO1xyXG5cclxuXHRcdHRoaXMuYWRkKCBvYmplY3QgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW1vdmVzIGFuIGV4aXN0aW5nIGxldmVsLCBiYXNlZCBvbiB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgY2FtZXJhLlxyXG5cdCAqIFJldHVybnMgYHRydWVgIHdoZW4gdGhlIGxldmVsIGhhcyBiZWVuIHJlbW92ZWQuIE90aGVyd2lzZSBgZmFsc2VgLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGRpc3RhbmNlIC0gRGlzdGFuY2Ugb2YgdGhlIGxldmVsIHRvIHJlbW92ZS5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBsZXZlbCBoYXMgYmVlbiByZW1vdmVkIG9yIG5vdC5cclxuXHQgKi9cclxuXHRyZW1vdmVMZXZlbCggZGlzdGFuY2UgKSB7XHJcblxyXG5cdFx0Y29uc3QgbGV2ZWxzID0gdGhpcy5sZXZlbHM7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgbGV2ZWxzLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdGlmICggbGV2ZWxzWyBpIF0uZGlzdGFuY2UgPT09IGRpc3RhbmNlICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCByZW1vdmVkRWxlbWVudHMgPSBsZXZlbHMuc3BsaWNlKCBpLCAxICk7XHJcblx0XHRcdFx0dGhpcy5yZW1vdmUoIHJlbW92ZWRFbGVtZW50c1sgMCBdLm9iamVjdCApO1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGZhbHNlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGN1cnJlbnRseSBhY3RpdmUgTE9EIGxldmVsIGluZGV4LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgY3VycmVudCBhY3RpdmUgTE9EIGxldmVsIGluZGV4LlxyXG5cdCAqL1xyXG5cdGdldEN1cnJlbnRMZXZlbCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fY3VycmVudExldmVsO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGZpcnN0IDNEIG9iamVjdCB0aGF0IGlzIGdyZWF0ZXIgdGhhblxyXG5cdCAqIHRoZSBnaXZlbiBkaXN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBkaXN0YW5jZSAtIFRoZSBMT0QgZGlzdGFuY2UuXHJcblx0ICogQHJldHVybiB7T2JqZWN0M0R8bnVsbH0gVGhlIGZvdW5kIDNEIG9iamVjdC4gYG51bGxgIGlmIG5vIDNEIG9iamVjdCBoYXMgYmVlbiBmb3VuZC5cclxuXHQgKi9cclxuXHRnZXRPYmplY3RGb3JEaXN0YW5jZSggZGlzdGFuY2UgKSB7XHJcblxyXG5cdFx0Y29uc3QgbGV2ZWxzID0gdGhpcy5sZXZlbHM7XHJcblxyXG5cdFx0aWYgKCBsZXZlbHMubGVuZ3RoID4gMCApIHtcclxuXHJcblx0XHRcdGxldCBpLCBsO1xyXG5cclxuXHRcdFx0Zm9yICggaSA9IDEsIGwgPSBsZXZlbHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0bGV0IGxldmVsRGlzdGFuY2UgPSBsZXZlbHNbIGkgXS5kaXN0YW5jZTtcclxuXHJcblx0XHRcdFx0aWYgKCBsZXZlbHNbIGkgXS5vYmplY3QudmlzaWJsZSApIHtcclxuXHJcblx0XHRcdFx0XHRsZXZlbERpc3RhbmNlIC09IGxldmVsRGlzdGFuY2UgKiBsZXZlbHNbIGkgXS5oeXN0ZXJlc2lzO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICggZGlzdGFuY2UgPCBsZXZlbERpc3RhbmNlICkge1xyXG5cclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gbGV2ZWxzWyBpIC0gMSBdLm9iamVjdDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgaW50ZXJzZWN0aW9uIHBvaW50cyBiZXR3ZWVuIGEgY2FzdGVkIHJheSBhbmQgdGhpcyBMT0QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JheWNhc3Rlcn0gcmF5Y2FzdGVyIC0gVGhlIHJheWNhc3Rlci5cclxuXHQgKiBAcGFyYW0ge0FycmF5PE9iamVjdD59IGludGVyc2VjdHMgLSBUaGUgdGFyZ2V0IGFycmF5IHRoYXQgaG9sZHMgdGhlIGludGVyc2VjdGlvbiBwb2ludHMuXHJcblx0ICovXHJcblx0cmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICkge1xyXG5cclxuXHRcdGNvbnN0IGxldmVscyA9IHRoaXMubGV2ZWxzO1xyXG5cclxuXHRcdGlmICggbGV2ZWxzLmxlbmd0aCA+IDAgKSB7XHJcblxyXG5cdFx0XHRfdjEuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLm1hdHJpeFdvcmxkICk7XHJcblxyXG5cdFx0XHRjb25zdCBkaXN0YW5jZSA9IHJheWNhc3Rlci5yYXkub3JpZ2luLmRpc3RhbmNlVG8oIF92MSApO1xyXG5cclxuXHRcdFx0dGhpcy5nZXRPYmplY3RGb3JEaXN0YW5jZSggZGlzdGFuY2UgKS5yYXljYXN0KCByYXljYXN0ZXIsIGludGVyc2VjdHMgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgTE9EIGJ5IGNvbXB1dGluZyB3aGljaCBMT0QgbGV2ZWwgc2hvdWxkIGJlIHZpc2libGUgYWNjb3JkaW5nXHJcblx0ICogdG8gdGhlIGN1cnJlbnQgZGlzdGFuY2Ugb2YgdGhlIGdpdmVuIGNhbWVyYS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Q2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIHRoZSBzY2VuZSBpcyByZW5kZXJlZCB3aXRoLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZSggY2FtZXJhICkge1xyXG5cclxuXHRcdGNvbnN0IGxldmVscyA9IHRoaXMubGV2ZWxzO1xyXG5cclxuXHRcdGlmICggbGV2ZWxzLmxlbmd0aCA+IDEgKSB7XHJcblxyXG5cdFx0XHRfdjEuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBjYW1lcmEubWF0cml4V29ybGQgKTtcclxuXHRcdFx0X3YyLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5tYXRyaXhXb3JsZCApO1xyXG5cclxuXHRcdFx0Y29uc3QgZGlzdGFuY2UgPSBfdjEuZGlzdGFuY2VUbyggX3YyICkgLyBjYW1lcmEuem9vbTtcclxuXHJcblx0XHRcdGxldmVsc1sgMCBdLm9iamVjdC52aXNpYmxlID0gdHJ1ZTtcclxuXHJcblx0XHRcdGxldCBpLCBsO1xyXG5cclxuXHRcdFx0Zm9yICggaSA9IDEsIGwgPSBsZXZlbHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0bGV0IGxldmVsRGlzdGFuY2UgPSBsZXZlbHNbIGkgXS5kaXN0YW5jZTtcclxuXHJcblx0XHRcdFx0aWYgKCBsZXZlbHNbIGkgXS5vYmplY3QudmlzaWJsZSApIHtcclxuXHJcblx0XHRcdFx0XHRsZXZlbERpc3RhbmNlIC09IGxldmVsRGlzdGFuY2UgKiBsZXZlbHNbIGkgXS5oeXN0ZXJlc2lzO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICggZGlzdGFuY2UgPj0gbGV2ZWxEaXN0YW5jZSApIHtcclxuXHJcblx0XHRcdFx0XHRsZXZlbHNbIGkgLSAxIF0ub2JqZWN0LnZpc2libGUgPSBmYWxzZTtcclxuXHRcdFx0XHRcdGxldmVsc1sgaSBdLm9iamVjdC52aXNpYmxlID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5fY3VycmVudExldmVsID0gaSAtIDE7XHJcblxyXG5cdFx0XHRmb3IgKCA7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRsZXZlbHNbIGkgXS5vYmplY3QudmlzaWJsZSA9IGZhbHNlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHR0b0pTT04oIG1ldGEgKSB7XHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IHN1cGVyLnRvSlNPTiggbWV0YSApO1xyXG5cclxuXHRcdGlmICggdGhpcy5hdXRvVXBkYXRlID09PSBmYWxzZSApIGRhdGEub2JqZWN0LmF1dG9VcGRhdGUgPSBmYWxzZTtcclxuXHJcblx0XHRkYXRhLm9iamVjdC5sZXZlbHMgPSBbXTtcclxuXHJcblx0XHRjb25zdCBsZXZlbHMgPSB0aGlzLmxldmVscztcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBsZXZlbHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGxldmVsID0gbGV2ZWxzWyBpIF07XHJcblxyXG5cdFx0XHRkYXRhLm9iamVjdC5sZXZlbHMucHVzaCgge1xyXG5cdFx0XHRcdG9iamVjdDogbGV2ZWwub2JqZWN0LnV1aWQsXHJcblx0XHRcdFx0ZGlzdGFuY2U6IGxldmVsLmRpc3RhbmNlLFxyXG5cdFx0XHRcdGh5c3RlcmVzaXM6IGxldmVsLmh5c3RlcmVzaXNcclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZGF0YTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCB7IExPRCB9O1xyXG4iLCJpbXBvcnQgeyBNZXNoIH0gZnJvbSAnLi9NZXNoLmpzJztcclxuaW1wb3J0IHsgQm94MyB9IGZyb20gJy4uL21hdGgvQm94My5qcyc7XHJcbmltcG9ydCB7IE1hdHJpeDQgfSBmcm9tICcuLi9tYXRoL01hdHJpeDQuanMnO1xyXG5pbXBvcnQgeyBTcGhlcmUgfSBmcm9tICcuLi9tYXRoL1NwaGVyZS5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3I0IH0gZnJvbSAnLi4vbWF0aC9WZWN0b3I0LmpzJztcclxuaW1wb3J0IHsgUmF5IH0gZnJvbSAnLi4vbWF0aC9SYXkuanMnO1xyXG5pbXBvcnQgeyBBdHRhY2hlZEJpbmRNb2RlLCBEZXRhY2hlZEJpbmRNb2RlIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcclxuXHJcbmNvbnN0IF9iYXNlUG9zaXRpb24gPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcblxyXG5jb25zdCBfc2tpbkluZGV4ID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yNCgpO1xyXG5jb25zdCBfc2tpbldlaWdodCA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjQoKTtcclxuXHJcbmNvbnN0IF92ZWN0b3IzID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfbWF0cml4NCA9IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDQoKTtcclxuY29uc3QgX3ZlcnRleCA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuXHJcbmNvbnN0IF9zcGhlcmUgPSAvKkBfX1BVUkVfXyovIG5ldyBTcGhlcmUoKTtcclxuY29uc3QgX2ludmVyc2VNYXRyaXggPSAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXg0KCk7XHJcbmNvbnN0IF9yYXkgPSAvKkBfX1BVUkVfXyovIG5ldyBSYXkoKTtcclxuXHJcbi8qKlxyXG4gKiBBIG1lc2ggdGhhdCBoYXMgYSB7QGxpbmsgU2tlbGV0b259IHRoYXQgY2FuIHRoZW4gYmUgdXNlZCB0byBhbmltYXRlIHRoZVxyXG4gKiB2ZXJ0aWNlcyBvZiB0aGUgZ2VvbWV0cnkgd2l0aCBza2lubmluZy9za2VsZXRvbiBhbmltYXRpb24uXHJcbiAqXHJcbiAqIE5leHQgdG8gYSB2YWxpZCBza2VsZXRvbiwgdGhlIHNraW5uZWQgbWVzaCByZXF1aXJlcyBza2luIGluZGljZXMgYW5kIHdlaWdodHNcclxuICogYXMgYnVmZmVyIGF0dHJpYnV0ZXMgaW4gaXRzIGdlb21ldHJ5LiBUaGVzZSBhdHRyaWJ1dGUgZGVmaW5lIHdoaWNoIGJvbmVzIGFmZmVjdCBhIHNpbmdsZVxyXG4gKiB2ZXJ0ZXggdG8gYSBjZXJ0YWluIGV4dGVuZC5cclxuICpcclxuICogVHlwaWNhbGx5IHNraW5uZWQgbWVzaGVzIGFyZSBub3QgY3JlYXRlZCBtYW51YWxseSBidXQgbG9hZGVycyBsaWtlIHtAbGluayBHTFRGTG9hZGVyfVxyXG4gKiBvciB7QGxpbmsgRkJYTG9hZGVyIH0gaW1wb3J0IHJlc3BlY3RpdmUgbW9kZWxzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTWVzaFxyXG4gKi9cclxuY2xhc3MgU2tpbm5lZE1lc2ggZXh0ZW5kcyBNZXNoIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBza2lubmVkIG1lc2guXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0J1ZmZlckdlb21ldHJ5fSBbZ2VvbWV0cnldIC0gVGhlIG1lc2ggZ2VvbWV0cnkuXHJcblx0ICogQHBhcmFtIHtNYXRlcmlhbHxBcnJheTxNYXRlcmlhbD59IFttYXRlcmlhbF0gLSBUaGUgbWVzaCBtYXRlcmlhbC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggZ2VvbWV0cnksIG1hdGVyaWFsICkge1xyXG5cclxuXHRcdHN1cGVyKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNTa2lubmVkTWVzaCA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ1NraW5uZWRNZXNoJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIGBBdHRhY2hlZEJpbmRNb2RlYCBtZWFucyB0aGUgc2tpbm5lZCBtZXNoIHNoYXJlcyB0aGUgc2FtZSB3b3JsZCBzcGFjZSBhcyB0aGUgc2tlbGV0b24uXHJcblx0XHQgKiBUaGlzIGlzIG5vdCB0cnVlIHdoZW4gdXNpbmcgYERldGFjaGVkQmluZE1vZGVgIHdoaWNoIGlzIHVzZWZ1bCB3aGVuIHNoYXJpbmcgYSBza2VsZXRvblxyXG5cdFx0ICogYWNyb3NzIG11bHRpcGxlIHNraW5uZWQgbWVzaGVzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoQXR0YWNoZWRCaW5kTW9kZXxEZXRhY2hlZEJpbmRNb2RlKX1cclxuXHRcdCAqIEBkZWZhdWx0IEF0dGFjaGVkQmluZE1vZGVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5iaW5kTW9kZSA9IEF0dGFjaGVkQmluZE1vZGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYmFzZSBtYXRyaXggdGhhdCBpcyB1c2VkIGZvciB0aGUgYm91bmQgYm9uZSB0cmFuc2Zvcm1zLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtNYXRyaXg0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJpbmRNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGJhc2UgbWF0cml4IHRoYXQgaXMgdXNlZCBmb3IgcmVzZXR0aW5nIHRoZSBib3VuZCBib25lIHRyYW5zZm9ybXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge01hdHJpeDR9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYmluZE1hdHJpeEludmVyc2UgPSBuZXcgTWF0cml4NCgpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgc2tpbm5lZCBtZXNoLiBDYW4gYmUgY29tcHV0ZWQgdmlhIHtAbGluayBTa2lubmVkTWVzaCNjb21wdXRlQm91bmRpbmdCb3h9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Qm94M31cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ib3VuZGluZ0JveCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYm91bmRpbmcgc3BoZXJlIG9mIHRoZSBza2lubmVkIG1lc2guIENhbiBiZSBjb21wdXRlZCB2aWEge0BsaW5rIFNraW5uZWRNZXNoI2NvbXB1dGVCb3VuZGluZ1NwaGVyZX0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9TcGhlcmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBudWxsO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSBib3VuZGluZyBib3ggb2YgdGhlIHNraW5uZWQgbWVzaCwgYW5kIHVwZGF0ZXMge0BsaW5rIFNraW5uZWRNZXNoI2JvdW5kaW5nQm94fS5cclxuXHQgKiBUaGUgYm91bmRpbmcgYm94IGlzIG5vdCBhdXRvbWF0aWNhbGx5IGNvbXB1dGVkIGJ5IHRoZSBlbmdpbmU7IHRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGJ5IHlvdXIgYXBwLlxyXG5cdCAqIElmIHRoZSBza2lubmVkIG1lc2ggaXMgYW5pbWF0ZWQsIHRoZSBib3VuZGluZyBib3ggc2hvdWxkIGJlIHJlY29tcHV0ZWQgcGVyIGZyYW1lIGluIG9yZGVyIHRvIHJlZmxlY3RcclxuXHQgKiB0aGUgY3VycmVudCBhbmltYXRpb24gc3RhdGUuXHJcblx0ICovXHJcblx0Y29tcHV0ZUJvdW5kaW5nQm94KCkge1xyXG5cclxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcclxuXHJcblx0XHRpZiAoIHRoaXMuYm91bmRpbmdCb3ggPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmJvdW5kaW5nQm94ID0gbmV3IEJveDMoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5ib3VuZGluZ0JveC5tYWtlRW1wdHkoKTtcclxuXHJcblx0XHRjb25zdCBwb3NpdGlvbkF0dHJpYnV0ZSA9IGdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJyApO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHBvc2l0aW9uQXR0cmlidXRlLmNvdW50OyBpICsrICkge1xyXG5cclxuXHRcdFx0dGhpcy5nZXRWZXJ0ZXhQb3NpdGlvbiggaSwgX3ZlcnRleCApO1xyXG5cdFx0XHR0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoIF92ZXJ0ZXggKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgdGhlIGJvdW5kaW5nIHNwaGVyZSBvZiB0aGUgc2tpbm5lZCBtZXNoLCBhbmQgdXBkYXRlcyB7QGxpbmsgU2tpbm5lZE1lc2gjYm91bmRpbmdTcGhlcmV9LlxyXG5cdCAqIFRoZSBib3VuZGluZyBzcGhlcmUgaXMgYXV0b21hdGljYWxseSBjb21wdXRlZCBieSB0aGUgZW5naW5lIG9uY2Ugd2hlbiBpdCBpcyBuZWVkZWQsIGUuZy4sIGZvciByYXkgY2FzdGluZ1xyXG5cdCAqIGFuZCB2aWV3IGZydXN0dW0gY3VsbGluZy4gSWYgdGhlIHNraW5uZWQgbWVzaCBpcyBhbmltYXRlZCwgdGhlIGJvdW5kaW5nIHNwaGVyZSBzaG91bGQgYmUgcmVjb21wdXRlZFxyXG5cdCAqIHBlciBmcmFtZSBpbiBvcmRlciB0byByZWZsZWN0IHRoZSBjdXJyZW50IGFuaW1hdGlvbiBzdGF0ZS5cclxuXHQgKi9cclxuXHRjb21wdXRlQm91bmRpbmdTcGhlcmUoKSB7XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xyXG5cclxuXHRcdGlmICggdGhpcy5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBuZXcgU3BoZXJlKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuYm91bmRpbmdTcGhlcmUubWFrZUVtcHR5KCk7XHJcblxyXG5cdFx0Y29uc3QgcG9zaXRpb25BdHRyaWJ1dGUgPSBnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbkF0dHJpYnV0ZS5jb3VudDsgaSArKyApIHtcclxuXHJcblx0XHRcdHRoaXMuZ2V0VmVydGV4UG9zaXRpb24oIGksIF92ZXJ0ZXggKTtcclxuXHRcdFx0dGhpcy5ib3VuZGluZ1NwaGVyZS5leHBhbmRCeVBvaW50KCBfdmVydGV4ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSwgcmVjdXJzaXZlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSwgcmVjdXJzaXZlICk7XHJcblxyXG5cdFx0dGhpcy5iaW5kTW9kZSA9IHNvdXJjZS5iaW5kTW9kZTtcclxuXHRcdHRoaXMuYmluZE1hdHJpeC5jb3B5KCBzb3VyY2UuYmluZE1hdHJpeCApO1xyXG5cdFx0dGhpcy5iaW5kTWF0cml4SW52ZXJzZS5jb3B5KCBzb3VyY2UuYmluZE1hdHJpeEludmVyc2UgKTtcclxuXHJcblx0XHR0aGlzLnNrZWxldG9uID0gc291cmNlLnNrZWxldG9uO1xyXG5cclxuXHRcdGlmICggc291cmNlLmJvdW5kaW5nQm94ICE9PSBudWxsICkgdGhpcy5ib3VuZGluZ0JveCA9IHNvdXJjZS5ib3VuZGluZ0JveC5jbG9uZSgpO1xyXG5cdFx0aWYgKCBzb3VyY2UuYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB0aGlzLmJvdW5kaW5nU3BoZXJlID0gc291cmNlLmJvdW5kaW5nU3BoZXJlLmNsb25lKCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0cmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICkge1xyXG5cclxuXHRcdGNvbnN0IG1hdGVyaWFsID0gdGhpcy5tYXRlcmlhbDtcclxuXHRcdGNvbnN0IG1hdHJpeFdvcmxkID0gdGhpcy5tYXRyaXhXb3JsZDtcclxuXHJcblx0XHRpZiAoIG1hdGVyaWFsID09PSB1bmRlZmluZWQgKSByZXR1cm47XHJcblxyXG5cdFx0Ly8gdGVzdCB3aXRoIGJvdW5kaW5nIHNwaGVyZSBpbiB3b3JsZCBzcGFjZVxyXG5cclxuXHRcdGlmICggdGhpcy5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCApIHRoaXMuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XHJcblxyXG5cdFx0X3NwaGVyZS5jb3B5KCB0aGlzLmJvdW5kaW5nU3BoZXJlICk7XHJcblx0XHRfc3BoZXJlLmFwcGx5TWF0cml4NCggbWF0cml4V29ybGQgKTtcclxuXHJcblx0XHRpZiAoIHJheWNhc3Rlci5yYXkuaW50ZXJzZWN0c1NwaGVyZSggX3NwaGVyZSApID09PSBmYWxzZSApIHJldHVybjtcclxuXHJcblx0XHQvLyBjb252ZXJ0IHJheSB0byBsb2NhbCBzcGFjZSBvZiBza2lubmVkIG1lc2hcclxuXHJcblx0XHRfaW52ZXJzZU1hdHJpeC5jb3B5KCBtYXRyaXhXb3JsZCApLmludmVydCgpO1xyXG5cdFx0X3JheS5jb3B5KCByYXljYXN0ZXIucmF5ICkuYXBwbHlNYXRyaXg0KCBfaW52ZXJzZU1hdHJpeCApO1xyXG5cclxuXHRcdC8vIHRlc3Qgd2l0aCBib3VuZGluZyBib3ggaW4gbG9jYWwgc3BhY2VcclxuXHJcblx0XHRpZiAoIHRoaXMuYm91bmRpbmdCb3ggIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRpZiAoIF9yYXkuaW50ZXJzZWN0c0JveCggdGhpcy5ib3VuZGluZ0JveCApID09PSBmYWxzZSApIHJldHVybjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gdGVzdCBmb3IgaW50ZXJzZWN0aW9ucyB3aXRoIGdlb21ldHJ5XHJcblxyXG5cdFx0dGhpcy5fY29tcHV0ZUludGVyc2VjdGlvbnMoIHJheWNhc3RlciwgaW50ZXJzZWN0cywgX3JheSApO1xyXG5cclxuXHR9XHJcblxyXG5cdGdldFZlcnRleFBvc2l0aW9uKCBpbmRleCwgdGFyZ2V0ICkge1xyXG5cclxuXHRcdHN1cGVyLmdldFZlcnRleFBvc2l0aW9uKCBpbmRleCwgdGFyZ2V0ICk7XHJcblxyXG5cdFx0dGhpcy5hcHBseUJvbmVUcmFuc2Zvcm0oIGluZGV4LCB0YXJnZXQgKTtcclxuXHJcblx0XHRyZXR1cm4gdGFyZ2V0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEJpbmRzIHRoZSBnaXZlbiBza2VsZXRvbiB0byB0aGUgc2tpbm5lZCBtZXNoLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTa2VsZXRvbn0gc2tlbGV0b24gLSBUaGUgc2tlbGV0b24gdG8gYmluZC5cclxuXHQgKiBAcGFyYW0ge01hdHJpeDR9IFtiaW5kTWF0cml4XSAtIFRoZSBiaW5kIG1hdHJpeC4gSWYgbm8gYmluZCBtYXRyaXggaXMgcHJvdmlkZWQsXHJcblx0ICogdGhlIHNraW5uZWQgbWVzaCdzIHdvcmxkIG1hdHJpeCB3aWxsIGJlIHVzZWQgaW5zdGVhZC5cclxuXHQgKi9cclxuXHRiaW5kKCBza2VsZXRvbiwgYmluZE1hdHJpeCApIHtcclxuXHJcblx0XHR0aGlzLnNrZWxldG9uID0gc2tlbGV0b247XHJcblxyXG5cdFx0aWYgKCBiaW5kTWF0cml4ID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCB0cnVlICk7XHJcblxyXG5cdFx0XHR0aGlzLnNrZWxldG9uLmNhbGN1bGF0ZUludmVyc2VzKCk7XHJcblxyXG5cdFx0XHRiaW5kTWF0cml4ID0gdGhpcy5tYXRyaXhXb3JsZDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5iaW5kTWF0cml4LmNvcHkoIGJpbmRNYXRyaXggKTtcclxuXHRcdHRoaXMuYmluZE1hdHJpeEludmVyc2UuY29weSggYmluZE1hdHJpeCApLmludmVydCgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIHNldHMgdGhlIHNraW5uZWQgbWVzaCBpbiB0aGUgcmVzdCBwb3NlKS5cclxuXHQgKi9cclxuXHRwb3NlKCkge1xyXG5cclxuXHRcdHRoaXMuc2tlbGV0b24ucG9zZSgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE5vcm1hbGl6ZXMgdGhlIHNraW4gd2VpZ2h0cyB3aGljaCBhcmUgZGVmaW5lZCBhcyBhIGJ1ZmZlciBhdHRyaWJ1dGVcclxuXHQgKiBpbiB0aGUgc2tpbm5lZCBtZXNoJ3MgZ2VvbWV0cnkuXHJcblx0ICovXHJcblx0bm9ybWFsaXplU2tpbldlaWdodHMoKSB7XHJcblxyXG5cdFx0Y29uc3QgdmVjdG9yID0gbmV3IFZlY3RvcjQoKTtcclxuXHJcblx0XHRjb25zdCBza2luV2VpZ2h0ID0gdGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnNraW5XZWlnaHQ7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gc2tpbldlaWdodC5jb3VudDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHR2ZWN0b3IuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggc2tpbldlaWdodCwgaSApO1xyXG5cclxuXHRcdFx0Y29uc3Qgc2NhbGUgPSAxLjAgLyB2ZWN0b3IubWFuaGF0dGFuTGVuZ3RoKCk7XHJcblxyXG5cdFx0XHRpZiAoIHNjYWxlICE9PSBJbmZpbml0eSApIHtcclxuXHJcblx0XHRcdFx0dmVjdG9yLm11bHRpcGx5U2NhbGFyKCBzY2FsZSApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0dmVjdG9yLnNldCggMSwgMCwgMCwgMCApOyAvLyBkbyBzb21ldGhpbmcgcmVhc29uYWJsZVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0c2tpbldlaWdodC5zZXRYWVpXKCBpLCB2ZWN0b3IueCwgdmVjdG9yLnksIHZlY3Rvci56LCB2ZWN0b3IudyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHR1cGRhdGVNYXRyaXhXb3JsZCggZm9yY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIudXBkYXRlTWF0cml4V29ybGQoIGZvcmNlICk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmJpbmRNb2RlID09PSBBdHRhY2hlZEJpbmRNb2RlICkge1xyXG5cclxuXHRcdFx0dGhpcy5iaW5kTWF0cml4SW52ZXJzZS5jb3B5KCB0aGlzLm1hdHJpeFdvcmxkICkuaW52ZXJ0KCk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggdGhpcy5iaW5kTW9kZSA9PT0gRGV0YWNoZWRCaW5kTW9kZSApIHtcclxuXHJcblx0XHRcdHRoaXMuYmluZE1hdHJpeEludmVyc2UuY29weSggdGhpcy5iaW5kTWF0cml4ICkuaW52ZXJ0KCk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlNraW5uZWRNZXNoOiBVbnJlY29nbml6ZWQgYmluZE1vZGU6ICcgKyB0aGlzLmJpbmRNb2RlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFwcGxpZXMgdGhlIGJvbmUgdHJhbnNmb3JtIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gaW5kZXggdG8gdGhlIGdpdmVuXHJcblx0ICogdmVydGV4IHBvc2l0aW9uLiBSZXR1cm5zIHRoZSB1cGRhdGVkIHZlY3Rvci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSB2ZXJ0ZXggaW5kZXguXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IG9iamVjdCB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGhvZCdzIHJlc3VsdC5cclxuXHQgKiB0aGUgc2tpbm5lZCBtZXNoJ3Mgd29ybGQgbWF0cml4IHdpbGwgYmUgdXNlZCBpbnN0ZWFkLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IFRoZSB1cGRhdGVkIHZlcnRleCBwb3NpdGlvbi5cclxuXHQgKi9cclxuXHRhcHBseUJvbmVUcmFuc2Zvcm0oIGluZGV4LCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0Y29uc3Qgc2tlbGV0b24gPSB0aGlzLnNrZWxldG9uO1xyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xyXG5cclxuXHRcdF9za2luSW5kZXguZnJvbUJ1ZmZlckF0dHJpYnV0ZSggZ2VvbWV0cnkuYXR0cmlidXRlcy5za2luSW5kZXgsIGluZGV4ICk7XHJcblx0XHRfc2tpbldlaWdodC5mcm9tQnVmZmVyQXR0cmlidXRlKCBnZW9tZXRyeS5hdHRyaWJ1dGVzLnNraW5XZWlnaHQsIGluZGV4ICk7XHJcblxyXG5cdFx0X2Jhc2VQb3NpdGlvbi5jb3B5KCB0YXJnZXQgKS5hcHBseU1hdHJpeDQoIHRoaXMuYmluZE1hdHJpeCApO1xyXG5cclxuXHRcdHRhcmdldC5zZXQoIDAsIDAsIDAgKTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCA0OyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgd2VpZ2h0ID0gX3NraW5XZWlnaHQuZ2V0Q29tcG9uZW50KCBpICk7XHJcblxyXG5cdFx0XHRpZiAoIHdlaWdodCAhPT0gMCApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgYm9uZUluZGV4ID0gX3NraW5JbmRleC5nZXRDb21wb25lbnQoIGkgKTtcclxuXHJcblx0XHRcdFx0X21hdHJpeDQubXVsdGlwbHlNYXRyaWNlcyggc2tlbGV0b24uYm9uZXNbIGJvbmVJbmRleCBdLm1hdHJpeFdvcmxkLCBza2VsZXRvbi5ib25lSW52ZXJzZXNbIGJvbmVJbmRleCBdICk7XHJcblxyXG5cdFx0XHRcdHRhcmdldC5hZGRTY2FsZWRWZWN0b3IoIF92ZWN0b3IzLmNvcHkoIF9iYXNlUG9zaXRpb24gKS5hcHBseU1hdHJpeDQoIF9tYXRyaXg0ICksIHdlaWdodCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGFyZ2V0LmFwcGx5TWF0cml4NCggdGhpcy5iaW5kTWF0cml4SW52ZXJzZSApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBTa2lubmVkTWVzaCB9O1xyXG4iLCJpbXBvcnQgeyBPYmplY3QzRCB9IGZyb20gJy4uL2NvcmUvT2JqZWN0M0QuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgYm9uZSB3aGljaCBpcyBwYXJ0IG9mIGEge0BsaW5rIFNrZWxldG9ufS4gVGhlIHNrZWxldG9uIGluIHR1cm4gaXMgdXNlZCBieVxyXG4gKiB0aGUge0BsaW5rIFNraW5uZWRNZXNofS5cclxuICpcclxuICogYGBganNcclxuICogY29uc3Qgcm9vdCA9IG5ldyBUSFJFRS5Cb25lKCk7XHJcbiAqIGNvbnN0IGNoaWxkID0gbmV3IFRIUkVFLkJvbmUoKTtcclxuICpcclxuICogcm9vdC5hZGQoIGNoaWxkICk7XHJcbiAqIGNoaWxkLnBvc2l0aW9uLnkgPSA1O1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIE9iamVjdDNEXHJcbiAqL1xyXG5jbGFzcyBCb25lIGV4dGVuZHMgT2JqZWN0M0Qge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGJvbmUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNCb25lID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnQm9uZSc7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IEJvbmUgfTtcclxuIiwiaW1wb3J0IHsgVGV4dHVyZSB9IGZyb20gJy4vVGV4dHVyZS5qcyc7XHJcbmltcG9ydCB7IE5lYXJlc3RGaWx0ZXIgfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSB0ZXh0dXJlIGRpcmVjdGx5IGZyb20gcmF3IGJ1ZmZlciBkYXRhLlxyXG4gKlxyXG4gKiBUaGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlIGRhdGEgZGVwZW5kcyBvbiB0eXBlIGFuZCBmb3JtYXQ6IElmIHRoZSB0eXBlIGlzXHJcbiAqIGBVbnNpZ25lZEJ5dGVUeXBlYCwgYSBgVWludDhBcnJheWAgd2lsbCBiZSB1c2VmdWwgZm9yIGFkZHJlc3NpbmcgdGhlXHJcbiAqIHRleGVsIGRhdGEuIElmIHRoZSBmb3JtYXQgaXMgYFJHQkFGb3JtYXRgLCBkYXRhIG5lZWRzIGZvdXIgdmFsdWVzIGZvclxyXG4gKiBvbmUgdGV4ZWw7IFJlZCwgR3JlZW4sIEJsdWUgYW5kIEFscGhhICh0eXBpY2FsbHkgdGhlIG9wYWNpdHkpLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgVGV4dHVyZVxyXG4gKi9cclxuY2xhc3MgRGF0YVRleHR1cmUgZXh0ZW5kcyBUZXh0dXJlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBkYXRhIHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gez9UeXBlZEFycmF5fSBbZGF0YT1udWxsXSAtIFRoZSBidWZmZXIgZGF0YS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3dpZHRoPTFdIC0gVGhlIHdpZHRoIG9mIHRoZSB0ZXh0dXJlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbaGVpZ2h0PTFdIC0gVGhlIGhlaWdodCBvZiB0aGUgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2Zvcm1hdD1SR0JBRm9ybWF0XSAtIFRoZSB0ZXh0dXJlIGZvcm1hdC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3R5cGU9VW5zaWduZWRCeXRlVHlwZV0gLSBUaGUgdGV4dHVyZSB0eXBlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbWFwcGluZz1UZXh0dXJlLkRFRkFVTFRfTUFQUElOR10gLSBUaGUgdGV4dHVyZSBtYXBwaW5nLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbd3JhcFM9Q2xhbXBUb0VkZ2VXcmFwcGluZ10gLSBUaGUgd3JhcFMgdmFsdWUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt3cmFwVD1DbGFtcFRvRWRnZVdyYXBwaW5nXSAtIFRoZSB3cmFwVCB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW21hZ0ZpbHRlcj1OZWFyZXN0RmlsdGVyXSAtIFRoZSBtYWcgZmlsdGVyIHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbWluRmlsdGVyPU5lYXJlc3RGaWx0ZXJdIC0gVGhlIG1pbiBmaWx0ZXIgdmFsdWUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFthbmlzb3Ryb3B5PVRleHR1cmUuREVGQVVMVF9BTklTT1RST1BZXSAtIFRoZSBhbmlzb3Ryb3B5IHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbY29sb3JTcGFjZT1Ob0NvbG9yU3BhY2VdIC0gVGhlIGNvbG9yIHNwYWNlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBkYXRhID0gbnVsbCwgd2lkdGggPSAxLCBoZWlnaHQgPSAxLCBmb3JtYXQsIHR5cGUsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyID0gTmVhcmVzdEZpbHRlciwgbWluRmlsdGVyID0gTmVhcmVzdEZpbHRlciwgYW5pc290cm9weSwgY29sb3JTcGFjZSApIHtcclxuXHJcblx0XHRzdXBlciggbnVsbCwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5LCBjb2xvclNwYWNlICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzRGF0YVRleHR1cmUgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGltYWdlIGRlZmluaXRpb24gb2YgYSBkYXRhIHRleHR1cmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3tkYXRhOlR5cGVkQXJyYXksd2lkdGg6bnVtYmVyLGhlaWdodDpudW1iZXJ9fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmltYWdlID0geyBkYXRhOiBkYXRhLCB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0IH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRvIGdlbmVyYXRlIG1pcG1hcHMgKGlmIHBvc3NpYmxlKSBmb3IgYSB0ZXh0dXJlLlxyXG5cdFx0ICpcclxuXHRcdCAqIE92ZXJ3cml0dGVuIGFuZCBzZXQgdG8gYGZhbHNlYCBieSBkZWZhdWx0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIElmIHNldCB0byBgdHJ1ZWAsIHRoZSB0ZXh0dXJlIGlzIGZsaXBwZWQgYWxvbmcgdGhlIHZlcnRpY2FsIGF4aXMgd2hlblxyXG5cdFx0ICogdXBsb2FkZWQgdG8gdGhlIEdQVS5cclxuXHRcdCAqXHJcblx0XHQgKiBPdmVyd3JpdHRlbiBhbmQgc2V0IHRvIGBmYWxzZWAgYnkgZGVmYXVsdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZmxpcFkgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNwZWNpZmllcyB0aGUgYWxpZ25tZW50IHJlcXVpcmVtZW50cyBmb3IgdGhlIHN0YXJ0IG9mIGVhY2ggcGl4ZWwgcm93IGluIG1lbW9yeS5cclxuXHRcdCAqXHJcblx0XHQgKiBPdmVyd3JpdHRlbiBhbmQgc2V0IHRvIGAxYCBieSBkZWZhdWx0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVucGFja0FsaWdubWVudCA9IDE7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IERhdGFUZXh0dXJlIH07XHJcbiIsImltcG9ydCB7XHJcblx0UkdCQUZvcm1hdCxcclxuXHRGbG9hdFR5cGVcclxufSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBCb25lIH0gZnJvbSAnLi9Cb25lLmpzJztcclxuaW1wb3J0IHsgTWF0cml4NCB9IGZyb20gJy4uL21hdGgvTWF0cml4NC5qcyc7XHJcbmltcG9ydCB7IERhdGFUZXh0dXJlIH0gZnJvbSAnLi4vdGV4dHVyZXMvRGF0YVRleHR1cmUuanMnO1xyXG5pbXBvcnQgeyBnZW5lcmF0ZVVVSUQgfSBmcm9tICcuLi9tYXRoL01hdGhVdGlscy5qcyc7XHJcblxyXG5jb25zdCBfb2Zmc2V0TWF0cml4ID0gLypAX19QVVJFX18qLyBuZXcgTWF0cml4NCgpO1xyXG5jb25zdCBfaWRlbnRpdHlNYXRyaXggPSAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXg0KCk7XHJcblxyXG4vKipcclxuICogQ2xhc3MgZm9yIHJlcHJlc2VudGluZyB0aGUgYXJtYXR1cmVzIGluIGB0aHJlZS5qc2AuIFRoZSBza2VsZXRvblxyXG4gKiBpcyBkZWZpbmVkIGJ5IGEgaGllcmFyY2h5IG9mIGJvbmVzLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBib25lcyA9IFtdO1xyXG4gKlxyXG4gKiBjb25zdCBzaG91bGRlciA9IG5ldyBUSFJFRS5Cb25lKCk7XHJcbiAqIGNvbnN0IGVsYm93ID0gbmV3IFRIUkVFLkJvbmUoKTtcclxuICogY29uc3QgaGFuZCA9IG5ldyBUSFJFRS5Cb25lKCk7XHJcbiAqXHJcbiAqIHNob3VsZGVyLmFkZCggZWxib3cgKTtcclxuICogZWxib3cuYWRkKCBoYW5kICk7XHJcbiAqXHJcbiAqIGJvbmVzLnB1c2goIHNob3VsZGVyICwgZWxib3csIGhhbmQpO1xyXG4gKlxyXG4gKiBzaG91bGRlci5wb3NpdGlvbi55ID0gLTU7XHJcbiAqIGVsYm93LnBvc2l0aW9uLnkgPSAwO1xyXG4gKiBoYW5kLnBvc2l0aW9uLnkgPSA1O1xyXG4gKlxyXG4gKiBjb25zdCBhcm1Ta2VsZXRvbiA9IG5ldyBUSFJFRS5Ta2VsZXRvbiggYm9uZXMgKTtcclxuICogYGBgXHJcbiAqL1xyXG5jbGFzcyBTa2VsZXRvbiB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc2tlbGV0b24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PEJvbmU+fSBbYm9uZXNdIC0gQW4gYXJyYXkgb2YgYm9uZXMuXHJcblx0ICogQHBhcmFtIHtBcnJheTxNYXRyaXg0Pn0gW2JvbmVJbnZlcnNlc10gLSBBbiBhcnJheSBvZiBib25lIGludmVyc2UgbWF0cmljZXMuXHJcblx0ICogSWYgbm90IHByb3ZpZGVkLCB0aGVzZSBtYXRyaWNlcyB3aWxsIGJlIGNvbXB1dGVkIGF1dG9tYXRpY2FsbHkgdmlhIHtAbGluayBTa2VsZXRvbiNjYWxjdWxhdGVJbnZlcnNlc30uXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGJvbmVzID0gW10sIGJvbmVJbnZlcnNlcyA9IFtdICkge1xyXG5cclxuXHRcdHRoaXMudXVpZCA9IGdlbmVyYXRlVVVJRCgpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQW4gYXJyYXkgb2YgYm9uZXMgZGVmaW5pbmcgdGhlIHNrZWxldG9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxCb25lPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ib25lcyA9IGJvbmVzLnNsaWNlKCAwICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBhcnJheSBvZiBib25lIGludmVyc2UgbWF0cmljZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PE1hdHJpeDQ+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJvbmVJbnZlcnNlcyA9IGJvbmVJbnZlcnNlcztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIGFycmF5IGJ1ZmZlciBob2xkaW5nIHRoZSBib25lIGRhdGEuXHJcblx0XHQgKiBJbnB1dCBkYXRhIGZvciB7QGxpbmsgU2tlbGV0b24jYm9uZVRleHR1cmV9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/RmxvYXQzMkFycmF5fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJvbmVNYXRyaWNlcyA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHRleHR1cmUgaG9sZGluZyB0aGUgYm9uZSBkYXRhIGZvciB1c2VcclxuXHRcdCAqIGluIHRoZSB2ZXJ0ZXggc2hhZGVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/RGF0YVRleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYm9uZVRleHR1cmUgPSBudWxsO1xyXG5cclxuXHRcdHRoaXMuaW5pdCgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEluaXRpYWxpemVzIHRoZSBza2VsZXRvbi4gVGhpcyBtZXRob2QgZ2V0cyBhdXRvbWF0aWNhbGx5IGNhbGxlZCBieSB0aGUgY29uc3RydWN0b3JcclxuXHQgKiBidXQgZGVwZW5kaW5nIG9uIGhvdyB0aGUgc2tlbGV0b24gaXMgY3JlYXRlZCBpdCBtaWdodCBiZSBuZWNlc3NhcnkgdG8gY2FsbCB0aGlzIG1ldGhvZFxyXG5cdCAqIG1hbnVhbGx5LlxyXG5cdCAqL1xyXG5cdGluaXQoKSB7XHJcblxyXG5cdFx0Y29uc3QgYm9uZXMgPSB0aGlzLmJvbmVzO1xyXG5cdFx0Y29uc3QgYm9uZUludmVyc2VzID0gdGhpcy5ib25lSW52ZXJzZXM7XHJcblxyXG5cdFx0dGhpcy5ib25lTWF0cmljZXMgPSBuZXcgRmxvYXQzMkFycmF5KCBib25lcy5sZW5ndGggKiAxNiApO1xyXG5cclxuXHRcdC8vIGNhbGN1bGF0ZSBpbnZlcnNlIGJvbmUgbWF0cmljZXMgaWYgbmVjZXNzYXJ5XHJcblxyXG5cdFx0aWYgKCBib25lSW52ZXJzZXMubGVuZ3RoID09PSAwICkge1xyXG5cclxuXHRcdFx0dGhpcy5jYWxjdWxhdGVJbnZlcnNlcygpO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHQvLyBoYW5kbGUgc3BlY2lhbCBjYXNlXHJcblxyXG5cdFx0XHRpZiAoIGJvbmVzLmxlbmd0aCAhPT0gYm9uZUludmVyc2VzLmxlbmd0aCApIHtcclxuXHJcblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuU2tlbGV0b246IE51bWJlciBvZiBpbnZlcnNlIGJvbmUgbWF0cmljZXMgZG9lcyBub3QgbWF0Y2ggYW1vdW50IG9mIGJvbmVzLicgKTtcclxuXHJcblx0XHRcdFx0dGhpcy5ib25lSW52ZXJzZXMgPSBbXTtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IHRoaXMuYm9uZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0dGhpcy5ib25lSW52ZXJzZXMucHVzaCggbmV3IE1hdHJpeDQoKSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSBib25lIGludmVyc2UgbWF0cmljZXMuIFRoaXMgbWV0aG9kIHJlc2V0cyB7QGxpbmsgU2tlbGV0b24jYm9uZUludmVyc2VzfVxyXG5cdCAqIGFuZCBmaWxscyBpdCB3aXRoIG5ldyBtYXRyaWNlcy5cclxuXHQgKi9cclxuXHRjYWxjdWxhdGVJbnZlcnNlcygpIHtcclxuXHJcblx0XHR0aGlzLmJvbmVJbnZlcnNlcy5sZW5ndGggPSAwO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSB0aGlzLmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgaW52ZXJzZSA9IG5ldyBNYXRyaXg0KCk7XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMuYm9uZXNbIGkgXSApIHtcclxuXHJcblx0XHRcdFx0aW52ZXJzZS5jb3B5KCB0aGlzLmJvbmVzWyBpIF0ubWF0cml4V29ybGQgKS5pbnZlcnQoKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuYm9uZUludmVyc2VzLnB1c2goIGludmVyc2UgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVzZXRzIHRoZSBza2VsZXRvbiB0byB0aGUgYmFzZSBwb3NlLlxyXG5cdCAqL1xyXG5cdHBvc2UoKSB7XHJcblxyXG5cdFx0Ly8gcmVjb3ZlciB0aGUgYmluZC10aW1lIHdvcmxkIG1hdHJpY2VzXHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IHRoaXMuYm9uZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBib25lID0gdGhpcy5ib25lc1sgaSBdO1xyXG5cclxuXHRcdFx0aWYgKCBib25lICkge1xyXG5cclxuXHRcdFx0XHRib25lLm1hdHJpeFdvcmxkLmNvcHkoIHRoaXMuYm9uZUludmVyc2VzWyBpIF0gKS5pbnZlcnQoKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gY29tcHV0ZSB0aGUgbG9jYWwgbWF0cmljZXMsIHBvc2l0aW9ucywgcm90YXRpb25zIGFuZCBzY2FsZXNcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gdGhpcy5ib25lcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGJvbmUgPSB0aGlzLmJvbmVzWyBpIF07XHJcblxyXG5cdFx0XHRpZiAoIGJvbmUgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggYm9uZS5wYXJlbnQgJiYgYm9uZS5wYXJlbnQuaXNCb25lICkge1xyXG5cclxuXHRcdFx0XHRcdGJvbmUubWF0cml4LmNvcHkoIGJvbmUucGFyZW50Lm1hdHJpeFdvcmxkICkuaW52ZXJ0KCk7XHJcblx0XHRcdFx0XHRib25lLm1hdHJpeC5tdWx0aXBseSggYm9uZS5tYXRyaXhXb3JsZCApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdGJvbmUubWF0cml4LmNvcHkoIGJvbmUubWF0cml4V29ybGQgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRib25lLm1hdHJpeC5kZWNvbXBvc2UoIGJvbmUucG9zaXRpb24sIGJvbmUucXVhdGVybmlvbiwgYm9uZS5zY2FsZSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXNldHMgdGhlIHNrZWxldG9uIHRvIHRoZSBiYXNlIHBvc2UuXHJcblx0ICovXHJcblx0dXBkYXRlKCkge1xyXG5cclxuXHRcdGNvbnN0IGJvbmVzID0gdGhpcy5ib25lcztcclxuXHRcdGNvbnN0IGJvbmVJbnZlcnNlcyA9IHRoaXMuYm9uZUludmVyc2VzO1xyXG5cdFx0Y29uc3QgYm9uZU1hdHJpY2VzID0gdGhpcy5ib25lTWF0cmljZXM7XHJcblx0XHRjb25zdCBib25lVGV4dHVyZSA9IHRoaXMuYm9uZVRleHR1cmU7XHJcblxyXG5cdFx0Ly8gZmxhdHRlbiBib25lIG1hdHJpY2VzIHRvIGFycmF5XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IGJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdFx0Ly8gY29tcHV0ZSB0aGUgb2Zmc2V0IGJldHdlZW4gdGhlIGN1cnJlbnQgYW5kIHRoZSBvcmlnaW5hbCB0cmFuc2Zvcm1cclxuXHJcblx0XHRcdGNvbnN0IG1hdHJpeCA9IGJvbmVzWyBpIF0gPyBib25lc1sgaSBdLm1hdHJpeFdvcmxkIDogX2lkZW50aXR5TWF0cml4O1xyXG5cclxuXHRcdFx0X29mZnNldE1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBtYXRyaXgsIGJvbmVJbnZlcnNlc1sgaSBdICk7XHJcblx0XHRcdF9vZmZzZXRNYXRyaXgudG9BcnJheSggYm9uZU1hdHJpY2VzLCBpICogMTYgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBib25lVGV4dHVyZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGJvbmVUZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIG5ldyBza2VsZXRvbiB3aXRoIGNvcGllZCB2YWx1ZXMgZnJvbSB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7U2tlbGV0b259IEEgY2xvbmUgb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjbG9uZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IFNrZWxldG9uKCB0aGlzLmJvbmVzLCB0aGlzLmJvbmVJbnZlcnNlcyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIGEgZGF0YSB0ZXh0dXJlIGZvciBwYXNzaW5nIGJvbmUgZGF0YSB0byB0aGUgdmVydGV4IHNoYWRlci5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1NrZWxldG9ufSBBIHJlZmVyZW5jZSBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNvbXB1dGVCb25lVGV4dHVyZSgpIHtcclxuXHJcblx0XHQvLyBsYXlvdXQgKDEgbWF0cml4ID0gNCBwaXhlbHMpXHJcblx0XHQvLyAgICAgIFJHQkEgUkdCQSBSR0JBIFJHQkEgKD0+IGNvbHVtbjEsIGNvbHVtbjIsIGNvbHVtbjMsIGNvbHVtbjQpXHJcblx0XHQvLyAgd2l0aCAgOHg4ICBwaXhlbCB0ZXh0dXJlIG1heCAgIDE2IGJvbmVzICogNCBwaXhlbHMgPSAgKDggKiA4KVxyXG5cdFx0Ly8gICAgICAgMTZ4MTYgcGl4ZWwgdGV4dHVyZSBtYXggICA2NCBib25lcyAqIDQgcGl4ZWxzID0gKDE2ICogMTYpXHJcblx0XHQvLyAgICAgICAzMngzMiBwaXhlbCB0ZXh0dXJlIG1heCAgMjU2IGJvbmVzICogNCBwaXhlbHMgPSAoMzIgKiAzMilcclxuXHRcdC8vICAgICAgIDY0eDY0IHBpeGVsIHRleHR1cmUgbWF4IDEwMjQgYm9uZXMgKiA0IHBpeGVscyA9ICg2NCAqIDY0KVxyXG5cclxuXHRcdGxldCBzaXplID0gTWF0aC5zcXJ0KCB0aGlzLmJvbmVzLmxlbmd0aCAqIDQgKTsgLy8gNCBwaXhlbHMgbmVlZGVkIGZvciAxIG1hdHJpeFxyXG5cdFx0c2l6ZSA9IE1hdGguY2VpbCggc2l6ZSAvIDQgKSAqIDQ7XHJcblx0XHRzaXplID0gTWF0aC5tYXgoIHNpemUsIDQgKTtcclxuXHJcblx0XHRjb25zdCBib25lTWF0cmljZXMgPSBuZXcgRmxvYXQzMkFycmF5KCBzaXplICogc2l6ZSAqIDQgKTsgLy8gNCBmbG9hdHMgcGVyIFJHQkEgcGl4ZWxcclxuXHRcdGJvbmVNYXRyaWNlcy5zZXQoIHRoaXMuYm9uZU1hdHJpY2VzICk7IC8vIGNvcHkgY3VycmVudCB2YWx1ZXNcclxuXHJcblx0XHRjb25zdCBib25lVGV4dHVyZSA9IG5ldyBEYXRhVGV4dHVyZSggYm9uZU1hdHJpY2VzLCBzaXplLCBzaXplLCBSR0JBRm9ybWF0LCBGbG9hdFR5cGUgKTtcclxuXHRcdGJvbmVUZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLmJvbmVNYXRyaWNlcyA9IGJvbmVNYXRyaWNlcztcclxuXHRcdHRoaXMuYm9uZVRleHR1cmUgPSBib25lVGV4dHVyZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZWFyY2hlcyB0aHJvdWdoIHRoZSBza2VsZXRvbidzIGJvbmUgYXJyYXkgYW5kIHJldHVybnMgdGhlIGZpcnN0IHdpdGggYVxyXG5cdCAqIG1hdGNoaW5nIG5hbWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBib25lLlxyXG5cdCAqIEByZXR1cm4ge0JvbmV8dW5kZWZpbmVkfSBUaGUgZm91bmQgYm9uZS4gYHVuZGVmaW5lZGAgaWYgbm8gYm9uZSBoYXMgYmVlbiBmb3VuZC5cclxuXHQgKi9cclxuXHRnZXRCb25lQnlOYW1lKCBuYW1lICkge1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSB0aGlzLmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYm9uZSA9IHRoaXMuYm9uZXNbIGkgXTtcclxuXHJcblx0XHRcdGlmICggYm9uZS5uYW1lID09PSBuYW1lICkge1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gYm9uZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGcmVlcyB0aGUgR1BVLXJlbGF0ZWQgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGlzIGluc3RhbmNlLiBDYWxsIHRoaXNcclxuXHQgKiBtZXRob2Qgd2hlbmV2ZXIgdGhpcyBpbnN0YW5jZSBpcyBubyBsb25nZXIgdXNlZCBpbiB5b3VyIGFwcC5cclxuXHQgKi9cclxuXHRkaXNwb3NlKCApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuYm9uZVRleHR1cmUgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmJvbmVUZXh0dXJlLmRpc3Bvc2UoKTtcclxuXHJcblx0XHRcdHRoaXMuYm9uZVRleHR1cmUgPSBudWxsO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXR1cHMgdGhlIHNrZWxldG9uIGJ5IHRoZSBnaXZlbiBKU09OIGFuZCBib25lcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBqc29uIC0gVGhlIHNrZWxldG9uIGFzIHNlcmlhbGl6ZWQgSlNPTi5cclxuXHQgKiBAcGFyYW0ge09iamVjdDxzdHJpbmcsIEJvbmU+fSBib25lcyAtIEFuIGFycmF5IG9mIGJvbmVzLlxyXG5cdCAqIEByZXR1cm4ge1NrZWxldG9ufSBBIHJlZmVyZW5jZSBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGZyb21KU09OKCBqc29uLCBib25lcyApIHtcclxuXHJcblx0XHR0aGlzLnV1aWQgPSBqc29uLnV1aWQ7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0ganNvbi5ib25lcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdXVpZCA9IGpzb24uYm9uZXNbIGkgXTtcclxuXHRcdFx0bGV0IGJvbmUgPSBib25lc1sgdXVpZCBdO1xyXG5cclxuXHRcdFx0aWYgKCBib25lID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlNrZWxldG9uOiBObyBib25lIGZvdW5kIHdpdGggVVVJRDonLCB1dWlkICk7XHJcblx0XHRcdFx0Ym9uZSA9IG5ldyBCb25lKCk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0aGlzLmJvbmVzLnB1c2goIGJvbmUgKTtcclxuXHRcdFx0dGhpcy5ib25lSW52ZXJzZXMucHVzaCggbmV3IE1hdHJpeDQoKS5mcm9tQXJyYXkoIGpzb24uYm9uZUludmVyc2VzWyBpIF0gKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmluaXQoKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXJpYWxpemVzIHRoZSBza2VsZXRvbiBpbnRvIEpTT04uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtPYmplY3R9IEEgSlNPTiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzZXJpYWxpemVkIHNrZWxldG9uLlxyXG5cdCAqIEBzZWUge0BsaW5rIE9iamVjdExvYWRlciNwYXJzZX1cclxuXHQgKi9cclxuXHR0b0pTT04oKSB7XHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IHtcclxuXHRcdFx0bWV0YWRhdGE6IHtcclxuXHRcdFx0XHR2ZXJzaW9uOiA0LjYsXHJcblx0XHRcdFx0dHlwZTogJ1NrZWxldG9uJyxcclxuXHRcdFx0XHRnZW5lcmF0b3I6ICdTa2VsZXRvbi50b0pTT04nXHJcblx0XHRcdH0sXHJcblx0XHRcdGJvbmVzOiBbXSxcclxuXHRcdFx0Ym9uZUludmVyc2VzOiBbXVxyXG5cdFx0fTtcclxuXHJcblx0XHRkYXRhLnV1aWQgPSB0aGlzLnV1aWQ7XHJcblxyXG5cdFx0Y29uc3QgYm9uZXMgPSB0aGlzLmJvbmVzO1xyXG5cdFx0Y29uc3QgYm9uZUludmVyc2VzID0gdGhpcy5ib25lSW52ZXJzZXM7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gYm9uZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGJvbmUgPSBib25lc1sgaSBdO1xyXG5cdFx0XHRkYXRhLmJvbmVzLnB1c2goIGJvbmUudXVpZCApO1xyXG5cclxuXHRcdFx0Y29uc3QgYm9uZUludmVyc2UgPSBib25lSW52ZXJzZXNbIGkgXTtcclxuXHRcdFx0ZGF0YS5ib25lSW52ZXJzZXMucHVzaCggYm9uZUludmVyc2UudG9BcnJheSgpICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBkYXRhO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBTa2VsZXRvbiB9O1xyXG4iLCJpbXBvcnQgeyBCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcblxyXG4vKipcclxuICogQW4gaW5zdGFuY2VkIHZlcnNpb24gb2YgYSBidWZmZXIgYXR0cmlidXRlLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQnVmZmVyQXR0cmlidXRlXHJcbiAqL1xyXG5jbGFzcyBJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUgZXh0ZW5kcyBCdWZmZXJBdHRyaWJ1dGUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlZCBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUeXBlZEFycmF5fSBhcnJheSAtIFRoZSBhcnJheSBob2xkaW5nIHRoZSBhdHRyaWJ1dGUgZGF0YS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaXRlbVNpemUgLSBUaGUgaXRlbSBzaXplLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW25vcm1hbGl6ZWQ9ZmFsc2VdIC0gV2hldGhlciB0aGUgZGF0YSBhcmUgbm9ybWFsaXplZCBvciBub3QuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFttZXNoUGVyQXR0cmlidXRlPTFdIC0gSG93IG9mdGVuIGEgdmFsdWUgb2YgdGhpcyBidWZmZXIgYXR0cmlidXRlIHNob3VsZCBiZSByZXBlYXRlZC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkLCBtZXNoUGVyQXR0cmlidXRlID0gMSApIHtcclxuXHJcblx0XHRzdXBlciggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgaG93IG9mdGVuIGEgdmFsdWUgb2YgdGhpcyBidWZmZXIgYXR0cmlidXRlIHNob3VsZCBiZSByZXBlYXRlZC4gQVxyXG5cdFx0ICogdmFsdWUgb2Ygb25lIG1lYW5zIHRoYXQgZWFjaCB2YWx1ZSBvZiB0aGUgaW5zdGFuY2VkIGF0dHJpYnV0ZSBpcyB1c2VkIGZvclxyXG5cdFx0ICogYSBzaW5nbGUgaW5zdGFuY2UuIEEgdmFsdWUgb2YgdHdvIG1lYW5zIHRoYXQgZWFjaCB2YWx1ZSBpcyB1c2VkIGZvciB0d29cclxuXHRcdCAqIGNvbnNlY3V0aXZlIGluc3RhbmNlcyAoYW5kIHNvIG9uKS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1lc2hQZXJBdHRyaWJ1dGUgPSBtZXNoUGVyQXR0cmlidXRlO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLm1lc2hQZXJBdHRyaWJ1dGUgPSBzb3VyY2UubWVzaFBlckF0dHJpYnV0ZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHR0b0pTT04oKSB7XHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IHN1cGVyLnRvSlNPTigpO1xyXG5cclxuXHRcdGRhdGEubWVzaFBlckF0dHJpYnV0ZSA9IHRoaXMubWVzaFBlckF0dHJpYnV0ZTtcclxuXHJcblx0XHRkYXRhLmlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlID0gdHJ1ZTtcclxuXHJcblx0XHRyZXR1cm4gZGF0YTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlIH07XHJcbiIsImltcG9ydCB7IEluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlLmpzJztcclxuaW1wb3J0IHsgTWVzaCB9IGZyb20gJy4vTWVzaC5qcyc7XHJcbmltcG9ydCB7IEJveDMgfSBmcm9tICcuLi9tYXRoL0JveDMuanMnO1xyXG5pbXBvcnQgeyBNYXRyaXg0IH0gZnJvbSAnLi4vbWF0aC9NYXRyaXg0LmpzJztcclxuaW1wb3J0IHsgU3BoZXJlIH0gZnJvbSAnLi4vbWF0aC9TcGhlcmUuanMnO1xyXG5pbXBvcnQgeyBEYXRhVGV4dHVyZSB9IGZyb20gJy4uL3RleHR1cmVzL0RhdGFUZXh0dXJlLmpzJztcclxuaW1wb3J0IHsgRmxvYXRUeXBlLCBSZWRGb3JtYXQgfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xyXG5cclxuY29uc3QgX2luc3RhbmNlTG9jYWxNYXRyaXggPSAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXg0KCk7XHJcbmNvbnN0IF9pbnN0YW5jZVdvcmxkTWF0cml4ID0gLypAX19QVVJFX18qLyBuZXcgTWF0cml4NCgpO1xyXG5cclxuY29uc3QgX2luc3RhbmNlSW50ZXJzZWN0cyA9IFtdO1xyXG5cclxuY29uc3QgX2JveDMgPSAvKkBfX1BVUkVfXyovIG5ldyBCb3gzKCk7XHJcbmNvbnN0IF9pZGVudGl0eSA9IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDQoKTtcclxuY29uc3QgX21lc2ggPSAvKkBfX1BVUkVfXyovIG5ldyBNZXNoKCk7XHJcbmNvbnN0IF9zcGhlcmUgPSAvKkBfX1BVUkVfXyovIG5ldyBTcGhlcmUoKTtcclxuXHJcbi8qKlxyXG4gKiBBIHNwZWNpYWwgdmVyc2lvbiBvZiBhIG1lc2ggd2l0aCBpbnN0YW5jZWQgcmVuZGVyaW5nIHN1cHBvcnQuIFVzZVxyXG4gKiB0aGlzIGNsYXNzIGlmIHlvdSBoYXZlIHRvIHJlbmRlciBhIGxhcmdlIG51bWJlciBvZiBvYmplY3RzIHdpdGggdGhlIHNhbWVcclxuICogZ2VvbWV0cnkgYW5kIG1hdGVyaWFsKHMpIGJ1dCB3aXRoIGRpZmZlcmVudCB3b3JsZCB0cmFuc2Zvcm1hdGlvbnMuIFRoZSB1c2FnZVxyXG4gKiBvZiAnSW5zdGFuY2VkTWVzaCcgd2lsbCBoZWxwIHlvdSB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBkcmF3IGNhbGxzIGFuZCB0aHVzXHJcbiAqIGltcHJvdmUgdGhlIG92ZXJhbGwgcmVuZGVyaW5nIHBlcmZvcm1hbmNlIGluIHlvdXIgYXBwbGljYXRpb24uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBNZXNoXHJcbiAqL1xyXG5jbGFzcyBJbnN0YW5jZWRNZXNoIGV4dGVuZHMgTWVzaCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2VkIG1lc2guXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0J1ZmZlckdlb21ldHJ5fSBbZ2VvbWV0cnldIC0gVGhlIG1lc2ggZ2VvbWV0cnkuXHJcblx0ICogQHBhcmFtIHtNYXRlcmlhbHxBcnJheTxNYXRlcmlhbD59IFttYXRlcmlhbF0gLSBUaGUgbWVzaCBtYXRlcmlhbC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gY291bnQgLSBUaGUgbnVtYmVyIG9mIGluc3RhbmNlcy5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggZ2VvbWV0cnksIG1hdGVyaWFsLCBjb3VudCApIHtcclxuXHJcblx0XHRzdXBlciggZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzSW5zdGFuY2VkTWVzaCA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXByZXNlbnRzIHRoZSBsb2NhbCB0cmFuc2Zvcm1hdGlvbiBvZiBhbGwgaW5zdGFuY2VzLiBZb3UgaGF2ZSB0byBzZXQgaXRzXHJcblx0XHQgKiB7QGxpbmsgQnVmZmVyQXR0cmlidXRlI25lZWRzVXBkYXRlfSBmbGFnIHRvIHRydWUgaWYgeW91IG1vZGlmeSBpbnN0YW5jZWQgZGF0YVxyXG5cdFx0ICogdmlhIHtAbGluayBJbnN0YW5jZWRNZXNoI3NldE1hdHJpeEF0fS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7SW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmluc3RhbmNlTWF0cml4ID0gbmV3IEluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSggbmV3IEZsb2F0MzJBcnJheSggY291bnQgKiAxNiApLCAxNiApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVwcmVzZW50cyB0aGUgY29sb3Igb2YgYWxsIGluc3RhbmNlcy4gWW91IGhhdmUgdG8gc2V0IGl0c1xyXG5cdFx0ICoge0BsaW5rIEJ1ZmZlckF0dHJpYnV0ZSNuZWVkc1VwZGF0ZX0gZmxhZyB0byB0cnVlIGlmIHlvdSBtb2RpZnkgaW5zdGFuY2VkIGRhdGFcclxuXHRcdCAqIHZpYSB7QGxpbmsgSW5zdGFuY2VkTWVzaCNzZXRDb2xvckF0fS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pbnN0YW5jZUNvbG9yID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlcHJlc2VudHMgdGhlIG1vcnBoIHRhcmdldCB3ZWlnaHRzIG9mIGFsbCBpbnN0YW5jZXMuIFlvdSBoYXZlIHRvIHNldCBpdHNcclxuXHRcdCAqIHtAbGluayBUZXh0dXJlI25lZWRzVXBkYXRlfSBmbGFnIHRvIHRydWUgaWYgeW91IG1vZGlmeSBpbnN0YW5jZWQgZGF0YVxyXG5cdFx0ICogdmlhIHtAbGluayBJbnN0YW5jZWRNZXNoI3NldE1vcnBoQXR9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/RGF0YVRleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubW9ycGhUZXh0dXJlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBudW1iZXIgb2YgaW5zdGFuY2VzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY291bnQgPSBjb3VudDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBib3VuZGluZyBib3ggb2YgdGhlIGluc3RhbmNlZCBtZXNoLiBDYW4gYmUgY29tcHV0ZWQgdmlhIHtAbGluayBJbnN0YW5jZWRNZXNoI2NvbXB1dGVCb3VuZGluZ0JveH0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Cb3gzfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJvdW5kaW5nQm94ID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBib3VuZGluZyBzcGhlcmUgb2YgdGhlIGluc3RhbmNlZCBtZXNoLiBDYW4gYmUgY29tcHV0ZWQgdmlhIHtAbGluayBJbnN0YW5jZWRNZXNoI2NvbXB1dGVCb3VuZGluZ1NwaGVyZX0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9TcGhlcmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBudWxsO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGNvdW50OyBpICsrICkge1xyXG5cclxuXHRcdFx0dGhpcy5zZXRNYXRyaXhBdCggaSwgX2lkZW50aXR5ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSBib3VuZGluZyBib3ggb2YgdGhlIGluc3RhbmNlZCBtZXNoLCBhbmQgdXBkYXRlcyB7QGxpbmsgSW5zdGFuY2VkTWVzaCNib3VuZGluZ0JveH0uXHJcblx0ICogVGhlIGJvdW5kaW5nIGJveCBpcyBub3QgYXV0b21hdGljYWxseSBjb21wdXRlZCBieSB0aGUgZW5naW5lOyB0aGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBieSB5b3VyIGFwcC5cclxuXHQgKiBZb3UgbWF5IG5lZWQgdG8gcmVjb21wdXRlIHRoZSBib3VuZGluZyBib3ggaWYgYW4gaW5zdGFuY2UgaXMgdHJhbnNmb3JtZWQgdmlhIHtAbGluayBJbnN0YW5jZWRNZXNoI3NldE1hdHJpeEF0fS5cclxuXHQgKi9cclxuXHRjb21wdXRlQm91bmRpbmdCb3goKSB7XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xyXG5cdFx0Y29uc3QgY291bnQgPSB0aGlzLmNvdW50O1xyXG5cclxuXHRcdGlmICggdGhpcy5ib3VuZGluZ0JveCA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuYm91bmRpbmdCb3ggPSBuZXcgQm94MygpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nQm94ID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0Z2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nQm94KCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuYm91bmRpbmdCb3gubWFrZUVtcHR5KCk7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgY291bnQ7IGkgKysgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmdldE1hdHJpeEF0KCBpLCBfaW5zdGFuY2VMb2NhbE1hdHJpeCApO1xyXG5cclxuXHRcdFx0X2JveDMuY29weSggZ2VvbWV0cnkuYm91bmRpbmdCb3ggKS5hcHBseU1hdHJpeDQoIF9pbnN0YW5jZUxvY2FsTWF0cml4ICk7XHJcblxyXG5cdFx0XHR0aGlzLmJvdW5kaW5nQm94LnVuaW9uKCBfYm94MyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB0aGUgYm91bmRpbmcgc3BoZXJlIG9mIHRoZSBpbnN0YW5jZWQgbWVzaCwgYW5kIHVwZGF0ZXMge0BsaW5rIEluc3RhbmNlZE1lc2gjYm91bmRpbmdTcGhlcmV9XHJcblx0ICogVGhlIGVuZ2luZSBhdXRvbWF0aWNhbGx5IGNvbXB1dGVzIHRoZSBib3VuZGluZyBzcGhlcmUgd2hlbiBpdCBpcyBuZWVkZWQsIGUuZy4sIGZvciByYXkgY2FzdGluZyBvciB2aWV3IGZydXN0dW0gY3VsbGluZy5cclxuXHQgKiBZb3UgbWF5IG5lZWQgdG8gcmVjb21wdXRlIHRoZSBib3VuZGluZyBzcGhlcmUgaWYgYW4gaW5zdGFuY2UgaXMgdHJhbnNmb3JtZWQgdmlhIHtAbGluayBJbnN0YW5jZWRNZXNoI3NldE1hdHJpeEF0fS5cclxuXHQgKi9cclxuXHRjb21wdXRlQm91bmRpbmdTcGhlcmUoKSB7XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xyXG5cdFx0Y29uc3QgY291bnQgPSB0aGlzLmNvdW50O1xyXG5cclxuXHRcdGlmICggdGhpcy5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBuZXcgU3BoZXJlKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5ib3VuZGluZ1NwaGVyZS5tYWtlRW1wdHkoKTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSArKyApIHtcclxuXHJcblx0XHRcdHRoaXMuZ2V0TWF0cml4QXQoIGksIF9pbnN0YW5jZUxvY2FsTWF0cml4ICk7XHJcblxyXG5cdFx0XHRfc3BoZXJlLmNvcHkoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlICkuYXBwbHlNYXRyaXg0KCBfaW5zdGFuY2VMb2NhbE1hdHJpeCApO1xyXG5cclxuXHRcdFx0dGhpcy5ib3VuZGluZ1NwaGVyZS51bmlvbiggX3NwaGVyZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UsIHJlY3Vyc2l2ZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UsIHJlY3Vyc2l2ZSApO1xyXG5cclxuXHRcdHRoaXMuaW5zdGFuY2VNYXRyaXguY29weSggc291cmNlLmluc3RhbmNlTWF0cml4ICk7XHJcblxyXG5cdFx0aWYgKCBzb3VyY2UubW9ycGhUZXh0dXJlICE9PSBudWxsICkgdGhpcy5tb3JwaFRleHR1cmUgPSBzb3VyY2UubW9ycGhUZXh0dXJlLmNsb25lKCk7XHJcblx0XHRpZiAoIHNvdXJjZS5pbnN0YW5jZUNvbG9yICE9PSBudWxsICkgdGhpcy5pbnN0YW5jZUNvbG9yID0gc291cmNlLmluc3RhbmNlQ29sb3IuY2xvbmUoKTtcclxuXHJcblx0XHR0aGlzLmNvdW50ID0gc291cmNlLmNvdW50O1xyXG5cclxuXHRcdGlmICggc291cmNlLmJvdW5kaW5nQm94ICE9PSBudWxsICkgdGhpcy5ib3VuZGluZ0JveCA9IHNvdXJjZS5ib3VuZGluZ0JveC5jbG9uZSgpO1xyXG5cdFx0aWYgKCBzb3VyY2UuYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB0aGlzLmJvdW5kaW5nU3BoZXJlID0gc291cmNlLmJvdW5kaW5nU3BoZXJlLmNsb25lKCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2V0cyB0aGUgY29sb3Igb2YgdGhlIGRlZmluZWQgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5zdGFuY2UgaW5kZXguXHJcblx0ICogQHBhcmFtIHtDb2xvcn0gY29sb3IgLSBUaGUgdGFyZ2V0IG9iamVjdCB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGhvZCdzIHJlc3VsdC5cclxuXHQgKi9cclxuXHRnZXRDb2xvckF0KCBpbmRleCwgY29sb3IgKSB7XHJcblxyXG5cdFx0Y29sb3IuZnJvbUFycmF5KCB0aGlzLmluc3RhbmNlQ29sb3IuYXJyYXksIGluZGV4ICogMyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdldHMgdGhlIGxvY2FsIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBvZiB0aGUgZGVmaW5lZCBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbnN0YW5jZSBpbmRleC5cclxuXHQgKiBAcGFyYW0ge01hdHJpeDR9IG1hdHJpeCAtIFRoZSB0YXJnZXQgb2JqZWN0IHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbWV0aG9kJ3MgcmVzdWx0LlxyXG5cdCAqL1xyXG5cdGdldE1hdHJpeEF0KCBpbmRleCwgbWF0cml4ICkge1xyXG5cclxuXHRcdG1hdHJpeC5mcm9tQXJyYXkoIHRoaXMuaW5zdGFuY2VNYXRyaXguYXJyYXksIGluZGV4ICogMTYgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZXRzIHRoZSBtb3JwaCB0YXJnZXQgd2VpZ2h0cyBvZiB0aGUgZGVmaW5lZCBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbnN0YW5jZSBpbmRleC5cclxuXHQgKiBAcGFyYW0ge01lc2h9IG9iamVjdCAtIFRoZSB0YXJnZXQgb2JqZWN0IHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbWV0aG9kJ3MgcmVzdWx0LlxyXG5cdCAqL1xyXG5cdGdldE1vcnBoQXQoIGluZGV4LCBvYmplY3QgKSB7XHJcblxyXG5cdFx0Y29uc3Qgb2JqZWN0SW5mbHVlbmNlcyA9IG9iamVjdC5tb3JwaFRhcmdldEluZmx1ZW5jZXM7XHJcblxyXG5cdFx0Y29uc3QgYXJyYXkgPSB0aGlzLm1vcnBoVGV4dHVyZS5zb3VyY2UuZGF0YS5kYXRhO1xyXG5cclxuXHRcdGNvbnN0IGxlbiA9IG9iamVjdEluZmx1ZW5jZXMubGVuZ3RoICsgMTsgLy8gQWxsIGluZmx1ZW5jZXMgKyB0aGUgYmFzZUluZmx1ZW5jZVN1bVxyXG5cclxuXHRcdGNvbnN0IGRhdGFJbmRleCA9IGluZGV4ICogbGVuICsgMTsgLy8gU2tpcCB0aGUgYmFzZUluZmx1ZW5jZVN1bSBhdCB0aGUgYmVnaW5uaW5nXHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgb2JqZWN0SW5mbHVlbmNlcy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRvYmplY3RJbmZsdWVuY2VzWyBpIF0gPSBhcnJheVsgZGF0YUluZGV4ICsgaSBdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRyYXljYXN0KCByYXljYXN0ZXIsIGludGVyc2VjdHMgKSB7XHJcblxyXG5cdFx0Y29uc3QgbWF0cml4V29ybGQgPSB0aGlzLm1hdHJpeFdvcmxkO1xyXG5cdFx0Y29uc3QgcmF5Y2FzdFRpbWVzID0gdGhpcy5jb3VudDtcclxuXHJcblx0XHRfbWVzaC5nZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XHJcblx0XHRfbWVzaC5tYXRlcmlhbCA9IHRoaXMubWF0ZXJpYWw7XHJcblxyXG5cdFx0aWYgKCBfbWVzaC5tYXRlcmlhbCA9PT0gdW5kZWZpbmVkICkgcmV0dXJuO1xyXG5cclxuXHRcdC8vIHRlc3Qgd2l0aCBib3VuZGluZyBzcGhlcmUgZmlyc3RcclxuXHJcblx0XHRpZiAoIHRoaXMuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSB0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xyXG5cclxuXHRcdF9zcGhlcmUuY29weSggdGhpcy5ib3VuZGluZ1NwaGVyZSApO1xyXG5cdFx0X3NwaGVyZS5hcHBseU1hdHJpeDQoIG1hdHJpeFdvcmxkICk7XHJcblxyXG5cdFx0aWYgKCByYXljYXN0ZXIucmF5LmludGVyc2VjdHNTcGhlcmUoIF9zcGhlcmUgKSA9PT0gZmFsc2UgKSByZXR1cm47XHJcblxyXG5cdFx0Ly8gbm93IHRlc3QgZWFjaCBpbnN0YW5jZVxyXG5cclxuXHRcdGZvciAoIGxldCBpbnN0YW5jZUlkID0gMDsgaW5zdGFuY2VJZCA8IHJheWNhc3RUaW1lczsgaW5zdGFuY2VJZCArKyApIHtcclxuXHJcblx0XHRcdC8vIGNhbGN1bGF0ZSB0aGUgd29ybGQgbWF0cml4IGZvciBlYWNoIGluc3RhbmNlXHJcblxyXG5cdFx0XHR0aGlzLmdldE1hdHJpeEF0KCBpbnN0YW5jZUlkLCBfaW5zdGFuY2VMb2NhbE1hdHJpeCApO1xyXG5cclxuXHRcdFx0X2luc3RhbmNlV29ybGRNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggbWF0cml4V29ybGQsIF9pbnN0YW5jZUxvY2FsTWF0cml4ICk7XHJcblxyXG5cdFx0XHQvLyB0aGUgbWVzaCByZXByZXNlbnRzIHRoaXMgc2luZ2xlIGluc3RhbmNlXHJcblxyXG5cdFx0XHRfbWVzaC5tYXRyaXhXb3JsZCA9IF9pbnN0YW5jZVdvcmxkTWF0cml4O1xyXG5cclxuXHRcdFx0X21lc2gucmF5Y2FzdCggcmF5Y2FzdGVyLCBfaW5zdGFuY2VJbnRlcnNlY3RzICk7XHJcblxyXG5cdFx0XHQvLyBwcm9jZXNzIHRoZSByZXN1bHQgb2YgcmF5Y2FzdFxyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gX2luc3RhbmNlSW50ZXJzZWN0cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBpbnRlcnNlY3QgPSBfaW5zdGFuY2VJbnRlcnNlY3RzWyBpIF07XHJcblx0XHRcdFx0aW50ZXJzZWN0Lmluc3RhbmNlSWQgPSBpbnN0YW5jZUlkO1xyXG5cdFx0XHRcdGludGVyc2VjdC5vYmplY3QgPSB0aGlzO1xyXG5cdFx0XHRcdGludGVyc2VjdHMucHVzaCggaW50ZXJzZWN0ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRfaW5zdGFuY2VJbnRlcnNlY3RzLmxlbmd0aCA9IDA7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGdpdmVuIGNvbG9yIHRvIHRoZSBkZWZpbmVkIGluc3RhbmNlLiBNYWtlIHN1cmUgeW91IHNldCB0aGUgYG5lZWRzVXBkYXRlYCBmbGFnIG9mXHJcblx0ICoge0BsaW5rIEluc3RhbmNlZE1lc2gjaW5zdGFuY2VDb2xvcn0gdG8gYHRydWVgIGFmdGVyIHVwZGF0aW5nIGFsbCB0aGUgY29sb3JzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluc3RhbmNlIGluZGV4LlxyXG5cdCAqIEBwYXJhbSB7Q29sb3J9IGNvbG9yIC0gVGhlIGluc3RhbmNlIGNvbG9yLlxyXG5cdCAqL1xyXG5cdHNldENvbG9yQXQoIGluZGV4LCBjb2xvciApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuaW5zdGFuY2VDb2xvciA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuaW5zdGFuY2VDb2xvciA9IG5ldyBJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUoIG5ldyBGbG9hdDMyQXJyYXkoIHRoaXMuaW5zdGFuY2VNYXRyaXguY291bnQgKiAzICkuZmlsbCggMSApLCAzICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbG9yLnRvQXJyYXkoIHRoaXMuaW5zdGFuY2VDb2xvci5hcnJheSwgaW5kZXggKiAzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZ2l2ZW4gbG9jYWwgdHJhbnNmb3JtYXRpb24gbWF0cml4IHRvIHRoZSBkZWZpbmVkIGluc3RhbmNlLiBNYWtlIHN1cmUgeW91IHNldCB0aGUgYG5lZWRzVXBkYXRlYCBmbGFnIG9mXHJcblx0ICoge0BsaW5rIEluc3RhbmNlZE1lc2gjaW5zdGFuY2VNYXRyaXh9IHRvIGB0cnVlYCBhZnRlciB1cGRhdGluZyBhbGwgdGhlIGNvbG9ycy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbnN0YW5jZSBpbmRleC5cclxuXHQgKiBAcGFyYW0ge01hdHJpeDR9IG1hdHJpeCAtIFRoZSBsb2NhbCB0cmFuc2Zvcm1hdGlvbi5cclxuXHQgKi9cclxuXHRzZXRNYXRyaXhBdCggaW5kZXgsIG1hdHJpeCApIHtcclxuXHJcblx0XHRtYXRyaXgudG9BcnJheSggdGhpcy5pbnN0YW5jZU1hdHJpeC5hcnJheSwgaW5kZXggKiAxNiApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIG1vcnBoIHRhcmdldCB3ZWlnaHRzIHRvIHRoZSBkZWZpbmVkIGluc3RhbmNlLiBNYWtlIHN1cmUgeW91IHNldCB0aGUgYG5lZWRzVXBkYXRlYCBmbGFnIG9mXHJcblx0ICoge0BsaW5rIEluc3RhbmNlZE1lc2gjbW9ycGhUZXh0dXJlfSB0byBgdHJ1ZWAgYWZ0ZXIgdXBkYXRpbmcgYWxsIHRoZSBpbmZsdWVuY2VzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluc3RhbmNlIGluZGV4LlxyXG5cdCAqIEBwYXJhbSB7TWVzaH0gb2JqZWN0IC0gIEEgbWVzaCB3aGljaCBgbW9ycGhUYXJnZXRJbmZsdWVuY2VzYCBwcm9wZXJ0eSBjb250YWluaW5nIHRoZSBtb3JwaCB0YXJnZXQgd2VpZ2h0c1xyXG5cdCAqIG9mIGEgc2luZ2xlIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldE1vcnBoQXQoIGluZGV4LCBvYmplY3QgKSB7XHJcblxyXG5cdFx0Y29uc3Qgb2JqZWN0SW5mbHVlbmNlcyA9IG9iamVjdC5tb3JwaFRhcmdldEluZmx1ZW5jZXM7XHJcblxyXG5cdFx0Y29uc3QgbGVuID0gb2JqZWN0SW5mbHVlbmNlcy5sZW5ndGggKyAxOyAvLyBtb3JwaEJhc2VJbmZsdWVuY2UgKyBhbGwgaW5mbHVlbmNlc1xyXG5cclxuXHRcdGlmICggdGhpcy5tb3JwaFRleHR1cmUgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLm1vcnBoVGV4dHVyZSA9IG5ldyBEYXRhVGV4dHVyZSggbmV3IEZsb2F0MzJBcnJheSggbGVuICogdGhpcy5jb3VudCApLCBsZW4sIHRoaXMuY291bnQsIFJlZEZvcm1hdCwgRmxvYXRUeXBlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGFycmF5ID0gdGhpcy5tb3JwaFRleHR1cmUuc291cmNlLmRhdGEuZGF0YTtcclxuXHJcblx0XHRsZXQgbW9ycGhJbmZsdWVuY2VzU3VtID0gMDtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBvYmplY3RJbmZsdWVuY2VzLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdG1vcnBoSW5mbHVlbmNlc1N1bSArPSBvYmplY3RJbmZsdWVuY2VzWyBpIF07XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IG1vcnBoQmFzZUluZmx1ZW5jZSA9IHRoaXMuZ2VvbWV0cnkubW9ycGhUYXJnZXRzUmVsYXRpdmUgPyAxIDogMSAtIG1vcnBoSW5mbHVlbmNlc1N1bTtcclxuXHJcblx0XHRjb25zdCBkYXRhSW5kZXggPSBsZW4gKiBpbmRleDtcclxuXHJcblx0XHRhcnJheVsgZGF0YUluZGV4IF0gPSBtb3JwaEJhc2VJbmZsdWVuY2U7XHJcblxyXG5cdFx0YXJyYXkuc2V0KCBvYmplY3RJbmZsdWVuY2VzLCBkYXRhSW5kZXggKyAxICk7XHJcblxyXG5cdH1cclxuXHJcblx0dXBkYXRlTW9ycGhUYXJnZXRzKCkge1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZyZWVzIHRoZSBHUFUtcmVsYXRlZCByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHRoaXMgaW5zdGFuY2UuIENhbGwgdGhpc1xyXG5cdCAqIG1ldGhvZCB3aGVuZXZlciB0aGlzIGluc3RhbmNlIGlzIG5vIGxvbmdlciB1c2VkIGluIHlvdXIgYXBwLlxyXG5cdCAqL1xyXG5cdGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdkaXNwb3NlJyB9ICk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm1vcnBoVGV4dHVyZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMubW9ycGhUZXh0dXJlLmRpc3Bvc2UoKTtcclxuXHRcdFx0dGhpcy5tb3JwaFRleHR1cmUgPSBudWxsO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgSW5zdGFuY2VkTWVzaCB9O1xyXG4iLCJpbXBvcnQgeyBNYXRyaXgzIH0gZnJvbSAnLi9NYXRyaXgzLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4vVmVjdG9yMy5qcyc7XHJcblxyXG5jb25zdCBfdmVjdG9yMSA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX3ZlY3RvcjIgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF9ub3JtYWxNYXRyaXggPSAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXgzKCk7XHJcblxyXG4vKipcclxuICogQSB0d28gZGltZW5zaW9uYWwgc3VyZmFjZSB0aGF0IGV4dGVuZHMgaW5maW5pdGVseSBpbiAzRCBzcGFjZSwgcmVwcmVzZW50ZWRcclxuICogaW4gW0hlc3NpYW4gbm9ybWFsIGZvcm1de0BsaW5rIGh0dHA6Ly9tYXRod29ybGQud29sZnJhbS5jb20vSGVzc2lhbk5vcm1hbEZvcm0uaHRtbH1cclxuICogYnkgYSB1bml0IGxlbmd0aCBub3JtYWwgdmVjdG9yIGFuZCBhIGNvbnN0YW50LlxyXG4gKi9cclxuY2xhc3MgUGxhbmUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHBsYW5lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBbbm9ybWFsPSgxLDAsMCldIC0gQSB1bml0IGxlbmd0aCB2ZWN0b3IgZGVmaW5pbmcgdGhlIG5vcm1hbCBvZiB0aGUgcGxhbmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtjb25zdGFudD0wXSAtIFRoZSBzaWduZWQgZGlzdGFuY2UgZnJvbSB0aGUgb3JpZ2luIHRvIHRoZSBwbGFuZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggbm9ybWFsID0gbmV3IFZlY3RvcjMoIDEsIDAsIDAgKSwgY29uc3RhbnQgPSAwICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1BsYW5lID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgdW5pdCBsZW5ndGggdmVjdG9yIGRlZmluaW5nIHRoZSBub3JtYWwgb2YgdGhlIHBsYW5lLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3IzfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vcm1hbCA9IG5vcm1hbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBzaWduZWQgZGlzdGFuY2UgZnJvbSB0aGUgb3JpZ2luIHRvIHRoZSBwbGFuZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvbnN0YW50ID0gY29uc3RhbnQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgcGxhbmUgY29tcG9uZW50cyBieSBjb3B5aW5nIHRoZSBnaXZlbiB2YWx1ZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IG5vcm1hbCAtIFRoZSBub3JtYWwuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGNvbnN0YW50IC0gVGhlIGNvbnN0YW50LlxyXG5cdCAqIEByZXR1cm4ge1BsYW5lfSBBIHJlZmVyZW5jZSB0byB0aGlzIHBsYW5lLlxyXG5cdCAqL1xyXG5cdHNldCggbm9ybWFsLCBjb25zdGFudCApIHtcclxuXHJcblx0XHR0aGlzLm5vcm1hbC5jb3B5KCBub3JtYWwgKTtcclxuXHRcdHRoaXMuY29uc3RhbnQgPSBjb25zdGFudDtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBwbGFuZSBjb21wb25lbnRzIGJ5IGRlZmluaW5nIGB4YCwgYHlgLCBgemAgYXMgdGhlXHJcblx0ICogcGxhbmUgbm9ybWFsIGFuZCBgd2AgYXMgdGhlIGNvbnN0YW50LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgdmFsdWUgZm9yIHRoZSBub3JtYWwncyB4IGNvbXBvbmVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB2YWx1ZSBmb3IgdGhlIG5vcm1hbCdzIHkgY29tcG9uZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB6IC0gVGhlIHZhbHVlIGZvciB0aGUgbm9ybWFsJ3MgeiBjb21wb25lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHcgLSBUaGUgY29uc3RhbnQgdmFsdWUuXHJcblx0ICogQHJldHVybiB7UGxhbmV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgcGxhbmUuXHJcblx0ICovXHJcblx0c2V0Q29tcG9uZW50cyggeCwgeSwgeiwgdyApIHtcclxuXHJcblx0XHR0aGlzLm5vcm1hbC5zZXQoIHgsIHksIHogKTtcclxuXHRcdHRoaXMuY29uc3RhbnQgPSB3O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHBsYW5lIGZyb20gdGhlIGdpdmVuIG5vcm1hbCBhbmQgY29wbGFuYXIgcG9pbnQgKHRoYXQgaXMgYSBwb2ludFxyXG5cdCAqIHRoYXQgbGllcyBvbnRvIHRoZSBwbGFuZSkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IG5vcm1hbCAtIFRoZSBub3JtYWwuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBwb2ludCAtIEEgY29wbGFuYXIgcG9pbnQuXHJcblx0ICogQHJldHVybiB7UGxhbmV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgcGxhbmUuXHJcblx0ICovXHJcblx0c2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQoIG5vcm1hbCwgcG9pbnQgKSB7XHJcblxyXG5cdFx0dGhpcy5ub3JtYWwuY29weSggbm9ybWFsICk7XHJcblx0XHR0aGlzLmNvbnN0YW50ID0gLSBwb2ludC5kb3QoIHRoaXMubm9ybWFsICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgcGxhbmUgZnJvbSB0aHJlZSBjb3BsYW5hciBwb2ludHMuIFRoZSB3aW5kaW5nIG9yZGVyIGlzXHJcblx0ICogYXNzdW1lZCB0byBiZSBjb3VudGVyLWNsb2Nrd2lzZSwgYW5kIGRldGVybWluZXMgdGhlIGRpcmVjdGlvbiBvZlxyXG5cdCAqIHRoZSBwbGFuZSBub3JtYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IGEgLSBUaGUgZmlyc3QgY29wbGFuYXIgcG9pbnQuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBiIC0gVGhlIHNlY29uZCBjb3BsYW5hciBwb2ludC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IGMgLSBUaGUgdGhpcmQgY29wbGFuYXIgcG9pbnQuXHJcblx0ICogQHJldHVybiB7UGxhbmV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgcGxhbmUuXHJcblx0ICovXHJcblx0c2V0RnJvbUNvcGxhbmFyUG9pbnRzKCBhLCBiLCBjICkge1xyXG5cclxuXHRcdGNvbnN0IG5vcm1hbCA9IF92ZWN0b3IxLnN1YlZlY3RvcnMoIGMsIGIgKS5jcm9zcyggX3ZlY3RvcjIuc3ViVmVjdG9ycyggYSwgYiApICkubm9ybWFsaXplKCk7XHJcblxyXG5cdFx0Ly8gUTogc2hvdWxkIGFuIGVycm9yIGJlIHRocm93biBpZiBub3JtYWwgaXMgemVybyAoZS5nLiBkZWdlbmVyYXRlIHBsYW5lKT9cclxuXHJcblx0XHR0aGlzLnNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50KCBub3JtYWwsIGEgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gcGxhbmUgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UGxhbmV9IHBsYW5lIC0gVGhlIHBsYW5lIHRvIGNvcHkuXHJcblx0ICogQHJldHVybiB7UGxhbmV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgcGxhbmUuXHJcblx0ICovXHJcblx0Y29weSggcGxhbmUgKSB7XHJcblxyXG5cdFx0dGhpcy5ub3JtYWwuY29weSggcGxhbmUubm9ybWFsICk7XHJcblx0XHR0aGlzLmNvbnN0YW50ID0gcGxhbmUuY29uc3RhbnQ7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTm9ybWFsaXplcyB0aGUgcGxhbmUgbm9ybWFsIGFuZCBhZGp1c3RzIHRoZSBjb25zdGFudCBhY2NvcmRpbmdseS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1BsYW5lfSBBIHJlZmVyZW5jZSB0byB0aGlzIHBsYW5lLlxyXG5cdCAqL1xyXG5cdG5vcm1hbGl6ZSgpIHtcclxuXHJcblx0XHQvLyBOb3RlOiB3aWxsIGxlYWQgdG8gYSBkaXZpZGUgYnkgemVybyBpZiB0aGUgcGxhbmUgaXMgaW52YWxpZC5cclxuXHJcblx0XHRjb25zdCBpbnZlcnNlTm9ybWFsTGVuZ3RoID0gMS4wIC8gdGhpcy5ub3JtYWwubGVuZ3RoKCk7XHJcblx0XHR0aGlzLm5vcm1hbC5tdWx0aXBseVNjYWxhciggaW52ZXJzZU5vcm1hbExlbmd0aCApO1xyXG5cdFx0dGhpcy5jb25zdGFudCAqPSBpbnZlcnNlTm9ybWFsTGVuZ3RoO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE5lZ2F0ZXMgYm90aCB0aGUgcGxhbmUgbm9ybWFsIGFuZCB0aGUgY29uc3RhbnQuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtQbGFuZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBwbGFuZS5cclxuXHQgKi9cclxuXHRuZWdhdGUoKSB7XHJcblxyXG5cdFx0dGhpcy5jb25zdGFudCAqPSAtIDE7XHJcblx0XHR0aGlzLm5vcm1hbC5uZWdhdGUoKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBzaWduZWQgZGlzdGFuY2UgZnJvbSB0aGUgZ2l2ZW4gcG9pbnQgdG8gdGhpcyBwbGFuZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gcG9pbnQgLSBUaGUgcG9pbnQgdG8gY29tcHV0ZSB0aGUgZGlzdGFuY2UgZm9yLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIHNpZ25lZCBkaXN0YW5jZS5cclxuXHQgKi9cclxuXHRkaXN0YW5jZVRvUG9pbnQoIHBvaW50ICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm5vcm1hbC5kb3QoIHBvaW50ICkgKyB0aGlzLmNvbnN0YW50O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHNpZ25lZCBkaXN0YW5jZSBmcm9tIHRoZSBnaXZlbiBzcGhlcmUgdG8gdGhpcyBwbGFuZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7U3BoZXJlfSBzcGhlcmUgLSBUaGUgc3BoZXJlIHRvIGNvbXB1dGUgdGhlIGRpc3RhbmNlIGZvci5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBzaWduZWQgZGlzdGFuY2UuXHJcblx0ICovXHJcblx0ZGlzdGFuY2VUb1NwaGVyZSggc3BoZXJlICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmRpc3RhbmNlVG9Qb2ludCggc3BoZXJlLmNlbnRlciApIC0gc3BoZXJlLnJhZGl1cztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQcm9qZWN0cyBhIHRoZSBnaXZlbiBwb2ludCBvbnRvIHRoZSBwbGFuZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gcG9pbnQgLSBUaGUgcG9pbnQgdG8gcHJvamVjdC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHRhcmdldCAtIFRoZSB0YXJnZXQgdmVjdG9yIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbWV0aG9kJ3MgcmVzdWx0LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IFRoZSBwcm9qZWN0ZWQgcG9pbnQgb24gdGhlIHBsYW5lLlxyXG5cdCAqL1xyXG5cdHByb2plY3RQb2ludCggcG9pbnQsIHRhcmdldCApIHtcclxuXHJcblx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIHBvaW50ICkuYWRkU2NhbGVkVmVjdG9yKCB0aGlzLm5vcm1hbCwgLSB0aGlzLmRpc3RhbmNlVG9Qb2ludCggcG9pbnQgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGludGVyc2VjdGlvbiBwb2ludCBvZiB0aGUgcGFzc2VkIGxpbmUgYW5kIHRoZSBwbGFuZS4gUmV0dXJuc1xyXG5cdCAqIGBudWxsYCBpZiB0aGUgbGluZSBkb2VzIG5vdCBpbnRlcnNlY3QuIFJldHVybnMgdGhlIGxpbmUncyBzdGFydGluZyBwb2ludCBpZlxyXG5cdCAqIHRoZSBsaW5lIGlzIGNvcGxhbmFyIHdpdGggdGhlIHBsYW5lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtMaW5lM30gbGluZSAtIFRoZSBsaW5lIHRvIGNvbXB1dGUgdGhlIGludGVyc2VjdGlvbiBmb3IuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IHZlY3RvciB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGhvZCdzIHJlc3VsdC5cclxuXHQgKiBAcmV0dXJuIHs/VmVjdG9yM30gVGhlIGludGVyc2VjdGlvbiBwb2ludC5cclxuXHQgKi9cclxuXHRpbnRlcnNlY3RMaW5lKCBsaW5lLCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0Y29uc3QgZGlyZWN0aW9uID0gbGluZS5kZWx0YSggX3ZlY3RvcjEgKTtcclxuXHJcblx0XHRjb25zdCBkZW5vbWluYXRvciA9IHRoaXMubm9ybWFsLmRvdCggZGlyZWN0aW9uICk7XHJcblxyXG5cdFx0aWYgKCBkZW5vbWluYXRvciA9PT0gMCApIHtcclxuXHJcblx0XHRcdC8vIGxpbmUgaXMgY29wbGFuYXIsIHJldHVybiBvcmlnaW5cclxuXHRcdFx0aWYgKCB0aGlzLmRpc3RhbmNlVG9Qb2ludCggbGluZS5zdGFydCApID09PSAwICkge1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIGxpbmUuc3RhcnQgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIFVuc3VyZSBpZiB0aGlzIGlzIHRoZSBjb3JyZWN0IG1ldGhvZCB0byBoYW5kbGUgdGhpcyBjYXNlLlxyXG5cdFx0XHRyZXR1cm4gbnVsbDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgdCA9IC0gKCBsaW5lLnN0YXJ0LmRvdCggdGhpcy5ub3JtYWwgKSArIHRoaXMuY29uc3RhbnQgKSAvIGRlbm9taW5hdG9yO1xyXG5cclxuXHRcdGlmICggdCA8IDAgfHwgdCA+IDEgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gbnVsbDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRhcmdldC5jb3B5KCBsaW5lLnN0YXJ0ICkuYWRkU2NhbGVkVmVjdG9yKCBkaXJlY3Rpb24sIHQgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gbGluZSBzZWdtZW50IGludGVyc2VjdHMgd2l0aCAocGFzc2VzIHRocm91Z2gpIHRoZSBwbGFuZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TGluZTN9IGxpbmUgLSBUaGUgbGluZSB0byB0ZXN0LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGdpdmVuIGxpbmUgc2VnbWVudCBpbnRlcnNlY3RzIHdpdGggdGhlIHBsYW5lIG9yIG5vdC5cclxuXHQgKi9cclxuXHRpbnRlcnNlY3RzTGluZSggbGluZSApIHtcclxuXHJcblx0XHQvLyBOb3RlOiB0aGlzIHRlc3RzIGlmIGEgbGluZSBpbnRlcnNlY3RzIHRoZSBwbGFuZSwgbm90IHdoZXRoZXIgaXQgKG9yIGl0cyBlbmQtcG9pbnRzKSBhcmUgY29wbGFuYXIgd2l0aCBpdC5cclxuXHJcblx0XHRjb25zdCBzdGFydFNpZ24gPSB0aGlzLmRpc3RhbmNlVG9Qb2ludCggbGluZS5zdGFydCApO1xyXG5cdFx0Y29uc3QgZW5kU2lnbiA9IHRoaXMuZGlzdGFuY2VUb1BvaW50KCBsaW5lLmVuZCApO1xyXG5cclxuXHRcdHJldHVybiAoIHN0YXJ0U2lnbiA8IDAgJiYgZW5kU2lnbiA+IDAgKSB8fCAoIGVuZFNpZ24gPCAwICYmIHN0YXJ0U2lnbiA+IDAgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gYm91bmRpbmcgYm94IGludGVyc2VjdHMgd2l0aCB0aGUgcGxhbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0JveDN9IGJveCAtIFRoZSBib3VuZGluZyBib3ggdG8gdGVzdC5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBnaXZlbiBib3VuZGluZyBib3ggaW50ZXJzZWN0cyB3aXRoIHRoZSBwbGFuZSBvciBub3QuXHJcblx0ICovXHJcblx0aW50ZXJzZWN0c0JveCggYm94ICkge1xyXG5cclxuXHRcdHJldHVybiBib3guaW50ZXJzZWN0c1BsYW5lKCB0aGlzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIGJvdW5kaW5nIHNwaGVyZSBpbnRlcnNlY3RzIHdpdGggdGhlIHBsYW5lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTcGhlcmV9IHNwaGVyZSAtIFRoZSBib3VuZGluZyBzcGhlcmUgdG8gdGVzdC5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBnaXZlbiBib3VuZGluZyBzcGhlcmUgaW50ZXJzZWN0cyB3aXRoIHRoZSBwbGFuZSBvciBub3QuXHJcblx0ICovXHJcblx0aW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICkge1xyXG5cclxuXHRcdHJldHVybiBzcGhlcmUuaW50ZXJzZWN0c1BsYW5lKCB0aGlzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIGNvcGxhbmFyIHZlY3RvciB0byB0aGUgcGxhbmUsIGJ5IGNhbGN1bGF0aW5nIHRoZVxyXG5cdCAqIHByb2plY3Rpb24gb2YgdGhlIG5vcm1hbCBhdCB0aGUgb3JpZ2luIG9udG8gdGhlIHBsYW5lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IHZlY3RvciB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGhvZCdzIHJlc3VsdC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBUaGUgY29wbGFuYXIgcG9pbnQuXHJcblx0ICovXHJcblx0Y29wbGFuYXJQb2ludCggdGFyZ2V0ICkge1xyXG5cclxuXHRcdHJldHVybiB0YXJnZXQuY29weSggdGhpcy5ub3JtYWwgKS5tdWx0aXBseVNjYWxhciggLSB0aGlzLmNvbnN0YW50ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQXBwbHkgYSA0eDQgbWF0cml4IHRvIHRoZSBwbGFuZS4gVGhlIG1hdHJpeCBtdXN0IGJlIGFuIGFmZmluZSwgaG9tb2dlbmVvdXMgdHJhbnNmb3JtLlxyXG5cdCAqXHJcblx0ICogVGhlIG9wdGlvbmFsIG5vcm1hbCBtYXRyaXggY2FuIGJlIHByZS1jb21wdXRlZCBsaWtlIHNvOlxyXG5cdCAqIGBgYGpzXHJcblx0ICogY29uc3Qgb3B0aW9uYWxOb3JtYWxNYXRyaXggPSBuZXcgVEhSRUUuTWF0cml4MygpLmdldE5vcm1hbE1hdHJpeCggbWF0cml4ICk7XHJcblx0ICogYGBgXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDR9IG1hdHJpeCAtIFRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguXHJcblx0ICogQHBhcmFtIHtNYXRyaXg0fSBbb3B0aW9uYWxOb3JtYWxNYXRyaXhdIC0gQSBwcmUtY29tcHV0ZWQgbm9ybWFsIG1hdHJpeC5cclxuXHQgKiBAcmV0dXJuIHtQbGFuZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBwbGFuZS5cclxuXHQgKi9cclxuXHRhcHBseU1hdHJpeDQoIG1hdHJpeCwgb3B0aW9uYWxOb3JtYWxNYXRyaXggKSB7XHJcblxyXG5cdFx0Y29uc3Qgbm9ybWFsTWF0cml4ID0gb3B0aW9uYWxOb3JtYWxNYXRyaXggfHwgX25vcm1hbE1hdHJpeC5nZXROb3JtYWxNYXRyaXgoIG1hdHJpeCApO1xyXG5cclxuXHRcdGNvbnN0IHJlZmVyZW5jZVBvaW50ID0gdGhpcy5jb3BsYW5hclBvaW50KCBfdmVjdG9yMSApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7XHJcblxyXG5cdFx0Y29uc3Qgbm9ybWFsID0gdGhpcy5ub3JtYWwuYXBwbHlNYXRyaXgzKCBub3JtYWxNYXRyaXggKS5ub3JtYWxpemUoKTtcclxuXHJcblx0XHR0aGlzLmNvbnN0YW50ID0gLSByZWZlcmVuY2VQb2ludC5kb3QoIG5vcm1hbCApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRyYW5zbGF0ZXMgdGhlIHBsYW5lIGJ5IHRoZSBkaXN0YW5jZSBkZWZpbmVkIGJ5IHRoZSBnaXZlbiBvZmZzZXQgdmVjdG9yLlxyXG5cdCAqIE5vdGUgdGhhdCB0aGlzIG9ubHkgYWZmZWN0cyB0aGUgcGxhbmUgY29uc3RhbnQgYW5kIHdpbGwgbm90IGFmZmVjdCB0aGUgbm9ybWFsIHZlY3Rvci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gb2Zmc2V0IC0gVGhlIG9mZnNldCB2ZWN0b3IuXHJcblx0ICogQHJldHVybiB7UGxhbmV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgcGxhbmUuXHJcblx0ICovXHJcblx0dHJhbnNsYXRlKCBvZmZzZXQgKSB7XHJcblxyXG5cdFx0dGhpcy5jb25zdGFudCAtPSBvZmZzZXQuZG90KCB0aGlzLm5vcm1hbCApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgcGxhbmUgaXMgZXF1YWwgd2l0aCB0aGUgZ2l2ZW4gb25lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtQbGFuZX0gcGxhbmUgLSBUaGUgcGxhbmUgdG8gdGVzdCBmb3IgZXF1YWxpdHkuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGlzIHBsYW5lIGlzIGVxdWFsIHdpdGggdGhlIGdpdmVuIG9uZS5cclxuXHQgKi9cclxuXHRlcXVhbHMoIHBsYW5lICkge1xyXG5cclxuXHRcdHJldHVybiBwbGFuZS5ub3JtYWwuZXF1YWxzKCB0aGlzLm5vcm1hbCApICYmICggcGxhbmUuY29uc3RhbnQgPT09IHRoaXMuY29uc3RhbnQgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbmV3IHBsYW5lIHdpdGggY29waWVkIHZhbHVlcyBmcm9tIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtQbGFuZX0gQSBjbG9uZSBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNsb25lKCkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgUGxhbmUgfTtcclxuIiwiaW1wb3J0IHsgV2ViR0xDb29yZGluYXRlU3lzdGVtLCBXZWJHUFVDb29yZGluYXRlU3lzdGVtIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4vVmVjdG9yMy5qcyc7XHJcbmltcG9ydCB7IFNwaGVyZSB9IGZyb20gJy4vU3BoZXJlLmpzJztcclxuaW1wb3J0IHsgUGxhbmUgfSBmcm9tICcuL1BsYW5lLmpzJztcclxuXHJcbmNvbnN0IF9zcGhlcmUgPSAvKkBfX1BVUkVfXyovIG5ldyBTcGhlcmUoKTtcclxuY29uc3QgX3ZlY3RvciA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuXHJcbi8qKlxyXG4gKiBGcnVzdHVtcyBhcmUgdXNlZCB0byBkZXRlcm1pbmUgd2hhdCBpcyBpbnNpZGUgdGhlIGNhbWVyYSdzIGZpZWxkIG9mIHZpZXcuXHJcbiAqIFRoZXkgaGVscCBzcGVlZCB1cCB0aGUgcmVuZGVyaW5nIHByb2Nlc3MgLSBvYmplY3RzIHdoaWNoIGxpZSBvdXRzaWRlIGEgY2FtZXJhJ3NcclxuICogZnJ1c3R1bSBjYW4gc2FmZWx5IGJlIGV4Y2x1ZGVkIGZyb20gcmVuZGVyaW5nLlxyXG4gKlxyXG4gKiBUaGlzIGNsYXNzIGlzIG1haW5seSBpbnRlbmRlZCBmb3IgdXNlIGludGVybmFsbHkgYnkgYSByZW5kZXJlci5cclxuICovXHJcbmNsYXNzIEZydXN0dW0ge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGZydXN0dW0uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1BsYW5lfSBbcDBdIC0gVGhlIGZpcnN0IHBsYW5lIHRoYXQgZW5jbG9zZXMgdGhlIGZydXN0dW0uXHJcblx0ICogQHBhcmFtIHtQbGFuZX0gW3AxXSAtIFRoZSBzZWNvbmQgcGxhbmUgdGhhdCBlbmNsb3NlcyB0aGUgZnJ1c3R1bS5cclxuXHQgKiBAcGFyYW0ge1BsYW5lfSBbcDJdIC0gVGhlIHRoaXJkIHBsYW5lIHRoYXQgZW5jbG9zZXMgdGhlIGZydXN0dW0uXHJcblx0ICogQHBhcmFtIHtQbGFuZX0gW3AzXSAtIFRoZSBmb3VydGggcGxhbmUgdGhhdCBlbmNsb3NlcyB0aGUgZnJ1c3R1bS5cclxuXHQgKiBAcGFyYW0ge1BsYW5lfSBbcDRdIC0gVGhlIGZpZnRoIHBsYW5lIHRoYXQgZW5jbG9zZXMgdGhlIGZydXN0dW0uXHJcblx0ICogQHBhcmFtIHtQbGFuZX0gW3A1XSAtIFRoZSBzaXh0aCBwbGFuZSB0aGF0IGVuY2xvc2VzIHRoZSBmcnVzdHVtLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwMCA9IG5ldyBQbGFuZSgpLCBwMSA9IG5ldyBQbGFuZSgpLCBwMiA9IG5ldyBQbGFuZSgpLCBwMyA9IG5ldyBQbGFuZSgpLCBwNCA9IG5ldyBQbGFuZSgpLCBwNSA9IG5ldyBQbGFuZSgpICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBhcnJheSBob2xkcyB0aGUgcGxhbmVzIHRoYXQgZW5jbG9zZSB0aGUgZnJ1c3R1bS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8UGxhbmU+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBsYW5lcyA9IFsgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSBdO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGZydXN0dW0gcGxhbmVzIGJ5IGNvcHlpbmcgdGhlIGdpdmVuIHBsYW5lcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UGxhbmV9IFtwMF0gLSBUaGUgZmlyc3QgcGxhbmUgdGhhdCBlbmNsb3NlcyB0aGUgZnJ1c3R1bS5cclxuXHQgKiBAcGFyYW0ge1BsYW5lfSBbcDFdIC0gVGhlIHNlY29uZCBwbGFuZSB0aGF0IGVuY2xvc2VzIHRoZSBmcnVzdHVtLlxyXG5cdCAqIEBwYXJhbSB7UGxhbmV9IFtwMl0gLSBUaGUgdGhpcmQgcGxhbmUgdGhhdCBlbmNsb3NlcyB0aGUgZnJ1c3R1bS5cclxuXHQgKiBAcGFyYW0ge1BsYW5lfSBbcDNdIC0gVGhlIGZvdXJ0aCBwbGFuZSB0aGF0IGVuY2xvc2VzIHRoZSBmcnVzdHVtLlxyXG5cdCAqIEBwYXJhbSB7UGxhbmV9IFtwNF0gLSBUaGUgZmlmdGggcGxhbmUgdGhhdCBlbmNsb3NlcyB0aGUgZnJ1c3R1bS5cclxuXHQgKiBAcGFyYW0ge1BsYW5lfSBbcDVdIC0gVGhlIHNpeHRoIHBsYW5lIHRoYXQgZW5jbG9zZXMgdGhlIGZydXN0dW0uXHJcblx0ICogQHJldHVybiB7RnJ1c3R1bX0gQSByZWZlcmVuY2UgdG8gdGhpcyBmcnVzdHVtLlxyXG5cdCAqL1xyXG5cdHNldCggcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSApIHtcclxuXHJcblx0XHRjb25zdCBwbGFuZXMgPSB0aGlzLnBsYW5lcztcclxuXHJcblx0XHRwbGFuZXNbIDAgXS5jb3B5KCBwMCApO1xyXG5cdFx0cGxhbmVzWyAxIF0uY29weSggcDEgKTtcclxuXHRcdHBsYW5lc1sgMiBdLmNvcHkoIHAyICk7XHJcblx0XHRwbGFuZXNbIDMgXS5jb3B5KCBwMyApO1xyXG5cdFx0cGxhbmVzWyA0IF0uY29weSggcDQgKTtcclxuXHRcdHBsYW5lc1sgNSBdLmNvcHkoIHA1ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29waWVzIHRoZSB2YWx1ZXMgb2YgdGhlIGdpdmVuIGZydXN0dW0gdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7RnJ1c3R1bX0gZnJ1c3R1bSAtIFRoZSBmcnVzdHVtIHRvIGNvcHkuXHJcblx0ICogQHJldHVybiB7RnJ1c3R1bX0gQSByZWZlcmVuY2UgdG8gdGhpcyBmcnVzdHVtLlxyXG5cdCAqL1xyXG5cdGNvcHkoIGZydXN0dW0gKSB7XHJcblxyXG5cdFx0Y29uc3QgcGxhbmVzID0gdGhpcy5wbGFuZXM7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgNjsgaSArKyApIHtcclxuXHJcblx0XHRcdHBsYW5lc1sgaSBdLmNvcHkoIGZydXN0dW0ucGxhbmVzWyBpIF0gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZnJ1c3R1bSBwbGFuZXMgZnJvbSB0aGUgZ2l2ZW4gcHJvamVjdGlvbiBtYXRyaXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDR9IG0gLSBUaGUgcHJvamVjdGlvbiBtYXRyaXguXHJcblx0ICogQHBhcmFtIHsoV2ViR0xDb29yZGluYXRlU3lzdGVtfFdlYkdQVUNvb3JkaW5hdGVTeXN0ZW0pfSBjb29yZGluYXRlU3lzdGVtIC0gVGhlIGNvb3JkaW5hdGUgc3lzdGVtLlxyXG5cdCAqIEByZXR1cm4ge0ZydXN0dW19IEEgcmVmZXJlbmNlIHRvIHRoaXMgZnJ1c3R1bS5cclxuXHQgKi9cclxuXHRzZXRGcm9tUHJvamVjdGlvbk1hdHJpeCggbSwgY29vcmRpbmF0ZVN5c3RlbSA9IFdlYkdMQ29vcmRpbmF0ZVN5c3RlbSApIHtcclxuXHJcblx0XHRjb25zdCBwbGFuZXMgPSB0aGlzLnBsYW5lcztcclxuXHRcdGNvbnN0IG1lID0gbS5lbGVtZW50cztcclxuXHRcdGNvbnN0IG1lMCA9IG1lWyAwIF0sIG1lMSA9IG1lWyAxIF0sIG1lMiA9IG1lWyAyIF0sIG1lMyA9IG1lWyAzIF07XHJcblx0XHRjb25zdCBtZTQgPSBtZVsgNCBdLCBtZTUgPSBtZVsgNSBdLCBtZTYgPSBtZVsgNiBdLCBtZTcgPSBtZVsgNyBdO1xyXG5cdFx0Y29uc3QgbWU4ID0gbWVbIDggXSwgbWU5ID0gbWVbIDkgXSwgbWUxMCA9IG1lWyAxMCBdLCBtZTExID0gbWVbIDExIF07XHJcblx0XHRjb25zdCBtZTEyID0gbWVbIDEyIF0sIG1lMTMgPSBtZVsgMTMgXSwgbWUxNCA9IG1lWyAxNCBdLCBtZTE1ID0gbWVbIDE1IF07XHJcblxyXG5cdFx0cGxhbmVzWyAwIF0uc2V0Q29tcG9uZW50cyggbWUzIC0gbWUwLCBtZTcgLSBtZTQsIG1lMTEgLSBtZTgsIG1lMTUgLSBtZTEyICkubm9ybWFsaXplKCk7XHJcblx0XHRwbGFuZXNbIDEgXS5zZXRDb21wb25lbnRzKCBtZTMgKyBtZTAsIG1lNyArIG1lNCwgbWUxMSArIG1lOCwgbWUxNSArIG1lMTIgKS5ub3JtYWxpemUoKTtcclxuXHRcdHBsYW5lc1sgMiBdLnNldENvbXBvbmVudHMoIG1lMyArIG1lMSwgbWU3ICsgbWU1LCBtZTExICsgbWU5LCBtZTE1ICsgbWUxMyApLm5vcm1hbGl6ZSgpO1xyXG5cdFx0cGxhbmVzWyAzIF0uc2V0Q29tcG9uZW50cyggbWUzIC0gbWUxLCBtZTcgLSBtZTUsIG1lMTEgLSBtZTksIG1lMTUgLSBtZTEzICkubm9ybWFsaXplKCk7XHJcblx0XHRwbGFuZXNbIDQgXS5zZXRDb21wb25lbnRzKCBtZTMgLSBtZTIsIG1lNyAtIG1lNiwgbWUxMSAtIG1lMTAsIG1lMTUgLSBtZTE0ICkubm9ybWFsaXplKCk7XHJcblxyXG5cdFx0aWYgKCBjb29yZGluYXRlU3lzdGVtID09PSBXZWJHTENvb3JkaW5hdGVTeXN0ZW0gKSB7XHJcblxyXG5cdFx0XHRwbGFuZXNbIDUgXS5zZXRDb21wb25lbnRzKCBtZTMgKyBtZTIsIG1lNyArIG1lNiwgbWUxMSArIG1lMTAsIG1lMTUgKyBtZTE0ICkubm9ybWFsaXplKCk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggY29vcmRpbmF0ZVN5c3RlbSA9PT0gV2ViR1BVQ29vcmRpbmF0ZVN5c3RlbSApIHtcclxuXHJcblx0XHRcdHBsYW5lc1sgNSBdLnNldENvbXBvbmVudHMoIG1lMiwgbWU2LCBtZTEwLCBtZTE0ICkubm9ybWFsaXplKCk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHRocm93IG5ldyBFcnJvciggJ1RIUkVFLkZydXN0dW0uc2V0RnJvbVByb2plY3Rpb25NYXRyaXgoKTogSW52YWxpZCBjb29yZGluYXRlIHN5c3RlbTogJyArIGNvb3JkaW5hdGVTeXN0ZW0gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIDNEIG9iamVjdCdzIGJvdW5kaW5nIHNwaGVyZSBpcyBpbnRlcnNlY3RpbmcgdGhpcyBmcnVzdHVtLlxyXG5cdCAqXHJcblx0ICogTm90ZSB0aGF0IHRoZSAzRCBvYmplY3QgbXVzdCBoYXZlIGEgZ2VvbWV0cnkgc28gdGhhdCB0aGUgYm91bmRpbmcgc3BoZXJlIGNhbiBiZSBjYWxjdWxhdGVkLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3QzRH0gb2JqZWN0IC0gVGhlIDNEIG9iamVjdCB0byB0ZXN0LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIDNEIG9iamVjdCdzIGJvdW5kaW5nIHNwaGVyZSBpcyBpbnRlcnNlY3RpbmcgdGhpcyBmcnVzdHVtIG9yIG5vdC5cclxuXHQgKi9cclxuXHRpbnRlcnNlY3RzT2JqZWN0KCBvYmplY3QgKSB7XHJcblxyXG5cdFx0aWYgKCBvYmplY3QuYm91bmRpbmdTcGhlcmUgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGlmICggb2JqZWN0LmJvdW5kaW5nU3BoZXJlID09PSBudWxsICkgb2JqZWN0LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xyXG5cclxuXHRcdFx0X3NwaGVyZS5jb3B5KCBvYmplY3QuYm91bmRpbmdTcGhlcmUgKS5hcHBseU1hdHJpeDQoIG9iamVjdC5tYXRyaXhXb3JsZCApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRjb25zdCBnZW9tZXRyeSA9IG9iamVjdC5nZW9tZXRyeTtcclxuXHJcblx0XHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSBnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcclxuXHJcblx0XHRcdF9zcGhlcmUuY29weSggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgKS5hcHBseU1hdHJpeDQoIG9iamVjdC5tYXRyaXhXb3JsZCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKCBfc3BoZXJlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIHNwcml0ZSBpcyBpbnRlcnNlY3RpbmcgdGhpcyBmcnVzdHVtLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTcHJpdGV9IHNwcml0ZSAtIFRoZSBzcHJpdGUgdG8gdGVzdC5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBzcHJpdGUgaXMgaW50ZXJzZWN0aW5nIHRoaXMgZnJ1c3R1bSBvciBub3QuXHJcblx0ICovXHJcblx0aW50ZXJzZWN0c1Nwcml0ZSggc3ByaXRlICkge1xyXG5cclxuXHRcdF9zcGhlcmUuY2VudGVyLnNldCggMCwgMCwgMCApO1xyXG5cdFx0X3NwaGVyZS5yYWRpdXMgPSAwLjcwNzEwNjc4MTE4NjU0NzY7XHJcblx0XHRfc3BoZXJlLmFwcGx5TWF0cml4NCggc3ByaXRlLm1hdHJpeFdvcmxkICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0c1NwaGVyZSggX3NwaGVyZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBnaXZlbiBib3VuZGluZyBzcGhlcmUgaXMgaW50ZXJzZWN0aW5nIHRoaXMgZnJ1c3R1bS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7U3BoZXJlfSBzcGhlcmUgLSBUaGUgYm91bmRpbmcgc3BoZXJlIHRvIHRlc3QuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgYm91bmRpbmcgc3BoZXJlIGlzIGludGVyc2VjdGluZyB0aGlzIGZydXN0dW0gb3Igbm90LlxyXG5cdCAqL1xyXG5cdGludGVyc2VjdHNTcGhlcmUoIHNwaGVyZSApIHtcclxuXHJcblx0XHRjb25zdCBwbGFuZXMgPSB0aGlzLnBsYW5lcztcclxuXHRcdGNvbnN0IGNlbnRlciA9IHNwaGVyZS5jZW50ZXI7XHJcblx0XHRjb25zdCBuZWdSYWRpdXMgPSAtIHNwaGVyZS5yYWRpdXM7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgNjsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGRpc3RhbmNlID0gcGxhbmVzWyBpIF0uZGlzdGFuY2VUb1BvaW50KCBjZW50ZXIgKTtcclxuXHJcblx0XHRcdGlmICggZGlzdGFuY2UgPCBuZWdSYWRpdXMgKSB7XHJcblxyXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIGJvdW5kaW5nIGJveCBpcyBpbnRlcnNlY3RpbmcgdGhpcyBmcnVzdHVtLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCb3gzfSBib3ggLSBUaGUgYm91bmRpbmcgYm94IHRvIHRlc3QuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgYm91bmRpbmcgYm94IGlzIGludGVyc2VjdGluZyB0aGlzIGZydXN0dW0gb3Igbm90LlxyXG5cdCAqL1xyXG5cdGludGVyc2VjdHNCb3goIGJveCApIHtcclxuXHJcblx0XHRjb25zdCBwbGFuZXMgPSB0aGlzLnBsYW5lcztcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCA2OyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgcGxhbmUgPSBwbGFuZXNbIGkgXTtcclxuXHJcblx0XHRcdC8vIGNvcm5lciBhdCBtYXggZGlzdGFuY2VcclxuXHJcblx0XHRcdF92ZWN0b3IueCA9IHBsYW5lLm5vcm1hbC54ID4gMCA/IGJveC5tYXgueCA6IGJveC5taW4ueDtcclxuXHRcdFx0X3ZlY3Rvci55ID0gcGxhbmUubm9ybWFsLnkgPiAwID8gYm94Lm1heC55IDogYm94Lm1pbi55O1xyXG5cdFx0XHRfdmVjdG9yLnogPSBwbGFuZS5ub3JtYWwueiA+IDAgPyBib3gubWF4LnogOiBib3gubWluLno7XHJcblxyXG5cdFx0XHRpZiAoIHBsYW5lLmRpc3RhbmNlVG9Qb2ludCggX3ZlY3RvciApIDwgMCApIHtcclxuXHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gcG9pbnQgbGllcyB3aXRoaW4gdGhlIGZydXN0dW0uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHBvaW50IC0gVGhlIHBvaW50IHRvIHRlc3QuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgcG9pbnQgbGllcyB3aXRoaW4gdGhpcyBmcnVzdHVtIG9yIG5vdC5cclxuXHQgKi9cclxuXHRjb250YWluc1BvaW50KCBwb2ludCApIHtcclxuXHJcblx0XHRjb25zdCBwbGFuZXMgPSB0aGlzLnBsYW5lcztcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCA2OyBpICsrICkge1xyXG5cclxuXHRcdFx0aWYgKCBwbGFuZXNbIGkgXS5kaXN0YW5jZVRvUG9pbnQoIHBvaW50ICkgPCAwICkge1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBuZXcgZnJ1c3R1bSB3aXRoIGNvcGllZCB2YWx1ZXMgZnJvbSB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7RnJ1c3R1bX0gQSBjbG9uZSBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNsb25lKCkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCB7IEZydXN0dW0gfTtcclxuIiwiaW1wb3J0IHsgQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5pbXBvcnQgeyBCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyR2VvbWV0cnkuanMnO1xyXG5pbXBvcnQgeyBEYXRhVGV4dHVyZSB9IGZyb20gJy4uL3RleHR1cmVzL0RhdGFUZXh0dXJlLmpzJztcclxuaW1wb3J0IHsgRmxvYXRUeXBlLCBSZWRJbnRlZ2VyRm9ybWF0LCBVbnNpZ25lZEludFR5cGUsIFJHQkFGb3JtYXQgfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBNYXRyaXg0IH0gZnJvbSAnLi4vbWF0aC9NYXRyaXg0LmpzJztcclxuaW1wb3J0IHsgTWVzaCB9IGZyb20gJy4vTWVzaC5qcyc7XHJcbmltcG9ydCB7IENvbG9yTWFuYWdlbWVudCB9IGZyb20gJy4uL21hdGgvQ29sb3JNYW5hZ2VtZW50LmpzJztcclxuaW1wb3J0IHsgQm94MyB9IGZyb20gJy4uL21hdGgvQm94My5qcyc7XHJcbmltcG9ydCB7IFNwaGVyZSB9IGZyb20gJy4uL21hdGgvU3BoZXJlLmpzJztcclxuaW1wb3J0IHsgRnJ1c3R1bSB9IGZyb20gJy4uL21hdGgvRnJ1c3R1bS5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uL21hdGgvQ29sb3IuanMnO1xyXG5cclxuZnVuY3Rpb24gYXNjSWRTb3J0KCBhLCBiICkge1xyXG5cclxuXHRyZXR1cm4gYSAtIGI7XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBzb3J0T3BhcXVlKCBhLCBiICkge1xyXG5cclxuXHRyZXR1cm4gYS56IC0gYi56O1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gc29ydFRyYW5zcGFyZW50KCBhLCBiICkge1xyXG5cclxuXHRyZXR1cm4gYi56IC0gYS56O1xyXG5cclxufVxyXG5cclxuY2xhc3MgTXVsdGlEcmF3UmVuZGVyTGlzdCB7XHJcblxyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cclxuXHRcdHRoaXMuaW5kZXggPSAwO1xyXG5cdFx0dGhpcy5wb29sID0gW107XHJcblx0XHR0aGlzLmxpc3QgPSBbXTtcclxuXHJcblx0fVxyXG5cclxuXHRwdXNoKCBzdGFydCwgY291bnQsIHosIGluZGV4ICkge1xyXG5cclxuXHRcdGNvbnN0IHBvb2wgPSB0aGlzLnBvb2w7XHJcblx0XHRjb25zdCBsaXN0ID0gdGhpcy5saXN0O1xyXG5cdFx0aWYgKCB0aGlzLmluZGV4ID49IHBvb2wubGVuZ3RoICkge1xyXG5cclxuXHRcdFx0cG9vbC5wdXNoKCB7XHJcblxyXG5cdFx0XHRcdHN0YXJ0OiAtIDEsXHJcblx0XHRcdFx0Y291bnQ6IC0gMSxcclxuXHRcdFx0XHR6OiAtIDEsXHJcblx0XHRcdFx0aW5kZXg6IC0gMSxcclxuXHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgaXRlbSA9IHBvb2xbIHRoaXMuaW5kZXggXTtcclxuXHRcdGxpc3QucHVzaCggaXRlbSApO1xyXG5cdFx0dGhpcy5pbmRleCArKztcclxuXHJcblx0XHRpdGVtLnN0YXJ0ID0gc3RhcnQ7XHJcblx0XHRpdGVtLmNvdW50ID0gY291bnQ7XHJcblx0XHRpdGVtLnogPSB6O1xyXG5cdFx0aXRlbS5pbmRleCA9IGluZGV4O1xyXG5cclxuXHR9XHJcblxyXG5cdHJlc2V0KCkge1xyXG5cclxuXHRcdHRoaXMubGlzdC5sZW5ndGggPSAwO1xyXG5cdFx0dGhpcy5pbmRleCA9IDA7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmNvbnN0IF9tYXRyaXggPSAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXg0KCk7XHJcbmNvbnN0IF93aGl0ZUNvbG9yID0gLypAX19QVVJFX18qLyBuZXcgQ29sb3IoIDEsIDEsIDEgKTtcclxuY29uc3QgX2ZydXN0dW0gPSAvKkBfX1BVUkVfXyovIG5ldyBGcnVzdHVtKCk7XHJcbmNvbnN0IF9ib3ggPSAvKkBfX1BVUkVfXyovIG5ldyBCb3gzKCk7XHJcbmNvbnN0IF9zcGhlcmUgPSAvKkBfX1BVUkVfXyovIG5ldyBTcGhlcmUoKTtcclxuY29uc3QgX3ZlY3RvciA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX2ZvcndhcmQgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF90ZW1wID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfcmVuZGVyTGlzdCA9IC8qQF9fUFVSRV9fKi8gbmV3IE11bHRpRHJhd1JlbmRlckxpc3QoKTtcclxuY29uc3QgX21lc2ggPSAvKkBfX1BVUkVfXyovIG5ldyBNZXNoKCk7XHJcbmNvbnN0IF9iYXRjaEludGVyc2VjdHMgPSBbXTtcclxuXHJcbi8vIGNvcGllcyBkYXRhIGZyb20gYXR0cmlidXRlIFwic3JjXCIgaW50byBcInRhcmdldFwiIHN0YXJ0aW5nIGF0IFwidGFyZ2V0T2Zmc2V0XCJcclxuZnVuY3Rpb24gY29weUF0dHJpYnV0ZURhdGEoIHNyYywgdGFyZ2V0LCB0YXJnZXRPZmZzZXQgPSAwICkge1xyXG5cclxuXHRjb25zdCBpdGVtU2l6ZSA9IHRhcmdldC5pdGVtU2l6ZTtcclxuXHRpZiAoIHNyYy5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlIHx8IHNyYy5hcnJheS5jb25zdHJ1Y3RvciAhPT0gdGFyZ2V0LmFycmF5LmNvbnN0cnVjdG9yICkge1xyXG5cclxuXHRcdC8vIHVzZSB0aGUgY29tcG9uZW50IGdldHRlcnMgYW5kIHNldHRlcnMgaWYgdGhlIGFycmF5IGRhdGEgY2Fubm90XHJcblx0XHQvLyBiZSBjb3BpZWQgZGlyZWN0bHlcclxuXHRcdGNvbnN0IHZlcnRleENvdW50ID0gc3JjLmNvdW50O1xyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdmVydGV4Q291bnQ7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgYyA9IDA7IGMgPCBpdGVtU2l6ZTsgYyArKyApIHtcclxuXHJcblx0XHRcdFx0dGFyZ2V0LnNldENvbXBvbmVudCggaSArIHRhcmdldE9mZnNldCwgYywgc3JjLmdldENvbXBvbmVudCggaSwgYyApICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9IGVsc2Uge1xyXG5cclxuXHRcdC8vIGZhc3RlciBjb3B5IGFwcHJvYWNoIHVzaW5nIHR5cGVkIGFycmF5IHNldCBmdW5jdGlvblxyXG5cdFx0dGFyZ2V0LmFycmF5LnNldCggc3JjLmFycmF5LCB0YXJnZXRPZmZzZXQgKiBpdGVtU2l6ZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdHRhcmdldC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG59XHJcblxyXG4vLyBzYWZlbHkgY29waWVzIGFycmF5IGNvbnRlbnRzIHRvIGEgcG90ZW50aWFsbHkgc21hbGxlciBhcnJheVxyXG5mdW5jdGlvbiBjb3B5QXJyYXlDb250ZW50cyggc3JjLCB0YXJnZXQgKSB7XHJcblxyXG5cdGlmICggc3JjLmNvbnN0cnVjdG9yICE9PSB0YXJnZXQuY29uc3RydWN0b3IgKSB7XHJcblxyXG5cdFx0Ly8gaWYgYXJyYXlzIGFyZSBvZiBhIGRpZmZlcmVudCB0eXBlIChlZyBkdWUgdG8gaW5kZXggc2l6ZSBpbmNyZWFzaW5nKSB0aGVuIGRhdGEgbXVzdCBiZSBwZXItZWxlbWVudCBjb3BpZWRcclxuXHRcdGNvbnN0IGxlbiA9IE1hdGgubWluKCBzcmMubGVuZ3RoLCB0YXJnZXQubGVuZ3RoICk7XHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBsZW47IGkgKysgKSB7XHJcblxyXG5cdFx0XHR0YXJnZXRbIGkgXSA9IHNyY1sgaSBdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fSBlbHNlIHtcclxuXHJcblx0XHQvLyBpZiB0aGUgYXJyYXlzIHVzZSB0aGUgc2FtZSBkYXRhIGxheW91dCB3ZSBjYW4gdXNlIGEgZmFzdCBibG9jayBjb3B5XHJcblx0XHRjb25zdCBsZW4gPSBNYXRoLm1pbiggc3JjLmxlbmd0aCwgdGFyZ2V0Lmxlbmd0aCApO1xyXG5cdFx0dGFyZ2V0LnNldCggbmV3IHNyYy5jb25zdHJ1Y3Rvciggc3JjLmJ1ZmZlciwgMCwgbGVuICkgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIEEgc3BlY2lhbCB2ZXJzaW9uIG9mIGEgbWVzaCB3aXRoIG11bHRpIGRyYXcgYmF0Y2ggcmVuZGVyaW5nIHN1cHBvcnQuIFVzZVxyXG4gKiB0aGlzIGNsYXNzIGlmIHlvdSBoYXZlIHRvIHJlbmRlciBhIGxhcmdlIG51bWJlciBvZiBvYmplY3RzIHdpdGggdGhlIHNhbWVcclxuICogbWF0ZXJpYWwgYnV0IHdpdGggZGlmZmVyZW50IGdlb21ldHJpZXMgb3Igd29ybGQgdHJhbnNmb3JtYXRpb25zLiBUaGUgdXNhZ2Ugb2ZcclxuICogYEJhdGNoZWRNZXNoYCB3aWxsIGhlbHAgeW91IHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGRyYXcgY2FsbHMgYW5kIHRodXMgaW1wcm92ZSB0aGUgb3ZlcmFsbFxyXG4gKiByZW5kZXJpbmcgcGVyZm9ybWFuY2UgaW4geW91ciBhcHBsaWNhdGlvbi5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgYm94ID0gbmV3IFRIUkVFLkJveEdlb21ldHJ5KCAxLCAxLCAxICk7XHJcbiAqIGNvbnN0IHNwaGVyZSA9IG5ldyBUSFJFRS5TcGhlcmVHZW9tZXRyeSggMSwgMTIsIDEyICk7XHJcbiAqIGNvbnN0IG1hdGVyaWFsID0gbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiAweDAwZmYwMCB9ICk7XHJcbiAqXHJcbiAqIC8vIGluaXRpYWxpemUgYW5kIGFkZCBnZW9tZXRyaWVzIGludG8gdGhlIGJhdGNoZWQgbWVzaFxyXG4gKiBjb25zdCBiYXRjaGVkTWVzaCA9IG5ldyBCYXRjaGVkTWVzaCggMTAsIDUwMDAsIDEwMDAwLCBtYXRlcmlhbCApO1xyXG4gKiBjb25zdCBib3hHZW9tZXRyeUlkID0gYmF0Y2hlZE1lc2guYWRkR2VvbWV0cnkoIGJveCApO1xyXG4gKiBjb25zdCBzcGhlcmVHZW9tZXRyeUlkID0gYmF0Y2hlZE1lc2guYWRkR2VvbWV0cnkoIHNwaGVyZSApO1xyXG4gKlxyXG4gKiAvLyBjcmVhdGUgaW5zdGFuY2VzIG9mIHRob3NlIGdlb21ldHJpZXNcclxuICogY29uc3QgYm94SW5zdGFuY2VkSWQxID0gYmF0Y2hlZE1lc2guYWRkSW5zdGFuY2UoIGJveEdlb21ldHJ5SWQgKTtcclxuICogY29uc3QgYm94SW5zdGFuY2VkSWQyID0gYmF0Y2hlZE1lc2guYWRkSW5zdGFuY2UoIGJveEdlb21ldHJ5SWQgKTtcclxuICpcclxuICogY29uc3Qgc3BoZXJlSW5zdGFuY2VkSWQxID0gYmF0Y2hlZE1lc2guYWRkSW5zdGFuY2UoIHNwaGVyZUdlb21ldHJ5SWQgKTtcclxuICogY29uc3Qgc3BoZXJlSW5zdGFuY2VkSWQyID0gYmF0Y2hlZE1lc2guYWRkSW5zdGFuY2UoIHNwaGVyZUdlb21ldHJ5SWQgKTtcclxuICpcclxuICogLy8gcG9zaXRpb24gdGhlIGdlb21ldHJpZXNcclxuICogYmF0Y2hlZE1lc2guc2V0TWF0cml4QXQoIGJveEluc3RhbmNlZElkMSwgYm94TWF0cml4MSApO1xyXG4gKiBiYXRjaGVkTWVzaC5zZXRNYXRyaXhBdCggYm94SW5zdGFuY2VkSWQyLCBib3hNYXRyaXgyICk7XHJcbiAqXHJcbiAqIGJhdGNoZWRNZXNoLnNldE1hdHJpeEF0KCBzcGhlcmVJbnN0YW5jZWRJZDEsIHNwaGVyZU1hdHJpeDEgKTtcclxuICogYmF0Y2hlZE1lc2guc2V0TWF0cml4QXQoIHNwaGVyZUluc3RhbmNlZElkMiwgc3BoZXJlTWF0cml4MiApO1xyXG4gKlxyXG4gKiBzY2VuZS5hZGQoIGJhdGNoZWRNZXNoICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTWVzaFxyXG4gKi9cclxuY2xhc3MgQmF0Y2hlZE1lc2ggZXh0ZW5kcyBNZXNoIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBiYXRjaGVkIG1lc2guXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbWF4SW5zdGFuY2VDb3VudCAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiBpbmRpdmlkdWFsIGluc3RhbmNlcyBwbGFubmVkIHRvIGJlIGFkZGVkIGFuZCByZW5kZXJlZC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbWF4VmVydGV4Q291bnQgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgdmVydGljZXMgdG8gYmUgdXNlZCBieSBhbGwgdW5pcXVlIGdlb21ldHJpZXMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFttYXhJbmRleENvdW50PW1heFZlcnRleENvdW50KjJdIC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIGluZGljZXMgdG8gYmUgdXNlZCBieSBhbGwgdW5pcXVlIGdlb21ldHJpZXNcclxuXHQgKiBAcGFyYW0ge01hdGVyaWFsfEFycmF5PE1hdGVyaWFsPn0gW21hdGVyaWFsXSAtIFRoZSBtZXNoIG1hdGVyaWFsLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBtYXhJbnN0YW5jZUNvdW50LCBtYXhWZXJ0ZXhDb3VudCwgbWF4SW5kZXhDb3VudCA9IG1heFZlcnRleENvdW50ICogMiwgbWF0ZXJpYWwgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5ldyBCdWZmZXJHZW9tZXRyeSgpLCBtYXRlcmlhbCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0JhdGNoZWRNZXNoID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZW4gc2V0IG90IGB0cnVlYCwgdGhlIGluZGl2aWR1YWwgb2JqZWN0cyBvZiBhIGJhdGNoIGFyZSBmcnVzdHVtIGN1bGxlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wZXJPYmplY3RGcnVzdHVtQ3VsbGVkID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZW4gc2V0IHRvIGB0cnVlYCwgdGhlIGluZGl2aWR1YWwgb2JqZWN0cyBvZiBhIGJhdGNoIGFyZSBzb3J0ZWQgdG8gaW1wcm92ZSBvdmVyZHJhdy1yZWxhdGVkIGFydGlmYWN0cy5cclxuXHRcdCAqIElmIHRoZSBtYXRlcmlhbCBpcyBtYXJrZWQgYXMgXCJ0cmFuc3BhcmVudFwiIG9iamVjdHMgYXJlIHJlbmRlcmVkIGJhY2sgdG8gZnJvbnQgYW5kIGlmIG5vdCB0aGVuIHRoZXkgYXJlXHJcblx0XHQgKiByZW5kZXJlZCBmcm9udCB0byBiYWNrLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNvcnRPYmplY3RzID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBib3VuZGluZyBib3ggb2YgdGhlIGJhdGNoZWQgbWVzaC4gQ2FuIGJlIGNvbXB1dGVkIHZpYSB7QGxpbmsgQmF0Y2hlZE1lc2gjY29tcHV0ZUJvdW5kaW5nQm94fS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P0JveDN9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYm91bmRpbmdCb3ggPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGJvdW5kaW5nIHNwaGVyZSBvZiB0aGUgYmF0Y2hlZCBtZXNoLiBDYW4gYmUgY29tcHV0ZWQgdmlhIHtAbGluayBCYXRjaGVkTWVzaCNjb21wdXRlQm91bmRpbmdTcGhlcmV9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/U3BoZXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRha2VzIGEgc29ydCBhIGZ1bmN0aW9uIHRoYXQgaXMgcnVuIGJlZm9yZSByZW5kZXIuIFRoZSBmdW5jdGlvbiB0YWtlcyBhIGxpc3Qgb2YgaW5zdGFuY2VzIHRvXHJcblx0XHQgKiBzb3J0IGFuZCBhIGNhbWVyYS4gVGhlIG9iamVjdHMgaW4gdGhlIGxpc3QgaW5jbHVkZSBhIFwielwiIGZpZWxkIHRvIHBlcmZvcm0gYSBkZXB0aC1vcmRlcmVkXHJcblx0XHQgKiBzb3J0IHdpdGguXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9GdW5jdGlvbn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jdXN0b21Tb3J0ID0gbnVsbDtcclxuXHJcblx0XHQvLyBzdG9yZXMgdmlzaWJsZSwgYWN0aXZlLCBhbmQgZ2VvbWV0cnkgaWQgcGVyIGluc3RhbmNlIGFuZCByZXNlcnZlZCBidWZmZXIgcmFuZ2VzIGZvciBnZW9tZXRyaWVzXHJcblx0XHR0aGlzLl9pbnN0YW5jZUluZm8gPSBbXTtcclxuXHRcdHRoaXMuX2dlb21ldHJ5SW5mbyA9IFtdO1xyXG5cclxuXHRcdC8vIGluc3RhbmNlLCBnZW9tZXRyeSBpZHMgdGhhdCBoYXZlIGJlZW4gc2V0IGFzIGluYWN0aXZlLCBhbmQgYXJlIGF2YWlsYWJsZSB0byBiZSBvdmVyd3JpdHRlblxyXG5cdFx0dGhpcy5fYXZhaWxhYmxlSW5zdGFuY2VJZHMgPSBbXTtcclxuXHRcdHRoaXMuX2F2YWlsYWJsZUdlb21ldHJ5SWRzID0gW107XHJcblxyXG5cdFx0Ly8gdXNlZCB0byB0cmFjayB3aGVyZSB0aGUgbmV4dCBwb2ludCBpcyB0aGF0IGdlb21ldHJ5IHNob3VsZCBiZSBpbnNlcnRlZFxyXG5cdFx0dGhpcy5fbmV4dEluZGV4U3RhcnQgPSAwO1xyXG5cdFx0dGhpcy5fbmV4dFZlcnRleFN0YXJ0ID0gMDtcclxuXHRcdHRoaXMuX2dlb21ldHJ5Q291bnQgPSAwO1xyXG5cclxuXHRcdC8vIGZsYWdzXHJcblx0XHR0aGlzLl92aXNpYmlsaXR5Q2hhbmdlZCA9IHRydWU7XHJcblx0XHR0aGlzLl9nZW9tZXRyeUluaXRpYWxpemVkID0gZmFsc2U7XHJcblxyXG5cdFx0Ly8gY2FjaGVkIHVzZXIgb3B0aW9uc1xyXG5cdFx0dGhpcy5fbWF4SW5zdGFuY2VDb3VudCA9IG1heEluc3RhbmNlQ291bnQ7XHJcblx0XHR0aGlzLl9tYXhWZXJ0ZXhDb3VudCA9IG1heFZlcnRleENvdW50O1xyXG5cdFx0dGhpcy5fbWF4SW5kZXhDb3VudCA9IG1heEluZGV4Q291bnQ7XHJcblxyXG5cdFx0Ly8gYnVmZmVycyBmb3IgbXVsdGkgZHJhd1xyXG5cdFx0dGhpcy5fbXVsdGlEcmF3Q291bnRzID0gbmV3IEludDMyQXJyYXkoIG1heEluc3RhbmNlQ291bnQgKTtcclxuXHRcdHRoaXMuX211bHRpRHJhd1N0YXJ0cyA9IG5ldyBJbnQzMkFycmF5KCBtYXhJbnN0YW5jZUNvdW50ICk7XHJcblx0XHR0aGlzLl9tdWx0aURyYXdDb3VudCA9IDA7XHJcblx0XHR0aGlzLl9tdWx0aURyYXdJbnN0YW5jZXMgPSBudWxsO1xyXG5cclxuXHRcdC8vIExvY2FsIG1hdHJpeCBwZXIgZ2VvbWV0cnkgYnkgdXNpbmcgZGF0YSB0ZXh0dXJlXHJcblx0XHR0aGlzLl9tYXRyaWNlc1RleHR1cmUgPSBudWxsO1xyXG5cdFx0dGhpcy5faW5kaXJlY3RUZXh0dXJlID0gbnVsbDtcclxuXHRcdHRoaXMuX2NvbG9yc1RleHR1cmUgPSBudWxsO1xyXG5cclxuXHRcdHRoaXMuX2luaXRNYXRyaWNlc1RleHR1cmUoKTtcclxuXHRcdHRoaXMuX2luaXRJbmRpcmVjdFRleHR1cmUoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgaW5kaXZpZHVhbCBpbnN0YW5jZXMgdGhhdCBjYW4gYmUgc3RvcmVkIGluIHRoZSBiYXRjaC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0ICogQHJlYWRvbmx5XHJcblx0ICovXHJcblx0Z2V0IG1heEluc3RhbmNlQ291bnQoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX21heEluc3RhbmNlQ291bnQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGluc3RhbmNlIGNvdW50LlxyXG5cdCAqXHJcblx0ICogQHR5cGUge251bWJlcn1cclxuXHQgKiBAcmVhZG9ubHlcclxuXHQgKi9cclxuXHRnZXQgaW5zdGFuY2VDb3VudCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5faW5zdGFuY2VJbmZvLmxlbmd0aCAtIHRoaXMuX2F2YWlsYWJsZUluc3RhbmNlSWRzLmxlbmd0aDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgbnVtYmVyIG9mIHVudXNlZCB2ZXJ0aWNlcy5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0ICogQHJlYWRvbmx5XHJcblx0ICovXHJcblx0Z2V0IHVudXNlZFZlcnRleENvdW50KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9tYXhWZXJ0ZXhDb3VudCAtIHRoaXMuX25leHRWZXJ0ZXhTdGFydDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgbnVtYmVyIG9mIHVudXNlZCBpbmRpY2VzLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge251bWJlcn1cclxuXHQgKiBAcmVhZG9ubHlcclxuXHQgKi9cclxuXHRnZXQgdW51c2VkSW5kZXhDb3VudCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fbWF4SW5kZXhDb3VudCAtIHRoaXMuX25leHRJbmRleFN0YXJ0O1xyXG5cclxuXHR9XHJcblxyXG5cdF9pbml0TWF0cmljZXNUZXh0dXJlKCkge1xyXG5cclxuXHRcdC8vIGxheW91dCAoMSBtYXRyaXggPSA0IHBpeGVscylcclxuXHRcdC8vICAgICAgUkdCQSBSR0JBIFJHQkEgUkdCQSAoPT4gY29sdW1uMSwgY29sdW1uMiwgY29sdW1uMywgY29sdW1uNClcclxuXHRcdC8vICB3aXRoICA4eDggIHBpeGVsIHRleHR1cmUgbWF4ICAgMTYgbWF0cmljZXMgKiA0IHBpeGVscyA9ICAoOCAqIDgpXHJcblx0XHQvLyAgICAgICAxNngxNiBwaXhlbCB0ZXh0dXJlIG1heCAgIDY0IG1hdHJpY2VzICogNCBwaXhlbHMgPSAoMTYgKiAxNilcclxuXHRcdC8vICAgICAgIDMyeDMyIHBpeGVsIHRleHR1cmUgbWF4ICAyNTYgbWF0cmljZXMgKiA0IHBpeGVscyA9ICgzMiAqIDMyKVxyXG5cdFx0Ly8gICAgICAgNjR4NjQgcGl4ZWwgdGV4dHVyZSBtYXggMTAyNCBtYXRyaWNlcyAqIDQgcGl4ZWxzID0gKDY0ICogNjQpXHJcblxyXG5cdFx0bGV0IHNpemUgPSBNYXRoLnNxcnQoIHRoaXMuX21heEluc3RhbmNlQ291bnQgKiA0ICk7IC8vIDQgcGl4ZWxzIG5lZWRlZCBmb3IgMSBtYXRyaXhcclxuXHRcdHNpemUgPSBNYXRoLmNlaWwoIHNpemUgLyA0ICkgKiA0O1xyXG5cdFx0c2l6ZSA9IE1hdGgubWF4KCBzaXplLCA0ICk7XHJcblxyXG5cdFx0Y29uc3QgbWF0cmljZXNBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoIHNpemUgKiBzaXplICogNCApOyAvLyA0IGZsb2F0cyBwZXIgUkdCQSBwaXhlbFxyXG5cdFx0Y29uc3QgbWF0cmljZXNUZXh0dXJlID0gbmV3IERhdGFUZXh0dXJlKCBtYXRyaWNlc0FycmF5LCBzaXplLCBzaXplLCBSR0JBRm9ybWF0LCBGbG9hdFR5cGUgKTtcclxuXHJcblx0XHR0aGlzLl9tYXRyaWNlc1RleHR1cmUgPSBtYXRyaWNlc1RleHR1cmU7XHJcblxyXG5cdH1cclxuXHJcblx0X2luaXRJbmRpcmVjdFRleHR1cmUoKSB7XHJcblxyXG5cdFx0bGV0IHNpemUgPSBNYXRoLnNxcnQoIHRoaXMuX21heEluc3RhbmNlQ291bnQgKTtcclxuXHRcdHNpemUgPSBNYXRoLmNlaWwoIHNpemUgKTtcclxuXHJcblx0XHRjb25zdCBpbmRpcmVjdEFycmF5ID0gbmV3IFVpbnQzMkFycmF5KCBzaXplICogc2l6ZSApO1xyXG5cdFx0Y29uc3QgaW5kaXJlY3RUZXh0dXJlID0gbmV3IERhdGFUZXh0dXJlKCBpbmRpcmVjdEFycmF5LCBzaXplLCBzaXplLCBSZWRJbnRlZ2VyRm9ybWF0LCBVbnNpZ25lZEludFR5cGUgKTtcclxuXHJcblx0XHR0aGlzLl9pbmRpcmVjdFRleHR1cmUgPSBpbmRpcmVjdFRleHR1cmU7XHJcblxyXG5cdH1cclxuXHJcblx0X2luaXRDb2xvcnNUZXh0dXJlKCkge1xyXG5cclxuXHRcdGxldCBzaXplID0gTWF0aC5zcXJ0KCB0aGlzLl9tYXhJbnN0YW5jZUNvdW50ICk7XHJcblx0XHRzaXplID0gTWF0aC5jZWlsKCBzaXplICk7XHJcblxyXG5cdFx0Ly8gNCBmbG9hdHMgcGVyIFJHQkEgcGl4ZWwgaW5pdGlhbGl6ZWQgdG8gd2hpdGVcclxuXHRcdGNvbnN0IGNvbG9yc0FycmF5ID0gbmV3IEZsb2F0MzJBcnJheSggc2l6ZSAqIHNpemUgKiA0ICkuZmlsbCggMSApO1xyXG5cdFx0Y29uc3QgY29sb3JzVGV4dHVyZSA9IG5ldyBEYXRhVGV4dHVyZSggY29sb3JzQXJyYXksIHNpemUsIHNpemUsIFJHQkFGb3JtYXQsIEZsb2F0VHlwZSApO1xyXG5cdFx0Y29sb3JzVGV4dHVyZS5jb2xvclNwYWNlID0gQ29sb3JNYW5hZ2VtZW50LndvcmtpbmdDb2xvclNwYWNlO1xyXG5cclxuXHRcdHRoaXMuX2NvbG9yc1RleHR1cmUgPSBjb2xvcnNUZXh0dXJlO1xyXG5cclxuXHR9XHJcblxyXG5cdF9pbml0aWFsaXplR2VvbWV0cnkoIHJlZmVyZW5jZSApIHtcclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XHJcblx0XHRjb25zdCBtYXhWZXJ0ZXhDb3VudCA9IHRoaXMuX21heFZlcnRleENvdW50O1xyXG5cdFx0Y29uc3QgbWF4SW5kZXhDb3VudCA9IHRoaXMuX21heEluZGV4Q291bnQ7XHJcblx0XHRpZiAoIHRoaXMuX2dlb21ldHJ5SW5pdGlhbGl6ZWQgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0Zm9yICggY29uc3QgYXR0cmlidXRlTmFtZSBpbiByZWZlcmVuY2UuYXR0cmlidXRlcyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3Qgc3JjQXR0cmlidXRlID0gcmVmZXJlbmNlLmdldEF0dHJpYnV0ZSggYXR0cmlidXRlTmFtZSApO1xyXG5cdFx0XHRcdGNvbnN0IHsgYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkIH0gPSBzcmNBdHRyaWJ1dGU7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGRzdEFycmF5ID0gbmV3IGFycmF5LmNvbnN0cnVjdG9yKCBtYXhWZXJ0ZXhDb3VudCAqIGl0ZW1TaXplICk7XHJcblx0XHRcdFx0Y29uc3QgZHN0QXR0cmlidXRlID0gbmV3IEJ1ZmZlckF0dHJpYnV0ZSggZHN0QXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7XHJcblxyXG5cdFx0XHRcdGdlb21ldHJ5LnNldEF0dHJpYnV0ZSggYXR0cmlidXRlTmFtZSwgZHN0QXR0cmlidXRlICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHJlZmVyZW5jZS5nZXRJbmRleCgpICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHQvLyBSZXNlcnZlIGxhc3QgdTE2IGluZGV4IGZvciBwcmltaXRpdmUgcmVzdGFydC5cclxuXHRcdFx0XHRjb25zdCBpbmRleEFycmF5ID0gbWF4VmVydGV4Q291bnQgPiA2NTUzNVxyXG5cdFx0XHRcdFx0PyBuZXcgVWludDMyQXJyYXkoIG1heEluZGV4Q291bnQgKVxyXG5cdFx0XHRcdFx0OiBuZXcgVWludDE2QXJyYXkoIG1heEluZGV4Q291bnQgKTtcclxuXHJcblx0XHRcdFx0Z2VvbWV0cnkuc2V0SW5kZXgoIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIGluZGV4QXJyYXksIDEgKSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5fZ2VvbWV0cnlJbml0aWFsaXplZCA9IHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8vIE1ha2Ugc3VyZSB0aGUgZ2VvbWV0cnkgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBleGlzdGluZyBjb21iaW5lZCBnZW9tZXRyeSBhdHRyaWJ1dGVzXHJcblx0X3ZhbGlkYXRlR2VvbWV0cnkoIGdlb21ldHJ5ICkge1xyXG5cclxuXHRcdC8vIGNoZWNrIHRvIGVuc3VyZSB0aGUgZ2VvbWV0cmllcyBhcmUgdXNpbmcgY29uc2lzdGVudCBhdHRyaWJ1dGVzIGFuZCBpbmRpY2VzXHJcblx0XHRjb25zdCBiYXRjaEdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcclxuXHRcdGlmICggQm9vbGVhbiggZ2VvbWV0cnkuZ2V0SW5kZXgoKSApICE9PSBCb29sZWFuKCBiYXRjaEdlb21ldHJ5LmdldEluZGV4KCkgKSApIHtcclxuXHJcblx0XHRcdHRocm93IG5ldyBFcnJvciggJ1RIUkVFLkJhdGNoZWRNZXNoOiBBbGwgZ2VvbWV0cmllcyBtdXN0IGNvbnNpc3RlbnRseSBoYXZlIFwiaW5kZXhcIi4nICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZvciAoIGNvbnN0IGF0dHJpYnV0ZU5hbWUgaW4gYmF0Y2hHZW9tZXRyeS5hdHRyaWJ1dGVzICkge1xyXG5cclxuXHRcdFx0aWYgKCAhIGdlb21ldHJ5Lmhhc0F0dHJpYnV0ZSggYXR0cmlidXRlTmFtZSApICkge1xyXG5cclxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoIGBUSFJFRS5CYXRjaGVkTWVzaDogQWRkZWQgZ2VvbWV0cnkgbWlzc2luZyBcIiR7IGF0dHJpYnV0ZU5hbWUgfVwiLiBBbGwgZ2VvbWV0cmllcyBtdXN0IGhhdmUgY29uc2lzdGVudCBhdHRyaWJ1dGVzLmAgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IHNyY0F0dHJpYnV0ZSA9IGdlb21ldHJ5LmdldEF0dHJpYnV0ZSggYXR0cmlidXRlTmFtZSApO1xyXG5cdFx0XHRjb25zdCBkc3RBdHRyaWJ1dGUgPSBiYXRjaEdlb21ldHJ5LmdldEF0dHJpYnV0ZSggYXR0cmlidXRlTmFtZSApO1xyXG5cdFx0XHRpZiAoIHNyY0F0dHJpYnV0ZS5pdGVtU2l6ZSAhPT0gZHN0QXR0cmlidXRlLml0ZW1TaXplIHx8IHNyY0F0dHJpYnV0ZS5ub3JtYWxpemVkICE9PSBkc3RBdHRyaWJ1dGUubm9ybWFsaXplZCApIHtcclxuXHJcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuQmF0Y2hlZE1lc2g6IEFsbCBhdHRyaWJ1dGVzIG11c3QgaGF2ZSBhIGNvbnNpc3RlbnQgaXRlbVNpemUgYW5kIG5vcm1hbGl6ZWQgdmFsdWUuJyApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBWYWxpZGF0ZXMgdGhlIGluc3RhbmNlIGRlZmluZWQgYnkgdGhlIGdpdmVuIElELlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluc3RhbmNlSWQgLSBUaGUgaW5zdGFuY2UgdG8gdmFsaWRhdGUuXHJcblx0ICovXHJcblx0dmFsaWRhdGVJbnN0YW5jZUlkKCBpbnN0YW5jZUlkICkge1xyXG5cclxuXHRcdGNvbnN0IGluc3RhbmNlSW5mbyA9IHRoaXMuX2luc3RhbmNlSW5mbztcclxuXHRcdGlmICggaW5zdGFuY2VJZCA8IDAgfHwgaW5zdGFuY2VJZCA+PSBpbnN0YW5jZUluZm8ubGVuZ3RoIHx8IGluc3RhbmNlSW5mb1sgaW5zdGFuY2VJZCBdLmFjdGl2ZSA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoIGBUSFJFRS5CYXRjaGVkTWVzaDogSW52YWxpZCBpbnN0YW5jZUlkICR7aW5zdGFuY2VJZH0uIEluc3RhbmNlIGlzIGVpdGhlciBvdXQgb2YgcmFuZ2Ugb3IgaGFzIGJlZW4gZGVsZXRlZC5gICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFZhbGlkYXRlcyB0aGUgZ2VvbWV0cnkgZGVmaW5lZCBieSB0aGUgZ2l2ZW4gSUQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZ2VvbWV0cnlJZCAtIFRoZSBnZW9tZXRyeSB0byB2YWxpZGF0ZS5cclxuXHQgKi9cclxuXHR2YWxpZGF0ZUdlb21ldHJ5SWQoIGdlb21ldHJ5SWQgKSB7XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnlJbmZvTGlzdCA9IHRoaXMuX2dlb21ldHJ5SW5mbztcclxuXHRcdGlmICggZ2VvbWV0cnlJZCA8IDAgfHwgZ2VvbWV0cnlJZCA+PSBnZW9tZXRyeUluZm9MaXN0Lmxlbmd0aCB8fCBnZW9tZXRyeUluZm9MaXN0WyBnZW9tZXRyeUlkIF0uYWN0aXZlID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdHRocm93IG5ldyBFcnJvciggYFRIUkVFLkJhdGNoZWRNZXNoOiBJbnZhbGlkIGdlb21ldHJ5SWQgJHtnZW9tZXRyeUlkfS4gR2VvbWV0cnkgaXMgZWl0aGVyIG91dCBvZiByYW5nZSBvciBoYXMgYmVlbiBkZWxldGVkLmAgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGFrZXMgYSBzb3J0IGEgZnVuY3Rpb24gdGhhdCBpcyBydW4gYmVmb3JlIHJlbmRlci4gVGhlIGZ1bmN0aW9uIHRha2VzIGEgbGlzdCBvZiBpbnN0YW5jZXMgdG9cclxuXHQgKiBzb3J0IGFuZCBhIGNhbWVyYS4gVGhlIG9iamVjdHMgaW4gdGhlIGxpc3QgaW5jbHVkZSBhIFwielwiIGZpZWxkIHRvIHBlcmZvcm0gYSBkZXB0aC1vcmRlcmVkIHNvcnQgd2l0aC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgLSBUaGUgY3VzdG9tIHNvcnQgZnVuY3Rpb24uXHJcblx0ICogQHJldHVybiB7QmF0Y2hlZE1lc2h9IEEgcmVmZXJlbmNlIHRvIHRoaXMgYmF0Y2hlZCBtZXNoLlxyXG5cdCAqL1xyXG5cdHNldEN1c3RvbVNvcnQoIGZ1bmMgKSB7XHJcblxyXG5cdFx0dGhpcy5jdXN0b21Tb3J0ID0gZnVuYztcclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSBib3VuZGluZyBib3gsIHVwZGF0aW5nIHtAbGluayBCYXRjaGVkTWVzaCNib3VuZGluZ0JveH0uXHJcblx0ICogQm91bmRpbmcgYm94ZXMgYXJlbid0IGNvbXB1dGVkIGJ5IGRlZmF1bHQuIFRoZXkgbmVlZCB0byBiZSBleHBsaWNpdGx5IGNvbXB1dGVkLFxyXG5cdCAqIG90aGVyd2lzZSB0aGV5IGFyZSBgbnVsbGAuXHJcblx0ICovXHJcblx0Y29tcHV0ZUJvdW5kaW5nQm94KCkge1xyXG5cclxuXHRcdGlmICggdGhpcy5ib3VuZGluZ0JveCA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuYm91bmRpbmdCb3ggPSBuZXcgQm94MygpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBib3VuZGluZ0JveCA9IHRoaXMuYm91bmRpbmdCb3g7XHJcblx0XHRjb25zdCBpbnN0YW5jZUluZm8gPSB0aGlzLl9pbnN0YW5jZUluZm87XHJcblxyXG5cdFx0Ym91bmRpbmdCb3gubWFrZUVtcHR5KCk7XHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBpbnN0YW5jZUluZm8ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGlmICggaW5zdGFuY2VJbmZvWyBpIF0uYWN0aXZlID09PSBmYWxzZSApIGNvbnRpbnVlO1xyXG5cclxuXHRcdFx0Y29uc3QgZ2VvbWV0cnlJZCA9IGluc3RhbmNlSW5mb1sgaSBdLmdlb21ldHJ5SW5kZXg7XHJcblx0XHRcdHRoaXMuZ2V0TWF0cml4QXQoIGksIF9tYXRyaXggKTtcclxuXHRcdFx0dGhpcy5nZXRCb3VuZGluZ0JveEF0KCBnZW9tZXRyeUlkLCBfYm94ICkuYXBwbHlNYXRyaXg0KCBfbWF0cml4ICk7XHJcblx0XHRcdGJvdW5kaW5nQm94LnVuaW9uKCBfYm94ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSBib3VuZGluZyBzcGhlcmUsIHVwZGF0aW5nIHtAbGluayBCYXRjaGVkTWVzaCNib3VuZGluZ1NwaGVyZX0uXHJcblx0ICogQm91bmRpbmcgc3BoZXJlcyBhcmVuJ3QgY29tcHV0ZWQgYnkgZGVmYXVsdC4gVGhleSBuZWVkIHRvIGJlIGV4cGxpY2l0bHkgY29tcHV0ZWQsXHJcblx0ICogb3RoZXJ3aXNlIHRoZXkgYXJlIGBudWxsYC5cclxuXHQgKi9cclxuXHRjb21wdXRlQm91bmRpbmdTcGhlcmUoKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmJvdW5kaW5nU3BoZXJlID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IG5ldyBTcGhlcmUoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgYm91bmRpbmdTcGhlcmUgPSB0aGlzLmJvdW5kaW5nU3BoZXJlO1xyXG5cdFx0Y29uc3QgaW5zdGFuY2VJbmZvID0gdGhpcy5faW5zdGFuY2VJbmZvO1xyXG5cclxuXHRcdGJvdW5kaW5nU3BoZXJlLm1ha2VFbXB0eSgpO1xyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gaW5zdGFuY2VJbmZvLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGluc3RhbmNlSW5mb1sgaSBdLmFjdGl2ZSA9PT0gZmFsc2UgKSBjb250aW51ZTtcclxuXHJcblx0XHRcdGNvbnN0IGdlb21ldHJ5SWQgPSBpbnN0YW5jZUluZm9bIGkgXS5nZW9tZXRyeUluZGV4O1xyXG5cdFx0XHR0aGlzLmdldE1hdHJpeEF0KCBpLCBfbWF0cml4ICk7XHJcblx0XHRcdHRoaXMuZ2V0Qm91bmRpbmdTcGhlcmVBdCggZ2VvbWV0cnlJZCwgX3NwaGVyZSApLmFwcGx5TWF0cml4NCggX21hdHJpeCApO1xyXG5cdFx0XHRib3VuZGluZ1NwaGVyZS51bmlvbiggX3NwaGVyZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIGEgbmV3IGluc3RhbmNlIHRvIHRoZSBiYXRjaCB1c2luZyB0aGUgZ2VvbWV0cnkgb2YgdGhlIGdpdmVuIElEIGFuZCByZXR1cm5zXHJcblx0ICogYSBuZXcgaWQgcmVmZXJyaW5nIHRvIHRoZSBuZXcgaW5zdGFuY2UgdG8gYmUgdXNlZCBieSBvdGhlciBmdW5jdGlvbnMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZ2VvbWV0cnlJZCAtIFRoZSBJRCBvZiBhIHByZXZpb3VzbHkgYWRkZWQgZ2VvbWV0cnkgdmlhIHtAbGluayBCYXRjaGVkTWVzaCNhZGRHZW9tZXRyeX0uXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgaW5zdGFuY2UgSUQuXHJcblx0ICovXHJcblx0YWRkSW5zdGFuY2UoIGdlb21ldHJ5SWQgKSB7XHJcblxyXG5cdFx0Y29uc3QgYXRDYXBhY2l0eSA9IHRoaXMuX2luc3RhbmNlSW5mby5sZW5ndGggPj0gdGhpcy5tYXhJbnN0YW5jZUNvdW50O1xyXG5cclxuXHRcdC8vIGVuc3VyZSB3ZSdyZSBub3Qgb3ZlciBnZW9tZXRyeVxyXG5cdFx0aWYgKCBhdENhcGFjaXR5ICYmIHRoaXMuX2F2YWlsYWJsZUluc3RhbmNlSWRzLmxlbmd0aCA9PT0gMCApIHtcclxuXHJcblx0XHRcdHRocm93IG5ldyBFcnJvciggJ1RIUkVFLkJhdGNoZWRNZXNoOiBNYXhpbXVtIGl0ZW0gY291bnQgcmVhY2hlZC4nICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGluc3RhbmNlSW5mbyA9IHtcclxuXHRcdFx0dmlzaWJsZTogdHJ1ZSxcclxuXHRcdFx0YWN0aXZlOiB0cnVlLFxyXG5cdFx0XHRnZW9tZXRyeUluZGV4OiBnZW9tZXRyeUlkLFxyXG5cdFx0fTtcclxuXHJcblx0XHRsZXQgZHJhd0lkID0gbnVsbDtcclxuXHJcblx0XHQvLyBQcmlvcml0aXplIHVzaW5nIHByZXZpb3VzbHkgZnJlZWQgaW5zdGFuY2UgaWRzXHJcblx0XHRpZiAoIHRoaXMuX2F2YWlsYWJsZUluc3RhbmNlSWRzLmxlbmd0aCA+IDAgKSB7XHJcblxyXG5cdFx0XHR0aGlzLl9hdmFpbGFibGVJbnN0YW5jZUlkcy5zb3J0KCBhc2NJZFNvcnQgKTtcclxuXHJcblx0XHRcdGRyYXdJZCA9IHRoaXMuX2F2YWlsYWJsZUluc3RhbmNlSWRzLnNoaWZ0KCk7XHJcblx0XHRcdHRoaXMuX2luc3RhbmNlSW5mb1sgZHJhd0lkIF0gPSBpbnN0YW5jZUluZm87XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGRyYXdJZCA9IHRoaXMuX2luc3RhbmNlSW5mby5sZW5ndGg7XHJcblx0XHRcdHRoaXMuX2luc3RhbmNlSW5mby5wdXNoKCBpbnN0YW5jZUluZm8gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgbWF0cmljZXNUZXh0dXJlID0gdGhpcy5fbWF0cmljZXNUZXh0dXJlO1xyXG5cdFx0X21hdHJpeC5pZGVudGl0eSgpLnRvQXJyYXkoIG1hdHJpY2VzVGV4dHVyZS5pbWFnZS5kYXRhLCBkcmF3SWQgKiAxNiApO1xyXG5cdFx0bWF0cmljZXNUZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHRjb25zdCBjb2xvcnNUZXh0dXJlID0gdGhpcy5fY29sb3JzVGV4dHVyZTtcclxuXHRcdGlmICggY29sb3JzVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdF93aGl0ZUNvbG9yLnRvQXJyYXkoIGNvbG9yc1RleHR1cmUuaW1hZ2UuZGF0YSwgZHJhd0lkICogNCApO1xyXG5cdFx0XHRjb2xvcnNUZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5fdmlzaWJpbGl0eUNoYW5nZWQgPSB0cnVlO1xyXG5cdFx0cmV0dXJuIGRyYXdJZDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIHRoZSBnaXZlbiBnZW9tZXRyeSB0byB0aGUgYmF0Y2ggYW5kIHJldHVybnMgdGhlIGFzc29jaWF0ZWRcclxuXHQgKiBnZW9tZXRyeSBpZCByZWZlcnJpbmcgdG8gaXQgdG8gYmUgdXNlZCBpbiBvdGhlciBmdW5jdGlvbnMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0J1ZmZlckdlb21ldHJ5fSBnZW9tZXRyeSAtIFRoZSBnZW9tZXRyeSB0byBhZGQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtyZXNlcnZlZFZlcnRleENvdW50PS0xXSAtIE9wdGlvbmFsIHBhcmFtZXRlciBzcGVjaWZ5aW5nIHRoZSBhbW91bnQgb2ZcclxuXHQgKiB2ZXJ0ZXggYnVmZmVyIHNwYWNlIHRvIHJlc2VydmUgZm9yIHRoZSBhZGRlZCBnZW9tZXRyeS4gVGhpcyBpcyBuZWNlc3NhcnkgaWYgaXQgaXMgcGxhbm5lZFxyXG5cdCAqIHRvIHNldCBhIG5ldyBnZW9tZXRyeSBhdCB0aGlzIGluZGV4IGF0IGEgbGF0ZXIgdGltZSB0aGF0IGlzIGxhcmdlciB0aGFuIHRoZSBvcmlnaW5hbCBnZW9tZXRyeS5cclxuXHQgKiBEZWZhdWx0cyB0byB0aGUgbGVuZ3RoIG9mIHRoZSBnaXZlbiBnZW9tZXRyeSB2ZXJ0ZXggYnVmZmVyLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbcmVzZXJ2ZWRJbmRleENvdW50PS0xXSAtIE9wdGlvbmFsIHBhcmFtZXRlciBzcGVjaWZ5aW5nIHRoZSBhbW91bnQgb2YgaW5kZXhcclxuXHQgKiBidWZmZXIgc3BhY2UgdG8gcmVzZXJ2ZSBmb3IgdGhlIGFkZGVkIGdlb21ldHJ5LiBUaGlzIGlzIG5lY2Vzc2FyeSBpZiBpdCBpcyBwbGFubmVkIHRvIHNldCBhXHJcblx0ICogbmV3IGdlb21ldHJ5IGF0IHRoaXMgaW5kZXggYXQgYSBsYXRlciB0aW1lIHRoYXQgaXMgbGFyZ2VyIHRoYW4gdGhlIG9yaWdpbmFsIGdlb21ldHJ5LiBEZWZhdWx0cyB0b1xyXG5cdCAqIHRoZSBsZW5ndGggb2YgdGhlIGdpdmVuIGdlb21ldHJ5IGluZGV4IGJ1ZmZlci5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBnZW9tZXRyeSBJRC5cclxuXHQgKi9cclxuXHRhZGRHZW9tZXRyeSggZ2VvbWV0cnksIHJlc2VydmVkVmVydGV4Q291bnQgPSAtIDEsIHJlc2VydmVkSW5kZXhDb3VudCA9IC0gMSApIHtcclxuXHJcblx0XHR0aGlzLl9pbml0aWFsaXplR2VvbWV0cnkoIGdlb21ldHJ5ICk7XHJcblxyXG5cdFx0dGhpcy5fdmFsaWRhdGVHZW9tZXRyeSggZ2VvbWV0cnkgKTtcclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeUluZm8gPSB7XHJcblx0XHRcdC8vIGdlb21ldHJ5IGluZm9ybWF0aW9uXHJcblx0XHRcdHZlcnRleFN0YXJ0OiAtIDEsXHJcblx0XHRcdHZlcnRleENvdW50OiAtIDEsXHJcblx0XHRcdHJlc2VydmVkVmVydGV4Q291bnQ6IC0gMSxcclxuXHJcblx0XHRcdGluZGV4U3RhcnQ6IC0gMSxcclxuXHRcdFx0aW5kZXhDb3VudDogLSAxLFxyXG5cdFx0XHRyZXNlcnZlZEluZGV4Q291bnQ6IC0gMSxcclxuXHJcblx0XHRcdC8vIGRyYXcgcmFuZ2UgaW5mb3JtYXRpb25cclxuXHRcdFx0c3RhcnQ6IC0gMSxcclxuXHRcdFx0Y291bnQ6IC0gMSxcclxuXHJcblx0XHRcdC8vIHN0YXRlXHJcblx0XHRcdGJvdW5kaW5nQm94OiBudWxsLFxyXG5cdFx0XHRib3VuZGluZ1NwaGVyZTogbnVsbCxcclxuXHRcdFx0YWN0aXZlOiB0cnVlLFxyXG5cdFx0fTtcclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeUluZm9MaXN0ID0gdGhpcy5fZ2VvbWV0cnlJbmZvO1xyXG5cdFx0Z2VvbWV0cnlJbmZvLnZlcnRleFN0YXJ0ID0gdGhpcy5fbmV4dFZlcnRleFN0YXJ0O1xyXG5cdFx0Z2VvbWV0cnlJbmZvLnJlc2VydmVkVmVydGV4Q291bnQgPSByZXNlcnZlZFZlcnRleENvdW50ID09PSAtIDEgPyBnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKS5jb3VudCA6IHJlc2VydmVkVmVydGV4Q291bnQ7XHJcblxyXG5cdFx0Y29uc3QgaW5kZXggPSBnZW9tZXRyeS5nZXRJbmRleCgpO1xyXG5cdFx0Y29uc3QgaGFzSW5kZXggPSBpbmRleCAhPT0gbnVsbDtcclxuXHRcdGlmICggaGFzSW5kZXggKSB7XHJcblxyXG5cdFx0XHRnZW9tZXRyeUluZm8uaW5kZXhTdGFydCA9IHRoaXMuX25leHRJbmRleFN0YXJ0O1xyXG5cdFx0XHRnZW9tZXRyeUluZm8ucmVzZXJ2ZWRJbmRleENvdW50ID0gcmVzZXJ2ZWRJbmRleENvdW50ID09PSAtIDEgPyBpbmRleC5jb3VudCA6IHJlc2VydmVkSW5kZXhDb3VudDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKFxyXG5cdFx0XHRnZW9tZXRyeUluZm8uaW5kZXhTdGFydCAhPT0gLSAxICYmXHJcblx0XHRcdGdlb21ldHJ5SW5mby5pbmRleFN0YXJ0ICsgZ2VvbWV0cnlJbmZvLnJlc2VydmVkSW5kZXhDb3VudCA+IHRoaXMuX21heEluZGV4Q291bnQgfHxcclxuXHRcdFx0Z2VvbWV0cnlJbmZvLnZlcnRleFN0YXJ0ICsgZ2VvbWV0cnlJbmZvLnJlc2VydmVkVmVydGV4Q291bnQgPiB0aGlzLl9tYXhWZXJ0ZXhDb3VudFxyXG5cdFx0KSB7XHJcblxyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5CYXRjaGVkTWVzaDogUmVzZXJ2ZWQgc3BhY2UgcmVxdWVzdCBleGNlZWRzIHRoZSBtYXhpbXVtIGJ1ZmZlciBzaXplLicgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gdXBkYXRlIGlkXHJcblx0XHRsZXQgZ2VvbWV0cnlJZDtcclxuXHRcdGlmICggdGhpcy5fYXZhaWxhYmxlR2VvbWV0cnlJZHMubGVuZ3RoID4gMCApIHtcclxuXHJcblx0XHRcdHRoaXMuX2F2YWlsYWJsZUdlb21ldHJ5SWRzLnNvcnQoIGFzY0lkU29ydCApO1xyXG5cclxuXHRcdFx0Z2VvbWV0cnlJZCA9IHRoaXMuX2F2YWlsYWJsZUdlb21ldHJ5SWRzLnNoaWZ0KCk7XHJcblx0XHRcdGdlb21ldHJ5SW5mb0xpc3RbIGdlb21ldHJ5SWQgXSA9IGdlb21ldHJ5SW5mbztcclxuXHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGdlb21ldHJ5SWQgPSB0aGlzLl9nZW9tZXRyeUNvdW50O1xyXG5cdFx0XHR0aGlzLl9nZW9tZXRyeUNvdW50ICsrO1xyXG5cdFx0XHRnZW9tZXRyeUluZm9MaXN0LnB1c2goIGdlb21ldHJ5SW5mbyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyB1cGRhdGUgdGhlIGdlb21ldHJ5XHJcblx0XHR0aGlzLnNldEdlb21ldHJ5QXQoIGdlb21ldHJ5SWQsIGdlb21ldHJ5ICk7XHJcblxyXG5cdFx0Ly8gaW5jcmVtZW50IHRoZSBuZXh0IGdlb21ldHJ5IHBvc2l0aW9uXHJcblx0XHR0aGlzLl9uZXh0SW5kZXhTdGFydCA9IGdlb21ldHJ5SW5mby5pbmRleFN0YXJ0ICsgZ2VvbWV0cnlJbmZvLnJlc2VydmVkSW5kZXhDb3VudDtcclxuXHRcdHRoaXMuX25leHRWZXJ0ZXhTdGFydCA9IGdlb21ldHJ5SW5mby52ZXJ0ZXhTdGFydCArIGdlb21ldHJ5SW5mby5yZXNlcnZlZFZlcnRleENvdW50O1xyXG5cclxuXHRcdHJldHVybiBnZW9tZXRyeUlkO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlcGxhY2VzIHRoZSBnZW9tZXRyeSBhdCB0aGUgZ2l2ZW4gSUQgd2l0aCB0aGUgcHJvdmlkZWQgZ2VvbWV0cnkuIFRocm93cyBhbiBlcnJvciBpZiB0aGVyZVxyXG5cdCAqIGlzIG5vdCBlbm91Z2ggc3BhY2UgcmVzZXJ2ZWQgZm9yIGdlb21ldHJ5LiBDYWxsaW5nIHRoaXMgd2lsbCBjaGFuZ2UgYWxsIGluc3RhbmNlcyB0aGF0IGFyZVxyXG5cdCAqIHJlbmRlcmluZyB0aGF0IGdlb21ldHJ5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGdlb21ldHJ5SWQgLSBUaGUgSUQgb2YgdGhlIGdlb21ldHJ5IHRoYXQgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggdGhlIGdpdmVuIGdlb21ldHJ5LlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyR2VvbWV0cnl9IGdlb21ldHJ5IC0gVGhlIG5ldyBnZW9tZXRyeS5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBnZW9tZXRyeSBJRC5cclxuXHQgKi9cclxuXHRzZXRHZW9tZXRyeUF0KCBnZW9tZXRyeUlkLCBnZW9tZXRyeSApIHtcclxuXHJcblx0XHRpZiAoIGdlb21ldHJ5SWQgPj0gdGhpcy5fZ2VvbWV0cnlDb3VudCApIHtcclxuXHJcblx0XHRcdHRocm93IG5ldyBFcnJvciggJ1RIUkVFLkJhdGNoZWRNZXNoOiBNYXhpbXVtIGdlb21ldHJ5IGNvdW50IHJlYWNoZWQuJyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLl92YWxpZGF0ZUdlb21ldHJ5KCBnZW9tZXRyeSApO1xyXG5cclxuXHRcdGNvbnN0IGJhdGNoR2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xyXG5cdFx0Y29uc3QgaGFzSW5kZXggPSBiYXRjaEdlb21ldHJ5LmdldEluZGV4KCkgIT09IG51bGw7XHJcblx0XHRjb25zdCBkc3RJbmRleCA9IGJhdGNoR2VvbWV0cnkuZ2V0SW5kZXgoKTtcclxuXHRcdGNvbnN0IHNyY0luZGV4ID0gZ2VvbWV0cnkuZ2V0SW5kZXgoKTtcclxuXHRcdGNvbnN0IGdlb21ldHJ5SW5mbyA9IHRoaXMuX2dlb21ldHJ5SW5mb1sgZ2VvbWV0cnlJZCBdO1xyXG5cdFx0aWYgKFxyXG5cdFx0XHRoYXNJbmRleCAmJlxyXG5cdFx0XHRzcmNJbmRleC5jb3VudCA+IGdlb21ldHJ5SW5mby5yZXNlcnZlZEluZGV4Q291bnQgfHxcclxuXHRcdFx0Z2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbi5jb3VudCA+IGdlb21ldHJ5SW5mby5yZXNlcnZlZFZlcnRleENvdW50XHJcblx0XHQpIHtcclxuXHJcblx0XHRcdHRocm93IG5ldyBFcnJvciggJ1RIUkVFLkJhdGNoZWRNZXNoOiBSZXNlcnZlZCBzcGFjZSBub3QgbGFyZ2UgZW5vdWdoIGZvciBwcm92aWRlZCBnZW9tZXRyeS4nICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGNvcHkgZ2VvbWV0cnkgYnVmZmVyIGRhdGEgb3ZlclxyXG5cdFx0Y29uc3QgdmVydGV4U3RhcnQgPSBnZW9tZXRyeUluZm8udmVydGV4U3RhcnQ7XHJcblx0XHRjb25zdCByZXNlcnZlZFZlcnRleENvdW50ID0gZ2VvbWV0cnlJbmZvLnJlc2VydmVkVmVydGV4Q291bnQ7XHJcblx0XHRnZW9tZXRyeUluZm8udmVydGV4Q291bnQgPSBnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKS5jb3VudDtcclxuXHJcblx0XHRmb3IgKCBjb25zdCBhdHRyaWJ1dGVOYW1lIGluIGJhdGNoR2VvbWV0cnkuYXR0cmlidXRlcyApIHtcclxuXHJcblx0XHRcdC8vIGNvcHkgYXR0cmlidXRlIGRhdGFcclxuXHRcdFx0Y29uc3Qgc3JjQXR0cmlidXRlID0gZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCBhdHRyaWJ1dGVOYW1lICk7XHJcblx0XHRcdGNvbnN0IGRzdEF0dHJpYnV0ZSA9IGJhdGNoR2VvbWV0cnkuZ2V0QXR0cmlidXRlKCBhdHRyaWJ1dGVOYW1lICk7XHJcblx0XHRcdGNvcHlBdHRyaWJ1dGVEYXRhKCBzcmNBdHRyaWJ1dGUsIGRzdEF0dHJpYnV0ZSwgdmVydGV4U3RhcnQgKTtcclxuXHJcblx0XHRcdC8vIGZpbGwgdGhlIHJlc3QgaW4gd2l0aCB6ZXJvZXNcclxuXHRcdFx0Y29uc3QgaXRlbVNpemUgPSBzcmNBdHRyaWJ1dGUuaXRlbVNpemU7XHJcblx0XHRcdGZvciAoIGxldCBpID0gc3JjQXR0cmlidXRlLmNvdW50LCBsID0gcmVzZXJ2ZWRWZXJ0ZXhDb3VudDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGluZGV4ID0gdmVydGV4U3RhcnQgKyBpO1xyXG5cdFx0XHRcdGZvciAoIGxldCBjID0gMDsgYyA8IGl0ZW1TaXplOyBjICsrICkge1xyXG5cclxuXHRcdFx0XHRcdGRzdEF0dHJpYnV0ZS5zZXRDb21wb25lbnQoIGluZGV4LCBjLCAwICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGRzdEF0dHJpYnV0ZS5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblx0XHRcdGRzdEF0dHJpYnV0ZS5hZGRVcGRhdGVSYW5nZSggdmVydGV4U3RhcnQgKiBpdGVtU2l6ZSwgcmVzZXJ2ZWRWZXJ0ZXhDb3VudCAqIGl0ZW1TaXplICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGNvcHkgaW5kZXhcclxuXHRcdGlmICggaGFzSW5kZXggKSB7XHJcblxyXG5cdFx0XHRjb25zdCBpbmRleFN0YXJ0ID0gZ2VvbWV0cnlJbmZvLmluZGV4U3RhcnQ7XHJcblx0XHRcdGNvbnN0IHJlc2VydmVkSW5kZXhDb3VudCA9IGdlb21ldHJ5SW5mby5yZXNlcnZlZEluZGV4Q291bnQ7XHJcblx0XHRcdGdlb21ldHJ5SW5mby5pbmRleENvdW50ID0gZ2VvbWV0cnkuZ2V0SW5kZXgoKS5jb3VudDtcclxuXHJcblx0XHRcdC8vIGNvcHkgaW5kZXggZGF0YSBvdmVyXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHNyY0luZGV4LmNvdW50OyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRkc3RJbmRleC5zZXRYKCBpbmRleFN0YXJ0ICsgaSwgdmVydGV4U3RhcnQgKyBzcmNJbmRleC5nZXRYKCBpICkgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIGZpbGwgdGhlIHJlc3QgaW4gd2l0aCB6ZXJvZXNcclxuXHRcdFx0Zm9yICggbGV0IGkgPSBzcmNJbmRleC5jb3VudCwgbCA9IHJlc2VydmVkSW5kZXhDb3VudDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGRzdEluZGV4LnNldFgoIGluZGV4U3RhcnQgKyBpLCB2ZXJ0ZXhTdGFydCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZHN0SW5kZXgubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cdFx0XHRkc3RJbmRleC5hZGRVcGRhdGVSYW5nZSggaW5kZXhTdGFydCwgZ2VvbWV0cnlJbmZvLnJlc2VydmVkSW5kZXhDb3VudCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyB1cGRhdGUgdGhlIGRyYXcgcmFuZ2VcclxuXHRcdGdlb21ldHJ5SW5mby5zdGFydCA9IGhhc0luZGV4ID8gZ2VvbWV0cnlJbmZvLmluZGV4U3RhcnQgOiBnZW9tZXRyeUluZm8udmVydGV4U3RhcnQ7XHJcblx0XHRnZW9tZXRyeUluZm8uY291bnQgPSBoYXNJbmRleCA/IGdlb21ldHJ5SW5mby5pbmRleENvdW50IDogZ2VvbWV0cnlJbmZvLnZlcnRleENvdW50O1xyXG5cclxuXHRcdC8vIHN0b3JlIHRoZSBib3VuZGluZyBib3hlc1xyXG5cdFx0Z2VvbWV0cnlJbmZvLmJvdW5kaW5nQm94ID0gbnVsbDtcclxuXHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdCb3ggIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRnZW9tZXRyeUluZm8uYm91bmRpbmdCb3ggPSBnZW9tZXRyeS5ib3VuZGluZ0JveC5jbG9uZSgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRnZW9tZXRyeUluZm8uYm91bmRpbmdTcGhlcmUgPSBudWxsO1xyXG5cdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGdlb21ldHJ5SW5mby5ib3VuZGluZ1NwaGVyZSA9IGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlLmNsb25lKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuX3Zpc2liaWxpdHlDaGFuZ2VkID0gdHJ1ZTtcclxuXHRcdHJldHVybiBnZW9tZXRyeUlkO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlbGV0ZXMgdGhlIGdlb21ldHJ5IGRlZmluZWQgYnkgdGhlIGdpdmVuIElEIGZyb20gdGhpcyBiYXRjaC4gQW55IGluc3RhbmNlcyByZWZlcmVuY2luZ1xyXG5cdCAqIHRoaXMgZ2VvbWV0cnkgd2lsbCBhbHNvIGJlIHJlbW92ZWQgYXMgYSBzaWRlIGVmZmVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBnZW9tZXRyeUlkIC0gVGhlIElEIG9mIHRoZSBnZW9tZXRyeSB0byByZW1vdmUgZnJvbSB0aGUgYmF0Y2guXHJcblx0ICogQHJldHVybiB7QmF0Y2hlZE1lc2h9IEEgcmVmZXJlbmNlIHRvIHRoaXMgYmF0Y2hlZCBtZXNoLlxyXG5cdCAqL1xyXG5cdGRlbGV0ZUdlb21ldHJ5KCBnZW9tZXRyeUlkICkge1xyXG5cclxuXHRcdGNvbnN0IGdlb21ldHJ5SW5mb0xpc3QgPSB0aGlzLl9nZW9tZXRyeUluZm87XHJcblx0XHRpZiAoIGdlb21ldHJ5SWQgPj0gZ2VvbWV0cnlJbmZvTGlzdC5sZW5ndGggfHwgZ2VvbWV0cnlJbmZvTGlzdFsgZ2VvbWV0cnlJZCBdLmFjdGl2ZSA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gZGVsZXRlIGFueSBpbnN0YW5jZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZ2VvbWV0cnlcclxuXHRcdGNvbnN0IGluc3RhbmNlSW5mbyA9IHRoaXMuX2luc3RhbmNlSW5mbztcclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGluc3RhbmNlSW5mby5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0aWYgKCBpbnN0YW5jZUluZm9bIGkgXS5hY3RpdmUgJiYgaW5zdGFuY2VJbmZvWyBpIF0uZ2VvbWV0cnlJbmRleCA9PT0gZ2VvbWV0cnlJZCApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5kZWxldGVJbnN0YW5jZSggaSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRnZW9tZXRyeUluZm9MaXN0WyBnZW9tZXRyeUlkIF0uYWN0aXZlID0gZmFsc2U7XHJcblx0XHR0aGlzLl9hdmFpbGFibGVHZW9tZXRyeUlkcy5wdXNoKCBnZW9tZXRyeUlkICk7XHJcblx0XHR0aGlzLl92aXNpYmlsaXR5Q2hhbmdlZCA9IHRydWU7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVsZXRlcyBhbiBleGlzdGluZyBpbnN0YW5jZSBmcm9tIHRoZSBiYXRjaCB1c2luZyB0aGUgZ2l2ZW4gSUQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5zdGFuY2VJZCAtIFRoZSBJRCBvZiB0aGUgaW5zdGFuY2UgdG8gcmVtb3ZlIGZyb20gdGhlIGJhdGNoLlxyXG5cdCAqIEByZXR1cm4ge0JhdGNoZWRNZXNofSBBIHJlZmVyZW5jZSB0byB0aGlzIGJhdGNoZWQgbWVzaC5cclxuXHQgKi9cclxuXHRkZWxldGVJbnN0YW5jZSggaW5zdGFuY2VJZCApIHtcclxuXHJcblx0XHR0aGlzLnZhbGlkYXRlSW5zdGFuY2VJZCggaW5zdGFuY2VJZCApO1xyXG5cclxuXHRcdHRoaXMuX2luc3RhbmNlSW5mb1sgaW5zdGFuY2VJZCBdLmFjdGl2ZSA9IGZhbHNlO1xyXG5cdFx0dGhpcy5fYXZhaWxhYmxlSW5zdGFuY2VJZHMucHVzaCggaW5zdGFuY2VJZCApO1xyXG5cdFx0dGhpcy5fdmlzaWJpbGl0eUNoYW5nZWQgPSB0cnVlO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlcGFja3MgdGhlIHN1YiBnZW9tZXRyaWVzIGluIFtuYW1lXSB0byByZW1vdmUgYW55IHVudXNlZCBzcGFjZSByZW1haW5pbmcgZnJvbVxyXG5cdCAqIHByZXZpb3VzbHkgZGVsZXRlZCBnZW9tZXRyeSwgZnJlZWluZyB1cCBzcGFjZSB0byBhZGQgbmV3IGdlb21ldHJ5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluc3RhbmNlSWQgLSBUaGUgSUQgb2YgdGhlIGluc3RhbmNlIHRvIHJlbW92ZSBmcm9tIHRoZSBiYXRjaC5cclxuXHQgKiBAcmV0dXJuIHtCYXRjaGVkTWVzaH0gQSByZWZlcmVuY2UgdG8gdGhpcyBiYXRjaGVkIG1lc2guXHJcblx0ICovXHJcblx0b3B0aW1pemUoKSB7XHJcblxyXG5cdFx0Ly8gdHJhY2sgdGhlIG5leHQgaW5kaWNlcyB0byBjb3B5IGRhdGEgdG9cclxuXHRcdGxldCBuZXh0VmVydGV4U3RhcnQgPSAwO1xyXG5cdFx0bGV0IG5leHRJbmRleFN0YXJ0ID0gMDtcclxuXHJcblx0XHQvLyBJdGVyYXRlIG92ZXIgYWxsIGdlb21ldHJ5IHJhbmdlcyBpbiBvcmRlciBzb3J0ZWQgZnJvbSBlYXJsaWVzdCBpbiB0aGUgZ2VvbWV0cnkgYnVmZmVyIHRvIGxhdGVzdFxyXG5cdFx0Ly8gaW4gdGhlIGdlb21ldHJ5IGJ1ZmZlci4gQmVjYXVzZSBkcmF3IHJhbmdlIG9iamVjdHMgY2FuIGJlIHJldXNlZCB0aGVyZSBpcyBubyBndWFyYW50ZWUgb2YgdGhlaXIgb3JkZXIuXHJcblx0XHRjb25zdCBnZW9tZXRyeUluZm9MaXN0ID0gdGhpcy5fZ2VvbWV0cnlJbmZvO1xyXG5cdFx0Y29uc3QgaW5kaWNlcyA9IGdlb21ldHJ5SW5mb0xpc3RcclxuXHRcdFx0Lm1hcCggKCBlLCBpICkgPT4gaSApXHJcblx0XHRcdC5zb3J0KCAoIGEsIGIgKSA9PiB7XHJcblxyXG5cdFx0XHRcdHJldHVybiBnZW9tZXRyeUluZm9MaXN0WyBhIF0udmVydGV4U3RhcnQgLSBnZW9tZXRyeUluZm9MaXN0WyBiIF0udmVydGV4U3RhcnQ7XHJcblxyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gZ2VvbWV0cnlJbmZvTGlzdC5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0Ly8gaWYgYSBnZW9tZXRyeSByYW5nZSBpcyBpbmFjdGl2ZSB0aGVuIGRvbid0IGNvcHkgYW55dGhpbmdcclxuXHRcdFx0Y29uc3QgaW5kZXggPSBpbmRpY2VzWyBpIF07XHJcblx0XHRcdGNvbnN0IGdlb21ldHJ5SW5mbyA9IGdlb21ldHJ5SW5mb0xpc3RbIGluZGV4IF07XHJcblx0XHRcdGlmICggZ2VvbWV0cnlJbmZvLmFjdGl2ZSA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnRpbnVlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gaWYgYSBnZW9tZXRyeSBjb250YWlucyBhbiBpbmRleCBidWZmZXIgdGhlbiBzaGlmdCBpdCwgYXMgd2VsbFxyXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmluZGV4ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIGdlb21ldHJ5SW5mby5pbmRleFN0YXJ0ICE9PSBuZXh0SW5kZXhTdGFydCApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCB7IGluZGV4U3RhcnQsIHZlcnRleFN0YXJ0LCByZXNlcnZlZEluZGV4Q291bnQgfSA9IGdlb21ldHJ5SW5mbztcclxuXHRcdFx0XHRcdGNvbnN0IGluZGV4ID0gZ2VvbWV0cnkuaW5kZXg7XHJcblx0XHRcdFx0XHRjb25zdCBhcnJheSA9IGluZGV4LmFycmF5O1xyXG5cclxuXHRcdFx0XHRcdC8vIHNoaWZ0IHRoZSBpbmRleCBwb2ludGVycyBiYXNlZCBvbiBob3cgdGhlIHZlcnRleCBkYXRhIHdpbGwgc2hpZnRcclxuXHRcdFx0XHRcdC8vIGFkanVzdGluZyB0aGUgaW5kZXggbXVzdCBoYXBwZW4gZmlyc3Qgc28gdGhlIG9yaWdpbmFsIHZlcnRleCBzdGFydCB2YWx1ZSBpcyBhdmFpbGFibGVcclxuXHRcdFx0XHRcdGNvbnN0IGVsZW1lbnREZWx0YSA9IG5leHRWZXJ0ZXhTdGFydCAtIHZlcnRleFN0YXJ0O1xyXG5cdFx0XHRcdFx0Zm9yICggbGV0IGogPSBpbmRleFN0YXJ0OyBqIDwgaW5kZXhTdGFydCArIHJlc2VydmVkSW5kZXhDb3VudDsgaiArKyApIHtcclxuXHJcblx0XHRcdFx0XHRcdGFycmF5WyBqIF0gPSBhcnJheVsgaiBdICsgZWxlbWVudERlbHRhO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRpbmRleC5hcnJheS5jb3B5V2l0aGluKCBuZXh0SW5kZXhTdGFydCwgaW5kZXhTdGFydCwgaW5kZXhTdGFydCArIHJlc2VydmVkSW5kZXhDb3VudCApO1xyXG5cdFx0XHRcdFx0aW5kZXguYWRkVXBkYXRlUmFuZ2UoIG5leHRJbmRleFN0YXJ0LCByZXNlcnZlZEluZGV4Q291bnQgKTtcclxuXHJcblx0XHRcdFx0XHRnZW9tZXRyeUluZm8uaW5kZXhTdGFydCA9IG5leHRJbmRleFN0YXJ0O1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdG5leHRJbmRleFN0YXJ0ICs9IGdlb21ldHJ5SW5mby5yZXNlcnZlZEluZGV4Q291bnQ7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBpZiBhIGdlb21ldHJ5IG5lZWRzIHRvIGJlIG1vdmVkIHRoZW4gY29weSBhdHRyaWJ1dGUgZGF0YSB0byBvdmVyd3JpdGUgdW51c2VkIHNwYWNlXHJcblx0XHRcdGlmICggZ2VvbWV0cnlJbmZvLnZlcnRleFN0YXJ0ICE9PSBuZXh0VmVydGV4U3RhcnQgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHsgdmVydGV4U3RhcnQsIHJlc2VydmVkVmVydGV4Q291bnQgfSA9IGdlb21ldHJ5SW5mbztcclxuXHRcdFx0XHRjb25zdCBhdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlcztcclxuXHRcdFx0XHRmb3IgKCBjb25zdCBrZXkgaW4gYXR0cmlidXRlcyApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzWyBrZXkgXTtcclxuXHRcdFx0XHRcdGNvbnN0IHsgYXJyYXksIGl0ZW1TaXplIH0gPSBhdHRyaWJ1dGU7XHJcblx0XHRcdFx0XHRhcnJheS5jb3B5V2l0aGluKCBuZXh0VmVydGV4U3RhcnQgKiBpdGVtU2l6ZSwgdmVydGV4U3RhcnQgKiBpdGVtU2l6ZSwgKCB2ZXJ0ZXhTdGFydCArIHJlc2VydmVkVmVydGV4Q291bnQgKSAqIGl0ZW1TaXplICk7XHJcblx0XHRcdFx0XHRhdHRyaWJ1dGUuYWRkVXBkYXRlUmFuZ2UoIG5leHRWZXJ0ZXhTdGFydCAqIGl0ZW1TaXplLCByZXNlcnZlZFZlcnRleENvdW50ICogaXRlbVNpemUgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRnZW9tZXRyeUluZm8udmVydGV4U3RhcnQgPSBuZXh0VmVydGV4U3RhcnQ7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRuZXh0VmVydGV4U3RhcnQgKz0gZ2VvbWV0cnlJbmZvLnJlc2VydmVkVmVydGV4Q291bnQ7XHJcblx0XHRcdGdlb21ldHJ5SW5mby5zdGFydCA9IGdlb21ldHJ5LmluZGV4ID8gZ2VvbWV0cnlJbmZvLmluZGV4U3RhcnQgOiBnZW9tZXRyeUluZm8udmVydGV4U3RhcnQ7XHJcblxyXG5cdFx0XHQvLyBzdGVwIHRoZSBuZXh0IGdlb21ldHJ5IHBvaW50cyB0byB0aGUgc2hpZnRlZCBwb3NpdGlvblxyXG5cdFx0XHR0aGlzLl9uZXh0SW5kZXhTdGFydCA9IGdlb21ldHJ5LmluZGV4ID8gZ2VvbWV0cnlJbmZvLmluZGV4U3RhcnQgKyBnZW9tZXRyeUluZm8ucmVzZXJ2ZWRJbmRleENvdW50IDogMDtcclxuXHRcdFx0dGhpcy5fbmV4dFZlcnRleFN0YXJ0ID0gZ2VvbWV0cnlJbmZvLnZlcnRleFN0YXJ0ICsgZ2VvbWV0cnlJbmZvLnJlc2VydmVkVmVydGV4Q291bnQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGJvdW5kaW5nIGJveCBmb3IgdGhlIGdpdmVuIGdlb21ldHJ5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGdlb21ldHJ5SWQgLSBUaGUgSUQgb2YgdGhlIGdlb21ldHJ5IHRvIHJldHVybiB0aGUgYm91bmRpbmcgYm94IGZvci5cclxuXHQgKiBAcGFyYW0ge0JveDN9IHRhcmdldCAtIFRoZSB0YXJnZXQgb2JqZWN0IHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbWV0aG9kJ3MgcmVzdWx0LlxyXG5cdCAqIEByZXR1cm4ge0JveDN8bnVsbH0gVGhlIGdlb21ldHJ5J3MgYm91bmRpbmcgYm94LiBSZXR1cm5zIGBudWxsYCBpZiBubyBnZW9tZXRyeSBoYXMgYmVlbiBmb3VuZCBmb3IgdGhlIGdpdmVuIElELlxyXG5cdCAqL1xyXG5cdGdldEJvdW5kaW5nQm94QXQoIGdlb21ldHJ5SWQsIHRhcmdldCApIHtcclxuXHJcblx0XHRpZiAoIGdlb21ldHJ5SWQgPj0gdGhpcy5fZ2VvbWV0cnlDb3VudCApIHtcclxuXHJcblx0XHRcdHJldHVybiBudWxsO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBjb21wdXRlIGJvdW5kaW5nIGJveFxyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xyXG5cdFx0Y29uc3QgZ2VvbWV0cnlJbmZvID0gdGhpcy5fZ2VvbWV0cnlJbmZvWyBnZW9tZXRyeUlkIF07XHJcblx0XHRpZiAoIGdlb21ldHJ5SW5mby5ib3VuZGluZ0JveCA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGJveCA9IG5ldyBCb3gzKCk7XHJcblx0XHRcdGNvbnN0IGluZGV4ID0gZ2VvbWV0cnkuaW5kZXg7XHJcblx0XHRcdGNvbnN0IHBvc2l0aW9uID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjtcclxuXHRcdFx0Zm9yICggbGV0IGkgPSBnZW9tZXRyeUluZm8uc3RhcnQsIGwgPSBnZW9tZXRyeUluZm8uc3RhcnQgKyBnZW9tZXRyeUluZm8uY291bnQ7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRsZXQgaXYgPSBpO1xyXG5cdFx0XHRcdGlmICggaW5kZXggKSB7XHJcblxyXG5cdFx0XHRcdFx0aXYgPSBpbmRleC5nZXRYKCBpdiApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGJveC5leHBhbmRCeVBvaW50KCBfdmVjdG9yLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBpdiApICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRnZW9tZXRyeUluZm8uYm91bmRpbmdCb3ggPSBib3g7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRhcmdldC5jb3B5KCBnZW9tZXRyeUluZm8uYm91bmRpbmdCb3ggKTtcclxuXHRcdHJldHVybiB0YXJnZXQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgYm91bmRpbmcgc3BoZXJlIGZvciB0aGUgZ2l2ZW4gZ2VvbWV0cnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZ2VvbWV0cnlJZCAtIFRoZSBJRCBvZiB0aGUgZ2VvbWV0cnkgdG8gcmV0dXJuIHRoZSBib3VuZGluZyBzcGhlcmUgZm9yLlxyXG5cdCAqIEBwYXJhbSB7U3BoZXJlfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IG9iamVjdCB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGhvZCdzIHJlc3VsdC5cclxuXHQgKiBAcmV0dXJuIHtTcGhlcmV8bnVsbH0gVGhlIGdlb21ldHJ5J3MgYm91bmRpbmcgc3BoZXJlLiBSZXR1cm5zIGBudWxsYCBpZiBubyBnZW9tZXRyeSBoYXMgYmVlbiBmb3VuZCBmb3IgdGhlIGdpdmVuIElELlxyXG5cdCAqL1xyXG5cdGdldEJvdW5kaW5nU3BoZXJlQXQoIGdlb21ldHJ5SWQsIHRhcmdldCApIHtcclxuXHJcblx0XHRpZiAoIGdlb21ldHJ5SWQgPj0gdGhpcy5fZ2VvbWV0cnlDb3VudCApIHtcclxuXHJcblx0XHRcdHJldHVybiBudWxsO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBjb21wdXRlIGJvdW5kaW5nIHNwaGVyZVxyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xyXG5cdFx0Y29uc3QgZ2VvbWV0cnlJbmZvID0gdGhpcy5fZ2VvbWV0cnlJbmZvWyBnZW9tZXRyeUlkIF07XHJcblx0XHRpZiAoIGdlb21ldHJ5SW5mby5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGNvbnN0IHNwaGVyZSA9IG5ldyBTcGhlcmUoKTtcclxuXHRcdFx0dGhpcy5nZXRCb3VuZGluZ0JveEF0KCBnZW9tZXRyeUlkLCBfYm94ICk7XHJcblx0XHRcdF9ib3guZ2V0Q2VudGVyKCBzcGhlcmUuY2VudGVyICk7XHJcblxyXG5cdFx0XHRjb25zdCBpbmRleCA9IGdlb21ldHJ5LmluZGV4O1xyXG5cdFx0XHRjb25zdCBwb3NpdGlvbiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XHJcblxyXG5cdFx0XHRsZXQgbWF4UmFkaXVzU3EgPSAwO1xyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IGdlb21ldHJ5SW5mby5zdGFydCwgbCA9IGdlb21ldHJ5SW5mby5zdGFydCArIGdlb21ldHJ5SW5mby5jb3VudDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGxldCBpdiA9IGk7XHJcblx0XHRcdFx0aWYgKCBpbmRleCApIHtcclxuXHJcblx0XHRcdFx0XHRpdiA9IGluZGV4LmdldFgoIGl2ICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0X3ZlY3Rvci5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgaXYgKTtcclxuXHRcdFx0XHRtYXhSYWRpdXNTcSA9IE1hdGgubWF4KCBtYXhSYWRpdXNTcSwgc3BoZXJlLmNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZCggX3ZlY3RvciApICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRzcGhlcmUucmFkaXVzID0gTWF0aC5zcXJ0KCBtYXhSYWRpdXNTcSApO1xyXG5cdFx0XHRnZW9tZXRyeUluZm8uYm91bmRpbmdTcGhlcmUgPSBzcGhlcmU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRhcmdldC5jb3B5KCBnZW9tZXRyeUluZm8uYm91bmRpbmdTcGhlcmUgKTtcclxuXHRcdHJldHVybiB0YXJnZXQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZ2l2ZW4gbG9jYWwgdHJhbnNmb3JtYXRpb24gbWF0cml4IHRvIHRoZSBkZWZpbmVkIGluc3RhbmNlLlxyXG5cdCAqIE5lZ2F0aXZlbHkgc2NhbGVkIG1hdHJpY2VzIGFyZSBub3Qgc3VwcG9ydGVkLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluc3RhbmNlSWQgLSBUaGUgSUQgb2YgYW4gaW5zdGFuY2UgdG8gc2V0IHRoZSBtYXRyaXggb2YuXHJcblx0ICogQHBhcmFtIHtNYXRyaXg0fSBtYXRyaXggLSBBIDR4NCBtYXRyaXggcmVwcmVzZW50aW5nIHRoZSBsb2NhbCB0cmFuc2Zvcm1hdGlvbiBvZiBhIHNpbmdsZSBpbnN0YW5jZS5cclxuXHQgKiBAcmV0dXJuIHtCYXRjaGVkTWVzaH0gQSByZWZlcmVuY2UgdG8gdGhpcyBiYXRjaGVkIG1lc2guXHJcblx0ICovXHJcblx0c2V0TWF0cml4QXQoIGluc3RhbmNlSWQsIG1hdHJpeCApIHtcclxuXHJcblx0XHR0aGlzLnZhbGlkYXRlSW5zdGFuY2VJZCggaW5zdGFuY2VJZCApO1xyXG5cclxuXHRcdGNvbnN0IG1hdHJpY2VzVGV4dHVyZSA9IHRoaXMuX21hdHJpY2VzVGV4dHVyZTtcclxuXHRcdGNvbnN0IG1hdHJpY2VzQXJyYXkgPSB0aGlzLl9tYXRyaWNlc1RleHR1cmUuaW1hZ2UuZGF0YTtcclxuXHRcdG1hdHJpeC50b0FycmF5KCBtYXRyaWNlc0FycmF5LCBpbnN0YW5jZUlkICogMTYgKTtcclxuXHRcdG1hdHJpY2VzVGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgbG9jYWwgdHJhbnNmb3JtYXRpb24gbWF0cml4IG9mIHRoZSBkZWZpbmVkIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluc3RhbmNlSWQgLSBUaGUgSUQgb2YgYW4gaW5zdGFuY2UgdG8gZ2V0IHRoZSBtYXRyaXggb2YuXHJcblx0ICogQHBhcmFtIHtNYXRyaXg0fSBtYXRyaXggLSBUaGUgdGFyZ2V0IG9iamVjdCB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGhvZCdzIHJlc3VsdC5cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXg0fSBUaGUgaW5zdGFuY2UncyBsb2NhbCB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguXHJcblx0ICovXHJcblx0Z2V0TWF0cml4QXQoIGluc3RhbmNlSWQsIG1hdHJpeCApIHtcclxuXHJcblx0XHR0aGlzLnZhbGlkYXRlSW5zdGFuY2VJZCggaW5zdGFuY2VJZCApO1xyXG5cdFx0cmV0dXJuIG1hdHJpeC5mcm9tQXJyYXkoIHRoaXMuX21hdHJpY2VzVGV4dHVyZS5pbWFnZS5kYXRhLCBpbnN0YW5jZUlkICogMTYgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBnaXZlbiBjb2xvciB0byB0aGUgZGVmaW5lZCBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbnN0YW5jZUlkIC0gVGhlIElEIG9mIGFuIGluc3RhbmNlIHRvIHNldCB0aGUgY29sb3Igb2YuXHJcblx0ICogQHBhcmFtIHtDb2xvcn0gY29sb3IgLSBUaGUgY29sb3IgdG8gc2V0IHRoZSBpbnN0YW5jZSB0by5cclxuXHQgKiBAcmV0dXJuIHtCYXRjaGVkTWVzaH0gQSByZWZlcmVuY2UgdG8gdGhpcyBiYXRjaGVkIG1lc2guXHJcblx0ICovXHJcblx0c2V0Q29sb3JBdCggaW5zdGFuY2VJZCwgY29sb3IgKSB7XHJcblxyXG5cdFx0dGhpcy52YWxpZGF0ZUluc3RhbmNlSWQoIGluc3RhbmNlSWQgKTtcclxuXHJcblx0XHRpZiAoIHRoaXMuX2NvbG9yc1RleHR1cmUgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLl9pbml0Q29sb3JzVGV4dHVyZSgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb2xvci50b0FycmF5KCB0aGlzLl9jb2xvcnNUZXh0dXJlLmltYWdlLmRhdGEsIGluc3RhbmNlSWQgKiA0ICk7XHJcblx0XHR0aGlzLl9jb2xvcnNUZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBjb2xvciBvZiB0aGUgZGVmaW5lZCBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbnN0YW5jZUlkIC0gVGhlIElEIG9mIGFuIGluc3RhbmNlIHRvIGdldCB0aGUgY29sb3Igb2YuXHJcblx0ICogQHBhcmFtIHtDb2xvcn0gY29sb3IgLSBUaGUgdGFyZ2V0IG9iamVjdCB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGhvZCdzIHJlc3VsdC5cclxuXHQgKiBAcmV0dXJuIHtDb2xvcn0gVGhlIGluc3RhbmNlJ3MgY29sb3IuXHJcblx0ICovXHJcblx0Z2V0Q29sb3JBdCggaW5zdGFuY2VJZCwgY29sb3IgKSB7XHJcblxyXG5cdFx0dGhpcy52YWxpZGF0ZUluc3RhbmNlSWQoIGluc3RhbmNlSWQgKTtcclxuXHRcdHJldHVybiBjb2xvci5mcm9tQXJyYXkoIHRoaXMuX2NvbG9yc1RleHR1cmUuaW1hZ2UuZGF0YSwgaW5zdGFuY2VJZCAqIDQgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbnN0YW5jZUlkIC0gVGhlIGlkIG9mIHRoZSBpbnN0YW5jZSB0byBzZXQgdGhlIHZpc2liaWxpdHkgb2YuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSB2aXNpYmxlIC0gV2hldGhlciB0aGUgaW5zdGFuY2UgaXMgdmlzaWJsZSBvciBub3QuXHJcblx0ICogQHJldHVybiB7QmF0Y2hlZE1lc2h9IEEgcmVmZXJlbmNlIHRvIHRoaXMgYmF0Y2hlZCBtZXNoLlxyXG5cdCAqL1xyXG5cdHNldFZpc2libGVBdCggaW5zdGFuY2VJZCwgdmlzaWJsZSApIHtcclxuXHJcblx0XHR0aGlzLnZhbGlkYXRlSW5zdGFuY2VJZCggaW5zdGFuY2VJZCApO1xyXG5cclxuXHRcdGlmICggdGhpcy5faW5zdGFuY2VJbmZvWyBpbnN0YW5jZUlkIF0udmlzaWJsZSA9PT0gdmlzaWJsZSApIHtcclxuXHJcblx0XHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLl9pbnN0YW5jZUluZm9bIGluc3RhbmNlSWQgXS52aXNpYmxlID0gdmlzaWJsZTtcclxuXHRcdHRoaXMuX3Zpc2liaWxpdHlDaGFuZ2VkID0gdHJ1ZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSB2aXNpYmlsaXR5IHN0YXRlIG9mIHRoZSBkZWZpbmVkIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluc3RhbmNlSWQgLSBUaGUgSUQgb2YgYW4gaW5zdGFuY2UgdG8gZ2V0IHRoZSB2aXNpYmlsaXR5IHN0YXRlIG9mLlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGluc3RhbmNlIGlzIHZpc2libGUgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGdldFZpc2libGVBdCggaW5zdGFuY2VJZCApIHtcclxuXHJcblx0XHR0aGlzLnZhbGlkYXRlSW5zdGFuY2VJZCggaW5zdGFuY2VJZCApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9pbnN0YW5jZUluZm9bIGluc3RhbmNlSWQgXS52aXNpYmxlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGdlb21ldHJ5IElEIG9mIHRoZSBpbnN0YW5jZSBhdCB0aGUgZ2l2ZW4gaW5kZXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5zdGFuY2VJZCAtIFRoZSBJRCBvZiB0aGUgaW5zdGFuY2UgdG8gc2V0IHRoZSBnZW9tZXRyeSBJRCBvZi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZ2VvbWV0cnlJZCAtIFRoZSBnZW9tZXRyeSBJRCB0byBiZSB1c2UgYnkgdGhlIGluc3RhbmNlLlxyXG5cdCAqIEByZXR1cm4ge0JhdGNoZWRNZXNofSBBIHJlZmVyZW5jZSB0byB0aGlzIGJhdGNoZWQgbWVzaC5cclxuXHQgKi9cclxuXHRzZXRHZW9tZXRyeUlkQXQoIGluc3RhbmNlSWQsIGdlb21ldHJ5SWQgKSB7XHJcblxyXG5cdFx0dGhpcy52YWxpZGF0ZUluc3RhbmNlSWQoIGluc3RhbmNlSWQgKTtcclxuXHRcdHRoaXMudmFsaWRhdGVHZW9tZXRyeUlkKCBnZW9tZXRyeUlkICk7XHJcblxyXG5cdFx0dGhpcy5faW5zdGFuY2VJbmZvWyBpbnN0YW5jZUlkIF0uZ2VvbWV0cnlJbmRleCA9IGdlb21ldHJ5SWQ7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgZ2VvbWV0cnkgSUQgb2YgdGhlIGRlZmluZWQgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5zdGFuY2VJZCAtIFRoZSBJRCBvZiBhbiBpbnN0YW5jZSB0byBnZXQgdGhlIGdlb21ldHJ5IElEIG9mLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGluc3RhbmNlJ3MgZ2VvbWV0cnkgSUQuXHJcblx0ICovXHJcblx0Z2V0R2VvbWV0cnlJZEF0KCBpbnN0YW5jZUlkICkge1xyXG5cclxuXHRcdHRoaXMudmFsaWRhdGVJbnN0YW5jZUlkKCBpbnN0YW5jZUlkICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX2luc3RhbmNlSW5mb1sgaW5zdGFuY2VJZCBdLmdlb21ldHJ5SW5kZXg7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2V0IHRoZSByYW5nZSByZXByZXNlbnRpbmcgdGhlIHN1YnNldCBvZiB0cmlhbmdsZXMgcmVsYXRlZCB0byB0aGUgYXR0YWNoZWQgZ2VvbWV0cnksXHJcblx0ICogaW5kaWNhdGluZyB0aGUgc3RhcnRpbmcgb2Zmc2V0IGFuZCBjb3VudCwgb3IgYG51bGxgIGlmIGludmFsaWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZ2VvbWV0cnlJZCAtIFRoZSBpZCBvZiB0aGUgZ2VvbWV0cnkgdG8gZ2V0IHRoZSByYW5nZSBvZi5cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW3RhcmdldF0gLSBUaGUgdGFyZ2V0IG9iamVjdCB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGhvZCdzIHJlc3VsdC5cclxuXHQgKiBAcmV0dXJuIHt7XHJcblx0ICogXHR2ZXJ0ZXhTdGFydDpudW1iZXIsdmVydGV4Q291bnQ6bnVtYmVyLHJlc2VydmVkVmVydGV4Q291bnQ6bnVtYmVyLFxyXG5cdCAqIFx0aW5kZXhTdGFydDpudW1iZXIsaW5kZXhDb3VudDpudW1iZXIscmVzZXJ2ZWRJbmRleENvdW50Om51bWJlcixcclxuXHQgKiBcdHN0YXJ0Om51bWJlcixjb3VudDpudW1iZXJcclxuXHQgKiB9fSBUaGUgcmVzdWx0IG9iamVjdCB3aXRoIHJhbmdlIGRhdGEuXHJcblx0ICovXHJcblx0Z2V0R2VvbWV0cnlSYW5nZUF0KCBnZW9tZXRyeUlkLCB0YXJnZXQgPSB7fSApIHtcclxuXHJcblx0XHR0aGlzLnZhbGlkYXRlR2VvbWV0cnlJZCggZ2VvbWV0cnlJZCApO1xyXG5cclxuXHRcdGNvbnN0IGdlb21ldHJ5SW5mbyA9IHRoaXMuX2dlb21ldHJ5SW5mb1sgZ2VvbWV0cnlJZCBdO1xyXG5cdFx0dGFyZ2V0LnZlcnRleFN0YXJ0ID0gZ2VvbWV0cnlJbmZvLnZlcnRleFN0YXJ0O1xyXG5cdFx0dGFyZ2V0LnZlcnRleENvdW50ID0gZ2VvbWV0cnlJbmZvLnZlcnRleENvdW50O1xyXG5cdFx0dGFyZ2V0LnJlc2VydmVkVmVydGV4Q291bnQgPSBnZW9tZXRyeUluZm8ucmVzZXJ2ZWRWZXJ0ZXhDb3VudDtcclxuXHJcblx0XHR0YXJnZXQuaW5kZXhTdGFydCA9IGdlb21ldHJ5SW5mby5pbmRleFN0YXJ0O1xyXG5cdFx0dGFyZ2V0LmluZGV4Q291bnQgPSBnZW9tZXRyeUluZm8uaW5kZXhDb3VudDtcclxuXHRcdHRhcmdldC5yZXNlcnZlZEluZGV4Q291bnQgPSBnZW9tZXRyeUluZm8ucmVzZXJ2ZWRJbmRleENvdW50O1xyXG5cclxuXHRcdHRhcmdldC5zdGFydCA9IGdlb21ldHJ5SW5mby5zdGFydDtcclxuXHRcdHRhcmdldC5jb3VudCA9IGdlb21ldHJ5SW5mby5jb3VudDtcclxuXHJcblx0XHRyZXR1cm4gdGFyZ2V0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlc2l6ZXMgdGhlIG5lY2Vzc2FyeSBidWZmZXJzIHRvIHN1cHBvcnQgdGhlIHByb3ZpZGVkIG51bWJlciBvZiBpbnN0YW5jZXMuXHJcblx0ICogSWYgdGhlIHByb3ZpZGVkIGFyZ3VtZW50cyBzaHJpbmsgdGhlIG51bWJlciBvZiBpbnN0YW5jZXMgYnV0IHRoZXJlIGFyZSBub3QgZW5vdWdoXHJcblx0ICogdW51c2VkIElkcyBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0IHRoZW4gYW4gZXJyb3IgaXMgdGhyb3duLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IG1heEluc3RhbmNlQ291bnQgLSBUaGUgbWF4IG51bWJlciBvZiBpbmRpdmlkdWFsIGluc3RhbmNlcyB0aGF0IGNhbiBiZSBhZGRlZCBhbmQgcmVuZGVyZWQgYnkgdGhlIGJhdGNoLlxyXG5cdCovXHJcblx0c2V0SW5zdGFuY2VDb3VudCggbWF4SW5zdGFuY2VDb3VudCApIHtcclxuXHJcblx0XHQvLyBzaHJpbmsgdGhlIGF2YWlsYWJsZSBpbnN0YW5jZXMgYXMgbXVjaCBhcyBwb3NzaWJsZVxyXG5cdFx0Y29uc3QgYXZhaWxhYmxlSW5zdGFuY2VJZHMgPSB0aGlzLl9hdmFpbGFibGVJbnN0YW5jZUlkcztcclxuXHRcdGNvbnN0IGluc3RhbmNlSW5mbyA9IHRoaXMuX2luc3RhbmNlSW5mbztcclxuXHRcdGF2YWlsYWJsZUluc3RhbmNlSWRzLnNvcnQoIGFzY0lkU29ydCApO1xyXG5cdFx0d2hpbGUgKCBhdmFpbGFibGVJbnN0YW5jZUlkc1sgYXZhaWxhYmxlSW5zdGFuY2VJZHMubGVuZ3RoIC0gMSBdID09PSBpbnN0YW5jZUluZm8ubGVuZ3RoICkge1xyXG5cclxuXHRcdFx0aW5zdGFuY2VJbmZvLnBvcCgpO1xyXG5cdFx0XHRhdmFpbGFibGVJbnN0YW5jZUlkcy5wb3AoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gdGhyb3cgYW4gZXJyb3IgaWYgaXQgY2FuJ3QgYmUgc2hydW5rIHRvIHRoZSBkZXNpcmVkIHNpemVcclxuXHRcdGlmICggbWF4SW5zdGFuY2VDb3VudCA8IGluc3RhbmNlSW5mby5sZW5ndGggKSB7XHJcblxyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoIGBCYXRjaGVkTWVzaDogSW5zdGFuY2UgaWRzIG91dHNpZGUgdGhlIHJhbmdlICR7IG1heEluc3RhbmNlQ291bnQgfSBhcmUgYmVpbmcgdXNlZC4gQ2Fubm90IHNocmluayBpbnN0YW5jZSBjb3VudC5gICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGNvcHkgdGhlIG11bHRpIGRyYXcgY291bnRzXHJcblx0XHRjb25zdCBtdWx0aURyYXdDb3VudHMgPSBuZXcgSW50MzJBcnJheSggbWF4SW5zdGFuY2VDb3VudCApO1xyXG5cdFx0Y29uc3QgbXVsdGlEcmF3U3RhcnRzID0gbmV3IEludDMyQXJyYXkoIG1heEluc3RhbmNlQ291bnQgKTtcclxuXHRcdGNvcHlBcnJheUNvbnRlbnRzKCB0aGlzLl9tdWx0aURyYXdDb3VudHMsIG11bHRpRHJhd0NvdW50cyApO1xyXG5cdFx0Y29weUFycmF5Q29udGVudHMoIHRoaXMuX211bHRpRHJhd1N0YXJ0cywgbXVsdGlEcmF3U3RhcnRzICk7XHJcblxyXG5cdFx0dGhpcy5fbXVsdGlEcmF3Q291bnRzID0gbXVsdGlEcmF3Q291bnRzO1xyXG5cdFx0dGhpcy5fbXVsdGlEcmF3U3RhcnRzID0gbXVsdGlEcmF3U3RhcnRzO1xyXG5cdFx0dGhpcy5fbWF4SW5zdGFuY2VDb3VudCA9IG1heEluc3RhbmNlQ291bnQ7XHJcblxyXG5cdFx0Ly8gdXBkYXRlIHRleHR1cmUgZGF0YSBmb3IgaW5zdGFuY2Ugc2FtcGxpbmdcclxuXHRcdGNvbnN0IGluZGlyZWN0VGV4dHVyZSA9IHRoaXMuX2luZGlyZWN0VGV4dHVyZTtcclxuXHRcdGNvbnN0IG1hdHJpY2VzVGV4dHVyZSA9IHRoaXMuX21hdHJpY2VzVGV4dHVyZTtcclxuXHRcdGNvbnN0IGNvbG9yc1RleHR1cmUgPSB0aGlzLl9jb2xvcnNUZXh0dXJlO1xyXG5cclxuXHRcdGluZGlyZWN0VGV4dHVyZS5kaXNwb3NlKCk7XHJcblx0XHR0aGlzLl9pbml0SW5kaXJlY3RUZXh0dXJlKCk7XHJcblx0XHRjb3B5QXJyYXlDb250ZW50cyggaW5kaXJlY3RUZXh0dXJlLmltYWdlLmRhdGEsIHRoaXMuX2luZGlyZWN0VGV4dHVyZS5pbWFnZS5kYXRhICk7XHJcblxyXG5cdFx0bWF0cmljZXNUZXh0dXJlLmRpc3Bvc2UoKTtcclxuXHRcdHRoaXMuX2luaXRNYXRyaWNlc1RleHR1cmUoKTtcclxuXHRcdGNvcHlBcnJheUNvbnRlbnRzKCBtYXRyaWNlc1RleHR1cmUuaW1hZ2UuZGF0YSwgdGhpcy5fbWF0cmljZXNUZXh0dXJlLmltYWdlLmRhdGEgKTtcclxuXHJcblx0XHRpZiAoIGNvbG9yc1RleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRjb2xvcnNUZXh0dXJlLmRpc3Bvc2UoKTtcclxuXHRcdFx0dGhpcy5faW5pdENvbG9yc1RleHR1cmUoKTtcclxuXHRcdFx0Y29weUFycmF5Q29udGVudHMoIGNvbG9yc1RleHR1cmUuaW1hZ2UuZGF0YSwgdGhpcy5fY29sb3JzVGV4dHVyZS5pbWFnZS5kYXRhICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlc2l6ZXMgdGhlIGF2YWlsYWJsZSBzcGFjZSBpbiB0aGUgYmF0Y2gncyB2ZXJ0ZXggYW5kIGluZGV4IGJ1ZmZlciBhdHRyaWJ1dGVzIHRvIHRoZSBwcm92aWRlZCBzaXplcy5cclxuXHQgKiBJZiB0aGUgcHJvdmlkZWQgYXJndW1lbnRzIHNocmluayB0aGUgZ2VvbWV0cnkgYnVmZmVycyBidXQgdGhlcmUgaXMgbm90IGVub3VnaCB1bnVzZWQgc3BhY2UgYXQgdGhlXHJcblx0ICogZW5kIG9mIHRoZSBnZW9tZXRyeSBhdHRyaWJ1dGVzIHRoZW4gYW4gZXJyb3IgaXMgdGhyb3duLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IG1heFZlcnRleENvdW50IC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIHZlcnRpY2VzIHRvIGJlIHVzZWQgYnkgYWxsIHVuaXF1ZSBnZW9tZXRyaWVzIHRvIHJlc2l6ZSB0by5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbWF4SW5kZXhDb3VudCAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiBpbmRpY2VzIHRvIGJlIHVzZWQgYnkgYWxsIHVuaXF1ZSBnZW9tZXRyaWVzIHRvIHJlc2l6ZSB0by5cclxuXHQqL1xyXG5cdHNldEdlb21ldHJ5U2l6ZSggbWF4VmVydGV4Q291bnQsIG1heEluZGV4Q291bnQgKSB7XHJcblxyXG5cdFx0Ly8gQ2hlY2sgaWYgd2UgY2FuIHNocmluayB0byB0aGUgcmVxdWVzdGVkIHZlcnRleCBhdHRyaWJ1dGUgc2l6ZVxyXG5cdFx0Y29uc3QgdmFsaWRSYW5nZXMgPSBbIC4uLnRoaXMuX2dlb21ldHJ5SW5mbyBdLmZpbHRlciggaW5mbyA9PiBpbmZvLmFjdGl2ZSApO1xyXG5cdFx0Y29uc3QgcmVxdWlyZWRWZXJ0ZXhMZW5ndGggPSBNYXRoLm1heCggLi4udmFsaWRSYW5nZXMubWFwKCByYW5nZSA9PiByYW5nZS52ZXJ0ZXhTdGFydCArIHJhbmdlLnJlc2VydmVkVmVydGV4Q291bnQgKSApO1xyXG5cdFx0aWYgKCByZXF1aXJlZFZlcnRleExlbmd0aCA+IG1heFZlcnRleENvdW50ICkge1xyXG5cclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCBgQmF0Y2hlZE1lc2g6IEdlb21ldHJ5IHZlcnRleCB2YWx1ZXMgYXJlIGJlaW5nIHVzZWQgb3V0c2lkZSB0aGUgcmFuZ2UgJHsgbWF4SW5kZXhDb3VudCB9LiBDYW5ub3Qgc2hyaW5rIGZ1cnRoZXIuYCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBDaGVjayBpZiB3ZSBjYW4gc2hyaW5rIHRvIHRoZSByZXF1ZXN0ZWQgaW5kZXggYXR0cmlidXRlIHNpemVcclxuXHRcdGlmICggdGhpcy5nZW9tZXRyeS5pbmRleCApIHtcclxuXHJcblx0XHRcdGNvbnN0IHJlcXVpcmVkSW5kZXhMZW5ndGggPSBNYXRoLm1heCggLi4udmFsaWRSYW5nZXMubWFwKCByYW5nZSA9PiByYW5nZS5pbmRleFN0YXJ0ICsgcmFuZ2UucmVzZXJ2ZWRJbmRleENvdW50ICkgKTtcclxuXHRcdFx0aWYgKCByZXF1aXJlZEluZGV4TGVuZ3RoID4gbWF4SW5kZXhDb3VudCApIHtcclxuXHJcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCBgQmF0Y2hlZE1lc2g6IEdlb21ldHJ5IGluZGV4IHZhbHVlcyBhcmUgYmVpbmcgdXNlZCBvdXRzaWRlIHRoZSByYW5nZSAkeyBtYXhJbmRleENvdW50IH0uIENhbm5vdCBzaHJpbmsgZnVydGhlci5gICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0Ly8gZGlzcG9zZSBvZiB0aGUgcHJldmlvdXMgZ2VvbWV0cnlcclxuXHRcdGNvbnN0IG9sZEdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcclxuXHRcdG9sZEdlb21ldHJ5LmRpc3Bvc2UoKTtcclxuXHJcblx0XHQvLyByZWNyZWF0ZSB0aGUgZ2VvbWV0cnkgbmVlZGVkIGJhc2VkIG9uIHRoZSBwcmV2aW91cyB2YXJpYW50XHJcblx0XHR0aGlzLl9tYXhWZXJ0ZXhDb3VudCA9IG1heFZlcnRleENvdW50O1xyXG5cdFx0dGhpcy5fbWF4SW5kZXhDb3VudCA9IG1heEluZGV4Q291bnQ7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9nZW9tZXRyeUluaXRpYWxpemVkICkge1xyXG5cclxuXHRcdFx0dGhpcy5fZ2VvbWV0cnlJbml0aWFsaXplZCA9IGZhbHNlO1xyXG5cdFx0XHR0aGlzLmdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XHJcblx0XHRcdHRoaXMuX2luaXRpYWxpemVHZW9tZXRyeSggb2xkR2VvbWV0cnkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gY29weSBkYXRhIGZyb20gdGhlIHByZXZpb3VzIGdlb21ldHJ5XHJcblx0XHRjb25zdCBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XHJcblx0XHRpZiAoIG9sZEdlb21ldHJ5LmluZGV4ICkge1xyXG5cclxuXHRcdFx0Y29weUFycmF5Q29udGVudHMoIG9sZEdlb21ldHJ5LmluZGV4LmFycmF5LCBnZW9tZXRyeS5pbmRleC5hcnJheSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmb3IgKCBjb25zdCBrZXkgaW4gb2xkR2VvbWV0cnkuYXR0cmlidXRlcyApIHtcclxuXHJcblx0XHRcdGNvcHlBcnJheUNvbnRlbnRzKCBvbGRHZW9tZXRyeS5hdHRyaWJ1dGVzWyBrZXkgXS5hcnJheSwgZ2VvbWV0cnkuYXR0cmlidXRlc1sga2V5IF0uYXJyYXkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0cmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICkge1xyXG5cclxuXHRcdGNvbnN0IGluc3RhbmNlSW5mbyA9IHRoaXMuX2luc3RhbmNlSW5mbztcclxuXHRcdGNvbnN0IGdlb21ldHJ5SW5mb0xpc3QgPSB0aGlzLl9nZW9tZXRyeUluZm87XHJcblx0XHRjb25zdCBtYXRyaXhXb3JsZCA9IHRoaXMubWF0cml4V29ybGQ7XHJcblx0XHRjb25zdCBiYXRjaEdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcclxuXHJcblx0XHQvLyBpdGVyYXRlIG92ZXIgZWFjaCBnZW9tZXRyeVxyXG5cdFx0X21lc2gubWF0ZXJpYWwgPSB0aGlzLm1hdGVyaWFsO1xyXG5cdFx0X21lc2guZ2VvbWV0cnkuaW5kZXggPSBiYXRjaEdlb21ldHJ5LmluZGV4O1xyXG5cdFx0X21lc2guZ2VvbWV0cnkuYXR0cmlidXRlcyA9IGJhdGNoR2VvbWV0cnkuYXR0cmlidXRlcztcclxuXHRcdGlmICggX21lc2guZ2VvbWV0cnkuYm91bmRpbmdCb3ggPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRfbWVzaC5nZW9tZXRyeS5ib3VuZGluZ0JveCA9IG5ldyBCb3gzKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggX21lc2guZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRfbWVzaC5nZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSA9IG5ldyBTcGhlcmUoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gaW5zdGFuY2VJbmZvLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRpZiAoICEgaW5zdGFuY2VJbmZvWyBpIF0udmlzaWJsZSB8fCAhIGluc3RhbmNlSW5mb1sgaSBdLmFjdGl2ZSApIHtcclxuXHJcblx0XHRcdFx0Y29udGludWU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBnZW9tZXRyeUlkID0gaW5zdGFuY2VJbmZvWyBpIF0uZ2VvbWV0cnlJbmRleDtcclxuXHRcdFx0Y29uc3QgZ2VvbWV0cnlJbmZvID0gZ2VvbWV0cnlJbmZvTGlzdFsgZ2VvbWV0cnlJZCBdO1xyXG5cdFx0XHRfbWVzaC5nZW9tZXRyeS5zZXREcmF3UmFuZ2UoIGdlb21ldHJ5SW5mby5zdGFydCwgZ2VvbWV0cnlJbmZvLmNvdW50ICk7XHJcblxyXG5cdFx0XHQvLyBnZXQgdGhlIGludGVyc2VjdHNcclxuXHRcdFx0dGhpcy5nZXRNYXRyaXhBdCggaSwgX21lc2gubWF0cml4V29ybGQgKS5wcmVtdWx0aXBseSggbWF0cml4V29ybGQgKTtcclxuXHRcdFx0dGhpcy5nZXRCb3VuZGluZ0JveEF0KCBnZW9tZXRyeUlkLCBfbWVzaC5nZW9tZXRyeS5ib3VuZGluZ0JveCApO1xyXG5cdFx0XHR0aGlzLmdldEJvdW5kaW5nU3BoZXJlQXQoIGdlb21ldHJ5SWQsIF9tZXNoLmdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlICk7XHJcblx0XHRcdF9tZXNoLnJheWNhc3QoIHJheWNhc3RlciwgX2JhdGNoSW50ZXJzZWN0cyApO1xyXG5cclxuXHRcdFx0Ly8gYWRkIGJhdGNoIGlkIHRvIHRoZSBpbnRlcnNlY3RzXHJcblx0XHRcdGZvciAoIGxldCBqID0gMCwgbCA9IF9iYXRjaEludGVyc2VjdHMubGVuZ3RoOyBqIDwgbDsgaiArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgaW50ZXJzZWN0ID0gX2JhdGNoSW50ZXJzZWN0c1sgaiBdO1xyXG5cdFx0XHRcdGludGVyc2VjdC5vYmplY3QgPSB0aGlzO1xyXG5cdFx0XHRcdGludGVyc2VjdC5iYXRjaElkID0gaTtcclxuXHRcdFx0XHRpbnRlcnNlY3RzLnB1c2goIGludGVyc2VjdCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0X2JhdGNoSW50ZXJzZWN0cy5sZW5ndGggPSAwO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRfbWVzaC5tYXRlcmlhbCA9IG51bGw7XHJcblx0XHRfbWVzaC5nZW9tZXRyeS5pbmRleCA9IG51bGw7XHJcblx0XHRfbWVzaC5nZW9tZXRyeS5hdHRyaWJ1dGVzID0ge307XHJcblx0XHRfbWVzaC5nZW9tZXRyeS5zZXREcmF3UmFuZ2UoIDAsIEluZmluaXR5ICk7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMuZ2VvbWV0cnkgPSBzb3VyY2UuZ2VvbWV0cnkuY2xvbmUoKTtcclxuXHRcdHRoaXMucGVyT2JqZWN0RnJ1c3R1bUN1bGxlZCA9IHNvdXJjZS5wZXJPYmplY3RGcnVzdHVtQ3VsbGVkO1xyXG5cdFx0dGhpcy5zb3J0T2JqZWN0cyA9IHNvdXJjZS5zb3J0T2JqZWN0cztcclxuXHRcdHRoaXMuYm91bmRpbmdCb3ggPSBzb3VyY2UuYm91bmRpbmdCb3ggIT09IG51bGwgPyBzb3VyY2UuYm91bmRpbmdCb3guY2xvbmUoKSA6IG51bGw7XHJcblx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gc291cmNlLmJvdW5kaW5nU3BoZXJlICE9PSBudWxsID8gc291cmNlLmJvdW5kaW5nU3BoZXJlLmNsb25lKCkgOiBudWxsO1xyXG5cclxuXHRcdHRoaXMuX2dlb21ldHJ5SW5mbyA9IHNvdXJjZS5fZ2VvbWV0cnlJbmZvLm1hcCggaW5mbyA9PiAoIHtcclxuXHRcdFx0Li4uaW5mbyxcclxuXHJcblx0XHRcdGJvdW5kaW5nQm94OiBpbmZvLmJvdW5kaW5nQm94ICE9PSBudWxsID8gaW5mby5ib3VuZGluZ0JveC5jbG9uZSgpIDogbnVsbCxcclxuXHRcdFx0Ym91bmRpbmdTcGhlcmU6IGluZm8uYm91bmRpbmdTcGhlcmUgIT09IG51bGwgPyBpbmZvLmJvdW5kaW5nU3BoZXJlLmNsb25lKCkgOiBudWxsLFxyXG5cdFx0fSApICk7XHJcblx0XHR0aGlzLl9pbnN0YW5jZUluZm8gPSBzb3VyY2UuX2luc3RhbmNlSW5mby5tYXAoIGluZm8gPT4gKCB7IC4uLmluZm8gfSApICk7XHJcblxyXG5cdFx0dGhpcy5fbWF4SW5zdGFuY2VDb3VudCA9IHNvdXJjZS5fbWF4SW5zdGFuY2VDb3VudDtcclxuXHRcdHRoaXMuX21heFZlcnRleENvdW50ID0gc291cmNlLl9tYXhWZXJ0ZXhDb3VudDtcclxuXHRcdHRoaXMuX21heEluZGV4Q291bnQgPSBzb3VyY2UuX21heEluZGV4Q291bnQ7XHJcblxyXG5cdFx0dGhpcy5fZ2VvbWV0cnlJbml0aWFsaXplZCA9IHNvdXJjZS5fZ2VvbWV0cnlJbml0aWFsaXplZDtcclxuXHRcdHRoaXMuX2dlb21ldHJ5Q291bnQgPSBzb3VyY2UuX2dlb21ldHJ5Q291bnQ7XHJcblx0XHR0aGlzLl9tdWx0aURyYXdDb3VudHMgPSBzb3VyY2UuX211bHRpRHJhd0NvdW50cy5zbGljZSgpO1xyXG5cdFx0dGhpcy5fbXVsdGlEcmF3U3RhcnRzID0gc291cmNlLl9tdWx0aURyYXdTdGFydHMuc2xpY2UoKTtcclxuXHJcblx0XHR0aGlzLl9tYXRyaWNlc1RleHR1cmUgPSBzb3VyY2UuX21hdHJpY2VzVGV4dHVyZS5jbG9uZSgpO1xyXG5cdFx0dGhpcy5fbWF0cmljZXNUZXh0dXJlLmltYWdlLmRhdGEgPSB0aGlzLl9tYXRyaWNlc1RleHR1cmUuaW1hZ2UuZGF0YS5zbGljZSgpO1xyXG5cclxuXHRcdGlmICggdGhpcy5fY29sb3JzVGV4dHVyZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuX2NvbG9yc1RleHR1cmUgPSBzb3VyY2UuX2NvbG9yc1RleHR1cmUuY2xvbmUoKTtcclxuXHRcdFx0dGhpcy5fY29sb3JzVGV4dHVyZS5pbWFnZS5kYXRhID0gdGhpcy5fY29sb3JzVGV4dHVyZS5pbWFnZS5kYXRhLnNsaWNlKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZyZWVzIHRoZSBHUFUtcmVsYXRlZCByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHRoaXMgaW5zdGFuY2UuIENhbGwgdGhpc1xyXG5cdCAqIG1ldGhvZCB3aGVuZXZlciB0aGlzIGluc3RhbmNlIGlzIG5vIGxvbmdlciB1c2VkIGluIHlvdXIgYXBwLlxyXG5cdCAqL1xyXG5cdGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0Ly8gQXNzdW1pbmcgdGhlIGdlb21ldHJ5IGlzIG5vdCBzaGFyZWQgd2l0aCBvdGhlciBtZXNoZXNcclxuXHRcdHRoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpO1xyXG5cclxuXHRcdHRoaXMuX21hdHJpY2VzVGV4dHVyZS5kaXNwb3NlKCk7XHJcblx0XHR0aGlzLl9tYXRyaWNlc1RleHR1cmUgPSBudWxsO1xyXG5cclxuXHRcdHRoaXMuX2luZGlyZWN0VGV4dHVyZS5kaXNwb3NlKCk7XHJcblx0XHR0aGlzLl9pbmRpcmVjdFRleHR1cmUgPSBudWxsO1xyXG5cclxuXHRcdGlmICggdGhpcy5fY29sb3JzVGV4dHVyZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuX2NvbG9yc1RleHR1cmUuZGlzcG9zZSgpO1xyXG5cdFx0XHR0aGlzLl9jb2xvcnNUZXh0dXJlID0gbnVsbDtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0b25CZWZvcmVSZW5kZXIoIHJlbmRlcmVyLCBzY2VuZSwgY2FtZXJhLCBnZW9tZXRyeSwgbWF0ZXJpYWwvKiwgX2dyb3VwKi8gKSB7XHJcblxyXG5cdFx0Ly8gaWYgdmlzaWJpbGl0eSBoYXMgbm90IGNoYW5nZWQgYW5kIGZydXN0dW0gY3VsbGluZyBhbmQgb2JqZWN0IHNvcnRpbmcgaXMgbm90IHJlcXVpcmVkXHJcblx0XHQvLyB0aGVuIHNraXAgaXRlcmF0aW5nIG92ZXIgYWxsIGl0ZW1zXHJcblx0XHRpZiAoICEgdGhpcy5fdmlzaWJpbGl0eUNoYW5nZWQgJiYgISB0aGlzLnBlck9iamVjdEZydXN0dW1DdWxsZWQgJiYgISB0aGlzLnNvcnRPYmplY3RzICkge1xyXG5cclxuXHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyB0aGUgaW5kZXhlZCB2ZXJzaW9uIG9mIHRoZSBtdWx0aSBkcmF3IGZ1bmN0aW9uIHJlcXVpcmVzIHNwZWNpZnlpbmcgdGhlIHN0YXJ0XHJcblx0XHQvLyBvZmZzZXQgaW4gYnl0ZXMuXHJcblx0XHRjb25zdCBpbmRleCA9IGdlb21ldHJ5LmdldEluZGV4KCk7XHJcblx0XHRjb25zdCBieXRlc1BlckVsZW1lbnQgPSBpbmRleCA9PT0gbnVsbCA/IDEgOiBpbmRleC5hcnJheS5CWVRFU19QRVJfRUxFTUVOVDtcclxuXHJcblx0XHRjb25zdCBpbnN0YW5jZUluZm8gPSB0aGlzLl9pbnN0YW5jZUluZm87XHJcblx0XHRjb25zdCBtdWx0aURyYXdTdGFydHMgPSB0aGlzLl9tdWx0aURyYXdTdGFydHM7XHJcblx0XHRjb25zdCBtdWx0aURyYXdDb3VudHMgPSB0aGlzLl9tdWx0aURyYXdDb3VudHM7XHJcblx0XHRjb25zdCBnZW9tZXRyeUluZm9MaXN0ID0gdGhpcy5fZ2VvbWV0cnlJbmZvO1xyXG5cdFx0Y29uc3QgcGVyT2JqZWN0RnJ1c3R1bUN1bGxlZCA9IHRoaXMucGVyT2JqZWN0RnJ1c3R1bUN1bGxlZDtcclxuXHRcdGNvbnN0IGluZGlyZWN0VGV4dHVyZSA9IHRoaXMuX2luZGlyZWN0VGV4dHVyZTtcclxuXHRcdGNvbnN0IGluZGlyZWN0QXJyYXkgPSBpbmRpcmVjdFRleHR1cmUuaW1hZ2UuZGF0YTtcclxuXHJcblx0XHQvLyBwcmVwYXJlIHRoZSBmcnVzdHVtIGluIHRoZSBsb2NhbCBmcmFtZVxyXG5cdFx0aWYgKCBwZXJPYmplY3RGcnVzdHVtQ3VsbGVkICkge1xyXG5cclxuXHRcdFx0X21hdHJpeFxyXG5cdFx0XHRcdC5tdWx0aXBseU1hdHJpY2VzKCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeCwgY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSApXHJcblx0XHRcdFx0Lm11bHRpcGx5KCB0aGlzLm1hdHJpeFdvcmxkICk7XHJcblx0XHRcdF9mcnVzdHVtLnNldEZyb21Qcm9qZWN0aW9uTWF0cml4KFxyXG5cdFx0XHRcdF9tYXRyaXgsXHJcblx0XHRcdFx0cmVuZGVyZXIuY29vcmRpbmF0ZVN5c3RlbVxyXG5cdFx0XHQpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRsZXQgbXVsdGlEcmF3Q291bnQgPSAwO1xyXG5cdFx0aWYgKCB0aGlzLnNvcnRPYmplY3RzICkge1xyXG5cclxuXHRcdFx0Ly8gZ2V0IHRoZSBjYW1lcmEgcG9zaXRpb24gaW4gdGhlIGxvY2FsIGZyYW1lXHJcblx0XHRcdF9tYXRyaXguY29weSggdGhpcy5tYXRyaXhXb3JsZCApLmludmVydCgpO1xyXG5cdFx0XHRfdmVjdG9yLnNldEZyb21NYXRyaXhQb3NpdGlvbiggY2FtZXJhLm1hdHJpeFdvcmxkICkuYXBwbHlNYXRyaXg0KCBfbWF0cml4ICk7XHJcblx0XHRcdF9mb3J3YXJkLnNldCggMCwgMCwgLSAxICkudHJhbnNmb3JtRGlyZWN0aW9uKCBjYW1lcmEubWF0cml4V29ybGQgKS50cmFuc2Zvcm1EaXJlY3Rpb24oIF9tYXRyaXggKTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGluc3RhbmNlSW5mby5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIGluc3RhbmNlSW5mb1sgaSBdLnZpc2libGUgJiYgaW5zdGFuY2VJbmZvWyBpIF0uYWN0aXZlICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGdlb21ldHJ5SWQgPSBpbnN0YW5jZUluZm9bIGkgXS5nZW9tZXRyeUluZGV4O1xyXG5cclxuXHRcdFx0XHRcdC8vIGdldCB0aGUgYm91bmRzIGluIHdvcmxkIHNwYWNlXHJcblx0XHRcdFx0XHR0aGlzLmdldE1hdHJpeEF0KCBpLCBfbWF0cml4ICk7XHJcblx0XHRcdFx0XHR0aGlzLmdldEJvdW5kaW5nU3BoZXJlQXQoIGdlb21ldHJ5SWQsIF9zcGhlcmUgKS5hcHBseU1hdHJpeDQoIF9tYXRyaXggKTtcclxuXHJcblx0XHRcdFx0XHQvLyBkZXRlcm1pbmUgd2hldGhlciB0aGUgYmF0Y2hlZCBnZW9tZXRyeSBpcyB3aXRoaW4gdGhlIGZydXN0dW1cclxuXHRcdFx0XHRcdGxldCBjdWxsZWQgPSBmYWxzZTtcclxuXHRcdFx0XHRcdGlmICggcGVyT2JqZWN0RnJ1c3R1bUN1bGxlZCApIHtcclxuXHJcblx0XHRcdFx0XHRcdGN1bGxlZCA9ICEgX2ZydXN0dW0uaW50ZXJzZWN0c1NwaGVyZSggX3NwaGVyZSApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRpZiAoICEgY3VsbGVkICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Ly8gZ2V0IHRoZSBkaXN0YW5jZSBmcm9tIGNhbWVyYSB1c2VkIGZvciBzb3J0aW5nXHJcblx0XHRcdFx0XHRcdGNvbnN0IGdlb21ldHJ5SW5mbyA9IGdlb21ldHJ5SW5mb0xpc3RbIGdlb21ldHJ5SWQgXTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgeiA9IF90ZW1wLnN1YlZlY3RvcnMoIF9zcGhlcmUuY2VudGVyLCBfdmVjdG9yICkuZG90KCBfZm9yd2FyZCApO1xyXG5cdFx0XHRcdFx0XHRfcmVuZGVyTGlzdC5wdXNoKCBnZW9tZXRyeUluZm8uc3RhcnQsIGdlb21ldHJ5SW5mby5jb3VudCwgeiwgaSApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gU29ydCB0aGUgZHJhdyByYW5nZXMgYW5kIHByZXAgZm9yIHJlbmRlcmluZ1xyXG5cdFx0XHRjb25zdCBsaXN0ID0gX3JlbmRlckxpc3QubGlzdDtcclxuXHRcdFx0Y29uc3QgY3VzdG9tU29ydCA9IHRoaXMuY3VzdG9tU29ydDtcclxuXHRcdFx0aWYgKCBjdXN0b21Tb3J0ID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRsaXN0LnNvcnQoIG1hdGVyaWFsLnRyYW5zcGFyZW50ID8gc29ydFRyYW5zcGFyZW50IDogc29ydE9wYXF1ZSApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0Y3VzdG9tU29ydC5jYWxsKCB0aGlzLCBsaXN0LCBjYW1lcmEgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGxpc3QubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgaXRlbSA9IGxpc3RbIGkgXTtcclxuXHRcdFx0XHRtdWx0aURyYXdTdGFydHNbIG11bHRpRHJhd0NvdW50IF0gPSBpdGVtLnN0YXJ0ICogYnl0ZXNQZXJFbGVtZW50O1xyXG5cdFx0XHRcdG11bHRpRHJhd0NvdW50c1sgbXVsdGlEcmF3Q291bnQgXSA9IGl0ZW0uY291bnQ7XHJcblx0XHRcdFx0aW5kaXJlY3RBcnJheVsgbXVsdGlEcmF3Q291bnQgXSA9IGl0ZW0uaW5kZXg7XHJcblx0XHRcdFx0bXVsdGlEcmF3Q291bnQgKys7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRfcmVuZGVyTGlzdC5yZXNldCgpO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBpbnN0YW5jZUluZm8ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBpbnN0YW5jZUluZm9bIGkgXS52aXNpYmxlICYmIGluc3RhbmNlSW5mb1sgaSBdLmFjdGl2ZSApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBnZW9tZXRyeUlkID0gaW5zdGFuY2VJbmZvWyBpIF0uZ2VvbWV0cnlJbmRleDtcclxuXHJcblx0XHRcdFx0XHQvLyBkZXRlcm1pbmUgd2hldGhlciB0aGUgYmF0Y2hlZCBnZW9tZXRyeSBpcyB3aXRoaW4gdGhlIGZydXN0dW1cclxuXHRcdFx0XHRcdGxldCBjdWxsZWQgPSBmYWxzZTtcclxuXHRcdFx0XHRcdGlmICggcGVyT2JqZWN0RnJ1c3R1bUN1bGxlZCApIHtcclxuXHJcblx0XHRcdFx0XHRcdC8vIGdldCB0aGUgYm91bmRzIGluIHdvcmxkIHNwYWNlXHJcblx0XHRcdFx0XHRcdHRoaXMuZ2V0TWF0cml4QXQoIGksIF9tYXRyaXggKTtcclxuXHRcdFx0XHRcdFx0dGhpcy5nZXRCb3VuZGluZ1NwaGVyZUF0KCBnZW9tZXRyeUlkLCBfc3BoZXJlICkuYXBwbHlNYXRyaXg0KCBfbWF0cml4ICk7XHJcblx0XHRcdFx0XHRcdGN1bGxlZCA9ICEgX2ZydXN0dW0uaW50ZXJzZWN0c1NwaGVyZSggX3NwaGVyZSApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRpZiAoICEgY3VsbGVkICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgZ2VvbWV0cnlJbmZvID0gZ2VvbWV0cnlJbmZvTGlzdFsgZ2VvbWV0cnlJZCBdO1xyXG5cdFx0XHRcdFx0XHRtdWx0aURyYXdTdGFydHNbIG11bHRpRHJhd0NvdW50IF0gPSBnZW9tZXRyeUluZm8uc3RhcnQgKiBieXRlc1BlckVsZW1lbnQ7XHJcblx0XHRcdFx0XHRcdG11bHRpRHJhd0NvdW50c1sgbXVsdGlEcmF3Q291bnQgXSA9IGdlb21ldHJ5SW5mby5jb3VudDtcclxuXHRcdFx0XHRcdFx0aW5kaXJlY3RBcnJheVsgbXVsdGlEcmF3Q291bnQgXSA9IGk7XHJcblx0XHRcdFx0XHRcdG11bHRpRHJhd0NvdW50ICsrO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpbmRpcmVjdFRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cdFx0dGhpcy5fbXVsdGlEcmF3Q291bnQgPSBtdWx0aURyYXdDb3VudDtcclxuXHRcdHRoaXMuX3Zpc2liaWxpdHlDaGFuZ2VkID0gZmFsc2U7XHJcblxyXG5cdH1cclxuXHJcblx0b25CZWZvcmVTaGFkb3coIHJlbmRlcmVyLCBvYmplY3QsIGNhbWVyYSwgc2hhZG93Q2FtZXJhLCBnZW9tZXRyeSwgZGVwdGhNYXRlcmlhbC8qICwgZ3JvdXAgKi8gKSB7XHJcblxyXG5cdFx0dGhpcy5vbkJlZm9yZVJlbmRlciggcmVuZGVyZXIsIG51bGwsIHNoYWRvd0NhbWVyYSwgZ2VvbWV0cnksIGRlcHRoTWF0ZXJpYWwgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgQmF0Y2hlZE1lc2ggfTtcclxuIiwiaW1wb3J0IHsgTWF0ZXJpYWwgfSBmcm9tICcuL01hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi9tYXRoL0NvbG9yLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIG1hdGVyaWFsIGZvciByZW5kZXJpbmcgbGluZSBwcmltaXRpdmVzLlxyXG4gKlxyXG4gKiBNYXRlcmlhbHMgZGVmaW5lIHRoZSBhcHBlYXJhbmNlIG9mIHJlbmRlcmFibGUgM0Qgb2JqZWN0cy5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IDB4ZmZmZmZmIH0gKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBNYXRlcmlhbFxyXG4gKi9cclxuY2xhc3MgTGluZUJhc2ljTWF0ZXJpYWwgZXh0ZW5kcyBNYXRlcmlhbCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbGluZSBiYXNpYyBtYXRlcmlhbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1ldGVyc10gLSBBbiBvYmplY3Qgd2l0aCBvbmUgb3IgbW9yZSBwcm9wZXJ0aWVzXHJcblx0ICogZGVmaW5pbmcgdGhlIG1hdGVyaWFsJ3MgYXBwZWFyYW5jZS4gQW55IHByb3BlcnR5IG9mIHRoZSBtYXRlcmlhbFxyXG5cdCAqIChpbmNsdWRpbmcgYW55IHByb3BlcnR5IGZyb20gaW5oZXJpdGVkIG1hdGVyaWFscykgY2FuIGJlIHBhc3NlZFxyXG5cdCAqIGluIGhlcmUuIENvbG9yIHZhbHVlcyBjYW4gYmUgcGFzc2VkIGFueSB0eXBlIG9mIHZhbHVlIGFjY2VwdGVkXHJcblx0ICogYnkge0BsaW5rIENvbG9yI3NldH0uXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHBhcmFtZXRlcnMgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNMaW5lQmFzaWNNYXRlcmlhbCA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ0xpbmVCYXNpY01hdGVyaWFsJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENvbG9yIG9mIHRoZSBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Q29sb3J9XHJcblx0XHQgKiBAZGVmYXVsdCAoMSwxLDEpXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTZXRzIHRoZSBjb2xvciBvZiB0aGUgbGluZXMgdXNpbmcgZGF0YSBmcm9tIGEgdGV4dHVyZS4gVGhlIHRleHR1cmUgbWFwXHJcblx0XHQgKiBjb2xvciBpcyBtb2R1bGF0ZWQgYnkgdGhlIGRpZmZ1c2UgYGNvbG9yYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENvbnRyb2xzIGxpbmUgdGhpY2tuZXNzIG9yIGxpbmVzLlxyXG5cdFx0ICpcclxuXHRcdCAqIENhbiBvbmx5IGJlIHVzZWQgd2l0aCB7QGxpbmsgU1ZHUmVuZGVyZXJ9LiBXZWJHTCBhbmQgV2ViR1BVXHJcblx0XHQgKiBpZ25vcmUgdGhpcyBzZXR0aW5nIGFuZCBhbHdheXMgcmVuZGVyIGxpbmUgcHJpbWl0aXZlcyB3aXRoIGFcclxuXHRcdCAqIHdpZHRoIG9mIG9uZSBwaXhlbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxpbmV3aWR0aCA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIGFwcGVhcmFuY2Ugb2YgbGluZSBlbmRzLlxyXG5cdFx0ICpcclxuXHRcdCAqIENhbiBvbmx5IGJlIHVzZWQgd2l0aCB7QGxpbmsgU1ZHUmVuZGVyZXJ9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoJ2J1dHQnfCdyb3VuZCd8J3NxdWFyZScpfVxyXG5cdFx0ICogQGRlZmF1bHQgJ3JvdW5kJ1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxpbmVjYXAgPSAncm91bmQnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyBhcHBlYXJhbmNlIG9mIGxpbmUgam9pbnRzLlxyXG5cdFx0ICpcclxuXHRcdCAqIENhbiBvbmx5IGJlIHVzZWQgd2l0aCB7QGxpbmsgU1ZHUmVuZGVyZXJ9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoJ3JvdW5kJ3wnYmV2ZWwnfCdtaXRlcicpfVxyXG5cdFx0ICogQGRlZmF1bHQgJ3JvdW5kJ1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxpbmVqb2luID0gJ3JvdW5kJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIG1hdGVyaWFsIGlzIGFmZmVjdGVkIGJ5IGZvZyBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZm9nID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xyXG5cclxuXHRcdHRoaXMubWFwID0gc291cmNlLm1hcDtcclxuXHJcblx0XHR0aGlzLmxpbmV3aWR0aCA9IHNvdXJjZS5saW5ld2lkdGg7XHJcblx0XHR0aGlzLmxpbmVjYXAgPSBzb3VyY2UubGluZWNhcDtcclxuXHRcdHRoaXMubGluZWpvaW4gPSBzb3VyY2UubGluZWpvaW47XHJcblxyXG5cdFx0dGhpcy5mb2cgPSBzb3VyY2UuZm9nO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBMaW5lQmFzaWNNYXRlcmlhbCB9O1xyXG4iLCJpbXBvcnQgeyBTcGhlcmUgfSBmcm9tICcuLi9tYXRoL1NwaGVyZS5qcyc7XHJcbmltcG9ydCB7IFJheSB9IGZyb20gJy4uL21hdGgvUmF5LmpzJztcclxuaW1wb3J0IHsgTWF0cml4NCB9IGZyb20gJy4uL21hdGgvTWF0cml4NC5qcyc7XHJcbmltcG9ydCB7IE9iamVjdDNEIH0gZnJvbSAnLi4vY29yZS9PYmplY3QzRC5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBMaW5lQmFzaWNNYXRlcmlhbCB9IGZyb20gJy4uL21hdGVyaWFscy9MaW5lQmFzaWNNYXRlcmlhbC5qcyc7XHJcbmltcG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9CdWZmZXJHZW9tZXRyeS5qcyc7XHJcbmltcG9ydCB7IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcblxyXG5jb25zdCBfdlN0YXJ0ID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfdkVuZCA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuXHJcbmNvbnN0IF9pbnZlcnNlTWF0cml4ID0gLypAX19QVVJFX18qLyBuZXcgTWF0cml4NCgpO1xyXG5jb25zdCBfcmF5ID0gLypAX19QVVJFX18qLyBuZXcgUmF5KCk7XHJcbmNvbnN0IF9zcGhlcmUgPSAvKkBfX1BVUkVfXyovIG5ldyBTcGhlcmUoKTtcclxuXHJcbmNvbnN0IF9pbnRlcnNlY3RQb2ludE9uUmF5ID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfaW50ZXJzZWN0UG9pbnRPblNlZ21lbnQgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcblxyXG4vKipcclxuICogQSBjb250aW51b3VzIGxpbmUuIFRoZSBsaW5lIGFyZSByZW5kZXJlZCBieSBjb25uZWN0aW5nIGNvbnNlY3V0aXZlXHJcbiAqIHZlcnRpY2VzIHdpdGggc3RyYWlnaHQgbGluZXMuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IG1hdGVyaWFsID0gbmV3IFRIUkVFLkxpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiAweDAwMDBmZiB9ICk7XHJcbiAqXHJcbiAqIGNvbnN0IHBvaW50cyA9IFtdO1xyXG4gKiBwb2ludHMucHVzaCggbmV3IFRIUkVFLlZlY3RvcjMoIC0gMTAsIDAsIDAgKSApO1xyXG4gKiBwb2ludHMucHVzaCggbmV3IFRIUkVFLlZlY3RvcjMoIDAsIDEwLCAwICkgKTtcclxuICogcG9pbnRzLnB1c2goIG5ldyBUSFJFRS5WZWN0b3IzKCAxMCwgMCwgMCApICk7XHJcbiAqXHJcbiAqIGNvbnN0IGdlb21ldHJ5ID0gbmV3IFRIUkVFLkJ1ZmZlckdlb21ldHJ5KCkuc2V0RnJvbVBvaW50cyggcG9pbnRzICk7XHJcbiAqXHJcbiAqIGNvbnN0IGxpbmUgPSBuZXcgVEhSRUUuTGluZSggZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcbiAqIHNjZW5lLmFkZCggbGluZSApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIE9iamVjdDNEXHJcbiAqL1xyXG5jbGFzcyBMaW5lIGV4dGVuZHMgT2JqZWN0M0Qge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGxpbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0J1ZmZlckdlb21ldHJ5fSBbZ2VvbWV0cnldIC0gVGhlIGxpbmUgZ2VvbWV0cnkuXHJcblx0ICogQHBhcmFtIHtNYXRlcmlhbHxBcnJheTxNYXRlcmlhbD59IFttYXRlcmlhbF0gLSBUaGUgbGluZSBtYXRlcmlhbC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKSwgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoKSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0xpbmUgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdMaW5lJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBsaW5lIGdlb21ldHJ5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtCdWZmZXJHZW9tZXRyeX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nZW9tZXRyeSA9IGdlb21ldHJ5O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGxpbmUgbWF0ZXJpYWwuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge01hdGVyaWFsfEFycmF5PE1hdGVyaWFsPn1cclxuXHRcdCAqIEBkZWZhdWx0IExpbmVCYXNpY01hdGVyaWFsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWF0ZXJpYWwgPSBtYXRlcmlhbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgZGljdGlvbmFyeSByZXByZXNlbnRpbmcgdGhlIG1vcnBoIHRhcmdldHMgaW4gdGhlIGdlb21ldHJ5LiBUaGUga2V5IGlzIHRoZVxyXG5cdFx0ICogbW9ycGggdGFyZ2V0cyBuYW1lLCB0aGUgdmFsdWUgaXRzIGF0dHJpYnV0ZSBpbmRleC4gVGhpcyBtZW1iZXIgaXMgYHVuZGVmaW5lZGBcclxuXHRcdCAqIGJ5IGRlZmF1bHQgYW5kIG9ubHkgc2V0IHdoZW4gbW9ycGggdGFyZ2V0cyBhcmUgZGV0ZWN0ZWQgaW4gdGhlIGdlb21ldHJ5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3Q8U3RyaW5nLG51bWJlcj58dW5kZWZpbmVkfVxyXG5cdFx0ICogQGRlZmF1bHQgdW5kZWZpbmVkXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5ID0gdW5kZWZpbmVkO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQW4gYXJyYXkgb2Ygd2VpZ2h0cyB0eXBpY2FsbHkgaW4gdGhlIHJhbmdlIGBbMCwxXWAgdGhhdCBzcGVjaWZ5IGhvdyBtdWNoIG9mIHRoZSBtb3JwaFxyXG5cdFx0ICogaXMgYXBwbGllZC4gVGhpcyBtZW1iZXIgaXMgYHVuZGVmaW5lZGAgYnkgZGVmYXVsdCBhbmQgb25seSBzZXQgd2hlbiBtb3JwaCB0YXJnZXRzIGFyZVxyXG5cdFx0ICogZGV0ZWN0ZWQgaW4gdGhlIGdlb21ldHJ5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxudW1iZXI+fHVuZGVmaW5lZH1cclxuXHRcdCAqIEBkZWZhdWx0IHVuZGVmaW5lZFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyA9IHVuZGVmaW5lZDtcclxuXHJcblx0XHR0aGlzLnVwZGF0ZU1vcnBoVGFyZ2V0cygpO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSwgcmVjdXJzaXZlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSwgcmVjdXJzaXZlICk7XHJcblxyXG5cdFx0dGhpcy5tYXRlcmlhbCA9IEFycmF5LmlzQXJyYXkoIHNvdXJjZS5tYXRlcmlhbCApID8gc291cmNlLm1hdGVyaWFsLnNsaWNlKCkgOiBzb3VyY2UubWF0ZXJpYWw7XHJcblx0XHR0aGlzLmdlb21ldHJ5ID0gc291cmNlLmdlb21ldHJ5O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIGFuIGFycmF5IG9mIGRpc3RhbmNlIHZhbHVlcyB3aGljaCBhcmUgbmVjZXNzYXJ5IGZvciByZW5kZXJpbmcgZGFzaGVkIGxpbmVzLlxyXG5cdCAqIEZvciBlYWNoIHZlcnRleCBpbiB0aGUgZ2VvbWV0cnksIHRoZSBtZXRob2QgY2FsY3VsYXRlcyB0aGUgY3VtdWxhdGl2ZSBsZW5ndGggZnJvbSB0aGVcclxuXHQgKiBjdXJyZW50IHBvaW50IHRvIHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiB0aGUgbGluZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0xpbmV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbGluZS5cclxuXHQgKi9cclxuXHRjb21wdXRlTGluZURpc3RhbmNlcygpIHtcclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XHJcblxyXG5cdFx0Ly8gd2UgYXNzdW1lIG5vbi1pbmRleGVkIGdlb21ldHJ5XHJcblxyXG5cdFx0aWYgKCBnZW9tZXRyeS5pbmRleCA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGNvbnN0IHBvc2l0aW9uQXR0cmlidXRlID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjtcclxuXHRcdFx0Y29uc3QgbGluZURpc3RhbmNlcyA9IFsgMCBdO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAxLCBsID0gcG9zaXRpb25BdHRyaWJ1dGUuY291bnQ7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRfdlN0YXJ0LmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uQXR0cmlidXRlLCBpIC0gMSApO1xyXG5cdFx0XHRcdF92RW5kLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uQXR0cmlidXRlLCBpICk7XHJcblxyXG5cdFx0XHRcdGxpbmVEaXN0YW5jZXNbIGkgXSA9IGxpbmVEaXN0YW5jZXNbIGkgLSAxIF07XHJcblx0XHRcdFx0bGluZURpc3RhbmNlc1sgaSBdICs9IF92U3RhcnQuZGlzdGFuY2VUbyggX3ZFbmQgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGdlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ2xpbmVEaXN0YW5jZScsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBsaW5lRGlzdGFuY2VzLCAxICkgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGluZS5jb21wdXRlTGluZURpc3RhbmNlcygpOiBDb21wdXRhdGlvbiBvbmx5IHBvc3NpYmxlIHdpdGggbm9uLWluZGV4ZWQgQnVmZmVyR2VvbWV0cnkuJyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyBpbnRlcnNlY3Rpb24gcG9pbnRzIGJldHdlZW4gYSBjYXN0ZWQgcmF5IGFuZCB0aGlzIGxpbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JheWNhc3Rlcn0gcmF5Y2FzdGVyIC0gVGhlIHJheWNhc3Rlci5cclxuXHQgKiBAcGFyYW0ge0FycmF5PE9iamVjdD59IGludGVyc2VjdHMgLSBUaGUgdGFyZ2V0IGFycmF5IHRoYXQgaG9sZHMgdGhlIGludGVyc2VjdGlvbiBwb2ludHMuXHJcblx0ICovXHJcblx0cmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICkge1xyXG5cclxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcclxuXHRcdGNvbnN0IG1hdHJpeFdvcmxkID0gdGhpcy5tYXRyaXhXb3JsZDtcclxuXHRcdGNvbnN0IHRocmVzaG9sZCA9IHJheWNhc3Rlci5wYXJhbXMuTGluZS50aHJlc2hvbGQ7XHJcblx0XHRjb25zdCBkcmF3UmFuZ2UgPSBnZW9tZXRyeS5kcmF3UmFuZ2U7XHJcblxyXG5cdFx0Ly8gQ2hlY2tpbmcgYm91bmRpbmdTcGhlcmUgZGlzdGFuY2UgdG8gcmF5XHJcblxyXG5cdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCApIGdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xyXG5cclxuXHRcdF9zcGhlcmUuY29weSggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgKTtcclxuXHRcdF9zcGhlcmUuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApO1xyXG5cdFx0X3NwaGVyZS5yYWRpdXMgKz0gdGhyZXNob2xkO1xyXG5cclxuXHRcdGlmICggcmF5Y2FzdGVyLnJheS5pbnRlcnNlY3RzU3BoZXJlKCBfc3BoZXJlICkgPT09IGZhbHNlICkgcmV0dXJuO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0X2ludmVyc2VNYXRyaXguY29weSggbWF0cml4V29ybGQgKS5pbnZlcnQoKTtcclxuXHRcdF9yYXkuY29weSggcmF5Y2FzdGVyLnJheSApLmFwcGx5TWF0cml4NCggX2ludmVyc2VNYXRyaXggKTtcclxuXHJcblx0XHRjb25zdCBsb2NhbFRocmVzaG9sZCA9IHRocmVzaG9sZCAvICggKCB0aGlzLnNjYWxlLnggKyB0aGlzLnNjYWxlLnkgKyB0aGlzLnNjYWxlLnogKSAvIDMgKTtcclxuXHRcdGNvbnN0IGxvY2FsVGhyZXNob2xkU3EgPSBsb2NhbFRocmVzaG9sZCAqIGxvY2FsVGhyZXNob2xkO1xyXG5cclxuXHRcdGNvbnN0IHN0ZXAgPSB0aGlzLmlzTGluZVNlZ21lbnRzID8gMiA6IDE7XHJcblxyXG5cdFx0Y29uc3QgaW5kZXggPSBnZW9tZXRyeS5pbmRleDtcclxuXHRcdGNvbnN0IGF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzO1xyXG5cdFx0Y29uc3QgcG9zaXRpb25BdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLnBvc2l0aW9uO1xyXG5cclxuXHRcdGlmICggaW5kZXggIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBzdGFydCA9IE1hdGgubWF4KCAwLCBkcmF3UmFuZ2Uuc3RhcnQgKTtcclxuXHRcdFx0Y29uc3QgZW5kID0gTWF0aC5taW4oIGluZGV4LmNvdW50LCAoIGRyYXdSYW5nZS5zdGFydCArIGRyYXdSYW5nZS5jb3VudCApICk7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IHN0YXJ0LCBsID0gZW5kIC0gMTsgaSA8IGw7IGkgKz0gc3RlcCApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgYSA9IGluZGV4LmdldFgoIGkgKTtcclxuXHRcdFx0XHRjb25zdCBiID0gaW5kZXguZ2V0WCggaSArIDEgKTtcclxuXHJcblx0XHRcdFx0Y29uc3QgaW50ZXJzZWN0ID0gY2hlY2tJbnRlcnNlY3Rpb24oIHRoaXMsIHJheWNhc3RlciwgX3JheSwgbG9jYWxUaHJlc2hvbGRTcSwgYSwgYiwgaSApO1xyXG5cclxuXHRcdFx0XHRpZiAoIGludGVyc2VjdCApIHtcclxuXHJcblx0XHRcdFx0XHRpbnRlcnNlY3RzLnB1c2goIGludGVyc2VjdCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMuaXNMaW5lTG9vcCApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgYSA9IGluZGV4LmdldFgoIGVuZCAtIDEgKTtcclxuXHRcdFx0XHRjb25zdCBiID0gaW5kZXguZ2V0WCggc3RhcnQgKTtcclxuXHJcblx0XHRcdFx0Y29uc3QgaW50ZXJzZWN0ID0gY2hlY2tJbnRlcnNlY3Rpb24oIHRoaXMsIHJheWNhc3RlciwgX3JheSwgbG9jYWxUaHJlc2hvbGRTcSwgYSwgYiwgZW5kIC0gMSApO1xyXG5cclxuXHRcdFx0XHRpZiAoIGludGVyc2VjdCApIHtcclxuXHJcblx0XHRcdFx0XHRpbnRlcnNlY3RzLnB1c2goIGludGVyc2VjdCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGNvbnN0IHN0YXJ0ID0gTWF0aC5tYXgoIDAsIGRyYXdSYW5nZS5zdGFydCApO1xyXG5cdFx0XHRjb25zdCBlbmQgPSBNYXRoLm1pbiggcG9zaXRpb25BdHRyaWJ1dGUuY291bnQsICggZHJhd1JhbmdlLnN0YXJ0ICsgZHJhd1JhbmdlLmNvdW50ICkgKTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gc3RhcnQsIGwgPSBlbmQgLSAxOyBpIDwgbDsgaSArPSBzdGVwICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBpbnRlcnNlY3QgPSBjaGVja0ludGVyc2VjdGlvbiggdGhpcywgcmF5Y2FzdGVyLCBfcmF5LCBsb2NhbFRocmVzaG9sZFNxLCBpLCBpICsgMSwgaSApO1xyXG5cclxuXHRcdFx0XHRpZiAoIGludGVyc2VjdCApIHtcclxuXHJcblx0XHRcdFx0XHRpbnRlcnNlY3RzLnB1c2goIGludGVyc2VjdCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMuaXNMaW5lTG9vcCApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgaW50ZXJzZWN0ID0gY2hlY2tJbnRlcnNlY3Rpb24oIHRoaXMsIHJheWNhc3RlciwgX3JheSwgbG9jYWxUaHJlc2hvbGRTcSwgZW5kIC0gMSwgc3RhcnQsIGVuZCAtIDEgKTtcclxuXHJcblx0XHRcdFx0aWYgKCBpbnRlcnNlY3QgKSB7XHJcblxyXG5cdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCBpbnRlcnNlY3QgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB2YWx1ZXMgb2Yge0BsaW5rIExpbmUjbW9ycGhUYXJnZXREaWN0aW9uYXJ5fSBhbmQge0BsaW5rIExpbmUjbW9ycGhUYXJnZXRJbmZsdWVuY2VzfVxyXG5cdCAqIHRvIG1ha2Ugc3VyZSBleGlzdGluZyBtb3JwaCB0YXJnZXRzIGNhbiBpbmZsdWVuY2UgdGhpcyAzRCBvYmplY3QuXHJcblx0ICovXHJcblx0dXBkYXRlTW9ycGhUYXJnZXRzKCkge1xyXG5cclxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcclxuXHJcblx0XHRjb25zdCBtb3JwaEF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXM7XHJcblx0XHRjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoIG1vcnBoQXR0cmlidXRlcyApO1xyXG5cclxuXHRcdGlmICgga2V5cy5sZW5ndGggPiAwICkge1xyXG5cclxuXHRcdFx0Y29uc3QgbW9ycGhBdHRyaWJ1dGUgPSBtb3JwaEF0dHJpYnV0ZXNbIGtleXNbIDAgXSBdO1xyXG5cclxuXHRcdFx0aWYgKCBtb3JwaEF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyA9IFtdO1xyXG5cdFx0XHRcdHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5ID0ge307XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBtID0gMCwgbWwgPSBtb3JwaEF0dHJpYnV0ZS5sZW5ndGg7IG0gPCBtbDsgbSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBuYW1lID0gbW9ycGhBdHRyaWJ1dGVbIG0gXS5uYW1lIHx8IFN0cmluZyggbSApO1xyXG5cclxuXHRcdFx0XHRcdHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnB1c2goIDAgKTtcclxuXHRcdFx0XHRcdHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5WyBuYW1lIF0gPSBtO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBjaGVja0ludGVyc2VjdGlvbiggb2JqZWN0LCByYXljYXN0ZXIsIHJheSwgdGhyZXNob2xkU3EsIGEsIGIsIGkgKSB7XHJcblxyXG5cdGNvbnN0IHBvc2l0aW9uQXR0cmlidXRlID0gb2JqZWN0Lmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XHJcblxyXG5cdF92U3RhcnQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyaWJ1dGUsIGEgKTtcclxuXHRfdkVuZC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbkF0dHJpYnV0ZSwgYiApO1xyXG5cclxuXHRjb25zdCBkaXN0U3EgPSByYXkuZGlzdGFuY2VTcVRvU2VnbWVudCggX3ZTdGFydCwgX3ZFbmQsIF9pbnRlcnNlY3RQb2ludE9uUmF5LCBfaW50ZXJzZWN0UG9pbnRPblNlZ21lbnQgKTtcclxuXHJcblx0aWYgKCBkaXN0U3EgPiB0aHJlc2hvbGRTcSApIHJldHVybjtcclxuXHJcblx0X2ludGVyc2VjdFBvaW50T25SYXkuYXBwbHlNYXRyaXg0KCBvYmplY3QubWF0cml4V29ybGQgKTsgLy8gTW92ZSBiYWNrIHRvIHdvcmxkIHNwYWNlIGZvciBkaXN0YW5jZSBjYWxjdWxhdGlvblxyXG5cclxuXHRjb25zdCBkaXN0YW5jZSA9IHJheWNhc3Rlci5yYXkub3JpZ2luLmRpc3RhbmNlVG8oIF9pbnRlcnNlY3RQb2ludE9uUmF5ICk7XHJcblxyXG5cdGlmICggZGlzdGFuY2UgPCByYXljYXN0ZXIubmVhciB8fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSByZXR1cm47XHJcblxyXG5cdHJldHVybiB7XHJcblxyXG5cdFx0ZGlzdGFuY2U6IGRpc3RhbmNlLFxyXG5cdFx0Ly8gV2hhdCBkbyB3ZSB3YW50PyBpbnRlcnNlY3Rpb24gcG9pbnQgb24gdGhlIHJheSBvciBvbiB0aGUgc2VnbWVudD8/XHJcblx0XHQvLyBwb2ludDogcmF5Y2FzdGVyLnJheS5hdCggZGlzdGFuY2UgKSxcclxuXHRcdHBvaW50OiBfaW50ZXJzZWN0UG9pbnRPblNlZ21lbnQuY2xvbmUoKS5hcHBseU1hdHJpeDQoIG9iamVjdC5tYXRyaXhXb3JsZCApLFxyXG5cdFx0aW5kZXg6IGksXHJcblx0XHRmYWNlOiBudWxsLFxyXG5cdFx0ZmFjZUluZGV4OiBudWxsLFxyXG5cdFx0YmFyeWNvb3JkOiBudWxsLFxyXG5cdFx0b2JqZWN0OiBvYmplY3RcclxuXHJcblx0fTtcclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IExpbmUgfTtcclxuIiwiaW1wb3J0IHsgTGluZSB9IGZyb20gJy4vTGluZS5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5cclxuY29uc3QgX3N0YXJ0ID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfZW5kID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5cclxuLyoqXHJcbiAqIEEgc2VyaWVzIG9mIGxpbmVzIGRyYXduIGJldHdlZW4gcGFpcnMgb2YgdmVydGljZXMuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBMaW5lXHJcbiAqL1xyXG5jbGFzcyBMaW5lU2VnbWVudHMgZXh0ZW5kcyBMaW5lIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBsaW5lIHNlZ21lbnRzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCdWZmZXJHZW9tZXRyeX0gW2dlb21ldHJ5XSAtIFRoZSBsaW5lIGdlb21ldHJ5LlxyXG5cdCAqIEBwYXJhbSB7TWF0ZXJpYWx8QXJyYXk8TWF0ZXJpYWw+fSBbbWF0ZXJpYWxdIC0gVGhlIGxpbmUgbWF0ZXJpYWwuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGdlb21ldHJ5LCBtYXRlcmlhbCApIHtcclxuXHJcblx0XHRzdXBlciggZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzTGluZVNlZ21lbnRzID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnTGluZVNlZ21lbnRzJztcclxuXHJcblx0fVxyXG5cclxuXHRjb21wdXRlTGluZURpc3RhbmNlcygpIHtcclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XHJcblxyXG5cdFx0Ly8gd2UgYXNzdW1lIG5vbi1pbmRleGVkIGdlb21ldHJ5XHJcblxyXG5cdFx0aWYgKCBnZW9tZXRyeS5pbmRleCA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGNvbnN0IHBvc2l0aW9uQXR0cmlidXRlID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjtcclxuXHRcdFx0Y29uc3QgbGluZURpc3RhbmNlcyA9IFtdO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gcG9zaXRpb25BdHRyaWJ1dGUuY291bnQ7IGkgPCBsOyBpICs9IDIgKSB7XHJcblxyXG5cdFx0XHRcdF9zdGFydC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbkF0dHJpYnV0ZSwgaSApO1xyXG5cdFx0XHRcdF9lbmQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyaWJ1dGUsIGkgKyAxICk7XHJcblxyXG5cdFx0XHRcdGxpbmVEaXN0YW5jZXNbIGkgXSA9ICggaSA9PT0gMCApID8gMCA6IGxpbmVEaXN0YW5jZXNbIGkgLSAxIF07XHJcblx0XHRcdFx0bGluZURpc3RhbmNlc1sgaSArIDEgXSA9IGxpbmVEaXN0YW5jZXNbIGkgXSArIF9zdGFydC5kaXN0YW5jZVRvKCBfZW5kICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdsaW5lRGlzdGFuY2UnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbGluZURpc3RhbmNlcywgMSApICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpbmVTZWdtZW50cy5jb21wdXRlTGluZURpc3RhbmNlcygpOiBDb21wdXRhdGlvbiBvbmx5IHBvc3NpYmxlIHdpdGggbm9uLWluZGV4ZWQgQnVmZmVyR2VvbWV0cnkuJyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgTGluZVNlZ21lbnRzIH07XHJcbiIsImltcG9ydCB7IExpbmUgfSBmcm9tICcuL0xpbmUuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgY29udGludW91cyBsaW5lLiBUaGlzIGlzIG5lYXJseSB0aGUgc2FtZSBhcyB7QGxpbmsgTGluZX0gdGhlIG9ubHkgZGlmZmVyZW5jZVxyXG4gKiBpcyB0aGF0IHRoZSBsYXN0IHZlcnRleCBpcyBjb25uZWN0ZWQgd2l0aCB0aGUgZmlyc3QgdmVydGV4IGluIG9yZGVyIHRvIGNsb3NlXHJcbiAqIHRoZSBsaW5lIHRvIGZvcm0gYSBsb29wLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTGluZVxyXG4gKi9cclxuY2xhc3MgTGluZUxvb3AgZXh0ZW5kcyBMaW5lIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBsaW5lIGxvb3AuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0J1ZmZlckdlb21ldHJ5fSBbZ2VvbWV0cnldIC0gVGhlIGxpbmUgZ2VvbWV0cnkuXHJcblx0ICogQHBhcmFtIHtNYXRlcmlhbHxBcnJheTxNYXRlcmlhbD59IFttYXRlcmlhbF0gLSBUaGUgbGluZSBtYXRlcmlhbC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggZ2VvbWV0cnksIG1hdGVyaWFsICkge1xyXG5cclxuXHRcdHN1cGVyKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNMaW5lTG9vcCA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ0xpbmVMb29wJztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgTGluZUxvb3AgfTtcclxuIiwiaW1wb3J0IHsgTWF0ZXJpYWwgfSBmcm9tICcuL01hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi9tYXRoL0NvbG9yLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIG1hdGVyaWFsIGZvciByZW5kZXJpbmcgcG9pbnQgcHJpbWl0aXZlcy5cclxuICpcclxuICogTWF0ZXJpYWxzIGRlZmluZSB0aGUgYXBwZWFyYW5jZSBvZiByZW5kZXJhYmxlIDNEIG9iamVjdHMuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IHZlcnRpY2VzID0gW107XHJcbiAqXHJcbiAqIGZvciAoIGxldCBpID0gMDsgaSA8IDEwMDAwOyBpICsrICkge1xyXG4gKiBcdGNvbnN0IHggPSBUSFJFRS5NYXRoVXRpbHMucmFuZEZsb2F0U3ByZWFkKCAyMDAwICk7XHJcbiAqIFx0Y29uc3QgeSA9IFRIUkVFLk1hdGhVdGlscy5yYW5kRmxvYXRTcHJlYWQoIDIwMDAgKTtcclxuICogXHRjb25zdCB6ID0gVEhSRUUuTWF0aFV0aWxzLnJhbmRGbG9hdFNwcmVhZCggMjAwMCApO1xyXG4gKlxyXG4gKiBcdHZlcnRpY2VzLnB1c2goIHgsIHksIHogKTtcclxuICogfVxyXG4gKlxyXG4gKiBjb25zdCBnZW9tZXRyeSA9IG5ldyBUSFJFRS5CdWZmZXJHZW9tZXRyeSgpO1xyXG4gKiBnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBUSFJFRS5GbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XHJcbiAqIGNvbnN0IG1hdGVyaWFsID0gbmV3IFRIUkVFLlBvaW50c01hdGVyaWFsKCB7IGNvbG9yOiAweDg4ODg4OCB9ICk7XHJcbiAqIGNvbnN0IHBvaW50cyA9IG5ldyBUSFJFRS5Qb2ludHMoIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG4gKiBzY2VuZS5hZGQoIHBvaW50cyApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIE1hdGVyaWFsXHJcbiAqL1xyXG5jbGFzcyBQb2ludHNNYXRlcmlhbCBleHRlbmRzIE1hdGVyaWFsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBwb2ludHMgbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtZXRlcnNdIC0gQW4gb2JqZWN0IHdpdGggb25lIG9yIG1vcmUgcHJvcGVydGllc1xyXG5cdCAqIGRlZmluaW5nIHRoZSBtYXRlcmlhbCdzIGFwcGVhcmFuY2UuIEFueSBwcm9wZXJ0eSBvZiB0aGUgbWF0ZXJpYWxcclxuXHQgKiAoaW5jbHVkaW5nIGFueSBwcm9wZXJ0eSBmcm9tIGluaGVyaXRlZCBtYXRlcmlhbHMpIGNhbiBiZSBwYXNzZWRcclxuXHQgKiBpbiBoZXJlLiBDb2xvciB2YWx1ZXMgY2FuIGJlIHBhc3NlZCBhbnkgdHlwZSBvZiB2YWx1ZSBhY2NlcHRlZFxyXG5cdCAqIGJ5IHtAbGluayBDb2xvciNzZXR9LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwYXJhbWV0ZXJzICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzUG9pbnRzTWF0ZXJpYWwgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdQb2ludHNNYXRlcmlhbCc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDb2xvciBvZiB0aGUgbWF0ZXJpYWwuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0NvbG9yfVxyXG5cdFx0ICogQGRlZmF1bHQgKDEsMSwxKVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCAweGZmZmZmZiApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNvbG9yIG1hcC4gTWF5IG9wdGlvbmFsbHkgaW5jbHVkZSBhbiBhbHBoYSBjaGFubmVsLCB0eXBpY2FsbHkgY29tYmluZWRcclxuXHRcdCAqIHdpdGgge0BsaW5rIE1hdGVyaWFsI3RyYW5zcGFyZW50fSBvciB7QGxpbmsgTWF0ZXJpYWwjYWxwaGFUZXN0fS4gVGhlIHRleHR1cmUgbWFwXHJcblx0XHQgKiBjb2xvciBpcyBtb2R1bGF0ZWQgYnkgdGhlIGRpZmZ1c2UgYGNvbG9yYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBhbHBoYSBtYXAgaXMgYSBncmF5c2NhbGUgdGV4dHVyZSB0aGF0IGNvbnRyb2xzIHRoZSBvcGFjaXR5IGFjcm9zcyB0aGVcclxuXHRcdCAqIHN1cmZhY2UgKGJsYWNrOiBmdWxseSB0cmFuc3BhcmVudDsgd2hpdGU6IGZ1bGx5IG9wYXF1ZSkuXHJcblx0XHQgKlxyXG5cdFx0ICogT25seSB0aGUgY29sb3Igb2YgdGhlIHRleHR1cmUgaXMgdXNlZCwgaWdub3JpbmcgdGhlIGFscGhhIGNoYW5uZWwgaWYgb25lXHJcblx0XHQgKiBleGlzdHMuIEZvciBSR0IgYW5kIFJHQkEgdGV4dHVyZXMsIHRoZSByZW5kZXJlciB3aWxsIHVzZSB0aGUgZ3JlZW4gY2hhbm5lbFxyXG5cdFx0ICogd2hlbiBzYW1wbGluZyB0aGlzIHRleHR1cmUgZHVlIHRvIHRoZSBleHRyYSBiaXQgb2YgcHJlY2lzaW9uIHByb3ZpZGVkIGZvclxyXG5cdFx0ICogZ3JlZW4gaW4gRFhULWNvbXByZXNzZWQgYW5kIHVuY29tcHJlc3NlZCBSR0IgNTY1IGZvcm1hdHMuIEx1bWluYW5jZS1vbmx5IGFuZFxyXG5cdFx0ICogbHVtaW5hbmNlL2FscGhhIHRleHR1cmVzIHdpbGwgYWxzbyBzdGlsbCB3b3JrIGFzIGV4cGVjdGVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hbHBoYU1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIHRoZSBzaXplIG9mIHRoZSBwb2ludHMgaW4gcGl4ZWxzLlxyXG5cdFx0ICpcclxuXHRcdCAqIE1pZ2h0IGJlIGNhcHBlZCBpZiB0aGUgdmFsdWUgZXhjZWVkcyBoYXJkd2FyZSBkZXBlbmRlbnQgcGFyYW1ldGVycyBsaWtlIFtnbC5BTElBU0VEX1BPSU5UX1NJWkVfUkFOR0Vde0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XZWJHTFJlbmRlcmluZ0NvbnRleHQvZ2V0UGFyYW1ldGV9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2l6ZSA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTcGVjaWZpZXMgd2hldGhlciBzaXplIG9mIGluZGl2aWR1YWwgcG9pbnRzIGlzIGF0dGVudWF0ZWQgYnkgdGhlIGNhbWVyYSBkZXB0aCAocGVyc3BlY3RpdmUgY2FtZXJhIG9ubHkpLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNpemVBdHRlbnVhdGlvbiA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSBtYXRlcmlhbCBpcyBhZmZlY3RlZCBieSBmb2cgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZvZyA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcclxuXHJcblx0XHR0aGlzLm1hcCA9IHNvdXJjZS5tYXA7XHJcblxyXG5cdFx0dGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDtcclxuXHJcblx0XHR0aGlzLnNpemUgPSBzb3VyY2Uuc2l6ZTtcclxuXHRcdHRoaXMuc2l6ZUF0dGVudWF0aW9uID0gc291cmNlLnNpemVBdHRlbnVhdGlvbjtcclxuXHJcblx0XHR0aGlzLmZvZyA9IHNvdXJjZS5mb2c7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFBvaW50c01hdGVyaWFsIH07XHJcbiIsImltcG9ydCB7IFNwaGVyZSB9IGZyb20gJy4uL21hdGgvU3BoZXJlLmpzJztcclxuaW1wb3J0IHsgUmF5IH0gZnJvbSAnLi4vbWF0aC9SYXkuanMnO1xyXG5pbXBvcnQgeyBNYXRyaXg0IH0gZnJvbSAnLi4vbWF0aC9NYXRyaXg0LmpzJztcclxuaW1wb3J0IHsgT2JqZWN0M0QgfSBmcm9tICcuLi9jb3JlL09iamVjdDNELmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcbmltcG9ydCB7IFBvaW50c01hdGVyaWFsIH0gZnJvbSAnLi4vbWF0ZXJpYWxzL1BvaW50c01hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcclxuXHJcbmNvbnN0IF9pbnZlcnNlTWF0cml4ID0gLypAX19QVVJFX18qLyBuZXcgTWF0cml4NCgpO1xyXG5jb25zdCBfcmF5ID0gLypAX19QVVJFX18qLyBuZXcgUmF5KCk7XHJcbmNvbnN0IF9zcGhlcmUgPSAvKkBfX1BVUkVfXyovIG5ldyBTcGhlcmUoKTtcclxuY29uc3QgX3Bvc2l0aW9uID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5cclxuLyoqXHJcbiAqIEEgY2xhc3MgZm9yIGRpc3BsYXlpbmcgcG9pbnRzIG9yIHBvaW50IGNsb3Vkcy5cclxuICpcclxuICogQGF1Z21lbnRzIE9iamVjdDNEXHJcbiAqL1xyXG5jbGFzcyBQb2ludHMgZXh0ZW5kcyBPYmplY3QzRCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcG9pbnQgY2xvdWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0J1ZmZlckdlb21ldHJ5fSBbZ2VvbWV0cnldIC0gVGhlIHBvaW50cyBnZW9tZXRyeS5cclxuXHQgKiBAcGFyYW0ge01hdGVyaWFsfEFycmF5PE1hdGVyaWFsPn0gW21hdGVyaWFsXSAtIFRoZSBwb2ludHMgbWF0ZXJpYWwuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCksIG1hdGVyaWFsID0gbmV3IFBvaW50c01hdGVyaWFsKCkgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNQb2ludHMgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdQb2ludHMnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHBvaW50cyBnZW9tZXRyeS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QnVmZmVyR2VvbWV0cnl9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ2VvbWV0cnkgPSBnZW9tZXRyeTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBsaW5lIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtNYXRlcmlhbHxBcnJheTxNYXRlcmlhbD59XHJcblx0XHQgKiBAZGVmYXVsdCBQb2ludHNNYXRlcmlhbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1hdGVyaWFsID0gbWF0ZXJpYWw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGRpY3Rpb25hcnkgcmVwcmVzZW50aW5nIHRoZSBtb3JwaCB0YXJnZXRzIGluIHRoZSBnZW9tZXRyeS4gVGhlIGtleSBpcyB0aGVcclxuXHRcdCAqIG1vcnBoIHRhcmdldHMgbmFtZSwgdGhlIHZhbHVlIGl0cyBhdHRyaWJ1dGUgaW5kZXguIFRoaXMgbWVtYmVyIGlzIGB1bmRlZmluZWRgXHJcblx0XHQgKiBieSBkZWZhdWx0IGFuZCBvbmx5IHNldCB3aGVuIG1vcnBoIHRhcmdldHMgYXJlIGRldGVjdGVkIGluIHRoZSBnZW9tZXRyeS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0PFN0cmluZyxudW1iZXI+fHVuZGVmaW5lZH1cclxuXHRcdCAqIEBkZWZhdWx0IHVuZGVmaW5lZFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeSA9IHVuZGVmaW5lZDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIGFycmF5IG9mIHdlaWdodHMgdHlwaWNhbGx5IGluIHRoZSByYW5nZSBgWzAsMV1gIHRoYXQgc3BlY2lmeSBob3cgbXVjaCBvZiB0aGUgbW9ycGhcclxuXHRcdCAqIGlzIGFwcGxpZWQuIFRoaXMgbWVtYmVyIGlzIGB1bmRlZmluZWRgIGJ5IGRlZmF1bHQgYW5kIG9ubHkgc2V0IHdoZW4gbW9ycGggdGFyZ2V0cyBhcmVcclxuXHRcdCAqIGRldGVjdGVkIGluIHRoZSBnZW9tZXRyeS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8bnVtYmVyPnx1bmRlZmluZWR9XHJcblx0XHQgKiBAZGVmYXVsdCB1bmRlZmluZWRcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMgPSB1bmRlZmluZWQ7XHJcblxyXG5cdFx0dGhpcy51cGRhdGVNb3JwaFRhcmdldHMoKTtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UsIHJlY3Vyc2l2ZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UsIHJlY3Vyc2l2ZSApO1xyXG5cclxuXHRcdHRoaXMubWF0ZXJpYWwgPSBBcnJheS5pc0FycmF5KCBzb3VyY2UubWF0ZXJpYWwgKSA/IHNvdXJjZS5tYXRlcmlhbC5zbGljZSgpIDogc291cmNlLm1hdGVyaWFsO1xyXG5cdFx0dGhpcy5nZW9tZXRyeSA9IHNvdXJjZS5nZW9tZXRyeTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyBpbnRlcnNlY3Rpb24gcG9pbnRzIGJldHdlZW4gYSBjYXN0ZWQgcmF5IGFuZCB0aGlzIHBvaW50IGNsb3VkLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSYXljYXN0ZXJ9IHJheWNhc3RlciAtIFRoZSByYXljYXN0ZXIuXHJcblx0ICogQHBhcmFtIHtBcnJheTxPYmplY3Q+fSBpbnRlcnNlY3RzIC0gVGhlIHRhcmdldCBhcnJheSB0aGF0IGhvbGRzIHRoZSBpbnRlcnNlY3Rpb24gcG9pbnRzLlxyXG5cdCAqL1xyXG5cdHJheWNhc3QoIHJheWNhc3RlciwgaW50ZXJzZWN0cyApIHtcclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XHJcblx0XHRjb25zdCBtYXRyaXhXb3JsZCA9IHRoaXMubWF0cml4V29ybGQ7XHJcblx0XHRjb25zdCB0aHJlc2hvbGQgPSByYXljYXN0ZXIucGFyYW1zLlBvaW50cy50aHJlc2hvbGQ7XHJcblx0XHRjb25zdCBkcmF3UmFuZ2UgPSBnZW9tZXRyeS5kcmF3UmFuZ2U7XHJcblxyXG5cdFx0Ly8gQ2hlY2tpbmcgYm91bmRpbmdTcGhlcmUgZGlzdGFuY2UgdG8gcmF5XHJcblxyXG5cdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCApIGdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xyXG5cclxuXHRcdF9zcGhlcmUuY29weSggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgKTtcclxuXHRcdF9zcGhlcmUuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApO1xyXG5cdFx0X3NwaGVyZS5yYWRpdXMgKz0gdGhyZXNob2xkO1xyXG5cclxuXHRcdGlmICggcmF5Y2FzdGVyLnJheS5pbnRlcnNlY3RzU3BoZXJlKCBfc3BoZXJlICkgPT09IGZhbHNlICkgcmV0dXJuO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0X2ludmVyc2VNYXRyaXguY29weSggbWF0cml4V29ybGQgKS5pbnZlcnQoKTtcclxuXHRcdF9yYXkuY29weSggcmF5Y2FzdGVyLnJheSApLmFwcGx5TWF0cml4NCggX2ludmVyc2VNYXRyaXggKTtcclxuXHJcblx0XHRjb25zdCBsb2NhbFRocmVzaG9sZCA9IHRocmVzaG9sZCAvICggKCB0aGlzLnNjYWxlLnggKyB0aGlzLnNjYWxlLnkgKyB0aGlzLnNjYWxlLnogKSAvIDMgKTtcclxuXHRcdGNvbnN0IGxvY2FsVGhyZXNob2xkU3EgPSBsb2NhbFRocmVzaG9sZCAqIGxvY2FsVGhyZXNob2xkO1xyXG5cclxuXHRcdGNvbnN0IGluZGV4ID0gZ2VvbWV0cnkuaW5kZXg7XHJcblx0XHRjb25zdCBhdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlcztcclxuXHRcdGNvbnN0IHBvc2l0aW9uQXR0cmlidXRlID0gYXR0cmlidXRlcy5wb3NpdGlvbjtcclxuXHJcblx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgc3RhcnQgPSBNYXRoLm1heCggMCwgZHJhd1JhbmdlLnN0YXJ0ICk7XHJcblx0XHRcdGNvbnN0IGVuZCA9IE1hdGgubWluKCBpbmRleC5jb3VudCwgKCBkcmF3UmFuZ2Uuc3RhcnQgKyBkcmF3UmFuZ2UuY291bnQgKSApO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSBzdGFydCwgaWwgPSBlbmQ7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgYSA9IGluZGV4LmdldFgoIGkgKTtcclxuXHJcblx0XHRcdFx0X3Bvc2l0aW9uLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uQXR0cmlidXRlLCBhICk7XHJcblxyXG5cdFx0XHRcdHRlc3RQb2ludCggX3Bvc2l0aW9uLCBhLCBsb2NhbFRocmVzaG9sZFNxLCBtYXRyaXhXb3JsZCwgcmF5Y2FzdGVyLCBpbnRlcnNlY3RzLCB0aGlzICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGNvbnN0IHN0YXJ0ID0gTWF0aC5tYXgoIDAsIGRyYXdSYW5nZS5zdGFydCApO1xyXG5cdFx0XHRjb25zdCBlbmQgPSBNYXRoLm1pbiggcG9zaXRpb25BdHRyaWJ1dGUuY291bnQsICggZHJhd1JhbmdlLnN0YXJ0ICsgZHJhd1JhbmdlLmNvdW50ICkgKTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gc3RhcnQsIGwgPSBlbmQ7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRfcG9zaXRpb24uZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyaWJ1dGUsIGkgKTtcclxuXHJcblx0XHRcdFx0dGVzdFBvaW50KCBfcG9zaXRpb24sIGksIGxvY2FsVGhyZXNob2xkU3EsIG1hdHJpeFdvcmxkLCByYXljYXN0ZXIsIGludGVyc2VjdHMsIHRoaXMgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdmFsdWVzIG9mIHtAbGluayBQb2ludHMjbW9ycGhUYXJnZXREaWN0aW9uYXJ5fSBhbmQge0BsaW5rIFBvaW50cyNtb3JwaFRhcmdldEluZmx1ZW5jZXN9XHJcblx0ICogdG8gbWFrZSBzdXJlIGV4aXN0aW5nIG1vcnBoIHRhcmdldHMgY2FuIGluZmx1ZW5jZSB0aGlzIDNEIG9iamVjdC5cclxuXHQgKi9cclxuXHR1cGRhdGVNb3JwaFRhcmdldHMoKSB7XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xyXG5cclxuXHRcdGNvbnN0IG1vcnBoQXR0cmlidXRlcyA9IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcztcclxuXHRcdGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyggbW9ycGhBdHRyaWJ1dGVzICk7XHJcblxyXG5cdFx0aWYgKCBrZXlzLmxlbmd0aCA+IDAgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBtb3JwaEF0dHJpYnV0ZSA9IG1vcnBoQXR0cmlidXRlc1sga2V5c1sgMCBdIF07XHJcblxyXG5cdFx0XHRpZiAoIG1vcnBoQXR0cmlidXRlICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzID0gW107XHJcblx0XHRcdFx0dGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnkgPSB7fTtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IG0gPSAwLCBtbCA9IG1vcnBoQXR0cmlidXRlLmxlbmd0aDsgbSA8IG1sOyBtICsrICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IG5hbWUgPSBtb3JwaEF0dHJpYnV0ZVsgbSBdLm5hbWUgfHwgU3RyaW5nKCBtICk7XHJcblxyXG5cdFx0XHRcdFx0dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMucHVzaCggMCApO1xyXG5cdFx0XHRcdFx0dGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnlbIG5hbWUgXSA9IG07XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHRlc3RQb2ludCggcG9pbnQsIGluZGV4LCBsb2NhbFRocmVzaG9sZFNxLCBtYXRyaXhXb3JsZCwgcmF5Y2FzdGVyLCBpbnRlcnNlY3RzLCBvYmplY3QgKSB7XHJcblxyXG5cdGNvbnN0IHJheVBvaW50RGlzdGFuY2VTcSA9IF9yYXkuZGlzdGFuY2VTcVRvUG9pbnQoIHBvaW50ICk7XHJcblxyXG5cdGlmICggcmF5UG9pbnREaXN0YW5jZVNxIDwgbG9jYWxUaHJlc2hvbGRTcSApIHtcclxuXHJcblx0XHRjb25zdCBpbnRlcnNlY3RQb2ludCA9IG5ldyBWZWN0b3IzKCk7XHJcblxyXG5cdFx0X3JheS5jbG9zZXN0UG9pbnRUb1BvaW50KCBwb2ludCwgaW50ZXJzZWN0UG9pbnQgKTtcclxuXHRcdGludGVyc2VjdFBvaW50LmFwcGx5TWF0cml4NCggbWF0cml4V29ybGQgKTtcclxuXHJcblx0XHRjb25zdCBkaXN0YW5jZSA9IHJheWNhc3Rlci5yYXkub3JpZ2luLmRpc3RhbmNlVG8oIGludGVyc2VjdFBvaW50ICk7XHJcblxyXG5cdFx0aWYgKCBkaXN0YW5jZSA8IHJheWNhc3Rlci5uZWFyIHx8IGRpc3RhbmNlID4gcmF5Y2FzdGVyLmZhciApIHJldHVybjtcclxuXHJcblx0XHRpbnRlcnNlY3RzLnB1c2goIHtcclxuXHJcblx0XHRcdGRpc3RhbmNlOiBkaXN0YW5jZSxcclxuXHRcdFx0ZGlzdGFuY2VUb1JheTogTWF0aC5zcXJ0KCByYXlQb2ludERpc3RhbmNlU3EgKSxcclxuXHRcdFx0cG9pbnQ6IGludGVyc2VjdFBvaW50LFxyXG5cdFx0XHRpbmRleDogaW5kZXgsXHJcblx0XHRcdGZhY2U6IG51bGwsXHJcblx0XHRcdGZhY2VJbmRleDogbnVsbCxcclxuXHRcdFx0YmFyeWNvb3JkOiBudWxsLFxyXG5cdFx0XHRvYmplY3Q6IG9iamVjdFxyXG5cclxuXHRcdH0gKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgUG9pbnRzIH07XHJcbiIsImltcG9ydCB7IExpbmVhckZpbHRlciB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IFRleHR1cmUgfSBmcm9tICcuL1RleHR1cmUuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgdGV4dHVyZSBmb3IgdXNlIHdpdGggYSB2aWRlby5cclxuICpcclxuICogYGBganNcclxuICogLy8gYXNzdW1pbmcgeW91IGhhdmUgY3JlYXRlZCBhIEhUTUwgdmlkZW8gZWxlbWVudCB3aXRoIGlkPVwidmlkZW9cIlxyXG4gKiBjb25zdCB2aWRlbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCAndmlkZW8nICk7XHJcbiAqIGNvbnN0IHRleHR1cmUgPSBuZXcgVEhSRUUuVmlkZW9UZXh0dXJlKCB2aWRlbyApO1xyXG4gKiBgYGBcclxuICpcclxuICogTm90ZTogQWZ0ZXIgdGhlIGluaXRpYWwgdXNlIG9mIGEgdGV4dHVyZSwgaXRzIGRpbWVuc2lvbnMsIGZvcm1hdCwgYW5kIHR5cGVcclxuICogY2Fubm90IGJlIGNoYW5nZWQuIEluc3RlYWQsIGNhbGwge0BsaW5rIFRleHR1cmUjZGlzcG9zZX0gb24gdGhlIHRleHR1cmUgYW5kIGluc3RhbnRpYXRlIGEgbmV3IG9uZS5cclxuICpcclxuICogQGF1Z21lbnRzIFRleHR1cmVcclxuICovXHJcbmNsYXNzIFZpZGVvVGV4dHVyZSBleHRlbmRzIFRleHR1cmUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHZpZGVvIHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZpZGVvfSB2aWRlbyAtIFRoZSB2aWRlbyBlbGVtZW50IHRvIHVzZSBhcyBhIGRhdGEgc291cmNlIGZvciB0aGUgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW21hcHBpbmc9VGV4dHVyZS5ERUZBVUxUX01BUFBJTkddIC0gVGhlIHRleHR1cmUgbWFwcGluZy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3dyYXBTPUNsYW1wVG9FZGdlV3JhcHBpbmddIC0gVGhlIHdyYXBTIHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbd3JhcFQ9Q2xhbXBUb0VkZ2VXcmFwcGluZ10gLSBUaGUgd3JhcFQgdmFsdWUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFttYWdGaWx0ZXI9TGluZWFyRmlsdGVyXSAtIFRoZSBtYWcgZmlsdGVyIHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbWluRmlsdGVyPUxpbmVhckZpbHRlcl0gLSBUaGUgbWluIGZpbHRlciB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2Zvcm1hdD1SR0JBRm9ybWF0XSAtIFRoZSB0ZXh0dXJlIGZvcm1hdC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3R5cGU9VW5zaWduZWRCeXRlVHlwZV0gLSBUaGUgdGV4dHVyZSB0eXBlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbYW5pc290cm9weT1UZXh0dXJlLkRFRkFVTFRfQU5JU09UUk9QWV0gLSBUaGUgYW5pc290cm9weSB2YWx1ZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggdmlkZW8sIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyID0gTGluZWFyRmlsdGVyLCBtaW5GaWx0ZXIgPSBMaW5lYXJGaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSApIHtcclxuXHJcblx0XHRzdXBlciggdmlkZW8sIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1ZpZGVvVGV4dHVyZSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRvIGdlbmVyYXRlIG1pcG1hcHMgKGlmIHBvc3NpYmxlKSBmb3IgYSB0ZXh0dXJlLlxyXG5cdFx0ICpcclxuXHRcdCAqIE92ZXJ3cml0dGVuIGFuZCBzZXQgdG8gYGZhbHNlYCBieSBkZWZhdWx0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcclxuXHJcblx0XHRjb25zdCBzY29wZSA9IHRoaXM7XHJcblxyXG5cdFx0ZnVuY3Rpb24gdXBkYXRlVmlkZW8oKSB7XHJcblxyXG5cdFx0XHRzY29wZS5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblx0XHRcdHZpZGVvLnJlcXVlc3RWaWRlb0ZyYW1lQ2FsbGJhY2soIHVwZGF0ZVZpZGVvICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggJ3JlcXVlc3RWaWRlb0ZyYW1lQ2FsbGJhY2snIGluIHZpZGVvICkge1xyXG5cclxuXHRcdFx0dmlkZW8ucmVxdWVzdFZpZGVvRnJhbWVDYWxsYmFjayggdXBkYXRlVmlkZW8gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0Y2xvbmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLmltYWdlICkuY29weSggdGhpcyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSByZW5kZXJlciBhbmQgc2V0cyB7QGxpbmsgVGV4dHVyZSNuZWVkc1VwZGF0ZX1cclxuXHQgKiB0byBgdHJ1ZWAgZXZlcnkgdGltZSBhIG5ldyBmcmFtZSBpcyBhdmFpbGFibGUuXHJcblx0ICpcclxuXHQgKiBPbmx5IHJlbGV2YW50IGlmIGByZXF1ZXN0VmlkZW9GcmFtZUNhbGxiYWNrYCBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZSBicm93c2VyLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZSgpIHtcclxuXHJcblx0XHRjb25zdCB2aWRlbyA9IHRoaXMuaW1hZ2U7XHJcblx0XHRjb25zdCBoYXNWaWRlb0ZyYW1lQ2FsbGJhY2sgPSAncmVxdWVzdFZpZGVvRnJhbWVDYWxsYmFjaycgaW4gdmlkZW87XHJcblxyXG5cdFx0aWYgKCBoYXNWaWRlb0ZyYW1lQ2FsbGJhY2sgPT09IGZhbHNlICYmIHZpZGVvLnJlYWR5U3RhdGUgPj0gdmlkZW8uSEFWRV9DVVJSRU5UX0RBVEEgKSB7XHJcblxyXG5cdFx0XHR0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFZpZGVvVGV4dHVyZSB9O1xyXG4iLCJpbXBvcnQgeyBWaWRlb1RleHR1cmUgfSBmcm9tICcuL1ZpZGVvVGV4dHVyZS5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCBhcyBhbiBhbHRlcm5hdGl2ZSB3YXkgdG8gZGVmaW5lIHZpZGVvIGRhdGEuIEluc3RlYWQgb2YgdXNpbmdcclxuICogYW4gaW5zdGFuY2Ugb2YgYEhUTUxWaWRlb0VsZW1lbnRgIGxpa2Ugd2l0aCBgVmlkZW9UZXh0dXJlYCwgYFZpZGVvRnJhbWVUZXh0dXJlYCBleHBlY3RzIGVhY2ggZnJhbWUgaXNcclxuICogZGVmaW5lZCBtYW51YWxseSB2aWEge0BsaW5rIFZpZGVvRnJhbWVUZXh0dXJlI3NldEZyYW1lfS4gQSB0eXBpY2FsIHVzZSBjYXNlIGZvciB0aGlzIG1vZHVsZSBpcyB3aGVuXHJcbiAqIHZpZGVvIGZyYW1lcyBhcmUgZGVjb2RlZCB3aXRoIHRoZSBXZWJDb2RlY3MgQVBJLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCB0ZXh0dXJlID0gbmV3IFRIUkVFLlZpZGVvRnJhbWVUZXh0dXJlKCk7XHJcbiAqIHRleHR1cmUuc2V0RnJhbWUoIGZyYW1lICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgVmlkZW9UZXh0dXJlXHJcbiAqL1xyXG5jbGFzcyBWaWRlb0ZyYW1lVGV4dHVyZSBleHRlbmRzIFZpZGVvVGV4dHVyZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgdmlkZW8gZnJhbWUgdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbWFwcGluZz1UZXh0dXJlLkRFRkFVTFRfTUFQUElOR10gLSBUaGUgdGV4dHVyZSBtYXBwaW5nLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbd3JhcFM9Q2xhbXBUb0VkZ2VXcmFwcGluZ10gLSBUaGUgd3JhcFMgdmFsdWUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt3cmFwVD1DbGFtcFRvRWRnZVdyYXBwaW5nXSAtIFRoZSB3cmFwVCB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW21hZ0ZpbHRlcj1MaW5lYXJGaWx0ZXJdIC0gVGhlIG1hZyBmaWx0ZXIgdmFsdWUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFttaW5GaWx0ZXI9TGluZWFyRmlsdGVyXSAtIFRoZSBtaW4gZmlsdGVyIHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZm9ybWF0PVJHQkFGb3JtYXRdIC0gVGhlIHRleHR1cmUgZm9ybWF0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbdHlwZT1VbnNpZ25lZEJ5dGVUeXBlXSAtIFRoZSB0ZXh0dXJlIHR5cGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFthbmlzb3Ryb3B5PVRleHR1cmUuREVGQVVMVF9BTklTT1RST1BZXSAtIFRoZSBhbmlzb3Ryb3B5IHZhbHVlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHkgKSB7XHJcblxyXG5cdFx0c3VwZXIoIHt9LCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHkgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNWaWRlb0ZyYW1lVGV4dHVyZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2Qgb3ZlcndyaXR0ZW4gd2l0aCBhbiBlbXB0eSBpbXBsZW1lbnRhdGlvbiBzaW5jZVxyXG5cdCAqIHRoaXMgdHlwZSBvZiB0ZXh0dXJlIGlzIHVwZGF0ZWQgdmlhIGBzZXRGcmFtZSgpYC5cclxuXHQgKi9cclxuXHR1cGRhdGUoKSB7fVxyXG5cclxuXHRjbG9uZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7IC8vIHJlc3RvcmluZyBUZXh0dXJlLmNsb25lKClcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBjdXJyZW50IGZyYW1lIG9mIHRoZSB2aWRlby4gVGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgdXBkYXRlIHRoZSB0ZXh0dXJlXHJcblx0ICogc28gdGhlIGRhdGEgY2FuIGJlIHVzZWQgZm9yIHJlbmRlcmluZy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmlkZW9GcmFtZX0gZnJhbWUgLSBUaGUgdmlkZW8gZnJhbWUuXHJcblx0ICovXHJcblx0c2V0RnJhbWUoIGZyYW1lICkge1xyXG5cclxuXHRcdHRoaXMuaW1hZ2UgPSBmcmFtZTtcclxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBWaWRlb0ZyYW1lVGV4dHVyZSB9O1xyXG4iLCJpbXBvcnQgeyBUZXh0dXJlIH0gZnJvbSAnLi9UZXh0dXJlLmpzJztcclxuaW1wb3J0IHsgTmVhcmVzdEZpbHRlciB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBjbGFzcyBjYW4gb25seSBiZSB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGggYGNvcHlGcmFtZWJ1ZmZlclRvVGV4dHVyZSgpYCBtZXRob2RzXHJcbiAqIG9mIHJlbmRlcmVycy4gSXQgZXh0cmFjdHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBjdXJyZW50IGJvdW5kIGZyYW1lYnVmZmVyIGFuZCBwcm92aWRlcyBpdFxyXG4gKiBhcyBhIHRleHR1cmUgZm9yIGZ1cnRoZXIgdXNhZ2UuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IHBpeGVsUmF0aW8gPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztcclxuICogY29uc3QgdGV4dHVyZVNpemUgPSAxMjggKiBwaXhlbFJhdGlvO1xyXG4gKlxyXG4gKiBjb25zdCBmcmFtZVRleHR1cmUgPSBuZXcgRnJhbWVidWZmZXJUZXh0dXJlKCB0ZXh0dXJlU2l6ZSwgdGV4dHVyZVNpemUgKTtcclxuICpcclxuICogLy8gY2FsY3VsYXRlIHN0YXJ0IHBvc2l0aW9uIGZvciBjb3B5aW5nIHBhcnQgb2YgdGhlIGZyYW1lIGRhdGFcclxuICogY29uc3QgdmVjdG9yID0gbmV3IFZlY3RvcjIoKTtcclxuICogdmVjdG9yLnggPSAoIHdpbmRvdy5pbm5lcldpZHRoICogcGl4ZWxSYXRpbyAvIDIgKSAtICggdGV4dHVyZVNpemUgLyAyICk7XHJcbiAqIHZlY3Rvci55ID0gKCB3aW5kb3cuaW5uZXJIZWlnaHQgKiBwaXhlbFJhdGlvIC8gMiApIC0gKCB0ZXh0dXJlU2l6ZSAvIDIgKTtcclxuICpcclxuICogcmVuZGVyZXIucmVuZGVyKCBzY2VuZSwgY2FtZXJhICk7XHJcbiAqXHJcbiAqIC8vIGNvcHkgcGFydCBvZiB0aGUgcmVuZGVyZWQgZnJhbWUgaW50byB0aGUgZnJhbWVidWZmZXIgdGV4dHVyZVxyXG4gKiByZW5kZXJlci5jb3B5RnJhbWVidWZmZXJUb1RleHR1cmUoIGZyYW1lVGV4dHVyZSwgdmVjdG9yICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgVGV4dHVyZVxyXG4gKi9cclxuY2xhc3MgRnJhbWVidWZmZXJUZXh0dXJlIGV4dGVuZHMgVGV4dHVyZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgZnJhbWVidWZmZXIgdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgdGV4dHVyZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggd2lkdGgsIGhlaWdodCApIHtcclxuXHJcblx0XHRzdXBlciggeyB3aWR0aCwgaGVpZ2h0IH0gKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNGcmFtZWJ1ZmZlclRleHR1cmUgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG93IHRoZSB0ZXh0dXJlIGlzIHNhbXBsZWQgd2hlbiBhIHRleGVsIGNvdmVycyBtb3JlIHRoYW4gb25lIHBpeGVsLlxyXG5cdFx0ICpcclxuXHRcdCAqIE92ZXJ3cml0dGVuIGFuZCBzZXQgdG8gYE5lYXJlc3RGaWx0ZXJgIGJ5IGRlZmF1bHQgdG8gZGlzYWJsZSBmaWx0ZXJpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeyhOZWFyZXN0RmlsdGVyfE5lYXJlc3RNaXBtYXBOZWFyZXN0RmlsdGVyfE5lYXJlc3RNaXBtYXBMaW5lYXJGaWx0ZXJ8TGluZWFyRmlsdGVyfExpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXJ8TGluZWFyTWlwbWFwTGluZWFyRmlsdGVyKX1cclxuXHRcdCAqIEBkZWZhdWx0IE5lYXJlc3RGaWx0ZXJcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tYWdGaWx0ZXIgPSBOZWFyZXN0RmlsdGVyO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG93IHRoZSB0ZXh0dXJlIGlzIHNhbXBsZWQgd2hlbiBhIHRleGVsIGNvdmVycyBsZXNzIHRoYW4gb25lIHBpeGVsLlxyXG5cdFx0ICpcclxuXHRcdCAqIE92ZXJ3cml0dGVuIGFuZCBzZXQgdG8gYE5lYXJlc3RGaWx0ZXJgIGJ5IGRlZmF1bHQgdG8gZGlzYWJsZSBmaWx0ZXJpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeyhOZWFyZXN0RmlsdGVyfE5lYXJlc3RNaXBtYXBOZWFyZXN0RmlsdGVyfE5lYXJlc3RNaXBtYXBMaW5lYXJGaWx0ZXJ8TGluZWFyRmlsdGVyfExpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXJ8TGluZWFyTWlwbWFwTGluZWFyRmlsdGVyKX1cclxuXHRcdCAqIEBkZWZhdWx0IE5lYXJlc3RGaWx0ZXJcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5taW5GaWx0ZXIgPSBOZWFyZXN0RmlsdGVyO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0byBnZW5lcmF0ZSBtaXBtYXBzIChpZiBwb3NzaWJsZSkgZm9yIGEgdGV4dHVyZS5cclxuXHRcdCAqXHJcblx0XHQgKiBPdmVyd3JpdHRlbiBhbmQgc2V0IHRvIGBmYWxzZWAgYnkgZGVmYXVsdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XHJcblxyXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IEZyYW1lYnVmZmVyVGV4dHVyZSB9O1xyXG4iLCJpbXBvcnQgeyBUZXh0dXJlIH0gZnJvbSAnLi9UZXh0dXJlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgdGV4dHVyZSBiYXNlZCBvbiBkYXRhIGluIGNvbXByZXNzZWQgZm9ybS5cclxuICpcclxuICogVGhlc2UgdGV4dHVyZSBhcmUgdXN1YWxseSBsb2FkZWQgd2l0aCB7QGxpbmsgQ29tcHJlc3NlZFRleHR1cmVMb2FkZXJ9LlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgVGV4dHVyZVxyXG4gKi9cclxuY2xhc3MgQ29tcHJlc3NlZFRleHR1cmUgZXh0ZW5kcyBUZXh0dXJlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBjb21wcmVzc2VkIHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PE9iamVjdD59IG1pcG1hcHMgLSBUaGlzIGFycmF5IGhvbGRzIGZvciBhbGwgbWlwbWFwcyAoaW5jbHVkaW5nIHRoZSBiYXNlcyBtaXApXHJcblx0ICogdGhlIGRhdGEgYW5kIGRpbWVuc2lvbnMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSB0ZXh0dXJlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSB0ZXh0dXJlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZm9ybWF0PVJHQkFGb3JtYXRdIC0gVGhlIHRleHR1cmUgZm9ybWF0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbdHlwZT1VbnNpZ25lZEJ5dGVUeXBlXSAtIFRoZSB0ZXh0dXJlIHR5cGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFttYXBwaW5nPVRleHR1cmUuREVGQVVMVF9NQVBQSU5HXSAtIFRoZSB0ZXh0dXJlIG1hcHBpbmcuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt3cmFwUz1DbGFtcFRvRWRnZVdyYXBwaW5nXSAtIFRoZSB3cmFwUyB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3dyYXBUPUNsYW1wVG9FZGdlV3JhcHBpbmddIC0gVGhlIHdyYXBUIHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbWFnRmlsdGVyPUxpbmVhckZpbHRlcl0gLSBUaGUgbWFnIGZpbHRlciB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW21pbkZpbHRlcj1MaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXJdIC0gVGhlIG1pbiBmaWx0ZXIgdmFsdWUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFthbmlzb3Ryb3B5PVRleHR1cmUuREVGQVVMVF9BTklTT1RST1BZXSAtIFRoZSBhbmlzb3Ryb3B5IHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbY29sb3JTcGFjZT1Ob0NvbG9yU3BhY2VdIC0gVGhlIGNvbG9yIHNwYWNlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBtaXBtYXBzLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGFuaXNvdHJvcHksIGNvbG9yU3BhY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG51bGwsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSwgY29sb3JTcGFjZSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0NvbXByZXNzZWRUZXh0dXJlID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBpbWFnZSBwcm9wZXJ0eSBvZiBhIGNvbXByZXNzZWQgdGV4dHVyZSBqdXN0IGRlZmluZXMgaXRzIGRpbWVuc2lvbnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3t3aWR0aDpudW1iZXIsaGVpZ2h0Om51bWJlcn19XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaW1hZ2UgPSB7IHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQgfTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgYXJyYXkgaG9sZHMgZm9yIGFsbCBtaXBtYXBzIChpbmNsdWRpbmcgdGhlIGJhc2VzIG1pcCkgdGhlIGRhdGEgYW5kIGRpbWVuc2lvbnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PE9iamVjdD59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWlwbWFwcyA9IG1pcG1hcHM7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBJZiBzZXQgdG8gYHRydWVgLCB0aGUgdGV4dHVyZSBpcyBmbGlwcGVkIGFsb25nIHRoZSB2ZXJ0aWNhbCBheGlzIHdoZW5cclxuXHRcdCAqIHVwbG9hZGVkIHRvIHRoZSBHUFUuXHJcblx0XHQgKlxyXG5cdFx0ICogT3ZlcndyaXR0ZW4gYW5kIHNldCB0byBgZmFsc2VgIGJ5IGRlZmF1bHQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvXHJcblx0XHQgKiBmbGlwIGNvbXByZXNzZWQgdGV4dHVyZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZmxpcFkgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdG8gZ2VuZXJhdGUgbWlwbWFwcyAoaWYgcG9zc2libGUpIGZvciBhIHRleHR1cmUuXHJcblx0XHQgKlxyXG5cdFx0ICogT3ZlcndyaXR0ZW4gYW5kIHNldCB0byBgZmFsc2VgIGJ5IGRlZmF1bHQgc2luY2UgaXQgaXMgbm90XHJcblx0XHQgKiBwb3NzaWJsZSB0byBnZW5lcmF0ZSBtaXBtYXBzIGZvciBjb21wcmVzc2VkIGRhdGEuIE1pcG1hcHNcclxuXHRcdCAqIG11c3QgYmUgZW1iZWRkZWQgaW4gdGhlIGNvbXByZXNzZWQgdGV4dHVyZSBmaWxlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBDb21wcmVzc2VkVGV4dHVyZSB9O1xyXG4iLCJpbXBvcnQgeyBDbGFtcFRvRWRnZVdyYXBwaW5nIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgQ29tcHJlc3NlZFRleHR1cmUgfSBmcm9tICcuL0NvbXByZXNzZWRUZXh0dXJlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgdGV4dHVyZSAyRCBhcnJheSBiYXNlZCBvbiBkYXRhIGluIGNvbXByZXNzZWQgZm9ybS5cclxuICpcclxuICogVGhlc2UgdGV4dHVyZSBhcmUgdXN1YWxseSBsb2FkZWQgd2l0aCB7QGxpbmsgQ29tcHJlc3NlZFRleHR1cmVMb2FkZXJ9LlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQ29tcHJlc3NlZFRleHR1cmVcclxuICovXHJcbmNsYXNzIENvbXByZXNzZWRBcnJheVRleHR1cmUgZXh0ZW5kcyBDb21wcmVzc2VkVGV4dHVyZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgY29tcHJlc3NlZCBhcnJheSB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxPYmplY3Q+fSBtaXBtYXBzIC0gVGhpcyBhcnJheSBob2xkcyBmb3IgYWxsIG1pcG1hcHMgKGluY2x1ZGluZyB0aGUgYmFzZXMgbWlwKVxyXG5cdCAqIHRoZSBkYXRhIGFuZCBkaW1lbnNpb25zLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZGVwdGggLSBUaGUgZGVwdGggb2YgdGhlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtmb3JtYXQ9UkdCQUZvcm1hdF0gLSBUaGUgbWluIGZpbHRlciB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3R5cGU9VW5zaWduZWRCeXRlVHlwZV0gLSBUaGUgbWluIGZpbHRlciB2YWx1ZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbWlwbWFwcywgd2lkdGgsIGhlaWdodCwgZGVwdGgsIGZvcm1hdCwgdHlwZSApIHtcclxuXHJcblx0XHRzdXBlciggbWlwbWFwcywgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0eXBlICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzQ29tcHJlc3NlZEFycmF5VGV4dHVyZSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgaW1hZ2UgcHJvcGVydHkgb2YgYSBjb21wcmVzc2VkIHRleHR1cmUganVzdCBkZWZpbmVzIGl0cyBkaW1lbnNpb25zLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBuYW1lIENvbXByZXNzZWRBcnJheVRleHR1cmUjaW1hZ2VcclxuXHRcdCAqIEB0eXBlIHt7d2lkdGg6bnVtYmVyLGhlaWdodDpudW1iZXIsZGVwdGg6bnVtYmVyfX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pbWFnZS5kZXB0aCA9IGRlcHRoO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBkZWZpbmVzIGhvdyB0aGUgdGV4dHVyZSBpcyB3cmFwcGVkIGluIHRoZSBkZXB0aCBhbmQgY29ycmVzcG9uZHMgdG9cclxuXHRcdCAqICpXKiBpbiBVVlcgbWFwcGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KFJlcGVhdFdyYXBwaW5nfENsYW1wVG9FZGdlV3JhcHBpbmd8TWlycm9yZWRSZXBlYXRXcmFwcGluZyl9XHJcblx0XHQgKiBAZGVmYXVsdCBDbGFtcFRvRWRnZVdyYXBwaW5nXHJcblx0XHQgKi9cclxuXHRcdHRoaXMud3JhcFIgPSBDbGFtcFRvRWRnZVdyYXBwaW5nO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBzZXQgb2YgYWxsIGxheWVycyB3aGljaCBuZWVkIHRvIGJlIHVwZGF0ZWQgaW4gdGhlIHRleHR1cmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1NldDxudW1iZXI+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxheWVyVXBkYXRlcyA9IG5ldyBTZXQoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZXNjcmliZXMgdGhhdCBhIHNwZWNpZmljIGxheWVyIG9mIHRoZSB0ZXh0dXJlIG5lZWRzIHRvIGJlIHVwZGF0ZWQuXHJcblx0ICogTm9ybWFsbHkgd2hlbiB7QGxpbmsgVGV4dHVyZSNuZWVkc1VwZGF0ZX0gaXMgc2V0IHRvIGB0cnVlYCwgdGhlXHJcblx0ICogZW50aXJlIGNvbXByZXNzZWQgdGV4dHVyZSBhcnJheSBpcyBzZW50IHRvIHRoZSBHUFUuIE1hcmtpbmcgc3BlY2lmaWNcclxuXHQgKiBsYXllcnMgd2lsbCBvbmx5IHRyYW5zbWl0IHN1YnNldHMgb2YgYWxsIG1pcG1hcHMgYXNzb2NpYXRlZCB3aXRoIGFcclxuXHQgKiBzcGVjaWZpYyBkZXB0aCBpbiB0aGUgYXJyYXkgd2hpY2ggaXMgb2Z0ZW4gbXVjaCBtb3JlIHBlcmZvcm1hbnQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbGF5ZXJJbmRleCAtIFRoZSBsYXllciBpbmRleCB0aGF0IHNob3VsZCBiZSB1cGRhdGVkLlxyXG5cdCAqL1xyXG5cdGFkZExheWVyVXBkYXRlKCBsYXllckluZGV4ICkge1xyXG5cclxuXHRcdHRoaXMubGF5ZXJVcGRhdGVzLmFkZCggbGF5ZXJJbmRleCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlc2V0cyB0aGUgbGF5ZXIgdXBkYXRlcyByZWdpc3RyeS5cclxuXHQgKi9cclxuXHRjbGVhckxheWVyVXBkYXRlcygpIHtcclxuXHJcblx0XHR0aGlzLmxheWVyVXBkYXRlcy5jbGVhcigpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBDb21wcmVzc2VkQXJyYXlUZXh0dXJlIH07XHJcbiIsImltcG9ydCB7IEN1YmVSZWZsZWN0aW9uTWFwcGluZyB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IENvbXByZXNzZWRUZXh0dXJlIH0gZnJvbSAnLi9Db21wcmVzc2VkVGV4dHVyZS5qcyc7XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIGN1YmUgdGV4dHVyZSBiYXNlZCBvbiBkYXRhIGluIGNvbXByZXNzZWQgZm9ybS5cclxuICpcclxuICogVGhlc2UgdGV4dHVyZSBhcmUgdXN1YWxseSBsb2FkZWQgd2l0aCB7QGxpbmsgQ29tcHJlc3NlZFRleHR1cmVMb2FkZXJ9LlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQ29tcHJlc3NlZFRleHR1cmVcclxuICovXHJcbmNsYXNzIENvbXByZXNzZWRDdWJlVGV4dHVyZSBleHRlbmRzIENvbXByZXNzZWRUZXh0dXJlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBjb21wcmVzc2VkIHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PENvbXByZXNzZWRUZXh0dXJlPn0gaW1hZ2VzIC0gQW4gYXJyYXkgb2YgY29tcHJlc3NlZCB0ZXh0dXJlcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2Zvcm1hdD1SR0JBRm9ybWF0XSAtIFRoZSB0ZXh0dXJlIGZvcm1hdC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3R5cGU9VW5zaWduZWRCeXRlVHlwZV0gLSBUaGUgdGV4dHVyZSB0eXBlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBpbWFnZXMsIGZvcm1hdCwgdHlwZSApIHtcclxuXHJcblx0XHRzdXBlciggdW5kZWZpbmVkLCBpbWFnZXNbIDAgXS53aWR0aCwgaW1hZ2VzWyAwIF0uaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIEN1YmVSZWZsZWN0aW9uTWFwcGluZyApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0NvbXByZXNzZWRDdWJlVGV4dHVyZSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzQ3ViZVRleHR1cmUgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMuaW1hZ2UgPSBpbWFnZXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IENvbXByZXNzZWRDdWJlVGV4dHVyZSB9O1xyXG4iLCJpbXBvcnQgeyBUZXh0dXJlIH0gZnJvbSAnLi9UZXh0dXJlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgdGV4dHVyZSBmcm9tIGEgY2FudmFzIGVsZW1lbnQuXHJcbiAqXHJcbiAqIFRoaXMgaXMgYWxtb3N0IHRoZSBzYW1lIGFzIHRoZSBiYXNlIHRleHR1cmUgY2xhc3MsIGV4Y2VwdCB0aGF0IGl0IHNldHMge0BsaW5rIFRleHR1cmUjbmVlZHNVcGRhdGV9XHJcbiAqIHRvIGB0cnVlYCBpbW1lZGlhdGVseSBzaW5jZSBhIGNhbnZhcyBjYW4gZGlyZWN0bHkgYmUgdXNlZCBmb3IgcmVuZGVyaW5nLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgVGV4dHVyZVxyXG4gKi9cclxuY2xhc3MgQ2FudmFzVGV4dHVyZSBleHRlbmRzIFRleHR1cmUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0hUTUxDYW52YXNFbGVtZW50fSBbY2FudmFzXSAtIFRoZSBIVE1MIGNhbnZhcyBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbWFwcGluZz1UZXh0dXJlLkRFRkFVTFRfTUFQUElOR10gLSBUaGUgdGV4dHVyZSBtYXBwaW5nLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbd3JhcFM9Q2xhbXBUb0VkZ2VXcmFwcGluZ10gLSBUaGUgd3JhcFMgdmFsdWUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt3cmFwVD1DbGFtcFRvRWRnZVdyYXBwaW5nXSAtIFRoZSB3cmFwVCB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW21hZ0ZpbHRlcj1MaW5lYXJGaWx0ZXJdIC0gVGhlIG1hZyBmaWx0ZXIgdmFsdWUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFttaW5GaWx0ZXI9TGluZWFyTWlwbWFwTGluZWFyRmlsdGVyXSAtIFRoZSBtaW4gZmlsdGVyIHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZm9ybWF0PVJHQkFGb3JtYXRdIC0gVGhlIHRleHR1cmUgZm9ybWF0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbdHlwZT1VbnNpZ25lZEJ5dGVUeXBlXSAtIFRoZSB0ZXh0dXJlIHR5cGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFthbmlzb3Ryb3B5PVRleHR1cmUuREVGQVVMVF9BTklTT1RST1BZXSAtIFRoZSBhbmlzb3Ryb3B5IHZhbHVlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBjYW52YXMsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSApIHtcclxuXHJcblx0XHRzdXBlciggY2FudmFzLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHkgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNDYW52YXNUZXh0dXJlID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgQ2FudmFzVGV4dHVyZSB9O1xyXG4iLCJpbXBvcnQgeyBTb3VyY2UgfSBmcm9tICcuL1NvdXJjZS5qcyc7XHJcbmltcG9ydCB7IFRleHR1cmUgfSBmcm9tICcuL1RleHR1cmUuanMnO1xyXG5pbXBvcnQgeyBOZWFyZXN0RmlsdGVyLCBVbnNpZ25lZEludFR5cGUsIERlcHRoRm9ybWF0LCBEZXB0aFN0ZW5jaWxGb3JtYXQgfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgdG8gYXV0b21hdGljYWxseSBzYXZlIHRoZSBkZXB0aCBpbmZvcm1hdGlvbiBvZiBhXHJcbiAqIHJlbmRlcmluZyBpbnRvIGEgdGV4dHVyZS5cclxuICpcclxuICogQGF1Z21lbnRzIFRleHR1cmVcclxuICovXHJcbmNsYXNzIERlcHRoVGV4dHVyZSBleHRlbmRzIFRleHR1cmUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGRlcHRoIHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt0eXBlPVVuc2lnbmVkSW50VHlwZV0gLSBUaGUgdGV4dHVyZSB0eXBlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbWFwcGluZz1UZXh0dXJlLkRFRkFVTFRfTUFQUElOR10gLSBUaGUgdGV4dHVyZSBtYXBwaW5nLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbd3JhcFM9Q2xhbXBUb0VkZ2VXcmFwcGluZ10gLSBUaGUgd3JhcFMgdmFsdWUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt3cmFwVD1DbGFtcFRvRWRnZVdyYXBwaW5nXSAtIFRoZSB3cmFwVCB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW21hZ0ZpbHRlcj1MaW5lYXJGaWx0ZXJdIC0gVGhlIG1hZyBmaWx0ZXIgdmFsdWUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFttaW5GaWx0ZXI9TGluZWFyRmlsdGVyXSAtIFRoZSBtaW4gZmlsdGVyIHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbYW5pc290cm9weT1UZXh0dXJlLkRFRkFVTFRfQU5JU09UUk9QWV0gLSBUaGUgYW5pc290cm9weSB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2Zvcm1hdD1EZXB0aEZvcm1hdF0gLSBUaGUgdGV4dHVyZSBmb3JtYXQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHdpZHRoLCBoZWlnaHQsIHR5cGUgPSBVbnNpZ25lZEludFR5cGUsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyID0gTmVhcmVzdEZpbHRlciwgbWluRmlsdGVyID0gTmVhcmVzdEZpbHRlciwgYW5pc290cm9weSwgZm9ybWF0ID0gRGVwdGhGb3JtYXQgKSB7XHJcblxyXG5cdFx0aWYgKCBmb3JtYXQgIT09IERlcHRoRm9ybWF0ICYmIGZvcm1hdCAhPT0gRGVwdGhTdGVuY2lsRm9ybWF0ICkge1xyXG5cclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnRGVwdGhUZXh0dXJlIGZvcm1hdCBtdXN0IGJlIGVpdGhlciBUSFJFRS5EZXB0aEZvcm1hdCBvciBUSFJFRS5EZXB0aFN0ZW5jaWxGb3JtYXQnICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHN1cGVyKCBudWxsLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHkgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNEZXB0aFRleHR1cmUgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGltYWdlIHByb3BlcnR5IG9mIGEgZGVwdGggdGV4dHVyZSBqdXN0IGRlZmluZXMgaXRzIGRpbWVuc2lvbnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3t3aWR0aDpudW1iZXIsaGVpZ2h0Om51bWJlcn19XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaW1hZ2UgPSB7IHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQgfTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIElmIHNldCB0byBgdHJ1ZWAsIHRoZSB0ZXh0dXJlIGlzIGZsaXBwZWQgYWxvbmcgdGhlIHZlcnRpY2FsIGF4aXMgd2hlblxyXG5cdFx0ICogdXBsb2FkZWQgdG8gdGhlIEdQVS5cclxuXHRcdCAqXHJcblx0XHQgKiBPdmVyd3JpdHRlbiBhbmQgc2V0IHRvIGBmYWxzZWAgYnkgZGVmYXVsdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZmxpcFkgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdG8gZ2VuZXJhdGUgbWlwbWFwcyAoaWYgcG9zc2libGUpIGZvciBhIHRleHR1cmUuXHJcblx0XHQgKlxyXG5cdFx0ICogT3ZlcndyaXR0ZW4gYW5kIHNldCB0byBgZmFsc2VgIGJ5IGRlZmF1bHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGRlcHRoIGNvbXBhcmUgZnVuY3Rpb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez8oTmV2ZXJDb21wYXJlfExlc3NDb21wYXJlfEVxdWFsQ29tcGFyZXxMZXNzRXF1YWxDb21wYXJlfEdyZWF0ZXJDb21wYXJlfE5vdEVxdWFsQ29tcGFyZXxHcmVhdGVyRXF1YWxDb21wYXJlfEFsd2F5c0NvbXBhcmUpfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvbXBhcmVGdW5jdGlvbiA9IG51bGw7XHJcblxyXG5cdH1cclxuXHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLnNvdXJjZSA9IG5ldyBTb3VyY2UoIE9iamVjdC5hc3NpZ24oIHt9LCBzb3VyY2UuaW1hZ2UgKSApOyAvLyBzZWUgIzMwNTQwXHJcblx0XHR0aGlzLmNvbXBhcmVGdW5jdGlvbiA9IHNvdXJjZS5jb21wYXJlRnVuY3Rpb247XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0dG9KU09OKCBtZXRhICkge1xyXG5cclxuXHRcdGNvbnN0IGRhdGEgPSBzdXBlci50b0pTT04oIG1ldGEgKTtcclxuXHJcblx0XHRpZiAoIHRoaXMuY29tcGFyZUZ1bmN0aW9uICE9PSBudWxsICkgZGF0YS5jb21wYXJlRnVuY3Rpb24gPSB0aGlzLmNvbXBhcmVGdW5jdGlvbjtcclxuXHJcblx0XHRyZXR1cm4gZGF0YTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgRGVwdGhUZXh0dXJlIH07XHJcbiIsImltcG9ydCB7IGNsYW1wIH0gZnJvbSAnLi4vLi4vbWF0aC9NYXRoVXRpbHMuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IyLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcbmltcG9ydCB7IE1hdHJpeDQgfSBmcm9tICcuLi8uLi9tYXRoL01hdHJpeDQuanMnO1xyXG5cclxuLyoqXHJcbiAqIEFuIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGNyZWF0aW5nIGFuIGFuYWx5dGljIGN1cnZlIG9iamVjdCB0aGF0IGNvbnRhaW5zIG1ldGhvZHNcclxuICogZm9yIGludGVycG9sYXRpb24uXHJcbiAqXHJcbiAqIEBhYnN0cmFjdFxyXG4gKi9cclxuY2xhc3MgQ3VydmUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGN1cnZlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHR5cGUgcHJvcGVydHkgaXMgdXNlZCBmb3IgZGV0ZWN0aW5nIHRoZSBvYmplY3QgdHlwZVxyXG5cdFx0ICogaW4gY29udGV4dCBvZiBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudHlwZSA9ICdDdXJ2ZSc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIHZhbHVlIGRldGVybWluZXMgdGhlIGFtb3VudCBvZiBkaXZpc2lvbnMgd2hlbiBjYWxjdWxhdGluZyB0aGVcclxuXHRcdCAqIGN1bXVsYXRpdmUgc2VnbWVudCBsZW5ndGhzIG9mIGEgY3VydmUgdmlhIHtAbGluayBDdXJ2ZSNnZXRMZW5ndGhzfS4gVG8gZW5zdXJlXHJcblx0XHQgKiBwcmVjaXNpb24gd2hlbiB1c2luZyBtZXRob2RzIGxpa2Uge0BsaW5rIEN1cnZlI2dldFNwYWNlZFBvaW50c30sIGl0IGlzXHJcblx0XHQgKiByZWNvbW1lbmRlZCB0byBpbmNyZWFzZSB0aGUgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSBpZiB0aGUgY3VydmUgaXMgdmVyeSBsYXJnZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMjAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zID0gMjAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogTXVzdCBiZSBzZXQgdG8gYHRydWVgIGlmIHRoZSBjdXJ2ZSBwYXJhbWV0ZXJzIGhhdmUgY2hhbmdlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIGludGVybmFsIGNhY2hlIHRoYXQgaG9sZHMgcHJlY29tcHV0ZWQgY3VydmUgbGVuZ3RoIHZhbHVlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUgez9BcnJheTxudW1iZXI+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNhY2hlQXJjTGVuZ3RocyA9IG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgcmV0dXJucyBhIHZlY3RvciBpbiAyRCBvciAzRCBzcGFjZSAoZGVwZW5kaW5nIG9uIHRoZSBjdXJ2ZSBkZWZpbml0aW9uKVxyXG5cdCAqIGZvciB0aGUgZ2l2ZW4gaW50ZXJwb2xhdGlvbiBmYWN0b3IuXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdCAtIEEgaW50ZXJwb2xhdGlvbiBmYWN0b3IgcmVwcmVzZW50aW5nIGEgcG9zaXRpb24gb24gdGhlIGN1cnZlLiBNdXN0IGJlIGluIHRoZSByYW5nZSBgWzAsMV1gLlxyXG5cdCAqIEBwYXJhbSB7KFZlY3RvcjJ8VmVjdG9yMyl9IFtvcHRpb25hbFRhcmdldF0gLSBUaGUgb3B0aW9uYWwgdGFyZ2V0IHZlY3RvciB0aGUgcmVzdWx0IGlzIHdyaXR0ZW4gdG8uXHJcblx0ICogQHJldHVybiB7KFZlY3RvcjJ8VmVjdG9yMyl9IFRoZSBwb3NpdGlvbiBvbiB0aGUgY3VydmUuIEl0IGNhbiBiZSBhIDJEIG9yIDNEIHZlY3RvciBkZXBlbmRpbmcgb24gdGhlIGN1cnZlIGRlZmluaXRpb24uXHJcblx0ICovXHJcblx0Z2V0UG9pbnQoIC8qIHQsIG9wdGlvbmFsVGFyZ2V0ICovICkge1xyXG5cclxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkN1cnZlOiAuZ2V0UG9pbnQoKSBub3QgaW1wbGVtZW50ZWQuJyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSB2ZWN0b3IgaW4gMkQgb3IgM0Qgc3BhY2UgKGRlcGVuZGluZyBvbiB0aGUgY3VydmUgZGVmaW5pdGlvbilcclxuXHQgKiBmb3IgdGhlIGdpdmVuIGludGVycG9sYXRpb24gZmFjdG9yLiBVbmxpa2Uge0BsaW5rIEN1cnZlI2dldFBvaW50fSwgdGhpcyBtZXRob2QgaG9ub3JzIHRoZSBsZW5ndGhcclxuXHQgKiBvZiB0aGUgY3VydmUgd2hpY2ggZXF1aWRpc3RhbnQgc2FtcGxlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB1IC0gQSBpbnRlcnBvbGF0aW9uIGZhY3RvciByZXByZXNlbnRpbmcgYSBwb3NpdGlvbiBvbiB0aGUgY3VydmUuIE11c3QgYmUgaW4gdGhlIHJhbmdlIGBbMCwxXWAuXHJcblx0ICogQHBhcmFtIHsoVmVjdG9yMnxWZWN0b3IzKX0gW29wdGlvbmFsVGFyZ2V0XSAtIFRoZSBvcHRpb25hbCB0YXJnZXQgdmVjdG9yIHRoZSByZXN1bHQgaXMgd3JpdHRlbiB0by5cclxuXHQgKiBAcmV0dXJuIHsoVmVjdG9yMnxWZWN0b3IzKX0gVGhlIHBvc2l0aW9uIG9uIHRoZSBjdXJ2ZS4gSXQgY2FuIGJlIGEgMkQgb3IgM0QgdmVjdG9yIGRlcGVuZGluZyBvbiB0aGUgY3VydmUgZGVmaW5pdGlvbi5cclxuXHQgKi9cclxuXHRnZXRQb2ludEF0KCB1LCBvcHRpb25hbFRhcmdldCApIHtcclxuXHJcblx0XHRjb25zdCB0ID0gdGhpcy5nZXRVdG9UbWFwcGluZyggdSApO1xyXG5cdFx0cmV0dXJuIHRoaXMuZ2V0UG9pbnQoIHQsIG9wdGlvbmFsVGFyZ2V0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2Qgc2FtcGxlcyB0aGUgY3VydmUgdmlhIHtAbGluayBDdXJ2ZSNnZXRQb2ludH0gYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgcG9pbnRzIHJlcHJlc2VudGluZ1xyXG5cdCAqIHRoZSBjdXJ2ZSBzaGFwZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZGl2aXNpb25zPTVdIC0gVGhlIG51bWJlciBvZiBkaXZpc2lvbnMuXHJcblx0ICogQHJldHVybiB7QXJyYXk8KFZlY3RvcjJ8VmVjdG9yMyk+fSBBbiBhcnJheSBob2xkaW5nIHRoZSBzYW1wbGVkIGN1cnZlIHZhbHVlcy4gVGhlIG51bWJlciBvZiBwb2ludHMgaXMgYGRpdmlzaW9ucyArIDFgLlxyXG5cdCAqL1xyXG5cdGdldFBvaW50cyggZGl2aXNpb25zID0gNSApIHtcclxuXHJcblx0XHRjb25zdCBwb2ludHMgPSBbXTtcclxuXHJcblx0XHRmb3IgKCBsZXQgZCA9IDA7IGQgPD0gZGl2aXNpb25zOyBkICsrICkge1xyXG5cclxuXHRcdFx0cG9pbnRzLnB1c2goIHRoaXMuZ2V0UG9pbnQoIGQgLyBkaXZpc2lvbnMgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcG9pbnRzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vIEdldCBzZXF1ZW5jZSBvZiBwb2ludHMgdXNpbmcgZ2V0UG9pbnRBdCggdSApXHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIHNhbXBsZXMgdGhlIGN1cnZlIHZpYSB7QGxpbmsgQ3VydmUjZ2V0UG9pbnRBdH0gYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgcG9pbnRzIHJlcHJlc2VudGluZ1xyXG5cdCAqIHRoZSBjdXJ2ZSBzaGFwZS4gVW5saWtlIHtAbGluayBDdXJ2ZSNnZXRQb2ludHN9LCB0aGlzIG1ldGhvZCByZXR1cm5zIGVxdWktc3BhY2VkIHBvaW50cyBhY3Jvc3MgdGhlIGVudGlyZVxyXG5cdCAqIGN1cnZlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtkaXZpc2lvbnM9NV0gLSBUaGUgbnVtYmVyIG9mIGRpdmlzaW9ucy5cclxuXHQgKiBAcmV0dXJuIHtBcnJheTwoVmVjdG9yMnxWZWN0b3IzKT59IEFuIGFycmF5IGhvbGRpbmcgdGhlIHNhbXBsZWQgY3VydmUgdmFsdWVzLiBUaGUgbnVtYmVyIG9mIHBvaW50cyBpcyBgZGl2aXNpb25zICsgMWAuXHJcblx0ICovXHJcblx0Z2V0U3BhY2VkUG9pbnRzKCBkaXZpc2lvbnMgPSA1ICkge1xyXG5cclxuXHRcdGNvbnN0IHBvaW50cyA9IFtdO1xyXG5cclxuXHRcdGZvciAoIGxldCBkID0gMDsgZCA8PSBkaXZpc2lvbnM7IGQgKysgKSB7XHJcblxyXG5cdFx0XHRwb2ludHMucHVzaCggdGhpcy5nZXRQb2ludEF0KCBkIC8gZGl2aXNpb25zICkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHBvaW50cztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSB0b3RhbCBhcmMgbGVuZ3RoIG9mIHRoZSBjdXJ2ZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGxlbmd0aCBvZiB0aGUgY3VydmUuXHJcblx0ICovXHJcblx0Z2V0TGVuZ3RoKCkge1xyXG5cclxuXHRcdGNvbnN0IGxlbmd0aHMgPSB0aGlzLmdldExlbmd0aHMoKTtcclxuXHRcdHJldHVybiBsZW5ndGhzWyBsZW5ndGhzLmxlbmd0aCAtIDEgXTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGN1bXVsYXRpdmUgc2VnbWVudCBsZW5ndGhzIG9mIHRoZSBjdXJ2ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZGl2aXNpb25zPXRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zXSAtIFRoZSBudW1iZXIgb2YgZGl2aXNpb25zLlxyXG5cdCAqIEByZXR1cm4ge0FycmF5PG51bWJlcj59IEFuIGFycmF5IGhvbGRpbmcgdGhlIGN1bXVsYXRpdmUgc2VnbWVudCBsZW5ndGhzLlxyXG5cdCAqL1xyXG5cdGdldExlbmd0aHMoIGRpdmlzaW9ucyA9IHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5jYWNoZUFyY0xlbmd0aHMgJiZcclxuXHRcdFx0KCB0aGlzLmNhY2hlQXJjTGVuZ3Rocy5sZW5ndGggPT09IGRpdmlzaW9ucyArIDEgKSAmJlxyXG5cdFx0XHQhIHRoaXMubmVlZHNVcGRhdGUgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gdGhpcy5jYWNoZUFyY0xlbmd0aHM7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSBmYWxzZTtcclxuXHJcblx0XHRjb25zdCBjYWNoZSA9IFtdO1xyXG5cdFx0bGV0IGN1cnJlbnQsIGxhc3QgPSB0aGlzLmdldFBvaW50KCAwICk7XHJcblx0XHRsZXQgc3VtID0gMDtcclxuXHJcblx0XHRjYWNoZS5wdXNoKCAwICk7XHJcblxyXG5cdFx0Zm9yICggbGV0IHAgPSAxOyBwIDw9IGRpdmlzaW9uczsgcCArKyApIHtcclxuXHJcblx0XHRcdGN1cnJlbnQgPSB0aGlzLmdldFBvaW50KCBwIC8gZGl2aXNpb25zICk7XHJcblx0XHRcdHN1bSArPSBjdXJyZW50LmRpc3RhbmNlVG8oIGxhc3QgKTtcclxuXHRcdFx0Y2FjaGUucHVzaCggc3VtICk7XHJcblx0XHRcdGxhc3QgPSBjdXJyZW50O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmNhY2hlQXJjTGVuZ3RocyA9IGNhY2hlO1xyXG5cclxuXHRcdHJldHVybiBjYWNoZTsgLy8geyBzdW1zOiBjYWNoZSwgc3VtOiBzdW0gfTsgU3VtIGlzIGluIHRoZSBsYXN0IGVsZW1lbnQuXHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlIHRoZSBjdW11bGF0aXZlIHNlZ21lbnQgZGlzdGFuY2UgY2FjaGUuIFRoZSBtZXRob2QgbXVzdCBiZSBjYWxsZWRcclxuXHQgKiBldmVyeSB0aW1lIGN1cnZlIHBhcmFtZXRlcnMgYXJlIGNoYW5nZWQuIElmIGFuIHVwZGF0ZWQgY3VydmUgaXMgcGFydCBvZiBhXHJcblx0ICogY29tcG9zZWQgY3VydmUgbGlrZSB7QGxpbmsgQ3VydmVQYXRofSwgdGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgb24gdGhlXHJcblx0ICogY29tcG9zZWQgY3VydmUsIHRvby5cclxuXHQgKi9cclxuXHR1cGRhdGVBcmNMZW5ndGhzKCkge1xyXG5cclxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cdFx0dGhpcy5nZXRMZW5ndGhzKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2l2ZW4gYW4gaW50ZXJwb2xhdGlvbiBmYWN0b3IgaW4gdGhlIHJhbmdlIGBbMCwxXWAsIHRoaXMgbWV0aG9kIHJldHVybnMgYW4gdXBkYXRlZFxyXG5cdCAqIGludGVycG9sYXRpb24gZmFjdG9yIGluIHRoZSBzYW1lIHJhbmdlIHRoYXQgY2FuIGJlIHVlZCB0byBzYW1wbGUgZXF1aWRpc3RhbnQgcG9pbnRzXHJcblx0ICogZnJvbSBhIGN1cnZlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHUgLSBUaGUgaW50ZXJwb2xhdGlvbiBmYWN0b3IuXHJcblx0ICogQHBhcmFtIHs/bnVtYmVyfSBkaXN0YW5jZSAtIEFuIG9wdGlvbmFsIGRpc3RhbmNlIG9uIHRoZSBjdXJ2ZS5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB1cGRhdGVkIGludGVycG9sYXRpb24gZmFjdG9yLlxyXG5cdCAqL1xyXG5cdGdldFV0b1RtYXBwaW5nKCB1LCBkaXN0YW5jZSA9IG51bGwgKSB7XHJcblxyXG5cdFx0Y29uc3QgYXJjTGVuZ3RocyA9IHRoaXMuZ2V0TGVuZ3RocygpO1xyXG5cclxuXHRcdGxldCBpID0gMDtcclxuXHRcdGNvbnN0IGlsID0gYXJjTGVuZ3Rocy5sZW5ndGg7XHJcblxyXG5cdFx0bGV0IHRhcmdldEFyY0xlbmd0aDsgLy8gVGhlIHRhcmdldGVkIHUgZGlzdGFuY2UgdmFsdWUgdG8gZ2V0XHJcblxyXG5cdFx0aWYgKCBkaXN0YW5jZSApIHtcclxuXHJcblx0XHRcdHRhcmdldEFyY0xlbmd0aCA9IGRpc3RhbmNlO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR0YXJnZXRBcmNMZW5ndGggPSB1ICogYXJjTGVuZ3Roc1sgaWwgLSAxIF07XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGJpbmFyeSBzZWFyY2ggZm9yIHRoZSBpbmRleCB3aXRoIGxhcmdlc3QgdmFsdWUgc21hbGxlciB0aGFuIHRhcmdldCB1IGRpc3RhbmNlXHJcblxyXG5cdFx0bGV0IGxvdyA9IDAsIGhpZ2ggPSBpbCAtIDEsIGNvbXBhcmlzb247XHJcblxyXG5cdFx0d2hpbGUgKCBsb3cgPD0gaGlnaCApIHtcclxuXHJcblx0XHRcdGkgPSBNYXRoLmZsb29yKCBsb3cgKyAoIGhpZ2ggLSBsb3cgKSAvIDIgKTsgLy8gbGVzcyBsaWtlbHkgdG8gb3ZlcmZsb3csIHRob3VnaCBwcm9iYWJseSBub3QgaXNzdWUgaGVyZSwgSlMgZG9lc24ndCByZWFsbHkgaGF2ZSBpbnRlZ2VycywgYWxsIG51bWJlcnMgYXJlIGZsb2F0c1xyXG5cclxuXHRcdFx0Y29tcGFyaXNvbiA9IGFyY0xlbmd0aHNbIGkgXSAtIHRhcmdldEFyY0xlbmd0aDtcclxuXHJcblx0XHRcdGlmICggY29tcGFyaXNvbiA8IDAgKSB7XHJcblxyXG5cdFx0XHRcdGxvdyA9IGkgKyAxO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggY29tcGFyaXNvbiA+IDAgKSB7XHJcblxyXG5cdFx0XHRcdGhpZ2ggPSBpIC0gMTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGhpZ2ggPSBpO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHQvLyBET05FXHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGkgPSBoaWdoO1xyXG5cclxuXHRcdGlmICggYXJjTGVuZ3Roc1sgaSBdID09PSB0YXJnZXRBcmNMZW5ndGggKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gaSAvICggaWwgLSAxICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIHdlIGNvdWxkIGdldCBmaW5lciBncmFpbiBhdCBsZW5ndGhzLCBvciB1c2Ugc2ltcGxlIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gcG9pbnRzXHJcblxyXG5cdFx0Y29uc3QgbGVuZ3RoQmVmb3JlID0gYXJjTGVuZ3Roc1sgaSBdO1xyXG5cdFx0Y29uc3QgbGVuZ3RoQWZ0ZXIgPSBhcmNMZW5ndGhzWyBpICsgMSBdO1xyXG5cclxuXHRcdGNvbnN0IHNlZ21lbnRMZW5ndGggPSBsZW5ndGhBZnRlciAtIGxlbmd0aEJlZm9yZTtcclxuXHJcblx0XHQvLyBkZXRlcm1pbmUgd2hlcmUgd2UgYXJlIGJldHdlZW4gdGhlICdiZWZvcmUnIGFuZCAnYWZ0ZXInIHBvaW50c1xyXG5cclxuXHRcdGNvbnN0IHNlZ21lbnRGcmFjdGlvbiA9ICggdGFyZ2V0QXJjTGVuZ3RoIC0gbGVuZ3RoQmVmb3JlICkgLyBzZWdtZW50TGVuZ3RoO1xyXG5cclxuXHRcdC8vIGFkZCB0aGF0IGZyYWN0aW9uYWwgYW1vdW50IHRvIHRcclxuXHJcblx0XHRjb25zdCB0ID0gKCBpICsgc2VnbWVudEZyYWN0aW9uICkgLyAoIGlsIC0gMSApO1xyXG5cclxuXHRcdHJldHVybiB0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSB1bml0IHZlY3RvciB0YW5nZW50IGZvciB0aGUgZ2l2ZW4gaW50ZXJwb2xhdGlvbiBmYWN0b3IuXHJcblx0ICogSWYgdGhlIGRlcml2ZWQgY3VydmUgZG9lcyBub3QgaW1wbGVtZW50IGl0cyB0YW5nZW50IGRlcml2YXRpb24sXHJcblx0ICogdHdvIHBvaW50cyBhIHNtYWxsIGRlbHRhIGFwYXJ0IHdpbGwgYmUgdXNlZCB0byBmaW5kIGl0cyBncmFkaWVudFxyXG5cdCAqIHdoaWNoIHNlZW1zIHRvIGdpdmUgYSByZWFzb25hYmxlIGFwcHJveGltYXRpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdCAtIFRoZSBpbnRlcnBvbGF0aW9uIGZhY3Rvci5cclxuXHQgKiBAcGFyYW0geyhWZWN0b3IyfFZlY3RvcjMpfSBbb3B0aW9uYWxUYXJnZXRdIC0gVGhlIG9wdGlvbmFsIHRhcmdldCB2ZWN0b3IgdGhlIHJlc3VsdCBpcyB3cml0dGVuIHRvLlxyXG5cdCAqIEByZXR1cm4geyhWZWN0b3IyfFZlY3RvcjMpfSBUaGUgdGFuZ2VudCB2ZWN0b3IuXHJcblx0ICovXHJcblx0Z2V0VGFuZ2VudCggdCwgb3B0aW9uYWxUYXJnZXQgKSB7XHJcblxyXG5cdFx0Y29uc3QgZGVsdGEgPSAwLjAwMDE7XHJcblx0XHRsZXQgdDEgPSB0IC0gZGVsdGE7XHJcblx0XHRsZXQgdDIgPSB0ICsgZGVsdGE7XHJcblxyXG5cdFx0Ly8gQ2FwcGluZyBpbiBjYXNlIG9mIGRhbmdlclxyXG5cclxuXHRcdGlmICggdDEgPCAwICkgdDEgPSAwO1xyXG5cdFx0aWYgKCB0MiA+IDEgKSB0MiA9IDE7XHJcblxyXG5cdFx0Y29uc3QgcHQxID0gdGhpcy5nZXRQb2ludCggdDEgKTtcclxuXHRcdGNvbnN0IHB0MiA9IHRoaXMuZ2V0UG9pbnQoIHQyICk7XHJcblxyXG5cdFx0Y29uc3QgdGFuZ2VudCA9IG9wdGlvbmFsVGFyZ2V0IHx8ICggKCBwdDEuaXNWZWN0b3IyICkgPyBuZXcgVmVjdG9yMigpIDogbmV3IFZlY3RvcjMoKSApO1xyXG5cclxuXHRcdHRhbmdlbnQuY29weSggcHQyICkuc3ViKCBwdDEgKS5ub3JtYWxpemUoKTtcclxuXHJcblx0XHRyZXR1cm4gdGFuZ2VudDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTYW1lIGFzIHtAbGluayBDdXJ2ZSNnZXRUYW5nZW50fSBidXQgd2l0aCBlcXVpZGlzdGFudCBzYW1wbGVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHUgLSBUaGUgaW50ZXJwb2xhdGlvbiBmYWN0b3IuXHJcblx0ICogQHBhcmFtIHsoVmVjdG9yMnxWZWN0b3IzKX0gW29wdGlvbmFsVGFyZ2V0XSAtIFRoZSBvcHRpb25hbCB0YXJnZXQgdmVjdG9yIHRoZSByZXN1bHQgaXMgd3JpdHRlbiB0by5cclxuXHQgKiBAcmV0dXJuIHsoVmVjdG9yMnxWZWN0b3IzKX0gVGhlIHRhbmdlbnQgdmVjdG9yLlxyXG5cdCAqIEBzZWUge0BsaW5rIEN1cnZlI2dldFBvaW50QXR9XHJcblx0ICovXHJcblx0Z2V0VGFuZ2VudEF0KCB1LCBvcHRpb25hbFRhcmdldCApIHtcclxuXHJcblx0XHRjb25zdCB0ID0gdGhpcy5nZXRVdG9UbWFwcGluZyggdSApO1xyXG5cdFx0cmV0dXJuIHRoaXMuZ2V0VGFuZ2VudCggdCwgb3B0aW9uYWxUYXJnZXQgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZW5lcmF0ZXMgdGhlIEZyZW5ldCBGcmFtZXMuIFJlcXVpcmVzIGEgY3VydmUgZGVmaW5pdGlvbiBpbiAzRCBzcGFjZS4gVXNlZFxyXG5cdCAqIGluIGdlb21ldHJpZXMgbGlrZSB7QGxpbmsgVHViZUdlb21ldHJ5fSBvciB7QGxpbmsgRXh0cnVkZUdlb21ldHJ5fS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzZWdtZW50cyAtIFRoZSBudW1iZXIgb2Ygc2VnbWVudHMuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbY2xvc2VkPWZhbHNlXSAtIFdoZXRoZXIgdGhlIGN1cnZlIGlzIGNsb3NlZCBvciBub3QuXHJcblx0ICogQHJldHVybiB7e3RhbmdlbnRzOiBBcnJheTxWZWN0b3IzPiwgbm9ybWFsczogQXJyYXk8VmVjdG9yMz4sIGJpbm9ybWFsczogQXJyYXk8VmVjdG9yMz59fSBUaGUgRnJlbmV0IEZyYW1lcy5cclxuXHQgKi9cclxuXHRjb21wdXRlRnJlbmV0RnJhbWVzKCBzZWdtZW50cywgY2xvc2VkID0gZmFsc2UgKSB7XHJcblxyXG5cdFx0Ly8gc2VlIGh0dHA6Ly93d3cuY3MuaW5kaWFuYS5lZHUvcHViL3RlY2hyZXBvcnRzL1RSNDI1LnBkZlxyXG5cclxuXHRcdGNvbnN0IG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XHJcblxyXG5cdFx0Y29uc3QgdGFuZ2VudHMgPSBbXTtcclxuXHRcdGNvbnN0IG5vcm1hbHMgPSBbXTtcclxuXHRcdGNvbnN0IGJpbm9ybWFscyA9IFtdO1xyXG5cclxuXHRcdGNvbnN0IHZlYyA9IG5ldyBWZWN0b3IzKCk7XHJcblx0XHRjb25zdCBtYXQgPSBuZXcgTWF0cml4NCgpO1xyXG5cclxuXHRcdC8vIGNvbXB1dGUgdGhlIHRhbmdlbnQgdmVjdG9ycyBmb3IgZWFjaCBzZWdtZW50IG9uIHRoZSBjdXJ2ZVxyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8PSBzZWdtZW50czsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHUgPSBpIC8gc2VnbWVudHM7XHJcblxyXG5cdFx0XHR0YW5nZW50c1sgaSBdID0gdGhpcy5nZXRUYW5nZW50QXQoIHUsIG5ldyBWZWN0b3IzKCkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gc2VsZWN0IGFuIGluaXRpYWwgbm9ybWFsIHZlY3RvciBwZXJwZW5kaWN1bGFyIHRvIHRoZSBmaXJzdCB0YW5nZW50IHZlY3RvcixcclxuXHRcdC8vIGFuZCBpbiB0aGUgZGlyZWN0aW9uIG9mIHRoZSBtaW5pbXVtIHRhbmdlbnQgeHl6IGNvbXBvbmVudFxyXG5cclxuXHRcdG5vcm1hbHNbIDAgXSA9IG5ldyBWZWN0b3IzKCk7XHJcblx0XHRiaW5vcm1hbHNbIDAgXSA9IG5ldyBWZWN0b3IzKCk7XHJcblx0XHRsZXQgbWluID0gTnVtYmVyLk1BWF9WQUxVRTtcclxuXHRcdGNvbnN0IHR4ID0gTWF0aC5hYnMoIHRhbmdlbnRzWyAwIF0ueCApO1xyXG5cdFx0Y29uc3QgdHkgPSBNYXRoLmFicyggdGFuZ2VudHNbIDAgXS55ICk7XHJcblx0XHRjb25zdCB0eiA9IE1hdGguYWJzKCB0YW5nZW50c1sgMCBdLnogKTtcclxuXHJcblx0XHRpZiAoIHR4IDw9IG1pbiApIHtcclxuXHJcblx0XHRcdG1pbiA9IHR4O1xyXG5cdFx0XHRub3JtYWwuc2V0KCAxLCAwLCAwICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdHkgPD0gbWluICkge1xyXG5cclxuXHRcdFx0bWluID0gdHk7XHJcblx0XHRcdG5vcm1hbC5zZXQoIDAsIDEsIDAgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0eiA8PSBtaW4gKSB7XHJcblxyXG5cdFx0XHRub3JtYWwuc2V0KCAwLCAwLCAxICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHZlYy5jcm9zc1ZlY3RvcnMoIHRhbmdlbnRzWyAwIF0sIG5vcm1hbCApLm5vcm1hbGl6ZSgpO1xyXG5cclxuXHRcdG5vcm1hbHNbIDAgXS5jcm9zc1ZlY3RvcnMoIHRhbmdlbnRzWyAwIF0sIHZlYyApO1xyXG5cdFx0Ymlub3JtYWxzWyAwIF0uY3Jvc3NWZWN0b3JzKCB0YW5nZW50c1sgMCBdLCBub3JtYWxzWyAwIF0gKTtcclxuXHJcblxyXG5cdFx0Ly8gY29tcHV0ZSB0aGUgc2xvd2x5LXZhcnlpbmcgbm9ybWFsIGFuZCBiaW5vcm1hbCB2ZWN0b3JzIGZvciBlYWNoIHNlZ21lbnQgb24gdGhlIGN1cnZlXHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAxOyBpIDw9IHNlZ21lbnRzOyBpICsrICkge1xyXG5cclxuXHRcdFx0bm9ybWFsc1sgaSBdID0gbm9ybWFsc1sgaSAtIDEgXS5jbG9uZSgpO1xyXG5cclxuXHRcdFx0Ymlub3JtYWxzWyBpIF0gPSBiaW5vcm1hbHNbIGkgLSAxIF0uY2xvbmUoKTtcclxuXHJcblx0XHRcdHZlYy5jcm9zc1ZlY3RvcnMoIHRhbmdlbnRzWyBpIC0gMSBdLCB0YW5nZW50c1sgaSBdICk7XHJcblxyXG5cdFx0XHRpZiAoIHZlYy5sZW5ndGgoKSA+IE51bWJlci5FUFNJTE9OICkge1xyXG5cclxuXHRcdFx0XHR2ZWMubm9ybWFsaXplKCk7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHRoZXRhID0gTWF0aC5hY29zKCBjbGFtcCggdGFuZ2VudHNbIGkgLSAxIF0uZG90KCB0YW5nZW50c1sgaSBdICksIC0gMSwgMSApICk7IC8vIGNsYW1wIGZvciBmbG9hdGluZyBwdCBlcnJvcnNcclxuXHJcblx0XHRcdFx0bm9ybWFsc1sgaSBdLmFwcGx5TWF0cml4NCggbWF0Lm1ha2VSb3RhdGlvbkF4aXMoIHZlYywgdGhldGEgKSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ymlub3JtYWxzWyBpIF0uY3Jvc3NWZWN0b3JzKCB0YW5nZW50c1sgaSBdLCBub3JtYWxzWyBpIF0gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gaWYgdGhlIGN1cnZlIGlzIGNsb3NlZCwgcG9zdHByb2Nlc3MgdGhlIHZlY3RvcnMgc28gdGhlIGZpcnN0IGFuZCBsYXN0IG5vcm1hbCB2ZWN0b3JzIGFyZSB0aGUgc2FtZVxyXG5cclxuXHRcdGlmICggY2xvc2VkID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0bGV0IHRoZXRhID0gTWF0aC5hY29zKCBjbGFtcCggbm9ybWFsc1sgMCBdLmRvdCggbm9ybWFsc1sgc2VnbWVudHMgXSApLCAtIDEsIDEgKSApO1xyXG5cdFx0XHR0aGV0YSAvPSBzZWdtZW50cztcclxuXHJcblx0XHRcdGlmICggdGFuZ2VudHNbIDAgXS5kb3QoIHZlYy5jcm9zc1ZlY3RvcnMoIG5vcm1hbHNbIDAgXSwgbm9ybWFsc1sgc2VnbWVudHMgXSApICkgPiAwICkge1xyXG5cclxuXHRcdFx0XHR0aGV0YSA9IC0gdGhldGE7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDE7IGkgPD0gc2VnbWVudHM7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdC8vIHR3aXN0IGEgbGl0dGxlLi4uXHJcblx0XHRcdFx0bm9ybWFsc1sgaSBdLmFwcGx5TWF0cml4NCggbWF0Lm1ha2VSb3RhdGlvbkF4aXMoIHRhbmdlbnRzWyBpIF0sIHRoZXRhICogaSApICk7XHJcblx0XHRcdFx0Ymlub3JtYWxzWyBpIF0uY3Jvc3NWZWN0b3JzKCB0YW5nZW50c1sgaSBdLCBub3JtYWxzWyBpIF0gKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHtcclxuXHRcdFx0dGFuZ2VudHM6IHRhbmdlbnRzLFxyXG5cdFx0XHRub3JtYWxzOiBub3JtYWxzLFxyXG5cdFx0XHRiaW5vcm1hbHM6IGJpbm9ybWFsc1xyXG5cdFx0fTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbmV3IGN1cnZlIHdpdGggY29waWVkIHZhbHVlcyBmcm9tIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtDdXJ2ZX0gQSBjbG9uZSBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNsb25lKCkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gY3VydmUgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Q3VydmV9IHNvdXJjZSAtIFRoZSBjdXJ2ZSB0byBjb3B5LlxyXG5cdCAqIEByZXR1cm4ge0N1cnZlfSBBIHJlZmVyZW5jZSB0byB0aGlzIGN1cnZlLlxyXG5cdCAqL1xyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHR0aGlzLmFyY0xlbmd0aERpdmlzaW9ucyA9IHNvdXJjZS5hcmNMZW5ndGhEaXZpc2lvbnM7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2VyaWFsaXplcyB0aGUgY3VydmUgaW50byBKU09OLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7T2JqZWN0fSBBIEpTT04gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc2VyaWFsaXplZCBjdXJ2ZS5cclxuXHQgKiBAc2VlIHtAbGluayBPYmplY3RMb2FkZXIjcGFyc2V9XHJcblx0ICovXHJcblx0dG9KU09OKCkge1xyXG5cclxuXHRcdGNvbnN0IGRhdGEgPSB7XHJcblx0XHRcdG1ldGFkYXRhOiB7XHJcblx0XHRcdFx0dmVyc2lvbjogNC42LFxyXG5cdFx0XHRcdHR5cGU6ICdDdXJ2ZScsXHJcblx0XHRcdFx0Z2VuZXJhdG9yOiAnQ3VydmUudG9KU09OJ1xyXG5cdFx0XHR9XHJcblx0XHR9O1xyXG5cclxuXHRcdGRhdGEuYXJjTGVuZ3RoRGl2aXNpb25zID0gdGhpcy5hcmNMZW5ndGhEaXZpc2lvbnM7XHJcblx0XHRkYXRhLnR5cGUgPSB0aGlzLnR5cGU7XHJcblxyXG5cdFx0cmV0dXJuIGRhdGE7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVzZXJpYWxpemVzIHRoZSBjdXJ2ZSBmcm9tIHRoZSBnaXZlbiBKU09OLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGpzb24gLSBUaGUgSlNPTiBob2xkaW5nIHRoZSBzZXJpYWxpemVkIGN1cnZlLlxyXG5cdCAqIEByZXR1cm4ge0N1cnZlfSBBIHJlZmVyZW5jZSB0byB0aGlzIGN1cnZlLlxyXG5cdCAqL1xyXG5cdGZyb21KU09OKCBqc29uICkge1xyXG5cclxuXHRcdHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zID0ganNvbi5hcmNMZW5ndGhEaXZpc2lvbnM7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBDdXJ2ZSB9O1xyXG4iLCJpbXBvcnQgeyBDdXJ2ZSB9IGZyb20gJy4uL2NvcmUvQ3VydmUuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IyLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIGN1cnZlIHJlcHJlc2VudGluZyBhbiBlbGxpcHNlLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBjdXJ2ZSA9IG5ldyBUSFJFRS5FbGxpcHNlQ3VydmUoXHJcbiAqIFx0MCwgMCxcclxuICogXHQxMCwgMTAsXHJcbiAqIFx0MCwgMiAqIE1hdGguUEksXHJcbiAqIFx0ZmFsc2UsXHJcbiAqIFx0MFxyXG4gKiApO1xyXG4gKlxyXG4gKiBjb25zdCBwb2ludHMgPSBjdXJ2ZS5nZXRQb2ludHMoIDUwICk7XHJcbiAqIGNvbnN0IGdlb21ldHJ5ID0gbmV3IFRIUkVFLkJ1ZmZlckdlb21ldHJ5KCkuc2V0RnJvbVBvaW50cyggcG9pbnRzICk7XHJcbiAqXHJcbiAqIGNvbnN0IG1hdGVyaWFsID0gbmV3IFRIUkVFLkxpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiAweGZmMDAwMCB9ICk7XHJcbiAqXHJcbiAqIC8vIENyZWF0ZSB0aGUgZmluYWwgb2JqZWN0IHRvIGFkZCB0byB0aGUgc2NlbmVcclxuICogY29uc3QgZWxsaXBzZSA9IG5ldyBUSFJFRS5MaW5lKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBDdXJ2ZVxyXG4gKi9cclxuY2xhc3MgRWxsaXBzZUN1cnZlIGV4dGVuZHMgQ3VydmUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGVsbGlwc2UgY3VydmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2FYPTBdIC0gVGhlIFggY2VudGVyIG9mIHRoZSBlbGxpcHNlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbYVk9MF0gLSBUaGUgWSBjZW50ZXIgb2YgdGhlIGVsbGlwc2UuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt4UmFkaXVzPTFdIC0gVGhlIHJhZGl1cyBvZiB0aGUgZWxsaXBzZSBpbiB0aGUgeCBkaXJlY3Rpb24uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt5UmFkaXVzPTFdIC0gVGhlIHJhZGl1cyBvZiB0aGUgZWxsaXBzZSBpbiB0aGUgeSBkaXJlY3Rpb24uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFthU3RhcnRBbmdsZT0wXSAtIFRoZSBzdGFydCBhbmdsZSBvZiB0aGUgY3VydmUgaW4gcmFkaWFucyBzdGFydGluZyBmcm9tIHRoZSBwb3NpdGl2ZSBYIGF4aXMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFthRW5kQW5nbGU9TWF0aC5QSSoyXSAtIFRoZSBlbmQgYW5nbGUgb2YgdGhlIGN1cnZlIGluIHJhZGlhbnMgc3RhcnRpbmcgZnJvbSB0aGUgcG9zaXRpdmUgWCBheGlzLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FDbG9ja3dpc2U9ZmFsc2VdIC0gV2hldGhlciB0aGUgZWxsaXBzZSBpcyBkcmF3biBjbG9ja3dpc2Ugb3Igbm90LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbYVJvdGF0aW9uPTBdIC0gVGhlIHJvdGF0aW9uIGFuZ2xlIG9mIHRoZSBlbGxpcHNlIGluIHJhZGlhbnMsIGNvdW50ZXJjbG9ja3dpc2UgZnJvbSB0aGUgcG9zaXRpdmUgWCBheGlzLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBhWCA9IDAsIGFZID0gMCwgeFJhZGl1cyA9IDEsIHlSYWRpdXMgPSAxLCBhU3RhcnRBbmdsZSA9IDAsIGFFbmRBbmdsZSA9IE1hdGguUEkgKiAyLCBhQ2xvY2t3aXNlID0gZmFsc2UsIGFSb3RhdGlvbiA9IDAgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNFbGxpcHNlQ3VydmUgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdFbGxpcHNlQ3VydmUnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIFggY2VudGVyIG9mIHRoZSBlbGxpcHNlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYVggPSBhWDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBZIGNlbnRlciBvZiB0aGUgZWxsaXBzZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFZID0gYVk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcmFkaXVzIG9mIHRoZSBlbGxpcHNlIGluIHRoZSB4IGRpcmVjdGlvbi5cclxuXHRcdCAqIFNldHRpbmcgdGhlIHRoaXMgdmFsdWUgZXF1YWwgdG8gdGhlIHtAbGluayBFbGxpcHNlQ3VydmUjeVJhZGl1c30gd2lsbCByZXN1bHQgaW4gYSBjaXJjbGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy54UmFkaXVzID0geFJhZGl1cztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByYWRpdXMgb2YgdGhlIGVsbGlwc2UgaW4gdGhlIHkgZGlyZWN0aW9uLlxyXG5cdFx0ICogU2V0dGluZyB0aGUgdGhpcyB2YWx1ZSBlcXVhbCB0byB0aGUge0BsaW5rIEVsbGlwc2VDdXJ2ZSN4UmFkaXVzfSB3aWxsIHJlc3VsdCBpbiBhIGNpcmNsZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnlSYWRpdXMgPSB5UmFkaXVzO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHN0YXJ0IGFuZ2xlIG9mIHRoZSBjdXJ2ZSBpbiByYWRpYW5zIHN0YXJ0aW5nIGZyb20gdGhlIHBvc2l0aXZlIFggYXhpcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFTdGFydEFuZ2xlID0gYVN0YXJ0QW5nbGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZW5kIGFuZ2xlIG9mIHRoZSBjdXJ2ZSBpbiByYWRpYW5zIHN0YXJ0aW5nIGZyb20gdGhlIHBvc2l0aXZlIFggYXhpcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgTWF0aC5QSSoyXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYUVuZEFuZ2xlID0gYUVuZEFuZ2xlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgZWxsaXBzZSBpcyBkcmF3biBjbG9ja3dpc2Ugb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hQ2xvY2t3aXNlID0gYUNsb2Nrd2lzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByb3RhdGlvbiBhbmdsZSBvZiB0aGUgZWxsaXBzZSBpbiByYWRpYW5zLCBjb3VudGVyY2xvY2t3aXNlIGZyb20gdGhlIHBvc2l0aXZlIFggYXhpcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFSb3RhdGlvbiA9IGFSb3RhdGlvbjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgcG9pbnQgb24gdGhlIGN1cnZlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHQgLSBBIGludGVycG9sYXRpb24gZmFjdG9yIHJlcHJlc2VudGluZyBhIHBvc2l0aW9uIG9uIHRoZSBjdXJ2ZS4gTXVzdCBiZSBpbiB0aGUgcmFuZ2UgYFswLDFdYC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IFtvcHRpb25hbFRhcmdldF0gLSBUaGUgb3B0aW9uYWwgdGFyZ2V0IHZlY3RvciB0aGUgcmVzdWx0IGlzIHdyaXR0ZW4gdG8uXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gVGhlIHBvc2l0aW9uIG9uIHRoZSBjdXJ2ZS5cclxuXHQgKi9cclxuXHRnZXRQb2ludCggdCwgb3B0aW9uYWxUYXJnZXQgPSBuZXcgVmVjdG9yMigpICkge1xyXG5cclxuXHRcdGNvbnN0IHBvaW50ID0gb3B0aW9uYWxUYXJnZXQ7XHJcblxyXG5cdFx0Y29uc3QgdHdvUGkgPSBNYXRoLlBJICogMjtcclxuXHRcdGxldCBkZWx0YUFuZ2xlID0gdGhpcy5hRW5kQW5nbGUgLSB0aGlzLmFTdGFydEFuZ2xlO1xyXG5cdFx0Y29uc3Qgc2FtZVBvaW50cyA9IE1hdGguYWJzKCBkZWx0YUFuZ2xlICkgPCBOdW1iZXIuRVBTSUxPTjtcclxuXHJcblx0XHQvLyBlbnN1cmVzIHRoYXQgZGVsdGFBbmdsZSBpcyAwIC4uIDIgUElcclxuXHRcdHdoaWxlICggZGVsdGFBbmdsZSA8IDAgKSBkZWx0YUFuZ2xlICs9IHR3b1BpO1xyXG5cdFx0d2hpbGUgKCBkZWx0YUFuZ2xlID4gdHdvUGkgKSBkZWx0YUFuZ2xlIC09IHR3b1BpO1xyXG5cclxuXHRcdGlmICggZGVsdGFBbmdsZSA8IE51bWJlci5FUFNJTE9OICkge1xyXG5cclxuXHRcdFx0aWYgKCBzYW1lUG9pbnRzICkge1xyXG5cclxuXHRcdFx0XHRkZWx0YUFuZ2xlID0gMDtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGRlbHRhQW5nbGUgPSB0d29QaTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aGlzLmFDbG9ja3dpc2UgPT09IHRydWUgJiYgISBzYW1lUG9pbnRzICkge1xyXG5cclxuXHRcdFx0aWYgKCBkZWx0YUFuZ2xlID09PSB0d29QaSApIHtcclxuXHJcblx0XHRcdFx0ZGVsdGFBbmdsZSA9IC0gdHdvUGk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRkZWx0YUFuZ2xlID0gZGVsdGFBbmdsZSAtIHR3b1BpO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBhbmdsZSA9IHRoaXMuYVN0YXJ0QW5nbGUgKyB0ICogZGVsdGFBbmdsZTtcclxuXHRcdGxldCB4ID0gdGhpcy5hWCArIHRoaXMueFJhZGl1cyAqIE1hdGguY29zKCBhbmdsZSApO1xyXG5cdFx0bGV0IHkgPSB0aGlzLmFZICsgdGhpcy55UmFkaXVzICogTWF0aC5zaW4oIGFuZ2xlICk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmFSb3RhdGlvbiAhPT0gMCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGNvcyA9IE1hdGguY29zKCB0aGlzLmFSb3RhdGlvbiApO1xyXG5cdFx0XHRjb25zdCBzaW4gPSBNYXRoLnNpbiggdGhpcy5hUm90YXRpb24gKTtcclxuXHJcblx0XHRcdGNvbnN0IHR4ID0geCAtIHRoaXMuYVg7XHJcblx0XHRcdGNvbnN0IHR5ID0geSAtIHRoaXMuYVk7XHJcblxyXG5cdFx0XHQvLyBSb3RhdGUgdGhlIHBvaW50IGFib3V0IHRoZSBjZW50ZXIgb2YgdGhlIGVsbGlwc2UuXHJcblx0XHRcdHggPSB0eCAqIGNvcyAtIHR5ICogc2luICsgdGhpcy5hWDtcclxuXHRcdFx0eSA9IHR4ICogc2luICsgdHkgKiBjb3MgKyB0aGlzLmFZO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcG9pbnQuc2V0KCB4LCB5ICk7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMuYVggPSBzb3VyY2UuYVg7XHJcblx0XHR0aGlzLmFZID0gc291cmNlLmFZO1xyXG5cclxuXHRcdHRoaXMueFJhZGl1cyA9IHNvdXJjZS54UmFkaXVzO1xyXG5cdFx0dGhpcy55UmFkaXVzID0gc291cmNlLnlSYWRpdXM7XHJcblxyXG5cdFx0dGhpcy5hU3RhcnRBbmdsZSA9IHNvdXJjZS5hU3RhcnRBbmdsZTtcclxuXHRcdHRoaXMuYUVuZEFuZ2xlID0gc291cmNlLmFFbmRBbmdsZTtcclxuXHJcblx0XHR0aGlzLmFDbG9ja3dpc2UgPSBzb3VyY2UuYUNsb2Nrd2lzZTtcclxuXHJcblx0XHR0aGlzLmFSb3RhdGlvbiA9IHNvdXJjZS5hUm90YXRpb247XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0dG9KU09OKCkge1xyXG5cclxuXHRcdGNvbnN0IGRhdGEgPSBzdXBlci50b0pTT04oKTtcclxuXHJcblx0XHRkYXRhLmFYID0gdGhpcy5hWDtcclxuXHRcdGRhdGEuYVkgPSB0aGlzLmFZO1xyXG5cclxuXHRcdGRhdGEueFJhZGl1cyA9IHRoaXMueFJhZGl1cztcclxuXHRcdGRhdGEueVJhZGl1cyA9IHRoaXMueVJhZGl1cztcclxuXHJcblx0XHRkYXRhLmFTdGFydEFuZ2xlID0gdGhpcy5hU3RhcnRBbmdsZTtcclxuXHRcdGRhdGEuYUVuZEFuZ2xlID0gdGhpcy5hRW5kQW5nbGU7XHJcblxyXG5cdFx0ZGF0YS5hQ2xvY2t3aXNlID0gdGhpcy5hQ2xvY2t3aXNlO1xyXG5cclxuXHRcdGRhdGEuYVJvdGF0aW9uID0gdGhpcy5hUm90YXRpb247XHJcblxyXG5cdFx0cmV0dXJuIGRhdGE7XHJcblxyXG5cdH1cclxuXHJcblx0ZnJvbUpTT04oIGpzb24gKSB7XHJcblxyXG5cdFx0c3VwZXIuZnJvbUpTT04oIGpzb24gKTtcclxuXHJcblx0XHR0aGlzLmFYID0ganNvbi5hWDtcclxuXHRcdHRoaXMuYVkgPSBqc29uLmFZO1xyXG5cclxuXHRcdHRoaXMueFJhZGl1cyA9IGpzb24ueFJhZGl1cztcclxuXHRcdHRoaXMueVJhZGl1cyA9IGpzb24ueVJhZGl1cztcclxuXHJcblx0XHR0aGlzLmFTdGFydEFuZ2xlID0ganNvbi5hU3RhcnRBbmdsZTtcclxuXHRcdHRoaXMuYUVuZEFuZ2xlID0ganNvbi5hRW5kQW5nbGU7XHJcblxyXG5cdFx0dGhpcy5hQ2xvY2t3aXNlID0ganNvbi5hQ2xvY2t3aXNlO1xyXG5cclxuXHRcdHRoaXMuYVJvdGF0aW9uID0ganNvbi5hUm90YXRpb247XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IEVsbGlwc2VDdXJ2ZSB9O1xyXG4iLCJpbXBvcnQgeyBFbGxpcHNlQ3VydmUgfSBmcm9tICcuL0VsbGlwc2VDdXJ2ZS5qcyc7XHJcblxyXG4vKipcclxuICogQSBjdXJ2ZSByZXByZXNlbnRpbmcgYW4gYXJjLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgRWxsaXBzZUN1cnZlXHJcbiAqL1xyXG5jbGFzcyBBcmNDdXJ2ZSBleHRlbmRzIEVsbGlwc2VDdXJ2ZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYXJjIGN1cnZlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFthWD0wXSAtIFRoZSBYIGNlbnRlciBvZiB0aGUgZWxsaXBzZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2FZPTBdIC0gVGhlIFkgY2VudGVyIG9mIHRoZSBlbGxpcHNlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbYVJhZGl1cz0xXSAtIFRoZSByYWRpdXMgb2YgdGhlIGVsbGlwc2UgaW4gdGhlIHggZGlyZWN0aW9uLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbYVN0YXJ0QW5nbGU9MF0gLSBUaGUgc3RhcnQgYW5nbGUgb2YgdGhlIGN1cnZlIGluIHJhZGlhbnMgc3RhcnRpbmcgZnJvbSB0aGUgcG9zaXRpdmUgWCBheGlzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbYUVuZEFuZ2xlPU1hdGguUEkqMl0gLSBUaGUgZW5kIGFuZ2xlIG9mIHRoZSBjdXJ2ZSBpbiByYWRpYW5zIHN0YXJ0aW5nIGZyb20gdGhlIHBvc2l0aXZlIFggYXhpcy5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFthQ2xvY2t3aXNlPWZhbHNlXSAtIFdoZXRoZXIgdGhlIGVsbGlwc2UgaXMgZHJhd24gY2xvY2t3aXNlIG9yIG5vdC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggYVgsIGFZLCBhUmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlICkge1xyXG5cclxuXHRcdHN1cGVyKCBhWCwgYVksIGFSYWRpdXMsIGFSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNBcmNDdXJ2ZSA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ0FyY0N1cnZlJztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgQXJjQ3VydmUgfTtcclxuIiwiaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcbmltcG9ydCB7IEN1cnZlIH0gZnJvbSAnLi4vY29yZS9DdXJ2ZS5qcyc7XHJcblxyXG5mdW5jdGlvbiBDdWJpY1BvbHkoKSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENlbnRyaXBldGFsIENhdG11bGxSb20gQ3VydmUgLSB3aGljaCBpcyB1c2VmdWwgZm9yIGF2b2lkaW5nXHJcblx0KiBjdXNwcyBhbmQgc2VsZi1pbnRlcnNlY3Rpb25zIGluIG5vbi11bmlmb3JtIGNhdG11bGwgcm9tIGN1cnZlcy5cclxuXHQqIGh0dHA6Ly93d3cuY2VteXVrc2VsLmNvbS9yZXNlYXJjaC9jYXRtdWxscm9tX3BhcmFtL2NhdG11bGxyb20ucGRmXHJcblx0KlxyXG5cdCogY3VydmUudHlwZSBhY2NlcHRzIGNlbnRyaXBldGFsKGRlZmF1bHQpLCBjaG9yZGFsIGFuZCBjYXRtdWxscm9tXHJcblx0KiBjdXJ2ZS50ZW5zaW9uIGlzIHVzZWQgZm9yIGNhdG11bGxyb20gd2hpY2ggZGVmYXVsdHMgdG8gMC41XHJcblx0Ki9cclxuXHJcblx0LypcclxuXHRCYXNlZCBvbiBhbiBvcHRpbWl6ZWQgYysrIHNvbHV0aW9uIGluXHJcblx0LSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzk0ODk3MzYvY2F0bXVsbC1yb20tY3VydmUtd2l0aC1uby1jdXNwcy1hbmQtbm8tc2VsZi1pbnRlcnNlY3Rpb25zL1xyXG5cdC0gaHR0cDovL2lkZW9uZS5jb20vTm9FYlZNXHJcblxyXG5cdFRoaXMgQ3ViaWNQb2x5IGNsYXNzIGNvdWxkIGJlIHVzZWQgZm9yIHJldXNpbmcgc29tZSB2YXJpYWJsZXMgYW5kIGNhbGN1bGF0aW9ucyxcclxuXHRidXQgZm9yIHRocmVlLmpzIGN1cnZlIHVzZSwgaXQgY291bGQgYmUgcG9zc2libGUgaW5saW5lZCBhbmQgZmxhdHRlbiBpbnRvIGEgc2luZ2xlIGZ1bmN0aW9uIGNhbGxcclxuXHR3aGljaCBjYW4gYmUgcGxhY2VkIGluIEN1cnZlVXRpbHMuXHJcblx0Ki9cclxuXHJcblx0bGV0IGMwID0gMCwgYzEgPSAwLCBjMiA9IDAsIGMzID0gMDtcclxuXHJcblx0LypcclxuXHQgKiBDb21wdXRlIGNvZWZmaWNpZW50cyBmb3IgYSBjdWJpYyBwb2x5bm9taWFsXHJcblx0ICogICBwKHMpID0gYzAgKyBjMSpzICsgYzIqc14yICsgYzMqc14zXHJcblx0ICogc3VjaCB0aGF0XHJcblx0ICogICBwKDApID0geDAsIHAoMSkgPSB4MVxyXG5cdCAqICBhbmRcclxuXHQgKiAgIHAnKDApID0gdDAsIHAnKDEpID0gdDEuXHJcblx0ICovXHJcblx0ZnVuY3Rpb24gaW5pdCggeDAsIHgxLCB0MCwgdDEgKSB7XHJcblxyXG5cdFx0YzAgPSB4MDtcclxuXHRcdGMxID0gdDA7XHJcblx0XHRjMiA9IC0gMyAqIHgwICsgMyAqIHgxIC0gMiAqIHQwIC0gdDE7XHJcblx0XHRjMyA9IDIgKiB4MCAtIDIgKiB4MSArIHQwICsgdDE7XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIHtcclxuXHJcblx0XHRpbml0Q2F0bXVsbFJvbTogZnVuY3Rpb24gKCB4MCwgeDEsIHgyLCB4MywgdGVuc2lvbiApIHtcclxuXHJcblx0XHRcdGluaXQoIHgxLCB4MiwgdGVuc2lvbiAqICggeDIgLSB4MCApLCB0ZW5zaW9uICogKCB4MyAtIHgxICkgKTtcclxuXHJcblx0XHR9LFxyXG5cclxuXHRcdGluaXROb251bmlmb3JtQ2F0bXVsbFJvbTogZnVuY3Rpb24gKCB4MCwgeDEsIHgyLCB4MywgZHQwLCBkdDEsIGR0MiApIHtcclxuXHJcblx0XHRcdC8vIGNvbXB1dGUgdGFuZ2VudHMgd2hlbiBwYXJhbWV0ZXJpemVkIGluIFt0MSx0Ml1cclxuXHRcdFx0bGV0IHQxID0gKCB4MSAtIHgwICkgLyBkdDAgLSAoIHgyIC0geDAgKSAvICggZHQwICsgZHQxICkgKyAoIHgyIC0geDEgKSAvIGR0MTtcclxuXHRcdFx0bGV0IHQyID0gKCB4MiAtIHgxICkgLyBkdDEgLSAoIHgzIC0geDEgKSAvICggZHQxICsgZHQyICkgKyAoIHgzIC0geDIgKSAvIGR0MjtcclxuXHJcblx0XHRcdC8vIHJlc2NhbGUgdGFuZ2VudHMgZm9yIHBhcmFtZXRyaXphdGlvbiBpbiBbMCwxXVxyXG5cdFx0XHR0MSAqPSBkdDE7XHJcblx0XHRcdHQyICo9IGR0MTtcclxuXHJcblx0XHRcdGluaXQoIHgxLCB4MiwgdDEsIHQyICk7XHJcblxyXG5cdFx0fSxcclxuXHJcblx0XHRjYWxjOiBmdW5jdGlvbiAoIHQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB0MiA9IHQgKiB0O1xyXG5cdFx0XHRjb25zdCB0MyA9IHQyICogdDtcclxuXHRcdFx0cmV0dXJuIGMwICsgYzEgKiB0ICsgYzIgKiB0MiArIGMzICogdDM7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9O1xyXG5cclxufVxyXG5cclxuLy9cclxuXHJcbmNvbnN0IHRtcCA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgcHggPSAvKkBfX1BVUkVfXyovIG5ldyBDdWJpY1BvbHkoKTtcclxuY29uc3QgcHkgPSAvKkBfX1BVUkVfXyovIG5ldyBDdWJpY1BvbHkoKTtcclxuY29uc3QgcHogPSAvKkBfX1BVUkVfXyovIG5ldyBDdWJpY1BvbHkoKTtcclxuXHJcbi8qKlxyXG4gKiBBIGN1cnZlIHJlcHJlc2VudGluZyBhIENhdG11bGwtUm9tIHNwbGluZS5cclxuICpcclxuICogYGBganNcclxuICogLy9DcmVhdGUgYSBjbG9zZWQgd2F2ZXkgbG9vcFxyXG4gKiBjb25zdCBjdXJ2ZSA9IG5ldyBUSFJFRS5DYXRtdWxsUm9tQ3VydmUzKCBbXHJcbiAqIFx0bmV3IFRIUkVFLlZlY3RvcjMoIC0xMCwgMCwgMTAgKSxcclxuICogXHRuZXcgVEhSRUUuVmVjdG9yMyggLTUsIDUsIDUgKSxcclxuICogXHRuZXcgVEhSRUUuVmVjdG9yMyggMCwgMCwgMCApLFxyXG4gKiBcdG5ldyBUSFJFRS5WZWN0b3IzKCA1LCAtNSwgNSApLFxyXG4gKiBcdG5ldyBUSFJFRS5WZWN0b3IzKCAxMCwgMCwgMTAgKVxyXG4gKiBdICk7XHJcbiAqXHJcbiAqIGNvbnN0IHBvaW50cyA9IGN1cnZlLmdldFBvaW50cyggNTAgKTtcclxuICogY29uc3QgZ2VvbWV0cnkgPSBuZXcgVEhSRUUuQnVmZmVyR2VvbWV0cnkoKS5zZXRGcm9tUG9pbnRzKCBwb2ludHMgKTtcclxuICpcclxuICogY29uc3QgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IDB4ZmYwMDAwIH0gKTtcclxuICpcclxuICogLy8gQ3JlYXRlIHRoZSBmaW5hbCBvYmplY3QgdG8gYWRkIHRvIHRoZSBzY2VuZVxyXG4gKiBjb25zdCBjdXJ2ZU9iamVjdCA9IG5ldyBUSFJFRS5MaW5lKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBDdXJ2ZVxyXG4gKi9cclxuY2xhc3MgQ2F0bXVsbFJvbUN1cnZlMyBleHRlbmRzIEN1cnZlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBDYXRtdWxsLVJvbSBjdXJ2ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8VmVjdG9yMz59IFtwb2ludHNdIC0gQW4gYXJyYXkgb2YgM0QgcG9pbnRzIGRlZmluaW5nIHRoZSBjdXJ2ZS5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtjbG9zZWQ9ZmFsc2VdIC0gV2hldGhlciB0aGUgY3VydmUgaXMgY2xvc2VkIG9yIG5vdC5cclxuXHQgKiBAcGFyYW0geygnY2VudHJpcGV0YWwnfCdjaG9yZGFsJ3wnY2F0bXVsbHJvbScpfSBbY3VydmVUeXBlPSdjZW50cmlwZXRhbCddIC0gVGhlIGN1cnZlIHR5cGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt0ZW5zaW9uPTAuNV0gLSBUZW5zaW9uIG9mIHRoZSBjdXJ2ZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcG9pbnRzID0gW10sIGNsb3NlZCA9IGZhbHNlLCBjdXJ2ZVR5cGUgPSAnY2VudHJpcGV0YWwnLCB0ZW5zaW9uID0gMC41ICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzQ2F0bXVsbFJvbUN1cnZlMyA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ0NhdG11bGxSb21DdXJ2ZTMnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQW4gYXJyYXkgb2YgM0QgcG9pbnRzIGRlZmluaW5nIHRoZSBjdXJ2ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8VmVjdG9yMz59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucG9pbnRzID0gcG9pbnRzO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgY3VydmUgaXMgY2xvc2VkIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2xvc2VkID0gY2xvc2VkO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGN1cnZlIHR5cGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeygnY2VudHJpcGV0YWwnfCdjaG9yZGFsJ3wnY2F0bXVsbHJvbScpfVxyXG5cdFx0ICogQGRlZmF1bHQgJ2NlbnRyaXBldGFsJ1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLmN1cnZlVHlwZSA9IGN1cnZlVHlwZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRlbnNpb24gb2YgdGhlIGN1cnZlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwLjVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50ZW5zaW9uID0gdGVuc2lvbjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgcG9pbnQgb24gdGhlIGN1cnZlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHQgLSBBIGludGVycG9sYXRpb24gZmFjdG9yIHJlcHJlc2VudGluZyBhIHBvc2l0aW9uIG9uIHRoZSBjdXJ2ZS4gTXVzdCBiZSBpbiB0aGUgcmFuZ2UgYFswLDFdYC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IFtvcHRpb25hbFRhcmdldF0gLSBUaGUgb3B0aW9uYWwgdGFyZ2V0IHZlY3RvciB0aGUgcmVzdWx0IGlzIHdyaXR0ZW4gdG8uXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gVGhlIHBvc2l0aW9uIG9uIHRoZSBjdXJ2ZS5cclxuXHQgKi9cclxuXHRnZXRQb2ludCggdCwgb3B0aW9uYWxUYXJnZXQgPSBuZXcgVmVjdG9yMygpICkge1xyXG5cclxuXHRcdGNvbnN0IHBvaW50ID0gb3B0aW9uYWxUYXJnZXQ7XHJcblxyXG5cdFx0Y29uc3QgcG9pbnRzID0gdGhpcy5wb2ludHM7XHJcblx0XHRjb25zdCBsID0gcG9pbnRzLmxlbmd0aDtcclxuXHJcblx0XHRjb25zdCBwID0gKCBsIC0gKCB0aGlzLmNsb3NlZCA/IDAgOiAxICkgKSAqIHQ7XHJcblx0XHRsZXQgaW50UG9pbnQgPSBNYXRoLmZsb29yKCBwICk7XHJcblx0XHRsZXQgd2VpZ2h0ID0gcCAtIGludFBvaW50O1xyXG5cclxuXHRcdGlmICggdGhpcy5jbG9zZWQgKSB7XHJcblxyXG5cdFx0XHRpbnRQb2ludCArPSBpbnRQb2ludCA+IDAgPyAwIDogKCBNYXRoLmZsb29yKCBNYXRoLmFicyggaW50UG9pbnQgKSAvIGwgKSArIDEgKSAqIGw7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggd2VpZ2h0ID09PSAwICYmIGludFBvaW50ID09PSBsIC0gMSApIHtcclxuXHJcblx0XHRcdGludFBvaW50ID0gbCAtIDI7XHJcblx0XHRcdHdlaWdodCA9IDE7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGxldCBwMCwgcDM7IC8vIDQgcG9pbnRzIChwMSAmIHAyIGRlZmluZWQgYmVsb3cpXHJcblxyXG5cdFx0aWYgKCB0aGlzLmNsb3NlZCB8fCBpbnRQb2ludCA+IDAgKSB7XHJcblxyXG5cdFx0XHRwMCA9IHBvaW50c1sgKCBpbnRQb2ludCAtIDEgKSAlIGwgXTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Ly8gZXh0cmFwb2xhdGUgZmlyc3QgcG9pbnRcclxuXHRcdFx0dG1wLnN1YlZlY3RvcnMoIHBvaW50c1sgMCBdLCBwb2ludHNbIDEgXSApLmFkZCggcG9pbnRzWyAwIF0gKTtcclxuXHRcdFx0cDAgPSB0bXA7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHAxID0gcG9pbnRzWyBpbnRQb2ludCAlIGwgXTtcclxuXHRcdGNvbnN0IHAyID0gcG9pbnRzWyAoIGludFBvaW50ICsgMSApICUgbCBdO1xyXG5cclxuXHRcdGlmICggdGhpcy5jbG9zZWQgfHwgaW50UG9pbnQgKyAyIDwgbCApIHtcclxuXHJcblx0XHRcdHAzID0gcG9pbnRzWyAoIGludFBvaW50ICsgMiApICUgbCBdO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHQvLyBleHRyYXBvbGF0ZSBsYXN0IHBvaW50XHJcblx0XHRcdHRtcC5zdWJWZWN0b3JzKCBwb2ludHNbIGwgLSAxIF0sIHBvaW50c1sgbCAtIDIgXSApLmFkZCggcG9pbnRzWyBsIC0gMSBdICk7XHJcblx0XHRcdHAzID0gdG1wO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMuY3VydmVUeXBlID09PSAnY2VudHJpcGV0YWwnIHx8IHRoaXMuY3VydmVUeXBlID09PSAnY2hvcmRhbCcgKSB7XHJcblxyXG5cdFx0XHQvLyBpbml0IENlbnRyaXBldGFsIC8gQ2hvcmRhbCBDYXRtdWxsLVJvbVxyXG5cdFx0XHRjb25zdCBwb3cgPSB0aGlzLmN1cnZlVHlwZSA9PT0gJ2Nob3JkYWwnID8gMC41IDogMC4yNTtcclxuXHRcdFx0bGV0IGR0MCA9IE1hdGgucG93KCBwMC5kaXN0YW5jZVRvU3F1YXJlZCggcDEgKSwgcG93ICk7XHJcblx0XHRcdGxldCBkdDEgPSBNYXRoLnBvdyggcDEuZGlzdGFuY2VUb1NxdWFyZWQoIHAyICksIHBvdyApO1xyXG5cdFx0XHRsZXQgZHQyID0gTWF0aC5wb3coIHAyLmRpc3RhbmNlVG9TcXVhcmVkKCBwMyApLCBwb3cgKTtcclxuXHJcblx0XHRcdC8vIHNhZmV0eSBjaGVjayBmb3IgcmVwZWF0ZWQgcG9pbnRzXHJcblx0XHRcdGlmICggZHQxIDwgMWUtNCApIGR0MSA9IDEuMDtcclxuXHRcdFx0aWYgKCBkdDAgPCAxZS00ICkgZHQwID0gZHQxO1xyXG5cdFx0XHRpZiAoIGR0MiA8IDFlLTQgKSBkdDIgPSBkdDE7XHJcblxyXG5cdFx0XHRweC5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20oIHAwLngsIHAxLngsIHAyLngsIHAzLngsIGR0MCwgZHQxLCBkdDIgKTtcclxuXHRcdFx0cHkuaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tKCBwMC55LCBwMS55LCBwMi55LCBwMy55LCBkdDAsIGR0MSwgZHQyICk7XHJcblx0XHRcdHB6LmluaXROb251bmlmb3JtQ2F0bXVsbFJvbSggcDAueiwgcDEueiwgcDIueiwgcDMueiwgZHQwLCBkdDEsIGR0MiApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHRoaXMuY3VydmVUeXBlID09PSAnY2F0bXVsbHJvbScgKSB7XHJcblxyXG5cdFx0XHRweC5pbml0Q2F0bXVsbFJvbSggcDAueCwgcDEueCwgcDIueCwgcDMueCwgdGhpcy50ZW5zaW9uICk7XHJcblx0XHRcdHB5LmluaXRDYXRtdWxsUm9tKCBwMC55LCBwMS55LCBwMi55LCBwMy55LCB0aGlzLnRlbnNpb24gKTtcclxuXHRcdFx0cHouaW5pdENhdG11bGxSb20oIHAwLnosIHAxLnosIHAyLnosIHAzLnosIHRoaXMudGVuc2lvbiApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRwb2ludC5zZXQoXHJcblx0XHRcdHB4LmNhbGMoIHdlaWdodCApLFxyXG5cdFx0XHRweS5jYWxjKCB3ZWlnaHQgKSxcclxuXHRcdFx0cHouY2FsYyggd2VpZ2h0IClcclxuXHRcdCk7XHJcblxyXG5cdFx0cmV0dXJuIHBvaW50O1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLnBvaW50cyA9IFtdO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHNvdXJjZS5wb2ludHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHBvaW50ID0gc291cmNlLnBvaW50c1sgaSBdO1xyXG5cclxuXHRcdFx0dGhpcy5wb2ludHMucHVzaCggcG9pbnQuY2xvbmUoKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmNsb3NlZCA9IHNvdXJjZS5jbG9zZWQ7XHJcblx0XHR0aGlzLmN1cnZlVHlwZSA9IHNvdXJjZS5jdXJ2ZVR5cGU7XHJcblx0XHR0aGlzLnRlbnNpb24gPSBzb3VyY2UudGVuc2lvbjtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHR0b0pTT04oKSB7XHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IHN1cGVyLnRvSlNPTigpO1xyXG5cclxuXHRcdGRhdGEucG9pbnRzID0gW107XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gdGhpcy5wb2ludHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHBvaW50ID0gdGhpcy5wb2ludHNbIGkgXTtcclxuXHRcdFx0ZGF0YS5wb2ludHMucHVzaCggcG9pbnQudG9BcnJheSgpICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGRhdGEuY2xvc2VkID0gdGhpcy5jbG9zZWQ7XHJcblx0XHRkYXRhLmN1cnZlVHlwZSA9IHRoaXMuY3VydmVUeXBlO1xyXG5cdFx0ZGF0YS50ZW5zaW9uID0gdGhpcy50ZW5zaW9uO1xyXG5cclxuXHRcdHJldHVybiBkYXRhO1xyXG5cclxuXHR9XHJcblxyXG5cdGZyb21KU09OKCBqc29uICkge1xyXG5cclxuXHRcdHN1cGVyLmZyb21KU09OKCBqc29uICk7XHJcblxyXG5cdFx0dGhpcy5wb2ludHMgPSBbXTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBqc29uLnBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgcG9pbnQgPSBqc29uLnBvaW50c1sgaSBdO1xyXG5cdFx0XHR0aGlzLnBvaW50cy5wdXNoKCBuZXcgVmVjdG9yMygpLmZyb21BcnJheSggcG9pbnQgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmNsb3NlZCA9IGpzb24uY2xvc2VkO1xyXG5cdFx0dGhpcy5jdXJ2ZVR5cGUgPSBqc29uLmN1cnZlVHlwZTtcclxuXHRcdHRoaXMudGVuc2lvbiA9IGpzb24udGVuc2lvbjtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgQ2F0bXVsbFJvbUN1cnZlMyB9O1xyXG4iLCIvLyBCZXppZXIgQ3VydmVzIGZvcm11bGFzIG9idGFpbmVkIGZyb206IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0IlQzMlQTl6aWVyX2N1cnZlXHJcblxyXG4vKipcclxuICogQ29tcHV0ZXMgYSBwb2ludCBvbiBhIENhdG11bGwtUm9tIHNwbGluZS5cclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHQgLSBUaGUgaW50ZXJwb2xhdGlvbiBmYWN0b3IuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBwMCAtIFRoZSBmaXJzdCBjb250cm9sIHBvaW50LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gcDEgLSBUaGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBwMiAtIFRoZSB0aGlyZCBjb250cm9sIHBvaW50LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gcDMgLSBUaGUgZm91cnRoIGNvbnRyb2wgcG9pbnQuXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGNhbGN1bGF0ZWQgcG9pbnQgb24gYSBDYXRtdWxsLVJvbSBzcGxpbmUuXHJcbiAqL1xyXG5mdW5jdGlvbiBDYXRtdWxsUm9tKCB0LCBwMCwgcDEsIHAyLCBwMyApIHtcclxuXHJcblx0Y29uc3QgdjAgPSAoIHAyIC0gcDAgKSAqIDAuNTtcclxuXHRjb25zdCB2MSA9ICggcDMgLSBwMSApICogMC41O1xyXG5cdGNvbnN0IHQyID0gdCAqIHQ7XHJcblx0Y29uc3QgdDMgPSB0ICogdDI7XHJcblx0cmV0dXJuICggMiAqIHAxIC0gMiAqIHAyICsgdjAgKyB2MSApICogdDMgKyAoIC0gMyAqIHAxICsgMyAqIHAyIC0gMiAqIHYwIC0gdjEgKSAqIHQyICsgdjAgKiB0ICsgcDE7XHJcblxyXG59XHJcblxyXG4vL1xyXG5cclxuZnVuY3Rpb24gUXVhZHJhdGljQmV6aWVyUDAoIHQsIHAgKSB7XHJcblxyXG5cdGNvbnN0IGsgPSAxIC0gdDtcclxuXHRyZXR1cm4gayAqIGsgKiBwO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gUXVhZHJhdGljQmV6aWVyUDEoIHQsIHAgKSB7XHJcblxyXG5cdHJldHVybiAyICogKCAxIC0gdCApICogdCAqIHA7XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBRdWFkcmF0aWNCZXppZXJQMiggdCwgcCApIHtcclxuXHJcblx0cmV0dXJuIHQgKiB0ICogcDtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb21wdXRlcyBhIHBvaW50IG9uIGEgUXVhZHJhdGljIEJlemllciBjdXJ2ZS5cclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHQgLSBUaGUgaW50ZXJwb2xhdGlvbiBmYWN0b3IuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBwMCAtIFRoZSBmaXJzdCBjb250cm9sIHBvaW50LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gcDEgLSBUaGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBwMiAtIFRoZSB0aGlyZCBjb250cm9sIHBvaW50LlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBjYWxjdWxhdGVkIHBvaW50IG9uIGEgUXVhZHJhdGljIEJlemllciBjdXJ2ZS5cclxuICovXHJcbmZ1bmN0aW9uIFF1YWRyYXRpY0JlemllciggdCwgcDAsIHAxLCBwMiApIHtcclxuXHJcblx0cmV0dXJuIFF1YWRyYXRpY0JlemllclAwKCB0LCBwMCApICsgUXVhZHJhdGljQmV6aWVyUDEoIHQsIHAxICkgK1xyXG5cdFx0UXVhZHJhdGljQmV6aWVyUDIoIHQsIHAyICk7XHJcblxyXG59XHJcblxyXG4vL1xyXG5cclxuZnVuY3Rpb24gQ3ViaWNCZXppZXJQMCggdCwgcCApIHtcclxuXHJcblx0Y29uc3QgayA9IDEgLSB0O1xyXG5cdHJldHVybiBrICogayAqIGsgKiBwO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gQ3ViaWNCZXppZXJQMSggdCwgcCApIHtcclxuXHJcblx0Y29uc3QgayA9IDEgLSB0O1xyXG5cdHJldHVybiAzICogayAqIGsgKiB0ICogcDtcclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIEN1YmljQmV6aWVyUDIoIHQsIHAgKSB7XHJcblxyXG5cdHJldHVybiAzICogKCAxIC0gdCApICogdCAqIHQgKiBwO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gQ3ViaWNCZXppZXJQMyggdCwgcCApIHtcclxuXHJcblx0cmV0dXJuIHQgKiB0ICogdCAqIHA7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQ29tcHV0ZXMgYSBwb2ludCBvbiBhIEN1YmljIEJlemllciBjdXJ2ZS5cclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHQgLSBUaGUgaW50ZXJwb2xhdGlvbiBmYWN0b3IuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBwMCAtIFRoZSBmaXJzdCBjb250cm9sIHBvaW50LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gcDEgLSBUaGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBwMiAtIFRoZSB0aGlyZCBjb250cm9sIHBvaW50LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gcDMgLSBUaGUgZm91cnRoIGNvbnRyb2wgcG9pbnQuXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGNhbGN1bGF0ZWQgcG9pbnQgb24gYSBDdWJpYyBCZXppZXIgY3VydmUuXHJcbiAqL1xyXG5mdW5jdGlvbiBDdWJpY0JlemllciggdCwgcDAsIHAxLCBwMiwgcDMgKSB7XHJcblxyXG5cdHJldHVybiBDdWJpY0JlemllclAwKCB0LCBwMCApICsgQ3ViaWNCZXppZXJQMSggdCwgcDEgKSArIEN1YmljQmV6aWVyUDIoIHQsIHAyICkgK1xyXG5cdFx0Q3ViaWNCZXppZXJQMyggdCwgcDMgKTtcclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IENhdG11bGxSb20sIFF1YWRyYXRpY0JlemllciwgQ3ViaWNCZXppZXIgfTtcclxuIiwiaW1wb3J0IHsgQ3VydmUgfSBmcm9tICcuLi9jb3JlL0N1cnZlLmpzJztcclxuaW1wb3J0IHsgQ3ViaWNCZXppZXIgfSBmcm9tICcuLi9jb3JlL0ludGVycG9sYXRpb25zLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMi5qcyc7XHJcblxyXG4vKipcclxuICogQSBjdXJ2ZSByZXByZXNlbnRpbmcgYSAyRCBDdWJpYyBCZXppZXIgY3VydmUuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGN1cnZlID0gbmV3IFRIUkVFLkN1YmljQmV6aWVyQ3VydmUoXHJcbiAqIFx0bmV3IFRIUkVFLlZlY3RvcjIoIC0gMCwgMCApLFxyXG4gKiBcdG5ldyBUSFJFRS5WZWN0b3IyKCAtIDUsIDE1ICksXHJcbiAqIFx0bmV3IFRIUkVFLlZlY3RvcjIoIDIwLCAxNSApLFxyXG4gKiBcdG5ldyBUSFJFRS5WZWN0b3IyKCAxMCwgMCApXHJcbiAqICk7XHJcbiAqXHJcbiAqIGNvbnN0IHBvaW50cyA9IGN1cnZlLmdldFBvaW50cyggNTAgKTtcclxuICogY29uc3QgZ2VvbWV0cnkgPSBuZXcgVEhSRUUuQnVmZmVyR2VvbWV0cnkoKS5zZXRGcm9tUG9pbnRzKCBwb2ludHMgKTtcclxuICpcclxuICogY29uc3QgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IDB4ZmYwMDAwIH0gKTtcclxuICpcclxuICogLy8gQ3JlYXRlIHRoZSBmaW5hbCBvYmplY3QgdG8gYWRkIHRvIHRoZSBzY2VuZVxyXG4gKiBjb25zdCBjdXJ2ZU9iamVjdCA9IG5ldyBUSFJFRS5MaW5lKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBDdXJ2ZVxyXG4gKi9cclxuY2xhc3MgQ3ViaWNCZXppZXJDdXJ2ZSBleHRlbmRzIEN1cnZlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBDdWJpYyBCZXppZXIgY3VydmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IFt2MF0gLSBUaGUgc3RhcnQgcG9pbnQuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSBbdjFdIC0gVGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSBbdjJdIC0gVGhlIHNlY29uZCBjb250cm9sIHBvaW50LlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gW3YzXSAtIFRoZSBlbmQgcG9pbnQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHYwID0gbmV3IFZlY3RvcjIoKSwgdjEgPSBuZXcgVmVjdG9yMigpLCB2MiA9IG5ldyBWZWN0b3IyKCksIHYzID0gbmV3IFZlY3RvcjIoKSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0N1YmljQmV6aWVyQ3VydmUgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdDdWJpY0JlemllckN1cnZlJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBzdGFydCBwb2ludC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yMn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52MCA9IHYwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudjEgPSB2MTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBzZWNvbmQgY29udHJvbCBwb2ludC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yMn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52MiA9IHYyO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGVuZCBwb2ludC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yMn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52MyA9IHYzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBwb2ludCBvbiB0aGUgY3VydmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdCAtIEEgaW50ZXJwb2xhdGlvbiBmYWN0b3IgcmVwcmVzZW50aW5nIGEgcG9zaXRpb24gb24gdGhlIGN1cnZlLiBNdXN0IGJlIGluIHRoZSByYW5nZSBgWzAsMV1gLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gW29wdGlvbmFsVGFyZ2V0XSAtIFRoZSBvcHRpb25hbCB0YXJnZXQgdmVjdG9yIHRoZSByZXN1bHQgaXMgd3JpdHRlbiB0by5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBUaGUgcG9zaXRpb24gb24gdGhlIGN1cnZlLlxyXG5cdCAqL1xyXG5cdGdldFBvaW50KCB0LCBvcHRpb25hbFRhcmdldCA9IG5ldyBWZWN0b3IyKCkgKSB7XHJcblxyXG5cdFx0Y29uc3QgcG9pbnQgPSBvcHRpb25hbFRhcmdldDtcclxuXHJcblx0XHRjb25zdCB2MCA9IHRoaXMudjAsIHYxID0gdGhpcy52MSwgdjIgPSB0aGlzLnYyLCB2MyA9IHRoaXMudjM7XHJcblxyXG5cdFx0cG9pbnQuc2V0KFxyXG5cdFx0XHRDdWJpY0JlemllciggdCwgdjAueCwgdjEueCwgdjIueCwgdjMueCApLFxyXG5cdFx0XHRDdWJpY0JlemllciggdCwgdjAueSwgdjEueSwgdjIueSwgdjMueSApXHJcblx0XHQpO1xyXG5cclxuXHRcdHJldHVybiBwb2ludDtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy52MC5jb3B5KCBzb3VyY2UudjAgKTtcclxuXHRcdHRoaXMudjEuY29weSggc291cmNlLnYxICk7XHJcblx0XHR0aGlzLnYyLmNvcHkoIHNvdXJjZS52MiApO1xyXG5cdFx0dGhpcy52My5jb3B5KCBzb3VyY2UudjMgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHR0b0pTT04oKSB7XHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IHN1cGVyLnRvSlNPTigpO1xyXG5cclxuXHRcdGRhdGEudjAgPSB0aGlzLnYwLnRvQXJyYXkoKTtcclxuXHRcdGRhdGEudjEgPSB0aGlzLnYxLnRvQXJyYXkoKTtcclxuXHRcdGRhdGEudjIgPSB0aGlzLnYyLnRvQXJyYXkoKTtcclxuXHRcdGRhdGEudjMgPSB0aGlzLnYzLnRvQXJyYXkoKTtcclxuXHJcblx0XHRyZXR1cm4gZGF0YTtcclxuXHJcblx0fVxyXG5cclxuXHRmcm9tSlNPTigganNvbiApIHtcclxuXHJcblx0XHRzdXBlci5mcm9tSlNPTigganNvbiApO1xyXG5cclxuXHRcdHRoaXMudjAuZnJvbUFycmF5KCBqc29uLnYwICk7XHJcblx0XHR0aGlzLnYxLmZyb21BcnJheSgganNvbi52MSApO1xyXG5cdFx0dGhpcy52Mi5mcm9tQXJyYXkoIGpzb24udjIgKTtcclxuXHRcdHRoaXMudjMuZnJvbUFycmF5KCBqc29uLnYzICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IEN1YmljQmV6aWVyQ3VydmUgfTtcclxuIiwiaW1wb3J0IHsgQ3VydmUgfSBmcm9tICcuLi9jb3JlL0N1cnZlLmpzJztcclxuaW1wb3J0IHsgQ3ViaWNCZXppZXIgfSBmcm9tICcuLi9jb3JlL0ludGVycG9sYXRpb25zLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcblxyXG4vKipcclxuICogQSBjdXJ2ZSByZXByZXNlbnRpbmcgYSAzRCBDdWJpYyBCZXppZXIgY3VydmUuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBDdXJ2ZVxyXG4gKi9cclxuY2xhc3MgQ3ViaWNCZXppZXJDdXJ2ZTMgZXh0ZW5kcyBDdXJ2ZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgQ3ViaWMgQmV6aWVyIGN1cnZlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBbdjBdIC0gVGhlIHN0YXJ0IHBvaW50LlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gW3YxXSAtIFRoZSBmaXJzdCBjb250cm9sIHBvaW50LlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gW3YyXSAtIFRoZSBzZWNvbmQgY29udHJvbCBwb2ludC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IFt2M10gLSBUaGUgZW5kIHBvaW50LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCB2MCA9IG5ldyBWZWN0b3IzKCksIHYxID0gbmV3IFZlY3RvcjMoKSwgdjIgPSBuZXcgVmVjdG9yMygpLCB2MyA9IG5ldyBWZWN0b3IzKCkgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNDdWJpY0JlemllckN1cnZlMyA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ0N1YmljQmV6aWVyQ3VydmUzJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBzdGFydCBwb2ludC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yM31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52MCA9IHYwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjN9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudjEgPSB2MTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBzZWNvbmQgY29udHJvbCBwb2ludC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yM31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52MiA9IHYyO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGVuZCBwb2ludC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yM31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52MyA9IHYzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBwb2ludCBvbiB0aGUgY3VydmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdCAtIEEgaW50ZXJwb2xhdGlvbiBmYWN0b3IgcmVwcmVzZW50aW5nIGEgcG9zaXRpb24gb24gdGhlIGN1cnZlLiBNdXN0IGJlIGluIHRoZSByYW5nZSBgWzAsMV1gLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gW29wdGlvbmFsVGFyZ2V0XSAtIFRoZSBvcHRpb25hbCB0YXJnZXQgdmVjdG9yIHRoZSByZXN1bHQgaXMgd3JpdHRlbiB0by5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBUaGUgcG9zaXRpb24gb24gdGhlIGN1cnZlLlxyXG5cdCAqL1xyXG5cdGdldFBvaW50KCB0LCBvcHRpb25hbFRhcmdldCA9IG5ldyBWZWN0b3IzKCkgKSB7XHJcblxyXG5cdFx0Y29uc3QgcG9pbnQgPSBvcHRpb25hbFRhcmdldDtcclxuXHJcblx0XHRjb25zdCB2MCA9IHRoaXMudjAsIHYxID0gdGhpcy52MSwgdjIgPSB0aGlzLnYyLCB2MyA9IHRoaXMudjM7XHJcblxyXG5cdFx0cG9pbnQuc2V0KFxyXG5cdFx0XHRDdWJpY0JlemllciggdCwgdjAueCwgdjEueCwgdjIueCwgdjMueCApLFxyXG5cdFx0XHRDdWJpY0JlemllciggdCwgdjAueSwgdjEueSwgdjIueSwgdjMueSApLFxyXG5cdFx0XHRDdWJpY0JlemllciggdCwgdjAueiwgdjEueiwgdjIueiwgdjMueiApXHJcblx0XHQpO1xyXG5cclxuXHRcdHJldHVybiBwb2ludDtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy52MC5jb3B5KCBzb3VyY2UudjAgKTtcclxuXHRcdHRoaXMudjEuY29weSggc291cmNlLnYxICk7XHJcblx0XHR0aGlzLnYyLmNvcHkoIHNvdXJjZS52MiApO1xyXG5cdFx0dGhpcy52My5jb3B5KCBzb3VyY2UudjMgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHR0b0pTT04oKSB7XHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IHN1cGVyLnRvSlNPTigpO1xyXG5cclxuXHRcdGRhdGEudjAgPSB0aGlzLnYwLnRvQXJyYXkoKTtcclxuXHRcdGRhdGEudjEgPSB0aGlzLnYxLnRvQXJyYXkoKTtcclxuXHRcdGRhdGEudjIgPSB0aGlzLnYyLnRvQXJyYXkoKTtcclxuXHRcdGRhdGEudjMgPSB0aGlzLnYzLnRvQXJyYXkoKTtcclxuXHJcblx0XHRyZXR1cm4gZGF0YTtcclxuXHJcblx0fVxyXG5cclxuXHRmcm9tSlNPTigganNvbiApIHtcclxuXHJcblx0XHRzdXBlci5mcm9tSlNPTigganNvbiApO1xyXG5cclxuXHRcdHRoaXMudjAuZnJvbUFycmF5KCBqc29uLnYwICk7XHJcblx0XHR0aGlzLnYxLmZyb21BcnJheSgganNvbi52MSApO1xyXG5cdFx0dGhpcy52Mi5mcm9tQXJyYXkoIGpzb24udjIgKTtcclxuXHRcdHRoaXMudjMuZnJvbUFycmF5KCBqc29uLnYzICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IEN1YmljQmV6aWVyQ3VydmUzIH07XHJcbiIsImltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjIuanMnO1xyXG5pbXBvcnQgeyBDdXJ2ZSB9IGZyb20gJy4uL2NvcmUvQ3VydmUuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgY3VydmUgcmVwcmVzZW50aW5nIGEgMkQgbGluZSBzZWdtZW50LlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQ3VydmVcclxuICovXHJcbmNsYXNzIExpbmVDdXJ2ZSBleHRlbmRzIEN1cnZlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBsaW5lIGN1cnZlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSBbdjFdIC0gVGhlIHN0YXJ0IHBvaW50LlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gW3YyXSAtIFRoZSBlbmQgcG9pbnQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHYxID0gbmV3IFZlY3RvcjIoKSwgdjIgPSBuZXcgVmVjdG9yMigpICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzTGluZUN1cnZlID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnTGluZUN1cnZlJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBzdGFydCBwb2ludC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yMn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52MSA9IHYxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGVuZCBwb2ludC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yMn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52MiA9IHYyO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBwb2ludCBvbiB0aGUgbGluZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0IC0gQSBpbnRlcnBvbGF0aW9uIGZhY3RvciByZXByZXNlbnRpbmcgYSBwb3NpdGlvbiBvbiB0aGUgbGluZS4gTXVzdCBiZSBpbiB0aGUgcmFuZ2UgYFswLDFdYC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IFtvcHRpb25hbFRhcmdldF0gLSBUaGUgb3B0aW9uYWwgdGFyZ2V0IHZlY3RvciB0aGUgcmVzdWx0IGlzIHdyaXR0ZW4gdG8uXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gVGhlIHBvc2l0aW9uIG9uIHRoZSBsaW5lLlxyXG5cdCAqL1xyXG5cdGdldFBvaW50KCB0LCBvcHRpb25hbFRhcmdldCA9IG5ldyBWZWN0b3IyKCkgKSB7XHJcblxyXG5cdFx0Y29uc3QgcG9pbnQgPSBvcHRpb25hbFRhcmdldDtcclxuXHJcblx0XHRpZiAoIHQgPT09IDEgKSB7XHJcblxyXG5cdFx0XHRwb2ludC5jb3B5KCB0aGlzLnYyICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHBvaW50LmNvcHkoIHRoaXMudjIgKS5zdWIoIHRoaXMudjEgKTtcclxuXHRcdFx0cG9pbnQubXVsdGlwbHlTY2FsYXIoIHQgKS5hZGQoIHRoaXMudjEgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHBvaW50O1xyXG5cclxuXHR9XHJcblxyXG5cdC8vIExpbmUgY3VydmUgaXMgbGluZWFyLCBzbyB3ZSBjYW4gb3ZlcndyaXRlIGRlZmF1bHQgZ2V0UG9pbnRBdFxyXG5cdGdldFBvaW50QXQoIHUsIG9wdGlvbmFsVGFyZ2V0ICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmdldFBvaW50KCB1LCBvcHRpb25hbFRhcmdldCApO1xyXG5cclxuXHR9XHJcblxyXG5cdGdldFRhbmdlbnQoIHQsIG9wdGlvbmFsVGFyZ2V0ID0gbmV3IFZlY3RvcjIoKSApIHtcclxuXHJcblx0XHRyZXR1cm4gb3B0aW9uYWxUYXJnZXQuc3ViVmVjdG9ycyggdGhpcy52MiwgdGhpcy52MSApLm5vcm1hbGl6ZSgpO1xyXG5cclxuXHR9XHJcblxyXG5cdGdldFRhbmdlbnRBdCggdSwgb3B0aW9uYWxUYXJnZXQgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZ2V0VGFuZ2VudCggdSwgb3B0aW9uYWxUYXJnZXQgKTtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy52MS5jb3B5KCBzb3VyY2UudjEgKTtcclxuXHRcdHRoaXMudjIuY29weSggc291cmNlLnYyICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0dG9KU09OKCkge1xyXG5cclxuXHRcdGNvbnN0IGRhdGEgPSBzdXBlci50b0pTT04oKTtcclxuXHJcblx0XHRkYXRhLnYxID0gdGhpcy52MS50b0FycmF5KCk7XHJcblx0XHRkYXRhLnYyID0gdGhpcy52Mi50b0FycmF5KCk7XHJcblxyXG5cdFx0cmV0dXJuIGRhdGE7XHJcblxyXG5cdH1cclxuXHJcblx0ZnJvbUpTT04oIGpzb24gKSB7XHJcblxyXG5cdFx0c3VwZXIuZnJvbUpTT04oIGpzb24gKTtcclxuXHJcblx0XHR0aGlzLnYxLmZyb21BcnJheSgganNvbi52MSApO1xyXG5cdFx0dGhpcy52Mi5mcm9tQXJyYXkoIGpzb24udjIgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgTGluZUN1cnZlIH07XHJcbiIsImltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBDdXJ2ZSB9IGZyb20gJy4uL2NvcmUvQ3VydmUuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgY3VydmUgcmVwcmVzZW50aW5nIGEgM0QgbGluZSBzZWdtZW50LlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQ3VydmVcclxuICovXHJcbmNsYXNzIExpbmVDdXJ2ZTMgZXh0ZW5kcyBDdXJ2ZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbGluZSBjdXJ2ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gW3YxXSAtIFRoZSBzdGFydCBwb2ludC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IFt2Ml0gLSBUaGUgZW5kIHBvaW50LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCB2MSA9IG5ldyBWZWN0b3IzKCksIHYyID0gbmV3IFZlY3RvcjMoKSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0xpbmVDdXJ2ZTMgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdMaW5lQ3VydmUzJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBzdGFydCBwb2ludC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yM31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52MSA9IHYxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGVuZCBwb2ludC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yMn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52MiA9IHYyO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBwb2ludCBvbiB0aGUgbGluZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0IC0gQSBpbnRlcnBvbGF0aW9uIGZhY3RvciByZXByZXNlbnRpbmcgYSBwb3NpdGlvbiBvbiB0aGUgbGluZS4gTXVzdCBiZSBpbiB0aGUgcmFuZ2UgYFswLDFdYC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IFtvcHRpb25hbFRhcmdldF0gLSBUaGUgb3B0aW9uYWwgdGFyZ2V0IHZlY3RvciB0aGUgcmVzdWx0IGlzIHdyaXR0ZW4gdG8uXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gVGhlIHBvc2l0aW9uIG9uIHRoZSBsaW5lLlxyXG5cdCAqL1xyXG5cdGdldFBvaW50KCB0LCBvcHRpb25hbFRhcmdldCA9IG5ldyBWZWN0b3IzKCkgKSB7XHJcblxyXG5cdFx0Y29uc3QgcG9pbnQgPSBvcHRpb25hbFRhcmdldDtcclxuXHJcblx0XHRpZiAoIHQgPT09IDEgKSB7XHJcblxyXG5cdFx0XHRwb2ludC5jb3B5KCB0aGlzLnYyICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHBvaW50LmNvcHkoIHRoaXMudjIgKS5zdWIoIHRoaXMudjEgKTtcclxuXHRcdFx0cG9pbnQubXVsdGlwbHlTY2FsYXIoIHQgKS5hZGQoIHRoaXMudjEgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHBvaW50O1xyXG5cclxuXHR9XHJcblxyXG5cdC8vIExpbmUgY3VydmUgaXMgbGluZWFyLCBzbyB3ZSBjYW4gb3ZlcndyaXRlIGRlZmF1bHQgZ2V0UG9pbnRBdFxyXG5cdGdldFBvaW50QXQoIHUsIG9wdGlvbmFsVGFyZ2V0ICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmdldFBvaW50KCB1LCBvcHRpb25hbFRhcmdldCApO1xyXG5cclxuXHR9XHJcblxyXG5cdGdldFRhbmdlbnQoIHQsIG9wdGlvbmFsVGFyZ2V0ID0gbmV3IFZlY3RvcjMoKSApIHtcclxuXHJcblx0XHRyZXR1cm4gb3B0aW9uYWxUYXJnZXQuc3ViVmVjdG9ycyggdGhpcy52MiwgdGhpcy52MSApLm5vcm1hbGl6ZSgpO1xyXG5cclxuXHR9XHJcblxyXG5cdGdldFRhbmdlbnRBdCggdSwgb3B0aW9uYWxUYXJnZXQgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZ2V0VGFuZ2VudCggdSwgb3B0aW9uYWxUYXJnZXQgKTtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy52MS5jb3B5KCBzb3VyY2UudjEgKTtcclxuXHRcdHRoaXMudjIuY29weSggc291cmNlLnYyICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0dG9KU09OKCkge1xyXG5cclxuXHRcdGNvbnN0IGRhdGEgPSBzdXBlci50b0pTT04oKTtcclxuXHJcblx0XHRkYXRhLnYxID0gdGhpcy52MS50b0FycmF5KCk7XHJcblx0XHRkYXRhLnYyID0gdGhpcy52Mi50b0FycmF5KCk7XHJcblxyXG5cdFx0cmV0dXJuIGRhdGE7XHJcblxyXG5cdH1cclxuXHJcblx0ZnJvbUpTT04oIGpzb24gKSB7XHJcblxyXG5cdFx0c3VwZXIuZnJvbUpTT04oIGpzb24gKTtcclxuXHJcblx0XHR0aGlzLnYxLmZyb21BcnJheSgganNvbi52MSApO1xyXG5cdFx0dGhpcy52Mi5mcm9tQXJyYXkoIGpzb24udjIgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgTGluZUN1cnZlMyB9O1xyXG4iLCJpbXBvcnQgeyBDdXJ2ZSB9IGZyb20gJy4uL2NvcmUvQ3VydmUuanMnO1xyXG5pbXBvcnQgeyBRdWFkcmF0aWNCZXppZXIgfSBmcm9tICcuLi9jb3JlL0ludGVycG9sYXRpb25zLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMi5qcyc7XHJcblxyXG4vKipcclxuICogQSBjdXJ2ZSByZXByZXNlbnRpbmcgYSAyRCBRdWFkcmF0aWMgQmV6aWVyIGN1cnZlLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBjdXJ2ZSA9IG5ldyBUSFJFRS5RdWFkcmF0aWNCZXppZXJDdXJ2ZShcclxuICogXHRuZXcgVEhSRUUuVmVjdG9yMiggLSAxMCwgMCApLFxyXG4gKiBcdG5ldyBUSFJFRS5WZWN0b3IyKCAyMCwgMTUgKSxcclxuICogXHRuZXcgVEhSRUUuVmVjdG9yMiggMTAsIDAgKVxyXG4gKiApXHJcbiAqXHJcbiAqIGNvbnN0IHBvaW50cyA9IGN1cnZlLmdldFBvaW50cyggNTAgKTtcclxuICogY29uc3QgZ2VvbWV0cnkgPSBuZXcgVEhSRUUuQnVmZmVyR2VvbWV0cnkoKS5zZXRGcm9tUG9pbnRzKCBwb2ludHMgKTtcclxuICpcclxuICogY29uc3QgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IDB4ZmYwMDAwIH0gKTtcclxuICpcclxuICogLy8gQ3JlYXRlIHRoZSBmaW5hbCBvYmplY3QgdG8gYWRkIHRvIHRoZSBzY2VuZVxyXG4gKiBjb25zdCBjdXJ2ZU9iamVjdCA9IG5ldyBUSFJFRS5MaW5lKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBDdXJ2ZVxyXG4gKi9cclxuY2xhc3MgUXVhZHJhdGljQmV6aWVyQ3VydmUgZXh0ZW5kcyBDdXJ2ZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgUXVhZHJhdGljIEJlemllciBjdXJ2ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gW3YwXSAtIFRoZSBzdGFydCBwb2ludC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IFt2MV0gLSBUaGUgY29udHJvbCBwb2ludC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IFt2Ml0gLSBUaGUgZW5kIHBvaW50LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCB2MCA9IG5ldyBWZWN0b3IyKCksIHYxID0gbmV3IFZlY3RvcjIoKSwgdjIgPSBuZXcgVmVjdG9yMigpICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzUXVhZHJhdGljQmV6aWVyQ3VydmUgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdRdWFkcmF0aWNCZXppZXJDdXJ2ZSc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc3RhcnQgcG9pbnQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudjAgPSB2MDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjb250cm9sIHBvaW50LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3IyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnYxID0gdjE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZW5kIHBvaW50LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3IyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnYyID0gdjI7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIHBvaW50IG9uIHRoZSBjdXJ2ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0IC0gQSBpbnRlcnBvbGF0aW9uIGZhY3RvciByZXByZXNlbnRpbmcgYSBwb3NpdGlvbiBvbiB0aGUgY3VydmUuIE11c3QgYmUgaW4gdGhlIHJhbmdlIGBbMCwxXWAuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSBbb3B0aW9uYWxUYXJnZXRdIC0gVGhlIG9wdGlvbmFsIHRhcmdldCB2ZWN0b3IgdGhlIHJlc3VsdCBpcyB3cml0dGVuIHRvLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IFRoZSBwb3NpdGlvbiBvbiB0aGUgY3VydmUuXHJcblx0ICovXHJcblx0Z2V0UG9pbnQoIHQsIG9wdGlvbmFsVGFyZ2V0ID0gbmV3IFZlY3RvcjIoKSApIHtcclxuXHJcblx0XHRjb25zdCBwb2ludCA9IG9wdGlvbmFsVGFyZ2V0O1xyXG5cclxuXHRcdGNvbnN0IHYwID0gdGhpcy52MCwgdjEgPSB0aGlzLnYxLCB2MiA9IHRoaXMudjI7XHJcblxyXG5cdFx0cG9pbnQuc2V0KFxyXG5cdFx0XHRRdWFkcmF0aWNCZXppZXIoIHQsIHYwLngsIHYxLngsIHYyLnggKSxcclxuXHRcdFx0UXVhZHJhdGljQmV6aWVyKCB0LCB2MC55LCB2MS55LCB2Mi55IClcclxuXHRcdCk7XHJcblxyXG5cdFx0cmV0dXJuIHBvaW50O1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLnYwLmNvcHkoIHNvdXJjZS52MCApO1xyXG5cdFx0dGhpcy52MS5jb3B5KCBzb3VyY2UudjEgKTtcclxuXHRcdHRoaXMudjIuY29weSggc291cmNlLnYyICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0dG9KU09OKCkge1xyXG5cclxuXHRcdGNvbnN0IGRhdGEgPSBzdXBlci50b0pTT04oKTtcclxuXHJcblx0XHRkYXRhLnYwID0gdGhpcy52MC50b0FycmF5KCk7XHJcblx0XHRkYXRhLnYxID0gdGhpcy52MS50b0FycmF5KCk7XHJcblx0XHRkYXRhLnYyID0gdGhpcy52Mi50b0FycmF5KCk7XHJcblxyXG5cdFx0cmV0dXJuIGRhdGE7XHJcblxyXG5cdH1cclxuXHJcblx0ZnJvbUpTT04oIGpzb24gKSB7XHJcblxyXG5cdFx0c3VwZXIuZnJvbUpTT04oIGpzb24gKTtcclxuXHJcblx0XHR0aGlzLnYwLmZyb21BcnJheSgganNvbi52MCApO1xyXG5cdFx0dGhpcy52MS5mcm9tQXJyYXkoIGpzb24udjEgKTtcclxuXHRcdHRoaXMudjIuZnJvbUFycmF5KCBqc29uLnYyICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFF1YWRyYXRpY0JlemllckN1cnZlIH07XHJcbiIsImltcG9ydCB7IEN1cnZlIH0gZnJvbSAnLi4vY29yZS9DdXJ2ZS5qcyc7XHJcbmltcG9ydCB7IFF1YWRyYXRpY0JlemllciB9IGZyb20gJy4uL2NvcmUvSW50ZXJwb2xhdGlvbnMuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIGN1cnZlIHJlcHJlc2VudGluZyBhIDNEIFF1YWRyYXRpYyBCZXppZXIgY3VydmUuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBDdXJ2ZVxyXG4gKi9cclxuY2xhc3MgUXVhZHJhdGljQmV6aWVyQ3VydmUzIGV4dGVuZHMgQ3VydmUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IFF1YWRyYXRpYyBCZXppZXIgY3VydmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IFt2MF0gLSBUaGUgc3RhcnQgcG9pbnQuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBbdjFdIC0gVGhlIGNvbnRyb2wgcG9pbnQuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBbdjJdIC0gVGhlIGVuZCBwb2ludC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggdjAgPSBuZXcgVmVjdG9yMygpLCB2MSA9IG5ldyBWZWN0b3IzKCksIHYyID0gbmV3IFZlY3RvcjMoKSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1F1YWRyYXRpY0JlemllckN1cnZlMyA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ1F1YWRyYXRpY0JlemllckN1cnZlMyc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc3RhcnQgcG9pbnQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjN9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudjAgPSB2MDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjb250cm9sIHBvaW50LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3IzfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnYxID0gdjE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZW5kIHBvaW50LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3IzfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnYyID0gdjI7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIHBvaW50IG9uIHRoZSBjdXJ2ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0IC0gQSBpbnRlcnBvbGF0aW9uIGZhY3RvciByZXByZXNlbnRpbmcgYSBwb3NpdGlvbiBvbiB0aGUgY3VydmUuIE11c3QgYmUgaW4gdGhlIHJhbmdlIGBbMCwxXWAuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBbb3B0aW9uYWxUYXJnZXRdIC0gVGhlIG9wdGlvbmFsIHRhcmdldCB2ZWN0b3IgdGhlIHJlc3VsdCBpcyB3cml0dGVuIHRvLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IFRoZSBwb3NpdGlvbiBvbiB0aGUgY3VydmUuXHJcblx0ICovXHJcblx0Z2V0UG9pbnQoIHQsIG9wdGlvbmFsVGFyZ2V0ID0gbmV3IFZlY3RvcjMoKSApIHtcclxuXHJcblx0XHRjb25zdCBwb2ludCA9IG9wdGlvbmFsVGFyZ2V0O1xyXG5cclxuXHRcdGNvbnN0IHYwID0gdGhpcy52MCwgdjEgPSB0aGlzLnYxLCB2MiA9IHRoaXMudjI7XHJcblxyXG5cdFx0cG9pbnQuc2V0KFxyXG5cdFx0XHRRdWFkcmF0aWNCZXppZXIoIHQsIHYwLngsIHYxLngsIHYyLnggKSxcclxuXHRcdFx0UXVhZHJhdGljQmV6aWVyKCB0LCB2MC55LCB2MS55LCB2Mi55ICksXHJcblx0XHRcdFF1YWRyYXRpY0JlemllciggdCwgdjAueiwgdjEueiwgdjIueiApXHJcblx0XHQpO1xyXG5cclxuXHRcdHJldHVybiBwb2ludDtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy52MC5jb3B5KCBzb3VyY2UudjAgKTtcclxuXHRcdHRoaXMudjEuY29weSggc291cmNlLnYxICk7XHJcblx0XHR0aGlzLnYyLmNvcHkoIHNvdXJjZS52MiApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdHRvSlNPTigpIHtcclxuXHJcblx0XHRjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCk7XHJcblxyXG5cdFx0ZGF0YS52MCA9IHRoaXMudjAudG9BcnJheSgpO1xyXG5cdFx0ZGF0YS52MSA9IHRoaXMudjEudG9BcnJheSgpO1xyXG5cdFx0ZGF0YS52MiA9IHRoaXMudjIudG9BcnJheSgpO1xyXG5cclxuXHRcdHJldHVybiBkYXRhO1xyXG5cclxuXHR9XHJcblxyXG5cdGZyb21KU09OKCBqc29uICkge1xyXG5cclxuXHRcdHN1cGVyLmZyb21KU09OKCBqc29uICk7XHJcblxyXG5cdFx0dGhpcy52MC5mcm9tQXJyYXkoIGpzb24udjAgKTtcclxuXHRcdHRoaXMudjEuZnJvbUFycmF5KCBqc29uLnYxICk7XHJcblx0XHR0aGlzLnYyLmZyb21BcnJheSgganNvbi52MiApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBRdWFkcmF0aWNCZXppZXJDdXJ2ZTMgfTtcclxuIiwiaW1wb3J0IHsgQ3VydmUgfSBmcm9tICcuLi9jb3JlL0N1cnZlLmpzJztcclxuaW1wb3J0IHsgQ2F0bXVsbFJvbSB9IGZyb20gJy4uL2NvcmUvSW50ZXJwb2xhdGlvbnMuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IyLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIGN1cnZlIHJlcHJlc2VudGluZyBhIDJEIHNwbGluZSBjdXJ2ZS5cclxuICpcclxuICogYGBganNcclxuICogLy8gQ3JlYXRlIGEgc2luZS1saWtlIHdhdmVcclxuICogY29uc3QgY3VydmUgPSBuZXcgVEhSRUUuU3BsaW5lQ3VydmUoIFtcclxuICogXHRuZXcgVEhSRUUuVmVjdG9yMiggLTEwLCAwICksXHJcbiAqIFx0bmV3IFRIUkVFLlZlY3RvcjIoIC01LCA1ICksXHJcbiAqIFx0bmV3IFRIUkVFLlZlY3RvcjIoIDAsIDAgKSxcclxuICogXHRuZXcgVEhSRUUuVmVjdG9yMiggNSwgLTUgKSxcclxuICogXHRuZXcgVEhSRUUuVmVjdG9yMiggMTAsIDAgKVxyXG4gKiBdICk7XHJcbiAqXHJcbiAqIGNvbnN0IHBvaW50cyA9IGN1cnZlLmdldFBvaW50cyggNTAgKTtcclxuICogY29uc3QgZ2VvbWV0cnkgPSBuZXcgVEhSRUUuQnVmZmVyR2VvbWV0cnkoKS5zZXRGcm9tUG9pbnRzKCBwb2ludHMgKTtcclxuICpcclxuICogY29uc3QgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IDB4ZmYwMDAwIH0gKTtcclxuICpcclxuICogLy8gQ3JlYXRlIHRoZSBmaW5hbCBvYmplY3QgdG8gYWRkIHRvIHRoZSBzY2VuZVxyXG4gKiBjb25zdCBzcGxpbmVPYmplY3QgPSBuZXcgVEhSRUUuTGluZSggZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQ3VydmVcclxuICovXHJcbmNsYXNzIFNwbGluZUN1cnZlIGV4dGVuZHMgQ3VydmUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IDJEIHNwbGluZSBjdXJ2ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8VmVjdG9yMj59IFtwb2ludHNdIC0gIEFuIGFycmF5IG9mIDJEIHBvaW50cyBkZWZpbmluZyB0aGUgY3VydmUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHBvaW50cyA9IFtdICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzU3BsaW5lQ3VydmUgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdTcGxpbmVDdXJ2ZSc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBhcnJheSBvZiAyRCBwb2ludHMgZGVmaW5pbmcgdGhlIGN1cnZlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxWZWN0b3IyPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wb2ludHMgPSBwb2ludHM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIHBvaW50IG9uIHRoZSBjdXJ2ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0IC0gQSBpbnRlcnBvbGF0aW9uIGZhY3RvciByZXByZXNlbnRpbmcgYSBwb3NpdGlvbiBvbiB0aGUgY3VydmUuIE11c3QgYmUgaW4gdGhlIHJhbmdlIGBbMCwxXWAuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSBbb3B0aW9uYWxUYXJnZXRdIC0gVGhlIG9wdGlvbmFsIHRhcmdldCB2ZWN0b3IgdGhlIHJlc3VsdCBpcyB3cml0dGVuIHRvLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IFRoZSBwb3NpdGlvbiBvbiB0aGUgY3VydmUuXHJcblx0ICovXHJcblx0Z2V0UG9pbnQoIHQsIG9wdGlvbmFsVGFyZ2V0ID0gbmV3IFZlY3RvcjIoKSApIHtcclxuXHJcblx0XHRjb25zdCBwb2ludCA9IG9wdGlvbmFsVGFyZ2V0O1xyXG5cclxuXHRcdGNvbnN0IHBvaW50cyA9IHRoaXMucG9pbnRzO1xyXG5cdFx0Y29uc3QgcCA9ICggcG9pbnRzLmxlbmd0aCAtIDEgKSAqIHQ7XHJcblxyXG5cdFx0Y29uc3QgaW50UG9pbnQgPSBNYXRoLmZsb29yKCBwICk7XHJcblx0XHRjb25zdCB3ZWlnaHQgPSBwIC0gaW50UG9pbnQ7XHJcblxyXG5cdFx0Y29uc3QgcDAgPSBwb2ludHNbIGludFBvaW50ID09PSAwID8gaW50UG9pbnQgOiBpbnRQb2ludCAtIDEgXTtcclxuXHRcdGNvbnN0IHAxID0gcG9pbnRzWyBpbnRQb2ludCBdO1xyXG5cdFx0Y29uc3QgcDIgPSBwb2ludHNbIGludFBvaW50ID4gcG9pbnRzLmxlbmd0aCAtIDIgPyBwb2ludHMubGVuZ3RoIC0gMSA6IGludFBvaW50ICsgMSBdO1xyXG5cdFx0Y29uc3QgcDMgPSBwb2ludHNbIGludFBvaW50ID4gcG9pbnRzLmxlbmd0aCAtIDMgPyBwb2ludHMubGVuZ3RoIC0gMSA6IGludFBvaW50ICsgMiBdO1xyXG5cclxuXHRcdHBvaW50LnNldChcclxuXHRcdFx0Q2F0bXVsbFJvbSggd2VpZ2h0LCBwMC54LCBwMS54LCBwMi54LCBwMy54ICksXHJcblx0XHRcdENhdG11bGxSb20oIHdlaWdodCwgcDAueSwgcDEueSwgcDIueSwgcDMueSApXHJcblx0XHQpO1xyXG5cclxuXHRcdHJldHVybiBwb2ludDtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy5wb2ludHMgPSBbXTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBzb3VyY2UucG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBwb2ludCA9IHNvdXJjZS5wb2ludHNbIGkgXTtcclxuXHJcblx0XHRcdHRoaXMucG9pbnRzLnB1c2goIHBvaW50LmNsb25lKCkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0dG9KU09OKCkge1xyXG5cclxuXHRcdGNvbnN0IGRhdGEgPSBzdXBlci50b0pTT04oKTtcclxuXHJcblx0XHRkYXRhLnBvaW50cyA9IFtdO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHRoaXMucG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBwb2ludCA9IHRoaXMucG9pbnRzWyBpIF07XHJcblx0XHRcdGRhdGEucG9pbnRzLnB1c2goIHBvaW50LnRvQXJyYXkoKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZGF0YTtcclxuXHJcblx0fVxyXG5cclxuXHRmcm9tSlNPTigganNvbiApIHtcclxuXHJcblx0XHRzdXBlci5mcm9tSlNPTigganNvbiApO1xyXG5cclxuXHRcdHRoaXMucG9pbnRzID0gW107XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0ganNvbi5wb2ludHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHBvaW50ID0ganNvbi5wb2ludHNbIGkgXTtcclxuXHRcdFx0dGhpcy5wb2ludHMucHVzaCggbmV3IFZlY3RvcjIoKS5mcm9tQXJyYXkoIHBvaW50ICkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFNwbGluZUN1cnZlIH07XHJcbiIsImltcG9ydCB7IEN1cnZlIH0gZnJvbSAnLi9DdXJ2ZS5qcyc7XHJcbmltcG9ydCAqIGFzIEN1cnZlcyBmcm9tICcuLi9jdXJ2ZXMvQ3VydmVzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIGJhc2UgY2xhc3MgZXh0ZW5kaW5nIHtAbGluayBDdXJ2ZX0uIGBDdXJ2ZVBhdGhgIGlzIHNpbXBseSBhblxyXG4gKiBhcnJheSBvZiBjb25uZWN0ZWQgY3VydmVzLCBidXQgcmV0YWlucyB0aGUgQVBJIG9mIGEgY3VydmUuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBDdXJ2ZVxyXG4gKi9cclxuY2xhc3MgQ3VydmVQYXRoIGV4dGVuZHMgQ3VydmUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGN1cnZlIHBhdGguXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnQ3VydmVQYXRoJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIGFycmF5IG9mIGN1cnZlcyBkZWZpbmluZyB0aGVcclxuXHRcdCAqIHBhdGguXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PEN1cnZlPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jdXJ2ZXMgPSBbXTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIHBhdGggc2hvdWxkIGF1dG9tYXRpY2FsbHkgYmUgY2xvc2VkXHJcblx0XHQgKiBieSBhIGxpbmUgY3VydmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmF1dG9DbG9zZSA9IGZhbHNlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgYSBjdXJ2ZSB0byB0aGlzIGN1cnZlIHBhdGguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0N1cnZlfSBjdXJ2ZSAtIFRoZSBjdXJ2ZSB0byBhZGQuXHJcblx0ICovXHJcblx0YWRkKCBjdXJ2ZSApIHtcclxuXHJcblx0XHR0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgYSBsaW5lIGN1cnZlIHRvIGNsb3NlIHRoZSBwYXRoLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Q3VydmVQYXRofSBBIHJlZmVyZW5jZSB0byB0aGlzIGN1cnZlIHBhdGguXHJcblx0ICovXHJcblx0Y2xvc2VQYXRoKCkge1xyXG5cclxuXHRcdC8vIEFkZCBhIGxpbmUgY3VydmUgaWYgc3RhcnQgYW5kIGVuZCBvZiBsaW5lcyBhcmUgbm90IGNvbm5lY3RlZFxyXG5cdFx0Y29uc3Qgc3RhcnRQb2ludCA9IHRoaXMuY3VydmVzWyAwIF0uZ2V0UG9pbnQoIDAgKTtcclxuXHRcdGNvbnN0IGVuZFBvaW50ID0gdGhpcy5jdXJ2ZXNbIHRoaXMuY3VydmVzLmxlbmd0aCAtIDEgXS5nZXRQb2ludCggMSApO1xyXG5cclxuXHRcdGlmICggISBzdGFydFBvaW50LmVxdWFscyggZW5kUG9pbnQgKSApIHtcclxuXHJcblx0XHRcdGNvbnN0IGxpbmVUeXBlID0gKCBzdGFydFBvaW50LmlzVmVjdG9yMiA9PT0gdHJ1ZSApID8gJ0xpbmVDdXJ2ZScgOiAnTGluZUN1cnZlMyc7XHJcblx0XHRcdHRoaXMuY3VydmVzLnB1c2goIG5ldyBDdXJ2ZXNbIGxpbmVUeXBlIF0oIGVuZFBvaW50LCBzdGFydFBvaW50ICkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgcmV0dXJucyBhIHZlY3RvciBpbiAyRCBvciAzRCBzcGFjZSAoZGVwZW5kaW5nIG9uIHRoZSBjdXJ2ZSBkZWZpbml0aW9ucylcclxuXHQgKiBmb3IgdGhlIGdpdmVuIGludGVycG9sYXRpb24gZmFjdG9yLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHQgLSBBIGludGVycG9sYXRpb24gZmFjdG9yIHJlcHJlc2VudGluZyBhIHBvc2l0aW9uIG9uIHRoZSBjdXJ2ZS4gTXVzdCBiZSBpbiB0aGUgcmFuZ2UgYFswLDFdYC5cclxuXHQgKiBAcGFyYW0geyhWZWN0b3IyfFZlY3RvcjMpfSBbb3B0aW9uYWxUYXJnZXRdIC0gVGhlIG9wdGlvbmFsIHRhcmdldCB2ZWN0b3IgdGhlIHJlc3VsdCBpcyB3cml0dGVuIHRvLlxyXG5cdCAqIEByZXR1cm4gez8oVmVjdG9yMnxWZWN0b3IzKX0gVGhlIHBvc2l0aW9uIG9uIHRoZSBjdXJ2ZS4gSXQgY2FuIGJlIGEgMkQgb3IgM0QgdmVjdG9yIGRlcGVuZGluZyBvbiB0aGUgY3VydmUgZGVmaW5pdGlvbi5cclxuXHQgKi9cclxuXHRnZXRQb2ludCggdCwgb3B0aW9uYWxUYXJnZXQgKSB7XHJcblxyXG5cdFx0Ly8gVG8gZ2V0IGFjY3VyYXRlIHBvaW50IHdpdGggcmVmZXJlbmNlIHRvXHJcblx0XHQvLyBlbnRpcmUgcGF0aCBkaXN0YW5jZSBhdCB0aW1lIHQsXHJcblx0XHQvLyBmb2xsb3dpbmcgaGFzIHRvIGJlIGRvbmU6XHJcblxyXG5cdFx0Ly8gMS4gTGVuZ3RoIG9mIGVhY2ggc3ViIHBhdGggaGF2ZSB0byBiZSBrbm93blxyXG5cdFx0Ly8gMi4gTG9jYXRlIGFuZCBpZGVudGlmeSB0eXBlIG9mIGN1cnZlXHJcblx0XHQvLyAzLiBHZXQgdCBmb3IgdGhlIGN1cnZlXHJcblx0XHQvLyA0LiBSZXR1cm4gY3VydmUuZ2V0UG9pbnRBdCh0JylcclxuXHJcblx0XHRjb25zdCBkID0gdCAqIHRoaXMuZ2V0TGVuZ3RoKCk7XHJcblx0XHRjb25zdCBjdXJ2ZUxlbmd0aHMgPSB0aGlzLmdldEN1cnZlTGVuZ3RocygpO1xyXG5cdFx0bGV0IGkgPSAwO1xyXG5cclxuXHRcdC8vIFRvIHRoaW5rIGFib3V0IGJvdW5kYXJpZXMgcG9pbnRzLlxyXG5cclxuXHRcdHdoaWxlICggaSA8IGN1cnZlTGVuZ3Rocy5sZW5ndGggKSB7XHJcblxyXG5cdFx0XHRpZiAoIGN1cnZlTGVuZ3Roc1sgaSBdID49IGQgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGRpZmYgPSBjdXJ2ZUxlbmd0aHNbIGkgXSAtIGQ7XHJcblx0XHRcdFx0Y29uc3QgY3VydmUgPSB0aGlzLmN1cnZlc1sgaSBdO1xyXG5cclxuXHRcdFx0XHRjb25zdCBzZWdtZW50TGVuZ3RoID0gY3VydmUuZ2V0TGVuZ3RoKCk7XHJcblx0XHRcdFx0Y29uc3QgdSA9IHNlZ21lbnRMZW5ndGggPT09IDAgPyAwIDogMSAtIGRpZmYgLyBzZWdtZW50TGVuZ3RoO1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gY3VydmUuZ2V0UG9pbnRBdCggdSwgb3B0aW9uYWxUYXJnZXQgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGkgKys7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBudWxsO1xyXG5cclxuXHRcdC8vIGxvb3Agd2hlcmUgc3VtICE9IDAsIHN1bSA+IGQgLCBzdW0rMSA8ZFxyXG5cclxuXHR9XHJcblxyXG5cdGdldExlbmd0aCgpIHtcclxuXHJcblx0XHQvLyBXZSBjYW5ub3QgdXNlIHRoZSBkZWZhdWx0IFRIUkVFLkN1cnZlIGdldFBvaW50KCkgd2l0aCBnZXRMZW5ndGgoKSBiZWNhdXNlIGluXHJcblx0XHQvLyBUSFJFRS5DdXJ2ZSwgZ2V0TGVuZ3RoKCkgZGVwZW5kcyBvbiBnZXRQb2ludCgpIGJ1dCBpbiBUSFJFRS5DdXJ2ZVBhdGhcclxuXHRcdC8vIGdldFBvaW50KCkgZGVwZW5kcyBvbiBnZXRMZW5ndGhcclxuXHJcblx0XHRjb25zdCBsZW5zID0gdGhpcy5nZXRDdXJ2ZUxlbmd0aHMoKTtcclxuXHRcdHJldHVybiBsZW5zWyBsZW5zLmxlbmd0aCAtIDEgXTtcclxuXHJcblx0fVxyXG5cclxuXHR1cGRhdGVBcmNMZW5ndGhzKCkge1xyXG5cclxuXHRcdC8vIGNhY2hlTGVuZ3RocyBtdXN0IGJlIHJlY2FsY3VsYXRlZC5cclxuXHJcblx0XHR0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHRcdHRoaXMuY2FjaGVMZW5ndGhzID0gbnVsbDtcclxuXHRcdHRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBsaXN0IG9mIGN1bXVsYXRpdmUgY3VydmUgbGVuZ3RocyBvZiB0aGUgZGVmaW5lZCBjdXJ2ZXMuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtBcnJheTxudW1iZXI+fSBUaGUgY3VydmUgbGVuZ3Rocy5cclxuXHQgKi9cclxuXHRnZXRDdXJ2ZUxlbmd0aHMoKSB7XHJcblxyXG5cdFx0Ly8gQ29tcHV0ZSBsZW5ndGhzIGFuZCBjYWNoZSB0aGVtXHJcblx0XHQvLyBXZSBjYW5ub3Qgb3ZlcndyaXRlIGdldExlbmd0aHMoKSBiZWNhdXNlIFV0b1QgbWFwcGluZyB1c2VzIGl0LlxyXG5cdFx0Ly8gV2UgdXNlIGNhY2hlIHZhbHVlcyBpZiBjdXJ2ZXMgYW5kIGNhY2hlIGFycmF5IGFyZSBzYW1lIGxlbmd0aFxyXG5cclxuXHRcdGlmICggdGhpcy5jYWNoZUxlbmd0aHMgJiYgdGhpcy5jYWNoZUxlbmd0aHMubGVuZ3RoID09PSB0aGlzLmN1cnZlcy5sZW5ndGggKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gdGhpcy5jYWNoZUxlbmd0aHM7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEdldCBsZW5ndGggb2Ygc3ViLWN1cnZlXHJcblx0XHQvLyBQdXNoIHN1bXMgaW50byBjYWNoZWQgYXJyYXlcclxuXHJcblx0XHRjb25zdCBsZW5ndGhzID0gW107XHJcblx0XHRsZXQgc3VtcyA9IDA7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gdGhpcy5jdXJ2ZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdHN1bXMgKz0gdGhpcy5jdXJ2ZXNbIGkgXS5nZXRMZW5ndGgoKTtcclxuXHRcdFx0bGVuZ3Rocy5wdXNoKCBzdW1zICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuY2FjaGVMZW5ndGhzID0gbGVuZ3RocztcclxuXHJcblx0XHRyZXR1cm4gbGVuZ3RocztcclxuXHJcblx0fVxyXG5cclxuXHRnZXRTcGFjZWRQb2ludHMoIGRpdmlzaW9ucyA9IDQwICkge1xyXG5cclxuXHRcdGNvbnN0IHBvaW50cyA9IFtdO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8PSBkaXZpc2lvbnM7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRwb2ludHMucHVzaCggdGhpcy5nZXRQb2ludCggaSAvIGRpdmlzaW9ucyApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy5hdXRvQ2xvc2UgKSB7XHJcblxyXG5cdFx0XHRwb2ludHMucHVzaCggcG9pbnRzWyAwIF0gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHBvaW50cztcclxuXHJcblx0fVxyXG5cclxuXHRnZXRQb2ludHMoIGRpdmlzaW9ucyA9IDEyICkge1xyXG5cclxuXHRcdGNvbnN0IHBvaW50cyA9IFtdO1xyXG5cdFx0bGV0IGxhc3Q7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBjdXJ2ZXMgPSB0aGlzLmN1cnZlczsgaSA8IGN1cnZlcy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBjdXJ2ZSA9IGN1cnZlc1sgaSBdO1xyXG5cdFx0XHRjb25zdCByZXNvbHV0aW9uID0gY3VydmUuaXNFbGxpcHNlQ3VydmUgPyBkaXZpc2lvbnMgKiAyXHJcblx0XHRcdFx0OiAoIGN1cnZlLmlzTGluZUN1cnZlIHx8IGN1cnZlLmlzTGluZUN1cnZlMyApID8gMVxyXG5cdFx0XHRcdFx0OiBjdXJ2ZS5pc1NwbGluZUN1cnZlID8gZGl2aXNpb25zICogY3VydmUucG9pbnRzLmxlbmd0aFxyXG5cdFx0XHRcdFx0XHQ6IGRpdmlzaW9ucztcclxuXHJcblx0XHRcdGNvbnN0IHB0cyA9IGN1cnZlLmdldFBvaW50cyggcmVzb2x1dGlvbiApO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGogPSAwOyBqIDwgcHRzLmxlbmd0aDsgaiArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgcG9pbnQgPSBwdHNbIGogXTtcclxuXHJcblx0XHRcdFx0aWYgKCBsYXN0ICYmIGxhc3QuZXF1YWxzKCBwb2ludCApICkgY29udGludWU7IC8vIGVuc3VyZXMgbm8gY29uc2VjdXRpdmUgcG9pbnRzIGFyZSBkdXBsaWNhdGVzXHJcblxyXG5cdFx0XHRcdHBvaW50cy5wdXNoKCBwb2ludCApO1xyXG5cdFx0XHRcdGxhc3QgPSBwb2ludDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aGlzLmF1dG9DbG9zZSAmJiBwb2ludHMubGVuZ3RoID4gMSAmJiAhIHBvaW50c1sgcG9pbnRzLmxlbmd0aCAtIDEgXS5lcXVhbHMoIHBvaW50c1sgMCBdICkgKSB7XHJcblxyXG5cdFx0XHRwb2ludHMucHVzaCggcG9pbnRzWyAwIF0gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHBvaW50cztcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy5jdXJ2ZXMgPSBbXTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBzb3VyY2UuY3VydmVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBjdXJ2ZSA9IHNvdXJjZS5jdXJ2ZXNbIGkgXTtcclxuXHJcblx0XHRcdHRoaXMuY3VydmVzLnB1c2goIGN1cnZlLmNsb25lKCkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5hdXRvQ2xvc2UgPSBzb3VyY2UuYXV0b0Nsb3NlO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdHRvSlNPTigpIHtcclxuXHJcblx0XHRjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCk7XHJcblxyXG5cdFx0ZGF0YS5hdXRvQ2xvc2UgPSB0aGlzLmF1dG9DbG9zZTtcclxuXHRcdGRhdGEuY3VydmVzID0gW107XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gdGhpcy5jdXJ2ZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGN1cnZlID0gdGhpcy5jdXJ2ZXNbIGkgXTtcclxuXHRcdFx0ZGF0YS5jdXJ2ZXMucHVzaCggY3VydmUudG9KU09OKCkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGRhdGE7XHJcblxyXG5cdH1cclxuXHJcblx0ZnJvbUpTT04oIGpzb24gKSB7XHJcblxyXG5cdFx0c3VwZXIuZnJvbUpTT04oIGpzb24gKTtcclxuXHJcblx0XHR0aGlzLmF1dG9DbG9zZSA9IGpzb24uYXV0b0Nsb3NlO1xyXG5cdFx0dGhpcy5jdXJ2ZXMgPSBbXTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBqc29uLmN1cnZlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgY3VydmUgPSBqc29uLmN1cnZlc1sgaSBdO1xyXG5cdFx0XHR0aGlzLmN1cnZlcy5wdXNoKCBuZXcgQ3VydmVzWyBjdXJ2ZS50eXBlIF0oKS5mcm9tSlNPTiggY3VydmUgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCB7IEN1cnZlUGF0aCB9O1xyXG4iLCJpbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IyLmpzJztcclxuaW1wb3J0IHsgQ3VydmVQYXRoIH0gZnJvbSAnLi9DdXJ2ZVBhdGguanMnO1xyXG5pbXBvcnQgeyBFbGxpcHNlQ3VydmUgfSBmcm9tICcuLi9jdXJ2ZXMvRWxsaXBzZUN1cnZlLmpzJztcclxuaW1wb3J0IHsgU3BsaW5lQ3VydmUgfSBmcm9tICcuLi9jdXJ2ZXMvU3BsaW5lQ3VydmUuanMnO1xyXG5pbXBvcnQgeyBDdWJpY0JlemllckN1cnZlIH0gZnJvbSAnLi4vY3VydmVzL0N1YmljQmV6aWVyQ3VydmUuanMnO1xyXG5pbXBvcnQgeyBRdWFkcmF0aWNCZXppZXJDdXJ2ZSB9IGZyb20gJy4uL2N1cnZlcy9RdWFkcmF0aWNCZXppZXJDdXJ2ZS5qcyc7XHJcbmltcG9ydCB7IExpbmVDdXJ2ZSB9IGZyb20gJy4uL2N1cnZlcy9MaW5lQ3VydmUuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgMkQgcGF0aCByZXByZXNlbnRhdGlvbi4gVGhlIGNsYXNzIHByb3ZpZGVzIG1ldGhvZHMgZm9yIGNyZWF0aW5nIHBhdGhzXHJcbiAqIGFuZCBjb250b3VycyBvZiAyRCBzaGFwZXMgc2ltaWxhciB0byB0aGUgMkQgQ2FudmFzIEFQSS5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgcGF0aCA9IG5ldyBUSFJFRS5QYXRoKCk7XHJcbiAqXHJcbiAqIHBhdGgubGluZVRvKCAwLCAwLjggKTtcclxuICogcGF0aC5xdWFkcmF0aWNDdXJ2ZVRvKCAwLCAxLCAwLjIsIDEgKTtcclxuICogcGF0aC5saW5lVG8oIDEsIDEgKTtcclxuICpcclxuICogY29uc3QgcG9pbnRzID0gcGF0aC5nZXRQb2ludHMoKTtcclxuICpcclxuICogY29uc3QgZ2VvbWV0cnkgPSBuZXcgVEhSRUUuQnVmZmVyR2VvbWV0cnkoKS5zZXRGcm9tUG9pbnRzKCBwb2ludHMgKTtcclxuICogY29uc3QgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IDB4ZmZmZmZmIH0gKTtcclxuICpcclxuICogY29uc3QgbGluZSA9IG5ldyBUSFJFRS5MaW5lKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuICogc2NlbmUuYWRkKCBsaW5lICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQ3VydmVQYXRoXHJcbiAqL1xyXG5jbGFzcyBQYXRoIGV4dGVuZHMgQ3VydmVQYXRoIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBwYXRoLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxWZWN0b3IyPn0gW3BvaW50c10gLSBBbiBhcnJheSBvZiAyRCBwb2ludHMgZGVmaW5pbmcgdGhlIHBhdGguXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHBvaW50cyApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdQYXRoJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjdXJyZW50IG9mZnNldCBvZiB0aGUgcGF0aC4gQW55IG5ldyBjdXJ2ZSBhZGRlZCB3aWxsIHN0YXJ0IGhlcmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY3VycmVudFBvaW50ID0gbmV3IFZlY3RvcjIoKTtcclxuXHJcblx0XHRpZiAoIHBvaW50cyApIHtcclxuXHJcblx0XHRcdHRoaXMuc2V0RnJvbVBvaW50cyggcG9pbnRzICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgYSBwYXRoIGZyb20gdGhlIGdpdmVuIGxpc3Qgb2YgcG9pbnRzLiBUaGUgcG9pbnRzIGFyZSBhZGRlZFxyXG5cdCAqIHRvIHRoZSBwYXRoIGFzIGluc3RhbmNlcyBvZiB7QGxpbmsgTGluZUN1cnZlfS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8VmVjdG9yMj59IHBvaW50cyAtIEFuIGFycmF5IG9mIDJEIHBvaW50cy5cclxuXHQgKiBAcmV0dXJuIHtQYXRofSBBIHJlZmVyZW5jZSB0byB0aGlzIHBhdGguXHJcblx0ICovXHJcblx0c2V0RnJvbVBvaW50cyggcG9pbnRzICkge1xyXG5cclxuXHRcdHRoaXMubW92ZVRvKCBwb2ludHNbIDAgXS54LCBwb2ludHNbIDAgXS55ICk7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAxLCBsID0gcG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmxpbmVUbyggcG9pbnRzWyBpIF0ueCwgcG9pbnRzWyBpIF0ueSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBNb3ZlcyB7QGxpbmsgUGF0aCNjdXJyZW50UG9pbnR9IHRvIHRoZSBnaXZlbiBwb2ludC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHggY29vcmRpbmF0ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB5IGNvb3JkaW5hdGUuXHJcblx0ICogQHJldHVybiB7UGF0aH0gQSByZWZlcmVuY2UgdG8gdGhpcyBwYXRoLlxyXG5cdCAqL1xyXG5cdG1vdmVUbyggeCwgeSApIHtcclxuXHJcblx0XHR0aGlzLmN1cnJlbnRQb2ludC5zZXQoIHgsIHkgKTsgLy8gVE9ETyBjb25zaWRlciByZWZlcmVuY2luZyB2ZWN0b3JzIGluc3RlYWQgb2YgY29weWluZz9cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIGFuIGluc3RhbmNlIG9mIHtAbGluayBMaW5lQ3VydmV9IHRvIHRoZSBwYXRoIGJ5IGNvbm5lY3RpbmdcclxuXHQgKiB0aGUgY3VycmVudCBwb2ludCB3aXRoIHRoZSBnaXZlbiBvbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludC5cclxuXHQgKiBAcmV0dXJuIHtQYXRofSBBIHJlZmVyZW5jZSB0byB0aGlzIHBhdGguXHJcblx0ICovXHJcblx0bGluZVRvKCB4LCB5ICkge1xyXG5cclxuXHRcdGNvbnN0IGN1cnZlID0gbmV3IExpbmVDdXJ2ZSggdGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSwgbmV3IFZlY3RvcjIoIHgsIHkgKSApO1xyXG5cdFx0dGhpcy5jdXJ2ZXMucHVzaCggY3VydmUgKTtcclxuXHJcblx0XHR0aGlzLmN1cnJlbnRQb2ludC5zZXQoIHgsIHkgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIGFuIGluc3RhbmNlIG9mIHtAbGluayBRdWFkcmF0aWNCZXppZXJDdXJ2ZX0gdG8gdGhlIHBhdGggYnkgY29ubmVjdGluZ1xyXG5cdCAqIHRoZSBjdXJyZW50IHBvaW50IHdpdGggdGhlIGdpdmVuIG9uZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhQ1B4IC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgY29udHJvbCBwb2ludC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYUNQeSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGNvbnRyb2wgcG9pbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFYIC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhWSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludC5cclxuXHQgKiBAcmV0dXJuIHtQYXRofSBBIHJlZmVyZW5jZSB0byB0aGlzIHBhdGguXHJcblx0ICovXHJcblx0cXVhZHJhdGljQ3VydmVUbyggYUNQeCwgYUNQeSwgYVgsIGFZICkge1xyXG5cclxuXHRcdGNvbnN0IGN1cnZlID0gbmV3IFF1YWRyYXRpY0JlemllckN1cnZlKFxyXG5cdFx0XHR0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLFxyXG5cdFx0XHRuZXcgVmVjdG9yMiggYUNQeCwgYUNQeSApLFxyXG5cdFx0XHRuZXcgVmVjdG9yMiggYVgsIGFZIClcclxuXHRcdCk7XHJcblxyXG5cdFx0dGhpcy5jdXJ2ZXMucHVzaCggY3VydmUgKTtcclxuXHJcblx0XHR0aGlzLmN1cnJlbnRQb2ludC5zZXQoIGFYLCBhWSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEN1YmljQmV6aWVyQ3VydmV9IHRvIHRoZSBwYXRoIGJ5IGNvbm5lY3RpbmdcclxuXHQgKiB0aGUgY3VycmVudCBwb2ludCB3aXRoIHRoZSBnaXZlbiBvbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYUNQMXggLSBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhQ1AxeSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFDUDJ4IC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFDUDJ5IC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFYIC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhWSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludC5cclxuXHQgKiBAcmV0dXJuIHtQYXRofSBBIHJlZmVyZW5jZSB0byB0aGlzIHBhdGguXHJcblx0ICovXHJcblx0YmV6aWVyQ3VydmVUbyggYUNQMXgsIGFDUDF5LCBhQ1AyeCwgYUNQMnksIGFYLCBhWSApIHtcclxuXHJcblx0XHRjb25zdCBjdXJ2ZSA9IG5ldyBDdWJpY0JlemllckN1cnZlKFxyXG5cdFx0XHR0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLFxyXG5cdFx0XHRuZXcgVmVjdG9yMiggYUNQMXgsIGFDUDF5ICksXHJcblx0XHRcdG5ldyBWZWN0b3IyKCBhQ1AyeCwgYUNQMnkgKSxcclxuXHRcdFx0bmV3IFZlY3RvcjIoIGFYLCBhWSApXHJcblx0XHQpO1xyXG5cclxuXHRcdHRoaXMuY3VydmVzLnB1c2goIGN1cnZlICk7XHJcblxyXG5cdFx0dGhpcy5jdXJyZW50UG9pbnQuc2V0KCBhWCwgYVkgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIGFuIGluc3RhbmNlIG9mIHtAbGluayBTcGxpbmVDdXJ2ZX0gdG8gdGhlIHBhdGggYnkgY29ubmVjdGluZ1xyXG5cdCAqIHRoZSBjdXJyZW50IHBvaW50IHdpdGggdGhlIGdpdmVuIGxpc3Qgb2YgcG9pbnRzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxWZWN0b3IyPn0gcHRzIC0gQW4gYXJyYXkgb2YgcG9pbnRzIGluIDJEIHNwYWNlLlxyXG5cdCAqIEByZXR1cm4ge1BhdGh9IEEgcmVmZXJlbmNlIHRvIHRoaXMgcGF0aC5cclxuXHQgKi9cclxuXHRzcGxpbmVUaHJ1KCBwdHMgKSB7XHJcblxyXG5cdFx0Y29uc3QgbnB0cyA9IFsgdGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSBdLmNvbmNhdCggcHRzICk7XHJcblxyXG5cdFx0Y29uc3QgY3VydmUgPSBuZXcgU3BsaW5lQ3VydmUoIG5wdHMgKTtcclxuXHRcdHRoaXMuY3VydmVzLnB1c2goIGN1cnZlICk7XHJcblxyXG5cdFx0dGhpcy5jdXJyZW50UG9pbnQuY29weSggcHRzWyBwdHMubGVuZ3RoIC0gMSBdICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyBhbiBhcmMgYXMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEVsbGlwc2VDdXJ2ZX0gdG8gdGhlIHBhdGgsIHBvc2l0aW9uZWQgcmVsYXRpdmVcclxuXHQgKiB0byB0aGUgY3VycmVudCBwb2ludC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhWCAtIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGNlbnRlciBvZiB0aGUgYXJjIG9mZnNldHRlZCBmcm9tIHRoZSBwcmV2aW91cyBjdXJ2ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYVkgLSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBjZW50ZXIgb2YgdGhlIGFyYyBvZmZzZXR0ZWQgZnJvbSB0aGUgcHJldmlvdXMgY3VydmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFSYWRpdXMgLSBUaGUgcmFkaXVzIG9mIHRoZSBhcmMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFTdGFydEFuZ2xlIC0gVGhlIHN0YXJ0IGFuZ2xlIGluIHJhZGlhbnMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFFbmRBbmdsZSAtIFRoZSBlbmQgYW5nbGUgaW4gcmFkaWFucy5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFthQ2xvY2t3aXNlPWZhbHNlXSAtIFdoZXRoZXIgdG8gc3dlZXAgdGhlIGFyYyBjbG9ja3dpc2Ugb3Igbm90LlxyXG5cdCAqIEByZXR1cm4ge1BhdGh9IEEgcmVmZXJlbmNlIHRvIHRoaXMgcGF0aC5cclxuXHQgKi9cclxuXHRhcmMoIGFYLCBhWSwgYVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSApIHtcclxuXHJcblx0XHRjb25zdCB4MCA9IHRoaXMuY3VycmVudFBvaW50Lng7XHJcblx0XHRjb25zdCB5MCA9IHRoaXMuY3VycmVudFBvaW50Lnk7XHJcblxyXG5cdFx0dGhpcy5hYnNhcmMoIGFYICsgeDAsIGFZICsgeTAsIGFSYWRpdXMsXHJcblx0XHRcdGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIGFuIGFic29sdXRlbHkgcG9zaXRpb25lZCBhcmMgYXMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEVsbGlwc2VDdXJ2ZX0gdG8gdGhlIHBhdGguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYVggLSBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBjZW50ZXIgb2YgdGhlIGFyYy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYVkgLSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBjZW50ZXIgb2YgdGhlIGFyYy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYVJhZGl1cyAtIFRoZSByYWRpdXMgb2YgdGhlIGFyYy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYVN0YXJ0QW5nbGUgLSBUaGUgc3RhcnQgYW5nbGUgaW4gcmFkaWFucy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYUVuZEFuZ2xlIC0gVGhlIGVuZCBhbmdsZSBpbiByYWRpYW5zLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FDbG9ja3dpc2U9ZmFsc2VdIC0gV2hldGhlciB0byBzd2VlcCB0aGUgYXJjIGNsb2Nrd2lzZSBvciBub3QuXHJcblx0ICogQHJldHVybiB7UGF0aH0gQSByZWZlcmVuY2UgdG8gdGhpcyBwYXRoLlxyXG5cdCAqL1xyXG5cdGFic2FyYyggYVgsIGFZLCBhUmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlICkge1xyXG5cclxuXHRcdHRoaXMuYWJzZWxsaXBzZSggYVgsIGFZLCBhUmFkaXVzLCBhUmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyBhbiBlbGxpcHNlIGFzIGFuIGluc3RhbmNlIG9mIHtAbGluayBFbGxpcHNlQ3VydmV9IHRvIHRoZSBwYXRoLCBwb3NpdGlvbmVkIHJlbGF0aXZlXHJcblx0ICogdG8gdGhlIGN1cnJlbnQgcG9pbnRcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhWCAtIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGNlbnRlciBvZiB0aGUgZWxsaXBzZSBvZmZzZXR0ZWQgZnJvbSB0aGUgcHJldmlvdXMgY3VydmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFZIC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgY2VudGVyIG9mIHRoZSBlbGxpcHNlIG9mZnNldHRlZCBmcm9tIHRoZSBwcmV2aW91cyBjdXJ2ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geFJhZGl1cyAtIFRoZSByYWRpdXMgb2YgdGhlIGVsbGlwc2UgaW4gdGhlIHggYXhpcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geVJhZGl1cyAtIFRoZSByYWRpdXMgb2YgdGhlIGVsbGlwc2UgaW4gdGhlIHkgYXhpcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYVN0YXJ0QW5nbGUgLSBUaGUgc3RhcnQgYW5nbGUgaW4gcmFkaWFucy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYUVuZEFuZ2xlIC0gVGhlIGVuZCBhbmdsZSBpbiByYWRpYW5zLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FDbG9ja3dpc2U9ZmFsc2VdIC0gV2hldGhlciB0byBzd2VlcCB0aGUgZWxsaXBzZSBjbG9ja3dpc2Ugb3Igbm90LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbYVJvdGF0aW9uPTBdIC0gVGhlIHJvdGF0aW9uIGFuZ2xlIG9mIHRoZSBlbGxpcHNlIGluIHJhZGlhbnMsIGNvdW50ZXJjbG9ja3dpc2UgZnJvbSB0aGUgcG9zaXRpdmUgWCBheGlzLlxyXG5cdCAqIEByZXR1cm4ge1BhdGh9IEEgcmVmZXJlbmNlIHRvIHRoaXMgcGF0aC5cclxuXHQgKi9cclxuXHRlbGxpcHNlKCBhWCwgYVksIHhSYWRpdXMsIHlSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UsIGFSb3RhdGlvbiApIHtcclxuXHJcblx0XHRjb25zdCB4MCA9IHRoaXMuY3VycmVudFBvaW50Lng7XHJcblx0XHRjb25zdCB5MCA9IHRoaXMuY3VycmVudFBvaW50Lnk7XHJcblxyXG5cdFx0dGhpcy5hYnNlbGxpcHNlKCBhWCArIHgwLCBhWSArIHkwLCB4UmFkaXVzLCB5UmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlLCBhUm90YXRpb24gKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIGFuIGFic29sdXRlbHkgcG9zaXRpb25lZCBlbGxpcHNlIGFzIGFuIGluc3RhbmNlIG9mIHtAbGluayBFbGxpcHNlQ3VydmV9IHRvIHRoZSBwYXRoLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFYIC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgYWJzb2x1dGUgY2VudGVyIG9mIHRoZSBlbGxpcHNlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhWSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGFic29sdXRlIGNlbnRlciBvZiB0aGUgZWxsaXBzZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geFJhZGl1cyAtIFRoZSByYWRpdXMgb2YgdGhlIGVsbGlwc2UgaW4gdGhlIHggYXhpcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geVJhZGl1cyAtIFRoZSByYWRpdXMgb2YgdGhlIGVsbGlwc2UgaW4gdGhlIHkgYXhpcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYVN0YXJ0QW5nbGUgLSBUaGUgc3RhcnQgYW5nbGUgaW4gcmFkaWFucy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYUVuZEFuZ2xlIC0gVGhlIGVuZCBhbmdsZSBpbiByYWRpYW5zLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FDbG9ja3dpc2U9ZmFsc2VdIC0gV2hldGhlciB0byBzd2VlcCB0aGUgZWxsaXBzZSBjbG9ja3dpc2Ugb3Igbm90LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbYVJvdGF0aW9uPTBdIC0gVGhlIHJvdGF0aW9uIGFuZ2xlIG9mIHRoZSBlbGxpcHNlIGluIHJhZGlhbnMsIGNvdW50ZXJjbG9ja3dpc2UgZnJvbSB0aGUgcG9zaXRpdmUgWCBheGlzLlxyXG5cdCAqIEByZXR1cm4ge1BhdGh9IEEgcmVmZXJlbmNlIHRvIHRoaXMgcGF0aC5cclxuXHQgKi9cclxuXHRhYnNlbGxpcHNlKCBhWCwgYVksIHhSYWRpdXMsIHlSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UsIGFSb3RhdGlvbiApIHtcclxuXHJcblx0XHRjb25zdCBjdXJ2ZSA9IG5ldyBFbGxpcHNlQ3VydmUoIGFYLCBhWSwgeFJhZGl1cywgeVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSwgYVJvdGF0aW9uICk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmN1cnZlcy5sZW5ndGggPiAwICkge1xyXG5cclxuXHRcdFx0Ly8gaWYgYSBwcmV2aW91cyBjdXJ2ZSBpcyBwcmVzZW50LCBhdHRlbXB0IHRvIGpvaW5cclxuXHRcdFx0Y29uc3QgZmlyc3RQb2ludCA9IGN1cnZlLmdldFBvaW50KCAwICk7XHJcblxyXG5cdFx0XHRpZiAoICEgZmlyc3RQb2ludC5lcXVhbHMoIHRoaXMuY3VycmVudFBvaW50ICkgKSB7XHJcblxyXG5cdFx0XHRcdHRoaXMubGluZVRvKCBmaXJzdFBvaW50LngsIGZpcnN0UG9pbnQueSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZSApO1xyXG5cclxuXHRcdGNvbnN0IGxhc3RQb2ludCA9IGN1cnZlLmdldFBvaW50KCAxICk7XHJcblx0XHR0aGlzLmN1cnJlbnRQb2ludC5jb3B5KCBsYXN0UG9pbnQgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy5jdXJyZW50UG9pbnQuY29weSggc291cmNlLmN1cnJlbnRQb2ludCApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdHRvSlNPTigpIHtcclxuXHJcblx0XHRjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCk7XHJcblxyXG5cdFx0ZGF0YS5jdXJyZW50UG9pbnQgPSB0aGlzLmN1cnJlbnRQb2ludC50b0FycmF5KCk7XHJcblxyXG5cdFx0cmV0dXJuIGRhdGE7XHJcblxyXG5cdH1cclxuXHJcblx0ZnJvbUpTT04oIGpzb24gKSB7XHJcblxyXG5cdFx0c3VwZXIuZnJvbUpTT04oIGpzb24gKTtcclxuXHJcblx0XHR0aGlzLmN1cnJlbnRQb2ludC5mcm9tQXJyYXkoIGpzb24uY3VycmVudFBvaW50ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBQYXRoIH07XHJcbiIsImltcG9ydCB7IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcbmltcG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9CdWZmZXJHZW9tZXRyeS5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IyLmpzJztcclxuaW1wb3J0IHsgY2xhbXAgfSBmcm9tICcuLi9tYXRoL01hdGhVdGlscy5qcyc7XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBtZXNoZXMgd2l0aCBheGlhbCBzeW1tZXRyeSBsaWtlIHZhc2VzLiBUaGUgbGF0aGUgcm90YXRlcyBhcm91bmQgdGhlIFkgYXhpcy5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgcG9pbnRzID0gW107XHJcbiAqIGZvciAoIGxldCBpID0gMDsgaSA8IDEwOyBpICsrICkge1xyXG4gKiBcdHBvaW50cy5wdXNoKCBuZXcgVEhSRUUuVmVjdG9yMiggTWF0aC5zaW4oIGkgKiAwLjIgKSAqIDEwICsgNSwgKCBpIC0gNSApICogMiApICk7XHJcbiAqIH1cclxuICogY29uc3QgZ2VvbWV0cnkgPSBuZXcgVEhSRUUuTGF0aGVHZW9tZXRyeSggcG9pbnRzICk7XHJcbiAqIGNvbnN0IG1hdGVyaWFsID0gbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiAweGZmZmYwMCB9ICk7XHJcbiAqIGNvbnN0IGxhdGhlID0gbmV3IFRIUkVFLk1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG4gKiBzY2VuZS5hZGQoIGxhdGhlICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQnVmZmVyR2VvbWV0cnlcclxuICovXHJcbmNsYXNzIExhdGhlR2VvbWV0cnkgZXh0ZW5kcyBCdWZmZXJHZW9tZXRyeSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbGF0aGUgZ2VvbWV0cnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PFZlY3RvcjJ8VmVjdG9yMz59IFtwb2ludHNdIC0gQW4gYXJyYXkgb2YgcG9pbnRzIGluIDJEIHNwYWNlLiBUaGUgeC1jb29yZGluYXRlIG9mIGVhY2ggcG9pbnRcclxuXHQgKiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbc2VnbWVudHM9MTJdIC0gVGhlIG51bWJlciBvZiBjaXJjdW1mZXJlbmNlIHNlZ21lbnRzIHRvIGdlbmVyYXRlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbcGhpU3RhcnQ9MF0gLSBUaGUgc3RhcnRpbmcgYW5nbGUgaW4gcmFkaWFucy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3BoaUxlbmd0aD1NYXRoLlBJKjJdIC0gVGhlIHJhZGlhbiAoMCB0byAyUEkpIHJhbmdlIG9mIHRoZSBsYXRoZWQgc2VjdGlvbiAyUEkgaXMgYVxyXG5cdCAqIGNsb3NlZCBsYXRoZSwgbGVzcyB0aGFuIDJQSSBpcyBhIHBvcnRpb24uXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHBvaW50cyA9IFsgbmV3IFZlY3RvcjIoIDAsIC0gMC41ICksIG5ldyBWZWN0b3IyKCAwLjUsIDAgKSwgbmV3IFZlY3RvcjIoIDAsIDAuNSApIF0sIHNlZ21lbnRzID0gMTIsIHBoaVN0YXJ0ID0gMCwgcGhpTGVuZ3RoID0gTWF0aC5QSSAqIDIgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnTGF0aGVHZW9tZXRyeSc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb2xkcyB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVycyB0aGF0IGhhdmUgYmVlblxyXG5cdFx0ICogdXNlZCB0byBnZW5lcmF0ZSB0aGUgZ2VvbWV0cnkuIEFueSBtb2RpZmljYXRpb25cclxuXHRcdCAqIGFmdGVyIGluc3RhbnRpYXRpb24gZG9lcyBub3QgY2hhbmdlIHRoZSBnZW9tZXRyeS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBhcmFtZXRlcnMgPSB7XHJcblx0XHRcdHBvaW50czogcG9pbnRzLFxyXG5cdFx0XHRzZWdtZW50czogc2VnbWVudHMsXHJcblx0XHRcdHBoaVN0YXJ0OiBwaGlTdGFydCxcclxuXHRcdFx0cGhpTGVuZ3RoOiBwaGlMZW5ndGhcclxuXHRcdH07XHJcblxyXG5cdFx0c2VnbWVudHMgPSBNYXRoLmZsb29yKCBzZWdtZW50cyApO1xyXG5cclxuXHRcdC8vIGNsYW1wIHBoaUxlbmd0aCBzbyBpdCdzIGluIHJhbmdlIG9mIFsgMCwgMlBJIF1cclxuXHJcblx0XHRwaGlMZW5ndGggPSBjbGFtcCggcGhpTGVuZ3RoLCAwLCBNYXRoLlBJICogMiApO1xyXG5cclxuXHRcdC8vIGJ1ZmZlcnNcclxuXHJcblx0XHRjb25zdCBpbmRpY2VzID0gW107XHJcblx0XHRjb25zdCB2ZXJ0aWNlcyA9IFtdO1xyXG5cdFx0Y29uc3QgdXZzID0gW107XHJcblx0XHRjb25zdCBpbml0Tm9ybWFscyA9IFtdO1xyXG5cdFx0Y29uc3Qgbm9ybWFscyA9IFtdO1xyXG5cclxuXHRcdC8vIGhlbHBlciB2YXJpYWJsZXNcclxuXHJcblx0XHRjb25zdCBpbnZlcnNlU2VnbWVudHMgPSAxLjAgLyBzZWdtZW50cztcclxuXHRcdGNvbnN0IHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XHJcblx0XHRjb25zdCB1diA9IG5ldyBWZWN0b3IyKCk7XHJcblx0XHRjb25zdCBub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xyXG5cdFx0Y29uc3QgY3VyTm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcclxuXHRcdGNvbnN0IHByZXZOb3JtYWwgPSBuZXcgVmVjdG9yMygpO1xyXG5cdFx0bGV0IGR4ID0gMDtcclxuXHRcdGxldCBkeSA9IDA7XHJcblxyXG5cdFx0Ly8gcHJlLWNvbXB1dGUgbm9ybWFscyBmb3IgaW5pdGlhbCBcIm1lcmlkaWFuXCJcclxuXHJcblx0XHRmb3IgKCBsZXQgaiA9IDA7IGogPD0gKCBwb2ludHMubGVuZ3RoIC0gMSApOyBqICsrICkge1xyXG5cclxuXHRcdFx0c3dpdGNoICggaiApIHtcclxuXHJcblx0XHRcdFx0Y2FzZSAwOlx0XHRcdFx0Ly8gc3BlY2lhbCBoYW5kbGluZyBmb3IgMXN0IHZlcnRleCBvbiBwYXRoXHJcblxyXG5cdFx0XHRcdFx0ZHggPSBwb2ludHNbIGogKyAxIF0ueCAtIHBvaW50c1sgaiBdLng7XHJcblx0XHRcdFx0XHRkeSA9IHBvaW50c1sgaiArIDEgXS55IC0gcG9pbnRzWyBqIF0ueTtcclxuXHJcblx0XHRcdFx0XHRub3JtYWwueCA9IGR5ICogMS4wO1xyXG5cdFx0XHRcdFx0bm9ybWFsLnkgPSAtIGR4O1xyXG5cdFx0XHRcdFx0bm9ybWFsLnogPSBkeSAqIDAuMDtcclxuXHJcblx0XHRcdFx0XHRwcmV2Tm9ybWFsLmNvcHkoIG5vcm1hbCApO1xyXG5cclxuXHRcdFx0XHRcdG5vcm1hbC5ub3JtYWxpemUoKTtcclxuXHJcblx0XHRcdFx0XHRpbml0Tm9ybWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7XHJcblxyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdGNhc2UgKCBwb2ludHMubGVuZ3RoIC0gMSApOlx0Ly8gc3BlY2lhbCBoYW5kbGluZyBmb3IgbGFzdCBWZXJ0ZXggb24gcGF0aFxyXG5cclxuXHRcdFx0XHRcdGluaXROb3JtYWxzLnB1c2goIHByZXZOb3JtYWwueCwgcHJldk5vcm1hbC55LCBwcmV2Tm9ybWFsLnogKTtcclxuXHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0ZGVmYXVsdDpcdFx0XHQvLyBkZWZhdWx0IGhhbmRsaW5nIGZvciBhbGwgdmVydGljZXMgaW4gYmV0d2VlblxyXG5cclxuXHRcdFx0XHRcdGR4ID0gcG9pbnRzWyBqICsgMSBdLnggLSBwb2ludHNbIGogXS54O1xyXG5cdFx0XHRcdFx0ZHkgPSBwb2ludHNbIGogKyAxIF0ueSAtIHBvaW50c1sgaiBdLnk7XHJcblxyXG5cdFx0XHRcdFx0bm9ybWFsLnggPSBkeSAqIDEuMDtcclxuXHRcdFx0XHRcdG5vcm1hbC55ID0gLSBkeDtcclxuXHRcdFx0XHRcdG5vcm1hbC56ID0gZHkgKiAwLjA7XHJcblxyXG5cdFx0XHRcdFx0Y3VyTm9ybWFsLmNvcHkoIG5vcm1hbCApO1xyXG5cclxuXHRcdFx0XHRcdG5vcm1hbC54ICs9IHByZXZOb3JtYWwueDtcclxuXHRcdFx0XHRcdG5vcm1hbC55ICs9IHByZXZOb3JtYWwueTtcclxuXHRcdFx0XHRcdG5vcm1hbC56ICs9IHByZXZOb3JtYWwuejtcclxuXHJcblx0XHRcdFx0XHRub3JtYWwubm9ybWFsaXplKCk7XHJcblxyXG5cdFx0XHRcdFx0aW5pdE5vcm1hbHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApO1xyXG5cclxuXHRcdFx0XHRcdHByZXZOb3JtYWwuY29weSggY3VyTm9ybWFsICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGdlbmVyYXRlIHZlcnRpY2VzLCB1dnMgYW5kIG5vcm1hbHNcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPD0gc2VnbWVudHM7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBwaGkgPSBwaGlTdGFydCArIGkgKiBpbnZlcnNlU2VnbWVudHMgKiBwaGlMZW5ndGg7XHJcblxyXG5cdFx0XHRjb25zdCBzaW4gPSBNYXRoLnNpbiggcGhpICk7XHJcblx0XHRcdGNvbnN0IGNvcyA9IE1hdGguY29zKCBwaGkgKTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBqID0gMDsgaiA8PSAoIHBvaW50cy5sZW5ndGggLSAxICk7IGogKysgKSB7XHJcblxyXG5cdFx0XHRcdC8vIHZlcnRleFxyXG5cclxuXHRcdFx0XHR2ZXJ0ZXgueCA9IHBvaW50c1sgaiBdLnggKiBzaW47XHJcblx0XHRcdFx0dmVydGV4LnkgPSBwb2ludHNbIGogXS55O1xyXG5cdFx0XHRcdHZlcnRleC56ID0gcG9pbnRzWyBqIF0ueCAqIGNvcztcclxuXHJcblx0XHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xyXG5cclxuXHRcdFx0XHQvLyB1dlxyXG5cclxuXHRcdFx0XHR1di54ID0gaSAvIHNlZ21lbnRzO1xyXG5cdFx0XHRcdHV2LnkgPSBqIC8gKCBwb2ludHMubGVuZ3RoIC0gMSApO1xyXG5cclxuXHRcdFx0XHR1dnMucHVzaCggdXYueCwgdXYueSApO1xyXG5cclxuXHRcdFx0XHQvLyBub3JtYWxcclxuXHJcblx0XHRcdFx0Y29uc3QgeCA9IGluaXROb3JtYWxzWyAzICogaiArIDAgXSAqIHNpbjtcclxuXHRcdFx0XHRjb25zdCB5ID0gaW5pdE5vcm1hbHNbIDMgKiBqICsgMSBdO1xyXG5cdFx0XHRcdGNvbnN0IHogPSBpbml0Tm9ybWFsc1sgMyAqIGogKyAwIF0gKiBjb3M7XHJcblxyXG5cdFx0XHRcdG5vcm1hbHMucHVzaCggeCwgeSwgeiApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBpbmRpY2VzXHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgc2VnbWVudHM7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaiA9IDA7IGogPCAoIHBvaW50cy5sZW5ndGggLSAxICk7IGogKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGJhc2UgPSBqICsgaSAqIHBvaW50cy5sZW5ndGg7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGEgPSBiYXNlO1xyXG5cdFx0XHRcdGNvbnN0IGIgPSBiYXNlICsgcG9pbnRzLmxlbmd0aDtcclxuXHRcdFx0XHRjb25zdCBjID0gYmFzZSArIHBvaW50cy5sZW5ndGggKyAxO1xyXG5cdFx0XHRcdGNvbnN0IGQgPSBiYXNlICsgMTtcclxuXHJcblx0XHRcdFx0Ly8gZmFjZXNcclxuXHJcblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XHJcblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBjLCBkLCBiICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGJ1aWxkIGdlb21ldHJ5XHJcblxyXG5cdFx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xyXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XHJcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XHJcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0gT2JqZWN0LmFzc2lnbigge30sIHNvdXJjZS5wYXJhbWV0ZXJzICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRmFjdG9yeSBtZXRob2QgZm9yIGNyZWF0aW5nIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZnJvbSB0aGUgZ2l2ZW5cclxuXHQgKiBKU09OIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gQSBKU09OIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNlcmlhbGl6ZWQgZ2VvbWV0cnkuXHJcblx0ICogQHJldHVybiB7TGF0aGVHZW9tZXRyeX0gQSBuZXcgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c3RhdGljIGZyb21KU09OKCBkYXRhICkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgTGF0aGVHZW9tZXRyeSggZGF0YS5wb2ludHMsIGRhdGEuc2VnbWVudHMsIGRhdGEucGhpU3RhcnQsIGRhdGEucGhpTGVuZ3RoICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBMYXRoZUdlb21ldHJ5IH07XHJcbiIsImltcG9ydCB7IFBhdGggfSBmcm9tICcuLi9leHRyYXMvY29yZS9QYXRoLmpzJztcclxuaW1wb3J0IHsgTGF0aGVHZW9tZXRyeSB9IGZyb20gJy4vTGF0aGVHZW9tZXRyeS5qcyc7XHJcblxyXG4vKipcclxuICogQSBnZW9tZXRyeSBjbGFzcyBmb3IgYSBjYXBzdWxlIHdpdGggZ2l2ZW4gcmFkaWkgYW5kIGhlaWdodC4gSXQgaXMgY29uc3RydWN0ZWQgdXNpbmcgYSBsYXRoZS5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgZ2VvbWV0cnkgPSBuZXcgVEhSRUUuQ2Fwc3VsZUdlb21ldHJ5KCAxLCAxLCA0LCA4ICk7XHJcbiAqIGNvbnN0IG1hdGVyaWFsID0gbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiAweDAwZmYwMCB9ICk7XHJcbiAqIGNvbnN0IGNhcHN1bGUgPSBuZXcgVEhSRUUuTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcbiAqIHNjZW5lLmFkZCggY2Fwc3VsZSApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIExhdGhlR2VvbWV0cnlcclxuICovXHJcbmNsYXNzIENhcHN1bGVHZW9tZXRyeSBleHRlbmRzIExhdGhlR2VvbWV0cnkge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGNhcHN1bGUgZ2VvbWV0cnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3JhZGl1cz0xXSAtIFJhZGl1cyBvZiB0aGUgY2Fwc3VsZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD0xXSAtIExlbmd0aCBvZiB0aGUgbWlkZGxlIHNlY3Rpb24uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtjYXBTZWdtZW50cz00XSAtIE51bWJlciBvZiBjdXJ2ZSBzZWdtZW50cyB1c2VkIHRvIGJ1aWxkIHRoZSBjYXBzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbcmFkaWFsU2VnbWVudHM9OF0gLSBOdW1iZXIgb2Ygc2VnbWVudGVkIGZhY2VzIGFyb3VuZCB0aGUgY2lyY3VtZmVyZW5jZSBvZiB0aGUgY2Fwc3VsZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcmFkaXVzID0gMSwgbGVuZ3RoID0gMSwgY2FwU2VnbWVudHMgPSA0LCByYWRpYWxTZWdtZW50cyA9IDggKSB7XHJcblxyXG5cdFx0Y29uc3QgcGF0aCA9IG5ldyBQYXRoKCk7XHJcblx0XHRwYXRoLmFic2FyYyggMCwgLSBsZW5ndGggLyAyLCByYWRpdXMsIE1hdGguUEkgKiAxLjUsIDAgKTtcclxuXHRcdHBhdGguYWJzYXJjKCAwLCBsZW5ndGggLyAyLCByYWRpdXMsIDAsIE1hdGguUEkgKiAwLjUgKTtcclxuXHJcblx0XHRzdXBlciggcGF0aC5nZXRQb2ludHMoIGNhcFNlZ21lbnRzICksIHJhZGlhbFNlZ21lbnRzICk7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ0NhcHN1bGVHZW9tZXRyeSc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb2xkcyB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVycyB0aGF0IGhhdmUgYmVlblxyXG5cdFx0ICogdXNlZCB0byBnZW5lcmF0ZSB0aGUgZ2VvbWV0cnkuIEFueSBtb2RpZmljYXRpb25cclxuXHRcdCAqIGFmdGVyIGluc3RhbnRpYXRpb24gZG9lcyBub3QgY2hhbmdlIHRoZSBnZW9tZXRyeS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBhcmFtZXRlcnMgPSB7XHJcblx0XHRcdHJhZGl1czogcmFkaXVzLFxyXG5cdFx0XHRsZW5ndGg6IGxlbmd0aCxcclxuXHRcdFx0Y2FwU2VnbWVudHM6IGNhcFNlZ21lbnRzLFxyXG5cdFx0XHRyYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsXHJcblx0XHR9O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGZyb20gdGhlIGdpdmVuXHJcblx0ICogSlNPTiBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIEEgSlNPTiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzZXJpYWxpemVkIGdlb21ldHJ5LlxyXG5cdCAqIEByZXR1cm4ge0NhcHN1bGVHZW9tZXRyeX0gQSBuZXcgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c3RhdGljIGZyb21KU09OKCBkYXRhICkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgQ2Fwc3VsZUdlb21ldHJ5KCBkYXRhLnJhZGl1cywgZGF0YS5sZW5ndGgsIGRhdGEuY2FwU2VnbWVudHMsIGRhdGEucmFkaWFsU2VnbWVudHMgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgQ2Fwc3VsZUdlb21ldHJ5IH07XHJcbiIsImltcG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9CdWZmZXJHZW9tZXRyeS5qcyc7XHJcbmltcG9ydCB7IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IyLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIHNpbXBsZSBzaGFwZSBvZiBFdWNsaWRlYW4gZ2VvbWV0cnkuIEl0IGlzIGNvbnN0cnVjdGVkIGZyb20gYVxyXG4gKiBudW1iZXIgb2YgdHJpYW5ndWxhciBzZWdtZW50cyB0aGF0IGFyZSBvcmllbnRlZCBhcm91bmQgYSBjZW50cmFsIHBvaW50IGFuZFxyXG4gKiBleHRlbmQgYXMgZmFyIG91dCBhcyBhIGdpdmVuIHJhZGl1cy4gSXQgaXMgYnVpbHQgY291bnRlci1jbG9ja3dpc2UgZnJvbSBhXHJcbiAqIHN0YXJ0IGFuZ2xlIGFuZCBhIGdpdmVuIGNlbnRyYWwgYW5nbGUuIEl0IGNhbiBhbHNvIGJlIHVzZWQgdG8gY3JlYXRlXHJcbiAqIHJlZ3VsYXIgcG9seWdvbnMsIHdoZXJlIHRoZSBudW1iZXIgb2Ygc2VnbWVudHMgZGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mXHJcbiAqIHNpZGVzLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBnZW9tZXRyeSA9IG5ldyBUSFJFRS5DaXJjbGVHZW9tZXRyeSggNSwgMzIgKTtcclxuICogY29uc3QgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IDB4ZmZmZjAwIH0gKTtcclxuICogY29uc3QgY2lyY2xlID0gbmV3IFRIUkVFLk1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG4gKiBzY2VuZS5hZGQoIGNpcmNsZSApXHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQnVmZmVyR2VvbWV0cnlcclxuICovXHJcbmNsYXNzIENpcmNsZUdlb21ldHJ5IGV4dGVuZHMgQnVmZmVyR2VvbWV0cnkge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGNpcmNsZSBnZW9tZXRyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbcmFkaXVzPTFdIC0gUmFkaXVzIG9mIHRoZSBjaXJjbGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtzZWdtZW50cz0zMl0gLSBOdW1iZXIgb2Ygc2VnbWVudHMgKHRyaWFuZ2xlcyksIG1pbmltdW0gPSBgM2AuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt0aGV0YVN0YXJ0PTBdIC0gU3RhcnQgYW5nbGUgZm9yIGZpcnN0IHNlZ21lbnQgaW4gcmFkaWFucy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3RoZXRhTGVuZ3RoPU1hdGguUEkqMl0gLSBUaGUgY2VudHJhbCBhbmdsZSwgb2Z0ZW4gY2FsbGVkIHRoZXRhLFxyXG5cdCAqIG9mIHRoZSBjaXJjdWxhciBzZWN0b3IgaW4gcmFkaWFucy4gVGhlIGRlZmF1bHQgdmFsdWUgcmVzdWx0cyBpbiBhIGNvbXBsZXRlIGNpcmNsZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcmFkaXVzID0gMSwgc2VnbWVudHMgPSAzMiwgdGhldGFTdGFydCA9IDAsIHRoZXRhTGVuZ3RoID0gTWF0aC5QSSAqIDIgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnQ2lyY2xlR2VvbWV0cnknO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG9sZHMgdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMgdGhhdCBoYXZlIGJlZW5cclxuXHRcdCAqIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGdlb21ldHJ5LiBBbnkgbW9kaWZpY2F0aW9uXHJcblx0XHQgKiBhZnRlciBpbnN0YW50aWF0aW9uIGRvZXMgbm90IGNoYW5nZSB0aGUgZ2VvbWV0cnkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0ge1xyXG5cdFx0XHRyYWRpdXM6IHJhZGl1cyxcclxuXHRcdFx0c2VnbWVudHM6IHNlZ21lbnRzLFxyXG5cdFx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxyXG5cdFx0XHR0aGV0YUxlbmd0aDogdGhldGFMZW5ndGhcclxuXHRcdH07XHJcblxyXG5cdFx0c2VnbWVudHMgPSBNYXRoLm1heCggMywgc2VnbWVudHMgKTtcclxuXHJcblx0XHQvLyBidWZmZXJzXHJcblxyXG5cdFx0Y29uc3QgaW5kaWNlcyA9IFtdO1xyXG5cdFx0Y29uc3QgdmVydGljZXMgPSBbXTtcclxuXHRcdGNvbnN0IG5vcm1hbHMgPSBbXTtcclxuXHRcdGNvbnN0IHV2cyA9IFtdO1xyXG5cclxuXHRcdC8vIGhlbHBlciB2YXJpYWJsZXNcclxuXHJcblx0XHRjb25zdCB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xyXG5cdFx0Y29uc3QgdXYgPSBuZXcgVmVjdG9yMigpO1xyXG5cclxuXHRcdC8vIGNlbnRlciBwb2ludFxyXG5cclxuXHRcdHZlcnRpY2VzLnB1c2goIDAsIDAsIDAgKTtcclxuXHRcdG5vcm1hbHMucHVzaCggMCwgMCwgMSApO1xyXG5cdFx0dXZzLnB1c2goIDAuNSwgMC41ICk7XHJcblxyXG5cdFx0Zm9yICggbGV0IHMgPSAwLCBpID0gMzsgcyA8PSBzZWdtZW50czsgcyArKywgaSArPSAzICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgc2VnbWVudCA9IHRoZXRhU3RhcnQgKyBzIC8gc2VnbWVudHMgKiB0aGV0YUxlbmd0aDtcclxuXHJcblx0XHRcdC8vIHZlcnRleFxyXG5cclxuXHRcdFx0dmVydGV4LnggPSByYWRpdXMgKiBNYXRoLmNvcyggc2VnbWVudCApO1xyXG5cdFx0XHR2ZXJ0ZXgueSA9IHJhZGl1cyAqIE1hdGguc2luKCBzZWdtZW50ICk7XHJcblxyXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XHJcblxyXG5cdFx0XHQvLyBub3JtYWxcclxuXHJcblx0XHRcdG5vcm1hbHMucHVzaCggMCwgMCwgMSApO1xyXG5cclxuXHRcdFx0Ly8gdXZzXHJcblxyXG5cdFx0XHR1di54ID0gKCB2ZXJ0aWNlc1sgaSBdIC8gcmFkaXVzICsgMSApIC8gMjtcclxuXHRcdFx0dXYueSA9ICggdmVydGljZXNbIGkgKyAxIF0gLyByYWRpdXMgKyAxICkgLyAyO1xyXG5cclxuXHRcdFx0dXZzLnB1c2goIHV2LngsIHV2LnkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gaW5kaWNlc1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMTsgaSA8PSBzZWdtZW50czsgaSArKyApIHtcclxuXHJcblx0XHRcdGluZGljZXMucHVzaCggaSwgaSArIDEsIDAgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gYnVpbGQgZ2VvbWV0cnlcclxuXHJcblx0XHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XHJcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcclxuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xyXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLnBhcmFtZXRlcnMgPSBPYmplY3QuYXNzaWduKCB7fSwgc291cmNlLnBhcmFtZXRlcnMgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGYWN0b3J5IG1ldGhvZCBmb3IgY3JlYXRpbmcgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBmcm9tIHRoZSBnaXZlblxyXG5cdCAqIEpTT04gb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBBIEpTT04gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc2VyaWFsaXplZCBnZW9tZXRyeS5cclxuXHQgKiBAcmV0dXJuIHtDaXJjbGVHZW9tZXRyeX0gQSBuZXcgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c3RhdGljIGZyb21KU09OKCBkYXRhICkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgQ2lyY2xlR2VvbWV0cnkoIGRhdGEucmFkaXVzLCBkYXRhLnNlZ21lbnRzLCBkYXRhLnRoZXRhU3RhcnQsIGRhdGEudGhldGFMZW5ndGggKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCB7IENpcmNsZUdlb21ldHJ5IH07XHJcbiIsImltcG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9CdWZmZXJHZW9tZXRyeS5qcyc7XHJcbmltcG9ydCB7IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IyLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIGdlb21ldHJ5IGNsYXNzIGZvciByZXByZXNlbnRpbmcgYSBjeWxpbmRlci5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgZ2VvbWV0cnkgPSBuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeSggNSwgNSwgMjAsIDMyICk7XHJcbiAqIGNvbnN0IG1hdGVyaWFsID0gbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiAweGZmZmYwMCB9ICk7XHJcbiAqIGNvbnN0IGN5bGluZGVyID0gbmV3IFRIUkVFLk1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG4gKiBzY2VuZS5hZGQoIGN5bGluZGVyICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQnVmZmVyR2VvbWV0cnlcclxuICovXHJcbmNsYXNzIEN5bGluZGVyR2VvbWV0cnkgZXh0ZW5kcyBCdWZmZXJHZW9tZXRyeSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgY3lsaW5kZXIgZ2VvbWV0cnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3JhZGl1c1RvcD0xXSAtIFJhZGl1cyBvZiB0aGUgY3lsaW5kZXIgYXQgdGhlIHRvcC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3JhZGl1c0JvdHRvbT0xXSAtIFJhZGl1cyBvZiB0aGUgY3lsaW5kZXIgYXQgdGhlIGJvdHRvbS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2hlaWdodD0xXSAtIEhlaWdodCBvZiB0aGUgY3lsaW5kZXIuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpYWxTZWdtZW50cz0zMl0gLSBOdW1iZXIgb2Ygc2VnbWVudGVkIGZhY2VzIGFyb3VuZCB0aGUgY2lyY3VtZmVyZW5jZSBvZiB0aGUgY3lsaW5kZXIuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtoZWlnaHRTZWdtZW50cz0xXSAtIE51bWJlciBvZiByb3dzIG9mIGZhY2VzIGFsb25nIHRoZSBoZWlnaHQgb2YgdGhlIGN5bGluZGVyLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wZW5FbmRlZD1mYWxzZV0gLSBXaGV0aGVyIHRoZSBiYXNlIG9mIHRoZSBjeWxpbmRlciBpcyBvcGVuIG9yIGNhcHBlZC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3RoZXRhU3RhcnQ9MF0gLSBTdGFydCBhbmdsZSBmb3IgZmlyc3Qgc2VnbWVudCwgaW4gcmFkaWFucy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3RoZXRhTGVuZ3RoPU1hdGguUEkqMl0gLSBUaGUgY2VudHJhbCBhbmdsZSwgb2Z0ZW4gY2FsbGVkIHRoZXRhLCBvZiB0aGUgY2lyY3VsYXIgc2VjdG9yLCBpbiByYWRpYW5zLlxyXG5cdCAqIFRoZSBkZWZhdWx0IHZhbHVlIHJlc3VsdHMgaW4gYSBjb21wbGV0ZSBjeWxpbmRlci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcmFkaXVzVG9wID0gMSwgcmFkaXVzQm90dG9tID0gMSwgaGVpZ2h0ID0gMSwgcmFkaWFsU2VnbWVudHMgPSAzMiwgaGVpZ2h0U2VnbWVudHMgPSAxLCBvcGVuRW5kZWQgPSBmYWxzZSwgdGhldGFTdGFydCA9IDAsIHRoZXRhTGVuZ3RoID0gTWF0aC5QSSAqIDIgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnQ3lsaW5kZXJHZW9tZXRyeSc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb2xkcyB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVycyB0aGF0IGhhdmUgYmVlblxyXG5cdFx0ICogdXNlZCB0byBnZW5lcmF0ZSB0aGUgZ2VvbWV0cnkuIEFueSBtb2RpZmljYXRpb25cclxuXHRcdCAqIGFmdGVyIGluc3RhbnRpYXRpb24gZG9lcyBub3QgY2hhbmdlIHRoZSBnZW9tZXRyeS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBhcmFtZXRlcnMgPSB7XHJcblx0XHRcdHJhZGl1c1RvcDogcmFkaXVzVG9wLFxyXG5cdFx0XHRyYWRpdXNCb3R0b206IHJhZGl1c0JvdHRvbSxcclxuXHRcdFx0aGVpZ2h0OiBoZWlnaHQsXHJcblx0XHRcdHJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cyxcclxuXHRcdFx0aGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzLFxyXG5cdFx0XHRvcGVuRW5kZWQ6IG9wZW5FbmRlZCxcclxuXHRcdFx0dGhldGFTdGFydDogdGhldGFTdGFydCxcclxuXHRcdFx0dGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoXHJcblx0XHR9O1xyXG5cclxuXHRcdGNvbnN0IHNjb3BlID0gdGhpcztcclxuXHJcblx0XHRyYWRpYWxTZWdtZW50cyA9IE1hdGguZmxvb3IoIHJhZGlhbFNlZ21lbnRzICk7XHJcblx0XHRoZWlnaHRTZWdtZW50cyA9IE1hdGguZmxvb3IoIGhlaWdodFNlZ21lbnRzICk7XHJcblxyXG5cdFx0Ly8gYnVmZmVyc1xyXG5cclxuXHRcdGNvbnN0IGluZGljZXMgPSBbXTtcclxuXHRcdGNvbnN0IHZlcnRpY2VzID0gW107XHJcblx0XHRjb25zdCBub3JtYWxzID0gW107XHJcblx0XHRjb25zdCB1dnMgPSBbXTtcclxuXHJcblx0XHQvLyBoZWxwZXIgdmFyaWFibGVzXHJcblxyXG5cdFx0bGV0IGluZGV4ID0gMDtcclxuXHRcdGNvbnN0IGluZGV4QXJyYXkgPSBbXTtcclxuXHRcdGNvbnN0IGhhbGZIZWlnaHQgPSBoZWlnaHQgLyAyO1xyXG5cdFx0bGV0IGdyb3VwU3RhcnQgPSAwO1xyXG5cclxuXHRcdC8vIGdlbmVyYXRlIGdlb21ldHJ5XHJcblxyXG5cdFx0Z2VuZXJhdGVUb3JzbygpO1xyXG5cclxuXHRcdGlmICggb3BlbkVuZGVkID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdGlmICggcmFkaXVzVG9wID4gMCApIGdlbmVyYXRlQ2FwKCB0cnVlICk7XHJcblx0XHRcdGlmICggcmFkaXVzQm90dG9tID4gMCApIGdlbmVyYXRlQ2FwKCBmYWxzZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBidWlsZCBnZW9tZXRyeVxyXG5cclxuXHRcdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcclxuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xyXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XHJcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XHJcblxyXG5cdFx0ZnVuY3Rpb24gZ2VuZXJhdGVUb3JzbygpIHtcclxuXHJcblx0XHRcdGNvbnN0IG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XHJcblx0XHRcdGNvbnN0IHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XHJcblxyXG5cdFx0XHRsZXQgZ3JvdXBDb3VudCA9IDA7XHJcblxyXG5cdFx0XHQvLyB0aGlzIHdpbGwgYmUgdXNlZCB0byBjYWxjdWxhdGUgdGhlIG5vcm1hbFxyXG5cdFx0XHRjb25zdCBzbG9wZSA9ICggcmFkaXVzQm90dG9tIC0gcmFkaXVzVG9wICkgLyBoZWlnaHQ7XHJcblxyXG5cdFx0XHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzXHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgeSA9IDA7IHkgPD0gaGVpZ2h0U2VnbWVudHM7IHkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGluZGV4Um93ID0gW107XHJcblxyXG5cdFx0XHRcdGNvbnN0IHYgPSB5IC8gaGVpZ2h0U2VnbWVudHM7XHJcblxyXG5cdFx0XHRcdC8vIGNhbGN1bGF0ZSB0aGUgcmFkaXVzIG9mIHRoZSBjdXJyZW50IHJvd1xyXG5cclxuXHRcdFx0XHRjb25zdCByYWRpdXMgPSB2ICogKCByYWRpdXNCb3R0b20gLSByYWRpdXNUb3AgKSArIHJhZGl1c1RvcDtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IHggPSAwOyB4IDw9IHJhZGlhbFNlZ21lbnRzOyB4ICsrICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHUgPSB4IC8gcmFkaWFsU2VnbWVudHM7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgdGhldGEgPSB1ICogdGhldGFMZW5ndGggKyB0aGV0YVN0YXJ0O1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHNpblRoZXRhID0gTWF0aC5zaW4oIHRoZXRhICk7XHJcblx0XHRcdFx0XHRjb25zdCBjb3NUaGV0YSA9IE1hdGguY29zKCB0aGV0YSApO1xyXG5cclxuXHRcdFx0XHRcdC8vIHZlcnRleFxyXG5cclxuXHRcdFx0XHRcdHZlcnRleC54ID0gcmFkaXVzICogc2luVGhldGE7XHJcblx0XHRcdFx0XHR2ZXJ0ZXgueSA9IC0gdiAqIGhlaWdodCArIGhhbGZIZWlnaHQ7XHJcblx0XHRcdFx0XHR2ZXJ0ZXgueiA9IHJhZGl1cyAqIGNvc1RoZXRhO1xyXG5cdFx0XHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xyXG5cclxuXHRcdFx0XHRcdC8vIG5vcm1hbFxyXG5cclxuXHRcdFx0XHRcdG5vcm1hbC5zZXQoIHNpblRoZXRhLCBzbG9wZSwgY29zVGhldGEgKS5ub3JtYWxpemUoKTtcclxuXHRcdFx0XHRcdG5vcm1hbHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApO1xyXG5cclxuXHRcdFx0XHRcdC8vIHV2XHJcblxyXG5cdFx0XHRcdFx0dXZzLnB1c2goIHUsIDEgLSB2ICk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gc2F2ZSBpbmRleCBvZiB2ZXJ0ZXggaW4gcmVzcGVjdGl2ZSByb3dcclxuXHJcblx0XHRcdFx0XHRpbmRleFJvdy5wdXNoKCBpbmRleCArKyApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8vIG5vdyBzYXZlIHZlcnRpY2VzIG9mIHRoZSByb3cgaW4gb3VyIGluZGV4IGFycmF5XHJcblxyXG5cdFx0XHRcdGluZGV4QXJyYXkucHVzaCggaW5kZXhSb3cgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIGdlbmVyYXRlIGluZGljZXNcclxuXHJcblx0XHRcdGZvciAoIGxldCB4ID0gMDsgeCA8IHJhZGlhbFNlZ21lbnRzOyB4ICsrICkge1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgeSA9IDA7IHkgPCBoZWlnaHRTZWdtZW50czsgeSArKyApIHtcclxuXHJcblx0XHRcdFx0XHQvLyB3ZSB1c2UgdGhlIGluZGV4IGFycmF5IHRvIGFjY2VzcyB0aGUgY29ycmVjdCBpbmRpY2VzXHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgYSA9IGluZGV4QXJyYXlbIHkgXVsgeCBdO1xyXG5cdFx0XHRcdFx0Y29uc3QgYiA9IGluZGV4QXJyYXlbIHkgKyAxIF1bIHggXTtcclxuXHRcdFx0XHRcdGNvbnN0IGMgPSBpbmRleEFycmF5WyB5ICsgMSBdWyB4ICsgMSBdO1xyXG5cdFx0XHRcdFx0Y29uc3QgZCA9IGluZGV4QXJyYXlbIHkgXVsgeCArIDEgXTtcclxuXHJcblx0XHRcdFx0XHQvLyBmYWNlc1xyXG5cclxuXHRcdFx0XHRcdGlmICggcmFkaXVzVG9wID4gMCB8fCB5ICE9PSAwICkge1xyXG5cclxuXHRcdFx0XHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XHJcblx0XHRcdFx0XHRcdGdyb3VwQ291bnQgKz0gMztcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aWYgKCByYWRpdXNCb3R0b20gPiAwIHx8IHkgIT09IGhlaWdodFNlZ21lbnRzIC0gMSApIHtcclxuXHJcblx0XHRcdFx0XHRcdGluZGljZXMucHVzaCggYiwgYywgZCApO1xyXG5cdFx0XHRcdFx0XHRncm91cENvdW50ICs9IDM7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBhZGQgYSBncm91cCB0byB0aGUgZ2VvbWV0cnkuIHRoaXMgd2lsbCBlbnN1cmUgbXVsdGkgbWF0ZXJpYWwgc3VwcG9ydFxyXG5cclxuXHRcdFx0c2NvcGUuYWRkR3JvdXAoIGdyb3VwU3RhcnQsIGdyb3VwQ291bnQsIDAgKTtcclxuXHJcblx0XHRcdC8vIGNhbGN1bGF0ZSBuZXcgc3RhcnQgdmFsdWUgZm9yIGdyb3Vwc1xyXG5cclxuXHRcdFx0Z3JvdXBTdGFydCArPSBncm91cENvdW50O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiBnZW5lcmF0ZUNhcCggdG9wICkge1xyXG5cclxuXHRcdFx0Ly8gc2F2ZSB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNlbnRlciB2ZXJ0ZXhcclxuXHRcdFx0Y29uc3QgY2VudGVySW5kZXhTdGFydCA9IGluZGV4O1xyXG5cclxuXHRcdFx0Y29uc3QgdXYgPSBuZXcgVmVjdG9yMigpO1xyXG5cdFx0XHRjb25zdCB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xyXG5cclxuXHRcdFx0bGV0IGdyb3VwQ291bnQgPSAwO1xyXG5cclxuXHRcdFx0Y29uc3QgcmFkaXVzID0gKCB0b3AgPT09IHRydWUgKSA/IHJhZGl1c1RvcCA6IHJhZGl1c0JvdHRvbTtcclxuXHRcdFx0Y29uc3Qgc2lnbiA9ICggdG9wID09PSB0cnVlICkgPyAxIDogLSAxO1xyXG5cclxuXHRcdFx0Ly8gZmlyc3Qgd2UgZ2VuZXJhdGUgdGhlIGNlbnRlciB2ZXJ0ZXggZGF0YSBvZiB0aGUgY2FwLlxyXG5cdFx0XHQvLyBiZWNhdXNlIHRoZSBnZW9tZXRyeSBuZWVkcyBvbmUgc2V0IG9mIHV2cyBwZXIgZmFjZSxcclxuXHRcdFx0Ly8gd2UgbXVzdCBnZW5lcmF0ZSBhIGNlbnRlciB2ZXJ0ZXggcGVyIGZhY2Uvc2VnbWVudFxyXG5cclxuXHRcdFx0Zm9yICggbGV0IHggPSAxOyB4IDw9IHJhZGlhbFNlZ21lbnRzOyB4ICsrICkge1xyXG5cclxuXHRcdFx0XHQvLyB2ZXJ0ZXhcclxuXHJcblx0XHRcdFx0dmVydGljZXMucHVzaCggMCwgaGFsZkhlaWdodCAqIHNpZ24sIDAgKTtcclxuXHJcblx0XHRcdFx0Ly8gbm9ybWFsXHJcblxyXG5cdFx0XHRcdG5vcm1hbHMucHVzaCggMCwgc2lnbiwgMCApO1xyXG5cclxuXHRcdFx0XHQvLyB1dlxyXG5cclxuXHRcdFx0XHR1dnMucHVzaCggMC41LCAwLjUgKTtcclxuXHJcblx0XHRcdFx0Ly8gaW5jcmVhc2UgaW5kZXhcclxuXHJcblx0XHRcdFx0aW5kZXggKys7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBzYXZlIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBjZW50ZXIgdmVydGV4XHJcblx0XHRcdGNvbnN0IGNlbnRlckluZGV4RW5kID0gaW5kZXg7XHJcblxyXG5cdFx0XHQvLyBub3cgd2UgZ2VuZXJhdGUgdGhlIHN1cnJvdW5kaW5nIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnNcclxuXHJcblx0XHRcdGZvciAoIGxldCB4ID0gMDsgeCA8PSByYWRpYWxTZWdtZW50czsgeCArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgdSA9IHggLyByYWRpYWxTZWdtZW50cztcclxuXHRcdFx0XHRjb25zdCB0aGV0YSA9IHUgKiB0aGV0YUxlbmd0aCArIHRoZXRhU3RhcnQ7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGNvc1RoZXRhID0gTWF0aC5jb3MoIHRoZXRhICk7XHJcblx0XHRcdFx0Y29uc3Qgc2luVGhldGEgPSBNYXRoLnNpbiggdGhldGEgKTtcclxuXHJcblx0XHRcdFx0Ly8gdmVydGV4XHJcblxyXG5cdFx0XHRcdHZlcnRleC54ID0gcmFkaXVzICogc2luVGhldGE7XHJcblx0XHRcdFx0dmVydGV4LnkgPSBoYWxmSGVpZ2h0ICogc2lnbjtcclxuXHRcdFx0XHR2ZXJ0ZXgueiA9IHJhZGl1cyAqIGNvc1RoZXRhO1xyXG5cdFx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcclxuXHJcblx0XHRcdFx0Ly8gbm9ybWFsXHJcblxyXG5cdFx0XHRcdG5vcm1hbHMucHVzaCggMCwgc2lnbiwgMCApO1xyXG5cclxuXHRcdFx0XHQvLyB1dlxyXG5cclxuXHRcdFx0XHR1di54ID0gKCBjb3NUaGV0YSAqIDAuNSApICsgMC41O1xyXG5cdFx0XHRcdHV2LnkgPSAoIHNpblRoZXRhICogMC41ICogc2lnbiApICsgMC41O1xyXG5cdFx0XHRcdHV2cy5wdXNoKCB1di54LCB1di55ICk7XHJcblxyXG5cdFx0XHRcdC8vIGluY3JlYXNlIGluZGV4XHJcblxyXG5cdFx0XHRcdGluZGV4ICsrO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gZ2VuZXJhdGUgaW5kaWNlc1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IHggPSAwOyB4IDwgcmFkaWFsU2VnbWVudHM7IHggKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGMgPSBjZW50ZXJJbmRleFN0YXJ0ICsgeDtcclxuXHRcdFx0XHRjb25zdCBpID0gY2VudGVySW5kZXhFbmQgKyB4O1xyXG5cclxuXHRcdFx0XHRpZiAoIHRvcCA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0XHQvLyBmYWNlIHRvcFxyXG5cclxuXHRcdFx0XHRcdGluZGljZXMucHVzaCggaSwgaSArIDEsIGMgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHQvLyBmYWNlIGJvdHRvbVxyXG5cclxuXHRcdFx0XHRcdGluZGljZXMucHVzaCggaSArIDEsIGksIGMgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRncm91cENvdW50ICs9IDM7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBhZGQgYSBncm91cCB0byB0aGUgZ2VvbWV0cnkuIHRoaXMgd2lsbCBlbnN1cmUgbXVsdGkgbWF0ZXJpYWwgc3VwcG9ydFxyXG5cclxuXHRcdFx0c2NvcGUuYWRkR3JvdXAoIGdyb3VwU3RhcnQsIGdyb3VwQ291bnQsIHRvcCA9PT0gdHJ1ZSA/IDEgOiAyICk7XHJcblxyXG5cdFx0XHQvLyBjYWxjdWxhdGUgbmV3IHN0YXJ0IHZhbHVlIGZvciBncm91cHNcclxuXHJcblx0XHRcdGdyb3VwU3RhcnQgKz0gZ3JvdXBDb3VudDtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMucGFyYW1ldGVycyA9IE9iamVjdC5hc3NpZ24oIHt9LCBzb3VyY2UucGFyYW1ldGVycyApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGZyb20gdGhlIGdpdmVuXHJcblx0ICogSlNPTiBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIEEgSlNPTiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzZXJpYWxpemVkIGdlb21ldHJ5LlxyXG5cdCAqIEByZXR1cm4ge0N5bGluZGVyR2VvbWV0cnl9IEEgbmV3IGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBmcm9tSlNPTiggZGF0YSApIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IEN5bGluZGVyR2VvbWV0cnkoIGRhdGEucmFkaXVzVG9wLCBkYXRhLnJhZGl1c0JvdHRvbSwgZGF0YS5oZWlnaHQsIGRhdGEucmFkaWFsU2VnbWVudHMsIGRhdGEuaGVpZ2h0U2VnbWVudHMsIGRhdGEub3BlbkVuZGVkLCBkYXRhLnRoZXRhU3RhcnQsIGRhdGEudGhldGFMZW5ndGggKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCB7IEN5bGluZGVyR2VvbWV0cnkgfTtcclxuIiwiaW1wb3J0IHsgQ3lsaW5kZXJHZW9tZXRyeSB9IGZyb20gJy4vQ3lsaW5kZXJHZW9tZXRyeS5qcyc7XHJcblxyXG4vKipcclxuICogQSBnZW9tZXRyeSBjbGFzcyBmb3IgcmVwcmVzZW50aW5nIGEgY29uZS5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgZ2VvbWV0cnkgPSBuZXcgVEhSRUUuQ29uZUdlb21ldHJ5KCA1LCAyMCwgMzIgKTtcclxuICogY29uc3QgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IDB4ZmZmZjAwIH0gKTtcclxuICogY29uc3QgY29uZSA9IG5ldyBUSFJFRS5NZXNoKGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG4gKiBzY2VuZS5hZGQoIGNvbmUgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBDeWxpbmRlckdlb21ldHJ5XHJcbiAqL1xyXG5jbGFzcyBDb25lR2VvbWV0cnkgZXh0ZW5kcyBDeWxpbmRlckdlb21ldHJ5IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBjb25lIGdlb21ldHJ5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpdXM9MV0gLSBSYWRpdXMgb2YgdGhlIGNvbmUgYmFzZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2hlaWdodD0xXSAtIEhlaWdodCBvZiB0aGUgY29uZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3JhZGlhbFNlZ21lbnRzPTMyXSAtIE51bWJlciBvZiBzZWdtZW50ZWQgZmFjZXMgYXJvdW5kIHRoZSBjaXJjdW1mZXJlbmNlIG9mIHRoZSBjb25lLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbaGVpZ2h0U2VnbWVudHM9MV0gLSBOdW1iZXIgb2Ygcm93cyBvZiBmYWNlcyBhbG9uZyB0aGUgaGVpZ2h0IG9mIHRoZSBjb25lLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wZW5FbmRlZD1mYWxzZV0gLSBXaGV0aGVyIHRoZSBiYXNlIG9mIHRoZSBjb25lIGlzIG9wZW4gb3IgY2FwcGVkLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbdGhldGFTdGFydD0wXSAtIFN0YXJ0IGFuZ2xlIGZvciBmaXJzdCBzZWdtZW50LCBpbiByYWRpYW5zLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbdGhldGFMZW5ndGg9TWF0aC5QSSoyXSAtIFRoZSBjZW50cmFsIGFuZ2xlLCBvZnRlbiBjYWxsZWQgdGhldGEsIG9mIHRoZSBjaXJjdWxhciBzZWN0b3IsIGluIHJhZGlhbnMuXHJcblx0ICogVGhlIGRlZmF1bHQgdmFsdWUgcmVzdWx0cyBpbiBhIGNvbXBsZXRlIGNvbmUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHJhZGl1cyA9IDEsIGhlaWdodCA9IDEsIHJhZGlhbFNlZ21lbnRzID0gMzIsIGhlaWdodFNlZ21lbnRzID0gMSwgb3BlbkVuZGVkID0gZmFsc2UsIHRoZXRhU3RhcnQgPSAwLCB0aGV0YUxlbmd0aCA9IE1hdGguUEkgKiAyICkge1xyXG5cclxuXHRcdHN1cGVyKCAwLCByYWRpdXMsIGhlaWdodCwgcmFkaWFsU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBvcGVuRW5kZWQsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICk7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ0NvbmVHZW9tZXRyeSc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb2xkcyB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVycyB0aGF0IGhhdmUgYmVlblxyXG5cdFx0ICogdXNlZCB0byBnZW5lcmF0ZSB0aGUgZ2VvbWV0cnkuIEFueSBtb2RpZmljYXRpb25cclxuXHRcdCAqIGFmdGVyIGluc3RhbnRpYXRpb24gZG9lcyBub3QgY2hhbmdlIHRoZSBnZW9tZXRyeS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBhcmFtZXRlcnMgPSB7XHJcblx0XHRcdHJhZGl1czogcmFkaXVzLFxyXG5cdFx0XHRoZWlnaHQ6IGhlaWdodCxcclxuXHRcdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxyXG5cdFx0XHRoZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHMsXHJcblx0XHRcdG9wZW5FbmRlZDogb3BlbkVuZGVkLFxyXG5cdFx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxyXG5cdFx0XHR0aGV0YUxlbmd0aDogdGhldGFMZW5ndGhcclxuXHRcdH07XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRmFjdG9yeSBtZXRob2QgZm9yIGNyZWF0aW5nIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZnJvbSB0aGUgZ2l2ZW5cclxuXHQgKiBKU09OIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gQSBKU09OIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNlcmlhbGl6ZWQgZ2VvbWV0cnkuXHJcblx0ICogQHJldHVybiB7Q29uZUdlb21ldHJ5fSBBIG5ldyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzdGF0aWMgZnJvbUpTT04oIGRhdGEgKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBDb25lR2VvbWV0cnkoIGRhdGEucmFkaXVzLCBkYXRhLmhlaWdodCwgZGF0YS5yYWRpYWxTZWdtZW50cywgZGF0YS5oZWlnaHRTZWdtZW50cywgZGF0YS5vcGVuRW5kZWQsIGRhdGEudGhldGFTdGFydCwgZGF0YS50aGV0YUxlbmd0aCApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBDb25lR2VvbWV0cnkgfTtcclxuIiwiaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcclxuaW1wb3J0IHsgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyQXR0cmlidXRlLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjIuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgcG9seWhlZHJvbiBpcyBhIHNvbGlkIGluIHRocmVlIGRpbWVuc2lvbnMgd2l0aCBmbGF0IGZhY2VzLiBUaGlzIGNsYXNzXHJcbiAqIHdpbGwgdGFrZSBhbiBhcnJheSBvZiB2ZXJ0aWNlcywgcHJvamVjdCB0aGVtIG9udG8gYSBzcGhlcmUsIGFuZCB0aGVuXHJcbiAqIGRpdmlkZSB0aGVtIHVwIHRvIHRoZSBkZXNpcmVkIGxldmVsIG9mIGRldGFpbC5cclxuICpcclxuICogQGF1Z21lbnRzIEJ1ZmZlckdlb21ldHJ5XHJcbiAqL1xyXG5jbGFzcyBQb2x5aGVkcm9uR2VvbWV0cnkgZXh0ZW5kcyBCdWZmZXJHZW9tZXRyeSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcG9seWhlZHJvbiBnZW9tZXRyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gW3ZlcnRpY2VzXSAtIEEgZmxhdCBhcnJheSBvZiB2ZXJ0aWNlcyBkZXNjcmliaW5nIHRoZSBiYXNlIHNoYXBlLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gW2luZGljZXNdIC0gQSBmbGF0IGFycmF5IG9mIGluZGljZXMgZGVzY3JpYmluZyB0aGUgYmFzZSBzaGFwZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3JhZGl1cz0xXSAtIFRoZSByYWRpdXMgb2YgdGhlIHNoYXBlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZGV0YWlsPTBdIC0gSG93IG1hbnkgbGV2ZWxzIHRvIHN1YmRpdmlkZSB0aGUgZ2VvbWV0cnkuIFRoZSBtb3JlIGRldGFpbCwgdGhlIHNtb290aGVyIHRoZSBzaGFwZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggdmVydGljZXMgPSBbXSwgaW5kaWNlcyA9IFtdLCByYWRpdXMgPSAxLCBkZXRhaWwgPSAwICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ1BvbHloZWRyb25HZW9tZXRyeSc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb2xkcyB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVycyB0aGF0IGhhdmUgYmVlblxyXG5cdFx0ICogdXNlZCB0byBnZW5lcmF0ZSB0aGUgZ2VvbWV0cnkuIEFueSBtb2RpZmljYXRpb25cclxuXHRcdCAqIGFmdGVyIGluc3RhbnRpYXRpb24gZG9lcyBub3QgY2hhbmdlIHRoZSBnZW9tZXRyeS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBhcmFtZXRlcnMgPSB7XHJcblx0XHRcdHZlcnRpY2VzOiB2ZXJ0aWNlcyxcclxuXHRcdFx0aW5kaWNlczogaW5kaWNlcyxcclxuXHRcdFx0cmFkaXVzOiByYWRpdXMsXHJcblx0XHRcdGRldGFpbDogZGV0YWlsXHJcblx0XHR9O1xyXG5cclxuXHRcdC8vIGRlZmF1bHQgYnVmZmVyIGRhdGFcclxuXHJcblx0XHRjb25zdCB2ZXJ0ZXhCdWZmZXIgPSBbXTtcclxuXHRcdGNvbnN0IHV2QnVmZmVyID0gW107XHJcblxyXG5cdFx0Ly8gdGhlIHN1YmRpdmlzaW9uIGNyZWF0ZXMgdGhlIHZlcnRleCBidWZmZXIgZGF0YVxyXG5cclxuXHRcdHN1YmRpdmlkZSggZGV0YWlsICk7XHJcblxyXG5cdFx0Ly8gYWxsIHZlcnRpY2VzIHNob3VsZCBsaWUgb24gYSBjb25jZXB0dWFsIHNwaGVyZSB3aXRoIGEgZ2l2ZW4gcmFkaXVzXHJcblxyXG5cdFx0YXBwbHlSYWRpdXMoIHJhZGl1cyApO1xyXG5cclxuXHRcdC8vIGZpbmFsbHksIGNyZWF0ZSB0aGUgdXYgZGF0YVxyXG5cclxuXHRcdGdlbmVyYXRlVVZzKCk7XHJcblxyXG5cdFx0Ly8gYnVpbGQgbm9uLWluZGV4ZWQgZ2VvbWV0cnlcclxuXHJcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRleEJ1ZmZlciwgMyApICk7XHJcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0ZXhCdWZmZXIuc2xpY2UoKSwgMyApICk7XHJcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2QnVmZmVyLCAyICkgKTtcclxuXHJcblx0XHRpZiAoIGRldGFpbCA9PT0gMCApIHtcclxuXHJcblx0XHRcdHRoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTsgLy8gZmxhdCBub3JtYWxzXHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHRoaXMubm9ybWFsaXplTm9ybWFscygpOyAvLyBzbW9vdGggbm9ybWFsc1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBoZWxwZXIgZnVuY3Rpb25zXHJcblxyXG5cdFx0ZnVuY3Rpb24gc3ViZGl2aWRlKCBkZXRhaWwgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBhID0gbmV3IFZlY3RvcjMoKTtcclxuXHRcdFx0Y29uc3QgYiA9IG5ldyBWZWN0b3IzKCk7XHJcblx0XHRcdGNvbnN0IGMgPSBuZXcgVmVjdG9yMygpO1xyXG5cclxuXHRcdFx0Ly8gaXRlcmF0ZSBvdmVyIGFsbCBmYWNlcyBhbmQgYXBwbHkgYSBzdWJkaXZpc2lvbiB3aXRoIHRoZSBnaXZlbiBkZXRhaWwgdmFsdWVcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyBpICs9IDMgKSB7XHJcblxyXG5cdFx0XHRcdC8vIGdldCB0aGUgdmVydGljZXMgb2YgdGhlIGZhY2VcclxuXHJcblx0XHRcdFx0Z2V0VmVydGV4QnlJbmRleCggaW5kaWNlc1sgaSArIDAgXSwgYSApO1xyXG5cdFx0XHRcdGdldFZlcnRleEJ5SW5kZXgoIGluZGljZXNbIGkgKyAxIF0sIGIgKTtcclxuXHRcdFx0XHRnZXRWZXJ0ZXhCeUluZGV4KCBpbmRpY2VzWyBpICsgMiBdLCBjICk7XHJcblxyXG5cdFx0XHRcdC8vIHBlcmZvcm0gc3ViZGl2aXNpb25cclxuXHJcblx0XHRcdFx0c3ViZGl2aWRlRmFjZSggYSwgYiwgYywgZGV0YWlsICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIHN1YmRpdmlkZUZhY2UoIGEsIGIsIGMsIGRldGFpbCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGNvbHMgPSBkZXRhaWwgKyAxO1xyXG5cclxuXHRcdFx0Ly8gd2UgdXNlIHRoaXMgbXVsdGlkaW1lbnNpb25hbCBhcnJheSBhcyBhIGRhdGEgc3RydWN0dXJlIGZvciBjcmVhdGluZyB0aGUgc3ViZGl2aXNpb25cclxuXHJcblx0XHRcdGNvbnN0IHYgPSBbXTtcclxuXHJcblx0XHRcdC8vIGNvbnN0cnVjdCBhbGwgb2YgdGhlIHZlcnRpY2VzIGZvciB0aGlzIHN1YmRpdmlzaW9uXHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPD0gY29sczsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0dlsgaSBdID0gW107XHJcblxyXG5cdFx0XHRcdGNvbnN0IGFqID0gYS5jbG9uZSgpLmxlcnAoIGMsIGkgLyBjb2xzICk7XHJcblx0XHRcdFx0Y29uc3QgYmogPSBiLmNsb25lKCkubGVycCggYywgaSAvIGNvbHMgKTtcclxuXHJcblx0XHRcdFx0Y29uc3Qgcm93cyA9IGNvbHMgLSBpO1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaiA9IDA7IGogPD0gcm93czsgaiArKyApIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGogPT09IDAgJiYgaSA9PT0gY29scyApIHtcclxuXHJcblx0XHRcdFx0XHRcdHZbIGkgXVsgaiBdID0gYWo7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdHZbIGkgXVsgaiBdID0gYWouY2xvbmUoKS5sZXJwKCBiaiwgaiAvIHJvd3MgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIGNvbnN0cnVjdCBhbGwgb2YgdGhlIGZhY2VzXHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBjb2xzOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaiA9IDA7IGogPCAyICogKCBjb2xzIC0gaSApIC0gMTsgaiArKyApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBrID0gTWF0aC5mbG9vciggaiAvIDIgKTtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGogJSAyID09PSAwICkge1xyXG5cclxuXHRcdFx0XHRcdFx0cHVzaFZlcnRleCggdlsgaSBdWyBrICsgMSBdICk7XHJcblx0XHRcdFx0XHRcdHB1c2hWZXJ0ZXgoIHZbIGkgKyAxIF1bIGsgXSApO1xyXG5cdFx0XHRcdFx0XHRwdXNoVmVydGV4KCB2WyBpIF1bIGsgXSApO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRwdXNoVmVydGV4KCB2WyBpIF1bIGsgKyAxIF0gKTtcclxuXHRcdFx0XHRcdFx0cHVzaFZlcnRleCggdlsgaSArIDEgXVsgayArIDEgXSApO1xyXG5cdFx0XHRcdFx0XHRwdXNoVmVydGV4KCB2WyBpICsgMSBdWyBrIF0gKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0ZnVuY3Rpb24gYXBwbHlSYWRpdXMoIHJhZGl1cyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XHJcblxyXG5cdFx0XHQvLyBpdGVyYXRlIG92ZXIgdGhlIGVudGlyZSBidWZmZXIgYW5kIGFwcGx5IHRoZSByYWRpdXMgdG8gZWFjaCB2ZXJ0ZXhcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHZlcnRleEJ1ZmZlci5sZW5ndGg7IGkgKz0gMyApIHtcclxuXHJcblx0XHRcdFx0dmVydGV4LnggPSB2ZXJ0ZXhCdWZmZXJbIGkgKyAwIF07XHJcblx0XHRcdFx0dmVydGV4LnkgPSB2ZXJ0ZXhCdWZmZXJbIGkgKyAxIF07XHJcblx0XHRcdFx0dmVydGV4LnogPSB2ZXJ0ZXhCdWZmZXJbIGkgKyAyIF07XHJcblxyXG5cdFx0XHRcdHZlcnRleC5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhciggcmFkaXVzICk7XHJcblxyXG5cdFx0XHRcdHZlcnRleEJ1ZmZlclsgaSArIDAgXSA9IHZlcnRleC54O1xyXG5cdFx0XHRcdHZlcnRleEJ1ZmZlclsgaSArIDEgXSA9IHZlcnRleC55O1xyXG5cdFx0XHRcdHZlcnRleEJ1ZmZlclsgaSArIDIgXSA9IHZlcnRleC56O1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiBnZW5lcmF0ZVVWcygpIHtcclxuXHJcblx0XHRcdGNvbnN0IHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB2ZXJ0ZXhCdWZmZXIubGVuZ3RoOyBpICs9IDMgKSB7XHJcblxyXG5cdFx0XHRcdHZlcnRleC54ID0gdmVydGV4QnVmZmVyWyBpICsgMCBdO1xyXG5cdFx0XHRcdHZlcnRleC55ID0gdmVydGV4QnVmZmVyWyBpICsgMSBdO1xyXG5cdFx0XHRcdHZlcnRleC56ID0gdmVydGV4QnVmZmVyWyBpICsgMiBdO1xyXG5cclxuXHRcdFx0XHRjb25zdCB1ID0gYXppbXV0aCggdmVydGV4ICkgLyAyIC8gTWF0aC5QSSArIDAuNTtcclxuXHRcdFx0XHRjb25zdCB2ID0gaW5jbGluYXRpb24oIHZlcnRleCApIC8gTWF0aC5QSSArIDAuNTtcclxuXHRcdFx0XHR1dkJ1ZmZlci5wdXNoKCB1LCAxIC0gdiApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29ycmVjdFVWcygpO1xyXG5cclxuXHRcdFx0Y29ycmVjdFNlYW0oKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0ZnVuY3Rpb24gY29ycmVjdFNlYW0oKSB7XHJcblxyXG5cdFx0XHQvLyBoYW5kbGUgY2FzZSB3aGVuIGZhY2Ugc3RyYWRkbGVzIHRoZSBzZWFtLCBzZWUgIzMyNjlcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHV2QnVmZmVyLmxlbmd0aDsgaSArPSA2ICkge1xyXG5cclxuXHRcdFx0XHQvLyB1diBkYXRhIG9mIGEgc2luZ2xlIGZhY2VcclxuXHJcblx0XHRcdFx0Y29uc3QgeDAgPSB1dkJ1ZmZlclsgaSArIDAgXTtcclxuXHRcdFx0XHRjb25zdCB4MSA9IHV2QnVmZmVyWyBpICsgMiBdO1xyXG5cdFx0XHRcdGNvbnN0IHgyID0gdXZCdWZmZXJbIGkgKyA0IF07XHJcblxyXG5cdFx0XHRcdGNvbnN0IG1heCA9IE1hdGgubWF4KCB4MCwgeDEsIHgyICk7XHJcblx0XHRcdFx0Y29uc3QgbWluID0gTWF0aC5taW4oIHgwLCB4MSwgeDIgKTtcclxuXHJcblx0XHRcdFx0Ly8gMC45IGlzIHNvbWV3aGF0IGFyYml0cmFyeVxyXG5cclxuXHRcdFx0XHRpZiAoIG1heCA+IDAuOSAmJiBtaW4gPCAwLjEgKSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCB4MCA8IDAuMiApIHV2QnVmZmVyWyBpICsgMCBdICs9IDE7XHJcblx0XHRcdFx0XHRpZiAoIHgxIDwgMC4yICkgdXZCdWZmZXJbIGkgKyAyIF0gKz0gMTtcclxuXHRcdFx0XHRcdGlmICggeDIgPCAwLjIgKSB1dkJ1ZmZlclsgaSArIDQgXSArPSAxO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIHB1c2hWZXJ0ZXgoIHZlcnRleCApIHtcclxuXHJcblx0XHRcdHZlcnRleEJ1ZmZlci5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIGdldFZlcnRleEJ5SW5kZXgoIGluZGV4LCB2ZXJ0ZXggKSB7XHJcblxyXG5cdFx0XHRjb25zdCBzdHJpZGUgPSBpbmRleCAqIDM7XHJcblxyXG5cdFx0XHR2ZXJ0ZXgueCA9IHZlcnRpY2VzWyBzdHJpZGUgKyAwIF07XHJcblx0XHRcdHZlcnRleC55ID0gdmVydGljZXNbIHN0cmlkZSArIDEgXTtcclxuXHRcdFx0dmVydGV4LnogPSB2ZXJ0aWNlc1sgc3RyaWRlICsgMiBdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiBjb3JyZWN0VVZzKCkge1xyXG5cclxuXHRcdFx0Y29uc3QgYSA9IG5ldyBWZWN0b3IzKCk7XHJcblx0XHRcdGNvbnN0IGIgPSBuZXcgVmVjdG9yMygpO1xyXG5cdFx0XHRjb25zdCBjID0gbmV3IFZlY3RvcjMoKTtcclxuXHJcblx0XHRcdGNvbnN0IGNlbnRyb2lkID0gbmV3IFZlY3RvcjMoKTtcclxuXHJcblx0XHRcdGNvbnN0IHV2QSA9IG5ldyBWZWN0b3IyKCk7XHJcblx0XHRcdGNvbnN0IHV2QiA9IG5ldyBWZWN0b3IyKCk7XHJcblx0XHRcdGNvbnN0IHV2QyA9IG5ldyBWZWN0b3IyKCk7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGogPSAwOyBpIDwgdmVydGV4QnVmZmVyLmxlbmd0aDsgaSArPSA5LCBqICs9IDYgKSB7XHJcblxyXG5cdFx0XHRcdGEuc2V0KCB2ZXJ0ZXhCdWZmZXJbIGkgKyAwIF0sIHZlcnRleEJ1ZmZlclsgaSArIDEgXSwgdmVydGV4QnVmZmVyWyBpICsgMiBdICk7XHJcblx0XHRcdFx0Yi5zZXQoIHZlcnRleEJ1ZmZlclsgaSArIDMgXSwgdmVydGV4QnVmZmVyWyBpICsgNCBdLCB2ZXJ0ZXhCdWZmZXJbIGkgKyA1IF0gKTtcclxuXHRcdFx0XHRjLnNldCggdmVydGV4QnVmZmVyWyBpICsgNiBdLCB2ZXJ0ZXhCdWZmZXJbIGkgKyA3IF0sIHZlcnRleEJ1ZmZlclsgaSArIDggXSApO1xyXG5cclxuXHRcdFx0XHR1dkEuc2V0KCB1dkJ1ZmZlclsgaiArIDAgXSwgdXZCdWZmZXJbIGogKyAxIF0gKTtcclxuXHRcdFx0XHR1dkIuc2V0KCB1dkJ1ZmZlclsgaiArIDIgXSwgdXZCdWZmZXJbIGogKyAzIF0gKTtcclxuXHRcdFx0XHR1dkMuc2V0KCB1dkJ1ZmZlclsgaiArIDQgXSwgdXZCdWZmZXJbIGogKyA1IF0gKTtcclxuXHJcblx0XHRcdFx0Y2VudHJvaWQuY29weSggYSApLmFkZCggYiApLmFkZCggYyApLmRpdmlkZVNjYWxhciggMyApO1xyXG5cclxuXHRcdFx0XHRjb25zdCBhemkgPSBhemltdXRoKCBjZW50cm9pZCApO1xyXG5cclxuXHRcdFx0XHRjb3JyZWN0VVYoIHV2QSwgaiArIDAsIGEsIGF6aSApO1xyXG5cdFx0XHRcdGNvcnJlY3RVViggdXZCLCBqICsgMiwgYiwgYXppICk7XHJcblx0XHRcdFx0Y29ycmVjdFVWKCB1dkMsIGogKyA0LCBjLCBhemkgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0ZnVuY3Rpb24gY29ycmVjdFVWKCB1diwgc3RyaWRlLCB2ZWN0b3IsIGF6aW11dGggKSB7XHJcblxyXG5cdFx0XHRpZiAoICggYXppbXV0aCA8IDAgKSAmJiAoIHV2LnggPT09IDEgKSApIHtcclxuXHJcblx0XHRcdFx0dXZCdWZmZXJbIHN0cmlkZSBdID0gdXYueCAtIDE7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoICggdmVjdG9yLnggPT09IDAgKSAmJiAoIHZlY3Rvci56ID09PSAwICkgKSB7XHJcblxyXG5cdFx0XHRcdHV2QnVmZmVyWyBzdHJpZGUgXSA9IGF6aW11dGggLyAyIC8gTWF0aC5QSSArIDAuNTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQW5nbGUgYXJvdW5kIHRoZSBZIGF4aXMsIGNvdW50ZXItY2xvY2t3aXNlIHdoZW4gbG9va2luZyBmcm9tIGFib3ZlLlxyXG5cclxuXHRcdGZ1bmN0aW9uIGF6aW11dGgoIHZlY3RvciApIHtcclxuXHJcblx0XHRcdHJldHVybiBNYXRoLmF0YW4yKCB2ZWN0b3IueiwgLSB2ZWN0b3IueCApO1xyXG5cclxuXHRcdH1cclxuXHJcblxyXG5cdFx0Ly8gQW5nbGUgYWJvdmUgdGhlIFhaIHBsYW5lLlxyXG5cclxuXHRcdGZ1bmN0aW9uIGluY2xpbmF0aW9uKCB2ZWN0b3IgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gTWF0aC5hdGFuMiggLSB2ZWN0b3IueSwgTWF0aC5zcXJ0KCAoIHZlY3Rvci54ICogdmVjdG9yLnggKSArICggdmVjdG9yLnogKiB2ZWN0b3IueiApICkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMucGFyYW1ldGVycyA9IE9iamVjdC5hc3NpZ24oIHt9LCBzb3VyY2UucGFyYW1ldGVycyApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGZyb20gdGhlIGdpdmVuXHJcblx0ICogSlNPTiBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIEEgSlNPTiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzZXJpYWxpemVkIGdlb21ldHJ5LlxyXG5cdCAqIEByZXR1cm4ge1BvbHloZWRyb25HZW9tZXRyeX0gQSBuZXcgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c3RhdGljIGZyb21KU09OKCBkYXRhICkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgUG9seWhlZHJvbkdlb21ldHJ5KCBkYXRhLnZlcnRpY2VzLCBkYXRhLmluZGljZXMsIGRhdGEucmFkaXVzLCBkYXRhLmRldGFpbHMgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgUG9seWhlZHJvbkdlb21ldHJ5IH07XHJcbiIsImltcG9ydCB7IFBvbHloZWRyb25HZW9tZXRyeSB9IGZyb20gJy4vUG9seWhlZHJvbkdlb21ldHJ5LmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIGdlb21ldHJ5IGNsYXNzIGZvciByZXByZXNlbnRpbmcgYSBkb2RlY2FoZWRyb24uXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGdlb21ldHJ5ID0gbmV3IFRIUkVFLkRvZGVjYWhlZHJvbkdlb21ldHJ5KCk7XHJcbiAqIGNvbnN0IG1hdGVyaWFsID0gbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiAweGZmZmYwMCB9ICk7XHJcbiAqIGNvbnN0IGRvZGVjYWhlZHJvbiA9IG5ldyBUSFJFRS5NZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuICogc2NlbmUuYWRkKCBkb2RlY2FoZWRyb24gKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBQb2x5aGVkcm9uR2VvbWV0cnlcclxuICovXHJcbmNsYXNzIERvZGVjYWhlZHJvbkdlb21ldHJ5IGV4dGVuZHMgUG9seWhlZHJvbkdlb21ldHJ5IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBkb2RlY2FoZWRyb24gZ2VvbWV0cnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3JhZGl1cz0xXSAtIFJhZGl1cyBvZiB0aGUgZG9kZWNhaGVkcm9uLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZGV0YWlsPTBdIC0gU2V0dGluZyB0aGlzIHRvIGEgdmFsdWUgZ3JlYXRlciB0aGFuIGAwYCBhZGRzIHZlcnRpY2VzIG1ha2luZyBpdCBubyBsb25nZXIgYSBkb2RlY2FoZWRyb24uXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHJhZGl1cyA9IDEsIGRldGFpbCA9IDAgKSB7XHJcblxyXG5cdFx0Y29uc3QgdCA9ICggMSArIE1hdGguc3FydCggNSApICkgLyAyO1xyXG5cdFx0Y29uc3QgciA9IDEgLyB0O1xyXG5cclxuXHRcdGNvbnN0IHZlcnRpY2VzID0gW1xyXG5cclxuXHRcdFx0Ly8gKMKxMSwgwrExLCDCsTEpXHJcblx0XHRcdC0gMSwgLSAxLCAtIDEsXHQtIDEsIC0gMSwgMSxcclxuXHRcdFx0LSAxLCAxLCAtIDEsIC0gMSwgMSwgMSxcclxuXHRcdFx0MSwgLSAxLCAtIDEsIDEsIC0gMSwgMSxcclxuXHRcdFx0MSwgMSwgLSAxLCAxLCAxLCAxLFxyXG5cclxuXHRcdFx0Ly8gKDAsIMKxMS/PhiwgwrHPhilcclxuXHRcdFx0MCwgLSByLCAtIHQsIDAsIC0gciwgdCxcclxuXHRcdFx0MCwgciwgLSB0LCAwLCByLCB0LFxyXG5cclxuXHRcdFx0Ly8gKMKxMS/PhiwgwrHPhiwgMClcclxuXHRcdFx0LSByLCAtIHQsIDAsIC0gciwgdCwgMCxcclxuXHRcdFx0ciwgLSB0LCAwLCByLCB0LCAwLFxyXG5cclxuXHRcdFx0Ly8gKMKxz4YsIDAsIMKxMS/PhilcclxuXHRcdFx0LSB0LCAwLCAtIHIsIHQsIDAsIC0gcixcclxuXHRcdFx0LSB0LCAwLCByLCB0LCAwLCByXHJcblx0XHRdO1xyXG5cclxuXHRcdGNvbnN0IGluZGljZXMgPSBbXHJcblx0XHRcdDMsIDExLCA3LCBcdDMsIDcsIDE1LCBcdDMsIDE1LCAxMyxcclxuXHRcdFx0NywgMTksIDE3LCBcdDcsIDE3LCA2LCBcdDcsIDYsIDE1LFxyXG5cdFx0XHQxNywgNCwgOCwgXHQxNywgOCwgMTAsIFx0MTcsIDEwLCA2LFxyXG5cdFx0XHQ4LCAwLCAxNiwgXHQ4LCAxNiwgMiwgXHQ4LCAyLCAxMCxcclxuXHRcdFx0MCwgMTIsIDEsIFx0MCwgMSwgMTgsIFx0MCwgMTgsIDE2LFxyXG5cdFx0XHQ2LCAxMCwgMiwgXHQ2LCAyLCAxMywgXHQ2LCAxMywgMTUsXHJcblx0XHRcdDIsIDE2LCAxOCwgXHQyLCAxOCwgMywgXHQyLCAzLCAxMyxcclxuXHRcdFx0MTgsIDEsIDksIFx0MTgsIDksIDExLCBcdDE4LCAxMSwgMyxcclxuXHRcdFx0NCwgMTQsIDEyLCBcdDQsIDEyLCAwLCBcdDQsIDAsIDgsXHJcblx0XHRcdDExLCA5LCA1LCBcdDExLCA1LCAxOSwgXHQxMSwgMTksIDcsXHJcblx0XHRcdDE5LCA1LCAxNCwgXHQxOSwgMTQsIDQsIFx0MTksIDQsIDE3LFxyXG5cdFx0XHQxLCAxMiwgMTQsIFx0MSwgMTQsIDUsIFx0MSwgNSwgOVxyXG5cdFx0XTtcclxuXHJcblx0XHRzdXBlciggdmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWlsICk7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ0RvZGVjYWhlZHJvbkdlb21ldHJ5JztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvbGRzIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzIHRoYXQgaGF2ZSBiZWVuXHJcblx0XHQgKiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBnZW9tZXRyeS4gQW55IG1vZGlmaWNhdGlvblxyXG5cdFx0ICogYWZ0ZXIgaW5zdGFudGlhdGlvbiBkb2VzIG5vdCBjaGFuZ2UgdGhlIGdlb21ldHJ5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucGFyYW1ldGVycyA9IHtcclxuXHRcdFx0cmFkaXVzOiByYWRpdXMsXHJcblx0XHRcdGRldGFpbDogZGV0YWlsXHJcblx0XHR9O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGZyb20gdGhlIGdpdmVuXHJcblx0ICogSlNPTiBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIEEgSlNPTiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzZXJpYWxpemVkIGdlb21ldHJ5LlxyXG5cdCAqIEByZXR1cm4ge0RvZGVjYWhlZHJvbkdlb21ldHJ5fSBBIG5ldyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzdGF0aWMgZnJvbUpTT04oIGRhdGEgKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBEb2RlY2FoZWRyb25HZW9tZXRyeSggZGF0YS5yYWRpdXMsIGRhdGEuZGV0YWlsICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBEb2RlY2FoZWRyb25HZW9tZXRyeSB9O1xyXG4iLCJpbXBvcnQgeyBCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyR2VvbWV0cnkuanMnO1xyXG5pbXBvcnQgeyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5pbXBvcnQgeyBERUcyUkFEIH0gZnJvbSAnLi4vbWF0aC9NYXRoVXRpbHMuanMnO1xyXG5pbXBvcnQgeyBUcmlhbmdsZSB9IGZyb20gJy4uL21hdGgvVHJpYW5nbGUuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuXHJcbmNvbnN0IF92MCA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX3YxID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfbm9ybWFsID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfdHJpYW5nbGUgPSAvKkBfX1BVUkVfXyovIG5ldyBUcmlhbmdsZSgpO1xyXG5cclxuLyoqXHJcbiAqIENhbiBiZSB1c2VkIGFzIGEgaGVscGVyIG9iamVjdCB0byB2aWV3IHRoZSBlZGdlcyBvZiBhIGdlb21ldHJ5LlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBnZW9tZXRyeSA9IG5ldyBUSFJFRS5Cb3hHZW9tZXRyeSgpO1xyXG4gKiBjb25zdCBlZGdlcyA9IG5ldyBUSFJFRS5FZGdlc0dlb21ldHJ5KCBnZW9tZXRyeSApO1xyXG4gKiBjb25zdCBsaW5lID0gbmV3IFRIUkVFLkxpbmVTZWdtZW50cyggZWRnZXMgKTtcclxuICogc2NlbmUuYWRkKCBsaW5lICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBOb3RlOiBJdCBpcyBub3QgeWV0IHBvc3NpYmxlIHRvIHNlcmlhbGl6ZS9kZXNlcmlhbGl6ZSBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcy5cclxuICpcclxuICogQGF1Z21lbnRzIEJ1ZmZlckdlb21ldHJ5XHJcbiAqL1xyXG5jbGFzcyBFZGdlc0dlb21ldHJ5IGV4dGVuZHMgQnVmZmVyR2VvbWV0cnkge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGVkZ2VzIGdlb21ldHJ5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHs/QnVmZmVyR2VvbWV0cnl9IFtnZW9tZXRyeT1udWxsXSAtIFRoZSBnZW9tZXRyeS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3RocmVzaG9sZEFuZ2xlPTFdIC0gQW4gZWRnZSBpcyBvbmx5IHJlbmRlcmVkIGlmIHRoZSBhbmdsZSAoaW4gZGVncmVlcylcclxuXHQgKiBiZXR3ZWVuIHRoZSBmYWNlIG5vcm1hbHMgb2YgdGhlIGFkam9pbmluZyBmYWNlcyBleGNlZWRzIHRoaXMgdmFsdWUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGdlb21ldHJ5ID0gbnVsbCwgdGhyZXNob2xkQW5nbGUgPSAxICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ0VkZ2VzR2VvbWV0cnknO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG9sZHMgdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMgdGhhdCBoYXZlIGJlZW5cclxuXHRcdCAqIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGdlb21ldHJ5LiBBbnkgbW9kaWZpY2F0aW9uXHJcblx0XHQgKiBhZnRlciBpbnN0YW50aWF0aW9uIGRvZXMgbm90IGNoYW5nZSB0aGUgZ2VvbWV0cnkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0ge1xyXG5cdFx0XHRnZW9tZXRyeTogZ2VvbWV0cnksXHJcblx0XHRcdHRocmVzaG9sZEFuZ2xlOiB0aHJlc2hvbGRBbmdsZVxyXG5cdFx0fTtcclxuXHJcblx0XHRpZiAoIGdlb21ldHJ5ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0Y29uc3QgcHJlY2lzaW9uUG9pbnRzID0gNDtcclxuXHRcdFx0Y29uc3QgcHJlY2lzaW9uID0gTWF0aC5wb3coIDEwLCBwcmVjaXNpb25Qb2ludHMgKTtcclxuXHRcdFx0Y29uc3QgdGhyZXNob2xkRG90ID0gTWF0aC5jb3MoIERFRzJSQUQgKiB0aHJlc2hvbGRBbmdsZSApO1xyXG5cclxuXHRcdFx0Y29uc3QgaW5kZXhBdHRyID0gZ2VvbWV0cnkuZ2V0SW5kZXgoKTtcclxuXHRcdFx0Y29uc3QgcG9zaXRpb25BdHRyID0gZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCAncG9zaXRpb24nICk7XHJcblx0XHRcdGNvbnN0IGluZGV4Q291bnQgPSBpbmRleEF0dHIgPyBpbmRleEF0dHIuY291bnQgOiBwb3NpdGlvbkF0dHIuY291bnQ7XHJcblxyXG5cdFx0XHRjb25zdCBpbmRleEFyciA9IFsgMCwgMCwgMCBdO1xyXG5cdFx0XHRjb25zdCB2ZXJ0S2V5cyA9IFsgJ2EnLCAnYicsICdjJyBdO1xyXG5cdFx0XHRjb25zdCBoYXNoZXMgPSBuZXcgQXJyYXkoIDMgKTtcclxuXHJcblx0XHRcdGNvbnN0IGVkZ2VEYXRhID0ge307XHJcblx0XHRcdGNvbnN0IHZlcnRpY2VzID0gW107XHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGluZGV4Q291bnQ7IGkgKz0gMyApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBpbmRleEF0dHIgKSB7XHJcblxyXG5cdFx0XHRcdFx0aW5kZXhBcnJbIDAgXSA9IGluZGV4QXR0ci5nZXRYKCBpICk7XHJcblx0XHRcdFx0XHRpbmRleEFyclsgMSBdID0gaW5kZXhBdHRyLmdldFgoIGkgKyAxICk7XHJcblx0XHRcdFx0XHRpbmRleEFyclsgMiBdID0gaW5kZXhBdHRyLmdldFgoIGkgKyAyICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0aW5kZXhBcnJbIDAgXSA9IGk7XHJcblx0XHRcdFx0XHRpbmRleEFyclsgMSBdID0gaSArIDE7XHJcblx0XHRcdFx0XHRpbmRleEFyclsgMiBdID0gaSArIDI7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Y29uc3QgeyBhLCBiLCBjIH0gPSBfdHJpYW5nbGU7XHJcblx0XHRcdFx0YS5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbkF0dHIsIGluZGV4QXJyWyAwIF0gKTtcclxuXHRcdFx0XHRiLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uQXR0ciwgaW5kZXhBcnJbIDEgXSApO1xyXG5cdFx0XHRcdGMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyLCBpbmRleEFyclsgMiBdICk7XHJcblx0XHRcdFx0X3RyaWFuZ2xlLmdldE5vcm1hbCggX25vcm1hbCApO1xyXG5cclxuXHRcdFx0XHQvLyBjcmVhdGUgaGFzaGVzIGZvciB0aGUgZWRnZSBmcm9tIHRoZSB2ZXJ0aWNlc1xyXG5cdFx0XHRcdGhhc2hlc1sgMCBdID0gYCR7IE1hdGgucm91bmQoIGEueCAqIHByZWNpc2lvbiApIH0sJHsgTWF0aC5yb3VuZCggYS55ICogcHJlY2lzaW9uICkgfSwkeyBNYXRoLnJvdW5kKCBhLnogKiBwcmVjaXNpb24gKSB9YDtcclxuXHRcdFx0XHRoYXNoZXNbIDEgXSA9IGAkeyBNYXRoLnJvdW5kKCBiLnggKiBwcmVjaXNpb24gKSB9LCR7IE1hdGgucm91bmQoIGIueSAqIHByZWNpc2lvbiApIH0sJHsgTWF0aC5yb3VuZCggYi56ICogcHJlY2lzaW9uICkgfWA7XHJcblx0XHRcdFx0aGFzaGVzWyAyIF0gPSBgJHsgTWF0aC5yb3VuZCggYy54ICogcHJlY2lzaW9uICkgfSwkeyBNYXRoLnJvdW5kKCBjLnkgKiBwcmVjaXNpb24gKSB9LCR7IE1hdGgucm91bmQoIGMueiAqIHByZWNpc2lvbiApIH1gO1xyXG5cclxuXHRcdFx0XHQvLyBza2lwIGRlZ2VuZXJhdGUgdHJpYW5nbGVzXHJcblx0XHRcdFx0aWYgKCBoYXNoZXNbIDAgXSA9PT0gaGFzaGVzWyAxIF0gfHwgaGFzaGVzWyAxIF0gPT09IGhhc2hlc1sgMiBdIHx8IGhhc2hlc1sgMiBdID09PSBoYXNoZXNbIDAgXSApIHtcclxuXHJcblx0XHRcdFx0XHRjb250aW51ZTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyBpdGVyYXRlIG92ZXIgZXZlcnkgZWRnZVxyXG5cdFx0XHRcdGZvciAoIGxldCBqID0gMDsgaiA8IDM7IGogKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gZ2V0IHRoZSBmaXJzdCBhbmQgbmV4dCB2ZXJ0ZXggbWFraW5nIHVwIHRoZSBlZGdlXHJcblx0XHRcdFx0XHRjb25zdCBqTmV4dCA9ICggaiArIDEgKSAlIDM7XHJcblx0XHRcdFx0XHRjb25zdCB2ZWNIYXNoMCA9IGhhc2hlc1sgaiBdO1xyXG5cdFx0XHRcdFx0Y29uc3QgdmVjSGFzaDEgPSBoYXNoZXNbIGpOZXh0IF07XHJcblx0XHRcdFx0XHRjb25zdCB2MCA9IF90cmlhbmdsZVsgdmVydEtleXNbIGogXSBdO1xyXG5cdFx0XHRcdFx0Y29uc3QgdjEgPSBfdHJpYW5nbGVbIHZlcnRLZXlzWyBqTmV4dCBdIF07XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgaGFzaCA9IGAkeyB2ZWNIYXNoMCB9XyR7IHZlY0hhc2gxIH1gO1xyXG5cdFx0XHRcdFx0Y29uc3QgcmV2ZXJzZUhhc2ggPSBgJHsgdmVjSGFzaDEgfV8keyB2ZWNIYXNoMCB9YDtcclxuXHJcblx0XHRcdFx0XHRpZiAoIHJldmVyc2VIYXNoIGluIGVkZ2VEYXRhICYmIGVkZ2VEYXRhWyByZXZlcnNlSGFzaCBdICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Ly8gaWYgd2UgZm91bmQgYSBzaWJsaW5nIGVkZ2UgYWRkIGl0IGludG8gdGhlIHZlcnRleCBhcnJheSBpZlxyXG5cdFx0XHRcdFx0XHQvLyBpdCBtZWV0cyB0aGUgYW5nbGUgdGhyZXNob2xkIGFuZCBkZWxldGUgdGhlIGVkZ2UgZnJvbSB0aGUgbWFwLlxyXG5cdFx0XHRcdFx0XHRpZiAoIF9ub3JtYWwuZG90KCBlZGdlRGF0YVsgcmV2ZXJzZUhhc2ggXS5ub3JtYWwgKSA8PSB0aHJlc2hvbGREb3QgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdHZlcnRpY2VzLnB1c2goIHYwLngsIHYwLnksIHYwLnogKTtcclxuXHRcdFx0XHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2MS54LCB2MS55LCB2MS56ICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRlZGdlRGF0YVsgcmV2ZXJzZUhhc2ggXSA9IG51bGw7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIGlmICggISAoIGhhc2ggaW4gZWRnZURhdGEgKSApIHtcclxuXHJcblx0XHRcdFx0XHRcdC8vIGlmIHdlJ3ZlIGFscmVhZHkgZ290IGFuIGVkZ2UgaGVyZSB0aGVuIHNraXAgYWRkaW5nIGEgbmV3IG9uZVxyXG5cdFx0XHRcdFx0XHRlZGdlRGF0YVsgaGFzaCBdID0ge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpbmRleDA6IGluZGV4QXJyWyBqIF0sXHJcblx0XHRcdFx0XHRcdFx0aW5kZXgxOiBpbmRleEFyclsgak5leHQgXSxcclxuXHRcdFx0XHRcdFx0XHRub3JtYWw6IF9ub3JtYWwuY2xvbmUoKSxcclxuXHJcblx0XHRcdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBpdGVyYXRlIG92ZXIgYWxsIHJlbWFpbmluZywgdW5tYXRjaGVkIGVkZ2VzIGFuZCBhZGQgdGhlbSB0byB0aGUgdmVydGV4IGFycmF5XHJcblx0XHRcdGZvciAoIGNvbnN0IGtleSBpbiBlZGdlRGF0YSApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBlZGdlRGF0YVsga2V5IF0gKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgeyBpbmRleDAsIGluZGV4MSB9ID0gZWRnZURhdGFbIGtleSBdO1xyXG5cdFx0XHRcdFx0X3YwLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uQXR0ciwgaW5kZXgwICk7XHJcblx0XHRcdFx0XHRfdjEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyLCBpbmRleDEgKTtcclxuXHJcblx0XHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCBfdjAueCwgX3YwLnksIF92MC56ICk7XHJcblx0XHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCBfdjEueCwgX3YxLnksIF92MS56ICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0gT2JqZWN0LmFzc2lnbigge30sIHNvdXJjZS5wYXJhbWV0ZXJzICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IEVkZ2VzR2VvbWV0cnkgfTtcclxuIiwiaW1wb3J0IHsgUGF0aCB9IGZyb20gJy4vUGF0aC5qcyc7XHJcbmltcG9ydCB7IGdlbmVyYXRlVVVJRCB9IGZyb20gJy4uLy4uL21hdGgvTWF0aFV0aWxzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBEZWZpbmVzIGFuIGFyYml0cmFyeSAyZCBzaGFwZSBwbGFuZSB1c2luZyBwYXRocyB3aXRoIG9wdGlvbmFsIGhvbGVzLiBJdFxyXG4gKiBjYW4gYmUgdXNlZCB3aXRoIHtAbGluayBFeHRydWRlR2VvbWV0cnl9LCB7QGxpbmsgU2hhcGVHZW9tZXRyeX0sIHRvIGdldFxyXG4gKiBwb2ludHMsIG9yIHRvIGdldCB0cmlhbmd1bGF0ZWQgZmFjZXMuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGhlYXJ0U2hhcGUgPSBuZXcgVEhSRUUuU2hhcGUoKTtcclxuICpcclxuICogaGVhcnRTaGFwZS5tb3ZlVG8oIDI1LCAyNSApO1xyXG4gKiBoZWFydFNoYXBlLmJlemllckN1cnZlVG8oIDI1LCAyNSwgMjAsIDAsIDAsIDAgKTtcclxuICogaGVhcnRTaGFwZS5iZXppZXJDdXJ2ZVRvKCAtIDMwLCAwLCAtIDMwLCAzNSwgLSAzMCwgMzUgKTtcclxuICogaGVhcnRTaGFwZS5iZXppZXJDdXJ2ZVRvKCAtIDMwLCA1NSwgLSAxMCwgNzcsIDI1LCA5NSApO1xyXG4gKiBoZWFydFNoYXBlLmJlemllckN1cnZlVG8oIDYwLCA3NywgODAsIDU1LCA4MCwgMzUgKTtcclxuICogaGVhcnRTaGFwZS5iZXppZXJDdXJ2ZVRvKCA4MCwgMzUsIDgwLCAwLCA1MCwgMCApO1xyXG4gKiBoZWFydFNoYXBlLmJlemllckN1cnZlVG8oIDM1LCAwLCAyNSwgMjUsIDI1LCAyNSApO1xyXG4gKlxyXG4gKiBjb25zdCBleHRydWRlU2V0dGluZ3MgPSB7XHJcbiAqIFx0ZGVwdGg6IDgsXHJcbiAqIFx0YmV2ZWxFbmFibGVkOiB0cnVlLFxyXG4gKiBcdGJldmVsU2VnbWVudHM6IDIsXHJcbiAqIFx0c3RlcHM6IDIsXHJcbiAqIFx0YmV2ZWxTaXplOiAxLFxyXG4gKiBcdGJldmVsVGhpY2tuZXNzOiAxXHJcbiAqIH07XHJcbiAqXHJcbiAqIGNvbnN0IGdlb21ldHJ5ID0gbmV3IFRIUkVFLkV4dHJ1ZGVHZW9tZXRyeSggaGVhcnRTaGFwZSwgZXh0cnVkZVNldHRpbmdzICk7XHJcbiAqIGNvbnN0IG1lc2ggPSBuZXcgVEhSRUUuTWVzaCggZ2VvbWV0cnksIG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCgpICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgUGF0aFxyXG4gKi9cclxuY2xhc3MgU2hhcGUgZXh0ZW5kcyBQYXRoIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBzaGFwZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8VmVjdG9yMj59IFtwb2ludHNdIC0gQW4gYXJyYXkgb2YgMkQgcG9pbnRzIGRlZmluaW5nIHRoZSBzaGFwZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcG9pbnRzICkge1xyXG5cclxuXHRcdHN1cGVyKCBwb2ludHMgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBVVUlEIG9mIHRoZSBzaGFwZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXVpZCA9IGdlbmVyYXRlVVVJRCgpO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdTaGFwZSc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIHRoZSBob2xlcyBpbiB0aGUgc2hhcGUuIEhvbGUgZGVmaW5pdGlvbnMgbXVzdCB1c2UgdGhlXHJcblx0XHQgKiBvcHBvc2l0ZSB3aW5kaW5nIG9yZGVyIChDVy9DQ1cpIHRoYW4gdGhlIG91dGVyIHNoYXBlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxQYXRoPn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmhvbGVzID0gW107XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhbiBhcnJheSByZXByZXNlbnRpbmcgZWFjaCBjb250b3VyIG9mIHRoZSBob2xlc1xyXG5cdCAqIGFzIGEgbGlzdCBvZiAyRCBwb2ludHMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZGl2aXNpb25zIC0gVGhlIGZpbmVuZXNzIG9mIHRoZSByZXN1bHQuXHJcblx0ICogQHJldHVybiB7QXJyYXk8QXJyYXk8VmVjdG9yMj4+fSBUaGUgaG9sZXMgYXMgYSBzZXJpZXMgb2YgMkQgcG9pbnRzLlxyXG5cdCAqL1xyXG5cdGdldFBvaW50c0hvbGVzKCBkaXZpc2lvbnMgKSB7XHJcblxyXG5cdFx0Y29uc3QgaG9sZXNQdHMgPSBbXTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSB0aGlzLmhvbGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRob2xlc1B0c1sgaSBdID0gdGhpcy5ob2xlc1sgaSBdLmdldFBvaW50cyggZGl2aXNpb25zICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBob2xlc1B0cztcclxuXHJcblx0fVxyXG5cclxuXHQvLyBnZXQgcG9pbnRzIG9mIHNoYXBlIGFuZCBob2xlcyAoa2V5cG9pbnRzIGJhc2VkIG9uIHNlZ21lbnRzIHBhcmFtZXRlcilcclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhbiBvYmplY3QgdGhhdCBob2xkcyBjb250b3VyIGRhdGEgZm9yIHRoZSBzaGFwZSBhbmQgaXRzIGhvbGVzIGFzXHJcblx0ICogYXJyYXlzIG9mIDJEIHBvaW50cy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBkaXZpc2lvbnMgLSBUaGUgZmluZW5lc3Mgb2YgdGhlIHJlc3VsdC5cclxuXHQgKiBAcmV0dXJuIHt7c2hhcGU6QXJyYXk8VmVjdG9yMj4saG9sZXM6QXJyYXk8QXJyYXk8VmVjdG9yMj4+fX0gQW4gb2JqZWN0IHdpdGggY29udG91ciBkYXRhLlxyXG5cdCAqL1xyXG5cdGV4dHJhY3RQb2ludHMoIGRpdmlzaW9ucyApIHtcclxuXHJcblx0XHRyZXR1cm4ge1xyXG5cclxuXHRcdFx0c2hhcGU6IHRoaXMuZ2V0UG9pbnRzKCBkaXZpc2lvbnMgKSxcclxuXHRcdFx0aG9sZXM6IHRoaXMuZ2V0UG9pbnRzSG9sZXMoIGRpdmlzaW9ucyApXHJcblxyXG5cdFx0fTtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy5ob2xlcyA9IFtdO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHNvdXJjZS5ob2xlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgaG9sZSA9IHNvdXJjZS5ob2xlc1sgaSBdO1xyXG5cclxuXHRcdFx0dGhpcy5ob2xlcy5wdXNoKCBob2xlLmNsb25lKCkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0dG9KU09OKCkge1xyXG5cclxuXHRcdGNvbnN0IGRhdGEgPSBzdXBlci50b0pTT04oKTtcclxuXHJcblx0XHRkYXRhLnV1aWQgPSB0aGlzLnV1aWQ7XHJcblx0XHRkYXRhLmhvbGVzID0gW107XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gdGhpcy5ob2xlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgaG9sZSA9IHRoaXMuaG9sZXNbIGkgXTtcclxuXHRcdFx0ZGF0YS5ob2xlcy5wdXNoKCBob2xlLnRvSlNPTigpICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBkYXRhO1xyXG5cclxuXHR9XHJcblxyXG5cdGZyb21KU09OKCBqc29uICkge1xyXG5cclxuXHRcdHN1cGVyLmZyb21KU09OKCBqc29uICk7XHJcblxyXG5cdFx0dGhpcy51dWlkID0ganNvbi51dWlkO1xyXG5cdFx0dGhpcy5ob2xlcyA9IFtdO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGpzb24uaG9sZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGhvbGUgPSBqc29uLmhvbGVzWyBpIF07XHJcblx0XHRcdHRoaXMuaG9sZXMucHVzaCggbmV3IFBhdGgoKS5mcm9tSlNPTiggaG9sZSApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgU2hhcGUgfTtcclxuIiwiLyogZXNsaW50LWRpc2FibGUgKi9cclxuLy8gY29weSBvZiBtYXBib3gvZWFyY3V0IHZlcnNpb24gMy4wLjFcclxuLy8gaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9lYXJjdXQvdHJlZS92My4wLjFcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGVhcmN1dChkYXRhLCBob2xlSW5kaWNlcywgZGltID0gMikge1xyXG5cclxuICAgIGNvbnN0IGhhc0hvbGVzID0gaG9sZUluZGljZXMgJiYgaG9sZUluZGljZXMubGVuZ3RoO1xyXG4gICAgY29uc3Qgb3V0ZXJMZW4gPSBoYXNIb2xlcyA/IGhvbGVJbmRpY2VzWzBdICogZGltIDogZGF0YS5sZW5ndGg7XHJcbiAgICBsZXQgb3V0ZXJOb2RlID0gbGlua2VkTGlzdChkYXRhLCAwLCBvdXRlckxlbiwgZGltLCB0cnVlKTtcclxuICAgIGNvbnN0IHRyaWFuZ2xlcyA9IFtdO1xyXG5cclxuICAgIGlmICghb3V0ZXJOb2RlIHx8IG91dGVyTm9kZS5uZXh0ID09PSBvdXRlck5vZGUucHJldikgcmV0dXJuIHRyaWFuZ2xlcztcclxuXHJcbiAgICBsZXQgbWluWCwgbWluWSwgaW52U2l6ZTtcclxuXHJcbiAgICBpZiAoaGFzSG9sZXMpIG91dGVyTm9kZSA9IGVsaW1pbmF0ZUhvbGVzKGRhdGEsIGhvbGVJbmRpY2VzLCBvdXRlck5vZGUsIGRpbSk7XHJcblxyXG4gICAgLy8gaWYgdGhlIHNoYXBlIGlzIG5vdCB0b28gc2ltcGxlLCB3ZSdsbCB1c2Ugei1vcmRlciBjdXJ2ZSBoYXNoIGxhdGVyOyBjYWxjdWxhdGUgcG9seWdvbiBiYm94XHJcbiAgICBpZiAoZGF0YS5sZW5ndGggPiA4MCAqIGRpbSkge1xyXG4gICAgICAgIG1pblggPSBJbmZpbml0eTtcclxuICAgICAgICBtaW5ZID0gSW5maW5pdHk7XHJcbiAgICAgICAgbGV0IG1heFggPSAtSW5maW5pdHk7XHJcbiAgICAgICAgbGV0IG1heFkgPSAtSW5maW5pdHk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSBkaW07IGkgPCBvdXRlckxlbjsgaSArPSBkaW0pIHtcclxuICAgICAgICAgICAgY29uc3QgeCA9IGRhdGFbaV07XHJcbiAgICAgICAgICAgIGNvbnN0IHkgPSBkYXRhW2kgKyAxXTtcclxuICAgICAgICAgICAgaWYgKHggPCBtaW5YKSBtaW5YID0geDtcclxuICAgICAgICAgICAgaWYgKHkgPCBtaW5ZKSBtaW5ZID0geTtcclxuICAgICAgICAgICAgaWYgKHggPiBtYXhYKSBtYXhYID0geDtcclxuICAgICAgICAgICAgaWYgKHkgPiBtYXhZKSBtYXhZID0geTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIG1pblgsIG1pblkgYW5kIGludlNpemUgYXJlIGxhdGVyIHVzZWQgdG8gdHJhbnNmb3JtIGNvb3JkcyBpbnRvIGludGVnZXJzIGZvciB6LW9yZGVyIGNhbGN1bGF0aW9uXHJcbiAgICAgICAgaW52U2l6ZSA9IE1hdGgubWF4KG1heFggLSBtaW5YLCBtYXhZIC0gbWluWSk7XHJcbiAgICAgICAgaW52U2l6ZSA9IGludlNpemUgIT09IDAgPyAzMjc2NyAvIGludlNpemUgOiAwO1xyXG4gICAgfVxyXG5cclxuICAgIGVhcmN1dExpbmtlZChvdXRlck5vZGUsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplLCAwKTtcclxuXHJcbiAgICByZXR1cm4gdHJpYW5nbGVzO1xyXG59XHJcblxyXG4vLyBjcmVhdGUgYSBjaXJjdWxhciBkb3VibHkgbGlua2VkIGxpc3QgZnJvbSBwb2x5Z29uIHBvaW50cyBpbiB0aGUgc3BlY2lmaWVkIHdpbmRpbmcgb3JkZXJcclxuZnVuY3Rpb24gbGlua2VkTGlzdChkYXRhLCBzdGFydCwgZW5kLCBkaW0sIGNsb2Nrd2lzZSkge1xyXG4gICAgbGV0IGxhc3Q7XHJcblxyXG4gICAgaWYgKGNsb2Nrd2lzZSA9PT0gKHNpZ25lZEFyZWEoZGF0YSwgc3RhcnQsIGVuZCwgZGltKSA+IDApKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpICs9IGRpbSkgbGFzdCA9IGluc2VydE5vZGUoaSAvIGRpbSB8IDAsIGRhdGFbaV0sIGRhdGFbaSArIDFdLCBsYXN0KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IGVuZCAtIGRpbTsgaSA+PSBzdGFydDsgaSAtPSBkaW0pIGxhc3QgPSBpbnNlcnROb2RlKGkgLyBkaW0gfCAwLCBkYXRhW2ldLCBkYXRhW2kgKyAxXSwgbGFzdCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGxhc3QgJiYgZXF1YWxzKGxhc3QsIGxhc3QubmV4dCkpIHtcclxuICAgICAgICByZW1vdmVOb2RlKGxhc3QpO1xyXG4gICAgICAgIGxhc3QgPSBsYXN0Lm5leHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGxhc3Q7XHJcbn1cclxuXHJcbi8vIGVsaW1pbmF0ZSBjb2xpbmVhciBvciBkdXBsaWNhdGUgcG9pbnRzXHJcbmZ1bmN0aW9uIGZpbHRlclBvaW50cyhzdGFydCwgZW5kKSB7XHJcbiAgICBpZiAoIXN0YXJ0KSByZXR1cm4gc3RhcnQ7XHJcbiAgICBpZiAoIWVuZCkgZW5kID0gc3RhcnQ7XHJcblxyXG4gICAgbGV0IHAgPSBzdGFydCxcclxuICAgICAgICBhZ2FpbjtcclxuICAgIGRvIHtcclxuICAgICAgICBhZ2FpbiA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAoIXAuc3RlaW5lciAmJiAoZXF1YWxzKHAsIHAubmV4dCkgfHwgYXJlYShwLnByZXYsIHAsIHAubmV4dCkgPT09IDApKSB7XHJcbiAgICAgICAgICAgIHJlbW92ZU5vZGUocCk7XHJcbiAgICAgICAgICAgIHAgPSBlbmQgPSBwLnByZXY7XHJcbiAgICAgICAgICAgIGlmIChwID09PSBwLm5leHQpIGJyZWFrO1xyXG4gICAgICAgICAgICBhZ2FpbiA9IHRydWU7XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHAgPSBwLm5leHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfSB3aGlsZSAoYWdhaW4gfHwgcCAhPT0gZW5kKTtcclxuXHJcbiAgICByZXR1cm4gZW5kO1xyXG59XHJcblxyXG4vLyBtYWluIGVhciBzbGljaW5nIGxvb3Agd2hpY2ggdHJpYW5ndWxhdGVzIGEgcG9seWdvbiAoZ2l2ZW4gYXMgYSBsaW5rZWQgbGlzdClcclxuZnVuY3Rpb24gZWFyY3V0TGlua2VkKGVhciwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUsIHBhc3MpIHtcclxuICAgIGlmICghZWFyKSByZXR1cm47XHJcblxyXG4gICAgLy8gaW50ZXJsaW5rIHBvbHlnb24gbm9kZXMgaW4gei1vcmRlclxyXG4gICAgaWYgKCFwYXNzICYmIGludlNpemUpIGluZGV4Q3VydmUoZWFyLCBtaW5YLCBtaW5ZLCBpbnZTaXplKTtcclxuXHJcbiAgICBsZXQgc3RvcCA9IGVhcjtcclxuXHJcbiAgICAvLyBpdGVyYXRlIHRocm91Z2ggZWFycywgc2xpY2luZyB0aGVtIG9uZSBieSBvbmVcclxuICAgIHdoaWxlIChlYXIucHJldiAhPT0gZWFyLm5leHQpIHtcclxuICAgICAgICBjb25zdCBwcmV2ID0gZWFyLnByZXY7XHJcbiAgICAgICAgY29uc3QgbmV4dCA9IGVhci5uZXh0O1xyXG5cclxuICAgICAgICBpZiAoaW52U2l6ZSA/IGlzRWFySGFzaGVkKGVhciwgbWluWCwgbWluWSwgaW52U2l6ZSkgOiBpc0VhcihlYXIpKSB7XHJcbiAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKHByZXYuaSwgZWFyLmksIG5leHQuaSk7IC8vIGN1dCBvZmYgdGhlIHRyaWFuZ2xlXHJcblxyXG4gICAgICAgICAgICByZW1vdmVOb2RlKGVhcik7XHJcblxyXG4gICAgICAgICAgICAvLyBza2lwcGluZyB0aGUgbmV4dCB2ZXJ0ZXggbGVhZHMgdG8gbGVzcyBzbGl2ZXIgdHJpYW5nbGVzXHJcbiAgICAgICAgICAgIGVhciA9IG5leHQubmV4dDtcclxuICAgICAgICAgICAgc3RvcCA9IG5leHQubmV4dDtcclxuXHJcbiAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZWFyID0gbmV4dDtcclxuXHJcbiAgICAgICAgLy8gaWYgd2UgbG9vcGVkIHRocm91Z2ggdGhlIHdob2xlIHJlbWFpbmluZyBwb2x5Z29uIGFuZCBjYW4ndCBmaW5kIGFueSBtb3JlIGVhcnNcclxuICAgICAgICBpZiAoZWFyID09PSBzdG9wKSB7XHJcbiAgICAgICAgICAgIC8vIHRyeSBmaWx0ZXJpbmcgcG9pbnRzIGFuZCBzbGljaW5nIGFnYWluXHJcbiAgICAgICAgICAgIGlmICghcGFzcykge1xyXG4gICAgICAgICAgICAgICAgZWFyY3V0TGlua2VkKGZpbHRlclBvaW50cyhlYXIpLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSwgMSk7XHJcblxyXG4gICAgICAgICAgICAvLyBpZiB0aGlzIGRpZG4ndCB3b3JrLCB0cnkgY3VyaW5nIGFsbCBzbWFsbCBzZWxmLWludGVyc2VjdGlvbnMgbG9jYWxseVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhc3MgPT09IDEpIHtcclxuICAgICAgICAgICAgICAgIGVhciA9IGN1cmVMb2NhbEludGVyc2VjdGlvbnMoZmlsdGVyUG9pbnRzKGVhciksIHRyaWFuZ2xlcyk7XHJcbiAgICAgICAgICAgICAgICBlYXJjdXRMaW5rZWQoZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSwgMik7XHJcblxyXG4gICAgICAgICAgICAvLyBhcyBhIGxhc3QgcmVzb3J0LCB0cnkgc3BsaXR0aW5nIHRoZSByZW1haW5pbmcgcG9seWdvbiBpbnRvIHR3b1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhc3MgPT09IDIpIHtcclxuICAgICAgICAgICAgICAgIHNwbGl0RWFyY3V0KGVhciwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8vIGNoZWNrIHdoZXRoZXIgYSBwb2x5Z29uIG5vZGUgZm9ybXMgYSB2YWxpZCBlYXIgd2l0aCBhZGphY2VudCBub2Rlc1xyXG5mdW5jdGlvbiBpc0VhcihlYXIpIHtcclxuICAgIGNvbnN0IGEgPSBlYXIucHJldixcclxuICAgICAgICBiID0gZWFyLFxyXG4gICAgICAgIGMgPSBlYXIubmV4dDtcclxuXHJcbiAgICBpZiAoYXJlYShhLCBiLCBjKSA+PSAwKSByZXR1cm4gZmFsc2U7IC8vIHJlZmxleCwgY2FuJ3QgYmUgYW4gZWFyXHJcblxyXG4gICAgLy8gbm93IG1ha2Ugc3VyZSB3ZSBkb24ndCBoYXZlIG90aGVyIHBvaW50cyBpbnNpZGUgdGhlIHBvdGVudGlhbCBlYXJcclxuICAgIGNvbnN0IGF4ID0gYS54LCBieCA9IGIueCwgY3ggPSBjLngsIGF5ID0gYS55LCBieSA9IGIueSwgY3kgPSBjLnk7XHJcblxyXG4gICAgLy8gdHJpYW5nbGUgYmJveFxyXG4gICAgY29uc3QgeDAgPSBNYXRoLm1pbihheCwgYngsIGN4KSxcclxuICAgICAgICB5MCA9IE1hdGgubWluKGF5LCBieSwgY3kpLFxyXG4gICAgICAgIHgxID0gTWF0aC5tYXgoYXgsIGJ4LCBjeCksXHJcbiAgICAgICAgeTEgPSBNYXRoLm1heChheSwgYnksIGN5KTtcclxuXHJcbiAgICBsZXQgcCA9IGMubmV4dDtcclxuICAgIHdoaWxlIChwICE9PSBhKSB7XHJcbiAgICAgICAgaWYgKHAueCA+PSB4MCAmJiBwLnggPD0geDEgJiYgcC55ID49IHkwICYmIHAueSA8PSB5MSAmJlxyXG4gICAgICAgICAgICBwb2ludEluVHJpYW5nbGVFeGNlcHRGaXJzdChheCwgYXksIGJ4LCBieSwgY3gsIGN5LCBwLngsIHAueSkgJiZcclxuICAgICAgICAgICAgYXJlYShwLnByZXYsIHAsIHAubmV4dCkgPj0gMCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIHAgPSBwLm5leHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzRWFySGFzaGVkKGVhciwgbWluWCwgbWluWSwgaW52U2l6ZSkge1xyXG4gICAgY29uc3QgYSA9IGVhci5wcmV2LFxyXG4gICAgICAgIGIgPSBlYXIsXHJcbiAgICAgICAgYyA9IGVhci5uZXh0O1xyXG5cclxuICAgIGlmIChhcmVhKGEsIGIsIGMpID49IDApIHJldHVybiBmYWxzZTsgLy8gcmVmbGV4LCBjYW4ndCBiZSBhbiBlYXJcclxuXHJcbiAgICBjb25zdCBheCA9IGEueCwgYnggPSBiLngsIGN4ID0gYy54LCBheSA9IGEueSwgYnkgPSBiLnksIGN5ID0gYy55O1xyXG5cclxuICAgIC8vIHRyaWFuZ2xlIGJib3hcclxuICAgIGNvbnN0IHgwID0gTWF0aC5taW4oYXgsIGJ4LCBjeCksXHJcbiAgICAgICAgeTAgPSBNYXRoLm1pbihheSwgYnksIGN5KSxcclxuICAgICAgICB4MSA9IE1hdGgubWF4KGF4LCBieCwgY3gpLFxyXG4gICAgICAgIHkxID0gTWF0aC5tYXgoYXksIGJ5LCBjeSk7XHJcblxyXG4gICAgLy8gei1vcmRlciByYW5nZSBmb3IgdGhlIGN1cnJlbnQgdHJpYW5nbGUgYmJveDtcclxuICAgIGNvbnN0IG1pblogPSB6T3JkZXIoeDAsIHkwLCBtaW5YLCBtaW5ZLCBpbnZTaXplKSxcclxuICAgICAgICBtYXhaID0gek9yZGVyKHgxLCB5MSwgbWluWCwgbWluWSwgaW52U2l6ZSk7XHJcblxyXG4gICAgbGV0IHAgPSBlYXIucHJldlosXHJcbiAgICAgICAgbiA9IGVhci5uZXh0WjtcclxuXHJcbiAgICAvLyBsb29rIGZvciBwb2ludHMgaW5zaWRlIHRoZSB0cmlhbmdsZSBpbiBib3RoIGRpcmVjdGlvbnNcclxuICAgIHdoaWxlIChwICYmIHAueiA+PSBtaW5aICYmIG4gJiYgbi56IDw9IG1heFopIHtcclxuICAgICAgICBpZiAocC54ID49IHgwICYmIHAueCA8PSB4MSAmJiBwLnkgPj0geTAgJiYgcC55IDw9IHkxICYmIHAgIT09IGEgJiYgcCAhPT0gYyAmJlxyXG4gICAgICAgICAgICBwb2ludEluVHJpYW5nbGVFeGNlcHRGaXJzdChheCwgYXksIGJ4LCBieSwgY3gsIGN5LCBwLngsIHAueSkgJiYgYXJlYShwLnByZXYsIHAsIHAubmV4dCkgPj0gMCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIHAgPSBwLnByZXZaO1xyXG5cclxuICAgICAgICBpZiAobi54ID49IHgwICYmIG4ueCA8PSB4MSAmJiBuLnkgPj0geTAgJiYgbi55IDw9IHkxICYmIG4gIT09IGEgJiYgbiAhPT0gYyAmJlxyXG4gICAgICAgICAgICBwb2ludEluVHJpYW5nbGVFeGNlcHRGaXJzdChheCwgYXksIGJ4LCBieSwgY3gsIGN5LCBuLngsIG4ueSkgJiYgYXJlYShuLnByZXYsIG4sIG4ubmV4dCkgPj0gMCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIG4gPSBuLm5leHRaO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGxvb2sgZm9yIHJlbWFpbmluZyBwb2ludHMgaW4gZGVjcmVhc2luZyB6LW9yZGVyXHJcbiAgICB3aGlsZSAocCAmJiBwLnogPj0gbWluWikge1xyXG4gICAgICAgIGlmIChwLnggPj0geDAgJiYgcC54IDw9IHgxICYmIHAueSA+PSB5MCAmJiBwLnkgPD0geTEgJiYgcCAhPT0gYSAmJiBwICE9PSBjICYmXHJcbiAgICAgICAgICAgIHBvaW50SW5UcmlhbmdsZUV4Y2VwdEZpcnN0KGF4LCBheSwgYngsIGJ5LCBjeCwgY3ksIHAueCwgcC55KSAmJiBhcmVhKHAucHJldiwgcCwgcC5uZXh0KSA+PSAwKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgcCA9IHAucHJldlo7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gbG9vayBmb3IgcmVtYWluaW5nIHBvaW50cyBpbiBpbmNyZWFzaW5nIHotb3JkZXJcclxuICAgIHdoaWxlIChuICYmIG4ueiA8PSBtYXhaKSB7XHJcbiAgICAgICAgaWYgKG4ueCA+PSB4MCAmJiBuLnggPD0geDEgJiYgbi55ID49IHkwICYmIG4ueSA8PSB5MSAmJiBuICE9PSBhICYmIG4gIT09IGMgJiZcclxuICAgICAgICAgICAgcG9pbnRJblRyaWFuZ2xlRXhjZXB0Rmlyc3QoYXgsIGF5LCBieCwgYnksIGN4LCBjeSwgbi54LCBuLnkpICYmIGFyZWEobi5wcmV2LCBuLCBuLm5leHQpID49IDApIHJldHVybiBmYWxzZTtcclxuICAgICAgICBuID0gbi5uZXh0WjtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxufVxyXG5cclxuLy8gZ28gdGhyb3VnaCBhbGwgcG9seWdvbiBub2RlcyBhbmQgY3VyZSBzbWFsbCBsb2NhbCBzZWxmLWludGVyc2VjdGlvbnNcclxuZnVuY3Rpb24gY3VyZUxvY2FsSW50ZXJzZWN0aW9ucyhzdGFydCwgdHJpYW5nbGVzKSB7XHJcbiAgICBsZXQgcCA9IHN0YXJ0O1xyXG4gICAgZG8ge1xyXG4gICAgICAgIGNvbnN0IGEgPSBwLnByZXYsXHJcbiAgICAgICAgICAgIGIgPSBwLm5leHQubmV4dDtcclxuXHJcbiAgICAgICAgaWYgKCFlcXVhbHMoYSwgYikgJiYgaW50ZXJzZWN0cyhhLCBwLCBwLm5leHQsIGIpICYmIGxvY2FsbHlJbnNpZGUoYSwgYikgJiYgbG9jYWxseUluc2lkZShiLCBhKSkge1xyXG5cclxuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2goYS5pLCBwLmksIGIuaSk7XHJcblxyXG4gICAgICAgICAgICAvLyByZW1vdmUgdHdvIG5vZGVzIGludm9sdmVkXHJcbiAgICAgICAgICAgIHJlbW92ZU5vZGUocCk7XHJcbiAgICAgICAgICAgIHJlbW92ZU5vZGUocC5uZXh0KTtcclxuXHJcbiAgICAgICAgICAgIHAgPSBzdGFydCA9IGI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHAgPSBwLm5leHQ7XHJcbiAgICB9IHdoaWxlIChwICE9PSBzdGFydCk7XHJcblxyXG4gICAgcmV0dXJuIGZpbHRlclBvaW50cyhwKTtcclxufVxyXG5cclxuLy8gdHJ5IHNwbGl0dGluZyBwb2x5Z29uIGludG8gdHdvIGFuZCB0cmlhbmd1bGF0ZSB0aGVtIGluZGVwZW5kZW50bHlcclxuZnVuY3Rpb24gc3BsaXRFYXJjdXQoc3RhcnQsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplKSB7XHJcbiAgICAvLyBsb29rIGZvciBhIHZhbGlkIGRpYWdvbmFsIHRoYXQgZGl2aWRlcyB0aGUgcG9seWdvbiBpbnRvIHR3b1xyXG4gICAgbGV0IGEgPSBzdGFydDtcclxuICAgIGRvIHtcclxuICAgICAgICBsZXQgYiA9IGEubmV4dC5uZXh0O1xyXG4gICAgICAgIHdoaWxlIChiICE9PSBhLnByZXYpIHtcclxuICAgICAgICAgICAgaWYgKGEuaSAhPT0gYi5pICYmIGlzVmFsaWREaWFnb25hbChhLCBiKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gc3BsaXQgdGhlIHBvbHlnb24gaW4gdHdvIGJ5IHRoZSBkaWFnb25hbFxyXG4gICAgICAgICAgICAgICAgbGV0IGMgPSBzcGxpdFBvbHlnb24oYSwgYik7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gZmlsdGVyIGNvbGluZWFyIHBvaW50cyBhcm91bmQgdGhlIGN1dHNcclxuICAgICAgICAgICAgICAgIGEgPSBmaWx0ZXJQb2ludHMoYSwgYS5uZXh0KTtcclxuICAgICAgICAgICAgICAgIGMgPSBmaWx0ZXJQb2ludHMoYywgYy5uZXh0KTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBydW4gZWFyY3V0IG9uIGVhY2ggaGFsZlxyXG4gICAgICAgICAgICAgICAgZWFyY3V0TGlua2VkKGEsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplLCAwKTtcclxuICAgICAgICAgICAgICAgIGVhcmN1dExpbmtlZChjLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSwgMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYiA9IGIubmV4dDtcclxuICAgICAgICB9XHJcbiAgICAgICAgYSA9IGEubmV4dDtcclxuICAgIH0gd2hpbGUgKGEgIT09IHN0YXJ0KTtcclxufVxyXG5cclxuLy8gbGluayBldmVyeSBob2xlIGludG8gdGhlIG91dGVyIGxvb3AsIHByb2R1Y2luZyBhIHNpbmdsZS1yaW5nIHBvbHlnb24gd2l0aG91dCBob2xlc1xyXG5mdW5jdGlvbiBlbGltaW5hdGVIb2xlcyhkYXRhLCBob2xlSW5kaWNlcywgb3V0ZXJOb2RlLCBkaW0pIHtcclxuICAgIGNvbnN0IHF1ZXVlID0gW107XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGhvbGVJbmRpY2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBob2xlSW5kaWNlc1tpXSAqIGRpbTtcclxuICAgICAgICBjb25zdCBlbmQgPSBpIDwgbGVuIC0gMSA/IGhvbGVJbmRpY2VzW2kgKyAxXSAqIGRpbSA6IGRhdGEubGVuZ3RoO1xyXG4gICAgICAgIGNvbnN0IGxpc3QgPSBsaW5rZWRMaXN0KGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSwgZmFsc2UpO1xyXG4gICAgICAgIGlmIChsaXN0ID09PSBsaXN0Lm5leHQpIGxpc3Quc3RlaW5lciA9IHRydWU7XHJcbiAgICAgICAgcXVldWUucHVzaChnZXRMZWZ0bW9zdChsaXN0KSk7XHJcbiAgICB9XHJcblxyXG4gICAgcXVldWUuc29ydChjb21wYXJlWFlTbG9wZSk7XHJcblxyXG4gICAgLy8gcHJvY2VzcyBob2xlcyBmcm9tIGxlZnQgdG8gcmlnaHRcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBvdXRlck5vZGUgPSBlbGltaW5hdGVIb2xlKHF1ZXVlW2ldLCBvdXRlck5vZGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBvdXRlck5vZGU7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNvbXBhcmVYWVNsb3BlKGEsIGIpIHtcclxuICAgIGxldCByZXN1bHQgPSBhLnggLSBiLng7XHJcbiAgICAvLyB3aGVuIHRoZSBsZWZ0LW1vc3QgcG9pbnQgb2YgMiBob2xlcyBtZWV0IGF0IGEgdmVydGV4LCBzb3J0IHRoZSBob2xlcyBjb3VudGVyY2xvY2t3aXNlIHNvIHRoYXQgd2hlbiB3ZSBmaW5kXHJcbiAgICAvLyB0aGUgYnJpZGdlIHRvIHRoZSBvdXRlciBzaGVsbCBpcyBhbHdheXMgdGhlIHBvaW50IHRoYXQgdGhleSBtZWV0IGF0LlxyXG4gICAgaWYgKHJlc3VsdCA9PT0gMCkge1xyXG4gICAgICAgIHJlc3VsdCA9IGEueSAtIGIueTtcclxuICAgICAgICBpZiAocmVzdWx0ID09PSAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFTbG9wZSA9IChhLm5leHQueSAtIGEueSkgLyAoYS5uZXh0LnggLSBhLngpO1xyXG4gICAgICAgICAgICBjb25zdCBiU2xvcGUgPSAoYi5uZXh0LnkgLSBiLnkpIC8gKGIubmV4dC54IC0gYi54KTtcclxuICAgICAgICAgICAgcmVzdWx0ID0gYVNsb3BlIC0gYlNsb3BlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbi8vIGZpbmQgYSBicmlkZ2UgYmV0d2VlbiB2ZXJ0aWNlcyB0aGF0IGNvbm5lY3RzIGhvbGUgd2l0aCBhbiBvdXRlciByaW5nIGFuZCBhbmQgbGluayBpdFxyXG5mdW5jdGlvbiBlbGltaW5hdGVIb2xlKGhvbGUsIG91dGVyTm9kZSkge1xyXG4gICAgY29uc3QgYnJpZGdlID0gZmluZEhvbGVCcmlkZ2UoaG9sZSwgb3V0ZXJOb2RlKTtcclxuICAgIGlmICghYnJpZGdlKSB7XHJcbiAgICAgICAgcmV0dXJuIG91dGVyTm9kZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBicmlkZ2VSZXZlcnNlID0gc3BsaXRQb2x5Z29uKGJyaWRnZSwgaG9sZSk7XHJcblxyXG4gICAgLy8gZmlsdGVyIGNvbGxpbmVhciBwb2ludHMgYXJvdW5kIHRoZSBjdXRzXHJcbiAgICBmaWx0ZXJQb2ludHMoYnJpZGdlUmV2ZXJzZSwgYnJpZGdlUmV2ZXJzZS5uZXh0KTtcclxuICAgIHJldHVybiBmaWx0ZXJQb2ludHMoYnJpZGdlLCBicmlkZ2UubmV4dCk7XHJcbn1cclxuXHJcbi8vIERhdmlkIEViZXJseSdzIGFsZ29yaXRobSBmb3IgZmluZGluZyBhIGJyaWRnZSBiZXR3ZWVuIGhvbGUgYW5kIG91dGVyIHBvbHlnb25cclxuZnVuY3Rpb24gZmluZEhvbGVCcmlkZ2UoaG9sZSwgb3V0ZXJOb2RlKSB7XHJcbiAgICBsZXQgcCA9IG91dGVyTm9kZTtcclxuICAgIGNvbnN0IGh4ID0gaG9sZS54O1xyXG4gICAgY29uc3QgaHkgPSBob2xlLnk7XHJcbiAgICBsZXQgcXggPSAtSW5maW5pdHk7XHJcbiAgICBsZXQgbTtcclxuXHJcbiAgICAvLyBmaW5kIGEgc2VnbWVudCBpbnRlcnNlY3RlZCBieSBhIHJheSBmcm9tIHRoZSBob2xlJ3MgbGVmdG1vc3QgcG9pbnQgdG8gdGhlIGxlZnQ7XHJcbiAgICAvLyBzZWdtZW50J3MgZW5kcG9pbnQgd2l0aCBsZXNzZXIgeCB3aWxsIGJlIHBvdGVudGlhbCBjb25uZWN0aW9uIHBvaW50XHJcbiAgICAvLyB1bmxlc3MgdGhleSBpbnRlcnNlY3QgYXQgYSB2ZXJ0ZXgsIHRoZW4gY2hvb3NlIHRoZSB2ZXJ0ZXhcclxuICAgIGlmIChlcXVhbHMoaG9sZSwgcCkpIHJldHVybiBwO1xyXG4gICAgZG8ge1xyXG4gICAgICAgIGlmIChlcXVhbHMoaG9sZSwgcC5uZXh0KSkgcmV0dXJuIHAubmV4dDtcclxuICAgICAgICBlbHNlIGlmIChoeSA8PSBwLnkgJiYgaHkgPj0gcC5uZXh0LnkgJiYgcC5uZXh0LnkgIT09IHAueSkge1xyXG4gICAgICAgICAgICBjb25zdCB4ID0gcC54ICsgKGh5IC0gcC55KSAqIChwLm5leHQueCAtIHAueCkgLyAocC5uZXh0LnkgLSBwLnkpO1xyXG4gICAgICAgICAgICBpZiAoeCA8PSBoeCAmJiB4ID4gcXgpIHtcclxuICAgICAgICAgICAgICAgIHF4ID0geDtcclxuICAgICAgICAgICAgICAgIG0gPSBwLnggPCBwLm5leHQueCA/IHAgOiBwLm5leHQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoeCA9PT0gaHgpIHJldHVybiBtOyAvLyBob2xlIHRvdWNoZXMgb3V0ZXIgc2VnbWVudDsgcGljayBsZWZ0bW9zdCBlbmRwb2ludFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHAgPSBwLm5leHQ7XHJcbiAgICB9IHdoaWxlIChwICE9PSBvdXRlck5vZGUpO1xyXG5cclxuICAgIGlmICghbSkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgLy8gbG9vayBmb3IgcG9pbnRzIGluc2lkZSB0aGUgdHJpYW5nbGUgb2YgaG9sZSBwb2ludCwgc2VnbWVudCBpbnRlcnNlY3Rpb24gYW5kIGVuZHBvaW50O1xyXG4gICAgLy8gaWYgdGhlcmUgYXJlIG5vIHBvaW50cyBmb3VuZCwgd2UgaGF2ZSBhIHZhbGlkIGNvbm5lY3Rpb247XHJcbiAgICAvLyBvdGhlcndpc2UgY2hvb3NlIHRoZSBwb2ludCBvZiB0aGUgbWluaW11bSBhbmdsZSB3aXRoIHRoZSByYXkgYXMgY29ubmVjdGlvbiBwb2ludFxyXG5cclxuICAgIGNvbnN0IHN0b3AgPSBtO1xyXG4gICAgY29uc3QgbXggPSBtLng7XHJcbiAgICBjb25zdCBteSA9IG0ueTtcclxuICAgIGxldCB0YW5NaW4gPSBJbmZpbml0eTtcclxuXHJcbiAgICBwID0gbTtcclxuXHJcbiAgICBkbyB7XHJcbiAgICAgICAgaWYgKGh4ID49IHAueCAmJiBwLnggPj0gbXggJiYgaHggIT09IHAueCAmJlxyXG4gICAgICAgICAgICAgICAgcG9pbnRJblRyaWFuZ2xlKGh5IDwgbXkgPyBoeCA6IHF4LCBoeSwgbXgsIG15LCBoeSA8IG15ID8gcXggOiBoeCwgaHksIHAueCwgcC55KSkge1xyXG5cclxuICAgICAgICAgICAgY29uc3QgdGFuID0gTWF0aC5hYnMoaHkgLSBwLnkpIC8gKGh4IC0gcC54KTsgLy8gdGFuZ2VudGlhbFxyXG5cclxuICAgICAgICAgICAgaWYgKGxvY2FsbHlJbnNpZGUocCwgaG9sZSkgJiZcclxuICAgICAgICAgICAgICAgICh0YW4gPCB0YW5NaW4gfHwgKHRhbiA9PT0gdGFuTWluICYmIChwLnggPiBtLnggfHwgKHAueCA9PT0gbS54ICYmIHNlY3RvckNvbnRhaW5zU2VjdG9yKG0sIHApKSkpKSkge1xyXG4gICAgICAgICAgICAgICAgbSA9IHA7XHJcbiAgICAgICAgICAgICAgICB0YW5NaW4gPSB0YW47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHAgPSBwLm5leHQ7XHJcbiAgICB9IHdoaWxlIChwICE9PSBzdG9wKTtcclxuXHJcbiAgICByZXR1cm4gbTtcclxufVxyXG5cclxuLy8gd2hldGhlciBzZWN0b3IgaW4gdmVydGV4IG0gY29udGFpbnMgc2VjdG9yIGluIHZlcnRleCBwIGluIHRoZSBzYW1lIGNvb3JkaW5hdGVzXHJcbmZ1bmN0aW9uIHNlY3RvckNvbnRhaW5zU2VjdG9yKG0sIHApIHtcclxuICAgIHJldHVybiBhcmVhKG0ucHJldiwgbSwgcC5wcmV2KSA8IDAgJiYgYXJlYShwLm5leHQsIG0sIG0ubmV4dCkgPCAwO1xyXG59XHJcblxyXG4vLyBpbnRlcmxpbmsgcG9seWdvbiBub2RlcyBpbiB6LW9yZGVyXHJcbmZ1bmN0aW9uIGluZGV4Q3VydmUoc3RhcnQsIG1pblgsIG1pblksIGludlNpemUpIHtcclxuICAgIGxldCBwID0gc3RhcnQ7XHJcbiAgICBkbyB7XHJcbiAgICAgICAgaWYgKHAueiA9PT0gMCkgcC56ID0gek9yZGVyKHAueCwgcC55LCBtaW5YLCBtaW5ZLCBpbnZTaXplKTtcclxuICAgICAgICBwLnByZXZaID0gcC5wcmV2O1xyXG4gICAgICAgIHAubmV4dFogPSBwLm5leHQ7XHJcbiAgICAgICAgcCA9IHAubmV4dDtcclxuICAgIH0gd2hpbGUgKHAgIT09IHN0YXJ0KTtcclxuXHJcbiAgICBwLnByZXZaLm5leHRaID0gbnVsbDtcclxuICAgIHAucHJldlogPSBudWxsO1xyXG5cclxuICAgIHNvcnRMaW5rZWQocCk7XHJcbn1cclxuXHJcbi8vIFNpbW9uIFRhdGhhbSdzIGxpbmtlZCBsaXN0IG1lcmdlIHNvcnQgYWxnb3JpdGhtXHJcbi8vIGh0dHA6Ly93d3cuY2hpYXJrLmdyZWVuZW5kLm9yZy51ay9+c2d0YXRoYW0vYWxnb3JpdGhtcy9saXN0c29ydC5odG1sXHJcbmZ1bmN0aW9uIHNvcnRMaW5rZWQobGlzdCkge1xyXG4gICAgbGV0IG51bU1lcmdlcztcclxuICAgIGxldCBpblNpemUgPSAxO1xyXG5cclxuICAgIGRvIHtcclxuICAgICAgICBsZXQgcCA9IGxpc3Q7XHJcbiAgICAgICAgbGV0IGU7XHJcbiAgICAgICAgbGlzdCA9IG51bGw7XHJcbiAgICAgICAgbGV0IHRhaWwgPSBudWxsO1xyXG4gICAgICAgIG51bU1lcmdlcyA9IDA7XHJcblxyXG4gICAgICAgIHdoaWxlIChwKSB7XHJcbiAgICAgICAgICAgIG51bU1lcmdlcysrO1xyXG4gICAgICAgICAgICBsZXQgcSA9IHA7XHJcbiAgICAgICAgICAgIGxldCBwU2l6ZSA9IDA7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5TaXplOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHBTaXplKys7XHJcbiAgICAgICAgICAgICAgICBxID0gcS5uZXh0WjtcclxuICAgICAgICAgICAgICAgIGlmICghcSkgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IHFTaXplID0gaW5TaXplO1xyXG5cclxuICAgICAgICAgICAgd2hpbGUgKHBTaXplID4gMCB8fCAocVNpemUgPiAwICYmIHEpKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHBTaXplICE9PSAwICYmIChxU2l6ZSA9PT0gMCB8fCAhcSB8fCBwLnogPD0gcS56KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGUgPSBwO1xyXG4gICAgICAgICAgICAgICAgICAgIHAgPSBwLm5leHRaO1xyXG4gICAgICAgICAgICAgICAgICAgIHBTaXplLS07XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGUgPSBxO1xyXG4gICAgICAgICAgICAgICAgICAgIHEgPSBxLm5leHRaO1xyXG4gICAgICAgICAgICAgICAgICAgIHFTaXplLS07XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRhaWwpIHRhaWwubmV4dFogPSBlO1xyXG4gICAgICAgICAgICAgICAgZWxzZSBsaXN0ID0gZTtcclxuXHJcbiAgICAgICAgICAgICAgICBlLnByZXZaID0gdGFpbDtcclxuICAgICAgICAgICAgICAgIHRhaWwgPSBlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBwID0gcTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRhaWwubmV4dFogPSBudWxsO1xyXG4gICAgICAgIGluU2l6ZSAqPSAyO1xyXG5cclxuICAgIH0gd2hpbGUgKG51bU1lcmdlcyA+IDEpO1xyXG5cclxuICAgIHJldHVybiBsaXN0O1xyXG59XHJcblxyXG4vLyB6LW9yZGVyIG9mIGEgcG9pbnQgZ2l2ZW4gY29vcmRzIGFuZCBpbnZlcnNlIG9mIHRoZSBsb25nZXIgc2lkZSBvZiBkYXRhIGJib3hcclxuZnVuY3Rpb24gek9yZGVyKHgsIHksIG1pblgsIG1pblksIGludlNpemUpIHtcclxuICAgIC8vIGNvb3JkcyBhcmUgdHJhbnNmb3JtZWQgaW50byBub24tbmVnYXRpdmUgMTUtYml0IGludGVnZXIgcmFuZ2VcclxuICAgIHggPSAoeCAtIG1pblgpICogaW52U2l6ZSB8IDA7XHJcbiAgICB5ID0gKHkgLSBtaW5ZKSAqIGludlNpemUgfCAwO1xyXG5cclxuICAgIHggPSAoeCB8ICh4IDw8IDgpKSAmIDB4MDBGRjAwRkY7XHJcbiAgICB4ID0gKHggfCAoeCA8PCA0KSkgJiAweDBGMEYwRjBGO1xyXG4gICAgeCA9ICh4IHwgKHggPDwgMikpICYgMHgzMzMzMzMzMztcclxuICAgIHggPSAoeCB8ICh4IDw8IDEpKSAmIDB4NTU1NTU1NTU7XHJcblxyXG4gICAgeSA9ICh5IHwgKHkgPDwgOCkpICYgMHgwMEZGMDBGRjtcclxuICAgIHkgPSAoeSB8ICh5IDw8IDQpKSAmIDB4MEYwRjBGMEY7XHJcbiAgICB5ID0gKHkgfCAoeSA8PCAyKSkgJiAweDMzMzMzMzMzO1xyXG4gICAgeSA9ICh5IHwgKHkgPDwgMSkpICYgMHg1NTU1NTU1NTtcclxuXHJcbiAgICByZXR1cm4geCB8ICh5IDw8IDEpO1xyXG59XHJcblxyXG4vLyBmaW5kIHRoZSBsZWZ0bW9zdCBub2RlIG9mIGEgcG9seWdvbiByaW5nXHJcbmZ1bmN0aW9uIGdldExlZnRtb3N0KHN0YXJ0KSB7XHJcbiAgICBsZXQgcCA9IHN0YXJ0LFxyXG4gICAgICAgIGxlZnRtb3N0ID0gc3RhcnQ7XHJcbiAgICBkbyB7XHJcbiAgICAgICAgaWYgKHAueCA8IGxlZnRtb3N0LnggfHwgKHAueCA9PT0gbGVmdG1vc3QueCAmJiBwLnkgPCBsZWZ0bW9zdC55KSkgbGVmdG1vc3QgPSBwO1xyXG4gICAgICAgIHAgPSBwLm5leHQ7XHJcbiAgICB9IHdoaWxlIChwICE9PSBzdGFydCk7XHJcblxyXG4gICAgcmV0dXJuIGxlZnRtb3N0O1xyXG59XHJcblxyXG4vLyBjaGVjayBpZiBhIHBvaW50IGxpZXMgd2l0aGluIGEgY29udmV4IHRyaWFuZ2xlXHJcbmZ1bmN0aW9uIHBvaW50SW5UcmlhbmdsZShheCwgYXksIGJ4LCBieSwgY3gsIGN5LCBweCwgcHkpIHtcclxuICAgIHJldHVybiAoY3ggLSBweCkgKiAoYXkgLSBweSkgPj0gKGF4IC0gcHgpICogKGN5IC0gcHkpICYmXHJcbiAgICAgICAgICAgKGF4IC0gcHgpICogKGJ5IC0gcHkpID49IChieCAtIHB4KSAqIChheSAtIHB5KSAmJlxyXG4gICAgICAgICAgIChieCAtIHB4KSAqIChjeSAtIHB5KSA+PSAoY3ggLSBweCkgKiAoYnkgLSBweSk7XHJcbn1cclxuXHJcbi8vIGNoZWNrIGlmIGEgcG9pbnQgbGllcyB3aXRoaW4gYSBjb252ZXggdHJpYW5nbGUgYnV0IGZhbHNlIGlmIGl0cyBlcXVhbCB0byB0aGUgZmlyc3QgcG9pbnQgb2YgdGhlIHRyaWFuZ2xlXHJcbmZ1bmN0aW9uIHBvaW50SW5UcmlhbmdsZUV4Y2VwdEZpcnN0KGF4LCBheSwgYngsIGJ5LCBjeCwgY3ksIHB4LCBweSkge1xyXG4gICAgcmV0dXJuICEoYXggPT09IHB4ICYmIGF5ID09PSBweSkgJiYgcG9pbnRJblRyaWFuZ2xlKGF4LCBheSwgYngsIGJ5LCBjeCwgY3ksIHB4LCBweSk7XHJcbn1cclxuXHJcbi8vIGNoZWNrIGlmIGEgZGlhZ29uYWwgYmV0d2VlbiB0d28gcG9seWdvbiBub2RlcyBpcyB2YWxpZCAobGllcyBpbiBwb2x5Z29uIGludGVyaW9yKVxyXG5mdW5jdGlvbiBpc1ZhbGlkRGlhZ29uYWwoYSwgYikge1xyXG4gICAgcmV0dXJuIGEubmV4dC5pICE9PSBiLmkgJiYgYS5wcmV2LmkgIT09IGIuaSAmJiAhaW50ZXJzZWN0c1BvbHlnb24oYSwgYikgJiYgLy8gZG9uZXMndCBpbnRlcnNlY3Qgb3RoZXIgZWRnZXNcclxuICAgICAgICAgICAobG9jYWxseUluc2lkZShhLCBiKSAmJiBsb2NhbGx5SW5zaWRlKGIsIGEpICYmIG1pZGRsZUluc2lkZShhLCBiKSAmJiAvLyBsb2NhbGx5IHZpc2libGVcclxuICAgICAgICAgICAgKGFyZWEoYS5wcmV2LCBhLCBiLnByZXYpIHx8IGFyZWEoYSwgYi5wcmV2LCBiKSkgfHwgLy8gZG9lcyBub3QgY3JlYXRlIG9wcG9zaXRlLWZhY2luZyBzZWN0b3JzXHJcbiAgICAgICAgICAgIGVxdWFscyhhLCBiKSAmJiBhcmVhKGEucHJldiwgYSwgYS5uZXh0KSA+IDAgJiYgYXJlYShiLnByZXYsIGIsIGIubmV4dCkgPiAwKTsgLy8gc3BlY2lhbCB6ZXJvLWxlbmd0aCBjYXNlXHJcbn1cclxuXHJcbi8vIHNpZ25lZCBhcmVhIG9mIGEgdHJpYW5nbGVcclxuZnVuY3Rpb24gYXJlYShwLCBxLCByKSB7XHJcbiAgICByZXR1cm4gKHEueSAtIHAueSkgKiAoci54IC0gcS54KSAtIChxLnggLSBwLngpICogKHIueSAtIHEueSk7XHJcbn1cclxuXHJcbi8vIGNoZWNrIGlmIHR3byBwb2ludHMgYXJlIGVxdWFsXHJcbmZ1bmN0aW9uIGVxdWFscyhwMSwgcDIpIHtcclxuICAgIHJldHVybiBwMS54ID09PSBwMi54ICYmIHAxLnkgPT09IHAyLnk7XHJcbn1cclxuXHJcbi8vIGNoZWNrIGlmIHR3byBzZWdtZW50cyBpbnRlcnNlY3RcclxuZnVuY3Rpb24gaW50ZXJzZWN0cyhwMSwgcTEsIHAyLCBxMikge1xyXG4gICAgY29uc3QgbzEgPSBzaWduKGFyZWEocDEsIHExLCBwMikpO1xyXG4gICAgY29uc3QgbzIgPSBzaWduKGFyZWEocDEsIHExLCBxMikpO1xyXG4gICAgY29uc3QgbzMgPSBzaWduKGFyZWEocDIsIHEyLCBwMSkpO1xyXG4gICAgY29uc3QgbzQgPSBzaWduKGFyZWEocDIsIHEyLCBxMSkpO1xyXG5cclxuICAgIGlmIChvMSAhPT0gbzIgJiYgbzMgIT09IG80KSByZXR1cm4gdHJ1ZTsgLy8gZ2VuZXJhbCBjYXNlXHJcblxyXG4gICAgaWYgKG8xID09PSAwICYmIG9uU2VnbWVudChwMSwgcDIsIHExKSkgcmV0dXJuIHRydWU7IC8vIHAxLCBxMSBhbmQgcDIgYXJlIGNvbGxpbmVhciBhbmQgcDIgbGllcyBvbiBwMXExXHJcbiAgICBpZiAobzIgPT09IDAgJiYgb25TZWdtZW50KHAxLCBxMiwgcTEpKSByZXR1cm4gdHJ1ZTsgLy8gcDEsIHExIGFuZCBxMiBhcmUgY29sbGluZWFyIGFuZCBxMiBsaWVzIG9uIHAxcTFcclxuICAgIGlmIChvMyA9PT0gMCAmJiBvblNlZ21lbnQocDIsIHAxLCBxMikpIHJldHVybiB0cnVlOyAvLyBwMiwgcTIgYW5kIHAxIGFyZSBjb2xsaW5lYXIgYW5kIHAxIGxpZXMgb24gcDJxMlxyXG4gICAgaWYgKG80ID09PSAwICYmIG9uU2VnbWVudChwMiwgcTEsIHEyKSkgcmV0dXJuIHRydWU7IC8vIHAyLCBxMiBhbmQgcTEgYXJlIGNvbGxpbmVhciBhbmQgcTEgbGllcyBvbiBwMnEyXHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG59XHJcblxyXG4vLyBmb3IgY29sbGluZWFyIHBvaW50cyBwLCBxLCByLCBjaGVjayBpZiBwb2ludCBxIGxpZXMgb24gc2VnbWVudCBwclxyXG5mdW5jdGlvbiBvblNlZ21lbnQocCwgcSwgcikge1xyXG4gICAgcmV0dXJuIHEueCA8PSBNYXRoLm1heChwLngsIHIueCkgJiYgcS54ID49IE1hdGgubWluKHAueCwgci54KSAmJiBxLnkgPD0gTWF0aC5tYXgocC55LCByLnkpICYmIHEueSA+PSBNYXRoLm1pbihwLnksIHIueSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNpZ24obnVtKSB7XHJcbiAgICByZXR1cm4gbnVtID4gMCA/IDEgOiBudW0gPCAwID8gLTEgOiAwO1xyXG59XHJcblxyXG4vLyBjaGVjayBpZiBhIHBvbHlnb24gZGlhZ29uYWwgaW50ZXJzZWN0cyBhbnkgcG9seWdvbiBzZWdtZW50c1xyXG5mdW5jdGlvbiBpbnRlcnNlY3RzUG9seWdvbihhLCBiKSB7XHJcbiAgICBsZXQgcCA9IGE7XHJcbiAgICBkbyB7XHJcbiAgICAgICAgaWYgKHAuaSAhPT0gYS5pICYmIHAubmV4dC5pICE9PSBhLmkgJiYgcC5pICE9PSBiLmkgJiYgcC5uZXh0LmkgIT09IGIuaSAmJlxyXG4gICAgICAgICAgICAgICAgaW50ZXJzZWN0cyhwLCBwLm5leHQsIGEsIGIpKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICBwID0gcC5uZXh0O1xyXG4gICAgfSB3aGlsZSAocCAhPT0gYSk7XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG59XHJcblxyXG4vLyBjaGVjayBpZiBhIHBvbHlnb24gZGlhZ29uYWwgaXMgbG9jYWxseSBpbnNpZGUgdGhlIHBvbHlnb25cclxuZnVuY3Rpb24gbG9jYWxseUluc2lkZShhLCBiKSB7XHJcbiAgICByZXR1cm4gYXJlYShhLnByZXYsIGEsIGEubmV4dCkgPCAwID9cclxuICAgICAgICBhcmVhKGEsIGIsIGEubmV4dCkgPj0gMCAmJiBhcmVhKGEsIGEucHJldiwgYikgPj0gMCA6XHJcbiAgICAgICAgYXJlYShhLCBiLCBhLnByZXYpIDwgMCB8fCBhcmVhKGEsIGEubmV4dCwgYikgPCAwO1xyXG59XHJcblxyXG4vLyBjaGVjayBpZiB0aGUgbWlkZGxlIHBvaW50IG9mIGEgcG9seWdvbiBkaWFnb25hbCBpcyBpbnNpZGUgdGhlIHBvbHlnb25cclxuZnVuY3Rpb24gbWlkZGxlSW5zaWRlKGEsIGIpIHtcclxuICAgIGxldCBwID0gYTtcclxuICAgIGxldCBpbnNpZGUgPSBmYWxzZTtcclxuICAgIGNvbnN0IHB4ID0gKGEueCArIGIueCkgLyAyO1xyXG4gICAgY29uc3QgcHkgPSAoYS55ICsgYi55KSAvIDI7XHJcbiAgICBkbyB7XHJcbiAgICAgICAgaWYgKCgocC55ID4gcHkpICE9PSAocC5uZXh0LnkgPiBweSkpICYmIHAubmV4dC55ICE9PSBwLnkgJiZcclxuICAgICAgICAgICAgICAgIChweCA8IChwLm5leHQueCAtIHAueCkgKiAocHkgLSBwLnkpIC8gKHAubmV4dC55IC0gcC55KSArIHAueCkpXHJcbiAgICAgICAgICAgIGluc2lkZSA9ICFpbnNpZGU7XHJcbiAgICAgICAgcCA9IHAubmV4dDtcclxuICAgIH0gd2hpbGUgKHAgIT09IGEpO1xyXG5cclxuICAgIHJldHVybiBpbnNpZGU7XHJcbn1cclxuXHJcbi8vIGxpbmsgdHdvIHBvbHlnb24gdmVydGljZXMgd2l0aCBhIGJyaWRnZTsgaWYgdGhlIHZlcnRpY2VzIGJlbG9uZyB0byB0aGUgc2FtZSByaW5nLCBpdCBzcGxpdHMgcG9seWdvbiBpbnRvIHR3bztcclxuLy8gaWYgb25lIGJlbG9uZ3MgdG8gdGhlIG91dGVyIHJpbmcgYW5kIGFub3RoZXIgdG8gYSBob2xlLCBpdCBtZXJnZXMgaXQgaW50byBhIHNpbmdsZSByaW5nXHJcbmZ1bmN0aW9uIHNwbGl0UG9seWdvbihhLCBiKSB7XHJcbiAgICBjb25zdCBhMiA9IGNyZWF0ZU5vZGUoYS5pLCBhLngsIGEueSksXHJcbiAgICAgICAgYjIgPSBjcmVhdGVOb2RlKGIuaSwgYi54LCBiLnkpLFxyXG4gICAgICAgIGFuID0gYS5uZXh0LFxyXG4gICAgICAgIGJwID0gYi5wcmV2O1xyXG5cclxuICAgIGEubmV4dCA9IGI7XHJcbiAgICBiLnByZXYgPSBhO1xyXG5cclxuICAgIGEyLm5leHQgPSBhbjtcclxuICAgIGFuLnByZXYgPSBhMjtcclxuXHJcbiAgICBiMi5uZXh0ID0gYTI7XHJcbiAgICBhMi5wcmV2ID0gYjI7XHJcblxyXG4gICAgYnAubmV4dCA9IGIyO1xyXG4gICAgYjIucHJldiA9IGJwO1xyXG5cclxuICAgIHJldHVybiBiMjtcclxufVxyXG5cclxuLy8gY3JlYXRlIGEgbm9kZSBhbmQgb3B0aW9uYWxseSBsaW5rIGl0IHdpdGggcHJldmlvdXMgb25lIChpbiBhIGNpcmN1bGFyIGRvdWJseSBsaW5rZWQgbGlzdClcclxuZnVuY3Rpb24gaW5zZXJ0Tm9kZShpLCB4LCB5LCBsYXN0KSB7XHJcbiAgICBjb25zdCBwID0gY3JlYXRlTm9kZShpLCB4LCB5KTtcclxuXHJcbiAgICBpZiAoIWxhc3QpIHtcclxuICAgICAgICBwLnByZXYgPSBwO1xyXG4gICAgICAgIHAubmV4dCA9IHA7XHJcblxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBwLm5leHQgPSBsYXN0Lm5leHQ7XHJcbiAgICAgICAgcC5wcmV2ID0gbGFzdDtcclxuICAgICAgICBsYXN0Lm5leHQucHJldiA9IHA7XHJcbiAgICAgICAgbGFzdC5uZXh0ID0gcDtcclxuICAgIH1cclxuICAgIHJldHVybiBwO1xyXG59XHJcblxyXG5mdW5jdGlvbiByZW1vdmVOb2RlKHApIHtcclxuICAgIHAubmV4dC5wcmV2ID0gcC5wcmV2O1xyXG4gICAgcC5wcmV2Lm5leHQgPSBwLm5leHQ7XHJcblxyXG4gICAgaWYgKHAucHJldlopIHAucHJldloubmV4dFogPSBwLm5leHRaO1xyXG4gICAgaWYgKHAubmV4dFopIHAubmV4dFoucHJldlogPSBwLnByZXZaO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVOb2RlKGksIHgsIHkpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgaSwgLy8gdmVydGV4IGluZGV4IGluIGNvb3JkaW5hdGVzIGFycmF5XHJcbiAgICAgICAgeCwgeSwgLy8gdmVydGV4IGNvb3JkaW5hdGVzXHJcbiAgICAgICAgcHJldjogbnVsbCwgLy8gcHJldmlvdXMgYW5kIG5leHQgdmVydGV4IG5vZGVzIGluIGEgcG9seWdvbiByaW5nXHJcbiAgICAgICAgbmV4dDogbnVsbCxcclxuICAgICAgICB6OiAwLCAvLyB6LW9yZGVyIGN1cnZlIHZhbHVlXHJcbiAgICAgICAgcHJldlo6IG51bGwsIC8vIHByZXZpb3VzIGFuZCBuZXh0IG5vZGVzIGluIHotb3JkZXJcclxuICAgICAgICBuZXh0WjogbnVsbCxcclxuICAgICAgICBzdGVpbmVyOiBmYWxzZSAvLyBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIGlzIGEgc3RlaW5lciBwb2ludFxyXG4gICAgfTtcclxufVxyXG5cclxuLy8gcmV0dXJuIGEgcGVyY2VudGFnZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHBvbHlnb24gYXJlYSBhbmQgaXRzIHRyaWFuZ3VsYXRpb24gYXJlYTtcclxuLy8gdXNlZCB0byB2ZXJpZnkgY29ycmVjdG5lc3Mgb2YgdHJpYW5ndWxhdGlvblxyXG5leHBvcnQgZnVuY3Rpb24gZGV2aWF0aW9uKGRhdGEsIGhvbGVJbmRpY2VzLCBkaW0sIHRyaWFuZ2xlcykge1xyXG4gICAgY29uc3QgaGFzSG9sZXMgPSBob2xlSW5kaWNlcyAmJiBob2xlSW5kaWNlcy5sZW5ndGg7XHJcbiAgICBjb25zdCBvdXRlckxlbiA9IGhhc0hvbGVzID8gaG9sZUluZGljZXNbMF0gKiBkaW0gOiBkYXRhLmxlbmd0aDtcclxuXHJcbiAgICBsZXQgcG9seWdvbkFyZWEgPSBNYXRoLmFicyhzaWduZWRBcmVhKGRhdGEsIDAsIG91dGVyTGVuLCBkaW0pKTtcclxuICAgIGlmIChoYXNIb2xlcykge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBob2xlSW5kaWNlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IGhvbGVJbmRpY2VzW2ldICogZGltO1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSBpIDwgbGVuIC0gMSA/IGhvbGVJbmRpY2VzW2kgKyAxXSAqIGRpbSA6IGRhdGEubGVuZ3RoO1xyXG4gICAgICAgICAgICBwb2x5Z29uQXJlYSAtPSBNYXRoLmFicyhzaWduZWRBcmVhKGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsZXQgdHJpYW5nbGVzQXJlYSA9IDA7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRyaWFuZ2xlcy5sZW5ndGg7IGkgKz0gMykge1xyXG4gICAgICAgIGNvbnN0IGEgPSB0cmlhbmdsZXNbaV0gKiBkaW07XHJcbiAgICAgICAgY29uc3QgYiA9IHRyaWFuZ2xlc1tpICsgMV0gKiBkaW07XHJcbiAgICAgICAgY29uc3QgYyA9IHRyaWFuZ2xlc1tpICsgMl0gKiBkaW07XHJcbiAgICAgICAgdHJpYW5nbGVzQXJlYSArPSBNYXRoLmFicyhcclxuICAgICAgICAgICAgKGRhdGFbYV0gLSBkYXRhW2NdKSAqIChkYXRhW2IgKyAxXSAtIGRhdGFbYSArIDFdKSAtXHJcbiAgICAgICAgICAgIChkYXRhW2FdIC0gZGF0YVtiXSkgKiAoZGF0YVtjICsgMV0gLSBkYXRhW2EgKyAxXSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBwb2x5Z29uQXJlYSA9PT0gMCAmJiB0cmlhbmdsZXNBcmVhID09PSAwID8gMCA6XHJcbiAgICAgICAgTWF0aC5hYnMoKHRyaWFuZ2xlc0FyZWEgLSBwb2x5Z29uQXJlYSkgLyBwb2x5Z29uQXJlYSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNpZ25lZEFyZWEoZGF0YSwgc3RhcnQsIGVuZCwgZGltKSB7XHJcbiAgICBsZXQgc3VtID0gMDtcclxuICAgIGZvciAobGV0IGkgPSBzdGFydCwgaiA9IGVuZCAtIGRpbTsgaSA8IGVuZDsgaSArPSBkaW0pIHtcclxuICAgICAgICBzdW0gKz0gKGRhdGFbal0gLSBkYXRhW2ldKSAqIChkYXRhW2kgKyAxXSArIGRhdGFbaiArIDFdKTtcclxuICAgICAgICBqID0gaTtcclxuICAgIH1cclxuICAgIHJldHVybiBzdW07XHJcbn1cclxuXHJcbi8vIHR1cm4gYSBwb2x5Z29uIGluIGEgbXVsdGktZGltZW5zaW9uYWwgYXJyYXkgZm9ybSAoZS5nLiBhcyBpbiBHZW9KU09OKSBpbnRvIGEgZm9ybSBFYXJjdXQgYWNjZXB0c1xyXG5leHBvcnQgZnVuY3Rpb24gZmxhdHRlbihkYXRhKSB7XHJcbiAgICBjb25zdCB2ZXJ0aWNlcyA9IFtdO1xyXG4gICAgY29uc3QgaG9sZXMgPSBbXTtcclxuICAgIGNvbnN0IGRpbWVuc2lvbnMgPSBkYXRhWzBdWzBdLmxlbmd0aDtcclxuICAgIGxldCBob2xlSW5kZXggPSAwO1xyXG4gICAgbGV0IHByZXZMZW4gPSAwO1xyXG5cclxuICAgIGZvciAoY29uc3QgcmluZyBvZiBkYXRhKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBwIG9mIHJpbmcpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgZCA9IDA7IGQgPCBkaW1lbnNpb25zOyBkKyspIHZlcnRpY2VzLnB1c2gocFtkXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwcmV2TGVuKSB7XHJcbiAgICAgICAgICAgIGhvbGVJbmRleCArPSBwcmV2TGVuO1xyXG4gICAgICAgICAgICBob2xlcy5wdXNoKGhvbGVJbmRleCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHByZXZMZW4gPSByaW5nLmxlbmd0aDtcclxuICAgIH1cclxuICAgIHJldHVybiB7dmVydGljZXMsIGhvbGVzLCBkaW1lbnNpb25zfTtcclxufVxyXG4iLCJpbXBvcnQgZWFyY3V0IGZyb20gJy4vbGliL2VhcmN1dC5qcyc7XHJcblxyXG5jbGFzcyBFYXJjdXQge1xyXG5cclxuXHQvKipcclxuXHQgKiBUcmlhbmd1bGF0ZXMgdGhlIGdpdmVuIHNoYXBlIGRlZmluaXRpb24gYnkgcmV0dXJuaW5nIGFuIGFycmF5IG9mIHRyaWFuZ2xlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gZGF0YSAtIEFuIGFycmF5IHdpdGggMkQgcG9pbnRzLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gaG9sZUluZGljZXMgLSBBbiBhcnJheSB3aXRoIGluZGljZXMgZGVmaW5pbmcgaG9sZXMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtkaW09Ml0gLSBUaGUgbnVtYmVyIG9mIGNvb3JkaW5hdGVzIHBlciB2ZXJ0ZXggaW4gdGhlIGlucHV0IGFycmF5LlxyXG5cdCAqIEByZXR1cm4ge0FycmF5PG51bWJlcj59IEFuIGFycmF5IHJlcHJlc2VudGluZyB0aGUgdHJpYW5ndWxhdGVkIGZhY2VzLiBFYWNoIGZhY2UgaXMgZGVmaW5lZCBieSB0aHJlZSBjb25zZWN1dGl2ZSBudW1iZXJzXHJcblx0ICogcmVwcmVzZW50aW5nIHZlcnRleCBpbmRpY2VzLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyB0cmlhbmd1bGF0ZSggZGF0YSwgaG9sZUluZGljZXMsIGRpbSA9IDIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIGVhcmN1dCggZGF0YSwgaG9sZUluZGljZXMsIGRpbSApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBFYXJjdXQgfTtcclxuIiwiaW1wb3J0IHsgRWFyY3V0IH0gZnJvbSAnLi9FYXJjdXQuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgY2xhc3MgY29udGFpbmluZyB1dGlsaXR5IGZ1bmN0aW9ucyBmb3Igc2hhcGVzLlxyXG4gKlxyXG4gKiBAaGlkZWNvbnN0cnVjdG9yXHJcbiAqL1xyXG5jbGFzcyBTaGFwZVV0aWxzIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ2FsY3VsYXRlIGFyZWEgb2YgYSAoIDJEICkgY29udG91ciBwb2x5Z29uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxWZWN0b3IyPn0gY29udG91ciAtIEFuIGFycmF5IG9mIDJEIHBvaW50cy5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBhcmVhLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBhcmVhKCBjb250b3VyICkge1xyXG5cclxuXHRcdGNvbnN0IG4gPSBjb250b3VyLmxlbmd0aDtcclxuXHRcdGxldCBhID0gMC4wO1xyXG5cclxuXHRcdGZvciAoIGxldCBwID0gbiAtIDEsIHEgPSAwOyBxIDwgbjsgcCA9IHEgKysgKSB7XHJcblxyXG5cdFx0XHRhICs9IGNvbnRvdXJbIHAgXS54ICogY29udG91clsgcSBdLnkgLSBjb250b3VyWyBxIF0ueCAqIGNvbnRvdXJbIHAgXS55O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gYSAqIDAuNTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gY29udG91ciB1c2VzIGEgY2xvY2t3aXNlIHdpbmRpbmcgb3JkZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PFZlY3RvcjI+fSBwdHMgLSBBbiBhcnJheSBvZiAyRCBwb2ludHMgZGVmaW5pbmcgYSBwb2x5Z29uLlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGdpdmVuIGNvbnRvdXIgdXNlcyBhIGNsb2Nrd2lzZSB3aW5kaW5nIG9yZGVyIG9yIG5vdC5cclxuXHQgKi9cclxuXHRzdGF0aWMgaXNDbG9ja1dpc2UoIHB0cyApIHtcclxuXHJcblx0XHRyZXR1cm4gU2hhcGVVdGlscy5hcmVhKCBwdHMgKSA8IDA7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVHJpYW5ndWxhdGVzIHRoZSBnaXZlbiBzaGFwZSBkZWZpbml0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxWZWN0b3IyPn0gY29udG91ciAtIEFuIGFycmF5IG9mIDJEIHBvaW50cyBkZWZpbmluZyB0aGUgY29udG91ci5cclxuXHQgKiBAcGFyYW0ge0FycmF5PEFycmF5PFZlY3RvcjI+Pn0gaG9sZXMgLSBBbiBhcnJheSB0aGF0IGhvbGRzIGFycmF5cyBvZiAyRCBwb2ludHMgZGVmaW5pbmcgdGhlIGhvbGVzLlxyXG5cdCAqIEByZXR1cm4ge0FycmF5PEFycmF5PG51bWJlcj4+fSBBbiBhcnJheSB0aGF0IGhvbGRzIGZvciBlYWNoIGZhY2UgZGVmaW5pdGlvbiBhbiBhcnJheSB3aXRoIHRocmVlIGluZGljZXMuXHJcblx0ICovXHJcblx0c3RhdGljIHRyaWFuZ3VsYXRlU2hhcGUoIGNvbnRvdXIsIGhvbGVzICkge1xyXG5cclxuXHRcdGNvbnN0IHZlcnRpY2VzID0gW107IC8vIGZsYXQgYXJyYXkgb2YgdmVydGljZXMgbGlrZSBbIHgwLHkwLCB4MSx5MSwgeDIseTIsIC4uLiBdXHJcblx0XHRjb25zdCBob2xlSW5kaWNlcyA9IFtdOyAvLyBhcnJheSBvZiBob2xlIGluZGljZXNcclxuXHRcdGNvbnN0IGZhY2VzID0gW107IC8vIGZpbmFsIGFycmF5IG9mIHZlcnRleCBpbmRpY2VzIGxpa2UgWyBbIGEsYixkIF0sIFsgYixjLGQgXSBdXHJcblxyXG5cdFx0cmVtb3ZlRHVwRW5kUHRzKCBjb250b3VyICk7XHJcblx0XHRhZGRDb250b3VyKCB2ZXJ0aWNlcywgY29udG91ciApO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0bGV0IGhvbGVJbmRleCA9IGNvbnRvdXIubGVuZ3RoO1xyXG5cclxuXHRcdGhvbGVzLmZvckVhY2goIHJlbW92ZUR1cEVuZFB0cyApO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGhvbGVzLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdGhvbGVJbmRpY2VzLnB1c2goIGhvbGVJbmRleCApO1xyXG5cdFx0XHRob2xlSW5kZXggKz0gaG9sZXNbIGkgXS5sZW5ndGg7XHJcblx0XHRcdGFkZENvbnRvdXIoIHZlcnRpY2VzLCBob2xlc1sgaSBdICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0Y29uc3QgdHJpYW5nbGVzID0gRWFyY3V0LnRyaWFuZ3VsYXRlKCB2ZXJ0aWNlcywgaG9sZUluZGljZXMgKTtcclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHRyaWFuZ2xlcy5sZW5ndGg7IGkgKz0gMyApIHtcclxuXHJcblx0XHRcdGZhY2VzLnB1c2goIHRyaWFuZ2xlcy5zbGljZSggaSwgaSArIDMgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZmFjZXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlbW92ZUR1cEVuZFB0cyggcG9pbnRzICkge1xyXG5cclxuXHRjb25zdCBsID0gcG9pbnRzLmxlbmd0aDtcclxuXHJcblx0aWYgKCBsID4gMiAmJiBwb2ludHNbIGwgLSAxIF0uZXF1YWxzKCBwb2ludHNbIDAgXSApICkge1xyXG5cclxuXHRcdHBvaW50cy5wb3AoKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gYWRkQ29udG91ciggdmVydGljZXMsIGNvbnRvdXIgKSB7XHJcblxyXG5cdGZvciAoIGxldCBpID0gMDsgaSA8IGNvbnRvdXIubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdHZlcnRpY2VzLnB1c2goIGNvbnRvdXJbIGkgXS54ICk7XHJcblx0XHR2ZXJ0aWNlcy5wdXNoKCBjb250b3VyWyBpIF0ueSApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBTaGFwZVV0aWxzIH07XHJcbiIsImltcG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9CdWZmZXJHZW9tZXRyeS5qcyc7XHJcbmltcG9ydCB7IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcbmltcG9ydCAqIGFzIEN1cnZlcyBmcm9tICcuLi9leHRyYXMvY3VydmVzL0N1cnZlcy5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjIuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuaW1wb3J0IHsgU2hhcGUgfSBmcm9tICcuLi9leHRyYXMvY29yZS9TaGFwZS5qcyc7XHJcbmltcG9ydCB7IFNoYXBlVXRpbHMgfSBmcm9tICcuLi9leHRyYXMvU2hhcGVVdGlscy5qcyc7XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBleHRydWRlZCBnZW9tZXRyeSBmcm9tIGEgcGF0aCBzaGFwZS5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgbGVuZ3RoID0gMTIsIHdpZHRoID0gODtcclxuICpcclxuICogY29uc3Qgc2hhcGUgPSBuZXcgVEhSRUUuU2hhcGUoKTtcclxuICogc2hhcGUubW92ZVRvKCAwLDAgKTtcclxuICogc2hhcGUubGluZVRvKCAwLCB3aWR0aCApO1xyXG4gKiBzaGFwZS5saW5lVG8oIGxlbmd0aCwgd2lkdGggKTtcclxuICogc2hhcGUubGluZVRvKCBsZW5ndGgsIDAgKTtcclxuICogc2hhcGUubGluZVRvKCAwLCAwICk7XHJcbiAqXHJcbiAqIGNvbnN0IGdlb21ldHJ5ID0gbmV3IFRIUkVFLkV4dHJ1ZGVHZW9tZXRyeSggc2hhcGUgKTtcclxuICogY29uc3QgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IDB4MDBmZjAwIH0gKTtcclxuICogY29uc3QgbWVzaCA9IG5ldyBUSFJFRS5NZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKSA7XHJcbiAqIHNjZW5lLmFkZCggbWVzaCApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIEJ1ZmZlckdlb21ldHJ5XHJcbiAqL1xyXG5jbGFzcyBFeHRydWRlR2VvbWV0cnkgZXh0ZW5kcyBCdWZmZXJHZW9tZXRyeSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgZXh0cnVkZSBnZW9tZXRyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7U2hhcGV8QXJyYXk8U2hhcGU+fSBbc2hhcGVzXSAtIEEgc2hhcGUgb3IgYW4gYXJyYXkgb2Ygc2hhcGVzLlxyXG5cdCAqIEBwYXJhbSB7RXh0cnVkZUdlb21ldHJ5fk9wdGlvbnN9IFtvcHRpb25zXSAtIFRoZSBleHRydWRlIHNldHRpbmdzLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBzaGFwZXMgPSBuZXcgU2hhcGUoIFsgbmV3IFZlY3RvcjIoIDAuNSwgMC41ICksIG5ldyBWZWN0b3IyKCAtIDAuNSwgMC41ICksIG5ldyBWZWN0b3IyKCAtIDAuNSwgLSAwLjUgKSwgbmV3IFZlY3RvcjIoIDAuNSwgLSAwLjUgKSBdICksIG9wdGlvbnMgPSB7fSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdFeHRydWRlR2VvbWV0cnknO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG9sZHMgdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMgdGhhdCBoYXZlIGJlZW5cclxuXHRcdCAqIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGdlb21ldHJ5LiBBbnkgbW9kaWZpY2F0aW9uXHJcblx0XHQgKiBhZnRlciBpbnN0YW50aWF0aW9uIGRvZXMgbm90IGNoYW5nZSB0aGUgZ2VvbWV0cnkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0ge1xyXG5cdFx0XHRzaGFwZXM6IHNoYXBlcyxcclxuXHRcdFx0b3B0aW9uczogb3B0aW9uc1xyXG5cdFx0fTtcclxuXHJcblx0XHRzaGFwZXMgPSBBcnJheS5pc0FycmF5KCBzaGFwZXMgKSA/IHNoYXBlcyA6IFsgc2hhcGVzIF07XHJcblxyXG5cdFx0Y29uc3Qgc2NvcGUgPSB0aGlzO1xyXG5cclxuXHRcdGNvbnN0IHZlcnRpY2VzQXJyYXkgPSBbXTtcclxuXHRcdGNvbnN0IHV2QXJyYXkgPSBbXTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBzaGFwZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHNoYXBlID0gc2hhcGVzWyBpIF07XHJcblx0XHRcdGFkZFNoYXBlKCBzaGFwZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBidWlsZCBnZW9tZXRyeVxyXG5cclxuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXNBcnJheSwgMyApICk7XHJcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2QXJyYXksIDIgKSApO1xyXG5cclxuXHRcdHRoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTtcclxuXHJcblx0XHQvLyBmdW5jdGlvbnNcclxuXHJcblx0XHRmdW5jdGlvbiBhZGRTaGFwZSggc2hhcGUgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBwbGFjZWhvbGRlciA9IFtdO1xyXG5cclxuXHRcdFx0Ly8gb3B0aW9uc1xyXG5cclxuXHRcdFx0Y29uc3QgY3VydmVTZWdtZW50cyA9IG9wdGlvbnMuY3VydmVTZWdtZW50cyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5jdXJ2ZVNlZ21lbnRzIDogMTI7XHJcblx0XHRcdGNvbnN0IHN0ZXBzID0gb3B0aW9ucy5zdGVwcyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5zdGVwcyA6IDE7XHJcblx0XHRcdGNvbnN0IGRlcHRoID0gb3B0aW9ucy5kZXB0aCAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5kZXB0aCA6IDE7XHJcblxyXG5cdFx0XHRsZXQgYmV2ZWxFbmFibGVkID0gb3B0aW9ucy5iZXZlbEVuYWJsZWQgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuYmV2ZWxFbmFibGVkIDogdHJ1ZTtcclxuXHRcdFx0bGV0IGJldmVsVGhpY2tuZXNzID0gb3B0aW9ucy5iZXZlbFRoaWNrbmVzcyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5iZXZlbFRoaWNrbmVzcyA6IDAuMjtcclxuXHRcdFx0bGV0IGJldmVsU2l6ZSA9IG9wdGlvbnMuYmV2ZWxTaXplICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJldmVsU2l6ZSA6IGJldmVsVGhpY2tuZXNzIC0gMC4xO1xyXG5cdFx0XHRsZXQgYmV2ZWxPZmZzZXQgPSBvcHRpb25zLmJldmVsT2Zmc2V0ICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJldmVsT2Zmc2V0IDogMDtcclxuXHRcdFx0bGV0IGJldmVsU2VnbWVudHMgPSBvcHRpb25zLmJldmVsU2VnbWVudHMgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuYmV2ZWxTZWdtZW50cyA6IDM7XHJcblxyXG5cdFx0XHRjb25zdCBleHRydWRlUGF0aCA9IG9wdGlvbnMuZXh0cnVkZVBhdGg7XHJcblxyXG5cdFx0XHRjb25zdCB1dmdlbiA9IG9wdGlvbnMuVVZHZW5lcmF0b3IgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuVVZHZW5lcmF0b3IgOiBXb3JsZFVWR2VuZXJhdG9yO1xyXG5cclxuXHRcdFx0Ly9cclxuXHJcblx0XHRcdGxldCBleHRydWRlUHRzLCBleHRydWRlQnlQYXRoID0gZmFsc2U7XHJcblx0XHRcdGxldCBzcGxpbmVUdWJlLCBiaW5vcm1hbCwgbm9ybWFsLCBwb3NpdGlvbjI7XHJcblxyXG5cdFx0XHRpZiAoIGV4dHJ1ZGVQYXRoICkge1xyXG5cclxuXHRcdFx0XHRleHRydWRlUHRzID0gZXh0cnVkZVBhdGguZ2V0U3BhY2VkUG9pbnRzKCBzdGVwcyApO1xyXG5cclxuXHRcdFx0XHRleHRydWRlQnlQYXRoID0gdHJ1ZTtcclxuXHRcdFx0XHRiZXZlbEVuYWJsZWQgPSBmYWxzZTsgLy8gYmV2ZWxzIG5vdCBzdXBwb3J0ZWQgZm9yIHBhdGggZXh0cnVzaW9uXHJcblxyXG5cdFx0XHRcdC8vIFNFVFVQIFROQiB2YXJpYWJsZXNcclxuXHJcblx0XHRcdFx0Ly8gVE9ETzEgLSBoYXZlIGEgLmlzQ2xvc2VkIGluIHNwbGluZT9cclxuXHJcblx0XHRcdFx0c3BsaW5lVHViZSA9IGV4dHJ1ZGVQYXRoLmNvbXB1dGVGcmVuZXRGcmFtZXMoIHN0ZXBzLCBmYWxzZSApO1xyXG5cclxuXHRcdFx0XHQvLyBjb25zb2xlLmxvZyhzcGxpbmVUdWJlLCAnc3BsaW5lVHViZScsIHNwbGluZVR1YmUubm9ybWFscy5sZW5ndGgsICdzdGVwcycsIHN0ZXBzLCAnZXh0cnVkZVB0cycsIGV4dHJ1ZGVQdHMubGVuZ3RoKTtcclxuXHJcblx0XHRcdFx0Ymlub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xyXG5cdFx0XHRcdG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XHJcblx0XHRcdFx0cG9zaXRpb24yID0gbmV3IFZlY3RvcjMoKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIFNhZmVndWFyZHMgaWYgYmV2ZWxzIGFyZSBub3QgZW5hYmxlZFxyXG5cclxuXHRcdFx0aWYgKCAhIGJldmVsRW5hYmxlZCApIHtcclxuXHJcblx0XHRcdFx0YmV2ZWxTZWdtZW50cyA9IDA7XHJcblx0XHRcdFx0YmV2ZWxUaGlja25lc3MgPSAwO1xyXG5cdFx0XHRcdGJldmVsU2l6ZSA9IDA7XHJcblx0XHRcdFx0YmV2ZWxPZmZzZXQgPSAwO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gVmFyaWFibGVzIGluaXRpYWxpemF0aW9uXHJcblxyXG5cdFx0XHRjb25zdCBzaGFwZVBvaW50cyA9IHNoYXBlLmV4dHJhY3RQb2ludHMoIGN1cnZlU2VnbWVudHMgKTtcclxuXHJcblx0XHRcdGxldCB2ZXJ0aWNlcyA9IHNoYXBlUG9pbnRzLnNoYXBlO1xyXG5cdFx0XHRjb25zdCBob2xlcyA9IHNoYXBlUG9pbnRzLmhvbGVzO1xyXG5cclxuXHRcdFx0Y29uc3QgcmV2ZXJzZSA9ICEgU2hhcGVVdGlscy5pc0Nsb2NrV2lzZSggdmVydGljZXMgKTtcclxuXHJcblx0XHRcdGlmICggcmV2ZXJzZSApIHtcclxuXHJcblx0XHRcdFx0dmVydGljZXMgPSB2ZXJ0aWNlcy5yZXZlcnNlKCk7XHJcblxyXG5cdFx0XHRcdC8vIE1heWJlIHdlIHNob3VsZCBhbHNvIGNoZWNrIGlmIGhvbGVzIGFyZSBpbiB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uLCBqdXN0IHRvIGJlIHNhZmUgLi4uXHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBoID0gMCwgaGwgPSBob2xlcy5sZW5ndGg7IGggPCBobDsgaCArKyApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBhaG9sZSA9IGhvbGVzWyBoIF07XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBTaGFwZVV0aWxzLmlzQ2xvY2tXaXNlKCBhaG9sZSApICkge1xyXG5cclxuXHRcdFx0XHRcdFx0aG9sZXNbIGggXSA9IGFob2xlLnJldmVyc2UoKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8qKk1lcmdlcyBpbmRleC1hZGphY2VudCBwb2ludHMgdGhhdCBhcmUgd2l0aGluIGEgdGhyZXNob2xkIGRpc3RhbmNlIG9mIGVhY2ggb3RoZXIuIEFycmF5IGlzIG1vZGlmaWVkIGluLXBsYWNlLiBUaHJlc2hvbGQgZGlzdGFuY2UgaXMgZW1waXJpY2FsLCBhbmQgc2NhbGVkIGJhc2VkIG9uIHRoZSBtYWduaXR1ZGUgb2YgcG9pbnQgY29vcmRpbmF0ZXMuXHJcblx0XHRcdCAqIEBwYXJhbSB7QXJyYXk8VmVjdG9yMj59IHBvaW50c1xyXG5cdFx0XHQqL1xyXG5cdFx0XHRmdW5jdGlvbiBtZXJnZU92ZXJsYXBwaW5nUG9pbnRzKCBwb2ludHMgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IFRIUkVTSE9MRCA9IDFlLTEwO1xyXG5cdFx0XHRcdGNvbnN0IFRIUkVTSE9MRF9TUSA9IFRIUkVTSE9MRCAqIFRIUkVTSE9MRDtcclxuXHRcdFx0XHRsZXQgcHJldlBvcyA9IHBvaW50c1sgMCBdO1xyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMTsgaSA8PSBwb2ludHMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGN1cnJlbnRJbmRleCA9IGkgJSBwb2ludHMubGVuZ3RoO1xyXG5cdFx0XHRcdFx0Y29uc3QgY3VycmVudFBvcyA9IHBvaW50c1sgY3VycmVudEluZGV4IF07XHJcblx0XHRcdFx0XHRjb25zdCBkeCA9IGN1cnJlbnRQb3MueCAtIHByZXZQb3MueDtcclxuXHRcdFx0XHRcdGNvbnN0IGR5ID0gY3VycmVudFBvcy55IC0gcHJldlBvcy55O1xyXG5cdFx0XHRcdFx0Y29uc3QgZGlzdFNxID0gZHggKiBkeCArIGR5ICogZHk7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3Qgc2NhbGluZ0ZhY3RvclNxcnQgPSBNYXRoLm1heChcclxuXHRcdFx0XHRcdFx0TWF0aC5hYnMoIGN1cnJlbnRQb3MueCApLFxyXG5cdFx0XHRcdFx0XHRNYXRoLmFicyggY3VycmVudFBvcy55ICksXHJcblx0XHRcdFx0XHRcdE1hdGguYWJzKCBwcmV2UG9zLnggKSxcclxuXHRcdFx0XHRcdFx0TWF0aC5hYnMoIHByZXZQb3MueSApXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0Y29uc3QgdGhlc2hvbGRTcVNjYWxlZCA9IFRIUkVTSE9MRF9TUSAqIHNjYWxpbmdGYWN0b3JTcXJ0ICogc2NhbGluZ0ZhY3RvclNxcnQ7XHJcblx0XHRcdFx0XHRpZiAoIGRpc3RTcSA8PSB0aGVzaG9sZFNxU2NhbGVkICkge1xyXG5cclxuXHRcdFx0XHRcdFx0cG9pbnRzLnNwbGljZSggY3VycmVudEluZGV4LCAxICk7XHJcblx0XHRcdFx0XHRcdGkgLS07XHJcblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRwcmV2UG9zID0gY3VycmVudFBvcztcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0bWVyZ2VPdmVybGFwcGluZ1BvaW50cyggdmVydGljZXMgKTtcclxuXHRcdFx0aG9sZXMuZm9yRWFjaCggbWVyZ2VPdmVybGFwcGluZ1BvaW50cyApO1xyXG5cclxuXHRcdFx0Y29uc3QgbnVtSG9sZXMgPSBob2xlcy5sZW5ndGg7XHJcblxyXG5cdFx0XHQvKiBWZXJ0aWNlcyAqL1xyXG5cclxuXHRcdFx0Y29uc3QgY29udG91ciA9IHZlcnRpY2VzOyAvLyB2ZXJ0aWNlcyBoYXMgYWxsIHBvaW50cyBidXQgY29udG91ciBoYXMgb25seSBwb2ludHMgb2YgY2lyY3VtZmVyZW5jZVxyXG5cclxuXHRcdFx0Zm9yICggbGV0IGggPSAwOyBoIDwgbnVtSG9sZXM7IGggKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGFob2xlID0gaG9sZXNbIGggXTtcclxuXHJcblx0XHRcdFx0dmVydGljZXMgPSB2ZXJ0aWNlcy5jb25jYXQoIGFob2xlICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cclxuXHRcdFx0ZnVuY3Rpb24gc2NhbGVQdDIoIHB0LCB2ZWMsIHNpemUgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggISB2ZWMgKSBjb25zb2xlLmVycm9yKCAnVEhSRUUuRXh0cnVkZUdlb21ldHJ5OiB2ZWMgZG9lcyBub3QgZXhpc3QnICk7XHJcblxyXG5cdFx0XHRcdHJldHVybiBwdC5jbG9uZSgpLmFkZFNjYWxlZFZlY3RvciggdmVjLCBzaXplICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCB2bGVuID0gdmVydGljZXMubGVuZ3RoO1xyXG5cclxuXHJcblx0XHRcdC8vIEZpbmQgZGlyZWN0aW9ucyBmb3IgcG9pbnQgbW92ZW1lbnRcclxuXHJcblxyXG5cdFx0XHRmdW5jdGlvbiBnZXRCZXZlbFZlYyggaW5QdCwgaW5QcmV2LCBpbk5leHQgKSB7XHJcblxyXG5cdFx0XHRcdC8vIGNvbXB1dGVzIGZvciBpblB0IHRoZSBjb3JyZXNwb25kaW5nIHBvaW50IGluUHQnIG9uIGEgbmV3IGNvbnRvdXJcclxuXHRcdFx0XHQvLyAgIHNoaWZ0ZWQgYnkgMSB1bml0IChsZW5ndGggb2Ygbm9ybWFsaXplZCB2ZWN0b3IpIHRvIHRoZSBsZWZ0XHJcblx0XHRcdFx0Ly8gaWYgd2Ugd2FsayBhbG9uZyBjb250b3VyIGNsb2Nrd2lzZSwgdGhpcyBuZXcgY29udG91ciBpcyBvdXRzaWRlIHRoZSBvbGQgb25lXHJcblx0XHRcdFx0Ly9cclxuXHRcdFx0XHQvLyBpblB0JyBpcyB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZSB0d28gbGluZXMgcGFyYWxsZWwgdG8gdGhlIHR3b1xyXG5cdFx0XHRcdC8vICBhZGphY2VudCBlZGdlcyBvZiBpblB0IGF0IGEgZGlzdGFuY2Ugb2YgMSB1bml0IG9uIHRoZSBsZWZ0IHNpZGUuXHJcblxyXG5cdFx0XHRcdGxldCB2X3RyYW5zX3gsIHZfdHJhbnNfeSwgc2hyaW5rX2J5OyAvLyByZXN1bHRpbmcgdHJhbnNsYXRpb24gdmVjdG9yIGZvciBpblB0XHJcblxyXG5cdFx0XHRcdC8vIGdvb2QgcmVhZGluZyBmb3IgZ2VvbWV0cnkgYWxnb3JpdGhtcyAoaGVyZTogbGluZS1saW5lIGludGVyc2VjdGlvbilcclxuXHRcdFx0XHQvLyBodHRwOi8vZ2VvbWFsZ29yaXRobXMuY29tL2EwNS1faW50ZXJzZWN0LTEuaHRtbFxyXG5cclxuXHRcdFx0XHRjb25zdCB2X3ByZXZfeCA9IGluUHQueCAtIGluUHJldi54LFxyXG5cdFx0XHRcdFx0dl9wcmV2X3kgPSBpblB0LnkgLSBpblByZXYueTtcclxuXHRcdFx0XHRjb25zdCB2X25leHRfeCA9IGluTmV4dC54IC0gaW5QdC54LFxyXG5cdFx0XHRcdFx0dl9uZXh0X3kgPSBpbk5leHQueSAtIGluUHQueTtcclxuXHJcblx0XHRcdFx0Y29uc3Qgdl9wcmV2X2xlbnNxID0gKCB2X3ByZXZfeCAqIHZfcHJldl94ICsgdl9wcmV2X3kgKiB2X3ByZXZfeSApO1xyXG5cclxuXHRcdFx0XHQvLyBjaGVjayBmb3IgY29sbGluZWFyIGVkZ2VzXHJcblx0XHRcdFx0Y29uc3QgY29sbGluZWFyMCA9ICggdl9wcmV2X3ggKiB2X25leHRfeSAtIHZfcHJldl95ICogdl9uZXh0X3ggKTtcclxuXHJcblx0XHRcdFx0aWYgKCBNYXRoLmFicyggY29sbGluZWFyMCApID4gTnVtYmVyLkVQU0lMT04gKSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gbm90IGNvbGxpbmVhclxyXG5cclxuXHRcdFx0XHRcdC8vIGxlbmd0aCBvZiB2ZWN0b3JzIGZvciBub3JtYWxpemluZ1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHZfcHJldl9sZW4gPSBNYXRoLnNxcnQoIHZfcHJldl9sZW5zcSApO1xyXG5cdFx0XHRcdFx0Y29uc3Qgdl9uZXh0X2xlbiA9IE1hdGguc3FydCggdl9uZXh0X3ggKiB2X25leHRfeCArIHZfbmV4dF95ICogdl9uZXh0X3kgKTtcclxuXHJcblx0XHRcdFx0XHQvLyBzaGlmdCBhZGphY2VudCBwb2ludHMgYnkgdW5pdCB2ZWN0b3JzIHRvIHRoZSBsZWZ0XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgcHRQcmV2U2hpZnRfeCA9ICggaW5QcmV2LnggLSB2X3ByZXZfeSAvIHZfcHJldl9sZW4gKTtcclxuXHRcdFx0XHRcdGNvbnN0IHB0UHJldlNoaWZ0X3kgPSAoIGluUHJldi55ICsgdl9wcmV2X3ggLyB2X3ByZXZfbGVuICk7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgcHROZXh0U2hpZnRfeCA9ICggaW5OZXh0LnggLSB2X25leHRfeSAvIHZfbmV4dF9sZW4gKTtcclxuXHRcdFx0XHRcdGNvbnN0IHB0TmV4dFNoaWZ0X3kgPSAoIGluTmV4dC55ICsgdl9uZXh0X3ggLyB2X25leHRfbGVuICk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gc2NhbGluZyBmYWN0b3IgZm9yIHZfcHJldiB0byBpbnRlcnNlY3Rpb24gcG9pbnRcclxuXHJcblx0XHRcdFx0XHRjb25zdCBzZiA9ICggKCBwdE5leHRTaGlmdF94IC0gcHRQcmV2U2hpZnRfeCApICogdl9uZXh0X3kgLVxyXG5cdFx0XHRcdFx0XHRcdCggcHROZXh0U2hpZnRfeSAtIHB0UHJldlNoaWZ0X3kgKSAqIHZfbmV4dF94ICkgL1xyXG5cdFx0XHRcdFx0XHQoIHZfcHJldl94ICogdl9uZXh0X3kgLSB2X3ByZXZfeSAqIHZfbmV4dF94ICk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gdmVjdG9yIGZyb20gaW5QdCB0byBpbnRlcnNlY3Rpb24gcG9pbnRcclxuXHJcblx0XHRcdFx0XHR2X3RyYW5zX3ggPSAoIHB0UHJldlNoaWZ0X3ggKyB2X3ByZXZfeCAqIHNmIC0gaW5QdC54ICk7XHJcblx0XHRcdFx0XHR2X3RyYW5zX3kgPSAoIHB0UHJldlNoaWZ0X3kgKyB2X3ByZXZfeSAqIHNmIC0gaW5QdC55ICk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gRG9uJ3Qgbm9ybWFsaXplISwgb3RoZXJ3aXNlIHNoYXJwIGNvcm5lcnMgYmVjb21lIHVnbHlcclxuXHRcdFx0XHRcdC8vICBidXQgcHJldmVudCBjcmF6eSBzcGlrZXNcclxuXHRcdFx0XHRcdGNvbnN0IHZfdHJhbnNfbGVuc3EgPSAoIHZfdHJhbnNfeCAqIHZfdHJhbnNfeCArIHZfdHJhbnNfeSAqIHZfdHJhbnNfeSApO1xyXG5cdFx0XHRcdFx0aWYgKCB2X3RyYW5zX2xlbnNxIDw9IDIgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gbmV3IFZlY3RvcjIoIHZfdHJhbnNfeCwgdl90cmFuc195ICk7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdHNocmlua19ieSA9IE1hdGguc3FydCggdl90cmFuc19sZW5zcSAvIDIgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gaGFuZGxlIHNwZWNpYWwgY2FzZSBvZiBjb2xsaW5lYXIgZWRnZXNcclxuXHJcblx0XHRcdFx0XHRsZXQgZGlyZWN0aW9uX2VxID0gZmFsc2U7IC8vIGFzc3VtZXM6IG9wcG9zaXRlXHJcblxyXG5cdFx0XHRcdFx0aWYgKCB2X3ByZXZfeCA+IE51bWJlci5FUFNJTE9OICkge1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCB2X25leHRfeCA+IE51bWJlci5FUFNJTE9OICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRkaXJlY3Rpb25fZXEgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIHZfcHJldl94IDwgLSBOdW1iZXIuRVBTSUxPTiApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKCB2X25leHRfeCA8IC0gTnVtYmVyLkVQU0lMT04gKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0ZGlyZWN0aW9uX2VxID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKCBNYXRoLnNpZ24oIHZfcHJldl95ICkgPT09IE1hdGguc2lnbiggdl9uZXh0X3kgKSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRkaXJlY3Rpb25fZXEgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGlmICggZGlyZWN0aW9uX2VxICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Ly8gY29uc29sZS5sb2coXCJXYXJuaW5nOiBsaW5lcyBhcmUgYSBzdHJhaWdodCBzZXF1ZW5jZVwiKTtcclxuXHRcdFx0XHRcdFx0dl90cmFuc194ID0gLSB2X3ByZXZfeTtcclxuXHRcdFx0XHRcdFx0dl90cmFuc195ID0gdl9wcmV2X3g7XHJcblx0XHRcdFx0XHRcdHNocmlua19ieSA9IE1hdGguc3FydCggdl9wcmV2X2xlbnNxICk7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdC8vIGNvbnNvbGUubG9nKFwiV2FybmluZzogbGluZXMgYXJlIGEgc3RyYWlnaHQgc3Bpa2VcIik7XHJcblx0XHRcdFx0XHRcdHZfdHJhbnNfeCA9IHZfcHJldl94O1xyXG5cdFx0XHRcdFx0XHR2X3RyYW5zX3kgPSB2X3ByZXZfeTtcclxuXHRcdFx0XHRcdFx0c2hyaW5rX2J5ID0gTWF0aC5zcXJ0KCB2X3ByZXZfbGVuc3EgLyAyICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHJldHVybiBuZXcgVmVjdG9yMiggdl90cmFuc194IC8gc2hyaW5rX2J5LCB2X3RyYW5zX3kgLyBzaHJpbmtfYnkgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblxyXG5cdFx0XHRjb25zdCBjb250b3VyTW92ZW1lbnRzID0gW107XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gY29udG91ci5sZW5ndGgsIGogPSBpbCAtIDEsIGsgPSBpICsgMTsgaSA8IGlsOyBpICsrLCBqICsrLCBrICsrICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIGogPT09IGlsICkgaiA9IDA7XHJcblx0XHRcdFx0aWYgKCBrID09PSBpbCApIGsgPSAwO1xyXG5cclxuXHRcdFx0XHQvLyAgKGopLS0tKGkpLS0tKGspXHJcblx0XHRcdFx0Ly8gY29uc29sZS5sb2coJ2ksaixrJywgaSwgaiAsIGspXHJcblxyXG5cdFx0XHRcdGNvbnRvdXJNb3ZlbWVudHNbIGkgXSA9IGdldEJldmVsVmVjKCBjb250b3VyWyBpIF0sIGNvbnRvdXJbIGogXSwgY29udG91clsgayBdICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBob2xlc01vdmVtZW50cyA9IFtdO1xyXG5cdFx0XHRsZXQgb25lSG9sZU1vdmVtZW50cywgdmVydGljZXNNb3ZlbWVudHMgPSBjb250b3VyTW92ZW1lbnRzLmNvbmNhdCgpO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGggPSAwLCBobCA9IG51bUhvbGVzOyBoIDwgaGw7IGggKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGFob2xlID0gaG9sZXNbIGggXTtcclxuXHJcblx0XHRcdFx0b25lSG9sZU1vdmVtZW50cyA9IFtdO1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gYWhvbGUubGVuZ3RoLCBqID0gaWwgLSAxLCBrID0gaSArIDE7IGkgPCBpbDsgaSArKywgaiArKywgayArKyApIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGogPT09IGlsICkgaiA9IDA7XHJcblx0XHRcdFx0XHRpZiAoIGsgPT09IGlsICkgayA9IDA7XHJcblxyXG5cdFx0XHRcdFx0Ly8gIChqKS0tLShpKS0tLShrKVxyXG5cdFx0XHRcdFx0b25lSG9sZU1vdmVtZW50c1sgaSBdID0gZ2V0QmV2ZWxWZWMoIGFob2xlWyBpIF0sIGFob2xlWyBqIF0sIGFob2xlWyBrIF0gKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRob2xlc01vdmVtZW50cy5wdXNoKCBvbmVIb2xlTW92ZW1lbnRzICk7XHJcblx0XHRcdFx0dmVydGljZXNNb3ZlbWVudHMgPSB2ZXJ0aWNlc01vdmVtZW50cy5jb25jYXQoIG9uZUhvbGVNb3ZlbWVudHMgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IGNvbnRyYWN0ZWRDb250b3VyVmVydGljZXMgPSBbXTtcclxuXHRcdFx0Y29uc3QgZXhwYW5kZWRIb2xlVmVydGljZXMgPSBbXTtcclxuXHJcblx0XHRcdC8vIExvb3AgYmV2ZWxTZWdtZW50cywgMSBmb3IgdGhlIGZyb250LCAxIGZvciB0aGUgYmFja1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGIgPSAwOyBiIDwgYmV2ZWxTZWdtZW50czsgYiArKyApIHtcclxuXHJcblx0XHRcdFx0Ly9mb3IgKCBiID0gYmV2ZWxTZWdtZW50czsgYiA+IDA7IGIgLS0gKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHQgPSBiIC8gYmV2ZWxTZWdtZW50cztcclxuXHRcdFx0XHRjb25zdCB6ID0gYmV2ZWxUaGlja25lc3MgKiBNYXRoLmNvcyggdCAqIE1hdGguUEkgLyAyICk7XHJcblx0XHRcdFx0Y29uc3QgYnMgPSBiZXZlbFNpemUgKiBNYXRoLnNpbiggdCAqIE1hdGguUEkgLyAyICkgKyBiZXZlbE9mZnNldDtcclxuXHJcblx0XHRcdFx0Ly8gY29udHJhY3Qgc2hhcGVcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IGNvbnRvdXIubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgdmVydCA9IHNjYWxlUHQyKCBjb250b3VyWyBpIF0sIGNvbnRvdXJNb3ZlbWVudHNbIGkgXSwgYnMgKTtcclxuXHJcblx0XHRcdFx0XHR2KCB2ZXJ0LngsIHZlcnQueSwgLSB6ICk7XHJcblx0XHRcdFx0XHRpZiAoIHQgPT0gMCApIGNvbnRyYWN0ZWRDb250b3VyVmVydGljZXMucHVzaCggdmVydCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8vIGV4cGFuZCBob2xlc1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaCA9IDAsIGhsID0gbnVtSG9sZXM7IGggPCBobDsgaCArKyApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBhaG9sZSA9IGhvbGVzWyBoIF07XHJcblx0XHRcdFx0XHRvbmVIb2xlTW92ZW1lbnRzID0gaG9sZXNNb3ZlbWVudHNbIGggXTtcclxuXHRcdFx0XHRcdGNvbnN0IG9uZUhvbGVWZXJ0aWNlcyA9IFtdO1xyXG5cdFx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IGFob2xlLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgdmVydCA9IHNjYWxlUHQyKCBhaG9sZVsgaSBdLCBvbmVIb2xlTW92ZW1lbnRzWyBpIF0sIGJzICk7XHJcblxyXG5cdFx0XHRcdFx0XHR2KCB2ZXJ0LngsIHZlcnQueSwgLSB6ICk7XHJcblx0XHRcdFx0XHRcdGlmICggdCA9PSAwICkgb25lSG9sZVZlcnRpY2VzLnB1c2goIHZlcnQgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aWYgKCB0ID09IDAgKSBleHBhbmRlZEhvbGVWZXJ0aWNlcy5wdXNoKCBvbmVIb2xlVmVydGljZXMgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgZmFjZXMgPSBTaGFwZVV0aWxzLnRyaWFuZ3VsYXRlU2hhcGUoIGNvbnRyYWN0ZWRDb250b3VyVmVydGljZXMsIGV4cGFuZGVkSG9sZVZlcnRpY2VzICk7XHJcblxyXG5cdFx0XHRjb25zdCBmbGVuID0gZmFjZXMubGVuZ3RoO1xyXG5cclxuXHRcdFx0Y29uc3QgYnMgPSBiZXZlbFNpemUgKyBiZXZlbE9mZnNldDtcclxuXHJcblx0XHRcdC8vIEJhY2sgZmFjaW5nIHZlcnRpY2VzXHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB2bGVuOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB2ZXJ0ID0gYmV2ZWxFbmFibGVkID8gc2NhbGVQdDIoIHZlcnRpY2VzWyBpIF0sIHZlcnRpY2VzTW92ZW1lbnRzWyBpIF0sIGJzICkgOiB2ZXJ0aWNlc1sgaSBdO1xyXG5cclxuXHRcdFx0XHRpZiAoICEgZXh0cnVkZUJ5UGF0aCApIHtcclxuXHJcblx0XHRcdFx0XHR2KCB2ZXJ0LngsIHZlcnQueSwgMCApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdC8vIHYoIHZlcnQueCwgdmVydC55ICsgZXh0cnVkZVB0c1sgMCBdLnksIGV4dHJ1ZGVQdHNbIDAgXS54ICk7XHJcblxyXG5cdFx0XHRcdFx0bm9ybWFsLmNvcHkoIHNwbGluZVR1YmUubm9ybWFsc1sgMCBdICkubXVsdGlwbHlTY2FsYXIoIHZlcnQueCApO1xyXG5cdFx0XHRcdFx0Ymlub3JtYWwuY29weSggc3BsaW5lVHViZS5iaW5vcm1hbHNbIDAgXSApLm11bHRpcGx5U2NhbGFyKCB2ZXJ0LnkgKTtcclxuXHJcblx0XHRcdFx0XHRwb3NpdGlvbjIuY29weSggZXh0cnVkZVB0c1sgMCBdICkuYWRkKCBub3JtYWwgKS5hZGQoIGJpbm9ybWFsICk7XHJcblxyXG5cdFx0XHRcdFx0diggcG9zaXRpb24yLngsIHBvc2l0aW9uMi55LCBwb3NpdGlvbjIueiApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBBZGQgc3RlcHBlZCB2ZXJ0aWNlcy4uLlxyXG5cdFx0XHQvLyBJbmNsdWRpbmcgZnJvbnQgZmFjaW5nIHZlcnRpY2VzXHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgcyA9IDE7IHMgPD0gc3RlcHM7IHMgKysgKSB7XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHZsZW47IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgdmVydCA9IGJldmVsRW5hYmxlZCA/IHNjYWxlUHQyKCB2ZXJ0aWNlc1sgaSBdLCB2ZXJ0aWNlc01vdmVtZW50c1sgaSBdLCBicyApIDogdmVydGljZXNbIGkgXTtcclxuXHJcblx0XHRcdFx0XHRpZiAoICEgZXh0cnVkZUJ5UGF0aCApIHtcclxuXHJcblx0XHRcdFx0XHRcdHYoIHZlcnQueCwgdmVydC55LCBkZXB0aCAvIHN0ZXBzICogcyApO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHQvLyB2KCB2ZXJ0LngsIHZlcnQueSArIGV4dHJ1ZGVQdHNbIHMgLSAxIF0ueSwgZXh0cnVkZVB0c1sgcyAtIDEgXS54ICk7XHJcblxyXG5cdFx0XHRcdFx0XHRub3JtYWwuY29weSggc3BsaW5lVHViZS5ub3JtYWxzWyBzIF0gKS5tdWx0aXBseVNjYWxhciggdmVydC54ICk7XHJcblx0XHRcdFx0XHRcdGJpbm9ybWFsLmNvcHkoIHNwbGluZVR1YmUuYmlub3JtYWxzWyBzIF0gKS5tdWx0aXBseVNjYWxhciggdmVydC55ICk7XHJcblxyXG5cdFx0XHRcdFx0XHRwb3NpdGlvbjIuY29weSggZXh0cnVkZVB0c1sgcyBdICkuYWRkKCBub3JtYWwgKS5hZGQoIGJpbm9ybWFsICk7XHJcblxyXG5cdFx0XHRcdFx0XHR2KCBwb3NpdGlvbjIueCwgcG9zaXRpb24yLnksIHBvc2l0aW9uMi56ICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cclxuXHRcdFx0Ly8gQWRkIGJldmVsIHNlZ21lbnRzIHBsYW5lc1xyXG5cclxuXHRcdFx0Ly9mb3IgKCBiID0gMTsgYiA8PSBiZXZlbFNlZ21lbnRzOyBiICsrICkge1xyXG5cdFx0XHRmb3IgKCBsZXQgYiA9IGJldmVsU2VnbWVudHMgLSAxOyBiID49IDA7IGIgLS0gKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHQgPSBiIC8gYmV2ZWxTZWdtZW50cztcclxuXHRcdFx0XHRjb25zdCB6ID0gYmV2ZWxUaGlja25lc3MgKiBNYXRoLmNvcyggdCAqIE1hdGguUEkgLyAyICk7XHJcblx0XHRcdFx0Y29uc3QgYnMgPSBiZXZlbFNpemUgKiBNYXRoLnNpbiggdCAqIE1hdGguUEkgLyAyICkgKyBiZXZlbE9mZnNldDtcclxuXHJcblx0XHRcdFx0Ly8gY29udHJhY3Qgc2hhcGVcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IGNvbnRvdXIubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgdmVydCA9IHNjYWxlUHQyKCBjb250b3VyWyBpIF0sIGNvbnRvdXJNb3ZlbWVudHNbIGkgXSwgYnMgKTtcclxuXHRcdFx0XHRcdHYoIHZlcnQueCwgdmVydC55LCBkZXB0aCArIHogKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyBleHBhbmQgaG9sZXNcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGggPSAwLCBobCA9IGhvbGVzLmxlbmd0aDsgaCA8IGhsOyBoICsrICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGFob2xlID0gaG9sZXNbIGggXTtcclxuXHRcdFx0XHRcdG9uZUhvbGVNb3ZlbWVudHMgPSBob2xlc01vdmVtZW50c1sgaCBdO1xyXG5cclxuXHRcdFx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBhaG9sZS5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnN0IHZlcnQgPSBzY2FsZVB0MiggYWhvbGVbIGkgXSwgb25lSG9sZU1vdmVtZW50c1sgaSBdLCBicyApO1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCAhIGV4dHJ1ZGVCeVBhdGggKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdHYoIHZlcnQueCwgdmVydC55LCBkZXB0aCArIHogKTtcclxuXHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdHYoIHZlcnQueCwgdmVydC55ICsgZXh0cnVkZVB0c1sgc3RlcHMgLSAxIF0ueSwgZXh0cnVkZVB0c1sgc3RlcHMgLSAxIF0ueCArIHogKTtcclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8qIEZhY2VzICovXHJcblxyXG5cdFx0XHQvLyBUb3AgYW5kIGJvdHRvbSBmYWNlc1xyXG5cclxuXHRcdFx0YnVpbGRMaWRGYWNlcygpO1xyXG5cclxuXHRcdFx0Ly8gU2lkZXMgZmFjZXNcclxuXHJcblx0XHRcdGJ1aWxkU2lkZUZhY2VzKCk7XHJcblxyXG5cclxuXHRcdFx0Ly8vLy8gIEludGVybmFsIGZ1bmN0aW9uc1xyXG5cclxuXHRcdFx0ZnVuY3Rpb24gYnVpbGRMaWRGYWNlcygpIHtcclxuXHJcblx0XHRcdFx0Y29uc3Qgc3RhcnQgPSB2ZXJ0aWNlc0FycmF5Lmxlbmd0aCAvIDM7XHJcblxyXG5cdFx0XHRcdGlmICggYmV2ZWxFbmFibGVkICkge1xyXG5cclxuXHRcdFx0XHRcdGxldCBsYXllciA9IDA7IC8vIHN0ZXBzICsgMVxyXG5cdFx0XHRcdFx0bGV0IG9mZnNldCA9IHZsZW4gKiBsYXllcjtcclxuXHJcblx0XHRcdFx0XHQvLyBCb3R0b20gZmFjZXNcclxuXHJcblx0XHRcdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBmbGVuOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgZmFjZSA9IGZhY2VzWyBpIF07XHJcblx0XHRcdFx0XHRcdGYzKCBmYWNlWyAyIF0gKyBvZmZzZXQsIGZhY2VbIDEgXSArIG9mZnNldCwgZmFjZVsgMCBdICsgb2Zmc2V0ICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGxheWVyID0gc3RlcHMgKyBiZXZlbFNlZ21lbnRzICogMjtcclxuXHRcdFx0XHRcdG9mZnNldCA9IHZsZW4gKiBsYXllcjtcclxuXHJcblx0XHRcdFx0XHQvLyBUb3AgZmFjZXNcclxuXHJcblx0XHRcdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBmbGVuOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgZmFjZSA9IGZhY2VzWyBpIF07XHJcblx0XHRcdFx0XHRcdGYzKCBmYWNlWyAwIF0gKyBvZmZzZXQsIGZhY2VbIDEgXSArIG9mZnNldCwgZmFjZVsgMiBdICsgb2Zmc2V0ICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdC8vIEJvdHRvbSBmYWNlc1xyXG5cclxuXHRcdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGZsZW47IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCBmYWNlID0gZmFjZXNbIGkgXTtcclxuXHRcdFx0XHRcdFx0ZjMoIGZhY2VbIDIgXSwgZmFjZVsgMSBdLCBmYWNlWyAwIF0gKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Ly8gVG9wIGZhY2VzXHJcblxyXG5cdFx0XHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgZmxlbjsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnN0IGZhY2UgPSBmYWNlc1sgaSBdO1xyXG5cdFx0XHRcdFx0XHRmMyggZmFjZVsgMCBdICsgdmxlbiAqIHN0ZXBzLCBmYWNlWyAxIF0gKyB2bGVuICogc3RlcHMsIGZhY2VbIDIgXSArIHZsZW4gKiBzdGVwcyApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRzY29wZS5hZGRHcm91cCggc3RhcnQsIHZlcnRpY2VzQXJyYXkubGVuZ3RoIC8gMyAtIHN0YXJ0LCAwICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBDcmVhdGUgZmFjZXMgZm9yIHRoZSB6LXNpZGVzIG9mIHRoZSBzaGFwZVxyXG5cclxuXHRcdFx0ZnVuY3Rpb24gYnVpbGRTaWRlRmFjZXMoKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHN0YXJ0ID0gdmVydGljZXNBcnJheS5sZW5ndGggLyAzO1xyXG5cdFx0XHRcdGxldCBsYXllcm9mZnNldCA9IDA7XHJcblx0XHRcdFx0c2lkZXdhbGxzKCBjb250b3VyLCBsYXllcm9mZnNldCApO1xyXG5cdFx0XHRcdGxheWVyb2Zmc2V0ICs9IGNvbnRvdXIubGVuZ3RoO1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaCA9IDAsIGhsID0gaG9sZXMubGVuZ3RoOyBoIDwgaGw7IGggKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgYWhvbGUgPSBob2xlc1sgaCBdO1xyXG5cdFx0XHRcdFx0c2lkZXdhbGxzKCBhaG9sZSwgbGF5ZXJvZmZzZXQgKTtcclxuXHJcblx0XHRcdFx0XHQvLywgdHJ1ZVxyXG5cdFx0XHRcdFx0bGF5ZXJvZmZzZXQgKz0gYWhvbGUubGVuZ3RoO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cclxuXHRcdFx0XHRzY29wZS5hZGRHcm91cCggc3RhcnQsIHZlcnRpY2VzQXJyYXkubGVuZ3RoIC8gMyAtIHN0YXJ0LCAxICk7XHJcblxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZnVuY3Rpb24gc2lkZXdhbGxzKCBjb250b3VyLCBsYXllcm9mZnNldCApIHtcclxuXHJcblx0XHRcdFx0bGV0IGkgPSBjb250b3VyLmxlbmd0aDtcclxuXHJcblx0XHRcdFx0d2hpbGUgKCAtLSBpID49IDAgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgaiA9IGk7XHJcblx0XHRcdFx0XHRsZXQgayA9IGkgLSAxO1xyXG5cdFx0XHRcdFx0aWYgKCBrIDwgMCApIGsgPSBjb250b3VyLmxlbmd0aCAtIDE7XHJcblxyXG5cdFx0XHRcdFx0Ly9jb25zb2xlLmxvZygnYicsIGksaiwgaS0xLCBrLHZlcnRpY2VzLmxlbmd0aCk7XHJcblxyXG5cdFx0XHRcdFx0Zm9yICggbGV0IHMgPSAwLCBzbCA9ICggc3RlcHMgKyBiZXZlbFNlZ21lbnRzICogMiApOyBzIDwgc2w7IHMgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCBzbGVuMSA9IHZsZW4gKiBzO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBzbGVuMiA9IHZsZW4gKiAoIHMgKyAxICk7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCBhID0gbGF5ZXJvZmZzZXQgKyBqICsgc2xlbjEsXHJcblx0XHRcdFx0XHRcdFx0YiA9IGxheWVyb2Zmc2V0ICsgayArIHNsZW4xLFxyXG5cdFx0XHRcdFx0XHRcdGMgPSBsYXllcm9mZnNldCArIGsgKyBzbGVuMixcclxuXHRcdFx0XHRcdFx0XHRkID0gbGF5ZXJvZmZzZXQgKyBqICsgc2xlbjI7XHJcblxyXG5cdFx0XHRcdFx0XHRmNCggYSwgYiwgYywgZCApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZnVuY3Rpb24gdiggeCwgeSwgeiApIHtcclxuXHJcblx0XHRcdFx0cGxhY2Vob2xkZXIucHVzaCggeCApO1xyXG5cdFx0XHRcdHBsYWNlaG9sZGVyLnB1c2goIHkgKTtcclxuXHRcdFx0XHRwbGFjZWhvbGRlci5wdXNoKCB6ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cclxuXHRcdFx0ZnVuY3Rpb24gZjMoIGEsIGIsIGMgKSB7XHJcblxyXG5cdFx0XHRcdGFkZFZlcnRleCggYSApO1xyXG5cdFx0XHRcdGFkZFZlcnRleCggYiApO1xyXG5cdFx0XHRcdGFkZFZlcnRleCggYyApO1xyXG5cclxuXHRcdFx0XHRjb25zdCBuZXh0SW5kZXggPSB2ZXJ0aWNlc0FycmF5Lmxlbmd0aCAvIDM7XHJcblx0XHRcdFx0Y29uc3QgdXZzID0gdXZnZW4uZ2VuZXJhdGVUb3BVViggc2NvcGUsIHZlcnRpY2VzQXJyYXksIG5leHRJbmRleCAtIDMsIG5leHRJbmRleCAtIDIsIG5leHRJbmRleCAtIDEgKTtcclxuXHJcblx0XHRcdFx0YWRkVVYoIHV2c1sgMCBdICk7XHJcblx0XHRcdFx0YWRkVVYoIHV2c1sgMSBdICk7XHJcblx0XHRcdFx0YWRkVVYoIHV2c1sgMiBdICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRmdW5jdGlvbiBmNCggYSwgYiwgYywgZCApIHtcclxuXHJcblx0XHRcdFx0YWRkVmVydGV4KCBhICk7XHJcblx0XHRcdFx0YWRkVmVydGV4KCBiICk7XHJcblx0XHRcdFx0YWRkVmVydGV4KCBkICk7XHJcblxyXG5cdFx0XHRcdGFkZFZlcnRleCggYiApO1xyXG5cdFx0XHRcdGFkZFZlcnRleCggYyApO1xyXG5cdFx0XHRcdGFkZFZlcnRleCggZCApO1xyXG5cclxuXHJcblx0XHRcdFx0Y29uc3QgbmV4dEluZGV4ID0gdmVydGljZXNBcnJheS5sZW5ndGggLyAzO1xyXG5cdFx0XHRcdGNvbnN0IHV2cyA9IHV2Z2VuLmdlbmVyYXRlU2lkZVdhbGxVViggc2NvcGUsIHZlcnRpY2VzQXJyYXksIG5leHRJbmRleCAtIDYsIG5leHRJbmRleCAtIDMsIG5leHRJbmRleCAtIDIsIG5leHRJbmRleCAtIDEgKTtcclxuXHJcblx0XHRcdFx0YWRkVVYoIHV2c1sgMCBdICk7XHJcblx0XHRcdFx0YWRkVVYoIHV2c1sgMSBdICk7XHJcblx0XHRcdFx0YWRkVVYoIHV2c1sgMyBdICk7XHJcblxyXG5cdFx0XHRcdGFkZFVWKCB1dnNbIDEgXSApO1xyXG5cdFx0XHRcdGFkZFVWKCB1dnNbIDIgXSApO1xyXG5cdFx0XHRcdGFkZFVWKCB1dnNbIDMgXSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZnVuY3Rpb24gYWRkVmVydGV4KCBpbmRleCApIHtcclxuXHJcblx0XHRcdFx0dmVydGljZXNBcnJheS5wdXNoKCBwbGFjZWhvbGRlclsgaW5kZXggKiAzICsgMCBdICk7XHJcblx0XHRcdFx0dmVydGljZXNBcnJheS5wdXNoKCBwbGFjZWhvbGRlclsgaW5kZXggKiAzICsgMSBdICk7XHJcblx0XHRcdFx0dmVydGljZXNBcnJheS5wdXNoKCBwbGFjZWhvbGRlclsgaW5kZXggKiAzICsgMiBdICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cclxuXHRcdFx0ZnVuY3Rpb24gYWRkVVYoIHZlY3RvcjIgKSB7XHJcblxyXG5cdFx0XHRcdHV2QXJyYXkucHVzaCggdmVjdG9yMi54ICk7XHJcblx0XHRcdFx0dXZBcnJheS5wdXNoKCB2ZWN0b3IyLnkgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMucGFyYW1ldGVycyA9IE9iamVjdC5hc3NpZ24oIHt9LCBzb3VyY2UucGFyYW1ldGVycyApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdHRvSlNPTigpIHtcclxuXHJcblx0XHRjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCk7XHJcblxyXG5cdFx0Y29uc3Qgc2hhcGVzID0gdGhpcy5wYXJhbWV0ZXJzLnNoYXBlcztcclxuXHRcdGNvbnN0IG9wdGlvbnMgPSB0aGlzLnBhcmFtZXRlcnMub3B0aW9ucztcclxuXHJcblx0XHRyZXR1cm4gdG9KU09OKCBzaGFwZXMsIG9wdGlvbnMsIGRhdGEgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGYWN0b3J5IG1ldGhvZCBmb3IgY3JlYXRpbmcgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBmcm9tIHRoZSBnaXZlblxyXG5cdCAqIEpTT04gb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBBIEpTT04gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc2VyaWFsaXplZCBnZW9tZXRyeS5cclxuXHQgKiBAcGFyYW0ge0FycmF5PFNoYXBlPn0gc2hhcGVzIC0gQW4gYXJyYXkgb2Ygc2hhcGVzLlxyXG5cdCAqIEByZXR1cm4ge0V4dHJ1ZGVHZW9tZXRyeX0gQSBuZXcgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c3RhdGljIGZyb21KU09OKCBkYXRhLCBzaGFwZXMgKSB7XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnlTaGFwZXMgPSBbXTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaiA9IDAsIGpsID0gZGF0YS5zaGFwZXMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBzaGFwZSA9IHNoYXBlc1sgZGF0YS5zaGFwZXNbIGogXSBdO1xyXG5cclxuXHRcdFx0Z2VvbWV0cnlTaGFwZXMucHVzaCggc2hhcGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgZXh0cnVkZVBhdGggPSBkYXRhLm9wdGlvbnMuZXh0cnVkZVBhdGg7XHJcblxyXG5cdFx0aWYgKCBleHRydWRlUGF0aCAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0ZGF0YS5vcHRpb25zLmV4dHJ1ZGVQYXRoID0gbmV3IEN1cnZlc1sgZXh0cnVkZVBhdGgudHlwZSBdKCkuZnJvbUpTT04oIGV4dHJ1ZGVQYXRoICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBuZXcgRXh0cnVkZUdlb21ldHJ5KCBnZW9tZXRyeVNoYXBlcywgZGF0YS5vcHRpb25zICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmNvbnN0IFdvcmxkVVZHZW5lcmF0b3IgPSB7XHJcblxyXG5cdGdlbmVyYXRlVG9wVVY6IGZ1bmN0aW9uICggZ2VvbWV0cnksIHZlcnRpY2VzLCBpbmRleEEsIGluZGV4QiwgaW5kZXhDICkge1xyXG5cclxuXHRcdGNvbnN0IGFfeCA9IHZlcnRpY2VzWyBpbmRleEEgKiAzIF07XHJcblx0XHRjb25zdCBhX3kgPSB2ZXJ0aWNlc1sgaW5kZXhBICogMyArIDEgXTtcclxuXHRcdGNvbnN0IGJfeCA9IHZlcnRpY2VzWyBpbmRleEIgKiAzIF07XHJcblx0XHRjb25zdCBiX3kgPSB2ZXJ0aWNlc1sgaW5kZXhCICogMyArIDEgXTtcclxuXHRcdGNvbnN0IGNfeCA9IHZlcnRpY2VzWyBpbmRleEMgKiAzIF07XHJcblx0XHRjb25zdCBjX3kgPSB2ZXJ0aWNlc1sgaW5kZXhDICogMyArIDEgXTtcclxuXHJcblx0XHRyZXR1cm4gW1xyXG5cdFx0XHRuZXcgVmVjdG9yMiggYV94LCBhX3kgKSxcclxuXHRcdFx0bmV3IFZlY3RvcjIoIGJfeCwgYl95ICksXHJcblx0XHRcdG5ldyBWZWN0b3IyKCBjX3gsIGNfeSApXHJcblx0XHRdO1xyXG5cclxuXHR9LFxyXG5cclxuXHRnZW5lcmF0ZVNpZGVXYWxsVVY6IGZ1bmN0aW9uICggZ2VvbWV0cnksIHZlcnRpY2VzLCBpbmRleEEsIGluZGV4QiwgaW5kZXhDLCBpbmRleEQgKSB7XHJcblxyXG5cdFx0Y29uc3QgYV94ID0gdmVydGljZXNbIGluZGV4QSAqIDMgXTtcclxuXHRcdGNvbnN0IGFfeSA9IHZlcnRpY2VzWyBpbmRleEEgKiAzICsgMSBdO1xyXG5cdFx0Y29uc3QgYV96ID0gdmVydGljZXNbIGluZGV4QSAqIDMgKyAyIF07XHJcblx0XHRjb25zdCBiX3ggPSB2ZXJ0aWNlc1sgaW5kZXhCICogMyBdO1xyXG5cdFx0Y29uc3QgYl95ID0gdmVydGljZXNbIGluZGV4QiAqIDMgKyAxIF07XHJcblx0XHRjb25zdCBiX3ogPSB2ZXJ0aWNlc1sgaW5kZXhCICogMyArIDIgXTtcclxuXHRcdGNvbnN0IGNfeCA9IHZlcnRpY2VzWyBpbmRleEMgKiAzIF07XHJcblx0XHRjb25zdCBjX3kgPSB2ZXJ0aWNlc1sgaW5kZXhDICogMyArIDEgXTtcclxuXHRcdGNvbnN0IGNfeiA9IHZlcnRpY2VzWyBpbmRleEMgKiAzICsgMiBdO1xyXG5cdFx0Y29uc3QgZF94ID0gdmVydGljZXNbIGluZGV4RCAqIDMgXTtcclxuXHRcdGNvbnN0IGRfeSA9IHZlcnRpY2VzWyBpbmRleEQgKiAzICsgMSBdO1xyXG5cdFx0Y29uc3QgZF96ID0gdmVydGljZXNbIGluZGV4RCAqIDMgKyAyIF07XHJcblxyXG5cdFx0aWYgKCBNYXRoLmFicyggYV95IC0gYl95ICkgPCBNYXRoLmFicyggYV94IC0gYl94ICkgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gW1xyXG5cdFx0XHRcdG5ldyBWZWN0b3IyKCBhX3gsIDEgLSBhX3ogKSxcclxuXHRcdFx0XHRuZXcgVmVjdG9yMiggYl94LCAxIC0gYl96ICksXHJcblx0XHRcdFx0bmV3IFZlY3RvcjIoIGNfeCwgMSAtIGNfeiApLFxyXG5cdFx0XHRcdG5ldyBWZWN0b3IyKCBkX3gsIDEgLSBkX3ogKVxyXG5cdFx0XHRdO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gW1xyXG5cdFx0XHRcdG5ldyBWZWN0b3IyKCBhX3ksIDEgLSBhX3ogKSxcclxuXHRcdFx0XHRuZXcgVmVjdG9yMiggYl95LCAxIC0gYl96ICksXHJcblx0XHRcdFx0bmV3IFZlY3RvcjIoIGNfeSwgMSAtIGNfeiApLFxyXG5cdFx0XHRcdG5ldyBWZWN0b3IyKCBkX3ksIDEgLSBkX3ogKVxyXG5cdFx0XHRdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxufTtcclxuXHJcbmZ1bmN0aW9uIHRvSlNPTiggc2hhcGVzLCBvcHRpb25zLCBkYXRhICkge1xyXG5cclxuXHRkYXRhLnNoYXBlcyA9IFtdO1xyXG5cclxuXHRpZiAoIEFycmF5LmlzQXJyYXkoIHNoYXBlcyApICkge1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHNoYXBlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgc2hhcGUgPSBzaGFwZXNbIGkgXTtcclxuXHJcblx0XHRcdGRhdGEuc2hhcGVzLnB1c2goIHNoYXBlLnV1aWQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0ZGF0YS5zaGFwZXMucHVzaCggc2hhcGVzLnV1aWQgKTtcclxuXHJcblx0fVxyXG5cclxuXHRkYXRhLm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKCB7fSwgb3B0aW9ucyApO1xyXG5cclxuXHRpZiAoIG9wdGlvbnMuZXh0cnVkZVBhdGggIT09IHVuZGVmaW5lZCApIGRhdGEub3B0aW9ucy5leHRydWRlUGF0aCA9IG9wdGlvbnMuZXh0cnVkZVBhdGgudG9KU09OKCk7XHJcblxyXG5cdHJldHVybiBkYXRhO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgdGhlIGBvcHRpb25zYCB0eXBlIG9mIHRoZSBnZW9tZXRyeSdzIGNvbnN0cnVjdG9yLlxyXG4gKlxyXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBFeHRydWRlR2VvbWV0cnl+T3B0aW9uc1xyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2N1cnZlU2VnbWVudHM9MTJdIC0gTnVtYmVyIG9mIHBvaW50cyBvbiB0aGUgY3VydmVzLlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3N0ZXBzPTFdIC0gTnVtYmVyIG9mIHBvaW50cyB1c2VkIGZvciBzdWJkaXZpZGluZyBzZWdtZW50cyBhbG9uZyB0aGUgZGVwdGggb2YgdGhlIGV4dHJ1ZGVkIHNwbGluZS5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtkZXB0aD0xXSAtIERlcHRoIHRvIGV4dHJ1ZGUgdGhlIHNoYXBlLlxyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtiZXZlbEVuYWJsZWQ9dHJ1ZV0gLSBXaGV0aGVyIHRvIGJldmVsaW5nIHRvIHRoZSBzaGFwZSBvciBub3QuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbYmV2ZWxUaGlja25lc3M9MC4yXSAtIEhvdyBkZWVwIGludG8gdGhlIG9yaWdpbmFsIHNoYXBlIHRoZSBiZXZlbCBnb2VzLlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2JldmVsU2l6ZT1iZXZlbFRoaWNrbmVzcy0wLjFdIC0gRGlzdGFuY2UgZnJvbSB0aGUgc2hhcGUgb3V0bGluZSB0aGF0IHRoZSBiZXZlbCBleHRlbmRzLlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2JldmVsT2Zmc2V0PTBdIC0gRGlzdGFuY2UgZnJvbSB0aGUgc2hhcGUgb3V0bGluZSB0aGF0IHRoZSBiZXZlbCBzdGFydHMuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbYmV2ZWxTZWdtZW50cz0zXSAtIE51bWJlciBvZiBiZXZlbCBsYXllcnMuXHJcbiAqIEBwcm9wZXJ0eSB7P0N1cnZlfSBbZXh0cnVkZVBhdGg9bnVsbF0gLSBBIDNEIHNwbGluZSBwYXRoIGFsb25nIHdoaWNoIHRoZSBzaGFwZSBzaG91bGQgYmUgZXh0cnVkZWQuIEJldmVscyBub3Qgc3VwcG9ydGVkIGZvciBwYXRoIGV4dHJ1c2lvbi5cclxuICogQHByb3BlcnR5IHtPYmplY3R9IFtVVkdlbmVyYXRvcl0gLSBBbiBvYmplY3QgdGhhdCBwcm92aWRlcyBVViBnZW5lcmF0b3IgZnVuY3Rpb25zIGZvciBjdXN0b20gVVYgZ2VuZXJhdGlvbi5cclxuICoqL1xyXG5cclxuZXhwb3J0IHsgRXh0cnVkZUdlb21ldHJ5IH07XHJcbiIsImltcG9ydCB7IFBvbHloZWRyb25HZW9tZXRyeSB9IGZyb20gJy4vUG9seWhlZHJvbkdlb21ldHJ5LmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIGdlb21ldHJ5IGNsYXNzIGZvciByZXByZXNlbnRpbmcgYW4gaWNvc2FoZWRyb24uXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGdlb21ldHJ5ID0gbmV3IFRIUkVFLkljb3NhaGVkcm9uR2VvbWV0cnkoKTtcclxuICogY29uc3QgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IDB4ZmZmZjAwIH0gKTtcclxuICogY29uc3QgaWNvc2FoZWRyb24gPSBuZXcgVEhSRUUuTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcbiAqIHNjZW5lLmFkZCggaWNvc2FoZWRyb24gKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBQb2x5aGVkcm9uR2VvbWV0cnlcclxuICovXHJcbmNsYXNzIEljb3NhaGVkcm9uR2VvbWV0cnkgZXh0ZW5kcyBQb2x5aGVkcm9uR2VvbWV0cnkge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGljb3NhaGVkcm9uIGdlb21ldHJ5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpdXM9MV0gLSBSYWRpdXMgb2YgdGhlIGljb3NhaGVkcm9uLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZGV0YWlsPTBdIC0gU2V0dGluZyB0aGlzIHRvIGEgdmFsdWUgZ3JlYXRlciB0aGFuIGAwYCBhZGRzIHZlcnRpY2VzIG1ha2luZyBpdCBubyBsb25nZXIgYSBpY29zYWhlZHJvbi5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcmFkaXVzID0gMSwgZGV0YWlsID0gMCApIHtcclxuXHJcblx0XHRjb25zdCB0ID0gKCAxICsgTWF0aC5zcXJ0KCA1ICkgKSAvIDI7XHJcblxyXG5cdFx0Y29uc3QgdmVydGljZXMgPSBbXHJcblx0XHRcdC0gMSwgdCwgMCwgXHQxLCB0LCAwLCBcdC0gMSwgLSB0LCAwLCBcdDEsIC0gdCwgMCxcclxuXHRcdFx0MCwgLSAxLCB0LCBcdDAsIDEsIHQsXHQwLCAtIDEsIC0gdCwgXHQwLCAxLCAtIHQsXHJcblx0XHRcdHQsIDAsIC0gMSwgXHR0LCAwLCAxLCBcdC0gdCwgMCwgLSAxLCBcdC0gdCwgMCwgMVxyXG5cdFx0XTtcclxuXHJcblx0XHRjb25zdCBpbmRpY2VzID0gW1xyXG5cdFx0XHQwLCAxMSwgNSwgXHQwLCA1LCAxLCBcdDAsIDEsIDcsIFx0MCwgNywgMTAsIFx0MCwgMTAsIDExLFxyXG5cdFx0XHQxLCA1LCA5LCBcdDUsIDExLCA0LFx0MTEsIDEwLCAyLFx0MTAsIDcsIDYsXHQ3LCAxLCA4LFxyXG5cdFx0XHQzLCA5LCA0LCBcdDMsIDQsIDIsXHQzLCAyLCA2LFx0MywgNiwgOCxcdDMsIDgsIDksXHJcblx0XHRcdDQsIDksIDUsIFx0MiwgNCwgMTEsXHQ2LCAyLCAxMCxcdDgsIDYsIDcsXHQ5LCA4LCAxXHJcblx0XHRdO1xyXG5cclxuXHRcdHN1cGVyKCB2ZXJ0aWNlcywgaW5kaWNlcywgcmFkaXVzLCBkZXRhaWwgKTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnSWNvc2FoZWRyb25HZW9tZXRyeSc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb2xkcyB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVycyB0aGF0IGhhdmUgYmVlblxyXG5cdFx0ICogdXNlZCB0byBnZW5lcmF0ZSB0aGUgZ2VvbWV0cnkuIEFueSBtb2RpZmljYXRpb25cclxuXHRcdCAqIGFmdGVyIGluc3RhbnRpYXRpb24gZG9lcyBub3QgY2hhbmdlIHRoZSBnZW9tZXRyeS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBhcmFtZXRlcnMgPSB7XHJcblx0XHRcdHJhZGl1czogcmFkaXVzLFxyXG5cdFx0XHRkZXRhaWw6IGRldGFpbFxyXG5cdFx0fTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGYWN0b3J5IG1ldGhvZCBmb3IgY3JlYXRpbmcgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBmcm9tIHRoZSBnaXZlblxyXG5cdCAqIEpTT04gb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBBIEpTT04gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc2VyaWFsaXplZCBnZW9tZXRyeS5cclxuXHQgKiBAcmV0dXJuIHtJY29zYWhlZHJvbkdlb21ldHJ5fSBBIG5ldyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzdGF0aWMgZnJvbUpTT04oIGRhdGEgKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBJY29zYWhlZHJvbkdlb21ldHJ5KCBkYXRhLnJhZGl1cywgZGF0YS5kZXRhaWwgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCB7IEljb3NhaGVkcm9uR2VvbWV0cnkgfTtcclxuIiwiaW1wb3J0IHsgUG9seWhlZHJvbkdlb21ldHJ5IH0gZnJvbSAnLi9Qb2x5aGVkcm9uR2VvbWV0cnkuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgZ2VvbWV0cnkgY2xhc3MgZm9yIHJlcHJlc2VudGluZyBhbiBvY3RhaGVkcm9uLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBnZW9tZXRyeSA9IG5ldyBUSFJFRS5PY3RhaGVkcm9uR2VvbWV0cnkoKTtcclxuICogY29uc3QgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IDB4ZmZmZjAwIH0gKTtcclxuICogY29uc3Qgb2N0YWhlZHJvbiA9IG5ldyBUSFJFRS5NZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuICogc2NlbmUuYWRkKCBvY3RhaGVkcm9uICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgUG9seWhlZHJvbkdlb21ldHJ5XHJcbiAqL1xyXG5jbGFzcyBPY3RhaGVkcm9uR2VvbWV0cnkgZXh0ZW5kcyBQb2x5aGVkcm9uR2VvbWV0cnkge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG9jdGFoZWRyb24gZ2VvbWV0cnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3JhZGl1cz0xXSAtIFJhZGl1cyBvZiB0aGUgb2N0YWhlZHJvbi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2RldGFpbD0wXSAtIFNldHRpbmcgdGhpcyB0byBhIHZhbHVlIGdyZWF0ZXIgdGhhbiBgMGAgYWRkcyB2ZXJ0aWNlcyBtYWtpbmcgaXQgbm8gbG9uZ2VyIGEgb2N0YWhlZHJvbi5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcmFkaXVzID0gMSwgZGV0YWlsID0gMCApIHtcclxuXHJcblx0XHRjb25zdCB2ZXJ0aWNlcyA9IFtcclxuXHRcdFx0MSwgMCwgMCwgXHQtIDEsIDAsIDAsXHQwLCAxLCAwLFxyXG5cdFx0XHQwLCAtIDEsIDAsIFx0MCwgMCwgMSxcdDAsIDAsIC0gMVxyXG5cdFx0XTtcclxuXHJcblx0XHRjb25zdCBpbmRpY2VzID0gW1xyXG5cdFx0XHQwLCAyLCA0LFx0MCwgNCwgMyxcdDAsIDMsIDUsXHJcblx0XHRcdDAsIDUsIDIsXHQxLCAyLCA1LFx0MSwgNSwgMyxcclxuXHRcdFx0MSwgMywgNCxcdDEsIDQsIDJcclxuXHRcdF07XHJcblxyXG5cdFx0c3VwZXIoIHZlcnRpY2VzLCBpbmRpY2VzLCByYWRpdXMsIGRldGFpbCApO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdPY3RhaGVkcm9uR2VvbWV0cnknO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG9sZHMgdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMgdGhhdCBoYXZlIGJlZW5cclxuXHRcdCAqIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGdlb21ldHJ5LiBBbnkgbW9kaWZpY2F0aW9uXHJcblx0XHQgKiBhZnRlciBpbnN0YW50aWF0aW9uIGRvZXMgbm90IGNoYW5nZSB0aGUgZ2VvbWV0cnkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0ge1xyXG5cdFx0XHRyYWRpdXM6IHJhZGl1cyxcclxuXHRcdFx0ZGV0YWlsOiBkZXRhaWxcclxuXHRcdH07XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRmFjdG9yeSBtZXRob2QgZm9yIGNyZWF0aW5nIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZnJvbSB0aGUgZ2l2ZW5cclxuXHQgKiBKU09OIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gQSBKU09OIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNlcmlhbGl6ZWQgZ2VvbWV0cnkuXHJcblx0ICogQHJldHVybiB7T2N0YWhlZHJvbkdlb21ldHJ5fSBBIG5ldyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzdGF0aWMgZnJvbUpTT04oIGRhdGEgKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBPY3RhaGVkcm9uR2VvbWV0cnkoIGRhdGEucmFkaXVzLCBkYXRhLmRldGFpbCApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBPY3RhaGVkcm9uR2VvbWV0cnkgfTtcclxuIiwiaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcclxuaW1wb3J0IHsgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyQXR0cmlidXRlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIGdlb21ldHJ5IGNsYXNzIGZvciByZXByZXNlbnRpbmcgYSBwbGFuZS5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgZ2VvbWV0cnkgPSBuZXcgVEhSRUUuUGxhbmVHZW9tZXRyeSggMSwgMSApO1xyXG4gKiBjb25zdCBtYXRlcmlhbCA9IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogMHhmZmZmMDAsIHNpZGU6IFRIUkVFLkRvdWJsZVNpZGUgfSApO1xyXG4gKiBjb25zdCBwbGFuZSA9IG5ldyBUSFJFRS5NZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuICogc2NlbmUuYWRkKCBwbGFuZSApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIEJ1ZmZlckdlb21ldHJ5XHJcbiAqL1xyXG5jbGFzcyBQbGFuZUdlb21ldHJ5IGV4dGVuZHMgQnVmZmVyR2VvbWV0cnkge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHBsYW5lIGdlb21ldHJ5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt3aWR0aD0xXSAtIFRoZSB3aWR0aCBhbG9uZyB0aGUgWCBheGlzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbaGVpZ2h0PTFdIC0gVGhlIGhlaWdodCBhbG9uZyB0aGUgWSBheGlzXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt3aWR0aFNlZ21lbnRzPTFdIC0gVGhlIG51bWJlciBvZiBzZWdtZW50cyBhbG9uZyB0aGUgWCBheGlzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbaGVpZ2h0U2VnbWVudHM9MV0gLSBUaGUgbnVtYmVyIG9mIHNlZ21lbnRzIGFsb25nIHRoZSBZIGF4aXMuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHdpZHRoID0gMSwgaGVpZ2h0ID0gMSwgd2lkdGhTZWdtZW50cyA9IDEsIGhlaWdodFNlZ21lbnRzID0gMSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdQbGFuZUdlb21ldHJ5JztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvbGRzIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzIHRoYXQgaGF2ZSBiZWVuXHJcblx0XHQgKiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBnZW9tZXRyeS4gQW55IG1vZGlmaWNhdGlvblxyXG5cdFx0ICogYWZ0ZXIgaW5zdGFudGlhdGlvbiBkb2VzIG5vdCBjaGFuZ2UgdGhlIGdlb21ldHJ5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucGFyYW1ldGVycyA9IHtcclxuXHRcdFx0d2lkdGg6IHdpZHRoLFxyXG5cdFx0XHRoZWlnaHQ6IGhlaWdodCxcclxuXHRcdFx0d2lkdGhTZWdtZW50czogd2lkdGhTZWdtZW50cyxcclxuXHRcdFx0aGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzXHJcblx0XHR9O1xyXG5cclxuXHRcdGNvbnN0IHdpZHRoX2hhbGYgPSB3aWR0aCAvIDI7XHJcblx0XHRjb25zdCBoZWlnaHRfaGFsZiA9IGhlaWdodCAvIDI7XHJcblxyXG5cdFx0Y29uc3QgZ3JpZFggPSBNYXRoLmZsb29yKCB3aWR0aFNlZ21lbnRzICk7XHJcblx0XHRjb25zdCBncmlkWSA9IE1hdGguZmxvb3IoIGhlaWdodFNlZ21lbnRzICk7XHJcblxyXG5cdFx0Y29uc3QgZ3JpZFgxID0gZ3JpZFggKyAxO1xyXG5cdFx0Y29uc3QgZ3JpZFkxID0gZ3JpZFkgKyAxO1xyXG5cclxuXHRcdGNvbnN0IHNlZ21lbnRfd2lkdGggPSB3aWR0aCAvIGdyaWRYO1xyXG5cdFx0Y29uc3Qgc2VnbWVudF9oZWlnaHQgPSBoZWlnaHQgLyBncmlkWTtcclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGNvbnN0IGluZGljZXMgPSBbXTtcclxuXHRcdGNvbnN0IHZlcnRpY2VzID0gW107XHJcblx0XHRjb25zdCBub3JtYWxzID0gW107XHJcblx0XHRjb25zdCB1dnMgPSBbXTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaXkgPSAwOyBpeSA8IGdyaWRZMTsgaXkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB5ID0gaXkgKiBzZWdtZW50X2hlaWdodCAtIGhlaWdodF9oYWxmO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGl4ID0gMDsgaXggPCBncmlkWDE7IGl4ICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB4ID0gaXggKiBzZWdtZW50X3dpZHRoIC0gd2lkdGhfaGFsZjtcclxuXHJcblx0XHRcdFx0dmVydGljZXMucHVzaCggeCwgLSB5LCAwICk7XHJcblxyXG5cdFx0XHRcdG5vcm1hbHMucHVzaCggMCwgMCwgMSApO1xyXG5cclxuXHRcdFx0XHR1dnMucHVzaCggaXggLyBncmlkWCApO1xyXG5cdFx0XHRcdHV2cy5wdXNoKCAxIC0gKCBpeSAvIGdyaWRZICkgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Zm9yICggbGV0IGl5ID0gMDsgaXkgPCBncmlkWTsgaXkgKysgKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaXggPSAwOyBpeCA8IGdyaWRYOyBpeCArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgYSA9IGl4ICsgZ3JpZFgxICogaXk7XHJcblx0XHRcdFx0Y29uc3QgYiA9IGl4ICsgZ3JpZFgxICogKCBpeSArIDEgKTtcclxuXHRcdFx0XHRjb25zdCBjID0gKCBpeCArIDEgKSArIGdyaWRYMSAqICggaXkgKyAxICk7XHJcblx0XHRcdFx0Y29uc3QgZCA9ICggaXggKyAxICkgKyBncmlkWDEgKiBpeTtcclxuXHJcblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XHJcblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcclxuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xyXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XHJcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMucGFyYW1ldGVycyA9IE9iamVjdC5hc3NpZ24oIHt9LCBzb3VyY2UucGFyYW1ldGVycyApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGZyb20gdGhlIGdpdmVuXHJcblx0ICogSlNPTiBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIEEgSlNPTiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzZXJpYWxpemVkIGdlb21ldHJ5LlxyXG5cdCAqIEByZXR1cm4ge1BsYW5lR2VvbWV0cnl9IEEgbmV3IGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBmcm9tSlNPTiggZGF0YSApIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IFBsYW5lR2VvbWV0cnkoIGRhdGEud2lkdGgsIGRhdGEuaGVpZ2h0LCBkYXRhLndpZHRoU2VnbWVudHMsIGRhdGEuaGVpZ2h0U2VnbWVudHMgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgUGxhbmVHZW9tZXRyeSB9O1xyXG4iLCJpbXBvcnQgeyBCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyR2VvbWV0cnkuanMnO1xyXG5pbXBvcnQgeyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IyLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcblxyXG4vKipcclxuICogQSBjbGFzcyBmb3IgZ2VuZXJhdGluZyBhIHR3by1kaW1lbnNpb25hbCByaW5nIGdlb21ldHJ5LlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBnZW9tZXRyeSA9IG5ldyBUSFJFRS5SaW5nR2VvbWV0cnkoIDEsIDUsIDMyICk7XHJcbiAqIGNvbnN0IG1hdGVyaWFsID0gbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiAweGZmZmYwMCwgc2lkZTogVEhSRUUuRG91YmxlU2lkZSB9ICk7XHJcbiAqIGNvbnN0IG1lc2ggPSBuZXcgVEhSRUUuTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcbiAqIHNjZW5lLmFkZCggbWVzaCApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIEJ1ZmZlckdlb21ldHJ5XHJcbiAqL1xyXG5jbGFzcyBSaW5nR2VvbWV0cnkgZXh0ZW5kcyBCdWZmZXJHZW9tZXRyeSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcmluZyBnZW9tZXRyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbaW5uZXJSYWRpdXM9MC41XSAtIFRoZSBpbm5lciByYWRpdXMgb2YgdGhlIHJpbmcuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtvdXRlclJhZGl1cz0xXSAtIFRoZSBvdXRlciByYWRpdXMgb2YgdGhlIHJpbmcuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt0aGV0YVNlZ21lbnRzPTMyXSAtIE51bWJlciBvZiBzZWdtZW50cy4gQSBoaWdoZXIgbnVtYmVyIG1lYW5zIHRoZSByaW5nIHdpbGwgYmUgbW9yZSByb3VuZC4gTWluaW11bSBpcyBgM2AuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtwaGlTZWdtZW50cz0xXSAtIE51bWJlciBvZiBzZWdtZW50cyBwZXIgcmluZyBzZWdtZW50LiBNaW5pbXVtIGlzIGAxYC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3RoZXRhU3RhcnQ9MF0gLSBTdGFydGluZyBhbmdsZSBpbiByYWRpYW5zLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbdGhldGFMZW5ndGg9TWF0aC5QSSoyXSAtIENlbnRyYWwgYW5nbGUgaW4gcmFkaWFucy5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggaW5uZXJSYWRpdXMgPSAwLjUsIG91dGVyUmFkaXVzID0gMSwgdGhldGFTZWdtZW50cyA9IDMyLCBwaGlTZWdtZW50cyA9IDEsIHRoZXRhU3RhcnQgPSAwLCB0aGV0YUxlbmd0aCA9IE1hdGguUEkgKiAyICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ1JpbmdHZW9tZXRyeSc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb2xkcyB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVycyB0aGF0IGhhdmUgYmVlblxyXG5cdFx0ICogdXNlZCB0byBnZW5lcmF0ZSB0aGUgZ2VvbWV0cnkuIEFueSBtb2RpZmljYXRpb25cclxuXHRcdCAqIGFmdGVyIGluc3RhbnRpYXRpb24gZG9lcyBub3QgY2hhbmdlIHRoZSBnZW9tZXRyeS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBhcmFtZXRlcnMgPSB7XHJcblx0XHRcdGlubmVyUmFkaXVzOiBpbm5lclJhZGl1cyxcclxuXHRcdFx0b3V0ZXJSYWRpdXM6IG91dGVyUmFkaXVzLFxyXG5cdFx0XHR0aGV0YVNlZ21lbnRzOiB0aGV0YVNlZ21lbnRzLFxyXG5cdFx0XHRwaGlTZWdtZW50czogcGhpU2VnbWVudHMsXHJcblx0XHRcdHRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsXHJcblx0XHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxyXG5cdFx0fTtcclxuXHJcblx0XHR0aGV0YVNlZ21lbnRzID0gTWF0aC5tYXgoIDMsIHRoZXRhU2VnbWVudHMgKTtcclxuXHRcdHBoaVNlZ21lbnRzID0gTWF0aC5tYXgoIDEsIHBoaVNlZ21lbnRzICk7XHJcblxyXG5cdFx0Ly8gYnVmZmVyc1xyXG5cclxuXHRcdGNvbnN0IGluZGljZXMgPSBbXTtcclxuXHRcdGNvbnN0IHZlcnRpY2VzID0gW107XHJcblx0XHRjb25zdCBub3JtYWxzID0gW107XHJcblx0XHRjb25zdCB1dnMgPSBbXTtcclxuXHJcblx0XHQvLyBzb21lIGhlbHBlciB2YXJpYWJsZXNcclxuXHJcblx0XHRsZXQgcmFkaXVzID0gaW5uZXJSYWRpdXM7XHJcblx0XHRjb25zdCByYWRpdXNTdGVwID0gKCAoIG91dGVyUmFkaXVzIC0gaW5uZXJSYWRpdXMgKSAvIHBoaVNlZ21lbnRzICk7XHJcblx0XHRjb25zdCB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xyXG5cdFx0Y29uc3QgdXYgPSBuZXcgVmVjdG9yMigpO1xyXG5cclxuXHRcdC8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnNcclxuXHJcblx0XHRmb3IgKCBsZXQgaiA9IDA7IGogPD0gcGhpU2VnbWVudHM7IGogKysgKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPD0gdGhldGFTZWdtZW50czsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Ly8gdmFsdWVzIGFyZSBnZW5lcmF0ZSBmcm9tIHRoZSBpbnNpZGUgb2YgdGhlIHJpbmcgdG8gdGhlIG91dHNpZGVcclxuXHJcblx0XHRcdFx0Y29uc3Qgc2VnbWVudCA9IHRoZXRhU3RhcnQgKyBpIC8gdGhldGFTZWdtZW50cyAqIHRoZXRhTGVuZ3RoO1xyXG5cclxuXHRcdFx0XHQvLyB2ZXJ0ZXhcclxuXHJcblx0XHRcdFx0dmVydGV4LnggPSByYWRpdXMgKiBNYXRoLmNvcyggc2VnbWVudCApO1xyXG5cdFx0XHRcdHZlcnRleC55ID0gcmFkaXVzICogTWF0aC5zaW4oIHNlZ21lbnQgKTtcclxuXHJcblx0XHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xyXG5cclxuXHRcdFx0XHQvLyBub3JtYWxcclxuXHJcblx0XHRcdFx0bm9ybWFscy5wdXNoKCAwLCAwLCAxICk7XHJcblxyXG5cdFx0XHRcdC8vIHV2XHJcblxyXG5cdFx0XHRcdHV2LnggPSAoIHZlcnRleC54IC8gb3V0ZXJSYWRpdXMgKyAxICkgLyAyO1xyXG5cdFx0XHRcdHV2LnkgPSAoIHZlcnRleC55IC8gb3V0ZXJSYWRpdXMgKyAxICkgLyAyO1xyXG5cclxuXHRcdFx0XHR1dnMucHVzaCggdXYueCwgdXYueSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gaW5jcmVhc2UgdGhlIHJhZGl1cyBmb3IgbmV4dCByb3cgb2YgdmVydGljZXNcclxuXHJcblx0XHRcdHJhZGl1cyArPSByYWRpdXNTdGVwO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBpbmRpY2VzXHJcblxyXG5cdFx0Zm9yICggbGV0IGogPSAwOyBqIDwgcGhpU2VnbWVudHM7IGogKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB0aGV0YVNlZ21lbnRMZXZlbCA9IGogKiAoIHRoZXRhU2VnbWVudHMgKyAxICk7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB0aGV0YVNlZ21lbnRzOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBzZWdtZW50ID0gaSArIHRoZXRhU2VnbWVudExldmVsO1xyXG5cclxuXHRcdFx0XHRjb25zdCBhID0gc2VnbWVudDtcclxuXHRcdFx0XHRjb25zdCBiID0gc2VnbWVudCArIHRoZXRhU2VnbWVudHMgKyAxO1xyXG5cdFx0XHRcdGNvbnN0IGMgPSBzZWdtZW50ICsgdGhldGFTZWdtZW50cyArIDI7XHJcblx0XHRcdFx0Y29uc3QgZCA9IHNlZ21lbnQgKyAxO1xyXG5cclxuXHRcdFx0XHQvLyBmYWNlc1xyXG5cclxuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTtcclxuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gYnVpbGQgZ2VvbWV0cnlcclxuXHJcblx0XHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XHJcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcclxuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xyXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLnBhcmFtZXRlcnMgPSBPYmplY3QuYXNzaWduKCB7fSwgc291cmNlLnBhcmFtZXRlcnMgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGYWN0b3J5IG1ldGhvZCBmb3IgY3JlYXRpbmcgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBmcm9tIHRoZSBnaXZlblxyXG5cdCAqIEpTT04gb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBBIEpTT04gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc2VyaWFsaXplZCBnZW9tZXRyeS5cclxuXHQgKiBAcmV0dXJuIHtSaW5nR2VvbWV0cnl9IEEgbmV3IGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBmcm9tSlNPTiggZGF0YSApIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IFJpbmdHZW9tZXRyeSggZGF0YS5pbm5lclJhZGl1cywgZGF0YS5vdXRlclJhZGl1cywgZGF0YS50aGV0YVNlZ21lbnRzLCBkYXRhLnBoaVNlZ21lbnRzLCBkYXRhLnRoZXRhU3RhcnQsIGRhdGEudGhldGFMZW5ndGggKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCB7IFJpbmdHZW9tZXRyeSB9O1xyXG4iLCJpbXBvcnQgeyBCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyR2VvbWV0cnkuanMnO1xyXG5pbXBvcnQgeyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5pbXBvcnQgeyBTaGFwZSB9IGZyb20gJy4uL2V4dHJhcy9jb3JlL1NoYXBlLmpzJztcclxuaW1wb3J0IHsgU2hhcGVVdGlscyB9IGZyb20gJy4uL2V4dHJhcy9TaGFwZVV0aWxzLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uL21hdGgvVmVjdG9yMi5qcyc7XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhbiBvbmUtc2lkZWQgcG9seWdvbmFsIGdlb21ldHJ5IGZyb20gb25lIG9yIG1vcmUgcGF0aCBzaGFwZXMuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGFyY1NoYXBlID0gbmV3IFRIUkVFLlNoYXBlKClcclxuICpcdC5tb3ZlVG8oIDUsIDEgKVxyXG4gKlx0LmFic2FyYyggMSwgMSwgNCwgMCwgTWF0aC5QSSAqIDIsIGZhbHNlICk7XHJcbiAqXHJcbiAqIGNvbnN0IGdlb21ldHJ5ID0gbmV3IFRIUkVFLlNoYXBlR2VvbWV0cnkoIGFyY1NoYXBlICk7XHJcbiAqIGNvbnN0IG1hdGVyaWFsID0gbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiAweDAwZmYwMCwgc2lkZTogVEhSRUUuRG91YmxlU2lkZSB9ICk7XHJcbiAqIGNvbnN0IG1lc2ggPSBuZXcgVEhSRUUuTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICkgO1xyXG4gKiBzY2VuZS5hZGQoIG1lc2ggKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBCdWZmZXJHZW9tZXRyeVxyXG4gKi9cclxuY2xhc3MgU2hhcGVHZW9tZXRyeSBleHRlbmRzIEJ1ZmZlckdlb21ldHJ5IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBzaGFwZSBnZW9tZXRyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7U2hhcGV8QXJyYXk8U2hhcGU+fSBbc2hhcGVzXSAtIEEgc2hhcGUgb3IgYW4gYXJyYXkgb2Ygc2hhcGVzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbY3VydmVTZWdtZW50cz0xMl0gLSBOdW1iZXIgb2Ygc2VnbWVudHMgcGVyIHNoYXBlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBzaGFwZXMgPSBuZXcgU2hhcGUoIFsgbmV3IFZlY3RvcjIoIDAsIDAuNSApLCBuZXcgVmVjdG9yMiggLSAwLjUsIC0gMC41ICksIG5ldyBWZWN0b3IyKCAwLjUsIC0gMC41ICkgXSApLCBjdXJ2ZVNlZ21lbnRzID0gMTIgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnU2hhcGVHZW9tZXRyeSc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb2xkcyB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVycyB0aGF0IGhhdmUgYmVlblxyXG5cdFx0ICogdXNlZCB0byBnZW5lcmF0ZSB0aGUgZ2VvbWV0cnkuIEFueSBtb2RpZmljYXRpb25cclxuXHRcdCAqIGFmdGVyIGluc3RhbnRpYXRpb24gZG9lcyBub3QgY2hhbmdlIHRoZSBnZW9tZXRyeS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBhcmFtZXRlcnMgPSB7XHJcblx0XHRcdHNoYXBlczogc2hhcGVzLFxyXG5cdFx0XHRjdXJ2ZVNlZ21lbnRzOiBjdXJ2ZVNlZ21lbnRzXHJcblx0XHR9O1xyXG5cclxuXHRcdC8vIGJ1ZmZlcnNcclxuXHJcblx0XHRjb25zdCBpbmRpY2VzID0gW107XHJcblx0XHRjb25zdCB2ZXJ0aWNlcyA9IFtdO1xyXG5cdFx0Y29uc3Qgbm9ybWFscyA9IFtdO1xyXG5cdFx0Y29uc3QgdXZzID0gW107XHJcblxyXG5cdFx0Ly8gaGVscGVyIHZhcmlhYmxlc1xyXG5cclxuXHRcdGxldCBncm91cFN0YXJ0ID0gMDtcclxuXHRcdGxldCBncm91cENvdW50ID0gMDtcclxuXHJcblx0XHQvLyBhbGxvdyBzaW5nbGUgYW5kIGFycmF5IHZhbHVlcyBmb3IgXCJzaGFwZXNcIiBwYXJhbWV0ZXJcclxuXHJcblx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHNoYXBlcyApID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdGFkZFNoYXBlKCBzaGFwZXMgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgc2hhcGVzLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0YWRkU2hhcGUoIHNoYXBlc1sgaSBdICk7XHJcblxyXG5cdFx0XHRcdHRoaXMuYWRkR3JvdXAoIGdyb3VwU3RhcnQsIGdyb3VwQ291bnQsIGkgKTsgLy8gZW5hYmxlcyBNdWx0aU1hdGVyaWFsIHN1cHBvcnRcclxuXHJcblx0XHRcdFx0Z3JvdXBTdGFydCArPSBncm91cENvdW50O1xyXG5cdFx0XHRcdGdyb3VwQ291bnQgPSAwO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBidWlsZCBnZW9tZXRyeVxyXG5cclxuXHRcdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcclxuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xyXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XHJcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XHJcblxyXG5cclxuXHRcdC8vIGhlbHBlciBmdW5jdGlvbnNcclxuXHJcblx0XHRmdW5jdGlvbiBhZGRTaGFwZSggc2hhcGUgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBpbmRleE9mZnNldCA9IHZlcnRpY2VzLmxlbmd0aCAvIDM7XHJcblx0XHRcdGNvbnN0IHBvaW50cyA9IHNoYXBlLmV4dHJhY3RQb2ludHMoIGN1cnZlU2VnbWVudHMgKTtcclxuXHJcblx0XHRcdGxldCBzaGFwZVZlcnRpY2VzID0gcG9pbnRzLnNoYXBlO1xyXG5cdFx0XHRjb25zdCBzaGFwZUhvbGVzID0gcG9pbnRzLmhvbGVzO1xyXG5cclxuXHRcdFx0Ly8gY2hlY2sgZGlyZWN0aW9uIG9mIHZlcnRpY2VzXHJcblxyXG5cdFx0XHRpZiAoIFNoYXBlVXRpbHMuaXNDbG9ja1dpc2UoIHNoYXBlVmVydGljZXMgKSA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRcdHNoYXBlVmVydGljZXMgPSBzaGFwZVZlcnRpY2VzLnJldmVyc2UoKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHNoYXBlSG9sZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3Qgc2hhcGVIb2xlID0gc2hhcGVIb2xlc1sgaSBdO1xyXG5cclxuXHRcdFx0XHRpZiAoIFNoYXBlVXRpbHMuaXNDbG9ja1dpc2UoIHNoYXBlSG9sZSApID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRcdHNoYXBlSG9sZXNbIGkgXSA9IHNoYXBlSG9sZS5yZXZlcnNlKCk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IGZhY2VzID0gU2hhcGVVdGlscy50cmlhbmd1bGF0ZVNoYXBlKCBzaGFwZVZlcnRpY2VzLCBzaGFwZUhvbGVzICk7XHJcblxyXG5cdFx0XHQvLyBqb2luIHZlcnRpY2VzIG9mIGlubmVyIGFuZCBvdXRlciBwYXRocyB0byBhIHNpbmdsZSBhcnJheVxyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gc2hhcGVIb2xlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBzaGFwZUhvbGUgPSBzaGFwZUhvbGVzWyBpIF07XHJcblx0XHRcdFx0c2hhcGVWZXJ0aWNlcyA9IHNoYXBlVmVydGljZXMuY29uY2F0KCBzaGFwZUhvbGUgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIHZlcnRpY2VzLCBub3JtYWxzLCB1dnNcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHNoYXBlVmVydGljZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgdmVydGV4ID0gc2hhcGVWZXJ0aWNlc1sgaSBdO1xyXG5cclxuXHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIDAgKTtcclxuXHRcdFx0XHRub3JtYWxzLnB1c2goIDAsIDAsIDEgKTtcclxuXHRcdFx0XHR1dnMucHVzaCggdmVydGV4LngsIHZlcnRleC55ICk7IC8vIHdvcmxkIHV2c1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gaW5kaWNlc1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gZmFjZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgZmFjZSA9IGZhY2VzWyBpIF07XHJcblxyXG5cdFx0XHRcdGNvbnN0IGEgPSBmYWNlWyAwIF0gKyBpbmRleE9mZnNldDtcclxuXHRcdFx0XHRjb25zdCBiID0gZmFjZVsgMSBdICsgaW5kZXhPZmZzZXQ7XHJcblx0XHRcdFx0Y29uc3QgYyA9IGZhY2VbIDIgXSArIGluZGV4T2Zmc2V0O1xyXG5cclxuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGMgKTtcclxuXHRcdFx0XHRncm91cENvdW50ICs9IDM7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLnBhcmFtZXRlcnMgPSBPYmplY3QuYXNzaWduKCB7fSwgc291cmNlLnBhcmFtZXRlcnMgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHR0b0pTT04oKSB7XHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IHN1cGVyLnRvSlNPTigpO1xyXG5cclxuXHRcdGNvbnN0IHNoYXBlcyA9IHRoaXMucGFyYW1ldGVycy5zaGFwZXM7XHJcblxyXG5cdFx0cmV0dXJuIHRvSlNPTiggc2hhcGVzLCBkYXRhICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRmFjdG9yeSBtZXRob2QgZm9yIGNyZWF0aW5nIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZnJvbSB0aGUgZ2l2ZW5cclxuXHQgKiBKU09OIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gQSBKU09OIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNlcmlhbGl6ZWQgZ2VvbWV0cnkuXHJcblx0ICogQHBhcmFtIHtBcnJheTxTaGFwZT59IHNoYXBlcyAtIEFuIGFycmF5IG9mIHNoYXBlcy5cclxuXHQgKiBAcmV0dXJuIHtTaGFwZUdlb21ldHJ5fSBBIG5ldyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzdGF0aWMgZnJvbUpTT04oIGRhdGEsIHNoYXBlcyApIHtcclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeVNoYXBlcyA9IFtdO1xyXG5cclxuXHRcdGZvciAoIGxldCBqID0gMCwgamwgPSBkYXRhLnNoYXBlcy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHNoYXBlID0gc2hhcGVzWyBkYXRhLnNoYXBlc1sgaiBdIF07XHJcblxyXG5cdFx0XHRnZW9tZXRyeVNoYXBlcy5wdXNoKCBzaGFwZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbmV3IFNoYXBlR2VvbWV0cnkoIGdlb21ldHJ5U2hhcGVzLCBkYXRhLmN1cnZlU2VnbWVudHMgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gdG9KU09OKCBzaGFwZXMsIGRhdGEgKSB7XHJcblxyXG5cdGRhdGEuc2hhcGVzID0gW107XHJcblxyXG5cdGlmICggQXJyYXkuaXNBcnJheSggc2hhcGVzICkgKSB7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gc2hhcGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBzaGFwZSA9IHNoYXBlc1sgaSBdO1xyXG5cclxuXHRcdFx0ZGF0YS5zaGFwZXMucHVzaCggc2hhcGUudXVpZCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fSBlbHNlIHtcclxuXHJcblx0XHRkYXRhLnNoYXBlcy5wdXNoKCBzaGFwZXMudXVpZCApO1xyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiBkYXRhO1xyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgU2hhcGVHZW9tZXRyeSB9O1xyXG4iLCJpbXBvcnQgeyBCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyR2VvbWV0cnkuanMnO1xyXG5pbXBvcnQgeyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIGNsYXNzIGZvciBnZW5lcmF0aW5nIGEgc3BoZXJlIGdlb21ldHJ5LlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBnZW9tZXRyeSA9IG5ldyBUSFJFRS5TcGhlcmVHZW9tZXRyeSggMTUsIDMyLCAxNiApO1xyXG4gKiBjb25zdCBtYXRlcmlhbCA9IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogMHhmZmZmMDAgfSApO1xyXG4gKiBjb25zdCBzcGhlcmUgPSBuZXcgVEhSRUUuTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcbiAqIHNjZW5lLmFkZCggc3BoZXJlICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQnVmZmVyR2VvbWV0cnlcclxuICovXHJcbmNsYXNzIFNwaGVyZUdlb21ldHJ5IGV4dGVuZHMgQnVmZmVyR2VvbWV0cnkge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHNwaGVyZSBnZW9tZXRyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbcmFkaXVzPTFdIC0gVGhlIHNwaGVyZSByYWRpdXMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt3aWR0aFNlZ21lbnRzPTMyXSAtIFRoZSBudW1iZXIgb2YgaG9yaXpvbnRhbCBzZWdtZW50cy4gTWluaW11bSB2YWx1ZSBpcyBgM2AuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtoZWlnaHRTZWdtZW50cz0xNl0gLSBUaGUgbnVtYmVyIG9mIHZlcnRpY2FsIHNlZ21lbnRzLiBNaW5pbXVtIHZhbHVlIGlzIGAyYC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3BoaVN0YXJ0PTBdIC0gVGhlIGhvcml6b250YWwgc3RhcnRpbmcgYW5nbGUgaW4gcmFkaWFucy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3BoaUxlbmd0aD1NYXRoLlBJKjJdIC0gVGhlIGhvcml6b250YWwgc3dlZXAgYW5nbGUgc2l6ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3RoZXRhU3RhcnQ9MF0gLSBUaGUgdmVydGljYWwgc3RhcnRpbmcgYW5nbGUgaW4gcmFkaWFucy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3RoZXRhTGVuZ3RoPU1hdGguUEldIC0gVGhlIHZlcnRpY2FsIHN3ZWVwIGFuZ2xlIHNpemUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHJhZGl1cyA9IDEsIHdpZHRoU2VnbWVudHMgPSAzMiwgaGVpZ2h0U2VnbWVudHMgPSAxNiwgcGhpU3RhcnQgPSAwLCBwaGlMZW5ndGggPSBNYXRoLlBJICogMiwgdGhldGFTdGFydCA9IDAsIHRoZXRhTGVuZ3RoID0gTWF0aC5QSSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdTcGhlcmVHZW9tZXRyeSc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb2xkcyB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVycyB0aGF0IGhhdmUgYmVlblxyXG5cdFx0ICogdXNlZCB0byBnZW5lcmF0ZSB0aGUgZ2VvbWV0cnkuIEFueSBtb2RpZmljYXRpb25cclxuXHRcdCAqIGFmdGVyIGluc3RhbnRpYXRpb24gZG9lcyBub3QgY2hhbmdlIHRoZSBnZW9tZXRyeS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBhcmFtZXRlcnMgPSB7XHJcblx0XHRcdHJhZGl1czogcmFkaXVzLFxyXG5cdFx0XHR3aWR0aFNlZ21lbnRzOiB3aWR0aFNlZ21lbnRzLFxyXG5cdFx0XHRoZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHMsXHJcblx0XHRcdHBoaVN0YXJ0OiBwaGlTdGFydCxcclxuXHRcdFx0cGhpTGVuZ3RoOiBwaGlMZW5ndGgsXHJcblx0XHRcdHRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsXHJcblx0XHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxyXG5cdFx0fTtcclxuXHJcblx0XHR3aWR0aFNlZ21lbnRzID0gTWF0aC5tYXgoIDMsIE1hdGguZmxvb3IoIHdpZHRoU2VnbWVudHMgKSApO1xyXG5cdFx0aGVpZ2h0U2VnbWVudHMgPSBNYXRoLm1heCggMiwgTWF0aC5mbG9vciggaGVpZ2h0U2VnbWVudHMgKSApO1xyXG5cclxuXHRcdGNvbnN0IHRoZXRhRW5kID0gTWF0aC5taW4oIHRoZXRhU3RhcnQgKyB0aGV0YUxlbmd0aCwgTWF0aC5QSSApO1xyXG5cclxuXHRcdGxldCBpbmRleCA9IDA7XHJcblx0XHRjb25zdCBncmlkID0gW107XHJcblxyXG5cdFx0Y29uc3QgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcclxuXHRcdGNvbnN0IG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XHJcblxyXG5cdFx0Ly8gYnVmZmVyc1xyXG5cclxuXHRcdGNvbnN0IGluZGljZXMgPSBbXTtcclxuXHRcdGNvbnN0IHZlcnRpY2VzID0gW107XHJcblx0XHRjb25zdCBub3JtYWxzID0gW107XHJcblx0XHRjb25zdCB1dnMgPSBbXTtcclxuXHJcblx0XHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzXHJcblxyXG5cdFx0Zm9yICggbGV0IGl5ID0gMDsgaXkgPD0gaGVpZ2h0U2VnbWVudHM7IGl5ICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdmVydGljZXNSb3cgPSBbXTtcclxuXHJcblx0XHRcdGNvbnN0IHYgPSBpeSAvIGhlaWdodFNlZ21lbnRzO1xyXG5cclxuXHRcdFx0Ly8gc3BlY2lhbCBjYXNlIGZvciB0aGUgcG9sZXNcclxuXHJcblx0XHRcdGxldCB1T2Zmc2V0ID0gMDtcclxuXHJcblx0XHRcdGlmICggaXkgPT09IDAgJiYgdGhldGFTdGFydCA9PT0gMCApIHtcclxuXHJcblx0XHRcdFx0dU9mZnNldCA9IDAuNSAvIHdpZHRoU2VnbWVudHM7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBpeSA9PT0gaGVpZ2h0U2VnbWVudHMgJiYgdGhldGFFbmQgPT09IE1hdGguUEkgKSB7XHJcblxyXG5cdFx0XHRcdHVPZmZzZXQgPSAtIDAuNSAvIHdpZHRoU2VnbWVudHM7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaXggPSAwOyBpeCA8PSB3aWR0aFNlZ21lbnRzOyBpeCArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgdSA9IGl4IC8gd2lkdGhTZWdtZW50cztcclxuXHJcblx0XHRcdFx0Ly8gdmVydGV4XHJcblxyXG5cdFx0XHRcdHZlcnRleC54ID0gLSByYWRpdXMgKiBNYXRoLmNvcyggcGhpU3RhcnQgKyB1ICogcGhpTGVuZ3RoICkgKiBNYXRoLnNpbiggdGhldGFTdGFydCArIHYgKiB0aGV0YUxlbmd0aCApO1xyXG5cdFx0XHRcdHZlcnRleC55ID0gcmFkaXVzICogTWF0aC5jb3MoIHRoZXRhU3RhcnQgKyB2ICogdGhldGFMZW5ndGggKTtcclxuXHRcdFx0XHR2ZXJ0ZXgueiA9IHJhZGl1cyAqIE1hdGguc2luKCBwaGlTdGFydCArIHUgKiBwaGlMZW5ndGggKSAqIE1hdGguc2luKCB0aGV0YVN0YXJ0ICsgdiAqIHRoZXRhTGVuZ3RoICk7XHJcblxyXG5cdFx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcclxuXHJcblx0XHRcdFx0Ly8gbm9ybWFsXHJcblxyXG5cdFx0XHRcdG5vcm1hbC5jb3B5KCB2ZXJ0ZXggKS5ub3JtYWxpemUoKTtcclxuXHRcdFx0XHRub3JtYWxzLnB1c2goIG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnogKTtcclxuXHJcblx0XHRcdFx0Ly8gdXZcclxuXHJcblx0XHRcdFx0dXZzLnB1c2goIHUgKyB1T2Zmc2V0LCAxIC0gdiApO1xyXG5cclxuXHRcdFx0XHR2ZXJ0aWNlc1Jvdy5wdXNoKCBpbmRleCArKyApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Z3JpZC5wdXNoKCB2ZXJ0aWNlc1JvdyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBpbmRpY2VzXHJcblxyXG5cdFx0Zm9yICggbGV0IGl5ID0gMDsgaXkgPCBoZWlnaHRTZWdtZW50czsgaXkgKysgKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaXggPSAwOyBpeCA8IHdpZHRoU2VnbWVudHM7IGl4ICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBhID0gZ3JpZFsgaXkgXVsgaXggKyAxIF07XHJcblx0XHRcdFx0Y29uc3QgYiA9IGdyaWRbIGl5IF1bIGl4IF07XHJcblx0XHRcdFx0Y29uc3QgYyA9IGdyaWRbIGl5ICsgMSBdWyBpeCBdO1xyXG5cdFx0XHRcdGNvbnN0IGQgPSBncmlkWyBpeSArIDEgXVsgaXggKyAxIF07XHJcblxyXG5cdFx0XHRcdGlmICggaXkgIT09IDAgfHwgdGhldGFTdGFydCA+IDAgKSBpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTtcclxuXHRcdFx0XHRpZiAoIGl5ICE9PSBoZWlnaHRTZWdtZW50cyAtIDEgfHwgdGhldGFFbmQgPCBNYXRoLlBJICkgaW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGJ1aWxkIGdlb21ldHJ5XHJcblxyXG5cdFx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xyXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XHJcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcclxuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0gT2JqZWN0LmFzc2lnbigge30sIHNvdXJjZS5wYXJhbWV0ZXJzICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRmFjdG9yeSBtZXRob2QgZm9yIGNyZWF0aW5nIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZnJvbSB0aGUgZ2l2ZW5cclxuXHQgKiBKU09OIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gQSBKU09OIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNlcmlhbGl6ZWQgZ2VvbWV0cnkuXHJcblx0ICogQHJldHVybiB7U3BoZXJlR2VvbWV0cnl9IEEgbmV3IGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBmcm9tSlNPTiggZGF0YSApIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IFNwaGVyZUdlb21ldHJ5KCBkYXRhLnJhZGl1cywgZGF0YS53aWR0aFNlZ21lbnRzLCBkYXRhLmhlaWdodFNlZ21lbnRzLCBkYXRhLnBoaVN0YXJ0LCBkYXRhLnBoaUxlbmd0aCwgZGF0YS50aGV0YVN0YXJ0LCBkYXRhLnRoZXRhTGVuZ3RoICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFNwaGVyZUdlb21ldHJ5IH07XHJcbiIsImltcG9ydCB7IFBvbHloZWRyb25HZW9tZXRyeSB9IGZyb20gJy4vUG9seWhlZHJvbkdlb21ldHJ5LmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIGdlb21ldHJ5IGNsYXNzIGZvciByZXByZXNlbnRpbmcgYW4gdGV0cmFoZWRyb24uXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGdlb21ldHJ5ID0gbmV3IFRIUkVFLlRldHJhaGVkcm9uR2VvbWV0cnkoKTtcclxuICogY29uc3QgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IDB4ZmZmZjAwIH0gKTtcclxuICogY29uc3QgdGV0cmFoZWRyb24gPSBuZXcgVEhSRUUuTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcbiAqIHNjZW5lLmFkZCggdGV0cmFoZWRyb24gKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBQb2x5aGVkcm9uR2VvbWV0cnlcclxuICovXHJcbmNsYXNzIFRldHJhaGVkcm9uR2VvbWV0cnkgZXh0ZW5kcyBQb2x5aGVkcm9uR2VvbWV0cnkge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHRldHJhaGVkcm9uIGdlb21ldHJ5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpdXM9MV0gLSBSYWRpdXMgb2YgdGhlIHRldHJhaGVkcm9uLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZGV0YWlsPTBdIC0gU2V0dGluZyB0aGlzIHRvIGEgdmFsdWUgZ3JlYXRlciB0aGFuIGAwYCBhZGRzIHZlcnRpY2VzIG1ha2luZyBpdCBubyBsb25nZXIgYSB0ZXRyYWhlZHJvbi5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcmFkaXVzID0gMSwgZGV0YWlsID0gMCApIHtcclxuXHJcblx0XHRjb25zdCB2ZXJ0aWNlcyA9IFtcclxuXHRcdFx0MSwgMSwgMSwgXHQtIDEsIC0gMSwgMSwgXHQtIDEsIDEsIC0gMSwgXHQxLCAtIDEsIC0gMVxyXG5cdFx0XTtcclxuXHJcblx0XHRjb25zdCBpbmRpY2VzID0gW1xyXG5cdFx0XHQyLCAxLCAwLCBcdDAsIDMsIDIsXHQxLCAzLCAwLFx0MiwgMywgMVxyXG5cdFx0XTtcclxuXHJcblx0XHRzdXBlciggdmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWlsICk7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ1RldHJhaGVkcm9uR2VvbWV0cnknO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG9sZHMgdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMgdGhhdCBoYXZlIGJlZW5cclxuXHRcdCAqIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGdlb21ldHJ5LiBBbnkgbW9kaWZpY2F0aW9uXHJcblx0XHQgKiBhZnRlciBpbnN0YW50aWF0aW9uIGRvZXMgbm90IGNoYW5nZSB0aGUgZ2VvbWV0cnkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0ge1xyXG5cdFx0XHRyYWRpdXM6IHJhZGl1cyxcclxuXHRcdFx0ZGV0YWlsOiBkZXRhaWxcclxuXHRcdH07XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRmFjdG9yeSBtZXRob2QgZm9yIGNyZWF0aW5nIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZnJvbSB0aGUgZ2l2ZW5cclxuXHQgKiBKU09OIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gQSBKU09OIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNlcmlhbGl6ZWQgZ2VvbWV0cnkuXHJcblx0ICogQHJldHVybiB7VGV0cmFoZWRyb25HZW9tZXRyeX0gQSBuZXcgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c3RhdGljIGZyb21KU09OKCBkYXRhICkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgVGV0cmFoZWRyb25HZW9tZXRyeSggZGF0YS5yYWRpdXMsIGRhdGEuZGV0YWlsICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFRldHJhaGVkcm9uR2VvbWV0cnkgfTtcclxuIiwiaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcclxuaW1wb3J0IHsgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyQXR0cmlidXRlLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcblxyXG4vKipcclxuICogQSBnZW9tZXRyeSBjbGFzcyBmb3IgcmVwcmVzZW50aW5nIGFuIHRvcnVzLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBnZW9tZXRyeSA9IG5ldyBUSFJFRS5Ub3J1c0dlb21ldHJ5KCAxMCwgMywgMTYsIDEwMCApO1xyXG4gKiBjb25zdCBtYXRlcmlhbCA9IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogMHhmZmZmMDAgfSApO1xyXG4gKiBjb25zdCB0b3J1cyA9IG5ldyBUSFJFRS5NZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuICogc2NlbmUuYWRkKCB0b3J1cyApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIEJ1ZmZlckdlb21ldHJ5XHJcbiAqL1xyXG5jbGFzcyBUb3J1c0dlb21ldHJ5IGV4dGVuZHMgQnVmZmVyR2VvbWV0cnkge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHRvcnVzIGdlb21ldHJ5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpdXM9MV0gLSBSYWRpdXMgb2YgdGhlIHRvcnVzLCBmcm9tIHRoZSBjZW50ZXIgb2YgdGhlIHRvcnVzIHRvIHRoZSBjZW50ZXIgb2YgdGhlIHR1YmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt0dWJlPTAuNF0gLSBSYWRpdXMgb2YgdGhlIHR1YmUuIE11c3QgYmUgc21hbGxlciB0aGFuIGByYWRpdXNgLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbcmFkaWFsU2VnbWVudHM9MTJdIC0gVGhlIG51bWJlciBvZiByYWRpYWwgc2VnbWVudHMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt0dWJ1bGFyU2VnbWVudHM9NDhdIC0gVGhlIG51bWJlciBvZiB0dWJ1bGFyIHNlZ21lbnRzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbYXJjPU1hdGguUEkqMl0gLSBDZW50cmFsIGFuZ2xlIGluIHJhZGlhbnMuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHJhZGl1cyA9IDEsIHR1YmUgPSAwLjQsIHJhZGlhbFNlZ21lbnRzID0gMTIsIHR1YnVsYXJTZWdtZW50cyA9IDQ4LCBhcmMgPSBNYXRoLlBJICogMiApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdUb3J1c0dlb21ldHJ5JztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvbGRzIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzIHRoYXQgaGF2ZSBiZWVuXHJcblx0XHQgKiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBnZW9tZXRyeS4gQW55IG1vZGlmaWNhdGlvblxyXG5cdFx0ICogYWZ0ZXIgaW5zdGFudGlhdGlvbiBkb2VzIG5vdCBjaGFuZ2UgdGhlIGdlb21ldHJ5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucGFyYW1ldGVycyA9IHtcclxuXHRcdFx0cmFkaXVzOiByYWRpdXMsXHJcblx0XHRcdHR1YmU6IHR1YmUsXHJcblx0XHRcdHJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cyxcclxuXHRcdFx0dHVidWxhclNlZ21lbnRzOiB0dWJ1bGFyU2VnbWVudHMsXHJcblx0XHRcdGFyYzogYXJjXHJcblx0XHR9O1xyXG5cclxuXHRcdHJhZGlhbFNlZ21lbnRzID0gTWF0aC5mbG9vciggcmFkaWFsU2VnbWVudHMgKTtcclxuXHRcdHR1YnVsYXJTZWdtZW50cyA9IE1hdGguZmxvb3IoIHR1YnVsYXJTZWdtZW50cyApO1xyXG5cclxuXHRcdC8vIGJ1ZmZlcnNcclxuXHJcblx0XHRjb25zdCBpbmRpY2VzID0gW107XHJcblx0XHRjb25zdCB2ZXJ0aWNlcyA9IFtdO1xyXG5cdFx0Y29uc3Qgbm9ybWFscyA9IFtdO1xyXG5cdFx0Y29uc3QgdXZzID0gW107XHJcblxyXG5cdFx0Ly8gaGVscGVyIHZhcmlhYmxlc1xyXG5cclxuXHRcdGNvbnN0IGNlbnRlciA9IG5ldyBWZWN0b3IzKCk7XHJcblx0XHRjb25zdCB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xyXG5cdFx0Y29uc3Qgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcclxuXHJcblx0XHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzXHJcblxyXG5cdFx0Zm9yICggbGV0IGogPSAwOyBqIDw9IHJhZGlhbFNlZ21lbnRzOyBqICsrICkge1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDw9IHR1YnVsYXJTZWdtZW50czsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgdSA9IGkgLyB0dWJ1bGFyU2VnbWVudHMgKiBhcmM7XHJcblx0XHRcdFx0Y29uc3QgdiA9IGogLyByYWRpYWxTZWdtZW50cyAqIE1hdGguUEkgKiAyO1xyXG5cclxuXHRcdFx0XHQvLyB2ZXJ0ZXhcclxuXHJcblx0XHRcdFx0dmVydGV4LnggPSAoIHJhZGl1cyArIHR1YmUgKiBNYXRoLmNvcyggdiApICkgKiBNYXRoLmNvcyggdSApO1xyXG5cdFx0XHRcdHZlcnRleC55ID0gKCByYWRpdXMgKyB0dWJlICogTWF0aC5jb3MoIHYgKSApICogTWF0aC5zaW4oIHUgKTtcclxuXHRcdFx0XHR2ZXJ0ZXgueiA9IHR1YmUgKiBNYXRoLnNpbiggdiApO1xyXG5cclxuXHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XHJcblxyXG5cdFx0XHRcdC8vIG5vcm1hbFxyXG5cclxuXHRcdFx0XHRjZW50ZXIueCA9IHJhZGl1cyAqIE1hdGguY29zKCB1ICk7XHJcblx0XHRcdFx0Y2VudGVyLnkgPSByYWRpdXMgKiBNYXRoLnNpbiggdSApO1xyXG5cdFx0XHRcdG5vcm1hbC5zdWJWZWN0b3JzKCB2ZXJ0ZXgsIGNlbnRlciApLm5vcm1hbGl6ZSgpO1xyXG5cclxuXHRcdFx0XHRub3JtYWxzLnB1c2goIG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnogKTtcclxuXHJcblx0XHRcdFx0Ly8gdXZcclxuXHJcblx0XHRcdFx0dXZzLnB1c2goIGkgLyB0dWJ1bGFyU2VnbWVudHMgKTtcclxuXHRcdFx0XHR1dnMucHVzaCggaiAvIHJhZGlhbFNlZ21lbnRzICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGdlbmVyYXRlIGluZGljZXNcclxuXHJcblx0XHRmb3IgKCBsZXQgaiA9IDE7IGogPD0gcmFkaWFsU2VnbWVudHM7IGogKysgKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDE7IGkgPD0gdHVidWxhclNlZ21lbnRzOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHQvLyBpbmRpY2VzXHJcblxyXG5cdFx0XHRcdGNvbnN0IGEgPSAoIHR1YnVsYXJTZWdtZW50cyArIDEgKSAqIGogKyBpIC0gMTtcclxuXHRcdFx0XHRjb25zdCBiID0gKCB0dWJ1bGFyU2VnbWVudHMgKyAxICkgKiAoIGogLSAxICkgKyBpIC0gMTtcclxuXHRcdFx0XHRjb25zdCBjID0gKCB0dWJ1bGFyU2VnbWVudHMgKyAxICkgKiAoIGogLSAxICkgKyBpO1xyXG5cdFx0XHRcdGNvbnN0IGQgPSAoIHR1YnVsYXJTZWdtZW50cyArIDEgKSAqIGogKyBpO1xyXG5cclxuXHRcdFx0XHQvLyBmYWNlc1xyXG5cclxuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTtcclxuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gYnVpbGQgZ2VvbWV0cnlcclxuXHJcblx0XHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XHJcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcclxuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xyXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLnBhcmFtZXRlcnMgPSBPYmplY3QuYXNzaWduKCB7fSwgc291cmNlLnBhcmFtZXRlcnMgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGYWN0b3J5IG1ldGhvZCBmb3IgY3JlYXRpbmcgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBmcm9tIHRoZSBnaXZlblxyXG5cdCAqIEpTT04gb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBBIEpTT04gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc2VyaWFsaXplZCBnZW9tZXRyeS5cclxuXHQgKiBAcmV0dXJuIHtUb3J1c0dlb21ldHJ5fSBBIG5ldyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzdGF0aWMgZnJvbUpTT04oIGRhdGEgKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBUb3J1c0dlb21ldHJ5KCBkYXRhLnJhZGl1cywgZGF0YS50dWJlLCBkYXRhLnJhZGlhbFNlZ21lbnRzLCBkYXRhLnR1YnVsYXJTZWdtZW50cywgZGF0YS5hcmMgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgVG9ydXNHZW9tZXRyeSB9O1xyXG4iLCJpbXBvcnQgeyBCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyR2VvbWV0cnkuanMnO1xyXG5pbXBvcnQgeyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgdG9ydXMga25vdCwgdGhlIHBhcnRpY3VsYXIgc2hhcGUgb2Ygd2hpY2ggaXMgZGVmaW5lZCBieSBhIHBhaXJcclxuICogb2YgY29wcmltZSBpbnRlZ2VycywgcCBhbmQgcS4gSWYgcCBhbmQgcSBhcmUgbm90IGNvcHJpbWUsIHRoZSByZXN1bHQgd2lsbFxyXG4gKiBiZSBhIHRvcnVzIGxpbmsuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGdlb21ldHJ5ID0gbmV3IFRIUkVFLlRvcnVzS25vdEdlb21ldHJ5KCAxMCwgMywgMTAwLCAxNiApO1xyXG4gKiBjb25zdCBtYXRlcmlhbCA9IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogMHhmZmZmMDAgfSApO1xyXG4gKiBjb25zdCB0b3J1c0tub3QgPSBuZXcgVEhSRUUuTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcbiAqIHNjZW5lLmFkZCggdG9ydXNLbm90ICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQnVmZmVyR2VvbWV0cnlcclxuICovXHJcbmNsYXNzIFRvcnVzS25vdEdlb21ldHJ5IGV4dGVuZHMgQnVmZmVyR2VvbWV0cnkge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHRvcnVzIGtub3QgZ2VvbWV0cnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3JhZGl1cz0xXSAtIFJhZGl1cyBvZiB0aGUgdG9ydXMga25vdC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3R1YmU9MC40XSAtIFJhZGl1cyBvZiB0aGUgdHViZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3R1YnVsYXJTZWdtZW50cz02NF0gLSBUaGUgbnVtYmVyIG9mIHR1YnVsYXIgc2VnbWVudHMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpYWxTZWdtZW50cz04XSAtIFRoZSBudW1iZXIgb2YgcmFkaWFsIHNlZ21lbnRzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbcD0yXSAtIFRoaXMgdmFsdWUgZGV0ZXJtaW5lcywgaG93IG1hbnkgdGltZXMgdGhlIGdlb21ldHJ5IHdpbmRzIGFyb3VuZCBpdHMgYXhpcyBvZiByb3RhdGlvbmFsIHN5bW1ldHJ5LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbcT0zXSAtIFRoaXMgdmFsdWUgZGV0ZXJtaW5lcywgaG93IG1hbnkgdGltZXMgdGhlIGdlb21ldHJ5IHdpbmRzIGFyb3VuZCBhIGNpcmNsZSBpbiB0aGUgaW50ZXJpb3Igb2YgdGhlIHRvcnVzLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCByYWRpdXMgPSAxLCB0dWJlID0gMC40LCB0dWJ1bGFyU2VnbWVudHMgPSA2NCwgcmFkaWFsU2VnbWVudHMgPSA4LCBwID0gMiwgcSA9IDMgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnVG9ydXNLbm90R2VvbWV0cnknO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG9sZHMgdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMgdGhhdCBoYXZlIGJlZW5cclxuXHRcdCAqIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGdlb21ldHJ5LiBBbnkgbW9kaWZpY2F0aW9uXHJcblx0XHQgKiBhZnRlciBpbnN0YW50aWF0aW9uIGRvZXMgbm90IGNoYW5nZSB0aGUgZ2VvbWV0cnkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0ge1xyXG5cdFx0XHRyYWRpdXM6IHJhZGl1cyxcclxuXHRcdFx0dHViZTogdHViZSxcclxuXHRcdFx0dHVidWxhclNlZ21lbnRzOiB0dWJ1bGFyU2VnbWVudHMsXHJcblx0XHRcdHJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cyxcclxuXHRcdFx0cDogcCxcclxuXHRcdFx0cTogcVxyXG5cdFx0fTtcclxuXHJcblx0XHR0dWJ1bGFyU2VnbWVudHMgPSBNYXRoLmZsb29yKCB0dWJ1bGFyU2VnbWVudHMgKTtcclxuXHRcdHJhZGlhbFNlZ21lbnRzID0gTWF0aC5mbG9vciggcmFkaWFsU2VnbWVudHMgKTtcclxuXHJcblx0XHQvLyBidWZmZXJzXHJcblxyXG5cdFx0Y29uc3QgaW5kaWNlcyA9IFtdO1xyXG5cdFx0Y29uc3QgdmVydGljZXMgPSBbXTtcclxuXHRcdGNvbnN0IG5vcm1hbHMgPSBbXTtcclxuXHRcdGNvbnN0IHV2cyA9IFtdO1xyXG5cclxuXHRcdC8vIGhlbHBlciB2YXJpYWJsZXNcclxuXHJcblx0XHRjb25zdCB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xyXG5cdFx0Y29uc3Qgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcclxuXHJcblx0XHRjb25zdCBQMSA9IG5ldyBWZWN0b3IzKCk7XHJcblx0XHRjb25zdCBQMiA9IG5ldyBWZWN0b3IzKCk7XHJcblxyXG5cdFx0Y29uc3QgQiA9IG5ldyBWZWN0b3IzKCk7XHJcblx0XHRjb25zdCBUID0gbmV3IFZlY3RvcjMoKTtcclxuXHRcdGNvbnN0IE4gPSBuZXcgVmVjdG9yMygpO1xyXG5cclxuXHRcdC8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnNcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPD0gdHVidWxhclNlZ21lbnRzOyArKyBpICkge1xyXG5cclxuXHRcdFx0Ly8gdGhlIHJhZGlhbiBcInVcIiBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgcG9zaXRpb24gb24gdGhlIHRvcnVzIGN1cnZlIG9mIHRoZSBjdXJyZW50IHR1YnVsYXIgc2VnbWVudFxyXG5cclxuXHRcdFx0Y29uc3QgdSA9IGkgLyB0dWJ1bGFyU2VnbWVudHMgKiBwICogTWF0aC5QSSAqIDI7XHJcblxyXG5cdFx0XHQvLyBub3cgd2UgY2FsY3VsYXRlIHR3byBwb2ludHMuIFAxIGlzIG91ciBjdXJyZW50IHBvc2l0aW9uIG9uIHRoZSBjdXJ2ZSwgUDIgaXMgYSBsaXR0bGUgZmFydGhlciBhaGVhZC5cclxuXHRcdFx0Ly8gdGhlc2UgcG9pbnRzIGFyZSB1c2VkIHRvIGNyZWF0ZSBhIHNwZWNpYWwgXCJjb29yZGluYXRlIHNwYWNlXCIsIHdoaWNoIGlzIG5lY2Vzc2FyeSB0byBjYWxjdWxhdGUgdGhlIGNvcnJlY3QgdmVydGV4IHBvc2l0aW9uc1xyXG5cclxuXHRcdFx0Y2FsY3VsYXRlUG9zaXRpb25PbkN1cnZlKCB1LCBwLCBxLCByYWRpdXMsIFAxICk7XHJcblx0XHRcdGNhbGN1bGF0ZVBvc2l0aW9uT25DdXJ2ZSggdSArIDAuMDEsIHAsIHEsIHJhZGl1cywgUDIgKTtcclxuXHJcblx0XHRcdC8vIGNhbGN1bGF0ZSBvcnRob25vcm1hbCBiYXNpc1xyXG5cclxuXHRcdFx0VC5zdWJWZWN0b3JzKCBQMiwgUDEgKTtcclxuXHRcdFx0Ti5hZGRWZWN0b3JzKCBQMiwgUDEgKTtcclxuXHRcdFx0Qi5jcm9zc1ZlY3RvcnMoIFQsIE4gKTtcclxuXHRcdFx0Ti5jcm9zc1ZlY3RvcnMoIEIsIFQgKTtcclxuXHJcblx0XHRcdC8vIG5vcm1hbGl6ZSBCLCBOLiBUIGNhbiBiZSBpZ25vcmVkLCB3ZSBkb24ndCB1c2UgaXRcclxuXHJcblx0XHRcdEIubm9ybWFsaXplKCk7XHJcblx0XHRcdE4ubm9ybWFsaXplKCk7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaiA9IDA7IGogPD0gcmFkaWFsU2VnbWVudHM7ICsrIGogKSB7XHJcblxyXG5cdFx0XHRcdC8vIG5vdyBjYWxjdWxhdGUgdGhlIHZlcnRpY2VzLiB0aGV5IGFyZSBub3RoaW5nIG1vcmUgdGhhbiBhbiBleHRydXNpb24gb2YgdGhlIHRvcnVzIGN1cnZlLlxyXG5cdFx0XHRcdC8vIGJlY2F1c2Ugd2UgZXh0cnVkZSBhIHNoYXBlIGluIHRoZSB4eS1wbGFuZSwgdGhlcmUgaXMgbm8gbmVlZCB0byBjYWxjdWxhdGUgYSB6LXZhbHVlLlxyXG5cclxuXHRcdFx0XHRjb25zdCB2ID0gaiAvIHJhZGlhbFNlZ21lbnRzICogTWF0aC5QSSAqIDI7XHJcblx0XHRcdFx0Y29uc3QgY3ggPSAtIHR1YmUgKiBNYXRoLmNvcyggdiApO1xyXG5cdFx0XHRcdGNvbnN0IGN5ID0gdHViZSAqIE1hdGguc2luKCB2ICk7XHJcblxyXG5cdFx0XHRcdC8vIG5vdyBjYWxjdWxhdGUgdGhlIGZpbmFsIHZlcnRleCBwb3NpdGlvbi5cclxuXHRcdFx0XHQvLyBmaXJzdCB3ZSBvcmllbnQgdGhlIGV4dHJ1c2lvbiB3aXRoIG91ciBiYXNpcyB2ZWN0b3JzLCB0aGVuIHdlIGFkZCBpdCB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBvbiB0aGUgY3VydmVcclxuXHJcblx0XHRcdFx0dmVydGV4LnggPSBQMS54ICsgKCBjeCAqIE4ueCArIGN5ICogQi54ICk7XHJcblx0XHRcdFx0dmVydGV4LnkgPSBQMS55ICsgKCBjeCAqIE4ueSArIGN5ICogQi55ICk7XHJcblx0XHRcdFx0dmVydGV4LnogPSBQMS56ICsgKCBjeCAqIE4ueiArIGN5ICogQi56ICk7XHJcblxyXG5cdFx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcclxuXHJcblx0XHRcdFx0Ly8gbm9ybWFsIChQMSBpcyBhbHdheXMgdGhlIGNlbnRlci9vcmlnaW4gb2YgdGhlIGV4dHJ1c2lvbiwgdGh1cyB3ZSBjYW4gdXNlIGl0IHRvIGNhbGN1bGF0ZSB0aGUgbm9ybWFsKVxyXG5cclxuXHRcdFx0XHRub3JtYWwuc3ViVmVjdG9ycyggdmVydGV4LCBQMSApLm5vcm1hbGl6ZSgpO1xyXG5cclxuXHRcdFx0XHRub3JtYWxzLnB1c2goIG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnogKTtcclxuXHJcblx0XHRcdFx0Ly8gdXZcclxuXHJcblx0XHRcdFx0dXZzLnB1c2goIGkgLyB0dWJ1bGFyU2VnbWVudHMgKTtcclxuXHRcdFx0XHR1dnMucHVzaCggaiAvIHJhZGlhbFNlZ21lbnRzICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGdlbmVyYXRlIGluZGljZXNcclxuXHJcblx0XHRmb3IgKCBsZXQgaiA9IDE7IGogPD0gdHVidWxhclNlZ21lbnRzOyBqICsrICkge1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAxOyBpIDw9IHJhZGlhbFNlZ21lbnRzOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHQvLyBpbmRpY2VzXHJcblxyXG5cdFx0XHRcdGNvbnN0IGEgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogKCBqIC0gMSApICsgKCBpIC0gMSApO1xyXG5cdFx0XHRcdGNvbnN0IGIgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogaiArICggaSAtIDEgKTtcclxuXHRcdFx0XHRjb25zdCBjID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqIGogKyBpO1xyXG5cdFx0XHRcdGNvbnN0IGQgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogKCBqIC0gMSApICsgaTtcclxuXHJcblx0XHRcdFx0Ly8gZmFjZXNcclxuXHJcblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XHJcblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGJ1aWxkIGdlb21ldHJ5XHJcblxyXG5cdFx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xyXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XHJcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcclxuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcclxuXHJcblx0XHQvLyB0aGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGN1cnJlbnQgcG9zaXRpb24gb24gdGhlIHRvcnVzIGN1cnZlXHJcblxyXG5cdFx0ZnVuY3Rpb24gY2FsY3VsYXRlUG9zaXRpb25PbkN1cnZlKCB1LCBwLCBxLCByYWRpdXMsIHBvc2l0aW9uICkge1xyXG5cclxuXHRcdFx0Y29uc3QgY3UgPSBNYXRoLmNvcyggdSApO1xyXG5cdFx0XHRjb25zdCBzdSA9IE1hdGguc2luKCB1ICk7XHJcblx0XHRcdGNvbnN0IHF1T3ZlclAgPSBxIC8gcCAqIHU7XHJcblx0XHRcdGNvbnN0IGNzID0gTWF0aC5jb3MoIHF1T3ZlclAgKTtcclxuXHJcblx0XHRcdHBvc2l0aW9uLnggPSByYWRpdXMgKiAoIDIgKyBjcyApICogMC41ICogY3U7XHJcblx0XHRcdHBvc2l0aW9uLnkgPSByYWRpdXMgKiAoIDIgKyBjcyApICogc3UgKiAwLjU7XHJcblx0XHRcdHBvc2l0aW9uLnogPSByYWRpdXMgKiBNYXRoLnNpbiggcXVPdmVyUCApICogMC41O1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0gT2JqZWN0LmFzc2lnbigge30sIHNvdXJjZS5wYXJhbWV0ZXJzICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRmFjdG9yeSBtZXRob2QgZm9yIGNyZWF0aW5nIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZnJvbSB0aGUgZ2l2ZW5cclxuXHQgKiBKU09OIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gQSBKU09OIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNlcmlhbGl6ZWQgZ2VvbWV0cnkuXHJcblx0ICogQHJldHVybiB7VG9ydXNLbm90R2VvbWV0cnl9IEEgbmV3IGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBmcm9tSlNPTiggZGF0YSApIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IFRvcnVzS25vdEdlb21ldHJ5KCBkYXRhLnJhZGl1cywgZGF0YS50dWJlLCBkYXRhLnR1YnVsYXJTZWdtZW50cywgZGF0YS5yYWRpYWxTZWdtZW50cywgZGF0YS5wLCBkYXRhLnEgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgVG9ydXNLbm90R2VvbWV0cnkgfTtcclxuIiwiaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcclxuaW1wb3J0IHsgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyQXR0cmlidXRlLmpzJztcclxuaW1wb3J0ICogYXMgQ3VydmVzIGZyb20gJy4uL2V4dHJhcy9jdXJ2ZXMvQ3VydmVzLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uL21hdGgvVmVjdG9yMi5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSB0dWJlIHRoYXQgZXh0cnVkZXMgYWxvbmcgYSAzRCBjdXJ2ZS5cclxuICpcclxuICogYGBganNcclxuICogY2xhc3MgQ3VzdG9tU2luQ3VydmUgZXh0ZW5kcyBUSFJFRS5DdXJ2ZSB7XHJcbiAqXHJcbiAqIFx0Z2V0UG9pbnQoIHQsIG9wdGlvbmFsVGFyZ2V0ID0gbmV3IFRIUkVFLlZlY3RvcjMoKSApIHtcclxuICpcclxuICogXHRcdGNvbnN0IHR4ID0gdCAqIDMgLSAxLjU7XHJcbiAqIFx0XHRjb25zdCB0eSA9IE1hdGguc2luKCAyICogTWF0aC5QSSAqIHQgKTtcclxuICogXHRcdGNvbnN0IHR6ID0gMDtcclxuICpcclxuICogXHRcdHJldHVybiBvcHRpb25hbFRhcmdldC5zZXQoIHR4LCB0eSwgdHogKTtcclxuICogXHR9XHJcbiAqXHJcbiAqIH1cclxuICpcclxuICogY29uc3QgcGF0aCA9IG5ldyBDdXN0b21TaW5DdXJ2ZSggMTAgKTtcclxuICogY29uc3QgZ2VvbWV0cnkgPSBuZXcgVEhSRUUuVHViZUdlb21ldHJ5KCBwYXRoLCAyMCwgMiwgOCwgZmFsc2UgKTtcclxuICogY29uc3QgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IDB4MDBmZjAwIH0gKTtcclxuICogY29uc3QgbWVzaCA9IG5ldyBUSFJFRS5NZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuICogc2NlbmUuYWRkKCBtZXNoICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQnVmZmVyR2VvbWV0cnlcclxuICovXHJcbmNsYXNzIFR1YmVHZW9tZXRyeSBleHRlbmRzIEJ1ZmZlckdlb21ldHJ5IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB0dWJlIGdlb21ldHJ5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtDdXJ2ZX0gW3BhdGg9UXVhZHJhdGljQmV6aWVyQ3VydmUzXSAtIEEgM0QgY3VydmUgZGVmaW5pbmcgdGhlIHBhdGggb2YgdGhlIHR1YmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt0dWJ1bGFyU2VnbWVudHM9NjRdIC0gVGhlIG51bWJlciBvZiBzZWdtZW50cyB0aGF0IG1ha2UgdXAgdGhlIHR1YmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpdXM9MV0gLVRoZSByYWRpdXMgb2YgdGhlIHR1YmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpYWxTZWdtZW50cz04XSAtIFRoZSBudW1iZXIgb2Ygc2VnbWVudHMgdGhhdCBtYWtlIHVwIHRoZSBjcm9zcy1zZWN0aW9uLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Nsb3NlZD1mYWxzZV0gLSBXaGV0aGVyIHRoZSB0dWJlIGlzIGNsb3NlZCBvciBub3QuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHBhdGggPSBuZXcgQ3VydmVzWyAnUXVhZHJhdGljQmV6aWVyQ3VydmUzJyBdKCBuZXcgVmVjdG9yMyggLSAxLCAtIDEsIDAgKSwgbmV3IFZlY3RvcjMoIC0gMSwgMSwgMCApLCBuZXcgVmVjdG9yMyggMSwgMSwgMCApICksIHR1YnVsYXJTZWdtZW50cyA9IDY0LCByYWRpdXMgPSAxLCByYWRpYWxTZWdtZW50cyA9IDgsIGNsb3NlZCA9IGZhbHNlICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ1R1YmVHZW9tZXRyeSc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb2xkcyB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVycyB0aGF0IGhhdmUgYmVlblxyXG5cdFx0ICogdXNlZCB0byBnZW5lcmF0ZSB0aGUgZ2VvbWV0cnkuIEFueSBtb2RpZmljYXRpb25cclxuXHRcdCAqIGFmdGVyIGluc3RhbnRpYXRpb24gZG9lcyBub3QgY2hhbmdlIHRoZSBnZW9tZXRyeS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBhcmFtZXRlcnMgPSB7XHJcblx0XHRcdHBhdGg6IHBhdGgsXHJcblx0XHRcdHR1YnVsYXJTZWdtZW50czogdHVidWxhclNlZ21lbnRzLFxyXG5cdFx0XHRyYWRpdXM6IHJhZGl1cyxcclxuXHRcdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxyXG5cdFx0XHRjbG9zZWQ6IGNsb3NlZFxyXG5cdFx0fTtcclxuXHJcblx0XHRjb25zdCBmcmFtZXMgPSBwYXRoLmNvbXB1dGVGcmVuZXRGcmFtZXMoIHR1YnVsYXJTZWdtZW50cywgY2xvc2VkICk7XHJcblxyXG5cdFx0Ly8gZXhwb3NlIGludGVybmFsc1xyXG5cclxuXHRcdHRoaXMudGFuZ2VudHMgPSBmcmFtZXMudGFuZ2VudHM7XHJcblx0XHR0aGlzLm5vcm1hbHMgPSBmcmFtZXMubm9ybWFscztcclxuXHRcdHRoaXMuYmlub3JtYWxzID0gZnJhbWVzLmJpbm9ybWFscztcclxuXHJcblx0XHQvLyBoZWxwZXIgdmFyaWFibGVzXHJcblxyXG5cdFx0Y29uc3QgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcclxuXHRcdGNvbnN0IG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XHJcblx0XHRjb25zdCB1diA9IG5ldyBWZWN0b3IyKCk7XHJcblx0XHRsZXQgUCA9IG5ldyBWZWN0b3IzKCk7XHJcblxyXG5cdFx0Ly8gYnVmZmVyXHJcblxyXG5cdFx0Y29uc3QgdmVydGljZXMgPSBbXTtcclxuXHRcdGNvbnN0IG5vcm1hbHMgPSBbXTtcclxuXHRcdGNvbnN0IHV2cyA9IFtdO1xyXG5cdFx0Y29uc3QgaW5kaWNlcyA9IFtdO1xyXG5cclxuXHRcdC8vIGNyZWF0ZSBidWZmZXIgZGF0YVxyXG5cclxuXHRcdGdlbmVyYXRlQnVmZmVyRGF0YSgpO1xyXG5cclxuXHRcdC8vIGJ1aWxkIGdlb21ldHJ5XHJcblxyXG5cdFx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xyXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XHJcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcclxuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcclxuXHJcblx0XHQvLyBmdW5jdGlvbnNcclxuXHJcblx0XHRmdW5jdGlvbiBnZW5lcmF0ZUJ1ZmZlckRhdGEoKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB0dWJ1bGFyU2VnbWVudHM7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGdlbmVyYXRlU2VnbWVudCggaSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gaWYgdGhlIGdlb21ldHJ5IGlzIG5vdCBjbG9zZWQsIGdlbmVyYXRlIHRoZSBsYXN0IHJvdyBvZiB2ZXJ0aWNlcyBhbmQgbm9ybWFsc1xyXG5cdFx0XHQvLyBhdCB0aGUgcmVndWxhciBwb3NpdGlvbiBvbiB0aGUgZ2l2ZW4gcGF0aFxyXG5cdFx0XHQvL1xyXG5cdFx0XHQvLyBpZiB0aGUgZ2VvbWV0cnkgaXMgY2xvc2VkLCBkdXBsaWNhdGUgdGhlIGZpcnN0IHJvdyBvZiB2ZXJ0aWNlcyBhbmQgbm9ybWFscyAodXZzIHdpbGwgZGlmZmVyKVxyXG5cclxuXHRcdFx0Z2VuZXJhdGVTZWdtZW50KCAoIGNsb3NlZCA9PT0gZmFsc2UgKSA/IHR1YnVsYXJTZWdtZW50cyA6IDAgKTtcclxuXHJcblx0XHRcdC8vIHV2cyBhcmUgZ2VuZXJhdGVkIGluIGEgc2VwYXJhdGUgZnVuY3Rpb24uXHJcblx0XHRcdC8vIHRoaXMgbWFrZXMgaXQgZWFzeSBjb21wdXRlIGNvcnJlY3QgdmFsdWVzIGZvciBjbG9zZWQgZ2VvbWV0cmllc1xyXG5cclxuXHRcdFx0Z2VuZXJhdGVVVnMoKTtcclxuXHJcblx0XHRcdC8vIGZpbmFsbHkgY3JlYXRlIGZhY2VzXHJcblxyXG5cdFx0XHRnZW5lcmF0ZUluZGljZXMoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0ZnVuY3Rpb24gZ2VuZXJhdGVTZWdtZW50KCBpICkge1xyXG5cclxuXHRcdFx0Ly8gd2UgdXNlIGdldFBvaW50QXQgdG8gc2FtcGxlIGV2ZW5seSBkaXN0cmlidXRlZCBwb2ludHMgZnJvbSB0aGUgZ2l2ZW4gcGF0aFxyXG5cclxuXHRcdFx0UCA9IHBhdGguZ2V0UG9pbnRBdCggaSAvIHR1YnVsYXJTZWdtZW50cywgUCApO1xyXG5cclxuXHRcdFx0Ly8gcmV0cmlldmUgY29ycmVzcG9uZGluZyBub3JtYWwgYW5kIGJpbm9ybWFsXHJcblxyXG5cdFx0XHRjb25zdCBOID0gZnJhbWVzLm5vcm1hbHNbIGkgXTtcclxuXHRcdFx0Y29uc3QgQiA9IGZyYW1lcy5iaW5vcm1hbHNbIGkgXTtcclxuXHJcblx0XHRcdC8vIGdlbmVyYXRlIG5vcm1hbHMgYW5kIHZlcnRpY2VzIGZvciB0aGUgY3VycmVudCBzZWdtZW50XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaiA9IDA7IGogPD0gcmFkaWFsU2VnbWVudHM7IGogKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHYgPSBqIC8gcmFkaWFsU2VnbWVudHMgKiBNYXRoLlBJICogMjtcclxuXHJcblx0XHRcdFx0Y29uc3Qgc2luID0gTWF0aC5zaW4oIHYgKTtcclxuXHRcdFx0XHRjb25zdCBjb3MgPSAtIE1hdGguY29zKCB2ICk7XHJcblxyXG5cdFx0XHRcdC8vIG5vcm1hbFxyXG5cclxuXHRcdFx0XHRub3JtYWwueCA9ICggY29zICogTi54ICsgc2luICogQi54ICk7XHJcblx0XHRcdFx0bm9ybWFsLnkgPSAoIGNvcyAqIE4ueSArIHNpbiAqIEIueSApO1xyXG5cdFx0XHRcdG5vcm1hbC56ID0gKCBjb3MgKiBOLnogKyBzaW4gKiBCLnogKTtcclxuXHRcdFx0XHRub3JtYWwubm9ybWFsaXplKCk7XHJcblxyXG5cdFx0XHRcdG5vcm1hbHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApO1xyXG5cclxuXHRcdFx0XHQvLyB2ZXJ0ZXhcclxuXHJcblx0XHRcdFx0dmVydGV4LnggPSBQLnggKyByYWRpdXMgKiBub3JtYWwueDtcclxuXHRcdFx0XHR2ZXJ0ZXgueSA9IFAueSArIHJhZGl1cyAqIG5vcm1hbC55O1xyXG5cdFx0XHRcdHZlcnRleC56ID0gUC56ICsgcmFkaXVzICogbm9ybWFsLno7XHJcblxyXG5cdFx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0ZnVuY3Rpb24gZ2VuZXJhdGVJbmRpY2VzKCkge1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGogPSAxOyBqIDw9IHR1YnVsYXJTZWdtZW50czsgaiArKyApIHtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGkgPSAxOyBpIDw9IHJhZGlhbFNlZ21lbnRzOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGEgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogKCBqIC0gMSApICsgKCBpIC0gMSApO1xyXG5cdFx0XHRcdFx0Y29uc3QgYiA9ICggcmFkaWFsU2VnbWVudHMgKyAxICkgKiBqICsgKCBpIC0gMSApO1xyXG5cdFx0XHRcdFx0Y29uc3QgYyA9ICggcmFkaWFsU2VnbWVudHMgKyAxICkgKiBqICsgaTtcclxuXHRcdFx0XHRcdGNvbnN0IGQgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogKCBqIC0gMSApICsgaTtcclxuXHJcblx0XHRcdFx0XHQvLyBmYWNlc1xyXG5cclxuXHRcdFx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgZCApO1xyXG5cdFx0XHRcdFx0aW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0ZnVuY3Rpb24gZ2VuZXJhdGVVVnMoKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPD0gdHVidWxhclNlZ21lbnRzOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaiA9IDA7IGogPD0gcmFkaWFsU2VnbWVudHM7IGogKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0dXYueCA9IGkgLyB0dWJ1bGFyU2VnbWVudHM7XHJcblx0XHRcdFx0XHR1di55ID0gaiAvIHJhZGlhbFNlZ21lbnRzO1xyXG5cclxuXHRcdFx0XHRcdHV2cy5wdXNoKCB1di54LCB1di55ICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMucGFyYW1ldGVycyA9IE9iamVjdC5hc3NpZ24oIHt9LCBzb3VyY2UucGFyYW1ldGVycyApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdHRvSlNPTigpIHtcclxuXHJcblx0XHRjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCk7XHJcblxyXG5cdFx0ZGF0YS5wYXRoID0gdGhpcy5wYXJhbWV0ZXJzLnBhdGgudG9KU09OKCk7XHJcblxyXG5cdFx0cmV0dXJuIGRhdGE7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRmFjdG9yeSBtZXRob2QgZm9yIGNyZWF0aW5nIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZnJvbSB0aGUgZ2l2ZW5cclxuXHQgKiBKU09OIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gQSBKU09OIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNlcmlhbGl6ZWQgZ2VvbWV0cnkuXHJcblx0ICogQHJldHVybiB7VHViZUdlb21ldHJ5fSBBIG5ldyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzdGF0aWMgZnJvbUpTT04oIGRhdGEgKSB7XHJcblxyXG5cdFx0Ly8gVGhpcyBvbmx5IHdvcmtzIGZvciBidWlsdC1pbiBjdXJ2ZXMgKGUuZy4gQ2F0bXVsbFJvbUN1cnZlMykuXHJcblx0XHQvLyBVc2VyIGRlZmluZWQgY3VydmVzIG9yIGluc3RhbmNlcyBvZiBDdXJ2ZVBhdGggd2lsbCBub3QgYmUgZGVzZXJpYWxpemVkLlxyXG5cdFx0cmV0dXJuIG5ldyBUdWJlR2VvbWV0cnkoXHJcblx0XHRcdG5ldyBDdXJ2ZXNbIGRhdGEucGF0aC50eXBlIF0oKS5mcm9tSlNPTiggZGF0YS5wYXRoICksXHJcblx0XHRcdGRhdGEudHVidWxhclNlZ21lbnRzLFxyXG5cdFx0XHRkYXRhLnJhZGl1cyxcclxuXHRcdFx0ZGF0YS5yYWRpYWxTZWdtZW50cyxcclxuXHRcdFx0ZGF0YS5jbG9zZWRcclxuXHRcdCk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBUdWJlR2VvbWV0cnkgfTtcclxuIiwiaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcclxuaW1wb3J0IHsgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyQXR0cmlidXRlLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcblxyXG4vKipcclxuICogQ2FuIGJlIHVzZWQgYXMgYSBoZWxwZXIgb2JqZWN0IHRvIHZpc3VhbGl6ZSBhIGdlb21ldHJ5IGFzIGEgd2lyZWZyYW1lLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBnZW9tZXRyeSA9IG5ldyBUSFJFRS5TcGhlcmVHZW9tZXRyeSgpO1xyXG4gKlxyXG4gKiBjb25zdCB3aXJlZnJhbWUgPSBuZXcgVEhSRUUuV2lyZWZyYW1lR2VvbWV0cnkoIGdlb21ldHJ5ICk7XHJcbiAqXHJcbiAqIGNvbnN0IGxpbmUgPSBuZXcgVEhSRUUuTGluZVNlZ21lbnRzKCB3aXJlZnJhbWUgKTtcclxuICogbGluZS5tYXRlcmlhbC5kZXB0aFdyaXRlID0gZmFsc2U7XHJcbiAqIGxpbmUubWF0ZXJpYWwub3BhY2l0eSA9IDAuMjU7XHJcbiAqIGxpbmUubWF0ZXJpYWwudHJhbnNwYXJlbnQgPSB0cnVlO1xyXG4gKlxyXG4gKiBzY2VuZS5hZGQoIGxpbmUgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIE5vdGU6IEl0IGlzIG5vdCB5ZXQgcG9zc2libGUgdG8gc2VyaWFsaXplL2Rlc2VyaWFsaXplIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQnVmZmVyR2VvbWV0cnlcclxuICovXHJcbmNsYXNzIFdpcmVmcmFtZUdlb21ldHJ5IGV4dGVuZHMgQnVmZmVyR2VvbWV0cnkge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHdpcmVmcmFtZSBnZW9tZXRyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7P0J1ZmZlckdlb21ldHJ5fSBbZ2VvbWV0cnk9bnVsbF0gLSBUaGUgZ2VvbWV0cnkuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGdlb21ldHJ5ID0gbnVsbCApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdXaXJlZnJhbWVHZW9tZXRyeSc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb2xkcyB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVycyB0aGF0IGhhdmUgYmVlblxyXG5cdFx0ICogdXNlZCB0byBnZW5lcmF0ZSB0aGUgZ2VvbWV0cnkuIEFueSBtb2RpZmljYXRpb25cclxuXHRcdCAqIGFmdGVyIGluc3RhbnRpYXRpb24gZG9lcyBub3QgY2hhbmdlIHRoZSBnZW9tZXRyeS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBhcmFtZXRlcnMgPSB7XHJcblx0XHRcdGdlb21ldHJ5OiBnZW9tZXRyeVxyXG5cdFx0fTtcclxuXHJcblx0XHRpZiAoIGdlb21ldHJ5ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0Ly8gYnVmZmVyXHJcblxyXG5cdFx0XHRjb25zdCB2ZXJ0aWNlcyA9IFtdO1xyXG5cdFx0XHRjb25zdCBlZGdlcyA9IG5ldyBTZXQoKTtcclxuXHJcblx0XHRcdC8vIGhlbHBlciB2YXJpYWJsZXNcclxuXHJcblx0XHRcdGNvbnN0IHN0YXJ0ID0gbmV3IFZlY3RvcjMoKTtcclxuXHRcdFx0Y29uc3QgZW5kID0gbmV3IFZlY3RvcjMoKTtcclxuXHJcblx0XHRcdGlmICggZ2VvbWV0cnkuaW5kZXggIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdC8vIGluZGV4ZWQgQnVmZmVyR2VvbWV0cnlcclxuXHJcblx0XHRcdFx0Y29uc3QgcG9zaXRpb24gPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xyXG5cdFx0XHRcdGNvbnN0IGluZGljZXMgPSBnZW9tZXRyeS5pbmRleDtcclxuXHRcdFx0XHRsZXQgZ3JvdXBzID0gZ2VvbWV0cnkuZ3JvdXBzO1xyXG5cclxuXHRcdFx0XHRpZiAoIGdyb3Vwcy5sZW5ndGggPT09IDAgKSB7XHJcblxyXG5cdFx0XHRcdFx0Z3JvdXBzID0gWyB7IHN0YXJ0OiAwLCBjb3VudDogaW5kaWNlcy5jb3VudCwgbWF0ZXJpYWxJbmRleDogMCB9IF07XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Ly8gY3JlYXRlIGEgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyBhbGwgZWRnZXMgd2l0aG91dCBkdXBsaWNhdGVzXHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBvID0gMCwgb2wgPSBncm91cHMubGVuZ3RoOyBvIDwgb2w7ICsrIG8gKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgZ3JvdXAgPSBncm91cHNbIG8gXTtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBncm91cFN0YXJ0ID0gZ3JvdXAuc3RhcnQ7XHJcblx0XHRcdFx0XHRjb25zdCBncm91cENvdW50ID0gZ3JvdXAuY291bnQ7XHJcblxyXG5cdFx0XHRcdFx0Zm9yICggbGV0IGkgPSBncm91cFN0YXJ0LCBsID0gKCBncm91cFN0YXJ0ICsgZ3JvdXBDb3VudCApOyBpIDwgbDsgaSArPSAzICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Zm9yICggbGV0IGogPSAwOyBqIDwgMzsgaiArKyApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgaW5kZXgxID0gaW5kaWNlcy5nZXRYKCBpICsgaiApO1xyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGluZGV4MiA9IGluZGljZXMuZ2V0WCggaSArICggaiArIDEgKSAlIDMgKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0c3RhcnQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIGluZGV4MSApO1xyXG5cdFx0XHRcdFx0XHRcdGVuZC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgaW5kZXgyICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmICggaXNVbmlxdWVFZGdlKCBzdGFydCwgZW5kLCBlZGdlcyApID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdHZlcnRpY2VzLnB1c2goIHN0YXJ0LngsIHN0YXJ0LnksIHN0YXJ0LnogKTtcclxuXHRcdFx0XHRcdFx0XHRcdHZlcnRpY2VzLnB1c2goIGVuZC54LCBlbmQueSwgZW5kLnogKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0Ly8gbm9uLWluZGV4ZWQgQnVmZmVyR2VvbWV0cnlcclxuXHJcblx0XHRcdFx0Y29uc3QgcG9zaXRpb24gPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSAoIHBvc2l0aW9uLmNvdW50IC8gMyApOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRmb3IgKCBsZXQgaiA9IDA7IGogPCAzOyBqICsrICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Ly8gdGhyZWUgZWRnZXMgcGVyIHRyaWFuZ2xlLCBhbiBlZGdlIGlzIHJlcHJlc2VudGVkIGFzIChpbmRleDEsIGluZGV4MilcclxuXHRcdFx0XHRcdFx0Ly8gZS5nLiB0aGUgZmlyc3QgdHJpYW5nbGUgaGFzIHRoZSBmb2xsb3dpbmcgZWRnZXM6ICgwLDEpLCgxLDIpLCgyLDApXHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCBpbmRleDEgPSAzICogaSArIGo7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGluZGV4MiA9IDMgKiBpICsgKCAoIGogKyAxICkgJSAzICk7XHJcblxyXG5cdFx0XHRcdFx0XHRzdGFydC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgaW5kZXgxICk7XHJcblx0XHRcdFx0XHRcdGVuZC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgaW5kZXgyICk7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIGlzVW5pcXVlRWRnZSggc3RhcnQsIGVuZCwgZWRnZXMgKSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0dmVydGljZXMucHVzaCggc3RhcnQueCwgc3RhcnQueSwgc3RhcnQueiApO1xyXG5cdFx0XHRcdFx0XHRcdHZlcnRpY2VzLnB1c2goIGVuZC54LCBlbmQueSwgZW5kLnogKTtcclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIGJ1aWxkIGdlb21ldHJ5XHJcblxyXG5cdFx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMucGFyYW1ldGVycyA9IE9iamVjdC5hc3NpZ24oIHt9LCBzb3VyY2UucGFyYW1ldGVycyApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBpc1VuaXF1ZUVkZ2UoIHN0YXJ0LCBlbmQsIGVkZ2VzICkge1xyXG5cclxuXHRjb25zdCBoYXNoMSA9IGAke3N0YXJ0Lnh9LCR7c3RhcnQueX0sJHtzdGFydC56fS0ke2VuZC54fSwke2VuZC55fSwke2VuZC56fWA7XHJcblx0Y29uc3QgaGFzaDIgPSBgJHtlbmQueH0sJHtlbmQueX0sJHtlbmQuen0tJHtzdGFydC54fSwke3N0YXJ0Lnl9LCR7c3RhcnQuen1gOyAvLyBjb2luY2lkZW50IGVkZ2VcclxuXHJcblx0aWYgKCBlZGdlcy5oYXMoIGhhc2gxICkgPT09IHRydWUgfHwgZWRnZXMuaGFzKCBoYXNoMiApID09PSB0cnVlICkge1xyXG5cclxuXHRcdHJldHVybiBmYWxzZTtcclxuXHJcblx0fSBlbHNlIHtcclxuXHJcblx0XHRlZGdlcy5hZGQoIGhhc2gxICk7XHJcblx0XHRlZGdlcy5hZGQoIGhhc2gyICk7XHJcblx0XHRyZXR1cm4gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCB7IFdpcmVmcmFtZUdlb21ldHJ5IH07XHJcbiIsImltcG9ydCB7IE1hdGVyaWFsIH0gZnJvbSAnLi9NYXRlcmlhbC5qcyc7XHJcbmltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vbWF0aC9Db2xvci5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBtYXRlcmlhbCBjYW4gcmVjZWl2ZSBzaGFkb3dzLCBidXQgb3RoZXJ3aXNlIGlzIGNvbXBsZXRlbHkgdHJhbnNwYXJlbnQuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGdlb21ldHJ5ID0gbmV3IFRIUkVFLlBsYW5lR2VvbWV0cnkoIDIwMDAsIDIwMDAgKTtcclxuICogZ2VvbWV0cnkucm90YXRlWCggLSBNYXRoLlBJIC8gMiApO1xyXG4gKlxyXG4gKiBjb25zdCBtYXRlcmlhbCA9IG5ldyBUSFJFRS5TaGFkb3dNYXRlcmlhbCgpO1xyXG4gKiBtYXRlcmlhbC5vcGFjaXR5ID0gMC4yO1xyXG4gKlxyXG4gKiBjb25zdCBwbGFuZSA9IG5ldyBUSFJFRS5NZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuICogcGxhbmUucG9zaXRpb24ueSA9IC0yMDA7XHJcbiAqIHBsYW5lLnJlY2VpdmVTaGFkb3cgPSB0cnVlO1xyXG4gKiBzY2VuZS5hZGQoIHBsYW5lICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTWF0ZXJpYWxcclxuICovXHJcbmNsYXNzIFNoYWRvd01hdGVyaWFsIGV4dGVuZHMgTWF0ZXJpYWwge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHNoYWRvdyBtYXRlcmlhbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1ldGVyc10gLSBBbiBvYmplY3Qgd2l0aCBvbmUgb3IgbW9yZSBwcm9wZXJ0aWVzXHJcblx0ICogZGVmaW5pbmcgdGhlIG1hdGVyaWFsJ3MgYXBwZWFyYW5jZS4gQW55IHByb3BlcnR5IG9mIHRoZSBtYXRlcmlhbFxyXG5cdCAqIChpbmNsdWRpbmcgYW55IHByb3BlcnR5IGZyb20gaW5oZXJpdGVkIG1hdGVyaWFscykgY2FuIGJlIHBhc3NlZFxyXG5cdCAqIGluIGhlcmUuIENvbG9yIHZhbHVlcyBjYW4gYmUgcGFzc2VkIGFueSB0eXBlIG9mIHZhbHVlIGFjY2VwdGVkXHJcblx0ICogYnkge0BsaW5rIENvbG9yI3NldH0uXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHBhcmFtZXRlcnMgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNTaGFkb3dNYXRlcmlhbCA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ1NoYWRvd01hdGVyaWFsJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENvbG9yIG9mIHRoZSBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Q29sb3J9XHJcblx0XHQgKiBAZGVmYXVsdCAoMCwwLDApXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4MDAwMDAwICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBPdmVyd3JpdHRlbiBzaW5jZSBzaGFkb3cgbWF0ZXJpYWxzIGFyZSB0cmFuc3BhcmVudFxyXG5cdFx0ICogYnkgZGVmYXVsdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50cmFuc3BhcmVudCA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSBtYXRlcmlhbCBpcyBhZmZlY3RlZCBieSBmb2cgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZvZyA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcclxuXHJcblx0XHR0aGlzLmZvZyA9IHNvdXJjZS5mb2c7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFNoYWRvd01hdGVyaWFsIH07XHJcbiIsImltcG9ydCB7IFNoYWRlck1hdGVyaWFsIH0gZnJvbSAnLi9TaGFkZXJNYXRlcmlhbC5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBjbGFzcyB3b3JrcyBqdXN0IGxpa2Uge0BsaW5rIFNoYWRlck1hdGVyaWFsfSwgZXhjZXB0IHRoYXQgZGVmaW5pdGlvbnNcclxuICogb2YgYnVpbHQtaW4gdW5pZm9ybXMgYW5kIGF0dHJpYnV0ZXMgYXJlIG5vdCBhdXRvbWF0aWNhbGx5IHByZXBlbmRlZCB0byB0aGVcclxuICogR0xTTCBzaGFkZXIgY29kZS5cclxuICpcclxuICogYFJhd1NoYWRlck1hdGVyaWFsYCBjYW4gb25seSBiZSB1c2VkIHdpdGgge0BsaW5rIFdlYkdMUmVuZGVyZXJ9LlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgU2hhZGVyTWF0ZXJpYWxcclxuICovXHJcbmNsYXNzIFJhd1NoYWRlck1hdGVyaWFsIGV4dGVuZHMgU2hhZGVyTWF0ZXJpYWwge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHJhdyBzaGFkZXIgbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtZXRlcnNdIC0gQW4gb2JqZWN0IHdpdGggb25lIG9yIG1vcmUgcHJvcGVydGllc1xyXG5cdCAqIGRlZmluaW5nIHRoZSBtYXRlcmlhbCdzIGFwcGVhcmFuY2UuIEFueSBwcm9wZXJ0eSBvZiB0aGUgbWF0ZXJpYWxcclxuXHQgKiAoaW5jbHVkaW5nIGFueSBwcm9wZXJ0eSBmcm9tIGluaGVyaXRlZCBtYXRlcmlhbHMpIGNhbiBiZSBwYXNzZWRcclxuXHQgKiBpbiBoZXJlLiBDb2xvciB2YWx1ZXMgY2FuIGJlIHBhc3NlZCBhbnkgdHlwZSBvZiB2YWx1ZSBhY2NlcHRlZFxyXG5cdCAqIGJ5IHtAbGluayBDb2xvciNzZXR9LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwYXJhbWV0ZXJzICkge1xyXG5cclxuXHRcdHN1cGVyKCBwYXJhbWV0ZXJzICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzUmF3U2hhZGVyTWF0ZXJpYWwgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdSYXdTaGFkZXJNYXRlcmlhbCc7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFJhd1NoYWRlck1hdGVyaWFsIH07XHJcbiIsImltcG9ydCB7IFRhbmdlbnRTcGFjZU5vcm1hbE1hcCB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IE1hdGVyaWFsIH0gZnJvbSAnLi9NYXRlcmlhbC5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjIuanMnO1xyXG5pbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uL21hdGgvQ29sb3IuanMnO1xyXG5pbXBvcnQgeyBFdWxlciB9IGZyb20gJy4uL21hdGgvRXVsZXIuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgc3RhbmRhcmQgcGh5c2ljYWxseSBiYXNlZCBtYXRlcmlhbCwgdXNpbmcgTWV0YWxsaWMtUm91Z2huZXNzIHdvcmtmbG93LlxyXG4gKlxyXG4gKiBQaHlzaWNhbGx5IGJhc2VkIHJlbmRlcmluZyAoUEJSKSBoYXMgcmVjZW50bHkgYmVjb21lIHRoZSBzdGFuZGFyZCBpbiBtYW55XHJcbiAqIDNEIGFwcGxpY2F0aW9ucywgc3VjaCBhcyBbVW5pdHlde0BsaW5rIGh0dHBzOi8vYmxvZ3MudW5pdHkzZC5jb20vMjAxNC8xMC8yOS9waHlzaWNhbGx5LWJhc2VkLXNoYWRpbmctaW4tdW5pdHktNS1hLXByaW1lci99LFxyXG4gKiBbVW5yZWFsXXtAbGluayBodHRwczovL2RvY3MudW5yZWFsZW5naW5lLmNvbS9sYXRlc3QvSU5UL0VuZ2luZS9SZW5kZXJpbmcvTWF0ZXJpYWxzL1BoeXNpY2FsbHlCYXNlZC99IGFuZFxyXG4gKiBbM0QgU3R1ZGlvIE1heF17QGxpbmsgaHR0cDovL2FyZWEuYXV0b2Rlc2suY29tL2Jsb2dzL3RoZS0zZHMtbWF4LWJsb2cvd2hhdDAzOXMtbmV3LWZvci1yZW5kZXJpbmctaW4tM2RzLW1heC0yMDE3fS5cclxuICpcclxuICogVGhpcyBhcHByb2FjaCBkaWZmZXJzIGZyb20gb2xkZXIgYXBwcm9hY2hlcyBpbiB0aGF0IGluc3RlYWQgb2YgdXNpbmdcclxuICogYXBwcm94aW1hdGlvbnMgZm9yIHRoZSB3YXkgaW4gd2hpY2ggbGlnaHQgaW50ZXJhY3RzIHdpdGggYSBzdXJmYWNlLCBhXHJcbiAqIHBoeXNpY2FsbHkgY29ycmVjdCBtb2RlbCBpcyB1c2VkLiBUaGUgaWRlYSBpcyB0aGF0LCBpbnN0ZWFkIG9mIHR3ZWFraW5nXHJcbiAqIG1hdGVyaWFscyB0byBsb29rIGdvb2QgdW5kZXIgc3BlY2lmaWMgbGlnaHRpbmcsIGEgbWF0ZXJpYWwgY2FuIGJlIGNyZWF0ZWRcclxuICogdGhhdCB3aWxsIHJlYWN0ICdjb3JyZWN0bHknIHVuZGVyIGFsbCBsaWdodGluZyBzY2VuYXJpb3MuXHJcbiAqXHJcbiAqIEluIHByYWN0aWNlIHRoaXMgZ2l2ZXMgYSBtb3JlIGFjY3VyYXRlIGFuZCByZWFsaXN0aWMgbG9va2luZyByZXN1bHQgdGhhblxyXG4gKiB0aGUge0BsaW5rIE1lc2hMYW1iZXJ0TWF0ZXJpYWx9IG9yIHtAbGluayBNZXNoUGhvbmdNYXRlcmlhbH0sIGF0IHRoZSBjb3N0IG9mXHJcbiAqIGJlaW5nIHNvbWV3aGF0IG1vcmUgY29tcHV0YXRpb25hbGx5IGV4cGVuc2l2ZS4gYE1lc2hTdGFuZGFyZE1hdGVyaWFsYCB1c2VzIHBlci1mcmFnbWVudFxyXG4gKiBzaGFkaW5nLlxyXG4gKlxyXG4gKiBOb3RlIHRoYXQgZm9yIGJlc3QgcmVzdWx0cyB5b3Ugc2hvdWxkIGFsd2F5cyBzcGVjaWZ5IGFuIGVudmlyb25tZW50IG1hcCB3aGVuIHVzaW5nIHRoaXMgbWF0ZXJpYWwuXHJcbiAqXHJcbiAqIEZvciBhIG5vbi10ZWNobmljYWwgaW50cm9kdWN0aW9uIHRvIHRoZSBjb25jZXB0IG9mIFBCUiBhbmQgaG93IHRvIHNldCB1cCBhXHJcbiAqIFBCUiBtYXRlcmlhbCwgY2hlY2sgb3V0IHRoZXNlIGFydGljbGVzIGJ5IHRoZSBwZW9wbGUgYXQgW21hcm1vc2V0XXtAbGluayBodHRwczovL3d3dy5tYXJtb3NldC5jb306XHJcbiAqXHJcbiAqIC0gW0Jhc2ljIFRoZW9yeSBvZiBQaHlzaWNhbGx5IEJhc2VkIFJlbmRlcmluZ117QGxpbmsgaHR0cHM6Ly93d3cubWFybW9zZXQuY28vcG9zdHMvYmFzaWMtdGhlb3J5LW9mLXBoeXNpY2FsbHktYmFzZWQtcmVuZGVyaW5nL31cclxuICogLSBbUGh5c2ljYWxseSBCYXNlZCBSZW5kZXJpbmcgYW5kIFlvdSBDYW4gVG9vXXtAbGluayBodHRwczovL3d3dy5tYXJtb3NldC5jby9wb3N0cy9waHlzaWNhbGx5LWJhc2VkLXJlbmRlcmluZy1hbmQteW91LWNhbi10b28vfVxyXG4gKlxyXG4gKiBUZWNobmljYWwgZGV0YWlscyBvZiB0aGUgYXBwcm9hY2ggdXNlZCBpbiB0aHJlZS5qcyAoYW5kIG1vc3Qgb3RoZXIgUEJSIHN5c3RlbXMpIGNhbiBiZSBmb3VuZCBpcyB0aGlzXHJcbiAqIFtwYXBlciBmcm9tIERpc25leV17QGxpbmsgaHR0cHM6Ly9tZWRpYS5kaXNuZXlhbmltYXRpb24uY29tL3VwbG9hZHMvcHJvZHVjdGlvbi9wdWJsaWNhdGlvbl9hc3NldC80OC9hc3NldC9zMjAxMl9wYnNfZGlzbmV5X2JyZGZfbm90ZXNfdjMucGRmfVxyXG4gKiAocGRmKSwgYnkgQnJlbnQgQnVybGV5LlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTWF0ZXJpYWxcclxuICovXHJcbmNsYXNzIE1lc2hTdGFuZGFyZE1hdGVyaWFsIGV4dGVuZHMgTWF0ZXJpYWwge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG1lc2ggc3RhbmRhcmQgbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtZXRlcnNdIC0gQW4gb2JqZWN0IHdpdGggb25lIG9yIG1vcmUgcHJvcGVydGllc1xyXG5cdCAqIGRlZmluaW5nIHRoZSBtYXRlcmlhbCdzIGFwcGVhcmFuY2UuIEFueSBwcm9wZXJ0eSBvZiB0aGUgbWF0ZXJpYWxcclxuXHQgKiAoaW5jbHVkaW5nIGFueSBwcm9wZXJ0eSBmcm9tIGluaGVyaXRlZCBtYXRlcmlhbHMpIGNhbiBiZSBwYXNzZWRcclxuXHQgKiBpbiBoZXJlLiBDb2xvciB2YWx1ZXMgY2FuIGJlIHBhc3NlZCBhbnkgdHlwZSBvZiB2YWx1ZSBhY2NlcHRlZFxyXG5cdCAqIGJ5IHtAbGluayBDb2xvciNzZXR9LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwYXJhbWV0ZXJzICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdNZXNoU3RhbmRhcmRNYXRlcmlhbCc7XHJcblxyXG5cdFx0dGhpcy5kZWZpbmVzID0geyAnU1RBTkRBUkQnOiAnJyB9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQ29sb3Igb2YgdGhlIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtDb2xvcn1cclxuXHRcdCAqIEBkZWZhdWx0ICgxLDEsMSlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTsgLy8gZGlmZnVzZVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG93IHJvdWdoIHRoZSBtYXRlcmlhbCBhcHBlYXJzLiBgMC4wYCBtZWFucyBhIHNtb290aCBtaXJyb3IgcmVmbGVjdGlvbiwgYDEuMGBcclxuXHRcdCAqIG1lYW5zIGZ1bGx5IGRpZmZ1c2UuIElmIGByb3VnaG5lc3NNYXBgIGlzIGFsc28gcHJvdmlkZWQsXHJcblx0XHQgKiBib3RoIHZhbHVlcyBhcmUgbXVsdGlwbGllZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJvdWdobmVzcyA9IDEuMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvdyBtdWNoIHRoZSBtYXRlcmlhbCBpcyBsaWtlIGEgbWV0YWwuIE5vbi1tZXRhbGxpYyBtYXRlcmlhbHMgc3VjaCBhcyB3b29kXHJcblx0XHQgKiBvciBzdG9uZSB1c2UgYDAuMGAsIG1ldGFsbGljIHVzZSBgMS4wYCwgd2l0aCBub3RoaW5nICh1c3VhbGx5KSBpbiBiZXR3ZWVuLlxyXG5cdFx0ICogQSB2YWx1ZSBiZXR3ZWVuIGAwLjBgIGFuZCBgMS4wYCBjb3VsZCBiZSB1c2VkIGZvciBhIHJ1c3R5IG1ldGFsIGxvb2suXHJcblx0XHQgKiBJZiBgbWV0YWxuZXNzTWFwYCBpcyBhbHNvIHByb3ZpZGVkLCBib3RoIHZhbHVlcyBhcmUgbXVsdGlwbGllZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1ldGFsbmVzcyA9IDAuMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjb2xvciBtYXAuIE1heSBvcHRpb25hbGx5IGluY2x1ZGUgYW4gYWxwaGEgY2hhbm5lbCwgdHlwaWNhbGx5IGNvbWJpbmVkXHJcblx0XHQgKiB3aXRoIHtAbGluayBNYXRlcmlhbCN0cmFuc3BhcmVudH0gb3Ige0BsaW5rIE1hdGVyaWFsI2FscGhhVGVzdH0uIFRoZSB0ZXh0dXJlIG1hcFxyXG5cdFx0ICogY29sb3IgaXMgbW9kdWxhdGVkIGJ5IHRoZSBkaWZmdXNlIGBjb2xvcmAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbGlnaHQgbWFwLiBSZXF1aXJlcyBhIHNlY29uZCBzZXQgb2YgVVZzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5saWdodE1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBJbnRlbnNpdHkgb2YgdGhlIGJha2VkIGxpZ2h0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSAxLjA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcmVkIGNoYW5uZWwgb2YgdGhpcyB0ZXh0dXJlIGlzIHVzZWQgYXMgdGhlIGFtYmllbnQgb2NjbHVzaW9uIG1hcC5cclxuXHRcdCAqIFJlcXVpcmVzIGEgc2Vjb25kIHNldCBvZiBVVnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFvTWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEludGVuc2l0eSBvZiB0aGUgYW1iaWVudCBvY2NsdXNpb24gZWZmZWN0LiBSYW5nZSBpcyBgWzAsMV1gLCB3aGVyZSBgMGBcclxuXHRcdCAqIGRpc2FibGVzIGFtYmllbnQgb2NjbHVzaW9uLiBXaGVyZSBpbnRlbnNpdHkgaXMgYDFgIGFuZCB0aGUgQU8gbWFwJ3NcclxuXHRcdCAqIHJlZCBjaGFubmVsIGlzIGFsc28gYDFgLCBhbWJpZW50IGxpZ2h0IGlzIGZ1bGx5IG9jY2x1ZGVkIG9uIGEgc3VyZmFjZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gMS4wO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRW1pc3NpdmUgKGxpZ2h0KSBjb2xvciBvZiB0aGUgbWF0ZXJpYWwsIGVzc2VudGlhbGx5IGEgc29saWQgY29sb3JcclxuXHRcdCAqIHVuYWZmZWN0ZWQgYnkgb3RoZXIgbGlnaHRpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0NvbG9yfVxyXG5cdFx0ICogQGRlZmF1bHQgKDAsMCwwKVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmVtaXNzaXZlID0gbmV3IENvbG9yKCAweDAwMDAwMCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSW50ZW5zaXR5IG9mIHRoZSBlbWlzc2l2ZSBsaWdodC4gTW9kdWxhdGVzIHRoZSBlbWlzc2l2ZSBjb2xvci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ID0gMS4wO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU2V0IGVtaXNzaXZlIChnbG93KSBtYXAuIFRoZSBlbWlzc2l2ZSBtYXAgY29sb3IgaXMgbW9kdWxhdGVkIGJ5IHRoZVxyXG5cdFx0ICogZW1pc3NpdmUgY29sb3IgYW5kIHRoZSBlbWlzc2l2ZSBpbnRlbnNpdHkuIElmIHlvdSBoYXZlIGFuIGVtaXNzaXZlIG1hcCxcclxuXHRcdCAqIGJlIHN1cmUgdG8gc2V0IHRoZSBlbWlzc2l2ZSBjb2xvciB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiBibGFjay5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZW1pc3NpdmVNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHRleHR1cmUgdG8gY3JlYXRlIGEgYnVtcCBtYXAuIFRoZSBibGFjayBhbmQgd2hpdGUgdmFsdWVzIG1hcCB0byB0aGVcclxuXHRcdCAqIHBlcmNlaXZlZCBkZXB0aCBpbiByZWxhdGlvbiB0byB0aGUgbGlnaHRzLiBCdW1wIGRvZXNuJ3QgYWN0dWFsbHkgYWZmZWN0XHJcblx0XHQgKiB0aGUgZ2VvbWV0cnkgb2YgdGhlIG9iamVjdCwgb25seSB0aGUgbGlnaHRpbmcuIElmIGEgbm9ybWFsIG1hcCBpcyBkZWZpbmVkXHJcblx0XHQgKiB0aGlzIHdpbGwgYmUgaWdub3JlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYnVtcE1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3cgbXVjaCB0aGUgYnVtcCBtYXAgYWZmZWN0cyB0aGUgbWF0ZXJpYWwuIFR5cGljYWwgcmFuZ2UgaXMgYFswLDFdYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJ1bXBTY2FsZSA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdGV4dHVyZSB0byBjcmVhdGUgYSBub3JtYWwgbWFwLiBUaGUgUkdCIHZhbHVlcyBhZmZlY3QgdGhlIHN1cmZhY2VcclxuXHRcdCAqIG5vcm1hbCBmb3IgZWFjaCBwaXhlbCBmcmFnbWVudCBhbmQgY2hhbmdlIHRoZSB3YXkgdGhlIGNvbG9yIGlzIGxpdC4gTm9ybWFsXHJcblx0XHQgKiBtYXBzIGRvIG5vdCBjaGFuZ2UgdGhlIGFjdHVhbCBzaGFwZSBvZiB0aGUgc3VyZmFjZSwgb25seSB0aGUgbGlnaHRpbmcuIEluXHJcblx0XHQgKiBjYXNlIHRoZSBtYXRlcmlhbCBoYXMgYSBub3JtYWwgbWFwIGF1dGhvcmVkIHVzaW5nIHRoZSBsZWZ0IGhhbmRlZFxyXG5cdFx0ICogY29udmVudGlvbiwgdGhlIGB5YCBjb21wb25lbnQgb2YgYG5vcm1hbFNjYWxlYCBzaG91bGQgYmUgbmVnYXRlZCB0byBjb21wZW5zYXRlXHJcblx0XHQgKiBmb3IgdGhlIGRpZmZlcmVudCBoYW5kZWRuZXNzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub3JtYWxNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHR5cGUgb2Ygbm9ybWFsIG1hcC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KFRhbmdlbnRTcGFjZU5vcm1hbE1hcHxPYmplY3RTcGFjZU5vcm1hbE1hcCl9XHJcblx0XHQgKiBAZGVmYXVsdCBUYW5nZW50U3BhY2VOb3JtYWxNYXBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub3JtYWxNYXBUeXBlID0gVGFuZ2VudFNwYWNlTm9ybWFsTWFwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG93IG11Y2ggdGhlIG5vcm1hbCBtYXAgYWZmZWN0cyB0aGUgbWF0ZXJpYWwuIFR5cGljYWwgdmFsdWUgcmFuZ2UgaXMgYFswLDFdYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yMn1cclxuXHRcdCAqIEBkZWZhdWx0ICgxLDEpXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMiggMSwgMSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGRpc3BsYWNlbWVudCBtYXAgYWZmZWN0cyB0aGUgcG9zaXRpb24gb2YgdGhlIG1lc2gncyB2ZXJ0aWNlcy4gVW5saWtlXHJcblx0XHQgKiBvdGhlciBtYXBzIHdoaWNoIG9ubHkgYWZmZWN0IHRoZSBsaWdodCBhbmQgc2hhZGUgb2YgdGhlIG1hdGVyaWFsIHRoZVxyXG5cdFx0ICogZGlzcGxhY2VkIHZlcnRpY2VzIGNhbiBjYXN0IHNoYWRvd3MsIGJsb2NrIG90aGVyIG9iamVjdHMsIGFuZCBvdGhlcndpc2VcclxuXHRcdCAqIGFjdCBhcyByZWFsIGdlb21ldHJ5LiBUaGUgZGlzcGxhY2VtZW50IHRleHR1cmUgaXMgYW4gaW1hZ2Ugd2hlcmUgdGhlIHZhbHVlXHJcblx0XHQgKiBvZiBlYWNoIHBpeGVsICh3aGl0ZSBiZWluZyB0aGUgaGlnaGVzdCkgaXMgbWFwcGVkIGFnYWluc3QsIGFuZFxyXG5cdFx0ICogcmVwb3NpdGlvbnMsIHRoZSB2ZXJ0aWNlcyBvZiB0aGUgbWVzaC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvdyBtdWNoIHRoZSBkaXNwbGFjZW1lbnQgbWFwIGFmZmVjdHMgdGhlIG1lc2ggKHdoZXJlIGJsYWNrIGlzIG5vXHJcblx0XHQgKiBkaXNwbGFjZW1lbnQsIGFuZCB3aGl0ZSBpcyBtYXhpbXVtIGRpc3BsYWNlbWVudCkuIFdpdGhvdXQgYSBkaXNwbGFjZW1lbnRcclxuXHRcdCAqIG1hcCBzZXQsIHRoaXMgdmFsdWUgaXMgbm90IGFwcGxpZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgb2Zmc2V0IG9mIHRoZSBkaXNwbGFjZW1lbnQgbWFwJ3MgdmFsdWVzIG9uIHRoZSBtZXNoJ3MgdmVydGljZXMuXHJcblx0XHQgKiBUaGUgYmlhcyBpcyBhZGRlZCB0byB0aGUgc2NhbGVkIHNhbXBsZSBvZiB0aGUgZGlzcGxhY2VtZW50IG1hcC5cclxuXHRcdCAqIFdpdGhvdXQgYSBkaXNwbGFjZW1lbnQgbWFwIHNldCwgdGhpcyB2YWx1ZSBpcyBub3QgYXBwbGllZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGdyZWVuIGNoYW5uZWwgb2YgdGhpcyB0ZXh0dXJlIGlzIHVzZWQgdG8gYWx0ZXIgdGhlIHJvdWdobmVzcyBvZiB0aGVcclxuXHRcdCAqIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yb3VnaG5lc3NNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGJsdWUgY2hhbm5lbCBvZiB0aGlzIHRleHR1cmUgaXMgdXNlZCB0byBhbHRlciB0aGUgbWV0YWxuZXNzIG9mIHRoZVxyXG5cdFx0ICogbWF0ZXJpYWwuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1ldGFsbmVzc01hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYWxwaGEgbWFwIGlzIGEgZ3JheXNjYWxlIHRleHR1cmUgdGhhdCBjb250cm9scyB0aGUgb3BhY2l0eSBhY3Jvc3MgdGhlXHJcblx0XHQgKiBzdXJmYWNlIChibGFjazogZnVsbHkgdHJhbnNwYXJlbnQ7IHdoaXRlOiBmdWxseSBvcGFxdWUpLlxyXG5cdFx0ICpcclxuXHRcdCAqIE9ubHkgdGhlIGNvbG9yIG9mIHRoZSB0ZXh0dXJlIGlzIHVzZWQsIGlnbm9yaW5nIHRoZSBhbHBoYSBjaGFubmVsIGlmIG9uZVxyXG5cdFx0ICogZXhpc3RzLiBGb3IgUkdCIGFuZCBSR0JBIHRleHR1cmVzLCB0aGUgcmVuZGVyZXIgd2lsbCB1c2UgdGhlIGdyZWVuIGNoYW5uZWxcclxuXHRcdCAqIHdoZW4gc2FtcGxpbmcgdGhpcyB0ZXh0dXJlIGR1ZSB0byB0aGUgZXh0cmEgYml0IG9mIHByZWNpc2lvbiBwcm92aWRlZCBmb3JcclxuXHRcdCAqIGdyZWVuIGluIERYVC1jb21wcmVzc2VkIGFuZCB1bmNvbXByZXNzZWQgUkdCIDU2NSBmb3JtYXRzLiBMdW1pbmFuY2Utb25seSBhbmRcclxuXHRcdCAqIGx1bWluYW5jZS9hbHBoYSB0ZXh0dXJlcyB3aWxsIGFsc28gc3RpbGwgd29yayBhcyBleHBlY3RlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYWxwaGFNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGVudmlyb25tZW50IG1hcC4gVG8gZW5zdXJlIGEgcGh5c2ljYWxseSBjb3JyZWN0IHJlbmRlcmluZywgZW52aXJvbm1lbnQgbWFwc1xyXG5cdFx0ICogYXJlIGludGVybmFsbHkgcHJlLXByb2Nlc3NlZCB3aXRoIHtAbGluayBQTVJFTUdlbmVyYXRvcn0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmVudk1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcm90YXRpb24gb2YgdGhlIGVudmlyb25tZW50IG1hcCBpbiByYWRpYW5zLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtFdWxlcn1cclxuXHRcdCAqIEBkZWZhdWx0ICgwLDAsMClcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5lbnZNYXBSb3RhdGlvbiA9IG5ldyBFdWxlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU2NhbGVzIHRoZSBlZmZlY3Qgb2YgdGhlIGVudmlyb25tZW50IG1hcCBieSBtdWx0aXBseWluZyBpdHMgY29sb3IuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5lbnZNYXBJbnRlbnNpdHkgPSAxLjA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZW5kZXJzIHRoZSBnZW9tZXRyeSBhcyBhIHdpcmVmcmFtZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMud2lyZWZyYW1lID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDb250cm9scyB0aGUgdGhpY2tuZXNzIG9mIHRoZSB3aXJlZnJhbWUuXHJcblx0XHQgKlxyXG5cdFx0ICogQ2FuIG9ubHkgYmUgdXNlZCB3aXRoIHtAbGluayBTVkdSZW5kZXJlcn0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyBhcHBlYXJhbmNlIG9mIHdpcmVmcmFtZSBlbmRzLlxyXG5cdFx0ICpcclxuXHRcdCAqIENhbiBvbmx5IGJlIHVzZWQgd2l0aCB7QGxpbmsgU1ZHUmVuZGVyZXJ9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoJ3JvdW5kJ3wnYmV2ZWwnfCdtaXRlcicpfVxyXG5cdFx0ICogQGRlZmF1bHQgJ3JvdW5kJ1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSAncm91bmQnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyBhcHBlYXJhbmNlIG9mIHdpcmVmcmFtZSBqb2ludHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQ2FuIG9ubHkgYmUgdXNlZCB3aXRoIHtAbGluayBTVkdSZW5kZXJlcn0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeygncm91bmQnfCdiZXZlbCd8J21pdGVyJyl9XHJcblx0XHQgKiBAZGVmYXVsdCAncm91bmQnXHJcblx0XHQgKi9cclxuXHRcdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSAncm91bmQnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgbWF0ZXJpYWwgaXMgcmVuZGVyZWQgd2l0aCBmbGF0IHNoYWRpbmcgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5mbGF0U2hhZGluZyA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgbWF0ZXJpYWwgaXMgYWZmZWN0ZWQgYnkgZm9nIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5mb2cgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMuZGVmaW5lcyA9IHsgJ1NUQU5EQVJEJzogJycgfTtcclxuXHJcblx0XHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xyXG5cdFx0dGhpcy5yb3VnaG5lc3MgPSBzb3VyY2Uucm91Z2huZXNzO1xyXG5cdFx0dGhpcy5tZXRhbG5lc3MgPSBzb3VyY2UubWV0YWxuZXNzO1xyXG5cclxuXHRcdHRoaXMubWFwID0gc291cmNlLm1hcDtcclxuXHJcblx0XHR0aGlzLmxpZ2h0TWFwID0gc291cmNlLmxpZ2h0TWFwO1xyXG5cdFx0dGhpcy5saWdodE1hcEludGVuc2l0eSA9IHNvdXJjZS5saWdodE1hcEludGVuc2l0eTtcclxuXHJcblx0XHR0aGlzLmFvTWFwID0gc291cmNlLmFvTWFwO1xyXG5cdFx0dGhpcy5hb01hcEludGVuc2l0eSA9IHNvdXJjZS5hb01hcEludGVuc2l0eTtcclxuXHJcblx0XHR0aGlzLmVtaXNzaXZlLmNvcHkoIHNvdXJjZS5lbWlzc2l2ZSApO1xyXG5cdFx0dGhpcy5lbWlzc2l2ZU1hcCA9IHNvdXJjZS5lbWlzc2l2ZU1hcDtcclxuXHRcdHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgPSBzb3VyY2UuZW1pc3NpdmVJbnRlbnNpdHk7XHJcblxyXG5cdFx0dGhpcy5idW1wTWFwID0gc291cmNlLmJ1bXBNYXA7XHJcblx0XHR0aGlzLmJ1bXBTY2FsZSA9IHNvdXJjZS5idW1wU2NhbGU7XHJcblxyXG5cdFx0dGhpcy5ub3JtYWxNYXAgPSBzb3VyY2Uubm9ybWFsTWFwO1xyXG5cdFx0dGhpcy5ub3JtYWxNYXBUeXBlID0gc291cmNlLm5vcm1hbE1hcFR5cGU7XHJcblx0XHR0aGlzLm5vcm1hbFNjYWxlLmNvcHkoIHNvdXJjZS5ub3JtYWxTY2FsZSApO1xyXG5cclxuXHRcdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gc291cmNlLmRpc3BsYWNlbWVudE1hcDtcclxuXHRcdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSBzb3VyY2UuZGlzcGxhY2VtZW50U2NhbGU7XHJcblx0XHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSBzb3VyY2UuZGlzcGxhY2VtZW50QmlhcztcclxuXHJcblx0XHR0aGlzLnJvdWdobmVzc01hcCA9IHNvdXJjZS5yb3VnaG5lc3NNYXA7XHJcblxyXG5cdFx0dGhpcy5tZXRhbG5lc3NNYXAgPSBzb3VyY2UubWV0YWxuZXNzTWFwO1xyXG5cclxuXHRcdHRoaXMuYWxwaGFNYXAgPSBzb3VyY2UuYWxwaGFNYXA7XHJcblxyXG5cdFx0dGhpcy5lbnZNYXAgPSBzb3VyY2UuZW52TWFwO1xyXG5cdFx0dGhpcy5lbnZNYXBSb3RhdGlvbi5jb3B5KCBzb3VyY2UuZW52TWFwUm90YXRpb24gKTtcclxuXHRcdHRoaXMuZW52TWFwSW50ZW5zaXR5ID0gc291cmNlLmVudk1hcEludGVuc2l0eTtcclxuXHJcblx0XHR0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7XHJcblx0XHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7XHJcblx0XHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSBzb3VyY2Uud2lyZWZyYW1lTGluZWNhcDtcclxuXHRcdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSBzb3VyY2Uud2lyZWZyYW1lTGluZWpvaW47XHJcblxyXG5cdFx0dGhpcy5mbGF0U2hhZGluZyA9IHNvdXJjZS5mbGF0U2hhZGluZztcclxuXHJcblx0XHR0aGlzLmZvZyA9IHNvdXJjZS5mb2c7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IE1lc2hTdGFuZGFyZE1hdGVyaWFsIH07XHJcbiIsImltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjIuanMnO1xyXG5pbXBvcnQgeyBNZXNoU3RhbmRhcmRNYXRlcmlhbCB9IGZyb20gJy4vTWVzaFN0YW5kYXJkTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uL21hdGgvQ29sb3IuanMnO1xyXG5pbXBvcnQgeyBjbGFtcCB9IGZyb20gJy4uL21hdGgvTWF0aFV0aWxzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBbiBleHRlbnNpb24gb2YgdGhlIHtAbGluayBNZXNoU3RhbmRhcmRNYXRlcmlhbH0sIHByb3ZpZGluZyBtb3JlIGFkdmFuY2VkXHJcbiAqIHBoeXNpY2FsbHktYmFzZWQgcmVuZGVyaW5nIHByb3BlcnRpZXM6XHJcbiAqXHJcbiAqIC0gQW5pc290cm9weTogQWJpbGl0eSB0byByZXByZXNlbnQgdGhlIGFuaXNvdHJvcGljIHByb3BlcnR5IG9mIG1hdGVyaWFsc1xyXG4gKiBhcyBvYnNlcnZhYmxlIHdpdGggYnJ1c2hlZCBtZXRhbHMuXHJcbiAqIC0gQ2xlYXJjb2F0OiBTb21lIG1hdGVyaWFscyDigJQgbGlrZSBjYXIgcGFpbnRzLCBjYXJib24gZmliZXIsIGFuZCB3ZXQgc3VyZmFjZXMg4oCUIHJlcXVpcmVcclxuICogYSBjbGVhciwgcmVmbGVjdGl2ZSBsYXllciBvbiB0b3Agb2YgYW5vdGhlciBsYXllciB0aGF0IG1heSBiZSBpcnJlZ3VsYXIgb3Igcm91Z2guXHJcbiAqIENsZWFyY29hdCBhcHByb3hpbWF0ZXMgdGhpcyBlZmZlY3QsIHdpdGhvdXQgdGhlIG5lZWQgZm9yIGEgc2VwYXJhdGUgdHJhbnNwYXJlbnQgc3VyZmFjZS5cclxuICogLSBJcmlkZXNjZW5jZTogQWxsb3dzIHRvIHJlbmRlciB0aGUgZWZmZWN0IHdoZXJlIGh1ZSB2YXJpZXMgIGRlcGVuZGluZyBvbiB0aGUgdmlld2luZ1xyXG4gKiBhbmdsZSBhbmQgaWxsdW1pbmF0aW9uIGFuZ2xlLiBUaGlzIGNhbiBiZSBzZWVuIG9uIHNvYXAgYnViYmxlcywgb2lsIGZpbG1zLCBvciBvbiB0aGVcclxuICogd2luZ3Mgb2YgbWFueSBpbnNlY3RzLlxyXG4gKiAtIFBoeXNpY2FsbHktYmFzZWQgdHJhbnNwYXJlbmN5OiBPbmUgbGltaXRhdGlvbiBvZiB7QGxpbmsgTWF0ZXJpYWwjb3BhY2l0eX0gaXMgdGhhdCBoaWdobHlcclxuICogdHJhbnNwYXJlbnQgbWF0ZXJpYWxzIGFyZSBsZXNzIHJlZmxlY3RpdmUuIFBoeXNpY2FsbHktYmFzZWQgdHJhbnNtaXNzaW9uIHByb3ZpZGVzIGEgbW9yZVxyXG4gKiByZWFsaXN0aWMgb3B0aW9uIGZvciB0aGluLCB0cmFuc3BhcmVudCBzdXJmYWNlcyBsaWtlIGdsYXNzLlxyXG4gKiAtIEFkdmFuY2VkIHJlZmxlY3Rpdml0eTogTW9yZSBmbGV4aWJsZSByZWZsZWN0aXZpdHkgZm9yIG5vbi1tZXRhbGxpYyBtYXRlcmlhbHMuXHJcbiAqIC0gU2hlZW46IENhbiBiZSB1c2VkIGZvciByZXByZXNlbnRpbmcgY2xvdGggYW5kIGZhYnJpYyBtYXRlcmlhbHMuXHJcbiAqXHJcbiAqIEFzIGEgcmVzdWx0IG9mIHRoZXNlIGNvbXBsZXggc2hhZGluZyBmZWF0dXJlcywgYE1lc2hQaHlzaWNhbE1hdGVyaWFsYCBoYXMgYVxyXG4gKiBoaWdoZXIgcGVyZm9ybWFuY2UgY29zdCwgcGVyIHBpeGVsLCB0aGFuIG90aGVyIHRocmVlLmpzIG1hdGVyaWFscy4gTW9zdFxyXG4gKiBlZmZlY3RzIGFyZSBkaXNhYmxlZCBieSBkZWZhdWx0LCBhbmQgYWRkIGNvc3QgYXMgdGhleSBhcmUgZW5hYmxlZC4gRm9yXHJcbiAqIGJlc3QgcmVzdWx0cywgYWx3YXlzIHNwZWNpZnkgYW4gZW52aXJvbm1lbnQgbWFwIHdoZW4gdXNpbmcgdGhpcyBtYXRlcmlhbC5cclxuICpcclxuICogQGF1Z21lbnRzIE1lc2hTdGFuZGFyZE1hdGVyaWFsXHJcbiAqL1xyXG5jbGFzcyBNZXNoUGh5c2ljYWxNYXRlcmlhbCBleHRlbmRzIE1lc2hTdGFuZGFyZE1hdGVyaWFsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBtZXNoIHBoeXNpY2FsIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbWV0ZXJzXSAtIEFuIG9iamVjdCB3aXRoIG9uZSBvciBtb3JlIHByb3BlcnRpZXNcclxuXHQgKiBkZWZpbmluZyB0aGUgbWF0ZXJpYWwncyBhcHBlYXJhbmNlLiBBbnkgcHJvcGVydHkgb2YgdGhlIG1hdGVyaWFsXHJcblx0ICogKGluY2x1ZGluZyBhbnkgcHJvcGVydHkgZnJvbSBpbmhlcml0ZWQgbWF0ZXJpYWxzKSBjYW4gYmUgcGFzc2VkXHJcblx0ICogaW4gaGVyZS4gQ29sb3IgdmFsdWVzIGNhbiBiZSBwYXNzZWQgYW55IHR5cGUgb2YgdmFsdWUgYWNjZXB0ZWRcclxuXHQgKiBieSB7QGxpbmsgQ29sb3Ijc2V0fS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVycyApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc01lc2hQaHlzaWNhbE1hdGVyaWFsID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLmRlZmluZXMgPSB7XHJcblxyXG5cdFx0XHQnU1RBTkRBUkQnOiAnJyxcclxuXHRcdFx0J1BIWVNJQ0FMJzogJydcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdNZXNoUGh5c2ljYWxNYXRlcmlhbCc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcm90YXRpb24gb2YgdGhlIGFuaXNvdHJvcHkgaW4gdGFuZ2VudCwgYml0YW5nZW50IHNwYWNlLCBtZWFzdXJlZCBpbiByYWRpYW5zXHJcblx0XHQgKiBjb3VudGVyLWNsb2Nrd2lzZSBmcm9tIHRoZSB0YW5nZW50LiBXaGVuIGBhbmlzb3Ryb3B5TWFwYCBpcyBwcmVzZW50LCB0aGlzXHJcblx0XHQgKiBwcm9wZXJ0eSBwcm92aWRlcyBhZGRpdGlvbmFsIHJvdGF0aW9uIHRvIHRoZSB2ZWN0b3JzIGluIHRoZSB0ZXh0dXJlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYW5pc290cm9weVJvdGF0aW9uID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlZCBhbmQgZ3JlZW4gY2hhbm5lbHMgcmVwcmVzZW50IHRoZSBhbmlzb3Ryb3B5IGRpcmVjdGlvbiBpbiBgWy0xLCAxXWAgdGFuZ2VudCxcclxuXHRcdCAqIGJpdGFuZ2VudCBzcGFjZSwgdG8gYmUgcm90YXRlZCBieSBgYW5pc290cm9weVJvdGF0aW9uYC4gVGhlIGJsdWUgY2hhbm5lbFxyXG5cdFx0ICogY29udGFpbnMgc3RyZW5ndGggYXMgYFswLCAxXWAgdG8gYmUgbXVsdGlwbGllZCBieSBgYW5pc290cm9weWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFuaXNvdHJvcHlNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJlZCBjaGFubmVsIG9mIHRoaXMgdGV4dHVyZSBpcyBtdWx0aXBsaWVkIGFnYWluc3QgYGNsZWFyY29hdGAsXHJcblx0XHQgKiBmb3IgcGVyLXBpeGVsIGNvbnRyb2wgb3ZlciBhIGNvYXRpbmcncyBpbnRlbnNpdHkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNsZWFyY29hdE1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSb3VnaG5lc3Mgb2YgdGhlIGNsZWFyIGNvYXQgbGF5ZXIsIGZyb20gYDAuMGAgdG8gYDEuMGAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3MgPSAwLjA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZ3JlZW4gY2hhbm5lbCBvZiB0aGlzIHRleHR1cmUgaXMgbXVsdGlwbGllZCBhZ2FpbnN0XHJcblx0XHQgKiBgY2xlYXJjb2F0Um91Z2huZXNzYCwgZm9yIHBlci1waXhlbCBjb250cm9sIG92ZXIgYSBjb2F0aW5nJ3Mgcm91Z2huZXNzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3NNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG93IG11Y2ggYGNsZWFyY29hdE5vcm1hbE1hcGAgYWZmZWN0cyB0aGUgY2xlYXIgY29hdCBsYXllciwgZnJvbVxyXG5cdFx0ICogYCgwLDApYCB0byBgKDEsMSlgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3IyfVxyXG5cdFx0ICogQGRlZmF1bHQgKDEsMSlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jbGVhcmNvYXROb3JtYWxTY2FsZSA9IG5ldyBWZWN0b3IyKCAxLCAxICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDYW4gYmUgdXNlZCB0byBlbmFibGUgaW5kZXBlbmRlbnQgbm9ybWFscyBmb3IgdGhlIGNsZWFyIGNvYXQgbGF5ZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNsZWFyY29hdE5vcm1hbE1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBJbmRleC1vZi1yZWZyYWN0aW9uIGZvciBub24tbWV0YWxsaWMgbWF0ZXJpYWxzLCBmcm9tIGAxLjBgIHRvIGAyLjMzM2AuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDEuNVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlvciA9IDEuNTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZ3JlZSBvZiByZWZsZWN0aXZpdHksIGZyb20gYDAuMGAgdG8gYDEuMGAuIERlZmF1bHQgaXMgYDAuNWAsIHdoaWNoXHJcblx0XHQgKiBjb3JyZXNwb25kcyB0byBhbiBpbmRleC1vZi1yZWZyYWN0aW9uIG9mIGAxLjVgLlxyXG5cdFx0ICpcclxuXHRcdCAqIFRoaXMgbW9kZWxzIHRoZSByZWZsZWN0aXZpdHkgb2Ygbm9uLW1ldGFsbGljIG1hdGVyaWFscy4gSXQgaGFzIG5vIGVmZmVjdFxyXG5cdFx0ICogd2hlbiBgbWV0YWxuZXNzYCBpcyBgMS4wYFxyXG5cdFx0ICpcclxuXHRcdCAqIEBuYW1lIE1lc2hQaHlzaWNhbE1hdGVyaWFsI3JlZmxlY3Rpdml0eVxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDAuNVxyXG5cdFx0ICovXHJcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsICdyZWZsZWN0aXZpdHknLCB7XHJcblx0XHRcdGdldDogZnVuY3Rpb24gKCkge1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gKCBjbGFtcCggMi41ICogKCB0aGlzLmlvciAtIDEgKSAvICggdGhpcy5pb3IgKyAxICksIDAsIDEgKSApO1xyXG5cclxuXHRcdFx0fSxcclxuXHRcdFx0c2V0OiBmdW5jdGlvbiAoIHJlZmxlY3Rpdml0eSApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5pb3IgPSAoIDEgKyAwLjQgKiByZWZsZWN0aXZpdHkgKSAvICggMSAtIDAuNCAqIHJlZmxlY3Rpdml0eSApO1xyXG5cclxuXHRcdFx0fVxyXG5cdFx0fSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJlZCBjaGFubmVsIG9mIHRoaXMgdGV4dHVyZSBpcyBtdWx0aXBsaWVkIGFnYWluc3QgYGlyaWRlc2NlbmNlYCwgZm9yIHBlci1waXhlbFxyXG5cdFx0ICogY29udHJvbCBvdmVyIGlyaWRlc2NlbmNlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pcmlkZXNjZW5jZU1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTdHJlbmd0aCBvZiB0aGUgaXJpZGVzY2VuY2UgUkdCIGNvbG9yIHNoaWZ0IGVmZmVjdCwgcmVwcmVzZW50ZWQgYnkgYW4gaW5kZXgtb2YtcmVmcmFjdGlvbi5cclxuXHRcdCAqIEJldHdlZW4gYDEuMGAgdG8gYDIuMzMzYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMS4zXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXJpZGVzY2VuY2VJT1IgPSAxLjM7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKkFycmF5IG9mIGV4YWN0bHkgMiBlbGVtZW50cywgc3BlY2lmeWluZyBtaW5pbXVtIGFuZCBtYXhpbXVtIHRoaWNrbmVzcyBvZiB0aGUgaXJpZGVzY2VuY2UgbGF5ZXIuXHJcblx0XHQgVGhpY2tuZXNzIG9mIGlyaWRlc2NlbmNlIGxheWVyIGhhcyBhbiBlcXVpdmFsZW50IGVmZmVjdCBvZiB0aGUgb25lIGB0aGlja25lc3NgIGhhcyBvbiBgaW9yYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8bnVtYmVyLG51bWJlcj59XHJcblx0XHQgKiBAZGVmYXVsdCBbMTAwLDQwMF1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlID0gWyAxMDAsIDQwMCBdO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSB0ZXh0dXJlIHRoYXQgZGVmaW5lcyB0aGUgdGhpY2tuZXNzIG9mIHRoZSBpcmlkZXNjZW5jZSBsYXllciwgc3RvcmVkIGluIHRoZSBncmVlbiBjaGFubmVsLlxyXG5cdFx0ICogTWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgb2YgdGhpY2tuZXNzIGFyZSBkZWZpbmVkIGJ5IGBpcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlYCBhcnJheTpcclxuXHRcdCAqIC0gYDAuMGAgaW4gdGhlIGdyZWVuIGNoYW5uZWwgd2lsbCByZXN1bHQgaW4gdGhpY2tuZXNzIGVxdWFsIHRvIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGFycmF5LlxyXG5cdFx0ICogLSBgMS4wYCBpbiB0aGUgZ3JlZW4gY2hhbm5lbCB3aWxsIHJlc3VsdCBpbiB0aGlja25lc3MgZXF1YWwgdG8gc2Vjb25kIGVsZW1lbnQgb2YgdGhlIGFycmF5LlxyXG5cdFx0ICogLSBWYWx1ZXMgaW4tYmV0d2VlbiB3aWxsIGxpbmVhcmx5IGludGVycG9sYXRlIGJldHdlZW4gdGhlIGVsZW1lbnRzIG9mIHRoZSBhcnJheS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHNoZWVuIHRpbnQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0NvbG9yfVxyXG5cdFx0ICogQGRlZmF1bHQgKDAsMCwwKVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNoZWVuQ29sb3IgPSBuZXcgQ29sb3IoIDB4MDAwMDAwICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgUkdCIGNoYW5uZWxzIG9mIHRoaXMgdGV4dHVyZSBhcmUgbXVsdGlwbGllZCBhZ2FpbnN0ICBgc2hlZW5Db2xvcmAsIGZvciBwZXItcGl4ZWwgY29udHJvbFxyXG5cdFx0ICogb3ZlciBzaGVlbiB0aW50LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zaGVlbkNvbG9yTWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJvdWdobmVzcyBvZiB0aGUgc2hlZW4gbGF5ZXIsIGZyb20gYDAuMGAgdG8gYDEuMGAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zaGVlblJvdWdobmVzcyA9IDEuMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBhbHBoYSBjaGFubmVsIG9mIHRoaXMgdGV4dHVyZSBpcyBtdWx0aXBsaWVkIGFnYWluc3QgYHNoZWVuUm91Z2huZXNzYCwgZm9yIHBlci1waXhlbCBjb250cm9sXHJcblx0XHQgKiBvdmVyIHNoZWVuIHJvdWdobmVzcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2hlZW5Sb3VnaG5lc3NNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJlZCBjaGFubmVsIG9mIHRoaXMgdGV4dHVyZSBpcyBtdWx0aXBsaWVkIGFnYWluc3QgYHRyYW5zbWlzc2lvbmAsIGZvciBwZXItcGl4ZWwgY29udHJvbCBvdmVyXHJcblx0XHQgKiBvcHRpY2FsIHRyYW5zcGFyZW5jeS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudHJhbnNtaXNzaW9uTWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB0aGlja25lc3Mgb2YgdGhlIHZvbHVtZSBiZW5lYXRoIHRoZSBzdXJmYWNlLiBUaGUgdmFsdWUgaXMgZ2l2ZW4gaW4gdGhlXHJcblx0XHQgKiBjb29yZGluYXRlIHNwYWNlIG9mIHRoZSBtZXNoLiBJZiB0aGUgdmFsdWUgaXMgYDBgIHRoZSBtYXRlcmlhbCBpc1xyXG5cdFx0ICogdGhpbi13YWxsZWQuIE90aGVyd2lzZSB0aGUgbWF0ZXJpYWwgaXMgYSB2b2x1bWUgYm91bmRhcnkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50aGlja25lc3MgPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSB0ZXh0dXJlIHRoYXQgZGVmaW5lcyB0aGUgdGhpY2tuZXNzLCBzdG9yZWQgaW4gdGhlIGdyZWVuIGNoYW5uZWwuIFRoaXMgd2lsbFxyXG5cdFx0ICogYmUgbXVsdGlwbGllZCBieSBgdGhpY2tuZXNzYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudGhpY2tuZXNzTWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlbnNpdHkgb2YgdGhlIG1lZGl1bSBnaXZlbiBhcyB0aGUgYXZlcmFnZSBkaXN0YW5jZSB0aGF0IGxpZ2h0IHRyYXZlbHMgaW5cclxuXHRcdCAqIHRoZSBtZWRpdW0gYmVmb3JlIGludGVyYWN0aW5nIHdpdGggYSBwYXJ0aWNsZS4gVGhlIHZhbHVlIGlzIGdpdmVuIGluIHdvcmxkXHJcblx0XHQgKiBzcGFjZSB1bml0cywgYW5kIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IEluZmluaXR5XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYXR0ZW51YXRpb25EaXN0YW5jZSA9IEluZmluaXR5O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNvbG9yIHRoYXQgd2hpdGUgbGlnaHQgdHVybnMgaW50byBkdWUgdG8gYWJzb3JwdGlvbiB3aGVuIHJlYWNoaW5nIHRoZVxyXG5cdFx0ICogYXR0ZW51YXRpb24gZGlzdGFuY2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0NvbG9yfVxyXG5cdFx0ICogQGRlZmF1bHQgKDEsMSwxKVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmF0dGVudWF0aW9uQ29sb3IgPSBuZXcgQ29sb3IoIDEsIDEsIDEgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgZmxvYXQgdGhhdCBzY2FsZXMgdGhlIGFtb3VudCBvZiBzcGVjdWxhciByZWZsZWN0aW9uIGZvciBub24tbWV0YWxzIG9ubHkuXHJcblx0XHQgKiBXaGVuIHNldCB0byB6ZXJvLCB0aGUgbW9kZWwgaXMgZWZmZWN0aXZlbHkgTGFtYmVydGlhbi4gRnJvbSBgMC4wYCB0byBgMS4wYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNwZWN1bGFySW50ZW5zaXR5ID0gMS4wO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGFscGhhIGNoYW5uZWwgb2YgdGhpcyB0ZXh0dXJlIGlzIG11bHRpcGxpZWQgYWdhaW5zdCBgc3BlY3VsYXJJbnRlbnNpdHlgLFxyXG5cdFx0ICogZm9yIHBlci1waXhlbCBjb250cm9sIG92ZXIgc3BlY3VsYXIgaW50ZW5zaXR5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zcGVjdWxhckludGVuc2l0eU1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaW50cyB0aGUgc3BlY3VsYXIgcmVmbGVjdGlvbiBhdCBub3JtYWwgaW5jaWRlbmNlIGZvciBub24tbWV0YWxzIG9ubHkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0NvbG9yfVxyXG5cdFx0ICogQGRlZmF1bHQgKDEsMSwxKVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNwZWN1bGFyQ29sb3IgPSBuZXcgQ29sb3IoIDEsIDEsIDEgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBSR0IgY2hhbm5lbHMgb2YgdGhpcyB0ZXh0dXJlIGFyZSBtdWx0aXBsaWVkIGFnYWluc3QgYHNwZWN1bGFyQ29sb3JgLFxyXG5cdFx0ICogZm9yIHBlci1waXhlbCBjb250cm9sIG92ZXIgc3BlY3VsYXIgY29sb3IuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNwZWN1bGFyQ29sb3JNYXAgPSBudWxsO1xyXG5cclxuXHRcdHRoaXMuX2FuaXNvdHJvcHkgPSAwO1xyXG5cdFx0dGhpcy5fY2xlYXJjb2F0ID0gMDtcclxuXHRcdHRoaXMuX2Rpc3BlcnNpb24gPSAwO1xyXG5cdFx0dGhpcy5faXJpZGVzY2VuY2UgPSAwO1xyXG5cdFx0dGhpcy5fc2hlZW4gPSAwLjA7XHJcblx0XHR0aGlzLl90cmFuc21pc3Npb24gPSAwO1xyXG5cclxuXHRcdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGFuaXNvdHJvcHkgc3RyZW5ndGguXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdCAqIEBkZWZhdWx0IDBcclxuXHQgKi9cclxuXHRnZXQgYW5pc290cm9weSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fYW5pc290cm9weTtcclxuXHJcblx0fVxyXG5cclxuXHRzZXQgYW5pc290cm9weSggdmFsdWUgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9hbmlzb3Ryb3B5ID4gMCAhPT0gdmFsdWUgPiAwICkge1xyXG5cclxuXHRcdFx0dGhpcy52ZXJzaW9uICsrO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLl9hbmlzb3Ryb3B5ID0gdmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVwcmVzZW50cyB0aGUgaW50ZW5zaXR5IG9mIHRoZSBjbGVhciBjb2F0IGxheWVyLCBmcm9tIGAwLjBgIHRvIGAxLjBgLiBVc2VcclxuXHQgKiBjbGVhciBjb2F0IHJlbGF0ZWQgcHJvcGVydGllcyB0byBlbmFibGUgbXVsdGlsYXllciBtYXRlcmlhbHMgdGhhdCBoYXZlIGFcclxuXHQgKiB0aGluIHRyYW5zbHVjZW50IGxheWVyIG92ZXIgdGhlIGJhc2UgbGF5ZXIuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdCAqIEBkZWZhdWx0IDBcclxuXHQgKi9cclxuXHRnZXQgY2xlYXJjb2F0KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9jbGVhcmNvYXQ7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0IGNsZWFyY29hdCggdmFsdWUgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9jbGVhcmNvYXQgPiAwICE9PSB2YWx1ZSA+IDAgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnZlcnNpb24gKys7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuX2NsZWFyY29hdCA9IHZhbHVlO1xyXG5cclxuXHR9XHJcblx0LyoqXHJcblx0ICogVGhlIGludGVuc2l0eSBvZiB0aGUgaXJpZGVzY2VuY2UgbGF5ZXIsIHNpbXVsYXRpbmcgUkdCIGNvbG9yIHNoaWZ0IGJhc2VkIG9uIHRoZSBhbmdsZSBiZXR3ZWVuXHJcblx0ICogdGhlIHN1cmZhY2UgYW5kIHRoZSB2aWV3ZXIsIGZyb20gYDAuMGAgdG8gYDEuMGAuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdCAqIEBkZWZhdWx0IDBcclxuXHQgKi9cclxuXHRnZXQgaXJpZGVzY2VuY2UoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX2lyaWRlc2NlbmNlO1xyXG5cclxuXHR9XHJcblxyXG5cdHNldCBpcmlkZXNjZW5jZSggdmFsdWUgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9pcmlkZXNjZW5jZSA+IDAgIT09IHZhbHVlID4gMCApIHtcclxuXHJcblx0XHRcdHRoaXMudmVyc2lvbiArKztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5faXJpZGVzY2VuY2UgPSB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWZpbmVzIHRoZSBzdHJlbmd0aCBvZiB0aGUgYW5ndWxhciBzZXBhcmF0aW9uIG9mIGNvbG9ycyAoY2hyb21hdGljIGFiZXJyYXRpb24pIHRyYW5zbWl0dGluZ1xyXG5cdCAqIHRocm91Z2ggYSByZWxhdGl2ZWx5IGNsZWFyIHZvbHVtZS4gQW55IHZhbHVlIHplcm8gb3IgbGFyZ2VyIGlzIHZhbGlkLCB0aGUgdHlwaWNhbCByYW5nZSBvZlxyXG5cdCAqIHJlYWxpc3RpYyB2YWx1ZXMgaXMgYFswLCAxXWAuIFRoaXMgcHJvcGVydHkgY2FuIGJlIG9ubHkgYmUgdXNlZCB3aXRoIHRyYW5zbWlzc2l2ZSBvYmplY3RzLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge251bWJlcn1cclxuXHQgKiBAZGVmYXVsdCAwXHJcblx0ICovXHJcblx0Z2V0IGRpc3BlcnNpb24oKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX2Rpc3BlcnNpb247XHJcblxyXG5cdH1cclxuXHJcblx0c2V0IGRpc3BlcnNpb24oIHZhbHVlICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5fZGlzcGVyc2lvbiA+IDAgIT09IHZhbHVlID4gMCApIHtcclxuXHJcblx0XHRcdHRoaXMudmVyc2lvbiArKztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5fZGlzcGVyc2lvbiA9IHZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBpbnRlbnNpdHkgb2YgdGhlIHNoZWVuIGxheWVyLCBmcm9tIGAwLjBgIHRvIGAxLjBgLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge251bWJlcn1cclxuXHQgKiBAZGVmYXVsdCAwXHJcblx0ICovXHJcblx0Z2V0IHNoZWVuKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9zaGVlbjtcclxuXHJcblx0fVxyXG5cclxuXHRzZXQgc2hlZW4oIHZhbHVlICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5fc2hlZW4gPiAwICE9PSB2YWx1ZSA+IDAgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnZlcnNpb24gKys7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuX3NoZWVuID0gdmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVncmVlIG9mIHRyYW5zbWlzc2lvbiAob3Igb3B0aWNhbCB0cmFuc3BhcmVuY3kpLCBmcm9tIGAwLjBgIHRvIGAxLjBgLlxyXG5cdCAqXHJcblx0ICogVGhpbiwgdHJhbnNwYXJlbnQgb3Igc2VtaXRyYW5zcGFyZW50LCBwbGFzdGljIG9yIGdsYXNzIG1hdGVyaWFscyByZW1haW5cclxuXHQgKiBsYXJnZWx5IHJlZmxlY3RpdmUgZXZlbiBpZiB0aGV5IGFyZSBmdWxseSB0cmFuc21pc3NpdmUuIFRoZSB0cmFuc21pc3Npb25cclxuXHQgKiBwcm9wZXJ0eSBjYW4gYmUgdXNlZCB0byBtb2RlbCB0aGVzZSBtYXRlcmlhbHMuXHJcblx0ICpcclxuXHQgKiBXaGVuIHRyYW5zbWlzc2lvbiBpcyBub24temVybywgYG9wYWNpdHlgIHNob3VsZCBiZSAgc2V0IHRvIGAxYC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0ICogQGRlZmF1bHQgMFxyXG5cdCAqL1xyXG5cdGdldCB0cmFuc21pc3Npb24oKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX3RyYW5zbWlzc2lvbjtcclxuXHJcblx0fVxyXG5cclxuXHRzZXQgdHJhbnNtaXNzaW9uKCB2YWx1ZSApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuX3RyYW5zbWlzc2lvbiA+IDAgIT09IHZhbHVlID4gMCApIHtcclxuXHJcblx0XHRcdHRoaXMudmVyc2lvbiArKztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5fdHJhbnNtaXNzaW9uID0gdmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMuZGVmaW5lcyA9IHtcclxuXHJcblx0XHRcdCdTVEFOREFSRCc6ICcnLFxyXG5cdFx0XHQnUEhZU0lDQUwnOiAnJ1xyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0dGhpcy5hbmlzb3Ryb3B5ID0gc291cmNlLmFuaXNvdHJvcHk7XHJcblx0XHR0aGlzLmFuaXNvdHJvcHlSb3RhdGlvbiA9IHNvdXJjZS5hbmlzb3Ryb3B5Um90YXRpb247XHJcblx0XHR0aGlzLmFuaXNvdHJvcHlNYXAgPSBzb3VyY2UuYW5pc290cm9weU1hcDtcclxuXHJcblx0XHR0aGlzLmNsZWFyY29hdCA9IHNvdXJjZS5jbGVhcmNvYXQ7XHJcblx0XHR0aGlzLmNsZWFyY29hdE1hcCA9IHNvdXJjZS5jbGVhcmNvYXRNYXA7XHJcblx0XHR0aGlzLmNsZWFyY29hdFJvdWdobmVzcyA9IHNvdXJjZS5jbGVhcmNvYXRSb3VnaG5lc3M7XHJcblx0XHR0aGlzLmNsZWFyY29hdFJvdWdobmVzc01hcCA9IHNvdXJjZS5jbGVhcmNvYXRSb3VnaG5lc3NNYXA7XHJcblx0XHR0aGlzLmNsZWFyY29hdE5vcm1hbE1hcCA9IHNvdXJjZS5jbGVhcmNvYXROb3JtYWxNYXA7XHJcblx0XHR0aGlzLmNsZWFyY29hdE5vcm1hbFNjYWxlLmNvcHkoIHNvdXJjZS5jbGVhcmNvYXROb3JtYWxTY2FsZSApO1xyXG5cclxuXHRcdHRoaXMuZGlzcGVyc2lvbiA9IHNvdXJjZS5kaXNwZXJzaW9uO1xyXG5cdFx0dGhpcy5pb3IgPSBzb3VyY2UuaW9yO1xyXG5cclxuXHRcdHRoaXMuaXJpZGVzY2VuY2UgPSBzb3VyY2UuaXJpZGVzY2VuY2U7XHJcblx0XHR0aGlzLmlyaWRlc2NlbmNlTWFwID0gc291cmNlLmlyaWRlc2NlbmNlTWFwO1xyXG5cdFx0dGhpcy5pcmlkZXNjZW5jZUlPUiA9IHNvdXJjZS5pcmlkZXNjZW5jZUlPUjtcclxuXHRcdHRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZSA9IFsgLi4uc291cmNlLmlyaWRlc2NlbmNlVGhpY2tuZXNzUmFuZ2UgXTtcclxuXHRcdHRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAgPSBzb3VyY2UuaXJpZGVzY2VuY2VUaGlja25lc3NNYXA7XHJcblxyXG5cdFx0dGhpcy5zaGVlbiA9IHNvdXJjZS5zaGVlbjtcclxuXHRcdHRoaXMuc2hlZW5Db2xvci5jb3B5KCBzb3VyY2Uuc2hlZW5Db2xvciApO1xyXG5cdFx0dGhpcy5zaGVlbkNvbG9yTWFwID0gc291cmNlLnNoZWVuQ29sb3JNYXA7XHJcblx0XHR0aGlzLnNoZWVuUm91Z2huZXNzID0gc291cmNlLnNoZWVuUm91Z2huZXNzO1xyXG5cdFx0dGhpcy5zaGVlblJvdWdobmVzc01hcCA9IHNvdXJjZS5zaGVlblJvdWdobmVzc01hcDtcclxuXHJcblx0XHR0aGlzLnRyYW5zbWlzc2lvbiA9IHNvdXJjZS50cmFuc21pc3Npb247XHJcblx0XHR0aGlzLnRyYW5zbWlzc2lvbk1hcCA9IHNvdXJjZS50cmFuc21pc3Npb25NYXA7XHJcblxyXG5cdFx0dGhpcy50aGlja25lc3MgPSBzb3VyY2UudGhpY2tuZXNzO1xyXG5cdFx0dGhpcy50aGlja25lc3NNYXAgPSBzb3VyY2UudGhpY2tuZXNzTWFwO1xyXG5cdFx0dGhpcy5hdHRlbnVhdGlvbkRpc3RhbmNlID0gc291cmNlLmF0dGVudWF0aW9uRGlzdGFuY2U7XHJcblx0XHR0aGlzLmF0dGVudWF0aW9uQ29sb3IuY29weSggc291cmNlLmF0dGVudWF0aW9uQ29sb3IgKTtcclxuXHJcblx0XHR0aGlzLnNwZWN1bGFySW50ZW5zaXR5ID0gc291cmNlLnNwZWN1bGFySW50ZW5zaXR5O1xyXG5cdFx0dGhpcy5zcGVjdWxhckludGVuc2l0eU1hcCA9IHNvdXJjZS5zcGVjdWxhckludGVuc2l0eU1hcDtcclxuXHRcdHRoaXMuc3BlY3VsYXJDb2xvci5jb3B5KCBzb3VyY2Uuc3BlY3VsYXJDb2xvciApO1xyXG5cdFx0dGhpcy5zcGVjdWxhckNvbG9yTWFwID0gc291cmNlLnNwZWN1bGFyQ29sb3JNYXA7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IE1lc2hQaHlzaWNhbE1hdGVyaWFsIH07XHJcbiIsImltcG9ydCB7IE11bHRpcGx5T3BlcmF0aW9uLCBUYW5nZW50U3BhY2VOb3JtYWxNYXAgfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBNYXRlcmlhbCB9IGZyb20gJy4vTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IyLmpzJztcclxuaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi9tYXRoL0NvbG9yLmpzJztcclxuaW1wb3J0IHsgRXVsZXIgfSBmcm9tICcuLi9tYXRoL0V1bGVyLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIG1hdGVyaWFsIGZvciBzaGlueSBzdXJmYWNlcyB3aXRoIHNwZWN1bGFyIGhpZ2hsaWdodHMuXHJcbiAqXHJcbiAqIFRoZSBtYXRlcmlhbCB1c2VzIGEgbm9uLXBoeXNpY2FsbHkgYmFzZWQgW0JsaW5uLVBob25nXXtAbGluayBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CbGlubi1QaG9uZ19zaGFkaW5nX21vZGVsfVxyXG4gKiBtb2RlbCBmb3IgY2FsY3VsYXRpbmcgcmVmbGVjdGFuY2UuIFVubGlrZSB0aGUgTGFtYmVydGlhbiBtb2RlbCB1c2VkIGluIHRoZVxyXG4gKiB7QGxpbmsgTWVzaExhbWJlcnRNYXRlcmlhbH0gdGhpcyBjYW4gc2ltdWxhdGUgc2hpbnkgc3VyZmFjZXMgd2l0aCBzcGVjdWxhclxyXG4gKiBoaWdobGlnaHRzIChzdWNoIGFzIHZhcm5pc2hlZCB3b29kKS4gYE1lc2hQaG9uZ01hdGVyaWFsYCB1c2VzIHBlci1mcmFnbWVudCBzaGFkaW5nLlxyXG4gKlxyXG4gKiBQZXJmb3JtYW5jZSB3aWxsIGdlbmVyYWxseSBiZSBncmVhdGVyIHdoZW4gdXNpbmcgdGhpcyBtYXRlcmlhbCBvdmVyIHRoZVxyXG4gKiB7QGxpbmsgTWVzaFN0YW5kYXJkTWF0ZXJpYWx9IG9yIHtAbGluayBNZXNoUGh5c2ljYWxNYXRlcmlhbH0sIGF0IHRoZSBjb3N0IG9mXHJcbiAqIHNvbWUgZ3JhcGhpY2FsIGFjY3VyYWN5LlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTWF0ZXJpYWxcclxuICovXHJcbmNsYXNzIE1lc2hQaG9uZ01hdGVyaWFsIGV4dGVuZHMgTWF0ZXJpYWwge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG1lc2ggcGhvbmcgbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtZXRlcnNdIC0gQW4gb2JqZWN0IHdpdGggb25lIG9yIG1vcmUgcHJvcGVydGllc1xyXG5cdCAqIGRlZmluaW5nIHRoZSBtYXRlcmlhbCdzIGFwcGVhcmFuY2UuIEFueSBwcm9wZXJ0eSBvZiB0aGUgbWF0ZXJpYWxcclxuXHQgKiAoaW5jbHVkaW5nIGFueSBwcm9wZXJ0eSBmcm9tIGluaGVyaXRlZCBtYXRlcmlhbHMpIGNhbiBiZSBwYXNzZWRcclxuXHQgKiBpbiBoZXJlLiBDb2xvciB2YWx1ZXMgY2FuIGJlIHBhc3NlZCBhbnkgdHlwZSBvZiB2YWx1ZSBhY2NlcHRlZFxyXG5cdCAqIGJ5IHtAbGluayBDb2xvciNzZXR9LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwYXJhbWV0ZXJzICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzTWVzaFBob25nTWF0ZXJpYWwgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdNZXNoUGhvbmdNYXRlcmlhbCc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDb2xvciBvZiB0aGUgbWF0ZXJpYWwuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0NvbG9yfVxyXG5cdFx0ICogQGRlZmF1bHQgKDEsMSwxKVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCAweGZmZmZmZiApOyAvLyBkaWZmdXNlXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTcGVjdWxhciBjb2xvciBvZiB0aGUgbWF0ZXJpYWwuIFRoZSBkZWZhdWx0IGNvbG9yIGlzIHNldCB0byBgMHgxMTExMTFgICh2ZXJ5IGRhcmsgZ3JleSlcclxuXHRcdCAqXHJcblx0XHQgKiBUaGlzIGRlZmluZXMgaG93IHNoaW55IHRoZSBtYXRlcmlhbCBpcyBhbmQgdGhlIGNvbG9yIG9mIGl0cyBzaGluZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Q29sb3J9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc3BlY3VsYXIgPSBuZXcgQ29sb3IoIDB4MTExMTExICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3cgc2hpbnkgdGhlIHNwZWN1bGFyIGhpZ2hsaWdodCBpczsgYSBoaWdoZXIgdmFsdWUgZ2l2ZXMgYSBzaGFycGVyIGhpZ2hsaWdodC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMzBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zaGluaW5lc3MgPSAzMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjb2xvciBtYXAuIE1heSBvcHRpb25hbGx5IGluY2x1ZGUgYW4gYWxwaGEgY2hhbm5lbCwgdHlwaWNhbGx5IGNvbWJpbmVkXHJcblx0XHQgKiB3aXRoIHtAbGluayBNYXRlcmlhbCN0cmFuc3BhcmVudH0gb3Ige0BsaW5rIE1hdGVyaWFsI2FscGhhVGVzdH0uIFRoZSB0ZXh0dXJlIG1hcFxyXG5cdFx0ICogY29sb3IgaXMgbW9kdWxhdGVkIGJ5IHRoZSBkaWZmdXNlIGBjb2xvcmAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbGlnaHQgbWFwLiBSZXF1aXJlcyBhIHNlY29uZCBzZXQgb2YgVVZzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5saWdodE1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBJbnRlbnNpdHkgb2YgdGhlIGJha2VkIGxpZ2h0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSAxLjA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcmVkIGNoYW5uZWwgb2YgdGhpcyB0ZXh0dXJlIGlzIHVzZWQgYXMgdGhlIGFtYmllbnQgb2NjbHVzaW9uIG1hcC5cclxuXHRcdCAqIFJlcXVpcmVzIGEgc2Vjb25kIHNldCBvZiBVVnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFvTWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEludGVuc2l0eSBvZiB0aGUgYW1iaWVudCBvY2NsdXNpb24gZWZmZWN0LiBSYW5nZSBpcyBgWzAsMV1gLCB3aGVyZSBgMGBcclxuXHRcdCAqIGRpc2FibGVzIGFtYmllbnQgb2NjbHVzaW9uLiBXaGVyZSBpbnRlbnNpdHkgaXMgYDFgIGFuZCB0aGUgQU8gbWFwJ3NcclxuXHRcdCAqIHJlZCBjaGFubmVsIGlzIGFsc28gYDFgLCBhbWJpZW50IGxpZ2h0IGlzIGZ1bGx5IG9jY2x1ZGVkIG9uIGEgc3VyZmFjZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gMS4wO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRW1pc3NpdmUgKGxpZ2h0KSBjb2xvciBvZiB0aGUgbWF0ZXJpYWwsIGVzc2VudGlhbGx5IGEgc29saWQgY29sb3JcclxuXHRcdCAqIHVuYWZmZWN0ZWQgYnkgb3RoZXIgbGlnaHRpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0NvbG9yfVxyXG5cdFx0ICogQGRlZmF1bHQgKDAsMCwwKVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmVtaXNzaXZlID0gbmV3IENvbG9yKCAweDAwMDAwMCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSW50ZW5zaXR5IG9mIHRoZSBlbWlzc2l2ZSBsaWdodC4gTW9kdWxhdGVzIHRoZSBlbWlzc2l2ZSBjb2xvci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ID0gMS4wO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU2V0IGVtaXNzaXZlIChnbG93KSBtYXAuIFRoZSBlbWlzc2l2ZSBtYXAgY29sb3IgaXMgbW9kdWxhdGVkIGJ5IHRoZVxyXG5cdFx0ICogZW1pc3NpdmUgY29sb3IgYW5kIHRoZSBlbWlzc2l2ZSBpbnRlbnNpdHkuIElmIHlvdSBoYXZlIGFuIGVtaXNzaXZlIG1hcCxcclxuXHRcdCAqIGJlIHN1cmUgdG8gc2V0IHRoZSBlbWlzc2l2ZSBjb2xvciB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiBibGFjay5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZW1pc3NpdmVNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHRleHR1cmUgdG8gY3JlYXRlIGEgYnVtcCBtYXAuIFRoZSBibGFjayBhbmQgd2hpdGUgdmFsdWVzIG1hcCB0byB0aGVcclxuXHRcdCAqIHBlcmNlaXZlZCBkZXB0aCBpbiByZWxhdGlvbiB0byB0aGUgbGlnaHRzLiBCdW1wIGRvZXNuJ3QgYWN0dWFsbHkgYWZmZWN0XHJcblx0XHQgKiB0aGUgZ2VvbWV0cnkgb2YgdGhlIG9iamVjdCwgb25seSB0aGUgbGlnaHRpbmcuIElmIGEgbm9ybWFsIG1hcCBpcyBkZWZpbmVkXHJcblx0XHQgKiB0aGlzIHdpbGwgYmUgaWdub3JlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYnVtcE1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3cgbXVjaCB0aGUgYnVtcCBtYXAgYWZmZWN0cyB0aGUgbWF0ZXJpYWwuIFR5cGljYWwgcmFuZ2UgaXMgYFswLDFdYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJ1bXBTY2FsZSA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdGV4dHVyZSB0byBjcmVhdGUgYSBub3JtYWwgbWFwLiBUaGUgUkdCIHZhbHVlcyBhZmZlY3QgdGhlIHN1cmZhY2VcclxuXHRcdCAqIG5vcm1hbCBmb3IgZWFjaCBwaXhlbCBmcmFnbWVudCBhbmQgY2hhbmdlIHRoZSB3YXkgdGhlIGNvbG9yIGlzIGxpdC4gTm9ybWFsXHJcblx0XHQgKiBtYXBzIGRvIG5vdCBjaGFuZ2UgdGhlIGFjdHVhbCBzaGFwZSBvZiB0aGUgc3VyZmFjZSwgb25seSB0aGUgbGlnaHRpbmcuIEluXHJcblx0XHQgKiBjYXNlIHRoZSBtYXRlcmlhbCBoYXMgYSBub3JtYWwgbWFwIGF1dGhvcmVkIHVzaW5nIHRoZSBsZWZ0IGhhbmRlZFxyXG5cdFx0ICogY29udmVudGlvbiwgdGhlIGB5YCBjb21wb25lbnQgb2YgYG5vcm1hbFNjYWxlYCBzaG91bGQgYmUgbmVnYXRlZCB0byBjb21wZW5zYXRlXHJcblx0XHQgKiBmb3IgdGhlIGRpZmZlcmVudCBoYW5kZWRuZXNzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub3JtYWxNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHR5cGUgb2Ygbm9ybWFsIG1hcC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KFRhbmdlbnRTcGFjZU5vcm1hbE1hcHxPYmplY3RTcGFjZU5vcm1hbE1hcCl9XHJcblx0XHQgKiBAZGVmYXVsdCBUYW5nZW50U3BhY2VOb3JtYWxNYXBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub3JtYWxNYXBUeXBlID0gVGFuZ2VudFNwYWNlTm9ybWFsTWFwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG93IG11Y2ggdGhlIG5vcm1hbCBtYXAgYWZmZWN0cyB0aGUgbWF0ZXJpYWwuIFR5cGljYWwgdmFsdWUgcmFuZ2UgaXMgYFswLDFdYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yMn1cclxuXHRcdCAqIEBkZWZhdWx0ICgxLDEpXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMiggMSwgMSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGRpc3BsYWNlbWVudCBtYXAgYWZmZWN0cyB0aGUgcG9zaXRpb24gb2YgdGhlIG1lc2gncyB2ZXJ0aWNlcy4gVW5saWtlXHJcblx0XHQgKiBvdGhlciBtYXBzIHdoaWNoIG9ubHkgYWZmZWN0IHRoZSBsaWdodCBhbmQgc2hhZGUgb2YgdGhlIG1hdGVyaWFsIHRoZVxyXG5cdFx0ICogZGlzcGxhY2VkIHZlcnRpY2VzIGNhbiBjYXN0IHNoYWRvd3MsIGJsb2NrIG90aGVyIG9iamVjdHMsIGFuZCBvdGhlcndpc2VcclxuXHRcdCAqIGFjdCBhcyByZWFsIGdlb21ldHJ5LiBUaGUgZGlzcGxhY2VtZW50IHRleHR1cmUgaXMgYW4gaW1hZ2Ugd2hlcmUgdGhlIHZhbHVlXHJcblx0XHQgKiBvZiBlYWNoIHBpeGVsICh3aGl0ZSBiZWluZyB0aGUgaGlnaGVzdCkgaXMgbWFwcGVkIGFnYWluc3QsIGFuZFxyXG5cdFx0ICogcmVwb3NpdGlvbnMsIHRoZSB2ZXJ0aWNlcyBvZiB0aGUgbWVzaC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvdyBtdWNoIHRoZSBkaXNwbGFjZW1lbnQgbWFwIGFmZmVjdHMgdGhlIG1lc2ggKHdoZXJlIGJsYWNrIGlzIG5vXHJcblx0XHQgKiBkaXNwbGFjZW1lbnQsIGFuZCB3aGl0ZSBpcyBtYXhpbXVtIGRpc3BsYWNlbWVudCkuIFdpdGhvdXQgYSBkaXNwbGFjZW1lbnRcclxuXHRcdCAqIG1hcCBzZXQsIHRoaXMgdmFsdWUgaXMgbm90IGFwcGxpZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgb2Zmc2V0IG9mIHRoZSBkaXNwbGFjZW1lbnQgbWFwJ3MgdmFsdWVzIG9uIHRoZSBtZXNoJ3MgdmVydGljZXMuXHJcblx0XHQgKiBUaGUgYmlhcyBpcyBhZGRlZCB0byB0aGUgc2NhbGVkIHNhbXBsZSBvZiB0aGUgZGlzcGxhY2VtZW50IG1hcC5cclxuXHRcdCAqIFdpdGhvdXQgYSBkaXNwbGFjZW1lbnQgbWFwIHNldCwgdGhpcyB2YWx1ZSBpcyBub3QgYXBwbGllZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHNwZWN1bGFyIG1hcCB2YWx1ZSBhZmZlY3RzIGJvdGggaG93IG11Y2ggdGhlIHNwZWN1bGFyIHN1cmZhY2VcclxuXHRcdCAqIGhpZ2hsaWdodCBjb250cmlidXRlcyBhbmQgaG93IG11Y2ggb2YgdGhlIGVudmlyb25tZW50IG1hcCBhZmZlY3RzIHRoZVxyXG5cdFx0ICogc3VyZmFjZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc3BlY3VsYXJNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGFscGhhIG1hcCBpcyBhIGdyYXlzY2FsZSB0ZXh0dXJlIHRoYXQgY29udHJvbHMgdGhlIG9wYWNpdHkgYWNyb3NzIHRoZVxyXG5cdFx0ICogc3VyZmFjZSAoYmxhY2s6IGZ1bGx5IHRyYW5zcGFyZW50OyB3aGl0ZTogZnVsbHkgb3BhcXVlKS5cclxuXHRcdCAqXHJcblx0XHQgKiBPbmx5IHRoZSBjb2xvciBvZiB0aGUgdGV4dHVyZSBpcyB1c2VkLCBpZ25vcmluZyB0aGUgYWxwaGEgY2hhbm5lbCBpZiBvbmVcclxuXHRcdCAqIGV4aXN0cy4gRm9yIFJHQiBhbmQgUkdCQSB0ZXh0dXJlcywgdGhlIHJlbmRlcmVyIHdpbGwgdXNlIHRoZSBncmVlbiBjaGFubmVsXHJcblx0XHQgKiB3aGVuIHNhbXBsaW5nIHRoaXMgdGV4dHVyZSBkdWUgdG8gdGhlIGV4dHJhIGJpdCBvZiBwcmVjaXNpb24gcHJvdmlkZWQgZm9yXHJcblx0XHQgKiBncmVlbiBpbiBEWFQtY29tcHJlc3NlZCBhbmQgdW5jb21wcmVzc2VkIFJHQiA1NjUgZm9ybWF0cy4gTHVtaW5hbmNlLW9ubHkgYW5kXHJcblx0XHQgKiBsdW1pbmFuY2UvYWxwaGEgdGV4dHVyZXMgd2lsbCBhbHNvIHN0aWxsIHdvcmsgYXMgZXhwZWN0ZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFscGhhTWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBlbnZpcm9ubWVudCBtYXAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmVudk1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcm90YXRpb24gb2YgdGhlIGVudmlyb25tZW50IG1hcCBpbiByYWRpYW5zLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtFdWxlcn1cclxuXHRcdCAqIEBkZWZhdWx0ICgwLDAsMClcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5lbnZNYXBSb3RhdGlvbiA9IG5ldyBFdWxlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG93IHRvIGNvbWJpbmUgdGhlIHJlc3VsdCBvZiB0aGUgc3VyZmFjZSdzIGNvbG9yIHdpdGggdGhlIGVudmlyb25tZW50IG1hcCwgaWYgYW55LlxyXG5cdFx0ICpcclxuXHRcdCAqIFdoZW4gc2V0IHRvIGBNaXhPcGVyYXRpb25gLCB0aGUge0BsaW5rIE1lc2hCYXNpY01hdGVyaWFsI3JlZmxlY3Rpdml0eX0gaXMgdXNlZCB0b1xyXG5cdFx0ICogYmxlbmQgYmV0d2VlbiB0aGUgdHdvIGNvbG9ycy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KE11bHRpcGx5T3BlcmF0aW9ufE1peE9wZXJhdGlvbnxBZGRPcGVyYXRpb24pfVxyXG5cdFx0ICogQGRlZmF1bHQgTXVsdGlwbHlPcGVyYXRpb25cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb21iaW5lID0gTXVsdGlwbHlPcGVyYXRpb247XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3cgbXVjaCB0aGUgZW52aXJvbm1lbnQgbWFwIGFmZmVjdHMgdGhlIHN1cmZhY2UuXHJcblx0XHQgKiBUaGUgdmFsaWQgcmFuZ2UgaXMgYmV0d2VlbiBgMGAgKG5vIHJlZmxlY3Rpb25zKSBhbmQgYDFgIChmdWxsIHJlZmxlY3Rpb25zKS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJlZmxlY3Rpdml0eSA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgaW5kZXggb2YgcmVmcmFjdGlvbiAoSU9SKSBvZiBhaXIgKGFwcHJveGltYXRlbHkgMSkgZGl2aWRlZCBieSB0aGVcclxuXHRcdCAqIGluZGV4IG9mIHJlZnJhY3Rpb24gb2YgdGhlIG1hdGVyaWFsLiBJdCBpcyB1c2VkIHdpdGggZW52aXJvbm1lbnQgbWFwcGluZ1xyXG5cdFx0ICogbW9kZXMge0BsaW5rIEN1YmVSZWZyYWN0aW9uTWFwcGluZ30gYW5kIHtAbGluayBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZ30uXHJcblx0XHQgKiBUaGUgcmVmcmFjdGlvbiByYXRpbyBzaG91bGQgbm90IGV4Y2VlZCBgMWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDAuOThcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yZWZyYWN0aW9uUmF0aW8gPSAwLjk4O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVuZGVycyB0aGUgZ2VvbWV0cnkgYXMgYSB3aXJlZnJhbWUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLndpcmVmcmFtZSA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQ29udHJvbHMgdGhlIHRoaWNrbmVzcyBvZiB0aGUgd2lyZWZyYW1lLlxyXG5cdFx0ICpcclxuXHRcdCAqIENhbiBvbmx5IGJlIHVzZWQgd2l0aCB7QGxpbmsgU1ZHUmVuZGVyZXJ9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgYXBwZWFyYW5jZSBvZiB3aXJlZnJhbWUgZW5kcy5cclxuXHRcdCAqXHJcblx0XHQgKiBDYW4gb25seSBiZSB1c2VkIHdpdGgge0BsaW5rIFNWR1JlbmRlcmVyfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KCdyb3VuZCd8J2JldmVsJ3wnbWl0ZXInKX1cclxuXHRcdCAqIEBkZWZhdWx0ICdyb3VuZCdcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy53aXJlZnJhbWVMaW5lY2FwID0gJ3JvdW5kJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgYXBwZWFyYW5jZSBvZiB3aXJlZnJhbWUgam9pbnRzLlxyXG5cdFx0ICpcclxuXHRcdCAqIENhbiBvbmx5IGJlIHVzZWQgd2l0aCB7QGxpbmsgU1ZHUmVuZGVyZXJ9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoJ3JvdW5kJ3wnYmV2ZWwnfCdtaXRlcicpfVxyXG5cdFx0ICogQGRlZmF1bHQgJ3JvdW5kJ1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gJ3JvdW5kJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIG1hdGVyaWFsIGlzIHJlbmRlcmVkIHdpdGggZmxhdCBzaGFkaW5nIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZmxhdFNoYWRpbmcgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIG1hdGVyaWFsIGlzIGFmZmVjdGVkIGJ5IGZvZyBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZm9nID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xyXG5cdFx0dGhpcy5zcGVjdWxhci5jb3B5KCBzb3VyY2Uuc3BlY3VsYXIgKTtcclxuXHRcdHRoaXMuc2hpbmluZXNzID0gc291cmNlLnNoaW5pbmVzcztcclxuXHJcblx0XHR0aGlzLm1hcCA9IHNvdXJjZS5tYXA7XHJcblxyXG5cdFx0dGhpcy5saWdodE1hcCA9IHNvdXJjZS5saWdodE1hcDtcclxuXHRcdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSBzb3VyY2UubGlnaHRNYXBJbnRlbnNpdHk7XHJcblxyXG5cdFx0dGhpcy5hb01hcCA9IHNvdXJjZS5hb01hcDtcclxuXHRcdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSBzb3VyY2UuYW9NYXBJbnRlbnNpdHk7XHJcblxyXG5cdFx0dGhpcy5lbWlzc2l2ZS5jb3B5KCBzb3VyY2UuZW1pc3NpdmUgKTtcclxuXHRcdHRoaXMuZW1pc3NpdmVNYXAgPSBzb3VyY2UuZW1pc3NpdmVNYXA7XHJcblx0XHR0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ID0gc291cmNlLmVtaXNzaXZlSW50ZW5zaXR5O1xyXG5cclxuXHRcdHRoaXMuYnVtcE1hcCA9IHNvdXJjZS5idW1wTWFwO1xyXG5cdFx0dGhpcy5idW1wU2NhbGUgPSBzb3VyY2UuYnVtcFNjYWxlO1xyXG5cclxuXHRcdHRoaXMubm9ybWFsTWFwID0gc291cmNlLm5vcm1hbE1hcDtcclxuXHRcdHRoaXMubm9ybWFsTWFwVHlwZSA9IHNvdXJjZS5ub3JtYWxNYXBUeXBlO1xyXG5cdFx0dGhpcy5ub3JtYWxTY2FsZS5jb3B5KCBzb3VyY2Uubm9ybWFsU2NhbGUgKTtcclxuXHJcblx0XHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IHNvdXJjZS5kaXNwbGFjZW1lbnRNYXA7XHJcblx0XHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gc291cmNlLmRpc3BsYWNlbWVudFNjYWxlO1xyXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gc291cmNlLmRpc3BsYWNlbWVudEJpYXM7XHJcblxyXG5cdFx0dGhpcy5zcGVjdWxhck1hcCA9IHNvdXJjZS5zcGVjdWxhck1hcDtcclxuXHJcblx0XHR0aGlzLmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwO1xyXG5cclxuXHRcdHRoaXMuZW52TWFwID0gc291cmNlLmVudk1hcDtcclxuXHRcdHRoaXMuZW52TWFwUm90YXRpb24uY29weSggc291cmNlLmVudk1hcFJvdGF0aW9uICk7XHJcblx0XHR0aGlzLmNvbWJpbmUgPSBzb3VyY2UuY29tYmluZTtcclxuXHRcdHRoaXMucmVmbGVjdGl2aXR5ID0gc291cmNlLnJlZmxlY3Rpdml0eTtcclxuXHRcdHRoaXMucmVmcmFjdGlvblJhdGlvID0gc291cmNlLnJlZnJhY3Rpb25SYXRpbztcclxuXHJcblx0XHR0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7XHJcblx0XHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7XHJcblx0XHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSBzb3VyY2Uud2lyZWZyYW1lTGluZWNhcDtcclxuXHRcdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSBzb3VyY2Uud2lyZWZyYW1lTGluZWpvaW47XHJcblxyXG5cdFx0dGhpcy5mbGF0U2hhZGluZyA9IHNvdXJjZS5mbGF0U2hhZGluZztcclxuXHJcblx0XHR0aGlzLmZvZyA9IHNvdXJjZS5mb2c7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IE1lc2hQaG9uZ01hdGVyaWFsIH07XHJcbiIsImltcG9ydCB7IFRhbmdlbnRTcGFjZU5vcm1hbE1hcCB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IE1hdGVyaWFsIH0gZnJvbSAnLi9NYXRlcmlhbC5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjIuanMnO1xyXG5pbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uL21hdGgvQ29sb3IuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgbWF0ZXJpYWwgaW1wbGVtZW50aW5nIHRvb24gc2hhZGluZy5cclxuICpcclxuICogQGF1Z21lbnRzIE1hdGVyaWFsXHJcbiAqL1xyXG5jbGFzcyBNZXNoVG9vbk1hdGVyaWFsIGV4dGVuZHMgTWF0ZXJpYWwge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG1lc2ggdG9vbiBtYXRlcmlhbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1ldGVyc10gLSBBbiBvYmplY3Qgd2l0aCBvbmUgb3IgbW9yZSBwcm9wZXJ0aWVzXHJcblx0ICogZGVmaW5pbmcgdGhlIG1hdGVyaWFsJ3MgYXBwZWFyYW5jZS4gQW55IHByb3BlcnR5IG9mIHRoZSBtYXRlcmlhbFxyXG5cdCAqIChpbmNsdWRpbmcgYW55IHByb3BlcnR5IGZyb20gaW5oZXJpdGVkIG1hdGVyaWFscykgY2FuIGJlIHBhc3NlZFxyXG5cdCAqIGluIGhlcmUuIENvbG9yIHZhbHVlcyBjYW4gYmUgcGFzc2VkIGFueSB0eXBlIG9mIHZhbHVlIGFjY2VwdGVkXHJcblx0ICogYnkge0BsaW5rIENvbG9yI3NldH0uXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHBhcmFtZXRlcnMgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNNZXNoVG9vbk1hdGVyaWFsID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLmRlZmluZXMgPSB7ICdUT09OJzogJycgfTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnTWVzaFRvb25NYXRlcmlhbCc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDb2xvciBvZiB0aGUgbWF0ZXJpYWwuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0NvbG9yfVxyXG5cdFx0ICogQGRlZmF1bHQgKDEsMSwxKVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCAweGZmZmZmZiApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNvbG9yIG1hcC4gTWF5IG9wdGlvbmFsbHkgaW5jbHVkZSBhbiBhbHBoYSBjaGFubmVsLCB0eXBpY2FsbHkgY29tYmluZWRcclxuXHRcdCAqIHdpdGgge0BsaW5rIE1hdGVyaWFsI3RyYW5zcGFyZW50fSBvciB7QGxpbmsgTWF0ZXJpYWwjYWxwaGFUZXN0fS4gVGhlIHRleHR1cmUgbWFwXHJcblx0XHQgKiBjb2xvciBpcyBtb2R1bGF0ZWQgYnkgdGhlIGRpZmZ1c2UgYGNvbG9yYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEdyYWRpZW50IG1hcCBmb3IgdG9vbiBzaGFkaW5nLiBJdCdzIHJlcXVpcmVkIHRvIHNldFxyXG5cdFx0ICoge0BsaW5rIFRleHR1cmUjbWluRmlsdGVyfSBhbmQge0BsaW5rIFRleHR1cmUjbWFnRmlsdGVyfSB0byB7QGxpbmtOZWFyZXN0RmlsdGVyfVxyXG5cdFx0ICogd2hlbiB1c2luZyB0aGlzIHR5cGUgb2YgdGV4dHVyZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ3JhZGllbnRNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGxpZ2h0IG1hcC4gUmVxdWlyZXMgYSBzZWNvbmQgc2V0IG9mIFVWcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGlnaHRNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSW50ZW5zaXR5IG9mIHRoZSBiYWtlZCBsaWdodC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gMS4wO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJlZCBjaGFubmVsIG9mIHRoaXMgdGV4dHVyZSBpcyB1c2VkIGFzIHRoZSBhbWJpZW50IG9jY2x1c2lvbiBtYXAuXHJcblx0XHQgKiBSZXF1aXJlcyBhIHNlY29uZCBzZXQgb2YgVVZzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hb01hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBJbnRlbnNpdHkgb2YgdGhlIGFtYmllbnQgb2NjbHVzaW9uIGVmZmVjdC4gUmFuZ2UgaXMgYFswLDFdYCwgd2hlcmUgYDBgXHJcblx0XHQgKiBkaXNhYmxlcyBhbWJpZW50IG9jY2x1c2lvbi4gV2hlcmUgaW50ZW5zaXR5IGlzIGAxYCBhbmQgdGhlIEFPIG1hcCdzXHJcblx0XHQgKiByZWQgY2hhbm5lbCBpcyBhbHNvIGAxYCwgYW1iaWVudCBsaWdodCBpcyBmdWxseSBvY2NsdWRlZCBvbiBhIHN1cmZhY2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hb01hcEludGVuc2l0eSA9IDEuMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEVtaXNzaXZlIChsaWdodCkgY29sb3Igb2YgdGhlIG1hdGVyaWFsLCBlc3NlbnRpYWxseSBhIHNvbGlkIGNvbG9yXHJcblx0XHQgKiB1bmFmZmVjdGVkIGJ5IG90aGVyIGxpZ2h0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtDb2xvcn1cclxuXHRcdCAqIEBkZWZhdWx0ICgwLDAsMClcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5lbWlzc2l2ZSA9IG5ldyBDb2xvciggMHgwMDAwMDAgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEludGVuc2l0eSBvZiB0aGUgZW1pc3NpdmUgbGlnaHQuIE1vZHVsYXRlcyB0aGUgZW1pc3NpdmUgY29sb3IuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IDEuMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNldCBlbWlzc2l2ZSAoZ2xvdykgbWFwLiBUaGUgZW1pc3NpdmUgbWFwIGNvbG9yIGlzIG1vZHVsYXRlZCBieSB0aGVcclxuXHRcdCAqIGVtaXNzaXZlIGNvbG9yIGFuZCB0aGUgZW1pc3NpdmUgaW50ZW5zaXR5LiBJZiB5b3UgaGF2ZSBhbiBlbWlzc2l2ZSBtYXAsXHJcblx0XHQgKiBiZSBzdXJlIHRvIHNldCB0aGUgZW1pc3NpdmUgY29sb3IgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gYmxhY2suXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmVtaXNzaXZlTWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB0ZXh0dXJlIHRvIGNyZWF0ZSBhIGJ1bXAgbWFwLiBUaGUgYmxhY2sgYW5kIHdoaXRlIHZhbHVlcyBtYXAgdG8gdGhlXHJcblx0XHQgKiBwZXJjZWl2ZWQgZGVwdGggaW4gcmVsYXRpb24gdG8gdGhlIGxpZ2h0cy4gQnVtcCBkb2Vzbid0IGFjdHVhbGx5IGFmZmVjdFxyXG5cdFx0ICogdGhlIGdlb21ldHJ5IG9mIHRoZSBvYmplY3QsIG9ubHkgdGhlIGxpZ2h0aW5nLiBJZiBhIG5vcm1hbCBtYXAgaXMgZGVmaW5lZFxyXG5cdFx0ICogdGhpcyB3aWxsIGJlIGlnbm9yZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJ1bXBNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG93IG11Y2ggdGhlIGJ1bXAgbWFwIGFmZmVjdHMgdGhlIG1hdGVyaWFsLiBUeXBpY2FsIHJhbmdlIGlzIGBbMCwxXWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5idW1wU2NhbGUgPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHRleHR1cmUgdG8gY3JlYXRlIGEgbm9ybWFsIG1hcC4gVGhlIFJHQiB2YWx1ZXMgYWZmZWN0IHRoZSBzdXJmYWNlXHJcblx0XHQgKiBub3JtYWwgZm9yIGVhY2ggcGl4ZWwgZnJhZ21lbnQgYW5kIGNoYW5nZSB0aGUgd2F5IHRoZSBjb2xvciBpcyBsaXQuIE5vcm1hbFxyXG5cdFx0ICogbWFwcyBkbyBub3QgY2hhbmdlIHRoZSBhY3R1YWwgc2hhcGUgb2YgdGhlIHN1cmZhY2UsIG9ubHkgdGhlIGxpZ2h0aW5nLiBJblxyXG5cdFx0ICogY2FzZSB0aGUgbWF0ZXJpYWwgaGFzIGEgbm9ybWFsIG1hcCBhdXRob3JlZCB1c2luZyB0aGUgbGVmdCBoYW5kZWRcclxuXHRcdCAqIGNvbnZlbnRpb24sIHRoZSBgeWAgY29tcG9uZW50IG9mIGBub3JtYWxTY2FsZWAgc2hvdWxkIGJlIG5lZ2F0ZWQgdG8gY29tcGVuc2F0ZVxyXG5cdFx0ICogZm9yIHRoZSBkaWZmZXJlbnQgaGFuZGVkbmVzcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9ybWFsTWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB0eXBlIG9mIG5vcm1hbCBtYXAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeyhUYW5nZW50U3BhY2VOb3JtYWxNYXB8T2JqZWN0U3BhY2VOb3JtYWxNYXApfVxyXG5cdFx0ICogQGRlZmF1bHQgVGFuZ2VudFNwYWNlTm9ybWFsTWFwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9ybWFsTWFwVHlwZSA9IFRhbmdlbnRTcGFjZU5vcm1hbE1hcDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvdyBtdWNoIHRoZSBub3JtYWwgbWFwIGFmZmVjdHMgdGhlIG1hdGVyaWFsLiBUeXBpY2FsIHZhbHVlIHJhbmdlIGlzIGBbMCwxXWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjJ9XHJcblx0XHQgKiBAZGVmYXVsdCAoMSwxKVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vcm1hbFNjYWxlID0gbmV3IFZlY3RvcjIoIDEsIDEgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBkaXNwbGFjZW1lbnQgbWFwIGFmZmVjdHMgdGhlIHBvc2l0aW9uIG9mIHRoZSBtZXNoJ3MgdmVydGljZXMuIFVubGlrZVxyXG5cdFx0ICogb3RoZXIgbWFwcyB3aGljaCBvbmx5IGFmZmVjdCB0aGUgbGlnaHQgYW5kIHNoYWRlIG9mIHRoZSBtYXRlcmlhbCB0aGVcclxuXHRcdCAqIGRpc3BsYWNlZCB2ZXJ0aWNlcyBjYW4gY2FzdCBzaGFkb3dzLCBibG9jayBvdGhlciBvYmplY3RzLCBhbmQgb3RoZXJ3aXNlXHJcblx0XHQgKiBhY3QgYXMgcmVhbCBnZW9tZXRyeS4gVGhlIGRpc3BsYWNlbWVudCB0ZXh0dXJlIGlzIGFuIGltYWdlIHdoZXJlIHRoZSB2YWx1ZVxyXG5cdFx0ICogb2YgZWFjaCBwaXhlbCAod2hpdGUgYmVpbmcgdGhlIGhpZ2hlc3QpIGlzIG1hcHBlZCBhZ2FpbnN0LCBhbmRcclxuXHRcdCAqIHJlcG9zaXRpb25zLCB0aGUgdmVydGljZXMgb2YgdGhlIG1lc2guXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3cgbXVjaCB0aGUgZGlzcGxhY2VtZW50IG1hcCBhZmZlY3RzIHRoZSBtZXNoICh3aGVyZSBibGFjayBpcyBub1xyXG5cdFx0ICogZGlzcGxhY2VtZW50LCBhbmQgd2hpdGUgaXMgbWF4aW11bSBkaXNwbGFjZW1lbnQpLiBXaXRob3V0IGEgZGlzcGxhY2VtZW50XHJcblx0XHQgKiBtYXAgc2V0LCB0aGlzIHZhbHVlIGlzIG5vdCBhcHBsaWVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG9mZnNldCBvZiB0aGUgZGlzcGxhY2VtZW50IG1hcCdzIHZhbHVlcyBvbiB0aGUgbWVzaCdzIHZlcnRpY2VzLlxyXG5cdFx0ICogVGhlIGJpYXMgaXMgYWRkZWQgdG8gdGhlIHNjYWxlZCBzYW1wbGUgb2YgdGhlIGRpc3BsYWNlbWVudCBtYXAuXHJcblx0XHQgKiBXaXRob3V0IGEgZGlzcGxhY2VtZW50IG1hcCBzZXQsIHRoaXMgdmFsdWUgaXMgbm90IGFwcGxpZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBhbHBoYSBtYXAgaXMgYSBncmF5c2NhbGUgdGV4dHVyZSB0aGF0IGNvbnRyb2xzIHRoZSBvcGFjaXR5IGFjcm9zcyB0aGVcclxuXHRcdCAqIHN1cmZhY2UgKGJsYWNrOiBmdWxseSB0cmFuc3BhcmVudDsgd2hpdGU6IGZ1bGx5IG9wYXF1ZSkuXHJcblx0XHQgKlxyXG5cdFx0ICogT25seSB0aGUgY29sb3Igb2YgdGhlIHRleHR1cmUgaXMgdXNlZCwgaWdub3JpbmcgdGhlIGFscGhhIGNoYW5uZWwgaWYgb25lXHJcblx0XHQgKiBleGlzdHMuIEZvciBSR0IgYW5kIFJHQkEgdGV4dHVyZXMsIHRoZSByZW5kZXJlciB3aWxsIHVzZSB0aGUgZ3JlZW4gY2hhbm5lbFxyXG5cdFx0ICogd2hlbiBzYW1wbGluZyB0aGlzIHRleHR1cmUgZHVlIHRvIHRoZSBleHRyYSBiaXQgb2YgcHJlY2lzaW9uIHByb3ZpZGVkIGZvclxyXG5cdFx0ICogZ3JlZW4gaW4gRFhULWNvbXByZXNzZWQgYW5kIHVuY29tcHJlc3NlZCBSR0IgNTY1IGZvcm1hdHMuIEx1bWluYW5jZS1vbmx5IGFuZFxyXG5cdFx0ICogbHVtaW5hbmNlL2FscGhhIHRleHR1cmVzIHdpbGwgYWxzbyBzdGlsbCB3b3JrIGFzIGV4cGVjdGVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hbHBoYU1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZW5kZXJzIHRoZSBnZW9tZXRyeSBhcyBhIHdpcmVmcmFtZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMud2lyZWZyYW1lID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDb250cm9scyB0aGUgdGhpY2tuZXNzIG9mIHRoZSB3aXJlZnJhbWUuXHJcblx0XHQgKlxyXG5cdFx0ICogQ2FuIG9ubHkgYmUgdXNlZCB3aXRoIHtAbGluayBTVkdSZW5kZXJlcn0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyBhcHBlYXJhbmNlIG9mIHdpcmVmcmFtZSBlbmRzLlxyXG5cdFx0ICpcclxuXHRcdCAqIENhbiBvbmx5IGJlIHVzZWQgd2l0aCB7QGxpbmsgU1ZHUmVuZGVyZXJ9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoJ3JvdW5kJ3wnYmV2ZWwnfCdtaXRlcicpfVxyXG5cdFx0ICogQGRlZmF1bHQgJ3JvdW5kJ1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSAncm91bmQnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyBhcHBlYXJhbmNlIG9mIHdpcmVmcmFtZSBqb2ludHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQ2FuIG9ubHkgYmUgdXNlZCB3aXRoIHtAbGluayBTVkdSZW5kZXJlcn0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeygncm91bmQnfCdiZXZlbCd8J21pdGVyJyl9XHJcblx0XHQgKiBAZGVmYXVsdCAncm91bmQnXHJcblx0XHQgKi9cclxuXHRcdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSAncm91bmQnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgbWF0ZXJpYWwgaXMgYWZmZWN0ZWQgYnkgZm9nIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5mb2cgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XHJcblxyXG5cdFx0dGhpcy5tYXAgPSBzb3VyY2UubWFwO1xyXG5cdFx0dGhpcy5ncmFkaWVudE1hcCA9IHNvdXJjZS5ncmFkaWVudE1hcDtcclxuXHJcblx0XHR0aGlzLmxpZ2h0TWFwID0gc291cmNlLmxpZ2h0TWFwO1xyXG5cdFx0dGhpcy5saWdodE1hcEludGVuc2l0eSA9IHNvdXJjZS5saWdodE1hcEludGVuc2l0eTtcclxuXHJcblx0XHR0aGlzLmFvTWFwID0gc291cmNlLmFvTWFwO1xyXG5cdFx0dGhpcy5hb01hcEludGVuc2l0eSA9IHNvdXJjZS5hb01hcEludGVuc2l0eTtcclxuXHJcblx0XHR0aGlzLmVtaXNzaXZlLmNvcHkoIHNvdXJjZS5lbWlzc2l2ZSApO1xyXG5cdFx0dGhpcy5lbWlzc2l2ZU1hcCA9IHNvdXJjZS5lbWlzc2l2ZU1hcDtcclxuXHRcdHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgPSBzb3VyY2UuZW1pc3NpdmVJbnRlbnNpdHk7XHJcblxyXG5cdFx0dGhpcy5idW1wTWFwID0gc291cmNlLmJ1bXBNYXA7XHJcblx0XHR0aGlzLmJ1bXBTY2FsZSA9IHNvdXJjZS5idW1wU2NhbGU7XHJcblxyXG5cdFx0dGhpcy5ub3JtYWxNYXAgPSBzb3VyY2Uubm9ybWFsTWFwO1xyXG5cdFx0dGhpcy5ub3JtYWxNYXBUeXBlID0gc291cmNlLm5vcm1hbE1hcFR5cGU7XHJcblx0XHR0aGlzLm5vcm1hbFNjYWxlLmNvcHkoIHNvdXJjZS5ub3JtYWxTY2FsZSApO1xyXG5cclxuXHRcdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gc291cmNlLmRpc3BsYWNlbWVudE1hcDtcclxuXHRcdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSBzb3VyY2UuZGlzcGxhY2VtZW50U2NhbGU7XHJcblx0XHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSBzb3VyY2UuZGlzcGxhY2VtZW50QmlhcztcclxuXHJcblx0XHR0aGlzLmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwO1xyXG5cclxuXHRcdHRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTtcclxuXHRcdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFtZUxpbmV3aWR0aDtcclxuXHRcdHRoaXMud2lyZWZyYW1lTGluZWNhcCA9IHNvdXJjZS53aXJlZnJhbWVMaW5lY2FwO1xyXG5cdFx0dGhpcy53aXJlZnJhbWVMaW5lam9pbiA9IHNvdXJjZS53aXJlZnJhbWVMaW5lam9pbjtcclxuXHJcblx0XHR0aGlzLmZvZyA9IHNvdXJjZS5mb2c7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IE1lc2hUb29uTWF0ZXJpYWwgfTtcclxuIiwiaW1wb3J0IHsgVGFuZ2VudFNwYWNlTm9ybWFsTWFwIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgTWF0ZXJpYWwgfSBmcm9tICcuL01hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uL21hdGgvVmVjdG9yMi5qcyc7XHJcblxyXG4vKipcclxuICogQSBtYXRlcmlhbCB0aGF0IG1hcHMgdGhlIG5vcm1hbCB2ZWN0b3JzIHRvIFJHQiBjb2xvcnMuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBNYXRlcmlhbFxyXG4gKi9cclxuY2xhc3MgTWVzaE5vcm1hbE1hdGVyaWFsIGV4dGVuZHMgTWF0ZXJpYWwge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG1lc2ggbm9ybWFsIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbWV0ZXJzXSAtIEFuIG9iamVjdCB3aXRoIG9uZSBvciBtb3JlIHByb3BlcnRpZXNcclxuXHQgKiBkZWZpbmluZyB0aGUgbWF0ZXJpYWwncyBhcHBlYXJhbmNlLiBBbnkgcHJvcGVydHkgb2YgdGhlIG1hdGVyaWFsXHJcblx0ICogKGluY2x1ZGluZyBhbnkgcHJvcGVydHkgZnJvbSBpbmhlcml0ZWQgbWF0ZXJpYWxzKSBjYW4gYmUgcGFzc2VkXHJcblx0ICogaW4gaGVyZS4gQ29sb3IgdmFsdWVzIGNhbiBiZSBwYXNzZWQgYW55IHR5cGUgb2YgdmFsdWUgYWNjZXB0ZWRcclxuXHQgKiBieSB7QGxpbmsgQ29sb3Ijc2V0fS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVycyApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc01lc2hOb3JtYWxNYXRlcmlhbCA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ01lc2hOb3JtYWxNYXRlcmlhbCc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdGV4dHVyZSB0byBjcmVhdGUgYSBidW1wIG1hcC4gVGhlIGJsYWNrIGFuZCB3aGl0ZSB2YWx1ZXMgbWFwIHRvIHRoZVxyXG5cdFx0ICogcGVyY2VpdmVkIGRlcHRoIGluIHJlbGF0aW9uIHRvIHRoZSBsaWdodHMuIEJ1bXAgZG9lc24ndCBhY3R1YWxseSBhZmZlY3RcclxuXHRcdCAqIHRoZSBnZW9tZXRyeSBvZiB0aGUgb2JqZWN0LCBvbmx5IHRoZSBsaWdodGluZy4gSWYgYSBub3JtYWwgbWFwIGlzIGRlZmluZWRcclxuXHRcdCAqIHRoaXMgd2lsbCBiZSBpZ25vcmVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5idW1wTWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvdyBtdWNoIHRoZSBidW1wIG1hcCBhZmZlY3RzIHRoZSBtYXRlcmlhbC4gVHlwaWNhbCByYW5nZSBpcyBgWzAsMV1gLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYnVtcFNjYWxlID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB0ZXh0dXJlIHRvIGNyZWF0ZSBhIG5vcm1hbCBtYXAuIFRoZSBSR0IgdmFsdWVzIGFmZmVjdCB0aGUgc3VyZmFjZVxyXG5cdFx0ICogbm9ybWFsIGZvciBlYWNoIHBpeGVsIGZyYWdtZW50IGFuZCBjaGFuZ2UgdGhlIHdheSB0aGUgY29sb3IgaXMgbGl0LiBOb3JtYWxcclxuXHRcdCAqIG1hcHMgZG8gbm90IGNoYW5nZSB0aGUgYWN0dWFsIHNoYXBlIG9mIHRoZSBzdXJmYWNlLCBvbmx5IHRoZSBsaWdodGluZy4gSW5cclxuXHRcdCAqIGNhc2UgdGhlIG1hdGVyaWFsIGhhcyBhIG5vcm1hbCBtYXAgYXV0aG9yZWQgdXNpbmcgdGhlIGxlZnQgaGFuZGVkXHJcblx0XHQgKiBjb252ZW50aW9uLCB0aGUgYHlgIGNvbXBvbmVudCBvZiBgbm9ybWFsU2NhbGVgIHNob3VsZCBiZSBuZWdhdGVkIHRvIGNvbXBlbnNhdGVcclxuXHRcdCAqIGZvciB0aGUgZGlmZmVyZW50IGhhbmRlZG5lc3MuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vcm1hbE1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdHlwZSBvZiBub3JtYWwgbWFwLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoVGFuZ2VudFNwYWNlTm9ybWFsTWFwfE9iamVjdFNwYWNlTm9ybWFsTWFwKX1cclxuXHRcdCAqIEBkZWZhdWx0IFRhbmdlbnRTcGFjZU5vcm1hbE1hcFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vcm1hbE1hcFR5cGUgPSBUYW5nZW50U3BhY2VOb3JtYWxNYXA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3cgbXVjaCB0aGUgbm9ybWFsIG1hcCBhZmZlY3RzIHRoZSBtYXRlcmlhbC4gVHlwaWNhbCB2YWx1ZSByYW5nZSBpcyBgWzAsMV1gLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3IyfVxyXG5cdFx0ICogQGRlZmF1bHQgKDEsMSlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub3JtYWxTY2FsZSA9IG5ldyBWZWN0b3IyKCAxLCAxICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZGlzcGxhY2VtZW50IG1hcCBhZmZlY3RzIHRoZSBwb3NpdGlvbiBvZiB0aGUgbWVzaCdzIHZlcnRpY2VzLiBVbmxpa2VcclxuXHRcdCAqIG90aGVyIG1hcHMgd2hpY2ggb25seSBhZmZlY3QgdGhlIGxpZ2h0IGFuZCBzaGFkZSBvZiB0aGUgbWF0ZXJpYWwgdGhlXHJcblx0XHQgKiBkaXNwbGFjZWQgdmVydGljZXMgY2FuIGNhc3Qgc2hhZG93cywgYmxvY2sgb3RoZXIgb2JqZWN0cywgYW5kIG90aGVyd2lzZVxyXG5cdFx0ICogYWN0IGFzIHJlYWwgZ2VvbWV0cnkuIFRoZSBkaXNwbGFjZW1lbnQgdGV4dHVyZSBpcyBhbiBpbWFnZSB3aGVyZSB0aGUgdmFsdWVcclxuXHRcdCAqIG9mIGVhY2ggcGl4ZWwgKHdoaXRlIGJlaW5nIHRoZSBoaWdoZXN0KSBpcyBtYXBwZWQgYWdhaW5zdCwgYW5kXHJcblx0XHQgKiByZXBvc2l0aW9ucywgdGhlIHZlcnRpY2VzIG9mIHRoZSBtZXNoLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG93IG11Y2ggdGhlIGRpc3BsYWNlbWVudCBtYXAgYWZmZWN0cyB0aGUgbWVzaCAod2hlcmUgYmxhY2sgaXMgbm9cclxuXHRcdCAqIGRpc3BsYWNlbWVudCwgYW5kIHdoaXRlIGlzIG1heGltdW0gZGlzcGxhY2VtZW50KS4gV2l0aG91dCBhIGRpc3BsYWNlbWVudFxyXG5cdFx0ICogbWFwIHNldCwgdGhpcyB2YWx1ZSBpcyBub3QgYXBwbGllZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBvZmZzZXQgb2YgdGhlIGRpc3BsYWNlbWVudCBtYXAncyB2YWx1ZXMgb24gdGhlIG1lc2gncyB2ZXJ0aWNlcy5cclxuXHRcdCAqIFRoZSBiaWFzIGlzIGFkZGVkIHRvIHRoZSBzY2FsZWQgc2FtcGxlIG9mIHRoZSBkaXNwbGFjZW1lbnQgbWFwLlxyXG5cdFx0ICogV2l0aG91dCBhIGRpc3BsYWNlbWVudCBtYXAgc2V0LCB0aGlzIHZhbHVlIGlzIG5vdCBhcHBsaWVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZW5kZXJzIHRoZSBnZW9tZXRyeSBhcyBhIHdpcmVmcmFtZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMud2lyZWZyYW1lID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDb250cm9scyB0aGUgdGhpY2tuZXNzIG9mIHRoZSB3aXJlZnJhbWUuXHJcblx0XHQgKlxyXG5cdFx0ICogV2ViR0wgYW5kIFdlYkdQVSBpZ25vcmUgdGhpcyBwcm9wZXJ0eSBhbmQgYWx3YXlzIHJlbmRlclxyXG5cdFx0ICogMSBwaXhlbCB3aWRlIGxpbmVzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIG1hdGVyaWFsIGlzIHJlbmRlcmVkIHdpdGggZmxhdCBzaGFkaW5nIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZmxhdFNoYWRpbmcgPSBmYWxzZTtcclxuXHJcblx0XHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLmJ1bXBNYXAgPSBzb3VyY2UuYnVtcE1hcDtcclxuXHRcdHRoaXMuYnVtcFNjYWxlID0gc291cmNlLmJ1bXBTY2FsZTtcclxuXHJcblx0XHR0aGlzLm5vcm1hbE1hcCA9IHNvdXJjZS5ub3JtYWxNYXA7XHJcblx0XHR0aGlzLm5vcm1hbE1hcFR5cGUgPSBzb3VyY2Uubm9ybWFsTWFwVHlwZTtcclxuXHRcdHRoaXMubm9ybWFsU2NhbGUuY29weSggc291cmNlLm5vcm1hbFNjYWxlICk7XHJcblxyXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBzb3VyY2UuZGlzcGxhY2VtZW50TWFwO1xyXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHNvdXJjZS5kaXNwbGFjZW1lbnRTY2FsZTtcclxuXHRcdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IHNvdXJjZS5kaXNwbGFjZW1lbnRCaWFzO1xyXG5cclxuXHRcdHRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTtcclxuXHRcdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFtZUxpbmV3aWR0aDtcclxuXHJcblx0XHR0aGlzLmZsYXRTaGFkaW5nID0gc291cmNlLmZsYXRTaGFkaW5nO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBNZXNoTm9ybWFsTWF0ZXJpYWwgfTtcclxuIiwiaW1wb3J0IHsgTXVsdGlwbHlPcGVyYXRpb24sIFRhbmdlbnRTcGFjZU5vcm1hbE1hcCB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IE1hdGVyaWFsIH0gZnJvbSAnLi9NYXRlcmlhbC5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjIuanMnO1xyXG5pbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uL21hdGgvQ29sb3IuanMnO1xyXG5pbXBvcnQgeyBFdWxlciB9IGZyb20gJy4uL21hdGgvRXVsZXIuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgbWF0ZXJpYWwgZm9yIG5vbi1zaGlueSBzdXJmYWNlcywgd2l0aG91dCBzcGVjdWxhciBoaWdobGlnaHRzLlxyXG4gKlxyXG4gKiBUaGUgbWF0ZXJpYWwgdXNlcyBhIG5vbi1waHlzaWNhbGx5IGJhc2VkIFtMYW1iZXJ0aWFuXXtAbGluayBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MYW1iZXJ0aWFuX3JlZmxlY3RhbmNlfVxyXG4gKiBtb2RlbCBmb3IgY2FsY3VsYXRpbmcgcmVmbGVjdGFuY2UuIFRoaXMgY2FuIHNpbXVsYXRlIHNvbWUgc3VyZmFjZXMgKHN1Y2hcclxuICogYXMgdW50cmVhdGVkIHdvb2Qgb3Igc3RvbmUpIHdlbGwsIGJ1dCBjYW5ub3Qgc2ltdWxhdGUgc2hpbnkgc3VyZmFjZXMgd2l0aFxyXG4gKiBzcGVjdWxhciBoaWdobGlnaHRzIChzdWNoIGFzIHZhcm5pc2hlZCB3b29kKS4gYE1lc2hMYW1iZXJ0TWF0ZXJpYWxgIHVzZXMgcGVyLWZyYWdtZW50XHJcbiAqIHNoYWRpbmcuXHJcbiAqXHJcbiAqIER1ZSB0byB0aGUgc2ltcGxpY2l0eSBvZiB0aGUgcmVmbGVjdGFuY2UgYW5kIGlsbHVtaW5hdGlvbiBtb2RlbHMsXHJcbiAqIHBlcmZvcm1hbmNlIHdpbGwgYmUgZ3JlYXRlciB3aGVuIHVzaW5nIHRoaXMgbWF0ZXJpYWwgb3ZlciB0aGVcclxuICoge0BsaW5rIE1lc2hQaG9uZ01hdGVyaWFsfSwge0BsaW5rIE1lc2hTdGFuZGFyZE1hdGVyaWFsfSBvclxyXG4gKiB7QGxpbmsgTWVzaFBoeXNpY2FsTWF0ZXJpYWx9LCBhdCB0aGUgY29zdCBvZiBzb21lIGdyYXBoaWNhbCBhY2N1cmFjeS5cclxuICpcclxuICogQGF1Z21lbnRzIE1hdGVyaWFsXHJcbiAqL1xyXG5jbGFzcyBNZXNoTGFtYmVydE1hdGVyaWFsIGV4dGVuZHMgTWF0ZXJpYWwge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG1lc2ggbGFtYmVydCBtYXRlcmlhbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1ldGVyc10gLSBBbiBvYmplY3Qgd2l0aCBvbmUgb3IgbW9yZSBwcm9wZXJ0aWVzXHJcblx0ICogZGVmaW5pbmcgdGhlIG1hdGVyaWFsJ3MgYXBwZWFyYW5jZS4gQW55IHByb3BlcnR5IG9mIHRoZSBtYXRlcmlhbFxyXG5cdCAqIChpbmNsdWRpbmcgYW55IHByb3BlcnR5IGZyb20gaW5oZXJpdGVkIG1hdGVyaWFscykgY2FuIGJlIHBhc3NlZFxyXG5cdCAqIGluIGhlcmUuIENvbG9yIHZhbHVlcyBjYW4gYmUgcGFzc2VkIGFueSB0eXBlIG9mIHZhbHVlIGFjY2VwdGVkXHJcblx0ICogYnkge0BsaW5rIENvbG9yI3NldH0uXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHBhcmFtZXRlcnMgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNNZXNoTGFtYmVydE1hdGVyaWFsID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnTWVzaExhbWJlcnRNYXRlcmlhbCc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDb2xvciBvZiB0aGUgbWF0ZXJpYWwuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0NvbG9yfVxyXG5cdFx0ICogQGRlZmF1bHQgKDEsMSwxKVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCAweGZmZmZmZiApOyAvLyBkaWZmdXNlXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY29sb3IgbWFwLiBNYXkgb3B0aW9uYWxseSBpbmNsdWRlIGFuIGFscGhhIGNoYW5uZWwsIHR5cGljYWxseSBjb21iaW5lZFxyXG5cdFx0ICogd2l0aCB7QGxpbmsgTWF0ZXJpYWwjdHJhbnNwYXJlbnR9IG9yIHtAbGluayBNYXRlcmlhbCNhbHBoYVRlc3R9LiBUaGUgdGV4dHVyZSBtYXBcclxuXHRcdCAqIGNvbG9yIGlzIG1vZHVsYXRlZCBieSB0aGUgZGlmZnVzZSBgY29sb3JgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGxpZ2h0IG1hcC4gUmVxdWlyZXMgYSBzZWNvbmQgc2V0IG9mIFVWcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGlnaHRNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSW50ZW5zaXR5IG9mIHRoZSBiYWtlZCBsaWdodC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gMS4wO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJlZCBjaGFubmVsIG9mIHRoaXMgdGV4dHVyZSBpcyB1c2VkIGFzIHRoZSBhbWJpZW50IG9jY2x1c2lvbiBtYXAuXHJcblx0XHQgKiBSZXF1aXJlcyBhIHNlY29uZCBzZXQgb2YgVVZzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hb01hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBJbnRlbnNpdHkgb2YgdGhlIGFtYmllbnQgb2NjbHVzaW9uIGVmZmVjdC4gUmFuZ2UgaXMgYFswLDFdYCwgd2hlcmUgYDBgXHJcblx0XHQgKiBkaXNhYmxlcyBhbWJpZW50IG9jY2x1c2lvbi4gV2hlcmUgaW50ZW5zaXR5IGlzIGAxYCBhbmQgdGhlIEFPIG1hcCdzXHJcblx0XHQgKiByZWQgY2hhbm5lbCBpcyBhbHNvIGAxYCwgYW1iaWVudCBsaWdodCBpcyBmdWxseSBvY2NsdWRlZCBvbiBhIHN1cmZhY2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hb01hcEludGVuc2l0eSA9IDEuMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEVtaXNzaXZlIChsaWdodCkgY29sb3Igb2YgdGhlIG1hdGVyaWFsLCBlc3NlbnRpYWxseSBhIHNvbGlkIGNvbG9yXHJcblx0XHQgKiB1bmFmZmVjdGVkIGJ5IG90aGVyIGxpZ2h0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtDb2xvcn1cclxuXHRcdCAqIEBkZWZhdWx0ICgwLDAsMClcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5lbWlzc2l2ZSA9IG5ldyBDb2xvciggMHgwMDAwMDAgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEludGVuc2l0eSBvZiB0aGUgZW1pc3NpdmUgbGlnaHQuIE1vZHVsYXRlcyB0aGUgZW1pc3NpdmUgY29sb3IuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IDEuMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNldCBlbWlzc2l2ZSAoZ2xvdykgbWFwLiBUaGUgZW1pc3NpdmUgbWFwIGNvbG9yIGlzIG1vZHVsYXRlZCBieSB0aGVcclxuXHRcdCAqIGVtaXNzaXZlIGNvbG9yIGFuZCB0aGUgZW1pc3NpdmUgaW50ZW5zaXR5LiBJZiB5b3UgaGF2ZSBhbiBlbWlzc2l2ZSBtYXAsXHJcblx0XHQgKiBiZSBzdXJlIHRvIHNldCB0aGUgZW1pc3NpdmUgY29sb3IgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gYmxhY2suXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmVtaXNzaXZlTWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB0ZXh0dXJlIHRvIGNyZWF0ZSBhIGJ1bXAgbWFwLiBUaGUgYmxhY2sgYW5kIHdoaXRlIHZhbHVlcyBtYXAgdG8gdGhlXHJcblx0XHQgKiBwZXJjZWl2ZWQgZGVwdGggaW4gcmVsYXRpb24gdG8gdGhlIGxpZ2h0cy4gQnVtcCBkb2Vzbid0IGFjdHVhbGx5IGFmZmVjdFxyXG5cdFx0ICogdGhlIGdlb21ldHJ5IG9mIHRoZSBvYmplY3QsIG9ubHkgdGhlIGxpZ2h0aW5nLiBJZiBhIG5vcm1hbCBtYXAgaXMgZGVmaW5lZFxyXG5cdFx0ICogdGhpcyB3aWxsIGJlIGlnbm9yZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJ1bXBNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG93IG11Y2ggdGhlIGJ1bXAgbWFwIGFmZmVjdHMgdGhlIG1hdGVyaWFsLiBUeXBpY2FsIHJhbmdlIGlzIGBbMCwxXWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5idW1wU2NhbGUgPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHRleHR1cmUgdG8gY3JlYXRlIGEgbm9ybWFsIG1hcC4gVGhlIFJHQiB2YWx1ZXMgYWZmZWN0IHRoZSBzdXJmYWNlXHJcblx0XHQgKiBub3JtYWwgZm9yIGVhY2ggcGl4ZWwgZnJhZ21lbnQgYW5kIGNoYW5nZSB0aGUgd2F5IHRoZSBjb2xvciBpcyBsaXQuIE5vcm1hbFxyXG5cdFx0ICogbWFwcyBkbyBub3QgY2hhbmdlIHRoZSBhY3R1YWwgc2hhcGUgb2YgdGhlIHN1cmZhY2UsIG9ubHkgdGhlIGxpZ2h0aW5nLiBJblxyXG5cdFx0ICogY2FzZSB0aGUgbWF0ZXJpYWwgaGFzIGEgbm9ybWFsIG1hcCBhdXRob3JlZCB1c2luZyB0aGUgbGVmdCBoYW5kZWRcclxuXHRcdCAqIGNvbnZlbnRpb24sIHRoZSBgeWAgY29tcG9uZW50IG9mIGBub3JtYWxTY2FsZWAgc2hvdWxkIGJlIG5lZ2F0ZWQgdG8gY29tcGVuc2F0ZVxyXG5cdFx0ICogZm9yIHRoZSBkaWZmZXJlbnQgaGFuZGVkbmVzcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9ybWFsTWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB0eXBlIG9mIG5vcm1hbCBtYXAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeyhUYW5nZW50U3BhY2VOb3JtYWxNYXB8T2JqZWN0U3BhY2VOb3JtYWxNYXApfVxyXG5cdFx0ICogQGRlZmF1bHQgVGFuZ2VudFNwYWNlTm9ybWFsTWFwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9ybWFsTWFwVHlwZSA9IFRhbmdlbnRTcGFjZU5vcm1hbE1hcDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvdyBtdWNoIHRoZSBub3JtYWwgbWFwIGFmZmVjdHMgdGhlIG1hdGVyaWFsLiBUeXBpY2FsIHZhbHVlIHJhbmdlIGlzIGBbMCwxXWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjJ9XHJcblx0XHQgKiBAZGVmYXVsdCAoMSwxKVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vcm1hbFNjYWxlID0gbmV3IFZlY3RvcjIoIDEsIDEgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBkaXNwbGFjZW1lbnQgbWFwIGFmZmVjdHMgdGhlIHBvc2l0aW9uIG9mIHRoZSBtZXNoJ3MgdmVydGljZXMuIFVubGlrZVxyXG5cdFx0ICogb3RoZXIgbWFwcyB3aGljaCBvbmx5IGFmZmVjdCB0aGUgbGlnaHQgYW5kIHNoYWRlIG9mIHRoZSBtYXRlcmlhbCB0aGVcclxuXHRcdCAqIGRpc3BsYWNlZCB2ZXJ0aWNlcyBjYW4gY2FzdCBzaGFkb3dzLCBibG9jayBvdGhlciBvYmplY3RzLCBhbmQgb3RoZXJ3aXNlXHJcblx0XHQgKiBhY3QgYXMgcmVhbCBnZW9tZXRyeS4gVGhlIGRpc3BsYWNlbWVudCB0ZXh0dXJlIGlzIGFuIGltYWdlIHdoZXJlIHRoZSB2YWx1ZVxyXG5cdFx0ICogb2YgZWFjaCBwaXhlbCAod2hpdGUgYmVpbmcgdGhlIGhpZ2hlc3QpIGlzIG1hcHBlZCBhZ2FpbnN0LCBhbmRcclxuXHRcdCAqIHJlcG9zaXRpb25zLCB0aGUgdmVydGljZXMgb2YgdGhlIG1lc2guXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3cgbXVjaCB0aGUgZGlzcGxhY2VtZW50IG1hcCBhZmZlY3RzIHRoZSBtZXNoICh3aGVyZSBibGFjayBpcyBub1xyXG5cdFx0ICogZGlzcGxhY2VtZW50LCBhbmQgd2hpdGUgaXMgbWF4aW11bSBkaXNwbGFjZW1lbnQpLiBXaXRob3V0IGEgZGlzcGxhY2VtZW50XHJcblx0XHQgKiBtYXAgc2V0LCB0aGlzIHZhbHVlIGlzIG5vdCBhcHBsaWVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG9mZnNldCBvZiB0aGUgZGlzcGxhY2VtZW50IG1hcCdzIHZhbHVlcyBvbiB0aGUgbWVzaCdzIHZlcnRpY2VzLlxyXG5cdFx0ICogVGhlIGJpYXMgaXMgYWRkZWQgdG8gdGhlIHNjYWxlZCBzYW1wbGUgb2YgdGhlIGRpc3BsYWNlbWVudCBtYXAuXHJcblx0XHQgKiBXaXRob3V0IGEgZGlzcGxhY2VtZW50IG1hcCBzZXQsIHRoaXMgdmFsdWUgaXMgbm90IGFwcGxpZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNwZWN1bGFyIG1hcCB1c2VkIGJ5IHRoZSBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc3BlY3VsYXJNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGFscGhhIG1hcCBpcyBhIGdyYXlzY2FsZSB0ZXh0dXJlIHRoYXQgY29udHJvbHMgdGhlIG9wYWNpdHkgYWNyb3NzIHRoZVxyXG5cdFx0ICogc3VyZmFjZSAoYmxhY2s6IGZ1bGx5IHRyYW5zcGFyZW50OyB3aGl0ZTogZnVsbHkgb3BhcXVlKS5cclxuXHRcdCAqXHJcblx0XHQgKiBPbmx5IHRoZSBjb2xvciBvZiB0aGUgdGV4dHVyZSBpcyB1c2VkLCBpZ25vcmluZyB0aGUgYWxwaGEgY2hhbm5lbCBpZiBvbmVcclxuXHRcdCAqIGV4aXN0cy4gRm9yIFJHQiBhbmQgUkdCQSB0ZXh0dXJlcywgdGhlIHJlbmRlcmVyIHdpbGwgdXNlIHRoZSBncmVlbiBjaGFubmVsXHJcblx0XHQgKiB3aGVuIHNhbXBsaW5nIHRoaXMgdGV4dHVyZSBkdWUgdG8gdGhlIGV4dHJhIGJpdCBvZiBwcmVjaXNpb24gcHJvdmlkZWQgZm9yXHJcblx0XHQgKiBncmVlbiBpbiBEWFQtY29tcHJlc3NlZCBhbmQgdW5jb21wcmVzc2VkIFJHQiA1NjUgZm9ybWF0cy4gTHVtaW5hbmNlLW9ubHkgYW5kXHJcblx0XHQgKiBsdW1pbmFuY2UvYWxwaGEgdGV4dHVyZXMgd2lsbCBhbHNvIHN0aWxsIHdvcmsgYXMgZXhwZWN0ZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFscGhhTWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBlbnZpcm9ubWVudCBtYXAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmVudk1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcm90YXRpb24gb2YgdGhlIGVudmlyb25tZW50IG1hcCBpbiByYWRpYW5zLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtFdWxlcn1cclxuXHRcdCAqIEBkZWZhdWx0ICgwLDAsMClcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5lbnZNYXBSb3RhdGlvbiA9IG5ldyBFdWxlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG93IHRvIGNvbWJpbmUgdGhlIHJlc3VsdCBvZiB0aGUgc3VyZmFjZSdzIGNvbG9yIHdpdGggdGhlIGVudmlyb25tZW50IG1hcCwgaWYgYW55LlxyXG5cdFx0ICpcclxuXHRcdCAqIFdoZW4gc2V0IHRvIGBNaXhPcGVyYXRpb25gLCB0aGUge0BsaW5rIE1lc2hCYXNpY01hdGVyaWFsI3JlZmxlY3Rpdml0eX0gaXMgdXNlZCB0b1xyXG5cdFx0ICogYmxlbmQgYmV0d2VlbiB0aGUgdHdvIGNvbG9ycy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KE11bHRpcGx5T3BlcmF0aW9ufE1peE9wZXJhdGlvbnxBZGRPcGVyYXRpb24pfVxyXG5cdFx0ICogQGRlZmF1bHQgTXVsdGlwbHlPcGVyYXRpb25cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb21iaW5lID0gTXVsdGlwbHlPcGVyYXRpb247XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3cgbXVjaCB0aGUgZW52aXJvbm1lbnQgbWFwIGFmZmVjdHMgdGhlIHN1cmZhY2UuXHJcblx0XHQgKiBUaGUgdmFsaWQgcmFuZ2UgaXMgYmV0d2VlbiBgMGAgKG5vIHJlZmxlY3Rpb25zKSBhbmQgYDFgIChmdWxsIHJlZmxlY3Rpb25zKS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJlZmxlY3Rpdml0eSA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgaW5kZXggb2YgcmVmcmFjdGlvbiAoSU9SKSBvZiBhaXIgKGFwcHJveGltYXRlbHkgMSkgZGl2aWRlZCBieSB0aGVcclxuXHRcdCAqIGluZGV4IG9mIHJlZnJhY3Rpb24gb2YgdGhlIG1hdGVyaWFsLiBJdCBpcyB1c2VkIHdpdGggZW52aXJvbm1lbnQgbWFwcGluZ1xyXG5cdFx0ICogbW9kZXMge0BsaW5rIEN1YmVSZWZyYWN0aW9uTWFwcGluZ30gYW5kIHtAbGluayBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZ30uXHJcblx0XHQgKiBUaGUgcmVmcmFjdGlvbiByYXRpbyBzaG91bGQgbm90IGV4Y2VlZCBgMWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDAuOThcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yZWZyYWN0aW9uUmF0aW8gPSAwLjk4O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVuZGVycyB0aGUgZ2VvbWV0cnkgYXMgYSB3aXJlZnJhbWUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLndpcmVmcmFtZSA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQ29udHJvbHMgdGhlIHRoaWNrbmVzcyBvZiB0aGUgd2lyZWZyYW1lLlxyXG5cdFx0ICpcclxuXHRcdCAqIENhbiBvbmx5IGJlIHVzZWQgd2l0aCB7QGxpbmsgU1ZHUmVuZGVyZXJ9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgYXBwZWFyYW5jZSBvZiB3aXJlZnJhbWUgZW5kcy5cclxuXHRcdCAqXHJcblx0XHQgKiBDYW4gb25seSBiZSB1c2VkIHdpdGgge0BsaW5rIFNWR1JlbmRlcmVyfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KCdyb3VuZCd8J2JldmVsJ3wnbWl0ZXInKX1cclxuXHRcdCAqIEBkZWZhdWx0ICdyb3VuZCdcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy53aXJlZnJhbWVMaW5lY2FwID0gJ3JvdW5kJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgYXBwZWFyYW5jZSBvZiB3aXJlZnJhbWUgam9pbnRzLlxyXG5cdFx0ICpcclxuXHRcdCAqIENhbiBvbmx5IGJlIHVzZWQgd2l0aCB7QGxpbmsgU1ZHUmVuZGVyZXJ9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoJ3JvdW5kJ3wnYmV2ZWwnfCdtaXRlcicpfVxyXG5cdFx0ICogQGRlZmF1bHQgJ3JvdW5kJ1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gJ3JvdW5kJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIG1hdGVyaWFsIGlzIHJlbmRlcmVkIHdpdGggZmxhdCBzaGFkaW5nIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZmxhdFNoYWRpbmcgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIG1hdGVyaWFsIGlzIGFmZmVjdGVkIGJ5IGZvZyBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZm9nID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xyXG5cclxuXHRcdHRoaXMubWFwID0gc291cmNlLm1hcDtcclxuXHJcblx0XHR0aGlzLmxpZ2h0TWFwID0gc291cmNlLmxpZ2h0TWFwO1xyXG5cdFx0dGhpcy5saWdodE1hcEludGVuc2l0eSA9IHNvdXJjZS5saWdodE1hcEludGVuc2l0eTtcclxuXHJcblx0XHR0aGlzLmFvTWFwID0gc291cmNlLmFvTWFwO1xyXG5cdFx0dGhpcy5hb01hcEludGVuc2l0eSA9IHNvdXJjZS5hb01hcEludGVuc2l0eTtcclxuXHJcblx0XHR0aGlzLmVtaXNzaXZlLmNvcHkoIHNvdXJjZS5lbWlzc2l2ZSApO1xyXG5cdFx0dGhpcy5lbWlzc2l2ZU1hcCA9IHNvdXJjZS5lbWlzc2l2ZU1hcDtcclxuXHRcdHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgPSBzb3VyY2UuZW1pc3NpdmVJbnRlbnNpdHk7XHJcblxyXG5cdFx0dGhpcy5idW1wTWFwID0gc291cmNlLmJ1bXBNYXA7XHJcblx0XHR0aGlzLmJ1bXBTY2FsZSA9IHNvdXJjZS5idW1wU2NhbGU7XHJcblxyXG5cdFx0dGhpcy5ub3JtYWxNYXAgPSBzb3VyY2Uubm9ybWFsTWFwO1xyXG5cdFx0dGhpcy5ub3JtYWxNYXBUeXBlID0gc291cmNlLm5vcm1hbE1hcFR5cGU7XHJcblx0XHR0aGlzLm5vcm1hbFNjYWxlLmNvcHkoIHNvdXJjZS5ub3JtYWxTY2FsZSApO1xyXG5cclxuXHRcdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gc291cmNlLmRpc3BsYWNlbWVudE1hcDtcclxuXHRcdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSBzb3VyY2UuZGlzcGxhY2VtZW50U2NhbGU7XHJcblx0XHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSBzb3VyY2UuZGlzcGxhY2VtZW50QmlhcztcclxuXHJcblx0XHR0aGlzLnNwZWN1bGFyTWFwID0gc291cmNlLnNwZWN1bGFyTWFwO1xyXG5cclxuXHRcdHRoaXMuYWxwaGFNYXAgPSBzb3VyY2UuYWxwaGFNYXA7XHJcblxyXG5cdFx0dGhpcy5lbnZNYXAgPSBzb3VyY2UuZW52TWFwO1xyXG5cdFx0dGhpcy5lbnZNYXBSb3RhdGlvbi5jb3B5KCBzb3VyY2UuZW52TWFwUm90YXRpb24gKTtcclxuXHRcdHRoaXMuY29tYmluZSA9IHNvdXJjZS5jb21iaW5lO1xyXG5cdFx0dGhpcy5yZWZsZWN0aXZpdHkgPSBzb3VyY2UucmVmbGVjdGl2aXR5O1xyXG5cdFx0dGhpcy5yZWZyYWN0aW9uUmF0aW8gPSBzb3VyY2UucmVmcmFjdGlvblJhdGlvO1xyXG5cclxuXHRcdHRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTtcclxuXHRcdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFtZUxpbmV3aWR0aDtcclxuXHRcdHRoaXMud2lyZWZyYW1lTGluZWNhcCA9IHNvdXJjZS53aXJlZnJhbWVMaW5lY2FwO1xyXG5cdFx0dGhpcy53aXJlZnJhbWVMaW5lam9pbiA9IHNvdXJjZS53aXJlZnJhbWVMaW5lam9pbjtcclxuXHJcblx0XHR0aGlzLmZsYXRTaGFkaW5nID0gc291cmNlLmZsYXRTaGFkaW5nO1xyXG5cclxuXHRcdHRoaXMuZm9nID0gc291cmNlLmZvZztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgTWVzaExhbWJlcnRNYXRlcmlhbCB9O1xyXG4iLCJpbXBvcnQgeyBNYXRlcmlhbCB9IGZyb20gJy4vTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyBCYXNpY0RlcHRoUGFja2luZyB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XHJcblxyXG4vKipcclxuICogQSBtYXRlcmlhbCBmb3IgZHJhd2luZyBnZW9tZXRyeSBieSBkZXB0aC4gRGVwdGggaXMgYmFzZWQgb2ZmIG9mIHRoZSBjYW1lcmFcclxuICogbmVhciBhbmQgZmFyIHBsYW5lLiBXaGl0ZSBpcyBuZWFyZXN0LCBibGFjayBpcyBmYXJ0aGVzdC5cclxuICpcclxuICogQGF1Z21lbnRzIE1hdGVyaWFsXHJcbiAqL1xyXG5jbGFzcyBNZXNoRGVwdGhNYXRlcmlhbCBleHRlbmRzIE1hdGVyaWFsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBtZXNoIGRlcHRoIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbWV0ZXJzXSAtIEFuIG9iamVjdCB3aXRoIG9uZSBvciBtb3JlIHByb3BlcnRpZXNcclxuXHQgKiBkZWZpbmluZyB0aGUgbWF0ZXJpYWwncyBhcHBlYXJhbmNlLiBBbnkgcHJvcGVydHkgb2YgdGhlIG1hdGVyaWFsXHJcblx0ICogKGluY2x1ZGluZyBhbnkgcHJvcGVydHkgZnJvbSBpbmhlcml0ZWQgbWF0ZXJpYWxzKSBjYW4gYmUgcGFzc2VkXHJcblx0ICogaW4gaGVyZS4gQ29sb3IgdmFsdWVzIGNhbiBiZSBwYXNzZWQgYW55IHR5cGUgb2YgdmFsdWUgYWNjZXB0ZWRcclxuXHQgKiBieSB7QGxpbmsgQ29sb3Ijc2V0fS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVycyApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc01lc2hEZXB0aE1hdGVyaWFsID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnTWVzaERlcHRoTWF0ZXJpYWwnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVHlwZSBmb3IgZGVwdGggcGFja2luZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KEJhc2ljRGVwdGhQYWNraW5nfFJHQkFEZXB0aFBhY2tpbmd8UkdCRGVwdGhQYWNraW5nfFJHRGVwdGhQYWNraW5nKX1cclxuXHRcdCAqIEBkZWZhdWx0IEJhc2ljRGVwdGhQYWNraW5nXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGVwdGhQYWNraW5nID0gQmFzaWNEZXB0aFBhY2tpbmc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY29sb3IgbWFwLiBNYXkgb3B0aW9uYWxseSBpbmNsdWRlIGFuIGFscGhhIGNoYW5uZWwsIHR5cGljYWxseSBjb21iaW5lZFxyXG5cdFx0ICogd2l0aCB7QGxpbmsgTWF0ZXJpYWwjdHJhbnNwYXJlbnR9IG9yIHtAbGluayBNYXRlcmlhbCNhbHBoYVRlc3R9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGFscGhhIG1hcCBpcyBhIGdyYXlzY2FsZSB0ZXh0dXJlIHRoYXQgY29udHJvbHMgdGhlIG9wYWNpdHkgYWNyb3NzIHRoZVxyXG5cdFx0ICogc3VyZmFjZSAoYmxhY2s6IGZ1bGx5IHRyYW5zcGFyZW50OyB3aGl0ZTogZnVsbHkgb3BhcXVlKS5cclxuXHRcdCAqXHJcblx0XHQgKiBPbmx5IHRoZSBjb2xvciBvZiB0aGUgdGV4dHVyZSBpcyB1c2VkLCBpZ25vcmluZyB0aGUgYWxwaGEgY2hhbm5lbCBpZiBvbmVcclxuXHRcdCAqIGV4aXN0cy4gRm9yIFJHQiBhbmQgUkdCQSB0ZXh0dXJlcywgdGhlIHJlbmRlcmVyIHdpbGwgdXNlIHRoZSBncmVlbiBjaGFubmVsXHJcblx0XHQgKiB3aGVuIHNhbXBsaW5nIHRoaXMgdGV4dHVyZSBkdWUgdG8gdGhlIGV4dHJhIGJpdCBvZiBwcmVjaXNpb24gcHJvdmlkZWQgZm9yXHJcblx0XHQgKiBncmVlbiBpbiBEWFQtY29tcHJlc3NlZCBhbmQgdW5jb21wcmVzc2VkIFJHQiA1NjUgZm9ybWF0cy4gTHVtaW5hbmNlLW9ubHkgYW5kXHJcblx0XHQgKiBsdW1pbmFuY2UvYWxwaGEgdGV4dHVyZXMgd2lsbCBhbHNvIHN0aWxsIHdvcmsgYXMgZXhwZWN0ZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFscGhhTWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBkaXNwbGFjZW1lbnQgbWFwIGFmZmVjdHMgdGhlIHBvc2l0aW9uIG9mIHRoZSBtZXNoJ3MgdmVydGljZXMuIFVubGlrZVxyXG5cdFx0ICogb3RoZXIgbWFwcyB3aGljaCBvbmx5IGFmZmVjdCB0aGUgbGlnaHQgYW5kIHNoYWRlIG9mIHRoZSBtYXRlcmlhbCB0aGVcclxuXHRcdCAqIGRpc3BsYWNlZCB2ZXJ0aWNlcyBjYW4gY2FzdCBzaGFkb3dzLCBibG9jayBvdGhlciBvYmplY3RzLCBhbmQgb3RoZXJ3aXNlXHJcblx0XHQgKiBhY3QgYXMgcmVhbCBnZW9tZXRyeS4gVGhlIGRpc3BsYWNlbWVudCB0ZXh0dXJlIGlzIGFuIGltYWdlIHdoZXJlIHRoZSB2YWx1ZVxyXG5cdFx0ICogb2YgZWFjaCBwaXhlbCAod2hpdGUgYmVpbmcgdGhlIGhpZ2hlc3QpIGlzIG1hcHBlZCBhZ2FpbnN0LCBhbmRcclxuXHRcdCAqIHJlcG9zaXRpb25zLCB0aGUgdmVydGljZXMgb2YgdGhlIG1lc2guXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3cgbXVjaCB0aGUgZGlzcGxhY2VtZW50IG1hcCBhZmZlY3RzIHRoZSBtZXNoICh3aGVyZSBibGFjayBpcyBub1xyXG5cdFx0ICogZGlzcGxhY2VtZW50LCBhbmQgd2hpdGUgaXMgbWF4aW11bSBkaXNwbGFjZW1lbnQpLiBXaXRob3V0IGEgZGlzcGxhY2VtZW50XHJcblx0XHQgKiBtYXAgc2V0LCB0aGlzIHZhbHVlIGlzIG5vdCBhcHBsaWVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG9mZnNldCBvZiB0aGUgZGlzcGxhY2VtZW50IG1hcCdzIHZhbHVlcyBvbiB0aGUgbWVzaCdzIHZlcnRpY2VzLlxyXG5cdFx0ICogVGhlIGJpYXMgaXMgYWRkZWQgdG8gdGhlIHNjYWxlZCBzYW1wbGUgb2YgdGhlIGRpc3BsYWNlbWVudCBtYXAuXHJcblx0XHQgKiBXaXRob3V0IGEgZGlzcGxhY2VtZW50IG1hcCBzZXQsIHRoaXMgdmFsdWUgaXMgbm90IGFwcGxpZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlbmRlcnMgdGhlIGdlb21ldHJ5IGFzIGEgd2lyZWZyYW1lLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy53aXJlZnJhbWUgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENvbnRyb2xzIHRoZSB0aGlja25lc3Mgb2YgdGhlIHdpcmVmcmFtZS5cclxuXHRcdCAqXHJcblx0XHQgKiBXZWJHTCBhbmQgV2ViR1BVIGlnbm9yZSB0aGlzIHByb3BlcnR5IGFuZCBhbHdheXMgcmVuZGVyXHJcblx0XHQgKiAxIHBpeGVsIHdpZGUgbGluZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxO1xyXG5cclxuXHRcdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMuZGVwdGhQYWNraW5nID0gc291cmNlLmRlcHRoUGFja2luZztcclxuXHJcblx0XHR0aGlzLm1hcCA9IHNvdXJjZS5tYXA7XHJcblxyXG5cdFx0dGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDtcclxuXHJcblx0XHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IHNvdXJjZS5kaXNwbGFjZW1lbnRNYXA7XHJcblx0XHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gc291cmNlLmRpc3BsYWNlbWVudFNjYWxlO1xyXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gc291cmNlLmRpc3BsYWNlbWVudEJpYXM7XHJcblxyXG5cdFx0dGhpcy53aXJlZnJhbWUgPSBzb3VyY2Uud2lyZWZyYW1lO1xyXG5cdFx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBNZXNoRGVwdGhNYXRlcmlhbCB9O1xyXG4iLCJpbXBvcnQgeyBNYXRlcmlhbCB9IGZyb20gJy4vTWF0ZXJpYWwuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgbWF0ZXJpYWwgdXNlZCBpbnRlcm5hbGx5IGZvciBpbXBsZW1lbnRpbmcgc2hhZG93IG1hcHBpbmcgd2l0aFxyXG4gKiBwb2ludCBsaWdodHMuXHJcbiAqXHJcbiAqIENhbiBhbHNvIGJlIHVzZWQgdG8gY3VzdG9taXplIHRoZSBzaGFkb3cgY2FzdGluZyBvZiBhbiBvYmplY3QgYnkgYXNzaWduaW5nXHJcbiAqIGFuIGluc3RhbmNlIG9mIGBNZXNoRGlzdGFuY2VNYXRlcmlhbGAgdG8ge0BsaW5rIE9iamVjdDNEI2N1c3RvbURpc3RhbmNlTWF0ZXJpYWx9LlxyXG4gKiBUaGUgZm9sbG93aW5nIGV4YW1wbGVzIGRlbW9uc3RyYXRlcyB0aGlzIGFwcHJvYWNoIGluIG9yZGVyIHRvIGVuc3VyZVxyXG4gKiB0cmFuc3BhcmVudCBwYXJ0cyBvZiBvYmplY3RzIGRvIG5vIGNhc3Qgc2hhZG93cy5cclxuICpcclxuICogQGF1Z21lbnRzIE1hdGVyaWFsXHJcbiAqL1xyXG5jbGFzcyBNZXNoRGlzdGFuY2VNYXRlcmlhbCBleHRlbmRzIE1hdGVyaWFsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBtZXNoIGRpc3RhbmNlIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbWV0ZXJzXSAtIEFuIG9iamVjdCB3aXRoIG9uZSBvciBtb3JlIHByb3BlcnRpZXNcclxuXHQgKiBkZWZpbmluZyB0aGUgbWF0ZXJpYWwncyBhcHBlYXJhbmNlLiBBbnkgcHJvcGVydHkgb2YgdGhlIG1hdGVyaWFsXHJcblx0ICogKGluY2x1ZGluZyBhbnkgcHJvcGVydHkgZnJvbSBpbmhlcml0ZWQgbWF0ZXJpYWxzKSBjYW4gYmUgcGFzc2VkXHJcblx0ICogaW4gaGVyZS4gQ29sb3IgdmFsdWVzIGNhbiBiZSBwYXNzZWQgYW55IHR5cGUgb2YgdmFsdWUgYWNjZXB0ZWRcclxuXHQgKiBieSB7QGxpbmsgQ29sb3Ijc2V0fS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVycyApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc01lc2hEaXN0YW5jZU1hdGVyaWFsID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnTWVzaERpc3RhbmNlTWF0ZXJpYWwnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNvbG9yIG1hcC4gTWF5IG9wdGlvbmFsbHkgaW5jbHVkZSBhbiBhbHBoYSBjaGFubmVsLCB0eXBpY2FsbHkgY29tYmluZWRcclxuXHRcdCAqIHdpdGgge0BsaW5rIE1hdGVyaWFsI3RyYW5zcGFyZW50fSBvciB7QGxpbmsgTWF0ZXJpYWwjYWxwaGFUZXN0fS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBhbHBoYSBtYXAgaXMgYSBncmF5c2NhbGUgdGV4dHVyZSB0aGF0IGNvbnRyb2xzIHRoZSBvcGFjaXR5IGFjcm9zcyB0aGVcclxuXHRcdCAqIHN1cmZhY2UgKGJsYWNrOiBmdWxseSB0cmFuc3BhcmVudDsgd2hpdGU6IGZ1bGx5IG9wYXF1ZSkuXHJcblx0XHQgKlxyXG5cdFx0ICogT25seSB0aGUgY29sb3Igb2YgdGhlIHRleHR1cmUgaXMgdXNlZCwgaWdub3JpbmcgdGhlIGFscGhhIGNoYW5uZWwgaWYgb25lXHJcblx0XHQgKiBleGlzdHMuIEZvciBSR0IgYW5kIFJHQkEgdGV4dHVyZXMsIHRoZSByZW5kZXJlciB3aWxsIHVzZSB0aGUgZ3JlZW4gY2hhbm5lbFxyXG5cdFx0ICogd2hlbiBzYW1wbGluZyB0aGlzIHRleHR1cmUgZHVlIHRvIHRoZSBleHRyYSBiaXQgb2YgcHJlY2lzaW9uIHByb3ZpZGVkIGZvclxyXG5cdFx0ICogZ3JlZW4gaW4gRFhULWNvbXByZXNzZWQgYW5kIHVuY29tcHJlc3NlZCBSR0IgNTY1IGZvcm1hdHMuIEx1bWluYW5jZS1vbmx5IGFuZFxyXG5cdFx0ICogbHVtaW5hbmNlL2FscGhhIHRleHR1cmVzIHdpbGwgYWxzbyBzdGlsbCB3b3JrIGFzIGV4cGVjdGVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hbHBoYU1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZGlzcGxhY2VtZW50IG1hcCBhZmZlY3RzIHRoZSBwb3NpdGlvbiBvZiB0aGUgbWVzaCdzIHZlcnRpY2VzLiBVbmxpa2VcclxuXHRcdCAqIG90aGVyIG1hcHMgd2hpY2ggb25seSBhZmZlY3QgdGhlIGxpZ2h0IGFuZCBzaGFkZSBvZiB0aGUgbWF0ZXJpYWwgdGhlXHJcblx0XHQgKiBkaXNwbGFjZWQgdmVydGljZXMgY2FuIGNhc3Qgc2hhZG93cywgYmxvY2sgb3RoZXIgb2JqZWN0cywgYW5kIG90aGVyd2lzZVxyXG5cdFx0ICogYWN0IGFzIHJlYWwgZ2VvbWV0cnkuIFRoZSBkaXNwbGFjZW1lbnQgdGV4dHVyZSBpcyBhbiBpbWFnZSB3aGVyZSB0aGUgdmFsdWVcclxuXHRcdCAqIG9mIGVhY2ggcGl4ZWwgKHdoaXRlIGJlaW5nIHRoZSBoaWdoZXN0KSBpcyBtYXBwZWQgYWdhaW5zdCwgYW5kXHJcblx0XHQgKiByZXBvc2l0aW9ucywgdGhlIHZlcnRpY2VzIG9mIHRoZSBtZXNoLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG93IG11Y2ggdGhlIGRpc3BsYWNlbWVudCBtYXAgYWZmZWN0cyB0aGUgbWVzaCAod2hlcmUgYmxhY2sgaXMgbm9cclxuXHRcdCAqIGRpc3BsYWNlbWVudCwgYW5kIHdoaXRlIGlzIG1heGltdW0gZGlzcGxhY2VtZW50KS4gV2l0aG91dCBhIGRpc3BsYWNlbWVudFxyXG5cdFx0ICogbWFwIHNldCwgdGhpcyB2YWx1ZSBpcyBub3QgYXBwbGllZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBvZmZzZXQgb2YgdGhlIGRpc3BsYWNlbWVudCBtYXAncyB2YWx1ZXMgb24gdGhlIG1lc2gncyB2ZXJ0aWNlcy5cclxuXHRcdCAqIFRoZSBiaWFzIGlzIGFkZGVkIHRvIHRoZSBzY2FsZWQgc2FtcGxlIG9mIHRoZSBkaXNwbGFjZW1lbnQgbWFwLlxyXG5cdFx0ICogV2l0aG91dCBhIGRpc3BsYWNlbWVudCBtYXAgc2V0LCB0aGlzIHZhbHVlIGlzIG5vdCBhcHBsaWVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IDA7XHJcblxyXG5cdFx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy5tYXAgPSBzb3VyY2UubWFwO1xyXG5cclxuXHRcdHRoaXMuYWxwaGFNYXAgPSBzb3VyY2UuYWxwaGFNYXA7XHJcblxyXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBzb3VyY2UuZGlzcGxhY2VtZW50TWFwO1xyXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHNvdXJjZS5kaXNwbGFjZW1lbnRTY2FsZTtcclxuXHRcdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IHNvdXJjZS5kaXNwbGFjZW1lbnRCaWFzO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBNZXNoRGlzdGFuY2VNYXRlcmlhbCB9O1xyXG4iLCJpbXBvcnQgeyBUYW5nZW50U3BhY2VOb3JtYWxNYXAgfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBNYXRlcmlhbCB9IGZyb20gJy4vTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IyLmpzJztcclxuaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi9tYXRoL0NvbG9yLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIG1hdGVyaWFsIGlzIGRlZmluZWQgYnkgYSBNYXRDYXAgKG9yIExpdCBTcGhlcmUpIHRleHR1cmUsIHdoaWNoIGVuY29kZXMgdGhlXHJcbiAqIG1hdGVyaWFsIGNvbG9yIGFuZCBzaGFkaW5nLlxyXG4gKlxyXG4gKiBgTWVzaE1hdGNhcE1hdGVyaWFsYCBkb2VzIG5vdCByZXNwb25kIHRvIGxpZ2h0cyBzaW5jZSB0aGUgbWF0Y2FwIGltYWdlIGZpbGUgZW5jb2Rlc1xyXG4gKiBiYWtlZCBsaWdodGluZy4gSXQgd2lsbCBjYXN0IGEgc2hhZG93IG9udG8gYW4gb2JqZWN0IHRoYXQgcmVjZWl2ZXMgc2hhZG93c1xyXG4gKiAoYW5kIHNoYWRvdyBjbGlwcGluZyB3b3JrcyksIGJ1dCBpdCB3aWxsIG5vdCBzZWxmLXNoYWRvdyBvciByZWNlaXZlXHJcbiAqIHNoYWRvd3MuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBNYXRlcmlhbFxyXG4gKi9cclxuY2xhc3MgTWVzaE1hdGNhcE1hdGVyaWFsIGV4dGVuZHMgTWF0ZXJpYWwge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG1lc2ggbWF0Y2FwIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbWV0ZXJzXSAtIEFuIG9iamVjdCB3aXRoIG9uZSBvciBtb3JlIHByb3BlcnRpZXNcclxuXHQgKiBkZWZpbmluZyB0aGUgbWF0ZXJpYWwncyBhcHBlYXJhbmNlLiBBbnkgcHJvcGVydHkgb2YgdGhlIG1hdGVyaWFsXHJcblx0ICogKGluY2x1ZGluZyBhbnkgcHJvcGVydHkgZnJvbSBpbmhlcml0ZWQgbWF0ZXJpYWxzKSBjYW4gYmUgcGFzc2VkXHJcblx0ICogaW4gaGVyZS4gQ29sb3IgdmFsdWVzIGNhbiBiZSBwYXNzZWQgYW55IHR5cGUgb2YgdmFsdWUgYWNjZXB0ZWRcclxuXHQgKiBieSB7QGxpbmsgQ29sb3Ijc2V0fS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVycyApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc01lc2hNYXRjYXBNYXRlcmlhbCA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy5kZWZpbmVzID0geyAnTUFUQ0FQJzogJycgfTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnTWVzaE1hdGNhcE1hdGVyaWFsJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENvbG9yIG9mIHRoZSBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Q29sb3J9XHJcblx0XHQgKiBAZGVmYXVsdCAoMSwxLDEpXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7IC8vIGRpZmZ1c2VcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBtYXRjYXAgbWFwLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tYXRjYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNvbG9yIG1hcC4gTWF5IG9wdGlvbmFsbHkgaW5jbHVkZSBhbiBhbHBoYSBjaGFubmVsLCB0eXBpY2FsbHkgY29tYmluZWRcclxuXHRcdCAqIHdpdGgge0BsaW5rIE1hdGVyaWFsI3RyYW5zcGFyZW50fSBvciB7QGxpbmsgTWF0ZXJpYWwjYWxwaGFUZXN0fS4gVGhlIHRleHR1cmUgbWFwXHJcblx0XHQgKiBjb2xvciBpcyBtb2R1bGF0ZWQgYnkgdGhlIGRpZmZ1c2UgYGNvbG9yYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB0ZXh0dXJlIHRvIGNyZWF0ZSBhIGJ1bXAgbWFwLiBUaGUgYmxhY2sgYW5kIHdoaXRlIHZhbHVlcyBtYXAgdG8gdGhlXHJcblx0XHQgKiBwZXJjZWl2ZWQgZGVwdGggaW4gcmVsYXRpb24gdG8gdGhlIGxpZ2h0cy4gQnVtcCBkb2Vzbid0IGFjdHVhbGx5IGFmZmVjdFxyXG5cdFx0ICogdGhlIGdlb21ldHJ5IG9mIHRoZSBvYmplY3QsIG9ubHkgdGhlIGxpZ2h0aW5nLiBJZiBhIG5vcm1hbCBtYXAgaXMgZGVmaW5lZFxyXG5cdFx0ICogdGhpcyB3aWxsIGJlIGlnbm9yZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJ1bXBNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG93IG11Y2ggdGhlIGJ1bXAgbWFwIGFmZmVjdHMgdGhlIG1hdGVyaWFsLiBUeXBpY2FsIHJhbmdlIGlzIGBbMCwxXWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5idW1wU2NhbGUgPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHRleHR1cmUgdG8gY3JlYXRlIGEgbm9ybWFsIG1hcC4gVGhlIFJHQiB2YWx1ZXMgYWZmZWN0IHRoZSBzdXJmYWNlXHJcblx0XHQgKiBub3JtYWwgZm9yIGVhY2ggcGl4ZWwgZnJhZ21lbnQgYW5kIGNoYW5nZSB0aGUgd2F5IHRoZSBjb2xvciBpcyBsaXQuIE5vcm1hbFxyXG5cdFx0ICogbWFwcyBkbyBub3QgY2hhbmdlIHRoZSBhY3R1YWwgc2hhcGUgb2YgdGhlIHN1cmZhY2UsIG9ubHkgdGhlIGxpZ2h0aW5nLiBJblxyXG5cdFx0ICogY2FzZSB0aGUgbWF0ZXJpYWwgaGFzIGEgbm9ybWFsIG1hcCBhdXRob3JlZCB1c2luZyB0aGUgbGVmdCBoYW5kZWRcclxuXHRcdCAqIGNvbnZlbnRpb24sIHRoZSBgeWAgY29tcG9uZW50IG9mIGBub3JtYWxTY2FsZWAgc2hvdWxkIGJlIG5lZ2F0ZWQgdG8gY29tcGVuc2F0ZVxyXG5cdFx0ICogZm9yIHRoZSBkaWZmZXJlbnQgaGFuZGVkbmVzcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9ybWFsTWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB0eXBlIG9mIG5vcm1hbCBtYXAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeyhUYW5nZW50U3BhY2VOb3JtYWxNYXB8T2JqZWN0U3BhY2VOb3JtYWxNYXApfVxyXG5cdFx0ICogQGRlZmF1bHQgVGFuZ2VudFNwYWNlTm9ybWFsTWFwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9ybWFsTWFwVHlwZSA9IFRhbmdlbnRTcGFjZU5vcm1hbE1hcDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvdyBtdWNoIHRoZSBub3JtYWwgbWFwIGFmZmVjdHMgdGhlIG1hdGVyaWFsLiBUeXBpY2FsIHZhbHVlIHJhbmdlIGlzIGBbMCwxXWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjJ9XHJcblx0XHQgKiBAZGVmYXVsdCAoMSwxKVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vcm1hbFNjYWxlID0gbmV3IFZlY3RvcjIoIDEsIDEgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBkaXNwbGFjZW1lbnQgbWFwIGFmZmVjdHMgdGhlIHBvc2l0aW9uIG9mIHRoZSBtZXNoJ3MgdmVydGljZXMuIFVubGlrZVxyXG5cdFx0ICogb3RoZXIgbWFwcyB3aGljaCBvbmx5IGFmZmVjdCB0aGUgbGlnaHQgYW5kIHNoYWRlIG9mIHRoZSBtYXRlcmlhbCB0aGVcclxuXHRcdCAqIGRpc3BsYWNlZCB2ZXJ0aWNlcyBjYW4gY2FzdCBzaGFkb3dzLCBibG9jayBvdGhlciBvYmplY3RzLCBhbmQgb3RoZXJ3aXNlXHJcblx0XHQgKiBhY3QgYXMgcmVhbCBnZW9tZXRyeS4gVGhlIGRpc3BsYWNlbWVudCB0ZXh0dXJlIGlzIGFuIGltYWdlIHdoZXJlIHRoZSB2YWx1ZVxyXG5cdFx0ICogb2YgZWFjaCBwaXhlbCAod2hpdGUgYmVpbmcgdGhlIGhpZ2hlc3QpIGlzIG1hcHBlZCBhZ2FpbnN0LCBhbmRcclxuXHRcdCAqIHJlcG9zaXRpb25zLCB0aGUgdmVydGljZXMgb2YgdGhlIG1lc2guXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3cgbXVjaCB0aGUgZGlzcGxhY2VtZW50IG1hcCBhZmZlY3RzIHRoZSBtZXNoICh3aGVyZSBibGFjayBpcyBub1xyXG5cdFx0ICogZGlzcGxhY2VtZW50LCBhbmQgd2hpdGUgaXMgbWF4aW11bSBkaXNwbGFjZW1lbnQpLiBXaXRob3V0IGEgZGlzcGxhY2VtZW50XHJcblx0XHQgKiBtYXAgc2V0LCB0aGlzIHZhbHVlIGlzIG5vdCBhcHBsaWVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG9mZnNldCBvZiB0aGUgZGlzcGxhY2VtZW50IG1hcCdzIHZhbHVlcyBvbiB0aGUgbWVzaCdzIHZlcnRpY2VzLlxyXG5cdFx0ICogVGhlIGJpYXMgaXMgYWRkZWQgdG8gdGhlIHNjYWxlZCBzYW1wbGUgb2YgdGhlIGRpc3BsYWNlbWVudCBtYXAuXHJcblx0XHQgKiBXaXRob3V0IGEgZGlzcGxhY2VtZW50IG1hcCBzZXQsIHRoaXMgdmFsdWUgaXMgbm90IGFwcGxpZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBhbHBoYSBtYXAgaXMgYSBncmF5c2NhbGUgdGV4dHVyZSB0aGF0IGNvbnRyb2xzIHRoZSBvcGFjaXR5IGFjcm9zcyB0aGVcclxuXHRcdCAqIHN1cmZhY2UgKGJsYWNrOiBmdWxseSB0cmFuc3BhcmVudDsgd2hpdGU6IGZ1bGx5IG9wYXF1ZSkuXHJcblx0XHQgKlxyXG5cdFx0ICogT25seSB0aGUgY29sb3Igb2YgdGhlIHRleHR1cmUgaXMgdXNlZCwgaWdub3JpbmcgdGhlIGFscGhhIGNoYW5uZWwgaWYgb25lXHJcblx0XHQgKiBleGlzdHMuIEZvciBSR0IgYW5kIFJHQkEgdGV4dHVyZXMsIHRoZSByZW5kZXJlciB3aWxsIHVzZSB0aGUgZ3JlZW4gY2hhbm5lbFxyXG5cdFx0ICogd2hlbiBzYW1wbGluZyB0aGlzIHRleHR1cmUgZHVlIHRvIHRoZSBleHRyYSBiaXQgb2YgcHJlY2lzaW9uIHByb3ZpZGVkIGZvclxyXG5cdFx0ICogZ3JlZW4gaW4gRFhULWNvbXByZXNzZWQgYW5kIHVuY29tcHJlc3NlZCBSR0IgNTY1IGZvcm1hdHMuIEx1bWluYW5jZS1vbmx5IGFuZFxyXG5cdFx0ICogbHVtaW5hbmNlL2FscGhhIHRleHR1cmVzIHdpbGwgYWxzbyBzdGlsbCB3b3JrIGFzIGV4cGVjdGVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hbHBoYU1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSBtYXRlcmlhbCBpcyByZW5kZXJlZCB3aXRoIGZsYXQgc2hhZGluZyBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZsYXRTaGFkaW5nID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSBtYXRlcmlhbCBpcyBhZmZlY3RlZCBieSBmb2cgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZvZyA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcclxuXHJcblx0fVxyXG5cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMuZGVmaW5lcyA9IHsgJ01BVENBUCc6ICcnIH07XHJcblxyXG5cdFx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcclxuXHJcblx0XHR0aGlzLm1hdGNhcCA9IHNvdXJjZS5tYXRjYXA7XHJcblxyXG5cdFx0dGhpcy5tYXAgPSBzb3VyY2UubWFwO1xyXG5cclxuXHRcdHRoaXMuYnVtcE1hcCA9IHNvdXJjZS5idW1wTWFwO1xyXG5cdFx0dGhpcy5idW1wU2NhbGUgPSBzb3VyY2UuYnVtcFNjYWxlO1xyXG5cclxuXHRcdHRoaXMubm9ybWFsTWFwID0gc291cmNlLm5vcm1hbE1hcDtcclxuXHRcdHRoaXMubm9ybWFsTWFwVHlwZSA9IHNvdXJjZS5ub3JtYWxNYXBUeXBlO1xyXG5cdFx0dGhpcy5ub3JtYWxTY2FsZS5jb3B5KCBzb3VyY2Uubm9ybWFsU2NhbGUgKTtcclxuXHJcblx0XHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IHNvdXJjZS5kaXNwbGFjZW1lbnRNYXA7XHJcblx0XHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gc291cmNlLmRpc3BsYWNlbWVudFNjYWxlO1xyXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gc291cmNlLmRpc3BsYWNlbWVudEJpYXM7XHJcblxyXG5cdFx0dGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDtcclxuXHJcblx0XHR0aGlzLmZsYXRTaGFkaW5nID0gc291cmNlLmZsYXRTaGFkaW5nO1xyXG5cclxuXHRcdHRoaXMuZm9nID0gc291cmNlLmZvZztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgTWVzaE1hdGNhcE1hdGVyaWFsIH07XHJcbiIsImltcG9ydCB7IExpbmVCYXNpY01hdGVyaWFsIH0gZnJvbSAnLi9MaW5lQmFzaWNNYXRlcmlhbC5qcyc7XHJcblxyXG4vKipcclxuICogQSBtYXRlcmlhbCBmb3IgcmVuZGVyaW5nIGxpbmUgcHJpbWl0aXZlcy5cclxuICpcclxuICogTWF0ZXJpYWxzIGRlZmluZSB0aGUgYXBwZWFyYW5jZSBvZiByZW5kZXJhYmxlIDNEIG9iamVjdHMuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IG1hdGVyaWFsID0gbmV3IFRIUkVFLkxpbmVEYXNoZWRNYXRlcmlhbCgge1xyXG4gKiBcdGNvbG9yOiAweGZmZmZmZixcclxuICogXHRzY2FsZTogMSxcclxuICogXHRkYXNoU2l6ZTogMyxcclxuICogXHRnYXBTaXplOiAxLFxyXG4gKiB9ICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTGluZUJhc2ljTWF0ZXJpYWxcclxuICovXHJcbmNsYXNzIExpbmVEYXNoZWRNYXRlcmlhbCBleHRlbmRzIExpbmVCYXNpY01hdGVyaWFsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBsaW5lIGRhc2hlZCBtYXRlcmlhbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1ldGVyc10gLSBBbiBvYmplY3Qgd2l0aCBvbmUgb3IgbW9yZSBwcm9wZXJ0aWVzXHJcblx0ICogZGVmaW5pbmcgdGhlIG1hdGVyaWFsJ3MgYXBwZWFyYW5jZS4gQW55IHByb3BlcnR5IG9mIHRoZSBtYXRlcmlhbFxyXG5cdCAqIChpbmNsdWRpbmcgYW55IHByb3BlcnR5IGZyb20gaW5oZXJpdGVkIG1hdGVyaWFscykgY2FuIGJlIHBhc3NlZFxyXG5cdCAqIGluIGhlcmUuIENvbG9yIHZhbHVlcyBjYW4gYmUgcGFzc2VkIGFueSB0eXBlIG9mIHZhbHVlIGFjY2VwdGVkXHJcblx0ICogYnkge0BsaW5rIENvbG9yI3NldH0uXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHBhcmFtZXRlcnMgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNMaW5lRGFzaGVkTWF0ZXJpYWwgPSB0cnVlO1xyXG5cdFx0dGhpcy50eXBlID0gJ0xpbmVEYXNoZWRNYXRlcmlhbCc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc2NhbGUgb2YgdGhlIGRhc2hlZCBwYXJ0IG9mIGEgbGluZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNjYWxlID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBzaXplIG9mIHRoZSBkYXNoLiBUaGlzIGlzIGJvdGggdGhlIGdhcCB3aXRoIHRoZSBzdHJva2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDNcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kYXNoU2l6ZSA9IDM7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc2l6ZSBvZiB0aGUgZ2FwLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ2FwU2l6ZSA9IDE7XHJcblxyXG5cdFx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy5zY2FsZSA9IHNvdXJjZS5zY2FsZTtcclxuXHRcdHRoaXMuZGFzaFNpemUgPSBzb3VyY2UuZGFzaFNpemU7XHJcblx0XHR0aGlzLmdhcFNpemUgPSBzb3VyY2UuZ2FwU2l6ZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgTGluZURhc2hlZE1hdGVyaWFsIH07XHJcbiIsImltcG9ydCB7IFF1YXRlcm5pb24gfSBmcm9tICcuLi9tYXRoL1F1YXRlcm5pb24uanMnO1xyXG5pbXBvcnQgeyBBZGRpdGl2ZUFuaW1hdGlvbkJsZW5kTW9kZSB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XHJcblxyXG4vKipcclxuICogQ29udmVydHMgYW4gYXJyYXkgdG8gYSBzcGVjaWZpYyB0eXBlLlxyXG4gKlxyXG4gKiBAcGFyYW0ge1R5cGVkQXJyYXl8QXJyYXl9IGFycmF5IC0gVGhlIGFycmF5IHRvIGNvbnZlcnQuXHJcbiAqIEBwYXJhbSB7VHlwZWRBcnJheS5jb25zdHJ1Y3Rvcn0gdHlwZSAtIFRoZSBjb25zdHJ1Y3RvciBvZiBhIHR5cGVkIGFycmF5IHRoYXQgZGVmaW5lcyB0aGUgbmV3IHR5cGUuXHJcbiAqIEByZXR1cm4ge1R5cGVkQXJyYXl9IFRoZSBjb252ZXJ0ZWQgYXJyYXkuXHJcbiAqL1xyXG5mdW5jdGlvbiBjb252ZXJ0QXJyYXkoIGFycmF5LCB0eXBlICkge1xyXG5cclxuXHRpZiAoICEgYXJyYXkgfHwgYXJyYXkuY29uc3RydWN0b3IgPT09IHR5cGUgKSByZXR1cm4gYXJyYXk7XHJcblxyXG5cdGlmICggdHlwZW9mIHR5cGUuQllURVNfUEVSX0VMRU1FTlQgPT09ICdudW1iZXInICkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgdHlwZSggYXJyYXkgKTsgLy8gY3JlYXRlIHR5cGVkIGFycmF5XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBhcnJheSApOyAvLyBjcmVhdGUgQXJyYXlcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGEgdHlwZWQgYXJyYXkuXHJcbiAqXHJcbiAqIEBwYXJhbSB7YW55fSBvYmplY3QgLSBUaGUgb2JqZWN0IHRvIGNoZWNrLlxyXG4gKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBnaXZlbiBvYmplY3QgaXMgYSB0eXBlZCBhcnJheS5cclxuICovXHJcbmZ1bmN0aW9uIGlzVHlwZWRBcnJheSggb2JqZWN0ICkge1xyXG5cclxuXHRyZXR1cm4gQXJyYXlCdWZmZXIuaXNWaWV3KCBvYmplY3QgKSAmJiAhICggb2JqZWN0IGluc3RhbmNlb2YgRGF0YVZpZXcgKTtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGFuIGFycmF5IGJ5IHdoaWNoIHRpbWVzIGFuZCB2YWx1ZXMgY2FuIGJlIHNvcnRlZC5cclxuICpcclxuICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSB0aW1lcyAtIFRoZSBrZXlmcmFtZSB0aW1lIHZhbHVlcy5cclxuICogQHJldHVybiB7QXJyYXk8bnVtYmVyPn0gVGhlIGFycmF5LlxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0S2V5ZnJhbWVPcmRlciggdGltZXMgKSB7XHJcblxyXG5cdGZ1bmN0aW9uIGNvbXBhcmVUaW1lKCBpLCBqICkge1xyXG5cclxuXHRcdHJldHVybiB0aW1lc1sgaSBdIC0gdGltZXNbIGogXTtcclxuXHJcblx0fVxyXG5cclxuXHRjb25zdCBuID0gdGltZXMubGVuZ3RoO1xyXG5cdGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheSggbiApO1xyXG5cdGZvciAoIGxldCBpID0gMDsgaSAhPT0gbjsgKysgaSApIHJlc3VsdFsgaSBdID0gaTtcclxuXHJcblx0cmVzdWx0LnNvcnQoIGNvbXBhcmVUaW1lICk7XHJcblxyXG5cdHJldHVybiByZXN1bHQ7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogU29ydHMgdGhlIGdpdmVuIGFycmF5IGJ5IHRoZSBwcmV2aW91c2x5IGNvbXB1dGVkIG9yZGVyIHZpYSBgZ2V0S2V5ZnJhbWVPcmRlcigpYC5cclxuICpcclxuICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSB2YWx1ZXMgLSBUaGUgdmFsdWVzIHRvIHNvcnQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBzdHJpZGUgLSBUaGUgc3RyaWRlLlxyXG4gKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IG9yZGVyIC0gVGhlIHNvcnQgb3JkZXIuXHJcbiAqIEByZXR1cm4ge0FycmF5PG51bWJlcj59IFRoZSBzb3J0ZWQgdmFsdWVzLlxyXG4gKi9cclxuZnVuY3Rpb24gc29ydGVkQXJyYXkoIHZhbHVlcywgc3RyaWRlLCBvcmRlciApIHtcclxuXHJcblx0Y29uc3QgblZhbHVlcyA9IHZhbHVlcy5sZW5ndGg7XHJcblx0Y29uc3QgcmVzdWx0ID0gbmV3IHZhbHVlcy5jb25zdHJ1Y3RvciggblZhbHVlcyApO1xyXG5cclxuXHRmb3IgKCBsZXQgaSA9IDAsIGRzdE9mZnNldCA9IDA7IGRzdE9mZnNldCAhPT0gblZhbHVlczsgKysgaSApIHtcclxuXHJcblx0XHRjb25zdCBzcmNPZmZzZXQgPSBvcmRlclsgaSBdICogc3RyaWRlO1xyXG5cclxuXHRcdGZvciAoIGxldCBqID0gMDsgaiAhPT0gc3RyaWRlOyArKyBqICkge1xyXG5cclxuXHRcdFx0cmVzdWx0WyBkc3RPZmZzZXQgKysgXSA9IHZhbHVlc1sgc3JjT2Zmc2V0ICsgaiBdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gcmVzdWx0O1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFVzZWQgZm9yIHBhcnNpbmcgQU9TIGtleWZyYW1lIGZvcm1hdHMuXHJcbiAqXHJcbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0ganNvbktleXMgLSBBIGxpc3Qgb2YgSlNPTiBrZXlmcmFtZXMuXHJcbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gdGltZXMgLSBUaGlzIGFycmF5IHdpbGwgYmUgZmlsbGVkIHdpdGgga2V5ZnJhbWUgdGltZXMgYnkgdGhpcyBmdW5jdGlvbi5cclxuICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSB2YWx1ZXMgLSBUaGlzIGFycmF5IHdpbGwgYmUgZmlsbGVkIHdpdGgga2V5ZnJhbWUgdmFsdWVzIGJ5IHRoaXMgZnVuY3Rpb24uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVByb3BlcnR5TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byB1c2UuXHJcbiAqL1xyXG5mdW5jdGlvbiBmbGF0dGVuSlNPTigganNvbktleXMsIHRpbWVzLCB2YWx1ZXMsIHZhbHVlUHJvcGVydHlOYW1lICkge1xyXG5cclxuXHRsZXQgaSA9IDEsIGtleSA9IGpzb25LZXlzWyAwIF07XHJcblxyXG5cdHdoaWxlICgga2V5ICE9PSB1bmRlZmluZWQgJiYga2V5WyB2YWx1ZVByb3BlcnR5TmFtZSBdID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0a2V5ID0ganNvbktleXNbIGkgKysgXTtcclxuXHJcblx0fVxyXG5cclxuXHRpZiAoIGtleSA9PT0gdW5kZWZpbmVkICkgcmV0dXJuOyAvLyBubyBkYXRhXHJcblxyXG5cdGxldCB2YWx1ZSA9IGtleVsgdmFsdWVQcm9wZXJ0eU5hbWUgXTtcclxuXHRpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgKSByZXR1cm47IC8vIG5vIGRhdGFcclxuXHJcblx0aWYgKCBBcnJheS5pc0FycmF5KCB2YWx1ZSApICkge1xyXG5cclxuXHRcdGRvIHtcclxuXHJcblx0XHRcdHZhbHVlID0ga2V5WyB2YWx1ZVByb3BlcnR5TmFtZSBdO1xyXG5cclxuXHRcdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHR0aW1lcy5wdXNoKCBrZXkudGltZSApO1xyXG5cdFx0XHRcdHZhbHVlcy5wdXNoKCAuLi52YWx1ZSApOyAvLyBwdXNoIGFsbCBlbGVtZW50c1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0a2V5ID0ganNvbktleXNbIGkgKysgXTtcclxuXHJcblx0XHR9IHdoaWxlICgga2V5ICE9PSB1bmRlZmluZWQgKTtcclxuXHJcblx0fSBlbHNlIGlmICggdmFsdWUudG9BcnJheSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdC8vIC4uLmFzc3VtZSBUSFJFRS5NYXRoLWlzaFxyXG5cclxuXHRcdGRvIHtcclxuXHJcblx0XHRcdHZhbHVlID0ga2V5WyB2YWx1ZVByb3BlcnR5TmFtZSBdO1xyXG5cclxuXHRcdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHR0aW1lcy5wdXNoKCBrZXkudGltZSApO1xyXG5cdFx0XHRcdHZhbHVlLnRvQXJyYXkoIHZhbHVlcywgdmFsdWVzLmxlbmd0aCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0a2V5ID0ganNvbktleXNbIGkgKysgXTtcclxuXHJcblx0XHR9IHdoaWxlICgga2V5ICE9PSB1bmRlZmluZWQgKTtcclxuXHJcblx0fSBlbHNlIHtcclxuXHJcblx0XHQvLyBvdGhlcndpc2UgcHVzaCBhcy1pc1xyXG5cclxuXHRcdGRvIHtcclxuXHJcblx0XHRcdHZhbHVlID0ga2V5WyB2YWx1ZVByb3BlcnR5TmFtZSBdO1xyXG5cclxuXHRcdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHR0aW1lcy5wdXNoKCBrZXkudGltZSApO1xyXG5cdFx0XHRcdHZhbHVlcy5wdXNoKCB2YWx1ZSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0a2V5ID0ganNvbktleXNbIGkgKysgXTtcclxuXHJcblx0XHR9IHdoaWxlICgga2V5ICE9PSB1bmRlZmluZWQgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgY2xpcCwgY29udGFpbmluZyBvbmx5IHRoZSBzZWdtZW50IG9mIHRoZSBvcmlnaW5hbCBjbGlwIGJldHdlZW4gdGhlIGdpdmVuIGZyYW1lcy5cclxuICpcclxuICogQHBhcmFtIHtBbmltYXRpb25DbGlwfSBzb3VyY2VDbGlwIC0gVGhlIHZhbHVlcyB0byBzb3J0LlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBjbGlwLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gc3RhcnRGcmFtZSAtIFRoZSBzdGFydCBmcmFtZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IGVuZEZyYW1lIC0gVGhlIGVuZCBmcmFtZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtmcHM9MzBdIC0gVGhlIEZQUy5cclxuICogQHJldHVybiB7QW5pbWF0aW9uQ2xpcH0gVGhlIG5ldyBzdWIgY2xpcC5cclxuICovXHJcbmZ1bmN0aW9uIHN1YmNsaXAoIHNvdXJjZUNsaXAsIG5hbWUsIHN0YXJ0RnJhbWUsIGVuZEZyYW1lLCBmcHMgPSAzMCApIHtcclxuXHJcblx0Y29uc3QgY2xpcCA9IHNvdXJjZUNsaXAuY2xvbmUoKTtcclxuXHJcblx0Y2xpcC5uYW1lID0gbmFtZTtcclxuXHJcblx0Y29uc3QgdHJhY2tzID0gW107XHJcblxyXG5cdGZvciAoIGxldCBpID0gMDsgaSA8IGNsaXAudHJhY2tzLmxlbmd0aDsgKysgaSApIHtcclxuXHJcblx0XHRjb25zdCB0cmFjayA9IGNsaXAudHJhY2tzWyBpIF07XHJcblx0XHRjb25zdCB2YWx1ZVNpemUgPSB0cmFjay5nZXRWYWx1ZVNpemUoKTtcclxuXHJcblx0XHRjb25zdCB0aW1lcyA9IFtdO1xyXG5cdFx0Y29uc3QgdmFsdWVzID0gW107XHJcblxyXG5cdFx0Zm9yICggbGV0IGogPSAwOyBqIDwgdHJhY2sudGltZXMubGVuZ3RoOyArKyBqICkge1xyXG5cclxuXHRcdFx0Y29uc3QgZnJhbWUgPSB0cmFjay50aW1lc1sgaiBdICogZnBzO1xyXG5cclxuXHRcdFx0aWYgKCBmcmFtZSA8IHN0YXJ0RnJhbWUgfHwgZnJhbWUgPj0gZW5kRnJhbWUgKSBjb250aW51ZTtcclxuXHJcblx0XHRcdHRpbWVzLnB1c2goIHRyYWNrLnRpbWVzWyBqIF0gKTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBrID0gMDsgayA8IHZhbHVlU2l6ZTsgKysgayApIHtcclxuXHJcblx0XHRcdFx0dmFsdWVzLnB1c2goIHRyYWNrLnZhbHVlc1sgaiAqIHZhbHVlU2l6ZSArIGsgXSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRpbWVzLmxlbmd0aCA9PT0gMCApIGNvbnRpbnVlO1xyXG5cclxuXHRcdHRyYWNrLnRpbWVzID0gY29udmVydEFycmF5KCB0aW1lcywgdHJhY2sudGltZXMuY29uc3RydWN0b3IgKTtcclxuXHRcdHRyYWNrLnZhbHVlcyA9IGNvbnZlcnRBcnJheSggdmFsdWVzLCB0cmFjay52YWx1ZXMuY29uc3RydWN0b3IgKTtcclxuXHJcblx0XHR0cmFja3MucHVzaCggdHJhY2sgKTtcclxuXHJcblx0fVxyXG5cclxuXHRjbGlwLnRyYWNrcyA9IHRyYWNrcztcclxuXHJcblx0Ly8gZmluZCBtaW5pbXVtIC50aW1lcyB2YWx1ZSBhY3Jvc3MgYWxsIHRyYWNrcyBpbiB0aGUgdHJpbW1lZCBjbGlwXHJcblxyXG5cdGxldCBtaW5TdGFydFRpbWUgPSBJbmZpbml0eTtcclxuXHJcblx0Zm9yICggbGV0IGkgPSAwOyBpIDwgY2xpcC50cmFja3MubGVuZ3RoOyArKyBpICkge1xyXG5cclxuXHRcdGlmICggbWluU3RhcnRUaW1lID4gY2xpcC50cmFja3NbIGkgXS50aW1lc1sgMCBdICkge1xyXG5cclxuXHRcdFx0bWluU3RhcnRUaW1lID0gY2xpcC50cmFja3NbIGkgXS50aW1lc1sgMCBdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvLyBzaGlmdCBhbGwgdHJhY2tzIHN1Y2ggdGhhdCBjbGlwIGJlZ2lucyBhdCB0PTBcclxuXHJcblx0Zm9yICggbGV0IGkgPSAwOyBpIDwgY2xpcC50cmFja3MubGVuZ3RoOyArKyBpICkge1xyXG5cclxuXHRcdGNsaXAudHJhY2tzWyBpIF0uc2hpZnQoIC0gMSAqIG1pblN0YXJ0VGltZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdGNsaXAucmVzZXREdXJhdGlvbigpO1xyXG5cclxuXHRyZXR1cm4gY2xpcDtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyB0aGUga2V5ZnJhbWVzIG9mIHRoZSBnaXZlbiBhbmltYXRpb24gY2xpcCB0byBhbiBhZGRpdGl2ZSBmb3JtYXQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7QW5pbWF0aW9uQ2xpcH0gdGFyZ2V0Q2xpcCAtIFRoZSBjbGlwIHRvIG1ha2UgYWRkaXRpdmUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbcmVmZXJlbmNlRnJhbWU9MF0gLSBUaGUgcmVmZXJlbmNlIGZyYW1lLlxyXG4gKiBAcGFyYW0ge0FuaW1hdGlvbkNsaXB9IFtyZWZlcmVuY2VDbGlwPXRhcmdldENsaXBdIC0gVGhlIHJlZmVyZW5jZSBjbGlwLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW2Zwcz0zMF0gLSBUaGUgRlBTLlxyXG4gKiBAcmV0dXJuIHtBbmltYXRpb25DbGlwfSBUaGUgdXBkYXRlZCBjbGlwIHdoaWNoIGlzIG5vdyBhZGRpdGl2ZS5cclxuICovXHJcbmZ1bmN0aW9uIG1ha2VDbGlwQWRkaXRpdmUoIHRhcmdldENsaXAsIHJlZmVyZW5jZUZyYW1lID0gMCwgcmVmZXJlbmNlQ2xpcCA9IHRhcmdldENsaXAsIGZwcyA9IDMwICkge1xyXG5cclxuXHRpZiAoIGZwcyA8PSAwICkgZnBzID0gMzA7XHJcblxyXG5cdGNvbnN0IG51bVRyYWNrcyA9IHJlZmVyZW5jZUNsaXAudHJhY2tzLmxlbmd0aDtcclxuXHRjb25zdCByZWZlcmVuY2VUaW1lID0gcmVmZXJlbmNlRnJhbWUgLyBmcHM7XHJcblxyXG5cdC8vIE1ha2UgZWFjaCB0cmFjaydzIHZhbHVlcyByZWxhdGl2ZSB0byB0aGUgdmFsdWVzIGF0IHRoZSByZWZlcmVuY2UgZnJhbWVcclxuXHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBudW1UcmFja3M7ICsrIGkgKSB7XHJcblxyXG5cdFx0Y29uc3QgcmVmZXJlbmNlVHJhY2sgPSByZWZlcmVuY2VDbGlwLnRyYWNrc1sgaSBdO1xyXG5cdFx0Y29uc3QgcmVmZXJlbmNlVHJhY2tUeXBlID0gcmVmZXJlbmNlVHJhY2suVmFsdWVUeXBlTmFtZTtcclxuXHJcblx0XHQvLyBTa2lwIHRoaXMgdHJhY2sgaWYgaXQncyBub24tbnVtZXJpY1xyXG5cdFx0aWYgKCByZWZlcmVuY2VUcmFja1R5cGUgPT09ICdib29sJyB8fCByZWZlcmVuY2VUcmFja1R5cGUgPT09ICdzdHJpbmcnICkgY29udGludWU7XHJcblxyXG5cdFx0Ly8gRmluZCB0aGUgdHJhY2sgaW4gdGhlIHRhcmdldCBjbGlwIHdob3NlIG5hbWUgYW5kIHR5cGUgbWF0Y2hlcyB0aGUgcmVmZXJlbmNlIHRyYWNrXHJcblx0XHRjb25zdCB0YXJnZXRUcmFjayA9IHRhcmdldENsaXAudHJhY2tzLmZpbmQoIGZ1bmN0aW9uICggdHJhY2sgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gdHJhY2submFtZSA9PT0gcmVmZXJlbmNlVHJhY2submFtZVxyXG5cdFx0XHRcdCYmIHRyYWNrLlZhbHVlVHlwZU5hbWUgPT09IHJlZmVyZW5jZVRyYWNrVHlwZTtcclxuXHJcblx0XHR9ICk7XHJcblxyXG5cdFx0aWYgKCB0YXJnZXRUcmFjayA9PT0gdW5kZWZpbmVkICkgY29udGludWU7XHJcblxyXG5cdFx0bGV0IHJlZmVyZW5jZU9mZnNldCA9IDA7XHJcblx0XHRjb25zdCByZWZlcmVuY2VWYWx1ZVNpemUgPSByZWZlcmVuY2VUcmFjay5nZXRWYWx1ZVNpemUoKTtcclxuXHJcblx0XHRpZiAoIHJlZmVyZW5jZVRyYWNrLmNyZWF0ZUludGVycG9sYW50LmlzSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kR0xURkN1YmljU3BsaW5lICkge1xyXG5cclxuXHRcdFx0cmVmZXJlbmNlT2Zmc2V0ID0gcmVmZXJlbmNlVmFsdWVTaXplIC8gMztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0bGV0IHRhcmdldE9mZnNldCA9IDA7XHJcblx0XHRjb25zdCB0YXJnZXRWYWx1ZVNpemUgPSB0YXJnZXRUcmFjay5nZXRWYWx1ZVNpemUoKTtcclxuXHJcblx0XHRpZiAoIHRhcmdldFRyYWNrLmNyZWF0ZUludGVycG9sYW50LmlzSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kR0xURkN1YmljU3BsaW5lICkge1xyXG5cclxuXHRcdFx0dGFyZ2V0T2Zmc2V0ID0gdGFyZ2V0VmFsdWVTaXplIC8gMztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgbGFzdEluZGV4ID0gcmVmZXJlbmNlVHJhY2sudGltZXMubGVuZ3RoIC0gMTtcclxuXHRcdGxldCByZWZlcmVuY2VWYWx1ZTtcclxuXHJcblx0XHQvLyBGaW5kIHRoZSB2YWx1ZSB0byBzdWJ0cmFjdCBvdXQgb2YgdGhlIHRyYWNrXHJcblx0XHRpZiAoIHJlZmVyZW5jZVRpbWUgPD0gcmVmZXJlbmNlVHJhY2sudGltZXNbIDAgXSApIHtcclxuXHJcblx0XHRcdC8vIFJlZmVyZW5jZSBmcmFtZSBpcyBlYXJsaWVyIHRoYW4gdGhlIGZpcnN0IGtleWZyYW1lLCBzbyBqdXN0IHVzZSB0aGUgZmlyc3Qga2V5ZnJhbWVcclxuXHRcdFx0Y29uc3Qgc3RhcnRJbmRleCA9IHJlZmVyZW5jZU9mZnNldDtcclxuXHRcdFx0Y29uc3QgZW5kSW5kZXggPSByZWZlcmVuY2VWYWx1ZVNpemUgLSByZWZlcmVuY2VPZmZzZXQ7XHJcblx0XHRcdHJlZmVyZW5jZVZhbHVlID0gcmVmZXJlbmNlVHJhY2sudmFsdWVzLnNsaWNlKCBzdGFydEluZGV4LCBlbmRJbmRleCApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHJlZmVyZW5jZVRpbWUgPj0gcmVmZXJlbmNlVHJhY2sudGltZXNbIGxhc3RJbmRleCBdICkge1xyXG5cclxuXHRcdFx0Ly8gUmVmZXJlbmNlIGZyYW1lIGlzIGFmdGVyIHRoZSBsYXN0IGtleWZyYW1lLCBzbyBqdXN0IHVzZSB0aGUgbGFzdCBrZXlmcmFtZVxyXG5cdFx0XHRjb25zdCBzdGFydEluZGV4ID0gbGFzdEluZGV4ICogcmVmZXJlbmNlVmFsdWVTaXplICsgcmVmZXJlbmNlT2Zmc2V0O1xyXG5cdFx0XHRjb25zdCBlbmRJbmRleCA9IHN0YXJ0SW5kZXggKyByZWZlcmVuY2VWYWx1ZVNpemUgLSByZWZlcmVuY2VPZmZzZXQ7XHJcblx0XHRcdHJlZmVyZW5jZVZhbHVlID0gcmVmZXJlbmNlVHJhY2sudmFsdWVzLnNsaWNlKCBzdGFydEluZGV4LCBlbmRJbmRleCApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHQvLyBJbnRlcnBvbGF0ZSB0byB0aGUgcmVmZXJlbmNlIHZhbHVlXHJcblx0XHRcdGNvbnN0IGludGVycG9sYW50ID0gcmVmZXJlbmNlVHJhY2suY3JlYXRlSW50ZXJwb2xhbnQoKTtcclxuXHRcdFx0Y29uc3Qgc3RhcnRJbmRleCA9IHJlZmVyZW5jZU9mZnNldDtcclxuXHRcdFx0Y29uc3QgZW5kSW5kZXggPSByZWZlcmVuY2VWYWx1ZVNpemUgLSByZWZlcmVuY2VPZmZzZXQ7XHJcblx0XHRcdGludGVycG9sYW50LmV2YWx1YXRlKCByZWZlcmVuY2VUaW1lICk7XHJcblx0XHRcdHJlZmVyZW5jZVZhbHVlID0gaW50ZXJwb2xhbnQucmVzdWx0QnVmZmVyLnNsaWNlKCBzdGFydEluZGV4LCBlbmRJbmRleCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBDb25qdWdhdGUgdGhlIHF1YXRlcm5pb25cclxuXHRcdGlmICggcmVmZXJlbmNlVHJhY2tUeXBlID09PSAncXVhdGVybmlvbicgKSB7XHJcblxyXG5cdFx0XHRjb25zdCByZWZlcmVuY2VRdWF0ID0gbmV3IFF1YXRlcm5pb24oKS5mcm9tQXJyYXkoIHJlZmVyZW5jZVZhbHVlICkubm9ybWFsaXplKCkuY29uanVnYXRlKCk7XHJcblx0XHRcdHJlZmVyZW5jZVF1YXQudG9BcnJheSggcmVmZXJlbmNlVmFsdWUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gU3VidHJhY3QgdGhlIHJlZmVyZW5jZSB2YWx1ZSBmcm9tIGFsbCBvZiB0aGUgdHJhY2sgdmFsdWVzXHJcblxyXG5cdFx0Y29uc3QgbnVtVGltZXMgPSB0YXJnZXRUcmFjay50aW1lcy5sZW5ndGg7XHJcblx0XHRmb3IgKCBsZXQgaiA9IDA7IGogPCBudW1UaW1lczsgKysgaiApIHtcclxuXHJcblx0XHRcdGNvbnN0IHZhbHVlU3RhcnQgPSBqICogdGFyZ2V0VmFsdWVTaXplICsgdGFyZ2V0T2Zmc2V0O1xyXG5cclxuXHRcdFx0aWYgKCByZWZlcmVuY2VUcmFja1R5cGUgPT09ICdxdWF0ZXJuaW9uJyApIHtcclxuXHJcblx0XHRcdFx0Ly8gTXVsdGlwbHkgdGhlIGNvbmp1Z2F0ZSBmb3IgcXVhdGVybmlvbiB0cmFjayB0eXBlc1xyXG5cdFx0XHRcdFF1YXRlcm5pb24ubXVsdGlwbHlRdWF0ZXJuaW9uc0ZsYXQoXHJcblx0XHRcdFx0XHR0YXJnZXRUcmFjay52YWx1ZXMsXHJcblx0XHRcdFx0XHR2YWx1ZVN0YXJ0LFxyXG5cdFx0XHRcdFx0cmVmZXJlbmNlVmFsdWUsXHJcblx0XHRcdFx0XHQwLFxyXG5cdFx0XHRcdFx0dGFyZ2V0VHJhY2sudmFsdWVzLFxyXG5cdFx0XHRcdFx0dmFsdWVTdGFydFxyXG5cdFx0XHRcdCk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRjb25zdCB2YWx1ZUVuZCA9IHRhcmdldFZhbHVlU2l6ZSAtIHRhcmdldE9mZnNldCAqIDI7XHJcblxyXG5cdFx0XHRcdC8vIFN1YnRyYWN0IGVhY2ggdmFsdWUgZm9yIGFsbCBvdGhlciBudW1lcmljIHRyYWNrIHR5cGVzXHJcblx0XHRcdFx0Zm9yICggbGV0IGsgPSAwOyBrIDwgdmFsdWVFbmQ7ICsrIGsgKSB7XHJcblxyXG5cdFx0XHRcdFx0dGFyZ2V0VHJhY2sudmFsdWVzWyB2YWx1ZVN0YXJ0ICsgayBdIC09IHJlZmVyZW5jZVZhbHVlWyBrIF07XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0dGFyZ2V0Q2xpcC5ibGVuZE1vZGUgPSBBZGRpdGl2ZUFuaW1hdGlvbkJsZW5kTW9kZTtcclxuXHJcblx0cmV0dXJuIHRhcmdldENsaXA7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQSBjbGFzcyB3aXRoIHZhcmlvdXMgbWV0aG9kcyB0byBhc3Npc3Qgd2l0aCBhbmltYXRpb25zLlxyXG4gKlxyXG4gKiBAaGlkZWNvbnN0cnVjdG9yXHJcbiAqL1xyXG5jbGFzcyBBbmltYXRpb25VdGlscyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnZlcnRzIGFuIGFycmF5IHRvIGEgc3BlY2lmaWMgdHlwZVxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEBwYXJhbSB7VHlwZWRBcnJheXxBcnJheX0gYXJyYXkgLSBUaGUgYXJyYXkgdG8gY29udmVydC5cclxuXHQgKiBAcGFyYW0ge1R5cGVkQXJyYXkuY29uc3RydWN0b3J9IHR5cGUgLSBUaGUgY29uc3RydWN0b3Igb2YgYSB0eXBlIGFycmF5LlxyXG5cdCAqIEByZXR1cm4ge1R5cGVkQXJyYXl9IFRoZSBjb252ZXJ0ZWQgYXJyYXlcclxuXHQgKi9cclxuXHRzdGF0aWMgY29udmVydEFycmF5KCBhcnJheSwgdHlwZSApIHtcclxuXHJcblx0XHRyZXR1cm4gY29udmVydEFycmF5KCBhcnJheSwgdHlwZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBnaXZlbiBvYmplY3QgaXMgYSB0eXBlZCBhcnJheS5cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAcGFyYW0ge2FueX0gb2JqZWN0IC0gVGhlIG9iamVjdCB0byBjaGVjay5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBnaXZlbiBvYmplY3QgaXMgYSB0eXBlZCBhcnJheS5cclxuXHQgKi9cclxuXHRzdGF0aWMgaXNUeXBlZEFycmF5KCBvYmplY3QgKSB7XHJcblxyXG5cdFx0cmV0dXJuIGlzVHlwZWRBcnJheSggb2JqZWN0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhbiBhcnJheSBieSB3aGljaCB0aW1lcyBhbmQgdmFsdWVzIGNhbiBiZSBzb3J0ZWQuXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSB0aW1lcyAtIFRoZSBrZXlmcmFtZSB0aW1lIHZhbHVlcy5cclxuXHQgKiBAcmV0dXJuIHtBcnJheTxudW1iZXI+fSBUaGUgYXJyYXkuXHJcblx0ICovXHJcblx0c3RhdGljIGdldEtleWZyYW1lT3JkZXIoIHRpbWVzICkge1xyXG5cclxuXHRcdHJldHVybiBnZXRLZXlmcmFtZU9yZGVyKCB0aW1lcyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNvcnRzIHRoZSBnaXZlbiBhcnJheSBieSB0aGUgcHJldmlvdXNseSBjb21wdXRlZCBvcmRlciB2aWEgYGdldEtleWZyYW1lT3JkZXIoKWAuXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSB2YWx1ZXMgLSBUaGUgdmFsdWVzIHRvIHNvcnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHN0cmlkZSAtIFRoZSBzdHJpZGUuXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBvcmRlciAtIFRoZSBzb3J0IG9yZGVyLlxyXG5cdCAqIEByZXR1cm4ge0FycmF5PG51bWJlcj59IFRoZSBzb3J0ZWQgdmFsdWVzLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBzb3J0ZWRBcnJheSggdmFsdWVzLCBzdHJpZGUsIG9yZGVyICkge1xyXG5cclxuXHRcdHJldHVybiBzb3J0ZWRBcnJheSggdmFsdWVzLCBzdHJpZGUsIG9yZGVyICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXNlZCBmb3IgcGFyc2luZyBBT1Mga2V5ZnJhbWUgZm9ybWF0cy5cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IGpzb25LZXlzIC0gQSBsaXN0IG9mIEpTT04ga2V5ZnJhbWVzLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gdGltZXMgLSBUaGlzIGFycmF5IHdpbGwgYmUgZmlsbGVkIHdpdGgga2V5ZnJhbWUgdGltZXMgYnkgdGhpcyBtZXRob2QuXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSB2YWx1ZXMgLSBUaGlzIGFycmF5IHdpbGwgYmUgZmlsbGVkIHdpdGgga2V5ZnJhbWUgdmFsdWVzIGJ5IHRoaXMgbWV0aG9kLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVByb3BlcnR5TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byB1c2UuXHJcblx0ICovXHJcblx0c3RhdGljIGZsYXR0ZW5KU09OKCBqc29uS2V5cywgdGltZXMsIHZhbHVlcywgdmFsdWVQcm9wZXJ0eU5hbWUgKSB7XHJcblxyXG5cdFx0ZmxhdHRlbkpTT04oIGpzb25LZXlzLCB0aW1lcywgdmFsdWVzLCB2YWx1ZVByb3BlcnR5TmFtZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgYSBuZXcgY2xpcCwgY29udGFpbmluZyBvbmx5IHRoZSBzZWdtZW50IG9mIHRoZSBvcmlnaW5hbCBjbGlwIGJldHdlZW4gdGhlIGdpdmVuIGZyYW1lcy5cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAcGFyYW0ge0FuaW1hdGlvbkNsaXB9IHNvdXJjZUNsaXAgLSBUaGUgdmFsdWVzIHRvIHNvcnQuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgY2xpcC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc3RhcnRGcmFtZSAtIFRoZSBzdGFydCBmcmFtZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZW5kRnJhbWUgLSBUaGUgZW5kIGZyYW1lLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZnBzPTMwXSAtIFRoZSBGUFMuXHJcblx0ICogQHJldHVybiB7QW5pbWF0aW9uQ2xpcH0gVGhlIG5ldyBzdWIgY2xpcC5cclxuXHQgKi9cclxuXHRzdGF0aWMgc3ViY2xpcCggc291cmNlQ2xpcCwgbmFtZSwgc3RhcnRGcmFtZSwgZW5kRnJhbWUsIGZwcyA9IDMwICkge1xyXG5cclxuXHRcdHJldHVybiBzdWJjbGlwKCBzb3VyY2VDbGlwLCBuYW1lLCBzdGFydEZyYW1lLCBlbmRGcmFtZSwgZnBzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29udmVydHMgdGhlIGtleWZyYW1lcyBvZiB0aGUgZ2l2ZW4gYW5pbWF0aW9uIGNsaXAgdG8gYW4gYWRkaXRpdmUgZm9ybWF0LlxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEBwYXJhbSB7QW5pbWF0aW9uQ2xpcH0gdGFyZ2V0Q2xpcCAtIFRoZSBjbGlwIHRvIG1ha2UgYWRkaXRpdmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtyZWZlcmVuY2VGcmFtZT0wXSAtIFRoZSByZWZlcmVuY2UgZnJhbWUuXHJcblx0ICogQHBhcmFtIHtBbmltYXRpb25DbGlwfSBbcmVmZXJlbmNlQ2xpcD10YXJnZXRDbGlwXSAtIFRoZSByZWZlcmVuY2UgY2xpcC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2Zwcz0zMF0gLSBUaGUgRlBTLlxyXG5cdCAqIEByZXR1cm4ge0FuaW1hdGlvbkNsaXB9IFRoZSB1cGRhdGVkIGNsaXAgd2hpY2ggaXMgbm93IGFkZGl0aXZlLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBtYWtlQ2xpcEFkZGl0aXZlKCB0YXJnZXRDbGlwLCByZWZlcmVuY2VGcmFtZSA9IDAsIHJlZmVyZW5jZUNsaXAgPSB0YXJnZXRDbGlwLCBmcHMgPSAzMCApIHtcclxuXHJcblx0XHRyZXR1cm4gbWFrZUNsaXBBZGRpdGl2ZSggdGFyZ2V0Q2xpcCwgcmVmZXJlbmNlRnJhbWUsIHJlZmVyZW5jZUNsaXAsIGZwcyApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQge1xyXG5cdGNvbnZlcnRBcnJheSxcclxuXHRpc1R5cGVkQXJyYXksXHJcblx0Z2V0S2V5ZnJhbWVPcmRlcixcclxuXHRzb3J0ZWRBcnJheSxcclxuXHRmbGF0dGVuSlNPTixcclxuXHRzdWJjbGlwLFxyXG5cdG1ha2VDbGlwQWRkaXRpdmUsXHJcblx0QW5pbWF0aW9uVXRpbHNcclxufTtcclxuIiwiLyoqXHJcbiAqIEFic3RyYWN0IGJhc2UgY2xhc3Mgb2YgaW50ZXJwb2xhbnRzIG92ZXIgcGFyYW1ldHJpYyBzYW1wbGVzLlxyXG4gKlxyXG4gKiBUaGUgcGFyYW1ldGVyIGRvbWFpbiBpcyBvbmUgZGltZW5zaW9uYWwsIHR5cGljYWxseSB0aGUgdGltZSBvciBhIHBhdGhcclxuICogYWxvbmcgYSBjdXJ2ZSBkZWZpbmVkIGJ5IHRoZSBkYXRhLlxyXG4gKlxyXG4gKiBUaGUgc2FtcGxlIHZhbHVlcyBjYW4gaGF2ZSBhbnkgZGltZW5zaW9uYWxpdHkgYW5kIGRlcml2ZWQgY2xhc3NlcyBtYXlcclxuICogYXBwbHkgc3BlY2lhbCBpbnRlcnByZXRhdGlvbnMgdG8gdGhlIGRhdGEuXHJcbiAqXHJcbiAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgdGhlIGludGVydmFsIHNlZWsgaW4gYSBUZW1wbGF0ZSBNZXRob2QsIGRlZmVycmluZ1xyXG4gKiB0aGUgYWN0dWFsIGludGVycG9sYXRpb24gdG8gZGVyaXZlZCBjbGFzc2VzLlxyXG4gKlxyXG4gKiBUaW1lIGNvbXBsZXhpdHkgaXMgTygxKSBmb3IgbGluZWFyIGFjY2VzcyBjcm9zc2luZyBhdCBtb3N0IHR3byBwb2ludHNcclxuICogYW5kIE8obG9nIE4pIGZvciByYW5kb20gYWNjZXNzLCB3aGVyZSBOIGlzIHRoZSBudW1iZXIgb2YgcG9zaXRpb25zLlxyXG4gKlxyXG4gKiBSZWZlcmVuY2VzOiB7QGxpbmsgaHR0cDovL3d3dy5vb2Rlc2lnbi5jb20vdGVtcGxhdGUtbWV0aG9kLXBhdHRlcm4uaHRtbH1cclxuICpcclxuICogQGFic3RyYWN0XHJcbiAqL1xyXG5jbGFzcyBJbnRlcnBvbGFudCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgaW50ZXJwb2xhbnQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1R5cGVkQXJyYXl9IHBhcmFtZXRlclBvc2l0aW9ucyAtIFRoZSBwYXJhbWV0ZXIgcG9zaXRpb25zIGhvbGQgdGhlIGludGVycG9sYXRpb24gZmFjdG9ycy5cclxuXHQgKiBAcGFyYW0ge1R5cGVkQXJyYXl9IHNhbXBsZVZhbHVlcyAtIFRoZSBzYW1wbGUgdmFsdWVzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzYW1wbGVTaXplIC0gVGhlIHNhbXBsZSBzaXplXHJcblx0ICogQHBhcmFtIHtUeXBlZEFycmF5fSBbcmVzdWx0QnVmZmVyXSAtIFRoZSByZXN1bHQgYnVmZmVyLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHBhcmFtZXRlciBwb3NpdGlvbnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1R5cGVkQXJyYXl9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucGFyYW1ldGVyUG9zaXRpb25zID0gcGFyYW1ldGVyUG9zaXRpb25zO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBjYWNoZSBpbmRleC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fY2FjaGVkSW5kZXggPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJlc3VsdCBidWZmZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1R5cGVkQXJyYXl9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVzdWx0QnVmZmVyID0gcmVzdWx0QnVmZmVyICE9PSB1bmRlZmluZWQgPyByZXN1bHRCdWZmZXIgOiBuZXcgc2FtcGxlVmFsdWVzLmNvbnN0cnVjdG9yKCBzYW1wbGVTaXplICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc2FtcGxlIHZhbHVlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VHlwZWRBcnJheX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zYW1wbGVWYWx1ZXMgPSBzYW1wbGVWYWx1ZXM7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdmFsdWUgc2l6ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VHlwZWRBcnJheX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52YWx1ZVNpemUgPSBzYW1wbGVTaXplO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGludGVycG9sYXRpb24gc2V0dGluZ3MuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9PYmplY3R9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2V0dGluZ3MgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGRlZmF1bHQgc2V0dGluZ3Mgb2JqZWN0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuRGVmYXVsdFNldHRpbmdzXyA9IHt9O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEV2YWx1YXRlIHRoZSBpbnRlcnBvbGFudCBhdCBwb3NpdGlvbiBgdGAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdCAtIFRoZSBpbnRlcnBvbGF0aW9uIGZhY3Rvci5cclxuXHQgKiBAcmV0dXJuIHtUeXBlZEFycmF5fSBUaGUgcmVzdWx0IGJ1ZmZlci5cclxuXHQgKi9cclxuXHRldmFsdWF0ZSggdCApIHtcclxuXHJcblx0XHRjb25zdCBwcCA9IHRoaXMucGFyYW1ldGVyUG9zaXRpb25zO1xyXG5cdFx0bGV0IGkxID0gdGhpcy5fY2FjaGVkSW5kZXgsXHJcblx0XHRcdHQxID0gcHBbIGkxIF0sXHJcblx0XHRcdHQwID0gcHBbIGkxIC0gMSBdO1xyXG5cclxuXHRcdHZhbGlkYXRlX2ludGVydmFsOiB7XHJcblxyXG5cdFx0XHRzZWVrOiB7XHJcblxyXG5cdFx0XHRcdGxldCByaWdodDtcclxuXHJcblx0XHRcdFx0bGluZWFyX3NjYW46IHtcclxuXHJcblx0XHRcdFx0XHQvLy0gU2VlIGh0dHA6Ly9qc3BlcmYuY29tL2NvbXBhcmlzb24tdG8tdW5kZWZpbmVkLzNcclxuXHRcdFx0XHRcdC8vLSBzbG93ZXIgY29kZTpcclxuXHRcdFx0XHRcdC8vLVxyXG5cdFx0XHRcdFx0Ly8tIFx0XHRcdFx0aWYgKCB0ID49IHQxIHx8IHQxID09PSB1bmRlZmluZWQgKSB7XHJcblx0XHRcdFx0XHRmb3J3YXJkX3NjYW46IGlmICggISAoIHQgPCB0MSApICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Zm9yICggbGV0IGdpdmVVcEF0ID0gaTEgKyAyOyA7ICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoIHQxID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCB0IDwgdDAgKSBicmVhayBmb3J3YXJkX3NjYW47XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0Ly8gYWZ0ZXIgZW5kXHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0aTEgPSBwcC5sZW5ndGg7XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLl9jYWNoZWRJbmRleCA9IGkxO1xyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuY29weVNhbXBsZVZhbHVlXyggaTEgLSAxICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKCBpMSA9PT0gZ2l2ZVVwQXQgKSBicmVhazsgLy8gdGhpcyBsb29wXHJcblxyXG5cdFx0XHRcdFx0XHRcdHQwID0gdDE7XHJcblx0XHRcdFx0XHRcdFx0dDEgPSBwcFsgKysgaTEgXTtcclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKCB0IDwgdDEgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0Ly8gd2UgaGF2ZSBhcnJpdmVkIGF0IHRoZSBzb3VnaHQgaW50ZXJ2YWxcclxuXHRcdFx0XHRcdFx0XHRcdGJyZWFrIHNlZWs7XHJcblxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdC8vIHByZXBhcmUgYmluYXJ5IHNlYXJjaCBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgaW5kZXhcclxuXHRcdFx0XHRcdFx0cmlnaHQgPSBwcC5sZW5ndGg7XHJcblx0XHRcdFx0XHRcdGJyZWFrIGxpbmVhcl9zY2FuO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvLy0gc2xvd2VyIGNvZGU6XHJcblx0XHRcdFx0XHQvLy1cdFx0XHRcdFx0aWYgKCB0IDwgdDAgfHwgdDAgPT09IHVuZGVmaW5lZCApIHtcclxuXHRcdFx0XHRcdGlmICggISAoIHQgPj0gdDAgKSApIHtcclxuXHJcblx0XHRcdFx0XHRcdC8vIGxvb3Bpbmc/XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCB0MWdsb2JhbCA9IHBwWyAxIF07XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIHQgPCB0MWdsb2JhbCApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0aTEgPSAyOyAvLyArIDEsIHVzaW5nIHRoZSBzY2FuIGZvciB0aGUgZGV0YWlsc1xyXG5cdFx0XHRcdFx0XHRcdHQwID0gdDFnbG9iYWw7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBsaW5lYXIgcmV2ZXJzZSBzY2FuXHJcblxyXG5cdFx0XHRcdFx0XHRmb3IgKCBsZXQgZ2l2ZVVwQXQgPSBpMSAtIDI7IDsgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmICggdDAgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHQvLyBiZWZvcmUgc3RhcnRcclxuXHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLl9jYWNoZWRJbmRleCA9IDA7XHJcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5jb3B5U2FtcGxlVmFsdWVfKCAwICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKCBpMSA9PT0gZ2l2ZVVwQXQgKSBicmVhazsgLy8gdGhpcyBsb29wXHJcblxyXG5cdFx0XHRcdFx0XHRcdHQxID0gdDA7XHJcblx0XHRcdFx0XHRcdFx0dDAgPSBwcFsgLS0gaTEgLSAxIF07XHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmICggdCA+PSB0MCApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHQvLyB3ZSBoYXZlIGFycml2ZWQgYXQgdGhlIHNvdWdodCBpbnRlcnZhbFxyXG5cdFx0XHRcdFx0XHRcdFx0YnJlYWsgc2VlaztcclxuXHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0Ly8gcHJlcGFyZSBiaW5hcnkgc2VhcmNoIG9uIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGluZGV4XHJcblx0XHRcdFx0XHRcdHJpZ2h0ID0gaTE7XHJcblx0XHRcdFx0XHRcdGkxID0gMDtcclxuXHRcdFx0XHRcdFx0YnJlYWsgbGluZWFyX3NjYW47XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8vIHRoZSBpbnRlcnZhbCBpcyB2YWxpZFxyXG5cclxuXHRcdFx0XHRcdGJyZWFrIHZhbGlkYXRlX2ludGVydmFsO1xyXG5cclxuXHRcdFx0XHR9IC8vIGxpbmVhciBzY2FuXHJcblxyXG5cdFx0XHRcdC8vIGJpbmFyeSBzZWFyY2hcclxuXHJcblx0XHRcdFx0d2hpbGUgKCBpMSA8IHJpZ2h0ICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IG1pZCA9ICggaTEgKyByaWdodCApID4+PiAxO1xyXG5cclxuXHRcdFx0XHRcdGlmICggdCA8IHBwWyBtaWQgXSApIHtcclxuXHJcblx0XHRcdFx0XHRcdHJpZ2h0ID0gbWlkO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRpMSA9IG1pZCArIDE7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHQxID0gcHBbIGkxIF07XHJcblx0XHRcdFx0dDAgPSBwcFsgaTEgLSAxIF07XHJcblxyXG5cdFx0XHRcdC8vIGNoZWNrIGJvdW5kYXJ5IGNhc2VzLCBhZ2FpblxyXG5cclxuXHRcdFx0XHRpZiAoIHQwID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0dGhpcy5fY2FjaGVkSW5kZXggPSAwO1xyXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuY29weVNhbXBsZVZhbHVlXyggMCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICggdDEgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRpMSA9IHBwLmxlbmd0aDtcclxuXHRcdFx0XHRcdHRoaXMuX2NhY2hlZEluZGV4ID0gaTE7XHJcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5jb3B5U2FtcGxlVmFsdWVfKCBpMSAtIDEgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSAvLyBzZWVrXHJcblxyXG5cdFx0XHR0aGlzLl9jYWNoZWRJbmRleCA9IGkxO1xyXG5cclxuXHRcdFx0dGhpcy5pbnRlcnZhbENoYW5nZWRfKCBpMSwgdDAsIHQxICk7XHJcblxyXG5cdFx0fSAvLyB2YWxpZGF0ZV9pbnRlcnZhbFxyXG5cclxuXHRcdHJldHVybiB0aGlzLmludGVycG9sYXRlXyggaTEsIHQwLCB0LCB0MSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGludGVycG9sYXRpb24gc2V0dGluZ3MuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBpbnRlcnBvbGF0aW9uIHNldHRpbmdzLlxyXG5cdCAqL1xyXG5cdGdldFNldHRpbmdzXygpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5zZXR0aW5ncyB8fCB0aGlzLkRlZmF1bHRTZXR0aW5nc187XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29waWVzIGEgc2FtcGxlIHZhbHVlIHRvIHRoZSByZXN1bHQgYnVmZmVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gQW4gaW5kZXggaW50byB0aGUgc2FtcGxlIHZhbHVlIGJ1ZmZlci5cclxuXHQgKiBAcmV0dXJuIHtUeXBlZEFycmF5fSBUaGUgcmVzdWx0IGJ1ZmZlci5cclxuXHQgKi9cclxuXHRjb3B5U2FtcGxlVmFsdWVfKCBpbmRleCApIHtcclxuXHJcblx0XHQvLyBjb3BpZXMgYSBzYW1wbGUgdmFsdWUgdG8gdGhlIHJlc3VsdCBidWZmZXJcclxuXHJcblx0XHRjb25zdCByZXN1bHQgPSB0aGlzLnJlc3VsdEJ1ZmZlcixcclxuXHRcdFx0dmFsdWVzID0gdGhpcy5zYW1wbGVWYWx1ZXMsXHJcblx0XHRcdHN0cmlkZSA9IHRoaXMudmFsdWVTaXplLFxyXG5cdFx0XHRvZmZzZXQgPSBpbmRleCAqIHN0cmlkZTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgIT09IHN0cmlkZTsgKysgaSApIHtcclxuXHJcblx0XHRcdHJlc3VsdFsgaSBdID0gdmFsdWVzWyBvZmZzZXQgKyBpIF07XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29waWVzIGEgc2FtcGxlIHZhbHVlIHRvIHRoZSByZXN1bHQgYnVmZmVyLlxyXG5cdCAqXHJcblx0ICogQGFic3RyYWN0XHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGkxIC0gQW4gaW5kZXggaW50byB0aGUgc2FtcGxlIHZhbHVlIGJ1ZmZlci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdDAgLSBUaGUgcHJldmlvdXMgaW50ZXJwb2xhdGlvbiBmYWN0b3IuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHQgLSBUaGUgY3VycmVudCBpbnRlcnBvbGF0aW9uIGZhY3Rvci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdDEgLSBUaGUgbmV4dCBpbnRlcnBvbGF0aW9uIGZhY3Rvci5cclxuXHQgKiBAcmV0dXJuIHtUeXBlZEFycmF5fSBUaGUgcmVzdWx0IGJ1ZmZlci5cclxuXHQgKi9cclxuXHRpbnRlcnBvbGF0ZV8oIC8qIGkxLCB0MCwgdCwgdDEgKi8gKSB7XHJcblxyXG5cdFx0dGhyb3cgbmV3IEVycm9yKCAnY2FsbCB0byBhYnN0cmFjdCBtZXRob2QnICk7XHJcblx0XHQvLyBpbXBsZW1lbnRhdGlvbnMgc2hhbGwgcmV0dXJuIHRoaXMucmVzdWx0QnVmZmVyXHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogT3B0aW9uYWwgbWV0aG9kIHRoYXQgaXMgZXhlY3V0ZWQgd2hlbiB0aGUgaW50ZXJ2YWwgaGFzIGNoYW5nZWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaTEgLSBBbiBpbmRleCBpbnRvIHRoZSBzYW1wbGUgdmFsdWUgYnVmZmVyLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0MCAtIFRoZSBwcmV2aW91cyBpbnRlcnBvbGF0aW9uIGZhY3Rvci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdCAtIFRoZSBjdXJyZW50IGludGVycG9sYXRpb24gZmFjdG9yLlxyXG5cdCAqL1xyXG5cdGludGVydmFsQ2hhbmdlZF8oIC8qIGkxLCB0MCwgdDEgKi8gKSB7XHJcblxyXG5cdFx0Ly8gZW1wdHlcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgSW50ZXJwb2xhbnQgfTtcclxuIiwiaW1wb3J0IHsgWmVyb0N1cnZhdHVyZUVuZGluZywgV3JhcEFyb3VuZEVuZGluZywgWmVyb1Nsb3BlRW5kaW5nIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgSW50ZXJwb2xhbnQgfSBmcm9tICcuLi9JbnRlcnBvbGFudC5qcyc7XHJcblxyXG4vKipcclxuICogRmFzdCBhbmQgc2ltcGxlIGN1YmljIHNwbGluZSBpbnRlcnBvbGFudC5cclxuICpcclxuICogSXQgd2FzIGRlcml2ZWQgZnJvbSBhIEhlcm1pdGlhbiBjb25zdHJ1Y3Rpb24gc2V0dGluZyB0aGUgZmlyc3QgZGVyaXZhdGl2ZVxyXG4gKiBhdCBlYWNoIHNhbXBsZSBwb3NpdGlvbiB0byB0aGUgbGluZWFyIHNsb3BlIGJldHdlZW4gbmVpZ2hib3JpbmcgcG9zaXRpb25zXHJcbiAqIG92ZXIgdGhlaXIgcGFyYW1ldGVyIGludGVydmFsLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgSW50ZXJwb2xhbnRcclxuICovXHJcbmNsYXNzIEN1YmljSW50ZXJwb2xhbnQgZXh0ZW5kcyBJbnRlcnBvbGFudCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgY3ViaWMgaW50ZXJwb2xhbnQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1R5cGVkQXJyYXl9IHBhcmFtZXRlclBvc2l0aW9ucyAtIFRoZSBwYXJhbWV0ZXIgcG9zaXRpb25zIGhvbGQgdGhlIGludGVycG9sYXRpb24gZmFjdG9ycy5cclxuXHQgKiBAcGFyYW0ge1R5cGVkQXJyYXl9IHNhbXBsZVZhbHVlcyAtIFRoZSBzYW1wbGUgdmFsdWVzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzYW1wbGVTaXplIC0gVGhlIHNhbXBsZSBzaXplXHJcblx0ICogQHBhcmFtIHtUeXBlZEFycmF5fSBbcmVzdWx0QnVmZmVyXSAtIFRoZSByZXN1bHQgYnVmZmVyLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICkge1xyXG5cclxuXHRcdHN1cGVyKCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICk7XHJcblxyXG5cdFx0dGhpcy5fd2VpZ2h0UHJldiA9IC0gMDtcclxuXHRcdHRoaXMuX29mZnNldFByZXYgPSAtIDA7XHJcblx0XHR0aGlzLl93ZWlnaHROZXh0ID0gLSAwO1xyXG5cdFx0dGhpcy5fb2Zmc2V0TmV4dCA9IC0gMDtcclxuXHJcblx0XHR0aGlzLkRlZmF1bHRTZXR0aW5nc18gPSB7XHJcblxyXG5cdFx0XHRlbmRpbmdTdGFydDogWmVyb0N1cnZhdHVyZUVuZGluZyxcclxuXHRcdFx0ZW5kaW5nRW5kOiBaZXJvQ3VydmF0dXJlRW5kaW5nXHJcblxyXG5cdFx0fTtcclxuXHJcblx0fVxyXG5cclxuXHRpbnRlcnZhbENoYW5nZWRfKCBpMSwgdDAsIHQxICkge1xyXG5cclxuXHRcdGNvbnN0IHBwID0gdGhpcy5wYXJhbWV0ZXJQb3NpdGlvbnM7XHJcblx0XHRsZXQgaVByZXYgPSBpMSAtIDIsXHJcblx0XHRcdGlOZXh0ID0gaTEgKyAxLFxyXG5cclxuXHRcdFx0dFByZXYgPSBwcFsgaVByZXYgXSxcclxuXHRcdFx0dE5leHQgPSBwcFsgaU5leHQgXTtcclxuXHJcblx0XHRpZiAoIHRQcmV2ID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRzd2l0Y2ggKCB0aGlzLmdldFNldHRpbmdzXygpLmVuZGluZ1N0YXJ0ICkge1xyXG5cclxuXHRcdFx0XHRjYXNlIFplcm9TbG9wZUVuZGluZzpcclxuXHJcblx0XHRcdFx0XHQvLyBmJyh0MCkgPSAwXHJcblx0XHRcdFx0XHRpUHJldiA9IGkxO1xyXG5cdFx0XHRcdFx0dFByZXYgPSAyICogdDAgLSB0MTtcclxuXHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0Y2FzZSBXcmFwQXJvdW5kRW5kaW5nOlxyXG5cclxuXHRcdFx0XHRcdC8vIHVzZSB0aGUgb3RoZXIgZW5kIG9mIHRoZSBjdXJ2ZVxyXG5cdFx0XHRcdFx0aVByZXYgPSBwcC5sZW5ndGggLSAyO1xyXG5cdFx0XHRcdFx0dFByZXYgPSB0MCArIHBwWyBpUHJldiBdIC0gcHBbIGlQcmV2ICsgMSBdO1xyXG5cclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRkZWZhdWx0OiAvLyBaZXJvQ3VydmF0dXJlRW5kaW5nXHJcblxyXG5cdFx0XHRcdFx0Ly8gZicnKHQwKSA9IDAgYS5rLmEuIE5hdHVyYWwgU3BsaW5lXHJcblx0XHRcdFx0XHRpUHJldiA9IGkxO1xyXG5cdFx0XHRcdFx0dFByZXYgPSB0MTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0TmV4dCA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0c3dpdGNoICggdGhpcy5nZXRTZXR0aW5nc18oKS5lbmRpbmdFbmQgKSB7XHJcblxyXG5cdFx0XHRcdGNhc2UgWmVyb1Nsb3BlRW5kaW5nOlxyXG5cclxuXHRcdFx0XHRcdC8vIGYnKHROKSA9IDBcclxuXHRcdFx0XHRcdGlOZXh0ID0gaTE7XHJcblx0XHRcdFx0XHR0TmV4dCA9IDIgKiB0MSAtIHQwO1xyXG5cclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRjYXNlIFdyYXBBcm91bmRFbmRpbmc6XHJcblxyXG5cdFx0XHRcdFx0Ly8gdXNlIHRoZSBvdGhlciBlbmQgb2YgdGhlIGN1cnZlXHJcblx0XHRcdFx0XHRpTmV4dCA9IDE7XHJcblx0XHRcdFx0XHR0TmV4dCA9IHQxICsgcHBbIDEgXSAtIHBwWyAwIF07XHJcblxyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdGRlZmF1bHQ6IC8vIFplcm9DdXJ2YXR1cmVFbmRpbmdcclxuXHJcblx0XHRcdFx0XHQvLyBmJycodE4pID0gMCwgYS5rLmEuIE5hdHVyYWwgU3BsaW5lXHJcblx0XHRcdFx0XHRpTmV4dCA9IGkxIC0gMTtcclxuXHRcdFx0XHRcdHROZXh0ID0gdDA7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGhhbGZEdCA9ICggdDEgLSB0MCApICogMC41LFxyXG5cdFx0XHRzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZTtcclxuXHJcblx0XHR0aGlzLl93ZWlnaHRQcmV2ID0gaGFsZkR0IC8gKCB0MCAtIHRQcmV2ICk7XHJcblx0XHR0aGlzLl93ZWlnaHROZXh0ID0gaGFsZkR0IC8gKCB0TmV4dCAtIHQxICk7XHJcblx0XHR0aGlzLl9vZmZzZXRQcmV2ID0gaVByZXYgKiBzdHJpZGU7XHJcblx0XHR0aGlzLl9vZmZzZXROZXh0ID0gaU5leHQgKiBzdHJpZGU7XHJcblxyXG5cdH1cclxuXHJcblx0aW50ZXJwb2xhdGVfKCBpMSwgdDAsIHQsIHQxICkge1xyXG5cclxuXHRcdGNvbnN0IHJlc3VsdCA9IHRoaXMucmVzdWx0QnVmZmVyLFxyXG5cdFx0XHR2YWx1ZXMgPSB0aGlzLnNhbXBsZVZhbHVlcyxcclxuXHRcdFx0c3RyaWRlID0gdGhpcy52YWx1ZVNpemUsXHJcblxyXG5cdFx0XHRvMSA9IGkxICogc3RyaWRlLFx0XHRvMCA9IG8xIC0gc3RyaWRlLFxyXG5cdFx0XHRvUCA9IHRoaXMuX29mZnNldFByZXYsIFx0b04gPSB0aGlzLl9vZmZzZXROZXh0LFxyXG5cdFx0XHR3UCA9IHRoaXMuX3dlaWdodFByZXYsXHR3TiA9IHRoaXMuX3dlaWdodE5leHQsXHJcblxyXG5cdFx0XHRwID0gKCB0IC0gdDAgKSAvICggdDEgLSB0MCApLFxyXG5cdFx0XHRwcCA9IHAgKiBwLFxyXG5cdFx0XHRwcHAgPSBwcCAqIHA7XHJcblxyXG5cdFx0Ly8gZXZhbHVhdGUgcG9seW5vbWlhbHNcclxuXHJcblx0XHRjb25zdCBzUCA9IC0gd1AgKiBwcHAgKyAyICogd1AgKiBwcCAtIHdQICogcDtcclxuXHRcdGNvbnN0IHMwID0gKCAxICsgd1AgKSAqIHBwcCArICggLSAxLjUgLSAyICogd1AgKSAqIHBwICsgKCAtIDAuNSArIHdQICkgKiBwICsgMTtcclxuXHRcdGNvbnN0IHMxID0gKCAtIDEgLSB3TiApICogcHBwICsgKCAxLjUgKyB3TiApICogcHAgKyAwLjUgKiBwO1xyXG5cdFx0Y29uc3Qgc04gPSB3TiAqIHBwcCAtIHdOICogcHA7XHJcblxyXG5cdFx0Ly8gY29tYmluZSBkYXRhIGxpbmVhcmx5XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpICE9PSBzdHJpZGU7ICsrIGkgKSB7XHJcblxyXG5cdFx0XHRyZXN1bHRbIGkgXSA9XHJcblx0XHRcdFx0XHRzUCAqIHZhbHVlc1sgb1AgKyBpIF0gK1xyXG5cdFx0XHRcdFx0czAgKiB2YWx1ZXNbIG8wICsgaSBdICtcclxuXHRcdFx0XHRcdHMxICogdmFsdWVzWyBvMSArIGkgXSArXHJcblx0XHRcdFx0XHRzTiAqIHZhbHVlc1sgb04gKyBpIF07XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IEN1YmljSW50ZXJwb2xhbnQgfTtcclxuIiwiaW1wb3J0IHsgSW50ZXJwb2xhbnQgfSBmcm9tICcuLi9JbnRlcnBvbGFudC5qcyc7XHJcblxyXG4vKipcclxuICogQSBiYXNpYyBsaW5lYXIgaW50ZXJwb2xhbnQuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBJbnRlcnBvbGFudFxyXG4gKi9cclxuY2xhc3MgTGluZWFySW50ZXJwb2xhbnQgZXh0ZW5kcyBJbnRlcnBvbGFudCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbGluZWFyIGludGVycG9sYW50LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUeXBlZEFycmF5fSBwYXJhbWV0ZXJQb3NpdGlvbnMgLSBUaGUgcGFyYW1ldGVyIHBvc2l0aW9ucyBob2xkIHRoZSBpbnRlcnBvbGF0aW9uIGZhY3RvcnMuXHJcblx0ICogQHBhcmFtIHtUeXBlZEFycmF5fSBzYW1wbGVWYWx1ZXMgLSBUaGUgc2FtcGxlIHZhbHVlcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc2FtcGxlU2l6ZSAtIFRoZSBzYW1wbGUgc2l6ZVxyXG5cdCAqIEBwYXJhbSB7VHlwZWRBcnJheX0gW3Jlc3VsdEJ1ZmZlcl0gLSBUaGUgcmVzdWx0IGJ1ZmZlci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApIHtcclxuXHJcblx0XHRzdXBlciggcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdGludGVycG9sYXRlXyggaTEsIHQwLCB0LCB0MSApIHtcclxuXHJcblx0XHRjb25zdCByZXN1bHQgPSB0aGlzLnJlc3VsdEJ1ZmZlcixcclxuXHRcdFx0dmFsdWVzID0gdGhpcy5zYW1wbGVWYWx1ZXMsXHJcblx0XHRcdHN0cmlkZSA9IHRoaXMudmFsdWVTaXplLFxyXG5cclxuXHRcdFx0b2Zmc2V0MSA9IGkxICogc3RyaWRlLFxyXG5cdFx0XHRvZmZzZXQwID0gb2Zmc2V0MSAtIHN0cmlkZSxcclxuXHJcblx0XHRcdHdlaWdodDEgPSAoIHQgLSB0MCApIC8gKCB0MSAtIHQwICksXHJcblx0XHRcdHdlaWdodDAgPSAxIC0gd2VpZ2h0MTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgIT09IHN0cmlkZTsgKysgaSApIHtcclxuXHJcblx0XHRcdHJlc3VsdFsgaSBdID1cclxuXHRcdFx0XHRcdHZhbHVlc1sgb2Zmc2V0MCArIGkgXSAqIHdlaWdodDAgK1xyXG5cdFx0XHRcdFx0dmFsdWVzWyBvZmZzZXQxICsgaSBdICogd2VpZ2h0MTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCB7IExpbmVhckludGVycG9sYW50IH07XHJcbiIsImltcG9ydCB7IEludGVycG9sYW50IH0gZnJvbSAnLi4vSW50ZXJwb2xhbnQuanMnO1xyXG5cclxuLyoqXHJcbiAqIEludGVycG9sYW50IHRoYXQgZXZhbHVhdGVzIHRvIHRoZSBzYW1wbGUgdmFsdWUgYXQgdGhlIHBvc2l0aW9uIHByZWNlZGluZ1xyXG4gKiB0aGUgcGFyYW1ldGVyLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgSW50ZXJwb2xhbnRcclxuICovXHJcbmNsYXNzIERpc2NyZXRlSW50ZXJwb2xhbnQgZXh0ZW5kcyBJbnRlcnBvbGFudCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgZGlzY3JldGUgaW50ZXJwb2xhbnQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1R5cGVkQXJyYXl9IHBhcmFtZXRlclBvc2l0aW9ucyAtIFRoZSBwYXJhbWV0ZXIgcG9zaXRpb25zIGhvbGQgdGhlIGludGVycG9sYXRpb24gZmFjdG9ycy5cclxuXHQgKiBAcGFyYW0ge1R5cGVkQXJyYXl9IHNhbXBsZVZhbHVlcyAtIFRoZSBzYW1wbGUgdmFsdWVzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzYW1wbGVTaXplIC0gVGhlIHNhbXBsZSBzaXplXHJcblx0ICogQHBhcmFtIHtUeXBlZEFycmF5fSBbcmVzdWx0QnVmZmVyXSAtIFRoZSByZXN1bHQgYnVmZmVyLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICkge1xyXG5cclxuXHRcdHN1cGVyKCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICk7XHJcblxyXG5cdH1cclxuXHJcblx0aW50ZXJwb2xhdGVfKCBpMSAvKiwgdDAsIHQsIHQxICovICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmNvcHlTYW1wbGVWYWx1ZV8oIGkxIC0gMSApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgRGlzY3JldGVJbnRlcnBvbGFudCB9O1xyXG4iLCJpbXBvcnQge1xyXG5cdEludGVycG9sYXRlTGluZWFyLFxyXG5cdEludGVycG9sYXRlU21vb3RoLFxyXG5cdEludGVycG9sYXRlRGlzY3JldGVcclxufSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBDdWJpY0ludGVycG9sYW50IH0gZnJvbSAnLi4vbWF0aC9pbnRlcnBvbGFudHMvQ3ViaWNJbnRlcnBvbGFudC5qcyc7XHJcbmltcG9ydCB7IExpbmVhckludGVycG9sYW50IH0gZnJvbSAnLi4vbWF0aC9pbnRlcnBvbGFudHMvTGluZWFySW50ZXJwb2xhbnQuanMnO1xyXG5pbXBvcnQgeyBEaXNjcmV0ZUludGVycG9sYW50IH0gZnJvbSAnLi4vbWF0aC9pbnRlcnBvbGFudHMvRGlzY3JldGVJbnRlcnBvbGFudC5qcyc7XHJcbmltcG9ydCAqIGFzIEFuaW1hdGlvblV0aWxzIGZyb20gJy4vQW5pbWF0aW9uVXRpbHMuanMnO1xyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgcyBhIHRpbWVkIHNlcXVlbmNlIG9mIGtleWZyYW1lcywgd2hpY2ggYXJlIGNvbXBvc2VkIG9mIGxpc3RzIG9mXHJcbiAqIHRpbWVzIGFuZCByZWxhdGVkIHZhbHVlcywgYW5kIHdoaWNoIGFyZSB1c2VkIHRvIGFuaW1hdGUgYSBzcGVjaWZpYyBwcm9wZXJ0eVxyXG4gKiBvZiBhbiBvYmplY3QuXHJcbiAqL1xyXG5jbGFzcyBLZXlmcmFtZVRyYWNrIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBrZXlmcmFtZSB0cmFjay5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIGtleWZyYW1lIHRyYWNrJ3MgbmFtZS5cclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IHRpbWVzIC0gQSBsaXN0IG9mIGtleWZyYW1lIHRpbWVzLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gdmFsdWVzIC0gQSBsaXN0IG9mIGtleWZyYW1lIHZhbHVlcy5cclxuXHQgKiBAcGFyYW0geyhJbnRlcnBvbGF0ZUxpbmVhcnxJbnRlcnBvbGF0ZURpc2NyZXRlfEludGVycG9sYXRlU21vb3RoKX0gW2ludGVycG9sYXRpb25dIC0gVGhlIGludGVycG9sYXRpb24gdHlwZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApIHtcclxuXHJcblx0XHRpZiAoIG5hbWUgPT09IHVuZGVmaW5lZCApIHRocm93IG5ldyBFcnJvciggJ1RIUkVFLktleWZyYW1lVHJhY2s6IHRyYWNrIG5hbWUgaXMgdW5kZWZpbmVkJyApO1xyXG5cdFx0aWYgKCB0aW1lcyA9PT0gdW5kZWZpbmVkIHx8IHRpbWVzLmxlbmd0aCA9PT0gMCApIHRocm93IG5ldyBFcnJvciggJ1RIUkVFLktleWZyYW1lVHJhY2s6IG5vIGtleWZyYW1lcyBpbiB0cmFjayBuYW1lZCAnICsgbmFtZSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHRyYWNrJ3MgbmFtZSBjYW4gcmVmZXIgdG8gbW9ycGggdGFyZ2V0cyBvciBib25lcyBvclxyXG5cdFx0ICogcG9zc2libHkgb3RoZXIgdmFsdWVzIHdpdGhpbiBhbiBhbmltYXRlZCBvYmplY3QuIFNlZSB7QGxpbmsgUHJvcGVydHlCaW5kaW5nI3BhcnNlVHJhY2tOYW1lfVxyXG5cdFx0ICogZm9yIHRoZSBmb3JtcyBvZiBzdHJpbmdzIHRoYXQgY2FuIGJlIHBhcnNlZCBmb3IgcHJvcGVydHkgYmluZGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5hbWUgPSBuYW1lO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGtleWZyYW1lIHRpbWVzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtGbG9hdDMyQXJyYXl9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudGltZXMgPSBBbmltYXRpb25VdGlscy5jb252ZXJ0QXJyYXkoIHRpbWVzLCB0aGlzLlRpbWVCdWZmZXJUeXBlICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUga2V5ZnJhbWUgdmFsdWVzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtGbG9hdDMyQXJyYXl9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudmFsdWVzID0gQW5pbWF0aW9uVXRpbHMuY29udmVydEFycmF5KCB2YWx1ZXMsIHRoaXMuVmFsdWVCdWZmZXJUeXBlICk7XHJcblxyXG5cdFx0dGhpcy5zZXRJbnRlcnBvbGF0aW9uKCBpbnRlcnBvbGF0aW9uIHx8IHRoaXMuRGVmYXVsdEludGVycG9sYXRpb24gKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb252ZXJ0cyB0aGUga2V5ZnJhbWUgdHJhY2sgdG8gSlNPTi5cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAcGFyYW0ge0tleWZyYW1lVHJhY2t9IHRyYWNrIC0gVGhlIGtleWZyYW1lIHRyYWNrIHRvIHNlcmlhbGl6ZS5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBzZXJpYWxpemVkIGtleWZyYW1lIHRyYWNrIGFzIEpTT04uXHJcblx0ICovXHJcblx0c3RhdGljIHRvSlNPTiggdHJhY2sgKSB7XHJcblxyXG5cdFx0Y29uc3QgdHJhY2tUeXBlID0gdHJhY2suY29uc3RydWN0b3I7XHJcblxyXG5cdFx0bGV0IGpzb247XHJcblxyXG5cdFx0Ly8gZGVyaXZlZCBjbGFzc2VzIGNhbiBkZWZpbmUgYSBzdGF0aWMgdG9KU09OIG1ldGhvZFxyXG5cdFx0aWYgKCB0cmFja1R5cGUudG9KU09OICE9PSB0aGlzLnRvSlNPTiApIHtcclxuXHJcblx0XHRcdGpzb24gPSB0cmFja1R5cGUudG9KU09OKCB0cmFjayApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHQvLyBieSBkZWZhdWx0LCB3ZSBhc3N1bWUgdGhlIGRhdGEgY2FuIGJlIHNlcmlhbGl6ZWQgYXMtaXNcclxuXHRcdFx0anNvbiA9IHtcclxuXHJcblx0XHRcdFx0J25hbWUnOiB0cmFjay5uYW1lLFxyXG5cdFx0XHRcdCd0aW1lcyc6IEFuaW1hdGlvblV0aWxzLmNvbnZlcnRBcnJheSggdHJhY2sudGltZXMsIEFycmF5ICksXHJcblx0XHRcdFx0J3ZhbHVlcyc6IEFuaW1hdGlvblV0aWxzLmNvbnZlcnRBcnJheSggdHJhY2sudmFsdWVzLCBBcnJheSApXHJcblxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0Y29uc3QgaW50ZXJwb2xhdGlvbiA9IHRyYWNrLmdldEludGVycG9sYXRpb24oKTtcclxuXHJcblx0XHRcdGlmICggaW50ZXJwb2xhdGlvbiAhPT0gdHJhY2suRGVmYXVsdEludGVycG9sYXRpb24gKSB7XHJcblxyXG5cdFx0XHRcdGpzb24uaW50ZXJwb2xhdGlvbiA9IGludGVycG9sYXRpb247XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGpzb24udHlwZSA9IHRyYWNrLlZhbHVlVHlwZU5hbWU7IC8vIG1hbmRhdG9yeVxyXG5cclxuXHRcdHJldHVybiBqc29uO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyBhIG5ldyBkaXNjcmV0ZSBpbnRlcnBvbGFudC5cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAcGFyYW0ge1R5cGVkQXJyYXl9IFtyZXN1bHRdIC0gVGhlIHJlc3VsdCBidWZmZXIuXHJcblx0ICogQHJldHVybiB7RGlzY3JldGVJbnRlcnBvbGFudH0gVGhlIG5ldyBpbnRlcnBvbGFudC5cclxuXHQgKi9cclxuXHRJbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZSggcmVzdWx0ICkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgRGlzY3JldGVJbnRlcnBvbGFudCggdGhpcy50aW1lcywgdGhpcy52YWx1ZXMsIHRoaXMuZ2V0VmFsdWVTaXplKCksIHJlc3VsdCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyBhIG5ldyBsaW5lYXIgaW50ZXJwb2xhbnQuXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQHBhcmFtIHtUeXBlZEFycmF5fSBbcmVzdWx0XSAtIFRoZSByZXN1bHQgYnVmZmVyLlxyXG5cdCAqIEByZXR1cm4ge0xpbmVhckludGVycG9sYW50fSBUaGUgbmV3IGludGVycG9sYW50LlxyXG5cdCAqL1xyXG5cdEludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhciggcmVzdWx0ICkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgTGluZWFySW50ZXJwb2xhbnQoIHRoaXMudGltZXMsIHRoaXMudmFsdWVzLCB0aGlzLmdldFZhbHVlU2l6ZSgpLCByZXN1bHQgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGYWN0b3J5IG1ldGhvZCBmb3IgY3JlYXRpbmcgYSBuZXcgc21vb3RoIGludGVycG9sYW50LlxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEBwYXJhbSB7VHlwZWRBcnJheX0gW3Jlc3VsdF0gLSBUaGUgcmVzdWx0IGJ1ZmZlci5cclxuXHQgKiBAcmV0dXJuIHtDdWJpY0ludGVycG9sYW50fSBUaGUgbmV3IGludGVycG9sYW50LlxyXG5cdCAqL1xyXG5cdEludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aCggcmVzdWx0ICkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgQ3ViaWNJbnRlcnBvbGFudCggdGhpcy50aW1lcywgdGhpcy52YWx1ZXMsIHRoaXMuZ2V0VmFsdWVTaXplKCksIHJlc3VsdCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgdGhlIGludGVycG9sYXRpb24gZmFjdG9yIG1ldGhvZCBmb3IgdGhpcyBrZXlmcmFtZSB0cmFjay5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7KEludGVycG9sYXRlTGluZWFyfEludGVycG9sYXRlRGlzY3JldGV8SW50ZXJwb2xhdGVTbW9vdGgpfSBpbnRlcnBvbGF0aW9uIC0gVGhlIGludGVycG9sYXRpb24gdHlwZS5cclxuXHQgKiBAcmV0dXJuIHtLZXlmcmFtZVRyYWNrfSBBIHJlZmVyZW5jZSB0byB0aGlzIGtleWZyYW1lIHRyYWNrLlxyXG5cdCAqL1xyXG5cdHNldEludGVycG9sYXRpb24oIGludGVycG9sYXRpb24gKSB7XHJcblxyXG5cdFx0bGV0IGZhY3RvcnlNZXRob2Q7XHJcblxyXG5cdFx0c3dpdGNoICggaW50ZXJwb2xhdGlvbiApIHtcclxuXHJcblx0XHRcdGNhc2UgSW50ZXJwb2xhdGVEaXNjcmV0ZTpcclxuXHJcblx0XHRcdFx0ZmFjdG9yeU1ldGhvZCA9IHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kRGlzY3JldGU7XHJcblxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBJbnRlcnBvbGF0ZUxpbmVhcjpcclxuXHJcblx0XHRcdFx0ZmFjdG9yeU1ldGhvZCA9IHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyO1xyXG5cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgSW50ZXJwb2xhdGVTbW9vdGg6XHJcblxyXG5cdFx0XHRcdGZhY3RvcnlNZXRob2QgPSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDtcclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggZmFjdG9yeU1ldGhvZCA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Y29uc3QgbWVzc2FnZSA9ICd1bnN1cHBvcnRlZCBpbnRlcnBvbGF0aW9uIGZvciAnICtcclxuXHRcdFx0XHR0aGlzLlZhbHVlVHlwZU5hbWUgKyAnIGtleWZyYW1lIHRyYWNrIG5hbWVkICcgKyB0aGlzLm5hbWU7XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMuY3JlYXRlSW50ZXJwb2xhbnQgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0Ly8gZmFsbCBiYWNrIHRvIGRlZmF1bHQsIHVubGVzcyB0aGUgZGVmYXVsdCBpdHNlbGYgaXMgbWVzc2VkIHVwXHJcblx0XHRcdFx0aWYgKCBpbnRlcnBvbGF0aW9uICE9PSB0aGlzLkRlZmF1bHRJbnRlcnBvbGF0aW9uICkge1xyXG5cclxuXHRcdFx0XHRcdHRoaXMuc2V0SW50ZXJwb2xhdGlvbiggdGhpcy5EZWZhdWx0SW50ZXJwb2xhdGlvbiApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciggbWVzc2FnZSApOyAvLyBmYXRhbCwgaW4gdGhpcyBjYXNlXHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLktleWZyYW1lVHJhY2s6JywgbWVzc2FnZSApO1xyXG5cdFx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5jcmVhdGVJbnRlcnBvbGFudCA9IGZhY3RvcnlNZXRob2Q7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgY3VycmVudCBpbnRlcnBvbGF0aW9uIHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHsoSW50ZXJwb2xhdGVMaW5lYXJ8SW50ZXJwb2xhdGVEaXNjcmV0ZXxJbnRlcnBvbGF0ZVNtb290aCl9IFRoZSBpbnRlcnBvbGF0aW9uIHR5cGUuXHJcblx0ICovXHJcblx0Z2V0SW50ZXJwb2xhdGlvbigpIHtcclxuXHJcblx0XHRzd2l0Y2ggKCB0aGlzLmNyZWF0ZUludGVycG9sYW50ICkge1xyXG5cclxuXHRcdFx0Y2FzZSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZERpc2NyZXRlOlxyXG5cclxuXHRcdFx0XHRyZXR1cm4gSW50ZXJwb2xhdGVEaXNjcmV0ZTtcclxuXHJcblx0XHRcdGNhc2UgdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6XHJcblxyXG5cdFx0XHRcdHJldHVybiBJbnRlcnBvbGF0ZUxpbmVhcjtcclxuXHJcblx0XHRcdGNhc2UgdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg6XHJcblxyXG5cdFx0XHRcdHJldHVybiBJbnRlcnBvbGF0ZVNtb290aDtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgdmFsdWUgc2l6ZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIHZhbHVlIHNpemUuXHJcblx0ICovXHJcblx0Z2V0VmFsdWVTaXplKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnZhbHVlcy5sZW5ndGggLyB0aGlzLnRpbWVzLmxlbmd0aDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBNb3ZlcyBhbGwga2V5ZnJhbWVzIGVpdGhlciBmb3J3YXJkIG9yIGJhY2t3YXJkIGluIHRpbWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdGltZU9mZnNldCAtIFRoZSBvZmZzZXQgdG8gbW92ZSB0aGUgdGltZSB2YWx1ZXMuXHJcblx0ICogQHJldHVybiB7S2V5ZnJhbWVUcmFja30gQSByZWZlcmVuY2UgdG8gdGhpcyBrZXlmcmFtZSB0cmFjay5cclxuXHQgKi9cclxuXHRzaGlmdCggdGltZU9mZnNldCApIHtcclxuXHJcblx0XHRpZiAoIHRpbWVPZmZzZXQgIT09IDAuMCApIHtcclxuXHJcblx0XHRcdGNvbnN0IHRpbWVzID0gdGhpcy50aW1lcztcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMCwgbiA9IHRpbWVzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcclxuXHJcblx0XHRcdFx0dGltZXNbIGkgXSArPSB0aW1lT2Zmc2V0O1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTY2FsZSBhbGwga2V5ZnJhbWUgdGltZXMgYnkgYSBmYWN0b3IgKHVzZWZ1bCBmb3IgZnJhbWUgLSBzZWNvbmRzIGNvbnZlcnNpb25zKS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lU2NhbGUgLSBUaGUgdGltZSBzY2FsZS5cclxuXHQgKiBAcmV0dXJuIHtLZXlmcmFtZVRyYWNrfSBBIHJlZmVyZW5jZSB0byB0aGlzIGtleWZyYW1lIHRyYWNrLlxyXG5cdCAqL1xyXG5cdHNjYWxlKCB0aW1lU2NhbGUgKSB7XHJcblxyXG5cdFx0aWYgKCB0aW1lU2NhbGUgIT09IDEuMCApIHtcclxuXHJcblx0XHRcdGNvbnN0IHRpbWVzID0gdGhpcy50aW1lcztcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMCwgbiA9IHRpbWVzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcclxuXHJcblx0XHRcdFx0dGltZXNbIGkgXSAqPSB0aW1lU2NhbGU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbW92ZXMga2V5ZnJhbWVzIGJlZm9yZSBhbmQgYWZ0ZXIgYW5pbWF0aW9uIHdpdGhvdXQgY2hhbmdpbmcgYW55IHZhbHVlcyB3aXRoaW4gdGhlIGRlZmluZWQgdGltZSByYW5nZS5cclxuXHQgKlxyXG5cdCAqIE5vdGU6IFRoZSBtZXRob2QgZG9lcyBub3Qgc2hpZnQgYXJvdW5kIGtleXMgdG8gdGhlIHN0YXJ0IG9mIHRoZSB0cmFjayB0aW1lLCBiZWNhdXNlIGZvciBpbnRlcnBvbGF0ZWRcclxuXHQgKiBrZXlzIHRoaXMgd2lsbCBjaGFuZ2UgdGhlaXIgdmFsdWVzXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc3RhcnRUaW1lIC0gVGhlIHN0YXJ0IHRpbWUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGVuZFRpbWUgLSBUaGUgZW5kIHRpbWUuXHJcblx0ICogQHJldHVybiB7S2V5ZnJhbWVUcmFja30gQSByZWZlcmVuY2UgdG8gdGhpcyBrZXlmcmFtZSB0cmFjay5cclxuXHQgKi9cclxuXHR0cmltKCBzdGFydFRpbWUsIGVuZFRpbWUgKSB7XHJcblxyXG5cdFx0Y29uc3QgdGltZXMgPSB0aGlzLnRpbWVzLFxyXG5cdFx0XHRuS2V5cyA9IHRpbWVzLmxlbmd0aDtcclxuXHJcblx0XHRsZXQgZnJvbSA9IDAsXHJcblx0XHRcdHRvID0gbktleXMgLSAxO1xyXG5cclxuXHRcdHdoaWxlICggZnJvbSAhPT0gbktleXMgJiYgdGltZXNbIGZyb20gXSA8IHN0YXJ0VGltZSApIHtcclxuXHJcblx0XHRcdCsrIGZyb207XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHdoaWxlICggdG8gIT09IC0gMSAmJiB0aW1lc1sgdG8gXSA+IGVuZFRpbWUgKSB7XHJcblxyXG5cdFx0XHQtLSB0bztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0KysgdG87IC8vIGluY2x1c2l2ZSAtPiBleGNsdXNpdmUgYm91bmRcclxuXHJcblx0XHRpZiAoIGZyb20gIT09IDAgfHwgdG8gIT09IG5LZXlzICkge1xyXG5cclxuXHRcdFx0Ly8gZW1wdHkgdHJhY2tzIGFyZSBmb3JiaWRkZW4sIHNvIGtlZXAgYXQgbGVhc3Qgb25lIGtleWZyYW1lXHJcblx0XHRcdGlmICggZnJvbSA+PSB0byApIHtcclxuXHJcblx0XHRcdFx0dG8gPSBNYXRoLm1heCggdG8sIDEgKTtcclxuXHRcdFx0XHRmcm9tID0gdG8gLSAxO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3Qgc3RyaWRlID0gdGhpcy5nZXRWYWx1ZVNpemUoKTtcclxuXHRcdFx0dGhpcy50aW1lcyA9IHRpbWVzLnNsaWNlKCBmcm9tLCB0byApO1xyXG5cdFx0XHR0aGlzLnZhbHVlcyA9IHRoaXMudmFsdWVzLnNsaWNlKCBmcm9tICogc3RyaWRlLCB0byAqIHN0cmlkZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQZXJmb3JtcyBtaW5pbWFsIHZhbGlkYXRpb24gb24gdGhlIGtleWZyYW1lIHRyYWNrLiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzXHJcblx0ICogYXJlIHZhbGlkLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUga2V5ZnJhbWVzIGFyZSB2YWxpZCBvciBub3QuXHJcblx0ICovXHJcblx0dmFsaWRhdGUoKSB7XHJcblxyXG5cdFx0bGV0IHZhbGlkID0gdHJ1ZTtcclxuXHJcblx0XHRjb25zdCB2YWx1ZVNpemUgPSB0aGlzLmdldFZhbHVlU2l6ZSgpO1xyXG5cdFx0aWYgKCB2YWx1ZVNpemUgLSBNYXRoLmZsb29yKCB2YWx1ZVNpemUgKSAhPT0gMCApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5LZXlmcmFtZVRyYWNrOiBJbnZhbGlkIHZhbHVlIHNpemUgaW4gdHJhY2suJywgdGhpcyApO1xyXG5cdFx0XHR2YWxpZCA9IGZhbHNlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCB0aW1lcyA9IHRoaXMudGltZXMsXHJcblx0XHRcdHZhbHVlcyA9IHRoaXMudmFsdWVzLFxyXG5cclxuXHRcdFx0bktleXMgPSB0aW1lcy5sZW5ndGg7XHJcblxyXG5cdFx0aWYgKCBuS2V5cyA9PT0gMCApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5LZXlmcmFtZVRyYWNrOiBUcmFjayBpcyBlbXB0eS4nLCB0aGlzICk7XHJcblx0XHRcdHZhbGlkID0gZmFsc2U7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGxldCBwcmV2VGltZSA9IG51bGw7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpICE9PSBuS2V5czsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGN1cnJUaW1lID0gdGltZXNbIGkgXTtcclxuXHJcblx0XHRcdGlmICggdHlwZW9mIGN1cnJUaW1lID09PSAnbnVtYmVyJyAmJiBpc05hTiggY3VyclRpbWUgKSApIHtcclxuXHJcblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLktleWZyYW1lVHJhY2s6IFRpbWUgaXMgbm90IGEgdmFsaWQgbnVtYmVyLicsIHRoaXMsIGksIGN1cnJUaW1lICk7XHJcblx0XHRcdFx0dmFsaWQgPSBmYWxzZTtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggcHJldlRpbWUgIT09IG51bGwgJiYgcHJldlRpbWUgPiBjdXJyVGltZSApIHtcclxuXHJcblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLktleWZyYW1lVHJhY2s6IE91dCBvZiBvcmRlciBrZXlzLicsIHRoaXMsIGksIGN1cnJUaW1lLCBwcmV2VGltZSApO1xyXG5cdFx0XHRcdHZhbGlkID0gZmFsc2U7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRwcmV2VGltZSA9IGN1cnJUaW1lO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHZhbHVlcyAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0aWYgKCBBbmltYXRpb25VdGlscy5pc1R5cGVkQXJyYXkoIHZhbHVlcyApICkge1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIG4gPSB2YWx1ZXMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHZhbHVlID0gdmFsdWVzWyBpIF07XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBpc05hTiggdmFsdWUgKSApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5LZXlmcmFtZVRyYWNrOiBWYWx1ZSBpcyBub3QgYSB2YWxpZCBudW1iZXIuJywgdGhpcywgaSwgdmFsdWUgKTtcclxuXHRcdFx0XHRcdFx0dmFsaWQgPSBmYWxzZTtcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB2YWxpZDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBPcHRpbWl6ZXMgdGhpcyBrZXlmcmFtZSB0cmFjayBieSByZW1vdmluZyBlcXVpdmFsZW50IHNlcXVlbnRpYWwga2V5cyAod2hpY2ggYXJlXHJcblx0ICogY29tbW9uIGluIG1vcnBoIHRhcmdldCBzZXF1ZW5jZXMpLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7QW5pbWF0aW9uQ2xpcH0gQSByZWZlcmVuY2UgdG8gdGhpcyBhbmltYXRpb24gY2xpcC5cclxuXHQgKi9cclxuXHRvcHRpbWl6ZSgpIHtcclxuXHJcblx0XHQvLyAoMCwwLDAsMCwxLDEsMSwwLDAsMCwwLDAsMCwwKSAtLT4gKDAsMCwxLDEsMCwwKVxyXG5cclxuXHRcdC8vIHRpbWVzIG9yIHZhbHVlcyBtYXkgYmUgc2hhcmVkIHdpdGggb3RoZXIgdHJhY2tzLCBzbyBvdmVyd3JpdGluZyBpcyB1bnNhZmVcclxuXHRcdGNvbnN0IHRpbWVzID0gdGhpcy50aW1lcy5zbGljZSgpLFxyXG5cdFx0XHR2YWx1ZXMgPSB0aGlzLnZhbHVlcy5zbGljZSgpLFxyXG5cdFx0XHRzdHJpZGUgPSB0aGlzLmdldFZhbHVlU2l6ZSgpLFxyXG5cclxuXHRcdFx0c21vb3RoSW50ZXJwb2xhdGlvbiA9IHRoaXMuZ2V0SW50ZXJwb2xhdGlvbigpID09PSBJbnRlcnBvbGF0ZVNtb290aCxcclxuXHJcblx0XHRcdGxhc3RJbmRleCA9IHRpbWVzLmxlbmd0aCAtIDE7XHJcblxyXG5cdFx0bGV0IHdyaXRlSW5kZXggPSAxO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMTsgaSA8IGxhc3RJbmRleDsgKysgaSApIHtcclxuXHJcblx0XHRcdGxldCBrZWVwID0gZmFsc2U7XHJcblxyXG5cdFx0XHRjb25zdCB0aW1lID0gdGltZXNbIGkgXTtcclxuXHRcdFx0Y29uc3QgdGltZU5leHQgPSB0aW1lc1sgaSArIDEgXTtcclxuXHJcblx0XHRcdC8vIHJlbW92ZSBhZGphY2VudCBrZXlmcmFtZXMgc2NoZWR1bGVkIGF0IHRoZSBzYW1lIHRpbWVcclxuXHJcblx0XHRcdGlmICggdGltZSAhPT0gdGltZU5leHQgJiYgKCBpICE9PSAxIHx8IHRpbWUgIT09IHRpbWVzWyAwIF0gKSApIHtcclxuXHJcblx0XHRcdFx0aWYgKCAhIHNtb290aEludGVycG9sYXRpb24gKSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gcmVtb3ZlIHVubmVjZXNzYXJ5IGtleWZyYW1lcyBzYW1lIGFzIHRoZWlyIG5laWdoYm9yc1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IG9mZnNldCA9IGkgKiBzdHJpZGUsXHJcblx0XHRcdFx0XHRcdG9mZnNldFAgPSBvZmZzZXQgLSBzdHJpZGUsXHJcblx0XHRcdFx0XHRcdG9mZnNldE4gPSBvZmZzZXQgKyBzdHJpZGU7XHJcblxyXG5cdFx0XHRcdFx0Zm9yICggbGV0IGogPSAwOyBqICE9PSBzdHJpZGU7ICsrIGogKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCB2YWx1ZSA9IHZhbHVlc1sgb2Zmc2V0ICsgaiBdO1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCB2YWx1ZSAhPT0gdmFsdWVzWyBvZmZzZXRQICsgaiBdIHx8XHJcblx0XHRcdFx0XHRcdFx0dmFsdWUgIT09IHZhbHVlc1sgb2Zmc2V0TiArIGogXSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0a2VlcCA9IHRydWU7XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdGtlZXAgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBpbi1wbGFjZSBjb21wYWN0aW9uXHJcblxyXG5cdFx0XHRpZiAoIGtlZXAgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggaSAhPT0gd3JpdGVJbmRleCApIHtcclxuXHJcblx0XHRcdFx0XHR0aW1lc1sgd3JpdGVJbmRleCBdID0gdGltZXNbIGkgXTtcclxuXHJcblx0XHRcdFx0XHRjb25zdCByZWFkT2Zmc2V0ID0gaSAqIHN0cmlkZSxcclxuXHRcdFx0XHRcdFx0d3JpdGVPZmZzZXQgPSB3cml0ZUluZGV4ICogc3RyaWRlO1xyXG5cclxuXHRcdFx0XHRcdGZvciAoIGxldCBqID0gMDsgaiAhPT0gc3RyaWRlOyArKyBqICkge1xyXG5cclxuXHRcdFx0XHRcdFx0dmFsdWVzWyB3cml0ZU9mZnNldCArIGogXSA9IHZhbHVlc1sgcmVhZE9mZnNldCArIGogXTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Kysgd3JpdGVJbmRleDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gZmx1c2ggbGFzdCBrZXlmcmFtZSAoY29tcGFjdGlvbiBsb29rcyBhaGVhZClcclxuXHJcblx0XHRpZiAoIGxhc3RJbmRleCA+IDAgKSB7XHJcblxyXG5cdFx0XHR0aW1lc1sgd3JpdGVJbmRleCBdID0gdGltZXNbIGxhc3RJbmRleCBdO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IHJlYWRPZmZzZXQgPSBsYXN0SW5kZXggKiBzdHJpZGUsIHdyaXRlT2Zmc2V0ID0gd3JpdGVJbmRleCAqIHN0cmlkZSwgaiA9IDA7IGogIT09IHN0cmlkZTsgKysgaiApIHtcclxuXHJcblx0XHRcdFx0dmFsdWVzWyB3cml0ZU9mZnNldCArIGogXSA9IHZhbHVlc1sgcmVhZE9mZnNldCArIGogXTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdCsrIHdyaXRlSW5kZXg7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggd3JpdGVJbmRleCAhPT0gdGltZXMubGVuZ3RoICkge1xyXG5cclxuXHRcdFx0dGhpcy50aW1lcyA9IHRpbWVzLnNsaWNlKCAwLCB3cml0ZUluZGV4ICk7XHJcblx0XHRcdHRoaXMudmFsdWVzID0gdmFsdWVzLnNsaWNlKCAwLCB3cml0ZUluZGV4ICogc3RyaWRlICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHRoaXMudGltZXMgPSB0aW1lcztcclxuXHRcdFx0dGhpcy52YWx1ZXMgPSB2YWx1ZXM7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBuZXcga2V5ZnJhbWUgdHJhY2sgd2l0aCBjb3BpZWQgdmFsdWVzIGZyb20gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0tleWZyYW1lVHJhY2t9IEEgY2xvbmUgb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjbG9uZSgpIHtcclxuXHJcblx0XHRjb25zdCB0aW1lcyA9IHRoaXMudGltZXMuc2xpY2UoKTtcclxuXHRcdGNvbnN0IHZhbHVlcyA9IHRoaXMudmFsdWVzLnNsaWNlKCk7XHJcblxyXG5cdFx0Y29uc3QgVHlwZWRLZXlmcmFtZVRyYWNrID0gdGhpcy5jb25zdHJ1Y3RvcjtcclxuXHRcdGNvbnN0IHRyYWNrID0gbmV3IFR5cGVkS2V5ZnJhbWVUcmFjayggdGhpcy5uYW1lLCB0aW1lcywgdmFsdWVzICk7XHJcblxyXG5cdFx0Ly8gSW50ZXJwb2xhbnQgYXJndW1lbnQgdG8gY29uc3RydWN0b3IgaXMgbm90IHNhdmVkLCBzbyBjb3B5IHRoZSBmYWN0b3J5IG1ldGhvZCBkaXJlY3RseS5cclxuXHRcdHRyYWNrLmNyZWF0ZUludGVycG9sYW50ID0gdGhpcy5jcmVhdGVJbnRlcnBvbGFudDtcclxuXHJcblx0XHRyZXR1cm4gdHJhY2s7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUaGUgdmFsdWUgdHlwZSBuYW1lLlxyXG4gKlxyXG4gKiBAdHlwZSB7U3RyaW5nfVxyXG4gKiBAZGVmYXVsdCAnJ1xyXG4gKi9cclxuS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUuVmFsdWVUeXBlTmFtZSA9ICcnO1xyXG5cclxuLyoqXHJcbiAqIFRoZSB0aW1lIGJ1ZmZlciB0eXBlIG9mIHRoaXMga2V5ZnJhbWUgdHJhY2suXHJcbiAqXHJcbiAqIEB0eXBlIHtUeXBlZEFycmF5fEFycmF5fVxyXG4gKiBAZGVmYXVsdCBGbG9hdDMyQXJyYXkuY29uc3RydWN0b3JcclxuICovXHJcbktleWZyYW1lVHJhY2sucHJvdG90eXBlLlRpbWVCdWZmZXJUeXBlID0gRmxvYXQzMkFycmF5O1xyXG5cclxuLyoqXHJcbiAqIFRoZSB2YWx1ZSBidWZmZXIgdHlwZSBvZiB0aGlzIGtleWZyYW1lIHRyYWNrLlxyXG4gKlxyXG4gKiBAdHlwZSB7VHlwZWRBcnJheXxBcnJheX1cclxuICogQGRlZmF1bHQgRmxvYXQzMkFycmF5LmNvbnN0cnVjdG9yXHJcbiAqL1xyXG5LZXlmcmFtZVRyYWNrLnByb3RvdHlwZS5WYWx1ZUJ1ZmZlclR5cGUgPSBGbG9hdDMyQXJyYXk7XHJcblxyXG4vKipcclxuICogVGhlIGRlZmF1bHQgaW50ZXJwb2xhdGlvbiB0eXBlIG9mIHRoaXMga2V5ZnJhbWUgdHJhY2suXHJcbiAqXHJcbiAqIEB0eXBlIHsoSW50ZXJwb2xhdGVMaW5lYXJ8SW50ZXJwb2xhdGVEaXNjcmV0ZXxJbnRlcnBvbGF0ZVNtb290aCl9XHJcbiAqIEBkZWZhdWx0IEludGVycG9sYXRlTGluZWFyXHJcbiAqL1xyXG5LZXlmcmFtZVRyYWNrLnByb3RvdHlwZS5EZWZhdWx0SW50ZXJwb2xhdGlvbiA9IEludGVycG9sYXRlTGluZWFyO1xyXG5cclxuZXhwb3J0IHsgS2V5ZnJhbWVUcmFjayB9O1xyXG4iLCJpbXBvcnQgeyBJbnRlcnBvbGF0ZURpc2NyZXRlIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgS2V5ZnJhbWVUcmFjayB9IGZyb20gJy4uL0tleWZyYW1lVHJhY2suanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgdHJhY2sgZm9yIGJvb2xlYW4ga2V5ZnJhbWUgdmFsdWVzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgS2V5ZnJhbWVUcmFja1xyXG4gKi9cclxuY2xhc3MgQm9vbGVhbktleWZyYW1lVHJhY2sgZXh0ZW5kcyBLZXlmcmFtZVRyYWNrIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBib29sZWFuIGtleWZyYW1lIHRyYWNrLlxyXG5cdCAqXHJcblx0ICogVGhpcyBrZXlmcmFtZSB0cmFjayB0eXBlIGhhcyBubyBgaW50ZXJwb2xhdGlvbmAgcGFyYW1ldGVyIGJlY2F1c2UgdGhlXHJcblx0ICogaW50ZXJwb2xhdGlvbiBpcyBhbHdheXMgZGlzY3JldGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBrZXlmcmFtZSB0cmFjaydzIG5hbWUuXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSB0aW1lcyAtIEEgbGlzdCBvZiBrZXlmcmFtZSB0aW1lcy5cclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IHZhbHVlcyAtIEEgbGlzdCBvZiBrZXlmcmFtZSB2YWx1ZXMuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5hbWUsIHRpbWVzLCB2YWx1ZXMgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5hbWUsIHRpbWVzLCB2YWx1ZXMgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFRoZSB2YWx1ZSB0eXBlIG5hbWUuXHJcbiAqXHJcbiAqIEB0eXBlIHtTdHJpbmd9XHJcbiAqIEBkZWZhdWx0ICdib29sJ1xyXG4gKi9cclxuQm9vbGVhbktleWZyYW1lVHJhY2sucHJvdG90eXBlLlZhbHVlVHlwZU5hbWUgPSAnYm9vbCc7XHJcblxyXG4vKipcclxuICogVGhlIHZhbHVlIGJ1ZmZlciB0eXBlIG9mIHRoaXMga2V5ZnJhbWUgdHJhY2suXHJcbiAqXHJcbiAqIEB0eXBlIHtUeXBlZEFycmF5fEFycmF5fVxyXG4gKiBAZGVmYXVsdCBBcnJheS5jb25zdHJ1Y3RvclxyXG4gKi9cclxuQm9vbGVhbktleWZyYW1lVHJhY2sucHJvdG90eXBlLlZhbHVlQnVmZmVyVHlwZSA9IEFycmF5O1xyXG5cclxuLyoqXHJcbiAqIFRoZSBkZWZhdWx0IGludGVycG9sYXRpb24gdHlwZSBvZiB0aGlzIGtleWZyYW1lIHRyYWNrLlxyXG4gKlxyXG4gKiBAdHlwZSB7KEludGVycG9sYXRlTGluZWFyfEludGVycG9sYXRlRGlzY3JldGV8SW50ZXJwb2xhdGVTbW9vdGgpfVxyXG4gKiBAZGVmYXVsdCBJbnRlcnBvbGF0ZURpc2NyZXRlXHJcbiAqL1xyXG5Cb29sZWFuS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUuRGVmYXVsdEludGVycG9sYXRpb24gPSBJbnRlcnBvbGF0ZURpc2NyZXRlO1xyXG5Cb29sZWFuS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyID0gdW5kZWZpbmVkO1xyXG5Cb29sZWFuS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoID0gdW5kZWZpbmVkO1xyXG5cclxuZXhwb3J0IHsgQm9vbGVhbktleWZyYW1lVHJhY2sgfTtcclxuIiwiaW1wb3J0IHsgS2V5ZnJhbWVUcmFjayB9IGZyb20gJy4uL0tleWZyYW1lVHJhY2suanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgdHJhY2sgZm9yIGNvbG9yIGtleWZyYW1lIHZhbHVlcy5cclxuICpcclxuICogQGF1Z21lbnRzIEtleWZyYW1lVHJhY2tcclxuICovXHJcbmNsYXNzIENvbG9yS2V5ZnJhbWVUcmFjayBleHRlbmRzIEtleWZyYW1lVHJhY2sge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGNvbG9yIGtleWZyYW1lIHRyYWNrLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUga2V5ZnJhbWUgdHJhY2sncyBuYW1lLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gdGltZXMgLSBBIGxpc3Qgb2Yga2V5ZnJhbWUgdGltZXMuXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSB2YWx1ZXMgLSBBIGxpc3Qgb2Yga2V5ZnJhbWUgdmFsdWVzLlxyXG5cdCAqIEBwYXJhbSB7KEludGVycG9sYXRlTGluZWFyfEludGVycG9sYXRlRGlzY3JldGV8SW50ZXJwb2xhdGVTbW9vdGgpfSBbaW50ZXJwb2xhdGlvbl0gLSBUaGUgaW50ZXJwb2xhdGlvbiB0eXBlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICkge1xyXG5cclxuXHRcdHN1cGVyKCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUaGUgdmFsdWUgdHlwZSBuYW1lLlxyXG4gKlxyXG4gKiBAdHlwZSB7U3RyaW5nfVxyXG4gKiBAZGVmYXVsdCAnY29sb3InXHJcbiAqL1xyXG5Db2xvcktleWZyYW1lVHJhY2sucHJvdG90eXBlLlZhbHVlVHlwZU5hbWUgPSAnY29sb3InO1xyXG4vLyBWYWx1ZUJ1ZmZlclR5cGUgaXMgaW5oZXJpdGVkXHJcbi8vIERlZmF1bHRJbnRlcnBvbGF0aW9uIGlzIGluaGVyaXRlZFxyXG5cclxuZXhwb3J0IHsgQ29sb3JLZXlmcmFtZVRyYWNrIH07XHJcbiIsImltcG9ydCB7IEtleWZyYW1lVHJhY2sgfSBmcm9tICcuLi9LZXlmcmFtZVRyYWNrLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIHRyYWNrIGZvciBudW1lcmljIGtleWZyYW1lIHZhbHVlcy5cclxuICpcclxuICogQGF1Z21lbnRzIEtleWZyYW1lVHJhY2tcclxuICovXHJcbmNsYXNzIE51bWJlcktleWZyYW1lVHJhY2sgZXh0ZW5kcyBLZXlmcmFtZVRyYWNrIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBudW1iZXIga2V5ZnJhbWUgdHJhY2suXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBrZXlmcmFtZSB0cmFjaydzIG5hbWUuXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSB0aW1lcyAtIEEgbGlzdCBvZiBrZXlmcmFtZSB0aW1lcy5cclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IHZhbHVlcyAtIEEgbGlzdCBvZiBrZXlmcmFtZSB2YWx1ZXMuXHJcblx0ICogQHBhcmFtIHsoSW50ZXJwb2xhdGVMaW5lYXJ8SW50ZXJwb2xhdGVEaXNjcmV0ZXxJbnRlcnBvbGF0ZVNtb290aCl9IFtpbnRlcnBvbGF0aW9uXSAtIFRoZSBpbnRlcnBvbGF0aW9uIHR5cGUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFRoZSB2YWx1ZSB0eXBlIG5hbWUuXHJcbiAqXHJcbiAqIEB0eXBlIHtTdHJpbmd9XHJcbiAqIEBkZWZhdWx0ICdudW1iZXInXHJcbiAqL1xyXG5OdW1iZXJLZXlmcmFtZVRyYWNrLnByb3RvdHlwZS5WYWx1ZVR5cGVOYW1lID0gJ251bWJlcic7XHJcbi8vIFZhbHVlQnVmZmVyVHlwZSBpcyBpbmhlcml0ZWRcclxuLy8gRGVmYXVsdEludGVycG9sYXRpb24gaXMgaW5oZXJpdGVkXHJcblxyXG5leHBvcnQgeyBOdW1iZXJLZXlmcmFtZVRyYWNrIH07XHJcbiIsImltcG9ydCB7IEludGVycG9sYW50IH0gZnJvbSAnLi4vSW50ZXJwb2xhbnQuanMnO1xyXG5pbXBvcnQgeyBRdWF0ZXJuaW9uIH0gZnJvbSAnLi4vUXVhdGVybmlvbi5qcyc7XHJcblxyXG4vKipcclxuICogU3BoZXJpY2FsIGxpbmVhciB1bml0IHF1YXRlcm5pb24gaW50ZXJwb2xhbnQuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBJbnRlcnBvbGFudFxyXG4gKi9cclxuY2xhc3MgUXVhdGVybmlvbkxpbmVhckludGVycG9sYW50IGV4dGVuZHMgSW50ZXJwb2xhbnQge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IFNMRVJQIGludGVycG9sYW50LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUeXBlZEFycmF5fSBwYXJhbWV0ZXJQb3NpdGlvbnMgLSBUaGUgcGFyYW1ldGVyIHBvc2l0aW9ucyBob2xkIHRoZSBpbnRlcnBvbGF0aW9uIGZhY3RvcnMuXHJcblx0ICogQHBhcmFtIHtUeXBlZEFycmF5fSBzYW1wbGVWYWx1ZXMgLSBUaGUgc2FtcGxlIHZhbHVlcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc2FtcGxlU2l6ZSAtIFRoZSBzYW1wbGUgc2l6ZVxyXG5cdCAqIEBwYXJhbSB7VHlwZWRBcnJheX0gW3Jlc3VsdEJ1ZmZlcl0gLSBUaGUgcmVzdWx0IGJ1ZmZlci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApIHtcclxuXHJcblx0XHRzdXBlciggcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdGludGVycG9sYXRlXyggaTEsIHQwLCB0LCB0MSApIHtcclxuXHJcblx0XHRjb25zdCByZXN1bHQgPSB0aGlzLnJlc3VsdEJ1ZmZlcixcclxuXHRcdFx0dmFsdWVzID0gdGhpcy5zYW1wbGVWYWx1ZXMsXHJcblx0XHRcdHN0cmlkZSA9IHRoaXMudmFsdWVTaXplLFxyXG5cclxuXHRcdFx0YWxwaGEgPSAoIHQgLSB0MCApIC8gKCB0MSAtIHQwICk7XHJcblxyXG5cdFx0bGV0IG9mZnNldCA9IGkxICogc3RyaWRlO1xyXG5cclxuXHRcdGZvciAoIGxldCBlbmQgPSBvZmZzZXQgKyBzdHJpZGU7IG9mZnNldCAhPT0gZW5kOyBvZmZzZXQgKz0gNCApIHtcclxuXHJcblx0XHRcdFF1YXRlcm5pb24uc2xlcnBGbGF0KCByZXN1bHQsIDAsIHZhbHVlcywgb2Zmc2V0IC0gc3RyaWRlLCB2YWx1ZXMsIG9mZnNldCwgYWxwaGEgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCB7IFF1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudCB9O1xyXG4iLCJpbXBvcnQgeyBLZXlmcmFtZVRyYWNrIH0gZnJvbSAnLi4vS2V5ZnJhbWVUcmFjay5qcyc7XHJcbmltcG9ydCB7IFF1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudCB9IGZyb20gJy4uLy4uL21hdGgvaW50ZXJwb2xhbnRzL1F1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudC5qcyc7XHJcblxyXG4vKipcclxuICogQSB0cmFjayBmb3IgUXVhdGVybmlvbiBrZXlmcmFtZSB2YWx1ZXMuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBLZXlmcmFtZVRyYWNrXHJcbiAqL1xyXG5jbGFzcyBRdWF0ZXJuaW9uS2V5ZnJhbWVUcmFjayBleHRlbmRzIEtleWZyYW1lVHJhY2sge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IFF1YXRlcm5pb24ga2V5ZnJhbWUgdHJhY2suXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBrZXlmcmFtZSB0cmFjaydzIG5hbWUuXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSB0aW1lcyAtIEEgbGlzdCBvZiBrZXlmcmFtZSB0aW1lcy5cclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IHZhbHVlcyAtIEEgbGlzdCBvZiBrZXlmcmFtZSB2YWx1ZXMuXHJcblx0ICogQHBhcmFtIHsoSW50ZXJwb2xhdGVMaW5lYXJ8SW50ZXJwb2xhdGVEaXNjcmV0ZXxJbnRlcnBvbGF0ZVNtb290aCl9IFtpbnRlcnBvbGF0aW9uXSAtIFRoZSBpbnRlcnBvbGF0aW9uIHR5cGUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBPdmVyd3JpdHRlbiBzbyB0aGUgbWV0aG9kIHJldHVybnMgUXVhdGVybmlvbiBiYXNlZCBpbnRlcnBvbGFudC5cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAcGFyYW0ge1R5cGVkQXJyYXl9IFtyZXN1bHRdIC0gVGhlIHJlc3VsdCBidWZmZXIuXHJcblx0ICogQHJldHVybiB7UXVhdGVybmlvbkxpbmVhckludGVycG9sYW50fSBUaGUgbmV3IGludGVycG9sYW50LlxyXG5cdCAqL1xyXG5cdEludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhciggcmVzdWx0ICkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgUXVhdGVybmlvbkxpbmVhckludGVycG9sYW50KCB0aGlzLnRpbWVzLCB0aGlzLnZhbHVlcywgdGhpcy5nZXRWYWx1ZVNpemUoKSwgcmVzdWx0ICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUaGUgdmFsdWUgdHlwZSBuYW1lLlxyXG4gKlxyXG4gKiBAdHlwZSB7U3RyaW5nfVxyXG4gKiBAZGVmYXVsdCAncXVhdGVybmlvbidcclxuICovXHJcblF1YXRlcm5pb25LZXlmcmFtZVRyYWNrLnByb3RvdHlwZS5WYWx1ZVR5cGVOYW1lID0gJ3F1YXRlcm5pb24nO1xyXG4vLyBWYWx1ZUJ1ZmZlclR5cGUgaXMgaW5oZXJpdGVkXHJcbi8vIERlZmF1bHRJbnRlcnBvbGF0aW9uIGlzIGluaGVyaXRlZDtcclxuUXVhdGVybmlvbktleWZyYW1lVHJhY2sucHJvdG90eXBlLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aCA9IHVuZGVmaW5lZDtcclxuXHJcbmV4cG9ydCB7IFF1YXRlcm5pb25LZXlmcmFtZVRyYWNrIH07XHJcbiIsImltcG9ydCB7IEludGVycG9sYXRlRGlzY3JldGUgfSBmcm9tICcuLi8uLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBLZXlmcmFtZVRyYWNrIH0gZnJvbSAnLi4vS2V5ZnJhbWVUcmFjay5qcyc7XHJcblxyXG4vKipcclxuICogQSB0cmFjayBmb3Igc3RyaW5nIGtleWZyYW1lIHZhbHVlcy5cclxuICpcclxuICogQGF1Z21lbnRzIEtleWZyYW1lVHJhY2tcclxuICovXHJcbmNsYXNzIFN0cmluZ0tleWZyYW1lVHJhY2sgZXh0ZW5kcyBLZXlmcmFtZVRyYWNrIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBzdHJpbmcga2V5ZnJhbWUgdHJhY2suXHJcblx0ICpcclxuXHQgKiBUaGlzIGtleWZyYW1lIHRyYWNrIHR5cGUgaGFzIG5vIGBpbnRlcnBvbGF0aW9uYCBwYXJhbWV0ZXIgYmVjYXVzZSB0aGVcclxuXHQgKiBpbnRlcnBvbGF0aW9uIGlzIGFsd2F5cyBkaXNjcmV0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIGtleWZyYW1lIHRyYWNrJ3MgbmFtZS5cclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IHRpbWVzIC0gQSBsaXN0IG9mIGtleWZyYW1lIHRpbWVzLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gdmFsdWVzIC0gQSBsaXN0IG9mIGtleWZyYW1lIHZhbHVlcy5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbmFtZSwgdGltZXMsIHZhbHVlcyApIHtcclxuXHJcblx0XHRzdXBlciggbmFtZSwgdGltZXMsIHZhbHVlcyApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogVGhlIHZhbHVlIHR5cGUgbmFtZS5cclxuICpcclxuICogQHR5cGUge1N0cmluZ31cclxuICogQGRlZmF1bHQgJ3N0cmluZydcclxuICovXHJcblN0cmluZ0tleWZyYW1lVHJhY2sucHJvdG90eXBlLlZhbHVlVHlwZU5hbWUgPSAnc3RyaW5nJztcclxuXHJcbi8qKlxyXG4gKiBUaGUgdmFsdWUgYnVmZmVyIHR5cGUgb2YgdGhpcyBrZXlmcmFtZSB0cmFjay5cclxuICpcclxuICogQHR5cGUge1R5cGVkQXJyYXl8QXJyYXl9XHJcbiAqIEBkZWZhdWx0IEFycmF5LmNvbnN0cnVjdG9yXHJcbiAqL1xyXG5TdHJpbmdLZXlmcmFtZVRyYWNrLnByb3RvdHlwZS5WYWx1ZUJ1ZmZlclR5cGUgPSBBcnJheTtcclxuXHJcbi8qKlxyXG4gKiBUaGUgZGVmYXVsdCBpbnRlcnBvbGF0aW9uIHR5cGUgb2YgdGhpcyBrZXlmcmFtZSB0cmFjay5cclxuICpcclxuICogQHR5cGUgeyhJbnRlcnBvbGF0ZUxpbmVhcnxJbnRlcnBvbGF0ZURpc2NyZXRlfEludGVycG9sYXRlU21vb3RoKX1cclxuICogQGRlZmF1bHQgSW50ZXJwb2xhdGVEaXNjcmV0ZVxyXG4gKi9cclxuU3RyaW5nS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUuRGVmYXVsdEludGVycG9sYXRpb24gPSBJbnRlcnBvbGF0ZURpc2NyZXRlO1xyXG5TdHJpbmdLZXlmcmFtZVRyYWNrLnByb3RvdHlwZS5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXIgPSB1bmRlZmluZWQ7XHJcblN0cmluZ0tleWZyYW1lVHJhY2sucHJvdG90eXBlLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aCA9IHVuZGVmaW5lZDtcclxuXHJcbmV4cG9ydCB7IFN0cmluZ0tleWZyYW1lVHJhY2sgfTtcclxuIiwiaW1wb3J0IHsgS2V5ZnJhbWVUcmFjayB9IGZyb20gJy4uL0tleWZyYW1lVHJhY2suanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgdHJhY2sgZm9yIHZlY3RvciBrZXlmcmFtZSB2YWx1ZXMuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBLZXlmcmFtZVRyYWNrXHJcbiAqL1xyXG5jbGFzcyBWZWN0b3JLZXlmcmFtZVRyYWNrIGV4dGVuZHMgS2V5ZnJhbWVUcmFjayB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgdmVjdG9yIGtleWZyYW1lIHRyYWNrLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUga2V5ZnJhbWUgdHJhY2sncyBuYW1lLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gdGltZXMgLSBBIGxpc3Qgb2Yga2V5ZnJhbWUgdGltZXMuXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSB2YWx1ZXMgLSBBIGxpc3Qgb2Yga2V5ZnJhbWUgdmFsdWVzLlxyXG5cdCAqIEBwYXJhbSB7KEludGVycG9sYXRlTGluZWFyfEludGVycG9sYXRlRGlzY3JldGV8SW50ZXJwb2xhdGVTbW9vdGgpfSBbaW50ZXJwb2xhdGlvbl0gLSBUaGUgaW50ZXJwb2xhdGlvbiB0eXBlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICkge1xyXG5cclxuXHRcdHN1cGVyKCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUaGUgdmFsdWUgdHlwZSBuYW1lLlxyXG4gKlxyXG4gKiBAdHlwZSB7U3RyaW5nfVxyXG4gKiBAZGVmYXVsdCAndmVjdG9yJ1xyXG4gKi9cclxuVmVjdG9yS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUuVmFsdWVUeXBlTmFtZSA9ICd2ZWN0b3InO1xyXG4vLyBWYWx1ZUJ1ZmZlclR5cGUgaXMgaW5oZXJpdGVkXHJcbi8vIERlZmF1bHRJbnRlcnBvbGF0aW9uIGlzIGluaGVyaXRlZFxyXG5cclxuZXhwb3J0IHsgVmVjdG9yS2V5ZnJhbWVUcmFjayB9O1xyXG4iLCJpbXBvcnQgKiBhcyBBbmltYXRpb25VdGlscyBmcm9tICcuL0FuaW1hdGlvblV0aWxzLmpzJztcclxuaW1wb3J0IHsgS2V5ZnJhbWVUcmFjayB9IGZyb20gJy4vS2V5ZnJhbWVUcmFjay5qcyc7XHJcbmltcG9ydCB7IEJvb2xlYW5LZXlmcmFtZVRyYWNrIH0gZnJvbSAnLi90cmFja3MvQm9vbGVhbktleWZyYW1lVHJhY2suanMnO1xyXG5pbXBvcnQgeyBDb2xvcktleWZyYW1lVHJhY2sgfSBmcm9tICcuL3RyYWNrcy9Db2xvcktleWZyYW1lVHJhY2suanMnO1xyXG5pbXBvcnQgeyBOdW1iZXJLZXlmcmFtZVRyYWNrIH0gZnJvbSAnLi90cmFja3MvTnVtYmVyS2V5ZnJhbWVUcmFjay5qcyc7XHJcbmltcG9ydCB7IFF1YXRlcm5pb25LZXlmcmFtZVRyYWNrIH0gZnJvbSAnLi90cmFja3MvUXVhdGVybmlvbktleWZyYW1lVHJhY2suanMnO1xyXG5pbXBvcnQgeyBTdHJpbmdLZXlmcmFtZVRyYWNrIH0gZnJvbSAnLi90cmFja3MvU3RyaW5nS2V5ZnJhbWVUcmFjay5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcktleWZyYW1lVHJhY2sgfSBmcm9tICcuL3RyYWNrcy9WZWN0b3JLZXlmcmFtZVRyYWNrLmpzJztcclxuaW1wb3J0IHsgZ2VuZXJhdGVVVUlEIH0gZnJvbSAnLi4vbWF0aC9NYXRoVXRpbHMuanMnO1xyXG5pbXBvcnQgeyBOb3JtYWxBbmltYXRpb25CbGVuZE1vZGUgfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgcmV1c2FibGUgc2V0IG9mIGtleWZyYW1lIHRyYWNrcyB3aGljaCByZXByZXNlbnQgYW4gYW5pbWF0aW9uLlxyXG4gKi9cclxuY2xhc3MgQW5pbWF0aW9uQ2xpcCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYW5pbWF0aW9uIGNsaXAuXHJcblx0ICpcclxuXHQgKiBOb3RlOiBJbnN0ZWFkIG9mIGluc3RhbnRpYXRpbmcgYW4gQW5pbWF0aW9uQ2xpcCBkaXJlY3RseSB3aXRoIHRoZSBjb25zdHJ1Y3RvciwgeW91IGNhblxyXG5cdCAqIHVzZSB0aGUgc3RhdGljIGludGVyZmFjZSBvZiB0aGlzIGNsYXNzIGZvciBjcmVhdGluZyBjbGlwcy4gSW4gbW9zdCBjYXNlcyB0aG91Z2gsIGFuaW1hdGlvbiBjbGlwc1xyXG5cdCAqIHdpbGwgYXV0b21hdGljYWxseSBiZSBjcmVhdGVkIGJ5IGxvYWRlcnMgd2hlbiBpbXBvcnRpbmcgYW5pbWF0ZWQgM0QgYXNzZXRzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lPScnXSAtIFRoZSBjbGlwJ3MgbmFtZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2R1cmF0aW9uPS0xXSAtIFRoZSBjbGlwJ3MgZHVyYXRpb24gaW4gc2Vjb25kcy4gSWYgYSBuZWdhdGl2ZSB2YWx1ZSBpcyBwYXNzZWQsXHJcblx0ICogdGhlIGR1cmF0aW9uIHdpbGwgYmUgY2FsY3VsYXRlZCBmcm9tIHRoZSBwYXNzZWQga2V5ZnJhbWVzLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8S2V5ZnJhbWVUcmFjaz59IHRyYWNrcyAtIEFuIGFycmF5IG9mIGtleWZyYW1lIHRyYWNrcy5cclxuXHQgKiBAcGFyYW0geyhOb3JtYWxBbmltYXRpb25CbGVuZE1vZGV8QWRkaXRpdmVBbmltYXRpb25CbGVuZE1vZGUpfSBbYmxlbmRNb2RlPU5vcm1hbEFuaW1hdGlvbkJsZW5kTW9kZV0gLSBEZWZpbmVzIGhvdyB0aGUgYW5pbWF0aW9uXHJcblx0ICogaXMgYmxlbmRlZC9jb21iaW5lZCB3aGVuIHR3byBvciBtb3JlIGFuaW1hdGlvbnMgYXJlIHNpbXVsdGFuZW91c2x5IHBsYXllZC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbmFtZSA9ICcnLCBkdXJhdGlvbiA9IC0gMSwgdHJhY2tzID0gW10sIGJsZW5kTW9kZSA9IE5vcm1hbEFuaW1hdGlvbkJsZW5kTW9kZSApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjbGlwJ3MgbmFtZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5hbWUgPSBuYW1lO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogIEFuIGFycmF5IG9mIGtleWZyYW1lIHRyYWNrcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8S2V5ZnJhbWVUcmFjaz59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudHJhY2tzID0gdHJhY2tzO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNsaXAncyBkdXJhdGlvbiBpbiBzZWNvbmRzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZHVyYXRpb24gPSBkdXJhdGlvbjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgaG93IHRoZSBhbmltYXRpb24gaXMgYmxlbmRlZC9jb21iaW5lZCB3aGVuIHR3byBvciBtb3JlIGFuaW1hdGlvbnNcclxuXHRcdCAqIGFyZSBzaW11bHRhbmVvdXNseSBwbGF5ZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeyhOb3JtYWxBbmltYXRpb25CbGVuZE1vZGV8QWRkaXRpdmVBbmltYXRpb25CbGVuZE1vZGUpfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJsZW5kTW9kZSA9IGJsZW5kTW9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBVVUlEIG9mIHRoZSBhbmltYXRpb24gY2xpcC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXVpZCA9IGdlbmVyYXRlVVVJRCgpO1xyXG5cclxuXHRcdC8vIHRoaXMgbWVhbnMgaXQgc2hvdWxkIGZpZ3VyZSBvdXQgaXRzIGR1cmF0aW9uIGJ5IHNjYW5uaW5nIHRoZSB0cmFja3NcclxuXHRcdGlmICggdGhpcy5kdXJhdGlvbiA8IDAgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnJlc2V0RHVyYXRpb24oKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRmFjdG9yeSBtZXRob2QgZm9yIGNyZWF0aW5nIGFuIGFuaW1hdGlvbiBjbGlwIGZyb20gdGhlIGdpdmVuIEpTT04uXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGpzb24gLSBUaGUgc2VyaWFsaXplZCBhbmltYXRpb24gY2xpcC5cclxuXHQgKiBAcmV0dXJuIHtBbmltYXRpb25DbGlwfSBUaGUgbmV3IGFuaW1hdGlvbiBjbGlwLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBwYXJzZSgganNvbiApIHtcclxuXHJcblx0XHRjb25zdCB0cmFja3MgPSBbXSxcclxuXHRcdFx0anNvblRyYWNrcyA9IGpzb24udHJhY2tzLFxyXG5cdFx0XHRmcmFtZVRpbWUgPSAxLjAgLyAoIGpzb24uZnBzIHx8IDEuMCApO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbiA9IGpzb25UcmFja3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xyXG5cclxuXHRcdFx0dHJhY2tzLnB1c2goIHBhcnNlS2V5ZnJhbWVUcmFjaygganNvblRyYWNrc1sgaSBdICkuc2NhbGUoIGZyYW1lVGltZSApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGNsaXAgPSBuZXcgdGhpcygganNvbi5uYW1lLCBqc29uLmR1cmF0aW9uLCB0cmFja3MsIGpzb24uYmxlbmRNb2RlICk7XHJcblx0XHRjbGlwLnV1aWQgPSBqc29uLnV1aWQ7XHJcblxyXG5cdFx0cmV0dXJuIGNsaXA7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2VyaWFsaXplcyB0aGUgZ2l2ZW4gYW5pbWF0aW9uIGNsaXAgaW50byBKU09OLlxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEBwYXJhbSB7QW5pbWF0aW9uQ2xpcH0gY2xpcCAtIFRoZSBhbmltYXRpb24gY2xpcCB0byBzZXJpYWxpemUuXHJcblx0ICogQHJldHVybiB7T2JqZWN0fSBUaGUgSlNPTiBvYmplY3QuXHJcblx0ICovXHJcblx0c3RhdGljIHRvSlNPTiggY2xpcCApIHtcclxuXHJcblx0XHRjb25zdCB0cmFja3MgPSBbXSxcclxuXHRcdFx0Y2xpcFRyYWNrcyA9IGNsaXAudHJhY2tzO1xyXG5cclxuXHRcdGNvbnN0IGpzb24gPSB7XHJcblxyXG5cdFx0XHQnbmFtZSc6IGNsaXAubmFtZSxcclxuXHRcdFx0J2R1cmF0aW9uJzogY2xpcC5kdXJhdGlvbixcclxuXHRcdFx0J3RyYWNrcyc6IHRyYWNrcyxcclxuXHRcdFx0J3V1aWQnOiBjbGlwLnV1aWQsXHJcblx0XHRcdCdibGVuZE1vZGUnOiBjbGlwLmJsZW5kTW9kZVxyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBuID0gY2xpcFRyYWNrcy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XHJcblxyXG5cdFx0XHR0cmFja3MucHVzaCggS2V5ZnJhbWVUcmFjay50b0pTT04oIGNsaXBUcmFja3NbIGkgXSApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBqc29uO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBuZXcgYW5pbWF0aW9uIGNsaXAgZnJvbSB0aGUgcGFzc2VkIG1vcnBoIHRhcmdldHMgYXJyYXkgb2YgYVxyXG5cdCAqIGdlb21ldHJ5LCB0YWtpbmcgYSBuYW1lIGFuZCB0aGUgbnVtYmVyIG9mIGZyYW1lcyBwZXIgc2Vjb25kLlxyXG5cdCAqXHJcblx0ICogTm90ZTogVGhlIGZwcyBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQsIGJ1dCB0aGUgYW5pbWF0aW9uIHNwZWVkIGNhbiBiZVxyXG5cdCAqIG92ZXJyaWRkZW4gdmlhIHtAbGluayBBbmltYXRpb25BY3Rpb24jc2V0RHVyYXRpb259LlxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGFuaW1hdGlvbiBjbGlwLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8T2JqZWN0Pn0gbW9ycGhUYXJnZXRTZXF1ZW5jZSAtIEEgc2VxdWVuY2Ugb2YgbW9ycGggdGFyZ2V0cy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZnBzIC0gVGhlIEZyYW1lcy1QZXItU2Vjb25kIHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gbm9Mb29wIC0gV2hldGhlciB0aGUgY2xpcCBzaG91bGQgYmUgbm8gbG9vcCBvciBub3QuXHJcblx0ICogQHJldHVybiB7QW5pbWF0aW9uQ2xpcH0gVGhlIG5ldyBhbmltYXRpb24gY2xpcC5cclxuXHQgKi9cclxuXHRzdGF0aWMgQ3JlYXRlRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2UoIG5hbWUsIG1vcnBoVGFyZ2V0U2VxdWVuY2UsIGZwcywgbm9Mb29wICkge1xyXG5cclxuXHRcdGNvbnN0IG51bU1vcnBoVGFyZ2V0cyA9IG1vcnBoVGFyZ2V0U2VxdWVuY2UubGVuZ3RoO1xyXG5cdFx0Y29uc3QgdHJhY2tzID0gW107XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgbnVtTW9ycGhUYXJnZXRzOyBpICsrICkge1xyXG5cclxuXHRcdFx0bGV0IHRpbWVzID0gW107XHJcblx0XHRcdGxldCB2YWx1ZXMgPSBbXTtcclxuXHJcblx0XHRcdHRpbWVzLnB1c2goXHJcblx0XHRcdFx0KCBpICsgbnVtTW9ycGhUYXJnZXRzIC0gMSApICUgbnVtTW9ycGhUYXJnZXRzLFxyXG5cdFx0XHRcdGksXHJcblx0XHRcdFx0KCBpICsgMSApICUgbnVtTW9ycGhUYXJnZXRzICk7XHJcblxyXG5cdFx0XHR2YWx1ZXMucHVzaCggMCwgMSwgMCApO1xyXG5cclxuXHRcdFx0Y29uc3Qgb3JkZXIgPSBBbmltYXRpb25VdGlscy5nZXRLZXlmcmFtZU9yZGVyKCB0aW1lcyApO1xyXG5cdFx0XHR0aW1lcyA9IEFuaW1hdGlvblV0aWxzLnNvcnRlZEFycmF5KCB0aW1lcywgMSwgb3JkZXIgKTtcclxuXHRcdFx0dmFsdWVzID0gQW5pbWF0aW9uVXRpbHMuc29ydGVkQXJyYXkoIHZhbHVlcywgMSwgb3JkZXIgKTtcclxuXHJcblx0XHRcdC8vIGlmIHRoZXJlIGlzIGEga2V5IGF0IHRoZSBmaXJzdCBmcmFtZSwgZHVwbGljYXRlIGl0IGFzIHRoZVxyXG5cdFx0XHQvLyBsYXN0IGZyYW1lIGFzIHdlbGwgZm9yIHBlcmZlY3QgbG9vcC5cclxuXHRcdFx0aWYgKCAhIG5vTG9vcCAmJiB0aW1lc1sgMCBdID09PSAwICkge1xyXG5cclxuXHRcdFx0XHR0aW1lcy5wdXNoKCBudW1Nb3JwaFRhcmdldHMgKTtcclxuXHRcdFx0XHR2YWx1ZXMucHVzaCggdmFsdWVzWyAwIF0gKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRyYWNrcy5wdXNoKFxyXG5cdFx0XHRcdG5ldyBOdW1iZXJLZXlmcmFtZVRyYWNrKFxyXG5cdFx0XHRcdFx0Jy5tb3JwaFRhcmdldEluZmx1ZW5jZXNbJyArIG1vcnBoVGFyZ2V0U2VxdWVuY2VbIGkgXS5uYW1lICsgJ10nLFxyXG5cdFx0XHRcdFx0dGltZXMsIHZhbHVlc1xyXG5cdFx0XHRcdCkuc2NhbGUoIDEuMCAvIGZwcyApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBuZXcgdGhpcyggbmFtZSwgLSAxLCB0cmFja3MgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZWFyY2hlcyBmb3IgYW4gYW5pbWF0aW9uIGNsaXAgYnkgbmFtZSwgdGFraW5nIGFzIGl0cyBmaXJzdCBwYXJhbWV0ZXJcclxuXHQgKiBlaXRoZXIgYW4gYXJyYXkgb2YgY2xpcHMsIG9yIGEgbWVzaCBvciBnZW9tZXRyeSB0aGF0IGNvbnRhaW5zIGFuXHJcblx0ICogYXJyYXkgbmFtZWQgXCJhbmltYXRpb25zXCIgcHJvcGVydHkuXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQHBhcmFtIHsoQXJyYXk8QW5pbWF0aW9uQ2xpcD58T2JqZWN0M0QpfSBvYmplY3RPckNsaXBBcnJheSAtIFRoZSBhcnJheSBvciBvYmplY3QgdG8gc2VhcmNoIHRocm91Z2guXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSB0byBzZWFyY2ggZm9yLlxyXG5cdCAqIEByZXR1cm4gez9BbmltYXRpb25DbGlwfSBUaGUgZm91bmQgYW5pbWF0aW9uIGNsaXAuIFJldHVybnMgYG51bGxgIGlmIG5vIGNsaXAgaGFzIGJlZW4gZm91bmQuXHJcblx0ICovXHJcblx0c3RhdGljIGZpbmRCeU5hbWUoIG9iamVjdE9yQ2xpcEFycmF5LCBuYW1lICkge1xyXG5cclxuXHRcdGxldCBjbGlwQXJyYXkgPSBvYmplY3RPckNsaXBBcnJheTtcclxuXHJcblx0XHRpZiAoICEgQXJyYXkuaXNBcnJheSggb2JqZWN0T3JDbGlwQXJyYXkgKSApIHtcclxuXHJcblx0XHRcdGNvbnN0IG8gPSBvYmplY3RPckNsaXBBcnJheTtcclxuXHRcdFx0Y2xpcEFycmF5ID0gby5nZW9tZXRyeSAmJiBvLmdlb21ldHJ5LmFuaW1hdGlvbnMgfHwgby5hbmltYXRpb25zO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBjbGlwQXJyYXkubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0aWYgKCBjbGlwQXJyYXlbIGkgXS5uYW1lID09PSBuYW1lICkge1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gY2xpcEFycmF5WyBpIF07XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBudWxsO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYW4gYXJyYXkgb2YgbmV3IEFuaW1hdGlvbkNsaXBzIGNyZWF0ZWQgZnJvbSB0aGUgbW9ycGggdGFyZ2V0XHJcblx0ICogc2VxdWVuY2VzIG9mIGEgZ2VvbWV0cnksIHRyeWluZyB0byBzb3J0IG1vcnBoIHRhcmdldCBuYW1lcyBpbnRvXHJcblx0ICogYW5pbWF0aW9uLWdyb3VwLWJhc2VkIHBhdHRlcm5zIGxpa2UgXCJXYWxrXzAwMSwgV2Fsa18wMDIsIFJ1bl8wMDEsIFJ1bl8wMDIuLi5cIi5cclxuXHQgKlxyXG5cdCAqIFNlZSB7QGxpbmsgTUQyTG9hZGVyI3BhcnNlfSBhcyBhbiBleGFtcGxlIGZvciBob3cgdGhlIG1ldGhvZCBzaG91bGQgYmUgdXNlZC5cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAcGFyYW0ge0FycmF5PE9iamVjdD59IG1vcnBoVGFyZ2V0cyAtIEEgc2VxdWVuY2Ugb2YgbW9ycGggdGFyZ2V0cy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZnBzIC0gVGhlIEZyYW1lcy1QZXItU2Vjb25kIHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gbm9Mb29wIC0gV2hldGhlciB0aGUgY2xpcCBzaG91bGQgYmUgbm8gbG9vcCBvciBub3QuXHJcblx0ICogQHJldHVybiB7QXJyYXk8QW5pbWF0aW9uQ2xpcD59IEFuIGFycmF5IG9mIG5ldyBhbmltYXRpb24gY2xpcHMuXHJcblx0ICovXHJcblx0c3RhdGljIENyZWF0ZUNsaXBzRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2VzKCBtb3JwaFRhcmdldHMsIGZwcywgbm9Mb29wICkge1xyXG5cclxuXHRcdGNvbnN0IGFuaW1hdGlvblRvTW9ycGhUYXJnZXRzID0ge307XHJcblxyXG5cdFx0Ly8gdGVzdGVkIHdpdGggaHR0cHM6Ly9yZWdleDEwMS5jb20vIG9uIHRyaWNrIHNlcXVlbmNlc1xyXG5cdFx0Ly8gc3VjaCBmbGFtaW5nb19mbHlBXzAwMywgZmxhbWluZ29fcnVuMV8wMDMsIGNyZGVhdGgwMDU5XHJcblx0XHRjb25zdCBwYXR0ZXJuID0gL14oW1xcdy1dKj8pKFtcXGRdKykkLztcclxuXHJcblx0XHQvLyBzb3J0IG1vcnBoIHRhcmdldCBuYW1lcyBpbnRvIGFuaW1hdGlvbiBncm91cHMgYmFzZWRcclxuXHRcdC8vIHBhdHRlcm5zIGxpa2UgV2Fsa18wMDEsIFdhbGtfMDAyLCBSdW5fMDAxLCBSdW5fMDAyXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gbW9ycGhUYXJnZXRzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgbW9ycGhUYXJnZXQgPSBtb3JwaFRhcmdldHNbIGkgXTtcclxuXHRcdFx0Y29uc3QgcGFydHMgPSBtb3JwaFRhcmdldC5uYW1lLm1hdGNoKCBwYXR0ZXJuICk7XHJcblxyXG5cdFx0XHRpZiAoIHBhcnRzICYmIHBhcnRzLmxlbmd0aCA+IDEgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IG5hbWUgPSBwYXJ0c1sgMSBdO1xyXG5cclxuXHRcdFx0XHRsZXQgYW5pbWF0aW9uTW9ycGhUYXJnZXRzID0gYW5pbWF0aW9uVG9Nb3JwaFRhcmdldHNbIG5hbWUgXTtcclxuXHJcblx0XHRcdFx0aWYgKCAhIGFuaW1hdGlvbk1vcnBoVGFyZ2V0cyApIHtcclxuXHJcblx0XHRcdFx0XHRhbmltYXRpb25Ub01vcnBoVGFyZ2V0c1sgbmFtZSBdID0gYW5pbWF0aW9uTW9ycGhUYXJnZXRzID0gW107XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0YW5pbWF0aW9uTW9ycGhUYXJnZXRzLnB1c2goIG1vcnBoVGFyZ2V0ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGNsaXBzID0gW107XHJcblxyXG5cdFx0Zm9yICggY29uc3QgbmFtZSBpbiBhbmltYXRpb25Ub01vcnBoVGFyZ2V0cyApIHtcclxuXHJcblx0XHRcdGNsaXBzLnB1c2goIHRoaXMuQ3JlYXRlRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2UoIG5hbWUsIGFuaW1hdGlvblRvTW9ycGhUYXJnZXRzWyBuYW1lIF0sIGZwcywgbm9Mb29wICkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGNsaXBzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBhcnNlcyB0aGUgYGFuaW1hdGlvbi5oaWVyYXJjaHlgIGZvcm1hdCBhbmQgcmV0dXJucyBhIG5ldyBhbmltYXRpb24gY2xpcC5cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAZGVwcmVjYXRlZCBzaW5jZSByMTc1LlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBhbmltYXRpb24gLSBBIHNlcmlhbGl6ZWQgYW5pbWF0aW9uIGNsaXAgYXMgSlNPTi5cclxuXHQgKiBAcGFyYW0ge0FycmF5PEJvbmVzPn0gYm9uZXMgLSBBbiBhcnJheSBvZiBib25lcy5cclxuXHQgKiBAcmV0dXJuIHs/QW5pbWF0aW9uQ2xpcH0gVGhlIG5ldyBhbmltYXRpb24gY2xpcC5cclxuXHQgKi9cclxuXHRzdGF0aWMgcGFyc2VBbmltYXRpb24oIGFuaW1hdGlvbiwgYm9uZXMgKSB7XHJcblxyXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQW5pbWF0aW9uQ2xpcDogcGFyc2VBbmltYXRpb24oKSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgd2l0aCByMTg1JyApO1xyXG5cclxuXHRcdGlmICggISBhbmltYXRpb24gKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuQW5pbWF0aW9uQ2xpcDogTm8gYW5pbWF0aW9uIGluIEpTT05Mb2FkZXIgZGF0YS4nICk7XHJcblx0XHRcdHJldHVybiBudWxsO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBhZGROb25lbXB0eVRyYWNrID0gZnVuY3Rpb24gKCB0cmFja1R5cGUsIHRyYWNrTmFtZSwgYW5pbWF0aW9uS2V5cywgcHJvcGVydHlOYW1lLCBkZXN0VHJhY2tzICkge1xyXG5cclxuXHRcdFx0Ly8gb25seSByZXR1cm4gdHJhY2sgaWYgdGhlcmUgYXJlIGFjdHVhbGx5IGtleXMuXHJcblx0XHRcdGlmICggYW5pbWF0aW9uS2V5cy5sZW5ndGggIT09IDAgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHRpbWVzID0gW107XHJcblx0XHRcdFx0Y29uc3QgdmFsdWVzID0gW107XHJcblxyXG5cdFx0XHRcdEFuaW1hdGlvblV0aWxzLmZsYXR0ZW5KU09OKCBhbmltYXRpb25LZXlzLCB0aW1lcywgdmFsdWVzLCBwcm9wZXJ0eU5hbWUgKTtcclxuXHJcblx0XHRcdFx0Ly8gZW1wdHkga2V5cyBhcmUgZmlsdGVyZWQgb3V0LCBzbyBjaGVjayBhZ2FpblxyXG5cdFx0XHRcdGlmICggdGltZXMubGVuZ3RoICE9PSAwICkge1xyXG5cclxuXHRcdFx0XHRcdGRlc3RUcmFja3MucHVzaCggbmV3IHRyYWNrVHlwZSggdHJhY2tOYW1lLCB0aW1lcywgdmFsdWVzICkgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0Y29uc3QgdHJhY2tzID0gW107XHJcblxyXG5cdFx0Y29uc3QgY2xpcE5hbWUgPSBhbmltYXRpb24ubmFtZSB8fCAnZGVmYXVsdCc7XHJcblx0XHRjb25zdCBmcHMgPSBhbmltYXRpb24uZnBzIHx8IDMwO1xyXG5cdFx0Y29uc3QgYmxlbmRNb2RlID0gYW5pbWF0aW9uLmJsZW5kTW9kZTtcclxuXHJcblx0XHQvLyBhdXRvbWF0aWMgbGVuZ3RoIGRldGVybWluYXRpb24gaW4gQW5pbWF0aW9uQ2xpcC5cclxuXHRcdGxldCBkdXJhdGlvbiA9IGFuaW1hdGlvbi5sZW5ndGggfHwgLSAxO1xyXG5cclxuXHRcdGNvbnN0IGhpZXJhcmNoeVRyYWNrcyA9IGFuaW1hdGlvbi5oaWVyYXJjaHkgfHwgW107XHJcblxyXG5cdFx0Zm9yICggbGV0IGggPSAwOyBoIDwgaGllcmFyY2h5VHJhY2tzLmxlbmd0aDsgaCArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGFuaW1hdGlvbktleXMgPSBoaWVyYXJjaHlUcmFja3NbIGggXS5rZXlzO1xyXG5cclxuXHRcdFx0Ly8gc2tpcCBlbXB0eSB0cmFja3NcclxuXHRcdFx0aWYgKCAhIGFuaW1hdGlvbktleXMgfHwgYW5pbWF0aW9uS2V5cy5sZW5ndGggPT09IDAgKSBjb250aW51ZTtcclxuXHJcblx0XHRcdC8vIHByb2Nlc3MgbW9ycGggdGFyZ2V0c1xyXG5cdFx0XHRpZiAoIGFuaW1hdGlvbktleXNbIDAgXS5tb3JwaFRhcmdldHMgKSB7XHJcblxyXG5cdFx0XHRcdC8vIGZpZ3VyZSBvdXQgYWxsIG1vcnBoIHRhcmdldHMgdXNlZCBpbiB0aGlzIHRyYWNrXHJcblx0XHRcdFx0Y29uc3QgbW9ycGhUYXJnZXROYW1lcyA9IHt9O1xyXG5cclxuXHRcdFx0XHRsZXQgaztcclxuXHJcblx0XHRcdFx0Zm9yICggayA9IDA7IGsgPCBhbmltYXRpb25LZXlzLmxlbmd0aDsgayArKyApIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGFuaW1hdGlvbktleXNbIGsgXS5tb3JwaFRhcmdldHMgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRmb3IgKCBsZXQgbSA9IDA7IG0gPCBhbmltYXRpb25LZXlzWyBrIF0ubW9ycGhUYXJnZXRzLmxlbmd0aDsgbSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0bW9ycGhUYXJnZXROYW1lc1sgYW5pbWF0aW9uS2V5c1sgayBdLm1vcnBoVGFyZ2V0c1sgbSBdIF0gPSAtIDE7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8vIGNyZWF0ZSBhIHRyYWNrIGZvciBlYWNoIG1vcnBoIHRhcmdldCB3aXRoIGFsbCB6ZXJvXHJcblx0XHRcdFx0Ly8gbW9ycGhUYXJnZXRJbmZsdWVuY2VzIGV4Y2VwdCBmb3IgdGhlIGtleXMgaW4gd2hpY2hcclxuXHRcdFx0XHQvLyB0aGUgbW9ycGhUYXJnZXQgaXMgbmFtZWQuXHJcblx0XHRcdFx0Zm9yICggY29uc3QgbW9ycGhUYXJnZXROYW1lIGluIG1vcnBoVGFyZ2V0TmFtZXMgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgdGltZXMgPSBbXTtcclxuXHRcdFx0XHRcdGNvbnN0IHZhbHVlcyA9IFtdO1xyXG5cclxuXHRcdFx0XHRcdGZvciAoIGxldCBtID0gMDsgbSAhPT0gYW5pbWF0aW9uS2V5c1sgayBdLm1vcnBoVGFyZ2V0cy5sZW5ndGg7ICsrIG0gKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCBhbmltYXRpb25LZXkgPSBhbmltYXRpb25LZXlzWyBrIF07XHJcblxyXG5cdFx0XHRcdFx0XHR0aW1lcy5wdXNoKCBhbmltYXRpb25LZXkudGltZSApO1xyXG5cdFx0XHRcdFx0XHR2YWx1ZXMucHVzaCggKCBhbmltYXRpb25LZXkubW9ycGhUYXJnZXQgPT09IG1vcnBoVGFyZ2V0TmFtZSApID8gMSA6IDAgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0dHJhY2tzLnB1c2goIG5ldyBOdW1iZXJLZXlmcmFtZVRyYWNrKCAnLm1vcnBoVGFyZ2V0SW5mbHVlbmNlWycgKyBtb3JwaFRhcmdldE5hbWUgKyAnXScsIHRpbWVzLCB2YWx1ZXMgKSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGR1cmF0aW9uID0gbW9ycGhUYXJnZXROYW1lcy5sZW5ndGggKiBmcHM7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHQvLyAuLi5hc3N1bWUgc2tlbGV0YWwgYW5pbWF0aW9uXHJcblxyXG5cdFx0XHRcdGNvbnN0IGJvbmVOYW1lID0gJy5ib25lc1snICsgYm9uZXNbIGggXS5uYW1lICsgJ10nO1xyXG5cclxuXHRcdFx0XHRhZGROb25lbXB0eVRyYWNrKFxyXG5cdFx0XHRcdFx0VmVjdG9yS2V5ZnJhbWVUcmFjaywgYm9uZU5hbWUgKyAnLnBvc2l0aW9uJyxcclxuXHRcdFx0XHRcdGFuaW1hdGlvbktleXMsICdwb3MnLCB0cmFja3MgKTtcclxuXHJcblx0XHRcdFx0YWRkTm9uZW1wdHlUcmFjayhcclxuXHRcdFx0XHRcdFF1YXRlcm5pb25LZXlmcmFtZVRyYWNrLCBib25lTmFtZSArICcucXVhdGVybmlvbicsXHJcblx0XHRcdFx0XHRhbmltYXRpb25LZXlzLCAncm90JywgdHJhY2tzICk7XHJcblxyXG5cdFx0XHRcdGFkZE5vbmVtcHR5VHJhY2soXHJcblx0XHRcdFx0XHRWZWN0b3JLZXlmcmFtZVRyYWNrLCBib25lTmFtZSArICcuc2NhbGUnLFxyXG5cdFx0XHRcdFx0YW5pbWF0aW9uS2V5cywgJ3NjbCcsIHRyYWNrcyApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRyYWNrcy5sZW5ndGggPT09IDAgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gbnVsbDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgY2xpcCA9IG5ldyB0aGlzKCBjbGlwTmFtZSwgZHVyYXRpb24sIHRyYWNrcywgYmxlbmRNb2RlICk7XHJcblxyXG5cdFx0cmV0dXJuIGNsaXA7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZHVyYXRpb24gb2YgdGhpcyBjbGlwIHRvIHRoZSBkdXJhdGlvbiBvZiBpdHMgbG9uZ2VzdCBrZXlmcmFtZSB0cmFjay5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0FuaW1hdGlvbkNsaXB9IEEgcmVmZXJlbmNlIHRvIHRoaXMgYW5pbWF0aW9uIGNsaXAuXHJcblx0ICovXHJcblx0cmVzZXREdXJhdGlvbigpIHtcclxuXHJcblx0XHRjb25zdCB0cmFja3MgPSB0aGlzLnRyYWNrcztcclxuXHRcdGxldCBkdXJhdGlvbiA9IDA7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBuID0gdHJhY2tzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcclxuXHJcblx0XHRcdGNvbnN0IHRyYWNrID0gdGhpcy50cmFja3NbIGkgXTtcclxuXHJcblx0XHRcdGR1cmF0aW9uID0gTWF0aC5tYXgoIGR1cmF0aW9uLCB0cmFjay50aW1lc1sgdHJhY2sudGltZXMubGVuZ3RoIC0gMSBdICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuZHVyYXRpb24gPSBkdXJhdGlvbjtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUcmltcyBhbGwgdHJhY2tzIHRvIHRoZSBjbGlwJ3MgZHVyYXRpb24uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtBbmltYXRpb25DbGlwfSBBIHJlZmVyZW5jZSB0byB0aGlzIGFuaW1hdGlvbiBjbGlwLlxyXG5cdCAqL1xyXG5cdHRyaW0oKSB7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdGhpcy50cmFja3MubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0dGhpcy50cmFja3NbIGkgXS50cmltKCAwLCB0aGlzLmR1cmF0aW9uICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBlcmZvcm1zIG1pbmltYWwgdmFsaWRhdGlvbiBvbiBlYWNoIHRyYWNrIGluIHRoZSBjbGlwLiBSZXR1cm5zIGB0cnVlYCBpZiBhbGxcclxuXHQgKiB0cmFja3MgYXJlIHZhbGlkLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgY2xpcCdzIGtleWZyYW1lcyBhcmUgdmFsaWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdHZhbGlkYXRlKCkge1xyXG5cclxuXHRcdGxldCB2YWxpZCA9IHRydWU7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdGhpcy50cmFja3MubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0dmFsaWQgPSB2YWxpZCAmJiB0aGlzLnRyYWNrc1sgaSBdLnZhbGlkYXRlKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB2YWxpZDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBPcHRpbWl6ZXMgZWFjaCB0cmFjayBieSByZW1vdmluZyBlcXVpdmFsZW50IHNlcXVlbnRpYWwga2V5cyAod2hpY2ggYXJlXHJcblx0ICogY29tbW9uIGluIG1vcnBoIHRhcmdldCBzZXF1ZW5jZXMpLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7QW5pbWF0aW9uQ2xpcH0gQSByZWZlcmVuY2UgdG8gdGhpcyBhbmltYXRpb24gY2xpcC5cclxuXHQgKi9cclxuXHRvcHRpbWl6ZSgpIHtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB0aGlzLnRyYWNrcy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnRyYWNrc1sgaSBdLm9wdGltaXplKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBuZXcgYW5pbWF0aW9uIGNsaXAgd2l0aCBjb3BpZWQgdmFsdWVzIGZyb20gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0FuaW1hdGlvbkNsaXB9IEEgY2xvbmUgb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjbG9uZSgpIHtcclxuXHJcblx0XHRjb25zdCB0cmFja3MgPSBbXTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB0aGlzLnRyYWNrcy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHR0cmFja3MucHVzaCggdGhpcy50cmFja3NbIGkgXS5jbG9uZSgpICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5uYW1lLCB0aGlzLmR1cmF0aW9uLCB0cmFja3MsIHRoaXMuYmxlbmRNb2RlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2VyaWFsaXplcyB0aGlzIGFuaW1hdGlvbiBjbGlwIGludG8gSlNPTi5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge09iamVjdH0gVGhlIEpTT04gb2JqZWN0LlxyXG5cdCAqL1xyXG5cdHRvSlNPTigpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b0pTT04oIHRoaXMgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0VHJhY2tUeXBlRm9yVmFsdWVUeXBlTmFtZSggdHlwZU5hbWUgKSB7XHJcblxyXG5cdHN3aXRjaCAoIHR5cGVOYW1lLnRvTG93ZXJDYXNlKCkgKSB7XHJcblxyXG5cdFx0Y2FzZSAnc2NhbGFyJzpcclxuXHRcdGNhc2UgJ2RvdWJsZSc6XHJcblx0XHRjYXNlICdmbG9hdCc6XHJcblx0XHRjYXNlICdudW1iZXInOlxyXG5cdFx0Y2FzZSAnaW50ZWdlcic6XHJcblxyXG5cdFx0XHRyZXR1cm4gTnVtYmVyS2V5ZnJhbWVUcmFjaztcclxuXHJcblx0XHRjYXNlICd2ZWN0b3InOlxyXG5cdFx0Y2FzZSAndmVjdG9yMic6XHJcblx0XHRjYXNlICd2ZWN0b3IzJzpcclxuXHRcdGNhc2UgJ3ZlY3RvcjQnOlxyXG5cclxuXHRcdFx0cmV0dXJuIFZlY3RvcktleWZyYW1lVHJhY2s7XHJcblxyXG5cdFx0Y2FzZSAnY29sb3InOlxyXG5cclxuXHRcdFx0cmV0dXJuIENvbG9yS2V5ZnJhbWVUcmFjaztcclxuXHJcblx0XHRjYXNlICdxdWF0ZXJuaW9uJzpcclxuXHJcblx0XHRcdHJldHVybiBRdWF0ZXJuaW9uS2V5ZnJhbWVUcmFjaztcclxuXHJcblx0XHRjYXNlICdib29sJzpcclxuXHRcdGNhc2UgJ2Jvb2xlYW4nOlxyXG5cclxuXHRcdFx0cmV0dXJuIEJvb2xlYW5LZXlmcmFtZVRyYWNrO1xyXG5cclxuXHRcdGNhc2UgJ3N0cmluZyc6XHJcblxyXG5cdFx0XHRyZXR1cm4gU3RyaW5nS2V5ZnJhbWVUcmFjaztcclxuXHJcblx0fVxyXG5cclxuXHR0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5LZXlmcmFtZVRyYWNrOiBVbnN1cHBvcnRlZCB0eXBlTmFtZTogJyArIHR5cGVOYW1lICk7XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBwYXJzZUtleWZyYW1lVHJhY2soIGpzb24gKSB7XHJcblxyXG5cdGlmICgganNvbi50eXBlID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0dGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogdHJhY2sgdHlwZSB1bmRlZmluZWQsIGNhbiBub3QgcGFyc2UnICk7XHJcblxyXG5cdH1cclxuXHJcblx0Y29uc3QgdHJhY2tUeXBlID0gZ2V0VHJhY2tUeXBlRm9yVmFsdWVUeXBlTmFtZSgganNvbi50eXBlICk7XHJcblxyXG5cdGlmICgganNvbi50aW1lcyA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdGNvbnN0IHRpbWVzID0gW10sIHZhbHVlcyA9IFtdO1xyXG5cclxuXHRcdEFuaW1hdGlvblV0aWxzLmZsYXR0ZW5KU09OKCBqc29uLmtleXMsIHRpbWVzLCB2YWx1ZXMsICd2YWx1ZScgKTtcclxuXHJcblx0XHRqc29uLnRpbWVzID0gdGltZXM7XHJcblx0XHRqc29uLnZhbHVlcyA9IHZhbHVlcztcclxuXHJcblx0fVxyXG5cclxuXHQvLyBkZXJpdmVkIGNsYXNzZXMgY2FuIGRlZmluZSBhIHN0YXRpYyBwYXJzZSBtZXRob2RcclxuXHRpZiAoIHRyYWNrVHlwZS5wYXJzZSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdHJldHVybiB0cmFja1R5cGUucGFyc2UoIGpzb24gKTtcclxuXHJcblx0fSBlbHNlIHtcclxuXHJcblx0XHQvLyBieSBkZWZhdWx0LCB3ZSBhc3N1bWUgYSBjb25zdHJ1Y3RvciBjb21wYXRpYmxlIHdpdGggdGhlIGJhc2VcclxuXHRcdHJldHVybiBuZXcgdHJhY2tUeXBlKCBqc29uLm5hbWUsIGpzb24udGltZXMsIGpzb24udmFsdWVzLCBqc29uLmludGVycG9sYXRpb24gKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgQW5pbWF0aW9uQ2xpcCB9O1xyXG4iLCIvKipcclxuICogQGNsYXNzXHJcbiAqIEBjbGFzc2Rlc2MgQSBzaW1wbGUgY2FjaGluZyBzeXN0ZW0sIHVzZWQgaW50ZXJuYWxseSBieSB7QGxpbmsgRmlsZUxvYWRlcn0uXHJcbiAqIFRvIGVuYWJsZSBjYWNoaW5nIGFjcm9zcyBhbGwgbG9hZGVycyB0aGF0IHVzZSB7QGxpbmsgRmlsZUxvYWRlcn0sIGFkZCBgVEhSRUUuQ2FjaGUuZW5hYmxlZCA9IHRydWUuYCBvbmNlIGluIHlvdXIgYXBwLlxyXG4gKiBAaGlkZWNvbnN0cnVjdG9yXHJcbiAqL1xyXG5jb25zdCBDYWNoZSA9IHtcclxuXHJcblx0LyoqXHJcblx0ICogV2hldGhlciBjYWNoaW5nIGlzIGVuYWJsZWQgb3Igbm90LlxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0ICovXHJcblx0ZW5hYmxlZDogZmFsc2UsXHJcblxyXG5cdC8qKlxyXG5cdCAqIEEgZGljdGlvbmFyeSB0aGF0IGhvbGRzIGNhY2hlZCBmaWxlcy5cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAdHlwZSB7T2JqZWN0PHN0cmluZyxPYmplY3Q+fVxyXG5cdCAqL1xyXG5cdGZpbGVzOiB7fSxcclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyBhIGNhY2hlIGVudHJ5IHdpdGggYSBrZXkgdG8gcmVmZXJlbmNlIHRoZSBmaWxlLiBJZiB0aGlzIGtleSBhbHJlYWR5XHJcblx0ICogaG9sZHMgYSBmaWxlLCBpdCBpcyBvdmVyd3JpdHRlbi5cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSB0byByZWZlcmVuY2UgdGhlIGNhY2hlZCBmaWxlLlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBmaWxlIC0gIFRoZSBmaWxlIHRvIGJlIGNhY2hlZC5cclxuXHQgKi9cclxuXHRhZGQ6IGZ1bmN0aW9uICgga2V5LCBmaWxlICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5lbmFibGVkID09PSBmYWxzZSApIHJldHVybjtcclxuXHJcblx0XHQvLyBjb25zb2xlLmxvZyggJ1RIUkVFLkNhY2hlJywgJ0FkZGluZyBrZXk6Jywga2V5ICk7XHJcblxyXG5cdFx0dGhpcy5maWxlc1sga2V5IF0gPSBmaWxlO1xyXG5cclxuXHR9LFxyXG5cclxuXHQvKipcclxuXHQgKiBHZXRzIHRoZSBjYWNoZWQgdmFsdWUgZm9yIHRoZSBnaXZlbiBrZXkuXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgdG8gcmVmZXJlbmNlIHRoZSBjYWNoZWQgZmlsZS5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3R8dW5kZWZpbmVkfSBUaGUgY2FjaGVkIGZpbGUuIElmIHRoZSBrZXkgZG9lcyBub3QgZXhpc3QgYHVuZGVmaW5lZGAgaXMgcmV0dXJuZWQuXHJcblx0ICovXHJcblx0Z2V0OiBmdW5jdGlvbiAoIGtleSApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuZW5hYmxlZCA9PT0gZmFsc2UgKSByZXR1cm47XHJcblxyXG5cdFx0Ly8gY29uc29sZS5sb2coICdUSFJFRS5DYWNoZScsICdDaGVja2luZyBrZXk6Jywga2V5ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZmlsZXNbIGtleSBdO1xyXG5cclxuXHR9LFxyXG5cclxuXHQvKipcclxuXHQgKiBSZW1vdmVzIHRoZSBjYWNoZWQgZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGtleS5cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSB0byByZWZlcmVuY2UgdGhlIGNhY2hlZCBmaWxlLlxyXG5cdCAqL1xyXG5cdHJlbW92ZTogZnVuY3Rpb24gKCBrZXkgKSB7XHJcblxyXG5cdFx0ZGVsZXRlIHRoaXMuZmlsZXNbIGtleSBdO1xyXG5cclxuXHR9LFxyXG5cclxuXHQvKipcclxuXHQgKiBSZW1vdmUgYWxsIHZhbHVlcyBmcm9tIHRoZSBjYWNoZS5cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKi9cclxuXHRjbGVhcjogZnVuY3Rpb24gKCkge1xyXG5cclxuXHRcdHRoaXMuZmlsZXMgPSB7fTtcclxuXHJcblx0fVxyXG5cclxufTtcclxuXHJcblxyXG5leHBvcnQgeyBDYWNoZSB9O1xyXG4iLCIvKipcclxuICogSGFuZGxlcyBhbmQga2VlcHMgdHJhY2sgb2YgbG9hZGVkIGFuZCBwZW5kaW5nIGRhdGEuIEEgZGVmYXVsdCBnbG9iYWxcclxuICogaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBjcmVhdGVkIGFuZCB1c2VkIGJ5IGxvYWRlcnMgaWYgbm90IHN1cHBsaWVkXHJcbiAqIG1hbnVhbGx5LlxyXG4gKlxyXG4gKiBJbiBnZW5lcmFsIHRoYXQgc2hvdWxkIGJlIHN1ZmZpY2llbnQsIGhvd2V2ZXIgdGhlcmUgYXJlIHRpbWVzIHdoZW4gaXQgY2FuXHJcbiAqIGJlIHVzZWZ1bCB0byBoYXZlIHNlcGFyYXRlIGxvYWRlcnMgLSBmb3IgZXhhbXBsZSBpZiB5b3Ugd2FudCB0byBzaG93XHJcbiAqIHNlcGFyYXRlIGxvYWRpbmcgYmFycyBmb3Igb2JqZWN0cyBhbmQgdGV4dHVyZXMuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IG1hbmFnZXIgPSBuZXcgVEhSRUUuTG9hZGluZ01hbmFnZXIoKTtcclxuICogbWFuYWdlci5vbkxvYWQgPSAoKSA9PiBjb25zb2xlLmxvZyggJ0xvYWRpbmcgY29tcGxldGUhJyApO1xyXG4gKlxyXG4gKiBjb25zdCBsb2FkZXIxID0gbmV3IE9CSkxvYWRlciggbWFuYWdlciApO1xyXG4gKiBjb25zdCBsb2FkZXIyID0gbmV3IENvbGxhZGFMb2FkZXIoIG1hbmFnZXIgKTtcclxuICogYGBgXHJcbiAqL1xyXG5jbGFzcyBMb2FkaW5nTWFuYWdlciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbG9hZGluZyBtYW5hZ2VyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gW29uTG9hZF0gLSBFeGVjdXRlcyB3aGVuIGFsbCBpdGVtcyBoYXZlIGJlZW4gbG9hZGVkLlxyXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IFtvblByb2dyZXNzXSAtIEV4ZWN1dGVzIHdoZW4gc2luZ2xlIGl0ZW1zIGhhdmUgYmVlbiBsb2FkZWQuXHJcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRXJyb3JdIC0gRXhlY3V0ZXMgd2hlbiBhbiBlcnJvciBvY2N1cnMuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcclxuXHJcblx0XHRjb25zdCBzY29wZSA9IHRoaXM7XHJcblxyXG5cdFx0bGV0IGlzTG9hZGluZyA9IGZhbHNlO1xyXG5cdFx0bGV0IGl0ZW1zTG9hZGVkID0gMDtcclxuXHRcdGxldCBpdGVtc1RvdGFsID0gMDtcclxuXHRcdGxldCB1cmxNb2RpZmllciA9IHVuZGVmaW5lZDtcclxuXHRcdGNvbnN0IGhhbmRsZXJzID0gW107XHJcblxyXG5cdFx0Ly8gUmVmZXIgdG8gIzU2ODkgZm9yIHRoZSByZWFzb24gd2h5IHdlIGRvbid0IHNldCAub25TdGFydFxyXG5cdFx0Ly8gaW4gdGhlIGNvbnN0cnVjdG9yXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBFeGVjdXRlcyB3aGVuIGFuIGl0ZW0gc3RhcnRzIGxvYWRpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0Z1bmN0aW9ufHVuZGVmaW5lZH1cclxuXHRcdCAqIEBkZWZhdWx0IHVuZGVmaW5lZFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm9uU3RhcnQgPSB1bmRlZmluZWQ7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBFeGVjdXRlcyB3aGVuIGFsbCBpdGVtcyBoYXZlIGJlZW4gbG9hZGVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtGdW5jdGlvbnx1bmRlZmluZWR9XHJcblx0XHQgKiBAZGVmYXVsdCB1bmRlZmluZWRcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5vbkxvYWQgPSBvbkxvYWQ7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBFeGVjdXRlcyB3aGVuIHNpbmdsZSBpdGVtcyBoYXZlIGJlZW4gbG9hZGVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtGdW5jdGlvbnx1bmRlZmluZWR9XHJcblx0XHQgKiBAZGVmYXVsdCB1bmRlZmluZWRcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5vblByb2dyZXNzID0gb25Qcm9ncmVzcztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEV4ZWN1dGVzIHdoZW4gYW4gZXJyb3Igb2NjdXJzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtGdW5jdGlvbnx1bmRlZmluZWR9XHJcblx0XHQgKiBAZGVmYXVsdCB1bmRlZmluZWRcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5vbkVycm9yID0gb25FcnJvcjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBieSBhbnkgbG9hZGVyIHVzaW5nIHRoZSBtYW5hZ2VyIHdoZW4gdGhlIGxvYWRlclxyXG5cdFx0ICogc3RhcnRzIGxvYWRpbmcgYW4gaXRlbS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gVGhlIFVSTCB0byBsb2FkLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLml0ZW1TdGFydCA9IGZ1bmN0aW9uICggdXJsICkge1xyXG5cclxuXHRcdFx0aXRlbXNUb3RhbCArKztcclxuXHJcblx0XHRcdGlmICggaXNMb2FkaW5nID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBzY29wZS5vblN0YXJ0ICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0c2NvcGUub25TdGFydCggdXJsLCBpdGVtc0xvYWRlZCwgaXRlbXNUb3RhbCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpc0xvYWRpbmcgPSB0cnVlO1xyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYnkgYW55IGxvYWRlciB1c2luZyB0aGUgbWFuYWdlciB3aGVuIHRoZSBsb2FkZXJcclxuXHRcdCAqIGVuZGVkIGxvYWRpbmcgYW4gaXRlbS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gVGhlIFVSTCBvZiB0aGUgbG9hZGVkIGl0ZW0uXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXRlbUVuZCA9IGZ1bmN0aW9uICggdXJsICkge1xyXG5cclxuXHRcdFx0aXRlbXNMb2FkZWQgKys7XHJcblxyXG5cdFx0XHRpZiAoIHNjb3BlLm9uUHJvZ3Jlc3MgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0c2NvcGUub25Qcm9ncmVzcyggdXJsLCBpdGVtc0xvYWRlZCwgaXRlbXNUb3RhbCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBpdGVtc0xvYWRlZCA9PT0gaXRlbXNUb3RhbCApIHtcclxuXHJcblx0XHRcdFx0aXNMb2FkaW5nID0gZmFsc2U7XHJcblxyXG5cdFx0XHRcdGlmICggc2NvcGUub25Mb2FkICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0c2NvcGUub25Mb2FkKCk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIGJ5IGFueSBsb2FkZXIgdXNpbmcgdGhlIG1hbmFnZXIgd2hlbiB0aGUgbG9hZGVyXHJcblx0XHQgKiBlbmNvdW50ZXJzIGFuIGVycm9yIHdoZW4gbG9hZGluZyBhbiBpdGVtLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSBUaGUgVVJMIG9mIHRoZSBpdGVtIHRoYXQgcHJvZHVjZXMgYW4gZXJyb3IuXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXRlbUVycm9yID0gZnVuY3Rpb24gKCB1cmwgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHNjb3BlLm9uRXJyb3IgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0c2NvcGUub25FcnJvciggdXJsICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEdpdmVuIGEgVVJMLCB1c2VzIHRoZSBVUkwgbW9kaWZpZXIgY2FsbGJhY2sgKGlmIGFueSkgYW5kIHJldHVybnMgYVxyXG5cdFx0ICogcmVzb2x2ZWQgVVJMLiBJZiBubyBVUkwgbW9kaWZpZXIgaXMgc2V0LCByZXR1cm5zIHRoZSBvcmlnaW5hbCBVUkwuXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIFRoZSBVUkwgdG8gbG9hZC5cclxuXHRcdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHJlc29sdmVkIFVSTC5cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yZXNvbHZlVVJMID0gZnVuY3Rpb24gKCB1cmwgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHVybE1vZGlmaWVyICkge1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gdXJsTW9kaWZpZXIoIHVybCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIHVybDtcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSWYgcHJvdmlkZWQsIHRoZSBjYWxsYmFjayB3aWxsIGJlIHBhc3NlZCBlYWNoIHJlc291cmNlIFVSTCBiZWZvcmUgYVxyXG5cdFx0ICogcmVxdWVzdCBpcyBzZW50LiBUaGUgY2FsbGJhY2sgbWF5IHJldHVybiB0aGUgb3JpZ2luYWwgVVJMLCBvciBhIG5ldyBVUkwgdG9cclxuXHRcdCAqIG92ZXJyaWRlIGxvYWRpbmcgYmVoYXZpb3IuIFRoaXMgYmVoYXZpb3IgY2FuIGJlIHVzZWQgdG8gbG9hZCBhc3NldHMgZnJvbVxyXG5cdFx0ICogLlpJUCBmaWxlcywgZHJhZy1hbmQtZHJvcCBBUElzLCBhbmQgRGF0YSBVUklzLlxyXG5cdFx0ICpcclxuXHRcdCAqIGBgYGpzXHJcblx0XHQgKiBjb25zdCBibG9icyA9IHsnZmlzaC5nbHRmJzogYmxvYjEsICdkaWZmdXNlLnBuZyc6IGJsb2IyLCAnbm9ybWFsLnBuZyc6IGJsb2IzfTtcclxuXHRcdCAqXHJcblx0XHQgKiBjb25zdCBtYW5hZ2VyID0gbmV3IFRIUkVFLkxvYWRpbmdNYW5hZ2VyKCk7XHJcblx0XHQgKlxyXG5cdFx0ICogLy8gSW5pdGlhbGl6ZSBsb2FkaW5nIG1hbmFnZXIgd2l0aCBVUkwgY2FsbGJhY2suXHJcblx0XHQgKiBjb25zdCBvYmplY3RVUkxzID0gW107XHJcblx0XHQgKiBtYW5hZ2VyLnNldFVSTE1vZGlmaWVyKCAoIHVybCApID0+IHtcclxuXHRcdCAqXHJcblx0XHQgKiBcdHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoIGJsb2JzWyB1cmwgXSApO1xyXG5cdFx0ICogXHRvYmplY3RVUkxzLnB1c2goIHVybCApO1xyXG5cdFx0ICogXHRyZXR1cm4gdXJsO1xyXG5cdFx0ICpcclxuXHRcdCAqIH0gKTtcclxuXHRcdCAqXHJcblx0XHQgKiAvLyBMb2FkIGFzIHVzdWFsLCB0aGVuIHJldm9rZSB0aGUgYmxvYiBVUkxzLlxyXG5cdFx0ICogY29uc3QgbG9hZGVyID0gbmV3IEdMVEZMb2FkZXIoIG1hbmFnZXIgKTtcclxuXHRcdCAqIGxvYWRlci5sb2FkKCAnZmlzaC5nbHRmJywgKGdsdGYpID0+IHtcclxuXHRcdCAqXHJcblx0XHQgKiBcdHNjZW5lLmFkZCggZ2x0Zi5zY2VuZSApO1xyXG5cdFx0ICogXHRvYmplY3RVUkxzLmZvckVhY2goICggdXJsICkgPT4gVVJMLnJldm9rZU9iamVjdFVSTCggdXJsICkgKTtcclxuXHRcdCAqXHJcblx0XHQgKiB9ICk7XHJcblx0XHQgKiBgYGBcclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge2Z1bmN0aW9uKHN0cmluZyk6c3RyaW5nfSB0cmFuc2Zvcm0gLSBVUkwgbW9kaWZpZXIgY2FsbGJhY2suIENhbGxlZCB3aXRoIGFuIFVSTCBhbmQgbXVzdCByZXR1cm4gYSByZXNvbHZlZCBVUkwuXHJcblx0XHQgKiBAcmV0dXJuIHtMb2FkaW5nTWFuYWdlcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBsb2FkaW5nIG1hbmFnZXIuXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2V0VVJMTW9kaWZpZXIgPSBmdW5jdGlvbiAoIHRyYW5zZm9ybSApIHtcclxuXHJcblx0XHRcdHVybE1vZGlmaWVyID0gdHJhbnNmb3JtO1xyXG5cclxuXHRcdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlZ2lzdGVycyBhIGxvYWRlciB3aXRoIHRoZSBnaXZlbiByZWd1bGFyIGV4cHJlc3Npb24uIENhbiBiZSB1c2VkIHRvXHJcblx0XHQgKiBkZWZpbmUgd2hhdCBsb2FkZXIgc2hvdWxkIGJlIHVzZWQgaW4gb3JkZXIgdG8gbG9hZCBzcGVjaWZpYyBmaWxlcy4gQVxyXG5cdFx0ICogdHlwaWNhbCB1c2UgY2FzZSBpcyB0byBvdmVyd3JpdGUgdGhlIGRlZmF1bHQgbG9hZGVyIGZvciB0ZXh0dXJlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBgYGBqc1xyXG5cdFx0ICogLy8gYWRkIGhhbmRsZXIgZm9yIFRHQSB0ZXh0dXJlc1xyXG5cdFx0ICogbWFuYWdlci5hZGRIYW5kbGVyKCAvXFwudGdhJC9pLCBuZXcgVEdBTG9hZGVyKCkgKTtcclxuXHRcdCAqIGBgYFxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSByZWdleCAtIEEgcmVndWxhciBleHByZXNzaW9uLlxyXG5cdFx0ICogQHBhcmFtIHtMb2FkZXJ9IGxvYWRlciAtIEEgbG9hZGVyIHRoYXQgc2hvdWxkIGhhbmRsZSBtYXRjaGVkIGNhc2VzLlxyXG5cdFx0ICogQHJldHVybiB7TG9hZGluZ01hbmFnZXJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbG9hZGluZyBtYW5hZ2VyLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFkZEhhbmRsZXIgPSBmdW5jdGlvbiAoIHJlZ2V4LCBsb2FkZXIgKSB7XHJcblxyXG5cdFx0XHRoYW5kbGVycy5wdXNoKCByZWdleCwgbG9hZGVyICk7XHJcblxyXG5cdFx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVtb3ZlcyB0aGUgbG9hZGVyIGZvciB0aGUgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSByZWdleCAtIEEgcmVndWxhciBleHByZXNzaW9uLlxyXG5cdFx0ICogQHJldHVybiB7TG9hZGluZ01hbmFnZXJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbG9hZGluZyBtYW5hZ2VyLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJlbW92ZUhhbmRsZXIgPSBmdW5jdGlvbiAoIHJlZ2V4ICkge1xyXG5cclxuXHRcdFx0Y29uc3QgaW5kZXggPSBoYW5kbGVycy5pbmRleE9mKCByZWdleCApO1xyXG5cclxuXHRcdFx0aWYgKCBpbmRleCAhPT0gLSAxICkge1xyXG5cclxuXHRcdFx0XHRoYW5kbGVycy5zcGxpY2UoIGluZGV4LCAyICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQ2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgdGhlIHJlZ2lzdGVyZWQgbG9hZGVyIGZvciB0aGUgZ2l2ZW4gZmlsZSBwYXRoLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlIC0gVGhlIGZpbGUgcGF0aC5cclxuXHRcdCAqIEByZXR1cm4gez9Mb2FkZXJ9IFRoZSByZWdpc3RlcmVkIGxvYWRlci4gUmV0dXJucyBgbnVsbGAgaWYgbm8gbG9hZGVyIHdhcyBmb3VuZC5cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nZXRIYW5kbGVyID0gZnVuY3Rpb24gKCBmaWxlICkge1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gaGFuZGxlcnMubGVuZ3RoOyBpIDwgbDsgaSArPSAyICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCByZWdleCA9IGhhbmRsZXJzWyBpIF07XHJcblx0XHRcdFx0Y29uc3QgbG9hZGVyID0gaGFuZGxlcnNbIGkgKyAxIF07XHJcblxyXG5cdFx0XHRcdGlmICggcmVnZXguZ2xvYmFsICkgcmVnZXgubGFzdEluZGV4ID0gMDsgLy8gc2VlICMxNzkyMFxyXG5cclxuXHRcdFx0XHRpZiAoIHJlZ2V4LnRlc3QoIGZpbGUgKSApIHtcclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gbG9hZGVyO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gbnVsbDtcclxuXHJcblx0XHR9O1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogVGhlIGdsb2JhbCBkZWZhdWx0IGxvYWRpbmcgbWFuYWdlci5cclxuICpcclxuICogQGNvbnN0YW50XHJcbiAqIEB0eXBlIHtMb2FkaW5nTWFuYWdlcn1cclxuICovXHJcbmNvbnN0IERlZmF1bHRMb2FkaW5nTWFuYWdlciA9IC8qQF9fUFVSRV9fKi8gbmV3IExvYWRpbmdNYW5hZ2VyKCk7XHJcblxyXG5leHBvcnQgeyBEZWZhdWx0TG9hZGluZ01hbmFnZXIsIExvYWRpbmdNYW5hZ2VyIH07XHJcbiIsImltcG9ydCB7IERlZmF1bHRMb2FkaW5nTWFuYWdlciB9IGZyb20gJy4vTG9hZGluZ01hbmFnZXIuanMnO1xyXG5cclxuLyoqXHJcbiAqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGxvYWRlcnMuXHJcbiAqXHJcbiAqIEBhYnN0cmFjdFxyXG4gKi9cclxuY2xhc3MgTG9hZGVyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBsb2FkZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0xvYWRpbmdNYW5hZ2VyfSBbbWFuYWdlcl0gLSBUaGUgbG9hZGluZyBtYW5hZ2VyLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBtYW5hZ2VyICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGxvYWRpbmcgbWFuYWdlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7TG9hZGluZ01hbmFnZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCBEZWZhdWx0TG9hZGluZ01hbmFnZXJcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY3Jvc3NPcmlnaW4gc3RyaW5nIHRvIGltcGxlbWVudCBDT1JTIGZvciBsb2FkaW5nIHRoZSB1cmwgZnJvbSBhXHJcblx0XHQgKiBkaWZmZXJlbnQgZG9tYWluIHRoYXQgYWxsb3dzIENPUlMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqIEBkZWZhdWx0ICdhbm9ueW1vdXMnXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY3Jvc3NPcmlnaW4gPSAnYW5vbnltb3VzJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIFhNTEh0dHBSZXF1ZXN0IHVzZXMgY3JlZGVudGlhbHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLndpdGhDcmVkZW50aWFscyA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGJhc2UgcGF0aCBmcm9tIHdoaWNoIHRoZSBhc3NldCB3aWxsIGJlIGxvYWRlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBhdGggPSAnJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBiYXNlIHBhdGggZnJvbSB3aGljaCBhZGRpdGlvbmFsIHJlc291cmNlcyBsaWtlIHRleHR1cmVzIHdpbGwgYmUgbG9hZGVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVzb3VyY2VQYXRoID0gJyc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgW3JlcXVlc3QgaGVhZGVyXXtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0dsb3NzYXJ5L1JlcXVlc3RfaGVhZGVyfVxyXG5cdFx0ICogdXNlZCBpbiBIVFRQIHJlcXVlc3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdDxzdHJpbmcsIGFueT59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVxdWVzdEhlYWRlciA9IHt9O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIG5lZWRzIHRvIGJlIGltcGxlbWVudGVkIGJ5IGFsbCBjb25jcmV0ZSBsb2FkZXJzLiBJdCBob2xkcyB0aGVcclxuXHQgKiBsb2dpYyBmb3IgbG9hZGluZyBhc3NldHMgZnJvbSB0aGUgYmFja2VuZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSBUaGUgcGF0aC9VUkwgb2YgdGhlIGZpbGUgdG8gYmUgbG9hZGVkLlxyXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IG9uTG9hZCAtIEV4ZWN1dGVkIHdoZW4gdGhlIGxvYWRpbmcgcHJvY2VzcyBoYXMgYmVlbiBmaW5pc2hlZC5cclxuXHQgKiBAcGFyYW0ge29uUHJvZ3Jlc3NDYWxsYmFja30gW29uUHJvZ3Jlc3NdIC0gRXhlY3V0ZWQgd2hpbGUgdGhlIGxvYWRpbmcgaXMgaW4gcHJvZ3Jlc3MuXHJcblx0ICogQHBhcmFtIHtvbkVycm9yQ2FsbGJhY2t9IFtvbkVycm9yXSAtIEV4ZWN1dGVkIHdoZW4gZXJyb3JzIG9jY3VyLlxyXG5cdCAqL1xyXG5cdGxvYWQoIC8qIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICovICkge31cclxuXHJcblx0LyoqXHJcblx0ICogQSBhc3luYyB2ZXJzaW9uIG9mIHtAbGluayBMb2FkZXIjbG9hZH0uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gVGhlIHBhdGgvVVJMIG9mIHRoZSBmaWxlIHRvIGJlIGxvYWRlZC5cclxuXHQgKiBAcGFyYW0ge29uUHJvZ3Jlc3NDYWxsYmFja30gW29uUHJvZ3Jlc3NdIC0gRXhlY3V0ZWQgd2hpbGUgdGhlIGxvYWRpbmcgaXMgaW4gcHJvZ3Jlc3MuXHJcblx0ICogQHJldHVybiB7UHJvbWlzZX0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgYXNzZXQgaGFzIGJlZW4gbG9hZGVkLlxyXG5cdCAqL1xyXG5cdGxvYWRBc3luYyggdXJsLCBvblByb2dyZXNzICkge1xyXG5cclxuXHRcdGNvbnN0IHNjb3BlID0gdGhpcztcclxuXHJcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoIGZ1bmN0aW9uICggcmVzb2x2ZSwgcmVqZWN0ICkge1xyXG5cclxuXHRcdFx0c2NvcGUubG9hZCggdXJsLCByZXNvbHZlLCBvblByb2dyZXNzLCByZWplY3QgKTtcclxuXHJcblx0XHR9ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgbmVlZHMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgYWxsIGNvbmNyZXRlIGxvYWRlcnMuIEl0IGhvbGRzIHRoZVxyXG5cdCAqIGxvZ2ljIGZvciBwYXJzaW5nIHRoZSBhc3NldCBpbnRvIHRocmVlLmpzIGVudGl0aWVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHthbnl9IGRhdGEgLSBUaGUgZGF0YSB0byBwYXJzZS5cclxuXHQgKi9cclxuXHRwYXJzZSggLyogZGF0YSAqLyApIHt9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGBjcm9zc09yaWdpbmAgU3RyaW5nIHRvIGltcGxlbWVudCBDT1JTIGZvciBsb2FkaW5nIHRoZSBVUkxcclxuXHQgKiBmcm9tIGEgZGlmZmVyZW50IGRvbWFpbiB0aGF0IGFsbG93cyBDT1JTLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGNyb3NzT3JpZ2luIC0gVGhlIGBjcm9zc09yaWdpbmAgdmFsdWUuXHJcblx0ICogQHJldHVybiB7TG9hZGVyfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldENyb3NzT3JpZ2luKCBjcm9zc09yaWdpbiApIHtcclxuXHJcblx0XHR0aGlzLmNyb3NzT3JpZ2luID0gY3Jvc3NPcmlnaW47XHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBXaGV0aGVyIHRoZSBYTUxIdHRwUmVxdWVzdCB1c2VzIGNyZWRlbnRpYWxzIHN1Y2ggYXMgY29va2llcywgYXV0aG9yaXphdGlvblxyXG5cdCAqIGhlYWRlcnMgb3IgVExTIGNsaWVudCBjZXJ0aWZpY2F0ZXMsIHNlZSBbWE1MSHR0cFJlcXVlc3Qud2l0aENyZWRlbnRpYWxzXXtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvWE1MSHR0cFJlcXVlc3Qvd2l0aENyZWRlbnRpYWxzfS5cclxuXHQgKlxyXG5cdCAqIE5vdGU6IFRoaXMgc2V0dGluZyBoYXMgbm8gZWZmZWN0IGlmIHlvdSBhcmUgbG9hZGluZyBmaWxlcyBsb2NhbGx5IG9yIGZyb20gdGhlIHNhbWUgZG9tYWluLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtib29sZWFufSB2YWx1ZSAtIFRoZSBgd2l0aENyZWRlbnRpYWxzYCB2YWx1ZS5cclxuXHQgKiBAcmV0dXJuIHtMb2FkZXJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0V2l0aENyZWRlbnRpYWxzKCB2YWx1ZSApIHtcclxuXHJcblx0XHR0aGlzLndpdGhDcmVkZW50aWFscyA9IHZhbHVlO1xyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgYmFzZSBwYXRoIGZvciB0aGUgYXNzZXQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFRoZSBiYXNlIHBhdGguXHJcblx0ICogQHJldHVybiB7TG9hZGVyfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldFBhdGgoIHBhdGggKSB7XHJcblxyXG5cdFx0dGhpcy5wYXRoID0gcGF0aDtcclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGJhc2UgcGF0aCBmb3IgZGVwZW5kZW50IHJlc291cmNlcyBsaWtlIHRleHR1cmVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHJlc291cmNlUGF0aCAtIFRoZSByZXNvdXJjZSBwYXRoLlxyXG5cdCAqIEByZXR1cm4ge0xvYWRlcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXRSZXNvdXJjZVBhdGgoIHJlc291cmNlUGF0aCApIHtcclxuXHJcblx0XHR0aGlzLnJlc291cmNlUGF0aCA9IHJlc291cmNlUGF0aDtcclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGdpdmVuIHJlcXVlc3QgaGVhZGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IHJlcXVlc3RIZWFkZXIgLSBBIFtyZXF1ZXN0IGhlYWRlcl17QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9HbG9zc2FyeS9SZXF1ZXN0X2hlYWRlcn1cclxuXHQgKiBmb3IgY29uZmlndXJpbmcgdGhlIEhUVFAgcmVxdWVzdC5cclxuXHQgKiBAcmV0dXJuIHtMb2FkZXJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0UmVxdWVzdEhlYWRlciggcmVxdWVzdEhlYWRlciApIHtcclxuXHJcblx0XHR0aGlzLnJlcXVlc3RIZWFkZXIgPSByZXF1ZXN0SGVhZGVyO1xyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDYWxsYmFjayBmb3Igb25Qcm9ncmVzcyBpbiBsb2FkZXJzLlxyXG4gKlxyXG4gKiBAY2FsbGJhY2sgb25Qcm9ncmVzc0NhbGxiYWNrXHJcbiAqIEBwYXJhbSB7UHJvZ3Jlc3NFdmVudH0gZXZlbnQgLSBBbiBpbnN0YW5jZSBvZiBgUHJvZ3Jlc3NFdmVudGAgdGhhdCByZXByZXNlbnRzIHRoZSBjdXJyZW50IGxvYWRpbmcgc3RhdHVzLlxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBDYWxsYmFjayBmb3Igb25FcnJvciBpbiBsb2FkZXJzLlxyXG4gKlxyXG4gKiBAY2FsbGJhY2sgb25FcnJvckNhbGxiYWNrXHJcbiAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIC0gVGhlIGVycm9yIHdoaWNoIG9jY3VycmVkIGR1cmluZyB0aGUgbG9hZGluZyBwcm9jZXNzLlxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBUaGUgZGVmYXVsdCBtYXRlcmlhbCBuYW1lIHRoYXQgaXMgdXNlZCBieSBsb2FkZXJzXHJcbiAqIHdoZW4gY3JlYXRpbmcgbWF0ZXJpYWxzIGZvciBsb2FkZWQgM0Qgb2JqZWN0cy5cclxuICpcclxuICogTm90ZTogTm90IGFsbCBsb2FkZXJzIG1pZ2h0IGhvbm9yIHRoaXMgc2V0dGluZy5cclxuICpcclxuICogQHN0YXRpY1xyXG4gKiBAdHlwZSB7c3RyaW5nfVxyXG4gKiBAZGVmYXVsdCAnX19ERUZBVUxUJ1xyXG4gKi9cclxuTG9hZGVyLkRFRkFVTFRfTUFURVJJQUxfTkFNRSA9ICdfX0RFRkFVTFQnO1xyXG5cclxuZXhwb3J0IHsgTG9hZGVyIH07XHJcbiIsImltcG9ydCB7IENhY2hlIH0gZnJvbSAnLi9DYWNoZS5qcyc7XHJcbmltcG9ydCB7IExvYWRlciB9IGZyb20gJy4vTG9hZGVyLmpzJztcclxuXHJcbmNvbnN0IGxvYWRpbmcgPSB7fTtcclxuXHJcbmNsYXNzIEh0dHBFcnJvciBleHRlbmRzIEVycm9yIHtcclxuXHJcblx0Y29uc3RydWN0b3IoIG1lc3NhZ2UsIHJlc3BvbnNlICkge1xyXG5cclxuXHRcdHN1cGVyKCBtZXNzYWdlICk7XHJcblx0XHR0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBIGxvdyBsZXZlbCBjbGFzcyBmb3IgbG9hZGluZyByZXNvdXJjZXMgd2l0aCB0aGUgRmV0Y2ggQVBJLCB1c2VkIGludGVybmFsbHkgYnlcclxuICogbW9zdCBsb2FkZXJzLiBJdCBjYW4gYWxzbyBiZSB1c2VkIGRpcmVjdGx5IHRvIGxvYWQgYW55IGZpbGUgdHlwZSB0aGF0IGRvZXNcclxuICogbm90IGhhdmUgYSBsb2FkZXIuXHJcbiAqXHJcbiAqIFRoaXMgbG9hZGVyIHN1cHBvcnRzIGNhY2hpbmcuIElmIHlvdSB3YW50IHRvIHVzZSBpdCwgYWRkIGBUSFJFRS5DYWNoZS5lbmFibGVkID0gdHJ1ZTtgXHJcbiAqIG9uY2UgdG8geW91ciBhcHBsaWNhdGlvbi5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgbG9hZGVyID0gbmV3IFRIUkVFLkZpbGVMb2FkZXIoKTtcclxuICogY29uc3QgZGF0YSA9IGF3YWl0IGxvYWRlci5sb2FkQXN5bmMoICdleGFtcGxlLnR4dCcgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBMb2FkZXJcclxuICovXHJcbmNsYXNzIEZpbGVMb2FkZXIgZXh0ZW5kcyBMb2FkZXIge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGZpbGUgbG9hZGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtMb2FkaW5nTWFuYWdlcn0gW21hbmFnZXJdIC0gVGhlIGxvYWRpbmcgbWFuYWdlci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbWFuYWdlciApIHtcclxuXHJcblx0XHRzdXBlciggbWFuYWdlciApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGV4cGVjdGVkIG1pbWUgdHlwZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1pbWVUeXBlID0gJyc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZXhwZWN0ZWQgcmVzcG9uc2UgdHlwZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KCdhcnJheWJ1ZmZlcid8J2Jsb2InfCdkb2N1bWVudCd8J2pzb24nfCcnKX1cclxuXHRcdCAqIEBkZWZhdWx0ICcnXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVzcG9uc2VUeXBlID0gJyc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3RhcnRzIGxvYWRpbmcgZnJvbSB0aGUgZ2l2ZW4gVVJMIGFuZCBwYXNzIHRoZSBsb2FkZWQgcmVzcG9uc2UgdG8gdGhlIGBvbkxvYWQoKWAgY2FsbGJhY2suXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gVGhlIHBhdGgvVVJMIG9mIHRoZSBmaWxlIHRvIGJlIGxvYWRlZC4gVGhpcyBjYW4gYWxzbyBiZSBhIGRhdGEgVVJJLlxyXG5cdCAqIEBwYXJhbSB7ZnVuY3Rpb24oYW55KX0gb25Mb2FkIC0gRXhlY3V0ZWQgd2hlbiB0aGUgbG9hZGluZyBwcm9jZXNzIGhhcyBiZWVuIGZpbmlzaGVkLlxyXG5cdCAqIEBwYXJhbSB7b25Qcm9ncmVzc0NhbGxiYWNrfSBbb25Qcm9ncmVzc10gLSBFeGVjdXRlZCB3aGlsZSB0aGUgbG9hZGluZyBpcyBpbiBwcm9ncmVzcy5cclxuXHQgKiBAcGFyYW0ge29uRXJyb3JDYWxsYmFja30gW29uRXJyb3JdIC0gRXhlY3V0ZWQgd2hlbiBlcnJvcnMgb2NjdXIuXHJcblx0ICogQHJldHVybiB7YW55fHVuZGVmaW5lZH0gVGhlIGNhY2hlZCByZXNvdXJjZSBpZiBhdmFpbGFibGUuXHJcblx0ICovXHJcblx0bG9hZCggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XHJcblxyXG5cdFx0aWYgKCB1cmwgPT09IHVuZGVmaW5lZCApIHVybCA9ICcnO1xyXG5cclxuXHRcdGlmICggdGhpcy5wYXRoICE9PSB1bmRlZmluZWQgKSB1cmwgPSB0aGlzLnBhdGggKyB1cmw7XHJcblxyXG5cdFx0dXJsID0gdGhpcy5tYW5hZ2VyLnJlc29sdmVVUkwoIHVybCApO1xyXG5cclxuXHRcdGNvbnN0IGNhY2hlZCA9IENhY2hlLmdldCggdXJsICk7XHJcblxyXG5cdFx0aWYgKCBjYWNoZWQgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHRoaXMubWFuYWdlci5pdGVtU3RhcnQoIHVybCApO1xyXG5cclxuXHRcdFx0c2V0VGltZW91dCggKCkgPT4ge1xyXG5cclxuXHRcdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggY2FjaGVkICk7XHJcblxyXG5cdFx0XHRcdHRoaXMubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcclxuXHJcblx0XHRcdH0sIDAgKTtcclxuXHJcblx0XHRcdHJldHVybiBjYWNoZWQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIENoZWNrIGlmIHJlcXVlc3QgaXMgZHVwbGljYXRlXHJcblxyXG5cdFx0aWYgKCBsb2FkaW5nWyB1cmwgXSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0bG9hZGluZ1sgdXJsIF0ucHVzaCgge1xyXG5cclxuXHRcdFx0XHRvbkxvYWQ6IG9uTG9hZCxcclxuXHRcdFx0XHRvblByb2dyZXNzOiBvblByb2dyZXNzLFxyXG5cdFx0XHRcdG9uRXJyb3I6IG9uRXJyb3JcclxuXHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gSW5pdGlhbGlzZSBhcnJheSBmb3IgZHVwbGljYXRlIHJlcXVlc3RzXHJcblx0XHRsb2FkaW5nWyB1cmwgXSA9IFtdO1xyXG5cclxuXHRcdGxvYWRpbmdbIHVybCBdLnB1c2goIHtcclxuXHRcdFx0b25Mb2FkOiBvbkxvYWQsXHJcblx0XHRcdG9uUHJvZ3Jlc3M6IG9uUHJvZ3Jlc3MsXHJcblx0XHRcdG9uRXJyb3I6IG9uRXJyb3IsXHJcblx0XHR9ICk7XHJcblxyXG5cdFx0Ly8gY3JlYXRlIHJlcXVlc3RcclxuXHRcdGNvbnN0IHJlcSA9IG5ldyBSZXF1ZXN0KCB1cmwsIHtcclxuXHRcdFx0aGVhZGVyczogbmV3IEhlYWRlcnMoIHRoaXMucmVxdWVzdEhlYWRlciApLFxyXG5cdFx0XHRjcmVkZW50aWFsczogdGhpcy53aXRoQ3JlZGVudGlhbHMgPyAnaW5jbHVkZScgOiAnc2FtZS1vcmlnaW4nLFxyXG5cdFx0XHQvLyBBbiBhYm9ydCBjb250cm9sbGVyIGNvdWxkIGJlIGFkZGVkIHdpdGhpbiBhIGZ1dHVyZSBQUlxyXG5cdFx0fSApO1xyXG5cclxuXHRcdC8vIHJlY29yZCBzdGF0ZXMgKCBhdm9pZCBkYXRhIHJhY2UgKVxyXG5cdFx0Y29uc3QgbWltZVR5cGUgPSB0aGlzLm1pbWVUeXBlO1xyXG5cdFx0Y29uc3QgcmVzcG9uc2VUeXBlID0gdGhpcy5yZXNwb25zZVR5cGU7XHJcblxyXG5cdFx0Ly8gc3RhcnQgdGhlIGZldGNoXHJcblx0XHRmZXRjaCggcmVxIClcclxuXHRcdFx0LnRoZW4oIHJlc3BvbnNlID0+IHtcclxuXHJcblx0XHRcdFx0aWYgKCByZXNwb25zZS5zdGF0dXMgPT09IDIwMCB8fCByZXNwb25zZS5zdGF0dXMgPT09IDAgKSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gU29tZSBicm93c2VycyByZXR1cm4gSFRUUCBTdGF0dXMgMCB3aGVuIHVzaW5nIG5vbi1odHRwIHByb3RvY29sXHJcblx0XHRcdFx0XHQvLyBlLmcuICdmaWxlOi8vJyBvciAnZGF0YTovLycuIEhhbmRsZSBhcyBzdWNjZXNzLlxyXG5cclxuXHRcdFx0XHRcdGlmICggcmVzcG9uc2Uuc3RhdHVzID09PSAwICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuRmlsZUxvYWRlcjogSFRUUCBTdGF0dXMgMCByZWNlaXZlZC4nICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8vIFdvcmthcm91bmQ6IENoZWNraW5nIGlmIHJlc3BvbnNlLmJvZHkgPT09IHVuZGVmaW5lZCBmb3IgQWxpcGF5IGJyb3dzZXIgIzIzNTQ4XHJcblxyXG5cdFx0XHRcdFx0aWYgKCB0eXBlb2YgUmVhZGFibGVTdHJlYW0gPT09ICd1bmRlZmluZWQnIHx8IHJlc3BvbnNlLmJvZHkgPT09IHVuZGVmaW5lZCB8fCByZXNwb25zZS5ib2R5LmdldFJlYWRlciA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdFx0cmV0dXJuIHJlc3BvbnNlO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRjb25zdCBjYWxsYmFja3MgPSBsb2FkaW5nWyB1cmwgXTtcclxuXHRcdFx0XHRcdGNvbnN0IHJlYWRlciA9IHJlc3BvbnNlLmJvZHkuZ2V0UmVhZGVyKCk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gTmdpbnggbmVlZHMgWC1GaWxlLVNpemUgY2hlY2tcclxuXHRcdFx0XHRcdC8vIGh0dHBzOi8vc2VydmVyZmF1bHQuY29tL3F1ZXN0aW9ucy80ODI4NzUvd2h5LWRvZXMtbmdpbngtcmVtb3ZlLWNvbnRlbnQtbGVuZ3RoLWhlYWRlci1mb3ItY2h1bmtlZC1jb250ZW50XHJcblx0XHRcdFx0XHRjb25zdCBjb250ZW50TGVuZ3RoID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoICdYLUZpbGUtU2l6ZScgKSB8fCByZXNwb25zZS5oZWFkZXJzLmdldCggJ0NvbnRlbnQtTGVuZ3RoJyApO1xyXG5cdFx0XHRcdFx0Y29uc3QgdG90YWwgPSBjb250ZW50TGVuZ3RoID8gcGFyc2VJbnQoIGNvbnRlbnRMZW5ndGggKSA6IDA7XHJcblx0XHRcdFx0XHRjb25zdCBsZW5ndGhDb21wdXRhYmxlID0gdG90YWwgIT09IDA7XHJcblx0XHRcdFx0XHRsZXQgbG9hZGVkID0gMDtcclxuXHJcblx0XHRcdFx0XHQvLyBwZXJpb2RpY2FsbHkgcmVhZCBkYXRhIGludG8gdGhlIG5ldyBzdHJlYW0gdHJhY2tpbmcgd2hpbGUgZG93bmxvYWQgcHJvZ3Jlc3NcclxuXHRcdFx0XHRcdGNvbnN0IHN0cmVhbSA9IG5ldyBSZWFkYWJsZVN0cmVhbSgge1xyXG5cdFx0XHRcdFx0XHRzdGFydCggY29udHJvbGxlciApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0cmVhZERhdGEoKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0ZnVuY3Rpb24gcmVhZERhdGEoKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0cmVhZGVyLnJlYWQoKS50aGVuKCAoIHsgZG9uZSwgdmFsdWUgfSApID0+IHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmICggZG9uZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29udHJvbGxlci5jbG9zZSgpO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0bG9hZGVkICs9IHZhbHVlLmJ5dGVMZW5ndGg7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGV2ZW50ID0gbmV3IFByb2dyZXNzRXZlbnQoICdwcm9ncmVzcycsIHsgbGVuZ3RoQ29tcHV0YWJsZSwgbG9hZGVkLCB0b3RhbCB9ICk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBjYWxsYmFjayA9IGNhbGxiYWNrc1sgaSBdO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBjYWxsYmFjay5vblByb2dyZXNzICkgY2FsbGJhY2sub25Qcm9ncmVzcyggZXZlbnQgKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb250cm9sbGVyLmVucXVldWUoIHZhbHVlICk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmVhZERhdGEoKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0XHR9LCAoIGUgKSA9PiB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRjb250cm9sbGVyLmVycm9yKCBlICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0fSApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fSApO1xyXG5cclxuXHRcdFx0XHRcdHJldHVybiBuZXcgUmVzcG9uc2UoIHN0cmVhbSApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdHRocm93IG5ldyBIdHRwRXJyb3IoIGBmZXRjaCBmb3IgXCIke3Jlc3BvbnNlLnVybH1cIiByZXNwb25kZWQgd2l0aCAke3Jlc3BvbnNlLnN0YXR1c306ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gLCByZXNwb25zZSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IClcclxuXHRcdFx0LnRoZW4oIHJlc3BvbnNlID0+IHtcclxuXHJcblx0XHRcdFx0c3dpdGNoICggcmVzcG9uc2VUeXBlICkge1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgJ2FycmF5YnVmZmVyJzpcclxuXHJcblx0XHRcdFx0XHRcdHJldHVybiByZXNwb25zZS5hcnJheUJ1ZmZlcigpO1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgJ2Jsb2InOlxyXG5cclxuXHRcdFx0XHRcdFx0cmV0dXJuIHJlc3BvbnNlLmJsb2IoKTtcclxuXHJcblx0XHRcdFx0XHRjYXNlICdkb2N1bWVudCc6XHJcblxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gcmVzcG9uc2UudGV4dCgpXHJcblx0XHRcdFx0XHRcdFx0LnRoZW4oIHRleHQgPT4ge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcclxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKCB0ZXh0LCBtaW1lVHlwZSApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRcdFx0Y2FzZSAnanNvbic6XHJcblxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gcmVzcG9uc2UuanNvbigpO1xyXG5cclxuXHRcdFx0XHRcdGRlZmF1bHQ6XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIG1pbWVUeXBlID09PSAnJyApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3BvbnNlLnRleHQoKTtcclxuXHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdC8vIHNuaWZmIGVuY29kaW5nXHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgcmUgPSAvY2hhcnNldD1cIj8oW147XCJcXHNdKilcIj8vaTtcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBleGVjID0gcmUuZXhlYyggbWltZVR5cGUgKTtcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBsYWJlbCA9IGV4ZWMgJiYgZXhlY1sgMSBdID8gZXhlY1sgMSBdLnRvTG93ZXJDYXNlKCkgOiB1bmRlZmluZWQ7XHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlciggbGFiZWwgKTtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gcmVzcG9uc2UuYXJyYXlCdWZmZXIoKS50aGVuKCBhYiA9PiBkZWNvZGVyLmRlY29kZSggYWIgKSApO1xyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IClcclxuXHRcdFx0LnRoZW4oIGRhdGEgPT4ge1xyXG5cclxuXHRcdFx0XHQvLyBBZGQgdG8gY2FjaGUgb25seSBvbiBIVFRQIHN1Y2Nlc3MsIHNvIHRoYXQgd2UgZG8gbm90IGNhY2hlXHJcblx0XHRcdFx0Ly8gZXJyb3IgcmVzcG9uc2UgYm9kaWVzIGFzIHByb3BlciByZXNwb25zZXMgdG8gcmVxdWVzdHMuXHJcblx0XHRcdFx0Q2FjaGUuYWRkKCB1cmwsIGRhdGEgKTtcclxuXHJcblx0XHRcdFx0Y29uc3QgY2FsbGJhY2tzID0gbG9hZGluZ1sgdXJsIF07XHJcblx0XHRcdFx0ZGVsZXRlIGxvYWRpbmdbIHVybCBdO1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gY2FsbGJhY2tzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGNhbGxiYWNrID0gY2FsbGJhY2tzWyBpIF07XHJcblx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrLm9uTG9hZCApIGNhbGxiYWNrLm9uTG9hZCggZGF0YSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IClcclxuXHRcdFx0LmNhdGNoKCBlcnIgPT4ge1xyXG5cclxuXHRcdFx0XHQvLyBBYm9ydCBlcnJvcnMgYW5kIG90aGVyIGVycm9ycyBhcmUgaGFuZGxlZCB0aGUgc2FtZVxyXG5cclxuXHRcdFx0XHRjb25zdCBjYWxsYmFja3MgPSBsb2FkaW5nWyB1cmwgXTtcclxuXHJcblx0XHRcdFx0aWYgKCBjYWxsYmFja3MgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHQvLyBXaGVuIG9uTG9hZCB3YXMgY2FsbGVkIGFuZCB1cmwgd2FzIGRlbGV0ZWQgaW4gYGxvYWRpbmdgXHJcblx0XHRcdFx0XHR0aGlzLm1hbmFnZXIuaXRlbUVycm9yKCB1cmwgKTtcclxuXHRcdFx0XHRcdHRocm93IGVycjtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRkZWxldGUgbG9hZGluZ1sgdXJsIF07XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBjYWxsYmFja3MubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgY2FsbGJhY2sgPSBjYWxsYmFja3NbIGkgXTtcclxuXHRcdFx0XHRcdGlmICggY2FsbGJhY2sub25FcnJvciApIGNhbGxiYWNrLm9uRXJyb3IoIGVyciApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHRoaXMubWFuYWdlci5pdGVtRXJyb3IoIHVybCApO1xyXG5cclxuXHRcdFx0fSApXHJcblx0XHRcdC5maW5hbGx5KCAoKSA9PiB7XHJcblxyXG5cdFx0XHRcdHRoaXMubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcclxuXHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHR0aGlzLm1hbmFnZXIuaXRlbVN0YXJ0KCB1cmwgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBleHBlY3RlZCByZXNwb25zZSB0eXBlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHsoJ2FycmF5YnVmZmVyJ3wnYmxvYid8J2RvY3VtZW50J3wnanNvbid8JycpfSB2YWx1ZSAtIFRoZSByZXNwb25zZSB0eXBlLlxyXG5cdCAqIEByZXR1cm4ge0ZpbGVMb2FkZXJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgZmlsZSBsb2FkZXIuXHJcblx0ICovXHJcblx0c2V0UmVzcG9uc2VUeXBlKCB2YWx1ZSApIHtcclxuXHJcblx0XHR0aGlzLnJlc3BvbnNlVHlwZSA9IHZhbHVlO1xyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZXhwZWN0ZWQgbWltZSB0eXBlIG9mIHRoZSBsb2FkZWQgZmlsZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFRoZSBtaW1lIHR5cGUuXHJcblx0ICogQHJldHVybiB7RmlsZUxvYWRlcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBmaWxlIGxvYWRlci5cclxuXHQgKi9cclxuXHRzZXRNaW1lVHlwZSggdmFsdWUgKSB7XHJcblxyXG5cdFx0dGhpcy5taW1lVHlwZSA9IHZhbHVlO1xyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBGaWxlTG9hZGVyIH07XHJcbiIsImltcG9ydCB7IEFuaW1hdGlvbkNsaXAgfSBmcm9tICcuLi9hbmltYXRpb24vQW5pbWF0aW9uQ2xpcC5qcyc7XHJcbmltcG9ydCB7IEZpbGVMb2FkZXIgfSBmcm9tICcuL0ZpbGVMb2FkZXIuanMnO1xyXG5pbXBvcnQgeyBMb2FkZXIgfSBmcm9tICcuL0xvYWRlci5qcyc7XHJcblxyXG4vKipcclxuICogQ2xhc3MgZm9yIGxvYWRpbmcgYW5pbWF0aW9uIGNsaXBzIGluIHRoZSBKU09OIGZvcm1hdC4gVGhlIGZpbGVzIGFyZSBpbnRlcm5hbGx5XHJcbiAqIGxvYWRlZCB2aWEge0BsaW5rIEZpbGVMb2FkZXJ9LlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBsb2FkZXIgPSBuZXcgVEhSRUUuQW5pbWF0aW9uTG9hZGVyKCk7XHJcbiAqIGNvbnN0IGFuaW1hdGlvbnMgPSBhd2FpdCBsb2FkZXIubG9hZEFzeW5jKCAnYW5pbWF0aW9ucy9hbmltYXRpb24uanMnICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTG9hZGVyXHJcbiAqL1xyXG5jbGFzcyBBbmltYXRpb25Mb2FkZXIgZXh0ZW5kcyBMb2FkZXIge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGFuaW1hdGlvbiBsb2FkZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0xvYWRpbmdNYW5hZ2VyfSBbbWFuYWdlcl0gLSBUaGUgbG9hZGluZyBtYW5hZ2VyLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBtYW5hZ2VyICkge1xyXG5cclxuXHRcdHN1cGVyKCBtYW5hZ2VyICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3RhcnRzIGxvYWRpbmcgZnJvbSB0aGUgZ2l2ZW4gVVJMIGFuZCBwYXNzIHRoZSBsb2FkZWQgYW5pbWF0aW9ucyBhcyBhbiBhcnJheVxyXG5cdCAqIGhvbGRpbmcgaW5zdGFuY2VzIG9mIHtAbGluayBBbmltYXRpb25DbGlwfSB0byB0aGUgYG9uTG9hZCgpYCBjYWxsYmFjay5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSBUaGUgcGF0aC9VUkwgb2YgdGhlIGZpbGUgdG8gYmUgbG9hZGVkLiBUaGlzIGNhbiBhbHNvIGJlIGEgZGF0YSBVUkkuXHJcblx0ICogQHBhcmFtIHtmdW5jdGlvbihBcnJheTxBbmltYXRpb25DbGlwPil9IG9uTG9hZCAtIEV4ZWN1dGVkIHdoZW4gdGhlIGxvYWRpbmcgcHJvY2VzcyBoYXMgYmVlbiBmaW5pc2hlZC5cclxuXHQgKiBAcGFyYW0ge29uUHJvZ3Jlc3NDYWxsYmFja30gb25Qcm9ncmVzcyAtIEV4ZWN1dGVkIHdoaWxlIHRoZSBsb2FkaW5nIGlzIGluIHByb2dyZXNzLlxyXG5cdCAqIEBwYXJhbSB7b25FcnJvckNhbGxiYWNrfSBvbkVycm9yIC0gRXhlY3V0ZWQgd2hlbiBlcnJvcnMgb2NjdXIuXHJcblx0ICovXHJcblx0bG9hZCggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XHJcblxyXG5cdFx0Y29uc3Qgc2NvcGUgPSB0aGlzO1xyXG5cclxuXHRcdGNvbnN0IGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCB0aGlzLm1hbmFnZXIgKTtcclxuXHRcdGxvYWRlci5zZXRQYXRoKCB0aGlzLnBhdGggKTtcclxuXHRcdGxvYWRlci5zZXRSZXF1ZXN0SGVhZGVyKCB0aGlzLnJlcXVlc3RIZWFkZXIgKTtcclxuXHRcdGxvYWRlci5zZXRXaXRoQ3JlZGVudGlhbHMoIHRoaXMud2l0aENyZWRlbnRpYWxzICk7XHJcblx0XHRsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoIHRleHQgKSB7XHJcblxyXG5cdFx0XHR0cnkge1xyXG5cclxuXHRcdFx0XHRvbkxvYWQoIHNjb3BlLnBhcnNlKCBKU09OLnBhcnNlKCB0ZXh0ICkgKSApO1xyXG5cclxuXHRcdFx0fSBjYXRjaCAoIGUgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggb25FcnJvciApIHtcclxuXHJcblx0XHRcdFx0XHRvbkVycm9yKCBlICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvciggZSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVycm9yKCB1cmwgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9LCBvblByb2dyZXNzLCBvbkVycm9yICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUGFyc2VzIHRoZSBnaXZlbiBKU09OIG9iamVjdCBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiBhbmltYXRpb24gY2xpcHMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0ganNvbiAtIFRoZSBzZXJpYWxpemVkIGFuaW1hdGlvbiBjbGlwcy5cclxuXHQgKiBAcmV0dXJuIHtBcnJheTxBbmltYXRpb25DbGlwPn0gVGhlIHBhcnNlZCBhbmltYXRpb24gY2xpcHMuXHJcblx0ICovXHJcblx0cGFyc2UoIGpzb24gKSB7XHJcblxyXG5cdFx0Y29uc3QgYW5pbWF0aW9ucyA9IFtdO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGpzb24ubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgY2xpcCA9IEFuaW1hdGlvbkNsaXAucGFyc2UoIGpzb25bIGkgXSApO1xyXG5cclxuXHRcdFx0YW5pbWF0aW9ucy5wdXNoKCBjbGlwICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBhbmltYXRpb25zO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgQW5pbWF0aW9uTG9hZGVyIH07XHJcbiIsImltcG9ydCB7IExpbmVhckZpbHRlciB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IEZpbGVMb2FkZXIgfSBmcm9tICcuL0ZpbGVMb2FkZXIuanMnO1xyXG5pbXBvcnQgeyBDb21wcmVzc2VkVGV4dHVyZSB9IGZyb20gJy4uL3RleHR1cmVzL0NvbXByZXNzZWRUZXh0dXJlLmpzJztcclxuaW1wb3J0IHsgTG9hZGVyIH0gZnJvbSAnLi9Mb2FkZXIuanMnO1xyXG5cclxuLyoqXHJcbiAqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGxvYWRpbmcgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdHMgUzNUQywgQVNUQyBvciBFVEMuXHJcbiAqIFRleHR1cmVzIGFyZSBpbnRlcm5hbGx5IGxvYWRlZCB2aWEge0BsaW5rIEZpbGVMb2FkZXJ9LlxyXG4gKlxyXG4gKiBEZXJpdmVkIGNsYXNzZXMgaGF2ZSB0byBpbXBsZW1lbnQgdGhlIGBwYXJzZSgpYCBtZXRob2Qgd2hpY2ggaG9sZHMgdGhlIHBhcnNpbmdcclxuICogZm9yIHRoZSByZXNwZWN0aXZlIGZvcm1hdC5cclxuICpcclxuICogQGFic3RyYWN0XHJcbiAqIEBhdWdtZW50cyBMb2FkZXJcclxuICovXHJcbmNsYXNzIENvbXByZXNzZWRUZXh0dXJlTG9hZGVyIGV4dGVuZHMgTG9hZGVyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBjb21wcmVzc2VkIHRleHR1cmUgbG9hZGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtMb2FkaW5nTWFuYWdlcn0gW21hbmFnZXJdIC0gVGhlIGxvYWRpbmcgbWFuYWdlci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbWFuYWdlciApIHtcclxuXHJcblx0XHRzdXBlciggbWFuYWdlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFN0YXJ0cyBsb2FkaW5nIGZyb20gdGhlIGdpdmVuIFVSTCBhbmQgcGFzc2VzIHRoZSBsb2FkZWQgY29tcHJlc3NlZCB0ZXh0dXJlXHJcblx0ICogdG8gdGhlIGBvbkxvYWQoKWAgY2FsbGJhY2suIFRoZSBtZXRob2QgYWxzbyByZXR1cm5zIGEgbmV3IHRleHR1cmUgb2JqZWN0IHdoaWNoIGNhblxyXG5cdCAqIGRpcmVjdGx5IGJlIHVzZWQgZm9yIG1hdGVyaWFsIGNyZWF0aW9uLiBJZiB5b3UgZG8gaXQgdGhpcyB3YXksIHRoZSB0ZXh0dXJlXHJcblx0ICogbWF5IHBvcCB1cCBpbiB5b3VyIHNjZW5lIG9uY2UgdGhlIHJlc3BlY3RpdmUgbG9hZGluZyBwcm9jZXNzIGlzIGZpbmlzaGVkLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIFRoZSBwYXRoL1VSTCBvZiB0aGUgZmlsZSB0byBiZSBsb2FkZWQuIFRoaXMgY2FuIGFsc28gYmUgYSBkYXRhIFVSSS5cclxuXHQgKiBAcGFyYW0ge2Z1bmN0aW9uKENvbXByZXNzZWRUZXh0dXJlKX0gb25Mb2FkIC0gRXhlY3V0ZWQgd2hlbiB0aGUgbG9hZGluZyBwcm9jZXNzIGhhcyBiZWVuIGZpbmlzaGVkLlxyXG5cdCAqIEBwYXJhbSB7b25Qcm9ncmVzc0NhbGxiYWNrfSBvblByb2dyZXNzIC0gRXhlY3V0ZWQgd2hpbGUgdGhlIGxvYWRpbmcgaXMgaW4gcHJvZ3Jlc3MuXHJcblx0ICogQHBhcmFtIHtvbkVycm9yQ2FsbGJhY2t9IG9uRXJyb3IgLSBFeGVjdXRlZCB3aGVuIGVycm9ycyBvY2N1ci5cclxuXHQgKiBAcmV0dXJuIHtDb21wcmVzc2VkVGV4dHVyZX0gVGhlIGNvbXByZXNzZWQgdGV4dHVyZS5cclxuXHQgKi9cclxuXHRsb2FkKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcclxuXHJcblx0XHRjb25zdCBzY29wZSA9IHRoaXM7XHJcblxyXG5cdFx0Y29uc3QgaW1hZ2VzID0gW107XHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZSA9IG5ldyBDb21wcmVzc2VkVGV4dHVyZSgpO1xyXG5cclxuXHRcdGNvbnN0IGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCB0aGlzLm1hbmFnZXIgKTtcclxuXHRcdGxvYWRlci5zZXRQYXRoKCB0aGlzLnBhdGggKTtcclxuXHRcdGxvYWRlci5zZXRSZXNwb25zZVR5cGUoICdhcnJheWJ1ZmZlcicgKTtcclxuXHRcdGxvYWRlci5zZXRSZXF1ZXN0SGVhZGVyKCB0aGlzLnJlcXVlc3RIZWFkZXIgKTtcclxuXHRcdGxvYWRlci5zZXRXaXRoQ3JlZGVudGlhbHMoIHNjb3BlLndpdGhDcmVkZW50aWFscyApO1xyXG5cclxuXHRcdGxldCBsb2FkZWQgPSAwO1xyXG5cclxuXHRcdGZ1bmN0aW9uIGxvYWRUZXh0dXJlKCBpICkge1xyXG5cclxuXHRcdFx0bG9hZGVyLmxvYWQoIHVybFsgaSBdLCBmdW5jdGlvbiAoIGJ1ZmZlciApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgdGV4RGF0YXMgPSBzY29wZS5wYXJzZSggYnVmZmVyLCB0cnVlICk7XHJcblxyXG5cdFx0XHRcdGltYWdlc1sgaSBdID0ge1xyXG5cdFx0XHRcdFx0d2lkdGg6IHRleERhdGFzLndpZHRoLFxyXG5cdFx0XHRcdFx0aGVpZ2h0OiB0ZXhEYXRhcy5oZWlnaHQsXHJcblx0XHRcdFx0XHRmb3JtYXQ6IHRleERhdGFzLmZvcm1hdCxcclxuXHRcdFx0XHRcdG1pcG1hcHM6IHRleERhdGFzLm1pcG1hcHNcclxuXHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0XHRsb2FkZWQgKz0gMTtcclxuXHJcblx0XHRcdFx0aWYgKCBsb2FkZWQgPT09IDYgKSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCB0ZXhEYXRhcy5taXBtYXBDb3VudCA9PT0gMSApIHRleHR1cmUubWluRmlsdGVyID0gTGluZWFyRmlsdGVyO1xyXG5cclxuXHRcdFx0XHRcdHRleHR1cmUuaW1hZ2UgPSBpbWFnZXM7XHJcblx0XHRcdFx0XHR0ZXh0dXJlLmZvcm1hdCA9IHRleERhdGFzLmZvcm1hdDtcclxuXHRcdFx0XHRcdHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCB1cmwgKSApIHtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSB1cmwubGVuZ3RoOyBpIDwgaWw7ICsrIGkgKSB7XHJcblxyXG5cdFx0XHRcdGxvYWRUZXh0dXJlKCBpICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdC8vIGNvbXByZXNzZWQgY3ViZW1hcCB0ZXh0dXJlIHN0b3JlZCBpbiBhIHNpbmdsZSBERFMgZmlsZVxyXG5cclxuXHRcdFx0bG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCBidWZmZXIgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHRleERhdGFzID0gc2NvcGUucGFyc2UoIGJ1ZmZlciwgdHJ1ZSApO1xyXG5cclxuXHRcdFx0XHRpZiAoIHRleERhdGFzLmlzQ3ViZW1hcCApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBmYWNlcyA9IHRleERhdGFzLm1pcG1hcHMubGVuZ3RoIC8gdGV4RGF0YXMubWlwbWFwQ291bnQ7XHJcblxyXG5cdFx0XHRcdFx0Zm9yICggbGV0IGYgPSAwOyBmIDwgZmFjZXM7IGYgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRpbWFnZXNbIGYgXSA9IHsgbWlwbWFwczogW10gfTtcclxuXHJcblx0XHRcdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHRleERhdGFzLm1pcG1hcENvdW50OyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpbWFnZXNbIGYgXS5taXBtYXBzLnB1c2goIHRleERhdGFzLm1pcG1hcHNbIGYgKiB0ZXhEYXRhcy5taXBtYXBDb3VudCArIGkgXSApO1xyXG5cdFx0XHRcdFx0XHRcdGltYWdlc1sgZiBdLmZvcm1hdCA9IHRleERhdGFzLmZvcm1hdDtcclxuXHRcdFx0XHRcdFx0XHRpbWFnZXNbIGYgXS53aWR0aCA9IHRleERhdGFzLndpZHRoO1xyXG5cdFx0XHRcdFx0XHRcdGltYWdlc1sgZiBdLmhlaWdodCA9IHRleERhdGFzLmhlaWdodDtcclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0dGV4dHVyZS5pbWFnZSA9IGltYWdlcztcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHR0ZXh0dXJlLmltYWdlLndpZHRoID0gdGV4RGF0YXMud2lkdGg7XHJcblx0XHRcdFx0XHR0ZXh0dXJlLmltYWdlLmhlaWdodCA9IHRleERhdGFzLmhlaWdodDtcclxuXHRcdFx0XHRcdHRleHR1cmUubWlwbWFwcyA9IHRleERhdGFzLm1pcG1hcHM7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKCB0ZXhEYXRhcy5taXBtYXBDb3VudCA9PT0gMSApIHtcclxuXHJcblx0XHRcdFx0XHR0ZXh0dXJlLm1pbkZpbHRlciA9IExpbmVhckZpbHRlcjtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR0ZXh0dXJlLmZvcm1hdCA9IHRleERhdGFzLmZvcm1hdDtcclxuXHRcdFx0XHR0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIHRleHR1cmUgKTtcclxuXHJcblx0XHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRleHR1cmU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIHRoZSByZXN1bHQgb2JqZWN0IHR5cGUgb2YgdGhlIGBwYXJzZSgpYCBtZXRob2QuXHJcbiAqXHJcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENvbXByZXNzZWRUZXh0dXJlTG9hZGVyflRleERhdGFcclxuICogQHByb3BlcnR5IHtudW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSBiYXNlIG1pcC5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IGhlaWdodCAtIFRoZSB3aWR0aCBvZiB0aGUgYmFzZSBtaXAuXHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaXNDdWJlbWFwIC0gV2hldGhlciB0aGUgZGF0YSByZXByZXNlbnQgYSBjdWJlbWFwIG9yIG5vdC5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IG1pcG1hcENvdW50IC0gVGhlIG1pcG1hcCBjb3VudC5cclxuICogQHByb3BlcnR5IHtBcnJheTx7ZGF0YTpUeXBlZEFycmF5LHdpZHRoOm51bWJlcixoZWlnaHQ6bnVtYmVyfT59IG1pcG1hcHMgLSBBbiBhcnJheSBob2xkaW5nIHRoZSBtaXBtYXBzLlxyXG4gKiBFYWNoIGVudHJ5IGhvbGRzIHRoZSBkYXRhIGFuZCB0aGUgZGltZW5zaW9ucyBmb3IgZWFjaCBsZXZlbC5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IGZvcm1hdCAtIFRoZSB0ZXh0dXJlIGZvcm1hdC5cclxuICoqL1xyXG5cclxuZXhwb3J0IHsgQ29tcHJlc3NlZFRleHR1cmVMb2FkZXIgfTtcclxuIiwiaW1wb3J0IHsgQ2FjaGUgfSBmcm9tICcuL0NhY2hlLmpzJztcclxuaW1wb3J0IHsgTG9hZGVyIH0gZnJvbSAnLi9Mb2FkZXIuanMnO1xyXG5pbXBvcnQgeyBjcmVhdGVFbGVtZW50TlMgfSBmcm9tICcuLi91dGlscy5qcyc7XHJcblxyXG4vKipcclxuICogQSBsb2FkZXIgZm9yIGxvYWRpbmcgaW1hZ2VzLiBUaGUgY2xhc3MgbG9hZHMgaW1hZ2VzIHdpdGggdGhlIEhUTUwgYEltYWdlYCBBUEkuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGxvYWRlciA9IG5ldyBUSFJFRS5JbWFnZUxvYWRlcigpO1xyXG4gKiBjb25zdCBpbWFnZSA9IGF3YWl0IGxvYWRlci5sb2FkQXN5bmMoICdpbWFnZS5wbmcnICk7XHJcbiAqIGBgYFxyXG4gKiBQbGVhc2Ugbm90ZSB0aGF0IGBJbWFnZUxvYWRlcmAgaGFzIGRyb3BwZWQgc3VwcG9ydCBmb3IgcHJvZ3Jlc3NcclxuICogZXZlbnRzIGluIGByODRgLiBGb3IgYW4gYEltYWdlTG9hZGVyYCB0aGF0IHN1cHBvcnRzIHByb2dyZXNzIGV2ZW50cywgc2VlXHJcbiAqIFt0aGlzIHRocmVhZF17QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL21yZG9vYi90aHJlZS5qcy9pc3N1ZXMvMTA0MzkjaXNzdWVjb21tZW50LTI3NTc4NTYzOX0uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBMb2FkZXJcclxuICovXHJcbmNsYXNzIEltYWdlTG9hZGVyIGV4dGVuZHMgTG9hZGVyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBpbWFnZSBsb2FkZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0xvYWRpbmdNYW5hZ2VyfSBbbWFuYWdlcl0gLSBUaGUgbG9hZGluZyBtYW5hZ2VyLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBtYW5hZ2VyICkge1xyXG5cclxuXHRcdHN1cGVyKCBtYW5hZ2VyICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3RhcnRzIGxvYWRpbmcgZnJvbSB0aGUgZ2l2ZW4gVVJMIGFuZCBwYXNzZXMgdGhlIGxvYWRlZCBpbWFnZVxyXG5cdCAqIHRvIHRoZSBgb25Mb2FkKClgIGNhbGxiYWNrLiBUaGUgbWV0aG9kIGFsc28gcmV0dXJucyBhIG5ldyBgSW1hZ2VgIG9iamVjdCB3aGljaCBjYW5cclxuXHQgKiBkaXJlY3RseSBiZSB1c2VkIGZvciB0ZXh0dXJlIGNyZWF0aW9uLiBJZiB5b3UgZG8gaXQgdGhpcyB3YXksIHRoZSB0ZXh0dXJlXHJcblx0ICogbWF5IHBvcCB1cCBpbiB5b3VyIHNjZW5lIG9uY2UgdGhlIHJlc3BlY3RpdmUgbG9hZGluZyBwcm9jZXNzIGlzIGZpbmlzaGVkLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIFRoZSBwYXRoL1VSTCBvZiB0aGUgZmlsZSB0byBiZSBsb2FkZWQuIFRoaXMgY2FuIGFsc28gYmUgYSBkYXRhIFVSSS5cclxuXHQgKiBAcGFyYW0ge2Z1bmN0aW9uKEltYWdlKX0gb25Mb2FkIC0gRXhlY3V0ZWQgd2hlbiB0aGUgbG9hZGluZyBwcm9jZXNzIGhhcyBiZWVuIGZpbmlzaGVkLlxyXG5cdCAqIEBwYXJhbSB7b25Qcm9ncmVzc0NhbGxiYWNrfSBvblByb2dyZXNzIC0gVW5zdXBwb3J0ZWQgaW4gdGhpcyBsb2FkZXIuXHJcblx0ICogQHBhcmFtIHtvbkVycm9yQ2FsbGJhY2t9IG9uRXJyb3IgLSBFeGVjdXRlZCB3aGVuIGVycm9ycyBvY2N1ci5cclxuXHQgKiBAcmV0dXJuIHtJbWFnZX0gVGhlIGltYWdlLlxyXG5cdCAqL1xyXG5cdGxvYWQoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5wYXRoICE9PSB1bmRlZmluZWQgKSB1cmwgPSB0aGlzLnBhdGggKyB1cmw7XHJcblxyXG5cdFx0dXJsID0gdGhpcy5tYW5hZ2VyLnJlc29sdmVVUkwoIHVybCApO1xyXG5cclxuXHRcdGNvbnN0IHNjb3BlID0gdGhpcztcclxuXHJcblx0XHRjb25zdCBjYWNoZWQgPSBDYWNoZS5nZXQoIHVybCApO1xyXG5cclxuXHRcdGlmICggY2FjaGVkICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1TdGFydCggdXJsICk7XHJcblxyXG5cdFx0XHRzZXRUaW1lb3V0KCBmdW5jdGlvbiAoKSB7XHJcblxyXG5cdFx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCBjYWNoZWQgKTtcclxuXHJcblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcclxuXHJcblx0XHRcdH0sIDAgKTtcclxuXHJcblx0XHRcdHJldHVybiBjYWNoZWQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGltYWdlID0gY3JlYXRlRWxlbWVudE5TKCAnaW1nJyApO1xyXG5cclxuXHRcdGZ1bmN0aW9uIG9uSW1hZ2VMb2FkKCkge1xyXG5cclxuXHRcdFx0cmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcclxuXHJcblx0XHRcdENhY2hlLmFkZCggdXJsLCB0aGlzICk7XHJcblxyXG5cdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggdGhpcyApO1xyXG5cclxuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0ZnVuY3Rpb24gb25JbWFnZUVycm9yKCBldmVudCApIHtcclxuXHJcblx0XHRcdHJlbW92ZUV2ZW50TGlzdGVuZXJzKCk7XHJcblxyXG5cdFx0XHRpZiAoIG9uRXJyb3IgKSBvbkVycm9yKCBldmVudCApO1xyXG5cclxuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRXJyb3IoIHVybCApO1xyXG5cdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVycygpIHtcclxuXHJcblx0XHRcdGltYWdlLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdsb2FkJywgb25JbWFnZUxvYWQsIGZhbHNlICk7XHJcblx0XHRcdGltYWdlLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdlcnJvcicsIG9uSW1hZ2VFcnJvciwgZmFsc2UgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aW1hZ2UuYWRkRXZlbnRMaXN0ZW5lciggJ2xvYWQnLCBvbkltYWdlTG9hZCwgZmFsc2UgKTtcclxuXHRcdGltYWdlLmFkZEV2ZW50TGlzdGVuZXIoICdlcnJvcicsIG9uSW1hZ2VFcnJvciwgZmFsc2UgKTtcclxuXHJcblx0XHRpZiAoIHVybC5zbGljZSggMCwgNSApICE9PSAnZGF0YTonICkge1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLmNyb3NzT3JpZ2luICE9PSB1bmRlZmluZWQgKSBpbWFnZS5jcm9zc09yaWdpbiA9IHRoaXMuY3Jvc3NPcmlnaW47XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHNjb3BlLm1hbmFnZXIuaXRlbVN0YXJ0KCB1cmwgKTtcclxuXHJcblx0XHRpbWFnZS5zcmMgPSB1cmw7XHJcblxyXG5cdFx0cmV0dXJuIGltYWdlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgSW1hZ2VMb2FkZXIgfTtcclxuIiwiaW1wb3J0IHsgSW1hZ2VMb2FkZXIgfSBmcm9tICcuL0ltYWdlTG9hZGVyLmpzJztcclxuaW1wb3J0IHsgQ3ViZVRleHR1cmUgfSBmcm9tICcuLi90ZXh0dXJlcy9DdWJlVGV4dHVyZS5qcyc7XHJcbmltcG9ydCB7IExvYWRlciB9IGZyb20gJy4vTG9hZGVyLmpzJztcclxuaW1wb3J0IHsgU1JHQkNvbG9yU3BhY2UgfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xyXG5cclxuLyoqXHJcbiAqIENsYXNzIGZvciBsb2FkaW5nIGN1YmUgdGV4dHVyZXMuIEltYWdlcyBhcmUgaW50ZXJuYWxseSBsb2FkZWQgdmlhIHtAbGluayBJbWFnZUxvYWRlcn0uXHJcbiAqXHJcbiAqIFRoZSBsb2FkZXIgcmV0dXJucyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgQ3ViZVRleHR1cmV9IGFuZCBleHBlY3RzIHRoZSBjdWJlIG1hcCB0b1xyXG4gKiBiZSBkZWZpbmVkIGFzIHNpeCBzZXBhcmF0ZSBpbWFnZXMgcmVwcmVzZW50aW5nIHRoZSBzaWRlcyBvZiBhIGN1YmUuIE90aGVyIGN1YmUgbWFwIGRlZmluaXRpb25zXHJcbiAqIGxpa2UgdmVydGljYWwgYW5kIGhvcml6b250YWwgY3Jvc3MsIGNvbHVtbiBhbmQgcm93IGxheW91dHMgYXJlIG5vdCBzdXBwb3J0ZWQuXHJcbiAqXHJcbiAqIE5vdGUgdGhhdCwgYnkgY29udmVudGlvbiwgY3ViZSBtYXBzIGFyZSBzcGVjaWZpZWQgaW4gYSBjb29yZGluYXRlIHN5c3RlbVxyXG4gKiBpbiB3aGljaCBwb3NpdGl2ZS14IGlzIHRvIHRoZSByaWdodCB3aGVuIGxvb2tpbmcgdXAgdGhlIHBvc2l0aXZlLXogYXhpcyAtLVxyXG4gKiBpbiBvdGhlciB3b3JkcywgdXNpbmcgYSBsZWZ0LWhhbmRlZCBjb29yZGluYXRlIHN5c3RlbS4gU2luY2UgdGhyZWUuanMgdXNlc1xyXG4gKiBhIHJpZ2h0LWhhbmRlZCBjb29yZGluYXRlIHN5c3RlbSwgZW52aXJvbm1lbnQgbWFwcyB1c2VkIGluIHRocmVlLmpzIHdpbGxcclxuICogaGF2ZSBwb3MteCBhbmQgbmVnLXggc3dhcHBlZC5cclxuICpcclxuICogVGhlIGxvYWRlZCBjdWJlIHRleHR1cmUgaXMgaW4gc1JHQiBjb2xvciBzcGFjZS4gTWVhbmluZyB7QGxpbmsgVGV4dHVyZSNjb2xvclNwYWNlfVxyXG4gKiBpcyBzZXQgdG8gYFNSR0JDb2xvclNwYWNlYCBieSBkZWZhdWx0LlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBsb2FkZXIgPSBuZXcgVEhSRUUuQ3ViZVRleHR1cmVMb2FkZXIoKS5zZXRQYXRoKCAndGV4dHVyZXMvY3ViZU1hcHMvJyApO1xyXG4gKiBjb25zdCBjdWJlVGV4dHVyZSA9IGF3YWl0IGxvYWRlci5sb2FkQXN5bmMoIFtcclxuICogXHQncHgucG5nJywgJ254LnBuZycsICdweS5wbmcnLCAnbnkucG5nJywgJ3B6LnBuZycsICduei5wbmcnXHJcbiAqIF0gKTtcclxuICogc2NlbmUuYmFja2dyb3VuZCA9IGN1YmVUZXh0dXJlO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIExvYWRlclxyXG4gKi9cclxuY2xhc3MgQ3ViZVRleHR1cmVMb2FkZXIgZXh0ZW5kcyBMb2FkZXIge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGN1YmUgdGV4dHVyZSBsb2FkZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0xvYWRpbmdNYW5hZ2VyfSBbbWFuYWdlcl0gLSBUaGUgbG9hZGluZyBtYW5hZ2VyLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBtYW5hZ2VyICkge1xyXG5cclxuXHRcdHN1cGVyKCBtYW5hZ2VyICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3RhcnRzIGxvYWRpbmcgZnJvbSB0aGUgZ2l2ZW4gVVJMIGFuZCBwYXNzIHRoZSBmdWxseSBsb2FkZWQgY3ViZSB0ZXh0dXJlXHJcblx0ICogdG8gdGhlIGBvbkxvYWQoKWAgY2FsbGJhY2suIFRoZSBtZXRob2QgYWxzbyByZXR1cm5zIGEgbmV3IGN1YmUgdGV4dHVyZSBvYmplY3Qgd2hpY2ggY2FuXHJcblx0ICogZGlyZWN0bHkgYmUgdXNlZCBmb3IgbWF0ZXJpYWwgY3JlYXRpb24uIElmIHlvdSBkbyBpdCB0aGlzIHdheSwgdGhlIGN1YmUgdGV4dHVyZVxyXG5cdCAqIG1heSBwb3AgdXAgaW4geW91ciBzY2VuZSBvbmNlIHRoZSByZXNwZWN0aXZlIGxvYWRpbmcgcHJvY2VzcyBpcyBmaW5pc2hlZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gdXJscyAtIEFycmF5IG9mIDYgVVJMcyB0byBpbWFnZXMsIG9uZSBmb3IgZWFjaCBzaWRlIG9mIHRoZVxyXG5cdCAqIGN1YmUgdGV4dHVyZS4gVGhlIHVybHMgc2hvdWxkIGJlIHNwZWNpZmllZCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOiBwb3MteCxcclxuXHQgKiBuZWcteCwgcG9zLXksIG5lZy15LCBwb3MteiwgbmVnLXouIEFuIGFycmF5IG9mIGRhdGEgVVJJcyBhcmUgYWxsb3dlZCBhcyB3ZWxsLlxyXG5cdCAqIEBwYXJhbSB7ZnVuY3Rpb24oQ3ViZVRleHR1cmUpfSBvbkxvYWQgLSBFeGVjdXRlZCB3aGVuIHRoZSBsb2FkaW5nIHByb2Nlc3MgaGFzIGJlZW4gZmluaXNoZWQuXHJcblx0ICogQHBhcmFtIHtvblByb2dyZXNzQ2FsbGJhY2t9IG9uUHJvZ3Jlc3MgLSBVbnN1cHBvcnRlZCBpbiB0aGlzIGxvYWRlci5cclxuXHQgKiBAcGFyYW0ge29uRXJyb3JDYWxsYmFja30gb25FcnJvciAtIEV4ZWN1dGVkIHdoZW4gZXJyb3JzIG9jY3VyLlxyXG5cdCAqIEByZXR1cm4ge0N1YmVUZXh0dXJlfSBUaGUgY3ViZSB0ZXh0dXJlLlxyXG5cdCAqL1xyXG5cdGxvYWQoIHVybHMsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcclxuXHJcblx0XHRjb25zdCB0ZXh0dXJlID0gbmV3IEN1YmVUZXh0dXJlKCk7XHJcblx0XHR0ZXh0dXJlLmNvbG9yU3BhY2UgPSBTUkdCQ29sb3JTcGFjZTtcclxuXHJcblx0XHRjb25zdCBsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoIHRoaXMubWFuYWdlciApO1xyXG5cdFx0bG9hZGVyLnNldENyb3NzT3JpZ2luKCB0aGlzLmNyb3NzT3JpZ2luICk7XHJcblx0XHRsb2FkZXIuc2V0UGF0aCggdGhpcy5wYXRoICk7XHJcblxyXG5cdFx0bGV0IGxvYWRlZCA9IDA7XHJcblxyXG5cdFx0ZnVuY3Rpb24gbG9hZFRleHR1cmUoIGkgKSB7XHJcblxyXG5cdFx0XHRsb2FkZXIubG9hZCggdXJsc1sgaSBdLCBmdW5jdGlvbiAoIGltYWdlICkge1xyXG5cclxuXHRcdFx0XHR0ZXh0dXJlLmltYWdlc1sgaSBdID0gaW1hZ2U7XHJcblxyXG5cdFx0XHRcdGxvYWRlZCArKztcclxuXHJcblx0XHRcdFx0aWYgKCBsb2FkZWQgPT09IDYgKSB7XHJcblxyXG5cdFx0XHRcdFx0dGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIHRleHR1cmUgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSwgdW5kZWZpbmVkLCBvbkVycm9yICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyArKyBpICkge1xyXG5cclxuXHRcdFx0bG9hZFRleHR1cmUoIGkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRleHR1cmU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBDdWJlVGV4dHVyZUxvYWRlciB9O1xyXG4iLCJpbXBvcnQgeyBMaW5lYXJGaWx0ZXIsIExpbmVhck1pcG1hcExpbmVhckZpbHRlciwgQ2xhbXBUb0VkZ2VXcmFwcGluZyB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IEZpbGVMb2FkZXIgfSBmcm9tICcuL0ZpbGVMb2FkZXIuanMnO1xyXG5pbXBvcnQgeyBEYXRhVGV4dHVyZSB9IGZyb20gJy4uL3RleHR1cmVzL0RhdGFUZXh0dXJlLmpzJztcclxuaW1wb3J0IHsgTG9hZGVyIH0gZnJvbSAnLi9Mb2FkZXIuanMnO1xyXG5cclxuLyoqXHJcbiAqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGxvYWRpbmcgYmluYXJ5IHRleHR1cmUgZm9ybWF0cyBSR0JFLCBFWFIgb3IgVEdBLlxyXG4gKiBUZXh0dXJlcyBhcmUgaW50ZXJuYWxseSBsb2FkZWQgdmlhIHtAbGluayBGaWxlTG9hZGVyfS5cclxuICpcclxuICogRGVyaXZlZCBjbGFzc2VzIGhhdmUgdG8gaW1wbGVtZW50IHRoZSBgcGFyc2UoKWAgbWV0aG9kIHdoaWNoIGhvbGRzIHRoZSBwYXJzaW5nXHJcbiAqIGZvciB0aGUgcmVzcGVjdGl2ZSBmb3JtYXQuXHJcbiAqXHJcbiAqIEBhYnN0cmFjdFxyXG4gKiBAYXVnbWVudHMgTG9hZGVyXHJcbiAqL1xyXG5jbGFzcyBEYXRhVGV4dHVyZUxvYWRlciBleHRlbmRzIExvYWRlciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgZGF0YSB0ZXh0dXJlIGxvYWRlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TG9hZGluZ01hbmFnZXJ9IFttYW5hZ2VyXSAtIFRoZSBsb2FkaW5nIG1hbmFnZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG1hbmFnZXIgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG1hbmFnZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTdGFydHMgbG9hZGluZyBmcm9tIHRoZSBnaXZlbiBVUkwgYW5kIHBhc3NlcyB0aGUgbG9hZGVkIGRhdGEgdGV4dHVyZVxyXG5cdCAqIHRvIHRoZSBgb25Mb2FkKClgIGNhbGxiYWNrLiBUaGUgbWV0aG9kIGFsc28gcmV0dXJucyBhIG5ldyB0ZXh0dXJlIG9iamVjdCB3aGljaCBjYW5cclxuXHQgKiBkaXJlY3RseSBiZSB1c2VkIGZvciBtYXRlcmlhbCBjcmVhdGlvbi4gSWYgeW91IGRvIGl0IHRoaXMgd2F5LCB0aGUgdGV4dHVyZVxyXG5cdCAqIG1heSBwb3AgdXAgaW4geW91ciBzY2VuZSBvbmNlIHRoZSByZXNwZWN0aXZlIGxvYWRpbmcgcHJvY2VzcyBpcyBmaW5pc2hlZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSBUaGUgcGF0aC9VUkwgb2YgdGhlIGZpbGUgdG8gYmUgbG9hZGVkLiBUaGlzIGNhbiBhbHNvIGJlIGEgZGF0YSBVUkkuXHJcblx0ICogQHBhcmFtIHtmdW5jdGlvbihEYXRhVGV4dHVyZSl9IG9uTG9hZCAtIEV4ZWN1dGVkIHdoZW4gdGhlIGxvYWRpbmcgcHJvY2VzcyBoYXMgYmVlbiBmaW5pc2hlZC5cclxuXHQgKiBAcGFyYW0ge29uUHJvZ3Jlc3NDYWxsYmFja30gb25Qcm9ncmVzcyAtIEV4ZWN1dGVkIHdoaWxlIHRoZSBsb2FkaW5nIGlzIGluIHByb2dyZXNzLlxyXG5cdCAqIEBwYXJhbSB7b25FcnJvckNhbGxiYWNrfSBvbkVycm9yIC0gRXhlY3V0ZWQgd2hlbiBlcnJvcnMgb2NjdXIuXHJcblx0ICogQHJldHVybiB7RGF0YVRleHR1cmV9IFRoZSBkYXRhIHRleHR1cmUuXHJcblx0ICovXHJcblx0bG9hZCggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XHJcblxyXG5cdFx0Y29uc3Qgc2NvcGUgPSB0aGlzO1xyXG5cclxuXHRcdGNvbnN0IHRleHR1cmUgPSBuZXcgRGF0YVRleHR1cmUoKTtcclxuXHJcblx0XHRjb25zdCBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XHJcblx0XHRsb2FkZXIuc2V0UmVzcG9uc2VUeXBlKCAnYXJyYXlidWZmZXInICk7XHJcblx0XHRsb2FkZXIuc2V0UmVxdWVzdEhlYWRlciggdGhpcy5yZXF1ZXN0SGVhZGVyICk7XHJcblx0XHRsb2FkZXIuc2V0UGF0aCggdGhpcy5wYXRoICk7XHJcblx0XHRsb2FkZXIuc2V0V2l0aENyZWRlbnRpYWxzKCBzY29wZS53aXRoQ3JlZGVudGlhbHMgKTtcclxuXHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggYnVmZmVyICkge1xyXG5cclxuXHRcdFx0bGV0IHRleERhdGE7XHJcblxyXG5cdFx0XHR0cnkge1xyXG5cclxuXHRcdFx0XHR0ZXhEYXRhID0gc2NvcGUucGFyc2UoIGJ1ZmZlciApO1xyXG5cclxuXHRcdFx0fSBjYXRjaCAoIGVycm9yICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIG9uRXJyb3IgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRvbkVycm9yKCBlcnJvciApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoIGVycm9yICk7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggdGV4RGF0YS5pbWFnZSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHR0ZXh0dXJlLmltYWdlID0gdGV4RGF0YS5pbWFnZTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIHRleERhdGEuZGF0YSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHR0ZXh0dXJlLmltYWdlLndpZHRoID0gdGV4RGF0YS53aWR0aDtcclxuXHRcdFx0XHR0ZXh0dXJlLmltYWdlLmhlaWdodCA9IHRleERhdGEuaGVpZ2h0O1xyXG5cdFx0XHRcdHRleHR1cmUuaW1hZ2UuZGF0YSA9IHRleERhdGEuZGF0YTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRleHR1cmUud3JhcFMgPSB0ZXhEYXRhLndyYXBTICE9PSB1bmRlZmluZWQgPyB0ZXhEYXRhLndyYXBTIDogQ2xhbXBUb0VkZ2VXcmFwcGluZztcclxuXHRcdFx0dGV4dHVyZS53cmFwVCA9IHRleERhdGEud3JhcFQgIT09IHVuZGVmaW5lZCA/IHRleERhdGEud3JhcFQgOiBDbGFtcFRvRWRnZVdyYXBwaW5nO1xyXG5cclxuXHRcdFx0dGV4dHVyZS5tYWdGaWx0ZXIgPSB0ZXhEYXRhLm1hZ0ZpbHRlciAhPT0gdW5kZWZpbmVkID8gdGV4RGF0YS5tYWdGaWx0ZXIgOiBMaW5lYXJGaWx0ZXI7XHJcblx0XHRcdHRleHR1cmUubWluRmlsdGVyID0gdGV4RGF0YS5taW5GaWx0ZXIgIT09IHVuZGVmaW5lZCA/IHRleERhdGEubWluRmlsdGVyIDogTGluZWFyRmlsdGVyO1xyXG5cclxuXHRcdFx0dGV4dHVyZS5hbmlzb3Ryb3B5ID0gdGV4RGF0YS5hbmlzb3Ryb3B5ICE9PSB1bmRlZmluZWQgPyB0ZXhEYXRhLmFuaXNvdHJvcHkgOiAxO1xyXG5cclxuXHRcdFx0aWYgKCB0ZXhEYXRhLmNvbG9yU3BhY2UgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0dGV4dHVyZS5jb2xvclNwYWNlID0gdGV4RGF0YS5jb2xvclNwYWNlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCB0ZXhEYXRhLmZsaXBZICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdHRleHR1cmUuZmxpcFkgPSB0ZXhEYXRhLmZsaXBZO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCB0ZXhEYXRhLmZvcm1hdCAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHR0ZXh0dXJlLmZvcm1hdCA9IHRleERhdGEuZm9ybWF0O1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCB0ZXhEYXRhLnR5cGUgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0dGV4dHVyZS50eXBlID0gdGV4RGF0YS50eXBlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCB0ZXhEYXRhLm1pcG1hcHMgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0dGV4dHVyZS5taXBtYXBzID0gdGV4RGF0YS5taXBtYXBzO1xyXG5cdFx0XHRcdHRleHR1cmUubWluRmlsdGVyID0gTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyOyAvLyBwcmVzdW1hYmx5Li4uXHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHRleERhdGEubWlwbWFwQ291bnQgPT09IDEgKSB7XHJcblxyXG5cdFx0XHRcdHRleHR1cmUubWluRmlsdGVyID0gTGluZWFyRmlsdGVyO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCB0ZXhEYXRhLmdlbmVyYXRlTWlwbWFwcyAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHR0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IHRleERhdGEuZ2VuZXJhdGVNaXBtYXBzO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggdGV4dHVyZSwgdGV4RGF0YSApO1xyXG5cclxuXHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcclxuXHJcblxyXG5cdFx0cmV0dXJuIHRleHR1cmU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIHRoZSByZXN1bHQgb2JqZWN0IHR5cGUgb2YgdGhlIGBwYXJzZSgpYCBtZXRob2QuXHJcbiAqXHJcbiAqIEB0eXBlZGVmIHtPYmplY3R9IERhdGFUZXh0dXJlTG9hZGVyflRleERhdGFcclxuICogQHByb3BlcnR5IHtPYmplY3R9IFtpbWFnZV0gLSBBbiBvYmplY3QgaG9sZGluZyB3aWR0aCwgaGVpZ2h0IGFuZCB0aGUgdGV4dHVyZSBkYXRhLlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3dpZHRoXSAtIFRoZSB3aWR0aCBvZiB0aGUgYmFzZSBtaXAuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbaGVpZ2h0XSAtIFRoZSB3aWR0aCBvZiB0aGUgYmFzZSBtaXAuXHJcbiAqIEBwcm9wZXJ0eSB7VHlwZWRBcnJheX0gW2RhdGFdIC0gVGhlIHRleHR1cmUgZGF0YS5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtmb3JtYXRdIC0gVGhlIHRleHR1cmUgZm9ybWF0LlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3R5cGVdIC0gVGhlIHRleHR1cmUgdHlwZS5cclxuICogQHByb3BlcnR5IHtib29sZWFufSBbZmxpcFldIC0gSWYgc2V0IHRvIGB0cnVlYCwgdGhlIHRleHR1cmUgaXMgZmxpcHBlZCBhbG9uZyB0aGUgdmVydGljYWwgYXhpcyB3aGVuIHVwbG9hZGVkIHRvIHRoZSBHUFUuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbd3JhcFM9Q2xhbXBUb0VkZ2VXcmFwcGluZ10gLSBUaGUgd3JhcFMgdmFsdWUuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbd3JhcFQ9Q2xhbXBUb0VkZ2VXcmFwcGluZ10gLSBUaGUgd3JhcFQgdmFsdWUuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbYW5pc290cm9weT0xXSAtIFRoZSBhbmlzb3Ryb3B5IHZhbHVlLlxyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtnZW5lcmF0ZU1pcG1hcHNdIC0gV2hldGhlciB0byBnZW5lcmF0ZSBtaXBtYXBzIG9yIG5vdC5cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjb2xvclNwYWNlXSAtIFRoZSBjb2xvciBzcGFjZS5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFttYWdGaWx0ZXJdIC0gVGhlIG1hZyBmaWx0ZXIuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbbWluRmlsdGVyXSAtIFRoZSBtaW4gZmlsdGVyLlxyXG4gKiBAcHJvcGVydHkge0FycmF5PE9iamVjdD59IFttaXBtYXBzXSAtIFRoZSBtaXBtYXBzLlxyXG4gKiovXHJcblxyXG5leHBvcnQgeyBEYXRhVGV4dHVyZUxvYWRlciB9O1xyXG4iLCJpbXBvcnQgeyBJbWFnZUxvYWRlciB9IGZyb20gJy4vSW1hZ2VMb2FkZXIuanMnO1xyXG5pbXBvcnQgeyBUZXh0dXJlIH0gZnJvbSAnLi4vdGV4dHVyZXMvVGV4dHVyZS5qcyc7XHJcbmltcG9ydCB7IExvYWRlciB9IGZyb20gJy4vTG9hZGVyLmpzJztcclxuXHJcbi8qKlxyXG4gKiBDbGFzcyBmb3IgbG9hZGluZyB0ZXh0dXJlcy4gSW1hZ2VzIGFyZSBpbnRlcm5hbGx5XHJcbiAqIGxvYWRlZCB2aWEge0BsaW5rIEltYWdlTG9hZGVyfS5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgbG9hZGVyID0gbmV3IFRIUkVFLlRleHR1cmVMb2FkZXIoKTtcclxuICogY29uc3QgdGV4dHVyZSA9IGF3YWl0IGxvYWRlci5sb2FkQXN5bmMoICd0ZXh0dXJlcy9sYW5kX29jZWFuX2ljZV9jbG91ZF8yMDQ4LmpwZycgKTtcclxuICpcclxuICogY29uc3QgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoIHsgbWFwOnRleHR1cmUgfSApO1xyXG4gKiBgYGBcclxuICogUGxlYXNlIG5vdGUgdGhhdCBgVGV4dHVyZUxvYWRlcmAgaGFzIGRyb3BwZWQgc3VwcG9ydCBmb3IgcHJvZ3Jlc3NcclxuICogZXZlbnRzIGluIGByODRgLiBGb3IgYSBgVGV4dHVyZUxvYWRlcmAgdGhhdCBzdXBwb3J0cyBwcm9ncmVzcyBldmVudHMsIHNlZVxyXG4gKiBbdGhpcyB0aHJlYWRde0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9tcmRvb2IvdGhyZWUuanMvaXNzdWVzLzEwNDM5I2lzc3VlY29tbWVudC0yOTMyNjAxNDV9LlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTG9hZGVyXHJcbiAqL1xyXG5jbGFzcyBUZXh0dXJlTG9hZGVyIGV4dGVuZHMgTG9hZGVyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB0ZXh0dXJlIGxvYWRlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TG9hZGluZ01hbmFnZXJ9IFttYW5hZ2VyXSAtIFRoZSBsb2FkaW5nIG1hbmFnZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG1hbmFnZXIgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG1hbmFnZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTdGFydHMgbG9hZGluZyBmcm9tIHRoZSBnaXZlbiBVUkwgYW5kIHBhc3MgdGhlIGZ1bGx5IGxvYWRlZCB0ZXh0dXJlXHJcblx0ICogdG8gdGhlIGBvbkxvYWQoKWAgY2FsbGJhY2suIFRoZSBtZXRob2QgYWxzbyByZXR1cm5zIGEgbmV3IHRleHR1cmUgb2JqZWN0IHdoaWNoIGNhblxyXG5cdCAqIGRpcmVjdGx5IGJlIHVzZWQgZm9yIG1hdGVyaWFsIGNyZWF0aW9uLiBJZiB5b3UgZG8gaXQgdGhpcyB3YXksIHRoZSB0ZXh0dXJlXHJcblx0ICogbWF5IHBvcCB1cCBpbiB5b3VyIHNjZW5lIG9uY2UgdGhlIHJlc3BlY3RpdmUgbG9hZGluZyBwcm9jZXNzIGlzIGZpbmlzaGVkLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIFRoZSBwYXRoL1VSTCBvZiB0aGUgZmlsZSB0byBiZSBsb2FkZWQuIFRoaXMgY2FuIGFsc28gYmUgYSBkYXRhIFVSSS5cclxuXHQgKiBAcGFyYW0ge2Z1bmN0aW9uKFRleHR1cmUpfSBvbkxvYWQgLSBFeGVjdXRlZCB3aGVuIHRoZSBsb2FkaW5nIHByb2Nlc3MgaGFzIGJlZW4gZmluaXNoZWQuXHJcblx0ICogQHBhcmFtIHtvblByb2dyZXNzQ2FsbGJhY2t9IG9uUHJvZ3Jlc3MgLSBVbnN1cHBvcnRlZCBpbiB0aGlzIGxvYWRlci5cclxuXHQgKiBAcGFyYW0ge29uRXJyb3JDYWxsYmFja30gb25FcnJvciAtIEV4ZWN1dGVkIHdoZW4gZXJyb3JzIG9jY3VyLlxyXG5cdCAqIEByZXR1cm4ge1RleHR1cmV9IFRoZSB0ZXh0dXJlLlxyXG5cdCAqL1xyXG5cdGxvYWQoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xyXG5cclxuXHRcdGNvbnN0IHRleHR1cmUgPSBuZXcgVGV4dHVyZSgpO1xyXG5cclxuXHRcdGNvbnN0IGxvYWRlciA9IG5ldyBJbWFnZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XHJcblx0XHRsb2FkZXIuc2V0Q3Jvc3NPcmlnaW4oIHRoaXMuY3Jvc3NPcmlnaW4gKTtcclxuXHRcdGxvYWRlci5zZXRQYXRoKCB0aGlzLnBhdGggKTtcclxuXHJcblx0XHRsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoIGltYWdlICkge1xyXG5cclxuXHRcdFx0dGV4dHVyZS5pbWFnZSA9IGltYWdlO1xyXG5cdFx0XHR0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHRcdGlmICggb25Mb2FkICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdG9uTG9hZCggdGV4dHVyZSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcclxuXHJcblx0XHRyZXR1cm4gdGV4dHVyZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCB7IFRleHR1cmVMb2FkZXIgfTtcclxuIiwiaW1wb3J0IHsgT2JqZWN0M0QgfSBmcm9tICcuLi9jb3JlL09iamVjdDNELmpzJztcclxuaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi9tYXRoL0NvbG9yLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBsaWdodHMgLSBhbGwgb3RoZXIgbGlnaHQgdHlwZXMgaW5oZXJpdCB0aGVcclxuICogcHJvcGVydGllcyBhbmQgbWV0aG9kcyBkZXNjcmliZWQgaGVyZS5cclxuICpcclxuICogQGFic3RyYWN0XHJcbiAqIEBhdWdtZW50cyBPYmplY3QzRFxyXG4gKi9cclxuY2xhc3MgTGlnaHQgZXh0ZW5kcyBPYmplY3QzRCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbGlnaHQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geyhudW1iZXJ8Q29sb3J8c3RyaW5nKX0gW2NvbG9yPTB4ZmZmZmZmXSAtIFRoZSBsaWdodCdzIGNvbG9yLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbaW50ZW5zaXR5PTFdIC0gVGhlIGxpZ2h0J3Mgc3RyZW5ndGgvaW50ZW5zaXR5LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBjb2xvciwgaW50ZW5zaXR5ID0gMSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0xpZ2h0ID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnTGlnaHQnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGxpZ2h0J3MgY29sb3IuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0NvbG9yfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCBjb2xvciApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGxpZ2h0J3MgaW50ZW5zaXR5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaW50ZW5zaXR5ID0gaW50ZW5zaXR5O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZyZWVzIHRoZSBHUFUtcmVsYXRlZCByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHRoaXMgaW5zdGFuY2UuIENhbGwgdGhpc1xyXG5cdCAqIG1ldGhvZCB3aGVuZXZlciB0aGlzIGluc3RhbmNlIGlzIG5vIGxvbmdlciB1c2VkIGluIHlvdXIgYXBwLlxyXG5cdCAqL1xyXG5cdGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0Ly8gRW1wdHkgaGVyZSBpbiBiYXNlIGNsYXNzOyBzb21lIHN1YmNsYXNzZXMgb3ZlcnJpZGUuXHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlLCByZWN1cnNpdmUgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlLCByZWN1cnNpdmUgKTtcclxuXHJcblx0XHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xyXG5cdFx0dGhpcy5pbnRlbnNpdHkgPSBzb3VyY2UuaW50ZW5zaXR5O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdHRvSlNPTiggbWV0YSApIHtcclxuXHJcblx0XHRjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCBtZXRhICk7XHJcblxyXG5cdFx0ZGF0YS5vYmplY3QuY29sb3IgPSB0aGlzLmNvbG9yLmdldEhleCgpO1xyXG5cdFx0ZGF0YS5vYmplY3QuaW50ZW5zaXR5ID0gdGhpcy5pbnRlbnNpdHk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmdyb3VuZENvbG9yICE9PSB1bmRlZmluZWQgKSBkYXRhLm9iamVjdC5ncm91bmRDb2xvciA9IHRoaXMuZ3JvdW5kQ29sb3IuZ2V0SGV4KCk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmRpc3RhbmNlICE9PSB1bmRlZmluZWQgKSBkYXRhLm9iamVjdC5kaXN0YW5jZSA9IHRoaXMuZGlzdGFuY2U7XHJcblx0XHRpZiAoIHRoaXMuYW5nbGUgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LmFuZ2xlID0gdGhpcy5hbmdsZTtcclxuXHRcdGlmICggdGhpcy5kZWNheSAhPT0gdW5kZWZpbmVkICkgZGF0YS5vYmplY3QuZGVjYXkgPSB0aGlzLmRlY2F5O1xyXG5cdFx0aWYgKCB0aGlzLnBlbnVtYnJhICE9PSB1bmRlZmluZWQgKSBkYXRhLm9iamVjdC5wZW51bWJyYSA9IHRoaXMucGVudW1icmE7XHJcblxyXG5cdFx0aWYgKCB0aGlzLnNoYWRvdyAhPT0gdW5kZWZpbmVkICkgZGF0YS5vYmplY3Quc2hhZG93ID0gdGhpcy5zaGFkb3cudG9KU09OKCk7XHJcblx0XHRpZiAoIHRoaXMudGFyZ2V0ICE9PSB1bmRlZmluZWQgKSBkYXRhLm9iamVjdC50YXJnZXQgPSB0aGlzLnRhcmdldC51dWlkO1xyXG5cclxuXHRcdHJldHVybiBkYXRhO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBMaWdodCB9O1xyXG4iLCJpbXBvcnQgeyBMaWdodCB9IGZyb20gJy4vTGlnaHQuanMnO1xyXG5pbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uL21hdGgvQ29sb3IuanMnO1xyXG5pbXBvcnQgeyBPYmplY3QzRCB9IGZyb20gJy4uL2NvcmUvT2JqZWN0M0QuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgbGlnaHQgc291cmNlIHBvc2l0aW9uZWQgZGlyZWN0bHkgYWJvdmUgdGhlIHNjZW5lLCB3aXRoIGNvbG9yIGZhZGluZyBmcm9tXHJcbiAqIHRoZSBza3kgY29sb3IgdG8gdGhlIGdyb3VuZCBjb2xvci5cclxuICpcclxuICogVGhpcyBsaWdodCBjYW5ub3QgYmUgdXNlZCB0byBjYXN0IHNoYWRvd3MuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGxpZ2h0ID0gbmV3IFRIUkVFLkhlbWlzcGhlcmVMaWdodCggMHhmZmZmYmIsIDB4MDgwODIwLCAxICk7XHJcbiAqIHNjZW5lLmFkZCggbGlnaHQgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBMaWdodFxyXG4gKi9cclxuY2xhc3MgSGVtaXNwaGVyZUxpZ2h0IGV4dGVuZHMgTGlnaHQge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGhlbWlzcGhlcmUgbGlnaHQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geyhudW1iZXJ8Q29sb3J8c3RyaW5nKX0gW3NreUNvbG9yPTB4ZmZmZmZmXSAtIFRoZSBsaWdodCdzIHNreSBjb2xvci5cclxuXHQgKiBAcGFyYW0geyhudW1iZXJ8Q29sb3J8c3RyaW5nKX0gW2dyb3VuZENvbG9yPTB4ZmZmZmZmXSAtIFRoZSBsaWdodCdzIGdyb3VuZCBjb2xvci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2ludGVuc2l0eT0xXSAtIFRoZSBsaWdodCdzIHN0cmVuZ3RoL2ludGVuc2l0eS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggc2t5Q29sb3IsIGdyb3VuZENvbG9yLCBpbnRlbnNpdHkgKSB7XHJcblxyXG5cdFx0c3VwZXIoIHNreUNvbG9yLCBpbnRlbnNpdHkgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNIZW1pc3BoZXJlTGlnaHQgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdIZW1pc3BoZXJlTGlnaHQnO1xyXG5cclxuXHRcdHRoaXMucG9zaXRpb24uY29weSggT2JqZWN0M0QuREVGQVVMVF9VUCApO1xyXG5cdFx0dGhpcy51cGRhdGVNYXRyaXgoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBsaWdodCdzIGdyb3VuZCBjb2xvci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Q29sb3J9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ3JvdW5kQ29sb3IgPSBuZXcgQ29sb3IoIGdyb3VuZENvbG9yICk7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlLCByZWN1cnNpdmUgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlLCByZWN1cnNpdmUgKTtcclxuXHJcblx0XHR0aGlzLmdyb3VuZENvbG9yLmNvcHkoIHNvdXJjZS5ncm91bmRDb2xvciApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBIZW1pc3BoZXJlTGlnaHQgfTtcclxuIiwiaW1wb3J0IHsgTWF0cml4NCB9IGZyb20gJy4uL21hdGgvTWF0cml4NC5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjIuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yNCB9IGZyb20gJy4uL21hdGgvVmVjdG9yNC5qcyc7XHJcbmltcG9ydCB7IEZydXN0dW0gfSBmcm9tICcuLi9tYXRoL0ZydXN0dW0uanMnO1xyXG5cclxuY29uc3QgX3Byb2pTY3JlZW5NYXRyaXggPSAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXg0KCk7XHJcbmNvbnN0IF9saWdodFBvc2l0aW9uV29ybGQgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF9sb29rVGFyZ2V0ID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5cclxuLyoqXHJcbiAqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGxpZ2h0IHNoYWRvdyBjbGFzc2VzLiBUaGVzZSBjbGFzc2VzXHJcbiAqIHJlcHJlc2VudCB0aGUgc2hhZG93IGNvbmZpZ3VyYXRpb24gZm9yIGRpZmZlcmVudCBsaWdodCB0eXBlcy5cclxuICpcclxuICogQGFic3RyYWN0XHJcbiAqL1xyXG5jbGFzcyBMaWdodFNoYWRvdyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbGlnaHQgc2hhZG93LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtDYW1lcmF9IGNhbWVyYSAtIFRoZSBsaWdodCdzIHZpZXcgb2YgdGhlIHdvcmxkLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBjYW1lcmEgKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbGlnaHQncyB2aWV3IG9mIHRoZSB3b3JsZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Q2FtZXJhfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNhbWVyYSA9IGNhbWVyYTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBpbnRlbnNpdHkgb2YgdGhlIHNoYWRvdy4gVGhlIGRlZmF1bHQgaXMgYDFgLlxyXG5cdFx0ICogVmFsaWQgdmFsdWVzIGFyZSBpbiB0aGUgcmFuZ2UgYFswLCAxXWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pbnRlbnNpdHkgPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU2hhZG93IG1hcCBiaWFzLCBob3cgbXVjaCB0byBhZGQgb3Igc3VidHJhY3QgZnJvbSB0aGUgbm9ybWFsaXplZCBkZXB0aFxyXG5cdFx0ICogd2hlbiBkZWNpZGluZyB3aGV0aGVyIGEgc3VyZmFjZSBpcyBpbiBzaGFkb3cuXHJcblx0XHQgKlxyXG5cdFx0ICogVGhlIGRlZmF1bHQgaXMgYDBgLiBWZXJ5IHRpbnkgYWRqdXN0bWVudHMgaGVyZSAoaW4gdGhlIG9yZGVyIG9mIGAwLjAwMDFgKVxyXG5cdFx0ICogbWF5IGhlbHAgcmVkdWNlIGFydGlmYWN0cyBpbiBzaGFkb3dzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYmlhcyA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIGhvdyBtdWNoIHRoZSBwb3NpdGlvbiB1c2VkIHRvIHF1ZXJ5IHRoZSBzaGFkb3cgbWFwIGlzIG9mZnNldCBhbG9uZ1xyXG5cdFx0ICogdGhlIG9iamVjdCBub3JtYWwuIFRoZSBkZWZhdWx0IGlzIGAwYC4gSW5jcmVhc2luZyB0aGlzIHZhbHVlIGNhbiBiZSB1c2VkIHRvXHJcblx0XHQgKiByZWR1Y2Ugc2hhZG93IGFjbmUgZXNwZWNpYWxseSBpbiBsYXJnZSBzY2VuZXMgd2hlcmUgbGlnaHQgc2hpbmVzIG9udG9cclxuXHRcdCAqIGdlb21ldHJ5IGF0IGEgc2hhbGxvdyBhbmdsZS4gVGhlIGNvc3QgaXMgdGhhdCBzaGFkb3dzIG1heSBhcHBlYXIgZGlzdG9ydGVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9ybWFsQmlhcyA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTZXR0aW5nIHRoaXMgdG8gdmFsdWVzIGdyZWF0ZXIgdGhhbiAxIHdpbGwgYmx1ciB0aGUgZWRnZXMgb2YgdGhlIHNoYWRvdy5cclxuXHRcdCAqIEhpZ2ggdmFsdWVzIHdpbGwgY2F1c2UgdW53YW50ZWQgYmFuZGluZyBlZmZlY3RzIGluIHRoZSBzaGFkb3dzIC0gYSBncmVhdGVyXHJcblx0XHQgKiBtYXAgc2l6ZSB3aWxsIGFsbG93IGZvciBhIGhpZ2hlciB2YWx1ZSB0byBiZSB1c2VkIGhlcmUgYmVmb3JlIHRoZXNlIGVmZmVjdHNcclxuXHRcdCAqIGJlY29tZSB2aXNpYmxlLlxyXG5cdFx0ICpcclxuXHRcdCAqIFRoZSBwcm9wZXJ0eSBoYXMgbm8gZWZmZWN0IHdoZW4gdGhlIHNoYWRvdyBtYXAgdHlwZSBpcyBgUENGU29mdFNoYWRvd01hcGAgYW5kXHJcblx0XHQgKiBhbmQgaXQgaXMgcmVjb21tZW5kZWQgdG8gaW5jcmVhc2Ugc29mdG5lc3MgYnkgZGVjcmVhc2luZyB0aGUgc2hhZG93IG1hcCBzaXplIGluc3RlYWQuXHJcblx0XHQgKlxyXG5cdFx0ICogVGhlIHByb3BlcnR5IGhhcyBubyBlZmZlY3Qgd2hlbiB0aGUgc2hhZG93IG1hcCB0eXBlIGlzIGBCYXNpY1NoYWRvd01hcGAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yYWRpdXMgPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGFtb3VudCBvZiBzYW1wbGVzIHRvIHVzZSB3aGVuIGJsdXJyaW5nIGEgVlNNIHNoYWRvdyBtYXAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDhcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ibHVyU2FtcGxlcyA9IDg7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBzaGFkb3cgbWFwLiBIaWdoZXIgdmFsdWVzIGdpdmUgYmV0dGVyIHF1YWxpdHlcclxuXHRcdCAqIHNoYWRvd3MgYXQgdGhlIGNvc3Qgb2YgY29tcHV0YXRpb24gdGltZS4gVmFsdWVzIG11c3QgYmUgcG93ZXJzIG9mIHR3by5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yMn1cclxuXHRcdCAqIEBkZWZhdWx0ICg1MTIsNTEyKVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1hcFNpemUgPSBuZXcgVmVjdG9yMiggNTEyLCA1MTIgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBkZXB0aCBtYXAgZ2VuZXJhdGVkIHVzaW5nIHRoZSBpbnRlcm5hbCBjYW1lcmE7IGEgbG9jYXRpb24gYmV5b25kIGFcclxuXHRcdCAqIHBpeGVsJ3MgZGVwdGggaXMgaW4gc2hhZG93LiBDb21wdXRlZCBpbnRlcm5hbGx5IGR1cmluZyByZW5kZXJpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9SZW5kZXJUYXJnZXR9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBkaXN0cmlidXRpb24gbWFwIGdlbmVyYXRlZCB1c2luZyB0aGUgaW50ZXJuYWwgY2FtZXJhOyBhbiBvY2NsdXNpb24gaXNcclxuXHRcdCAqIGNhbGN1bGF0ZWQgYmFzZWQgb24gdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXB0aHMuIENvbXB1dGVkIGludGVybmFsbHkgZHVyaW5nXHJcblx0XHQgKiByZW5kZXJpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9SZW5kZXJUYXJnZXR9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWFwUGFzcyA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBNb2RlbCB0byBzaGFkb3cgY2FtZXJhIHNwYWNlLCB0byBjb21wdXRlIGxvY2F0aW9uIGFuZCBkZXB0aCBpbiBzaGFkb3cgbWFwLlxyXG5cdFx0ICogVGhpcyBpcyBjb21wdXRlZCBpbnRlcm5hbGx5IGR1cmluZyByZW5kZXJpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge01hdHJpeDR9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEVuYWJsZXMgYXV0b21hdGljIHVwZGF0ZXMgb2YgdGhlIGxpZ2h0J3Mgc2hhZG93LiBJZiB5b3UgZG8gbm90IHJlcXVpcmUgZHluYW1pY1xyXG5cdFx0ICogbGlnaHRpbmcgLyBzaGFkb3dzLCB5b3UgbWF5IHNldCB0aGlzIHRvIGBmYWxzZWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYXV0b1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGVuIHNldCB0byBgdHJ1ZWAsIHNoYWRvdyBtYXBzIHdpbGwgYmUgdXBkYXRlZCBpbiB0aGUgbmV4dCBgcmVuZGVyYCBjYWxsLlxyXG5cdFx0ICogSWYgeW91IGhhdmUgc2V0IHtAbGluayBMaWdodFNoYWRvdyNhdXRvVXBkYXRlfSB0byBgZmFsc2VgLCB5b3Ugd2lsbCBuZWVkIHRvXHJcblx0XHQgKiBzZXQgdGhpcyBwcm9wZXJ0eSB0byBgdHJ1ZWAgYW5kIHRoZW4gbWFrZSBhIHJlbmRlciBjYWxsIHRvIHVwZGF0ZSB0aGUgbGlnaHQncyBzaGFkb3cuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5lZWRzVXBkYXRlID0gZmFsc2U7XHJcblxyXG5cdFx0dGhpcy5fZnJ1c3R1bSA9IG5ldyBGcnVzdHVtKCk7XHJcblx0XHR0aGlzLl9mcmFtZUV4dGVudHMgPSBuZXcgVmVjdG9yMiggMSwgMSApO1xyXG5cclxuXHRcdHRoaXMuX3ZpZXdwb3J0Q291bnQgPSAxO1xyXG5cclxuXHRcdHRoaXMuX3ZpZXdwb3J0cyA9IFtcclxuXHJcblx0XHRcdG5ldyBWZWN0b3I0KCAwLCAwLCAxLCAxIClcclxuXHJcblx0XHRdO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVzZWQgaW50ZXJuYWxseSBieSB0aGUgcmVuZGVyZXIgdG8gZ2V0IHRoZSBudW1iZXIgb2Ygdmlld3BvcnRzIHRoYXQgbmVlZFxyXG5cdCAqIHRvIGJlIHJlbmRlcmVkIGZvciB0aGlzIHNoYWRvdy5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIHZpZXdwb3J0IGNvdW50LlxyXG5cdCAqL1xyXG5cdGdldFZpZXdwb3J0Q291bnQoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX3ZpZXdwb3J0Q291bnQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2V0cyB0aGUgc2hhZG93IGNhbWVyYXMgZnJ1c3R1bS4gVXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSByZW5kZXJlciB0byBjdWxsIG9iamVjdHMuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtGcnVzdHVtfSBUaGUgc2hhZG93IGNhbWVyYSBmcnVzdHVtLlxyXG5cdCAqL1xyXG5cdGdldEZydXN0dW0oKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX2ZydXN0dW07XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlIHRoZSBtYXRyaWNlcyBmb3IgdGhlIGNhbWVyYSBhbmQgc2hhZG93LCB1c2VkIGludGVybmFsbHkgYnkgdGhlIHJlbmRlcmVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtMaWdodH0gbGlnaHQgLSBUaGUgbGlnaHQgZm9yIHdoaWNoIHRoZSBzaGFkb3cgaXMgYmVpbmcgcmVuZGVyZWQuXHJcblx0ICovXHJcblx0dXBkYXRlTWF0cmljZXMoIGxpZ2h0ICkge1xyXG5cclxuXHRcdGNvbnN0IHNoYWRvd0NhbWVyYSA9IHRoaXMuY2FtZXJhO1xyXG5cdFx0Y29uc3Qgc2hhZG93TWF0cml4ID0gdGhpcy5tYXRyaXg7XHJcblxyXG5cdFx0X2xpZ2h0UG9zaXRpb25Xb3JsZC5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7XHJcblx0XHRzaGFkb3dDYW1lcmEucG9zaXRpb24uY29weSggX2xpZ2h0UG9zaXRpb25Xb3JsZCApO1xyXG5cclxuXHRcdF9sb29rVGFyZ2V0LnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQudGFyZ2V0Lm1hdHJpeFdvcmxkICk7XHJcblx0XHRzaGFkb3dDYW1lcmEubG9va0F0KCBfbG9va1RhcmdldCApO1xyXG5cdFx0c2hhZG93Q2FtZXJhLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XHJcblxyXG5cdFx0X3Byb2pTY3JlZW5NYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggc2hhZG93Q2FtZXJhLnByb2plY3Rpb25NYXRyaXgsIHNoYWRvd0NhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UgKTtcclxuXHRcdHRoaXMuX2ZydXN0dW0uc2V0RnJvbVByb2plY3Rpb25NYXRyaXgoIF9wcm9qU2NyZWVuTWF0cml4ICk7XHJcblxyXG5cdFx0c2hhZG93TWF0cml4LnNldChcclxuXHRcdFx0MC41LCAwLjAsIDAuMCwgMC41LFxyXG5cdFx0XHQwLjAsIDAuNSwgMC4wLCAwLjUsXHJcblx0XHRcdDAuMCwgMC4wLCAwLjUsIDAuNSxcclxuXHRcdFx0MC4wLCAwLjAsIDAuMCwgMS4wXHJcblx0XHQpO1xyXG5cclxuXHRcdHNoYWRvd01hdHJpeC5tdWx0aXBseSggX3Byb2pTY3JlZW5NYXRyaXggKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgdmlld3BvcnQgZGVmaW5pdGlvbiBmb3IgdGhlIGdpdmVuIHZpZXdwb3J0IGluZGV4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHZpZXdwb3J0SW5kZXggLSBUaGUgdmlld3BvcnQgaW5kZXguXHJcblx0ICogQHJldHVybiB7VmVjdG9yNH0gVGhlIHZpZXdwb3J0LlxyXG5cdCAqL1xyXG5cdGdldFZpZXdwb3J0KCB2aWV3cG9ydEluZGV4ICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl92aWV3cG9ydHNbIHZpZXdwb3J0SW5kZXggXTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBmcmFtZSBleHRlbmRzLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gVGhlIGZyYW1lIGV4dGVuZHMuXHJcblx0ICovXHJcblx0Z2V0RnJhbWVFeHRlbnRzKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9mcmFtZUV4dGVudHM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRnJlZXMgdGhlIEdQVS1yZWxhdGVkIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhpcyBpbnN0YW5jZS4gQ2FsbCB0aGlzXHJcblx0ICogbWV0aG9kIHdoZW5ldmVyIHRoaXMgaW5zdGFuY2UgaXMgbm8gbG9uZ2VyIHVzZWQgaW4geW91ciBhcHAuXHJcblx0ICovXHJcblx0ZGlzcG9zZSgpIHtcclxuXHJcblx0XHRpZiAoIHRoaXMubWFwICkge1xyXG5cclxuXHRcdFx0dGhpcy5tYXAuZGlzcG9zZSgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMubWFwUGFzcyApIHtcclxuXHJcblx0XHRcdHRoaXMubWFwUGFzcy5kaXNwb3NlKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvcGllcyB0aGUgdmFsdWVzIG9mIHRoZSBnaXZlbiBsaWdodCBzaGFkb3cgaW5zdGFuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TGlnaHRTaGFkb3d9IHNvdXJjZSAtIFRoZSBsaWdodCBzaGFkb3cgdG8gY29weS5cclxuXHQgKiBAcmV0dXJuIHtMaWdodFNoYWRvd30gQSByZWZlcmVuY2UgdG8gdGhpcyBsaWdodCBzaGFkb3cgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHRoaXMuY2FtZXJhID0gc291cmNlLmNhbWVyYS5jbG9uZSgpO1xyXG5cclxuXHRcdHRoaXMuaW50ZW5zaXR5ID0gc291cmNlLmludGVuc2l0eTtcclxuXHJcblx0XHR0aGlzLmJpYXMgPSBzb3VyY2UuYmlhcztcclxuXHRcdHRoaXMucmFkaXVzID0gc291cmNlLnJhZGl1cztcclxuXHJcblx0XHR0aGlzLm1hcFNpemUuY29weSggc291cmNlLm1hcFNpemUgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbmV3IGxpZ2h0IHNoYWRvdyBpbnN0YW5jZSB3aXRoIGNvcGllZCB2YWx1ZXMgZnJvbSB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7TGlnaHRTaGFkb3d9IEEgY2xvbmUgb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjbG9uZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2VyaWFsaXplcyB0aGUgbGlnaHQgc2hhZG93IGludG8gSlNPTi5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge09iamVjdH0gQSBKU09OIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNlcmlhbGl6ZWQgbGlnaHQgc2hhZG93LlxyXG5cdCAqIEBzZWUge0BsaW5rIE9iamVjdExvYWRlciNwYXJzZX1cclxuXHQgKi9cclxuXHR0b0pTT04oKSB7XHJcblxyXG5cdFx0Y29uc3Qgb2JqZWN0ID0ge307XHJcblxyXG5cdFx0aWYgKCB0aGlzLmludGVuc2l0eSAhPT0gMSApIG9iamVjdC5pbnRlbnNpdHkgPSB0aGlzLmludGVuc2l0eTtcclxuXHRcdGlmICggdGhpcy5iaWFzICE9PSAwICkgb2JqZWN0LmJpYXMgPSB0aGlzLmJpYXM7XHJcblx0XHRpZiAoIHRoaXMubm9ybWFsQmlhcyAhPT0gMCApIG9iamVjdC5ub3JtYWxCaWFzID0gdGhpcy5ub3JtYWxCaWFzO1xyXG5cdFx0aWYgKCB0aGlzLnJhZGl1cyAhPT0gMSApIG9iamVjdC5yYWRpdXMgPSB0aGlzLnJhZGl1cztcclxuXHRcdGlmICggdGhpcy5tYXBTaXplLnggIT09IDUxMiB8fCB0aGlzLm1hcFNpemUueSAhPT0gNTEyICkgb2JqZWN0Lm1hcFNpemUgPSB0aGlzLm1hcFNpemUudG9BcnJheSgpO1xyXG5cclxuXHRcdG9iamVjdC5jYW1lcmEgPSB0aGlzLmNhbWVyYS50b0pTT04oIGZhbHNlICkub2JqZWN0O1xyXG5cdFx0ZGVsZXRlIG9iamVjdC5jYW1lcmEubWF0cml4O1xyXG5cclxuXHRcdHJldHVybiBvYmplY3Q7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IExpZ2h0U2hhZG93IH07XHJcbiIsImltcG9ydCB7IExpZ2h0U2hhZG93IH0gZnJvbSAnLi9MaWdodFNoYWRvdy5qcyc7XHJcbmltcG9ydCB7IFJBRDJERUcgfSBmcm9tICcuLi9tYXRoL01hdGhVdGlscy5qcyc7XHJcbmltcG9ydCB7IFBlcnNwZWN0aXZlQ2FtZXJhIH0gZnJvbSAnLi4vY2FtZXJhcy9QZXJzcGVjdGl2ZUNhbWVyYS5qcyc7XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyB0aGUgc2hhZG93IGNvbmZpZ3VyYXRpb24gb2YgZGlyZWN0aW9uYWwgbGlnaHRzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTGlnaHRTaGFkb3dcclxuICovXHJcbmNsYXNzIFNwb3RMaWdodFNoYWRvdyBleHRlbmRzIExpZ2h0U2hhZG93IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBzcG90IGxpZ2h0IHNoYWRvdy5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHJcblx0XHRzdXBlciggbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCA1MCwgMSwgMC41LCA1MDAgKSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1Nwb3RMaWdodFNoYWRvdyA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBVc2VkIHRvIGZvY3VzIHRoZSBzaGFkb3cgY2FtZXJhLiBUaGUgY2FtZXJhJ3MgZmllbGQgb2YgdmlldyBpcyBzZXQgYXMgYVxyXG5cdFx0ICogcGVyY2VudGFnZSBvZiB0aGUgc3BvdGxpZ2h0J3MgZmllbGQtb2Ytdmlldy4gUmFuZ2UgaXMgYFswLCAxXWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5mb2N1cyA9IDE7XHJcblxyXG5cdH1cclxuXHJcblx0dXBkYXRlTWF0cmljZXMoIGxpZ2h0ICkge1xyXG5cclxuXHRcdGNvbnN0IGNhbWVyYSA9IHRoaXMuY2FtZXJhO1xyXG5cclxuXHRcdGNvbnN0IGZvdiA9IFJBRDJERUcgKiAyICogbGlnaHQuYW5nbGUgKiB0aGlzLmZvY3VzO1xyXG5cdFx0Y29uc3QgYXNwZWN0ID0gdGhpcy5tYXBTaXplLndpZHRoIC8gdGhpcy5tYXBTaXplLmhlaWdodDtcclxuXHRcdGNvbnN0IGZhciA9IGxpZ2h0LmRpc3RhbmNlIHx8IGNhbWVyYS5mYXI7XHJcblxyXG5cdFx0aWYgKCBmb3YgIT09IGNhbWVyYS5mb3YgfHwgYXNwZWN0ICE9PSBjYW1lcmEuYXNwZWN0IHx8IGZhciAhPT0gY2FtZXJhLmZhciApIHtcclxuXHJcblx0XHRcdGNhbWVyYS5mb3YgPSBmb3Y7XHJcblx0XHRcdGNhbWVyYS5hc3BlY3QgPSBhc3BlY3Q7XHJcblx0XHRcdGNhbWVyYS5mYXIgPSBmYXI7XHJcblx0XHRcdGNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHN1cGVyLnVwZGF0ZU1hdHJpY2VzKCBsaWdodCApO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLmZvY3VzID0gc291cmNlLmZvY3VzO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBTcG90TGlnaHRTaGFkb3cgfTtcclxuIiwiaW1wb3J0IHsgTGlnaHQgfSBmcm9tICcuL0xpZ2h0LmpzJztcclxuaW1wb3J0IHsgU3BvdExpZ2h0U2hhZG93IH0gZnJvbSAnLi9TcG90TGlnaHRTaGFkb3cuanMnO1xyXG5pbXBvcnQgeyBPYmplY3QzRCB9IGZyb20gJy4uL2NvcmUvT2JqZWN0M0QuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgbGlnaHQgZ2V0cyBlbWl0dGVkIGZyb20gYSBzaW5nbGUgcG9pbnQgaW4gb25lIGRpcmVjdGlvbiwgYWxvbmcgYSBjb25lXHJcbiAqIHRoYXQgaW5jcmVhc2VzIGluIHNpemUgdGhlIGZ1cnRoZXIgZnJvbSB0aGUgbGlnaHQgaXQgZ2V0cy5cclxuICpcclxuICogVGhpcyBsaWdodCBjYW4gY2FzdCBzaGFkb3dzIC0gc2VlIHRoZSB7QGxpbmsgU3BvdExpZ2h0U2hhZG93fSBmb3IgZGV0YWlscy5cclxuICpcclxuICogYGBganNcclxuICogLy8gd2hpdGUgc3BvdGxpZ2h0IHNoaW5pbmcgZnJvbSB0aGUgc2lkZSwgbW9kdWxhdGVkIGJ5IGEgdGV4dHVyZVxyXG4gKiBjb25zdCBzcG90TGlnaHQgPSBuZXcgVEhSRUUuU3BvdExpZ2h0KCAweGZmZmZmZiApO1xyXG4gKiBzcG90TGlnaHQucG9zaXRpb24uc2V0KCAxMDAsIDEwMDAsIDEwMCApO1xyXG4gKiBzcG90TGlnaHQubWFwID0gbmV3IFRIUkVFLlRleHR1cmVMb2FkZXIoKS5sb2FkKCB1cmwgKTtcclxuICpcclxuICogc3BvdExpZ2h0LmNhc3RTaGFkb3cgPSB0cnVlO1xyXG4gKiBzcG90TGlnaHQuc2hhZG93Lm1hcFNpemUud2lkdGggPSAxMDI0O1xyXG4gKiBzcG90TGlnaHQuc2hhZG93Lm1hcFNpemUuaGVpZ2h0ID0gMTAyNDtcclxuICogc3BvdExpZ2h0LnNoYWRvdy5jYW1lcmEubmVhciA9IDUwMDtcclxuICogc3BvdExpZ2h0LnNoYWRvdy5jYW1lcmEuZmFyID0gNDAwMDtcclxuICogc3BvdExpZ2h0LnNoYWRvdy5jYW1lcmEuZm92ID0gMzA7c1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIExpZ2h0XHJcbiAqL1xyXG5jbGFzcyBTcG90TGlnaHQgZXh0ZW5kcyBMaWdodCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc3BvdCBsaWdodC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7KG51bWJlcnxDb2xvcnxzdHJpbmcpfSBbY29sb3I9MHhmZmZmZmZdIC0gVGhlIGxpZ2h0J3MgY29sb3IuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtpbnRlbnNpdHk9MV0gLSBUaGUgbGlnaHQncyBzdHJlbmd0aC9pbnRlbnNpdHkgbWVhc3VyZWQgaW4gY2FuZGVsYSAoY2QpLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZGlzdGFuY2U9MF0gLSBNYXhpbXVtIHJhbmdlIG9mIHRoZSBsaWdodC4gYDBgIG1lYW5zIG5vIGxpbWl0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbYW5nbGU9TWF0aC5QSS8zXSAtIE1heGltdW0gYW5nbGUgb2YgbGlnaHQgZGlzcGVyc2lvbiBmcm9tIGl0cyBkaXJlY3Rpb24gd2hvc2UgdXBwZXIgYm91bmQgaXMgYE1hdGguUEkvMmAuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtwZW51bWJyYT0wXSAtIFBlcmNlbnQgb2YgdGhlIHNwb3RsaWdodCBjb25lIHRoYXQgaXMgYXR0ZW51YXRlZCBkdWUgdG8gcGVudW1icmEuIFZhbHVlIHJhbmdlIGlzIGBbMCwxXWAuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtkZWNheT0yXSAtIFRoZSBhbW91bnQgdGhlIGxpZ2h0IGRpbXMgYWxvbmcgdGhlIGRpc3RhbmNlIG9mIHRoZSBsaWdodC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggY29sb3IsIGludGVuc2l0eSwgZGlzdGFuY2UgPSAwLCBhbmdsZSA9IE1hdGguUEkgLyAzLCBwZW51bWJyYSA9IDAsIGRlY2F5ID0gMiApIHtcclxuXHJcblx0XHRzdXBlciggY29sb3IsIGludGVuc2l0eSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1Nwb3RMaWdodCA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ1Nwb3RMaWdodCc7XHJcblxyXG5cdFx0dGhpcy5wb3NpdGlvbi5jb3B5KCBPYmplY3QzRC5ERUZBVUxUX1VQICk7XHJcblx0XHR0aGlzLnVwZGF0ZU1hdHJpeCgpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHNwb3QgbGlnaHQgcG9pbnRzIGZyb20gaXRzIHBvc2l0aW9uIHRvIHRoZVxyXG5cdFx0ICogdGFyZ2V0J3MgcG9zaXRpb24uXHJcblx0XHQgKlxyXG5cdFx0ICogRm9yIHRoZSB0YXJnZXQncyBwb3NpdGlvbiB0byBiZSBjaGFuZ2VkIHRvIGFueXRoaW5nIG90aGVyXHJcblx0XHQgKiB0aGFuIHRoZSBkZWZhdWx0LCBpdCBtdXN0IGJlIGFkZGVkIHRvIHRoZSBzY2VuZS5cclxuXHRcdCAqXHJcblx0XHQgKiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHNldCB0aGUgdGFyZ2V0IHRvIGJlIGFub3RoZXIgM0Qgb2JqZWN0XHJcblx0XHQgKiBpbiB0aGUgc2NlbmUuIFRoZSBsaWdodCB3aWxsIG5vdyB0cmFjayB0aGUgdGFyZ2V0IG9iamVjdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0M0R9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudGFyZ2V0ID0gbmV3IE9iamVjdDNEKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBNYXhpbXVtIHJhbmdlIG9mIHRoZSBsaWdodC4gYDBgIG1lYW5zIG5vIGxpbWl0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGlzdGFuY2UgPSBkaXN0YW5jZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIE1heGltdW0gYW5nbGUgb2YgbGlnaHQgZGlzcGVyc2lvbiBmcm9tIGl0cyBkaXJlY3Rpb24gd2hvc2UgdXBwZXIgYm91bmQgaXMgYE1hdGguUEkvMmAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IE1hdGguUEkvM1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFuZ2xlID0gYW5nbGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBQZXJjZW50IG9mIHRoZSBzcG90bGlnaHQgY29uZSB0aGF0IGlzIGF0dGVudWF0ZWQgZHVlIHRvIHBlbnVtYnJhLlxyXG5cdFx0ICogVmFsdWUgcmFuZ2UgaXMgYFswLDFdYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBlbnVtYnJhID0gcGVudW1icmE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYW1vdW50IHRoZSBsaWdodCBkaW1zIGFsb25nIHRoZSBkaXN0YW5jZSBvZiB0aGUgbGlnaHQuIEluIGNvbnRleHQgb2ZcclxuXHRcdCAqIHBoeXNpY2FsbHktY29ycmVjdCByZW5kZXJpbmcgdGhlIGRlZmF1bHQgdmFsdWUgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAyXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGVjYXkgPSBkZWNheTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgdGV4dHVyZSB1c2VkIHRvIG1vZHVsYXRlIHRoZSBjb2xvciBvZiB0aGUgbGlnaHQuIFRoZSBzcG90IGxpZ2h0XHJcblx0XHQgKiBjb2xvciBpcyBtaXhlZCB3aXRoIHRoZSBSR0IgdmFsdWUgb2YgdGhpcyB0ZXh0dXJlLCB3aXRoIGEgcmF0aW9cclxuXHRcdCAqIGNvcnJlc3BvbmRpbmcgdG8gaXRzIGFscGhhIHZhbHVlLiBUaGUgY29va2llLWxpa2UgbWFza2luZyBlZmZlY3QgaXNcclxuXHRcdCAqIHJlcHJvZHVjZWQgdXNpbmcgcGl4ZWwgdmFsdWVzICgwLCAwLCAwLCAxLWNvb2tpZV92YWx1ZSkuXHJcblx0XHQgKlxyXG5cdFx0ICogKldhcm5pbmcqOiBUaGlzIHByb3BlcnR5IGlzIGRpc2FibGVkIGlmIHtAbGluayBPYmplY3QzRCNjYXN0U2hhZG93fSBpcyBzZXQgdG8gYGZhbHNlYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgcHJvcGVydHkgaG9sZHMgdGhlIGxpZ2h0J3Mgc2hhZG93IGNvbmZpZ3VyYXRpb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1Nwb3RMaWdodFNoYWRvd31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zaGFkb3cgPSBuZXcgU3BvdExpZ2h0U2hhZG93KCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGxpZ2h0J3MgcG93ZXIuIFBvd2VyIGlzIHRoZSBsdW1pbm91cyBwb3dlciBvZiB0aGUgbGlnaHQgbWVhc3VyZWQgaW4gbHVtZW5zIChsbSkuXHJcblx0ICogIENoYW5naW5nIHRoZSBwb3dlciB3aWxsIGFsc28gY2hhbmdlIHRoZSBsaWdodCdzIGludGVuc2l0eS5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0ICovXHJcblx0Z2V0IHBvd2VyKCkge1xyXG5cclxuXHRcdC8vIGNvbXB1dGUgdGhlIGxpZ2h0J3MgbHVtaW5vdXMgcG93ZXIgKGluIGx1bWVucykgZnJvbSBpdHMgaW50ZW5zaXR5IChpbiBjYW5kZWxhKVxyXG5cdFx0Ly8gYnkgY29udmVudGlvbiBmb3IgYSBzcG90bGlnaHQsIGx1bWlub3VzIHBvd2VyIChsbSkgPSDPgCAqIGx1bWlub3VzIGludGVuc2l0eSAoY2QpXHJcblx0XHRyZXR1cm4gdGhpcy5pbnRlbnNpdHkgKiBNYXRoLlBJO1xyXG5cclxuXHR9XHJcblxyXG5cdHNldCBwb3dlciggcG93ZXIgKSB7XHJcblxyXG5cdFx0Ly8gc2V0IHRoZSBsaWdodCdzIGludGVuc2l0eSAoaW4gY2FuZGVsYSkgZnJvbSB0aGUgZGVzaXJlZCBsdW1pbm91cyBwb3dlciAoaW4gbHVtZW5zKVxyXG5cdFx0dGhpcy5pbnRlbnNpdHkgPSBwb3dlciAvIE1hdGguUEk7XHJcblxyXG5cdH1cclxuXHJcblx0ZGlzcG9zZSgpIHtcclxuXHJcblx0XHR0aGlzLnNoYWRvdy5kaXNwb3NlKCk7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlLCByZWN1cnNpdmUgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlLCByZWN1cnNpdmUgKTtcclxuXHJcblx0XHR0aGlzLmRpc3RhbmNlID0gc291cmNlLmRpc3RhbmNlO1xyXG5cdFx0dGhpcy5hbmdsZSA9IHNvdXJjZS5hbmdsZTtcclxuXHRcdHRoaXMucGVudW1icmEgPSBzb3VyY2UucGVudW1icmE7XHJcblx0XHR0aGlzLmRlY2F5ID0gc291cmNlLmRlY2F5O1xyXG5cclxuXHRcdHRoaXMudGFyZ2V0ID0gc291cmNlLnRhcmdldC5jbG9uZSgpO1xyXG5cclxuXHRcdHRoaXMuc2hhZG93ID0gc291cmNlLnNoYWRvdy5jbG9uZSgpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBTcG90TGlnaHQgfTtcclxuIiwiaW1wb3J0IHsgTGlnaHRTaGFkb3cgfSBmcm9tICcuL0xpZ2h0U2hhZG93LmpzJztcclxuaW1wb3J0IHsgUGVyc3BlY3RpdmVDYW1lcmEgfSBmcm9tICcuLi9jYW1lcmFzL1BlcnNwZWN0aXZlQ2FtZXJhLmpzJztcclxuaW1wb3J0IHsgTWF0cml4NCB9IGZyb20gJy4uL21hdGgvTWF0cml4NC5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjIuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yNCB9IGZyb20gJy4uL21hdGgvVmVjdG9yNC5qcyc7XHJcblxyXG5jb25zdCBfcHJvalNjcmVlbk1hdHJpeCA9IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDQoKTtcclxuY29uc3QgX2xpZ2h0UG9zaXRpb25Xb3JsZCA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX2xvb2tUYXJnZXQgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyB0aGUgc2hhZG93IGNvbmZpZ3VyYXRpb24gb2YgcG9pbnQgbGlnaHRzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTGlnaHRTaGFkb3dcclxuICovXHJcbmNsYXNzIFBvaW50TGlnaHRTaGFkb3cgZXh0ZW5kcyBMaWdodFNoYWRvdyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcG9pbnQgbGlnaHQgc2hhZG93LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cclxuXHRcdHN1cGVyKCBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIDkwLCAxLCAwLjUsIDUwMCApICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzUG9pbnRMaWdodFNoYWRvdyA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy5fZnJhbWVFeHRlbnRzID0gbmV3IFZlY3RvcjIoIDQsIDIgKTtcclxuXHJcblx0XHR0aGlzLl92aWV3cG9ydENvdW50ID0gNjtcclxuXHJcblx0XHR0aGlzLl92aWV3cG9ydHMgPSBbXHJcblx0XHRcdC8vIFRoZXNlIHZpZXdwb3J0cyBtYXAgYSBjdWJlLW1hcCBvbnRvIGEgMkQgdGV4dHVyZSB3aXRoIHRoZVxyXG5cdFx0XHQvLyBmb2xsb3dpbmcgb3JpZW50YXRpb246XHJcblx0XHRcdC8vXHJcblx0XHRcdC8vICB4elhaXHJcblx0XHRcdC8vICAgeSBZXHJcblx0XHRcdC8vXHJcblx0XHRcdC8vIFggLSBQb3NpdGl2ZSB4IGRpcmVjdGlvblxyXG5cdFx0XHQvLyB4IC0gTmVnYXRpdmUgeCBkaXJlY3Rpb25cclxuXHRcdFx0Ly8gWSAtIFBvc2l0aXZlIHkgZGlyZWN0aW9uXHJcblx0XHRcdC8vIHkgLSBOZWdhdGl2ZSB5IGRpcmVjdGlvblxyXG5cdFx0XHQvLyBaIC0gUG9zaXRpdmUgeiBkaXJlY3Rpb25cclxuXHRcdFx0Ly8geiAtIE5lZ2F0aXZlIHogZGlyZWN0aW9uXHJcblxyXG5cdFx0XHQvLyBwb3NpdGl2ZSBYXHJcblx0XHRcdG5ldyBWZWN0b3I0KCAyLCAxLCAxLCAxICksXHJcblx0XHRcdC8vIG5lZ2F0aXZlIFhcclxuXHRcdFx0bmV3IFZlY3RvcjQoIDAsIDEsIDEsIDEgKSxcclxuXHRcdFx0Ly8gcG9zaXRpdmUgWlxyXG5cdFx0XHRuZXcgVmVjdG9yNCggMywgMSwgMSwgMSApLFxyXG5cdFx0XHQvLyBuZWdhdGl2ZSBaXHJcblx0XHRcdG5ldyBWZWN0b3I0KCAxLCAxLCAxLCAxICksXHJcblx0XHRcdC8vIHBvc2l0aXZlIFlcclxuXHRcdFx0bmV3IFZlY3RvcjQoIDMsIDAsIDEsIDEgKSxcclxuXHRcdFx0Ly8gbmVnYXRpdmUgWVxyXG5cdFx0XHRuZXcgVmVjdG9yNCggMSwgMCwgMSwgMSApXHJcblx0XHRdO1xyXG5cclxuXHRcdHRoaXMuX2N1YmVEaXJlY3Rpb25zID0gW1xyXG5cdFx0XHRuZXcgVmVjdG9yMyggMSwgMCwgMCApLCBuZXcgVmVjdG9yMyggLSAxLCAwLCAwICksIG5ldyBWZWN0b3IzKCAwLCAwLCAxICksXHJcblx0XHRcdG5ldyBWZWN0b3IzKCAwLCAwLCAtIDEgKSwgbmV3IFZlY3RvcjMoIDAsIDEsIDAgKSwgbmV3IFZlY3RvcjMoIDAsIC0gMSwgMCApXHJcblx0XHRdO1xyXG5cclxuXHRcdHRoaXMuX2N1YmVVcHMgPSBbXHJcblx0XHRcdG5ldyBWZWN0b3IzKCAwLCAxLCAwICksIG5ldyBWZWN0b3IzKCAwLCAxLCAwICksIG5ldyBWZWN0b3IzKCAwLCAxLCAwICksXHJcblx0XHRcdG5ldyBWZWN0b3IzKCAwLCAxLCAwICksIG5ldyBWZWN0b3IzKCAwLCAwLCAxICksXHRuZXcgVmVjdG9yMyggMCwgMCwgLSAxIClcclxuXHRcdF07XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlIHRoZSBtYXRyaWNlcyBmb3IgdGhlIGNhbWVyYSBhbmQgc2hhZG93LCB1c2VkIGludGVybmFsbHkgYnkgdGhlIHJlbmRlcmVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtMaWdodH0gbGlnaHQgLSBUaGUgbGlnaHQgZm9yIHdoaWNoIHRoZSBzaGFkb3cgaXMgYmVpbmcgcmVuZGVyZWQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt2aWV3cG9ydEluZGV4PTBdIC0gVGhlIHZpZXdwb3J0IGluZGV4LlxyXG5cdCAqL1xyXG5cdHVwZGF0ZU1hdHJpY2VzKCBsaWdodCwgdmlld3BvcnRJbmRleCA9IDAgKSB7XHJcblxyXG5cdFx0Y29uc3QgY2FtZXJhID0gdGhpcy5jYW1lcmE7XHJcblx0XHRjb25zdCBzaGFkb3dNYXRyaXggPSB0aGlzLm1hdHJpeDtcclxuXHJcblx0XHRjb25zdCBmYXIgPSBsaWdodC5kaXN0YW5jZSB8fCBjYW1lcmEuZmFyO1xyXG5cclxuXHRcdGlmICggZmFyICE9PSBjYW1lcmEuZmFyICkge1xyXG5cclxuXHRcdFx0Y2FtZXJhLmZhciA9IGZhcjtcclxuXHRcdFx0Y2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0X2xpZ2h0UG9zaXRpb25Xb3JsZC5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7XHJcblx0XHRjYW1lcmEucG9zaXRpb24uY29weSggX2xpZ2h0UG9zaXRpb25Xb3JsZCApO1xyXG5cclxuXHRcdF9sb29rVGFyZ2V0LmNvcHkoIGNhbWVyYS5wb3NpdGlvbiApO1xyXG5cdFx0X2xvb2tUYXJnZXQuYWRkKCB0aGlzLl9jdWJlRGlyZWN0aW9uc1sgdmlld3BvcnRJbmRleCBdICk7XHJcblx0XHRjYW1lcmEudXAuY29weSggdGhpcy5fY3ViZVVwc1sgdmlld3BvcnRJbmRleCBdICk7XHJcblx0XHRjYW1lcmEubG9va0F0KCBfbG9va1RhcmdldCApO1xyXG5cdFx0Y2FtZXJhLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XHJcblxyXG5cdFx0c2hhZG93TWF0cml4Lm1ha2VUcmFuc2xhdGlvbiggLSBfbGlnaHRQb3NpdGlvbldvcmxkLngsIC0gX2xpZ2h0UG9zaXRpb25Xb3JsZC55LCAtIF9saWdodFBvc2l0aW9uV29ybGQueiApO1xyXG5cclxuXHRcdF9wcm9qU2NyZWVuTWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlICk7XHJcblx0XHR0aGlzLl9mcnVzdHVtLnNldEZyb21Qcm9qZWN0aW9uTWF0cml4KCBfcHJvalNjcmVlbk1hdHJpeCApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBQb2ludExpZ2h0U2hhZG93IH07XHJcbiIsImltcG9ydCB7IExpZ2h0IH0gZnJvbSAnLi9MaWdodC5qcyc7XHJcbmltcG9ydCB7IFBvaW50TGlnaHRTaGFkb3cgfSBmcm9tICcuL1BvaW50TGlnaHRTaGFkb3cuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgbGlnaHQgdGhhdCBnZXRzIGVtaXR0ZWQgZnJvbSBhIHNpbmdsZSBwb2ludCBpbiBhbGwgZGlyZWN0aW9ucy4gQSBjb21tb25cclxuICogdXNlIGNhc2UgZm9yIHRoaXMgaXMgdG8gcmVwbGljYXRlIHRoZSBsaWdodCBlbWl0dGVkIGZyb20gYSBiYXJlXHJcbiAqIGxpZ2h0YnVsYi5cclxuICpcclxuICogVGhpcyBsaWdodCBjYW4gY2FzdCBzaGFkb3dzIC0gc2VlIHRoZSB7QGxpbmsgUG9pbnRMaWdodFNoYWRvd30gZm9yIGRldGFpbHMuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGxpZ2h0ID0gbmV3IFRIUkVFLlBvaW50TGlnaHQoIDB4ZmYwMDAwLCAxLCAxMDAgKTtcclxuICogbGlnaHQucG9zaXRpb24uc2V0KCA1MCwgNTAsIDUwICk7XHJcbiAqIHNjZW5lLmFkZCggbGlnaHQgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBMaWdodFxyXG4gKi9cclxuY2xhc3MgUG9pbnRMaWdodCBleHRlbmRzIExpZ2h0IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBwb2ludCBsaWdodC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7KG51bWJlcnxDb2xvcnxzdHJpbmcpfSBbY29sb3I9MHhmZmZmZmZdIC0gVGhlIGxpZ2h0J3MgY29sb3IuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtpbnRlbnNpdHk9MV0gLSBUaGUgbGlnaHQncyBzdHJlbmd0aC9pbnRlbnNpdHkgbWVhc3VyZWQgaW4gY2FuZGVsYSAoY2QpLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZGlzdGFuY2U9MF0gLSBNYXhpbXVtIHJhbmdlIG9mIHRoZSBsaWdodC4gYDBgIG1lYW5zIG5vIGxpbWl0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZGVjYXk9Ml0gLSBUaGUgYW1vdW50IHRoZSBsaWdodCBkaW1zIGFsb25nIHRoZSBkaXN0YW5jZSBvZiB0aGUgbGlnaHQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGNvbG9yLCBpbnRlbnNpdHksIGRpc3RhbmNlID0gMCwgZGVjYXkgPSAyICkge1xyXG5cclxuXHRcdHN1cGVyKCBjb2xvciwgaW50ZW5zaXR5ICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzUG9pbnRMaWdodCA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ1BvaW50TGlnaHQnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hlbiBkaXN0YW5jZSBpcyB6ZXJvLCBsaWdodCB3aWxsIGF0dGVudWF0ZSBhY2NvcmRpbmcgdG8gaW52ZXJzZS1zcXVhcmVcclxuXHRcdCAqIGxhdyB0byBpbmZpbml0ZSBkaXN0YW5jZS4gV2hlbiBkaXN0YW5jZSBpcyBub24temVybywgbGlnaHQgd2lsbCBhdHRlbnVhdGVcclxuXHRcdCAqIGFjY29yZGluZyB0byBpbnZlcnNlLXNxdWFyZSBsYXcgdW50aWwgbmVhciB0aGUgZGlzdGFuY2UgY3V0b2ZmLCB3aGVyZSBpdFxyXG5cdFx0ICogd2lsbCB0aGVuIGF0dGVudWF0ZSBxdWlja2x5IGFuZCBzbW9vdGhseSB0byAwLiBJbmhlcmVudGx5LCBjdXRvZmZzIGFyZSBub3RcclxuXHRcdCAqIHBoeXNpY2FsbHkgY29ycmVjdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRpc3RhbmNlID0gZGlzdGFuY2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYW1vdW50IHRoZSBsaWdodCBkaW1zIGFsb25nIHRoZSBkaXN0YW5jZSBvZiB0aGUgbGlnaHQuIEluIGNvbnRleHQgb2ZcclxuXHRcdCAqIHBoeXNpY2FsbHktY29ycmVjdCByZW5kZXJpbmcgdGhlIGRlZmF1bHQgdmFsdWUgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAyXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGVjYXkgPSBkZWNheTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgcHJvcGVydHkgaG9sZHMgdGhlIGxpZ2h0J3Mgc2hhZG93IGNvbmZpZ3VyYXRpb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1BvaW50TGlnaHRTaGFkb3d9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2hhZG93ID0gbmV3IFBvaW50TGlnaHRTaGFkb3coKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgbGlnaHQncyBwb3dlci4gUG93ZXIgaXMgdGhlIGx1bWlub3VzIHBvd2VyIG9mIHRoZSBsaWdodCBtZWFzdXJlZCBpbiBsdW1lbnMgKGxtKS5cclxuXHQgKiBDaGFuZ2luZyB0aGUgcG93ZXIgd2lsbCBhbHNvIGNoYW5nZSB0aGUgbGlnaHQncyBpbnRlbnNpdHkuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdCAqL1xyXG5cdGdldCBwb3dlcigpIHtcclxuXHJcblx0XHQvLyBjb21wdXRlIHRoZSBsaWdodCdzIGx1bWlub3VzIHBvd2VyIChpbiBsdW1lbnMpIGZyb20gaXRzIGludGVuc2l0eSAoaW4gY2FuZGVsYSlcclxuXHRcdC8vIGZvciBhbiBpc290cm9waWMgbGlnaHQgc291cmNlLCBsdW1pbm91cyBwb3dlciAobG0pID0gNCDPgCBsdW1pbm91cyBpbnRlbnNpdHkgKGNkKVxyXG5cdFx0cmV0dXJuIHRoaXMuaW50ZW5zaXR5ICogNCAqIE1hdGguUEk7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0IHBvd2VyKCBwb3dlciApIHtcclxuXHJcblx0XHQvLyBzZXQgdGhlIGxpZ2h0J3MgaW50ZW5zaXR5IChpbiBjYW5kZWxhKSBmcm9tIHRoZSBkZXNpcmVkIGx1bWlub3VzIHBvd2VyIChpbiBsdW1lbnMpXHJcblx0XHR0aGlzLmludGVuc2l0eSA9IHBvd2VyIC8gKCA0ICogTWF0aC5QSSApO1xyXG5cclxuXHR9XHJcblxyXG5cdGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0dGhpcy5zaGFkb3cuZGlzcG9zZSgpO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSwgcmVjdXJzaXZlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSwgcmVjdXJzaXZlICk7XHJcblxyXG5cdFx0dGhpcy5kaXN0YW5jZSA9IHNvdXJjZS5kaXN0YW5jZTtcclxuXHRcdHRoaXMuZGVjYXkgPSBzb3VyY2UuZGVjYXk7XHJcblxyXG5cdFx0dGhpcy5zaGFkb3cgPSBzb3VyY2Uuc2hhZG93LmNsb25lKCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFBvaW50TGlnaHQgfTtcclxuIiwiaW1wb3J0IHsgQ2FtZXJhIH0gZnJvbSAnLi9DYW1lcmEuanMnO1xyXG5cclxuLyoqXHJcbiAqIENhbWVyYSB0aGF0IHVzZXMgW29ydGhvZ3JhcGhpYyBwcm9qZWN0aW9uXXtAbGluayBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9PcnRob2dyYXBoaWNfcHJvamVjdGlvbn0uXHJcbiAqXHJcbiAqIEluIHRoaXMgcHJvamVjdGlvbiBtb2RlLCBhbiBvYmplY3QncyBzaXplIGluIHRoZSByZW5kZXJlZCBpbWFnZSBzdGF5c1xyXG4gKiBjb25zdGFudCByZWdhcmRsZXNzIG9mIGl0cyBkaXN0YW5jZSBmcm9tIHRoZSBjYW1lcmEuIFRoaXMgY2FuIGJlIHVzZWZ1bFxyXG4gKiBmb3IgcmVuZGVyaW5nIDJEIHNjZW5lcyBhbmQgVUkgZWxlbWVudHMsIGFtb25nc3Qgb3RoZXIgdGhpbmdzLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBjYW1lcmEgPSBuZXcgVEhSRUUuT3J0aG9ncmFwaGljQ2FtZXJhKCB3aWR0aCAvIC0gMiwgd2lkdGggLyAyLCBoZWlnaHQgLyAyLCBoZWlnaHQgLyAtIDIsIDEsIDEwMDAgKTtcclxuICogc2NlbmUuYWRkKCBjYW1lcmEgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBDYW1lcmFcclxuICovXHJcbmNsYXNzIE9ydGhvZ3JhcGhpY0NhbWVyYSBleHRlbmRzIENhbWVyYSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgb3J0aG9ncmFwaGljIGNhbWVyYS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbGVmdD0tMV0gLSBUaGUgbGVmdCBwbGFuZSBvZiB0aGUgY2FtZXJhJ3MgZnJ1c3R1bS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3JpZ2h0PTFdIC0gVGhlIHJpZ2h0IHBsYW5lIG9mIHRoZSBjYW1lcmEncyBmcnVzdHVtLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbdG9wPTFdIC0gVGhlIHRvcCBwbGFuZSBvZiB0aGUgY2FtZXJhJ3MgZnJ1c3R1bS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2JvdHRvbT0tMV0gLSBUaGUgYm90dG9tIHBsYW5lIG9mIHRoZSBjYW1lcmEncyBmcnVzdHVtLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbmVhcj0wLjFdIC0gVGhlIGNhbWVyYSdzIG5lYXIgcGxhbmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtmYXI9MjAwMF0gLSBUaGUgY2FtZXJhJ3MgZmFyIHBsYW5lLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBsZWZ0ID0gLSAxLCByaWdodCA9IDEsIHRvcCA9IDEsIGJvdHRvbSA9IC0gMSwgbmVhciA9IDAuMSwgZmFyID0gMjAwMCApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc09ydGhvZ3JhcGhpY0NhbWVyYSA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ09ydGhvZ3JhcGhpY0NhbWVyYSc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgem9vbSBmYWN0b3Igb2YgdGhlIGNhbWVyYS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnpvb20gPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVwcmVzZW50cyB0aGUgZnJ1c3R1bSB3aW5kb3cgc3BlY2lmaWNhdGlvbi4gVGhpcyBwcm9wZXJ0eSBzaG91bGQgbm90IGJlIGVkaXRlZFxyXG5cdFx0ICogZGlyZWN0bHkgYnV0IHZpYSB7QGxpbmsgUGVyc3BlY3RpdmVDYW1lcmEjc2V0Vmlld09mZnNldH0gYW5kIHtAbGluayBQZXJzcGVjdGl2ZUNhbWVyYSNjbGVhclZpZXdPZmZzZXR9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/T2JqZWN0fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnZpZXcgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGxlZnQgcGxhbmUgb2YgdGhlIGNhbWVyYSdzIGZydXN0dW0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IC0xXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGVmdCA9IGxlZnQ7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcmlnaHQgcGxhbmUgb2YgdGhlIGNhbWVyYSdzIGZydXN0dW0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yaWdodCA9IHJpZ2h0O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHRvcCBwbGFuZSBvZiB0aGUgY2FtZXJhJ3MgZnJ1c3R1bS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRvcCA9IHRvcDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBib3R0b20gcGxhbmUgb2YgdGhlIGNhbWVyYSdzIGZydXN0dW0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IC0xXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYm90dG9tID0gYm90dG9tO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNhbWVyYSdzIG5lYXIgcGxhbmUuIFRoZSB2YWxpZCByYW5nZSBpcyBncmVhdGVyIHRoYW4gYDBgXHJcblx0XHQgKiBhbmQgbGVzcyB0aGFuIHRoZSBjdXJyZW50IHZhbHVlIG9mIHtAbGluayBPcnRob2dyYXBoaWNDYW1lcmEjZmFyfS5cclxuXHRcdCAqXHJcblx0XHQgKiBOb3RlIHRoYXQsIHVubGlrZSBmb3IgdGhlIHtAbGluayBQZXJzcGVjdGl2ZUNhbWVyYX0sIGAwYCBpcyBhXHJcblx0XHQgKiB2YWxpZCB2YWx1ZSBmb3IgYW4gb3J0aG9ncmFwaGljIGNhbWVyYSdzIG5lYXIgcGxhbmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDAuMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5lYXIgPSBuZWFyO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNhbWVyYSdzIGZhciBwbGFuZS4gTXVzdCBiZSBncmVhdGVyIHRoYW4gdGhlXHJcblx0XHQgKiBjdXJyZW50IHZhbHVlIG9mIHtAbGluayBPcnRob2dyYXBoaWNDYW1lcmEjbmVhcn0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDIwMDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5mYXIgPSBmYXI7XHJcblxyXG5cdFx0dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlLCByZWN1cnNpdmUgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlLCByZWN1cnNpdmUgKTtcclxuXHJcblx0XHR0aGlzLmxlZnQgPSBzb3VyY2UubGVmdDtcclxuXHRcdHRoaXMucmlnaHQgPSBzb3VyY2UucmlnaHQ7XHJcblx0XHR0aGlzLnRvcCA9IHNvdXJjZS50b3A7XHJcblx0XHR0aGlzLmJvdHRvbSA9IHNvdXJjZS5ib3R0b207XHJcblx0XHR0aGlzLm5lYXIgPSBzb3VyY2UubmVhcjtcclxuXHRcdHRoaXMuZmFyID0gc291cmNlLmZhcjtcclxuXHJcblx0XHR0aGlzLnpvb20gPSBzb3VyY2Uuem9vbTtcclxuXHRcdHRoaXMudmlldyA9IHNvdXJjZS52aWV3ID09PSBudWxsID8gbnVsbCA6IE9iamVjdC5hc3NpZ24oIHt9LCBzb3VyY2UudmlldyApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgYW4gb2Zmc2V0IGluIGEgbGFyZ2VyIGZydXN0dW0uIFRoaXMgaXMgdXNlZnVsIGZvciBtdWx0aS13aW5kb3cgb3JcclxuXHQgKiBtdWx0aS1tb25pdG9yL211bHRpLW1hY2hpbmUgc2V0dXBzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGZ1bGxXaWR0aCAtIFRoZSBmdWxsIHdpZHRoIG9mIG11bHRpdmlldyBzZXR1cC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZnVsbEhlaWdodCAtIFRoZSBmdWxsIGhlaWdodCBvZiBtdWx0aXZpZXcgc2V0dXAuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgaG9yaXpvbnRhbCBvZmZzZXQgb2YgdGhlIHN1YmNhbWVyYS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB2ZXJ0aWNhbCBvZmZzZXQgb2YgdGhlIHN1YmNhbWVyYS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2Ygc3ViY2FtZXJhLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHN1YmNhbWVyYS5cclxuXHQgKiBAc2VlIHtAbGluayBQZXJzcGVjdGl2ZUNhbWVyYSNzZXRWaWV3T2Zmc2V0fVxyXG5cdCAqL1xyXG5cdHNldFZpZXdPZmZzZXQoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgeCwgeSwgd2lkdGgsIGhlaWdodCApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMudmlldyA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMudmlldyA9IHtcclxuXHRcdFx0XHRlbmFibGVkOiB0cnVlLFxyXG5cdFx0XHRcdGZ1bGxXaWR0aDogMSxcclxuXHRcdFx0XHRmdWxsSGVpZ2h0OiAxLFxyXG5cdFx0XHRcdG9mZnNldFg6IDAsXHJcblx0XHRcdFx0b2Zmc2V0WTogMCxcclxuXHRcdFx0XHR3aWR0aDogMSxcclxuXHRcdFx0XHRoZWlnaHQ6IDFcclxuXHRcdFx0fTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy52aWV3LmVuYWJsZWQgPSB0cnVlO1xyXG5cdFx0dGhpcy52aWV3LmZ1bGxXaWR0aCA9IGZ1bGxXaWR0aDtcclxuXHRcdHRoaXMudmlldy5mdWxsSGVpZ2h0ID0gZnVsbEhlaWdodDtcclxuXHRcdHRoaXMudmlldy5vZmZzZXRYID0geDtcclxuXHRcdHRoaXMudmlldy5vZmZzZXRZID0geTtcclxuXHRcdHRoaXMudmlldy53aWR0aCA9IHdpZHRoO1xyXG5cdFx0dGhpcy52aWV3LmhlaWdodCA9IGhlaWdodDtcclxuXHJcblx0XHR0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW1vdmVzIHRoZSB2aWV3IG9mZnNldCBmcm9tIHRoZSBwcm9qZWN0aW9uIG1hdHJpeC5cclxuXHQgKi9cclxuXHRjbGVhclZpZXdPZmZzZXQoKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLnZpZXcgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnZpZXcuZW5hYmxlZCA9IGZhbHNlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoZSBjYW1lcmEncyBwcm9qZWN0aW9uIG1hdHJpeC4gTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgYW55IGNoYW5nZSBvZlxyXG5cdCAqIGNhbWVyYSBwcm9wZXJ0aWVzLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKSB7XHJcblxyXG5cdFx0Y29uc3QgZHggPSAoIHRoaXMucmlnaHQgLSB0aGlzLmxlZnQgKSAvICggMiAqIHRoaXMuem9vbSApO1xyXG5cdFx0Y29uc3QgZHkgPSAoIHRoaXMudG9wIC0gdGhpcy5ib3R0b20gKSAvICggMiAqIHRoaXMuem9vbSApO1xyXG5cdFx0Y29uc3QgY3ggPSAoIHRoaXMucmlnaHQgKyB0aGlzLmxlZnQgKSAvIDI7XHJcblx0XHRjb25zdCBjeSA9ICggdGhpcy50b3AgKyB0aGlzLmJvdHRvbSApIC8gMjtcclxuXHJcblx0XHRsZXQgbGVmdCA9IGN4IC0gZHg7XHJcblx0XHRsZXQgcmlnaHQgPSBjeCArIGR4O1xyXG5cdFx0bGV0IHRvcCA9IGN5ICsgZHk7XHJcblx0XHRsZXQgYm90dG9tID0gY3kgLSBkeTtcclxuXHJcblx0XHRpZiAoIHRoaXMudmlldyAhPT0gbnVsbCAmJiB0aGlzLnZpZXcuZW5hYmxlZCApIHtcclxuXHJcblx0XHRcdGNvbnN0IHNjYWxlVyA9ICggdGhpcy5yaWdodCAtIHRoaXMubGVmdCApIC8gdGhpcy52aWV3LmZ1bGxXaWR0aCAvIHRoaXMuem9vbTtcclxuXHRcdFx0Y29uc3Qgc2NhbGVIID0gKCB0aGlzLnRvcCAtIHRoaXMuYm90dG9tICkgLyB0aGlzLnZpZXcuZnVsbEhlaWdodCAvIHRoaXMuem9vbTtcclxuXHJcblx0XHRcdGxlZnQgKz0gc2NhbGVXICogdGhpcy52aWV3Lm9mZnNldFg7XHJcblx0XHRcdHJpZ2h0ID0gbGVmdCArIHNjYWxlVyAqIHRoaXMudmlldy53aWR0aDtcclxuXHRcdFx0dG9wIC09IHNjYWxlSCAqIHRoaXMudmlldy5vZmZzZXRZO1xyXG5cdFx0XHRib3R0b20gPSB0b3AgLSBzY2FsZUggKiB0aGlzLnZpZXcuaGVpZ2h0O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnByb2plY3Rpb25NYXRyaXgubWFrZU9ydGhvZ3JhcGhpYyggbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCB0aGlzLm5lYXIsIHRoaXMuZmFyLCB0aGlzLmNvb3JkaW5hdGVTeXN0ZW0gKTtcclxuXHJcblx0XHR0aGlzLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkoIHRoaXMucHJvamVjdGlvbk1hdHJpeCApLmludmVydCgpO1xyXG5cclxuXHR9XHJcblxyXG5cdHRvSlNPTiggbWV0YSApIHtcclxuXHJcblx0XHRjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCBtZXRhICk7XHJcblxyXG5cdFx0ZGF0YS5vYmplY3Quem9vbSA9IHRoaXMuem9vbTtcclxuXHRcdGRhdGEub2JqZWN0LmxlZnQgPSB0aGlzLmxlZnQ7XHJcblx0XHRkYXRhLm9iamVjdC5yaWdodCA9IHRoaXMucmlnaHQ7XHJcblx0XHRkYXRhLm9iamVjdC50b3AgPSB0aGlzLnRvcDtcclxuXHRcdGRhdGEub2JqZWN0LmJvdHRvbSA9IHRoaXMuYm90dG9tO1xyXG5cdFx0ZGF0YS5vYmplY3QubmVhciA9IHRoaXMubmVhcjtcclxuXHRcdGRhdGEub2JqZWN0LmZhciA9IHRoaXMuZmFyO1xyXG5cclxuXHRcdGlmICggdGhpcy52aWV3ICE9PSBudWxsICkgZGF0YS5vYmplY3QudmlldyA9IE9iamVjdC5hc3NpZ24oIHt9LCB0aGlzLnZpZXcgKTtcclxuXHJcblx0XHRyZXR1cm4gZGF0YTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgT3J0aG9ncmFwaGljQ2FtZXJhIH07XHJcbiIsImltcG9ydCB7IExpZ2h0U2hhZG93IH0gZnJvbSAnLi9MaWdodFNoYWRvdy5qcyc7XHJcbmltcG9ydCB7IE9ydGhvZ3JhcGhpY0NhbWVyYSB9IGZyb20gJy4uL2NhbWVyYXMvT3J0aG9ncmFwaGljQ2FtZXJhLmpzJztcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIHRoZSBzaGFkb3cgY29uZmlndXJhdGlvbiBvZiBkaXJlY3Rpb25hbCBsaWdodHMuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBMaWdodFNoYWRvd1xyXG4gKi9cclxuY2xhc3MgRGlyZWN0aW9uYWxMaWdodFNoYWRvdyBleHRlbmRzIExpZ2h0U2hhZG93IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBkaXJlY3Rpb25hbCBsaWdodCBzaGFkb3cuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5ldyBPcnRob2dyYXBoaWNDYW1lcmEoIC0gNSwgNSwgNSwgLSA1LCAwLjUsIDUwMCApICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzRGlyZWN0aW9uYWxMaWdodFNoYWRvdyA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IERpcmVjdGlvbmFsTGlnaHRTaGFkb3cgfTtcclxuIiwiaW1wb3J0IHsgTGlnaHQgfSBmcm9tICcuL0xpZ2h0LmpzJztcclxuaW1wb3J0IHsgRGlyZWN0aW9uYWxMaWdodFNoYWRvdyB9IGZyb20gJy4vRGlyZWN0aW9uYWxMaWdodFNoYWRvdy5qcyc7XHJcbmltcG9ydCB7IE9iamVjdDNEIH0gZnJvbSAnLi4vY29yZS9PYmplY3QzRC5qcyc7XHJcblxyXG4vKipcclxuICogQSBsaWdodCB0aGF0IGdldHMgZW1pdHRlZCBpbiBhIHNwZWNpZmljIGRpcmVjdGlvbi4gVGhpcyBsaWdodCB3aWxsIGJlaGF2ZVxyXG4gKiBhcyB0aG91Z2ggaXQgaXMgaW5maW5pdGVseSBmYXIgYXdheSBhbmQgdGhlIHJheXMgcHJvZHVjZWQgZnJvbSBpdCBhcmUgYWxsXHJcbiAqIHBhcmFsbGVsLiBUaGUgY29tbW9uIHVzZSBjYXNlIGZvciB0aGlzIGlzIHRvIHNpbXVsYXRlIGRheWxpZ2h0OyB0aGUgc3VuIGlzXHJcbiAqIGZhciBlbm91Z2ggYXdheSB0aGF0IGl0cyBwb3NpdGlvbiBjYW4gYmUgY29uc2lkZXJlZCB0byBiZSBpbmZpbml0ZSwgYW5kXHJcbiAqIGFsbCBsaWdodCByYXlzIGNvbWluZyBmcm9tIGl0IGFyZSBwYXJhbGxlbC5cclxuICpcclxuICogQSBjb21tb24gcG9pbnQgb2YgY29uZnVzaW9uIGZvciBkaXJlY3Rpb25hbCBsaWdodHMgaXMgdGhhdCBzZXR0aW5nIHRoZVxyXG4gKiByb3RhdGlvbiBoYXMgbm8gZWZmZWN0LiBUaGlzIGlzIGJlY2F1c2UgdGhyZWUuanMncyBEaXJlY3Rpb25hbExpZ2h0IGlzIHRoZVxyXG4gKiBlcXVpdmFsZW50IHRvIHdoYXQgaXMgb2Z0ZW4gY2FsbGVkIGEgJ1RhcmdldCBEaXJlY3QgTGlnaHQnIGluIG90aGVyXHJcbiAqIGFwcGxpY2F0aW9ucy5cclxuICpcclxuICogVGhpcyBtZWFucyB0aGF0IGl0cyBkaXJlY3Rpb24gaXMgY2FsY3VsYXRlZCBhcyBwb2ludGluZyBmcm9tIHRoZSBsaWdodCdzXHJcbiAqIHtAbGluayBPYmplY3QzRCNwb3NpdGlvbn0gdG8gdGhlIHtAbGluayBEaXJlY3Rpb25hbExpZ2h0I3RhcmdldH0gcG9zaXRpb25cclxuICogKGFzIG9wcG9zZWQgdG8gYSAnRnJlZSBEaXJlY3QgTGlnaHQnIHRoYXQganVzdCBoYXMgYSByb3RhdGlvblxyXG4gKiBjb21wb25lbnQpLlxyXG4gKlxyXG4gKiBUaGlzIGxpZ2h0IGNhbiBjYXN0IHNoYWRvd3MgLSBzZWUgdGhlIHtAbGluayBEaXJlY3Rpb25hbExpZ2h0U2hhZG93fSBmb3IgZGV0YWlscy5cclxuICpcclxuICogYGBganNcclxuICogLy8gV2hpdGUgZGlyZWN0aW9uYWwgbGlnaHQgYXQgaGFsZiBpbnRlbnNpdHkgc2hpbmluZyBmcm9tIHRoZSB0b3AuXHJcbiAqIGNvbnN0IGRpcmVjdGlvbmFsTGlnaHQgPSBuZXcgVEhSRUUuRGlyZWN0aW9uYWxMaWdodCggMHhmZmZmZmYsIDAuNSApO1xyXG4gKiBzY2VuZS5hZGQoIGRpcmVjdGlvbmFsTGlnaHQgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBMaWdodFxyXG4gKi9cclxuY2xhc3MgRGlyZWN0aW9uYWxMaWdodCBleHRlbmRzIExpZ2h0IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBkaXJlY3Rpb25hbCBsaWdodC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7KG51bWJlcnxDb2xvcnxzdHJpbmcpfSBbY29sb3I9MHhmZmZmZmZdIC0gVGhlIGxpZ2h0J3MgY29sb3IuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtpbnRlbnNpdHk9MV0gLSBUaGUgbGlnaHQncyBzdHJlbmd0aC9pbnRlbnNpdHkuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGNvbG9yLCBpbnRlbnNpdHkgKSB7XHJcblxyXG5cdFx0c3VwZXIoIGNvbG9yLCBpbnRlbnNpdHkgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNEaXJlY3Rpb25hbExpZ2h0ID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnRGlyZWN0aW9uYWxMaWdodCc7XHJcblxyXG5cdFx0dGhpcy5wb3NpdGlvbi5jb3B5KCBPYmplY3QzRC5ERUZBVUxUX1VQICk7XHJcblx0XHR0aGlzLnVwZGF0ZU1hdHJpeCgpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGRpcmVjdGlvbmFsIGxpZ2h0IHBvaW50cyBmcm9tIGl0cyBwb3NpdGlvbiB0byB0aGVcclxuXHRcdCAqIHRhcmdldCdzIHBvc2l0aW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEZvciB0aGUgdGFyZ2V0J3MgcG9zaXRpb24gdG8gYmUgY2hhbmdlZCB0byBhbnl0aGluZyBvdGhlclxyXG5cdFx0ICogdGhhbiB0aGUgZGVmYXVsdCwgaXQgbXVzdCBiZSBhZGRlZCB0byB0aGUgc2NlbmUuXHJcblx0XHQgKlxyXG5cdFx0ICogSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBzZXQgdGhlIHRhcmdldCB0byBiZSBhbm90aGVyIDNEIG9iamVjdFxyXG5cdFx0ICogaW4gdGhlIHNjZW5lLiBUaGUgbGlnaHQgd2lsbCBub3cgdHJhY2sgdGhlIHRhcmdldCBvYmplY3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdDNEfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRhcmdldCA9IG5ldyBPYmplY3QzRCgpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBwcm9wZXJ0eSBob2xkcyB0aGUgbGlnaHQncyBzaGFkb3cgY29uZmlndXJhdGlvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7RGlyZWN0aW9uYWxMaWdodFNoYWRvd31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zaGFkb3cgPSBuZXcgRGlyZWN0aW9uYWxMaWdodFNoYWRvdygpO1xyXG5cclxuXHR9XHJcblxyXG5cdGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0dGhpcy5zaGFkb3cuZGlzcG9zZSgpO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLnRhcmdldCA9IHNvdXJjZS50YXJnZXQuY2xvbmUoKTtcclxuXHRcdHRoaXMuc2hhZG93ID0gc291cmNlLnNoYWRvdy5jbG9uZSgpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBEaXJlY3Rpb25hbExpZ2h0IH07XHJcbiIsImltcG9ydCB7IExpZ2h0IH0gZnJvbSAnLi9MaWdodC5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBsaWdodCBnbG9iYWxseSBpbGx1bWluYXRlcyBhbGwgb2JqZWN0cyBpbiB0aGUgc2NlbmUgZXF1YWxseS5cclxuICpcclxuICogSXQgY2Fubm90IGJlIHVzZWQgdG8gY2FzdCBzaGFkb3dzIGFzIGl0IGRvZXMgbm90IGhhdmUgYSBkaXJlY3Rpb24uXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGxpZ2h0ID0gbmV3IFRIUkVFLkFtYmllbnRMaWdodCggMHg0MDQwNDAgKTsgLy8gc29mdCB3aGl0ZSBsaWdodFxyXG4gKiBzY2VuZS5hZGQoIGxpZ2h0ICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTGlnaHRcclxuICovXHJcbmNsYXNzIEFtYmllbnRMaWdodCBleHRlbmRzIExpZ2h0IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBhbWJpZW50IGxpZ2h0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHsobnVtYmVyfENvbG9yfHN0cmluZyl9IFtjb2xvcj0weGZmZmZmZl0gLSBUaGUgbGlnaHQncyBjb2xvci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2ludGVuc2l0eT0xXSAtIFRoZSBsaWdodCdzIHN0cmVuZ3RoL2ludGVuc2l0eS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggY29sb3IsIGludGVuc2l0eSApIHtcclxuXHJcblx0XHRzdXBlciggY29sb3IsIGludGVuc2l0eSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0FtYmllbnRMaWdodCA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ0FtYmllbnRMaWdodCc7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IEFtYmllbnRMaWdodCB9O1xyXG4iLCJpbXBvcnQgeyBMaWdodCB9IGZyb20gJy4vTGlnaHQuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgY2xhc3MgZW1pdHMgbGlnaHQgdW5pZm9ybWx5IGFjcm9zcyB0aGUgZmFjZSBhIHJlY3Rhbmd1bGFyIHBsYW5lLlxyXG4gKiBUaGlzIGxpZ2h0IHR5cGUgY2FuIGJlIHVzZWQgdG8gc2ltdWxhdGUgbGlnaHQgc291cmNlcyBzdWNoIGFzIGJyaWdodFxyXG4gKiB3aW5kb3dzIG9yIHN0cmlwIGxpZ2h0aW5nLlxyXG4gKlxyXG4gKiBJbXBvcnRhbnQgTm90ZXM6XHJcbiAqXHJcbiAqIC0gVGhlcmUgaXMgbm8gc2hhZG93IHN1cHBvcnQuXHJcbiAqIC0gT25seSBQQlIgbWF0ZXJpYWxzIGFyZSBzdXBwb3J0ZWQuXHJcbiAqIC0gWW91IGhhdmUgdG8gaW5jbHVkZSBgUmVjdEFyZWFMaWdodFVuaWZvcm1zTGliYCAoYFdlYkdMUmVuZGVyZXJgKSBvciBgUmVjdEFyZWFMaWdodFRleHR1cmVzTGliYCAoYFdlYkdQVVJlbmRlcmVyYClcclxuICogaW50byB5b3VyIGFwcCBhbmQgaW5pdCB0aGUgdW5pZm9ybXMvdGV4dHVyZXMuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIFJlY3RBcmVhTGlnaHRVbmlmb3Jtc0xpYi5pbml0KCk7IC8vIG9ubHkgcmVsZXZhbnQgZm9yIFdlYkdMUmVuZGVyZXJcclxuICogVEhSRUUuUmVjdEFyZWFMaWdodE5vZGUuc2V0TFRDKCBSZWN0QXJlYUxpZ2h0VGV4dHVyZXNMaWIuaW5pdCgpICk7IC8vICBvbmx5IHJlbGV2YW50IGZvciBXZWJHUFVSZW5kZXJlclxyXG4gKlxyXG4gKiBjb25zdCBpbnRlbnNpdHkgPSAxOyBjb25zdCB3aWR0aCA9IDEwOyBjb25zdCBoZWlnaHQgPSAxMDtcclxuICogY29uc3QgcmVjdExpZ2h0ID0gbmV3IFRIUkVFLlJlY3RBcmVhTGlnaHQoIDB4ZmZmZmZmLCBpbnRlbnNpdHksIHdpZHRoLCBoZWlnaHQgKTtcclxuICogcmVjdExpZ2h0LnBvc2l0aW9uLnNldCggNSwgNSwgMCApO1xyXG4gKiByZWN0TGlnaHQubG9va0F0KCAwLCAwLCAwICk7XHJcbiAqIHNjZW5lLmFkZCggcmVjdExpZ2h0IClcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBMaWdodFxyXG4gKi9cclxuY2xhc3MgUmVjdEFyZWFMaWdodCBleHRlbmRzIExpZ2h0IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBhcmVhIGxpZ2h0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHsobnVtYmVyfENvbG9yfHN0cmluZyl9IFtjb2xvcj0weGZmZmZmZl0gLSBUaGUgbGlnaHQncyBjb2xvci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2ludGVuc2l0eT0xXSAtIFRoZSBsaWdodCdzIHN0cmVuZ3RoL2ludGVuc2l0eS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3dpZHRoPTEwXSAtIFRoZSB3aWR0aCBvZiB0aGUgbGlnaHQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtoZWlnaHQ9MTBdIC0gVGhlIGhlaWdodCBvZiB0aGUgbGlnaHQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGNvbG9yLCBpbnRlbnNpdHksIHdpZHRoID0gMTAsIGhlaWdodCA9IDEwICkge1xyXG5cclxuXHRcdHN1cGVyKCBjb2xvciwgaW50ZW5zaXR5ICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzUmVjdEFyZWFMaWdodCA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ1JlY3RBcmVhTGlnaHQnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHdpZHRoIG9mIHRoZSBsaWdodC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMTBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy53aWR0aCA9IHdpZHRoO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGhlaWdodCBvZiB0aGUgbGlnaHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDEwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBsaWdodCdzIHBvd2VyLiBQb3dlciBpcyB0aGUgbHVtaW5vdXMgcG93ZXIgb2YgdGhlIGxpZ2h0IG1lYXN1cmVkIGluIGx1bWVucyAobG0pLlxyXG5cdCAqIENoYW5naW5nIHRoZSBwb3dlciB3aWxsIGFsc28gY2hhbmdlIHRoZSBsaWdodCdzIGludGVuc2l0eS5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0ICovXHJcblx0Z2V0IHBvd2VyKCkge1xyXG5cclxuXHRcdC8vIGNvbXB1dGUgdGhlIGxpZ2h0J3MgbHVtaW5vdXMgcG93ZXIgKGluIGx1bWVucykgZnJvbSBpdHMgaW50ZW5zaXR5IChpbiBuaXRzKVxyXG5cdFx0cmV0dXJuIHRoaXMuaW50ZW5zaXR5ICogdGhpcy53aWR0aCAqIHRoaXMuaGVpZ2h0ICogTWF0aC5QSTtcclxuXHJcblx0fVxyXG5cclxuXHRzZXQgcG93ZXIoIHBvd2VyICkge1xyXG5cclxuXHRcdC8vIHNldCB0aGUgbGlnaHQncyBpbnRlbnNpdHkgKGluIG5pdHMpIGZyb20gdGhlIGRlc2lyZWQgbHVtaW5vdXMgcG93ZXIgKGluIGx1bWVucylcclxuXHRcdHRoaXMuaW50ZW5zaXR5ID0gcG93ZXIgLyAoIHRoaXMud2lkdGggKiB0aGlzLmhlaWdodCAqIE1hdGguUEkgKTtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy53aWR0aCA9IHNvdXJjZS53aWR0aDtcclxuXHRcdHRoaXMuaGVpZ2h0ID0gc291cmNlLmhlaWdodDtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHR0b0pTT04oIG1ldGEgKSB7XHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IHN1cGVyLnRvSlNPTiggbWV0YSApO1xyXG5cclxuXHRcdGRhdGEub2JqZWN0LndpZHRoID0gdGhpcy53aWR0aDtcclxuXHRcdGRhdGEub2JqZWN0LmhlaWdodCA9IHRoaXMuaGVpZ2h0O1xyXG5cclxuXHRcdHJldHVybiBkYXRhO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBSZWN0QXJlYUxpZ2h0IH07XHJcbiIsImltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuL1ZlY3RvcjMuanMnO1xyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgYSB0aGlyZC1vcmRlciBzcGhlcmljYWwgaGFybW9uaWNzIChTSCkuIExpZ2h0IHByb2JlcyB1c2UgdGhpcyBjbGFzc1xyXG4gKiB0byBlbmNvZGUgbGlnaHRpbmcgaW5mb3JtYXRpb24uXHJcbiAqXHJcbiAqIC0gUHJpbWFyeSByZWZlcmVuY2U6IHtAbGluayBodHRwczovL2dyYXBoaWNzLnN0YW5mb3JkLmVkdS9wYXBlcnMvZW52bWFwL2Vudm1hcC5wZGZ9XHJcbiAqIC0gU2Vjb25kYXJ5IHJlZmVyZW5jZToge0BsaW5rIGh0dHBzOi8vd3d3LnBwc2xvYW4ub3JnL3B1YmxpY2F0aW9ucy9TdHVwaWRTSDM2LnBkZn1cclxuICovXHJcbmNsYXNzIFNwaGVyaWNhbEhhcm1vbmljczMge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHNwaGVyaWNhbCBoYXJtb25pY3MuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzU3BoZXJpY2FsSGFybW9uaWNzMyA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBhcnJheSBob2xkaW5nIHRoZSAoOSkgU0ggY29lZmZpY2llbnRzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxWZWN0b3IzPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb2VmZmljaWVudHMgPSBbXTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCA5OyBpICsrICkge1xyXG5cclxuXHRcdFx0dGhpcy5jb2VmZmljaWVudHMucHVzaCggbmV3IFZlY3RvcjMoKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBnaXZlbiBTSCBjb2VmZmljaWVudHMgdG8gdGhpcyBpbnN0YW5jZSBieSBjb3B5aW5nXHJcblx0ICogdGhlIHZhbHVlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8VmVjdG9yMz59IGNvZWZmaWNpZW50cyAtIFRoZSBTSCBjb2VmZmljaWVudHMuXHJcblx0ICogQHJldHVybiB7U3BoZXJpY2FsSGFybW9uaWNzM30gQSByZWZlcmVuY2UgdG8gdGhpcyBzcGhlcmljYWwgaGFybW9uaWNzLlxyXG5cdCAqL1xyXG5cdHNldCggY29lZmZpY2llbnRzICkge1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDk7IGkgKysgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmNvZWZmaWNpZW50c1sgaSBdLmNvcHkoIGNvZWZmaWNpZW50c1sgaSBdICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgYWxsIFNIIGNvZWZmaWNpZW50cyB0byBgMGAuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtTcGhlcmljYWxIYXJtb25pY3MzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHNwaGVyaWNhbCBoYXJtb25pY3MuXHJcblx0ICovXHJcblx0emVybygpIHtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCA5OyBpICsrICkge1xyXG5cclxuXHRcdFx0dGhpcy5jb2VmZmljaWVudHNbIGkgXS5zZXQoIDAsIDAsIDAgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgcmFkaWFuY2UgaW4gdGhlIGRpcmVjdGlvbiBvZiB0aGUgZ2l2ZW4gbm9ybWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBub3JtYWwgLSBUaGUgbm9ybWFsIHZlY3RvciAoYXNzdW1lZCB0byBiZSB1bml0IGxlbmd0aClcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHRhcmdldCAtIFRoZSB0YXJnZXQgdmVjdG9yIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbWV0aG9kJ3MgcmVzdWx0LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IFRoZSByYWRpYW5jZS5cclxuXHQgKi9cclxuXHRnZXRBdCggbm9ybWFsLCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0Ly8gbm9ybWFsIGlzIGFzc3VtZWQgdG8gYmUgdW5pdCBsZW5ndGhcclxuXHJcblx0XHRjb25zdCB4ID0gbm9ybWFsLngsIHkgPSBub3JtYWwueSwgeiA9IG5vcm1hbC56O1xyXG5cclxuXHRcdGNvbnN0IGNvZWZmID0gdGhpcy5jb2VmZmljaWVudHM7XHJcblxyXG5cdFx0Ly8gYmFuZCAwXHJcblx0XHR0YXJnZXQuY29weSggY29lZmZbIDAgXSApLm11bHRpcGx5U2NhbGFyKCAwLjI4MjA5NSApO1xyXG5cclxuXHRcdC8vIGJhbmQgMVxyXG5cdFx0dGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggY29lZmZbIDEgXSwgMC40ODg2MDMgKiB5ICk7XHJcblx0XHR0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKCBjb2VmZlsgMiBdLCAwLjQ4ODYwMyAqIHogKTtcclxuXHRcdHRhcmdldC5hZGRTY2FsZWRWZWN0b3IoIGNvZWZmWyAzIF0sIDAuNDg4NjAzICogeCApO1xyXG5cclxuXHRcdC8vIGJhbmQgMlxyXG5cdFx0dGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggY29lZmZbIDQgXSwgMS4wOTI1NDggKiAoIHggKiB5ICkgKTtcclxuXHRcdHRhcmdldC5hZGRTY2FsZWRWZWN0b3IoIGNvZWZmWyA1IF0sIDEuMDkyNTQ4ICogKCB5ICogeiApICk7XHJcblx0XHR0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKCBjb2VmZlsgNiBdLCAwLjMxNTM5MiAqICggMy4wICogeiAqIHogLSAxLjAgKSApO1xyXG5cdFx0dGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggY29lZmZbIDcgXSwgMS4wOTI1NDggKiAoIHggKiB6ICkgKTtcclxuXHRcdHRhcmdldC5hZGRTY2FsZWRWZWN0b3IoIGNvZWZmWyA4IF0sIDAuNTQ2Mjc0ICogKCB4ICogeCAtIHkgKiB5ICkgKTtcclxuXHJcblx0XHRyZXR1cm4gdGFyZ2V0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGlycmFkaWFuY2UgKHJhZGlhbmNlIGNvbnZvbHZlZCB3aXRoIGNvc2luZSBsb2JlKSBpbiB0aGVcclxuXHQgKiBkaXJlY3Rpb24gb2YgdGhlIGdpdmVuIG5vcm1hbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gbm9ybWFsIC0gVGhlIG5vcm1hbCB2ZWN0b3IgKGFzc3VtZWQgdG8gYmUgdW5pdCBsZW5ndGgpXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IHZlY3RvciB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGhvZCdzIHJlc3VsdC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBUaGUgaXJyYWRpYW5jZS5cclxuXHQgKi9cclxuXHRnZXRJcnJhZGlhbmNlQXQoIG5vcm1hbCwgdGFyZ2V0ICkge1xyXG5cclxuXHRcdC8vIG5vcm1hbCBpcyBhc3N1bWVkIHRvIGJlIHVuaXQgbGVuZ3RoXHJcblxyXG5cdFx0Y29uc3QgeCA9IG5vcm1hbC54LCB5ID0gbm9ybWFsLnksIHogPSBub3JtYWwuejtcclxuXHJcblx0XHRjb25zdCBjb2VmZiA9IHRoaXMuY29lZmZpY2llbnRzO1xyXG5cclxuXHRcdC8vIGJhbmQgMFxyXG5cdFx0dGFyZ2V0LmNvcHkoIGNvZWZmWyAwIF0gKS5tdWx0aXBseVNjYWxhciggMC44ODYyMjcgKTsgLy8gz4AgKiAwLjI4MjA5NVxyXG5cclxuXHRcdC8vIGJhbmQgMVxyXG5cdFx0dGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggY29lZmZbIDEgXSwgMi4wICogMC41MTE2NjQgKiB5ICk7IC8vICggMiAqIM+AIC8gMyApICogMC40ODg2MDNcclxuXHRcdHRhcmdldC5hZGRTY2FsZWRWZWN0b3IoIGNvZWZmWyAyIF0sIDIuMCAqIDAuNTExNjY0ICogeiApO1xyXG5cdFx0dGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggY29lZmZbIDMgXSwgMi4wICogMC41MTE2NjQgKiB4ICk7XHJcblxyXG5cdFx0Ly8gYmFuZCAyXHJcblx0XHR0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKCBjb2VmZlsgNCBdLCAyLjAgKiAwLjQyOTA0MyAqIHggKiB5ICk7IC8vICggz4AgLyA0ICkgKiAxLjA5MjU0OFxyXG5cdFx0dGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggY29lZmZbIDUgXSwgMi4wICogMC40MjkwNDMgKiB5ICogeiApO1xyXG5cdFx0dGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggY29lZmZbIDYgXSwgMC43NDMxMjUgKiB6ICogeiAtIDAuMjQ3NzA4ICk7IC8vICggz4AgLyA0ICkgKiAwLjMxNTM5MiAqIDNcclxuXHRcdHRhcmdldC5hZGRTY2FsZWRWZWN0b3IoIGNvZWZmWyA3IF0sIDIuMCAqIDAuNDI5MDQzICogeCAqIHogKTtcclxuXHRcdHRhcmdldC5hZGRTY2FsZWRWZWN0b3IoIGNvZWZmWyA4IF0sIDAuNDI5MDQzICogKCB4ICogeCAtIHkgKiB5ICkgKTsgLy8gKCDPgCAvIDQgKSAqIDAuNTQ2Mjc0XHJcblxyXG5cdFx0cmV0dXJuIHRhcmdldDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIHRoZSBnaXZlbiBTSCB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTcGhlcmljYWxIYXJtb25pY3MzfSBzaCAtIFRoZSBTSCB0byBhZGQuXHJcblx0ICogQHJldHVybiB7U3BoZXJpY2FsSGFybW9uaWNzM30gQSByZWZlcmVuY2UgdG8gdGhpcyBzcGhlcmljYWwgaGFybW9uaWNzLlxyXG5cdCAqL1xyXG5cdGFkZCggc2ggKSB7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgOTsgaSArKyApIHtcclxuXHJcblx0XHRcdHRoaXMuY29lZmZpY2llbnRzWyBpIF0uYWRkKCBzaC5jb2VmZmljaWVudHNbIGkgXSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBIGNvbnZlbmllbmNlIG1ldGhvZCBmb3IgcGVyZm9ybWluZyB7QGxpbmsgU3BoZXJpY2FsSGFybW9uaWNzMyNhZGR9IGFuZFxyXG5cdCAqIHtAbGluayBTcGhlcmljYWxIYXJtb25pY3MzI3NjYWxlfSBhdCBvbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTcGhlcmljYWxIYXJtb25pY3MzfSBzaCAtIFRoZSBTSCB0byBhZGQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHMgLSBUaGUgc2NhbGUgZmFjdG9yLlxyXG5cdCAqIEByZXR1cm4ge1NwaGVyaWNhbEhhcm1vbmljczN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgc3BoZXJpY2FsIGhhcm1vbmljcy5cclxuXHQgKi9cclxuXHRhZGRTY2FsZWRTSCggc2gsIHMgKSB7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgOTsgaSArKyApIHtcclxuXHJcblx0XHRcdHRoaXMuY29lZmZpY2llbnRzWyBpIF0uYWRkU2NhbGVkVmVjdG9yKCBzaC5jb2VmZmljaWVudHNbIGkgXSwgcyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTY2FsZXMgdGhpcyBTSCBieSB0aGUgZ2l2ZW4gc2NhbGUgZmFjdG9yLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHMgLSBUaGUgc2NhbGUgZmFjdG9yLlxyXG5cdCAqIEByZXR1cm4ge1NwaGVyaWNhbEhhcm1vbmljczN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgc3BoZXJpY2FsIGhhcm1vbmljcy5cclxuXHQgKi9cclxuXHRzY2FsZSggcyApIHtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCA5OyBpICsrICkge1xyXG5cclxuXHRcdFx0dGhpcy5jb2VmZmljaWVudHNbIGkgXS5tdWx0aXBseVNjYWxhciggcyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBMaW5lYXIgaW50ZXJwb2xhdGVzIGJldHdlZW4gdGhlIGdpdmVuIFNIIGFuZCB0aGlzIGluc3RhbmNlIGJ5IHRoZSBnaXZlblxyXG5cdCAqIGFscGhhIGZhY3Rvci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7U3BoZXJpY2FsSGFybW9uaWNzM30gc2ggLSBUaGUgU0ggdG8gaW50ZXJwb2xhdGUgd2l0aC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYWxwaGEgLSBUaGUgYWxwaGEgZmFjdG9yLlxyXG5cdCAqIEByZXR1cm4ge1NwaGVyaWNhbEhhcm1vbmljczN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgc3BoZXJpY2FsIGhhcm1vbmljcy5cclxuXHQgKi9cclxuXHRsZXJwKCBzaCwgYWxwaGEgKSB7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgOTsgaSArKyApIHtcclxuXHJcblx0XHRcdHRoaXMuY29lZmZpY2llbnRzWyBpIF0ubGVycCggc2guY29lZmZpY2llbnRzWyBpIF0sIGFscGhhICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgc3BoZXJpY2FsIGhhcm1vbmljcyBpcyBlcXVhbCB3aXRoIHRoZSBnaXZlbiBvbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1NwaGVyaWNhbEhhcm1vbmljczN9IHNoIC0gVGhlIHNwaGVyaWNhbCBoYXJtb25pY3MgdG8gdGVzdCBmb3IgZXF1YWxpdHkuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGlzIHNwaGVyaWNhbCBoYXJtb25pY3MgaXMgZXF1YWwgd2l0aCB0aGUgZ2l2ZW4gb25lLlxyXG5cdCAqL1xyXG5cdGVxdWFscyggc2ggKSB7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgOTsgaSArKyApIHtcclxuXHJcblx0XHRcdGlmICggISB0aGlzLmNvZWZmaWNpZW50c1sgaSBdLmVxdWFscyggc2guY29lZmZpY2llbnRzWyBpIF0gKSApIHtcclxuXHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gc3BoZXJpY2FsIGhhcm1vbmljcyB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTcGhlcmljYWxIYXJtb25pY3MzfSBzaCAtIFRoZSBzcGhlcmljYWwgaGFybW9uaWNzIHRvIGNvcHkuXHJcblx0ICogQHJldHVybiB7U3BoZXJpY2FsSGFybW9uaWNzM30gQSByZWZlcmVuY2UgdG8gdGhpcyBzcGhlcmljYWwgaGFybW9uaWNzLlxyXG5cdCAqL1xyXG5cdGNvcHkoIHNoICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnNldCggc2guY29lZmZpY2llbnRzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIG5ldyBzcGhlcmljYWwgaGFybW9uaWNzIHdpdGggY29waWVkIHZhbHVlcyBmcm9tIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtTcGhlcmljYWxIYXJtb25pY3MzfSBBIGNsb25lIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y2xvbmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIFNIIGNvZWZmaWNpZW50cyBvZiB0aGlzIGluc3RhbmNlIGZyb20gdGhlIGdpdmVuIGFycmF5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBhcnJheSAtIEFuIGFycmF5IGhvbGRpbmcgdGhlIFNIIGNvZWZmaWNpZW50cy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW29mZnNldD0wXSAtIFRoZSBhcnJheSBvZmZzZXQgd2hlcmUgdG8gc3RhcnQgY29weWluZy5cclxuXHQgKiBAcmV0dXJuIHtTcGhlcmljYWxIYXJtb25pY3MzfSBBIGNsb25lIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0ZnJvbUFycmF5KCBhcnJheSwgb2Zmc2V0ID0gMCApIHtcclxuXHJcblx0XHRjb25zdCBjb2VmZmljaWVudHMgPSB0aGlzLmNvZWZmaWNpZW50cztcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCA5OyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29lZmZpY2llbnRzWyBpIF0uZnJvbUFycmF5KCBhcnJheSwgb2Zmc2V0ICsgKCBpICogMyApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYW4gYXJyYXkgd2l0aCB0aGUgU0ggY29lZmZpY2llbnRzLCBvciBjb3BpZXMgdGhlbSBpbnRvIHRoZSBwcm92aWRlZFxyXG5cdCAqIGFycmF5LiBUaGUgY29lZmZpY2llbnRzIGFyZSByZXByZXNlbnRlZCBhcyBudW1iZXJzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBbYXJyYXk9W11dIC0gVGhlIHRhcmdldCBhcnJheS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW29mZnNldD0wXSAtIFRoZSBhcnJheSBvZmZzZXQgd2hlcmUgdG8gc3RhcnQgY29weWluZy5cclxuXHQgKiBAcmV0dXJuIHtBcnJheTxudW1iZXI+fSBBbiBhcnJheSB3aXRoIGZsYXQgU0ggY29lZmZpY2llbnRzLlxyXG5cdCAqL1xyXG5cdHRvQXJyYXkoIGFycmF5ID0gW10sIG9mZnNldCA9IDAgKSB7XHJcblxyXG5cdFx0Y29uc3QgY29lZmZpY2llbnRzID0gdGhpcy5jb2VmZmljaWVudHM7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgOTsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvZWZmaWNpZW50c1sgaSBdLnRvQXJyYXkoIGFycmF5LCBvZmZzZXQgKyAoIGkgKiAzICkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGFycmF5O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSBTSCBiYXNpcyBmb3IgdGhlIGdpdmVuIG5vcm1hbCB2ZWN0b3IuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IG5vcm1hbCAtIFRoZSBub3JtYWwuXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBzaEJhc2lzIC0gVGhlIHRhcmdldCBhcnJheSBob2xkaW5nIHRoZSBTSCBiYXNpcy5cclxuXHQgKi9cclxuXHRzdGF0aWMgZ2V0QmFzaXNBdCggbm9ybWFsLCBzaEJhc2lzICkge1xyXG5cclxuXHRcdC8vIG5vcm1hbCBpcyBhc3N1bWVkIHRvIGJlIHVuaXQgbGVuZ3RoXHJcblxyXG5cdFx0Y29uc3QgeCA9IG5vcm1hbC54LCB5ID0gbm9ybWFsLnksIHogPSBub3JtYWwuejtcclxuXHJcblx0XHQvLyBiYW5kIDBcclxuXHRcdHNoQmFzaXNbIDAgXSA9IDAuMjgyMDk1O1xyXG5cclxuXHRcdC8vIGJhbmQgMVxyXG5cdFx0c2hCYXNpc1sgMSBdID0gMC40ODg2MDMgKiB5O1xyXG5cdFx0c2hCYXNpc1sgMiBdID0gMC40ODg2MDMgKiB6O1xyXG5cdFx0c2hCYXNpc1sgMyBdID0gMC40ODg2MDMgKiB4O1xyXG5cclxuXHRcdC8vIGJhbmQgMlxyXG5cdFx0c2hCYXNpc1sgNCBdID0gMS4wOTI1NDggKiB4ICogeTtcclxuXHRcdHNoQmFzaXNbIDUgXSA9IDEuMDkyNTQ4ICogeSAqIHo7XHJcblx0XHRzaEJhc2lzWyA2IF0gPSAwLjMxNTM5MiAqICggMyAqIHogKiB6IC0gMSApO1xyXG5cdFx0c2hCYXNpc1sgNyBdID0gMS4wOTI1NDggKiB4ICogejtcclxuXHRcdHNoQmFzaXNbIDggXSA9IDAuNTQ2Mjc0ICogKCB4ICogeCAtIHkgKiB5ICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFNwaGVyaWNhbEhhcm1vbmljczMgfTtcclxuIiwiaW1wb3J0IHsgU3BoZXJpY2FsSGFybW9uaWNzMyB9IGZyb20gJy4uL21hdGgvU3BoZXJpY2FsSGFybW9uaWNzMy5qcyc7XHJcbmltcG9ydCB7IExpZ2h0IH0gZnJvbSAnLi9MaWdodC5qcyc7XHJcblxyXG4vKipcclxuICogTGlnaHQgcHJvYmVzIGFyZSBhbiBhbHRlcm5hdGl2ZSB3YXkgb2YgYWRkaW5nIGxpZ2h0IHRvIGEgM0Qgc2NlbmUuIFVubGlrZVxyXG4gKiBjbGFzc2ljYWwgbGlnaHQgc291cmNlcyAoZS5nLiBkaXJlY3Rpb25hbCwgcG9pbnQgb3Igc3BvdCBsaWdodHMpLCBsaWdodFxyXG4gKiBwcm9iZXMgZG8gbm90IGVtaXQgbGlnaHQuIEluc3RlYWQgdGhleSBzdG9yZSBpbmZvcm1hdGlvbiBhYm91dCBsaWdodFxyXG4gKiBwYXNzaW5nIHRocm91Z2ggM0Qgc3BhY2UuIER1cmluZyByZW5kZXJpbmcsIHRoZSBsaWdodCB0aGF0IGhpdHMgYSAzRFxyXG4gKiBvYmplY3QgaXMgYXBwcm94aW1hdGVkIGJ5IHVzaW5nIHRoZSBkYXRhIGZyb20gdGhlIGxpZ2h0IHByb2JlLlxyXG4gKlxyXG4gKiBMaWdodCBwcm9iZXMgYXJlIHVzdWFsbHkgY3JlYXRlZCBmcm9tIChyYWRpYW5jZSkgZW52aXJvbm1lbnQgbWFwcy4gVGhlXHJcbiAqIGNsYXNzIHtAbGluayBMaWdodFByb2JlR2VuZXJhdG9yfSBjYW4gYmUgdXNlZCB0byBjcmVhdGUgbGlnaHQgcHJvYmVzIGZyb21cclxuICogY3ViZSB0ZXh0dXJlcyBvciByZW5kZXIgdGFyZ2V0cy4gSG93ZXZlciwgbGlnaHQgZXN0aW1hdGlvbiBkYXRhIGNvdWxkIGFsc29cclxuICogYmUgcHJvdmlkZWQgaW4gb3RoZXIgZm9ybXMgZS5nLiBieSBXZWJYUi4gVGhpcyBlbmFibGVzIHRoZSByZW5kZXJpbmcgb2ZcclxuICogYXVnbWVudGVkIHJlYWxpdHkgY29udGVudCB0aGF0IHJlYWN0cyB0byByZWFsIHdvcmxkIGxpZ2h0aW5nLlxyXG4gKlxyXG4gKiBUaGUgY3VycmVudCBwcm9iZSBpbXBsZW1lbnRhdGlvbiBpbiB0aHJlZS5qcyBzdXBwb3J0cyBzby1jYWxsZWQgZGlmZnVzZVxyXG4gKiBsaWdodCBwcm9iZXMuIFRoaXMgdHlwZSBvZiBsaWdodCBwcm9iZSBpcyBmdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBhblxyXG4gKiBpcnJhZGlhbmNlIGVudmlyb25tZW50IG1hcC5cclxuICpcclxuICogQGF1Z21lbnRzIExpZ2h0XHJcbiAqL1xyXG5jbGFzcyBMaWdodFByb2JlIGV4dGVuZHMgTGlnaHQge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGxpZ2h0IHByb2JlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTcGhlcmljYWxIYXJtb25pY3MzfSBzaCAtIFRoZSBzcGhlcmljYWwgaGFybW9uaWNzIHdoaWNoIHJlcHJlc2VudHMgZW5jb2RlZCBsaWdodGluZyBpbmZvcm1hdGlvbi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2ludGVuc2l0eT0xXSAtIFRoZSBsaWdodCdzIHN0cmVuZ3RoL2ludGVuc2l0eS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggc2ggPSBuZXcgU3BoZXJpY2FsSGFybW9uaWNzMygpLCBpbnRlbnNpdHkgPSAxICkge1xyXG5cclxuXHRcdHN1cGVyKCB1bmRlZmluZWQsIGludGVuc2l0eSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0xpZ2h0UHJvYmUgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBsaWdodCBwcm9iZSB1c2VzIHNwaGVyaWNhbCBoYXJtb25pY3MgdG8gZW5jb2RlIGxpZ2h0aW5nIGluZm9ybWF0aW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtTcGhlcmljYWxIYXJtb25pY3MzfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNoID0gc2g7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMuc2guY29weSggc291cmNlLnNoICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVzZXJpYWxpemVzIHRoZSBsaWdodCBwcm92ZSBmcm9tIHRoZSBnaXZlbiBKU09OLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGpzb24gLSBUaGUgSlNPTiBob2xkaW5nIHRoZSBzZXJpYWxpemVkIGxpZ2h0IHByb2JlLlxyXG5cdCAqIEByZXR1cm4ge0xpZ2h0UHJvYmV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbGlnaHQgcHJvYmUuXHJcblx0ICovXHJcblx0ZnJvbUpTT04oIGpzb24gKSB7XHJcblxyXG5cdFx0dGhpcy5pbnRlbnNpdHkgPSBqc29uLmludGVuc2l0eTsgLy8gVE9ETzogTW92ZSB0aGlzIGJpdCB0byBMaWdodC5mcm9tSlNPTigpO1xyXG5cdFx0dGhpcy5zaC5mcm9tQXJyYXkoIGpzb24uc2ggKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHR0b0pTT04oIG1ldGEgKSB7XHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IHN1cGVyLnRvSlNPTiggbWV0YSApO1xyXG5cclxuXHRcdGRhdGEub2JqZWN0LnNoID0gdGhpcy5zaC50b0FycmF5KCk7XHJcblxyXG5cdFx0cmV0dXJuIGRhdGE7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IExpZ2h0UHJvYmUgfTtcclxuIiwiaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi9tYXRoL0NvbG9yLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uL21hdGgvVmVjdG9yMi5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3I0IH0gZnJvbSAnLi4vbWF0aC9WZWN0b3I0LmpzJztcclxuaW1wb3J0IHsgTWF0cml4MyB9IGZyb20gJy4uL21hdGgvTWF0cml4My5qcyc7XHJcbmltcG9ydCB7IE1hdHJpeDQgfSBmcm9tICcuLi9tYXRoL01hdHJpeDQuanMnO1xyXG5pbXBvcnQgeyBGaWxlTG9hZGVyIH0gZnJvbSAnLi9GaWxlTG9hZGVyLmpzJztcclxuaW1wb3J0IHsgTG9hZGVyIH0gZnJvbSAnLi9Mb2FkZXIuanMnO1xyXG5pbXBvcnQge1xyXG5cdFNoYWRvd01hdGVyaWFsLFxyXG5cdFNwcml0ZU1hdGVyaWFsLFxyXG5cdFJhd1NoYWRlck1hdGVyaWFsLFxyXG5cdFNoYWRlck1hdGVyaWFsLFxyXG5cdFBvaW50c01hdGVyaWFsLFxyXG5cdE1lc2hQaHlzaWNhbE1hdGVyaWFsLFxyXG5cdE1lc2hTdGFuZGFyZE1hdGVyaWFsLFxyXG5cdE1lc2hQaG9uZ01hdGVyaWFsLFxyXG5cdE1lc2hUb29uTWF0ZXJpYWwsXHJcblx0TWVzaE5vcm1hbE1hdGVyaWFsLFxyXG5cdE1lc2hMYW1iZXJ0TWF0ZXJpYWwsXHJcblx0TWVzaERlcHRoTWF0ZXJpYWwsXHJcblx0TWVzaERpc3RhbmNlTWF0ZXJpYWwsXHJcblx0TWVzaEJhc2ljTWF0ZXJpYWwsXHJcblx0TWVzaE1hdGNhcE1hdGVyaWFsLFxyXG5cdExpbmVEYXNoZWRNYXRlcmlhbCxcclxuXHRMaW5lQmFzaWNNYXRlcmlhbCxcclxuXHRNYXRlcmlhbCxcclxufSBmcm9tICcuLi9tYXRlcmlhbHMvTWF0ZXJpYWxzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBDbGFzcyBmb3IgbG9hZGluZyBnZW9tZXRyaWVzLiBUaGUgZmlsZXMgYXJlIGludGVybmFsbHlcclxuICogbG9hZGVkIHZpYSB7QGxpbmsgRmlsZUxvYWRlcn0uXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGxvYWRlciA9IG5ldyBUSFJFRS5NYXRlcmlhbExvYWRlcigpO1xyXG4gKiBjb25zdCBtYXRlcmlhbCA9IGF3YWl0IGxvYWRlci5sb2FkQXN5bmMoICdtYXRlcmlhbC5qc29uJyApO1xyXG4gKiBgYGBcclxuICogVGhpcyBsb2FkZXIgZG9lcyBub3Qgc3VwcG9ydCBub2RlIG1hdGVyaWFscy4gVXNlIHtAbGluayBOb2RlTWF0ZXJpYWxMb2FkZXJ9IGluc3RlYWQuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBMb2FkZXJcclxuICovXHJcbmNsYXNzIE1hdGVyaWFsTG9hZGVyIGV4dGVuZHMgTG9hZGVyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBtYXRlcmlhbCBsb2FkZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0xvYWRpbmdNYW5hZ2VyfSBbbWFuYWdlcl0gLSBUaGUgbG9hZGluZyBtYW5hZ2VyLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBtYW5hZ2VyICkge1xyXG5cclxuXHRcdHN1cGVyKCBtYW5hZ2VyICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGRpY3Rpb25hcnkgaG9sZGluZyB0ZXh0dXJlcyB1c2VkIGJ5IHRoZSBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0PHN0cmluZyxUZXh0dXJlPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50ZXh0dXJlcyA9IHt9O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFN0YXJ0cyBsb2FkaW5nIGZyb20gdGhlIGdpdmVuIFVSTCBhbmQgcGFzcyB0aGUgbG9hZGVkIG1hdGVyaWFsIHRvIHRoZSBgb25Mb2FkKClgIGNhbGxiYWNrLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIFRoZSBwYXRoL1VSTCBvZiB0aGUgZmlsZSB0byBiZSBsb2FkZWQuIFRoaXMgY2FuIGFsc28gYmUgYSBkYXRhIFVSSS5cclxuXHQgKiBAcGFyYW0ge2Z1bmN0aW9uKE1hdGVyaWFsKX0gb25Mb2FkIC0gRXhlY3V0ZWQgd2hlbiB0aGUgbG9hZGluZyBwcm9jZXNzIGhhcyBiZWVuIGZpbmlzaGVkLlxyXG5cdCAqIEBwYXJhbSB7b25Qcm9ncmVzc0NhbGxiYWNrfSBvblByb2dyZXNzIC0gRXhlY3V0ZWQgd2hpbGUgdGhlIGxvYWRpbmcgaXMgaW4gcHJvZ3Jlc3MuXHJcblx0ICogQHBhcmFtIHtvbkVycm9yQ2FsbGJhY2t9IG9uRXJyb3IgLSBFeGVjdXRlZCB3aGVuIGVycm9ycyBvY2N1ci5cclxuXHQgKi9cclxuXHRsb2FkKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcclxuXHJcblx0XHRjb25zdCBzY29wZSA9IHRoaXM7XHJcblxyXG5cdFx0Y29uc3QgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIoIHNjb3BlLm1hbmFnZXIgKTtcclxuXHRcdGxvYWRlci5zZXRQYXRoKCBzY29wZS5wYXRoICk7XHJcblx0XHRsb2FkZXIuc2V0UmVxdWVzdEhlYWRlciggc2NvcGUucmVxdWVzdEhlYWRlciApO1xyXG5cdFx0bG9hZGVyLnNldFdpdGhDcmVkZW50aWFscyggc2NvcGUud2l0aENyZWRlbnRpYWxzICk7XHJcblx0XHRsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoIHRleHQgKSB7XHJcblxyXG5cdFx0XHR0cnkge1xyXG5cclxuXHRcdFx0XHRvbkxvYWQoIHNjb3BlLnBhcnNlKCBKU09OLnBhcnNlKCB0ZXh0ICkgKSApO1xyXG5cclxuXHRcdFx0fSBjYXRjaCAoIGUgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggb25FcnJvciApIHtcclxuXHJcblx0XHRcdFx0XHRvbkVycm9yKCBlICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvciggZSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVycm9yKCB1cmwgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9LCBvblByb2dyZXNzLCBvbkVycm9yICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUGFyc2VzIHRoZSBnaXZlbiBKU09OIG9iamVjdCBhbmQgcmV0dXJucyBhIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGpzb24gLSBUaGUgc2VyaWFsaXplZCBtYXRlcmlhbC5cclxuXHQgKiBAcmV0dXJuIHtNYXRlcmlhbH0gVGhlIHBhcnNlZCBtYXRlcmlhbC5cclxuXHQgKi9cclxuXHRwYXJzZSgganNvbiApIHtcclxuXHJcblx0XHRjb25zdCB0ZXh0dXJlcyA9IHRoaXMudGV4dHVyZXM7XHJcblxyXG5cdFx0ZnVuY3Rpb24gZ2V0VGV4dHVyZSggbmFtZSApIHtcclxuXHJcblx0XHRcdGlmICggdGV4dHVyZXNbIG5hbWUgXSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRlcmlhbExvYWRlcjogVW5kZWZpbmVkIHRleHR1cmUnLCBuYW1lICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gdGV4dHVyZXNbIG5hbWUgXTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgbWF0ZXJpYWwgPSB0aGlzLmNyZWF0ZU1hdGVyaWFsRnJvbVR5cGUoIGpzb24udHlwZSApO1xyXG5cclxuXHRcdGlmICgganNvbi51dWlkICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC51dWlkID0ganNvbi51dWlkO1xyXG5cdFx0aWYgKCBqc29uLm5hbWUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm5hbWUgPSBqc29uLm5hbWU7XHJcblx0XHRpZiAoIGpzb24uY29sb3IgIT09IHVuZGVmaW5lZCAmJiBtYXRlcmlhbC5jb2xvciAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuY29sb3Iuc2V0SGV4KCBqc29uLmNvbG9yICk7XHJcblx0XHRpZiAoIGpzb24ucm91Z2huZXNzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5yb3VnaG5lc3MgPSBqc29uLnJvdWdobmVzcztcclxuXHRcdGlmICgganNvbi5tZXRhbG5lc3MgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm1ldGFsbmVzcyA9IGpzb24ubWV0YWxuZXNzO1xyXG5cdFx0aWYgKCBqc29uLnNoZWVuICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zaGVlbiA9IGpzb24uc2hlZW47XHJcblx0XHRpZiAoIGpzb24uc2hlZW5Db2xvciAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc2hlZW5Db2xvciA9IG5ldyBDb2xvcigpLnNldEhleCgganNvbi5zaGVlbkNvbG9yICk7XHJcblx0XHRpZiAoIGpzb24uc2hlZW5Sb3VnaG5lc3MgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNoZWVuUm91Z2huZXNzID0ganNvbi5zaGVlblJvdWdobmVzcztcclxuXHRcdGlmICgganNvbi5lbWlzc2l2ZSAhPT0gdW5kZWZpbmVkICYmIG1hdGVyaWFsLmVtaXNzaXZlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5lbWlzc2l2ZS5zZXRIZXgoIGpzb24uZW1pc3NpdmUgKTtcclxuXHRcdGlmICgganNvbi5zcGVjdWxhciAhPT0gdW5kZWZpbmVkICYmIG1hdGVyaWFsLnNwZWN1bGFyICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zcGVjdWxhci5zZXRIZXgoIGpzb24uc3BlY3VsYXIgKTtcclxuXHRcdGlmICgganNvbi5zcGVjdWxhckludGVuc2l0eSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc3BlY3VsYXJJbnRlbnNpdHkgPSBqc29uLnNwZWN1bGFySW50ZW5zaXR5O1xyXG5cdFx0aWYgKCBqc29uLnNwZWN1bGFyQ29sb3IgIT09IHVuZGVmaW5lZCAmJiBtYXRlcmlhbC5zcGVjdWxhckNvbG9yICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLnNldEhleCgganNvbi5zcGVjdWxhckNvbG9yICk7XHJcblx0XHRpZiAoIGpzb24uc2hpbmluZXNzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zaGluaW5lc3MgPSBqc29uLnNoaW5pbmVzcztcclxuXHRcdGlmICgganNvbi5jbGVhcmNvYXQgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmNsZWFyY29hdCA9IGpzb24uY2xlYXJjb2F0O1xyXG5cdFx0aWYgKCBqc29uLmNsZWFyY29hdFJvdWdobmVzcyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzID0ganNvbi5jbGVhcmNvYXRSb3VnaG5lc3M7XHJcblx0XHRpZiAoIGpzb24uZGlzcGVyc2lvbiAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGlzcGVyc2lvbiA9IGpzb24uZGlzcGVyc2lvbjtcclxuXHRcdGlmICgganNvbi5pcmlkZXNjZW5jZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuaXJpZGVzY2VuY2UgPSBqc29uLmlyaWRlc2NlbmNlO1xyXG5cdFx0aWYgKCBqc29uLmlyaWRlc2NlbmNlSU9SICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5pcmlkZXNjZW5jZUlPUiA9IGpzb24uaXJpZGVzY2VuY2VJT1I7XHJcblx0XHRpZiAoIGpzb24uaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZSA9IGpzb24uaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZTtcclxuXHRcdGlmICgganNvbi50cmFuc21pc3Npb24gIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnRyYW5zbWlzc2lvbiA9IGpzb24udHJhbnNtaXNzaW9uO1xyXG5cdFx0aWYgKCBqc29uLnRoaWNrbmVzcyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwudGhpY2tuZXNzID0ganNvbi50aGlja25lc3M7XHJcblx0XHRpZiAoIGpzb24uYXR0ZW51YXRpb25EaXN0YW5jZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYXR0ZW51YXRpb25EaXN0YW5jZSA9IGpzb24uYXR0ZW51YXRpb25EaXN0YW5jZTtcclxuXHRcdGlmICgganNvbi5hdHRlbnVhdGlvbkNvbG9yICE9PSB1bmRlZmluZWQgJiYgbWF0ZXJpYWwuYXR0ZW51YXRpb25Db2xvciAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYXR0ZW51YXRpb25Db2xvci5zZXRIZXgoIGpzb24uYXR0ZW51YXRpb25Db2xvciApO1xyXG5cdFx0aWYgKCBqc29uLmFuaXNvdHJvcHkgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmFuaXNvdHJvcHkgPSBqc29uLmFuaXNvdHJvcHk7XHJcblx0XHRpZiAoIGpzb24uYW5pc290cm9weVJvdGF0aW9uICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5hbmlzb3Ryb3B5Um90YXRpb24gPSBqc29uLmFuaXNvdHJvcHlSb3RhdGlvbjtcclxuXHRcdGlmICgganNvbi5mb2cgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmZvZyA9IGpzb24uZm9nO1xyXG5cdFx0aWYgKCBqc29uLmZsYXRTaGFkaW5nICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5mbGF0U2hhZGluZyA9IGpzb24uZmxhdFNoYWRpbmc7XHJcblx0XHRpZiAoIGpzb24uYmxlbmRpbmcgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmJsZW5kaW5nID0ganNvbi5ibGVuZGluZztcclxuXHRcdGlmICgganNvbi5jb21iaW5lICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5jb21iaW5lID0ganNvbi5jb21iaW5lO1xyXG5cdFx0aWYgKCBqc29uLnNpZGUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNpZGUgPSBqc29uLnNpZGU7XHJcblx0XHRpZiAoIGpzb24uc2hhZG93U2lkZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc2hhZG93U2lkZSA9IGpzb24uc2hhZG93U2lkZTtcclxuXHRcdGlmICgganNvbi5vcGFjaXR5ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5vcGFjaXR5ID0ganNvbi5vcGFjaXR5O1xyXG5cdFx0aWYgKCBqc29uLnRyYW5zcGFyZW50ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC50cmFuc3BhcmVudCA9IGpzb24udHJhbnNwYXJlbnQ7XHJcblx0XHRpZiAoIGpzb24uYWxwaGFUZXN0ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5hbHBoYVRlc3QgPSBqc29uLmFscGhhVGVzdDtcclxuXHRcdGlmICgganNvbi5hbHBoYUhhc2ggIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmFscGhhSGFzaCA9IGpzb24uYWxwaGFIYXNoO1xyXG5cdFx0aWYgKCBqc29uLmRlcHRoRnVuYyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGVwdGhGdW5jID0ganNvbi5kZXB0aEZ1bmM7XHJcblx0XHRpZiAoIGpzb24uZGVwdGhUZXN0ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5kZXB0aFRlc3QgPSBqc29uLmRlcHRoVGVzdDtcclxuXHRcdGlmICgganNvbi5kZXB0aFdyaXRlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5kZXB0aFdyaXRlID0ganNvbi5kZXB0aFdyaXRlO1xyXG5cdFx0aWYgKCBqc29uLmNvbG9yV3JpdGUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmNvbG9yV3JpdGUgPSBqc29uLmNvbG9yV3JpdGU7XHJcblx0XHRpZiAoIGpzb24uYmxlbmRTcmMgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmJsZW5kU3JjID0ganNvbi5ibGVuZFNyYztcclxuXHRcdGlmICgganNvbi5ibGVuZERzdCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYmxlbmREc3QgPSBqc29uLmJsZW5kRHN0O1xyXG5cdFx0aWYgKCBqc29uLmJsZW5kRXF1YXRpb24gIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmJsZW5kRXF1YXRpb24gPSBqc29uLmJsZW5kRXF1YXRpb247XHJcblx0XHRpZiAoIGpzb24uYmxlbmRTcmNBbHBoYSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYmxlbmRTcmNBbHBoYSA9IGpzb24uYmxlbmRTcmNBbHBoYTtcclxuXHRcdGlmICgganNvbi5ibGVuZERzdEFscGhhICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5ibGVuZERzdEFscGhhID0ganNvbi5ibGVuZERzdEFscGhhO1xyXG5cdFx0aWYgKCBqc29uLmJsZW5kRXF1YXRpb25BbHBoYSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYmxlbmRFcXVhdGlvbkFscGhhID0ganNvbi5ibGVuZEVxdWF0aW9uQWxwaGE7XHJcblx0XHRpZiAoIGpzb24uYmxlbmRDb2xvciAhPT0gdW5kZWZpbmVkICYmIG1hdGVyaWFsLmJsZW5kQ29sb3IgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmJsZW5kQ29sb3Iuc2V0SGV4KCBqc29uLmJsZW5kQ29sb3IgKTtcclxuXHRcdGlmICgganNvbi5ibGVuZEFscGhhICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5ibGVuZEFscGhhID0ganNvbi5ibGVuZEFscGhhO1xyXG5cdFx0aWYgKCBqc29uLnN0ZW5jaWxXcml0ZU1hc2sgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnN0ZW5jaWxXcml0ZU1hc2sgPSBqc29uLnN0ZW5jaWxXcml0ZU1hc2s7XHJcblx0XHRpZiAoIGpzb24uc3RlbmNpbEZ1bmMgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnN0ZW5jaWxGdW5jID0ganNvbi5zdGVuY2lsRnVuYztcclxuXHRcdGlmICgganNvbi5zdGVuY2lsUmVmICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zdGVuY2lsUmVmID0ganNvbi5zdGVuY2lsUmVmO1xyXG5cdFx0aWYgKCBqc29uLnN0ZW5jaWxGdW5jTWFzayAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc3RlbmNpbEZ1bmNNYXNrID0ganNvbi5zdGVuY2lsRnVuY01hc2s7XHJcblx0XHRpZiAoIGpzb24uc3RlbmNpbEZhaWwgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnN0ZW5jaWxGYWlsID0ganNvbi5zdGVuY2lsRmFpbDtcclxuXHRcdGlmICgganNvbi5zdGVuY2lsWkZhaWwgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnN0ZW5jaWxaRmFpbCA9IGpzb24uc3RlbmNpbFpGYWlsO1xyXG5cdFx0aWYgKCBqc29uLnN0ZW5jaWxaUGFzcyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc3RlbmNpbFpQYXNzID0ganNvbi5zdGVuY2lsWlBhc3M7XHJcblx0XHRpZiAoIGpzb24uc3RlbmNpbFdyaXRlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zdGVuY2lsV3JpdGUgPSBqc29uLnN0ZW5jaWxXcml0ZTtcclxuXHJcblx0XHRpZiAoIGpzb24ud2lyZWZyYW1lICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC53aXJlZnJhbWUgPSBqc29uLndpcmVmcmFtZTtcclxuXHRcdGlmICgganNvbi53aXJlZnJhbWVMaW5ld2lkdGggIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLndpcmVmcmFtZUxpbmV3aWR0aCA9IGpzb24ud2lyZWZyYW1lTGluZXdpZHRoO1xyXG5cdFx0aWYgKCBqc29uLndpcmVmcmFtZUxpbmVjYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLndpcmVmcmFtZUxpbmVjYXAgPSBqc29uLndpcmVmcmFtZUxpbmVjYXA7XHJcblx0XHRpZiAoIGpzb24ud2lyZWZyYW1lTGluZWpvaW4gIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLndpcmVmcmFtZUxpbmVqb2luID0ganNvbi53aXJlZnJhbWVMaW5lam9pbjtcclxuXHJcblx0XHRpZiAoIGpzb24ucm90YXRpb24gIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnJvdGF0aW9uID0ganNvbi5yb3RhdGlvbjtcclxuXHJcblx0XHRpZiAoIGpzb24ubGluZXdpZHRoICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5saW5ld2lkdGggPSBqc29uLmxpbmV3aWR0aDtcclxuXHRcdGlmICgganNvbi5kYXNoU2l6ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGFzaFNpemUgPSBqc29uLmRhc2hTaXplO1xyXG5cdFx0aWYgKCBqc29uLmdhcFNpemUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmdhcFNpemUgPSBqc29uLmdhcFNpemU7XHJcblx0XHRpZiAoIGpzb24uc2NhbGUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNjYWxlID0ganNvbi5zY2FsZTtcclxuXHJcblx0XHRpZiAoIGpzb24ucG9seWdvbk9mZnNldCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwucG9seWdvbk9mZnNldCA9IGpzb24ucG9seWdvbk9mZnNldDtcclxuXHRcdGlmICgganNvbi5wb2x5Z29uT2Zmc2V0RmFjdG9yICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5wb2x5Z29uT2Zmc2V0RmFjdG9yID0ganNvbi5wb2x5Z29uT2Zmc2V0RmFjdG9yO1xyXG5cdFx0aWYgKCBqc29uLnBvbHlnb25PZmZzZXRVbml0cyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwucG9seWdvbk9mZnNldFVuaXRzID0ganNvbi5wb2x5Z29uT2Zmc2V0VW5pdHM7XHJcblxyXG5cdFx0aWYgKCBqc29uLmRpdGhlcmluZyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGl0aGVyaW5nID0ganNvbi5kaXRoZXJpbmc7XHJcblxyXG5cdFx0aWYgKCBqc29uLmFscGhhVG9Db3ZlcmFnZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYWxwaGFUb0NvdmVyYWdlID0ganNvbi5hbHBoYVRvQ292ZXJhZ2U7XHJcblx0XHRpZiAoIGpzb24ucHJlbXVsdGlwbGllZEFscGhhICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5wcmVtdWx0aXBsaWVkQWxwaGEgPSBqc29uLnByZW11bHRpcGxpZWRBbHBoYTtcclxuXHRcdGlmICgganNvbi5mb3JjZVNpbmdsZVBhc3MgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmZvcmNlU2luZ2xlUGFzcyA9IGpzb24uZm9yY2VTaW5nbGVQYXNzO1xyXG5cclxuXHRcdGlmICgganNvbi52aXNpYmxlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC52aXNpYmxlID0ganNvbi52aXNpYmxlO1xyXG5cclxuXHRcdGlmICgganNvbi50b25lTWFwcGVkICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC50b25lTWFwcGVkID0ganNvbi50b25lTWFwcGVkO1xyXG5cclxuXHRcdGlmICgganNvbi51c2VyRGF0YSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwudXNlckRhdGEgPSBqc29uLnVzZXJEYXRhO1xyXG5cclxuXHRcdGlmICgganNvbi52ZXJ0ZXhDb2xvcnMgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGlmICggdHlwZW9mIGpzb24udmVydGV4Q29sb3JzID09PSAnbnVtYmVyJyApIHtcclxuXHJcblx0XHRcdFx0bWF0ZXJpYWwudmVydGV4Q29sb3JzID0gKCBqc29uLnZlcnRleENvbG9ycyA+IDAgKSA/IHRydWUgOiBmYWxzZTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdG1hdGVyaWFsLnZlcnRleENvbG9ycyA9IGpzb24udmVydGV4Q29sb3JzO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBTaGFkZXIgTWF0ZXJpYWxcclxuXHJcblx0XHRpZiAoIGpzb24udW5pZm9ybXMgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGZvciAoIGNvbnN0IG5hbWUgaW4ganNvbi51bmlmb3JtcyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgdW5pZm9ybSA9IGpzb24udW5pZm9ybXNbIG5hbWUgXTtcclxuXHJcblx0XHRcdFx0bWF0ZXJpYWwudW5pZm9ybXNbIG5hbWUgXSA9IHt9O1xyXG5cclxuXHRcdFx0XHRzd2l0Y2ggKCB1bmlmb3JtLnR5cGUgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y2FzZSAndCc6XHJcblx0XHRcdFx0XHRcdG1hdGVyaWFsLnVuaWZvcm1zWyBuYW1lIF0udmFsdWUgPSBnZXRUZXh0dXJlKCB1bmlmb3JtLnZhbHVlICk7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgJ2MnOlxyXG5cdFx0XHRcdFx0XHRtYXRlcmlhbC51bmlmb3Jtc1sgbmFtZSBdLnZhbHVlID0gbmV3IENvbG9yKCkuc2V0SGV4KCB1bmlmb3JtLnZhbHVlICk7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgJ3YyJzpcclxuXHRcdFx0XHRcdFx0bWF0ZXJpYWwudW5pZm9ybXNbIG5hbWUgXS52YWx1ZSA9IG5ldyBWZWN0b3IyKCkuZnJvbUFycmF5KCB1bmlmb3JtLnZhbHVlICk7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgJ3YzJzpcclxuXHRcdFx0XHRcdFx0bWF0ZXJpYWwudW5pZm9ybXNbIG5hbWUgXS52YWx1ZSA9IG5ldyBWZWN0b3IzKCkuZnJvbUFycmF5KCB1bmlmb3JtLnZhbHVlICk7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgJ3Y0JzpcclxuXHRcdFx0XHRcdFx0bWF0ZXJpYWwudW5pZm9ybXNbIG5hbWUgXS52YWx1ZSA9IG5ldyBWZWN0b3I0KCkuZnJvbUFycmF5KCB1bmlmb3JtLnZhbHVlICk7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgJ20zJzpcclxuXHRcdFx0XHRcdFx0bWF0ZXJpYWwudW5pZm9ybXNbIG5hbWUgXS52YWx1ZSA9IG5ldyBNYXRyaXgzKCkuZnJvbUFycmF5KCB1bmlmb3JtLnZhbHVlICk7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgJ200JzpcclxuXHRcdFx0XHRcdFx0bWF0ZXJpYWwudW5pZm9ybXNbIG5hbWUgXS52YWx1ZSA9IG5ldyBNYXRyaXg0KCkuZnJvbUFycmF5KCB1bmlmb3JtLnZhbHVlICk7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0XHRcdG1hdGVyaWFsLnVuaWZvcm1zWyBuYW1lIF0udmFsdWUgPSB1bmlmb3JtLnZhbHVlO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICgganNvbi5kZWZpbmVzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5kZWZpbmVzID0ganNvbi5kZWZpbmVzO1xyXG5cdFx0aWYgKCBqc29uLnZlcnRleFNoYWRlciAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwudmVydGV4U2hhZGVyID0ganNvbi52ZXJ0ZXhTaGFkZXI7XHJcblx0XHRpZiAoIGpzb24uZnJhZ21lbnRTaGFkZXIgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmZyYWdtZW50U2hhZGVyID0ganNvbi5mcmFnbWVudFNoYWRlcjtcclxuXHRcdGlmICgganNvbi5nbHNsVmVyc2lvbiAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZ2xzbFZlcnNpb24gPSBqc29uLmdsc2xWZXJzaW9uO1xyXG5cclxuXHRcdGlmICgganNvbi5leHRlbnNpb25zICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBjb25zdCBrZXkgaW4ganNvbi5leHRlbnNpb25zICkge1xyXG5cclxuXHRcdFx0XHRtYXRlcmlhbC5leHRlbnNpb25zWyBrZXkgXSA9IGpzb24uZXh0ZW5zaW9uc1sga2V5IF07XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICgganNvbi5saWdodHMgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmxpZ2h0cyA9IGpzb24ubGlnaHRzO1xyXG5cdFx0aWYgKCBqc29uLmNsaXBwaW5nICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5jbGlwcGluZyA9IGpzb24uY2xpcHBpbmc7XHJcblxyXG5cdFx0Ly8gZm9yIFBvaW50c01hdGVyaWFsXHJcblxyXG5cdFx0aWYgKCBqc29uLnNpemUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNpemUgPSBqc29uLnNpemU7XHJcblx0XHRpZiAoIGpzb24uc2l6ZUF0dGVudWF0aW9uICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zaXplQXR0ZW51YXRpb24gPSBqc29uLnNpemVBdHRlbnVhdGlvbjtcclxuXHJcblx0XHQvLyBtYXBzXHJcblxyXG5cdFx0aWYgKCBqc29uLm1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubWFwID0gZ2V0VGV4dHVyZSgganNvbi5tYXAgKTtcclxuXHRcdGlmICgganNvbi5tYXRjYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm1hdGNhcCA9IGdldFRleHR1cmUoIGpzb24ubWF0Y2FwICk7XHJcblxyXG5cdFx0aWYgKCBqc29uLmFscGhhTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5hbHBoYU1hcCA9IGdldFRleHR1cmUoIGpzb24uYWxwaGFNYXAgKTtcclxuXHJcblx0XHRpZiAoIGpzb24uYnVtcE1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYnVtcE1hcCA9IGdldFRleHR1cmUoIGpzb24uYnVtcE1hcCApO1xyXG5cdFx0aWYgKCBqc29uLmJ1bXBTY2FsZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYnVtcFNjYWxlID0ganNvbi5idW1wU2NhbGU7XHJcblxyXG5cdFx0aWYgKCBqc29uLm5vcm1hbE1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubm9ybWFsTWFwID0gZ2V0VGV4dHVyZSgganNvbi5ub3JtYWxNYXAgKTtcclxuXHRcdGlmICgganNvbi5ub3JtYWxNYXBUeXBlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5ub3JtYWxNYXBUeXBlID0ganNvbi5ub3JtYWxNYXBUeXBlO1xyXG5cdFx0aWYgKCBqc29uLm5vcm1hbFNjYWxlICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRsZXQgbm9ybWFsU2NhbGUgPSBqc29uLm5vcm1hbFNjYWxlO1xyXG5cclxuXHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBub3JtYWxTY2FsZSApID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdFx0Ly8gQmxlbmRlciBleHBvcnRlciB1c2VkIHRvIGV4cG9ydCBhIHNjYWxhci4gU2VlICM3NDU5XHJcblxyXG5cdFx0XHRcdG5vcm1hbFNjYWxlID0gWyBub3JtYWxTY2FsZSwgbm9ybWFsU2NhbGUgXTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdG1hdGVyaWFsLm5vcm1hbFNjYWxlID0gbmV3IFZlY3RvcjIoKS5mcm9tQXJyYXkoIG5vcm1hbFNjYWxlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICgganNvbi5kaXNwbGFjZW1lbnRNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCA9IGdldFRleHR1cmUoIGpzb24uZGlzcGxhY2VtZW50TWFwICk7XHJcblx0XHRpZiAoIGpzb24uZGlzcGxhY2VtZW50U2NhbGUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmRpc3BsYWNlbWVudFNjYWxlID0ganNvbi5kaXNwbGFjZW1lbnRTY2FsZTtcclxuXHRcdGlmICgganNvbi5kaXNwbGFjZW1lbnRCaWFzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRCaWFzID0ganNvbi5kaXNwbGFjZW1lbnRCaWFzO1xyXG5cclxuXHRcdGlmICgganNvbi5yb3VnaG5lc3NNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnJvdWdobmVzc01hcCA9IGdldFRleHR1cmUoIGpzb24ucm91Z2huZXNzTWFwICk7XHJcblx0XHRpZiAoIGpzb24ubWV0YWxuZXNzTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5tZXRhbG5lc3NNYXAgPSBnZXRUZXh0dXJlKCBqc29uLm1ldGFsbmVzc01hcCApO1xyXG5cclxuXHRcdGlmICgganNvbi5lbWlzc2l2ZU1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZW1pc3NpdmVNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmVtaXNzaXZlTWFwICk7XHJcblx0XHRpZiAoIGpzb24uZW1pc3NpdmVJbnRlbnNpdHkgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmVtaXNzaXZlSW50ZW5zaXR5ID0ganNvbi5lbWlzc2l2ZUludGVuc2l0eTtcclxuXHJcblx0XHRpZiAoIGpzb24uc3BlY3VsYXJNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNwZWN1bGFyTWFwID0gZ2V0VGV4dHVyZSgganNvbi5zcGVjdWxhck1hcCApO1xyXG5cdFx0aWYgKCBqc29uLnNwZWN1bGFySW50ZW5zaXR5TWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zcGVjdWxhckludGVuc2l0eU1hcCA9IGdldFRleHR1cmUoIGpzb24uc3BlY3VsYXJJbnRlbnNpdHlNYXAgKTtcclxuXHRcdGlmICgganNvbi5zcGVjdWxhckNvbG9yTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zcGVjdWxhckNvbG9yTWFwID0gZ2V0VGV4dHVyZSgganNvbi5zcGVjdWxhckNvbG9yTWFwICk7XHJcblxyXG5cdFx0aWYgKCBqc29uLmVudk1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZW52TWFwID0gZ2V0VGV4dHVyZSgganNvbi5lbnZNYXAgKTtcclxuXHRcdGlmICgganNvbi5lbnZNYXBSb3RhdGlvbiAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZW52TWFwUm90YXRpb24uZnJvbUFycmF5KCBqc29uLmVudk1hcFJvdGF0aW9uICk7XHJcblx0XHRpZiAoIGpzb24uZW52TWFwSW50ZW5zaXR5ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5lbnZNYXBJbnRlbnNpdHkgPSBqc29uLmVudk1hcEludGVuc2l0eTtcclxuXHJcblx0XHRpZiAoIGpzb24ucmVmbGVjdGl2aXR5ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5yZWZsZWN0aXZpdHkgPSBqc29uLnJlZmxlY3Rpdml0eTtcclxuXHRcdGlmICgganNvbi5yZWZyYWN0aW9uUmF0aW8gIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnJlZnJhY3Rpb25SYXRpbyA9IGpzb24ucmVmcmFjdGlvblJhdGlvO1xyXG5cclxuXHRcdGlmICgganNvbi5saWdodE1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubGlnaHRNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmxpZ2h0TWFwICk7XHJcblx0XHRpZiAoIGpzb24ubGlnaHRNYXBJbnRlbnNpdHkgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmxpZ2h0TWFwSW50ZW5zaXR5ID0ganNvbi5saWdodE1hcEludGVuc2l0eTtcclxuXHJcblx0XHRpZiAoIGpzb24uYW9NYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmFvTWFwID0gZ2V0VGV4dHVyZSgganNvbi5hb01hcCApO1xyXG5cdFx0aWYgKCBqc29uLmFvTWFwSW50ZW5zaXR5ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5hb01hcEludGVuc2l0eSA9IGpzb24uYW9NYXBJbnRlbnNpdHk7XHJcblxyXG5cdFx0aWYgKCBqc29uLmdyYWRpZW50TWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5ncmFkaWVudE1hcCA9IGdldFRleHR1cmUoIGpzb24uZ3JhZGllbnRNYXAgKTtcclxuXHJcblx0XHRpZiAoIGpzb24uY2xlYXJjb2F0TWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5jbGVhcmNvYXRNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmNsZWFyY29hdE1hcCApO1xyXG5cdFx0aWYgKCBqc29uLmNsZWFyY29hdFJvdWdobmVzc01hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzTWFwID0gZ2V0VGV4dHVyZSgganNvbi5jbGVhcmNvYXRSb3VnaG5lc3NNYXAgKTtcclxuXHRcdGlmICgganNvbi5jbGVhcmNvYXROb3JtYWxNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmNsZWFyY29hdE5vcm1hbE1hcCA9IGdldFRleHR1cmUoIGpzb24uY2xlYXJjb2F0Tm9ybWFsTWFwICk7XHJcblx0XHRpZiAoIGpzb24uY2xlYXJjb2F0Tm9ybWFsU2NhbGUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmNsZWFyY29hdE5vcm1hbFNjYWxlID0gbmV3IFZlY3RvcjIoKS5mcm9tQXJyYXkoIGpzb24uY2xlYXJjb2F0Tm9ybWFsU2NhbGUgKTtcclxuXHJcblx0XHRpZiAoIGpzb24uaXJpZGVzY2VuY2VNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmlyaWRlc2NlbmNlTWFwID0gZ2V0VGV4dHVyZSgganNvbi5pcmlkZXNjZW5jZU1hcCApO1xyXG5cdFx0aWYgKCBqc29uLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcCA9IGdldFRleHR1cmUoIGpzb24uaXJpZGVzY2VuY2VUaGlja25lc3NNYXAgKTtcclxuXHJcblx0XHRpZiAoIGpzb24udHJhbnNtaXNzaW9uTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC50cmFuc21pc3Npb25NYXAgPSBnZXRUZXh0dXJlKCBqc29uLnRyYW5zbWlzc2lvbk1hcCApO1xyXG5cdFx0aWYgKCBqc29uLnRoaWNrbmVzc01hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwudGhpY2tuZXNzTWFwID0gZ2V0VGV4dHVyZSgganNvbi50aGlja25lc3NNYXAgKTtcclxuXHJcblx0XHRpZiAoIGpzb24uYW5pc290cm9weU1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYW5pc290cm9weU1hcCA9IGdldFRleHR1cmUoIGpzb24uYW5pc290cm9weU1hcCApO1xyXG5cclxuXHRcdGlmICgganNvbi5zaGVlbkNvbG9yTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zaGVlbkNvbG9yTWFwID0gZ2V0VGV4dHVyZSgganNvbi5zaGVlbkNvbG9yTWFwICk7XHJcblx0XHRpZiAoIGpzb24uc2hlZW5Sb3VnaG5lc3NNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNoZWVuUm91Z2huZXNzTWFwID0gZ2V0VGV4dHVyZSgganNvbi5zaGVlblJvdWdobmVzc01hcCApO1xyXG5cclxuXHRcdHJldHVybiBtYXRlcmlhbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUZXh0dXJlcyBhcmUgbm90IGVtYmVkZGVkIGluIHRoZSBtYXRlcmlhbCBKU09OIHNvIHRoZXkgaGF2ZVxyXG5cdCAqIHRvIGJlIGluamVjdGVkIGJlZm9yZSB0aGUgbG9hZGluZyBwcm9jZXNzIHN0YXJ0cy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZSAtIEEgZGljdGlvbmFyeSBob2xkaW5nIHRleHR1cmVzIGZvciBtYXRlcmlhbCBwcm9wZXJ0aWVzLlxyXG5cdCAqIEByZXR1cm4ge01hdGVyaWFsTG9hZGVyfSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdGVyaWFsIGxvYWRlci5cclxuXHQgKi9cclxuXHRzZXRUZXh0dXJlcyggdmFsdWUgKSB7XHJcblxyXG5cdFx0dGhpcy50ZXh0dXJlcyA9IHZhbHVlO1xyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyBhIG1hdGVyaWFsIGZvciB0aGUgZ2l2ZW4gdHlwZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIG1hdGVyaWFsIHR5cGUuXHJcblx0ICogQHJldHVybiB7TWF0ZXJpYWx9IFRoZSBuZXcgbWF0ZXJpYWwuXHJcblx0ICovXHJcblx0Y3JlYXRlTWF0ZXJpYWxGcm9tVHlwZSggdHlwZSApIHtcclxuXHJcblx0XHRyZXR1cm4gTWF0ZXJpYWxMb2FkZXIuY3JlYXRlTWF0ZXJpYWxGcm9tVHlwZSggdHlwZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgYSBtYXRlcmlhbCBmb3IgdGhlIGdpdmVuIHR5cGUuXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBUaGUgbWF0ZXJpYWwgdHlwZS5cclxuXHQgKiBAcmV0dXJuIHtNYXRlcmlhbH0gVGhlIG5ldyBtYXRlcmlhbC5cclxuXHQgKi9cclxuXHRzdGF0aWMgY3JlYXRlTWF0ZXJpYWxGcm9tVHlwZSggdHlwZSApIHtcclxuXHJcblx0XHRjb25zdCBtYXRlcmlhbExpYiA9IHtcclxuXHRcdFx0U2hhZG93TWF0ZXJpYWwsXHJcblx0XHRcdFNwcml0ZU1hdGVyaWFsLFxyXG5cdFx0XHRSYXdTaGFkZXJNYXRlcmlhbCxcclxuXHRcdFx0U2hhZGVyTWF0ZXJpYWwsXHJcblx0XHRcdFBvaW50c01hdGVyaWFsLFxyXG5cdFx0XHRNZXNoUGh5c2ljYWxNYXRlcmlhbCxcclxuXHRcdFx0TWVzaFN0YW5kYXJkTWF0ZXJpYWwsXHJcblx0XHRcdE1lc2hQaG9uZ01hdGVyaWFsLFxyXG5cdFx0XHRNZXNoVG9vbk1hdGVyaWFsLFxyXG5cdFx0XHRNZXNoTm9ybWFsTWF0ZXJpYWwsXHJcblx0XHRcdE1lc2hMYW1iZXJ0TWF0ZXJpYWwsXHJcblx0XHRcdE1lc2hEZXB0aE1hdGVyaWFsLFxyXG5cdFx0XHRNZXNoRGlzdGFuY2VNYXRlcmlhbCxcclxuXHRcdFx0TWVzaEJhc2ljTWF0ZXJpYWwsXHJcblx0XHRcdE1lc2hNYXRjYXBNYXRlcmlhbCxcclxuXHRcdFx0TGluZURhc2hlZE1hdGVyaWFsLFxyXG5cdFx0XHRMaW5lQmFzaWNNYXRlcmlhbCxcclxuXHRcdFx0TWF0ZXJpYWxcclxuXHRcdH07XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBtYXRlcmlhbExpYlsgdHlwZSBdKCk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IE1hdGVyaWFsTG9hZGVyIH07XHJcbiIsIi8qKlxyXG4gKiBBIGNsYXNzIHdpdGggbG9hZGVyIHV0aWxpdHkgZnVuY3Rpb25zLlxyXG4gKi9cclxuY2xhc3MgTG9hZGVyVXRpbHMge1xyXG5cclxuXHQvKipcclxuXHQgKiBFeHRyYWN0cyB0aGUgYmFzZSBVUkwgZnJvbSB0aGUgZ2l2ZW4gVVJMLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHVybCAtVGhlIFVSTCB0byBleHRyYWN0IHRoZSBiYXNlIFVSTCBmcm9tLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGV4dHJhY3RlZCBiYXNlIFVSTC5cclxuXHQgKi9cclxuXHRzdGF0aWMgZXh0cmFjdFVybEJhc2UoIHVybCApIHtcclxuXHJcblx0XHRjb25zdCBpbmRleCA9IHVybC5sYXN0SW5kZXhPZiggJy8nICk7XHJcblxyXG5cdFx0aWYgKCBpbmRleCA9PT0gLSAxICkgcmV0dXJuICcuLyc7XHJcblxyXG5cdFx0cmV0dXJuIHVybC5zbGljZSggMCwgaW5kZXggKyAxICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVzb2x2ZXMgcmVsYXRpdmUgVVJMcyBhZ2FpbnN0IHRoZSBnaXZlbiBwYXRoLiBBYnNvbHV0ZSBwYXRocywgZGF0YSB1cmxzLFxyXG5cdCAqIGFuZCBibG9iIFVSTHMgd2lsbCBiZSByZXR1cm5lZCBhcyBpcy4gSW52YWxpZCBVUkxzIHdpbGwgcmV0dXJuIGFuIGVtcHR5XHJcblx0ICogc3RyaW5nLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHVybCAtVGhlIFVSTCB0byByZXNvbHZlLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gVGhlIGJhc2UgcGF0aCBmb3IgcmVsYXRpdmUgVVJMcyB0byBiZSByZXNvbHZlZCBhZ2FpbnN0LlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHJlc29sdmVkIFVSTC5cclxuXHQgKi9cclxuXHRzdGF0aWMgcmVzb2x2ZVVSTCggdXJsLCBwYXRoICkge1xyXG5cclxuXHRcdC8vIEludmFsaWQgVVJMXHJcblx0XHRpZiAoIHR5cGVvZiB1cmwgIT09ICdzdHJpbmcnIHx8IHVybCA9PT0gJycgKSByZXR1cm4gJyc7XHJcblxyXG5cdFx0Ly8gSG9zdCBSZWxhdGl2ZSBVUkxcclxuXHRcdGlmICggL15odHRwcz86XFwvXFwvL2kudGVzdCggcGF0aCApICYmIC9eXFwvLy50ZXN0KCB1cmwgKSApIHtcclxuXHJcblx0XHRcdHBhdGggPSBwYXRoLnJlcGxhY2UoIC8oXmh0dHBzPzpcXC9cXC9bXlxcL10rKS4qL2ksICckMScgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQWJzb2x1dGUgVVJMIGh0dHA6Ly8saHR0cHM6Ly8sLy9cclxuXHRcdGlmICggL14oaHR0cHM/Oik/XFwvXFwvL2kudGVzdCggdXJsICkgKSByZXR1cm4gdXJsO1xyXG5cclxuXHRcdC8vIERhdGEgVVJJXHJcblx0XHRpZiAoIC9eZGF0YTouKiwuKiQvaS50ZXN0KCB1cmwgKSApIHJldHVybiB1cmw7XHJcblxyXG5cdFx0Ly8gQmxvYiBVUkxcclxuXHRcdGlmICggL15ibG9iOi4qJC9pLnRlc3QoIHVybCApICkgcmV0dXJuIHVybDtcclxuXHJcblx0XHQvLyBSZWxhdGl2ZSBVUkxcclxuXHRcdHJldHVybiBwYXRoICsgdXJsO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBMb2FkZXJVdGlscyB9O1xyXG4iLCJpbXBvcnQgeyBCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4vQnVmZmVyR2VvbWV0cnkuanMnO1xyXG5cclxuLyoqXHJcbiAqIEFuIGluc3RhbmNlZCB2ZXJzaW9uIG9mIGEgZ2VvbWV0cnkuXHJcbiAqL1xyXG5jbGFzcyBJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSBleHRlbmRzIEJ1ZmZlckdlb21ldHJ5IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZWQgYnVmZmVyIGdlb21ldHJ5LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgaW5zdGFuY2UgY291bnQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IEluZmluaXR5XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaW5zdGFuY2VDb3VudCA9IEluZmluaXR5O1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLmluc3RhbmNlQ291bnQgPSBzb3VyY2UuaW5zdGFuY2VDb3VudDtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHR0b0pTT04oKSB7XHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IHN1cGVyLnRvSlNPTigpO1xyXG5cclxuXHRcdGRhdGEuaW5zdGFuY2VDb3VudCA9IHRoaXMuaW5zdGFuY2VDb3VudDtcclxuXHJcblx0XHRkYXRhLmlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgPSB0cnVlO1xyXG5cclxuXHRcdHJldHVybiBkYXRhO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSB9O1xyXG4iLCJpbXBvcnQgeyBTcGhlcmUgfSBmcm9tICcuLi9tYXRoL1NwaGVyZS5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcbmltcG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9CdWZmZXJHZW9tZXRyeS5qcyc7XHJcbmltcG9ydCB7IEZpbGVMb2FkZXIgfSBmcm9tICcuL0ZpbGVMb2FkZXIuanMnO1xyXG5pbXBvcnQgeyBMb2FkZXIgfSBmcm9tICcuL0xvYWRlci5qcyc7XHJcbmltcG9ydCB7IEluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9JbnN0YW5jZWRCdWZmZXJHZW9tZXRyeS5qcyc7XHJcbmltcG9ydCB7IEluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlLmpzJztcclxuaW1wb3J0IHsgSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlLmpzJztcclxuaW1wb3J0IHsgSW50ZXJsZWF2ZWRCdWZmZXIgfSBmcm9tICcuLi9jb3JlL0ludGVybGVhdmVkQnVmZmVyLmpzJztcclxuaW1wb3J0IHsgZ2V0VHlwZWRBcnJheSB9IGZyb20gJy4uL3V0aWxzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBDbGFzcyBmb3IgbG9hZGluZyBnZW9tZXRyaWVzLiBUaGUgZmlsZXMgYXJlIGludGVybmFsbHlcclxuICogbG9hZGVkIHZpYSB7QGxpbmsgRmlsZUxvYWRlcn0uXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGxvYWRlciA9IG5ldyBUSFJFRS5CdWZmZXJHZW9tZXRyeUxvYWRlcigpO1xyXG4gKiBjb25zdCBnZW9tZXRyeSA9IGF3YWl0IGxvYWRlci5sb2FkQXN5bmMoICdtb2RlbHMvanNvbi9wcmVzc3VyZS5qc29uJyApO1xyXG4gKlxyXG4gKiBjb25zdCBtYXRlcmlhbCA9IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogMHhGNUY1RjUgfSApO1xyXG4gKiBjb25zdCBvYmplY3QgPSBuZXcgVEhSRUUuTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcbiAqIHNjZW5lLmFkZCggb2JqZWN0ICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTG9hZGVyXHJcbiAqL1xyXG5jbGFzcyBCdWZmZXJHZW9tZXRyeUxvYWRlciBleHRlbmRzIExvYWRlciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgZ2VvbWV0cnkgbG9hZGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtMb2FkaW5nTWFuYWdlcn0gW21hbmFnZXJdIC0gVGhlIGxvYWRpbmcgbWFuYWdlci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbWFuYWdlciApIHtcclxuXHJcblx0XHRzdXBlciggbWFuYWdlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFN0YXJ0cyBsb2FkaW5nIGZyb20gdGhlIGdpdmVuIFVSTCBhbmQgcGFzcyB0aGUgbG9hZGVkIGdlb21ldHJ5IHRvIHRoZSBgb25Mb2FkKClgIGNhbGxiYWNrLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIFRoZSBwYXRoL1VSTCBvZiB0aGUgZmlsZSB0byBiZSBsb2FkZWQuIFRoaXMgY2FuIGFsc28gYmUgYSBkYXRhIFVSSS5cclxuXHQgKiBAcGFyYW0ge2Z1bmN0aW9uKEJ1ZmZlckdlb21ldHJ5KX0gb25Mb2FkIC0gRXhlY3V0ZWQgd2hlbiB0aGUgbG9hZGluZyBwcm9jZXNzIGhhcyBiZWVuIGZpbmlzaGVkLlxyXG5cdCAqIEBwYXJhbSB7b25Qcm9ncmVzc0NhbGxiYWNrfSBvblByb2dyZXNzIC0gRXhlY3V0ZWQgd2hpbGUgdGhlIGxvYWRpbmcgaXMgaW4gcHJvZ3Jlc3MuXHJcblx0ICogQHBhcmFtIHtvbkVycm9yQ2FsbGJhY2t9IG9uRXJyb3IgLSBFeGVjdXRlZCB3aGVuIGVycm9ycyBvY2N1ci5cclxuXHQgKi9cclxuXHRsb2FkKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcclxuXHJcblx0XHRjb25zdCBzY29wZSA9IHRoaXM7XHJcblxyXG5cdFx0Y29uc3QgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIoIHNjb3BlLm1hbmFnZXIgKTtcclxuXHRcdGxvYWRlci5zZXRQYXRoKCBzY29wZS5wYXRoICk7XHJcblx0XHRsb2FkZXIuc2V0UmVxdWVzdEhlYWRlciggc2NvcGUucmVxdWVzdEhlYWRlciApO1xyXG5cdFx0bG9hZGVyLnNldFdpdGhDcmVkZW50aWFscyggc2NvcGUud2l0aENyZWRlbnRpYWxzICk7XHJcblx0XHRsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoIHRleHQgKSB7XHJcblxyXG5cdFx0XHR0cnkge1xyXG5cclxuXHRcdFx0XHRvbkxvYWQoIHNjb3BlLnBhcnNlKCBKU09OLnBhcnNlKCB0ZXh0ICkgKSApO1xyXG5cclxuXHRcdFx0fSBjYXRjaCAoIGUgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggb25FcnJvciApIHtcclxuXHJcblx0XHRcdFx0XHRvbkVycm9yKCBlICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvciggZSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVycm9yKCB1cmwgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9LCBvblByb2dyZXNzLCBvbkVycm9yICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUGFyc2VzIHRoZSBnaXZlbiBKU09OIG9iamVjdCBhbmQgcmV0dXJucyBhIGdlb21ldHJ5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGpzb24gLSBUaGUgc2VyaWFsaXplZCBnZW9tZXRyeS5cclxuXHQgKiBAcmV0dXJuIHtCdWZmZXJHZW9tZXRyeX0gVGhlIHBhcnNlZCBnZW9tZXRyeS5cclxuXHQgKi9cclxuXHRwYXJzZSgganNvbiApIHtcclxuXHJcblx0XHRjb25zdCBpbnRlcmxlYXZlZEJ1ZmZlck1hcCA9IHt9O1xyXG5cdFx0Y29uc3QgYXJyYXlCdWZmZXJNYXAgPSB7fTtcclxuXHJcblx0XHRmdW5jdGlvbiBnZXRJbnRlcmxlYXZlZEJ1ZmZlcigganNvbiwgdXVpZCApIHtcclxuXHJcblx0XHRcdGlmICggaW50ZXJsZWF2ZWRCdWZmZXJNYXBbIHV1aWQgXSAhPT0gdW5kZWZpbmVkICkgcmV0dXJuIGludGVybGVhdmVkQnVmZmVyTWFwWyB1dWlkIF07XHJcblxyXG5cdFx0XHRjb25zdCBpbnRlcmxlYXZlZEJ1ZmZlcnMgPSBqc29uLmludGVybGVhdmVkQnVmZmVycztcclxuXHRcdFx0Y29uc3QgaW50ZXJsZWF2ZWRCdWZmZXIgPSBpbnRlcmxlYXZlZEJ1ZmZlcnNbIHV1aWQgXTtcclxuXHJcblx0XHRcdGNvbnN0IGJ1ZmZlciA9IGdldEFycmF5QnVmZmVyKCBqc29uLCBpbnRlcmxlYXZlZEJ1ZmZlci5idWZmZXIgKTtcclxuXHJcblx0XHRcdGNvbnN0IGFycmF5ID0gZ2V0VHlwZWRBcnJheSggaW50ZXJsZWF2ZWRCdWZmZXIudHlwZSwgYnVmZmVyICk7XHJcblx0XHRcdGNvbnN0IGliID0gbmV3IEludGVybGVhdmVkQnVmZmVyKCBhcnJheSwgaW50ZXJsZWF2ZWRCdWZmZXIuc3RyaWRlICk7XHJcblx0XHRcdGliLnV1aWQgPSBpbnRlcmxlYXZlZEJ1ZmZlci51dWlkO1xyXG5cclxuXHRcdFx0aW50ZXJsZWF2ZWRCdWZmZXJNYXBbIHV1aWQgXSA9IGliO1xyXG5cclxuXHRcdFx0cmV0dXJuIGliO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiBnZXRBcnJheUJ1ZmZlcigganNvbiwgdXVpZCApIHtcclxuXHJcblx0XHRcdGlmICggYXJyYXlCdWZmZXJNYXBbIHV1aWQgXSAhPT0gdW5kZWZpbmVkICkgcmV0dXJuIGFycmF5QnVmZmVyTWFwWyB1dWlkIF07XHJcblxyXG5cdFx0XHRjb25zdCBhcnJheUJ1ZmZlcnMgPSBqc29uLmFycmF5QnVmZmVycztcclxuXHRcdFx0Y29uc3QgYXJyYXlCdWZmZXIgPSBhcnJheUJ1ZmZlcnNbIHV1aWQgXTtcclxuXHJcblx0XHRcdGNvbnN0IGFiID0gbmV3IFVpbnQzMkFycmF5KCBhcnJheUJ1ZmZlciApLmJ1ZmZlcjtcclxuXHJcblx0XHRcdGFycmF5QnVmZmVyTWFwWyB1dWlkIF0gPSBhYjtcclxuXHJcblx0XHRcdHJldHVybiBhYjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSBqc29uLmlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgPyBuZXcgSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkoKSA6IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xyXG5cclxuXHRcdGNvbnN0IGluZGV4ID0ganNvbi5kYXRhLmluZGV4O1xyXG5cclxuXHRcdGlmICggaW5kZXggIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGNvbnN0IHR5cGVkQXJyYXkgPSBnZXRUeXBlZEFycmF5KCBpbmRleC50eXBlLCBpbmRleC5hcnJheSApO1xyXG5cdFx0XHRnZW9tZXRyeS5zZXRJbmRleCggbmV3IEJ1ZmZlckF0dHJpYnV0ZSggdHlwZWRBcnJheSwgMSApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGF0dHJpYnV0ZXMgPSBqc29uLmRhdGEuYXR0cmlidXRlcztcclxuXHJcblx0XHRmb3IgKCBjb25zdCBrZXkgaW4gYXR0cmlidXRlcyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbIGtleSBdO1xyXG5cdFx0XHRsZXQgYnVmZmVyQXR0cmlidXRlO1xyXG5cclxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgaW50ZXJsZWF2ZWRCdWZmZXIgPSBnZXRJbnRlcmxlYXZlZEJ1ZmZlcigganNvbi5kYXRhLCBhdHRyaWJ1dGUuZGF0YSApO1xyXG5cdFx0XHRcdGJ1ZmZlckF0dHJpYnV0ZSA9IG5ldyBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSggaW50ZXJsZWF2ZWRCdWZmZXIsIGF0dHJpYnV0ZS5pdGVtU2l6ZSwgYXR0cmlidXRlLm9mZnNldCwgYXR0cmlidXRlLm5vcm1hbGl6ZWQgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHR5cGVkQXJyYXkgPSBnZXRUeXBlZEFycmF5KCBhdHRyaWJ1dGUudHlwZSwgYXR0cmlidXRlLmFycmF5ICk7XHJcblx0XHRcdFx0Y29uc3QgYnVmZmVyQXR0cmlidXRlQ29uc3RyID0gYXR0cmlidXRlLmlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlID8gSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlIDogQnVmZmVyQXR0cmlidXRlO1xyXG5cdFx0XHRcdGJ1ZmZlckF0dHJpYnV0ZSA9IG5ldyBidWZmZXJBdHRyaWJ1dGVDb25zdHIoIHR5cGVkQXJyYXksIGF0dHJpYnV0ZS5pdGVtU2l6ZSwgYXR0cmlidXRlLm5vcm1hbGl6ZWQgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggYXR0cmlidXRlLm5hbWUgIT09IHVuZGVmaW5lZCApIGJ1ZmZlckF0dHJpYnV0ZS5uYW1lID0gYXR0cmlidXRlLm5hbWU7XHJcblx0XHRcdGlmICggYXR0cmlidXRlLnVzYWdlICE9PSB1bmRlZmluZWQgKSBidWZmZXJBdHRyaWJ1dGUuc2V0VXNhZ2UoIGF0dHJpYnV0ZS51c2FnZSApO1xyXG5cclxuXHRcdFx0Z2VvbWV0cnkuc2V0QXR0cmlidXRlKCBrZXksIGJ1ZmZlckF0dHJpYnV0ZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBtb3JwaEF0dHJpYnV0ZXMgPSBqc29uLmRhdGEubW9ycGhBdHRyaWJ1dGVzO1xyXG5cclxuXHRcdGlmICggbW9ycGhBdHRyaWJ1dGVzICkge1xyXG5cclxuXHRcdFx0Zm9yICggY29uc3Qga2V5IGluIG1vcnBoQXR0cmlidXRlcyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgYXR0cmlidXRlQXJyYXkgPSBtb3JwaEF0dHJpYnV0ZXNbIGtleSBdO1xyXG5cclxuXHRcdFx0XHRjb25zdCBhcnJheSA9IFtdO1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gYXR0cmlidXRlQXJyYXkubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgYXR0cmlidXRlID0gYXR0cmlidXRlQXJyYXlbIGkgXTtcclxuXHRcdFx0XHRcdGxldCBidWZmZXJBdHRyaWJ1dGU7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBhdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnN0IGludGVybGVhdmVkQnVmZmVyID0gZ2V0SW50ZXJsZWF2ZWRCdWZmZXIoIGpzb24uZGF0YSwgYXR0cmlidXRlLmRhdGEgKTtcclxuXHRcdFx0XHRcdFx0YnVmZmVyQXR0cmlidXRlID0gbmV3IEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKCBpbnRlcmxlYXZlZEJ1ZmZlciwgYXR0cmlidXRlLml0ZW1TaXplLCBhdHRyaWJ1dGUub2Zmc2V0LCBhdHRyaWJ1dGUubm9ybWFsaXplZCApO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCB0eXBlZEFycmF5ID0gZ2V0VHlwZWRBcnJheSggYXR0cmlidXRlLnR5cGUsIGF0dHJpYnV0ZS5hcnJheSApO1xyXG5cdFx0XHRcdFx0XHRidWZmZXJBdHRyaWJ1dGUgPSBuZXcgQnVmZmVyQXR0cmlidXRlKCB0eXBlZEFycmF5LCBhdHRyaWJ1dGUuaXRlbVNpemUsIGF0dHJpYnV0ZS5ub3JtYWxpemVkICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGlmICggYXR0cmlidXRlLm5hbWUgIT09IHVuZGVmaW5lZCApIGJ1ZmZlckF0dHJpYnV0ZS5uYW1lID0gYXR0cmlidXRlLm5hbWU7XHJcblx0XHRcdFx0XHRhcnJheS5wdXNoKCBidWZmZXJBdHRyaWJ1dGUgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXNbIGtleSBdID0gYXJyYXk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IG1vcnBoVGFyZ2V0c1JlbGF0aXZlID0ganNvbi5kYXRhLm1vcnBoVGFyZ2V0c1JlbGF0aXZlO1xyXG5cclxuXHRcdGlmICggbW9ycGhUYXJnZXRzUmVsYXRpdmUgKSB7XHJcblxyXG5cdFx0XHRnZW9tZXRyeS5tb3JwaFRhcmdldHNSZWxhdGl2ZSA9IHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGdyb3VwcyA9IGpzb24uZGF0YS5ncm91cHMgfHwganNvbi5kYXRhLmRyYXdjYWxscyB8fCBqc29uLmRhdGEub2Zmc2V0cztcclxuXHJcblx0XHRpZiAoIGdyb3VwcyAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBuID0gZ3JvdXBzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgZ3JvdXAgPSBncm91cHNbIGkgXTtcclxuXHJcblx0XHRcdFx0Z2VvbWV0cnkuYWRkR3JvdXAoIGdyb3VwLnN0YXJ0LCBncm91cC5jb3VudCwgZ3JvdXAubWF0ZXJpYWxJbmRleCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBib3VuZGluZ1NwaGVyZSA9IGpzb24uZGF0YS5ib3VuZGluZ1NwaGVyZTtcclxuXHJcblx0XHRpZiAoIGJvdW5kaW5nU3BoZXJlICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBjZW50ZXIgPSBuZXcgVmVjdG9yMygpO1xyXG5cclxuXHRcdFx0aWYgKCBib3VuZGluZ1NwaGVyZS5jZW50ZXIgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0Y2VudGVyLmZyb21BcnJheSggYm91bmRpbmdTcGhlcmUuY2VudGVyICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSA9IG5ldyBTcGhlcmUoIGNlbnRlciwgYm91bmRpbmdTcGhlcmUucmFkaXVzICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICgganNvbi5uYW1lICkgZ2VvbWV0cnkubmFtZSA9IGpzb24ubmFtZTtcclxuXHRcdGlmICgganNvbi51c2VyRGF0YSApIGdlb21ldHJ5LnVzZXJEYXRhID0ganNvbi51c2VyRGF0YTtcclxuXHJcblx0XHRyZXR1cm4gZ2VvbWV0cnk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IEJ1ZmZlckdlb21ldHJ5TG9hZGVyIH07XHJcbiIsImltcG9ydCB7XHJcblx0VVZNYXBwaW5nLFxyXG5cdEN1YmVSZWZsZWN0aW9uTWFwcGluZyxcclxuXHRDdWJlUmVmcmFjdGlvbk1hcHBpbmcsXHJcblx0RXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmcsXHJcblx0RXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmcsXHJcblx0Q3ViZVVWUmVmbGVjdGlvbk1hcHBpbmcsXHJcblxyXG5cdFJlcGVhdFdyYXBwaW5nLFxyXG5cdENsYW1wVG9FZGdlV3JhcHBpbmcsXHJcblx0TWlycm9yZWRSZXBlYXRXcmFwcGluZyxcclxuXHJcblx0TmVhcmVzdEZpbHRlcixcclxuXHROZWFyZXN0TWlwbWFwTmVhcmVzdEZpbHRlcixcclxuXHROZWFyZXN0TWlwbWFwTGluZWFyRmlsdGVyLFxyXG5cdExpbmVhckZpbHRlcixcclxuXHRMaW5lYXJNaXBtYXBOZWFyZXN0RmlsdGVyLFxyXG5cdExpbmVhck1pcG1hcExpbmVhckZpbHRlclxyXG59IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IEluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlLmpzJztcclxuaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi9tYXRoL0NvbG9yLmpzJztcclxuaW1wb3J0IHsgT2JqZWN0M0QgfSBmcm9tICcuLi9jb3JlL09iamVjdDNELmpzJztcclxuaW1wb3J0IHsgR3JvdXAgfSBmcm9tICcuLi9vYmplY3RzL0dyb3VwLmpzJztcclxuaW1wb3J0IHsgSW5zdGFuY2VkTWVzaCB9IGZyb20gJy4uL29iamVjdHMvSW5zdGFuY2VkTWVzaC5qcyc7XHJcbmltcG9ydCB7IEJhdGNoZWRNZXNoIH0gZnJvbSAnLi4vb2JqZWN0cy9CYXRjaGVkTWVzaC5qcyc7XHJcbmltcG9ydCB7IFNwcml0ZSB9IGZyb20gJy4uL29iamVjdHMvU3ByaXRlLmpzJztcclxuaW1wb3J0IHsgUG9pbnRzIH0gZnJvbSAnLi4vb2JqZWN0cy9Qb2ludHMuanMnO1xyXG5pbXBvcnQgeyBMaW5lIH0gZnJvbSAnLi4vb2JqZWN0cy9MaW5lLmpzJztcclxuaW1wb3J0IHsgTGluZUxvb3AgfSBmcm9tICcuLi9vYmplY3RzL0xpbmVMb29wLmpzJztcclxuaW1wb3J0IHsgTGluZVNlZ21lbnRzIH0gZnJvbSAnLi4vb2JqZWN0cy9MaW5lU2VnbWVudHMuanMnO1xyXG5pbXBvcnQgeyBMT0QgfSBmcm9tICcuLi9vYmplY3RzL0xPRC5qcyc7XHJcbmltcG9ydCB7IE1lc2ggfSBmcm9tICcuLi9vYmplY3RzL01lc2guanMnO1xyXG5pbXBvcnQgeyBTa2lubmVkTWVzaCB9IGZyb20gJy4uL29iamVjdHMvU2tpbm5lZE1lc2guanMnO1xyXG5pbXBvcnQgeyBCb25lIH0gZnJvbSAnLi4vb2JqZWN0cy9Cb25lLmpzJztcclxuaW1wb3J0IHsgU2tlbGV0b24gfSBmcm9tICcuLi9vYmplY3RzL1NrZWxldG9uLmpzJztcclxuaW1wb3J0IHsgU2hhcGUgfSBmcm9tICcuLi9leHRyYXMvY29yZS9TaGFwZS5qcyc7XHJcbmltcG9ydCB7IEZvZyB9IGZyb20gJy4uL3NjZW5lcy9Gb2cuanMnO1xyXG5pbXBvcnQgeyBGb2dFeHAyIH0gZnJvbSAnLi4vc2NlbmVzL0ZvZ0V4cDIuanMnO1xyXG5pbXBvcnQgeyBIZW1pc3BoZXJlTGlnaHQgfSBmcm9tICcuLi9saWdodHMvSGVtaXNwaGVyZUxpZ2h0LmpzJztcclxuaW1wb3J0IHsgU3BvdExpZ2h0IH0gZnJvbSAnLi4vbGlnaHRzL1Nwb3RMaWdodC5qcyc7XHJcbmltcG9ydCB7IFBvaW50TGlnaHQgfSBmcm9tICcuLi9saWdodHMvUG9pbnRMaWdodC5qcyc7XHJcbmltcG9ydCB7IERpcmVjdGlvbmFsTGlnaHQgfSBmcm9tICcuLi9saWdodHMvRGlyZWN0aW9uYWxMaWdodC5qcyc7XHJcbmltcG9ydCB7IEFtYmllbnRMaWdodCB9IGZyb20gJy4uL2xpZ2h0cy9BbWJpZW50TGlnaHQuanMnO1xyXG5pbXBvcnQgeyBSZWN0QXJlYUxpZ2h0IH0gZnJvbSAnLi4vbGlnaHRzL1JlY3RBcmVhTGlnaHQuanMnO1xyXG5pbXBvcnQgeyBMaWdodFByb2JlIH0gZnJvbSAnLi4vbGlnaHRzL0xpZ2h0UHJvYmUuanMnO1xyXG5pbXBvcnQgeyBPcnRob2dyYXBoaWNDYW1lcmEgfSBmcm9tICcuLi9jYW1lcmFzL09ydGhvZ3JhcGhpY0NhbWVyYS5qcyc7XHJcbmltcG9ydCB7IFBlcnNwZWN0aXZlQ2FtZXJhIH0gZnJvbSAnLi4vY2FtZXJhcy9QZXJzcGVjdGl2ZUNhbWVyYS5qcyc7XHJcbmltcG9ydCB7IFNjZW5lIH0gZnJvbSAnLi4vc2NlbmVzL1NjZW5lLmpzJztcclxuaW1wb3J0IHsgQ3ViZVRleHR1cmUgfSBmcm9tICcuLi90ZXh0dXJlcy9DdWJlVGV4dHVyZS5qcyc7XHJcbmltcG9ydCB7IFRleHR1cmUgfSBmcm9tICcuLi90ZXh0dXJlcy9UZXh0dXJlLmpzJztcclxuaW1wb3J0IHsgU291cmNlIH0gZnJvbSAnLi4vdGV4dHVyZXMvU291cmNlLmpzJztcclxuaW1wb3J0IHsgRGF0YVRleHR1cmUgfSBmcm9tICcuLi90ZXh0dXJlcy9EYXRhVGV4dHVyZS5qcyc7XHJcbmltcG9ydCB7IEltYWdlTG9hZGVyIH0gZnJvbSAnLi9JbWFnZUxvYWRlci5qcyc7XHJcbmltcG9ydCB7IExvYWRpbmdNYW5hZ2VyIH0gZnJvbSAnLi9Mb2FkaW5nTWFuYWdlci5qcyc7XHJcbmltcG9ydCB7IEFuaW1hdGlvbkNsaXAgfSBmcm9tICcuLi9hbmltYXRpb24vQW5pbWF0aW9uQ2xpcC5qcyc7XHJcbmltcG9ydCB7IE1hdGVyaWFsTG9hZGVyIH0gZnJvbSAnLi9NYXRlcmlhbExvYWRlci5qcyc7XHJcbmltcG9ydCB7IExvYWRlclV0aWxzIH0gZnJvbSAnLi9Mb2FkZXJVdGlscy5qcyc7XHJcbmltcG9ydCB7IEJ1ZmZlckdlb21ldHJ5TG9hZGVyIH0gZnJvbSAnLi9CdWZmZXJHZW9tZXRyeUxvYWRlci5qcyc7XHJcbmltcG9ydCB7IExvYWRlciB9IGZyb20gJy4vTG9hZGVyLmpzJztcclxuaW1wb3J0IHsgRmlsZUxvYWRlciB9IGZyb20gJy4vRmlsZUxvYWRlci5qcyc7XHJcbmltcG9ydCAqIGFzIEdlb21ldHJpZXMgZnJvbSAnLi4vZ2VvbWV0cmllcy9HZW9tZXRyaWVzLmpzJztcclxuaW1wb3J0IHsgZ2V0VHlwZWRBcnJheSB9IGZyb20gJy4uL3V0aWxzLmpzJztcclxuaW1wb3J0IHsgQm94MyB9IGZyb20gJy4uL21hdGgvQm94My5qcyc7XHJcbmltcG9ydCB7IFNwaGVyZSB9IGZyb20gJy4uL21hdGgvU3BoZXJlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIGxvYWRlciBmb3IgbG9hZGluZyBhIEpTT04gcmVzb3VyY2UgaW4gdGhlIFtKU09OIE9iamVjdC9TY2VuZSBmb3JtYXRde0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9tcmRvb2IvdGhyZWUuanMvd2lraS9KU09OLU9iamVjdC1TY2VuZS1mb3JtYXQtNH0uXHJcbiAqIFRoZSBmaWxlcyBhcmUgaW50ZXJuYWxseSBsb2FkZWQgdmlhIHtAbGluayBGaWxlTG9hZGVyfS5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgbG9hZGVyID0gbmV3IFRIUkVFLk9iamVjdExvYWRlcigpO1xyXG4gKiBjb25zdCBvYmogPSBhd2FpdCBsb2FkZXIubG9hZEFzeW5jKCAnbW9kZWxzL2pzb24vZXhhbXBsZS5qc29uJyApO1xyXG4gKiBzY2VuZS5hZGQoIG9iaiApO1xyXG4gKlxyXG4gKiAvLyBBbHRlcm5hdGl2ZWx5LCB0byBwYXJzZSBhIHByZXZpb3VzbHkgbG9hZGVkIEpTT04gc3RydWN0dXJlXHJcbiAqIGNvbnN0IG9iamVjdCA9IGF3YWl0IGxvYWRlci5wYXJzZUFzeW5jKCBhX2pzb25fb2JqZWN0ICk7XHJcbiAqIHNjZW5lLmFkZCggb2JqZWN0ICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTG9hZGVyXHJcbiAqL1xyXG5jbGFzcyBPYmplY3RMb2FkZXIgZXh0ZW5kcyBMb2FkZXIge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG9iamVjdCBsb2FkZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0xvYWRpbmdNYW5hZ2VyfSBbbWFuYWdlcl0gLSBUaGUgbG9hZGluZyBtYW5hZ2VyLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBtYW5hZ2VyICkge1xyXG5cclxuXHRcdHN1cGVyKCBtYW5hZ2VyICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3RhcnRzIGxvYWRpbmcgZnJvbSB0aGUgZ2l2ZW4gVVJMIGFuZCBwYXNzIHRoZSBsb2FkZWQgM0Qgb2JqZWN0IHRvIHRoZSBgb25Mb2FkKClgIGNhbGxiYWNrLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIFRoZSBwYXRoL1VSTCBvZiB0aGUgZmlsZSB0byBiZSBsb2FkZWQuIFRoaXMgY2FuIGFsc28gYmUgYSBkYXRhIFVSSS5cclxuXHQgKiBAcGFyYW0ge2Z1bmN0aW9uKE9iamVjdDNEKX0gb25Mb2FkIC0gRXhlY3V0ZWQgd2hlbiB0aGUgbG9hZGluZyBwcm9jZXNzIGhhcyBiZWVuIGZpbmlzaGVkLlxyXG5cdCAqIEBwYXJhbSB7b25Qcm9ncmVzc0NhbGxiYWNrfSBvblByb2dyZXNzIC0gRXhlY3V0ZWQgd2hpbGUgdGhlIGxvYWRpbmcgaXMgaW4gcHJvZ3Jlc3MuXHJcblx0ICogQHBhcmFtIHtvbkVycm9yQ2FsbGJhY2t9IG9uRXJyb3IgLSBFeGVjdXRlZCB3aGVuIGVycm9ycyBvY2N1ci5cclxuXHQgKi9cclxuXHRsb2FkKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcclxuXHJcblx0XHRjb25zdCBzY29wZSA9IHRoaXM7XHJcblxyXG5cdFx0Y29uc3QgcGF0aCA9ICggdGhpcy5wYXRoID09PSAnJyApID8gTG9hZGVyVXRpbHMuZXh0cmFjdFVybEJhc2UoIHVybCApIDogdGhpcy5wYXRoO1xyXG5cdFx0dGhpcy5yZXNvdXJjZVBhdGggPSB0aGlzLnJlc291cmNlUGF0aCB8fCBwYXRoO1xyXG5cclxuXHRcdGNvbnN0IGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCB0aGlzLm1hbmFnZXIgKTtcclxuXHRcdGxvYWRlci5zZXRQYXRoKCB0aGlzLnBhdGggKTtcclxuXHRcdGxvYWRlci5zZXRSZXF1ZXN0SGVhZGVyKCB0aGlzLnJlcXVlc3RIZWFkZXIgKTtcclxuXHRcdGxvYWRlci5zZXRXaXRoQ3JlZGVudGlhbHMoIHRoaXMud2l0aENyZWRlbnRpYWxzICk7XHJcblx0XHRsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoIHRleHQgKSB7XHJcblxyXG5cdFx0XHRsZXQganNvbiA9IG51bGw7XHJcblxyXG5cdFx0XHR0cnkge1xyXG5cclxuXHRcdFx0XHRqc29uID0gSlNPTi5wYXJzZSggdGV4dCApO1xyXG5cclxuXHRcdFx0fSBjYXRjaCAoIGVycm9yICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIG9uRXJyb3IgIT09IHVuZGVmaW5lZCApIG9uRXJyb3IoIGVycm9yICk7XHJcblxyXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRTpPYmplY3RMb2FkZXI6IENhblxcJ3QgcGFyc2UgJyArIHVybCArICcuJywgZXJyb3IubWVzc2FnZSApO1xyXG5cclxuXHRcdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBtZXRhZGF0YSA9IGpzb24ubWV0YWRhdGE7XHJcblxyXG5cdFx0XHRpZiAoIG1ldGFkYXRhID09PSB1bmRlZmluZWQgfHwgbWV0YWRhdGEudHlwZSA9PT0gdW5kZWZpbmVkIHx8IG1ldGFkYXRhLnR5cGUudG9Mb3dlckNhc2UoKSA9PT0gJ2dlb21ldHJ5JyApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBvbkVycm9yICE9PSB1bmRlZmluZWQgKSBvbkVycm9yKCBuZXcgRXJyb3IoICdUSFJFRS5PYmplY3RMb2FkZXI6IENhblxcJ3QgbG9hZCAnICsgdXJsICkgKTtcclxuXHJcblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk9iamVjdExvYWRlcjogQ2FuXFwndCBsb2FkICcgKyB1cmwgKTtcclxuXHRcdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRzY29wZS5wYXJzZSgganNvbiwgb25Mb2FkICk7XHJcblxyXG5cdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFzeW5jIHZlcnNpb24gb2Yge0BsaW5rIE9iamVjdExvYWRlciNsb2FkfS5cclxuXHQgKlxyXG5cdCAqIEBhc3luY1xyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSBUaGUgcGF0aC9VUkwgb2YgdGhlIGZpbGUgdG8gYmUgbG9hZGVkLiBUaGlzIGNhbiBhbHNvIGJlIGEgZGF0YSBVUkkuXHJcblx0ICogQHBhcmFtIHtvblByb2dyZXNzQ2FsbGJhY2t9IG9uUHJvZ3Jlc3MgLSBFeGVjdXRlZCB3aGlsZSB0aGUgbG9hZGluZyBpcyBpbiBwcm9ncmVzcy5cclxuXHQgKiBAcmV0dXJuIHtQcm9taXNlPE9iamVjdDNEPn0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgbG9hZGVkIDNEIG9iamVjdC5cclxuXHQgKi9cclxuXHRhc3luYyBsb2FkQXN5bmMoIHVybCwgb25Qcm9ncmVzcyApIHtcclxuXHJcblx0XHRjb25zdCBzY29wZSA9IHRoaXM7XHJcblxyXG5cdFx0Y29uc3QgcGF0aCA9ICggdGhpcy5wYXRoID09PSAnJyApID8gTG9hZGVyVXRpbHMuZXh0cmFjdFVybEJhc2UoIHVybCApIDogdGhpcy5wYXRoO1xyXG5cdFx0dGhpcy5yZXNvdXJjZVBhdGggPSB0aGlzLnJlc291cmNlUGF0aCB8fCBwYXRoO1xyXG5cclxuXHRcdGNvbnN0IGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCB0aGlzLm1hbmFnZXIgKTtcclxuXHRcdGxvYWRlci5zZXRQYXRoKCB0aGlzLnBhdGggKTtcclxuXHRcdGxvYWRlci5zZXRSZXF1ZXN0SGVhZGVyKCB0aGlzLnJlcXVlc3RIZWFkZXIgKTtcclxuXHRcdGxvYWRlci5zZXRXaXRoQ3JlZGVudGlhbHMoIHRoaXMud2l0aENyZWRlbnRpYWxzICk7XHJcblxyXG5cdFx0Y29uc3QgdGV4dCA9IGF3YWl0IGxvYWRlci5sb2FkQXN5bmMoIHVybCwgb25Qcm9ncmVzcyApO1xyXG5cclxuXHRcdGNvbnN0IGpzb24gPSBKU09OLnBhcnNlKCB0ZXh0ICk7XHJcblxyXG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBqc29uLm1ldGFkYXRhO1xyXG5cclxuXHRcdGlmICggbWV0YWRhdGEgPT09IHVuZGVmaW5lZCB8fCBtZXRhZGF0YS50eXBlID09PSB1bmRlZmluZWQgfHwgbWV0YWRhdGEudHlwZS50b0xvd2VyQ2FzZSgpID09PSAnZ2VvbWV0cnknICkge1xyXG5cclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuT2JqZWN0TG9hZGVyOiBDYW5cXCd0IGxvYWQgJyArIHVybCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gYXdhaXQgc2NvcGUucGFyc2VBc3luYygganNvbiApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBhcnNlcyB0aGUgZ2l2ZW4gSlNPTi4gVGhpcyBpcyB1c2VkIGludGVybmFsbHkgYnkge0BsaW5rIE9iamVjdExvYWRlciNsb2FkfVxyXG5cdCAqIGJ1dCBjYW4gYWxzbyBiZSB1c2VkIGRpcmVjdGx5IHRvIHBhcnNlIGEgcHJldmlvdXNseSBsb2FkZWQgSlNPTiBzdHJ1Y3R1cmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0ganNvbiAtIFRoZSBzZXJpYWxpemVkIDNEIG9iamVjdC5cclxuXHQgKiBAcGFyYW0ge29uTG9hZH0gb25Mb2FkIC0gRXhlY3V0ZWQgd2hlbiBhbGwgcmVzb3VyY2VzIChlLmcuIHRleHR1cmVzKSBoYXZlIGJlZW4gZnVsbHkgbG9hZGVkLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdDNEfSBUaGUgcGFyc2VkIDNEIG9iamVjdC5cclxuXHQgKi9cclxuXHRwYXJzZSgganNvbiwgb25Mb2FkICkge1xyXG5cclxuXHRcdGNvbnN0IGFuaW1hdGlvbnMgPSB0aGlzLnBhcnNlQW5pbWF0aW9ucygganNvbi5hbmltYXRpb25zICk7XHJcblx0XHRjb25zdCBzaGFwZXMgPSB0aGlzLnBhcnNlU2hhcGVzKCBqc29uLnNoYXBlcyApO1xyXG5cdFx0Y29uc3QgZ2VvbWV0cmllcyA9IHRoaXMucGFyc2VHZW9tZXRyaWVzKCBqc29uLmdlb21ldHJpZXMsIHNoYXBlcyApO1xyXG5cclxuXHRcdGNvbnN0IGltYWdlcyA9IHRoaXMucGFyc2VJbWFnZXMoIGpzb24uaW1hZ2VzLCBmdW5jdGlvbiAoKSB7XHJcblxyXG5cdFx0XHRpZiAoIG9uTG9hZCAhPT0gdW5kZWZpbmVkICkgb25Mb2FkKCBvYmplY3QgKTtcclxuXHJcblx0XHR9ICk7XHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZXMgPSB0aGlzLnBhcnNlVGV4dHVyZXMoIGpzb24udGV4dHVyZXMsIGltYWdlcyApO1xyXG5cdFx0Y29uc3QgbWF0ZXJpYWxzID0gdGhpcy5wYXJzZU1hdGVyaWFscygganNvbi5tYXRlcmlhbHMsIHRleHR1cmVzICk7XHJcblxyXG5cdFx0Y29uc3Qgb2JqZWN0ID0gdGhpcy5wYXJzZU9iamVjdCgganNvbi5vYmplY3QsIGdlb21ldHJpZXMsIG1hdGVyaWFscywgdGV4dHVyZXMsIGFuaW1hdGlvbnMgKTtcclxuXHRcdGNvbnN0IHNrZWxldG9ucyA9IHRoaXMucGFyc2VTa2VsZXRvbnMoIGpzb24uc2tlbGV0b25zLCBvYmplY3QgKTtcclxuXHJcblx0XHR0aGlzLmJpbmRTa2VsZXRvbnMoIG9iamVjdCwgc2tlbGV0b25zICk7XHJcblx0XHR0aGlzLmJpbmRMaWdodFRhcmdldHMoIG9iamVjdCApO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0aWYgKCBvbkxvYWQgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGxldCBoYXNJbWFnZXMgPSBmYWxzZTtcclxuXHJcblx0XHRcdGZvciAoIGNvbnN0IHV1aWQgaW4gaW1hZ2VzICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIGltYWdlc1sgdXVpZCBdLmRhdGEgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50ICkge1xyXG5cclxuXHRcdFx0XHRcdGhhc0ltYWdlcyA9IHRydWU7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBoYXNJbWFnZXMgPT09IGZhbHNlICkgb25Mb2FkKCBvYmplY3QgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG9iamVjdDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBc3luYyB2ZXJzaW9uIG9mIHtAbGluayBPYmplY3RMb2FkZXIjcGFyc2V9LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGpzb24gLSBUaGUgc2VyaWFsaXplZCAzRCBvYmplY3QuXHJcblx0ICogQHJldHVybiB7UHJvbWlzZTxPYmplY3QzRD59IEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHBhcnNlZCAzRCBvYmplY3QuXHJcblx0ICovXHJcblx0YXN5bmMgcGFyc2VBc3luYygganNvbiApIHtcclxuXHJcblx0XHRjb25zdCBhbmltYXRpb25zID0gdGhpcy5wYXJzZUFuaW1hdGlvbnMoIGpzb24uYW5pbWF0aW9ucyApO1xyXG5cdFx0Y29uc3Qgc2hhcGVzID0gdGhpcy5wYXJzZVNoYXBlcygganNvbi5zaGFwZXMgKTtcclxuXHRcdGNvbnN0IGdlb21ldHJpZXMgPSB0aGlzLnBhcnNlR2VvbWV0cmllcygganNvbi5nZW9tZXRyaWVzLCBzaGFwZXMgKTtcclxuXHJcblx0XHRjb25zdCBpbWFnZXMgPSBhd2FpdCB0aGlzLnBhcnNlSW1hZ2VzQXN5bmMoIGpzb24uaW1hZ2VzICk7XHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZXMgPSB0aGlzLnBhcnNlVGV4dHVyZXMoIGpzb24udGV4dHVyZXMsIGltYWdlcyApO1xyXG5cdFx0Y29uc3QgbWF0ZXJpYWxzID0gdGhpcy5wYXJzZU1hdGVyaWFscygganNvbi5tYXRlcmlhbHMsIHRleHR1cmVzICk7XHJcblxyXG5cdFx0Y29uc3Qgb2JqZWN0ID0gdGhpcy5wYXJzZU9iamVjdCgganNvbi5vYmplY3QsIGdlb21ldHJpZXMsIG1hdGVyaWFscywgdGV4dHVyZXMsIGFuaW1hdGlvbnMgKTtcclxuXHRcdGNvbnN0IHNrZWxldG9ucyA9IHRoaXMucGFyc2VTa2VsZXRvbnMoIGpzb24uc2tlbGV0b25zLCBvYmplY3QgKTtcclxuXHJcblx0XHR0aGlzLmJpbmRTa2VsZXRvbnMoIG9iamVjdCwgc2tlbGV0b25zICk7XHJcblx0XHR0aGlzLmJpbmRMaWdodFRhcmdldHMoIG9iamVjdCApO1xyXG5cclxuXHRcdHJldHVybiBvYmplY3Q7XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gaW50ZXJuYWxzXHJcblxyXG5cdHBhcnNlU2hhcGVzKCBqc29uICkge1xyXG5cclxuXHRcdGNvbnN0IHNoYXBlcyA9IHt9O1xyXG5cclxuXHRcdGlmICgganNvbiAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0ganNvbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBzaGFwZSA9IG5ldyBTaGFwZSgpLmZyb21KU09OKCBqc29uWyBpIF0gKTtcclxuXHJcblx0XHRcdFx0c2hhcGVzWyBzaGFwZS51dWlkIF0gPSBzaGFwZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHNoYXBlcztcclxuXHJcblx0fVxyXG5cclxuXHRwYXJzZVNrZWxldG9ucygganNvbiwgb2JqZWN0ICkge1xyXG5cclxuXHRcdGNvbnN0IHNrZWxldG9ucyA9IHt9O1xyXG5cdFx0Y29uc3QgYm9uZXMgPSB7fTtcclxuXHJcblx0XHQvLyBnZW5lcmF0ZSBib25lIGxvb2t1cCB0YWJsZVxyXG5cclxuXHRcdG9iamVjdC50cmF2ZXJzZSggZnVuY3Rpb24gKCBjaGlsZCApIHtcclxuXHJcblx0XHRcdGlmICggY2hpbGQuaXNCb25lICkgYm9uZXNbIGNoaWxkLnV1aWQgXSA9IGNoaWxkO1xyXG5cclxuXHRcdH0gKTtcclxuXHJcblx0XHQvLyBjcmVhdGUgc2tlbGV0b25zXHJcblxyXG5cdFx0aWYgKCBqc29uICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBqc29uLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHNrZWxldG9uID0gbmV3IFNrZWxldG9uKCkuZnJvbUpTT04oIGpzb25bIGkgXSwgYm9uZXMgKTtcclxuXHJcblx0XHRcdFx0c2tlbGV0b25zWyBza2VsZXRvbi51dWlkIF0gPSBza2VsZXRvbjtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHNrZWxldG9ucztcclxuXHJcblx0fVxyXG5cclxuXHRwYXJzZUdlb21ldHJpZXMoIGpzb24sIHNoYXBlcyApIHtcclxuXHJcblx0XHRjb25zdCBnZW9tZXRyaWVzID0ge307XHJcblxyXG5cdFx0aWYgKCBqc29uICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBidWZmZXJHZW9tZXRyeUxvYWRlciA9IG5ldyBCdWZmZXJHZW9tZXRyeUxvYWRlcigpO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0ganNvbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRsZXQgZ2VvbWV0cnk7XHJcblx0XHRcdFx0Y29uc3QgZGF0YSA9IGpzb25bIGkgXTtcclxuXHJcblx0XHRcdFx0c3dpdGNoICggZGF0YS50eXBlICkge1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgJ0J1ZmZlckdlb21ldHJ5JzpcclxuXHRcdFx0XHRcdGNhc2UgJ0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5JzpcclxuXHJcblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gYnVmZmVyR2VvbWV0cnlMb2FkZXIucGFyc2UoIGRhdGEgKTtcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0ZGVmYXVsdDpcclxuXHJcblx0XHRcdFx0XHRcdGlmICggZGF0YS50eXBlIGluIEdlb21ldHJpZXMgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gR2VvbWV0cmllc1sgZGF0YS50eXBlIF0uZnJvbUpTT04oIGRhdGEsIHNoYXBlcyApO1xyXG5cclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0Y29uc29sZS53YXJuKCBgVEhSRUUuT2JqZWN0TG9hZGVyOiBVbnN1cHBvcnRlZCBnZW9tZXRyeSB0eXBlIFwiJHsgZGF0YS50eXBlIH1cImAgKTtcclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRnZW9tZXRyeS51dWlkID0gZGF0YS51dWlkO1xyXG5cclxuXHRcdFx0XHRpZiAoIGRhdGEubmFtZSAhPT0gdW5kZWZpbmVkICkgZ2VvbWV0cnkubmFtZSA9IGRhdGEubmFtZTtcclxuXHRcdFx0XHRpZiAoIGRhdGEudXNlckRhdGEgIT09IHVuZGVmaW5lZCApIGdlb21ldHJ5LnVzZXJEYXRhID0gZGF0YS51c2VyRGF0YTtcclxuXHJcblx0XHRcdFx0Z2VvbWV0cmllc1sgZGF0YS51dWlkIF0gPSBnZW9tZXRyeTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGdlb21ldHJpZXM7XHJcblxyXG5cdH1cclxuXHJcblx0cGFyc2VNYXRlcmlhbHMoIGpzb24sIHRleHR1cmVzICkge1xyXG5cclxuXHRcdGNvbnN0IGNhY2hlID0ge307IC8vIE11bHRpTWF0ZXJpYWxcclxuXHRcdGNvbnN0IG1hdGVyaWFscyA9IHt9O1xyXG5cclxuXHRcdGlmICgganNvbiAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Y29uc3QgbG9hZGVyID0gbmV3IE1hdGVyaWFsTG9hZGVyKCk7XHJcblx0XHRcdGxvYWRlci5zZXRUZXh0dXJlcyggdGV4dHVyZXMgKTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGpzb24ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgZGF0YSA9IGpzb25bIGkgXTtcclxuXHJcblx0XHRcdFx0aWYgKCBjYWNoZVsgZGF0YS51dWlkIF0gPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRjYWNoZVsgZGF0YS51dWlkIF0gPSBsb2FkZXIucGFyc2UoIGRhdGEgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRtYXRlcmlhbHNbIGRhdGEudXVpZCBdID0gY2FjaGVbIGRhdGEudXVpZCBdO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbWF0ZXJpYWxzO1xyXG5cclxuXHR9XHJcblxyXG5cdHBhcnNlQW5pbWF0aW9ucygganNvbiApIHtcclxuXHJcblx0XHRjb25zdCBhbmltYXRpb25zID0ge307XHJcblxyXG5cdFx0aWYgKCBqc29uICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBqc29uLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgZGF0YSA9IGpzb25bIGkgXTtcclxuXHJcblx0XHRcdFx0Y29uc3QgY2xpcCA9IEFuaW1hdGlvbkNsaXAucGFyc2UoIGRhdGEgKTtcclxuXHJcblx0XHRcdFx0YW5pbWF0aW9uc1sgY2xpcC51dWlkIF0gPSBjbGlwO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gYW5pbWF0aW9ucztcclxuXHJcblx0fVxyXG5cclxuXHRwYXJzZUltYWdlcygganNvbiwgb25Mb2FkICkge1xyXG5cclxuXHRcdGNvbnN0IHNjb3BlID0gdGhpcztcclxuXHRcdGNvbnN0IGltYWdlcyA9IHt9O1xyXG5cclxuXHRcdGxldCBsb2FkZXI7XHJcblxyXG5cdFx0ZnVuY3Rpb24gbG9hZEltYWdlKCB1cmwgKSB7XHJcblxyXG5cdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1TdGFydCggdXJsICk7XHJcblxyXG5cdFx0XHRyZXR1cm4gbG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCkge1xyXG5cclxuXHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xyXG5cclxuXHRcdFx0fSwgdW5kZWZpbmVkLCBmdW5jdGlvbiAoKSB7XHJcblxyXG5cdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVycm9yKCB1cmwgKTtcclxuXHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xyXG5cclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiBkZXNlcmlhbGl6ZUltYWdlKCBpbWFnZSApIHtcclxuXHJcblx0XHRcdGlmICggdHlwZW9mIGltYWdlID09PSAnc3RyaW5nJyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgdXJsID0gaW1hZ2U7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHBhdGggPSAvXihcXC9cXC8pfChbYS16XSs6KFxcL1xcLyk/KS9pLnRlc3QoIHVybCApID8gdXJsIDogc2NvcGUucmVzb3VyY2VQYXRoICsgdXJsO1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gbG9hZEltYWdlKCBwYXRoICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRpZiAoIGltYWdlLmRhdGEgKSB7XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHRcdFx0ZGF0YTogZ2V0VHlwZWRBcnJheSggaW1hZ2UudHlwZSwgaW1hZ2UuZGF0YSApLFxyXG5cdFx0XHRcdFx0XHR3aWR0aDogaW1hZ2Uud2lkdGgsXHJcblx0XHRcdFx0XHRcdGhlaWdodDogaW1hZ2UuaGVpZ2h0XHJcblx0XHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdHJldHVybiBudWxsO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICgganNvbiAhPT0gdW5kZWZpbmVkICYmIGpzb24ubGVuZ3RoID4gMCApIHtcclxuXHJcblx0XHRcdGNvbnN0IG1hbmFnZXIgPSBuZXcgTG9hZGluZ01hbmFnZXIoIG9uTG9hZCApO1xyXG5cclxuXHRcdFx0bG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCBtYW5hZ2VyICk7XHJcblx0XHRcdGxvYWRlci5zZXRDcm9zc09yaWdpbiggdGhpcy5jcm9zc09yaWdpbiApO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IGpzb24ubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGltYWdlID0ganNvblsgaSBdO1xyXG5cdFx0XHRcdGNvbnN0IHVybCA9IGltYWdlLnVybDtcclxuXHJcblx0XHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCB1cmwgKSApIHtcclxuXHJcblx0XHRcdFx0XHQvLyBsb2FkIGFycmF5IG9mIGltYWdlcyBlLmcgQ3ViZVRleHR1cmVcclxuXHJcblx0XHRcdFx0XHRjb25zdCBpbWFnZUFycmF5ID0gW107XHJcblxyXG5cdFx0XHRcdFx0Zm9yICggbGV0IGogPSAwLCBqbCA9IHVybC5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnN0IGN1cnJlbnRVcmwgPSB1cmxbIGogXTtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnN0IGRlc2VyaWFsaXplZEltYWdlID0gZGVzZXJpYWxpemVJbWFnZSggY3VycmVudFVybCApO1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCBkZXNlcmlhbGl6ZWRJbWFnZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKCBkZXNlcmlhbGl6ZWRJbWFnZSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0aW1hZ2VBcnJheS5wdXNoKCBkZXNlcmlhbGl6ZWRJbWFnZSApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8vIHNwZWNpYWwgY2FzZTogaGFuZGxlIGFycmF5IG9mIGRhdGEgdGV4dHVyZXMgZm9yIGN1YmUgdGV4dHVyZXNcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRpbWFnZUFycmF5LnB1c2goIG5ldyBEYXRhVGV4dHVyZSggZGVzZXJpYWxpemVkSW1hZ2UuZGF0YSwgZGVzZXJpYWxpemVkSW1hZ2Uud2lkdGgsIGRlc2VyaWFsaXplZEltYWdlLmhlaWdodCApICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aW1hZ2VzWyBpbWFnZS51dWlkIF0gPSBuZXcgU291cmNlKCBpbWFnZUFycmF5ICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gbG9hZCBzaW5nbGUgaW1hZ2VcclxuXHJcblx0XHRcdFx0XHRjb25zdCBkZXNlcmlhbGl6ZWRJbWFnZSA9IGRlc2VyaWFsaXplSW1hZ2UoIGltYWdlLnVybCApO1xyXG5cdFx0XHRcdFx0aW1hZ2VzWyBpbWFnZS51dWlkIF0gPSBuZXcgU291cmNlKCBkZXNlcmlhbGl6ZWRJbWFnZSApO1xyXG5cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gaW1hZ2VzO1xyXG5cclxuXHR9XHJcblxyXG5cdGFzeW5jIHBhcnNlSW1hZ2VzQXN5bmMoIGpzb24gKSB7XHJcblxyXG5cdFx0Y29uc3Qgc2NvcGUgPSB0aGlzO1xyXG5cdFx0Y29uc3QgaW1hZ2VzID0ge307XHJcblxyXG5cdFx0bGV0IGxvYWRlcjtcclxuXHJcblx0XHRhc3luYyBmdW5jdGlvbiBkZXNlcmlhbGl6ZUltYWdlKCBpbWFnZSApIHtcclxuXHJcblx0XHRcdGlmICggdHlwZW9mIGltYWdlID09PSAnc3RyaW5nJyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgdXJsID0gaW1hZ2U7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHBhdGggPSAvXihcXC9cXC8pfChbYS16XSs6KFxcL1xcLyk/KS9pLnRlc3QoIHVybCApID8gdXJsIDogc2NvcGUucmVzb3VyY2VQYXRoICsgdXJsO1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gYXdhaXQgbG9hZGVyLmxvYWRBc3luYyggcGF0aCApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0aWYgKCBpbWFnZS5kYXRhICkge1xyXG5cclxuXHRcdFx0XHRcdHJldHVybiB7XHJcblx0XHRcdFx0XHRcdGRhdGE6IGdldFR5cGVkQXJyYXkoIGltYWdlLnR5cGUsIGltYWdlLmRhdGEgKSxcclxuXHRcdFx0XHRcdFx0d2lkdGg6IGltYWdlLndpZHRoLFxyXG5cdFx0XHRcdFx0XHRoZWlnaHQ6IGltYWdlLmhlaWdodFxyXG5cdFx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGpzb24gIT09IHVuZGVmaW5lZCAmJiBqc29uLmxlbmd0aCA+IDAgKSB7XHJcblxyXG5cdFx0XHRsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoIHRoaXMubWFuYWdlciApO1xyXG5cdFx0XHRsb2FkZXIuc2V0Q3Jvc3NPcmlnaW4oIHRoaXMuY3Jvc3NPcmlnaW4gKTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBqc29uLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBpbWFnZSA9IGpzb25bIGkgXTtcclxuXHRcdFx0XHRjb25zdCB1cmwgPSBpbWFnZS51cmw7XHJcblxyXG5cdFx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggdXJsICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gbG9hZCBhcnJheSBvZiBpbWFnZXMgZS5nIEN1YmVUZXh0dXJlXHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgaW1hZ2VBcnJheSA9IFtdO1xyXG5cclxuXHRcdFx0XHRcdGZvciAoIGxldCBqID0gMCwgamwgPSB1cmwubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCBjdXJyZW50VXJsID0gdXJsWyBqIF07XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCBkZXNlcmlhbGl6ZWRJbWFnZSA9IGF3YWl0IGRlc2VyaWFsaXplSW1hZ2UoIGN1cnJlbnRVcmwgKTtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggZGVzZXJpYWxpemVkSW1hZ2UgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmICggZGVzZXJpYWxpemVkSW1hZ2UgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50ICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGltYWdlQXJyYXkucHVzaCggZGVzZXJpYWxpemVkSW1hZ2UgKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHQvLyBzcGVjaWFsIGNhc2U6IGhhbmRsZSBhcnJheSBvZiBkYXRhIHRleHR1cmVzIGZvciBjdWJlIHRleHR1cmVzXHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0aW1hZ2VBcnJheS5wdXNoKCBuZXcgRGF0YVRleHR1cmUoIGRlc2VyaWFsaXplZEltYWdlLmRhdGEsIGRlc2VyaWFsaXplZEltYWdlLndpZHRoLCBkZXNlcmlhbGl6ZWRJbWFnZS5oZWlnaHQgKSApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGltYWdlc1sgaW1hZ2UudXVpZCBdID0gbmV3IFNvdXJjZSggaW1hZ2VBcnJheSApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdC8vIGxvYWQgc2luZ2xlIGltYWdlXHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgZGVzZXJpYWxpemVkSW1hZ2UgPSBhd2FpdCBkZXNlcmlhbGl6ZUltYWdlKCBpbWFnZS51cmwgKTtcclxuXHRcdFx0XHRcdGltYWdlc1sgaW1hZ2UudXVpZCBdID0gbmV3IFNvdXJjZSggZGVzZXJpYWxpemVkSW1hZ2UgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gaW1hZ2VzO1xyXG5cclxuXHR9XHJcblxyXG5cdHBhcnNlVGV4dHVyZXMoIGpzb24sIGltYWdlcyApIHtcclxuXHJcblx0XHRmdW5jdGlvbiBwYXJzZUNvbnN0YW50KCB2YWx1ZSwgdHlwZSApIHtcclxuXHJcblx0XHRcdGlmICggdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyApIHJldHVybiB2YWx1ZTtcclxuXHJcblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlci5wYXJzZVRleHR1cmU6IENvbnN0YW50IHNob3VsZCBiZSBpbiBudW1lcmljIGZvcm0uJywgdmFsdWUgKTtcclxuXHJcblx0XHRcdHJldHVybiB0eXBlWyB2YWx1ZSBdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCB0ZXh0dXJlcyA9IHt9O1xyXG5cclxuXHRcdGlmICgganNvbiAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0ganNvbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBkYXRhID0ganNvblsgaSBdO1xyXG5cclxuXHRcdFx0XHRpZiAoIGRhdGEuaW1hZ2UgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXI6IE5vIFwiaW1hZ2VcIiBzcGVjaWZpZWQgZm9yJywgZGF0YS51dWlkICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKCBpbWFnZXNbIGRhdGEuaW1hZ2UgXSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIGltYWdlJywgZGF0YS5pbWFnZSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGNvbnN0IHNvdXJjZSA9IGltYWdlc1sgZGF0YS5pbWFnZSBdO1xyXG5cdFx0XHRcdGNvbnN0IGltYWdlID0gc291cmNlLmRhdGE7XHJcblxyXG5cdFx0XHRcdGxldCB0ZXh0dXJlO1xyXG5cclxuXHRcdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIGltYWdlICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0dGV4dHVyZSA9IG5ldyBDdWJlVGV4dHVyZSgpO1xyXG5cclxuXHRcdFx0XHRcdGlmICggaW1hZ2UubGVuZ3RoID09PSA2ICkgdGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBpbWFnZSAmJiBpbWFnZS5kYXRhICkge1xyXG5cclxuXHRcdFx0XHRcdFx0dGV4dHVyZSA9IG5ldyBEYXRhVGV4dHVyZSgpO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHR0ZXh0dXJlID0gbmV3IFRleHR1cmUoKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBpbWFnZSApIHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlOyAvLyB0ZXh0dXJlcyBjYW4gaGF2ZSB1bmRlZmluZWQgaW1hZ2UgZGF0YVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHRleHR1cmUuc291cmNlID0gc291cmNlO1xyXG5cclxuXHRcdFx0XHR0ZXh0dXJlLnV1aWQgPSBkYXRhLnV1aWQ7XHJcblxyXG5cdFx0XHRcdGlmICggZGF0YS5uYW1lICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLm5hbWUgPSBkYXRhLm5hbWU7XHJcblxyXG5cdFx0XHRcdGlmICggZGF0YS5tYXBwaW5nICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLm1hcHBpbmcgPSBwYXJzZUNvbnN0YW50KCBkYXRhLm1hcHBpbmcsIFRFWFRVUkVfTUFQUElORyApO1xyXG5cdFx0XHRcdGlmICggZGF0YS5jaGFubmVsICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLmNoYW5uZWwgPSBkYXRhLmNoYW5uZWw7XHJcblxyXG5cdFx0XHRcdGlmICggZGF0YS5vZmZzZXQgIT09IHVuZGVmaW5lZCApIHRleHR1cmUub2Zmc2V0LmZyb21BcnJheSggZGF0YS5vZmZzZXQgKTtcclxuXHRcdFx0XHRpZiAoIGRhdGEucmVwZWF0ICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLnJlcGVhdC5mcm9tQXJyYXkoIGRhdGEucmVwZWF0ICk7XHJcblx0XHRcdFx0aWYgKCBkYXRhLmNlbnRlciAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5jZW50ZXIuZnJvbUFycmF5KCBkYXRhLmNlbnRlciApO1xyXG5cdFx0XHRcdGlmICggZGF0YS5yb3RhdGlvbiAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5yb3RhdGlvbiA9IGRhdGEucm90YXRpb247XHJcblxyXG5cdFx0XHRcdGlmICggZGF0YS53cmFwICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0dGV4dHVyZS53cmFwUyA9IHBhcnNlQ29uc3RhbnQoIGRhdGEud3JhcFsgMCBdLCBURVhUVVJFX1dSQVBQSU5HICk7XHJcblx0XHRcdFx0XHR0ZXh0dXJlLndyYXBUID0gcGFyc2VDb25zdGFudCggZGF0YS53cmFwWyAxIF0sIFRFWFRVUkVfV1JBUFBJTkcgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoIGRhdGEuZm9ybWF0ICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLmZvcm1hdCA9IGRhdGEuZm9ybWF0O1xyXG5cdFx0XHRcdGlmICggZGF0YS5pbnRlcm5hbEZvcm1hdCAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5pbnRlcm5hbEZvcm1hdCA9IGRhdGEuaW50ZXJuYWxGb3JtYXQ7XHJcblx0XHRcdFx0aWYgKCBkYXRhLnR5cGUgIT09IHVuZGVmaW5lZCApIHRleHR1cmUudHlwZSA9IGRhdGEudHlwZTtcclxuXHRcdFx0XHRpZiAoIGRhdGEuY29sb3JTcGFjZSAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5jb2xvclNwYWNlID0gZGF0YS5jb2xvclNwYWNlO1xyXG5cclxuXHRcdFx0XHRpZiAoIGRhdGEubWluRmlsdGVyICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLm1pbkZpbHRlciA9IHBhcnNlQ29uc3RhbnQoIGRhdGEubWluRmlsdGVyLCBURVhUVVJFX0ZJTFRFUiApO1xyXG5cdFx0XHRcdGlmICggZGF0YS5tYWdGaWx0ZXIgIT09IHVuZGVmaW5lZCApIHRleHR1cmUubWFnRmlsdGVyID0gcGFyc2VDb25zdGFudCggZGF0YS5tYWdGaWx0ZXIsIFRFWFRVUkVfRklMVEVSICk7XHJcblx0XHRcdFx0aWYgKCBkYXRhLmFuaXNvdHJvcHkgIT09IHVuZGVmaW5lZCApIHRleHR1cmUuYW5pc290cm9weSA9IGRhdGEuYW5pc290cm9weTtcclxuXHJcblx0XHRcdFx0aWYgKCBkYXRhLmZsaXBZICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLmZsaXBZID0gZGF0YS5mbGlwWTtcclxuXHJcblx0XHRcdFx0aWYgKCBkYXRhLmdlbmVyYXRlTWlwbWFwcyAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBkYXRhLmdlbmVyYXRlTWlwbWFwcztcclxuXHRcdFx0XHRpZiAoIGRhdGEucHJlbXVsdGlwbHlBbHBoYSAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5wcmVtdWx0aXBseUFscGhhID0gZGF0YS5wcmVtdWx0aXBseUFscGhhO1xyXG5cdFx0XHRcdGlmICggZGF0YS51bnBhY2tBbGlnbm1lbnQgIT09IHVuZGVmaW5lZCApIHRleHR1cmUudW5wYWNrQWxpZ25tZW50ID0gZGF0YS51bnBhY2tBbGlnbm1lbnQ7XHJcblx0XHRcdFx0aWYgKCBkYXRhLmNvbXBhcmVGdW5jdGlvbiAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5jb21wYXJlRnVuY3Rpb24gPSBkYXRhLmNvbXBhcmVGdW5jdGlvbjtcclxuXHJcblx0XHRcdFx0aWYgKCBkYXRhLnVzZXJEYXRhICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLnVzZXJEYXRhID0gZGF0YS51c2VyRGF0YTtcclxuXHJcblx0XHRcdFx0dGV4dHVyZXNbIGRhdGEudXVpZCBdID0gdGV4dHVyZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRleHR1cmVzO1xyXG5cclxuXHR9XHJcblxyXG5cdHBhcnNlT2JqZWN0KCBkYXRhLCBnZW9tZXRyaWVzLCBtYXRlcmlhbHMsIHRleHR1cmVzLCBhbmltYXRpb25zICkge1xyXG5cclxuXHRcdGxldCBvYmplY3Q7XHJcblxyXG5cdFx0ZnVuY3Rpb24gZ2V0R2VvbWV0cnkoIG5hbWUgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGdlb21ldHJpZXNbIG5hbWUgXSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCBnZW9tZXRyeScsIG5hbWUgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBnZW9tZXRyaWVzWyBuYW1lIF07XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIGdldE1hdGVyaWFsKCBuYW1lICkge1xyXG5cclxuXHRcdFx0aWYgKCBuYW1lID09PSB1bmRlZmluZWQgKSByZXR1cm4gdW5kZWZpbmVkO1xyXG5cclxuXHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBuYW1lICkgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGFycmF5ID0gW107XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IG5hbWUubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCB1dWlkID0gbmFtZVsgaSBdO1xyXG5cclxuXHRcdFx0XHRcdGlmICggbWF0ZXJpYWxzWyB1dWlkIF0gPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIG1hdGVyaWFsJywgdXVpZCApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRhcnJheS5wdXNoKCBtYXRlcmlhbHNbIHV1aWQgXSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHJldHVybiBhcnJheTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWxzWyBuYW1lIF0gPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgbWF0ZXJpYWwnLCBuYW1lICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gbWF0ZXJpYWxzWyBuYW1lIF07XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIGdldFRleHR1cmUoIHV1aWQgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHRleHR1cmVzWyB1dWlkIF0gPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgdGV4dHVyZScsIHV1aWQgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiB0ZXh0dXJlc1sgdXVpZCBdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRsZXQgZ2VvbWV0cnksIG1hdGVyaWFsO1xyXG5cclxuXHRcdHN3aXRjaCAoIGRhdGEudHlwZSApIHtcclxuXHJcblx0XHRcdGNhc2UgJ1NjZW5lJzpcclxuXHJcblx0XHRcdFx0b2JqZWN0ID0gbmV3IFNjZW5lKCk7XHJcblxyXG5cdFx0XHRcdGlmICggZGF0YS5iYWNrZ3JvdW5kICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBOdW1iZXIuaXNJbnRlZ2VyKCBkYXRhLmJhY2tncm91bmQgKSApIHtcclxuXHJcblx0XHRcdFx0XHRcdG9iamVjdC5iYWNrZ3JvdW5kID0gbmV3IENvbG9yKCBkYXRhLmJhY2tncm91bmQgKTtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0b2JqZWN0LmJhY2tncm91bmQgPSBnZXRUZXh0dXJlKCBkYXRhLmJhY2tncm91bmQgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKCBkYXRhLmVudmlyb25tZW50ICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0b2JqZWN0LmVudmlyb25tZW50ID0gZ2V0VGV4dHVyZSggZGF0YS5lbnZpcm9ubWVudCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICggZGF0YS5mb2cgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGRhdGEuZm9nLnR5cGUgPT09ICdGb2cnICkge1xyXG5cclxuXHRcdFx0XHRcdFx0b2JqZWN0LmZvZyA9IG5ldyBGb2coIGRhdGEuZm9nLmNvbG9yLCBkYXRhLmZvZy5uZWFyLCBkYXRhLmZvZy5mYXIgKTtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKCBkYXRhLmZvZy50eXBlID09PSAnRm9nRXhwMicgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRvYmplY3QuZm9nID0gbmV3IEZvZ0V4cDIoIGRhdGEuZm9nLmNvbG9yLCBkYXRhLmZvZy5kZW5zaXR5ICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGlmICggZGF0YS5mb2cubmFtZSAhPT0gJycgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRvYmplY3QuZm9nLm5hbWUgPSBkYXRhLmZvZy5uYW1lO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoIGRhdGEuYmFja2dyb3VuZEJsdXJyaW5lc3MgIT09IHVuZGVmaW5lZCApIG9iamVjdC5iYWNrZ3JvdW5kQmx1cnJpbmVzcyA9IGRhdGEuYmFja2dyb3VuZEJsdXJyaW5lc3M7XHJcblx0XHRcdFx0aWYgKCBkYXRhLmJhY2tncm91bmRJbnRlbnNpdHkgIT09IHVuZGVmaW5lZCApIG9iamVjdC5iYWNrZ3JvdW5kSW50ZW5zaXR5ID0gZGF0YS5iYWNrZ3JvdW5kSW50ZW5zaXR5O1xyXG5cdFx0XHRcdGlmICggZGF0YS5iYWNrZ3JvdW5kUm90YXRpb24gIT09IHVuZGVmaW5lZCApIG9iamVjdC5iYWNrZ3JvdW5kUm90YXRpb24uZnJvbUFycmF5KCBkYXRhLmJhY2tncm91bmRSb3RhdGlvbiApO1xyXG5cclxuXHRcdFx0XHRpZiAoIGRhdGEuZW52aXJvbm1lbnRJbnRlbnNpdHkgIT09IHVuZGVmaW5lZCApIG9iamVjdC5lbnZpcm9ubWVudEludGVuc2l0eSA9IGRhdGEuZW52aXJvbm1lbnRJbnRlbnNpdHk7XHJcblx0XHRcdFx0aWYgKCBkYXRhLmVudmlyb25tZW50Um90YXRpb24gIT09IHVuZGVmaW5lZCApIG9iamVjdC5lbnZpcm9ubWVudFJvdGF0aW9uLmZyb21BcnJheSggZGF0YS5lbnZpcm9ubWVudFJvdGF0aW9uICk7XHJcblxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSAnUGVyc3BlY3RpdmVDYW1lcmEnOlxyXG5cclxuXHRcdFx0XHRvYmplY3QgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIGRhdGEuZm92LCBkYXRhLmFzcGVjdCwgZGF0YS5uZWFyLCBkYXRhLmZhciApO1xyXG5cclxuXHRcdFx0XHRpZiAoIGRhdGEuZm9jdXMgIT09IHVuZGVmaW5lZCApIG9iamVjdC5mb2N1cyA9IGRhdGEuZm9jdXM7XHJcblx0XHRcdFx0aWYgKCBkYXRhLnpvb20gIT09IHVuZGVmaW5lZCApIG9iamVjdC56b29tID0gZGF0YS56b29tO1xyXG5cdFx0XHRcdGlmICggZGF0YS5maWxtR2F1Z2UgIT09IHVuZGVmaW5lZCApIG9iamVjdC5maWxtR2F1Z2UgPSBkYXRhLmZpbG1HYXVnZTtcclxuXHRcdFx0XHRpZiAoIGRhdGEuZmlsbU9mZnNldCAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmZpbG1PZmZzZXQgPSBkYXRhLmZpbG1PZmZzZXQ7XHJcblx0XHRcdFx0aWYgKCBkYXRhLnZpZXcgIT09IHVuZGVmaW5lZCApIG9iamVjdC52aWV3ID0gT2JqZWN0LmFzc2lnbigge30sIGRhdGEudmlldyApO1xyXG5cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgJ09ydGhvZ3JhcGhpY0NhbWVyYSc6XHJcblxyXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBPcnRob2dyYXBoaWNDYW1lcmEoIGRhdGEubGVmdCwgZGF0YS5yaWdodCwgZGF0YS50b3AsIGRhdGEuYm90dG9tLCBkYXRhLm5lYXIsIGRhdGEuZmFyICk7XHJcblxyXG5cdFx0XHRcdGlmICggZGF0YS56b29tICE9PSB1bmRlZmluZWQgKSBvYmplY3Quem9vbSA9IGRhdGEuem9vbTtcclxuXHRcdFx0XHRpZiAoIGRhdGEudmlldyAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnZpZXcgPSBPYmplY3QuYXNzaWduKCB7fSwgZGF0YS52aWV3ICk7XHJcblxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSAnQW1iaWVudExpZ2h0JzpcclxuXHJcblx0XHRcdFx0b2JqZWN0ID0gbmV3IEFtYmllbnRMaWdodCggZGF0YS5jb2xvciwgZGF0YS5pbnRlbnNpdHkgKTtcclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlICdEaXJlY3Rpb25hbExpZ2h0JzpcclxuXHJcblx0XHRcdFx0b2JqZWN0ID0gbmV3IERpcmVjdGlvbmFsTGlnaHQoIGRhdGEuY29sb3IsIGRhdGEuaW50ZW5zaXR5ICk7XHJcblx0XHRcdFx0b2JqZWN0LnRhcmdldCA9IGRhdGEudGFyZ2V0IHx8ICcnO1xyXG5cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgJ1BvaW50TGlnaHQnOlxyXG5cclxuXHRcdFx0XHRvYmplY3QgPSBuZXcgUG9pbnRMaWdodCggZGF0YS5jb2xvciwgZGF0YS5pbnRlbnNpdHksIGRhdGEuZGlzdGFuY2UsIGRhdGEuZGVjYXkgKTtcclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlICdSZWN0QXJlYUxpZ2h0JzpcclxuXHJcblx0XHRcdFx0b2JqZWN0ID0gbmV3IFJlY3RBcmVhTGlnaHQoIGRhdGEuY29sb3IsIGRhdGEuaW50ZW5zaXR5LCBkYXRhLndpZHRoLCBkYXRhLmhlaWdodCApO1xyXG5cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgJ1Nwb3RMaWdodCc6XHJcblxyXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBTcG90TGlnaHQoIGRhdGEuY29sb3IsIGRhdGEuaW50ZW5zaXR5LCBkYXRhLmRpc3RhbmNlLCBkYXRhLmFuZ2xlLCBkYXRhLnBlbnVtYnJhLCBkYXRhLmRlY2F5ICk7XHJcblx0XHRcdFx0b2JqZWN0LnRhcmdldCA9IGRhdGEudGFyZ2V0IHx8ICcnO1xyXG5cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgJ0hlbWlzcGhlcmVMaWdodCc6XHJcblxyXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBIZW1pc3BoZXJlTGlnaHQoIGRhdGEuY29sb3IsIGRhdGEuZ3JvdW5kQ29sb3IsIGRhdGEuaW50ZW5zaXR5ICk7XHJcblxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSAnTGlnaHRQcm9iZSc6XHJcblxyXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBMaWdodFByb2JlKCkuZnJvbUpTT04oIGRhdGEgKTtcclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlICdTa2lubmVkTWVzaCc6XHJcblxyXG5cdFx0XHRcdGdlb21ldHJ5ID0gZ2V0R2VvbWV0cnkoIGRhdGEuZ2VvbWV0cnkgKTtcclxuXHRcdFx0IFx0bWF0ZXJpYWwgPSBnZXRNYXRlcmlhbCggZGF0YS5tYXRlcmlhbCApO1xyXG5cclxuXHRcdFx0XHRvYmplY3QgPSBuZXcgU2tpbm5lZE1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG5cclxuXHRcdFx0XHRpZiAoIGRhdGEuYmluZE1vZGUgIT09IHVuZGVmaW5lZCApIG9iamVjdC5iaW5kTW9kZSA9IGRhdGEuYmluZE1vZGU7XHJcblx0XHRcdFx0aWYgKCBkYXRhLmJpbmRNYXRyaXggIT09IHVuZGVmaW5lZCApIG9iamVjdC5iaW5kTWF0cml4LmZyb21BcnJheSggZGF0YS5iaW5kTWF0cml4ICk7XHJcblx0XHRcdFx0aWYgKCBkYXRhLnNrZWxldG9uICE9PSB1bmRlZmluZWQgKSBvYmplY3Quc2tlbGV0b24gPSBkYXRhLnNrZWxldG9uO1xyXG5cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgJ01lc2gnOlxyXG5cclxuXHRcdFx0XHRnZW9tZXRyeSA9IGdldEdlb21ldHJ5KCBkYXRhLmdlb21ldHJ5ICk7XHJcblx0XHRcdFx0bWF0ZXJpYWwgPSBnZXRNYXRlcmlhbCggZGF0YS5tYXRlcmlhbCApO1xyXG5cclxuXHRcdFx0XHRvYmplY3QgPSBuZXcgTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcblxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSAnSW5zdGFuY2VkTWVzaCc6XHJcblxyXG5cdFx0XHRcdGdlb21ldHJ5ID0gZ2V0R2VvbWV0cnkoIGRhdGEuZ2VvbWV0cnkgKTtcclxuXHRcdFx0XHRtYXRlcmlhbCA9IGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICk7XHJcblx0XHRcdFx0Y29uc3QgY291bnQgPSBkYXRhLmNvdW50O1xyXG5cdFx0XHRcdGNvbnN0IGluc3RhbmNlTWF0cml4ID0gZGF0YS5pbnN0YW5jZU1hdHJpeDtcclxuXHRcdFx0XHRjb25zdCBpbnN0YW5jZUNvbG9yID0gZGF0YS5pbnN0YW5jZUNvbG9yO1xyXG5cclxuXHRcdFx0XHRvYmplY3QgPSBuZXcgSW5zdGFuY2VkTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsLCBjb3VudCApO1xyXG5cdFx0XHRcdG9iamVjdC5pbnN0YW5jZU1hdHJpeCA9IG5ldyBJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUoIG5ldyBGbG9hdDMyQXJyYXkoIGluc3RhbmNlTWF0cml4LmFycmF5ICksIDE2ICk7XHJcblx0XHRcdFx0aWYgKCBpbnN0YW5jZUNvbG9yICE9PSB1bmRlZmluZWQgKSBvYmplY3QuaW5zdGFuY2VDb2xvciA9IG5ldyBJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUoIG5ldyBGbG9hdDMyQXJyYXkoIGluc3RhbmNlQ29sb3IuYXJyYXkgKSwgaW5zdGFuY2VDb2xvci5pdGVtU2l6ZSApO1xyXG5cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgJ0JhdGNoZWRNZXNoJzpcclxuXHJcblx0XHRcdFx0Z2VvbWV0cnkgPSBnZXRHZW9tZXRyeSggZGF0YS5nZW9tZXRyeSApO1xyXG5cdFx0XHRcdG1hdGVyaWFsID0gZ2V0TWF0ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKTtcclxuXHJcblx0XHRcdFx0b2JqZWN0ID0gbmV3IEJhdGNoZWRNZXNoKCBkYXRhLm1heEluc3RhbmNlQ291bnQsIGRhdGEubWF4VmVydGV4Q291bnQsIGRhdGEubWF4SW5kZXhDb3VudCwgbWF0ZXJpYWwgKTtcclxuXHRcdFx0XHRvYmplY3QuZ2VvbWV0cnkgPSBnZW9tZXRyeTtcclxuXHRcdFx0XHRvYmplY3QucGVyT2JqZWN0RnJ1c3R1bUN1bGxlZCA9IGRhdGEucGVyT2JqZWN0RnJ1c3R1bUN1bGxlZDtcclxuXHRcdFx0XHRvYmplY3Quc29ydE9iamVjdHMgPSBkYXRhLnNvcnRPYmplY3RzO1xyXG5cclxuXHRcdFx0XHRvYmplY3QuX2RyYXdSYW5nZXMgPSBkYXRhLmRyYXdSYW5nZXM7XHJcblx0XHRcdFx0b2JqZWN0Ll9yZXNlcnZlZFJhbmdlcyA9IGRhdGEucmVzZXJ2ZWRSYW5nZXM7XHJcblxyXG5cdFx0XHRcdG9iamVjdC5fdmlzaWJpbGl0eSA9IGRhdGEudmlzaWJpbGl0eTtcclxuXHRcdFx0XHRvYmplY3QuX2FjdGl2ZSA9IGRhdGEuYWN0aXZlO1xyXG5cdFx0XHRcdG9iamVjdC5fYm91bmRzID0gZGF0YS5ib3VuZHMubWFwKCBib3VuZCA9PiB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgYm94ID0gbmV3IEJveDMoKTtcclxuXHRcdFx0XHRcdGJveC5taW4uZnJvbUFycmF5KCBib3VuZC5ib3hNaW4gKTtcclxuXHRcdFx0XHRcdGJveC5tYXguZnJvbUFycmF5KCBib3VuZC5ib3hNYXggKTtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBzcGhlcmUgPSBuZXcgU3BoZXJlKCk7XHJcblx0XHRcdFx0XHRzcGhlcmUucmFkaXVzID0gYm91bmQuc3BoZXJlUmFkaXVzO1xyXG5cdFx0XHRcdFx0c3BoZXJlLmNlbnRlci5mcm9tQXJyYXkoIGJvdW5kLnNwaGVyZUNlbnRlciApO1xyXG5cclxuXHRcdFx0XHRcdHJldHVybiB7XHJcblx0XHRcdFx0XHRcdGJveEluaXRpYWxpemVkOiBib3VuZC5ib3hJbml0aWFsaXplZCxcclxuXHRcdFx0XHRcdFx0Ym94OiBib3gsXHJcblxyXG5cdFx0XHRcdFx0XHRzcGhlcmVJbml0aWFsaXplZDogYm91bmQuc3BoZXJlSW5pdGlhbGl6ZWQsXHJcblx0XHRcdFx0XHRcdHNwaGVyZTogc3BoZXJlXHJcblx0XHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRcdG9iamVjdC5fbWF4SW5zdGFuY2VDb3VudCA9IGRhdGEubWF4SW5zdGFuY2VDb3VudDtcclxuXHRcdFx0XHRvYmplY3QuX21heFZlcnRleENvdW50ID0gZGF0YS5tYXhWZXJ0ZXhDb3VudDtcclxuXHRcdFx0XHRvYmplY3QuX21heEluZGV4Q291bnQgPSBkYXRhLm1heEluZGV4Q291bnQ7XHJcblxyXG5cdFx0XHRcdG9iamVjdC5fZ2VvbWV0cnlJbml0aWFsaXplZCA9IGRhdGEuZ2VvbWV0cnlJbml0aWFsaXplZDtcclxuXHRcdFx0XHRvYmplY3QuX2dlb21ldHJ5Q291bnQgPSBkYXRhLmdlb21ldHJ5Q291bnQ7XHJcblxyXG5cdFx0XHRcdG9iamVjdC5fbWF0cmljZXNUZXh0dXJlID0gZ2V0VGV4dHVyZSggZGF0YS5tYXRyaWNlc1RleHR1cmUudXVpZCApO1xyXG5cdFx0XHRcdGlmICggZGF0YS5jb2xvcnNUZXh0dXJlICE9PSB1bmRlZmluZWQgKSBvYmplY3QuX2NvbG9yc1RleHR1cmUgPSBnZXRUZXh0dXJlKCBkYXRhLmNvbG9yc1RleHR1cmUudXVpZCApO1xyXG5cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgJ0xPRCc6XHJcblxyXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBMT0QoKTtcclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlICdMaW5lJzpcclxuXHJcblx0XHRcdFx0b2JqZWN0ID0gbmV3IExpbmUoIGdldEdlb21ldHJ5KCBkYXRhLmdlb21ldHJ5ICksIGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICkgKTtcclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlICdMaW5lTG9vcCc6XHJcblxyXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBMaW5lTG9vcCggZ2V0R2VvbWV0cnkoIGRhdGEuZ2VvbWV0cnkgKSwgZ2V0TWF0ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKSApO1xyXG5cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgJ0xpbmVTZWdtZW50cyc6XHJcblxyXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBMaW5lU2VnbWVudHMoIGdldEdlb21ldHJ5KCBkYXRhLmdlb21ldHJ5ICksIGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICkgKTtcclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlICdQb2ludENsb3VkJzpcclxuXHRcdFx0Y2FzZSAnUG9pbnRzJzpcclxuXHJcblx0XHRcdFx0b2JqZWN0ID0gbmV3IFBvaW50cyggZ2V0R2VvbWV0cnkoIGRhdGEuZ2VvbWV0cnkgKSwgZ2V0TWF0ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKSApO1xyXG5cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgJ1Nwcml0ZSc6XHJcblxyXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBTcHJpdGUoIGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICkgKTtcclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlICdHcm91cCc6XHJcblxyXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBHcm91cCgpO1xyXG5cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgJ0JvbmUnOlxyXG5cclxuXHRcdFx0XHRvYmplY3QgPSBuZXcgQm9uZSgpO1xyXG5cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGRlZmF1bHQ6XHJcblxyXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBPYmplY3QzRCgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRvYmplY3QudXVpZCA9IGRhdGEudXVpZDtcclxuXHJcblx0XHRpZiAoIGRhdGEubmFtZSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0Lm5hbWUgPSBkYXRhLm5hbWU7XHJcblxyXG5cdFx0aWYgKCBkYXRhLm1hdHJpeCAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0b2JqZWN0Lm1hdHJpeC5mcm9tQXJyYXkoIGRhdGEubWF0cml4ICk7XHJcblxyXG5cdFx0XHRpZiAoIGRhdGEubWF0cml4QXV0b1VwZGF0ZSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0Lm1hdHJpeEF1dG9VcGRhdGUgPSBkYXRhLm1hdHJpeEF1dG9VcGRhdGU7XHJcblx0XHRcdGlmICggb2JqZWN0Lm1hdHJpeEF1dG9VcGRhdGUgKSBvYmplY3QubWF0cml4LmRlY29tcG9zZSggb2JqZWN0LnBvc2l0aW9uLCBvYmplY3QucXVhdGVybmlvbiwgb2JqZWN0LnNjYWxlICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGlmICggZGF0YS5wb3NpdGlvbiAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnBvc2l0aW9uLmZyb21BcnJheSggZGF0YS5wb3NpdGlvbiApO1xyXG5cdFx0XHRpZiAoIGRhdGEucm90YXRpb24gIT09IHVuZGVmaW5lZCApIG9iamVjdC5yb3RhdGlvbi5mcm9tQXJyYXkoIGRhdGEucm90YXRpb24gKTtcclxuXHRcdFx0aWYgKCBkYXRhLnF1YXRlcm5pb24gIT09IHVuZGVmaW5lZCApIG9iamVjdC5xdWF0ZXJuaW9uLmZyb21BcnJheSggZGF0YS5xdWF0ZXJuaW9uICk7XHJcblx0XHRcdGlmICggZGF0YS5zY2FsZSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnNjYWxlLmZyb21BcnJheSggZGF0YS5zY2FsZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGRhdGEudXAgIT09IHVuZGVmaW5lZCApIG9iamVjdC51cC5mcm9tQXJyYXkoIGRhdGEudXAgKTtcclxuXHJcblx0XHRpZiAoIGRhdGEuY2FzdFNoYWRvdyAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmNhc3RTaGFkb3cgPSBkYXRhLmNhc3RTaGFkb3c7XHJcblx0XHRpZiAoIGRhdGEucmVjZWl2ZVNoYWRvdyAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnJlY2VpdmVTaGFkb3cgPSBkYXRhLnJlY2VpdmVTaGFkb3c7XHJcblxyXG5cdFx0aWYgKCBkYXRhLnNoYWRvdyApIHtcclxuXHJcblx0XHRcdGlmICggZGF0YS5zaGFkb3cuaW50ZW5zaXR5ICE9PSB1bmRlZmluZWQgKSBvYmplY3Quc2hhZG93LmludGVuc2l0eSA9IGRhdGEuc2hhZG93LmludGVuc2l0eTtcclxuXHRcdFx0aWYgKCBkYXRhLnNoYWRvdy5iaWFzICE9PSB1bmRlZmluZWQgKSBvYmplY3Quc2hhZG93LmJpYXMgPSBkYXRhLnNoYWRvdy5iaWFzO1xyXG5cdFx0XHRpZiAoIGRhdGEuc2hhZG93Lm5vcm1hbEJpYXMgIT09IHVuZGVmaW5lZCApIG9iamVjdC5zaGFkb3cubm9ybWFsQmlhcyA9IGRhdGEuc2hhZG93Lm5vcm1hbEJpYXM7XHJcblx0XHRcdGlmICggZGF0YS5zaGFkb3cucmFkaXVzICE9PSB1bmRlZmluZWQgKSBvYmplY3Quc2hhZG93LnJhZGl1cyA9IGRhdGEuc2hhZG93LnJhZGl1cztcclxuXHRcdFx0aWYgKCBkYXRhLnNoYWRvdy5tYXBTaXplICE9PSB1bmRlZmluZWQgKSBvYmplY3Quc2hhZG93Lm1hcFNpemUuZnJvbUFycmF5KCBkYXRhLnNoYWRvdy5tYXBTaXplICk7XHJcblx0XHRcdGlmICggZGF0YS5zaGFkb3cuY2FtZXJhICE9PSB1bmRlZmluZWQgKSBvYmplY3Quc2hhZG93LmNhbWVyYSA9IHRoaXMucGFyc2VPYmplY3QoIGRhdGEuc2hhZG93LmNhbWVyYSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGRhdGEudmlzaWJsZSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnZpc2libGUgPSBkYXRhLnZpc2libGU7XHJcblx0XHRpZiAoIGRhdGEuZnJ1c3R1bUN1bGxlZCAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmZydXN0dW1DdWxsZWQgPSBkYXRhLmZydXN0dW1DdWxsZWQ7XHJcblx0XHRpZiAoIGRhdGEucmVuZGVyT3JkZXIgIT09IHVuZGVmaW5lZCApIG9iamVjdC5yZW5kZXJPcmRlciA9IGRhdGEucmVuZGVyT3JkZXI7XHJcblx0XHRpZiAoIGRhdGEudXNlckRhdGEgIT09IHVuZGVmaW5lZCApIG9iamVjdC51c2VyRGF0YSA9IGRhdGEudXNlckRhdGE7XHJcblx0XHRpZiAoIGRhdGEubGF5ZXJzICE9PSB1bmRlZmluZWQgKSBvYmplY3QubGF5ZXJzLm1hc2sgPSBkYXRhLmxheWVycztcclxuXHJcblx0XHRpZiAoIGRhdGEuY2hpbGRyZW4gIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGNoaWxkcmVuID0gZGF0YS5jaGlsZHJlbjtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0b2JqZWN0LmFkZCggdGhpcy5wYXJzZU9iamVjdCggY2hpbGRyZW5bIGkgXSwgZ2VvbWV0cmllcywgbWF0ZXJpYWxzLCB0ZXh0dXJlcywgYW5pbWF0aW9ucyApICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggZGF0YS5hbmltYXRpb25zICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBvYmplY3RBbmltYXRpb25zID0gZGF0YS5hbmltYXRpb25zO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgb2JqZWN0QW5pbWF0aW9ucy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHV1aWQgPSBvYmplY3RBbmltYXRpb25zWyBpIF07XHJcblxyXG5cdFx0XHRcdG9iamVjdC5hbmltYXRpb25zLnB1c2goIGFuaW1hdGlvbnNbIHV1aWQgXSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGRhdGEudHlwZSA9PT0gJ0xPRCcgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGRhdGEuYXV0b1VwZGF0ZSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmF1dG9VcGRhdGUgPSBkYXRhLmF1dG9VcGRhdGU7XHJcblxyXG5cdFx0XHRjb25zdCBsZXZlbHMgPSBkYXRhLmxldmVscztcclxuXHJcblx0XHRcdGZvciAoIGxldCBsID0gMDsgbCA8IGxldmVscy5sZW5ndGg7IGwgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGxldmVsID0gbGV2ZWxzWyBsIF07XHJcblx0XHRcdFx0Y29uc3QgY2hpbGQgPSBvYmplY3QuZ2V0T2JqZWN0QnlQcm9wZXJ0eSggJ3V1aWQnLCBsZXZlbC5vYmplY3QgKTtcclxuXHJcblx0XHRcdFx0aWYgKCBjaGlsZCAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdG9iamVjdC5hZGRMZXZlbCggY2hpbGQsIGxldmVsLmRpc3RhbmNlLCBsZXZlbC5oeXN0ZXJlc2lzICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG9iamVjdDtcclxuXHJcblx0fVxyXG5cclxuXHRiaW5kU2tlbGV0b25zKCBvYmplY3QsIHNrZWxldG9ucyApIHtcclxuXHJcblx0XHRpZiAoIE9iamVjdC5rZXlzKCBza2VsZXRvbnMgKS5sZW5ndGggPT09IDAgKSByZXR1cm47XHJcblxyXG5cdFx0b2JqZWN0LnRyYXZlcnNlKCBmdW5jdGlvbiAoIGNoaWxkICkge1xyXG5cclxuXHRcdFx0aWYgKCBjaGlsZC5pc1NraW5uZWRNZXNoID09PSB0cnVlICYmIGNoaWxkLnNrZWxldG9uICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHNrZWxldG9uID0gc2tlbGV0b25zWyBjaGlsZC5za2VsZXRvbiBdO1xyXG5cclxuXHRcdFx0XHRpZiAoIHNrZWxldG9uID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0TG9hZGVyOiBObyBza2VsZXRvbiBmb3VuZCB3aXRoIFVVSUQ6JywgY2hpbGQuc2tlbGV0b24gKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRjaGlsZC5iaW5kKCBza2VsZXRvbiwgY2hpbGQuYmluZE1hdHJpeCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSApO1xyXG5cclxuXHR9XHJcblxyXG5cdGJpbmRMaWdodFRhcmdldHMoIG9iamVjdCApIHtcclxuXHJcblx0XHRvYmplY3QudHJhdmVyc2UoIGZ1bmN0aW9uICggY2hpbGQgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGNoaWxkLmlzRGlyZWN0aW9uYWxMaWdodCB8fCBjaGlsZC5pc1Nwb3RMaWdodCApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgdXVpZCA9IGNoaWxkLnRhcmdldDtcclxuXHJcblx0XHRcdFx0Y29uc3QgdGFyZ2V0ID0gb2JqZWN0LmdldE9iamVjdEJ5UHJvcGVydHkoICd1dWlkJywgdXVpZCApO1xyXG5cclxuXHRcdFx0XHRpZiAoIHRhcmdldCAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdGNoaWxkLnRhcmdldCA9IHRhcmdldDtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRjaGlsZC50YXJnZXQgPSBuZXcgT2JqZWN0M0QoKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuY29uc3QgVEVYVFVSRV9NQVBQSU5HID0ge1xyXG5cdFVWTWFwcGluZzogVVZNYXBwaW5nLFxyXG5cdEN1YmVSZWZsZWN0aW9uTWFwcGluZzogQ3ViZVJlZmxlY3Rpb25NYXBwaW5nLFxyXG5cdEN1YmVSZWZyYWN0aW9uTWFwcGluZzogQ3ViZVJlZnJhY3Rpb25NYXBwaW5nLFxyXG5cdEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nOiBFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZyxcclxuXHRFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZzogRXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmcsXHJcblx0Q3ViZVVWUmVmbGVjdGlvbk1hcHBpbmc6IEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nXHJcbn07XHJcblxyXG5jb25zdCBURVhUVVJFX1dSQVBQSU5HID0ge1xyXG5cdFJlcGVhdFdyYXBwaW5nOiBSZXBlYXRXcmFwcGluZyxcclxuXHRDbGFtcFRvRWRnZVdyYXBwaW5nOiBDbGFtcFRvRWRnZVdyYXBwaW5nLFxyXG5cdE1pcnJvcmVkUmVwZWF0V3JhcHBpbmc6IE1pcnJvcmVkUmVwZWF0V3JhcHBpbmdcclxufTtcclxuXHJcbmNvbnN0IFRFWFRVUkVfRklMVEVSID0ge1xyXG5cdE5lYXJlc3RGaWx0ZXI6IE5lYXJlc3RGaWx0ZXIsXHJcblx0TmVhcmVzdE1pcG1hcE5lYXJlc3RGaWx0ZXI6IE5lYXJlc3RNaXBtYXBOZWFyZXN0RmlsdGVyLFxyXG5cdE5lYXJlc3RNaXBtYXBMaW5lYXJGaWx0ZXI6IE5lYXJlc3RNaXBtYXBMaW5lYXJGaWx0ZXIsXHJcblx0TGluZWFyRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXHJcblx0TGluZWFyTWlwbWFwTmVhcmVzdEZpbHRlcjogTGluZWFyTWlwbWFwTmVhcmVzdEZpbHRlcixcclxuXHRMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXI6IExpbmVhck1pcG1hcExpbmVhckZpbHRlclxyXG59O1xyXG5cclxuZXhwb3J0IHsgT2JqZWN0TG9hZGVyIH07XHJcbiIsImltcG9ydCB7IENhY2hlIH0gZnJvbSAnLi9DYWNoZS5qcyc7XHJcbmltcG9ydCB7IExvYWRlciB9IGZyb20gJy4vTG9hZGVyLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIGxvYWRlciBmb3IgbG9hZGluZyBpbWFnZXMgYXMgYW4gW0ltYWdlQml0bWFwXXtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSW1hZ2VCaXRtYXB9LlxyXG4gKiBBbiBgSW1hZ2VCaXRtYXBgIHByb3ZpZGVzIGFuIGFzeW5jaHJvbm91cyBhbmQgcmVzb3VyY2UgZWZmaWNpZW50IHBhdGh3YXkgdG8gcHJlcGFyZVxyXG4gKiB0ZXh0dXJlcyBmb3IgcmVuZGVyaW5nLlxyXG4gKlxyXG4gKiBOb3RlIHRoYXQge0BsaW5rIFRleHR1cmUjZmxpcFl9IGFuZCB7QGxpbmsgVGV4dHVyZSNwcmVtdWx0aXBseUFscGhhfSBhcmUgaWdub3JlZCB3aXRoIGltYWdlIGJpdG1hcHMuXHJcbiAqIFRoZXkgbmVlZHMgdGhlc2UgY29uZmlndXJhdGlvbiBvbiBiaXRtYXAgY3JlYXRpb24gdW5saWtlIHJlZ3VsYXIgaW1hZ2VzIG5lZWQgdGhlbSBvbiB1cGxvYWRpbmcgdG8gR1BVLlxyXG4gKlxyXG4gKiBZb3UgbmVlZCB0byBzZXQgdGhlIGVxdWl2YWxlbnQgb3B0aW9ucyB2aWEge0BsaW5rIEltYWdlQml0bWFwTG9hZGVyI3NldE9wdGlvbnN9IGluc3RlYWQuXHJcbiAqXHJcbiAqIEFsc28gbm90ZSB0aGF0IHVubGlrZSB7QGxpbmsgRmlsZUxvYWRlcn0sIHRoaXMgbG9hZGVyIGRvZXMgbm90IGF2b2lkIG11bHRpcGxlIGNvbmN1cnJlbnQgcmVxdWVzdHMgdG8gdGhlIHNhbWUgVVJMLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBsb2FkZXIgPSBuZXcgVEhSRUUuSW1hZ2VCaXRtYXBMb2FkZXIoKTtcclxuICogbG9hZGVyLnNldE9wdGlvbnMoIHsgaW1hZ2VPcmllbnRhdGlvbjogJ2ZsaXBZJyB9ICk7IC8vIHNldCBvcHRpb25zIGlmIG5lZWRlZFxyXG4gKiBjb25zdCBpbWFnZUJpdG1hcCA9IGF3YWl0IGxvYWRlci5sb2FkQXN5bmMoICdpbWFnZS5wbmcnICk7XHJcbiAqXHJcbiAqIGNvbnN0IHRleHR1cmUgPSBuZXcgVEhSRUUuVGV4dHVyZSggaW1hZ2VCaXRtYXAgKTtcclxuICogdGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTG9hZGVyXHJcbiAqL1xyXG5jbGFzcyBJbWFnZUJpdG1hcExvYWRlciBleHRlbmRzIExvYWRlciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgaW1hZ2UgYml0bWFwIGxvYWRlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TG9hZGluZ01hbmFnZXJ9IFttYW5hZ2VyXSAtIFRoZSBsb2FkaW5nIG1hbmFnZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG1hbmFnZXIgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG1hbmFnZXIgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNJbWFnZUJpdG1hcExvYWRlciA9IHRydWU7XHJcblxyXG5cdFx0aWYgKCB0eXBlb2YgY3JlYXRlSW1hZ2VCaXRtYXAgPT09ICd1bmRlZmluZWQnICkge1xyXG5cclxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuSW1hZ2VCaXRtYXBMb2FkZXI6IGNyZWF0ZUltYWdlQml0bWFwKCkgbm90IHN1cHBvcnRlZC4nICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdHlwZW9mIGZldGNoID09PSAndW5kZWZpbmVkJyApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkltYWdlQml0bWFwTG9hZGVyOiBmZXRjaCgpIG5vdCBzdXBwb3J0ZWQuJyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlcHJlc2VudHMgdGhlIGxvYWRlciBvcHRpb25zLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XHJcblx0XHQgKiBAZGVmYXVsdCB7cHJlbXVsdGlwbHlBbHBoYTonbm9uZSd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMub3B0aW9ucyA9IHsgcHJlbXVsdGlwbHlBbHBoYTogJ25vbmUnIH07XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZ2l2ZW4gbG9hZGVyIG9wdGlvbnMuIFRoZSBzdHJ1Y3R1cmUgb2YgdGhlIG9iamVjdCBtdXN0IG1hdGNoIHRoZSBgb3B0aW9uc2AgcGFyYW1ldGVyIG9mXHJcblx0ICogW2NyZWF0ZUltYWdlQml0bWFwXXtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2luZG93L2NyZWF0ZUltYWdlQml0bWFwfS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gVGhlIGxvYWRlciBvcHRpb25zIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtJbWFnZUJpdG1hcExvYWRlcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbWFnZSBiaXRtYXAgbG9hZGVyLlxyXG5cdCAqL1xyXG5cdHNldE9wdGlvbnMoIG9wdGlvbnMgKSB7XHJcblxyXG5cdFx0dGhpcy5vcHRpb25zID0gb3B0aW9ucztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTdGFydHMgbG9hZGluZyBmcm9tIHRoZSBnaXZlbiBVUkwgYW5kIHBhc3MgdGhlIGxvYWRlZCBpbWFnZSBiaXRtYXAgdG8gdGhlIGBvbkxvYWQoKWAgY2FsbGJhY2suXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gVGhlIHBhdGgvVVJMIG9mIHRoZSBmaWxlIHRvIGJlIGxvYWRlZC4gVGhpcyBjYW4gYWxzbyBiZSBhIGRhdGEgVVJJLlxyXG5cdCAqIEBwYXJhbSB7ZnVuY3Rpb24oSW1hZ2VCaXRtYXApfSBvbkxvYWQgLSBFeGVjdXRlZCB3aGVuIHRoZSBsb2FkaW5nIHByb2Nlc3MgaGFzIGJlZW4gZmluaXNoZWQuXHJcblx0ICogQHBhcmFtIHtvblByb2dyZXNzQ2FsbGJhY2t9IG9uUHJvZ3Jlc3MgLSBVbnN1cHBvcnRlZCBpbiB0aGlzIGxvYWRlci5cclxuXHQgKiBAcGFyYW0ge29uRXJyb3JDYWxsYmFja30gb25FcnJvciAtIEV4ZWN1dGVkIHdoZW4gZXJyb3JzIG9jY3VyLlxyXG5cdCAqIEByZXR1cm4ge0ltYWdlQml0bWFwfHVuZGVmaW5lZH0gVGhlIGltYWdlIGJpdG1hcC5cclxuXHQgKi9cclxuXHRsb2FkKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcclxuXHJcblx0XHRpZiAoIHVybCA9PT0gdW5kZWZpbmVkICkgdXJsID0gJyc7XHJcblxyXG5cdFx0aWYgKCB0aGlzLnBhdGggIT09IHVuZGVmaW5lZCApIHVybCA9IHRoaXMucGF0aCArIHVybDtcclxuXHJcblx0XHR1cmwgPSB0aGlzLm1hbmFnZXIucmVzb2x2ZVVSTCggdXJsICk7XHJcblxyXG5cdFx0Y29uc3Qgc2NvcGUgPSB0aGlzO1xyXG5cclxuXHRcdGNvbnN0IGNhY2hlZCA9IENhY2hlLmdldCggdXJsICk7XHJcblxyXG5cdFx0aWYgKCBjYWNoZWQgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbVN0YXJ0KCB1cmwgKTtcclxuXHJcblx0XHRcdC8vIElmIGNhY2hlZCBpcyBhIHByb21pc2UsIHdhaXQgZm9yIGl0IHRvIHJlc29sdmVcclxuXHRcdFx0aWYgKCBjYWNoZWQudGhlbiApIHtcclxuXHJcblx0XHRcdFx0Y2FjaGVkLnRoZW4oIGltYWdlQml0bWFwID0+IHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggaW1hZ2VCaXRtYXAgKTtcclxuXHJcblx0XHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xyXG5cclxuXHRcdFx0XHR9ICkuY2F0Y2goIGUgPT4ge1xyXG5cclxuXHRcdFx0XHRcdGlmICggb25FcnJvciApIG9uRXJyb3IoIGUgKTtcclxuXHJcblx0XHRcdFx0fSApO1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIElmIGNhY2hlZCBpcyBub3QgYSBwcm9taXNlIChpLmUuLCBpdCdzIGFscmVhZHkgYW4gaW1hZ2VCaXRtYXApXHJcblx0XHRcdHNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHtcclxuXHJcblx0XHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIGNhY2hlZCApO1xyXG5cclxuXHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xyXG5cclxuXHRcdFx0fSwgMCApO1xyXG5cclxuXHRcdFx0cmV0dXJuIGNhY2hlZDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgZmV0Y2hPcHRpb25zID0ge307XHJcblx0XHRmZXRjaE9wdGlvbnMuY3JlZGVudGlhbHMgPSAoIHRoaXMuY3Jvc3NPcmlnaW4gPT09ICdhbm9ueW1vdXMnICkgPyAnc2FtZS1vcmlnaW4nIDogJ2luY2x1ZGUnO1xyXG5cdFx0ZmV0Y2hPcHRpb25zLmhlYWRlcnMgPSB0aGlzLnJlcXVlc3RIZWFkZXI7XHJcblxyXG5cdFx0Y29uc3QgcHJvbWlzZSA9IGZldGNoKCB1cmwsIGZldGNoT3B0aW9ucyApLnRoZW4oIGZ1bmN0aW9uICggcmVzICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIHJlcy5ibG9iKCk7XHJcblxyXG5cdFx0fSApLnRoZW4oIGZ1bmN0aW9uICggYmxvYiApIHtcclxuXHJcblx0XHRcdHJldHVybiBjcmVhdGVJbWFnZUJpdG1hcCggYmxvYiwgT2JqZWN0LmFzc2lnbiggc2NvcGUub3B0aW9ucywgeyBjb2xvclNwYWNlQ29udmVyc2lvbjogJ25vbmUnIH0gKSApO1xyXG5cclxuXHRcdH0gKS50aGVuKCBmdW5jdGlvbiAoIGltYWdlQml0bWFwICkge1xyXG5cclxuXHRcdFx0Q2FjaGUuYWRkKCB1cmwsIGltYWdlQml0bWFwICk7XHJcblxyXG5cdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggaW1hZ2VCaXRtYXAgKTtcclxuXHJcblx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XHJcblxyXG5cdFx0XHRyZXR1cm4gaW1hZ2VCaXRtYXA7XHJcblxyXG5cdFx0fSApLmNhdGNoKCBmdW5jdGlvbiAoIGUgKSB7XHJcblxyXG5cdFx0XHRpZiAoIG9uRXJyb3IgKSBvbkVycm9yKCBlICk7XHJcblxyXG5cdFx0XHRDYWNoZS5yZW1vdmUoIHVybCApO1xyXG5cclxuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRXJyb3IoIHVybCApO1xyXG5cdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xyXG5cclxuXHRcdH0gKTtcclxuXHJcblx0XHRDYWNoZS5hZGQoIHVybCwgcHJvbWlzZSApO1xyXG5cdFx0c2NvcGUubWFuYWdlci5pdGVtU3RhcnQoIHVybCApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBJbWFnZUJpdG1hcExvYWRlciB9O1xyXG4iLCJsZXQgX2NvbnRleHQ7XHJcblxyXG4vKipcclxuICogTWFuYWdlcyB0aGUgZ2xvYmFsIGF1ZGlvIGNvbnRleHQgaW4gdGhlIGVuZ2luZS5cclxuICpcclxuICogQGhpZGVjb25zdHJ1Y3RvclxyXG4gKi9cclxuY2xhc3MgQXVkaW9Db250ZXh0IHtcclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgZ2xvYmFsIG5hdGl2ZSBhdWRpbyBjb250ZXh0LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7QXVkaW9Db250ZXh0fSBUaGUgbmF0aXZlIGF1ZGlvIGNvbnRleHQuXHJcblx0ICovXHJcblx0c3RhdGljIGdldENvbnRleHQoKSB7XHJcblxyXG5cdFx0aWYgKCBfY29udGV4dCA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0X2NvbnRleHQgPSBuZXcgKCB3aW5kb3cuQXVkaW9Db250ZXh0IHx8IHdpbmRvdy53ZWJraXRBdWRpb0NvbnRleHQgKSgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gX2NvbnRleHQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWxsb3dzIHRvIHNldCB0aGUgZ2xvYmFsIG5hdGl2ZSBhdWRpbyBjb250ZXh0IGZyb20gb3V0c2lkZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXVkaW9Db250ZXh0fSB2YWx1ZSAtIFRoZSBuYXRpdmUgY29udGV4dCB0byBzZXQuXHJcblx0ICovXHJcblx0c3RhdGljIHNldENvbnRleHQoIHZhbHVlICkge1xyXG5cclxuXHRcdF9jb250ZXh0ID0gdmFsdWU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IEF1ZGlvQ29udGV4dCB9O1xyXG4iLCJpbXBvcnQgeyBBdWRpb0NvbnRleHQgfSBmcm9tICcuLi9hdWRpby9BdWRpb0NvbnRleHQuanMnO1xyXG5pbXBvcnQgeyBGaWxlTG9hZGVyIH0gZnJvbSAnLi9GaWxlTG9hZGVyLmpzJztcclxuaW1wb3J0IHsgTG9hZGVyIH0gZnJvbSAnLi9Mb2FkZXIuanMnO1xyXG5cclxuLyoqXHJcbiAqIENsYXNzIGZvciBsb2FkaW5nIGF1ZGlvIGJ1ZmZlcnMuIEF1ZGlvcyBhcmUgaW50ZXJuYWxseVxyXG4gKiBsb2FkZWQgdmlhIHtAbGluayBGaWxlTG9hZGVyfS5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgYXVkaW9MaXN0ZW5lciA9IG5ldyBUSFJFRS5BdWRpb0xpc3RlbmVyKCk7XHJcbiAqIGNvbnN0IGFtYmllbnRTb3VuZCA9IG5ldyBUSFJFRS5BdWRpbyggYXVkaW9MaXN0ZW5lciApO1xyXG4gKlxyXG4gKiBjb25zdCBsb2FkZXIgPSBuZXcgVEhSRUUuQXVkaW9Mb2FkZXIoKTtcclxuICogY29uc3QgYXVkaW9CdWZmZXIgPSBhd2FpdCBsb2FkZXIubG9hZEFzeW5jKCAnYXVkaW8vYW1iaWVudF9vY2Vhbi5vZ2cnICk7XHJcbiAqXHJcbiAqIGFtYmllbnRTb3VuZC5zZXRCdWZmZXIoIGF1ZGlvQnVmZmVyICk7XHJcbiAqIGFtYmllbnRTb3VuZC5wbGF5KCk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTG9hZGVyXHJcbiAqL1xyXG5jbGFzcyBBdWRpb0xvYWRlciBleHRlbmRzIExvYWRlciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYXVkaW8gbG9hZGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtMb2FkaW5nTWFuYWdlcn0gW21hbmFnZXJdIC0gVGhlIGxvYWRpbmcgbWFuYWdlci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbWFuYWdlciApIHtcclxuXHJcblx0XHRzdXBlciggbWFuYWdlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFN0YXJ0cyBsb2FkaW5nIGZyb20gdGhlIGdpdmVuIFVSTCBhbmQgcGFzc2VzIHRoZSBsb2FkZWQgYXVkaW8gYnVmZmVyXHJcblx0ICogdG8gdGhlIGBvbkxvYWQoKWAgY2FsbGJhY2suXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gVGhlIHBhdGgvVVJMIG9mIHRoZSBmaWxlIHRvIGJlIGxvYWRlZC4gVGhpcyBjYW4gYWxzbyBiZSBhIGRhdGEgVVJJLlxyXG5cdCAqIEBwYXJhbSB7ZnVuY3Rpb24oQXVkaW9CdWZmZXIpfSBvbkxvYWQgLSBFeGVjdXRlZCB3aGVuIHRoZSBsb2FkaW5nIHByb2Nlc3MgaGFzIGJlZW4gZmluaXNoZWQuXHJcblx0ICogQHBhcmFtIHtvblByb2dyZXNzQ2FsbGJhY2t9IG9uUHJvZ3Jlc3MgLSBFeGVjdXRlZCB3aGlsZSB0aGUgbG9hZGluZyBpcyBpbiBwcm9ncmVzcy5cclxuXHQgKiBAcGFyYW0ge29uRXJyb3JDYWxsYmFja30gb25FcnJvciAtIEV4ZWN1dGVkIHdoZW4gZXJyb3JzIG9jY3VyLlxyXG5cdCAqL1xyXG5cdGxvYWQoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xyXG5cclxuXHRcdGNvbnN0IHNjb3BlID0gdGhpcztcclxuXHJcblx0XHRjb25zdCBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XHJcblx0XHRsb2FkZXIuc2V0UmVzcG9uc2VUeXBlKCAnYXJyYXlidWZmZXInICk7XHJcblx0XHRsb2FkZXIuc2V0UGF0aCggdGhpcy5wYXRoICk7XHJcblx0XHRsb2FkZXIuc2V0UmVxdWVzdEhlYWRlciggdGhpcy5yZXF1ZXN0SGVhZGVyICk7XHJcblx0XHRsb2FkZXIuc2V0V2l0aENyZWRlbnRpYWxzKCB0aGlzLndpdGhDcmVkZW50aWFscyApO1xyXG5cdFx0bG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCBidWZmZXIgKSB7XHJcblxyXG5cdFx0XHR0cnkge1xyXG5cclxuXHRcdFx0XHQvLyBDcmVhdGUgYSBjb3B5IG9mIHRoZSBidWZmZXIuIFRoZSBgZGVjb2RlQXVkaW9EYXRhYCBtZXRob2RcclxuXHRcdFx0XHQvLyBkZXRhY2hlcyB0aGUgYnVmZmVyIHdoZW4gY29tcGxldGUsIHByZXZlbnRpbmcgcmV1c2UuXHJcblx0XHRcdFx0Y29uc3QgYnVmZmVyQ29weSA9IGJ1ZmZlci5zbGljZSggMCApO1xyXG5cclxuXHRcdFx0XHRjb25zdCBjb250ZXh0ID0gQXVkaW9Db250ZXh0LmdldENvbnRleHQoKTtcclxuXHRcdFx0XHRjb250ZXh0LmRlY29kZUF1ZGlvRGF0YSggYnVmZmVyQ29weSwgZnVuY3Rpb24gKCBhdWRpb0J1ZmZlciApIHtcclxuXHJcblx0XHRcdFx0XHRvbkxvYWQoIGF1ZGlvQnVmZmVyICk7XHJcblxyXG5cdFx0XHRcdH0gKS5jYXRjaCggaGFuZGxlRXJyb3IgKTtcclxuXHJcblx0XHRcdH0gY2F0Y2ggKCBlICkge1xyXG5cclxuXHRcdFx0XHRoYW5kbGVFcnJvciggZSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcclxuXHJcblx0XHRmdW5jdGlvbiBoYW5kbGVFcnJvciggZSApIHtcclxuXHJcblx0XHRcdGlmICggb25FcnJvciApIHtcclxuXHJcblx0XHRcdFx0b25FcnJvciggZSApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0Y29uc29sZS5lcnJvciggZSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRXJyb3IoIHVybCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCB7IEF1ZGlvTG9hZGVyIH07XHJcbiIsImltcG9ydCB7IE1hdHJpeDQgfSBmcm9tICcuLi9tYXRoL01hdHJpeDQuanMnO1xyXG5pbXBvcnQgeyBERUcyUkFEIH0gZnJvbSAnLi4vbWF0aC9NYXRoVXRpbHMuanMnO1xyXG5pbXBvcnQgeyBQZXJzcGVjdGl2ZUNhbWVyYSB9IGZyb20gJy4vUGVyc3BlY3RpdmVDYW1lcmEuanMnO1xyXG5cclxuY29uc3QgX2V5ZVJpZ2h0ID0gLypAX19QVVJFX18qLyBuZXcgTWF0cml4NCgpO1xyXG5jb25zdCBfZXllTGVmdCA9IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDQoKTtcclxuY29uc3QgX3Byb2plY3Rpb25NYXRyaXggPSAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXg0KCk7XHJcblxyXG4vKipcclxuICogQSBzcGVjaWFsIHR5cGUgb2YgY2FtZXJhIHRoYXQgdXNlcyB0d28gcGVyc3BlY3RpdmUgY2FtZXJhcyB3aXRoXHJcbiAqIHN0ZXJlb3Njb3BpYyBwcm9qZWN0aW9uLiBDYW4gYmUgdXNlZCBmb3IgcmVuZGVyaW5nIHN0ZXJlbyBlZmZlY3RzXHJcbiAqIGxpa2UgWzNEIEFuYWdseXBoXXtAbGluayBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9BbmFnbHlwaF8zRH0gb3JcclxuICogW1BhcmFsbGF4IEJhcnJpZXJde0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL3BhcmFsbGF4X2JhcnJpZXJ9LlxyXG4gKi9cclxuY2xhc3MgU3RlcmVvQ2FtZXJhIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBzdGVyZW8gY2FtZXJhLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHR5cGUgcHJvcGVydHkgaXMgdXNlZCBmb3IgZGV0ZWN0aW5nIHRoZSBvYmplY3QgdHlwZVxyXG5cdFx0ICogaW4gY29udGV4dCBvZiBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudHlwZSA9ICdTdGVyZW9DYW1lcmEnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGFzcGVjdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFzcGVjdCA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZXllIHNlcGFyYXRpb24gd2hpY2ggcmVwcmVzZW50cyB0aGUgZGlzdGFuY2VcclxuXHRcdCAqIGJldHdlZW4gdGhlIGxlZnQgYW5kIHJpZ2h0IGNhbWVyYS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMC4wNjRcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5leWVTZXAgPSAwLjA2NDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjYW1lcmEgcmVwcmVzZW50aW5nIHRoZSBsZWZ0IGV5ZS4gVGhpcyBpcyBhZGRlZCB0byBsYXllciBgMWAgc28gb2JqZWN0cyB0byBiZVxyXG5cdFx0ICogcmVuZGVyZWQgYnkgdGhlIGxlZnQgY2FtZXJhIG11c3QgYWxzbyBiZSBhZGRlZCB0byB0aGlzIGxheWVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtQZXJzcGVjdGl2ZUNhbWVyYX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jYW1lcmFMID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCk7XHJcblx0XHR0aGlzLmNhbWVyYUwubGF5ZXJzLmVuYWJsZSggMSApO1xyXG5cdFx0dGhpcy5jYW1lcmFMLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjYW1lcmEgcmVwcmVzZW50aW5nIHRoZSByaWdodCBleWUuIFRoaXMgaXMgYWRkZWQgdG8gbGF5ZXIgYDJgIHNvIG9iamVjdHMgdG8gYmVcclxuXHRcdCAqIHJlbmRlcmVkIGJ5IHRoZSByaWdodCBjYW1lcmEgbXVzdCBhbHNvIGJlIGFkZGVkIHRvIHRoaXMgbGF5ZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1BlcnNwZWN0aXZlQ2FtZXJhfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNhbWVyYVIgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoKTtcclxuXHRcdHRoaXMuY2FtZXJhUi5sYXllcnMuZW5hYmxlKCAyICk7XHJcblx0XHR0aGlzLmNhbWVyYVIubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xyXG5cclxuXHRcdHRoaXMuX2NhY2hlID0ge1xyXG5cdFx0XHRmb2N1czogbnVsbCxcclxuXHRcdFx0Zm92OiBudWxsLFxyXG5cdFx0XHRhc3BlY3Q6IG51bGwsXHJcblx0XHRcdG5lYXI6IG51bGwsXHJcblx0XHRcdGZhcjogbnVsbCxcclxuXHRcdFx0em9vbTogbnVsbCxcclxuXHRcdFx0ZXllU2VwOiBudWxsXHJcblx0XHR9O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIHN0ZXJlbyBjYW1lcmEgYmFzZWQgb24gdGhlIGdpdmVuIHBlcnNwZWN0aXZlIGNhbWVyYS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UGVyc3BlY3RpdmVDYW1lcmF9IGNhbWVyYSAtIFRoZSBwZXJzcGVjdGl2ZSBjYW1lcmEuXHJcblx0ICovXHJcblx0dXBkYXRlKCBjYW1lcmEgKSB7XHJcblxyXG5cdFx0Y29uc3QgY2FjaGUgPSB0aGlzLl9jYWNoZTtcclxuXHJcblx0XHRjb25zdCBuZWVkc1VwZGF0ZSA9IGNhY2hlLmZvY3VzICE9PSBjYW1lcmEuZm9jdXMgfHwgY2FjaGUuZm92ICE9PSBjYW1lcmEuZm92IHx8XHJcblx0XHRcdGNhY2hlLmFzcGVjdCAhPT0gY2FtZXJhLmFzcGVjdCAqIHRoaXMuYXNwZWN0IHx8IGNhY2hlLm5lYXIgIT09IGNhbWVyYS5uZWFyIHx8XHJcblx0XHRcdGNhY2hlLmZhciAhPT0gY2FtZXJhLmZhciB8fCBjYWNoZS56b29tICE9PSBjYW1lcmEuem9vbSB8fCBjYWNoZS5leWVTZXAgIT09IHRoaXMuZXllU2VwO1xyXG5cclxuXHRcdGlmICggbmVlZHNVcGRhdGUgKSB7XHJcblxyXG5cdFx0XHRjYWNoZS5mb2N1cyA9IGNhbWVyYS5mb2N1cztcclxuXHRcdFx0Y2FjaGUuZm92ID0gY2FtZXJhLmZvdjtcclxuXHRcdFx0Y2FjaGUuYXNwZWN0ID0gY2FtZXJhLmFzcGVjdCAqIHRoaXMuYXNwZWN0O1xyXG5cdFx0XHRjYWNoZS5uZWFyID0gY2FtZXJhLm5lYXI7XHJcblx0XHRcdGNhY2hlLmZhciA9IGNhbWVyYS5mYXI7XHJcblx0XHRcdGNhY2hlLnpvb20gPSBjYW1lcmEuem9vbTtcclxuXHRcdFx0Y2FjaGUuZXllU2VwID0gdGhpcy5leWVTZXA7XHJcblxyXG5cdFx0XHQvLyBPZmYtYXhpcyBzdGVyZW9zY29waWMgZWZmZWN0IGJhc2VkIG9uXHJcblx0XHRcdC8vIGh0dHA6Ly9wYXVsYm91cmtlLm5ldC9zdGVyZW9ncmFwaGljcy9zdGVyZW9yZW5kZXIvXHJcblxyXG5cdFx0XHRfcHJvamVjdGlvbk1hdHJpeC5jb3B5KCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeCApO1xyXG5cdFx0XHRjb25zdCBleWVTZXBIYWxmID0gY2FjaGUuZXllU2VwIC8gMjtcclxuXHRcdFx0Y29uc3QgZXllU2VwT25Qcm9qZWN0aW9uID0gZXllU2VwSGFsZiAqIGNhY2hlLm5lYXIgLyBjYWNoZS5mb2N1cztcclxuXHRcdFx0Y29uc3QgeW1heCA9ICggY2FjaGUubmVhciAqIE1hdGgudGFuKCBERUcyUkFEICogY2FjaGUuZm92ICogMC41ICkgKSAvIGNhY2hlLnpvb207XHJcblx0XHRcdGxldCB4bWluLCB4bWF4O1xyXG5cclxuXHRcdFx0Ly8gdHJhbnNsYXRlIHhPZmZzZXRcclxuXHJcblx0XHRcdF9leWVMZWZ0LmVsZW1lbnRzWyAxMiBdID0gLSBleWVTZXBIYWxmO1xyXG5cdFx0XHRfZXllUmlnaHQuZWxlbWVudHNbIDEyIF0gPSBleWVTZXBIYWxmO1xyXG5cclxuXHRcdFx0Ly8gZm9yIGxlZnQgZXllXHJcblxyXG5cdFx0XHR4bWluID0gLSB5bWF4ICogY2FjaGUuYXNwZWN0ICsgZXllU2VwT25Qcm9qZWN0aW9uO1xyXG5cdFx0XHR4bWF4ID0geW1heCAqIGNhY2hlLmFzcGVjdCArIGV5ZVNlcE9uUHJvamVjdGlvbjtcclxuXHJcblx0XHRcdF9wcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWyAwIF0gPSAyICogY2FjaGUubmVhciAvICggeG1heCAtIHhtaW4gKTtcclxuXHRcdFx0X3Byb2plY3Rpb25NYXRyaXguZWxlbWVudHNbIDggXSA9ICggeG1heCArIHhtaW4gKSAvICggeG1heCAtIHhtaW4gKTtcclxuXHJcblx0XHRcdHRoaXMuY2FtZXJhTC5wcm9qZWN0aW9uTWF0cml4LmNvcHkoIF9wcm9qZWN0aW9uTWF0cml4ICk7XHJcblxyXG5cdFx0XHQvLyBmb3IgcmlnaHQgZXllXHJcblxyXG5cdFx0XHR4bWluID0gLSB5bWF4ICogY2FjaGUuYXNwZWN0IC0gZXllU2VwT25Qcm9qZWN0aW9uO1xyXG5cdFx0XHR4bWF4ID0geW1heCAqIGNhY2hlLmFzcGVjdCAtIGV5ZVNlcE9uUHJvamVjdGlvbjtcclxuXHJcblx0XHRcdF9wcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWyAwIF0gPSAyICogY2FjaGUubmVhciAvICggeG1heCAtIHhtaW4gKTtcclxuXHRcdFx0X3Byb2plY3Rpb25NYXRyaXguZWxlbWVudHNbIDggXSA9ICggeG1heCArIHhtaW4gKSAvICggeG1heCAtIHhtaW4gKTtcclxuXHJcblx0XHRcdHRoaXMuY2FtZXJhUi5wcm9qZWN0aW9uTWF0cml4LmNvcHkoIF9wcm9qZWN0aW9uTWF0cml4ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuY2FtZXJhTC5tYXRyaXhXb3JsZC5jb3B5KCBjYW1lcmEubWF0cml4V29ybGQgKS5tdWx0aXBseSggX2V5ZUxlZnQgKTtcclxuXHRcdHRoaXMuY2FtZXJhUi5tYXRyaXhXb3JsZC5jb3B5KCBjYW1lcmEubWF0cml4V29ybGQgKS5tdWx0aXBseSggX2V5ZVJpZ2h0ICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFN0ZXJlb0NhbWVyYSB9O1xyXG4iLCJpbXBvcnQgeyBQZXJzcGVjdGl2ZUNhbWVyYSB9IGZyb20gJy4vUGVyc3BlY3RpdmVDYW1lcmEuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgdHlwZSBvZiBjYW1lcmEgY2FuIGJlIHVzZWQgaW4gb3JkZXIgdG8gZWZmaWNpZW50bHkgcmVuZGVyIGEgc2NlbmUgd2l0aCBhXHJcbiAqIHByZWRlZmluZWQgc2V0IG9mIGNhbWVyYXMuIFRoaXMgaXMgYW4gaW1wb3J0YW50IHBlcmZvcm1hbmNlIGFzcGVjdCBmb3JcclxuICogcmVuZGVyaW5nIFZSIHNjZW5lcy5cclxuICpcclxuICogQW4gaW5zdGFuY2Ugb2YgYEFycmF5Q2FtZXJhYCBhbHdheXMgaGFzIGFuIGFycmF5IG9mIHN1YiBjYW1lcmFzLiBJdCdzIG1hbmRhdG9yeVxyXG4gKiB0byBkZWZpbmUgZm9yIGVhY2ggc3ViIGNhbWVyYSB0aGUgYHZpZXdwb3J0YCBwcm9wZXJ0eSB3aGljaCBkZXRlcm1pbmVzIHRoZVxyXG4gKiBwYXJ0IG9mIHRoZSB2aWV3cG9ydCB0aGF0IGlzIHJlbmRlcmVkIHdpdGggdGhpcyBjYW1lcmEuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBQZXJzcGVjdGl2ZUNhbWVyYVxyXG4gKi9cclxuY2xhc3MgQXJyYXlDYW1lcmEgZXh0ZW5kcyBQZXJzcGVjdGl2ZUNhbWVyYSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYXJyYXkgY2FtZXJhLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxQZXJzcGVjdGl2ZUNhbWVyYT59IFthcnJheT1bXV0gLSBBbiBhcnJheSBvZiBwZXJzcGVjdGl2ZSBzdWIgY2FtZXJhcy5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggYXJyYXkgPSBbXSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0FycmF5Q2FtZXJhID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIGFycmF5IG9mIHBlcnNwZWN0aXZlIHN1YiBjYW1lcmFzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxQZXJzcGVjdGl2ZUNhbWVyYT59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2FtZXJhcyA9IGFycmF5O1xyXG5cdFx0dGhpcy5pbmRleCA9IDA7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IEFycmF5Q2FtZXJhIH07XHJcbiIsIi8qKlxyXG4gKiBDbGFzcyBmb3Iga2VlcGluZyB0cmFjayBvZiB0aW1lLlxyXG4gKi9cclxuY2xhc3MgQ2xvY2sge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGNsb2NrLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbYXV0b1N0YXJ0PXRydWVdIC0gV2hldGhlciB0byBhdXRvbWF0aWNhbGx5IHN0YXJ0IHRoZSBjbG9jayB3aGVuXHJcblx0ICogYGdldERlbHRhKClgIGlzIGNhbGxlZCBmb3IgdGhlIGZpcnN0IHRpbWUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGF1dG9TdGFydCA9IHRydWUgKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBJZiBzZXQgdG8gYHRydWVgLCB0aGUgY2xvY2sgc3RhcnRzIGF1dG9tYXRpY2FsbHkgd2hlbiBgZ2V0RGVsdGEoKWAgaXMgY2FsbGVkXHJcblx0XHQgKiBmb3IgdGhlIGZpcnN0IHRpbWUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYXV0b1N0YXJ0ID0gYXV0b1N0YXJ0O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG9sZHMgdGhlIHRpbWUgYXQgd2hpY2ggdGhlIGNsb2NrJ3MgYHN0YXJ0KClgIG1ldGhvZCB3YXMgbGFzdCBjYWxsZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zdGFydFRpbWUgPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG9sZHMgdGhlIHRpbWUgYXQgd2hpY2ggdGhlIGNsb2NrJ3MgYHN0YXJ0KClgLCBgZ2V0RWxhcHNlZFRpbWUoKWAgb3JcclxuXHRcdCAqIGBnZXREZWx0YSgpYCBtZXRob2RzIHdlcmUgbGFzdCBjYWxsZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5vbGRUaW1lID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEtlZXBzIHRyYWNrIG9mIHRoZSB0b3RhbCB0aW1lIHRoYXQgdGhlIGNsb2NrIGhhcyBiZWVuIHJ1bm5pbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5lbGFwc2VkVGltZSA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSBjbG9jayBpcyBydW5uaW5nIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ydW5uaW5nID0gZmFsc2U7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3RhcnRzIHRoZSBjbG9jay4gV2hlbiBgYXV0b1N0YXJ0YCBpcyBzZXQgdG8gYHRydWVgLCB0aGUgbWV0aG9kIGlzIGF1dG9tYXRpY2FsbHlcclxuXHQgKiBjYWxsZWQgYnkgdGhlIGNsYXNzLlxyXG5cdCAqL1xyXG5cdHN0YXJ0KCkge1xyXG5cclxuXHRcdHRoaXMuc3RhcnRUaW1lID0gbm93KCk7XHJcblxyXG5cdFx0dGhpcy5vbGRUaW1lID0gdGhpcy5zdGFydFRpbWU7XHJcblx0XHR0aGlzLmVsYXBzZWRUaW1lID0gMDtcclxuXHRcdHRoaXMucnVubmluZyA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3RvcHMgdGhlIGNsb2NrLlxyXG5cdCAqL1xyXG5cdHN0b3AoKSB7XHJcblxyXG5cdFx0dGhpcy5nZXRFbGFwc2VkVGltZSgpO1xyXG5cdFx0dGhpcy5ydW5uaW5nID0gZmFsc2U7XHJcblx0XHR0aGlzLmF1dG9TdGFydCA9IGZhbHNlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGVsYXBzZWQgdGltZSBpbiBzZWNvbmRzLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgZWxhcHNlZCB0aW1lLlxyXG5cdCAqL1xyXG5cdGdldEVsYXBzZWRUaW1lKCkge1xyXG5cclxuXHRcdHRoaXMuZ2V0RGVsdGEoKTtcclxuXHRcdHJldHVybiB0aGlzLmVsYXBzZWRUaW1lO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGRlbHRhIHRpbWUgaW4gc2Vjb25kcy5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGRlbHRhIHRpbWUuXHJcblx0ICovXHJcblx0Z2V0RGVsdGEoKSB7XHJcblxyXG5cdFx0bGV0IGRpZmYgPSAwO1xyXG5cclxuXHRcdGlmICggdGhpcy5hdXRvU3RhcnQgJiYgISB0aGlzLnJ1bm5pbmcgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnN0YXJ0KCk7XHJcblx0XHRcdHJldHVybiAwO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMucnVubmluZyApIHtcclxuXHJcblx0XHRcdGNvbnN0IG5ld1RpbWUgPSBub3coKTtcclxuXHJcblx0XHRcdGRpZmYgPSAoIG5ld1RpbWUgLSB0aGlzLm9sZFRpbWUgKSAvIDEwMDA7XHJcblx0XHRcdHRoaXMub2xkVGltZSA9IG5ld1RpbWU7XHJcblxyXG5cdFx0XHR0aGlzLmVsYXBzZWRUaW1lICs9IGRpZmY7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBkaWZmO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBub3coKSB7XHJcblxyXG5cdHJldHVybiBwZXJmb3JtYW5jZS5ub3coKTtcclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IENsb2NrIH07XHJcbiIsImltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBRdWF0ZXJuaW9uIH0gZnJvbSAnLi4vbWF0aC9RdWF0ZXJuaW9uLmpzJztcclxuaW1wb3J0IHsgQ2xvY2sgfSBmcm9tICcuLi9jb3JlL0Nsb2NrLmpzJztcclxuaW1wb3J0IHsgT2JqZWN0M0QgfSBmcm9tICcuLi9jb3JlL09iamVjdDNELmpzJztcclxuaW1wb3J0IHsgQXVkaW9Db250ZXh0IH0gZnJvbSAnLi9BdWRpb0NvbnRleHQuanMnO1xyXG5cclxuY29uc3QgX3Bvc2l0aW9uID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfcXVhdGVybmlvbiA9IC8qQF9fUFVSRV9fKi8gbmV3IFF1YXRlcm5pb24oKTtcclxuY29uc3QgX3NjYWxlID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfb3JpZW50YXRpb24gPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcblxyXG4vKipcclxuICogVGhlIGNsYXNzIHJlcHJlc2VudHMgYSB2aXJ0dWFsIGxpc3RlbmVyIG9mIHRoZSBhbGwgcG9zaXRpb25hbCBhbmQgbm9uLXBvc2l0aW9uYWwgYXVkaW8gZWZmZWN0c1xyXG4gKiBpbiB0aGUgc2NlbmUuIEEgdGhyZWUuanMgYXBwbGljYXRpb24gdXN1YWxseSBjcmVhdGVzIGEgc2luZ2xlIGxpc3RlbmVyLiBJdCBpcyBhIG1hbmRhdG9yeVxyXG4gKiBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgZm9yIGF1ZGlvcyBlbnRpdGllcyBsaWtlIHtAbGluayBBdWRpb30gYW5kIHtAbGluayBQb3NpdGlvbmFsQXVkaW99LlxyXG4gKlxyXG4gKiBJbiBtb3N0IGNhc2VzLCB0aGUgbGlzdGVuZXIgb2JqZWN0IGlzIGEgY2hpbGQgb2YgdGhlIGNhbWVyYS4gU28gdGhlIDNEIHRyYW5zZm9ybWF0aW9uIG9mIHRoZVxyXG4gKiBjYW1lcmEgcmVwcmVzZW50cyB0aGUgM0QgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGxpc3RlbmVyLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgT2JqZWN0M0RcclxuICovXHJcbmNsYXNzIEF1ZGlvTGlzdGVuZXIgZXh0ZW5kcyBPYmplY3QzRCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYXVkaW8gbGlzdGVuZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnQXVkaW9MaXN0ZW5lcic7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbmF0aXZlIGF1ZGlvIGNvbnRleHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0F1ZGlvQ29udGV4dH1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvbnRleHQgPSBBdWRpb0NvbnRleHQuZ2V0Q29udGV4dCgpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGdhaW4gbm9kZSB1c2VkIGZvciB2b2x1bWUgY29udHJvbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7R2Fpbk5vZGV9XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nYWluID0gdGhpcy5jb250ZXh0LmNyZWF0ZUdhaW4oKTtcclxuXHRcdHRoaXMuZ2Fpbi5jb25uZWN0KCB0aGlzLmNvbnRleHQuZGVzdGluYXRpb24gKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIG9wdGlvbmFsIGZpbHRlci5cclxuXHRcdCAqXHJcblx0XHQgKiBEZWZpbmVkIHZpYSB7QGxpbmsgQXVkaW9MaXN0ZW5lciNzZXRGaWx0ZXJ9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/QXVkaW9Ob2RlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZmlsdGVyID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRpbWUgZGVsdGEgdmFsdWVzIHJlcXVpcmVkIGZvciBgbGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoKWAgdXNhZ2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRpbWVEZWx0YSA9IDA7XHJcblxyXG5cdFx0Ly8gcHJpdmF0ZVxyXG5cclxuXHRcdHRoaXMuX2Nsb2NrID0gbmV3IENsb2NrKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgbGlzdGVuZXIncyBpbnB1dCBub2RlLlxyXG5cdCAqXHJcblx0ICogVGhpcyBtZXRob2QgaXMgdXNlZCBieSBvdGhlciBhdWRpbyBub2RlcyB0byBjb25uZWN0IHRvIHRoaXMgbGlzdGVuZXIuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtHYWluTm9kZX0gVGhlIGlucHV0IG5vZGUuXHJcblx0ICovXHJcblx0Z2V0SW5wdXQoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZ2FpbjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW1vdmVzIHRoZSBjdXJyZW50IGZpbHRlciBmcm9tIHRoaXMgbGlzdGVuZXIuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtBdWRpb0xpc3RlbmVyfSBBIHJlZmVyZW5jZSB0byB0aGlzIGxpc3RlbmVyLlxyXG5cdCAqL1xyXG5cdHJlbW92ZUZpbHRlcigpIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuZmlsdGVyICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5nYWluLmRpc2Nvbm5lY3QoIHRoaXMuZmlsdGVyICk7XHJcblx0XHRcdHRoaXMuZmlsdGVyLmRpc2Nvbm5lY3QoIHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiApO1xyXG5cdFx0XHR0aGlzLmdhaW4uY29ubmVjdCggdGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uICk7XHJcblx0XHRcdHRoaXMuZmlsdGVyID0gbnVsbDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgY3VycmVudCBzZXQgZmlsdGVyLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7P0F1ZGlvTm9kZX0gVGhlIGZpbHRlci5cclxuXHQgKi9cclxuXHRnZXRGaWx0ZXIoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZmlsdGVyO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGdpdmVuIGZpbHRlciB0byB0aGlzIGxpc3RlbmVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBdWRpb05vZGV9IHZhbHVlIC0gVGhlIGZpbHRlciB0byBzZXQuXHJcblx0ICogQHJldHVybiB7QXVkaW9MaXN0ZW5lcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBsaXN0ZW5lci5cclxuXHQgKi9cclxuXHRzZXRGaWx0ZXIoIHZhbHVlICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5maWx0ZXIgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmdhaW4uZGlzY29ubmVjdCggdGhpcy5maWx0ZXIgKTtcclxuXHRcdFx0dGhpcy5maWx0ZXIuZGlzY29ubmVjdCggdGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHRoaXMuZ2Fpbi5kaXNjb25uZWN0KCB0aGlzLmNvbnRleHQuZGVzdGluYXRpb24gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5maWx0ZXIgPSB2YWx1ZTtcclxuXHRcdHRoaXMuZ2Fpbi5jb25uZWN0KCB0aGlzLmZpbHRlciApO1xyXG5cdFx0dGhpcy5maWx0ZXIuY29ubmVjdCggdGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgYXBwbGljYXRpb25zIG1hc3RlciB2b2x1bWUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBtYXN0ZXIgdm9sdW1lLlxyXG5cdCAqL1xyXG5cdGdldE1hc3RlclZvbHVtZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5nYWluLmdhaW4udmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgYXBwbGljYXRpb25zIG1hc3RlciB2b2x1bWUuIFRoaXMgdm9sdW1lIHNldHRpbmcgYWZmZWN0c1xyXG5cdCAqIGFsbCBhdWRpbyBub2RlcyBpbiB0aGUgc2NlbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgbWFzdGVyIHZvbHVtZSB0byBzZXQuXHJcblx0ICogQHJldHVybiB7QXVkaW9MaXN0ZW5lcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBsaXN0ZW5lci5cclxuXHQgKi9cclxuXHRzZXRNYXN0ZXJWb2x1bWUoIHZhbHVlICkge1xyXG5cclxuXHRcdHRoaXMuZ2Fpbi5nYWluLnNldFRhcmdldEF0VGltZSggdmFsdWUsIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwgMC4wMSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdHVwZGF0ZU1hdHJpeFdvcmxkKCBmb3JjZSApIHtcclxuXHJcblx0XHRzdXBlci51cGRhdGVNYXRyaXhXb3JsZCggZm9yY2UgKTtcclxuXHJcblx0XHRjb25zdCBsaXN0ZW5lciA9IHRoaXMuY29udGV4dC5saXN0ZW5lcjtcclxuXHRcdGNvbnN0IHVwID0gdGhpcy51cDtcclxuXHJcblx0XHR0aGlzLnRpbWVEZWx0YSA9IHRoaXMuX2Nsb2NrLmdldERlbHRhKCk7XHJcblxyXG5cdFx0dGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoIF9wb3NpdGlvbiwgX3F1YXRlcm5pb24sIF9zY2FsZSApO1xyXG5cclxuXHRcdF9vcmllbnRhdGlvbi5zZXQoIDAsIDAsIC0gMSApLmFwcGx5UXVhdGVybmlvbiggX3F1YXRlcm5pb24gKTtcclxuXHJcblx0XHRpZiAoIGxpc3RlbmVyLnBvc2l0aW9uWCApIHtcclxuXHJcblx0XHRcdC8vIGNvZGUgcGF0aCBmb3IgQ2hyb21lIChzZWUgIzE0MzkzKVxyXG5cclxuXHRcdFx0Y29uc3QgZW5kVGltZSA9IHRoaXMuY29udGV4dC5jdXJyZW50VGltZSArIHRoaXMudGltZURlbHRhO1xyXG5cclxuXHRcdFx0bGlzdGVuZXIucG9zaXRpb25YLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKCBfcG9zaXRpb24ueCwgZW5kVGltZSApO1xyXG5cdFx0XHRsaXN0ZW5lci5wb3NpdGlvblkubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoIF9wb3NpdGlvbi55LCBlbmRUaW1lICk7XHJcblx0XHRcdGxpc3RlbmVyLnBvc2l0aW9uWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSggX3Bvc2l0aW9uLnosIGVuZFRpbWUgKTtcclxuXHRcdFx0bGlzdGVuZXIuZm9yd2FyZFgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoIF9vcmllbnRhdGlvbi54LCBlbmRUaW1lICk7XHJcblx0XHRcdGxpc3RlbmVyLmZvcndhcmRZLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKCBfb3JpZW50YXRpb24ueSwgZW5kVGltZSApO1xyXG5cdFx0XHRsaXN0ZW5lci5mb3J3YXJkWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSggX29yaWVudGF0aW9uLnosIGVuZFRpbWUgKTtcclxuXHRcdFx0bGlzdGVuZXIudXBYLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKCB1cC54LCBlbmRUaW1lICk7XHJcblx0XHRcdGxpc3RlbmVyLnVwWS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSggdXAueSwgZW5kVGltZSApO1xyXG5cdFx0XHRsaXN0ZW5lci51cFoubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoIHVwLnosIGVuZFRpbWUgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0bGlzdGVuZXIuc2V0UG9zaXRpb24oIF9wb3NpdGlvbi54LCBfcG9zaXRpb24ueSwgX3Bvc2l0aW9uLnogKTtcclxuXHRcdFx0bGlzdGVuZXIuc2V0T3JpZW50YXRpb24oIF9vcmllbnRhdGlvbi54LCBfb3JpZW50YXRpb24ueSwgX29yaWVudGF0aW9uLnosIHVwLngsIHVwLnksIHVwLnogKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IEF1ZGlvTGlzdGVuZXIgfTtcclxuIiwiaW1wb3J0IHsgT2JqZWN0M0QgfSBmcm9tICcuLi9jb3JlL09iamVjdDNELmpzJztcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIGEgbm9uLXBvc2l0aW9uYWwgKCBnbG9iYWwgKSBhdWRpbyBvYmplY3QuXHJcbiAqXHJcbiAqIFRoaXMgYW5kIHJlbGF0ZWQgYXVkaW8gbW9kdWxlcyBtYWtlIHVzZSBvZiB0aGUgW1dlYiBBdWRpbyBBUElde0BsaW5rIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJhdWRpby0xLjEvfS5cclxuICpcclxuICogYGBganNcclxuICogLy8gY3JlYXRlIGFuIEF1ZGlvTGlzdGVuZXIgYW5kIGFkZCBpdCB0byB0aGUgY2FtZXJhXHJcbiAqIGNvbnN0IGxpc3RlbmVyID0gbmV3IFRIUkVFLkF1ZGlvTGlzdGVuZXIoKTtcclxuICogY2FtZXJhLmFkZCggbGlzdGVuZXIgKTtcclxuICpcclxuICogLy8gY3JlYXRlIGEgZ2xvYmFsIGF1ZGlvIHNvdXJjZVxyXG4gKiBjb25zdCBzb3VuZCA9IG5ldyBUSFJFRS5BdWRpbyggbGlzdGVuZXIgKTtcclxuICpcclxuICogLy8gbG9hZCBhIHNvdW5kIGFuZCBzZXQgaXQgYXMgdGhlIEF1ZGlvIG9iamVjdCdzIGJ1ZmZlclxyXG4gKiBjb25zdCBhdWRpb0xvYWRlciA9IG5ldyBUSFJFRS5BdWRpb0xvYWRlcigpO1xyXG4gKiBhdWRpb0xvYWRlci5sb2FkKCAnc291bmRzL2FtYmllbnQub2dnJywgZnVuY3Rpb24oIGJ1ZmZlciApIHtcclxuICogXHRzb3VuZC5zZXRCdWZmZXIoIGJ1ZmZlciApO1xyXG4gKiBcdHNvdW5kLnNldExvb3AoIHRydWUgKTtcclxuICogXHRzb3VuZC5zZXRWb2x1bWUoIDAuNSApO1xyXG4gKiBcdHNvdW5kLnBsYXkoKTtcclxuICogfSk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgT2JqZWN0M0RcclxuICovXHJcbmNsYXNzIEF1ZGlvIGV4dGVuZHMgT2JqZWN0M0Qge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGF1ZGlvLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBdWRpb0xpc3RlbmVyfSBsaXN0ZW5lciAtIFRoZSBnbG9iYWwgYXVkaW8gbGlzdGVuZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGxpc3RlbmVyICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ0F1ZGlvJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBnbG9iYWwgYXVkaW8gbGlzdGVuZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0F1ZGlvTGlzdGVuZXJ9XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGF1ZGlvIGNvbnRleHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0F1ZGlvQ29udGV4dH1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvbnRleHQgPSBsaXN0ZW5lci5jb250ZXh0O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGdhaW4gbm9kZSB1c2VkIGZvciB2b2x1bWUgY29udHJvbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7R2Fpbk5vZGV9XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nYWluID0gdGhpcy5jb250ZXh0LmNyZWF0ZUdhaW4oKTtcclxuXHRcdHRoaXMuZ2Fpbi5jb25uZWN0KCBsaXN0ZW5lci5nZXRJbnB1dCgpICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRvIHN0YXJ0IHBsYXliYWNrIGF1dG9tYXRpY2FsbHkgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hdXRvcGxheSA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gYW4gYXVkaW8gYnVmZmVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIERlZmluZWQgdmlhIHtAbGluayBBdWRpbyNzZXRCdWZmZXJ9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/QXVkaW9CdWZmZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5idWZmZXIgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogTW9kaWZ5IHBpdGNoLCBtZWFzdXJlZCBpbiBjZW50cy4gKy8tIDEwMCBpcyBhIHNlbWl0b25lLlxyXG5cdFx0ICogKy8tIDEyMDAgaXMgYW4gb2N0YXZlLlxyXG5cdFx0ICpcclxuXHRcdCAqIERlZmluZWQgdmlhIHtAbGluayBBdWRpbyNzZXREZXR1bmV9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kZXR1bmUgPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgYXVkaW8gc2hvdWxkIGxvb3Agb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIERlZmluZWQgdmlhIHtAbGluayBBdWRpbyNzZXRMb29wfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5sb29wID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIHdoZXJlIGluIHRoZSBhdWRpbyBidWZmZXIgdGhlIHJlcGxheSBzaG91bGRcclxuXHRcdCAqIHN0YXJ0LCBpbiBzZWNvbmRzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubG9vcFN0YXJ0ID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgd2hlcmUgaW4gdGhlIGF1ZGlvIGJ1ZmZlciB0aGUgcmVwbGF5IHNob3VsZFxyXG5cdFx0ICogc3RvcCwgaW4gc2Vjb25kcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxvb3BFbmQgPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQW4gb2Zmc2V0IHRvIHRoZSB0aW1lIHdpdGhpbiB0aGUgYXVkaW8gYnVmZmVyIHRoZSBwbGF5YmFja1xyXG5cdFx0ICogc2hvdWxkIGJlZ2luLCBpbiBzZWNvbmRzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMub2Zmc2V0ID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIE92ZXJyaWRlcyB0aGUgZGVmYXVsdCBkdXJhdGlvbiBvZiB0aGUgYXVkaW8uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3VuZGVmaW5lZHxudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCB1bmRlZmluZWRcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kdXJhdGlvbiA9IHVuZGVmaW5lZDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBwbGF5YmFjayBzcGVlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBEZWZpbmVkIHZpYSB7QGxpbmsgQXVkaW8jc2V0UGxheWJhY2tSYXRlfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucGxheWJhY2tSYXRlID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBhdWRpbyBpcyBwbGF5aW5nIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBUaGlzIGZsYWcgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHNldCB3aGVuIHVzaW5nIHtAbGluayBBdWRpbyNwbGF5fSxcclxuXHRcdCAqIHtAbGluayBBdWRpbyNwYXVzZX0sIHtAbGluayBBdWRpbyNzdG9wfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBhdWRpbyBwbGF5YmFjayBjYW4gYmUgY29udHJvbGxlZFxyXG5cdFx0ICogd2l0aCBtZXRob2QgbGlrZSB7QGxpbmsgQXVkaW8jcGxheX0gb3Ige0BsaW5rIEF1ZGlvI3BhdXNlfS5cclxuXHRcdCAqXHJcblx0XHQgKiBUaGlzIGZsYWcgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHNldCB3aGVuIGF1ZGlvIHNvdXJjZXMgYXJlXHJcblx0XHQgKiBkZWZpbmVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaGFzUGxheWJhY2tDb250cm9sID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvbGRzIGEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGF1ZGlvIHNvdXJjZS5cclxuXHRcdCAqXHJcblx0XHQgKiBUaGUgcHJvcGVydHkgaXMgYXV0b21hdGljYWxseSBieSBvbmUgb2YgdGhlIGBzZXQqKClgIG1ldGhvZHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9BdWRpb05vZGV9XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zb3VyY2UgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyB0aGUgc291cmNlIHR5cGUuXHJcblx0XHQgKlxyXG5cdFx0ICogVGhlIHByb3BlcnR5IGlzIGF1dG9tYXRpY2FsbHkgYnkgb25lIG9mIHRoZSBgc2V0KigpYCBtZXRob2RzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoJ2VtcHR5J3wnYXVkaW9Ob2RlJ3wnbWVkaWFOb2RlJ3wnbWVkaWFTdHJlYW1Ob2RlJ3wnYnVmZmVyJyl9XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0ICdlbXB0eSdcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zb3VyY2VUeXBlID0gJ2VtcHR5JztcclxuXHJcblx0XHR0aGlzLl9zdGFydGVkQXQgPSAwO1xyXG5cdFx0dGhpcy5fcHJvZ3Jlc3MgPSAwO1xyXG5cdFx0dGhpcy5fY29ubmVjdGVkID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDYW4gYmUgdXNlZCB0byBhcHBseSBhIHZhcmlldHkgb2YgbG93LW9yZGVyIGZpbHRlcnMgdG8gY3JlYXRlXHJcblx0XHQgKiBtb3JlIGNvbXBsZXggc291bmQgZWZmZWN0cyBlLmcuIHZpYSBgQmlxdWFkRmlsdGVyTm9kZWAuXHJcblx0XHQgKlxyXG5cdFx0ICogVGhlIHByb3BlcnR5IGlzIGF1dG9tYXRpY2FsbHkgc2V0IGJ5IHtAbGluayBBdWRpbyNzZXRGaWx0ZXJzfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8QXVkaW9Ob2RlPn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZpbHRlcnMgPSBbXTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBvdXRwdXQgYXVkaW8gbm9kZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0dhaW5Ob2RlfSBUaGUgb3V0cHV0IG5vZGUuXHJcblx0ICovXHJcblx0Z2V0T3V0cHV0KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmdhaW47XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZ2l2ZW4gYXVkaW8gbm9kZSBhcyB0aGUgc291cmNlIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiB7QGxpbmsgQXVkaW8jc291cmNlVHlwZX0gaXMgc2V0IHRvIGBhdWRpb05vZGVgIGFuZCB7QGxpbmsgQXVkaW8jaGFzUGxheWJhY2tDb250cm9sfSB0byBgZmFsc2VgLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBdWRpb05vZGV9IGF1ZGlvTm9kZSAtIFRoZSBhdWRpbyBub2RlIGxpa2UgYW4gaW5zdGFuY2Ugb2YgYE9zY2lsbGF0b3JOb2RlYC5cclxuXHQgKiBAcmV0dXJuIHtBdWRpb30gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXROb2RlU291cmNlKCBhdWRpb05vZGUgKSB7XHJcblxyXG5cdFx0dGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPSBmYWxzZTtcclxuXHRcdHRoaXMuc291cmNlVHlwZSA9ICdhdWRpb05vZGUnO1xyXG5cdFx0dGhpcy5zb3VyY2UgPSBhdWRpb05vZGU7XHJcblx0XHR0aGlzLmNvbm5lY3QoKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBnaXZlbiBtZWRpYSBlbGVtZW50IGFzIHRoZSBzb3VyY2Ugb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIHtAbGluayBBdWRpbyNzb3VyY2VUeXBlfSBpcyBzZXQgdG8gYG1lZGlhTm9kZWAgYW5kIHtAbGluayBBdWRpbyNoYXNQbGF5YmFja0NvbnRyb2x9IHRvIGBmYWxzZWAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0hUTUxNZWRpYUVsZW1lbnR9IG1lZGlhRWxlbWVudCAtIFRoZSBtZWRpYSBlbGVtZW50LlxyXG5cdCAqIEByZXR1cm4ge0F1ZGlvfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldE1lZGlhRWxlbWVudFNvdXJjZSggbWVkaWFFbGVtZW50ICkge1xyXG5cclxuXHRcdHRoaXMuaGFzUGxheWJhY2tDb250cm9sID0gZmFsc2U7XHJcblx0XHR0aGlzLnNvdXJjZVR5cGUgPSAnbWVkaWFOb2RlJztcclxuXHRcdHRoaXMuc291cmNlID0gdGhpcy5jb250ZXh0LmNyZWF0ZU1lZGlhRWxlbWVudFNvdXJjZSggbWVkaWFFbGVtZW50ICk7XHJcblx0XHR0aGlzLmNvbm5lY3QoKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBnaXZlbiBtZWRpYSBzdHJlYW0gYXMgdGhlIHNvdXJjZSBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICoge0BsaW5rIEF1ZGlvI3NvdXJjZVR5cGV9IGlzIHNldCB0byBgbWVkaWFTdHJlYW1Ob2RlYCBhbmQge0BsaW5rIEF1ZGlvI2hhc1BsYXliYWNrQ29udHJvbH0gdG8gYGZhbHNlYC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWVkaWFTdHJlYW19IG1lZGlhU3RyZWFtIC0gVGhlIG1lZGlhIHN0cmVhbS5cclxuXHQgKiBAcmV0dXJuIHtBdWRpb30gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXRNZWRpYVN0cmVhbVNvdXJjZSggbWVkaWFTdHJlYW0gKSB7XHJcblxyXG5cdFx0dGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPSBmYWxzZTtcclxuXHRcdHRoaXMuc291cmNlVHlwZSA9ICdtZWRpYVN0cmVhbU5vZGUnO1xyXG5cdFx0dGhpcy5zb3VyY2UgPSB0aGlzLmNvbnRleHQuY3JlYXRlTWVkaWFTdHJlYW1Tb3VyY2UoIG1lZGlhU3RyZWFtICk7XHJcblx0XHR0aGlzLmNvbm5lY3QoKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBnaXZlbiBhdWRpbyBidWZmZXIgYXMgdGhlIHNvdXJjZSBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICoge0BsaW5rIEF1ZGlvI3NvdXJjZVR5cGV9IGlzIHNldCB0byBgYnVmZmVyYCBhbmQge0BsaW5rIEF1ZGlvI2hhc1BsYXliYWNrQ29udHJvbH0gdG8gYHRydWVgLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBdWRpb0J1ZmZlcn0gYXVkaW9CdWZmZXIgLSBUaGUgYXVkaW8gYnVmZmVyLlxyXG5cdCAqIEByZXR1cm4ge0F1ZGlvfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldEJ1ZmZlciggYXVkaW9CdWZmZXIgKSB7XHJcblxyXG5cdFx0dGhpcy5idWZmZXIgPSBhdWRpb0J1ZmZlcjtcclxuXHRcdHRoaXMuc291cmNlVHlwZSA9ICdidWZmZXInO1xyXG5cclxuXHRcdGlmICggdGhpcy5hdXRvcGxheSApIHRoaXMucGxheSgpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFN0YXJ0cyB0aGUgcGxheWJhY2sgb2YgdGhlIGF1ZGlvLlxyXG5cdCAqXHJcblx0ICogQ2FuIG9ubHkgYmUgdXNlZCB3aXRoIGNvbXBhdGlibGUgYXVkaW8gc291cmNlcyB0aGF0IGFsbG93IHBsYXliYWNrIGNvbnRyb2wuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2RlbGF5PTBdIC0gVGhlIGRlbGF5LCBpbiBzZWNvbmRzLCBhdCB3aGljaCB0aGUgYXVkaW8gc2hvdWxkIHN0YXJ0IHBsYXlpbmcuXHJcblx0ICogQHJldHVybiB7QXVkaW98dW5kZWZpbmVkfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHBsYXkoIGRlbGF5ID0gMCApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuaXNQbGF5aW5nID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IEF1ZGlvIGlzIGFscmVhZHkgcGxheWluZy4nICk7XHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4nICk7XHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5fc3RhcnRlZEF0ID0gdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lICsgZGVsYXk7XHJcblxyXG5cdFx0Y29uc3Qgc291cmNlID0gdGhpcy5jb250ZXh0LmNyZWF0ZUJ1ZmZlclNvdXJjZSgpO1xyXG5cdFx0c291cmNlLmJ1ZmZlciA9IHRoaXMuYnVmZmVyO1xyXG5cdFx0c291cmNlLmxvb3AgPSB0aGlzLmxvb3A7XHJcblx0XHRzb3VyY2UubG9vcFN0YXJ0ID0gdGhpcy5sb29wU3RhcnQ7XHJcblx0XHRzb3VyY2UubG9vcEVuZCA9IHRoaXMubG9vcEVuZDtcclxuXHRcdHNvdXJjZS5vbmVuZGVkID0gdGhpcy5vbkVuZGVkLmJpbmQoIHRoaXMgKTtcclxuXHRcdHNvdXJjZS5zdGFydCggdGhpcy5fc3RhcnRlZEF0LCB0aGlzLl9wcm9ncmVzcyArIHRoaXMub2Zmc2V0LCB0aGlzLmR1cmF0aW9uICk7XHJcblxyXG5cdFx0dGhpcy5pc1BsYXlpbmcgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMuc291cmNlID0gc291cmNlO1xyXG5cclxuXHRcdHRoaXMuc2V0RGV0dW5lKCB0aGlzLmRldHVuZSApO1xyXG5cdFx0dGhpcy5zZXRQbGF5YmFja1JhdGUoIHRoaXMucGxheWJhY2tSYXRlICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuY29ubmVjdCgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBhdXNlcyB0aGUgcGxheWJhY2sgb2YgdGhlIGF1ZGlvLlxyXG5cdCAqXHJcblx0ICogQ2FuIG9ubHkgYmUgdXNlZCB3aXRoIGNvbXBhdGlibGUgYXVkaW8gc291cmNlcyB0aGF0IGFsbG93IHBsYXliYWNrIGNvbnRyb2wuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtBdWRpb3x1bmRlZmluZWR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0cGF1c2UoKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4nICk7XHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aGlzLmlzUGxheWluZyA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdC8vIHVwZGF0ZSBjdXJyZW50IHByb2dyZXNzXHJcblxyXG5cdFx0XHR0aGlzLl9wcm9ncmVzcyArPSBNYXRoLm1heCggdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lIC0gdGhpcy5fc3RhcnRlZEF0LCAwICkgKiB0aGlzLnBsYXliYWNrUmF0ZTtcclxuXHJcblx0XHRcdGlmICggdGhpcy5sb29wID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHQvLyBlbnN1cmUgX3Byb2dyZXNzIGRvZXMgbm90IGV4Y2VlZCBkdXJhdGlvbiB3aXRoIGxvb3BlZCBhdWRpb3NcclxuXHJcblx0XHRcdFx0dGhpcy5fcHJvZ3Jlc3MgPSB0aGlzLl9wcm9ncmVzcyAlICggdGhpcy5kdXJhdGlvbiB8fCB0aGlzLmJ1ZmZlci5kdXJhdGlvbiApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5zb3VyY2Uuc3RvcCgpO1xyXG5cdFx0XHR0aGlzLnNvdXJjZS5vbmVuZGVkID0gbnVsbDtcclxuXHJcblx0XHRcdHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFN0b3BzIHRoZSBwbGF5YmFjayBvZiB0aGUgYXVkaW8uXHJcblx0ICpcclxuXHQgKiBDYW4gb25seSBiZSB1c2VkIHdpdGggY29tcGF0aWJsZSBhdWRpbyBzb3VyY2VzIHRoYXQgYWxsb3cgcGxheWJhY2sgY29udHJvbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZGVsYXk9MF0gLSBUaGUgZGVsYXksIGluIHNlY29uZHMsIGF0IHdoaWNoIHRoZSBhdWRpbyBzaG91bGQgc3RvcCBwbGF5aW5nLlxyXG5cdCAqIEByZXR1cm4ge0F1ZGlvfHVuZGVmaW5lZH0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzdG9wKCBkZWxheSA9IDAgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4nICk7XHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5fcHJvZ3Jlc3MgPSAwO1xyXG5cclxuXHRcdGlmICggdGhpcy5zb3VyY2UgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnNvdXJjZS5zdG9wKCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKyBkZWxheSApO1xyXG5cdFx0XHR0aGlzLnNvdXJjZS5vbmVuZGVkID0gbnVsbDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25uZWN0cyB0byB0aGUgYXVkaW8gc291cmNlLiBUaGlzIGlzIHVzZWQgaW50ZXJuYWxseSBvblxyXG5cdCAqIGluaXRpYWxpc2F0aW9uIGFuZCB3aGVuIHNldHRpbmcgLyByZW1vdmluZyBmaWx0ZXJzLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7QXVkaW99IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y29ubmVjdCgpIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuZmlsdGVycy5sZW5ndGggPiAwICkge1xyXG5cclxuXHRcdFx0dGhpcy5zb3VyY2UuY29ubmVjdCggdGhpcy5maWx0ZXJzWyAwIF0gKTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMSwgbCA9IHRoaXMuZmlsdGVycy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLmZpbHRlcnNbIGkgLSAxIF0uY29ubmVjdCggdGhpcy5maWx0ZXJzWyBpIF0gKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuZmlsdGVyc1sgdGhpcy5maWx0ZXJzLmxlbmd0aCAtIDEgXS5jb25uZWN0KCB0aGlzLmdldE91dHB1dCgpICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHRoaXMuc291cmNlLmNvbm5lY3QoIHRoaXMuZ2V0T3V0cHV0KCkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5fY29ubmVjdGVkID0gdHJ1ZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEaXNjb25uZWN0cyB0byB0aGUgYXVkaW8gc291cmNlLiBUaGlzIGlzIHVzZWQgaW50ZXJuYWxseSBvblxyXG5cdCAqIGluaXRpYWxpc2F0aW9uIGFuZCB3aGVuIHNldHRpbmcgLyByZW1vdmluZyBmaWx0ZXJzLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7QXVkaW98dW5kZWZpbmVkfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGRpc2Nvbm5lY3QoKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9jb25uZWN0ZWQgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMuZmlsdGVycy5sZW5ndGggPiAwICkge1xyXG5cclxuXHRcdFx0dGhpcy5zb3VyY2UuZGlzY29ubmVjdCggdGhpcy5maWx0ZXJzWyAwIF0gKTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMSwgbCA9IHRoaXMuZmlsdGVycy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLmZpbHRlcnNbIGkgLSAxIF0uZGlzY29ubmVjdCggdGhpcy5maWx0ZXJzWyBpIF0gKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuZmlsdGVyc1sgdGhpcy5maWx0ZXJzLmxlbmd0aCAtIDEgXS5kaXNjb25uZWN0KCB0aGlzLmdldE91dHB1dCgpICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHRoaXMuc291cmNlLmRpc2Nvbm5lY3QoIHRoaXMuZ2V0T3V0cHV0KCkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5fY29ubmVjdGVkID0gZmFsc2U7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgY3VycmVudCBzZXQgZmlsdGVycy5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0FycmF5PEF1ZGlvTm9kZT59IFRoZSBsaXN0IG9mIGZpbHRlcnMuXHJcblx0ICovXHJcblx0Z2V0RmlsdGVycygpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5maWx0ZXJzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgYW4gYXJyYXkgb2YgZmlsdGVycyBhbmQgY29ubmVjdHMgdGhlbSB3aXRoIHRoZSBhdWRpbyBzb3VyY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PEF1ZGlvTm9kZT59IFt2YWx1ZV0gLSBBIGxpc3Qgb2YgZmlsdGVycy5cclxuXHQgKiBAcmV0dXJuIHtBdWRpb30gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXRGaWx0ZXJzKCB2YWx1ZSApIHtcclxuXHJcblx0XHRpZiAoICEgdmFsdWUgKSB2YWx1ZSA9IFtdO1xyXG5cclxuXHRcdGlmICggdGhpcy5fY29ubmVjdGVkID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0dGhpcy5kaXNjb25uZWN0KCk7XHJcblx0XHRcdHRoaXMuZmlsdGVycyA9IHZhbHVlLnNsaWNlKCk7XHJcblx0XHRcdHRoaXMuY29ubmVjdCgpO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR0aGlzLmZpbHRlcnMgPSB2YWx1ZS5zbGljZSgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWZpbmVzIHRoZSBkZXR1bmluZyBvZiBvc2NpbGxhdGlvbiBpbiBjZW50cy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBkZXR1bmluZyBvZiBvc2NpbGxhdGlvbiBpbiBjZW50cy5cclxuXHQgKiBAcmV0dXJuIHtBdWRpb30gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXREZXR1bmUoIHZhbHVlICkge1xyXG5cclxuXHRcdHRoaXMuZGV0dW5lID0gdmFsdWU7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmlzUGxheWluZyA9PT0gdHJ1ZSAmJiB0aGlzLnNvdXJjZS5kZXR1bmUgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHRoaXMuc291cmNlLmRldHVuZS5zZXRUYXJnZXRBdFRpbWUoIHRoaXMuZGV0dW5lLCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUsIDAuMDEgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgZGV0dW5pbmcgb2Ygb3NjaWxsYXRpb24gaW4gY2VudHMuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBkZXR1bmluZyBvZiBvc2NpbGxhdGlvbiBpbiBjZW50cy5cclxuXHQgKi9cclxuXHRnZXREZXR1bmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZGV0dW5lO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGZpcnN0IGZpbHRlciBpbiB0aGUgbGlzdCBvZiBmaWx0ZXJzLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7QXVkaW9Ob2RlfHVuZGVmaW5lZH0gVGhlIGZpcnN0IGZpbHRlciBpbiB0aGUgbGlzdCBvZiBmaWx0ZXJzLlxyXG5cdCAqL1xyXG5cdGdldEZpbHRlcigpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5nZXRGaWx0ZXJzKClbIDAgXTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBcHBsaWVzIGEgc2luZ2xlIGZpbHRlciBub2RlIHRvIHRoZSBhdWRpby5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXVkaW9Ob2RlfSBbZmlsdGVyXSAtIFRoZSBmaWx0ZXIgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge0F1ZGlvfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldEZpbHRlciggZmlsdGVyICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnNldEZpbHRlcnMoIGZpbHRlciA/IFsgZmlsdGVyIF0gOiBbXSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHBsYXliYWNrIHJhdGUuXHJcblx0ICpcclxuXHQgKiBDYW4gb25seSBiZSB1c2VkIHdpdGggY29tcGF0aWJsZSBhdWRpbyBzb3VyY2VzIHRoYXQgYWxsb3cgcGxheWJhY2sgY29udHJvbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbdmFsdWVdIC0gVGhlIHBsYXliYWNrIHJhdGUgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge0F1ZGlvfHVuZGVmaW5lZH0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXRQbGF5YmFja1JhdGUoIHZhbHVlICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuJyApO1xyXG5cdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMucGxheWJhY2tSYXRlID0gdmFsdWU7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmlzUGxheWluZyA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdHRoaXMuc291cmNlLnBsYXliYWNrUmF0ZS5zZXRUYXJnZXRBdFRpbWUoIHRoaXMucGxheWJhY2tSYXRlLCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUsIDAuMDEgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgY3VycmVudCBwbGF5YmFjayByYXRlLlxyXG5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBwbGF5YmFjayByYXRlLlxyXG5cdCAqL1xyXG5cdGdldFBsYXliYWNrUmF0ZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5wbGF5YmFja1JhdGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQXV0b21hdGljYWxseSBjYWxsZWQgd2hlbiBwbGF5YmFjayBmaW5pc2hlZC5cclxuXHQgKi9cclxuXHRvbkVuZGVkKCkge1xyXG5cclxuXHRcdHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XHJcblx0XHR0aGlzLl9wcm9ncmVzcyA9IDA7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgbG9vcCBmbGFnLlxyXG5cdCAqXHJcblx0ICogQ2FuIG9ubHkgYmUgdXNlZCB3aXRoIGNvbXBhdGlibGUgYXVkaW8gc291cmNlcyB0aGF0IGFsbG93IHBsYXliYWNrIGNvbnRyb2wuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBhdWRpbyBzaG91bGQgbG9vcCBvciBub3QuXHJcblx0ICovXHJcblx0Z2V0TG9vcCgpIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuaGFzUGxheWJhY2tDb250cm9sID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLicgKTtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcy5sb29wO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGxvb3AgZmxhZy5cclxuXHQgKlxyXG5cdCAqIENhbiBvbmx5IGJlIHVzZWQgd2l0aCBjb21wYXRpYmxlIGF1ZGlvIHNvdXJjZXMgdGhhdCBhbGxvdyBwbGF5YmFjayBjb250cm9sLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtib29sZWFufSB2YWx1ZSAtIFdoZXRoZXIgdGhlIGF1ZGlvIHNob3VsZCBsb29wIG9yIG5vdC5cclxuXHQgKiBAcmV0dXJuIHtBdWRpb3x1bmRlZmluZWR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0TG9vcCggdmFsdWUgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4nICk7XHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5sb29wID0gdmFsdWU7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmlzUGxheWluZyA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdHRoaXMuc291cmNlLmxvb3AgPSB0aGlzLmxvb3A7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGxvb3Agc3RhcnQgdmFsdWUgd2hpY2ggZGVmaW5lcyB3aGVyZSBpbiB0aGUgYXVkaW8gYnVmZmVyIHRoZSByZXBsYXkgc2hvdWxkXHJcblx0ICogc3RhcnQsIGluIHNlY29uZHMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgbG9vcCBzdGFydCB2YWx1ZS5cclxuXHQgKiBAcmV0dXJuIHtBdWRpb30gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXRMb29wU3RhcnQoIHZhbHVlICkge1xyXG5cclxuXHRcdHRoaXMubG9vcFN0YXJ0ID0gdmFsdWU7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgbG9vcCBlbmQgdmFsdWUgd2hpY2ggZGVmaW5lcyB3aGVyZSBpbiB0aGUgYXVkaW8gYnVmZmVyIHRoZSByZXBsYXkgc2hvdWxkXHJcblx0ICogc3RvcCwgaW4gc2Vjb25kcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBsb29wIGVuZCB2YWx1ZS5cclxuXHQgKiBAcmV0dXJuIHtBdWRpb30gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXRMb29wRW5kKCB2YWx1ZSApIHtcclxuXHJcblx0XHR0aGlzLmxvb3BFbmQgPSB2YWx1ZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSB2b2x1bWUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB2b2x1bWUuXHJcblx0ICovXHJcblx0Z2V0Vm9sdW1lKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmdhaW4uZ2Fpbi52YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB2b2x1bWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgdm9sdW1lIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtBdWRpb30gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXRWb2x1bWUoIHZhbHVlICkge1xyXG5cclxuXHRcdHRoaXMuZ2Fpbi5nYWluLnNldFRhcmdldEF0VGltZSggdmFsdWUsIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwgMC4wMSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSwgcmVjdXJzaXZlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSwgcmVjdXJzaXZlICk7XHJcblxyXG5cdFx0aWYgKCBzb3VyY2Uuc291cmNlVHlwZSAhPT0gJ2J1ZmZlcicgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogQXVkaW8gc291cmNlIHR5cGUgY2Fubm90IGJlIGNvcGllZC4nICk7XHJcblxyXG5cdFx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5hdXRvcGxheSA9IHNvdXJjZS5hdXRvcGxheTtcclxuXHJcblx0XHR0aGlzLmJ1ZmZlciA9IHNvdXJjZS5idWZmZXI7XHJcblx0XHR0aGlzLmRldHVuZSA9IHNvdXJjZS5kZXR1bmU7XHJcblx0XHR0aGlzLmxvb3AgPSBzb3VyY2UubG9vcDtcclxuXHRcdHRoaXMubG9vcFN0YXJ0ID0gc291cmNlLmxvb3BTdGFydDtcclxuXHRcdHRoaXMubG9vcEVuZCA9IHNvdXJjZS5sb29wRW5kO1xyXG5cdFx0dGhpcy5vZmZzZXQgPSBzb3VyY2Uub2Zmc2V0O1xyXG5cdFx0dGhpcy5kdXJhdGlvbiA9IHNvdXJjZS5kdXJhdGlvbjtcclxuXHRcdHRoaXMucGxheWJhY2tSYXRlID0gc291cmNlLnBsYXliYWNrUmF0ZTtcclxuXHRcdHRoaXMuaGFzUGxheWJhY2tDb250cm9sID0gc291cmNlLmhhc1BsYXliYWNrQ29udHJvbDtcclxuXHRcdHRoaXMuc291cmNlVHlwZSA9IHNvdXJjZS5zb3VyY2VUeXBlO1xyXG5cclxuXHRcdHRoaXMuZmlsdGVycyA9IHNvdXJjZS5maWx0ZXJzLnNsaWNlKCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0Y2xvbmUoIHJlY3Vyc2l2ZSApIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMubGlzdGVuZXIgKS5jb3B5KCB0aGlzLCByZWN1cnNpdmUgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgQXVkaW8gfTtcclxuIiwiaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcbmltcG9ydCB7IFF1YXRlcm5pb24gfSBmcm9tICcuLi9tYXRoL1F1YXRlcm5pb24uanMnO1xyXG5pbXBvcnQgeyBBdWRpbyB9IGZyb20gJy4vQXVkaW8uanMnO1xyXG5cclxuY29uc3QgX3Bvc2l0aW9uID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfcXVhdGVybmlvbiA9IC8qQF9fUFVSRV9fKi8gbmV3IFF1YXRlcm5pb24oKTtcclxuY29uc3QgX3NjYWxlID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfb3JpZW50YXRpb24gPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyBhIHBvc2l0aW9uYWwgYXVkaW8gb2JqZWN0LlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiAvLyBjcmVhdGUgYW4gQXVkaW9MaXN0ZW5lciBhbmQgYWRkIGl0IHRvIHRoZSBjYW1lcmFcclxuICogY29uc3QgbGlzdGVuZXIgPSBuZXcgVEhSRUUuQXVkaW9MaXN0ZW5lcigpO1xyXG4gKiBjYW1lcmEuYWRkKCBsaXN0ZW5lciApO1xyXG4gKlxyXG4gKiAvLyBjcmVhdGUgdGhlIFBvc2l0aW9uYWxBdWRpbyBvYmplY3QgKHBhc3NpbmcgaW4gdGhlIGxpc3RlbmVyKVxyXG4gKiBjb25zdCBzb3VuZCA9IG5ldyBUSFJFRS5Qb3NpdGlvbmFsQXVkaW8oIGxpc3RlbmVyICk7XHJcbiAqXHJcbiAqIC8vIGxvYWQgYSBzb3VuZCBhbmQgc2V0IGl0IGFzIHRoZSBQb3NpdGlvbmFsQXVkaW8gb2JqZWN0J3MgYnVmZmVyXHJcbiAqIGNvbnN0IGF1ZGlvTG9hZGVyID0gbmV3IFRIUkVFLkF1ZGlvTG9hZGVyKCk7XHJcbiAqIGF1ZGlvTG9hZGVyLmxvYWQoICdzb3VuZHMvc29uZy5vZ2cnLCBmdW5jdGlvbiggYnVmZmVyICkge1xyXG4gKiBcdHNvdW5kLnNldEJ1ZmZlciggYnVmZmVyICk7XHJcbiAqIFx0c291bmQuc2V0UmVmRGlzdGFuY2UoIDIwICk7XHJcbiAqIFx0c291bmQucGxheSgpO1xyXG4gKiB9KTtcclxuICpcclxuICogLy8gY3JlYXRlIGFuIG9iamVjdCBmb3IgdGhlIHNvdW5kIHRvIHBsYXkgZnJvbVxyXG4gKiBjb25zdCBzcGhlcmUgPSBuZXcgVEhSRUUuU3BoZXJlR2VvbWV0cnkoIDIwLCAzMiwgMTYgKTtcclxuICogY29uc3QgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaFBob25nTWF0ZXJpYWwoIHsgY29sb3I6IDB4ZmYyMjAwIH0gKTtcclxuICogY29uc3QgbWVzaCA9IG5ldyBUSFJFRS5NZXNoKCBzcGhlcmUsIG1hdGVyaWFsICk7XHJcbiAqIHNjZW5lLmFkZCggbWVzaCApO1xyXG4gKlxyXG4gKiAvLyBmaW5hbGx5IGFkZCB0aGUgc291bmQgdG8gdGhlIG1lc2hcclxuICogbWVzaC5hZGQoIHNvdW5kICk7XHJcbiAqXHJcbiAqIEBhdWdtZW50cyBBdWRpb1xyXG4gKi9cclxuY2xhc3MgUG9zaXRpb25hbEF1ZGlvIGV4dGVuZHMgQXVkaW8ge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgcG9zaXRpb25hbCBhdWRpby5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXVkaW9MaXN0ZW5lcn0gbGlzdGVuZXIgLSBUaGUgZ2xvYmFsIGF1ZGlvIGxpc3RlbmVyLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBsaXN0ZW5lciApIHtcclxuXHJcblx0XHRzdXBlciggbGlzdGVuZXIgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBwYW5uZXIgbm9kZSByZXByZXNlbnRzIHRoZSBsb2NhdGlvbiwgZGlyZWN0aW9uLCBhbmQgYmVoYXZpb3Igb2YgYW4gYXVkaW9cclxuXHRcdCAqIHNvdXJjZSBpbiAzRCBzcGFjZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7UGFubmVyTm9kZX1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBhbm5lciA9IHRoaXMuY29udGV4dC5jcmVhdGVQYW5uZXIoKTtcclxuXHRcdHRoaXMucGFubmVyLnBhbm5pbmdNb2RlbCA9ICdIUlRGJztcclxuXHRcdHRoaXMucGFubmVyLmNvbm5lY3QoIHRoaXMuZ2FpbiApO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvbm5lY3QoKSB7XHJcblxyXG5cdFx0c3VwZXIuY29ubmVjdCgpO1xyXG5cclxuXHRcdHRoaXMucGFubmVyLmNvbm5lY3QoIHRoaXMuZ2FpbiApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdGRpc2Nvbm5lY3QoKSB7XHJcblxyXG5cdFx0c3VwZXIuZGlzY29ubmVjdCgpO1xyXG5cclxuXHRcdHRoaXMucGFubmVyLmRpc2Nvbm5lY3QoIHRoaXMuZ2FpbiApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdGdldE91dHB1dCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5wYW5uZXI7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgY3VycmVudCByZWZlcmVuY2UgZGlzdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSByZWZlcmVuY2UgZGlzdGFuY2UuXHJcblx0ICovXHJcblx0Z2V0UmVmRGlzdGFuY2UoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMucGFubmVyLnJlZkRpc3RhbmNlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgdGhlIHJlZmVyZW5jZSBkaXN0YW5jZSBmb3IgcmVkdWNpbmcgdm9sdW1lIGFzIHRoZSBhdWRpbyBzb3VyY2UgbW92ZXNcclxuXHQgKiBmdXJ0aGVyIGZyb20gdGhlIGxpc3RlbmVyIOKAkyBpLmUuIHRoZSBkaXN0YW5jZSBhdCB3aGljaCB0aGUgdm9sdW1lIHJlZHVjdGlvblxyXG5cdCAqIHN0YXJ0cyB0YWtpbmcgZWZmZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIHJlZmVyZW5jZSBkaXN0YW5jZSB0byBzZXQuXHJcblx0ICogQHJldHVybiB7UG9zaXRpb25hbEF1ZGlvfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldFJlZkRpc3RhbmNlKCB2YWx1ZSApIHtcclxuXHJcblx0XHR0aGlzLnBhbm5lci5yZWZEaXN0YW5jZSA9IHZhbHVlO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGN1cnJlbnQgcm9sbG9mZiBmYWN0b3IuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSByb2xsb2ZmIGZhY3Rvci5cclxuXHQgKi9cclxuXHRnZXRSb2xsb2ZmRmFjdG9yKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnBhbm5lci5yb2xsb2ZmRmFjdG9yO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgaG93IHF1aWNrbHkgdGhlIHZvbHVtZSBpcyByZWR1Y2VkIGFzIHRoZSBzb3VyY2UgbW92ZXMgYXdheSBmcm9tIHRoZSBsaXN0ZW5lci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSByb2xsb2ZmIGZhY3Rvci5cclxuXHQgKiBAcmV0dXJuIHtQb3NpdGlvbmFsQXVkaW99IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0Um9sbG9mZkZhY3RvciggdmFsdWUgKSB7XHJcblxyXG5cdFx0dGhpcy5wYW5uZXIucm9sbG9mZkZhY3RvciA9IHZhbHVlO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGN1cnJlbnQgZGlzdGFuY2UgbW9kZWwuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHsoJ2xpbmVhcid8J2ludmVyc2UnfCdleHBvbmVudGlhbCcpfSBUaGUgZGlzdGFuY2UgbW9kZWwuXHJcblx0ICovXHJcblx0Z2V0RGlzdGFuY2VNb2RlbCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5wYW5uZXIuZGlzdGFuY2VNb2RlbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWZpbmVzIHdoaWNoIGFsZ29yaXRobSB0byB1c2UgdG8gcmVkdWNlIHRoZSB2b2x1bWUgb2YgdGhlIGF1ZGlvIHNvdXJjZVxyXG5cdCAqIGFzIGl0IG1vdmVzIGF3YXkgZnJvbSB0aGUgbGlzdGVuZXIuXHJcblx0ICpcclxuXHQgKiBSZWFkIFt0aGUgc3BlY117QGxpbmsgaHR0cHM6Ly93d3cudzMub3JnL1RSL3dlYmF1ZGlvLTEuMS8jZW51bWRlZi1kaXN0YW5jZW1vZGVsdHlwZX1cclxuXHQgKiBmb3IgbW9yZSBkZXRhaWxzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHsoJ2xpbmVhcid8J2ludmVyc2UnfCdleHBvbmVudGlhbCcpfSB2YWx1ZSAtIFRoZSBkaXN0YW5jZSBtb2RlbCB0byBzZXQuXHJcblx0ICogQHJldHVybiB7UG9zaXRpb25hbEF1ZGlvfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldERpc3RhbmNlTW9kZWwoIHZhbHVlICkge1xyXG5cclxuXHRcdHRoaXMucGFubmVyLmRpc3RhbmNlTW9kZWwgPSB2YWx1ZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBjdXJyZW50IG1heCBkaXN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIG1heCBkaXN0YW5jZS5cclxuXHQgKi9cclxuXHRnZXRNYXhEaXN0YW5jZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5wYW5uZXIubWF4RGlzdGFuY2U7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVmaW5lcyB0aGUgbWF4aW11bSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBhdWRpbyBzb3VyY2UgYW5kIHRoZSBsaXN0ZW5lcixcclxuXHQgKiBhZnRlciB3aGljaCB0aGUgdm9sdW1lIGlzIG5vdCByZWR1Y2VkIGFueSBmdXJ0aGVyLlxyXG5cdCAqXHJcblx0ICogVGhpcyB2YWx1ZSBpcyB1c2VkIG9ubHkgYnkgdGhlIGBsaW5lYXJgIGRpc3RhbmNlIG1vZGVsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIG1heCBkaXN0YW5jZS5cclxuXHQgKiBAcmV0dXJuIHtQb3NpdGlvbmFsQXVkaW99IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0TWF4RGlzdGFuY2UoIHZhbHVlICkge1xyXG5cclxuXHRcdHRoaXMucGFubmVyLm1heERpc3RhbmNlID0gdmFsdWU7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZGlyZWN0aW9uYWwgY29uZSBpbiB3aGljaCB0aGUgYXVkaW8gY2FuIGJlIGxpc3RlbmVkLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGNvbmVJbm5lckFuZ2xlIC0gQW4gYW5nbGUsIGluIGRlZ3JlZXMsIG9mIGEgY29uZSBpbnNpZGUgb2Ygd2hpY2ggdGhlcmUgd2lsbCBiZSBubyB2b2x1bWUgcmVkdWN0aW9uLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBjb25lT3V0ZXJBbmdsZSAtIEFuIGFuZ2xlLCBpbiBkZWdyZWVzLCBvZiBhIGNvbmUgb3V0c2lkZSBvZiB3aGljaCB0aGUgdm9sdW1lIHdpbGwgYmUgcmVkdWNlZCBieSBhIGNvbnN0YW50IHZhbHVlLCBkZWZpbmVkIGJ5IHRoZSBgY29uZU91dGVyR2FpbmAgcGFyYW1ldGVyLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBjb25lT3V0ZXJHYWluIC0gVGhlIGFtb3VudCBvZiB2b2x1bWUgcmVkdWN0aW9uIG91dHNpZGUgdGhlIGNvbmUgZGVmaW5lZCBieSB0aGUgYGNvbmVPdXRlckFuZ2xlYC4gV2hlbiBzZXQgdG8gYDBgLCBubyBzb3VuZCBjYW4gYmUgaGVhcmQuXHJcblx0ICogQHJldHVybiB7UG9zaXRpb25hbEF1ZGlvfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldERpcmVjdGlvbmFsQ29uZSggY29uZUlubmVyQW5nbGUsIGNvbmVPdXRlckFuZ2xlLCBjb25lT3V0ZXJHYWluICkge1xyXG5cclxuXHRcdHRoaXMucGFubmVyLmNvbmVJbm5lckFuZ2xlID0gY29uZUlubmVyQW5nbGU7XHJcblx0XHR0aGlzLnBhbm5lci5jb25lT3V0ZXJBbmdsZSA9IGNvbmVPdXRlckFuZ2xlO1xyXG5cdFx0dGhpcy5wYW5uZXIuY29uZU91dGVyR2FpbiA9IGNvbmVPdXRlckdhaW47XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0dXBkYXRlTWF0cml4V29ybGQoIGZvcmNlICkge1xyXG5cclxuXHRcdHN1cGVyLnVwZGF0ZU1hdHJpeFdvcmxkKCBmb3JjZSApO1xyXG5cclxuXHRcdGlmICggdGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPT09IHRydWUgJiYgdGhpcy5pc1BsYXlpbmcgPT09IGZhbHNlICkgcmV0dXJuO1xyXG5cclxuXHRcdHRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKCBfcG9zaXRpb24sIF9xdWF0ZXJuaW9uLCBfc2NhbGUgKTtcclxuXHJcblx0XHRfb3JpZW50YXRpb24uc2V0KCAwLCAwLCAxICkuYXBwbHlRdWF0ZXJuaW9uKCBfcXVhdGVybmlvbiApO1xyXG5cclxuXHRcdGNvbnN0IHBhbm5lciA9IHRoaXMucGFubmVyO1xyXG5cclxuXHRcdGlmICggcGFubmVyLnBvc2l0aW9uWCApIHtcclxuXHJcblx0XHRcdC8vIGNvZGUgcGF0aCBmb3IgQ2hyb21lIGFuZCBGaXJlZm94IChzZWUgIzE0MzkzKVxyXG5cclxuXHRcdFx0Y29uc3QgZW5kVGltZSA9IHRoaXMuY29udGV4dC5jdXJyZW50VGltZSArIHRoaXMubGlzdGVuZXIudGltZURlbHRhO1xyXG5cclxuXHRcdFx0cGFubmVyLnBvc2l0aW9uWC5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSggX3Bvc2l0aW9uLngsIGVuZFRpbWUgKTtcclxuXHRcdFx0cGFubmVyLnBvc2l0aW9uWS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSggX3Bvc2l0aW9uLnksIGVuZFRpbWUgKTtcclxuXHRcdFx0cGFubmVyLnBvc2l0aW9uWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSggX3Bvc2l0aW9uLnosIGVuZFRpbWUgKTtcclxuXHRcdFx0cGFubmVyLm9yaWVudGF0aW9uWC5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSggX29yaWVudGF0aW9uLngsIGVuZFRpbWUgKTtcclxuXHRcdFx0cGFubmVyLm9yaWVudGF0aW9uWS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSggX29yaWVudGF0aW9uLnksIGVuZFRpbWUgKTtcclxuXHRcdFx0cGFubmVyLm9yaWVudGF0aW9uWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSggX29yaWVudGF0aW9uLnosIGVuZFRpbWUgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0cGFubmVyLnNldFBvc2l0aW9uKCBfcG9zaXRpb24ueCwgX3Bvc2l0aW9uLnksIF9wb3NpdGlvbi56ICk7XHJcblx0XHRcdHBhbm5lci5zZXRPcmllbnRhdGlvbiggX29yaWVudGF0aW9uLngsIF9vcmllbnRhdGlvbi55LCBfb3JpZW50YXRpb24ueiApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgUG9zaXRpb25hbEF1ZGlvIH07XHJcbiIsIi8qKlxyXG4gKiBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIHRvIGFuYWx5c2UgYXVkaW8gZGF0YS5cclxuICpcclxuICogYGBganNcclxuICogLy8gY3JlYXRlIGFuIEF1ZGlvTGlzdGVuZXIgYW5kIGFkZCBpdCB0byB0aGUgY2FtZXJhXHJcbiAqIGNvbnN0IGxpc3RlbmVyID0gbmV3IFRIUkVFLkF1ZGlvTGlzdGVuZXIoKTtcclxuICogY2FtZXJhLmFkZCggbGlzdGVuZXIgKTtcclxuICpcclxuICogLy8gY3JlYXRlIGFuIEF1ZGlvIHNvdXJjZVxyXG4gKiBjb25zdCBzb3VuZCA9IG5ldyBUSFJFRS5BdWRpbyggbGlzdGVuZXIgKTtcclxuICpcclxuICogLy8gbG9hZCBhIHNvdW5kIGFuZCBzZXQgaXQgYXMgdGhlIEF1ZGlvIG9iamVjdCdzIGJ1ZmZlclxyXG4gKiBjb25zdCBhdWRpb0xvYWRlciA9IG5ldyBUSFJFRS5BdWRpb0xvYWRlcigpO1xyXG4gKiBhdWRpb0xvYWRlci5sb2FkKCAnc291bmRzL2FtYmllbnQub2dnJywgZnVuY3Rpb24oIGJ1ZmZlciApIHtcclxuICogXHRzb3VuZC5zZXRCdWZmZXIoIGJ1ZmZlciApO1xyXG4gKiBcdHNvdW5kLnNldExvb3AodHJ1ZSk7XHJcbiAqIFx0c291bmQuc2V0Vm9sdW1lKDAuNSk7XHJcbiAqIFx0c291bmQucGxheSgpO1xyXG4gKiB9KTtcclxuICpcclxuICogLy8gY3JlYXRlIGFuIEF1ZGlvQW5hbHlzZXIsIHBhc3NpbmcgaW4gdGhlIHNvdW5kIGFuZCBkZXNpcmVkIGZmdFNpemVcclxuICogY29uc3QgYW5hbHlzZXIgPSBuZXcgVEhSRUUuQXVkaW9BbmFseXNlciggc291bmQsIDMyICk7XHJcbiAqXHJcbiAqIC8vIGdldCB0aGUgYXZlcmFnZSBmcmVxdWVuY3kgb2YgdGhlIHNvdW5kXHJcbiAqIGNvbnN0IGRhdGEgPSBhbmFseXNlci5nZXRBdmVyYWdlRnJlcXVlbmN5KCk7XHJcbiAqIGBgYFxyXG4gKi9cclxuY2xhc3MgQXVkaW9BbmFseXNlciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYXVkaW8gYW5hbHl6ZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0F1ZGlvfSBhdWRpbyAtIFRoZSBhdWRpbyB0byBhbmFseXplLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZmZ0U2l6ZT0yMDQ4XSAtIFRoZSB3aW5kb3cgc2l6ZSBpbiBzYW1wbGVzIHRoYXQgaXMgdXNlZCB3aGVuIHBlcmZvcm1pbmcgYSBGYXN0IEZvdXJpZXIgVHJhbnNmb3JtIChGRlQpIHRvIGdldCBmcmVxdWVuY3kgZG9tYWluIGRhdGEuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGF1ZGlvLCBmZnRTaXplID0gMjA0OCApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBnbG9iYWwgYXVkaW8gbGlzdGVuZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FuYWx5c2VyTm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hbmFseXNlciA9IGF1ZGlvLmNvbnRleHQuY3JlYXRlQW5hbHlzZXIoKTtcclxuXHRcdHRoaXMuYW5hbHlzZXIuZmZ0U2l6ZSA9IGZmdFNpemU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb2xkcyB0aGUgYW5hbHl6ZWQgZGF0YS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VWludDhBcnJheX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kYXRhID0gbmV3IFVpbnQ4QXJyYXkoIHRoaXMuYW5hbHlzZXIuZnJlcXVlbmN5QmluQ291bnQgKTtcclxuXHJcblx0XHRhdWRpby5nZXRPdXRwdXQoKS5jb25uZWN0KCB0aGlzLmFuYWx5c2VyICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhbiBhcnJheSB3aXRoIGZyZXF1ZW5jeSBkYXRhIG9mIHRoZSBhdWRpby5cclxuXHQgKlxyXG5cdCAqIEVhY2ggaXRlbSBpbiB0aGUgYXJyYXkgcmVwcmVzZW50cyB0aGUgZGVjaWJlbCB2YWx1ZSBmb3IgYSBzcGVjaWZpYyBmcmVxdWVuY3kuXHJcblx0ICogVGhlIGZyZXF1ZW5jaWVzIGFyZSBzcHJlYWQgbGluZWFybHkgZnJvbSAwIHRvIDEvMiBvZiB0aGUgc2FtcGxlIHJhdGUuXHJcblx0ICogRm9yIGV4YW1wbGUsIGZvciA0ODAwMCBzYW1wbGUgcmF0ZSwgdGhlIGxhc3QgaXRlbSBvZiB0aGUgYXJyYXkgd2lsbCByZXByZXNlbnRcclxuXHQgKiB0aGUgZGVjaWJlbCB2YWx1ZSBmb3IgMjQwMDAgSHouXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtVaW50OEFycmF5fSBUaGUgZnJlcXVlbmN5IGRhdGEuXHJcblx0ICovXHJcblx0Z2V0RnJlcXVlbmN5RGF0YSgpIHtcclxuXHJcblx0XHR0aGlzLmFuYWx5c2VyLmdldEJ5dGVGcmVxdWVuY3lEYXRhKCB0aGlzLmRhdGEgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5kYXRhO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGF2ZXJhZ2Ugb2YgdGhlIGZyZXF1ZW5jaWVzIHJldHVybmVkIGJ5IHtAbGluayBBdWRpb0FuYWx5c2VyI2dldEZyZXF1ZW5jeURhdGF9LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgYXZlcmFnZSBmcmVxdWVuY3kuXHJcblx0ICovXHJcblx0Z2V0QXZlcmFnZUZyZXF1ZW5jeSgpIHtcclxuXHJcblx0XHRsZXQgdmFsdWUgPSAwO1xyXG5cdFx0Y29uc3QgZGF0YSA9IHRoaXMuZ2V0RnJlcXVlbmN5RGF0YSgpO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0dmFsdWUgKz0gZGF0YVsgaSBdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdmFsdWUgLyBkYXRhLmxlbmd0aDtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgQXVkaW9BbmFseXNlciB9O1xyXG4iLCJpbXBvcnQgeyBRdWF0ZXJuaW9uIH0gZnJvbSAnLi4vbWF0aC9RdWF0ZXJuaW9uLmpzJztcclxuXHJcbi8qKlxyXG4gKiBCdWZmZXJlZCBzY2VuZSBncmFwaCBwcm9wZXJ0eSB0aGF0IGFsbG93cyB3ZWlnaHRlZCBhY2N1bXVsYXRpb247IHVzZWQgaW50ZXJuYWxseS5cclxuICovXHJcbmNsYXNzIFByb3BlcnR5TWl4ZXIge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHByb3BlcnR5IG1peGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtQcm9wZXJ0eUJpbmRpbmd9IGJpbmRpbmcgLSBUaGUgcHJvcGVydHkgYmluZGluZy5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdHlwZU5hbWUgLSBUaGUga2V5ZnJhbWUgdHJhY2sgdHlwZSBuYW1lLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVNpemUgLSBUaGUga2V5ZnJhbWUgdHJhY2sgdmFsdWUgc2l6ZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggYmluZGluZywgdHlwZU5hbWUsIHZhbHVlU2l6ZSApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBwcm9wZXJ0eSBiaW5kaW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtQcm9wZXJ0eUJpbmRpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYmluZGluZyA9IGJpbmRpbmc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUga2V5ZnJhbWUgdHJhY2sgdmFsdWUgc2l6ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnZhbHVlU2l6ZSA9IHZhbHVlU2l6ZTtcclxuXHJcblx0XHRsZXQgbWl4RnVuY3Rpb24sXHJcblx0XHRcdG1peEZ1bmN0aW9uQWRkaXRpdmUsXHJcblx0XHRcdHNldElkZW50aXR5O1xyXG5cclxuXHRcdC8vIGJ1ZmZlciBsYXlvdXQ6IFsgaW5jb21pbmcgfCBhY2N1MCB8IGFjY3UxIHwgb3JpZyB8IGFkZEFjY3UgfCAob3B0aW9uYWwgd29yaykgXVxyXG5cdFx0Ly9cclxuXHRcdC8vIGludGVycG9sYXRvcnMgY2FuIHVzZSAuYnVmZmVyIGFzIHRoZWlyIC5yZXN1bHRcclxuXHRcdC8vIHRoZSBkYXRhIHRoZW4gZ29lcyB0byAnaW5jb21pbmcnXHJcblx0XHQvL1xyXG5cdFx0Ly8gJ2FjY3UwJyBhbmQgJ2FjY3UxJyBhcmUgdXNlZCBmcmFtZS1pbnRlcmxlYXZlZCBmb3JcclxuXHRcdC8vIHRoZSBjdW11bGF0aXZlIHJlc3VsdCBhbmQgYXJlIGNvbXBhcmVkIHRvIGRldGVjdFxyXG5cdFx0Ly8gY2hhbmdlc1xyXG5cdFx0Ly9cclxuXHRcdC8vICdvcmlnJyBzdG9yZXMgdGhlIG9yaWdpbmFsIHN0YXRlIG9mIHRoZSBwcm9wZXJ0eVxyXG5cdFx0Ly9cclxuXHRcdC8vICdhZGQnIGlzIHVzZWQgZm9yIGFkZGl0aXZlIGN1bXVsYXRpdmUgcmVzdWx0c1xyXG5cdFx0Ly9cclxuXHRcdC8vICd3b3JrJyBpcyBvcHRpb25hbCBhbmQgaXMgb25seSBwcmVzZW50IGZvciBxdWF0ZXJuaW9uIHR5cGVzLiBJdCBpcyB1c2VkXHJcblx0XHQvLyB0byBzdG9yZSBpbnRlcm1lZGlhdGUgcXVhdGVybmlvbiBtdWx0aXBsaWNhdGlvbiByZXN1bHRzXHJcblxyXG5cdFx0c3dpdGNoICggdHlwZU5hbWUgKSB7XHJcblxyXG5cdFx0XHRjYXNlICdxdWF0ZXJuaW9uJzpcclxuXHRcdFx0XHRtaXhGdW5jdGlvbiA9IHRoaXMuX3NsZXJwO1xyXG5cdFx0XHRcdG1peEZ1bmN0aW9uQWRkaXRpdmUgPSB0aGlzLl9zbGVycEFkZGl0aXZlO1xyXG5cdFx0XHRcdHNldElkZW50aXR5ID0gdGhpcy5fc2V0QWRkaXRpdmVJZGVudGl0eVF1YXRlcm5pb247XHJcblxyXG5cdFx0XHRcdHRoaXMuYnVmZmVyID0gbmV3IEZsb2F0NjRBcnJheSggdmFsdWVTaXplICogNiApO1xyXG5cdFx0XHRcdHRoaXMuX3dvcmtJbmRleCA9IDU7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlICdzdHJpbmcnOlxyXG5cdFx0XHRjYXNlICdib29sJzpcclxuXHRcdFx0XHRtaXhGdW5jdGlvbiA9IHRoaXMuX3NlbGVjdDtcclxuXHJcblx0XHRcdFx0Ly8gVXNlIHRoZSByZWd1bGFyIG1peCBmdW5jdGlvbiBhbmQgZm9yIGFkZGl0aXZlIG9uIHRoZXNlIHR5cGVzLFxyXG5cdFx0XHRcdC8vIGFkZGl0aXZlIGlzIG5vdCByZWxldmFudCBmb3Igbm9uLW51bWVyaWMgdHlwZXNcclxuXHRcdFx0XHRtaXhGdW5jdGlvbkFkZGl0aXZlID0gdGhpcy5fc2VsZWN0O1xyXG5cclxuXHRcdFx0XHRzZXRJZGVudGl0eSA9IHRoaXMuX3NldEFkZGl0aXZlSWRlbnRpdHlPdGhlcjtcclxuXHJcblx0XHRcdFx0dGhpcy5idWZmZXIgPSBuZXcgQXJyYXkoIHZhbHVlU2l6ZSAqIDUgKTtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0bWl4RnVuY3Rpb24gPSB0aGlzLl9sZXJwO1xyXG5cdFx0XHRcdG1peEZ1bmN0aW9uQWRkaXRpdmUgPSB0aGlzLl9sZXJwQWRkaXRpdmU7XHJcblx0XHRcdFx0c2V0SWRlbnRpdHkgPSB0aGlzLl9zZXRBZGRpdGl2ZUlkZW50aXR5TnVtZXJpYztcclxuXHJcblx0XHRcdFx0dGhpcy5idWZmZXIgPSBuZXcgRmxvYXQ2NEFycmF5KCB2YWx1ZVNpemUgKiA1ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuX21peEJ1ZmZlclJlZ2lvbiA9IG1peEZ1bmN0aW9uO1xyXG5cdFx0dGhpcy5fbWl4QnVmZmVyUmVnaW9uQWRkaXRpdmUgPSBtaXhGdW5jdGlvbkFkZGl0aXZlO1xyXG5cdFx0dGhpcy5fc2V0SWRlbnRpdHkgPSBzZXRJZGVudGl0eTtcclxuXHRcdHRoaXMuX29yaWdJbmRleCA9IDM7XHJcblx0XHR0aGlzLl9hZGRJbmRleCA9IDQ7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUT0RPXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jdW11bGF0aXZlV2VpZ2h0ID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRPRE9cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmN1bXVsYXRpdmVXZWlnaHRBZGRpdGl2ZSA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUT0RPXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51c2VDb3VudCA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUT0RPXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yZWZlcmVuY2VDb3VudCA9IDA7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWNjdW11bGF0ZXMgZGF0YSBpbiB0aGUgYGluY29taW5nYCByZWdpb24gaW50byBgYWNjdTxpPmAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYWNjdUluZGV4IC0gVGhlIGFjY3VtdWxhdGlvbiBpbmRleC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gd2VpZ2h0IC0gVGhlIHdlaWdodC5cclxuXHQgKi9cclxuXHRhY2N1bXVsYXRlKCBhY2N1SW5kZXgsIHdlaWdodCApIHtcclxuXHJcblx0XHQvLyBub3RlOiBoYXBwaWx5IGFjY3VtdWxhdGluZyBub3RoaW5nIHdoZW4gd2VpZ2h0ID0gMCwgdGhlIGNhbGxlciBrbm93c1xyXG5cdFx0Ly8gdGhlIHdlaWdodCBhbmQgc2hvdWxkbid0IGhhdmUgbWFkZSB0aGUgY2FsbCBpbiB0aGUgZmlyc3QgcGxhY2VcclxuXHJcblx0XHRjb25zdCBidWZmZXIgPSB0aGlzLmJ1ZmZlcixcclxuXHRcdFx0c3RyaWRlID0gdGhpcy52YWx1ZVNpemUsXHJcblx0XHRcdG9mZnNldCA9IGFjY3VJbmRleCAqIHN0cmlkZSArIHN0cmlkZTtcclxuXHJcblx0XHRsZXQgY3VycmVudFdlaWdodCA9IHRoaXMuY3VtdWxhdGl2ZVdlaWdodDtcclxuXHJcblx0XHRpZiAoIGN1cnJlbnRXZWlnaHQgPT09IDAgKSB7XHJcblxyXG5cdFx0XHQvLyBhY2N1TiA6PSBpbmNvbWluZyAqIHdlaWdodFxyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpICE9PSBzdHJpZGU7ICsrIGkgKSB7XHJcblxyXG5cdFx0XHRcdGJ1ZmZlclsgb2Zmc2V0ICsgaSBdID0gYnVmZmVyWyBpIF07XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjdXJyZW50V2VpZ2h0ID0gd2VpZ2h0O1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHQvLyBhY2N1TiA6PSBhY2N1TiArIGluY29taW5nICogd2VpZ2h0XHJcblxyXG5cdFx0XHRjdXJyZW50V2VpZ2h0ICs9IHdlaWdodDtcclxuXHRcdFx0Y29uc3QgbWl4ID0gd2VpZ2h0IC8gY3VycmVudFdlaWdodDtcclxuXHRcdFx0dGhpcy5fbWl4QnVmZmVyUmVnaW9uKCBidWZmZXIsIG9mZnNldCwgMCwgbWl4LCBzdHJpZGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5jdW11bGF0aXZlV2VpZ2h0ID0gY3VycmVudFdlaWdodDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBY2N1bXVsYXRlcyBkYXRhIGluIHRoZSBgaW5jb21pbmdgIHJlZ2lvbiBpbnRvIGBhZGRgLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHdlaWdodCAtIFRoZSB3ZWlnaHQuXHJcblx0ICovXHJcblx0YWNjdW11bGF0ZUFkZGl0aXZlKCB3ZWlnaHQgKSB7XHJcblxyXG5cdFx0Y29uc3QgYnVmZmVyID0gdGhpcy5idWZmZXIsXHJcblx0XHRcdHN0cmlkZSA9IHRoaXMudmFsdWVTaXplLFxyXG5cdFx0XHRvZmZzZXQgPSBzdHJpZGUgKiB0aGlzLl9hZGRJbmRleDtcclxuXHJcblx0XHRpZiAoIHRoaXMuY3VtdWxhdGl2ZVdlaWdodEFkZGl0aXZlID09PSAwICkge1xyXG5cclxuXHRcdFx0Ly8gYWRkID0gaWRlbnRpdHlcclxuXHJcblx0XHRcdHRoaXMuX3NldElkZW50aXR5KCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGFkZCA6PSBhZGQgKyBpbmNvbWluZyAqIHdlaWdodFxyXG5cclxuXHRcdHRoaXMuX21peEJ1ZmZlclJlZ2lvbkFkZGl0aXZlKCBidWZmZXIsIG9mZnNldCwgMCwgd2VpZ2h0LCBzdHJpZGUgKTtcclxuXHRcdHRoaXMuY3VtdWxhdGl2ZVdlaWdodEFkZGl0aXZlICs9IHdlaWdodDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBcHBsaWVzIHRoZSBzdGF0ZSBvZiBgYWNjdTxpPmAgdG8gdGhlIGJpbmRpbmcgd2hlbiBhY2N1cyBkaWZmZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYWNjdUluZGV4IC0gVGhlIGFjY3VtdWxhdGlvbiBpbmRleC5cclxuXHQgKi9cclxuXHRhcHBseSggYWNjdUluZGV4ICkge1xyXG5cclxuXHRcdGNvbnN0IHN0cmlkZSA9IHRoaXMudmFsdWVTaXplLFxyXG5cdFx0XHRidWZmZXIgPSB0aGlzLmJ1ZmZlcixcclxuXHRcdFx0b2Zmc2V0ID0gYWNjdUluZGV4ICogc3RyaWRlICsgc3RyaWRlLFxyXG5cclxuXHRcdFx0d2VpZ2h0ID0gdGhpcy5jdW11bGF0aXZlV2VpZ2h0LFxyXG5cdFx0XHR3ZWlnaHRBZGRpdGl2ZSA9IHRoaXMuY3VtdWxhdGl2ZVdlaWdodEFkZGl0aXZlLFxyXG5cclxuXHRcdFx0YmluZGluZyA9IHRoaXMuYmluZGluZztcclxuXHJcblx0XHR0aGlzLmN1bXVsYXRpdmVXZWlnaHQgPSAwO1xyXG5cdFx0dGhpcy5jdW11bGF0aXZlV2VpZ2h0QWRkaXRpdmUgPSAwO1xyXG5cclxuXHRcdGlmICggd2VpZ2h0IDwgMSApIHtcclxuXHJcblx0XHRcdC8vIGFjY3VOIDo9IGFjY3VOICsgb3JpZ2luYWwgKiAoIDEgLSBjdW11bGF0aXZlV2VpZ2h0IClcclxuXHJcblx0XHRcdGNvbnN0IG9yaWdpbmFsVmFsdWVPZmZzZXQgPSBzdHJpZGUgKiB0aGlzLl9vcmlnSW5kZXg7XHJcblxyXG5cdFx0XHR0aGlzLl9taXhCdWZmZXJSZWdpb24oXHJcblx0XHRcdFx0YnVmZmVyLCBvZmZzZXQsIG9yaWdpbmFsVmFsdWVPZmZzZXQsIDEgLSB3ZWlnaHQsIHN0cmlkZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHdlaWdodEFkZGl0aXZlID4gMCApIHtcclxuXHJcblx0XHRcdC8vIGFjY3VOIDo9IGFjY3VOICsgYWRkaXRpdmUgYWNjdU5cclxuXHJcblx0XHRcdHRoaXMuX21peEJ1ZmZlclJlZ2lvbkFkZGl0aXZlKCBidWZmZXIsIG9mZnNldCwgdGhpcy5fYWRkSW5kZXggKiBzdHJpZGUsIDEsIHN0cmlkZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IHN0cmlkZSwgZSA9IHN0cmlkZSArIHN0cmlkZTsgaSAhPT0gZTsgKysgaSApIHtcclxuXHJcblx0XHRcdGlmICggYnVmZmVyWyBpIF0gIT09IGJ1ZmZlclsgaSArIHN0cmlkZSBdICkge1xyXG5cclxuXHRcdFx0XHQvLyB2YWx1ZSBoYXMgY2hhbmdlZCAtPiB1cGRhdGUgc2NlbmUgZ3JhcGhcclxuXHJcblx0XHRcdFx0YmluZGluZy5zZXRWYWx1ZSggYnVmZmVyLCBvZmZzZXQgKTtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbWVtYmVycyB0aGUgc3RhdGUgb2YgdGhlIGJvdW5kIHByb3BlcnR5IGFuZCBjb3B5IGl0IHRvIGJvdGggYWNjdXMuXHJcblx0ICovXHJcblx0c2F2ZU9yaWdpbmFsU3RhdGUoKSB7XHJcblxyXG5cdFx0Y29uc3QgYmluZGluZyA9IHRoaXMuYmluZGluZztcclxuXHJcblx0XHRjb25zdCBidWZmZXIgPSB0aGlzLmJ1ZmZlcixcclxuXHRcdFx0c3RyaWRlID0gdGhpcy52YWx1ZVNpemUsXHJcblxyXG5cdFx0XHRvcmlnaW5hbFZhbHVlT2Zmc2V0ID0gc3RyaWRlICogdGhpcy5fb3JpZ0luZGV4O1xyXG5cclxuXHRcdGJpbmRpbmcuZ2V0VmFsdWUoIGJ1ZmZlciwgb3JpZ2luYWxWYWx1ZU9mZnNldCApO1xyXG5cclxuXHRcdC8vIGFjY3VbMC4uMV0gOj0gb3JpZyAtLSBpbml0aWFsbHkgZGV0ZWN0IGNoYW5nZXMgYWdhaW5zdCB0aGUgb3JpZ2luYWxcclxuXHRcdGZvciAoIGxldCBpID0gc3RyaWRlLCBlID0gb3JpZ2luYWxWYWx1ZU9mZnNldDsgaSAhPT0gZTsgKysgaSApIHtcclxuXHJcblx0XHRcdGJ1ZmZlclsgaSBdID0gYnVmZmVyWyBvcmlnaW5hbFZhbHVlT2Zmc2V0ICsgKCBpICUgc3RyaWRlICkgXTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQWRkIHRvIGlkZW50aXR5IGZvciBhZGRpdGl2ZVxyXG5cdFx0dGhpcy5fc2V0SWRlbnRpdHkoKTtcclxuXHJcblx0XHR0aGlzLmN1bXVsYXRpdmVXZWlnaHQgPSAwO1xyXG5cdFx0dGhpcy5jdW11bGF0aXZlV2VpZ2h0QWRkaXRpdmUgPSAwO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFwcGxpZXMgdGhlIHN0YXRlIHByZXZpb3VzbHkgdGFrZW4gdmlhIHtAbGluayBQcm9wZXJ0eU1peGVyI3NhdmVPcmlnaW5hbFN0YXRlfSB0byB0aGUgYmluZGluZy5cclxuXHQgKi9cclxuXHRyZXN0b3JlT3JpZ2luYWxTdGF0ZSgpIHtcclxuXHJcblx0XHRjb25zdCBvcmlnaW5hbFZhbHVlT2Zmc2V0ID0gdGhpcy52YWx1ZVNpemUgKiAzO1xyXG5cdFx0dGhpcy5iaW5kaW5nLnNldFZhbHVlKCB0aGlzLmJ1ZmZlciwgb3JpZ2luYWxWYWx1ZU9mZnNldCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vIGludGVybmFsc1xyXG5cclxuXHRfc2V0QWRkaXRpdmVJZGVudGl0eU51bWVyaWMoKSB7XHJcblxyXG5cdFx0Y29uc3Qgc3RhcnRJbmRleCA9IHRoaXMuX2FkZEluZGV4ICogdGhpcy52YWx1ZVNpemU7XHJcblx0XHRjb25zdCBlbmRJbmRleCA9IHN0YXJ0SW5kZXggKyB0aGlzLnZhbHVlU2l6ZTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IHN0YXJ0SW5kZXg7IGkgPCBlbmRJbmRleDsgaSArKyApIHtcclxuXHJcblx0XHRcdHRoaXMuYnVmZmVyWyBpIF0gPSAwO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRfc2V0QWRkaXRpdmVJZGVudGl0eVF1YXRlcm5pb24oKSB7XHJcblxyXG5cdFx0dGhpcy5fc2V0QWRkaXRpdmVJZGVudGl0eU51bWVyaWMoKTtcclxuXHRcdHRoaXMuYnVmZmVyWyB0aGlzLl9hZGRJbmRleCAqIHRoaXMudmFsdWVTaXplICsgMyBdID0gMTtcclxuXHJcblx0fVxyXG5cclxuXHRfc2V0QWRkaXRpdmVJZGVudGl0eU90aGVyKCkge1xyXG5cclxuXHRcdGNvbnN0IHN0YXJ0SW5kZXggPSB0aGlzLl9vcmlnSW5kZXggKiB0aGlzLnZhbHVlU2l6ZTtcclxuXHRcdGNvbnN0IHRhcmdldEluZGV4ID0gdGhpcy5fYWRkSW5kZXggKiB0aGlzLnZhbHVlU2l6ZTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB0aGlzLnZhbHVlU2l6ZTsgaSArKyApIHtcclxuXHJcblx0XHRcdHRoaXMuYnVmZmVyWyB0YXJnZXRJbmRleCArIGkgXSA9IHRoaXMuYnVmZmVyWyBzdGFydEluZGV4ICsgaSBdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHJcblx0Ly8gbWl4IGZ1bmN0aW9uc1xyXG5cclxuXHRfc2VsZWN0KCBidWZmZXIsIGRzdE9mZnNldCwgc3JjT2Zmc2V0LCB0LCBzdHJpZGUgKSB7XHJcblxyXG5cdFx0aWYgKCB0ID49IDAuNSApIHtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSAhPT0gc3RyaWRlOyArKyBpICkge1xyXG5cclxuXHRcdFx0XHRidWZmZXJbIGRzdE9mZnNldCArIGkgXSA9IGJ1ZmZlclsgc3JjT2Zmc2V0ICsgaSBdO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRfc2xlcnAoIGJ1ZmZlciwgZHN0T2Zmc2V0LCBzcmNPZmZzZXQsIHQgKSB7XHJcblxyXG5cdFx0UXVhdGVybmlvbi5zbGVycEZsYXQoIGJ1ZmZlciwgZHN0T2Zmc2V0LCBidWZmZXIsIGRzdE9mZnNldCwgYnVmZmVyLCBzcmNPZmZzZXQsIHQgKTtcclxuXHJcblx0fVxyXG5cclxuXHRfc2xlcnBBZGRpdGl2ZSggYnVmZmVyLCBkc3RPZmZzZXQsIHNyY09mZnNldCwgdCwgc3RyaWRlICkge1xyXG5cclxuXHRcdGNvbnN0IHdvcmtPZmZzZXQgPSB0aGlzLl93b3JrSW5kZXggKiBzdHJpZGU7XHJcblxyXG5cdFx0Ly8gU3RvcmUgcmVzdWx0IGluIGludGVybWVkaWF0ZSBidWZmZXIgb2Zmc2V0XHJcblx0XHRRdWF0ZXJuaW9uLm11bHRpcGx5UXVhdGVybmlvbnNGbGF0KCBidWZmZXIsIHdvcmtPZmZzZXQsIGJ1ZmZlciwgZHN0T2Zmc2V0LCBidWZmZXIsIHNyY09mZnNldCApO1xyXG5cclxuXHRcdC8vIFNsZXJwIHRvIHRoZSBpbnRlcm1lZGlhdGUgcmVzdWx0XHJcblx0XHRRdWF0ZXJuaW9uLnNsZXJwRmxhdCggYnVmZmVyLCBkc3RPZmZzZXQsIGJ1ZmZlciwgZHN0T2Zmc2V0LCBidWZmZXIsIHdvcmtPZmZzZXQsIHQgKTtcclxuXHJcblx0fVxyXG5cclxuXHRfbGVycCggYnVmZmVyLCBkc3RPZmZzZXQsIHNyY09mZnNldCwgdCwgc3RyaWRlICkge1xyXG5cclxuXHRcdGNvbnN0IHMgPSAxIC0gdDtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgIT09IHN0cmlkZTsgKysgaSApIHtcclxuXHJcblx0XHRcdGNvbnN0IGogPSBkc3RPZmZzZXQgKyBpO1xyXG5cclxuXHRcdFx0YnVmZmVyWyBqIF0gPSBidWZmZXJbIGogXSAqIHMgKyBidWZmZXJbIHNyY09mZnNldCArIGkgXSAqIHQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdF9sZXJwQWRkaXRpdmUoIGJ1ZmZlciwgZHN0T2Zmc2V0LCBzcmNPZmZzZXQsIHQsIHN0cmlkZSApIHtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgIT09IHN0cmlkZTsgKysgaSApIHtcclxuXHJcblx0XHRcdGNvbnN0IGogPSBkc3RPZmZzZXQgKyBpO1xyXG5cclxuXHRcdFx0YnVmZmVyWyBqIF0gPSBidWZmZXJbIGogXSArIGJ1ZmZlclsgc3JjT2Zmc2V0ICsgaSBdICogdDtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBQcm9wZXJ0eU1peGVyIH07XHJcbiIsIi8vIENoYXJhY3RlcnMgW10uOi8gYXJlIHJlc2VydmVkIGZvciB0cmFjayBiaW5kaW5nIHN5bnRheC5cclxuY29uc3QgX1JFU0VSVkVEX0NIQVJTX1JFID0gJ1xcXFxbXFxcXF1cXFxcLjpcXFxcLyc7XHJcbmNvbnN0IF9yZXNlcnZlZFJlID0gbmV3IFJlZ0V4cCggJ1snICsgX1JFU0VSVkVEX0NIQVJTX1JFICsgJ10nLCAnZycgKTtcclxuXHJcbi8vIEF0dGVtcHRzIHRvIGFsbG93IG5vZGUgbmFtZXMgZnJvbSBhbnkgbGFuZ3VhZ2UuIEVTNSdzIGBcXHdgIHJlZ2V4cCBtYXRjaGVzXHJcbi8vIG9ubHkgbGF0aW4gY2hhcmFjdGVycywgYW5kIHRoZSB1bmljb2RlIFxccHtMfSBpcyBub3QgeWV0IHN1cHBvcnRlZC4gU29cclxuLy8gaW5zdGVhZCwgd2UgZXhjbHVkZSByZXNlcnZlZCBjaGFyYWN0ZXJzIGFuZCBtYXRjaCBldmVyeXRoaW5nIGVsc2UuXHJcbmNvbnN0IF93b3JkQ2hhciA9ICdbXicgKyBfUkVTRVJWRURfQ0hBUlNfUkUgKyAnXSc7XHJcbmNvbnN0IF93b3JkQ2hhck9yRG90ID0gJ1teJyArIF9SRVNFUlZFRF9DSEFSU19SRS5yZXBsYWNlKCAnXFxcXC4nLCAnJyApICsgJ10nO1xyXG5cclxuLy8gUGFyZW50IGRpcmVjdG9yaWVzLCBkZWxpbWl0ZWQgYnkgJy8nIG9yICc6Jy4gQ3VycmVudGx5IHVudXNlZCwgYnV0IG11c3RcclxuLy8gYmUgbWF0Y2hlZCB0byBwYXJzZSB0aGUgcmVzdCBvZiB0aGUgdHJhY2sgbmFtZS5cclxuY29uc3QgX2RpcmVjdG9yeVJlID0gLypAX19QVVJFX18qLyAvKCg/OldDK1tcXC86XSkqKS8uc291cmNlLnJlcGxhY2UoICdXQycsIF93b3JkQ2hhciApO1xyXG5cclxuLy8gVGFyZ2V0IG5vZGUuIE1heSBjb250YWluIHdvcmQgY2hhcmFjdGVycyAoYS16QS1aMC05XykgYW5kICcuJyBvciAnLScuXHJcbmNvbnN0IF9ub2RlUmUgPSAvKkBfX1BVUkVfXyovIC8oV0NPRCspPy8uc291cmNlLnJlcGxhY2UoICdXQ09EJywgX3dvcmRDaGFyT3JEb3QgKTtcclxuXHJcbi8vIE9iamVjdCBvbiB0YXJnZXQgbm9kZSwgYW5kIGFjY2Vzc29yLiBNYXkgbm90IGNvbnRhaW4gcmVzZXJ2ZWRcclxuLy8gY2hhcmFjdGVycy4gQWNjZXNzb3IgbWF5IGNvbnRhaW4gYW55IGNoYXJhY3RlciBleGNlcHQgY2xvc2luZyBicmFja2V0LlxyXG5jb25zdCBfb2JqZWN0UmUgPSAvKkBfX1BVUkVfXyovIC8oPzpcXC4oV0MrKSg/OlxcWyguKylcXF0pPyk/Ly5zb3VyY2UucmVwbGFjZSggJ1dDJywgX3dvcmRDaGFyICk7XHJcblxyXG4vLyBQcm9wZXJ0eSBhbmQgYWNjZXNzb3IuIE1heSBub3QgY29udGFpbiByZXNlcnZlZCBjaGFyYWN0ZXJzLiBBY2Nlc3NvciBtYXlcclxuLy8gY29udGFpbiBhbnkgbm9uLWJyYWNrZXQgY2hhcmFjdGVycy5cclxuY29uc3QgX3Byb3BlcnR5UmUgPSAvKkBfX1BVUkVfXyovIC9cXC4oV0MrKSg/OlxcWyguKylcXF0pPy8uc291cmNlLnJlcGxhY2UoICdXQycsIF93b3JkQ2hhciApO1xyXG5cclxuY29uc3QgX3RyYWNrUmUgPSBuZXcgUmVnRXhwKCAnJ1xyXG5cdCsgJ14nXHJcblx0KyBfZGlyZWN0b3J5UmVcclxuXHQrIF9ub2RlUmVcclxuXHQrIF9vYmplY3RSZVxyXG5cdCsgX3Byb3BlcnR5UmVcclxuXHQrICckJ1xyXG4pO1xyXG5cclxuY29uc3QgX3N1cHBvcnRlZE9iamVjdE5hbWVzID0gWyAnbWF0ZXJpYWwnLCAnbWF0ZXJpYWxzJywgJ2JvbmVzJywgJ21hcCcgXTtcclxuXHJcbmNsYXNzIENvbXBvc2l0ZSB7XHJcblxyXG5cdGNvbnN0cnVjdG9yKCB0YXJnZXRHcm91cCwgcGF0aCwgb3B0aW9uYWxQYXJzZWRQYXRoICkge1xyXG5cclxuXHRcdGNvbnN0IHBhcnNlZFBhdGggPSBvcHRpb25hbFBhcnNlZFBhdGggfHwgUHJvcGVydHlCaW5kaW5nLnBhcnNlVHJhY2tOYW1lKCBwYXRoICk7XHJcblxyXG5cdFx0dGhpcy5fdGFyZ2V0R3JvdXAgPSB0YXJnZXRHcm91cDtcclxuXHRcdHRoaXMuX2JpbmRpbmdzID0gdGFyZ2V0R3JvdXAuc3Vic2NyaWJlXyggcGF0aCwgcGFyc2VkUGF0aCApO1xyXG5cclxuXHR9XHJcblxyXG5cdGdldFZhbHVlKCBhcnJheSwgb2Zmc2V0ICkge1xyXG5cclxuXHRcdHRoaXMuYmluZCgpOyAvLyBiaW5kIGFsbCBiaW5kaW5nXHJcblxyXG5cdFx0Y29uc3QgZmlyc3RWYWxpZEluZGV4ID0gdGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLFxyXG5cdFx0XHRiaW5kaW5nID0gdGhpcy5fYmluZGluZ3NbIGZpcnN0VmFsaWRJbmRleCBdO1xyXG5cclxuXHRcdC8vIGFuZCBvbmx5IGNhbGwgLmdldFZhbHVlIG9uIHRoZSBmaXJzdFxyXG5cdFx0aWYgKCBiaW5kaW5nICE9PSB1bmRlZmluZWQgKSBiaW5kaW5nLmdldFZhbHVlKCBhcnJheSwgb2Zmc2V0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0VmFsdWUoIGFycmF5LCBvZmZzZXQgKSB7XHJcblxyXG5cdFx0Y29uc3QgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncztcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IHRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXywgbiA9IGJpbmRpbmdzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcclxuXHJcblx0XHRcdGJpbmRpbmdzWyBpIF0uc2V0VmFsdWUoIGFycmF5LCBvZmZzZXQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0YmluZCgpIHtcclxuXHJcblx0XHRjb25zdCBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gdGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLCBuID0gYmluZGluZ3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xyXG5cclxuXHRcdFx0YmluZGluZ3NbIGkgXS5iaW5kKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdHVuYmluZCgpIHtcclxuXHJcblx0XHRjb25zdCBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gdGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLCBuID0gYmluZGluZ3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xyXG5cclxuXHRcdFx0YmluZGluZ3NbIGkgXS51bmJpbmQoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8vIE5vdGU6IFRoaXMgY2xhc3MgdXNlcyBhIFN0YXRlIHBhdHRlcm4gb24gYSBwZXItbWV0aG9kIGJhc2lzOlxyXG4vLyAnYmluZCcgc2V0cyAndGhpcy5nZXRWYWx1ZScgLyAnc2V0VmFsdWUnIGFuZCBzaGFkb3dzIHRoZVxyXG4vLyBwcm90b3R5cGUgdmVyc2lvbiBvZiB0aGVzZSBtZXRob2RzIHdpdGggb25lIHRoYXQgcmVwcmVzZW50c1xyXG4vLyB0aGUgYm91bmQgc3RhdGUuIFdoZW4gdGhlIHByb3BlcnR5IGlzIG5vdCBmb3VuZCwgdGhlIG1ldGhvZHNcclxuLy8gYmVjb21lIG5vLW9wcy5cclxuXHJcblxyXG4vKipcclxuICogVGhpcyBob2xkcyBhIHJlZmVyZW5jZSB0byBhIHJlYWwgcHJvcGVydHkgaW4gdGhlIHNjZW5lIGdyYXBoOyB1c2VkIGludGVybmFsbHkuXHJcbiAqL1xyXG5jbGFzcyBQcm9wZXJ0eUJpbmRpbmcge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHByb3BlcnR5IGJpbmRpbmcuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gcm9vdE5vZGUgLSBUaGUgcm9vdCBub2RlLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gVGhlIHBhdGguXHJcblx0ICogQHBhcmFtIHs/T2JqZWN0fSBbcGFyc2VkUGF0aF0gLSBUaGUgcGFyc2VkIHBhdGguXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHJvb3ROb2RlLCBwYXRoLCBwYXJzZWRQYXRoICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG9iamVjdCBwYXRoIHRvIHRoZSBhbmltYXRlZCBwcm9wZXJ0eS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBhdGggPSBwYXRoO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQW4gb2JqZWN0IGhvbGRpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBhdGguXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wYXJzZWRQYXRoID0gcGFyc2VkUGF0aCB8fCBQcm9wZXJ0eUJpbmRpbmcucGFyc2VUcmFja05hbWUoIHBhdGggKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBvYmplY3Qgb3ducyB0aGUgYW5pbWF0ZWQgcHJvcGVydHkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9PYmplY3R9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9kZSA9IFByb3BlcnR5QmluZGluZy5maW5kTm9kZSggcm9vdE5vZGUsIHRoaXMucGFyc2VkUGF0aC5ub2RlTmFtZSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJvb3Qgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0M0R8U2tlbGV0b259XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucm9vdE5vZGUgPSByb290Tm9kZTtcclxuXHJcblx0XHQvLyBpbml0aWFsIHN0YXRlIG9mIHRoZXNlIG1ldGhvZHMgdGhhdCBjYWxscyAnYmluZCdcclxuXHRcdHRoaXMuZ2V0VmFsdWUgPSB0aGlzLl9nZXRWYWx1ZV91bmJvdW5kO1xyXG5cdFx0dGhpcy5zZXRWYWx1ZSA9IHRoaXMuX3NldFZhbHVlX3VuYm91bmQ7XHJcblxyXG5cdH1cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIEZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyBhIHByb3BlcnR5IGJpbmRpbmcgZnJvbSB0aGUgZ2l2ZW4gcGFyYW1ldGVycy5cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gcm9vdCAtIFRoZSByb290IG5vZGUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBUaGUgcGF0aC5cclxuXHQgKiBAcGFyYW0gez9PYmplY3R9IFtwYXJzZWRQYXRoXSAtIFRoZSBwYXJzZWQgcGF0aC5cclxuXHQgKiBAcmV0dXJuIHtQcm9wZXJ0eUJpbmRpbmd8Q29tcG9zaXRlfSBUaGUgY3JlYXRlZCBwcm9wZXJ0eSBiaW5kaW5nIG9yIGNvbXBvc2l0ZS5cclxuXHQgKi9cclxuXHRzdGF0aWMgY3JlYXRlKCByb290LCBwYXRoLCBwYXJzZWRQYXRoICkge1xyXG5cclxuXHRcdGlmICggISAoIHJvb3QgJiYgcm9vdC5pc0FuaW1hdGlvbk9iamVjdEdyb3VwICkgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gbmV3IFByb3BlcnR5QmluZGluZyggcm9vdCwgcGF0aCwgcGFyc2VkUGF0aCApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gbmV3IFByb3BlcnR5QmluZGluZy5Db21wb3NpdGUoIHJvb3QsIHBhdGgsIHBhcnNlZFBhdGggKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVwbGFjZXMgc3BhY2VzIHdpdGggdW5kZXJzY29yZXMgYW5kIHJlbW92ZXMgdW5zdXBwb3J0ZWQgY2hhcmFjdGVycyBmcm9tXHJcblx0ICogbm9kZSBuYW1lcywgdG8gZW5zdXJlIGNvbXBhdGliaWxpdHkgd2l0aCBwYXJzZVRyYWNrTmFtZSgpLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBOb2RlIG5hbWUgdG8gYmUgc2FuaXRpemVkLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHNhbml0aXplZCBub2RlIG5hbWUuXHJcblx0ICovXHJcblx0c3RhdGljIHNhbml0aXplTm9kZU5hbWUoIG5hbWUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5hbWUucmVwbGFjZSggL1xccy9nLCAnXycgKS5yZXBsYWNlKCBfcmVzZXJ2ZWRSZSwgJycgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQYXJzZXMgdGhlIGdpdmVuIHRyYWNrIG5hbWUgKGFuIG9iamVjdCBwYXRoIHRvIGFuIGFuaW1hdGVkIHByb3BlcnR5KSBhbmRcclxuXHQgKiByZXR1cm5zIGFuIG9iamVjdCB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwYXRoLiBNYXRjaGVzIHN0cmluZ3MgaW4gdGhlIGZvbGxvd2luZyBmb3JtczpcclxuXHQgKlxyXG5cdCAqIC0gbm9kZU5hbWUucHJvcGVydHlcclxuXHQgKiAtIG5vZGVOYW1lLnByb3BlcnR5W2FjY2Vzc29yXVxyXG5cdCAqIC0gbm9kZU5hbWUubWF0ZXJpYWwucHJvcGVydHlbYWNjZXNzb3JdXHJcblx0ICogLSB1dWlkLnByb3BlcnR5W2FjY2Vzc29yXVxyXG5cdCAqIC0gdXVpZC5vYmplY3ROYW1lW29iamVjdEluZGV4XS5wcm9wZXJ0eU5hbWVbcHJvcGVydHlJbmRleF1cclxuXHQgKiAtIHBhcmVudE5hbWUvbm9kZU5hbWUucHJvcGVydHlcclxuXHQgKiAtIHBhcmVudE5hbWUvcGFyZW50TmFtZS9ub2RlTmFtZS5wcm9wZXJ0eVtpbmRleF1cclxuXHQgKiAtIC5ib25lW0FybWF0dXJlLkRFRl9jb2ddLnBvc2l0aW9uXHJcblx0ICogLSBzY2VuZTpoZWxpdW1fYmFsbG9vbl9tb2RlbDpoZWxpdW1fYmFsbG9vbl9tb2RlbC5wb3NpdGlvblxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0cmFja05hbWUgLSBUaGUgdHJhY2sgbmFtZSB0byBwYXJzZS5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBwYXJzZWQgdHJhY2sgbmFtZSBhcyBhbiBvYmplY3QuXHJcblx0ICovXHJcblx0c3RhdGljIHBhcnNlVHJhY2tOYW1lKCB0cmFja05hbWUgKSB7XHJcblxyXG5cdFx0Y29uc3QgbWF0Y2hlcyA9IF90cmFja1JlLmV4ZWMoIHRyYWNrTmFtZSApO1xyXG5cclxuXHRcdGlmICggbWF0Y2hlcyA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRocm93IG5ldyBFcnJvciggJ1Byb3BlcnR5QmluZGluZzogQ2Fubm90IHBhcnNlIHRyYWNrTmFtZTogJyArIHRyYWNrTmFtZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCByZXN1bHRzID0ge1xyXG5cdFx0XHQvLyBkaXJlY3RvcnlOYW1lOiBtYXRjaGVzWyAxIF0sIC8vICh0c2NodykgY3VycmVudGx5IHVudXNlZFxyXG5cdFx0XHRub2RlTmFtZTogbWF0Y2hlc1sgMiBdLFxyXG5cdFx0XHRvYmplY3ROYW1lOiBtYXRjaGVzWyAzIF0sXHJcblx0XHRcdG9iamVjdEluZGV4OiBtYXRjaGVzWyA0IF0sXHJcblx0XHRcdHByb3BlcnR5TmFtZTogbWF0Y2hlc1sgNSBdLCAvLyByZXF1aXJlZFxyXG5cdFx0XHRwcm9wZXJ0eUluZGV4OiBtYXRjaGVzWyA2IF1cclxuXHRcdH07XHJcblxyXG5cdFx0Y29uc3QgbGFzdERvdCA9IHJlc3VsdHMubm9kZU5hbWUgJiYgcmVzdWx0cy5ub2RlTmFtZS5sYXN0SW5kZXhPZiggJy4nICk7XHJcblxyXG5cdFx0aWYgKCBsYXN0RG90ICE9PSB1bmRlZmluZWQgJiYgbGFzdERvdCAhPT0gLSAxICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgb2JqZWN0TmFtZSA9IHJlc3VsdHMubm9kZU5hbWUuc3Vic3RyaW5nKCBsYXN0RG90ICsgMSApO1xyXG5cclxuXHRcdFx0Ly8gT2JqZWN0IG5hbWVzIG11c3QgYmUgY2hlY2tlZCBhZ2FpbnN0IGFuIGFsbG93bGlzdC4gT3RoZXJ3aXNlLCB0aGVyZVxyXG5cdFx0XHQvLyBpcyBubyB3YXkgdG8gcGFyc2UgJ2Zvby5iYXIuYmF6JzogJ2JheicgbXVzdCBiZSBhIHByb3BlcnR5LCBidXRcclxuXHRcdFx0Ly8gJ2JhcicgY291bGQgYmUgdGhlIG9iamVjdE5hbWUsIG9yIHBhcnQgb2YgYSBub2RlTmFtZSAod2hpY2ggY2FuXHJcblx0XHRcdC8vIGluY2x1ZGUgJy4nIGNoYXJhY3RlcnMpLlxyXG5cdFx0XHRpZiAoIF9zdXBwb3J0ZWRPYmplY3ROYW1lcy5pbmRleE9mKCBvYmplY3ROYW1lICkgIT09IC0gMSApIHtcclxuXHJcblx0XHRcdFx0cmVzdWx0cy5ub2RlTmFtZSA9IHJlc3VsdHMubm9kZU5hbWUuc3Vic3RyaW5nKCAwLCBsYXN0RG90ICk7XHJcblx0XHRcdFx0cmVzdWx0cy5vYmplY3ROYW1lID0gb2JqZWN0TmFtZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCByZXN1bHRzLnByb3BlcnR5TmFtZSA9PT0gbnVsbCB8fCByZXN1bHRzLnByb3BlcnR5TmFtZS5sZW5ndGggPT09IDAgKSB7XHJcblxyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdQcm9wZXJ0eUJpbmRpbmc6IGNhbiBub3QgcGFyc2UgcHJvcGVydHlOYW1lIGZyb20gdHJhY2tOYW1lOiAnICsgdHJhY2tOYW1lICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiByZXN1bHRzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNlYXJjaGVzIGZvciBhIG5vZGUgaW4gdGhlIGhpZXJhcmNoeSBvZiB0aGUgZ2l2ZW4gcm9vdCBvYmplY3QgYnkgdGhlIGdpdmVuXHJcblx0ICogbm9kZSBuYW1lLlxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSByb290IC0gVGhlIHJvb3Qgb2JqZWN0LlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gbm9kZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgbm9kZS5cclxuXHQgKiBAcmV0dXJuIHs/T2JqZWN0fSBUaGUgZm91bmQgbm9kZS4gUmV0dXJucyBgbnVsbGAgaWYgbm8gb2JqZWN0IHdhcyBmb3VuZC5cclxuXHQgKi9cclxuXHRzdGF0aWMgZmluZE5vZGUoIHJvb3QsIG5vZGVOYW1lICkge1xyXG5cclxuXHRcdGlmICggbm9kZU5hbWUgPT09IHVuZGVmaW5lZCB8fCBub2RlTmFtZSA9PT0gJycgfHwgbm9kZU5hbWUgPT09ICcuJyB8fCBub2RlTmFtZSA9PT0gLSAxIHx8IG5vZGVOYW1lID09PSByb290Lm5hbWUgfHwgbm9kZU5hbWUgPT09IHJvb3QudXVpZCApIHtcclxuXHJcblx0XHRcdHJldHVybiByb290O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBzZWFyY2ggaW50byBza2VsZXRvbiBib25lcy5cclxuXHRcdGlmICggcm9vdC5za2VsZXRvbiApIHtcclxuXHJcblx0XHRcdGNvbnN0IGJvbmUgPSByb290LnNrZWxldG9uLmdldEJvbmVCeU5hbWUoIG5vZGVOYW1lICk7XHJcblxyXG5cdFx0XHRpZiAoIGJvbmUgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0cmV0dXJuIGJvbmU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIHNlYXJjaCBpbnRvIG5vZGUgc3VidHJlZS5cclxuXHRcdGlmICggcm9vdC5jaGlsZHJlbiApIHtcclxuXHJcblx0XHRcdGNvbnN0IHNlYXJjaE5vZGVTdWJ0cmVlID0gZnVuY3Rpb24gKCBjaGlsZHJlbiApIHtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGNoaWxkTm9kZSA9IGNoaWxkcmVuWyBpIF07XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBjaGlsZE5vZGUubmFtZSA9PT0gbm9kZU5hbWUgfHwgY2hpbGROb2RlLnV1aWQgPT09IG5vZGVOYW1lICkge1xyXG5cclxuXHRcdFx0XHRcdFx0cmV0dXJuIGNoaWxkTm9kZTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgcmVzdWx0ID0gc2VhcmNoTm9kZVN1YnRyZWUoIGNoaWxkTm9kZS5jaGlsZHJlbiApO1xyXG5cclxuXHRcdFx0XHRcdGlmICggcmVzdWx0ICkgcmV0dXJuIHJlc3VsdDtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcclxuXHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHRjb25zdCBzdWJUcmVlTm9kZSA9IHNlYXJjaE5vZGVTdWJ0cmVlKCByb290LmNoaWxkcmVuICk7XHJcblxyXG5cdFx0XHRpZiAoIHN1YlRyZWVOb2RlICkge1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gc3ViVHJlZU5vZGU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBudWxsO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vIHRoZXNlIGFyZSB1c2VkIHRvIFwiYmluZFwiIGEgbm9uZXhpc3RlbnQgcHJvcGVydHlcclxuXHRfZ2V0VmFsdWVfdW5hdmFpbGFibGUoKSB7fVxyXG5cdF9zZXRWYWx1ZV91bmF2YWlsYWJsZSgpIHt9XHJcblxyXG5cdC8vIEdldHRlcnNcclxuXHJcblx0X2dldFZhbHVlX2RpcmVjdCggYnVmZmVyLCBvZmZzZXQgKSB7XHJcblxyXG5cdFx0YnVmZmVyWyBvZmZzZXQgXSA9IHRoaXMudGFyZ2V0T2JqZWN0WyB0aGlzLnByb3BlcnR5TmFtZSBdO1xyXG5cclxuXHR9XHJcblxyXG5cdF9nZXRWYWx1ZV9hcnJheSggYnVmZmVyLCBvZmZzZXQgKSB7XHJcblxyXG5cdFx0Y29uc3Qgc291cmNlID0gdGhpcy5yZXNvbHZlZFByb3BlcnR5O1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbiA9IHNvdXJjZS5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XHJcblxyXG5cdFx0XHRidWZmZXJbIG9mZnNldCArKyBdID0gc291cmNlWyBpIF07XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdF9nZXRWYWx1ZV9hcnJheUVsZW1lbnQoIGJ1ZmZlciwgb2Zmc2V0ICkge1xyXG5cclxuXHRcdGJ1ZmZlclsgb2Zmc2V0IF0gPSB0aGlzLnJlc29sdmVkUHJvcGVydHlbIHRoaXMucHJvcGVydHlJbmRleCBdO1xyXG5cclxuXHR9XHJcblxyXG5cdF9nZXRWYWx1ZV90b0FycmF5KCBidWZmZXIsIG9mZnNldCApIHtcclxuXHJcblx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHkudG9BcnJheSggYnVmZmVyLCBvZmZzZXQgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvLyBEaXJlY3RcclxuXHJcblx0X3NldFZhbHVlX2RpcmVjdCggYnVmZmVyLCBvZmZzZXQgKSB7XHJcblxyXG5cdFx0dGhpcy50YXJnZXRPYmplY3RbIHRoaXMucHJvcGVydHlOYW1lIF0gPSBidWZmZXJbIG9mZnNldCBdO1xyXG5cclxuXHR9XHJcblxyXG5cdF9zZXRWYWx1ZV9kaXJlY3Rfc2V0TmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkge1xyXG5cclxuXHRcdHRoaXMudGFyZ2V0T2JqZWN0WyB0aGlzLnByb3BlcnR5TmFtZSBdID0gYnVmZmVyWyBvZmZzZXQgXTtcclxuXHRcdHRoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHRfc2V0VmFsdWVfZGlyZWN0X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkge1xyXG5cclxuXHRcdHRoaXMudGFyZ2V0T2JqZWN0WyB0aGlzLnByb3BlcnR5TmFtZSBdID0gYnVmZmVyWyBvZmZzZXQgXTtcclxuXHRcdHRoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vIEVudGlyZUFycmF5XHJcblxyXG5cdF9zZXRWYWx1ZV9hcnJheSggYnVmZmVyLCBvZmZzZXQgKSB7XHJcblxyXG5cdFx0Y29uc3QgZGVzdCA9IHRoaXMucmVzb2x2ZWRQcm9wZXJ0eTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIG4gPSBkZXN0Lmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcclxuXHJcblx0XHRcdGRlc3RbIGkgXSA9IGJ1ZmZlclsgb2Zmc2V0ICsrIF07XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdF9zZXRWYWx1ZV9hcnJheV9zZXROZWVkc1VwZGF0ZSggYnVmZmVyLCBvZmZzZXQgKSB7XHJcblxyXG5cdFx0Y29uc3QgZGVzdCA9IHRoaXMucmVzb2x2ZWRQcm9wZXJ0eTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIG4gPSBkZXN0Lmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcclxuXHJcblx0XHRcdGRlc3RbIGkgXSA9IGJ1ZmZlclsgb2Zmc2V0ICsrIF07XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHRfc2V0VmFsdWVfYXJyYXlfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSggYnVmZmVyLCBvZmZzZXQgKSB7XHJcblxyXG5cdFx0Y29uc3QgZGVzdCA9IHRoaXMucmVzb2x2ZWRQcm9wZXJ0eTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIG4gPSBkZXN0Lmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcclxuXHJcblx0XHRcdGRlc3RbIGkgXSA9IGJ1ZmZlclsgb2Zmc2V0ICsrIF07XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vIEFycmF5RWxlbWVudFxyXG5cclxuXHRfc2V0VmFsdWVfYXJyYXlFbGVtZW50KCBidWZmZXIsIG9mZnNldCApIHtcclxuXHJcblx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHlbIHRoaXMucHJvcGVydHlJbmRleCBdID0gYnVmZmVyWyBvZmZzZXQgXTtcclxuXHJcblx0fVxyXG5cclxuXHRfc2V0VmFsdWVfYXJyYXlFbGVtZW50X3NldE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHtcclxuXHJcblx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHlbIHRoaXMucHJvcGVydHlJbmRleCBdID0gYnVmZmVyWyBvZmZzZXQgXTtcclxuXHRcdHRoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHRfc2V0VmFsdWVfYXJyYXlFbGVtZW50X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkge1xyXG5cclxuXHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eVsgdGhpcy5wcm9wZXJ0eUluZGV4IF0gPSBidWZmZXJbIG9mZnNldCBdO1xyXG5cdFx0dGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gSGFzVG9Gcm9tQXJyYXlcclxuXHJcblx0X3NldFZhbHVlX2Zyb21BcnJheSggYnVmZmVyLCBvZmZzZXQgKSB7XHJcblxyXG5cdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5LmZyb21BcnJheSggYnVmZmVyLCBvZmZzZXQgKTtcclxuXHJcblx0fVxyXG5cclxuXHRfc2V0VmFsdWVfZnJvbUFycmF5X3NldE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHtcclxuXHJcblx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHkuZnJvbUFycmF5KCBidWZmZXIsIG9mZnNldCApO1xyXG5cdFx0dGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdF9zZXRWYWx1ZV9mcm9tQXJyYXlfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSggYnVmZmVyLCBvZmZzZXQgKSB7XHJcblxyXG5cdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5LmZyb21BcnJheSggYnVmZmVyLCBvZmZzZXQgKTtcclxuXHRcdHRoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdF9nZXRWYWx1ZV91bmJvdW5kKCB0YXJnZXRBcnJheSwgb2Zmc2V0ICkge1xyXG5cclxuXHRcdHRoaXMuYmluZCgpO1xyXG5cdFx0dGhpcy5nZXRWYWx1ZSggdGFyZ2V0QXJyYXksIG9mZnNldCApO1xyXG5cclxuXHR9XHJcblxyXG5cdF9zZXRWYWx1ZV91bmJvdW5kKCBzb3VyY2VBcnJheSwgb2Zmc2V0ICkge1xyXG5cclxuXHRcdHRoaXMuYmluZCgpO1xyXG5cdFx0dGhpcy5zZXRWYWx1ZSggc291cmNlQXJyYXksIG9mZnNldCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgYSBnZXR0ZXIgLyBzZXR0ZXIgcGFpciBmb3IgdGhlIHByb3BlcnR5IHRyYWNrZWQgYnkgdGhpcyBiaW5kaW5nLlxyXG5cdCAqL1xyXG5cdGJpbmQoKSB7XHJcblxyXG5cdFx0bGV0IHRhcmdldE9iamVjdCA9IHRoaXMubm9kZTtcclxuXHRcdGNvbnN0IHBhcnNlZFBhdGggPSB0aGlzLnBhcnNlZFBhdGg7XHJcblxyXG5cdFx0Y29uc3Qgb2JqZWN0TmFtZSA9IHBhcnNlZFBhdGgub2JqZWN0TmFtZTtcclxuXHRcdGNvbnN0IHByb3BlcnR5TmFtZSA9IHBhcnNlZFBhdGgucHJvcGVydHlOYW1lO1xyXG5cdFx0bGV0IHByb3BlcnR5SW5kZXggPSBwYXJzZWRQYXRoLnByb3BlcnR5SW5kZXg7XHJcblxyXG5cdFx0aWYgKCAhIHRhcmdldE9iamVjdCApIHtcclxuXHJcblx0XHRcdHRhcmdldE9iamVjdCA9IFByb3BlcnR5QmluZGluZy5maW5kTm9kZSggdGhpcy5yb290Tm9kZSwgcGFyc2VkUGF0aC5ub2RlTmFtZSApO1xyXG5cclxuXHRcdFx0dGhpcy5ub2RlID0gdGFyZ2V0T2JqZWN0O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBzZXQgZmFpbCBzdGF0ZSBzbyB3ZSBjYW4ganVzdCAncmV0dXJuJyBvbiBlcnJvclxyXG5cdFx0dGhpcy5nZXRWYWx1ZSA9IHRoaXMuX2dldFZhbHVlX3VuYXZhaWxhYmxlO1xyXG5cdFx0dGhpcy5zZXRWYWx1ZSA9IHRoaXMuX3NldFZhbHVlX3VuYXZhaWxhYmxlO1xyXG5cclxuXHRcdC8vIGVuc3VyZSB0aGVyZSBpcyBhIHZhbHVlIG5vZGVcclxuXHRcdGlmICggISB0YXJnZXRPYmplY3QgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IE5vIHRhcmdldCBub2RlIGZvdW5kIGZvciB0cmFjazogJyArIHRoaXMucGF0aCArICcuJyApO1xyXG5cdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggb2JqZWN0TmFtZSApIHtcclxuXHJcblx0XHRcdGxldCBvYmplY3RJbmRleCA9IHBhcnNlZFBhdGgub2JqZWN0SW5kZXg7XHJcblxyXG5cdFx0XHQvLyBzcGVjaWFsIGNhc2VzIHdlcmUgd2UgbmVlZCB0byByZWFjaCBkZWVwZXIgaW50byB0aGUgaGllcmFyY2h5IHRvIGdldCB0aGUgZmFjZSBtYXRlcmlhbHMuLi4uXHJcblx0XHRcdHN3aXRjaCAoIG9iamVjdE5hbWUgKSB7XHJcblxyXG5cdFx0XHRcdGNhc2UgJ21hdGVyaWFscyc6XHJcblxyXG5cdFx0XHRcdFx0aWYgKCAhIHRhcmdldE9iamVjdC5tYXRlcmlhbCApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtYXRlcmlhbCBhcyBub2RlIGRvZXMgbm90IGhhdmUgYSBtYXRlcmlhbC4nLCB0aGlzICk7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aWYgKCAhIHRhcmdldE9iamVjdC5tYXRlcmlhbC5tYXRlcmlhbHMgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbWF0ZXJpYWwubWF0ZXJpYWxzIGFzIG5vZGUubWF0ZXJpYWwgZG9lcyBub3QgaGF2ZSBhIG1hdGVyaWFscyBhcnJheS4nLCB0aGlzICk7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0dGFyZ2V0T2JqZWN0ID0gdGFyZ2V0T2JqZWN0Lm1hdGVyaWFsLm1hdGVyaWFscztcclxuXHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0Y2FzZSAnYm9uZXMnOlxyXG5cclxuXHRcdFx0XHRcdGlmICggISB0YXJnZXRPYmplY3Quc2tlbGV0b24gKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gYm9uZXMgYXMgbm9kZSBkb2VzIG5vdCBoYXZlIGEgc2tlbGV0b24uJywgdGhpcyApO1xyXG5cdFx0XHRcdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8vIHBvdGVudGlhbCBmdXR1cmUgb3B0aW1pemF0aW9uOiBza2lwIHRoaXMgaWYgcHJvcGVydHlJbmRleCBpcyBhbHJlYWR5IGFuIGludGVnZXJcclxuXHRcdFx0XHRcdC8vIGFuZCBjb252ZXJ0IHRoZSBpbnRlZ2VyIHN0cmluZyB0byBhIHRydWUgaW50ZWdlci5cclxuXHJcblx0XHRcdFx0XHR0YXJnZXRPYmplY3QgPSB0YXJnZXRPYmplY3Quc2tlbGV0b24uYm9uZXM7XHJcblxyXG5cdFx0XHRcdFx0Ly8gc3VwcG9ydCByZXNvbHZpbmcgbW9ycGhUYXJnZXQgbmFtZXMgaW50byBpbmRpY2VzLlxyXG5cdFx0XHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdGFyZ2V0T2JqZWN0Lmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggdGFyZ2V0T2JqZWN0WyBpIF0ubmFtZSA9PT0gb2JqZWN0SW5kZXggKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdG9iamVjdEluZGV4ID0gaTtcclxuXHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdGNhc2UgJ21hcCc6XHJcblxyXG5cdFx0XHRcdFx0aWYgKCAnbWFwJyBpbiB0YXJnZXRPYmplY3QgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHR0YXJnZXRPYmplY3QgPSB0YXJnZXRPYmplY3QubWFwO1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aWYgKCAhIHRhcmdldE9iamVjdC5tYXRlcmlhbCApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtYXRlcmlhbCBhcyBub2RlIGRvZXMgbm90IGhhdmUgYSBtYXRlcmlhbC4nLCB0aGlzICk7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aWYgKCAhIHRhcmdldE9iamVjdC5tYXRlcmlhbC5tYXAgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbWF0ZXJpYWwubWFwIGFzIG5vZGUubWF0ZXJpYWwgZG9lcyBub3QgaGF2ZSBhIG1hcC4nLCB0aGlzICk7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0dGFyZ2V0T2JqZWN0ID0gdGFyZ2V0T2JqZWN0Lm1hdGVyaWFsLm1hcDtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRkZWZhdWx0OlxyXG5cclxuXHRcdFx0XHRcdGlmICggdGFyZ2V0T2JqZWN0WyBvYmplY3ROYW1lIF0gPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBvYmplY3ROYW1lIG9mIG5vZGUgdW5kZWZpbmVkLicsIHRoaXMgKTtcclxuXHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR0YXJnZXRPYmplY3QgPSB0YXJnZXRPYmplY3RbIG9iamVjdE5hbWUgXTtcclxuXHJcblx0XHRcdH1cclxuXHJcblxyXG5cdFx0XHRpZiAoIG9iamVjdEluZGV4ICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggdGFyZ2V0T2JqZWN0WyBvYmplY3RJbmRleCBdID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogVHJ5aW5nIHRvIGJpbmQgdG8gb2JqZWN0SW5kZXggb2Ygb2JqZWN0TmFtZSwgYnV0IGlzIHVuZGVmaW5lZC4nLCB0aGlzLCB0YXJnZXRPYmplY3QgKTtcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR0YXJnZXRPYmplY3QgPSB0YXJnZXRPYmplY3RbIG9iamVjdEluZGV4IF07XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIHJlc29sdmUgcHJvcGVydHlcclxuXHRcdGNvbnN0IG5vZGVQcm9wZXJ0eSA9IHRhcmdldE9iamVjdFsgcHJvcGVydHlOYW1lIF07XHJcblxyXG5cdFx0aWYgKCBub2RlUHJvcGVydHkgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGNvbnN0IG5vZGVOYW1lID0gcGFyc2VkUGF0aC5ub2RlTmFtZTtcclxuXHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IFRyeWluZyB0byB1cGRhdGUgcHJvcGVydHkgZm9yIHRyYWNrOiAnICsgbm9kZU5hbWUgK1xyXG5cdFx0XHRcdCcuJyArIHByb3BlcnR5TmFtZSArICcgYnV0IGl0IHdhc25cXCd0IGZvdW5kLicsIHRhcmdldE9iamVjdCApO1xyXG5cdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGRldGVybWluZSB2ZXJzaW9uaW5nIHNjaGVtZVxyXG5cdFx0bGV0IHZlcnNpb25pbmcgPSB0aGlzLlZlcnNpb25pbmcuTm9uZTtcclxuXHJcblx0XHR0aGlzLnRhcmdldE9iamVjdCA9IHRhcmdldE9iamVjdDtcclxuXHJcblx0XHRpZiAoIHRhcmdldE9iamVjdC5pc01hdGVyaWFsID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0dmVyc2lvbmluZyA9IHRoaXMuVmVyc2lvbmluZy5OZWVkc1VwZGF0ZTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCB0YXJnZXRPYmplY3QuaXNPYmplY3QzRCA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdHZlcnNpb25pbmcgPSB0aGlzLlZlcnNpb25pbmcuTWF0cml4V29ybGROZWVkc1VwZGF0ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gZGV0ZXJtaW5lIGhvdyB0aGUgcHJvcGVydHkgZ2V0cyBib3VuZFxyXG5cdFx0bGV0IGJpbmRpbmdUeXBlID0gdGhpcy5CaW5kaW5nVHlwZS5EaXJlY3Q7XHJcblxyXG5cdFx0aWYgKCBwcm9wZXJ0eUluZGV4ICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHQvLyBhY2Nlc3MgYSBzdWIgZWxlbWVudCBvZiB0aGUgcHJvcGVydHkgYXJyYXkgKG9ubHkgcHJpbWl0aXZlcyBhcmUgc3VwcG9ydGVkIHJpZ2h0IG5vdylcclxuXHJcblx0XHRcdGlmICggcHJvcGVydHlOYW1lID09PSAnbW9ycGhUYXJnZXRJbmZsdWVuY2VzJyApIHtcclxuXHJcblx0XHRcdFx0Ly8gcG90ZW50aWFsIG9wdGltaXphdGlvbiwgc2tpcCB0aGlzIGlmIHByb3BlcnR5SW5kZXggaXMgYWxyZWFkeSBhbiBpbnRlZ2VyLCBhbmQgY29udmVydCB0aGUgaW50ZWdlciBzdHJpbmcgdG8gYSB0cnVlIGludGVnZXIuXHJcblxyXG5cdFx0XHRcdC8vIHN1cHBvcnQgcmVzb2x2aW5nIG1vcnBoVGFyZ2V0IG5hbWVzIGludG8gaW5kaWNlcy5cclxuXHRcdFx0XHRpZiAoICEgdGFyZ2V0T2JqZWN0Lmdlb21ldHJ5ICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtb3JwaFRhcmdldEluZmx1ZW5jZXMgYmVjYXVzZSBub2RlIGRvZXMgbm90IGhhdmUgYSBnZW9tZXRyeS4nLCB0aGlzICk7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKCAhIHRhcmdldE9iamVjdC5nZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1vcnBoVGFyZ2V0SW5mbHVlbmNlcyBiZWNhdXNlIG5vZGUgZG9lcyBub3QgaGF2ZSBhIGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy4nLCB0aGlzICk7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKCB0YXJnZXRPYmplY3QubW9ycGhUYXJnZXREaWN0aW9uYXJ5WyBwcm9wZXJ0eUluZGV4IF0gIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRwcm9wZXJ0eUluZGV4ID0gdGFyZ2V0T2JqZWN0Lm1vcnBoVGFyZ2V0RGljdGlvbmFyeVsgcHJvcGVydHlJbmRleCBdO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRiaW5kaW5nVHlwZSA9IHRoaXMuQmluZGluZ1R5cGUuQXJyYXlFbGVtZW50O1xyXG5cclxuXHRcdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5ID0gbm9kZVByb3BlcnR5O1xyXG5cdFx0XHR0aGlzLnByb3BlcnR5SW5kZXggPSBwcm9wZXJ0eUluZGV4O1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIG5vZGVQcm9wZXJ0eS5mcm9tQXJyYXkgIT09IHVuZGVmaW5lZCAmJiBub2RlUHJvcGVydHkudG9BcnJheSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Ly8gbXVzdCB1c2UgY29weSBmb3IgT2JqZWN0M0QuRXVsZXIvUXVhdGVybmlvblxyXG5cclxuXHRcdFx0YmluZGluZ1R5cGUgPSB0aGlzLkJpbmRpbmdUeXBlLkhhc0Zyb21Ub0FycmF5O1xyXG5cclxuXHRcdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5ID0gbm9kZVByb3BlcnR5O1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIEFycmF5LmlzQXJyYXkoIG5vZGVQcm9wZXJ0eSApICkge1xyXG5cclxuXHRcdFx0YmluZGluZ1R5cGUgPSB0aGlzLkJpbmRpbmdUeXBlLkVudGlyZUFycmF5O1xyXG5cclxuXHRcdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5ID0gbm9kZVByb3BlcnR5O1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR0aGlzLnByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gc2VsZWN0IGdldHRlciAvIHNldHRlclxyXG5cdFx0dGhpcy5nZXRWYWx1ZSA9IHRoaXMuR2V0dGVyQnlCaW5kaW5nVHlwZVsgYmluZGluZ1R5cGUgXTtcclxuXHRcdHRoaXMuc2V0VmFsdWUgPSB0aGlzLlNldHRlckJ5QmluZGluZ1R5cGVBbmRWZXJzaW9uaW5nWyBiaW5kaW5nVHlwZSBdWyB2ZXJzaW9uaW5nIF07XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVW5iaW5kcyB0aGUgcHJvcGVydHkuXHJcblx0ICovXHJcblx0dW5iaW5kKCkge1xyXG5cclxuXHRcdHRoaXMubm9kZSA9IG51bGw7XHJcblxyXG5cdFx0Ly8gYmFjayB0byB0aGUgcHJvdG90eXBlIHZlcnNpb24gb2YgZ2V0VmFsdWUgLyBzZXRWYWx1ZVxyXG5cdFx0Ly8gbm90ZTogYXZvaWRpbmcgdG8gbXV0YXRlIHRoZSBzaGFwZSBvZiAndGhpcycgdmlhICdkZWxldGUnXHJcblx0XHR0aGlzLmdldFZhbHVlID0gdGhpcy5fZ2V0VmFsdWVfdW5ib3VuZDtcclxuXHRcdHRoaXMuc2V0VmFsdWUgPSB0aGlzLl9zZXRWYWx1ZV91bmJvdW5kO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5Qcm9wZXJ0eUJpbmRpbmcuQ29tcG9zaXRlID0gQ29tcG9zaXRlO1xyXG5cclxuUHJvcGVydHlCaW5kaW5nLnByb3RvdHlwZS5CaW5kaW5nVHlwZSA9IHtcclxuXHREaXJlY3Q6IDAsXHJcblx0RW50aXJlQXJyYXk6IDEsXHJcblx0QXJyYXlFbGVtZW50OiAyLFxyXG5cdEhhc0Zyb21Ub0FycmF5OiAzXHJcbn07XHJcblxyXG5Qcm9wZXJ0eUJpbmRpbmcucHJvdG90eXBlLlZlcnNpb25pbmcgPSB7XHJcblx0Tm9uZTogMCxcclxuXHROZWVkc1VwZGF0ZTogMSxcclxuXHRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlOiAyXHJcbn07XHJcblxyXG5Qcm9wZXJ0eUJpbmRpbmcucHJvdG90eXBlLkdldHRlckJ5QmluZGluZ1R5cGUgPSBbXHJcblxyXG5cdFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUuX2dldFZhbHVlX2RpcmVjdCxcclxuXHRQcm9wZXJ0eUJpbmRpbmcucHJvdG90eXBlLl9nZXRWYWx1ZV9hcnJheSxcclxuXHRQcm9wZXJ0eUJpbmRpbmcucHJvdG90eXBlLl9nZXRWYWx1ZV9hcnJheUVsZW1lbnQsXHJcblx0UHJvcGVydHlCaW5kaW5nLnByb3RvdHlwZS5fZ2V0VmFsdWVfdG9BcnJheSxcclxuXHJcbl07XHJcblxyXG5Qcm9wZXJ0eUJpbmRpbmcucHJvdG90eXBlLlNldHRlckJ5QmluZGluZ1R5cGVBbmRWZXJzaW9uaW5nID0gW1xyXG5cclxuXHRbXHJcblx0XHQvLyBEaXJlY3RcclxuXHRcdFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUuX3NldFZhbHVlX2RpcmVjdCxcclxuXHRcdFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUuX3NldFZhbHVlX2RpcmVjdF9zZXROZWVkc1VwZGF0ZSxcclxuXHRcdFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUuX3NldFZhbHVlX2RpcmVjdF9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlLFxyXG5cclxuXHRdLCBbXHJcblxyXG5cdFx0Ly8gRW50aXJlQXJyYXlcclxuXHJcblx0XHRQcm9wZXJ0eUJpbmRpbmcucHJvdG90eXBlLl9zZXRWYWx1ZV9hcnJheSxcclxuXHRcdFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUuX3NldFZhbHVlX2FycmF5X3NldE5lZWRzVXBkYXRlLFxyXG5cdFx0UHJvcGVydHlCaW5kaW5nLnByb3RvdHlwZS5fc2V0VmFsdWVfYXJyYXlfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSxcclxuXHJcblx0XSwgW1xyXG5cclxuXHRcdC8vIEFycmF5RWxlbWVudFxyXG5cdFx0UHJvcGVydHlCaW5kaW5nLnByb3RvdHlwZS5fc2V0VmFsdWVfYXJyYXlFbGVtZW50LFxyXG5cdFx0UHJvcGVydHlCaW5kaW5nLnByb3RvdHlwZS5fc2V0VmFsdWVfYXJyYXlFbGVtZW50X3NldE5lZWRzVXBkYXRlLFxyXG5cdFx0UHJvcGVydHlCaW5kaW5nLnByb3RvdHlwZS5fc2V0VmFsdWVfYXJyYXlFbGVtZW50X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGUsXHJcblxyXG5cdF0sIFtcclxuXHJcblx0XHQvLyBIYXNUb0Zyb21BcnJheVxyXG5cdFx0UHJvcGVydHlCaW5kaW5nLnByb3RvdHlwZS5fc2V0VmFsdWVfZnJvbUFycmF5LFxyXG5cdFx0UHJvcGVydHlCaW5kaW5nLnByb3RvdHlwZS5fc2V0VmFsdWVfZnJvbUFycmF5X3NldE5lZWRzVXBkYXRlLFxyXG5cdFx0UHJvcGVydHlCaW5kaW5nLnByb3RvdHlwZS5fc2V0VmFsdWVfZnJvbUFycmF5X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGUsXHJcblxyXG5cdF1cclxuXHJcbl07XHJcblxyXG5cclxuZXhwb3J0IHsgUHJvcGVydHlCaW5kaW5nIH07XHJcbiIsImltcG9ydCB7IFByb3BlcnR5QmluZGluZyB9IGZyb20gJy4vUHJvcGVydHlCaW5kaW5nLmpzJztcclxuaW1wb3J0IHsgZ2VuZXJhdGVVVUlEIH0gZnJvbSAnLi4vbWF0aC9NYXRoVXRpbHMuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgZ3JvdXAgb2Ygb2JqZWN0cyB0aGF0IHJlY2VpdmVzIGEgc2hhcmVkIGFuaW1hdGlvbiBzdGF0ZS5cclxuICpcclxuICogVXNhZ2U6XHJcbiAqXHJcbiAqIC0gQWRkIG9iamVjdHMgeW91IHdvdWxkIG90aGVyd2lzZSBwYXNzIGFzICdyb290JyB0byB0aGVcclxuICogY29uc3RydWN0b3Igb3IgdGhlIC5jbGlwQWN0aW9uIG1ldGhvZCBvZiBBbmltYXRpb25NaXhlci5cclxuICogLSBJbnN0ZWFkIHBhc3MgdGhpcyBvYmplY3QgYXMgJ3Jvb3QnLlxyXG4gKiAtIFlvdSBjYW4gYWxzbyBhZGQgYW5kIHJlbW92ZSBvYmplY3RzIGxhdGVyIHdoZW4gdGhlIG1peGVyIGlzIHJ1bm5pbmcuXHJcbiAqXHJcbiAqIE5vdGU6XHJcbiAqXHJcbiAqIC0gT2JqZWN0cyBvZiB0aGlzIGNsYXNzIGFwcGVhciBhcyBvbmUgb2JqZWN0IHRvIHRoZSBtaXhlcixcclxuICogc28gY2FjaGUgY29udHJvbCBvZiB0aGUgaW5kaXZpZHVhbCBvYmplY3RzIG11c3QgYmUgZG9uZSBvbiB0aGUgZ3JvdXAuXHJcbiAqXHJcbiAqIExpbWl0YXRpb246XHJcbiAqXHJcbiAqIC0gVGhlIGFuaW1hdGVkIHByb3BlcnRpZXMgbXVzdCBiZSBjb21wYXRpYmxlIGFtb25nIHRoZSBhbGwgb2JqZWN0cyBpbiB0aGUgZ3JvdXAuXHJcbiAqIC0gQSBzaW5nbGUgcHJvcGVydHkgY2FuIGVpdGhlciBiZSBjb250cm9sbGVkIHRocm91Z2ggYSB0YXJnZXQgZ3JvdXAgb3IgZGlyZWN0bHksIGJ1dCBub3QgYm90aC5cclxuICovXHJcbmNsYXNzIEFuaW1hdGlvbk9iamVjdEdyb3VwIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBhbmltYXRpb24gZ3JvdXAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gey4uLk9iamVjdDNEfSBhcmd1bWVudHMgLSBBbiBhcmJpdHJhcnkgbnVtYmVyIG9mIDNEIG9iamVjdHMgdGhhdCBzaGFyZSB0aGUgc2FtZSBhbmltYXRpb24gc3RhdGUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzQW5pbWF0aW9uT2JqZWN0R3JvdXAgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIFVVSUQgb2YgdGhlIDNEIG9iamVjdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXVpZCA9IGdlbmVyYXRlVVVJRCgpO1xyXG5cclxuXHRcdC8vIGNhY2hlZCBvYmplY3RzIGZvbGxvd2VkIGJ5IHRoZSBhY3RpdmUgb25lc1xyXG5cdFx0dGhpcy5fb2JqZWN0cyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBhcmd1bWVudHMgKTtcclxuXHJcblx0XHR0aGlzLm5DYWNoZWRPYmplY3RzXyA9IDA7IC8vIHRocmVzaG9sZFxyXG5cdFx0Ly8gbm90ZTogcmVhZCBieSBQcm9wZXJ0eUJpbmRpbmcuQ29tcG9zaXRlXHJcblxyXG5cdFx0Y29uc3QgaW5kaWNlcyA9IHt9O1xyXG5cdFx0dGhpcy5faW5kaWNlc0J5VVVJRCA9IGluZGljZXM7IC8vIGZvciBib29ra2VlcGluZ1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XHJcblxyXG5cdFx0XHRpbmRpY2VzWyBhcmd1bWVudHNbIGkgXS51dWlkIF0gPSBpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLl9wYXRocyA9IFtdOyAvLyBpbnNpZGU6IHN0cmluZ1xyXG5cdFx0dGhpcy5fcGFyc2VkUGF0aHMgPSBbXTsgLy8gaW5zaWRlOiB7IHdlIGRvbid0IGNhcmUsIGhlcmUgfVxyXG5cdFx0dGhpcy5fYmluZGluZ3MgPSBbXTsgLy8gaW5zaWRlOiBBcnJheTwgUHJvcGVydHlCaW5kaW5nID5cclxuXHRcdHRoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aCA9IHt9OyAvLyBpbnNpZGU6IGluZGljZXMgaW4gdGhlc2UgYXJyYXlzXHJcblxyXG5cdFx0Y29uc3Qgc2NvcGUgPSB0aGlzO1xyXG5cclxuXHRcdHRoaXMuc3RhdHMgPSB7XHJcblxyXG5cdFx0XHRvYmplY3RzOiB7XHJcblx0XHRcdFx0Z2V0IHRvdGFsKCkge1xyXG5cclxuXHRcdFx0XHRcdHJldHVybiBzY29wZS5fb2JqZWN0cy5sZW5ndGg7XHJcblxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0Z2V0IGluVXNlKCkge1xyXG5cclxuXHRcdFx0XHRcdHJldHVybiB0aGlzLnRvdGFsIC0gc2NvcGUubkNhY2hlZE9iamVjdHNfO1xyXG5cclxuXHRcdFx0XHR9XHJcblx0XHRcdH0sXHJcblx0XHRcdGdldCBiaW5kaW5nc1Blck9iamVjdCgpIHtcclxuXHJcblx0XHRcdFx0cmV0dXJuIHNjb3BlLl9iaW5kaW5ncy5sZW5ndGg7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIGFuIGFyYml0cmFyeSBudW1iZXIgb2Ygb2JqZWN0cyB0byB0aGlzIGFuaW1hdGlvbiBncm91cC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Li4uT2JqZWN0M0R9IGFyZ3VtZW50cyAtIFRoZSAzRCBvYmplY3RzIHRvIGFkZC5cclxuXHQgKi9cclxuXHRhZGQoKSB7XHJcblxyXG5cdFx0Y29uc3Qgb2JqZWN0cyA9IHRoaXMuX29iamVjdHMsXHJcblx0XHRcdGluZGljZXNCeVVVSUQgPSB0aGlzLl9pbmRpY2VzQnlVVUlELFxyXG5cdFx0XHRwYXRocyA9IHRoaXMuX3BhdGhzLFxyXG5cdFx0XHRwYXJzZWRQYXRocyA9IHRoaXMuX3BhcnNlZFBhdGhzLFxyXG5cdFx0XHRiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxyXG5cdFx0XHRuQmluZGluZ3MgPSBiaW5kaW5ncy5sZW5ndGg7XHJcblxyXG5cdFx0bGV0IGtub3duT2JqZWN0ID0gdW5kZWZpbmVkLFxyXG5cdFx0XHRuT2JqZWN0cyA9IG9iamVjdHMubGVuZ3RoLFxyXG5cdFx0XHRuQ2FjaGVkT2JqZWN0cyA9IHRoaXMubkNhY2hlZE9iamVjdHNfO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBvYmplY3QgPSBhcmd1bWVudHNbIGkgXSxcclxuXHRcdFx0XHR1dWlkID0gb2JqZWN0LnV1aWQ7XHJcblx0XHRcdGxldCBpbmRleCA9IGluZGljZXNCeVVVSURbIHV1aWQgXTtcclxuXHJcblx0XHRcdGlmICggaW5kZXggPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0Ly8gdW5rbm93biBvYmplY3QgLT4gYWRkIGl0IHRvIHRoZSBBQ1RJVkUgcmVnaW9uXHJcblxyXG5cdFx0XHRcdGluZGV4ID0gbk9iamVjdHMgKys7XHJcblx0XHRcdFx0aW5kaWNlc0J5VVVJRFsgdXVpZCBdID0gaW5kZXg7XHJcblx0XHRcdFx0b2JqZWN0cy5wdXNoKCBvYmplY3QgKTtcclxuXHJcblx0XHRcdFx0Ly8gYWNjb3VudGluZyBpcyBkb25lLCBub3cgZG8gdGhlIHNhbWUgZm9yIGFsbCBiaW5kaW5nc1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaiA9IDAsIG0gPSBuQmluZGluZ3M7IGogIT09IG07ICsrIGogKSB7XHJcblxyXG5cdFx0XHRcdFx0YmluZGluZ3NbIGogXS5wdXNoKCBuZXcgUHJvcGVydHlCaW5kaW5nKCBvYmplY3QsIHBhdGhzWyBqIF0sIHBhcnNlZFBhdGhzWyBqIF0gKSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBpbmRleCA8IG5DYWNoZWRPYmplY3RzICkge1xyXG5cclxuXHRcdFx0XHRrbm93bk9iamVjdCA9IG9iamVjdHNbIGluZGV4IF07XHJcblxyXG5cdFx0XHRcdC8vIG1vdmUgZXhpc3Rpbmcgb2JqZWN0IHRvIHRoZSBBQ1RJVkUgcmVnaW9uXHJcblxyXG5cdFx0XHRcdGNvbnN0IGZpcnN0QWN0aXZlSW5kZXggPSAtLSBuQ2FjaGVkT2JqZWN0cyxcclxuXHRcdFx0XHRcdGxhc3RDYWNoZWRPYmplY3QgPSBvYmplY3RzWyBmaXJzdEFjdGl2ZUluZGV4IF07XHJcblxyXG5cdFx0XHRcdGluZGljZXNCeVVVSURbIGxhc3RDYWNoZWRPYmplY3QudXVpZCBdID0gaW5kZXg7XHJcblx0XHRcdFx0b2JqZWN0c1sgaW5kZXggXSA9IGxhc3RDYWNoZWRPYmplY3Q7XHJcblxyXG5cdFx0XHRcdGluZGljZXNCeVVVSURbIHV1aWQgXSA9IGZpcnN0QWN0aXZlSW5kZXg7XHJcblx0XHRcdFx0b2JqZWN0c1sgZmlyc3RBY3RpdmVJbmRleCBdID0gb2JqZWN0O1xyXG5cclxuXHRcdFx0XHQvLyBhY2NvdW50aW5nIGlzIGRvbmUsIG5vdyBkbyB0aGUgc2FtZSBmb3IgYWxsIGJpbmRpbmdzXHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBqID0gMCwgbSA9IG5CaW5kaW5nczsgaiAhPT0gbTsgKysgaiApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBiaW5kaW5nc0ZvclBhdGggPSBiaW5kaW5nc1sgaiBdLFxyXG5cdFx0XHRcdFx0XHRsYXN0Q2FjaGVkID0gYmluZGluZ3NGb3JQYXRoWyBmaXJzdEFjdGl2ZUluZGV4IF07XHJcblxyXG5cdFx0XHRcdFx0bGV0IGJpbmRpbmcgPSBiaW5kaW5nc0ZvclBhdGhbIGluZGV4IF07XHJcblxyXG5cdFx0XHRcdFx0YmluZGluZ3NGb3JQYXRoWyBpbmRleCBdID0gbGFzdENhY2hlZDtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGJpbmRpbmcgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRcdC8vIHNpbmNlIHdlIGRvIG5vdCBib3RoZXIgdG8gY3JlYXRlIG5ldyBiaW5kaW5nc1xyXG5cdFx0XHRcdFx0XHQvLyBmb3Igb2JqZWN0cyB0aGF0IGFyZSBjYWNoZWQsIHRoZSBiaW5kaW5nIG1heVxyXG5cdFx0XHRcdFx0XHQvLyBvciBtYXkgbm90IGV4aXN0XHJcblxyXG5cdFx0XHRcdFx0XHRiaW5kaW5nID0gbmV3IFByb3BlcnR5QmluZGluZyggb2JqZWN0LCBwYXRoc1sgaiBdLCBwYXJzZWRQYXRoc1sgaiBdICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgZmlyc3RBY3RpdmVJbmRleCBdID0gYmluZGluZztcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggb2JqZWN0c1sgaW5kZXggXSAhPT0ga25vd25PYmplY3QgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5BbmltYXRpb25PYmplY3RHcm91cDogRGlmZmVyZW50IG9iamVjdHMgd2l0aCB0aGUgc2FtZSBVVUlEICcgK1xyXG5cdFx0XHRcdFx0J2RldGVjdGVkLiBDbGVhbiB0aGUgY2FjaGVzIG9yIHJlY3JlYXRlIHlvdXIgaW5mcmFzdHJ1Y3R1cmUgd2hlbiByZWxvYWRpbmcgc2NlbmVzLicgKTtcclxuXHJcblx0XHRcdH0gLy8gZWxzZSB0aGUgb2JqZWN0IGlzIGFscmVhZHkgd2hlcmUgd2Ugd2FudCBpdCB0byBiZVxyXG5cclxuXHRcdH0gLy8gZm9yIGFyZ3VtZW50c1xyXG5cclxuXHRcdHRoaXMubkNhY2hlZE9iamVjdHNfID0gbkNhY2hlZE9iamVjdHM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVtb3ZlcyBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIG9iamVjdHMgdG8gdGhpcyBhbmltYXRpb24gZ3JvdXBcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Li4uT2JqZWN0M0R9IGFyZ3VtZW50cyAtIFRoZSAzRCBvYmplY3RzIHRvIHJlbW92ZS5cclxuXHQgKi9cclxuXHRyZW1vdmUoKSB7XHJcblxyXG5cdFx0Y29uc3Qgb2JqZWN0cyA9IHRoaXMuX29iamVjdHMsXHJcblx0XHRcdGluZGljZXNCeVVVSUQgPSB0aGlzLl9pbmRpY2VzQnlVVUlELFxyXG5cdFx0XHRiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxyXG5cdFx0XHRuQmluZGluZ3MgPSBiaW5kaW5ncy5sZW5ndGg7XHJcblxyXG5cdFx0bGV0IG5DYWNoZWRPYmplY3RzID0gdGhpcy5uQ2FjaGVkT2JqZWN0c187XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcclxuXHJcblx0XHRcdGNvbnN0IG9iamVjdCA9IGFyZ3VtZW50c1sgaSBdLFxyXG5cdFx0XHRcdHV1aWQgPSBvYmplY3QudXVpZCxcclxuXHRcdFx0XHRpbmRleCA9IGluZGljZXNCeVVVSURbIHV1aWQgXTtcclxuXHJcblx0XHRcdGlmICggaW5kZXggIT09IHVuZGVmaW5lZCAmJiBpbmRleCA+PSBuQ2FjaGVkT2JqZWN0cyApIHtcclxuXHJcblx0XHRcdFx0Ly8gbW92ZSBleGlzdGluZyBvYmplY3QgaW50byB0aGUgQ0FDSEVEIHJlZ2lvblxyXG5cclxuXHRcdFx0XHRjb25zdCBsYXN0Q2FjaGVkSW5kZXggPSBuQ2FjaGVkT2JqZWN0cyArKyxcclxuXHRcdFx0XHRcdGZpcnN0QWN0aXZlT2JqZWN0ID0gb2JqZWN0c1sgbGFzdENhY2hlZEluZGV4IF07XHJcblxyXG5cdFx0XHRcdGluZGljZXNCeVVVSURbIGZpcnN0QWN0aXZlT2JqZWN0LnV1aWQgXSA9IGluZGV4O1xyXG5cdFx0XHRcdG9iamVjdHNbIGluZGV4IF0gPSBmaXJzdEFjdGl2ZU9iamVjdDtcclxuXHJcblx0XHRcdFx0aW5kaWNlc0J5VVVJRFsgdXVpZCBdID0gbGFzdENhY2hlZEluZGV4O1xyXG5cdFx0XHRcdG9iamVjdHNbIGxhc3RDYWNoZWRJbmRleCBdID0gb2JqZWN0O1xyXG5cclxuXHRcdFx0XHQvLyBhY2NvdW50aW5nIGlzIGRvbmUsIG5vdyBkbyB0aGUgc2FtZSBmb3IgYWxsIGJpbmRpbmdzXHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBqID0gMCwgbSA9IG5CaW5kaW5nczsgaiAhPT0gbTsgKysgaiApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBiaW5kaW5nc0ZvclBhdGggPSBiaW5kaW5nc1sgaiBdLFxyXG5cdFx0XHRcdFx0XHRmaXJzdEFjdGl2ZSA9IGJpbmRpbmdzRm9yUGF0aFsgbGFzdENhY2hlZEluZGV4IF0sXHJcblx0XHRcdFx0XHRcdGJpbmRpbmcgPSBiaW5kaW5nc0ZvclBhdGhbIGluZGV4IF07XHJcblxyXG5cdFx0XHRcdFx0YmluZGluZ3NGb3JQYXRoWyBpbmRleCBdID0gZmlyc3RBY3RpdmU7XHJcblx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGhbIGxhc3RDYWNoZWRJbmRleCBdID0gYmluZGluZztcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gLy8gZm9yIGFyZ3VtZW50c1xyXG5cclxuXHRcdHRoaXMubkNhY2hlZE9iamVjdHNfID0gbkNhY2hlZE9iamVjdHM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVhbGxvY2F0ZXMgYWxsIG1lbW9yeSByZXNvdXJjZXMgZm9yIHRoZSBwYXNzZWQgM0Qgb2JqZWN0cyBvZiB0aGlzIGFuaW1hdGlvbiBncm91cC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Li4uT2JqZWN0M0R9IGFyZ3VtZW50cyAtIFRoZSAzRCBvYmplY3RzIHRvIHVuY2FjaGUuXHJcblx0ICovXHJcblx0dW5jYWNoZSgpIHtcclxuXHJcblx0XHRjb25zdCBvYmplY3RzID0gdGhpcy5fb2JqZWN0cyxcclxuXHRcdFx0aW5kaWNlc0J5VVVJRCA9IHRoaXMuX2luZGljZXNCeVVVSUQsXHJcblx0XHRcdGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsXHJcblx0XHRcdG5CaW5kaW5ncyA9IGJpbmRpbmdzLmxlbmd0aDtcclxuXHJcblx0XHRsZXQgbkNhY2hlZE9iamVjdHMgPSB0aGlzLm5DYWNoZWRPYmplY3RzXyxcclxuXHRcdFx0bk9iamVjdHMgPSBvYmplY3RzLmxlbmd0aDtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgb2JqZWN0ID0gYXJndW1lbnRzWyBpIF0sXHJcblx0XHRcdFx0dXVpZCA9IG9iamVjdC51dWlkLFxyXG5cdFx0XHRcdGluZGV4ID0gaW5kaWNlc0J5VVVJRFsgdXVpZCBdO1xyXG5cclxuXHRcdFx0aWYgKCBpbmRleCAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRkZWxldGUgaW5kaWNlc0J5VVVJRFsgdXVpZCBdO1xyXG5cclxuXHRcdFx0XHRpZiAoIGluZGV4IDwgbkNhY2hlZE9iamVjdHMgKSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gb2JqZWN0IGlzIGNhY2hlZCwgc2hyaW5rIHRoZSBDQUNIRUQgcmVnaW9uXHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgZmlyc3RBY3RpdmVJbmRleCA9IC0tIG5DYWNoZWRPYmplY3RzLFxyXG5cdFx0XHRcdFx0XHRsYXN0Q2FjaGVkT2JqZWN0ID0gb2JqZWN0c1sgZmlyc3RBY3RpdmVJbmRleCBdLFxyXG5cdFx0XHRcdFx0XHRsYXN0SW5kZXggPSAtLSBuT2JqZWN0cyxcclxuXHRcdFx0XHRcdFx0bGFzdE9iamVjdCA9IG9iamVjdHNbIGxhc3RJbmRleCBdO1xyXG5cclxuXHRcdFx0XHRcdC8vIGxhc3QgY2FjaGVkIG9iamVjdCB0YWtlcyB0aGlzIG9iamVjdCdzIHBsYWNlXHJcblx0XHRcdFx0XHRpbmRpY2VzQnlVVUlEWyBsYXN0Q2FjaGVkT2JqZWN0LnV1aWQgXSA9IGluZGV4O1xyXG5cdFx0XHRcdFx0b2JqZWN0c1sgaW5kZXggXSA9IGxhc3RDYWNoZWRPYmplY3Q7XHJcblxyXG5cdFx0XHRcdFx0Ly8gbGFzdCBvYmplY3QgZ29lcyB0byB0aGUgYWN0aXZhdGVkIHNsb3QgYW5kIHBvcFxyXG5cdFx0XHRcdFx0aW5kaWNlc0J5VVVJRFsgbGFzdE9iamVjdC51dWlkIF0gPSBmaXJzdEFjdGl2ZUluZGV4O1xyXG5cdFx0XHRcdFx0b2JqZWN0c1sgZmlyc3RBY3RpdmVJbmRleCBdID0gbGFzdE9iamVjdDtcclxuXHRcdFx0XHRcdG9iamVjdHMucG9wKCk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gYWNjb3VudGluZyBpcyBkb25lLCBub3cgZG8gdGhlIHNhbWUgZm9yIGFsbCBiaW5kaW5nc1xyXG5cclxuXHRcdFx0XHRcdGZvciAoIGxldCBqID0gMCwgbSA9IG5CaW5kaW5nczsgaiAhPT0gbTsgKysgaiApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnN0IGJpbmRpbmdzRm9yUGF0aCA9IGJpbmRpbmdzWyBqIF0sXHJcblx0XHRcdFx0XHRcdFx0bGFzdENhY2hlZCA9IGJpbmRpbmdzRm9yUGF0aFsgZmlyc3RBY3RpdmVJbmRleCBdLFxyXG5cdFx0XHRcdFx0XHRcdGxhc3QgPSBiaW5kaW5nc0ZvclBhdGhbIGxhc3RJbmRleCBdO1xyXG5cclxuXHRcdFx0XHRcdFx0YmluZGluZ3NGb3JQYXRoWyBpbmRleCBdID0gbGFzdENhY2hlZDtcclxuXHRcdFx0XHRcdFx0YmluZGluZ3NGb3JQYXRoWyBmaXJzdEFjdGl2ZUluZGV4IF0gPSBsYXN0O1xyXG5cdFx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGgucG9wKCk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdC8vIG9iamVjdCBpcyBhY3RpdmUsIGp1c3Qgc3dhcCB3aXRoIHRoZSBsYXN0IGFuZCBwb3BcclxuXHJcblx0XHRcdFx0XHRjb25zdCBsYXN0SW5kZXggPSAtLSBuT2JqZWN0cyxcclxuXHRcdFx0XHRcdFx0bGFzdE9iamVjdCA9IG9iamVjdHNbIGxhc3RJbmRleCBdO1xyXG5cclxuXHRcdFx0XHRcdGlmICggbGFzdEluZGV4ID4gMCApIHtcclxuXHJcblx0XHRcdFx0XHRcdGluZGljZXNCeVVVSURbIGxhc3RPYmplY3QudXVpZCBdID0gaW5kZXg7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdG9iamVjdHNbIGluZGV4IF0gPSBsYXN0T2JqZWN0O1xyXG5cdFx0XHRcdFx0b2JqZWN0cy5wb3AoKTtcclxuXHJcblx0XHRcdFx0XHQvLyBhY2NvdW50aW5nIGlzIGRvbmUsIG5vdyBkbyB0aGUgc2FtZSBmb3IgYWxsIGJpbmRpbmdzXHJcblxyXG5cdFx0XHRcdFx0Zm9yICggbGV0IGogPSAwLCBtID0gbkJpbmRpbmdzOyBqICE9PSBtOyArKyBqICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgYmluZGluZ3NGb3JQYXRoID0gYmluZGluZ3NbIGogXTtcclxuXHJcblx0XHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXSA9IGJpbmRpbmdzRm9yUGF0aFsgbGFzdEluZGV4IF07XHJcblx0XHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aC5wb3AoKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH0gLy8gY2FjaGVkIG9yIGFjdGl2ZVxyXG5cclxuXHRcdFx0fSAvLyBpZiBvYmplY3QgaXMga25vd25cclxuXHJcblx0XHR9IC8vIGZvciBhcmd1bWVudHNcclxuXHJcblx0XHR0aGlzLm5DYWNoZWRPYmplY3RzXyA9IG5DYWNoZWRPYmplY3RzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vIEludGVybmFsIGludGVyZmFjZSB1c2VkIGJ5IGJlZnJpZW5kZWQgUHJvcGVydHlCaW5kaW5nLkNvbXBvc2l0ZTpcclxuXHJcblx0c3Vic2NyaWJlXyggcGF0aCwgcGFyc2VkUGF0aCApIHtcclxuXHJcblx0XHQvLyByZXR1cm5zIGFuIGFycmF5IG9mIGJpbmRpbmdzIGZvciB0aGUgZ2l2ZW4gcGF0aCB0aGF0IGlzIGNoYW5nZWRcclxuXHRcdC8vIGFjY29yZGluZyB0byB0aGUgY29udGFpbmVkIG9iamVjdHMgaW4gdGhlIGdyb3VwXHJcblxyXG5cdFx0Y29uc3QgaW5kaWNlc0J5UGF0aCA9IHRoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aDtcclxuXHRcdGxldCBpbmRleCA9IGluZGljZXNCeVBhdGhbIHBhdGggXTtcclxuXHRcdGNvbnN0IGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3M7XHJcblxyXG5cdFx0aWYgKCBpbmRleCAhPT0gdW5kZWZpbmVkICkgcmV0dXJuIGJpbmRpbmdzWyBpbmRleCBdO1xyXG5cclxuXHRcdGNvbnN0IHBhdGhzID0gdGhpcy5fcGF0aHMsXHJcblx0XHRcdHBhcnNlZFBhdGhzID0gdGhpcy5fcGFyc2VkUGF0aHMsXHJcblx0XHRcdG9iamVjdHMgPSB0aGlzLl9vYmplY3RzLFxyXG5cdFx0XHRuT2JqZWN0cyA9IG9iamVjdHMubGVuZ3RoLFxyXG5cdFx0XHRuQ2FjaGVkT2JqZWN0cyA9IHRoaXMubkNhY2hlZE9iamVjdHNfLFxyXG5cdFx0XHRiaW5kaW5nc0ZvclBhdGggPSBuZXcgQXJyYXkoIG5PYmplY3RzICk7XHJcblxyXG5cdFx0aW5kZXggPSBiaW5kaW5ncy5sZW5ndGg7XHJcblxyXG5cdFx0aW5kaWNlc0J5UGF0aFsgcGF0aCBdID0gaW5kZXg7XHJcblxyXG5cdFx0cGF0aHMucHVzaCggcGF0aCApO1xyXG5cdFx0cGFyc2VkUGF0aHMucHVzaCggcGFyc2VkUGF0aCApO1xyXG5cdFx0YmluZGluZ3MucHVzaCggYmluZGluZ3NGb3JQYXRoICk7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSBuQ2FjaGVkT2JqZWN0cywgbiA9IG9iamVjdHMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgb2JqZWN0ID0gb2JqZWN0c1sgaSBdO1xyXG5cdFx0XHRiaW5kaW5nc0ZvclBhdGhbIGkgXSA9IG5ldyBQcm9wZXJ0eUJpbmRpbmcoIG9iamVjdCwgcGF0aCwgcGFyc2VkUGF0aCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gYmluZGluZ3NGb3JQYXRoO1xyXG5cclxuXHR9XHJcblxyXG5cdHVuc3Vic2NyaWJlXyggcGF0aCApIHtcclxuXHJcblx0XHQvLyB0ZWxscyB0aGUgZ3JvdXAgdG8gZm9yZ2V0IGFib3V0IGEgcHJvcGVydHkgcGF0aCBhbmQgbm8gbG9uZ2VyXHJcblx0XHQvLyB1cGRhdGUgdGhlIGFycmF5IHByZXZpb3VzbHkgb2J0YWluZWQgd2l0aCAnc3Vic2NyaWJlXydcclxuXHJcblx0XHRjb25zdCBpbmRpY2VzQnlQYXRoID0gdGhpcy5fYmluZGluZ3NJbmRpY2VzQnlQYXRoLFxyXG5cdFx0XHRpbmRleCA9IGluZGljZXNCeVBhdGhbIHBhdGggXTtcclxuXHJcblx0XHRpZiAoIGluZGV4ICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBwYXRocyA9IHRoaXMuX3BhdGhzLFxyXG5cdFx0XHRcdHBhcnNlZFBhdGhzID0gdGhpcy5fcGFyc2VkUGF0aHMsXHJcblx0XHRcdFx0YmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncyxcclxuXHRcdFx0XHRsYXN0QmluZGluZ3NJbmRleCA9IGJpbmRpbmdzLmxlbmd0aCAtIDEsXHJcblx0XHRcdFx0bGFzdEJpbmRpbmdzID0gYmluZGluZ3NbIGxhc3RCaW5kaW5nc0luZGV4IF0sXHJcblx0XHRcdFx0bGFzdEJpbmRpbmdzUGF0aCA9IHBhdGhbIGxhc3RCaW5kaW5nc0luZGV4IF07XHJcblxyXG5cdFx0XHRpbmRpY2VzQnlQYXRoWyBsYXN0QmluZGluZ3NQYXRoIF0gPSBpbmRleDtcclxuXHJcblx0XHRcdGJpbmRpbmdzWyBpbmRleCBdID0gbGFzdEJpbmRpbmdzO1xyXG5cdFx0XHRiaW5kaW5ncy5wb3AoKTtcclxuXHJcblx0XHRcdHBhcnNlZFBhdGhzWyBpbmRleCBdID0gcGFyc2VkUGF0aHNbIGxhc3RCaW5kaW5nc0luZGV4IF07XHJcblx0XHRcdHBhcnNlZFBhdGhzLnBvcCgpO1xyXG5cclxuXHRcdFx0cGF0aHNbIGluZGV4IF0gPSBwYXRoc1sgbGFzdEJpbmRpbmdzSW5kZXggXTtcclxuXHRcdFx0cGF0aHMucG9wKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBBbmltYXRpb25PYmplY3RHcm91cCB9O1xyXG4iLCJpbXBvcnQgeyBXcmFwQXJvdW5kRW5kaW5nLCBaZXJvQ3VydmF0dXJlRW5kaW5nLCBaZXJvU2xvcGVFbmRpbmcsIExvb3BQaW5nUG9uZywgTG9vcE9uY2UsIExvb3BSZXBlYXQsIE5vcm1hbEFuaW1hdGlvbkJsZW5kTW9kZSwgQWRkaXRpdmVBbmltYXRpb25CbGVuZE1vZGUgfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xyXG5cclxuLyoqXHJcbiAqIEFuIGluc3RhbmNlIG9mIGBBbmltYXRpb25BY3Rpb25gIHNjaGVkdWxlcyB0aGUgcGxheWJhY2sgb2YgYW4gYW5pbWF0aW9uIHdoaWNoIGlzXHJcbiAqIHN0b3JlZCBpbiB7QGxpbmsgQW5pbWF0aW9uQ2xpcH0uXHJcbiAqL1xyXG5jbGFzcyBBbmltYXRpb25BY3Rpb24ge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGFuaW1hdGlvbiBhY3Rpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FuaW1hdGlvbk1peGVyfSBtaXhlciAtIFRoZSBtaXhlciB0aGF0IGlzIGNvbnRyb2xsZWQgYnkgdGhpcyBhY3Rpb24uXHJcblx0ICogQHBhcmFtIHtBbmltYXRpb25DbGlwfSBjbGlwIC0gVGhlIGFuaW1hdGlvbiBjbGlwIHRoYXQgaG9sZHMgdGhlIGFjdHVhbCBrZXlmcmFtZXMuXHJcblx0ICogQHBhcmFtIHs/T2JqZWN0M0R9IFtsb2NhbFJvb3Q9bnVsbF0gLSBUaGUgcm9vdCBvYmplY3Qgb24gd2hpY2ggdGhpcyBhY3Rpb24gaXMgcGVyZm9ybWVkLlxyXG5cdCAqIEBwYXJhbSB7KE5vcm1hbEFuaW1hdGlvbkJsZW5kTW9kZXxBZGRpdGl2ZUFuaW1hdGlvbkJsZW5kTW9kZSl9IFtibGVuZE1vZGVdIC0gVGhlIGJsZW5kIG1vZGUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG1peGVyLCBjbGlwLCBsb2NhbFJvb3QgPSBudWxsLCBibGVuZE1vZGUgPSBjbGlwLmJsZW5kTW9kZSApIHtcclxuXHJcblx0XHR0aGlzLl9taXhlciA9IG1peGVyO1xyXG5cdFx0dGhpcy5fY2xpcCA9IGNsaXA7XHJcblx0XHR0aGlzLl9sb2NhbFJvb3QgPSBsb2NhbFJvb3Q7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIGhvdyB0aGUgYW5pbWF0aW9uIGlzIGJsZW5kZWQvY29tYmluZWQgd2hlbiB0d28gb3IgbW9yZSBhbmltYXRpb25zXHJcblx0XHQgKiBhcmUgc2ltdWx0YW5lb3VzbHkgcGxheWVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoTm9ybWFsQW5pbWF0aW9uQmxlbmRNb2RlfEFkZGl0aXZlQW5pbWF0aW9uQmxlbmRNb2RlKX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ibGVuZE1vZGUgPSBibGVuZE1vZGU7XHJcblxyXG5cdFx0Y29uc3QgdHJhY2tzID0gY2xpcC50cmFja3MsXHJcblx0XHRcdG5UcmFja3MgPSB0cmFja3MubGVuZ3RoLFxyXG5cdFx0XHRpbnRlcnBvbGFudHMgPSBuZXcgQXJyYXkoIG5UcmFja3MgKTtcclxuXHJcblx0XHRjb25zdCBpbnRlcnBvbGFudFNldHRpbmdzID0ge1xyXG5cdFx0XHRlbmRpbmdTdGFydDogWmVyb0N1cnZhdHVyZUVuZGluZyxcclxuXHRcdFx0ZW5kaW5nRW5kOiBaZXJvQ3VydmF0dXJlRW5kaW5nXHJcblx0XHR9O1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSAhPT0gblRyYWNrczsgKysgaSApIHtcclxuXHJcblx0XHRcdGNvbnN0IGludGVycG9sYW50ID0gdHJhY2tzWyBpIF0uY3JlYXRlSW50ZXJwb2xhbnQoIG51bGwgKTtcclxuXHRcdFx0aW50ZXJwb2xhbnRzWyBpIF0gPSBpbnRlcnBvbGFudDtcclxuXHRcdFx0aW50ZXJwb2xhbnQuc2V0dGluZ3MgPSBpbnRlcnBvbGFudFNldHRpbmdzO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLl9pbnRlcnBvbGFudFNldHRpbmdzID0gaW50ZXJwb2xhbnRTZXR0aW5ncztcclxuXHJcblx0XHR0aGlzLl9pbnRlcnBvbGFudHMgPSBpbnRlcnBvbGFudHM7IC8vIGJvdW5kIGJ5IHRoZSBtaXhlclxyXG5cclxuXHRcdC8vIGluc2lkZTogUHJvcGVydHlNaXhlciAobWFuYWdlZCBieSB0aGUgbWl4ZXIpXHJcblx0XHR0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzID0gbmV3IEFycmF5KCBuVHJhY2tzICk7XHJcblxyXG5cdFx0dGhpcy5fY2FjaGVJbmRleCA9IG51bGw7IC8vIGZvciB0aGUgbWVtb3J5IG1hbmFnZXJcclxuXHRcdHRoaXMuX2J5Q2xpcENhY2hlSW5kZXggPSBudWxsOyAvLyBmb3IgdGhlIG1lbW9yeSBtYW5hZ2VyXHJcblxyXG5cdFx0dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQgPSBudWxsO1xyXG5cdFx0dGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGxvb3AgbW9kZSwgc2V0IHZpYSB7QGxpbmsgQW5pbWF0aW9uQWN0aW9uI3NldExvb3B9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoTG9vcFJlcGVhdHxMb29wT25jZXxMb29wUGluZ1BvbmcpfVxyXG5cdFx0ICogQGRlZmF1bHQgTG9vcFJlcGVhdFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxvb3AgPSBMb29wUmVwZWF0O1xyXG5cdFx0dGhpcy5fbG9vcENvdW50ID0gLSAxO1xyXG5cclxuXHRcdC8vIGdsb2JhbCBtaXhlciB0aW1lIHdoZW4gdGhlIGFjdGlvbiBpcyB0byBiZSBzdGFydGVkXHJcblx0XHQvLyBpdCdzIHNldCBiYWNrIHRvICdudWxsJyB1cG9uIHN0YXJ0IG9mIHRoZSBhY3Rpb25cclxuXHRcdHRoaXMuX3N0YXJ0VGltZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbG9jYWwgdGltZSBvZiB0aGlzIGFjdGlvbiAoaW4gc2Vjb25kcywgc3RhcnRpbmcgd2l0aCBgMGApLlxyXG5cdFx0ICpcclxuXHRcdCAqIFRoZSB2YWx1ZSBnZXRzIGNsYW1wZWQgb3Igd3JhcHBlZCB0byBgWzAsY2xpcC5kdXJhdGlvbl1gIChhY2NvcmRpbmcgdG8gdGhlXHJcblx0XHQgKiBsb29wIHN0YXRlKS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgSW5maW5pdHlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50aW1lID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNjYWxpbmcgZmFjdG9yIGZvciB0aGUge0BsaW5rIEFuaW1hdGlvbkFjdGlvbiN0aW1lfS4gQSB2YWx1ZSBvZiBgMGAgY2F1c2VzIHRoZVxyXG5cdFx0ICogYW5pbWF0aW9uIHRvIHBhdXNlLiBOZWdhdGl2ZSB2YWx1ZXMgY2F1c2UgdGhlIGFuaW1hdGlvbiB0byBwbGF5IGJhY2t3YXJkcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRpbWVTY2FsZSA9IDE7XHJcblx0XHR0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGUgPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGRlZ3JlZSBvZiBpbmZsdWVuY2Ugb2YgdGhpcyBhY3Rpb24gKGluIHRoZSBpbnRlcnZhbCBgWzAsIDFdYCkuIFZhbHVlc1xyXG5cdFx0ICogYmV0d2VlbiBgMGAgKG5vIGltcGFjdCkgYW5kIGAxYCAoZnVsbCBpbXBhY3QpIGNhbiBiZSB1c2VkIHRvIGJsZW5kIGJldHdlZW5cclxuXHRcdCAqIHNldmVyYWwgYWN0aW9ucy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLndlaWdodCA9IDE7XHJcblx0XHR0aGlzLl9lZmZlY3RpdmVXZWlnaHQgPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG51bWJlciBvZiByZXBldGl0aW9ucyBvZiB0aGUgcGVyZm9ybWVkIGNsaXAgb3ZlciB0aGUgY291cnNlIG9mIHRoaXMgYWN0aW9uLlxyXG5cdFx0ICogQ2FuIGJlIHNldCB2aWEge0BsaW5rIEFuaW1hdGlvbkFjdGlvbiNzZXRMb29wfS5cclxuXHRcdCAqXHJcblx0XHQgKiBTZXR0aW5nIHRoaXMgbnVtYmVyIGhhcyBubyBlZmZlY3QgaWYge0BsaW5rIEFuaW1hdGlvbkFjdGlvbiNsb29wfSBpcyBzZXQgdG9cclxuXHRcdCAqIGBUSFJFRTpMb29wT25jZWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IEluZmluaXR5XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVwZXRpdGlvbnMgPSBJbmZpbml0eTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIElmIHNldCB0byBgdHJ1ZWAsIHRoZSBwbGF5YmFjayBvZiB0aGUgYWN0aW9uIGlzIHBhdXNlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucGF1c2VkID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBJZiBzZXQgdG8gYGZhbHNlYCwgdGhlIGFjdGlvbiBpcyBkaXNhYmxlZCBzbyBpdCBoYXMgbm8gaW1wYWN0LlxyXG5cdFx0ICpcclxuXHRcdCAqIFdoZW4gdGhlIGFjdGlvbiBpcyByZS1lbmFibGVkLCB0aGUgYW5pbWF0aW9uIGNvbnRpbnVlcyBmcm9tIGl0cyBjdXJyZW50XHJcblx0XHQgKiB0aW1lIChzZXR0aW5nIGBlbmFibGVkYCB0byBgZmFsc2VgIGRvZXNuJ3QgcmVzZXQgdGhlIGFjdGlvbikuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZW5hYmxlZCA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBJZiBzZXQgdG8gdHJ1ZSB0aGUgYW5pbWF0aW9uIHdpbGwgYXV0b21hdGljYWxseSBiZSBwYXVzZWQgb24gaXRzIGxhc3QgZnJhbWUuXHJcblx0XHQgKlxyXG5cdFx0ICogSWYgc2V0IHRvIGZhbHNlLCB7QGxpbmsgQW5pbWF0aW9uQWN0aW9uI2VuYWJsZWR9IHdpbGwgYXV0b21hdGljYWxseSBiZSBzd2l0Y2hlZFxyXG5cdFx0ICogdG8gYGZhbHNlYCB3aGVuIHRoZSBsYXN0IGxvb3Agb2YgdGhlIGFjdGlvbiBoYXMgZmluaXNoZWQsIHNvIHRoYXQgdGhpcyBhY3Rpb24gaGFzXHJcblx0XHQgKiBubyBmdXJ0aGVyIGltcGFjdC5cclxuXHRcdCAqXHJcblx0XHQgKiBOb3RlOiBUaGlzIG1lbWJlciBoYXMgbm8gaW1wYWN0IGlmIHRoZSBhY3Rpb24gaXMgaW50ZXJydXB0ZWQgKGl0XHJcblx0XHQgKiBoYXMgb25seSBhbiBlZmZlY3QgaWYgaXRzIGxhc3QgbG9vcCBoYXMgcmVhbGx5IGZpbmlzaGVkKS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2xhbXBXaGVuRmluaXNoZWQgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEVuYWJsZXMgc21vb3RoIGludGVycG9sYXRpb24gd2l0aG91dCBzZXBhcmF0ZSBjbGlwcyBmb3Igc3RhcnQsIGxvb3AgYW5kIGVuZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy56ZXJvU2xvcGVBdFN0YXJ0ID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEVuYWJsZXMgc21vb3RoIGludGVycG9sYXRpb24gd2l0aG91dCBzZXBhcmF0ZSBjbGlwcyBmb3Igc3RhcnQsIGxvb3AgYW5kIGVuZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy56ZXJvU2xvcGVBdEVuZCA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3RhcnRzIHRoZSBwbGF5YmFjayBvZiB0aGUgYW5pbWF0aW9uLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7QW5pbWF0aW9uQWN0aW9ufSBBIHJlZmVyZW5jZSB0byB0aGlzIGFuaW1hdGlvbiBhY3Rpb24uXHJcblx0ICovXHJcblx0cGxheSgpIHtcclxuXHJcblx0XHR0aGlzLl9taXhlci5fYWN0aXZhdGVBY3Rpb24oIHRoaXMgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTdG9wcyB0aGUgcGxheWJhY2sgb2YgdGhlIGFuaW1hdGlvbi5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0FuaW1hdGlvbkFjdGlvbn0gQSByZWZlcmVuY2UgdG8gdGhpcyBhbmltYXRpb24gYWN0aW9uLlxyXG5cdCAqL1xyXG5cdHN0b3AoKSB7XHJcblxyXG5cdFx0dGhpcy5fbWl4ZXIuX2RlYWN0aXZhdGVBY3Rpb24oIHRoaXMgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5yZXNldCgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlc2V0cyB0aGUgcGxheWJhY2sgb2YgdGhlIGFuaW1hdGlvbi5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0FuaW1hdGlvbkFjdGlvbn0gQSByZWZlcmVuY2UgdG8gdGhpcyBhbmltYXRpb24gYWN0aW9uLlxyXG5cdCAqL1xyXG5cdHJlc2V0KCkge1xyXG5cclxuXHRcdHRoaXMucGF1c2VkID0gZmFsc2U7XHJcblx0XHR0aGlzLmVuYWJsZWQgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudGltZSA9IDA7IC8vIHJlc3RhcnQgY2xpcFxyXG5cdFx0dGhpcy5fbG9vcENvdW50ID0gLSAxOy8vIGZvcmdldCBwcmV2aW91cyBsb29wc1xyXG5cdFx0dGhpcy5fc3RhcnRUaW1lID0gbnVsbDsvLyBmb3JnZXQgc2NoZWR1bGluZ1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnN0b3BGYWRpbmcoKS5zdG9wV2FycGluZygpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBhbmltYXRpb24gaXMgcnVubmluZy5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGFuaW1hdGlvbiBpcyBydW5uaW5nIG9yIG5vdC5cclxuXHQgKi9cclxuXHRpc1J1bm5pbmcoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZW5hYmxlZCAmJiAhIHRoaXMucGF1c2VkICYmIHRoaXMudGltZVNjYWxlICE9PSAwICYmXHJcblx0XHRcdHRoaXMuX3N0YXJ0VGltZSA9PT0gbnVsbCAmJiB0aGlzLl9taXhlci5faXNBY3RpdmVBY3Rpb24oIHRoaXMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCB3aGVuIHtAbGluayBBbmltYXRpb25BY3Rpb24jcGxheX0gaGFzIGJlZW4gY2FsbGVkLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgYW5pbWF0aW9uIGlzIHNjaGVkdWxlZCBvciBub3QuXHJcblx0ICovXHJcblx0aXNTY2hlZHVsZWQoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX21peGVyLl9pc0FjdGl2ZUFjdGlvbiggdGhpcyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgdGhlIHRpbWUgd2hlbiB0aGUgYW5pbWF0aW9uIHNob3VsZCBzdGFydC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lIC0gVGhlIHN0YXJ0IHRpbWUgaW4gc2Vjb25kcy5cclxuXHQgKiBAcmV0dXJuIHtBbmltYXRpb25BY3Rpb259IEEgcmVmZXJlbmNlIHRvIHRoaXMgYW5pbWF0aW9uIGFjdGlvbi5cclxuXHQgKi9cclxuXHRzdGFydEF0KCB0aW1lICkge1xyXG5cclxuXHRcdHRoaXMuX3N0YXJ0VGltZSA9IHRpbWU7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uZmlndXJlcyB0aGUgbG9vcCBzZXR0aW5ncyBmb3IgdGhpcyBhY3Rpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geyhMb29wUmVwZWF0fExvb3BPbmNlfExvb3BQaW5nUG9uZyl9IG1vZGUgLSBUaGUgbG9vcCBtb2RlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSByZXBldGl0aW9ucyAtIFRoZSBudW1iZXIgb2YgcmVwZXRpdGlvbnMuXHJcblx0ICogQHJldHVybiB7QW5pbWF0aW9uQWN0aW9ufSBBIHJlZmVyZW5jZSB0byB0aGlzIGFuaW1hdGlvbiBhY3Rpb24uXHJcblx0ICovXHJcblx0c2V0TG9vcCggbW9kZSwgcmVwZXRpdGlvbnMgKSB7XHJcblxyXG5cdFx0dGhpcy5sb29wID0gbW9kZTtcclxuXHRcdHRoaXMucmVwZXRpdGlvbnMgPSByZXBldGl0aW9ucztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBlZmZlY3RpdmUgd2VpZ2h0IG9mIHRoaXMgYWN0aW9uLlxyXG5cdCAqXHJcblx0ICogQW4gYWN0aW9uIGhhcyBubyBlZmZlY3QgYW5kIHRodXMgYW4gZWZmZWN0aXZlIHdlaWdodCBvZiB6ZXJvIHdoZW4gdGhlXHJcblx0ICogYWN0aW9uIGlzIGRpc2FibGVkLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHdlaWdodCAtIFRoZSB3ZWlnaHQgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge0FuaW1hdGlvbkFjdGlvbn0gQSByZWZlcmVuY2UgdG8gdGhpcyBhbmltYXRpb24gYWN0aW9uLlxyXG5cdCAqL1xyXG5cdHNldEVmZmVjdGl2ZVdlaWdodCggd2VpZ2h0ICkge1xyXG5cclxuXHRcdHRoaXMud2VpZ2h0ID0gd2VpZ2h0O1xyXG5cclxuXHRcdC8vIG5vdGU6IHNhbWUgbG9naWMgYXMgd2hlbiB1cGRhdGVkIGF0IHJ1bnRpbWVcclxuXHRcdHRoaXMuX2VmZmVjdGl2ZVdlaWdodCA9IHRoaXMuZW5hYmxlZCA/IHdlaWdodCA6IDA7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuc3RvcEZhZGluZygpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGVmZmVjdGl2ZSB3ZWlnaHQgb2YgdGhpcyBhY3Rpb24uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBlZmZlY3RpdmUgd2VpZ2h0LlxyXG5cdCAqL1xyXG5cdGdldEVmZmVjdGl2ZVdlaWdodCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fZWZmZWN0aXZlV2VpZ2h0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZhZGVzIHRoZSBhbmltYXRpb24gaW4gYnkgaW5jcmVhc2luZyBpdHMgd2VpZ2h0IGdyYWR1YWxseSBmcm9tIGAwYCB0byBgMWAsXHJcblx0ICogd2l0aGluIHRoZSBwYXNzZWQgdGltZSBpbnRlcnZhbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBkdXJhdGlvbiAtIFRoZSBkdXJhdGlvbiBvZiB0aGUgZmFkZS5cclxuXHQgKiBAcmV0dXJuIHtBbmltYXRpb25BY3Rpb259IEEgcmVmZXJlbmNlIHRvIHRoaXMgYW5pbWF0aW9uIGFjdGlvbi5cclxuXHQgKi9cclxuXHRmYWRlSW4oIGR1cmF0aW9uICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9zY2hlZHVsZUZhZGluZyggZHVyYXRpb24sIDAsIDEgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGYWRlcyB0aGUgYW5pbWF0aW9uIG91dCBieSBkZWNyZWFzaW5nIGl0cyB3ZWlnaHQgZ3JhZHVhbGx5IGZyb20gYDFgIHRvIGAwYCxcclxuXHQgKiB3aXRoaW4gdGhlIHBhc3NlZCB0aW1lIGludGVydmFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGR1cmF0aW9uIC0gVGhlIGR1cmF0aW9uIG9mIHRoZSBmYWRlLlxyXG5cdCAqIEByZXR1cm4ge0FuaW1hdGlvbkFjdGlvbn0gQSByZWZlcmVuY2UgdG8gdGhpcyBhbmltYXRpb24gYWN0aW9uLlxyXG5cdCAqL1xyXG5cdGZhZGVPdXQoIGR1cmF0aW9uICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9zY2hlZHVsZUZhZGluZyggZHVyYXRpb24sIDEsIDAgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDYXVzZXMgdGhpcyBhY3Rpb24gdG8gZmFkZSBpbiBhbmQgdGhlIGdpdmVuIGFjdGlvbiB0byBmYWRlIG91dCxcclxuXHQgKiB3aXRoaW4gdGhlIHBhc3NlZCB0aW1lIGludGVydmFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBbmltYXRpb25BY3Rpb259IGZhZGVPdXRBY3Rpb24gLSBUaGUgYW5pbWF0aW9uIGFjdGlvbiB0byBmYWRlIG91dC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZHVyYXRpb24gLSBUaGUgZHVyYXRpb24gb2YgdGhlIGZhZGUuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbd2FycD1mYWxzZV0gLSBXaGV0aGVyIHdhcnBpbmcgc2hvdWxkIGJlIHVzZWQgb3Igbm90LlxyXG5cdCAqIEByZXR1cm4ge0FuaW1hdGlvbkFjdGlvbn0gQSByZWZlcmVuY2UgdG8gdGhpcyBhbmltYXRpb24gYWN0aW9uLlxyXG5cdCAqL1xyXG5cdGNyb3NzRmFkZUZyb20oIGZhZGVPdXRBY3Rpb24sIGR1cmF0aW9uLCB3YXJwID0gZmFsc2UgKSB7XHJcblxyXG5cdFx0ZmFkZU91dEFjdGlvbi5mYWRlT3V0KCBkdXJhdGlvbiApO1xyXG5cdFx0dGhpcy5mYWRlSW4oIGR1cmF0aW9uICk7XHJcblxyXG5cdFx0aWYgKCB3YXJwID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0Y29uc3QgZmFkZUluRHVyYXRpb24gPSB0aGlzLl9jbGlwLmR1cmF0aW9uLFxyXG5cdFx0XHRcdGZhZGVPdXREdXJhdGlvbiA9IGZhZGVPdXRBY3Rpb24uX2NsaXAuZHVyYXRpb24sXHJcblxyXG5cdFx0XHRcdHN0YXJ0RW5kUmF0aW8gPSBmYWRlT3V0RHVyYXRpb24gLyBmYWRlSW5EdXJhdGlvbixcclxuXHRcdFx0XHRlbmRTdGFydFJhdGlvID0gZmFkZUluRHVyYXRpb24gLyBmYWRlT3V0RHVyYXRpb247XHJcblxyXG5cdFx0XHRmYWRlT3V0QWN0aW9uLndhcnAoIDEuMCwgc3RhcnRFbmRSYXRpbywgZHVyYXRpb24gKTtcclxuXHRcdFx0dGhpcy53YXJwKCBlbmRTdGFydFJhdGlvLCAxLjAsIGR1cmF0aW9uICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENhdXNlcyB0aGlzIGFjdGlvbiB0byBmYWRlIG91dCBhbmQgdGhlIGdpdmVuIGFjdGlvbiB0byBmYWRlIGluLFxyXG5cdCAqIHdpdGhpbiB0aGUgcGFzc2VkIHRpbWUgaW50ZXJ2YWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FuaW1hdGlvbkFjdGlvbn0gZmFkZUluQWN0aW9uIC0gVGhlIGFuaW1hdGlvbiBhY3Rpb24gdG8gZmFkZSBpbi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZHVyYXRpb24gLSBUaGUgZHVyYXRpb24gb2YgdGhlIGZhZGUuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbd2FycD1mYWxzZV0gLSBXaGV0aGVyIHdhcnBpbmcgc2hvdWxkIGJlIHVzZWQgb3Igbm90LlxyXG5cdCAqIEByZXR1cm4ge0FuaW1hdGlvbkFjdGlvbn0gQSByZWZlcmVuY2UgdG8gdGhpcyBhbmltYXRpb24gYWN0aW9uLlxyXG5cdCAqL1xyXG5cdGNyb3NzRmFkZVRvKCBmYWRlSW5BY3Rpb24sIGR1cmF0aW9uLCB3YXJwID0gZmFsc2UgKSB7XHJcblxyXG5cdFx0cmV0dXJuIGZhZGVJbkFjdGlvbi5jcm9zc0ZhZGVGcm9tKCB0aGlzLCBkdXJhdGlvbiwgd2FycCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFN0b3BzIGFueSBmYWRpbmcgd2hpY2ggaXMgYXBwbGllZCB0byB0aGlzIGFjdGlvbi5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0FuaW1hdGlvbkFjdGlvbn0gQSByZWZlcmVuY2UgdG8gdGhpcyBhbmltYXRpb24gYWN0aW9uLlxyXG5cdCAqL1xyXG5cdHN0b3BGYWRpbmcoKSB7XHJcblxyXG5cdFx0Y29uc3Qgd2VpZ2h0SW50ZXJwb2xhbnQgPSB0aGlzLl93ZWlnaHRJbnRlcnBvbGFudDtcclxuXHJcblx0XHRpZiAoIHdlaWdodEludGVycG9sYW50ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQgPSBudWxsO1xyXG5cdFx0XHR0aGlzLl9taXhlci5fdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQoIHdlaWdodEludGVycG9sYW50ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGVmZmVjdGl2ZSB0aW1lIHNjYWxlIG9mIHRoaXMgYWN0aW9uLlxyXG5cdCAqXHJcblx0ICogQW4gYWN0aW9uIGhhcyBubyBlZmZlY3QgYW5kIHRodXMgYW4gZWZmZWN0aXZlIHRpbWUgc2NhbGUgb2YgemVybyB3aGVuIHRoZVxyXG5cdCAqIGFjdGlvbiBpcyBwYXVzZWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdGltZVNjYWxlIC0gVGhlIHRpbWUgc2NhbGUgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge0FuaW1hdGlvbkFjdGlvbn0gQSByZWZlcmVuY2UgdG8gdGhpcyBhbmltYXRpb24gYWN0aW9uLlxyXG5cdCAqL1xyXG5cdHNldEVmZmVjdGl2ZVRpbWVTY2FsZSggdGltZVNjYWxlICkge1xyXG5cclxuXHRcdHRoaXMudGltZVNjYWxlID0gdGltZVNjYWxlO1xyXG5cdFx0dGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlID0gdGhpcy5wYXVzZWQgPyAwIDogdGltZVNjYWxlO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnN0b3BXYXJwaW5nKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgZWZmZWN0aXZlIHRpbWUgc2NhbGUgb2YgdGhpcyBhY3Rpb24uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBlZmZlY3RpdmUgdGltZSBzY2FsZS5cclxuXHQgKi9cclxuXHRnZXRFZmZlY3RpdmVUaW1lU2NhbGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBkdXJhdGlvbiBmb3IgYSBzaW5nbGUgbG9vcCBvZiB0aGlzIGFjdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBkdXJhdGlvbiAtIFRoZSBkdXJhdGlvbiB0byBzZXQuXHJcblx0ICogQHJldHVybiB7QW5pbWF0aW9uQWN0aW9ufSBBIHJlZmVyZW5jZSB0byB0aGlzIGFuaW1hdGlvbiBhY3Rpb24uXHJcblx0ICovXHJcblx0c2V0RHVyYXRpb24oIGR1cmF0aW9uICkge1xyXG5cclxuXHRcdHRoaXMudGltZVNjYWxlID0gdGhpcy5fY2xpcC5kdXJhdGlvbiAvIGR1cmF0aW9uO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnN0b3BXYXJwaW5nKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3luY2hyb25pemVzIHRoaXMgYWN0aW9uIHdpdGggdGhlIHBhc3NlZCBvdGhlciBhY3Rpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FuaW1hdGlvbkFjdGlvbn0gYWN0aW9uIC0gVGhlIGFjdGlvbiB0byBzeW5jIHdpdGguXHJcblx0ICogQHJldHVybiB7QW5pbWF0aW9uQWN0aW9ufSBBIHJlZmVyZW5jZSB0byB0aGlzIGFuaW1hdGlvbiBhY3Rpb24uXHJcblx0ICovXHJcblx0c3luY1dpdGgoIGFjdGlvbiApIHtcclxuXHJcblx0XHR0aGlzLnRpbWUgPSBhY3Rpb24udGltZTtcclxuXHRcdHRoaXMudGltZVNjYWxlID0gYWN0aW9uLnRpbWVTY2FsZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5zdG9wV2FycGluZygpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlY2VsZXJhdGVzIHRoaXMgYW5pbWF0aW9uJ3Mgc3BlZWQgdG8gYDBgIHdpdGhpbiB0aGUgcGFzc2VkIHRpbWUgaW50ZXJ2YWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZHVyYXRpb24gLSBUaGUgZHVyYXRpb24uXHJcblx0ICogQHJldHVybiB7QW5pbWF0aW9uQWN0aW9ufSBBIHJlZmVyZW5jZSB0byB0aGlzIGFuaW1hdGlvbiBhY3Rpb24uXHJcblx0ICovXHJcblx0aGFsdCggZHVyYXRpb24gKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMud2FycCggdGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlLCAwLCBkdXJhdGlvbiApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENoYW5nZXMgdGhlIHBsYXliYWNrIHNwZWVkLCB3aXRoaW4gdGhlIHBhc3NlZCB0aW1lIGludGVydmFsLCBieSBtb2RpZnlpbmdcclxuXHQgKiB7QGxpbmsgQW5pbWF0aW9uQWN0aW9uI3RpbWVTY2FsZX0gZ3JhZHVhbGx5IGZyb20gYHN0YXJ0VGltZVNjYWxlYCB0b1xyXG5cdCAqIGBlbmRUaW1lU2NhbGVgLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0VGltZVNjYWxlIC0gVGhlIHN0YXJ0IHRpbWUgc2NhbGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGVuZFRpbWVTY2FsZSAtIFRoZSBlbmQgdGltZSBzY2FsZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZHVyYXRpb24gLSBUaGUgZHVyYXRpb24uXHJcblx0ICogQHJldHVybiB7QW5pbWF0aW9uQWN0aW9ufSBBIHJlZmVyZW5jZSB0byB0aGlzIGFuaW1hdGlvbiBhY3Rpb24uXHJcblx0ICovXHJcblx0d2FycCggc3RhcnRUaW1lU2NhbGUsIGVuZFRpbWVTY2FsZSwgZHVyYXRpb24gKSB7XHJcblxyXG5cdFx0Y29uc3QgbWl4ZXIgPSB0aGlzLl9taXhlcixcclxuXHRcdFx0bm93ID0gbWl4ZXIudGltZSxcclxuXHRcdFx0dGltZVNjYWxlID0gdGhpcy50aW1lU2NhbGU7XHJcblxyXG5cdFx0bGV0IGludGVycG9sYW50ID0gdGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ7XHJcblxyXG5cdFx0aWYgKCBpbnRlcnBvbGFudCA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGludGVycG9sYW50ID0gbWl4ZXIuX2xlbmRDb250cm9sSW50ZXJwb2xhbnQoKTtcclxuXHRcdFx0dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQgPSBpbnRlcnBvbGFudDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgdGltZXMgPSBpbnRlcnBvbGFudC5wYXJhbWV0ZXJQb3NpdGlvbnMsXHJcblx0XHRcdHZhbHVlcyA9IGludGVycG9sYW50LnNhbXBsZVZhbHVlcztcclxuXHJcblx0XHR0aW1lc1sgMCBdID0gbm93O1xyXG5cdFx0dGltZXNbIDEgXSA9IG5vdyArIGR1cmF0aW9uO1xyXG5cclxuXHRcdHZhbHVlc1sgMCBdID0gc3RhcnRUaW1lU2NhbGUgLyB0aW1lU2NhbGU7XHJcblx0XHR2YWx1ZXNbIDEgXSA9IGVuZFRpbWVTY2FsZSAvIHRpbWVTY2FsZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTdG9wcyBhbnkgc2NoZWR1bGVkIHdhcnBpbmcgd2hpY2ggaXMgYXBwbGllZCB0byB0aGlzIGFjdGlvbi5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0FuaW1hdGlvbkFjdGlvbn0gQSByZWZlcmVuY2UgdG8gdGhpcyBhbmltYXRpb24gYWN0aW9uLlxyXG5cdCAqL1xyXG5cdHN0b3BXYXJwaW5nKCkge1xyXG5cclxuXHRcdGNvbnN0IHRpbWVTY2FsZUludGVycG9sYW50ID0gdGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ7XHJcblxyXG5cdFx0aWYgKCB0aW1lU2NhbGVJbnRlcnBvbGFudCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50ID0gbnVsbDtcclxuXHRcdFx0dGhpcy5fbWl4ZXIuX3Rha2VCYWNrQ29udHJvbEludGVycG9sYW50KCB0aW1lU2NhbGVJbnRlcnBvbGFudCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBhbmltYXRpb24gbWl4ZXIgb2YgdGhpcyBhbmltYXRpb24gYWN0aW9uLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7QW5pbWF0aW9uTWl4ZXJ9IFRoZSBhbmltYXRpb24gbWl4ZXIuXHJcblx0ICovXHJcblx0Z2V0TWl4ZXIoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX21peGVyO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGFuaW1hdGlvbiBjbGlwIG9mIHRoaXMgYW5pbWF0aW9uIGFjdGlvbi5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0FuaW1hdGlvbkNsaXB9IFRoZSBhbmltYXRpb24gY2xpcC5cclxuXHQgKi9cclxuXHRnZXRDbGlwKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9jbGlwO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHJvb3Qgb2JqZWN0IG9mIHRoaXMgYW5pbWF0aW9uIGFjdGlvbi5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge09iamVjdDNEfSBUaGUgcm9vdCBvYmplY3QuXHJcblx0ICovXHJcblx0Z2V0Um9vdCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fbG9jYWxSb290IHx8IHRoaXMuX21peGVyLl9yb290O1xyXG5cclxuXHR9XHJcblxyXG5cdC8vIEludGVybmFcclxuXHJcblx0X3VwZGF0ZSggdGltZSwgZGVsdGFUaW1lLCB0aW1lRGlyZWN0aW9uLCBhY2N1SW5kZXggKSB7XHJcblxyXG5cdFx0Ly8gY2FsbGVkIGJ5IHRoZSBtaXhlclxyXG5cclxuXHRcdGlmICggISB0aGlzLmVuYWJsZWQgKSB7XHJcblxyXG5cdFx0XHQvLyBjYWxsIC5fdXBkYXRlV2VpZ2h0KCkgdG8gdXBkYXRlIC5fZWZmZWN0aXZlV2VpZ2h0XHJcblxyXG5cdFx0XHR0aGlzLl91cGRhdGVXZWlnaHQoIHRpbWUgKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBzdGFydFRpbWUgPSB0aGlzLl9zdGFydFRpbWU7XHJcblxyXG5cdFx0aWYgKCBzdGFydFRpbWUgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHQvLyBjaGVjayBmb3Igc2NoZWR1bGVkIHN0YXJ0IG9mIGFjdGlvblxyXG5cclxuXHRcdFx0Y29uc3QgdGltZVJ1bm5pbmcgPSAoIHRpbWUgLSBzdGFydFRpbWUgKSAqIHRpbWVEaXJlY3Rpb247XHJcblx0XHRcdGlmICggdGltZVJ1bm5pbmcgPCAwIHx8IHRpbWVEaXJlY3Rpb24gPT09IDAgKSB7XHJcblxyXG5cdFx0XHRcdGRlbHRhVGltZSA9IDA7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHJcblx0XHRcdFx0dGhpcy5fc3RhcnRUaW1lID0gbnVsbDsgLy8gdW5zY2hlZHVsZVxyXG5cdFx0XHRcdGRlbHRhVGltZSA9IHRpbWVEaXJlY3Rpb24gKiB0aW1lUnVubmluZztcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gYXBwbHkgdGltZSBzY2FsZSBhbmQgYWR2YW5jZSB0aW1lXHJcblxyXG5cdFx0ZGVsdGFUaW1lICo9IHRoaXMuX3VwZGF0ZVRpbWVTY2FsZSggdGltZSApO1xyXG5cdFx0Y29uc3QgY2xpcFRpbWUgPSB0aGlzLl91cGRhdGVUaW1lKCBkZWx0YVRpbWUgKTtcclxuXHJcblx0XHQvLyBub3RlOiBfdXBkYXRlVGltZSBtYXkgZGlzYWJsZSB0aGUgYWN0aW9uIHJlc3VsdGluZyBpblxyXG5cdFx0Ly8gYW4gZWZmZWN0aXZlIHdlaWdodCBvZiAwXHJcblxyXG5cdFx0Y29uc3Qgd2VpZ2h0ID0gdGhpcy5fdXBkYXRlV2VpZ2h0KCB0aW1lICk7XHJcblxyXG5cdFx0aWYgKCB3ZWlnaHQgPiAwICkge1xyXG5cclxuXHRcdFx0Y29uc3QgaW50ZXJwb2xhbnRzID0gdGhpcy5faW50ZXJwb2xhbnRzO1xyXG5cdFx0XHRjb25zdCBwcm9wZXJ0eU1peGVycyA9IHRoaXMuX3Byb3BlcnR5QmluZGluZ3M7XHJcblxyXG5cdFx0XHRzd2l0Y2ggKCB0aGlzLmJsZW5kTW9kZSApIHtcclxuXHJcblx0XHRcdFx0Y2FzZSBBZGRpdGl2ZUFuaW1hdGlvbkJsZW5kTW9kZTpcclxuXHJcblx0XHRcdFx0XHRmb3IgKCBsZXQgaiA9IDAsIG0gPSBpbnRlcnBvbGFudHMubGVuZ3RoOyBqICE9PSBtOyArKyBqICkge1xyXG5cclxuXHRcdFx0XHRcdFx0aW50ZXJwb2xhbnRzWyBqIF0uZXZhbHVhdGUoIGNsaXBUaW1lICk7XHJcblx0XHRcdFx0XHRcdHByb3BlcnR5TWl4ZXJzWyBqIF0uYWNjdW11bGF0ZUFkZGl0aXZlKCB3ZWlnaHQgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdGNhc2UgTm9ybWFsQW5pbWF0aW9uQmxlbmRNb2RlOlxyXG5cdFx0XHRcdGRlZmF1bHQ6XHJcblxyXG5cdFx0XHRcdFx0Zm9yICggbGV0IGogPSAwLCBtID0gaW50ZXJwb2xhbnRzLmxlbmd0aDsgaiAhPT0gbTsgKysgaiApIHtcclxuXHJcblx0XHRcdFx0XHRcdGludGVycG9sYW50c1sgaiBdLmV2YWx1YXRlKCBjbGlwVGltZSApO1xyXG5cdFx0XHRcdFx0XHRwcm9wZXJ0eU1peGVyc1sgaiBdLmFjY3VtdWxhdGUoIGFjY3VJbmRleCwgd2VpZ2h0ICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRfdXBkYXRlV2VpZ2h0KCB0aW1lICkge1xyXG5cclxuXHRcdGxldCB3ZWlnaHQgPSAwO1xyXG5cclxuXHRcdGlmICggdGhpcy5lbmFibGVkICkge1xyXG5cclxuXHRcdFx0d2VpZ2h0ID0gdGhpcy53ZWlnaHQ7XHJcblx0XHRcdGNvbnN0IGludGVycG9sYW50ID0gdGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ7XHJcblxyXG5cdFx0XHRpZiAoIGludGVycG9sYW50ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBpbnRlcnBvbGFudFZhbHVlID0gaW50ZXJwb2xhbnQuZXZhbHVhdGUoIHRpbWUgKVsgMCBdO1xyXG5cclxuXHRcdFx0XHR3ZWlnaHQgKj0gaW50ZXJwb2xhbnRWYWx1ZTtcclxuXHJcblx0XHRcdFx0aWYgKCB0aW1lID4gaW50ZXJwb2xhbnQucGFyYW1ldGVyUG9zaXRpb25zWyAxIF0gKSB7XHJcblxyXG5cdFx0XHRcdFx0dGhpcy5zdG9wRmFkaW5nKCk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBpbnRlcnBvbGFudFZhbHVlID09PSAwICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Ly8gZmFkZWQgb3V0LCBkaXNhYmxlXHJcblx0XHRcdFx0XHRcdHRoaXMuZW5hYmxlZCA9IGZhbHNlO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLl9lZmZlY3RpdmVXZWlnaHQgPSB3ZWlnaHQ7XHJcblx0XHRyZXR1cm4gd2VpZ2h0O1xyXG5cclxuXHR9XHJcblxyXG5cdF91cGRhdGVUaW1lU2NhbGUoIHRpbWUgKSB7XHJcblxyXG5cdFx0bGV0IHRpbWVTY2FsZSA9IDA7XHJcblxyXG5cdFx0aWYgKCAhIHRoaXMucGF1c2VkICkge1xyXG5cclxuXHRcdFx0dGltZVNjYWxlID0gdGhpcy50aW1lU2NhbGU7XHJcblxyXG5cdFx0XHRjb25zdCBpbnRlcnBvbGFudCA9IHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50O1xyXG5cclxuXHRcdFx0aWYgKCBpbnRlcnBvbGFudCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgaW50ZXJwb2xhbnRWYWx1ZSA9IGludGVycG9sYW50LmV2YWx1YXRlKCB0aW1lIClbIDAgXTtcclxuXHJcblx0XHRcdFx0dGltZVNjYWxlICo9IGludGVycG9sYW50VmFsdWU7XHJcblxyXG5cdFx0XHRcdGlmICggdGltZSA+IGludGVycG9sYW50LnBhcmFtZXRlclBvc2l0aW9uc1sgMSBdICkge1xyXG5cclxuXHRcdFx0XHRcdHRoaXMuc3RvcFdhcnBpbmcoKTtcclxuXHJcblx0XHRcdFx0XHRpZiAoIHRpbWVTY2FsZSA9PT0gMCApIHtcclxuXHJcblx0XHRcdFx0XHRcdC8vIG1vdGlvbiBoYXMgaGFsdGVkLCBwYXVzZVxyXG5cdFx0XHRcdFx0XHR0aGlzLnBhdXNlZCA9IHRydWU7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdC8vIHdhcnAgZG9uZSAtIGFwcGx5IGZpbmFsIHRpbWUgc2NhbGVcclxuXHRcdFx0XHRcdFx0dGhpcy50aW1lU2NhbGUgPSB0aW1lU2NhbGU7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZSA9IHRpbWVTY2FsZTtcclxuXHRcdHJldHVybiB0aW1lU2NhbGU7XHJcblxyXG5cdH1cclxuXHJcblx0X3VwZGF0ZVRpbWUoIGRlbHRhVGltZSApIHtcclxuXHJcblx0XHRjb25zdCBkdXJhdGlvbiA9IHRoaXMuX2NsaXAuZHVyYXRpb247XHJcblx0XHRjb25zdCBsb29wID0gdGhpcy5sb29wO1xyXG5cclxuXHRcdGxldCB0aW1lID0gdGhpcy50aW1lICsgZGVsdGFUaW1lO1xyXG5cdFx0bGV0IGxvb3BDb3VudCA9IHRoaXMuX2xvb3BDb3VudDtcclxuXHJcblx0XHRjb25zdCBwaW5nUG9uZyA9ICggbG9vcCA9PT0gTG9vcFBpbmdQb25nICk7XHJcblxyXG5cdFx0aWYgKCBkZWx0YVRpbWUgPT09IDAgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGxvb3BDb3VudCA9PT0gLSAxICkgcmV0dXJuIHRpbWU7XHJcblxyXG5cdFx0XHRyZXR1cm4gKCBwaW5nUG9uZyAmJiAoIGxvb3BDb3VudCAmIDEgKSA9PT0gMSApID8gZHVyYXRpb24gLSB0aW1lIDogdGltZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBsb29wID09PSBMb29wT25jZSApIHtcclxuXHJcblx0XHRcdGlmICggbG9vcENvdW50ID09PSAtIDEgKSB7XHJcblxyXG5cdFx0XHRcdC8vIGp1c3Qgc3RhcnRlZFxyXG5cclxuXHRcdFx0XHR0aGlzLl9sb29wQ291bnQgPSAwO1xyXG5cdFx0XHRcdHRoaXMuX3NldEVuZGluZ3MoIHRydWUsIHRydWUsIGZhbHNlICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRoYW5kbGVfc3RvcDoge1xyXG5cclxuXHRcdFx0XHRpZiAoIHRpbWUgPj0gZHVyYXRpb24gKSB7XHJcblxyXG5cdFx0XHRcdFx0dGltZSA9IGR1cmF0aW9uO1xyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCB0aW1lIDwgMCApIHtcclxuXHJcblx0XHRcdFx0XHR0aW1lID0gMDtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHR0aGlzLnRpbWUgPSB0aW1lO1xyXG5cclxuXHRcdFx0XHRcdGJyZWFrIGhhbmRsZV9zdG9wO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICggdGhpcy5jbGFtcFdoZW5GaW5pc2hlZCApIHRoaXMucGF1c2VkID0gdHJ1ZTtcclxuXHRcdFx0XHRlbHNlIHRoaXMuZW5hYmxlZCA9IGZhbHNlO1xyXG5cclxuXHRcdFx0XHR0aGlzLnRpbWUgPSB0aW1lO1xyXG5cclxuXHRcdFx0XHR0aGlzLl9taXhlci5kaXNwYXRjaEV2ZW50KCB7XHJcblx0XHRcdFx0XHR0eXBlOiAnZmluaXNoZWQnLCBhY3Rpb246IHRoaXMsXHJcblx0XHRcdFx0XHRkaXJlY3Rpb246IGRlbHRhVGltZSA8IDAgPyAtIDEgOiAxXHJcblx0XHRcdFx0fSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSB7IC8vIHJlcGV0aXRpdmUgUmVwZWF0IG9yIFBpbmdQb25nXHJcblxyXG5cdFx0XHRpZiAoIGxvb3BDb3VudCA9PT0gLSAxICkge1xyXG5cclxuXHRcdFx0XHQvLyBqdXN0IHN0YXJ0ZWRcclxuXHJcblx0XHRcdFx0aWYgKCBkZWx0YVRpbWUgPj0gMCApIHtcclxuXHJcblx0XHRcdFx0XHRsb29wQ291bnQgPSAwO1xyXG5cclxuXHRcdFx0XHRcdHRoaXMuX3NldEVuZGluZ3MoIHRydWUsIHRoaXMucmVwZXRpdGlvbnMgPT09IDAsIHBpbmdQb25nICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gd2hlbiBsb29waW5nIGluIHJldmVyc2UgZGlyZWN0aW9uLCB0aGUgaW5pdGlhbFxyXG5cdFx0XHRcdFx0Ly8gdHJhbnNpdGlvbiB0aHJvdWdoIHplcm8gY291bnRzIGFzIGEgcmVwZXRpdGlvbixcclxuXHRcdFx0XHRcdC8vIHNvIGxlYXZlIGxvb3BDb3VudCBhdCAtMVxyXG5cclxuXHRcdFx0XHRcdHRoaXMuX3NldEVuZGluZ3MoIHRoaXMucmVwZXRpdGlvbnMgPT09IDAsIHRydWUsIHBpbmdQb25nICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggdGltZSA+PSBkdXJhdGlvbiB8fCB0aW1lIDwgMCApIHtcclxuXHJcblx0XHRcdFx0Ly8gd3JhcCBhcm91bmRcclxuXHJcblx0XHRcdFx0Y29uc3QgbG9vcERlbHRhID0gTWF0aC5mbG9vciggdGltZSAvIGR1cmF0aW9uICk7IC8vIHNpZ25lZFxyXG5cdFx0XHRcdHRpbWUgLT0gZHVyYXRpb24gKiBsb29wRGVsdGE7XHJcblxyXG5cdFx0XHRcdGxvb3BDb3VudCArPSBNYXRoLmFicyggbG9vcERlbHRhICk7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHBlbmRpbmcgPSB0aGlzLnJlcGV0aXRpb25zIC0gbG9vcENvdW50O1xyXG5cclxuXHRcdFx0XHRpZiAoIHBlbmRpbmcgPD0gMCApIHtcclxuXHJcblx0XHRcdFx0XHQvLyBoYXZlIHRvIHN0b3AgKHN3aXRjaCBzdGF0ZSwgY2xhbXAgdGltZSwgZmlyZSBldmVudClcclxuXHJcblx0XHRcdFx0XHRpZiAoIHRoaXMuY2xhbXBXaGVuRmluaXNoZWQgKSB0aGlzLnBhdXNlZCA9IHRydWU7XHJcblx0XHRcdFx0XHRlbHNlIHRoaXMuZW5hYmxlZCA9IGZhbHNlO1xyXG5cclxuXHRcdFx0XHRcdHRpbWUgPSBkZWx0YVRpbWUgPiAwID8gZHVyYXRpb24gOiAwO1xyXG5cclxuXHRcdFx0XHRcdHRoaXMudGltZSA9IHRpbWU7XHJcblxyXG5cdFx0XHRcdFx0dGhpcy5fbWl4ZXIuZGlzcGF0Y2hFdmVudCgge1xyXG5cdFx0XHRcdFx0XHR0eXBlOiAnZmluaXNoZWQnLCBhY3Rpb246IHRoaXMsXHJcblx0XHRcdFx0XHRcdGRpcmVjdGlvbjogZGVsdGFUaW1lID4gMCA/IDEgOiAtIDFcclxuXHRcdFx0XHRcdH0gKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHQvLyBrZWVwIHJ1bm5pbmdcclxuXHJcblx0XHRcdFx0XHRpZiAoIHBlbmRpbmcgPT09IDEgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBlbnRlcmluZyB0aGUgbGFzdCByb3VuZFxyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgYXRTdGFydCA9IGRlbHRhVGltZSA8IDA7XHJcblx0XHRcdFx0XHRcdHRoaXMuX3NldEVuZGluZ3MoIGF0U3RhcnQsICEgYXRTdGFydCwgcGluZ1BvbmcgKTtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0dGhpcy5fc2V0RW5kaW5ncyggZmFsc2UsIGZhbHNlLCBwaW5nUG9uZyApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR0aGlzLl9sb29wQ291bnQgPSBsb29wQ291bnQ7XHJcblxyXG5cdFx0XHRcdFx0dGhpcy50aW1lID0gdGltZTtcclxuXHJcblx0XHRcdFx0XHR0aGlzLl9taXhlci5kaXNwYXRjaEV2ZW50KCB7XHJcblx0XHRcdFx0XHRcdHR5cGU6ICdsb29wJywgYWN0aW9uOiB0aGlzLCBsb29wRGVsdGE6IGxvb3BEZWx0YVxyXG5cdFx0XHRcdFx0fSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHR0aGlzLnRpbWUgPSB0aW1lO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBwaW5nUG9uZyAmJiAoIGxvb3BDb3VudCAmIDEgKSA9PT0gMSApIHtcclxuXHJcblx0XHRcdFx0Ly8gaW52ZXJ0IHRpbWUgZm9yIHRoZSBcInBvbmcgcm91bmRcIlxyXG5cclxuXHRcdFx0XHRyZXR1cm4gZHVyYXRpb24gLSB0aW1lO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGltZTtcclxuXHJcblx0fVxyXG5cclxuXHRfc2V0RW5kaW5ncyggYXRTdGFydCwgYXRFbmQsIHBpbmdQb25nICkge1xyXG5cclxuXHRcdGNvbnN0IHNldHRpbmdzID0gdGhpcy5faW50ZXJwb2xhbnRTZXR0aW5ncztcclxuXHJcblx0XHRpZiAoIHBpbmdQb25nICkge1xyXG5cclxuXHRcdFx0c2V0dGluZ3MuZW5kaW5nU3RhcnQgPSBaZXJvU2xvcGVFbmRpbmc7XHJcblx0XHRcdHNldHRpbmdzLmVuZGluZ0VuZCA9IFplcm9TbG9wZUVuZGluZztcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Ly8gYXNzdW1pbmcgZm9yIExvb3BPbmNlIGF0U3RhcnQgPT0gYXRFbmQgPT0gdHJ1ZVxyXG5cclxuXHRcdFx0aWYgKCBhdFN0YXJ0ICkge1xyXG5cclxuXHRcdFx0XHRzZXR0aW5ncy5lbmRpbmdTdGFydCA9IHRoaXMuemVyb1Nsb3BlQXRTdGFydCA/IFplcm9TbG9wZUVuZGluZyA6IFplcm9DdXJ2YXR1cmVFbmRpbmc7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRzZXR0aW5ncy5lbmRpbmdTdGFydCA9IFdyYXBBcm91bmRFbmRpbmc7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIGF0RW5kICkge1xyXG5cclxuXHRcdFx0XHRzZXR0aW5ncy5lbmRpbmdFbmQgPSB0aGlzLnplcm9TbG9wZUF0RW5kID8gWmVyb1Nsb3BlRW5kaW5nIDogWmVyb0N1cnZhdHVyZUVuZGluZztcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHNldHRpbmdzLmVuZGluZ0VuZCBcdCA9IFdyYXBBcm91bmRFbmRpbmc7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdF9zY2hlZHVsZUZhZGluZyggZHVyYXRpb24sIHdlaWdodE5vdywgd2VpZ2h0VGhlbiApIHtcclxuXHJcblx0XHRjb25zdCBtaXhlciA9IHRoaXMuX21peGVyLCBub3cgPSBtaXhlci50aW1lO1xyXG5cdFx0bGV0IGludGVycG9sYW50ID0gdGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ7XHJcblxyXG5cdFx0aWYgKCBpbnRlcnBvbGFudCA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGludGVycG9sYW50ID0gbWl4ZXIuX2xlbmRDb250cm9sSW50ZXJwb2xhbnQoKTtcclxuXHRcdFx0dGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQgPSBpbnRlcnBvbGFudDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgdGltZXMgPSBpbnRlcnBvbGFudC5wYXJhbWV0ZXJQb3NpdGlvbnMsXHJcblx0XHRcdHZhbHVlcyA9IGludGVycG9sYW50LnNhbXBsZVZhbHVlcztcclxuXHJcblx0XHR0aW1lc1sgMCBdID0gbm93O1xyXG5cdFx0dmFsdWVzWyAwIF0gPSB3ZWlnaHROb3c7XHJcblx0XHR0aW1lc1sgMSBdID0gbm93ICsgZHVyYXRpb247XHJcblx0XHR2YWx1ZXNbIDEgXSA9IHdlaWdodFRoZW47XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBBbmltYXRpb25BY3Rpb24gfTtcclxuIiwiaW1wb3J0IHsgQW5pbWF0aW9uQWN0aW9uIH0gZnJvbSAnLi9BbmltYXRpb25BY3Rpb24uanMnO1xyXG5pbXBvcnQgeyBFdmVudERpc3BhdGNoZXIgfSBmcm9tICcuLi9jb3JlL0V2ZW50RGlzcGF0Y2hlci5qcyc7XHJcbmltcG9ydCB7IExpbmVhckludGVycG9sYW50IH0gZnJvbSAnLi4vbWF0aC9pbnRlcnBvbGFudHMvTGluZWFySW50ZXJwb2xhbnQuanMnO1xyXG5pbXBvcnQgeyBQcm9wZXJ0eUJpbmRpbmcgfSBmcm9tICcuL1Byb3BlcnR5QmluZGluZy5qcyc7XHJcbmltcG9ydCB7IFByb3BlcnR5TWl4ZXIgfSBmcm9tICcuL1Byb3BlcnR5TWl4ZXIuanMnO1xyXG5pbXBvcnQgeyBBbmltYXRpb25DbGlwIH0gZnJvbSAnLi9BbmltYXRpb25DbGlwLmpzJztcclxuaW1wb3J0IHsgTm9ybWFsQW5pbWF0aW9uQmxlbmRNb2RlIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcclxuXHJcbmNvbnN0IF9jb250cm9sSW50ZXJwb2xhbnRzUmVzdWx0QnVmZmVyID0gbmV3IEZsb2F0MzJBcnJheSggMSApO1xyXG5cclxuLyoqXHJcbiAqIGBBbmltYXRpb25NaXhlcmAgaXMgYSBwbGF5ZXIgZm9yIGFuaW1hdGlvbnMgb24gYSBwYXJ0aWN1bGFyIG9iamVjdCBpblxyXG4gKiB0aGUgc2NlbmUuIFdoZW4gbXVsdGlwbGUgb2JqZWN0cyBpbiB0aGUgc2NlbmUgYXJlIGFuaW1hdGVkIGluZGVwZW5kZW50bHksXHJcbiAqIG9uZSBgQW5pbWF0aW9uTWl4ZXJgIG1heSBiZSB1c2VkIGZvciBlYWNoIG9iamVjdC5cclxuICovXHJcbmNsYXNzIEFuaW1hdGlvbk1peGVyIGV4dGVuZHMgRXZlbnREaXNwYXRjaGVyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBhbmltYXRpb24gbWl4ZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdDNEfSByb290IC0gVGhlIG9iamVjdCB3aG9zZSBhbmltYXRpb25zIHNoYWxsIGJlIHBsYXllZCBieSB0aGlzIG1peGVyLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCByb290ICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0dGhpcy5fcm9vdCA9IHJvb3Q7XHJcblx0XHR0aGlzLl9pbml0TWVtb3J5TWFuYWdlcigpO1xyXG5cdFx0dGhpcy5fYWNjdUluZGV4ID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBnbG9iYWwgbWl4ZXIgdGltZSAoaW4gc2Vjb25kczsgc3RhcnRpbmcgd2l0aCBgMGAgb24gdGhlIG1peGVyJ3MgY3JlYXRpb24pLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudGltZSA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHNjYWxpbmcgZmFjdG9yIGZvciB0aGUgZ2xvYmFsIHRpbWUuXHJcblx0XHQgKlxyXG5cdFx0ICogTm90ZTogU2V0dGluZyB0aGlzIG1lbWJlciB0byBgMGAgYW5kIGxhdGVyIGJhY2sgdG8gYDFgIGlzIGFcclxuXHRcdCAqIHBvc3NpYmlsaXR5IHRvIHBhdXNlL3VucGF1c2UgYWxsIGFjdGlvbnMgdGhhdCBhcmUgY29udHJvbGxlZCBieSB0aGlzXHJcblx0XHQgKiBtaXhlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRpbWVTY2FsZSA9IDEuMDtcclxuXHJcblx0fVxyXG5cclxuXHRfYmluZEFjdGlvbiggYWN0aW9uLCBwcm90b3R5cGVBY3Rpb24gKSB7XHJcblxyXG5cdFx0Y29uc3Qgcm9vdCA9IGFjdGlvbi5fbG9jYWxSb290IHx8IHRoaXMuX3Jvb3QsXHJcblx0XHRcdHRyYWNrcyA9IGFjdGlvbi5fY2xpcC50cmFja3MsXHJcblx0XHRcdG5UcmFja3MgPSB0cmFja3MubGVuZ3RoLFxyXG5cdFx0XHRiaW5kaW5ncyA9IGFjdGlvbi5fcHJvcGVydHlCaW5kaW5ncyxcclxuXHRcdFx0aW50ZXJwb2xhbnRzID0gYWN0aW9uLl9pbnRlcnBvbGFudHMsXHJcblx0XHRcdHJvb3RVdWlkID0gcm9vdC51dWlkLFxyXG5cdFx0XHRiaW5kaW5nc0J5Um9vdCA9IHRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZTtcclxuXHJcblx0XHRsZXQgYmluZGluZ3NCeU5hbWUgPSBiaW5kaW5nc0J5Um9vdFsgcm9vdFV1aWQgXTtcclxuXHJcblx0XHRpZiAoIGJpbmRpbmdzQnlOYW1lID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRiaW5kaW5nc0J5TmFtZSA9IHt9O1xyXG5cdFx0XHRiaW5kaW5nc0J5Um9vdFsgcm9vdFV1aWQgXSA9IGJpbmRpbmdzQnlOYW1lO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgIT09IG5UcmFja3M7ICsrIGkgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB0cmFjayA9IHRyYWNrc1sgaSBdLFxyXG5cdFx0XHRcdHRyYWNrTmFtZSA9IHRyYWNrLm5hbWU7XHJcblxyXG5cdFx0XHRsZXQgYmluZGluZyA9IGJpbmRpbmdzQnlOYW1lWyB0cmFja05hbWUgXTtcclxuXHJcblx0XHRcdGlmICggYmluZGluZyAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHQrKyBiaW5kaW5nLnJlZmVyZW5jZUNvdW50O1xyXG5cdFx0XHRcdGJpbmRpbmdzWyBpIF0gPSBiaW5kaW5nO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0YmluZGluZyA9IGJpbmRpbmdzWyBpIF07XHJcblxyXG5cdFx0XHRcdGlmICggYmluZGluZyAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdC8vIGV4aXN0aW5nIGJpbmRpbmcsIG1ha2Ugc3VyZSB0aGUgY2FjaGUga25vd3NcclxuXHJcblx0XHRcdFx0XHRpZiAoIGJpbmRpbmcuX2NhY2hlSW5kZXggPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHQrKyBiaW5kaW5nLnJlZmVyZW5jZUNvdW50O1xyXG5cdFx0XHRcdFx0XHR0aGlzLl9hZGRJbmFjdGl2ZUJpbmRpbmcoIGJpbmRpbmcsIHJvb3RVdWlkLCB0cmFja05hbWUgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Y29udGludWU7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Y29uc3QgcGF0aCA9IHByb3RvdHlwZUFjdGlvbiAmJiBwcm90b3R5cGVBY3Rpb24uXHJcblx0XHRcdFx0XHRfcHJvcGVydHlCaW5kaW5nc1sgaSBdLmJpbmRpbmcucGFyc2VkUGF0aDtcclxuXHJcblx0XHRcdFx0YmluZGluZyA9IG5ldyBQcm9wZXJ0eU1peGVyKFxyXG5cdFx0XHRcdFx0UHJvcGVydHlCaW5kaW5nLmNyZWF0ZSggcm9vdCwgdHJhY2tOYW1lLCBwYXRoICksXHJcblx0XHRcdFx0XHR0cmFjay5WYWx1ZVR5cGVOYW1lLCB0cmFjay5nZXRWYWx1ZVNpemUoKSApO1xyXG5cclxuXHRcdFx0XHQrKyBiaW5kaW5nLnJlZmVyZW5jZUNvdW50O1xyXG5cdFx0XHRcdHRoaXMuX2FkZEluYWN0aXZlQmluZGluZyggYmluZGluZywgcm9vdFV1aWQsIHRyYWNrTmFtZSApO1xyXG5cclxuXHRcdFx0XHRiaW5kaW5nc1sgaSBdID0gYmluZGluZztcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGludGVycG9sYW50c1sgaSBdLnJlc3VsdEJ1ZmZlciA9IGJpbmRpbmcuYnVmZmVyO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRfYWN0aXZhdGVBY3Rpb24oIGFjdGlvbiApIHtcclxuXHJcblx0XHRpZiAoICEgdGhpcy5faXNBY3RpdmVBY3Rpb24oIGFjdGlvbiApICkge1xyXG5cclxuXHRcdFx0aWYgKCBhY3Rpb24uX2NhY2hlSW5kZXggPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdC8vIHRoaXMgYWN0aW9uIGhhcyBiZWVuIGZvcmdvdHRlbiBieSB0aGUgY2FjaGUsIGJ1dCB0aGUgdXNlclxyXG5cdFx0XHRcdC8vIGFwcGVhcnMgdG8gYmUgc3RpbGwgdXNpbmcgaXQgLT4gcmViaW5kXHJcblxyXG5cdFx0XHRcdGNvbnN0IHJvb3RVdWlkID0gKCBhY3Rpb24uX2xvY2FsUm9vdCB8fCB0aGlzLl9yb290ICkudXVpZCxcclxuXHRcdFx0XHRcdGNsaXBVdWlkID0gYWN0aW9uLl9jbGlwLnV1aWQsXHJcblx0XHRcdFx0XHRhY3Rpb25zRm9yQ2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07XHJcblxyXG5cdFx0XHRcdHRoaXMuX2JpbmRBY3Rpb24oIGFjdGlvbixcclxuXHRcdFx0XHRcdGFjdGlvbnNGb3JDbGlwICYmIGFjdGlvbnNGb3JDbGlwLmtub3duQWN0aW9uc1sgMCBdICk7XHJcblxyXG5cdFx0XHRcdHRoaXMuX2FkZEluYWN0aXZlQWN0aW9uKCBhY3Rpb24sIGNsaXBVdWlkLCByb290VXVpZCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgYmluZGluZ3MgPSBhY3Rpb24uX3Byb3BlcnR5QmluZGluZ3M7XHJcblxyXG5cdFx0XHQvLyBpbmNyZW1lbnQgcmVmZXJlbmNlIGNvdW50cyAvIHNvcnQgb3V0IHN0YXRlXHJcblx0XHRcdGZvciAoIGxldCBpID0gMCwgbiA9IGJpbmRpbmdzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgYmluZGluZyA9IGJpbmRpbmdzWyBpIF07XHJcblxyXG5cdFx0XHRcdGlmICggYmluZGluZy51c2VDb3VudCArKyA9PT0gMCApIHtcclxuXHJcblx0XHRcdFx0XHR0aGlzLl9sZW5kQmluZGluZyggYmluZGluZyApO1xyXG5cdFx0XHRcdFx0YmluZGluZy5zYXZlT3JpZ2luYWxTdGF0ZSgpO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0aGlzLl9sZW5kQWN0aW9uKCBhY3Rpb24gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0X2RlYWN0aXZhdGVBY3Rpb24oIGFjdGlvbiApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuX2lzQWN0aXZlQWN0aW9uKCBhY3Rpb24gKSApIHtcclxuXHJcblx0XHRcdGNvbnN0IGJpbmRpbmdzID0gYWN0aW9uLl9wcm9wZXJ0eUJpbmRpbmdzO1xyXG5cclxuXHRcdFx0Ly8gZGVjcmVtZW50IHJlZmVyZW5jZSBjb3VudHMgLyBzb3J0IG91dCBzdGF0ZVxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIG4gPSBiaW5kaW5ncy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGJpbmRpbmcgPSBiaW5kaW5nc1sgaSBdO1xyXG5cclxuXHRcdFx0XHRpZiAoIC0tIGJpbmRpbmcudXNlQ291bnQgPT09IDAgKSB7XHJcblxyXG5cdFx0XHRcdFx0YmluZGluZy5yZXN0b3JlT3JpZ2luYWxTdGF0ZSgpO1xyXG5cdFx0XHRcdFx0dGhpcy5fdGFrZUJhY2tCaW5kaW5nKCBiaW5kaW5nICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuX3Rha2VCYWNrQWN0aW9uKCBhY3Rpb24gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gTWVtb3J5IG1hbmFnZXJcclxuXHJcblx0X2luaXRNZW1vcnlNYW5hZ2VyKCkge1xyXG5cclxuXHRcdHRoaXMuX2FjdGlvbnMgPSBbXTsgLy8gJ25BY3RpdmVBY3Rpb25zJyBmb2xsb3dlZCBieSBpbmFjdGl2ZSBvbmVzXHJcblx0XHR0aGlzLl9uQWN0aXZlQWN0aW9ucyA9IDA7XHJcblxyXG5cdFx0dGhpcy5fYWN0aW9uc0J5Q2xpcCA9IHt9O1xyXG5cdFx0Ly8gaW5zaWRlOlxyXG5cdFx0Ly8ge1xyXG5cdFx0Ly8gXHRrbm93bkFjdGlvbnM6IEFycmF5PCBBbmltYXRpb25BY3Rpb24gPiAtIHVzZWQgYXMgcHJvdG90eXBlc1xyXG5cdFx0Ly8gXHRhY3Rpb25CeVJvb3Q6IEFuaW1hdGlvbkFjdGlvbiAtIGxvb2t1cFxyXG5cdFx0Ly8gfVxyXG5cclxuXHJcblx0XHR0aGlzLl9iaW5kaW5ncyA9IFtdOyAvLyAnbkFjdGl2ZUJpbmRpbmdzJyBmb2xsb3dlZCBieSBpbmFjdGl2ZSBvbmVzXHJcblx0XHR0aGlzLl9uQWN0aXZlQmluZGluZ3MgPSAwO1xyXG5cclxuXHRcdHRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZSA9IHt9OyAvLyBpbnNpZGU6IE1hcDwgbmFtZSwgUHJvcGVydHlNaXhlciA+XHJcblxyXG5cclxuXHRcdHRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHMgPSBbXTsgLy8gc2FtZSBnYW1lIGFzIGFib3ZlXHJcblx0XHR0aGlzLl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50cyA9IDA7XHJcblxyXG5cdFx0Y29uc3Qgc2NvcGUgPSB0aGlzO1xyXG5cclxuXHRcdHRoaXMuc3RhdHMgPSB7XHJcblxyXG5cdFx0XHRhY3Rpb25zOiB7XHJcblx0XHRcdFx0Z2V0IHRvdGFsKCkge1xyXG5cclxuXHRcdFx0XHRcdHJldHVybiBzY29wZS5fYWN0aW9ucy5sZW5ndGg7XHJcblxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0Z2V0IGluVXNlKCkge1xyXG5cclxuXHRcdFx0XHRcdHJldHVybiBzY29wZS5fbkFjdGl2ZUFjdGlvbnM7XHJcblxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSxcclxuXHRcdFx0YmluZGluZ3M6IHtcclxuXHRcdFx0XHRnZXQgdG90YWwoKSB7XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIHNjb3BlLl9iaW5kaW5ncy5sZW5ndGg7XHJcblxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0Z2V0IGluVXNlKCkge1xyXG5cclxuXHRcdFx0XHRcdHJldHVybiBzY29wZS5fbkFjdGl2ZUJpbmRpbmdzO1xyXG5cclxuXHRcdFx0XHR9XHJcblx0XHRcdH0sXHJcblx0XHRcdGNvbnRyb2xJbnRlcnBvbGFudHM6IHtcclxuXHRcdFx0XHRnZXQgdG90YWwoKSB7XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIHNjb3BlLl9jb250cm9sSW50ZXJwb2xhbnRzLmxlbmd0aDtcclxuXHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHRnZXQgaW5Vc2UoKSB7XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIHNjb3BlLl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50cztcclxuXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fTtcclxuXHJcblx0fVxyXG5cclxuXHQvLyBNZW1vcnkgbWFuYWdlbWVudCBmb3IgQW5pbWF0aW9uQWN0aW9uIG9iamVjdHNcclxuXHJcblx0X2lzQWN0aXZlQWN0aW9uKCBhY3Rpb24gKSB7XHJcblxyXG5cdFx0Y29uc3QgaW5kZXggPSBhY3Rpb24uX2NhY2hlSW5kZXg7XHJcblx0XHRyZXR1cm4gaW5kZXggIT09IG51bGwgJiYgaW5kZXggPCB0aGlzLl9uQWN0aXZlQWN0aW9ucztcclxuXHJcblx0fVxyXG5cclxuXHRfYWRkSW5hY3RpdmVBY3Rpb24oIGFjdGlvbiwgY2xpcFV1aWQsIHJvb3RVdWlkICkge1xyXG5cclxuXHRcdGNvbnN0IGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLFxyXG5cdFx0XHRhY3Rpb25zQnlDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcDtcclxuXHJcblx0XHRsZXQgYWN0aW9uc0ZvckNsaXAgPSBhY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdO1xyXG5cclxuXHRcdGlmICggYWN0aW9uc0ZvckNsaXAgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGFjdGlvbnNGb3JDbGlwID0ge1xyXG5cclxuXHRcdFx0XHRrbm93bkFjdGlvbnM6IFsgYWN0aW9uIF0sXHJcblx0XHRcdFx0YWN0aW9uQnlSb290OiB7fVxyXG5cclxuXHRcdFx0fTtcclxuXHJcblx0XHRcdGFjdGlvbi5fYnlDbGlwQ2FjaGVJbmRleCA9IDA7XHJcblxyXG5cdFx0XHRhY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdID0gYWN0aW9uc0ZvckNsaXA7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGNvbnN0IGtub3duQWN0aW9ucyA9IGFjdGlvbnNGb3JDbGlwLmtub3duQWN0aW9ucztcclxuXHJcblx0XHRcdGFjdGlvbi5fYnlDbGlwQ2FjaGVJbmRleCA9IGtub3duQWN0aW9ucy5sZW5ndGg7XHJcblx0XHRcdGtub3duQWN0aW9ucy5wdXNoKCBhY3Rpb24gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0YWN0aW9uLl9jYWNoZUluZGV4ID0gYWN0aW9ucy5sZW5ndGg7XHJcblx0XHRhY3Rpb25zLnB1c2goIGFjdGlvbiApO1xyXG5cclxuXHRcdGFjdGlvbnNGb3JDbGlwLmFjdGlvbkJ5Um9vdFsgcm9vdFV1aWQgXSA9IGFjdGlvbjtcclxuXHJcblx0fVxyXG5cclxuXHRfcmVtb3ZlSW5hY3RpdmVBY3Rpb24oIGFjdGlvbiApIHtcclxuXHJcblx0XHRjb25zdCBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucyxcclxuXHRcdFx0bGFzdEluYWN0aXZlQWN0aW9uID0gYWN0aW9uc1sgYWN0aW9ucy5sZW5ndGggLSAxIF0sXHJcblx0XHRcdGNhY2hlSW5kZXggPSBhY3Rpb24uX2NhY2hlSW5kZXg7XHJcblxyXG5cdFx0bGFzdEluYWN0aXZlQWN0aW9uLl9jYWNoZUluZGV4ID0gY2FjaGVJbmRleDtcclxuXHRcdGFjdGlvbnNbIGNhY2hlSW5kZXggXSA9IGxhc3RJbmFjdGl2ZUFjdGlvbjtcclxuXHRcdGFjdGlvbnMucG9wKCk7XHJcblxyXG5cdFx0YWN0aW9uLl9jYWNoZUluZGV4ID0gbnVsbDtcclxuXHJcblxyXG5cdFx0Y29uc3QgY2xpcFV1aWQgPSBhY3Rpb24uX2NsaXAudXVpZCxcclxuXHRcdFx0YWN0aW9uc0J5Q2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXAsXHJcblx0XHRcdGFjdGlvbnNGb3JDbGlwID0gYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXSxcclxuXHRcdFx0a25vd25BY3Rpb25zRm9yQ2xpcCA9IGFjdGlvbnNGb3JDbGlwLmtub3duQWN0aW9ucyxcclxuXHJcblx0XHRcdGxhc3RLbm93bkFjdGlvbiA9XHJcblx0XHRcdFx0a25vd25BY3Rpb25zRm9yQ2xpcFsga25vd25BY3Rpb25zRm9yQ2xpcC5sZW5ndGggLSAxIF0sXHJcblxyXG5cdFx0XHRieUNsaXBDYWNoZUluZGV4ID0gYWN0aW9uLl9ieUNsaXBDYWNoZUluZGV4O1xyXG5cclxuXHRcdGxhc3RLbm93bkFjdGlvbi5fYnlDbGlwQ2FjaGVJbmRleCA9IGJ5Q2xpcENhY2hlSW5kZXg7XHJcblx0XHRrbm93bkFjdGlvbnNGb3JDbGlwWyBieUNsaXBDYWNoZUluZGV4IF0gPSBsYXN0S25vd25BY3Rpb247XHJcblx0XHRrbm93bkFjdGlvbnNGb3JDbGlwLnBvcCgpO1xyXG5cclxuXHRcdGFjdGlvbi5fYnlDbGlwQ2FjaGVJbmRleCA9IG51bGw7XHJcblxyXG5cclxuXHRcdGNvbnN0IGFjdGlvbkJ5Um9vdCA9IGFjdGlvbnNGb3JDbGlwLmFjdGlvbkJ5Um9vdCxcclxuXHRcdFx0cm9vdFV1aWQgPSAoIGFjdGlvbi5fbG9jYWxSb290IHx8IHRoaXMuX3Jvb3QgKS51dWlkO1xyXG5cclxuXHRcdGRlbGV0ZSBhY3Rpb25CeVJvb3RbIHJvb3RVdWlkIF07XHJcblxyXG5cdFx0aWYgKCBrbm93bkFjdGlvbnNGb3JDbGlwLmxlbmd0aCA9PT0gMCApIHtcclxuXHJcblx0XHRcdGRlbGV0ZSBhY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uKCBhY3Rpb24gKTtcclxuXHJcblx0fVxyXG5cclxuXHRfcmVtb3ZlSW5hY3RpdmVCaW5kaW5nc0ZvckFjdGlvbiggYWN0aW9uICkge1xyXG5cclxuXHRcdGNvbnN0IGJpbmRpbmdzID0gYWN0aW9uLl9wcm9wZXJ0eUJpbmRpbmdzO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbiA9IGJpbmRpbmdzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcclxuXHJcblx0XHRcdGNvbnN0IGJpbmRpbmcgPSBiaW5kaW5nc1sgaSBdO1xyXG5cclxuXHRcdFx0aWYgKCAtLSBiaW5kaW5nLnJlZmVyZW5jZUNvdW50ID09PSAwICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmcoIGJpbmRpbmcgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0X2xlbmRBY3Rpb24oIGFjdGlvbiApIHtcclxuXHJcblx0XHQvLyBbIGFjdGl2ZSBhY3Rpb25zIHwgIGluYWN0aXZlIGFjdGlvbnMgIF1cclxuXHRcdC8vIFsgIGFjdGl2ZSBhY3Rpb25zID58IGluYWN0aXZlIGFjdGlvbnMgXVxyXG5cdFx0Ly8gICAgICAgICAgICAgICAgIHMgICAgICAgIGFcclxuXHRcdC8vICAgICAgICAgICAgICAgICAgPC1zd2FwLT5cclxuXHRcdC8vICAgICAgICAgICAgICAgICBhICAgICAgICBzXHJcblxyXG5cdFx0Y29uc3QgYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnMsXHJcblx0XHRcdHByZXZJbmRleCA9IGFjdGlvbi5fY2FjaGVJbmRleCxcclxuXHJcblx0XHRcdGxhc3RBY3RpdmVJbmRleCA9IHRoaXMuX25BY3RpdmVBY3Rpb25zICsrLFxyXG5cclxuXHRcdFx0Zmlyc3RJbmFjdGl2ZUFjdGlvbiA9IGFjdGlvbnNbIGxhc3RBY3RpdmVJbmRleCBdO1xyXG5cclxuXHRcdGFjdGlvbi5fY2FjaGVJbmRleCA9IGxhc3RBY3RpdmVJbmRleDtcclxuXHRcdGFjdGlvbnNbIGxhc3RBY3RpdmVJbmRleCBdID0gYWN0aW9uO1xyXG5cclxuXHRcdGZpcnN0SW5hY3RpdmVBY3Rpb24uX2NhY2hlSW5kZXggPSBwcmV2SW5kZXg7XHJcblx0XHRhY3Rpb25zWyBwcmV2SW5kZXggXSA9IGZpcnN0SW5hY3RpdmVBY3Rpb247XHJcblxyXG5cdH1cclxuXHJcblx0X3Rha2VCYWNrQWN0aW9uKCBhY3Rpb24gKSB7XHJcblxyXG5cdFx0Ly8gWyAgYWN0aXZlIGFjdGlvbnMgIHwgaW5hY3RpdmUgYWN0aW9ucyBdXHJcblx0XHQvLyBbIGFjdGl2ZSBhY3Rpb25zIHw8IGluYWN0aXZlIGFjdGlvbnMgIF1cclxuXHRcdC8vICAgICAgICBhICAgICAgICBzXHJcblx0XHQvLyAgICAgICAgIDwtc3dhcC0+XHJcblx0XHQvLyAgICAgICAgcyAgICAgICAgYVxyXG5cclxuXHRcdGNvbnN0IGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLFxyXG5cdFx0XHRwcmV2SW5kZXggPSBhY3Rpb24uX2NhY2hlSW5kZXgsXHJcblxyXG5cdFx0XHRmaXJzdEluYWN0aXZlSW5kZXggPSAtLSB0aGlzLl9uQWN0aXZlQWN0aW9ucyxcclxuXHJcblx0XHRcdGxhc3RBY3RpdmVBY3Rpb24gPSBhY3Rpb25zWyBmaXJzdEluYWN0aXZlSW5kZXggXTtcclxuXHJcblx0XHRhY3Rpb24uX2NhY2hlSW5kZXggPSBmaXJzdEluYWN0aXZlSW5kZXg7XHJcblx0XHRhY3Rpb25zWyBmaXJzdEluYWN0aXZlSW5kZXggXSA9IGFjdGlvbjtcclxuXHJcblx0XHRsYXN0QWN0aXZlQWN0aW9uLl9jYWNoZUluZGV4ID0gcHJldkluZGV4O1xyXG5cdFx0YWN0aW9uc1sgcHJldkluZGV4IF0gPSBsYXN0QWN0aXZlQWN0aW9uO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vIE1lbW9yeSBtYW5hZ2VtZW50IGZvciBQcm9wZXJ0eU1peGVyIG9iamVjdHNcclxuXHJcblx0X2FkZEluYWN0aXZlQmluZGluZyggYmluZGluZywgcm9vdFV1aWQsIHRyYWNrTmFtZSApIHtcclxuXHJcblx0XHRjb25zdCBiaW5kaW5nc0J5Um9vdCA9IHRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZSxcclxuXHRcdFx0YmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncztcclxuXHJcblx0XHRsZXQgYmluZGluZ0J5TmFtZSA9IGJpbmRpbmdzQnlSb290WyByb290VXVpZCBdO1xyXG5cclxuXHRcdGlmICggYmluZGluZ0J5TmFtZSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0YmluZGluZ0J5TmFtZSA9IHt9O1xyXG5cdFx0XHRiaW5kaW5nc0J5Um9vdFsgcm9vdFV1aWQgXSA9IGJpbmRpbmdCeU5hbWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGJpbmRpbmdCeU5hbWVbIHRyYWNrTmFtZSBdID0gYmluZGluZztcclxuXHJcblx0XHRiaW5kaW5nLl9jYWNoZUluZGV4ID0gYmluZGluZ3MubGVuZ3RoO1xyXG5cdFx0YmluZGluZ3MucHVzaCggYmluZGluZyApO1xyXG5cclxuXHR9XHJcblxyXG5cdF9yZW1vdmVJbmFjdGl2ZUJpbmRpbmcoIGJpbmRpbmcgKSB7XHJcblxyXG5cdFx0Y29uc3QgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncyxcclxuXHRcdFx0cHJvcEJpbmRpbmcgPSBiaW5kaW5nLmJpbmRpbmcsXHJcblx0XHRcdHJvb3RVdWlkID0gcHJvcEJpbmRpbmcucm9vdE5vZGUudXVpZCxcclxuXHRcdFx0dHJhY2tOYW1lID0gcHJvcEJpbmRpbmcucGF0aCxcclxuXHRcdFx0YmluZGluZ3NCeVJvb3QgPSB0aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUsXHJcblx0XHRcdGJpbmRpbmdCeU5hbWUgPSBiaW5kaW5nc0J5Um9vdFsgcm9vdFV1aWQgXSxcclxuXHJcblx0XHRcdGxhc3RJbmFjdGl2ZUJpbmRpbmcgPSBiaW5kaW5nc1sgYmluZGluZ3MubGVuZ3RoIC0gMSBdLFxyXG5cdFx0XHRjYWNoZUluZGV4ID0gYmluZGluZy5fY2FjaGVJbmRleDtcclxuXHJcblx0XHRsYXN0SW5hY3RpdmVCaW5kaW5nLl9jYWNoZUluZGV4ID0gY2FjaGVJbmRleDtcclxuXHRcdGJpbmRpbmdzWyBjYWNoZUluZGV4IF0gPSBsYXN0SW5hY3RpdmVCaW5kaW5nO1xyXG5cdFx0YmluZGluZ3MucG9wKCk7XHJcblxyXG5cdFx0ZGVsZXRlIGJpbmRpbmdCeU5hbWVbIHRyYWNrTmFtZSBdO1xyXG5cclxuXHRcdGlmICggT2JqZWN0LmtleXMoIGJpbmRpbmdCeU5hbWUgKS5sZW5ndGggPT09IDAgKSB7XHJcblxyXG5cdFx0XHRkZWxldGUgYmluZGluZ3NCeVJvb3RbIHJvb3RVdWlkIF07XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdF9sZW5kQmluZGluZyggYmluZGluZyApIHtcclxuXHJcblx0XHRjb25zdCBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxyXG5cdFx0XHRwcmV2SW5kZXggPSBiaW5kaW5nLl9jYWNoZUluZGV4LFxyXG5cclxuXHRcdFx0bGFzdEFjdGl2ZUluZGV4ID0gdGhpcy5fbkFjdGl2ZUJpbmRpbmdzICsrLFxyXG5cclxuXHRcdFx0Zmlyc3RJbmFjdGl2ZUJpbmRpbmcgPSBiaW5kaW5nc1sgbGFzdEFjdGl2ZUluZGV4IF07XHJcblxyXG5cdFx0YmluZGluZy5fY2FjaGVJbmRleCA9IGxhc3RBY3RpdmVJbmRleDtcclxuXHRcdGJpbmRpbmdzWyBsYXN0QWN0aXZlSW5kZXggXSA9IGJpbmRpbmc7XHJcblxyXG5cdFx0Zmlyc3RJbmFjdGl2ZUJpbmRpbmcuX2NhY2hlSW5kZXggPSBwcmV2SW5kZXg7XHJcblx0XHRiaW5kaW5nc1sgcHJldkluZGV4IF0gPSBmaXJzdEluYWN0aXZlQmluZGluZztcclxuXHJcblx0fVxyXG5cclxuXHRfdGFrZUJhY2tCaW5kaW5nKCBiaW5kaW5nICkge1xyXG5cclxuXHRcdGNvbnN0IGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsXHJcblx0XHRcdHByZXZJbmRleCA9IGJpbmRpbmcuX2NhY2hlSW5kZXgsXHJcblxyXG5cdFx0XHRmaXJzdEluYWN0aXZlSW5kZXggPSAtLSB0aGlzLl9uQWN0aXZlQmluZGluZ3MsXHJcblxyXG5cdFx0XHRsYXN0QWN0aXZlQmluZGluZyA9IGJpbmRpbmdzWyBmaXJzdEluYWN0aXZlSW5kZXggXTtcclxuXHJcblx0XHRiaW5kaW5nLl9jYWNoZUluZGV4ID0gZmlyc3RJbmFjdGl2ZUluZGV4O1xyXG5cdFx0YmluZGluZ3NbIGZpcnN0SW5hY3RpdmVJbmRleCBdID0gYmluZGluZztcclxuXHJcblx0XHRsYXN0QWN0aXZlQmluZGluZy5fY2FjaGVJbmRleCA9IHByZXZJbmRleDtcclxuXHRcdGJpbmRpbmdzWyBwcmV2SW5kZXggXSA9IGxhc3RBY3RpdmVCaW5kaW5nO1xyXG5cclxuXHR9XHJcblxyXG5cclxuXHQvLyBNZW1vcnkgbWFuYWdlbWVudCBvZiBJbnRlcnBvbGFudHMgZm9yIHdlaWdodCBhbmQgdGltZSBzY2FsZVxyXG5cclxuXHRfbGVuZENvbnRyb2xJbnRlcnBvbGFudCgpIHtcclxuXHJcblx0XHRjb25zdCBpbnRlcnBvbGFudHMgPSB0aGlzLl9jb250cm9sSW50ZXJwb2xhbnRzLFxyXG5cdFx0XHRsYXN0QWN0aXZlSW5kZXggPSB0aGlzLl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50cyArKztcclxuXHJcblx0XHRsZXQgaW50ZXJwb2xhbnQgPSBpbnRlcnBvbGFudHNbIGxhc3RBY3RpdmVJbmRleCBdO1xyXG5cclxuXHRcdGlmICggaW50ZXJwb2xhbnQgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGludGVycG9sYW50ID0gbmV3IExpbmVhckludGVycG9sYW50KFxyXG5cdFx0XHRcdG5ldyBGbG9hdDMyQXJyYXkoIDIgKSwgbmV3IEZsb2F0MzJBcnJheSggMiApLFxyXG5cdFx0XHRcdDEsIF9jb250cm9sSW50ZXJwb2xhbnRzUmVzdWx0QnVmZmVyICk7XHJcblxyXG5cdFx0XHRpbnRlcnBvbGFudC5fX2NhY2hlSW5kZXggPSBsYXN0QWN0aXZlSW5kZXg7XHJcblx0XHRcdGludGVycG9sYW50c1sgbGFzdEFjdGl2ZUluZGV4IF0gPSBpbnRlcnBvbGFudDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGludGVycG9sYW50O1xyXG5cclxuXHR9XHJcblxyXG5cdF90YWtlQmFja0NvbnRyb2xJbnRlcnBvbGFudCggaW50ZXJwb2xhbnQgKSB7XHJcblxyXG5cdFx0Y29uc3QgaW50ZXJwb2xhbnRzID0gdGhpcy5fY29udHJvbEludGVycG9sYW50cyxcclxuXHRcdFx0cHJldkluZGV4ID0gaW50ZXJwb2xhbnQuX19jYWNoZUluZGV4LFxyXG5cclxuXHRcdFx0Zmlyc3RJbmFjdGl2ZUluZGV4ID0gLS0gdGhpcy5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHMsXHJcblxyXG5cdFx0XHRsYXN0QWN0aXZlSW50ZXJwb2xhbnQgPSBpbnRlcnBvbGFudHNbIGZpcnN0SW5hY3RpdmVJbmRleCBdO1xyXG5cclxuXHRcdGludGVycG9sYW50Ll9fY2FjaGVJbmRleCA9IGZpcnN0SW5hY3RpdmVJbmRleDtcclxuXHRcdGludGVycG9sYW50c1sgZmlyc3RJbmFjdGl2ZUluZGV4IF0gPSBpbnRlcnBvbGFudDtcclxuXHJcblx0XHRsYXN0QWN0aXZlSW50ZXJwb2xhbnQuX19jYWNoZUluZGV4ID0gcHJldkluZGV4O1xyXG5cdFx0aW50ZXJwb2xhbnRzWyBwcmV2SW5kZXggXSA9IGxhc3RBY3RpdmVJbnRlcnBvbGFudDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIHtAbGluayBBbmltYXRpb25BY3Rpb259IGZvciB0aGUgcGFzc2VkIGNsaXAuXHJcblx0ICpcclxuXHQgKiBJZiBhbiBhY3Rpb24gZml0dGluZyB0aGUgY2xpcCBhbmQgcm9vdCBwYXJhbWV0ZXJzIGRvZXNuJ3QgeWV0IGV4aXN0LCBpdFxyXG5cdCAqIHdpbGwgYmUgY3JlYXRlZCBieSB0aGlzIG1ldGhvZC4gQ2FsbGluZyB0aGlzIG1ldGhvZCBzZXZlcmFsIHRpbWVzIHdpdGggdGhlXHJcblx0ICogc2FtZSBjbGlwIGFuZCByb290IHBhcmFtZXRlcnMgYWx3YXlzIHJldHVybnMgdGhlIHNhbWUgYWN0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBbmltYXRpb25DbGlwfHN0cmluZ30gY2xpcCAtIEFuIGFuaW1hdGlvbiBjbGlwIG9yIGFsdGVybmF0aXZlbHkgdGhlIG5hbWUgb2YgdGhlIGFuaW1hdGlvbiBjbGlwLlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0M0R9IFtvcHRpb25hbFJvb3RdIC0gQW4gYWx0ZXJuYXRpdmUgcm9vdCBvYmplY3QuXHJcblx0ICogQHBhcmFtIHsoTm9ybWFsQW5pbWF0aW9uQmxlbmRNb2RlfEFkZGl0aXZlQW5pbWF0aW9uQmxlbmRNb2RlKX0gW2JsZW5kTW9kZV0gLSBUaGUgYmxlbmQgbW9kZS5cclxuXHQgKiBAcmV0dXJuIHs/QW5pbWF0aW9uQWN0aW9ufSBUaGUgYW5pbWF0aW9uIGFjdGlvbi5cclxuXHQgKi9cclxuXHRjbGlwQWN0aW9uKCBjbGlwLCBvcHRpb25hbFJvb3QsIGJsZW5kTW9kZSApIHtcclxuXHJcblx0XHRjb25zdCByb290ID0gb3B0aW9uYWxSb290IHx8IHRoaXMuX3Jvb3QsXHJcblx0XHRcdHJvb3RVdWlkID0gcm9vdC51dWlkO1xyXG5cclxuXHRcdGxldCBjbGlwT2JqZWN0ID0gdHlwZW9mIGNsaXAgPT09ICdzdHJpbmcnID8gQW5pbWF0aW9uQ2xpcC5maW5kQnlOYW1lKCByb290LCBjbGlwICkgOiBjbGlwO1xyXG5cclxuXHRcdGNvbnN0IGNsaXBVdWlkID0gY2xpcE9iamVjdCAhPT0gbnVsbCA/IGNsaXBPYmplY3QudXVpZCA6IGNsaXA7XHJcblxyXG5cdFx0Y29uc3QgYWN0aW9uc0ZvckNsaXAgPSB0aGlzLl9hY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdO1xyXG5cdFx0bGV0IHByb3RvdHlwZUFjdGlvbiA9IG51bGw7XHJcblxyXG5cdFx0aWYgKCBibGVuZE1vZGUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGlmICggY2xpcE9iamVjdCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0YmxlbmRNb2RlID0gY2xpcE9iamVjdC5ibGVuZE1vZGU7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRibGVuZE1vZGUgPSBOb3JtYWxBbmltYXRpb25CbGVuZE1vZGU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggYWN0aW9uc0ZvckNsaXAgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGV4aXN0aW5nQWN0aW9uID0gYWN0aW9uc0ZvckNsaXAuYWN0aW9uQnlSb290WyByb290VXVpZCBdO1xyXG5cclxuXHRcdFx0aWYgKCBleGlzdGluZ0FjdGlvbiAhPT0gdW5kZWZpbmVkICYmIGV4aXN0aW5nQWN0aW9uLmJsZW5kTW9kZSA9PT0gYmxlbmRNb2RlICkge1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gZXhpc3RpbmdBY3Rpb247XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyB3ZSBrbm93IHRoZSBjbGlwLCBzbyB3ZSBkb24ndCBoYXZlIHRvIHBhcnNlIGFsbFxyXG5cdFx0XHQvLyB0aGUgYmluZGluZ3MgYWdhaW4gYnV0IGNhbiBqdXN0IGNvcHlcclxuXHRcdFx0cHJvdG90eXBlQWN0aW9uID0gYWN0aW9uc0ZvckNsaXAua25vd25BY3Rpb25zWyAwIF07XHJcblxyXG5cdFx0XHQvLyBhbHNvLCB0YWtlIHRoZSBjbGlwIGZyb20gdGhlIHByb3RvdHlwZSBhY3Rpb25cclxuXHRcdFx0aWYgKCBjbGlwT2JqZWN0ID09PSBudWxsIClcclxuXHRcdFx0XHRjbGlwT2JqZWN0ID0gcHJvdG90eXBlQWN0aW9uLl9jbGlwO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBjbGlwIG11c3QgYmUga25vd24gd2hlbiBzcGVjaWZpZWQgdmlhIHN0cmluZ1xyXG5cdFx0aWYgKCBjbGlwT2JqZWN0ID09PSBudWxsICkgcmV0dXJuIG51bGw7XHJcblxyXG5cdFx0Ly8gYWxsb2NhdGUgYWxsIHJlc291cmNlcyByZXF1aXJlZCB0byBydW4gaXRcclxuXHRcdGNvbnN0IG5ld0FjdGlvbiA9IG5ldyBBbmltYXRpb25BY3Rpb24oIHRoaXMsIGNsaXBPYmplY3QsIG9wdGlvbmFsUm9vdCwgYmxlbmRNb2RlICk7XHJcblxyXG5cdFx0dGhpcy5fYmluZEFjdGlvbiggbmV3QWN0aW9uLCBwcm90b3R5cGVBY3Rpb24gKTtcclxuXHJcblx0XHQvLyBhbmQgbWFrZSB0aGUgYWN0aW9uIGtub3duIHRvIHRoZSBtZW1vcnkgbWFuYWdlclxyXG5cdFx0dGhpcy5fYWRkSW5hY3RpdmVBY3Rpb24oIG5ld0FjdGlvbiwgY2xpcFV1aWQsIHJvb3RVdWlkICk7XHJcblxyXG5cdFx0cmV0dXJuIG5ld0FjdGlvbjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGFuIGV4aXN0aW5nIGFuaW1hdGlvbiBhY3Rpb24gZm9yIHRoZSBwYXNzZWQgY2xpcC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QW5pbWF0aW9uQ2xpcHxzdHJpbmd9IGNsaXAgLSBBbiBhbmltYXRpb24gY2xpcCBvciBhbHRlcm5hdGl2ZWx5IHRoZSBuYW1lIG9mIHRoZSBhbmltYXRpb24gY2xpcC5cclxuXHQgKiBAcGFyYW0ge09iamVjdDNEfSBbb3B0aW9uYWxSb290XSAtIEFuIGFsdGVybmF0aXZlIHJvb3Qgb2JqZWN0LlxyXG5cdCAqIEByZXR1cm4gez9BbmltYXRpb25BY3Rpb259IFRoZSBhbmltYXRpb24gYWN0aW9uLiBSZXR1cm5zIGBudWxsYCBpZiBubyBhY3Rpb24gd2FzIGZvdW5kLlxyXG5cdCAqL1xyXG5cdGV4aXN0aW5nQWN0aW9uKCBjbGlwLCBvcHRpb25hbFJvb3QgKSB7XHJcblxyXG5cdFx0Y29uc3Qgcm9vdCA9IG9wdGlvbmFsUm9vdCB8fCB0aGlzLl9yb290LFxyXG5cdFx0XHRyb290VXVpZCA9IHJvb3QudXVpZCxcclxuXHJcblx0XHRcdGNsaXBPYmplY3QgPSB0eXBlb2YgY2xpcCA9PT0gJ3N0cmluZycgP1xyXG5cdFx0XHRcdEFuaW1hdGlvbkNsaXAuZmluZEJ5TmFtZSggcm9vdCwgY2xpcCApIDogY2xpcCxcclxuXHJcblx0XHRcdGNsaXBVdWlkID0gY2xpcE9iamVjdCA/IGNsaXBPYmplY3QudXVpZCA6IGNsaXAsXHJcblxyXG5cdFx0XHRhY3Rpb25zRm9yQ2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07XHJcblxyXG5cdFx0aWYgKCBhY3Rpb25zRm9yQ2xpcCAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIGFjdGlvbnNGb3JDbGlwLmFjdGlvbkJ5Um9vdFsgcm9vdFV1aWQgXSB8fCBudWxsO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWFjdGl2YXRlcyBhbGwgcHJldmlvdXNseSBzY2hlZHVsZWQgYWN0aW9ucyBvbiB0aGlzIG1peGVyLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7QW5pbWF0aW9uTWl4ZXJ9IEEgcmVmZXJlbmNlIHRvIHRoaSBhbmltYXRpb24gbWl4ZXIuXHJcblx0ICovXHJcblx0c3RvcEFsbEFjdGlvbigpIHtcclxuXHJcblx0XHRjb25zdCBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucyxcclxuXHRcdFx0bkFjdGlvbnMgPSB0aGlzLl9uQWN0aXZlQWN0aW9ucztcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IG5BY3Rpb25zIC0gMTsgaSA+PSAwOyAtLSBpICkge1xyXG5cclxuXHRcdFx0YWN0aW9uc1sgaSBdLnN0b3AoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWR2YW5jZXMgdGhlIGdsb2JhbCBtaXhlciB0aW1lIGFuZCB1cGRhdGVzIHRoZSBhbmltYXRpb24uXHJcblx0ICpcclxuXHQgKiBUaGlzIGlzIHVzdWFsbHkgZG9uZSBpbiB0aGUgcmVuZGVyIGxvb3AgYnkgcGFzc2luZyB0aGUgZGVsdGFcclxuXHQgKiB0aW1lIGZyb20ge0BsaW5rIENsb2NrfSBvciB7QGxpbmsgVGltZXJ9LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGRlbHRhVGltZSAtIFRoZSBkZWx0YSB0aW1lIGluIHNlY29uZHMuXHJcblx0ICogQHJldHVybiB7QW5pbWF0aW9uTWl4ZXJ9IEEgcmVmZXJlbmNlIHRvIHRoaSBhbmltYXRpb24gbWl4ZXIuXHJcblx0ICovXHJcblx0dXBkYXRlKCBkZWx0YVRpbWUgKSB7XHJcblxyXG5cdFx0ZGVsdGFUaW1lICo9IHRoaXMudGltZVNjYWxlO1xyXG5cclxuXHRcdGNvbnN0IGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLFxyXG5cdFx0XHRuQWN0aW9ucyA9IHRoaXMuX25BY3RpdmVBY3Rpb25zLFxyXG5cclxuXHRcdFx0dGltZSA9IHRoaXMudGltZSArPSBkZWx0YVRpbWUsXHJcblx0XHRcdHRpbWVEaXJlY3Rpb24gPSBNYXRoLnNpZ24oIGRlbHRhVGltZSApLFxyXG5cclxuXHRcdFx0YWNjdUluZGV4ID0gdGhpcy5fYWNjdUluZGV4IF49IDE7XHJcblxyXG5cdFx0Ly8gcnVuIGFjdGl2ZSBhY3Rpb25zXHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpICE9PSBuQWN0aW9uczsgKysgaSApIHtcclxuXHJcblx0XHRcdGNvbnN0IGFjdGlvbiA9IGFjdGlvbnNbIGkgXTtcclxuXHJcblx0XHRcdGFjdGlvbi5fdXBkYXRlKCB0aW1lLCBkZWx0YVRpbWUsIHRpbWVEaXJlY3Rpb24sIGFjY3VJbmRleCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyB1cGRhdGUgc2NlbmUgZ3JhcGhcclxuXHJcblx0XHRjb25zdCBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxyXG5cdFx0XHRuQmluZGluZ3MgPSB0aGlzLl9uQWN0aXZlQmluZGluZ3M7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpICE9PSBuQmluZGluZ3M7ICsrIGkgKSB7XHJcblxyXG5cdFx0XHRiaW5kaW5nc1sgaSBdLmFwcGx5KCBhY2N1SW5kZXggKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZ2xvYmFsIG1peGVyIHRvIGEgc3BlY2lmaWMgdGltZSBhbmQgdXBkYXRlcyB0aGUgYW5pbWF0aW9uIGFjY29yZGluZ2x5LlxyXG5cdCAqXHJcblx0ICogVGhpcyBpcyB1c2VmdWwgd2hlbiB5b3UgbmVlZCB0byBqdW1wIHRvIGFuIGV4YWN0IHRpbWUgaW4gYW4gYW5pbWF0aW9uLiBUaGVcclxuXHQgKiBpbnB1dCBwYXJhbWV0ZXIgd2lsbCBiZSBzY2FsZWQgYnkge0BsaW5rIEFuaW1hdGlvbk1peGVyI3RpbWVTY2FsZX1cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lIC0gVGhlIHRpbWUgdG8gc2V0IGluIHNlY29uZHMuXHJcblx0ICogQHJldHVybiB7QW5pbWF0aW9uTWl4ZXJ9IEEgcmVmZXJlbmNlIHRvIHRoaSBhbmltYXRpb24gbWl4ZXIuXHJcblx0ICovXHJcblx0c2V0VGltZSggdGltZSApIHtcclxuXHJcblx0XHR0aGlzLnRpbWUgPSAwOyAvLyBaZXJvIG91dCB0aW1lIGF0dHJpYnV0ZSBmb3IgQW5pbWF0aW9uTWl4ZXIgb2JqZWN0O1xyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdGhpcy5fYWN0aW9ucy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHR0aGlzLl9hY3Rpb25zWyBpIF0udGltZSA9IDA7IC8vIFplcm8gb3V0IHRpbWUgYXR0cmlidXRlIGZvciBhbGwgYXNzb2NpYXRlZCBBbmltYXRpb25BY3Rpb24gb2JqZWN0cy5cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMudXBkYXRlKCB0aW1lICk7IC8vIFVwZGF0ZSB1c2VkIHRvIHNldCBleGFjdCB0aW1lLiBSZXR1cm5zIFwidGhpc1wiIEFuaW1hdGlvbk1peGVyIG9iamVjdC5cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoaXMgbWl4ZXIncyByb290IG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge09iamVjdDNEfSBUaGUgbWl4ZXIncyByb290IG9iamVjdC5cclxuXHQgKi9cclxuXHRnZXRSb290KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9yb290O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlYWxsb2NhdGVzIGFsbCBtZW1vcnkgcmVzb3VyY2VzIGZvciBhIGNsaXAuIEJlZm9yZSB1c2luZyB0aGlzIG1ldGhvZCBtYWtlXHJcblx0ICogc3VyZSB0byBjYWxsIHtAbGluayBBbmltYXRpb25BY3Rpb24jc3RvcH0gZm9yIGFsbCByZWxhdGVkIGFjdGlvbnMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FuaW1hdGlvbkNsaXB9IGNsaXAgLSBUaGUgY2xpcCB0byB1bmNhY2hlLlxyXG5cdCAqL1xyXG5cdHVuY2FjaGVDbGlwKCBjbGlwICkge1xyXG5cclxuXHRcdGNvbnN0IGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLFxyXG5cdFx0XHRjbGlwVXVpZCA9IGNsaXAudXVpZCxcclxuXHRcdFx0YWN0aW9uc0J5Q2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXAsXHJcblx0XHRcdGFjdGlvbnNGb3JDbGlwID0gYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXTtcclxuXHJcblx0XHRpZiAoIGFjdGlvbnNGb3JDbGlwICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHQvLyBub3RlOiBqdXN0IGNhbGxpbmcgX3JlbW92ZUluYWN0aXZlQWN0aW9uIHdvdWxkIG1lc3MgdXAgdGhlXHJcblx0XHRcdC8vIGl0ZXJhdGlvbiBzdGF0ZSBhbmQgYWxzbyByZXF1aXJlIHVwZGF0aW5nIHRoZSBzdGF0ZSB3ZSBjYW5cclxuXHRcdFx0Ly8ganVzdCB0aHJvdyBhd2F5XHJcblxyXG5cdFx0XHRjb25zdCBhY3Rpb25zVG9SZW1vdmUgPSBhY3Rpb25zRm9yQ2xpcC5rbm93bkFjdGlvbnM7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIG4gPSBhY3Rpb25zVG9SZW1vdmUubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBhY3Rpb24gPSBhY3Rpb25zVG9SZW1vdmVbIGkgXTtcclxuXHJcblx0XHRcdFx0dGhpcy5fZGVhY3RpdmF0ZUFjdGlvbiggYWN0aW9uICk7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGNhY2hlSW5kZXggPSBhY3Rpb24uX2NhY2hlSW5kZXgsXHJcblx0XHRcdFx0XHRsYXN0SW5hY3RpdmVBY3Rpb24gPSBhY3Rpb25zWyBhY3Rpb25zLmxlbmd0aCAtIDEgXTtcclxuXHJcblx0XHRcdFx0YWN0aW9uLl9jYWNoZUluZGV4ID0gbnVsbDtcclxuXHRcdFx0XHRhY3Rpb24uX2J5Q2xpcENhY2hlSW5kZXggPSBudWxsO1xyXG5cclxuXHRcdFx0XHRsYXN0SW5hY3RpdmVBY3Rpb24uX2NhY2hlSW5kZXggPSBjYWNoZUluZGV4O1xyXG5cdFx0XHRcdGFjdGlvbnNbIGNhY2hlSW5kZXggXSA9IGxhc3RJbmFjdGl2ZUFjdGlvbjtcclxuXHRcdFx0XHRhY3Rpb25zLnBvcCgpO1xyXG5cclxuXHRcdFx0XHR0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uKCBhY3Rpb24gKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGRlbGV0ZSBhY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWFsbG9jYXRlcyBhbGwgbWVtb3J5IHJlc291cmNlcyBmb3IgYSByb290IG9iamVjdC4gQmVmb3JlIHVzaW5nIHRoaXNcclxuXHQgKiBtZXRob2QgbWFrZSBzdXJlIHRvIGNhbGwge0BsaW5rIEFuaW1hdGlvbkFjdGlvbiNzdG9wfSBmb3IgYWxsIHJlbGF0ZWRcclxuXHQgKiBhY3Rpb25zIG9yIGFsdGVybmF0aXZlbHkge0BsaW5rIEFuaW1hdGlvbk1peGVyI3N0b3BBbGxBY3Rpb259IHdoZW4gdGhlXHJcblx0ICogbWl4ZXIgb3BlcmF0ZXMgb24gYSBzaW5nbGUgcm9vdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0M0R9IHJvb3QgLSBUaGUgcm9vdCBvYmplY3QgdG8gdW5jYWNoZS5cclxuXHQgKi9cclxuXHR1bmNhY2hlUm9vdCggcm9vdCApIHtcclxuXHJcblx0XHRjb25zdCByb290VXVpZCA9IHJvb3QudXVpZCxcclxuXHRcdFx0YWN0aW9uc0J5Q2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXA7XHJcblxyXG5cdFx0Zm9yICggY29uc3QgY2xpcFV1aWQgaW4gYWN0aW9uc0J5Q2xpcCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGFjdGlvbkJ5Um9vdCA9IGFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF0uYWN0aW9uQnlSb290LFxyXG5cdFx0XHRcdGFjdGlvbiA9IGFjdGlvbkJ5Um9vdFsgcm9vdFV1aWQgXTtcclxuXHJcblx0XHRcdGlmICggYWN0aW9uICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdHRoaXMuX2RlYWN0aXZhdGVBY3Rpb24oIGFjdGlvbiApO1xyXG5cdFx0XHRcdHRoaXMuX3JlbW92ZUluYWN0aXZlQWN0aW9uKCBhY3Rpb24gKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgYmluZGluZ3NCeVJvb3QgPSB0aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUsXHJcblx0XHRcdGJpbmRpbmdCeU5hbWUgPSBiaW5kaW5nc0J5Um9vdFsgcm9vdFV1aWQgXTtcclxuXHJcblx0XHRpZiAoIGJpbmRpbmdCeU5hbWUgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGZvciAoIGNvbnN0IHRyYWNrTmFtZSBpbiBiaW5kaW5nQnlOYW1lICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBiaW5kaW5nID0gYmluZGluZ0J5TmFtZVsgdHJhY2tOYW1lIF07XHJcblx0XHRcdFx0YmluZGluZy5yZXN0b3JlT3JpZ2luYWxTdGF0ZSgpO1xyXG5cdFx0XHRcdHRoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZyggYmluZGluZyApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWFsbG9jYXRlcyBhbGwgbWVtb3J5IHJlc291cmNlcyBmb3IgYW4gYWN0aW9uLiBUaGUgYWN0aW9uIGlzIGlkZW50aWZpZWQgYnkgdGhlXHJcblx0ICogZ2l2ZW4gY2xpcCBhbmQgYW4gb3B0aW9uYWwgcm9vdCBvYmplY3QuIEJlZm9yZSB1c2luZyB0aGlzIG1ldGhvZCBtYWtlXHJcblx0ICogc3VyZSB0byBjYWxsIHtAbGluayBBbmltYXRpb25BY3Rpb24jc3RvcH0gdG8gZGVhY3RpdmF0ZSB0aGUgYWN0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBbmltYXRpb25DbGlwfHN0cmluZ30gY2xpcCAtIEFuIGFuaW1hdGlvbiBjbGlwIG9yIGFsdGVybmF0aXZlbHkgdGhlIG5hbWUgb2YgdGhlIGFuaW1hdGlvbiBjbGlwLlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0M0R9IFtvcHRpb25hbFJvb3RdIC0gQW4gYWx0ZXJuYXRpdmUgcm9vdCBvYmplY3QuXHJcblx0ICovXHJcblx0dW5jYWNoZUFjdGlvbiggY2xpcCwgb3B0aW9uYWxSb290ICkge1xyXG5cclxuXHRcdGNvbnN0IGFjdGlvbiA9IHRoaXMuZXhpc3RpbmdBY3Rpb24oIGNsaXAsIG9wdGlvbmFsUm9vdCApO1xyXG5cclxuXHRcdGlmICggYWN0aW9uICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5fZGVhY3RpdmF0ZUFjdGlvbiggYWN0aW9uICk7XHJcblx0XHRcdHRoaXMuX3JlbW92ZUluYWN0aXZlQWN0aW9uKCBhY3Rpb24gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IEFuaW1hdGlvbk1peGVyIH07XHJcbiIsImltcG9ydCB7IFJlbmRlclRhcmdldCB9IGZyb20gJy4vUmVuZGVyVGFyZ2V0LmpzJztcclxuaW1wb3J0IHsgRGF0YTNEVGV4dHVyZSB9IGZyb20gJy4uL3RleHR1cmVzL0RhdGEzRFRleHR1cmUuanMnO1xyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgYSAzRCByZW5kZXIgdGFyZ2V0LlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgUmVuZGVyVGFyZ2V0XHJcbiAqL1xyXG5jbGFzcyBSZW5kZXJUYXJnZXQzRCBleHRlbmRzIFJlbmRlclRhcmdldCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgM0QgcmVuZGVyIHRhcmdldC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbd2lkdGg9MV0gLSBUaGUgd2lkdGggb2YgdGhlIHJlbmRlciB0YXJnZXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtoZWlnaHQ9MV0gLSBUaGUgaGVpZ2h0IG9mIHRoZSByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZGVwdGg9MV0gLSBUaGUgaGVpZ2h0IG9mIHRoZSByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyVGFyZ2V0fk9wdGlvbnN9IFtvcHRpb25zXSAtIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggd2lkdGggPSAxLCBoZWlnaHQgPSAxLCBkZXB0aCA9IDEsIG9wdGlvbnMgPSB7fSApIHtcclxuXHJcblx0XHRzdXBlciggd2lkdGgsIGhlaWdodCwgb3B0aW9ucyApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1JlbmRlclRhcmdldDNEID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLmRlcHRoID0gZGVwdGg7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBPdmVyd3JpdHRlbiB3aXRoIGEgZGlmZmVyZW50IHRleHR1cmUgdHlwZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7RGF0YTNEVGV4dHVyZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50ZXh0dXJlID0gbmV3IERhdGEzRFRleHR1cmUoIG51bGwsIHdpZHRoLCBoZWlnaHQsIGRlcHRoICk7XHJcblxyXG5cdFx0dGhpcy50ZXh0dXJlLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFJlbmRlclRhcmdldDNEIH07XHJcbiIsImltcG9ydCB7IFJlbmRlclRhcmdldCB9IGZyb20gJy4vUmVuZGVyVGFyZ2V0LmpzJztcclxuaW1wb3J0IHsgRGF0YUFycmF5VGV4dHVyZSB9IGZyb20gJy4uL3RleHR1cmVzL0RhdGFBcnJheVRleHR1cmUuanMnO1xyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgYW4gYXJyYXkgcmVuZGVyIHRhcmdldC5cclxuICpcclxuICogQGF1Z21lbnRzIFJlbmRlclRhcmdldFxyXG4gKi9cclxuY2xhc3MgUmVuZGVyVGFyZ2V0QXJyYXkgZXh0ZW5kcyBSZW5kZXJUYXJnZXQge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IDNEIHJlbmRlciB0YXJnZXQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3dpZHRoPTFdIC0gVGhlIHdpZHRoIG9mIHRoZSByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbaGVpZ2h0PTFdIC0gVGhlIGhlaWdodCBvZiB0aGUgcmVuZGVyIHRhcmdldC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2RlcHRoPTFdIC0gVGhlIGhlaWdodCBvZiB0aGUgcmVuZGVyIHRhcmdldC5cclxuXHQgKiBAcGFyYW0ge1JlbmRlclRhcmdldH5PcHRpb25zfSBbb3B0aW9uc10gLSBUaGUgY29uZmlndXJhdGlvbiBvYmplY3QuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHdpZHRoID0gMSwgaGVpZ2h0ID0gMSwgZGVwdGggPSAxLCBvcHRpb25zID0ge30gKSB7XHJcblxyXG5cdFx0c3VwZXIoIHdpZHRoLCBoZWlnaHQsIG9wdGlvbnMgKTtcclxuXHJcblx0XHR0aGlzLmlzUmVuZGVyVGFyZ2V0QXJyYXkgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMuZGVwdGggPSBkZXB0aDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIE92ZXJ3cml0dGVuIHdpdGggYSBkaWZmZXJlbnQgdGV4dHVyZSB0eXBlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtEYXRhQXJyYXlUZXh0dXJlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRleHR1cmUgPSBuZXcgRGF0YUFycmF5VGV4dHVyZSggbnVsbCwgd2lkdGgsIGhlaWdodCwgZGVwdGggKTtcclxuXHJcblx0XHR0aGlzLnRleHR1cmUuaXNSZW5kZXJUYXJnZXRUZXh0dXJlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgUmVuZGVyVGFyZ2V0QXJyYXkgfTtcclxuIiwiLyoqXHJcbiAqIFJlcHJlc2VudHMgYSB1bmlmb3JtIHdoaWNoIGlzIGEgZ2xvYmFsIHNoYWRlciB2YXJpYWJsZS4gVGhleSBhcmUgcGFzc2VkIHRvIHNoYWRlciBwcm9ncmFtcy5cclxuICpcclxuICogV2hlbiBkZWNsYXJpbmcgYSB1bmlmb3JtIG9mIGEge0BsaW5rIFNoYWRlck1hdGVyaWFsfSwgaXQgaXMgZGVjbGFyZWQgYnkgdmFsdWUgb3IgYnkgb2JqZWN0LlxyXG4gKiBgYGBqc1xyXG4gKiB1bmlmb3Jtczoge1xyXG4gKiBcdHRpbWU6IHsgdmFsdWU6IDEuMCB9LFxyXG4gKiBcdHJlc29sdXRpb246IG5ldyBVbmlmb3JtKCBuZXcgVmVjdG9yMigpIClcclxuICogfTtcclxuICogYGBgXHJcbiAqIFNpbmNlIHRoaXMgY2xhc3MgY2FuIG9ubHkgYmUgdXNlZCBpbiBjb250ZXh0IG9mIHtAbGluayBTaGFkZXJNYXRlcmlhbH0sIGl0IGlzIG9ubHkgc3VwcG9ydGVkXHJcbiAqIGluIHtAbGluayBXZWJHTFJlbmRlcmVyfS5cclxuICovXHJcbmNsYXNzIFVuaWZvcm0ge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHVuaWZvcm0uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBUaGUgdW5pZm9ybSB2YWx1ZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggdmFsdWUgKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdW5pZm9ybSB2YWx1ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7YW55fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnZhbHVlID0gdmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIG5ldyB1bmlmb3JtIHdpdGggY29waWVkIHZhbHVlcyBmcm9tIHRoaXMgaW5zdGFuY2UuXHJcblx0ICogSWYgdGhlIHZhbHVlIGhhcyBhIGBjbG9uZSgpYCBtZXRob2QsIHRoZSB2YWx1ZSBpcyBjbG9uZWQgYXMgd2VsbC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1VuaWZvcm19IEEgY2xvbmUgb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjbG9uZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IFVuaWZvcm0oIHRoaXMudmFsdWUuY2xvbmUgPT09IHVuZGVmaW5lZCA/IHRoaXMudmFsdWUgOiB0aGlzLnZhbHVlLmNsb25lKCkgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgVW5pZm9ybSB9O1xyXG4iLCJpbXBvcnQgeyBFdmVudERpc3BhdGNoZXIgfSBmcm9tICcuL0V2ZW50RGlzcGF0Y2hlci5qcyc7XHJcbmltcG9ydCB7IFN0YXRpY0RyYXdVc2FnZSB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XHJcblxyXG5sZXQgX2lkID0gMDtcclxuXHJcbi8qKlxyXG4gKiBBIGNsYXNzIGZvciBtYW5hZ2luZyBtdWx0aXBsZSB1bmlmb3JtcyBpbiBhIHNpbmdsZSBncm91cC4gVGhlIHJlbmRlcmVyIHdpbGwgcHJvY2Vzc1xyXG4gKiBzdWNoIGEgZGVmaW5pdGlvbiBhcyBhIHNpbmdsZSBVQk8uXHJcbiAqXHJcbiAqIFNpbmNlIHRoaXMgY2xhc3MgY2FuIG9ubHkgYmUgdXNlZCBpbiBjb250ZXh0IG9mIHtAbGluayBTaGFkZXJNYXRlcmlhbH0sIGl0IGlzIG9ubHkgc3VwcG9ydGVkXHJcbiAqIGluIHtAbGluayBXZWJHTFJlbmRlcmVyfS5cclxuICpcclxuICogQGF1Z21lbnRzIEV2ZW50RGlzcGF0Y2hlclxyXG4gKi9cclxuY2xhc3MgVW5pZm9ybXNHcm91cCBleHRlbmRzIEV2ZW50RGlzcGF0Y2hlciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgdW5pZm9ybXMgZ3JvdXAuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNVbmlmb3Jtc0dyb3VwID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBJRCBvZiB0aGUgM0Qgb2JqZWN0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEBuYW1lIFVuaWZvcm1zR3JvdXAjaWRcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqL1xyXG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCAnaWQnLCB7IHZhbHVlOiBfaWQgKysgfSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG5hbWUgb2YgdGhlIHVuaWZvcm1zIGdyb3VwLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubmFtZSA9ICcnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGJ1ZmZlciB1c2FnZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KFN0YXRpY0RyYXdVc2FnZXxEeW5hbWljRHJhd1VzYWdlfFN0cmVhbURyYXdVc2FnZXxTdGF0aWNSZWFkVXNhZ2V8RHluYW1pY1JlYWRVc2FnZXxTdHJlYW1SZWFkVXNhZ2V8U3RhdGljQ29weVVzYWdlfER5bmFtaWNDb3B5VXNhZ2V8U3RyZWFtQ29weVVzYWdlKX1cclxuXHRcdCAqIEBkZWZhdWx0IFN0YXRpY0RyYXdVc2FnZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVzYWdlID0gU3RhdGljRHJhd1VzYWdlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQW4gYXJyYXkgaG9sZGluZyB0aGUgdW5pZm9ybXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PFVuaWZvcm0+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVuaWZvcm1zID0gW107XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyB0aGUgZ2l2ZW4gdW5pZm9ybSB0byB0aGlzIHVuaWZvcm1zIGdyb3VwLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtVbmlmb3JtfSB1bmlmb3JtIC0gVGhlIHVuaWZvcm0gdG8gYWRkLlxyXG5cdCAqIEByZXR1cm4ge1VuaWZvcm1zR3JvdXB9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdW5pZm9ybXMgZ3JvdXAuXHJcblx0ICovXHJcblx0YWRkKCB1bmlmb3JtICkge1xyXG5cclxuXHRcdHRoaXMudW5pZm9ybXMucHVzaCggdW5pZm9ybSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbW92ZXMgdGhlIGdpdmVuIHVuaWZvcm0gZnJvbSB0aGlzIHVuaWZvcm1zIGdyb3VwLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtVbmlmb3JtfSB1bmlmb3JtIC0gVGhlIHVuaWZvcm0gdG8gcmVtb3ZlLlxyXG5cdCAqIEByZXR1cm4ge1VuaWZvcm1zR3JvdXB9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdW5pZm9ybXMgZ3JvdXAuXHJcblx0ICovXHJcblx0cmVtb3ZlKCB1bmlmb3JtICkge1xyXG5cclxuXHRcdGNvbnN0IGluZGV4ID0gdGhpcy51bmlmb3Jtcy5pbmRleE9mKCB1bmlmb3JtICk7XHJcblxyXG5cdFx0aWYgKCBpbmRleCAhPT0gLSAxICkgdGhpcy51bmlmb3Jtcy5zcGxpY2UoIGluZGV4LCAxICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgbmFtZSBvZiB0aGlzIHVuaWZvcm1zIGdyb3VwLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSB0byBzZXQuXHJcblx0ICogQHJldHVybiB7VW5pZm9ybXNHcm91cH0gQSByZWZlcmVuY2UgdG8gdGhpcyB1bmlmb3JtcyBncm91cC5cclxuXHQgKi9cclxuXHRzZXROYW1lKCBuYW1lICkge1xyXG5cclxuXHRcdHRoaXMubmFtZSA9IG5hbWU7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdXNhZ2Ugb2YgdGhpcyB1bmlmb3JtcyBncm91cC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7KFN0YXRpY0RyYXdVc2FnZXxEeW5hbWljRHJhd1VzYWdlfFN0cmVhbURyYXdVc2FnZXxTdGF0aWNSZWFkVXNhZ2V8RHluYW1pY1JlYWRVc2FnZXxTdHJlYW1SZWFkVXNhZ2V8U3RhdGljQ29weVVzYWdlfER5bmFtaWNDb3B5VXNhZ2V8U3RyZWFtQ29weVVzYWdlKX0gdmFsdWUgLSBUaGUgdXNhZ2UgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge1VuaWZvcm1zR3JvdXB9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdW5pZm9ybXMgZ3JvdXAuXHJcblx0ICovXHJcblx0c2V0VXNhZ2UoIHZhbHVlICkge1xyXG5cclxuXHRcdHRoaXMudXNhZ2UgPSB2YWx1ZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGcmVlcyB0aGUgR1BVLXJlbGF0ZWQgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGlzIGluc3RhbmNlLiBDYWxsIHRoaXNcclxuXHQgKiBtZXRob2Qgd2hlbmV2ZXIgdGhpcyBpbnN0YW5jZSBpcyBubyBsb25nZXIgdXNlZCBpbiB5b3VyIGFwcC5cclxuXHQgKlxyXG5cdCAqIEBmaXJlcyBUZXh0dXJlI2Rpc3Bvc2VcclxuXHQgKi9cclxuXHRkaXNwb3NlKCkge1xyXG5cclxuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnZGlzcG9zZScgfSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvcGllcyB0aGUgdmFsdWVzIG9mIHRoZSBnaXZlbiB1bmlmb3JtcyBncm91cCB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtVbmlmb3Jtc0dyb3VwfSBzb3VyY2UgLSBUaGUgdW5pZm9ybXMgZ3JvdXAgdG8gY29weS5cclxuXHQgKiBAcmV0dXJuIHtVbmlmb3Jtc0dyb3VwfSBBIHJlZmVyZW5jZSB0byB0aGlzIHVuaWZvcm1zIGdyb3VwLlxyXG5cdCAqL1xyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHR0aGlzLm5hbWUgPSBzb3VyY2UubmFtZTtcclxuXHRcdHRoaXMudXNhZ2UgPSBzb3VyY2UudXNhZ2U7XHJcblxyXG5cdFx0Y29uc3QgdW5pZm9ybXNTb3VyY2UgPSBzb3VyY2UudW5pZm9ybXM7XHJcblxyXG5cdFx0dGhpcy51bmlmb3Jtcy5sZW5ndGggPSAwO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHVuaWZvcm1zU291cmNlLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB1bmlmb3JtcyA9IEFycmF5LmlzQXJyYXkoIHVuaWZvcm1zU291cmNlWyBpIF0gKSA/IHVuaWZvcm1zU291cmNlWyBpIF0gOiBbIHVuaWZvcm1zU291cmNlWyBpIF0gXTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBqID0gMDsgaiA8IHVuaWZvcm1zLmxlbmd0aDsgaiArKyApIHtcclxuXHJcblx0XHRcdFx0dGhpcy51bmlmb3Jtcy5wdXNoKCB1bmlmb3Jtc1sgaiBdLmNsb25lKCkgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIG5ldyB1bmlmb3JtcyBncm91cCB3aXRoIGNvcGllZCB2YWx1ZXMgZnJvbSB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7VW5pZm9ybXNHcm91cH0gQSBjbG9uZSBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNsb25lKCkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgVW5pZm9ybXNHcm91cCB9O1xyXG4iLCJpbXBvcnQgeyBJbnRlcmxlYXZlZEJ1ZmZlciB9IGZyb20gJy4vSW50ZXJsZWF2ZWRCdWZmZXIuanMnO1xyXG5cclxuLyoqXHJcbiAqIEFuIGluc3RhbmNlZCB2ZXJzaW9uIG9mIGFuIGludGVybGVhdmVkIGJ1ZmZlci5cclxuICpcclxuICogQGF1Z21lbnRzIEludGVybGVhdmVkQnVmZmVyXHJcbiAqL1xyXG5jbGFzcyBJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlciBleHRlbmRzIEludGVybGVhdmVkQnVmZmVyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZWQgaW50ZXJsZWF2ZWQgYnVmZmVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUeXBlZEFycmF5fSBhcnJheSAtIEEgdHlwZWQgYXJyYXkgd2l0aCBhIHNoYXJlZCBidWZmZXIgc3RvcmluZyBhdHRyaWJ1dGUgZGF0YS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc3RyaWRlIC0gVGhlIG51bWJlciBvZiB0eXBlZC1hcnJheSBlbGVtZW50cyBwZXIgdmVydGV4LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbWVzaFBlckF0dHJpYnV0ZT0xXSAtIERlZmluZXMgaG93IG9mdGVuIGEgdmFsdWUgb2YgdGhpcyBpbnRlcmxlYXZlZCBidWZmZXIgc2hvdWxkIGJlIHJlcGVhdGVkLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBhcnJheSwgc3RyaWRlLCBtZXNoUGVyQXR0cmlidXRlID0gMSApIHtcclxuXHJcblx0XHRzdXBlciggYXJyYXksIHN0cmlkZSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0luc3RhbmNlZEludGVybGVhdmVkQnVmZmVyID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgaG93IG9mdGVuIGEgdmFsdWUgb2YgdGhpcyBidWZmZXIgYXR0cmlidXRlIHNob3VsZCBiZSByZXBlYXRlZCxcclxuXHRcdCAqIHNlZSB7QGxpbmsgSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlI21lc2hQZXJBdHRyaWJ1dGV9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWVzaFBlckF0dHJpYnV0ZSA9IG1lc2hQZXJBdHRyaWJ1dGU7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMubWVzaFBlckF0dHJpYnV0ZSA9IHNvdXJjZS5tZXNoUGVyQXR0cmlidXRlO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdGNsb25lKCBkYXRhICkge1xyXG5cclxuXHRcdGNvbnN0IGliID0gc3VwZXIuY2xvbmUoIGRhdGEgKTtcclxuXHJcblx0XHRpYi5tZXNoUGVyQXR0cmlidXRlID0gdGhpcy5tZXNoUGVyQXR0cmlidXRlO1xyXG5cclxuXHRcdHJldHVybiBpYjtcclxuXHJcblx0fVxyXG5cclxuXHR0b0pTT04oIGRhdGEgKSB7XHJcblxyXG5cdFx0Y29uc3QganNvbiA9IHN1cGVyLnRvSlNPTiggZGF0YSApO1xyXG5cclxuXHRcdGpzb24uaXNJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlciA9IHRydWU7XHJcblx0XHRqc29uLm1lc2hQZXJBdHRyaWJ1dGUgPSB0aGlzLm1lc2hQZXJBdHRyaWJ1dGU7XHJcblxyXG5cdFx0cmV0dXJuIGpzb247XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IEluc3RhbmNlZEludGVybGVhdmVkQnVmZmVyIH07XHJcbiIsIi8qKlxyXG4gKiBBbiBhbHRlcm5hdGl2ZSB2ZXJzaW9uIG9mIGEgYnVmZmVyIGF0dHJpYnV0ZSB3aXRoIG1vcmUgY29udHJvbCBvdmVyIHRoZSBWQk8uXHJcbiAqXHJcbiAqIFRoZSByZW5kZXJlciBkb2VzIG5vdCBjb25zdHJ1Y3QgYSBWQk8gZm9yIHRoaXMga2luZCBvZiBhdHRyaWJ1dGUuIEluc3RlYWQsIGl0IHVzZXNcclxuICogd2hhdGV2ZXIgVkJPIGlzIHBhc3NlZCBpbiBjb25zdHJ1Y3RvciBhbmQgY2FuIGxhdGVyIGJlIGFsdGVyZWQgdmlhIHRoZSBgYnVmZmVyYCBwcm9wZXJ0eS5cclxuICpcclxuICogVGhlIG1vc3QgY29tbW9uIHVzZSBjYXNlIGZvciB0aGlzIGNsYXNzIGlzIHdoZW4gc29tZSBraW5kIG9mIEdQR1BVIGNhbGN1bGF0aW9uIGludGVyZmVyZXNcclxuICogb3IgZXZlbiBwcm9kdWNlcyB0aGUgVkJPcyBpbiBxdWVzdGlvbi5cclxuICpcclxuICogTm90aWNlIHRoYXQgdGhpcyBjbGFzcyBjYW4gb25seSBiZSB1c2VkIHdpdGgge0BsaW5rIFdlYkdMUmVuZGVyZXJ9LlxyXG4gKi9cclxuY2xhc3MgR0xCdWZmZXJBdHRyaWJ1dGUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IEdMIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMQnVmZmVyfSBidWZmZXIgLSBUaGUgbmF0aXZlIFdlYkdMIGJ1ZmZlci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdHlwZSAtIFRoZSBuYXRpdmUgZGF0YSB0eXBlIChlLmcuIGBnbC5GTE9BVGApLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpdGVtU2l6ZSAtIFRoZSBpdGVtIHNpemUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGVsZW1lbnRTaXplIC0gVGhlIGNvcnJlc3BvbmRpbmcgc2l6ZSAoaW4gYnl0ZXMpIGZvciB0aGUgZ2l2ZW4gYHR5cGVgIHBhcmFtZXRlci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gY291bnQgLSBUaGUgZXhwZWN0ZWQgbnVtYmVyIG9mIHZlcnRpY2VzIGluIFZCTy5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggYnVmZmVyLCB0eXBlLCBpdGVtU2l6ZSwgZWxlbWVudFNpemUsIGNvdW50ICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0dMQnVmZmVyQXR0cmlidXRlID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBuYW1lIG9mIHRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubmFtZSA9ICcnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG5hdGl2ZSBXZWJHTCBidWZmZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1dlYkdMQnVmZmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBuYXRpdmUgZGF0YSB0eXBlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudHlwZSA9IHR5cGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgaXRlbSBzaXplLCBzZWUge0BsaW5rIEJ1ZmZlckF0dHJpYnV0ZSNpdGVtU2l6ZX0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pdGVtU2l6ZSA9IGl0ZW1TaXplO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNvcnJlc3BvbmRpbmcgc2l6ZSAoaW4gYnl0ZXMpIGZvciB0aGUgZ2l2ZW4gYHR5cGVgIHBhcmFtZXRlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmVsZW1lbnRTaXplID0gZWxlbWVudFNpemU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZXhwZWN0ZWQgbnVtYmVyIG9mIHZlcnRpY2VzIGluIFZCTy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvdW50ID0gY291bnQ7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHZlcnNpb24gbnVtYmVyLCBpbmNyZW1lbnRlZCBldmVyeSB0aW1lIHRoZSBgbmVlZHNVcGRhdGVgIGlzIHNldCB0byBgdHJ1ZWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52ZXJzaW9uID0gMDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGbGFnIHRvIGluZGljYXRlIHRoYXQgdGhpcyBhdHRyaWJ1dGUgaGFzIGNoYW5nZWQgYW5kIHNob3VsZCBiZSByZS1zZW50IHRvXHJcblx0ICogdGhlIEdQVS4gU2V0IHRoaXMgdG8gYHRydWVgIHdoZW4geW91IG1vZGlmeSB0aGUgdmFsdWUgb2YgdGhlIGFycmF5LlxyXG5cdCAqXHJcblx0ICogQHR5cGUge251bWJlcn1cclxuXHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsdWVcclxuXHQgKi9cclxuXHRzZXQgbmVlZHNVcGRhdGUoIHZhbHVlICkge1xyXG5cclxuXHRcdGlmICggdmFsdWUgPT09IHRydWUgKSB0aGlzLnZlcnNpb24gKys7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZ2l2ZW4gbmF0aXZlIFdlYkdMIGJ1ZmZlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xCdWZmZXJ9IGJ1ZmZlciAtIFRoZSBidWZmZXIgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge0J1ZmZlckF0dHJpYnV0ZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXRCdWZmZXIoIGJ1ZmZlciApIHtcclxuXHJcblx0XHR0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBnaXZlbiBuYXRpdmUgZGF0YSB0eXBlIGFuZCBlbGVtZW50IHNpemUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdHlwZSAtIFRoZSBuYXRpdmUgZGF0YSB0eXBlIChlLmcuIGBnbC5GTE9BVGApLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBlbGVtZW50U2l6ZSAtIFRoZSBjb3JyZXNwb25kaW5nIHNpemUgKGluIGJ5dGVzKSBmb3IgdGhlIGdpdmVuIGB0eXBlYCBwYXJhbWV0ZXIuXHJcblx0ICogQHJldHVybiB7QnVmZmVyQXR0cmlidXRlfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldFR5cGUoIHR5cGUsIGVsZW1lbnRTaXplICkge1xyXG5cclxuXHRcdHRoaXMudHlwZSA9IHR5cGU7XHJcblx0XHR0aGlzLmVsZW1lbnRTaXplID0gZWxlbWVudFNpemU7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgaXRlbSBzaXplLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGl0ZW1TaXplIC0gVGhlIGl0ZW0gc2l6ZS5cclxuXHQgKiBAcmV0dXJuIHtCdWZmZXJBdHRyaWJ1dGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0SXRlbVNpemUoIGl0ZW1TaXplICkge1xyXG5cclxuXHRcdHRoaXMuaXRlbVNpemUgPSBpdGVtU2l6ZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBjb3VudCAodGhlIGV4cGVjdGVkIG51bWJlciBvZiB2ZXJ0aWNlcyBpbiBWQk8pLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGNvdW50IC0gVGhlIGNvdW50LlxyXG5cdCAqIEByZXR1cm4ge0J1ZmZlckF0dHJpYnV0ZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXRDb3VudCggY291bnQgKSB7XHJcblxyXG5cdFx0dGhpcy5jb3VudCA9IGNvdW50O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBHTEJ1ZmZlckF0dHJpYnV0ZSB9O1xyXG4iLCJpbXBvcnQgeyBNYXRyaXg0IH0gZnJvbSAnLi4vbWF0aC9NYXRyaXg0LmpzJztcclxuaW1wb3J0IHsgUmF5IH0gZnJvbSAnLi4vbWF0aC9SYXkuanMnO1xyXG5pbXBvcnQgeyBMYXllcnMgfSBmcm9tICcuL0xheWVycy5qcyc7XHJcblxyXG5jb25zdCBfbWF0cml4ID0gLypAX19QVVJFX18qLyBuZXcgTWF0cml4NCgpO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgY2xhc3MgaXMgZGVzaWduZWQgdG8gYXNzaXN0IHdpdGggcmF5Y2FzdGluZy4gUmF5Y2FzdGluZyBpcyB1c2VkIGZvclxyXG4gKiBtb3VzZSBwaWNraW5nICh3b3JraW5nIG91dCB3aGF0IG9iamVjdHMgaW4gdGhlIDNkIHNwYWNlIHRoZSBtb3VzZSBpcyBvdmVyKVxyXG4gKiBhbW9uZ3N0IG90aGVyIHRoaW5ncy5cclxuICovXHJcbmNsYXNzIFJheWNhc3RlciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcmF5Y2FzdGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBvcmlnaW4gLSBUaGUgb3JpZ2luIHZlY3RvciB3aGVyZSB0aGUgcmF5IGNhc3RzIGZyb20uXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBkaXJlY3Rpb24gLSBUaGUgKG5vcm1hbGl6ZWQpIGRpcmVjdGlvbiB2ZWN0b3IgdGhhdCBnaXZlcyBkaXJlY3Rpb24gdG8gdGhlIHJheS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW25lYXI9MF0gLSBBbGwgcmVzdWx0cyByZXR1cm5lZCBhcmUgZnVydGhlciBhd2F5IHRoYW4gbmVhci4gTmVhciBjYW4ndCBiZSBuZWdhdGl2ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2Zhcj1JbmZpbml0eV0gLSBBbGwgcmVzdWx0cyByZXR1cm5lZCBhcmUgY2xvc2VyIHRoYW4gZmFyLiBGYXIgY2FuJ3QgYmUgbG93ZXIgdGhhbiBuZWFyLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBvcmlnaW4sIGRpcmVjdGlvbiwgbmVhciA9IDAsIGZhciA9IEluZmluaXR5ICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJheSB1c2VkIGZvciByYXljYXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtSYXl9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmF5ID0gbmV3IFJheSggb3JpZ2luLCBkaXJlY3Rpb24gKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFsbCByZXN1bHRzIHJldHVybmVkIGFyZSBmdXJ0aGVyIGF3YXkgdGhhbiBuZWFyLiBOZWFyIGNhbid0IGJlIG5lZ2F0aXZlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubmVhciA9IG5lYXI7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbGwgcmVzdWx0cyByZXR1cm5lZCBhcmUgZnVydGhlciBhd2F5IHRoYW4gbmVhci4gTmVhciBjYW4ndCBiZSBuZWdhdGl2ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgSW5maW5pdHlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5mYXIgPSBmYXI7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY2FtZXJhIHRvIHVzZSB3aGVuIHJheWNhc3RpbmcgYWdhaW5zdCB2aWV3LWRlcGVuZGVudCBvYmplY3RzIHN1Y2ggYXNcclxuXHRcdCAqIGJpbGxib2FyZGVkIG9iamVjdHMgbGlrZSBzcHJpdGVzLiBUaGlzIGZpZWxkIGNhbiBiZSBzZXQgbWFudWFsbHkgb3JcclxuXHRcdCAqIGlzIHNldCB3aGVuIGNhbGxpbmcgYHNldEZyb21DYW1lcmEoKWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9DYW1lcmF9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2FtZXJhID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFsbG93cyB0byBzZWxlY3RpdmVseSBpZ25vcmUgM0Qgb2JqZWN0cyB3aGVuIHBlcmZvcm1pbmcgaW50ZXJzZWN0aW9uIHRlc3RzLlxyXG5cdFx0ICogVGhlIGZvbGxvd2luZyBjb2RlIGV4YW1wbGUgZW5zdXJlcyB0aGF0IG9ubHkgM0Qgb2JqZWN0cyBvbiBsYXllciBgMWAgd2lsbCBiZVxyXG5cdFx0ICogaG9ub3JlZCBieSByYXljYXN0ZXIuXHJcblx0XHQgKiBgYGBqc1xyXG5cdFx0ICogcmF5Y2FzdGVyLmxheWVycy5zZXQoIDEgKTtcclxuXHRcdCAqIG9iamVjdC5sYXllcnMuZW5hYmxlKCAxICk7XHJcblx0XHQgKiBgYGBcclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7TGF5ZXJzfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxheWVycyA9IG5ldyBMYXllcnMoKTtcclxuXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHBhcmFtZXRlciBvYmplY3QgdGhhdCBjb25maWd1cmVzIHRoZSByYXljYXN0aW5nLiBJdCBoYXMgdGhlIHN0cnVjdHVyZTpcclxuXHRcdCAqXHJcblx0XHQgKiBgYGBcclxuXHRcdCAqIHtcclxuXHRcdCAqIFx0TWVzaDoge30sXHJcblx0XHQgKiBcdExpbmU6IHsgdGhyZXNob2xkOiAxIH0sXHJcblx0XHQgKiBcdExPRDoge30sXHJcblx0XHQgKiBcdFBvaW50czogeyB0aHJlc2hvbGQ6IDEgfSxcclxuXHRcdCAqIFx0U3ByaXRlOiB7fVxyXG5cdFx0ICogfVxyXG5cdFx0ICogYGBgXHJcblx0XHQgKiBXaGVyZSBgdGhyZXNob2xkYCBpcyB0aGUgcHJlY2lzaW9uIG9mIHRoZSByYXljYXN0ZXIgd2hlbiBpbnRlcnNlY3Rpbmcgb2JqZWN0cywgaW4gd29ybGQgdW5pdHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wYXJhbXMgPSB7XHJcblx0XHRcdE1lc2g6IHt9LFxyXG5cdFx0XHRMaW5lOiB7IHRocmVzaG9sZDogMSB9LFxyXG5cdFx0XHRMT0Q6IHt9LFxyXG5cdFx0XHRQb2ludHM6IHsgdGhyZXNob2xkOiAxIH0sXHJcblx0XHRcdFNwcml0ZToge31cclxuXHRcdH07XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgcmF5IHdpdGggYSBuZXcgb3JpZ2luIGFuZCBkaXJlY3Rpb24gYnkgY29weWluZyB0aGUgdmFsdWVzIGZyb20gdGhlIGFyZ3VtZW50cy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gb3JpZ2luIC0gVGhlIG9yaWdpbiB2ZWN0b3Igd2hlcmUgdGhlIHJheSBjYXN0cyBmcm9tLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gZGlyZWN0aW9uIC0gVGhlIChub3JtYWxpemVkKSBkaXJlY3Rpb24gdmVjdG9yIHRoYXQgZ2l2ZXMgZGlyZWN0aW9uIHRvIHRoZSByYXkuXHJcblx0ICovXHJcblx0c2V0KCBvcmlnaW4sIGRpcmVjdGlvbiApIHtcclxuXHJcblx0XHQvLyBkaXJlY3Rpb24gaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkIChmb3IgYWNjdXJhdGUgZGlzdGFuY2UgY2FsY3VsYXRpb25zKVxyXG5cclxuXHRcdHRoaXMucmF5LnNldCggb3JpZ2luLCBkaXJlY3Rpb24gKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVc2VzIHRoZSBnaXZlbiBjb29yZGluYXRlcyBhbmQgY2FtZXJhIHRvIGNvbXB1dGUgYSBuZXcgb3JpZ2luIGFuZCBkaXJlY3Rpb24gZm9yIHRoZSBpbnRlcm5hbCByYXkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IGNvb3JkcyAtIDJEIGNvb3JkaW5hdGVzIG9mIHRoZSBtb3VzZSwgaW4gbm9ybWFsaXplZCBkZXZpY2UgY29vcmRpbmF0ZXMgKE5EQykuXHJcblx0ICogWCBhbmQgWSBjb21wb25lbnRzIHNob3VsZCBiZSBiZXR3ZWVuIGAtMWAgYW5kIGAxYC5cclxuXHQgKiBAcGFyYW0ge0NhbWVyYX0gY2FtZXJhIC0gVGhlIGNhbWVyYSBmcm9tIHdoaWNoIHRoZSByYXkgc2hvdWxkIG9yaWdpbmF0ZS5cclxuXHQgKi9cclxuXHRzZXRGcm9tQ2FtZXJhKCBjb29yZHMsIGNhbWVyYSApIHtcclxuXHJcblx0XHRpZiAoIGNhbWVyYS5pc1BlcnNwZWN0aXZlQ2FtZXJhICkge1xyXG5cclxuXHRcdFx0dGhpcy5yYXkub3JpZ2luLnNldEZyb21NYXRyaXhQb3NpdGlvbiggY2FtZXJhLm1hdHJpeFdvcmxkICk7XHJcblx0XHRcdHRoaXMucmF5LmRpcmVjdGlvbi5zZXQoIGNvb3Jkcy54LCBjb29yZHMueSwgMC41ICkudW5wcm9qZWN0KCBjYW1lcmEgKS5zdWIoIHRoaXMucmF5Lm9yaWdpbiApLm5vcm1hbGl6ZSgpO1xyXG5cdFx0XHR0aGlzLmNhbWVyYSA9IGNhbWVyYTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBjYW1lcmEuaXNPcnRob2dyYXBoaWNDYW1lcmEgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnJheS5vcmlnaW4uc2V0KCBjb29yZHMueCwgY29vcmRzLnksICggY2FtZXJhLm5lYXIgKyBjYW1lcmEuZmFyICkgLyAoIGNhbWVyYS5uZWFyIC0gY2FtZXJhLmZhciApICkudW5wcm9qZWN0KCBjYW1lcmEgKTsgLy8gc2V0IG9yaWdpbiBpbiBwbGFuZSBvZiBjYW1lcmFcclxuXHRcdFx0dGhpcy5yYXkuZGlyZWN0aW9uLnNldCggMCwgMCwgLSAxICkudHJhbnNmb3JtRGlyZWN0aW9uKCBjYW1lcmEubWF0cml4V29ybGQgKTtcclxuXHRcdFx0dGhpcy5jYW1lcmEgPSBjYW1lcmE7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5SYXljYXN0ZXI6IFVuc3VwcG9ydGVkIGNhbWVyYSB0eXBlOiAnICsgY2FtZXJhLnR5cGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXNlcyB0aGUgZ2l2ZW4gV2ViWFIgY29udHJvbGxlciB0byBjb21wdXRlIGEgbmV3IG9yaWdpbiBhbmQgZGlyZWN0aW9uIGZvciB0aGUgaW50ZXJuYWwgcmF5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJYUkNvbnRyb2xsZXJ9IGNvbnRyb2xsZXIgLSBUaGUgY29udHJvbGxlciB0byBjb3B5IHRoZSBwb3NpdGlvbiBhbmQgZGlyZWN0aW9uIGZyb20uXHJcblx0ICogQHJldHVybiB7UmF5Y2FzdGVyfSBBIHJlZmVyZW5jZSB0byB0aGlzIHJheWNhc3Rlci5cclxuXHQgKi9cclxuXHRzZXRGcm9tWFJDb250cm9sbGVyKCBjb250cm9sbGVyICkge1xyXG5cclxuXHRcdF9tYXRyaXguaWRlbnRpdHkoKS5leHRyYWN0Um90YXRpb24oIGNvbnRyb2xsZXIubWF0cml4V29ybGQgKTtcclxuXHJcblx0XHR0aGlzLnJheS5vcmlnaW4uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBjb250cm9sbGVyLm1hdHJpeFdvcmxkICk7XHJcblx0XHR0aGlzLnJheS5kaXJlY3Rpb24uc2V0KCAwLCAwLCAtIDEgKS5hcHBseU1hdHJpeDQoIF9tYXRyaXggKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgaW50ZXJzZWN0aW9uIHBvaW50IG9mIGEgcmF5Y2FzdGVyIGludGVyc2VjdGlvbiB0ZXN0LlxyXG5cdCAqIEB0eXBlZGVmIHtPYmplY3R9IFJheWNhc3Rlcn5JbnRlcnNlY3Rpb25cclxuXHQgKiBAcHJvcGVydHkge251bWJlcn0gZGlzdGFuY2UgLSBUaGUgZGlzdGFuY2UgZnJvbSB0aGUgcmF5J3Mgb3JpZ2luIHRvIHRoZSBpbnRlcnNlY3Rpb24gcG9pbnQuXHJcblx0ICogQHByb3BlcnR5IHtudW1iZXJ9IGRpc3RhbmNlVG9SYXkgLSAgU29tZSAzRCBvYmplY3RzIGUuZy4ge0BsaW5rIFBvaW50c30gcHJvdmlkZSB0aGUgZGlzdGFuY2Ugb2YgdGhlXHJcblx0ICogaW50ZXJzZWN0aW9uIHRvIHRoZSBuZWFyZXN0IHBvaW50IG9uIHRoZSByYXkuIEZvciBvdGhlciBvYmplY3RzIGl0IHdpbGwgYmUgYHVuZGVmaW5lZGAuXHJcblx0ICogQHByb3BlcnR5IHtWZWN0b3IzfSBwb2ludCAtIFRoZSBpbnRlcnNlY3Rpb24gcG9pbnQsIGluIHdvcmxkIGNvb3JkaW5hdGVzLlxyXG5cdCAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBmYWNlIC0gVGhlIGZhY2UgdGhhdCBoYXMgYmVlbiBpbnRlcnNlY3RlZC5cclxuXHQgKiBAcHJvcGVydHkge251bWJlcn0gZmFjZUluZGV4IC0gVGhlIGZhY2UgaW5kZXguXHJcblx0ICogQHByb3BlcnR5IHtPYmplY3QzRH0gb2JqZWN0IC0gVGhlIDNEIG9iamVjdCB0aGF0IGhhcyBiZWVuIGludGVyc2VjdGVkLlxyXG5cdCAqIEBwcm9wZXJ0eSB7VmVjdG9yMn0gdXYgLSBVLFYgY29vcmRpbmF0ZXMgYXQgcG9pbnQgb2YgaW50ZXJzZWN0aW9uLlxyXG5cdCAqIEBwcm9wZXJ0eSB7VmVjdG9yMn0gdXYxIC0gU2Vjb25kIHNldCBvZiBVLFYgY29vcmRpbmF0ZXMgYXQgcG9pbnQgb2YgaW50ZXJzZWN0aW9uLlxyXG5cdCAqIEBwcm9wZXJ0eSB7VmVjdG9yM30gdXYxIC0gSW50ZXJwb2xhdGVkIG5vcm1hbCB2ZWN0b3IgYXQgcG9pbnQgb2YgaW50ZXJzZWN0aW9uLlxyXG5cdCAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBpbnN0YW5jZUlkIC0gVGhlIGluZGV4IG51bWJlciBvZiB0aGUgaW5zdGFuY2Ugd2hlcmUgdGhlIHJheVxyXG5cdCAqIGludGVyc2VjdHMgdGhlIHtAbGluayBJbnN0YW5jZWRNZXNofS5cclxuXHQgKi9cclxuXHJcblx0LyoqXHJcblx0ICogQ2hlY2tzIGFsbCBpbnRlcnNlY3Rpb24gYmV0d2VlbiB0aGUgcmF5IGFuZCB0aGUgb2JqZWN0IHdpdGggb3Igd2l0aG91dCB0aGVcclxuXHQgKiBkZXNjZW5kYW50cy4gSW50ZXJzZWN0aW9ucyBhcmUgcmV0dXJuZWQgc29ydGVkIGJ5IGRpc3RhbmNlLCBjbG9zZXN0IGZpcnN0LlxyXG5cdCAqXHJcblx0ICogYFJheWNhc3RlcmAgZGVsZWdhdGVzIHRvIHRoZSBgcmF5Y2FzdCgpYCBtZXRob2Qgb2YgdGhlIHBhc3NlZCAzRCBvYmplY3QsIHdoZW5cclxuXHQgKiBldmFsdWF0aW5nIHdoZXRoZXIgdGhlIHJheSBpbnRlcnNlY3RzIHRoZSBvYmplY3Qgb3Igbm90LiBUaGlzIGFsbG93cyBtZXNoZXMgdG8gcmVzcG9uZFxyXG5cdCAqIGRpZmZlcmVudGx5IHRvIHJheSBjYXN0aW5nIHRoYW4gbGluZXMgb3IgcG9pbnRzLlxyXG5cdCAqXHJcblx0ICogTm90ZSB0aGF0IGZvciBtZXNoZXMsIGZhY2VzIG11c3QgYmUgcG9pbnRlZCB0b3dhcmRzIHRoZSBvcmlnaW4gb2YgdGhlIHJheSBpbiBvcmRlclxyXG5cdCAqIHRvIGJlIGRldGVjdGVkOyBpbnRlcnNlY3Rpb25zIG9mIHRoZSByYXkgcGFzc2luZyB0aHJvdWdoIHRoZSBiYWNrIG9mIGEgZmFjZSB3aWxsIG5vdFxyXG5cdCAqIGJlIGRldGVjdGVkLiBUbyByYXljYXN0IGFnYWluc3QgYm90aCBmYWNlcyBvZiBhbiBvYmplY3QsIHlvdSdsbCB3YW50IHRvIHNldCAge0BsaW5rIE1hdGVyaWFsI3NpZGV9XHJcblx0ICogdG8gYFRIUkVFLkRvdWJsZVNpZGVgLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3QzRH0gb2JqZWN0IC0gVGhlIDNEIG9iamVjdCB0byBjaGVjayBmb3IgaW50ZXJzZWN0aW9uIHdpdGggdGhlIHJheS5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZWN1cnNpdmU9dHJ1ZV0gLSBJZiBzZXQgdG8gYHRydWVgLCBpdCBhbHNvIGNoZWNrcyBhbGwgZGVzY2VuZGFudHMuXHJcblx0ICogT3RoZXJ3aXNlIGl0IG9ubHkgY2hlY2tzIGludGVyc2VjdGlvbiB3aXRoIHRoZSBvYmplY3QuXHJcblx0ICogQHBhcmFtIHtBcnJheTxSYXljYXN0ZXJ+SW50ZXJzZWN0aW9uPn0gW2ludGVyc2VjdHM9W11dIFRoZSB0YXJnZXQgYXJyYXkgdGhhdCBob2xkcyB0aGUgcmVzdWx0IG9mIHRoZSBtZXRob2QuXHJcblx0ICogQHJldHVybiB7QXJyYXk8UmF5Y2FzdGVyfkludGVyc2VjdGlvbj59IEFuIGFycmF5IGhvbGRpbmcgdGhlIGludGVyc2VjdGlvbiBwb2ludHMuXHJcblx0ICovXHJcblx0aW50ZXJzZWN0T2JqZWN0KCBvYmplY3QsIHJlY3Vyc2l2ZSA9IHRydWUsIGludGVyc2VjdHMgPSBbXSApIHtcclxuXHJcblx0XHRpbnRlcnNlY3QoIG9iamVjdCwgdGhpcywgaW50ZXJzZWN0cywgcmVjdXJzaXZlICk7XHJcblxyXG5cdFx0aW50ZXJzZWN0cy5zb3J0KCBhc2NTb3J0ICk7XHJcblxyXG5cdFx0cmV0dXJuIGludGVyc2VjdHM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2hlY2tzIGFsbCBpbnRlcnNlY3Rpb24gYmV0d2VlbiB0aGUgcmF5IGFuZCB0aGUgb2JqZWN0cyB3aXRoIG9yIHdpdGhvdXRcclxuXHQgKiB0aGUgZGVzY2VuZGFudHMuIEludGVyc2VjdGlvbnMgYXJlIHJldHVybmVkIHNvcnRlZCBieSBkaXN0YW5jZSwgY2xvc2VzdCBmaXJzdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8T2JqZWN0M0Q+fSBvYmplY3RzIC0gVGhlIDNEIG9iamVjdHMgdG8gY2hlY2sgZm9yIGludGVyc2VjdGlvbiB3aXRoIHRoZSByYXkuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbcmVjdXJzaXZlPXRydWVdIC0gSWYgc2V0IHRvIGB0cnVlYCwgaXQgYWxzbyBjaGVja3MgYWxsIGRlc2NlbmRhbnRzLlxyXG5cdCAqIE90aGVyd2lzZSBpdCBvbmx5IGNoZWNrcyBpbnRlcnNlY3Rpb24gd2l0aCB0aGUgb2JqZWN0LlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8UmF5Y2FzdGVyfkludGVyc2VjdGlvbj59IFtpbnRlcnNlY3RzPVtdXSBUaGUgdGFyZ2V0IGFycmF5IHRoYXQgaG9sZHMgdGhlIHJlc3VsdCBvZiB0aGUgbWV0aG9kLlxyXG5cdCAqIEByZXR1cm4ge0FycmF5PFJheWNhc3Rlcn5JbnRlcnNlY3Rpb24+fSBBbiBhcnJheSBob2xkaW5nIHRoZSBpbnRlcnNlY3Rpb24gcG9pbnRzLlxyXG5cdCAqL1xyXG5cdGludGVyc2VjdE9iamVjdHMoIG9iamVjdHMsIHJlY3Vyc2l2ZSA9IHRydWUsIGludGVyc2VjdHMgPSBbXSApIHtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBvYmplY3RzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRpbnRlcnNlY3QoIG9iamVjdHNbIGkgXSwgdGhpcywgaW50ZXJzZWN0cywgcmVjdXJzaXZlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGludGVyc2VjdHMuc29ydCggYXNjU29ydCApO1xyXG5cclxuXHRcdHJldHVybiBpbnRlcnNlY3RzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBhc2NTb3J0KCBhLCBiICkge1xyXG5cclxuXHRyZXR1cm4gYS5kaXN0YW5jZSAtIGIuZGlzdGFuY2U7XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBpbnRlcnNlY3QoIG9iamVjdCwgcmF5Y2FzdGVyLCBpbnRlcnNlY3RzLCByZWN1cnNpdmUgKSB7XHJcblxyXG5cdGxldCBwcm9wYWdhdGUgPSB0cnVlO1xyXG5cclxuXHRpZiAoIG9iamVjdC5sYXllcnMudGVzdCggcmF5Y2FzdGVyLmxheWVycyApICkge1xyXG5cclxuXHRcdGNvbnN0IHJlc3VsdCA9IG9iamVjdC5yYXljYXN0KCByYXljYXN0ZXIsIGludGVyc2VjdHMgKTtcclxuXHJcblx0XHRpZiAoIHJlc3VsdCA9PT0gZmFsc2UgKSBwcm9wYWdhdGUgPSBmYWxzZTtcclxuXHJcblx0fVxyXG5cclxuXHRpZiAoIHByb3BhZ2F0ZSA9PT0gdHJ1ZSAmJiByZWN1cnNpdmUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0Y29uc3QgY2hpbGRyZW4gPSBvYmplY3QuY2hpbGRyZW47XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGludGVyc2VjdCggY2hpbGRyZW5bIGkgXSwgcmF5Y2FzdGVyLCBpbnRlcnNlY3RzLCB0cnVlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBSYXljYXN0ZXIgfTtcclxuIiwiaW1wb3J0IHsgY2xhbXAgfSBmcm9tICcuL01hdGhVdGlscy5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byByZXByZXNlbnQgcG9pbnRzIGluIDNEIHNwYWNlIGFzXHJcbiAqIFtTcGhlcmljYWwgY29vcmRpbmF0ZXNde0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NwaGVyaWNhbF9jb29yZGluYXRlX3N5c3RlbX0uXHJcbiAqL1xyXG5jbGFzcyBTcGhlcmljYWwge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHNwaGVyaWNhbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbcmFkaXVzPTFdIC0gVGhlIHJhZGl1cywgb3IgdGhlIEV1Y2xpZGVhbiBkaXN0YW5jZSAoc3RyYWlnaHQtbGluZSBkaXN0YW5jZSkgZnJvbSB0aGUgcG9pbnQgdG8gdGhlIG9yaWdpbi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3BoaT0wXSAtIFRoZSBwb2xhciBhbmdsZSBpbiByYWRpYW5zIGZyb20gdGhlIHkgKHVwKSBheGlzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbdGhldGE9MF0gLSBUaGUgZXF1YXRvci9hemltdXRoYWwgYW5nbGUgaW4gcmFkaWFucyBhcm91bmQgdGhlIHkgKHVwKSBheGlzLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCByYWRpdXMgPSAxLCBwaGkgPSAwLCB0aGV0YSA9IDAgKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcmFkaXVzLCBvciB0aGUgRXVjbGlkZWFuIGRpc3RhbmNlIChzdHJhaWdodC1saW5lIGRpc3RhbmNlKSBmcm9tIHRoZSBwb2ludCB0byB0aGUgb3JpZ2luLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmFkaXVzID0gcmFkaXVzO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHBvbGFyIGFuZ2xlIGluIHJhZGlhbnMgZnJvbSB0aGUgeSAodXApIGF4aXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5waGkgPSBwaGk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZXF1YXRvci9hemltdXRoYWwgYW5nbGUgaW4gcmFkaWFucyBhcm91bmQgdGhlIHkgKHVwKSBheGlzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudGhldGEgPSB0aGV0YTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBzcGhlcmljYWwgY29tcG9uZW50cyBieSBjb3B5aW5nIHRoZSBnaXZlbiB2YWx1ZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gcmFkaXVzIC0gVGhlIHJhZGl1cy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gcGhpIC0gVGhlIHBvbGFyIGFuZ2xlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0aGV0YSAtIFRoZSBhemltdXRoYWwgYW5nbGUuXHJcblx0ICogQHJldHVybiB7U3BoZXJpY2FsfSBBIHJlZmVyZW5jZSB0byB0aGlzIHNwaGVyaWNhbC5cclxuXHQgKi9cclxuXHRzZXQoIHJhZGl1cywgcGhpLCB0aGV0YSApIHtcclxuXHJcblx0XHR0aGlzLnJhZGl1cyA9IHJhZGl1cztcclxuXHRcdHRoaXMucGhpID0gcGhpO1xyXG5cdFx0dGhpcy50aGV0YSA9IHRoZXRhO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvcGllcyB0aGUgdmFsdWVzIG9mIHRoZSBnaXZlbiBzcGhlcmljYWwgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7U3BoZXJpY2FsfSBvdGhlciAtIFRoZSBzcGhlcmljYWwgdG8gY29weS5cclxuXHQgKiBAcmV0dXJuIHtTcGhlcmljYWx9IEEgcmVmZXJlbmNlIHRvIHRoaXMgc3BoZXJpY2FsLlxyXG5cdCAqL1xyXG5cdGNvcHkoIG90aGVyICkge1xyXG5cclxuXHRcdHRoaXMucmFkaXVzID0gb3RoZXIucmFkaXVzO1xyXG5cdFx0dGhpcy5waGkgPSBvdGhlci5waGk7XHJcblx0XHR0aGlzLnRoZXRhID0gb3RoZXIudGhldGE7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVzdHJpY3RzIHRoZSBwb2xhciBhbmdsZSBbcGFnZToucGhpIHBoaV0gdG8gYmUgYmV0d2VlbiBgMC4wMDAwMDFgIGFuZCBwaSAtXHJcblx0ICogYDAuMDAwMDAxYC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1NwaGVyaWNhbH0gQSByZWZlcmVuY2UgdG8gdGhpcyBzcGhlcmljYWwuXHJcblx0ICovXHJcblx0bWFrZVNhZmUoKSB7XHJcblxyXG5cdFx0Y29uc3QgRVBTID0gMC4wMDAwMDE7XHJcblx0XHR0aGlzLnBoaSA9IGNsYW1wKCB0aGlzLnBoaSwgRVBTLCBNYXRoLlBJIC0gRVBTICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgc3BoZXJpY2FsIGNvbXBvbmVudHMgZnJvbSB0aGUgZ2l2ZW4gdmVjdG9yIHdoaWNoIGlzIGFzc3VtZWQgdG8gaG9sZFxyXG5cdCAqIENhcnRlc2lhbiBjb29yZGluYXRlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdiAtIFRoZSB2ZWN0b3IgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge1NwaGVyaWNhbH0gQSByZWZlcmVuY2UgdG8gdGhpcyBzcGhlcmljYWwuXHJcblx0ICovXHJcblx0c2V0RnJvbVZlY3RvcjMoIHYgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuc2V0RnJvbUNhcnRlc2lhbkNvb3Jkcyggdi54LCB2LnksIHYueiApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHNwaGVyaWNhbCBjb21wb25lbnRzIGZyb20gdGhlIGdpdmVuIENhcnRlc2lhbiBjb29yZGluYXRlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHggdmFsdWUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgeCB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geiAtIFRoZSB4IHZhbHVlLlxyXG5cdCAqIEByZXR1cm4ge1NwaGVyaWNhbH0gQSByZWZlcmVuY2UgdG8gdGhpcyBzcGhlcmljYWwuXHJcblx0ICovXHJcblx0c2V0RnJvbUNhcnRlc2lhbkNvb3JkcyggeCwgeSwgeiApIHtcclxuXHJcblx0XHR0aGlzLnJhZGl1cyA9IE1hdGguc3FydCggeCAqIHggKyB5ICogeSArIHogKiB6ICk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLnJhZGl1cyA9PT0gMCApIHtcclxuXHJcblx0XHRcdHRoaXMudGhldGEgPSAwO1xyXG5cdFx0XHR0aGlzLnBoaSA9IDA7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHRoaXMudGhldGEgPSBNYXRoLmF0YW4yKCB4LCB6ICk7XHJcblx0XHRcdHRoaXMucGhpID0gTWF0aC5hY29zKCBjbGFtcCggeSAvIHRoaXMucmFkaXVzLCAtIDEsIDEgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbmV3IHNwaGVyaWNhbCB3aXRoIGNvcGllZCB2YWx1ZXMgZnJvbSB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7U3BoZXJpY2FsfSBBIGNsb25lIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y2xvbmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBTcGhlcmljYWwgfTtcclxuIiwiLyoqXHJcbiAqIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgdG8gcmVwcmVzZW50IHBvaW50cyBpbiAzRCBzcGFjZSBhc1xyXG4gKiBbQ3lsaW5kcmljYWwgY29vcmRpbmF0ZXNde0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0N5bGluZHJpY2FsX2Nvb3JkaW5hdGVfc3lzdGVtfS5cclxuICovXHJcbmNsYXNzIEN5bGluZHJpY2FsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBjeWxpbmRyaWNhbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbcmFkaXVzPTFdIC0gVGhlIGRpc3RhbmNlIGZyb20gdGhlIG9yaWdpbiB0byBhIHBvaW50IGluIHRoZSB4LXogcGxhbmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt0aGV0YT0wXSAtIEEgY291bnRlcmNsb2Nrd2lzZSBhbmdsZSBpbiB0aGUgeC16IHBsYW5lIG1lYXN1cmVkIGluIHJhZGlhbnMgZnJvbSB0aGUgcG9zaXRpdmUgei1heGlzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbeT0wXSAtIFRoZSBoZWlnaHQgYWJvdmUgdGhlIHgteiBwbGFuZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcmFkaXVzID0gMSwgdGhldGEgPSAwLCB5ID0gMCApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBkaXN0YW5jZSBmcm9tIHRoZSBvcmlnaW4gdG8gYSBwb2ludCBpbiB0aGUgeC16IHBsYW5lLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmFkaXVzID0gcmFkaXVzO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBjb3VudGVyY2xvY2t3aXNlIGFuZ2xlIGluIHRoZSB4LXogcGxhbmUgbWVhc3VyZWQgaW4gcmFkaWFucyBmcm9tIHRoZSBwb3NpdGl2ZSB6LWF4aXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50aGV0YSA9IHRoZXRhO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGhlaWdodCBhYm92ZSB0aGUgeC16IHBsYW5lLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMueSA9IHk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgY3lsaW5kcmljYWwgY29tcG9uZW50cyBieSBjb3B5aW5nIHRoZSBnaXZlbiB2YWx1ZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gcmFkaXVzIC0gVGhlIHJhZGl1cy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdGhldGEgLSBUaGUgdGhldGEgYW5nbGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgaGVpZ2h0IHZhbHVlLlxyXG5cdCAqIEByZXR1cm4ge0N5bGluZHJpY2FsfSBBIHJlZmVyZW5jZSB0byB0aGlzIGN5bGluZHJpY2FsLlxyXG5cdCAqL1xyXG5cdHNldCggcmFkaXVzLCB0aGV0YSwgeSApIHtcclxuXHJcblx0XHR0aGlzLnJhZGl1cyA9IHJhZGl1cztcclxuXHRcdHRoaXMudGhldGEgPSB0aGV0YTtcclxuXHRcdHRoaXMueSA9IHk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29waWVzIHRoZSB2YWx1ZXMgb2YgdGhlIGdpdmVuIGN5bGluZHJpY2FsIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0N5bGluZHJpY2FsfSBvdGhlciAtIFRoZSBjeWxpbmRyaWNhbCB0byBjb3B5LlxyXG5cdCAqIEByZXR1cm4ge0N5bGluZHJpY2FsfSBBIHJlZmVyZW5jZSB0byB0aGlzIGN5bGluZHJpY2FsLlxyXG5cdCAqL1xyXG5cdGNvcHkoIG90aGVyICkge1xyXG5cclxuXHRcdHRoaXMucmFkaXVzID0gb3RoZXIucmFkaXVzO1xyXG5cdFx0dGhpcy50aGV0YSA9IG90aGVyLnRoZXRhO1xyXG5cdFx0dGhpcy55ID0gb3RoZXIueTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBjeWxpbmRyaWNhbCBjb21wb25lbnRzIGZyb20gdGhlIGdpdmVuIHZlY3RvciB3aGljaCBpcyBhc3N1bWVkIHRvIGhvbGRcclxuXHQgKiBDYXJ0ZXNpYW4gY29vcmRpbmF0ZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHYgLSBUaGUgdmVjdG9yIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtDeWxpbmRyaWNhbH0gQSByZWZlcmVuY2UgdG8gdGhpcyBjeWxpbmRyaWNhbC5cclxuXHQgKi9cclxuXHRzZXRGcm9tVmVjdG9yMyggdiApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5zZXRGcm9tQ2FydGVzaWFuQ29vcmRzKCB2LngsIHYueSwgdi56ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgY3lsaW5kcmljYWwgY29tcG9uZW50cyBmcm9tIHRoZSBnaXZlbiBDYXJ0ZXNpYW4gY29vcmRpbmF0ZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB4IHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHggdmFsdWUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHogLSBUaGUgeCB2YWx1ZS5cclxuXHQgKiBAcmV0dXJuIHtDeWxpbmRyaWNhbH0gQSByZWZlcmVuY2UgdG8gdGhpcyBjeWxpbmRyaWNhbC5cclxuXHQgKi9cclxuXHRzZXRGcm9tQ2FydGVzaWFuQ29vcmRzKCB4LCB5LCB6ICkge1xyXG5cclxuXHRcdHRoaXMucmFkaXVzID0gTWF0aC5zcXJ0KCB4ICogeCArIHogKiB6ICk7XHJcblx0XHR0aGlzLnRoZXRhID0gTWF0aC5hdGFuMiggeCwgeiApO1xyXG5cdFx0dGhpcy55ID0geTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbmV3IGN5bGluZHJpY2FsIHdpdGggY29waWVkIHZhbHVlcyBmcm9tIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtDeWxpbmRyaWNhbH0gQSBjbG9uZSBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNsb25lKCkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgQ3lsaW5kcmljYWwgfTtcclxuIiwiLyoqXHJcbiAqIFJlcHJlc2VudHMgYSAyeDIgbWF0cml4LlxyXG4gKlxyXG4gKiBBIE5vdGUgb24gUm93LU1ham9yIGFuZCBDb2x1bW4tTWFqb3IgT3JkZXJpbmc6XHJcbiAqXHJcbiAqIFRoZSBjb25zdHJ1Y3RvciBhbmQge0BsaW5rIE1hdHJpeDIjc2V0fSBtZXRob2QgdGFrZSBhcmd1bWVudHMgaW5cclxuICogW3Jvdy1tYWpvcl17QGxpbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUm93LV9hbmRfY29sdW1uLW1ham9yX29yZGVyI0NvbHVtbi1tYWpvcl9vcmRlcn1cclxuICogb3JkZXIsIHdoaWxlIGludGVybmFsbHkgdGhleSBhcmUgc3RvcmVkIGluIHRoZSB7QGxpbmsgTWF0cml4MiNlbGVtZW50c30gYXJyYXkgaW4gY29sdW1uLW1ham9yIG9yZGVyLlxyXG4gKiBUaGlzIG1lYW5zIHRoYXQgY2FsbGluZzpcclxuICogYGBganNcclxuICogY29uc3QgbSA9IG5ldyBUSFJFRS5NYXRyaXgyKCk7XHJcbiAqIG0uc2V0KCAxMSwgMTIsXHJcbiAqICAgICAgICAyMSwgMjIgKTtcclxuICogYGBgXHJcbiAqIHdpbGwgcmVzdWx0IGluIHRoZSBlbGVtZW50cyBhcnJheSBjb250YWluaW5nOlxyXG4gKiBgYGBqc1xyXG4gKiBtLmVsZW1lbnRzID0gWyAxMSwgMjEsXHJcbiAqICAgICAgICAgICAgICAgIDEyLCAyMiBdO1xyXG4gKiBgYGBcclxuICogYW5kIGludGVybmFsbHkgYWxsIGNhbGN1bGF0aW9ucyBhcmUgcGVyZm9ybWVkIHVzaW5nIGNvbHVtbi1tYWpvciBvcmRlcmluZy5cclxuICogSG93ZXZlciwgYXMgdGhlIGFjdHVhbCBvcmRlcmluZyBtYWtlcyBubyBkaWZmZXJlbmNlIG1hdGhlbWF0aWNhbGx5IGFuZFxyXG4gKiBtb3N0IHBlb3BsZSBhcmUgdXNlZCB0byB0aGlua2luZyBhYm91dCBtYXRyaWNlcyBpbiByb3ctbWFqb3Igb3JkZXIsIHRoZVxyXG4gKiB0aHJlZS5qcyBkb2N1bWVudGF0aW9uIHNob3dzIG1hdHJpY2VzIGluIHJvdy1tYWpvciBvcmRlci4gSnVzdCBiZWFyIGluXHJcbiAqIG1pbmQgdGhhdCBpZiB5b3UgYXJlIHJlYWRpbmcgdGhlIHNvdXJjZSBjb2RlLCB5b3UnbGwgaGF2ZSB0byB0YWtlIHRoZVxyXG4gKiB0cmFuc3Bvc2Ugb2YgYW55IG1hdHJpY2VzIG91dGxpbmVkIGhlcmUgdG8gbWFrZSBzZW5zZSBvZiB0aGUgY2FsY3VsYXRpb25zLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIE1hdHJpeDIge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IDJ4MiBtYXRyaXguIFRoZSBhcmd1bWVudHMgYXJlIHN1cHBvc2VkIHRvIGJlXHJcblx0ICogaW4gcm93LW1ham9yIG9yZGVyLiBJZiBubyBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLCB0aGUgY29uc3RydWN0b3JcclxuXHQgKiBpbml0aWFsaXplcyB0aGUgbWF0cml4IGFzIGFuIGlkZW50aXR5IG1hdHJpeC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjExXSAtIDEtMSBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW24xMl0gLSAxLTIgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuMjFdIC0gMi0xIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjIyXSAtIDItMiBtYXRyaXggZWxlbWVudC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbjExLCBuMTIsIG4yMSwgbjIyICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0TWF0cml4Mi5wcm90b3R5cGUuaXNNYXRyaXgyID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgY29sdW1uLW1ham9yIGxpc3Qgb2YgbWF0cml4IHZhbHVlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8bnVtYmVyPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5lbGVtZW50cyA9IFtcclxuXHRcdFx0MSwgMCxcclxuXHRcdFx0MCwgMSxcclxuXHRcdF07XHJcblxyXG5cdFx0aWYgKCBuMTEgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHRoaXMuc2V0KCBuMTEsIG4xMiwgbjIxLCBuMjIgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGlzIG1hdHJpeCB0byB0aGUgMngyIGlkZW50aXR5IG1hdHJpeC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdGlkZW50aXR5KCkge1xyXG5cclxuXHRcdHRoaXMuc2V0KFxyXG5cdFx0XHQxLCAwLFxyXG5cdFx0XHQwLCAxLFxyXG5cdFx0KTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBlbGVtZW50cyBvZiB0aGUgbWF0cml4IGZyb20gdGhlIGdpdmVuIGFycmF5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBhcnJheSAtIFRoZSBtYXRyaXggZWxlbWVudHMgaW4gY29sdW1uLW1ham9yIG9yZGVyLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0PTBdIC0gSW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGFycmF5LlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdGZyb21BcnJheSggYXJyYXksIG9mZnNldCA9IDAgKSB7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgNDsgaSArKyApIHtcclxuXHJcblx0XHRcdHRoaXMuZWxlbWVudHNbIGkgXSA9IGFycmF5WyBpICsgb2Zmc2V0IF07XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGVsZW1lbnRzIG9mIHRoZSBtYXRyaXguVGhlIGFyZ3VtZW50cyBhcmUgc3VwcG9zZWQgdG8gYmVcclxuXHQgKiBpbiByb3ctbWFqb3Igb3JkZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbjExIC0gMS0xIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBuMTIgLSAxLTIgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IG4yMSAtIDItMSBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbjIyIC0gMi0yIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdHNldCggbjExLCBuMTIsIG4yMSwgbjIyICkge1xyXG5cclxuXHRcdGNvbnN0IHRlID0gdGhpcy5lbGVtZW50cztcclxuXHJcblx0XHR0ZVsgMCBdID0gbjExOyB0ZVsgMiBdID0gbjEyO1xyXG5cdFx0dGVbIDEgXSA9IG4yMTsgdGVbIDMgXSA9IG4yMjtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxufVxyXG4iLCJpbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi9WZWN0b3IyLmpzJztcclxuXHJcbmNvbnN0IF92ZWN0b3IgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IyKCk7XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyBhbiBheGlzLWFsaWduZWQgYm91bmRpbmcgYm94IChBQUJCKSBpbiAyRCBzcGFjZS5cclxuICovXHJcbmNsYXNzIEJveDIge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGJvdW5kaW5nIGJveC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gW21pbj0oSW5maW5pdHksSW5maW5pdHkpXSAtIEEgdmVjdG9yIHJlcHJlc2VudGluZyB0aGUgbG93ZXIgYm91bmRhcnkgb2YgdGhlIGJveC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IFttYXg9KC1JbmZpbml0eSwtSW5maW5pdHkpXSAtIEEgdmVjdG9yIHJlcHJlc2VudGluZyB0aGUgdXBwZXIgYm91bmRhcnkgb2YgdGhlIGJveC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbWluID0gbmV3IFZlY3RvcjIoICsgSW5maW5pdHksICsgSW5maW5pdHkgKSwgbWF4ID0gbmV3IFZlY3RvcjIoIC0gSW5maW5pdHksIC0gSW5maW5pdHkgKSApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNCb3gyID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBsb3dlciBib3VuZGFyeSBvZiB0aGUgYm94LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3IyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1pbiA9IG1pbjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB1cHBlciBib3VuZGFyeSBvZiB0aGUgYm94LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3IyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1heCA9IG1heDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBsb3dlciBhbmQgdXBwZXIgYm91bmRhcmllcyBvZiB0aGlzIGJveC5cclxuXHQgKiBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgbWV0aG9kIG9ubHkgY29waWVzIHRoZSB2YWx1ZXMgZnJvbSB0aGUgZ2l2ZW4gb2JqZWN0cy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gbWluIC0gVGhlIGxvd2VyIGJvdW5kYXJ5IG9mIHRoZSBib3guXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSBtYXggLSBUaGUgdXBwZXIgYm91bmRhcnkgb2YgdGhlIGJveC5cclxuXHQgKiBAcmV0dXJuIHtCb3gyfSBBIHJlZmVyZW5jZSB0byB0aGlzIGJvdW5kaW5nIGJveC5cclxuXHQgKi9cclxuXHRzZXQoIG1pbiwgbWF4ICkge1xyXG5cclxuXHRcdHRoaXMubWluLmNvcHkoIG1pbiApO1xyXG5cdFx0dGhpcy5tYXguY29weSggbWF4ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdXBwZXIgYW5kIGxvd2VyIGJvdW5kcyBvZiB0aGlzIGJveCBzbyBpdCBlbmNsb3NlcyB0aGUgcG9zaXRpb24gZGF0YVxyXG5cdCAqIGluIHRoZSBnaXZlbiBhcnJheS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8VmVjdG9yMj59IHBvaW50cyAtIEFuIGFycmF5IGhvbGRpbmcgMkQgcG9zaXRpb24gZGF0YSBhcyBpbnN0YW5jZXMgb2Yge0BsaW5rIFZlY3RvcjJ9LlxyXG5cdCAqIEByZXR1cm4ge0JveDJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgYm91bmRpbmcgYm94LlxyXG5cdCAqL1xyXG5cdHNldEZyb21Qb2ludHMoIHBvaW50cyApIHtcclxuXHJcblx0XHR0aGlzLm1ha2VFbXB0eSgpO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBwb2ludHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmV4cGFuZEJ5UG9pbnQoIHBvaW50c1sgaSBdICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENlbnRlcnMgdGhpcyBib3ggb24gdGhlIGdpdmVuIGNlbnRlciB2ZWN0b3IgYW5kIHNldHMgdGhpcyBib3gncyB3aWR0aCwgaGVpZ2h0IGFuZFxyXG5cdCAqIGRlcHRoIHRvIHRoZSBnaXZlbiBzaXplIHZhbHVlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gY2VudGVyIC0gVGhlIGNlbnRlciBvZiB0aGUgYm94LlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gc2l6ZSAtIFRoZSB4IGFuZCB5IGRpbWVuc2lvbnMgb2YgdGhlIGJveC5cclxuXHQgKiBAcmV0dXJuIHtCb3gyfSBBIHJlZmVyZW5jZSB0byB0aGlzIGJvdW5kaW5nIGJveC5cclxuXHQgKi9cclxuXHRzZXRGcm9tQ2VudGVyQW5kU2l6ZSggY2VudGVyLCBzaXplICkge1xyXG5cclxuXHRcdGNvbnN0IGhhbGZTaXplID0gX3ZlY3Rvci5jb3B5KCBzaXplICkubXVsdGlwbHlTY2FsYXIoIDAuNSApO1xyXG5cdFx0dGhpcy5taW4uY29weSggY2VudGVyICkuc3ViKCBoYWxmU2l6ZSApO1xyXG5cdFx0dGhpcy5tYXguY29weSggY2VudGVyICkuYWRkKCBoYWxmU2l6ZSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBuZXcgYm94IHdpdGggY29waWVkIHZhbHVlcyBmcm9tIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtCb3gyfSBBIGNsb25lIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y2xvbmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvcGllcyB0aGUgdmFsdWVzIG9mIHRoZSBnaXZlbiBib3ggdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Qm94Mn0gYm94IC0gVGhlIGJveCB0byBjb3B5LlxyXG5cdCAqIEByZXR1cm4ge0JveDJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgYm91bmRpbmcgYm94LlxyXG5cdCAqL1xyXG5cdGNvcHkoIGJveCApIHtcclxuXHJcblx0XHR0aGlzLm1pbi5jb3B5KCBib3gubWluICk7XHJcblx0XHR0aGlzLm1heC5jb3B5KCBib3gubWF4ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTWFrZXMgdGhpcyBib3ggZW1wdHkgd2hpY2ggbWVhbnMgaW4gZW5jbG9zZXMgYSB6ZXJvIHNwYWNlIGluIDJELlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Qm94Mn0gQSByZWZlcmVuY2UgdG8gdGhpcyBib3VuZGluZyBib3guXHJcblx0ICovXHJcblx0bWFrZUVtcHR5KCkge1xyXG5cclxuXHRcdHRoaXMubWluLnggPSB0aGlzLm1pbi55ID0gKyBJbmZpbml0eTtcclxuXHRcdHRoaXMubWF4LnggPSB0aGlzLm1heC55ID0gLSBJbmZpbml0eTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBib3ggaW5jbHVkZXMgemVybyBwb2ludHMgd2l0aGluIGl0cyBib3VuZHMuXHJcblx0ICogTm90ZSB0aGF0IGEgYm94IHdpdGggZXF1YWwgbG93ZXIgYW5kIHVwcGVyIGJvdW5kcyBzdGlsbCBpbmNsdWRlcyBvbmVcclxuXHQgKiBwb2ludCwgdGhlIG9uZSBib3RoIGJvdW5kcyBzaGFyZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyBib3ggaXMgZW1wdHkgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGlzRW1wdHkoKSB7XHJcblxyXG5cdFx0Ly8gdGhpcyBpcyBhIG1vcmUgcm9idXN0IGNoZWNrIGZvciBlbXB0eSB0aGFuICggdm9sdW1lIDw9IDAgKSBiZWNhdXNlIHZvbHVtZSBjYW4gZ2V0IHBvc2l0aXZlIHdpdGggdHdvIG5lZ2F0aXZlIGF4ZXNcclxuXHJcblx0XHRyZXR1cm4gKCB0aGlzLm1heC54IDwgdGhpcy5taW4ueCApIHx8ICggdGhpcy5tYXgueSA8IHRoaXMubWluLnkgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBjZW50ZXIgcG9pbnQgb2YgdGhpcyBib3guXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IHRhcmdldCAtIFRoZSB0YXJnZXQgdmVjdG9yIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbWV0aG9kJ3MgcmVzdWx0LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IFRoZSBjZW50ZXIgcG9pbnQuXHJcblx0ICovXHJcblx0Z2V0Q2VudGVyKCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuaXNFbXB0eSgpID8gdGFyZ2V0LnNldCggMCwgMCApIDogdGFyZ2V0LmFkZFZlY3RvcnMoIHRoaXMubWluLCB0aGlzLm1heCApLm11bHRpcGx5U2NhbGFyKCAwLjUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBkaW1lbnNpb25zIG9mIHRoaXMgYm94LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IHZlY3RvciB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGhvZCdzIHJlc3VsdC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBUaGUgc2l6ZS5cclxuXHQgKi9cclxuXHRnZXRTaXplKCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuaXNFbXB0eSgpID8gdGFyZ2V0LnNldCggMCwgMCApIDogdGFyZ2V0LnN1YlZlY3RvcnMoIHRoaXMubWF4LCB0aGlzLm1pbiApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEV4cGFuZHMgdGhlIGJvdW5kYXJpZXMgb2YgdGhpcyBib3ggdG8gaW5jbHVkZSB0aGUgZ2l2ZW4gcG9pbnQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IHBvaW50IC0gVGhlIHBvaW50IHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGJ5IHRoZSBib3VuZGluZyBib3guXHJcblx0ICogQHJldHVybiB7Qm94Mn0gQSByZWZlcmVuY2UgdG8gdGhpcyBib3VuZGluZyBib3guXHJcblx0ICovXHJcblx0ZXhwYW5kQnlQb2ludCggcG9pbnQgKSB7XHJcblxyXG5cdFx0dGhpcy5taW4ubWluKCBwb2ludCApO1xyXG5cdFx0dGhpcy5tYXgubWF4KCBwb2ludCApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEV4cGFuZHMgdGhpcyBib3ggZXF1aWxhdGVyYWxseSBieSB0aGUgZ2l2ZW4gdmVjdG9yLiBUaGUgd2lkdGggb2YgdGhpc1xyXG5cdCAqIGJveCB3aWxsIGJlIGV4cGFuZGVkIGJ5IHRoZSB4IGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yIGluIGJvdGhcclxuXHQgKiBkaXJlY3Rpb25zLiBUaGUgaGVpZ2h0IG9mIHRoaXMgYm94IHdpbGwgYmUgZXhwYW5kZWQgYnkgdGhlIHkgY29tcG9uZW50IG9mXHJcblx0ICogdGhlIHZlY3RvciBpbiBib3RoIGRpcmVjdGlvbnMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IHZlY3RvciAtIFRoZSB2ZWN0b3IgdGhhdCBzaG91bGQgZXhwYW5kIHRoZSBib3VuZGluZyBib3guXHJcblx0ICogQHJldHVybiB7Qm94Mn0gQSByZWZlcmVuY2UgdG8gdGhpcyBib3VuZGluZyBib3guXHJcblx0ICovXHJcblx0ZXhwYW5kQnlWZWN0b3IoIHZlY3RvciApIHtcclxuXHJcblx0XHR0aGlzLm1pbi5zdWIoIHZlY3RvciApO1xyXG5cdFx0dGhpcy5tYXguYWRkKCB2ZWN0b3IgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFeHBhbmRzIGVhY2ggZGltZW5zaW9uIG9mIHRoZSBib3ggYnkgdGhlIGdpdmVuIHNjYWxhci4gSWYgbmVnYXRpdmUsIHRoZVxyXG5cdCAqIGRpbWVuc2lvbnMgb2YgdGhlIGJveCB3aWxsIGJlIGNvbnRyYWN0ZWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc2NhbGFyIC0gVGhlIHNjYWxhciB2YWx1ZSB0aGF0IHNob3VsZCBleHBhbmQgdGhlIGJvdW5kaW5nIGJveC5cclxuXHQgKiBAcmV0dXJuIHtCb3gyfSBBIHJlZmVyZW5jZSB0byB0aGlzIGJvdW5kaW5nIGJveC5cclxuXHQgKi9cclxuXHRleHBhbmRCeVNjYWxhciggc2NhbGFyICkge1xyXG5cclxuXHRcdHRoaXMubWluLmFkZFNjYWxhciggLSBzY2FsYXIgKTtcclxuXHRcdHRoaXMubWF4LmFkZFNjYWxhciggc2NhbGFyICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIHBvaW50IGxpZXMgd2l0aGluIG9yIG9uIHRoZSBib3VuZGFyaWVzIG9mIHRoaXMgYm94LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSBwb2ludCAtIFRoZSBwb2ludCB0byB0ZXN0LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGJvdW5kaW5nIGJveCBjb250YWlucyB0aGUgZ2l2ZW4gcG9pbnQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGNvbnRhaW5zUG9pbnQoIHBvaW50ICkge1xyXG5cclxuXHRcdHJldHVybiBwb2ludC54ID49IHRoaXMubWluLnggJiYgcG9pbnQueCA8PSB0aGlzLm1heC54ICYmXHJcblx0XHRcdHBvaW50LnkgPj0gdGhpcy5taW4ueSAmJiBwb2ludC55IDw9IHRoaXMubWF4Lnk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBib3VuZGluZyBib3ggaW5jbHVkZXMgdGhlIGVudGlyZXR5IG9mIHRoZSBnaXZlbiBib3VuZGluZyBib3guXHJcblx0ICogSWYgdGhpcyBib3ggYW5kIHRoZSBnaXZlbiBvbmUgYXJlIGlkZW50aWNhbCwgdGhpcyBmdW5jdGlvbiBhbHNvIHJldHVybnMgYHRydWVgLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCb3gyfSBib3ggLSBUaGUgYm91bmRpbmcgYm94IHRvIHRlc3QuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgYm91bmRpbmcgYm94IGNvbnRhaW5zIHRoZSBnaXZlbiBib3VuZGluZyBib3ggb3Igbm90LlxyXG5cdCAqL1xyXG5cdGNvbnRhaW5zQm94KCBib3ggKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubWluLnggPD0gYm94Lm1pbi54ICYmIGJveC5tYXgueCA8PSB0aGlzLm1heC54ICYmXHJcblx0XHRcdHRoaXMubWluLnkgPD0gYm94Lm1pbi55ICYmIGJveC5tYXgueSA8PSB0aGlzLm1heC55O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBwb2ludCBhcyBhIHByb3BvcnRpb24gb2YgdGhpcyBib3gncyB3aWR0aCBhbmQgaGVpZ2h0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSBwb2ludCAtIEEgcG9pbnQgaW4gMkQgc3BhY2UuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IHZlY3RvciB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGhvZCdzIHJlc3VsdC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBBIHBvaW50IGFzIGEgcHJvcG9ydGlvbiBvZiB0aGlzIGJveCdzIHdpZHRoIGFuZCBoZWlnaHQuXHJcblx0ICovXHJcblx0Z2V0UGFyYW1ldGVyKCBwb2ludCwgdGFyZ2V0ICkge1xyXG5cclxuXHRcdC8vIFRoaXMgY2FuIHBvdGVudGlhbGx5IGhhdmUgYSBkaXZpZGUgYnkgemVybyBpZiB0aGUgYm94XHJcblx0XHQvLyBoYXMgYSBzaXplIGRpbWVuc2lvbiBvZiAwLlxyXG5cclxuXHRcdHJldHVybiB0YXJnZXQuc2V0KFxyXG5cdFx0XHQoIHBvaW50LnggLSB0aGlzLm1pbi54ICkgLyAoIHRoaXMubWF4LnggLSB0aGlzLm1pbi54ICksXHJcblx0XHRcdCggcG9pbnQueSAtIHRoaXMubWluLnkgKSAvICggdGhpcy5tYXgueSAtIHRoaXMubWluLnkgKVxyXG5cdFx0KTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gYm91bmRpbmcgYm94IGludGVyc2VjdHMgd2l0aCB0aGlzIGJvdW5kaW5nIGJveC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Qm94Mn0gYm94IC0gVGhlIGJvdW5kaW5nIGJveCB0byB0ZXN0LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGdpdmVuIGJvdW5kaW5nIGJveCBpbnRlcnNlY3RzIHdpdGggdGhpcyBib3VuZGluZyBib3guXHJcblx0ICovXHJcblx0aW50ZXJzZWN0c0JveCggYm94ICkge1xyXG5cclxuXHRcdC8vIHVzaW5nIDQgc3BsaXR0aW5nIHBsYW5lcyB0byBydWxlIG91dCBpbnRlcnNlY3Rpb25zXHJcblxyXG5cdFx0cmV0dXJuIGJveC5tYXgueCA+PSB0aGlzLm1pbi54ICYmIGJveC5taW4ueCA8PSB0aGlzLm1heC54ICYmXHJcblx0XHRcdGJveC5tYXgueSA+PSB0aGlzLm1pbi55ICYmIGJveC5taW4ueSA8PSB0aGlzLm1heC55O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENsYW1wcyB0aGUgZ2l2ZW4gcG9pbnQgd2l0aGluIHRoZSBib3VuZHMgb2YgdGhpcyBib3guXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IHBvaW50IC0gVGhlIHBvaW50IHRvIGNsYW1wLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gdGFyZ2V0IC0gVGhlIHRhcmdldCB2ZWN0b3IgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBtZXRob2QncyByZXN1bHQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gVGhlIGNsYW1wZWQgcG9pbnQuXHJcblx0ICovXHJcblx0Y2xhbXBQb2ludCggcG9pbnQsIHRhcmdldCApIHtcclxuXHJcblx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIHBvaW50ICkuY2xhbXAoIHRoaXMubWluLCB0aGlzLm1heCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGV1Y2xpZGVhbiBkaXN0YW5jZSBmcm9tIGFueSBlZGdlIG9mIHRoaXMgYm94IHRvIHRoZSBzcGVjaWZpZWQgcG9pbnQuIElmXHJcblx0ICogdGhlIGdpdmVuIHBvaW50IGxpZXMgaW5zaWRlIG9mIHRoaXMgYm94LCB0aGUgZGlzdGFuY2Ugd2lsbCBiZSBgMGAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IHBvaW50IC0gVGhlIHBvaW50IHRvIGNvbXB1dGUgdGhlIGRpc3RhbmNlIHRvLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGV1Y2xpZGVhbiBkaXN0YW5jZS5cclxuXHQgKi9cclxuXHRkaXN0YW5jZVRvUG9pbnQoIHBvaW50ICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmNsYW1wUG9pbnQoIHBvaW50LCBfdmVjdG9yICkuZGlzdGFuY2VUbyggcG9pbnQgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoaXMgYm91bmRpbmcgYm94IGFuZCB0aGUgZ2l2ZW4gb25lLCBzZXR0aW5nIHRoZSB1cHBlclxyXG5cdCAqIGJvdW5kIG9mIHRoaXMgYm94IHRvIHRoZSBsZXNzZXIgb2YgdGhlIHR3byBib3hlcycgdXBwZXIgYm91bmRzIGFuZCB0aGVcclxuXHQgKiBsb3dlciBib3VuZCBvZiB0aGlzIGJveCB0byB0aGUgZ3JlYXRlciBvZiB0aGUgdHdvIGJveGVzJyBsb3dlciBib3VuZHMuIElmXHJcblx0ICogdGhlcmUncyBubyBvdmVybGFwLCBtYWtlcyB0aGlzIGJveCBlbXB0eS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Qm94Mn0gYm94IC0gVGhlIGJvdW5kaW5nIGJveCB0byBpbnRlcnNlY3Qgd2l0aC5cclxuXHQgKiBAcmV0dXJuIHtCb3gyfSBBIHJlZmVyZW5jZSB0byB0aGlzIGJvdW5kaW5nIGJveC5cclxuXHQgKi9cclxuXHRpbnRlcnNlY3QoIGJveCApIHtcclxuXHJcblx0XHR0aGlzLm1pbi5tYXgoIGJveC5taW4gKTtcclxuXHRcdHRoaXMubWF4Lm1pbiggYm94Lm1heCApO1xyXG5cclxuXHRcdGlmICggdGhpcy5pc0VtcHR5KCkgKSB0aGlzLm1ha2VFbXB0eSgpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSB1bmlvbiBvZiB0aGlzIGJveCBhbmQgYW5vdGhlciBhbmQgdGhlIGdpdmVuIG9uZSwgc2V0dGluZyB0aGUgdXBwZXJcclxuXHQgKiBib3VuZCBvZiB0aGlzIGJveCB0byB0aGUgZ3JlYXRlciBvZiB0aGUgdHdvIGJveGVzJyB1cHBlciBib3VuZHMgYW5kIHRoZVxyXG5cdCAqIGxvd2VyIGJvdW5kIG9mIHRoaXMgYm94IHRvIHRoZSBsZXNzZXIgb2YgdGhlIHR3byBib3hlcycgbG93ZXIgYm91bmRzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCb3gyfSBib3ggLSBUaGUgYm91bmRpbmcgYm94IHRoYXQgd2lsbCBiZSB1bmlvbmVkIHdpdGggdGhpcyBpbnN0YW5jZS5cclxuXHQgKiBAcmV0dXJuIHtCb3gyfSBBIHJlZmVyZW5jZSB0byB0aGlzIGJvdW5kaW5nIGJveC5cclxuXHQgKi9cclxuXHR1bmlvbiggYm94ICkge1xyXG5cclxuXHRcdHRoaXMubWluLm1pbiggYm94Lm1pbiApO1xyXG5cdFx0dGhpcy5tYXgubWF4KCBib3gubWF4ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyB0aGUgZ2l2ZW4gb2Zmc2V0IHRvIGJvdGggdGhlIHVwcGVyIGFuZCBsb3dlciBib3VuZHMgb2YgdGhpcyBib3VuZGluZyBib3gsXHJcblx0ICogZWZmZWN0aXZlbHkgbW92aW5nIGl0IGluIDJEIHNwYWNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSBvZmZzZXQgLSBUaGUgb2Zmc2V0IHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gdHJhbnNsYXRlIHRoZSBib3VuZGluZyBib3guXHJcblx0ICogQHJldHVybiB7Qm94Mn0gQSByZWZlcmVuY2UgdG8gdGhpcyBib3VuZGluZyBib3guXHJcblx0ICovXHJcblx0dHJhbnNsYXRlKCBvZmZzZXQgKSB7XHJcblxyXG5cdFx0dGhpcy5taW4uYWRkKCBvZmZzZXQgKTtcclxuXHRcdHRoaXMubWF4LmFkZCggb2Zmc2V0ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBib3VuZGluZyBib3ggaXMgZXF1YWwgd2l0aCB0aGUgZ2l2ZW4gb25lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCb3gyfSBib3ggLSBUaGUgYm94IHRvIHRlc3QgZm9yIGVxdWFsaXR5LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyBib3VuZGluZyBib3ggaXMgZXF1YWwgd2l0aCB0aGUgZ2l2ZW4gb25lLlxyXG5cdCAqL1xyXG5cdGVxdWFscyggYm94ICkge1xyXG5cclxuXHRcdHJldHVybiBib3gubWluLmVxdWFscyggdGhpcy5taW4gKSAmJiBib3gubWF4LmVxdWFscyggdGhpcy5tYXggKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgQm94MiB9O1xyXG4iLCJpbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi9WZWN0b3IzLmpzJztcclxuaW1wb3J0IHsgY2xhbXAgfSBmcm9tICcuL01hdGhVdGlscy5qcyc7XHJcblxyXG5jb25zdCBfc3RhcnRQID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfc3RhcnRFbmQgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcblxyXG4vKipcclxuICogQW4gYW5hbHl0aWNhbCBsaW5lIHNlZ21lbnQgaW4gM0Qgc3BhY2UgcmVwcmVzZW50ZWQgYnkgYSBzdGFydCBhbmQgZW5kIHBvaW50LlxyXG4gKi9cclxuY2xhc3MgTGluZTMge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGxpbmUgc2VnbWVudC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gW3N0YXJ0PSgwLDAsMCldIC0gU3RhcnQgb2YgdGhlIGxpbmUgc2VnbWVudC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IFtlbmQ9KDAsMCwwKV0gLSBFbmQgb2YgdGhlIGxpbmUgc2VnbWVudC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggc3RhcnQgPSBuZXcgVmVjdG9yMygpLCBlbmQgPSBuZXcgVmVjdG9yMygpICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU3RhcnQgb2YgdGhlIGxpbmUgc2VnbWVudC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yM31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zdGFydCA9IHN0YXJ0O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRW5kIG9mIHRoZSBsaW5lIHNlZ21lbnQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjN9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZW5kID0gZW5kO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzIGJ5IGNvcHlpbmcgdGhlIGdpdmVuIHZlY3RvcnMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHN0YXJ0IC0gVGhlIHN0YXJ0IHBvaW50LlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gZW5kIC0gVGhlIGVuZCBwb2ludC5cclxuXHQgKiBAcmV0dXJuIHtMaW5lM30gQSByZWZlcmVuY2UgdG8gdGhpcyBsaW5lIHNlZ21lbnQuXHJcblx0ICovXHJcblx0c2V0KCBzdGFydCwgZW5kICkge1xyXG5cclxuXHRcdHRoaXMuc3RhcnQuY29weSggc3RhcnQgKTtcclxuXHRcdHRoaXMuZW5kLmNvcHkoIGVuZCApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvcGllcyB0aGUgdmFsdWVzIG9mIHRoZSBnaXZlbiBsaW5lIHNlZ21lbnQgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TGluZTN9IGxpbmUgLSBUaGUgbGluZSBzZWdtZW50IHRvIGNvcHkuXHJcblx0ICogQHJldHVybiB7TGluZTN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbGluZSBzZWdtZW50LlxyXG5cdCAqL1xyXG5cdGNvcHkoIGxpbmUgKSB7XHJcblxyXG5cdFx0dGhpcy5zdGFydC5jb3B5KCBsaW5lLnN0YXJ0ICk7XHJcblx0XHR0aGlzLmVuZC5jb3B5KCBsaW5lLmVuZCApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGNlbnRlciBvZiB0aGUgbGluZSBzZWdtZW50LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IHZlY3RvciB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGhvZCdzIHJlc3VsdC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBUaGUgY2VudGVyIHBvaW50LlxyXG5cdCAqL1xyXG5cdGdldENlbnRlciggdGFyZ2V0ICkge1xyXG5cclxuXHRcdHJldHVybiB0YXJnZXQuYWRkVmVjdG9ycyggdGhpcy5zdGFydCwgdGhpcy5lbmQgKS5tdWx0aXBseVNjYWxhciggMC41ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgZGVsdGEgdmVjdG9yIG9mIHRoZSBsaW5lIHNlZ21lbnQncyBzdGFydCBhbmQgZW5kIHBvaW50LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IHZlY3RvciB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGhvZCdzIHJlc3VsdC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBUaGUgZGVsdGEgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGRlbHRhKCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRhcmdldC5zdWJWZWN0b3JzKCB0aGlzLmVuZCwgdGhpcy5zdGFydCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHNxdWFyZWQgRXVjbGlkZWFuIGRpc3RhbmNlIGJldHdlZW4gdGhlIGxpbmUnIHN0YXJ0IGFuZCBlbmQgcG9pbnQuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBzcXVhcmVkIEV1Y2xpZGVhbiBkaXN0YW5jZS5cclxuXHQgKi9cclxuXHRkaXN0YW5jZVNxKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnN0YXJ0LmRpc3RhbmNlVG9TcXVhcmVkKCB0aGlzLmVuZCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIEV1Y2xpZGVhbiBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBsaW5lJyBzdGFydCBhbmQgZW5kIHBvaW50LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgRXVjbGlkZWFuIGRpc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGRpc3RhbmNlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnN0YXJ0LmRpc3RhbmNlVG8oIHRoaXMuZW5kICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIHZlY3RvciBhdCBhIGNlcnRhaW4gcG9zaXRpb24gYWxvbmcgdGhlIGxpbmUgc2VnbWVudC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0IC0gQSB2YWx1ZSBiZXR3ZWVuIGBbMCwxXWAgdG8gcmVwcmVzZW50IGEgcG9zaXRpb24gYWxvbmcgdGhlIGxpbmUgc2VnbWVudC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHRhcmdldCAtIFRoZSB0YXJnZXQgdmVjdG9yIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbWV0aG9kJ3MgcmVzdWx0LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IFRoZSBkZWx0YSB2ZWN0b3IuXHJcblx0ICovXHJcblx0YXQoIHQsIHRhcmdldCApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5kZWx0YSggdGFyZ2V0ICkubXVsdGlwbHlTY2FsYXIoIHQgKS5hZGQoIHRoaXMuc3RhcnQgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgcG9pbnQgcGFyYW1ldGVyIGJhc2VkIG9uIHRoZSBjbG9zZXN0IHBvaW50IGFzIHByb2plY3RlZCBvbiB0aGUgbGluZSBzZWdtZW50LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBwb2ludCAtIFRoZSBwb2ludCBmb3Igd2hpY2ggdG8gcmV0dXJuIGEgcG9pbnQgcGFyYW1ldGVyLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gY2xhbXBUb0xpbmUgLSBXaGV0aGVyIHRvIGNsYW1wIHRoZSByZXN1bHQgdG8gdGhlIHJhbmdlIGBbMCwxXWAgb3Igbm90LlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIHBvaW50IHBhcmFtZXRlci5cclxuXHQgKi9cclxuXHRjbG9zZXN0UG9pbnRUb1BvaW50UGFyYW1ldGVyKCBwb2ludCwgY2xhbXBUb0xpbmUgKSB7XHJcblxyXG5cdFx0X3N0YXJ0UC5zdWJWZWN0b3JzKCBwb2ludCwgdGhpcy5zdGFydCApO1xyXG5cdFx0X3N0YXJ0RW5kLnN1YlZlY3RvcnMoIHRoaXMuZW5kLCB0aGlzLnN0YXJ0ICk7XHJcblxyXG5cdFx0Y29uc3Qgc3RhcnRFbmQyID0gX3N0YXJ0RW5kLmRvdCggX3N0YXJ0RW5kICk7XHJcblx0XHRjb25zdCBzdGFydEVuZF9zdGFydFAgPSBfc3RhcnRFbmQuZG90KCBfc3RhcnRQICk7XHJcblxyXG5cdFx0bGV0IHQgPSBzdGFydEVuZF9zdGFydFAgLyBzdGFydEVuZDI7XHJcblxyXG5cdFx0aWYgKCBjbGFtcFRvTGluZSApIHtcclxuXHJcblx0XHRcdHQgPSBjbGFtcCggdCwgMCwgMSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBjbG9zZXRzIHBvaW50IG9uIHRoZSBsaW5lIGZvciBhIGdpdmVuIHBvaW50LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBwb2ludCAtIFRoZSBwb2ludCB0byBjb21wdXRlIHRoZSBjbG9zZXN0IHBvaW50IG9uIHRoZSBsaW5lIGZvci5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IGNsYW1wVG9MaW5lIC0gV2hldGhlciB0byBjbGFtcCB0aGUgcmVzdWx0IHRvIHRoZSByYW5nZSBgWzAsMV1gIG9yIG5vdC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHRhcmdldCAtICBUaGUgdGFyZ2V0IHZlY3RvciB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGhvZCdzIHJlc3VsdC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBUaGUgY2xvc2VzdCBwb2ludCBvbiB0aGUgbGluZS5cclxuXHQgKi9cclxuXHRjbG9zZXN0UG9pbnRUb1BvaW50KCBwb2ludCwgY2xhbXBUb0xpbmUsIHRhcmdldCApIHtcclxuXHJcblx0XHRjb25zdCB0ID0gdGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50UGFyYW1ldGVyKCBwb2ludCwgY2xhbXBUb0xpbmUgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5kZWx0YSggdGFyZ2V0ICkubXVsdGlwbHlTY2FsYXIoIHQgKS5hZGQoIHRoaXMuc3RhcnQgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBcHBsaWVzIGEgNHg0IHRyYW5zZm9ybWF0aW9uIG1hdHJpeCB0byB0aGlzIGxpbmUgc2VnbWVudC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4NH0gbWF0cml4IC0gVGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC5cclxuXHQgKiBAcmV0dXJuIHtMaW5lM30gQSByZWZlcmVuY2UgdG8gdGhpcyBsaW5lIHNlZ21lbnQuXHJcblx0ICovXHJcblx0YXBwbHlNYXRyaXg0KCBtYXRyaXggKSB7XHJcblxyXG5cdFx0dGhpcy5zdGFydC5hcHBseU1hdHJpeDQoIG1hdHJpeCApO1xyXG5cdFx0dGhpcy5lbmQuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIGxpbmUgc2VnbWVudCBpcyBlcXVhbCB3aXRoIHRoZSBnaXZlbiBvbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0xpbmUzfSBsaW5lIC0gVGhlIGxpbmUgc2VnbWVudCB0byB0ZXN0IGZvciBlcXVhbGl0eS5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoaXMgbGluZSBzZWdtZW50IGlzIGVxdWFsIHdpdGggdGhlIGdpdmVuIG9uZS5cclxuXHQgKi9cclxuXHRlcXVhbHMoIGxpbmUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIGxpbmUuc3RhcnQuZXF1YWxzKCB0aGlzLnN0YXJ0ICkgJiYgbGluZS5lbmQuZXF1YWxzKCB0aGlzLmVuZCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBuZXcgbGluZSBzZWdtZW50IHdpdGggY29waWVkIHZhbHVlcyBmcm9tIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtMaW5lM30gQSBjbG9uZSBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNsb25lKCkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgTGluZTMgfTtcclxuIiwiaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcbmltcG9ydCB7IE9iamVjdDNEIH0gZnJvbSAnLi4vY29yZS9PYmplY3QzRC5qcyc7XHJcbmltcG9ydCB7IExpbmVTZWdtZW50cyB9IGZyb20gJy4uL29iamVjdHMvTGluZVNlZ21lbnRzLmpzJztcclxuaW1wb3J0IHsgTGluZUJhc2ljTWF0ZXJpYWwgfSBmcm9tICcuLi9tYXRlcmlhbHMvTGluZUJhc2ljTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5pbXBvcnQgeyBCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyR2VvbWV0cnkuanMnO1xyXG5cclxuY29uc3QgX3ZlY3RvciA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGRpc3BsYXlzIGEgY29uZSBzaGFwZWQgaGVscGVyIG9iamVjdCBmb3IgYSB7QGxpbmsgU3BvdExpZ2h0fS5cclxuICpcclxuICogYGBganNcclxuICogY29uc3Qgc3BvdExpZ2h0ID0gbmV3IFRIUkVFLlNwb3RMaWdodCggMHhmZmZmZmYgKTtcclxuICogc3BvdExpZ2h0LnBvc2l0aW9uLnNldCggMTAsIDEwLCAxMCApO1xyXG4gKiBzY2VuZS5hZGQoIHNwb3RMaWdodCApO1xyXG4gKlxyXG4gKiBjb25zdCBzcG90TGlnaHRIZWxwZXIgPSBuZXcgVEhSRUUuU3BvdExpZ2h0SGVscGVyKCBzcG90TGlnaHQgKTtcclxuICogc2NlbmUuYWRkKCBzcG90TGlnaHRIZWxwZXIgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBPYmplY3QzRFxyXG4gKi9cclxuY2xhc3MgU3BvdExpZ2h0SGVscGVyIGV4dGVuZHMgT2JqZWN0M0Qge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHNwb3QgbGlnaHQgaGVscGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtIZW1pc3BoZXJlTGlnaHR9IGxpZ2h0IC0gVGhlIGxpZ2h0IHRvIGJlIHZpc3VhbGl6ZWQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ8Q29sb3J8c3RyaW5nfSBbY29sb3JdIC0gVGhlIGhlbHBlcidzIGNvbG9yLiBJZiBub3Qgc2V0LCB0aGUgaGVscGVyIHdpbGwgdGFrZVxyXG5cdCAqIHRoZSBjb2xvciBvZiB0aGUgbGlnaHQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGxpZ2h0LCBjb2xvciApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGxpZ2h0IGJlaW5nIHZpc3VhbGl6ZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1Nwb3RMaWdodH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5saWdodCA9IGxpZ2h0O1xyXG5cclxuXHRcdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNvbG9yIHBhcmFtZXRlciBwYXNzZWQgaW4gdGhlIGNvbnN0cnVjdG9yLlxyXG5cdFx0ICogSWYgbm90IHNldCwgdGhlIGhlbHBlciB3aWxsIHRha2UgdGhlIGNvbG9yIG9mIHRoZSBsaWdodC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfENvbG9yfHN0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb2xvciA9IGNvbG9yO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdTcG90TGlnaHRIZWxwZXInO1xyXG5cclxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XHJcblxyXG5cdFx0Y29uc3QgcG9zaXRpb25zID0gW1xyXG5cdFx0XHQwLCAwLCAwLCBcdDAsIDAsIDEsXHJcblx0XHRcdDAsIDAsIDAsIFx0MSwgMCwgMSxcclxuXHRcdFx0MCwgMCwgMCxcdC0gMSwgMCwgMSxcclxuXHRcdFx0MCwgMCwgMCwgXHQwLCAxLCAxLFxyXG5cdFx0XHQwLCAwLCAwLCBcdDAsIC0gMSwgMVxyXG5cdFx0XTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGogPSAxLCBsID0gMzI7IGkgPCBsOyBpICsrLCBqICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgcDEgPSAoIGkgLyBsICkgKiBNYXRoLlBJICogMjtcclxuXHRcdFx0Y29uc3QgcDIgPSAoIGogLyBsICkgKiBNYXRoLlBJICogMjtcclxuXHJcblx0XHRcdHBvc2l0aW9ucy5wdXNoKFxyXG5cdFx0XHRcdE1hdGguY29zKCBwMSApLCBNYXRoLnNpbiggcDEgKSwgMSxcclxuXHRcdFx0XHRNYXRoLmNvcyggcDIgKSwgTWF0aC5zaW4oIHAyICksIDFcclxuXHRcdFx0KTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Z2VvbWV0cnkuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25zLCAzICkgKTtcclxuXHJcblx0XHRjb25zdCBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBmb2c6IGZhbHNlLCB0b25lTWFwcGVkOiBmYWxzZSB9ICk7XHJcblxyXG5cdFx0dGhpcy5jb25lID0gbmV3IExpbmVTZWdtZW50cyggZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcblx0XHR0aGlzLmFkZCggdGhpcy5jb25lICk7XHJcblxyXG5cdFx0dGhpcy51cGRhdGUoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGcmVlcyB0aGUgR1BVLXJlbGF0ZWQgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGlzIGluc3RhbmNlLiBDYWxsIHRoaXNcclxuXHQgKiBtZXRob2Qgd2hlbmV2ZXIgdGhpcyBpbnN0YW5jZSBpcyBubyBsb25nZXIgdXNlZCBpbiB5b3VyIGFwcC5cclxuXHQgKi9cclxuXHRkaXNwb3NlKCkge1xyXG5cclxuXHRcdHRoaXMuY29uZS5nZW9tZXRyeS5kaXNwb3NlKCk7XHJcblx0XHR0aGlzLmNvbmUubWF0ZXJpYWwuZGlzcG9zZSgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIGhlbHBlciB0byBtYXRjaCB0aGUgcG9zaXRpb24gYW5kIGRpcmVjdGlvbiBvZiB0aGVcclxuXHQgKiBsaWdodCBiZWluZyB2aXN1YWxpemVkLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZSgpIHtcclxuXHJcblx0XHR0aGlzLmxpZ2h0LnVwZGF0ZVdvcmxkTWF0cml4KCB0cnVlLCBmYWxzZSApO1xyXG5cdFx0dGhpcy5saWdodC50YXJnZXQudXBkYXRlV29ybGRNYXRyaXgoIHRydWUsIGZhbHNlICk7XHJcblxyXG5cdFx0Ly8gdXBkYXRlIHRoZSBsb2NhbCBtYXRyaXggYmFzZWQgb24gdGhlIHBhcmVudCBhbmQgbGlnaHQgdGFyZ2V0IHRyYW5zZm9ybXNcclxuXHRcdGlmICggdGhpcy5wYXJlbnQgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnBhcmVudC51cGRhdGVXb3JsZE1hdHJpeCggdHJ1ZSApO1xyXG5cclxuXHRcdFx0dGhpcy5tYXRyaXhcclxuXHRcdFx0XHQuY29weSggdGhpcy5wYXJlbnQubWF0cml4V29ybGQgKVxyXG5cdFx0XHRcdC5pbnZlcnQoKVxyXG5cdFx0XHRcdC5tdWx0aXBseSggdGhpcy5saWdodC5tYXRyaXhXb3JsZCApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR0aGlzLm1hdHJpeC5jb3B5KCB0aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMubWF0cml4V29ybGQuY29weSggdGhpcy5saWdodC5tYXRyaXhXb3JsZCApO1xyXG5cclxuXHRcdGNvbnN0IGNvbmVMZW5ndGggPSB0aGlzLmxpZ2h0LmRpc3RhbmNlID8gdGhpcy5saWdodC5kaXN0YW5jZSA6IDEwMDA7XHJcblx0XHRjb25zdCBjb25lV2lkdGggPSBjb25lTGVuZ3RoICogTWF0aC50YW4oIHRoaXMubGlnaHQuYW5nbGUgKTtcclxuXHJcblx0XHR0aGlzLmNvbmUuc2NhbGUuc2V0KCBjb25lV2lkdGgsIGNvbmVXaWR0aCwgY29uZUxlbmd0aCApO1xyXG5cclxuXHRcdF92ZWN0b3Iuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLmxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCApO1xyXG5cclxuXHRcdHRoaXMuY29uZS5sb29rQXQoIF92ZWN0b3IgKTtcclxuXHJcblx0XHRpZiAoIHRoaXMuY29sb3IgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHRoaXMuY29uZS5tYXRlcmlhbC5jb2xvci5zZXQoIHRoaXMuY29sb3IgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGhpcy5jb25lLm1hdGVyaWFsLmNvbG9yLmNvcHkoIHRoaXMubGlnaHQuY29sb3IgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBTcG90TGlnaHRIZWxwZXIgfTtcclxuIiwiaW1wb3J0IHsgTGluZVNlZ21lbnRzIH0gZnJvbSAnLi4vb2JqZWN0cy9MaW5lU2VnbWVudHMuanMnO1xyXG5pbXBvcnQgeyBNYXRyaXg0IH0gZnJvbSAnLi4vbWF0aC9NYXRyaXg0LmpzJztcclxuaW1wb3J0IHsgTGluZUJhc2ljTWF0ZXJpYWwgfSBmcm9tICcuLi9tYXRlcmlhbHMvTGluZUJhc2ljTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uL21hdGgvQ29sb3IuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcclxuaW1wb3J0IHsgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyQXR0cmlidXRlLmpzJztcclxuXHJcbmNvbnN0IF92ZWN0b3IgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF9ib25lTWF0cml4ID0gLypAX19QVVJFX18qLyBuZXcgTWF0cml4NCgpO1xyXG5jb25zdCBfbWF0cml4V29ybGRJbnYgPSAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXg0KCk7XHJcblxyXG4vKipcclxuICogQSBoZWxwZXIgb2JqZWN0IHRvIGFzc2lzdCB3aXRoIHZpc3VhbGl6aW5nIGEge0BsaW5rIFNrZWxldG9ufS5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgaGVscGVyID0gbmV3IFRIUkVFLlNrZWxldG9uSGVscGVyKCBza2lubmVkTWVzaCApO1xyXG4gKiBzY2VuZS5hZGQoIGhlbHBlciApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIExpbmVTZWdtZW50c1xyXG4gKi9cclxuY2xhc3MgU2tlbGV0b25IZWxwZXIgZXh0ZW5kcyBMaW5lU2VnbWVudHMge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGhlbWlzcGhlcmUgbGlnaHQgaGVscGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3QzRH0gb2JqZWN0IC0gIFVzdWFsbHkgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFNraW5uZWRNZXNofS4gSG93ZXZlciwgYW55IDNEIG9iamVjdFxyXG5cdCAqIGNhbiBiZSB1c2VkIGlmIGl0IHJlcHJlc2VudHMgYSBoaWVyYXJjaHkgb2YgYm9uZXMgKHNlZSB7QGxpbmsgQm9uZX0pLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBvYmplY3QgKSB7XHJcblxyXG5cdFx0Y29uc3QgYm9uZXMgPSBnZXRCb25lTGlzdCggb2JqZWN0ICk7XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcclxuXHJcblx0XHRjb25zdCB2ZXJ0aWNlcyA9IFtdO1xyXG5cdFx0Y29uc3QgY29sb3JzID0gW107XHJcblxyXG5cdFx0Y29uc3QgY29sb3IxID0gbmV3IENvbG9yKCAwLCAwLCAxICk7XHJcblx0XHRjb25zdCBjb2xvcjIgPSBuZXcgQ29sb3IoIDAsIDEsIDAgKTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBib25lcy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBib25lID0gYm9uZXNbIGkgXTtcclxuXHJcblx0XHRcdGlmICggYm9uZS5wYXJlbnQgJiYgYm9uZS5wYXJlbnQuaXNCb25lICkge1xyXG5cclxuXHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCAwLCAwLCAwICk7XHJcblx0XHRcdFx0dmVydGljZXMucHVzaCggMCwgMCwgMCApO1xyXG5cdFx0XHRcdGNvbG9ycy5wdXNoKCBjb2xvcjEuciwgY29sb3IxLmcsIGNvbG9yMS5iICk7XHJcblx0XHRcdFx0Y29sb3JzLnB1c2goIGNvbG9yMi5yLCBjb2xvcjIuZywgY29sb3IyLmIgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Z2VvbWV0cnkuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xyXG5cdFx0Z2VvbWV0cnkuc2V0QXR0cmlidXRlKCAnY29sb3InLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAzICkgKTtcclxuXHJcblx0XHRjb25zdCBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyB2ZXJ0ZXhDb2xvcnM6IHRydWUsIGRlcHRoVGVzdDogZmFsc2UsIGRlcHRoV3JpdGU6IGZhbHNlLCB0b25lTWFwcGVkOiBmYWxzZSwgdHJhbnNwYXJlbnQ6IHRydWUgfSApO1xyXG5cclxuXHRcdHN1cGVyKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNTa2VsZXRvbkhlbHBlciA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ1NrZWxldG9uSGVscGVyJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBvYmplY3QgYmVpbmcgdmlzdWFsaXplZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0M0R9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucm9vdCA9IG9iamVjdDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIGhlIGxpc3Qgb2YgYm9uZXMgdGhhdCB0aGUgaGVscGVyIHZpc3VhbGl6ZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PEJvbmU+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJvbmVzID0gYm9uZXM7XHJcblxyXG5cdFx0dGhpcy5tYXRyaXggPSBvYmplY3QubWF0cml4V29ybGQ7XHJcblx0XHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcclxuXHJcblx0fVxyXG5cclxuXHR1cGRhdGVNYXRyaXhXb3JsZCggZm9yY2UgKSB7XHJcblxyXG5cdFx0Y29uc3QgYm9uZXMgPSB0aGlzLmJvbmVzO1xyXG5cclxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcclxuXHRcdGNvbnN0IHBvc2l0aW9uID0gZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCAncG9zaXRpb24nICk7XHJcblxyXG5cdFx0X21hdHJpeFdvcmxkSW52LmNvcHkoIHRoaXMucm9vdC5tYXRyaXhXb3JsZCApLmludmVydCgpO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgaiA9IDA7IGkgPCBib25lcy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBib25lID0gYm9uZXNbIGkgXTtcclxuXHJcblx0XHRcdGlmICggYm9uZS5wYXJlbnQgJiYgYm9uZS5wYXJlbnQuaXNCb25lICkge1xyXG5cclxuXHRcdFx0XHRfYm9uZU1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBfbWF0cml4V29ybGRJbnYsIGJvbmUubWF0cml4V29ybGQgKTtcclxuXHRcdFx0XHRfdmVjdG9yLnNldEZyb21NYXRyaXhQb3NpdGlvbiggX2JvbmVNYXRyaXggKTtcclxuXHRcdFx0XHRwb3NpdGlvbi5zZXRYWVooIGosIF92ZWN0b3IueCwgX3ZlY3Rvci55LCBfdmVjdG9yLnogKTtcclxuXHJcblx0XHRcdFx0X2JvbmVNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggX21hdHJpeFdvcmxkSW52LCBib25lLnBhcmVudC5tYXRyaXhXb3JsZCApO1xyXG5cdFx0XHRcdF92ZWN0b3Iuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBfYm9uZU1hdHJpeCApO1xyXG5cdFx0XHRcdHBvc2l0aW9uLnNldFhZWiggaiArIDEsIF92ZWN0b3IueCwgX3ZlY3Rvci55LCBfdmVjdG9yLnogKTtcclxuXHJcblx0XHRcdFx0aiArPSAyO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKS5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0c3VwZXIudXBkYXRlTWF0cml4V29ybGQoIGZvcmNlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRnJlZXMgdGhlIEdQVS1yZWxhdGVkIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhpcyBpbnN0YW5jZS4gQ2FsbCB0aGlzXHJcblx0ICogbWV0aG9kIHdoZW5ldmVyIHRoaXMgaW5zdGFuY2UgaXMgbm8gbG9uZ2VyIHVzZWQgaW4geW91ciBhcHAuXHJcblx0ICovXHJcblx0ZGlzcG9zZSgpIHtcclxuXHJcblx0XHR0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKTtcclxuXHRcdHRoaXMubWF0ZXJpYWwuZGlzcG9zZSgpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5cclxuZnVuY3Rpb24gZ2V0Qm9uZUxpc3QoIG9iamVjdCApIHtcclxuXHJcblx0Y29uc3QgYm9uZUxpc3QgPSBbXTtcclxuXHJcblx0aWYgKCBvYmplY3QuaXNCb25lID09PSB0cnVlICkge1xyXG5cclxuXHRcdGJvbmVMaXN0LnB1c2goIG9iamVjdCApO1xyXG5cclxuXHR9XHJcblxyXG5cdGZvciAoIGxldCBpID0gMDsgaSA8IG9iamVjdC5jaGlsZHJlbi5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0Ym9uZUxpc3QucHVzaCggLi4uZ2V0Qm9uZUxpc3QoIG9iamVjdC5jaGlsZHJlblsgaSBdICkgKTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gYm9uZUxpc3Q7XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgU2tlbGV0b25IZWxwZXIgfTtcclxuIiwiaW1wb3J0IHsgTWVzaCB9IGZyb20gJy4uL29iamVjdHMvTWVzaC5qcyc7XHJcbmltcG9ydCB7IE1lc2hCYXNpY01hdGVyaWFsIH0gZnJvbSAnLi4vbWF0ZXJpYWxzL01lc2hCYXNpY01hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgU3BoZXJlR2VvbWV0cnkgfSBmcm9tICcuLi9nZW9tZXRyaWVzL1NwaGVyZUdlb21ldHJ5LmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGRpc3BsYXlzIGEgaGVscGVyIG9iamVjdCBjb25zaXN0aW5nIG9mIGEgc3BoZXJpY2FsIG1lc2ggZm9yXHJcbiAqIHZpc3VhbGl6aW5nIGFuIGluc3RhbmNlIG9mIHtAbGluayBQb2ludExpZ2h0fS5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgcG9pbnRMaWdodCA9IG5ldyBUSFJFRS5Qb2ludExpZ2h0KCAweGZmMDAwMCwgMSwgMTAwICk7XHJcbiAqIHBvaW50TGlnaHQucG9zaXRpb24uc2V0KCAxMCwgMTAsIDEwICk7XHJcbiAqIHNjZW5lLmFkZCggcG9pbnRMaWdodCApO1xyXG4gKlxyXG4gKiBjb25zdCBzcGhlcmVTaXplID0gMTtcclxuICogY29uc3QgcG9pbnRMaWdodEhlbHBlciA9IG5ldyBUSFJFRS5Qb2ludExpZ2h0SGVscGVyKCBwb2ludExpZ2h0LCBzcGhlcmVTaXplICk7XHJcbiAqIHNjZW5lLmFkZCggcG9pbnRMaWdodEhlbHBlciApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIE1lc2hcclxuICovXHJcbmNsYXNzIFBvaW50TGlnaHRIZWxwZXIgZXh0ZW5kcyBNZXNoIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBwb2ludCBsaWdodCBoZWxwZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1BvaW50TGlnaHR9IGxpZ2h0IC0gVGhlIGxpZ2h0IHRvIGJlIHZpc3VhbGl6ZWQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtzcGhlcmVTaXplPTFdIC0gVGhlIHNpemUgb2YgdGhlIHNwaGVyZSBoZWxwZXIuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ8Q29sb3J8c3RyaW5nfSBbY29sb3JdIC0gVGhlIGhlbHBlcidzIGNvbG9yLiBJZiBub3Qgc2V0LCB0aGUgaGVscGVyIHdpbGwgdGFrZVxyXG5cdCAqIHRoZSBjb2xvciBvZiB0aGUgbGlnaHQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGxpZ2h0LCBzcGhlcmVTaXplLCBjb2xvciApIHtcclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeSA9IG5ldyBTcGhlcmVHZW9tZXRyeSggc3BoZXJlU2l6ZSwgNCwgMiApO1xyXG5cdFx0Y29uc3QgbWF0ZXJpYWwgPSBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoIHsgd2lyZWZyYW1lOiB0cnVlLCBmb2c6IGZhbHNlLCB0b25lTWFwcGVkOiBmYWxzZSB9ICk7XHJcblxyXG5cdFx0c3VwZXIoIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGxpZ2h0IGJlaW5nIHZpc3VhbGl6ZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0hlbWlzcGhlcmVMaWdodH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5saWdodCA9IGxpZ2h0O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNvbG9yIHBhcmFtZXRlciBwYXNzZWQgaW4gdGhlIGNvbnN0cnVjdG9yLlxyXG5cdFx0ICogSWYgbm90IHNldCwgdGhlIGhlbHBlciB3aWxsIHRha2UgdGhlIGNvbG9yIG9mIHRoZSBsaWdodC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfENvbG9yfHN0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb2xvciA9IGNvbG9yO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdQb2ludExpZ2h0SGVscGVyJztcclxuXHJcblx0XHR0aGlzLm1hdHJpeCA9IHRoaXMubGlnaHQubWF0cml4V29ybGQ7XHJcblx0XHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcclxuXHJcblx0XHR0aGlzLnVwZGF0ZSgpO1xyXG5cclxuXHJcblx0XHQvKlxyXG5cdC8vIFRPRE86IGRlbGV0ZSB0aGlzIGNvbW1lbnQ/XHJcblx0Y29uc3QgZGlzdGFuY2VHZW9tZXRyeSA9IG5ldyBUSFJFRS5JY29zYWhlZHJvbkdlb21ldHJ5KCAxLCAyICk7XHJcblx0Y29uc3QgZGlzdGFuY2VNYXRlcmlhbCA9IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogaGV4Q29sb3IsIGZvZzogZmFsc2UsIHdpcmVmcmFtZTogdHJ1ZSwgb3BhY2l0eTogMC4xLCB0cmFuc3BhcmVudDogdHJ1ZSB9ICk7XHJcblxyXG5cdHRoaXMubGlnaHRTcGhlcmUgPSBuZXcgVEhSRUUuTWVzaCggYnVsYkdlb21ldHJ5LCBidWxiTWF0ZXJpYWwgKTtcclxuXHR0aGlzLmxpZ2h0RGlzdGFuY2UgPSBuZXcgVEhSRUUuTWVzaCggZGlzdGFuY2VHZW9tZXRyeSwgZGlzdGFuY2VNYXRlcmlhbCApO1xyXG5cclxuXHRjb25zdCBkID0gbGlnaHQuZGlzdGFuY2U7XHJcblxyXG5cdGlmICggZCA9PT0gMC4wICkge1xyXG5cclxuXHRcdHRoaXMubGlnaHREaXN0YW5jZS52aXNpYmxlID0gZmFsc2U7XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0dGhpcy5saWdodERpc3RhbmNlLnNjYWxlLnNldCggZCwgZCwgZCApO1xyXG5cclxuXHR9XHJcblxyXG5cdHRoaXMuYWRkKCB0aGlzLmxpZ2h0RGlzdGFuY2UgKTtcclxuXHQqL1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZyZWVzIHRoZSBHUFUtcmVsYXRlZCByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHRoaXMgaW5zdGFuY2UuIENhbGwgdGhpc1xyXG5cdCAqIG1ldGhvZCB3aGVuZXZlciB0aGlzIGluc3RhbmNlIGlzIG5vIGxvbmdlciB1c2VkIGluIHlvdXIgYXBwLlxyXG5cdCAqL1xyXG5cdGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0dGhpcy5nZW9tZXRyeS5kaXNwb3NlKCk7XHJcblx0XHR0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoZSBoZWxwZXIgdG8gbWF0Y2ggdGhlIHBvc2l0aW9uIG9mIHRoZVxyXG5cdCAqIGxpZ2h0IGJlaW5nIHZpc3VhbGl6ZWQuXHJcblx0ICovXHJcblx0dXBkYXRlKCkge1xyXG5cclxuXHRcdHRoaXMubGlnaHQudXBkYXRlV29ybGRNYXRyaXgoIHRydWUsIGZhbHNlICk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmNvbG9yICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHR0aGlzLm1hdGVyaWFsLmNvbG9yLnNldCggdGhpcy5jb2xvciApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR0aGlzLm1hdGVyaWFsLmNvbG9yLmNvcHkoIHRoaXMubGlnaHQuY29sb3IgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0LypcclxuXHRcdGNvbnN0IGQgPSB0aGlzLmxpZ2h0LmRpc3RhbmNlO1xyXG5cclxuXHRcdGlmICggZCA9PT0gMC4wICkge1xyXG5cclxuXHRcdFx0dGhpcy5saWdodERpc3RhbmNlLnZpc2libGUgPSBmYWxzZTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGhpcy5saWdodERpc3RhbmNlLnZpc2libGUgPSB0cnVlO1xyXG5cdFx0XHR0aGlzLmxpZ2h0RGlzdGFuY2Uuc2NhbGUuc2V0KCBkLCBkLCBkICk7XHJcblxyXG5cdFx0fVxyXG5cdFx0Ki9cclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCB7IFBvaW50TGlnaHRIZWxwZXIgfTtcclxuIiwiaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcbmltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vbWF0aC9Db2xvci5qcyc7XHJcbmltcG9ydCB7IE9iamVjdDNEIH0gZnJvbSAnLi4vY29yZS9PYmplY3QzRC5qcyc7XHJcbmltcG9ydCB7IE1lc2ggfSBmcm9tICcuLi9vYmplY3RzL01lc2guanMnO1xyXG5pbXBvcnQgeyBNZXNoQmFzaWNNYXRlcmlhbCB9IGZyb20gJy4uL21hdGVyaWFscy9NZXNoQmFzaWNNYXRlcmlhbC5qcyc7XHJcbmltcG9ydCB7IE9jdGFoZWRyb25HZW9tZXRyeSB9IGZyb20gJy4uL2dlb21ldHJpZXMvT2N0YWhlZHJvbkdlb21ldHJ5LmpzJztcclxuaW1wb3J0IHsgQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5cclxuY29uc3QgX3ZlY3RvciA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX2NvbG9yMSA9IC8qQF9fUFVSRV9fKi8gbmV3IENvbG9yKCk7XHJcbmNvbnN0IF9jb2xvcjIgPSAvKkBfX1BVUkVfXyovIG5ldyBDb2xvcigpO1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSB2aXN1YWwgYWlkIGNvbnNpc3Rpbmcgb2YgYSBzcGhlcmljYWwgbWVzaCBmb3IgYVxyXG4gKiBnaXZlbiB7QGxpbmsgSGVtaXNwaGVyZUxpZ2h0fS5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgbGlnaHQgPSBuZXcgVEhSRUUuSGVtaXNwaGVyZUxpZ2h0KCAweGZmZmZiYiwgMHgwODA4MjAsIDEgKTtcclxuICogY29uc3QgaGVscGVyID0gbmV3IFRIUkVFLkhlbWlzcGhlcmVMaWdodEhlbHBlciggbGlnaHQsIDUgKTtcclxuICogc2NlbmUuYWRkKCBoZWxwZXIgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBPYmplY3QzRFxyXG4gKi9cclxuY2xhc3MgSGVtaXNwaGVyZUxpZ2h0SGVscGVyIGV4dGVuZHMgT2JqZWN0M0Qge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGhlbWlzcGhlcmUgbGlnaHQgaGVscGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtIZW1pc3BoZXJlTGlnaHR9IGxpZ2h0IC0gVGhlIGxpZ2h0IHRvIGJlIHZpc3VhbGl6ZWQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtzaXplPTFdIC0gVGhlIHNpemUgb2YgdGhlIG1lc2ggdXNlZCB0byB2aXN1YWxpemUgdGhlIGxpZ2h0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfENvbG9yfHN0cmluZ30gW2NvbG9yXSAtIFRoZSBoZWxwZXIncyBjb2xvci4gSWYgbm90IHNldCwgdGhlIGhlbHBlciB3aWxsIHRha2VcclxuXHQgKiB0aGUgY29sb3Igb2YgdGhlIGxpZ2h0LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBsaWdodCwgc2l6ZSwgY29sb3IgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBsaWdodCBiZWluZyB2aXN1YWxpemVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtIZW1pc3BoZXJlTGlnaHR9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGlnaHQgPSBsaWdodDtcclxuXHJcblx0XHR0aGlzLm1hdHJpeCA9IGxpZ2h0Lm1hdHJpeFdvcmxkO1xyXG5cdFx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY29sb3IgcGFyYW1ldGVyIHBhc3NlZCBpbiB0aGUgY29uc3RydWN0b3IuXHJcblx0XHQgKiBJZiBub3Qgc2V0LCB0aGUgaGVscGVyIHdpbGwgdGFrZSB0aGUgY29sb3Igb2YgdGhlIGxpZ2h0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ8Q29sb3J8c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvbG9yID0gY29sb3I7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ0hlbWlzcGhlcmVMaWdodEhlbHBlcic7XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSBuZXcgT2N0YWhlZHJvbkdlb21ldHJ5KCBzaXplICk7XHJcblx0XHRnZW9tZXRyeS5yb3RhdGVZKCBNYXRoLlBJICogMC41ICk7XHJcblxyXG5cdFx0dGhpcy5tYXRlcmlhbCA9IG5ldyBNZXNoQmFzaWNNYXRlcmlhbCggeyB3aXJlZnJhbWU6IHRydWUsIGZvZzogZmFsc2UsIHRvbmVNYXBwZWQ6IGZhbHNlIH0gKTtcclxuXHRcdGlmICggdGhpcy5jb2xvciA9PT0gdW5kZWZpbmVkICkgdGhpcy5tYXRlcmlhbC52ZXJ0ZXhDb2xvcnMgPSB0cnVlO1xyXG5cclxuXHRcdGNvbnN0IHBvc2l0aW9uID0gZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCAncG9zaXRpb24nICk7XHJcblx0XHRjb25zdCBjb2xvcnMgPSBuZXcgRmxvYXQzMkFycmF5KCBwb3NpdGlvbi5jb3VudCAqIDMgKTtcclxuXHJcblx0XHRnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdjb2xvcicsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIGNvbG9ycywgMyApICk7XHJcblxyXG5cdFx0dGhpcy5hZGQoIG5ldyBNZXNoKCBnZW9tZXRyeSwgdGhpcy5tYXRlcmlhbCApICk7XHJcblxyXG5cdFx0dGhpcy51cGRhdGUoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGcmVlcyB0aGUgR1BVLXJlbGF0ZWQgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGlzIGluc3RhbmNlLiBDYWxsIHRoaXNcclxuXHQgKiBtZXRob2Qgd2hlbmV2ZXIgdGhpcyBpbnN0YW5jZSBpcyBubyBsb25nZXIgdXNlZCBpbiB5b3VyIGFwcC5cclxuXHQgKi9cclxuXHRkaXNwb3NlKCkge1xyXG5cclxuXHRcdHRoaXMuY2hpbGRyZW5bIDAgXS5nZW9tZXRyeS5kaXNwb3NlKCk7XHJcblx0XHR0aGlzLmNoaWxkcmVuWyAwIF0ubWF0ZXJpYWwuZGlzcG9zZSgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIGhlbHBlciB0byBtYXRjaCB0aGUgcG9zaXRpb24gYW5kIGRpcmVjdGlvbiBvZiB0aGVcclxuXHQgKiBsaWdodCBiZWluZyB2aXN1YWxpemVkLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZSgpIHtcclxuXHJcblx0XHRjb25zdCBtZXNoID0gdGhpcy5jaGlsZHJlblsgMCBdO1xyXG5cclxuXHRcdGlmICggdGhpcy5jb2xvciAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0dGhpcy5tYXRlcmlhbC5jb2xvci5zZXQoIHRoaXMuY29sb3IgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc3QgY29sb3JzID0gbWVzaC5nZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdjb2xvcicgKTtcclxuXHJcblx0XHRcdF9jb2xvcjEuY29weSggdGhpcy5saWdodC5jb2xvciApO1xyXG5cdFx0XHRfY29sb3IyLmNvcHkoIHRoaXMubGlnaHQuZ3JvdW5kQ29sb3IgKTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGNvbG9ycy5jb3VudDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGNvbG9yID0gKCBpIDwgKCBsIC8gMiApICkgPyBfY29sb3IxIDogX2NvbG9yMjtcclxuXHJcblx0XHRcdFx0Y29sb3JzLnNldFhZWiggaSwgY29sb3IuciwgY29sb3IuZywgY29sb3IuYiApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29sb3JzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5saWdodC51cGRhdGVXb3JsZE1hdHJpeCggdHJ1ZSwgZmFsc2UgKTtcclxuXHJcblx0XHRtZXNoLmxvb2tBdCggX3ZlY3Rvci5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubGlnaHQubWF0cml4V29ybGQgKS5uZWdhdGUoKSApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgSGVtaXNwaGVyZUxpZ2h0SGVscGVyIH07XHJcbiIsImltcG9ydCB7IExpbmVTZWdtZW50cyB9IGZyb20gJy4uL29iamVjdHMvTGluZVNlZ21lbnRzLmpzJztcclxuaW1wb3J0IHsgTGluZUJhc2ljTWF0ZXJpYWwgfSBmcm9tICcuLi9tYXRlcmlhbHMvTGluZUJhc2ljTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5pbXBvcnQgeyBCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyR2VvbWV0cnkuanMnO1xyXG5pbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uL21hdGgvQ29sb3IuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRoZSBoZWxwZXIgaXMgYW4gb2JqZWN0IHRvIGRlZmluZSBncmlkcy4gR3JpZHMgYXJlIHR3by1kaW1lbnNpb25hbFxyXG4gKiBhcnJheXMgb2YgbGluZXMuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IHNpemUgPSAxMDtcclxuICogY29uc3QgZGl2aXNpb25zID0gMTA7XHJcbiAqXHJcbiAqIGNvbnN0IGdyaWRIZWxwZXIgPSBuZXcgVEhSRUUuR3JpZEhlbHBlciggc2l6ZSwgZGl2aXNpb25zICk7XHJcbiAqIHNjZW5lLmFkZCggZ3JpZEhlbHBlciApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIExpbmVTZWdtZW50c1xyXG4gKi9cclxuY2xhc3MgR3JpZEhlbHBlciBleHRlbmRzIExpbmVTZWdtZW50cyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgZ3JpZCBoZWxwZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3NpemU9MTBdIC0gVGhlIHNpemUgb2YgdGhlIGdyaWQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtkaXZpc2lvbnM9MTBdIC0gVGhlIG51bWJlciBvZiBkaXZpc2lvbnMgYWNyb3NzIHRoZSBncmlkLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfENvbG9yfHN0cmluZ30gW2NvbG9yMT0weDQ0NDQ0NF0gLSBUaGUgY29sb3Igb2YgdGhlIGNlbnRlciBsaW5lLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfENvbG9yfHN0cmluZ30gW2NvbG9yMj0weDg4ODg4OF0gLSBUaGUgY29sb3Igb2YgdGhlIGxpbmVzIG9mIHRoZSBncmlkLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBzaXplID0gMTAsIGRpdmlzaW9ucyA9IDEwLCBjb2xvcjEgPSAweDQ0NDQ0NCwgY29sb3IyID0gMHg4ODg4ODggKSB7XHJcblxyXG5cdFx0Y29sb3IxID0gbmV3IENvbG9yKCBjb2xvcjEgKTtcclxuXHRcdGNvbG9yMiA9IG5ldyBDb2xvciggY29sb3IyICk7XHJcblxyXG5cdFx0Y29uc3QgY2VudGVyID0gZGl2aXNpb25zIC8gMjtcclxuXHRcdGNvbnN0IHN0ZXAgPSBzaXplIC8gZGl2aXNpb25zO1xyXG5cdFx0Y29uc3QgaGFsZlNpemUgPSBzaXplIC8gMjtcclxuXHJcblx0XHRjb25zdCB2ZXJ0aWNlcyA9IFtdLCBjb2xvcnMgPSBbXTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGogPSAwLCBrID0gLSBoYWxmU2l6ZTsgaSA8PSBkaXZpc2lvbnM7IGkgKyssIGsgKz0gc3RlcCApIHtcclxuXHJcblx0XHRcdHZlcnRpY2VzLnB1c2goIC0gaGFsZlNpemUsIDAsIGssIGhhbGZTaXplLCAwLCBrICk7XHJcblx0XHRcdHZlcnRpY2VzLnB1c2goIGssIDAsIC0gaGFsZlNpemUsIGssIDAsIGhhbGZTaXplICk7XHJcblxyXG5cdFx0XHRjb25zdCBjb2xvciA9IGkgPT09IGNlbnRlciA/IGNvbG9yMSA6IGNvbG9yMjtcclxuXHJcblx0XHRcdGNvbG9yLnRvQXJyYXkoIGNvbG9ycywgaiApOyBqICs9IDM7XHJcblx0XHRcdGNvbG9yLnRvQXJyYXkoIGNvbG9ycywgaiApOyBqICs9IDM7XHJcblx0XHRcdGNvbG9yLnRvQXJyYXkoIGNvbG9ycywgaiApOyBqICs9IDM7XHJcblx0XHRcdGNvbG9yLnRvQXJyYXkoIGNvbG9ycywgaiApOyBqICs9IDM7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XHJcblx0XHRnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XHJcblx0XHRnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdjb2xvcicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBjb2xvcnMsIDMgKSApO1xyXG5cclxuXHRcdGNvbnN0IG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IHZlcnRleENvbG9yczogdHJ1ZSwgdG9uZU1hcHBlZDogZmFsc2UgfSApO1xyXG5cclxuXHRcdHN1cGVyKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnR3JpZEhlbHBlcic7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRnJlZXMgdGhlIEdQVS1yZWxhdGVkIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhpcyBpbnN0YW5jZS4gQ2FsbCB0aGlzXHJcblx0ICogbWV0aG9kIHdoZW5ldmVyIHRoaXMgaW5zdGFuY2UgaXMgbm8gbG9uZ2VyIHVzZWQgaW4geW91ciBhcHAuXHJcblx0ICovXHJcblx0ZGlzcG9zZSgpIHtcclxuXHJcblx0XHR0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKTtcclxuXHRcdHRoaXMubWF0ZXJpYWwuZGlzcG9zZSgpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgR3JpZEhlbHBlciB9O1xyXG4iLCJpbXBvcnQgeyBMaW5lU2VnbWVudHMgfSBmcm9tICcuLi9vYmplY3RzL0xpbmVTZWdtZW50cy5qcyc7XHJcbmltcG9ydCB7IExpbmVCYXNpY01hdGVyaWFsIH0gZnJvbSAnLi4vbWF0ZXJpYWxzL0xpbmVCYXNpY01hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyQXR0cmlidXRlLmpzJztcclxuaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcclxuaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi9tYXRoL0NvbG9yLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGhlbHBlciBpcyBhbiBvYmplY3QgdG8gZGVmaW5lIHBvbGFyIGdyaWRzLiBHcmlkcyBhcmVcclxuICogdHdvLWRpbWVuc2lvbmFsIGFycmF5cyBvZiBsaW5lcy5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgcmFkaXVzID0gMTA7XHJcbiAqIGNvbnN0IHNlY3RvcnMgPSAxNjtcclxuICogY29uc3QgcmluZ3MgPSA4O1xyXG4gKiBjb25zdCBkaXZpc2lvbnMgPSA2NDtcclxuICpcclxuICogY29uc3QgaGVscGVyID0gbmV3IFRIUkVFLlBvbGFyR3JpZEhlbHBlciggcmFkaXVzLCBzZWN0b3JzLCByaW5ncywgZGl2aXNpb25zICk7XHJcbiAqIHNjZW5lLmFkZCggaGVscGVyICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTGluZVNlZ21lbnRzXHJcbiAqL1xyXG5jbGFzcyBQb2xhckdyaWRIZWxwZXIgZXh0ZW5kcyBMaW5lU2VnbWVudHMge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHBvbGFyIGdyaWQgaGVscGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpdXM9MTBdIC0gVGhlIHJhZGl1cyBvZiB0aGUgcG9sYXIgZ3JpZC4gVGhpcyBjYW4gYmUgYW55IHBvc2l0aXZlIG51bWJlci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3NlY3RvcnM9MTZdIC0gVGhlIG51bWJlciBvZiBzZWN0b3JzIHRoZSBncmlkIHdpbGwgYmUgZGl2aWRlZCBpbnRvLiBUaGlzIGNhbiBiZSBhbnkgcG9zaXRpdmUgaW50ZWdlci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3JpbmdzPTE2XSAtIFRoZSBudW1iZXIgb2YgcmluZ3MuIFRoaXMgY2FuIGJlIGFueSBwb3NpdGl2ZSBpbnRlZ2VyLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZGl2aXNpb25zPTY0XSAtIFRoZSBudW1iZXIgb2YgbGluZSBzZWdtZW50cyB1c2VkIGZvciBlYWNoIGNpcmNsZS4gVGhpcyBjYW4gYmUgYW55IHBvc2l0aXZlIGludGVnZXIuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ8Q29sb3J8c3RyaW5nfSBbY29sb3IxPTB4NDQ0NDQ0XSAtIFRoZSBmaXJzdCBjb2xvciB1c2VkIGZvciBncmlkIGVsZW1lbnRzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfENvbG9yfHN0cmluZ30gW2NvbG9yMj0weDg4ODg4OF0gLSAgVGhlIHNlY29uZCBjb2xvciB1c2VkIGZvciBncmlkIGVsZW1lbnRzLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCByYWRpdXMgPSAxMCwgc2VjdG9ycyA9IDE2LCByaW5ncyA9IDgsIGRpdmlzaW9ucyA9IDY0LCBjb2xvcjEgPSAweDQ0NDQ0NCwgY29sb3IyID0gMHg4ODg4ODggKSB7XHJcblxyXG5cdFx0Y29sb3IxID0gbmV3IENvbG9yKCBjb2xvcjEgKTtcclxuXHRcdGNvbG9yMiA9IG5ldyBDb2xvciggY29sb3IyICk7XHJcblxyXG5cdFx0Y29uc3QgdmVydGljZXMgPSBbXTtcclxuXHRcdGNvbnN0IGNvbG9ycyA9IFtdO1xyXG5cclxuXHRcdC8vIGNyZWF0ZSB0aGUgc2VjdG9yc1xyXG5cclxuXHRcdGlmICggc2VjdG9ycyA+IDEgKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBzZWN0b3JzOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB2ID0gKCBpIC8gc2VjdG9ycyApICogKCBNYXRoLlBJICogMiApO1xyXG5cclxuXHRcdFx0XHRjb25zdCB4ID0gTWF0aC5zaW4oIHYgKSAqIHJhZGl1cztcclxuXHRcdFx0XHRjb25zdCB6ID0gTWF0aC5jb3MoIHYgKSAqIHJhZGl1cztcclxuXHJcblx0XHRcdFx0dmVydGljZXMucHVzaCggMCwgMCwgMCApO1xyXG5cdFx0XHRcdHZlcnRpY2VzLnB1c2goIHgsIDAsIHogKTtcclxuXHJcblx0XHRcdFx0Y29uc3QgY29sb3IgPSAoIGkgJiAxICkgPyBjb2xvcjEgOiBjb2xvcjI7XHJcblxyXG5cdFx0XHRcdGNvbG9ycy5wdXNoKCBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iICk7XHJcblx0XHRcdFx0Y29sb3JzLnB1c2goIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gY3JlYXRlIHRoZSByaW5nc1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHJpbmdzOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgY29sb3IgPSAoIGkgJiAxICkgPyBjb2xvcjEgOiBjb2xvcjI7XHJcblxyXG5cdFx0XHRjb25zdCByID0gcmFkaXVzIC0gKCByYWRpdXMgLyByaW5ncyAqIGkgKTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBqID0gMDsgaiA8IGRpdmlzaW9uczsgaiArKyApIHtcclxuXHJcblx0XHRcdFx0Ly8gZmlyc3QgdmVydGV4XHJcblxyXG5cdFx0XHRcdGxldCB2ID0gKCBqIC8gZGl2aXNpb25zICkgKiAoIE1hdGguUEkgKiAyICk7XHJcblxyXG5cdFx0XHRcdGxldCB4ID0gTWF0aC5zaW4oIHYgKSAqIHI7XHJcblx0XHRcdFx0bGV0IHogPSBNYXRoLmNvcyggdiApICogcjtcclxuXHJcblx0XHRcdFx0dmVydGljZXMucHVzaCggeCwgMCwgeiApO1xyXG5cdFx0XHRcdGNvbG9ycy5wdXNoKCBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iICk7XHJcblxyXG5cdFx0XHRcdC8vIHNlY29uZCB2ZXJ0ZXhcclxuXHJcblx0XHRcdFx0diA9ICggKCBqICsgMSApIC8gZGl2aXNpb25zICkgKiAoIE1hdGguUEkgKiAyICk7XHJcblxyXG5cdFx0XHRcdHggPSBNYXRoLnNpbiggdiApICogcjtcclxuXHRcdFx0XHR6ID0gTWF0aC5jb3MoIHYgKSAqIHI7XHJcblxyXG5cdFx0XHRcdHZlcnRpY2VzLnB1c2goIHgsIDAsIHogKTtcclxuXHRcdFx0XHRjb2xvcnMucHVzaCggY29sb3IuciwgY29sb3IuZywgY29sb3IuYiApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xyXG5cdFx0Z2VvbWV0cnkuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xyXG5cdFx0Z2VvbWV0cnkuc2V0QXR0cmlidXRlKCAnY29sb3InLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAzICkgKTtcclxuXHJcblx0XHRjb25zdCBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyB2ZXJ0ZXhDb2xvcnM6IHRydWUsIHRvbmVNYXBwZWQ6IGZhbHNlIH0gKTtcclxuXHJcblx0XHRzdXBlciggZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ1BvbGFyR3JpZEhlbHBlcic7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRnJlZXMgdGhlIEdQVS1yZWxhdGVkIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhpcyBpbnN0YW5jZS4gQ2FsbCB0aGlzXHJcblx0ICogbWV0aG9kIHdoZW5ldmVyIHRoaXMgaW5zdGFuY2UgaXMgbm8gbG9uZ2VyIHVzZWQgaW4geW91ciBhcHAuXHJcblx0ICovXHJcblx0ZGlzcG9zZSgpIHtcclxuXHJcblx0XHR0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKTtcclxuXHRcdHRoaXMubWF0ZXJpYWwuZGlzcG9zZSgpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgUG9sYXJHcmlkSGVscGVyIH07XHJcbiIsImltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBPYmplY3QzRCB9IGZyb20gJy4uL2NvcmUvT2JqZWN0M0QuanMnO1xyXG5pbXBvcnQgeyBMaW5lIH0gZnJvbSAnLi4vb2JqZWN0cy9MaW5lLmpzJztcclxuaW1wb3J0IHsgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyQXR0cmlidXRlLmpzJztcclxuaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcclxuaW1wb3J0IHsgTGluZUJhc2ljTWF0ZXJpYWwgfSBmcm9tICcuLi9tYXRlcmlhbHMvTGluZUJhc2ljTWF0ZXJpYWwuanMnO1xyXG5cclxuY29uc3QgX3YxID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfdjIgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF92MyA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuXHJcbi8qKlxyXG4gKiBIZWxwZXIgb2JqZWN0IHRvIGFzc2lzdCB3aXRoIHZpc3VhbGl6aW5nIGEge0BsaW5rIERpcmVjdGlvbmFsTGlnaHR9J3NcclxuICogZWZmZWN0IG9uIHRoZSBzY2VuZS4gVGhpcyBjb25zaXN0cyBvZiBwbGFuZSBhbmQgYSBsaW5lIHJlcHJlc2VudGluZyB0aGVcclxuICogbGlnaHQncyBwb3NpdGlvbiBhbmQgZGlyZWN0aW9uLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBsaWdodCA9IG5ldyBUSFJFRS5EaXJlY3Rpb25hbExpZ2h0KCAweEZGRkZGRiApO1xyXG4gKiBzY2VuZS5hZGQoIGxpZ2h0ICk7XHJcbiAqXHJcbiAqIGNvbnN0IGhlbHBlciA9IG5ldyBUSFJFRS5EaXJlY3Rpb25hbExpZ2h0SGVscGVyKCBsaWdodCwgNSApO1xyXG4gKiBzY2VuZS5hZGQoIGhlbHBlciApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIE9iamVjdDNEXHJcbiAqL1xyXG5jbGFzcyBEaXJlY3Rpb25hbExpZ2h0SGVscGVyIGV4dGVuZHMgT2JqZWN0M0Qge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGRpcmVjdGlvbmFsIGxpZ2h0IGhlbHBlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7RGlyZWN0aW9uYWxMaWdodH0gbGlnaHQgLSBUaGUgbGlnaHQgdG8gYmUgdmlzdWFsaXplZC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3NpemU9MV0gLSBUaGUgZGltZW5zaW9ucyBvZiB0aGUgcGxhbmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ8Q29sb3J8c3RyaW5nfSBbY29sb3JdIC0gVGhlIGhlbHBlcidzIGNvbG9yLiBJZiBub3Qgc2V0LCB0aGUgaGVscGVyIHdpbGwgdGFrZVxyXG5cdCAqIHRoZSBjb2xvciBvZiB0aGUgbGlnaHQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGxpZ2h0LCBzaXplLCBjb2xvciApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGxpZ2h0IGJlaW5nIHZpc3VhbGl6ZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0RpcmVjdGlvbmFsTGlnaHR9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGlnaHQgPSBsaWdodDtcclxuXHJcblx0XHR0aGlzLm1hdHJpeCA9IGxpZ2h0Lm1hdHJpeFdvcmxkO1xyXG5cdFx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY29sb3IgcGFyYW1ldGVyIHBhc3NlZCBpbiB0aGUgY29uc3RydWN0b3IuXHJcblx0XHQgKiBJZiBub3Qgc2V0LCB0aGUgaGVscGVyIHdpbGwgdGFrZSB0aGUgY29sb3Igb2YgdGhlIGxpZ2h0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ8Q29sb3J8c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvbG9yID0gY29sb3I7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ0RpcmVjdGlvbmFsTGlnaHRIZWxwZXInO1xyXG5cclxuXHRcdGlmICggc2l6ZSA9PT0gdW5kZWZpbmVkICkgc2l6ZSA9IDE7XHJcblxyXG5cdFx0bGV0IGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XHJcblx0XHRnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBbXHJcblx0XHRcdC0gc2l6ZSwgc2l6ZSwgMCxcclxuXHRcdFx0c2l6ZSwgc2l6ZSwgMCxcclxuXHRcdFx0c2l6ZSwgLSBzaXplLCAwLFxyXG5cdFx0XHQtIHNpemUsIC0gc2l6ZSwgMCxcclxuXHRcdFx0LSBzaXplLCBzaXplLCAwXHJcblx0XHRdLCAzICkgKTtcclxuXHJcblx0XHRjb25zdCBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBmb2c6IGZhbHNlLCB0b25lTWFwcGVkOiBmYWxzZSB9ICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDb250YWlucyB0aGUgbGluZSBzaG93aW5nIHRoZSBsb2NhdGlvbiBvZiB0aGUgZGlyZWN0aW9uYWwgbGlnaHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0xpbmV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGlnaHRQbGFuZSA9IG5ldyBMaW5lKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuXHRcdHRoaXMuYWRkKCB0aGlzLmxpZ2h0UGxhbmUgKTtcclxuXHJcblx0XHRnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xyXG5cdFx0Z2VvbWV0cnkuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggWyAwLCAwLCAwLCAwLCAwLCAxIF0sIDMgKSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVwcmVzZW50cyB0aGUgdGFyZ2V0IGxpbmUgb2YgdGhlIGRpcmVjdGlvbmFsIGxpZ2h0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtMaW5lfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRhcmdldExpbmUgPSBuZXcgTGluZSggZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcblx0XHR0aGlzLmFkZCggdGhpcy50YXJnZXRMaW5lICk7XHJcblxyXG5cdFx0dGhpcy51cGRhdGUoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGcmVlcyB0aGUgR1BVLXJlbGF0ZWQgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGlzIGluc3RhbmNlLiBDYWxsIHRoaXNcclxuXHQgKiBtZXRob2Qgd2hlbmV2ZXIgdGhpcyBpbnN0YW5jZSBpcyBubyBsb25nZXIgdXNlZCBpbiB5b3VyIGFwcC5cclxuXHQgKi9cclxuXHRkaXNwb3NlKCkge1xyXG5cclxuXHRcdHRoaXMubGlnaHRQbGFuZS5nZW9tZXRyeS5kaXNwb3NlKCk7XHJcblx0XHR0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuZGlzcG9zZSgpO1xyXG5cdFx0dGhpcy50YXJnZXRMaW5lLmdlb21ldHJ5LmRpc3Bvc2UoKTtcclxuXHRcdHRoaXMudGFyZ2V0TGluZS5tYXRlcmlhbC5kaXNwb3NlKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgaGVscGVyIHRvIG1hdGNoIHRoZSBwb3NpdGlvbiBhbmQgZGlyZWN0aW9uIG9mIHRoZVxyXG5cdCAqIGxpZ2h0IGJlaW5nIHZpc3VhbGl6ZWQuXHJcblx0ICovXHJcblx0dXBkYXRlKCkge1xyXG5cclxuXHRcdHRoaXMubGlnaHQudXBkYXRlV29ybGRNYXRyaXgoIHRydWUsIGZhbHNlICk7XHJcblx0XHR0aGlzLmxpZ2h0LnRhcmdldC51cGRhdGVXb3JsZE1hdHJpeCggdHJ1ZSwgZmFsc2UgKTtcclxuXHJcblx0XHRfdjEuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkICk7XHJcblx0XHRfdjIuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLmxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCApO1xyXG5cdFx0X3YzLnN1YlZlY3RvcnMoIF92MiwgX3YxICk7XHJcblxyXG5cdFx0dGhpcy5saWdodFBsYW5lLmxvb2tBdCggX3YyICk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmNvbG9yICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuY29sb3Iuc2V0KCB0aGlzLmNvbG9yICk7XHJcblx0XHRcdHRoaXMudGFyZ2V0TGluZS5tYXRlcmlhbC5jb2xvci5zZXQoIHRoaXMuY29sb3IgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGhpcy5saWdodFBsYW5lLm1hdGVyaWFsLmNvbG9yLmNvcHkoIHRoaXMubGlnaHQuY29sb3IgKTtcclxuXHRcdFx0dGhpcy50YXJnZXRMaW5lLm1hdGVyaWFsLmNvbG9yLmNvcHkoIHRoaXMubGlnaHQuY29sb3IgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy50YXJnZXRMaW5lLmxvb2tBdCggX3YyICk7XHJcblx0XHR0aGlzLnRhcmdldExpbmUuc2NhbGUueiA9IF92My5sZW5ndGgoKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCB7IERpcmVjdGlvbmFsTGlnaHRIZWxwZXIgfTtcclxuIiwiaW1wb3J0IHsgQ2FtZXJhIH0gZnJvbSAnLi4vY2FtZXJhcy9DYW1lcmEuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuaW1wb3J0IHsgTGluZVNlZ21lbnRzIH0gZnJvbSAnLi4vb2JqZWN0cy9MaW5lU2VnbWVudHMuanMnO1xyXG5pbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uL21hdGgvQ29sb3IuanMnO1xyXG5pbXBvcnQgeyBMaW5lQmFzaWNNYXRlcmlhbCB9IGZyb20gJy4uL21hdGVyaWFscy9MaW5lQmFzaWNNYXRlcmlhbC5qcyc7XHJcbmltcG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9CdWZmZXJHZW9tZXRyeS5qcyc7XHJcbmltcG9ydCB7IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcbmltcG9ydCB7IFdlYkdMQ29vcmRpbmF0ZVN5c3RlbSB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XHJcblxyXG5jb25zdCBfdmVjdG9yID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfY2FtZXJhID0gLypAX19QVVJFX18qLyBuZXcgQ2FtZXJhKCk7XHJcblxyXG4vKipcclxuICogVGhpcyBoZWxwcyB3aXRoIHZpc3VhbGl6aW5nIHdoYXQgYSBjYW1lcmEgY29udGFpbnMgaW4gaXRzIGZydXN0dW0uIEl0XHJcbiAqIHZpc3VhbGl6ZXMgdGhlIGZydXN0dW0gb2YgYSBjYW1lcmEgdXNpbmcgYSBsaW5lIHNlZ21lbnRzLlxyXG4gKlxyXG4gKiBCYXNlZCBvbiBmcnVzdHVtIHZpc3VhbGl6YXRpb24gaW4gW2xpZ2h0Z2wuanMgc2hhZG93bWFwIGV4YW1wbGVde0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9ldmFudy9saWdodGdsLmpzL2Jsb2IvbWFzdGVyL3Rlc3RzL3NoYWRvd21hcC5odG1sfS5cclxuICpcclxuICogYENhbWVyYUhlbHBlcmAgbXVzdCBiZSBhIGNoaWxkIG9mIHRoZSBzY2VuZS5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgY2FtZXJhID0gbmV3IFRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhKCA3NSwgd2luZG93LmlubmVyV2lkdGggLyB3aW5kb3cuaW5uZXJIZWlnaHQsIDAuMSwgMTAwMCApO1xyXG4gKiBjb25zdCBoZWxwZXIgPSBuZXcgVEhSRUUuQ2FtZXJhSGVscGVyKCBjYW1lcmEgKTtcclxuICogc2NlbmUuYWRkKCBoZWxwZXIgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBMaW5lU2VnbWVudHNcclxuICovXHJcbmNsYXNzIENhbWVyYUhlbHBlciBleHRlbmRzIExpbmVTZWdtZW50cyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYXJyb3cgaGVscGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtDYW1lcmF9IGNhbWVyYSAtIFRoZSBjYW1lcmEgdG8gdmlzdWFsaXplLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBjYW1lcmEgKSB7XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcclxuXHRcdGNvbnN0IG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiAweGZmZmZmZiwgdmVydGV4Q29sb3JzOiB0cnVlLCB0b25lTWFwcGVkOiBmYWxzZSB9ICk7XHJcblxyXG5cdFx0Y29uc3QgdmVydGljZXMgPSBbXTtcclxuXHRcdGNvbnN0IGNvbG9ycyA9IFtdO1xyXG5cclxuXHRcdGNvbnN0IHBvaW50TWFwID0ge307XHJcblxyXG5cdFx0Ly8gbmVhclxyXG5cclxuXHRcdGFkZExpbmUoICduMScsICduMicgKTtcclxuXHRcdGFkZExpbmUoICduMicsICduNCcgKTtcclxuXHRcdGFkZExpbmUoICduNCcsICduMycgKTtcclxuXHRcdGFkZExpbmUoICduMycsICduMScgKTtcclxuXHJcblx0XHQvLyBmYXJcclxuXHJcblx0XHRhZGRMaW5lKCAnZjEnLCAnZjInICk7XHJcblx0XHRhZGRMaW5lKCAnZjInLCAnZjQnICk7XHJcblx0XHRhZGRMaW5lKCAnZjQnLCAnZjMnICk7XHJcblx0XHRhZGRMaW5lKCAnZjMnLCAnZjEnICk7XHJcblxyXG5cdFx0Ly8gc2lkZXNcclxuXHJcblx0XHRhZGRMaW5lKCAnbjEnLCAnZjEnICk7XHJcblx0XHRhZGRMaW5lKCAnbjInLCAnZjInICk7XHJcblx0XHRhZGRMaW5lKCAnbjMnLCAnZjMnICk7XHJcblx0XHRhZGRMaW5lKCAnbjQnLCAnZjQnICk7XHJcblxyXG5cdFx0Ly8gY29uZVxyXG5cclxuXHRcdGFkZExpbmUoICdwJywgJ24xJyApO1xyXG5cdFx0YWRkTGluZSggJ3AnLCAnbjInICk7XHJcblx0XHRhZGRMaW5lKCAncCcsICduMycgKTtcclxuXHRcdGFkZExpbmUoICdwJywgJ240JyApO1xyXG5cclxuXHRcdC8vIHVwXHJcblxyXG5cdFx0YWRkTGluZSggJ3UxJywgJ3UyJyApO1xyXG5cdFx0YWRkTGluZSggJ3UyJywgJ3UzJyApO1xyXG5cdFx0YWRkTGluZSggJ3UzJywgJ3UxJyApO1xyXG5cclxuXHRcdC8vIHRhcmdldFxyXG5cclxuXHRcdGFkZExpbmUoICdjJywgJ3QnICk7XHJcblx0XHRhZGRMaW5lKCAncCcsICdjJyApO1xyXG5cclxuXHRcdC8vIGNyb3NzXHJcblxyXG5cdFx0YWRkTGluZSggJ2NuMScsICdjbjInICk7XHJcblx0XHRhZGRMaW5lKCAnY24zJywgJ2NuNCcgKTtcclxuXHJcblx0XHRhZGRMaW5lKCAnY2YxJywgJ2NmMicgKTtcclxuXHRcdGFkZExpbmUoICdjZjMnLCAnY2Y0JyApO1xyXG5cclxuXHRcdGZ1bmN0aW9uIGFkZExpbmUoIGEsIGIgKSB7XHJcblxyXG5cdFx0XHRhZGRQb2ludCggYSApO1xyXG5cdFx0XHRhZGRQb2ludCggYiApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiBhZGRQb2ludCggaWQgKSB7XHJcblxyXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCAwLCAwLCAwICk7XHJcblx0XHRcdGNvbG9ycy5wdXNoKCAwLCAwLCAwICk7XHJcblxyXG5cdFx0XHRpZiAoIHBvaW50TWFwWyBpZCBdID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdHBvaW50TWFwWyBpZCBdID0gW107XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRwb2ludE1hcFsgaWQgXS5wdXNoKCAoIHZlcnRpY2VzLmxlbmd0aCAvIDMgKSAtIDEgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Z2VvbWV0cnkuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xyXG5cdFx0Z2VvbWV0cnkuc2V0QXR0cmlidXRlKCAnY29sb3InLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAzICkgKTtcclxuXHJcblx0XHRzdXBlciggZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ0NhbWVyYUhlbHBlcic7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY2FtZXJhIGJlaW5nIHZpc3VhbGl6ZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0NhbWVyYX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jYW1lcmEgPSBjYW1lcmE7XHJcblx0XHRpZiAoIHRoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXggKSB0aGlzLmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XHJcblxyXG5cdFx0dGhpcy5tYXRyaXggPSBjYW1lcmEubWF0cml4V29ybGQ7XHJcblx0XHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgY29udGFpbnMgdGhlIHBvaW50cyB1c2VkIHRvIHZpc3VhbGl6ZSB0aGUgY2FtZXJhLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLEFycmF5PG51bWJlcj4+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBvaW50TWFwID0gcG9pbnRNYXA7XHJcblxyXG5cdFx0dGhpcy51cGRhdGUoKTtcclxuXHJcblx0XHQvLyBjb2xvcnNcclxuXHJcblx0XHRjb25zdCBjb2xvckZydXN0dW0gPSBuZXcgQ29sb3IoIDB4ZmZhYTAwICk7XHJcblx0XHRjb25zdCBjb2xvckNvbmUgPSBuZXcgQ29sb3IoIDB4ZmYwMDAwICk7XHJcblx0XHRjb25zdCBjb2xvclVwID0gbmV3IENvbG9yKCAweDAwYWFmZiApO1xyXG5cdFx0Y29uc3QgY29sb3JUYXJnZXQgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7XHJcblx0XHRjb25zdCBjb2xvckNyb3NzID0gbmV3IENvbG9yKCAweDMzMzMzMyApO1xyXG5cclxuXHRcdHRoaXMuc2V0Q29sb3JzKCBjb2xvckZydXN0dW0sIGNvbG9yQ29uZSwgY29sb3JVcCwgY29sb3JUYXJnZXQsIGNvbG9yQ3Jvc3MgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWZpbmVzIHRoZSBjb2xvcnMgb2YgdGhlIGhlbHBlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Q29sb3J9IGZydXN0dW0gLSBUaGUgZnJ1c3R1bSBsaW5lIGNvbG9yLlxyXG5cdCAqIEBwYXJhbSB7Q29sb3J9IGNvbmUgLSBUaGUgY29uZSBsaW5lIGNvbG9yLlxyXG5cdCAqIEBwYXJhbSB7Q29sb3J9IHVwIC0gVGhlIHVwIGxpbmUgY29sb3IuXHJcblx0ICogQHBhcmFtIHtDb2xvcn0gdGFyZ2V0IC0gVGhlIHRhcmdldCBsaW5lIGNvbG9yLlxyXG5cdCAqIEBwYXJhbSB7Q29sb3J9IGNyb3NzIC0gVGhlIGNyb3NzIGxpbmUgY29sb3IuXHJcblx0ICovXHJcblx0c2V0Q29sb3JzKCBmcnVzdHVtLCBjb25lLCB1cCwgdGFyZ2V0LCBjcm9zcyApIHtcclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XHJcblxyXG5cdFx0Y29uc3QgY29sb3JBdHRyaWJ1dGUgPSBnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdjb2xvcicgKTtcclxuXHJcblx0XHQvLyBuZWFyXHJcblxyXG5cdFx0Y29sb3JBdHRyaWJ1dGUuc2V0WFlaKCAwLCBmcnVzdHVtLnIsIGZydXN0dW0uZywgZnJ1c3R1bS5iICk7IGNvbG9yQXR0cmlidXRlLnNldFhZWiggMSwgZnJ1c3R1bS5yLCBmcnVzdHVtLmcsIGZydXN0dW0uYiApOyAvLyBuMSwgbjJcclxuXHRcdGNvbG9yQXR0cmlidXRlLnNldFhZWiggMiwgZnJ1c3R1bS5yLCBmcnVzdHVtLmcsIGZydXN0dW0uYiApOyBjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDMsIGZydXN0dW0uciwgZnJ1c3R1bS5nLCBmcnVzdHVtLmIgKTsgLy8gbjIsIG40XHJcblx0XHRjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDQsIGZydXN0dW0uciwgZnJ1c3R1bS5nLCBmcnVzdHVtLmIgKTsgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKCA1LCBmcnVzdHVtLnIsIGZydXN0dW0uZywgZnJ1c3R1bS5iICk7IC8vIG40LCBuM1xyXG5cdFx0Y29sb3JBdHRyaWJ1dGUuc2V0WFlaKCA2LCBmcnVzdHVtLnIsIGZydXN0dW0uZywgZnJ1c3R1bS5iICk7IGNvbG9yQXR0cmlidXRlLnNldFhZWiggNywgZnJ1c3R1bS5yLCBmcnVzdHVtLmcsIGZydXN0dW0uYiApOyAvLyBuMywgbjFcclxuXHJcblx0XHQvLyBmYXJcclxuXHJcblx0XHRjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDgsIGZydXN0dW0uciwgZnJ1c3R1bS5nLCBmcnVzdHVtLmIgKTsgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKCA5LCBmcnVzdHVtLnIsIGZydXN0dW0uZywgZnJ1c3R1bS5iICk7IC8vIGYxLCBmMlxyXG5cdFx0Y29sb3JBdHRyaWJ1dGUuc2V0WFlaKCAxMCwgZnJ1c3R1bS5yLCBmcnVzdHVtLmcsIGZydXN0dW0uYiApOyBjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDExLCBmcnVzdHVtLnIsIGZydXN0dW0uZywgZnJ1c3R1bS5iICk7IC8vIGYyLCBmNFxyXG5cdFx0Y29sb3JBdHRyaWJ1dGUuc2V0WFlaKCAxMiwgZnJ1c3R1bS5yLCBmcnVzdHVtLmcsIGZydXN0dW0uYiApOyBjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDEzLCBmcnVzdHVtLnIsIGZydXN0dW0uZywgZnJ1c3R1bS5iICk7IC8vIGY0LCBmM1xyXG5cdFx0Y29sb3JBdHRyaWJ1dGUuc2V0WFlaKCAxNCwgZnJ1c3R1bS5yLCBmcnVzdHVtLmcsIGZydXN0dW0uYiApOyBjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDE1LCBmcnVzdHVtLnIsIGZydXN0dW0uZywgZnJ1c3R1bS5iICk7IC8vIGYzLCBmMVxyXG5cclxuXHRcdC8vIHNpZGVzXHJcblxyXG5cdFx0Y29sb3JBdHRyaWJ1dGUuc2V0WFlaKCAxNiwgZnJ1c3R1bS5yLCBmcnVzdHVtLmcsIGZydXN0dW0uYiApOyBjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDE3LCBmcnVzdHVtLnIsIGZydXN0dW0uZywgZnJ1c3R1bS5iICk7IC8vIG4xLCBmMVxyXG5cdFx0Y29sb3JBdHRyaWJ1dGUuc2V0WFlaKCAxOCwgZnJ1c3R1bS5yLCBmcnVzdHVtLmcsIGZydXN0dW0uYiApOyBjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDE5LCBmcnVzdHVtLnIsIGZydXN0dW0uZywgZnJ1c3R1bS5iICk7IC8vIG4yLCBmMlxyXG5cdFx0Y29sb3JBdHRyaWJ1dGUuc2V0WFlaKCAyMCwgZnJ1c3R1bS5yLCBmcnVzdHVtLmcsIGZydXN0dW0uYiApOyBjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDIxLCBmcnVzdHVtLnIsIGZydXN0dW0uZywgZnJ1c3R1bS5iICk7IC8vIG4zLCBmM1xyXG5cdFx0Y29sb3JBdHRyaWJ1dGUuc2V0WFlaKCAyMiwgZnJ1c3R1bS5yLCBmcnVzdHVtLmcsIGZydXN0dW0uYiApOyBjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDIzLCBmcnVzdHVtLnIsIGZydXN0dW0uZywgZnJ1c3R1bS5iICk7IC8vIG40LCBmNFxyXG5cclxuXHRcdC8vIGNvbmVcclxuXHJcblx0XHRjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDI0LCBjb25lLnIsIGNvbmUuZywgY29uZS5iICk7IGNvbG9yQXR0cmlidXRlLnNldFhZWiggMjUsIGNvbmUuciwgY29uZS5nLCBjb25lLmIgKTsgLy8gcCwgbjFcclxuXHRcdGNvbG9yQXR0cmlidXRlLnNldFhZWiggMjYsIGNvbmUuciwgY29uZS5nLCBjb25lLmIgKTsgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKCAyNywgY29uZS5yLCBjb25lLmcsIGNvbmUuYiApOyAvLyBwLCBuMlxyXG5cdFx0Y29sb3JBdHRyaWJ1dGUuc2V0WFlaKCAyOCwgY29uZS5yLCBjb25lLmcsIGNvbmUuYiApOyBjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDI5LCBjb25lLnIsIGNvbmUuZywgY29uZS5iICk7IC8vIHAsIG4zXHJcblx0XHRjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDMwLCBjb25lLnIsIGNvbmUuZywgY29uZS5iICk7IGNvbG9yQXR0cmlidXRlLnNldFhZWiggMzEsIGNvbmUuciwgY29uZS5nLCBjb25lLmIgKTsgLy8gcCwgbjRcclxuXHJcblx0XHQvLyB1cFxyXG5cclxuXHRcdGNvbG9yQXR0cmlidXRlLnNldFhZWiggMzIsIHVwLnIsIHVwLmcsIHVwLmIgKTsgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKCAzMywgdXAuciwgdXAuZywgdXAuYiApOyAvLyB1MSwgdTJcclxuXHRcdGNvbG9yQXR0cmlidXRlLnNldFhZWiggMzQsIHVwLnIsIHVwLmcsIHVwLmIgKTsgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKCAzNSwgdXAuciwgdXAuZywgdXAuYiApOyAvLyB1MiwgdTNcclxuXHRcdGNvbG9yQXR0cmlidXRlLnNldFhZWiggMzYsIHVwLnIsIHVwLmcsIHVwLmIgKTsgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKCAzNywgdXAuciwgdXAuZywgdXAuYiApOyAvLyB1MywgdTFcclxuXHJcblx0XHQvLyB0YXJnZXRcclxuXHJcblx0XHRjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDM4LCB0YXJnZXQuciwgdGFyZ2V0LmcsIHRhcmdldC5iICk7IGNvbG9yQXR0cmlidXRlLnNldFhZWiggMzksIHRhcmdldC5yLCB0YXJnZXQuZywgdGFyZ2V0LmIgKTsgLy8gYywgdFxyXG5cdFx0Y29sb3JBdHRyaWJ1dGUuc2V0WFlaKCA0MCwgY3Jvc3MuciwgY3Jvc3MuZywgY3Jvc3MuYiApOyBjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDQxLCBjcm9zcy5yLCBjcm9zcy5nLCBjcm9zcy5iICk7IC8vIHAsIGNcclxuXHJcblx0XHQvLyBjcm9zc1xyXG5cclxuXHRcdGNvbG9yQXR0cmlidXRlLnNldFhZWiggNDIsIGNyb3NzLnIsIGNyb3NzLmcsIGNyb3NzLmIgKTsgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKCA0MywgY3Jvc3MuciwgY3Jvc3MuZywgY3Jvc3MuYiApOyAvLyBjbjEsIGNuMlxyXG5cdFx0Y29sb3JBdHRyaWJ1dGUuc2V0WFlaKCA0NCwgY3Jvc3MuciwgY3Jvc3MuZywgY3Jvc3MuYiApOyBjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDQ1LCBjcm9zcy5yLCBjcm9zcy5nLCBjcm9zcy5iICk7IC8vIGNuMywgY240XHJcblxyXG5cdFx0Y29sb3JBdHRyaWJ1dGUuc2V0WFlaKCA0NiwgY3Jvc3MuciwgY3Jvc3MuZywgY3Jvc3MuYiApOyBjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDQ3LCBjcm9zcy5yLCBjcm9zcy5nLCBjcm9zcy5iICk7IC8vIGNmMSwgY2YyXHJcblx0XHRjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDQ4LCBjcm9zcy5yLCBjcm9zcy5nLCBjcm9zcy5iICk7IGNvbG9yQXR0cmlidXRlLnNldFhZWiggNDksIGNyb3NzLnIsIGNyb3NzLmcsIGNyb3NzLmIgKTsgLy8gY2YzLCBjZjRcclxuXHJcblx0XHRjb2xvckF0dHJpYnV0ZS5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgaGVscGVyIGJhc2VkIG9uIHRoZSBwcm9qZWN0aW9uIG1hdHJpeCBvZiB0aGUgY2FtZXJhLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZSgpIHtcclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XHJcblx0XHRjb25zdCBwb2ludE1hcCA9IHRoaXMucG9pbnRNYXA7XHJcblxyXG5cdFx0Y29uc3QgdyA9IDEsIGggPSAxO1xyXG5cclxuXHRcdC8vIHdlIG5lZWQganVzdCBjYW1lcmEgcHJvamVjdGlvbiBtYXRyaXggaW52ZXJzZVxyXG5cdFx0Ly8gd29ybGQgbWF0cml4IG11c3QgYmUgaWRlbnRpdHlcclxuXHJcblx0XHRfY2FtZXJhLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkoIHRoaXMuY2FtZXJhLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlICk7XHJcblxyXG5cdFx0Ly8gQWRqdXN0IHogdmFsdWVzIGJhc2VkIG9uIGNvb3JkaW5hdGUgc3lzdGVtXHJcblx0XHRjb25zdCBuZWFyWiA9IHRoaXMuY2FtZXJhLmNvb3JkaW5hdGVTeXN0ZW0gPT09IFdlYkdMQ29vcmRpbmF0ZVN5c3RlbSA/IC0gMSA6IDA7XHJcblxyXG5cdFx0Ly8gY2VudGVyIC8gdGFyZ2V0XHJcblx0XHRzZXRQb2ludCggJ2MnLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIDAsIDAsIG5lYXJaICk7XHJcblx0XHRzZXRQb2ludCggJ3QnLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIDAsIDAsIDEgKTtcclxuXHJcblx0XHQvLyBuZWFyXHJcblxyXG5cdFx0c2V0UG9pbnQoICduMScsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgLSB3LCAtIGgsIG5lYXJaICk7XHJcblx0XHRzZXRQb2ludCggJ24yJywgcG9pbnRNYXAsIGdlb21ldHJ5LCBfY2FtZXJhLCB3LCAtIGgsIG5lYXJaICk7XHJcblx0XHRzZXRQb2ludCggJ24zJywgcG9pbnRNYXAsIGdlb21ldHJ5LCBfY2FtZXJhLCAtIHcsIGgsIG5lYXJaICk7XHJcblx0XHRzZXRQb2ludCggJ240JywgcG9pbnRNYXAsIGdlb21ldHJ5LCBfY2FtZXJhLCB3LCBoLCBuZWFyWiApO1xyXG5cclxuXHRcdC8vIGZhclxyXG5cclxuXHRcdHNldFBvaW50KCAnZjEnLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIC0gdywgLSBoLCAxICk7XHJcblx0XHRzZXRQb2ludCggJ2YyJywgcG9pbnRNYXAsIGdlb21ldHJ5LCBfY2FtZXJhLCB3LCAtIGgsIDEgKTtcclxuXHRcdHNldFBvaW50KCAnZjMnLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIC0gdywgaCwgMSApO1xyXG5cdFx0c2V0UG9pbnQoICdmNCcsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgdywgaCwgMSApO1xyXG5cclxuXHRcdC8vIHVwXHJcblxyXG5cdFx0c2V0UG9pbnQoICd1MScsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgdyAqIDAuNywgaCAqIDEuMSwgbmVhclogKTtcclxuXHRcdHNldFBvaW50KCAndTInLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIC0gdyAqIDAuNywgaCAqIDEuMSwgbmVhclogKTtcclxuXHRcdHNldFBvaW50KCAndTMnLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIDAsIGggKiAyLCBuZWFyWiApO1xyXG5cclxuXHRcdC8vIGNyb3NzXHJcblxyXG5cdFx0c2V0UG9pbnQoICdjZjEnLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIC0gdywgMCwgMSApO1xyXG5cdFx0c2V0UG9pbnQoICdjZjInLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIHcsIDAsIDEgKTtcclxuXHRcdHNldFBvaW50KCAnY2YzJywgcG9pbnRNYXAsIGdlb21ldHJ5LCBfY2FtZXJhLCAwLCAtIGgsIDEgKTtcclxuXHRcdHNldFBvaW50KCAnY2Y0JywgcG9pbnRNYXAsIGdlb21ldHJ5LCBfY2FtZXJhLCAwLCBoLCAxICk7XHJcblxyXG5cdFx0c2V0UG9pbnQoICdjbjEnLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIC0gdywgMCwgbmVhclogKTtcclxuXHRcdHNldFBvaW50KCAnY24yJywgcG9pbnRNYXAsIGdlb21ldHJ5LCBfY2FtZXJhLCB3LCAwLCBuZWFyWiApO1xyXG5cdFx0c2V0UG9pbnQoICdjbjMnLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIDAsIC0gaCwgbmVhclogKTtcclxuXHRcdHNldFBvaW50KCAnY240JywgcG9pbnRNYXAsIGdlb21ldHJ5LCBfY2FtZXJhLCAwLCBoLCBuZWFyWiApO1xyXG5cclxuXHRcdGdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJyApLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGcmVlcyB0aGUgR1BVLXJlbGF0ZWQgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGlzIGluc3RhbmNlLiBDYWxsIHRoaXNcclxuXHQgKiBtZXRob2Qgd2hlbmV2ZXIgdGhpcyBpbnN0YW5jZSBpcyBubyBsb25nZXIgdXNlZCBpbiB5b3VyIGFwcC5cclxuXHQgKi9cclxuXHRkaXNwb3NlKCkge1xyXG5cclxuXHRcdHRoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpO1xyXG5cdFx0dGhpcy5tYXRlcmlhbC5kaXNwb3NlKCk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblxyXG5mdW5jdGlvbiBzZXRQb2ludCggcG9pbnQsIHBvaW50TWFwLCBnZW9tZXRyeSwgY2FtZXJhLCB4LCB5LCB6ICkge1xyXG5cclxuXHRfdmVjdG9yLnNldCggeCwgeSwgeiApLnVucHJvamVjdCggY2FtZXJhICk7XHJcblxyXG5cdGNvbnN0IHBvaW50cyA9IHBvaW50TWFwWyBwb2ludCBdO1xyXG5cclxuXHRpZiAoIHBvaW50cyAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdGNvbnN0IHBvc2l0aW9uID0gZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCAncG9zaXRpb24nICk7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gcG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRwb3NpdGlvbi5zZXRYWVooIHBvaW50c1sgaSBdLCBfdmVjdG9yLngsIF92ZWN0b3IueSwgX3ZlY3Rvci56ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBDYW1lcmFIZWxwZXIgfTtcclxuIiwiaW1wb3J0IHsgQm94MyB9IGZyb20gJy4uL21hdGgvQm94My5qcyc7XHJcbmltcG9ydCB7IExpbmVTZWdtZW50cyB9IGZyb20gJy4uL29iamVjdHMvTGluZVNlZ21lbnRzLmpzJztcclxuaW1wb3J0IHsgTGluZUJhc2ljTWF0ZXJpYWwgfSBmcm9tICcuLi9tYXRlcmlhbHMvTGluZUJhc2ljTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyBCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcbmltcG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9CdWZmZXJHZW9tZXRyeS5qcyc7XHJcblxyXG5jb25zdCBfYm94ID0gLypAX19QVVJFX18qLyBuZXcgQm94MygpO1xyXG5cclxuLyoqXHJcbiAqIEhlbHBlciBvYmplY3QgdG8gZ3JhcGhpY2FsbHkgc2hvdyB0aGUgd29ybGQtYXhpcy1hbGlnbmVkIGJvdW5kaW5nIGJveFxyXG4gKiBhcm91bmQgYW4gb2JqZWN0LiBUaGUgYWN0dWFsIGJvdW5kaW5nIGJveCBpcyBoYW5kbGVkIHdpdGgge0BsaW5rIEJveDN9LFxyXG4gKiB0aGlzIGlzIGp1c3QgYSB2aXN1YWwgaGVscGVyIGZvciBkZWJ1Z2dpbmcuIEl0IGNhbiBiZSBhdXRvbWF0aWNhbGx5XHJcbiAqIHJlc2l6ZWQgd2l0aCB7QGxpbmsgQm94SGVscGVyI3VwZGF0ZX0gd2hlbiB0aGUgb2JqZWN0IGl0J3MgY3JlYXRlZCBmcm9tXHJcbiAqIGlzIHRyYW5zZm9ybWVkLiBOb3RlIHRoYXQgdGhlIG9iamVjdCBtdXN0IGhhdmUgYSBnZW9tZXRyeSBmb3IgdGhpcyB0byB3b3JrLFxyXG4gKiBzbyBpdCB3b24ndCB3b3JrIHdpdGggc3ByaXRlcy5cclxuICpcclxuICogYGBganNcclxuICogY29uc3Qgc3BoZXJlID0gbmV3IFRIUkVFLlNwaGVyZUdlb21ldHJ5KCk7XHJcbiAqIGNvbnN0IG9iamVjdCA9IG5ldyBUSFJFRS5NZXNoKCBzcGhlcmUsIG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCggMHhmZjAwMDAgKSApO1xyXG4gKiBjb25zdCBib3ggPSBuZXcgVEhSRUUuQm94SGVscGVyKCBvYmplY3QsIDB4ZmZmZjAwICk7XHJcbiAqIHNjZW5lLmFkZCggYm94ICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTGluZVNlZ21lbnRzXHJcbiAqL1xyXG5jbGFzcyBCb3hIZWxwZXIgZXh0ZW5kcyBMaW5lU2VnbWVudHMge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGJveCBoZWxwZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdDNEfSBbb2JqZWN0XSAtIFRoZSAzRCBvYmplY3QgdG8gc2hvdyB0aGUgd29ybGQtYXhpcy1hbGlnbmVkIGJvdW5kaW5nIGJveC5cclxuXHQgKiBAcGFyYW0ge251bWJlcnxDb2xvcnxzdHJpbmd9IFtjb2xvcj0weGZmZmYwMF0gLSBUaGUgYm94J3MgY29sb3IuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG9iamVjdCwgY29sb3IgPSAweGZmZmYwMCApIHtcclxuXHJcblx0XHRjb25zdCBpbmRpY2VzID0gbmV3IFVpbnQxNkFycmF5KCBbIDAsIDEsIDEsIDIsIDIsIDMsIDMsIDAsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDQsIDAsIDQsIDEsIDUsIDIsIDYsIDMsIDcgXSApO1xyXG5cdFx0Y29uc3QgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJBcnJheSggOCAqIDMgKTtcclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xyXG5cdFx0Z2VvbWV0cnkuc2V0SW5kZXgoIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIGluZGljZXMsIDEgKSApO1xyXG5cdFx0Z2VvbWV0cnkuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbnMsIDMgKSApO1xyXG5cclxuXHRcdHN1cGVyKCBnZW9tZXRyeSwgbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciwgdG9uZU1hcHBlZDogZmFsc2UgfSApICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgM0Qgb2JqZWN0IGJlaW5nIHZpc3VhbGl6ZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdDNEfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm9iamVjdCA9IG9iamVjdDtcclxuXHRcdHRoaXMudHlwZSA9ICdCb3hIZWxwZXInO1xyXG5cclxuXHRcdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xyXG5cclxuXHRcdHRoaXMudXBkYXRlKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgaGVscGVyJ3MgZ2VvbWV0cnkgdG8gbWF0Y2ggdGhlIGRpbWVuc2lvbnMgb2YgdGhlIG9iamVjdCxcclxuXHQgKiBpbmNsdWRpbmcgYW55IGNoaWxkcmVuLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZSgpIHtcclxuXHJcblx0XHRpZiAoIHRoaXMub2JqZWN0ICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRfYm94LnNldEZyb21PYmplY3QoIHRoaXMub2JqZWN0ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggX2JveC5pc0VtcHR5KCkgKSByZXR1cm47XHJcblxyXG5cdFx0Y29uc3QgbWluID0gX2JveC5taW47XHJcblx0XHRjb25zdCBtYXggPSBfYm94Lm1heDtcclxuXHJcblx0XHQvKlxyXG5cdFx0XHQ1X19fXzRcclxuXHRcdDEvX19fMC98XHJcblx0XHR8IDZfX3xfN1xyXG5cdFx0Mi9fX18zL1xyXG5cclxuXHRcdDA6IG1heC54LCBtYXgueSwgbWF4LnpcclxuXHRcdDE6IG1pbi54LCBtYXgueSwgbWF4LnpcclxuXHRcdDI6IG1pbi54LCBtaW4ueSwgbWF4LnpcclxuXHRcdDM6IG1heC54LCBtaW4ueSwgbWF4LnpcclxuXHRcdDQ6IG1heC54LCBtYXgueSwgbWluLnpcclxuXHRcdDU6IG1pbi54LCBtYXgueSwgbWluLnpcclxuXHRcdDY6IG1pbi54LCBtaW4ueSwgbWluLnpcclxuXHRcdDc6IG1heC54LCBtaW4ueSwgbWluLnpcclxuXHRcdCovXHJcblxyXG5cdFx0Y29uc3QgcG9zaXRpb24gPSB0aGlzLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XHJcblx0XHRjb25zdCBhcnJheSA9IHBvc2l0aW9uLmFycmF5O1xyXG5cclxuXHRcdGFycmF5WyAwIF0gPSBtYXgueDsgYXJyYXlbIDEgXSA9IG1heC55OyBhcnJheVsgMiBdID0gbWF4Lno7XHJcblx0XHRhcnJheVsgMyBdID0gbWluLng7IGFycmF5WyA0IF0gPSBtYXgueTsgYXJyYXlbIDUgXSA9IG1heC56O1xyXG5cdFx0YXJyYXlbIDYgXSA9IG1pbi54OyBhcnJheVsgNyBdID0gbWluLnk7IGFycmF5WyA4IF0gPSBtYXguejtcclxuXHRcdGFycmF5WyA5IF0gPSBtYXgueDsgYXJyYXlbIDEwIF0gPSBtaW4ueTsgYXJyYXlbIDExIF0gPSBtYXguejtcclxuXHRcdGFycmF5WyAxMiBdID0gbWF4Lng7IGFycmF5WyAxMyBdID0gbWF4Lnk7IGFycmF5WyAxNCBdID0gbWluLno7XHJcblx0XHRhcnJheVsgMTUgXSA9IG1pbi54OyBhcnJheVsgMTYgXSA9IG1heC55OyBhcnJheVsgMTcgXSA9IG1pbi56O1xyXG5cdFx0YXJyYXlbIDE4IF0gPSBtaW4ueDsgYXJyYXlbIDE5IF0gPSBtaW4ueTsgYXJyYXlbIDIwIF0gPSBtaW4uejtcclxuXHRcdGFycmF5WyAyMSBdID0gbWF4Lng7IGFycmF5WyAyMiBdID0gbWluLnk7IGFycmF5WyAyMyBdID0gbWluLno7XHJcblxyXG5cdFx0cG9zaXRpb24ubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMuZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgd2lyZWZyYW1lIGJveCBmb3IgdGhlIHBhc3NlZCBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdDNEfSBvYmplY3QgLSBUaGUgM0Qgb2JqZWN0IHRvIGNyZWF0ZSB0aGUgaGVscGVyIGZvci5cclxuXHQgKiBAcmV0dXJuIHtCb3hIZWxwZXJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0RnJvbU9iamVjdCggb2JqZWN0ICkge1xyXG5cclxuXHRcdHRoaXMub2JqZWN0ID0gb2JqZWN0O1xyXG5cdFx0dGhpcy51cGRhdGUoKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UsIHJlY3Vyc2l2ZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UsIHJlY3Vyc2l2ZSApO1xyXG5cclxuXHRcdHRoaXMub2JqZWN0ID0gc291cmNlLm9iamVjdDtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGcmVlcyB0aGUgR1BVLXJlbGF0ZWQgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGlzIGluc3RhbmNlLiBDYWxsIHRoaXNcclxuXHQgKiBtZXRob2Qgd2hlbmV2ZXIgdGhpcyBpbnN0YW5jZSBpcyBubyBsb25nZXIgdXNlZCBpbiB5b3VyIGFwcC5cclxuXHQgKi9cclxuXHRkaXNwb3NlKCkge1xyXG5cclxuXHRcdHRoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpO1xyXG5cdFx0dGhpcy5tYXRlcmlhbC5kaXNwb3NlKCk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBCb3hIZWxwZXIgfTtcclxuIiwiaW1wb3J0IHsgTGluZVNlZ21lbnRzIH0gZnJvbSAnLi4vb2JqZWN0cy9MaW5lU2VnbWVudHMuanMnO1xyXG5pbXBvcnQgeyBMaW5lQmFzaWNNYXRlcmlhbCB9IGZyb20gJy4uL21hdGVyaWFscy9MaW5lQmFzaWNNYXRlcmlhbC5qcyc7XHJcbmltcG9ydCB7IEJ1ZmZlckF0dHJpYnV0ZSwgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyQXR0cmlidXRlLmpzJztcclxuaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIGhlbHBlciBvYmplY3QgdG8gdmlzdWFsaXplIGFuIGluc3RhbmNlIG9mIHtAbGluayBCb3gzfS5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgYm94ID0gbmV3IFRIUkVFLkJveDMoKTtcclxuICogYm94LnNldEZyb21DZW50ZXJBbmRTaXplKCBuZXcgVEhSRUUuVmVjdG9yMyggMSwgMSwgMSApLCBuZXcgVEhSRUUuVmVjdG9yMyggMiwgMSwgMyApICk7XHJcbiAqXHJcbiAqIGNvbnN0IGhlbHBlciA9IG5ldyBUSFJFRS5Cb3gzSGVscGVyKCBib3gsIDB4ZmZmZjAwICk7XHJcbiAqIHNjZW5lLmFkZCggaGVscGVyIClcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBMaW5lU2VnbWVudHNcclxuICovXHJcbmNsYXNzIEJveDNIZWxwZXIgZXh0ZW5kcyBMaW5lU2VnbWVudHMge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGJveDMgaGVscGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCb3gzfSBib3ggLSBUaGUgYm94IHRvIHZpc3VhbGl6ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcnxDb2xvcnxzdHJpbmd9IFtjb2xvcj0weGZmZmYwMF0gLSBUaGUgYm94J3MgY29sb3IuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGJveCwgY29sb3IgPSAweGZmZmYwMCApIHtcclxuXHJcblx0XHRjb25zdCBpbmRpY2VzID0gbmV3IFVpbnQxNkFycmF5KCBbIDAsIDEsIDEsIDIsIDIsIDMsIDMsIDAsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDQsIDAsIDQsIDEsIDUsIDIsIDYsIDMsIDcgXSApO1xyXG5cclxuXHRcdGNvbnN0IHBvc2l0aW9ucyA9IFsgMSwgMSwgMSwgLSAxLCAxLCAxLCAtIDEsIC0gMSwgMSwgMSwgLSAxLCAxLCAxLCAxLCAtIDEsIC0gMSwgMSwgLSAxLCAtIDEsIC0gMSwgLSAxLCAxLCAtIDEsIC0gMSBdO1xyXG5cclxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XHJcblxyXG5cdFx0Z2VvbWV0cnkuc2V0SW5kZXgoIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIGluZGljZXMsIDEgKSApO1xyXG5cclxuXHRcdGdlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9ucywgMyApICk7XHJcblxyXG5cdFx0c3VwZXIoIGdlb21ldHJ5LCBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGNvbG9yLCB0b25lTWFwcGVkOiBmYWxzZSB9ICkgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBib3ggYmVpbmcgdmlzdWFsaXplZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Qm94M31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ib3ggPSBib3g7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ0JveDNIZWxwZXInO1xyXG5cclxuXHRcdHRoaXMuZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XHJcblxyXG5cdH1cclxuXHJcblx0dXBkYXRlTWF0cml4V29ybGQoIGZvcmNlICkge1xyXG5cclxuXHRcdGNvbnN0IGJveCA9IHRoaXMuYm94O1xyXG5cclxuXHRcdGlmICggYm94LmlzRW1wdHkoKSApIHJldHVybjtcclxuXHJcblx0XHRib3guZ2V0Q2VudGVyKCB0aGlzLnBvc2l0aW9uICk7XHJcblxyXG5cdFx0Ym94LmdldFNpemUoIHRoaXMuc2NhbGUgKTtcclxuXHJcblx0XHR0aGlzLnNjYWxlLm11bHRpcGx5U2NhbGFyKCAwLjUgKTtcclxuXHJcblx0XHRzdXBlci51cGRhdGVNYXRyaXhXb3JsZCggZm9yY2UgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGcmVlcyB0aGUgR1BVLXJlbGF0ZWQgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGlzIGluc3RhbmNlLiBDYWxsIHRoaXNcclxuXHQgKiBtZXRob2Qgd2hlbmV2ZXIgdGhpcyBpbnN0YW5jZSBpcyBubyBsb25nZXIgdXNlZCBpbiB5b3VyIGFwcC5cclxuXHQgKi9cclxuXHRkaXNwb3NlKCkge1xyXG5cclxuXHRcdHRoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpO1xyXG5cdFx0dGhpcy5tYXRlcmlhbC5kaXNwb3NlKCk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IEJveDNIZWxwZXIgfTtcclxuIiwiaW1wb3J0IHsgTGluZSB9IGZyb20gJy4uL29iamVjdHMvTGluZS5qcyc7XHJcbmltcG9ydCB7IE1lc2ggfSBmcm9tICcuLi9vYmplY3RzL01lc2guanMnO1xyXG5pbXBvcnQgeyBMaW5lQmFzaWNNYXRlcmlhbCB9IGZyb20gJy4uL21hdGVyaWFscy9MaW5lQmFzaWNNYXRlcmlhbC5qcyc7XHJcbmltcG9ydCB7IE1lc2hCYXNpY01hdGVyaWFsIH0gZnJvbSAnLi4vbWF0ZXJpYWxzL01lc2hCYXNpY01hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyQXR0cmlidXRlLmpzJztcclxuaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIGhlbHBlciBvYmplY3QgdG8gdmlzdWFsaXplIGFuIGluc3RhbmNlIG9mIHtAbGluayBQbGFuZX0uXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IHBsYW5lID0gbmV3IFRIUkVFLlBsYW5lKCBuZXcgVEhSRUUuVmVjdG9yMyggMSwgMSwgMC4yICksIDMgKTtcclxuICogY29uc3QgaGVscGVyID0gbmV3IFRIUkVFLlBsYW5lSGVscGVyKCBwbGFuZSwgMSwgMHhmZmZmMDAgKTtcclxuICogc2NlbmUuYWRkKCBoZWxwZXIgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBMaW5lXHJcbiAqL1xyXG5jbGFzcyBQbGFuZUhlbHBlciBleHRlbmRzIExpbmUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHBsYW5lIGhlbHBlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UGxhbmV9IHBsYW5lIC0gVGhlIHBsYW5lIHRvIGJlIHZpc3VhbGl6ZWQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtzaXplPTFdIC0gVGhlIHNpZGUgbGVuZ3RoIG9mIHBsYW5lIGhlbHBlci5cclxuXHQgKiBAcGFyYW0ge251bWJlcnxDb2xvcnxzdHJpbmd9IFtoZXg9MHhmZmZmMDBdIC0gVGhlIGhlbHBlcidzIGNvbG9yLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwbGFuZSwgc2l6ZSA9IDEsIGhleCA9IDB4ZmZmZjAwICkge1xyXG5cclxuXHRcdGNvbnN0IGNvbG9yID0gaGV4O1xyXG5cclxuXHRcdGNvbnN0IHBvc2l0aW9ucyA9IFsgMSwgLSAxLCAwLCAtIDEsIDEsIDAsIC0gMSwgLSAxLCAwLCAxLCAxLCAwLCAtIDEsIDEsIDAsIC0gMSwgLSAxLCAwLCAxLCAtIDEsIDAsIDEsIDEsIDAgXTtcclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xyXG5cdFx0Z2VvbWV0cnkuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25zLCAzICkgKTtcclxuXHRcdGdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xyXG5cclxuXHRcdHN1cGVyKCBnZW9tZXRyeSwgbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciwgdG9uZU1hcHBlZDogZmFsc2UgfSApICk7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ1BsYW5lSGVscGVyJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBwbGFuZSBiZWluZyB2aXN1YWxpemVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtQbGFuZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wbGFuZSA9IHBsYW5lO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHNpZGUgbGVuZ3RoIG9mIHBsYW5lIGhlbHBlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNpemUgPSBzaXplO1xyXG5cclxuXHRcdGNvbnN0IHBvc2l0aW9uczIgPSBbIDEsIDEsIDAsIC0gMSwgMSwgMCwgLSAxLCAtIDEsIDAsIDEsIDEsIDAsIC0gMSwgLSAxLCAwLCAxLCAtIDEsIDAgXTtcclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeTIgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcclxuXHRcdGdlb21ldHJ5Mi5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbnMyLCAzICkgKTtcclxuXHRcdGdlb21ldHJ5Mi5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcclxuXHJcblx0XHR0aGlzLmFkZCggbmV3IE1lc2goIGdlb21ldHJ5MiwgbmV3IE1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciwgb3BhY2l0eTogMC4yLCB0cmFuc3BhcmVudDogdHJ1ZSwgZGVwdGhXcml0ZTogZmFsc2UsIHRvbmVNYXBwZWQ6IGZhbHNlIH0gKSApICk7XHJcblxyXG5cdH1cclxuXHJcblx0dXBkYXRlTWF0cml4V29ybGQoIGZvcmNlICkge1xyXG5cclxuXHRcdHRoaXMucG9zaXRpb24uc2V0KCAwLCAwLCAwICk7XHJcblxyXG5cdFx0dGhpcy5zY2FsZS5zZXQoIDAuNSAqIHRoaXMuc2l6ZSwgMC41ICogdGhpcy5zaXplLCAxICk7XHJcblxyXG5cdFx0dGhpcy5sb29rQXQoIHRoaXMucGxhbmUubm9ybWFsICk7XHJcblxyXG5cdFx0dGhpcy50cmFuc2xhdGVaKCAtIHRoaXMucGxhbmUuY29uc3RhbnQgKTtcclxuXHJcblx0XHRzdXBlci51cGRhdGVNYXRyaXhXb3JsZCggZm9yY2UgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoZSBoZWxwZXIgdG8gbWF0Y2ggdGhlIHBvc2l0aW9uIGFuZCBkaXJlY3Rpb24gb2YgdGhlXHJcblx0ICogbGlnaHQgYmVpbmcgdmlzdWFsaXplZC5cclxuXHQgKi9cclxuXHRkaXNwb3NlKCkge1xyXG5cclxuXHRcdHRoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpO1xyXG5cdFx0dGhpcy5tYXRlcmlhbC5kaXNwb3NlKCk7XHJcblx0XHR0aGlzLmNoaWxkcmVuWyAwIF0uZ2VvbWV0cnkuZGlzcG9zZSgpO1xyXG5cdFx0dGhpcy5jaGlsZHJlblsgMCBdLm1hdGVyaWFsLmRpc3Bvc2UoKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgUGxhbmVIZWxwZXIgfTtcclxuIiwiaW1wb3J0IHsgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyQXR0cmlidXRlLmpzJztcclxuaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcclxuaW1wb3J0IHsgT2JqZWN0M0QgfSBmcm9tICcuLi9jb3JlL09iamVjdDNELmpzJztcclxuaW1wb3J0IHsgQ3lsaW5kZXJHZW9tZXRyeSB9IGZyb20gJy4uL2dlb21ldHJpZXMvQ3lsaW5kZXJHZW9tZXRyeS5qcyc7XHJcbmltcG9ydCB7IE1lc2hCYXNpY01hdGVyaWFsIH0gZnJvbSAnLi4vbWF0ZXJpYWxzL01lc2hCYXNpY01hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgTGluZUJhc2ljTWF0ZXJpYWwgfSBmcm9tICcuLi9tYXRlcmlhbHMvTGluZUJhc2ljTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyBNZXNoIH0gZnJvbSAnLi4vb2JqZWN0cy9NZXNoLmpzJztcclxuaW1wb3J0IHsgTGluZSB9IGZyb20gJy4uL29iamVjdHMvTGluZS5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5cclxuY29uc3QgX2F4aXMgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmxldCBfbGluZUdlb21ldHJ5LCBfY29uZUdlb21ldHJ5O1xyXG5cclxuLyoqXHJcbiAqIEFuIDNEIGFycm93IG9iamVjdCBmb3IgdmlzdWFsaXppbmcgZGlyZWN0aW9ucy5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgZGlyID0gbmV3IFRIUkVFLlZlY3RvcjMoIDEsIDIsIDAgKTtcclxuICpcclxuICogLy9ub3JtYWxpemUgdGhlIGRpcmVjdGlvbiB2ZWN0b3IgKGNvbnZlcnQgdG8gdmVjdG9yIG9mIGxlbmd0aCAxKVxyXG4gKiBkaXIubm9ybWFsaXplKCk7XHJcbiAqXHJcbiAqIGNvbnN0IG9yaWdpbiA9IG5ldyBUSFJFRS5WZWN0b3IzKCAwLCAwLCAwICk7XHJcbiAqIGNvbnN0IGxlbmd0aCA9IDE7XHJcbiAqIGNvbnN0IGhleCA9IDB4ZmZmZjAwO1xyXG4gKlxyXG4gKiBjb25zdCBhcnJvd0hlbHBlciA9IG5ldyBUSFJFRS5BcnJvd0hlbHBlciggZGlyLCBvcmlnaW4sIGxlbmd0aCwgaGV4ICk7XHJcbiAqIHNjZW5lLmFkZCggYXJyb3dIZWxwZXIgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBPYmplY3QzRFxyXG4gKi9cclxuY2xhc3MgQXJyb3dIZWxwZXIgZXh0ZW5kcyBPYmplY3QzRCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYXJyb3cgaGVscGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBbZGlyPSgwLCAwLCAxKV0gLSBUaGUgKG5vcm1hbGl6ZWQpIGRpcmVjdGlvbiB2ZWN0b3IuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBbb3JpZ2luPSgwLCAwLCAwKV0gLSBQb2ludCBhdCB3aGljaCB0aGUgYXJyb3cgc3RhcnRzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPTFdIC0gTGVuZ3RoIG9mIHRoZSBhcnJvdyBpbiB3b3JsZCB1bml0cy5cclxuXHQgKiBAcGFyYW0geyhudW1iZXJ8Q29sb3J8c3RyaW5nKX0gW2NvbG9yPTB4ZmZmZjAwXSAtIENvbG9yIG9mIHRoZSBhcnJvdy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2hlYWRMZW5ndGg9bGVuZ3RoKjAuMl0gLSBUaGUgbGVuZ3RoIG9mIHRoZSBoZWFkIG9mIHRoZSBhcnJvdy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2hlYWRXaWR0aD1oZWFkTGVuZ3RoKjAuMl0gLSBUaGUgd2lkdGggb2YgdGhlIGhlYWQgb2YgdGhlIGFycm93LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBkaXIgPSBuZXcgVmVjdG9yMyggMCwgMCwgMSApLCBvcmlnaW4gPSBuZXcgVmVjdG9yMyggMCwgMCwgMCApLCBsZW5ndGggPSAxLCBjb2xvciA9IDB4ZmZmZjAwLCBoZWFkTGVuZ3RoID0gbGVuZ3RoICogMC4yLCBoZWFkV2lkdGggPSBoZWFkTGVuZ3RoICogMC4yICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ0Fycm93SGVscGVyJztcclxuXHJcblx0XHRpZiAoIF9saW5lR2VvbWV0cnkgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdF9saW5lR2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcclxuXHRcdFx0X2xpbmVHZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBbIDAsIDAsIDAsIDAsIDEsIDAgXSwgMyApICk7XHJcblxyXG5cdFx0XHRfY29uZUdlb21ldHJ5ID0gbmV3IEN5bGluZGVyR2VvbWV0cnkoIDAsIDAuNSwgMSwgNSwgMSApO1xyXG5cdFx0XHRfY29uZUdlb21ldHJ5LnRyYW5zbGF0ZSggMCwgLSAwLjUsIDAgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5wb3NpdGlvbi5jb3B5KCBvcmlnaW4gKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBsaW5lIHBhcnQgb2YgdGhlIGFycm93IGhlbHBlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7TGluZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5saW5lID0gbmV3IExpbmUoIF9saW5lR2VvbWV0cnksIG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IsIHRvbmVNYXBwZWQ6IGZhbHNlIH0gKSApO1xyXG5cdFx0dGhpcy5saW5lLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcclxuXHRcdHRoaXMuYWRkKCB0aGlzLmxpbmUgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjb25lIHBhcnQgb2YgdGhlIGFycm93IGhlbHBlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7TWVzaH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb25lID0gbmV3IE1lc2goIF9jb25lR2VvbWV0cnksIG5ldyBNZXNoQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IsIHRvbmVNYXBwZWQ6IGZhbHNlIH0gKSApO1xyXG5cdFx0dGhpcy5jb25lLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcclxuXHRcdHRoaXMuYWRkKCB0aGlzLmNvbmUgKTtcclxuXHJcblx0XHR0aGlzLnNldERpcmVjdGlvbiggZGlyICk7XHJcblx0XHR0aGlzLnNldExlbmd0aCggbGVuZ3RoLCBoZWFkTGVuZ3RoLCBoZWFkV2lkdGggKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBkaXJlY3Rpb24gb2YgdGhlIGhlbHBlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gZGlyIC0gVGhlIG5vcm1hbGl6ZWQgZGlyZWN0aW9uIHZlY3Rvci5cclxuXHQgKi9cclxuXHRzZXREaXJlY3Rpb24oIGRpciApIHtcclxuXHJcblx0XHQvLyBkaXIgaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkXHJcblxyXG5cdFx0aWYgKCBkaXIueSA+IDAuOTk5OTkgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnF1YXRlcm5pb24uc2V0KCAwLCAwLCAwLCAxICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggZGlyLnkgPCAtIDAuOTk5OTkgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnF1YXRlcm5pb24uc2V0KCAxLCAwLCAwLCAwICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdF9heGlzLnNldCggZGlyLnosIDAsIC0gZGlyLnggKS5ub3JtYWxpemUoKTtcclxuXHJcblx0XHRcdGNvbnN0IHJhZGlhbnMgPSBNYXRoLmFjb3MoIGRpci55ICk7XHJcblxyXG5cdFx0XHR0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUF4aXNBbmdsZSggX2F4aXMsIHJhZGlhbnMgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgbGVuZ3RoIG9mIHRoZSBoZWxwZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIC0gTGVuZ3RoIG9mIHRoZSBhcnJvdyBpbiB3b3JsZCB1bml0cy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2hlYWRMZW5ndGg9bGVuZ3RoKjAuMl0gLSBUaGUgbGVuZ3RoIG9mIHRoZSBoZWFkIG9mIHRoZSBhcnJvdy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2hlYWRXaWR0aD1oZWFkTGVuZ3RoKjAuMl0gLSBUaGUgd2lkdGggb2YgdGhlIGhlYWQgb2YgdGhlIGFycm93LlxyXG5cdCAqL1xyXG5cdHNldExlbmd0aCggbGVuZ3RoLCBoZWFkTGVuZ3RoID0gbGVuZ3RoICogMC4yLCBoZWFkV2lkdGggPSBoZWFkTGVuZ3RoICogMC4yICkge1xyXG5cclxuXHRcdHRoaXMubGluZS5zY2FsZS5zZXQoIDEsIE1hdGgubWF4KCAwLjAwMDEsIGxlbmd0aCAtIGhlYWRMZW5ndGggKSwgMSApOyAvLyBzZWUgIzE3NDU4XHJcblx0XHR0aGlzLmxpbmUudXBkYXRlTWF0cml4KCk7XHJcblxyXG5cdFx0dGhpcy5jb25lLnNjYWxlLnNldCggaGVhZFdpZHRoLCBoZWFkTGVuZ3RoLCBoZWFkV2lkdGggKTtcclxuXHRcdHRoaXMuY29uZS5wb3NpdGlvbi55ID0gbGVuZ3RoO1xyXG5cdFx0dGhpcy5jb25lLnVwZGF0ZU1hdHJpeCgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGNvbG9yIG9mIHRoZSBoZWxwZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcnxDb2xvcnxzdHJpbmd9IGNvbG9yIC0gVGhlIGNvbG9yIHRvIHNldC5cclxuXHQgKi9cclxuXHRzZXRDb2xvciggY29sb3IgKSB7XHJcblxyXG5cdFx0dGhpcy5saW5lLm1hdGVyaWFsLmNvbG9yLnNldCggY29sb3IgKTtcclxuXHRcdHRoaXMuY29uZS5tYXRlcmlhbC5jb2xvci5zZXQoIGNvbG9yICk7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSwgZmFsc2UgKTtcclxuXHJcblx0XHR0aGlzLmxpbmUuY29weSggc291cmNlLmxpbmUgKTtcclxuXHRcdHRoaXMuY29uZS5jb3B5KCBzb3VyY2UuY29uZSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZyZWVzIHRoZSBHUFUtcmVsYXRlZCByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHRoaXMgaW5zdGFuY2UuIENhbGwgdGhpc1xyXG5cdCAqIG1ldGhvZCB3aGVuZXZlciB0aGlzIGluc3RhbmNlIGlzIG5vIGxvbmdlciB1c2VkIGluIHlvdXIgYXBwLlxyXG5cdCAqL1xyXG5cdGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0dGhpcy5saW5lLmdlb21ldHJ5LmRpc3Bvc2UoKTtcclxuXHRcdHRoaXMubGluZS5tYXRlcmlhbC5kaXNwb3NlKCk7XHJcblx0XHR0aGlzLmNvbmUuZ2VvbWV0cnkuZGlzcG9zZSgpO1xyXG5cdFx0dGhpcy5jb25lLm1hdGVyaWFsLmRpc3Bvc2UoKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgQXJyb3dIZWxwZXIgfTtcclxuIiwiaW1wb3J0IHsgTGluZVNlZ21lbnRzIH0gZnJvbSAnLi4vb2JqZWN0cy9MaW5lU2VnbWVudHMuanMnO1xyXG5pbXBvcnQgeyBMaW5lQmFzaWNNYXRlcmlhbCB9IGZyb20gJy4uL21hdGVyaWFscy9MaW5lQmFzaWNNYXRlcmlhbC5qcyc7XHJcbmltcG9ydCB7IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcbmltcG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9CdWZmZXJHZW9tZXRyeS5qcyc7XHJcbmltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vbWF0aC9Db2xvci5qcyc7XHJcblxyXG4vKipcclxuICogQW4gYXhpcyBvYmplY3QgdG8gdmlzdWFsaXplIHRoZSAzIGF4ZXMgaW4gYSBzaW1wbGUgd2F5LlxyXG4gKiBUaGUgWCBheGlzIGlzIHJlZC4gVGhlIFkgYXhpcyBpcyBncmVlbi4gVGhlIFogYXhpcyBpcyBibHVlLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBheGVzSGVscGVyID0gbmV3IFRIUkVFLkF4ZXNIZWxwZXIoIDUgKTtcclxuICogc2NlbmUuYWRkKCBheGVzSGVscGVyICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTGluZVNlZ21lbnRzXHJcbiAqL1xyXG5jbGFzcyBBeGVzSGVscGVyIGV4dGVuZHMgTGluZVNlZ21lbnRzIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBheGVzIGhlbHBlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbc2l6ZT0xXSAtIFNpemUgb2YgdGhlIGxpbmVzIHJlcHJlc2VudGluZyB0aGUgYXhlcy5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggc2l6ZSA9IDEgKSB7XHJcblxyXG5cdFx0Y29uc3QgdmVydGljZXMgPSBbXHJcblx0XHRcdDAsIDAsIDAsXHRzaXplLCAwLCAwLFxyXG5cdFx0XHQwLCAwLCAwLFx0MCwgc2l6ZSwgMCxcclxuXHRcdFx0MCwgMCwgMCxcdDAsIDAsIHNpemVcclxuXHRcdF07XHJcblxyXG5cdFx0Y29uc3QgY29sb3JzID0gW1xyXG5cdFx0XHQxLCAwLCAwLFx0MSwgMC42LCAwLFxyXG5cdFx0XHQwLCAxLCAwLFx0MC42LCAxLCAwLFxyXG5cdFx0XHQwLCAwLCAxLFx0MCwgMC42LCAxXHJcblx0XHRdO1xyXG5cclxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XHJcblx0XHRnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XHJcblx0XHRnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdjb2xvcicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBjb2xvcnMsIDMgKSApO1xyXG5cclxuXHRcdGNvbnN0IG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IHZlcnRleENvbG9yczogdHJ1ZSwgdG9uZU1hcHBlZDogZmFsc2UgfSApO1xyXG5cclxuXHRcdHN1cGVyKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnQXhlc0hlbHBlcic7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVmaW5lcyB0aGUgY29sb3JzIG9mIHRoZSBheGVzIGhlbHBlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfENvbG9yfHN0cmluZ30geEF4aXNDb2xvciAtIFRoZSBjb2xvciBmb3IgdGhlIHggYXhpcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcnxDb2xvcnxzdHJpbmd9IHlBeGlzQ29sb3IgLSBUaGUgY29sb3IgZm9yIHRoZSB5IGF4aXMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ8Q29sb3J8c3RyaW5nfSB6QXhpc0NvbG9yIC0gVGhlIGNvbG9yIGZvciB0aGUgeiBheGlzLlxyXG5cdCAqIEByZXR1cm4ge0F4ZXNIZWxwZXJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgYXhlcyBoZWxwZXIuXHJcblx0ICovXHJcblx0c2V0Q29sb3JzKCB4QXhpc0NvbG9yLCB5QXhpc0NvbG9yLCB6QXhpc0NvbG9yICkge1xyXG5cclxuXHRcdGNvbnN0IGNvbG9yID0gbmV3IENvbG9yKCk7XHJcblx0XHRjb25zdCBhcnJheSA9IHRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5jb2xvci5hcnJheTtcclxuXHJcblx0XHRjb2xvci5zZXQoIHhBeGlzQ29sb3IgKTtcclxuXHRcdGNvbG9yLnRvQXJyYXkoIGFycmF5LCAwICk7XHJcblx0XHRjb2xvci50b0FycmF5KCBhcnJheSwgMyApO1xyXG5cclxuXHRcdGNvbG9yLnNldCggeUF4aXNDb2xvciApO1xyXG5cdFx0Y29sb3IudG9BcnJheSggYXJyYXksIDYgKTtcclxuXHRcdGNvbG9yLnRvQXJyYXkoIGFycmF5LCA5ICk7XHJcblxyXG5cdFx0Y29sb3Iuc2V0KCB6QXhpc0NvbG9yICk7XHJcblx0XHRjb2xvci50b0FycmF5KCBhcnJheSwgMTIgKTtcclxuXHRcdGNvbG9yLnRvQXJyYXkoIGFycmF5LCAxNSApO1xyXG5cclxuXHRcdHRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5jb2xvci5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRnJlZXMgdGhlIEdQVS1yZWxhdGVkIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhpcyBpbnN0YW5jZS4gQ2FsbCB0aGlzXHJcblx0ICogbWV0aG9kIHdoZW5ldmVyIHRoaXMgaW5zdGFuY2UgaXMgbm8gbG9uZ2VyIHVzZWQgaW4geW91ciBhcHAuXHJcblx0ICovXHJcblx0ZGlzcG9zZSgpIHtcclxuXHJcblx0XHR0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKTtcclxuXHRcdHRoaXMubWF0ZXJpYWwuZGlzcG9zZSgpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgQXhlc0hlbHBlciB9O1xyXG4iLCJpbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uLy4uL21hdGgvQ29sb3IuanMnO1xyXG5pbXBvcnQgeyBQYXRoIH0gZnJvbSAnLi9QYXRoLmpzJztcclxuaW1wb3J0IHsgU2hhcGUgfSBmcm9tICcuL1NoYXBlLmpzJztcclxuaW1wb3J0IHsgU2hhcGVVdGlscyB9IGZyb20gJy4uL1NoYXBlVXRpbHMuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBjb252ZXJ0IGEgc2VyaWVzIG9mIHBhdGhzIHRvIGFuIGFycmF5IG9mXHJcbiAqIHNoYXBlcy4gSXQgaXMgc3BlY2lmaWNhbGx5IHVzZWQgaW4gY29udGV4dCBvZiBmb250cyBhbmQgU1ZHLlxyXG4gKi9cclxuY2xhc3MgU2hhcGVQYXRoIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBzaGFwZSBwYXRoLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdTaGFwZVBhdGgnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNvbG9yIG9mIHRoZSBzaGFwZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Q29sb3J9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBwYXRocyB0aGF0IGhhdmUgYmVlbiBnZW5lcmF0ZWQgZm9yIHRoaXMgc2hhcGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PFBhdGg+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnN1YlBhdGhzID0gW107XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY3VycmVudCBwYXRoIHRoYXQgaXMgYmVpbmcgZ2VuZXJhdGVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/UGF0aH1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jdXJyZW50UGF0aCA9IG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyBhIG5ldyBwYXRoIGFuZCBtb3ZlcyBpdCBjdXJyZW50IHBvaW50IHRvIHRoZSBnaXZlbiBvbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB4IGNvb3JkaW5hdGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgeSBjb29yZGluYXRlLlxyXG5cdCAqIEByZXR1cm4ge1NoYXBlUGF0aH0gQSByZWZlcmVuY2UgdG8gdGhpcyBzaGFwZSBwYXRoLlxyXG5cdCAqL1xyXG5cdG1vdmVUbyggeCwgeSApIHtcclxuXHJcblx0XHR0aGlzLmN1cnJlbnRQYXRoID0gbmV3IFBhdGgoKTtcclxuXHRcdHRoaXMuc3ViUGF0aHMucHVzaCggdGhpcy5jdXJyZW50UGF0aCApO1xyXG5cdFx0dGhpcy5jdXJyZW50UGF0aC5tb3ZlVG8oIHgsIHkgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIGFuIGluc3RhbmNlIG9mIHtAbGluayBMaW5lQ3VydmV9IHRvIHRoZSBwYXRoIGJ5IGNvbm5lY3RpbmdcclxuXHQgKiB0aGUgY3VycmVudCBwb2ludCB3aXRoIHRoZSBnaXZlbiBvbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludC5cclxuXHQgKiBAcmV0dXJuIHtTaGFwZVBhdGh9IEEgcmVmZXJlbmNlIHRvIHRoaXMgc2hhcGUgcGF0aC5cclxuXHQgKi9cclxuXHRsaW5lVG8oIHgsIHkgKSB7XHJcblxyXG5cdFx0dGhpcy5jdXJyZW50UGF0aC5saW5lVG8oIHgsIHkgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIGFuIGluc3RhbmNlIG9mIHtAbGluayBRdWFkcmF0aWNCZXppZXJDdXJ2ZX0gdG8gdGhlIHBhdGggYnkgY29ubmVjdGluZ1xyXG5cdCAqIHRoZSBjdXJyZW50IHBvaW50IHdpdGggdGhlIGdpdmVuIG9uZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhQ1B4IC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgY29udHJvbCBwb2ludC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYUNQeSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGNvbnRyb2wgcG9pbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFYIC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhWSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludC5cclxuXHQgKiBAcmV0dXJuIHtTaGFwZVBhdGh9IEEgcmVmZXJlbmNlIHRvIHRoaXMgc2hhcGUgcGF0aC5cclxuXHQgKi9cclxuXHRxdWFkcmF0aWNDdXJ2ZVRvKCBhQ1B4LCBhQ1B5LCBhWCwgYVkgKSB7XHJcblxyXG5cdFx0dGhpcy5jdXJyZW50UGF0aC5xdWFkcmF0aWNDdXJ2ZVRvKCBhQ1B4LCBhQ1B5LCBhWCwgYVkgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIGFuIGluc3RhbmNlIG9mIHtAbGluayBDdWJpY0JlemllckN1cnZlfSB0byB0aGUgcGF0aCBieSBjb25uZWN0aW5nXHJcblx0ICogdGhlIGN1cnJlbnQgcG9pbnQgd2l0aCB0aGUgZ2l2ZW4gb25lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFDUDF4IC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYUNQMXkgLSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhQ1AyeCAtIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb250cm9sIHBvaW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhQ1AyeSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb250cm9sIHBvaW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhWCAtIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYVkgLSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuXHJcblx0ICogQHJldHVybiB7U2hhcGVQYXRofSBBIHJlZmVyZW5jZSB0byB0aGlzIHNoYXBlIHBhdGguXHJcblx0ICovXHJcblx0YmV6aWVyQ3VydmVUbyggYUNQMXgsIGFDUDF5LCBhQ1AyeCwgYUNQMnksIGFYLCBhWSApIHtcclxuXHJcblx0XHR0aGlzLmN1cnJlbnRQYXRoLmJlemllckN1cnZlVG8oIGFDUDF4LCBhQ1AxeSwgYUNQMngsIGFDUDJ5LCBhWCwgYVkgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIGFuIGluc3RhbmNlIG9mIHtAbGluayBTcGxpbmVDdXJ2ZX0gdG8gdGhlIHBhdGggYnkgY29ubmVjdGluZ1xyXG5cdCAqIHRoZSBjdXJyZW50IHBvaW50IHdpdGggdGhlIGdpdmVuIGxpc3Qgb2YgcG9pbnRzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxWZWN0b3IyPn0gcHRzIC0gQW4gYXJyYXkgb2YgcG9pbnRzIGluIDJEIHNwYWNlLlxyXG5cdCAqIEByZXR1cm4ge1NoYXBlUGF0aH0gQSByZWZlcmVuY2UgdG8gdGhpcyBzaGFwZSBwYXRoLlxyXG5cdCAqL1xyXG5cdHNwbGluZVRocnUoIHB0cyApIHtcclxuXHJcblx0XHR0aGlzLmN1cnJlbnRQYXRoLnNwbGluZVRocnUoIHB0cyApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnZlcnRzIHRoZSBwYXRocyBpbnRvIGFuIGFycmF5IG9mIHNoYXBlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNDQ1cgLSBCeSBkZWZhdWx0IHNvbGlkIHNoYXBlcyBhcmUgIGRlZmluZWQgY2xvY2t3aXNlIChDVykgYW5kIGhvbGVzIGFyZSBkZWZpbmVkIGNvdW50ZXJjbG9ja3dpc2UgKENDVykuXHJcblx0ICogSWYgdGhpcyBmbGFnIGlzIHNldCB0byBgdHJ1ZWAsIHRoZW4gdGhvc2UgYXJlIGZsaXBwZWQuXHJcblx0ICogQHJldHVybiB7QXJyYXk8U2hhcGU+fSBBbiBhcnJheSBvZiBzaGFwZXMuXHJcblx0ICovXHJcblx0dG9TaGFwZXMoIGlzQ0NXICkge1xyXG5cclxuXHRcdGZ1bmN0aW9uIHRvU2hhcGVzTm9Ib2xlcyggaW5TdWJwYXRocyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHNoYXBlcyA9IFtdO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gaW5TdWJwYXRocy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB0bXBQYXRoID0gaW5TdWJwYXRoc1sgaSBdO1xyXG5cclxuXHRcdFx0XHRjb25zdCB0bXBTaGFwZSA9IG5ldyBTaGFwZSgpO1xyXG5cdFx0XHRcdHRtcFNoYXBlLmN1cnZlcyA9IHRtcFBhdGguY3VydmVzO1xyXG5cclxuXHRcdFx0XHRzaGFwZXMucHVzaCggdG1wU2hhcGUgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBzaGFwZXM7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIGlzUG9pbnRJbnNpZGVQb2x5Z29uKCBpblB0LCBpblBvbHlnb24gKSB7XHJcblxyXG5cdFx0XHRjb25zdCBwb2x5TGVuID0gaW5Qb2x5Z29uLmxlbmd0aDtcclxuXHJcblx0XHRcdC8vIGluUHQgb24gcG9seWdvbiBjb250b3VyID0+IGltbWVkaWF0ZSBzdWNjZXNzICAgIG9yXHJcblx0XHRcdC8vIHRvZ2dsaW5nIG9mIGluc2lkZS9vdXRzaWRlIGF0IGV2ZXJ5IHNpbmdsZSEgaW50ZXJzZWN0aW9uIHBvaW50IG9mIGFuIGVkZ2VcclxuXHRcdFx0Ly8gIHdpdGggdGhlIGhvcml6b250YWwgbGluZSB0aHJvdWdoIGluUHQsIGxlZnQgb2YgaW5QdFxyXG5cdFx0XHQvLyAgbm90IGNvdW50aW5nIGxvd2VyWSBlbmRwb2ludHMgb2YgZWRnZXMgYW5kIHdob2xlIGVkZ2VzIG9uIHRoYXQgbGluZVxyXG5cdFx0XHRsZXQgaW5zaWRlID0gZmFsc2U7XHJcblx0XHRcdGZvciAoIGxldCBwID0gcG9seUxlbiAtIDEsIHEgPSAwOyBxIDwgcG9seUxlbjsgcCA9IHEgKysgKSB7XHJcblxyXG5cdFx0XHRcdGxldCBlZGdlTG93UHQgPSBpblBvbHlnb25bIHAgXTtcclxuXHRcdFx0XHRsZXQgZWRnZUhpZ2hQdCA9IGluUG9seWdvblsgcSBdO1xyXG5cclxuXHRcdFx0XHRsZXQgZWRnZUR4ID0gZWRnZUhpZ2hQdC54IC0gZWRnZUxvd1B0Lng7XHJcblx0XHRcdFx0bGV0IGVkZ2VEeSA9IGVkZ2VIaWdoUHQueSAtIGVkZ2VMb3dQdC55O1xyXG5cclxuXHRcdFx0XHRpZiAoIE1hdGguYWJzKCBlZGdlRHkgKSA+IE51bWJlci5FUFNJTE9OICkge1xyXG5cclxuXHRcdFx0XHRcdC8vIG5vdCBwYXJhbGxlbFxyXG5cdFx0XHRcdFx0aWYgKCBlZGdlRHkgPCAwICkge1xyXG5cclxuXHRcdFx0XHRcdFx0ZWRnZUxvd1B0ID0gaW5Qb2x5Z29uWyBxIF07IGVkZ2VEeCA9IC0gZWRnZUR4O1xyXG5cdFx0XHRcdFx0XHRlZGdlSGlnaFB0ID0gaW5Qb2x5Z29uWyBwIF07IGVkZ2VEeSA9IC0gZWRnZUR5O1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRpZiAoICggaW5QdC55IDwgZWRnZUxvd1B0LnkgKSB8fCAoIGluUHQueSA+IGVkZ2VIaWdoUHQueSApICkgXHRcdGNvbnRpbnVlO1xyXG5cclxuXHRcdFx0XHRcdGlmICggaW5QdC55ID09PSBlZGdlTG93UHQueSApIHtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggaW5QdC54ID09PSBlZGdlTG93UHQueCApXHRcdHJldHVyblx0dHJ1ZTtcdFx0Ly8gaW5QdCBpcyBvbiBjb250b3VyID9cclxuXHRcdFx0XHRcdFx0Ly8gY29udGludWU7XHRcdFx0XHQvLyBubyBpbnRlcnNlY3Rpb24gb3IgZWRnZUxvd1B0ID0+IGRvZXNuJ3QgY291bnQgISEhXHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnN0IHBlcnBFZGdlID0gZWRnZUR5ICogKCBpblB0LnggLSBlZGdlTG93UHQueCApIC0gZWRnZUR4ICogKCBpblB0LnkgLSBlZGdlTG93UHQueSApO1xyXG5cdFx0XHRcdFx0XHRpZiAoIHBlcnBFZGdlID09PSAwIClcdFx0XHRcdHJldHVyblx0dHJ1ZTtcdFx0Ly8gaW5QdCBpcyBvbiBjb250b3VyID9cclxuXHRcdFx0XHRcdFx0aWYgKCBwZXJwRWRnZSA8IDAgKSBcdFx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0XHRcdFx0XHRpbnNpZGUgPSAhIGluc2lkZTtcdFx0Ly8gdHJ1ZSBpbnRlcnNlY3Rpb24gbGVmdCBvZiBpblB0XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdC8vIHBhcmFsbGVsIG9yIGNvbGxpbmVhclxyXG5cdFx0XHRcdFx0aWYgKCBpblB0LnkgIT09IGVkZ2VMb3dQdC55ICkgXHRcdGNvbnRpbnVlO1x0XHRcdC8vIHBhcmFsbGVsXHJcblx0XHRcdFx0XHQvLyBlZGdlIGxpZXMgb24gdGhlIHNhbWUgaG9yaXpvbnRhbCBsaW5lIGFzIGluUHRcclxuXHRcdFx0XHRcdGlmICggKCAoIGVkZ2VIaWdoUHQueCA8PSBpblB0LnggKSAmJiAoIGluUHQueCA8PSBlZGdlTG93UHQueCApICkgfHxcclxuXHRcdFx0XHRcdFx0ICggKCBlZGdlTG93UHQueCA8PSBpblB0LnggKSAmJiAoIGluUHQueCA8PSBlZGdlSGlnaFB0LnggKSApIClcdFx0cmV0dXJuXHR0cnVlO1x0Ly8gaW5QdDogUG9pbnQgb24gY29udG91ciAhXHJcblx0XHRcdFx0XHQvLyBjb250aW51ZTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuXHRpbnNpZGU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGlzQ2xvY2tXaXNlID0gU2hhcGVVdGlscy5pc0Nsb2NrV2lzZTtcclxuXHJcblx0XHRjb25zdCBzdWJQYXRocyA9IHRoaXMuc3ViUGF0aHM7XHJcblx0XHRpZiAoIHN1YlBhdGhzLmxlbmd0aCA9PT0gMCApIHJldHVybiBbXTtcclxuXHJcblx0XHRsZXQgc29saWQsIHRtcFBhdGgsIHRtcFNoYXBlO1xyXG5cdFx0Y29uc3Qgc2hhcGVzID0gW107XHJcblxyXG5cdFx0aWYgKCBzdWJQYXRocy5sZW5ndGggPT09IDEgKSB7XHJcblxyXG5cdFx0XHR0bXBQYXRoID0gc3ViUGF0aHNbIDAgXTtcclxuXHRcdFx0dG1wU2hhcGUgPSBuZXcgU2hhcGUoKTtcclxuXHRcdFx0dG1wU2hhcGUuY3VydmVzID0gdG1wUGF0aC5jdXJ2ZXM7XHJcblx0XHRcdHNoYXBlcy5wdXNoKCB0bXBTaGFwZSApO1xyXG5cdFx0XHRyZXR1cm4gc2hhcGVzO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRsZXQgaG9sZXNGaXJzdCA9ICEgaXNDbG9ja1dpc2UoIHN1YlBhdGhzWyAwIF0uZ2V0UG9pbnRzKCkgKTtcclxuXHRcdGhvbGVzRmlyc3QgPSBpc0NDVyA/ICEgaG9sZXNGaXJzdCA6IGhvbGVzRmlyc3Q7XHJcblxyXG5cdFx0Ly8gY29uc29sZS5sb2coXCJIb2xlcyBmaXJzdFwiLCBob2xlc0ZpcnN0KTtcclxuXHJcblx0XHRjb25zdCBiZXR0ZXJTaGFwZUhvbGVzID0gW107XHJcblx0XHRjb25zdCBuZXdTaGFwZXMgPSBbXTtcclxuXHRcdGxldCBuZXdTaGFwZUhvbGVzID0gW107XHJcblx0XHRsZXQgbWFpbklkeCA9IDA7XHJcblx0XHRsZXQgdG1wUG9pbnRzO1xyXG5cclxuXHRcdG5ld1NoYXBlc1sgbWFpbklkeCBdID0gdW5kZWZpbmVkO1xyXG5cdFx0bmV3U2hhcGVIb2xlc1sgbWFpbklkeCBdID0gW107XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gc3ViUGF0aHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdHRtcFBhdGggPSBzdWJQYXRoc1sgaSBdO1xyXG5cdFx0XHR0bXBQb2ludHMgPSB0bXBQYXRoLmdldFBvaW50cygpO1xyXG5cdFx0XHRzb2xpZCA9IGlzQ2xvY2tXaXNlKCB0bXBQb2ludHMgKTtcclxuXHRcdFx0c29saWQgPSBpc0NDVyA/ICEgc29saWQgOiBzb2xpZDtcclxuXHJcblx0XHRcdGlmICggc29saWQgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggKCAhIGhvbGVzRmlyc3QgKSAmJiAoIG5ld1NoYXBlc1sgbWFpbklkeCBdICkgKVx0bWFpbklkeCArKztcclxuXHJcblx0XHRcdFx0bmV3U2hhcGVzWyBtYWluSWR4IF0gPSB7IHM6IG5ldyBTaGFwZSgpLCBwOiB0bXBQb2ludHMgfTtcclxuXHRcdFx0XHRuZXdTaGFwZXNbIG1haW5JZHggXS5zLmN1cnZlcyA9IHRtcFBhdGguY3VydmVzO1xyXG5cclxuXHRcdFx0XHRpZiAoIGhvbGVzRmlyc3QgKVx0bWFpbklkeCArKztcclxuXHRcdFx0XHRuZXdTaGFwZUhvbGVzWyBtYWluSWR4IF0gPSBbXTtcclxuXHJcblx0XHRcdFx0Ly9jb25zb2xlLmxvZygnY3cnLCBpKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdG5ld1NoYXBlSG9sZXNbIG1haW5JZHggXS5wdXNoKCB7IGg6IHRtcFBhdGgsIHA6IHRtcFBvaW50c1sgMCBdIH0gKTtcclxuXHJcblx0XHRcdFx0Ly9jb25zb2xlLmxvZygnY2N3JywgaSk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIG9ubHkgSG9sZXM/IC0+IHByb2JhYmx5IGFsbCBTaGFwZXMgd2l0aCB3cm9uZyBvcmllbnRhdGlvblxyXG5cdFx0aWYgKCAhIG5ld1NoYXBlc1sgMCBdIClcdHJldHVyblx0dG9TaGFwZXNOb0hvbGVzKCBzdWJQYXRocyApO1xyXG5cclxuXHJcblx0XHRpZiAoIG5ld1NoYXBlcy5sZW5ndGggPiAxICkge1xyXG5cclxuXHRcdFx0bGV0IGFtYmlndW91cyA9IGZhbHNlO1xyXG5cdFx0XHRsZXQgdG9DaGFuZ2UgPSAwO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IHNJZHggPSAwLCBzTGVuID0gbmV3U2hhcGVzLmxlbmd0aDsgc0lkeCA8IHNMZW47IHNJZHggKysgKSB7XHJcblxyXG5cdFx0XHRcdGJldHRlclNoYXBlSG9sZXNbIHNJZHggXSA9IFtdO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Zm9yICggbGV0IHNJZHggPSAwLCBzTGVuID0gbmV3U2hhcGVzLmxlbmd0aDsgc0lkeCA8IHNMZW47IHNJZHggKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHNobyA9IG5ld1NoYXBlSG9sZXNbIHNJZHggXTtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGhJZHggPSAwOyBoSWR4IDwgc2hvLmxlbmd0aDsgaElkeCArKyApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBobyA9IHNob1sgaElkeCBdO1xyXG5cdFx0XHRcdFx0bGV0IGhvbGVfdW5hc3NpZ25lZCA9IHRydWU7XHJcblxyXG5cdFx0XHRcdFx0Zm9yICggbGV0IHMySWR4ID0gMDsgczJJZHggPCBuZXdTaGFwZXMubGVuZ3RoOyBzMklkeCArKyApIHtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggaXNQb2ludEluc2lkZVBvbHlnb24oIGhvLnAsIG5ld1NoYXBlc1sgczJJZHggXS5wICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmICggc0lkeCAhPT0gczJJZHggKVx0dG9DaGFuZ2UgKys7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmICggaG9sZV91bmFzc2lnbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGhvbGVfdW5hc3NpZ25lZCA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0XHRcdFx0YmV0dGVyU2hhcGVIb2xlc1sgczJJZHggXS5wdXNoKCBobyApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGFtYmlndW91cyA9IHRydWU7XHJcblxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBob2xlX3VuYXNzaWduZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRiZXR0ZXJTaGFwZUhvbGVzWyBzSWR4IF0ucHVzaCggaG8gKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggdG9DaGFuZ2UgPiAwICYmIGFtYmlndW91cyA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRcdG5ld1NoYXBlSG9sZXMgPSBiZXR0ZXJTaGFwZUhvbGVzO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRsZXQgdG1wSG9sZXM7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IG5ld1NoYXBlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHRcdHRtcFNoYXBlID0gbmV3U2hhcGVzWyBpIF0ucztcclxuXHRcdFx0c2hhcGVzLnB1c2goIHRtcFNoYXBlICk7XHJcblx0XHRcdHRtcEhvbGVzID0gbmV3U2hhcGVIb2xlc1sgaSBdO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGogPSAwLCBqbCA9IHRtcEhvbGVzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xyXG5cclxuXHRcdFx0XHR0bXBTaGFwZS5ob2xlcy5wdXNoKCB0bXBIb2xlc1sgaiBdLmggKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly9jb25zb2xlLmxvZyhcInNoYXBlXCIsIHNoYXBlcyk7XHJcblxyXG5cdFx0cmV0dXJuIHNoYXBlcztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCB7IFNoYXBlUGF0aCB9O1xyXG4iLCJpbXBvcnQgeyBFdmVudERpc3BhdGNoZXIgfSBmcm9tICcuLi9jb3JlL0V2ZW50RGlzcGF0Y2hlci5qcyc7XHJcblxyXG4vKipcclxuICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgY29udHJvbHMuXHJcbiAqXHJcbiAqIEBhYnN0cmFjdFxyXG4gKiBAYXVnbWVudHMgRXZlbnREaXNwYXRjaGVyXHJcbiAqL1xyXG5jbGFzcyBDb250cm9scyBleHRlbmRzIEV2ZW50RGlzcGF0Y2hlciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgY29udHJvbHMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdDNEfSBvYmplY3QgLSBUaGUgb2JqZWN0IHRoYXQgaXMgbWFuYWdlZCBieSB0aGUgY29udHJvbHMuXHJcblx0ICogQHBhcmFtIHs/SFRNTERPTUVsZW1lbnR9IGRvbUVsZW1lbnQgLSBUaGUgSFRNTCBlbGVtZW50IHVzZWQgZm9yIGV2ZW50IGxpc3RlbmVycy5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggb2JqZWN0LCBkb21FbGVtZW50ID0gbnVsbCApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG9iamVjdCB0aGF0IGlzIG1hbmFnZWQgYnkgdGhlIGNvbnRyb2xzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3QzRH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5vYmplY3QgPSBvYmplY3Q7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgSFRNTCBlbGVtZW50IHVzZWQgZm9yIGV2ZW50IGxpc3RlbmVycy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P0hUTUxET01FbGVtZW50fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRvbUVsZW1lbnQgPSBkb21FbGVtZW50O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgY29udHJvbHMgcmVzcG9uZHMgdG8gdXNlciBpbnB1dCBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZW5hYmxlZCA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIGNvbnRyb2xzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAtMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnN0YXRlID0gLSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBvYmplY3QgZGVmaW5lcyB0aGUga2V5Ym9hcmQgaW5wdXQgb2YgdGhlIGNvbnRyb2xzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMua2V5cyA9IHt9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBvYmplY3QgZGVmaW5lcyB3aGF0IHR5cGUgb2YgYWN0aW9ucyBhcmUgYXNzaWduZWQgdG8gdGhlIGF2YWlsYWJsZSBtb3VzZSBidXR0b25zLlxyXG5cdFx0ICogSXQgZGVwZW5kcyBvbiB0aGUgY29udHJvbCBpbXBsZW1lbnRhdGlvbiB3aGF0IGtpbmQgb2YgbW91c2UgYnV0dG9ucyBhbmQgYWN0aW9ucyBhcmUgc3VwcG9ydGVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHt7TEVGVDogP251bWJlciwgTUlERExFOiA/bnVtYmVyLCBSSUdIVDogP251bWJlcn19XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubW91c2VCdXR0b25zID0geyBMRUZUOiBudWxsLCBNSURETEU6IG51bGwsIFJJR0hUOiBudWxsIH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIG9iamVjdCBkZWZpbmVzIHdoYXQgdHlwZSBvZiBhY3Rpb25zIGFyZSBhc3NpZ25lZCB0byB3aGF0IGtpbmQgb2YgdG91Y2ggaW50ZXJhY3Rpb24uXHJcblx0XHQgKiBJdCBkZXBlbmRzIG9uIHRoZSBjb250cm9sIGltcGxlbWVudGF0aW9uIHdoYXQga2luZCBvZiB0b3VjaCBpbnRlcmFjdGlvbiBhbmQgYWN0aW9ucyBhcmUgc3VwcG9ydGVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHt7T05FOiA/bnVtYmVyLCBUV086ID9udW1iZXJ9fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRvdWNoZXMgPSB7IE9ORTogbnVsbCwgVFdPOiBudWxsIH07XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29ubmVjdHMgdGhlIGNvbnRyb2xzIHRvIHRoZSBET00uIFRoaXMgbWV0aG9kIGhhcyBzbyBjYWxsZWQgXCJzaWRlIGVmZmVjdHNcIiBzaW5jZVxyXG5cdCAqIGl0IGFkZHMgdGhlIG1vZHVsZSdzIGV2ZW50IGxpc3RlbmVycyB0byB0aGUgRE9NLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtIVE1MRE9NRWxlbWVudH0gZWxlbWVudCAtIFRoZSBET00gZWxlbWVudCB0byBjb25uZWN0IHRvLlxyXG5cdCAqL1xyXG5cdGNvbm5lY3QoIGVsZW1lbnQgKSB7XHJcblxyXG5cdFx0aWYgKCBlbGVtZW50ID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Db250cm9sczogY29ubmVjdCgpIG5vdyByZXF1aXJlcyBhbiBlbGVtZW50LicgKTsgLy8gQGRlcHJlY2F0ZWQsIHRoZSB3YXJuaW5nIGNhbiBiZSByZW1vdmVkIHdpdGggcjE4NVxyXG5cdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy5kb21FbGVtZW50ICE9PSBudWxsICkgdGhpcy5kaXNjb25uZWN0KCk7XHJcblxyXG5cdFx0dGhpcy5kb21FbGVtZW50ID0gZWxlbWVudDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEaXNjb25uZWN0cyB0aGUgY29udHJvbHMgZnJvbSB0aGUgRE9NLlxyXG5cdCAqL1xyXG5cdGRpc2Nvbm5lY3QoKSB7fVxyXG5cclxuXHQvKipcclxuXHQgKiBDYWxsIHRoaXMgbWV0aG9kIGlmIHlvdSBubyBsb25nZXIgd2FudCB1c2UgdG8gdGhlIGNvbnRyb2xzLiBJdCBmcmVlcyBhbGwgaW50ZXJuYWxcclxuXHQgKiByZXNvdXJjZXMgYW5kIHJlbW92ZXMgYWxsIGV2ZW50IGxpc3RlbmVycy5cclxuXHQgKi9cclxuXHRkaXNwb3NlKCkge31cclxuXHJcblx0LyoqXHJcblx0ICogQ29udHJvbHMgc2hvdWxkIGltcGxlbWVudCB0aGlzIG1ldGhvZCBpZiB0aGV5IGhhdmUgdG8gdXBkYXRlIHRoZWlyIGludGVybmFsIHN0YXRlXHJcblx0ICogcGVyIHNpbXVsYXRpb24gc3RlcC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgZGVsdGEgaW4gc2Vjb25kcy5cclxuXHQgKi9cclxuXHR1cGRhdGUoIC8qIGRlbHRhICovICkge31cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IENvbnRyb2xzIH07XHJcbiIsImltcG9ydCB7IEFscGhhRm9ybWF0LCBMdW1pbmFuY2VGb3JtYXQsIEx1bWluYW5jZUFscGhhRm9ybWF0LCBSZWRGb3JtYXQsIFJlZEludGVnZXJGb3JtYXQsIFJHRm9ybWF0LCBSR0ludGVnZXJGb3JtYXQsIFJHQkZvcm1hdCwgUkdCQUZvcm1hdCwgUkdCQUludGVnZXJGb3JtYXQsIFJHQl9TM1RDX0RYVDFfRm9ybWF0LCBSR0JBX1MzVENfRFhUMV9Gb3JtYXQsIFJHQkFfUzNUQ19EWFQzX0Zvcm1hdCwgUkdCQV9TM1RDX0RYVDVfRm9ybWF0LCBSR0JfUFZSVENfMkJQUFYxX0Zvcm1hdCwgUkdCQV9QVlJUQ18yQlBQVjFfRm9ybWF0LCBSR0JfUFZSVENfNEJQUFYxX0Zvcm1hdCwgUkdCQV9QVlJUQ180QlBQVjFfRm9ybWF0LCBSR0JfRVRDMV9Gb3JtYXQsIFJHQl9FVEMyX0Zvcm1hdCwgUkdCQV9FVEMyX0VBQ19Gb3JtYXQsIFJHQkFfQVNUQ180eDRfRm9ybWF0LCBSR0JBX0FTVENfNXg0X0Zvcm1hdCwgUkdCQV9BU1RDXzV4NV9Gb3JtYXQsIFJHQkFfQVNUQ182eDVfRm9ybWF0LCBSR0JBX0FTVENfNng2X0Zvcm1hdCwgUkdCQV9BU1RDXzh4NV9Gb3JtYXQsIFJHQkFfQVNUQ184eDZfRm9ybWF0LCBSR0JBX0FTVENfOHg4X0Zvcm1hdCwgUkdCQV9BU1RDXzEweDVfRm9ybWF0LCBSR0JBX0FTVENfMTB4Nl9Gb3JtYXQsIFJHQkFfQVNUQ18xMHg4X0Zvcm1hdCwgUkdCQV9BU1RDXzEweDEwX0Zvcm1hdCwgUkdCQV9BU1RDXzEyeDEwX0Zvcm1hdCwgUkdCQV9BU1RDXzEyeDEyX0Zvcm1hdCwgUkdCQV9CUFRDX0Zvcm1hdCwgUkdCX0JQVENfU0lHTkVEX0Zvcm1hdCwgUkdCX0JQVENfVU5TSUdORURfRm9ybWF0LCBSRURfUkdUQzFfRm9ybWF0LCBTSUdORURfUkVEX1JHVEMxX0Zvcm1hdCwgUkVEX0dSRUVOX1JHVEMyX0Zvcm1hdCwgU0lHTkVEX1JFRF9HUkVFTl9SR1RDMl9Gb3JtYXQsIFVuc2lnbmVkQnl0ZVR5cGUsIEJ5dGVUeXBlLCBVbnNpZ25lZFNob3J0VHlwZSwgU2hvcnRUeXBlLCBIYWxmRmxvYXRUeXBlLCBVbnNpZ25lZFNob3J0NDQ0NFR5cGUsIFVuc2lnbmVkU2hvcnQ1NTUxVHlwZSwgVW5zaWduZWRJbnRUeXBlLCBJbnRUeXBlLCBGbG9hdFR5cGUsIFVuc2lnbmVkSW50NTk5OVR5cGUgfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xyXG5cclxuLyoqXHJcbiAqIFNjYWxlcyB0aGUgdGV4dHVyZSBhcyBsYXJnZSBhcyBwb3NzaWJsZSB3aXRoaW4gaXRzIHN1cmZhY2Ugd2l0aG91dCBjcm9wcGluZ1xyXG4gKiBvciBzdHJldGNoaW5nIHRoZSB0ZXh0dXJlLiBUaGUgbWV0aG9kIHByZXNlcnZlcyB0aGUgb3JpZ2luYWwgYXNwZWN0IHJhdGlvIG9mXHJcbiAqIHRoZSB0ZXh0dXJlLiBBa2luIHRvIENTUyBgb2JqZWN0LWZpdDogY29udGFpbmBcclxuICpcclxuICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBhc3BlY3QgLSBUaGUgdGV4dHVyZSdzIGFzcGVjdCByYXRpby5cclxuICogQHJldHVybiB7VGV4dHVyZX0gVGhlIHVwZGF0ZWQgdGV4dHVyZS5cclxuICovXHJcbmZ1bmN0aW9uIGNvbnRhaW4oIHRleHR1cmUsIGFzcGVjdCApIHtcclxuXHJcblx0Y29uc3QgaW1hZ2VBc3BlY3QgPSAoIHRleHR1cmUuaW1hZ2UgJiYgdGV4dHVyZS5pbWFnZS53aWR0aCApID8gdGV4dHVyZS5pbWFnZS53aWR0aCAvIHRleHR1cmUuaW1hZ2UuaGVpZ2h0IDogMTtcclxuXHJcblx0aWYgKCBpbWFnZUFzcGVjdCA+IGFzcGVjdCApIHtcclxuXHJcblx0XHR0ZXh0dXJlLnJlcGVhdC54ID0gMTtcclxuXHRcdHRleHR1cmUucmVwZWF0LnkgPSBpbWFnZUFzcGVjdCAvIGFzcGVjdDtcclxuXHJcblx0XHR0ZXh0dXJlLm9mZnNldC54ID0gMDtcclxuXHRcdHRleHR1cmUub2Zmc2V0LnkgPSAoIDEgLSB0ZXh0dXJlLnJlcGVhdC55ICkgLyAyO1xyXG5cclxuXHR9IGVsc2Uge1xyXG5cclxuXHRcdHRleHR1cmUucmVwZWF0LnggPSBhc3BlY3QgLyBpbWFnZUFzcGVjdDtcclxuXHRcdHRleHR1cmUucmVwZWF0LnkgPSAxO1xyXG5cclxuXHRcdHRleHR1cmUub2Zmc2V0LnggPSAoIDEgLSB0ZXh0dXJlLnJlcGVhdC54ICkgLyAyO1xyXG5cdFx0dGV4dHVyZS5vZmZzZXQueSA9IDA7XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIHRleHR1cmU7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogU2NhbGVzIHRoZSB0ZXh0dXJlIHRvIHRoZSBzbWFsbGVzdCBwb3NzaWJsZSBzaXplIHRvIGZpbGwgdGhlIHN1cmZhY2UsIGxlYXZpbmdcclxuICogbm8gZW1wdHkgc3BhY2UuIFRoZSBtZXRob2QgcHJlc2VydmVzIHRoZSBvcmlnaW5hbCBhc3BlY3QgcmF0aW8gb2YgdGhlIHRleHR1cmUuXHJcbiAqIEFraW4gdG8gQ1NTIGBvYmplY3QtZml0OiBjb3ZlcmAuXHJcbiAqXHJcbiAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gYXNwZWN0IC0gVGhlIHRleHR1cmUncyBhc3BlY3QgcmF0aW8uXHJcbiAqIEByZXR1cm4ge1RleHR1cmV9IFRoZSB1cGRhdGVkIHRleHR1cmUuXHJcbiAqL1xyXG5mdW5jdGlvbiBjb3ZlciggdGV4dHVyZSwgYXNwZWN0ICkge1xyXG5cclxuXHRjb25zdCBpbWFnZUFzcGVjdCA9ICggdGV4dHVyZS5pbWFnZSAmJiB0ZXh0dXJlLmltYWdlLndpZHRoICkgPyB0ZXh0dXJlLmltYWdlLndpZHRoIC8gdGV4dHVyZS5pbWFnZS5oZWlnaHQgOiAxO1xyXG5cclxuXHRpZiAoIGltYWdlQXNwZWN0ID4gYXNwZWN0ICkge1xyXG5cclxuXHRcdHRleHR1cmUucmVwZWF0LnggPSBhc3BlY3QgLyBpbWFnZUFzcGVjdDtcclxuXHRcdHRleHR1cmUucmVwZWF0LnkgPSAxO1xyXG5cclxuXHRcdHRleHR1cmUub2Zmc2V0LnggPSAoIDEgLSB0ZXh0dXJlLnJlcGVhdC54ICkgLyAyO1xyXG5cdFx0dGV4dHVyZS5vZmZzZXQueSA9IDA7XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0dGV4dHVyZS5yZXBlYXQueCA9IDE7XHJcblx0XHR0ZXh0dXJlLnJlcGVhdC55ID0gaW1hZ2VBc3BlY3QgLyBhc3BlY3Q7XHJcblxyXG5cdFx0dGV4dHVyZS5vZmZzZXQueCA9IDA7XHJcblx0XHR0ZXh0dXJlLm9mZnNldC55ID0gKCAxIC0gdGV4dHVyZS5yZXBlYXQueSApIC8gMjtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gdGV4dHVyZTtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb25maWd1cmVzIHRoZSB0ZXh0dXJlIHRvIHRoZSBkZWZhdWx0IHRyYW5zZm9ybWF0aW9uLiBBa2luIHRvIENTUyBgb2JqZWN0LWZpdDogZmlsbGAuXHJcbiAqXHJcbiAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlLlxyXG4gKiBAcmV0dXJuIHtUZXh0dXJlfSBUaGUgdXBkYXRlZCB0ZXh0dXJlLlxyXG4gKi9cclxuZnVuY3Rpb24gZmlsbCggdGV4dHVyZSApIHtcclxuXHJcblx0dGV4dHVyZS5yZXBlYXQueCA9IDE7XHJcblx0dGV4dHVyZS5yZXBlYXQueSA9IDE7XHJcblxyXG5cdHRleHR1cmUub2Zmc2V0LnggPSAwO1xyXG5cdHRleHR1cmUub2Zmc2V0LnkgPSAwO1xyXG5cclxuXHRyZXR1cm4gdGV4dHVyZTtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBEZXRlcm1pbmVzIGhvdyBtYW55IGJ5dGVzIG11c3QgYmUgdXNlZCB0byByZXByZXNlbnQgdGhlIHRleHR1cmUuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgdGV4dHVyZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIHRleHR1cmUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBmb3JtYXQgLSBUaGUgdGV4dHVyZSdzIGZvcm1hdC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHR5cGUgLSBUaGUgdGV4dHVyZSdzIHR5cGUuXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGJ5dGUgbGVuZ3RoLlxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0Qnl0ZUxlbmd0aCggd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0eXBlICkge1xyXG5cclxuXHRjb25zdCB0eXBlQnl0ZUxlbmd0aCA9IGdldFRleHR1cmVUeXBlQnl0ZUxlbmd0aCggdHlwZSApO1xyXG5cclxuXHRzd2l0Y2ggKCBmb3JtYXQgKSB7XHJcblxyXG5cdFx0Ly8gaHR0cHM6Ly9yZWdpc3RyeS5raHJvbm9zLm9yZy9PcGVuR0wtUmVmcGFnZXMvZXMzLjAvaHRtbC9nbFRleEltYWdlMkQueGh0bWxcclxuXHRcdGNhc2UgQWxwaGFGb3JtYXQ6XHJcblx0XHRcdHJldHVybiB3aWR0aCAqIGhlaWdodDtcclxuXHRcdGNhc2UgTHVtaW5hbmNlRm9ybWF0OlxyXG5cdFx0XHRyZXR1cm4gd2lkdGggKiBoZWlnaHQ7XHJcblx0XHRjYXNlIEx1bWluYW5jZUFscGhhRm9ybWF0OlxyXG5cdFx0XHRyZXR1cm4gd2lkdGggKiBoZWlnaHQgKiAyO1xyXG5cdFx0Y2FzZSBSZWRGb3JtYXQ6XHJcblx0XHRcdHJldHVybiAoICggd2lkdGggKiBoZWlnaHQgKSAvIHR5cGVCeXRlTGVuZ3RoLmNvbXBvbmVudHMgKSAqIHR5cGVCeXRlTGVuZ3RoLmJ5dGVMZW5ndGg7XHJcblx0XHRjYXNlIFJlZEludGVnZXJGb3JtYXQ6XHJcblx0XHRcdHJldHVybiAoICggd2lkdGggKiBoZWlnaHQgKSAvIHR5cGVCeXRlTGVuZ3RoLmNvbXBvbmVudHMgKSAqIHR5cGVCeXRlTGVuZ3RoLmJ5dGVMZW5ndGg7XHJcblx0XHRjYXNlIFJHRm9ybWF0OlxyXG5cdFx0XHRyZXR1cm4gKCAoIHdpZHRoICogaGVpZ2h0ICogMiApIC8gdHlwZUJ5dGVMZW5ndGguY29tcG9uZW50cyApICogdHlwZUJ5dGVMZW5ndGguYnl0ZUxlbmd0aDtcclxuXHRcdGNhc2UgUkdJbnRlZ2VyRm9ybWF0OlxyXG5cdFx0XHRyZXR1cm4gKCAoIHdpZHRoICogaGVpZ2h0ICogMiApIC8gdHlwZUJ5dGVMZW5ndGguY29tcG9uZW50cyApICogdHlwZUJ5dGVMZW5ndGguYnl0ZUxlbmd0aDtcclxuXHRcdGNhc2UgUkdCRm9ybWF0OlxyXG5cdFx0XHRyZXR1cm4gKCAoIHdpZHRoICogaGVpZ2h0ICogMyApIC8gdHlwZUJ5dGVMZW5ndGguY29tcG9uZW50cyApICogdHlwZUJ5dGVMZW5ndGguYnl0ZUxlbmd0aDtcclxuXHRcdGNhc2UgUkdCQUZvcm1hdDpcclxuXHRcdFx0cmV0dXJuICggKCB3aWR0aCAqIGhlaWdodCAqIDQgKSAvIHR5cGVCeXRlTGVuZ3RoLmNvbXBvbmVudHMgKSAqIHR5cGVCeXRlTGVuZ3RoLmJ5dGVMZW5ndGg7XHJcblx0XHRjYXNlIFJHQkFJbnRlZ2VyRm9ybWF0OlxyXG5cdFx0XHRyZXR1cm4gKCAoIHdpZHRoICogaGVpZ2h0ICogNCApIC8gdHlwZUJ5dGVMZW5ndGguY29tcG9uZW50cyApICogdHlwZUJ5dGVMZW5ndGguYnl0ZUxlbmd0aDtcclxuXHJcblx0XHQvLyBodHRwczovL3JlZ2lzdHJ5Lmtocm9ub3Mub3JnL3dlYmdsL2V4dGVuc2lvbnMvV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGNfc3JnYi9cclxuXHRcdGNhc2UgUkdCX1MzVENfRFhUMV9Gb3JtYXQ6XHJcblx0XHRjYXNlIFJHQkFfUzNUQ19EWFQxX0Zvcm1hdDpcclxuXHRcdFx0cmV0dXJuIE1hdGguZmxvb3IoICggd2lkdGggKyAzICkgLyA0ICkgKiBNYXRoLmZsb29yKCAoIGhlaWdodCArIDMgKSAvIDQgKSAqIDg7XHJcblx0XHRjYXNlIFJHQkFfUzNUQ19EWFQzX0Zvcm1hdDpcclxuXHRcdGNhc2UgUkdCQV9TM1RDX0RYVDVfRm9ybWF0OlxyXG5cdFx0XHRyZXR1cm4gTWF0aC5mbG9vciggKCB3aWR0aCArIDMgKSAvIDQgKSAqIE1hdGguZmxvb3IoICggaGVpZ2h0ICsgMyApIC8gNCApICogMTY7XHJcblxyXG5cdFx0Ly8gaHR0cHM6Ly9yZWdpc3RyeS5raHJvbm9zLm9yZy93ZWJnbC9leHRlbnNpb25zL1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0Yy9cclxuXHRcdGNhc2UgUkdCX1BWUlRDXzJCUFBWMV9Gb3JtYXQ6XHJcblx0XHRjYXNlIFJHQkFfUFZSVENfMkJQUFYxX0Zvcm1hdDpcclxuXHRcdFx0cmV0dXJuICggTWF0aC5tYXgoIHdpZHRoLCAxNiApICogTWF0aC5tYXgoIGhlaWdodCwgOCApICkgLyA0O1xyXG5cdFx0Y2FzZSBSR0JfUFZSVENfNEJQUFYxX0Zvcm1hdDpcclxuXHRcdGNhc2UgUkdCQV9QVlJUQ180QlBQVjFfRm9ybWF0OlxyXG5cdFx0XHRyZXR1cm4gKCBNYXRoLm1heCggd2lkdGgsIDggKSAqIE1hdGgubWF4KCBoZWlnaHQsIDggKSApIC8gMjtcclxuXHJcblx0XHQvLyBodHRwczovL3JlZ2lzdHJ5Lmtocm9ub3Mub3JnL3dlYmdsL2V4dGVuc2lvbnMvV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2V0Yy9cclxuXHRcdGNhc2UgUkdCX0VUQzFfRm9ybWF0OlxyXG5cdFx0Y2FzZSBSR0JfRVRDMl9Gb3JtYXQ6XHJcblx0XHRcdHJldHVybiBNYXRoLmZsb29yKCAoIHdpZHRoICsgMyApIC8gNCApICogTWF0aC5mbG9vciggKCBoZWlnaHQgKyAzICkgLyA0ICkgKiA4O1xyXG5cdFx0Y2FzZSBSR0JBX0VUQzJfRUFDX0Zvcm1hdDpcclxuXHRcdFx0cmV0dXJuIE1hdGguZmxvb3IoICggd2lkdGggKyAzICkgLyA0ICkgKiBNYXRoLmZsb29yKCAoIGhlaWdodCArIDMgKSAvIDQgKSAqIDE2O1xyXG5cclxuXHRcdC8vIGh0dHBzOi8vcmVnaXN0cnkua2hyb25vcy5vcmcvd2ViZ2wvZXh0ZW5zaW9ucy9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfYXN0Yy9cclxuXHRcdGNhc2UgUkdCQV9BU1RDXzR4NF9Gb3JtYXQ6XHJcblx0XHRcdHJldHVybiBNYXRoLmZsb29yKCAoIHdpZHRoICsgMyApIC8gNCApICogTWF0aC5mbG9vciggKCBoZWlnaHQgKyAzICkgLyA0ICkgKiAxNjtcclxuXHRcdGNhc2UgUkdCQV9BU1RDXzV4NF9Gb3JtYXQ6XHJcblx0XHRcdHJldHVybiBNYXRoLmZsb29yKCAoIHdpZHRoICsgNCApIC8gNSApICogTWF0aC5mbG9vciggKCBoZWlnaHQgKyAzICkgLyA0ICkgKiAxNjtcclxuXHRcdGNhc2UgUkdCQV9BU1RDXzV4NV9Gb3JtYXQ6XHJcblx0XHRcdHJldHVybiBNYXRoLmZsb29yKCAoIHdpZHRoICsgNCApIC8gNSApICogTWF0aC5mbG9vciggKCBoZWlnaHQgKyA0ICkgLyA1ICkgKiAxNjtcclxuXHRcdGNhc2UgUkdCQV9BU1RDXzZ4NV9Gb3JtYXQ6XHJcblx0XHRcdHJldHVybiBNYXRoLmZsb29yKCAoIHdpZHRoICsgNSApIC8gNiApICogTWF0aC5mbG9vciggKCBoZWlnaHQgKyA0ICkgLyA1ICkgKiAxNjtcclxuXHRcdGNhc2UgUkdCQV9BU1RDXzZ4Nl9Gb3JtYXQ6XHJcblx0XHRcdHJldHVybiBNYXRoLmZsb29yKCAoIHdpZHRoICsgNSApIC8gNiApICogTWF0aC5mbG9vciggKCBoZWlnaHQgKyA1ICkgLyA2ICkgKiAxNjtcclxuXHRcdGNhc2UgUkdCQV9BU1RDXzh4NV9Gb3JtYXQ6XHJcblx0XHRcdHJldHVybiBNYXRoLmZsb29yKCAoIHdpZHRoICsgNyApIC8gOCApICogTWF0aC5mbG9vciggKCBoZWlnaHQgKyA0ICkgLyA1ICkgKiAxNjtcclxuXHRcdGNhc2UgUkdCQV9BU1RDXzh4Nl9Gb3JtYXQ6XHJcblx0XHRcdHJldHVybiBNYXRoLmZsb29yKCAoIHdpZHRoICsgNyApIC8gOCApICogTWF0aC5mbG9vciggKCBoZWlnaHQgKyA1ICkgLyA2ICkgKiAxNjtcclxuXHRcdGNhc2UgUkdCQV9BU1RDXzh4OF9Gb3JtYXQ6XHJcblx0XHRcdHJldHVybiBNYXRoLmZsb29yKCAoIHdpZHRoICsgNyApIC8gOCApICogTWF0aC5mbG9vciggKCBoZWlnaHQgKyA3ICkgLyA4ICkgKiAxNjtcclxuXHRcdGNhc2UgUkdCQV9BU1RDXzEweDVfRm9ybWF0OlxyXG5cdFx0XHRyZXR1cm4gTWF0aC5mbG9vciggKCB3aWR0aCArIDkgKSAvIDEwICkgKiBNYXRoLmZsb29yKCAoIGhlaWdodCArIDQgKSAvIDUgKSAqIDE2O1xyXG5cdFx0Y2FzZSBSR0JBX0FTVENfMTB4Nl9Gb3JtYXQ6XHJcblx0XHRcdHJldHVybiBNYXRoLmZsb29yKCAoIHdpZHRoICsgOSApIC8gMTAgKSAqIE1hdGguZmxvb3IoICggaGVpZ2h0ICsgNSApIC8gNiApICogMTY7XHJcblx0XHRjYXNlIFJHQkFfQVNUQ18xMHg4X0Zvcm1hdDpcclxuXHRcdFx0cmV0dXJuIE1hdGguZmxvb3IoICggd2lkdGggKyA5ICkgLyAxMCApICogTWF0aC5mbG9vciggKCBoZWlnaHQgKyA3ICkgLyA4ICkgKiAxNjtcclxuXHRcdGNhc2UgUkdCQV9BU1RDXzEweDEwX0Zvcm1hdDpcclxuXHRcdFx0cmV0dXJuIE1hdGguZmxvb3IoICggd2lkdGggKyA5ICkgLyAxMCApICogTWF0aC5mbG9vciggKCBoZWlnaHQgKyA5ICkgLyAxMCApICogMTY7XHJcblx0XHRjYXNlIFJHQkFfQVNUQ18xMngxMF9Gb3JtYXQ6XHJcblx0XHRcdHJldHVybiBNYXRoLmZsb29yKCAoIHdpZHRoICsgMTEgKSAvIDEyICkgKiBNYXRoLmZsb29yKCAoIGhlaWdodCArIDkgKSAvIDEwICkgKiAxNjtcclxuXHRcdGNhc2UgUkdCQV9BU1RDXzEyeDEyX0Zvcm1hdDpcclxuXHRcdFx0cmV0dXJuIE1hdGguZmxvb3IoICggd2lkdGggKyAxMSApIC8gMTIgKSAqIE1hdGguZmxvb3IoICggaGVpZ2h0ICsgMTEgKSAvIDEyICkgKiAxNjtcclxuXHJcblx0XHQvLyBodHRwczovL3JlZ2lzdHJ5Lmtocm9ub3Mub3JnL3dlYmdsL2V4dGVuc2lvbnMvRVhUX3RleHR1cmVfY29tcHJlc3Npb25fYnB0Yy9cclxuXHRcdGNhc2UgUkdCQV9CUFRDX0Zvcm1hdDpcclxuXHRcdGNhc2UgUkdCX0JQVENfU0lHTkVEX0Zvcm1hdDpcclxuXHRcdGNhc2UgUkdCX0JQVENfVU5TSUdORURfRm9ybWF0OlxyXG5cdFx0XHRyZXR1cm4gTWF0aC5jZWlsKCB3aWR0aCAvIDQgKSAqIE1hdGguY2VpbCggaGVpZ2h0IC8gNCApICogMTY7XHJcblxyXG5cdFx0Ly8gaHR0cHM6Ly9yZWdpc3RyeS5raHJvbm9zLm9yZy93ZWJnbC9leHRlbnNpb25zL0VYVF90ZXh0dXJlX2NvbXByZXNzaW9uX3JndGMvXHJcblx0XHRjYXNlIFJFRF9SR1RDMV9Gb3JtYXQ6XHJcblx0XHRjYXNlIFNJR05FRF9SRURfUkdUQzFfRm9ybWF0OlxyXG5cdFx0XHRyZXR1cm4gTWF0aC5jZWlsKCB3aWR0aCAvIDQgKSAqIE1hdGguY2VpbCggaGVpZ2h0IC8gNCApICogODtcclxuXHRcdGNhc2UgUkVEX0dSRUVOX1JHVEMyX0Zvcm1hdDpcclxuXHRcdGNhc2UgU0lHTkVEX1JFRF9HUkVFTl9SR1RDMl9Gb3JtYXQ6XHJcblx0XHRcdHJldHVybiBNYXRoLmNlaWwoIHdpZHRoIC8gNCApICogTWF0aC5jZWlsKCBoZWlnaHQgLyA0ICkgKiAxNjtcclxuXHJcblx0fVxyXG5cclxuXHR0aHJvdyBuZXcgRXJyb3IoXHJcblx0XHRgVW5hYmxlIHRvIGRldGVybWluZSB0ZXh0dXJlIGJ5dGUgbGVuZ3RoIGZvciAke2Zvcm1hdH0gZm9ybWF0LmAsXHJcblx0KTtcclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldFRleHR1cmVUeXBlQnl0ZUxlbmd0aCggdHlwZSApIHtcclxuXHJcblx0c3dpdGNoICggdHlwZSApIHtcclxuXHJcblx0XHRjYXNlIFVuc2lnbmVkQnl0ZVR5cGU6XHJcblx0XHRjYXNlIEJ5dGVUeXBlOlxyXG5cdFx0XHRyZXR1cm4geyBieXRlTGVuZ3RoOiAxLCBjb21wb25lbnRzOiAxIH07XHJcblx0XHRjYXNlIFVuc2lnbmVkU2hvcnRUeXBlOlxyXG5cdFx0Y2FzZSBTaG9ydFR5cGU6XHJcblx0XHRjYXNlIEhhbGZGbG9hdFR5cGU6XHJcblx0XHRcdHJldHVybiB7IGJ5dGVMZW5ndGg6IDIsIGNvbXBvbmVudHM6IDEgfTtcclxuXHRcdGNhc2UgVW5zaWduZWRTaG9ydDQ0NDRUeXBlOlxyXG5cdFx0Y2FzZSBVbnNpZ25lZFNob3J0NTU1MVR5cGU6XHJcblx0XHRcdHJldHVybiB7IGJ5dGVMZW5ndGg6IDIsIGNvbXBvbmVudHM6IDQgfTtcclxuXHRcdGNhc2UgVW5zaWduZWRJbnRUeXBlOlxyXG5cdFx0Y2FzZSBJbnRUeXBlOlxyXG5cdFx0Y2FzZSBGbG9hdFR5cGU6XHJcblx0XHRcdHJldHVybiB7IGJ5dGVMZW5ndGg6IDQsIGNvbXBvbmVudHM6IDEgfTtcclxuXHRcdGNhc2UgVW5zaWduZWRJbnQ1OTk5VHlwZTpcclxuXHRcdFx0cmV0dXJuIHsgYnl0ZUxlbmd0aDogNCwgY29tcG9uZW50czogMyB9O1xyXG5cclxuXHR9XHJcblxyXG5cdHRocm93IG5ldyBFcnJvciggYFVua25vd24gdGV4dHVyZSB0eXBlICR7dHlwZX0uYCApO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIEEgY2xhc3MgY29udGFpbmluZyB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgdGV4dHVyZXMuXHJcbiAqXHJcbiAqIEBoaWRlY29uc3RydWN0b3JcclxuICovXHJcbmNsYXNzIFRleHR1cmVVdGlscyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNjYWxlcyB0aGUgdGV4dHVyZSBhcyBsYXJnZSBhcyBwb3NzaWJsZSB3aXRoaW4gaXRzIHN1cmZhY2Ugd2l0aG91dCBjcm9wcGluZ1xyXG5cdCAqIG9yIHN0cmV0Y2hpbmcgdGhlIHRleHR1cmUuIFRoZSBtZXRob2QgcHJlc2VydmVzIHRoZSBvcmlnaW5hbCBhc3BlY3QgcmF0aW8gb2ZcclxuXHQgKiB0aGUgdGV4dHVyZS4gQWtpbiB0byBDU1MgYG9iamVjdC1maXQ6IGNvbnRhaW5gXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYXNwZWN0IC0gVGhlIHRleHR1cmUncyBhc3BlY3QgcmF0aW8uXHJcblx0ICogQHJldHVybiB7VGV4dHVyZX0gVGhlIHVwZGF0ZWQgdGV4dHVyZS5cclxuXHQgKi9cclxuXHRzdGF0aWMgY29udGFpbiggdGV4dHVyZSwgYXNwZWN0ICkge1xyXG5cclxuXHRcdHJldHVybiBjb250YWluKCB0ZXh0dXJlLCBhc3BlY3QgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTY2FsZXMgdGhlIHRleHR1cmUgdG8gdGhlIHNtYWxsZXN0IHBvc3NpYmxlIHNpemUgdG8gZmlsbCB0aGUgc3VyZmFjZSwgbGVhdmluZ1xyXG5cdCAqIG5vIGVtcHR5IHNwYWNlLiBUaGUgbWV0aG9kIHByZXNlcnZlcyB0aGUgb3JpZ2luYWwgYXNwZWN0IHJhdGlvIG9mIHRoZSB0ZXh0dXJlLlxyXG5cdCAqIEFraW4gdG8gQ1NTIGBvYmplY3QtZml0OiBjb3ZlcmAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYXNwZWN0IC0gVGhlIHRleHR1cmUncyBhc3BlY3QgcmF0aW8uXHJcblx0ICogQHJldHVybiB7VGV4dHVyZX0gVGhlIHVwZGF0ZWQgdGV4dHVyZS5cclxuXHQgKi9cclxuXHRzdGF0aWMgY292ZXIoIHRleHR1cmUsIGFzcGVjdCApIHtcclxuXHJcblx0XHRyZXR1cm4gY292ZXIoIHRleHR1cmUsIGFzcGVjdCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbmZpZ3VyZXMgdGhlIHRleHR1cmUgdG8gdGhlIGRlZmF1bHQgdHJhbnNmb3JtYXRpb24uIEFraW4gdG8gQ1NTIGBvYmplY3QtZml0OiBmaWxsYC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlLlxyXG5cdCAqIEByZXR1cm4ge1RleHR1cmV9IFRoZSB1cGRhdGVkIHRleHR1cmUuXHJcblx0ICovXHJcblx0c3RhdGljIGZpbGwoIHRleHR1cmUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIGZpbGwoIHRleHR1cmUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZXRlcm1pbmVzIGhvdyBtYW55IGJ5dGVzIG11c3QgYmUgdXNlZCB0byByZXByZXNlbnQgdGhlIHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGZvcm1hdCAtIFRoZSB0ZXh0dXJlJ3MgZm9ybWF0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0eXBlIC0gVGhlIHRleHR1cmUncyB0eXBlLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGJ5dGUgbGVuZ3RoLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBnZXRCeXRlTGVuZ3RoKCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIGdldEJ5dGVMZW5ndGgoIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBjb250YWluLCBjb3ZlciwgZmlsbCwgZ2V0Qnl0ZUxlbmd0aCwgVGV4dHVyZVV0aWxzIH07XHJcbiIsImltcG9ydCB7IFJFVklTSU9OIH0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xyXG5cclxuZXhwb3J0IHsgV2ViR0xBcnJheVJlbmRlclRhcmdldCB9IGZyb20gJy4vcmVuZGVyZXJzL1dlYkdMQXJyYXlSZW5kZXJUYXJnZXQuanMnO1xyXG5leHBvcnQgeyBXZWJHTDNEUmVuZGVyVGFyZ2V0IH0gZnJvbSAnLi9yZW5kZXJlcnMvV2ViR0wzRFJlbmRlclRhcmdldC5qcyc7XHJcbmV4cG9ydCB7IFdlYkdMQ3ViZVJlbmRlclRhcmdldCB9IGZyb20gJy4vcmVuZGVyZXJzL1dlYkdMQ3ViZVJlbmRlclRhcmdldC5qcyc7XHJcbmV4cG9ydCB7IFdlYkdMUmVuZGVyVGFyZ2V0IH0gZnJvbSAnLi9yZW5kZXJlcnMvV2ViR0xSZW5kZXJUYXJnZXQuanMnO1xyXG5leHBvcnQgeyBXZWJYUkNvbnRyb2xsZXIgfSBmcm9tICcuL3JlbmRlcmVycy93ZWJ4ci9XZWJYUkNvbnRyb2xsZXIuanMnO1xyXG5leHBvcnQgeyBGb2dFeHAyIH0gZnJvbSAnLi9zY2VuZXMvRm9nRXhwMi5qcyc7XHJcbmV4cG9ydCB7IEZvZyB9IGZyb20gJy4vc2NlbmVzL0ZvZy5qcyc7XHJcbmV4cG9ydCB7IFNjZW5lIH0gZnJvbSAnLi9zY2VuZXMvU2NlbmUuanMnO1xyXG5leHBvcnQgeyBTcHJpdGUgfSBmcm9tICcuL29iamVjdHMvU3ByaXRlLmpzJztcclxuZXhwb3J0IHsgTE9EIH0gZnJvbSAnLi9vYmplY3RzL0xPRC5qcyc7XHJcbmV4cG9ydCB7IFNraW5uZWRNZXNoIH0gZnJvbSAnLi9vYmplY3RzL1NraW5uZWRNZXNoLmpzJztcclxuZXhwb3J0IHsgU2tlbGV0b24gfSBmcm9tICcuL29iamVjdHMvU2tlbGV0b24uanMnO1xyXG5leHBvcnQgeyBCb25lIH0gZnJvbSAnLi9vYmplY3RzL0JvbmUuanMnO1xyXG5leHBvcnQgeyBNZXNoIH0gZnJvbSAnLi9vYmplY3RzL01lc2guanMnO1xyXG5leHBvcnQgeyBJbnN0YW5jZWRNZXNoIH0gZnJvbSAnLi9vYmplY3RzL0luc3RhbmNlZE1lc2guanMnO1xyXG5leHBvcnQgeyBCYXRjaGVkTWVzaCB9IGZyb20gJy4vb2JqZWN0cy9CYXRjaGVkTWVzaC5qcyc7XHJcbmV4cG9ydCB7IExpbmVTZWdtZW50cyB9IGZyb20gJy4vb2JqZWN0cy9MaW5lU2VnbWVudHMuanMnO1xyXG5leHBvcnQgeyBMaW5lTG9vcCB9IGZyb20gJy4vb2JqZWN0cy9MaW5lTG9vcC5qcyc7XHJcbmV4cG9ydCB7IExpbmUgfSBmcm9tICcuL29iamVjdHMvTGluZS5qcyc7XHJcbmV4cG9ydCB7IFBvaW50cyB9IGZyb20gJy4vb2JqZWN0cy9Qb2ludHMuanMnO1xyXG5leHBvcnQgeyBHcm91cCB9IGZyb20gJy4vb2JqZWN0cy9Hcm91cC5qcyc7XHJcbmV4cG9ydCB7IFZpZGVvVGV4dHVyZSB9IGZyb20gJy4vdGV4dHVyZXMvVmlkZW9UZXh0dXJlLmpzJztcclxuZXhwb3J0IHsgVmlkZW9GcmFtZVRleHR1cmUgfSBmcm9tICcuL3RleHR1cmVzL1ZpZGVvRnJhbWVUZXh0dXJlLmpzJztcclxuZXhwb3J0IHsgRnJhbWVidWZmZXJUZXh0dXJlIH0gZnJvbSAnLi90ZXh0dXJlcy9GcmFtZWJ1ZmZlclRleHR1cmUuanMnO1xyXG5leHBvcnQgeyBTb3VyY2UgfSBmcm9tICcuL3RleHR1cmVzL1NvdXJjZS5qcyc7XHJcbmV4cG9ydCB7IERhdGFUZXh0dXJlIH0gZnJvbSAnLi90ZXh0dXJlcy9EYXRhVGV4dHVyZS5qcyc7XHJcbmV4cG9ydCB7IERhdGFBcnJheVRleHR1cmUgfSBmcm9tICcuL3RleHR1cmVzL0RhdGFBcnJheVRleHR1cmUuanMnO1xyXG5leHBvcnQgeyBEYXRhM0RUZXh0dXJlIH0gZnJvbSAnLi90ZXh0dXJlcy9EYXRhM0RUZXh0dXJlLmpzJztcclxuZXhwb3J0IHsgQ29tcHJlc3NlZFRleHR1cmUgfSBmcm9tICcuL3RleHR1cmVzL0NvbXByZXNzZWRUZXh0dXJlLmpzJztcclxuZXhwb3J0IHsgQ29tcHJlc3NlZEFycmF5VGV4dHVyZSB9IGZyb20gJy4vdGV4dHVyZXMvQ29tcHJlc3NlZEFycmF5VGV4dHVyZS5qcyc7XHJcbmV4cG9ydCB7IENvbXByZXNzZWRDdWJlVGV4dHVyZSB9IGZyb20gJy4vdGV4dHVyZXMvQ29tcHJlc3NlZEN1YmVUZXh0dXJlLmpzJztcclxuZXhwb3J0IHsgQ3ViZVRleHR1cmUgfSBmcm9tICcuL3RleHR1cmVzL0N1YmVUZXh0dXJlLmpzJztcclxuZXhwb3J0IHsgQ2FudmFzVGV4dHVyZSB9IGZyb20gJy4vdGV4dHVyZXMvQ2FudmFzVGV4dHVyZS5qcyc7XHJcbmV4cG9ydCB7IERlcHRoVGV4dHVyZSB9IGZyb20gJy4vdGV4dHVyZXMvRGVwdGhUZXh0dXJlLmpzJztcclxuZXhwb3J0IHsgVGV4dHVyZSB9IGZyb20gJy4vdGV4dHVyZXMvVGV4dHVyZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vZ2VvbWV0cmllcy9HZW9tZXRyaWVzLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi9tYXRlcmlhbHMvTWF0ZXJpYWxzLmpzJztcclxuZXhwb3J0IHsgQW5pbWF0aW9uTG9hZGVyIH0gZnJvbSAnLi9sb2FkZXJzL0FuaW1hdGlvbkxvYWRlci5qcyc7XHJcbmV4cG9ydCB7IENvbXByZXNzZWRUZXh0dXJlTG9hZGVyIH0gZnJvbSAnLi9sb2FkZXJzL0NvbXByZXNzZWRUZXh0dXJlTG9hZGVyLmpzJztcclxuZXhwb3J0IHsgQ3ViZVRleHR1cmVMb2FkZXIgfSBmcm9tICcuL2xvYWRlcnMvQ3ViZVRleHR1cmVMb2FkZXIuanMnO1xyXG5leHBvcnQgeyBEYXRhVGV4dHVyZUxvYWRlciB9IGZyb20gJy4vbG9hZGVycy9EYXRhVGV4dHVyZUxvYWRlci5qcyc7XHJcbmV4cG9ydCB7IFRleHR1cmVMb2FkZXIgfSBmcm9tICcuL2xvYWRlcnMvVGV4dHVyZUxvYWRlci5qcyc7XHJcbmV4cG9ydCB7IE9iamVjdExvYWRlciB9IGZyb20gJy4vbG9hZGVycy9PYmplY3RMb2FkZXIuanMnO1xyXG5leHBvcnQgeyBNYXRlcmlhbExvYWRlciB9IGZyb20gJy4vbG9hZGVycy9NYXRlcmlhbExvYWRlci5qcyc7XHJcbmV4cG9ydCB7IEJ1ZmZlckdlb21ldHJ5TG9hZGVyIH0gZnJvbSAnLi9sb2FkZXJzL0J1ZmZlckdlb21ldHJ5TG9hZGVyLmpzJztcclxuZXhwb3J0IHsgRGVmYXVsdExvYWRpbmdNYW5hZ2VyLCBMb2FkaW5nTWFuYWdlciB9IGZyb20gJy4vbG9hZGVycy9Mb2FkaW5nTWFuYWdlci5qcyc7XHJcbmV4cG9ydCB7IEltYWdlTG9hZGVyIH0gZnJvbSAnLi9sb2FkZXJzL0ltYWdlTG9hZGVyLmpzJztcclxuZXhwb3J0IHsgSW1hZ2VCaXRtYXBMb2FkZXIgfSBmcm9tICcuL2xvYWRlcnMvSW1hZ2VCaXRtYXBMb2FkZXIuanMnO1xyXG5leHBvcnQgeyBGaWxlTG9hZGVyIH0gZnJvbSAnLi9sb2FkZXJzL0ZpbGVMb2FkZXIuanMnO1xyXG5leHBvcnQgeyBMb2FkZXIgfSBmcm9tICcuL2xvYWRlcnMvTG9hZGVyLmpzJztcclxuZXhwb3J0IHsgTG9hZGVyVXRpbHMgfSBmcm9tICcuL2xvYWRlcnMvTG9hZGVyVXRpbHMuanMnO1xyXG5leHBvcnQgeyBDYWNoZSB9IGZyb20gJy4vbG9hZGVycy9DYWNoZS5qcyc7XHJcbmV4cG9ydCB7IEF1ZGlvTG9hZGVyIH0gZnJvbSAnLi9sb2FkZXJzL0F1ZGlvTG9hZGVyLmpzJztcclxuZXhwb3J0IHsgU3BvdExpZ2h0IH0gZnJvbSAnLi9saWdodHMvU3BvdExpZ2h0LmpzJztcclxuZXhwb3J0IHsgUG9pbnRMaWdodCB9IGZyb20gJy4vbGlnaHRzL1BvaW50TGlnaHQuanMnO1xyXG5leHBvcnQgeyBSZWN0QXJlYUxpZ2h0IH0gZnJvbSAnLi9saWdodHMvUmVjdEFyZWFMaWdodC5qcyc7XHJcbmV4cG9ydCB7IEhlbWlzcGhlcmVMaWdodCB9IGZyb20gJy4vbGlnaHRzL0hlbWlzcGhlcmVMaWdodC5qcyc7XHJcbmV4cG9ydCB7IERpcmVjdGlvbmFsTGlnaHQgfSBmcm9tICcuL2xpZ2h0cy9EaXJlY3Rpb25hbExpZ2h0LmpzJztcclxuZXhwb3J0IHsgQW1iaWVudExpZ2h0IH0gZnJvbSAnLi9saWdodHMvQW1iaWVudExpZ2h0LmpzJztcclxuZXhwb3J0IHsgTGlnaHQgfSBmcm9tICcuL2xpZ2h0cy9MaWdodC5qcyc7XHJcbmV4cG9ydCB7IExpZ2h0UHJvYmUgfSBmcm9tICcuL2xpZ2h0cy9MaWdodFByb2JlLmpzJztcclxuZXhwb3J0IHsgU3RlcmVvQ2FtZXJhIH0gZnJvbSAnLi9jYW1lcmFzL1N0ZXJlb0NhbWVyYS5qcyc7XHJcbmV4cG9ydCB7IFBlcnNwZWN0aXZlQ2FtZXJhIH0gZnJvbSAnLi9jYW1lcmFzL1BlcnNwZWN0aXZlQ2FtZXJhLmpzJztcclxuZXhwb3J0IHsgT3J0aG9ncmFwaGljQ2FtZXJhIH0gZnJvbSAnLi9jYW1lcmFzL09ydGhvZ3JhcGhpY0NhbWVyYS5qcyc7XHJcbmV4cG9ydCB7IEN1YmVDYW1lcmEgfSBmcm9tICcuL2NhbWVyYXMvQ3ViZUNhbWVyYS5qcyc7XHJcbmV4cG9ydCB7IEFycmF5Q2FtZXJhIH0gZnJvbSAnLi9jYW1lcmFzL0FycmF5Q2FtZXJhLmpzJztcclxuZXhwb3J0IHsgQ2FtZXJhIH0gZnJvbSAnLi9jYW1lcmFzL0NhbWVyYS5qcyc7XHJcbmV4cG9ydCB7IEF1ZGlvTGlzdGVuZXIgfSBmcm9tICcuL2F1ZGlvL0F1ZGlvTGlzdGVuZXIuanMnO1xyXG5leHBvcnQgeyBQb3NpdGlvbmFsQXVkaW8gfSBmcm9tICcuL2F1ZGlvL1Bvc2l0aW9uYWxBdWRpby5qcyc7XHJcbmV4cG9ydCB7IEF1ZGlvQ29udGV4dCB9IGZyb20gJy4vYXVkaW8vQXVkaW9Db250ZXh0LmpzJztcclxuZXhwb3J0IHsgQXVkaW9BbmFseXNlciB9IGZyb20gJy4vYXVkaW8vQXVkaW9BbmFseXNlci5qcyc7XHJcbmV4cG9ydCB7IEF1ZGlvIH0gZnJvbSAnLi9hdWRpby9BdWRpby5qcyc7XHJcbmV4cG9ydCB7IFZlY3RvcktleWZyYW1lVHJhY2sgfSBmcm9tICcuL2FuaW1hdGlvbi90cmFja3MvVmVjdG9yS2V5ZnJhbWVUcmFjay5qcyc7XHJcbmV4cG9ydCB7IFN0cmluZ0tleWZyYW1lVHJhY2sgfSBmcm9tICcuL2FuaW1hdGlvbi90cmFja3MvU3RyaW5nS2V5ZnJhbWVUcmFjay5qcyc7XHJcbmV4cG9ydCB7IFF1YXRlcm5pb25LZXlmcmFtZVRyYWNrIH0gZnJvbSAnLi9hbmltYXRpb24vdHJhY2tzL1F1YXRlcm5pb25LZXlmcmFtZVRyYWNrLmpzJztcclxuZXhwb3J0IHsgTnVtYmVyS2V5ZnJhbWVUcmFjayB9IGZyb20gJy4vYW5pbWF0aW9uL3RyYWNrcy9OdW1iZXJLZXlmcmFtZVRyYWNrLmpzJztcclxuZXhwb3J0IHsgQ29sb3JLZXlmcmFtZVRyYWNrIH0gZnJvbSAnLi9hbmltYXRpb24vdHJhY2tzL0NvbG9yS2V5ZnJhbWVUcmFjay5qcyc7XHJcbmV4cG9ydCB7IEJvb2xlYW5LZXlmcmFtZVRyYWNrIH0gZnJvbSAnLi9hbmltYXRpb24vdHJhY2tzL0Jvb2xlYW5LZXlmcmFtZVRyYWNrLmpzJztcclxuZXhwb3J0IHsgUHJvcGVydHlNaXhlciB9IGZyb20gJy4vYW5pbWF0aW9uL1Byb3BlcnR5TWl4ZXIuanMnO1xyXG5leHBvcnQgeyBQcm9wZXJ0eUJpbmRpbmcgfSBmcm9tICcuL2FuaW1hdGlvbi9Qcm9wZXJ0eUJpbmRpbmcuanMnO1xyXG5leHBvcnQgeyBLZXlmcmFtZVRyYWNrIH0gZnJvbSAnLi9hbmltYXRpb24vS2V5ZnJhbWVUcmFjay5qcyc7XHJcbmV4cG9ydCB7IEFuaW1hdGlvblV0aWxzIH0gZnJvbSAnLi9hbmltYXRpb24vQW5pbWF0aW9uVXRpbHMuanMnO1xyXG5leHBvcnQgeyBBbmltYXRpb25PYmplY3RHcm91cCB9IGZyb20gJy4vYW5pbWF0aW9uL0FuaW1hdGlvbk9iamVjdEdyb3VwLmpzJztcclxuZXhwb3J0IHsgQW5pbWF0aW9uTWl4ZXIgfSBmcm9tICcuL2FuaW1hdGlvbi9BbmltYXRpb25NaXhlci5qcyc7XHJcbmV4cG9ydCB7IEFuaW1hdGlvbkNsaXAgfSBmcm9tICcuL2FuaW1hdGlvbi9BbmltYXRpb25DbGlwLmpzJztcclxuZXhwb3J0IHsgQW5pbWF0aW9uQWN0aW9uIH0gZnJvbSAnLi9hbmltYXRpb24vQW5pbWF0aW9uQWN0aW9uLmpzJztcclxuZXhwb3J0IHsgUmVuZGVyVGFyZ2V0IH0gZnJvbSAnLi9jb3JlL1JlbmRlclRhcmdldC5qcyc7XHJcbmV4cG9ydCB7IFJlbmRlclRhcmdldDNEIH0gZnJvbSAnLi9jb3JlL1JlbmRlclRhcmdldDNELmpzJztcclxuZXhwb3J0IHsgUmVuZGVyVGFyZ2V0QXJyYXkgfSBmcm9tICcuL2NvcmUvUmVuZGVyVGFyZ2V0QXJyYXkuanMnO1xyXG5leHBvcnQgeyBVbmlmb3JtIH0gZnJvbSAnLi9jb3JlL1VuaWZvcm0uanMnO1xyXG5leHBvcnQgeyBVbmlmb3Jtc0dyb3VwIH0gZnJvbSAnLi9jb3JlL1VuaWZvcm1zR3JvdXAuanMnO1xyXG5leHBvcnQgeyBJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4vY29yZS9JbnN0YW5jZWRCdWZmZXJHZW9tZXRyeS5qcyc7XHJcbmV4cG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcclxuZXhwb3J0IHsgSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuL2NvcmUvSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5leHBvcnQgeyBJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlciB9IGZyb20gJy4vY29yZS9JbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlci5qcyc7XHJcbmV4cG9ydCB7IEludGVybGVhdmVkQnVmZmVyIH0gZnJvbSAnLi9jb3JlL0ludGVybGVhdmVkQnVmZmVyLmpzJztcclxuZXhwb3J0IHsgSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi9jb3JlL0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcbmV4cG9ydCB7IEdMQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi9jb3JlL0dMQnVmZmVyQXR0cmlidXRlLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcbmV4cG9ydCB7IE9iamVjdDNEIH0gZnJvbSAnLi9jb3JlL09iamVjdDNELmpzJztcclxuZXhwb3J0IHsgUmF5Y2FzdGVyIH0gZnJvbSAnLi9jb3JlL1JheWNhc3Rlci5qcyc7XHJcbmV4cG9ydCB7IExheWVycyB9IGZyb20gJy4vY29yZS9MYXllcnMuanMnO1xyXG5leHBvcnQgeyBFdmVudERpc3BhdGNoZXIgfSBmcm9tICcuL2NvcmUvRXZlbnREaXNwYXRjaGVyLmpzJztcclxuZXhwb3J0IHsgQ2xvY2sgfSBmcm9tICcuL2NvcmUvQ2xvY2suanMnO1xyXG5leHBvcnQgeyBRdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQgfSBmcm9tICcuL21hdGgvaW50ZXJwb2xhbnRzL1F1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudC5qcyc7XHJcbmV4cG9ydCB7IExpbmVhckludGVycG9sYW50IH0gZnJvbSAnLi9tYXRoL2ludGVycG9sYW50cy9MaW5lYXJJbnRlcnBvbGFudC5qcyc7XHJcbmV4cG9ydCB7IERpc2NyZXRlSW50ZXJwb2xhbnQgfSBmcm9tICcuL21hdGgvaW50ZXJwb2xhbnRzL0Rpc2NyZXRlSW50ZXJwb2xhbnQuanMnO1xyXG5leHBvcnQgeyBDdWJpY0ludGVycG9sYW50IH0gZnJvbSAnLi9tYXRoL2ludGVycG9sYW50cy9DdWJpY0ludGVycG9sYW50LmpzJztcclxuZXhwb3J0IHsgSW50ZXJwb2xhbnQgfSBmcm9tICcuL21hdGgvSW50ZXJwb2xhbnQuanMnO1xyXG5leHBvcnQgeyBUcmlhbmdsZSB9IGZyb20gJy4vbWF0aC9UcmlhbmdsZS5qcyc7XHJcbmV4cG9ydCB7IE1hdGhVdGlscyB9IGZyb20gJy4vbWF0aC9NYXRoVXRpbHMuanMnO1xyXG5leHBvcnQgeyBTcGhlcmljYWwgfSBmcm9tICcuL21hdGgvU3BoZXJpY2FsLmpzJztcclxuZXhwb3J0IHsgQ3lsaW5kcmljYWwgfSBmcm9tICcuL21hdGgvQ3lsaW5kcmljYWwuanMnO1xyXG5leHBvcnQgeyBQbGFuZSB9IGZyb20gJy4vbWF0aC9QbGFuZS5qcyc7XHJcbmV4cG9ydCB7IEZydXN0dW0gfSBmcm9tICcuL21hdGgvRnJ1c3R1bS5qcyc7XHJcbmV4cG9ydCB7IFNwaGVyZSB9IGZyb20gJy4vbWF0aC9TcGhlcmUuanMnO1xyXG5leHBvcnQgeyBSYXkgfSBmcm9tICcuL21hdGgvUmF5LmpzJztcclxuZXhwb3J0IHsgTWF0cml4NCB9IGZyb20gJy4vbWF0aC9NYXRyaXg0LmpzJztcclxuZXhwb3J0IHsgTWF0cml4MyB9IGZyb20gJy4vbWF0aC9NYXRyaXgzLmpzJztcclxuZXhwb3J0IHsgTWF0cml4MiB9IGZyb20gJy4vbWF0aC9NYXRyaXgyLmpzJztcclxuZXhwb3J0IHsgQm94MyB9IGZyb20gJy4vbWF0aC9Cb3gzLmpzJztcclxuZXhwb3J0IHsgQm94MiB9IGZyb20gJy4vbWF0aC9Cb3gyLmpzJztcclxuZXhwb3J0IHsgTGluZTMgfSBmcm9tICcuL21hdGgvTGluZTMuanMnO1xyXG5leHBvcnQgeyBFdWxlciB9IGZyb20gJy4vbWF0aC9FdWxlci5qcyc7XHJcbmV4cG9ydCB7IFZlY3RvcjQgfSBmcm9tICcuL21hdGgvVmVjdG9yNC5qcyc7XHJcbmV4cG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuL21hdGgvVmVjdG9yMy5qcyc7XHJcbmV4cG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuL21hdGgvVmVjdG9yMi5qcyc7XHJcbmV4cG9ydCB7IFF1YXRlcm5pb24gfSBmcm9tICcuL21hdGgvUXVhdGVybmlvbi5qcyc7XHJcbmV4cG9ydCB7IENvbG9yIH0gZnJvbSAnLi9tYXRoL0NvbG9yLmpzJztcclxuZXhwb3J0IHsgQ29sb3JNYW5hZ2VtZW50IH0gZnJvbSAnLi9tYXRoL0NvbG9yTWFuYWdlbWVudC5qcyc7XHJcbmV4cG9ydCB7IFNwaGVyaWNhbEhhcm1vbmljczMgfSBmcm9tICcuL21hdGgvU3BoZXJpY2FsSGFybW9uaWNzMy5qcyc7XHJcbmV4cG9ydCB7IFNwb3RMaWdodEhlbHBlciB9IGZyb20gJy4vaGVscGVycy9TcG90TGlnaHRIZWxwZXIuanMnO1xyXG5leHBvcnQgeyBTa2VsZXRvbkhlbHBlciB9IGZyb20gJy4vaGVscGVycy9Ta2VsZXRvbkhlbHBlci5qcyc7XHJcbmV4cG9ydCB7IFBvaW50TGlnaHRIZWxwZXIgfSBmcm9tICcuL2hlbHBlcnMvUG9pbnRMaWdodEhlbHBlci5qcyc7XHJcbmV4cG9ydCB7IEhlbWlzcGhlcmVMaWdodEhlbHBlciB9IGZyb20gJy4vaGVscGVycy9IZW1pc3BoZXJlTGlnaHRIZWxwZXIuanMnO1xyXG5leHBvcnQgeyBHcmlkSGVscGVyIH0gZnJvbSAnLi9oZWxwZXJzL0dyaWRIZWxwZXIuanMnO1xyXG5leHBvcnQgeyBQb2xhckdyaWRIZWxwZXIgfSBmcm9tICcuL2hlbHBlcnMvUG9sYXJHcmlkSGVscGVyLmpzJztcclxuZXhwb3J0IHsgRGlyZWN0aW9uYWxMaWdodEhlbHBlciB9IGZyb20gJy4vaGVscGVycy9EaXJlY3Rpb25hbExpZ2h0SGVscGVyLmpzJztcclxuZXhwb3J0IHsgQ2FtZXJhSGVscGVyIH0gZnJvbSAnLi9oZWxwZXJzL0NhbWVyYUhlbHBlci5qcyc7XHJcbmV4cG9ydCB7IEJveEhlbHBlciB9IGZyb20gJy4vaGVscGVycy9Cb3hIZWxwZXIuanMnO1xyXG5leHBvcnQgeyBCb3gzSGVscGVyIH0gZnJvbSAnLi9oZWxwZXJzL0JveDNIZWxwZXIuanMnO1xyXG5leHBvcnQgeyBQbGFuZUhlbHBlciB9IGZyb20gJy4vaGVscGVycy9QbGFuZUhlbHBlci5qcyc7XHJcbmV4cG9ydCB7IEFycm93SGVscGVyIH0gZnJvbSAnLi9oZWxwZXJzL0Fycm93SGVscGVyLmpzJztcclxuZXhwb3J0IHsgQXhlc0hlbHBlciB9IGZyb20gJy4vaGVscGVycy9BeGVzSGVscGVyLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi9leHRyYXMvY3VydmVzL0N1cnZlcy5qcyc7XHJcbmV4cG9ydCB7IFNoYXBlIH0gZnJvbSAnLi9leHRyYXMvY29yZS9TaGFwZS5qcyc7XHJcbmV4cG9ydCB7IFBhdGggfSBmcm9tICcuL2V4dHJhcy9jb3JlL1BhdGguanMnO1xyXG5leHBvcnQgeyBTaGFwZVBhdGggfSBmcm9tICcuL2V4dHJhcy9jb3JlL1NoYXBlUGF0aC5qcyc7XHJcbmV4cG9ydCB7IEN1cnZlUGF0aCB9IGZyb20gJy4vZXh0cmFzL2NvcmUvQ3VydmVQYXRoLmpzJztcclxuZXhwb3J0IHsgQ3VydmUgfSBmcm9tICcuL2V4dHJhcy9jb3JlL0N1cnZlLmpzJztcclxuZXhwb3J0IHsgQ29udHJvbHMgfSBmcm9tICcuL2V4dHJhcy9Db250cm9scy5qcyc7XHJcbmV4cG9ydCB7IERhdGFVdGlscyB9IGZyb20gJy4vZXh0cmFzL0RhdGFVdGlscy5qcyc7XHJcbmV4cG9ydCB7IEltYWdlVXRpbHMgfSBmcm9tICcuL2V4dHJhcy9JbWFnZVV0aWxzLmpzJztcclxuZXhwb3J0IHsgU2hhcGVVdGlscyB9IGZyb20gJy4vZXh0cmFzL1NoYXBlVXRpbHMuanMnO1xyXG5leHBvcnQgeyBUZXh0dXJlVXRpbHMgfSBmcm9tICcuL2V4dHJhcy9UZXh0dXJlVXRpbHMuanMnO1xyXG5leHBvcnQgeyBjcmVhdGVDYW52YXNFbGVtZW50IH0gZnJvbSAnLi91dGlscy5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vY29uc3RhbnRzLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi9UaHJlZS5MZWdhY3kuanMnO1xyXG5cclxuaWYgKCB0eXBlb2YgX19USFJFRV9ERVZUT09MU19fICE9PSAndW5kZWZpbmVkJyApIHtcclxuXHJcblx0X19USFJFRV9ERVZUT09MU19fLmRpc3BhdGNoRXZlbnQoIG5ldyBDdXN0b21FdmVudCggJ3JlZ2lzdGVyJywgeyBkZXRhaWw6IHtcclxuXHRcdHJldmlzaW9uOiBSRVZJU0lPTixcclxuXHR9IH0gKSApO1xyXG5cclxufVxyXG5cclxuaWYgKCB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyApIHtcclxuXHJcblx0aWYgKCB3aW5kb3cuX19USFJFRV9fICkge1xyXG5cclxuXHRcdGNvbnNvbGUud2FybiggJ1dBUk5JTkc6IE11bHRpcGxlIGluc3RhbmNlcyBvZiBUaHJlZS5qcyBiZWluZyBpbXBvcnRlZC4nICk7XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0d2luZG93Ll9fVEhSRUVfXyA9IFJFVklTSU9OO1xyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImZ1bmN0aW9uIFdlYkdMQW5pbWF0aW9uKCkge1xyXG5cclxuXHRsZXQgY29udGV4dCA9IG51bGw7XHJcblx0bGV0IGlzQW5pbWF0aW5nID0gZmFsc2U7XHJcblx0bGV0IGFuaW1hdGlvbkxvb3AgPSBudWxsO1xyXG5cdGxldCByZXF1ZXN0SWQgPSBudWxsO1xyXG5cclxuXHRmdW5jdGlvbiBvbkFuaW1hdGlvbkZyYW1lKCB0aW1lLCBmcmFtZSApIHtcclxuXHJcblx0XHRhbmltYXRpb25Mb29wKCB0aW1lLCBmcmFtZSApO1xyXG5cclxuXHRcdHJlcXVlc3RJZCA9IGNvbnRleHQucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCBvbkFuaW1hdGlvbkZyYW1lICk7XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIHtcclxuXHJcblx0XHRzdGFydDogZnVuY3Rpb24gKCkge1xyXG5cclxuXHRcdFx0aWYgKCBpc0FuaW1hdGluZyA9PT0gdHJ1ZSApIHJldHVybjtcclxuXHRcdFx0aWYgKCBhbmltYXRpb25Mb29wID09PSBudWxsICkgcmV0dXJuO1xyXG5cclxuXHRcdFx0cmVxdWVzdElkID0gY29udGV4dC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIG9uQW5pbWF0aW9uRnJhbWUgKTtcclxuXHJcblx0XHRcdGlzQW5pbWF0aW5nID0gdHJ1ZTtcclxuXHJcblx0XHR9LFxyXG5cclxuXHRcdHN0b3A6IGZ1bmN0aW9uICgpIHtcclxuXHJcblx0XHRcdGNvbnRleHQuY2FuY2VsQW5pbWF0aW9uRnJhbWUoIHJlcXVlc3RJZCApO1xyXG5cclxuXHRcdFx0aXNBbmltYXRpbmcgPSBmYWxzZTtcclxuXHJcblx0XHR9LFxyXG5cclxuXHRcdHNldEFuaW1hdGlvbkxvb3A6IGZ1bmN0aW9uICggY2FsbGJhY2sgKSB7XHJcblxyXG5cdFx0XHRhbmltYXRpb25Mb29wID0gY2FsbGJhY2s7XHJcblxyXG5cdFx0fSxcclxuXHJcblx0XHRzZXRDb250ZXh0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xyXG5cclxuXHRcdFx0Y29udGV4dCA9IHZhbHVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fTtcclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFdlYkdMQW5pbWF0aW9uIH07XHJcbiIsImZ1bmN0aW9uIFdlYkdMQXR0cmlidXRlcyggZ2wgKSB7XHJcblxyXG5cdGNvbnN0IGJ1ZmZlcnMgPSBuZXcgV2Vha01hcCgpO1xyXG5cclxuXHRmdW5jdGlvbiBjcmVhdGVCdWZmZXIoIGF0dHJpYnV0ZSwgYnVmZmVyVHlwZSApIHtcclxuXHJcblx0XHRjb25zdCBhcnJheSA9IGF0dHJpYnV0ZS5hcnJheTtcclxuXHRcdGNvbnN0IHVzYWdlID0gYXR0cmlidXRlLnVzYWdlO1xyXG5cdFx0Y29uc3Qgc2l6ZSA9IGFycmF5LmJ5dGVMZW5ndGg7XHJcblxyXG5cdFx0Y29uc3QgYnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XHJcblxyXG5cdFx0Z2wuYmluZEJ1ZmZlciggYnVmZmVyVHlwZSwgYnVmZmVyICk7XHJcblx0XHRnbC5idWZmZXJEYXRhKCBidWZmZXJUeXBlLCBhcnJheSwgdXNhZ2UgKTtcclxuXHJcblx0XHRhdHRyaWJ1dGUub25VcGxvYWRDYWxsYmFjaygpO1xyXG5cclxuXHRcdGxldCB0eXBlO1xyXG5cclxuXHRcdGlmICggYXJyYXkgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkgKSB7XHJcblxyXG5cdFx0XHR0eXBlID0gZ2wuRkxPQVQ7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBVaW50MTZBcnJheSApIHtcclxuXHJcblx0XHRcdGlmICggYXR0cmlidXRlLmlzRmxvYXQxNkJ1ZmZlckF0dHJpYnV0ZSApIHtcclxuXHJcblx0XHRcdFx0dHlwZSA9IGdsLkhBTEZfRkxPQVQ7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHR0eXBlID0gZ2wuVU5TSUdORURfU0hPUlQ7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBJbnQxNkFycmF5ICkge1xyXG5cclxuXHRcdFx0dHlwZSA9IGdsLlNIT1JUO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGFycmF5IGluc3RhbmNlb2YgVWludDMyQXJyYXkgKSB7XHJcblxyXG5cdFx0XHR0eXBlID0gZ2wuVU5TSUdORURfSU5UO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGFycmF5IGluc3RhbmNlb2YgSW50MzJBcnJheSApIHtcclxuXHJcblx0XHRcdHR5cGUgPSBnbC5JTlQ7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBJbnQ4QXJyYXkgKSB7XHJcblxyXG5cdFx0XHR0eXBlID0gZ2wuQllURTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgKSB7XHJcblxyXG5cdFx0XHR0eXBlID0gZ2wuVU5TSUdORURfQllURTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5ICkge1xyXG5cclxuXHRcdFx0dHlwZSA9IGdsLlVOU0lHTkVEX0JZVEU7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHRocm93IG5ldyBFcnJvciggJ1RIUkVFLldlYkdMQXR0cmlidXRlczogVW5zdXBwb3J0ZWQgYnVmZmVyIGRhdGEgZm9ybWF0OiAnICsgYXJyYXkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHtcclxuXHRcdFx0YnVmZmVyOiBidWZmZXIsXHJcblx0XHRcdHR5cGU6IHR5cGUsXHJcblx0XHRcdGJ5dGVzUGVyRWxlbWVudDogYXJyYXkuQllURVNfUEVSX0VMRU1FTlQsXHJcblx0XHRcdHZlcnNpb246IGF0dHJpYnV0ZS52ZXJzaW9uLFxyXG5cdFx0XHRzaXplOiBzaXplXHJcblx0XHR9O1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHVwZGF0ZUJ1ZmZlciggYnVmZmVyLCBhdHRyaWJ1dGUsIGJ1ZmZlclR5cGUgKSB7XHJcblxyXG5cdFx0Y29uc3QgYXJyYXkgPSBhdHRyaWJ1dGUuYXJyYXk7XHJcblx0XHRjb25zdCB1cGRhdGVSYW5nZXMgPSBhdHRyaWJ1dGUudXBkYXRlUmFuZ2VzO1xyXG5cclxuXHRcdGdsLmJpbmRCdWZmZXIoIGJ1ZmZlclR5cGUsIGJ1ZmZlciApO1xyXG5cclxuXHRcdGlmICggdXBkYXRlUmFuZ2VzLmxlbmd0aCA9PT0gMCApIHtcclxuXHJcblx0XHRcdC8vIE5vdCB1c2luZyB1cGRhdGUgcmFuZ2VzXHJcblx0XHRcdGdsLmJ1ZmZlclN1YkRhdGEoIGJ1ZmZlclR5cGUsIDAsIGFycmF5ICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdC8vIEJlZm9yZSBhcHBseWluZyB1cGRhdGUgcmFuZ2VzLCB3ZSBtZXJnZSBhbnkgYWRqYWNlbnQgLyBvdmVybGFwcGluZ1xyXG5cdFx0XHQvLyByYW5nZXMgdG8gcmVkdWNlIGxvYWQgb24gYGdsLmJ1ZmZlclN1YkRhdGFgLiBFbXBpcmljYWxseSwgdGhpcyBoYXMgbGVkXHJcblx0XHRcdC8vIHRvIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyBmb3IgYXBwbGljYXRpb25zIHdoaWNoIG1ha2UgaGVhdnkgdXNlIG9mXHJcblx0XHRcdC8vIHVwZGF0ZSByYW5nZXMuIExpa2VseSBkdWUgdG8gR1BVIGNvbW1hbmQgb3ZlcmhlYWQuXHJcblx0XHRcdC8vXHJcblx0XHRcdC8vIE5vdGUgdGhhdCB0byByZWR1Y2UgZ2FyYmFnZSBjb2xsZWN0aW9uIGJldHdlZW4gZnJhbWVzLCB3ZSBtZXJnZSB0aGVcclxuXHRcdFx0Ly8gdXBkYXRlIHJhbmdlcyBpbi1wbGFjZS4gVGhpcyBpcyBzYWZlIGJlY2F1c2UgdGhpcyBtZXRob2Qgd2lsbCBjbGVhciB0aGVcclxuXHRcdFx0Ly8gdXBkYXRlIHJhbmdlcyBvbmNlIHVwZGF0ZWQuXHJcblxyXG5cdFx0XHR1cGRhdGVSYW5nZXMuc29ydCggKCBhLCBiICkgPT4gYS5zdGFydCAtIGIuc3RhcnQgKTtcclxuXHJcblx0XHRcdC8vIFRvIG1lcmdlIHRoZSB1cGRhdGUgcmFuZ2VzIGluLXBsYWNlLCB3ZSB3b3JrIGZyb20gbGVmdCB0byByaWdodCBpbiB0aGVcclxuXHRcdFx0Ly8gZXhpc3RpbmcgdXBkYXRlUmFuZ2VzIGFycmF5LCBtZXJnaW5nIHJhbmdlcy4gVGhpcyBtYXkgcmVzdWx0IGluIGEgZmluYWxcclxuXHRcdFx0Ly8gYXJyYXkgd2hpY2ggaXMgc21hbGxlciB0aGFuIHRoZSBvcmlnaW5hbC4gVGhpcyBpbmRleCB0cmFja3MgdGhlIGxhc3RcclxuXHRcdFx0Ly8gaW5kZXggcmVwcmVzZW50aW5nIGEgbWVyZ2VkIHJhbmdlLCBhbnkgZGF0YSBhZnRlciB0aGlzIGluZGV4IGNhbiBiZVxyXG5cdFx0XHQvLyB0cmltbWVkIG9uY2UgdGhlIG1lcmdlIGFsZ29yaXRobSBpcyBjb21wbGV0ZWQuXHJcblx0XHRcdGxldCBtZXJnZUluZGV4ID0gMDtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMTsgaSA8IHVwZGF0ZVJhbmdlcy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHByZXZpb3VzUmFuZ2UgPSB1cGRhdGVSYW5nZXNbIG1lcmdlSW5kZXggXTtcclxuXHRcdFx0XHRjb25zdCByYW5nZSA9IHVwZGF0ZVJhbmdlc1sgaSBdO1xyXG5cclxuXHRcdFx0XHQvLyBXZSBhZGQgb25lIGhlcmUgdG8gbWVyZ2UgYWRqYWNlbnQgcmFuZ2VzLiBUaGlzIGlzIHNhZmUgYmVjYXVzZSByYW5nZXNcclxuXHRcdFx0XHQvLyBvcGVyYXRlIG92ZXIgcG9zaXRpdmUgaW50ZWdlcnMuXHJcblx0XHRcdFx0aWYgKCByYW5nZS5zdGFydCA8PSBwcmV2aW91c1JhbmdlLnN0YXJ0ICsgcHJldmlvdXNSYW5nZS5jb3VudCArIDEgKSB7XHJcblxyXG5cdFx0XHRcdFx0cHJldmlvdXNSYW5nZS5jb3VudCA9IE1hdGgubWF4KFxyXG5cdFx0XHRcdFx0XHRwcmV2aW91c1JhbmdlLmNvdW50LFxyXG5cdFx0XHRcdFx0XHRyYW5nZS5zdGFydCArIHJhbmdlLmNvdW50IC0gcHJldmlvdXNSYW5nZS5zdGFydFxyXG5cdFx0XHRcdFx0KTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHQrKyBtZXJnZUluZGV4O1xyXG5cdFx0XHRcdFx0dXBkYXRlUmFuZ2VzWyBtZXJnZUluZGV4IF0gPSByYW5nZTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gVHJpbSB0aGUgYXJyYXkgdG8gb25seSBjb250YWluIHRoZSBtZXJnZWQgcmFuZ2VzLlxyXG5cdFx0XHR1cGRhdGVSYW5nZXMubGVuZ3RoID0gbWVyZ2VJbmRleCArIDE7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSB1cGRhdGVSYW5nZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgcmFuZ2UgPSB1cGRhdGVSYW5nZXNbIGkgXTtcclxuXHJcblx0XHRcdFx0Z2wuYnVmZmVyU3ViRGF0YSggYnVmZmVyVHlwZSwgcmFuZ2Uuc3RhcnQgKiBhcnJheS5CWVRFU19QRVJfRUxFTUVOVCxcclxuXHRcdFx0XHRcdGFycmF5LCByYW5nZS5zdGFydCwgcmFuZ2UuY291bnQgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGF0dHJpYnV0ZS5jbGVhclVwZGF0ZVJhbmdlcygpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRhdHRyaWJ1dGUub25VcGxvYWRDYWxsYmFjaygpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vXHJcblxyXG5cdGZ1bmN0aW9uIGdldCggYXR0cmlidXRlICkge1xyXG5cclxuXHRcdGlmICggYXR0cmlidXRlLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgKSBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGUuZGF0YTtcclxuXHJcblx0XHRyZXR1cm4gYnVmZmVycy5nZXQoIGF0dHJpYnV0ZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHJlbW92ZSggYXR0cmlidXRlICkge1xyXG5cclxuXHRcdGlmICggYXR0cmlidXRlLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgKSBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGUuZGF0YTtcclxuXHJcblx0XHRjb25zdCBkYXRhID0gYnVmZmVycy5nZXQoIGF0dHJpYnV0ZSApO1xyXG5cclxuXHRcdGlmICggZGF0YSApIHtcclxuXHJcblx0XHRcdGdsLmRlbGV0ZUJ1ZmZlciggZGF0YS5idWZmZXIgKTtcclxuXHJcblx0XHRcdGJ1ZmZlcnMuZGVsZXRlKCBhdHRyaWJ1dGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gdXBkYXRlKCBhdHRyaWJ1dGUsIGJ1ZmZlclR5cGUgKSB7XHJcblxyXG5cdFx0aWYgKCBhdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZS5kYXRhO1xyXG5cclxuXHRcdGlmICggYXR0cmlidXRlLmlzR0xCdWZmZXJBdHRyaWJ1dGUgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBjYWNoZWQgPSBidWZmZXJzLmdldCggYXR0cmlidXRlICk7XHJcblxyXG5cdFx0XHRpZiAoICEgY2FjaGVkIHx8IGNhY2hlZC52ZXJzaW9uIDwgYXR0cmlidXRlLnZlcnNpb24gKSB7XHJcblxyXG5cdFx0XHRcdGJ1ZmZlcnMuc2V0KCBhdHRyaWJ1dGUsIHtcclxuXHRcdFx0XHRcdGJ1ZmZlcjogYXR0cmlidXRlLmJ1ZmZlcixcclxuXHRcdFx0XHRcdHR5cGU6IGF0dHJpYnV0ZS50eXBlLFxyXG5cdFx0XHRcdFx0Ynl0ZXNQZXJFbGVtZW50OiBhdHRyaWJ1dGUuZWxlbWVudFNpemUsXHJcblx0XHRcdFx0XHR2ZXJzaW9uOiBhdHRyaWJ1dGUudmVyc2lvblxyXG5cdFx0XHRcdH0gKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IGJ1ZmZlcnMuZ2V0KCBhdHRyaWJ1dGUgKTtcclxuXHJcblx0XHRpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGJ1ZmZlcnMuc2V0KCBhdHRyaWJ1dGUsIGNyZWF0ZUJ1ZmZlciggYXR0cmlidXRlLCBidWZmZXJUeXBlICkgKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBkYXRhLnZlcnNpb24gPCBhdHRyaWJ1dGUudmVyc2lvbiApIHtcclxuXHJcblx0XHRcdGlmICggZGF0YS5zaXplICE9PSBhdHRyaWJ1dGUuYXJyYXkuYnl0ZUxlbmd0aCApIHtcclxuXHJcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuV2ViR0xBdHRyaWJ1dGVzOiBUaGUgc2l6ZSBvZiB0aGUgYnVmZmVyIGF0dHJpYnV0ZVxcJ3MgYXJyYXkgYnVmZmVyIGRvZXMgbm90IG1hdGNoIHRoZSBvcmlnaW5hbCBzaXplLiBSZXNpemluZyBidWZmZXIgYXR0cmlidXRlcyBpcyBub3Qgc3VwcG9ydGVkLicgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHVwZGF0ZUJ1ZmZlciggZGF0YS5idWZmZXIsIGF0dHJpYnV0ZSwgYnVmZmVyVHlwZSApO1xyXG5cclxuXHRcdFx0ZGF0YS52ZXJzaW9uID0gYXR0cmlidXRlLnZlcnNpb247XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiB7XHJcblxyXG5cdFx0Z2V0OiBnZXQsXHJcblx0XHRyZW1vdmU6IHJlbW92ZSxcclxuXHRcdHVwZGF0ZTogdXBkYXRlXHJcblxyXG5cdH07XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgV2ViR0xBdHRyaWJ1dGVzIH07XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbiNpZmRlZiBVU0VfQUxQSEFIQVNIXHJcblxyXG5cdGlmICggZGlmZnVzZUNvbG9yLmEgPCBnZXRBbHBoYUhhc2hUaHJlc2hvbGQoIHZQb3NpdGlvbiApICkgZGlzY2FyZDtcclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jaWZkZWYgVVNFX0FMUEhBSEFTSFxyXG5cclxuXHQvKipcclxuXHQgKiBTZWU6IGh0dHBzOi8vY2FzdWFsLWVmZmVjdHMuY29tL3Jlc2VhcmNoL1d5bWFuMjAxN0hhc2hlZC9pbmRleC5odG1sXHJcblx0ICovXHJcblxyXG5cdGNvbnN0IGZsb2F0IEFMUEhBX0hBU0hfU0NBTEUgPSAwLjA1OyAvLyBEZXJpdmVkIGZyb20gdHJpYWxzIG9ubHksIGFuZCBtYXkgYmUgY2hhbmdlZC5cclxuXHJcblx0ZmxvYXQgaGFzaDJEKCB2ZWMyIHZhbHVlICkge1xyXG5cclxuXHRcdHJldHVybiBmcmFjdCggMS4wZTQgKiBzaW4oIDE3LjAgKiB2YWx1ZS54ICsgMC4xICogdmFsdWUueSApICogKCAwLjEgKyBhYnMoIHNpbiggMTMuMCAqIHZhbHVlLnkgKyB2YWx1ZS54ICkgKSApICk7XHJcblxyXG5cdH1cclxuXHJcblx0ZmxvYXQgaGFzaDNEKCB2ZWMzIHZhbHVlICkge1xyXG5cclxuXHRcdHJldHVybiBoYXNoMkQoIHZlYzIoIGhhc2gyRCggdmFsdWUueHkgKSwgdmFsdWUueiApICk7XHJcblxyXG5cdH1cclxuXHJcblx0ZmxvYXQgZ2V0QWxwaGFIYXNoVGhyZXNob2xkKCB2ZWMzIHBvc2l0aW9uICkge1xyXG5cclxuXHRcdC8vIEZpbmQgdGhlIGRpc2NyZXRpemVkIGRlcml2YXRpdmVzIG9mIG91ciBjb29yZGluYXRlc1xyXG5cdFx0ZmxvYXQgbWF4RGVyaXYgPSBtYXgoXHJcblx0XHRcdGxlbmd0aCggZEZkeCggcG9zaXRpb24ueHl6ICkgKSxcclxuXHRcdFx0bGVuZ3RoKCBkRmR5KCBwb3NpdGlvbi54eXogKSApXHJcblx0XHQpO1xyXG5cdFx0ZmxvYXQgcGl4U2NhbGUgPSAxLjAgLyAoIEFMUEhBX0hBU0hfU0NBTEUgKiBtYXhEZXJpdiApO1xyXG5cclxuXHRcdC8vIEZpbmQgdHdvIG5lYXJlc3QgbG9nLWRpc2NyZXRpemVkIG5vaXNlIHNjYWxlc1xyXG5cdFx0dmVjMiBwaXhTY2FsZXMgPSB2ZWMyKFxyXG5cdFx0XHRleHAyKCBmbG9vciggbG9nMiggcGl4U2NhbGUgKSApICksXHJcblx0XHRcdGV4cDIoIGNlaWwoIGxvZzIoIHBpeFNjYWxlICkgKSApXHJcblx0XHQpO1xyXG5cclxuXHRcdC8vIENvbXB1dGUgYWxwaGEgdGhyZXNob2xkcyBhdCBvdXIgdHdvIG5vaXNlIHNjYWxlc1xyXG5cdFx0dmVjMiBhbHBoYSA9IHZlYzIoXHJcblx0XHRcdGhhc2gzRCggZmxvb3IoIHBpeFNjYWxlcy54ICogcG9zaXRpb24ueHl6ICkgKSxcclxuXHRcdFx0aGFzaDNEKCBmbG9vciggcGl4U2NhbGVzLnkgKiBwb3NpdGlvbi54eXogKSApXHJcblx0XHQpO1xyXG5cclxuXHRcdC8vIEZhY3RvciB0byBpbnRlcnBvbGF0ZSBsZXJwIHdpdGhcclxuXHRcdGZsb2F0IGxlcnBGYWN0b3IgPSBmcmFjdCggbG9nMiggcGl4U2NhbGUgKSApO1xyXG5cclxuXHRcdC8vIEludGVycG9sYXRlIGFscGhhIHRocmVzaG9sZCBmcm9tIG5vaXNlIGF0IHR3byBzY2FsZXNcclxuXHRcdGZsb2F0IHggPSAoIDEuMCAtIGxlcnBGYWN0b3IgKSAqIGFscGhhLnggKyBsZXJwRmFjdG9yICogYWxwaGEueTtcclxuXHJcblx0XHQvLyBQYXNzIGludG8gQ0RGIHRvIGNvbXB1dGUgdW5pZm9ybWx5IGRpc3RyaWIgdGhyZXNob2xkXHJcblx0XHRmbG9hdCBhID0gbWluKCBsZXJwRmFjdG9yLCAxLjAgLSBsZXJwRmFjdG9yICk7XHJcblx0XHR2ZWMzIGNhc2VzID0gdmVjMyhcclxuXHRcdFx0eCAqIHggLyAoIDIuMCAqIGEgKiAoIDEuMCAtIGEgKSApLFxyXG5cdFx0XHQoIHggLSAwLjUgKiBhICkgLyAoIDEuMCAtIGEgKSxcclxuXHRcdFx0MS4wIC0gKCAoIDEuMCAtIHggKSAqICggMS4wIC0geCApIC8gKCAyLjAgKiBhICogKCAxLjAgLSBhICkgKSApXHJcblx0XHQpO1xyXG5cclxuXHRcdC8vIEZpbmQgb3VyIGZpbmFsLCB1bmlmb3JtbHkgZGlzdHJpYnV0ZWQgYWxwaGEgdGhyZXNob2xkICjOsc+EKVxyXG5cdFx0ZmxvYXQgdGhyZXNob2xkID0gKCB4IDwgKCAxLjAgLSBhICkgKVxyXG5cdFx0XHQ/ICggKCB4IDwgYSApID8gY2FzZXMueCA6IGNhc2VzLnkgKVxyXG5cdFx0XHQ6IGNhc2VzLno7XHJcblxyXG5cdFx0Ly8gQXZvaWRzIM6xz4QgPT0gMC4gQ291bGQgYWxzbyBkbyDOsc+EID0xLc6xz4RcclxuXHRcdHJldHVybiBjbGFtcCggdGhyZXNob2xkICwgMS4wZS02LCAxLjAgKTtcclxuXHJcblx0fVxyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbiNpZmRlZiBVU0VfQUxQSEFNQVBcclxuXHJcblx0ZGlmZnVzZUNvbG9yLmEgKj0gdGV4dHVyZTJEKCBhbHBoYU1hcCwgdkFscGhhTWFwVXYgKS5nO1xyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbiNpZmRlZiBVU0VfQUxQSEFNQVBcclxuXHJcblx0dW5pZm9ybSBzYW1wbGVyMkQgYWxwaGFNYXA7XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmZGVmIFVTRV9BTFBIQVRFU1RcclxuXHJcblx0I2lmZGVmIEFMUEhBX1RPX0NPVkVSQUdFXHJcblxyXG5cdGRpZmZ1c2VDb2xvci5hID0gc21vb3Roc3RlcCggYWxwaGFUZXN0LCBhbHBoYVRlc3QgKyBmd2lkdGgoIGRpZmZ1c2VDb2xvci5hICksIGRpZmZ1c2VDb2xvci5hICk7XHJcblx0aWYgKCBkaWZmdXNlQ29sb3IuYSA9PSAwLjAgKSBkaXNjYXJkO1xyXG5cclxuXHQjZWxzZVxyXG5cclxuXHRpZiAoIGRpZmZ1c2VDb2xvci5hIDwgYWxwaGFUZXN0ICkgZGlzY2FyZDtcclxuXHJcblx0I2VuZGlmXHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmZGVmIFVTRV9BTFBIQVRFU1RcclxuXHR1bmlmb3JtIGZsb2F0IGFscGhhVGVzdDtcclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbiNpZmRlZiBVU0VfQU9NQVBcclxuXHJcblx0Ly8gcmVhZHMgY2hhbm5lbCBSLCBjb21wYXRpYmxlIHdpdGggYSBjb21iaW5lZCBPY2NsdXNpb25Sb3VnaG5lc3NNZXRhbGxpYyAoUkdCKSB0ZXh0dXJlXHJcblx0ZmxvYXQgYW1iaWVudE9jY2x1c2lvbiA9ICggdGV4dHVyZTJEKCBhb01hcCwgdkFvTWFwVXYgKS5yIC0gMS4wICkgKiBhb01hcEludGVuc2l0eSArIDEuMDtcclxuXHJcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICo9IGFtYmllbnRPY2NsdXNpb247XHJcblxyXG5cdCNpZiBkZWZpbmVkKCBVU0VfQ0xFQVJDT0FUICkgXHJcblx0XHRjbGVhcmNvYXRTcGVjdWxhckluZGlyZWN0ICo9IGFtYmllbnRPY2NsdXNpb247XHJcblx0I2VuZGlmXHJcblxyXG5cdCNpZiBkZWZpbmVkKCBVU0VfU0hFRU4gKSBcclxuXHRcdHNoZWVuU3BlY3VsYXJJbmRpcmVjdCAqPSBhbWJpZW50T2NjbHVzaW9uO1xyXG5cdCNlbmRpZlxyXG5cclxuXHQjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApICYmIGRlZmluZWQoIFNUQU5EQVJEIClcclxuXHJcblx0XHRmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Tm9ybWFsLCBnZW9tZXRyeVZpZXdEaXIgKSApO1xyXG5cclxuXHRcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKj0gY29tcHV0ZVNwZWN1bGFyT2NjbHVzaW9uKCBkb3ROViwgYW1iaWVudE9jY2x1c2lvbiwgbWF0ZXJpYWwucm91Z2huZXNzICk7XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbiNpZmRlZiBVU0VfQU9NQVBcclxuXHJcblx0dW5pZm9ybSBzYW1wbGVyMkQgYW9NYXA7XHJcblx0dW5pZm9ybSBmbG9hdCBhb01hcEludGVuc2l0eTtcclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jaWZkZWYgVVNFX0JBVENISU5HXHJcblx0I2lmICEgZGVmaW5lZCggR0xfQU5HTEVfbXVsdGlfZHJhdyApXHJcblx0I2RlZmluZSBnbF9EcmF3SUQgX2dsX0RyYXdJRFxyXG5cdHVuaWZvcm0gaW50IF9nbF9EcmF3SUQ7XHJcblx0I2VuZGlmXHJcblxyXG5cdHVuaWZvcm0gaGlnaHAgc2FtcGxlcjJEIGJhdGNoaW5nVGV4dHVyZTtcclxuXHR1bmlmb3JtIGhpZ2hwIHVzYW1wbGVyMkQgYmF0Y2hpbmdJZFRleHR1cmU7XHJcblx0bWF0NCBnZXRCYXRjaGluZ01hdHJpeCggY29uc3QgaW4gZmxvYXQgaSApIHtcclxuXHJcblx0XHRpbnQgc2l6ZSA9IHRleHR1cmVTaXplKCBiYXRjaGluZ1RleHR1cmUsIDAgKS54O1xyXG5cdFx0aW50IGogPSBpbnQoIGkgKSAqIDQ7XHJcblx0XHRpbnQgeCA9IGogJSBzaXplO1xyXG5cdFx0aW50IHkgPSBqIC8gc2l6ZTtcclxuXHRcdHZlYzQgdjEgPSB0ZXhlbEZldGNoKCBiYXRjaGluZ1RleHR1cmUsIGl2ZWMyKCB4LCB5ICksIDAgKTtcclxuXHRcdHZlYzQgdjIgPSB0ZXhlbEZldGNoKCBiYXRjaGluZ1RleHR1cmUsIGl2ZWMyKCB4ICsgMSwgeSApLCAwICk7XHJcblx0XHR2ZWM0IHYzID0gdGV4ZWxGZXRjaCggYmF0Y2hpbmdUZXh0dXJlLCBpdmVjMiggeCArIDIsIHkgKSwgMCApO1xyXG5cdFx0dmVjNCB2NCA9IHRleGVsRmV0Y2goIGJhdGNoaW5nVGV4dHVyZSwgaXZlYzIoIHggKyAzLCB5ICksIDAgKTtcclxuXHRcdHJldHVybiBtYXQ0KCB2MSwgdjIsIHYzLCB2NCApO1xyXG5cclxuXHR9XHJcblxyXG5cdGZsb2F0IGdldEluZGlyZWN0SW5kZXgoIGNvbnN0IGluIGludCBpICkge1xyXG5cclxuXHRcdGludCBzaXplID0gdGV4dHVyZVNpemUoIGJhdGNoaW5nSWRUZXh0dXJlLCAwICkueDtcclxuXHRcdGludCB4ID0gaSAlIHNpemU7XHJcblx0XHRpbnQgeSA9IGkgLyBzaXplO1xyXG5cdFx0cmV0dXJuIGZsb2F0KCB0ZXhlbEZldGNoKCBiYXRjaGluZ0lkVGV4dHVyZSwgaXZlYzIoIHgsIHkgKSwgMCApLnIgKTtcclxuXHJcblx0fVxyXG5cclxuI2VuZGlmXHJcblxyXG4jaWZkZWYgVVNFX0JBVENISU5HX0NPTE9SXHJcblxyXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGJhdGNoaW5nQ29sb3JUZXh0dXJlO1xyXG5cdHZlYzMgZ2V0QmF0Y2hpbmdDb2xvciggY29uc3QgaW4gZmxvYXQgaSApIHtcclxuXHJcblx0XHRpbnQgc2l6ZSA9IHRleHR1cmVTaXplKCBiYXRjaGluZ0NvbG9yVGV4dHVyZSwgMCApLng7XHJcblx0XHRpbnQgaiA9IGludCggaSApO1xyXG5cdFx0aW50IHggPSBqICUgc2l6ZTtcclxuXHRcdGludCB5ID0gaiAvIHNpemU7XHJcblx0XHRyZXR1cm4gdGV4ZWxGZXRjaCggYmF0Y2hpbmdDb2xvclRleHR1cmUsIGl2ZWMyKCB4LCB5ICksIDAgKS5yZ2I7XHJcblxyXG5cdH1cclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jaWZkZWYgVVNFX0JBVENISU5HXHJcblx0bWF0NCBiYXRjaGluZ01hdHJpeCA9IGdldEJhdGNoaW5nTWF0cml4KCBnZXRJbmRpcmVjdEluZGV4KCBnbF9EcmF3SUQgKSApO1xyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxudmVjMyB0cmFuc2Zvcm1lZCA9IHZlYzMoIHBvc2l0aW9uICk7XHJcblxyXG4jaWZkZWYgVVNFX0FMUEhBSEFTSFxyXG5cclxuXHR2UG9zaXRpb24gPSB2ZWMzKCBwb3NpdGlvbiApO1xyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbnZlYzMgb2JqZWN0Tm9ybWFsID0gdmVjMyggbm9ybWFsICk7XHJcblxyXG4jaWZkZWYgVVNFX1RBTkdFTlRcclxuXHJcblx0dmVjMyBvYmplY3RUYW5nZW50ID0gdmVjMyggdGFuZ2VudC54eXogKTtcclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG5cclxuZmxvYXQgR19CbGlublBob25nX0ltcGxpY2l0KCAvKiBjb25zdCBpbiBmbG9hdCBkb3ROTCwgY29uc3QgaW4gZmxvYXQgZG90TlYgKi8gKSB7XHJcblxyXG5cdC8vIGdlb21ldHJ5IHRlcm0gaXMgKG4gZG90IGwpKG4gZG90IHYpIC8gNChuIGRvdCBsKShuIGRvdCB2KVxyXG5cdHJldHVybiAwLjI1O1xyXG5cclxufVxyXG5cclxuZmxvYXQgRF9CbGlublBob25nKCBjb25zdCBpbiBmbG9hdCBzaGluaW5lc3MsIGNvbnN0IGluIGZsb2F0IGRvdE5IICkge1xyXG5cclxuXHRyZXR1cm4gUkVDSVBST0NBTF9QSSAqICggc2hpbmluZXNzICogMC41ICsgMS4wICkgKiBwb3coIGRvdE5ILCBzaGluaW5lc3MgKTtcclxuXHJcbn1cclxuXHJcbnZlYzMgQlJERl9CbGlublBob25nKCBjb25zdCBpbiB2ZWMzIGxpZ2h0RGlyLCBjb25zdCBpbiB2ZWMzIHZpZXdEaXIsIGNvbnN0IGluIHZlYzMgbm9ybWFsLCBjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IHNoaW5pbmVzcyApIHtcclxuXHJcblx0dmVjMyBoYWxmRGlyID0gbm9ybWFsaXplKCBsaWdodERpciArIHZpZXdEaXIgKTtcclxuXHJcblx0ZmxvYXQgZG90TkggPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIGhhbGZEaXIgKSApO1xyXG5cdGZsb2F0IGRvdFZIID0gc2F0dXJhdGUoIGRvdCggdmlld0RpciwgaGFsZkRpciApICk7XHJcblxyXG5cdHZlYzMgRiA9IEZfU2NobGljayggc3BlY3VsYXJDb2xvciwgMS4wLCBkb3RWSCApO1xyXG5cclxuXHRmbG9hdCBHID0gR19CbGlublBob25nX0ltcGxpY2l0KCAvKiBkb3ROTCwgZG90TlYgKi8gKTtcclxuXHJcblx0ZmxvYXQgRCA9IERfQmxpbm5QaG9uZyggc2hpbmluZXNzLCBkb3ROSCApO1xyXG5cclxuXHRyZXR1cm4gRiAqICggRyAqIEQgKTtcclxuXHJcbn0gLy8gdmFsaWRhdGVkXHJcblxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG5cclxuI2lmZGVmIFVTRV9JUklERVNDRU5DRVxyXG5cclxuXHQvLyBYWVogdG8gbGluZWFyLXNSR0IgY29sb3Igc3BhY2VcclxuXHRjb25zdCBtYXQzIFhZWl9UT19SRUM3MDkgPSBtYXQzKFxyXG5cdFx0IDMuMjQwNDU0MiwgLTAuOTY5MjY2MCwgIDAuMDU1NjQzNCxcclxuXHRcdC0xLjUzNzEzODUsICAxLjg3NjAxMDgsIC0wLjIwNDAyNTksXHJcblx0XHQtMC40OTg1MzE0LCAgMC4wNDE1NTYwLCAgMS4wNTcyMjUyXHJcblx0KTtcclxuXHJcblx0Ly8gQXNzdW1lIGFpciBpbnRlcmZhY2UgZm9yIHRvcFxyXG5cdC8vIE5vdGU6IFdlIGRvbid0IGhhbmRsZSB0aGUgY2FzZSBmcmVzbmVsMCA9PSAxXHJcblx0dmVjMyBGcmVzbmVsMFRvSW9yKCB2ZWMzIGZyZXNuZWwwICkge1xyXG5cclxuXHRcdHZlYzMgc3FydEYwID0gc3FydCggZnJlc25lbDAgKTtcclxuXHRcdHJldHVybiAoIHZlYzMoIDEuMCApICsgc3FydEYwICkgLyAoIHZlYzMoIDEuMCApIC0gc3FydEYwICk7XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gQ29udmVyc2lvbiBGTy9JT1JcclxuXHR2ZWMzIElvclRvRnJlc25lbDAoIHZlYzMgdHJhbnNtaXR0ZWRJb3IsIGZsb2F0IGluY2lkZW50SW9yICkge1xyXG5cclxuXHRcdHJldHVybiBwb3cyKCAoIHRyYW5zbWl0dGVkSW9yIC0gdmVjMyggaW5jaWRlbnRJb3IgKSApIC8gKCB0cmFuc21pdHRlZElvciArIHZlYzMoIGluY2lkZW50SW9yICkgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vIGlvciBpcyBhIHZhbHVlIGJldHdlZW4gMS4wIGFuZCAzLjAuIDEuMCBpcyBhaXIgaW50ZXJmYWNlXHJcblx0ZmxvYXQgSW9yVG9GcmVzbmVsMCggZmxvYXQgdHJhbnNtaXR0ZWRJb3IsIGZsb2F0IGluY2lkZW50SW9yICkge1xyXG5cclxuXHRcdHJldHVybiBwb3cyKCAoIHRyYW5zbWl0dGVkSW9yIC0gaW5jaWRlbnRJb3IgKSAvICggdHJhbnNtaXR0ZWRJb3IgKyBpbmNpZGVudElvciApKTtcclxuXHJcblx0fVxyXG5cclxuXHQvLyBGcmVzbmVsIGVxdWF0aW9ucyBmb3IgZGllbGVjdHJpYy9kaWVsZWN0cmljIGludGVyZmFjZXMuXHJcblx0Ly8gUmVmOiBodHRwczovL2JlbGNvdXIuZ2l0aHViLmlvL2Jsb2cvcmVzZWFyY2gvMjAxNy8wNS8wMS9icmRmLXRoaW4tZmlsbS5odG1sXHJcblx0Ly8gRXZhbHVhdGlvbiBYWVogc2Vuc2l0aXZpdHkgY3VydmVzIGluIEZvdXJpZXIgc3BhY2VcclxuXHR2ZWMzIGV2YWxTZW5zaXRpdml0eSggZmxvYXQgT1BELCB2ZWMzIHNoaWZ0ICkge1xyXG5cclxuXHRcdGZsb2F0IHBoYXNlID0gMi4wICogUEkgKiBPUEQgKiAxLjBlLTk7XHJcblx0XHR2ZWMzIHZhbCA9IHZlYzMoIDUuNDg1NmUtMTMsIDQuNDIwMWUtMTMsIDUuMjQ4MWUtMTMgKTtcclxuXHRcdHZlYzMgcG9zID0gdmVjMyggMS42ODEwZSswNiwgMS43OTUzZSswNiwgMi4yMDg0ZSswNiApO1xyXG5cdFx0dmVjMyB2YXIgPSB2ZWMzKCA0LjMyNzhlKzA5LCA5LjMwNDZlKzA5LCA2LjYxMjFlKzA5ICk7XHJcblxyXG5cdFx0dmVjMyB4eXogPSB2YWwgKiBzcXJ0KCAyLjAgKiBQSSAqIHZhciApICogY29zKCBwb3MgKiBwaGFzZSArIHNoaWZ0ICkgKiBleHAoIC0gcG93MiggcGhhc2UgKSAqIHZhciApO1xyXG5cdFx0eHl6LnggKz0gOS43NDcwZS0xNCAqIHNxcnQoIDIuMCAqIFBJICogNC41MjgyZSswOSApICogY29zKCAyLjIzOTllKzA2ICogcGhhc2UgKyBzaGlmdFsgMCBdICkgKiBleHAoIC0gNC41MjgyZSswOSAqIHBvdzIoIHBoYXNlICkgKTtcclxuXHRcdHh5eiAvPSAxLjA2ODVlLTc7XHJcblxyXG5cdFx0dmVjMyByZ2IgPSBYWVpfVE9fUkVDNzA5ICogeHl6O1xyXG5cdFx0cmV0dXJuIHJnYjtcclxuXHJcblx0fVxyXG5cclxuXHR2ZWMzIGV2YWxJcmlkZXNjZW5jZSggZmxvYXQgb3V0c2lkZUlPUiwgZmxvYXQgZXRhMiwgZmxvYXQgY29zVGhldGExLCBmbG9hdCB0aGluRmlsbVRoaWNrbmVzcywgdmVjMyBiYXNlRjAgKSB7XHJcblxyXG5cdFx0dmVjMyBJO1xyXG5cclxuXHRcdC8vIEZvcmNlIGlyaWRlc2NlbmNlSU9SIC0+IG91dHNpZGVJT1Igd2hlbiB0aGluRmlsbVRoaWNrbmVzcyAtPiAwLjBcclxuXHRcdGZsb2F0IGlyaWRlc2NlbmNlSU9SID0gbWl4KCBvdXRzaWRlSU9SLCBldGEyLCBzbW9vdGhzdGVwKCAwLjAsIDAuMDMsIHRoaW5GaWxtVGhpY2tuZXNzICkgKTtcclxuXHRcdC8vIEV2YWx1YXRlIHRoZSBjb3NUaGV0YSBvbiB0aGUgYmFzZSBsYXllciAoU25lbGwgbGF3KVxyXG5cdFx0ZmxvYXQgc2luVGhldGEyU3EgPSBwb3cyKCBvdXRzaWRlSU9SIC8gaXJpZGVzY2VuY2VJT1IgKSAqICggMS4wIC0gcG93MiggY29zVGhldGExICkgKTtcclxuXHJcblx0XHQvLyBIYW5kbGUgVElSOlxyXG5cdFx0ZmxvYXQgY29zVGhldGEyU3EgPSAxLjAgLSBzaW5UaGV0YTJTcTtcclxuXHRcdGlmICggY29zVGhldGEyU3EgPCAwLjAgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gdmVjMyggMS4wICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZsb2F0IGNvc1RoZXRhMiA9IHNxcnQoIGNvc1RoZXRhMlNxICk7XHJcblxyXG5cdFx0Ly8gRmlyc3QgaW50ZXJmYWNlXHJcblx0XHRmbG9hdCBSMCA9IElvclRvRnJlc25lbDAoIGlyaWRlc2NlbmNlSU9SLCBvdXRzaWRlSU9SICk7XHJcblx0XHRmbG9hdCBSMTIgPSBGX1NjaGxpY2soIFIwLCAxLjAsIGNvc1RoZXRhMSApO1xyXG5cdFx0ZmxvYXQgVDEyMSA9IDEuMCAtIFIxMjtcclxuXHRcdGZsb2F0IHBoaTEyID0gMC4wO1xyXG5cdFx0aWYgKCBpcmlkZXNjZW5jZUlPUiA8IG91dHNpZGVJT1IgKSBwaGkxMiA9IFBJO1xyXG5cdFx0ZmxvYXQgcGhpMjEgPSBQSSAtIHBoaTEyO1xyXG5cclxuXHRcdC8vIFNlY29uZCBpbnRlcmZhY2VcclxuXHRcdHZlYzMgYmFzZUlPUiA9IEZyZXNuZWwwVG9Jb3IoIGNsYW1wKCBiYXNlRjAsIDAuMCwgMC45OTk5ICkgKTsgLy8gZ3VhcmQgYWdhaW5zdCAxLjBcclxuXHRcdHZlYzMgUjEgPSBJb3JUb0ZyZXNuZWwwKCBiYXNlSU9SLCBpcmlkZXNjZW5jZUlPUiApO1xyXG5cdFx0dmVjMyBSMjMgPSBGX1NjaGxpY2soIFIxLCAxLjAsIGNvc1RoZXRhMiApO1xyXG5cdFx0dmVjMyBwaGkyMyA9IHZlYzMoIDAuMCApO1xyXG5cdFx0aWYgKCBiYXNlSU9SWyAwIF0gPCBpcmlkZXNjZW5jZUlPUiApIHBoaTIzWyAwIF0gPSBQSTtcclxuXHRcdGlmICggYmFzZUlPUlsgMSBdIDwgaXJpZGVzY2VuY2VJT1IgKSBwaGkyM1sgMSBdID0gUEk7XHJcblx0XHRpZiAoIGJhc2VJT1JbIDIgXSA8IGlyaWRlc2NlbmNlSU9SICkgcGhpMjNbIDIgXSA9IFBJO1xyXG5cclxuXHRcdC8vIFBoYXNlIHNoaWZ0XHJcblx0XHRmbG9hdCBPUEQgPSAyLjAgKiBpcmlkZXNjZW5jZUlPUiAqIHRoaW5GaWxtVGhpY2tuZXNzICogY29zVGhldGEyO1xyXG5cdFx0dmVjMyBwaGkgPSB2ZWMzKCBwaGkyMSApICsgcGhpMjM7XHJcblxyXG5cdFx0Ly8gQ29tcG91bmQgdGVybXNcclxuXHRcdHZlYzMgUjEyMyA9IGNsYW1wKCBSMTIgKiBSMjMsIDFlLTUsIDAuOTk5OSApO1xyXG5cdFx0dmVjMyByMTIzID0gc3FydCggUjEyMyApO1xyXG5cdFx0dmVjMyBScyA9IHBvdzIoIFQxMjEgKSAqIFIyMyAvICggdmVjMyggMS4wICkgLSBSMTIzICk7XHJcblxyXG5cdFx0Ly8gUmVmbGVjdGFuY2UgdGVybSBmb3IgbSA9IDAgKERDIHRlcm0gYW1wbGl0dWRlKVxyXG5cdFx0dmVjMyBDMCA9IFIxMiArIFJzO1xyXG5cdFx0SSA9IEMwO1xyXG5cclxuXHRcdC8vIFJlZmxlY3RhbmNlIHRlcm0gZm9yIG0gPiAwIChwYWlycyBvZiBkaXJhY3MpXHJcblx0XHR2ZWMzIENtID0gUnMgLSBUMTIxO1xyXG5cdFx0Zm9yICggaW50IG0gPSAxOyBtIDw9IDI7ICsrIG0gKSB7XHJcblxyXG5cdFx0XHRDbSAqPSByMTIzO1xyXG5cdFx0XHR2ZWMzIFNtID0gMi4wICogZXZhbFNlbnNpdGl2aXR5KCBmbG9hdCggbSApICogT1BELCBmbG9hdCggbSApICogcGhpICk7XHJcblx0XHRcdEkgKz0gQ20gKiBTbTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gU2luY2Ugb3V0IG9mIGdhbXV0IGNvbG9ycyBtaWdodCBiZSBwcm9kdWNlZCwgbmVnYXRpdmUgY29sb3IgdmFsdWVzIGFyZSBjbGFtcGVkIHRvIDAuXHJcblx0XHRyZXR1cm4gbWF4KCBJLCB2ZWMzKCAwLjAgKSApO1xyXG5cclxuXHR9XHJcblxyXG4jZW5kaWZcclxuXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbiNpZmRlZiBVU0VfQlVNUE1BUFxyXG5cclxuXHR1bmlmb3JtIHNhbXBsZXIyRCBidW1wTWFwO1xyXG5cdHVuaWZvcm0gZmxvYXQgYnVtcFNjYWxlO1xyXG5cclxuXHQvLyBCdW1wIE1hcHBpbmcgVW5wYXJhbWV0cml6ZWQgU3VyZmFjZXMgb24gdGhlIEdQVSBieSBNb3J0ZW4gUy4gTWlra2Vsc2VuXHJcblx0Ly8gaHR0cHM6Ly9tbWlray5naXRodWIuaW8vcGFwZXJzM2QvbW1fc2ZncmFkX2J1bXAucGRmXHJcblxyXG5cdC8vIEV2YWx1YXRlIHRoZSBkZXJpdmF0aXZlIG9mIHRoZSBoZWlnaHQgdy5yLnQuIHNjcmVlbi1zcGFjZSB1c2luZyBmb3J3YXJkIGRpZmZlcmVuY2luZyAobGlzdGluZyAyKVxyXG5cclxuXHR2ZWMyIGRIZHh5X2Z3ZCgpIHtcclxuXHJcblx0XHR2ZWMyIGRTVGR4ID0gZEZkeCggdkJ1bXBNYXBVdiApO1xyXG5cdFx0dmVjMiBkU1RkeSA9IGRGZHkoIHZCdW1wTWFwVXYgKTtcclxuXHJcblx0XHRmbG9hdCBIbGwgPSBidW1wU2NhbGUgKiB0ZXh0dXJlMkQoIGJ1bXBNYXAsIHZCdW1wTWFwVXYgKS54O1xyXG5cdFx0ZmxvYXQgZEJ4ID0gYnVtcFNjYWxlICogdGV4dHVyZTJEKCBidW1wTWFwLCB2QnVtcE1hcFV2ICsgZFNUZHggKS54IC0gSGxsO1xyXG5cdFx0ZmxvYXQgZEJ5ID0gYnVtcFNjYWxlICogdGV4dHVyZTJEKCBidW1wTWFwLCB2QnVtcE1hcFV2ICsgZFNUZHkgKS54IC0gSGxsO1xyXG5cclxuXHRcdHJldHVybiB2ZWMyKCBkQngsIGRCeSApO1xyXG5cclxuXHR9XHJcblxyXG5cdHZlYzMgcGVydHVyYk5vcm1hbEFyYiggdmVjMyBzdXJmX3BvcywgdmVjMyBzdXJmX25vcm0sIHZlYzIgZEhkeHksIGZsb2F0IGZhY2VEaXJlY3Rpb24gKSB7XHJcblxyXG5cdFx0Ly8gbm9ybWFsaXplIGlzIGRvbmUgdG8gZW5zdXJlIHRoYXQgdGhlIGJ1bXAgbWFwIGxvb2tzIHRoZSBzYW1lIHJlZ2FyZGxlc3Mgb2YgdGhlIHRleHR1cmUncyBzY2FsZVxyXG5cdFx0dmVjMyB2U2lnbWFYID0gbm9ybWFsaXplKCBkRmR4KCBzdXJmX3Bvcy54eXogKSApO1xyXG5cdFx0dmVjMyB2U2lnbWFZID0gbm9ybWFsaXplKCBkRmR5KCBzdXJmX3Bvcy54eXogKSApO1xyXG5cdFx0dmVjMyB2TiA9IHN1cmZfbm9ybTsgLy8gbm9ybWFsaXplZFxyXG5cclxuXHRcdHZlYzMgUjEgPSBjcm9zcyggdlNpZ21hWSwgdk4gKTtcclxuXHRcdHZlYzMgUjIgPSBjcm9zcyggdk4sIHZTaWdtYVggKTtcclxuXHJcblx0XHRmbG9hdCBmRGV0ID0gZG90KCB2U2lnbWFYLCBSMSApICogZmFjZURpcmVjdGlvbjtcclxuXHJcblx0XHR2ZWMzIHZHcmFkID0gc2lnbiggZkRldCApICogKCBkSGR4eS54ICogUjEgKyBkSGR4eS55ICogUjIgKTtcclxuXHRcdHJldHVybiBub3JtYWxpemUoIGFicyggZkRldCApICogc3VyZl9ub3JtIC0gdkdyYWQgKTtcclxuXHJcblx0fVxyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTID4gMFxyXG5cclxuXHR2ZWM0IHBsYW5lO1xyXG5cclxuXHQjaWZkZWYgQUxQSEFfVE9fQ09WRVJBR0VcclxuXHJcblx0XHRmbG9hdCBkaXN0YW5jZVRvUGxhbmUsIGRpc3RhbmNlR3JhZGllbnQ7XHJcblx0XHRmbG9hdCBjbGlwT3BhY2l0eSA9IDEuMDtcclxuXHJcblx0XHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XHJcblx0XHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBVTklPTl9DTElQUElOR19QTEFORVM7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRwbGFuZSA9IGNsaXBwaW5nUGxhbmVzWyBpIF07XHJcblx0XHRcdGRpc3RhbmNlVG9QbGFuZSA9IC0gZG90KCB2Q2xpcFBvc2l0aW9uLCBwbGFuZS54eXogKSArIHBsYW5lLnc7XHJcblx0XHRcdGRpc3RhbmNlR3JhZGllbnQgPSBmd2lkdGgoIGRpc3RhbmNlVG9QbGFuZSApIC8gMi4wO1xyXG5cdFx0XHRjbGlwT3BhY2l0eSAqPSBzbW9vdGhzdGVwKCAtIGRpc3RhbmNlR3JhZGllbnQsIGRpc3RhbmNlR3JhZGllbnQsIGRpc3RhbmNlVG9QbGFuZSApO1xyXG5cclxuXHRcdFx0aWYgKCBjbGlwT3BhY2l0eSA9PSAwLjAgKSBkaXNjYXJkO1xyXG5cclxuXHRcdH1cclxuXHRcdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXHJcblxyXG5cdFx0I2lmIFVOSU9OX0NMSVBQSU5HX1BMQU5FUyA8IE5VTV9DTElQUElOR19QTEFORVNcclxuXHJcblx0XHRcdGZsb2F0IHVuaW9uQ2xpcE9wYWNpdHkgPSAxLjA7XHJcblxyXG5cdFx0XHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XHJcblx0XHRcdGZvciAoIGludCBpID0gVU5JT05fQ0xJUFBJTkdfUExBTkVTOyBpIDwgTlVNX0NMSVBQSU5HX1BMQU5FUzsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0cGxhbmUgPSBjbGlwcGluZ1BsYW5lc1sgaSBdO1xyXG5cdFx0XHRcdGRpc3RhbmNlVG9QbGFuZSA9IC0gZG90KCB2Q2xpcFBvc2l0aW9uLCBwbGFuZS54eXogKSArIHBsYW5lLnc7XHJcblx0XHRcdFx0ZGlzdGFuY2VHcmFkaWVudCA9IGZ3aWR0aCggZGlzdGFuY2VUb1BsYW5lICkgLyAyLjA7XHJcblx0XHRcdFx0dW5pb25DbGlwT3BhY2l0eSAqPSAxLjAgLSBzbW9vdGhzdGVwKCAtIGRpc3RhbmNlR3JhZGllbnQsIGRpc3RhbmNlR3JhZGllbnQsIGRpc3RhbmNlVG9QbGFuZSApO1xyXG5cclxuXHRcdFx0fVxyXG5cdFx0XHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxyXG5cclxuXHRcdFx0Y2xpcE9wYWNpdHkgKj0gMS4wIC0gdW5pb25DbGlwT3BhY2l0eTtcclxuXHJcblx0XHQjZW5kaWZcclxuXHJcblx0XHRkaWZmdXNlQ29sb3IuYSAqPSBjbGlwT3BhY2l0eTtcclxuXHJcblx0XHRpZiAoIGRpZmZ1c2VDb2xvci5hID09IDAuMCApIGRpc2NhcmQ7XHJcblxyXG5cdCNlbHNlXHJcblxyXG5cdFx0I3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxyXG5cdFx0Zm9yICggaW50IGkgPSAwOyBpIDwgVU5JT05fQ0xJUFBJTkdfUExBTkVTOyBpICsrICkge1xyXG5cclxuXHRcdFx0cGxhbmUgPSBjbGlwcGluZ1BsYW5lc1sgaSBdO1xyXG5cdFx0XHRpZiAoIGRvdCggdkNsaXBQb3NpdGlvbiwgcGxhbmUueHl6ICkgPiBwbGFuZS53ICkgZGlzY2FyZDtcclxuXHJcblx0XHR9XHJcblx0XHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxyXG5cclxuXHRcdCNpZiBVTklPTl9DTElQUElOR19QTEFORVMgPCBOVU1fQ0xJUFBJTkdfUExBTkVTXHJcblxyXG5cdFx0XHRib29sIGNsaXBwZWQgPSB0cnVlO1xyXG5cclxuXHRcdFx0I3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxyXG5cdFx0XHRmb3IgKCBpbnQgaSA9IFVOSU9OX0NMSVBQSU5HX1BMQU5FUzsgaSA8IE5VTV9DTElQUElOR19QTEFORVM7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdHBsYW5lID0gY2xpcHBpbmdQbGFuZXNbIGkgXTtcclxuXHRcdFx0XHRjbGlwcGVkID0gKCBkb3QoIHZDbGlwUG9zaXRpb24sIHBsYW5lLnh5eiApID4gcGxhbmUudyApICYmIGNsaXBwZWQ7XHJcblxyXG5cdFx0XHR9XHJcblx0XHRcdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXHJcblxyXG5cdFx0XHRpZiAoIGNsaXBwZWQgKSBkaXNjYXJkO1xyXG5cclxuXHRcdCNlbmRpZlxyXG5cclxuXHQjZW5kaWZcclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyA+IDBcclxuXHJcblx0dmFyeWluZyB2ZWMzIHZDbGlwUG9zaXRpb247XHJcblxyXG5cdHVuaWZvcm0gdmVjNCBjbGlwcGluZ1BsYW5lc1sgTlVNX0NMSVBQSU5HX1BMQU5FUyBdO1xyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTID4gMFxyXG5cclxuXHR2YXJ5aW5nIHZlYzMgdkNsaXBQb3NpdGlvbjtcclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyA+IDBcclxuXHJcblx0dkNsaXBQb3NpdGlvbiA9IC0gbXZQb3NpdGlvbi54eXo7XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmIGRlZmluZWQoIFVTRV9DT0xPUl9BTFBIQSApXHJcblxyXG5cdGRpZmZ1c2VDb2xvciAqPSB2Q29sb3I7XHJcblxyXG4jZWxpZiBkZWZpbmVkKCBVU0VfQ09MT1IgKVxyXG5cclxuXHRkaWZmdXNlQ29sb3IucmdiICo9IHZDb2xvcjtcclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jaWYgZGVmaW5lZCggVVNFX0NPTE9SX0FMUEhBIClcclxuXHJcblx0dmFyeWluZyB2ZWM0IHZDb2xvcjtcclxuXHJcbiNlbGlmIGRlZmluZWQoIFVTRV9DT0xPUiApXHJcblxyXG5cdHZhcnlpbmcgdmVjMyB2Q29sb3I7XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmIGRlZmluZWQoIFVTRV9DT0xPUl9BTFBIQSApXHJcblxyXG5cdHZhcnlpbmcgdmVjNCB2Q29sb3I7XHJcblxyXG4jZWxpZiBkZWZpbmVkKCBVU0VfQ09MT1IgKSB8fCBkZWZpbmVkKCBVU0VfSU5TVEFOQ0lOR19DT0xPUiApIHx8IGRlZmluZWQoIFVTRV9CQVRDSElOR19DT0xPUiApXHJcblxyXG5cdHZhcnlpbmcgdmVjMyB2Q29sb3I7XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmIGRlZmluZWQoIFVTRV9DT0xPUl9BTFBIQSApXHJcblxyXG5cdHZDb2xvciA9IHZlYzQoIDEuMCApO1xyXG5cclxuI2VsaWYgZGVmaW5lZCggVVNFX0NPTE9SICkgfHwgZGVmaW5lZCggVVNFX0lOU1RBTkNJTkdfQ09MT1IgKSB8fCBkZWZpbmVkKCBVU0VfQkFUQ0hJTkdfQ09MT1IgKVxyXG5cclxuXHR2Q29sb3IgPSB2ZWMzKCAxLjAgKTtcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmZGVmIFVTRV9DT0xPUlxyXG5cclxuXHR2Q29sb3IgKj0gY29sb3I7XHJcblxyXG4jZW5kaWZcclxuXHJcbiNpZmRlZiBVU0VfSU5TVEFOQ0lOR19DT0xPUlxyXG5cclxuXHR2Q29sb3IueHl6ICo9IGluc3RhbmNlQ29sb3IueHl6O1xyXG5cclxuI2VuZGlmXHJcblxyXG4jaWZkZWYgVVNFX0JBVENISU5HX0NPTE9SXHJcblxyXG5cdHZlYzMgYmF0Y2hpbmdDb2xvciA9IGdldEJhdGNoaW5nQ29sb3IoIGdldEluZGlyZWN0SW5kZXgoIGdsX0RyYXdJRCApICk7XHJcblxyXG5cdHZDb2xvci54eXogKj0gYmF0Y2hpbmdDb2xvci54eXo7XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2RlZmluZSBQSSAzLjE0MTU5MjY1MzU4OTc5M1xyXG4jZGVmaW5lIFBJMiA2LjI4MzE4NTMwNzE3OTU4NlxyXG4jZGVmaW5lIFBJX0hBTEYgMS41NzA3OTYzMjY3OTQ4OTY2XHJcbiNkZWZpbmUgUkVDSVBST0NBTF9QSSAwLjMxODMwOTg4NjE4Mzc5MDdcclxuI2RlZmluZSBSRUNJUFJPQ0FMX1BJMiAwLjE1OTE1NDk0MzA5MTg5NTM1XHJcbiNkZWZpbmUgRVBTSUxPTiAxZS02XHJcblxyXG4jaWZuZGVmIHNhdHVyYXRlXHJcbi8vIDx0b25lbWFwcGluZ19wYXJzX2ZyYWdtZW50PiBtYXkgaGF2ZSBkZWZpbmVkIHNhdHVyYXRlKCkgYWxyZWFkeVxyXG4jZGVmaW5lIHNhdHVyYXRlKCBhICkgY2xhbXAoIGEsIDAuMCwgMS4wIClcclxuI2VuZGlmXHJcbiNkZWZpbmUgd2hpdGVDb21wbGVtZW50KCBhICkgKCAxLjAgLSBzYXR1cmF0ZSggYSApIClcclxuXHJcbmZsb2F0IHBvdzIoIGNvbnN0IGluIGZsb2F0IHggKSB7IHJldHVybiB4Kng7IH1cclxudmVjMyBwb3cyKCBjb25zdCBpbiB2ZWMzIHggKSB7IHJldHVybiB4Kng7IH1cclxuZmxvYXQgcG93MyggY29uc3QgaW4gZmxvYXQgeCApIHsgcmV0dXJuIHgqeCp4OyB9XHJcbmZsb2F0IHBvdzQoIGNvbnN0IGluIGZsb2F0IHggKSB7IGZsb2F0IHgyID0geCp4OyByZXR1cm4geDIqeDI7IH1cclxuZmxvYXQgbWF4MyggY29uc3QgaW4gdmVjMyB2ICkgeyByZXR1cm4gbWF4KCBtYXgoIHYueCwgdi55ICksIHYueiApOyB9XHJcbmZsb2F0IGF2ZXJhZ2UoIGNvbnN0IGluIHZlYzMgdiApIHsgcmV0dXJuIGRvdCggdiwgdmVjMyggMC4zMzMzMzMzICkgKTsgfVxyXG5cclxuLy8gZXhwZWN0cyB2YWx1ZXMgaW4gdGhlIHJhbmdlIG9mIFswLDFdeFswLDFdLCByZXR1cm5zIHZhbHVlcyBpbiB0aGUgWzAsMV0gcmFuZ2UuXHJcbi8vIGRvIG5vdCBjb2xsYXBzZSBpbnRvIGEgc2luZ2xlIGZ1bmN0aW9uIHBlcjogaHR0cDovL2J5dGVibGFja3NtaXRoLmNvbS9pbXByb3ZlbWVudHMtdG8tdGhlLWNhbm9uaWNhbC1vbmUtbGluZXItZ2xzbC1yYW5kLWZvci1vcGVuZ2wtZXMtMi0wL1xyXG5oaWdocCBmbG9hdCByYW5kKCBjb25zdCBpbiB2ZWMyIHV2ICkge1xyXG5cclxuXHRjb25zdCBoaWdocCBmbG9hdCBhID0gMTIuOTg5OCwgYiA9IDc4LjIzMywgYyA9IDQzNzU4LjU0NTM7XHJcblx0aGlnaHAgZmxvYXQgZHQgPSBkb3QoIHV2Lnh5LCB2ZWMyKCBhLGIgKSApLCBzbiA9IG1vZCggZHQsIFBJICk7XHJcblxyXG5cdHJldHVybiBmcmFjdCggc2luKCBzbiApICogYyApO1xyXG5cclxufVxyXG5cclxuI2lmZGVmIEhJR0hfUFJFQ0lTSU9OXHJcblx0ZmxvYXQgcHJlY2lzaW9uU2FmZUxlbmd0aCggdmVjMyB2ICkgeyByZXR1cm4gbGVuZ3RoKCB2ICk7IH1cclxuI2Vsc2VcclxuXHRmbG9hdCBwcmVjaXNpb25TYWZlTGVuZ3RoKCB2ZWMzIHYgKSB7XHJcblx0XHRmbG9hdCBtYXhDb21wb25lbnQgPSBtYXgzKCBhYnMoIHYgKSApO1xyXG5cdFx0cmV0dXJuIGxlbmd0aCggdiAvIG1heENvbXBvbmVudCApICogbWF4Q29tcG9uZW50O1xyXG5cdH1cclxuI2VuZGlmXHJcblxyXG5zdHJ1Y3QgSW5jaWRlbnRMaWdodCB7XHJcblx0dmVjMyBjb2xvcjtcclxuXHR2ZWMzIGRpcmVjdGlvbjtcclxuXHRib29sIHZpc2libGU7XHJcbn07XHJcblxyXG5zdHJ1Y3QgUmVmbGVjdGVkTGlnaHQge1xyXG5cdHZlYzMgZGlyZWN0RGlmZnVzZTtcclxuXHR2ZWMzIGRpcmVjdFNwZWN1bGFyO1xyXG5cdHZlYzMgaW5kaXJlY3REaWZmdXNlO1xyXG5cdHZlYzMgaW5kaXJlY3RTcGVjdWxhcjtcclxufTtcclxuXHJcbiNpZmRlZiBVU0VfQUxQSEFIQVNIXHJcblxyXG5cdHZhcnlpbmcgdmVjMyB2UG9zaXRpb247XHJcblxyXG4jZW5kaWZcclxuXHJcbnZlYzMgdHJhbnNmb3JtRGlyZWN0aW9uKCBpbiB2ZWMzIGRpciwgaW4gbWF0NCBtYXRyaXggKSB7XHJcblxyXG5cdHJldHVybiBub3JtYWxpemUoICggbWF0cml4ICogdmVjNCggZGlyLCAwLjAgKSApLnh5eiApO1xyXG5cclxufVxyXG5cclxudmVjMyBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBpbiB2ZWMzIGRpciwgaW4gbWF0NCBtYXRyaXggKSB7XHJcblxyXG5cdC8vIGRpciBjYW4gYmUgZWl0aGVyIGEgZGlyZWN0aW9uIHZlY3RvciBvciBhIG5vcm1hbCB2ZWN0b3JcclxuXHQvLyB1cHBlci1sZWZ0IDN4MyBvZiBtYXRyaXggaXMgYXNzdW1lZCB0byBiZSBvcnRob2dvbmFsXHJcblxyXG5cdHJldHVybiBub3JtYWxpemUoICggdmVjNCggZGlyLCAwLjAgKSAqIG1hdHJpeCApLnh5eiApO1xyXG5cclxufVxyXG5cclxubWF0MyB0cmFuc3Bvc2VNYXQzKCBjb25zdCBpbiBtYXQzIG0gKSB7XHJcblxyXG5cdG1hdDMgdG1wO1xyXG5cclxuXHR0bXBbIDAgXSA9IHZlYzMoIG1bIDAgXS54LCBtWyAxIF0ueCwgbVsgMiBdLnggKTtcclxuXHR0bXBbIDEgXSA9IHZlYzMoIG1bIDAgXS55LCBtWyAxIF0ueSwgbVsgMiBdLnkgKTtcclxuXHR0bXBbIDIgXSA9IHZlYzMoIG1bIDAgXS56LCBtWyAxIF0ueiwgbVsgMiBdLnogKTtcclxuXHJcblx0cmV0dXJuIHRtcDtcclxuXHJcbn1cclxuXHJcbmJvb2wgaXNQZXJzcGVjdGl2ZU1hdHJpeCggbWF0NCBtICkge1xyXG5cclxuXHRyZXR1cm4gbVsgMiBdWyAzIF0gPT0gLSAxLjA7XHJcblxyXG59XHJcblxyXG52ZWMyIGVxdWlyZWN0VXYoIGluIHZlYzMgZGlyICkge1xyXG5cclxuXHQvLyBkaXIgaXMgYXNzdW1lZCB0byBiZSB1bml0IGxlbmd0aFxyXG5cclxuXHRmbG9hdCB1ID0gYXRhbiggZGlyLnosIGRpci54ICkgKiBSRUNJUFJPQ0FMX1BJMiArIDAuNTtcclxuXHJcblx0ZmxvYXQgdiA9IGFzaW4oIGNsYW1wKCBkaXIueSwgLSAxLjAsIDEuMCApICkgKiBSRUNJUFJPQ0FMX1BJICsgMC41O1xyXG5cclxuXHRyZXR1cm4gdmVjMiggdSwgdiApO1xyXG5cclxufVxyXG5cclxudmVjMyBCUkRGX0xhbWJlcnQoIGNvbnN0IGluIHZlYzMgZGlmZnVzZUNvbG9yICkge1xyXG5cclxuXHRyZXR1cm4gUkVDSVBST0NBTF9QSSAqIGRpZmZ1c2VDb2xvcjtcclxuXHJcbn0gLy8gdmFsaWRhdGVkXHJcblxyXG52ZWMzIEZfU2NobGljayggY29uc3QgaW4gdmVjMyBmMCwgY29uc3QgaW4gZmxvYXQgZjkwLCBjb25zdCBpbiBmbG9hdCBkb3RWSCApIHtcclxuXHJcblx0Ly8gT3JpZ2luYWwgYXBwcm94aW1hdGlvbiBieSBDaHJpc3RvcGhlIFNjaGxpY2sgJzk0XHJcblx0Ly8gZmxvYXQgZnJlc25lbCA9IHBvdyggMS4wIC0gZG90VkgsIDUuMCApO1xyXG5cclxuXHQvLyBPcHRpbWl6ZWQgdmFyaWFudCAocHJlc2VudGVkIGJ5IEVwaWMgYXQgU0lHR1JBUEggJzEzKVxyXG5cdC8vIGh0dHBzOi8vY2RuMi51bnJlYWxlbmdpbmUuY29tL1Jlc291cmNlcy9maWxlcy8yMDEzU2lnZ3JhcGhQcmVzZW50YXRpb25zTm90ZXMtMjY5MTU3MzgucGRmXHJcblx0ZmxvYXQgZnJlc25lbCA9IGV4cDIoICggLSA1LjU1NDczICogZG90VkggLSA2Ljk4MzE2ICkgKiBkb3RWSCApO1xyXG5cclxuXHRyZXR1cm4gZjAgKiAoIDEuMCAtIGZyZXNuZWwgKSArICggZjkwICogZnJlc25lbCApO1xyXG5cclxufSAvLyB2YWxpZGF0ZWRcclxuXHJcbmZsb2F0IEZfU2NobGljayggY29uc3QgaW4gZmxvYXQgZjAsIGNvbnN0IGluIGZsb2F0IGY5MCwgY29uc3QgaW4gZmxvYXQgZG90VkggKSB7XHJcblxyXG5cdC8vIE9yaWdpbmFsIGFwcHJveGltYXRpb24gYnkgQ2hyaXN0b3BoZSBTY2hsaWNrICc5NFxyXG5cdC8vIGZsb2F0IGZyZXNuZWwgPSBwb3coIDEuMCAtIGRvdFZILCA1LjAgKTtcclxuXHJcblx0Ly8gT3B0aW1pemVkIHZhcmlhbnQgKHByZXNlbnRlZCBieSBFcGljIGF0IFNJR0dSQVBIICcxMylcclxuXHQvLyBodHRwczovL2NkbjIudW5yZWFsZW5naW5lLmNvbS9SZXNvdXJjZXMvZmlsZXMvMjAxM1NpZ2dyYXBoUHJlc2VudGF0aW9uc05vdGVzLTI2OTE1NzM4LnBkZlxyXG5cdGZsb2F0IGZyZXNuZWwgPSBleHAyKCAoIC0gNS41NTQ3MyAqIGRvdFZIIC0gNi45ODMxNiApICogZG90VkggKTtcclxuXHJcblx0cmV0dXJuIGYwICogKCAxLjAgLSBmcmVzbmVsICkgKyAoIGY5MCAqIGZyZXNuZWwgKTtcclxuXHJcbn0gLy8gdmFsaWRhdGVkXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbiNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFX1VWXHJcblxyXG5cdCNkZWZpbmUgY3ViZVVWX21pbk1pcExldmVsIDQuMFxyXG5cdCNkZWZpbmUgY3ViZVVWX21pblRpbGVTaXplIDE2LjBcclxuXHJcblx0Ly8gVGhlc2Ugc2hhZGVyIGZ1bmN0aW9ucyBjb252ZXJ0IGJldHdlZW4gdGhlIFVWIGNvb3JkaW5hdGVzIG9mIGEgc2luZ2xlIGZhY2Ugb2ZcclxuXHQvLyBhIGN1YmVtYXAsIHRoZSAwLTUgaW50ZWdlciBpbmRleCBvZiBhIGN1YmUgZmFjZSwgYW5kIHRoZSBkaXJlY3Rpb24gdmVjdG9yIGZvclxyXG5cdC8vIHNhbXBsaW5nIGEgdGV4dHVyZUN1YmUgKG5vdCBnZW5lcmFsbHkgbm9ybWFsaXplZCApLlxyXG5cclxuXHRmbG9hdCBnZXRGYWNlKCB2ZWMzIGRpcmVjdGlvbiApIHtcclxuXHJcblx0XHR2ZWMzIGFic0RpcmVjdGlvbiA9IGFicyggZGlyZWN0aW9uICk7XHJcblxyXG5cdFx0ZmxvYXQgZmFjZSA9IC0gMS4wO1xyXG5cclxuXHRcdGlmICggYWJzRGlyZWN0aW9uLnggPiBhYnNEaXJlY3Rpb24ueiApIHtcclxuXHJcblx0XHRcdGlmICggYWJzRGlyZWN0aW9uLnggPiBhYnNEaXJlY3Rpb24ueSApXHJcblxyXG5cdFx0XHRcdGZhY2UgPSBkaXJlY3Rpb24ueCA+IDAuMCA/IDAuMCA6IDMuMDtcclxuXHJcblx0XHRcdGVsc2VcclxuXHJcblx0XHRcdFx0ZmFjZSA9IGRpcmVjdGlvbi55ID4gMC4wID8gMS4wIDogNC4wO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRpZiAoIGFic0RpcmVjdGlvbi56ID4gYWJzRGlyZWN0aW9uLnkgKVxyXG5cclxuXHRcdFx0XHRmYWNlID0gZGlyZWN0aW9uLnogPiAwLjAgPyAyLjAgOiA1LjA7XHJcblxyXG5cdFx0XHRlbHNlXHJcblxyXG5cdFx0XHRcdGZhY2UgPSBkaXJlY3Rpb24ueSA+IDAuMCA/IDEuMCA6IDQuMDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGZhY2U7XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gUkggY29vcmRpbmF0ZSBzeXN0ZW07IFBNUkVNIGZhY2UtaW5kZXhpbmcgY29udmVudGlvblxyXG5cdHZlYzIgZ2V0VVYoIHZlYzMgZGlyZWN0aW9uLCBmbG9hdCBmYWNlICkge1xyXG5cclxuXHRcdHZlYzIgdXY7XHJcblxyXG5cdFx0aWYgKCBmYWNlID09IDAuMCApIHtcclxuXHJcblx0XHRcdHV2ID0gdmVjMiggZGlyZWN0aW9uLnosIGRpcmVjdGlvbi55ICkgLyBhYnMoIGRpcmVjdGlvbi54ICk7IC8vIHBvcyB4XHJcblxyXG5cdFx0fSBlbHNlIGlmICggZmFjZSA9PSAxLjAgKSB7XHJcblxyXG5cdFx0XHR1diA9IHZlYzIoIC0gZGlyZWN0aW9uLngsIC0gZGlyZWN0aW9uLnogKSAvIGFicyggZGlyZWN0aW9uLnkgKTsgLy8gcG9zIHlcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBmYWNlID09IDIuMCApIHtcclxuXHJcblx0XHRcdHV2ID0gdmVjMiggLSBkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnkgKSAvIGFicyggZGlyZWN0aW9uLnogKTsgLy8gcG9zIHpcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBmYWNlID09IDMuMCApIHtcclxuXHJcblx0XHRcdHV2ID0gdmVjMiggLSBkaXJlY3Rpb24ueiwgZGlyZWN0aW9uLnkgKSAvIGFicyggZGlyZWN0aW9uLnggKTsgLy8gbmVnIHhcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBmYWNlID09IDQuMCApIHtcclxuXHJcblx0XHRcdHV2ID0gdmVjMiggLSBkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnogKSAvIGFicyggZGlyZWN0aW9uLnkgKTsgLy8gbmVnIHlcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dXYgPSB2ZWMyKCBkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnkgKSAvIGFicyggZGlyZWN0aW9uLnogKTsgLy8gbmVnIHpcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIDAuNSAqICggdXYgKyAxLjAgKTtcclxuXHJcblx0fVxyXG5cclxuXHR2ZWMzIGJpbGluZWFyQ3ViZVVWKCBzYW1wbGVyMkQgZW52TWFwLCB2ZWMzIGRpcmVjdGlvbiwgZmxvYXQgbWlwSW50ICkge1xyXG5cclxuXHRcdGZsb2F0IGZhY2UgPSBnZXRGYWNlKCBkaXJlY3Rpb24gKTtcclxuXHJcblx0XHRmbG9hdCBmaWx0ZXJJbnQgPSBtYXgoIGN1YmVVVl9taW5NaXBMZXZlbCAtIG1pcEludCwgMC4wICk7XHJcblxyXG5cdFx0bWlwSW50ID0gbWF4KCBtaXBJbnQsIGN1YmVVVl9taW5NaXBMZXZlbCApO1xyXG5cclxuXHRcdGZsb2F0IGZhY2VTaXplID0gZXhwMiggbWlwSW50ICk7XHJcblxyXG5cdFx0aGlnaHAgdmVjMiB1diA9IGdldFVWKCBkaXJlY3Rpb24sIGZhY2UgKSAqICggZmFjZVNpemUgLSAyLjAgKSArIDEuMDsgLy8gIzI1MDcxXHJcblxyXG5cdFx0aWYgKCBmYWNlID4gMi4wICkge1xyXG5cclxuXHRcdFx0dXYueSArPSBmYWNlU2l6ZTtcclxuXHJcblx0XHRcdGZhY2UgLT0gMy4wO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR1di54ICs9IGZhY2UgKiBmYWNlU2l6ZTtcclxuXHJcblx0XHR1di54ICs9IGZpbHRlckludCAqIDMuMCAqIGN1YmVVVl9taW5UaWxlU2l6ZTtcclxuXHJcblx0XHR1di55ICs9IDQuMCAqICggZXhwMiggQ1VCRVVWX01BWF9NSVAgKSAtIGZhY2VTaXplICk7XHJcblxyXG5cdFx0dXYueCAqPSBDVUJFVVZfVEVYRUxfV0lEVEg7XHJcblx0XHR1di55ICo9IENVQkVVVl9URVhFTF9IRUlHSFQ7XHJcblxyXG5cdFx0I2lmZGVmIHRleHR1cmUyREdyYWRFWFRcclxuXHJcblx0XHRcdHJldHVybiB0ZXh0dXJlMkRHcmFkRVhUKCBlbnZNYXAsIHV2LCB2ZWMyKCAwLjAgKSwgdmVjMiggMC4wICkgKS5yZ2I7IC8vIGRpc2FibGUgYW5pc290cm9waWMgZmlsdGVyaW5nXHJcblxyXG5cdFx0I2Vsc2VcclxuXHJcblx0XHRcdHJldHVybiB0ZXh0dXJlMkQoIGVudk1hcCwgdXYgKS5yZ2I7XHJcblxyXG5cdFx0I2VuZGlmXHJcblxyXG5cdH1cclxuXHJcblx0Ly8gVGhlc2UgZGVmaW5lcyBtdXN0IG1hdGNoIHdpdGggUE1SRU1HZW5lcmF0b3JcclxuXHJcblx0I2RlZmluZSBjdWJlVVZfcjAgMS4wXHJcblx0I2RlZmluZSBjdWJlVVZfbTAgLSAyLjBcclxuXHQjZGVmaW5lIGN1YmVVVl9yMSAwLjhcclxuXHQjZGVmaW5lIGN1YmVVVl9tMSAtIDEuMFxyXG5cdCNkZWZpbmUgY3ViZVVWX3I0IDAuNFxyXG5cdCNkZWZpbmUgY3ViZVVWX200IDIuMFxyXG5cdCNkZWZpbmUgY3ViZVVWX3I1IDAuMzA1XHJcblx0I2RlZmluZSBjdWJlVVZfbTUgMy4wXHJcblx0I2RlZmluZSBjdWJlVVZfcjYgMC4yMVxyXG5cdCNkZWZpbmUgY3ViZVVWX202IDQuMFxyXG5cclxuXHRmbG9hdCByb3VnaG5lc3NUb01pcCggZmxvYXQgcm91Z2huZXNzICkge1xyXG5cclxuXHRcdGZsb2F0IG1pcCA9IDAuMDtcclxuXHJcblx0XHRpZiAoIHJvdWdobmVzcyA+PSBjdWJlVVZfcjEgKSB7XHJcblxyXG5cdFx0XHRtaXAgPSAoIGN1YmVVVl9yMCAtIHJvdWdobmVzcyApICogKCBjdWJlVVZfbTEgLSBjdWJlVVZfbTAgKSAvICggY3ViZVVWX3IwIC0gY3ViZVVWX3IxICkgKyBjdWJlVVZfbTA7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggcm91Z2huZXNzID49IGN1YmVVVl9yNCApIHtcclxuXHJcblx0XHRcdG1pcCA9ICggY3ViZVVWX3IxIC0gcm91Z2huZXNzICkgKiAoIGN1YmVVVl9tNCAtIGN1YmVVVl9tMSApIC8gKCBjdWJlVVZfcjEgLSBjdWJlVVZfcjQgKSArIGN1YmVVVl9tMTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCByb3VnaG5lc3MgPj0gY3ViZVVWX3I1ICkge1xyXG5cclxuXHRcdFx0bWlwID0gKCBjdWJlVVZfcjQgLSByb3VnaG5lc3MgKSAqICggY3ViZVVWX201IC0gY3ViZVVWX200ICkgLyAoIGN1YmVVVl9yNCAtIGN1YmVVVl9yNSApICsgY3ViZVVWX200O1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHJvdWdobmVzcyA+PSBjdWJlVVZfcjYgKSB7XHJcblxyXG5cdFx0XHRtaXAgPSAoIGN1YmVVVl9yNSAtIHJvdWdobmVzcyApICogKCBjdWJlVVZfbTYgLSBjdWJlVVZfbTUgKSAvICggY3ViZVVWX3I1IC0gY3ViZVVWX3I2ICkgKyBjdWJlVVZfbTU7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdG1pcCA9IC0gMi4wICogbG9nMiggMS4xNiAqIHJvdWdobmVzcyApOyAvLyAxLjE2ID0gMS43OV4wLjI1XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG1pcDtcclxuXHJcblx0fVxyXG5cclxuXHR2ZWM0IHRleHR1cmVDdWJlVVYoIHNhbXBsZXIyRCBlbnZNYXAsIHZlYzMgc2FtcGxlRGlyLCBmbG9hdCByb3VnaG5lc3MgKSB7XHJcblxyXG5cdFx0ZmxvYXQgbWlwID0gY2xhbXAoIHJvdWdobmVzc1RvTWlwKCByb3VnaG5lc3MgKSwgY3ViZVVWX20wLCBDVUJFVVZfTUFYX01JUCApO1xyXG5cclxuXHRcdGZsb2F0IG1pcEYgPSBmcmFjdCggbWlwICk7XHJcblxyXG5cdFx0ZmxvYXQgbWlwSW50ID0gZmxvb3IoIG1pcCApO1xyXG5cclxuXHRcdHZlYzMgY29sb3IwID0gYmlsaW5lYXJDdWJlVVYoIGVudk1hcCwgc2FtcGxlRGlyLCBtaXBJbnQgKTtcclxuXHJcblx0XHRpZiAoIG1pcEYgPT0gMC4wICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIHZlYzQoIGNvbG9yMCwgMS4wICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHZlYzMgY29sb3IxID0gYmlsaW5lYXJDdWJlVVYoIGVudk1hcCwgc2FtcGxlRGlyLCBtaXBJbnQgKyAxLjAgKTtcclxuXHJcblx0XHRcdHJldHVybiB2ZWM0KCBtaXgoIGNvbG9yMCwgY29sb3IxLCBtaXBGICksIDEuMCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcblxyXG52ZWMzIHRyYW5zZm9ybWVkTm9ybWFsID0gb2JqZWN0Tm9ybWFsO1xyXG4jaWZkZWYgVVNFX1RBTkdFTlRcclxuXHJcblx0dmVjMyB0cmFuc2Zvcm1lZFRhbmdlbnQgPSBvYmplY3RUYW5nZW50O1xyXG5cclxuI2VuZGlmXHJcblxyXG4jaWZkZWYgVVNFX0JBVENISU5HXHJcblxyXG5cdC8vIHRoaXMgaXMgaW4gbGlldSBvZiBhIHBlci1pbnN0YW5jZSBub3JtYWwtbWF0cml4XHJcblx0Ly8gc2hlYXIgdHJhbnNmb3JtcyBpbiB0aGUgaW5zdGFuY2UgbWF0cml4IGFyZSBub3Qgc3VwcG9ydGVkXHJcblxyXG5cdG1hdDMgYm0gPSBtYXQzKCBiYXRjaGluZ01hdHJpeCApO1xyXG5cdHRyYW5zZm9ybWVkTm9ybWFsIC89IHZlYzMoIGRvdCggYm1bIDAgXSwgYm1bIDAgXSApLCBkb3QoIGJtWyAxIF0sIGJtWyAxIF0gKSwgZG90KCBibVsgMiBdLCBibVsgMiBdICkgKTtcclxuXHR0cmFuc2Zvcm1lZE5vcm1hbCA9IGJtICogdHJhbnNmb3JtZWROb3JtYWw7XHJcblxyXG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxyXG5cclxuXHRcdHRyYW5zZm9ybWVkVGFuZ2VudCA9IGJtICogdHJhbnNmb3JtZWRUYW5nZW50O1xyXG5cclxuXHQjZW5kaWZcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmZGVmIFVTRV9JTlNUQU5DSU5HXHJcblxyXG5cdC8vIHRoaXMgaXMgaW4gbGlldSBvZiBhIHBlci1pbnN0YW5jZSBub3JtYWwtbWF0cml4XHJcblx0Ly8gc2hlYXIgdHJhbnNmb3JtcyBpbiB0aGUgaW5zdGFuY2UgbWF0cml4IGFyZSBub3Qgc3VwcG9ydGVkXHJcblxyXG5cdG1hdDMgaW0gPSBtYXQzKCBpbnN0YW5jZU1hdHJpeCApO1xyXG5cdHRyYW5zZm9ybWVkTm9ybWFsIC89IHZlYzMoIGRvdCggaW1bIDAgXSwgaW1bIDAgXSApLCBkb3QoIGltWyAxIF0sIGltWyAxIF0gKSwgZG90KCBpbVsgMiBdLCBpbVsgMiBdICkgKTtcclxuXHR0cmFuc2Zvcm1lZE5vcm1hbCA9IGltICogdHJhbnNmb3JtZWROb3JtYWw7XHJcblxyXG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxyXG5cclxuXHRcdHRyYW5zZm9ybWVkVGFuZ2VudCA9IGltICogdHJhbnNmb3JtZWRUYW5nZW50O1xyXG5cclxuXHQjZW5kaWZcclxuXHJcbiNlbmRpZlxyXG5cclxudHJhbnNmb3JtZWROb3JtYWwgPSBub3JtYWxNYXRyaXggKiB0cmFuc2Zvcm1lZE5vcm1hbDtcclxuXHJcbiNpZmRlZiBGTElQX1NJREVEXHJcblxyXG5cdHRyYW5zZm9ybWVkTm9ybWFsID0gLSB0cmFuc2Zvcm1lZE5vcm1hbDtcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmZGVmIFVTRV9UQU5HRU5UXHJcblxyXG5cdHRyYW5zZm9ybWVkVGFuZ2VudCA9ICggbW9kZWxWaWV3TWF0cml4ICogdmVjNCggdHJhbnNmb3JtZWRUYW5nZW50LCAwLjAgKSApLnh5ejtcclxuXHJcblx0I2lmZGVmIEZMSVBfU0lERURcclxuXHJcblx0XHR0cmFuc2Zvcm1lZFRhbmdlbnQgPSAtIHRyYW5zZm9ybWVkVGFuZ2VudDtcclxuXHJcblx0I2VuZGlmXHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVBcclxuXHJcblx0dW5pZm9ybSBzYW1wbGVyMkQgZGlzcGxhY2VtZW50TWFwO1xyXG5cdHVuaWZvcm0gZmxvYXQgZGlzcGxhY2VtZW50U2NhbGU7XHJcblx0dW5pZm9ybSBmbG9hdCBkaXNwbGFjZW1lbnRCaWFzO1xyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbiNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQXHJcblxyXG5cdHRyYW5zZm9ybWVkICs9IG5vcm1hbGl6ZSggb2JqZWN0Tm9ybWFsICkgKiAoIHRleHR1cmUyRCggZGlzcGxhY2VtZW50TWFwLCB2RGlzcGxhY2VtZW50TWFwVXYgKS54ICogZGlzcGxhY2VtZW50U2NhbGUgKyBkaXNwbGFjZW1lbnRCaWFzICk7XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmZGVmIFVTRV9FTUlTU0lWRU1BUFxyXG5cclxuXHR2ZWM0IGVtaXNzaXZlQ29sb3IgPSB0ZXh0dXJlMkQoIGVtaXNzaXZlTWFwLCB2RW1pc3NpdmVNYXBVdiApO1xyXG5cclxuXHQjaWZkZWYgREVDT0RFX1ZJREVPX1RFWFRVUkVfRU1JU1NJVkVcclxuXHJcblx0XHQvLyB1c2UgaW5saW5lIHNSR0IgZGVjb2RlIHVudGlsIGJyb3dzZXJzIHByb3Blcmx5IHN1cHBvcnQgU1JHQjhfQUxQSEE4IHdpdGggdmlkZW8gdGV4dHVyZXMgKCMyNjUxNilcclxuXHJcblx0XHRlbWlzc2l2ZUNvbG9yID0gc1JHQlRyYW5zZmVyRU9URiggZW1pc3NpdmVDb2xvciApO1xyXG5cclxuXHQjZW5kaWZcclxuXHJcblx0dG90YWxFbWlzc2l2ZVJhZGlhbmNlICo9IGVtaXNzaXZlQ29sb3IucmdiO1xyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbiNpZmRlZiBVU0VfRU1JU1NJVkVNQVBcclxuXHJcblx0dW5pZm9ybSBzYW1wbGVyMkQgZW1pc3NpdmVNYXA7XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuZ2xfRnJhZ0NvbG9yID0gbGluZWFyVG9PdXRwdXRUZXhlbCggZ2xfRnJhZ0NvbG9yICk7XHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcblxyXG52ZWM0IExpbmVhclRyYW5zZmVyT0VURiggaW4gdmVjNCB2YWx1ZSApIHtcclxuXHRyZXR1cm4gdmFsdWU7XHJcbn1cclxuXHJcbnZlYzQgc1JHQlRyYW5zZmVyRU9URiggaW4gdmVjNCB2YWx1ZSApIHtcclxuXHRyZXR1cm4gdmVjNCggbWl4KCBwb3coIHZhbHVlLnJnYiAqIDAuOTQ3ODY3Mjk4NiArIHZlYzMoIDAuMDUyMTMyNzAxNCApLCB2ZWMzKCAyLjQgKSApLCB2YWx1ZS5yZ2IgKiAwLjA3NzM5OTM4MDgsIHZlYzMoIGxlc3NUaGFuRXF1YWwoIHZhbHVlLnJnYiwgdmVjMyggMC4wNDA0NSApICkgKSApLCB2YWx1ZS5hICk7XHJcbn1cclxuXHJcbnZlYzQgc1JHQlRyYW5zZmVyT0VURiggaW4gdmVjNCB2YWx1ZSApIHtcclxuXHRyZXR1cm4gdmVjNCggbWl4KCBwb3coIHZhbHVlLnJnYiwgdmVjMyggMC40MTY2NiApICkgKiAxLjA1NSAtIHZlYzMoIDAuMDU1ICksIHZhbHVlLnJnYiAqIDEyLjkyLCB2ZWMzKCBsZXNzVGhhbkVxdWFsKCB2YWx1ZS5yZ2IsIHZlYzMoIDAuMDAzMTMwOCApICkgKSApLCB2YWx1ZS5hICk7XHJcbn1cclxuXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbiNpZmRlZiBVU0VfRU5WTUFQXHJcblxyXG5cdCNpZmRlZiBFTlZfV09STERQT1NcclxuXHJcblx0XHR2ZWMzIGNhbWVyYVRvRnJhZztcclxuXHJcblx0XHRpZiAoIGlzT3J0aG9ncmFwaGljICkge1xyXG5cclxuXHRcdFx0Y2FtZXJhVG9GcmFnID0gbm9ybWFsaXplKCB2ZWMzKCAtIHZpZXdNYXRyaXhbIDAgXVsgMiBdLCAtIHZpZXdNYXRyaXhbIDEgXVsgMiBdLCAtIHZpZXdNYXRyaXhbIDIgXVsgMiBdICkgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y2FtZXJhVG9GcmFnID0gbm9ybWFsaXplKCB2V29ybGRQb3NpdGlvbiAtIGNhbWVyYVBvc2l0aW9uICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFRyYW5zZm9ybWluZyBOb3JtYWwgVmVjdG9ycyB3aXRoIHRoZSBJbnZlcnNlIFRyYW5zZm9ybWF0aW9uXHJcblx0XHR2ZWMzIHdvcmxkTm9ybWFsID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggbm9ybWFsLCB2aWV3TWF0cml4ICk7XHJcblxyXG5cdFx0I2lmZGVmIEVOVk1BUF9NT0RFX1JFRkxFQ1RJT05cclxuXHJcblx0XHRcdHZlYzMgcmVmbGVjdFZlYyA9IHJlZmxlY3QoIGNhbWVyYVRvRnJhZywgd29ybGROb3JtYWwgKTtcclxuXHJcblx0XHQjZWxzZVxyXG5cclxuXHRcdFx0dmVjMyByZWZsZWN0VmVjID0gcmVmcmFjdCggY2FtZXJhVG9GcmFnLCB3b3JsZE5vcm1hbCwgcmVmcmFjdGlvblJhdGlvICk7XHJcblxyXG5cdFx0I2VuZGlmXHJcblxyXG5cdCNlbHNlXHJcblxyXG5cdFx0dmVjMyByZWZsZWN0VmVjID0gdlJlZmxlY3Q7XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuXHQjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRVxyXG5cclxuXHRcdHZlYzQgZW52Q29sb3IgPSB0ZXh0dXJlQ3ViZSggZW52TWFwLCBlbnZNYXBSb3RhdGlvbiAqIHZlYzMoIGZsaXBFbnZNYXAgKiByZWZsZWN0VmVjLngsIHJlZmxlY3RWZWMueXogKSApO1xyXG5cclxuXHQjZWxzZVxyXG5cclxuXHRcdHZlYzQgZW52Q29sb3IgPSB2ZWM0KCAwLjAgKTtcclxuXHJcblx0I2VuZGlmXHJcblxyXG5cdCNpZmRlZiBFTlZNQVBfQkxFTkRJTkdfTVVMVElQTFlcclxuXHJcblx0XHRvdXRnb2luZ0xpZ2h0ID0gbWl4KCBvdXRnb2luZ0xpZ2h0LCBvdXRnb2luZ0xpZ2h0ICogZW52Q29sb3IueHl6LCBzcGVjdWxhclN0cmVuZ3RoICogcmVmbGVjdGl2aXR5ICk7XHJcblxyXG5cdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9CTEVORElOR19NSVggKVxyXG5cclxuXHRcdG91dGdvaW5nTGlnaHQgPSBtaXgoIG91dGdvaW5nTGlnaHQsIGVudkNvbG9yLnh5eiwgc3BlY3VsYXJTdHJlbmd0aCAqIHJlZmxlY3Rpdml0eSApO1xyXG5cclxuXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfQkxFTkRJTkdfQUREIClcclxuXHJcblx0XHRvdXRnb2luZ0xpZ2h0ICs9IGVudkNvbG9yLnh5eiAqIHNwZWN1bGFyU3RyZW5ndGggKiByZWZsZWN0aXZpdHk7XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbiNpZmRlZiBVU0VfRU5WTUFQXHJcblxyXG5cdHVuaWZvcm0gZmxvYXQgZW52TWFwSW50ZW5zaXR5O1xyXG5cdHVuaWZvcm0gZmxvYXQgZmxpcEVudk1hcDtcclxuXHR1bmlmb3JtIG1hdDMgZW52TWFwUm90YXRpb247XHJcblxyXG5cdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXHJcblx0XHR1bmlmb3JtIHNhbXBsZXJDdWJlIGVudk1hcDtcclxuXHQjZWxzZVxyXG5cdFx0dW5pZm9ybSBzYW1wbGVyMkQgZW52TWFwO1xyXG5cdCNlbmRpZlxyXG5cdFxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmZGVmIFVTRV9FTlZNQVBcclxuXHJcblx0dW5pZm9ybSBmbG9hdCByZWZsZWN0aXZpdHk7XHJcblxyXG5cdCNpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBQSE9ORyApIHx8IGRlZmluZWQoIExBTUJFUlQgKVxyXG5cclxuXHRcdCNkZWZpbmUgRU5WX1dPUkxEUE9TXHJcblxyXG5cdCNlbmRpZlxyXG5cclxuXHQjaWZkZWYgRU5WX1dPUkxEUE9TXHJcblxyXG5cdFx0dmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xyXG5cdFx0dW5pZm9ybSBmbG9hdCByZWZyYWN0aW9uUmF0aW87XHJcblx0I2Vsc2VcclxuXHRcdHZhcnlpbmcgdmVjMyB2UmVmbGVjdDtcclxuXHQjZW5kaWZcclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jaWZkZWYgVVNFX0VOVk1BUFxyXG5cclxuXHQjaWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggUEhPTkcgKSB8fCBkZWZpbmVkKCBMQU1CRVJUIClcclxuXHJcblx0XHQjZGVmaW5lIEVOVl9XT1JMRFBPU1xyXG5cclxuXHQjZW5kaWZcclxuXHJcblx0I2lmZGVmIEVOVl9XT1JMRFBPU1xyXG5cdFx0XHJcblx0XHR2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XHJcblxyXG5cdCNlbHNlXHJcblxyXG5cdFx0dmFyeWluZyB2ZWMzIHZSZWZsZWN0O1xyXG5cdFx0dW5pZm9ybSBmbG9hdCByZWZyYWN0aW9uUmF0aW87XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbiNpZmRlZiBVU0VfRU5WTUFQXHJcblxyXG5cdCNpZmRlZiBFTlZfV09STERQT1NcclxuXHJcblx0XHR2V29ybGRQb3NpdGlvbiA9IHdvcmxkUG9zaXRpb24ueHl6O1xyXG5cclxuXHQjZWxzZVxyXG5cclxuXHRcdHZlYzMgY2FtZXJhVG9WZXJ0ZXg7XHJcblxyXG5cdFx0aWYgKCBpc09ydGhvZ3JhcGhpYyApIHtcclxuXHJcblx0XHRcdGNhbWVyYVRvVmVydGV4ID0gbm9ybWFsaXplKCB2ZWMzKCAtIHZpZXdNYXRyaXhbIDAgXVsgMiBdLCAtIHZpZXdNYXRyaXhbIDEgXVsgMiBdLCAtIHZpZXdNYXRyaXhbIDIgXVsgMiBdICkgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y2FtZXJhVG9WZXJ0ZXggPSBub3JtYWxpemUoIHdvcmxkUG9zaXRpb24ueHl6IC0gY2FtZXJhUG9zaXRpb24gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dmVjMyB3b3JsZE5vcm1hbCA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIHRyYW5zZm9ybWVkTm9ybWFsLCB2aWV3TWF0cml4ICk7XHJcblxyXG5cdFx0I2lmZGVmIEVOVk1BUF9NT0RFX1JFRkxFQ1RJT05cclxuXHJcblx0XHRcdHZSZWZsZWN0ID0gcmVmbGVjdCggY2FtZXJhVG9WZXJ0ZXgsIHdvcmxkTm9ybWFsICk7XHJcblxyXG5cdFx0I2Vsc2VcclxuXHJcblx0XHRcdHZSZWZsZWN0ID0gcmVmcmFjdCggY2FtZXJhVG9WZXJ0ZXgsIHdvcmxkTm9ybWFsLCByZWZyYWN0aW9uUmF0aW8gKTtcclxuXHJcblx0XHQjZW5kaWZcclxuXHJcblx0I2VuZGlmXHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmZGVmIFVTRV9GT0dcclxuXHJcblx0dkZvZ0RlcHRoID0gLSBtdlBvc2l0aW9uLno7XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmZGVmIFVTRV9GT0dcclxuXHJcblx0dmFyeWluZyBmbG9hdCB2Rm9nRGVwdGg7XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmZGVmIFVTRV9GT0dcclxuXHJcblx0I2lmZGVmIEZPR19FWFAyXHJcblxyXG5cdFx0ZmxvYXQgZm9nRmFjdG9yID0gMS4wIC0gZXhwKCAtIGZvZ0RlbnNpdHkgKiBmb2dEZW5zaXR5ICogdkZvZ0RlcHRoICogdkZvZ0RlcHRoICk7XHJcblxyXG5cdCNlbHNlXHJcblxyXG5cdFx0ZmxvYXQgZm9nRmFjdG9yID0gc21vb3Roc3RlcCggZm9nTmVhciwgZm9nRmFyLCB2Rm9nRGVwdGggKTtcclxuXHJcblx0I2VuZGlmXHJcblxyXG5cdGdsX0ZyYWdDb2xvci5yZ2IgPSBtaXgoIGdsX0ZyYWdDb2xvci5yZ2IsIGZvZ0NvbG9yLCBmb2dGYWN0b3IgKTtcclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jaWZkZWYgVVNFX0ZPR1xyXG5cclxuXHR1bmlmb3JtIHZlYzMgZm9nQ29sb3I7XHJcblx0dmFyeWluZyBmbG9hdCB2Rm9nRGVwdGg7XHJcblxyXG5cdCNpZmRlZiBGT0dfRVhQMlxyXG5cclxuXHRcdHVuaWZvcm0gZmxvYXQgZm9nRGVuc2l0eTtcclxuXHJcblx0I2Vsc2VcclxuXHJcblx0XHR1bmlmb3JtIGZsb2F0IGZvZ05lYXI7XHJcblx0XHR1bmlmb3JtIGZsb2F0IGZvZ0ZhcjtcclxuXHJcblx0I2VuZGlmXHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuXHJcbiNpZmRlZiBVU0VfR1JBRElFTlRNQVBcclxuXHJcblx0dW5pZm9ybSBzYW1wbGVyMkQgZ3JhZGllbnRNYXA7XHJcblxyXG4jZW5kaWZcclxuXHJcbnZlYzMgZ2V0R3JhZGllbnRJcnJhZGlhbmNlKCB2ZWMzIG5vcm1hbCwgdmVjMyBsaWdodERpcmVjdGlvbiApIHtcclxuXHJcblx0Ly8gZG90Tkwgd2lsbCBiZSBmcm9tIC0xLjAgdG8gMS4wXHJcblx0ZmxvYXQgZG90TkwgPSBkb3QoIG5vcm1hbCwgbGlnaHREaXJlY3Rpb24gKTtcclxuXHR2ZWMyIGNvb3JkID0gdmVjMiggZG90TkwgKiAwLjUgKyAwLjUsIDAuMCApO1xyXG5cclxuXHQjaWZkZWYgVVNFX0dSQURJRU5UTUFQXHJcblxyXG5cdFx0cmV0dXJuIHZlYzMoIHRleHR1cmUyRCggZ3JhZGllbnRNYXAsIGNvb3JkICkuciApO1xyXG5cclxuXHQjZWxzZVxyXG5cclxuXHRcdHZlYzIgZncgPSBmd2lkdGgoIGNvb3JkICkgKiAwLjU7XHJcblx0XHRyZXR1cm4gbWl4KCB2ZWMzKCAwLjcgKSwgdmVjMyggMS4wICksIHNtb290aHN0ZXAoIDAuNyAtIGZ3LngsIDAuNyArIGZ3LngsIGNvb3JkLnggKSApO1xyXG5cclxuXHQjZW5kaWZcclxuXHJcbn1cclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmZGVmIFVTRV9MSUdIVE1BUFxyXG5cclxuXHR1bmlmb3JtIHNhbXBsZXIyRCBsaWdodE1hcDtcclxuXHR1bmlmb3JtIGZsb2F0IGxpZ2h0TWFwSW50ZW5zaXR5O1xyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbkxhbWJlcnRNYXRlcmlhbCBtYXRlcmlhbDtcclxubWF0ZXJpYWwuZGlmZnVzZUNvbG9yID0gZGlmZnVzZUNvbG9yLnJnYjtcclxubWF0ZXJpYWwuc3BlY3VsYXJTdHJlbmd0aCA9IHNwZWN1bGFyU3RyZW5ndGg7XHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xyXG5cclxuc3RydWN0IExhbWJlcnRNYXRlcmlhbCB7XHJcblxyXG5cdHZlYzMgZGlmZnVzZUNvbG9yO1xyXG5cdGZsb2F0IHNwZWN1bGFyU3RyZW5ndGg7XHJcblxyXG59O1xyXG5cclxudm9pZCBSRV9EaXJlY3RfTGFtYmVydCggY29uc3QgaW4gSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVBvc2l0aW9uLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Tm9ybWFsLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Vmlld0RpciwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgY29uc3QgaW4gTGFtYmVydE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcclxuXHJcblx0ZmxvYXQgZG90TkwgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeU5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKTtcclxuXHR2ZWMzIGlycmFkaWFuY2UgPSBkb3ROTCAqIGRpcmVjdExpZ2h0LmNvbG9yO1xyXG5cclxuXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xyXG5cclxufVxyXG5cclxudm9pZCBSRV9JbmRpcmVjdERpZmZ1c2VfTGFtYmVydCggY29uc3QgaW4gdmVjMyBpcnJhZGlhbmNlLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5UG9zaXRpb24sIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlOb3JtYWwsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlWaWV3RGlyLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBjb25zdCBpbiBMYW1iZXJ0TWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xyXG5cclxuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XHJcblxyXG59XHJcblxyXG4jZGVmaW5lIFJFX0RpcmVjdFx0XHRcdFx0UkVfRGlyZWN0X0xhbWJlcnRcclxuI2RlZmluZSBSRV9JbmRpcmVjdERpZmZ1c2VcdFx0UkVfSW5kaXJlY3REaWZmdXNlX0xhbWJlcnRcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxudW5pZm9ybSBib29sIHJlY2VpdmVTaGFkb3c7XHJcbnVuaWZvcm0gdmVjMyBhbWJpZW50TGlnaHRDb2xvcjtcclxuXHJcbiNpZiBkZWZpbmVkKCBVU0VfTElHSFRfUFJPQkVTIClcclxuXHJcblx0dW5pZm9ybSB2ZWMzIGxpZ2h0UHJvYmVbIDkgXTtcclxuXHJcbiNlbmRpZlxyXG5cclxuLy8gZ2V0IHRoZSBpcnJhZGlhbmNlIChyYWRpYW5jZSBjb252b2x2ZWQgd2l0aCBjb3NpbmUgbG9iZSkgYXQgdGhlIHBvaW50ICdub3JtYWwnIG9uIHRoZSB1bml0IHNwaGVyZVxyXG4vLyBzb3VyY2U6IGh0dHBzOi8vZ3JhcGhpY3Muc3RhbmZvcmQuZWR1L3BhcGVycy9lbnZtYXAvZW52bWFwLnBkZlxyXG52ZWMzIHNoR2V0SXJyYWRpYW5jZUF0KCBpbiB2ZWMzIG5vcm1hbCwgaW4gdmVjMyBzaENvZWZmaWNpZW50c1sgOSBdICkge1xyXG5cclxuXHQvLyBub3JtYWwgaXMgYXNzdW1lZCB0byBoYXZlIHVuaXQgbGVuZ3RoXHJcblxyXG5cdGZsb2F0IHggPSBub3JtYWwueCwgeSA9IG5vcm1hbC55LCB6ID0gbm9ybWFsLno7XHJcblxyXG5cdC8vIGJhbmQgMFxyXG5cdHZlYzMgcmVzdWx0ID0gc2hDb2VmZmljaWVudHNbIDAgXSAqIDAuODg2MjI3O1xyXG5cclxuXHQvLyBiYW5kIDFcclxuXHRyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDEgXSAqIDIuMCAqIDAuNTExNjY0ICogeTtcclxuXHRyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDIgXSAqIDIuMCAqIDAuNTExNjY0ICogejtcclxuXHRyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDMgXSAqIDIuMCAqIDAuNTExNjY0ICogeDtcclxuXHJcblx0Ly8gYmFuZCAyXHJcblx0cmVzdWx0ICs9IHNoQ29lZmZpY2llbnRzWyA0IF0gKiAyLjAgKiAwLjQyOTA0MyAqIHggKiB5O1xyXG5cdHJlc3VsdCArPSBzaENvZWZmaWNpZW50c1sgNSBdICogMi4wICogMC40MjkwNDMgKiB5ICogejtcclxuXHRyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDYgXSAqICggMC43NDMxMjUgKiB6ICogeiAtIDAuMjQ3NzA4ICk7XHJcblx0cmVzdWx0ICs9IHNoQ29lZmZpY2llbnRzWyA3IF0gKiAyLjAgKiAwLjQyOTA0MyAqIHggKiB6O1xyXG5cdHJlc3VsdCArPSBzaENvZWZmaWNpZW50c1sgOCBdICogMC40MjkwNDMgKiAoIHggKiB4IC0geSAqIHkgKTtcclxuXHJcblx0cmV0dXJuIHJlc3VsdDtcclxuXHJcbn1cclxuXHJcbnZlYzMgZ2V0TGlnaHRQcm9iZUlycmFkaWFuY2UoIGNvbnN0IGluIHZlYzMgbGlnaHRQcm9iZVsgOSBdLCBjb25zdCBpbiB2ZWMzIG5vcm1hbCApIHtcclxuXHJcblx0dmVjMyB3b3JsZE5vcm1hbCA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIG5vcm1hbCwgdmlld01hdHJpeCApO1xyXG5cclxuXHR2ZWMzIGlycmFkaWFuY2UgPSBzaEdldElycmFkaWFuY2VBdCggd29ybGROb3JtYWwsIGxpZ2h0UHJvYmUgKTtcclxuXHJcblx0cmV0dXJuIGlycmFkaWFuY2U7XHJcblxyXG59XHJcblxyXG52ZWMzIGdldEFtYmllbnRMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIHZlYzMgYW1iaWVudExpZ2h0Q29sb3IgKSB7XHJcblxyXG5cdHZlYzMgaXJyYWRpYW5jZSA9IGFtYmllbnRMaWdodENvbG9yO1xyXG5cclxuXHRyZXR1cm4gaXJyYWRpYW5jZTtcclxuXHJcbn1cclxuXHJcbmZsb2F0IGdldERpc3RhbmNlQXR0ZW51YXRpb24oIGNvbnN0IGluIGZsb2F0IGxpZ2h0RGlzdGFuY2UsIGNvbnN0IGluIGZsb2F0IGN1dG9mZkRpc3RhbmNlLCBjb25zdCBpbiBmbG9hdCBkZWNheUV4cG9uZW50ICkge1xyXG5cclxuXHQvLyBiYXNlZCB1cG9uIEZyb3N0Yml0ZSAzIE1vdmluZyB0byBQaHlzaWNhbGx5LWJhc2VkIFJlbmRlcmluZ1xyXG5cdC8vIHBhZ2UgMzIsIGVxdWF0aW9uIDI2OiBFW3dpbmRvdzFdXHJcblx0Ly8gaHR0cHM6Ly9zZWJsYWdhcmRlLmZpbGVzLndvcmRwcmVzcy5jb20vMjAxNS8wNy9jb3Vyc2Vfbm90ZXNfbW92aW5nX2Zyb3N0Yml0ZV90b19wYnJfdjMyLnBkZlxyXG5cdGZsb2F0IGRpc3RhbmNlRmFsbG9mZiA9IDEuMCAvIG1heCggcG93KCBsaWdodERpc3RhbmNlLCBkZWNheUV4cG9uZW50ICksIDAuMDEgKTtcclxuXHJcblx0aWYgKCBjdXRvZmZEaXN0YW5jZSA+IDAuMCApIHtcclxuXHJcblx0XHRkaXN0YW5jZUZhbGxvZmYgKj0gcG93Miggc2F0dXJhdGUoIDEuMCAtIHBvdzQoIGxpZ2h0RGlzdGFuY2UgLyBjdXRvZmZEaXN0YW5jZSApICkgKTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gZGlzdGFuY2VGYWxsb2ZmO1xyXG5cclxufVxyXG5cclxuZmxvYXQgZ2V0U3BvdEF0dGVudWF0aW9uKCBjb25zdCBpbiBmbG9hdCBjb25lQ29zaW5lLCBjb25zdCBpbiBmbG9hdCBwZW51bWJyYUNvc2luZSwgY29uc3QgaW4gZmxvYXQgYW5nbGVDb3NpbmUgKSB7XHJcblxyXG5cdHJldHVybiBzbW9vdGhzdGVwKCBjb25lQ29zaW5lLCBwZW51bWJyYUNvc2luZSwgYW5nbGVDb3NpbmUgKTtcclxuXHJcbn1cclxuXHJcbiNpZiBOVU1fRElSX0xJR0hUUyA+IDBcclxuXHJcblx0c3RydWN0IERpcmVjdGlvbmFsTGlnaHQge1xyXG5cdFx0dmVjMyBkaXJlY3Rpb247XHJcblx0XHR2ZWMzIGNvbG9yO1xyXG5cdH07XHJcblxyXG5cdHVuaWZvcm0gRGlyZWN0aW9uYWxMaWdodCBkaXJlY3Rpb25hbExpZ2h0c1sgTlVNX0RJUl9MSUdIVFMgXTtcclxuXHJcblx0dm9pZCBnZXREaXJlY3Rpb25hbExpZ2h0SW5mbyggY29uc3QgaW4gRGlyZWN0aW9uYWxMaWdodCBkaXJlY3Rpb25hbExpZ2h0LCBvdXQgSW5jaWRlbnRMaWdodCBsaWdodCApIHtcclxuXHJcblx0XHRsaWdodC5jb2xvciA9IGRpcmVjdGlvbmFsTGlnaHQuY29sb3I7XHJcblx0XHRsaWdodC5kaXJlY3Rpb24gPSBkaXJlY3Rpb25hbExpZ2h0LmRpcmVjdGlvbjtcclxuXHRcdGxpZ2h0LnZpc2libGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG4jZW5kaWZcclxuXHJcblxyXG4jaWYgTlVNX1BPSU5UX0xJR0hUUyA+IDBcclxuXHJcblx0c3RydWN0IFBvaW50TGlnaHQge1xyXG5cdFx0dmVjMyBwb3NpdGlvbjtcclxuXHRcdHZlYzMgY29sb3I7XHJcblx0XHRmbG9hdCBkaXN0YW5jZTtcclxuXHRcdGZsb2F0IGRlY2F5O1xyXG5cdH07XHJcblxyXG5cdHVuaWZvcm0gUG9pbnRMaWdodCBwb2ludExpZ2h0c1sgTlVNX1BPSU5UX0xJR0hUUyBdO1xyXG5cclxuXHQvLyBsaWdodCBpcyBhbiBvdXQgcGFyYW1ldGVyIGFzIGhhdmluZyBpdCBhcyBhIHJldHVybiB2YWx1ZSBjYXVzZWQgY29tcGlsZXIgZXJyb3JzIG9uIHNvbWUgZGV2aWNlc1xyXG5cdHZvaWQgZ2V0UG9pbnRMaWdodEluZm8oIGNvbnN0IGluIFBvaW50TGlnaHQgcG9pbnRMaWdodCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVBvc2l0aW9uLCBvdXQgSW5jaWRlbnRMaWdodCBsaWdodCApIHtcclxuXHJcblx0XHR2ZWMzIGxWZWN0b3IgPSBwb2ludExpZ2h0LnBvc2l0aW9uIC0gZ2VvbWV0cnlQb3NpdGlvbjtcclxuXHJcblx0XHRsaWdodC5kaXJlY3Rpb24gPSBub3JtYWxpemUoIGxWZWN0b3IgKTtcclxuXHJcblx0XHRmbG9hdCBsaWdodERpc3RhbmNlID0gbGVuZ3RoKCBsVmVjdG9yICk7XHJcblxyXG5cdFx0bGlnaHQuY29sb3IgPSBwb2ludExpZ2h0LmNvbG9yO1xyXG5cdFx0bGlnaHQuY29sb3IgKj0gZ2V0RGlzdGFuY2VBdHRlbnVhdGlvbiggbGlnaHREaXN0YW5jZSwgcG9pbnRMaWdodC5kaXN0YW5jZSwgcG9pbnRMaWdodC5kZWNheSApO1xyXG5cdFx0bGlnaHQudmlzaWJsZSA9ICggbGlnaHQuY29sb3IgIT0gdmVjMyggMC4wICkgKTtcclxuXHJcblx0fVxyXG5cclxuI2VuZGlmXHJcblxyXG5cclxuI2lmIE5VTV9TUE9UX0xJR0hUUyA+IDBcclxuXHJcblx0c3RydWN0IFNwb3RMaWdodCB7XHJcblx0XHR2ZWMzIHBvc2l0aW9uO1xyXG5cdFx0dmVjMyBkaXJlY3Rpb247XHJcblx0XHR2ZWMzIGNvbG9yO1xyXG5cdFx0ZmxvYXQgZGlzdGFuY2U7XHJcblx0XHRmbG9hdCBkZWNheTtcclxuXHRcdGZsb2F0IGNvbmVDb3M7XHJcblx0XHRmbG9hdCBwZW51bWJyYUNvcztcclxuXHR9O1xyXG5cclxuXHR1bmlmb3JtIFNwb3RMaWdodCBzcG90TGlnaHRzWyBOVU1fU1BPVF9MSUdIVFMgXTtcclxuXHJcblx0Ly8gbGlnaHQgaXMgYW4gb3V0IHBhcmFtZXRlciBhcyBoYXZpbmcgaXQgYXMgYSByZXR1cm4gdmFsdWUgY2F1c2VkIGNvbXBpbGVyIGVycm9ycyBvbiBzb21lIGRldmljZXNcclxuXHR2b2lkIGdldFNwb3RMaWdodEluZm8oIGNvbnN0IGluIFNwb3RMaWdodCBzcG90TGlnaHQsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlQb3NpdGlvbiwgb3V0IEluY2lkZW50TGlnaHQgbGlnaHQgKSB7XHJcblxyXG5cdFx0dmVjMyBsVmVjdG9yID0gc3BvdExpZ2h0LnBvc2l0aW9uIC0gZ2VvbWV0cnlQb3NpdGlvbjtcclxuXHJcblx0XHRsaWdodC5kaXJlY3Rpb24gPSBub3JtYWxpemUoIGxWZWN0b3IgKTtcclxuXHJcblx0XHRmbG9hdCBhbmdsZUNvcyA9IGRvdCggbGlnaHQuZGlyZWN0aW9uLCBzcG90TGlnaHQuZGlyZWN0aW9uICk7XHJcblxyXG5cdFx0ZmxvYXQgc3BvdEF0dGVudWF0aW9uID0gZ2V0U3BvdEF0dGVudWF0aW9uKCBzcG90TGlnaHQuY29uZUNvcywgc3BvdExpZ2h0LnBlbnVtYnJhQ29zLCBhbmdsZUNvcyApO1xyXG5cclxuXHRcdGlmICggc3BvdEF0dGVudWF0aW9uID4gMC4wICkge1xyXG5cclxuXHRcdFx0ZmxvYXQgbGlnaHREaXN0YW5jZSA9IGxlbmd0aCggbFZlY3RvciApO1xyXG5cclxuXHRcdFx0bGlnaHQuY29sb3IgPSBzcG90TGlnaHQuY29sb3IgKiBzcG90QXR0ZW51YXRpb247XHJcblx0XHRcdGxpZ2h0LmNvbG9yICo9IGdldERpc3RhbmNlQXR0ZW51YXRpb24oIGxpZ2h0RGlzdGFuY2UsIHNwb3RMaWdodC5kaXN0YW5jZSwgc3BvdExpZ2h0LmRlY2F5ICk7XHJcblx0XHRcdGxpZ2h0LnZpc2libGUgPSAoIGxpZ2h0LmNvbG9yICE9IHZlYzMoIDAuMCApICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGxpZ2h0LmNvbG9yID0gdmVjMyggMC4wICk7XHJcblx0XHRcdGxpZ2h0LnZpc2libGUgPSBmYWxzZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbiNlbmRpZlxyXG5cclxuXHJcbiNpZiBOVU1fUkVDVF9BUkVBX0xJR0hUUyA+IDBcclxuXHJcblx0c3RydWN0IFJlY3RBcmVhTGlnaHQge1xyXG5cdFx0dmVjMyBjb2xvcjtcclxuXHRcdHZlYzMgcG9zaXRpb247XHJcblx0XHR2ZWMzIGhhbGZXaWR0aDtcclxuXHRcdHZlYzMgaGFsZkhlaWdodDtcclxuXHR9O1xyXG5cclxuXHQvLyBQcmUtY29tcHV0ZWQgdmFsdWVzIG9mIExpbmVhclRyYW5zZm9ybWVkQ29zaW5lIGFwcHJveGltYXRpb24gb2YgQlJERlxyXG5cdC8vIEJSREYgYXBwcm94aW1hdGlvbiBUZXh0dXJlIGlzIDY0eDY0XHJcblx0dW5pZm9ybSBzYW1wbGVyMkQgbHRjXzE7IC8vIFJHQkEgRmxvYXRcclxuXHR1bmlmb3JtIHNhbXBsZXIyRCBsdGNfMjsgLy8gUkdCQSBGbG9hdFxyXG5cclxuXHR1bmlmb3JtIFJlY3RBcmVhTGlnaHQgcmVjdEFyZWFMaWdodHNbIE5VTV9SRUNUX0FSRUFfTElHSFRTIF07XHJcblxyXG4jZW5kaWZcclxuXHJcblxyXG4jaWYgTlVNX0hFTUlfTElHSFRTID4gMFxyXG5cclxuXHRzdHJ1Y3QgSGVtaXNwaGVyZUxpZ2h0IHtcclxuXHRcdHZlYzMgZGlyZWN0aW9uO1xyXG5cdFx0dmVjMyBza3lDb2xvcjtcclxuXHRcdHZlYzMgZ3JvdW5kQ29sb3I7XHJcblx0fTtcclxuXHJcblx0dW5pZm9ybSBIZW1pc3BoZXJlTGlnaHQgaGVtaXNwaGVyZUxpZ2h0c1sgTlVNX0hFTUlfTElHSFRTIF07XHJcblxyXG5cdHZlYzMgZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gSGVtaXNwaGVyZUxpZ2h0IGhlbWlMaWdodCwgY29uc3QgaW4gdmVjMyBub3JtYWwgKSB7XHJcblxyXG5cdFx0ZmxvYXQgZG90TkwgPSBkb3QoIG5vcm1hbCwgaGVtaUxpZ2h0LmRpcmVjdGlvbiApO1xyXG5cdFx0ZmxvYXQgaGVtaURpZmZ1c2VXZWlnaHQgPSAwLjUgKiBkb3ROTCArIDAuNTtcclxuXHJcblx0XHR2ZWMzIGlycmFkaWFuY2UgPSBtaXgoIGhlbWlMaWdodC5ncm91bmRDb2xvciwgaGVtaUxpZ2h0LnNreUNvbG9yLCBoZW1pRGlmZnVzZVdlaWdodCApO1xyXG5cclxuXHRcdHJldHVybiBpcnJhZGlhbmNlO1xyXG5cclxuXHR9XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmZGVmIFVTRV9FTlZNQVBcclxuXHJcblx0dmVjMyBnZXRJQkxJcnJhZGlhbmNlKCBjb25zdCBpbiB2ZWMzIG5vcm1hbCApIHtcclxuXHJcblx0XHQjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRV9VVlxyXG5cclxuXHRcdFx0dmVjMyB3b3JsZE5vcm1hbCA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIG5vcm1hbCwgdmlld01hdHJpeCApO1xyXG5cclxuXHRcdFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmVDdWJlVVYoIGVudk1hcCwgZW52TWFwUm90YXRpb24gKiB3b3JsZE5vcm1hbCwgMS4wICk7XHJcblxyXG5cdFx0XHRyZXR1cm4gUEkgKiBlbnZNYXBDb2xvci5yZ2IgKiBlbnZNYXBJbnRlbnNpdHk7XHJcblxyXG5cdFx0I2Vsc2VcclxuXHJcblx0XHRcdHJldHVybiB2ZWMzKCAwLjAgKTtcclxuXHJcblx0XHQjZW5kaWZcclxuXHJcblx0fVxyXG5cclxuXHR2ZWMzIGdldElCTFJhZGlhbmNlKCBjb25zdCBpbiB2ZWMzIHZpZXdEaXIsIGNvbnN0IGluIHZlYzMgbm9ybWFsLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XHJcblxyXG5cdFx0I2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVfVVZcclxuXHJcblx0XHRcdHZlYzMgcmVmbGVjdFZlYyA9IHJlZmxlY3QoIC0gdmlld0Rpciwgbm9ybWFsICk7XHJcblxyXG5cdFx0XHQvLyBNaXhpbmcgdGhlIHJlZmxlY3Rpb24gd2l0aCB0aGUgbm9ybWFsIGlzIG1vcmUgYWNjdXJhdGUgYW5kIGtlZXBzIHJvdWdoIG9iamVjdHMgZnJvbSBnYXRoZXJpbmcgbGlnaHQgZnJvbSBiZWhpbmQgdGhlaXIgdGFuZ2VudCBwbGFuZS5cclxuXHRcdFx0cmVmbGVjdFZlYyA9IG5vcm1hbGl6ZSggbWl4KCByZWZsZWN0VmVjLCBub3JtYWwsIHJvdWdobmVzcyAqIHJvdWdobmVzcykgKTtcclxuXHJcblx0XHRcdHJlZmxlY3RWZWMgPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCByZWZsZWN0VmVjLCB2aWV3TWF0cml4ICk7XHJcblxyXG5cdFx0XHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZUN1YmVVViggZW52TWFwLCBlbnZNYXBSb3RhdGlvbiAqIHJlZmxlY3RWZWMsIHJvdWdobmVzcyApO1xyXG5cclxuXHRcdFx0cmV0dXJuIGVudk1hcENvbG9yLnJnYiAqIGVudk1hcEludGVuc2l0eTtcclxuXHJcblx0XHQjZWxzZVxyXG5cclxuXHRcdFx0cmV0dXJuIHZlYzMoIDAuMCApO1xyXG5cclxuXHRcdCNlbmRpZlxyXG5cclxuXHR9XHJcblxyXG5cdCNpZmRlZiBVU0VfQU5JU09UUk9QWVxyXG5cclxuXHRcdHZlYzMgZ2V0SUJMQW5pc290cm9weVJhZGlhbmNlKCBjb25zdCBpbiB2ZWMzIHZpZXdEaXIsIGNvbnN0IGluIHZlYzMgbm9ybWFsLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGNvbnN0IGluIHZlYzMgYml0YW5nZW50LCBjb25zdCBpbiBmbG9hdCBhbmlzb3Ryb3B5ICkge1xyXG5cclxuXHRcdFx0I2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVfVVZcclxuXHJcblx0XHRcdCAgLy8gaHR0cHM6Ly9nb29nbGUuZ2l0aHViLmlvL2ZpbGFtZW50L0ZpbGFtZW50Lm1kLmh0bWwjbGlnaHRpbmcvaW1hZ2ViYXNlZGxpZ2h0cy9hbmlzb3Ryb3B5XHJcblx0XHRcdFx0dmVjMyBiZW50Tm9ybWFsID0gY3Jvc3MoIGJpdGFuZ2VudCwgdmlld0RpciApO1xyXG5cdFx0XHRcdGJlbnROb3JtYWwgPSBub3JtYWxpemUoIGNyb3NzKCBiZW50Tm9ybWFsLCBiaXRhbmdlbnQgKSApO1xyXG5cdFx0XHRcdGJlbnROb3JtYWwgPSBub3JtYWxpemUoIG1peCggYmVudE5vcm1hbCwgbm9ybWFsLCBwb3cyKCBwb3cyKCAxLjAgLSBhbmlzb3Ryb3B5ICogKCAxLjAgLSByb3VnaG5lc3MgKSApICkgKSApO1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gZ2V0SUJMUmFkaWFuY2UoIHZpZXdEaXIsIGJlbnROb3JtYWwsIHJvdWdobmVzcyApO1xyXG5cclxuXHRcdFx0I2Vsc2VcclxuXHJcblx0XHRcdFx0cmV0dXJuIHZlYzMoIDAuMCApO1xyXG5cclxuXHRcdFx0I2VuZGlmXHJcblxyXG5cdFx0fVxyXG5cclxuXHQjZW5kaWZcclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG5Ub29uTWF0ZXJpYWwgbWF0ZXJpYWw7XHJcbm1hdGVyaWFsLmRpZmZ1c2VDb2xvciA9IGRpZmZ1c2VDb2xvci5yZ2I7XHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xyXG5cclxuc3RydWN0IFRvb25NYXRlcmlhbCB7XHJcblxyXG5cdHZlYzMgZGlmZnVzZUNvbG9yO1xyXG5cclxufTtcclxuXHJcbnZvaWQgUkVfRGlyZWN0X1Rvb24oIGNvbnN0IGluIEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlQb3NpdGlvbiwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeU5vcm1hbCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVZpZXdEaXIsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIGNvbnN0IGluIFRvb25NYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XHJcblxyXG5cdHZlYzMgaXJyYWRpYW5jZSA9IGdldEdyYWRpZW50SXJyYWRpYW5jZSggZ2VvbWV0cnlOb3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICogZGlyZWN0TGlnaHQuY29sb3I7XHJcblxyXG5cdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XHJcblxyXG59XHJcblxyXG52b2lkIFJFX0luZGlyZWN0RGlmZnVzZV9Ub29uKCBjb25zdCBpbiB2ZWMzIGlycmFkaWFuY2UsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlQb3NpdGlvbiwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeU5vcm1hbCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVZpZXdEaXIsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIGNvbnN0IGluIFRvb25NYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XHJcblxyXG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcclxuXHJcbn1cclxuXHJcbiNkZWZpbmUgUkVfRGlyZWN0XHRcdFx0XHRSRV9EaXJlY3RfVG9vblxyXG4jZGVmaW5lIFJFX0luZGlyZWN0RGlmZnVzZVx0XHRSRV9JbmRpcmVjdERpZmZ1c2VfVG9vblxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG5CbGlublBob25nTWF0ZXJpYWwgbWF0ZXJpYWw7XHJcbm1hdGVyaWFsLmRpZmZ1c2VDb2xvciA9IGRpZmZ1c2VDb2xvci5yZ2I7XHJcbm1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgPSBzcGVjdWxhcjtcclxubWF0ZXJpYWwuc3BlY3VsYXJTaGluaW5lc3MgPSBzaGluaW5lc3M7XHJcbm1hdGVyaWFsLnNwZWN1bGFyU3RyZW5ndGggPSBzcGVjdWxhclN0cmVuZ3RoO1xyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcclxuXHJcbnN0cnVjdCBCbGlublBob25nTWF0ZXJpYWwge1xyXG5cclxuXHR2ZWMzIGRpZmZ1c2VDb2xvcjtcclxuXHR2ZWMzIHNwZWN1bGFyQ29sb3I7XHJcblx0ZmxvYXQgc3BlY3VsYXJTaGluaW5lc3M7XHJcblx0ZmxvYXQgc3BlY3VsYXJTdHJlbmd0aDtcclxuXHJcbn07XHJcblxyXG52b2lkIFJFX0RpcmVjdF9CbGlublBob25nKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0LCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5UG9zaXRpb24sIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlOb3JtYWwsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlWaWV3RGlyLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBjb25zdCBpbiBCbGlublBob25nTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xyXG5cclxuXHRmbG9hdCBkb3ROTCA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Tm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKSApO1xyXG5cdHZlYzMgaXJyYWRpYW5jZSA9IGRvdE5MICogZGlyZWN0TGlnaHQuY29sb3I7XHJcblxyXG5cdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XHJcblxyXG5cdHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICs9IGlycmFkaWFuY2UgKiBCUkRGX0JsaW5uUGhvbmcoIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiwgZ2VvbWV0cnlWaWV3RGlyLCBnZW9tZXRyeU5vcm1hbCwgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciwgbWF0ZXJpYWwuc3BlY3VsYXJTaGluaW5lc3MgKSAqIG1hdGVyaWFsLnNwZWN1bGFyU3RyZW5ndGg7XHJcblxyXG59XHJcblxyXG52b2lkIFJFX0luZGlyZWN0RGlmZnVzZV9CbGlublBob25nKCBjb25zdCBpbiB2ZWMzIGlycmFkaWFuY2UsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlQb3NpdGlvbiwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeU5vcm1hbCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVZpZXdEaXIsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIGNvbnN0IGluIEJsaW5uUGhvbmdNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XHJcblxyXG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcclxuXHJcbn1cclxuXHJcbiNkZWZpbmUgUkVfRGlyZWN0XHRcdFx0XHRSRV9EaXJlY3RfQmxpbm5QaG9uZ1xyXG4jZGVmaW5lIFJFX0luZGlyZWN0RGlmZnVzZVx0XHRSRV9JbmRpcmVjdERpZmZ1c2VfQmxpbm5QaG9uZ1xyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG5QaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsO1xyXG5tYXRlcmlhbC5kaWZmdXNlQ29sb3IgPSBkaWZmdXNlQ29sb3IucmdiICogKCAxLjAgLSBtZXRhbG5lc3NGYWN0b3IgKTtcclxuXHJcbnZlYzMgZHh5ID0gbWF4KCBhYnMoIGRGZHgoIG5vblBlcnR1cmJlZE5vcm1hbCApICksIGFicyggZEZkeSggbm9uUGVydHVyYmVkTm9ybWFsICkgKSApO1xyXG5mbG9hdCBnZW9tZXRyeVJvdWdobmVzcyA9IG1heCggbWF4KCBkeHkueCwgZHh5LnkgKSwgZHh5LnogKTtcclxuXHJcbm1hdGVyaWFsLnJvdWdobmVzcyA9IG1heCggcm91Z2huZXNzRmFjdG9yLCAwLjA1MjUgKTsvLyAwLjA1MjUgY29ycmVzcG9uZHMgdG8gdGhlIGJhc2UgbWlwIG9mIGEgMjU2IGN1YmVtYXAuXHJcbm1hdGVyaWFsLnJvdWdobmVzcyArPSBnZW9tZXRyeVJvdWdobmVzcztcclxubWF0ZXJpYWwucm91Z2huZXNzID0gbWluKCBtYXRlcmlhbC5yb3VnaG5lc3MsIDEuMCApO1xyXG5cclxuI2lmZGVmIElPUlxyXG5cclxuXHRtYXRlcmlhbC5pb3IgPSBpb3I7XHJcblxyXG5cdCNpZmRlZiBVU0VfU1BFQ1VMQVJcclxuXHJcblx0XHRmbG9hdCBzcGVjdWxhckludGVuc2l0eUZhY3RvciA9IHNwZWN1bGFySW50ZW5zaXR5O1xyXG5cdFx0dmVjMyBzcGVjdWxhckNvbG9yRmFjdG9yID0gc3BlY3VsYXJDb2xvcjtcclxuXHJcblx0XHQjaWZkZWYgVVNFX1NQRUNVTEFSX0NPTE9STUFQXHJcblxyXG5cdFx0XHRzcGVjdWxhckNvbG9yRmFjdG9yICo9IHRleHR1cmUyRCggc3BlY3VsYXJDb2xvck1hcCwgdlNwZWN1bGFyQ29sb3JNYXBVdiApLnJnYjtcclxuXHJcblx0XHQjZW5kaWZcclxuXHJcblx0XHQjaWZkZWYgVVNFX1NQRUNVTEFSX0lOVEVOU0lUWU1BUFxyXG5cclxuXHRcdFx0c3BlY3VsYXJJbnRlbnNpdHlGYWN0b3IgKj0gdGV4dHVyZTJEKCBzcGVjdWxhckludGVuc2l0eU1hcCwgdlNwZWN1bGFySW50ZW5zaXR5TWFwVXYgKS5hO1xyXG5cclxuXHRcdCNlbmRpZlxyXG5cclxuXHRcdG1hdGVyaWFsLnNwZWN1bGFyRjkwID0gbWl4KCBzcGVjdWxhckludGVuc2l0eUZhY3RvciwgMS4wLCBtZXRhbG5lc3NGYWN0b3IgKTtcclxuXHJcblx0I2Vsc2VcclxuXHJcblx0XHRmbG9hdCBzcGVjdWxhckludGVuc2l0eUZhY3RvciA9IDEuMDtcclxuXHRcdHZlYzMgc3BlY3VsYXJDb2xvckZhY3RvciA9IHZlYzMoIDEuMCApO1xyXG5cdFx0bWF0ZXJpYWwuc3BlY3VsYXJGOTAgPSAxLjA7XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuXHRtYXRlcmlhbC5zcGVjdWxhckNvbG9yID0gbWl4KCBtaW4oIHBvdzIoICggbWF0ZXJpYWwuaW9yIC0gMS4wICkgLyAoIG1hdGVyaWFsLmlvciArIDEuMCApICkgKiBzcGVjdWxhckNvbG9yRmFjdG9yLCB2ZWMzKCAxLjAgKSApICogc3BlY3VsYXJJbnRlbnNpdHlGYWN0b3IsIGRpZmZ1c2VDb2xvci5yZ2IsIG1ldGFsbmVzc0ZhY3RvciApO1xyXG5cclxuI2Vsc2VcclxuXHJcblx0bWF0ZXJpYWwuc3BlY3VsYXJDb2xvciA9IG1peCggdmVjMyggMC4wNCApLCBkaWZmdXNlQ29sb3IucmdiLCBtZXRhbG5lc3NGYWN0b3IgKTtcclxuXHRtYXRlcmlhbC5zcGVjdWxhckY5MCA9IDEuMDtcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmZGVmIFVTRV9DTEVBUkNPQVRcclxuXHJcblx0bWF0ZXJpYWwuY2xlYXJjb2F0ID0gY2xlYXJjb2F0O1xyXG5cdG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcyA9IGNsZWFyY29hdFJvdWdobmVzcztcclxuXHRtYXRlcmlhbC5jbGVhcmNvYXRGMCA9IHZlYzMoIDAuMDQgKTtcclxuXHRtYXRlcmlhbC5jbGVhcmNvYXRGOTAgPSAxLjA7XHJcblxyXG5cdCNpZmRlZiBVU0VfQ0xFQVJDT0FUTUFQXHJcblxyXG5cdFx0bWF0ZXJpYWwuY2xlYXJjb2F0ICo9IHRleHR1cmUyRCggY2xlYXJjb2F0TWFwLCB2Q2xlYXJjb2F0TWFwVXYgKS54O1xyXG5cclxuXHQjZW5kaWZcclxuXHJcblx0I2lmZGVmIFVTRV9DTEVBUkNPQVRfUk9VR0hORVNTTUFQXHJcblxyXG5cdFx0bWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzICo9IHRleHR1cmUyRCggY2xlYXJjb2F0Um91Z2huZXNzTWFwLCB2Q2xlYXJjb2F0Um91Z2huZXNzTWFwVXYgKS55O1xyXG5cclxuXHQjZW5kaWZcclxuXHJcblx0bWF0ZXJpYWwuY2xlYXJjb2F0ID0gc2F0dXJhdGUoIG1hdGVyaWFsLmNsZWFyY29hdCApOyAvLyBCdXJsZXkgY2xlYXJjb2F0IG1vZGVsXHJcblx0bWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzID0gbWF4KCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MsIDAuMDUyNSApO1xyXG5cdG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcyArPSBnZW9tZXRyeVJvdWdobmVzcztcclxuXHRtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgPSBtaW4oIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcywgMS4wICk7XHJcblxyXG4jZW5kaWZcclxuXHJcbiNpZmRlZiBVU0VfRElTUEVSU0lPTlxyXG5cclxuXHRtYXRlcmlhbC5kaXNwZXJzaW9uID0gZGlzcGVyc2lvbjtcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmZGVmIFVTRV9JUklERVNDRU5DRVxyXG5cclxuXHRtYXRlcmlhbC5pcmlkZXNjZW5jZSA9IGlyaWRlc2NlbmNlO1xyXG5cdG1hdGVyaWFsLmlyaWRlc2NlbmNlSU9SID0gaXJpZGVzY2VuY2VJT1I7XHJcblxyXG5cdCNpZmRlZiBVU0VfSVJJREVTQ0VOQ0VNQVBcclxuXHJcblx0XHRtYXRlcmlhbC5pcmlkZXNjZW5jZSAqPSB0ZXh0dXJlMkQoIGlyaWRlc2NlbmNlTWFwLCB2SXJpZGVzY2VuY2VNYXBVdiApLnI7XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuXHQjaWZkZWYgVVNFX0lSSURFU0NFTkNFX1RISUNLTkVTU01BUFxyXG5cclxuXHRcdG1hdGVyaWFsLmlyaWRlc2NlbmNlVGhpY2tuZXNzID0gKGlyaWRlc2NlbmNlVGhpY2tuZXNzTWF4aW11bSAtIGlyaWRlc2NlbmNlVGhpY2tuZXNzTWluaW11bSkgKiB0ZXh0dXJlMkQoIGlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwLCB2SXJpZGVzY2VuY2VUaGlja25lc3NNYXBVdiApLmcgKyBpcmlkZXNjZW5jZVRoaWNrbmVzc01pbmltdW07XHJcblxyXG5cdCNlbHNlXHJcblxyXG5cdFx0bWF0ZXJpYWwuaXJpZGVzY2VuY2VUaGlja25lc3MgPSBpcmlkZXNjZW5jZVRoaWNrbmVzc01heGltdW07XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuI2VuZGlmXHJcblxyXG4jaWZkZWYgVVNFX1NIRUVOXHJcblxyXG5cdG1hdGVyaWFsLnNoZWVuQ29sb3IgPSBzaGVlbkNvbG9yO1xyXG5cclxuXHQjaWZkZWYgVVNFX1NIRUVOX0NPTE9STUFQXHJcblxyXG5cdFx0bWF0ZXJpYWwuc2hlZW5Db2xvciAqPSB0ZXh0dXJlMkQoIHNoZWVuQ29sb3JNYXAsIHZTaGVlbkNvbG9yTWFwVXYgKS5yZ2I7XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuXHRtYXRlcmlhbC5zaGVlblJvdWdobmVzcyA9IGNsYW1wKCBzaGVlblJvdWdobmVzcywgMC4wNywgMS4wICk7XHJcblxyXG5cdCNpZmRlZiBVU0VfU0hFRU5fUk9VR0hORVNTTUFQXHJcblxyXG5cdFx0bWF0ZXJpYWwuc2hlZW5Sb3VnaG5lc3MgKj0gdGV4dHVyZTJEKCBzaGVlblJvdWdobmVzc01hcCwgdlNoZWVuUm91Z2huZXNzTWFwVXYgKS5hO1xyXG5cclxuXHQjZW5kaWZcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmZGVmIFVTRV9BTklTT1RST1BZXHJcblxyXG5cdCNpZmRlZiBVU0VfQU5JU09UUk9QWU1BUFxyXG5cclxuXHRcdG1hdDIgYW5pc290cm9weU1hdCA9IG1hdDIoIGFuaXNvdHJvcHlWZWN0b3IueCwgYW5pc290cm9weVZlY3Rvci55LCAtIGFuaXNvdHJvcHlWZWN0b3IueSwgYW5pc290cm9weVZlY3Rvci54ICk7XHJcblx0XHR2ZWMzIGFuaXNvdHJvcHlQb2xhciA9IHRleHR1cmUyRCggYW5pc290cm9weU1hcCwgdkFuaXNvdHJvcHlNYXBVdiApLnJnYjtcclxuXHRcdHZlYzIgYW5pc290cm9weVYgPSBhbmlzb3Ryb3B5TWF0ICogbm9ybWFsaXplKCAyLjAgKiBhbmlzb3Ryb3B5UG9sYXIucmcgLSB2ZWMyKCAxLjAgKSApICogYW5pc290cm9weVBvbGFyLmI7XHJcblxyXG5cdCNlbHNlXHJcblxyXG5cdFx0dmVjMiBhbmlzb3Ryb3B5ViA9IGFuaXNvdHJvcHlWZWN0b3I7XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuXHRtYXRlcmlhbC5hbmlzb3Ryb3B5ID0gbGVuZ3RoKCBhbmlzb3Ryb3B5ViApO1xyXG5cclxuXHRpZiggbWF0ZXJpYWwuYW5pc290cm9weSA9PSAwLjAgKSB7XHJcblx0XHRhbmlzb3Ryb3B5ViA9IHZlYzIoIDEuMCwgMC4wICk7XHJcblx0fSBlbHNlIHtcclxuXHRcdGFuaXNvdHJvcHlWIC89IG1hdGVyaWFsLmFuaXNvdHJvcHk7XHJcblx0XHRtYXRlcmlhbC5hbmlzb3Ryb3B5ID0gc2F0dXJhdGUoIG1hdGVyaWFsLmFuaXNvdHJvcHkgKTtcclxuXHR9XHJcblxyXG5cdC8vIFJvdWdobmVzcyBhbG9uZyB0aGUgYW5pc290cm9weSBiaXRhbmdlbnQgaXMgdGhlIG1hdGVyaWFsIHJvdWdobmVzcywgd2hpbGUgdGhlIHRhbmdlbnQgcm91Z2huZXNzIGluY3JlYXNlcyB3aXRoIGFuaXNvdHJvcHkuXHJcblx0bWF0ZXJpYWwuYWxwaGFUID0gbWl4KCBwb3cyKCBtYXRlcmlhbC5yb3VnaG5lc3MgKSwgMS4wLCBwb3cyKCBtYXRlcmlhbC5hbmlzb3Ryb3B5ICkgKTtcclxuXHJcblx0bWF0ZXJpYWwuYW5pc290cm9weVQgPSB0Ym5bIDAgXSAqIGFuaXNvdHJvcHlWLnggKyB0Ym5bIDEgXSAqIGFuaXNvdHJvcHlWLnk7XHJcblx0bWF0ZXJpYWwuYW5pc290cm9weUIgPSB0Ym5bIDEgXSAqIGFuaXNvdHJvcHlWLnggLSB0Ym5bIDAgXSAqIGFuaXNvdHJvcHlWLnk7XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuXHJcbnN0cnVjdCBQaHlzaWNhbE1hdGVyaWFsIHtcclxuXHJcblx0dmVjMyBkaWZmdXNlQ29sb3I7XHJcblx0ZmxvYXQgcm91Z2huZXNzO1xyXG5cdHZlYzMgc3BlY3VsYXJDb2xvcjtcclxuXHRmbG9hdCBzcGVjdWxhckY5MDtcclxuXHRmbG9hdCBkaXNwZXJzaW9uO1xyXG5cclxuXHQjaWZkZWYgVVNFX0NMRUFSQ09BVFxyXG5cdFx0ZmxvYXQgY2xlYXJjb2F0O1xyXG5cdFx0ZmxvYXQgY2xlYXJjb2F0Um91Z2huZXNzO1xyXG5cdFx0dmVjMyBjbGVhcmNvYXRGMDtcclxuXHRcdGZsb2F0IGNsZWFyY29hdEY5MDtcclxuXHQjZW5kaWZcclxuXHJcblx0I2lmZGVmIFVTRV9JUklERVNDRU5DRVxyXG5cdFx0ZmxvYXQgaXJpZGVzY2VuY2U7XHJcblx0XHRmbG9hdCBpcmlkZXNjZW5jZUlPUjtcclxuXHRcdGZsb2F0IGlyaWRlc2NlbmNlVGhpY2tuZXNzO1xyXG5cdFx0dmVjMyBpcmlkZXNjZW5jZUZyZXNuZWw7XHJcblx0XHR2ZWMzIGlyaWRlc2NlbmNlRjA7XHJcblx0I2VuZGlmXHJcblxyXG5cdCNpZmRlZiBVU0VfU0hFRU5cclxuXHRcdHZlYzMgc2hlZW5Db2xvcjtcclxuXHRcdGZsb2F0IHNoZWVuUm91Z2huZXNzO1xyXG5cdCNlbmRpZlxyXG5cclxuXHQjaWZkZWYgSU9SXHJcblx0XHRmbG9hdCBpb3I7XHJcblx0I2VuZGlmXHJcblxyXG5cdCNpZmRlZiBVU0VfVFJBTlNNSVNTSU9OXHJcblx0XHRmbG9hdCB0cmFuc21pc3Npb247XHJcblx0XHRmbG9hdCB0cmFuc21pc3Npb25BbHBoYTtcclxuXHRcdGZsb2F0IHRoaWNrbmVzcztcclxuXHRcdGZsb2F0IGF0dGVudWF0aW9uRGlzdGFuY2U7XHJcblx0XHR2ZWMzIGF0dGVudWF0aW9uQ29sb3I7XHJcblx0I2VuZGlmXHJcblxyXG5cdCNpZmRlZiBVU0VfQU5JU09UUk9QWVxyXG5cdFx0ZmxvYXQgYW5pc290cm9weTtcclxuXHRcdGZsb2F0IGFscGhhVDtcclxuXHRcdHZlYzMgYW5pc290cm9weVQ7XHJcblx0XHR2ZWMzIGFuaXNvdHJvcHlCO1xyXG5cdCNlbmRpZlxyXG5cclxufTtcclxuXHJcbi8vIHRlbXBvcmFyeVxyXG52ZWMzIGNsZWFyY29hdFNwZWN1bGFyRGlyZWN0ID0gdmVjMyggMC4wICk7XHJcbnZlYzMgY2xlYXJjb2F0U3BlY3VsYXJJbmRpcmVjdCA9IHZlYzMoIDAuMCApO1xyXG52ZWMzIHNoZWVuU3BlY3VsYXJEaXJlY3QgPSB2ZWMzKCAwLjAgKTtcclxudmVjMyBzaGVlblNwZWN1bGFySW5kaXJlY3QgPSB2ZWMzKDAuMCApO1xyXG5cclxudmVjMyBTY2hsaWNrX3RvX0YwKCBjb25zdCBpbiB2ZWMzIGYsIGNvbnN0IGluIGZsb2F0IGY5MCwgY29uc3QgaW4gZmxvYXQgZG90VkggKSB7XHJcbiAgICBmbG9hdCB4ID0gY2xhbXAoIDEuMCAtIGRvdFZILCAwLjAsIDEuMCApO1xyXG4gICAgZmxvYXQgeDIgPSB4ICogeDtcclxuICAgIGZsb2F0IHg1ID0gY2xhbXAoIHggKiB4MiAqIHgyLCAwLjAsIDAuOTk5OSApO1xyXG5cclxuICAgIHJldHVybiAoIGYgLSB2ZWMzKCBmOTAgKSAqIHg1ICkgLyAoIDEuMCAtIHg1ICk7XHJcbn1cclxuXHJcbi8vIE1vdmluZyBGcm9zdGJpdGUgdG8gUGh5c2ljYWxseSBCYXNlZCBSZW5kZXJpbmcgMy4wIC0gcGFnZSAxMiwgbGlzdGluZyAyXHJcbi8vIGh0dHBzOi8vc2VibGFnYXJkZS5maWxlcy53b3JkcHJlc3MuY29tLzIwMTUvMDcvY291cnNlX25vdGVzX21vdmluZ19mcm9zdGJpdGVfdG9fcGJyX3YzMi5wZGZcclxuZmxvYXQgVl9HR1hfU21pdGhDb3JyZWxhdGVkKCBjb25zdCBpbiBmbG9hdCBhbHBoYSwgY29uc3QgaW4gZmxvYXQgZG90TkwsIGNvbnN0IGluIGZsb2F0IGRvdE5WICkge1xyXG5cclxuXHRmbG9hdCBhMiA9IHBvdzIoIGFscGhhICk7XHJcblxyXG5cdGZsb2F0IGd2ID0gZG90TkwgKiBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5WICkgKTtcclxuXHRmbG9hdCBnbCA9IGRvdE5WICogc3FydCggYTIgKyAoIDEuMCAtIGEyICkgKiBwb3cyKCBkb3ROTCApICk7XHJcblxyXG5cdHJldHVybiAwLjUgLyBtYXgoIGd2ICsgZ2wsIEVQU0lMT04gKTtcclxuXHJcbn1cclxuXHJcbi8vIE1pY3JvZmFjZXQgTW9kZWxzIGZvciBSZWZyYWN0aW9uIHRocm91Z2ggUm91Z2ggU3VyZmFjZXMgLSBlcXVhdGlvbiAoMzMpXHJcbi8vIGh0dHA6Ly9ncmFwaGljcmFudHMuYmxvZ3Nwb3QuY29tLzIwMTMvMDgvc3BlY3VsYXItYnJkZi1yZWZlcmVuY2UuaHRtbFxyXG4vLyBhbHBoYSBpcyBcInJvdWdobmVzcyBzcXVhcmVkXCIgaW4gRGlzbmV54oCZcyByZXBhcmFtZXRlcml6YXRpb25cclxuZmxvYXQgRF9HR1goIGNvbnN0IGluIGZsb2F0IGFscGhhLCBjb25zdCBpbiBmbG9hdCBkb3ROSCApIHtcclxuXHJcblx0ZmxvYXQgYTIgPSBwb3cyKCBhbHBoYSApO1xyXG5cclxuXHRmbG9hdCBkZW5vbSA9IHBvdzIoIGRvdE5IICkgKiAoIGEyIC0gMS4wICkgKyAxLjA7IC8vIGF2b2lkIGFscGhhID0gMCB3aXRoIGRvdE5IID0gMVxyXG5cclxuXHRyZXR1cm4gUkVDSVBST0NBTF9QSSAqIGEyIC8gcG93MiggZGVub20gKTtcclxuXHJcbn1cclxuXHJcbi8vIGh0dHBzOi8vZ29vZ2xlLmdpdGh1Yi5pby9maWxhbWVudC9GaWxhbWVudC5tZC5odG1sI21hdGVyaWFsc3lzdGVtL2FuaXNvdHJvcGljbW9kZWwvYW5pc290cm9waWNzcGVjdWxhcmJyZGZcclxuI2lmZGVmIFVTRV9BTklTT1RST1BZXHJcblxyXG5cdGZsb2F0IFZfR0dYX1NtaXRoQ29ycmVsYXRlZF9Bbmlzb3Ryb3BpYyggY29uc3QgaW4gZmxvYXQgYWxwaGFULCBjb25zdCBpbiBmbG9hdCBhbHBoYUIsIGNvbnN0IGluIGZsb2F0IGRvdFRWLCBjb25zdCBpbiBmbG9hdCBkb3RCViwgY29uc3QgaW4gZmxvYXQgZG90VEwsIGNvbnN0IGluIGZsb2F0IGRvdEJMLCBjb25zdCBpbiBmbG9hdCBkb3ROViwgY29uc3QgaW4gZmxvYXQgZG90TkwgKSB7XHJcblxyXG5cdFx0ZmxvYXQgZ3YgPSBkb3ROTCAqIGxlbmd0aCggdmVjMyggYWxwaGFUICogZG90VFYsIGFscGhhQiAqIGRvdEJWLCBkb3ROViApICk7XHJcblx0XHRmbG9hdCBnbCA9IGRvdE5WICogbGVuZ3RoKCB2ZWMzKCBhbHBoYVQgKiBkb3RUTCwgYWxwaGFCICogZG90QkwsIGRvdE5MICkgKTtcclxuXHRcdGZsb2F0IHYgPSAwLjUgLyAoIGd2ICsgZ2wgKTtcclxuXHJcblx0XHRyZXR1cm4gc2F0dXJhdGUodik7XHJcblxyXG5cdH1cclxuXHJcblx0ZmxvYXQgRF9HR1hfQW5pc290cm9waWMoIGNvbnN0IGluIGZsb2F0IGFscGhhVCwgY29uc3QgaW4gZmxvYXQgYWxwaGFCLCBjb25zdCBpbiBmbG9hdCBkb3ROSCwgY29uc3QgaW4gZmxvYXQgZG90VEgsIGNvbnN0IGluIGZsb2F0IGRvdEJIICkge1xyXG5cclxuXHRcdGZsb2F0IGEyID0gYWxwaGFUICogYWxwaGFCO1xyXG5cdFx0aGlnaHAgdmVjMyB2ID0gdmVjMyggYWxwaGFCICogZG90VEgsIGFscGhhVCAqIGRvdEJILCBhMiAqIGRvdE5IICk7XHJcblx0XHRoaWdocCBmbG9hdCB2MiA9IGRvdCggdiwgdiApO1xyXG5cdFx0ZmxvYXQgdzIgPSBhMiAvIHYyO1xyXG5cclxuXHRcdHJldHVybiBSRUNJUFJPQ0FMX1BJICogYTIgKiBwb3cyICggdzIgKTtcclxuXHJcblx0fVxyXG5cclxuI2VuZGlmXHJcblxyXG4jaWZkZWYgVVNFX0NMRUFSQ09BVFxyXG5cclxuXHQvLyBHR1ggRGlzdHJpYnV0aW9uLCBTY2hsaWNrIEZyZXNuZWwsIEdHWF9TbWl0aENvcnJlbGF0ZWQgVmlzaWJpbGl0eVxyXG5cdHZlYzMgQlJERl9HR1hfQ2xlYXJjb2F0KCBjb25zdCBpbiB2ZWMzIGxpZ2h0RGlyLCBjb25zdCBpbiB2ZWMzIHZpZXdEaXIsIGNvbnN0IGluIHZlYzMgbm9ybWFsLCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsKSB7XHJcblxyXG5cdFx0dmVjMyBmMCA9IG1hdGVyaWFsLmNsZWFyY29hdEYwO1xyXG5cdFx0ZmxvYXQgZjkwID0gbWF0ZXJpYWwuY2xlYXJjb2F0RjkwO1xyXG5cdFx0ZmxvYXQgcm91Z2huZXNzID0gbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzO1xyXG5cclxuXHRcdGZsb2F0IGFscGhhID0gcG93Miggcm91Z2huZXNzICk7IC8vIFVFNCdzIHJvdWdobmVzc1xyXG5cclxuXHRcdHZlYzMgaGFsZkRpciA9IG5vcm1hbGl6ZSggbGlnaHREaXIgKyB2aWV3RGlyICk7XHJcblxyXG5cdFx0ZmxvYXQgZG90TkwgPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIGxpZ2h0RGlyICkgKTtcclxuXHRcdGZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCB2aWV3RGlyICkgKTtcclxuXHRcdGZsb2F0IGRvdE5IID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBoYWxmRGlyICkgKTtcclxuXHRcdGZsb2F0IGRvdFZIID0gc2F0dXJhdGUoIGRvdCggdmlld0RpciwgaGFsZkRpciApICk7XHJcblxyXG5cdFx0dmVjMyBGID0gRl9TY2hsaWNrKCBmMCwgZjkwLCBkb3RWSCApO1xyXG5cclxuXHRcdGZsb2F0IFYgPSBWX0dHWF9TbWl0aENvcnJlbGF0ZWQoIGFscGhhLCBkb3ROTCwgZG90TlYgKTtcclxuXHJcblx0XHRmbG9hdCBEID0gRF9HR1goIGFscGhhLCBkb3ROSCApO1xyXG5cclxuXHRcdHJldHVybiBGICogKCBWICogRCApO1xyXG5cclxuXHR9XHJcblxyXG4jZW5kaWZcclxuXHJcbnZlYzMgQlJERl9HR1goIGNvbnN0IGluIHZlYzMgbGlnaHREaXIsIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwgKSB7XHJcblxyXG5cdHZlYzMgZjAgPSBtYXRlcmlhbC5zcGVjdWxhckNvbG9yO1xyXG5cdGZsb2F0IGY5MCA9IG1hdGVyaWFsLnNwZWN1bGFyRjkwO1xyXG5cdGZsb2F0IHJvdWdobmVzcyA9IG1hdGVyaWFsLnJvdWdobmVzcztcclxuXHJcblx0ZmxvYXQgYWxwaGEgPSBwb3cyKCByb3VnaG5lc3MgKTsgLy8gVUU0J3Mgcm91Z2huZXNzXHJcblxyXG5cdHZlYzMgaGFsZkRpciA9IG5vcm1hbGl6ZSggbGlnaHREaXIgKyB2aWV3RGlyICk7XHJcblxyXG5cdGZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBsaWdodERpciApICk7XHJcblx0ZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIHZpZXdEaXIgKSApO1xyXG5cdGZsb2F0IGRvdE5IID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBoYWxmRGlyICkgKTtcclxuXHRmbG9hdCBkb3RWSCA9IHNhdHVyYXRlKCBkb3QoIHZpZXdEaXIsIGhhbGZEaXIgKSApO1xyXG5cclxuXHR2ZWMzIEYgPSBGX1NjaGxpY2soIGYwLCBmOTAsIGRvdFZIICk7XHJcblxyXG5cdCNpZmRlZiBVU0VfSVJJREVTQ0VOQ0VcclxuXHJcblx0XHRGID0gbWl4KCBGLCBtYXRlcmlhbC5pcmlkZXNjZW5jZUZyZXNuZWwsIG1hdGVyaWFsLmlyaWRlc2NlbmNlICk7XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuXHQjaWZkZWYgVVNFX0FOSVNPVFJPUFlcclxuXHJcblx0XHRmbG9hdCBkb3RUTCA9IGRvdCggbWF0ZXJpYWwuYW5pc290cm9weVQsIGxpZ2h0RGlyICk7XHJcblx0XHRmbG9hdCBkb3RUViA9IGRvdCggbWF0ZXJpYWwuYW5pc290cm9weVQsIHZpZXdEaXIgKTtcclxuXHRcdGZsb2F0IGRvdFRIID0gZG90KCBtYXRlcmlhbC5hbmlzb3Ryb3B5VCwgaGFsZkRpciApO1xyXG5cdFx0ZmxvYXQgZG90QkwgPSBkb3QoIG1hdGVyaWFsLmFuaXNvdHJvcHlCLCBsaWdodERpciApO1xyXG5cdFx0ZmxvYXQgZG90QlYgPSBkb3QoIG1hdGVyaWFsLmFuaXNvdHJvcHlCLCB2aWV3RGlyICk7XHJcblx0XHRmbG9hdCBkb3RCSCA9IGRvdCggbWF0ZXJpYWwuYW5pc290cm9weUIsIGhhbGZEaXIgKTtcclxuXHJcblx0XHRmbG9hdCBWID0gVl9HR1hfU21pdGhDb3JyZWxhdGVkX0FuaXNvdHJvcGljKCBtYXRlcmlhbC5hbHBoYVQsIGFscGhhLCBkb3RUViwgZG90QlYsIGRvdFRMLCBkb3RCTCwgZG90TlYsIGRvdE5MICk7XHJcblxyXG5cdFx0ZmxvYXQgRCA9IERfR0dYX0FuaXNvdHJvcGljKCBtYXRlcmlhbC5hbHBoYVQsIGFscGhhLCBkb3ROSCwgZG90VEgsIGRvdEJIICk7XHJcblxyXG5cdCNlbHNlXHJcblxyXG5cdFx0ZmxvYXQgViA9IFZfR0dYX1NtaXRoQ29ycmVsYXRlZCggYWxwaGEsIGRvdE5MLCBkb3ROViApO1xyXG5cclxuXHRcdGZsb2F0IEQgPSBEX0dHWCggYWxwaGEsIGRvdE5IICk7XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuXHRyZXR1cm4gRiAqICggViAqIEQgKTtcclxuXHJcbn1cclxuXHJcbi8vIFJlY3QgQXJlYSBMaWdodFxyXG5cclxuLy8gUmVhbC1UaW1lIFBvbHlnb25hbC1MaWdodCBTaGFkaW5nIHdpdGggTGluZWFybHkgVHJhbnNmb3JtZWQgQ29zaW5lc1xyXG4vLyBieSBFcmljIEhlaXR6LCBKb25hdGhhbiBEdXB1eSwgU3RlcGhlbiBIaWxsIGFuZCBEYXZpZCBOZXViZWx0XHJcbi8vIGNvZGU6IGh0dHBzOi8vZ2l0aHViLmNvbS9zZWxmc2hhZG93L2x0Y19jb2RlL1xyXG5cclxudmVjMiBMVENfVXYoIGNvbnN0IGluIHZlYzMgTiwgY29uc3QgaW4gdmVjMyBWLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XHJcblxyXG5cdGNvbnN0IGZsb2F0IExVVF9TSVpFID0gNjQuMDtcclxuXHRjb25zdCBmbG9hdCBMVVRfU0NBTEUgPSAoIExVVF9TSVpFIC0gMS4wICkgLyBMVVRfU0laRTtcclxuXHRjb25zdCBmbG9hdCBMVVRfQklBUyA9IDAuNSAvIExVVF9TSVpFO1xyXG5cclxuXHRmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIE4sIFYgKSApO1xyXG5cclxuXHQvLyB0ZXh0dXJlIHBhcmFtZXRlcml6ZWQgYnkgc3FydCggR0dYIGFscGhhICkgYW5kIHNxcnQoIDEgLSBjb3MoIHRoZXRhICkgKVxyXG5cdHZlYzIgdXYgPSB2ZWMyKCByb3VnaG5lc3MsIHNxcnQoIDEuMCAtIGRvdE5WICkgKTtcclxuXHJcblx0dXYgPSB1diAqIExVVF9TQ0FMRSArIExVVF9CSUFTO1xyXG5cclxuXHRyZXR1cm4gdXY7XHJcblxyXG59XHJcblxyXG5mbG9hdCBMVENfQ2xpcHBlZFNwaGVyZUZvcm1GYWN0b3IoIGNvbnN0IGluIHZlYzMgZiApIHtcclxuXHJcblx0Ly8gUmVhbC1UaW1lIEFyZWEgTGlnaHRpbmc6IGEgSm91cm5leSBmcm9tIFJlc2VhcmNoIHRvIFByb2R1Y3Rpb24gKHAuMTAyKVxyXG5cdC8vIEFuIGFwcHJveGltYXRpb24gb2YgdGhlIGZvcm0gZmFjdG9yIG9mIGEgaG9yaXpvbi1jbGlwcGVkIHJlY3RhbmdsZS5cclxuXHJcblx0ZmxvYXQgbCA9IGxlbmd0aCggZiApO1xyXG5cclxuXHRyZXR1cm4gbWF4KCAoIGwgKiBsICsgZi56ICkgLyAoIGwgKyAxLjAgKSwgMC4wICk7XHJcblxyXG59XHJcblxyXG52ZWMzIExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29uc3QgaW4gdmVjMyB2MSwgY29uc3QgaW4gdmVjMyB2MiApIHtcclxuXHJcblx0ZmxvYXQgeCA9IGRvdCggdjEsIHYyICk7XHJcblxyXG5cdGZsb2F0IHkgPSBhYnMoIHggKTtcclxuXHJcblx0Ly8gcmF0aW9uYWwgcG9seW5vbWlhbCBhcHByb3hpbWF0aW9uIHRvIHRoZXRhIC8gc2luKCB0aGV0YSApIC8gMlBJXHJcblx0ZmxvYXQgYSA9IDAuODU0Mzk4NSArICggMC40OTY1MTU1ICsgMC4wMTQ1MjA2ICogeSApICogeTtcclxuXHRmbG9hdCBiID0gMy40MTc1OTQwICsgKCA0LjE2MTY3MjQgKyB5ICkgKiB5O1xyXG5cdGZsb2F0IHYgPSBhIC8gYjtcclxuXHJcblx0ZmxvYXQgdGhldGFfc2ludGhldGEgPSAoIHggPiAwLjAgKSA/IHYgOiAwLjUgKiBpbnZlcnNlc3FydCggbWF4KCAxLjAgLSB4ICogeCwgMWUtNyApICkgLSB2O1xyXG5cclxuXHRyZXR1cm4gY3Jvc3MoIHYxLCB2MiApICogdGhldGFfc2ludGhldGE7XHJcblxyXG59XHJcblxyXG52ZWMzIExUQ19FdmFsdWF0ZSggY29uc3QgaW4gdmVjMyBOLCBjb25zdCBpbiB2ZWMzIFYsIGNvbnN0IGluIHZlYzMgUCwgY29uc3QgaW4gbWF0MyBtSW52LCBjb25zdCBpbiB2ZWMzIHJlY3RDb29yZHNbIDQgXSApIHtcclxuXHJcblx0Ly8gYmFpbCBpZiBwb2ludCBpcyBvbiBiYWNrIHNpZGUgb2YgcGxhbmUgb2YgbGlnaHRcclxuXHQvLyBhc3N1bWVzIGNjdyB3aW5kaW5nIG9yZGVyIG9mIGxpZ2h0IHZlcnRpY2VzXHJcblx0dmVjMyB2MSA9IHJlY3RDb29yZHNbIDEgXSAtIHJlY3RDb29yZHNbIDAgXTtcclxuXHR2ZWMzIHYyID0gcmVjdENvb3Jkc1sgMyBdIC0gcmVjdENvb3Jkc1sgMCBdO1xyXG5cdHZlYzMgbGlnaHROb3JtYWwgPSBjcm9zcyggdjEsIHYyICk7XHJcblxyXG5cdGlmKCBkb3QoIGxpZ2h0Tm9ybWFsLCBQIC0gcmVjdENvb3Jkc1sgMCBdICkgPCAwLjAgKSByZXR1cm4gdmVjMyggMC4wICk7XHJcblxyXG5cdC8vIGNvbnN0cnVjdCBvcnRob25vcm1hbCBiYXNpcyBhcm91bmQgTlxyXG5cdHZlYzMgVDEsIFQyO1xyXG5cdFQxID0gbm9ybWFsaXplKCBWIC0gTiAqIGRvdCggViwgTiApICk7XHJcblx0VDIgPSAtIGNyb3NzKCBOLCBUMSApOyAvLyBuZWdhdGVkIGZyb20gcGFwZXI7IHBvc3NpYmx5IGR1ZSB0byBhIGRpZmZlcmVudCBoYW5kZWRuZXNzIG9mIHdvcmxkIGNvb3JkaW5hdGUgc3lzdGVtXHJcblxyXG5cdC8vIGNvbXB1dGUgdHJhbnNmb3JtXHJcblx0bWF0MyBtYXQgPSBtSW52ICogdHJhbnNwb3NlTWF0MyggbWF0MyggVDEsIFQyLCBOICkgKTtcclxuXHJcblx0Ly8gdHJhbnNmb3JtIHJlY3RcclxuXHR2ZWMzIGNvb3Jkc1sgNCBdO1xyXG5cdGNvb3Jkc1sgMCBdID0gbWF0ICogKCByZWN0Q29vcmRzWyAwIF0gLSBQICk7XHJcblx0Y29vcmRzWyAxIF0gPSBtYXQgKiAoIHJlY3RDb29yZHNbIDEgXSAtIFAgKTtcclxuXHRjb29yZHNbIDIgXSA9IG1hdCAqICggcmVjdENvb3Jkc1sgMiBdIC0gUCApO1xyXG5cdGNvb3Jkc1sgMyBdID0gbWF0ICogKCByZWN0Q29vcmRzWyAzIF0gLSBQICk7XHJcblxyXG5cdC8vIHByb2plY3QgcmVjdCBvbnRvIHNwaGVyZVxyXG5cdGNvb3Jkc1sgMCBdID0gbm9ybWFsaXplKCBjb29yZHNbIDAgXSApO1xyXG5cdGNvb3Jkc1sgMSBdID0gbm9ybWFsaXplKCBjb29yZHNbIDEgXSApO1xyXG5cdGNvb3Jkc1sgMiBdID0gbm9ybWFsaXplKCBjb29yZHNbIDIgXSApO1xyXG5cdGNvb3Jkc1sgMyBdID0gbm9ybWFsaXplKCBjb29yZHNbIDMgXSApO1xyXG5cclxuXHQvLyBjYWxjdWxhdGUgdmVjdG9yIGZvcm0gZmFjdG9yXHJcblx0dmVjMyB2ZWN0b3JGb3JtRmFjdG9yID0gdmVjMyggMC4wICk7XHJcblx0dmVjdG9yRm9ybUZhY3RvciArPSBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMCBdLCBjb29yZHNbIDEgXSApO1xyXG5cdHZlY3RvckZvcm1GYWN0b3IgKz0gTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb29yZHNbIDEgXSwgY29vcmRzWyAyIF0gKTtcclxuXHR2ZWN0b3JGb3JtRmFjdG9yICs9IExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAyIF0sIGNvb3Jkc1sgMyBdICk7XHJcblx0dmVjdG9yRm9ybUZhY3RvciArPSBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMyBdLCBjb29yZHNbIDAgXSApO1xyXG5cclxuXHQvLyBhZGp1c3QgZm9yIGhvcml6b24gY2xpcHBpbmdcclxuXHRmbG9hdCByZXN1bHQgPSBMVENfQ2xpcHBlZFNwaGVyZUZvcm1GYWN0b3IoIHZlY3RvckZvcm1GYWN0b3IgKTtcclxuXHJcbi8qXHJcblx0Ly8gYWx0ZXJuYXRlIG1ldGhvZCBvZiBhZGp1c3RpbmcgZm9yIGhvcml6b24gY2xpcHBpbmcgKHNlZSByZWZlcmVuY2UpXHJcblx0Ly8gcmVmYWN0b3JpbmcgcmVxdWlyZWRcclxuXHRmbG9hdCBsZW4gPSBsZW5ndGgoIHZlY3RvckZvcm1GYWN0b3IgKTtcclxuXHRmbG9hdCB6ID0gdmVjdG9yRm9ybUZhY3Rvci56IC8gbGVuO1xyXG5cclxuXHRjb25zdCBmbG9hdCBMVVRfU0laRSA9IDY0LjA7XHJcblx0Y29uc3QgZmxvYXQgTFVUX1NDQUxFID0gKCBMVVRfU0laRSAtIDEuMCApIC8gTFVUX1NJWkU7XHJcblx0Y29uc3QgZmxvYXQgTFVUX0JJQVMgPSAwLjUgLyBMVVRfU0laRTtcclxuXHJcblx0Ly8gdGFidWxhdGVkIGhvcml6b24tY2xpcHBlZCBzcGhlcmUsIGFwcGFyZW50bHkuLi5cclxuXHR2ZWMyIHV2ID0gdmVjMiggeiAqIDAuNSArIDAuNSwgbGVuICk7XHJcblx0dXYgPSB1diAqIExVVF9TQ0FMRSArIExVVF9CSUFTO1xyXG5cclxuXHRmbG9hdCBzY2FsZSA9IHRleHR1cmUyRCggbHRjXzIsIHV2ICkudztcclxuXHJcblx0ZmxvYXQgcmVzdWx0ID0gbGVuICogc2NhbGU7XHJcbiovXHJcblxyXG5cdHJldHVybiB2ZWMzKCByZXN1bHQgKTtcclxuXHJcbn1cclxuXHJcbi8vIEVuZCBSZWN0IEFyZWEgTGlnaHRcclxuXHJcbiNpZiBkZWZpbmVkKCBVU0VfU0hFRU4gKVxyXG5cclxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9maWxhbWVudC9ibG9iL21hc3Rlci9zaGFkZXJzL3NyYy9icmRmLmZzXHJcbmZsb2F0IERfQ2hhcmxpZSggZmxvYXQgcm91Z2huZXNzLCBmbG9hdCBkb3ROSCApIHtcclxuXHJcblx0ZmxvYXQgYWxwaGEgPSBwb3cyKCByb3VnaG5lc3MgKTtcclxuXHJcblx0Ly8gRXN0ZXZleiBhbmQgS3VsbGEgMjAxNywgXCJQcm9kdWN0aW9uIEZyaWVuZGx5IE1pY3JvZmFjZXQgU2hlZW4gQlJERlwiXHJcblx0ZmxvYXQgaW52QWxwaGEgPSAxLjAgLyBhbHBoYTtcclxuXHRmbG9hdCBjb3MyaCA9IGRvdE5IICogZG90Tkg7XHJcblx0ZmxvYXQgc2luMmggPSBtYXgoIDEuMCAtIGNvczJoLCAwLjAwNzgxMjUgKTsgLy8gMl4oLTE0LzIpLCBzbyBzaW4yaF4yID4gMCBpbiBmcDE2XHJcblxyXG5cdHJldHVybiAoIDIuMCArIGludkFscGhhICkgKiBwb3coIHNpbjJoLCBpbnZBbHBoYSAqIDAuNSApIC8gKCAyLjAgKiBQSSApO1xyXG5cclxufVxyXG5cclxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9maWxhbWVudC9ibG9iL21hc3Rlci9zaGFkZXJzL3NyYy9icmRmLmZzXHJcbmZsb2F0IFZfTmV1YmVsdCggZmxvYXQgZG90TlYsIGZsb2F0IGRvdE5MICkge1xyXG5cclxuXHQvLyBOZXViZWx0IGFuZCBQZXR0aW5lbyAyMDEzLCBcIkNyYWZ0aW5nIGEgTmV4dC1nZW4gTWF0ZXJpYWwgUGlwZWxpbmUgZm9yIFRoZSBPcmRlcjogMTg4NlwiXHJcblx0cmV0dXJuIHNhdHVyYXRlKCAxLjAgLyAoIDQuMCAqICggZG90TkwgKyBkb3ROViAtIGRvdE5MICogZG90TlYgKSApICk7XHJcblxyXG59XHJcblxyXG52ZWMzIEJSREZfU2hlZW4oIGNvbnN0IGluIHZlYzMgbGlnaHREaXIsIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBub3JtYWwsIHZlYzMgc2hlZW5Db2xvciwgY29uc3QgaW4gZmxvYXQgc2hlZW5Sb3VnaG5lc3MgKSB7XHJcblxyXG5cdHZlYzMgaGFsZkRpciA9IG5vcm1hbGl6ZSggbGlnaHREaXIgKyB2aWV3RGlyICk7XHJcblxyXG5cdGZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBsaWdodERpciApICk7XHJcblx0ZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIHZpZXdEaXIgKSApO1xyXG5cdGZsb2F0IGRvdE5IID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBoYWxmRGlyICkgKTtcclxuXHJcblx0ZmxvYXQgRCA9IERfQ2hhcmxpZSggc2hlZW5Sb3VnaG5lc3MsIGRvdE5IICk7XHJcblx0ZmxvYXQgViA9IFZfTmV1YmVsdCggZG90TlYsIGRvdE5MICk7XHJcblxyXG5cdHJldHVybiBzaGVlbkNvbG9yICogKCBEICogViApO1xyXG5cclxufVxyXG5cclxuI2VuZGlmXHJcblxyXG4vLyBUaGlzIGlzIGEgY3VydmUtZml0IGFwcHJveGltYXRpb24gdG8gdGhlIFwiQ2hhcmxpZSBzaGVlblwiIEJSREYgaW50ZWdyYXRlZCBvdmVyIHRoZSBoZW1pc3BoZXJlIGZyb21cclxuLy8gRXN0ZXZleiBhbmQgS3VsbGEgMjAxNywgXCJQcm9kdWN0aW9uIEZyaWVuZGx5IE1pY3JvZmFjZXQgU2hlZW4gQlJERlwiLiBUaGUgYW5hbHlzaXMgY2FuIGJlIGZvdW5kXHJcbi8vIGluIHRoZSBTaGVlbiBzZWN0aW9uIG9mIGh0dHBzOi8vZHJpdmUuZ29vZ2xlLmNvbS9maWxlL2QvMVQwRDFWU3lSNEFsbHFJSlRRQXJhRUl6amxiNWg0RktIL3ZpZXc/dXNwPXNoYXJpbmdcclxuZmxvYXQgSUJMU2hlZW5CUkRGKCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XHJcblxyXG5cdGZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCB2aWV3RGlyICkgKTtcclxuXHJcblx0ZmxvYXQgcjIgPSByb3VnaG5lc3MgKiByb3VnaG5lc3M7XHJcblxyXG5cdGZsb2F0IGEgPSByb3VnaG5lc3MgPCAwLjI1ID8gLTMzOS4yICogcjIgKyAxNjEuNCAqIHJvdWdobmVzcyAtIDI1LjkgOiAtOC40OCAqIHIyICsgMTQuMyAqIHJvdWdobmVzcyAtIDkuOTU7XHJcblxyXG5cdGZsb2F0IGIgPSByb3VnaG5lc3MgPCAwLjI1ID8gNDQuMCAqIHIyIC0gMjMuNyAqIHJvdWdobmVzcyArIDMuMjYgOiAxLjk3ICogcjIgLSAzLjI3ICogcm91Z2huZXNzICsgMC43MjtcclxuXHJcblx0ZmxvYXQgREcgPSBleHAoIGEgKiBkb3ROViArIGIgKSArICggcm91Z2huZXNzIDwgMC4yNSA/IDAuMCA6IDAuMSAqICggcm91Z2huZXNzIC0gMC4yNSApICk7XHJcblxyXG5cdHJldHVybiBzYXR1cmF0ZSggREcgKiBSRUNJUFJPQ0FMX1BJICk7XHJcblxyXG59XHJcblxyXG4vLyBBbmFseXRpY2FsIGFwcHJveGltYXRpb24gb2YgdGhlIERGRyBMVVQsIG9uZSBoYWxmIG9mIHRoZVxyXG4vLyBzcGxpdC1zdW0gYXBwcm94aW1hdGlvbiB1c2VkIGluIGluZGlyZWN0IHNwZWN1bGFyIGxpZ2h0aW5nLlxyXG4vLyB2aWEgJ2Vudmlyb25tZW50QlJERicgZnJvbSBcIlBoeXNpY2FsbHkgQmFzZWQgU2hhZGluZyBvbiBNb2JpbGVcIlxyXG4vLyBodHRwczovL3d3dy51bnJlYWxlbmdpbmUuY29tL2Jsb2cvcGh5c2ljYWxseS1iYXNlZC1zaGFkaW5nLW9uLW1vYmlsZVxyXG52ZWMyIERGR0FwcHJveCggY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xyXG5cclxuXHRmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgdmlld0RpciApICk7XHJcblxyXG5cdGNvbnN0IHZlYzQgYzAgPSB2ZWM0KCAtIDEsIC0gMC4wMjc1LCAtIDAuNTcyLCAwLjAyMiApO1xyXG5cclxuXHRjb25zdCB2ZWM0IGMxID0gdmVjNCggMSwgMC4wNDI1LCAxLjA0LCAtIDAuMDQgKTtcclxuXHJcblx0dmVjNCByID0gcm91Z2huZXNzICogYzAgKyBjMTtcclxuXHJcblx0ZmxvYXQgYTAwNCA9IG1pbiggci54ICogci54LCBleHAyKCAtIDkuMjggKiBkb3ROViApICkgKiByLnggKyByLnk7XHJcblxyXG5cdHZlYzIgZmFiID0gdmVjMiggLSAxLjA0LCAxLjA0ICkgKiBhMDA0ICsgci56dztcclxuXHJcblx0cmV0dXJuIGZhYjtcclxuXHJcbn1cclxuXHJcbnZlYzMgRW52aXJvbm1lbnRCUkRGKCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IHNwZWN1bGFyRjkwLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XHJcblxyXG5cdHZlYzIgZmFiID0gREZHQXBwcm94KCBub3JtYWwsIHZpZXdEaXIsIHJvdWdobmVzcyApO1xyXG5cclxuXHRyZXR1cm4gc3BlY3VsYXJDb2xvciAqIGZhYi54ICsgc3BlY3VsYXJGOTAgKiBmYWIueTtcclxuXHJcbn1cclxuXHJcbi8vIEZkZXotQWfDvGVyYSdzIFwiTXVsdGlwbGUtU2NhdHRlcmluZyBNaWNyb2ZhY2V0IE1vZGVsIGZvciBSZWFsLVRpbWUgSW1hZ2UgQmFzZWQgTGlnaHRpbmdcIlxyXG4vLyBBcHByb3hpbWF0ZXMgbXVsdGlzY2F0dGVyaW5nIGluIG9yZGVyIHRvIHByZXNlcnZlIGVuZXJneS5cclxuLy8gaHR0cDovL3d3dy5qY2d0Lm9yZy9wdWJsaXNoZWQvMDAwOC8wMS8wMy9cclxuI2lmZGVmIFVTRV9JUklERVNDRU5DRVxyXG52b2lkIGNvbXB1dGVNdWx0aXNjYXR0ZXJpbmdJcmlkZXNjZW5jZSggY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCBzcGVjdWxhckY5MCwgY29uc3QgaW4gZmxvYXQgaXJpZGVzY2VuY2UsIGNvbnN0IGluIHZlYzMgaXJpZGVzY2VuY2VGMCwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzLCBpbm91dCB2ZWMzIHNpbmdsZVNjYXR0ZXIsIGlub3V0IHZlYzMgbXVsdGlTY2F0dGVyICkge1xyXG4jZWxzZVxyXG52b2lkIGNvbXB1dGVNdWx0aXNjYXR0ZXJpbmcoIGNvbnN0IGluIHZlYzMgbm9ybWFsLCBjb25zdCBpbiB2ZWMzIHZpZXdEaXIsIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgc3BlY3VsYXJGOTAsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgaW5vdXQgdmVjMyBzaW5nbGVTY2F0dGVyLCBpbm91dCB2ZWMzIG11bHRpU2NhdHRlciApIHtcclxuI2VuZGlmXHJcblxyXG5cdHZlYzIgZmFiID0gREZHQXBwcm94KCBub3JtYWwsIHZpZXdEaXIsIHJvdWdobmVzcyApO1xyXG5cclxuXHQjaWZkZWYgVVNFX0lSSURFU0NFTkNFXHJcblxyXG5cdFx0dmVjMyBGciA9IG1peCggc3BlY3VsYXJDb2xvciwgaXJpZGVzY2VuY2VGMCwgaXJpZGVzY2VuY2UgKTtcclxuXHJcblx0I2Vsc2VcclxuXHJcblx0XHR2ZWMzIEZyID0gc3BlY3VsYXJDb2xvcjtcclxuXHJcblx0I2VuZGlmXHJcblxyXG5cdHZlYzMgRnNzRXNzID0gRnIgKiBmYWIueCArIHNwZWN1bGFyRjkwICogZmFiLnk7XHJcblxyXG5cdGZsb2F0IEVzcyA9IGZhYi54ICsgZmFiLnk7XHJcblx0ZmxvYXQgRW1zID0gMS4wIC0gRXNzO1xyXG5cclxuXHR2ZWMzIEZhdmcgPSBGciArICggMS4wIC0gRnIgKSAqIDAuMDQ3NjE5OyAvLyAxLzIxXHJcblx0dmVjMyBGbXMgPSBGc3NFc3MgKiBGYXZnIC8gKCAxLjAgLSBFbXMgKiBGYXZnICk7XHJcblxyXG5cdHNpbmdsZVNjYXR0ZXIgKz0gRnNzRXNzO1xyXG5cdG11bHRpU2NhdHRlciArPSBGbXMgKiBFbXM7XHJcblxyXG59XHJcblxyXG4jaWYgTlVNX1JFQ1RfQVJFQV9MSUdIVFMgPiAwXHJcblxyXG5cdHZvaWQgUkVfRGlyZWN0X1JlY3RBcmVhX1BoeXNpY2FsKCBjb25zdCBpbiBSZWN0QXJlYUxpZ2h0IHJlY3RBcmVhTGlnaHQsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlQb3NpdGlvbiwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeU5vcm1hbCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVZpZXdEaXIsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xyXG5cclxuXHRcdHZlYzMgbm9ybWFsID0gZ2VvbWV0cnlOb3JtYWw7XHJcblx0XHR2ZWMzIHZpZXdEaXIgPSBnZW9tZXRyeVZpZXdEaXI7XHJcblx0XHR2ZWMzIHBvc2l0aW9uID0gZ2VvbWV0cnlQb3NpdGlvbjtcclxuXHRcdHZlYzMgbGlnaHRQb3MgPSByZWN0QXJlYUxpZ2h0LnBvc2l0aW9uO1xyXG5cdFx0dmVjMyBoYWxmV2lkdGggPSByZWN0QXJlYUxpZ2h0LmhhbGZXaWR0aDtcclxuXHRcdHZlYzMgaGFsZkhlaWdodCA9IHJlY3RBcmVhTGlnaHQuaGFsZkhlaWdodDtcclxuXHRcdHZlYzMgbGlnaHRDb2xvciA9IHJlY3RBcmVhTGlnaHQuY29sb3I7XHJcblx0XHRmbG9hdCByb3VnaG5lc3MgPSBtYXRlcmlhbC5yb3VnaG5lc3M7XHJcblxyXG5cdFx0dmVjMyByZWN0Q29vcmRzWyA0IF07XHJcblx0XHRyZWN0Q29vcmRzWyAwIF0gPSBsaWdodFBvcyArIGhhbGZXaWR0aCAtIGhhbGZIZWlnaHQ7IC8vIGNvdW50ZXJjbG9ja3dpc2U7IGxpZ2h0IHNoaW5lcyBpbiBsb2NhbCBuZWcgeiBkaXJlY3Rpb25cclxuXHRcdHJlY3RDb29yZHNbIDEgXSA9IGxpZ2h0UG9zIC0gaGFsZldpZHRoIC0gaGFsZkhlaWdodDtcclxuXHRcdHJlY3RDb29yZHNbIDIgXSA9IGxpZ2h0UG9zIC0gaGFsZldpZHRoICsgaGFsZkhlaWdodDtcclxuXHRcdHJlY3RDb29yZHNbIDMgXSA9IGxpZ2h0UG9zICsgaGFsZldpZHRoICsgaGFsZkhlaWdodDtcclxuXHJcblx0XHR2ZWMyIHV2ID0gTFRDX1V2KCBub3JtYWwsIHZpZXdEaXIsIHJvdWdobmVzcyApO1xyXG5cclxuXHRcdHZlYzQgdDEgPSB0ZXh0dXJlMkQoIGx0Y18xLCB1diApO1xyXG5cdFx0dmVjNCB0MiA9IHRleHR1cmUyRCggbHRjXzIsIHV2ICk7XHJcblxyXG5cdFx0bWF0MyBtSW52ID0gbWF0MyhcclxuXHRcdFx0dmVjMyggdDEueCwgMCwgdDEueSApLFxyXG5cdFx0XHR2ZWMzKCAgICAwLCAxLCAgICAwICksXHJcblx0XHRcdHZlYzMoIHQxLnosIDAsIHQxLncgKVxyXG5cdFx0KTtcclxuXHJcblx0XHQvLyBMVEMgRnJlc25lbCBBcHByb3hpbWF0aW9uIGJ5IFN0ZXBoZW4gSGlsbFxyXG5cdFx0Ly8gaHR0cDovL2Jsb2cuc2VsZnNoYWRvdy5jb20vcHVibGljYXRpb25zL3MyMDE2LWFkdmFuY2VzL3MyMDE2X2x0Y19mcmVzbmVsLnBkZlxyXG5cdFx0dmVjMyBmcmVzbmVsID0gKCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yICogdDIueCArICggdmVjMyggMS4wICkgLSBtYXRlcmlhbC5zcGVjdWxhckNvbG9yICkgKiB0Mi55ICk7XHJcblxyXG5cdFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKz0gbGlnaHRDb2xvciAqIGZyZXNuZWwgKiBMVENfRXZhbHVhdGUoIG5vcm1hbCwgdmlld0RpciwgcG9zaXRpb24sIG1JbnYsIHJlY3RDb29yZHMgKTtcclxuXHJcblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICs9IGxpZ2h0Q29sb3IgKiBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKiBMVENfRXZhbHVhdGUoIG5vcm1hbCwgdmlld0RpciwgcG9zaXRpb24sIG1hdDMoIDEuMCApLCByZWN0Q29vcmRzICk7XHJcblxyXG5cdH1cclxuXHJcbiNlbmRpZlxyXG5cclxudm9pZCBSRV9EaXJlY3RfUGh5c2ljYWwoIGNvbnN0IGluIEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlQb3NpdGlvbiwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeU5vcm1hbCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVZpZXdEaXIsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xyXG5cclxuXHRmbG9hdCBkb3ROTCA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Tm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKSApO1xyXG5cclxuXHR2ZWMzIGlycmFkaWFuY2UgPSBkb3ROTCAqIGRpcmVjdExpZ2h0LmNvbG9yO1xyXG5cclxuXHQjaWZkZWYgVVNFX0NMRUFSQ09BVFxyXG5cclxuXHRcdGZsb2F0IGRvdE5MY2MgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKTtcclxuXHJcblx0XHR2ZWMzIGNjSXJyYWRpYW5jZSA9IGRvdE5MY2MgKiBkaXJlY3RMaWdodC5jb2xvcjtcclxuXHJcblx0XHRjbGVhcmNvYXRTcGVjdWxhckRpcmVjdCArPSBjY0lycmFkaWFuY2UgKiBCUkRGX0dHWF9DbGVhcmNvYXQoIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiwgZ2VvbWV0cnlWaWV3RGlyLCBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgbWF0ZXJpYWwgKTtcclxuXHJcblx0I2VuZGlmXHJcblxyXG5cdCNpZmRlZiBVU0VfU0hFRU5cclxuXHJcblx0XHRzaGVlblNwZWN1bGFyRGlyZWN0ICs9IGlycmFkaWFuY2UgKiBCUkRGX1NoZWVuKCBkaXJlY3RMaWdodC5kaXJlY3Rpb24sIGdlb21ldHJ5Vmlld0RpciwgZ2VvbWV0cnlOb3JtYWwsIG1hdGVyaWFsLnNoZWVuQ29sb3IsIG1hdGVyaWFsLnNoZWVuUm91Z2huZXNzICk7XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPSBpcnJhZGlhbmNlICogQlJERl9HR1goIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiwgZ2VvbWV0cnlWaWV3RGlyLCBnZW9tZXRyeU5vcm1hbCwgbWF0ZXJpYWwgKTtcclxuXHJcblx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcclxufVxyXG5cclxudm9pZCBSRV9JbmRpcmVjdERpZmZ1c2VfUGh5c2ljYWwoIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVBvc2l0aW9uLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Tm9ybWFsLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Vmlld0RpciwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XHJcblxyXG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcclxuXHJcbn1cclxuXHJcbnZvaWQgUkVfSW5kaXJlY3RTcGVjdWxhcl9QaHlzaWNhbCggY29uc3QgaW4gdmVjMyByYWRpYW5jZSwgY29uc3QgaW4gdmVjMyBpcnJhZGlhbmNlLCBjb25zdCBpbiB2ZWMzIGNsZWFyY29hdFJhZGlhbmNlLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5UG9zaXRpb24sIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlOb3JtYWwsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlWaWV3RGlyLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCkge1xyXG5cclxuXHQjaWZkZWYgVVNFX0NMRUFSQ09BVFxyXG5cclxuXHRcdGNsZWFyY29hdFNwZWN1bGFySW5kaXJlY3QgKz0gY2xlYXJjb2F0UmFkaWFuY2UgKiBFbnZpcm9ubWVudEJSREYoIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBnZW9tZXRyeVZpZXdEaXIsIG1hdGVyaWFsLmNsZWFyY29hdEYwLCBtYXRlcmlhbC5jbGVhcmNvYXRGOTAsIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcyApO1xyXG5cclxuXHQjZW5kaWZcclxuXHJcblx0I2lmZGVmIFVTRV9TSEVFTlxyXG5cclxuXHRcdHNoZWVuU3BlY3VsYXJJbmRpcmVjdCArPSBpcnJhZGlhbmNlICogbWF0ZXJpYWwuc2hlZW5Db2xvciAqIElCTFNoZWVuQlJERiggZ2VvbWV0cnlOb3JtYWwsIGdlb21ldHJ5Vmlld0RpciwgbWF0ZXJpYWwuc2hlZW5Sb3VnaG5lc3MgKTtcclxuXHJcblx0I2VuZGlmXHJcblxyXG5cdC8vIEJvdGggaW5kaXJlY3Qgc3BlY3VsYXIgYW5kIGluZGlyZWN0IGRpZmZ1c2UgbGlnaHQgYWNjdW11bGF0ZSBoZXJlXHJcblxyXG5cdHZlYzMgc2luZ2xlU2NhdHRlcmluZyA9IHZlYzMoIDAuMCApO1xyXG5cdHZlYzMgbXVsdGlTY2F0dGVyaW5nID0gdmVjMyggMC4wICk7XHJcblx0dmVjMyBjb3NpbmVXZWlnaHRlZElycmFkaWFuY2UgPSBpcnJhZGlhbmNlICogUkVDSVBST0NBTF9QSTtcclxuXHJcblx0I2lmZGVmIFVTRV9JUklERVNDRU5DRVxyXG5cclxuXHRcdGNvbXB1dGVNdWx0aXNjYXR0ZXJpbmdJcmlkZXNjZW5jZSggZ2VvbWV0cnlOb3JtYWwsIGdlb21ldHJ5Vmlld0RpciwgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciwgbWF0ZXJpYWwuc3BlY3VsYXJGOTAsIG1hdGVyaWFsLmlyaWRlc2NlbmNlLCBtYXRlcmlhbC5pcmlkZXNjZW5jZUZyZXNuZWwsIG1hdGVyaWFsLnJvdWdobmVzcywgc2luZ2xlU2NhdHRlcmluZywgbXVsdGlTY2F0dGVyaW5nICk7XHJcblxyXG5cdCNlbHNlXHJcblxyXG5cdFx0Y29tcHV0ZU11bHRpc2NhdHRlcmluZyggZ2VvbWV0cnlOb3JtYWwsIGdlb21ldHJ5Vmlld0RpciwgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciwgbWF0ZXJpYWwuc3BlY3VsYXJGOTAsIG1hdGVyaWFsLnJvdWdobmVzcywgc2luZ2xlU2NhdHRlcmluZywgbXVsdGlTY2F0dGVyaW5nICk7XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuXHR2ZWMzIHRvdGFsU2NhdHRlcmluZyA9IHNpbmdsZVNjYXR0ZXJpbmcgKyBtdWx0aVNjYXR0ZXJpbmc7XHJcblx0dmVjMyBkaWZmdXNlID0gbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICogKCAxLjAgLSBtYXgoIG1heCggdG90YWxTY2F0dGVyaW5nLnIsIHRvdGFsU2NhdHRlcmluZy5nICksIHRvdGFsU2NhdHRlcmluZy5iICkgKTtcclxuXHJcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciArPSByYWRpYW5jZSAqIHNpbmdsZVNjYXR0ZXJpbmc7XHJcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciArPSBtdWx0aVNjYXR0ZXJpbmcgKiBjb3NpbmVXZWlnaHRlZElycmFkaWFuY2U7XHJcblxyXG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBkaWZmdXNlICogY29zaW5lV2VpZ2h0ZWRJcnJhZGlhbmNlO1xyXG5cclxufVxyXG5cclxuI2RlZmluZSBSRV9EaXJlY3RcdFx0XHRcdFJFX0RpcmVjdF9QaHlzaWNhbFxyXG4jZGVmaW5lIFJFX0RpcmVjdF9SZWN0QXJlYVx0XHRSRV9EaXJlY3RfUmVjdEFyZWFfUGh5c2ljYWxcclxuI2RlZmluZSBSRV9JbmRpcmVjdERpZmZ1c2VcdFx0UkVfSW5kaXJlY3REaWZmdXNlX1BoeXNpY2FsXHJcbiNkZWZpbmUgUkVfSW5kaXJlY3RTcGVjdWxhclx0XHRSRV9JbmRpcmVjdFNwZWN1bGFyX1BoeXNpY2FsXHJcblxyXG4vLyByZWY6IGh0dHBzOi8vc2VibGFnYXJkZS5maWxlcy53b3JkcHJlc3MuY29tLzIwMTUvMDcvY291cnNlX25vdGVzX21vdmluZ19mcm9zdGJpdGVfdG9fcGJyX3YzMi5wZGZcclxuZmxvYXQgY29tcHV0ZVNwZWN1bGFyT2NjbHVzaW9uKCBjb25zdCBpbiBmbG9hdCBkb3ROViwgY29uc3QgaW4gZmxvYXQgYW1iaWVudE9jY2x1c2lvbiwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xyXG5cclxuXHRyZXR1cm4gc2F0dXJhdGUoIHBvdyggZG90TlYgKyBhbWJpZW50T2NjbHVzaW9uLCBleHAyKCAtIDE2LjAgKiByb3VnaG5lc3MgLSAxLjAgKSApIC0gMS4wICsgYW1iaWVudE9jY2x1c2lvbiApO1xyXG5cclxufVxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4vKipcclxuICogVGhpcyBpcyBhIHRlbXBsYXRlIHRoYXQgY2FuIGJlIHVzZWQgdG8gbGlnaHQgYSBtYXRlcmlhbCwgaXQgdXNlcyBwbHVnZ2FibGVcclxuICogUmVuZGVyRXF1YXRpb25zIChSRSlmb3Igc3BlY2lmaWMgbGlnaHRpbmcgc2NlbmFyaW9zLlxyXG4gKlxyXG4gKiBJbnN0cnVjdGlvbnMgZm9yIHVzZTpcclxuICogLSBFbnN1cmUgdGhhdCBib3RoIFJFX0RpcmVjdCwgUkVfSW5kaXJlY3REaWZmdXNlIGFuZCBSRV9JbmRpcmVjdFNwZWN1bGFyIGFyZSBkZWZpbmVkXHJcbiAqIC0gQ3JlYXRlIGEgbWF0ZXJpYWwgcGFyYW1ldGVyIHRoYXQgaXMgdG8gYmUgcGFzc2VkIGFzIHRoZSB0aGlyZCBwYXJhbWV0ZXIgdG8geW91ciBsaWdodGluZyBmdW5jdGlvbnMuXHJcbiAqXHJcbiAqIFRPRE86XHJcbiAqIC0gQWRkIGFyZWEgbGlnaHQgc3VwcG9ydC5cclxuICogLSBBZGQgc3BoZXJlIGxpZ2h0IHN1cHBvcnQuXHJcbiAqIC0gQWRkIGRpZmZ1c2UgbGlnaHQgcHJvYmUgKGlycmFkaWFuY2UgY3ViZW1hcCkgc3VwcG9ydC5cclxuICovXHJcblxyXG52ZWMzIGdlb21ldHJ5UG9zaXRpb24gPSAtIHZWaWV3UG9zaXRpb247XHJcbnZlYzMgZ2VvbWV0cnlOb3JtYWwgPSBub3JtYWw7XHJcbnZlYzMgZ2VvbWV0cnlWaWV3RGlyID0gKCBpc09ydGhvZ3JhcGhpYyApID8gdmVjMyggMCwgMCwgMSApIDogbm9ybWFsaXplKCB2Vmlld1Bvc2l0aW9uICk7XHJcblxyXG52ZWMzIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsID0gdmVjMyggMC4wICk7XHJcblxyXG4jaWZkZWYgVVNFX0NMRUFSQ09BVFxyXG5cclxuXHRnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCA9IGNsZWFyY29hdE5vcm1hbDtcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmZGVmIFVTRV9JUklERVNDRU5DRVxyXG5cclxuXHRmbG9hdCBkb3ROVmkgPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIGdlb21ldHJ5Vmlld0RpciApICk7XHJcblxyXG5cdGlmICggbWF0ZXJpYWwuaXJpZGVzY2VuY2VUaGlja25lc3MgPT0gMC4wICkge1xyXG5cclxuXHRcdG1hdGVyaWFsLmlyaWRlc2NlbmNlID0gMC4wO1xyXG5cclxuXHR9IGVsc2Uge1xyXG5cclxuXHRcdG1hdGVyaWFsLmlyaWRlc2NlbmNlID0gc2F0dXJhdGUoIG1hdGVyaWFsLmlyaWRlc2NlbmNlICk7XHJcblxyXG5cdH1cclxuXHJcblx0aWYgKCBtYXRlcmlhbC5pcmlkZXNjZW5jZSA+IDAuMCApIHtcclxuXHJcblx0XHRtYXRlcmlhbC5pcmlkZXNjZW5jZUZyZXNuZWwgPSBldmFsSXJpZGVzY2VuY2UoIDEuMCwgbWF0ZXJpYWwuaXJpZGVzY2VuY2VJT1IsIGRvdE5WaSwgbWF0ZXJpYWwuaXJpZGVzY2VuY2VUaGlja25lc3MsIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgKTtcclxuXHJcblx0XHQvLyBJcmlkZXNjZW5jZSBGMCBhcHByb3hpbWF0aW9uXHJcblx0XHRtYXRlcmlhbC5pcmlkZXNjZW5jZUYwID0gU2NobGlja190b19GMCggbWF0ZXJpYWwuaXJpZGVzY2VuY2VGcmVzbmVsLCAxLjAsIGRvdE5WaSApO1xyXG5cclxuXHR9XHJcblxyXG4jZW5kaWZcclxuXHJcbkluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQ7XHJcblxyXG4jaWYgKCBOVU1fUE9JTlRfTElHSFRTID4gMCApICYmIGRlZmluZWQoIFJFX0RpcmVjdCApXHJcblxyXG5cdFBvaW50TGlnaHQgcG9pbnRMaWdodDtcclxuXHQjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApICYmIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTID4gMFxyXG5cdFBvaW50TGlnaHRTaGFkb3cgcG9pbnRMaWdodFNoYWRvdztcclxuXHQjZW5kaWZcclxuXHJcblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxyXG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9QT0lOVF9MSUdIVFM7IGkgKysgKSB7XHJcblxyXG5cdFx0cG9pbnRMaWdodCA9IHBvaW50TGlnaHRzWyBpIF07XHJcblxyXG5cdFx0Z2V0UG9pbnRMaWdodEluZm8oIHBvaW50TGlnaHQsIGdlb21ldHJ5UG9zaXRpb24sIGRpcmVjdExpZ2h0ICk7XHJcblxyXG5cdFx0I2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSAmJiAoIFVOUk9MTEVEX0xPT1BfSU5ERVggPCBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyApXHJcblx0XHRwb2ludExpZ2h0U2hhZG93ID0gcG9pbnRMaWdodFNoYWRvd3NbIGkgXTtcclxuXHRcdGRpcmVjdExpZ2h0LmNvbG9yICo9ICggZGlyZWN0TGlnaHQudmlzaWJsZSAmJiByZWNlaXZlU2hhZG93ICkgPyBnZXRQb2ludFNoYWRvdyggcG9pbnRTaGFkb3dNYXBbIGkgXSwgcG9pbnRMaWdodFNoYWRvdy5zaGFkb3dNYXBTaXplLCBwb2ludExpZ2h0U2hhZG93LnNoYWRvd0ludGVuc2l0eSwgcG9pbnRMaWdodFNoYWRvdy5zaGFkb3dCaWFzLCBwb2ludExpZ2h0U2hhZG93LnNoYWRvd1JhZGl1cywgdlBvaW50U2hhZG93Q29vcmRbIGkgXSwgcG9pbnRMaWdodFNoYWRvdy5zaGFkb3dDYW1lcmFOZWFyLCBwb2ludExpZ2h0U2hhZG93LnNoYWRvd0NhbWVyYUZhciApIDogMS4wO1xyXG5cdFx0I2VuZGlmXHJcblxyXG5cdFx0UkVfRGlyZWN0KCBkaXJlY3RMaWdodCwgZ2VvbWV0cnlQb3NpdGlvbiwgZ2VvbWV0cnlOb3JtYWwsIGdlb21ldHJ5Vmlld0RpciwgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xyXG5cclxuXHR9XHJcblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9lbmRcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmICggTlVNX1NQT1RfTElHSFRTID4gMCApICYmIGRlZmluZWQoIFJFX0RpcmVjdCApXHJcblxyXG5cdFNwb3RMaWdodCBzcG90TGlnaHQ7XHJcblx0dmVjNCBzcG90Q29sb3I7XHJcblx0dmVjMyBzcG90TGlnaHRDb29yZDtcclxuXHRib29sIGluU3BvdExpZ2h0TWFwO1xyXG5cclxuXHQjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApICYmIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgPiAwXHJcblx0U3BvdExpZ2h0U2hhZG93IHNwb3RMaWdodFNoYWRvdztcclxuXHQjZW5kaWZcclxuXHJcblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxyXG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9TUE9UX0xJR0hUUzsgaSArKyApIHtcclxuXHJcblx0XHRzcG90TGlnaHQgPSBzcG90TGlnaHRzWyBpIF07XHJcblxyXG5cdFx0Z2V0U3BvdExpZ2h0SW5mbyggc3BvdExpZ2h0LCBnZW9tZXRyeVBvc2l0aW9uLCBkaXJlY3RMaWdodCApO1xyXG5cclxuXHRcdC8vIHNwb3QgbGlnaHRzIGFyZSBvcmRlcmVkIFtzaGFkb3dzIHdpdGggbWFwcywgc2hhZG93cyB3aXRob3V0IG1hcHMsIG1hcHMgd2l0aG91dCBzaGFkb3dzLCBub25lXVxyXG5cdFx0I2lmICggVU5ST0xMRURfTE9PUF9JTkRFWCA8IE5VTV9TUE9UX0xJR0hUX1NIQURPV1NfV0lUSF9NQVBTIClcclxuXHRcdCNkZWZpbmUgU1BPVF9MSUdIVF9NQVBfSU5ERVggVU5ST0xMRURfTE9PUF9JTkRFWFxyXG5cdFx0I2VsaWYgKCBVTlJPTExFRF9MT09QX0lOREVYIDwgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyApXHJcblx0XHQjZGVmaW5lIFNQT1RfTElHSFRfTUFQX0lOREVYIE5VTV9TUE9UX0xJR0hUX01BUFNcclxuXHRcdCNlbHNlXHJcblx0XHQjZGVmaW5lIFNQT1RfTElHSFRfTUFQX0lOREVYICggVU5ST0xMRURfTE9PUF9JTkRFWCAtIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgKyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTX1dJVEhfTUFQUyApXHJcblx0XHQjZW5kaWZcclxuXHJcblx0XHQjaWYgKCBTUE9UX0xJR0hUX01BUF9JTkRFWCA8IE5VTV9TUE9UX0xJR0hUX01BUFMgKVxyXG5cdFx0XHRzcG90TGlnaHRDb29yZCA9IHZTcG90TGlnaHRDb29yZFsgaSBdLnh5eiAvIHZTcG90TGlnaHRDb29yZFsgaSBdLnc7XHJcblx0XHRcdGluU3BvdExpZ2h0TWFwID0gYWxsKCBsZXNzVGhhbiggYWJzKCBzcG90TGlnaHRDb29yZCAqIDIuIC0gMS4gKSwgdmVjMyggMS4wICkgKSApO1xyXG5cdFx0XHRzcG90Q29sb3IgPSB0ZXh0dXJlMkQoIHNwb3RMaWdodE1hcFsgU1BPVF9MSUdIVF9NQVBfSU5ERVggXSwgc3BvdExpZ2h0Q29vcmQueHkgKTtcclxuXHRcdFx0ZGlyZWN0TGlnaHQuY29sb3IgPSBpblNwb3RMaWdodE1hcCA/IGRpcmVjdExpZ2h0LmNvbG9yICogc3BvdENvbG9yLnJnYiA6IGRpcmVjdExpZ2h0LmNvbG9yO1xyXG5cdFx0I2VuZGlmXHJcblxyXG5cdFx0I3VuZGVmIFNQT1RfTElHSFRfTUFQX0lOREVYXHJcblxyXG5cdFx0I2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSAmJiAoIFVOUk9MTEVEX0xPT1BfSU5ERVggPCBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIClcclxuXHRcdHNwb3RMaWdodFNoYWRvdyA9IHNwb3RMaWdodFNoYWRvd3NbIGkgXTtcclxuXHRcdGRpcmVjdExpZ2h0LmNvbG9yICo9ICggZGlyZWN0TGlnaHQudmlzaWJsZSAmJiByZWNlaXZlU2hhZG93ICkgPyBnZXRTaGFkb3coIHNwb3RTaGFkb3dNYXBbIGkgXSwgc3BvdExpZ2h0U2hhZG93LnNoYWRvd01hcFNpemUsIHNwb3RMaWdodFNoYWRvdy5zaGFkb3dJbnRlbnNpdHksIHNwb3RMaWdodFNoYWRvdy5zaGFkb3dCaWFzLCBzcG90TGlnaHRTaGFkb3cuc2hhZG93UmFkaXVzLCB2U3BvdExpZ2h0Q29vcmRbIGkgXSApIDogMS4wO1xyXG5cdFx0I2VuZGlmXHJcblxyXG5cdFx0UkVfRGlyZWN0KCBkaXJlY3RMaWdodCwgZ2VvbWV0cnlQb3NpdGlvbiwgZ2VvbWV0cnlOb3JtYWwsIGdlb21ldHJ5Vmlld0RpciwgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xyXG5cclxuXHR9XHJcblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9lbmRcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmICggTlVNX0RJUl9MSUdIVFMgPiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0IClcclxuXHJcblx0RGlyZWN0aW9uYWxMaWdodCBkaXJlY3Rpb25hbExpZ2h0O1xyXG5cdCNpZiBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQICkgJiYgTlVNX0RJUl9MSUdIVF9TSEFET1dTID4gMFxyXG5cdERpcmVjdGlvbmFsTGlnaHRTaGFkb3cgZGlyZWN0aW9uYWxMaWdodFNoYWRvdztcclxuXHQjZW5kaWZcclxuXHJcblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxyXG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9ESVJfTElHSFRTOyBpICsrICkge1xyXG5cclxuXHRcdGRpcmVjdGlvbmFsTGlnaHQgPSBkaXJlY3Rpb25hbExpZ2h0c1sgaSBdO1xyXG5cclxuXHRcdGdldERpcmVjdGlvbmFsTGlnaHRJbmZvKCBkaXJlY3Rpb25hbExpZ2h0LCBkaXJlY3RMaWdodCApO1xyXG5cclxuXHRcdCNpZiBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQICkgJiYgKCBVTlJPTExFRF9MT09QX0lOREVYIDwgTlVNX0RJUl9MSUdIVF9TSEFET1dTIClcclxuXHRcdGRpcmVjdGlvbmFsTGlnaHRTaGFkb3cgPSBkaXJlY3Rpb25hbExpZ2h0U2hhZG93c1sgaSBdO1xyXG5cdFx0ZGlyZWN0TGlnaHQuY29sb3IgKj0gKCBkaXJlY3RMaWdodC52aXNpYmxlICYmIHJlY2VpdmVTaGFkb3cgKSA/IGdldFNoYWRvdyggZGlyZWN0aW9uYWxTaGFkb3dNYXBbIGkgXSwgZGlyZWN0aW9uYWxMaWdodFNoYWRvdy5zaGFkb3dNYXBTaXplLCBkaXJlY3Rpb25hbExpZ2h0U2hhZG93LnNoYWRvd0ludGVuc2l0eSwgZGlyZWN0aW9uYWxMaWdodFNoYWRvdy5zaGFkb3dCaWFzLCBkaXJlY3Rpb25hbExpZ2h0U2hhZG93LnNoYWRvd1JhZGl1cywgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIGkgXSApIDogMS4wO1xyXG5cdFx0I2VuZGlmXHJcblxyXG5cdFx0UkVfRGlyZWN0KCBkaXJlY3RMaWdodCwgZ2VvbWV0cnlQb3NpdGlvbiwgZ2VvbWV0cnlOb3JtYWwsIGdlb21ldHJ5Vmlld0RpciwgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xyXG5cclxuXHR9XHJcblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9lbmRcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmICggTlVNX1JFQ1RfQVJFQV9MSUdIVFMgPiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0X1JlY3RBcmVhIClcclxuXHJcblx0UmVjdEFyZWFMaWdodCByZWN0QXJlYUxpZ2h0O1xyXG5cclxuXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XHJcblx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1JFQ1RfQVJFQV9MSUdIVFM7IGkgKysgKSB7XHJcblxyXG5cdFx0cmVjdEFyZWFMaWdodCA9IHJlY3RBcmVhTGlnaHRzWyBpIF07XHJcblx0XHRSRV9EaXJlY3RfUmVjdEFyZWEoIHJlY3RBcmVhTGlnaHQsIGdlb21ldHJ5UG9zaXRpb24sIGdlb21ldHJ5Tm9ybWFsLCBnZW9tZXRyeVZpZXdEaXIsIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcclxuXHJcblx0fVxyXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXHJcblxyXG4jZW5kaWZcclxuXHJcbiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdERpZmZ1c2UgKVxyXG5cclxuXHR2ZWMzIGlibElycmFkaWFuY2UgPSB2ZWMzKCAwLjAgKTtcclxuXHJcblx0dmVjMyBpcnJhZGlhbmNlID0gZ2V0QW1iaWVudExpZ2h0SXJyYWRpYW5jZSggYW1iaWVudExpZ2h0Q29sb3IgKTtcclxuXHJcblx0I2lmIGRlZmluZWQoIFVTRV9MSUdIVF9QUk9CRVMgKVxyXG5cclxuXHRcdGlycmFkaWFuY2UgKz0gZ2V0TGlnaHRQcm9iZUlycmFkaWFuY2UoIGxpZ2h0UHJvYmUsIGdlb21ldHJ5Tm9ybWFsICk7XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuXHQjaWYgKCBOVU1fSEVNSV9MSUdIVFMgPiAwIClcclxuXHJcblx0XHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XHJcblx0XHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fSEVNSV9MSUdIVFM7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRpcnJhZGlhbmNlICs9IGdldEhlbWlzcGhlcmVMaWdodElycmFkaWFuY2UoIGhlbWlzcGhlcmVMaWdodHNbIGkgXSwgZ2VvbWV0cnlOb3JtYWwgKTtcclxuXHJcblx0XHR9XHJcblx0XHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxyXG5cclxuXHQjZW5kaWZcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0U3BlY3VsYXIgKVxyXG5cclxuXHR2ZWMzIHJhZGlhbmNlID0gdmVjMyggMC4wICk7XHJcblx0dmVjMyBjbGVhcmNvYXRSYWRpYW5jZSA9IHZlYzMoIDAuMCApO1xyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdERpZmZ1c2UgKVxyXG5cclxuXHQjaWZkZWYgVVNFX0xJR0hUTUFQXHJcblxyXG5cdFx0dmVjNCBsaWdodE1hcFRleGVsID0gdGV4dHVyZTJEKCBsaWdodE1hcCwgdkxpZ2h0TWFwVXYgKTtcclxuXHRcdHZlYzMgbGlnaHRNYXBJcnJhZGlhbmNlID0gbGlnaHRNYXBUZXhlbC5yZ2IgKiBsaWdodE1hcEludGVuc2l0eTtcclxuXHJcblx0XHRpcnJhZGlhbmNlICs9IGxpZ2h0TWFwSXJyYWRpYW5jZTtcclxuXHJcblx0I2VuZGlmXHJcblxyXG5cdCNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgJiYgZGVmaW5lZCggU1RBTkRBUkQgKSAmJiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9DVUJFX1VWIClcclxuXHJcblx0XHRpYmxJcnJhZGlhbmNlICs9IGdldElCTElycmFkaWFuY2UoIGdlb21ldHJ5Tm9ybWFsICk7XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuI2VuZGlmXHJcblxyXG4jaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApICYmIGRlZmluZWQoIFJFX0luZGlyZWN0U3BlY3VsYXIgKVxyXG5cclxuXHQjaWZkZWYgVVNFX0FOSVNPVFJPUFlcclxuXHJcblx0XHRyYWRpYW5jZSArPSBnZXRJQkxBbmlzb3Ryb3B5UmFkaWFuY2UoIGdlb21ldHJ5Vmlld0RpciwgZ2VvbWV0cnlOb3JtYWwsIG1hdGVyaWFsLnJvdWdobmVzcywgbWF0ZXJpYWwuYW5pc290cm9weUIsIG1hdGVyaWFsLmFuaXNvdHJvcHkgKTtcclxuXHJcblx0I2Vsc2VcclxuXHJcblx0XHRyYWRpYW5jZSArPSBnZXRJQkxSYWRpYW5jZSggZ2VvbWV0cnlWaWV3RGlyLCBnZW9tZXRyeU5vcm1hbCwgbWF0ZXJpYWwucm91Z2huZXNzICk7XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuXHQjaWZkZWYgVVNFX0NMRUFSQ09BVFxyXG5cclxuXHRcdGNsZWFyY29hdFJhZGlhbmNlICs9IGdldElCTFJhZGlhbmNlKCBnZW9tZXRyeVZpZXdEaXIsIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgKTtcclxuXHJcblx0I2VuZGlmXHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0RGlmZnVzZSApXHJcblxyXG5cdFJFX0luZGlyZWN0RGlmZnVzZSggaXJyYWRpYW5jZSwgZ2VvbWV0cnlQb3NpdGlvbiwgZ2VvbWV0cnlOb3JtYWwsIGdlb21ldHJ5Vmlld0RpciwgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xyXG5cclxuI2VuZGlmXHJcblxyXG4jaWYgZGVmaW5lZCggUkVfSW5kaXJlY3RTcGVjdWxhciApXHJcblxyXG5cdFJFX0luZGlyZWN0U3BlY3VsYXIoIHJhZGlhbmNlLCBpYmxJcnJhZGlhbmNlLCBjbGVhcmNvYXRSYWRpYW5jZSwgZ2VvbWV0cnlQb3NpdGlvbiwgZ2VvbWV0cnlOb3JtYWwsIGdlb21ldHJ5Vmlld0RpciwgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbiNpZiBkZWZpbmVkKCBVU0VfTE9HREVQVEhCVUYgKVxyXG5cclxuXHQvLyBEb2luZyBhIHN0cmljdCBjb21wYXJpc29uIHdpdGggPT0gMS4wIGNhbiBjYXVzZSBub2lzZSBhcnRpZmFjdHNcclxuXHQvLyBvbiBzb21lIHBsYXRmb3Jtcy4gU2VlIGlzc3VlICMxNzYyMy5cclxuXHRnbF9GcmFnRGVwdGggPSB2SXNQZXJzcGVjdGl2ZSA9PSAwLjAgPyBnbF9GcmFnQ29vcmQueiA6IGxvZzIoIHZGcmFnRGVwdGggKSAqIGxvZ0RlcHRoQnVmRkMgKiAwLjU7XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmIGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRiApXHJcblxyXG5cdHVuaWZvcm0gZmxvYXQgbG9nRGVwdGhCdWZGQztcclxuXHR2YXJ5aW5nIGZsb2F0IHZGcmFnRGVwdGg7XHJcblx0dmFyeWluZyBmbG9hdCB2SXNQZXJzcGVjdGl2ZTtcclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jaWZkZWYgVVNFX0xPR0RFUFRIQlVGXHJcblxyXG5cdHZhcnlpbmcgZmxvYXQgdkZyYWdEZXB0aDtcclxuXHR2YXJ5aW5nIGZsb2F0IHZJc1BlcnNwZWN0aXZlO1xyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbiNpZmRlZiBVU0VfTE9HREVQVEhCVUZcclxuXHJcblx0dkZyYWdEZXB0aCA9IDEuMCArIGdsX1Bvc2l0aW9uLnc7XHJcblx0dklzUGVyc3BlY3RpdmUgPSBmbG9hdCggaXNQZXJzcGVjdGl2ZU1hdHJpeCggcHJvamVjdGlvbk1hdHJpeCApICk7XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmZGVmIFVTRV9NQVBcclxuXHJcblx0dmVjNCBzYW1wbGVkRGlmZnVzZUNvbG9yID0gdGV4dHVyZTJEKCBtYXAsIHZNYXBVdiApO1xyXG5cclxuXHQjaWZkZWYgREVDT0RFX1ZJREVPX1RFWFRVUkVcclxuXHJcblx0XHQvLyB1c2UgaW5saW5lIHNSR0IgZGVjb2RlIHVudGlsIGJyb3dzZXJzIHByb3Blcmx5IHN1cHBvcnQgU1JHQjhfQUxQSEE4IHdpdGggdmlkZW8gdGV4dHVyZXMgKCMyNjUxNilcclxuXHJcblx0XHRzYW1wbGVkRGlmZnVzZUNvbG9yID0gc1JHQlRyYW5zZmVyRU9URiggc2FtcGxlZERpZmZ1c2VDb2xvciApO1xyXG5cclxuXHQjZW5kaWZcclxuXHJcblx0ZGlmZnVzZUNvbG9yICo9IHNhbXBsZWREaWZmdXNlQ29sb3I7XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmZGVmIFVTRV9NQVBcclxuXHJcblx0dW5pZm9ybSBzYW1wbGVyMkQgbWFwO1xyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbiNpZiBkZWZpbmVkKCBVU0VfTUFQICkgfHwgZGVmaW5lZCggVVNFX0FMUEhBTUFQIClcclxuXHJcblx0I2lmIGRlZmluZWQoIFVTRV9QT0lOVFNfVVYgKVxyXG5cclxuXHRcdHZlYzIgdXYgPSB2VXY7XHJcblxyXG5cdCNlbHNlXHJcblxyXG5cdFx0dmVjMiB1diA9ICggdXZUcmFuc2Zvcm0gKiB2ZWMzKCBnbF9Qb2ludENvb3JkLngsIDEuMCAtIGdsX1BvaW50Q29vcmQueSwgMSApICkueHk7XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuI2VuZGlmXHJcblxyXG4jaWZkZWYgVVNFX01BUFxyXG5cclxuXHRkaWZmdXNlQ29sb3IgKj0gdGV4dHVyZTJEKCBtYXAsIHV2ICk7XHJcblxyXG4jZW5kaWZcclxuXHJcbiNpZmRlZiBVU0VfQUxQSEFNQVBcclxuXHJcblx0ZGlmZnVzZUNvbG9yLmEgKj0gdGV4dHVyZTJEKCBhbHBoYU1hcCwgdXYgKS5nO1xyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbiNpZiBkZWZpbmVkKCBVU0VfUE9JTlRTX1VWIClcclxuXHJcblx0dmFyeWluZyB2ZWMyIHZVdjtcclxuXHJcbiNlbHNlXHJcblxyXG5cdCNpZiBkZWZpbmVkKCBVU0VfTUFQICkgfHwgZGVmaW5lZCggVVNFX0FMUEhBTUFQIClcclxuXHJcblx0XHR1bmlmb3JtIG1hdDMgdXZUcmFuc2Zvcm07XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuI2VuZGlmXHJcblxyXG4jaWZkZWYgVVNFX01BUFxyXG5cclxuXHR1bmlmb3JtIHNhbXBsZXIyRCBtYXA7XHJcblxyXG4jZW5kaWZcclxuXHJcbiNpZmRlZiBVU0VfQUxQSEFNQVBcclxuXHJcblx0dW5pZm9ybSBzYW1wbGVyMkQgYWxwaGFNYXA7XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuZmxvYXQgbWV0YWxuZXNzRmFjdG9yID0gbWV0YWxuZXNzO1xyXG5cclxuI2lmZGVmIFVTRV9NRVRBTE5FU1NNQVBcclxuXHJcblx0dmVjNCB0ZXhlbE1ldGFsbmVzcyA9IHRleHR1cmUyRCggbWV0YWxuZXNzTWFwLCB2TWV0YWxuZXNzTWFwVXYgKTtcclxuXHJcblx0Ly8gcmVhZHMgY2hhbm5lbCBCLCBjb21wYXRpYmxlIHdpdGggYSBjb21iaW5lZCBPY2NsdXNpb25Sb3VnaG5lc3NNZXRhbGxpYyAoUkdCKSB0ZXh0dXJlXHJcblx0bWV0YWxuZXNzRmFjdG9yICo9IHRleGVsTWV0YWxuZXNzLmI7XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmZGVmIFVTRV9NRVRBTE5FU1NNQVBcclxuXHJcblx0dW5pZm9ybSBzYW1wbGVyMkQgbWV0YWxuZXNzTWFwO1xyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbiNpZmRlZiBVU0VfSU5TVEFOQ0lOR19NT1JQSFxyXG5cclxuXHRmbG9hdCBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIE1PUlBIVEFSR0VUU19DT1VOVCBdO1xyXG5cclxuXHRmbG9hdCBtb3JwaFRhcmdldEJhc2VJbmZsdWVuY2UgPSB0ZXhlbEZldGNoKCBtb3JwaFRleHR1cmUsIGl2ZWMyKCAwLCBnbF9JbnN0YW5jZUlEICksIDAgKS5yO1xyXG5cclxuXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBNT1JQSFRBUkdFVFNfQ09VTlQ7IGkgKysgKSB7XHJcblxyXG5cdFx0bW9ycGhUYXJnZXRJbmZsdWVuY2VzW2ldID0gIHRleGVsRmV0Y2goIG1vcnBoVGV4dHVyZSwgaXZlYzIoIGkgKyAxLCBnbF9JbnN0YW5jZUlEICksIDAgKS5yO1xyXG5cclxuXHR9XHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jaWYgZGVmaW5lZCggVVNFX01PUlBIQ09MT1JTIClcclxuXHJcblx0Ly8gbW9ycGhUYXJnZXRCYXNlSW5mbHVlbmNlIGlzIHNldCBiYXNlZCBvbiBCdWZmZXJHZW9tZXRyeS5tb3JwaFRhcmdldHNSZWxhdGl2ZSB2YWx1ZTpcclxuXHQvLyBXaGVuIG1vcnBoVGFyZ2V0c1JlbGF0aXZlIGlzIGZhbHNlLCB0aGlzIGlzIHNldCB0byAxIC0gc3VtKGluZmx1ZW5jZXMpOyB0aGlzIHJlc3VsdHMgaW4gbm9ybWFsID0gc3VtKCh0YXJnZXQgLSBiYXNlKSAqIGluZmx1ZW5jZSlcclxuXHQvLyBXaGVuIG1vcnBoVGFyZ2V0c1JlbGF0aXZlIGlzIHRydWUsIHRoaXMgaXMgc2V0IHRvIDE7IGFzIGEgcmVzdWx0LCBhbGwgbW9ycGggdGFyZ2V0cyBhcmUgc2ltcGx5IGFkZGVkIHRvIHRoZSBiYXNlIGFmdGVyIHdlaWdodGluZ1xyXG5cdHZDb2xvciAqPSBtb3JwaFRhcmdldEJhc2VJbmZsdWVuY2U7XHJcblxyXG5cdGZvciAoIGludCBpID0gMDsgaSA8IE1PUlBIVEFSR0VUU19DT1VOVDsgaSArKyApIHtcclxuXHJcblx0XHQjaWYgZGVmaW5lZCggVVNFX0NPTE9SX0FMUEhBIClcclxuXHJcblx0XHRcdGlmICggbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBpIF0gIT0gMC4wICkgdkNvbG9yICs9IGdldE1vcnBoKCBnbF9WZXJ0ZXhJRCwgaSwgMiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBpIF07XHJcblxyXG5cdFx0I2VsaWYgZGVmaW5lZCggVVNFX0NPTE9SIClcclxuXHJcblx0XHRcdGlmICggbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBpIF0gIT0gMC4wICkgdkNvbG9yICs9IGdldE1vcnBoKCBnbF9WZXJ0ZXhJRCwgaSwgMiApLnJnYiAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgaSBdO1xyXG5cclxuXHRcdCNlbmRpZlxyXG5cclxuXHR9XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmZGVmIFVTRV9NT1JQSE5PUk1BTFNcclxuXHJcblx0Ly8gbW9ycGhUYXJnZXRCYXNlSW5mbHVlbmNlIGlzIHNldCBiYXNlZCBvbiBCdWZmZXJHZW9tZXRyeS5tb3JwaFRhcmdldHNSZWxhdGl2ZSB2YWx1ZTpcclxuXHQvLyBXaGVuIG1vcnBoVGFyZ2V0c1JlbGF0aXZlIGlzIGZhbHNlLCB0aGlzIGlzIHNldCB0byAxIC0gc3VtKGluZmx1ZW5jZXMpOyB0aGlzIHJlc3VsdHMgaW4gbm9ybWFsID0gc3VtKCh0YXJnZXQgLSBiYXNlKSAqIGluZmx1ZW5jZSlcclxuXHQvLyBXaGVuIG1vcnBoVGFyZ2V0c1JlbGF0aXZlIGlzIHRydWUsIHRoaXMgaXMgc2V0IHRvIDE7IGFzIGEgcmVzdWx0LCBhbGwgbW9ycGggdGFyZ2V0cyBhcmUgc2ltcGx5IGFkZGVkIHRvIHRoZSBiYXNlIGFmdGVyIHdlaWdodGluZ1xyXG5cdG9iamVjdE5vcm1hbCAqPSBtb3JwaFRhcmdldEJhc2VJbmZsdWVuY2U7XHJcblxyXG5cdGZvciAoIGludCBpID0gMDsgaSA8IE1PUlBIVEFSR0VUU19DT1VOVDsgaSArKyApIHtcclxuXHJcblx0XHRpZiAoIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgaSBdICE9IDAuMCApIG9iamVjdE5vcm1hbCArPSBnZXRNb3JwaCggZ2xfVmVydGV4SUQsIGksIDEgKS54eXogKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIGkgXTtcclxuXHJcblx0fVxyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbiNpZmRlZiBVU0VfTU9SUEhUQVJHRVRTXHJcblxyXG5cdCNpZm5kZWYgVVNFX0lOU1RBTkNJTkdfTU9SUEhcclxuXHJcblx0XHR1bmlmb3JtIGZsb2F0IG1vcnBoVGFyZ2V0QmFzZUluZmx1ZW5jZTtcclxuXHRcdHVuaWZvcm0gZmxvYXQgbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBNT1JQSFRBUkdFVFNfQ09VTlQgXTtcclxuXHJcblx0I2VuZGlmXHJcblxyXG5cdHVuaWZvcm0gc2FtcGxlcjJEQXJyYXkgbW9ycGhUYXJnZXRzVGV4dHVyZTtcclxuXHR1bmlmb3JtIGl2ZWMyIG1vcnBoVGFyZ2V0c1RleHR1cmVTaXplO1xyXG5cclxuXHR2ZWM0IGdldE1vcnBoKCBjb25zdCBpbiBpbnQgdmVydGV4SW5kZXgsIGNvbnN0IGluIGludCBtb3JwaFRhcmdldEluZGV4LCBjb25zdCBpbiBpbnQgb2Zmc2V0ICkge1xyXG5cclxuXHRcdGludCB0ZXhlbEluZGV4ID0gdmVydGV4SW5kZXggKiBNT1JQSFRBUkdFVFNfVEVYVFVSRV9TVFJJREUgKyBvZmZzZXQ7XHJcblx0XHRpbnQgeSA9IHRleGVsSW5kZXggLyBtb3JwaFRhcmdldHNUZXh0dXJlU2l6ZS54O1xyXG5cdFx0aW50IHggPSB0ZXhlbEluZGV4IC0geSAqIG1vcnBoVGFyZ2V0c1RleHR1cmVTaXplLng7XHJcblxyXG5cdFx0aXZlYzMgbW9ycGhVViA9IGl2ZWMzKCB4LCB5LCBtb3JwaFRhcmdldEluZGV4ICk7XHJcblx0XHRyZXR1cm4gdGV4ZWxGZXRjaCggbW9ycGhUYXJnZXRzVGV4dHVyZSwgbW9ycGhVViwgMCApO1xyXG5cclxuXHR9XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmZGVmIFVTRV9NT1JQSFRBUkdFVFNcclxuXHJcblx0Ly8gbW9ycGhUYXJnZXRCYXNlSW5mbHVlbmNlIGlzIHNldCBiYXNlZCBvbiBCdWZmZXJHZW9tZXRyeS5tb3JwaFRhcmdldHNSZWxhdGl2ZSB2YWx1ZTpcclxuXHQvLyBXaGVuIG1vcnBoVGFyZ2V0c1JlbGF0aXZlIGlzIGZhbHNlLCB0aGlzIGlzIHNldCB0byAxIC0gc3VtKGluZmx1ZW5jZXMpOyB0aGlzIHJlc3VsdHMgaW4gcG9zaXRpb24gPSBzdW0oKHRhcmdldCAtIGJhc2UpICogaW5mbHVlbmNlKVxyXG5cdC8vIFdoZW4gbW9ycGhUYXJnZXRzUmVsYXRpdmUgaXMgdHJ1ZSwgdGhpcyBpcyBzZXQgdG8gMTsgYXMgYSByZXN1bHQsIGFsbCBtb3JwaCB0YXJnZXRzIGFyZSBzaW1wbHkgYWRkZWQgdG8gdGhlIGJhc2UgYWZ0ZXIgd2VpZ2h0aW5nXHJcblx0dHJhbnNmb3JtZWQgKj0gbW9ycGhUYXJnZXRCYXNlSW5mbHVlbmNlO1xyXG5cclxuXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBNT1JQSFRBUkdFVFNfQ09VTlQ7IGkgKysgKSB7XHJcblxyXG5cdFx0aWYgKCBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIGkgXSAhPSAwLjAgKSB0cmFuc2Zvcm1lZCArPSBnZXRNb3JwaCggZ2xfVmVydGV4SUQsIGksIDAgKS54eXogKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIGkgXTtcclxuXHJcblx0fVxyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbmZsb2F0IGZhY2VEaXJlY3Rpb24gPSBnbF9Gcm9udEZhY2luZyA/IDEuMCA6IC0gMS4wO1xyXG5cclxuI2lmZGVmIEZMQVRfU0hBREVEXHJcblxyXG5cdHZlYzMgZmR4ID0gZEZkeCggdlZpZXdQb3NpdGlvbiApO1xyXG5cdHZlYzMgZmR5ID0gZEZkeSggdlZpZXdQb3NpdGlvbiApO1xyXG5cdHZlYzMgbm9ybWFsID0gbm9ybWFsaXplKCBjcm9zcyggZmR4LCBmZHkgKSApO1xyXG5cclxuI2Vsc2VcclxuXHJcblx0dmVjMyBub3JtYWwgPSBub3JtYWxpemUoIHZOb3JtYWwgKTtcclxuXHJcblx0I2lmZGVmIERPVUJMRV9TSURFRFxyXG5cclxuXHRcdG5vcm1hbCAqPSBmYWNlRGlyZWN0aW9uO1xyXG5cclxuXHQjZW5kaWZcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmIGRlZmluZWQoIFVTRV9OT1JNQUxNQVBfVEFOR0VOVFNQQUNFICkgfHwgZGVmaW5lZCggVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQU5JU09UUk9QWSApXHJcblxyXG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxyXG5cclxuXHRcdG1hdDMgdGJuID0gbWF0Myggbm9ybWFsaXplKCB2VGFuZ2VudCApLCBub3JtYWxpemUoIHZCaXRhbmdlbnQgKSwgbm9ybWFsICk7XHJcblxyXG5cdCNlbHNlXHJcblxyXG5cdFx0bWF0MyB0Ym4gPSBnZXRUYW5nZW50RnJhbWUoIC0gdlZpZXdQb3NpdGlvbiwgbm9ybWFsLFxyXG5cdFx0I2lmIGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKVxyXG5cdFx0XHR2Tm9ybWFsTWFwVXZcclxuXHRcdCNlbGlmIGRlZmluZWQoIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQIClcclxuXHRcdFx0dkNsZWFyY29hdE5vcm1hbE1hcFV2XHJcblx0XHQjZWxzZVxyXG5cdFx0XHR2VXZcclxuXHRcdCNlbmRpZlxyXG5cdFx0KTtcclxuXHJcblx0I2VuZGlmXHJcblxyXG5cdCNpZiBkZWZpbmVkKCBET1VCTEVfU0lERUQgKSAmJiAhIGRlZmluZWQoIEZMQVRfU0hBREVEIClcclxuXHJcblx0XHR0Ym5bMF0gKj0gZmFjZURpcmVjdGlvbjtcclxuXHRcdHRiblsxXSAqPSBmYWNlRGlyZWN0aW9uO1xyXG5cclxuXHQjZW5kaWZcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmZGVmIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQXHJcblxyXG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxyXG5cclxuXHRcdG1hdDMgdGJuMiA9IG1hdDMoIG5vcm1hbGl6ZSggdlRhbmdlbnQgKSwgbm9ybWFsaXplKCB2Qml0YW5nZW50ICksIG5vcm1hbCApO1xyXG5cclxuXHQjZWxzZVxyXG5cclxuXHRcdG1hdDMgdGJuMiA9IGdldFRhbmdlbnRGcmFtZSggLSB2Vmlld1Bvc2l0aW9uLCBub3JtYWwsIHZDbGVhcmNvYXROb3JtYWxNYXBVdiApO1xyXG5cclxuXHQjZW5kaWZcclxuXHJcblx0I2lmIGRlZmluZWQoIERPVUJMRV9TSURFRCApICYmICEgZGVmaW5lZCggRkxBVF9TSEFERUQgKVxyXG5cclxuXHRcdHRibjJbMF0gKj0gZmFjZURpcmVjdGlvbjtcclxuXHRcdHRibjJbMV0gKj0gZmFjZURpcmVjdGlvbjtcclxuXHJcblx0I2VuZGlmXHJcblxyXG4jZW5kaWZcclxuXHJcbi8vIG5vbiBwZXJ0dXJiZWQgbm9ybWFsIGZvciBjbGVhcmNvYXQgYW1vbmcgb3RoZXJzXHJcblxyXG52ZWMzIG5vblBlcnR1cmJlZE5vcm1hbCA9IG5vcm1hbDtcclxuXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcblxyXG4jaWZkZWYgVVNFX05PUk1BTE1BUF9PQkpFQ1RTUEFDRVxyXG5cclxuXHRub3JtYWwgPSB0ZXh0dXJlMkQoIG5vcm1hbE1hcCwgdk5vcm1hbE1hcFV2ICkueHl6ICogMi4wIC0gMS4wOyAvLyBvdmVycmlkZXMgYm90aCBmbGF0U2hhZGluZyBhbmQgYXR0cmlidXRlIG5vcm1hbHNcclxuXHJcblx0I2lmZGVmIEZMSVBfU0lERURcclxuXHJcblx0XHRub3JtYWwgPSAtIG5vcm1hbDtcclxuXHJcblx0I2VuZGlmXHJcblxyXG5cdCNpZmRlZiBET1VCTEVfU0lERURcclxuXHJcblx0XHRub3JtYWwgPSBub3JtYWwgKiBmYWNlRGlyZWN0aW9uO1xyXG5cclxuXHQjZW5kaWZcclxuXHJcblx0bm9ybWFsID0gbm9ybWFsaXplKCBub3JtYWxNYXRyaXggKiBub3JtYWwgKTtcclxuXHJcbiNlbGlmIGRlZmluZWQoIFVTRV9OT1JNQUxNQVBfVEFOR0VOVFNQQUNFIClcclxuXHJcblx0dmVjMyBtYXBOID0gdGV4dHVyZTJEKCBub3JtYWxNYXAsIHZOb3JtYWxNYXBVdiApLnh5eiAqIDIuMCAtIDEuMDtcclxuXHRtYXBOLnh5ICo9IG5vcm1hbFNjYWxlO1xyXG5cclxuXHRub3JtYWwgPSBub3JtYWxpemUoIHRibiAqIG1hcE4gKTtcclxuXHJcbiNlbGlmIGRlZmluZWQoIFVTRV9CVU1QTUFQIClcclxuXHJcblx0bm9ybWFsID0gcGVydHVyYk5vcm1hbEFyYiggLSB2Vmlld1Bvc2l0aW9uLCBub3JtYWwsIGRIZHh5X2Z3ZCgpLCBmYWNlRGlyZWN0aW9uICk7XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmbmRlZiBGTEFUX1NIQURFRFxyXG5cclxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcclxuXHJcblx0I2lmZGVmIFVTRV9UQU5HRU5UXHJcblxyXG5cdFx0dmFyeWluZyB2ZWMzIHZUYW5nZW50O1xyXG5cdFx0dmFyeWluZyB2ZWMzIHZCaXRhbmdlbnQ7XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbiNpZm5kZWYgRkxBVF9TSEFERURcclxuXHJcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XHJcblxyXG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxyXG5cclxuXHRcdHZhcnlpbmcgdmVjMyB2VGFuZ2VudDtcclxuXHRcdHZhcnlpbmcgdmVjMyB2Qml0YW5nZW50O1xyXG5cclxuXHQjZW5kaWZcclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jaWZuZGVmIEZMQVRfU0hBREVEIC8vIG5vcm1hbCBpcyBjb21wdXRlZCB3aXRoIGRlcml2YXRpdmVzIHdoZW4gRkxBVF9TSEFERURcclxuXHJcblx0dk5vcm1hbCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcclxuXHJcblx0I2lmZGVmIFVTRV9UQU5HRU5UXHJcblxyXG5cdFx0dlRhbmdlbnQgPSBub3JtYWxpemUoIHRyYW5zZm9ybWVkVGFuZ2VudCApO1xyXG5cdFx0dkJpdGFuZ2VudCA9IG5vcm1hbGl6ZSggY3Jvc3MoIHZOb3JtYWwsIHZUYW5nZW50ICkgKiB0YW5nZW50LncgKTtcclxuXHJcblx0I2VuZGlmXHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmZGVmIFVTRV9OT1JNQUxNQVBcclxuXHJcblx0dW5pZm9ybSBzYW1wbGVyMkQgbm9ybWFsTWFwO1xyXG5cdHVuaWZvcm0gdmVjMiBub3JtYWxTY2FsZTtcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmZGVmIFVTRV9OT1JNQUxNQVBfT0JKRUNUU1BBQ0VcclxuXHJcblx0dW5pZm9ybSBtYXQzIG5vcm1hbE1hdHJpeDtcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmICEgZGVmaW5lZCAoIFVTRV9UQU5HRU5UICkgJiYgKCBkZWZpbmVkICggVVNFX05PUk1BTE1BUF9UQU5HRU5UU1BBQ0UgKSB8fCBkZWZpbmVkICggVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQU5JU09UUk9QWSApIClcclxuXHJcblx0Ly8gTm9ybWFsIE1hcHBpbmcgV2l0aG91dCBQcmVjb21wdXRlZCBUYW5nZW50c1xyXG5cdC8vIGh0dHA6Ly93d3cudGhldGVudGhwbGFuZXQuZGUvYXJjaGl2ZXMvMTE4MFxyXG5cclxuXHRtYXQzIGdldFRhbmdlbnRGcmFtZSggdmVjMyBleWVfcG9zLCB2ZWMzIHN1cmZfbm9ybSwgdmVjMiB1diApIHtcclxuXHJcblx0XHR2ZWMzIHEwID0gZEZkeCggZXllX3Bvcy54eXogKTtcclxuXHRcdHZlYzMgcTEgPSBkRmR5KCBleWVfcG9zLnh5eiApO1xyXG5cdFx0dmVjMiBzdDAgPSBkRmR4KCB1di5zdCApO1xyXG5cdFx0dmVjMiBzdDEgPSBkRmR5KCB1di5zdCApO1xyXG5cclxuXHRcdHZlYzMgTiA9IHN1cmZfbm9ybTsgLy8gbm9ybWFsaXplZFxyXG5cclxuXHRcdHZlYzMgcTFwZXJwID0gY3Jvc3MoIHExLCBOICk7XHJcblx0XHR2ZWMzIHEwcGVycCA9IGNyb3NzKCBOLCBxMCApO1xyXG5cclxuXHRcdHZlYzMgVCA9IHExcGVycCAqIHN0MC54ICsgcTBwZXJwICogc3QxLng7XHJcblx0XHR2ZWMzIEIgPSBxMXBlcnAgKiBzdDAueSArIHEwcGVycCAqIHN0MS55O1xyXG5cclxuXHRcdGZsb2F0IGRldCA9IG1heCggZG90KCBULCBUICksIGRvdCggQiwgQiApICk7XHJcblx0XHRmbG9hdCBzY2FsZSA9ICggZGV0ID09IDAuMCApID8gMC4wIDogaW52ZXJzZXNxcnQoIGRldCApO1xyXG5cclxuXHRcdHJldHVybiBtYXQzKCBUICogc2NhbGUsIEIgKiBzY2FsZSwgTiApO1xyXG5cclxuXHR9XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmZGVmIFVTRV9DTEVBUkNPQVRcclxuXHJcblx0dmVjMyBjbGVhcmNvYXROb3JtYWwgPSBub25QZXJ0dXJiZWROb3JtYWw7XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmZGVmIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQXHJcblxyXG5cdHZlYzMgY2xlYXJjb2F0TWFwTiA9IHRleHR1cmUyRCggY2xlYXJjb2F0Tm9ybWFsTWFwLCB2Q2xlYXJjb2F0Tm9ybWFsTWFwVXYgKS54eXogKiAyLjAgLSAxLjA7XHJcblx0Y2xlYXJjb2F0TWFwTi54eSAqPSBjbGVhcmNvYXROb3JtYWxTY2FsZTtcclxuXHJcblx0Y2xlYXJjb2F0Tm9ybWFsID0gbm9ybWFsaXplKCB0Ym4yICogY2xlYXJjb2F0TWFwTiApO1xyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcblxyXG4jaWZkZWYgVVNFX0NMRUFSQ09BVE1BUFxyXG5cclxuXHR1bmlmb3JtIHNhbXBsZXIyRCBjbGVhcmNvYXRNYXA7XHJcblxyXG4jZW5kaWZcclxuXHJcbiNpZmRlZiBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUFxyXG5cclxuXHR1bmlmb3JtIHNhbXBsZXIyRCBjbGVhcmNvYXROb3JtYWxNYXA7XHJcblx0dW5pZm9ybSB2ZWMyIGNsZWFyY29hdE5vcm1hbFNjYWxlO1xyXG5cclxuI2VuZGlmXHJcblxyXG4jaWZkZWYgVVNFX0NMRUFSQ09BVF9ST1VHSE5FU1NNQVBcclxuXHJcblx0dW5pZm9ybSBzYW1wbGVyMkQgY2xlYXJjb2F0Um91Z2huZXNzTWFwO1xyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcblxyXG4jaWZkZWYgVVNFX0lSSURFU0NFTkNFTUFQXHJcblxyXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGlyaWRlc2NlbmNlTWFwO1xyXG5cclxuI2VuZGlmXHJcblxyXG4jaWZkZWYgVVNFX0lSSURFU0NFTkNFX1RISUNLTkVTU01BUFxyXG5cclxuXHR1bmlmb3JtIHNhbXBsZXIyRCBpcmlkZXNjZW5jZVRoaWNrbmVzc01hcDtcclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jaWZkZWYgT1BBUVVFXHJcbmRpZmZ1c2VDb2xvci5hID0gMS4wO1xyXG4jZW5kaWZcclxuXHJcbiNpZmRlZiBVU0VfVFJBTlNNSVNTSU9OXHJcbmRpZmZ1c2VDb2xvci5hICo9IG1hdGVyaWFsLnRyYW5zbWlzc2lvbkFscGhhO1xyXG4jZW5kaWZcclxuXHJcbmdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbnZlYzMgcGFja05vcm1hbFRvUkdCKCBjb25zdCBpbiB2ZWMzIG5vcm1hbCApIHtcclxuXHRyZXR1cm4gbm9ybWFsaXplKCBub3JtYWwgKSAqIDAuNSArIDAuNTtcclxufVxyXG5cclxudmVjMyB1bnBhY2tSR0JUb05vcm1hbCggY29uc3QgaW4gdmVjMyByZ2IgKSB7XHJcblx0cmV0dXJuIDIuMCAqIHJnYi54eXogLSAxLjA7XHJcbn1cclxuXHJcbmNvbnN0IGZsb2F0IFBhY2tVcHNjYWxlID0gMjU2LiAvIDI1NS47IC8vIGZyYWN0aW9uIC0+IDAuLjEgKGluY2x1ZGluZyAxKVxyXG5jb25zdCBmbG9hdCBVbnBhY2tEb3duc2NhbGUgPSAyNTUuIC8gMjU2LjsgLy8gMC4uMSAtPiBmcmFjdGlvbiAoZXhjbHVkaW5nIDEpXHJcbmNvbnN0IGZsb2F0IFNoaWZ0UmlnaHQ4ID0gMS4gLyAyNTYuO1xyXG5jb25zdCBmbG9hdCBJbnYyNTUgPSAxLiAvIDI1NS47XHJcblxyXG5jb25zdCB2ZWM0IFBhY2tGYWN0b3JzID0gdmVjNCggMS4wLCAyNTYuMCwgMjU2LjAgKiAyNTYuMCwgMjU2LjAgKiAyNTYuMCAqIDI1Ni4wICk7XHJcblxyXG5jb25zdCB2ZWMyIFVucGFja0ZhY3RvcnMyID0gdmVjMiggVW5wYWNrRG93bnNjYWxlLCAxLjAgLyBQYWNrRmFjdG9ycy5nICk7XHJcbmNvbnN0IHZlYzMgVW5wYWNrRmFjdG9yczMgPSB2ZWMzKCBVbnBhY2tEb3duc2NhbGUgLyBQYWNrRmFjdG9ycy5yZywgMS4wIC8gUGFja0ZhY3RvcnMuYiApO1xyXG5jb25zdCB2ZWM0IFVucGFja0ZhY3RvcnM0ID0gdmVjNCggVW5wYWNrRG93bnNjYWxlIC8gUGFja0ZhY3RvcnMucmdiLCAxLjAgLyBQYWNrRmFjdG9ycy5hICk7XHJcblxyXG52ZWM0IHBhY2tEZXB0aFRvUkdCQSggY29uc3QgaW4gZmxvYXQgdiApIHtcclxuXHRpZiggdiA8PSAwLjAgKVxyXG5cdFx0cmV0dXJuIHZlYzQoIDAuLCAwLiwgMC4sIDAuICk7XHJcblx0aWYoIHYgPj0gMS4wIClcclxuXHRcdHJldHVybiB2ZWM0KCAxLiwgMS4sIDEuLCAxLiApO1xyXG5cdGZsb2F0IHZ1ZjtcclxuXHRmbG9hdCBhZiA9IG1vZGYoIHYgKiBQYWNrRmFjdG9ycy5hLCB2dWYgKTtcclxuXHRmbG9hdCBiZiA9IG1vZGYoIHZ1ZiAqIFNoaWZ0UmlnaHQ4LCB2dWYgKTtcclxuXHRmbG9hdCBnZiA9IG1vZGYoIHZ1ZiAqIFNoaWZ0UmlnaHQ4LCB2dWYgKTtcclxuXHRyZXR1cm4gdmVjNCggdnVmICogSW52MjU1LCBnZiAqIFBhY2tVcHNjYWxlLCBiZiAqIFBhY2tVcHNjYWxlLCBhZiApO1xyXG59XHJcblxyXG52ZWMzIHBhY2tEZXB0aFRvUkdCKCBjb25zdCBpbiBmbG9hdCB2ICkge1xyXG5cdGlmKCB2IDw9IDAuMCApXHJcblx0XHRyZXR1cm4gdmVjMyggMC4sIDAuLCAwLiApO1xyXG5cdGlmKCB2ID49IDEuMCApXHJcblx0XHRyZXR1cm4gdmVjMyggMS4sIDEuLCAxLiApO1xyXG5cdGZsb2F0IHZ1ZjtcclxuXHRmbG9hdCBiZiA9IG1vZGYoIHYgKiBQYWNrRmFjdG9ycy5iLCB2dWYgKTtcclxuXHRmbG9hdCBnZiA9IG1vZGYoIHZ1ZiAqIFNoaWZ0UmlnaHQ4LCB2dWYgKTtcclxuXHQvLyB0aGUgMC45OTk5IHR3ZWFrIGlzIHVuaW1wb3J0YW50LCB2ZXJ5IHRpbnkgZW1waXJpY2FsIGltcHJvdmVtZW50XHJcblx0Ly8gcmV0dXJuIHZlYzMoIHZ1ZiAqIEludjI1NSwgZ2YgKiBQYWNrVXBzY2FsZSwgYmYgKiAwLjk5OTkgKTtcclxuXHRyZXR1cm4gdmVjMyggdnVmICogSW52MjU1LCBnZiAqIFBhY2tVcHNjYWxlLCBiZiApO1xyXG59XHJcblxyXG52ZWMyIHBhY2tEZXB0aFRvUkcoIGNvbnN0IGluIGZsb2F0IHYgKSB7XHJcblx0aWYoIHYgPD0gMC4wIClcclxuXHRcdHJldHVybiB2ZWMyKCAwLiwgMC4gKTtcclxuXHRpZiggdiA+PSAxLjAgKVxyXG5cdFx0cmV0dXJuIHZlYzIoIDEuLCAxLiApO1xyXG5cdGZsb2F0IHZ1ZjtcclxuXHRmbG9hdCBnZiA9IG1vZGYoIHYgKiAyNTYuLCB2dWYgKTtcclxuXHRyZXR1cm4gdmVjMiggdnVmICogSW52MjU1LCBnZiApO1xyXG59XHJcblxyXG5mbG9hdCB1bnBhY2tSR0JBVG9EZXB0aCggY29uc3QgaW4gdmVjNCB2ICkge1xyXG5cdHJldHVybiBkb3QoIHYsIFVucGFja0ZhY3RvcnM0ICk7XHJcbn1cclxuXHJcbmZsb2F0IHVucGFja1JHQlRvRGVwdGgoIGNvbnN0IGluIHZlYzMgdiApIHtcclxuXHRyZXR1cm4gZG90KCB2LCBVbnBhY2tGYWN0b3JzMyApO1xyXG59XHJcblxyXG5mbG9hdCB1bnBhY2tSR1RvRGVwdGgoIGNvbnN0IGluIHZlYzIgdiApIHtcclxuXHRyZXR1cm4gdi5yICogVW5wYWNrRmFjdG9yczIuciArIHYuZyAqIFVucGFja0ZhY3RvcnMyLmc7XHJcbn1cclxuXHJcbnZlYzQgcGFjazJIYWxmVG9SR0JBKCBjb25zdCBpbiB2ZWMyIHYgKSB7XHJcblx0dmVjNCByID0gdmVjNCggdi54LCBmcmFjdCggdi54ICogMjU1LjAgKSwgdi55LCBmcmFjdCggdi55ICogMjU1LjAgKSApO1xyXG5cdHJldHVybiB2ZWM0KCByLnggLSByLnkgLyAyNTUuMCwgci55LCByLnogLSByLncgLyAyNTUuMCwgci53ICk7XHJcbn1cclxuXHJcbnZlYzIgdW5wYWNrUkdCQVRvMkhhbGYoIGNvbnN0IGluIHZlYzQgdiApIHtcclxuXHRyZXR1cm4gdmVjMiggdi54ICsgKCB2LnkgLyAyNTUuMCApLCB2LnogKyAoIHYudyAvIDI1NS4wICkgKTtcclxufVxyXG5cclxuLy8gTk9URTogdmlld1osIHRoZSB6LWNvb3JkaW5hdGUgaW4gY2FtZXJhIHNwYWNlLCBpcyBuZWdhdGl2ZSBmb3IgcG9pbnRzIGluIGZyb250IG9mIHRoZSBjYW1lcmFcclxuXHJcbmZsb2F0IHZpZXdaVG9PcnRob2dyYXBoaWNEZXB0aCggY29uc3QgaW4gZmxvYXQgdmlld1osIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHtcclxuXHQvLyAtbmVhciBtYXBzIHRvIDA7IC1mYXIgbWFwcyB0byAxXHJcblx0cmV0dXJuICggdmlld1ogKyBuZWFyICkgLyAoIG5lYXIgLSBmYXIgKTtcclxufVxyXG5cclxuZmxvYXQgb3J0aG9ncmFwaGljRGVwdGhUb1ZpZXdaKCBjb25zdCBpbiBmbG9hdCBkZXB0aCwgY29uc3QgaW4gZmxvYXQgbmVhciwgY29uc3QgaW4gZmxvYXQgZmFyICkge1xyXG5cdC8vIG1hcHMgb3J0aG9ncmFwaGljIGRlcHRoIGluIFsgMCwgMSBdIHRvIHZpZXdaXHJcblx0cmV0dXJuIGRlcHRoICogKCBuZWFyIC0gZmFyICkgLSBuZWFyO1xyXG59XHJcblxyXG4vLyBOT1RFOiBodHRwczovL3R3aXR0ZXIuY29tL2dvbm5hdmlzL3N0YXR1cy8xMzc3MTgzNzg2OTQ5OTU5NjgyXHJcblxyXG5mbG9hdCB2aWV3WlRvUGVyc3BlY3RpdmVEZXB0aCggY29uc3QgaW4gZmxvYXQgdmlld1osIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHtcclxuXHQvLyAtbmVhciBtYXBzIHRvIDA7IC1mYXIgbWFwcyB0byAxXHJcblx0cmV0dXJuICggKCBuZWFyICsgdmlld1ogKSAqIGZhciApIC8gKCAoIGZhciAtIG5lYXIgKSAqIHZpZXdaICk7XHJcbn1cclxuXHJcbmZsb2F0IHBlcnNwZWN0aXZlRGVwdGhUb1ZpZXdaKCBjb25zdCBpbiBmbG9hdCBkZXB0aCwgY29uc3QgaW4gZmxvYXQgbmVhciwgY29uc3QgaW4gZmxvYXQgZmFyICkge1xyXG5cdC8vIG1hcHMgcGVyc3BlY3RpdmUgZGVwdGggaW4gWyAwLCAxIF0gdG8gdmlld1pcclxuXHRyZXR1cm4gKCBuZWFyICogZmFyICkgLyAoICggZmFyIC0gbmVhciApICogZGVwdGggLSBmYXIgKTtcclxufVxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jaWZkZWYgUFJFTVVMVElQTElFRF9BTFBIQVxyXG5cclxuXHQvLyBHZXQgZ2V0IG5vcm1hbCBibGVuZGluZyB3aXRoIHByZW11bHRpcGxlZCwgdXNlIHdpdGggQ3VzdG9tQmxlbmRpbmcsIE9uZUZhY3RvciwgT25lTWludXNTcmNBbHBoYUZhY3RvciwgQWRkRXF1YXRpb24uXHJcblx0Z2xfRnJhZ0NvbG9yLnJnYiAqPSBnbF9GcmFnQ29sb3IuYTtcclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG52ZWM0IG12UG9zaXRpb24gPSB2ZWM0KCB0cmFuc2Zvcm1lZCwgMS4wICk7XHJcblxyXG4jaWZkZWYgVVNFX0JBVENISU5HXHJcblxyXG5cdG12UG9zaXRpb24gPSBiYXRjaGluZ01hdHJpeCAqIG12UG9zaXRpb247XHJcblxyXG4jZW5kaWZcclxuXHJcbiNpZmRlZiBVU0VfSU5TVEFOQ0lOR1xyXG5cclxuXHRtdlBvc2l0aW9uID0gaW5zdGFuY2VNYXRyaXggKiBtdlBvc2l0aW9uO1xyXG5cclxuI2VuZGlmXHJcblxyXG5tdlBvc2l0aW9uID0gbW9kZWxWaWV3TWF0cml4ICogbXZQb3NpdGlvbjtcclxuXHJcbmdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG12UG9zaXRpb247XHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbiNpZmRlZiBESVRIRVJJTkdcclxuXHJcblx0Z2xfRnJhZ0NvbG9yLnJnYiA9IGRpdGhlcmluZyggZ2xfRnJhZ0NvbG9yLnJnYiApO1xyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbiNpZmRlZiBESVRIRVJJTkdcclxuXHJcblx0Ly8gYmFzZWQgb24gaHR0cHM6Ly93d3cuc2hhZGVydG95LmNvbS92aWV3L01zbEdSOFxyXG5cdHZlYzMgZGl0aGVyaW5nKCB2ZWMzIGNvbG9yICkge1xyXG5cdFx0Ly9DYWxjdWxhdGUgZ3JpZCBwb3NpdGlvblxyXG5cdFx0ZmxvYXQgZ3JpZF9wb3NpdGlvbiA9IHJhbmQoIGdsX0ZyYWdDb29yZC54eSApO1xyXG5cclxuXHRcdC8vU2hpZnQgdGhlIGluZGl2aWR1YWwgY29sb3JzIGRpZmZlcmVudGx5LCB0aHVzIG1ha2luZyBpdCBldmVuIGhhcmRlciB0byBzZWUgdGhlIGRpdGhlcmluZyBwYXR0ZXJuXHJcblx0XHR2ZWMzIGRpdGhlcl9zaGlmdF9SR0IgPSB2ZWMzKCAwLjI1IC8gMjU1LjAsIC0wLjI1IC8gMjU1LjAsIDAuMjUgLyAyNTUuMCApO1xyXG5cclxuXHRcdC8vbW9kaWZ5IHNoaWZ0IGFjY29yZGluZyB0byBncmlkIHBvc2l0aW9uLlxyXG5cdFx0ZGl0aGVyX3NoaWZ0X1JHQiA9IG1peCggMi4wICogZGl0aGVyX3NoaWZ0X1JHQiwgLTIuMCAqIGRpdGhlcl9zaGlmdF9SR0IsIGdyaWRfcG9zaXRpb24gKTtcclxuXHJcblx0XHQvL3NoaWZ0IHRoZSBjb2xvciBieSBkaXRoZXJfc2hpZnRcclxuXHRcdHJldHVybiBjb2xvciArIGRpdGhlcl9zaGlmdF9SR0I7XHJcblx0fVxyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbmZsb2F0IHJvdWdobmVzc0ZhY3RvciA9IHJvdWdobmVzcztcclxuXHJcbiNpZmRlZiBVU0VfUk9VR0hORVNTTUFQXHJcblxyXG5cdHZlYzQgdGV4ZWxSb3VnaG5lc3MgPSB0ZXh0dXJlMkQoIHJvdWdobmVzc01hcCwgdlJvdWdobmVzc01hcFV2ICk7XHJcblxyXG5cdC8vIHJlYWRzIGNoYW5uZWwgRywgY29tcGF0aWJsZSB3aXRoIGEgY29tYmluZWQgT2NjbHVzaW9uUm91Z2huZXNzTWV0YWxsaWMgKFJHQikgdGV4dHVyZVxyXG5cdHJvdWdobmVzc0ZhY3RvciAqPSB0ZXhlbFJvdWdobmVzcy5nO1xyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbiNpZmRlZiBVU0VfUk9VR0hORVNTTUFQXHJcblxyXG5cdHVuaWZvcm0gc2FtcGxlcjJEIHJvdWdobmVzc01hcDtcclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jaWYgTlVNX1NQT1RfTElHSFRfQ09PUkRTID4gMFxyXG5cclxuXHR2YXJ5aW5nIHZlYzQgdlNwb3RMaWdodENvb3JkWyBOVU1fU1BPVF9MSUdIVF9DT09SRFMgXTtcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmIE5VTV9TUE9UX0xJR0hUX01BUFMgPiAwXHJcblxyXG5cdHVuaWZvcm0gc2FtcGxlcjJEIHNwb3RMaWdodE1hcFsgTlVNX1NQT1RfTElHSFRfTUFQUyBdO1xyXG5cclxuI2VuZGlmXHJcblxyXG4jaWZkZWYgVVNFX1NIQURPV01BUFxyXG5cclxuXHQjaWYgTlVNX0RJUl9MSUdIVF9TSEFET1dTID4gMFxyXG5cclxuXHRcdHVuaWZvcm0gc2FtcGxlcjJEIGRpcmVjdGlvbmFsU2hhZG93TWFwWyBOVU1fRElSX0xJR0hUX1NIQURPV1MgXTtcclxuXHRcdHZhcnlpbmcgdmVjNCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgTlVNX0RJUl9MSUdIVF9TSEFET1dTIF07XHJcblxyXG5cdFx0c3RydWN0IERpcmVjdGlvbmFsTGlnaHRTaGFkb3cge1xyXG5cdFx0XHRmbG9hdCBzaGFkb3dJbnRlbnNpdHk7XHJcblx0XHRcdGZsb2F0IHNoYWRvd0JpYXM7XHJcblx0XHRcdGZsb2F0IHNoYWRvd05vcm1hbEJpYXM7XHJcblx0XHRcdGZsb2F0IHNoYWRvd1JhZGl1cztcclxuXHRcdFx0dmVjMiBzaGFkb3dNYXBTaXplO1xyXG5cdFx0fTtcclxuXHJcblx0XHR1bmlmb3JtIERpcmVjdGlvbmFsTGlnaHRTaGFkb3cgZGlyZWN0aW9uYWxMaWdodFNoYWRvd3NbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdO1xyXG5cclxuXHQjZW5kaWZcclxuXHJcblx0I2lmIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgPiAwXHJcblxyXG5cdFx0dW5pZm9ybSBzYW1wbGVyMkQgc3BvdFNoYWRvd01hcFsgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBdO1xyXG5cclxuXHRcdHN0cnVjdCBTcG90TGlnaHRTaGFkb3cge1xyXG5cdFx0XHRmbG9hdCBzaGFkb3dJbnRlbnNpdHk7XHJcblx0XHRcdGZsb2F0IHNoYWRvd0JpYXM7XHJcblx0XHRcdGZsb2F0IHNoYWRvd05vcm1hbEJpYXM7XHJcblx0XHRcdGZsb2F0IHNoYWRvd1JhZGl1cztcclxuXHRcdFx0dmVjMiBzaGFkb3dNYXBTaXplO1xyXG5cdFx0fTtcclxuXHJcblx0XHR1bmlmb3JtIFNwb3RMaWdodFNoYWRvdyBzcG90TGlnaHRTaGFkb3dzWyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIF07XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuXHQjaWYgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgPiAwXHJcblxyXG5cdFx0dW5pZm9ybSBzYW1wbGVyMkQgcG9pbnRTaGFkb3dNYXBbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07XHJcblx0XHR2YXJ5aW5nIHZlYzQgdlBvaW50U2hhZG93Q29vcmRbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07XHJcblxyXG5cdFx0c3RydWN0IFBvaW50TGlnaHRTaGFkb3cge1xyXG5cdFx0XHRmbG9hdCBzaGFkb3dJbnRlbnNpdHk7XHJcblx0XHRcdGZsb2F0IHNoYWRvd0JpYXM7XHJcblx0XHRcdGZsb2F0IHNoYWRvd05vcm1hbEJpYXM7XHJcblx0XHRcdGZsb2F0IHNoYWRvd1JhZGl1cztcclxuXHRcdFx0dmVjMiBzaGFkb3dNYXBTaXplO1xyXG5cdFx0XHRmbG9hdCBzaGFkb3dDYW1lcmFOZWFyO1xyXG5cdFx0XHRmbG9hdCBzaGFkb3dDYW1lcmFGYXI7XHJcblx0XHR9O1xyXG5cclxuXHRcdHVuaWZvcm0gUG9pbnRMaWdodFNoYWRvdyBwb2ludExpZ2h0U2hhZG93c1sgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXTtcclxuXHJcblx0I2VuZGlmXHJcblxyXG5cdC8qXHJcblx0I2lmIE5VTV9SRUNUX0FSRUFfTElHSFRTID4gMFxyXG5cclxuXHRcdC8vIFRPRE8gKGFiZWxuYXRpb24pOiBjcmVhdGUgdW5pZm9ybXMgZm9yIGFyZWEgbGlnaHQgc2hhZG93c1xyXG5cclxuXHQjZW5kaWZcclxuXHQqL1xyXG5cclxuXHRmbG9hdCB0ZXh0dXJlMkRDb21wYXJlKCBzYW1wbGVyMkQgZGVwdGhzLCB2ZWMyIHV2LCBmbG9hdCBjb21wYXJlICkge1xyXG5cclxuXHRcdHJldHVybiBzdGVwKCBjb21wYXJlLCB1bnBhY2tSR0JBVG9EZXB0aCggdGV4dHVyZTJEKCBkZXB0aHMsIHV2ICkgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdHZlYzIgdGV4dHVyZTJERGlzdHJpYnV0aW9uKCBzYW1wbGVyMkQgc2hhZG93LCB2ZWMyIHV2ICkge1xyXG5cclxuXHRcdHJldHVybiB1bnBhY2tSR0JBVG8ySGFsZiggdGV4dHVyZTJEKCBzaGFkb3csIHV2ICkgKTtcclxuXHJcblx0fVxyXG5cclxuXHRmbG9hdCBWU01TaGFkb3cgKHNhbXBsZXIyRCBzaGFkb3csIHZlYzIgdXYsIGZsb2F0IGNvbXBhcmUgKXtcclxuXHJcblx0XHRmbG9hdCBvY2NsdXNpb24gPSAxLjA7XHJcblxyXG5cdFx0dmVjMiBkaXN0cmlidXRpb24gPSB0ZXh0dXJlMkREaXN0cmlidXRpb24oIHNoYWRvdywgdXYgKTtcclxuXHJcblx0XHRmbG9hdCBoYXJkX3NoYWRvdyA9IHN0ZXAoIGNvbXBhcmUgLCBkaXN0cmlidXRpb24ueCApOyAvLyBIYXJkIFNoYWRvd1xyXG5cclxuXHRcdGlmIChoYXJkX3NoYWRvdyAhPSAxLjAgKSB7XHJcblxyXG5cdFx0XHRmbG9hdCBkaXN0YW5jZSA9IGNvbXBhcmUgLSBkaXN0cmlidXRpb24ueCA7XHJcblx0XHRcdGZsb2F0IHZhcmlhbmNlID0gbWF4KCAwLjAwMDAwLCBkaXN0cmlidXRpb24ueSAqIGRpc3RyaWJ1dGlvbi55ICk7XHJcblx0XHRcdGZsb2F0IHNvZnRuZXNzX3Byb2JhYmlsaXR5ID0gdmFyaWFuY2UgLyAodmFyaWFuY2UgKyBkaXN0YW5jZSAqIGRpc3RhbmNlICk7IC8vIENoZWJleXNoZXZzIGluZXF1YWxpdHlcclxuXHRcdFx0c29mdG5lc3NfcHJvYmFiaWxpdHkgPSBjbGFtcCggKCBzb2Z0bmVzc19wcm9iYWJpbGl0eSAtIDAuMyApIC8gKCAwLjk1IC0gMC4zICksIDAuMCwgMS4wICk7IC8vIDAuMyByZWR1Y2VzIGxpZ2h0IGJsZWVkXHJcblx0XHRcdG9jY2x1c2lvbiA9IGNsYW1wKCBtYXgoIGhhcmRfc2hhZG93LCBzb2Z0bmVzc19wcm9iYWJpbGl0eSApLCAwLjAsIDEuMCApO1xyXG5cclxuXHRcdH1cclxuXHRcdHJldHVybiBvY2NsdXNpb247XHJcblxyXG5cdH1cclxuXHJcblx0ZmxvYXQgZ2V0U2hhZG93KCBzYW1wbGVyMkQgc2hhZG93TWFwLCB2ZWMyIHNoYWRvd01hcFNpemUsIGZsb2F0IHNoYWRvd0ludGVuc2l0eSwgZmxvYXQgc2hhZG93QmlhcywgZmxvYXQgc2hhZG93UmFkaXVzLCB2ZWM0IHNoYWRvd0Nvb3JkICkge1xyXG5cclxuXHRcdGZsb2F0IHNoYWRvdyA9IDEuMDtcclxuXHJcblx0XHRzaGFkb3dDb29yZC54eXogLz0gc2hhZG93Q29vcmQudztcclxuXHRcdHNoYWRvd0Nvb3JkLnogKz0gc2hhZG93QmlhcztcclxuXHJcblx0XHRib29sIGluRnJ1c3R1bSA9IHNoYWRvd0Nvb3JkLnggPj0gMC4wICYmIHNoYWRvd0Nvb3JkLnggPD0gMS4wICYmIHNoYWRvd0Nvb3JkLnkgPj0gMC4wICYmIHNoYWRvd0Nvb3JkLnkgPD0gMS4wO1xyXG5cdFx0Ym9vbCBmcnVzdHVtVGVzdCA9IGluRnJ1c3R1bSAmJiBzaGFkb3dDb29yZC56IDw9IDEuMDtcclxuXHJcblx0XHRpZiAoIGZydXN0dW1UZXN0ICkge1xyXG5cclxuXHRcdCNpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0YgKVxyXG5cclxuXHRcdFx0dmVjMiB0ZXhlbFNpemUgPSB2ZWMyKCAxLjAgKSAvIHNoYWRvd01hcFNpemU7XHJcblxyXG5cdFx0XHRmbG9hdCBkeDAgPSAtIHRleGVsU2l6ZS54ICogc2hhZG93UmFkaXVzO1xyXG5cdFx0XHRmbG9hdCBkeTAgPSAtIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzO1xyXG5cdFx0XHRmbG9hdCBkeDEgPSArIHRleGVsU2l6ZS54ICogc2hhZG93UmFkaXVzO1xyXG5cdFx0XHRmbG9hdCBkeTEgPSArIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzO1xyXG5cdFx0XHRmbG9hdCBkeDIgPSBkeDAgLyAyLjA7XHJcblx0XHRcdGZsb2F0IGR5MiA9IGR5MCAvIDIuMDtcclxuXHRcdFx0ZmxvYXQgZHgzID0gZHgxIC8gMi4wO1xyXG5cdFx0XHRmbG9hdCBkeTMgPSBkeTEgLyAyLjA7XHJcblxyXG5cdFx0XHRzaGFkb3cgPSAoXHJcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXHJcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXHJcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXHJcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MiwgZHkyICksIHNoYWRvd0Nvb3JkLnogKSArXHJcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkyICksIHNoYWRvd0Nvb3JkLnogKSArXHJcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MywgZHkyICksIHNoYWRvd0Nvb3JkLnogKSArXHJcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArXHJcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MiwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArXHJcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSwgc2hhZG93Q29vcmQueiApICtcclxuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgzLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcclxuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcclxuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgyLCBkeTMgKSwgc2hhZG93Q29vcmQueiApICtcclxuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTMgKSwgc2hhZG93Q29vcmQueiApICtcclxuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgzLCBkeTMgKSwgc2hhZG93Q29vcmQueiApICtcclxuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCBkeTEgKSwgc2hhZG93Q29vcmQueiApICtcclxuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTEgKSwgc2hhZG93Q29vcmQueiApICtcclxuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCBkeTEgKSwgc2hhZG93Q29vcmQueiApXHJcblx0XHRcdCkgKiAoIDEuMCAvIDE3LjAgKTtcclxuXHJcblx0XHQjZWxpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCApXHJcblxyXG5cdFx0XHR2ZWMyIHRleGVsU2l6ZSA9IHZlYzIoIDEuMCApIC8gc2hhZG93TWFwU2l6ZTtcclxuXHRcdFx0ZmxvYXQgZHggPSB0ZXhlbFNpemUueDtcclxuXHRcdFx0ZmxvYXQgZHkgPSB0ZXhlbFNpemUueTtcclxuXHJcblx0XHRcdHZlYzIgdXYgPSBzaGFkb3dDb29yZC54eTtcclxuXHRcdFx0dmVjMiBmID0gZnJhY3QoIHV2ICogc2hhZG93TWFwU2l6ZSArIDAuNSApO1xyXG5cdFx0XHR1diAtPSBmICogdGV4ZWxTaXplO1xyXG5cclxuXHRcdFx0c2hhZG93ID0gKFxyXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYsIHNoYWRvd0Nvb3JkLnogKSArXHJcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIGR4LCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcclxuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggMC4wLCBkeSApLCBzaGFkb3dDb29yZC56ICkgK1xyXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB0ZXhlbFNpemUsIHNoYWRvd0Nvb3JkLnogKSArXHJcblx0XHRcdFx0bWl4KCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggLWR4LCAwLjAgKSwgc2hhZG93Q29vcmQueiApLFxyXG5cdFx0XHRcdFx0IHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAyLjAgKiBkeCwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSxcclxuXHRcdFx0XHRcdCBmLnggKSArXHJcblx0XHRcdFx0bWl4KCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggLWR4LCBkeSApLCBzaGFkb3dDb29yZC56ICksXHJcblx0XHRcdFx0XHQgdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIDIuMCAqIGR4LCBkeSApLCBzaGFkb3dDb29yZC56ICksXHJcblx0XHRcdFx0XHQgZi54ICkgK1xyXG5cdFx0XHRcdG1peCggdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIDAuMCwgLWR5ICksIHNoYWRvd0Nvb3JkLnogKSxcclxuXHRcdFx0XHRcdCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggMC4wLCAyLjAgKiBkeSApLCBzaGFkb3dDb29yZC56ICksXHJcblx0XHRcdFx0XHQgZi55ICkgK1xyXG5cdFx0XHRcdG1peCggdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIGR4LCAtZHkgKSwgc2hhZG93Q29vcmQueiApLFxyXG5cdFx0XHRcdFx0IHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCBkeCwgMi4wICogZHkgKSwgc2hhZG93Q29vcmQueiApLFxyXG5cdFx0XHRcdFx0IGYueSApICtcclxuXHRcdFx0XHRtaXgoIG1peCggdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIC1keCwgLWR5ICksIHNoYWRvd0Nvb3JkLnogKSxcclxuXHRcdFx0XHRcdFx0ICB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggMi4wICogZHgsIC1keSApLCBzaGFkb3dDb29yZC56ICksXHJcblx0XHRcdFx0XHRcdCAgZi54ICksXHJcblx0XHRcdFx0XHQgbWl4KCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggLWR4LCAyLjAgKiBkeSApLCBzaGFkb3dDb29yZC56ICksXHJcblx0XHRcdFx0XHRcdCAgdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIDIuMCAqIGR4LCAyLjAgKiBkeSApLCBzaGFkb3dDb29yZC56ICksXHJcblx0XHRcdFx0XHRcdCAgZi54ICksXHJcblx0XHRcdFx0XHQgZi55IClcclxuXHRcdFx0KSAqICggMS4wIC8gOS4wICk7XHJcblxyXG5cdFx0I2VsaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfVlNNIClcclxuXHJcblx0XHRcdHNoYWRvdyA9IFZTTVNoYWRvdyggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSwgc2hhZG93Q29vcmQueiApO1xyXG5cclxuXHRcdCNlbHNlIC8vIG5vIHBlcmNlbnRhZ2UtY2xvc2VyIGZpbHRlcmluZzpcclxuXHJcblx0XHRcdHNoYWRvdyA9IHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHksIHNoYWRvd0Nvb3JkLnogKTtcclxuXHJcblx0XHQjZW5kaWZcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG1peCggMS4wLCBzaGFkb3csIHNoYWRvd0ludGVuc2l0eSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vIGN1YmVUb1VWKCkgbWFwcyBhIDNEIGRpcmVjdGlvbiB2ZWN0b3Igc3VpdGFibGUgZm9yIGN1YmUgdGV4dHVyZSBtYXBwaW5nIHRvIGEgMkRcclxuXHQvLyB2ZWN0b3Igc3VpdGFibGUgZm9yIDJEIHRleHR1cmUgbWFwcGluZy4gVGhpcyBjb2RlIHVzZXMgdGhlIGZvbGxvd2luZyBsYXlvdXQgZm9yIHRoZVxyXG5cdC8vIDJEIHRleHR1cmU6XHJcblx0Ly9cclxuXHQvLyB4elhaXHJcblx0Ly8gIHkgWVxyXG5cdC8vXHJcblx0Ly8gWSAtIFBvc2l0aXZlIHkgZGlyZWN0aW9uXHJcblx0Ly8geSAtIE5lZ2F0aXZlIHkgZGlyZWN0aW9uXHJcblx0Ly8gWCAtIFBvc2l0aXZlIHggZGlyZWN0aW9uXHJcblx0Ly8geCAtIE5lZ2F0aXZlIHggZGlyZWN0aW9uXHJcblx0Ly8gWiAtIFBvc2l0aXZlIHogZGlyZWN0aW9uXHJcblx0Ly8geiAtIE5lZ2F0aXZlIHogZGlyZWN0aW9uXHJcblx0Ly9cclxuXHQvLyBTb3VyY2UgYW5kIHRlc3QgYmVkOlxyXG5cdC8vIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL3RzY2h3L2RhMTBjNDNjNDY3Y2U4YWZkMGM0XHJcblxyXG5cdHZlYzIgY3ViZVRvVVYoIHZlYzMgdiwgZmxvYXQgdGV4ZWxTaXplWSApIHtcclxuXHJcblx0XHQvLyBOdW1iZXIgb2YgdGV4ZWxzIHRvIGF2b2lkIGF0IHRoZSBlZGdlIG9mIGVhY2ggc3F1YXJlXHJcblxyXG5cdFx0dmVjMyBhYnNWID0gYWJzKCB2ICk7XHJcblxyXG5cdFx0Ly8gSW50ZXJzZWN0IHVuaXQgY3ViZVxyXG5cclxuXHRcdGZsb2F0IHNjYWxlVG9DdWJlID0gMS4wIC8gbWF4KCBhYnNWLngsIG1heCggYWJzVi55LCBhYnNWLnogKSApO1xyXG5cdFx0YWJzViAqPSBzY2FsZVRvQ3ViZTtcclxuXHJcblx0XHQvLyBBcHBseSBzY2FsZSB0byBhdm9pZCBzZWFtc1xyXG5cclxuXHRcdC8vIHR3byB0ZXhlbHMgbGVzcyBwZXIgc3F1YXJlIChvbmUgdGV4ZWwgd2lsbCBkbyBmb3IgTkVBUkVTVClcclxuXHRcdHYgKj0gc2NhbGVUb0N1YmUgKiAoIDEuMCAtIDIuMCAqIHRleGVsU2l6ZVkgKTtcclxuXHJcblx0XHQvLyBVbndyYXBcclxuXHJcblx0XHQvLyBzcGFjZTogLTEgLi4uIDEgcmFuZ2UgZm9yIGVhY2ggc3F1YXJlXHJcblx0XHQvL1xyXG5cdFx0Ly8gI1gjI1x0XHRkaW0gICAgOj0gKCA0ICwgMiApXHJcblx0XHQvLyAgIyAjXHRcdGNlbnRlciA6PSAoIDEgLCAxIClcclxuXHJcblx0XHR2ZWMyIHBsYW5hciA9IHYueHk7XHJcblxyXG5cdFx0ZmxvYXQgYWxtb3N0QVRleGVsID0gMS41ICogdGV4ZWxTaXplWTtcclxuXHRcdGZsb2F0IGFsbW9zdE9uZSA9IDEuMCAtIGFsbW9zdEFUZXhlbDtcclxuXHJcblx0XHRpZiAoIGFic1YueiA+PSBhbG1vc3RPbmUgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHYueiA+IDAuMCApXHJcblx0XHRcdFx0cGxhbmFyLnggPSA0LjAgLSB2Lng7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggYWJzVi54ID49IGFsbW9zdE9uZSApIHtcclxuXHJcblx0XHRcdGZsb2F0IHNpZ25YID0gc2lnbiggdi54ICk7XHJcblx0XHRcdHBsYW5hci54ID0gdi56ICogc2lnblggKyAyLjAgKiBzaWduWDtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBhYnNWLnkgPj0gYWxtb3N0T25lICkge1xyXG5cclxuXHRcdFx0ZmxvYXQgc2lnblkgPSBzaWduKCB2LnkgKTtcclxuXHRcdFx0cGxhbmFyLnggPSB2LnggKyAyLjAgKiBzaWduWSArIDIuMDtcclxuXHRcdFx0cGxhbmFyLnkgPSB2LnogKiBzaWduWSAtIDIuMDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gVHJhbnNmb3JtIHRvIFVWIHNwYWNlXHJcblxyXG5cdFx0Ly8gc2NhbGUgOj0gMC41IC8gZGltXHJcblx0XHQvLyB0cmFuc2xhdGUgOj0gKCBjZW50ZXIgKyAwLjUgKSAvIGRpbVxyXG5cdFx0cmV0dXJuIHZlYzIoIDAuMTI1LCAwLjI1ICkgKiBwbGFuYXIgKyB2ZWMyKCAwLjM3NSwgMC43NSApO1xyXG5cclxuXHR9XHJcblxyXG5cdGZsb2F0IGdldFBvaW50U2hhZG93KCBzYW1wbGVyMkQgc2hhZG93TWFwLCB2ZWMyIHNoYWRvd01hcFNpemUsIGZsb2F0IHNoYWRvd0ludGVuc2l0eSwgZmxvYXQgc2hhZG93QmlhcywgZmxvYXQgc2hhZG93UmFkaXVzLCB2ZWM0IHNoYWRvd0Nvb3JkLCBmbG9hdCBzaGFkb3dDYW1lcmFOZWFyLCBmbG9hdCBzaGFkb3dDYW1lcmFGYXIgKSB7XHJcblxyXG5cdFx0ZmxvYXQgc2hhZG93ID0gMS4wO1xyXG5cclxuXHRcdC8vIGZvciBwb2ludCBsaWdodHMsIHRoZSB1bmlmb3JtIEB2U2hhZG93Q29vcmQgaXMgcmUtcHVycG9zZWQgdG8gaG9sZFxyXG5cdFx0Ly8gdGhlIHZlY3RvciBmcm9tIHRoZSBsaWdodCB0byB0aGUgd29ybGQtc3BhY2UgcG9zaXRpb24gb2YgdGhlIGZyYWdtZW50LlxyXG5cdFx0dmVjMyBsaWdodFRvUG9zaXRpb24gPSBzaGFkb3dDb29yZC54eXo7XHJcblx0XHRcclxuXHRcdGZsb2F0IGxpZ2h0VG9Qb3NpdGlvbkxlbmd0aCA9IGxlbmd0aCggbGlnaHRUb1Bvc2l0aW9uICk7XHJcblxyXG5cdFx0aWYgKCBsaWdodFRvUG9zaXRpb25MZW5ndGggLSBzaGFkb3dDYW1lcmFGYXIgPD0gMC4wICYmIGxpZ2h0VG9Qb3NpdGlvbkxlbmd0aCAtIHNoYWRvd0NhbWVyYU5lYXIgPj0gMC4wICkge1xyXG5cclxuXHRcdFx0Ly8gZHAgPSBub3JtYWxpemVkIGRpc3RhbmNlIGZyb20gbGlnaHQgdG8gZnJhZ21lbnQgcG9zaXRpb25cclxuXHRcdFx0ZmxvYXQgZHAgPSAoIGxpZ2h0VG9Qb3NpdGlvbkxlbmd0aCAtIHNoYWRvd0NhbWVyYU5lYXIgKSAvICggc2hhZG93Q2FtZXJhRmFyIC0gc2hhZG93Q2FtZXJhTmVhciApOyAvLyBuZWVkIHRvIGNsYW1wP1xyXG5cdFx0XHRkcCArPSBzaGFkb3dCaWFzO1xyXG5cclxuXHRcdFx0Ly8gYmQzRCA9IGJhc2UgZGlyZWN0aW9uIDNEXHJcblx0XHRcdHZlYzMgYmQzRCA9IG5vcm1hbGl6ZSggbGlnaHRUb1Bvc2l0aW9uICk7XHJcblxyXG5cdFx0XHR2ZWMyIHRleGVsU2l6ZSA9IHZlYzIoIDEuMCApIC8gKCBzaGFkb3dNYXBTaXplICogdmVjMiggNC4wLCAyLjAgKSApO1xyXG5cclxuXHRcdFx0I2lmIGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1BDRiApIHx8IGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1BDRl9TT0ZUICkgfHwgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfVlNNIClcclxuXHJcblx0XHRcdFx0dmVjMiBvZmZzZXQgPSB2ZWMyKCAtIDEsIDEgKSAqIHNoYWRvd1JhZGl1cyAqIHRleGVsU2l6ZS55O1xyXG5cclxuXHRcdFx0XHRzaGFkb3cgPSAoXHJcblx0XHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnh5eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXHJcblx0XHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl5eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXHJcblx0XHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnh5eCwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXHJcblx0XHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl5eCwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXHJcblx0XHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNELCB0ZXhlbFNpemUueSApLCBkcCApICtcclxuXHRcdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHh5LCB0ZXhlbFNpemUueSApLCBkcCApICtcclxuXHRcdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueXh5LCB0ZXhlbFNpemUueSApLCBkcCApICtcclxuXHRcdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHh4LCB0ZXhlbFNpemUueSApLCBkcCApICtcclxuXHRcdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueXh4LCB0ZXhlbFNpemUueSApLCBkcCApXHJcblx0XHRcdFx0KSAqICggMS4wIC8gOS4wICk7XHJcblxyXG5cdFx0XHQjZWxzZSAvLyBubyBwZXJjZW50YWdlLWNsb3NlciBmaWx0ZXJpbmdcclxuXHJcblx0XHRcdFx0c2hhZG93ID0gdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCwgdGV4ZWxTaXplLnkgKSwgZHAgKTtcclxuXHJcblx0XHRcdCNlbmRpZlxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbWl4KCAxLjAsIHNoYWRvdywgc2hhZG93SW50ZW5zaXR5ICk7XHJcblxyXG5cdH1cclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG5cclxuI2lmIE5VTV9TUE9UX0xJR0hUX0NPT1JEUyA+IDBcclxuXHJcblx0dW5pZm9ybSBtYXQ0IHNwb3RMaWdodE1hdHJpeFsgTlVNX1NQT1RfTElHSFRfQ09PUkRTIF07XHJcblx0dmFyeWluZyB2ZWM0IHZTcG90TGlnaHRDb29yZFsgTlVNX1NQT1RfTElHSFRfQ09PUkRTIF07XHJcblxyXG4jZW5kaWZcclxuXHJcbiNpZmRlZiBVU0VfU0hBRE9XTUFQXHJcblxyXG5cdCNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgPiAwXHJcblxyXG5cdFx0dW5pZm9ybSBtYXQ0IGRpcmVjdGlvbmFsU2hhZG93TWF0cml4WyBOVU1fRElSX0xJR0hUX1NIQURPV1MgXTtcclxuXHRcdHZhcnlpbmcgdmVjNCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgTlVNX0RJUl9MSUdIVF9TSEFET1dTIF07XHJcblxyXG5cdFx0c3RydWN0IERpcmVjdGlvbmFsTGlnaHRTaGFkb3cge1xyXG5cdFx0XHRmbG9hdCBzaGFkb3dJbnRlbnNpdHk7XHJcblx0XHRcdGZsb2F0IHNoYWRvd0JpYXM7XHJcblx0XHRcdGZsb2F0IHNoYWRvd05vcm1hbEJpYXM7XHJcblx0XHRcdGZsb2F0IHNoYWRvd1JhZGl1cztcclxuXHRcdFx0dmVjMiBzaGFkb3dNYXBTaXplO1xyXG5cdFx0fTtcclxuXHJcblx0XHR1bmlmb3JtIERpcmVjdGlvbmFsTGlnaHRTaGFkb3cgZGlyZWN0aW9uYWxMaWdodFNoYWRvd3NbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdO1xyXG5cclxuXHQjZW5kaWZcclxuXHJcblx0I2lmIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgPiAwXHJcblxyXG5cdFx0c3RydWN0IFNwb3RMaWdodFNoYWRvdyB7XHJcblx0XHRcdGZsb2F0IHNoYWRvd0ludGVuc2l0eTtcclxuXHRcdFx0ZmxvYXQgc2hhZG93QmlhcztcclxuXHRcdFx0ZmxvYXQgc2hhZG93Tm9ybWFsQmlhcztcclxuXHRcdFx0ZmxvYXQgc2hhZG93UmFkaXVzO1xyXG5cdFx0XHR2ZWMyIHNoYWRvd01hcFNpemU7XHJcblx0XHR9O1xyXG5cclxuXHRcdHVuaWZvcm0gU3BvdExpZ2h0U2hhZG93IHNwb3RMaWdodFNoYWRvd3NbIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXTtcclxuXHJcblx0I2VuZGlmXHJcblxyXG5cdCNpZiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyA+IDBcclxuXHJcblx0XHR1bmlmb3JtIG1hdDQgcG9pbnRTaGFkb3dNYXRyaXhbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07XHJcblx0XHR2YXJ5aW5nIHZlYzQgdlBvaW50U2hhZG93Q29vcmRbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07XHJcblxyXG5cdFx0c3RydWN0IFBvaW50TGlnaHRTaGFkb3cge1xyXG5cdFx0XHRmbG9hdCBzaGFkb3dJbnRlbnNpdHk7XHJcblx0XHRcdGZsb2F0IHNoYWRvd0JpYXM7XHJcblx0XHRcdGZsb2F0IHNoYWRvd05vcm1hbEJpYXM7XHJcblx0XHRcdGZsb2F0IHNoYWRvd1JhZGl1cztcclxuXHRcdFx0dmVjMiBzaGFkb3dNYXBTaXplO1xyXG5cdFx0XHRmbG9hdCBzaGFkb3dDYW1lcmFOZWFyO1xyXG5cdFx0XHRmbG9hdCBzaGFkb3dDYW1lcmFGYXI7XHJcblx0XHR9O1xyXG5cclxuXHRcdHVuaWZvcm0gUG9pbnRMaWdodFNoYWRvdyBwb2ludExpZ2h0U2hhZG93c1sgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXTtcclxuXHJcblx0I2VuZGlmXHJcblxyXG5cdC8qXHJcblx0I2lmIE5VTV9SRUNUX0FSRUFfTElHSFRTID4gMFxyXG5cclxuXHRcdC8vIFRPRE8gKGFiZWxuYXRpb24pOiB1bmlmb3JtcyBmb3IgYXJlYSBsaWdodCBzaGFkb3dzXHJcblxyXG5cdCNlbmRpZlxyXG5cdCovXHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuXHJcbiNpZiAoIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSAmJiAoIE5VTV9ESVJfTElHSFRfU0hBRE9XUyA+IDAgfHwgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgPiAwICkgKSB8fCAoIE5VTV9TUE9UX0xJR0hUX0NPT1JEUyA+IDAgKVxyXG5cclxuXHQvLyBPZmZzZXR0aW5nIHRoZSBwb3NpdGlvbiB1c2VkIGZvciBxdWVyeWluZyBvY2NsdXNpb24gYWxvbmcgdGhlIHdvcmxkIG5vcm1hbCBjYW4gYmUgdXNlZCB0byByZWR1Y2Ugc2hhZG93IGFjbmUuXHJcblx0dmVjMyBzaGFkb3dXb3JsZE5vcm1hbCA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIHRyYW5zZm9ybWVkTm9ybWFsLCB2aWV3TWF0cml4ICk7XHJcblx0dmVjNCBzaGFkb3dXb3JsZFBvc2l0aW9uO1xyXG5cclxuI2VuZGlmXHJcblxyXG4jaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApXHJcblxyXG5cdCNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgPiAwXHJcblxyXG5cdFx0I3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxyXG5cdFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX0RJUl9MSUdIVF9TSEFET1dTOyBpICsrICkge1xyXG5cclxuXHRcdFx0c2hhZG93V29ybGRQb3NpdGlvbiA9IHdvcmxkUG9zaXRpb24gKyB2ZWM0KCBzaGFkb3dXb3JsZE5vcm1hbCAqIGRpcmVjdGlvbmFsTGlnaHRTaGFkb3dzWyBpIF0uc2hhZG93Tm9ybWFsQmlhcywgMCApO1xyXG5cdFx0XHR2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgaSBdID0gZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXhbIGkgXSAqIHNoYWRvd1dvcmxkUG9zaXRpb247XHJcblxyXG5cdFx0fVxyXG5cdFx0I3ByYWdtYSB1bnJvbGxfbG9vcF9lbmRcclxuXHJcblx0I2VuZGlmXHJcblxyXG5cdCNpZiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyA+IDBcclxuXHJcblx0XHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XHJcblx0XHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUzsgaSArKyApIHtcclxuXHJcblx0XHRcdHNoYWRvd1dvcmxkUG9zaXRpb24gPSB3b3JsZFBvc2l0aW9uICsgdmVjNCggc2hhZG93V29ybGROb3JtYWwgKiBwb2ludExpZ2h0U2hhZG93c1sgaSBdLnNoYWRvd05vcm1hbEJpYXMsIDAgKTtcclxuXHRcdFx0dlBvaW50U2hhZG93Q29vcmRbIGkgXSA9IHBvaW50U2hhZG93TWF0cml4WyBpIF0gKiBzaGFkb3dXb3JsZFBvc2l0aW9uO1xyXG5cclxuXHRcdH1cclxuXHRcdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXHJcblxyXG5cdCNlbmRpZlxyXG5cclxuXHQvKlxyXG5cdCNpZiBOVU1fUkVDVF9BUkVBX0xJR0hUUyA+IDBcclxuXHJcblx0XHQvLyBUT0RPIChhYmVsbmF0aW9uKTogdXBkYXRlIHZBcmVhU2hhZG93Q29vcmQgd2l0aCBhcmVhIGxpZ2h0IGluZm9cclxuXHJcblx0I2VuZGlmXHJcblx0Ki9cclxuXHJcbiNlbmRpZlxyXG5cclxuLy8gc3BvdCBsaWdodHMgY2FuIGJlIGV2YWx1YXRlZCB3aXRob3V0IGFjdGl2ZSBzaGFkb3cgbWFwcGluZyAod2hlbiBTcG90TGlnaHQubWFwIGlzIHVzZWQpXHJcblxyXG4jaWYgTlVNX1NQT1RfTElHSFRfQ09PUkRTID4gMFxyXG5cclxuXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XHJcblx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1NQT1RfTElHSFRfQ09PUkRTOyBpICsrICkge1xyXG5cclxuXHRcdHNoYWRvd1dvcmxkUG9zaXRpb24gPSB3b3JsZFBvc2l0aW9uO1xyXG5cdFx0I2lmICggZGVmaW5lZCggVVNFX1NIQURPV01BUCApICYmIFVOUk9MTEVEX0xPT1BfSU5ERVggPCBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIClcclxuXHRcdFx0c2hhZG93V29ybGRQb3NpdGlvbi54eXogKz0gc2hhZG93V29ybGROb3JtYWwgKiBzcG90TGlnaHRTaGFkb3dzWyBpIF0uc2hhZG93Tm9ybWFsQmlhcztcclxuXHRcdCNlbmRpZlxyXG5cdFx0dlNwb3RMaWdodENvb3JkWyBpIF0gPSBzcG90TGlnaHRNYXRyaXhbIGkgXSAqIHNoYWRvd1dvcmxkUG9zaXRpb247XHJcblxyXG5cdH1cclxuXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxyXG5cclxuI2VuZGlmXHJcblxyXG5cclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuZmxvYXQgZ2V0U2hhZG93TWFzaygpIHtcclxuXHJcblx0ZmxvYXQgc2hhZG93ID0gMS4wO1xyXG5cclxuXHQjaWZkZWYgVVNFX1NIQURPV01BUFxyXG5cclxuXHQjaWYgTlVNX0RJUl9MSUdIVF9TSEFET1dTID4gMFxyXG5cclxuXHREaXJlY3Rpb25hbExpZ2h0U2hhZG93IGRpcmVjdGlvbmFsTGlnaHQ7XHJcblxyXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcclxuXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fRElSX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7XHJcblxyXG5cdFx0ZGlyZWN0aW9uYWxMaWdodCA9IGRpcmVjdGlvbmFsTGlnaHRTaGFkb3dzWyBpIF07XHJcblx0XHRzaGFkb3cgKj0gcmVjZWl2ZVNoYWRvdyA/IGdldFNoYWRvdyggZGlyZWN0aW9uYWxTaGFkb3dNYXBbIGkgXSwgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dNYXBTaXplLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd0ludGVuc2l0eSwgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dCaWFzLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd1JhZGl1cywgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIGkgXSApIDogMS4wO1xyXG5cclxuXHR9XHJcblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9lbmRcclxuXHJcblx0I2VuZGlmXHJcblxyXG5cdCNpZiBOVU1fU1BPVF9MSUdIVF9TSEFET1dTID4gMFxyXG5cclxuXHRTcG90TGlnaHRTaGFkb3cgc3BvdExpZ2h0O1xyXG5cclxuXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XHJcblx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1NQT1RfTElHSFRfU0hBRE9XUzsgaSArKyApIHtcclxuXHJcblx0XHRzcG90TGlnaHQgPSBzcG90TGlnaHRTaGFkb3dzWyBpIF07XHJcblx0XHRzaGFkb3cgKj0gcmVjZWl2ZVNoYWRvdyA/IGdldFNoYWRvdyggc3BvdFNoYWRvd01hcFsgaSBdLCBzcG90TGlnaHQuc2hhZG93TWFwU2l6ZSwgc3BvdExpZ2h0LnNoYWRvd0ludGVuc2l0eSwgc3BvdExpZ2h0LnNoYWRvd0JpYXMsIHNwb3RMaWdodC5zaGFkb3dSYWRpdXMsIHZTcG90TGlnaHRDb29yZFsgaSBdICkgOiAxLjA7XHJcblxyXG5cdH1cclxuXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxyXG5cclxuXHQjZW5kaWZcclxuXHJcblx0I2lmIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTID4gMFxyXG5cclxuXHRQb2ludExpZ2h0U2hhZG93IHBvaW50TGlnaHQ7XHJcblxyXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcclxuXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUzsgaSArKyApIHtcclxuXHJcblx0XHRwb2ludExpZ2h0ID0gcG9pbnRMaWdodFNoYWRvd3NbIGkgXTtcclxuXHRcdHNoYWRvdyAqPSByZWNlaXZlU2hhZG93ID8gZ2V0UG9pbnRTaGFkb3coIHBvaW50U2hhZG93TWFwWyBpIF0sIHBvaW50TGlnaHQuc2hhZG93TWFwU2l6ZSwgcG9pbnRMaWdodC5zaGFkb3dJbnRlbnNpdHksIHBvaW50TGlnaHQuc2hhZG93QmlhcywgcG9pbnRMaWdodC5zaGFkb3dSYWRpdXMsIHZQb2ludFNoYWRvd0Nvb3JkWyBpIF0sIHBvaW50TGlnaHQuc2hhZG93Q2FtZXJhTmVhciwgcG9pbnRMaWdodC5zaGFkb3dDYW1lcmFGYXIgKSA6IDEuMDtcclxuXHJcblx0fVxyXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXHJcblxyXG5cdCNlbmRpZlxyXG5cclxuXHQvKlxyXG5cdCNpZiBOVU1fUkVDVF9BUkVBX0xJR0hUUyA+IDBcclxuXHJcblx0XHQvLyBUT0RPIChhYmVsbmF0aW9uKTogdXBkYXRlIHNoYWRvdyBmb3IgQXJlYSBsaWdodFxyXG5cclxuXHQjZW5kaWZcclxuXHQqL1xyXG5cclxuXHQjZW5kaWZcclxuXHJcblx0cmV0dXJuIHNoYWRvdztcclxuXHJcbn1cclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmZGVmIFVTRV9TS0lOTklOR1xyXG5cclxuXHRtYXQ0IGJvbmVNYXRYID0gZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LnggKTtcclxuXHRtYXQ0IGJvbmVNYXRZID0gZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LnkgKTtcclxuXHRtYXQ0IGJvbmVNYXRaID0gZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LnogKTtcclxuXHRtYXQ0IGJvbmVNYXRXID0gZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LncgKTtcclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jaWZkZWYgVVNFX1NLSU5OSU5HXHJcblxyXG5cdHVuaWZvcm0gbWF0NCBiaW5kTWF0cml4O1xyXG5cdHVuaWZvcm0gbWF0NCBiaW5kTWF0cml4SW52ZXJzZTtcclxuXHJcblx0dW5pZm9ybSBoaWdocCBzYW1wbGVyMkQgYm9uZVRleHR1cmU7XHJcblxyXG5cdG1hdDQgZ2V0Qm9uZU1hdHJpeCggY29uc3QgaW4gZmxvYXQgaSApIHtcclxuXHJcblx0XHRpbnQgc2l6ZSA9IHRleHR1cmVTaXplKCBib25lVGV4dHVyZSwgMCApLng7XHJcblx0XHRpbnQgaiA9IGludCggaSApICogNDtcclxuXHRcdGludCB4ID0gaiAlIHNpemU7XHJcblx0XHRpbnQgeSA9IGogLyBzaXplO1xyXG5cdFx0dmVjNCB2MSA9IHRleGVsRmV0Y2goIGJvbmVUZXh0dXJlLCBpdmVjMiggeCwgeSApLCAwICk7XHJcblx0XHR2ZWM0IHYyID0gdGV4ZWxGZXRjaCggYm9uZVRleHR1cmUsIGl2ZWMyKCB4ICsgMSwgeSApLCAwICk7XHJcblx0XHR2ZWM0IHYzID0gdGV4ZWxGZXRjaCggYm9uZVRleHR1cmUsIGl2ZWMyKCB4ICsgMiwgeSApLCAwICk7XHJcblx0XHR2ZWM0IHY0ID0gdGV4ZWxGZXRjaCggYm9uZVRleHR1cmUsIGl2ZWMyKCB4ICsgMywgeSApLCAwICk7XHJcblxyXG5cdFx0cmV0dXJuIG1hdDQoIHYxLCB2MiwgdjMsIHY0ICk7XHJcblxyXG5cdH1cclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jaWZkZWYgVVNFX1NLSU5OSU5HXHJcblxyXG5cdHZlYzQgc2tpblZlcnRleCA9IGJpbmRNYXRyaXggKiB2ZWM0KCB0cmFuc2Zvcm1lZCwgMS4wICk7XHJcblxyXG5cdHZlYzQgc2tpbm5lZCA9IHZlYzQoIDAuMCApO1xyXG5cdHNraW5uZWQgKz0gYm9uZU1hdFggKiBza2luVmVydGV4ICogc2tpbldlaWdodC54O1xyXG5cdHNraW5uZWQgKz0gYm9uZU1hdFkgKiBza2luVmVydGV4ICogc2tpbldlaWdodC55O1xyXG5cdHNraW5uZWQgKz0gYm9uZU1hdFogKiBza2luVmVydGV4ICogc2tpbldlaWdodC56O1xyXG5cdHNraW5uZWQgKz0gYm9uZU1hdFcgKiBza2luVmVydGV4ICogc2tpbldlaWdodC53O1xyXG5cclxuXHR0cmFuc2Zvcm1lZCA9ICggYmluZE1hdHJpeEludmVyc2UgKiBza2lubmVkICkueHl6O1xyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbiNpZmRlZiBVU0VfU0tJTk5JTkdcclxuXHJcblx0bWF0NCBza2luTWF0cml4ID0gbWF0NCggMC4wICk7XHJcblx0c2tpbk1hdHJpeCArPSBza2luV2VpZ2h0LnggKiBib25lTWF0WDtcclxuXHRza2luTWF0cml4ICs9IHNraW5XZWlnaHQueSAqIGJvbmVNYXRZO1xyXG5cdHNraW5NYXRyaXggKz0gc2tpbldlaWdodC56ICogYm9uZU1hdFo7XHJcblx0c2tpbk1hdHJpeCArPSBza2luV2VpZ2h0LncgKiBib25lTWF0VztcclxuXHRza2luTWF0cml4ID0gYmluZE1hdHJpeEludmVyc2UgKiBza2luTWF0cml4ICogYmluZE1hdHJpeDtcclxuXHJcblx0b2JqZWN0Tm9ybWFsID0gdmVjNCggc2tpbk1hdHJpeCAqIHZlYzQoIG9iamVjdE5vcm1hbCwgMC4wICkgKS54eXo7XHJcblxyXG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxyXG5cclxuXHRcdG9iamVjdFRhbmdlbnQgPSB2ZWM0KCBza2luTWF0cml4ICogdmVjNCggb2JqZWN0VGFuZ2VudCwgMC4wICkgKS54eXo7XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbmZsb2F0IHNwZWN1bGFyU3RyZW5ndGg7XHJcblxyXG4jaWZkZWYgVVNFX1NQRUNVTEFSTUFQXHJcblxyXG5cdHZlYzQgdGV4ZWxTcGVjdWxhciA9IHRleHR1cmUyRCggc3BlY3VsYXJNYXAsIHZTcGVjdWxhck1hcFV2ICk7XHJcblx0c3BlY3VsYXJTdHJlbmd0aCA9IHRleGVsU3BlY3VsYXIucjtcclxuXHJcbiNlbHNlXHJcblxyXG5cdHNwZWN1bGFyU3RyZW5ndGggPSAxLjA7XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmZGVmIFVTRV9TUEVDVUxBUk1BUFxyXG5cclxuXHR1bmlmb3JtIHNhbXBsZXIyRCBzcGVjdWxhck1hcDtcclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jaWYgZGVmaW5lZCggVE9ORV9NQVBQSU5HIClcclxuXHJcblx0Z2xfRnJhZ0NvbG9yLnJnYiA9IHRvbmVNYXBwaW5nKCBnbF9GcmFnQ29sb3IucmdiICk7XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmbmRlZiBzYXR1cmF0ZVxyXG4vLyA8Y29tbW9uPiBtYXkgaGF2ZSBkZWZpbmVkIHNhdHVyYXRlKCkgYWxyZWFkeVxyXG4jZGVmaW5lIHNhdHVyYXRlKCBhICkgY2xhbXAoIGEsIDAuMCwgMS4wIClcclxuI2VuZGlmXHJcblxyXG51bmlmb3JtIGZsb2F0IHRvbmVNYXBwaW5nRXhwb3N1cmU7XHJcblxyXG4vLyBleHBvc3VyZSBvbmx5XHJcbnZlYzMgTGluZWFyVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XHJcblxyXG5cdHJldHVybiBzYXR1cmF0ZSggdG9uZU1hcHBpbmdFeHBvc3VyZSAqIGNvbG9yICk7XHJcblxyXG59XHJcblxyXG4vLyBzb3VyY2U6IGh0dHBzOi8vd3d3LmNzLnV0YWguZWR1L2RvY3MvdGVjaHJlcG9ydHMvMjAwMi9wZGYvVVVDUy0wMi0wMDEucGRmXHJcbnZlYzMgUmVpbmhhcmRUb25lTWFwcGluZyggdmVjMyBjb2xvciApIHtcclxuXHJcblx0Y29sb3IgKj0gdG9uZU1hcHBpbmdFeHBvc3VyZTtcclxuXHRyZXR1cm4gc2F0dXJhdGUoIGNvbG9yIC8gKCB2ZWMzKCAxLjAgKSArIGNvbG9yICkgKTtcclxuXHJcbn1cclxuXHJcbi8vIHNvdXJjZTogaHR0cDovL2ZpbG1pY3dvcmxkcy5jb20vYmxvZy9maWxtaWMtdG9uZW1hcHBpbmctb3BlcmF0b3JzL1xyXG52ZWMzIENpbmVvblRvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkge1xyXG5cclxuXHQvLyBmaWxtaWMgb3BlcmF0b3IgYnkgSmltIEhlamwgYW5kIFJpY2hhcmQgQnVyZ2Vzcy1EYXdzb25cclxuXHRjb2xvciAqPSB0b25lTWFwcGluZ0V4cG9zdXJlO1xyXG5cdGNvbG9yID0gbWF4KCB2ZWMzKCAwLjAgKSwgY29sb3IgLSAwLjAwNCApO1xyXG5cdHJldHVybiBwb3coICggY29sb3IgKiAoIDYuMiAqIGNvbG9yICsgMC41ICkgKSAvICggY29sb3IgKiAoIDYuMiAqIGNvbG9yICsgMS43ICkgKyAwLjA2ICksIHZlYzMoIDIuMiApICk7XHJcblxyXG59XHJcblxyXG4vLyBzb3VyY2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9zZWxmc2hhZG93L2x0Y19jb2RlL2Jsb2IvbWFzdGVyL3dlYmdsL3NoYWRlcnMvbHRjL2x0Y19ibGl0LmZzXHJcbnZlYzMgUlJUQW5kT0RURml0KCB2ZWMzIHYgKSB7XHJcblxyXG5cdHZlYzMgYSA9IHYgKiAoIHYgKyAwLjAyNDU3ODYgKSAtIDAuMDAwMDkwNTM3O1xyXG5cdHZlYzMgYiA9IHYgKiAoIDAuOTgzNzI5ICogdiArIDAuNDMyOTUxMCApICsgMC4yMzgwODE7XHJcblx0cmV0dXJuIGEgLyBiO1xyXG5cclxufVxyXG5cclxuLy8gdGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBBQ0VTIGlzIG1vZGlmaWVkIHRvIGFjY29tbW9kYXRlIGEgYnJpZ2h0ZXIgdmlld2luZyBlbnZpcm9ubWVudC5cclxuLy8gdGhlIHNjYWxlIGZhY3RvciBvZiAxLzAuNiBpcyBzdWJqZWN0aXZlLiBzZWUgZGlzY3Vzc2lvbiBpbiAjMTk2MjEuXHJcblxyXG52ZWMzIEFDRVNGaWxtaWNUb25lTWFwcGluZyggdmVjMyBjb2xvciApIHtcclxuXHJcblx0Ly8gc1JHQiA9PiBYWVogPT4gRDY1XzJfRDYwID0+IEFQMSA9PiBSUlRfU0FUXHJcblx0Y29uc3QgbWF0MyBBQ0VTSW5wdXRNYXQgPSBtYXQzKFxyXG5cdFx0dmVjMyggMC41OTcxOSwgMC4wNzYwMCwgMC4wMjg0MCApLCAvLyB0cmFuc3Bvc2VkIGZyb20gc291cmNlXHJcblx0XHR2ZWMzKCAwLjM1NDU4LCAwLjkwODM0LCAwLjEzMzgzICksXHJcblx0XHR2ZWMzKCAwLjA0ODIzLCAwLjAxNTY2LCAwLjgzNzc3IClcclxuXHQpO1xyXG5cclxuXHQvLyBPRFRfU0FUID0+IFhZWiA9PiBENjBfMl9ENjUgPT4gc1JHQlxyXG5cdGNvbnN0IG1hdDMgQUNFU091dHB1dE1hdCA9IG1hdDMoXHJcblx0XHR2ZWMzKCAgMS42MDQ3NSwgLTAuMTAyMDgsIC0wLjAwMzI3ICksIC8vIHRyYW5zcG9zZWQgZnJvbSBzb3VyY2VcclxuXHRcdHZlYzMoIC0wLjUzMTA4LCAgMS4xMDgxMywgLTAuMDcyNzYgKSxcclxuXHRcdHZlYzMoIC0wLjA3MzY3LCAtMC4wMDYwNSwgIDEuMDc2MDIgKVxyXG5cdCk7XHJcblxyXG5cdGNvbG9yICo9IHRvbmVNYXBwaW5nRXhwb3N1cmUgLyAwLjY7XHJcblxyXG5cdGNvbG9yID0gQUNFU0lucHV0TWF0ICogY29sb3I7XHJcblxyXG5cdC8vIEFwcGx5IFJSVCBhbmQgT0RUXHJcblx0Y29sb3IgPSBSUlRBbmRPRFRGaXQoIGNvbG9yICk7XHJcblxyXG5cdGNvbG9yID0gQUNFU091dHB1dE1hdCAqIGNvbG9yO1xyXG5cclxuXHQvLyBDbGFtcCB0byBbMCwgMV1cclxuXHRyZXR1cm4gc2F0dXJhdGUoIGNvbG9yICk7XHJcblxyXG59XHJcblxyXG4vLyBNYXRyaWNlcyBmb3IgcmVjIDIwMjAgPD4gcmVjIDcwOSBjb2xvciBzcGFjZSBjb252ZXJzaW9uXHJcbi8vIG1hdHJpeCBwcm92aWRlZCBpbiByb3ctbWFqb3Igb3JkZXIgc28gaXQgaGFzIGJlZW4gdHJhbnNwb3NlZFxyXG4vLyBodHRwczovL3d3dy5pdHUuaW50L3B1Yi9SLVJFUC1CVC4yNDA3LTIwMTdcclxuY29uc3QgbWF0MyBMSU5FQVJfUkVDMjAyMF9UT19MSU5FQVJfU1JHQiA9IG1hdDMoXHJcblx0dmVjMyggMS42NjA1LCAtIDAuMTI0NiwgLSAwLjAxODIgKSxcclxuXHR2ZWMzKCAtIDAuNTg3NiwgMS4xMzI5LCAtIDAuMTAwNiApLFxyXG5cdHZlYzMoIC0gMC4wNzI4LCAtIDAuMDA4MywgMS4xMTg3IClcclxuKTtcclxuXHJcbmNvbnN0IG1hdDMgTElORUFSX1NSR0JfVE9fTElORUFSX1JFQzIwMjAgPSBtYXQzKFxyXG5cdHZlYzMoIDAuNjI3NCwgMC4wNjkxLCAwLjAxNjQgKSxcclxuXHR2ZWMzKCAwLjMyOTMsIDAuOTE5NSwgMC4wODgwICksXHJcblx0dmVjMyggMC4wNDMzLCAwLjAxMTMsIDAuODk1NiApXHJcbik7XHJcblxyXG4vLyBodHRwczovL2lvbGl0ZS1lbmdpbmUuY29tL2Jsb2dfcG9zdHMvbWluaW1hbF9hZ3hfaW1wbGVtZW50YXRpb25cclxuLy8gTWVhbiBlcnJvcl4yOiAzLjY3MDUxNDFlLTA2XHJcbnZlYzMgYWd4RGVmYXVsdENvbnRyYXN0QXBwcm94KCB2ZWMzIHggKSB7XHJcblxyXG5cdHZlYzMgeDIgPSB4ICogeDtcclxuXHR2ZWMzIHg0ID0geDIgKiB4MjtcclxuXHJcblx0cmV0dXJuICsgMTUuNSAqIHg0ICogeDJcclxuXHRcdC0gNDAuMTQgKiB4NCAqIHhcclxuXHRcdCsgMzEuOTYgKiB4NFxyXG5cdFx0LSA2Ljg2OCAqIHgyICogeFxyXG5cdFx0KyAwLjQyOTggKiB4MlxyXG5cdFx0KyAwLjExOTEgKiB4XHJcblx0XHQtIDAuMDAyMzI7XHJcblxyXG59XHJcblxyXG4vLyBBZ1ggVG9uZSBNYXBwaW5nIGltcGxlbWVudGF0aW9uIGJhc2VkIG9uIEZpbGFtZW50LCB3aGljaCBpbiB0dXJuIGlzIGJhc2VkXHJcbi8vIG9uIEJsZW5kZXIncyBpbXBsZW1lbnRhdGlvbiB1c2luZyByZWMgMjAyMCBwcmltYXJpZXNcclxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9maWxhbWVudC9wdWxsLzcyMzZcclxuLy8gSW5wdXRzIGFuZCBvdXRwdXRzIGFyZSBlbmNvZGVkIGFzIExpbmVhci1zUkdCLlxyXG5cclxudmVjMyBBZ1hUb25lTWFwcGluZyggdmVjMyBjb2xvciApIHtcclxuXHJcblx0Ly8gQWdYIGNvbnN0YW50c1xyXG5cdGNvbnN0IG1hdDMgQWdYSW5zZXRNYXRyaXggPSBtYXQzKFxyXG5cdFx0dmVjMyggMC44NTY2MjcxNTMzMTU5ODMsIDAuMTM3MzE4OTcyOTI5ODQ3LCAwLjExMTg5ODIxMjk5OTk1ICksXHJcblx0XHR2ZWMzKCAwLjA5NTEyMTI0MDUzODE1ODgsIDAuNzYxMjQxOTkwNjAyNTkxLCAwLjA3Njc5OTQxODYwMzE5MDMgKSxcclxuXHRcdHZlYzMoIDAuMDQ4MjUxNjA2MTQ1ODU4MywgMC4xMDE0MzkwMzY0Njc1NjIsIDAuODExMzAyMzY4Mzk2ODU5IClcclxuXHQpO1xyXG5cclxuXHQvLyBleHBsaWNpdCBBZ1hPdXRzZXRNYXRyaXggZ2VuZXJhdGVkIGZyb20gRmlsYW1lbnRzIEFnWE91dHNldE1hdHJpeEludlxyXG5cdGNvbnN0IG1hdDMgQWdYT3V0c2V0TWF0cml4ID0gbWF0MyhcclxuXHRcdHZlYzMoIDEuMTI3MTAwNTgxODE0NDM2OCwgLSAwLjE0MTMyOTc2MzQ5ODQzODMsIC0gMC4xNDEzMjk3NjM0OTg0MzgyNiApLFxyXG5cdFx0dmVjMyggLSAwLjExMDYwNjY0MzA5NjYwMzIzLCAxLjE1NzgyMzcwMjIxNjI3MiwgLSAwLjExMDYwNjY0MzA5NjYwMjk0ICksXHJcblx0XHR2ZWMzKCAtIDAuMDE2NDkzOTM4NzE3ODM0NTczLCAtIDAuMDE2NDkzOTM4NzE3ODM0MjU3LCAxLjI1MTkzNjQwNjU5NTA0MDUgKVxyXG5cdCk7XHJcblxyXG5cdC8vIExPRzJfTUlOICAgICAgPSAtMTAuMFxyXG5cdC8vIExPRzJfTUFYICAgICAgPSAgKzYuNVxyXG5cdC8vIE1JRERMRV9HUkFZICAgPSAgMC4xOFxyXG5cdGNvbnN0IGZsb2F0IEFneE1pbkV2ID0gLSAxMi40NzM5MzsgIC8vIGxvZzIoIHBvdyggMiwgTE9HMl9NSU4gKSAqIE1JRERMRV9HUkFZIClcclxuXHRjb25zdCBmbG9hdCBBZ3hNYXhFdiA9IDQuMDI2MDY5OyAgICAvLyBsb2cyKCBwb3coIDIsIExPRzJfTUFYICkgKiBNSURETEVfR1JBWSApXHJcblxyXG5cdGNvbG9yICo9IHRvbmVNYXBwaW5nRXhwb3N1cmU7XHJcblxyXG5cdGNvbG9yID0gTElORUFSX1NSR0JfVE9fTElORUFSX1JFQzIwMjAgKiBjb2xvcjtcclxuXHJcblx0Y29sb3IgPSBBZ1hJbnNldE1hdHJpeCAqIGNvbG9yO1xyXG5cclxuXHQvLyBMb2cyIGVuY29kaW5nXHJcblx0Y29sb3IgPSBtYXgoIGNvbG9yLCAxZS0xMCApOyAvLyBhdm9pZCAwIG9yIG5lZ2F0aXZlIG51bWJlcnMgZm9yIGxvZzJcclxuXHRjb2xvciA9IGxvZzIoIGNvbG9yICk7XHJcblx0Y29sb3IgPSAoIGNvbG9yIC0gQWd4TWluRXYgKSAvICggQWd4TWF4RXYgLSBBZ3hNaW5FdiApO1xyXG5cclxuXHRjb2xvciA9IGNsYW1wKCBjb2xvciwgMC4wLCAxLjAgKTtcclxuXHJcblx0Ly8gQXBwbHkgc2lnbW9pZFxyXG5cdGNvbG9yID0gYWd4RGVmYXVsdENvbnRyYXN0QXBwcm94KCBjb2xvciApO1xyXG5cclxuXHQvLyBBcHBseSBBZ1ggbG9va1xyXG5cdC8vIHYgPSBhZ3hMb29rKHYsIGxvb2spO1xyXG5cclxuXHRjb2xvciA9IEFnWE91dHNldE1hdHJpeCAqIGNvbG9yO1xyXG5cclxuXHQvLyBMaW5lYXJpemVcclxuXHRjb2xvciA9IHBvdyggbWF4KCB2ZWMzKCAwLjAgKSwgY29sb3IgKSwgdmVjMyggMi4yICkgKTtcclxuXHJcblx0Y29sb3IgPSBMSU5FQVJfUkVDMjAyMF9UT19MSU5FQVJfU1JHQiAqIGNvbG9yO1xyXG5cclxuXHQvLyBHYW11dCBtYXBwaW5nLiBTaW1wbGUgY2xhbXAgZm9yIG5vdy5cclxuXHRjb2xvciA9IGNsYW1wKCBjb2xvciwgMC4wLCAxLjAgKTtcclxuXHJcblx0cmV0dXJuIGNvbG9yO1xyXG5cclxufVxyXG5cclxuLy8gaHR0cHM6Ly9tb2RlbHZpZXdlci5kZXYvZXhhbXBsZXMvdG9uZS1tYXBwaW5nXHJcblxyXG52ZWMzIE5ldXRyYWxUb25lTWFwcGluZyggdmVjMyBjb2xvciApIHtcclxuXHJcblx0Y29uc3QgZmxvYXQgU3RhcnRDb21wcmVzc2lvbiA9IDAuOCAtIDAuMDQ7XHJcblx0Y29uc3QgZmxvYXQgRGVzYXR1cmF0aW9uID0gMC4xNTtcclxuXHJcblx0Y29sb3IgKj0gdG9uZU1hcHBpbmdFeHBvc3VyZTtcclxuXHJcblx0ZmxvYXQgeCA9IG1pbiggY29sb3IuciwgbWluKCBjb2xvci5nLCBjb2xvci5iICkgKTtcclxuXHJcblx0ZmxvYXQgb2Zmc2V0ID0geCA8IDAuMDggPyB4IC0gNi4yNSAqIHggKiB4IDogMC4wNDtcclxuXHJcblx0Y29sb3IgLT0gb2Zmc2V0O1xyXG5cclxuXHRmbG9hdCBwZWFrID0gbWF4KCBjb2xvci5yLCBtYXgoIGNvbG9yLmcsIGNvbG9yLmIgKSApO1xyXG5cclxuXHRpZiAoIHBlYWsgPCBTdGFydENvbXByZXNzaW9uICkgcmV0dXJuIGNvbG9yO1xyXG5cclxuXHRmbG9hdCBkID0gMS4gLSBTdGFydENvbXByZXNzaW9uO1xyXG5cclxuXHRmbG9hdCBuZXdQZWFrID0gMS4gLSBkICogZCAvICggcGVhayArIGQgLSBTdGFydENvbXByZXNzaW9uICk7XHJcblxyXG5cdGNvbG9yICo9IG5ld1BlYWsgLyBwZWFrO1xyXG5cclxuXHRmbG9hdCBnID0gMS4gLSAxLiAvICggRGVzYXR1cmF0aW9uICogKCBwZWFrIC0gbmV3UGVhayApICsgMS4gKTtcclxuXHJcblx0cmV0dXJuIG1peCggY29sb3IsIHZlYzMoIG5ld1BlYWsgKSwgZyApO1xyXG5cclxufVxyXG5cclxudmVjMyBDdXN0b21Ub25lTWFwcGluZyggdmVjMyBjb2xvciApIHsgcmV0dXJuIGNvbG9yOyB9XHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbiNpZmRlZiBVU0VfVFJBTlNNSVNTSU9OXHJcblxyXG5cdG1hdGVyaWFsLnRyYW5zbWlzc2lvbiA9IHRyYW5zbWlzc2lvbjtcclxuXHRtYXRlcmlhbC50cmFuc21pc3Npb25BbHBoYSA9IDEuMDtcclxuXHRtYXRlcmlhbC50aGlja25lc3MgPSB0aGlja25lc3M7XHJcblx0bWF0ZXJpYWwuYXR0ZW51YXRpb25EaXN0YW5jZSA9IGF0dGVudWF0aW9uRGlzdGFuY2U7XHJcblx0bWF0ZXJpYWwuYXR0ZW51YXRpb25Db2xvciA9IGF0dGVudWF0aW9uQ29sb3I7XHJcblxyXG5cdCNpZmRlZiBVU0VfVFJBTlNNSVNTSU9OTUFQXHJcblxyXG5cdFx0bWF0ZXJpYWwudHJhbnNtaXNzaW9uICo9IHRleHR1cmUyRCggdHJhbnNtaXNzaW9uTWFwLCB2VHJhbnNtaXNzaW9uTWFwVXYgKS5yO1xyXG5cclxuXHQjZW5kaWZcclxuXHJcblx0I2lmZGVmIFVTRV9USElDS05FU1NNQVBcclxuXHJcblx0XHRtYXRlcmlhbC50aGlja25lc3MgKj0gdGV4dHVyZTJEKCB0aGlja25lc3NNYXAsIHZUaGlja25lc3NNYXBVdiApLmc7XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuXHR2ZWMzIHBvcyA9IHZXb3JsZFBvc2l0aW9uO1xyXG5cdHZlYzMgdiA9IG5vcm1hbGl6ZSggY2FtZXJhUG9zaXRpb24gLSBwb3MgKTtcclxuXHR2ZWMzIG4gPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBub3JtYWwsIHZpZXdNYXRyaXggKTtcclxuXHJcblx0dmVjNCB0cmFuc21pdHRlZCA9IGdldElCTFZvbHVtZVJlZnJhY3Rpb24oXHJcblx0XHRuLCB2LCBtYXRlcmlhbC5yb3VnaG5lc3MsIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciwgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciwgbWF0ZXJpYWwuc3BlY3VsYXJGOTAsXHJcblx0XHRwb3MsIG1vZGVsTWF0cml4LCB2aWV3TWF0cml4LCBwcm9qZWN0aW9uTWF0cml4LCBtYXRlcmlhbC5kaXNwZXJzaW9uLCBtYXRlcmlhbC5pb3IsIG1hdGVyaWFsLnRoaWNrbmVzcyxcclxuXHRcdG1hdGVyaWFsLmF0dGVudWF0aW9uQ29sb3IsIG1hdGVyaWFsLmF0dGVudWF0aW9uRGlzdGFuY2UgKTtcclxuXHJcblx0bWF0ZXJpYWwudHJhbnNtaXNzaW9uQWxwaGEgPSBtaXgoIG1hdGVyaWFsLnRyYW5zbWlzc2lvbkFscGhhLCB0cmFuc21pdHRlZC5hLCBtYXRlcmlhbC50cmFuc21pc3Npb24gKTtcclxuXHJcblx0dG90YWxEaWZmdXNlID0gbWl4KCB0b3RhbERpZmZ1c2UsIHRyYW5zbWl0dGVkLnJnYiwgbWF0ZXJpYWwudHJhbnNtaXNzaW9uICk7XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmZGVmIFVTRV9UUkFOU01JU1NJT05cclxuXHJcblx0Ly8gVHJhbnNtaXNzaW9uIGNvZGUgaXMgYmFzZWQgb24gZ2xURi1TYW1wbGVyLVZpZXdlclxyXG5cdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xURi1TYW1wbGUtVmlld2VyXHJcblxyXG5cdHVuaWZvcm0gZmxvYXQgdHJhbnNtaXNzaW9uO1xyXG5cdHVuaWZvcm0gZmxvYXQgdGhpY2tuZXNzO1xyXG5cdHVuaWZvcm0gZmxvYXQgYXR0ZW51YXRpb25EaXN0YW5jZTtcclxuXHR1bmlmb3JtIHZlYzMgYXR0ZW51YXRpb25Db2xvcjtcclxuXHJcblx0I2lmZGVmIFVTRV9UUkFOU01JU1NJT05NQVBcclxuXHJcblx0XHR1bmlmb3JtIHNhbXBsZXIyRCB0cmFuc21pc3Npb25NYXA7XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuXHQjaWZkZWYgVVNFX1RISUNLTkVTU01BUFxyXG5cclxuXHRcdHVuaWZvcm0gc2FtcGxlcjJEIHRoaWNrbmVzc01hcDtcclxuXHJcblx0I2VuZGlmXHJcblxyXG5cdHVuaWZvcm0gdmVjMiB0cmFuc21pc3Npb25TYW1wbGVyU2l6ZTtcclxuXHR1bmlmb3JtIHNhbXBsZXIyRCB0cmFuc21pc3Npb25TYW1wbGVyTWFwO1xyXG5cclxuXHR1bmlmb3JtIG1hdDQgbW9kZWxNYXRyaXg7XHJcblx0dW5pZm9ybSBtYXQ0IHByb2plY3Rpb25NYXRyaXg7XHJcblxyXG5cdHZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcclxuXHJcblx0Ly8gTWlwcGVkIEJpY3ViaWMgVGV4dHVyZSBGaWx0ZXJpbmcgYnkgTjhcclxuXHQvLyBodHRwczovL3d3dy5zaGFkZXJ0b3kuY29tL3ZpZXcvRGwyU0RXXHJcblxyXG5cdGZsb2F0IHcwKCBmbG9hdCBhICkge1xyXG5cclxuXHRcdHJldHVybiAoIDEuMCAvIDYuMCApICogKCBhICogKCBhICogKCAtIGEgKyAzLjAgKSAtIDMuMCApICsgMS4wICk7XHJcblxyXG5cdH1cclxuXHJcblx0ZmxvYXQgdzEoIGZsb2F0IGEgKSB7XHJcblxyXG5cdFx0cmV0dXJuICggMS4wIC8gNi4wICkgKiAoIGEgKiAgYSAqICggMy4wICogYSAtIDYuMCApICsgNC4wICk7XHJcblxyXG5cdH1cclxuXHJcblx0ZmxvYXQgdzIoIGZsb2F0IGEgKXtcclxuXHJcblx0XHRyZXR1cm4gKCAxLjAgLyA2LjAgKSAqICggYSAqICggYSAqICggLSAzLjAgKiBhICsgMy4wICkgKyAzLjAgKSArIDEuMCApO1xyXG5cclxuXHR9XHJcblxyXG5cdGZsb2F0IHczKCBmbG9hdCBhICkge1xyXG5cclxuXHRcdHJldHVybiAoIDEuMCAvIDYuMCApICogKCBhICogYSAqIGEgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvLyBnMCBhbmQgZzEgYXJlIHRoZSB0d28gYW1wbGl0dWRlIGZ1bmN0aW9uc1xyXG5cdGZsb2F0IGcwKCBmbG9hdCBhICkge1xyXG5cclxuXHRcdHJldHVybiB3MCggYSApICsgdzEoIGEgKTtcclxuXHJcblx0fVxyXG5cclxuXHRmbG9hdCBnMSggZmxvYXQgYSApIHtcclxuXHJcblx0XHRyZXR1cm4gdzIoIGEgKSArIHczKCBhICk7XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gaDAgYW5kIGgxIGFyZSB0aGUgdHdvIG9mZnNldCBmdW5jdGlvbnNcclxuXHRmbG9hdCBoMCggZmxvYXQgYSApIHtcclxuXHJcblx0XHRyZXR1cm4gLSAxLjAgKyB3MSggYSApIC8gKCB3MCggYSApICsgdzEoIGEgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdGZsb2F0IGgxKCBmbG9hdCBhICkge1xyXG5cclxuXHRcdHJldHVybiAxLjAgKyB3MyggYSApIC8gKCB3MiggYSApICsgdzMoIGEgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdHZlYzQgYmljdWJpYyggc2FtcGxlcjJEIHRleCwgdmVjMiB1diwgdmVjNCB0ZXhlbFNpemUsIGZsb2F0IGxvZCApIHtcclxuXHJcblx0XHR1diA9IHV2ICogdGV4ZWxTaXplLnp3ICsgMC41O1xyXG5cclxuXHRcdHZlYzIgaXV2ID0gZmxvb3IoIHV2ICk7XHJcblx0XHR2ZWMyIGZ1diA9IGZyYWN0KCB1diApO1xyXG5cclxuXHRcdGZsb2F0IGcweCA9IGcwKCBmdXYueCApO1xyXG5cdFx0ZmxvYXQgZzF4ID0gZzEoIGZ1di54ICk7XHJcblx0XHRmbG9hdCBoMHggPSBoMCggZnV2LnggKTtcclxuXHRcdGZsb2F0IGgxeCA9IGgxKCBmdXYueCApO1xyXG5cdFx0ZmxvYXQgaDB5ID0gaDAoIGZ1di55ICk7XHJcblx0XHRmbG9hdCBoMXkgPSBoMSggZnV2LnkgKTtcclxuXHJcblx0XHR2ZWMyIHAwID0gKCB2ZWMyKCBpdXYueCArIGgweCwgaXV2LnkgKyBoMHkgKSAtIDAuNSApICogdGV4ZWxTaXplLnh5O1xyXG5cdFx0dmVjMiBwMSA9ICggdmVjMiggaXV2LnggKyBoMXgsIGl1di55ICsgaDB5ICkgLSAwLjUgKSAqIHRleGVsU2l6ZS54eTtcclxuXHRcdHZlYzIgcDIgPSAoIHZlYzIoIGl1di54ICsgaDB4LCBpdXYueSArIGgxeSApIC0gMC41ICkgKiB0ZXhlbFNpemUueHk7XHJcblx0XHR2ZWMyIHAzID0gKCB2ZWMyKCBpdXYueCArIGgxeCwgaXV2LnkgKyBoMXkgKSAtIDAuNSApICogdGV4ZWxTaXplLnh5O1xyXG5cclxuXHRcdHJldHVybiBnMCggZnV2LnkgKSAqICggZzB4ICogdGV4dHVyZUxvZCggdGV4LCBwMCwgbG9kICkgKyBnMXggKiB0ZXh0dXJlTG9kKCB0ZXgsIHAxLCBsb2QgKSApICtcclxuXHRcdFx0ZzEoIGZ1di55ICkgKiAoIGcweCAqIHRleHR1cmVMb2QoIHRleCwgcDIsIGxvZCApICsgZzF4ICogdGV4dHVyZUxvZCggdGV4LCBwMywgbG9kICkgKTtcclxuXHJcblx0fVxyXG5cclxuXHR2ZWM0IHRleHR1cmVCaWN1YmljKCBzYW1wbGVyMkQgc2FtcGxlciwgdmVjMiB1diwgZmxvYXQgbG9kICkge1xyXG5cclxuXHRcdHZlYzIgZkxvZFNpemUgPSB2ZWMyKCB0ZXh0dXJlU2l6ZSggc2FtcGxlciwgaW50KCBsb2QgKSApICk7XHJcblx0XHR2ZWMyIGNMb2RTaXplID0gdmVjMiggdGV4dHVyZVNpemUoIHNhbXBsZXIsIGludCggbG9kICsgMS4wICkgKSApO1xyXG5cdFx0dmVjMiBmTG9kU2l6ZUludiA9IDEuMCAvIGZMb2RTaXplO1xyXG5cdFx0dmVjMiBjTG9kU2l6ZUludiA9IDEuMCAvIGNMb2RTaXplO1xyXG5cdFx0dmVjNCBmU2FtcGxlID0gYmljdWJpYyggc2FtcGxlciwgdXYsIHZlYzQoIGZMb2RTaXplSW52LCBmTG9kU2l6ZSApLCBmbG9vciggbG9kICkgKTtcclxuXHRcdHZlYzQgY1NhbXBsZSA9IGJpY3ViaWMoIHNhbXBsZXIsIHV2LCB2ZWM0KCBjTG9kU2l6ZUludiwgY0xvZFNpemUgKSwgY2VpbCggbG9kICkgKTtcclxuXHRcdHJldHVybiBtaXgoIGZTYW1wbGUsIGNTYW1wbGUsIGZyYWN0KCBsb2QgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdHZlYzMgZ2V0Vm9sdW1lVHJhbnNtaXNzaW9uUmF5KCBjb25zdCBpbiB2ZWMzIG4sIGNvbnN0IGluIHZlYzMgdiwgY29uc3QgaW4gZmxvYXQgdGhpY2tuZXNzLCBjb25zdCBpbiBmbG9hdCBpb3IsIGNvbnN0IGluIG1hdDQgbW9kZWxNYXRyaXggKSB7XHJcblxyXG5cdFx0Ly8gRGlyZWN0aW9uIG9mIHJlZnJhY3RlZCBsaWdodC5cclxuXHRcdHZlYzMgcmVmcmFjdGlvblZlY3RvciA9IHJlZnJhY3QoIC0gdiwgbm9ybWFsaXplKCBuICksIDEuMCAvIGlvciApO1xyXG5cclxuXHRcdC8vIENvbXB1dGUgcm90YXRpb24taW5kZXBlbmRlbnQgc2NhbGluZyBvZiB0aGUgbW9kZWwgbWF0cml4LlxyXG5cdFx0dmVjMyBtb2RlbFNjYWxlO1xyXG5cdFx0bW9kZWxTY2FsZS54ID0gbGVuZ3RoKCB2ZWMzKCBtb2RlbE1hdHJpeFsgMCBdLnh5eiApICk7XHJcblx0XHRtb2RlbFNjYWxlLnkgPSBsZW5ndGgoIHZlYzMoIG1vZGVsTWF0cml4WyAxIF0ueHl6ICkgKTtcclxuXHRcdG1vZGVsU2NhbGUueiA9IGxlbmd0aCggdmVjMyggbW9kZWxNYXRyaXhbIDIgXS54eXogKSApO1xyXG5cclxuXHRcdC8vIFRoZSB0aGlja25lc3MgaXMgc3BlY2lmaWVkIGluIGxvY2FsIHNwYWNlLlxyXG5cdFx0cmV0dXJuIG5vcm1hbGl6ZSggcmVmcmFjdGlvblZlY3RvciApICogdGhpY2tuZXNzICogbW9kZWxTY2FsZTtcclxuXHJcblx0fVxyXG5cclxuXHRmbG9hdCBhcHBseUlvclRvUm91Z2huZXNzKCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGNvbnN0IGluIGZsb2F0IGlvciApIHtcclxuXHJcblx0XHQvLyBTY2FsZSByb3VnaG5lc3Mgd2l0aCBJT1Igc28gdGhhdCBhbiBJT1Igb2YgMS4wIHJlc3VsdHMgaW4gbm8gbWljcm9mYWNldCByZWZyYWN0aW9uIGFuZFxyXG5cdFx0Ly8gYW4gSU9SIG9mIDEuNSByZXN1bHRzIGluIHRoZSBkZWZhdWx0IGFtb3VudCBvZiBtaWNyb2ZhY2V0IHJlZnJhY3Rpb24uXHJcblx0XHRyZXR1cm4gcm91Z2huZXNzICogY2xhbXAoIGlvciAqIDIuMCAtIDIuMCwgMC4wLCAxLjAgKTtcclxuXHJcblx0fVxyXG5cclxuXHR2ZWM0IGdldFRyYW5zbWlzc2lvblNhbXBsZSggY29uc3QgaW4gdmVjMiBmcmFnQ29vcmQsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gZmxvYXQgaW9yICkge1xyXG5cclxuXHRcdGZsb2F0IGxvZCA9IGxvZzIoIHRyYW5zbWlzc2lvblNhbXBsZXJTaXplLnggKSAqIGFwcGx5SW9yVG9Sb3VnaG5lc3MoIHJvdWdobmVzcywgaW9yICk7XHJcblx0XHRyZXR1cm4gdGV4dHVyZUJpY3ViaWMoIHRyYW5zbWlzc2lvblNhbXBsZXJNYXAsIGZyYWdDb29yZC54eSwgbG9kICk7XHJcblxyXG5cdH1cclxuXHJcblx0dmVjMyB2b2x1bWVBdHRlbnVhdGlvbiggY29uc3QgaW4gZmxvYXQgdHJhbnNtaXNzaW9uRGlzdGFuY2UsIGNvbnN0IGluIHZlYzMgYXR0ZW51YXRpb25Db2xvciwgY29uc3QgaW4gZmxvYXQgYXR0ZW51YXRpb25EaXN0YW5jZSApIHtcclxuXHJcblx0XHRpZiAoIGlzaW5mKCBhdHRlbnVhdGlvbkRpc3RhbmNlICkgKSB7XHJcblxyXG5cdFx0XHQvLyBBdHRlbnVhdGlvbiBkaXN0YW5jZSBpcyAr4oieLCBpLmUuIHRoZSB0cmFuc21pdHRlZCBjb2xvciBpcyBub3QgYXR0ZW51YXRlZCBhdCBhbGwuXHJcblx0XHRcdHJldHVybiB2ZWMzKCAxLjAgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Ly8gQ29tcHV0ZSBsaWdodCBhdHRlbnVhdGlvbiB1c2luZyBCZWVyJ3MgbGF3LlxyXG5cdFx0XHR2ZWMzIGF0dGVudWF0aW9uQ29lZmZpY2llbnQgPSAtbG9nKCBhdHRlbnVhdGlvbkNvbG9yICkgLyBhdHRlbnVhdGlvbkRpc3RhbmNlO1xyXG5cdFx0XHR2ZWMzIHRyYW5zbWl0dGFuY2UgPSBleHAoIC0gYXR0ZW51YXRpb25Db2VmZmljaWVudCAqIHRyYW5zbWlzc2lvbkRpc3RhbmNlICk7IC8vIEJlZXIncyBsYXdcclxuXHRcdFx0cmV0dXJuIHRyYW5zbWl0dGFuY2U7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdHZlYzQgZ2V0SUJMVm9sdW1lUmVmcmFjdGlvbiggY29uc3QgaW4gdmVjMyBuLCBjb25zdCBpbiB2ZWMzIHYsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gdmVjMyBkaWZmdXNlQ29sb3IsXHJcblx0XHRjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IHNwZWN1bGFyRjkwLCBjb25zdCBpbiB2ZWMzIHBvc2l0aW9uLCBjb25zdCBpbiBtYXQ0IG1vZGVsTWF0cml4LFxyXG5cdFx0Y29uc3QgaW4gbWF0NCB2aWV3TWF0cml4LCBjb25zdCBpbiBtYXQ0IHByb2pNYXRyaXgsIGNvbnN0IGluIGZsb2F0IGRpc3BlcnNpb24sIGNvbnN0IGluIGZsb2F0IGlvciwgY29uc3QgaW4gZmxvYXQgdGhpY2tuZXNzLFxyXG5cdFx0Y29uc3QgaW4gdmVjMyBhdHRlbnVhdGlvbkNvbG9yLCBjb25zdCBpbiBmbG9hdCBhdHRlbnVhdGlvbkRpc3RhbmNlICkge1xyXG5cclxuXHRcdHZlYzQgdHJhbnNtaXR0ZWRMaWdodDtcclxuXHRcdHZlYzMgdHJhbnNtaXR0YW5jZTtcclxuXHJcblx0XHQjaWZkZWYgVVNFX0RJU1BFUlNJT05cclxuXHJcblx0XHRcdGZsb2F0IGhhbGZTcHJlYWQgPSAoIGlvciAtIDEuMCApICogMC4wMjUgKiBkaXNwZXJzaW9uO1xyXG5cdFx0XHR2ZWMzIGlvcnMgPSB2ZWMzKCBpb3IgLSBoYWxmU3ByZWFkLCBpb3IsIGlvciArIGhhbGZTcHJlYWQgKTtcclxuXHJcblx0XHRcdGZvciAoIGludCBpID0gMDsgaSA8IDM7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdHZlYzMgdHJhbnNtaXNzaW9uUmF5ID0gZ2V0Vm9sdW1lVHJhbnNtaXNzaW9uUmF5KCBuLCB2LCB0aGlja25lc3MsIGlvcnNbIGkgXSwgbW9kZWxNYXRyaXggKTtcclxuXHRcdFx0XHR2ZWMzIHJlZnJhY3RlZFJheUV4aXQgPSBwb3NpdGlvbiArIHRyYW5zbWlzc2lvblJheTtcclxuXHJcblx0XHRcdFx0Ly8gUHJvamVjdCByZWZyYWN0ZWQgdmVjdG9yIG9uIHRoZSBmcmFtZWJ1ZmZlciwgd2hpbGUgbWFwcGluZyB0byBub3JtYWxpemVkIGRldmljZSBjb29yZGluYXRlcy5cclxuXHRcdFx0XHR2ZWM0IG5kY1BvcyA9IHByb2pNYXRyaXggKiB2aWV3TWF0cml4ICogdmVjNCggcmVmcmFjdGVkUmF5RXhpdCwgMS4wICk7XHJcblx0XHRcdFx0dmVjMiByZWZyYWN0aW9uQ29vcmRzID0gbmRjUG9zLnh5IC8gbmRjUG9zLnc7XHJcblx0XHRcdFx0cmVmcmFjdGlvbkNvb3JkcyArPSAxLjA7XHJcblx0XHRcdFx0cmVmcmFjdGlvbkNvb3JkcyAvPSAyLjA7XHJcblxyXG5cdFx0XHRcdC8vIFNhbXBsZSBmcmFtZWJ1ZmZlciB0byBnZXQgcGl4ZWwgdGhlIHJlZnJhY3RlZCByYXkgaGl0cy5cclxuXHRcdFx0XHR2ZWM0IHRyYW5zbWlzc2lvblNhbXBsZSA9IGdldFRyYW5zbWlzc2lvblNhbXBsZSggcmVmcmFjdGlvbkNvb3Jkcywgcm91Z2huZXNzLCBpb3JzWyBpIF0gKTtcclxuXHRcdFx0XHR0cmFuc21pdHRlZExpZ2h0WyBpIF0gPSB0cmFuc21pc3Npb25TYW1wbGVbIGkgXTtcclxuXHRcdFx0XHR0cmFuc21pdHRlZExpZ2h0LmEgKz0gdHJhbnNtaXNzaW9uU2FtcGxlLmE7XHJcblxyXG5cdFx0XHRcdHRyYW5zbWl0dGFuY2VbIGkgXSA9IGRpZmZ1c2VDb2xvclsgaSBdICogdm9sdW1lQXR0ZW51YXRpb24oIGxlbmd0aCggdHJhbnNtaXNzaW9uUmF5ICksIGF0dGVudWF0aW9uQ29sb3IsIGF0dGVudWF0aW9uRGlzdGFuY2UgKVsgaSBdO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dHJhbnNtaXR0ZWRMaWdodC5hIC89IDMuMDtcclxuXHJcblx0XHQjZWxzZVxyXG5cclxuXHRcdFx0dmVjMyB0cmFuc21pc3Npb25SYXkgPSBnZXRWb2x1bWVUcmFuc21pc3Npb25SYXkoIG4sIHYsIHRoaWNrbmVzcywgaW9yLCBtb2RlbE1hdHJpeCApO1xyXG5cdFx0XHR2ZWMzIHJlZnJhY3RlZFJheUV4aXQgPSBwb3NpdGlvbiArIHRyYW5zbWlzc2lvblJheTtcclxuXHJcblx0XHRcdC8vIFByb2plY3QgcmVmcmFjdGVkIHZlY3RvciBvbiB0aGUgZnJhbWVidWZmZXIsIHdoaWxlIG1hcHBpbmcgdG8gbm9ybWFsaXplZCBkZXZpY2UgY29vcmRpbmF0ZXMuXHJcblx0XHRcdHZlYzQgbmRjUG9zID0gcHJvak1hdHJpeCAqIHZpZXdNYXRyaXggKiB2ZWM0KCByZWZyYWN0ZWRSYXlFeGl0LCAxLjAgKTtcclxuXHRcdFx0dmVjMiByZWZyYWN0aW9uQ29vcmRzID0gbmRjUG9zLnh5IC8gbmRjUG9zLnc7XHJcblx0XHRcdHJlZnJhY3Rpb25Db29yZHMgKz0gMS4wO1xyXG5cdFx0XHRyZWZyYWN0aW9uQ29vcmRzIC89IDIuMDtcclxuXHJcblx0XHRcdC8vIFNhbXBsZSBmcmFtZWJ1ZmZlciB0byBnZXQgcGl4ZWwgdGhlIHJlZnJhY3RlZCByYXkgaGl0cy5cclxuXHRcdFx0dHJhbnNtaXR0ZWRMaWdodCA9IGdldFRyYW5zbWlzc2lvblNhbXBsZSggcmVmcmFjdGlvbkNvb3Jkcywgcm91Z2huZXNzLCBpb3IgKTtcclxuXHRcdFx0dHJhbnNtaXR0YW5jZSA9IGRpZmZ1c2VDb2xvciAqIHZvbHVtZUF0dGVudWF0aW9uKCBsZW5ndGgoIHRyYW5zbWlzc2lvblJheSApLCBhdHRlbnVhdGlvbkNvbG9yLCBhdHRlbnVhdGlvbkRpc3RhbmNlICk7XHJcblxyXG5cdFx0I2VuZGlmXHJcblxyXG5cdFx0dmVjMyBhdHRlbnVhdGVkQ29sb3IgPSB0cmFuc21pdHRhbmNlICogdHJhbnNtaXR0ZWRMaWdodC5yZ2I7XHJcblxyXG5cdFx0Ly8gR2V0IHRoZSBzcGVjdWxhciBjb21wb25lbnQuXHJcblx0XHR2ZWMzIEYgPSBFbnZpcm9ubWVudEJSREYoIG4sIHYsIHNwZWN1bGFyQ29sb3IsIHNwZWN1bGFyRjkwLCByb3VnaG5lc3MgKTtcclxuXHJcblx0XHQvLyBBcyBsZXNzIGxpZ2h0IGlzIHRyYW5zbWl0dGVkLCB0aGUgb3BhY2l0eSBzaG91bGQgYmUgaW5jcmVhc2VkLiBUaGlzIHNpbXBsZSBhcHByb3hpbWF0aW9uIGRvZXMgYSBkZWNlbnQgam9iXHJcblx0XHQvLyBvZiBtb2R1bGF0aW5nIGEgQ1NTIGJhY2tncm91bmQsIGFuZCBoYXMgbm8gZWZmZWN0IHdoZW4gdGhlIGJ1ZmZlciBpcyBvcGFxdWUsIGR1ZSB0byBhIHNvbGlkIG9iamVjdCBvciBjbGVhciBjb2xvci5cclxuXHRcdGZsb2F0IHRyYW5zbWl0dGFuY2VGYWN0b3IgPSAoIHRyYW5zbWl0dGFuY2UuciArIHRyYW5zbWl0dGFuY2UuZyArIHRyYW5zbWl0dGFuY2UuYiApIC8gMy4wO1xyXG5cclxuXHRcdHJldHVybiB2ZWM0KCAoIDEuMCAtIEYgKSAqIGF0dGVudWF0ZWRDb2xvciwgMS4wIC0gKCAxLjAgLSB0cmFuc21pdHRlZExpZ2h0LmEgKSAqIHRyYW5zbWl0dGFuY2VGYWN0b3IgKTtcclxuXHJcblx0fVxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmIGRlZmluZWQoIFVTRV9VViApIHx8IGRlZmluZWQoIFVTRV9BTklTT1RST1BZIClcclxuXHJcblx0dmFyeWluZyB2ZWMyIHZVdjtcclxuXHJcbiNlbmRpZlxyXG4jaWZkZWYgVVNFX01BUFxyXG5cclxuXHR2YXJ5aW5nIHZlYzIgdk1hcFV2O1xyXG5cclxuI2VuZGlmXHJcbiNpZmRlZiBVU0VfQUxQSEFNQVBcclxuXHJcblx0dmFyeWluZyB2ZWMyIHZBbHBoYU1hcFV2O1xyXG5cclxuI2VuZGlmXHJcbiNpZmRlZiBVU0VfTElHSFRNQVBcclxuXHJcblx0dmFyeWluZyB2ZWMyIHZMaWdodE1hcFV2O1xyXG5cclxuI2VuZGlmXHJcbiNpZmRlZiBVU0VfQU9NQVBcclxuXHJcblx0dmFyeWluZyB2ZWMyIHZBb01hcFV2O1xyXG5cclxuI2VuZGlmXHJcbiNpZmRlZiBVU0VfQlVNUE1BUFxyXG5cclxuXHR2YXJ5aW5nIHZlYzIgdkJ1bXBNYXBVdjtcclxuXHJcbiNlbmRpZlxyXG4jaWZkZWYgVVNFX05PUk1BTE1BUFxyXG5cclxuXHR2YXJ5aW5nIHZlYzIgdk5vcm1hbE1hcFV2O1xyXG5cclxuI2VuZGlmXHJcbiNpZmRlZiBVU0VfRU1JU1NJVkVNQVBcclxuXHJcblx0dmFyeWluZyB2ZWMyIHZFbWlzc2l2ZU1hcFV2O1xyXG5cclxuI2VuZGlmXHJcbiNpZmRlZiBVU0VfTUVUQUxORVNTTUFQXHJcblxyXG5cdHZhcnlpbmcgdmVjMiB2TWV0YWxuZXNzTWFwVXY7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9ST1VHSE5FU1NNQVBcclxuXHJcblx0dmFyeWluZyB2ZWMyIHZSb3VnaG5lc3NNYXBVdjtcclxuXHJcbiNlbmRpZlxyXG4jaWZkZWYgVVNFX0FOSVNPVFJPUFlNQVBcclxuXHJcblx0dmFyeWluZyB2ZWMyIHZBbmlzb3Ryb3B5TWFwVXY7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9DTEVBUkNPQVRNQVBcclxuXHJcblx0dmFyeWluZyB2ZWMyIHZDbGVhcmNvYXRNYXBVdjtcclxuXHJcbiNlbmRpZlxyXG4jaWZkZWYgVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVBcclxuXHJcblx0dmFyeWluZyB2ZWMyIHZDbGVhcmNvYXROb3JtYWxNYXBVdjtcclxuXHJcbiNlbmRpZlxyXG4jaWZkZWYgVVNFX0NMRUFSQ09BVF9ST1VHSE5FU1NNQVBcclxuXHJcblx0dmFyeWluZyB2ZWMyIHZDbGVhcmNvYXRSb3VnaG5lc3NNYXBVdjtcclxuXHJcbiNlbmRpZlxyXG4jaWZkZWYgVVNFX0lSSURFU0NFTkNFTUFQXHJcblxyXG5cdHZhcnlpbmcgdmVjMiB2SXJpZGVzY2VuY2VNYXBVdjtcclxuXHJcbiNlbmRpZlxyXG4jaWZkZWYgVVNFX0lSSURFU0NFTkNFX1RISUNLTkVTU01BUFxyXG5cclxuXHR2YXJ5aW5nIHZlYzIgdklyaWRlc2NlbmNlVGhpY2tuZXNzTWFwVXY7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9TSEVFTl9DT0xPUk1BUFxyXG5cclxuXHR2YXJ5aW5nIHZlYzIgdlNoZWVuQ29sb3JNYXBVdjtcclxuXHJcbiNlbmRpZlxyXG4jaWZkZWYgVVNFX1NIRUVOX1JPVUdITkVTU01BUFxyXG5cclxuXHR2YXJ5aW5nIHZlYzIgdlNoZWVuUm91Z2huZXNzTWFwVXY7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9TUEVDVUxBUk1BUFxyXG5cclxuXHR2YXJ5aW5nIHZlYzIgdlNwZWN1bGFyTWFwVXY7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9TUEVDVUxBUl9DT0xPUk1BUFxyXG5cclxuXHR2YXJ5aW5nIHZlYzIgdlNwZWN1bGFyQ29sb3JNYXBVdjtcclxuXHJcbiNlbmRpZlxyXG4jaWZkZWYgVVNFX1NQRUNVTEFSX0lOVEVOU0lUWU1BUFxyXG5cclxuXHR2YXJ5aW5nIHZlYzIgdlNwZWN1bGFySW50ZW5zaXR5TWFwVXY7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9UUkFOU01JU1NJT05NQVBcclxuXHJcblx0dW5pZm9ybSBtYXQzIHRyYW5zbWlzc2lvbk1hcFRyYW5zZm9ybTtcclxuXHR2YXJ5aW5nIHZlYzIgdlRyYW5zbWlzc2lvbk1hcFV2O1xyXG5cclxuI2VuZGlmXHJcbiNpZmRlZiBVU0VfVEhJQ0tORVNTTUFQXHJcblxyXG5cdHVuaWZvcm0gbWF0MyB0aGlja25lc3NNYXBUcmFuc2Zvcm07XHJcblx0dmFyeWluZyB2ZWMyIHZUaGlja25lc3NNYXBVdjtcclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jaWYgZGVmaW5lZCggVVNFX1VWICkgfHwgZGVmaW5lZCggVVNFX0FOSVNPVFJPUFkgKVxyXG5cclxuXHR2YXJ5aW5nIHZlYzIgdlV2O1xyXG5cclxuI2VuZGlmXHJcbiNpZmRlZiBVU0VfTUFQXHJcblxyXG5cdHVuaWZvcm0gbWF0MyBtYXBUcmFuc2Zvcm07XHJcblx0dmFyeWluZyB2ZWMyIHZNYXBVdjtcclxuXHJcbiNlbmRpZlxyXG4jaWZkZWYgVVNFX0FMUEhBTUFQXHJcblxyXG5cdHVuaWZvcm0gbWF0MyBhbHBoYU1hcFRyYW5zZm9ybTtcclxuXHR2YXJ5aW5nIHZlYzIgdkFscGhhTWFwVXY7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9MSUdIVE1BUFxyXG5cclxuXHR1bmlmb3JtIG1hdDMgbGlnaHRNYXBUcmFuc2Zvcm07XHJcblx0dmFyeWluZyB2ZWMyIHZMaWdodE1hcFV2O1xyXG5cclxuI2VuZGlmXHJcbiNpZmRlZiBVU0VfQU9NQVBcclxuXHJcblx0dW5pZm9ybSBtYXQzIGFvTWFwVHJhbnNmb3JtO1xyXG5cdHZhcnlpbmcgdmVjMiB2QW9NYXBVdjtcclxuXHJcbiNlbmRpZlxyXG4jaWZkZWYgVVNFX0JVTVBNQVBcclxuXHJcblx0dW5pZm9ybSBtYXQzIGJ1bXBNYXBUcmFuc2Zvcm07XHJcblx0dmFyeWluZyB2ZWMyIHZCdW1wTWFwVXY7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9OT1JNQUxNQVBcclxuXHJcblx0dW5pZm9ybSBtYXQzIG5vcm1hbE1hcFRyYW5zZm9ybTtcclxuXHR2YXJ5aW5nIHZlYzIgdk5vcm1hbE1hcFV2O1xyXG5cclxuI2VuZGlmXHJcbiNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQXHJcblxyXG5cdHVuaWZvcm0gbWF0MyBkaXNwbGFjZW1lbnRNYXBUcmFuc2Zvcm07XHJcblx0dmFyeWluZyB2ZWMyIHZEaXNwbGFjZW1lbnRNYXBVdjtcclxuXHJcbiNlbmRpZlxyXG4jaWZkZWYgVVNFX0VNSVNTSVZFTUFQXHJcblxyXG5cdHVuaWZvcm0gbWF0MyBlbWlzc2l2ZU1hcFRyYW5zZm9ybTtcclxuXHR2YXJ5aW5nIHZlYzIgdkVtaXNzaXZlTWFwVXY7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9NRVRBTE5FU1NNQVBcclxuXHJcblx0dW5pZm9ybSBtYXQzIG1ldGFsbmVzc01hcFRyYW5zZm9ybTtcclxuXHR2YXJ5aW5nIHZlYzIgdk1ldGFsbmVzc01hcFV2O1xyXG5cclxuI2VuZGlmXHJcbiNpZmRlZiBVU0VfUk9VR0hORVNTTUFQXHJcblxyXG5cdHVuaWZvcm0gbWF0MyByb3VnaG5lc3NNYXBUcmFuc2Zvcm07XHJcblx0dmFyeWluZyB2ZWMyIHZSb3VnaG5lc3NNYXBVdjtcclxuXHJcbiNlbmRpZlxyXG4jaWZkZWYgVVNFX0FOSVNPVFJPUFlNQVBcclxuXHJcblx0dW5pZm9ybSBtYXQzIGFuaXNvdHJvcHlNYXBUcmFuc2Zvcm07XHJcblx0dmFyeWluZyB2ZWMyIHZBbmlzb3Ryb3B5TWFwVXY7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9DTEVBUkNPQVRNQVBcclxuXHJcblx0dW5pZm9ybSBtYXQzIGNsZWFyY29hdE1hcFRyYW5zZm9ybTtcclxuXHR2YXJ5aW5nIHZlYzIgdkNsZWFyY29hdE1hcFV2O1xyXG5cclxuI2VuZGlmXHJcbiNpZmRlZiBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUFxyXG5cclxuXHR1bmlmb3JtIG1hdDMgY2xlYXJjb2F0Tm9ybWFsTWFwVHJhbnNmb3JtO1xyXG5cdHZhcnlpbmcgdmVjMiB2Q2xlYXJjb2F0Tm9ybWFsTWFwVXY7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9DTEVBUkNPQVRfUk9VR0hORVNTTUFQXHJcblxyXG5cdHVuaWZvcm0gbWF0MyBjbGVhcmNvYXRSb3VnaG5lc3NNYXBUcmFuc2Zvcm07XHJcblx0dmFyeWluZyB2ZWMyIHZDbGVhcmNvYXRSb3VnaG5lc3NNYXBVdjtcclxuXHJcbiNlbmRpZlxyXG4jaWZkZWYgVVNFX1NIRUVOX0NPTE9STUFQXHJcblxyXG5cdHVuaWZvcm0gbWF0MyBzaGVlbkNvbG9yTWFwVHJhbnNmb3JtO1xyXG5cdHZhcnlpbmcgdmVjMiB2U2hlZW5Db2xvck1hcFV2O1xyXG5cclxuI2VuZGlmXHJcbiNpZmRlZiBVU0VfU0hFRU5fUk9VR0hORVNTTUFQXHJcblxyXG5cdHVuaWZvcm0gbWF0MyBzaGVlblJvdWdobmVzc01hcFRyYW5zZm9ybTtcclxuXHR2YXJ5aW5nIHZlYzIgdlNoZWVuUm91Z2huZXNzTWFwVXY7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9JUklERVNDRU5DRU1BUFxyXG5cclxuXHR1bmlmb3JtIG1hdDMgaXJpZGVzY2VuY2VNYXBUcmFuc2Zvcm07XHJcblx0dmFyeWluZyB2ZWMyIHZJcmlkZXNjZW5jZU1hcFV2O1xyXG5cclxuI2VuZGlmXHJcbiNpZmRlZiBVU0VfSVJJREVTQ0VOQ0VfVEhJQ0tORVNTTUFQXHJcblxyXG5cdHVuaWZvcm0gbWF0MyBpcmlkZXNjZW5jZVRoaWNrbmVzc01hcFRyYW5zZm9ybTtcclxuXHR2YXJ5aW5nIHZlYzIgdklyaWRlc2NlbmNlVGhpY2tuZXNzTWFwVXY7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9TUEVDVUxBUk1BUFxyXG5cclxuXHR1bmlmb3JtIG1hdDMgc3BlY3VsYXJNYXBUcmFuc2Zvcm07XHJcblx0dmFyeWluZyB2ZWMyIHZTcGVjdWxhck1hcFV2O1xyXG5cclxuI2VuZGlmXHJcbiNpZmRlZiBVU0VfU1BFQ1VMQVJfQ09MT1JNQVBcclxuXHJcblx0dW5pZm9ybSBtYXQzIHNwZWN1bGFyQ29sb3JNYXBUcmFuc2Zvcm07XHJcblx0dmFyeWluZyB2ZWMyIHZTcGVjdWxhckNvbG9yTWFwVXY7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9TUEVDVUxBUl9JTlRFTlNJVFlNQVBcclxuXHJcblx0dW5pZm9ybSBtYXQzIHNwZWN1bGFySW50ZW5zaXR5TWFwVHJhbnNmb3JtO1xyXG5cdHZhcnlpbmcgdmVjMiB2U3BlY3VsYXJJbnRlbnNpdHlNYXBVdjtcclxuXHJcbiNlbmRpZlxyXG4jaWZkZWYgVVNFX1RSQU5TTUlTU0lPTk1BUFxyXG5cclxuXHR1bmlmb3JtIG1hdDMgdHJhbnNtaXNzaW9uTWFwVHJhbnNmb3JtO1xyXG5cdHZhcnlpbmcgdmVjMiB2VHJhbnNtaXNzaW9uTWFwVXY7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9USElDS05FU1NNQVBcclxuXHJcblx0dW5pZm9ybSBtYXQzIHRoaWNrbmVzc01hcFRyYW5zZm9ybTtcclxuXHR2YXJ5aW5nIHZlYzIgdlRoaWNrbmVzc01hcFV2O1xyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbiNpZiBkZWZpbmVkKCBVU0VfVVYgKSB8fCBkZWZpbmVkKCBVU0VfQU5JU09UUk9QWSApXHJcblxyXG5cdHZVdiA9IHZlYzMoIHV2LCAxICkueHk7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9NQVBcclxuXHJcblx0dk1hcFV2ID0gKCBtYXBUcmFuc2Zvcm0gKiB2ZWMzKCBNQVBfVVYsIDEgKSApLnh5O1xyXG5cclxuI2VuZGlmXHJcbiNpZmRlZiBVU0VfQUxQSEFNQVBcclxuXHJcblx0dkFscGhhTWFwVXYgPSAoIGFscGhhTWFwVHJhbnNmb3JtICogdmVjMyggQUxQSEFNQVBfVVYsIDEgKSApLnh5O1xyXG5cclxuI2VuZGlmXHJcbiNpZmRlZiBVU0VfTElHSFRNQVBcclxuXHJcblx0dkxpZ2h0TWFwVXYgPSAoIGxpZ2h0TWFwVHJhbnNmb3JtICogdmVjMyggTElHSFRNQVBfVVYsIDEgKSApLnh5O1xyXG5cclxuI2VuZGlmXHJcbiNpZmRlZiBVU0VfQU9NQVBcclxuXHJcblx0dkFvTWFwVXYgPSAoIGFvTWFwVHJhbnNmb3JtICogdmVjMyggQU9NQVBfVVYsIDEgKSApLnh5O1xyXG5cclxuI2VuZGlmXHJcbiNpZmRlZiBVU0VfQlVNUE1BUFxyXG5cclxuXHR2QnVtcE1hcFV2ID0gKCBidW1wTWFwVHJhbnNmb3JtICogdmVjMyggQlVNUE1BUF9VViwgMSApICkueHk7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9OT1JNQUxNQVBcclxuXHJcblx0dk5vcm1hbE1hcFV2ID0gKCBub3JtYWxNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBOT1JNQUxNQVBfVVYsIDEgKSApLnh5O1xyXG5cclxuI2VuZGlmXHJcbiNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQXHJcblxyXG5cdHZEaXNwbGFjZW1lbnRNYXBVdiA9ICggZGlzcGxhY2VtZW50TWFwVHJhbnNmb3JtICogdmVjMyggRElTUExBQ0VNRU5UTUFQX1VWLCAxICkgKS54eTtcclxuXHJcbiNlbmRpZlxyXG4jaWZkZWYgVVNFX0VNSVNTSVZFTUFQXHJcblxyXG5cdHZFbWlzc2l2ZU1hcFV2ID0gKCBlbWlzc2l2ZU1hcFRyYW5zZm9ybSAqIHZlYzMoIEVNSVNTSVZFTUFQX1VWLCAxICkgKS54eTtcclxuXHJcbiNlbmRpZlxyXG4jaWZkZWYgVVNFX01FVEFMTkVTU01BUFxyXG5cclxuXHR2TWV0YWxuZXNzTWFwVXYgPSAoIG1ldGFsbmVzc01hcFRyYW5zZm9ybSAqIHZlYzMoIE1FVEFMTkVTU01BUF9VViwgMSApICkueHk7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9ST1VHSE5FU1NNQVBcclxuXHJcblx0dlJvdWdobmVzc01hcFV2ID0gKCByb3VnaG5lc3NNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBST1VHSE5FU1NNQVBfVVYsIDEgKSApLnh5O1xyXG5cclxuI2VuZGlmXHJcbiNpZmRlZiBVU0VfQU5JU09UUk9QWU1BUFxyXG5cclxuXHR2QW5pc290cm9weU1hcFV2ID0gKCBhbmlzb3Ryb3B5TWFwVHJhbnNmb3JtICogdmVjMyggQU5JU09UUk9QWU1BUF9VViwgMSApICkueHk7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9DTEVBUkNPQVRNQVBcclxuXHJcblx0dkNsZWFyY29hdE1hcFV2ID0gKCBjbGVhcmNvYXRNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBDTEVBUkNPQVRNQVBfVVYsIDEgKSApLnh5O1xyXG5cclxuI2VuZGlmXHJcbiNpZmRlZiBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUFxyXG5cclxuXHR2Q2xlYXJjb2F0Tm9ybWFsTWFwVXYgPSAoIGNsZWFyY29hdE5vcm1hbE1hcFRyYW5zZm9ybSAqIHZlYzMoIENMRUFSQ09BVF9OT1JNQUxNQVBfVVYsIDEgKSApLnh5O1xyXG5cclxuI2VuZGlmXHJcbiNpZmRlZiBVU0VfQ0xFQVJDT0FUX1JPVUdITkVTU01BUFxyXG5cclxuXHR2Q2xlYXJjb2F0Um91Z2huZXNzTWFwVXYgPSAoIGNsZWFyY29hdFJvdWdobmVzc01hcFRyYW5zZm9ybSAqIHZlYzMoIENMRUFSQ09BVF9ST1VHSE5FU1NNQVBfVVYsIDEgKSApLnh5O1xyXG5cclxuI2VuZGlmXHJcbiNpZmRlZiBVU0VfSVJJREVTQ0VOQ0VNQVBcclxuXHJcblx0dklyaWRlc2NlbmNlTWFwVXYgPSAoIGlyaWRlc2NlbmNlTWFwVHJhbnNmb3JtICogdmVjMyggSVJJREVTQ0VOQ0VNQVBfVVYsIDEgKSApLnh5O1xyXG5cclxuI2VuZGlmXHJcbiNpZmRlZiBVU0VfSVJJREVTQ0VOQ0VfVEhJQ0tORVNTTUFQXHJcblxyXG5cdHZJcmlkZXNjZW5jZVRoaWNrbmVzc01hcFV2ID0gKCBpcmlkZXNjZW5jZVRoaWNrbmVzc01hcFRyYW5zZm9ybSAqIHZlYzMoIElSSURFU0NFTkNFX1RISUNLTkVTU01BUF9VViwgMSApICkueHk7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9TSEVFTl9DT0xPUk1BUFxyXG5cclxuXHR2U2hlZW5Db2xvck1hcFV2ID0gKCBzaGVlbkNvbG9yTWFwVHJhbnNmb3JtICogdmVjMyggU0hFRU5fQ09MT1JNQVBfVVYsIDEgKSApLnh5O1xyXG5cclxuI2VuZGlmXHJcbiNpZmRlZiBVU0VfU0hFRU5fUk9VR0hORVNTTUFQXHJcblxyXG5cdHZTaGVlblJvdWdobmVzc01hcFV2ID0gKCBzaGVlblJvdWdobmVzc01hcFRyYW5zZm9ybSAqIHZlYzMoIFNIRUVOX1JPVUdITkVTU01BUF9VViwgMSApICkueHk7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9TUEVDVUxBUk1BUFxyXG5cclxuXHR2U3BlY3VsYXJNYXBVdiA9ICggc3BlY3VsYXJNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBTUEVDVUxBUk1BUF9VViwgMSApICkueHk7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9TUEVDVUxBUl9DT0xPUk1BUFxyXG5cclxuXHR2U3BlY3VsYXJDb2xvck1hcFV2ID0gKCBzcGVjdWxhckNvbG9yTWFwVHJhbnNmb3JtICogdmVjMyggU1BFQ1VMQVJfQ09MT1JNQVBfVVYsIDEgKSApLnh5O1xyXG5cclxuI2VuZGlmXHJcbiNpZmRlZiBVU0VfU1BFQ1VMQVJfSU5URU5TSVRZTUFQXHJcblxyXG5cdHZTcGVjdWxhckludGVuc2l0eU1hcFV2ID0gKCBzcGVjdWxhckludGVuc2l0eU1hcFRyYW5zZm9ybSAqIHZlYzMoIFNQRUNVTEFSX0lOVEVOU0lUWU1BUF9VViwgMSApICkueHk7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9UUkFOU01JU1NJT05NQVBcclxuXHJcblx0dlRyYW5zbWlzc2lvbk1hcFV2ID0gKCB0cmFuc21pc3Npb25NYXBUcmFuc2Zvcm0gKiB2ZWMzKCBUUkFOU01JU1NJT05NQVBfVVYsIDEgKSApLnh5O1xyXG5cclxuI2VuZGlmXHJcbiNpZmRlZiBVU0VfVEhJQ0tORVNTTUFQXHJcblxyXG5cdHZUaGlja25lc3NNYXBVdiA9ICggdGhpY2tuZXNzTWFwVHJhbnNmb3JtICogdmVjMyggVEhJQ0tORVNTTUFQX1VWLCAxICkgKS54eTtcclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApIHx8IGRlZmluZWQoIERJU1RBTkNFICkgfHwgZGVmaW5lZCAoIFVTRV9TSEFET1dNQVAgKSB8fCBkZWZpbmVkICggVVNFX1RSQU5TTUlTU0lPTiApIHx8IE5VTV9TUE9UX0xJR0hUX0NPT1JEUyA+IDBcclxuXHJcblx0dmVjNCB3b3JsZFBvc2l0aW9uID0gdmVjNCggdHJhbnNmb3JtZWQsIDEuMCApO1xyXG5cclxuXHQjaWZkZWYgVVNFX0JBVENISU5HXHJcblxyXG5cdFx0d29ybGRQb3NpdGlvbiA9IGJhdGNoaW5nTWF0cml4ICogd29ybGRQb3NpdGlvbjtcclxuXHJcblx0I2VuZGlmXHJcblxyXG5cdCNpZmRlZiBVU0VfSU5TVEFOQ0lOR1xyXG5cclxuXHRcdHdvcmxkUG9zaXRpb24gPSBpbnN0YW5jZU1hdHJpeCAqIHdvcmxkUG9zaXRpb247XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuXHR3b3JsZFBvc2l0aW9uID0gbW9kZWxNYXRyaXggKiB3b3JsZFBvc2l0aW9uO1xyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBjb25zdCB2ZXJ0ZXggPSAvKiBnbHNsICovYFxyXG52YXJ5aW5nIHZlYzIgdlV2O1xyXG51bmlmb3JtIG1hdDMgdXZUcmFuc2Zvcm07XHJcblxyXG52b2lkIG1haW4oKSB7XHJcblxyXG5cdHZVdiA9ICggdXZUcmFuc2Zvcm0gKiB2ZWMzKCB1diwgMSApICkueHk7XHJcblxyXG5cdGdsX1Bvc2l0aW9uID0gdmVjNCggcG9zaXRpb24ueHksIDEuMCwgMS4wICk7XHJcblxyXG59XHJcbmA7XHJcblxyXG5leHBvcnQgY29uc3QgZnJhZ21lbnQgPSAvKiBnbHNsICovYFxyXG51bmlmb3JtIHNhbXBsZXIyRCB0MkQ7XHJcbnVuaWZvcm0gZmxvYXQgYmFja2dyb3VuZEludGVuc2l0eTtcclxuXHJcbnZhcnlpbmcgdmVjMiB2VXY7XHJcblxyXG52b2lkIG1haW4oKSB7XHJcblxyXG5cdHZlYzQgdGV4Q29sb3IgPSB0ZXh0dXJlMkQoIHQyRCwgdlV2ICk7XHJcblxyXG5cdCNpZmRlZiBERUNPREVfVklERU9fVEVYVFVSRVxyXG5cclxuXHRcdC8vIHVzZSBpbmxpbmUgc1JHQiBkZWNvZGUgdW50aWwgYnJvd3NlcnMgcHJvcGVybHkgc3VwcG9ydCBTUkdCOF9BUExIQTggd2l0aCB2aWRlbyB0ZXh0dXJlc1xyXG5cclxuXHRcdHRleENvbG9yID0gdmVjNCggbWl4KCBwb3coIHRleENvbG9yLnJnYiAqIDAuOTQ3ODY3Mjk4NiArIHZlYzMoIDAuMDUyMTMyNzAxNCApLCB2ZWMzKCAyLjQgKSApLCB0ZXhDb2xvci5yZ2IgKiAwLjA3NzM5OTM4MDgsIHZlYzMoIGxlc3NUaGFuRXF1YWwoIHRleENvbG9yLnJnYiwgdmVjMyggMC4wNDA0NSApICkgKSApLCB0ZXhDb2xvci53ICk7XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuXHR0ZXhDb2xvci5yZ2IgKj0gYmFja2dyb3VuZEludGVuc2l0eTtcclxuXHJcblx0Z2xfRnJhZ0NvbG9yID0gdGV4Q29sb3I7XHJcblxyXG5cdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8Y29sb3JzcGFjZV9mcmFnbWVudD5cclxuXHJcbn1cclxuYDtcclxuIiwiZXhwb3J0IGNvbnN0IHZlcnRleCA9IC8qIGdsc2wgKi9gXHJcbnZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247XHJcblxyXG4jaW5jbHVkZSA8Y29tbW9uPlxyXG5cclxudm9pZCBtYWluKCkge1xyXG5cclxuXHR2V29ybGREaXJlY3Rpb24gPSB0cmFuc2Zvcm1EaXJlY3Rpb24oIHBvc2l0aW9uLCBtb2RlbE1hdHJpeCApO1xyXG5cclxuXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cclxuXHJcblx0Z2xfUG9zaXRpb24ueiA9IGdsX1Bvc2l0aW9uLnc7IC8vIHNldCB6IHRvIGNhbWVyYS5mYXJcclxuXHJcbn1cclxuYDtcclxuXHJcbmV4cG9ydCBjb25zdCBmcmFnbWVudCA9IC8qIGdsc2wgKi9gXHJcblxyXG4jaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRVxyXG5cclxuXHR1bmlmb3JtIHNhbXBsZXJDdWJlIGVudk1hcDtcclxuXHJcbiNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0NVQkVfVVYgKVxyXG5cclxuXHR1bmlmb3JtIHNhbXBsZXIyRCBlbnZNYXA7XHJcblxyXG4jZW5kaWZcclxuXHJcbnVuaWZvcm0gZmxvYXQgZmxpcEVudk1hcDtcclxudW5pZm9ybSBmbG9hdCBiYWNrZ3JvdW5kQmx1cnJpbmVzcztcclxudW5pZm9ybSBmbG9hdCBiYWNrZ3JvdW5kSW50ZW5zaXR5O1xyXG51bmlmb3JtIG1hdDMgYmFja2dyb3VuZFJvdGF0aW9uO1xyXG5cclxudmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcclxuXHJcbiNpbmNsdWRlIDxjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQ+XHJcblxyXG52b2lkIG1haW4oKSB7XHJcblxyXG5cdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXHJcblxyXG5cdFx0dmVjNCB0ZXhDb2xvciA9IHRleHR1cmVDdWJlKCBlbnZNYXAsIGJhY2tncm91bmRSb3RhdGlvbiAqIHZlYzMoIGZsaXBFbnZNYXAgKiB2V29ybGREaXJlY3Rpb24ueCwgdldvcmxkRGlyZWN0aW9uLnl6ICkgKTtcclxuXHJcblx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX1RZUEVfQ1VCRV9VViApXHJcblxyXG5cdFx0dmVjNCB0ZXhDb2xvciA9IHRleHR1cmVDdWJlVVYoIGVudk1hcCwgYmFja2dyb3VuZFJvdGF0aW9uICogdldvcmxkRGlyZWN0aW9uLCBiYWNrZ3JvdW5kQmx1cnJpbmVzcyApO1xyXG5cclxuXHQjZWxzZVxyXG5cclxuXHRcdHZlYzQgdGV4Q29sb3IgPSB2ZWM0KCAwLjAsIDAuMCwgMC4wLCAxLjAgKTtcclxuXHJcblx0I2VuZGlmXHJcblxyXG5cdHRleENvbG9yLnJnYiAqPSBiYWNrZ3JvdW5kSW50ZW5zaXR5O1xyXG5cclxuXHRnbF9GcmFnQ29sb3IgPSB0ZXhDb2xvcjtcclxuXHJcblx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxjb2xvcnNwYWNlX2ZyYWdtZW50PlxyXG5cclxufVxyXG5gO1xyXG4iLCJleHBvcnQgY29uc3QgdmVydGV4ID0gLyogZ2xzbCAqL2BcclxudmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcclxuXHJcbiNpbmNsdWRlIDxjb21tb24+XHJcblxyXG52b2lkIG1haW4oKSB7XHJcblxyXG5cdHZXb3JsZERpcmVjdGlvbiA9IHRyYW5zZm9ybURpcmVjdGlvbiggcG9zaXRpb24sIG1vZGVsTWF0cml4ICk7XHJcblxyXG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxyXG5cclxuXHRnbF9Qb3NpdGlvbi56ID0gZ2xfUG9zaXRpb24udzsgLy8gc2V0IHogdG8gY2FtZXJhLmZhclxyXG5cclxufVxyXG5gO1xyXG5cclxuZXhwb3J0IGNvbnN0IGZyYWdtZW50ID0gLyogZ2xzbCAqL2BcclxudW5pZm9ybSBzYW1wbGVyQ3ViZSB0Q3ViZTtcclxudW5pZm9ybSBmbG9hdCB0RmxpcDtcclxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xyXG5cclxudmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcclxuXHJcbnZvaWQgbWFpbigpIHtcclxuXHJcblx0dmVjNCB0ZXhDb2xvciA9IHRleHR1cmVDdWJlKCB0Q3ViZSwgdmVjMyggdEZsaXAgKiB2V29ybGREaXJlY3Rpb24ueCwgdldvcmxkRGlyZWN0aW9uLnl6ICkgKTtcclxuXHJcblx0Z2xfRnJhZ0NvbG9yID0gdGV4Q29sb3I7XHJcblx0Z2xfRnJhZ0NvbG9yLmEgKj0gb3BhY2l0eTtcclxuXHJcblx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxjb2xvcnNwYWNlX2ZyYWdtZW50PlxyXG5cclxufVxyXG5gO1xyXG4iLCJleHBvcnQgY29uc3QgdmVydGV4ID0gLyogZ2xzbCAqL2BcclxuI2luY2x1ZGUgPGNvbW1vbj5cclxuI2luY2x1ZGUgPGJhdGNoaW5nX3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XHJcblxyXG4vLyBUaGlzIGlzIHVzZWQgZm9yIGNvbXB1dGluZyBhbiBlcXVpdmFsZW50IG9mIGdsX0ZyYWdDb29yZC56IHRoYXQgaXMgYXMgaGlnaCBwcmVjaXNpb24gYXMgcG9zc2libGUuXHJcbi8vIFNvbWUgcGxhdGZvcm1zIGNvbXB1dGUgZ2xfRnJhZ0Nvb3JkIGF0IGEgbG93ZXIgcHJlY2lzaW9uIHdoaWNoIG1ha2VzIHRoZSBtYW51YWxseSBjb21wdXRlZCB2YWx1ZSBiZXR0ZXIgZm9yXHJcbi8vIGRlcHRoLWJhc2VkIHBvc3Rwcm9jZXNzaW5nIGVmZmVjdHMuIFJlcHJvZHVjZWQgb24gaVBhZCB3aXRoIEExMCBwcm9jZXNzb3IgLyBpUGFkT1MgMTMuMy4xLlxyXG52YXJ5aW5nIHZlYzIgdkhpZ2hQcmVjaXNpb25aVztcclxuXHJcbnZvaWQgbWFpbigpIHtcclxuXHJcblx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cclxuXHJcblx0I2luY2x1ZGUgPGJhdGNoaW5nX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxyXG5cclxuXHQjaW5jbHVkZSA8bW9ycGhpbnN0YW5jZV92ZXJ0ZXg+XHJcblxyXG5cdCNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQXHJcblxyXG5cdFx0I2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD5cclxuXHRcdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XHJcblx0XHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cclxuXHJcblx0dkhpZ2hQcmVjaXNpb25aVyA9IGdsX1Bvc2l0aW9uLnp3O1xyXG5cclxufVxyXG5gO1xyXG5cclxuZXhwb3J0IGNvbnN0IGZyYWdtZW50ID0gLyogZ2xzbCAqL2BcclxuI2lmIERFUFRIX1BBQ0tJTkcgPT0gMzIwMFxyXG5cclxuXHR1bmlmb3JtIGZsb2F0IG9wYWNpdHk7XHJcblxyXG4jZW5kaWZcclxuXHJcbiNpbmNsdWRlIDxjb21tb24+XHJcbiNpbmNsdWRlIDxwYWNraW5nPlxyXG4jaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGFscGhhdGVzdF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8YWxwaGFoYXNoX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XHJcblxyXG52YXJ5aW5nIHZlYzIgdkhpZ2hQcmVjaXNpb25aVztcclxuXHJcbnZvaWQgbWFpbigpIHtcclxuXHJcblx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCAxLjAgKTtcclxuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxyXG5cclxuXHQjaWYgREVQVEhfUEFDS0lORyA9PSAzMjAwXHJcblxyXG5cdFx0ZGlmZnVzZUNvbG9yLmEgPSBvcGFjaXR5O1xyXG5cclxuXHQjZW5kaWZcclxuXHJcblx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8YWxwaGFoYXNoX2ZyYWdtZW50PlxyXG5cclxuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XHJcblxyXG5cdC8vIEhpZ2hlciBwcmVjaXNpb24gZXF1aXZhbGVudCBvZiBnbF9GcmFnQ29vcmQuei4gVGhpcyBhc3N1bWVzIGRlcHRoUmFuZ2UgaGFzIGJlZW4gbGVmdCB0byBpdHMgZGVmYXVsdCB2YWx1ZXMuXHJcblx0ZmxvYXQgZnJhZ0Nvb3JkWiA9IDAuNSAqIHZIaWdoUHJlY2lzaW9uWldbMF0gLyB2SGlnaFByZWNpc2lvblpXWzFdICsgMC41O1xyXG5cclxuXHQjaWYgREVQVEhfUEFDS0lORyA9PSAzMjAwXHJcblxyXG5cdFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggdmVjMyggMS4wIC0gZnJhZ0Nvb3JkWiApLCBvcGFjaXR5ICk7XHJcblxyXG5cdCNlbGlmIERFUFRIX1BBQ0tJTkcgPT0gMzIwMVxyXG5cclxuXHRcdGdsX0ZyYWdDb2xvciA9IHBhY2tEZXB0aFRvUkdCQSggZnJhZ0Nvb3JkWiApO1xyXG5cclxuXHQjZWxpZiBERVBUSF9QQUNLSU5HID09IDMyMDJcclxuXHJcblx0XHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBwYWNrRGVwdGhUb1JHQiggZnJhZ0Nvb3JkWiApLCAxLjAgKTtcclxuXHJcblx0I2VsaWYgREVQVEhfUEFDS0lORyA9PSAzMjAzXHJcblxyXG5cdFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggcGFja0RlcHRoVG9SRyggZnJhZ0Nvb3JkWiApLCAwLjAsIDEuMCApO1xyXG5cclxuXHQjZW5kaWZcclxuXHJcbn1cclxuYDtcclxuIiwiZXhwb3J0IGNvbnN0IHZlcnRleCA9IC8qIGdsc2wgKi9gXHJcbiNkZWZpbmUgRElTVEFOQ0VcclxuXHJcbnZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcclxuXHJcbiNpbmNsdWRlIDxjb21tb24+XHJcbiNpbmNsdWRlIDxiYXRjaGluZ19wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cclxuXHJcbnZvaWQgbWFpbigpIHtcclxuXHJcblx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cclxuXHJcblx0I2luY2x1ZGUgPGJhdGNoaW5nX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxyXG5cclxuXHQjaW5jbHVkZSA8bW9ycGhpbnN0YW5jZV92ZXJ0ZXg+XHJcblxyXG5cdCNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQXHJcblxyXG5cdFx0I2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD5cclxuXHRcdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XHJcblx0XHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cclxuXHJcblx0dldvcmxkUG9zaXRpb24gPSB3b3JsZFBvc2l0aW9uLnh5ejtcclxuXHJcbn1cclxuYDtcclxuXHJcbmV4cG9ydCBjb25zdCBmcmFnbWVudCA9IC8qIGdsc2wgKi9gXHJcbiNkZWZpbmUgRElTVEFOQ0VcclxuXHJcbnVuaWZvcm0gdmVjMyByZWZlcmVuY2VQb3NpdGlvbjtcclxudW5pZm9ybSBmbG9hdCBuZWFyRGlzdGFuY2U7XHJcbnVuaWZvcm0gZmxvYXQgZmFyRGlzdGFuY2U7XHJcbnZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcclxuXHJcbiNpbmNsdWRlIDxjb21tb24+XHJcbiNpbmNsdWRlIDxwYWNraW5nPlxyXG4jaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGFscGhhdGVzdF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8YWxwaGFoYXNoX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cclxuXHJcbnZvaWQgbWFpbiAoKSB7XHJcblxyXG5cdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggMS4wICk7XHJcblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cclxuXHJcblx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8YWxwaGFoYXNoX2ZyYWdtZW50PlxyXG5cclxuXHRmbG9hdCBkaXN0ID0gbGVuZ3RoKCB2V29ybGRQb3NpdGlvbiAtIHJlZmVyZW5jZVBvc2l0aW9uICk7XHJcblx0ZGlzdCA9ICggZGlzdCAtIG5lYXJEaXN0YW5jZSApIC8gKCBmYXJEaXN0YW5jZSAtIG5lYXJEaXN0YW5jZSApO1xyXG5cdGRpc3QgPSBzYXR1cmF0ZSggZGlzdCApOyAvLyBjbGFtcCB0byBbIDAsIDEgXVxyXG5cclxuXHRnbF9GcmFnQ29sb3IgPSBwYWNrRGVwdGhUb1JHQkEoIGRpc3QgKTtcclxuXHJcbn1cclxuYDtcclxuIiwiZXhwb3J0IGNvbnN0IHZlcnRleCA9IC8qIGdsc2wgKi9gXHJcbnZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247XHJcblxyXG4jaW5jbHVkZSA8Y29tbW9uPlxyXG5cclxudm9pZCBtYWluKCkge1xyXG5cclxuXHR2V29ybGREaXJlY3Rpb24gPSB0cmFuc2Zvcm1EaXJlY3Rpb24oIHBvc2l0aW9uLCBtb2RlbE1hdHJpeCApO1xyXG5cclxuXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cclxuXHJcbn1cclxuYDtcclxuXHJcbmV4cG9ydCBjb25zdCBmcmFnbWVudCA9IC8qIGdsc2wgKi9gXHJcbnVuaWZvcm0gc2FtcGxlcjJEIHRFcXVpcmVjdDtcclxuXHJcbnZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247XHJcblxyXG4jaW5jbHVkZSA8Y29tbW9uPlxyXG5cclxudm9pZCBtYWluKCkge1xyXG5cclxuXHR2ZWMzIGRpcmVjdGlvbiA9IG5vcm1hbGl6ZSggdldvcmxkRGlyZWN0aW9uICk7XHJcblxyXG5cdHZlYzIgc2FtcGxlVVYgPSBlcXVpcmVjdFV2KCBkaXJlY3Rpb24gKTtcclxuXHJcblx0Z2xfRnJhZ0NvbG9yID0gdGV4dHVyZTJEKCB0RXF1aXJlY3QsIHNhbXBsZVVWICk7XHJcblxyXG5cdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8Y29sb3JzcGFjZV9mcmFnbWVudD5cclxuXHJcbn1cclxuYDtcclxuIiwiZXhwb3J0IGNvbnN0IHZlcnRleCA9IC8qIGdsc2wgKi9gXHJcbnVuaWZvcm0gZmxvYXQgc2NhbGU7XHJcbmF0dHJpYnV0ZSBmbG9hdCBsaW5lRGlzdGFuY2U7XHJcblxyXG52YXJ5aW5nIGZsb2F0IHZMaW5lRGlzdGFuY2U7XHJcblxyXG4jaW5jbHVkZSA8Y29tbW9uPlxyXG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XHJcblxyXG52b2lkIG1haW4oKSB7XHJcblxyXG5cdHZMaW5lRGlzdGFuY2UgPSBzY2FsZSAqIGxpbmVEaXN0YW5jZTtcclxuXHJcblx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxtb3JwaGluc3RhbmNlX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8bW9ycGhjb2xvcl92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxmb2dfdmVydGV4PlxyXG5cclxufVxyXG5gO1xyXG5cclxuZXhwb3J0IGNvbnN0IGZyYWdtZW50ID0gLyogZ2xzbCAqL2BcclxudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XHJcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcclxuXHJcbnVuaWZvcm0gZmxvYXQgZGFzaFNpemU7XHJcbnVuaWZvcm0gZmxvYXQgdG90YWxTaXplO1xyXG5cclxudmFyeWluZyBmbG9hdCB2TGluZURpc3RhbmNlO1xyXG5cclxuI2luY2x1ZGUgPGNvbW1vbj5cclxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cclxuXHJcbnZvaWQgbWFpbigpIHtcclxuXHJcblx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XHJcblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cclxuXHJcblx0aWYgKCBtb2QoIHZMaW5lRGlzdGFuY2UsIHRvdGFsU2l6ZSApID4gZGFzaFNpemUgKSB7XHJcblxyXG5cdFx0ZGlzY2FyZDtcclxuXHJcblx0fVxyXG5cclxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSB2ZWMzKCAwLjAgKTtcclxuXHJcblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PlxyXG5cclxuXHRvdXRnb2luZ0xpZ2h0ID0gZGlmZnVzZUNvbG9yLnJnYjsgLy8gc2ltcGxlIHNoYWRlclxyXG5cclxuXHQjaW5jbHVkZSA8b3BhcXVlX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8Y29sb3JzcGFjZV9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PlxyXG5cclxufVxyXG5gO1xyXG4iLCJleHBvcnQgY29uc3QgdmVydGV4ID0gLyogZ2xzbCAqL2BcclxuI2luY2x1ZGUgPGNvbW1vbj5cclxuI2luY2x1ZGUgPGJhdGNoaW5nX3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxlbnZtYXBfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cclxuXHJcbnZvaWQgbWFpbigpIHtcclxuXHJcblx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxtb3JwaGluc3RhbmNlX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8bW9ycGhjb2xvcl92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPGJhdGNoaW5nX3ZlcnRleD5cclxuXHJcblx0I2lmIGRlZmluZWQgKCBVU0VfRU5WTUFQICkgfHwgZGVmaW5lZCAoIFVTRV9TS0lOTklORyApXHJcblxyXG5cdFx0I2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD5cclxuXHRcdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XHJcblx0XHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxyXG5cdFx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxyXG5cdFx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxyXG5cclxuXHQjZW5kaWZcclxuXHJcblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XHJcblxyXG5cdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPGVudm1hcF92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XHJcblxyXG59XHJcbmA7XHJcblxyXG5leHBvcnQgY29uc3QgZnJhZ21lbnQgPSAvKiBnbHNsICovYFxyXG51bmlmb3JtIHZlYzMgZGlmZnVzZTtcclxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xyXG5cclxuI2lmbmRlZiBGTEFUX1NIQURFRFxyXG5cclxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcclxuXHJcbiNlbmRpZlxyXG5cclxuI2luY2x1ZGUgPGNvbW1vbj5cclxuI2luY2x1ZGUgPGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxhbHBoYXRlc3RfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGFscGhhaGFzaF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxlbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxlbnZtYXBfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8c3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cclxuXHJcbnZvaWQgbWFpbigpIHtcclxuXHJcblx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XHJcblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cclxuXHJcblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxhbHBoYWhhc2hfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPHNwZWN1bGFybWFwX2ZyYWdtZW50PlxyXG5cclxuXHRSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCA9IFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApO1xyXG5cclxuXHQvLyBhY2N1bXVsYXRpb24gKGJha2VkIGluZGlyZWN0IGxpZ2h0aW5nIG9ubHkpXHJcblx0I2lmZGVmIFVTRV9MSUdIVE1BUFxyXG5cclxuXHRcdHZlYzQgbGlnaHRNYXBUZXhlbCA9IHRleHR1cmUyRCggbGlnaHRNYXAsIHZMaWdodE1hcFV2ICk7XHJcblx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gbGlnaHRNYXBUZXhlbC5yZ2IgKiBsaWdodE1hcEludGVuc2l0eSAqIFJFQ0lQUk9DQUxfUEk7XHJcblxyXG5cdCNlbHNlXHJcblxyXG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IHZlYzMoIDEuMCApO1xyXG5cclxuXHQjZW5kaWZcclxuXHJcblx0Ly8gbW9kdWxhdGlvblxyXG5cdCNpbmNsdWRlIDxhb21hcF9mcmFnbWVudD5cclxuXHJcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICo9IGRpZmZ1c2VDb2xvci5yZ2I7XHJcblxyXG5cdHZlYzMgb3V0Z29pbmdMaWdodCA9IHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZTtcclxuXHJcblx0I2luY2x1ZGUgPGVudm1hcF9mcmFnbWVudD5cclxuXHJcblx0I2luY2x1ZGUgPG9wYXF1ZV9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPGNvbG9yc3BhY2VfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50PlxyXG5cclxufVxyXG5gO1xyXG4iLCJleHBvcnQgY29uc3QgdmVydGV4ID0gLyogZ2xzbCAqL2BcclxuI2RlZmluZSBMQU1CRVJUXHJcblxyXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcclxuXHJcbiNpbmNsdWRlIDxjb21tb24+XHJcbiNpbmNsdWRlIDxiYXRjaGluZ19wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxub3JtYWxfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XHJcblxyXG52b2lkIG1haW4oKSB7XHJcblxyXG5cdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8bW9ycGhpbnN0YW5jZV92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPG1vcnBoY29sb3JfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxiYXRjaGluZ192ZXJ0ZXg+XHJcblxyXG5cdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPG5vcm1hbF92ZXJ0ZXg+XHJcblxyXG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxyXG5cclxuXHR2Vmlld1Bvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejtcclxuXHJcblx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8ZW52bWFwX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8c2hhZG93bWFwX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cclxuXHJcbn1cclxuYDtcclxuXHJcbmV4cG9ydCBjb25zdCBmcmFnbWVudCA9IC8qIGdsc2wgKi9gXHJcbiNkZWZpbmUgTEFNQkVSVFxyXG5cclxudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XHJcbnVuaWZvcm0gdmVjMyBlbWlzc2l2ZTtcclxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xyXG5cclxuI2luY2x1ZGUgPGNvbW1vbj5cclxuI2luY2x1ZGUgPHBhY2tpbmc+XHJcbiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8YWxwaGF0ZXN0X3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxhbHBoYWhhc2hfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGFvbWFwX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxsaWdodG1hcF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGVudm1hcF9jb21tb25fcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxic2Rmcz5cclxuI2luY2x1ZGUgPGxpZ2h0c19wYXJzX2JlZ2luPlxyXG4jaW5jbHVkZSA8bm9ybWFsX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxsaWdodHNfbGFtYmVydF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxidW1wbWFwX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XHJcblxyXG52b2lkIG1haW4oKSB7XHJcblxyXG5cdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xyXG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XHJcblxyXG5cdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ID0gUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XHJcblx0dmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgPSBlbWlzc2l2ZTtcclxuXHJcblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxhbHBoYWhhc2hfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPHNwZWN1bGFybWFwX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfYmVnaW4+XHJcblx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9tYXBzPlxyXG5cdCNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9mcmFnbWVudD5cclxuXHJcblx0Ly8gYWNjdW11bGF0aW9uXHJcblx0I2luY2x1ZGUgPGxpZ2h0c19sYW1iZXJ0X2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfYmVnaW4+XHJcblx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9tYXBzPlxyXG5cdCNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfZW5kPlxyXG5cclxuXHQvLyBtb2R1bGF0aW9uXHJcblx0I2luY2x1ZGUgPGFvbWFwX2ZyYWdtZW50PlxyXG5cclxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlO1xyXG5cclxuXHQjaW5jbHVkZSA8ZW52bWFwX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxvcGFxdWVfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxjb2xvcnNwYWNlX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD5cclxuXHJcbn1cclxuYDtcclxuIiwiZXhwb3J0IGNvbnN0IHZlcnRleCA9IC8qIGdsc2wgKi9gXHJcbiNkZWZpbmUgTUFUQ0FQXHJcblxyXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcclxuXHJcbiNpbmNsdWRlIDxjb21tb24+XHJcbiNpbmNsdWRlIDxiYXRjaGluZ19wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxub3JtYWxfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxyXG5cclxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PlxyXG5cclxudm9pZCBtYWluKCkge1xyXG5cclxuXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPG1vcnBoaW5zdGFuY2VfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxtb3JwaGNvbG9yX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8YmF0Y2hpbmdfdmVydGV4PlxyXG5cclxuXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxub3JtYWxfdmVydGV4PlxyXG5cclxuXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XHJcblxyXG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XHJcblxyXG5cdHZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6O1xyXG5cclxufVxyXG5gO1xyXG5cclxuZXhwb3J0IGNvbnN0IGZyYWdtZW50ID0gLyogZ2xzbCAqL2BcclxuI2RlZmluZSBNQVRDQVBcclxuXHJcbnVuaWZvcm0gdmVjMyBkaWZmdXNlO1xyXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XHJcbnVuaWZvcm0gc2FtcGxlcjJEIG1hdGNhcDtcclxuXHJcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xyXG5cclxuI2luY2x1ZGUgPGNvbW1vbj5cclxuI2luY2x1ZGUgPGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxhbHBoYXRlc3RfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGFscGhhaGFzaF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxub3JtYWxfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGJ1bXBtYXBfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxyXG5cclxudm9pZCBtYWluKCkge1xyXG5cclxuXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcclxuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxyXG5cclxuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPGFscGhhaGFzaF9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X2JlZ2luPlxyXG5cdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfbWFwcz5cclxuXHJcblx0dmVjMyB2aWV3RGlyID0gbm9ybWFsaXplKCB2Vmlld1Bvc2l0aW9uICk7XHJcblx0dmVjMyB4ID0gbm9ybWFsaXplKCB2ZWMzKCB2aWV3RGlyLnosIDAuMCwgLSB2aWV3RGlyLnggKSApO1xyXG5cdHZlYzMgeSA9IGNyb3NzKCB2aWV3RGlyLCB4ICk7XHJcblx0dmVjMiB1diA9IHZlYzIoIGRvdCggeCwgbm9ybWFsICksIGRvdCggeSwgbm9ybWFsICkgKSAqIDAuNDk1ICsgMC41OyAvLyAwLjQ5NSB0byByZW1vdmUgYXJ0aWZhY3RzIGNhdXNlZCBieSB1bmRlcnNpemVkIG1hdGNhcCBkaXNrc1xyXG5cclxuXHQjaWZkZWYgVVNFX01BVENBUFxyXG5cclxuXHRcdHZlYzQgbWF0Y2FwQ29sb3IgPSB0ZXh0dXJlMkQoIG1hdGNhcCwgdXYgKTtcclxuXHJcblx0I2Vsc2VcclxuXHJcblx0XHR2ZWM0IG1hdGNhcENvbG9yID0gdmVjNCggdmVjMyggbWl4KCAwLjIsIDAuOCwgdXYueSApICksIDEuMCApOyAvLyBkZWZhdWx0IGlmIG1hdGNhcCBpcyBtaXNzaW5nXHJcblxyXG5cdCNlbmRpZlxyXG5cclxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSBkaWZmdXNlQ29sb3IucmdiICogbWF0Y2FwQ29sb3IucmdiO1xyXG5cclxuXHQjaW5jbHVkZSA8b3BhcXVlX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8Y29sb3JzcGFjZV9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+XHJcblxyXG59XHJcbmA7XHJcbiIsImV4cG9ydCBjb25zdCB2ZXJ0ZXggPSAvKiBnbHNsICovYFxyXG4jZGVmaW5lIE5PUk1BTFxyXG5cclxuI2lmIGRlZmluZWQoIEZMQVRfU0hBREVEICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQX1RBTkdFTlRTUEFDRSApXHJcblxyXG5cdHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xyXG5cclxuI2VuZGlmXHJcblxyXG4jaW5jbHVkZSA8Y29tbW9uPlxyXG4jaW5jbHVkZSA8YmF0Y2hpbmdfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPG5vcm1hbF9wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cclxuXHJcbnZvaWQgbWFpbigpIHtcclxuXHJcblx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8YmF0Y2hpbmdfdmVydGV4PlxyXG5cclxuXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxtb3JwaGluc3RhbmNlX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8bm9ybWFsX3ZlcnRleD5cclxuXHJcblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XHJcblxyXG4jaWYgZGVmaW5lZCggRkxBVF9TSEFERUQgKSB8fCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVBfVEFOR0VOVFNQQUNFIClcclxuXHJcblx0dlZpZXdQb3NpdGlvbiA9IC0gbXZQb3NpdGlvbi54eXo7XHJcblxyXG4jZW5kaWZcclxuXHJcbn1cclxuYDtcclxuXHJcbmV4cG9ydCBjb25zdCBmcmFnbWVudCA9IC8qIGdsc2wgKi9gXHJcbiNkZWZpbmUgTk9STUFMXHJcblxyXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XHJcblxyXG4jaWYgZGVmaW5lZCggRkxBVF9TSEFERUQgKSB8fCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVBfVEFOR0VOVFNQQUNFIClcclxuXHJcblx0dmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XHJcblxyXG4jZW5kaWZcclxuXHJcbiNpbmNsdWRlIDxwYWNraW5nPlxyXG4jaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPG5vcm1hbF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8YnVtcG1hcF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8bm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XHJcblxyXG52b2lkIG1haW4oKSB7XHJcblxyXG5cdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggMC4wLCAwLjAsIDAuMCwgb3BhY2l0eSApO1xyXG5cclxuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X2JlZ2luPlxyXG5cdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfbWFwcz5cclxuXHJcblx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggcGFja05vcm1hbFRvUkdCKCBub3JtYWwgKSwgZGlmZnVzZUNvbG9yLmEgKTtcclxuXHJcblx0I2lmZGVmIE9QQVFVRVxyXG5cclxuXHRcdGdsX0ZyYWdDb2xvci5hID0gMS4wO1xyXG5cclxuXHQjZW5kaWZcclxuXHJcbn1cclxuYDtcclxuIiwiZXhwb3J0IGNvbnN0IHZlcnRleCA9IC8qIGdsc2wgKi9gXHJcbiNkZWZpbmUgUEhPTkdcclxuXHJcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xyXG5cclxuI2luY2x1ZGUgPGNvbW1vbj5cclxuI2luY2x1ZGUgPGJhdGNoaW5nX3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxlbnZtYXBfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPG5vcm1hbF9wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cclxuXHJcbnZvaWQgbWFpbigpIHtcclxuXHJcblx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxtb3JwaGNvbG9yX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8YmF0Y2hpbmdfdmVydGV4PlxyXG5cclxuXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxtb3JwaGluc3RhbmNlX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8bm9ybWFsX3ZlcnRleD5cclxuXHJcblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XHJcblxyXG5cdHZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6O1xyXG5cclxuXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxlbnZtYXBfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxzaGFkb3dtYXBfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxmb2dfdmVydGV4PlxyXG5cclxufVxyXG5gO1xyXG5cclxuZXhwb3J0IGNvbnN0IGZyYWdtZW50ID0gLyogZ2xzbCAqL2BcclxuI2RlZmluZSBQSE9OR1xyXG5cclxudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XHJcbnVuaWZvcm0gdmVjMyBlbWlzc2l2ZTtcclxudW5pZm9ybSB2ZWMzIHNwZWN1bGFyO1xyXG51bmlmb3JtIGZsb2F0IHNoaW5pbmVzcztcclxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xyXG5cclxuI2luY2x1ZGUgPGNvbW1vbj5cclxuI2luY2x1ZGUgPHBhY2tpbmc+XHJcbiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8YWxwaGF0ZXN0X3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxhbHBoYWhhc2hfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGFvbWFwX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxsaWdodG1hcF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGVudm1hcF9jb21tb25fcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxic2Rmcz5cclxuI2luY2x1ZGUgPGxpZ2h0c19wYXJzX2JlZ2luPlxyXG4jaW5jbHVkZSA8bm9ybWFsX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxsaWdodHNfcGhvbmdfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8YnVtcG1hcF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8bm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxyXG5cclxudm9pZCBtYWluKCkge1xyXG5cclxuXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcclxuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxyXG5cclxuXHRSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCA9IFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApO1xyXG5cdHZlYzMgdG90YWxFbWlzc2l2ZVJhZGlhbmNlID0gZW1pc3NpdmU7XHJcblxyXG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8YWxwaGFoYXNoX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxzcGVjdWxhcm1hcF9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X2JlZ2luPlxyXG5cdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfbWFwcz5cclxuXHQjaW5jbHVkZSA8ZW1pc3NpdmVtYXBfZnJhZ21lbnQ+XHJcblxyXG5cdC8vIGFjY3VtdWxhdGlvblxyXG5cdCNpbmNsdWRlIDxsaWdodHNfcGhvbmdfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9iZWdpbj5cclxuXHQjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X21hcHM+XHJcblx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9lbmQ+XHJcblxyXG5cdC8vIG1vZHVsYXRpb25cclxuXHQjaW5jbHVkZSA8YW9tYXBfZnJhZ21lbnQ+XHJcblxyXG5cdHZlYzMgb3V0Z29pbmdMaWdodCA9IHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7XHJcblxyXG5cdCNpbmNsdWRlIDxlbnZtYXBfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPG9wYXF1ZV9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPGNvbG9yc3BhY2VfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50PlxyXG5cclxufVxyXG5gO1xyXG4iLCJleHBvcnQgY29uc3QgdmVydGV4ID0gLyogZ2xzbCAqL2BcclxuI2RlZmluZSBTVEFOREFSRFxyXG5cclxudmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XHJcblxyXG4jaWZkZWYgVVNFX1RSQU5TTUlTU0lPTlxyXG5cclxuXHR2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XHJcblxyXG4jZW5kaWZcclxuXHJcbiNpbmNsdWRlIDxjb21tb24+XHJcbiNpbmNsdWRlIDxiYXRjaGluZ19wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxub3JtYWxfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XHJcblxyXG52b2lkIG1haW4oKSB7XHJcblxyXG5cdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8bW9ycGhpbnN0YW5jZV92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPG1vcnBoY29sb3JfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxiYXRjaGluZ192ZXJ0ZXg+XHJcblxyXG5cdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPG5vcm1hbF92ZXJ0ZXg+XHJcblxyXG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxyXG5cclxuXHR2Vmlld1Bvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejtcclxuXHJcblx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8c2hhZG93bWFwX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cclxuXHJcbiNpZmRlZiBVU0VfVFJBTlNNSVNTSU9OXHJcblxyXG5cdHZXb3JsZFBvc2l0aW9uID0gd29ybGRQb3NpdGlvbi54eXo7XHJcblxyXG4jZW5kaWZcclxufVxyXG5gO1xyXG5cclxuZXhwb3J0IGNvbnN0IGZyYWdtZW50ID0gLyogZ2xzbCAqL2BcclxuI2RlZmluZSBTVEFOREFSRFxyXG5cclxuI2lmZGVmIFBIWVNJQ0FMXHJcblx0I2RlZmluZSBJT1JcclxuXHQjZGVmaW5lIFVTRV9TUEVDVUxBUlxyXG4jZW5kaWZcclxuXHJcbnVuaWZvcm0gdmVjMyBkaWZmdXNlO1xyXG51bmlmb3JtIHZlYzMgZW1pc3NpdmU7XHJcbnVuaWZvcm0gZmxvYXQgcm91Z2huZXNzO1xyXG51bmlmb3JtIGZsb2F0IG1ldGFsbmVzcztcclxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xyXG5cclxuI2lmZGVmIElPUlxyXG5cdHVuaWZvcm0gZmxvYXQgaW9yO1xyXG4jZW5kaWZcclxuXHJcbiNpZmRlZiBVU0VfU1BFQ1VMQVJcclxuXHR1bmlmb3JtIGZsb2F0IHNwZWN1bGFySW50ZW5zaXR5O1xyXG5cdHVuaWZvcm0gdmVjMyBzcGVjdWxhckNvbG9yO1xyXG5cclxuXHQjaWZkZWYgVVNFX1NQRUNVTEFSX0NPTE9STUFQXHJcblx0XHR1bmlmb3JtIHNhbXBsZXIyRCBzcGVjdWxhckNvbG9yTWFwO1xyXG5cdCNlbmRpZlxyXG5cclxuXHQjaWZkZWYgVVNFX1NQRUNVTEFSX0lOVEVOU0lUWU1BUFxyXG5cdFx0dW5pZm9ybSBzYW1wbGVyMkQgc3BlY3VsYXJJbnRlbnNpdHlNYXA7XHJcblx0I2VuZGlmXHJcbiNlbmRpZlxyXG5cclxuI2lmZGVmIFVTRV9DTEVBUkNPQVRcclxuXHR1bmlmb3JtIGZsb2F0IGNsZWFyY29hdDtcclxuXHR1bmlmb3JtIGZsb2F0IGNsZWFyY29hdFJvdWdobmVzcztcclxuI2VuZGlmXHJcblxyXG4jaWZkZWYgVVNFX0RJU1BFUlNJT05cclxuXHR1bmlmb3JtIGZsb2F0IGRpc3BlcnNpb247XHJcbiNlbmRpZlxyXG5cclxuI2lmZGVmIFVTRV9JUklERVNDRU5DRVxyXG5cdHVuaWZvcm0gZmxvYXQgaXJpZGVzY2VuY2U7XHJcblx0dW5pZm9ybSBmbG9hdCBpcmlkZXNjZW5jZUlPUjtcclxuXHR1bmlmb3JtIGZsb2F0IGlyaWRlc2NlbmNlVGhpY2tuZXNzTWluaW11bTtcclxuXHR1bmlmb3JtIGZsb2F0IGlyaWRlc2NlbmNlVGhpY2tuZXNzTWF4aW11bTtcclxuI2VuZGlmXHJcblxyXG4jaWZkZWYgVVNFX1NIRUVOXHJcblx0dW5pZm9ybSB2ZWMzIHNoZWVuQ29sb3I7XHJcblx0dW5pZm9ybSBmbG9hdCBzaGVlblJvdWdobmVzcztcclxuXHJcblx0I2lmZGVmIFVTRV9TSEVFTl9DT0xPUk1BUFxyXG5cdFx0dW5pZm9ybSBzYW1wbGVyMkQgc2hlZW5Db2xvck1hcDtcclxuXHQjZW5kaWZcclxuXHJcblx0I2lmZGVmIFVTRV9TSEVFTl9ST1VHSE5FU1NNQVBcclxuXHRcdHVuaWZvcm0gc2FtcGxlcjJEIHNoZWVuUm91Z2huZXNzTWFwO1xyXG5cdCNlbmRpZlxyXG4jZW5kaWZcclxuXHJcbiNpZmRlZiBVU0VfQU5JU09UUk9QWVxyXG5cdHVuaWZvcm0gdmVjMiBhbmlzb3Ryb3B5VmVjdG9yO1xyXG5cclxuXHQjaWZkZWYgVVNFX0FOSVNPVFJPUFlNQVBcclxuXHRcdHVuaWZvcm0gc2FtcGxlcjJEIGFuaXNvdHJvcHlNYXA7XHJcblx0I2VuZGlmXHJcbiNlbmRpZlxyXG5cclxudmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XHJcblxyXG4jaW5jbHVkZSA8Y29tbW9uPlxyXG4jaW5jbHVkZSA8cGFja2luZz5cclxuI2luY2x1ZGUgPGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxhbHBoYXRlc3RfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGFscGhhaGFzaF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8aXJpZGVzY2VuY2VfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxlbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxlbnZtYXBfcGh5c2ljYWxfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8bGlnaHRzX3BhcnNfYmVnaW4+XHJcbiNpbmNsdWRlIDxub3JtYWxfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGxpZ2h0c19waHlzaWNhbF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8dHJhbnNtaXNzaW9uX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGJ1bXBtYXBfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8Y2xlYXJjb2F0X3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxpcmlkZXNjZW5jZV9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8cm91Z2huZXNzbWFwX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxtZXRhbG5lc3NtYXBfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cclxuXHJcbnZvaWQgbWFpbigpIHtcclxuXHJcblx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XHJcblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cclxuXHJcblx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgPSBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcclxuXHR2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSA9IGVtaXNzaXZlO1xyXG5cclxuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPGFscGhhaGFzaF9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8cm91Z2huZXNzbWFwX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxtZXRhbG5lc3NtYXBfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9iZWdpbj5cclxuXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X21hcHM+XHJcblx0I2luY2x1ZGUgPGNsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfYmVnaW4+XHJcblx0I2luY2x1ZGUgPGNsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfbWFwcz5cclxuXHQjaW5jbHVkZSA8ZW1pc3NpdmVtYXBfZnJhZ21lbnQ+XHJcblxyXG5cdC8vIGFjY3VtdWxhdGlvblxyXG5cdCNpbmNsdWRlIDxsaWdodHNfcGh5c2ljYWxfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9iZWdpbj5cclxuXHQjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X21hcHM+XHJcblx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9lbmQ+XHJcblxyXG5cdC8vIG1vZHVsYXRpb25cclxuXHQjaW5jbHVkZSA8YW9tYXBfZnJhZ21lbnQ+XHJcblxyXG5cdHZlYzMgdG90YWxEaWZmdXNlID0gcmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZTtcclxuXHR2ZWMzIHRvdGFsU3BlY3VsYXIgPSByZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXI7XHJcblxyXG5cdCNpbmNsdWRlIDx0cmFuc21pc3Npb25fZnJhZ21lbnQ+XHJcblxyXG5cdHZlYzMgb3V0Z29pbmdMaWdodCA9IHRvdGFsRGlmZnVzZSArIHRvdGFsU3BlY3VsYXIgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7XHJcblxyXG5cdCNpZmRlZiBVU0VfU0hFRU5cclxuXHJcblx0XHQvLyBTaGVlbiBlbmVyZ3kgY29tcGVuc2F0aW9uIGFwcHJveGltYXRpb24gY2FsY3VsYXRpb24gY2FuIGJlIGZvdW5kIGF0IHRoZSBlbmQgb2ZcclxuXHRcdC8vIGh0dHBzOi8vZHJpdmUuZ29vZ2xlLmNvbS9maWxlL2QvMVQwRDFWU3lSNEFsbHFJSlRRQXJhRUl6amxiNWg0RktIL3ZpZXc/dXNwPXNoYXJpbmdcclxuXHRcdGZsb2F0IHNoZWVuRW5lcmd5Q29tcCA9IDEuMCAtIDAuMTU3ICogbWF4MyggbWF0ZXJpYWwuc2hlZW5Db2xvciApO1xyXG5cclxuXHRcdG91dGdvaW5nTGlnaHQgPSBvdXRnb2luZ0xpZ2h0ICogc2hlZW5FbmVyZ3lDb21wICsgc2hlZW5TcGVjdWxhckRpcmVjdCArIHNoZWVuU3BlY3VsYXJJbmRpcmVjdDtcclxuXHJcblx0I2VuZGlmXHJcblxyXG5cdCNpZmRlZiBVU0VfQ0xFQVJDT0FUXHJcblxyXG5cdFx0ZmxvYXQgZG90TlZjYyA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBnZW9tZXRyeVZpZXdEaXIgKSApO1xyXG5cclxuXHRcdHZlYzMgRmNjID0gRl9TY2hsaWNrKCBtYXRlcmlhbC5jbGVhcmNvYXRGMCwgbWF0ZXJpYWwuY2xlYXJjb2F0RjkwLCBkb3ROVmNjICk7XHJcblxyXG5cdFx0b3V0Z29pbmdMaWdodCA9IG91dGdvaW5nTGlnaHQgKiAoIDEuMCAtIG1hdGVyaWFsLmNsZWFyY29hdCAqIEZjYyApICsgKCBjbGVhcmNvYXRTcGVjdWxhckRpcmVjdCArIGNsZWFyY29hdFNwZWN1bGFySW5kaXJlY3QgKSAqIG1hdGVyaWFsLmNsZWFyY29hdDtcclxuXHJcblx0I2VuZGlmXHJcblxyXG5cdCNpbmNsdWRlIDxvcGFxdWVfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxjb2xvcnNwYWNlX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD5cclxuXHJcbn1cclxuYDtcclxuIiwiZXhwb3J0IGNvbnN0IHZlcnRleCA9IC8qIGdsc2wgKi9gXHJcbiNkZWZpbmUgVE9PTlxyXG5cclxudmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XHJcblxyXG4jaW5jbHVkZSA8Y29tbW9uPlxyXG4jaW5jbHVkZSA8YmF0Y2hpbmdfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8bm9ybWFsX3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PlxyXG5cclxudm9pZCBtYWluKCkge1xyXG5cclxuXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPG1vcnBoaW5zdGFuY2VfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxtb3JwaGNvbG9yX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8YmF0Y2hpbmdfdmVydGV4PlxyXG5cclxuXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxub3JtYWxfdmVydGV4PlxyXG5cclxuXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cclxuXHJcblx0dlZpZXdQb3NpdGlvbiA9IC0gbXZQb3NpdGlvbi54eXo7XHJcblxyXG5cdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XHJcblxyXG59XHJcbmA7XHJcblxyXG5leHBvcnQgY29uc3QgZnJhZ21lbnQgPSAvKiBnbHNsICovYFxyXG4jZGVmaW5lIFRPT05cclxuXHJcbnVuaWZvcm0gdmVjMyBkaWZmdXNlO1xyXG51bmlmb3JtIHZlYzMgZW1pc3NpdmU7XHJcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcclxuXHJcbiNpbmNsdWRlIDxjb21tb24+XHJcbiNpbmNsdWRlIDxwYWNraW5nPlxyXG4jaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGFscGhhdGVzdF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8YWxwaGFoYXNoX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxhb21hcF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxncmFkaWVudG1hcF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxic2Rmcz5cclxuI2luY2x1ZGUgPGxpZ2h0c19wYXJzX2JlZ2luPlxyXG4jaW5jbHVkZSA8bm9ybWFsX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxsaWdodHNfdG9vbl9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxidW1wbWFwX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cclxuXHJcbnZvaWQgbWFpbigpIHtcclxuXHJcblx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XHJcblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cclxuXHJcblx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgPSBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcclxuXHR2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSA9IGVtaXNzaXZlO1xyXG5cclxuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPGFscGhhaGFzaF9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X2JlZ2luPlxyXG5cdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfbWFwcz5cclxuXHQjaW5jbHVkZSA8ZW1pc3NpdmVtYXBfZnJhZ21lbnQ+XHJcblxyXG5cdC8vIGFjY3VtdWxhdGlvblxyXG5cdCNpbmNsdWRlIDxsaWdodHNfdG9vbl9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2JlZ2luPlxyXG5cdCNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfbWFwcz5cclxuXHQjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2VuZD5cclxuXHJcblx0Ly8gbW9kdWxhdGlvblxyXG5cdCNpbmNsdWRlIDxhb21hcF9mcmFnbWVudD5cclxuXHJcblx0dmVjMyBvdXRnb2luZ0xpZ2h0ID0gcmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArIHRvdGFsRW1pc3NpdmVSYWRpYW5jZTtcclxuXHJcblx0I2luY2x1ZGUgPG9wYXF1ZV9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPGNvbG9yc3BhY2VfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50PlxyXG5cclxufVxyXG5gO1xyXG4iLCJleHBvcnQgY29uc3QgdmVydGV4ID0gLyogZ2xzbCAqL2BcclxudW5pZm9ybSBmbG9hdCBzaXplO1xyXG51bmlmb3JtIGZsb2F0IHNjYWxlO1xyXG5cclxuI2luY2x1ZGUgPGNvbW1vbj5cclxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cclxuXHJcbiNpZmRlZiBVU0VfUE9JTlRTX1VWXHJcblxyXG5cdHZhcnlpbmcgdmVjMiB2VXY7XHJcblx0dW5pZm9ybSBtYXQzIHV2VHJhbnNmb3JtO1xyXG5cclxuI2VuZGlmXHJcblxyXG52b2lkIG1haW4oKSB7XHJcblxyXG5cdCNpZmRlZiBVU0VfUE9JTlRTX1VWXHJcblxyXG5cdFx0dlV2ID0gKCB1dlRyYW5zZm9ybSAqIHZlYzMoIHV2LCAxICkgKS54eTtcclxuXHJcblx0I2VuZGlmXHJcblxyXG5cdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPG1vcnBoaW5zdGFuY2VfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxtb3JwaGNvbG9yX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxyXG5cclxuXHRnbF9Qb2ludFNpemUgPSBzaXplO1xyXG5cclxuXHQjaWZkZWYgVVNFX1NJWkVBVFRFTlVBVElPTlxyXG5cclxuXHRcdGJvb2wgaXNQZXJzcGVjdGl2ZSA9IGlzUGVyc3BlY3RpdmVNYXRyaXgoIHByb2plY3Rpb25NYXRyaXggKTtcclxuXHJcblx0XHRpZiAoIGlzUGVyc3BlY3RpdmUgKSBnbF9Qb2ludFNpemUgKj0gKCBzY2FsZSAvIC0gbXZQb3NpdGlvbi56ICk7XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XHJcblxyXG59XHJcbmA7XHJcblxyXG5leHBvcnQgY29uc3QgZnJhZ21lbnQgPSAvKiBnbHNsICovYFxyXG51bmlmb3JtIHZlYzMgZGlmZnVzZTtcclxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xyXG5cclxuI2luY2x1ZGUgPGNvbW1vbj5cclxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxtYXBfcGFydGljbGVfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGFscGhhdGVzdF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8YWxwaGFoYXNoX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cclxuXHJcbnZvaWQgbWFpbigpIHtcclxuXHJcblx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XHJcblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cclxuXHJcblx0dmVjMyBvdXRnb2luZ0xpZ2h0ID0gdmVjMyggMC4wICk7XHJcblxyXG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8bWFwX3BhcnRpY2xlX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxhbHBoYWhhc2hfZnJhZ21lbnQ+XHJcblxyXG5cdG91dGdvaW5nTGlnaHQgPSBkaWZmdXNlQ29sb3IucmdiO1xyXG5cclxuXHQjaW5jbHVkZSA8b3BhcXVlX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8Y29sb3JzcGFjZV9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PlxyXG5cclxufVxyXG5gO1xyXG4iLCJleHBvcnQgY29uc3QgdmVydGV4ID0gLyogZ2xzbCAqL2BcclxuI2luY2x1ZGUgPGNvbW1vbj5cclxuI2luY2x1ZGUgPGJhdGNoaW5nX3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4PlxyXG5cclxudm9pZCBtYWluKCkge1xyXG5cclxuXHQjaW5jbHVkZSA8YmF0Y2hpbmdfdmVydGV4PlxyXG5cclxuXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxtb3JwaGluc3RhbmNlX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD5cclxuXHJcblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XHJcblxyXG5cdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XHJcblxyXG59XHJcbmA7XHJcblxyXG5leHBvcnQgY29uc3QgZnJhZ21lbnQgPSAvKiBnbHNsICovYFxyXG51bmlmb3JtIHZlYzMgY29sb3I7XHJcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcclxuXHJcbiNpbmNsdWRlIDxjb21tb24+XHJcbiNpbmNsdWRlIDxwYWNraW5nPlxyXG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxic2Rmcz5cclxuI2luY2x1ZGUgPGxpZ2h0c19wYXJzX2JlZ2luPlxyXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8c2hhZG93bWFza19wYXJzX2ZyYWdtZW50PlxyXG5cclxudm9pZCBtYWluKCkge1xyXG5cclxuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XHJcblxyXG5cdGdsX0ZyYWdDb2xvciA9IHZlYzQoIGNvbG9yLCBvcGFjaXR5ICogKCAxLjAgLSBnZXRTaGFkb3dNYXNrKCkgKSApO1xyXG5cclxuXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPGNvbG9yc3BhY2VfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cclxuXHJcbn1cclxuYDtcclxuIiwiZXhwb3J0IGNvbnN0IHZlcnRleCA9IC8qIGdsc2wgKi9gXHJcbnVuaWZvcm0gZmxvYXQgcm90YXRpb247XHJcbnVuaWZvcm0gdmVjMiBjZW50ZXI7XHJcblxyXG4jaW5jbHVkZSA8Y29tbW9uPlxyXG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cclxuXHJcbnZvaWQgbWFpbigpIHtcclxuXHJcblx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cclxuXHJcblx0dmVjNCBtdlBvc2l0aW9uID0gbW9kZWxWaWV3TWF0cml4WyAzIF07XHJcblxyXG5cdHZlYzIgc2NhbGUgPSB2ZWMyKCBsZW5ndGgoIG1vZGVsTWF0cml4WyAwIF0ueHl6ICksIGxlbmd0aCggbW9kZWxNYXRyaXhbIDEgXS54eXogKSApO1xyXG5cclxuXHQjaWZuZGVmIFVTRV9TSVpFQVRURU5VQVRJT05cclxuXHJcblx0XHRib29sIGlzUGVyc3BlY3RpdmUgPSBpc1BlcnNwZWN0aXZlTWF0cml4KCBwcm9qZWN0aW9uTWF0cml4ICk7XHJcblxyXG5cdFx0aWYgKCBpc1BlcnNwZWN0aXZlICkgc2NhbGUgKj0gLSBtdlBvc2l0aW9uLno7XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuXHR2ZWMyIGFsaWduZWRQb3NpdGlvbiA9ICggcG9zaXRpb24ueHkgLSAoIGNlbnRlciAtIHZlYzIoIDAuNSApICkgKSAqIHNjYWxlO1xyXG5cclxuXHR2ZWMyIHJvdGF0ZWRQb3NpdGlvbjtcclxuXHRyb3RhdGVkUG9zaXRpb24ueCA9IGNvcyggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi54IC0gc2luKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnk7XHJcblx0cm90YXRlZFBvc2l0aW9uLnkgPSBzaW4oIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueCArIGNvcyggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi55O1xyXG5cclxuXHRtdlBvc2l0aW9uLnh5ICs9IHJvdGF0ZWRQb3NpdGlvbjtcclxuXHJcblx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjtcclxuXHJcblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cclxuXHJcbn1cclxuYDtcclxuXHJcbmV4cG9ydCBjb25zdCBmcmFnbWVudCA9IC8qIGdsc2wgKi9gXHJcbnVuaWZvcm0gdmVjMyBkaWZmdXNlO1xyXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XHJcblxyXG4jaW5jbHVkZSA8Y29tbW9uPlxyXG4jaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGFscGhhdGVzdF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8YWxwaGFoYXNoX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cclxuXHJcbnZvaWQgbWFpbigpIHtcclxuXHJcblx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XHJcblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cclxuXHJcblx0dmVjMyBvdXRnb2luZ0xpZ2h0ID0gdmVjMyggMC4wICk7XHJcblxyXG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxhbHBoYWhhc2hfZnJhZ21lbnQ+XHJcblxyXG5cdG91dGdvaW5nTGlnaHQgPSBkaWZmdXNlQ29sb3IucmdiO1xyXG5cclxuXHQjaW5jbHVkZSA8b3BhcXVlX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8Y29sb3JzcGFjZV9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PlxyXG5cclxufVxyXG5gO1xyXG4iLCJpbXBvcnQgYWxwaGFoYXNoX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvYWxwaGFoYXNoX2ZyYWdtZW50Lmdsc2wuanMnO1xyXG5pbXBvcnQgYWxwaGFoYXNoX3BhcnNfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9hbHBoYWhhc2hfcGFyc19mcmFnbWVudC5nbHNsLmpzJztcclxuaW1wb3J0IGFscGhhbWFwX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvYWxwaGFtYXBfZnJhZ21lbnQuZ2xzbC5qcyc7XHJcbmltcG9ydCBhbHBoYW1hcF9wYXJzX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvYWxwaGFtYXBfcGFyc19mcmFnbWVudC5nbHNsLmpzJztcclxuaW1wb3J0IGFscGhhdGVzdF9mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL2FscGhhdGVzdF9mcmFnbWVudC5nbHNsLmpzJztcclxuaW1wb3J0IGFscGhhdGVzdF9wYXJzX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvYWxwaGF0ZXN0X3BhcnNfZnJhZ21lbnQuZ2xzbC5qcyc7XHJcbmltcG9ydCBhb21hcF9mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL2FvbWFwX2ZyYWdtZW50Lmdsc2wuanMnO1xyXG5pbXBvcnQgYW9tYXBfcGFyc19mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL2FvbWFwX3BhcnNfZnJhZ21lbnQuZ2xzbC5qcyc7XHJcbmltcG9ydCBiYXRjaGluZ19wYXJzX3ZlcnRleCBmcm9tICcuL1NoYWRlckNodW5rL2JhdGNoaW5nX3BhcnNfdmVydGV4Lmdsc2wuanMnO1xyXG5pbXBvcnQgYmF0Y2hpbmdfdmVydGV4IGZyb20gJy4vU2hhZGVyQ2h1bmsvYmF0Y2hpbmdfdmVydGV4Lmdsc2wuanMnO1xyXG5pbXBvcnQgYmVnaW5fdmVydGV4IGZyb20gJy4vU2hhZGVyQ2h1bmsvYmVnaW5fdmVydGV4Lmdsc2wuanMnO1xyXG5pbXBvcnQgYmVnaW5ub3JtYWxfdmVydGV4IGZyb20gJy4vU2hhZGVyQ2h1bmsvYmVnaW5ub3JtYWxfdmVydGV4Lmdsc2wuanMnO1xyXG5pbXBvcnQgYnNkZnMgZnJvbSAnLi9TaGFkZXJDaHVuay9ic2Rmcy5nbHNsLmpzJztcclxuaW1wb3J0IGlyaWRlc2NlbmNlX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvaXJpZGVzY2VuY2VfZnJhZ21lbnQuZ2xzbC5qcyc7XHJcbmltcG9ydCBidW1wbWFwX3BhcnNfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9idW1wbWFwX3BhcnNfZnJhZ21lbnQuZ2xzbC5qcyc7XHJcbmltcG9ydCBjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9jbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQuZ2xzbC5qcyc7XHJcbmltcG9ydCBjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL2NsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Lmdsc2wuanMnO1xyXG5pbXBvcnQgY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4IGZyb20gJy4vU2hhZGVyQ2h1bmsvY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4Lmdsc2wuanMnO1xyXG5pbXBvcnQgY2xpcHBpbmdfcGxhbmVzX3ZlcnRleCBmcm9tICcuL1NoYWRlckNodW5rL2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXguZ2xzbC5qcyc7XHJcbmltcG9ydCBjb2xvcl9mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL2NvbG9yX2ZyYWdtZW50Lmdsc2wuanMnO1xyXG5pbXBvcnQgY29sb3JfcGFyc19mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL2NvbG9yX3BhcnNfZnJhZ21lbnQuZ2xzbC5qcyc7XHJcbmltcG9ydCBjb2xvcl9wYXJzX3ZlcnRleCBmcm9tICcuL1NoYWRlckNodW5rL2NvbG9yX3BhcnNfdmVydGV4Lmdsc2wuanMnO1xyXG5pbXBvcnQgY29sb3JfdmVydGV4IGZyb20gJy4vU2hhZGVyQ2h1bmsvY29sb3JfdmVydGV4Lmdsc2wuanMnO1xyXG5pbXBvcnQgY29tbW9uIGZyb20gJy4vU2hhZGVyQ2h1bmsvY29tbW9uLmdsc2wuanMnO1xyXG5pbXBvcnQgY3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvY3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50Lmdsc2wuanMnO1xyXG5pbXBvcnQgZGVmYXVsdG5vcm1hbF92ZXJ0ZXggZnJvbSAnLi9TaGFkZXJDaHVuay9kZWZhdWx0bm9ybWFsX3ZlcnRleC5nbHNsLmpzJztcclxuaW1wb3J0IGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleCBmcm9tICcuL1NoYWRlckNodW5rL2Rpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleC5nbHNsLmpzJztcclxuaW1wb3J0IGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXggZnJvbSAnLi9TaGFkZXJDaHVuay9kaXNwbGFjZW1lbnRtYXBfdmVydGV4Lmdsc2wuanMnO1xyXG5pbXBvcnQgZW1pc3NpdmVtYXBfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9lbWlzc2l2ZW1hcF9mcmFnbWVudC5nbHNsLmpzJztcclxuaW1wb3J0IGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9lbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50Lmdsc2wuanMnO1xyXG5pbXBvcnQgY29sb3JzcGFjZV9mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL2NvbG9yc3BhY2VfZnJhZ21lbnQuZ2xzbC5qcyc7XHJcbmltcG9ydCBjb2xvcnNwYWNlX3BhcnNfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9jb2xvcnNwYWNlX3BhcnNfZnJhZ21lbnQuZ2xzbC5qcyc7XHJcbmltcG9ydCBlbnZtYXBfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9lbnZtYXBfZnJhZ21lbnQuZ2xzbC5qcyc7XHJcbmltcG9ydCBlbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9lbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnQuZ2xzbC5qcyc7XHJcbmltcG9ydCBlbnZtYXBfcGFyc19mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL2Vudm1hcF9wYXJzX2ZyYWdtZW50Lmdsc2wuanMnO1xyXG5pbXBvcnQgZW52bWFwX3BhcnNfdmVydGV4IGZyb20gJy4vU2hhZGVyQ2h1bmsvZW52bWFwX3BhcnNfdmVydGV4Lmdsc2wuanMnO1xyXG5pbXBvcnQgZW52bWFwX3ZlcnRleCBmcm9tICcuL1NoYWRlckNodW5rL2Vudm1hcF92ZXJ0ZXguZ2xzbC5qcyc7XHJcbmltcG9ydCBmb2dfdmVydGV4IGZyb20gJy4vU2hhZGVyQ2h1bmsvZm9nX3ZlcnRleC5nbHNsLmpzJztcclxuaW1wb3J0IGZvZ19wYXJzX3ZlcnRleCBmcm9tICcuL1NoYWRlckNodW5rL2ZvZ19wYXJzX3ZlcnRleC5nbHNsLmpzJztcclxuaW1wb3J0IGZvZ19mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL2ZvZ19mcmFnbWVudC5nbHNsLmpzJztcclxuaW1wb3J0IGZvZ19wYXJzX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvZm9nX3BhcnNfZnJhZ21lbnQuZ2xzbC5qcyc7XHJcbmltcG9ydCBncmFkaWVudG1hcF9wYXJzX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvZ3JhZGllbnRtYXBfcGFyc19mcmFnbWVudC5nbHNsLmpzJztcclxuaW1wb3J0IGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9saWdodG1hcF9wYXJzX2ZyYWdtZW50Lmdsc2wuanMnO1xyXG5pbXBvcnQgbGlnaHRzX2xhbWJlcnRfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9saWdodHNfbGFtYmVydF9mcmFnbWVudC5nbHNsLmpzJztcclxuaW1wb3J0IGxpZ2h0c19sYW1iZXJ0X3BhcnNfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9saWdodHNfbGFtYmVydF9wYXJzX2ZyYWdtZW50Lmdsc2wuanMnO1xyXG5pbXBvcnQgbGlnaHRzX3BhcnNfYmVnaW4gZnJvbSAnLi9TaGFkZXJDaHVuay9saWdodHNfcGFyc19iZWdpbi5nbHNsLmpzJztcclxuaW1wb3J0IGVudm1hcF9waHlzaWNhbF9wYXJzX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvZW52bWFwX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQuZ2xzbC5qcyc7XHJcbmltcG9ydCBsaWdodHNfdG9vbl9mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL2xpZ2h0c190b29uX2ZyYWdtZW50Lmdsc2wuanMnO1xyXG5pbXBvcnQgbGlnaHRzX3Rvb25fcGFyc19mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL2xpZ2h0c190b29uX3BhcnNfZnJhZ21lbnQuZ2xzbC5qcyc7XHJcbmltcG9ydCBsaWdodHNfcGhvbmdfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9saWdodHNfcGhvbmdfZnJhZ21lbnQuZ2xzbC5qcyc7XHJcbmltcG9ydCBsaWdodHNfcGhvbmdfcGFyc19mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL2xpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50Lmdsc2wuanMnO1xyXG5pbXBvcnQgbGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvbGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50Lmdsc2wuanMnO1xyXG5pbXBvcnQgbGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9saWdodHNfcGh5c2ljYWxfcGFyc19mcmFnbWVudC5nbHNsLmpzJztcclxuaW1wb3J0IGxpZ2h0c19mcmFnbWVudF9iZWdpbiBmcm9tICcuL1NoYWRlckNodW5rL2xpZ2h0c19mcmFnbWVudF9iZWdpbi5nbHNsLmpzJztcclxuaW1wb3J0IGxpZ2h0c19mcmFnbWVudF9tYXBzIGZyb20gJy4vU2hhZGVyQ2h1bmsvbGlnaHRzX2ZyYWdtZW50X21hcHMuZ2xzbC5qcyc7XHJcbmltcG9ydCBsaWdodHNfZnJhZ21lbnRfZW5kIGZyb20gJy4vU2hhZGVyQ2h1bmsvbGlnaHRzX2ZyYWdtZW50X2VuZC5nbHNsLmpzJztcclxuaW1wb3J0IGxvZ2RlcHRoYnVmX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvbG9nZGVwdGhidWZfZnJhZ21lbnQuZ2xzbC5qcyc7XHJcbmltcG9ydCBsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudC5nbHNsLmpzJztcclxuaW1wb3J0IGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4IGZyb20gJy4vU2hhZGVyQ2h1bmsvbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXguZ2xzbC5qcyc7XHJcbmltcG9ydCBsb2dkZXB0aGJ1Zl92ZXJ0ZXggZnJvbSAnLi9TaGFkZXJDaHVuay9sb2dkZXB0aGJ1Zl92ZXJ0ZXguZ2xzbC5qcyc7XHJcbmltcG9ydCBtYXBfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9tYXBfZnJhZ21lbnQuZ2xzbC5qcyc7XHJcbmltcG9ydCBtYXBfcGFyc19mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL21hcF9wYXJzX2ZyYWdtZW50Lmdsc2wuanMnO1xyXG5pbXBvcnQgbWFwX3BhcnRpY2xlX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvbWFwX3BhcnRpY2xlX2ZyYWdtZW50Lmdsc2wuanMnO1xyXG5pbXBvcnQgbWFwX3BhcnRpY2xlX3BhcnNfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9tYXBfcGFydGljbGVfcGFyc19mcmFnbWVudC5nbHNsLmpzJztcclxuaW1wb3J0IG1ldGFsbmVzc21hcF9mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL21ldGFsbmVzc21hcF9mcmFnbWVudC5nbHNsLmpzJztcclxuaW1wb3J0IG1ldGFsbmVzc21hcF9wYXJzX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvbWV0YWxuZXNzbWFwX3BhcnNfZnJhZ21lbnQuZ2xzbC5qcyc7XHJcbmltcG9ydCBtb3JwaGluc3RhbmNlX3ZlcnRleCBmcm9tICcuL1NoYWRlckNodW5rL21vcnBoaW5zdGFuY2VfdmVydGV4Lmdsc2wuanMnO1xyXG5pbXBvcnQgbW9ycGhjb2xvcl92ZXJ0ZXggZnJvbSAnLi9TaGFkZXJDaHVuay9tb3JwaGNvbG9yX3ZlcnRleC5nbHNsLmpzJztcclxuaW1wb3J0IG1vcnBobm9ybWFsX3ZlcnRleCBmcm9tICcuL1NoYWRlckNodW5rL21vcnBobm9ybWFsX3ZlcnRleC5nbHNsLmpzJztcclxuaW1wb3J0IG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4IGZyb20gJy4vU2hhZGVyQ2h1bmsvbW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXguZ2xzbC5qcyc7XHJcbmltcG9ydCBtb3JwaHRhcmdldF92ZXJ0ZXggZnJvbSAnLi9TaGFkZXJDaHVuay9tb3JwaHRhcmdldF92ZXJ0ZXguZ2xzbC5qcyc7XHJcbmltcG9ydCBub3JtYWxfZnJhZ21lbnRfYmVnaW4gZnJvbSAnLi9TaGFkZXJDaHVuay9ub3JtYWxfZnJhZ21lbnRfYmVnaW4uZ2xzbC5qcyc7XHJcbmltcG9ydCBub3JtYWxfZnJhZ21lbnRfbWFwcyBmcm9tICcuL1NoYWRlckNodW5rL25vcm1hbF9mcmFnbWVudF9tYXBzLmdsc2wuanMnO1xyXG5pbXBvcnQgbm9ybWFsX3BhcnNfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9ub3JtYWxfcGFyc19mcmFnbWVudC5nbHNsLmpzJztcclxuaW1wb3J0IG5vcm1hbF9wYXJzX3ZlcnRleCBmcm9tICcuL1NoYWRlckNodW5rL25vcm1hbF9wYXJzX3ZlcnRleC5nbHNsLmpzJztcclxuaW1wb3J0IG5vcm1hbF92ZXJ0ZXggZnJvbSAnLi9TaGFkZXJDaHVuay9ub3JtYWxfdmVydGV4Lmdsc2wuanMnO1xyXG5pbXBvcnQgbm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9ub3JtYWxtYXBfcGFyc19mcmFnbWVudC5nbHNsLmpzJztcclxuaW1wb3J0IGNsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfYmVnaW4gZnJvbSAnLi9TaGFkZXJDaHVuay9jbGVhcmNvYXRfbm9ybWFsX2ZyYWdtZW50X2JlZ2luLmdsc2wuanMnO1xyXG5pbXBvcnQgY2xlYXJjb2F0X25vcm1hbF9mcmFnbWVudF9tYXBzIGZyb20gJy4vU2hhZGVyQ2h1bmsvY2xlYXJjb2F0X25vcm1hbF9mcmFnbWVudF9tYXBzLmdsc2wuanMnO1xyXG5pbXBvcnQgY2xlYXJjb2F0X3BhcnNfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9jbGVhcmNvYXRfcGFyc19mcmFnbWVudC5nbHNsLmpzJztcclxuaW1wb3J0IGlyaWRlc2NlbmNlX3BhcnNfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9pcmlkZXNjZW5jZV9wYXJzX2ZyYWdtZW50Lmdsc2wuanMnO1xyXG5pbXBvcnQgb3BhcXVlX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvb3BhcXVlX2ZyYWdtZW50Lmdsc2wuanMnO1xyXG5pbXBvcnQgcGFja2luZyBmcm9tICcuL1NoYWRlckNodW5rL3BhY2tpbmcuZ2xzbC5qcyc7XHJcbmltcG9ydCBwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvcHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudC5nbHNsLmpzJztcclxuaW1wb3J0IHByb2plY3RfdmVydGV4IGZyb20gJy4vU2hhZGVyQ2h1bmsvcHJvamVjdF92ZXJ0ZXguZ2xzbC5qcyc7XHJcbmltcG9ydCBkaXRoZXJpbmdfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9kaXRoZXJpbmdfZnJhZ21lbnQuZ2xzbC5qcyc7XHJcbmltcG9ydCBkaXRoZXJpbmdfcGFyc19mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL2RpdGhlcmluZ19wYXJzX2ZyYWdtZW50Lmdsc2wuanMnO1xyXG5pbXBvcnQgcm91Z2huZXNzbWFwX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvcm91Z2huZXNzbWFwX2ZyYWdtZW50Lmdsc2wuanMnO1xyXG5pbXBvcnQgcm91Z2huZXNzbWFwX3BhcnNfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9yb3VnaG5lc3NtYXBfcGFyc19mcmFnbWVudC5nbHNsLmpzJztcclxuaW1wb3J0IHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvc2hhZG93bWFwX3BhcnNfZnJhZ21lbnQuZ2xzbC5qcyc7XHJcbmltcG9ydCBzaGFkb3dtYXBfcGFyc192ZXJ0ZXggZnJvbSAnLi9TaGFkZXJDaHVuay9zaGFkb3dtYXBfcGFyc192ZXJ0ZXguZ2xzbC5qcyc7XHJcbmltcG9ydCBzaGFkb3dtYXBfdmVydGV4IGZyb20gJy4vU2hhZGVyQ2h1bmsvc2hhZG93bWFwX3ZlcnRleC5nbHNsLmpzJztcclxuaW1wb3J0IHNoYWRvd21hc2tfcGFyc19mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL3NoYWRvd21hc2tfcGFyc19mcmFnbWVudC5nbHNsLmpzJztcclxuaW1wb3J0IHNraW5iYXNlX3ZlcnRleCBmcm9tICcuL1NoYWRlckNodW5rL3NraW5iYXNlX3ZlcnRleC5nbHNsLmpzJztcclxuaW1wb3J0IHNraW5uaW5nX3BhcnNfdmVydGV4IGZyb20gJy4vU2hhZGVyQ2h1bmsvc2tpbm5pbmdfcGFyc192ZXJ0ZXguZ2xzbC5qcyc7XHJcbmltcG9ydCBza2lubmluZ192ZXJ0ZXggZnJvbSAnLi9TaGFkZXJDaHVuay9za2lubmluZ192ZXJ0ZXguZ2xzbC5qcyc7XHJcbmltcG9ydCBza2lubm9ybWFsX3ZlcnRleCBmcm9tICcuL1NoYWRlckNodW5rL3NraW5ub3JtYWxfdmVydGV4Lmdsc2wuanMnO1xyXG5pbXBvcnQgc3BlY3VsYXJtYXBfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9zcGVjdWxhcm1hcF9mcmFnbWVudC5nbHNsLmpzJztcclxuaW1wb3J0IHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9zcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50Lmdsc2wuanMnO1xyXG5pbXBvcnQgdG9uZW1hcHBpbmdfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay90b25lbWFwcGluZ19mcmFnbWVudC5nbHNsLmpzJztcclxuaW1wb3J0IHRvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay90b25lbWFwcGluZ19wYXJzX2ZyYWdtZW50Lmdsc2wuanMnO1xyXG5pbXBvcnQgdHJhbnNtaXNzaW9uX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvdHJhbnNtaXNzaW9uX2ZyYWdtZW50Lmdsc2wuanMnO1xyXG5pbXBvcnQgdHJhbnNtaXNzaW9uX3BhcnNfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay90cmFuc21pc3Npb25fcGFyc19mcmFnbWVudC5nbHNsLmpzJztcclxuaW1wb3J0IHV2X3BhcnNfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay91dl9wYXJzX2ZyYWdtZW50Lmdsc2wuanMnO1xyXG5pbXBvcnQgdXZfcGFyc192ZXJ0ZXggZnJvbSAnLi9TaGFkZXJDaHVuay91dl9wYXJzX3ZlcnRleC5nbHNsLmpzJztcclxuaW1wb3J0IHV2X3ZlcnRleCBmcm9tICcuL1NoYWRlckNodW5rL3V2X3ZlcnRleC5nbHNsLmpzJztcclxuaW1wb3J0IHdvcmxkcG9zX3ZlcnRleCBmcm9tICcuL1NoYWRlckNodW5rL3dvcmxkcG9zX3ZlcnRleC5nbHNsLmpzJztcclxuXHJcbmltcG9ydCAqIGFzIGJhY2tncm91bmQgZnJvbSAnLi9TaGFkZXJMaWIvYmFja2dyb3VuZC5nbHNsLmpzJztcclxuaW1wb3J0ICogYXMgYmFja2dyb3VuZEN1YmUgZnJvbSAnLi9TaGFkZXJMaWIvYmFja2dyb3VuZEN1YmUuZ2xzbC5qcyc7XHJcbmltcG9ydCAqIGFzIGN1YmUgZnJvbSAnLi9TaGFkZXJMaWIvY3ViZS5nbHNsLmpzJztcclxuaW1wb3J0ICogYXMgZGVwdGggZnJvbSAnLi9TaGFkZXJMaWIvZGVwdGguZ2xzbC5qcyc7XHJcbmltcG9ydCAqIGFzIGRpc3RhbmNlUkdCQSBmcm9tICcuL1NoYWRlckxpYi9kaXN0YW5jZVJHQkEuZ2xzbC5qcyc7XHJcbmltcG9ydCAqIGFzIGVxdWlyZWN0IGZyb20gJy4vU2hhZGVyTGliL2VxdWlyZWN0Lmdsc2wuanMnO1xyXG5pbXBvcnQgKiBhcyBsaW5lZGFzaGVkIGZyb20gJy4vU2hhZGVyTGliL2xpbmVkYXNoZWQuZ2xzbC5qcyc7XHJcbmltcG9ydCAqIGFzIG1lc2hiYXNpYyBmcm9tICcuL1NoYWRlckxpYi9tZXNoYmFzaWMuZ2xzbC5qcyc7XHJcbmltcG9ydCAqIGFzIG1lc2hsYW1iZXJ0IGZyb20gJy4vU2hhZGVyTGliL21lc2hsYW1iZXJ0Lmdsc2wuanMnO1xyXG5pbXBvcnQgKiBhcyBtZXNobWF0Y2FwIGZyb20gJy4vU2hhZGVyTGliL21lc2htYXRjYXAuZ2xzbC5qcyc7XHJcbmltcG9ydCAqIGFzIG1lc2hub3JtYWwgZnJvbSAnLi9TaGFkZXJMaWIvbWVzaG5vcm1hbC5nbHNsLmpzJztcclxuaW1wb3J0ICogYXMgbWVzaHBob25nIGZyb20gJy4vU2hhZGVyTGliL21lc2hwaG9uZy5nbHNsLmpzJztcclxuaW1wb3J0ICogYXMgbWVzaHBoeXNpY2FsIGZyb20gJy4vU2hhZGVyTGliL21lc2hwaHlzaWNhbC5nbHNsLmpzJztcclxuaW1wb3J0ICogYXMgbWVzaHRvb24gZnJvbSAnLi9TaGFkZXJMaWIvbWVzaHRvb24uZ2xzbC5qcyc7XHJcbmltcG9ydCAqIGFzIHBvaW50cyBmcm9tICcuL1NoYWRlckxpYi9wb2ludHMuZ2xzbC5qcyc7XHJcbmltcG9ydCAqIGFzIHNoYWRvdyBmcm9tICcuL1NoYWRlckxpYi9zaGFkb3cuZ2xzbC5qcyc7XHJcbmltcG9ydCAqIGFzIHNwcml0ZSBmcm9tICcuL1NoYWRlckxpYi9zcHJpdGUuZ2xzbC5qcyc7XHJcblxyXG5leHBvcnQgY29uc3QgU2hhZGVyQ2h1bmsgPSB7XHJcblx0YWxwaGFoYXNoX2ZyYWdtZW50OiBhbHBoYWhhc2hfZnJhZ21lbnQsXHJcblx0YWxwaGFoYXNoX3BhcnNfZnJhZ21lbnQ6IGFscGhhaGFzaF9wYXJzX2ZyYWdtZW50LFxyXG5cdGFscGhhbWFwX2ZyYWdtZW50OiBhbHBoYW1hcF9mcmFnbWVudCxcclxuXHRhbHBoYW1hcF9wYXJzX2ZyYWdtZW50OiBhbHBoYW1hcF9wYXJzX2ZyYWdtZW50LFxyXG5cdGFscGhhdGVzdF9mcmFnbWVudDogYWxwaGF0ZXN0X2ZyYWdtZW50LFxyXG5cdGFscGhhdGVzdF9wYXJzX2ZyYWdtZW50OiBhbHBoYXRlc3RfcGFyc19mcmFnbWVudCxcclxuXHRhb21hcF9mcmFnbWVudDogYW9tYXBfZnJhZ21lbnQsXHJcblx0YW9tYXBfcGFyc19mcmFnbWVudDogYW9tYXBfcGFyc19mcmFnbWVudCxcclxuXHRiYXRjaGluZ19wYXJzX3ZlcnRleDogYmF0Y2hpbmdfcGFyc192ZXJ0ZXgsXHJcblx0YmF0Y2hpbmdfdmVydGV4OiBiYXRjaGluZ192ZXJ0ZXgsXHJcblx0YmVnaW5fdmVydGV4OiBiZWdpbl92ZXJ0ZXgsXHJcblx0YmVnaW5ub3JtYWxfdmVydGV4OiBiZWdpbm5vcm1hbF92ZXJ0ZXgsXHJcblx0YnNkZnM6IGJzZGZzLFxyXG5cdGlyaWRlc2NlbmNlX2ZyYWdtZW50OiBpcmlkZXNjZW5jZV9mcmFnbWVudCxcclxuXHRidW1wbWFwX3BhcnNfZnJhZ21lbnQ6IGJ1bXBtYXBfcGFyc19mcmFnbWVudCxcclxuXHRjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ6IGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudCxcclxuXHRjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudDogY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQsXHJcblx0Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4OiBjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXgsXHJcblx0Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleDogY2xpcHBpbmdfcGxhbmVzX3ZlcnRleCxcclxuXHRjb2xvcl9mcmFnbWVudDogY29sb3JfZnJhZ21lbnQsXHJcblx0Y29sb3JfcGFyc19mcmFnbWVudDogY29sb3JfcGFyc19mcmFnbWVudCxcclxuXHRjb2xvcl9wYXJzX3ZlcnRleDogY29sb3JfcGFyc192ZXJ0ZXgsXHJcblx0Y29sb3JfdmVydGV4OiBjb2xvcl92ZXJ0ZXgsXHJcblx0Y29tbW9uOiBjb21tb24sXHJcblx0Y3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50OiBjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQsXHJcblx0ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg6IGRlZmF1bHRub3JtYWxfdmVydGV4LFxyXG5cdGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleDogZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4LFxyXG5cdGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg6IGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXgsXHJcblx0ZW1pc3NpdmVtYXBfZnJhZ21lbnQ6IGVtaXNzaXZlbWFwX2ZyYWdtZW50LFxyXG5cdGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQ6IGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQsXHJcblx0Y29sb3JzcGFjZV9mcmFnbWVudDogY29sb3JzcGFjZV9mcmFnbWVudCxcclxuXHRjb2xvcnNwYWNlX3BhcnNfZnJhZ21lbnQ6IGNvbG9yc3BhY2VfcGFyc19mcmFnbWVudCxcclxuXHRlbnZtYXBfZnJhZ21lbnQ6IGVudm1hcF9mcmFnbWVudCxcclxuXHRlbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnQ6IGVudm1hcF9jb21tb25fcGFyc19mcmFnbWVudCxcclxuXHRlbnZtYXBfcGFyc19mcmFnbWVudDogZW52bWFwX3BhcnNfZnJhZ21lbnQsXHJcblx0ZW52bWFwX3BhcnNfdmVydGV4OiBlbnZtYXBfcGFyc192ZXJ0ZXgsXHJcblx0ZW52bWFwX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQ6IGVudm1hcF9waHlzaWNhbF9wYXJzX2ZyYWdtZW50LFxyXG5cdGVudm1hcF92ZXJ0ZXg6IGVudm1hcF92ZXJ0ZXgsXHJcblx0Zm9nX3ZlcnRleDogZm9nX3ZlcnRleCxcclxuXHRmb2dfcGFyc192ZXJ0ZXg6IGZvZ19wYXJzX3ZlcnRleCxcclxuXHRmb2dfZnJhZ21lbnQ6IGZvZ19mcmFnbWVudCxcclxuXHRmb2dfcGFyc19mcmFnbWVudDogZm9nX3BhcnNfZnJhZ21lbnQsXHJcblx0Z3JhZGllbnRtYXBfcGFyc19mcmFnbWVudDogZ3JhZGllbnRtYXBfcGFyc19mcmFnbWVudCxcclxuXHRsaWdodG1hcF9wYXJzX2ZyYWdtZW50OiBsaWdodG1hcF9wYXJzX2ZyYWdtZW50LFxyXG5cdGxpZ2h0c19sYW1iZXJ0X2ZyYWdtZW50OiBsaWdodHNfbGFtYmVydF9mcmFnbWVudCxcclxuXHRsaWdodHNfbGFtYmVydF9wYXJzX2ZyYWdtZW50OiBsaWdodHNfbGFtYmVydF9wYXJzX2ZyYWdtZW50LFxyXG5cdGxpZ2h0c19wYXJzX2JlZ2luOiBsaWdodHNfcGFyc19iZWdpbixcclxuXHRsaWdodHNfdG9vbl9mcmFnbWVudDogbGlnaHRzX3Rvb25fZnJhZ21lbnQsXHJcblx0bGlnaHRzX3Rvb25fcGFyc19mcmFnbWVudDogbGlnaHRzX3Rvb25fcGFyc19mcmFnbWVudCxcclxuXHRsaWdodHNfcGhvbmdfZnJhZ21lbnQ6IGxpZ2h0c19waG9uZ19mcmFnbWVudCxcclxuXHRsaWdodHNfcGhvbmdfcGFyc19mcmFnbWVudDogbGlnaHRzX3Bob25nX3BhcnNfZnJhZ21lbnQsXHJcblx0bGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50OiBsaWdodHNfcGh5c2ljYWxfZnJhZ21lbnQsXHJcblx0bGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQ6IGxpZ2h0c19waHlzaWNhbF9wYXJzX2ZyYWdtZW50LFxyXG5cdGxpZ2h0c19mcmFnbWVudF9iZWdpbjogbGlnaHRzX2ZyYWdtZW50X2JlZ2luLFxyXG5cdGxpZ2h0c19mcmFnbWVudF9tYXBzOiBsaWdodHNfZnJhZ21lbnRfbWFwcyxcclxuXHRsaWdodHNfZnJhZ21lbnRfZW5kOiBsaWdodHNfZnJhZ21lbnRfZW5kLFxyXG5cdGxvZ2RlcHRoYnVmX2ZyYWdtZW50OiBsb2dkZXB0aGJ1Zl9mcmFnbWVudCxcclxuXHRsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50OiBsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50LFxyXG5cdGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4OiBsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleCxcclxuXHRsb2dkZXB0aGJ1Zl92ZXJ0ZXg6IGxvZ2RlcHRoYnVmX3ZlcnRleCxcclxuXHRtYXBfZnJhZ21lbnQ6IG1hcF9mcmFnbWVudCxcclxuXHRtYXBfcGFyc19mcmFnbWVudDogbWFwX3BhcnNfZnJhZ21lbnQsXHJcblx0bWFwX3BhcnRpY2xlX2ZyYWdtZW50OiBtYXBfcGFydGljbGVfZnJhZ21lbnQsXHJcblx0bWFwX3BhcnRpY2xlX3BhcnNfZnJhZ21lbnQ6IG1hcF9wYXJ0aWNsZV9wYXJzX2ZyYWdtZW50LFxyXG5cdG1ldGFsbmVzc21hcF9mcmFnbWVudDogbWV0YWxuZXNzbWFwX2ZyYWdtZW50LFxyXG5cdG1ldGFsbmVzc21hcF9wYXJzX2ZyYWdtZW50OiBtZXRhbG5lc3NtYXBfcGFyc19mcmFnbWVudCxcclxuXHRtb3JwaGluc3RhbmNlX3ZlcnRleDogbW9ycGhpbnN0YW5jZV92ZXJ0ZXgsXHJcblx0bW9ycGhjb2xvcl92ZXJ0ZXg6IG1vcnBoY29sb3JfdmVydGV4LFxyXG5cdG1vcnBobm9ybWFsX3ZlcnRleDogbW9ycGhub3JtYWxfdmVydGV4LFxyXG5cdG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4OiBtb3JwaHRhcmdldF9wYXJzX3ZlcnRleCxcclxuXHRtb3JwaHRhcmdldF92ZXJ0ZXg6IG1vcnBodGFyZ2V0X3ZlcnRleCxcclxuXHRub3JtYWxfZnJhZ21lbnRfYmVnaW46IG5vcm1hbF9mcmFnbWVudF9iZWdpbixcclxuXHRub3JtYWxfZnJhZ21lbnRfbWFwczogbm9ybWFsX2ZyYWdtZW50X21hcHMsXHJcblx0bm9ybWFsX3BhcnNfZnJhZ21lbnQ6IG5vcm1hbF9wYXJzX2ZyYWdtZW50LFxyXG5cdG5vcm1hbF9wYXJzX3ZlcnRleDogbm9ybWFsX3BhcnNfdmVydGV4LFxyXG5cdG5vcm1hbF92ZXJ0ZXg6IG5vcm1hbF92ZXJ0ZXgsXHJcblx0bm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ6IG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50LFxyXG5cdGNsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfYmVnaW46IGNsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfYmVnaW4sXHJcblx0Y2xlYXJjb2F0X25vcm1hbF9mcmFnbWVudF9tYXBzOiBjbGVhcmNvYXRfbm9ybWFsX2ZyYWdtZW50X21hcHMsXHJcblx0Y2xlYXJjb2F0X3BhcnNfZnJhZ21lbnQ6IGNsZWFyY29hdF9wYXJzX2ZyYWdtZW50LFxyXG5cdGlyaWRlc2NlbmNlX3BhcnNfZnJhZ21lbnQ6IGlyaWRlc2NlbmNlX3BhcnNfZnJhZ21lbnQsXHJcblx0b3BhcXVlX2ZyYWdtZW50OiBvcGFxdWVfZnJhZ21lbnQsXHJcblx0cGFja2luZzogcGFja2luZyxcclxuXHRwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50OiBwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50LFxyXG5cdHByb2plY3RfdmVydGV4OiBwcm9qZWN0X3ZlcnRleCxcclxuXHRkaXRoZXJpbmdfZnJhZ21lbnQ6IGRpdGhlcmluZ19mcmFnbWVudCxcclxuXHRkaXRoZXJpbmdfcGFyc19mcmFnbWVudDogZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQsXHJcblx0cm91Z2huZXNzbWFwX2ZyYWdtZW50OiByb3VnaG5lc3NtYXBfZnJhZ21lbnQsXHJcblx0cm91Z2huZXNzbWFwX3BhcnNfZnJhZ21lbnQ6IHJvdWdobmVzc21hcF9wYXJzX2ZyYWdtZW50LFxyXG5cdHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50OiBzaGFkb3dtYXBfcGFyc19mcmFnbWVudCxcclxuXHRzaGFkb3dtYXBfcGFyc192ZXJ0ZXg6IHNoYWRvd21hcF9wYXJzX3ZlcnRleCxcclxuXHRzaGFkb3dtYXBfdmVydGV4OiBzaGFkb3dtYXBfdmVydGV4LFxyXG5cdHNoYWRvd21hc2tfcGFyc19mcmFnbWVudDogc2hhZG93bWFza19wYXJzX2ZyYWdtZW50LFxyXG5cdHNraW5iYXNlX3ZlcnRleDogc2tpbmJhc2VfdmVydGV4LFxyXG5cdHNraW5uaW5nX3BhcnNfdmVydGV4OiBza2lubmluZ19wYXJzX3ZlcnRleCxcclxuXHRza2lubmluZ192ZXJ0ZXg6IHNraW5uaW5nX3ZlcnRleCxcclxuXHRza2lubm9ybWFsX3ZlcnRleDogc2tpbm5vcm1hbF92ZXJ0ZXgsXHJcblx0c3BlY3VsYXJtYXBfZnJhZ21lbnQ6IHNwZWN1bGFybWFwX2ZyYWdtZW50LFxyXG5cdHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ6IHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQsXHJcblx0dG9uZW1hcHBpbmdfZnJhZ21lbnQ6IHRvbmVtYXBwaW5nX2ZyYWdtZW50LFxyXG5cdHRvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQ6IHRvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQsXHJcblx0dHJhbnNtaXNzaW9uX2ZyYWdtZW50OiB0cmFuc21pc3Npb25fZnJhZ21lbnQsXHJcblx0dHJhbnNtaXNzaW9uX3BhcnNfZnJhZ21lbnQ6IHRyYW5zbWlzc2lvbl9wYXJzX2ZyYWdtZW50LFxyXG5cdHV2X3BhcnNfZnJhZ21lbnQ6IHV2X3BhcnNfZnJhZ21lbnQsXHJcblx0dXZfcGFyc192ZXJ0ZXg6IHV2X3BhcnNfdmVydGV4LFxyXG5cdHV2X3ZlcnRleDogdXZfdmVydGV4LFxyXG5cdHdvcmxkcG9zX3ZlcnRleDogd29ybGRwb3NfdmVydGV4LFxyXG5cclxuXHRiYWNrZ3JvdW5kX3ZlcnQ6IGJhY2tncm91bmQudmVydGV4LFxyXG5cdGJhY2tncm91bmRfZnJhZzogYmFja2dyb3VuZC5mcmFnbWVudCxcclxuXHRiYWNrZ3JvdW5kQ3ViZV92ZXJ0OiBiYWNrZ3JvdW5kQ3ViZS52ZXJ0ZXgsXHJcblx0YmFja2dyb3VuZEN1YmVfZnJhZzogYmFja2dyb3VuZEN1YmUuZnJhZ21lbnQsXHJcblx0Y3ViZV92ZXJ0OiBjdWJlLnZlcnRleCxcclxuXHRjdWJlX2ZyYWc6IGN1YmUuZnJhZ21lbnQsXHJcblx0ZGVwdGhfdmVydDogZGVwdGgudmVydGV4LFxyXG5cdGRlcHRoX2ZyYWc6IGRlcHRoLmZyYWdtZW50LFxyXG5cdGRpc3RhbmNlUkdCQV92ZXJ0OiBkaXN0YW5jZVJHQkEudmVydGV4LFxyXG5cdGRpc3RhbmNlUkdCQV9mcmFnOiBkaXN0YW5jZVJHQkEuZnJhZ21lbnQsXHJcblx0ZXF1aXJlY3RfdmVydDogZXF1aXJlY3QudmVydGV4LFxyXG5cdGVxdWlyZWN0X2ZyYWc6IGVxdWlyZWN0LmZyYWdtZW50LFxyXG5cdGxpbmVkYXNoZWRfdmVydDogbGluZWRhc2hlZC52ZXJ0ZXgsXHJcblx0bGluZWRhc2hlZF9mcmFnOiBsaW5lZGFzaGVkLmZyYWdtZW50LFxyXG5cdG1lc2hiYXNpY192ZXJ0OiBtZXNoYmFzaWMudmVydGV4LFxyXG5cdG1lc2hiYXNpY19mcmFnOiBtZXNoYmFzaWMuZnJhZ21lbnQsXHJcblx0bWVzaGxhbWJlcnRfdmVydDogbWVzaGxhbWJlcnQudmVydGV4LFxyXG5cdG1lc2hsYW1iZXJ0X2ZyYWc6IG1lc2hsYW1iZXJ0LmZyYWdtZW50LFxyXG5cdG1lc2htYXRjYXBfdmVydDogbWVzaG1hdGNhcC52ZXJ0ZXgsXHJcblx0bWVzaG1hdGNhcF9mcmFnOiBtZXNobWF0Y2FwLmZyYWdtZW50LFxyXG5cdG1lc2hub3JtYWxfdmVydDogbWVzaG5vcm1hbC52ZXJ0ZXgsXHJcblx0bWVzaG5vcm1hbF9mcmFnOiBtZXNobm9ybWFsLmZyYWdtZW50LFxyXG5cdG1lc2hwaG9uZ192ZXJ0OiBtZXNocGhvbmcudmVydGV4LFxyXG5cdG1lc2hwaG9uZ19mcmFnOiBtZXNocGhvbmcuZnJhZ21lbnQsXHJcblx0bWVzaHBoeXNpY2FsX3ZlcnQ6IG1lc2hwaHlzaWNhbC52ZXJ0ZXgsXHJcblx0bWVzaHBoeXNpY2FsX2ZyYWc6IG1lc2hwaHlzaWNhbC5mcmFnbWVudCxcclxuXHRtZXNodG9vbl92ZXJ0OiBtZXNodG9vbi52ZXJ0ZXgsXHJcblx0bWVzaHRvb25fZnJhZzogbWVzaHRvb24uZnJhZ21lbnQsXHJcblx0cG9pbnRzX3ZlcnQ6IHBvaW50cy52ZXJ0ZXgsXHJcblx0cG9pbnRzX2ZyYWc6IHBvaW50cy5mcmFnbWVudCxcclxuXHRzaGFkb3dfdmVydDogc2hhZG93LnZlcnRleCxcclxuXHRzaGFkb3dfZnJhZzogc2hhZG93LmZyYWdtZW50LFxyXG5cdHNwcml0ZV92ZXJ0OiBzcHJpdGUudmVydGV4LFxyXG5cdHNwcml0ZV9mcmFnOiBzcHJpdGUuZnJhZ21lbnRcclxufTtcclxuIiwiaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi8uLi9tYXRoL0NvbG9yLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMi5qcyc7XHJcbmltcG9ydCB7IE1hdHJpeDMgfSBmcm9tICcuLi8uLi9tYXRoL01hdHJpeDMuanMnO1xyXG5cclxuLy8gVW5pZm9ybXMgbGlicmFyeSBmb3Igc2hhcmVkIHdlYmdsIHNoYWRlcnNcclxuY29uc3QgVW5pZm9ybXNMaWIgPSB7XHJcblxyXG5cdGNvbW1vbjoge1xyXG5cclxuXHRcdGRpZmZ1c2U6IHsgdmFsdWU6IC8qQF9fUFVSRV9fKi8gbmV3IENvbG9yKCAweGZmZmZmZiApIH0sXHJcblx0XHRvcGFjaXR5OiB7IHZhbHVlOiAxLjAgfSxcclxuXHJcblx0XHRtYXA6IHsgdmFsdWU6IG51bGwgfSxcclxuXHRcdG1hcFRyYW5zZm9ybTogeyB2YWx1ZTogLypAX19QVVJFX18qLyBuZXcgTWF0cml4MygpIH0sXHJcblxyXG5cdFx0YWxwaGFNYXA6IHsgdmFsdWU6IG51bGwgfSxcclxuXHRcdGFscGhhTWFwVHJhbnNmb3JtOiB7IHZhbHVlOiAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXgzKCkgfSxcclxuXHJcblx0XHRhbHBoYVRlc3Q6IHsgdmFsdWU6IDAgfVxyXG5cclxuXHR9LFxyXG5cclxuXHRzcGVjdWxhcm1hcDoge1xyXG5cclxuXHRcdHNwZWN1bGFyTWFwOiB7IHZhbHVlOiBudWxsIH0sXHJcblx0XHRzcGVjdWxhck1hcFRyYW5zZm9ybTogeyB2YWx1ZTogLypAX19QVVJFX18qLyBuZXcgTWF0cml4MygpIH1cclxuXHJcblx0fSxcclxuXHJcblx0ZW52bWFwOiB7XHJcblxyXG5cdFx0ZW52TWFwOiB7IHZhbHVlOiBudWxsIH0sXHJcblx0XHRlbnZNYXBSb3RhdGlvbjogeyB2YWx1ZTogLypAX19QVVJFX18qLyBuZXcgTWF0cml4MygpIH0sXHJcblx0XHRmbGlwRW52TWFwOiB7IHZhbHVlOiAtIDEgfSxcclxuXHRcdHJlZmxlY3Rpdml0eTogeyB2YWx1ZTogMS4wIH0sIC8vIGJhc2ljLCBsYW1iZXJ0LCBwaG9uZ1xyXG5cdFx0aW9yOiB7IHZhbHVlOiAxLjUgfSwgLy8gcGh5c2ljYWxcclxuXHRcdHJlZnJhY3Rpb25SYXRpbzogeyB2YWx1ZTogMC45OCB9LCAvLyBiYXNpYywgbGFtYmVydCwgcGhvbmdcclxuXHJcblx0fSxcclxuXHJcblx0YW9tYXA6IHtcclxuXHJcblx0XHRhb01hcDogeyB2YWx1ZTogbnVsbCB9LFxyXG5cdFx0YW9NYXBJbnRlbnNpdHk6IHsgdmFsdWU6IDEgfSxcclxuXHRcdGFvTWFwVHJhbnNmb3JtOiB7IHZhbHVlOiAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXgzKCkgfVxyXG5cclxuXHR9LFxyXG5cclxuXHRsaWdodG1hcDoge1xyXG5cclxuXHRcdGxpZ2h0TWFwOiB7IHZhbHVlOiBudWxsIH0sXHJcblx0XHRsaWdodE1hcEludGVuc2l0eTogeyB2YWx1ZTogMSB9LFxyXG5cdFx0bGlnaHRNYXBUcmFuc2Zvcm06IHsgdmFsdWU6IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDMoKSB9XHJcblxyXG5cdH0sXHJcblxyXG5cdGJ1bXBtYXA6IHtcclxuXHJcblx0XHRidW1wTWFwOiB7IHZhbHVlOiBudWxsIH0sXHJcblx0XHRidW1wTWFwVHJhbnNmb3JtOiB7IHZhbHVlOiAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXgzKCkgfSxcclxuXHRcdGJ1bXBTY2FsZTogeyB2YWx1ZTogMSB9XHJcblxyXG5cdH0sXHJcblxyXG5cdG5vcm1hbG1hcDoge1xyXG5cclxuXHRcdG5vcm1hbE1hcDogeyB2YWx1ZTogbnVsbCB9LFxyXG5cdFx0bm9ybWFsTWFwVHJhbnNmb3JtOiB7IHZhbHVlOiAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXgzKCkgfSxcclxuXHRcdG5vcm1hbFNjYWxlOiB7IHZhbHVlOiAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IyKCAxLCAxICkgfVxyXG5cclxuXHR9LFxyXG5cclxuXHRkaXNwbGFjZW1lbnRtYXA6IHtcclxuXHJcblx0XHRkaXNwbGFjZW1lbnRNYXA6IHsgdmFsdWU6IG51bGwgfSxcclxuXHRcdGRpc3BsYWNlbWVudE1hcFRyYW5zZm9ybTogeyB2YWx1ZTogLypAX19QVVJFX18qLyBuZXcgTWF0cml4MygpIH0sXHJcblx0XHRkaXNwbGFjZW1lbnRTY2FsZTogeyB2YWx1ZTogMSB9LFxyXG5cdFx0ZGlzcGxhY2VtZW50QmlhczogeyB2YWx1ZTogMCB9XHJcblxyXG5cdH0sXHJcblxyXG5cdGVtaXNzaXZlbWFwOiB7XHJcblxyXG5cdFx0ZW1pc3NpdmVNYXA6IHsgdmFsdWU6IG51bGwgfSxcclxuXHRcdGVtaXNzaXZlTWFwVHJhbnNmb3JtOiB7IHZhbHVlOiAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXgzKCkgfVxyXG5cclxuXHR9LFxyXG5cclxuXHRtZXRhbG5lc3NtYXA6IHtcclxuXHJcblx0XHRtZXRhbG5lc3NNYXA6IHsgdmFsdWU6IG51bGwgfSxcclxuXHRcdG1ldGFsbmVzc01hcFRyYW5zZm9ybTogeyB2YWx1ZTogLypAX19QVVJFX18qLyBuZXcgTWF0cml4MygpIH1cclxuXHJcblx0fSxcclxuXHJcblx0cm91Z2huZXNzbWFwOiB7XHJcblxyXG5cdFx0cm91Z2huZXNzTWFwOiB7IHZhbHVlOiBudWxsIH0sXHJcblx0XHRyb3VnaG5lc3NNYXBUcmFuc2Zvcm06IHsgdmFsdWU6IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDMoKSB9XHJcblxyXG5cdH0sXHJcblxyXG5cdGdyYWRpZW50bWFwOiB7XHJcblxyXG5cdFx0Z3JhZGllbnRNYXA6IHsgdmFsdWU6IG51bGwgfVxyXG5cclxuXHR9LFxyXG5cclxuXHRmb2c6IHtcclxuXHJcblx0XHRmb2dEZW5zaXR5OiB7IHZhbHVlOiAwLjAwMDI1IH0sXHJcblx0XHRmb2dOZWFyOiB7IHZhbHVlOiAxIH0sXHJcblx0XHRmb2dGYXI6IHsgdmFsdWU6IDIwMDAgfSxcclxuXHRcdGZvZ0NvbG9yOiB7IHZhbHVlOiAvKkBfX1BVUkVfXyovIG5ldyBDb2xvciggMHhmZmZmZmYgKSB9XHJcblxyXG5cdH0sXHJcblxyXG5cdGxpZ2h0czoge1xyXG5cclxuXHRcdGFtYmllbnRMaWdodENvbG9yOiB7IHZhbHVlOiBbXSB9LFxyXG5cclxuXHRcdGxpZ2h0UHJvYmU6IHsgdmFsdWU6IFtdIH0sXHJcblxyXG5cdFx0ZGlyZWN0aW9uYWxMaWdodHM6IHsgdmFsdWU6IFtdLCBwcm9wZXJ0aWVzOiB7XHJcblx0XHRcdGRpcmVjdGlvbjoge30sXHJcblx0XHRcdGNvbG9yOiB7fVxyXG5cdFx0fSB9LFxyXG5cclxuXHRcdGRpcmVjdGlvbmFsTGlnaHRTaGFkb3dzOiB7IHZhbHVlOiBbXSwgcHJvcGVydGllczoge1xyXG5cdFx0XHRzaGFkb3dJbnRlbnNpdHk6IDEsXHJcblx0XHRcdHNoYWRvd0JpYXM6IHt9LFxyXG5cdFx0XHRzaGFkb3dOb3JtYWxCaWFzOiB7fSxcclxuXHRcdFx0c2hhZG93UmFkaXVzOiB7fSxcclxuXHRcdFx0c2hhZG93TWFwU2l6ZToge31cclxuXHRcdH0gfSxcclxuXHJcblx0XHRkaXJlY3Rpb25hbFNoYWRvd01hcDogeyB2YWx1ZTogW10gfSxcclxuXHRcdGRpcmVjdGlvbmFsU2hhZG93TWF0cml4OiB7IHZhbHVlOiBbXSB9LFxyXG5cclxuXHRcdHNwb3RMaWdodHM6IHsgdmFsdWU6IFtdLCBwcm9wZXJ0aWVzOiB7XHJcblx0XHRcdGNvbG9yOiB7fSxcclxuXHRcdFx0cG9zaXRpb246IHt9LFxyXG5cdFx0XHRkaXJlY3Rpb246IHt9LFxyXG5cdFx0XHRkaXN0YW5jZToge30sXHJcblx0XHRcdGNvbmVDb3M6IHt9LFxyXG5cdFx0XHRwZW51bWJyYUNvczoge30sXHJcblx0XHRcdGRlY2F5OiB7fVxyXG5cdFx0fSB9LFxyXG5cclxuXHRcdHNwb3RMaWdodFNoYWRvd3M6IHsgdmFsdWU6IFtdLCBwcm9wZXJ0aWVzOiB7XHJcblx0XHRcdHNoYWRvd0ludGVuc2l0eTogMSxcclxuXHRcdFx0c2hhZG93Qmlhczoge30sXHJcblx0XHRcdHNoYWRvd05vcm1hbEJpYXM6IHt9LFxyXG5cdFx0XHRzaGFkb3dSYWRpdXM6IHt9LFxyXG5cdFx0XHRzaGFkb3dNYXBTaXplOiB7fVxyXG5cdFx0fSB9LFxyXG5cclxuXHRcdHNwb3RMaWdodE1hcDogeyB2YWx1ZTogW10gfSxcclxuXHRcdHNwb3RTaGFkb3dNYXA6IHsgdmFsdWU6IFtdIH0sXHJcblx0XHRzcG90TGlnaHRNYXRyaXg6IHsgdmFsdWU6IFtdIH0sXHJcblxyXG5cdFx0cG9pbnRMaWdodHM6IHsgdmFsdWU6IFtdLCBwcm9wZXJ0aWVzOiB7XHJcblx0XHRcdGNvbG9yOiB7fSxcclxuXHRcdFx0cG9zaXRpb246IHt9LFxyXG5cdFx0XHRkZWNheToge30sXHJcblx0XHRcdGRpc3RhbmNlOiB7fVxyXG5cdFx0fSB9LFxyXG5cclxuXHRcdHBvaW50TGlnaHRTaGFkb3dzOiB7IHZhbHVlOiBbXSwgcHJvcGVydGllczoge1xyXG5cdFx0XHRzaGFkb3dJbnRlbnNpdHk6IDEsXHJcblx0XHRcdHNoYWRvd0JpYXM6IHt9LFxyXG5cdFx0XHRzaGFkb3dOb3JtYWxCaWFzOiB7fSxcclxuXHRcdFx0c2hhZG93UmFkaXVzOiB7fSxcclxuXHRcdFx0c2hhZG93TWFwU2l6ZToge30sXHJcblx0XHRcdHNoYWRvd0NhbWVyYU5lYXI6IHt9LFxyXG5cdFx0XHRzaGFkb3dDYW1lcmFGYXI6IHt9XHJcblx0XHR9IH0sXHJcblxyXG5cdFx0cG9pbnRTaGFkb3dNYXA6IHsgdmFsdWU6IFtdIH0sXHJcblx0XHRwb2ludFNoYWRvd01hdHJpeDogeyB2YWx1ZTogW10gfSxcclxuXHJcblx0XHRoZW1pc3BoZXJlTGlnaHRzOiB7IHZhbHVlOiBbXSwgcHJvcGVydGllczoge1xyXG5cdFx0XHRkaXJlY3Rpb246IHt9LFxyXG5cdFx0XHRza3lDb2xvcjoge30sXHJcblx0XHRcdGdyb3VuZENvbG9yOiB7fVxyXG5cdFx0fSB9LFxyXG5cclxuXHRcdC8vIFRPRE8gKGFiZWxuYXRpb24pOiBSZWN0QXJlYUxpZ2h0IEJSREYgZGF0YSBuZWVkcyB0byBiZSBtb3ZlZCBmcm9tIGV4YW1wbGUgdG8gbWFpbiBzcmNcclxuXHRcdHJlY3RBcmVhTGlnaHRzOiB7IHZhbHVlOiBbXSwgcHJvcGVydGllczoge1xyXG5cdFx0XHRjb2xvcjoge30sXHJcblx0XHRcdHBvc2l0aW9uOiB7fSxcclxuXHRcdFx0d2lkdGg6IHt9LFxyXG5cdFx0XHRoZWlnaHQ6IHt9XHJcblx0XHR9IH0sXHJcblxyXG5cdFx0bHRjXzE6IHsgdmFsdWU6IG51bGwgfSxcclxuXHRcdGx0Y18yOiB7IHZhbHVlOiBudWxsIH1cclxuXHJcblx0fSxcclxuXHJcblx0cG9pbnRzOiB7XHJcblxyXG5cdFx0ZGlmZnVzZTogeyB2YWx1ZTogLypAX19QVVJFX18qLyBuZXcgQ29sb3IoIDB4ZmZmZmZmICkgfSxcclxuXHRcdG9wYWNpdHk6IHsgdmFsdWU6IDEuMCB9LFxyXG5cdFx0c2l6ZTogeyB2YWx1ZTogMS4wIH0sXHJcblx0XHRzY2FsZTogeyB2YWx1ZTogMS4wIH0sXHJcblx0XHRtYXA6IHsgdmFsdWU6IG51bGwgfSxcclxuXHRcdGFscGhhTWFwOiB7IHZhbHVlOiBudWxsIH0sXHJcblx0XHRhbHBoYU1hcFRyYW5zZm9ybTogeyB2YWx1ZTogLypAX19QVVJFX18qLyBuZXcgTWF0cml4MygpIH0sXHJcblx0XHRhbHBoYVRlc3Q6IHsgdmFsdWU6IDAgfSxcclxuXHRcdHV2VHJhbnNmb3JtOiB7IHZhbHVlOiAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXgzKCkgfVxyXG5cclxuXHR9LFxyXG5cclxuXHRzcHJpdGU6IHtcclxuXHJcblx0XHRkaWZmdXNlOiB7IHZhbHVlOiAvKkBfX1BVUkVfXyovIG5ldyBDb2xvciggMHhmZmZmZmYgKSB9LFxyXG5cdFx0b3BhY2l0eTogeyB2YWx1ZTogMS4wIH0sXHJcblx0XHRjZW50ZXI6IHsgdmFsdWU6IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjIoIDAuNSwgMC41ICkgfSxcclxuXHRcdHJvdGF0aW9uOiB7IHZhbHVlOiAwLjAgfSxcclxuXHRcdG1hcDogeyB2YWx1ZTogbnVsbCB9LFxyXG5cdFx0bWFwVHJhbnNmb3JtOiB7IHZhbHVlOiAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXgzKCkgfSxcclxuXHRcdGFscGhhTWFwOiB7IHZhbHVlOiBudWxsIH0sXHJcblx0XHRhbHBoYU1hcFRyYW5zZm9ybTogeyB2YWx1ZTogLypAX19QVVJFX18qLyBuZXcgTWF0cml4MygpIH0sXHJcblx0XHRhbHBoYVRlc3Q6IHsgdmFsdWU6IDAgfVxyXG5cclxuXHR9XHJcblxyXG59O1xyXG5cclxuZXhwb3J0IHsgVW5pZm9ybXNMaWIgfTtcclxuIiwiaW1wb3J0IHsgU2hhZGVyQ2h1bmsgfSBmcm9tICcuL1NoYWRlckNodW5rLmpzJztcclxuaW1wb3J0IHsgbWVyZ2VVbmlmb3JtcyB9IGZyb20gJy4vVW5pZm9ybXNVdGlscy5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjIuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuaW1wb3J0IHsgVW5pZm9ybXNMaWIgfSBmcm9tICcuL1VuaWZvcm1zTGliLmpzJztcclxuaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi8uLi9tYXRoL0NvbG9yLmpzJztcclxuaW1wb3J0IHsgTWF0cml4MyB9IGZyb20gJy4uLy4uL21hdGgvTWF0cml4My5qcyc7XHJcblxyXG5jb25zdCBTaGFkZXJMaWIgPSB7XHJcblxyXG5cdGJhc2ljOiB7XHJcblxyXG5cdFx0dW5pZm9ybXM6IC8qQF9fUFVSRV9fKi8gbWVyZ2VVbmlmb3JtcyggW1xyXG5cdFx0XHRVbmlmb3Jtc0xpYi5jb21tb24sXHJcblx0XHRcdFVuaWZvcm1zTGliLnNwZWN1bGFybWFwLFxyXG5cdFx0XHRVbmlmb3Jtc0xpYi5lbnZtYXAsXHJcblx0XHRcdFVuaWZvcm1zTGliLmFvbWFwLFxyXG5cdFx0XHRVbmlmb3Jtc0xpYi5saWdodG1hcCxcclxuXHRcdFx0VW5pZm9ybXNMaWIuZm9nXHJcblx0XHRdICksXHJcblxyXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNoYmFzaWNfdmVydCxcclxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNoYmFzaWNfZnJhZ1xyXG5cclxuXHR9LFxyXG5cclxuXHRsYW1iZXJ0OiB7XHJcblxyXG5cdFx0dW5pZm9ybXM6IC8qQF9fUFVSRV9fKi8gbWVyZ2VVbmlmb3JtcyggW1xyXG5cdFx0XHRVbmlmb3Jtc0xpYi5jb21tb24sXHJcblx0XHRcdFVuaWZvcm1zTGliLnNwZWN1bGFybWFwLFxyXG5cdFx0XHRVbmlmb3Jtc0xpYi5lbnZtYXAsXHJcblx0XHRcdFVuaWZvcm1zTGliLmFvbWFwLFxyXG5cdFx0XHRVbmlmb3Jtc0xpYi5saWdodG1hcCxcclxuXHRcdFx0VW5pZm9ybXNMaWIuZW1pc3NpdmVtYXAsXHJcblx0XHRcdFVuaWZvcm1zTGliLmJ1bXBtYXAsXHJcblx0XHRcdFVuaWZvcm1zTGliLm5vcm1hbG1hcCxcclxuXHRcdFx0VW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwLFxyXG5cdFx0XHRVbmlmb3Jtc0xpYi5mb2csXHJcblx0XHRcdFVuaWZvcm1zTGliLmxpZ2h0cyxcclxuXHRcdFx0e1xyXG5cdFx0XHRcdGVtaXNzaXZlOiB7IHZhbHVlOiAvKkBfX1BVUkVfXyovIG5ldyBDb2xvciggMHgwMDAwMDAgKSB9XHJcblx0XHRcdH1cclxuXHRcdF0gKSxcclxuXHJcblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hsYW1iZXJ0X3ZlcnQsXHJcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaGxhbWJlcnRfZnJhZ1xyXG5cclxuXHR9LFxyXG5cclxuXHRwaG9uZzoge1xyXG5cclxuXHRcdHVuaWZvcm1zOiAvKkBfX1BVUkVfXyovIG1lcmdlVW5pZm9ybXMoIFtcclxuXHRcdFx0VW5pZm9ybXNMaWIuY29tbW9uLFxyXG5cdFx0XHRVbmlmb3Jtc0xpYi5zcGVjdWxhcm1hcCxcclxuXHRcdFx0VW5pZm9ybXNMaWIuZW52bWFwLFxyXG5cdFx0XHRVbmlmb3Jtc0xpYi5hb21hcCxcclxuXHRcdFx0VW5pZm9ybXNMaWIubGlnaHRtYXAsXHJcblx0XHRcdFVuaWZvcm1zTGliLmVtaXNzaXZlbWFwLFxyXG5cdFx0XHRVbmlmb3Jtc0xpYi5idW1wbWFwLFxyXG5cdFx0XHRVbmlmb3Jtc0xpYi5ub3JtYWxtYXAsXHJcblx0XHRcdFVuaWZvcm1zTGliLmRpc3BsYWNlbWVudG1hcCxcclxuXHRcdFx0VW5pZm9ybXNMaWIuZm9nLFxyXG5cdFx0XHRVbmlmb3Jtc0xpYi5saWdodHMsXHJcblx0XHRcdHtcclxuXHRcdFx0XHRlbWlzc2l2ZTogeyB2YWx1ZTogLypAX19QVVJFX18qLyBuZXcgQ29sb3IoIDB4MDAwMDAwICkgfSxcclxuXHRcdFx0XHRzcGVjdWxhcjogeyB2YWx1ZTogLypAX19QVVJFX18qLyBuZXcgQ29sb3IoIDB4MTExMTExICkgfSxcclxuXHRcdFx0XHRzaGluaW5lc3M6IHsgdmFsdWU6IDMwIH1cclxuXHRcdFx0fVxyXG5cdFx0XSApLFxyXG5cclxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHBob25nX3ZlcnQsXHJcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHBob25nX2ZyYWdcclxuXHJcblx0fSxcclxuXHJcblx0c3RhbmRhcmQ6IHtcclxuXHJcblx0XHR1bmlmb3JtczogLypAX19QVVJFX18qLyBtZXJnZVVuaWZvcm1zKCBbXHJcblx0XHRcdFVuaWZvcm1zTGliLmNvbW1vbixcclxuXHRcdFx0VW5pZm9ybXNMaWIuZW52bWFwLFxyXG5cdFx0XHRVbmlmb3Jtc0xpYi5hb21hcCxcclxuXHRcdFx0VW5pZm9ybXNMaWIubGlnaHRtYXAsXHJcblx0XHRcdFVuaWZvcm1zTGliLmVtaXNzaXZlbWFwLFxyXG5cdFx0XHRVbmlmb3Jtc0xpYi5idW1wbWFwLFxyXG5cdFx0XHRVbmlmb3Jtc0xpYi5ub3JtYWxtYXAsXHJcblx0XHRcdFVuaWZvcm1zTGliLmRpc3BsYWNlbWVudG1hcCxcclxuXHRcdFx0VW5pZm9ybXNMaWIucm91Z2huZXNzbWFwLFxyXG5cdFx0XHRVbmlmb3Jtc0xpYi5tZXRhbG5lc3NtYXAsXHJcblx0XHRcdFVuaWZvcm1zTGliLmZvZyxcclxuXHRcdFx0VW5pZm9ybXNMaWIubGlnaHRzLFxyXG5cdFx0XHR7XHJcblx0XHRcdFx0ZW1pc3NpdmU6IHsgdmFsdWU6IC8qQF9fUFVSRV9fKi8gbmV3IENvbG9yKCAweDAwMDAwMCApIH0sXHJcblx0XHRcdFx0cm91Z2huZXNzOiB7IHZhbHVlOiAxLjAgfSxcclxuXHRcdFx0XHRtZXRhbG5lc3M6IHsgdmFsdWU6IDAuMCB9LFxyXG5cdFx0XHRcdGVudk1hcEludGVuc2l0eTogeyB2YWx1ZTogMSB9XHJcblx0XHRcdH1cclxuXHRcdF0gKSxcclxuXHJcblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hwaHlzaWNhbF92ZXJ0LFxyXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hwaHlzaWNhbF9mcmFnXHJcblxyXG5cdH0sXHJcblxyXG5cdHRvb246IHtcclxuXHJcblx0XHR1bmlmb3JtczogLypAX19QVVJFX18qLyBtZXJnZVVuaWZvcm1zKCBbXHJcblx0XHRcdFVuaWZvcm1zTGliLmNvbW1vbixcclxuXHRcdFx0VW5pZm9ybXNMaWIuYW9tYXAsXHJcblx0XHRcdFVuaWZvcm1zTGliLmxpZ2h0bWFwLFxyXG5cdFx0XHRVbmlmb3Jtc0xpYi5lbWlzc2l2ZW1hcCxcclxuXHRcdFx0VW5pZm9ybXNMaWIuYnVtcG1hcCxcclxuXHRcdFx0VW5pZm9ybXNMaWIubm9ybWFsbWFwLFxyXG5cdFx0XHRVbmlmb3Jtc0xpYi5kaXNwbGFjZW1lbnRtYXAsXHJcblx0XHRcdFVuaWZvcm1zTGliLmdyYWRpZW50bWFwLFxyXG5cdFx0XHRVbmlmb3Jtc0xpYi5mb2csXHJcblx0XHRcdFVuaWZvcm1zTGliLmxpZ2h0cyxcclxuXHRcdFx0e1xyXG5cdFx0XHRcdGVtaXNzaXZlOiB7IHZhbHVlOiAvKkBfX1BVUkVfXyovIG5ldyBDb2xvciggMHgwMDAwMDAgKSB9XHJcblx0XHRcdH1cclxuXHRcdF0gKSxcclxuXHJcblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1lc2h0b29uX3ZlcnQsXHJcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHRvb25fZnJhZ1xyXG5cclxuXHR9LFxyXG5cclxuXHRtYXRjYXA6IHtcclxuXHJcblx0XHR1bmlmb3JtczogLypAX19QVVJFX18qLyBtZXJnZVVuaWZvcm1zKCBbXHJcblx0XHRcdFVuaWZvcm1zTGliLmNvbW1vbixcclxuXHRcdFx0VW5pZm9ybXNMaWIuYnVtcG1hcCxcclxuXHRcdFx0VW5pZm9ybXNMaWIubm9ybWFsbWFwLFxyXG5cdFx0XHRVbmlmb3Jtc0xpYi5kaXNwbGFjZW1lbnRtYXAsXHJcblx0XHRcdFVuaWZvcm1zTGliLmZvZyxcclxuXHRcdFx0e1xyXG5cdFx0XHRcdG1hdGNhcDogeyB2YWx1ZTogbnVsbCB9XHJcblx0XHRcdH1cclxuXHRcdF0gKSxcclxuXHJcblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1lc2htYXRjYXBfdmVydCxcclxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNobWF0Y2FwX2ZyYWdcclxuXHJcblx0fSxcclxuXHJcblx0cG9pbnRzOiB7XHJcblxyXG5cdFx0dW5pZm9ybXM6IC8qQF9fUFVSRV9fKi8gbWVyZ2VVbmlmb3JtcyggW1xyXG5cdFx0XHRVbmlmb3Jtc0xpYi5wb2ludHMsXHJcblx0XHRcdFVuaWZvcm1zTGliLmZvZ1xyXG5cdFx0XSApLFxyXG5cclxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsucG9pbnRzX3ZlcnQsXHJcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsucG9pbnRzX2ZyYWdcclxuXHJcblx0fSxcclxuXHJcblx0ZGFzaGVkOiB7XHJcblxyXG5cdFx0dW5pZm9ybXM6IC8qQF9fUFVSRV9fKi8gbWVyZ2VVbmlmb3JtcyggW1xyXG5cdFx0XHRVbmlmb3Jtc0xpYi5jb21tb24sXHJcblx0XHRcdFVuaWZvcm1zTGliLmZvZyxcclxuXHRcdFx0e1xyXG5cdFx0XHRcdHNjYWxlOiB7IHZhbHVlOiAxIH0sXHJcblx0XHRcdFx0ZGFzaFNpemU6IHsgdmFsdWU6IDEgfSxcclxuXHRcdFx0XHR0b3RhbFNpemU6IHsgdmFsdWU6IDIgfVxyXG5cdFx0XHR9XHJcblx0XHRdICksXHJcblxyXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5saW5lZGFzaGVkX3ZlcnQsXHJcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubGluZWRhc2hlZF9mcmFnXHJcblxyXG5cdH0sXHJcblxyXG5cdGRlcHRoOiB7XHJcblxyXG5cdFx0dW5pZm9ybXM6IC8qQF9fUFVSRV9fKi8gbWVyZ2VVbmlmb3JtcyggW1xyXG5cdFx0XHRVbmlmb3Jtc0xpYi5jb21tb24sXHJcblx0XHRcdFVuaWZvcm1zTGliLmRpc3BsYWNlbWVudG1hcFxyXG5cdFx0XSApLFxyXG5cclxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsuZGVwdGhfdmVydCxcclxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5kZXB0aF9mcmFnXHJcblxyXG5cdH0sXHJcblxyXG5cdG5vcm1hbDoge1xyXG5cclxuXHRcdHVuaWZvcm1zOiAvKkBfX1BVUkVfXyovIG1lcmdlVW5pZm9ybXMoIFtcclxuXHRcdFx0VW5pZm9ybXNMaWIuY29tbW9uLFxyXG5cdFx0XHRVbmlmb3Jtc0xpYi5idW1wbWFwLFxyXG5cdFx0XHRVbmlmb3Jtc0xpYi5ub3JtYWxtYXAsXHJcblx0XHRcdFVuaWZvcm1zTGliLmRpc3BsYWNlbWVudG1hcCxcclxuXHRcdFx0e1xyXG5cdFx0XHRcdG9wYWNpdHk6IHsgdmFsdWU6IDEuMCB9XHJcblx0XHRcdH1cclxuXHRcdF0gKSxcclxuXHJcblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hub3JtYWxfdmVydCxcclxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNobm9ybWFsX2ZyYWdcclxuXHJcblx0fSxcclxuXHJcblx0c3ByaXRlOiB7XHJcblxyXG5cdFx0dW5pZm9ybXM6IC8qQF9fUFVSRV9fKi8gbWVyZ2VVbmlmb3JtcyggW1xyXG5cdFx0XHRVbmlmb3Jtc0xpYi5zcHJpdGUsXHJcblx0XHRcdFVuaWZvcm1zTGliLmZvZ1xyXG5cdFx0XSApLFxyXG5cclxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsuc3ByaXRlX3ZlcnQsXHJcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsuc3ByaXRlX2ZyYWdcclxuXHJcblx0fSxcclxuXHJcblx0YmFja2dyb3VuZDoge1xyXG5cclxuXHRcdHVuaWZvcm1zOiB7XHJcblx0XHRcdHV2VHJhbnNmb3JtOiB7IHZhbHVlOiAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXgzKCkgfSxcclxuXHRcdFx0dDJEOiB7IHZhbHVlOiBudWxsIH0sXHJcblx0XHRcdGJhY2tncm91bmRJbnRlbnNpdHk6IHsgdmFsdWU6IDEgfVxyXG5cdFx0fSxcclxuXHJcblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLmJhY2tncm91bmRfdmVydCxcclxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5iYWNrZ3JvdW5kX2ZyYWdcclxuXHJcblx0fSxcclxuXHJcblx0YmFja2dyb3VuZEN1YmU6IHtcclxuXHJcblx0XHR1bmlmb3Jtczoge1xyXG5cdFx0XHRlbnZNYXA6IHsgdmFsdWU6IG51bGwgfSxcclxuXHRcdFx0ZmxpcEVudk1hcDogeyB2YWx1ZTogLSAxIH0sXHJcblx0XHRcdGJhY2tncm91bmRCbHVycmluZXNzOiB7IHZhbHVlOiAwIH0sXHJcblx0XHRcdGJhY2tncm91bmRJbnRlbnNpdHk6IHsgdmFsdWU6IDEgfSxcclxuXHRcdFx0YmFja2dyb3VuZFJvdGF0aW9uOiB7IHZhbHVlOiAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXgzKCkgfVxyXG5cdFx0fSxcclxuXHJcblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLmJhY2tncm91bmRDdWJlX3ZlcnQsXHJcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsuYmFja2dyb3VuZEN1YmVfZnJhZ1xyXG5cclxuXHR9LFxyXG5cclxuXHRjdWJlOiB7XHJcblxyXG5cdFx0dW5pZm9ybXM6IHtcclxuXHRcdFx0dEN1YmU6IHsgdmFsdWU6IG51bGwgfSxcclxuXHRcdFx0dEZsaXA6IHsgdmFsdWU6IC0gMSB9LFxyXG5cdFx0XHRvcGFjaXR5OiB7IHZhbHVlOiAxLjAgfVxyXG5cdFx0fSxcclxuXHJcblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLmN1YmVfdmVydCxcclxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5jdWJlX2ZyYWdcclxuXHJcblx0fSxcclxuXHJcblx0ZXF1aXJlY3Q6IHtcclxuXHJcblx0XHR1bmlmb3Jtczoge1xyXG5cdFx0XHR0RXF1aXJlY3Q6IHsgdmFsdWU6IG51bGwgfSxcclxuXHRcdH0sXHJcblxyXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5lcXVpcmVjdF92ZXJ0LFxyXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLmVxdWlyZWN0X2ZyYWdcclxuXHJcblx0fSxcclxuXHJcblx0ZGlzdGFuY2VSR0JBOiB7XHJcblxyXG5cdFx0dW5pZm9ybXM6IC8qQF9fUFVSRV9fKi8gbWVyZ2VVbmlmb3JtcyggW1xyXG5cdFx0XHRVbmlmb3Jtc0xpYi5jb21tb24sXHJcblx0XHRcdFVuaWZvcm1zTGliLmRpc3BsYWNlbWVudG1hcCxcclxuXHRcdFx0e1xyXG5cdFx0XHRcdHJlZmVyZW5jZVBvc2l0aW9uOiB7IHZhbHVlOiAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCkgfSxcclxuXHRcdFx0XHRuZWFyRGlzdGFuY2U6IHsgdmFsdWU6IDEgfSxcclxuXHRcdFx0XHRmYXJEaXN0YW5jZTogeyB2YWx1ZTogMTAwMCB9XHJcblx0XHRcdH1cclxuXHRcdF0gKSxcclxuXHJcblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLmRpc3RhbmNlUkdCQV92ZXJ0LFxyXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLmRpc3RhbmNlUkdCQV9mcmFnXHJcblxyXG5cdH0sXHJcblxyXG5cdHNoYWRvdzoge1xyXG5cclxuXHRcdHVuaWZvcm1zOiAvKkBfX1BVUkVfXyovIG1lcmdlVW5pZm9ybXMoIFtcclxuXHRcdFx0VW5pZm9ybXNMaWIubGlnaHRzLFxyXG5cdFx0XHRVbmlmb3Jtc0xpYi5mb2csXHJcblx0XHRcdHtcclxuXHRcdFx0XHRjb2xvcjogeyB2YWx1ZTogLypAX19QVVJFX18qLyBuZXcgQ29sb3IoIDB4MDAwMDAgKSB9LFxyXG5cdFx0XHRcdG9wYWNpdHk6IHsgdmFsdWU6IDEuMCB9XHJcblx0XHRcdH0sXHJcblx0XHRdICksXHJcblxyXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5zaGFkb3dfdmVydCxcclxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5zaGFkb3dfZnJhZ1xyXG5cclxuXHR9XHJcblxyXG59O1xyXG5cclxuU2hhZGVyTGliLnBoeXNpY2FsID0ge1xyXG5cclxuXHR1bmlmb3JtczogLypAX19QVVJFX18qLyBtZXJnZVVuaWZvcm1zKCBbXHJcblx0XHRTaGFkZXJMaWIuc3RhbmRhcmQudW5pZm9ybXMsXHJcblx0XHR7XHJcblx0XHRcdGNsZWFyY29hdDogeyB2YWx1ZTogMCB9LFxyXG5cdFx0XHRjbGVhcmNvYXRNYXA6IHsgdmFsdWU6IG51bGwgfSxcclxuXHRcdFx0Y2xlYXJjb2F0TWFwVHJhbnNmb3JtOiB7IHZhbHVlOiAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXgzKCkgfSxcclxuXHRcdFx0Y2xlYXJjb2F0Tm9ybWFsTWFwOiB7IHZhbHVlOiBudWxsIH0sXHJcblx0XHRcdGNsZWFyY29hdE5vcm1hbE1hcFRyYW5zZm9ybTogeyB2YWx1ZTogLypAX19QVVJFX18qLyBuZXcgTWF0cml4MygpIH0sXHJcblx0XHRcdGNsZWFyY29hdE5vcm1hbFNjYWxlOiB7IHZhbHVlOiAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IyKCAxLCAxICkgfSxcclxuXHRcdFx0Y2xlYXJjb2F0Um91Z2huZXNzOiB7IHZhbHVlOiAwIH0sXHJcblx0XHRcdGNsZWFyY29hdFJvdWdobmVzc01hcDogeyB2YWx1ZTogbnVsbCB9LFxyXG5cdFx0XHRjbGVhcmNvYXRSb3VnaG5lc3NNYXBUcmFuc2Zvcm06IHsgdmFsdWU6IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDMoKSB9LFxyXG5cdFx0XHRkaXNwZXJzaW9uOiB7IHZhbHVlOiAwIH0sXHJcblx0XHRcdGlyaWRlc2NlbmNlOiB7IHZhbHVlOiAwIH0sXHJcblx0XHRcdGlyaWRlc2NlbmNlTWFwOiB7IHZhbHVlOiBudWxsIH0sXHJcblx0XHRcdGlyaWRlc2NlbmNlTWFwVHJhbnNmb3JtOiB7IHZhbHVlOiAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXgzKCkgfSxcclxuXHRcdFx0aXJpZGVzY2VuY2VJT1I6IHsgdmFsdWU6IDEuMyB9LFxyXG5cdFx0XHRpcmlkZXNjZW5jZVRoaWNrbmVzc01pbmltdW06IHsgdmFsdWU6IDEwMCB9LFxyXG5cdFx0XHRpcmlkZXNjZW5jZVRoaWNrbmVzc01heGltdW06IHsgdmFsdWU6IDQwMCB9LFxyXG5cdFx0XHRpcmlkZXNjZW5jZVRoaWNrbmVzc01hcDogeyB2YWx1ZTogbnVsbCB9LFxyXG5cdFx0XHRpcmlkZXNjZW5jZVRoaWNrbmVzc01hcFRyYW5zZm9ybTogeyB2YWx1ZTogLypAX19QVVJFX18qLyBuZXcgTWF0cml4MygpIH0sXHJcblx0XHRcdHNoZWVuOiB7IHZhbHVlOiAwIH0sXHJcblx0XHRcdHNoZWVuQ29sb3I6IHsgdmFsdWU6IC8qQF9fUFVSRV9fKi8gbmV3IENvbG9yKCAweDAwMDAwMCApIH0sXHJcblx0XHRcdHNoZWVuQ29sb3JNYXA6IHsgdmFsdWU6IG51bGwgfSxcclxuXHRcdFx0c2hlZW5Db2xvck1hcFRyYW5zZm9ybTogeyB2YWx1ZTogLypAX19QVVJFX18qLyBuZXcgTWF0cml4MygpIH0sXHJcblx0XHRcdHNoZWVuUm91Z2huZXNzOiB7IHZhbHVlOiAxIH0sXHJcblx0XHRcdHNoZWVuUm91Z2huZXNzTWFwOiB7IHZhbHVlOiBudWxsIH0sXHJcblx0XHRcdHNoZWVuUm91Z2huZXNzTWFwVHJhbnNmb3JtOiB7IHZhbHVlOiAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXgzKCkgfSxcclxuXHRcdFx0dHJhbnNtaXNzaW9uOiB7IHZhbHVlOiAwIH0sXHJcblx0XHRcdHRyYW5zbWlzc2lvbk1hcDogeyB2YWx1ZTogbnVsbCB9LFxyXG5cdFx0XHR0cmFuc21pc3Npb25NYXBUcmFuc2Zvcm06IHsgdmFsdWU6IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDMoKSB9LFxyXG5cdFx0XHR0cmFuc21pc3Npb25TYW1wbGVyU2l6ZTogeyB2YWx1ZTogLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMigpIH0sXHJcblx0XHRcdHRyYW5zbWlzc2lvblNhbXBsZXJNYXA6IHsgdmFsdWU6IG51bGwgfSxcclxuXHRcdFx0dGhpY2tuZXNzOiB7IHZhbHVlOiAwIH0sXHJcblx0XHRcdHRoaWNrbmVzc01hcDogeyB2YWx1ZTogbnVsbCB9LFxyXG5cdFx0XHR0aGlja25lc3NNYXBUcmFuc2Zvcm06IHsgdmFsdWU6IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDMoKSB9LFxyXG5cdFx0XHRhdHRlbnVhdGlvbkRpc3RhbmNlOiB7IHZhbHVlOiAwIH0sXHJcblx0XHRcdGF0dGVudWF0aW9uQ29sb3I6IHsgdmFsdWU6IC8qQF9fUFVSRV9fKi8gbmV3IENvbG9yKCAweDAwMDAwMCApIH0sXHJcblx0XHRcdHNwZWN1bGFyQ29sb3I6IHsgdmFsdWU6IC8qQF9fUFVSRV9fKi8gbmV3IENvbG9yKCAxLCAxLCAxICkgfSxcclxuXHRcdFx0c3BlY3VsYXJDb2xvck1hcDogeyB2YWx1ZTogbnVsbCB9LFxyXG5cdFx0XHRzcGVjdWxhckNvbG9yTWFwVHJhbnNmb3JtOiB7IHZhbHVlOiAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXgzKCkgfSxcclxuXHRcdFx0c3BlY3VsYXJJbnRlbnNpdHk6IHsgdmFsdWU6IDEgfSxcclxuXHRcdFx0c3BlY3VsYXJJbnRlbnNpdHlNYXA6IHsgdmFsdWU6IG51bGwgfSxcclxuXHRcdFx0c3BlY3VsYXJJbnRlbnNpdHlNYXBUcmFuc2Zvcm06IHsgdmFsdWU6IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDMoKSB9LFxyXG5cdFx0XHRhbmlzb3Ryb3B5VmVjdG9yOiB7IHZhbHVlOiAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IyKCkgfSxcclxuXHRcdFx0YW5pc290cm9weU1hcDogeyB2YWx1ZTogbnVsbCB9LFxyXG5cdFx0XHRhbmlzb3Ryb3B5TWFwVHJhbnNmb3JtOiB7IHZhbHVlOiAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXgzKCkgfSxcclxuXHRcdH1cclxuXHRdICksXHJcblxyXG5cdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHBoeXNpY2FsX3ZlcnQsXHJcblx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hwaHlzaWNhbF9mcmFnXHJcblxyXG59O1xyXG5cclxuXHJcbmV4cG9ydCB7IFNoYWRlckxpYiB9O1xyXG4iLCJpbXBvcnQgeyBCYWNrU2lkZSwgRnJvbnRTaWRlLCBDdWJlVVZSZWZsZWN0aW9uTWFwcGluZywgU1JHQlRyYW5zZmVyIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgQm94R2VvbWV0cnkgfSBmcm9tICcuLi8uLi9nZW9tZXRyaWVzL0JveEdlb21ldHJ5LmpzJztcclxuaW1wb3J0IHsgUGxhbmVHZW9tZXRyeSB9IGZyb20gJy4uLy4uL2dlb21ldHJpZXMvUGxhbmVHZW9tZXRyeS5qcyc7XHJcbmltcG9ydCB7IFNoYWRlck1hdGVyaWFsIH0gZnJvbSAnLi4vLi4vbWF0ZXJpYWxzL1NoYWRlck1hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi8uLi9tYXRoL0NvbG9yLmpzJztcclxuaW1wb3J0IHsgQ29sb3JNYW5hZ2VtZW50IH0gZnJvbSAnLi4vLi4vbWF0aC9Db2xvck1hbmFnZW1lbnQuanMnO1xyXG5pbXBvcnQgeyBFdWxlciB9IGZyb20gJy4uLy4uL21hdGgvRXVsZXIuanMnO1xyXG5pbXBvcnQgeyBNYXRyaXg0IH0gZnJvbSAnLi4vLi4vbWF0aC9NYXRyaXg0LmpzJztcclxuaW1wb3J0IHsgTWVzaCB9IGZyb20gJy4uLy4uL29iamVjdHMvTWVzaC5qcyc7XHJcbmltcG9ydCB7IFNoYWRlckxpYiB9IGZyb20gJy4uL3NoYWRlcnMvU2hhZGVyTGliLmpzJztcclxuaW1wb3J0IHsgY2xvbmVVbmlmb3JtcywgZ2V0VW5saXRVbmlmb3JtQ29sb3JTcGFjZSB9IGZyb20gJy4uL3NoYWRlcnMvVW5pZm9ybXNVdGlscy5qcyc7XHJcblxyXG5jb25zdCBfcmdiID0geyByOiAwLCBiOiAwLCBnOiAwIH07XHJcbmNvbnN0IF9lMSA9IC8qQF9fUFVSRV9fKi8gbmV3IEV1bGVyKCk7XHJcbmNvbnN0IF9tMSA9IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDQoKTtcclxuXHJcbmZ1bmN0aW9uIFdlYkdMQmFja2dyb3VuZCggcmVuZGVyZXIsIGN1YmVtYXBzLCBjdWJldXZtYXBzLCBzdGF0ZSwgb2JqZWN0cywgYWxwaGEsIHByZW11bHRpcGxpZWRBbHBoYSApIHtcclxuXHJcblx0Y29uc3QgY2xlYXJDb2xvciA9IG5ldyBDb2xvciggMHgwMDAwMDAgKTtcclxuXHRsZXQgY2xlYXJBbHBoYSA9IGFscGhhID09PSB0cnVlID8gMCA6IDE7XHJcblxyXG5cdGxldCBwbGFuZU1lc2g7XHJcblx0bGV0IGJveE1lc2g7XHJcblxyXG5cdGxldCBjdXJyZW50QmFja2dyb3VuZCA9IG51bGw7XHJcblx0bGV0IGN1cnJlbnRCYWNrZ3JvdW5kVmVyc2lvbiA9IDA7XHJcblx0bGV0IGN1cnJlbnRUb25lbWFwcGluZyA9IG51bGw7XHJcblxyXG5cdGZ1bmN0aW9uIGdldEJhY2tncm91bmQoIHNjZW5lICkge1xyXG5cclxuXHRcdGxldCBiYWNrZ3JvdW5kID0gc2NlbmUuaXNTY2VuZSA9PT0gdHJ1ZSA/IHNjZW5lLmJhY2tncm91bmQgOiBudWxsO1xyXG5cclxuXHRcdGlmICggYmFja2dyb3VuZCAmJiBiYWNrZ3JvdW5kLmlzVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdGNvbnN0IHVzZVBNUkVNID0gc2NlbmUuYmFja2dyb3VuZEJsdXJyaW5lc3MgPiAwOyAvLyB1c2UgUE1SRU0gaWYgdGhlIHVzZXIgd2FudHMgdG8gYmx1ciB0aGUgYmFja2dyb3VuZFxyXG5cdFx0XHRiYWNrZ3JvdW5kID0gKCB1c2VQTVJFTSA/IGN1YmV1dm1hcHMgOiBjdWJlbWFwcyApLmdldCggYmFja2dyb3VuZCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gYmFja2dyb3VuZDtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiByZW5kZXIoIHNjZW5lICkge1xyXG5cclxuXHRcdGxldCBmb3JjZUNsZWFyID0gZmFsc2U7XHJcblx0XHRjb25zdCBiYWNrZ3JvdW5kID0gZ2V0QmFja2dyb3VuZCggc2NlbmUgKTtcclxuXHJcblx0XHRpZiAoIGJhY2tncm91bmQgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRzZXRDbGVhciggY2xlYXJDb2xvciwgY2xlYXJBbHBoYSApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGJhY2tncm91bmQgJiYgYmFja2dyb3VuZC5pc0NvbG9yICkge1xyXG5cclxuXHRcdFx0c2V0Q2xlYXIoIGJhY2tncm91bmQsIDEgKTtcclxuXHRcdFx0Zm9yY2VDbGVhciA9IHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGVudmlyb25tZW50QmxlbmRNb2RlID0gcmVuZGVyZXIueHIuZ2V0RW52aXJvbm1lbnRCbGVuZE1vZGUoKTtcclxuXHJcblx0XHRpZiAoIGVudmlyb25tZW50QmxlbmRNb2RlID09PSAnYWRkaXRpdmUnICkge1xyXG5cclxuXHRcdFx0c3RhdGUuYnVmZmVycy5jb2xvci5zZXRDbGVhciggMCwgMCwgMCwgMSwgcHJlbXVsdGlwbGllZEFscGhhICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggZW52aXJvbm1lbnRCbGVuZE1vZGUgPT09ICdhbHBoYS1ibGVuZCcgKSB7XHJcblxyXG5cdFx0XHRzdGF0ZS5idWZmZXJzLmNvbG9yLnNldENsZWFyKCAwLCAwLCAwLCAwLCBwcmVtdWx0aXBsaWVkQWxwaGEgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCByZW5kZXJlci5hdXRvQ2xlYXIgfHwgZm9yY2VDbGVhciApIHtcclxuXHJcblx0XHRcdC8vIGJ1ZmZlcnMgbWlnaHQgbm90IGJlIHdyaXRhYmxlIHdoaWNoIGlzIHJlcXVpcmVkIHRvIGVuc3VyZSBhIGNvcnJlY3QgY2xlYXJcclxuXHJcblx0XHRcdHN0YXRlLmJ1ZmZlcnMuZGVwdGguc2V0VGVzdCggdHJ1ZSApO1xyXG5cdFx0XHRzdGF0ZS5idWZmZXJzLmRlcHRoLnNldE1hc2soIHRydWUgKTtcclxuXHRcdFx0c3RhdGUuYnVmZmVycy5jb2xvci5zZXRNYXNrKCB0cnVlICk7XHJcblxyXG5cdFx0XHRyZW5kZXJlci5jbGVhciggcmVuZGVyZXIuYXV0b0NsZWFyQ29sb3IsIHJlbmRlcmVyLmF1dG9DbGVhckRlcHRoLCByZW5kZXJlci5hdXRvQ2xlYXJTdGVuY2lsICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGFkZFRvUmVuZGVyTGlzdCggcmVuZGVyTGlzdCwgc2NlbmUgKSB7XHJcblxyXG5cdFx0Y29uc3QgYmFja2dyb3VuZCA9IGdldEJhY2tncm91bmQoIHNjZW5lICk7XHJcblxyXG5cdFx0aWYgKCBiYWNrZ3JvdW5kICYmICggYmFja2dyb3VuZC5pc0N1YmVUZXh0dXJlIHx8IGJhY2tncm91bmQubWFwcGluZyA9PT0gQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmcgKSApIHtcclxuXHJcblx0XHRcdGlmICggYm94TWVzaCA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRib3hNZXNoID0gbmV3IE1lc2goXHJcblx0XHRcdFx0XHRuZXcgQm94R2VvbWV0cnkoIDEsIDEsIDEgKSxcclxuXHRcdFx0XHRcdG5ldyBTaGFkZXJNYXRlcmlhbCgge1xyXG5cdFx0XHRcdFx0XHRuYW1lOiAnQmFja2dyb3VuZEN1YmVNYXRlcmlhbCcsXHJcblx0XHRcdFx0XHRcdHVuaWZvcm1zOiBjbG9uZVVuaWZvcm1zKCBTaGFkZXJMaWIuYmFja2dyb3VuZEN1YmUudW5pZm9ybXMgKSxcclxuXHRcdFx0XHRcdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJMaWIuYmFja2dyb3VuZEN1YmUudmVydGV4U2hhZGVyLFxyXG5cdFx0XHRcdFx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyTGliLmJhY2tncm91bmRDdWJlLmZyYWdtZW50U2hhZGVyLFxyXG5cdFx0XHRcdFx0XHRzaWRlOiBCYWNrU2lkZSxcclxuXHRcdFx0XHRcdFx0ZGVwdGhUZXN0OiBmYWxzZSxcclxuXHRcdFx0XHRcdFx0ZGVwdGhXcml0ZTogZmFsc2UsXHJcblx0XHRcdFx0XHRcdGZvZzogZmFsc2UsXHJcblx0XHRcdFx0XHRcdGFsbG93T3ZlcnJpZGU6IGZhbHNlXHJcblx0XHRcdFx0XHR9IClcclxuXHRcdFx0XHQpO1xyXG5cclxuXHRcdFx0XHRib3hNZXNoLmdlb21ldHJ5LmRlbGV0ZUF0dHJpYnV0ZSggJ25vcm1hbCcgKTtcclxuXHRcdFx0XHRib3hNZXNoLmdlb21ldHJ5LmRlbGV0ZUF0dHJpYnV0ZSggJ3V2JyApO1xyXG5cclxuXHRcdFx0XHRib3hNZXNoLm9uQmVmb3JlUmVuZGVyID0gZnVuY3Rpb24gKCByZW5kZXJlciwgc2NlbmUsIGNhbWVyYSApIHtcclxuXHJcblx0XHRcdFx0XHR0aGlzLm1hdHJpeFdvcmxkLmNvcHlQb3NpdGlvbiggY2FtZXJhLm1hdHJpeFdvcmxkICk7XHJcblxyXG5cdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdC8vIGFkZCBcImVudk1hcFwiIG1hdGVyaWFsIHByb3BlcnR5IHNvIHRoZSByZW5kZXJlciBjYW4gZXZhbHVhdGUgaXQgbGlrZSBmb3IgYnVpbHQtaW4gbWF0ZXJpYWxzXHJcblx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCBib3hNZXNoLm1hdGVyaWFsLCAnZW52TWFwJywge1xyXG5cclxuXHRcdFx0XHRcdGdldDogZnVuY3Rpb24gKCkge1xyXG5cclxuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMudW5pZm9ybXMuZW52TWFwLnZhbHVlO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fSApO1xyXG5cclxuXHRcdFx0XHRvYmplY3RzLnVwZGF0ZSggYm94TWVzaCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0X2UxLmNvcHkoIHNjZW5lLmJhY2tncm91bmRSb3RhdGlvbiApO1xyXG5cclxuXHRcdFx0Ly8gYWNjb21tb2RhdGUgbGVmdC1oYW5kZWQgZnJhbWVcclxuXHRcdFx0X2UxLnggKj0gLSAxOyBfZTEueSAqPSAtIDE7IF9lMS56ICo9IC0gMTtcclxuXHJcblx0XHRcdGlmICggYmFja2dyb3VuZC5pc0N1YmVUZXh0dXJlICYmIGJhY2tncm91bmQuaXNSZW5kZXJUYXJnZXRUZXh0dXJlID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdFx0Ly8gZW52aXJvbm1lbnQgbWFwcyB3aGljaCBhcmUgbm90IGN1YmUgcmVuZGVyIHRhcmdldHMgb3IgUE1SRU1zIGZvbGxvdyBhIGRpZmZlcmVudCBjb252ZW50aW9uXHJcblx0XHRcdFx0X2UxLnkgKj0gLSAxO1xyXG5cdFx0XHRcdF9lMS56ICo9IC0gMTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGJveE1lc2gubWF0ZXJpYWwudW5pZm9ybXMuZW52TWFwLnZhbHVlID0gYmFja2dyb3VuZDtcclxuXHRcdFx0Ym94TWVzaC5tYXRlcmlhbC51bmlmb3Jtcy5mbGlwRW52TWFwLnZhbHVlID0gKCBiYWNrZ3JvdW5kLmlzQ3ViZVRleHR1cmUgJiYgYmFja2dyb3VuZC5pc1JlbmRlclRhcmdldFRleHR1cmUgPT09IGZhbHNlICkgPyAtIDEgOiAxO1xyXG5cdFx0XHRib3hNZXNoLm1hdGVyaWFsLnVuaWZvcm1zLmJhY2tncm91bmRCbHVycmluZXNzLnZhbHVlID0gc2NlbmUuYmFja2dyb3VuZEJsdXJyaW5lc3M7XHJcblx0XHRcdGJveE1lc2gubWF0ZXJpYWwudW5pZm9ybXMuYmFja2dyb3VuZEludGVuc2l0eS52YWx1ZSA9IHNjZW5lLmJhY2tncm91bmRJbnRlbnNpdHk7XHJcblx0XHRcdGJveE1lc2gubWF0ZXJpYWwudW5pZm9ybXMuYmFja2dyb3VuZFJvdGF0aW9uLnZhbHVlLnNldEZyb21NYXRyaXg0KCBfbTEubWFrZVJvdGF0aW9uRnJvbUV1bGVyKCBfZTEgKSApO1xyXG5cdFx0XHRib3hNZXNoLm1hdGVyaWFsLnRvbmVNYXBwZWQgPSBDb2xvck1hbmFnZW1lbnQuZ2V0VHJhbnNmZXIoIGJhY2tncm91bmQuY29sb3JTcGFjZSApICE9PSBTUkdCVHJhbnNmZXI7XHJcblxyXG5cdFx0XHRpZiAoIGN1cnJlbnRCYWNrZ3JvdW5kICE9PSBiYWNrZ3JvdW5kIHx8XHJcblx0XHRcdFx0Y3VycmVudEJhY2tncm91bmRWZXJzaW9uICE9PSBiYWNrZ3JvdW5kLnZlcnNpb24gfHxcclxuXHRcdFx0XHRjdXJyZW50VG9uZW1hcHBpbmcgIT09IHJlbmRlcmVyLnRvbmVNYXBwaW5nICkge1xyXG5cclxuXHRcdFx0XHRib3hNZXNoLm1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0Y3VycmVudEJhY2tncm91bmQgPSBiYWNrZ3JvdW5kO1xyXG5cdFx0XHRcdGN1cnJlbnRCYWNrZ3JvdW5kVmVyc2lvbiA9IGJhY2tncm91bmQudmVyc2lvbjtcclxuXHRcdFx0XHRjdXJyZW50VG9uZW1hcHBpbmcgPSByZW5kZXJlci50b25lTWFwcGluZztcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGJveE1lc2gubGF5ZXJzLmVuYWJsZUFsbCgpO1xyXG5cclxuXHRcdFx0Ly8gcHVzaCB0byB0aGUgcHJlLXNvcnRlZCBvcGFxdWUgcmVuZGVyIGxpc3RcclxuXHRcdFx0cmVuZGVyTGlzdC51bnNoaWZ0KCBib3hNZXNoLCBib3hNZXNoLmdlb21ldHJ5LCBib3hNZXNoLm1hdGVyaWFsLCAwLCAwLCBudWxsICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggYmFja2dyb3VuZCAmJiBiYWNrZ3JvdW5kLmlzVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdGlmICggcGxhbmVNZXNoID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdHBsYW5lTWVzaCA9IG5ldyBNZXNoKFxyXG5cdFx0XHRcdFx0bmV3IFBsYW5lR2VvbWV0cnkoIDIsIDIgKSxcclxuXHRcdFx0XHRcdG5ldyBTaGFkZXJNYXRlcmlhbCgge1xyXG5cdFx0XHRcdFx0XHRuYW1lOiAnQmFja2dyb3VuZE1hdGVyaWFsJyxcclxuXHRcdFx0XHRcdFx0dW5pZm9ybXM6IGNsb25lVW5pZm9ybXMoIFNoYWRlckxpYi5iYWNrZ3JvdW5kLnVuaWZvcm1zICksXHJcblx0XHRcdFx0XHRcdHZlcnRleFNoYWRlcjogU2hhZGVyTGliLmJhY2tncm91bmQudmVydGV4U2hhZGVyLFxyXG5cdFx0XHRcdFx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyTGliLmJhY2tncm91bmQuZnJhZ21lbnRTaGFkZXIsXHJcblx0XHRcdFx0XHRcdHNpZGU6IEZyb250U2lkZSxcclxuXHRcdFx0XHRcdFx0ZGVwdGhUZXN0OiBmYWxzZSxcclxuXHRcdFx0XHRcdFx0ZGVwdGhXcml0ZTogZmFsc2UsXHJcblx0XHRcdFx0XHRcdGZvZzogZmFsc2UsXHJcblx0XHRcdFx0XHRcdGFsbG93T3ZlcnJpZGU6IGZhbHNlXHJcblx0XHRcdFx0XHR9IClcclxuXHRcdFx0XHQpO1xyXG5cclxuXHRcdFx0XHRwbGFuZU1lc2guZ2VvbWV0cnkuZGVsZXRlQXR0cmlidXRlKCAnbm9ybWFsJyApO1xyXG5cclxuXHRcdFx0XHQvLyBhZGQgXCJtYXBcIiBtYXRlcmlhbCBwcm9wZXJ0eSBzbyB0aGUgcmVuZGVyZXIgY2FuIGV2YWx1YXRlIGl0IGxpa2UgZm9yIGJ1aWx0LWluIG1hdGVyaWFsc1xyXG5cdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggcGxhbmVNZXNoLm1hdGVyaWFsLCAnbWFwJywge1xyXG5cclxuXHRcdFx0XHRcdGdldDogZnVuY3Rpb24gKCkge1xyXG5cclxuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMudW5pZm9ybXMudDJELnZhbHVlO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fSApO1xyXG5cclxuXHRcdFx0XHRvYmplY3RzLnVwZGF0ZSggcGxhbmVNZXNoICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRwbGFuZU1lc2gubWF0ZXJpYWwudW5pZm9ybXMudDJELnZhbHVlID0gYmFja2dyb3VuZDtcclxuXHRcdFx0cGxhbmVNZXNoLm1hdGVyaWFsLnVuaWZvcm1zLmJhY2tncm91bmRJbnRlbnNpdHkudmFsdWUgPSBzY2VuZS5iYWNrZ3JvdW5kSW50ZW5zaXR5O1xyXG5cdFx0XHRwbGFuZU1lc2gubWF0ZXJpYWwudG9uZU1hcHBlZCA9IENvbG9yTWFuYWdlbWVudC5nZXRUcmFuc2ZlciggYmFja2dyb3VuZC5jb2xvclNwYWNlICkgIT09IFNSR0JUcmFuc2ZlcjtcclxuXHJcblx0XHRcdGlmICggYmFja2dyb3VuZC5tYXRyaXhBdXRvVXBkYXRlID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRiYWNrZ3JvdW5kLnVwZGF0ZU1hdHJpeCgpO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cGxhbmVNZXNoLm1hdGVyaWFsLnVuaWZvcm1zLnV2VHJhbnNmb3JtLnZhbHVlLmNvcHkoIGJhY2tncm91bmQubWF0cml4ICk7XHJcblxyXG5cdFx0XHRpZiAoIGN1cnJlbnRCYWNrZ3JvdW5kICE9PSBiYWNrZ3JvdW5kIHx8XHJcblx0XHRcdFx0Y3VycmVudEJhY2tncm91bmRWZXJzaW9uICE9PSBiYWNrZ3JvdW5kLnZlcnNpb24gfHxcclxuXHRcdFx0XHRjdXJyZW50VG9uZW1hcHBpbmcgIT09IHJlbmRlcmVyLnRvbmVNYXBwaW5nICkge1xyXG5cclxuXHRcdFx0XHRwbGFuZU1lc2gubWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHRjdXJyZW50QmFja2dyb3VuZCA9IGJhY2tncm91bmQ7XHJcblx0XHRcdFx0Y3VycmVudEJhY2tncm91bmRWZXJzaW9uID0gYmFja2dyb3VuZC52ZXJzaW9uO1xyXG5cdFx0XHRcdGN1cnJlbnRUb25lbWFwcGluZyA9IHJlbmRlcmVyLnRvbmVNYXBwaW5nO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cGxhbmVNZXNoLmxheWVycy5lbmFibGVBbGwoKTtcclxuXHJcblx0XHRcdC8vIHB1c2ggdG8gdGhlIHByZS1zb3J0ZWQgb3BhcXVlIHJlbmRlciBsaXN0XHJcblx0XHRcdHJlbmRlckxpc3QudW5zaGlmdCggcGxhbmVNZXNoLCBwbGFuZU1lc2guZ2VvbWV0cnksIHBsYW5lTWVzaC5tYXRlcmlhbCwgMCwgMCwgbnVsbCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBzZXRDbGVhciggY29sb3IsIGFscGhhICkge1xyXG5cclxuXHRcdGNvbG9yLmdldFJHQiggX3JnYiwgZ2V0VW5saXRVbmlmb3JtQ29sb3JTcGFjZSggcmVuZGVyZXIgKSApO1xyXG5cclxuXHRcdHN0YXRlLmJ1ZmZlcnMuY29sb3Iuc2V0Q2xlYXIoIF9yZ2IuciwgX3JnYi5nLCBfcmdiLmIsIGFscGhhLCBwcmVtdWx0aXBsaWVkQWxwaGEgKTtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBkaXNwb3NlKCkge1xyXG5cclxuXHRcdGlmICggYm94TWVzaCAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Ym94TWVzaC5nZW9tZXRyeS5kaXNwb3NlKCk7XHJcblx0XHRcdGJveE1lc2gubWF0ZXJpYWwuZGlzcG9zZSgpO1xyXG5cclxuXHRcdFx0Ym94TWVzaCA9IHVuZGVmaW5lZDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBwbGFuZU1lc2ggIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHBsYW5lTWVzaC5nZW9tZXRyeS5kaXNwb3NlKCk7XHJcblx0XHRcdHBsYW5lTWVzaC5tYXRlcmlhbC5kaXNwb3NlKCk7XHJcblxyXG5cdFx0XHRwbGFuZU1lc2ggPSB1bmRlZmluZWQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiB7XHJcblxyXG5cdFx0Z2V0Q2xlYXJDb2xvcjogZnVuY3Rpb24gKCkge1xyXG5cclxuXHRcdFx0cmV0dXJuIGNsZWFyQ29sb3I7XHJcblxyXG5cdFx0fSxcclxuXHRcdHNldENsZWFyQ29sb3I6IGZ1bmN0aW9uICggY29sb3IsIGFscGhhID0gMSApIHtcclxuXHJcblx0XHRcdGNsZWFyQ29sb3Iuc2V0KCBjb2xvciApO1xyXG5cdFx0XHRjbGVhckFscGhhID0gYWxwaGE7XHJcblx0XHRcdHNldENsZWFyKCBjbGVhckNvbG9yLCBjbGVhckFscGhhICk7XHJcblxyXG5cdFx0fSxcclxuXHRcdGdldENsZWFyQWxwaGE6IGZ1bmN0aW9uICgpIHtcclxuXHJcblx0XHRcdHJldHVybiBjbGVhckFscGhhO1xyXG5cclxuXHRcdH0sXHJcblx0XHRzZXRDbGVhckFscGhhOiBmdW5jdGlvbiAoIGFscGhhICkge1xyXG5cclxuXHRcdFx0Y2xlYXJBbHBoYSA9IGFscGhhO1xyXG5cdFx0XHRzZXRDbGVhciggY2xlYXJDb2xvciwgY2xlYXJBbHBoYSApO1xyXG5cclxuXHRcdH0sXHJcblx0XHRyZW5kZXI6IHJlbmRlcixcclxuXHRcdGFkZFRvUmVuZGVyTGlzdDogYWRkVG9SZW5kZXJMaXN0LFxyXG5cdFx0ZGlzcG9zZTogZGlzcG9zZVxyXG5cclxuXHR9O1xyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCB7IFdlYkdMQmFja2dyb3VuZCB9O1xyXG4iLCJpbXBvcnQgeyBJbnRUeXBlIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzLmpzJztcclxuXHJcbmZ1bmN0aW9uIFdlYkdMQmluZGluZ1N0YXRlcyggZ2wsIGF0dHJpYnV0ZXMgKSB7XHJcblxyXG5cdGNvbnN0IG1heFZlcnRleEF0dHJpYnV0ZXMgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9WRVJURVhfQVRUUklCUyApO1xyXG5cclxuXHRjb25zdCBiaW5kaW5nU3RhdGVzID0ge307XHJcblxyXG5cdGNvbnN0IGRlZmF1bHRTdGF0ZSA9IGNyZWF0ZUJpbmRpbmdTdGF0ZSggbnVsbCApO1xyXG5cdGxldCBjdXJyZW50U3RhdGUgPSBkZWZhdWx0U3RhdGU7XHJcblx0bGV0IGZvcmNlVXBkYXRlID0gZmFsc2U7XHJcblxyXG5cdGZ1bmN0aW9uIHNldHVwKCBvYmplY3QsIG1hdGVyaWFsLCBwcm9ncmFtLCBnZW9tZXRyeSwgaW5kZXggKSB7XHJcblxyXG5cdFx0bGV0IHVwZGF0ZUJ1ZmZlcnMgPSBmYWxzZTtcclxuXHJcblx0XHRjb25zdCBzdGF0ZSA9IGdldEJpbmRpbmdTdGF0ZSggZ2VvbWV0cnksIHByb2dyYW0sIG1hdGVyaWFsICk7XHJcblxyXG5cdFx0aWYgKCBjdXJyZW50U3RhdGUgIT09IHN0YXRlICkge1xyXG5cclxuXHRcdFx0Y3VycmVudFN0YXRlID0gc3RhdGU7XHJcblx0XHRcdGJpbmRWZXJ0ZXhBcnJheU9iamVjdCggY3VycmVudFN0YXRlLm9iamVjdCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR1cGRhdGVCdWZmZXJzID0gbmVlZHNVcGRhdGUoIG9iamVjdCwgZ2VvbWV0cnksIHByb2dyYW0sIGluZGV4ICk7XHJcblxyXG5cdFx0aWYgKCB1cGRhdGVCdWZmZXJzICkgc2F2ZUNhY2hlKCBvYmplY3QsIGdlb21ldHJ5LCBwcm9ncmFtLCBpbmRleCApO1xyXG5cclxuXHRcdGlmICggaW5kZXggIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRhdHRyaWJ1dGVzLnVwZGF0ZSggaW5kZXgsIGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdXBkYXRlQnVmZmVycyB8fCBmb3JjZVVwZGF0ZSApIHtcclxuXHJcblx0XHRcdGZvcmNlVXBkYXRlID0gZmFsc2U7XHJcblxyXG5cdFx0XHRzZXR1cFZlcnRleEF0dHJpYnV0ZXMoIG9iamVjdCwgbWF0ZXJpYWwsIHByb2dyYW0sIGdlb21ldHJ5ICk7XHJcblxyXG5cdFx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRnbC5iaW5kQnVmZmVyKCBnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgYXR0cmlidXRlcy5nZXQoIGluZGV4ICkuYnVmZmVyICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGNyZWF0ZVZlcnRleEFycmF5T2JqZWN0KCkge1xyXG5cclxuXHRcdHJldHVybiBnbC5jcmVhdGVWZXJ0ZXhBcnJheSgpO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGJpbmRWZXJ0ZXhBcnJheU9iamVjdCggdmFvICkge1xyXG5cclxuXHRcdHJldHVybiBnbC5iaW5kVmVydGV4QXJyYXkoIHZhbyApO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGRlbGV0ZVZlcnRleEFycmF5T2JqZWN0KCB2YW8gKSB7XHJcblxyXG5cdFx0cmV0dXJuIGdsLmRlbGV0ZVZlcnRleEFycmF5KCB2YW8gKTtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBnZXRCaW5kaW5nU3RhdGUoIGdlb21ldHJ5LCBwcm9ncmFtLCBtYXRlcmlhbCApIHtcclxuXHJcblx0XHRjb25zdCB3aXJlZnJhbWUgPSAoIG1hdGVyaWFsLndpcmVmcmFtZSA9PT0gdHJ1ZSApO1xyXG5cclxuXHRcdGxldCBwcm9ncmFtTWFwID0gYmluZGluZ1N0YXRlc1sgZ2VvbWV0cnkuaWQgXTtcclxuXHJcblx0XHRpZiAoIHByb2dyYW1NYXAgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHByb2dyYW1NYXAgPSB7fTtcclxuXHRcdFx0YmluZGluZ1N0YXRlc1sgZ2VvbWV0cnkuaWQgXSA9IHByb2dyYW1NYXA7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGxldCBzdGF0ZU1hcCA9IHByb2dyYW1NYXBbIHByb2dyYW0uaWQgXTtcclxuXHJcblx0XHRpZiAoIHN0YXRlTWFwID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRzdGF0ZU1hcCA9IHt9O1xyXG5cdFx0XHRwcm9ncmFtTWFwWyBwcm9ncmFtLmlkIF0gPSBzdGF0ZU1hcDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0bGV0IHN0YXRlID0gc3RhdGVNYXBbIHdpcmVmcmFtZSBdO1xyXG5cclxuXHRcdGlmICggc3RhdGUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHN0YXRlID0gY3JlYXRlQmluZGluZ1N0YXRlKCBjcmVhdGVWZXJ0ZXhBcnJheU9iamVjdCgpICk7XHJcblx0XHRcdHN0YXRlTWFwWyB3aXJlZnJhbWUgXSA9IHN0YXRlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gc3RhdGU7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gY3JlYXRlQmluZGluZ1N0YXRlKCB2YW8gKSB7XHJcblxyXG5cdFx0Y29uc3QgbmV3QXR0cmlidXRlcyA9IFtdO1xyXG5cdFx0Y29uc3QgZW5hYmxlZEF0dHJpYnV0ZXMgPSBbXTtcclxuXHRcdGNvbnN0IGF0dHJpYnV0ZURpdmlzb3JzID0gW107XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgbWF4VmVydGV4QXR0cmlidXRlczsgaSArKyApIHtcclxuXHJcblx0XHRcdG5ld0F0dHJpYnV0ZXNbIGkgXSA9IDA7XHJcblx0XHRcdGVuYWJsZWRBdHRyaWJ1dGVzWyBpIF0gPSAwO1xyXG5cdFx0XHRhdHRyaWJ1dGVEaXZpc29yc1sgaSBdID0gMDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHtcclxuXHJcblx0XHRcdC8vIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IG9uIG5vbi1WQU8gc3VwcG9ydCBicm93c2VyXHJcblx0XHRcdGdlb21ldHJ5OiBudWxsLFxyXG5cdFx0XHRwcm9ncmFtOiBudWxsLFxyXG5cdFx0XHR3aXJlZnJhbWU6IGZhbHNlLFxyXG5cclxuXHRcdFx0bmV3QXR0cmlidXRlczogbmV3QXR0cmlidXRlcyxcclxuXHRcdFx0ZW5hYmxlZEF0dHJpYnV0ZXM6IGVuYWJsZWRBdHRyaWJ1dGVzLFxyXG5cdFx0XHRhdHRyaWJ1dGVEaXZpc29yczogYXR0cmlidXRlRGl2aXNvcnMsXHJcblx0XHRcdG9iamVjdDogdmFvLFxyXG5cdFx0XHRhdHRyaWJ1dGVzOiB7fSxcclxuXHRcdFx0aW5kZXg6IG51bGxcclxuXHJcblx0XHR9O1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIG5lZWRzVXBkYXRlKCBvYmplY3QsIGdlb21ldHJ5LCBwcm9ncmFtLCBpbmRleCApIHtcclxuXHJcblx0XHRjb25zdCBjYWNoZWRBdHRyaWJ1dGVzID0gY3VycmVudFN0YXRlLmF0dHJpYnV0ZXM7XHJcblx0XHRjb25zdCBnZW9tZXRyeUF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzO1xyXG5cclxuXHRcdGxldCBhdHRyaWJ1dGVzTnVtID0gMDtcclxuXHJcblx0XHRjb25zdCBwcm9ncmFtQXR0cmlidXRlcyA9IHByb2dyYW0uZ2V0QXR0cmlidXRlcygpO1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IG5hbWUgaW4gcHJvZ3JhbUF0dHJpYnV0ZXMgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBwcm9ncmFtQXR0cmlidXRlID0gcHJvZ3JhbUF0dHJpYnV0ZXNbIG5hbWUgXTtcclxuXHJcblx0XHRcdGlmICggcHJvZ3JhbUF0dHJpYnV0ZS5sb2NhdGlvbiA+PSAwICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBjYWNoZWRBdHRyaWJ1dGUgPSBjYWNoZWRBdHRyaWJ1dGVzWyBuYW1lIF07XHJcblx0XHRcdFx0bGV0IGdlb21ldHJ5QXR0cmlidXRlID0gZ2VvbWV0cnlBdHRyaWJ1dGVzWyBuYW1lIF07XHJcblxyXG5cdFx0XHRcdGlmICggZ2VvbWV0cnlBdHRyaWJ1dGUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIG5hbWUgPT09ICdpbnN0YW5jZU1hdHJpeCcgJiYgb2JqZWN0Lmluc3RhbmNlTWF0cml4ICkgZ2VvbWV0cnlBdHRyaWJ1dGUgPSBvYmplY3QuaW5zdGFuY2VNYXRyaXg7XHJcblx0XHRcdFx0XHRpZiAoIG5hbWUgPT09ICdpbnN0YW5jZUNvbG9yJyAmJiBvYmplY3QuaW5zdGFuY2VDb2xvciApIGdlb21ldHJ5QXR0cmlidXRlID0gb2JqZWN0Lmluc3RhbmNlQ29sb3I7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKCBjYWNoZWRBdHRyaWJ1dGUgPT09IHVuZGVmaW5lZCApIHJldHVybiB0cnVlO1xyXG5cclxuXHRcdFx0XHRpZiAoIGNhY2hlZEF0dHJpYnV0ZS5hdHRyaWJ1dGUgIT09IGdlb21ldHJ5QXR0cmlidXRlICkgcmV0dXJuIHRydWU7XHJcblxyXG5cdFx0XHRcdGlmICggZ2VvbWV0cnlBdHRyaWJ1dGUgJiYgY2FjaGVkQXR0cmlidXRlLmRhdGEgIT09IGdlb21ldHJ5QXR0cmlidXRlLmRhdGEgKSByZXR1cm4gdHJ1ZTtcclxuXHJcblx0XHRcdFx0YXR0cmlidXRlc051bSArKztcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBjdXJyZW50U3RhdGUuYXR0cmlidXRlc051bSAhPT0gYXR0cmlidXRlc051bSApIHJldHVybiB0cnVlO1xyXG5cclxuXHRcdGlmICggY3VycmVudFN0YXRlLmluZGV4ICE9PSBpbmRleCApIHJldHVybiB0cnVlO1xyXG5cclxuXHRcdHJldHVybiBmYWxzZTtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBzYXZlQ2FjaGUoIG9iamVjdCwgZ2VvbWV0cnksIHByb2dyYW0sIGluZGV4ICkge1xyXG5cclxuXHRcdGNvbnN0IGNhY2hlID0ge307XHJcblx0XHRjb25zdCBhdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlcztcclxuXHRcdGxldCBhdHRyaWJ1dGVzTnVtID0gMDtcclxuXHJcblx0XHRjb25zdCBwcm9ncmFtQXR0cmlidXRlcyA9IHByb2dyYW0uZ2V0QXR0cmlidXRlcygpO1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IG5hbWUgaW4gcHJvZ3JhbUF0dHJpYnV0ZXMgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBwcm9ncmFtQXR0cmlidXRlID0gcHJvZ3JhbUF0dHJpYnV0ZXNbIG5hbWUgXTtcclxuXHJcblx0XHRcdGlmICggcHJvZ3JhbUF0dHJpYnV0ZS5sb2NhdGlvbiA+PSAwICkge1xyXG5cclxuXHRcdFx0XHRsZXQgYXR0cmlidXRlID0gYXR0cmlidXRlc1sgbmFtZSBdO1xyXG5cclxuXHRcdFx0XHRpZiAoIGF0dHJpYnV0ZSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdGlmICggbmFtZSA9PT0gJ2luc3RhbmNlTWF0cml4JyAmJiBvYmplY3QuaW5zdGFuY2VNYXRyaXggKSBhdHRyaWJ1dGUgPSBvYmplY3QuaW5zdGFuY2VNYXRyaXg7XHJcblx0XHRcdFx0XHRpZiAoIG5hbWUgPT09ICdpbnN0YW5jZUNvbG9yJyAmJiBvYmplY3QuaW5zdGFuY2VDb2xvciApIGF0dHJpYnV0ZSA9IG9iamVjdC5pbnN0YW5jZUNvbG9yO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGNvbnN0IGRhdGEgPSB7fTtcclxuXHRcdFx0XHRkYXRhLmF0dHJpYnV0ZSA9IGF0dHJpYnV0ZTtcclxuXHJcblx0XHRcdFx0aWYgKCBhdHRyaWJ1dGUgJiYgYXR0cmlidXRlLmRhdGEgKSB7XHJcblxyXG5cdFx0XHRcdFx0ZGF0YS5kYXRhID0gYXR0cmlidXRlLmRhdGE7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Y2FjaGVbIG5hbWUgXSA9IGRhdGE7XHJcblxyXG5cdFx0XHRcdGF0dHJpYnV0ZXNOdW0gKys7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGN1cnJlbnRTdGF0ZS5hdHRyaWJ1dGVzID0gY2FjaGU7XHJcblx0XHRjdXJyZW50U3RhdGUuYXR0cmlidXRlc051bSA9IGF0dHJpYnV0ZXNOdW07XHJcblxyXG5cdFx0Y3VycmVudFN0YXRlLmluZGV4ID0gaW5kZXg7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gaW5pdEF0dHJpYnV0ZXMoKSB7XHJcblxyXG5cdFx0Y29uc3QgbmV3QXR0cmlidXRlcyA9IGN1cnJlbnRTdGF0ZS5uZXdBdHRyaWJ1dGVzO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBuZXdBdHRyaWJ1dGVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdFx0bmV3QXR0cmlidXRlc1sgaSBdID0gMDtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gZW5hYmxlQXR0cmlidXRlKCBhdHRyaWJ1dGUgKSB7XHJcblxyXG5cdFx0ZW5hYmxlQXR0cmlidXRlQW5kRGl2aXNvciggYXR0cmlidXRlLCAwICk7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gZW5hYmxlQXR0cmlidXRlQW5kRGl2aXNvciggYXR0cmlidXRlLCBtZXNoUGVyQXR0cmlidXRlICkge1xyXG5cclxuXHRcdGNvbnN0IG5ld0F0dHJpYnV0ZXMgPSBjdXJyZW50U3RhdGUubmV3QXR0cmlidXRlcztcclxuXHRcdGNvbnN0IGVuYWJsZWRBdHRyaWJ1dGVzID0gY3VycmVudFN0YXRlLmVuYWJsZWRBdHRyaWJ1dGVzO1xyXG5cdFx0Y29uc3QgYXR0cmlidXRlRGl2aXNvcnMgPSBjdXJyZW50U3RhdGUuYXR0cmlidXRlRGl2aXNvcnM7XHJcblxyXG5cdFx0bmV3QXR0cmlidXRlc1sgYXR0cmlidXRlIF0gPSAxO1xyXG5cclxuXHRcdGlmICggZW5hYmxlZEF0dHJpYnV0ZXNbIGF0dHJpYnV0ZSBdID09PSAwICkge1xyXG5cclxuXHRcdFx0Z2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoIGF0dHJpYnV0ZSApO1xyXG5cdFx0XHRlbmFibGVkQXR0cmlidXRlc1sgYXR0cmlidXRlIF0gPSAxO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGF0dHJpYnV0ZURpdmlzb3JzWyBhdHRyaWJ1dGUgXSAhPT0gbWVzaFBlckF0dHJpYnV0ZSApIHtcclxuXHJcblx0XHRcdGdsLnZlcnRleEF0dHJpYkRpdmlzb3IoIGF0dHJpYnV0ZSwgbWVzaFBlckF0dHJpYnV0ZSApO1xyXG5cdFx0XHRhdHRyaWJ1dGVEaXZpc29yc1sgYXR0cmlidXRlIF0gPSBtZXNoUGVyQXR0cmlidXRlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBkaXNhYmxlVW51c2VkQXR0cmlidXRlcygpIHtcclxuXHJcblx0XHRjb25zdCBuZXdBdHRyaWJ1dGVzID0gY3VycmVudFN0YXRlLm5ld0F0dHJpYnV0ZXM7XHJcblx0XHRjb25zdCBlbmFibGVkQXR0cmlidXRlcyA9IGN1cnJlbnRTdGF0ZS5lbmFibGVkQXR0cmlidXRlcztcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gZW5hYmxlZEF0dHJpYnV0ZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGVuYWJsZWRBdHRyaWJ1dGVzWyBpIF0gIT09IG5ld0F0dHJpYnV0ZXNbIGkgXSApIHtcclxuXHJcblx0XHRcdFx0Z2wuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KCBpICk7XHJcblx0XHRcdFx0ZW5hYmxlZEF0dHJpYnV0ZXNbIGkgXSA9IDA7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHZlcnRleEF0dHJpYlBvaW50ZXIoIGluZGV4LCBzaXplLCB0eXBlLCBub3JtYWxpemVkLCBzdHJpZGUsIG9mZnNldCwgaW50ZWdlciApIHtcclxuXHJcblx0XHRpZiAoIGludGVnZXIgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRnbC52ZXJ0ZXhBdHRyaWJJUG9pbnRlciggaW5kZXgsIHNpemUsIHR5cGUsIHN0cmlkZSwgb2Zmc2V0ICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoIGluZGV4LCBzaXplLCB0eXBlLCBub3JtYWxpemVkLCBzdHJpZGUsIG9mZnNldCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBzZXR1cFZlcnRleEF0dHJpYnV0ZXMoIG9iamVjdCwgbWF0ZXJpYWwsIHByb2dyYW0sIGdlb21ldHJ5ICkge1xyXG5cclxuXHRcdGluaXRBdHRyaWJ1dGVzKCk7XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnlBdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlcztcclxuXHJcblx0XHRjb25zdCBwcm9ncmFtQXR0cmlidXRlcyA9IHByb2dyYW0uZ2V0QXR0cmlidXRlcygpO1xyXG5cclxuXHRcdGNvbnN0IG1hdGVyaWFsRGVmYXVsdEF0dHJpYnV0ZVZhbHVlcyA9IG1hdGVyaWFsLmRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXM7XHJcblxyXG5cdFx0Zm9yICggY29uc3QgbmFtZSBpbiBwcm9ncmFtQXR0cmlidXRlcyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHByb2dyYW1BdHRyaWJ1dGUgPSBwcm9ncmFtQXR0cmlidXRlc1sgbmFtZSBdO1xyXG5cclxuXHRcdFx0aWYgKCBwcm9ncmFtQXR0cmlidXRlLmxvY2F0aW9uID49IDAgKSB7XHJcblxyXG5cdFx0XHRcdGxldCBnZW9tZXRyeUF0dHJpYnV0ZSA9IGdlb21ldHJ5QXR0cmlidXRlc1sgbmFtZSBdO1xyXG5cclxuXHRcdFx0XHRpZiAoIGdlb21ldHJ5QXR0cmlidXRlID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBuYW1lID09PSAnaW5zdGFuY2VNYXRyaXgnICYmIG9iamVjdC5pbnN0YW5jZU1hdHJpeCApIGdlb21ldHJ5QXR0cmlidXRlID0gb2JqZWN0Lmluc3RhbmNlTWF0cml4O1xyXG5cdFx0XHRcdFx0aWYgKCBuYW1lID09PSAnaW5zdGFuY2VDb2xvcicgJiYgb2JqZWN0Lmluc3RhbmNlQ29sb3IgKSBnZW9tZXRyeUF0dHJpYnV0ZSA9IG9iamVjdC5pbnN0YW5jZUNvbG9yO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICggZ2VvbWV0cnlBdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBub3JtYWxpemVkID0gZ2VvbWV0cnlBdHRyaWJ1dGUubm9ybWFsaXplZDtcclxuXHRcdFx0XHRcdGNvbnN0IHNpemUgPSBnZW9tZXRyeUF0dHJpYnV0ZS5pdGVtU2l6ZTtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLmdldCggZ2VvbWV0cnlBdHRyaWJ1dGUgKTtcclxuXHJcblx0XHRcdFx0XHQvLyBUT0RPIEF0dHJpYnV0ZSBtYXkgbm90IGJlIGF2YWlsYWJsZSBvbiBjb250ZXh0IHJlc3RvcmVcclxuXHJcblx0XHRcdFx0XHRpZiAoIGF0dHJpYnV0ZSA9PT0gdW5kZWZpbmVkICkgY29udGludWU7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgYnVmZmVyID0gYXR0cmlidXRlLmJ1ZmZlcjtcclxuXHRcdFx0XHRcdGNvbnN0IHR5cGUgPSBhdHRyaWJ1dGUudHlwZTtcclxuXHRcdFx0XHRcdGNvbnN0IGJ5dGVzUGVyRWxlbWVudCA9IGF0dHJpYnV0ZS5ieXRlc1BlckVsZW1lbnQ7XHJcblxyXG5cdFx0XHRcdFx0Ly8gY2hlY2sgZm9yIGludGVnZXIgYXR0cmlidXRlc1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGludGVnZXIgPSAoIHR5cGUgPT09IGdsLklOVCB8fCB0eXBlID09PSBnbC5VTlNJR05FRF9JTlQgfHwgZ2VvbWV0cnlBdHRyaWJ1dGUuZ3B1VHlwZSA9PT0gSW50VHlwZSApO1xyXG5cclxuXHRcdFx0XHRcdGlmICggZ2VvbWV0cnlBdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnN0IGRhdGEgPSBnZW9tZXRyeUF0dHJpYnV0ZS5kYXRhO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBzdHJpZGUgPSBkYXRhLnN0cmlkZTtcclxuXHRcdFx0XHRcdFx0Y29uc3Qgb2Zmc2V0ID0gZ2VvbWV0cnlBdHRyaWJ1dGUub2Zmc2V0O1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCBkYXRhLmlzSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHByb2dyYW1BdHRyaWJ1dGUubG9jYXRpb25TaXplOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGVuYWJsZUF0dHJpYnV0ZUFuZERpdmlzb3IoIHByb2dyYW1BdHRyaWJ1dGUubG9jYXRpb24gKyBpLCBkYXRhLm1lc2hQZXJBdHRyaWJ1dGUgKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoIG9iamVjdC5pc0luc3RhbmNlZE1lc2ggIT09IHRydWUgJiYgZ2VvbWV0cnkuX21heEluc3RhbmNlQ291bnQgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRnZW9tZXRyeS5fbWF4SW5zdGFuY2VDb3VudCA9IGRhdGEubWVzaFBlckF0dHJpYnV0ZSAqIGRhdGEuY291bnQ7XHJcblxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHByb2dyYW1BdHRyaWJ1dGUubG9jYXRpb25TaXplOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGVuYWJsZUF0dHJpYnV0ZSggcHJvZ3JhbUF0dHJpYnV0ZS5sb2NhdGlvbiArIGkgKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0Z2wuYmluZEJ1ZmZlciggZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXIgKTtcclxuXHJcblx0XHRcdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHByb2dyYW1BdHRyaWJ1dGUubG9jYXRpb25TaXplOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHR2ZXJ0ZXhBdHRyaWJQb2ludGVyKFxyXG5cdFx0XHRcdFx0XHRcdFx0cHJvZ3JhbUF0dHJpYnV0ZS5sb2NhdGlvbiArIGksXHJcblx0XHRcdFx0XHRcdFx0XHRzaXplIC8gcHJvZ3JhbUF0dHJpYnV0ZS5sb2NhdGlvblNpemUsXHJcblx0XHRcdFx0XHRcdFx0XHR0eXBlLFxyXG5cdFx0XHRcdFx0XHRcdFx0bm9ybWFsaXplZCxcclxuXHRcdFx0XHRcdFx0XHRcdHN0cmlkZSAqIGJ5dGVzUGVyRWxlbWVudCxcclxuXHRcdFx0XHRcdFx0XHRcdCggb2Zmc2V0ICsgKCBzaXplIC8gcHJvZ3JhbUF0dHJpYnV0ZS5sb2NhdGlvblNpemUgKSAqIGkgKSAqIGJ5dGVzUGVyRWxlbWVudCxcclxuXHRcdFx0XHRcdFx0XHRcdGludGVnZXJcclxuXHRcdFx0XHRcdFx0XHQpO1xyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIGdlb21ldHJ5QXR0cmlidXRlLmlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBwcm9ncmFtQXR0cmlidXRlLmxvY2F0aW9uU2l6ZTsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRlbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yKCBwcm9ncmFtQXR0cmlidXRlLmxvY2F0aW9uICsgaSwgZ2VvbWV0cnlBdHRyaWJ1dGUubWVzaFBlckF0dHJpYnV0ZSApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmICggb2JqZWN0LmlzSW5zdGFuY2VkTWVzaCAhPT0gdHJ1ZSAmJiBnZW9tZXRyeS5fbWF4SW5zdGFuY2VDb3VudCA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGdlb21ldHJ5Ll9tYXhJbnN0YW5jZUNvdW50ID0gZ2VvbWV0cnlBdHRyaWJ1dGUubWVzaFBlckF0dHJpYnV0ZSAqIGdlb21ldHJ5QXR0cmlidXRlLmNvdW50O1xyXG5cclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBwcm9ncmFtQXR0cmlidXRlLmxvY2F0aW9uU2l6ZTsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRlbmFibGVBdHRyaWJ1dGUoIHByb2dyYW1BdHRyaWJ1dGUubG9jYXRpb24gKyBpICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdGdsLmJpbmRCdWZmZXIoIGdsLkFSUkFZX0JVRkZFUiwgYnVmZmVyICk7XHJcblxyXG5cdFx0XHRcdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBwcm9ncmFtQXR0cmlidXRlLmxvY2F0aW9uU2l6ZTsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0dmVydGV4QXR0cmliUG9pbnRlcihcclxuXHRcdFx0XHRcdFx0XHRcdHByb2dyYW1BdHRyaWJ1dGUubG9jYXRpb24gKyBpLFxyXG5cdFx0XHRcdFx0XHRcdFx0c2l6ZSAvIHByb2dyYW1BdHRyaWJ1dGUubG9jYXRpb25TaXplLFxyXG5cdFx0XHRcdFx0XHRcdFx0dHlwZSxcclxuXHRcdFx0XHRcdFx0XHRcdG5vcm1hbGl6ZWQsXHJcblx0XHRcdFx0XHRcdFx0XHRzaXplICogYnl0ZXNQZXJFbGVtZW50LFxyXG5cdFx0XHRcdFx0XHRcdFx0KCBzaXplIC8gcHJvZ3JhbUF0dHJpYnV0ZS5sb2NhdGlvblNpemUgKSAqIGkgKiBieXRlc1BlckVsZW1lbnQsXHJcblx0XHRcdFx0XHRcdFx0XHRpbnRlZ2VyXHJcblx0XHRcdFx0XHRcdFx0KTtcclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsRGVmYXVsdEF0dHJpYnV0ZVZhbHVlcyAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHZhbHVlID0gbWF0ZXJpYWxEZWZhdWx0QXR0cmlidXRlVmFsdWVzWyBuYW1lIF07XHJcblxyXG5cdFx0XHRcdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdFx0c3dpdGNoICggdmFsdWUubGVuZ3RoICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRjYXNlIDI6XHJcblx0XHRcdFx0XHRcdFx0XHRnbC52ZXJ0ZXhBdHRyaWIyZnYoIHByb2dyYW1BdHRyaWJ1dGUubG9jYXRpb24sIHZhbHVlICk7XHJcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRcdFx0Y2FzZSAzOlxyXG5cdFx0XHRcdFx0XHRcdFx0Z2wudmVydGV4QXR0cmliM2Z2KCBwcm9ncmFtQXR0cmlidXRlLmxvY2F0aW9uLCB2YWx1ZSApO1xyXG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGNhc2UgNDpcclxuXHRcdFx0XHRcdFx0XHRcdGdsLnZlcnRleEF0dHJpYjRmdiggcHJvZ3JhbUF0dHJpYnV0ZS5sb2NhdGlvbiwgdmFsdWUgKTtcclxuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdFx0XHRcdFx0Z2wudmVydGV4QXR0cmliMWZ2KCBwcm9ncmFtQXR0cmlidXRlLmxvY2F0aW9uLCB2YWx1ZSApO1xyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRkaXNhYmxlVW51c2VkQXR0cmlidXRlcygpO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0cmVzZXQoKTtcclxuXHJcblx0XHRmb3IgKCBjb25zdCBnZW9tZXRyeUlkIGluIGJpbmRpbmdTdGF0ZXMgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBwcm9ncmFtTWFwID0gYmluZGluZ1N0YXRlc1sgZ2VvbWV0cnlJZCBdO1xyXG5cclxuXHRcdFx0Zm9yICggY29uc3QgcHJvZ3JhbUlkIGluIHByb2dyYW1NYXAgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHN0YXRlTWFwID0gcHJvZ3JhbU1hcFsgcHJvZ3JhbUlkIF07XHJcblxyXG5cdFx0XHRcdGZvciAoIGNvbnN0IHdpcmVmcmFtZSBpbiBzdGF0ZU1hcCApIHtcclxuXHJcblx0XHRcdFx0XHRkZWxldGVWZXJ0ZXhBcnJheU9iamVjdCggc3RhdGVNYXBbIHdpcmVmcmFtZSBdLm9iamVjdCApO1xyXG5cclxuXHRcdFx0XHRcdGRlbGV0ZSBzdGF0ZU1hcFsgd2lyZWZyYW1lIF07XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0ZGVsZXRlIHByb2dyYW1NYXBbIHByb2dyYW1JZCBdO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZGVsZXRlIGJpbmRpbmdTdGF0ZXNbIGdlb21ldHJ5SWQgXTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gcmVsZWFzZVN0YXRlc09mR2VvbWV0cnkoIGdlb21ldHJ5ICkge1xyXG5cclxuXHRcdGlmICggYmluZGluZ1N0YXRlc1sgZ2VvbWV0cnkuaWQgXSA9PT0gdW5kZWZpbmVkICkgcmV0dXJuO1xyXG5cclxuXHRcdGNvbnN0IHByb2dyYW1NYXAgPSBiaW5kaW5nU3RhdGVzWyBnZW9tZXRyeS5pZCBdO1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IHByb2dyYW1JZCBpbiBwcm9ncmFtTWFwICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgc3RhdGVNYXAgPSBwcm9ncmFtTWFwWyBwcm9ncmFtSWQgXTtcclxuXHJcblx0XHRcdGZvciAoIGNvbnN0IHdpcmVmcmFtZSBpbiBzdGF0ZU1hcCApIHtcclxuXHJcblx0XHRcdFx0ZGVsZXRlVmVydGV4QXJyYXlPYmplY3QoIHN0YXRlTWFwWyB3aXJlZnJhbWUgXS5vYmplY3QgKTtcclxuXHJcblx0XHRcdFx0ZGVsZXRlIHN0YXRlTWFwWyB3aXJlZnJhbWUgXTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGRlbGV0ZSBwcm9ncmFtTWFwWyBwcm9ncmFtSWQgXTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0ZGVsZXRlIGJpbmRpbmdTdGF0ZXNbIGdlb21ldHJ5LmlkIF07XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gcmVsZWFzZVN0YXRlc09mUHJvZ3JhbSggcHJvZ3JhbSApIHtcclxuXHJcblx0XHRmb3IgKCBjb25zdCBnZW9tZXRyeUlkIGluIGJpbmRpbmdTdGF0ZXMgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBwcm9ncmFtTWFwID0gYmluZGluZ1N0YXRlc1sgZ2VvbWV0cnlJZCBdO1xyXG5cclxuXHRcdFx0aWYgKCBwcm9ncmFtTWFwWyBwcm9ncmFtLmlkIF0gPT09IHVuZGVmaW5lZCApIGNvbnRpbnVlO1xyXG5cclxuXHRcdFx0Y29uc3Qgc3RhdGVNYXAgPSBwcm9ncmFtTWFwWyBwcm9ncmFtLmlkIF07XHJcblxyXG5cdFx0XHRmb3IgKCBjb25zdCB3aXJlZnJhbWUgaW4gc3RhdGVNYXAgKSB7XHJcblxyXG5cdFx0XHRcdGRlbGV0ZVZlcnRleEFycmF5T2JqZWN0KCBzdGF0ZU1hcFsgd2lyZWZyYW1lIF0ub2JqZWN0ICk7XHJcblxyXG5cdFx0XHRcdGRlbGV0ZSBzdGF0ZU1hcFsgd2lyZWZyYW1lIF07XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRkZWxldGUgcHJvZ3JhbU1hcFsgcHJvZ3JhbS5pZCBdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiByZXNldCgpIHtcclxuXHJcblx0XHRyZXNldERlZmF1bHRTdGF0ZSgpO1xyXG5cdFx0Zm9yY2VVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdGlmICggY3VycmVudFN0YXRlID09PSBkZWZhdWx0U3RhdGUgKSByZXR1cm47XHJcblxyXG5cdFx0Y3VycmVudFN0YXRlID0gZGVmYXVsdFN0YXRlO1xyXG5cdFx0YmluZFZlcnRleEFycmF5T2JqZWN0KCBjdXJyZW50U3RhdGUub2JqZWN0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gZm9yIGJhY2t3YXJkLWNvbXBhdGliaWxpdHlcclxuXHJcblx0ZnVuY3Rpb24gcmVzZXREZWZhdWx0U3RhdGUoKSB7XHJcblxyXG5cdFx0ZGVmYXVsdFN0YXRlLmdlb21ldHJ5ID0gbnVsbDtcclxuXHRcdGRlZmF1bHRTdGF0ZS5wcm9ncmFtID0gbnVsbDtcclxuXHRcdGRlZmF1bHRTdGF0ZS53aXJlZnJhbWUgPSBmYWxzZTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4ge1xyXG5cclxuXHRcdHNldHVwOiBzZXR1cCxcclxuXHRcdHJlc2V0OiByZXNldCxcclxuXHRcdHJlc2V0RGVmYXVsdFN0YXRlOiByZXNldERlZmF1bHRTdGF0ZSxcclxuXHRcdGRpc3Bvc2U6IGRpc3Bvc2UsXHJcblx0XHRyZWxlYXNlU3RhdGVzT2ZHZW9tZXRyeTogcmVsZWFzZVN0YXRlc09mR2VvbWV0cnksXHJcblx0XHRyZWxlYXNlU3RhdGVzT2ZQcm9ncmFtOiByZWxlYXNlU3RhdGVzT2ZQcm9ncmFtLFxyXG5cclxuXHRcdGluaXRBdHRyaWJ1dGVzOiBpbml0QXR0cmlidXRlcyxcclxuXHRcdGVuYWJsZUF0dHJpYnV0ZTogZW5hYmxlQXR0cmlidXRlLFxyXG5cdFx0ZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXM6IGRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzXHJcblxyXG5cdH07XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgV2ViR0xCaW5kaW5nU3RhdGVzIH07XHJcbiIsImZ1bmN0aW9uIFdlYkdMQnVmZmVyUmVuZGVyZXIoIGdsLCBleHRlbnNpb25zLCBpbmZvICkge1xyXG5cclxuXHRsZXQgbW9kZTtcclxuXHJcblx0ZnVuY3Rpb24gc2V0TW9kZSggdmFsdWUgKSB7XHJcblxyXG5cdFx0bW9kZSA9IHZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHJlbmRlciggc3RhcnQsIGNvdW50ICkge1xyXG5cclxuXHRcdGdsLmRyYXdBcnJheXMoIG1vZGUsIHN0YXJ0LCBjb3VudCApO1xyXG5cclxuXHRcdGluZm8udXBkYXRlKCBjb3VudCwgbW9kZSwgMSApO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHJlbmRlckluc3RhbmNlcyggc3RhcnQsIGNvdW50LCBwcmltY291bnQgKSB7XHJcblxyXG5cdFx0aWYgKCBwcmltY291bnQgPT09IDAgKSByZXR1cm47XHJcblxyXG5cdFx0Z2wuZHJhd0FycmF5c0luc3RhbmNlZCggbW9kZSwgc3RhcnQsIGNvdW50LCBwcmltY291bnQgKTtcclxuXHJcblx0XHRpbmZvLnVwZGF0ZSggY291bnQsIG1vZGUsIHByaW1jb3VudCApO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHJlbmRlck11bHRpRHJhdyggc3RhcnRzLCBjb3VudHMsIGRyYXdDb3VudCApIHtcclxuXHJcblx0XHRpZiAoIGRyYXdDb3VudCA9PT0gMCApIHJldHVybjtcclxuXHJcblx0XHRjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX211bHRpX2RyYXcnICk7XHJcblx0XHRleHRlbnNpb24ubXVsdGlEcmF3QXJyYXlzV0VCR0woIG1vZGUsIHN0YXJ0cywgMCwgY291bnRzLCAwLCBkcmF3Q291bnQgKTtcclxuXHJcblx0XHRsZXQgZWxlbWVudENvdW50ID0gMDtcclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGRyYXdDb3VudDsgaSArKyApIHtcclxuXHJcblx0XHRcdGVsZW1lbnRDb3VudCArPSBjb3VudHNbIGkgXTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aW5mby51cGRhdGUoIGVsZW1lbnRDb3VudCwgbW9kZSwgMSApO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHJlbmRlck11bHRpRHJhd0luc3RhbmNlcyggc3RhcnRzLCBjb3VudHMsIGRyYXdDb3VudCwgcHJpbWNvdW50ICkge1xyXG5cclxuXHRcdGlmICggZHJhd0NvdW50ID09PSAwICkgcmV0dXJuO1xyXG5cclxuXHRcdGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfbXVsdGlfZHJhdycgKTtcclxuXHJcblx0XHRpZiAoIGV4dGVuc2lvbiA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHN0YXJ0cy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdHJlbmRlckluc3RhbmNlcyggc3RhcnRzWyBpIF0sIGNvdW50c1sgaSBdLCBwcmltY291bnRbIGkgXSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRleHRlbnNpb24ubXVsdGlEcmF3QXJyYXlzSW5zdGFuY2VkV0VCR0woIG1vZGUsIHN0YXJ0cywgMCwgY291bnRzLCAwLCBwcmltY291bnQsIDAsIGRyYXdDb3VudCApO1xyXG5cclxuXHRcdFx0bGV0IGVsZW1lbnRDb3VudCA9IDA7XHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGRyYXdDb3VudDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0ZWxlbWVudENvdW50ICs9IGNvdW50c1sgaSBdICogcHJpbWNvdW50WyBpIF07XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpbmZvLnVwZGF0ZSggZWxlbWVudENvdW50LCBtb2RlLCAxICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8vXHJcblxyXG5cdHRoaXMuc2V0TW9kZSA9IHNldE1vZGU7XHJcblx0dGhpcy5yZW5kZXIgPSByZW5kZXI7XHJcblx0dGhpcy5yZW5kZXJJbnN0YW5jZXMgPSByZW5kZXJJbnN0YW5jZXM7XHJcblx0dGhpcy5yZW5kZXJNdWx0aURyYXcgPSByZW5kZXJNdWx0aURyYXc7XHJcblx0dGhpcy5yZW5kZXJNdWx0aURyYXdJbnN0YW5jZXMgPSByZW5kZXJNdWx0aURyYXdJbnN0YW5jZXM7XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgV2ViR0xCdWZmZXJSZW5kZXJlciB9O1xyXG4iLCJpbXBvcnQgeyBGbG9hdFR5cGUsIEhhbGZGbG9hdFR5cGUsIFJHQkFGb3JtYXQsIFVuc2lnbmVkQnl0ZVR5cGUgfSBmcm9tICcuLi8uLi9jb25zdGFudHMuanMnO1xyXG5cclxuZnVuY3Rpb24gV2ViR0xDYXBhYmlsaXRpZXMoIGdsLCBleHRlbnNpb25zLCBwYXJhbWV0ZXJzLCB1dGlscyApIHtcclxuXHJcblx0bGV0IG1heEFuaXNvdHJvcHk7XHJcblxyXG5cdGZ1bmN0aW9uIGdldE1heEFuaXNvdHJvcHkoKSB7XHJcblxyXG5cdFx0aWYgKCBtYXhBbmlzb3Ryb3B5ICE9PSB1bmRlZmluZWQgKSByZXR1cm4gbWF4QW5pc290cm9weTtcclxuXHJcblx0XHRpZiAoIGV4dGVuc2lvbnMuaGFzKCAnRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJyApID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0Y29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnICk7XHJcblxyXG5cdFx0XHRtYXhBbmlzb3Ryb3B5ID0gZ2wuZ2V0UGFyYW1ldGVyKCBleHRlbnNpb24uTUFYX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhUICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdG1heEFuaXNvdHJvcHkgPSAwO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbWF4QW5pc290cm9weTtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiB0ZXh0dXJlRm9ybWF0UmVhZGFibGUoIHRleHR1cmVGb3JtYXQgKSB7XHJcblxyXG5cdFx0aWYgKCB0ZXh0dXJlRm9ybWF0ICE9PSBSR0JBRm9ybWF0ICYmIHV0aWxzLmNvbnZlcnQoIHRleHR1cmVGb3JtYXQgKSAhPT0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1BVCApICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiB0ZXh0dXJlVHlwZVJlYWRhYmxlKCB0ZXh0dXJlVHlwZSApIHtcclxuXHJcblx0XHRjb25zdCBoYWxmRmxvYXRTdXBwb3J0ZWRCeUV4dCA9ICggdGV4dHVyZVR5cGUgPT09IEhhbGZGbG9hdFR5cGUgKSAmJiAoIGV4dGVuc2lvbnMuaGFzKCAnRVhUX2NvbG9yX2J1ZmZlcl9oYWxmX2Zsb2F0JyApIHx8IGV4dGVuc2lvbnMuaGFzKCAnRVhUX2NvbG9yX2J1ZmZlcl9mbG9hdCcgKSApO1xyXG5cclxuXHRcdGlmICggdGV4dHVyZVR5cGUgIT09IFVuc2lnbmVkQnl0ZVR5cGUgJiYgdXRpbHMuY29udmVydCggdGV4dHVyZVR5cGUgKSAhPT0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX1RZUEUgKSAmJiAvLyBFZGdlIGFuZCBDaHJvbWUgTWFjIDwgNTIgKCM5NTEzKVxyXG5cdFx0XHR0ZXh0dXJlVHlwZSAhPT0gRmxvYXRUeXBlICYmICEgaGFsZkZsb2F0U3VwcG9ydGVkQnlFeHQgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGdldE1heFByZWNpc2lvbiggcHJlY2lzaW9uICkge1xyXG5cclxuXHRcdGlmICggcHJlY2lzaW9uID09PSAnaGlnaHAnICkge1xyXG5cclxuXHRcdFx0aWYgKCBnbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoIGdsLlZFUlRFWF9TSEFERVIsIGdsLkhJR0hfRkxPQVQgKS5wcmVjaXNpb24gPiAwICYmXHJcblx0XHRcdFx0Z2wuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KCBnbC5GUkFHTUVOVF9TSEFERVIsIGdsLkhJR0hfRkxPQVQgKS5wcmVjaXNpb24gPiAwICkge1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gJ2hpZ2hwJztcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHByZWNpc2lvbiA9ICdtZWRpdW1wJztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBwcmVjaXNpb24gPT09ICdtZWRpdW1wJyApIHtcclxuXHJcblx0XHRcdGlmICggZ2wuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KCBnbC5WRVJURVhfU0hBREVSLCBnbC5NRURJVU1fRkxPQVQgKS5wcmVjaXNpb24gPiAwICYmXHJcblx0XHRcdFx0Z2wuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KCBnbC5GUkFHTUVOVF9TSEFERVIsIGdsLk1FRElVTV9GTE9BVCApLnByZWNpc2lvbiA+IDAgKSB7XHJcblxyXG5cdFx0XHRcdHJldHVybiAnbWVkaXVtcCc7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiAnbG93cCc7XHJcblxyXG5cdH1cclxuXHJcblx0bGV0IHByZWNpc2lvbiA9IHBhcmFtZXRlcnMucHJlY2lzaW9uICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLnByZWNpc2lvbiA6ICdoaWdocCc7XHJcblx0Y29uc3QgbWF4UHJlY2lzaW9uID0gZ2V0TWF4UHJlY2lzaW9uKCBwcmVjaXNpb24gKTtcclxuXHJcblx0aWYgKCBtYXhQcmVjaXNpb24gIT09IHByZWNpc2lvbiApIHtcclxuXHJcblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOicsIHByZWNpc2lvbiwgJ25vdCBzdXBwb3J0ZWQsIHVzaW5nJywgbWF4UHJlY2lzaW9uLCAnaW5zdGVhZC4nICk7XHJcblx0XHRwcmVjaXNpb24gPSBtYXhQcmVjaXNpb247XHJcblxyXG5cdH1cclxuXHJcblx0Y29uc3QgbG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciA9IHBhcmFtZXRlcnMubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciA9PT0gdHJ1ZTtcclxuXHRjb25zdCByZXZlcnNlRGVwdGhCdWZmZXIgPSBwYXJhbWV0ZXJzLnJldmVyc2VEZXB0aEJ1ZmZlciA9PT0gdHJ1ZSAmJiBleHRlbnNpb25zLmhhcyggJ0VYVF9jbGlwX2NvbnRyb2wnICk7XHJcblxyXG5cdGNvbnN0IG1heFRleHR1cmVzID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfVEVYVFVSRV9JTUFHRV9VTklUUyApO1xyXG5cdGNvbnN0IG1heFZlcnRleFRleHR1cmVzID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfVkVSVEVYX1RFWFRVUkVfSU1BR0VfVU5JVFMgKTtcclxuXHRjb25zdCBtYXhUZXh0dXJlU2l6ZSA9IGdsLmdldFBhcmFtZXRlciggZ2wuTUFYX1RFWFRVUkVfU0laRSApO1xyXG5cdGNvbnN0IG1heEN1YmVtYXBTaXplID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfQ1VCRV9NQVBfVEVYVFVSRV9TSVpFICk7XHJcblxyXG5cdGNvbnN0IG1heEF0dHJpYnV0ZXMgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9WRVJURVhfQVRUUklCUyApO1xyXG5cdGNvbnN0IG1heFZlcnRleFVuaWZvcm1zID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SUyApO1xyXG5cdGNvbnN0IG1heFZhcnlpbmdzID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfVkFSWUlOR19WRUNUT1JTICk7XHJcblx0Y29uc3QgbWF4RnJhZ21lbnRVbmlmb3JtcyA9IGdsLmdldFBhcmFtZXRlciggZ2wuTUFYX0ZSQUdNRU5UX1VOSUZPUk1fVkVDVE9SUyApO1xyXG5cclxuXHRjb25zdCB2ZXJ0ZXhUZXh0dXJlcyA9IG1heFZlcnRleFRleHR1cmVzID4gMDtcclxuXHJcblx0Y29uc3QgbWF4U2FtcGxlcyA9IGdsLmdldFBhcmFtZXRlciggZ2wuTUFYX1NBTVBMRVMgKTtcclxuXHJcblx0cmV0dXJuIHtcclxuXHJcblx0XHRpc1dlYkdMMjogdHJ1ZSwgLy8ga2VlcGluZyB0aGlzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxyXG5cclxuXHRcdGdldE1heEFuaXNvdHJvcHk6IGdldE1heEFuaXNvdHJvcHksXHJcblx0XHRnZXRNYXhQcmVjaXNpb246IGdldE1heFByZWNpc2lvbixcclxuXHJcblx0XHR0ZXh0dXJlRm9ybWF0UmVhZGFibGU6IHRleHR1cmVGb3JtYXRSZWFkYWJsZSxcclxuXHRcdHRleHR1cmVUeXBlUmVhZGFibGU6IHRleHR1cmVUeXBlUmVhZGFibGUsXHJcblxyXG5cdFx0cHJlY2lzaW9uOiBwcmVjaXNpb24sXHJcblx0XHRsb2dhcml0aG1pY0RlcHRoQnVmZmVyOiBsb2dhcml0aG1pY0RlcHRoQnVmZmVyLFxyXG5cdFx0cmV2ZXJzZURlcHRoQnVmZmVyOiByZXZlcnNlRGVwdGhCdWZmZXIsXHJcblxyXG5cdFx0bWF4VGV4dHVyZXM6IG1heFRleHR1cmVzLFxyXG5cdFx0bWF4VmVydGV4VGV4dHVyZXM6IG1heFZlcnRleFRleHR1cmVzLFxyXG5cdFx0bWF4VGV4dHVyZVNpemU6IG1heFRleHR1cmVTaXplLFxyXG5cdFx0bWF4Q3ViZW1hcFNpemU6IG1heEN1YmVtYXBTaXplLFxyXG5cclxuXHRcdG1heEF0dHJpYnV0ZXM6IG1heEF0dHJpYnV0ZXMsXHJcblx0XHRtYXhWZXJ0ZXhVbmlmb3JtczogbWF4VmVydGV4VW5pZm9ybXMsXHJcblx0XHRtYXhWYXJ5aW5nczogbWF4VmFyeWluZ3MsXHJcblx0XHRtYXhGcmFnbWVudFVuaWZvcm1zOiBtYXhGcmFnbWVudFVuaWZvcm1zLFxyXG5cclxuXHRcdHZlcnRleFRleHR1cmVzOiB2ZXJ0ZXhUZXh0dXJlcyxcclxuXHJcblx0XHRtYXhTYW1wbGVzOiBtYXhTYW1wbGVzXHJcblxyXG5cdH07XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgV2ViR0xDYXBhYmlsaXRpZXMgfTtcclxuIiwiaW1wb3J0IHsgTWF0cml4MyB9IGZyb20gJy4uLy4uL21hdGgvTWF0cml4My5qcyc7XHJcbmltcG9ydCB7IFBsYW5lIH0gZnJvbSAnLi4vLi4vbWF0aC9QbGFuZS5qcyc7XHJcblxyXG5mdW5jdGlvbiBXZWJHTENsaXBwaW5nKCBwcm9wZXJ0aWVzICkge1xyXG5cclxuXHRjb25zdCBzY29wZSA9IHRoaXM7XHJcblxyXG5cdGxldCBnbG9iYWxTdGF0ZSA9IG51bGwsXHJcblx0XHRudW1HbG9iYWxQbGFuZXMgPSAwLFxyXG5cdFx0bG9jYWxDbGlwcGluZ0VuYWJsZWQgPSBmYWxzZSxcclxuXHRcdHJlbmRlcmluZ1NoYWRvd3MgPSBmYWxzZTtcclxuXHJcblx0Y29uc3QgcGxhbmUgPSBuZXcgUGxhbmUoKSxcclxuXHRcdHZpZXdOb3JtYWxNYXRyaXggPSBuZXcgTWF0cml4MygpLFxyXG5cclxuXHRcdHVuaWZvcm0gPSB7IHZhbHVlOiBudWxsLCBuZWVkc1VwZGF0ZTogZmFsc2UgfTtcclxuXHJcblx0dGhpcy51bmlmb3JtID0gdW5pZm9ybTtcclxuXHR0aGlzLm51bVBsYW5lcyA9IDA7XHJcblx0dGhpcy5udW1JbnRlcnNlY3Rpb24gPSAwO1xyXG5cclxuXHR0aGlzLmluaXQgPSBmdW5jdGlvbiAoIHBsYW5lcywgZW5hYmxlTG9jYWxDbGlwcGluZyApIHtcclxuXHJcblx0XHRjb25zdCBlbmFibGVkID1cclxuXHRcdFx0cGxhbmVzLmxlbmd0aCAhPT0gMCB8fFxyXG5cdFx0XHRlbmFibGVMb2NhbENsaXBwaW5nIHx8XHJcblx0XHRcdC8vIGVuYWJsZSBzdGF0ZSBvZiBwcmV2aW91cyBmcmFtZSAtIHRoZSBjbGlwcGluZyBjb2RlIGhhcyB0b1xyXG5cdFx0XHQvLyBydW4gYW5vdGhlciBmcmFtZSBpbiBvcmRlciB0byByZXNldCB0aGUgc3RhdGU6XHJcblx0XHRcdG51bUdsb2JhbFBsYW5lcyAhPT0gMCB8fFxyXG5cdFx0XHRsb2NhbENsaXBwaW5nRW5hYmxlZDtcclxuXHJcblx0XHRsb2NhbENsaXBwaW5nRW5hYmxlZCA9IGVuYWJsZUxvY2FsQ2xpcHBpbmc7XHJcblxyXG5cdFx0bnVtR2xvYmFsUGxhbmVzID0gcGxhbmVzLmxlbmd0aDtcclxuXHJcblx0XHRyZXR1cm4gZW5hYmxlZDtcclxuXHJcblx0fTtcclxuXHJcblx0dGhpcy5iZWdpblNoYWRvd3MgPSBmdW5jdGlvbiAoKSB7XHJcblxyXG5cdFx0cmVuZGVyaW5nU2hhZG93cyA9IHRydWU7XHJcblx0XHRwcm9qZWN0UGxhbmVzKCBudWxsICk7XHJcblxyXG5cdH07XHJcblxyXG5cdHRoaXMuZW5kU2hhZG93cyA9IGZ1bmN0aW9uICgpIHtcclxuXHJcblx0XHRyZW5kZXJpbmdTaGFkb3dzID0gZmFsc2U7XHJcblxyXG5cdH07XHJcblxyXG5cdHRoaXMuc2V0R2xvYmFsU3RhdGUgPSBmdW5jdGlvbiAoIHBsYW5lcywgY2FtZXJhICkge1xyXG5cclxuXHRcdGdsb2JhbFN0YXRlID0gcHJvamVjdFBsYW5lcyggcGxhbmVzLCBjYW1lcmEsIDAgKTtcclxuXHJcblx0fTtcclxuXHJcblx0dGhpcy5zZXRTdGF0ZSA9IGZ1bmN0aW9uICggbWF0ZXJpYWwsIGNhbWVyYSwgdXNlQ2FjaGUgKSB7XHJcblxyXG5cdFx0Y29uc3QgcGxhbmVzID0gbWF0ZXJpYWwuY2xpcHBpbmdQbGFuZXMsXHJcblx0XHRcdGNsaXBJbnRlcnNlY3Rpb24gPSBtYXRlcmlhbC5jbGlwSW50ZXJzZWN0aW9uLFxyXG5cdFx0XHRjbGlwU2hhZG93cyA9IG1hdGVyaWFsLmNsaXBTaGFkb3dzO1xyXG5cclxuXHRcdGNvbnN0IG1hdGVyaWFsUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCBtYXRlcmlhbCApO1xyXG5cclxuXHRcdGlmICggISBsb2NhbENsaXBwaW5nRW5hYmxlZCB8fCBwbGFuZXMgPT09IG51bGwgfHwgcGxhbmVzLmxlbmd0aCA9PT0gMCB8fCByZW5kZXJpbmdTaGFkb3dzICYmICEgY2xpcFNoYWRvd3MgKSB7XHJcblxyXG5cdFx0XHQvLyB0aGVyZSdzIG5vIGxvY2FsIGNsaXBwaW5nXHJcblxyXG5cdFx0XHRpZiAoIHJlbmRlcmluZ1NoYWRvd3MgKSB7XHJcblxyXG5cdFx0XHRcdC8vIHRoZXJlJ3Mgbm8gZ2xvYmFsIGNsaXBwaW5nXHJcblxyXG5cdFx0XHRcdHByb2plY3RQbGFuZXMoIG51bGwgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHJlc2V0R2xvYmFsU3RhdGUoKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc3Qgbkdsb2JhbCA9IHJlbmRlcmluZ1NoYWRvd3MgPyAwIDogbnVtR2xvYmFsUGxhbmVzLFxyXG5cdFx0XHRcdGxHbG9iYWwgPSBuR2xvYmFsICogNDtcclxuXHJcblx0XHRcdGxldCBkc3RBcnJheSA9IG1hdGVyaWFsUHJvcGVydGllcy5jbGlwcGluZ1N0YXRlIHx8IG51bGw7XHJcblxyXG5cdFx0XHR1bmlmb3JtLnZhbHVlID0gZHN0QXJyYXk7IC8vIGVuc3VyZSB1bmlxdWUgc3RhdGVcclxuXHJcblx0XHRcdGRzdEFycmF5ID0gcHJvamVjdFBsYW5lcyggcGxhbmVzLCBjYW1lcmEsIGxHbG9iYWwsIHVzZUNhY2hlICk7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgIT09IGxHbG9iYWw7ICsrIGkgKSB7XHJcblxyXG5cdFx0XHRcdGRzdEFycmF5WyBpIF0gPSBnbG9iYWxTdGF0ZVsgaSBdO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLmNsaXBwaW5nU3RhdGUgPSBkc3RBcnJheTtcclxuXHRcdFx0dGhpcy5udW1JbnRlcnNlY3Rpb24gPSBjbGlwSW50ZXJzZWN0aW9uID8gdGhpcy5udW1QbGFuZXMgOiAwO1xyXG5cdFx0XHR0aGlzLm51bVBsYW5lcyArPSBuR2xvYmFsO1xyXG5cclxuXHRcdH1cclxuXHJcblxyXG5cdH07XHJcblxyXG5cdGZ1bmN0aW9uIHJlc2V0R2xvYmFsU3RhdGUoKSB7XHJcblxyXG5cdFx0aWYgKCB1bmlmb3JtLnZhbHVlICE9PSBnbG9iYWxTdGF0ZSApIHtcclxuXHJcblx0XHRcdHVuaWZvcm0udmFsdWUgPSBnbG9iYWxTdGF0ZTtcclxuXHRcdFx0dW5pZm9ybS5uZWVkc1VwZGF0ZSA9IG51bUdsb2JhbFBsYW5lcyA+IDA7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHNjb3BlLm51bVBsYW5lcyA9IG51bUdsb2JhbFBsYW5lcztcclxuXHRcdHNjb3BlLm51bUludGVyc2VjdGlvbiA9IDA7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gcHJvamVjdFBsYW5lcyggcGxhbmVzLCBjYW1lcmEsIGRzdE9mZnNldCwgc2tpcFRyYW5zZm9ybSApIHtcclxuXHJcblx0XHRjb25zdCBuUGxhbmVzID0gcGxhbmVzICE9PSBudWxsID8gcGxhbmVzLmxlbmd0aCA6IDA7XHJcblx0XHRsZXQgZHN0QXJyYXkgPSBudWxsO1xyXG5cclxuXHRcdGlmICggblBsYW5lcyAhPT0gMCApIHtcclxuXHJcblx0XHRcdGRzdEFycmF5ID0gdW5pZm9ybS52YWx1ZTtcclxuXHJcblx0XHRcdGlmICggc2tpcFRyYW5zZm9ybSAhPT0gdHJ1ZSB8fCBkc3RBcnJheSA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgZmxhdFNpemUgPSBkc3RPZmZzZXQgKyBuUGxhbmVzICogNCxcclxuXHRcdFx0XHRcdHZpZXdNYXRyaXggPSBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlO1xyXG5cclxuXHRcdFx0XHR2aWV3Tm9ybWFsTWF0cml4LmdldE5vcm1hbE1hdHJpeCggdmlld01hdHJpeCApO1xyXG5cclxuXHRcdFx0XHRpZiAoIGRzdEFycmF5ID09PSBudWxsIHx8IGRzdEFycmF5Lmxlbmd0aCA8IGZsYXRTaXplICkge1xyXG5cclxuXHRcdFx0XHRcdGRzdEFycmF5ID0gbmV3IEZsb2F0MzJBcnJheSggZmxhdFNpemUgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGk0ID0gZHN0T2Zmc2V0OyBpICE9PSBuUGxhbmVzOyArKyBpLCBpNCArPSA0ICkge1xyXG5cclxuXHRcdFx0XHRcdHBsYW5lLmNvcHkoIHBsYW5lc1sgaSBdICkuYXBwbHlNYXRyaXg0KCB2aWV3TWF0cml4LCB2aWV3Tm9ybWFsTWF0cml4ICk7XHJcblxyXG5cdFx0XHRcdFx0cGxhbmUubm9ybWFsLnRvQXJyYXkoIGRzdEFycmF5LCBpNCApO1xyXG5cdFx0XHRcdFx0ZHN0QXJyYXlbIGk0ICsgMyBdID0gcGxhbmUuY29uc3RhbnQ7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHVuaWZvcm0udmFsdWUgPSBkc3RBcnJheTtcclxuXHRcdFx0dW5pZm9ybS5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHNjb3BlLm51bVBsYW5lcyA9IG5QbGFuZXM7XHJcblx0XHRzY29wZS5udW1JbnRlcnNlY3Rpb24gPSAwO1xyXG5cclxuXHRcdHJldHVybiBkc3RBcnJheTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCB7IFdlYkdMQ2xpcHBpbmcgfTtcclxuIiwiaW1wb3J0IHsgQ3ViZVJlZmxlY3Rpb25NYXBwaW5nLCBDdWJlUmVmcmFjdGlvbk1hcHBpbmcsIEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nLCBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IFdlYkdMQ3ViZVJlbmRlclRhcmdldCB9IGZyb20gJy4uL1dlYkdMQ3ViZVJlbmRlclRhcmdldC5qcyc7XHJcblxyXG5mdW5jdGlvbiBXZWJHTEN1YmVNYXBzKCByZW5kZXJlciApIHtcclxuXHJcblx0bGV0IGN1YmVtYXBzID0gbmV3IFdlYWtNYXAoKTtcclxuXHJcblx0ZnVuY3Rpb24gbWFwVGV4dHVyZU1hcHBpbmcoIHRleHR1cmUsIG1hcHBpbmcgKSB7XHJcblxyXG5cdFx0aWYgKCBtYXBwaW5nID09PSBFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZyApIHtcclxuXHJcblx0XHRcdHRleHR1cmUubWFwcGluZyA9IEN1YmVSZWZsZWN0aW9uTWFwcGluZztcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBtYXBwaW5nID09PSBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZyApIHtcclxuXHJcblx0XHRcdHRleHR1cmUubWFwcGluZyA9IEN1YmVSZWZyYWN0aW9uTWFwcGluZztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRleHR1cmU7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gZ2V0KCB0ZXh0dXJlICkge1xyXG5cclxuXHRcdGlmICggdGV4dHVyZSAmJiB0ZXh0dXJlLmlzVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdGNvbnN0IG1hcHBpbmcgPSB0ZXh0dXJlLm1hcHBpbmc7XHJcblxyXG5cdFx0XHRpZiAoIG1hcHBpbmcgPT09IEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nIHx8IG1hcHBpbmcgPT09IEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIGN1YmVtYXBzLmhhcyggdGV4dHVyZSApICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGN1YmVtYXAgPSBjdWJlbWFwcy5nZXQoIHRleHR1cmUgKS50ZXh0dXJlO1xyXG5cdFx0XHRcdFx0cmV0dXJuIG1hcFRleHR1cmVNYXBwaW5nKCBjdWJlbWFwLCB0ZXh0dXJlLm1hcHBpbmcgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBpbWFnZSA9IHRleHR1cmUuaW1hZ2U7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBpbWFnZSAmJiBpbWFnZS5oZWlnaHQgPiAwICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgcmVuZGVyVGFyZ2V0ID0gbmV3IFdlYkdMQ3ViZVJlbmRlclRhcmdldCggaW1hZ2UuaGVpZ2h0ICk7XHJcblx0XHRcdFx0XHRcdHJlbmRlclRhcmdldC5mcm9tRXF1aXJlY3Rhbmd1bGFyVGV4dHVyZSggcmVuZGVyZXIsIHRleHR1cmUgKTtcclxuXHRcdFx0XHRcdFx0Y3ViZW1hcHMuc2V0KCB0ZXh0dXJlLCByZW5kZXJUYXJnZXQgKTtcclxuXHJcblx0XHRcdFx0XHRcdHRleHR1cmUuYWRkRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvblRleHR1cmVEaXNwb3NlICk7XHJcblxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gbWFwVGV4dHVyZU1hcHBpbmcoIHJlbmRlclRhcmdldC50ZXh0dXJlLCB0ZXh0dXJlLm1hcHBpbmcgKTtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0Ly8gaW1hZ2Ugbm90IHlldCByZWFkeS4gdHJ5IHRoZSBjb252ZXJzaW9uIG5leHQgZnJhbWVcclxuXHJcblx0XHRcdFx0XHRcdHJldHVybiBudWxsO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGV4dHVyZTtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBvblRleHR1cmVEaXNwb3NlKCBldmVudCApIHtcclxuXHJcblx0XHRjb25zdCB0ZXh0dXJlID0gZXZlbnQudGFyZ2V0O1xyXG5cclxuXHRcdHRleHR1cmUucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvblRleHR1cmVEaXNwb3NlICk7XHJcblxyXG5cdFx0Y29uc3QgY3ViZW1hcCA9IGN1YmVtYXBzLmdldCggdGV4dHVyZSApO1xyXG5cclxuXHRcdGlmICggY3ViZW1hcCAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Y3ViZW1hcHMuZGVsZXRlKCB0ZXh0dXJlICk7XHJcblx0XHRcdGN1YmVtYXAuZGlzcG9zZSgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBkaXNwb3NlKCkge1xyXG5cclxuXHRcdGN1YmVtYXBzID0gbmV3IFdlYWtNYXAoKTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4ge1xyXG5cdFx0Z2V0OiBnZXQsXHJcblx0XHRkaXNwb3NlOiBkaXNwb3NlXHJcblx0fTtcclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFdlYkdMQ3ViZU1hcHMgfTtcclxuIiwiaW1wb3J0IHtcclxuXHRDdWJlUmVmbGVjdGlvbk1hcHBpbmcsXHJcblx0Q3ViZVJlZnJhY3Rpb25NYXBwaW5nLFxyXG5cdEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nLFxyXG5cdExpbmVhckZpbHRlcixcclxuXHROb1RvbmVNYXBwaW5nLFxyXG5cdE5vQmxlbmRpbmcsXHJcblx0UkdCQUZvcm1hdCxcclxuXHRIYWxmRmxvYXRUeXBlLFxyXG5cdEJhY2tTaWRlLFxyXG5cdExpbmVhclNSR0JDb2xvclNwYWNlXHJcbn0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcclxuXHJcbmltcG9ydCB7IEJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyQXR0cmlidXRlLmpzJztcclxuaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcclxuaW1wb3J0IHsgTWVzaCB9IGZyb20gJy4uL29iamVjdHMvTWVzaC5qcyc7XHJcbmltcG9ydCB7IE9ydGhvZ3JhcGhpY0NhbWVyYSB9IGZyb20gJy4uL2NhbWVyYXMvT3J0aG9ncmFwaGljQ2FtZXJhLmpzJztcclxuaW1wb3J0IHsgUGVyc3BlY3RpdmVDYW1lcmEgfSBmcm9tICcuLi9jYW1lcmFzL1BlcnNwZWN0aXZlQ2FtZXJhLmpzJztcclxuaW1wb3J0IHsgU2hhZGVyTWF0ZXJpYWwgfSBmcm9tICcuLi9tYXRlcmlhbHMvU2hhZGVyTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi9tYXRoL0NvbG9yLmpzJztcclxuaW1wb3J0IHsgV2ViR0xSZW5kZXJUYXJnZXQgfSBmcm9tICcuLi9yZW5kZXJlcnMvV2ViR0xSZW5kZXJUYXJnZXQuanMnO1xyXG5pbXBvcnQgeyBNZXNoQmFzaWNNYXRlcmlhbCB9IGZyb20gJy4uL21hdGVyaWFscy9NZXNoQmFzaWNNYXRlcmlhbC5qcyc7XHJcbmltcG9ydCB7IEJveEdlb21ldHJ5IH0gZnJvbSAnLi4vZ2VvbWV0cmllcy9Cb3hHZW9tZXRyeS5qcyc7XHJcblxyXG5jb25zdCBMT0RfTUlOID0gNDtcclxuXHJcbi8vIFRoZSBzdGFuZGFyZCBkZXZpYXRpb25zIChyYWRpYW5zKSBhc3NvY2lhdGVkIHdpdGggdGhlIGV4dHJhIG1pcHMuIFRoZXNlIGFyZVxyXG4vLyBjaG9zZW4gdG8gYXBwcm94aW1hdGUgYSBUcm93YnJpZGdlLVJlaXR6IGRpc3RyaWJ1dGlvbiBmdW5jdGlvbiB0aW1lcyB0aGVcclxuLy8gZ2VvbWV0cmljIHNoYWRvd2luZyBmdW5jdGlvbi4gVGhlc2Ugc2lnbWEgdmFsdWVzIHNxdWFyZWQgbXVzdCBtYXRjaCB0aGVcclxuLy8gdmFyaWFuY2UgI2RlZmluZXMgaW4gY3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50Lmdsc2wuanMuXHJcbmNvbnN0IEVYVFJBX0xPRF9TSUdNQSA9IFsgMC4xMjUsIDAuMjE1LCAwLjM1LCAwLjQ0NiwgMC41MjYsIDAuNTgyIF07XHJcblxyXG4vLyBUaGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIGJsdXIgZm9yIGxvb3AuIFNtYWxsZXIgc2lnbWFzIHdpbGwgdXNlIGZld2VyXHJcbi8vIHNhbXBsZXMgYW5kIGV4aXQgZWFybHksIGJ1dCBub3QgcmVjb21waWxlIHRoZSBzaGFkZXIuXHJcbmNvbnN0IE1BWF9TQU1QTEVTID0gMjA7XHJcblxyXG5jb25zdCBfZmxhdENhbWVyYSA9IC8qQF9fUFVSRV9fKi8gbmV3IE9ydGhvZ3JhcGhpY0NhbWVyYSgpO1xyXG5jb25zdCBfY2xlYXJDb2xvciA9IC8qQF9fUFVSRV9fKi8gbmV3IENvbG9yKCk7XHJcbmxldCBfb2xkVGFyZ2V0ID0gbnVsbDtcclxubGV0IF9vbGRBY3RpdmVDdWJlRmFjZSA9IDA7XHJcbmxldCBfb2xkQWN0aXZlTWlwbWFwTGV2ZWwgPSAwO1xyXG5sZXQgX29sZFhyRW5hYmxlZCA9IGZhbHNlO1xyXG5cclxuLy8gR29sZGVuIFJhdGlvXHJcbmNvbnN0IFBISSA9ICggMSArIE1hdGguc3FydCggNSApICkgLyAyO1xyXG5jb25zdCBJTlZfUEhJID0gMSAvIFBISTtcclxuXHJcbi8vIFZlcnRpY2VzIG9mIGEgZG9kZWNhaGVkcm9uIChleGNlcHQgdGhlIG9wcG9zaXRlcywgd2hpY2ggcmVwcmVzZW50IHRoZVxyXG4vLyBzYW1lIGF4aXMpLCB1c2VkIGFzIGF4aXMgZGlyZWN0aW9ucyBldmVubHkgc3ByZWFkIG9uIGEgc3BoZXJlLlxyXG5jb25zdCBfYXhpc0RpcmVjdGlvbnMgPSBbXHJcblx0LypAX19QVVJFX18qLyBuZXcgVmVjdG9yMyggLSBQSEksIElOVl9QSEksIDAgKSxcclxuXHQvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCBQSEksIElOVl9QSEksIDAgKSxcclxuXHQvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCAtIElOVl9QSEksIDAsIFBISSApLFxyXG5cdC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoIElOVl9QSEksIDAsIFBISSApLFxyXG5cdC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoIDAsIFBISSwgLSBJTlZfUEhJICksXHJcblx0LypAX19QVVJFX18qLyBuZXcgVmVjdG9yMyggMCwgUEhJLCBJTlZfUEhJICksXHJcblx0LypAX19QVVJFX18qLyBuZXcgVmVjdG9yMyggLSAxLCAxLCAtIDEgKSxcclxuXHQvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCAxLCAxLCAtIDEgKSxcclxuXHQvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCAtIDEsIDEsIDEgKSxcclxuXHQvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCAxLCAxLCAxICkgXTtcclxuXHJcbmNvbnN0IF9vcmlnaW4gPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcblxyXG4vKipcclxuICogVGhpcyBjbGFzcyBnZW5lcmF0ZXMgYSBQcmVmaWx0ZXJlZCwgTWlwbWFwcGVkIFJhZGlhbmNlIEVudmlyb25tZW50IE1hcFxyXG4gKiAoUE1SRU0pIGZyb20gYSBjdWJlTWFwIGVudmlyb25tZW50IHRleHR1cmUuIFRoaXMgYWxsb3dzIGRpZmZlcmVudCBsZXZlbHMgb2ZcclxuICogYmx1ciB0byBiZSBxdWlja2x5IGFjY2Vzc2VkIGJhc2VkIG9uIG1hdGVyaWFsIHJvdWdobmVzcy4gSXQgaXMgcGFja2VkIGludG8gYVxyXG4gKiBzcGVjaWFsIEN1YmVVViBmb3JtYXQgdGhhdCBhbGxvd3MgdXMgdG8gcGVyZm9ybSBjdXN0b20gaW50ZXJwb2xhdGlvbiBzbyB0aGF0XHJcbiAqIHdlIGNhbiBzdXBwb3J0IG5vbmxpbmVhciBmb3JtYXRzIHN1Y2ggYXMgUkdCRS4gVW5saWtlIGEgdHJhZGl0aW9uYWwgbWlwbWFwXHJcbiAqIGNoYWluLCBpdCBvbmx5IGdvZXMgZG93biB0byB0aGUgTE9EX01JTiBsZXZlbCAoYWJvdmUpLCBhbmQgdGhlbiBjcmVhdGVzIGV4dHJhXHJcbiAqIGV2ZW4gbW9yZSBmaWx0ZXJlZCAnbWlwcycgYXQgdGhlIHNhbWUgTE9EX01JTiByZXNvbHV0aW9uLCBhc3NvY2lhdGVkIHdpdGhcclxuICogaGlnaGVyIHJvdWdobmVzcyBsZXZlbHMuIEluIHRoaXMgd2F5IHdlIG1haW50YWluIHJlc29sdXRpb24gdG8gc21vb3RobHlcclxuICogaW50ZXJwb2xhdGUgZGlmZnVzZSBsaWdodGluZyB3aGlsZSBsaW1pdGluZyBzYW1wbGluZyBjb21wdXRhdGlvbi5cclxuICpcclxuICogUGFwZXI6IEZhc3QsIEFjY3VyYXRlIEltYWdlLUJhc2VkIExpZ2h0aW5nOlxyXG4gKiB7QGxpbmsgaHR0cHM6Ly9kcml2ZS5nb29nbGUuY29tL2ZpbGUvZC8xNXk4cl9VcEtsVTlTdlY0SUxiMEMzcUNQZWNTOHB2THovdmlld31cclxuKi9cclxuY2xhc3MgUE1SRU1HZW5lcmF0b3Ige1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IFBNUkVNIGdlbmVyYXRvci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHJlbmRlcmVyICkge1xyXG5cclxuXHRcdHRoaXMuX3JlbmRlcmVyID0gcmVuZGVyZXI7XHJcblx0XHR0aGlzLl9waW5nUG9uZ1JlbmRlclRhcmdldCA9IG51bGw7XHJcblxyXG5cdFx0dGhpcy5fbG9kTWF4ID0gMDtcclxuXHRcdHRoaXMuX2N1YmVTaXplID0gMDtcclxuXHRcdHRoaXMuX2xvZFBsYW5lcyA9IFtdO1xyXG5cdFx0dGhpcy5fc2l6ZUxvZHMgPSBbXTtcclxuXHRcdHRoaXMuX3NpZ21hcyA9IFtdO1xyXG5cclxuXHRcdHRoaXMuX2JsdXJNYXRlcmlhbCA9IG51bGw7XHJcblx0XHR0aGlzLl9jdWJlbWFwTWF0ZXJpYWwgPSBudWxsO1xyXG5cdFx0dGhpcy5fZXF1aXJlY3RNYXRlcmlhbCA9IG51bGw7XHJcblxyXG5cdFx0dGhpcy5fY29tcGlsZU1hdGVyaWFsKCB0aGlzLl9ibHVyTWF0ZXJpYWwgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZW5lcmF0ZXMgYSBQTVJFTSBmcm9tIGEgc3VwcGxpZWQgU2NlbmUsIHdoaWNoIGNhbiBiZSBmYXN0ZXIgdGhhbiB1c2luZyBhblxyXG5cdCAqIGltYWdlIGlmIG5ldHdvcmtpbmcgYmFuZHdpZHRoIGlzIGxvdy4gT3B0aW9uYWwgc2lnbWEgc3BlY2lmaWVzIGEgYmx1ciByYWRpdXNcclxuXHQgKiBpbiByYWRpYW5zIHRvIGJlIGFwcGxpZWQgdG8gdGhlIHNjZW5lIGJlZm9yZSBQTVJFTSBnZW5lcmF0aW9uLiBPcHRpb25hbCBuZWFyXHJcblx0ICogYW5kIGZhciBwbGFuZXMgZW5zdXJlIHRoZSBzY2VuZSBpcyByZW5kZXJlZCBpbiBpdHMgZW50aXJldHkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1NjZW5lfSBzY2VuZSAtIFRoZSBzY2VuZSB0byBiZSBjYXB0dXJlZC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3NpZ21hPTBdIC0gVGhlIGJsdXIgcmFkaXVzIGluIHJhZGlhbnMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuZWFyPTAuMV0gLSBUaGUgbmVhciBwbGFuZSBkaXN0YW5jZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2Zhcj0xMDBdIC0gVGhlIGZhciBwbGFuZSBkaXN0YW5jZS5cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIC0gVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuc2l6ZT0yNTZdIC0gVGhlIHRleHR1cmUgc2l6ZSBvZiB0aGUgUE1SRU0uXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBbb3B0aW9ucy5yZW5kZXJUYXJnZXQ9b3JpZ2luXSAtIFRoZSBwb3NpdGlvbiBvZiB0aGUgaW50ZXJuYWwgY3ViZSBjYW1lcmEgdGhhdCByZW5kZXJzIHRoZSBzY2VuZS5cclxuXHQgKiBAcmV0dXJuIHtXZWJHTFJlbmRlclRhcmdldH0gVGhlIHJlc3VsdGluZyBQTVJFTS5cclxuXHQgKi9cclxuXHRmcm9tU2NlbmUoIHNjZW5lLCBzaWdtYSA9IDAsIG5lYXIgPSAwLjEsIGZhciA9IDEwMCwgb3B0aW9ucyA9IHt9ICkge1xyXG5cclxuXHRcdGNvbnN0IHtcclxuXHRcdFx0c2l6ZSA9IDI1NixcclxuXHRcdFx0cG9zaXRpb24gPSBfb3JpZ2luLFxyXG5cdFx0fSA9IG9wdGlvbnM7XHJcblxyXG5cdFx0X29sZFRhcmdldCA9IHRoaXMuX3JlbmRlcmVyLmdldFJlbmRlclRhcmdldCgpO1xyXG5cdFx0X29sZEFjdGl2ZUN1YmVGYWNlID0gdGhpcy5fcmVuZGVyZXIuZ2V0QWN0aXZlQ3ViZUZhY2UoKTtcclxuXHRcdF9vbGRBY3RpdmVNaXBtYXBMZXZlbCA9IHRoaXMuX3JlbmRlcmVyLmdldEFjdGl2ZU1pcG1hcExldmVsKCk7XHJcblx0XHRfb2xkWHJFbmFibGVkID0gdGhpcy5fcmVuZGVyZXIueHIuZW5hYmxlZDtcclxuXHJcblx0XHR0aGlzLl9yZW5kZXJlci54ci5lbmFibGVkID0gZmFsc2U7XHJcblxyXG5cdFx0dGhpcy5fc2V0U2l6ZSggc2l6ZSApO1xyXG5cclxuXHRcdGNvbnN0IGN1YmVVVlJlbmRlclRhcmdldCA9IHRoaXMuX2FsbG9jYXRlVGFyZ2V0cygpO1xyXG5cdFx0Y3ViZVVWUmVuZGVyVGFyZ2V0LmRlcHRoQnVmZmVyID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLl9zY2VuZVRvQ3ViZVVWKCBzY2VuZSwgbmVhciwgZmFyLCBjdWJlVVZSZW5kZXJUYXJnZXQsIHBvc2l0aW9uICk7XHJcblxyXG5cdFx0aWYgKCBzaWdtYSA+IDAgKSB7XHJcblxyXG5cdFx0XHR0aGlzLl9ibHVyKCBjdWJlVVZSZW5kZXJUYXJnZXQsIDAsIDAsIHNpZ21hICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuX2FwcGx5UE1SRU0oIGN1YmVVVlJlbmRlclRhcmdldCApO1xyXG5cdFx0dGhpcy5fY2xlYW51cCggY3ViZVVWUmVuZGVyVGFyZ2V0ICk7XHJcblxyXG5cdFx0cmV0dXJuIGN1YmVVVlJlbmRlclRhcmdldDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZW5lcmF0ZXMgYSBQTVJFTSBmcm9tIGFuIGVxdWlyZWN0YW5ndWxhciB0ZXh0dXJlLCB3aGljaCBjYW4gYmUgZWl0aGVyIExEUlxyXG5cdCAqIG9yIEhEUi4gVGhlIGlkZWFsIGlucHV0IGltYWdlIHNpemUgaXMgMWsgKDEwMjQgeCA1MTIpLFxyXG5cdCAqIGFzIHRoaXMgbWF0Y2hlcyBiZXN0IHdpdGggdGhlIDI1NiB4IDI1NiBjdWJlbWFwIG91dHB1dC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gZXF1aXJlY3Rhbmd1bGFyIC0gVGhlIGVxdWlyZWN0YW5ndWxhciB0ZXh0dXJlIHRvIGJlIGNvbnZlcnRlZC5cclxuXHQgKiBAcGFyYW0gez9XZWJHTFJlbmRlclRhcmdldH0gW3JlbmRlclRhcmdldD1udWxsXSAtIFRoZSByZW5kZXIgdGFyZ2V0IHRvIHVzZS5cclxuXHQgKiBAcmV0dXJuIHtXZWJHTFJlbmRlclRhcmdldH0gVGhlIHJlc3VsdGluZyBQTVJFTS5cclxuXHQgKi9cclxuXHRmcm9tRXF1aXJlY3Rhbmd1bGFyKCBlcXVpcmVjdGFuZ3VsYXIsIHJlbmRlclRhcmdldCA9IG51bGwgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX2Zyb21UZXh0dXJlKCBlcXVpcmVjdGFuZ3VsYXIsIHJlbmRlclRhcmdldCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyBhIFBNUkVNIGZyb20gYW4gY3ViZW1hcCB0ZXh0dXJlLCB3aGljaCBjYW4gYmUgZWl0aGVyIExEUlxyXG5cdCAqIG9yIEhEUi4gVGhlIGlkZWFsIGlucHV0IGN1YmUgc2l6ZSBpcyAyNTYgeCAyNTYsXHJcblx0ICogYXMgdGhpcyBtYXRjaGVzIGJlc3Qgd2l0aCB0aGUgMjU2IHggMjU2IGN1YmVtYXAgb3V0cHV0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSBjdWJlbWFwIC0gVGhlIGN1YmVtYXAgdGV4dHVyZSB0byBiZSBjb252ZXJ0ZWQuXHJcblx0ICogQHBhcmFtIHs/V2ViR0xSZW5kZXJUYXJnZXR9IFtyZW5kZXJUYXJnZXQ9bnVsbF0gLSBUaGUgcmVuZGVyIHRhcmdldCB0byB1c2UuXHJcblx0ICogQHJldHVybiB7V2ViR0xSZW5kZXJUYXJnZXR9IFRoZSByZXN1bHRpbmcgUE1SRU0uXHJcblx0ICovXHJcblx0ZnJvbUN1YmVtYXAoIGN1YmVtYXAsIHJlbmRlclRhcmdldCA9IG51bGwgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX2Zyb21UZXh0dXJlKCBjdWJlbWFwLCByZW5kZXJUYXJnZXQgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQcmUtY29tcGlsZXMgdGhlIGN1YmVtYXAgc2hhZGVyLiBZb3UgY2FuIGdldCBmYXN0ZXIgc3RhcnQtdXAgYnkgaW52b2tpbmcgdGhpcyBtZXRob2QgZHVyaW5nXHJcblx0ICogeW91ciB0ZXh0dXJlJ3MgbmV0d29yayBmZXRjaCBmb3IgaW5jcmVhc2VkIGNvbmN1cnJlbmN5LlxyXG5cdCAqL1xyXG5cdGNvbXBpbGVDdWJlbWFwU2hhZGVyKCkge1xyXG5cclxuXHRcdGlmICggdGhpcy5fY3ViZW1hcE1hdGVyaWFsID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5fY3ViZW1hcE1hdGVyaWFsID0gX2dldEN1YmVtYXBNYXRlcmlhbCgpO1xyXG5cdFx0XHR0aGlzLl9jb21waWxlTWF0ZXJpYWwoIHRoaXMuX2N1YmVtYXBNYXRlcmlhbCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQcmUtY29tcGlsZXMgdGhlIGVxdWlyZWN0YW5ndWxhciBzaGFkZXIuIFlvdSBjYW4gZ2V0IGZhc3RlciBzdGFydC11cCBieSBpbnZva2luZyB0aGlzIG1ldGhvZCBkdXJpbmdcclxuXHQgKiB5b3VyIHRleHR1cmUncyBuZXR3b3JrIGZldGNoIGZvciBpbmNyZWFzZWQgY29uY3VycmVuY3kuXHJcblx0ICovXHJcblx0Y29tcGlsZUVxdWlyZWN0YW5ndWxhclNoYWRlcigpIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuX2VxdWlyZWN0TWF0ZXJpYWwgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLl9lcXVpcmVjdE1hdGVyaWFsID0gX2dldEVxdWlyZWN0TWF0ZXJpYWwoKTtcclxuXHRcdFx0dGhpcy5fY29tcGlsZU1hdGVyaWFsKCB0aGlzLl9lcXVpcmVjdE1hdGVyaWFsICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERpc3Bvc2VzIG9mIHRoZSBQTVJFTUdlbmVyYXRvcidzIGludGVybmFsIG1lbW9yeS4gTm90ZSB0aGF0IFBNUkVNR2VuZXJhdG9yIGlzIGEgc3RhdGljIGNsYXNzLFxyXG5cdCAqIHNvIHlvdSBzaG91bGQgbm90IG5lZWQgbW9yZSB0aGFuIG9uZSBQTVJFTUdlbmVyYXRvciBvYmplY3QuIElmIHlvdSBkbywgY2FsbGluZyBkaXNwb3NlKCkgb25cclxuXHQgKiBvbmUgb2YgdGhlbSB3aWxsIGNhdXNlIGFueSBvdGhlcnMgdG8gYWxzbyBiZWNvbWUgdW51c2FibGUuXHJcblx0ICovXHJcblx0ZGlzcG9zZSgpIHtcclxuXHJcblx0XHR0aGlzLl9kaXNwb3NlKCk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9jdWJlbWFwTWF0ZXJpYWwgIT09IG51bGwgKSB0aGlzLl9jdWJlbWFwTWF0ZXJpYWwuZGlzcG9zZSgpO1xyXG5cdFx0aWYgKCB0aGlzLl9lcXVpcmVjdE1hdGVyaWFsICE9PSBudWxsICkgdGhpcy5fZXF1aXJlY3RNYXRlcmlhbC5kaXNwb3NlKCk7XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gcHJpdmF0ZSBpbnRlcmZhY2VcclxuXHJcblx0X3NldFNpemUoIGN1YmVTaXplICkge1xyXG5cclxuXHRcdHRoaXMuX2xvZE1heCA9IE1hdGguZmxvb3IoIE1hdGgubG9nMiggY3ViZVNpemUgKSApO1xyXG5cdFx0dGhpcy5fY3ViZVNpemUgPSBNYXRoLnBvdyggMiwgdGhpcy5fbG9kTWF4ICk7XHJcblxyXG5cdH1cclxuXHJcblx0X2Rpc3Bvc2UoKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9ibHVyTWF0ZXJpYWwgIT09IG51bGwgKSB0aGlzLl9ibHVyTWF0ZXJpYWwuZGlzcG9zZSgpO1xyXG5cclxuXHRcdGlmICggdGhpcy5fcGluZ1BvbmdSZW5kZXJUYXJnZXQgIT09IG51bGwgKSB0aGlzLl9waW5nUG9uZ1JlbmRlclRhcmdldC5kaXNwb3NlKCk7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdGhpcy5fbG9kUGxhbmVzLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdHRoaXMuX2xvZFBsYW5lc1sgaSBdLmRpc3Bvc2UoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0X2NsZWFudXAoIG91dHB1dFRhcmdldCApIHtcclxuXHJcblx0XHR0aGlzLl9yZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIF9vbGRUYXJnZXQsIF9vbGRBY3RpdmVDdWJlRmFjZSwgX29sZEFjdGl2ZU1pcG1hcExldmVsICk7XHJcblx0XHR0aGlzLl9yZW5kZXJlci54ci5lbmFibGVkID0gX29sZFhyRW5hYmxlZDtcclxuXHJcblx0XHRvdXRwdXRUYXJnZXQuc2Npc3NvclRlc3QgPSBmYWxzZTtcclxuXHRcdF9zZXRWaWV3cG9ydCggb3V0cHV0VGFyZ2V0LCAwLCAwLCBvdXRwdXRUYXJnZXQud2lkdGgsIG91dHB1dFRhcmdldC5oZWlnaHQgKTtcclxuXHJcblx0fVxyXG5cclxuXHRfZnJvbVRleHR1cmUoIHRleHR1cmUsIHJlbmRlclRhcmdldCApIHtcclxuXHJcblx0XHRpZiAoIHRleHR1cmUubWFwcGluZyA9PT0gQ3ViZVJlZmxlY3Rpb25NYXBwaW5nIHx8IHRleHR1cmUubWFwcGluZyA9PT0gQ3ViZVJlZnJhY3Rpb25NYXBwaW5nICkge1xyXG5cclxuXHRcdFx0dGhpcy5fc2V0U2l6ZSggdGV4dHVyZS5pbWFnZS5sZW5ndGggPT09IDAgPyAxNiA6ICggdGV4dHVyZS5pbWFnZVsgMCBdLndpZHRoIHx8IHRleHR1cmUuaW1hZ2VbIDAgXS5pbWFnZS53aWR0aCApICk7XHJcblxyXG5cdFx0fSBlbHNlIHsgLy8gRXF1aXJlY3Rhbmd1bGFyXHJcblxyXG5cdFx0XHR0aGlzLl9zZXRTaXplKCB0ZXh0dXJlLmltYWdlLndpZHRoIC8gNCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRfb2xkVGFyZ2V0ID0gdGhpcy5fcmVuZGVyZXIuZ2V0UmVuZGVyVGFyZ2V0KCk7XHJcblx0XHRfb2xkQWN0aXZlQ3ViZUZhY2UgPSB0aGlzLl9yZW5kZXJlci5nZXRBY3RpdmVDdWJlRmFjZSgpO1xyXG5cdFx0X29sZEFjdGl2ZU1pcG1hcExldmVsID0gdGhpcy5fcmVuZGVyZXIuZ2V0QWN0aXZlTWlwbWFwTGV2ZWwoKTtcclxuXHRcdF9vbGRYckVuYWJsZWQgPSB0aGlzLl9yZW5kZXJlci54ci5lbmFibGVkO1xyXG5cclxuXHRcdHRoaXMuX3JlbmRlcmVyLnhyLmVuYWJsZWQgPSBmYWxzZTtcclxuXHJcblx0XHRjb25zdCBjdWJlVVZSZW5kZXJUYXJnZXQgPSByZW5kZXJUYXJnZXQgfHwgdGhpcy5fYWxsb2NhdGVUYXJnZXRzKCk7XHJcblx0XHR0aGlzLl90ZXh0dXJlVG9DdWJlVVYoIHRleHR1cmUsIGN1YmVVVlJlbmRlclRhcmdldCApO1xyXG5cdFx0dGhpcy5fYXBwbHlQTVJFTSggY3ViZVVWUmVuZGVyVGFyZ2V0ICk7XHJcblx0XHR0aGlzLl9jbGVhbnVwKCBjdWJlVVZSZW5kZXJUYXJnZXQgKTtcclxuXHJcblx0XHRyZXR1cm4gY3ViZVVWUmVuZGVyVGFyZ2V0O1xyXG5cclxuXHR9XHJcblxyXG5cdF9hbGxvY2F0ZVRhcmdldHMoKSB7XHJcblxyXG5cdFx0Y29uc3Qgd2lkdGggPSAzICogTWF0aC5tYXgoIHRoaXMuX2N1YmVTaXplLCAxNiAqIDcgKTtcclxuXHRcdGNvbnN0IGhlaWdodCA9IDQgKiB0aGlzLl9jdWJlU2l6ZTtcclxuXHJcblx0XHRjb25zdCBwYXJhbXMgPSB7XHJcblx0XHRcdG1hZ0ZpbHRlcjogTGluZWFyRmlsdGVyLFxyXG5cdFx0XHRtaW5GaWx0ZXI6IExpbmVhckZpbHRlcixcclxuXHRcdFx0Z2VuZXJhdGVNaXBtYXBzOiBmYWxzZSxcclxuXHRcdFx0dHlwZTogSGFsZkZsb2F0VHlwZSxcclxuXHRcdFx0Zm9ybWF0OiBSR0JBRm9ybWF0LFxyXG5cdFx0XHRjb2xvclNwYWNlOiBMaW5lYXJTUkdCQ29sb3JTcGFjZSxcclxuXHRcdFx0ZGVwdGhCdWZmZXI6IGZhbHNlXHJcblx0XHR9O1xyXG5cclxuXHRcdGNvbnN0IGN1YmVVVlJlbmRlclRhcmdldCA9IF9jcmVhdGVSZW5kZXJUYXJnZXQoIHdpZHRoLCBoZWlnaHQsIHBhcmFtcyApO1xyXG5cclxuXHRcdGlmICggdGhpcy5fcGluZ1BvbmdSZW5kZXJUYXJnZXQgPT09IG51bGwgfHwgdGhpcy5fcGluZ1BvbmdSZW5kZXJUYXJnZXQud2lkdGggIT09IHdpZHRoIHx8IHRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0LmhlaWdodCAhPT0gaGVpZ2h0ICkge1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLl9waW5nUG9uZ1JlbmRlclRhcmdldCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5fZGlzcG9zZSgpO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5fcGluZ1BvbmdSZW5kZXJUYXJnZXQgPSBfY3JlYXRlUmVuZGVyVGFyZ2V0KCB3aWR0aCwgaGVpZ2h0LCBwYXJhbXMgKTtcclxuXHJcblx0XHRcdGNvbnN0IHsgX2xvZE1heCB9ID0gdGhpcztcclxuXHRcdFx0KCB7IHNpemVMb2RzOiB0aGlzLl9zaXplTG9kcywgbG9kUGxhbmVzOiB0aGlzLl9sb2RQbGFuZXMsIHNpZ21hczogdGhpcy5fc2lnbWFzIH0gPSBfY3JlYXRlUGxhbmVzKCBfbG9kTWF4ICkgKTtcclxuXHJcblx0XHRcdHRoaXMuX2JsdXJNYXRlcmlhbCA9IF9nZXRCbHVyU2hhZGVyKCBfbG9kTWF4LCB3aWR0aCwgaGVpZ2h0ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBjdWJlVVZSZW5kZXJUYXJnZXQ7XHJcblxyXG5cdH1cclxuXHJcblx0X2NvbXBpbGVNYXRlcmlhbCggbWF0ZXJpYWwgKSB7XHJcblxyXG5cdFx0Y29uc3QgdG1wTWVzaCA9IG5ldyBNZXNoKCB0aGlzLl9sb2RQbGFuZXNbIDAgXSwgbWF0ZXJpYWwgKTtcclxuXHRcdHRoaXMuX3JlbmRlcmVyLmNvbXBpbGUoIHRtcE1lc2gsIF9mbGF0Q2FtZXJhICk7XHJcblxyXG5cdH1cclxuXHJcblx0X3NjZW5lVG9DdWJlVVYoIHNjZW5lLCBuZWFyLCBmYXIsIGN1YmVVVlJlbmRlclRhcmdldCwgcG9zaXRpb24gKSB7XHJcblxyXG5cdFx0Y29uc3QgZm92ID0gOTA7XHJcblx0XHRjb25zdCBhc3BlY3QgPSAxO1xyXG5cdFx0Y29uc3QgY3ViZUNhbWVyYSA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggZm92LCBhc3BlY3QsIG5lYXIsIGZhciApO1xyXG5cdFx0Y29uc3QgdXBTaWduID0gWyAxLCAtIDEsIDEsIDEsIDEsIDEgXTtcclxuXHRcdGNvbnN0IGZvcndhcmRTaWduID0gWyAxLCAxLCAxLCAtIDEsIC0gMSwgLSAxIF07XHJcblx0XHRjb25zdCByZW5kZXJlciA9IHRoaXMuX3JlbmRlcmVyO1xyXG5cclxuXHRcdGNvbnN0IG9yaWdpbmFsQXV0b0NsZWFyID0gcmVuZGVyZXIuYXV0b0NsZWFyO1xyXG5cdFx0Y29uc3QgdG9uZU1hcHBpbmcgPSByZW5kZXJlci50b25lTWFwcGluZztcclxuXHRcdHJlbmRlcmVyLmdldENsZWFyQ29sb3IoIF9jbGVhckNvbG9yICk7XHJcblxyXG5cdFx0cmVuZGVyZXIudG9uZU1hcHBpbmcgPSBOb1RvbmVNYXBwaW5nO1xyXG5cdFx0cmVuZGVyZXIuYXV0b0NsZWFyID0gZmFsc2U7XHJcblxyXG5cdFx0Y29uc3QgYmFja2dyb3VuZE1hdGVyaWFsID0gbmV3IE1lc2hCYXNpY01hdGVyaWFsKCB7XHJcblx0XHRcdG5hbWU6ICdQTVJFTS5CYWNrZ3JvdW5kJyxcclxuXHRcdFx0c2lkZTogQmFja1NpZGUsXHJcblx0XHRcdGRlcHRoV3JpdGU6IGZhbHNlLFxyXG5cdFx0XHRkZXB0aFRlc3Q6IGZhbHNlLFxyXG5cdFx0fSApO1xyXG5cclxuXHRcdGNvbnN0IGJhY2tncm91bmRCb3ggPSBuZXcgTWVzaCggbmV3IEJveEdlb21ldHJ5KCksIGJhY2tncm91bmRNYXRlcmlhbCApO1xyXG5cclxuXHRcdGxldCB1c2VTb2xpZENvbG9yID0gZmFsc2U7XHJcblx0XHRjb25zdCBiYWNrZ3JvdW5kID0gc2NlbmUuYmFja2dyb3VuZDtcclxuXHJcblx0XHRpZiAoIGJhY2tncm91bmQgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGJhY2tncm91bmQuaXNDb2xvciApIHtcclxuXHJcblx0XHRcdFx0YmFja2dyb3VuZE1hdGVyaWFsLmNvbG9yLmNvcHkoIGJhY2tncm91bmQgKTtcclxuXHRcdFx0XHRzY2VuZS5iYWNrZ3JvdW5kID0gbnVsbDtcclxuXHRcdFx0XHR1c2VTb2xpZENvbG9yID0gdHJ1ZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0YmFja2dyb3VuZE1hdGVyaWFsLmNvbG9yLmNvcHkoIF9jbGVhckNvbG9yICk7XHJcblx0XHRcdHVzZVNvbGlkQ29sb3IgPSB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCA2OyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgY29sID0gaSAlIDM7XHJcblxyXG5cdFx0XHRpZiAoIGNvbCA9PT0gMCApIHtcclxuXHJcblx0XHRcdFx0Y3ViZUNhbWVyYS51cC5zZXQoIDAsIHVwU2lnblsgaSBdLCAwICk7XHJcblx0XHRcdFx0Y3ViZUNhbWVyYS5wb3NpdGlvbi5zZXQoIHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHBvc2l0aW9uLnogKTtcclxuXHRcdFx0XHRjdWJlQ2FtZXJhLmxvb2tBdCggcG9zaXRpb24ueCArIGZvcndhcmRTaWduWyBpIF0sIHBvc2l0aW9uLnksIHBvc2l0aW9uLnogKTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGNvbCA9PT0gMSApIHtcclxuXHJcblx0XHRcdFx0Y3ViZUNhbWVyYS51cC5zZXQoIDAsIDAsIHVwU2lnblsgaSBdICk7XHJcblx0XHRcdFx0Y3ViZUNhbWVyYS5wb3NpdGlvbi5zZXQoIHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHBvc2l0aW9uLnogKTtcclxuXHRcdFx0XHRjdWJlQ2FtZXJhLmxvb2tBdCggcG9zaXRpb24ueCwgcG9zaXRpb24ueSArIGZvcndhcmRTaWduWyBpIF0sIHBvc2l0aW9uLnogKTtcclxuXHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRjdWJlQ2FtZXJhLnVwLnNldCggMCwgdXBTaWduWyBpIF0sIDAgKTtcclxuXHRcdFx0XHRjdWJlQ2FtZXJhLnBvc2l0aW9uLnNldCggcG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24ueiApO1xyXG5cdFx0XHRcdGN1YmVDYW1lcmEubG9va0F0KCBwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56ICsgZm9yd2FyZFNpZ25bIGkgXSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3Qgc2l6ZSA9IHRoaXMuX2N1YmVTaXplO1xyXG5cclxuXHRcdFx0X3NldFZpZXdwb3J0KCBjdWJlVVZSZW5kZXJUYXJnZXQsIGNvbCAqIHNpemUsIGkgPiAyID8gc2l6ZSA6IDAsIHNpemUsIHNpemUgKTtcclxuXHJcblx0XHRcdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggY3ViZVVWUmVuZGVyVGFyZ2V0ICk7XHJcblxyXG5cdFx0XHRpZiAoIHVzZVNvbGlkQ29sb3IgKSB7XHJcblxyXG5cdFx0XHRcdHJlbmRlcmVyLnJlbmRlciggYmFja2dyb3VuZEJveCwgY3ViZUNhbWVyYSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmVuZGVyZXIucmVuZGVyKCBzY2VuZSwgY3ViZUNhbWVyYSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRiYWNrZ3JvdW5kQm94Lmdlb21ldHJ5LmRpc3Bvc2UoKTtcclxuXHRcdGJhY2tncm91bmRCb3gubWF0ZXJpYWwuZGlzcG9zZSgpO1xyXG5cclxuXHRcdHJlbmRlcmVyLnRvbmVNYXBwaW5nID0gdG9uZU1hcHBpbmc7XHJcblx0XHRyZW5kZXJlci5hdXRvQ2xlYXIgPSBvcmlnaW5hbEF1dG9DbGVhcjtcclxuXHRcdHNjZW5lLmJhY2tncm91bmQgPSBiYWNrZ3JvdW5kO1xyXG5cclxuXHR9XHJcblxyXG5cdF90ZXh0dXJlVG9DdWJlVVYoIHRleHR1cmUsIGN1YmVVVlJlbmRlclRhcmdldCApIHtcclxuXHJcblx0XHRjb25zdCByZW5kZXJlciA9IHRoaXMuX3JlbmRlcmVyO1xyXG5cclxuXHRcdGNvbnN0IGlzQ3ViZVRleHR1cmUgPSAoIHRleHR1cmUubWFwcGluZyA9PT0gQ3ViZVJlZmxlY3Rpb25NYXBwaW5nIHx8IHRleHR1cmUubWFwcGluZyA9PT0gQ3ViZVJlZnJhY3Rpb25NYXBwaW5nICk7XHJcblxyXG5cdFx0aWYgKCBpc0N1YmVUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLl9jdWJlbWFwTWF0ZXJpYWwgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdHRoaXMuX2N1YmVtYXBNYXRlcmlhbCA9IF9nZXRDdWJlbWFwTWF0ZXJpYWwoKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuX2N1YmVtYXBNYXRlcmlhbC51bmlmb3Jtcy5mbGlwRW52TWFwLnZhbHVlID0gKCB0ZXh0dXJlLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSA9PT0gZmFsc2UgKSA/IC0gMSA6IDE7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGlmICggdGhpcy5fZXF1aXJlY3RNYXRlcmlhbCA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5fZXF1aXJlY3RNYXRlcmlhbCA9IF9nZXRFcXVpcmVjdE1hdGVyaWFsKCk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IG1hdGVyaWFsID0gaXNDdWJlVGV4dHVyZSA/IHRoaXMuX2N1YmVtYXBNYXRlcmlhbCA6IHRoaXMuX2VxdWlyZWN0TWF0ZXJpYWw7XHJcblx0XHRjb25zdCBtZXNoID0gbmV3IE1lc2goIHRoaXMuX2xvZFBsYW5lc1sgMCBdLCBtYXRlcmlhbCApO1xyXG5cclxuXHRcdGNvbnN0IHVuaWZvcm1zID0gbWF0ZXJpYWwudW5pZm9ybXM7XHJcblxyXG5cdFx0dW5pZm9ybXNbICdlbnZNYXAnIF0udmFsdWUgPSB0ZXh0dXJlO1xyXG5cclxuXHRcdGNvbnN0IHNpemUgPSB0aGlzLl9jdWJlU2l6ZTtcclxuXHJcblx0XHRfc2V0Vmlld3BvcnQoIGN1YmVVVlJlbmRlclRhcmdldCwgMCwgMCwgMyAqIHNpemUsIDIgKiBzaXplICk7XHJcblxyXG5cdFx0cmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCBjdWJlVVZSZW5kZXJUYXJnZXQgKTtcclxuXHRcdHJlbmRlcmVyLnJlbmRlciggbWVzaCwgX2ZsYXRDYW1lcmEgKTtcclxuXHJcblx0fVxyXG5cclxuXHRfYXBwbHlQTVJFTSggY3ViZVVWUmVuZGVyVGFyZ2V0ICkge1xyXG5cclxuXHRcdGNvbnN0IHJlbmRlcmVyID0gdGhpcy5fcmVuZGVyZXI7XHJcblx0XHRjb25zdCBhdXRvQ2xlYXIgPSByZW5kZXJlci5hdXRvQ2xlYXI7XHJcblx0XHRyZW5kZXJlci5hdXRvQ2xlYXIgPSBmYWxzZTtcclxuXHRcdGNvbnN0IG4gPSB0aGlzLl9sb2RQbGFuZXMubGVuZ3RoO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMTsgaSA8IG47IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBzaWdtYSA9IE1hdGguc3FydCggdGhpcy5fc2lnbWFzWyBpIF0gKiB0aGlzLl9zaWdtYXNbIGkgXSAtIHRoaXMuX3NpZ21hc1sgaSAtIDEgXSAqIHRoaXMuX3NpZ21hc1sgaSAtIDEgXSApO1xyXG5cclxuXHRcdFx0Y29uc3QgcG9sZUF4aXMgPSBfYXhpc0RpcmVjdGlvbnNbICggbiAtIGkgLSAxICkgJSBfYXhpc0RpcmVjdGlvbnMubGVuZ3RoIF07XHJcblxyXG5cdFx0XHR0aGlzLl9ibHVyKCBjdWJlVVZSZW5kZXJUYXJnZXQsIGkgLSAxLCBpLCBzaWdtYSwgcG9sZUF4aXMgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmVuZGVyZXIuYXV0b0NsZWFyID0gYXV0b0NsZWFyO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgaXMgYSB0d28tcGFzcyBHYXVzc2lhbiBibHVyIGZvciBhIGN1YmVtYXAuIE5vcm1hbGx5IHRoaXMgaXMgZG9uZVxyXG5cdCAqIHZlcnRpY2FsbHkgYW5kIGhvcml6b250YWxseSwgYnV0IHRoaXMgYnJlYWtzIGRvd24gb24gYSBjdWJlLiBIZXJlIHdlIGFwcGx5XHJcblx0ICogdGhlIGJsdXIgbGF0aXR1ZGluYWxseSAoYXJvdW5kIHRoZSBwb2xlcyksIGFuZCB0aGVuIGxvbmdpdHVkaW5hbGx5ICh0b3dhcmRzXHJcblx0ICogdGhlIHBvbGVzKSB0byBhcHByb3hpbWF0ZSB0aGUgb3J0aG9nb25hbGx5LXNlcGFyYWJsZSBibHVyLiBJdCBpcyBsZWFzdFxyXG5cdCAqIGFjY3VyYXRlIGF0IHRoZSBwb2xlcywgYnV0IHN0aWxsIGRvZXMgYSBkZWNlbnQgam9iLlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBjdWJlVVZSZW5kZXJUYXJnZXRcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbG9kSW5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbG9kT3V0XHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHNpZ21hXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBbcG9sZUF4aXNdXHJcblx0ICovXHJcblx0X2JsdXIoIGN1YmVVVlJlbmRlclRhcmdldCwgbG9kSW4sIGxvZE91dCwgc2lnbWEsIHBvbGVBeGlzICkge1xyXG5cclxuXHRcdGNvbnN0IHBpbmdQb25nUmVuZGVyVGFyZ2V0ID0gdGhpcy5fcGluZ1BvbmdSZW5kZXJUYXJnZXQ7XHJcblxyXG5cdFx0dGhpcy5faGFsZkJsdXIoXHJcblx0XHRcdGN1YmVVVlJlbmRlclRhcmdldCxcclxuXHRcdFx0cGluZ1BvbmdSZW5kZXJUYXJnZXQsXHJcblx0XHRcdGxvZEluLFxyXG5cdFx0XHRsb2RPdXQsXHJcblx0XHRcdHNpZ21hLFxyXG5cdFx0XHQnbGF0aXR1ZGluYWwnLFxyXG5cdFx0XHRwb2xlQXhpcyApO1xyXG5cclxuXHRcdHRoaXMuX2hhbGZCbHVyKFxyXG5cdFx0XHRwaW5nUG9uZ1JlbmRlclRhcmdldCxcclxuXHRcdFx0Y3ViZVVWUmVuZGVyVGFyZ2V0LFxyXG5cdFx0XHRsb2RPdXQsXHJcblx0XHRcdGxvZE91dCxcclxuXHRcdFx0c2lnbWEsXHJcblx0XHRcdCdsb25naXR1ZGluYWwnLFxyXG5cdFx0XHRwb2xlQXhpcyApO1xyXG5cclxuXHR9XHJcblxyXG5cdF9oYWxmQmx1ciggdGFyZ2V0SW4sIHRhcmdldE91dCwgbG9kSW4sIGxvZE91dCwgc2lnbWFSYWRpYW5zLCBkaXJlY3Rpb24sIHBvbGVBeGlzICkge1xyXG5cclxuXHRcdGNvbnN0IHJlbmRlcmVyID0gdGhpcy5fcmVuZGVyZXI7XHJcblx0XHRjb25zdCBibHVyTWF0ZXJpYWwgPSB0aGlzLl9ibHVyTWF0ZXJpYWw7XHJcblxyXG5cdFx0aWYgKCBkaXJlY3Rpb24gIT09ICdsYXRpdHVkaW5hbCcgJiYgZGlyZWN0aW9uICE9PSAnbG9uZ2l0dWRpbmFsJyApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoXHJcblx0XHRcdFx0J2JsdXIgZGlyZWN0aW9uIG11c3QgYmUgZWl0aGVyIGxhdGl0dWRpbmFsIG9yIGxvbmdpdHVkaW5hbCEnICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIE51bWJlciBvZiBzdGFuZGFyZCBkZXZpYXRpb25zIGF0IHdoaWNoIHRvIGN1dCBvZmYgdGhlIGRpc2NyZXRlIGFwcHJveGltYXRpb24uXHJcblx0XHRjb25zdCBTVEFOREFSRF9ERVZJQVRJT05TID0gMztcclxuXHJcblx0XHRjb25zdCBibHVyTWVzaCA9IG5ldyBNZXNoKCB0aGlzLl9sb2RQbGFuZXNbIGxvZE91dCBdLCBibHVyTWF0ZXJpYWwgKTtcclxuXHRcdGNvbnN0IGJsdXJVbmlmb3JtcyA9IGJsdXJNYXRlcmlhbC51bmlmb3JtcztcclxuXHJcblx0XHRjb25zdCBwaXhlbHMgPSB0aGlzLl9zaXplTG9kc1sgbG9kSW4gXSAtIDE7XHJcblx0XHRjb25zdCByYWRpYW5zUGVyUGl4ZWwgPSBpc0Zpbml0ZSggc2lnbWFSYWRpYW5zICkgPyBNYXRoLlBJIC8gKCAyICogcGl4ZWxzICkgOiAyICogTWF0aC5QSSAvICggMiAqIE1BWF9TQU1QTEVTIC0gMSApO1xyXG5cdFx0Y29uc3Qgc2lnbWFQaXhlbHMgPSBzaWdtYVJhZGlhbnMgLyByYWRpYW5zUGVyUGl4ZWw7XHJcblx0XHRjb25zdCBzYW1wbGVzID0gaXNGaW5pdGUoIHNpZ21hUmFkaWFucyApID8gMSArIE1hdGguZmxvb3IoIFNUQU5EQVJEX0RFVklBVElPTlMgKiBzaWdtYVBpeGVscyApIDogTUFYX1NBTVBMRVM7XHJcblxyXG5cdFx0aWYgKCBzYW1wbGVzID4gTUFYX1NBTVBMRVMgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLndhcm4oIGBzaWdtYVJhZGlhbnMsICR7XHJcblx0XHRcdFx0c2lnbWFSYWRpYW5zfSwgaXMgdG9vIGxhcmdlIGFuZCB3aWxsIGNsaXAsIGFzIGl0IHJlcXVlc3RlZCAke1xyXG5cdFx0XHRcdHNhbXBsZXN9IHNhbXBsZXMgd2hlbiB0aGUgbWF4aW11bSBpcyBzZXQgdG8gJHtNQVhfU0FNUExFU31gICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHdlaWdodHMgPSBbXTtcclxuXHRcdGxldCBzdW0gPSAwO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IE1BWF9TQU1QTEVTOyArKyBpICkge1xyXG5cclxuXHRcdFx0Y29uc3QgeCA9IGkgLyBzaWdtYVBpeGVscztcclxuXHRcdFx0Y29uc3Qgd2VpZ2h0ID0gTWF0aC5leHAoIC0geCAqIHggLyAyICk7XHJcblx0XHRcdHdlaWdodHMucHVzaCggd2VpZ2h0ICk7XHJcblxyXG5cdFx0XHRpZiAoIGkgPT09IDAgKSB7XHJcblxyXG5cdFx0XHRcdHN1bSArPSB3ZWlnaHQ7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBpIDwgc2FtcGxlcyApIHtcclxuXHJcblx0XHRcdFx0c3VtICs9IDIgKiB3ZWlnaHQ7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHdlaWdodHMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0d2VpZ2h0c1sgaSBdID0gd2VpZ2h0c1sgaSBdIC8gc3VtO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRibHVyVW5pZm9ybXNbICdlbnZNYXAnIF0udmFsdWUgPSB0YXJnZXRJbi50ZXh0dXJlO1xyXG5cdFx0Ymx1clVuaWZvcm1zWyAnc2FtcGxlcycgXS52YWx1ZSA9IHNhbXBsZXM7XHJcblx0XHRibHVyVW5pZm9ybXNbICd3ZWlnaHRzJyBdLnZhbHVlID0gd2VpZ2h0cztcclxuXHRcdGJsdXJVbmlmb3Jtc1sgJ2xhdGl0dWRpbmFsJyBdLnZhbHVlID0gZGlyZWN0aW9uID09PSAnbGF0aXR1ZGluYWwnO1xyXG5cclxuXHRcdGlmICggcG9sZUF4aXMgKSB7XHJcblxyXG5cdFx0XHRibHVyVW5pZm9ybXNbICdwb2xlQXhpcycgXS52YWx1ZSA9IHBvbGVBeGlzO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCB7IF9sb2RNYXggfSA9IHRoaXM7XHJcblx0XHRibHVyVW5pZm9ybXNbICdkVGhldGEnIF0udmFsdWUgPSByYWRpYW5zUGVyUGl4ZWw7XHJcblx0XHRibHVyVW5pZm9ybXNbICdtaXBJbnQnIF0udmFsdWUgPSBfbG9kTWF4IC0gbG9kSW47XHJcblxyXG5cdFx0Y29uc3Qgb3V0cHV0U2l6ZSA9IHRoaXMuX3NpemVMb2RzWyBsb2RPdXQgXTtcclxuXHRcdGNvbnN0IHggPSAzICogb3V0cHV0U2l6ZSAqICggbG9kT3V0ID4gX2xvZE1heCAtIExPRF9NSU4gPyBsb2RPdXQgLSBfbG9kTWF4ICsgTE9EX01JTiA6IDAgKTtcclxuXHRcdGNvbnN0IHkgPSA0ICogKCB0aGlzLl9jdWJlU2l6ZSAtIG91dHB1dFNpemUgKTtcclxuXHJcblx0XHRfc2V0Vmlld3BvcnQoIHRhcmdldE91dCwgeCwgeSwgMyAqIG91dHB1dFNpemUsIDIgKiBvdXRwdXRTaXplICk7XHJcblx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHRhcmdldE91dCApO1xyXG5cdFx0cmVuZGVyZXIucmVuZGVyKCBibHVyTWVzaCwgX2ZsYXRDYW1lcmEgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcblxyXG5mdW5jdGlvbiBfY3JlYXRlUGxhbmVzKCBsb2RNYXggKSB7XHJcblxyXG5cdGNvbnN0IGxvZFBsYW5lcyA9IFtdO1xyXG5cdGNvbnN0IHNpemVMb2RzID0gW107XHJcblx0Y29uc3Qgc2lnbWFzID0gW107XHJcblxyXG5cdGxldCBsb2QgPSBsb2RNYXg7XHJcblxyXG5cdGNvbnN0IHRvdGFsTG9kcyA9IGxvZE1heCAtIExPRF9NSU4gKyAxICsgRVhUUkFfTE9EX1NJR01BLmxlbmd0aDtcclxuXHJcblx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdG90YWxMb2RzOyBpICsrICkge1xyXG5cclxuXHRcdGNvbnN0IHNpemVMb2QgPSBNYXRoLnBvdyggMiwgbG9kICk7XHJcblx0XHRzaXplTG9kcy5wdXNoKCBzaXplTG9kICk7XHJcblx0XHRsZXQgc2lnbWEgPSAxLjAgLyBzaXplTG9kO1xyXG5cclxuXHRcdGlmICggaSA+IGxvZE1heCAtIExPRF9NSU4gKSB7XHJcblxyXG5cdFx0XHRzaWdtYSA9IEVYVFJBX0xPRF9TSUdNQVsgaSAtIGxvZE1heCArIExPRF9NSU4gLSAxIF07XHJcblxyXG5cdFx0fSBlbHNlIGlmICggaSA9PT0gMCApIHtcclxuXHJcblx0XHRcdHNpZ21hID0gMDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0c2lnbWFzLnB1c2goIHNpZ21hICk7XHJcblxyXG5cdFx0Y29uc3QgdGV4ZWxTaXplID0gMS4wIC8gKCBzaXplTG9kIC0gMiApO1xyXG5cdFx0Y29uc3QgbWluID0gLSB0ZXhlbFNpemU7XHJcblx0XHRjb25zdCBtYXggPSAxICsgdGV4ZWxTaXplO1xyXG5cdFx0Y29uc3QgdXYxID0gWyBtaW4sIG1pbiwgbWF4LCBtaW4sIG1heCwgbWF4LCBtaW4sIG1pbiwgbWF4LCBtYXgsIG1pbiwgbWF4IF07XHJcblxyXG5cdFx0Y29uc3QgY3ViZUZhY2VzID0gNjtcclxuXHRcdGNvbnN0IHZlcnRpY2VzID0gNjtcclxuXHRcdGNvbnN0IHBvc2l0aW9uU2l6ZSA9IDM7XHJcblx0XHRjb25zdCB1dlNpemUgPSAyO1xyXG5cdFx0Y29uc3QgZmFjZUluZGV4U2l6ZSA9IDE7XHJcblxyXG5cdFx0Y29uc3QgcG9zaXRpb24gPSBuZXcgRmxvYXQzMkFycmF5KCBwb3NpdGlvblNpemUgKiB2ZXJ0aWNlcyAqIGN1YmVGYWNlcyApO1xyXG5cdFx0Y29uc3QgdXYgPSBuZXcgRmxvYXQzMkFycmF5KCB1dlNpemUgKiB2ZXJ0aWNlcyAqIGN1YmVGYWNlcyApO1xyXG5cdFx0Y29uc3QgZmFjZUluZGV4ID0gbmV3IEZsb2F0MzJBcnJheSggZmFjZUluZGV4U2l6ZSAqIHZlcnRpY2VzICogY3ViZUZhY2VzICk7XHJcblxyXG5cdFx0Zm9yICggbGV0IGZhY2UgPSAwOyBmYWNlIDwgY3ViZUZhY2VzOyBmYWNlICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgeCA9ICggZmFjZSAlIDMgKSAqIDIgLyAzIC0gMTtcclxuXHRcdFx0Y29uc3QgeSA9IGZhY2UgPiAyID8gMCA6IC0gMTtcclxuXHRcdFx0Y29uc3QgY29vcmRpbmF0ZXMgPSBbXHJcblx0XHRcdFx0eCwgeSwgMCxcclxuXHRcdFx0XHR4ICsgMiAvIDMsIHksIDAsXHJcblx0XHRcdFx0eCArIDIgLyAzLCB5ICsgMSwgMCxcclxuXHRcdFx0XHR4LCB5LCAwLFxyXG5cdFx0XHRcdHggKyAyIC8gMywgeSArIDEsIDAsXHJcblx0XHRcdFx0eCwgeSArIDEsIDBcclxuXHRcdFx0XTtcclxuXHRcdFx0cG9zaXRpb24uc2V0KCBjb29yZGluYXRlcywgcG9zaXRpb25TaXplICogdmVydGljZXMgKiBmYWNlICk7XHJcblx0XHRcdHV2LnNldCggdXYxLCB1dlNpemUgKiB2ZXJ0aWNlcyAqIGZhY2UgKTtcclxuXHRcdFx0Y29uc3QgZmlsbCA9IFsgZmFjZSwgZmFjZSwgZmFjZSwgZmFjZSwgZmFjZSwgZmFjZSBdO1xyXG5cdFx0XHRmYWNlSW5kZXguc2V0KCBmaWxsLCBmYWNlSW5kZXhTaXplICogdmVydGljZXMgKiBmYWNlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHBsYW5lcyA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xyXG5cdFx0cGxhbmVzLnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIHBvc2l0aW9uU2l6ZSApICk7XHJcblx0XHRwbGFuZXMuc2V0QXR0cmlidXRlKCAndXYnLCBuZXcgQnVmZmVyQXR0cmlidXRlKCB1diwgdXZTaXplICkgKTtcclxuXHRcdHBsYW5lcy5zZXRBdHRyaWJ1dGUoICdmYWNlSW5kZXgnLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBmYWNlSW5kZXgsIGZhY2VJbmRleFNpemUgKSApO1xyXG5cdFx0bG9kUGxhbmVzLnB1c2goIHBsYW5lcyApO1xyXG5cclxuXHRcdGlmICggbG9kID4gTE9EX01JTiApIHtcclxuXHJcblx0XHRcdGxvZCAtLTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIHsgbG9kUGxhbmVzLCBzaXplTG9kcywgc2lnbWFzIH07XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBfY3JlYXRlUmVuZGVyVGFyZ2V0KCB3aWR0aCwgaGVpZ2h0LCBwYXJhbXMgKSB7XHJcblxyXG5cdGNvbnN0IGN1YmVVVlJlbmRlclRhcmdldCA9IG5ldyBXZWJHTFJlbmRlclRhcmdldCggd2lkdGgsIGhlaWdodCwgcGFyYW1zICk7XHJcblx0Y3ViZVVWUmVuZGVyVGFyZ2V0LnRleHR1cmUubWFwcGluZyA9IEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nO1xyXG5cdGN1YmVVVlJlbmRlclRhcmdldC50ZXh0dXJlLm5hbWUgPSAnUE1SRU0uY3ViZVV2JztcclxuXHRjdWJlVVZSZW5kZXJUYXJnZXQuc2Npc3NvclRlc3QgPSB0cnVlO1xyXG5cdHJldHVybiBjdWJlVVZSZW5kZXJUYXJnZXQ7XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBfc2V0Vmlld3BvcnQoIHRhcmdldCwgeCwgeSwgd2lkdGgsIGhlaWdodCApIHtcclxuXHJcblx0dGFyZ2V0LnZpZXdwb3J0LnNldCggeCwgeSwgd2lkdGgsIGhlaWdodCApO1xyXG5cdHRhcmdldC5zY2lzc29yLnNldCggeCwgeSwgd2lkdGgsIGhlaWdodCApO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gX2dldEJsdXJTaGFkZXIoIGxvZE1heCwgd2lkdGgsIGhlaWdodCApIHtcclxuXHJcblx0Y29uc3Qgd2VpZ2h0cyA9IG5ldyBGbG9hdDMyQXJyYXkoIE1BWF9TQU1QTEVTICk7XHJcblx0Y29uc3QgcG9sZUF4aXMgPSBuZXcgVmVjdG9yMyggMCwgMSwgMCApO1xyXG5cdGNvbnN0IHNoYWRlck1hdGVyaWFsID0gbmV3IFNoYWRlck1hdGVyaWFsKCB7XHJcblxyXG5cdFx0bmFtZTogJ1NwaGVyaWNhbEdhdXNzaWFuQmx1cicsXHJcblxyXG5cdFx0ZGVmaW5lczoge1xyXG5cdFx0XHQnbic6IE1BWF9TQU1QTEVTLFxyXG5cdFx0XHQnQ1VCRVVWX1RFWEVMX1dJRFRIJzogMS4wIC8gd2lkdGgsXHJcblx0XHRcdCdDVUJFVVZfVEVYRUxfSEVJR0hUJzogMS4wIC8gaGVpZ2h0LFxyXG5cdFx0XHQnQ1VCRVVWX01BWF9NSVAnOiBgJHtsb2RNYXh9LjBgLFxyXG5cdFx0fSxcclxuXHJcblx0XHR1bmlmb3Jtczoge1xyXG5cdFx0XHQnZW52TWFwJzogeyB2YWx1ZTogbnVsbCB9LFxyXG5cdFx0XHQnc2FtcGxlcyc6IHsgdmFsdWU6IDEgfSxcclxuXHRcdFx0J3dlaWdodHMnOiB7IHZhbHVlOiB3ZWlnaHRzIH0sXHJcblx0XHRcdCdsYXRpdHVkaW5hbCc6IHsgdmFsdWU6IGZhbHNlIH0sXHJcblx0XHRcdCdkVGhldGEnOiB7IHZhbHVlOiAwIH0sXHJcblx0XHRcdCdtaXBJbnQnOiB7IHZhbHVlOiAwIH0sXHJcblx0XHRcdCdwb2xlQXhpcyc6IHsgdmFsdWU6IHBvbGVBeGlzIH1cclxuXHRcdH0sXHJcblxyXG5cdFx0dmVydGV4U2hhZGVyOiBfZ2V0Q29tbW9uVmVydGV4U2hhZGVyKCksXHJcblxyXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IC8qIGdsc2wgKi9gXHJcblxyXG5cdFx0XHRwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcclxuXHRcdFx0cHJlY2lzaW9uIG1lZGl1bXAgaW50O1xyXG5cclxuXHRcdFx0dmFyeWluZyB2ZWMzIHZPdXRwdXREaXJlY3Rpb247XHJcblxyXG5cdFx0XHR1bmlmb3JtIHNhbXBsZXIyRCBlbnZNYXA7XHJcblx0XHRcdHVuaWZvcm0gaW50IHNhbXBsZXM7XHJcblx0XHRcdHVuaWZvcm0gZmxvYXQgd2VpZ2h0c1sgbiBdO1xyXG5cdFx0XHR1bmlmb3JtIGJvb2wgbGF0aXR1ZGluYWw7XHJcblx0XHRcdHVuaWZvcm0gZmxvYXQgZFRoZXRhO1xyXG5cdFx0XHR1bmlmb3JtIGZsb2F0IG1pcEludDtcclxuXHRcdFx0dW5pZm9ybSB2ZWMzIHBvbGVBeGlzO1xyXG5cclxuXHRcdFx0I2RlZmluZSBFTlZNQVBfVFlQRV9DVUJFX1VWXHJcblx0XHRcdCNpbmNsdWRlIDxjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQ+XHJcblxyXG5cdFx0XHR2ZWMzIGdldFNhbXBsZSggZmxvYXQgdGhldGEsIHZlYzMgYXhpcyApIHtcclxuXHJcblx0XHRcdFx0ZmxvYXQgY29zVGhldGEgPSBjb3MoIHRoZXRhICk7XHJcblx0XHRcdFx0Ly8gUm9kcmlndWVzJyBheGlzLWFuZ2xlIHJvdGF0aW9uXHJcblx0XHRcdFx0dmVjMyBzYW1wbGVEaXJlY3Rpb24gPSB2T3V0cHV0RGlyZWN0aW9uICogY29zVGhldGFcclxuXHRcdFx0XHRcdCsgY3Jvc3MoIGF4aXMsIHZPdXRwdXREaXJlY3Rpb24gKSAqIHNpbiggdGhldGEgKVxyXG5cdFx0XHRcdFx0KyBheGlzICogZG90KCBheGlzLCB2T3V0cHV0RGlyZWN0aW9uICkgKiAoIDEuMCAtIGNvc1RoZXRhICk7XHJcblxyXG5cdFx0XHRcdHJldHVybiBiaWxpbmVhckN1YmVVViggZW52TWFwLCBzYW1wbGVEaXJlY3Rpb24sIG1pcEludCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dm9pZCBtYWluKCkge1xyXG5cclxuXHRcdFx0XHR2ZWMzIGF4aXMgPSBsYXRpdHVkaW5hbCA/IHBvbGVBeGlzIDogY3Jvc3MoIHBvbGVBeGlzLCB2T3V0cHV0RGlyZWN0aW9uICk7XHJcblxyXG5cdFx0XHRcdGlmICggYWxsKCBlcXVhbCggYXhpcywgdmVjMyggMC4wICkgKSApICkge1xyXG5cclxuXHRcdFx0XHRcdGF4aXMgPSB2ZWMzKCB2T3V0cHV0RGlyZWN0aW9uLnosIDAuMCwgLSB2T3V0cHV0RGlyZWN0aW9uLnggKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRheGlzID0gbm9ybWFsaXplKCBheGlzICk7XHJcblxyXG5cdFx0XHRcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIDAuMCwgMC4wLCAwLjAsIDEuMCApO1xyXG5cdFx0XHRcdGdsX0ZyYWdDb2xvci5yZ2IgKz0gd2VpZ2h0c1sgMCBdICogZ2V0U2FtcGxlKCAwLjAsIGF4aXMgKTtcclxuXHJcblx0XHRcdFx0Zm9yICggaW50IGkgPSAxOyBpIDwgbjsgaSsrICkge1xyXG5cclxuXHRcdFx0XHRcdGlmICggaSA+PSBzYW1wbGVzICkge1xyXG5cclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGZsb2F0IHRoZXRhID0gZFRoZXRhICogZmxvYXQoIGkgKTtcclxuXHRcdFx0XHRcdGdsX0ZyYWdDb2xvci5yZ2IgKz0gd2VpZ2h0c1sgaSBdICogZ2V0U2FtcGxlKCAtMS4wICogdGhldGEsIGF4aXMgKTtcclxuXHRcdFx0XHRcdGdsX0ZyYWdDb2xvci5yZ2IgKz0gd2VpZ2h0c1sgaSBdICogZ2V0U2FtcGxlKCB0aGV0YSwgYXhpcyApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblx0XHRgLFxyXG5cclxuXHRcdGJsZW5kaW5nOiBOb0JsZW5kaW5nLFxyXG5cdFx0ZGVwdGhUZXN0OiBmYWxzZSxcclxuXHRcdGRlcHRoV3JpdGU6IGZhbHNlXHJcblxyXG5cdH0gKTtcclxuXHJcblx0cmV0dXJuIHNoYWRlck1hdGVyaWFsO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gX2dldEVxdWlyZWN0TWF0ZXJpYWwoKSB7XHJcblxyXG5cdHJldHVybiBuZXcgU2hhZGVyTWF0ZXJpYWwoIHtcclxuXHJcblx0XHRuYW1lOiAnRXF1aXJlY3Rhbmd1bGFyVG9DdWJlVVYnLFxyXG5cclxuXHRcdHVuaWZvcm1zOiB7XHJcblx0XHRcdCdlbnZNYXAnOiB7IHZhbHVlOiBudWxsIH1cclxuXHRcdH0sXHJcblxyXG5cdFx0dmVydGV4U2hhZGVyOiBfZ2V0Q29tbW9uVmVydGV4U2hhZGVyKCksXHJcblxyXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IC8qIGdsc2wgKi9gXHJcblxyXG5cdFx0XHRwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcclxuXHRcdFx0cHJlY2lzaW9uIG1lZGl1bXAgaW50O1xyXG5cclxuXHRcdFx0dmFyeWluZyB2ZWMzIHZPdXRwdXREaXJlY3Rpb247XHJcblxyXG5cdFx0XHR1bmlmb3JtIHNhbXBsZXIyRCBlbnZNYXA7XHJcblxyXG5cdFx0XHQjaW5jbHVkZSA8Y29tbW9uPlxyXG5cclxuXHRcdFx0dm9pZCBtYWluKCkge1xyXG5cclxuXHRcdFx0XHR2ZWMzIG91dHB1dERpcmVjdGlvbiA9IG5vcm1hbGl6ZSggdk91dHB1dERpcmVjdGlvbiApO1xyXG5cdFx0XHRcdHZlYzIgdXYgPSBlcXVpcmVjdFV2KCBvdXRwdXREaXJlY3Rpb24gKTtcclxuXHJcblx0XHRcdFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggdGV4dHVyZTJEICggZW52TWFwLCB1diApLnJnYiwgMS4wICk7XHJcblxyXG5cdFx0XHR9XHJcblx0XHRgLFxyXG5cclxuXHRcdGJsZW5kaW5nOiBOb0JsZW5kaW5nLFxyXG5cdFx0ZGVwdGhUZXN0OiBmYWxzZSxcclxuXHRcdGRlcHRoV3JpdGU6IGZhbHNlXHJcblxyXG5cdH0gKTtcclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIF9nZXRDdWJlbWFwTWF0ZXJpYWwoKSB7XHJcblxyXG5cdHJldHVybiBuZXcgU2hhZGVyTWF0ZXJpYWwoIHtcclxuXHJcblx0XHRuYW1lOiAnQ3ViZW1hcFRvQ3ViZVVWJyxcclxuXHJcblx0XHR1bmlmb3Jtczoge1xyXG5cdFx0XHQnZW52TWFwJzogeyB2YWx1ZTogbnVsbCB9LFxyXG5cdFx0XHQnZmxpcEVudk1hcCc6IHsgdmFsdWU6IC0gMSB9XHJcblx0XHR9LFxyXG5cclxuXHRcdHZlcnRleFNoYWRlcjogX2dldENvbW1vblZlcnRleFNoYWRlcigpLFxyXG5cclxuXHRcdGZyYWdtZW50U2hhZGVyOiAvKiBnbHNsICovYFxyXG5cclxuXHRcdFx0cHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XHJcblx0XHRcdHByZWNpc2lvbiBtZWRpdW1wIGludDtcclxuXHJcblx0XHRcdHVuaWZvcm0gZmxvYXQgZmxpcEVudk1hcDtcclxuXHJcblx0XHRcdHZhcnlpbmcgdmVjMyB2T3V0cHV0RGlyZWN0aW9uO1xyXG5cclxuXHRcdFx0dW5pZm9ybSBzYW1wbGVyQ3ViZSBlbnZNYXA7XHJcblxyXG5cdFx0XHR2b2lkIG1haW4oKSB7XHJcblxyXG5cdFx0XHRcdGdsX0ZyYWdDb2xvciA9IHRleHR1cmVDdWJlKCBlbnZNYXAsIHZlYzMoIGZsaXBFbnZNYXAgKiB2T3V0cHV0RGlyZWN0aW9uLngsIHZPdXRwdXREaXJlY3Rpb24ueXogKSApO1xyXG5cclxuXHRcdFx0fVxyXG5cdFx0YCxcclxuXHJcblx0XHRibGVuZGluZzogTm9CbGVuZGluZyxcclxuXHRcdGRlcHRoVGVzdDogZmFsc2UsXHJcblx0XHRkZXB0aFdyaXRlOiBmYWxzZVxyXG5cclxuXHR9ICk7XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBfZ2V0Q29tbW9uVmVydGV4U2hhZGVyKCkge1xyXG5cclxuXHRyZXR1cm4gLyogZ2xzbCAqL2BcclxuXHJcblx0XHRwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcclxuXHRcdHByZWNpc2lvbiBtZWRpdW1wIGludDtcclxuXHJcblx0XHRhdHRyaWJ1dGUgZmxvYXQgZmFjZUluZGV4O1xyXG5cclxuXHRcdHZhcnlpbmcgdmVjMyB2T3V0cHV0RGlyZWN0aW9uO1xyXG5cclxuXHRcdC8vIFJIIGNvb3JkaW5hdGUgc3lzdGVtOyBQTVJFTSBmYWNlLWluZGV4aW5nIGNvbnZlbnRpb25cclxuXHRcdHZlYzMgZ2V0RGlyZWN0aW9uKCB2ZWMyIHV2LCBmbG9hdCBmYWNlICkge1xyXG5cclxuXHRcdFx0dXYgPSAyLjAgKiB1diAtIDEuMDtcclxuXHJcblx0XHRcdHZlYzMgZGlyZWN0aW9uID0gdmVjMyggdXYsIDEuMCApO1xyXG5cclxuXHRcdFx0aWYgKCBmYWNlID09IDAuMCApIHtcclxuXHJcblx0XHRcdFx0ZGlyZWN0aW9uID0gZGlyZWN0aW9uLnp5eDsgLy8gKCAxLCB2LCB1ICkgcG9zIHhcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGZhY2UgPT0gMS4wICkge1xyXG5cclxuXHRcdFx0XHRkaXJlY3Rpb24gPSBkaXJlY3Rpb24ueHp5O1xyXG5cdFx0XHRcdGRpcmVjdGlvbi54eiAqPSAtMS4wOyAvLyAoIC11LCAxLCAtdiApIHBvcyB5XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBmYWNlID09IDIuMCApIHtcclxuXHJcblx0XHRcdFx0ZGlyZWN0aW9uLnggKj0gLTEuMDsgLy8gKCAtdSwgdiwgMSApIHBvcyB6XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBmYWNlID09IDMuMCApIHtcclxuXHJcblx0XHRcdFx0ZGlyZWN0aW9uID0gZGlyZWN0aW9uLnp5eDtcclxuXHRcdFx0XHRkaXJlY3Rpb24ueHogKj0gLTEuMDsgLy8gKCAtMSwgdiwgLXUgKSBuZWcgeFxyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggZmFjZSA9PSA0LjAgKSB7XHJcblxyXG5cdFx0XHRcdGRpcmVjdGlvbiA9IGRpcmVjdGlvbi54enk7XHJcblx0XHRcdFx0ZGlyZWN0aW9uLnh5ICo9IC0xLjA7IC8vICggLXUsIC0xLCB2ICkgbmVnIHlcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGZhY2UgPT0gNS4wICkge1xyXG5cclxuXHRcdFx0XHRkaXJlY3Rpb24ueiAqPSAtMS4wOyAvLyAoIHUsIHYsIC0xICkgbmVnIHpcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBkaXJlY3Rpb247XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHZvaWQgbWFpbigpIHtcclxuXHJcblx0XHRcdHZPdXRwdXREaXJlY3Rpb24gPSBnZXREaXJlY3Rpb24oIHV2LCBmYWNlSW5kZXggKTtcclxuXHRcdFx0Z2xfUG9zaXRpb24gPSB2ZWM0KCBwb3NpdGlvbiwgMS4wICk7XHJcblxyXG5cdFx0fVxyXG5cdGA7XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBQTVJFTUdlbmVyYXRvciB9O1xyXG4iLCJpbXBvcnQgeyBDdWJlUmVmbGVjdGlvbk1hcHBpbmcsIEN1YmVSZWZyYWN0aW9uTWFwcGluZywgRXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmcsIEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgUE1SRU1HZW5lcmF0b3IgfSBmcm9tICcuLi8uLi9leHRyYXMvUE1SRU1HZW5lcmF0b3IuanMnO1xyXG5cclxuZnVuY3Rpb24gV2ViR0xDdWJlVVZNYXBzKCByZW5kZXJlciApIHtcclxuXHJcblx0bGV0IGN1YmVVVm1hcHMgPSBuZXcgV2Vha01hcCgpO1xyXG5cclxuXHRsZXQgcG1yZW1HZW5lcmF0b3IgPSBudWxsO1xyXG5cclxuXHRmdW5jdGlvbiBnZXQoIHRleHR1cmUgKSB7XHJcblxyXG5cdFx0aWYgKCB0ZXh0dXJlICYmIHRleHR1cmUuaXNUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0Y29uc3QgbWFwcGluZyA9IHRleHR1cmUubWFwcGluZztcclxuXHJcblx0XHRcdGNvbnN0IGlzRXF1aXJlY3RNYXAgPSAoIG1hcHBpbmcgPT09IEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nIHx8IG1hcHBpbmcgPT09IEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nICk7XHJcblx0XHRcdGNvbnN0IGlzQ3ViZU1hcCA9ICggbWFwcGluZyA9PT0gQ3ViZVJlZmxlY3Rpb25NYXBwaW5nIHx8IG1hcHBpbmcgPT09IEN1YmVSZWZyYWN0aW9uTWFwcGluZyApO1xyXG5cclxuXHRcdFx0Ly8gZXF1aXJlY3QvY3ViZSBtYXAgdG8gY3ViZVVWIGNvbnZlcnNpb25cclxuXHJcblx0XHRcdGlmICggaXNFcXVpcmVjdE1hcCB8fCBpc0N1YmVNYXAgKSB7XHJcblxyXG5cdFx0XHRcdGxldCByZW5kZXJUYXJnZXQgPSBjdWJlVVZtYXBzLmdldCggdGV4dHVyZSApO1xyXG5cclxuXHRcdFx0XHRjb25zdCBjdXJyZW50UE1SRU1WZXJzaW9uID0gcmVuZGVyVGFyZ2V0ICE9PSB1bmRlZmluZWQgPyByZW5kZXJUYXJnZXQudGV4dHVyZS5wbXJlbVZlcnNpb24gOiAwO1xyXG5cclxuXHRcdFx0XHRpZiAoIHRleHR1cmUuaXNSZW5kZXJUYXJnZXRUZXh0dXJlICYmIHRleHR1cmUucG1yZW1WZXJzaW9uICE9PSBjdXJyZW50UE1SRU1WZXJzaW9uICkge1xyXG5cclxuXHRcdFx0XHRcdGlmICggcG1yZW1HZW5lcmF0b3IgPT09IG51bGwgKSBwbXJlbUdlbmVyYXRvciA9IG5ldyBQTVJFTUdlbmVyYXRvciggcmVuZGVyZXIgKTtcclxuXHJcblx0XHRcdFx0XHRyZW5kZXJUYXJnZXQgPSBpc0VxdWlyZWN0TWFwID8gcG1yZW1HZW5lcmF0b3IuZnJvbUVxdWlyZWN0YW5ndWxhciggdGV4dHVyZSwgcmVuZGVyVGFyZ2V0ICkgOiBwbXJlbUdlbmVyYXRvci5mcm9tQ3ViZW1hcCggdGV4dHVyZSwgcmVuZGVyVGFyZ2V0ICk7XHJcblx0XHRcdFx0XHRyZW5kZXJUYXJnZXQudGV4dHVyZS5wbXJlbVZlcnNpb24gPSB0ZXh0dXJlLnBtcmVtVmVyc2lvbjtcclxuXHJcblx0XHRcdFx0XHRjdWJlVVZtYXBzLnNldCggdGV4dHVyZSwgcmVuZGVyVGFyZ2V0ICk7XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIHJlbmRlclRhcmdldC50ZXh0dXJlO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdGlmICggcmVuZGVyVGFyZ2V0ICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gcmVuZGVyVGFyZ2V0LnRleHR1cmU7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnN0IGltYWdlID0gdGV4dHVyZS5pbWFnZTtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggKCBpc0VxdWlyZWN0TWFwICYmIGltYWdlICYmIGltYWdlLmhlaWdodCA+IDAgKSB8fCAoIGlzQ3ViZU1hcCAmJiBpbWFnZSAmJiBpc0N1YmVUZXh0dXJlQ29tcGxldGUoIGltYWdlICkgKSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKCBwbXJlbUdlbmVyYXRvciA9PT0gbnVsbCApIHBtcmVtR2VuZXJhdG9yID0gbmV3IFBNUkVNR2VuZXJhdG9yKCByZW5kZXJlciApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRyZW5kZXJUYXJnZXQgPSBpc0VxdWlyZWN0TWFwID8gcG1yZW1HZW5lcmF0b3IuZnJvbUVxdWlyZWN0YW5ndWxhciggdGV4dHVyZSApIDogcG1yZW1HZW5lcmF0b3IuZnJvbUN1YmVtYXAoIHRleHR1cmUgKTtcclxuXHRcdFx0XHRcdFx0XHRyZW5kZXJUYXJnZXQudGV4dHVyZS5wbXJlbVZlcnNpb24gPSB0ZXh0dXJlLnBtcmVtVmVyc2lvbjtcclxuXHJcblx0XHRcdFx0XHRcdFx0Y3ViZVVWbWFwcy5zZXQoIHRleHR1cmUsIHJlbmRlclRhcmdldCApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHR0ZXh0dXJlLmFkZEV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25UZXh0dXJlRGlzcG9zZSApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gcmVuZGVyVGFyZ2V0LnRleHR1cmU7XHJcblxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0XHQvLyBpbWFnZSBub3QgeWV0IHJlYWR5LiB0cnkgdGhlIGNvbnZlcnNpb24gbmV4dCBmcmFtZVxyXG5cclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRleHR1cmU7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gaXNDdWJlVGV4dHVyZUNvbXBsZXRlKCBpbWFnZSApIHtcclxuXHJcblx0XHRsZXQgY291bnQgPSAwO1xyXG5cdFx0Y29uc3QgbGVuZ3RoID0gNjtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGltYWdlWyBpIF0gIT09IHVuZGVmaW5lZCApIGNvdW50ICsrO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gY291bnQgPT09IGxlbmd0aDtcclxuXHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gb25UZXh0dXJlRGlzcG9zZSggZXZlbnQgKSB7XHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZSA9IGV2ZW50LnRhcmdldDtcclxuXHJcblx0XHR0ZXh0dXJlLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25UZXh0dXJlRGlzcG9zZSApO1xyXG5cclxuXHRcdGNvbnN0IGN1YmVtYXBVViA9IGN1YmVVVm1hcHMuZ2V0KCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0aWYgKCBjdWJlbWFwVVYgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGN1YmVVVm1hcHMuZGVsZXRlKCB0ZXh0dXJlICk7XHJcblx0XHRcdGN1YmVtYXBVVi5kaXNwb3NlKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0Y3ViZVVWbWFwcyA9IG5ldyBXZWFrTWFwKCk7XHJcblxyXG5cdFx0aWYgKCBwbXJlbUdlbmVyYXRvciAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHBtcmVtR2VuZXJhdG9yLmRpc3Bvc2UoKTtcclxuXHRcdFx0cG1yZW1HZW5lcmF0b3IgPSBudWxsO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4ge1xyXG5cdFx0Z2V0OiBnZXQsXHJcblx0XHRkaXNwb3NlOiBkaXNwb3NlXHJcblx0fTtcclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFdlYkdMQ3ViZVVWTWFwcyB9O1xyXG4iLCJpbXBvcnQgeyB3YXJuT25jZSB9IGZyb20gJy4uLy4uL3V0aWxzLmpzJztcclxuXHJcbmZ1bmN0aW9uIFdlYkdMRXh0ZW5zaW9ucyggZ2wgKSB7XHJcblxyXG5cdGNvbnN0IGV4dGVuc2lvbnMgPSB7fTtcclxuXHJcblx0ZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uKCBuYW1lICkge1xyXG5cclxuXHRcdGlmICggZXh0ZW5zaW9uc1sgbmFtZSBdICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gZXh0ZW5zaW9uc1sgbmFtZSBdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRsZXQgZXh0ZW5zaW9uO1xyXG5cclxuXHRcdHN3aXRjaCAoIG5hbWUgKSB7XHJcblxyXG5cdFx0XHRjYXNlICdXRUJHTF9kZXB0aF90ZXh0dXJlJzpcclxuXHRcdFx0XHRleHRlbnNpb24gPSBnbC5nZXRFeHRlbnNpb24oICdXRUJHTF9kZXB0aF90ZXh0dXJlJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ01PWl9XRUJHTF9kZXB0aF90ZXh0dXJlJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ1dFQktJVF9XRUJHTF9kZXB0aF90ZXh0dXJlJyApO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSAnRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJzpcclxuXHRcdFx0XHRleHRlbnNpb24gPSBnbC5nZXRFeHRlbnNpb24oICdFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnICkgfHwgZ2wuZ2V0RXh0ZW5zaW9uKCAnTU9aX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYycgKSB8fCBnbC5nZXRFeHRlbnNpb24oICdXRUJLSVRfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJyApO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMnOlxyXG5cdFx0XHRcdGV4dGVuc2lvbiA9IGdsLmdldEV4dGVuc2lvbiggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ01PWl9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YycgKSB8fCBnbC5nZXRFeHRlbnNpb24oICdXRUJLSVRfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMnICk7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnOlxyXG5cdFx0XHRcdGV4dGVuc2lvbiA9IGdsLmdldEV4dGVuc2lvbiggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YycgKSB8fCBnbC5nZXRFeHRlbnNpb24oICdXRUJLSVRfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjJyApO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRleHRlbnNpb24gPSBnbC5nZXRFeHRlbnNpb24oIG5hbWUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0ZXh0ZW5zaW9uc1sgbmFtZSBdID0gZXh0ZW5zaW9uO1xyXG5cclxuXHRcdHJldHVybiBleHRlbnNpb247XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIHtcclxuXHJcblx0XHRoYXM6IGZ1bmN0aW9uICggbmFtZSApIHtcclxuXHJcblx0XHRcdHJldHVybiBnZXRFeHRlbnNpb24oIG5hbWUgKSAhPT0gbnVsbDtcclxuXHJcblx0XHR9LFxyXG5cclxuXHRcdGluaXQ6IGZ1bmN0aW9uICgpIHtcclxuXHJcblx0XHRcdGdldEV4dGVuc2lvbiggJ0VYVF9jb2xvcl9idWZmZXJfZmxvYXQnICk7XHJcblx0XHRcdGdldEV4dGVuc2lvbiggJ1dFQkdMX2NsaXBfY3VsbF9kaXN0YW5jZScgKTtcclxuXHRcdFx0Z2V0RXh0ZW5zaW9uKCAnT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyJyApO1xyXG5cdFx0XHRnZXRFeHRlbnNpb24oICdFWFRfY29sb3JfYnVmZmVyX2hhbGZfZmxvYXQnICk7XHJcblx0XHRcdGdldEV4dGVuc2lvbiggJ1dFQkdMX211bHRpc2FtcGxlZF9yZW5kZXJfdG9fdGV4dHVyZScgKTtcclxuXHRcdFx0Z2V0RXh0ZW5zaW9uKCAnV0VCR0xfcmVuZGVyX3NoYXJlZF9leHBvbmVudCcgKTtcclxuXHJcblx0XHR9LFxyXG5cclxuXHRcdGdldDogZnVuY3Rpb24gKCBuYW1lICkge1xyXG5cclxuXHRcdFx0Y29uc3QgZXh0ZW5zaW9uID0gZ2V0RXh0ZW5zaW9uKCBuYW1lICk7XHJcblxyXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0d2Fybk9uY2UoICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAnICsgbmFtZSArICcgZXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQuJyApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIGV4dGVuc2lvbjtcclxuXHJcblx0XHR9XHJcblxyXG5cdH07XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgV2ViR0xFeHRlbnNpb25zIH07XHJcbiIsImltcG9ydCB7IFVpbnQxNkJ1ZmZlckF0dHJpYnV0ZSwgVWludDMyQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5pbXBvcnQgeyBhcnJheU5lZWRzVWludDMyIH0gZnJvbSAnLi4vLi4vdXRpbHMuanMnO1xyXG5cclxuZnVuY3Rpb24gV2ViR0xHZW9tZXRyaWVzKCBnbCwgYXR0cmlidXRlcywgaW5mbywgYmluZGluZ1N0YXRlcyApIHtcclxuXHJcblx0Y29uc3QgZ2VvbWV0cmllcyA9IHt9O1xyXG5cdGNvbnN0IHdpcmVmcmFtZUF0dHJpYnV0ZXMgPSBuZXcgV2Vha01hcCgpO1xyXG5cclxuXHRmdW5jdGlvbiBvbkdlb21ldHJ5RGlzcG9zZSggZXZlbnQgKSB7XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSBldmVudC50YXJnZXQ7XHJcblxyXG5cdFx0aWYgKCBnZW9tZXRyeS5pbmRleCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGF0dHJpYnV0ZXMucmVtb3ZlKCBnZW9tZXRyeS5pbmRleCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmb3IgKCBjb25zdCBuYW1lIGluIGdlb21ldHJ5LmF0dHJpYnV0ZXMgKSB7XHJcblxyXG5cdFx0XHRhdHRyaWJ1dGVzLnJlbW92ZSggZ2VvbWV0cnkuYXR0cmlidXRlc1sgbmFtZSBdICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGdlb21ldHJ5LnJlbW92ZUV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25HZW9tZXRyeURpc3Bvc2UgKTtcclxuXHJcblx0XHRkZWxldGUgZ2VvbWV0cmllc1sgZ2VvbWV0cnkuaWQgXTtcclxuXHJcblx0XHRjb25zdCBhdHRyaWJ1dGUgPSB3aXJlZnJhbWVBdHRyaWJ1dGVzLmdldCggZ2VvbWV0cnkgKTtcclxuXHJcblx0XHRpZiAoIGF0dHJpYnV0ZSApIHtcclxuXHJcblx0XHRcdGF0dHJpYnV0ZXMucmVtb3ZlKCBhdHRyaWJ1dGUgKTtcclxuXHRcdFx0d2lyZWZyYW1lQXR0cmlidXRlcy5kZWxldGUoIGdlb21ldHJ5ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGJpbmRpbmdTdGF0ZXMucmVsZWFzZVN0YXRlc09mR2VvbWV0cnkoIGdlb21ldHJ5ICk7XHJcblxyXG5cdFx0aWYgKCBnZW9tZXRyeS5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5ID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0ZGVsZXRlIGdlb21ldHJ5Ll9tYXhJbnN0YW5jZUNvdW50O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGluZm8ubWVtb3J5Lmdlb21ldHJpZXMgLS07XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gZ2V0KCBvYmplY3QsIGdlb21ldHJ5ICkge1xyXG5cclxuXHRcdGlmICggZ2VvbWV0cmllc1sgZ2VvbWV0cnkuaWQgXSA9PT0gdHJ1ZSApIHJldHVybiBnZW9tZXRyeTtcclxuXHJcblx0XHRnZW9tZXRyeS5hZGRFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uR2VvbWV0cnlEaXNwb3NlICk7XHJcblxyXG5cdFx0Z2VvbWV0cmllc1sgZ2VvbWV0cnkuaWQgXSA9IHRydWU7XHJcblxyXG5cdFx0aW5mby5tZW1vcnkuZ2VvbWV0cmllcyArKztcclxuXHJcblx0XHRyZXR1cm4gZ2VvbWV0cnk7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gdXBkYXRlKCBnZW9tZXRyeSApIHtcclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeUF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzO1xyXG5cclxuXHRcdC8vIFVwZGF0aW5nIGluZGV4IGJ1ZmZlciBpbiBWQU8gbm93LiBTZWUgV2ViR0xCaW5kaW5nU3RhdGVzLlxyXG5cclxuXHRcdGZvciAoIGNvbnN0IG5hbWUgaW4gZ2VvbWV0cnlBdHRyaWJ1dGVzICkge1xyXG5cclxuXHRcdFx0YXR0cmlidXRlcy51cGRhdGUoIGdlb21ldHJ5QXR0cmlidXRlc1sgbmFtZSBdLCBnbC5BUlJBWV9CVUZGRVIgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gdXBkYXRlV2lyZWZyYW1lQXR0cmlidXRlKCBnZW9tZXRyeSApIHtcclxuXHJcblx0XHRjb25zdCBpbmRpY2VzID0gW107XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnlJbmRleCA9IGdlb21ldHJ5LmluZGV4O1xyXG5cdFx0Y29uc3QgZ2VvbWV0cnlQb3NpdGlvbiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XHJcblx0XHRsZXQgdmVyc2lvbiA9IDA7XHJcblxyXG5cdFx0aWYgKCBnZW9tZXRyeUluZGV4ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYXJyYXkgPSBnZW9tZXRyeUluZGV4LmFycmF5O1xyXG5cdFx0XHR2ZXJzaW9uID0gZ2VvbWV0cnlJbmRleC52ZXJzaW9uO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gYXJyYXkubGVuZ3RoOyBpIDwgbDsgaSArPSAzICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBhID0gYXJyYXlbIGkgKyAwIF07XHJcblx0XHRcdFx0Y29uc3QgYiA9IGFycmF5WyBpICsgMSBdO1xyXG5cdFx0XHRcdGNvbnN0IGMgPSBhcnJheVsgaSArIDIgXTtcclxuXHJcblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBiLCBjLCBjLCBhICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmICggZ2VvbWV0cnlQb3NpdGlvbiAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYXJyYXkgPSBnZW9tZXRyeVBvc2l0aW9uLmFycmF5O1xyXG5cdFx0XHR2ZXJzaW9uID0gZ2VvbWV0cnlQb3NpdGlvbi52ZXJzaW9uO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gKCBhcnJheS5sZW5ndGggLyAzICkgLSAxOyBpIDwgbDsgaSArPSAzICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBhID0gaSArIDA7XHJcblx0XHRcdFx0Y29uc3QgYiA9IGkgKyAxO1xyXG5cdFx0XHRcdGNvbnN0IGMgPSBpICsgMjtcclxuXHJcblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBiLCBjLCBjLCBhICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgYXR0cmlidXRlID0gbmV3ICggYXJyYXlOZWVkc1VpbnQzMiggaW5kaWNlcyApID8gVWludDMyQnVmZmVyQXR0cmlidXRlIDogVWludDE2QnVmZmVyQXR0cmlidXRlICkoIGluZGljZXMsIDEgKTtcclxuXHRcdGF0dHJpYnV0ZS52ZXJzaW9uID0gdmVyc2lvbjtcclxuXHJcblx0XHQvLyBVcGRhdGluZyBpbmRleCBidWZmZXIgaW4gVkFPIG5vdy4gU2VlIFdlYkdMQmluZGluZ1N0YXRlc1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0Y29uc3QgcHJldmlvdXNBdHRyaWJ1dGUgPSB3aXJlZnJhbWVBdHRyaWJ1dGVzLmdldCggZ2VvbWV0cnkgKTtcclxuXHJcblx0XHRpZiAoIHByZXZpb3VzQXR0cmlidXRlICkgYXR0cmlidXRlcy5yZW1vdmUoIHByZXZpb3VzQXR0cmlidXRlICk7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHR3aXJlZnJhbWVBdHRyaWJ1dGVzLnNldCggZ2VvbWV0cnksIGF0dHJpYnV0ZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGdldFdpcmVmcmFtZUF0dHJpYnV0ZSggZ2VvbWV0cnkgKSB7XHJcblxyXG5cdFx0Y29uc3QgY3VycmVudEF0dHJpYnV0ZSA9IHdpcmVmcmFtZUF0dHJpYnV0ZXMuZ2V0KCBnZW9tZXRyeSApO1xyXG5cclxuXHRcdGlmICggY3VycmVudEF0dHJpYnV0ZSApIHtcclxuXHJcblx0XHRcdGNvbnN0IGdlb21ldHJ5SW5kZXggPSBnZW9tZXRyeS5pbmRleDtcclxuXHJcblx0XHRcdGlmICggZ2VvbWV0cnlJbmRleCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0Ly8gaWYgdGhlIGF0dHJpYnV0ZSBpcyBvYnNvbGV0ZSwgY3JlYXRlIGEgbmV3IG9uZVxyXG5cclxuXHRcdFx0XHRpZiAoIGN1cnJlbnRBdHRyaWJ1dGUudmVyc2lvbiA8IGdlb21ldHJ5SW5kZXgudmVyc2lvbiApIHtcclxuXHJcblx0XHRcdFx0XHR1cGRhdGVXaXJlZnJhbWVBdHRyaWJ1dGUoIGdlb21ldHJ5ICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dXBkYXRlV2lyZWZyYW1lQXR0cmlidXRlKCBnZW9tZXRyeSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gd2lyZWZyYW1lQXR0cmlidXRlcy5nZXQoIGdlb21ldHJ5ICk7XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIHtcclxuXHJcblx0XHRnZXQ6IGdldCxcclxuXHRcdHVwZGF0ZTogdXBkYXRlLFxyXG5cclxuXHRcdGdldFdpcmVmcmFtZUF0dHJpYnV0ZTogZ2V0V2lyZWZyYW1lQXR0cmlidXRlXHJcblxyXG5cdH07XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgV2ViR0xHZW9tZXRyaWVzIH07XHJcbiIsImZ1bmN0aW9uIFdlYkdMSW5kZXhlZEJ1ZmZlclJlbmRlcmVyKCBnbCwgZXh0ZW5zaW9ucywgaW5mbyApIHtcclxuXHJcblx0bGV0IG1vZGU7XHJcblxyXG5cdGZ1bmN0aW9uIHNldE1vZGUoIHZhbHVlICkge1xyXG5cclxuXHRcdG1vZGUgPSB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHRsZXQgdHlwZSwgYnl0ZXNQZXJFbGVtZW50O1xyXG5cclxuXHRmdW5jdGlvbiBzZXRJbmRleCggdmFsdWUgKSB7XHJcblxyXG5cdFx0dHlwZSA9IHZhbHVlLnR5cGU7XHJcblx0XHRieXRlc1BlckVsZW1lbnQgPSB2YWx1ZS5ieXRlc1BlckVsZW1lbnQ7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gcmVuZGVyKCBzdGFydCwgY291bnQgKSB7XHJcblxyXG5cdFx0Z2wuZHJhd0VsZW1lbnRzKCBtb2RlLCBjb3VudCwgdHlwZSwgc3RhcnQgKiBieXRlc1BlckVsZW1lbnQgKTtcclxuXHJcblx0XHRpbmZvLnVwZGF0ZSggY291bnQsIG1vZGUsIDEgKTtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiByZW5kZXJJbnN0YW5jZXMoIHN0YXJ0LCBjb3VudCwgcHJpbWNvdW50ICkge1xyXG5cclxuXHRcdGlmICggcHJpbWNvdW50ID09PSAwICkgcmV0dXJuO1xyXG5cclxuXHRcdGdsLmRyYXdFbGVtZW50c0luc3RhbmNlZCggbW9kZSwgY291bnQsIHR5cGUsIHN0YXJ0ICogYnl0ZXNQZXJFbGVtZW50LCBwcmltY291bnQgKTtcclxuXHJcblx0XHRpbmZvLnVwZGF0ZSggY291bnQsIG1vZGUsIHByaW1jb3VudCApO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHJlbmRlck11bHRpRHJhdyggc3RhcnRzLCBjb3VudHMsIGRyYXdDb3VudCApIHtcclxuXHJcblx0XHRpZiAoIGRyYXdDb3VudCA9PT0gMCApIHJldHVybjtcclxuXHJcblx0XHRjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX211bHRpX2RyYXcnICk7XHJcblx0XHRleHRlbnNpb24ubXVsdGlEcmF3RWxlbWVudHNXRUJHTCggbW9kZSwgY291bnRzLCAwLCB0eXBlLCBzdGFydHMsIDAsIGRyYXdDb3VudCApO1xyXG5cclxuXHRcdGxldCBlbGVtZW50Q291bnQgPSAwO1xyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgZHJhd0NvdW50OyBpICsrICkge1xyXG5cclxuXHRcdFx0ZWxlbWVudENvdW50ICs9IGNvdW50c1sgaSBdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpbmZvLnVwZGF0ZSggZWxlbWVudENvdW50LCBtb2RlLCAxICk7XHJcblxyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHJlbmRlck11bHRpRHJhd0luc3RhbmNlcyggc3RhcnRzLCBjb3VudHMsIGRyYXdDb3VudCwgcHJpbWNvdW50ICkge1xyXG5cclxuXHRcdGlmICggZHJhd0NvdW50ID09PSAwICkgcmV0dXJuO1xyXG5cclxuXHRcdGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfbXVsdGlfZHJhdycgKTtcclxuXHJcblx0XHRpZiAoIGV4dGVuc2lvbiA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHN0YXJ0cy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdHJlbmRlckluc3RhbmNlcyggc3RhcnRzWyBpIF0gLyBieXRlc1BlckVsZW1lbnQsIGNvdW50c1sgaSBdLCBwcmltY291bnRbIGkgXSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRleHRlbnNpb24ubXVsdGlEcmF3RWxlbWVudHNJbnN0YW5jZWRXRUJHTCggbW9kZSwgY291bnRzLCAwLCB0eXBlLCBzdGFydHMsIDAsIHByaW1jb3VudCwgMCwgZHJhd0NvdW50ICk7XHJcblxyXG5cdFx0XHRsZXQgZWxlbWVudENvdW50ID0gMDtcclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgZHJhd0NvdW50OyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRlbGVtZW50Q291bnQgKz0gY291bnRzWyBpIF0gKiBwcmltY291bnRbIGkgXTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGluZm8udXBkYXRlKCBlbGVtZW50Q291bnQsIG1vZGUsIDEgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0Ly9cclxuXHJcblx0dGhpcy5zZXRNb2RlID0gc2V0TW9kZTtcclxuXHR0aGlzLnNldEluZGV4ID0gc2V0SW5kZXg7XHJcblx0dGhpcy5yZW5kZXIgPSByZW5kZXI7XHJcblx0dGhpcy5yZW5kZXJJbnN0YW5jZXMgPSByZW5kZXJJbnN0YW5jZXM7XHJcblx0dGhpcy5yZW5kZXJNdWx0aURyYXcgPSByZW5kZXJNdWx0aURyYXc7XHJcblx0dGhpcy5yZW5kZXJNdWx0aURyYXdJbnN0YW5jZXMgPSByZW5kZXJNdWx0aURyYXdJbnN0YW5jZXM7XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgV2ViR0xJbmRleGVkQnVmZmVyUmVuZGVyZXIgfTtcclxuIiwiZnVuY3Rpb24gV2ViR0xJbmZvKCBnbCApIHtcclxuXHJcblx0Y29uc3QgbWVtb3J5ID0ge1xyXG5cdFx0Z2VvbWV0cmllczogMCxcclxuXHRcdHRleHR1cmVzOiAwXHJcblx0fTtcclxuXHJcblx0Y29uc3QgcmVuZGVyID0ge1xyXG5cdFx0ZnJhbWU6IDAsXHJcblx0XHRjYWxsczogMCxcclxuXHRcdHRyaWFuZ2xlczogMCxcclxuXHRcdHBvaW50czogMCxcclxuXHRcdGxpbmVzOiAwXHJcblx0fTtcclxuXHJcblx0ZnVuY3Rpb24gdXBkYXRlKCBjb3VudCwgbW9kZSwgaW5zdGFuY2VDb3VudCApIHtcclxuXHJcblx0XHRyZW5kZXIuY2FsbHMgKys7XHJcblxyXG5cdFx0c3dpdGNoICggbW9kZSApIHtcclxuXHJcblx0XHRcdGNhc2UgZ2wuVFJJQU5HTEVTOlxyXG5cdFx0XHRcdHJlbmRlci50cmlhbmdsZXMgKz0gaW5zdGFuY2VDb3VudCAqICggY291bnQgLyAzICk7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIGdsLkxJTkVTOlxyXG5cdFx0XHRcdHJlbmRlci5saW5lcyArPSBpbnN0YW5jZUNvdW50ICogKCBjb3VudCAvIDIgKTtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgZ2wuTElORV9TVFJJUDpcclxuXHRcdFx0XHRyZW5kZXIubGluZXMgKz0gaW5zdGFuY2VDb3VudCAqICggY291bnQgLSAxICk7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIGdsLkxJTkVfTE9PUDpcclxuXHRcdFx0XHRyZW5kZXIubGluZXMgKz0gaW5zdGFuY2VDb3VudCAqIGNvdW50O1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBnbC5QT0lOVFM6XHJcblx0XHRcdFx0cmVuZGVyLnBvaW50cyArPSBpbnN0YW5jZUNvdW50ICogY291bnQ7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTEluZm86IFVua25vd24gZHJhdyBtb2RlOicsIG1vZGUgKTtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gcmVzZXQoKSB7XHJcblxyXG5cdFx0cmVuZGVyLmNhbGxzID0gMDtcclxuXHRcdHJlbmRlci50cmlhbmdsZXMgPSAwO1xyXG5cdFx0cmVuZGVyLnBvaW50cyA9IDA7XHJcblx0XHRyZW5kZXIubGluZXMgPSAwO1xyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiB7XHJcblx0XHRtZW1vcnk6IG1lbW9yeSxcclxuXHRcdHJlbmRlcjogcmVuZGVyLFxyXG5cdFx0cHJvZ3JhbXM6IG51bGwsXHJcblx0XHRhdXRvUmVzZXQ6IHRydWUsXHJcblx0XHRyZXNldDogcmVzZXQsXHJcblx0XHR1cGRhdGU6IHVwZGF0ZVxyXG5cdH07XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgV2ViR0xJbmZvIH07XHJcbiIsImltcG9ydCB7IEZsb2F0VHlwZSB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IERhdGFBcnJheVRleHR1cmUgfSBmcm9tICcuLi8uLi90ZXh0dXJlcy9EYXRhQXJyYXlUZXh0dXJlLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yNCB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yNC5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjIuanMnO1xyXG5cclxuZnVuY3Rpb24gV2ViR0xNb3JwaHRhcmdldHMoIGdsLCBjYXBhYmlsaXRpZXMsIHRleHR1cmVzICkge1xyXG5cclxuXHRjb25zdCBtb3JwaFRleHR1cmVzID0gbmV3IFdlYWtNYXAoKTtcclxuXHRjb25zdCBtb3JwaCA9IG5ldyBWZWN0b3I0KCk7XHJcblxyXG5cdGZ1bmN0aW9uIHVwZGF0ZSggb2JqZWN0LCBnZW9tZXRyeSwgcHJvZ3JhbSApIHtcclxuXHJcblx0XHRjb25zdCBvYmplY3RJbmZsdWVuY2VzID0gb2JqZWN0Lm1vcnBoVGFyZ2V0SW5mbHVlbmNlcztcclxuXHJcblx0XHQvLyB0aGUgZm9sbG93aW5nIGVuY29kZXMgbW9ycGggdGFyZ2V0cyBpbnRvIGFuIGFycmF5IG9mIGRhdGEgdGV4dHVyZXMuIEVhY2ggbGF5ZXIgcmVwcmVzZW50cyBhIHNpbmdsZSBtb3JwaCB0YXJnZXQuXHJcblxyXG5cdFx0Y29uc3QgbW9ycGhBdHRyaWJ1dGUgPSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24gfHwgZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbCB8fCBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMuY29sb3I7XHJcblx0XHRjb25zdCBtb3JwaFRhcmdldHNDb3VudCA9ICggbW9ycGhBdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApID8gbW9ycGhBdHRyaWJ1dGUubGVuZ3RoIDogMDtcclxuXHJcblx0XHRsZXQgZW50cnkgPSBtb3JwaFRleHR1cmVzLmdldCggZ2VvbWV0cnkgKTtcclxuXHJcblx0XHRpZiAoIGVudHJ5ID09PSB1bmRlZmluZWQgfHwgZW50cnkuY291bnQgIT09IG1vcnBoVGFyZ2V0c0NvdW50ICkge1xyXG5cclxuXHRcdFx0aWYgKCBlbnRyeSAhPT0gdW5kZWZpbmVkICkgZW50cnkudGV4dHVyZS5kaXNwb3NlKCk7XHJcblxyXG5cdFx0XHRjb25zdCBoYXNNb3JwaFBvc2l0aW9uID0gZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uICE9PSB1bmRlZmluZWQ7XHJcblx0XHRcdGNvbnN0IGhhc01vcnBoTm9ybWFscyA9IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5ub3JtYWwgIT09IHVuZGVmaW5lZDtcclxuXHRcdFx0Y29uc3QgaGFzTW9ycGhDb2xvcnMgPSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMuY29sb3IgIT09IHVuZGVmaW5lZDtcclxuXHJcblx0XHRcdGNvbnN0IG1vcnBoVGFyZ2V0cyA9IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbiB8fCBbXTtcclxuXHRcdFx0Y29uc3QgbW9ycGhOb3JtYWxzID0gZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbCB8fCBbXTtcclxuXHRcdFx0Y29uc3QgbW9ycGhDb2xvcnMgPSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMuY29sb3IgfHwgW107XHJcblxyXG5cdFx0XHRsZXQgdmVydGV4RGF0YUNvdW50ID0gMDtcclxuXHJcblx0XHRcdGlmICggaGFzTW9ycGhQb3NpdGlvbiA9PT0gdHJ1ZSApIHZlcnRleERhdGFDb3VudCA9IDE7XHJcblx0XHRcdGlmICggaGFzTW9ycGhOb3JtYWxzID09PSB0cnVlICkgdmVydGV4RGF0YUNvdW50ID0gMjtcclxuXHRcdFx0aWYgKCBoYXNNb3JwaENvbG9ycyA9PT0gdHJ1ZSApIHZlcnRleERhdGFDb3VudCA9IDM7XHJcblxyXG5cdFx0XHRsZXQgd2lkdGggPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50ICogdmVydGV4RGF0YUNvdW50O1xyXG5cdFx0XHRsZXQgaGVpZ2h0ID0gMTtcclxuXHJcblx0XHRcdGlmICggd2lkdGggPiBjYXBhYmlsaXRpZXMubWF4VGV4dHVyZVNpemUgKSB7XHJcblxyXG5cdFx0XHRcdGhlaWdodCA9IE1hdGguY2VpbCggd2lkdGggLyBjYXBhYmlsaXRpZXMubWF4VGV4dHVyZVNpemUgKTtcclxuXHRcdFx0XHR3aWR0aCA9IGNhcGFiaWxpdGllcy5tYXhUZXh0dXJlU2l6ZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IGJ1ZmZlciA9IG5ldyBGbG9hdDMyQXJyYXkoIHdpZHRoICogaGVpZ2h0ICogNCAqIG1vcnBoVGFyZ2V0c0NvdW50ICk7XHJcblxyXG5cdFx0XHRjb25zdCB0ZXh0dXJlID0gbmV3IERhdGFBcnJheVRleHR1cmUoIGJ1ZmZlciwgd2lkdGgsIGhlaWdodCwgbW9ycGhUYXJnZXRzQ291bnQgKTtcclxuXHRcdFx0dGV4dHVyZS50eXBlID0gRmxvYXRUeXBlO1xyXG5cdFx0XHR0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHRcdC8vIGZpbGwgYnVmZmVyXHJcblxyXG5cdFx0XHRjb25zdCB2ZXJ0ZXhEYXRhU3RyaWRlID0gdmVydGV4RGF0YUNvdW50ICogNDtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IG1vcnBoVGFyZ2V0c0NvdW50OyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBtb3JwaFRhcmdldCA9IG1vcnBoVGFyZ2V0c1sgaSBdO1xyXG5cdFx0XHRcdGNvbnN0IG1vcnBoTm9ybWFsID0gbW9ycGhOb3JtYWxzWyBpIF07XHJcblx0XHRcdFx0Y29uc3QgbW9ycGhDb2xvciA9IG1vcnBoQ29sb3JzWyBpIF07XHJcblxyXG5cdFx0XHRcdGNvbnN0IG9mZnNldCA9IHdpZHRoICogaGVpZ2h0ICogNCAqIGk7XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBqID0gMDsgaiA8IG1vcnBoVGFyZ2V0LmNvdW50OyBqICsrICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHN0cmlkZSA9IGogKiB2ZXJ0ZXhEYXRhU3RyaWRlO1xyXG5cclxuXHRcdFx0XHRcdGlmICggaGFzTW9ycGhQb3NpdGlvbiA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdG1vcnBoLmZyb21CdWZmZXJBdHRyaWJ1dGUoIG1vcnBoVGFyZ2V0LCBqICk7XHJcblxyXG5cdFx0XHRcdFx0XHRidWZmZXJbIG9mZnNldCArIHN0cmlkZSArIDAgXSA9IG1vcnBoLng7XHJcblx0XHRcdFx0XHRcdGJ1ZmZlclsgb2Zmc2V0ICsgc3RyaWRlICsgMSBdID0gbW9ycGgueTtcclxuXHRcdFx0XHRcdFx0YnVmZmVyWyBvZmZzZXQgKyBzdHJpZGUgKyAyIF0gPSBtb3JwaC56O1xyXG5cdFx0XHRcdFx0XHRidWZmZXJbIG9mZnNldCArIHN0cmlkZSArIDMgXSA9IDA7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGlmICggaGFzTW9ycGhOb3JtYWxzID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0bW9ycGguZnJvbUJ1ZmZlckF0dHJpYnV0ZSggbW9ycGhOb3JtYWwsIGogKTtcclxuXHJcblx0XHRcdFx0XHRcdGJ1ZmZlclsgb2Zmc2V0ICsgc3RyaWRlICsgNCBdID0gbW9ycGgueDtcclxuXHRcdFx0XHRcdFx0YnVmZmVyWyBvZmZzZXQgKyBzdHJpZGUgKyA1IF0gPSBtb3JwaC55O1xyXG5cdFx0XHRcdFx0XHRidWZmZXJbIG9mZnNldCArIHN0cmlkZSArIDYgXSA9IG1vcnBoLno7XHJcblx0XHRcdFx0XHRcdGJ1ZmZlclsgb2Zmc2V0ICsgc3RyaWRlICsgNyBdID0gMDtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBoYXNNb3JwaENvbG9ycyA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdG1vcnBoLmZyb21CdWZmZXJBdHRyaWJ1dGUoIG1vcnBoQ29sb3IsIGogKTtcclxuXHJcblx0XHRcdFx0XHRcdGJ1ZmZlclsgb2Zmc2V0ICsgc3RyaWRlICsgOCBdID0gbW9ycGgueDtcclxuXHRcdFx0XHRcdFx0YnVmZmVyWyBvZmZzZXQgKyBzdHJpZGUgKyA5IF0gPSBtb3JwaC55O1xyXG5cdFx0XHRcdFx0XHRidWZmZXJbIG9mZnNldCArIHN0cmlkZSArIDEwIF0gPSBtb3JwaC56O1xyXG5cdFx0XHRcdFx0XHRidWZmZXJbIG9mZnNldCArIHN0cmlkZSArIDExIF0gPSAoIG1vcnBoQ29sb3IuaXRlbVNpemUgPT09IDQgKSA/IG1vcnBoLncgOiAxO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZW50cnkgPSB7XHJcblx0XHRcdFx0Y291bnQ6IG1vcnBoVGFyZ2V0c0NvdW50LFxyXG5cdFx0XHRcdHRleHR1cmU6IHRleHR1cmUsXHJcblx0XHRcdFx0c2l6ZTogbmV3IFZlY3RvcjIoIHdpZHRoLCBoZWlnaHQgKVxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0bW9ycGhUZXh0dXJlcy5zZXQoIGdlb21ldHJ5LCBlbnRyeSApO1xyXG5cclxuXHRcdFx0ZnVuY3Rpb24gZGlzcG9zZVRleHR1cmUoKSB7XHJcblxyXG5cdFx0XHRcdHRleHR1cmUuZGlzcG9zZSgpO1xyXG5cclxuXHRcdFx0XHRtb3JwaFRleHR1cmVzLmRlbGV0ZSggZ2VvbWV0cnkgKTtcclxuXHJcblx0XHRcdFx0Z2VvbWV0cnkucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBkaXNwb3NlVGV4dHVyZSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Z2VvbWV0cnkuYWRkRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBkaXNwb3NlVGV4dHVyZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvL1xyXG5cdFx0aWYgKCBvYmplY3QuaXNJbnN0YW5jZWRNZXNoID09PSB0cnVlICYmIG9iamVjdC5tb3JwaFRleHR1cmUgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRwcm9ncmFtLmdldFVuaWZvcm1zKCkuc2V0VmFsdWUoIGdsLCAnbW9ycGhUZXh0dXJlJywgb2JqZWN0Lm1vcnBoVGV4dHVyZSwgdGV4dHVyZXMgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0bGV0IG1vcnBoSW5mbHVlbmNlc1N1bSA9IDA7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBvYmplY3RJbmZsdWVuY2VzLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0bW9ycGhJbmZsdWVuY2VzU3VtICs9IG9iamVjdEluZmx1ZW5jZXNbIGkgXTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IG1vcnBoQmFzZUluZmx1ZW5jZSA9IGdlb21ldHJ5Lm1vcnBoVGFyZ2V0c1JlbGF0aXZlID8gMSA6IDEgLSBtb3JwaEluZmx1ZW5jZXNTdW07XHJcblxyXG5cclxuXHRcdFx0cHJvZ3JhbS5nZXRVbmlmb3JtcygpLnNldFZhbHVlKCBnbCwgJ21vcnBoVGFyZ2V0QmFzZUluZmx1ZW5jZScsIG1vcnBoQmFzZUluZmx1ZW5jZSApO1xyXG5cdFx0XHRwcm9ncmFtLmdldFVuaWZvcm1zKCkuc2V0VmFsdWUoIGdsLCAnbW9ycGhUYXJnZXRJbmZsdWVuY2VzJywgb2JqZWN0SW5mbHVlbmNlcyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRwcm9ncmFtLmdldFVuaWZvcm1zKCkuc2V0VmFsdWUoIGdsLCAnbW9ycGhUYXJnZXRzVGV4dHVyZScsIGVudHJ5LnRleHR1cmUsIHRleHR1cmVzICk7XHJcblx0XHRwcm9ncmFtLmdldFVuaWZvcm1zKCkuc2V0VmFsdWUoIGdsLCAnbW9ycGhUYXJnZXRzVGV4dHVyZVNpemUnLCBlbnRyeS5zaXplICk7XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIHtcclxuXHJcblx0XHR1cGRhdGU6IHVwZGF0ZVxyXG5cclxuXHR9O1xyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCB7IFdlYkdMTW9ycGh0YXJnZXRzIH07XHJcbiIsImZ1bmN0aW9uIFdlYkdMT2JqZWN0cyggZ2wsIGdlb21ldHJpZXMsIGF0dHJpYnV0ZXMsIGluZm8gKSB7XHJcblxyXG5cdGxldCB1cGRhdGVNYXAgPSBuZXcgV2Vha01hcCgpO1xyXG5cclxuXHRmdW5jdGlvbiB1cGRhdGUoIG9iamVjdCApIHtcclxuXHJcblx0XHRjb25zdCBmcmFtZSA9IGluZm8ucmVuZGVyLmZyYW1lO1xyXG5cclxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gb2JqZWN0Lmdlb21ldHJ5O1xyXG5cdFx0Y29uc3QgYnVmZmVyZ2VvbWV0cnkgPSBnZW9tZXRyaWVzLmdldCggb2JqZWN0LCBnZW9tZXRyeSApO1xyXG5cclxuXHRcdC8vIFVwZGF0ZSBvbmNlIHBlciBmcmFtZVxyXG5cclxuXHRcdGlmICggdXBkYXRlTWFwLmdldCggYnVmZmVyZ2VvbWV0cnkgKSAhPT0gZnJhbWUgKSB7XHJcblxyXG5cdFx0XHRnZW9tZXRyaWVzLnVwZGF0ZSggYnVmZmVyZ2VvbWV0cnkgKTtcclxuXHJcblx0XHRcdHVwZGF0ZU1hcC5zZXQoIGJ1ZmZlcmdlb21ldHJ5LCBmcmFtZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIG9iamVjdC5pc0luc3RhbmNlZE1lc2ggKSB7XHJcblxyXG5cdFx0XHRpZiAoIG9iamVjdC5oYXNFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uSW5zdGFuY2VkTWVzaERpc3Bvc2UgKSA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRcdG9iamVjdC5hZGRFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uSW5zdGFuY2VkTWVzaERpc3Bvc2UgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggdXBkYXRlTWFwLmdldCggb2JqZWN0ICkgIT09IGZyYW1lICkge1xyXG5cclxuXHRcdFx0XHRhdHRyaWJ1dGVzLnVwZGF0ZSggb2JqZWN0Lmluc3RhbmNlTWF0cml4LCBnbC5BUlJBWV9CVUZGRVIgKTtcclxuXHJcblx0XHRcdFx0aWYgKCBvYmplY3QuaW5zdGFuY2VDb2xvciAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHRhdHRyaWJ1dGVzLnVwZGF0ZSggb2JqZWN0Lmluc3RhbmNlQ29sb3IsIGdsLkFSUkFZX0JVRkZFUiApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHVwZGF0ZU1hcC5zZXQoIG9iamVjdCwgZnJhbWUgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBvYmplY3QuaXNTa2lubmVkTWVzaCApIHtcclxuXHJcblx0XHRcdGNvbnN0IHNrZWxldG9uID0gb2JqZWN0LnNrZWxldG9uO1xyXG5cclxuXHRcdFx0aWYgKCB1cGRhdGVNYXAuZ2V0KCBza2VsZXRvbiApICE9PSBmcmFtZSApIHtcclxuXHJcblx0XHRcdFx0c2tlbGV0b24udXBkYXRlKCk7XHJcblxyXG5cdFx0XHRcdHVwZGF0ZU1hcC5zZXQoIHNrZWxldG9uLCBmcmFtZSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gYnVmZmVyZ2VvbWV0cnk7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gZGlzcG9zZSgpIHtcclxuXHJcblx0XHR1cGRhdGVNYXAgPSBuZXcgV2Vha01hcCgpO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIG9uSW5zdGFuY2VkTWVzaERpc3Bvc2UoIGV2ZW50ICkge1xyXG5cclxuXHRcdGNvbnN0IGluc3RhbmNlZE1lc2ggPSBldmVudC50YXJnZXQ7XHJcblxyXG5cdFx0aW5zdGFuY2VkTWVzaC5yZW1vdmVFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uSW5zdGFuY2VkTWVzaERpc3Bvc2UgKTtcclxuXHJcblx0XHRhdHRyaWJ1dGVzLnJlbW92ZSggaW5zdGFuY2VkTWVzaC5pbnN0YW5jZU1hdHJpeCApO1xyXG5cclxuXHRcdGlmICggaW5zdGFuY2VkTWVzaC5pbnN0YW5jZUNvbG9yICE9PSBudWxsICkgYXR0cmlidXRlcy5yZW1vdmUoIGluc3RhbmNlZE1lc2guaW5zdGFuY2VDb2xvciApO1xyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiB7XHJcblxyXG5cdFx0dXBkYXRlOiB1cGRhdGUsXHJcblx0XHRkaXNwb3NlOiBkaXNwb3NlXHJcblxyXG5cdH07XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgV2ViR0xPYmplY3RzIH07XHJcbiIsIi8qKlxyXG4gKiBVbmlmb3JtcyBvZiBhIHByb2dyYW0uXHJcbiAqIFRob3NlIGZvcm0gYSB0cmVlIHN0cnVjdHVyZSB3aXRoIGEgc3BlY2lhbCB0b3AtbGV2ZWwgY29udGFpbmVyIGZvciB0aGUgcm9vdCxcclxuICogd2hpY2ggeW91IGdldCBieSBjYWxsaW5nICduZXcgV2ViR0xVbmlmb3JtcyggZ2wsIHByb2dyYW0gKScuXHJcbiAqXHJcbiAqXHJcbiAqIFByb3BlcnRpZXMgb2YgaW5uZXIgbm9kZXMgaW5jbHVkaW5nIHRoZSB0b3AtbGV2ZWwgY29udGFpbmVyOlxyXG4gKlxyXG4gKiAuc2VxIC0gYXJyYXkgb2YgbmVzdGVkIHVuaWZvcm1zXHJcbiAqIC5tYXAgLSBuZXN0ZWQgdW5pZm9ybXMgYnkgbmFtZVxyXG4gKlxyXG4gKlxyXG4gKiBNZXRob2RzIG9mIGFsbCBub2RlcyBleGNlcHQgdGhlIHRvcC1sZXZlbCBjb250YWluZXI6XHJcbiAqXHJcbiAqIC5zZXRWYWx1ZSggZ2wsIHZhbHVlLCBbdGV4dHVyZXNdIClcclxuICpcclxuICogXHRcdHVwbG9hZHMgYSB1bmlmb3JtIHZhbHVlKHMpXHJcbiAqICBcdHRoZSAndGV4dHVyZXMnIHBhcmFtZXRlciBpcyBuZWVkZWQgZm9yIHNhbXBsZXIgdW5pZm9ybXNcclxuICpcclxuICpcclxuICogU3RhdGljIG1ldGhvZHMgb2YgdGhlIHRvcC1sZXZlbCBjb250YWluZXIgKHRleHR1cmVzIGZhY3Rvcml6YXRpb25zKTpcclxuICpcclxuICogLnVwbG9hZCggZ2wsIHNlcSwgdmFsdWVzLCB0ZXh0dXJlcyApXHJcbiAqXHJcbiAqIFx0XHRzZXRzIHVuaWZvcm1zIGluICdzZXEnIHRvICd2YWx1ZXNbaWRdLnZhbHVlJ1xyXG4gKlxyXG4gKiAuc2VxV2l0aFZhbHVlKCBzZXEsIHZhbHVlcyApIDogZmlsdGVyZWRTZXFcclxuICpcclxuICogXHRcdGZpbHRlcnMgJ3NlcScgZW50cmllcyB3aXRoIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gdmFsdWVzXHJcbiAqXHJcbiAqXHJcbiAqIE1ldGhvZHMgb2YgdGhlIHRvcC1sZXZlbCBjb250YWluZXIgKHRleHR1cmVzIGZhY3Rvcml6YXRpb25zKTpcclxuICpcclxuICogLnNldFZhbHVlKCBnbCwgbmFtZSwgdmFsdWUsIHRleHR1cmVzIClcclxuICpcclxuICogXHRcdHNldHMgdW5pZm9ybSB3aXRoICBuYW1lICduYW1lJyB0byAndmFsdWUnXHJcbiAqXHJcbiAqIC5zZXRPcHRpb25hbCggZ2wsIG9iaiwgcHJvcCApXHJcbiAqXHJcbiAqIFx0XHRsaWtlIC5zZXQgZm9yIGFuIG9wdGlvbmFsIHByb3BlcnR5IG9mIHRoZSBvYmplY3RcclxuICpcclxuICovXHJcblxyXG5pbXBvcnQgeyBDdWJlVGV4dHVyZSB9IGZyb20gJy4uLy4uL3RleHR1cmVzL0N1YmVUZXh0dXJlLmpzJztcclxuaW1wb3J0IHsgVGV4dHVyZSB9IGZyb20gJy4uLy4uL3RleHR1cmVzL1RleHR1cmUuanMnO1xyXG5pbXBvcnQgeyBEYXRhQXJyYXlUZXh0dXJlIH0gZnJvbSAnLi4vLi4vdGV4dHVyZXMvRGF0YUFycmF5VGV4dHVyZS5qcyc7XHJcbmltcG9ydCB7IERhdGEzRFRleHR1cmUgfSBmcm9tICcuLi8uLi90ZXh0dXJlcy9EYXRhM0RUZXh0dXJlLmpzJztcclxuaW1wb3J0IHsgRGVwdGhUZXh0dXJlIH0gZnJvbSAnLi4vLi4vdGV4dHVyZXMvRGVwdGhUZXh0dXJlLmpzJztcclxuaW1wb3J0IHsgTGVzc0VxdWFsQ29tcGFyZSB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcblxyXG5jb25zdCBlbXB0eVRleHR1cmUgPSAvKkBfX1BVUkVfXyovIG5ldyBUZXh0dXJlKCk7XHJcblxyXG5jb25zdCBlbXB0eVNoYWRvd1RleHR1cmUgPSAvKkBfX1BVUkVfXyovIG5ldyBEZXB0aFRleHR1cmUoIDEsIDEgKTtcclxuXHJcbmNvbnN0IGVtcHR5QXJyYXlUZXh0dXJlID0gLypAX19QVVJFX18qLyBuZXcgRGF0YUFycmF5VGV4dHVyZSgpO1xyXG5jb25zdCBlbXB0eTNkVGV4dHVyZSA9IC8qQF9fUFVSRV9fKi8gbmV3IERhdGEzRFRleHR1cmUoKTtcclxuY29uc3QgZW1wdHlDdWJlVGV4dHVyZSA9IC8qQF9fUFVSRV9fKi8gbmV3IEN1YmVUZXh0dXJlKCk7XHJcblxyXG4vLyAtLS0gVXRpbGl0aWVzIC0tLVxyXG5cclxuLy8gQXJyYXkgQ2FjaGVzIChwcm92aWRlIHR5cGVkIGFycmF5cyBmb3IgdGVtcG9yYXJ5IGJ5IHNpemUpXHJcblxyXG5jb25zdCBhcnJheUNhY2hlRjMyID0gW107XHJcbmNvbnN0IGFycmF5Q2FjaGVJMzIgPSBbXTtcclxuXHJcbi8vIEZsb2F0MzJBcnJheSBjYWNoZXMgdXNlZCBmb3IgdXBsb2FkaW5nIE1hdHJpeCB1bmlmb3Jtc1xyXG5cclxuY29uc3QgbWF0NGFycmF5ID0gbmV3IEZsb2F0MzJBcnJheSggMTYgKTtcclxuY29uc3QgbWF0M2FycmF5ID0gbmV3IEZsb2F0MzJBcnJheSggOSApO1xyXG5jb25zdCBtYXQyYXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KCA0ICk7XHJcblxyXG4vLyBGbGF0dGVuaW5nIGZvciBhcnJheXMgb2YgdmVjdG9ycyBhbmQgbWF0cmljZXNcclxuXHJcbmZ1bmN0aW9uIGZsYXR0ZW4oIGFycmF5LCBuQmxvY2tzLCBibG9ja1NpemUgKSB7XHJcblxyXG5cdGNvbnN0IGZpcnN0RWxlbSA9IGFycmF5WyAwIF07XHJcblxyXG5cdGlmICggZmlyc3RFbGVtIDw9IDAgfHwgZmlyc3RFbGVtID4gMCApIHJldHVybiBhcnJheTtcclxuXHQvLyB1bm9wdGltaXplZDogISBpc05hTiggZmlyc3RFbGVtIClcclxuXHQvLyBzZWUgaHR0cDovL2phY2tzb25kdW5zdGFuLmNvbS9hcnRpY2xlcy85ODNcclxuXHJcblx0Y29uc3QgbiA9IG5CbG9ja3MgKiBibG9ja1NpemU7XHJcblx0bGV0IHIgPSBhcnJheUNhY2hlRjMyWyBuIF07XHJcblxyXG5cdGlmICggciA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdHIgPSBuZXcgRmxvYXQzMkFycmF5KCBuICk7XHJcblx0XHRhcnJheUNhY2hlRjMyWyBuIF0gPSByO1xyXG5cclxuXHR9XHJcblxyXG5cdGlmICggbkJsb2NrcyAhPT0gMCApIHtcclxuXHJcblx0XHRmaXJzdEVsZW0udG9BcnJheSggciwgMCApO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMSwgb2Zmc2V0ID0gMDsgaSAhPT0gbkJsb2NrczsgKysgaSApIHtcclxuXHJcblx0XHRcdG9mZnNldCArPSBibG9ja1NpemU7XHJcblx0XHRcdGFycmF5WyBpIF0udG9BcnJheSggciwgb2Zmc2V0ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiByO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gYXJyYXlzRXF1YWwoIGEsIGIgKSB7XHJcblxyXG5cdGlmICggYS5sZW5ndGggIT09IGIubGVuZ3RoICkgcmV0dXJuIGZhbHNlO1xyXG5cclxuXHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBhLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0aWYgKCBhWyBpIF0gIT09IGJbIGkgXSApIHJldHVybiBmYWxzZTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gdHJ1ZTtcclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNvcHlBcnJheSggYSwgYiApIHtcclxuXHJcblx0Zm9yICggbGV0IGkgPSAwLCBsID0gYi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdGFbIGkgXSA9IGJbIGkgXTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLy8gVGV4dHVyZSB1bml0IGFsbG9jYXRpb25cclxuXHJcbmZ1bmN0aW9uIGFsbG9jVGV4VW5pdHMoIHRleHR1cmVzLCBuICkge1xyXG5cclxuXHRsZXQgciA9IGFycmF5Q2FjaGVJMzJbIG4gXTtcclxuXHJcblx0aWYgKCByID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0ciA9IG5ldyBJbnQzMkFycmF5KCBuICk7XHJcblx0XHRhcnJheUNhY2hlSTMyWyBuIF0gPSByO1xyXG5cclxuXHR9XHJcblxyXG5cdGZvciAoIGxldCBpID0gMDsgaSAhPT0gbjsgKysgaSApIHtcclxuXHJcblx0XHRyWyBpIF0gPSB0ZXh0dXJlcy5hbGxvY2F0ZVRleHR1cmVVbml0KCk7XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIHI7XHJcblxyXG59XHJcblxyXG4vLyAtLS0gU2V0dGVycyAtLS1cclxuXHJcbi8vIE5vdGU6IERlZmluaW5nIHRoZXNlIG1ldGhvZHMgZXh0ZXJuYWxseSwgYmVjYXVzZSB0aGV5IGNvbWUgaW4gYSBidW5jaFxyXG4vLyBhbmQgdGhpcyB3YXkgdGhlaXIgbmFtZXMgbWluaWZ5LlxyXG5cclxuLy8gU2luZ2xlIHNjYWxhclxyXG5cclxuZnVuY3Rpb24gc2V0VmFsdWVWMWYoIGdsLCB2ICkge1xyXG5cclxuXHRjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGU7XHJcblxyXG5cdGlmICggY2FjaGVbIDAgXSA9PT0gdiApIHJldHVybjtcclxuXHJcblx0Z2wudW5pZm9ybTFmKCB0aGlzLmFkZHIsIHYgKTtcclxuXHJcblx0Y2FjaGVbIDAgXSA9IHY7XHJcblxyXG59XHJcblxyXG4vLyBTaW5nbGUgZmxvYXQgdmVjdG9yIChmcm9tIGZsYXQgYXJyYXkgb3IgVEhSRUUuVmVjdG9yTilcclxuXHJcbmZ1bmN0aW9uIHNldFZhbHVlVjJmKCBnbCwgdiApIHtcclxuXHJcblx0Y29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlO1xyXG5cclxuXHRpZiAoIHYueCAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdGlmICggY2FjaGVbIDAgXSAhPT0gdi54IHx8IGNhY2hlWyAxIF0gIT09IHYueSApIHtcclxuXHJcblx0XHRcdGdsLnVuaWZvcm0yZiggdGhpcy5hZGRyLCB2LngsIHYueSApO1xyXG5cclxuXHRcdFx0Y2FjaGVbIDAgXSA9IHYueDtcclxuXHRcdFx0Y2FjaGVbIDEgXSA9IHYueTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0aWYgKCBhcnJheXNFcXVhbCggY2FjaGUsIHYgKSApIHJldHVybjtcclxuXHJcblx0XHRnbC51bmlmb3JtMmZ2KCB0aGlzLmFkZHIsIHYgKTtcclxuXHJcblx0XHRjb3B5QXJyYXkoIGNhY2hlLCB2ICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNldFZhbHVlVjNmKCBnbCwgdiApIHtcclxuXHJcblx0Y29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlO1xyXG5cclxuXHRpZiAoIHYueCAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdGlmICggY2FjaGVbIDAgXSAhPT0gdi54IHx8IGNhY2hlWyAxIF0gIT09IHYueSB8fCBjYWNoZVsgMiBdICE9PSB2LnogKSB7XHJcblxyXG5cdFx0XHRnbC51bmlmb3JtM2YoIHRoaXMuYWRkciwgdi54LCB2LnksIHYueiApO1xyXG5cclxuXHRcdFx0Y2FjaGVbIDAgXSA9IHYueDtcclxuXHRcdFx0Y2FjaGVbIDEgXSA9IHYueTtcclxuXHRcdFx0Y2FjaGVbIDIgXSA9IHYuejtcclxuXHJcblx0XHR9XHJcblxyXG5cdH0gZWxzZSBpZiAoIHYuciAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdGlmICggY2FjaGVbIDAgXSAhPT0gdi5yIHx8IGNhY2hlWyAxIF0gIT09IHYuZyB8fCBjYWNoZVsgMiBdICE9PSB2LmIgKSB7XHJcblxyXG5cdFx0XHRnbC51bmlmb3JtM2YoIHRoaXMuYWRkciwgdi5yLCB2LmcsIHYuYiApO1xyXG5cclxuXHRcdFx0Y2FjaGVbIDAgXSA9IHYucjtcclxuXHRcdFx0Y2FjaGVbIDEgXSA9IHYuZztcclxuXHRcdFx0Y2FjaGVbIDIgXSA9IHYuYjtcclxuXHJcblx0XHR9XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0aWYgKCBhcnJheXNFcXVhbCggY2FjaGUsIHYgKSApIHJldHVybjtcclxuXHJcblx0XHRnbC51bmlmb3JtM2Z2KCB0aGlzLmFkZHIsIHYgKTtcclxuXHJcblx0XHRjb3B5QXJyYXkoIGNhY2hlLCB2ICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNldFZhbHVlVjRmKCBnbCwgdiApIHtcclxuXHJcblx0Y29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlO1xyXG5cclxuXHRpZiAoIHYueCAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdGlmICggY2FjaGVbIDAgXSAhPT0gdi54IHx8IGNhY2hlWyAxIF0gIT09IHYueSB8fCBjYWNoZVsgMiBdICE9PSB2LnogfHwgY2FjaGVbIDMgXSAhPT0gdi53ICkge1xyXG5cclxuXHRcdFx0Z2wudW5pZm9ybTRmKCB0aGlzLmFkZHIsIHYueCwgdi55LCB2LnosIHYudyApO1xyXG5cclxuXHRcdFx0Y2FjaGVbIDAgXSA9IHYueDtcclxuXHRcdFx0Y2FjaGVbIDEgXSA9IHYueTtcclxuXHRcdFx0Y2FjaGVbIDIgXSA9IHYuejtcclxuXHRcdFx0Y2FjaGVbIDMgXSA9IHYudztcclxuXHJcblx0XHR9XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0aWYgKCBhcnJheXNFcXVhbCggY2FjaGUsIHYgKSApIHJldHVybjtcclxuXHJcblx0XHRnbC51bmlmb3JtNGZ2KCB0aGlzLmFkZHIsIHYgKTtcclxuXHJcblx0XHRjb3B5QXJyYXkoIGNhY2hlLCB2ICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8vIFNpbmdsZSBtYXRyaXggKGZyb20gZmxhdCBhcnJheSBvciBUSFJFRS5NYXRyaXhOKVxyXG5cclxuZnVuY3Rpb24gc2V0VmFsdWVNMiggZ2wsIHYgKSB7XHJcblxyXG5cdGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZTtcclxuXHRjb25zdCBlbGVtZW50cyA9IHYuZWxlbWVudHM7XHJcblxyXG5cdGlmICggZWxlbWVudHMgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRpZiAoIGFycmF5c0VxdWFsKCBjYWNoZSwgdiApICkgcmV0dXJuO1xyXG5cclxuXHRcdGdsLnVuaWZvcm1NYXRyaXgyZnYoIHRoaXMuYWRkciwgZmFsc2UsIHYgKTtcclxuXHJcblx0XHRjb3B5QXJyYXkoIGNhY2hlLCB2ICk7XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0aWYgKCBhcnJheXNFcXVhbCggY2FjaGUsIGVsZW1lbnRzICkgKSByZXR1cm47XHJcblxyXG5cdFx0bWF0MmFycmF5LnNldCggZWxlbWVudHMgKTtcclxuXHJcblx0XHRnbC51bmlmb3JtTWF0cml4MmZ2KCB0aGlzLmFkZHIsIGZhbHNlLCBtYXQyYXJyYXkgKTtcclxuXHJcblx0XHRjb3B5QXJyYXkoIGNhY2hlLCBlbGVtZW50cyApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBzZXRWYWx1ZU0zKCBnbCwgdiApIHtcclxuXHJcblx0Y29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlO1xyXG5cdGNvbnN0IGVsZW1lbnRzID0gdi5lbGVtZW50cztcclxuXHJcblx0aWYgKCBlbGVtZW50cyA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdGlmICggYXJyYXlzRXF1YWwoIGNhY2hlLCB2ICkgKSByZXR1cm47XHJcblxyXG5cdFx0Z2wudW5pZm9ybU1hdHJpeDNmdiggdGhpcy5hZGRyLCBmYWxzZSwgdiApO1xyXG5cclxuXHRcdGNvcHlBcnJheSggY2FjaGUsIHYgKTtcclxuXHJcblx0fSBlbHNlIHtcclxuXHJcblx0XHRpZiAoIGFycmF5c0VxdWFsKCBjYWNoZSwgZWxlbWVudHMgKSApIHJldHVybjtcclxuXHJcblx0XHRtYXQzYXJyYXkuc2V0KCBlbGVtZW50cyApO1xyXG5cclxuXHRcdGdsLnVuaWZvcm1NYXRyaXgzZnYoIHRoaXMuYWRkciwgZmFsc2UsIG1hdDNhcnJheSApO1xyXG5cclxuXHRcdGNvcHlBcnJheSggY2FjaGUsIGVsZW1lbnRzICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNldFZhbHVlTTQoIGdsLCB2ICkge1xyXG5cclxuXHRjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGU7XHJcblx0Y29uc3QgZWxlbWVudHMgPSB2LmVsZW1lbnRzO1xyXG5cclxuXHRpZiAoIGVsZW1lbnRzID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0aWYgKCBhcnJheXNFcXVhbCggY2FjaGUsIHYgKSApIHJldHVybjtcclxuXHJcblx0XHRnbC51bmlmb3JtTWF0cml4NGZ2KCB0aGlzLmFkZHIsIGZhbHNlLCB2ICk7XHJcblxyXG5cdFx0Y29weUFycmF5KCBjYWNoZSwgdiApO1xyXG5cclxuXHR9IGVsc2Uge1xyXG5cclxuXHRcdGlmICggYXJyYXlzRXF1YWwoIGNhY2hlLCBlbGVtZW50cyApICkgcmV0dXJuO1xyXG5cclxuXHRcdG1hdDRhcnJheS5zZXQoIGVsZW1lbnRzICk7XHJcblxyXG5cdFx0Z2wudW5pZm9ybU1hdHJpeDRmdiggdGhpcy5hZGRyLCBmYWxzZSwgbWF0NGFycmF5ICk7XHJcblxyXG5cdFx0Y29weUFycmF5KCBjYWNoZSwgZWxlbWVudHMgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLy8gU2luZ2xlIGludGVnZXIgLyBib29sZWFuXHJcblxyXG5mdW5jdGlvbiBzZXRWYWx1ZVYxaSggZ2wsIHYgKSB7XHJcblxyXG5cdGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZTtcclxuXHJcblx0aWYgKCBjYWNoZVsgMCBdID09PSB2ICkgcmV0dXJuO1xyXG5cclxuXHRnbC51bmlmb3JtMWkoIHRoaXMuYWRkciwgdiApO1xyXG5cclxuXHRjYWNoZVsgMCBdID0gdjtcclxuXHJcbn1cclxuXHJcbi8vIFNpbmdsZSBpbnRlZ2VyIC8gYm9vbGVhbiB2ZWN0b3IgKGZyb20gZmxhdCBhcnJheSBvciBUSFJFRS5WZWN0b3JOKVxyXG5cclxuZnVuY3Rpb24gc2V0VmFsdWVWMmkoIGdsLCB2ICkge1xyXG5cclxuXHRjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGU7XHJcblxyXG5cdGlmICggdi54ICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0aWYgKCBjYWNoZVsgMCBdICE9PSB2LnggfHwgY2FjaGVbIDEgXSAhPT0gdi55ICkge1xyXG5cclxuXHRcdFx0Z2wudW5pZm9ybTJpKCB0aGlzLmFkZHIsIHYueCwgdi55ICk7XHJcblxyXG5cdFx0XHRjYWNoZVsgMCBdID0gdi54O1xyXG5cdFx0XHRjYWNoZVsgMSBdID0gdi55O1xyXG5cclxuXHRcdH1cclxuXHJcblx0fSBlbHNlIHtcclxuXHJcblx0XHRpZiAoIGFycmF5c0VxdWFsKCBjYWNoZSwgdiApICkgcmV0dXJuO1xyXG5cclxuXHRcdGdsLnVuaWZvcm0yaXYoIHRoaXMuYWRkciwgdiApO1xyXG5cclxuXHRcdGNvcHlBcnJheSggY2FjaGUsIHYgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gc2V0VmFsdWVWM2koIGdsLCB2ICkge1xyXG5cclxuXHRjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGU7XHJcblxyXG5cdGlmICggdi54ICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0aWYgKCBjYWNoZVsgMCBdICE9PSB2LnggfHwgY2FjaGVbIDEgXSAhPT0gdi55IHx8IGNhY2hlWyAyIF0gIT09IHYueiApIHtcclxuXHJcblx0XHRcdGdsLnVuaWZvcm0zaSggdGhpcy5hZGRyLCB2LngsIHYueSwgdi56ICk7XHJcblxyXG5cdFx0XHRjYWNoZVsgMCBdID0gdi54O1xyXG5cdFx0XHRjYWNoZVsgMSBdID0gdi55O1xyXG5cdFx0XHRjYWNoZVsgMiBdID0gdi56O1xyXG5cclxuXHRcdH1cclxuXHJcblx0fSBlbHNlIHtcclxuXHJcblx0XHRpZiAoIGFycmF5c0VxdWFsKCBjYWNoZSwgdiApICkgcmV0dXJuO1xyXG5cclxuXHRcdGdsLnVuaWZvcm0zaXYoIHRoaXMuYWRkciwgdiApO1xyXG5cclxuXHRcdGNvcHlBcnJheSggY2FjaGUsIHYgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gc2V0VmFsdWVWNGkoIGdsLCB2ICkge1xyXG5cclxuXHRjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGU7XHJcblxyXG5cdGlmICggdi54ICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0aWYgKCBjYWNoZVsgMCBdICE9PSB2LnggfHwgY2FjaGVbIDEgXSAhPT0gdi55IHx8IGNhY2hlWyAyIF0gIT09IHYueiB8fCBjYWNoZVsgMyBdICE9PSB2LncgKSB7XHJcblxyXG5cdFx0XHRnbC51bmlmb3JtNGkoIHRoaXMuYWRkciwgdi54LCB2LnksIHYueiwgdi53ICk7XHJcblxyXG5cdFx0XHRjYWNoZVsgMCBdID0gdi54O1xyXG5cdFx0XHRjYWNoZVsgMSBdID0gdi55O1xyXG5cdFx0XHRjYWNoZVsgMiBdID0gdi56O1xyXG5cdFx0XHRjYWNoZVsgMyBdID0gdi53O1xyXG5cclxuXHRcdH1cclxuXHJcblx0fSBlbHNlIHtcclxuXHJcblx0XHRpZiAoIGFycmF5c0VxdWFsKCBjYWNoZSwgdiApICkgcmV0dXJuO1xyXG5cclxuXHRcdGdsLnVuaWZvcm00aXYoIHRoaXMuYWRkciwgdiApO1xyXG5cclxuXHRcdGNvcHlBcnJheSggY2FjaGUsIHYgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLy8gU2luZ2xlIHVuc2lnbmVkIGludGVnZXJcclxuXHJcbmZ1bmN0aW9uIHNldFZhbHVlVjF1aSggZ2wsIHYgKSB7XHJcblxyXG5cdGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZTtcclxuXHJcblx0aWYgKCBjYWNoZVsgMCBdID09PSB2ICkgcmV0dXJuO1xyXG5cclxuXHRnbC51bmlmb3JtMXVpKCB0aGlzLmFkZHIsIHYgKTtcclxuXHJcblx0Y2FjaGVbIDAgXSA9IHY7XHJcblxyXG59XHJcblxyXG4vLyBTaW5nbGUgdW5zaWduZWQgaW50ZWdlciB2ZWN0b3IgKGZyb20gZmxhdCBhcnJheSBvciBUSFJFRS5WZWN0b3JOKVxyXG5cclxuZnVuY3Rpb24gc2V0VmFsdWVWMnVpKCBnbCwgdiApIHtcclxuXHJcblx0Y29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlO1xyXG5cclxuXHRpZiAoIHYueCAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdGlmICggY2FjaGVbIDAgXSAhPT0gdi54IHx8IGNhY2hlWyAxIF0gIT09IHYueSApIHtcclxuXHJcblx0XHRcdGdsLnVuaWZvcm0ydWkoIHRoaXMuYWRkciwgdi54LCB2LnkgKTtcclxuXHJcblx0XHRcdGNhY2hlWyAwIF0gPSB2Lng7XHJcblx0XHRcdGNhY2hlWyAxIF0gPSB2Lnk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9IGVsc2Uge1xyXG5cclxuXHRcdGlmICggYXJyYXlzRXF1YWwoIGNhY2hlLCB2ICkgKSByZXR1cm47XHJcblxyXG5cdFx0Z2wudW5pZm9ybTJ1aXYoIHRoaXMuYWRkciwgdiApO1xyXG5cclxuXHRcdGNvcHlBcnJheSggY2FjaGUsIHYgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gc2V0VmFsdWVWM3VpKCBnbCwgdiApIHtcclxuXHJcblx0Y29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlO1xyXG5cclxuXHRpZiAoIHYueCAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdGlmICggY2FjaGVbIDAgXSAhPT0gdi54IHx8IGNhY2hlWyAxIF0gIT09IHYueSB8fCBjYWNoZVsgMiBdICE9PSB2LnogKSB7XHJcblxyXG5cdFx0XHRnbC51bmlmb3JtM3VpKCB0aGlzLmFkZHIsIHYueCwgdi55LCB2LnogKTtcclxuXHJcblx0XHRcdGNhY2hlWyAwIF0gPSB2Lng7XHJcblx0XHRcdGNhY2hlWyAxIF0gPSB2Lnk7XHJcblx0XHRcdGNhY2hlWyAyIF0gPSB2Lno7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9IGVsc2Uge1xyXG5cclxuXHRcdGlmICggYXJyYXlzRXF1YWwoIGNhY2hlLCB2ICkgKSByZXR1cm47XHJcblxyXG5cdFx0Z2wudW5pZm9ybTN1aXYoIHRoaXMuYWRkciwgdiApO1xyXG5cclxuXHRcdGNvcHlBcnJheSggY2FjaGUsIHYgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gc2V0VmFsdWVWNHVpKCBnbCwgdiApIHtcclxuXHJcblx0Y29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlO1xyXG5cclxuXHRpZiAoIHYueCAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdGlmICggY2FjaGVbIDAgXSAhPT0gdi54IHx8IGNhY2hlWyAxIF0gIT09IHYueSB8fCBjYWNoZVsgMiBdICE9PSB2LnogfHwgY2FjaGVbIDMgXSAhPT0gdi53ICkge1xyXG5cclxuXHRcdFx0Z2wudW5pZm9ybTR1aSggdGhpcy5hZGRyLCB2LngsIHYueSwgdi56LCB2LncgKTtcclxuXHJcblx0XHRcdGNhY2hlWyAwIF0gPSB2Lng7XHJcblx0XHRcdGNhY2hlWyAxIF0gPSB2Lnk7XHJcblx0XHRcdGNhY2hlWyAyIF0gPSB2Lno7XHJcblx0XHRcdGNhY2hlWyAzIF0gPSB2Lnc7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9IGVsc2Uge1xyXG5cclxuXHRcdGlmICggYXJyYXlzRXF1YWwoIGNhY2hlLCB2ICkgKSByZXR1cm47XHJcblxyXG5cdFx0Z2wudW5pZm9ybTR1aXYoIHRoaXMuYWRkciwgdiApO1xyXG5cclxuXHRcdGNvcHlBcnJheSggY2FjaGUsIHYgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbi8vIFNpbmdsZSB0ZXh0dXJlICgyRCAvIEN1YmUpXHJcblxyXG5mdW5jdGlvbiBzZXRWYWx1ZVQxKCBnbCwgdiwgdGV4dHVyZXMgKSB7XHJcblxyXG5cdGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZTtcclxuXHRjb25zdCB1bml0ID0gdGV4dHVyZXMuYWxsb2NhdGVUZXh0dXJlVW5pdCgpO1xyXG5cclxuXHRpZiAoIGNhY2hlWyAwIF0gIT09IHVuaXQgKSB7XHJcblxyXG5cdFx0Z2wudW5pZm9ybTFpKCB0aGlzLmFkZHIsIHVuaXQgKTtcclxuXHRcdGNhY2hlWyAwIF0gPSB1bml0O1xyXG5cclxuXHR9XHJcblxyXG5cdGxldCBlbXB0eVRleHR1cmUyRDtcclxuXHJcblx0aWYgKCB0aGlzLnR5cGUgPT09IGdsLlNBTVBMRVJfMkRfU0hBRE9XICkge1xyXG5cclxuXHRcdGVtcHR5U2hhZG93VGV4dHVyZS5jb21wYXJlRnVuY3Rpb24gPSBMZXNzRXF1YWxDb21wYXJlOyAvLyAjMjg2NzBcclxuXHRcdGVtcHR5VGV4dHVyZTJEID0gZW1wdHlTaGFkb3dUZXh0dXJlO1xyXG5cclxuXHR9IGVsc2Uge1xyXG5cclxuXHRcdGVtcHR5VGV4dHVyZTJEID0gZW1wdHlUZXh0dXJlO1xyXG5cclxuXHR9XHJcblxyXG5cdHRleHR1cmVzLnNldFRleHR1cmUyRCggdiB8fCBlbXB0eVRleHR1cmUyRCwgdW5pdCApO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gc2V0VmFsdWVUM0QxKCBnbCwgdiwgdGV4dHVyZXMgKSB7XHJcblxyXG5cdGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZTtcclxuXHRjb25zdCB1bml0ID0gdGV4dHVyZXMuYWxsb2NhdGVUZXh0dXJlVW5pdCgpO1xyXG5cclxuXHRpZiAoIGNhY2hlWyAwIF0gIT09IHVuaXQgKSB7XHJcblxyXG5cdFx0Z2wudW5pZm9ybTFpKCB0aGlzLmFkZHIsIHVuaXQgKTtcclxuXHRcdGNhY2hlWyAwIF0gPSB1bml0O1xyXG5cclxuXHR9XHJcblxyXG5cdHRleHR1cmVzLnNldFRleHR1cmUzRCggdiB8fCBlbXB0eTNkVGV4dHVyZSwgdW5pdCApO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gc2V0VmFsdWVUNiggZ2wsIHYsIHRleHR1cmVzICkge1xyXG5cclxuXHRjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGU7XHJcblx0Y29uc3QgdW5pdCA9IHRleHR1cmVzLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTtcclxuXHJcblx0aWYgKCBjYWNoZVsgMCBdICE9PSB1bml0ICkge1xyXG5cclxuXHRcdGdsLnVuaWZvcm0xaSggdGhpcy5hZGRyLCB1bml0ICk7XHJcblx0XHRjYWNoZVsgMCBdID0gdW5pdDtcclxuXHJcblx0fVxyXG5cclxuXHR0ZXh0dXJlcy5zZXRUZXh0dXJlQ3ViZSggdiB8fCBlbXB0eUN1YmVUZXh0dXJlLCB1bml0ICk7XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBzZXRWYWx1ZVQyREFycmF5MSggZ2wsIHYsIHRleHR1cmVzICkge1xyXG5cclxuXHRjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGU7XHJcblx0Y29uc3QgdW5pdCA9IHRleHR1cmVzLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTtcclxuXHJcblx0aWYgKCBjYWNoZVsgMCBdICE9PSB1bml0ICkge1xyXG5cclxuXHRcdGdsLnVuaWZvcm0xaSggdGhpcy5hZGRyLCB1bml0ICk7XHJcblx0XHRjYWNoZVsgMCBdID0gdW5pdDtcclxuXHJcblx0fVxyXG5cclxuXHR0ZXh0dXJlcy5zZXRUZXh0dXJlMkRBcnJheSggdiB8fCBlbXB0eUFycmF5VGV4dHVyZSwgdW5pdCApO1xyXG5cclxufVxyXG5cclxuLy8gSGVscGVyIHRvIHBpY2sgdGhlIHJpZ2h0IHNldHRlciBmb3IgdGhlIHNpbmd1bGFyIGNhc2VcclxuXHJcbmZ1bmN0aW9uIGdldFNpbmd1bGFyU2V0dGVyKCB0eXBlICkge1xyXG5cclxuXHRzd2l0Y2ggKCB0eXBlICkge1xyXG5cclxuXHRcdGNhc2UgMHgxNDA2OiByZXR1cm4gc2V0VmFsdWVWMWY7IC8vIEZMT0FUXHJcblx0XHRjYXNlIDB4OGI1MDogcmV0dXJuIHNldFZhbHVlVjJmOyAvLyBfVkVDMlxyXG5cdFx0Y2FzZSAweDhiNTE6IHJldHVybiBzZXRWYWx1ZVYzZjsgLy8gX1ZFQzNcclxuXHRcdGNhc2UgMHg4YjUyOiByZXR1cm4gc2V0VmFsdWVWNGY7IC8vIF9WRUM0XHJcblxyXG5cdFx0Y2FzZSAweDhiNWE6IHJldHVybiBzZXRWYWx1ZU0yOyAvLyBfTUFUMlxyXG5cdFx0Y2FzZSAweDhiNWI6IHJldHVybiBzZXRWYWx1ZU0zOyAvLyBfTUFUM1xyXG5cdFx0Y2FzZSAweDhiNWM6IHJldHVybiBzZXRWYWx1ZU00OyAvLyBfTUFUNFxyXG5cclxuXHRcdGNhc2UgMHgxNDA0OiBjYXNlIDB4OGI1NjogcmV0dXJuIHNldFZhbHVlVjFpOyAvLyBJTlQsIEJPT0xcclxuXHRcdGNhc2UgMHg4YjUzOiBjYXNlIDB4OGI1NzogcmV0dXJuIHNldFZhbHVlVjJpOyAvLyBfVkVDMlxyXG5cdFx0Y2FzZSAweDhiNTQ6IGNhc2UgMHg4YjU4OiByZXR1cm4gc2V0VmFsdWVWM2k7IC8vIF9WRUMzXHJcblx0XHRjYXNlIDB4OGI1NTogY2FzZSAweDhiNTk6IHJldHVybiBzZXRWYWx1ZVY0aTsgLy8gX1ZFQzRcclxuXHJcblx0XHRjYXNlIDB4MTQwNTogcmV0dXJuIHNldFZhbHVlVjF1aTsgLy8gVUlOVFxyXG5cdFx0Y2FzZSAweDhkYzY6IHJldHVybiBzZXRWYWx1ZVYydWk7IC8vIF9WRUMyXHJcblx0XHRjYXNlIDB4OGRjNzogcmV0dXJuIHNldFZhbHVlVjN1aTsgLy8gX1ZFQzNcclxuXHRcdGNhc2UgMHg4ZGM4OiByZXR1cm4gc2V0VmFsdWVWNHVpOyAvLyBfVkVDNFxyXG5cclxuXHRcdGNhc2UgMHg4YjVlOiAvLyBTQU1QTEVSXzJEXHJcblx0XHRjYXNlIDB4OGQ2NjogLy8gU0FNUExFUl9FWFRFUk5BTF9PRVNcclxuXHRcdGNhc2UgMHg4ZGNhOiAvLyBJTlRfU0FNUExFUl8yRFxyXG5cdFx0Y2FzZSAweDhkZDI6IC8vIFVOU0lHTkVEX0lOVF9TQU1QTEVSXzJEXHJcblx0XHRjYXNlIDB4OGI2MjogLy8gU0FNUExFUl8yRF9TSEFET1dcclxuXHRcdFx0cmV0dXJuIHNldFZhbHVlVDE7XHJcblxyXG5cdFx0Y2FzZSAweDhiNWY6IC8vIFNBTVBMRVJfM0RcclxuXHRcdGNhc2UgMHg4ZGNiOiAvLyBJTlRfU0FNUExFUl8zRFxyXG5cdFx0Y2FzZSAweDhkZDM6IC8vIFVOU0lHTkVEX0lOVF9TQU1QTEVSXzNEXHJcblx0XHRcdHJldHVybiBzZXRWYWx1ZVQzRDE7XHJcblxyXG5cdFx0Y2FzZSAweDhiNjA6IC8vIFNBTVBMRVJfQ1VCRVxyXG5cdFx0Y2FzZSAweDhkY2M6IC8vIElOVF9TQU1QTEVSX0NVQkVcclxuXHRcdGNhc2UgMHg4ZGQ0OiAvLyBVTlNJR05FRF9JTlRfU0FNUExFUl9DVUJFXHJcblx0XHRjYXNlIDB4OGRjNTogLy8gU0FNUExFUl9DVUJFX1NIQURPV1xyXG5cdFx0XHRyZXR1cm4gc2V0VmFsdWVUNjtcclxuXHJcblx0XHRjYXNlIDB4OGRjMTogLy8gU0FNUExFUl8yRF9BUlJBWVxyXG5cdFx0Y2FzZSAweDhkY2Y6IC8vIElOVF9TQU1QTEVSXzJEX0FSUkFZXHJcblx0XHRjYXNlIDB4OGRkNzogLy8gVU5TSUdORURfSU5UX1NBTVBMRVJfMkRfQVJSQVlcclxuXHRcdGNhc2UgMHg4ZGM0OiAvLyBTQU1QTEVSXzJEX0FSUkFZX1NIQURPV1xyXG5cdFx0XHRyZXR1cm4gc2V0VmFsdWVUMkRBcnJheTE7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblxyXG4vLyBBcnJheSBvZiBzY2FsYXJzXHJcblxyXG5mdW5jdGlvbiBzZXRWYWx1ZVYxZkFycmF5KCBnbCwgdiApIHtcclxuXHJcblx0Z2wudW5pZm9ybTFmdiggdGhpcy5hZGRyLCB2ICk7XHJcblxyXG59XHJcblxyXG4vLyBBcnJheSBvZiB2ZWN0b3JzIChmcm9tIGZsYXQgYXJyYXkgb3IgYXJyYXkgb2YgVEhSRUUuVmVjdG9yTilcclxuXHJcbmZ1bmN0aW9uIHNldFZhbHVlVjJmQXJyYXkoIGdsLCB2ICkge1xyXG5cclxuXHRjb25zdCBkYXRhID0gZmxhdHRlbiggdiwgdGhpcy5zaXplLCAyICk7XHJcblxyXG5cdGdsLnVuaWZvcm0yZnYoIHRoaXMuYWRkciwgZGF0YSApO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gc2V0VmFsdWVWM2ZBcnJheSggZ2wsIHYgKSB7XHJcblxyXG5cdGNvbnN0IGRhdGEgPSBmbGF0dGVuKCB2LCB0aGlzLnNpemUsIDMgKTtcclxuXHJcblx0Z2wudW5pZm9ybTNmdiggdGhpcy5hZGRyLCBkYXRhICk7XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBzZXRWYWx1ZVY0ZkFycmF5KCBnbCwgdiApIHtcclxuXHJcblx0Y29uc3QgZGF0YSA9IGZsYXR0ZW4oIHYsIHRoaXMuc2l6ZSwgNCApO1xyXG5cclxuXHRnbC51bmlmb3JtNGZ2KCB0aGlzLmFkZHIsIGRhdGEgKTtcclxuXHJcbn1cclxuXHJcbi8vIEFycmF5IG9mIG1hdHJpY2VzIChmcm9tIGZsYXQgYXJyYXkgb3IgYXJyYXkgb2YgVEhSRUUuTWF0cml4TilcclxuXHJcbmZ1bmN0aW9uIHNldFZhbHVlTTJBcnJheSggZ2wsIHYgKSB7XHJcblxyXG5cdGNvbnN0IGRhdGEgPSBmbGF0dGVuKCB2LCB0aGlzLnNpemUsIDQgKTtcclxuXHJcblx0Z2wudW5pZm9ybU1hdHJpeDJmdiggdGhpcy5hZGRyLCBmYWxzZSwgZGF0YSApO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gc2V0VmFsdWVNM0FycmF5KCBnbCwgdiApIHtcclxuXHJcblx0Y29uc3QgZGF0YSA9IGZsYXR0ZW4oIHYsIHRoaXMuc2l6ZSwgOSApO1xyXG5cclxuXHRnbC51bmlmb3JtTWF0cml4M2Z2KCB0aGlzLmFkZHIsIGZhbHNlLCBkYXRhICk7XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBzZXRWYWx1ZU00QXJyYXkoIGdsLCB2ICkge1xyXG5cclxuXHRjb25zdCBkYXRhID0gZmxhdHRlbiggdiwgdGhpcy5zaXplLCAxNiApO1xyXG5cclxuXHRnbC51bmlmb3JtTWF0cml4NGZ2KCB0aGlzLmFkZHIsIGZhbHNlLCBkYXRhICk7XHJcblxyXG59XHJcblxyXG4vLyBBcnJheSBvZiBpbnRlZ2VyIC8gYm9vbGVhblxyXG5cclxuZnVuY3Rpb24gc2V0VmFsdWVWMWlBcnJheSggZ2wsIHYgKSB7XHJcblxyXG5cdGdsLnVuaWZvcm0xaXYoIHRoaXMuYWRkciwgdiApO1xyXG5cclxufVxyXG5cclxuLy8gQXJyYXkgb2YgaW50ZWdlciAvIGJvb2xlYW4gdmVjdG9ycyAoZnJvbSBmbGF0IGFycmF5KVxyXG5cclxuZnVuY3Rpb24gc2V0VmFsdWVWMmlBcnJheSggZ2wsIHYgKSB7XHJcblxyXG5cdGdsLnVuaWZvcm0yaXYoIHRoaXMuYWRkciwgdiApO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gc2V0VmFsdWVWM2lBcnJheSggZ2wsIHYgKSB7XHJcblxyXG5cdGdsLnVuaWZvcm0zaXYoIHRoaXMuYWRkciwgdiApO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gc2V0VmFsdWVWNGlBcnJheSggZ2wsIHYgKSB7XHJcblxyXG5cdGdsLnVuaWZvcm00aXYoIHRoaXMuYWRkciwgdiApO1xyXG5cclxufVxyXG5cclxuLy8gQXJyYXkgb2YgdW5zaWduZWQgaW50ZWdlclxyXG5cclxuZnVuY3Rpb24gc2V0VmFsdWVWMXVpQXJyYXkoIGdsLCB2ICkge1xyXG5cclxuXHRnbC51bmlmb3JtMXVpdiggdGhpcy5hZGRyLCB2ICk7XHJcblxyXG59XHJcblxyXG4vLyBBcnJheSBvZiB1bnNpZ25lZCBpbnRlZ2VyIHZlY3RvcnMgKGZyb20gZmxhdCBhcnJheSlcclxuXHJcbmZ1bmN0aW9uIHNldFZhbHVlVjJ1aUFycmF5KCBnbCwgdiApIHtcclxuXHJcblx0Z2wudW5pZm9ybTJ1aXYoIHRoaXMuYWRkciwgdiApO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gc2V0VmFsdWVWM3VpQXJyYXkoIGdsLCB2ICkge1xyXG5cclxuXHRnbC51bmlmb3JtM3VpdiggdGhpcy5hZGRyLCB2ICk7XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBzZXRWYWx1ZVY0dWlBcnJheSggZ2wsIHYgKSB7XHJcblxyXG5cdGdsLnVuaWZvcm00dWl2KCB0aGlzLmFkZHIsIHYgKTtcclxuXHJcbn1cclxuXHJcblxyXG4vLyBBcnJheSBvZiB0ZXh0dXJlcyAoMkQgLyAzRCAvIEN1YmUgLyAyREFycmF5KVxyXG5cclxuZnVuY3Rpb24gc2V0VmFsdWVUMUFycmF5KCBnbCwgdiwgdGV4dHVyZXMgKSB7XHJcblxyXG5cdGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZTtcclxuXHJcblx0Y29uc3QgbiA9IHYubGVuZ3RoO1xyXG5cclxuXHRjb25zdCB1bml0cyA9IGFsbG9jVGV4VW5pdHMoIHRleHR1cmVzLCBuICk7XHJcblxyXG5cdGlmICggISBhcnJheXNFcXVhbCggY2FjaGUsIHVuaXRzICkgKSB7XHJcblxyXG5cdFx0Z2wudW5pZm9ybTFpdiggdGhpcy5hZGRyLCB1bml0cyApO1xyXG5cclxuXHRcdGNvcHlBcnJheSggY2FjaGUsIHVuaXRzICk7XHJcblxyXG5cdH1cclxuXHJcblx0Zm9yICggbGV0IGkgPSAwOyBpICE9PSBuOyArKyBpICkge1xyXG5cclxuXHRcdHRleHR1cmVzLnNldFRleHR1cmUyRCggdlsgaSBdIHx8IGVtcHR5VGV4dHVyZSwgdW5pdHNbIGkgXSApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBzZXRWYWx1ZVQzREFycmF5KCBnbCwgdiwgdGV4dHVyZXMgKSB7XHJcblxyXG5cdGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZTtcclxuXHJcblx0Y29uc3QgbiA9IHYubGVuZ3RoO1xyXG5cclxuXHRjb25zdCB1bml0cyA9IGFsbG9jVGV4VW5pdHMoIHRleHR1cmVzLCBuICk7XHJcblxyXG5cdGlmICggISBhcnJheXNFcXVhbCggY2FjaGUsIHVuaXRzICkgKSB7XHJcblxyXG5cdFx0Z2wudW5pZm9ybTFpdiggdGhpcy5hZGRyLCB1bml0cyApO1xyXG5cclxuXHRcdGNvcHlBcnJheSggY2FjaGUsIHVuaXRzICk7XHJcblxyXG5cdH1cclxuXHJcblx0Zm9yICggbGV0IGkgPSAwOyBpICE9PSBuOyArKyBpICkge1xyXG5cclxuXHRcdHRleHR1cmVzLnNldFRleHR1cmUzRCggdlsgaSBdIHx8IGVtcHR5M2RUZXh0dXJlLCB1bml0c1sgaSBdICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNldFZhbHVlVDZBcnJheSggZ2wsIHYsIHRleHR1cmVzICkge1xyXG5cclxuXHRjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGU7XHJcblxyXG5cdGNvbnN0IG4gPSB2Lmxlbmd0aDtcclxuXHJcblx0Y29uc3QgdW5pdHMgPSBhbGxvY1RleFVuaXRzKCB0ZXh0dXJlcywgbiApO1xyXG5cclxuXHRpZiAoICEgYXJyYXlzRXF1YWwoIGNhY2hlLCB1bml0cyApICkge1xyXG5cclxuXHRcdGdsLnVuaWZvcm0xaXYoIHRoaXMuYWRkciwgdW5pdHMgKTtcclxuXHJcblx0XHRjb3B5QXJyYXkoIGNhY2hlLCB1bml0cyApO1xyXG5cclxuXHR9XHJcblxyXG5cdGZvciAoIGxldCBpID0gMDsgaSAhPT0gbjsgKysgaSApIHtcclxuXHJcblx0XHR0ZXh0dXJlcy5zZXRUZXh0dXJlQ3ViZSggdlsgaSBdIHx8IGVtcHR5Q3ViZVRleHR1cmUsIHVuaXRzWyBpIF0gKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gc2V0VmFsdWVUMkRBcnJheUFycmF5KCBnbCwgdiwgdGV4dHVyZXMgKSB7XHJcblxyXG5cdGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZTtcclxuXHJcblx0Y29uc3QgbiA9IHYubGVuZ3RoO1xyXG5cclxuXHRjb25zdCB1bml0cyA9IGFsbG9jVGV4VW5pdHMoIHRleHR1cmVzLCBuICk7XHJcblxyXG5cdGlmICggISBhcnJheXNFcXVhbCggY2FjaGUsIHVuaXRzICkgKSB7XHJcblxyXG5cdFx0Z2wudW5pZm9ybTFpdiggdGhpcy5hZGRyLCB1bml0cyApO1xyXG5cclxuXHRcdGNvcHlBcnJheSggY2FjaGUsIHVuaXRzICk7XHJcblxyXG5cdH1cclxuXHJcblx0Zm9yICggbGV0IGkgPSAwOyBpICE9PSBuOyArKyBpICkge1xyXG5cclxuXHRcdHRleHR1cmVzLnNldFRleHR1cmUyREFycmF5KCB2WyBpIF0gfHwgZW1wdHlBcnJheVRleHR1cmUsIHVuaXRzWyBpIF0gKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbi8vIEhlbHBlciB0byBwaWNrIHRoZSByaWdodCBzZXR0ZXIgZm9yIGEgcHVyZSAoYm90dG9tLWxldmVsKSBhcnJheVxyXG5cclxuZnVuY3Rpb24gZ2V0UHVyZUFycmF5U2V0dGVyKCB0eXBlICkge1xyXG5cclxuXHRzd2l0Y2ggKCB0eXBlICkge1xyXG5cclxuXHRcdGNhc2UgMHgxNDA2OiByZXR1cm4gc2V0VmFsdWVWMWZBcnJheTsgLy8gRkxPQVRcclxuXHRcdGNhc2UgMHg4YjUwOiByZXR1cm4gc2V0VmFsdWVWMmZBcnJheTsgLy8gX1ZFQzJcclxuXHRcdGNhc2UgMHg4YjUxOiByZXR1cm4gc2V0VmFsdWVWM2ZBcnJheTsgLy8gX1ZFQzNcclxuXHRcdGNhc2UgMHg4YjUyOiByZXR1cm4gc2V0VmFsdWVWNGZBcnJheTsgLy8gX1ZFQzRcclxuXHJcblx0XHRjYXNlIDB4OGI1YTogcmV0dXJuIHNldFZhbHVlTTJBcnJheTsgLy8gX01BVDJcclxuXHRcdGNhc2UgMHg4YjViOiByZXR1cm4gc2V0VmFsdWVNM0FycmF5OyAvLyBfTUFUM1xyXG5cdFx0Y2FzZSAweDhiNWM6IHJldHVybiBzZXRWYWx1ZU00QXJyYXk7IC8vIF9NQVQ0XHJcblxyXG5cdFx0Y2FzZSAweDE0MDQ6IGNhc2UgMHg4YjU2OiByZXR1cm4gc2V0VmFsdWVWMWlBcnJheTsgLy8gSU5ULCBCT09MXHJcblx0XHRjYXNlIDB4OGI1MzogY2FzZSAweDhiNTc6IHJldHVybiBzZXRWYWx1ZVYyaUFycmF5OyAvLyBfVkVDMlxyXG5cdFx0Y2FzZSAweDhiNTQ6IGNhc2UgMHg4YjU4OiByZXR1cm4gc2V0VmFsdWVWM2lBcnJheTsgLy8gX1ZFQzNcclxuXHRcdGNhc2UgMHg4YjU1OiBjYXNlIDB4OGI1OTogcmV0dXJuIHNldFZhbHVlVjRpQXJyYXk7IC8vIF9WRUM0XHJcblxyXG5cdFx0Y2FzZSAweDE0MDU6IHJldHVybiBzZXRWYWx1ZVYxdWlBcnJheTsgLy8gVUlOVFxyXG5cdFx0Y2FzZSAweDhkYzY6IHJldHVybiBzZXRWYWx1ZVYydWlBcnJheTsgLy8gX1ZFQzJcclxuXHRcdGNhc2UgMHg4ZGM3OiByZXR1cm4gc2V0VmFsdWVWM3VpQXJyYXk7IC8vIF9WRUMzXHJcblx0XHRjYXNlIDB4OGRjODogcmV0dXJuIHNldFZhbHVlVjR1aUFycmF5OyAvLyBfVkVDNFxyXG5cclxuXHRcdGNhc2UgMHg4YjVlOiAvLyBTQU1QTEVSXzJEXHJcblx0XHRjYXNlIDB4OGQ2NjogLy8gU0FNUExFUl9FWFRFUk5BTF9PRVNcclxuXHRcdGNhc2UgMHg4ZGNhOiAvLyBJTlRfU0FNUExFUl8yRFxyXG5cdFx0Y2FzZSAweDhkZDI6IC8vIFVOU0lHTkVEX0lOVF9TQU1QTEVSXzJEXHJcblx0XHRjYXNlIDB4OGI2MjogLy8gU0FNUExFUl8yRF9TSEFET1dcclxuXHRcdFx0cmV0dXJuIHNldFZhbHVlVDFBcnJheTtcclxuXHJcblx0XHRjYXNlIDB4OGI1ZjogLy8gU0FNUExFUl8zRFxyXG5cdFx0Y2FzZSAweDhkY2I6IC8vIElOVF9TQU1QTEVSXzNEXHJcblx0XHRjYXNlIDB4OGRkMzogLy8gVU5TSUdORURfSU5UX1NBTVBMRVJfM0RcclxuXHRcdFx0cmV0dXJuIHNldFZhbHVlVDNEQXJyYXk7XHJcblxyXG5cdFx0Y2FzZSAweDhiNjA6IC8vIFNBTVBMRVJfQ1VCRVxyXG5cdFx0Y2FzZSAweDhkY2M6IC8vIElOVF9TQU1QTEVSX0NVQkVcclxuXHRcdGNhc2UgMHg4ZGQ0OiAvLyBVTlNJR05FRF9JTlRfU0FNUExFUl9DVUJFXHJcblx0XHRjYXNlIDB4OGRjNTogLy8gU0FNUExFUl9DVUJFX1NIQURPV1xyXG5cdFx0XHRyZXR1cm4gc2V0VmFsdWVUNkFycmF5O1xyXG5cclxuXHRcdGNhc2UgMHg4ZGMxOiAvLyBTQU1QTEVSXzJEX0FSUkFZXHJcblx0XHRjYXNlIDB4OGRjZjogLy8gSU5UX1NBTVBMRVJfMkRfQVJSQVlcclxuXHRcdGNhc2UgMHg4ZGQ3OiAvLyBVTlNJR05FRF9JTlRfU0FNUExFUl8yRF9BUlJBWVxyXG5cdFx0Y2FzZSAweDhkYzQ6IC8vIFNBTVBMRVJfMkRfQVJSQVlfU0hBRE9XXHJcblx0XHRcdHJldHVybiBzZXRWYWx1ZVQyREFycmF5QXJyYXk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8vIC0tLSBVbmlmb3JtIENsYXNzZXMgLS0tXHJcblxyXG5jbGFzcyBTaW5nbGVVbmlmb3JtIHtcclxuXHJcblx0Y29uc3RydWN0b3IoIGlkLCBhY3RpdmVJbmZvLCBhZGRyICkge1xyXG5cclxuXHRcdHRoaXMuaWQgPSBpZDtcclxuXHRcdHRoaXMuYWRkciA9IGFkZHI7XHJcblx0XHR0aGlzLmNhY2hlID0gW107XHJcblx0XHR0aGlzLnR5cGUgPSBhY3RpdmVJbmZvLnR5cGU7XHJcblx0XHR0aGlzLnNldFZhbHVlID0gZ2V0U2luZ3VsYXJTZXR0ZXIoIGFjdGl2ZUluZm8udHlwZSApO1xyXG5cclxuXHRcdC8vIHRoaXMucGF0aCA9IGFjdGl2ZUluZm8ubmFtZTsgLy8gREVCVUdcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuY2xhc3MgUHVyZUFycmF5VW5pZm9ybSB7XHJcblxyXG5cdGNvbnN0cnVjdG9yKCBpZCwgYWN0aXZlSW5mbywgYWRkciApIHtcclxuXHJcblx0XHR0aGlzLmlkID0gaWQ7XHJcblx0XHR0aGlzLmFkZHIgPSBhZGRyO1xyXG5cdFx0dGhpcy5jYWNoZSA9IFtdO1xyXG5cdFx0dGhpcy50eXBlID0gYWN0aXZlSW5mby50eXBlO1xyXG5cdFx0dGhpcy5zaXplID0gYWN0aXZlSW5mby5zaXplO1xyXG5cdFx0dGhpcy5zZXRWYWx1ZSA9IGdldFB1cmVBcnJheVNldHRlciggYWN0aXZlSW5mby50eXBlICk7XHJcblxyXG5cdFx0Ly8gdGhpcy5wYXRoID0gYWN0aXZlSW5mby5uYW1lOyAvLyBERUJVR1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5jbGFzcyBTdHJ1Y3R1cmVkVW5pZm9ybSB7XHJcblxyXG5cdGNvbnN0cnVjdG9yKCBpZCApIHtcclxuXHJcblx0XHR0aGlzLmlkID0gaWQ7XHJcblxyXG5cdFx0dGhpcy5zZXEgPSBbXTtcclxuXHRcdHRoaXMubWFwID0ge307XHJcblxyXG5cdH1cclxuXHJcblx0c2V0VmFsdWUoIGdsLCB2YWx1ZSwgdGV4dHVyZXMgKSB7XHJcblxyXG5cdFx0Y29uc3Qgc2VxID0gdGhpcy5zZXE7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBuID0gc2VxLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcclxuXHJcblx0XHRcdGNvbnN0IHUgPSBzZXFbIGkgXTtcclxuXHRcdFx0dS5zZXRWYWx1ZSggZ2wsIHZhbHVlWyB1LmlkIF0sIHRleHR1cmVzICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vLyAtLS0gVG9wLWxldmVsIC0tLVxyXG5cclxuLy8gUGFyc2VyIC0gYnVpbGRzIHVwIHRoZSBwcm9wZXJ0eSB0cmVlIGZyb20gdGhlIHBhdGggc3RyaW5nc1xyXG5cclxuY29uc3QgUmVQYXRoUGFydCA9IC8oXFx3KykoXFxdKT8oXFxbfFxcLik/L2c7XHJcblxyXG4vLyBleHRyYWN0c1xyXG4vLyBcdC0gdGhlIGlkZW50aWZpZXIgKG1lbWJlciBuYW1lIG9yIGFycmF5IGluZGV4KVxyXG4vLyAgLSBmb2xsb3dlZCBieSBhbiBvcHRpb25hbCByaWdodCBicmFja2V0IChmb3VuZCB3aGVuIGFycmF5IGluZGV4KVxyXG4vLyAgLSBmb2xsb3dlZCBieSBhbiBvcHRpb25hbCBsZWZ0IGJyYWNrZXQgb3IgZG90ICh0eXBlIG9mIHN1YnNjcmlwdClcclxuLy9cclxuLy8gTm90ZTogVGhlc2UgcG9ydGlvbnMgY2FuIGJlIHJlYWQgaW4gYSBub24tb3ZlcmxhcHBpbmcgZmFzaGlvbiBhbmRcclxuLy8gYWxsb3cgc3RyYWlnaHRmb3J3YXJkIHBhcnNpbmcgb2YgdGhlIGhpZXJhcmNoeSB0aGF0IFdlYkdMIGVuY29kZXNcclxuLy8gaW4gdGhlIHVuaWZvcm0gbmFtZXMuXHJcblxyXG5mdW5jdGlvbiBhZGRVbmlmb3JtKCBjb250YWluZXIsIHVuaWZvcm1PYmplY3QgKSB7XHJcblxyXG5cdGNvbnRhaW5lci5zZXEucHVzaCggdW5pZm9ybU9iamVjdCApO1xyXG5cdGNvbnRhaW5lci5tYXBbIHVuaWZvcm1PYmplY3QuaWQgXSA9IHVuaWZvcm1PYmplY3Q7XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBwYXJzZVVuaWZvcm0oIGFjdGl2ZUluZm8sIGFkZHIsIGNvbnRhaW5lciApIHtcclxuXHJcblx0Y29uc3QgcGF0aCA9IGFjdGl2ZUluZm8ubmFtZSxcclxuXHRcdHBhdGhMZW5ndGggPSBwYXRoLmxlbmd0aDtcclxuXHJcblx0Ly8gcmVzZXQgUmVnRXhwIG9iamVjdCwgYmVjYXVzZSBvZiB0aGUgZWFybHkgZXhpdCBvZiBhIHByZXZpb3VzIHJ1blxyXG5cdFJlUGF0aFBhcnQubGFzdEluZGV4ID0gMDtcclxuXHJcblx0d2hpbGUgKCB0cnVlICkge1xyXG5cclxuXHRcdGNvbnN0IG1hdGNoID0gUmVQYXRoUGFydC5leGVjKCBwYXRoICksXHJcblx0XHRcdG1hdGNoRW5kID0gUmVQYXRoUGFydC5sYXN0SW5kZXg7XHJcblxyXG5cdFx0bGV0IGlkID0gbWF0Y2hbIDEgXTtcclxuXHRcdGNvbnN0IGlkSXNJbmRleCA9IG1hdGNoWyAyIF0gPT09ICddJyxcclxuXHRcdFx0c3Vic2NyaXB0ID0gbWF0Y2hbIDMgXTtcclxuXHJcblx0XHRpZiAoIGlkSXNJbmRleCApIGlkID0gaWQgfCAwOyAvLyBjb252ZXJ0IHRvIGludGVnZXJcclxuXHJcblx0XHRpZiAoIHN1YnNjcmlwdCA9PT0gdW5kZWZpbmVkIHx8IHN1YnNjcmlwdCA9PT0gJ1snICYmIG1hdGNoRW5kICsgMiA9PT0gcGF0aExlbmd0aCApIHtcclxuXHJcblx0XHRcdC8vIGJhcmUgbmFtZSBvciBcInB1cmVcIiBib3R0b20tbGV2ZWwgYXJyYXkgXCJbMF1cIiBzdWZmaXhcclxuXHJcblx0XHRcdGFkZFVuaWZvcm0oIGNvbnRhaW5lciwgc3Vic2NyaXB0ID09PSB1bmRlZmluZWQgP1xyXG5cdFx0XHRcdG5ldyBTaW5nbGVVbmlmb3JtKCBpZCwgYWN0aXZlSW5mbywgYWRkciApIDpcclxuXHRcdFx0XHRuZXcgUHVyZUFycmF5VW5pZm9ybSggaWQsIGFjdGl2ZUluZm8sIGFkZHIgKSApO1xyXG5cclxuXHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdC8vIHN0ZXAgaW50byBpbm5lciBub2RlIC8gY3JlYXRlIGl0IGluIGNhc2UgaXQgZG9lc24ndCBleGlzdFxyXG5cclxuXHRcdFx0Y29uc3QgbWFwID0gY29udGFpbmVyLm1hcDtcclxuXHRcdFx0bGV0IG5leHQgPSBtYXBbIGlkIF07XHJcblxyXG5cdFx0XHRpZiAoIG5leHQgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0bmV4dCA9IG5ldyBTdHJ1Y3R1cmVkVW5pZm9ybSggaWQgKTtcclxuXHRcdFx0XHRhZGRVbmlmb3JtKCBjb250YWluZXIsIG5leHQgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnRhaW5lciA9IG5leHQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vLyBSb290IENvbnRhaW5lclxyXG5cclxuY2xhc3MgV2ViR0xVbmlmb3JtcyB7XHJcblxyXG5cdGNvbnN0cnVjdG9yKCBnbCwgcHJvZ3JhbSApIHtcclxuXHJcblx0XHR0aGlzLnNlcSA9IFtdO1xyXG5cdFx0dGhpcy5tYXAgPSB7fTtcclxuXHJcblx0XHRjb25zdCBuID0gZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlciggcHJvZ3JhbSwgZ2wuQUNUSVZFX1VOSUZPUk1TICk7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgbjsgKysgaSApIHtcclxuXHJcblx0XHRcdGNvbnN0IGluZm8gPSBnbC5nZXRBY3RpdmVVbmlmb3JtKCBwcm9ncmFtLCBpICksXHJcblx0XHRcdFx0YWRkciA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgaW5mby5uYW1lICk7XHJcblxyXG5cdFx0XHRwYXJzZVVuaWZvcm0oIGluZm8sIGFkZHIsIHRoaXMgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0c2V0VmFsdWUoIGdsLCBuYW1lLCB2YWx1ZSwgdGV4dHVyZXMgKSB7XHJcblxyXG5cdFx0Y29uc3QgdSA9IHRoaXMubWFwWyBuYW1lIF07XHJcblxyXG5cdFx0aWYgKCB1ICE9PSB1bmRlZmluZWQgKSB1LnNldFZhbHVlKCBnbCwgdmFsdWUsIHRleHR1cmVzICk7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0T3B0aW9uYWwoIGdsLCBvYmplY3QsIG5hbWUgKSB7XHJcblxyXG5cdFx0Y29uc3QgdiA9IG9iamVjdFsgbmFtZSBdO1xyXG5cclxuXHRcdGlmICggdiAhPT0gdW5kZWZpbmVkICkgdGhpcy5zZXRWYWx1ZSggZ2wsIG5hbWUsIHYgKTtcclxuXHJcblx0fVxyXG5cclxuXHRzdGF0aWMgdXBsb2FkKCBnbCwgc2VxLCB2YWx1ZXMsIHRleHR1cmVzICkge1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbiA9IHNlcS5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB1ID0gc2VxWyBpIF0sXHJcblx0XHRcdFx0diA9IHZhbHVlc1sgdS5pZCBdO1xyXG5cclxuXHRcdFx0aWYgKCB2Lm5lZWRzVXBkYXRlICE9PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdFx0Ly8gbm90ZTogYWx3YXlzIHVwZGF0aW5nIHdoZW4gLm5lZWRzVXBkYXRlIGlzIHVuZGVmaW5lZFxyXG5cdFx0XHRcdHUuc2V0VmFsdWUoIGdsLCB2LnZhbHVlLCB0ZXh0dXJlcyApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRzdGF0aWMgc2VxV2l0aFZhbHVlKCBzZXEsIHZhbHVlcyApIHtcclxuXHJcblx0XHRjb25zdCByID0gW107XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBuID0gc2VxLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcclxuXHJcblx0XHRcdGNvbnN0IHUgPSBzZXFbIGkgXTtcclxuXHRcdFx0aWYgKCB1LmlkIGluIHZhbHVlcyApIHIucHVzaCggdSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcjtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgV2ViR0xVbmlmb3JtcyB9O1xyXG4iLCJmdW5jdGlvbiBXZWJHTFNoYWRlciggZ2wsIHR5cGUsIHN0cmluZyApIHtcclxuXHJcblx0Y29uc3Qgc2hhZGVyID0gZ2wuY3JlYXRlU2hhZGVyKCB0eXBlICk7XHJcblxyXG5cdGdsLnNoYWRlclNvdXJjZSggc2hhZGVyLCBzdHJpbmcgKTtcclxuXHRnbC5jb21waWxlU2hhZGVyKCBzaGFkZXIgKTtcclxuXHJcblx0cmV0dXJuIHNoYWRlcjtcclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFdlYkdMU2hhZGVyIH07XHJcbiIsImltcG9ydCB7IFdlYkdMVW5pZm9ybXMgfSBmcm9tICcuL1dlYkdMVW5pZm9ybXMuanMnO1xyXG5pbXBvcnQgeyBXZWJHTFNoYWRlciB9IGZyb20gJy4vV2ViR0xTaGFkZXIuanMnO1xyXG5pbXBvcnQgeyBTaGFkZXJDaHVuayB9IGZyb20gJy4uL3NoYWRlcnMvU2hhZGVyQ2h1bmsuanMnO1xyXG5pbXBvcnQgeyBOb1RvbmVNYXBwaW5nLCBBZGRPcGVyYXRpb24sIE1peE9wZXJhdGlvbiwgTXVsdGlwbHlPcGVyYXRpb24sIEN1YmVSZWZyYWN0aW9uTWFwcGluZywgQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmcsIEN1YmVSZWZsZWN0aW9uTWFwcGluZywgUENGU29mdFNoYWRvd01hcCwgUENGU2hhZG93TWFwLCBWU01TaGFkb3dNYXAsIEFnWFRvbmVNYXBwaW5nLCBBQ0VTRmlsbWljVG9uZU1hcHBpbmcsIE5ldXRyYWxUb25lTWFwcGluZywgQ2luZW9uVG9uZU1hcHBpbmcsIEN1c3RvbVRvbmVNYXBwaW5nLCBSZWluaGFyZFRvbmVNYXBwaW5nLCBMaW5lYXJUb25lTWFwcGluZywgR0xTTDMsIExpbmVhclRyYW5zZmVyLCBTUkdCVHJhbnNmZXIgfSBmcm9tICcuLi8uLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBDb2xvck1hbmFnZW1lbnQgfSBmcm9tICcuLi8uLi9tYXRoL0NvbG9yTWFuYWdlbWVudC5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBNYXRyaXgzIH0gZnJvbSAnLi4vLi4vbWF0aC9NYXRyaXgzLmpzJztcclxuXHJcbi8vIEZyb20gaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvd2ViZ2wvZXh0ZW5zaW9ucy9LSFJfcGFyYWxsZWxfc2hhZGVyX2NvbXBpbGUvXHJcbmNvbnN0IENPTVBMRVRJT05fU1RBVFVTX0tIUiA9IDB4OTFCMTtcclxuXHJcbmxldCBwcm9ncmFtSWRDb3VudCA9IDA7XHJcblxyXG5mdW5jdGlvbiBoYW5kbGVTb3VyY2UoIHN0cmluZywgZXJyb3JMaW5lICkge1xyXG5cclxuXHRjb25zdCBsaW5lcyA9IHN0cmluZy5zcGxpdCggJ1xcbicgKTtcclxuXHRjb25zdCBsaW5lczIgPSBbXTtcclxuXHJcblx0Y29uc3QgZnJvbSA9IE1hdGgubWF4KCBlcnJvckxpbmUgLSA2LCAwICk7XHJcblx0Y29uc3QgdG8gPSBNYXRoLm1pbiggZXJyb3JMaW5lICsgNiwgbGluZXMubGVuZ3RoICk7XHJcblxyXG5cdGZvciAoIGxldCBpID0gZnJvbTsgaSA8IHRvOyBpICsrICkge1xyXG5cclxuXHRcdGNvbnN0IGxpbmUgPSBpICsgMTtcclxuXHRcdGxpbmVzMi5wdXNoKCBgJHtsaW5lID09PSBlcnJvckxpbmUgPyAnPicgOiAnICd9ICR7bGluZX06ICR7bGluZXNbIGkgXX1gICk7XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIGxpbmVzMi5qb2luKCAnXFxuJyApO1xyXG5cclxufVxyXG5cclxuY29uc3QgX20wID0gLypAX19QVVJFX18qLyBuZXcgTWF0cml4MygpO1xyXG5cclxuZnVuY3Rpb24gZ2V0RW5jb2RpbmdDb21wb25lbnRzKCBjb2xvclNwYWNlICkge1xyXG5cclxuXHRDb2xvck1hbmFnZW1lbnQuX2dldE1hdHJpeCggX20wLCBDb2xvck1hbmFnZW1lbnQud29ya2luZ0NvbG9yU3BhY2UsIGNvbG9yU3BhY2UgKTtcclxuXHJcblx0Y29uc3QgZW5jb2RpbmdNYXRyaXggPSBgbWF0MyggJHsgX20wLmVsZW1lbnRzLm1hcCggKCB2ICkgPT4gdi50b0ZpeGVkKCA0ICkgKSB9IClgO1xyXG5cclxuXHRzd2l0Y2ggKCBDb2xvck1hbmFnZW1lbnQuZ2V0VHJhbnNmZXIoIGNvbG9yU3BhY2UgKSApIHtcclxuXHJcblx0XHRjYXNlIExpbmVhclRyYW5zZmVyOlxyXG5cdFx0XHRyZXR1cm4gWyBlbmNvZGluZ01hdHJpeCwgJ0xpbmVhclRyYW5zZmVyT0VURicgXTtcclxuXHJcblx0XHRjYXNlIFNSR0JUcmFuc2ZlcjpcclxuXHRcdFx0cmV0dXJuIFsgZW5jb2RpbmdNYXRyaXgsICdzUkdCVHJhbnNmZXJPRVRGJyBdO1xyXG5cclxuXHRcdGRlZmF1bHQ6XHJcblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUHJvZ3JhbTogVW5zdXBwb3J0ZWQgY29sb3Igc3BhY2U6ICcsIGNvbG9yU3BhY2UgKTtcclxuXHRcdFx0cmV0dXJuIFsgZW5jb2RpbmdNYXRyaXgsICdMaW5lYXJUcmFuc2Zlck9FVEYnIF07XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldFNoYWRlckVycm9ycyggZ2wsIHNoYWRlciwgdHlwZSApIHtcclxuXHJcblx0Y29uc3Qgc3RhdHVzID0gZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKCBzaGFkZXIsIGdsLkNPTVBJTEVfU1RBVFVTICk7XHJcblx0Y29uc3QgZXJyb3JzID0gZ2wuZ2V0U2hhZGVySW5mb0xvZyggc2hhZGVyICkudHJpbSgpO1xyXG5cclxuXHRpZiAoIHN0YXR1cyAmJiBlcnJvcnMgPT09ICcnICkgcmV0dXJuICcnO1xyXG5cclxuXHRjb25zdCBlcnJvck1hdGNoZXMgPSAvRVJST1I6IDA6KFxcZCspLy5leGVjKCBlcnJvcnMgKTtcclxuXHRpZiAoIGVycm9yTWF0Y2hlcyApIHtcclxuXHJcblx0XHQvLyAtLWVuYWJsZS1wcml2aWxlZ2VkLXdlYmdsLWV4dGVuc2lvblxyXG5cdFx0Ly8gY29uc29sZS5sb2coICcqKicgKyB0eXBlICsgJyoqJywgZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCR0xfZGVidWdfc2hhZGVycycgKS5nZXRUcmFuc2xhdGVkU2hhZGVyU291cmNlKCBzaGFkZXIgKSApO1xyXG5cclxuXHRcdGNvbnN0IGVycm9yTGluZSA9IHBhcnNlSW50KCBlcnJvck1hdGNoZXNbIDEgXSApO1xyXG5cdFx0cmV0dXJuIHR5cGUudG9VcHBlckNhc2UoKSArICdcXG5cXG4nICsgZXJyb3JzICsgJ1xcblxcbicgKyBoYW5kbGVTb3VyY2UoIGdsLmdldFNoYWRlclNvdXJjZSggc2hhZGVyICksIGVycm9yTGluZSApO1xyXG5cclxuXHR9IGVsc2Uge1xyXG5cclxuXHRcdHJldHVybiBlcnJvcnM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldFRleGVsRW5jb2RpbmdGdW5jdGlvbiggZnVuY3Rpb25OYW1lLCBjb2xvclNwYWNlICkge1xyXG5cclxuXHRjb25zdCBjb21wb25lbnRzID0gZ2V0RW5jb2RpbmdDb21wb25lbnRzKCBjb2xvclNwYWNlICk7XHJcblxyXG5cdHJldHVybiBbXHJcblxyXG5cdFx0YHZlYzQgJHtmdW5jdGlvbk5hbWV9KCB2ZWM0IHZhbHVlICkge2AsXHJcblxyXG5cdFx0YFx0cmV0dXJuICR7Y29tcG9uZW50c1sgMSBdfSggdmVjNCggdmFsdWUucmdiICogJHtjb21wb25lbnRzWyAwIF19LCB2YWx1ZS5hICkgKTtgLFxyXG5cclxuXHRcdCd9JyxcclxuXHJcblx0XS5qb2luKCAnXFxuJyApO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0VG9uZU1hcHBpbmdGdW5jdGlvbiggZnVuY3Rpb25OYW1lLCB0b25lTWFwcGluZyApIHtcclxuXHJcblx0bGV0IHRvbmVNYXBwaW5nTmFtZTtcclxuXHJcblx0c3dpdGNoICggdG9uZU1hcHBpbmcgKSB7XHJcblxyXG5cdFx0Y2FzZSBMaW5lYXJUb25lTWFwcGluZzpcclxuXHRcdFx0dG9uZU1hcHBpbmdOYW1lID0gJ0xpbmVhcic7XHJcblx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdGNhc2UgUmVpbmhhcmRUb25lTWFwcGluZzpcclxuXHRcdFx0dG9uZU1hcHBpbmdOYW1lID0gJ1JlaW5oYXJkJztcclxuXHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0Y2FzZSBDaW5lb25Ub25lTWFwcGluZzpcclxuXHRcdFx0dG9uZU1hcHBpbmdOYW1lID0gJ0NpbmVvbic7XHJcblx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdGNhc2UgQUNFU0ZpbG1pY1RvbmVNYXBwaW5nOlxyXG5cdFx0XHR0b25lTWFwcGluZ05hbWUgPSAnQUNFU0ZpbG1pYyc7XHJcblx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdGNhc2UgQWdYVG9uZU1hcHBpbmc6XHJcblx0XHRcdHRvbmVNYXBwaW5nTmFtZSA9ICdBZ1gnO1xyXG5cdFx0XHRicmVhaztcclxuXHJcblx0XHRjYXNlIE5ldXRyYWxUb25lTWFwcGluZzpcclxuXHRcdFx0dG9uZU1hcHBpbmdOYW1lID0gJ05ldXRyYWwnO1xyXG5cdFx0XHRicmVhaztcclxuXHJcblx0XHRjYXNlIEN1c3RvbVRvbmVNYXBwaW5nOlxyXG5cdFx0XHR0b25lTWFwcGluZ05hbWUgPSAnQ3VzdG9tJztcclxuXHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0ZGVmYXVsdDpcclxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xQcm9ncmFtOiBVbnN1cHBvcnRlZCB0b25lTWFwcGluZzonLCB0b25lTWFwcGluZyApO1xyXG5cdFx0XHR0b25lTWFwcGluZ05hbWUgPSAnTGluZWFyJztcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gJ3ZlYzMgJyArIGZ1bmN0aW9uTmFtZSArICcoIHZlYzMgY29sb3IgKSB7IHJldHVybiAnICsgdG9uZU1hcHBpbmdOYW1lICsgJ1RvbmVNYXBwaW5nKCBjb2xvciApOyB9JztcclxuXHJcbn1cclxuXHJcbmNvbnN0IF92MCA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuXHJcbmZ1bmN0aW9uIGdldEx1bWluYW5jZUZ1bmN0aW9uKCkge1xyXG5cclxuXHRDb2xvck1hbmFnZW1lbnQuZ2V0THVtaW5hbmNlQ29lZmZpY2llbnRzKCBfdjAgKTtcclxuXHJcblx0Y29uc3QgciA9IF92MC54LnRvRml4ZWQoIDQgKTtcclxuXHRjb25zdCBnID0gX3YwLnkudG9GaXhlZCggNCApO1xyXG5cdGNvbnN0IGIgPSBfdjAuei50b0ZpeGVkKCA0ICk7XHJcblxyXG5cdHJldHVybiBbXHJcblxyXG5cdFx0J2Zsb2F0IGx1bWluYW5jZSggY29uc3QgaW4gdmVjMyByZ2IgKSB7JyxcclxuXHJcblx0XHRgXHRjb25zdCB2ZWMzIHdlaWdodHMgPSB2ZWMzKCAkeyByIH0sICR7IGcgfSwgJHsgYiB9ICk7YCxcclxuXHJcblx0XHQnXHRyZXR1cm4gZG90KCB3ZWlnaHRzLCByZ2IgKTsnLFxyXG5cclxuXHRcdCd9J1xyXG5cclxuXHRdLmpvaW4oICdcXG4nICk7XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBnZW5lcmF0ZVZlcnRleEV4dGVuc2lvbnMoIHBhcmFtZXRlcnMgKSB7XHJcblxyXG5cdGNvbnN0IGNodW5rcyA9IFtcclxuXHRcdHBhcmFtZXRlcnMuZXh0ZW5zaW9uQ2xpcEN1bGxEaXN0YW5jZSA/ICcjZXh0ZW5zaW9uIEdMX0FOR0xFX2NsaXBfY3VsbF9kaXN0YW5jZSA6IHJlcXVpcmUnIDogJycsXHJcblx0XHRwYXJhbWV0ZXJzLmV4dGVuc2lvbk11bHRpRHJhdyA/ICcjZXh0ZW5zaW9uIEdMX0FOR0xFX211bHRpX2RyYXcgOiByZXF1aXJlJyA6ICcnLFxyXG5cdF07XHJcblxyXG5cdHJldHVybiBjaHVua3MuZmlsdGVyKCBmaWx0ZXJFbXB0eUxpbmUgKS5qb2luKCAnXFxuJyApO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gZ2VuZXJhdGVEZWZpbmVzKCBkZWZpbmVzICkge1xyXG5cclxuXHRjb25zdCBjaHVua3MgPSBbXTtcclxuXHJcblx0Zm9yICggY29uc3QgbmFtZSBpbiBkZWZpbmVzICkge1xyXG5cclxuXHRcdGNvbnN0IHZhbHVlID0gZGVmaW5lc1sgbmFtZSBdO1xyXG5cclxuXHRcdGlmICggdmFsdWUgPT09IGZhbHNlICkgY29udGludWU7XHJcblxyXG5cdFx0Y2h1bmtzLnB1c2goICcjZGVmaW5lICcgKyBuYW1lICsgJyAnICsgdmFsdWUgKTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gY2h1bmtzLmpvaW4oICdcXG4nICk7XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBmZXRjaEF0dHJpYnV0ZUxvY2F0aW9ucyggZ2wsIHByb2dyYW0gKSB7XHJcblxyXG5cdGNvbnN0IGF0dHJpYnV0ZXMgPSB7fTtcclxuXHJcblx0Y29uc3QgbiA9IGdsLmdldFByb2dyYW1QYXJhbWV0ZXIoIHByb2dyYW0sIGdsLkFDVElWRV9BVFRSSUJVVEVTICk7XHJcblxyXG5cdGZvciAoIGxldCBpID0gMDsgaSA8IG47IGkgKysgKSB7XHJcblxyXG5cdFx0Y29uc3QgaW5mbyA9IGdsLmdldEFjdGl2ZUF0dHJpYiggcHJvZ3JhbSwgaSApO1xyXG5cdFx0Y29uc3QgbmFtZSA9IGluZm8ubmFtZTtcclxuXHJcblx0XHRsZXQgbG9jYXRpb25TaXplID0gMTtcclxuXHRcdGlmICggaW5mby50eXBlID09PSBnbC5GTE9BVF9NQVQyICkgbG9jYXRpb25TaXplID0gMjtcclxuXHRcdGlmICggaW5mby50eXBlID09PSBnbC5GTE9BVF9NQVQzICkgbG9jYXRpb25TaXplID0gMztcclxuXHRcdGlmICggaW5mby50eXBlID09PSBnbC5GTE9BVF9NQVQ0ICkgbG9jYXRpb25TaXplID0gNDtcclxuXHJcblx0XHQvLyBjb25zb2xlLmxvZyggJ1RIUkVFLldlYkdMUHJvZ3JhbTogQUNUSVZFIFZFUlRFWCBBVFRSSUJVVEU6JywgbmFtZSwgaSApO1xyXG5cclxuXHRcdGF0dHJpYnV0ZXNbIG5hbWUgXSA9IHtcclxuXHRcdFx0dHlwZTogaW5mby50eXBlLFxyXG5cdFx0XHRsb2NhdGlvbjogZ2wuZ2V0QXR0cmliTG9jYXRpb24oIHByb2dyYW0sIG5hbWUgKSxcclxuXHRcdFx0bG9jYXRpb25TaXplOiBsb2NhdGlvblNpemVcclxuXHRcdH07XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIGF0dHJpYnV0ZXM7XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBmaWx0ZXJFbXB0eUxpbmUoIHN0cmluZyApIHtcclxuXHJcblx0cmV0dXJuIHN0cmluZyAhPT0gJyc7XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiByZXBsYWNlTGlnaHROdW1zKCBzdHJpbmcsIHBhcmFtZXRlcnMgKSB7XHJcblxyXG5cdGNvbnN0IG51bVNwb3RMaWdodENvb3JkcyA9IHBhcmFtZXRlcnMubnVtU3BvdExpZ2h0U2hhZG93cyArIHBhcmFtZXRlcnMubnVtU3BvdExpZ2h0TWFwcyAtIHBhcmFtZXRlcnMubnVtU3BvdExpZ2h0U2hhZG93c1dpdGhNYXBzO1xyXG5cclxuXHRyZXR1cm4gc3RyaW5nXHJcblx0XHQucmVwbGFjZSggL05VTV9ESVJfTElHSFRTL2csIHBhcmFtZXRlcnMubnVtRGlyTGlnaHRzIClcclxuXHRcdC5yZXBsYWNlKCAvTlVNX1NQT1RfTElHSFRTL2csIHBhcmFtZXRlcnMubnVtU3BvdExpZ2h0cyApXHJcblx0XHQucmVwbGFjZSggL05VTV9TUE9UX0xJR0hUX01BUFMvZywgcGFyYW1ldGVycy5udW1TcG90TGlnaHRNYXBzIClcclxuXHRcdC5yZXBsYWNlKCAvTlVNX1NQT1RfTElHSFRfQ09PUkRTL2csIG51bVNwb3RMaWdodENvb3JkcyApXHJcblx0XHQucmVwbGFjZSggL05VTV9SRUNUX0FSRUFfTElHSFRTL2csIHBhcmFtZXRlcnMubnVtUmVjdEFyZWFMaWdodHMgKVxyXG5cdFx0LnJlcGxhY2UoIC9OVU1fUE9JTlRfTElHSFRTL2csIHBhcmFtZXRlcnMubnVtUG9pbnRMaWdodHMgKVxyXG5cdFx0LnJlcGxhY2UoIC9OVU1fSEVNSV9MSUdIVFMvZywgcGFyYW1ldGVycy5udW1IZW1pTGlnaHRzIClcclxuXHRcdC5yZXBsYWNlKCAvTlVNX0RJUl9MSUdIVF9TSEFET1dTL2csIHBhcmFtZXRlcnMubnVtRGlyTGlnaHRTaGFkb3dzIClcclxuXHRcdC5yZXBsYWNlKCAvTlVNX1NQT1RfTElHSFRfU0hBRE9XU19XSVRIX01BUFMvZywgcGFyYW1ldGVycy5udW1TcG90TGlnaHRTaGFkb3dzV2l0aE1hcHMgKVxyXG5cdFx0LnJlcGxhY2UoIC9OVU1fU1BPVF9MSUdIVF9TSEFET1dTL2csIHBhcmFtZXRlcnMubnVtU3BvdExpZ2h0U2hhZG93cyApXHJcblx0XHQucmVwbGFjZSggL05VTV9QT0lOVF9MSUdIVF9TSEFET1dTL2csIHBhcmFtZXRlcnMubnVtUG9pbnRMaWdodFNoYWRvd3MgKTtcclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlcGxhY2VDbGlwcGluZ1BsYW5lTnVtcyggc3RyaW5nLCBwYXJhbWV0ZXJzICkge1xyXG5cclxuXHRyZXR1cm4gc3RyaW5nXHJcblx0XHQucmVwbGFjZSggL05VTV9DTElQUElOR19QTEFORVMvZywgcGFyYW1ldGVycy5udW1DbGlwcGluZ1BsYW5lcyApXHJcblx0XHQucmVwbGFjZSggL1VOSU9OX0NMSVBQSU5HX1BMQU5FUy9nLCAoIHBhcmFtZXRlcnMubnVtQ2xpcHBpbmdQbGFuZXMgLSBwYXJhbWV0ZXJzLm51bUNsaXBJbnRlcnNlY3Rpb24gKSApO1xyXG5cclxufVxyXG5cclxuLy8gUmVzb2x2ZSBJbmNsdWRlc1xyXG5cclxuY29uc3QgaW5jbHVkZVBhdHRlcm4gPSAvXlsgXFx0XSojaW5jbHVkZSArPChbXFx3XFxkLi9dKyk+L2dtO1xyXG5cclxuZnVuY3Rpb24gcmVzb2x2ZUluY2x1ZGVzKCBzdHJpbmcgKSB7XHJcblxyXG5cdHJldHVybiBzdHJpbmcucmVwbGFjZSggaW5jbHVkZVBhdHRlcm4sIGluY2x1ZGVSZXBsYWNlciApO1xyXG5cclxufVxyXG5cclxuY29uc3Qgc2hhZGVyQ2h1bmtNYXAgPSBuZXcgTWFwKCk7XHJcblxyXG5mdW5jdGlvbiBpbmNsdWRlUmVwbGFjZXIoIG1hdGNoLCBpbmNsdWRlICkge1xyXG5cclxuXHRsZXQgc3RyaW5nID0gU2hhZGVyQ2h1bmtbIGluY2x1ZGUgXTtcclxuXHJcblx0aWYgKCBzdHJpbmcgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRjb25zdCBuZXdJbmNsdWRlID0gc2hhZGVyQ2h1bmtNYXAuZ2V0KCBpbmNsdWRlICk7XHJcblxyXG5cdFx0aWYgKCBuZXdJbmNsdWRlICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRzdHJpbmcgPSBTaGFkZXJDaHVua1sgbmV3SW5jbHVkZSBdO1xyXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBTaGFkZXIgY2h1bmsgXCIlc1wiIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBcIiVzXCIgaW5zdGVhZC4nLCBpbmNsdWRlLCBuZXdJbmNsdWRlICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHRocm93IG5ldyBFcnJvciggJ0NhbiBub3QgcmVzb2x2ZSAjaW5jbHVkZSA8JyArIGluY2x1ZGUgKyAnPicgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIHJlc29sdmVJbmNsdWRlcyggc3RyaW5nICk7XHJcblxyXG59XHJcblxyXG4vLyBVbnJvbGwgTG9vcHNcclxuXHJcbmNvbnN0IHVucm9sbExvb3BQYXR0ZXJuID0gLyNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcXHMrZm9yXFxzKlxcKFxccyppbnRcXHMraVxccyo9XFxzKihcXGQrKVxccyo7XFxzKmlcXHMqPFxccyooXFxkKylcXHMqO1xccyppXFxzKlxcK1xcK1xccypcXClcXHMqeyhbXFxzXFxTXSs/KX1cXHMrI3ByYWdtYSB1bnJvbGxfbG9vcF9lbmQvZztcclxuXHJcbmZ1bmN0aW9uIHVucm9sbExvb3BzKCBzdHJpbmcgKSB7XHJcblxyXG5cdHJldHVybiBzdHJpbmcucmVwbGFjZSggdW5yb2xsTG9vcFBhdHRlcm4sIGxvb3BSZXBsYWNlciApO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gbG9vcFJlcGxhY2VyKCBtYXRjaCwgc3RhcnQsIGVuZCwgc25pcHBldCApIHtcclxuXHJcblx0bGV0IHN0cmluZyA9ICcnO1xyXG5cclxuXHRmb3IgKCBsZXQgaSA9IHBhcnNlSW50KCBzdGFydCApOyBpIDwgcGFyc2VJbnQoIGVuZCApOyBpICsrICkge1xyXG5cclxuXHRcdHN0cmluZyArPSBzbmlwcGV0XHJcblx0XHRcdC5yZXBsYWNlKCAvXFxbXFxzKmlcXHMqXFxdL2csICdbICcgKyBpICsgJyBdJyApXHJcblx0XHRcdC5yZXBsYWNlKCAvVU5ST0xMRURfTE9PUF9JTkRFWC9nLCBpICk7XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIHN0cmluZztcclxuXHJcbn1cclxuXHJcbi8vXHJcblxyXG5mdW5jdGlvbiBnZW5lcmF0ZVByZWNpc2lvbiggcGFyYW1ldGVycyApIHtcclxuXHJcblx0bGV0IHByZWNpc2lvbnN0cmluZyA9IGBwcmVjaXNpb24gJHtwYXJhbWV0ZXJzLnByZWNpc2lvbn0gZmxvYXQ7XHJcblx0cHJlY2lzaW9uICR7cGFyYW1ldGVycy5wcmVjaXNpb259IGludDtcclxuXHRwcmVjaXNpb24gJHtwYXJhbWV0ZXJzLnByZWNpc2lvbn0gc2FtcGxlcjJEO1xyXG5cdHByZWNpc2lvbiAke3BhcmFtZXRlcnMucHJlY2lzaW9ufSBzYW1wbGVyQ3ViZTtcclxuXHRwcmVjaXNpb24gJHtwYXJhbWV0ZXJzLnByZWNpc2lvbn0gc2FtcGxlcjNEO1xyXG5cdHByZWNpc2lvbiAke3BhcmFtZXRlcnMucHJlY2lzaW9ufSBzYW1wbGVyMkRBcnJheTtcclxuXHRwcmVjaXNpb24gJHtwYXJhbWV0ZXJzLnByZWNpc2lvbn0gc2FtcGxlcjJEU2hhZG93O1xyXG5cdHByZWNpc2lvbiAke3BhcmFtZXRlcnMucHJlY2lzaW9ufSBzYW1wbGVyQ3ViZVNoYWRvdztcclxuXHRwcmVjaXNpb24gJHtwYXJhbWV0ZXJzLnByZWNpc2lvbn0gc2FtcGxlcjJEQXJyYXlTaGFkb3c7XHJcblx0cHJlY2lzaW9uICR7cGFyYW1ldGVycy5wcmVjaXNpb259IGlzYW1wbGVyMkQ7XHJcblx0cHJlY2lzaW9uICR7cGFyYW1ldGVycy5wcmVjaXNpb259IGlzYW1wbGVyM0Q7XHJcblx0cHJlY2lzaW9uICR7cGFyYW1ldGVycy5wcmVjaXNpb259IGlzYW1wbGVyQ3ViZTtcclxuXHRwcmVjaXNpb24gJHtwYXJhbWV0ZXJzLnByZWNpc2lvbn0gaXNhbXBsZXIyREFycmF5O1xyXG5cdHByZWNpc2lvbiAke3BhcmFtZXRlcnMucHJlY2lzaW9ufSB1c2FtcGxlcjJEO1xyXG5cdHByZWNpc2lvbiAke3BhcmFtZXRlcnMucHJlY2lzaW9ufSB1c2FtcGxlcjNEO1xyXG5cdHByZWNpc2lvbiAke3BhcmFtZXRlcnMucHJlY2lzaW9ufSB1c2FtcGxlckN1YmU7XHJcblx0cHJlY2lzaW9uICR7cGFyYW1ldGVycy5wcmVjaXNpb259IHVzYW1wbGVyMkRBcnJheTtcclxuXHRgO1xyXG5cclxuXHRpZiAoIHBhcmFtZXRlcnMucHJlY2lzaW9uID09PSAnaGlnaHAnICkge1xyXG5cclxuXHRcdHByZWNpc2lvbnN0cmluZyArPSAnXFxuI2RlZmluZSBISUdIX1BSRUNJU0lPTic7XHJcblxyXG5cdH0gZWxzZSBpZiAoIHBhcmFtZXRlcnMucHJlY2lzaW9uID09PSAnbWVkaXVtcCcgKSB7XHJcblxyXG5cdFx0cHJlY2lzaW9uc3RyaW5nICs9ICdcXG4jZGVmaW5lIE1FRElVTV9QUkVDSVNJT04nO1xyXG5cclxuXHR9IGVsc2UgaWYgKCBwYXJhbWV0ZXJzLnByZWNpc2lvbiA9PT0gJ2xvd3AnICkge1xyXG5cclxuXHRcdHByZWNpc2lvbnN0cmluZyArPSAnXFxuI2RlZmluZSBMT1dfUFJFQ0lTSU9OJztcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gcHJlY2lzaW9uc3RyaW5nO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gZ2VuZXJhdGVTaGFkb3dNYXBUeXBlRGVmaW5lKCBwYXJhbWV0ZXJzICkge1xyXG5cclxuXHRsZXQgc2hhZG93TWFwVHlwZURlZmluZSA9ICdTSEFET1dNQVBfVFlQRV9CQVNJQyc7XHJcblxyXG5cdGlmICggcGFyYW1ldGVycy5zaGFkb3dNYXBUeXBlID09PSBQQ0ZTaGFkb3dNYXAgKSB7XHJcblxyXG5cdFx0c2hhZG93TWFwVHlwZURlZmluZSA9ICdTSEFET1dNQVBfVFlQRV9QQ0YnO1xyXG5cclxuXHR9IGVsc2UgaWYgKCBwYXJhbWV0ZXJzLnNoYWRvd01hcFR5cGUgPT09IFBDRlNvZnRTaGFkb3dNYXAgKSB7XHJcblxyXG5cdFx0c2hhZG93TWFwVHlwZURlZmluZSA9ICdTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCc7XHJcblxyXG5cdH0gZWxzZSBpZiAoIHBhcmFtZXRlcnMuc2hhZG93TWFwVHlwZSA9PT0gVlNNU2hhZG93TWFwICkge1xyXG5cclxuXHRcdHNoYWRvd01hcFR5cGVEZWZpbmUgPSAnU0hBRE9XTUFQX1RZUEVfVlNNJztcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gc2hhZG93TWFwVHlwZURlZmluZTtcclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdlbmVyYXRlRW52TWFwVHlwZURlZmluZSggcGFyYW1ldGVycyApIHtcclxuXHJcblx0bGV0IGVudk1hcFR5cGVEZWZpbmUgPSAnRU5WTUFQX1RZUEVfQ1VCRSc7XHJcblxyXG5cdGlmICggcGFyYW1ldGVycy5lbnZNYXAgKSB7XHJcblxyXG5cdFx0c3dpdGNoICggcGFyYW1ldGVycy5lbnZNYXBNb2RlICkge1xyXG5cclxuXHRcdFx0Y2FzZSBDdWJlUmVmbGVjdGlvbk1hcHBpbmc6XHJcblx0XHRcdGNhc2UgQ3ViZVJlZnJhY3Rpb25NYXBwaW5nOlxyXG5cdFx0XHRcdGVudk1hcFR5cGVEZWZpbmUgPSAnRU5WTUFQX1RZUEVfQ1VCRSc7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nOlxyXG5cdFx0XHRcdGVudk1hcFR5cGVEZWZpbmUgPSAnRU5WTUFQX1RZUEVfQ1VCRV9VVic7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiBlbnZNYXBUeXBlRGVmaW5lO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gZ2VuZXJhdGVFbnZNYXBNb2RlRGVmaW5lKCBwYXJhbWV0ZXJzICkge1xyXG5cclxuXHRsZXQgZW52TWFwTW9kZURlZmluZSA9ICdFTlZNQVBfTU9ERV9SRUZMRUNUSU9OJztcclxuXHJcblx0aWYgKCBwYXJhbWV0ZXJzLmVudk1hcCApIHtcclxuXHJcblx0XHRzd2l0Y2ggKCBwYXJhbWV0ZXJzLmVudk1hcE1vZGUgKSB7XHJcblxyXG5cdFx0XHRjYXNlIEN1YmVSZWZyYWN0aW9uTWFwcGluZzpcclxuXHJcblx0XHRcdFx0ZW52TWFwTW9kZURlZmluZSA9ICdFTlZNQVBfTU9ERV9SRUZSQUNUSU9OJztcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIGVudk1hcE1vZGVEZWZpbmU7XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBnZW5lcmF0ZUVudk1hcEJsZW5kaW5nRGVmaW5lKCBwYXJhbWV0ZXJzICkge1xyXG5cclxuXHRsZXQgZW52TWFwQmxlbmRpbmdEZWZpbmUgPSAnRU5WTUFQX0JMRU5ESU5HX05PTkUnO1xyXG5cclxuXHRpZiAoIHBhcmFtZXRlcnMuZW52TWFwICkge1xyXG5cclxuXHRcdHN3aXRjaCAoIHBhcmFtZXRlcnMuY29tYmluZSApIHtcclxuXHJcblx0XHRcdGNhc2UgTXVsdGlwbHlPcGVyYXRpb246XHJcblx0XHRcdFx0ZW52TWFwQmxlbmRpbmdEZWZpbmUgPSAnRU5WTUFQX0JMRU5ESU5HX01VTFRJUExZJztcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgTWl4T3BlcmF0aW9uOlxyXG5cdFx0XHRcdGVudk1hcEJsZW5kaW5nRGVmaW5lID0gJ0VOVk1BUF9CTEVORElOR19NSVgnO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBBZGRPcGVyYXRpb246XHJcblx0XHRcdFx0ZW52TWFwQmxlbmRpbmdEZWZpbmUgPSAnRU5WTUFQX0JMRU5ESU5HX0FERCc7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiBlbnZNYXBCbGVuZGluZ0RlZmluZTtcclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdlbmVyYXRlQ3ViZVVWU2l6ZSggcGFyYW1ldGVycyApIHtcclxuXHJcblx0Y29uc3QgaW1hZ2VIZWlnaHQgPSBwYXJhbWV0ZXJzLmVudk1hcEN1YmVVVkhlaWdodDtcclxuXHJcblx0aWYgKCBpbWFnZUhlaWdodCA9PT0gbnVsbCApIHJldHVybiBudWxsO1xyXG5cclxuXHRjb25zdCBtYXhNaXAgPSBNYXRoLmxvZzIoIGltYWdlSGVpZ2h0ICkgLSAyO1xyXG5cclxuXHRjb25zdCB0ZXhlbEhlaWdodCA9IDEuMCAvIGltYWdlSGVpZ2h0O1xyXG5cclxuXHRjb25zdCB0ZXhlbFdpZHRoID0gMS4wIC8gKCAzICogTWF0aC5tYXgoIE1hdGgucG93KCAyLCBtYXhNaXAgKSwgNyAqIDE2ICkgKTtcclxuXHJcblx0cmV0dXJuIHsgdGV4ZWxXaWR0aCwgdGV4ZWxIZWlnaHQsIG1heE1pcCB9O1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gV2ViR0xQcm9ncmFtKCByZW5kZXJlciwgY2FjaGVLZXksIHBhcmFtZXRlcnMsIGJpbmRpbmdTdGF0ZXMgKSB7XHJcblxyXG5cdC8vIFRPRE8gU2VuZCB0aGlzIGV2ZW50IHRvIFRocmVlLmpzIERldlRvb2xzXHJcblx0Ly8gY29uc29sZS5sb2coICdXZWJHTFByb2dyYW0nLCBjYWNoZUtleSApO1xyXG5cclxuXHRjb25zdCBnbCA9IHJlbmRlcmVyLmdldENvbnRleHQoKTtcclxuXHJcblx0Y29uc3QgZGVmaW5lcyA9IHBhcmFtZXRlcnMuZGVmaW5lcztcclxuXHJcblx0bGV0IHZlcnRleFNoYWRlciA9IHBhcmFtZXRlcnMudmVydGV4U2hhZGVyO1xyXG5cdGxldCBmcmFnbWVudFNoYWRlciA9IHBhcmFtZXRlcnMuZnJhZ21lbnRTaGFkZXI7XHJcblxyXG5cdGNvbnN0IHNoYWRvd01hcFR5cGVEZWZpbmUgPSBnZW5lcmF0ZVNoYWRvd01hcFR5cGVEZWZpbmUoIHBhcmFtZXRlcnMgKTtcclxuXHRjb25zdCBlbnZNYXBUeXBlRGVmaW5lID0gZ2VuZXJhdGVFbnZNYXBUeXBlRGVmaW5lKCBwYXJhbWV0ZXJzICk7XHJcblx0Y29uc3QgZW52TWFwTW9kZURlZmluZSA9IGdlbmVyYXRlRW52TWFwTW9kZURlZmluZSggcGFyYW1ldGVycyApO1xyXG5cdGNvbnN0IGVudk1hcEJsZW5kaW5nRGVmaW5lID0gZ2VuZXJhdGVFbnZNYXBCbGVuZGluZ0RlZmluZSggcGFyYW1ldGVycyApO1xyXG5cdGNvbnN0IGVudk1hcEN1YmVVVlNpemUgPSBnZW5lcmF0ZUN1YmVVVlNpemUoIHBhcmFtZXRlcnMgKTtcclxuXHJcblx0Y29uc3QgY3VzdG9tVmVydGV4RXh0ZW5zaW9ucyA9IGdlbmVyYXRlVmVydGV4RXh0ZW5zaW9ucyggcGFyYW1ldGVycyApO1xyXG5cclxuXHRjb25zdCBjdXN0b21EZWZpbmVzID0gZ2VuZXJhdGVEZWZpbmVzKCBkZWZpbmVzICk7XHJcblxyXG5cdGNvbnN0IHByb2dyYW0gPSBnbC5jcmVhdGVQcm9ncmFtKCk7XHJcblxyXG5cdGxldCBwcmVmaXhWZXJ0ZXgsIHByZWZpeEZyYWdtZW50O1xyXG5cdGxldCB2ZXJzaW9uU3RyaW5nID0gcGFyYW1ldGVycy5nbHNsVmVyc2lvbiA/ICcjdmVyc2lvbiAnICsgcGFyYW1ldGVycy5nbHNsVmVyc2lvbiArICdcXG4nIDogJyc7XHJcblxyXG5cdGlmICggcGFyYW1ldGVycy5pc1Jhd1NoYWRlck1hdGVyaWFsICkge1xyXG5cclxuXHRcdHByZWZpeFZlcnRleCA9IFtcclxuXHJcblx0XHRcdCcjZGVmaW5lIFNIQURFUl9UWVBFICcgKyBwYXJhbWV0ZXJzLnNoYWRlclR5cGUsXHJcblx0XHRcdCcjZGVmaW5lIFNIQURFUl9OQU1FICcgKyBwYXJhbWV0ZXJzLnNoYWRlck5hbWUsXHJcblxyXG5cdFx0XHRjdXN0b21EZWZpbmVzXHJcblxyXG5cdFx0XS5maWx0ZXIoIGZpbHRlckVtcHR5TGluZSApLmpvaW4oICdcXG4nICk7XHJcblxyXG5cdFx0aWYgKCBwcmVmaXhWZXJ0ZXgubGVuZ3RoID4gMCApIHtcclxuXHJcblx0XHRcdHByZWZpeFZlcnRleCArPSAnXFxuJztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cHJlZml4RnJhZ21lbnQgPSBbXHJcblxyXG5cdFx0XHQnI2RlZmluZSBTSEFERVJfVFlQRSAnICsgcGFyYW1ldGVycy5zaGFkZXJUeXBlLFxyXG5cdFx0XHQnI2RlZmluZSBTSEFERVJfTkFNRSAnICsgcGFyYW1ldGVycy5zaGFkZXJOYW1lLFxyXG5cclxuXHRcdFx0Y3VzdG9tRGVmaW5lc1xyXG5cclxuXHRcdF0uZmlsdGVyKCBmaWx0ZXJFbXB0eUxpbmUgKS5qb2luKCAnXFxuJyApO1xyXG5cclxuXHRcdGlmICggcHJlZml4RnJhZ21lbnQubGVuZ3RoID4gMCApIHtcclxuXHJcblx0XHRcdHByZWZpeEZyYWdtZW50ICs9ICdcXG4nO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fSBlbHNlIHtcclxuXHJcblx0XHRwcmVmaXhWZXJ0ZXggPSBbXHJcblxyXG5cdFx0XHRnZW5lcmF0ZVByZWNpc2lvbiggcGFyYW1ldGVycyApLFxyXG5cclxuXHRcdFx0JyNkZWZpbmUgU0hBREVSX1RZUEUgJyArIHBhcmFtZXRlcnMuc2hhZGVyVHlwZSxcclxuXHRcdFx0JyNkZWZpbmUgU0hBREVSX05BTUUgJyArIHBhcmFtZXRlcnMuc2hhZGVyTmFtZSxcclxuXHJcblx0XHRcdGN1c3RvbURlZmluZXMsXHJcblxyXG5cdFx0XHRwYXJhbWV0ZXJzLmV4dGVuc2lvbkNsaXBDdWxsRGlzdGFuY2UgPyAnI2RlZmluZSBVU0VfQ0xJUF9ESVNUQU5DRScgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy5iYXRjaGluZyA/ICcjZGVmaW5lIFVTRV9CQVRDSElORycgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy5iYXRjaGluZ0NvbG9yID8gJyNkZWZpbmUgVVNFX0JBVENISU5HX0NPTE9SJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLmluc3RhbmNpbmcgPyAnI2RlZmluZSBVU0VfSU5TVEFOQ0lORycgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy5pbnN0YW5jaW5nQ29sb3IgPyAnI2RlZmluZSBVU0VfSU5TVEFOQ0lOR19DT0xPUicgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy5pbnN0YW5jaW5nTW9ycGggPyAnI2RlZmluZSBVU0VfSU5TVEFOQ0lOR19NT1JQSCcgOiAnJyxcclxuXHJcblx0XHRcdHBhcmFtZXRlcnMudXNlRm9nICYmIHBhcmFtZXRlcnMuZm9nID8gJyNkZWZpbmUgVVNFX0ZPRycgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy51c2VGb2cgJiYgcGFyYW1ldGVycy5mb2dFeHAyID8gJyNkZWZpbmUgRk9HX0VYUDInIDogJycsXHJcblxyXG5cdFx0XHRwYXJhbWV0ZXJzLm1hcCA/ICcjZGVmaW5lIFVTRV9NQVAnIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMuZW52TWFwID8gJyNkZWZpbmUgVVNFX0VOVk1BUCcgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy5lbnZNYXAgPyAnI2RlZmluZSAnICsgZW52TWFwTW9kZURlZmluZSA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLmxpZ2h0TWFwID8gJyNkZWZpbmUgVVNFX0xJR0hUTUFQJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLmFvTWFwID8gJyNkZWZpbmUgVVNFX0FPTUFQJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLmJ1bXBNYXAgPyAnI2RlZmluZSBVU0VfQlVNUE1BUCcgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy5ub3JtYWxNYXAgPyAnI2RlZmluZSBVU0VfTk9STUFMTUFQJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLm5vcm1hbE1hcE9iamVjdFNwYWNlID8gJyNkZWZpbmUgVVNFX05PUk1BTE1BUF9PQkpFQ1RTUEFDRScgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy5ub3JtYWxNYXBUYW5nZW50U3BhY2UgPyAnI2RlZmluZSBVU0VfTk9STUFMTUFQX1RBTkdFTlRTUEFDRScgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy5kaXNwbGFjZW1lbnRNYXAgPyAnI2RlZmluZSBVU0VfRElTUExBQ0VNRU5UTUFQJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLmVtaXNzaXZlTWFwID8gJyNkZWZpbmUgVVNFX0VNSVNTSVZFTUFQJyA6ICcnLFxyXG5cclxuXHRcdFx0cGFyYW1ldGVycy5hbmlzb3Ryb3B5ID8gJyNkZWZpbmUgVVNFX0FOSVNPVFJPUFknIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMuYW5pc290cm9weU1hcCA/ICcjZGVmaW5lIFVTRV9BTklTT1RST1BZTUFQJyA6ICcnLFxyXG5cclxuXHRcdFx0cGFyYW1ldGVycy5jbGVhcmNvYXRNYXAgPyAnI2RlZmluZSBVU0VfQ0xFQVJDT0FUTUFQJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLmNsZWFyY29hdFJvdWdobmVzc01hcCA/ICcjZGVmaW5lIFVTRV9DTEVBUkNPQVRfUk9VR0hORVNTTUFQJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLmNsZWFyY29hdE5vcm1hbE1hcCA/ICcjZGVmaW5lIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQJyA6ICcnLFxyXG5cclxuXHRcdFx0cGFyYW1ldGVycy5pcmlkZXNjZW5jZU1hcCA/ICcjZGVmaW5lIFVTRV9JUklERVNDRU5DRU1BUCcgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcCA/ICcjZGVmaW5lIFVTRV9JUklERVNDRU5DRV9USElDS05FU1NNQVAnIDogJycsXHJcblxyXG5cdFx0XHRwYXJhbWV0ZXJzLnNwZWN1bGFyTWFwID8gJyNkZWZpbmUgVVNFX1NQRUNVTEFSTUFQJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLnNwZWN1bGFyQ29sb3JNYXAgPyAnI2RlZmluZSBVU0VfU1BFQ1VMQVJfQ09MT1JNQVAnIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMuc3BlY3VsYXJJbnRlbnNpdHlNYXAgPyAnI2RlZmluZSBVU0VfU1BFQ1VMQVJfSU5URU5TSVRZTUFQJyA6ICcnLFxyXG5cclxuXHRcdFx0cGFyYW1ldGVycy5yb3VnaG5lc3NNYXAgPyAnI2RlZmluZSBVU0VfUk9VR0hORVNTTUFQJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLm1ldGFsbmVzc01hcCA/ICcjZGVmaW5lIFVTRV9NRVRBTE5FU1NNQVAnIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMuYWxwaGFNYXAgPyAnI2RlZmluZSBVU0VfQUxQSEFNQVAnIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMuYWxwaGFIYXNoID8gJyNkZWZpbmUgVVNFX0FMUEhBSEFTSCcgOiAnJyxcclxuXHJcblx0XHRcdHBhcmFtZXRlcnMudHJhbnNtaXNzaW9uID8gJyNkZWZpbmUgVVNFX1RSQU5TTUlTU0lPTicgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy50cmFuc21pc3Npb25NYXAgPyAnI2RlZmluZSBVU0VfVFJBTlNNSVNTSU9OTUFQJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLnRoaWNrbmVzc01hcCA/ICcjZGVmaW5lIFVTRV9USElDS05FU1NNQVAnIDogJycsXHJcblxyXG5cdFx0XHRwYXJhbWV0ZXJzLnNoZWVuQ29sb3JNYXAgPyAnI2RlZmluZSBVU0VfU0hFRU5fQ09MT1JNQVAnIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMuc2hlZW5Sb3VnaG5lc3NNYXAgPyAnI2RlZmluZSBVU0VfU0hFRU5fUk9VR0hORVNTTUFQJyA6ICcnLFxyXG5cclxuXHRcdFx0Ly9cclxuXHJcblx0XHRcdHBhcmFtZXRlcnMubWFwVXYgPyAnI2RlZmluZSBNQVBfVVYgJyArIHBhcmFtZXRlcnMubWFwVXYgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy5hbHBoYU1hcFV2ID8gJyNkZWZpbmUgQUxQSEFNQVBfVVYgJyArIHBhcmFtZXRlcnMuYWxwaGFNYXBVdiA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLmxpZ2h0TWFwVXYgPyAnI2RlZmluZSBMSUdIVE1BUF9VViAnICsgcGFyYW1ldGVycy5saWdodE1hcFV2IDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMuYW9NYXBVdiA/ICcjZGVmaW5lIEFPTUFQX1VWICcgKyBwYXJhbWV0ZXJzLmFvTWFwVXYgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy5lbWlzc2l2ZU1hcFV2ID8gJyNkZWZpbmUgRU1JU1NJVkVNQVBfVVYgJyArIHBhcmFtZXRlcnMuZW1pc3NpdmVNYXBVdiA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLmJ1bXBNYXBVdiA/ICcjZGVmaW5lIEJVTVBNQVBfVVYgJyArIHBhcmFtZXRlcnMuYnVtcE1hcFV2IDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMubm9ybWFsTWFwVXYgPyAnI2RlZmluZSBOT1JNQUxNQVBfVVYgJyArIHBhcmFtZXRlcnMubm9ybWFsTWFwVXYgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy5kaXNwbGFjZW1lbnRNYXBVdiA/ICcjZGVmaW5lIERJU1BMQUNFTUVOVE1BUF9VViAnICsgcGFyYW1ldGVycy5kaXNwbGFjZW1lbnRNYXBVdiA6ICcnLFxyXG5cclxuXHRcdFx0cGFyYW1ldGVycy5tZXRhbG5lc3NNYXBVdiA/ICcjZGVmaW5lIE1FVEFMTkVTU01BUF9VViAnICsgcGFyYW1ldGVycy5tZXRhbG5lc3NNYXBVdiA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLnJvdWdobmVzc01hcFV2ID8gJyNkZWZpbmUgUk9VR0hORVNTTUFQX1VWICcgKyBwYXJhbWV0ZXJzLnJvdWdobmVzc01hcFV2IDogJycsXHJcblxyXG5cdFx0XHRwYXJhbWV0ZXJzLmFuaXNvdHJvcHlNYXBVdiA/ICcjZGVmaW5lIEFOSVNPVFJPUFlNQVBfVVYgJyArIHBhcmFtZXRlcnMuYW5pc290cm9weU1hcFV2IDogJycsXHJcblxyXG5cdFx0XHRwYXJhbWV0ZXJzLmNsZWFyY29hdE1hcFV2ID8gJyNkZWZpbmUgQ0xFQVJDT0FUTUFQX1VWICcgKyBwYXJhbWV0ZXJzLmNsZWFyY29hdE1hcFV2IDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMuY2xlYXJjb2F0Tm9ybWFsTWFwVXYgPyAnI2RlZmluZSBDTEVBUkNPQVRfTk9STUFMTUFQX1VWICcgKyBwYXJhbWV0ZXJzLmNsZWFyY29hdE5vcm1hbE1hcFV2IDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMuY2xlYXJjb2F0Um91Z2huZXNzTWFwVXYgPyAnI2RlZmluZSBDTEVBUkNPQVRfUk9VR0hORVNTTUFQX1VWICcgKyBwYXJhbWV0ZXJzLmNsZWFyY29hdFJvdWdobmVzc01hcFV2IDogJycsXHJcblxyXG5cdFx0XHRwYXJhbWV0ZXJzLmlyaWRlc2NlbmNlTWFwVXYgPyAnI2RlZmluZSBJUklERVNDRU5DRU1BUF9VViAnICsgcGFyYW1ldGVycy5pcmlkZXNjZW5jZU1hcFV2IDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMuaXJpZGVzY2VuY2VUaGlja25lc3NNYXBVdiA/ICcjZGVmaW5lIElSSURFU0NFTkNFX1RISUNLTkVTU01BUF9VViAnICsgcGFyYW1ldGVycy5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcFV2IDogJycsXHJcblxyXG5cdFx0XHRwYXJhbWV0ZXJzLnNoZWVuQ29sb3JNYXBVdiA/ICcjZGVmaW5lIFNIRUVOX0NPTE9STUFQX1VWICcgKyBwYXJhbWV0ZXJzLnNoZWVuQ29sb3JNYXBVdiA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLnNoZWVuUm91Z2huZXNzTWFwVXYgPyAnI2RlZmluZSBTSEVFTl9ST1VHSE5FU1NNQVBfVVYgJyArIHBhcmFtZXRlcnMuc2hlZW5Sb3VnaG5lc3NNYXBVdiA6ICcnLFxyXG5cclxuXHRcdFx0cGFyYW1ldGVycy5zcGVjdWxhck1hcFV2ID8gJyNkZWZpbmUgU1BFQ1VMQVJNQVBfVVYgJyArIHBhcmFtZXRlcnMuc3BlY3VsYXJNYXBVdiA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLnNwZWN1bGFyQ29sb3JNYXBVdiA/ICcjZGVmaW5lIFNQRUNVTEFSX0NPTE9STUFQX1VWICcgKyBwYXJhbWV0ZXJzLnNwZWN1bGFyQ29sb3JNYXBVdiA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLnNwZWN1bGFySW50ZW5zaXR5TWFwVXYgPyAnI2RlZmluZSBTUEVDVUxBUl9JTlRFTlNJVFlNQVBfVVYgJyArIHBhcmFtZXRlcnMuc3BlY3VsYXJJbnRlbnNpdHlNYXBVdiA6ICcnLFxyXG5cclxuXHRcdFx0cGFyYW1ldGVycy50cmFuc21pc3Npb25NYXBVdiA/ICcjZGVmaW5lIFRSQU5TTUlTU0lPTk1BUF9VViAnICsgcGFyYW1ldGVycy50cmFuc21pc3Npb25NYXBVdiA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLnRoaWNrbmVzc01hcFV2ID8gJyNkZWZpbmUgVEhJQ0tORVNTTUFQX1VWICcgKyBwYXJhbWV0ZXJzLnRoaWNrbmVzc01hcFV2IDogJycsXHJcblxyXG5cdFx0XHQvL1xyXG5cclxuXHRcdFx0cGFyYW1ldGVycy52ZXJ0ZXhUYW5nZW50cyAmJiBwYXJhbWV0ZXJzLmZsYXRTaGFkaW5nID09PSBmYWxzZSA/ICcjZGVmaW5lIFVTRV9UQU5HRU5UJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLnZlcnRleENvbG9ycyA/ICcjZGVmaW5lIFVTRV9DT0xPUicgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy52ZXJ0ZXhBbHBoYXMgPyAnI2RlZmluZSBVU0VfQ09MT1JfQUxQSEEnIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMudmVydGV4VXYxcyA/ICcjZGVmaW5lIFVTRV9VVjEnIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMudmVydGV4VXYycyA/ICcjZGVmaW5lIFVTRV9VVjInIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMudmVydGV4VXYzcyA/ICcjZGVmaW5lIFVTRV9VVjMnIDogJycsXHJcblxyXG5cdFx0XHRwYXJhbWV0ZXJzLnBvaW50c1V2cyA/ICcjZGVmaW5lIFVTRV9QT0lOVFNfVVYnIDogJycsXHJcblxyXG5cdFx0XHRwYXJhbWV0ZXJzLmZsYXRTaGFkaW5nID8gJyNkZWZpbmUgRkxBVF9TSEFERUQnIDogJycsXHJcblxyXG5cdFx0XHRwYXJhbWV0ZXJzLnNraW5uaW5nID8gJyNkZWZpbmUgVVNFX1NLSU5OSU5HJyA6ICcnLFxyXG5cclxuXHRcdFx0cGFyYW1ldGVycy5tb3JwaFRhcmdldHMgPyAnI2RlZmluZSBVU0VfTU9SUEhUQVJHRVRTJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLm1vcnBoTm9ybWFscyAmJiBwYXJhbWV0ZXJzLmZsYXRTaGFkaW5nID09PSBmYWxzZSA/ICcjZGVmaW5lIFVTRV9NT1JQSE5PUk1BTFMnIDogJycsXHJcblx0XHRcdCggcGFyYW1ldGVycy5tb3JwaENvbG9ycyApID8gJyNkZWZpbmUgVVNFX01PUlBIQ09MT1JTJyA6ICcnLFxyXG5cdFx0XHQoIHBhcmFtZXRlcnMubW9ycGhUYXJnZXRzQ291bnQgPiAwICkgPyAnI2RlZmluZSBNT1JQSFRBUkdFVFNfVEVYVFVSRV9TVFJJREUgJyArIHBhcmFtZXRlcnMubW9ycGhUZXh0dXJlU3RyaWRlIDogJycsXHJcblx0XHRcdCggcGFyYW1ldGVycy5tb3JwaFRhcmdldHNDb3VudCA+IDAgKSA/ICcjZGVmaW5lIE1PUlBIVEFSR0VUU19DT1VOVCAnICsgcGFyYW1ldGVycy5tb3JwaFRhcmdldHNDb3VudCA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLmRvdWJsZVNpZGVkID8gJyNkZWZpbmUgRE9VQkxFX1NJREVEJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLmZsaXBTaWRlZCA/ICcjZGVmaW5lIEZMSVBfU0lERUQnIDogJycsXHJcblxyXG5cdFx0XHRwYXJhbWV0ZXJzLnNoYWRvd01hcEVuYWJsZWQgPyAnI2RlZmluZSBVU0VfU0hBRE9XTUFQJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLnNoYWRvd01hcEVuYWJsZWQgPyAnI2RlZmluZSAnICsgc2hhZG93TWFwVHlwZURlZmluZSA6ICcnLFxyXG5cclxuXHRcdFx0cGFyYW1ldGVycy5zaXplQXR0ZW51YXRpb24gPyAnI2RlZmluZSBVU0VfU0laRUFUVEVOVUFUSU9OJyA6ICcnLFxyXG5cclxuXHRcdFx0cGFyYW1ldGVycy5udW1MaWdodFByb2JlcyA+IDAgPyAnI2RlZmluZSBVU0VfTElHSFRfUFJPQkVTJyA6ICcnLFxyXG5cclxuXHRcdFx0cGFyYW1ldGVycy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyID8gJyNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLnJldmVyc2VEZXB0aEJ1ZmZlciA/ICcjZGVmaW5lIFVTRV9SRVZFUlNFREVQVEhCVUYnIDogJycsXHJcblxyXG5cdFx0XHQndW5pZm9ybSBtYXQ0IG1vZGVsTWF0cml4OycsXHJcblx0XHRcdCd1bmlmb3JtIG1hdDQgbW9kZWxWaWV3TWF0cml4OycsXHJcblx0XHRcdCd1bmlmb3JtIG1hdDQgcHJvamVjdGlvbk1hdHJpeDsnLFxyXG5cdFx0XHQndW5pZm9ybSBtYXQ0IHZpZXdNYXRyaXg7JyxcclxuXHRcdFx0J3VuaWZvcm0gbWF0MyBub3JtYWxNYXRyaXg7JyxcclxuXHRcdFx0J3VuaWZvcm0gdmVjMyBjYW1lcmFQb3NpdGlvbjsnLFxyXG5cdFx0XHQndW5pZm9ybSBib29sIGlzT3J0aG9ncmFwaGljOycsXHJcblxyXG5cdFx0XHQnI2lmZGVmIFVTRV9JTlNUQU5DSU5HJyxcclxuXHJcblx0XHRcdCdcdGF0dHJpYnV0ZSBtYXQ0IGluc3RhbmNlTWF0cml4OycsXHJcblxyXG5cdFx0XHQnI2VuZGlmJyxcclxuXHJcblx0XHRcdCcjaWZkZWYgVVNFX0lOU1RBTkNJTkdfQ09MT1InLFxyXG5cclxuXHRcdFx0J1x0YXR0cmlidXRlIHZlYzMgaW5zdGFuY2VDb2xvcjsnLFxyXG5cclxuXHRcdFx0JyNlbmRpZicsXHJcblxyXG5cdFx0XHQnI2lmZGVmIFVTRV9JTlNUQU5DSU5HX01PUlBIJyxcclxuXHJcblx0XHRcdCdcdHVuaWZvcm0gc2FtcGxlcjJEIG1vcnBoVGV4dHVyZTsnLFxyXG5cclxuXHRcdFx0JyNlbmRpZicsXHJcblxyXG5cdFx0XHQnYXR0cmlidXRlIHZlYzMgcG9zaXRpb247JyxcclxuXHRcdFx0J2F0dHJpYnV0ZSB2ZWMzIG5vcm1hbDsnLFxyXG5cdFx0XHQnYXR0cmlidXRlIHZlYzIgdXY7JyxcclxuXHJcblx0XHRcdCcjaWZkZWYgVVNFX1VWMScsXHJcblxyXG5cdFx0XHQnXHRhdHRyaWJ1dGUgdmVjMiB1djE7JyxcclxuXHJcblx0XHRcdCcjZW5kaWYnLFxyXG5cclxuXHRcdFx0JyNpZmRlZiBVU0VfVVYyJyxcclxuXHJcblx0XHRcdCdcdGF0dHJpYnV0ZSB2ZWMyIHV2MjsnLFxyXG5cclxuXHRcdFx0JyNlbmRpZicsXHJcblxyXG5cdFx0XHQnI2lmZGVmIFVTRV9VVjMnLFxyXG5cclxuXHRcdFx0J1x0YXR0cmlidXRlIHZlYzIgdXYzOycsXHJcblxyXG5cdFx0XHQnI2VuZGlmJyxcclxuXHJcblx0XHRcdCcjaWZkZWYgVVNFX1RBTkdFTlQnLFxyXG5cclxuXHRcdFx0J1x0YXR0cmlidXRlIHZlYzQgdGFuZ2VudDsnLFxyXG5cclxuXHRcdFx0JyNlbmRpZicsXHJcblxyXG5cdFx0XHQnI2lmIGRlZmluZWQoIFVTRV9DT0xPUl9BTFBIQSApJyxcclxuXHJcblx0XHRcdCdcdGF0dHJpYnV0ZSB2ZWM0IGNvbG9yOycsXHJcblxyXG5cdFx0XHQnI2VsaWYgZGVmaW5lZCggVVNFX0NPTE9SICknLFxyXG5cclxuXHRcdFx0J1x0YXR0cmlidXRlIHZlYzMgY29sb3I7JyxcclxuXHJcblx0XHRcdCcjZW5kaWYnLFxyXG5cclxuXHRcdFx0JyNpZmRlZiBVU0VfU0tJTk5JTkcnLFxyXG5cclxuXHRcdFx0J1x0YXR0cmlidXRlIHZlYzQgc2tpbkluZGV4OycsXHJcblx0XHRcdCdcdGF0dHJpYnV0ZSB2ZWM0IHNraW5XZWlnaHQ7JyxcclxuXHJcblx0XHRcdCcjZW5kaWYnLFxyXG5cclxuXHRcdFx0J1xcbidcclxuXHJcblx0XHRdLmZpbHRlciggZmlsdGVyRW1wdHlMaW5lICkuam9pbiggJ1xcbicgKTtcclxuXHJcblx0XHRwcmVmaXhGcmFnbWVudCA9IFtcclxuXHJcblx0XHRcdGdlbmVyYXRlUHJlY2lzaW9uKCBwYXJhbWV0ZXJzICksXHJcblxyXG5cdFx0XHQnI2RlZmluZSBTSEFERVJfVFlQRSAnICsgcGFyYW1ldGVycy5zaGFkZXJUeXBlLFxyXG5cdFx0XHQnI2RlZmluZSBTSEFERVJfTkFNRSAnICsgcGFyYW1ldGVycy5zaGFkZXJOYW1lLFxyXG5cclxuXHRcdFx0Y3VzdG9tRGVmaW5lcyxcclxuXHJcblx0XHRcdHBhcmFtZXRlcnMudXNlRm9nICYmIHBhcmFtZXRlcnMuZm9nID8gJyNkZWZpbmUgVVNFX0ZPRycgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy51c2VGb2cgJiYgcGFyYW1ldGVycy5mb2dFeHAyID8gJyNkZWZpbmUgRk9HX0VYUDInIDogJycsXHJcblxyXG5cdFx0XHRwYXJhbWV0ZXJzLmFscGhhVG9Db3ZlcmFnZSA/ICcjZGVmaW5lIEFMUEhBX1RPX0NPVkVSQUdFJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLm1hcCA/ICcjZGVmaW5lIFVTRV9NQVAnIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMubWF0Y2FwID8gJyNkZWZpbmUgVVNFX01BVENBUCcgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy5lbnZNYXAgPyAnI2RlZmluZSBVU0VfRU5WTUFQJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLmVudk1hcCA/ICcjZGVmaW5lICcgKyBlbnZNYXBUeXBlRGVmaW5lIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMuZW52TWFwID8gJyNkZWZpbmUgJyArIGVudk1hcE1vZGVEZWZpbmUgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy5lbnZNYXAgPyAnI2RlZmluZSAnICsgZW52TWFwQmxlbmRpbmdEZWZpbmUgOiAnJyxcclxuXHRcdFx0ZW52TWFwQ3ViZVVWU2l6ZSA/ICcjZGVmaW5lIENVQkVVVl9URVhFTF9XSURUSCAnICsgZW52TWFwQ3ViZVVWU2l6ZS50ZXhlbFdpZHRoIDogJycsXHJcblx0XHRcdGVudk1hcEN1YmVVVlNpemUgPyAnI2RlZmluZSBDVUJFVVZfVEVYRUxfSEVJR0hUICcgKyBlbnZNYXBDdWJlVVZTaXplLnRleGVsSGVpZ2h0IDogJycsXHJcblx0XHRcdGVudk1hcEN1YmVVVlNpemUgPyAnI2RlZmluZSBDVUJFVVZfTUFYX01JUCAnICsgZW52TWFwQ3ViZVVWU2l6ZS5tYXhNaXAgKyAnLjAnIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMubGlnaHRNYXAgPyAnI2RlZmluZSBVU0VfTElHSFRNQVAnIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMuYW9NYXAgPyAnI2RlZmluZSBVU0VfQU9NQVAnIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMuYnVtcE1hcCA/ICcjZGVmaW5lIFVTRV9CVU1QTUFQJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLm5vcm1hbE1hcCA/ICcjZGVmaW5lIFVTRV9OT1JNQUxNQVAnIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMubm9ybWFsTWFwT2JqZWN0U3BhY2UgPyAnI2RlZmluZSBVU0VfTk9STUFMTUFQX09CSkVDVFNQQUNFJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLm5vcm1hbE1hcFRhbmdlbnRTcGFjZSA/ICcjZGVmaW5lIFVTRV9OT1JNQUxNQVBfVEFOR0VOVFNQQUNFJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLmVtaXNzaXZlTWFwID8gJyNkZWZpbmUgVVNFX0VNSVNTSVZFTUFQJyA6ICcnLFxyXG5cclxuXHRcdFx0cGFyYW1ldGVycy5hbmlzb3Ryb3B5ID8gJyNkZWZpbmUgVVNFX0FOSVNPVFJPUFknIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMuYW5pc290cm9weU1hcCA/ICcjZGVmaW5lIFVTRV9BTklTT1RST1BZTUFQJyA6ICcnLFxyXG5cclxuXHRcdFx0cGFyYW1ldGVycy5jbGVhcmNvYXQgPyAnI2RlZmluZSBVU0VfQ0xFQVJDT0FUJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLmNsZWFyY29hdE1hcCA/ICcjZGVmaW5lIFVTRV9DTEVBUkNPQVRNQVAnIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMuY2xlYXJjb2F0Um91Z2huZXNzTWFwID8gJyNkZWZpbmUgVVNFX0NMRUFSQ09BVF9ST1VHSE5FU1NNQVAnIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMuY2xlYXJjb2F0Tm9ybWFsTWFwID8gJyNkZWZpbmUgVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVAnIDogJycsXHJcblxyXG5cdFx0XHRwYXJhbWV0ZXJzLmRpc3BlcnNpb24gPyAnI2RlZmluZSBVU0VfRElTUEVSU0lPTicgOiAnJyxcclxuXHJcblx0XHRcdHBhcmFtZXRlcnMuaXJpZGVzY2VuY2UgPyAnI2RlZmluZSBVU0VfSVJJREVTQ0VOQ0UnIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMuaXJpZGVzY2VuY2VNYXAgPyAnI2RlZmluZSBVU0VfSVJJREVTQ0VOQ0VNQVAnIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAgPyAnI2RlZmluZSBVU0VfSVJJREVTQ0VOQ0VfVEhJQ0tORVNTTUFQJyA6ICcnLFxyXG5cclxuXHRcdFx0cGFyYW1ldGVycy5zcGVjdWxhck1hcCA/ICcjZGVmaW5lIFVTRV9TUEVDVUxBUk1BUCcgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy5zcGVjdWxhckNvbG9yTWFwID8gJyNkZWZpbmUgVVNFX1NQRUNVTEFSX0NPTE9STUFQJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLnNwZWN1bGFySW50ZW5zaXR5TWFwID8gJyNkZWZpbmUgVVNFX1NQRUNVTEFSX0lOVEVOU0lUWU1BUCcgOiAnJyxcclxuXHJcblx0XHRcdHBhcmFtZXRlcnMucm91Z2huZXNzTWFwID8gJyNkZWZpbmUgVVNFX1JPVUdITkVTU01BUCcgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy5tZXRhbG5lc3NNYXAgPyAnI2RlZmluZSBVU0VfTUVUQUxORVNTTUFQJyA6ICcnLFxyXG5cclxuXHRcdFx0cGFyYW1ldGVycy5hbHBoYU1hcCA/ICcjZGVmaW5lIFVTRV9BTFBIQU1BUCcgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy5hbHBoYVRlc3QgPyAnI2RlZmluZSBVU0VfQUxQSEFURVNUJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLmFscGhhSGFzaCA/ICcjZGVmaW5lIFVTRV9BTFBIQUhBU0gnIDogJycsXHJcblxyXG5cdFx0XHRwYXJhbWV0ZXJzLnNoZWVuID8gJyNkZWZpbmUgVVNFX1NIRUVOJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLnNoZWVuQ29sb3JNYXAgPyAnI2RlZmluZSBVU0VfU0hFRU5fQ09MT1JNQVAnIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMuc2hlZW5Sb3VnaG5lc3NNYXAgPyAnI2RlZmluZSBVU0VfU0hFRU5fUk9VR0hORVNTTUFQJyA6ICcnLFxyXG5cclxuXHRcdFx0cGFyYW1ldGVycy50cmFuc21pc3Npb24gPyAnI2RlZmluZSBVU0VfVFJBTlNNSVNTSU9OJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLnRyYW5zbWlzc2lvbk1hcCA/ICcjZGVmaW5lIFVTRV9UUkFOU01JU1NJT05NQVAnIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMudGhpY2tuZXNzTWFwID8gJyNkZWZpbmUgVVNFX1RISUNLTkVTU01BUCcgOiAnJyxcclxuXHJcblx0XHRcdHBhcmFtZXRlcnMudmVydGV4VGFuZ2VudHMgJiYgcGFyYW1ldGVycy5mbGF0U2hhZGluZyA9PT0gZmFsc2UgPyAnI2RlZmluZSBVU0VfVEFOR0VOVCcgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy52ZXJ0ZXhDb2xvcnMgfHwgcGFyYW1ldGVycy5pbnN0YW5jaW5nQ29sb3IgfHwgcGFyYW1ldGVycy5iYXRjaGluZ0NvbG9yID8gJyNkZWZpbmUgVVNFX0NPTE9SJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLnZlcnRleEFscGhhcyA/ICcjZGVmaW5lIFVTRV9DT0xPUl9BTFBIQScgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy52ZXJ0ZXhVdjFzID8gJyNkZWZpbmUgVVNFX1VWMScgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy52ZXJ0ZXhVdjJzID8gJyNkZWZpbmUgVVNFX1VWMicgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy52ZXJ0ZXhVdjNzID8gJyNkZWZpbmUgVVNFX1VWMycgOiAnJyxcclxuXHJcblx0XHRcdHBhcmFtZXRlcnMucG9pbnRzVXZzID8gJyNkZWZpbmUgVVNFX1BPSU5UU19VVicgOiAnJyxcclxuXHJcblx0XHRcdHBhcmFtZXRlcnMuZ3JhZGllbnRNYXAgPyAnI2RlZmluZSBVU0VfR1JBRElFTlRNQVAnIDogJycsXHJcblxyXG5cdFx0XHRwYXJhbWV0ZXJzLmZsYXRTaGFkaW5nID8gJyNkZWZpbmUgRkxBVF9TSEFERUQnIDogJycsXHJcblxyXG5cdFx0XHRwYXJhbWV0ZXJzLmRvdWJsZVNpZGVkID8gJyNkZWZpbmUgRE9VQkxFX1NJREVEJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLmZsaXBTaWRlZCA/ICcjZGVmaW5lIEZMSVBfU0lERUQnIDogJycsXHJcblxyXG5cdFx0XHRwYXJhbWV0ZXJzLnNoYWRvd01hcEVuYWJsZWQgPyAnI2RlZmluZSBVU0VfU0hBRE9XTUFQJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLnNoYWRvd01hcEVuYWJsZWQgPyAnI2RlZmluZSAnICsgc2hhZG93TWFwVHlwZURlZmluZSA6ICcnLFxyXG5cclxuXHRcdFx0cGFyYW1ldGVycy5wcmVtdWx0aXBsaWVkQWxwaGEgPyAnI2RlZmluZSBQUkVNVUxUSVBMSUVEX0FMUEhBJyA6ICcnLFxyXG5cclxuXHRcdFx0cGFyYW1ldGVycy5udW1MaWdodFByb2JlcyA+IDAgPyAnI2RlZmluZSBVU0VfTElHSFRfUFJPQkVTJyA6ICcnLFxyXG5cclxuXHRcdFx0cGFyYW1ldGVycy5kZWNvZGVWaWRlb1RleHR1cmUgPyAnI2RlZmluZSBERUNPREVfVklERU9fVEVYVFVSRScgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy5kZWNvZGVWaWRlb1RleHR1cmVFbWlzc2l2ZSA/ICcjZGVmaW5lIERFQ09ERV9WSURFT19URVhUVVJFX0VNSVNTSVZFJyA6ICcnLFxyXG5cclxuXHRcdFx0cGFyYW1ldGVycy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyID8gJyNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLnJldmVyc2VEZXB0aEJ1ZmZlciA/ICcjZGVmaW5lIFVTRV9SRVZFUlNFREVQVEhCVUYnIDogJycsXHJcblxyXG5cdFx0XHQndW5pZm9ybSBtYXQ0IHZpZXdNYXRyaXg7JyxcclxuXHRcdFx0J3VuaWZvcm0gdmVjMyBjYW1lcmFQb3NpdGlvbjsnLFxyXG5cdFx0XHQndW5pZm9ybSBib29sIGlzT3J0aG9ncmFwaGljOycsXHJcblxyXG5cdFx0XHQoIHBhcmFtZXRlcnMudG9uZU1hcHBpbmcgIT09IE5vVG9uZU1hcHBpbmcgKSA/ICcjZGVmaW5lIFRPTkVfTUFQUElORycgOiAnJyxcclxuXHRcdFx0KCBwYXJhbWV0ZXJzLnRvbmVNYXBwaW5nICE9PSBOb1RvbmVNYXBwaW5nICkgPyBTaGFkZXJDaHVua1sgJ3RvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQnIF0gOiAnJywgLy8gdGhpcyBjb2RlIGlzIHJlcXVpcmVkIGhlcmUgYmVjYXVzZSBpdCBpcyB1c2VkIGJ5IHRoZSB0b25lTWFwcGluZygpIGZ1bmN0aW9uIGRlZmluZWQgYmVsb3dcclxuXHRcdFx0KCBwYXJhbWV0ZXJzLnRvbmVNYXBwaW5nICE9PSBOb1RvbmVNYXBwaW5nICkgPyBnZXRUb25lTWFwcGluZ0Z1bmN0aW9uKCAndG9uZU1hcHBpbmcnLCBwYXJhbWV0ZXJzLnRvbmVNYXBwaW5nICkgOiAnJyxcclxuXHJcblx0XHRcdHBhcmFtZXRlcnMuZGl0aGVyaW5nID8gJyNkZWZpbmUgRElUSEVSSU5HJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLm9wYXF1ZSA/ICcjZGVmaW5lIE9QQVFVRScgOiAnJyxcclxuXHJcblx0XHRcdFNoYWRlckNodW5rWyAnY29sb3JzcGFjZV9wYXJzX2ZyYWdtZW50JyBdLCAvLyB0aGlzIGNvZGUgaXMgcmVxdWlyZWQgaGVyZSBiZWNhdXNlIGl0IGlzIHVzZWQgYnkgdGhlIHZhcmlvdXMgZW5jb2RpbmcvZGVjb2RpbmcgZnVuY3Rpb24gZGVmaW5lZCBiZWxvd1xyXG5cdFx0XHRnZXRUZXhlbEVuY29kaW5nRnVuY3Rpb24oICdsaW5lYXJUb091dHB1dFRleGVsJywgcGFyYW1ldGVycy5vdXRwdXRDb2xvclNwYWNlICksXHJcblx0XHRcdGdldEx1bWluYW5jZUZ1bmN0aW9uKCksXHJcblxyXG5cdFx0XHRwYXJhbWV0ZXJzLnVzZURlcHRoUGFja2luZyA/ICcjZGVmaW5lIERFUFRIX1BBQ0tJTkcgJyArIHBhcmFtZXRlcnMuZGVwdGhQYWNraW5nIDogJycsXHJcblxyXG5cdFx0XHQnXFxuJ1xyXG5cclxuXHRcdF0uZmlsdGVyKCBmaWx0ZXJFbXB0eUxpbmUgKS5qb2luKCAnXFxuJyApO1xyXG5cclxuXHR9XHJcblxyXG5cdHZlcnRleFNoYWRlciA9IHJlc29sdmVJbmNsdWRlcyggdmVydGV4U2hhZGVyICk7XHJcblx0dmVydGV4U2hhZGVyID0gcmVwbGFjZUxpZ2h0TnVtcyggdmVydGV4U2hhZGVyLCBwYXJhbWV0ZXJzICk7XHJcblx0dmVydGV4U2hhZGVyID0gcmVwbGFjZUNsaXBwaW5nUGxhbmVOdW1zKCB2ZXJ0ZXhTaGFkZXIsIHBhcmFtZXRlcnMgKTtcclxuXHJcblx0ZnJhZ21lbnRTaGFkZXIgPSByZXNvbHZlSW5jbHVkZXMoIGZyYWdtZW50U2hhZGVyICk7XHJcblx0ZnJhZ21lbnRTaGFkZXIgPSByZXBsYWNlTGlnaHROdW1zKCBmcmFnbWVudFNoYWRlciwgcGFyYW1ldGVycyApO1xyXG5cdGZyYWdtZW50U2hhZGVyID0gcmVwbGFjZUNsaXBwaW5nUGxhbmVOdW1zKCBmcmFnbWVudFNoYWRlciwgcGFyYW1ldGVycyApO1xyXG5cclxuXHR2ZXJ0ZXhTaGFkZXIgPSB1bnJvbGxMb29wcyggdmVydGV4U2hhZGVyICk7XHJcblx0ZnJhZ21lbnRTaGFkZXIgPSB1bnJvbGxMb29wcyggZnJhZ21lbnRTaGFkZXIgKTtcclxuXHJcblx0aWYgKCBwYXJhbWV0ZXJzLmlzUmF3U2hhZGVyTWF0ZXJpYWwgIT09IHRydWUgKSB7XHJcblxyXG5cdFx0Ly8gR0xTTCAzLjAgY29udmVyc2lvbiBmb3IgYnVpbHQtaW4gbWF0ZXJpYWxzIGFuZCBTaGFkZXJNYXRlcmlhbFxyXG5cclxuXHRcdHZlcnNpb25TdHJpbmcgPSAnI3ZlcnNpb24gMzAwIGVzXFxuJztcclxuXHJcblx0XHRwcmVmaXhWZXJ0ZXggPSBbXHJcblx0XHRcdGN1c3RvbVZlcnRleEV4dGVuc2lvbnMsXHJcblx0XHRcdCcjZGVmaW5lIGF0dHJpYnV0ZSBpbicsXHJcblx0XHRcdCcjZGVmaW5lIHZhcnlpbmcgb3V0JyxcclxuXHRcdFx0JyNkZWZpbmUgdGV4dHVyZTJEIHRleHR1cmUnXHJcblx0XHRdLmpvaW4oICdcXG4nICkgKyAnXFxuJyArIHByZWZpeFZlcnRleDtcclxuXHJcblx0XHRwcmVmaXhGcmFnbWVudCA9IFtcclxuXHRcdFx0JyNkZWZpbmUgdmFyeWluZyBpbicsXHJcblx0XHRcdCggcGFyYW1ldGVycy5nbHNsVmVyc2lvbiA9PT0gR0xTTDMgKSA/ICcnIDogJ2xheW91dChsb2NhdGlvbiA9IDApIG91dCBoaWdocCB2ZWM0IHBjX2ZyYWdDb2xvcjsnLFxyXG5cdFx0XHQoIHBhcmFtZXRlcnMuZ2xzbFZlcnNpb24gPT09IEdMU0wzICkgPyAnJyA6ICcjZGVmaW5lIGdsX0ZyYWdDb2xvciBwY19mcmFnQ29sb3InLFxyXG5cdFx0XHQnI2RlZmluZSBnbF9GcmFnRGVwdGhFWFQgZ2xfRnJhZ0RlcHRoJyxcclxuXHRcdFx0JyNkZWZpbmUgdGV4dHVyZTJEIHRleHR1cmUnLFxyXG5cdFx0XHQnI2RlZmluZSB0ZXh0dXJlQ3ViZSB0ZXh0dXJlJyxcclxuXHRcdFx0JyNkZWZpbmUgdGV4dHVyZTJEUHJvaiB0ZXh0dXJlUHJvaicsXHJcblx0XHRcdCcjZGVmaW5lIHRleHR1cmUyRExvZEVYVCB0ZXh0dXJlTG9kJyxcclxuXHRcdFx0JyNkZWZpbmUgdGV4dHVyZTJEUHJvakxvZEVYVCB0ZXh0dXJlUHJvakxvZCcsXHJcblx0XHRcdCcjZGVmaW5lIHRleHR1cmVDdWJlTG9kRVhUIHRleHR1cmVMb2QnLFxyXG5cdFx0XHQnI2RlZmluZSB0ZXh0dXJlMkRHcmFkRVhUIHRleHR1cmVHcmFkJyxcclxuXHRcdFx0JyNkZWZpbmUgdGV4dHVyZTJEUHJvakdyYWRFWFQgdGV4dHVyZVByb2pHcmFkJyxcclxuXHRcdFx0JyNkZWZpbmUgdGV4dHVyZUN1YmVHcmFkRVhUIHRleHR1cmVHcmFkJ1xyXG5cdFx0XS5qb2luKCAnXFxuJyApICsgJ1xcbicgKyBwcmVmaXhGcmFnbWVudDtcclxuXHJcblx0fVxyXG5cclxuXHRjb25zdCB2ZXJ0ZXhHbHNsID0gdmVyc2lvblN0cmluZyArIHByZWZpeFZlcnRleCArIHZlcnRleFNoYWRlcjtcclxuXHRjb25zdCBmcmFnbWVudEdsc2wgPSB2ZXJzaW9uU3RyaW5nICsgcHJlZml4RnJhZ21lbnQgKyBmcmFnbWVudFNoYWRlcjtcclxuXHJcblx0Ly8gY29uc29sZS5sb2coICcqVkVSVEVYKicsIHZlcnRleEdsc2wgKTtcclxuXHQvLyBjb25zb2xlLmxvZyggJypGUkFHTUVOVConLCBmcmFnbWVudEdsc2wgKTtcclxuXHJcblx0Y29uc3QgZ2xWZXJ0ZXhTaGFkZXIgPSBXZWJHTFNoYWRlciggZ2wsIGdsLlZFUlRFWF9TSEFERVIsIHZlcnRleEdsc2wgKTtcclxuXHRjb25zdCBnbEZyYWdtZW50U2hhZGVyID0gV2ViR0xTaGFkZXIoIGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIGZyYWdtZW50R2xzbCApO1xyXG5cclxuXHRnbC5hdHRhY2hTaGFkZXIoIHByb2dyYW0sIGdsVmVydGV4U2hhZGVyICk7XHJcblx0Z2wuYXR0YWNoU2hhZGVyKCBwcm9ncmFtLCBnbEZyYWdtZW50U2hhZGVyICk7XHJcblxyXG5cdC8vIEZvcmNlIGEgcGFydGljdWxhciBhdHRyaWJ1dGUgdG8gaW5kZXggMC5cclxuXHJcblx0aWYgKCBwYXJhbWV0ZXJzLmluZGV4MEF0dHJpYnV0ZU5hbWUgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRnbC5iaW5kQXR0cmliTG9jYXRpb24oIHByb2dyYW0sIDAsIHBhcmFtZXRlcnMuaW5kZXgwQXR0cmlidXRlTmFtZSApO1xyXG5cclxuXHR9IGVsc2UgaWYgKCBwYXJhbWV0ZXJzLm1vcnBoVGFyZ2V0cyA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHQvLyBwcm9ncmFtcyB3aXRoIG1vcnBoVGFyZ2V0cyBkaXNwbGFjZSBwb3NpdGlvbiBvdXQgb2YgYXR0cmlidXRlIDBcclxuXHRcdGdsLmJpbmRBdHRyaWJMb2NhdGlvbiggcHJvZ3JhbSwgMCwgJ3Bvc2l0aW9uJyApO1xyXG5cclxuXHR9XHJcblxyXG5cdGdsLmxpbmtQcm9ncmFtKCBwcm9ncmFtICk7XHJcblxyXG5cdGZ1bmN0aW9uIG9uRmlyc3RVc2UoIHNlbGYgKSB7XHJcblxyXG5cdFx0Ly8gY2hlY2sgZm9yIGxpbmsgZXJyb3JzXHJcblx0XHRpZiAoIHJlbmRlcmVyLmRlYnVnLmNoZWNrU2hhZGVyRXJyb3JzICkge1xyXG5cclxuXHRcdFx0Y29uc3QgcHJvZ3JhbUxvZyA9IGdsLmdldFByb2dyYW1JbmZvTG9nKCBwcm9ncmFtICkudHJpbSgpO1xyXG5cdFx0XHRjb25zdCB2ZXJ0ZXhMb2cgPSBnbC5nZXRTaGFkZXJJbmZvTG9nKCBnbFZlcnRleFNoYWRlciApLnRyaW0oKTtcclxuXHRcdFx0Y29uc3QgZnJhZ21lbnRMb2cgPSBnbC5nZXRTaGFkZXJJbmZvTG9nKCBnbEZyYWdtZW50U2hhZGVyICkudHJpbSgpO1xyXG5cclxuXHRcdFx0bGV0IHJ1bm5hYmxlID0gdHJ1ZTtcclxuXHRcdFx0bGV0IGhhdmVEaWFnbm9zdGljcyA9IHRydWU7XHJcblxyXG5cdFx0XHRpZiAoIGdsLmdldFByb2dyYW1QYXJhbWV0ZXIoIHByb2dyYW0sIGdsLkxJTktfU1RBVFVTICkgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0XHRydW5uYWJsZSA9IGZhbHNlO1xyXG5cclxuXHRcdFx0XHRpZiAoIHR5cGVvZiByZW5kZXJlci5kZWJ1Zy5vblNoYWRlckVycm9yID09PSAnZnVuY3Rpb24nICkge1xyXG5cclxuXHRcdFx0XHRcdHJlbmRlcmVyLmRlYnVnLm9uU2hhZGVyRXJyb3IoIGdsLCBwcm9ncmFtLCBnbFZlcnRleFNoYWRlciwgZ2xGcmFnbWVudFNoYWRlciApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdC8vIGRlZmF1bHQgZXJyb3IgcmVwb3J0aW5nXHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgdmVydGV4RXJyb3JzID0gZ2V0U2hhZGVyRXJyb3JzKCBnbCwgZ2xWZXJ0ZXhTaGFkZXIsICd2ZXJ0ZXgnICk7XHJcblx0XHRcdFx0XHRjb25zdCBmcmFnbWVudEVycm9ycyA9IGdldFNoYWRlckVycm9ycyggZ2wsIGdsRnJhZ21lbnRTaGFkZXIsICdmcmFnbWVudCcgKTtcclxuXHJcblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKFxyXG5cdFx0XHRcdFx0XHQnVEhSRUUuV2ViR0xQcm9ncmFtOiBTaGFkZXIgRXJyb3IgJyArIGdsLmdldEVycm9yKCkgKyAnIC0gJyArXHJcblx0XHRcdFx0XHRcdCdWQUxJREFURV9TVEFUVVMgJyArIGdsLmdldFByb2dyYW1QYXJhbWV0ZXIoIHByb2dyYW0sIGdsLlZBTElEQVRFX1NUQVRVUyApICsgJ1xcblxcbicgK1xyXG5cdFx0XHRcdFx0XHQnTWF0ZXJpYWwgTmFtZTogJyArIHNlbGYubmFtZSArICdcXG4nICtcclxuXHRcdFx0XHRcdFx0J01hdGVyaWFsIFR5cGU6ICcgKyBzZWxmLnR5cGUgKyAnXFxuXFxuJyArXHJcblx0XHRcdFx0XHRcdCdQcm9ncmFtIEluZm8gTG9nOiAnICsgcHJvZ3JhbUxvZyArICdcXG4nICtcclxuXHRcdFx0XHRcdFx0dmVydGV4RXJyb3JzICsgJ1xcbicgK1xyXG5cdFx0XHRcdFx0XHRmcmFnbWVudEVycm9yc1xyXG5cdFx0XHRcdFx0KTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggcHJvZ3JhbUxvZyAhPT0gJycgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUHJvZ3JhbTogUHJvZ3JhbSBJbmZvIExvZzonLCBwcm9ncmFtTG9nICk7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCB2ZXJ0ZXhMb2cgPT09ICcnIHx8IGZyYWdtZW50TG9nID09PSAnJyApIHtcclxuXHJcblx0XHRcdFx0aGF2ZURpYWdub3N0aWNzID0gZmFsc2U7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIGhhdmVEaWFnbm9zdGljcyApIHtcclxuXHJcblx0XHRcdFx0c2VsZi5kaWFnbm9zdGljcyA9IHtcclxuXHJcblx0XHRcdFx0XHRydW5uYWJsZTogcnVubmFibGUsXHJcblxyXG5cdFx0XHRcdFx0cHJvZ3JhbUxvZzogcHJvZ3JhbUxvZyxcclxuXHJcblx0XHRcdFx0XHR2ZXJ0ZXhTaGFkZXI6IHtcclxuXHJcblx0XHRcdFx0XHRcdGxvZzogdmVydGV4TG9nLFxyXG5cdFx0XHRcdFx0XHRwcmVmaXg6IHByZWZpeFZlcnRleFxyXG5cclxuXHRcdFx0XHRcdH0sXHJcblxyXG5cdFx0XHRcdFx0ZnJhZ21lbnRTaGFkZXI6IHtcclxuXHJcblx0XHRcdFx0XHRcdGxvZzogZnJhZ21lbnRMb2csXHJcblx0XHRcdFx0XHRcdHByZWZpeDogcHJlZml4RnJhZ21lbnRcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH07XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIENsZWFuIHVwXHJcblxyXG5cdFx0Ly8gQ3Jhc2hlcyBpbiBpT1M5IGFuZCBpT1MxMC4gIzE4NDAyXHJcblx0XHQvLyBnbC5kZXRhY2hTaGFkZXIoIHByb2dyYW0sIGdsVmVydGV4U2hhZGVyICk7XHJcblx0XHQvLyBnbC5kZXRhY2hTaGFkZXIoIHByb2dyYW0sIGdsRnJhZ21lbnRTaGFkZXIgKTtcclxuXHJcblx0XHRnbC5kZWxldGVTaGFkZXIoIGdsVmVydGV4U2hhZGVyICk7XHJcblx0XHRnbC5kZWxldGVTaGFkZXIoIGdsRnJhZ21lbnRTaGFkZXIgKTtcclxuXHJcblx0XHRjYWNoZWRVbmlmb3JtcyA9IG5ldyBXZWJHTFVuaWZvcm1zKCBnbCwgcHJvZ3JhbSApO1xyXG5cdFx0Y2FjaGVkQXR0cmlidXRlcyA9IGZldGNoQXR0cmlidXRlTG9jYXRpb25zKCBnbCwgcHJvZ3JhbSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vIHNldCB1cCBjYWNoaW5nIGZvciB1bmlmb3JtIGxvY2F0aW9uc1xyXG5cclxuXHRsZXQgY2FjaGVkVW5pZm9ybXM7XHJcblxyXG5cdHRoaXMuZ2V0VW5pZm9ybXMgPSBmdW5jdGlvbiAoKSB7XHJcblxyXG5cdFx0aWYgKCBjYWNoZWRVbmlmb3JtcyA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Ly8gUG9wdWxhdGVzIGNhY2hlZFVuaWZvcm1zIGFuZCBjYWNoZWRBdHRyaWJ1dGVzXHJcblx0XHRcdG9uRmlyc3RVc2UoIHRoaXMgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGNhY2hlZFVuaWZvcm1zO1xyXG5cclxuXHR9O1xyXG5cclxuXHQvLyBzZXQgdXAgY2FjaGluZyBmb3IgYXR0cmlidXRlIGxvY2F0aW9uc1xyXG5cclxuXHRsZXQgY2FjaGVkQXR0cmlidXRlcztcclxuXHJcblx0dGhpcy5nZXRBdHRyaWJ1dGVzID0gZnVuY3Rpb24gKCkge1xyXG5cclxuXHRcdGlmICggY2FjaGVkQXR0cmlidXRlcyA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Ly8gUG9wdWxhdGVzIGNhY2hlZEF0dHJpYnV0ZXMgYW5kIGNhY2hlZFVuaWZvcm1zXHJcblx0XHRcdG9uRmlyc3RVc2UoIHRoaXMgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGNhY2hlZEF0dHJpYnV0ZXM7XHJcblxyXG5cdH07XHJcblxyXG5cdC8vIGluZGljYXRlIHdoZW4gdGhlIHByb2dyYW0gaXMgcmVhZHkgdG8gYmUgdXNlZC4gaWYgdGhlIEtIUl9wYXJhbGxlbF9zaGFkZXJfY29tcGlsZSBleHRlbnNpb24gaXNuJ3Qgc3VwcG9ydGVkLFxyXG5cdC8vIGZsYWcgdGhlIHByb2dyYW0gYXMgcmVhZHkgaW1tZWRpYXRlbHkuIEl0IG1heSBjYXVzZSBhIHN0YWxsIHdoZW4gaXQncyBmaXJzdCB1c2VkLlxyXG5cclxuXHRsZXQgcHJvZ3JhbVJlYWR5ID0gKCBwYXJhbWV0ZXJzLnJlbmRlcmVyRXh0ZW5zaW9uUGFyYWxsZWxTaGFkZXJDb21waWxlID09PSBmYWxzZSApO1xyXG5cclxuXHR0aGlzLmlzUmVhZHkgPSBmdW5jdGlvbiAoKSB7XHJcblxyXG5cdFx0aWYgKCBwcm9ncmFtUmVhZHkgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0cHJvZ3JhbVJlYWR5ID0gZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlciggcHJvZ3JhbSwgQ09NUExFVElPTl9TVEFUVVNfS0hSICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBwcm9ncmFtUmVhZHk7XHJcblxyXG5cdH07XHJcblxyXG5cdC8vIGZyZWUgcmVzb3VyY2VcclxuXHJcblx0dGhpcy5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xyXG5cclxuXHRcdGJpbmRpbmdTdGF0ZXMucmVsZWFzZVN0YXRlc09mUHJvZ3JhbSggdGhpcyApO1xyXG5cclxuXHRcdGdsLmRlbGV0ZVByb2dyYW0oIHByb2dyYW0gKTtcclxuXHRcdHRoaXMucHJvZ3JhbSA9IHVuZGVmaW5lZDtcclxuXHJcblx0fTtcclxuXHJcblx0Ly9cclxuXHJcblx0dGhpcy50eXBlID0gcGFyYW1ldGVycy5zaGFkZXJUeXBlO1xyXG5cdHRoaXMubmFtZSA9IHBhcmFtZXRlcnMuc2hhZGVyTmFtZTtcclxuXHR0aGlzLmlkID0gcHJvZ3JhbUlkQ291bnQgKys7XHJcblx0dGhpcy5jYWNoZUtleSA9IGNhY2hlS2V5O1xyXG5cdHRoaXMudXNlZFRpbWVzID0gMTtcclxuXHR0aGlzLnByb2dyYW0gPSBwcm9ncmFtO1xyXG5cdHRoaXMudmVydGV4U2hhZGVyID0gZ2xWZXJ0ZXhTaGFkZXI7XHJcblx0dGhpcy5mcmFnbWVudFNoYWRlciA9IGdsRnJhZ21lbnRTaGFkZXI7XHJcblxyXG5cdHJldHVybiB0aGlzO1xyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgV2ViR0xQcm9ncmFtIH07XHJcbiIsImxldCBfaWQgPSAwO1xyXG5cclxuY2xhc3MgV2ViR0xTaGFkZXJDYWNoZSB7XHJcblxyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cclxuXHRcdHRoaXMuc2hhZGVyQ2FjaGUgPSBuZXcgTWFwKCk7XHJcblx0XHR0aGlzLm1hdGVyaWFsQ2FjaGUgPSBuZXcgTWFwKCk7XHJcblxyXG5cdH1cclxuXHJcblx0dXBkYXRlKCBtYXRlcmlhbCApIHtcclxuXHJcblx0XHRjb25zdCB2ZXJ0ZXhTaGFkZXIgPSBtYXRlcmlhbC52ZXJ0ZXhTaGFkZXI7XHJcblx0XHRjb25zdCBmcmFnbWVudFNoYWRlciA9IG1hdGVyaWFsLmZyYWdtZW50U2hhZGVyO1xyXG5cclxuXHRcdGNvbnN0IHZlcnRleFNoYWRlclN0YWdlID0gdGhpcy5fZ2V0U2hhZGVyU3RhZ2UoIHZlcnRleFNoYWRlciApO1xyXG5cdFx0Y29uc3QgZnJhZ21lbnRTaGFkZXJTdGFnZSA9IHRoaXMuX2dldFNoYWRlclN0YWdlKCBmcmFnbWVudFNoYWRlciApO1xyXG5cclxuXHRcdGNvbnN0IG1hdGVyaWFsU2hhZGVycyA9IHRoaXMuX2dldFNoYWRlckNhY2hlRm9yTWF0ZXJpYWwoIG1hdGVyaWFsICk7XHJcblxyXG5cdFx0aWYgKCBtYXRlcmlhbFNoYWRlcnMuaGFzKCB2ZXJ0ZXhTaGFkZXJTdGFnZSApID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdG1hdGVyaWFsU2hhZGVycy5hZGQoIHZlcnRleFNoYWRlclN0YWdlICk7XHJcblx0XHRcdHZlcnRleFNoYWRlclN0YWdlLnVzZWRUaW1lcyArKztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBtYXRlcmlhbFNoYWRlcnMuaGFzKCBmcmFnbWVudFNoYWRlclN0YWdlICkgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0bWF0ZXJpYWxTaGFkZXJzLmFkZCggZnJhZ21lbnRTaGFkZXJTdGFnZSApO1xyXG5cdFx0XHRmcmFnbWVudFNoYWRlclN0YWdlLnVzZWRUaW1lcyArKztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0cmVtb3ZlKCBtYXRlcmlhbCApIHtcclxuXHJcblx0XHRjb25zdCBtYXRlcmlhbFNoYWRlcnMgPSB0aGlzLm1hdGVyaWFsQ2FjaGUuZ2V0KCBtYXRlcmlhbCApO1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IHNoYWRlclN0YWdlIG9mIG1hdGVyaWFsU2hhZGVycyApIHtcclxuXHJcblx0XHRcdHNoYWRlclN0YWdlLnVzZWRUaW1lcyAtLTtcclxuXHJcblx0XHRcdGlmICggc2hhZGVyU3RhZ2UudXNlZFRpbWVzID09PSAwICkgdGhpcy5zaGFkZXJDYWNoZS5kZWxldGUoIHNoYWRlclN0YWdlLmNvZGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5tYXRlcmlhbENhY2hlLmRlbGV0ZSggbWF0ZXJpYWwgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHRnZXRWZXJ0ZXhTaGFkZXJJRCggbWF0ZXJpYWwgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX2dldFNoYWRlclN0YWdlKCBtYXRlcmlhbC52ZXJ0ZXhTaGFkZXIgKS5pZDtcclxuXHJcblx0fVxyXG5cclxuXHRnZXRGcmFnbWVudFNoYWRlcklEKCBtYXRlcmlhbCApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fZ2V0U2hhZGVyU3RhZ2UoIG1hdGVyaWFsLmZyYWdtZW50U2hhZGVyICkuaWQ7XHJcblxyXG5cdH1cclxuXHJcblx0ZGlzcG9zZSgpIHtcclxuXHJcblx0XHR0aGlzLnNoYWRlckNhY2hlLmNsZWFyKCk7XHJcblx0XHR0aGlzLm1hdGVyaWFsQ2FjaGUuY2xlYXIoKTtcclxuXHJcblx0fVxyXG5cclxuXHRfZ2V0U2hhZGVyQ2FjaGVGb3JNYXRlcmlhbCggbWF0ZXJpYWwgKSB7XHJcblxyXG5cdFx0Y29uc3QgY2FjaGUgPSB0aGlzLm1hdGVyaWFsQ2FjaGU7XHJcblx0XHRsZXQgc2V0ID0gY2FjaGUuZ2V0KCBtYXRlcmlhbCApO1xyXG5cclxuXHRcdGlmICggc2V0ID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRzZXQgPSBuZXcgU2V0KCk7XHJcblx0XHRcdGNhY2hlLnNldCggbWF0ZXJpYWwsIHNldCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gc2V0O1xyXG5cclxuXHR9XHJcblxyXG5cdF9nZXRTaGFkZXJTdGFnZSggY29kZSApIHtcclxuXHJcblx0XHRjb25zdCBjYWNoZSA9IHRoaXMuc2hhZGVyQ2FjaGU7XHJcblx0XHRsZXQgc3RhZ2UgPSBjYWNoZS5nZXQoIGNvZGUgKTtcclxuXHJcblx0XHRpZiAoIHN0YWdlID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRzdGFnZSA9IG5ldyBXZWJHTFNoYWRlclN0YWdlKCBjb2RlICk7XHJcblx0XHRcdGNhY2hlLnNldCggY29kZSwgc3RhZ2UgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHN0YWdlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5jbGFzcyBXZWJHTFNoYWRlclN0YWdlIHtcclxuXHJcblx0Y29uc3RydWN0b3IoIGNvZGUgKSB7XHJcblxyXG5cdFx0dGhpcy5pZCA9IF9pZCArKztcclxuXHJcblx0XHR0aGlzLmNvZGUgPSBjb2RlO1xyXG5cdFx0dGhpcy51c2VkVGltZXMgPSAwO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBXZWJHTFNoYWRlckNhY2hlIH07XHJcbiIsImltcG9ydCB7IEJhY2tTaWRlLCBEb3VibGVTaWRlLCBDdWJlVVZSZWZsZWN0aW9uTWFwcGluZywgT2JqZWN0U3BhY2VOb3JtYWxNYXAsIFRhbmdlbnRTcGFjZU5vcm1hbE1hcCwgTm9Ub25lTWFwcGluZywgTm9ybWFsQmxlbmRpbmcsIExpbmVhclNSR0JDb2xvclNwYWNlLCBTUkdCVHJhbnNmZXIgfSBmcm9tICcuLi8uLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBMYXllcnMgfSBmcm9tICcuLi8uLi9jb3JlL0xheWVycy5qcyc7XHJcbmltcG9ydCB7IFdlYkdMUHJvZ3JhbSB9IGZyb20gJy4vV2ViR0xQcm9ncmFtLmpzJztcclxuaW1wb3J0IHsgV2ViR0xTaGFkZXJDYWNoZSB9IGZyb20gJy4vV2ViR0xTaGFkZXJDYWNoZS5qcyc7XHJcbmltcG9ydCB7IFNoYWRlckxpYiB9IGZyb20gJy4uL3NoYWRlcnMvU2hhZGVyTGliLmpzJztcclxuaW1wb3J0IHsgVW5pZm9ybXNVdGlscyB9IGZyb20gJy4uL3NoYWRlcnMvVW5pZm9ybXNVdGlscy5qcyc7XHJcbmltcG9ydCB7IENvbG9yTWFuYWdlbWVudCB9IGZyb20gJy4uLy4uL21hdGgvQ29sb3JNYW5hZ2VtZW50LmpzJztcclxuXHJcbmZ1bmN0aW9uIFdlYkdMUHJvZ3JhbXMoIHJlbmRlcmVyLCBjdWJlbWFwcywgY3ViZXV2bWFwcywgZXh0ZW5zaW9ucywgY2FwYWJpbGl0aWVzLCBiaW5kaW5nU3RhdGVzLCBjbGlwcGluZyApIHtcclxuXHJcblx0Y29uc3QgX3Byb2dyYW1MYXllcnMgPSBuZXcgTGF5ZXJzKCk7XHJcblx0Y29uc3QgX2N1c3RvbVNoYWRlcnMgPSBuZXcgV2ViR0xTaGFkZXJDYWNoZSgpO1xyXG5cdGNvbnN0IF9hY3RpdmVDaGFubmVscyA9IG5ldyBTZXQoKTtcclxuXHRjb25zdCBwcm9ncmFtcyA9IFtdO1xyXG5cclxuXHRjb25zdCBsb2dhcml0aG1pY0RlcHRoQnVmZmVyID0gY2FwYWJpbGl0aWVzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXI7XHJcblx0Y29uc3QgU1VQUE9SVFNfVkVSVEVYX1RFWFRVUkVTID0gY2FwYWJpbGl0aWVzLnZlcnRleFRleHR1cmVzO1xyXG5cclxuXHRsZXQgcHJlY2lzaW9uID0gY2FwYWJpbGl0aWVzLnByZWNpc2lvbjtcclxuXHJcblx0Y29uc3Qgc2hhZGVySURzID0ge1xyXG5cdFx0TWVzaERlcHRoTWF0ZXJpYWw6ICdkZXB0aCcsXHJcblx0XHRNZXNoRGlzdGFuY2VNYXRlcmlhbDogJ2Rpc3RhbmNlUkdCQScsXHJcblx0XHRNZXNoTm9ybWFsTWF0ZXJpYWw6ICdub3JtYWwnLFxyXG5cdFx0TWVzaEJhc2ljTWF0ZXJpYWw6ICdiYXNpYycsXHJcblx0XHRNZXNoTGFtYmVydE1hdGVyaWFsOiAnbGFtYmVydCcsXHJcblx0XHRNZXNoUGhvbmdNYXRlcmlhbDogJ3Bob25nJyxcclxuXHRcdE1lc2hUb29uTWF0ZXJpYWw6ICd0b29uJyxcclxuXHRcdE1lc2hTdGFuZGFyZE1hdGVyaWFsOiAncGh5c2ljYWwnLFxyXG5cdFx0TWVzaFBoeXNpY2FsTWF0ZXJpYWw6ICdwaHlzaWNhbCcsXHJcblx0XHRNZXNoTWF0Y2FwTWF0ZXJpYWw6ICdtYXRjYXAnLFxyXG5cdFx0TGluZUJhc2ljTWF0ZXJpYWw6ICdiYXNpYycsXHJcblx0XHRMaW5lRGFzaGVkTWF0ZXJpYWw6ICdkYXNoZWQnLFxyXG5cdFx0UG9pbnRzTWF0ZXJpYWw6ICdwb2ludHMnLFxyXG5cdFx0U2hhZG93TWF0ZXJpYWw6ICdzaGFkb3cnLFxyXG5cdFx0U3ByaXRlTWF0ZXJpYWw6ICdzcHJpdGUnXHJcblx0fTtcclxuXHJcblx0ZnVuY3Rpb24gZ2V0Q2hhbm5lbCggdmFsdWUgKSB7XHJcblxyXG5cdFx0X2FjdGl2ZUNoYW5uZWxzLmFkZCggdmFsdWUgKTtcclxuXHJcblx0XHRpZiAoIHZhbHVlID09PSAwICkgcmV0dXJuICd1dic7XHJcblxyXG5cdFx0cmV0dXJuIGB1diR7IHZhbHVlIH1gO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGdldFBhcmFtZXRlcnMoIG1hdGVyaWFsLCBsaWdodHMsIHNoYWRvd3MsIHNjZW5lLCBvYmplY3QgKSB7XHJcblxyXG5cdFx0Y29uc3QgZm9nID0gc2NlbmUuZm9nO1xyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSBvYmplY3QuZ2VvbWV0cnk7XHJcblx0XHRjb25zdCBlbnZpcm9ubWVudCA9IG1hdGVyaWFsLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwgPyBzY2VuZS5lbnZpcm9ubWVudCA6IG51bGw7XHJcblxyXG5cdFx0Y29uc3QgZW52TWFwID0gKCBtYXRlcmlhbC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsID8gY3ViZXV2bWFwcyA6IGN1YmVtYXBzICkuZ2V0KCBtYXRlcmlhbC5lbnZNYXAgfHwgZW52aXJvbm1lbnQgKTtcclxuXHRcdGNvbnN0IGVudk1hcEN1YmVVVkhlaWdodCA9ICggISEgZW52TWFwICkgJiYgKCBlbnZNYXAubWFwcGluZyA9PT0gQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmcgKSA/IGVudk1hcC5pbWFnZS5oZWlnaHQgOiBudWxsO1xyXG5cclxuXHRcdGNvbnN0IHNoYWRlcklEID0gc2hhZGVySURzWyBtYXRlcmlhbC50eXBlIF07XHJcblxyXG5cdFx0Ly8gaGV1cmlzdGljcyB0byBjcmVhdGUgc2hhZGVyIHBhcmFtZXRlcnMgYWNjb3JkaW5nIHRvIGxpZ2h0cyBpbiB0aGUgc2NlbmVcclxuXHRcdC8vIChub3QgdG8gYmxvdyBvdmVyIG1heExpZ2h0cyBidWRnZXQpXHJcblxyXG5cdFx0aWYgKCBtYXRlcmlhbC5wcmVjaXNpb24gIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRwcmVjaXNpb24gPSBjYXBhYmlsaXRpZXMuZ2V0TWF4UHJlY2lzaW9uKCBtYXRlcmlhbC5wcmVjaXNpb24gKTtcclxuXHJcblx0XHRcdGlmICggcHJlY2lzaW9uICE9PSBtYXRlcmlhbC5wcmVjaXNpb24gKSB7XHJcblxyXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUHJvZ3JhbS5nZXRQYXJhbWV0ZXJzOicsIG1hdGVyaWFsLnByZWNpc2lvbiwgJ25vdCBzdXBwb3J0ZWQsIHVzaW5nJywgcHJlY2lzaW9uLCAnaW5zdGVhZC4nICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0Y29uc3QgbW9ycGhBdHRyaWJ1dGUgPSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24gfHwgZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbCB8fCBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMuY29sb3I7XHJcblx0XHRjb25zdCBtb3JwaFRhcmdldHNDb3VudCA9ICggbW9ycGhBdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApID8gbW9ycGhBdHRyaWJ1dGUubGVuZ3RoIDogMDtcclxuXHJcblx0XHRsZXQgbW9ycGhUZXh0dXJlU3RyaWRlID0gMDtcclxuXHJcblx0XHRpZiAoIGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbiAhPT0gdW5kZWZpbmVkICkgbW9ycGhUZXh0dXJlU3RyaWRlID0gMTtcclxuXHRcdGlmICggZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbCAhPT0gdW5kZWZpbmVkICkgbW9ycGhUZXh0dXJlU3RyaWRlID0gMjtcclxuXHRcdGlmICggZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLmNvbG9yICE9PSB1bmRlZmluZWQgKSBtb3JwaFRleHR1cmVTdHJpZGUgPSAzO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0bGV0IHZlcnRleFNoYWRlciwgZnJhZ21lbnRTaGFkZXI7XHJcblx0XHRsZXQgY3VzdG9tVmVydGV4U2hhZGVySUQsIGN1c3RvbUZyYWdtZW50U2hhZGVySUQ7XHJcblxyXG5cdFx0aWYgKCBzaGFkZXJJRCApIHtcclxuXHJcblx0XHRcdGNvbnN0IHNoYWRlciA9IFNoYWRlckxpYlsgc2hhZGVySUQgXTtcclxuXHJcblx0XHRcdHZlcnRleFNoYWRlciA9IHNoYWRlci52ZXJ0ZXhTaGFkZXI7XHJcblx0XHRcdGZyYWdtZW50U2hhZGVyID0gc2hhZGVyLmZyYWdtZW50U2hhZGVyO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR2ZXJ0ZXhTaGFkZXIgPSBtYXRlcmlhbC52ZXJ0ZXhTaGFkZXI7XHJcblx0XHRcdGZyYWdtZW50U2hhZGVyID0gbWF0ZXJpYWwuZnJhZ21lbnRTaGFkZXI7XHJcblxyXG5cdFx0XHRfY3VzdG9tU2hhZGVycy51cGRhdGUoIG1hdGVyaWFsICk7XHJcblxyXG5cdFx0XHRjdXN0b21WZXJ0ZXhTaGFkZXJJRCA9IF9jdXN0b21TaGFkZXJzLmdldFZlcnRleFNoYWRlcklEKCBtYXRlcmlhbCApO1xyXG5cdFx0XHRjdXN0b21GcmFnbWVudFNoYWRlcklEID0gX2N1c3RvbVNoYWRlcnMuZ2V0RnJhZ21lbnRTaGFkZXJJRCggbWF0ZXJpYWwgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgY3VycmVudFJlbmRlclRhcmdldCA9IHJlbmRlcmVyLmdldFJlbmRlclRhcmdldCgpO1xyXG5cdFx0Y29uc3QgcmV2ZXJzZURlcHRoQnVmZmVyID0gcmVuZGVyZXIuc3RhdGUuYnVmZmVycy5kZXB0aC5nZXRSZXZlcnNlZCgpO1xyXG5cclxuXHRcdGNvbnN0IElTX0lOU1RBTkNFRE1FU0ggPSBvYmplY3QuaXNJbnN0YW5jZWRNZXNoID09PSB0cnVlO1xyXG5cdFx0Y29uc3QgSVNfQkFUQ0hFRE1FU0ggPSBvYmplY3QuaXNCYXRjaGVkTWVzaCA9PT0gdHJ1ZTtcclxuXHJcblx0XHRjb25zdCBIQVNfTUFQID0gISEgbWF0ZXJpYWwubWFwO1xyXG5cdFx0Y29uc3QgSEFTX01BVENBUCA9ICEhIG1hdGVyaWFsLm1hdGNhcDtcclxuXHRcdGNvbnN0IEhBU19FTlZNQVAgPSAhISBlbnZNYXA7XHJcblx0XHRjb25zdCBIQVNfQU9NQVAgPSAhISBtYXRlcmlhbC5hb01hcDtcclxuXHRcdGNvbnN0IEhBU19MSUdIVE1BUCA9ICEhIG1hdGVyaWFsLmxpZ2h0TWFwO1xyXG5cdFx0Y29uc3QgSEFTX0JVTVBNQVAgPSAhISBtYXRlcmlhbC5idW1wTWFwO1xyXG5cdFx0Y29uc3QgSEFTX05PUk1BTE1BUCA9ICEhIG1hdGVyaWFsLm5vcm1hbE1hcDtcclxuXHRcdGNvbnN0IEhBU19ESVNQTEFDRU1FTlRNQVAgPSAhISBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXA7XHJcblx0XHRjb25zdCBIQVNfRU1JU1NJVkVNQVAgPSAhISBtYXRlcmlhbC5lbWlzc2l2ZU1hcDtcclxuXHJcblx0XHRjb25zdCBIQVNfTUVUQUxORVNTTUFQID0gISEgbWF0ZXJpYWwubWV0YWxuZXNzTWFwO1xyXG5cdFx0Y29uc3QgSEFTX1JPVUdITkVTU01BUCA9ICEhIG1hdGVyaWFsLnJvdWdobmVzc01hcDtcclxuXHJcblx0XHRjb25zdCBIQVNfQU5JU09UUk9QWSA9IG1hdGVyaWFsLmFuaXNvdHJvcHkgPiAwO1xyXG5cdFx0Y29uc3QgSEFTX0NMRUFSQ09BVCA9IG1hdGVyaWFsLmNsZWFyY29hdCA+IDA7XHJcblx0XHRjb25zdCBIQVNfRElTUEVSU0lPTiA9IG1hdGVyaWFsLmRpc3BlcnNpb24gPiAwO1xyXG5cdFx0Y29uc3QgSEFTX0lSSURFU0NFTkNFID0gbWF0ZXJpYWwuaXJpZGVzY2VuY2UgPiAwO1xyXG5cdFx0Y29uc3QgSEFTX1NIRUVOID0gbWF0ZXJpYWwuc2hlZW4gPiAwO1xyXG5cdFx0Y29uc3QgSEFTX1RSQU5TTUlTU0lPTiA9IG1hdGVyaWFsLnRyYW5zbWlzc2lvbiA+IDA7XHJcblxyXG5cdFx0Y29uc3QgSEFTX0FOSVNPVFJPUFlNQVAgPSBIQVNfQU5JU09UUk9QWSAmJiAhISBtYXRlcmlhbC5hbmlzb3Ryb3B5TWFwO1xyXG5cclxuXHRcdGNvbnN0IEhBU19DTEVBUkNPQVRNQVAgPSBIQVNfQ0xFQVJDT0FUICYmICEhIG1hdGVyaWFsLmNsZWFyY29hdE1hcDtcclxuXHRcdGNvbnN0IEhBU19DTEVBUkNPQVRfTk9STUFMTUFQID0gSEFTX0NMRUFSQ09BVCAmJiAhISBtYXRlcmlhbC5jbGVhcmNvYXROb3JtYWxNYXA7XHJcblx0XHRjb25zdCBIQVNfQ0xFQVJDT0FUX1JPVUdITkVTU01BUCA9IEhBU19DTEVBUkNPQVQgJiYgISEgbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzTWFwO1xyXG5cclxuXHRcdGNvbnN0IEhBU19JUklERVNDRU5DRU1BUCA9IEhBU19JUklERVNDRU5DRSAmJiAhISBtYXRlcmlhbC5pcmlkZXNjZW5jZU1hcDtcclxuXHRcdGNvbnN0IEhBU19JUklERVNDRU5DRV9USElDS05FU1NNQVAgPSBIQVNfSVJJREVTQ0VOQ0UgJiYgISEgbWF0ZXJpYWwuaXJpZGVzY2VuY2VUaGlja25lc3NNYXA7XHJcblxyXG5cdFx0Y29uc3QgSEFTX1NIRUVOX0NPTE9STUFQID0gSEFTX1NIRUVOICYmICEhIG1hdGVyaWFsLnNoZWVuQ29sb3JNYXA7XHJcblx0XHRjb25zdCBIQVNfU0hFRU5fUk9VR0hORVNTTUFQID0gSEFTX1NIRUVOICYmICEhIG1hdGVyaWFsLnNoZWVuUm91Z2huZXNzTWFwO1xyXG5cclxuXHRcdGNvbnN0IEhBU19TUEVDVUxBUk1BUCA9ICEhIG1hdGVyaWFsLnNwZWN1bGFyTWFwO1xyXG5cdFx0Y29uc3QgSEFTX1NQRUNVTEFSX0NPTE9STUFQID0gISEgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvck1hcDtcclxuXHRcdGNvbnN0IEhBU19TUEVDVUxBUl9JTlRFTlNJVFlNQVAgPSAhISBtYXRlcmlhbC5zcGVjdWxhckludGVuc2l0eU1hcDtcclxuXHJcblx0XHRjb25zdCBIQVNfVFJBTlNNSVNTSU9OTUFQID0gSEFTX1RSQU5TTUlTU0lPTiAmJiAhISBtYXRlcmlhbC50cmFuc21pc3Npb25NYXA7XHJcblx0XHRjb25zdCBIQVNfVEhJQ0tORVNTTUFQID0gSEFTX1RSQU5TTUlTU0lPTiAmJiAhISBtYXRlcmlhbC50aGlja25lc3NNYXA7XHJcblxyXG5cdFx0Y29uc3QgSEFTX0dSQURJRU5UTUFQID0gISEgbWF0ZXJpYWwuZ3JhZGllbnRNYXA7XHJcblxyXG5cdFx0Y29uc3QgSEFTX0FMUEhBTUFQID0gISEgbWF0ZXJpYWwuYWxwaGFNYXA7XHJcblxyXG5cdFx0Y29uc3QgSEFTX0FMUEhBVEVTVCA9IG1hdGVyaWFsLmFscGhhVGVzdCA+IDA7XHJcblxyXG5cdFx0Y29uc3QgSEFTX0FMUEhBSEFTSCA9ICEhIG1hdGVyaWFsLmFscGhhSGFzaDtcclxuXHJcblx0XHRjb25zdCBIQVNfRVhURU5TSU9OUyA9ICEhIG1hdGVyaWFsLmV4dGVuc2lvbnM7XHJcblxyXG5cdFx0bGV0IHRvbmVNYXBwaW5nID0gTm9Ub25lTWFwcGluZztcclxuXHJcblx0XHRpZiAoIG1hdGVyaWFsLnRvbmVNYXBwZWQgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGN1cnJlbnRSZW5kZXJUYXJnZXQgPT09IG51bGwgfHwgY3VycmVudFJlbmRlclRhcmdldC5pc1hSUmVuZGVyVGFyZ2V0ID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHR0b25lTWFwcGluZyA9IHJlbmRlcmVyLnRvbmVNYXBwaW5nO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBwYXJhbWV0ZXJzID0ge1xyXG5cclxuXHRcdFx0c2hhZGVySUQ6IHNoYWRlcklELFxyXG5cdFx0XHRzaGFkZXJUeXBlOiBtYXRlcmlhbC50eXBlLFxyXG5cdFx0XHRzaGFkZXJOYW1lOiBtYXRlcmlhbC5uYW1lLFxyXG5cclxuXHRcdFx0dmVydGV4U2hhZGVyOiB2ZXJ0ZXhTaGFkZXIsXHJcblx0XHRcdGZyYWdtZW50U2hhZGVyOiBmcmFnbWVudFNoYWRlcixcclxuXHRcdFx0ZGVmaW5lczogbWF0ZXJpYWwuZGVmaW5lcyxcclxuXHJcblx0XHRcdGN1c3RvbVZlcnRleFNoYWRlcklEOiBjdXN0b21WZXJ0ZXhTaGFkZXJJRCxcclxuXHRcdFx0Y3VzdG9tRnJhZ21lbnRTaGFkZXJJRDogY3VzdG9tRnJhZ21lbnRTaGFkZXJJRCxcclxuXHJcblx0XHRcdGlzUmF3U2hhZGVyTWF0ZXJpYWw6IG1hdGVyaWFsLmlzUmF3U2hhZGVyTWF0ZXJpYWwgPT09IHRydWUsXHJcblx0XHRcdGdsc2xWZXJzaW9uOiBtYXRlcmlhbC5nbHNsVmVyc2lvbixcclxuXHJcblx0XHRcdHByZWNpc2lvbjogcHJlY2lzaW9uLFxyXG5cclxuXHRcdFx0YmF0Y2hpbmc6IElTX0JBVENIRURNRVNILFxyXG5cdFx0XHRiYXRjaGluZ0NvbG9yOiBJU19CQVRDSEVETUVTSCAmJiBvYmplY3QuX2NvbG9yc1RleHR1cmUgIT09IG51bGwsXHJcblx0XHRcdGluc3RhbmNpbmc6IElTX0lOU1RBTkNFRE1FU0gsXHJcblx0XHRcdGluc3RhbmNpbmdDb2xvcjogSVNfSU5TVEFOQ0VETUVTSCAmJiBvYmplY3QuaW5zdGFuY2VDb2xvciAhPT0gbnVsbCxcclxuXHRcdFx0aW5zdGFuY2luZ01vcnBoOiBJU19JTlNUQU5DRURNRVNIICYmIG9iamVjdC5tb3JwaFRleHR1cmUgIT09IG51bGwsXHJcblxyXG5cdFx0XHRzdXBwb3J0c1ZlcnRleFRleHR1cmVzOiBTVVBQT1JUU19WRVJURVhfVEVYVFVSRVMsXHJcblx0XHRcdG91dHB1dENvbG9yU3BhY2U6ICggY3VycmVudFJlbmRlclRhcmdldCA9PT0gbnVsbCApID8gcmVuZGVyZXIub3V0cHV0Q29sb3JTcGFjZSA6ICggY3VycmVudFJlbmRlclRhcmdldC5pc1hSUmVuZGVyVGFyZ2V0ID09PSB0cnVlID8gY3VycmVudFJlbmRlclRhcmdldC50ZXh0dXJlLmNvbG9yU3BhY2UgOiBMaW5lYXJTUkdCQ29sb3JTcGFjZSApLFxyXG5cdFx0XHRhbHBoYVRvQ292ZXJhZ2U6ICEhIG1hdGVyaWFsLmFscGhhVG9Db3ZlcmFnZSxcclxuXHJcblx0XHRcdG1hcDogSEFTX01BUCxcclxuXHRcdFx0bWF0Y2FwOiBIQVNfTUFUQ0FQLFxyXG5cdFx0XHRlbnZNYXA6IEhBU19FTlZNQVAsXHJcblx0XHRcdGVudk1hcE1vZGU6IEhBU19FTlZNQVAgJiYgZW52TWFwLm1hcHBpbmcsXHJcblx0XHRcdGVudk1hcEN1YmVVVkhlaWdodDogZW52TWFwQ3ViZVVWSGVpZ2h0LFxyXG5cdFx0XHRhb01hcDogSEFTX0FPTUFQLFxyXG5cdFx0XHRsaWdodE1hcDogSEFTX0xJR0hUTUFQLFxyXG5cdFx0XHRidW1wTWFwOiBIQVNfQlVNUE1BUCxcclxuXHRcdFx0bm9ybWFsTWFwOiBIQVNfTk9STUFMTUFQLFxyXG5cdFx0XHRkaXNwbGFjZW1lbnRNYXA6IFNVUFBPUlRTX1ZFUlRFWF9URVhUVVJFUyAmJiBIQVNfRElTUExBQ0VNRU5UTUFQLFxyXG5cdFx0XHRlbWlzc2l2ZU1hcDogSEFTX0VNSVNTSVZFTUFQLFxyXG5cclxuXHRcdFx0bm9ybWFsTWFwT2JqZWN0U3BhY2U6IEhBU19OT1JNQUxNQVAgJiYgbWF0ZXJpYWwubm9ybWFsTWFwVHlwZSA9PT0gT2JqZWN0U3BhY2VOb3JtYWxNYXAsXHJcblx0XHRcdG5vcm1hbE1hcFRhbmdlbnRTcGFjZTogSEFTX05PUk1BTE1BUCAmJiBtYXRlcmlhbC5ub3JtYWxNYXBUeXBlID09PSBUYW5nZW50U3BhY2VOb3JtYWxNYXAsXHJcblxyXG5cdFx0XHRtZXRhbG5lc3NNYXA6IEhBU19NRVRBTE5FU1NNQVAsXHJcblx0XHRcdHJvdWdobmVzc01hcDogSEFTX1JPVUdITkVTU01BUCxcclxuXHJcblx0XHRcdGFuaXNvdHJvcHk6IEhBU19BTklTT1RST1BZLFxyXG5cdFx0XHRhbmlzb3Ryb3B5TWFwOiBIQVNfQU5JU09UUk9QWU1BUCxcclxuXHJcblx0XHRcdGNsZWFyY29hdDogSEFTX0NMRUFSQ09BVCxcclxuXHRcdFx0Y2xlYXJjb2F0TWFwOiBIQVNfQ0xFQVJDT0FUTUFQLFxyXG5cdFx0XHRjbGVhcmNvYXROb3JtYWxNYXA6IEhBU19DTEVBUkNPQVRfTk9STUFMTUFQLFxyXG5cdFx0XHRjbGVhcmNvYXRSb3VnaG5lc3NNYXA6IEhBU19DTEVBUkNPQVRfUk9VR0hORVNTTUFQLFxyXG5cclxuXHRcdFx0ZGlzcGVyc2lvbjogSEFTX0RJU1BFUlNJT04sXHJcblxyXG5cdFx0XHRpcmlkZXNjZW5jZTogSEFTX0lSSURFU0NFTkNFLFxyXG5cdFx0XHRpcmlkZXNjZW5jZU1hcDogSEFTX0lSSURFU0NFTkNFTUFQLFxyXG5cdFx0XHRpcmlkZXNjZW5jZVRoaWNrbmVzc01hcDogSEFTX0lSSURFU0NFTkNFX1RISUNLTkVTU01BUCxcclxuXHJcblx0XHRcdHNoZWVuOiBIQVNfU0hFRU4sXHJcblx0XHRcdHNoZWVuQ29sb3JNYXA6IEhBU19TSEVFTl9DT0xPUk1BUCxcclxuXHRcdFx0c2hlZW5Sb3VnaG5lc3NNYXA6IEhBU19TSEVFTl9ST1VHSE5FU1NNQVAsXHJcblxyXG5cdFx0XHRzcGVjdWxhck1hcDogSEFTX1NQRUNVTEFSTUFQLFxyXG5cdFx0XHRzcGVjdWxhckNvbG9yTWFwOiBIQVNfU1BFQ1VMQVJfQ09MT1JNQVAsXHJcblx0XHRcdHNwZWN1bGFySW50ZW5zaXR5TWFwOiBIQVNfU1BFQ1VMQVJfSU5URU5TSVRZTUFQLFxyXG5cclxuXHRcdFx0dHJhbnNtaXNzaW9uOiBIQVNfVFJBTlNNSVNTSU9OLFxyXG5cdFx0XHR0cmFuc21pc3Npb25NYXA6IEhBU19UUkFOU01JU1NJT05NQVAsXHJcblx0XHRcdHRoaWNrbmVzc01hcDogSEFTX1RISUNLTkVTU01BUCxcclxuXHJcblx0XHRcdGdyYWRpZW50TWFwOiBIQVNfR1JBRElFTlRNQVAsXHJcblxyXG5cdFx0XHRvcGFxdWU6IG1hdGVyaWFsLnRyYW5zcGFyZW50ID09PSBmYWxzZSAmJiBtYXRlcmlhbC5ibGVuZGluZyA9PT0gTm9ybWFsQmxlbmRpbmcgJiYgbWF0ZXJpYWwuYWxwaGFUb0NvdmVyYWdlID09PSBmYWxzZSxcclxuXHJcblx0XHRcdGFscGhhTWFwOiBIQVNfQUxQSEFNQVAsXHJcblx0XHRcdGFscGhhVGVzdDogSEFTX0FMUEhBVEVTVCxcclxuXHRcdFx0YWxwaGFIYXNoOiBIQVNfQUxQSEFIQVNILFxyXG5cclxuXHRcdFx0Y29tYmluZTogbWF0ZXJpYWwuY29tYmluZSxcclxuXHJcblx0XHRcdC8vXHJcblxyXG5cdFx0XHRtYXBVdjogSEFTX01BUCAmJiBnZXRDaGFubmVsKCBtYXRlcmlhbC5tYXAuY2hhbm5lbCApLFxyXG5cdFx0XHRhb01hcFV2OiBIQVNfQU9NQVAgJiYgZ2V0Q2hhbm5lbCggbWF0ZXJpYWwuYW9NYXAuY2hhbm5lbCApLFxyXG5cdFx0XHRsaWdodE1hcFV2OiBIQVNfTElHSFRNQVAgJiYgZ2V0Q2hhbm5lbCggbWF0ZXJpYWwubGlnaHRNYXAuY2hhbm5lbCApLFxyXG5cdFx0XHRidW1wTWFwVXY6IEhBU19CVU1QTUFQICYmIGdldENoYW5uZWwoIG1hdGVyaWFsLmJ1bXBNYXAuY2hhbm5lbCApLFxyXG5cdFx0XHRub3JtYWxNYXBVdjogSEFTX05PUk1BTE1BUCAmJiBnZXRDaGFubmVsKCBtYXRlcmlhbC5ub3JtYWxNYXAuY2hhbm5lbCApLFxyXG5cdFx0XHRkaXNwbGFjZW1lbnRNYXBVdjogSEFTX0RJU1BMQUNFTUVOVE1BUCAmJiBnZXRDaGFubmVsKCBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAuY2hhbm5lbCApLFxyXG5cdFx0XHRlbWlzc2l2ZU1hcFV2OiBIQVNfRU1JU1NJVkVNQVAgJiYgZ2V0Q2hhbm5lbCggbWF0ZXJpYWwuZW1pc3NpdmVNYXAuY2hhbm5lbCApLFxyXG5cclxuXHRcdFx0bWV0YWxuZXNzTWFwVXY6IEhBU19NRVRBTE5FU1NNQVAgJiYgZ2V0Q2hhbm5lbCggbWF0ZXJpYWwubWV0YWxuZXNzTWFwLmNoYW5uZWwgKSxcclxuXHRcdFx0cm91Z2huZXNzTWFwVXY6IEhBU19ST1VHSE5FU1NNQVAgJiYgZ2V0Q2hhbm5lbCggbWF0ZXJpYWwucm91Z2huZXNzTWFwLmNoYW5uZWwgKSxcclxuXHJcblx0XHRcdGFuaXNvdHJvcHlNYXBVdjogSEFTX0FOSVNPVFJPUFlNQVAgJiYgZ2V0Q2hhbm5lbCggbWF0ZXJpYWwuYW5pc290cm9weU1hcC5jaGFubmVsICksXHJcblxyXG5cdFx0XHRjbGVhcmNvYXRNYXBVdjogSEFTX0NMRUFSQ09BVE1BUCAmJiBnZXRDaGFubmVsKCBtYXRlcmlhbC5jbGVhcmNvYXRNYXAuY2hhbm5lbCApLFxyXG5cdFx0XHRjbGVhcmNvYXROb3JtYWxNYXBVdjogSEFTX0NMRUFSQ09BVF9OT1JNQUxNQVAgJiYgZ2V0Q2hhbm5lbCggbWF0ZXJpYWwuY2xlYXJjb2F0Tm9ybWFsTWFwLmNoYW5uZWwgKSxcclxuXHRcdFx0Y2xlYXJjb2F0Um91Z2huZXNzTWFwVXY6IEhBU19DTEVBUkNPQVRfUk9VR0hORVNTTUFQICYmIGdldENoYW5uZWwoIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzc01hcC5jaGFubmVsICksXHJcblxyXG5cdFx0XHRpcmlkZXNjZW5jZU1hcFV2OiBIQVNfSVJJREVTQ0VOQ0VNQVAgJiYgZ2V0Q2hhbm5lbCggbWF0ZXJpYWwuaXJpZGVzY2VuY2VNYXAuY2hhbm5lbCApLFxyXG5cdFx0XHRpcmlkZXNjZW5jZVRoaWNrbmVzc01hcFV2OiBIQVNfSVJJREVTQ0VOQ0VfVEhJQ0tORVNTTUFQICYmIGdldENoYW5uZWwoIG1hdGVyaWFsLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwLmNoYW5uZWwgKSxcclxuXHJcblx0XHRcdHNoZWVuQ29sb3JNYXBVdjogSEFTX1NIRUVOX0NPTE9STUFQICYmIGdldENoYW5uZWwoIG1hdGVyaWFsLnNoZWVuQ29sb3JNYXAuY2hhbm5lbCApLFxyXG5cdFx0XHRzaGVlblJvdWdobmVzc01hcFV2OiBIQVNfU0hFRU5fUk9VR0hORVNTTUFQICYmIGdldENoYW5uZWwoIG1hdGVyaWFsLnNoZWVuUm91Z2huZXNzTWFwLmNoYW5uZWwgKSxcclxuXHJcblx0XHRcdHNwZWN1bGFyTWFwVXY6IEhBU19TUEVDVUxBUk1BUCAmJiBnZXRDaGFubmVsKCBtYXRlcmlhbC5zcGVjdWxhck1hcC5jaGFubmVsICksXHJcblx0XHRcdHNwZWN1bGFyQ29sb3JNYXBVdjogSEFTX1NQRUNVTEFSX0NPTE9STUFQICYmIGdldENoYW5uZWwoIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3JNYXAuY2hhbm5lbCApLFxyXG5cdFx0XHRzcGVjdWxhckludGVuc2l0eU1hcFV2OiBIQVNfU1BFQ1VMQVJfSU5URU5TSVRZTUFQICYmIGdldENoYW5uZWwoIG1hdGVyaWFsLnNwZWN1bGFySW50ZW5zaXR5TWFwLmNoYW5uZWwgKSxcclxuXHJcblx0XHRcdHRyYW5zbWlzc2lvbk1hcFV2OiBIQVNfVFJBTlNNSVNTSU9OTUFQICYmIGdldENoYW5uZWwoIG1hdGVyaWFsLnRyYW5zbWlzc2lvbk1hcC5jaGFubmVsICksXHJcblx0XHRcdHRoaWNrbmVzc01hcFV2OiBIQVNfVEhJQ0tORVNTTUFQICYmIGdldENoYW5uZWwoIG1hdGVyaWFsLnRoaWNrbmVzc01hcC5jaGFubmVsICksXHJcblxyXG5cdFx0XHRhbHBoYU1hcFV2OiBIQVNfQUxQSEFNQVAgJiYgZ2V0Q2hhbm5lbCggbWF0ZXJpYWwuYWxwaGFNYXAuY2hhbm5lbCApLFxyXG5cclxuXHRcdFx0Ly9cclxuXHJcblx0XHRcdHZlcnRleFRhbmdlbnRzOiAhISBnZW9tZXRyeS5hdHRyaWJ1dGVzLnRhbmdlbnQgJiYgKCBIQVNfTk9STUFMTUFQIHx8IEhBU19BTklTT1RST1BZICksXHJcblx0XHRcdHZlcnRleENvbG9yczogbWF0ZXJpYWwudmVydGV4Q29sb3JzLFxyXG5cdFx0XHR2ZXJ0ZXhBbHBoYXM6IG1hdGVyaWFsLnZlcnRleENvbG9ycyA9PT0gdHJ1ZSAmJiAhISBnZW9tZXRyeS5hdHRyaWJ1dGVzLmNvbG9yICYmIGdlb21ldHJ5LmF0dHJpYnV0ZXMuY29sb3IuaXRlbVNpemUgPT09IDQsXHJcblxyXG5cdFx0XHRwb2ludHNVdnM6IG9iamVjdC5pc1BvaW50cyA9PT0gdHJ1ZSAmJiAhISBnZW9tZXRyeS5hdHRyaWJ1dGVzLnV2ICYmICggSEFTX01BUCB8fCBIQVNfQUxQSEFNQVAgKSxcclxuXHJcblx0XHRcdGZvZzogISEgZm9nLFxyXG5cdFx0XHR1c2VGb2c6IG1hdGVyaWFsLmZvZyA9PT0gdHJ1ZSxcclxuXHRcdFx0Zm9nRXhwMjogKCAhISBmb2cgJiYgZm9nLmlzRm9nRXhwMiApLFxyXG5cclxuXHRcdFx0ZmxhdFNoYWRpbmc6IG1hdGVyaWFsLmZsYXRTaGFkaW5nID09PSB0cnVlLFxyXG5cclxuXHRcdFx0c2l6ZUF0dGVudWF0aW9uOiBtYXRlcmlhbC5zaXplQXR0ZW51YXRpb24gPT09IHRydWUsXHJcblx0XHRcdGxvZ2FyaXRobWljRGVwdGhCdWZmZXI6IGxvZ2FyaXRobWljRGVwdGhCdWZmZXIsXHJcblx0XHRcdHJldmVyc2VEZXB0aEJ1ZmZlcjogcmV2ZXJzZURlcHRoQnVmZmVyLFxyXG5cclxuXHRcdFx0c2tpbm5pbmc6IG9iamVjdC5pc1NraW5uZWRNZXNoID09PSB0cnVlLFxyXG5cclxuXHRcdFx0bW9ycGhUYXJnZXRzOiBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24gIT09IHVuZGVmaW5lZCxcclxuXHRcdFx0bW9ycGhOb3JtYWxzOiBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMubm9ybWFsICE9PSB1bmRlZmluZWQsXHJcblx0XHRcdG1vcnBoQ29sb3JzOiBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMuY29sb3IgIT09IHVuZGVmaW5lZCxcclxuXHRcdFx0bW9ycGhUYXJnZXRzQ291bnQ6IG1vcnBoVGFyZ2V0c0NvdW50LFxyXG5cdFx0XHRtb3JwaFRleHR1cmVTdHJpZGU6IG1vcnBoVGV4dHVyZVN0cmlkZSxcclxuXHJcblx0XHRcdG51bURpckxpZ2h0czogbGlnaHRzLmRpcmVjdGlvbmFsLmxlbmd0aCxcclxuXHRcdFx0bnVtUG9pbnRMaWdodHM6IGxpZ2h0cy5wb2ludC5sZW5ndGgsXHJcblx0XHRcdG51bVNwb3RMaWdodHM6IGxpZ2h0cy5zcG90Lmxlbmd0aCxcclxuXHRcdFx0bnVtU3BvdExpZ2h0TWFwczogbGlnaHRzLnNwb3RMaWdodE1hcC5sZW5ndGgsXHJcblx0XHRcdG51bVJlY3RBcmVhTGlnaHRzOiBsaWdodHMucmVjdEFyZWEubGVuZ3RoLFxyXG5cdFx0XHRudW1IZW1pTGlnaHRzOiBsaWdodHMuaGVtaS5sZW5ndGgsXHJcblxyXG5cdFx0XHRudW1EaXJMaWdodFNoYWRvd3M6IGxpZ2h0cy5kaXJlY3Rpb25hbFNoYWRvd01hcC5sZW5ndGgsXHJcblx0XHRcdG51bVBvaW50TGlnaHRTaGFkb3dzOiBsaWdodHMucG9pbnRTaGFkb3dNYXAubGVuZ3RoLFxyXG5cdFx0XHRudW1TcG90TGlnaHRTaGFkb3dzOiBsaWdodHMuc3BvdFNoYWRvd01hcC5sZW5ndGgsXHJcblx0XHRcdG51bVNwb3RMaWdodFNoYWRvd3NXaXRoTWFwczogbGlnaHRzLm51bVNwb3RMaWdodFNoYWRvd3NXaXRoTWFwcyxcclxuXHJcblx0XHRcdG51bUxpZ2h0UHJvYmVzOiBsaWdodHMubnVtTGlnaHRQcm9iZXMsXHJcblxyXG5cdFx0XHRudW1DbGlwcGluZ1BsYW5lczogY2xpcHBpbmcubnVtUGxhbmVzLFxyXG5cdFx0XHRudW1DbGlwSW50ZXJzZWN0aW9uOiBjbGlwcGluZy5udW1JbnRlcnNlY3Rpb24sXHJcblxyXG5cdFx0XHRkaXRoZXJpbmc6IG1hdGVyaWFsLmRpdGhlcmluZyxcclxuXHJcblx0XHRcdHNoYWRvd01hcEVuYWJsZWQ6IHJlbmRlcmVyLnNoYWRvd01hcC5lbmFibGVkICYmIHNoYWRvd3MubGVuZ3RoID4gMCxcclxuXHRcdFx0c2hhZG93TWFwVHlwZTogcmVuZGVyZXIuc2hhZG93TWFwLnR5cGUsXHJcblxyXG5cdFx0XHR0b25lTWFwcGluZzogdG9uZU1hcHBpbmcsXHJcblxyXG5cdFx0XHRkZWNvZGVWaWRlb1RleHR1cmU6IEhBU19NQVAgJiYgKCBtYXRlcmlhbC5tYXAuaXNWaWRlb1RleHR1cmUgPT09IHRydWUgKSAmJiAoIENvbG9yTWFuYWdlbWVudC5nZXRUcmFuc2ZlciggbWF0ZXJpYWwubWFwLmNvbG9yU3BhY2UgKSA9PT0gU1JHQlRyYW5zZmVyICksXHJcblx0XHRcdGRlY29kZVZpZGVvVGV4dHVyZUVtaXNzaXZlOiBIQVNfRU1JU1NJVkVNQVAgJiYgKCBtYXRlcmlhbC5lbWlzc2l2ZU1hcC5pc1ZpZGVvVGV4dHVyZSA9PT0gdHJ1ZSApICYmICggQ29sb3JNYW5hZ2VtZW50LmdldFRyYW5zZmVyKCBtYXRlcmlhbC5lbWlzc2l2ZU1hcC5jb2xvclNwYWNlICkgPT09IFNSR0JUcmFuc2ZlciApLFxyXG5cclxuXHRcdFx0cHJlbXVsdGlwbGllZEFscGhhOiBtYXRlcmlhbC5wcmVtdWx0aXBsaWVkQWxwaGEsXHJcblxyXG5cdFx0XHRkb3VibGVTaWRlZDogbWF0ZXJpYWwuc2lkZSA9PT0gRG91YmxlU2lkZSxcclxuXHRcdFx0ZmxpcFNpZGVkOiBtYXRlcmlhbC5zaWRlID09PSBCYWNrU2lkZSxcclxuXHJcblx0XHRcdHVzZURlcHRoUGFja2luZzogbWF0ZXJpYWwuZGVwdGhQYWNraW5nID49IDAsXHJcblx0XHRcdGRlcHRoUGFja2luZzogbWF0ZXJpYWwuZGVwdGhQYWNraW5nIHx8IDAsXHJcblxyXG5cdFx0XHRpbmRleDBBdHRyaWJ1dGVOYW1lOiBtYXRlcmlhbC5pbmRleDBBdHRyaWJ1dGVOYW1lLFxyXG5cclxuXHRcdFx0ZXh0ZW5zaW9uQ2xpcEN1bGxEaXN0YW5jZTogSEFTX0VYVEVOU0lPTlMgJiYgbWF0ZXJpYWwuZXh0ZW5zaW9ucy5jbGlwQ3VsbERpc3RhbmNlID09PSB0cnVlICYmIGV4dGVuc2lvbnMuaGFzKCAnV0VCR0xfY2xpcF9jdWxsX2Rpc3RhbmNlJyApLFxyXG5cdFx0XHRleHRlbnNpb25NdWx0aURyYXc6ICggSEFTX0VYVEVOU0lPTlMgJiYgbWF0ZXJpYWwuZXh0ZW5zaW9ucy5tdWx0aURyYXcgPT09IHRydWUgfHwgSVNfQkFUQ0hFRE1FU0ggKSAmJiBleHRlbnNpb25zLmhhcyggJ1dFQkdMX211bHRpX2RyYXcnICksXHJcblxyXG5cdFx0XHRyZW5kZXJlckV4dGVuc2lvblBhcmFsbGVsU2hhZGVyQ29tcGlsZTogZXh0ZW5zaW9ucy5oYXMoICdLSFJfcGFyYWxsZWxfc2hhZGVyX2NvbXBpbGUnICksXHJcblxyXG5cdFx0XHRjdXN0b21Qcm9ncmFtQ2FjaGVLZXk6IG1hdGVyaWFsLmN1c3RvbVByb2dyYW1DYWNoZUtleSgpXHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHQvLyB0aGUgdXNhZ2Ugb2YgZ2V0Q2hhbm5lbCgpIGRldGVybWluZXMgdGhlIGFjdGl2ZSB0ZXh0dXJlIGNoYW5uZWxzIGZvciB0aGlzIHNoYWRlclxyXG5cclxuXHRcdHBhcmFtZXRlcnMudmVydGV4VXYxcyA9IF9hY3RpdmVDaGFubmVscy5oYXMoIDEgKTtcclxuXHRcdHBhcmFtZXRlcnMudmVydGV4VXYycyA9IF9hY3RpdmVDaGFubmVscy5oYXMoIDIgKTtcclxuXHRcdHBhcmFtZXRlcnMudmVydGV4VXYzcyA9IF9hY3RpdmVDaGFubmVscy5oYXMoIDMgKTtcclxuXHJcblx0XHRfYWN0aXZlQ2hhbm5lbHMuY2xlYXIoKTtcclxuXHJcblx0XHRyZXR1cm4gcGFyYW1ldGVycztcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBnZXRQcm9ncmFtQ2FjaGVLZXkoIHBhcmFtZXRlcnMgKSB7XHJcblxyXG5cdFx0Y29uc3QgYXJyYXkgPSBbXTtcclxuXHJcblx0XHRpZiAoIHBhcmFtZXRlcnMuc2hhZGVySUQgKSB7XHJcblxyXG5cdFx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLnNoYWRlcklEICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGFycmF5LnB1c2goIHBhcmFtZXRlcnMuY3VzdG9tVmVydGV4U2hhZGVySUQgKTtcclxuXHRcdFx0YXJyYXkucHVzaCggcGFyYW1ldGVycy5jdXN0b21GcmFnbWVudFNoYWRlcklEICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggcGFyYW1ldGVycy5kZWZpbmVzICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBjb25zdCBuYW1lIGluIHBhcmFtZXRlcnMuZGVmaW5lcyApIHtcclxuXHJcblx0XHRcdFx0YXJyYXkucHVzaCggbmFtZSApO1xyXG5cdFx0XHRcdGFycmF5LnB1c2goIHBhcmFtZXRlcnMuZGVmaW5lc1sgbmFtZSBdICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggcGFyYW1ldGVycy5pc1Jhd1NoYWRlck1hdGVyaWFsID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdGdldFByb2dyYW1DYWNoZUtleVBhcmFtZXRlcnMoIGFycmF5LCBwYXJhbWV0ZXJzICk7XHJcblx0XHRcdGdldFByb2dyYW1DYWNoZUtleUJvb2xlYW5zKCBhcnJheSwgcGFyYW1ldGVycyApO1xyXG5cdFx0XHRhcnJheS5wdXNoKCByZW5kZXJlci5vdXRwdXRDb2xvclNwYWNlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGFycmF5LnB1c2goIHBhcmFtZXRlcnMuY3VzdG9tUHJvZ3JhbUNhY2hlS2V5ICk7XHJcblxyXG5cdFx0cmV0dXJuIGFycmF5LmpvaW4oKTtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBnZXRQcm9ncmFtQ2FjaGVLZXlQYXJhbWV0ZXJzKCBhcnJheSwgcGFyYW1ldGVycyApIHtcclxuXHJcblx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLnByZWNpc2lvbiApO1xyXG5cdFx0YXJyYXkucHVzaCggcGFyYW1ldGVycy5vdXRwdXRDb2xvclNwYWNlICk7XHJcblx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLmVudk1hcE1vZGUgKTtcclxuXHRcdGFycmF5LnB1c2goIHBhcmFtZXRlcnMuZW52TWFwQ3ViZVVWSGVpZ2h0ICk7XHJcblx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLm1hcFV2ICk7XHJcblx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLmFscGhhTWFwVXYgKTtcclxuXHRcdGFycmF5LnB1c2goIHBhcmFtZXRlcnMubGlnaHRNYXBVdiApO1xyXG5cdFx0YXJyYXkucHVzaCggcGFyYW1ldGVycy5hb01hcFV2ICk7XHJcblx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLmJ1bXBNYXBVdiApO1xyXG5cdFx0YXJyYXkucHVzaCggcGFyYW1ldGVycy5ub3JtYWxNYXBVdiApO1xyXG5cdFx0YXJyYXkucHVzaCggcGFyYW1ldGVycy5kaXNwbGFjZW1lbnRNYXBVdiApO1xyXG5cdFx0YXJyYXkucHVzaCggcGFyYW1ldGVycy5lbWlzc2l2ZU1hcFV2ICk7XHJcblx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLm1ldGFsbmVzc01hcFV2ICk7XHJcblx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLnJvdWdobmVzc01hcFV2ICk7XHJcblx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLmFuaXNvdHJvcHlNYXBVdiApO1xyXG5cdFx0YXJyYXkucHVzaCggcGFyYW1ldGVycy5jbGVhcmNvYXRNYXBVdiApO1xyXG5cdFx0YXJyYXkucHVzaCggcGFyYW1ldGVycy5jbGVhcmNvYXROb3JtYWxNYXBVdiApO1xyXG5cdFx0YXJyYXkucHVzaCggcGFyYW1ldGVycy5jbGVhcmNvYXRSb3VnaG5lc3NNYXBVdiApO1xyXG5cdFx0YXJyYXkucHVzaCggcGFyYW1ldGVycy5pcmlkZXNjZW5jZU1hcFV2ICk7XHJcblx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwVXYgKTtcclxuXHRcdGFycmF5LnB1c2goIHBhcmFtZXRlcnMuc2hlZW5Db2xvck1hcFV2ICk7XHJcblx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLnNoZWVuUm91Z2huZXNzTWFwVXYgKTtcclxuXHRcdGFycmF5LnB1c2goIHBhcmFtZXRlcnMuc3BlY3VsYXJNYXBVdiApO1xyXG5cdFx0YXJyYXkucHVzaCggcGFyYW1ldGVycy5zcGVjdWxhckNvbG9yTWFwVXYgKTtcclxuXHRcdGFycmF5LnB1c2goIHBhcmFtZXRlcnMuc3BlY3VsYXJJbnRlbnNpdHlNYXBVdiApO1xyXG5cdFx0YXJyYXkucHVzaCggcGFyYW1ldGVycy50cmFuc21pc3Npb25NYXBVdiApO1xyXG5cdFx0YXJyYXkucHVzaCggcGFyYW1ldGVycy50aGlja25lc3NNYXBVdiApO1xyXG5cdFx0YXJyYXkucHVzaCggcGFyYW1ldGVycy5jb21iaW5lICk7XHJcblx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLmZvZ0V4cDIgKTtcclxuXHRcdGFycmF5LnB1c2goIHBhcmFtZXRlcnMuc2l6ZUF0dGVudWF0aW9uICk7XHJcblx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLm1vcnBoVGFyZ2V0c0NvdW50ICk7XHJcblx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLm1vcnBoQXR0cmlidXRlQ291bnQgKTtcclxuXHRcdGFycmF5LnB1c2goIHBhcmFtZXRlcnMubnVtRGlyTGlnaHRzICk7XHJcblx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLm51bVBvaW50TGlnaHRzICk7XHJcblx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLm51bVNwb3RMaWdodHMgKTtcclxuXHRcdGFycmF5LnB1c2goIHBhcmFtZXRlcnMubnVtU3BvdExpZ2h0TWFwcyApO1xyXG5cdFx0YXJyYXkucHVzaCggcGFyYW1ldGVycy5udW1IZW1pTGlnaHRzICk7XHJcblx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLm51bVJlY3RBcmVhTGlnaHRzICk7XHJcblx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLm51bURpckxpZ2h0U2hhZG93cyApO1xyXG5cdFx0YXJyYXkucHVzaCggcGFyYW1ldGVycy5udW1Qb2ludExpZ2h0U2hhZG93cyApO1xyXG5cdFx0YXJyYXkucHVzaCggcGFyYW1ldGVycy5udW1TcG90TGlnaHRTaGFkb3dzICk7XHJcblx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLm51bVNwb3RMaWdodFNoYWRvd3NXaXRoTWFwcyApO1xyXG5cdFx0YXJyYXkucHVzaCggcGFyYW1ldGVycy5udW1MaWdodFByb2JlcyApO1xyXG5cdFx0YXJyYXkucHVzaCggcGFyYW1ldGVycy5zaGFkb3dNYXBUeXBlICk7XHJcblx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLnRvbmVNYXBwaW5nICk7XHJcblx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLm51bUNsaXBwaW5nUGxhbmVzICk7XHJcblx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLm51bUNsaXBJbnRlcnNlY3Rpb24gKTtcclxuXHRcdGFycmF5LnB1c2goIHBhcmFtZXRlcnMuZGVwdGhQYWNraW5nICk7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gZ2V0UHJvZ3JhbUNhY2hlS2V5Qm9vbGVhbnMoIGFycmF5LCBwYXJhbWV0ZXJzICkge1xyXG5cclxuXHRcdF9wcm9ncmFtTGF5ZXJzLmRpc2FibGVBbGwoKTtcclxuXHJcblx0XHRpZiAoIHBhcmFtZXRlcnMuc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcyApXHJcblx0XHRcdF9wcm9ncmFtTGF5ZXJzLmVuYWJsZSggMCApO1xyXG5cdFx0aWYgKCBwYXJhbWV0ZXJzLmluc3RhbmNpbmcgKVxyXG5cdFx0XHRfcHJvZ3JhbUxheWVycy5lbmFibGUoIDEgKTtcclxuXHRcdGlmICggcGFyYW1ldGVycy5pbnN0YW5jaW5nQ29sb3IgKVxyXG5cdFx0XHRfcHJvZ3JhbUxheWVycy5lbmFibGUoIDIgKTtcclxuXHRcdGlmICggcGFyYW1ldGVycy5pbnN0YW5jaW5nTW9ycGggKVxyXG5cdFx0XHRfcHJvZ3JhbUxheWVycy5lbmFibGUoIDMgKTtcclxuXHRcdGlmICggcGFyYW1ldGVycy5tYXRjYXAgKVxyXG5cdFx0XHRfcHJvZ3JhbUxheWVycy5lbmFibGUoIDQgKTtcclxuXHRcdGlmICggcGFyYW1ldGVycy5lbnZNYXAgKVxyXG5cdFx0XHRfcHJvZ3JhbUxheWVycy5lbmFibGUoIDUgKTtcclxuXHRcdGlmICggcGFyYW1ldGVycy5ub3JtYWxNYXBPYmplY3RTcGFjZSApXHJcblx0XHRcdF9wcm9ncmFtTGF5ZXJzLmVuYWJsZSggNiApO1xyXG5cdFx0aWYgKCBwYXJhbWV0ZXJzLm5vcm1hbE1hcFRhbmdlbnRTcGFjZSApXHJcblx0XHRcdF9wcm9ncmFtTGF5ZXJzLmVuYWJsZSggNyApO1xyXG5cdFx0aWYgKCBwYXJhbWV0ZXJzLmNsZWFyY29hdCApXHJcblx0XHRcdF9wcm9ncmFtTGF5ZXJzLmVuYWJsZSggOCApO1xyXG5cdFx0aWYgKCBwYXJhbWV0ZXJzLmlyaWRlc2NlbmNlIClcclxuXHRcdFx0X3Byb2dyYW1MYXllcnMuZW5hYmxlKCA5ICk7XHJcblx0XHRpZiAoIHBhcmFtZXRlcnMuYWxwaGFUZXN0IClcclxuXHRcdFx0X3Byb2dyYW1MYXllcnMuZW5hYmxlKCAxMCApO1xyXG5cdFx0aWYgKCBwYXJhbWV0ZXJzLnZlcnRleENvbG9ycyApXHJcblx0XHRcdF9wcm9ncmFtTGF5ZXJzLmVuYWJsZSggMTEgKTtcclxuXHRcdGlmICggcGFyYW1ldGVycy52ZXJ0ZXhBbHBoYXMgKVxyXG5cdFx0XHRfcHJvZ3JhbUxheWVycy5lbmFibGUoIDEyICk7XHJcblx0XHRpZiAoIHBhcmFtZXRlcnMudmVydGV4VXYxcyApXHJcblx0XHRcdF9wcm9ncmFtTGF5ZXJzLmVuYWJsZSggMTMgKTtcclxuXHRcdGlmICggcGFyYW1ldGVycy52ZXJ0ZXhVdjJzIClcclxuXHRcdFx0X3Byb2dyYW1MYXllcnMuZW5hYmxlKCAxNCApO1xyXG5cdFx0aWYgKCBwYXJhbWV0ZXJzLnZlcnRleFV2M3MgKVxyXG5cdFx0XHRfcHJvZ3JhbUxheWVycy5lbmFibGUoIDE1ICk7XHJcblx0XHRpZiAoIHBhcmFtZXRlcnMudmVydGV4VGFuZ2VudHMgKVxyXG5cdFx0XHRfcHJvZ3JhbUxheWVycy5lbmFibGUoIDE2ICk7XHJcblx0XHRpZiAoIHBhcmFtZXRlcnMuYW5pc290cm9weSApXHJcblx0XHRcdF9wcm9ncmFtTGF5ZXJzLmVuYWJsZSggMTcgKTtcclxuXHRcdGlmICggcGFyYW1ldGVycy5hbHBoYUhhc2ggKVxyXG5cdFx0XHRfcHJvZ3JhbUxheWVycy5lbmFibGUoIDE4ICk7XHJcblx0XHRpZiAoIHBhcmFtZXRlcnMuYmF0Y2hpbmcgKVxyXG5cdFx0XHRfcHJvZ3JhbUxheWVycy5lbmFibGUoIDE5ICk7XHJcblx0XHRpZiAoIHBhcmFtZXRlcnMuZGlzcGVyc2lvbiApXHJcblx0XHRcdF9wcm9ncmFtTGF5ZXJzLmVuYWJsZSggMjAgKTtcclxuXHRcdGlmICggcGFyYW1ldGVycy5iYXRjaGluZ0NvbG9yIClcclxuXHRcdFx0X3Byb2dyYW1MYXllcnMuZW5hYmxlKCAyMSApO1xyXG5cclxuXHRcdGFycmF5LnB1c2goIF9wcm9ncmFtTGF5ZXJzLm1hc2sgKTtcclxuXHRcdF9wcm9ncmFtTGF5ZXJzLmRpc2FibGVBbGwoKTtcclxuXHJcblx0XHRpZiAoIHBhcmFtZXRlcnMuZm9nIClcclxuXHRcdFx0X3Byb2dyYW1MYXllcnMuZW5hYmxlKCAwICk7XHJcblx0XHRpZiAoIHBhcmFtZXRlcnMudXNlRm9nIClcclxuXHRcdFx0X3Byb2dyYW1MYXllcnMuZW5hYmxlKCAxICk7XHJcblx0XHRpZiAoIHBhcmFtZXRlcnMuZmxhdFNoYWRpbmcgKVxyXG5cdFx0XHRfcHJvZ3JhbUxheWVycy5lbmFibGUoIDIgKTtcclxuXHRcdGlmICggcGFyYW1ldGVycy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyIClcclxuXHRcdFx0X3Byb2dyYW1MYXllcnMuZW5hYmxlKCAzICk7XHJcblx0XHRpZiAoIHBhcmFtZXRlcnMucmV2ZXJzZURlcHRoQnVmZmVyIClcclxuXHRcdFx0X3Byb2dyYW1MYXllcnMuZW5hYmxlKCA0ICk7XHJcblx0XHRpZiAoIHBhcmFtZXRlcnMuc2tpbm5pbmcgKVxyXG5cdFx0XHRfcHJvZ3JhbUxheWVycy5lbmFibGUoIDUgKTtcclxuXHRcdGlmICggcGFyYW1ldGVycy5tb3JwaFRhcmdldHMgKVxyXG5cdFx0XHRfcHJvZ3JhbUxheWVycy5lbmFibGUoIDYgKTtcclxuXHRcdGlmICggcGFyYW1ldGVycy5tb3JwaE5vcm1hbHMgKVxyXG5cdFx0XHRfcHJvZ3JhbUxheWVycy5lbmFibGUoIDcgKTtcclxuXHRcdGlmICggcGFyYW1ldGVycy5tb3JwaENvbG9ycyApXHJcblx0XHRcdF9wcm9ncmFtTGF5ZXJzLmVuYWJsZSggOCApO1xyXG5cdFx0aWYgKCBwYXJhbWV0ZXJzLnByZW11bHRpcGxpZWRBbHBoYSApXHJcblx0XHRcdF9wcm9ncmFtTGF5ZXJzLmVuYWJsZSggOSApO1xyXG5cdFx0aWYgKCBwYXJhbWV0ZXJzLnNoYWRvd01hcEVuYWJsZWQgKVxyXG5cdFx0XHRfcHJvZ3JhbUxheWVycy5lbmFibGUoIDEwICk7XHJcblx0XHRpZiAoIHBhcmFtZXRlcnMuZG91YmxlU2lkZWQgKVxyXG5cdFx0XHRfcHJvZ3JhbUxheWVycy5lbmFibGUoIDExICk7XHJcblx0XHRpZiAoIHBhcmFtZXRlcnMuZmxpcFNpZGVkIClcclxuXHRcdFx0X3Byb2dyYW1MYXllcnMuZW5hYmxlKCAxMiApO1xyXG5cdFx0aWYgKCBwYXJhbWV0ZXJzLnVzZURlcHRoUGFja2luZyApXHJcblx0XHRcdF9wcm9ncmFtTGF5ZXJzLmVuYWJsZSggMTMgKTtcclxuXHRcdGlmICggcGFyYW1ldGVycy5kaXRoZXJpbmcgKVxyXG5cdFx0XHRfcHJvZ3JhbUxheWVycy5lbmFibGUoIDE0ICk7XHJcblx0XHRpZiAoIHBhcmFtZXRlcnMudHJhbnNtaXNzaW9uIClcclxuXHRcdFx0X3Byb2dyYW1MYXllcnMuZW5hYmxlKCAxNSApO1xyXG5cdFx0aWYgKCBwYXJhbWV0ZXJzLnNoZWVuIClcclxuXHRcdFx0X3Byb2dyYW1MYXllcnMuZW5hYmxlKCAxNiApO1xyXG5cdFx0aWYgKCBwYXJhbWV0ZXJzLm9wYXF1ZSApXHJcblx0XHRcdF9wcm9ncmFtTGF5ZXJzLmVuYWJsZSggMTcgKTtcclxuXHRcdGlmICggcGFyYW1ldGVycy5wb2ludHNVdnMgKVxyXG5cdFx0XHRfcHJvZ3JhbUxheWVycy5lbmFibGUoIDE4ICk7XHJcblx0XHRpZiAoIHBhcmFtZXRlcnMuZGVjb2RlVmlkZW9UZXh0dXJlIClcclxuXHRcdFx0X3Byb2dyYW1MYXllcnMuZW5hYmxlKCAxOSApO1xyXG5cdFx0aWYgKCBwYXJhbWV0ZXJzLmRlY29kZVZpZGVvVGV4dHVyZUVtaXNzaXZlIClcclxuXHRcdFx0X3Byb2dyYW1MYXllcnMuZW5hYmxlKCAyMCApO1xyXG5cdFx0aWYgKCBwYXJhbWV0ZXJzLmFscGhhVG9Db3ZlcmFnZSApXHJcblx0XHRcdF9wcm9ncmFtTGF5ZXJzLmVuYWJsZSggMjEgKTtcclxuXHJcblx0XHRhcnJheS5wdXNoKCBfcHJvZ3JhbUxheWVycy5tYXNrICk7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gZ2V0VW5pZm9ybXMoIG1hdGVyaWFsICkge1xyXG5cclxuXHRcdGNvbnN0IHNoYWRlcklEID0gc2hhZGVySURzWyBtYXRlcmlhbC50eXBlIF07XHJcblx0XHRsZXQgdW5pZm9ybXM7XHJcblxyXG5cdFx0aWYgKCBzaGFkZXJJRCApIHtcclxuXHJcblx0XHRcdGNvbnN0IHNoYWRlciA9IFNoYWRlckxpYlsgc2hhZGVySUQgXTtcclxuXHRcdFx0dW5pZm9ybXMgPSBVbmlmb3Jtc1V0aWxzLmNsb25lKCBzaGFkZXIudW5pZm9ybXMgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dW5pZm9ybXMgPSBtYXRlcmlhbC51bmlmb3JtcztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHVuaWZvcm1zO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGFjcXVpcmVQcm9ncmFtKCBwYXJhbWV0ZXJzLCBjYWNoZUtleSApIHtcclxuXHJcblx0XHRsZXQgcHJvZ3JhbTtcclxuXHJcblx0XHQvLyBDaGVjayBpZiBjb2RlIGhhcyBiZWVuIGFscmVhZHkgY29tcGlsZWRcclxuXHRcdGZvciAoIGxldCBwID0gMCwgcGwgPSBwcm9ncmFtcy5sZW5ndGg7IHAgPCBwbDsgcCArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHByZWV4aXN0aW5nUHJvZ3JhbSA9IHByb2dyYW1zWyBwIF07XHJcblxyXG5cdFx0XHRpZiAoIHByZWV4aXN0aW5nUHJvZ3JhbS5jYWNoZUtleSA9PT0gY2FjaGVLZXkgKSB7XHJcblxyXG5cdFx0XHRcdHByb2dyYW0gPSBwcmVleGlzdGluZ1Byb2dyYW07XHJcblx0XHRcdFx0KysgcHJvZ3JhbS51c2VkVGltZXM7XHJcblxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHByb2dyYW0gPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHByb2dyYW0gPSBuZXcgV2ViR0xQcm9ncmFtKCByZW5kZXJlciwgY2FjaGVLZXksIHBhcmFtZXRlcnMsIGJpbmRpbmdTdGF0ZXMgKTtcclxuXHRcdFx0cHJvZ3JhbXMucHVzaCggcHJvZ3JhbSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcHJvZ3JhbTtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiByZWxlYXNlUHJvZ3JhbSggcHJvZ3JhbSApIHtcclxuXHJcblx0XHRpZiAoIC0tIHByb2dyYW0udXNlZFRpbWVzID09PSAwICkge1xyXG5cclxuXHRcdFx0Ly8gUmVtb3ZlIGZyb20gdW5vcmRlcmVkIHNldFxyXG5cdFx0XHRjb25zdCBpID0gcHJvZ3JhbXMuaW5kZXhPZiggcHJvZ3JhbSApO1xyXG5cdFx0XHRwcm9ncmFtc1sgaSBdID0gcHJvZ3JhbXNbIHByb2dyYW1zLmxlbmd0aCAtIDEgXTtcclxuXHRcdFx0cHJvZ3JhbXMucG9wKCk7XHJcblxyXG5cdFx0XHQvLyBGcmVlIFdlYkdMIHJlc291cmNlc1xyXG5cdFx0XHRwcm9ncmFtLmRlc3Ryb3koKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gcmVsZWFzZVNoYWRlckNhY2hlKCBtYXRlcmlhbCApIHtcclxuXHJcblx0XHRfY3VzdG9tU2hhZGVycy5yZW1vdmUoIG1hdGVyaWFsICk7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gZGlzcG9zZSgpIHtcclxuXHJcblx0XHRfY3VzdG9tU2hhZGVycy5kaXNwb3NlKCk7XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIHtcclxuXHRcdGdldFBhcmFtZXRlcnM6IGdldFBhcmFtZXRlcnMsXHJcblx0XHRnZXRQcm9ncmFtQ2FjaGVLZXk6IGdldFByb2dyYW1DYWNoZUtleSxcclxuXHRcdGdldFVuaWZvcm1zOiBnZXRVbmlmb3JtcyxcclxuXHRcdGFjcXVpcmVQcm9ncmFtOiBhY3F1aXJlUHJvZ3JhbSxcclxuXHRcdHJlbGVhc2VQcm9ncmFtOiByZWxlYXNlUHJvZ3JhbSxcclxuXHRcdHJlbGVhc2VTaGFkZXJDYWNoZTogcmVsZWFzZVNoYWRlckNhY2hlLFxyXG5cdFx0Ly8gRXhwb3NlZCBmb3IgcmVzb3VyY2UgbW9uaXRvcmluZyAmIGVycm9yIGZlZWRiYWNrIHZpYSByZW5kZXJlci5pbmZvOlxyXG5cdFx0cHJvZ3JhbXM6IHByb2dyYW1zLFxyXG5cdFx0ZGlzcG9zZTogZGlzcG9zZVxyXG5cdH07XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBXZWJHTFByb2dyYW1zIH07XHJcbiIsImZ1bmN0aW9uIFdlYkdMUHJvcGVydGllcygpIHtcclxuXHJcblx0bGV0IHByb3BlcnRpZXMgPSBuZXcgV2Vha01hcCgpO1xyXG5cclxuXHRmdW5jdGlvbiBoYXMoIG9iamVjdCApIHtcclxuXHJcblx0XHRyZXR1cm4gcHJvcGVydGllcy5oYXMoIG9iamVjdCApO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGdldCggb2JqZWN0ICkge1xyXG5cclxuXHRcdGxldCBtYXAgPSBwcm9wZXJ0aWVzLmdldCggb2JqZWN0ICk7XHJcblxyXG5cdFx0aWYgKCBtYXAgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdG1hcCA9IHt9O1xyXG5cdFx0XHRwcm9wZXJ0aWVzLnNldCggb2JqZWN0LCBtYXAgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG1hcDtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiByZW1vdmUoIG9iamVjdCApIHtcclxuXHJcblx0XHRwcm9wZXJ0aWVzLmRlbGV0ZSggb2JqZWN0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gdXBkYXRlKCBvYmplY3QsIGtleSwgdmFsdWUgKSB7XHJcblxyXG5cdFx0cHJvcGVydGllcy5nZXQoIG9iamVjdCApWyBrZXkgXSA9IHZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0cHJvcGVydGllcyA9IG5ldyBXZWFrTWFwKCk7XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIHtcclxuXHRcdGhhczogaGFzLFxyXG5cdFx0Z2V0OiBnZXQsXHJcblx0XHRyZW1vdmU6IHJlbW92ZSxcclxuXHRcdHVwZGF0ZTogdXBkYXRlLFxyXG5cdFx0ZGlzcG9zZTogZGlzcG9zZVxyXG5cdH07XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgV2ViR0xQcm9wZXJ0aWVzIH07XHJcbiIsImZ1bmN0aW9uIHBhaW50ZXJTb3J0U3RhYmxlKCBhLCBiICkge1xyXG5cclxuXHRpZiAoIGEuZ3JvdXBPcmRlciAhPT0gYi5ncm91cE9yZGVyICkge1xyXG5cclxuXHRcdHJldHVybiBhLmdyb3VwT3JkZXIgLSBiLmdyb3VwT3JkZXI7XHJcblxyXG5cdH0gZWxzZSBpZiAoIGEucmVuZGVyT3JkZXIgIT09IGIucmVuZGVyT3JkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIGEucmVuZGVyT3JkZXIgLSBiLnJlbmRlck9yZGVyO1xyXG5cclxuXHR9IGVsc2UgaWYgKCBhLm1hdGVyaWFsLmlkICE9PSBiLm1hdGVyaWFsLmlkICkge1xyXG5cclxuXHRcdHJldHVybiBhLm1hdGVyaWFsLmlkIC0gYi5tYXRlcmlhbC5pZDtcclxuXHJcblx0fSBlbHNlIGlmICggYS56ICE9PSBiLnogKSB7XHJcblxyXG5cdFx0cmV0dXJuIGEueiAtIGIuejtcclxuXHJcblx0fSBlbHNlIHtcclxuXHJcblx0XHRyZXR1cm4gYS5pZCAtIGIuaWQ7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJldmVyc2VQYWludGVyU29ydFN0YWJsZSggYSwgYiApIHtcclxuXHJcblx0aWYgKCBhLmdyb3VwT3JkZXIgIT09IGIuZ3JvdXBPcmRlciApIHtcclxuXHJcblx0XHRyZXR1cm4gYS5ncm91cE9yZGVyIC0gYi5ncm91cE9yZGVyO1xyXG5cclxuXHR9IGVsc2UgaWYgKCBhLnJlbmRlck9yZGVyICE9PSBiLnJlbmRlck9yZGVyICkge1xyXG5cclxuXHRcdHJldHVybiBhLnJlbmRlck9yZGVyIC0gYi5yZW5kZXJPcmRlcjtcclxuXHJcblx0fSBlbHNlIGlmICggYS56ICE9PSBiLnogKSB7XHJcblxyXG5cdFx0cmV0dXJuIGIueiAtIGEuejtcclxuXHJcblx0fSBlbHNlIHtcclxuXHJcblx0XHRyZXR1cm4gYS5pZCAtIGIuaWQ7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblxyXG5mdW5jdGlvbiBXZWJHTFJlbmRlckxpc3QoKSB7XHJcblxyXG5cdGNvbnN0IHJlbmRlckl0ZW1zID0gW107XHJcblx0bGV0IHJlbmRlckl0ZW1zSW5kZXggPSAwO1xyXG5cclxuXHRjb25zdCBvcGFxdWUgPSBbXTtcclxuXHRjb25zdCB0cmFuc21pc3NpdmUgPSBbXTtcclxuXHRjb25zdCB0cmFuc3BhcmVudCA9IFtdO1xyXG5cclxuXHRmdW5jdGlvbiBpbml0KCkge1xyXG5cclxuXHRcdHJlbmRlckl0ZW1zSW5kZXggPSAwO1xyXG5cclxuXHRcdG9wYXF1ZS5sZW5ndGggPSAwO1xyXG5cdFx0dHJhbnNtaXNzaXZlLmxlbmd0aCA9IDA7XHJcblx0XHR0cmFuc3BhcmVudC5sZW5ndGggPSAwO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGdldE5leHRSZW5kZXJJdGVtKCBvYmplY3QsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXBPcmRlciwgeiwgZ3JvdXAgKSB7XHJcblxyXG5cdFx0bGV0IHJlbmRlckl0ZW0gPSByZW5kZXJJdGVtc1sgcmVuZGVySXRlbXNJbmRleCBdO1xyXG5cclxuXHRcdGlmICggcmVuZGVySXRlbSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0cmVuZGVySXRlbSA9IHtcclxuXHRcdFx0XHRpZDogb2JqZWN0LmlkLFxyXG5cdFx0XHRcdG9iamVjdDogb2JqZWN0LFxyXG5cdFx0XHRcdGdlb21ldHJ5OiBnZW9tZXRyeSxcclxuXHRcdFx0XHRtYXRlcmlhbDogbWF0ZXJpYWwsXHJcblx0XHRcdFx0Z3JvdXBPcmRlcjogZ3JvdXBPcmRlcixcclxuXHRcdFx0XHRyZW5kZXJPcmRlcjogb2JqZWN0LnJlbmRlck9yZGVyLFxyXG5cdFx0XHRcdHo6IHosXHJcblx0XHRcdFx0Z3JvdXA6IGdyb3VwXHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHRyZW5kZXJJdGVtc1sgcmVuZGVySXRlbXNJbmRleCBdID0gcmVuZGVySXRlbTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0cmVuZGVySXRlbS5pZCA9IG9iamVjdC5pZDtcclxuXHRcdFx0cmVuZGVySXRlbS5vYmplY3QgPSBvYmplY3Q7XHJcblx0XHRcdHJlbmRlckl0ZW0uZ2VvbWV0cnkgPSBnZW9tZXRyeTtcclxuXHRcdFx0cmVuZGVySXRlbS5tYXRlcmlhbCA9IG1hdGVyaWFsO1xyXG5cdFx0XHRyZW5kZXJJdGVtLmdyb3VwT3JkZXIgPSBncm91cE9yZGVyO1xyXG5cdFx0XHRyZW5kZXJJdGVtLnJlbmRlck9yZGVyID0gb2JqZWN0LnJlbmRlck9yZGVyO1xyXG5cdFx0XHRyZW5kZXJJdGVtLnogPSB6O1xyXG5cdFx0XHRyZW5kZXJJdGVtLmdyb3VwID0gZ3JvdXA7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJlbmRlckl0ZW1zSW5kZXggKys7XHJcblxyXG5cdFx0cmV0dXJuIHJlbmRlckl0ZW07XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gcHVzaCggb2JqZWN0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwT3JkZXIsIHosIGdyb3VwICkge1xyXG5cclxuXHRcdGNvbnN0IHJlbmRlckl0ZW0gPSBnZXROZXh0UmVuZGVySXRlbSggb2JqZWN0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwT3JkZXIsIHosIGdyb3VwICk7XHJcblxyXG5cdFx0aWYgKCBtYXRlcmlhbC50cmFuc21pc3Npb24gPiAwLjAgKSB7XHJcblxyXG5cdFx0XHR0cmFuc21pc3NpdmUucHVzaCggcmVuZGVySXRlbSApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLnRyYW5zcGFyZW50ID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0dHJhbnNwYXJlbnQucHVzaCggcmVuZGVySXRlbSApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRvcGFxdWUucHVzaCggcmVuZGVySXRlbSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiB1bnNoaWZ0KCBvYmplY3QsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXBPcmRlciwgeiwgZ3JvdXAgKSB7XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVySXRlbSA9IGdldE5leHRSZW5kZXJJdGVtKCBvYmplY3QsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXBPcmRlciwgeiwgZ3JvdXAgKTtcclxuXHJcblx0XHRpZiAoIG1hdGVyaWFsLnRyYW5zbWlzc2lvbiA+IDAuMCApIHtcclxuXHJcblx0XHRcdHRyYW5zbWlzc2l2ZS51bnNoaWZ0KCByZW5kZXJJdGVtICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwudHJhbnNwYXJlbnQgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHR0cmFuc3BhcmVudC51bnNoaWZ0KCByZW5kZXJJdGVtICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdG9wYXF1ZS51bnNoaWZ0KCByZW5kZXJJdGVtICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHNvcnQoIGN1c3RvbU9wYXF1ZVNvcnQsIGN1c3RvbVRyYW5zcGFyZW50U29ydCApIHtcclxuXHJcblx0XHRpZiAoIG9wYXF1ZS5sZW5ndGggPiAxICkgb3BhcXVlLnNvcnQoIGN1c3RvbU9wYXF1ZVNvcnQgfHwgcGFpbnRlclNvcnRTdGFibGUgKTtcclxuXHRcdGlmICggdHJhbnNtaXNzaXZlLmxlbmd0aCA+IDEgKSB0cmFuc21pc3NpdmUuc29ydCggY3VzdG9tVHJhbnNwYXJlbnRTb3J0IHx8IHJldmVyc2VQYWludGVyU29ydFN0YWJsZSApO1xyXG5cdFx0aWYgKCB0cmFuc3BhcmVudC5sZW5ndGggPiAxICkgdHJhbnNwYXJlbnQuc29ydCggY3VzdG9tVHJhbnNwYXJlbnRTb3J0IHx8IHJldmVyc2VQYWludGVyU29ydFN0YWJsZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGZpbmlzaCgpIHtcclxuXHJcblx0XHQvLyBDbGVhciByZWZlcmVuY2VzIGZyb20gaW5hY3RpdmUgcmVuZGVySXRlbXMgaW4gdGhlIGxpc3RcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IHJlbmRlckl0ZW1zSW5kZXgsIGlsID0gcmVuZGVySXRlbXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCByZW5kZXJJdGVtID0gcmVuZGVySXRlbXNbIGkgXTtcclxuXHJcblx0XHRcdGlmICggcmVuZGVySXRlbS5pZCA9PT0gbnVsbCApIGJyZWFrO1xyXG5cclxuXHRcdFx0cmVuZGVySXRlbS5pZCA9IG51bGw7XHJcblx0XHRcdHJlbmRlckl0ZW0ub2JqZWN0ID0gbnVsbDtcclxuXHRcdFx0cmVuZGVySXRlbS5nZW9tZXRyeSA9IG51bGw7XHJcblx0XHRcdHJlbmRlckl0ZW0ubWF0ZXJpYWwgPSBudWxsO1xyXG5cdFx0XHRyZW5kZXJJdGVtLmdyb3VwID0gbnVsbDtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIHtcclxuXHJcblx0XHRvcGFxdWU6IG9wYXF1ZSxcclxuXHRcdHRyYW5zbWlzc2l2ZTogdHJhbnNtaXNzaXZlLFxyXG5cdFx0dHJhbnNwYXJlbnQ6IHRyYW5zcGFyZW50LFxyXG5cclxuXHRcdGluaXQ6IGluaXQsXHJcblx0XHRwdXNoOiBwdXNoLFxyXG5cdFx0dW5zaGlmdDogdW5zaGlmdCxcclxuXHRcdGZpbmlzaDogZmluaXNoLFxyXG5cclxuXHRcdHNvcnQ6IHNvcnRcclxuXHR9O1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gV2ViR0xSZW5kZXJMaXN0cygpIHtcclxuXHJcblx0bGV0IGxpc3RzID0gbmV3IFdlYWtNYXAoKTtcclxuXHJcblx0ZnVuY3Rpb24gZ2V0KCBzY2VuZSwgcmVuZGVyQ2FsbERlcHRoICkge1xyXG5cclxuXHRcdGNvbnN0IGxpc3RBcnJheSA9IGxpc3RzLmdldCggc2NlbmUgKTtcclxuXHRcdGxldCBsaXN0O1xyXG5cclxuXHRcdGlmICggbGlzdEFycmF5ID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRsaXN0ID0gbmV3IFdlYkdMUmVuZGVyTGlzdCgpO1xyXG5cdFx0XHRsaXN0cy5zZXQoIHNjZW5lLCBbIGxpc3QgXSApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRpZiAoIHJlbmRlckNhbGxEZXB0aCA+PSBsaXN0QXJyYXkubGVuZ3RoICkge1xyXG5cclxuXHRcdFx0XHRsaXN0ID0gbmV3IFdlYkdMUmVuZGVyTGlzdCgpO1xyXG5cdFx0XHRcdGxpc3RBcnJheS5wdXNoKCBsaXN0ICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRsaXN0ID0gbGlzdEFycmF5WyByZW5kZXJDYWxsRGVwdGggXTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGxpc3Q7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gZGlzcG9zZSgpIHtcclxuXHJcblx0XHRsaXN0cyA9IG5ldyBXZWFrTWFwKCk7XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIHtcclxuXHRcdGdldDogZ2V0LFxyXG5cdFx0ZGlzcG9zZTogZGlzcG9zZVxyXG5cdH07XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgV2ViR0xSZW5kZXJMaXN0cywgV2ViR0xSZW5kZXJMaXN0IH07XHJcbiIsImltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vLi4vbWF0aC9Db2xvci5qcyc7XHJcbmltcG9ydCB7IE1hdHJpeDQgfSBmcm9tICcuLi8uLi9tYXRoL01hdHJpeDQuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IyLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcbmltcG9ydCB7IFVuaWZvcm1zTGliIH0gZnJvbSAnLi4vc2hhZGVycy9Vbmlmb3Jtc0xpYi5qcyc7XHJcblxyXG5mdW5jdGlvbiBVbmlmb3Jtc0NhY2hlKCkge1xyXG5cclxuXHRjb25zdCBsaWdodHMgPSB7fTtcclxuXHJcblx0cmV0dXJuIHtcclxuXHJcblx0XHRnZXQ6IGZ1bmN0aW9uICggbGlnaHQgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGxpZ2h0c1sgbGlnaHQuaWQgXSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gbGlnaHRzWyBsaWdodC5pZCBdO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0bGV0IHVuaWZvcm1zO1xyXG5cclxuXHRcdFx0c3dpdGNoICggbGlnaHQudHlwZSApIHtcclxuXHJcblx0XHRcdFx0Y2FzZSAnRGlyZWN0aW9uYWxMaWdodCc6XHJcblx0XHRcdFx0XHR1bmlmb3JtcyA9IHtcclxuXHRcdFx0XHRcdFx0ZGlyZWN0aW9uOiBuZXcgVmVjdG9yMygpLFxyXG5cdFx0XHRcdFx0XHRjb2xvcjogbmV3IENvbG9yKClcclxuXHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0Y2FzZSAnU3BvdExpZ2h0JzpcclxuXHRcdFx0XHRcdHVuaWZvcm1zID0ge1xyXG5cdFx0XHRcdFx0XHRwb3NpdGlvbjogbmV3IFZlY3RvcjMoKSxcclxuXHRcdFx0XHRcdFx0ZGlyZWN0aW9uOiBuZXcgVmVjdG9yMygpLFxyXG5cdFx0XHRcdFx0XHRjb2xvcjogbmV3IENvbG9yKCksXHJcblx0XHRcdFx0XHRcdGRpc3RhbmNlOiAwLFxyXG5cdFx0XHRcdFx0XHRjb25lQ29zOiAwLFxyXG5cdFx0XHRcdFx0XHRwZW51bWJyYUNvczogMCxcclxuXHRcdFx0XHRcdFx0ZGVjYXk6IDBcclxuXHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0Y2FzZSAnUG9pbnRMaWdodCc6XHJcblx0XHRcdFx0XHR1bmlmb3JtcyA9IHtcclxuXHRcdFx0XHRcdFx0cG9zaXRpb246IG5ldyBWZWN0b3IzKCksXHJcblx0XHRcdFx0XHRcdGNvbG9yOiBuZXcgQ29sb3IoKSxcclxuXHRcdFx0XHRcdFx0ZGlzdGFuY2U6IDAsXHJcblx0XHRcdFx0XHRcdGRlY2F5OiAwXHJcblx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdGNhc2UgJ0hlbWlzcGhlcmVMaWdodCc6XHJcblx0XHRcdFx0XHR1bmlmb3JtcyA9IHtcclxuXHRcdFx0XHRcdFx0ZGlyZWN0aW9uOiBuZXcgVmVjdG9yMygpLFxyXG5cdFx0XHRcdFx0XHRza3lDb2xvcjogbmV3IENvbG9yKCksXHJcblx0XHRcdFx0XHRcdGdyb3VuZENvbG9yOiBuZXcgQ29sb3IoKVxyXG5cdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRjYXNlICdSZWN0QXJlYUxpZ2h0JzpcclxuXHRcdFx0XHRcdHVuaWZvcm1zID0ge1xyXG5cdFx0XHRcdFx0XHRjb2xvcjogbmV3IENvbG9yKCksXHJcblx0XHRcdFx0XHRcdHBvc2l0aW9uOiBuZXcgVmVjdG9yMygpLFxyXG5cdFx0XHRcdFx0XHRoYWxmV2lkdGg6IG5ldyBWZWN0b3IzKCksXHJcblx0XHRcdFx0XHRcdGhhbGZIZWlnaHQ6IG5ldyBWZWN0b3IzKClcclxuXHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGxpZ2h0c1sgbGlnaHQuaWQgXSA9IHVuaWZvcm1zO1xyXG5cclxuXHRcdFx0cmV0dXJuIHVuaWZvcm1zO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fTtcclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIFNoYWRvd1VuaWZvcm1zQ2FjaGUoKSB7XHJcblxyXG5cdGNvbnN0IGxpZ2h0cyA9IHt9O1xyXG5cclxuXHRyZXR1cm4ge1xyXG5cclxuXHRcdGdldDogZnVuY3Rpb24gKCBsaWdodCApIHtcclxuXHJcblx0XHRcdGlmICggbGlnaHRzWyBsaWdodC5pZCBdICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdHJldHVybiBsaWdodHNbIGxpZ2h0LmlkIF07XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRsZXQgdW5pZm9ybXM7XHJcblxyXG5cdFx0XHRzd2l0Y2ggKCBsaWdodC50eXBlICkge1xyXG5cclxuXHRcdFx0XHRjYXNlICdEaXJlY3Rpb25hbExpZ2h0JzpcclxuXHRcdFx0XHRcdHVuaWZvcm1zID0ge1xyXG5cdFx0XHRcdFx0XHRzaGFkb3dJbnRlbnNpdHk6IDEsXHJcblx0XHRcdFx0XHRcdHNoYWRvd0JpYXM6IDAsXHJcblx0XHRcdFx0XHRcdHNoYWRvd05vcm1hbEJpYXM6IDAsXHJcblx0XHRcdFx0XHRcdHNoYWRvd1JhZGl1czogMSxcclxuXHRcdFx0XHRcdFx0c2hhZG93TWFwU2l6ZTogbmV3IFZlY3RvcjIoKVxyXG5cdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRjYXNlICdTcG90TGlnaHQnOlxyXG5cdFx0XHRcdFx0dW5pZm9ybXMgPSB7XHJcblx0XHRcdFx0XHRcdHNoYWRvd0ludGVuc2l0eTogMSxcclxuXHRcdFx0XHRcdFx0c2hhZG93QmlhczogMCxcclxuXHRcdFx0XHRcdFx0c2hhZG93Tm9ybWFsQmlhczogMCxcclxuXHRcdFx0XHRcdFx0c2hhZG93UmFkaXVzOiAxLFxyXG5cdFx0XHRcdFx0XHRzaGFkb3dNYXBTaXplOiBuZXcgVmVjdG9yMigpXHJcblx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdGNhc2UgJ1BvaW50TGlnaHQnOlxyXG5cdFx0XHRcdFx0dW5pZm9ybXMgPSB7XHJcblx0XHRcdFx0XHRcdHNoYWRvd0ludGVuc2l0eTogMSxcclxuXHRcdFx0XHRcdFx0c2hhZG93QmlhczogMCxcclxuXHRcdFx0XHRcdFx0c2hhZG93Tm9ybWFsQmlhczogMCxcclxuXHRcdFx0XHRcdFx0c2hhZG93UmFkaXVzOiAxLFxyXG5cdFx0XHRcdFx0XHRzaGFkb3dNYXBTaXplOiBuZXcgVmVjdG9yMigpLFxyXG5cdFx0XHRcdFx0XHRzaGFkb3dDYW1lcmFOZWFyOiAxLFxyXG5cdFx0XHRcdFx0XHRzaGFkb3dDYW1lcmFGYXI6IDEwMDBcclxuXHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0Ly8gVE9ETyAoYWJlbG5hdGlvbik6IHNldCBSZWN0QXJlYUxpZ2h0IHNoYWRvdyB1bmlmb3Jtc1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0bGlnaHRzWyBsaWdodC5pZCBdID0gdW5pZm9ybXM7XHJcblxyXG5cdFx0XHRyZXR1cm4gdW5pZm9ybXM7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9O1xyXG5cclxufVxyXG5cclxuXHJcblxyXG5sZXQgbmV4dFZlcnNpb24gPSAwO1xyXG5cclxuZnVuY3Rpb24gc2hhZG93Q2FzdGluZ0FuZFRleHR1cmluZ0xpZ2h0c0ZpcnN0KCBsaWdodEEsIGxpZ2h0QiApIHtcclxuXHJcblx0cmV0dXJuICggbGlnaHRCLmNhc3RTaGFkb3cgPyAyIDogMCApIC0gKCBsaWdodEEuY2FzdFNoYWRvdyA/IDIgOiAwICkgKyAoIGxpZ2h0Qi5tYXAgPyAxIDogMCApIC0gKCBsaWdodEEubWFwID8gMSA6IDAgKTtcclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIFdlYkdMTGlnaHRzKCBleHRlbnNpb25zICkge1xyXG5cclxuXHRjb25zdCBjYWNoZSA9IG5ldyBVbmlmb3Jtc0NhY2hlKCk7XHJcblxyXG5cdGNvbnN0IHNoYWRvd0NhY2hlID0gU2hhZG93VW5pZm9ybXNDYWNoZSgpO1xyXG5cclxuXHRjb25zdCBzdGF0ZSA9IHtcclxuXHJcblx0XHR2ZXJzaW9uOiAwLFxyXG5cclxuXHRcdGhhc2g6IHtcclxuXHRcdFx0ZGlyZWN0aW9uYWxMZW5ndGg6IC0gMSxcclxuXHRcdFx0cG9pbnRMZW5ndGg6IC0gMSxcclxuXHRcdFx0c3BvdExlbmd0aDogLSAxLFxyXG5cdFx0XHRyZWN0QXJlYUxlbmd0aDogLSAxLFxyXG5cdFx0XHRoZW1pTGVuZ3RoOiAtIDEsXHJcblxyXG5cdFx0XHRudW1EaXJlY3Rpb25hbFNoYWRvd3M6IC0gMSxcclxuXHRcdFx0bnVtUG9pbnRTaGFkb3dzOiAtIDEsXHJcblx0XHRcdG51bVNwb3RTaGFkb3dzOiAtIDEsXHJcblx0XHRcdG51bVNwb3RNYXBzOiAtIDEsXHJcblxyXG5cdFx0XHRudW1MaWdodFByb2JlczogLSAxXHJcblx0XHR9LFxyXG5cclxuXHRcdGFtYmllbnQ6IFsgMCwgMCwgMCBdLFxyXG5cdFx0cHJvYmU6IFtdLFxyXG5cdFx0ZGlyZWN0aW9uYWw6IFtdLFxyXG5cdFx0ZGlyZWN0aW9uYWxTaGFkb3c6IFtdLFxyXG5cdFx0ZGlyZWN0aW9uYWxTaGFkb3dNYXA6IFtdLFxyXG5cdFx0ZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXg6IFtdLFxyXG5cdFx0c3BvdDogW10sXHJcblx0XHRzcG90TGlnaHRNYXA6IFtdLFxyXG5cdFx0c3BvdFNoYWRvdzogW10sXHJcblx0XHRzcG90U2hhZG93TWFwOiBbXSxcclxuXHRcdHNwb3RMaWdodE1hdHJpeDogW10sXHJcblx0XHRyZWN0QXJlYTogW10sXHJcblx0XHRyZWN0QXJlYUxUQzE6IG51bGwsXHJcblx0XHRyZWN0QXJlYUxUQzI6IG51bGwsXHJcblx0XHRwb2ludDogW10sXHJcblx0XHRwb2ludFNoYWRvdzogW10sXHJcblx0XHRwb2ludFNoYWRvd01hcDogW10sXHJcblx0XHRwb2ludFNoYWRvd01hdHJpeDogW10sXHJcblx0XHRoZW1pOiBbXSxcclxuXHRcdG51bVNwb3RMaWdodFNoYWRvd3NXaXRoTWFwczogMCxcclxuXHRcdG51bUxpZ2h0UHJvYmVzOiAwXHJcblxyXG5cdH07XHJcblxyXG5cdGZvciAoIGxldCBpID0gMDsgaSA8IDk7IGkgKysgKSBzdGF0ZS5wcm9iZS5wdXNoKCBuZXcgVmVjdG9yMygpICk7XHJcblxyXG5cdGNvbnN0IHZlY3RvcjMgPSBuZXcgVmVjdG9yMygpO1xyXG5cdGNvbnN0IG1hdHJpeDQgPSBuZXcgTWF0cml4NCgpO1xyXG5cdGNvbnN0IG1hdHJpeDQyID0gbmV3IE1hdHJpeDQoKTtcclxuXHJcblx0ZnVuY3Rpb24gc2V0dXAoIGxpZ2h0cyApIHtcclxuXHJcblx0XHRsZXQgciA9IDAsIGcgPSAwLCBiID0gMDtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCA5OyBpICsrICkgc3RhdGUucHJvYmVbIGkgXS5zZXQoIDAsIDAsIDAgKTtcclxuXHJcblx0XHRsZXQgZGlyZWN0aW9uYWxMZW5ndGggPSAwO1xyXG5cdFx0bGV0IHBvaW50TGVuZ3RoID0gMDtcclxuXHRcdGxldCBzcG90TGVuZ3RoID0gMDtcclxuXHRcdGxldCByZWN0QXJlYUxlbmd0aCA9IDA7XHJcblx0XHRsZXQgaGVtaUxlbmd0aCA9IDA7XHJcblxyXG5cdFx0bGV0IG51bURpcmVjdGlvbmFsU2hhZG93cyA9IDA7XHJcblx0XHRsZXQgbnVtUG9pbnRTaGFkb3dzID0gMDtcclxuXHRcdGxldCBudW1TcG90U2hhZG93cyA9IDA7XHJcblx0XHRsZXQgbnVtU3BvdE1hcHMgPSAwO1xyXG5cdFx0bGV0IG51bVNwb3RTaGFkb3dzV2l0aE1hcHMgPSAwO1xyXG5cclxuXHRcdGxldCBudW1MaWdodFByb2JlcyA9IDA7XHJcblxyXG5cdFx0Ly8gb3JkZXJpbmcgOiBbc2hhZG93IGNhc3RpbmcgKyBtYXAgdGV4dHVyaW5nLCBtYXAgdGV4dHVyaW5nLCBzaGFkb3cgY2FzdGluZywgbm9uZSBdXHJcblx0XHRsaWdodHMuc29ydCggc2hhZG93Q2FzdGluZ0FuZFRleHR1cmluZ0xpZ2h0c0ZpcnN0ICk7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gbGlnaHRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBsaWdodCA9IGxpZ2h0c1sgaSBdO1xyXG5cclxuXHRcdFx0Y29uc3QgY29sb3IgPSBsaWdodC5jb2xvcjtcclxuXHRcdFx0Y29uc3QgaW50ZW5zaXR5ID0gbGlnaHQuaW50ZW5zaXR5O1xyXG5cdFx0XHRjb25zdCBkaXN0YW5jZSA9IGxpZ2h0LmRpc3RhbmNlO1xyXG5cclxuXHRcdFx0Y29uc3Qgc2hhZG93TWFwID0gKCBsaWdodC5zaGFkb3cgJiYgbGlnaHQuc2hhZG93Lm1hcCApID8gbGlnaHQuc2hhZG93Lm1hcC50ZXh0dXJlIDogbnVsbDtcclxuXHJcblx0XHRcdGlmICggbGlnaHQuaXNBbWJpZW50TGlnaHQgKSB7XHJcblxyXG5cdFx0XHRcdHIgKz0gY29sb3IuciAqIGludGVuc2l0eTtcclxuXHRcdFx0XHRnICs9IGNvbG9yLmcgKiBpbnRlbnNpdHk7XHJcblx0XHRcdFx0YiArPSBjb2xvci5iICogaW50ZW5zaXR5O1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggbGlnaHQuaXNMaWdodFByb2JlICkge1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaiA9IDA7IGogPCA5OyBqICsrICkge1xyXG5cclxuXHRcdFx0XHRcdHN0YXRlLnByb2JlWyBqIF0uYWRkU2NhbGVkVmVjdG9yKCBsaWdodC5zaC5jb2VmZmljaWVudHNbIGogXSwgaW50ZW5zaXR5ICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0bnVtTGlnaHRQcm9iZXMgKys7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBsaWdodC5pc0RpcmVjdGlvbmFsTGlnaHQgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHVuaWZvcm1zID0gY2FjaGUuZ2V0KCBsaWdodCApO1xyXG5cclxuXHRcdFx0XHR1bmlmb3Jtcy5jb2xvci5jb3B5KCBsaWdodC5jb2xvciApLm11bHRpcGx5U2NhbGFyKCBsaWdodC5pbnRlbnNpdHkgKTtcclxuXHJcblx0XHRcdFx0aWYgKCBsaWdodC5jYXN0U2hhZG93ICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHNoYWRvdyA9IGxpZ2h0LnNoYWRvdztcclxuXHJcblx0XHRcdFx0XHRjb25zdCBzaGFkb3dVbmlmb3JtcyA9IHNoYWRvd0NhY2hlLmdldCggbGlnaHQgKTtcclxuXHJcblx0XHRcdFx0XHRzaGFkb3dVbmlmb3Jtcy5zaGFkb3dJbnRlbnNpdHkgPSBzaGFkb3cuaW50ZW5zaXR5O1xyXG5cdFx0XHRcdFx0c2hhZG93VW5pZm9ybXMuc2hhZG93QmlhcyA9IHNoYWRvdy5iaWFzO1xyXG5cdFx0XHRcdFx0c2hhZG93VW5pZm9ybXMuc2hhZG93Tm9ybWFsQmlhcyA9IHNoYWRvdy5ub3JtYWxCaWFzO1xyXG5cdFx0XHRcdFx0c2hhZG93VW5pZm9ybXMuc2hhZG93UmFkaXVzID0gc2hhZG93LnJhZGl1cztcclxuXHRcdFx0XHRcdHNoYWRvd1VuaWZvcm1zLnNoYWRvd01hcFNpemUgPSBzaGFkb3cubWFwU2l6ZTtcclxuXHJcblx0XHRcdFx0XHRzdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd1sgZGlyZWN0aW9uYWxMZW5ndGggXSA9IHNoYWRvd1VuaWZvcm1zO1xyXG5cdFx0XHRcdFx0c3RhdGUuZGlyZWN0aW9uYWxTaGFkb3dNYXBbIGRpcmVjdGlvbmFsTGVuZ3RoIF0gPSBzaGFkb3dNYXA7XHJcblx0XHRcdFx0XHRzdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeFsgZGlyZWN0aW9uYWxMZW5ndGggXSA9IGxpZ2h0LnNoYWRvdy5tYXRyaXg7XHJcblxyXG5cdFx0XHRcdFx0bnVtRGlyZWN0aW9uYWxTaGFkb3dzICsrO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHN0YXRlLmRpcmVjdGlvbmFsWyBkaXJlY3Rpb25hbExlbmd0aCBdID0gdW5pZm9ybXM7XHJcblxyXG5cdFx0XHRcdGRpcmVjdGlvbmFsTGVuZ3RoICsrO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggbGlnaHQuaXNTcG90TGlnaHQgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHVuaWZvcm1zID0gY2FjaGUuZ2V0KCBsaWdodCApO1xyXG5cclxuXHRcdFx0XHR1bmlmb3Jtcy5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7XHJcblxyXG5cdFx0XHRcdHVuaWZvcm1zLmNvbG9yLmNvcHkoIGNvbG9yICkubXVsdGlwbHlTY2FsYXIoIGludGVuc2l0eSApO1xyXG5cdFx0XHRcdHVuaWZvcm1zLmRpc3RhbmNlID0gZGlzdGFuY2U7XHJcblxyXG5cdFx0XHRcdHVuaWZvcm1zLmNvbmVDb3MgPSBNYXRoLmNvcyggbGlnaHQuYW5nbGUgKTtcclxuXHRcdFx0XHR1bmlmb3Jtcy5wZW51bWJyYUNvcyA9IE1hdGguY29zKCBsaWdodC5hbmdsZSAqICggMSAtIGxpZ2h0LnBlbnVtYnJhICkgKTtcclxuXHRcdFx0XHR1bmlmb3Jtcy5kZWNheSA9IGxpZ2h0LmRlY2F5O1xyXG5cclxuXHRcdFx0XHRzdGF0ZS5zcG90WyBzcG90TGVuZ3RoIF0gPSB1bmlmb3JtcztcclxuXHJcblx0XHRcdFx0Y29uc3Qgc2hhZG93ID0gbGlnaHQuc2hhZG93O1xyXG5cclxuXHRcdFx0XHRpZiAoIGxpZ2h0Lm1hcCApIHtcclxuXHJcblx0XHRcdFx0XHRzdGF0ZS5zcG90TGlnaHRNYXBbIG51bVNwb3RNYXBzIF0gPSBsaWdodC5tYXA7XHJcblx0XHRcdFx0XHRudW1TcG90TWFwcyArKztcclxuXHJcblx0XHRcdFx0XHQvLyBtYWtlIHN1cmUgdGhlIGxpZ2h0TWF0cml4IGlzIHVwIHRvIGRhdGVcclxuXHRcdFx0XHRcdC8vIFRPRE8gOiBkbyBpdCBpZiByZXF1aXJlZCBvbmx5XHJcblx0XHRcdFx0XHRzaGFkb3cudXBkYXRlTWF0cmljZXMoIGxpZ2h0ICk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBsaWdodC5jYXN0U2hhZG93ICkgbnVtU3BvdFNoYWRvd3NXaXRoTWFwcyArKztcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRzdGF0ZS5zcG90TGlnaHRNYXRyaXhbIHNwb3RMZW5ndGggXSA9IHNoYWRvdy5tYXRyaXg7XHJcblxyXG5cdFx0XHRcdGlmICggbGlnaHQuY2FzdFNoYWRvdyApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBzaGFkb3dVbmlmb3JtcyA9IHNoYWRvd0NhY2hlLmdldCggbGlnaHQgKTtcclxuXHJcblx0XHRcdFx0XHRzaGFkb3dVbmlmb3Jtcy5zaGFkb3dJbnRlbnNpdHkgPSBzaGFkb3cuaW50ZW5zaXR5O1xyXG5cdFx0XHRcdFx0c2hhZG93VW5pZm9ybXMuc2hhZG93QmlhcyA9IHNoYWRvdy5iaWFzO1xyXG5cdFx0XHRcdFx0c2hhZG93VW5pZm9ybXMuc2hhZG93Tm9ybWFsQmlhcyA9IHNoYWRvdy5ub3JtYWxCaWFzO1xyXG5cdFx0XHRcdFx0c2hhZG93VW5pZm9ybXMuc2hhZG93UmFkaXVzID0gc2hhZG93LnJhZGl1cztcclxuXHRcdFx0XHRcdHNoYWRvd1VuaWZvcm1zLnNoYWRvd01hcFNpemUgPSBzaGFkb3cubWFwU2l6ZTtcclxuXHJcblx0XHRcdFx0XHRzdGF0ZS5zcG90U2hhZG93WyBzcG90TGVuZ3RoIF0gPSBzaGFkb3dVbmlmb3JtcztcclxuXHRcdFx0XHRcdHN0YXRlLnNwb3RTaGFkb3dNYXBbIHNwb3RMZW5ndGggXSA9IHNoYWRvd01hcDtcclxuXHJcblx0XHRcdFx0XHRudW1TcG90U2hhZG93cyArKztcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRzcG90TGVuZ3RoICsrO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggbGlnaHQuaXNSZWN0QXJlYUxpZ2h0ICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB1bmlmb3JtcyA9IGNhY2hlLmdldCggbGlnaHQgKTtcclxuXHJcblx0XHRcdFx0dW5pZm9ybXMuY29sb3IuY29weSggY29sb3IgKS5tdWx0aXBseVNjYWxhciggaW50ZW5zaXR5ICk7XHJcblxyXG5cdFx0XHRcdHVuaWZvcm1zLmhhbGZXaWR0aC5zZXQoIGxpZ2h0LndpZHRoICogMC41LCAwLjAsIDAuMCApO1xyXG5cdFx0XHRcdHVuaWZvcm1zLmhhbGZIZWlnaHQuc2V0KCAwLjAsIGxpZ2h0LmhlaWdodCAqIDAuNSwgMC4wICk7XHJcblxyXG5cdFx0XHRcdHN0YXRlLnJlY3RBcmVhWyByZWN0QXJlYUxlbmd0aCBdID0gdW5pZm9ybXM7XHJcblxyXG5cdFx0XHRcdHJlY3RBcmVhTGVuZ3RoICsrO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggbGlnaHQuaXNQb2ludExpZ2h0ICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB1bmlmb3JtcyA9IGNhY2hlLmdldCggbGlnaHQgKTtcclxuXHJcblx0XHRcdFx0dW5pZm9ybXMuY29sb3IuY29weSggbGlnaHQuY29sb3IgKS5tdWx0aXBseVNjYWxhciggbGlnaHQuaW50ZW5zaXR5ICk7XHJcblx0XHRcdFx0dW5pZm9ybXMuZGlzdGFuY2UgPSBsaWdodC5kaXN0YW5jZTtcclxuXHRcdFx0XHR1bmlmb3Jtcy5kZWNheSA9IGxpZ2h0LmRlY2F5O1xyXG5cclxuXHRcdFx0XHRpZiAoIGxpZ2h0LmNhc3RTaGFkb3cgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3Qgc2hhZG93ID0gbGlnaHQuc2hhZG93O1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHNoYWRvd1VuaWZvcm1zID0gc2hhZG93Q2FjaGUuZ2V0KCBsaWdodCApO1xyXG5cclxuXHRcdFx0XHRcdHNoYWRvd1VuaWZvcm1zLnNoYWRvd0ludGVuc2l0eSA9IHNoYWRvdy5pbnRlbnNpdHk7XHJcblx0XHRcdFx0XHRzaGFkb3dVbmlmb3Jtcy5zaGFkb3dCaWFzID0gc2hhZG93LmJpYXM7XHJcblx0XHRcdFx0XHRzaGFkb3dVbmlmb3Jtcy5zaGFkb3dOb3JtYWxCaWFzID0gc2hhZG93Lm5vcm1hbEJpYXM7XHJcblx0XHRcdFx0XHRzaGFkb3dVbmlmb3Jtcy5zaGFkb3dSYWRpdXMgPSBzaGFkb3cucmFkaXVzO1xyXG5cdFx0XHRcdFx0c2hhZG93VW5pZm9ybXMuc2hhZG93TWFwU2l6ZSA9IHNoYWRvdy5tYXBTaXplO1xyXG5cdFx0XHRcdFx0c2hhZG93VW5pZm9ybXMuc2hhZG93Q2FtZXJhTmVhciA9IHNoYWRvdy5jYW1lcmEubmVhcjtcclxuXHRcdFx0XHRcdHNoYWRvd1VuaWZvcm1zLnNoYWRvd0NhbWVyYUZhciA9IHNoYWRvdy5jYW1lcmEuZmFyO1xyXG5cclxuXHRcdFx0XHRcdHN0YXRlLnBvaW50U2hhZG93WyBwb2ludExlbmd0aCBdID0gc2hhZG93VW5pZm9ybXM7XHJcblx0XHRcdFx0XHRzdGF0ZS5wb2ludFNoYWRvd01hcFsgcG9pbnRMZW5ndGggXSA9IHNoYWRvd01hcDtcclxuXHRcdFx0XHRcdHN0YXRlLnBvaW50U2hhZG93TWF0cml4WyBwb2ludExlbmd0aCBdID0gbGlnaHQuc2hhZG93Lm1hdHJpeDtcclxuXHJcblx0XHRcdFx0XHRudW1Qb2ludFNoYWRvd3MgKys7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0c3RhdGUucG9pbnRbIHBvaW50TGVuZ3RoIF0gPSB1bmlmb3JtcztcclxuXHJcblx0XHRcdFx0cG9pbnRMZW5ndGggKys7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBsaWdodC5pc0hlbWlzcGhlcmVMaWdodCApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgdW5pZm9ybXMgPSBjYWNoZS5nZXQoIGxpZ2h0ICk7XHJcblxyXG5cdFx0XHRcdHVuaWZvcm1zLnNreUNvbG9yLmNvcHkoIGxpZ2h0LmNvbG9yICkubXVsdGlwbHlTY2FsYXIoIGludGVuc2l0eSApO1xyXG5cdFx0XHRcdHVuaWZvcm1zLmdyb3VuZENvbG9yLmNvcHkoIGxpZ2h0Lmdyb3VuZENvbG9yICkubXVsdGlwbHlTY2FsYXIoIGludGVuc2l0eSApO1xyXG5cclxuXHRcdFx0XHRzdGF0ZS5oZW1pWyBoZW1pTGVuZ3RoIF0gPSB1bmlmb3JtcztcclxuXHJcblx0XHRcdFx0aGVtaUxlbmd0aCArKztcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCByZWN0QXJlYUxlbmd0aCA+IDAgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGV4dGVuc2lvbnMuaGFzKCAnT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyJyApID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRzdGF0ZS5yZWN0QXJlYUxUQzEgPSBVbmlmb3Jtc0xpYi5MVENfRkxPQVRfMTtcclxuXHRcdFx0XHRzdGF0ZS5yZWN0QXJlYUxUQzIgPSBVbmlmb3Jtc0xpYi5MVENfRkxPQVRfMjtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHN0YXRlLnJlY3RBcmVhTFRDMSA9IFVuaWZvcm1zTGliLkxUQ19IQUxGXzE7XHJcblx0XHRcdFx0c3RhdGUucmVjdEFyZWFMVEMyID0gVW5pZm9ybXNMaWIuTFRDX0hBTEZfMjtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0c3RhdGUuYW1iaWVudFsgMCBdID0gcjtcclxuXHRcdHN0YXRlLmFtYmllbnRbIDEgXSA9IGc7XHJcblx0XHRzdGF0ZS5hbWJpZW50WyAyIF0gPSBiO1xyXG5cclxuXHRcdGNvbnN0IGhhc2ggPSBzdGF0ZS5oYXNoO1xyXG5cclxuXHRcdGlmICggaGFzaC5kaXJlY3Rpb25hbExlbmd0aCAhPT0gZGlyZWN0aW9uYWxMZW5ndGggfHxcclxuXHRcdFx0aGFzaC5wb2ludExlbmd0aCAhPT0gcG9pbnRMZW5ndGggfHxcclxuXHRcdFx0aGFzaC5zcG90TGVuZ3RoICE9PSBzcG90TGVuZ3RoIHx8XHJcblx0XHRcdGhhc2gucmVjdEFyZWFMZW5ndGggIT09IHJlY3RBcmVhTGVuZ3RoIHx8XHJcblx0XHRcdGhhc2guaGVtaUxlbmd0aCAhPT0gaGVtaUxlbmd0aCB8fFxyXG5cdFx0XHRoYXNoLm51bURpcmVjdGlvbmFsU2hhZG93cyAhPT0gbnVtRGlyZWN0aW9uYWxTaGFkb3dzIHx8XHJcblx0XHRcdGhhc2gubnVtUG9pbnRTaGFkb3dzICE9PSBudW1Qb2ludFNoYWRvd3MgfHxcclxuXHRcdFx0aGFzaC5udW1TcG90U2hhZG93cyAhPT0gbnVtU3BvdFNoYWRvd3MgfHxcclxuXHRcdFx0aGFzaC5udW1TcG90TWFwcyAhPT0gbnVtU3BvdE1hcHMgfHxcclxuXHRcdFx0aGFzaC5udW1MaWdodFByb2JlcyAhPT0gbnVtTGlnaHRQcm9iZXMgKSB7XHJcblxyXG5cdFx0XHRzdGF0ZS5kaXJlY3Rpb25hbC5sZW5ndGggPSBkaXJlY3Rpb25hbExlbmd0aDtcclxuXHRcdFx0c3RhdGUuc3BvdC5sZW5ndGggPSBzcG90TGVuZ3RoO1xyXG5cdFx0XHRzdGF0ZS5yZWN0QXJlYS5sZW5ndGggPSByZWN0QXJlYUxlbmd0aDtcclxuXHRcdFx0c3RhdGUucG9pbnQubGVuZ3RoID0gcG9pbnRMZW5ndGg7XHJcblx0XHRcdHN0YXRlLmhlbWkubGVuZ3RoID0gaGVtaUxlbmd0aDtcclxuXHJcblx0XHRcdHN0YXRlLmRpcmVjdGlvbmFsU2hhZG93Lmxlbmd0aCA9IG51bURpcmVjdGlvbmFsU2hhZG93cztcclxuXHRcdFx0c3RhdGUuZGlyZWN0aW9uYWxTaGFkb3dNYXAubGVuZ3RoID0gbnVtRGlyZWN0aW9uYWxTaGFkb3dzO1xyXG5cdFx0XHRzdGF0ZS5wb2ludFNoYWRvdy5sZW5ndGggPSBudW1Qb2ludFNoYWRvd3M7XHJcblx0XHRcdHN0YXRlLnBvaW50U2hhZG93TWFwLmxlbmd0aCA9IG51bVBvaW50U2hhZG93cztcclxuXHRcdFx0c3RhdGUuc3BvdFNoYWRvdy5sZW5ndGggPSBudW1TcG90U2hhZG93cztcclxuXHRcdFx0c3RhdGUuc3BvdFNoYWRvd01hcC5sZW5ndGggPSBudW1TcG90U2hhZG93cztcclxuXHRcdFx0c3RhdGUuZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXgubGVuZ3RoID0gbnVtRGlyZWN0aW9uYWxTaGFkb3dzO1xyXG5cdFx0XHRzdGF0ZS5wb2ludFNoYWRvd01hdHJpeC5sZW5ndGggPSBudW1Qb2ludFNoYWRvd3M7XHJcblx0XHRcdHN0YXRlLnNwb3RMaWdodE1hdHJpeC5sZW5ndGggPSBudW1TcG90U2hhZG93cyArIG51bVNwb3RNYXBzIC0gbnVtU3BvdFNoYWRvd3NXaXRoTWFwcztcclxuXHRcdFx0c3RhdGUuc3BvdExpZ2h0TWFwLmxlbmd0aCA9IG51bVNwb3RNYXBzO1xyXG5cdFx0XHRzdGF0ZS5udW1TcG90TGlnaHRTaGFkb3dzV2l0aE1hcHMgPSBudW1TcG90U2hhZG93c1dpdGhNYXBzO1xyXG5cdFx0XHRzdGF0ZS5udW1MaWdodFByb2JlcyA9IG51bUxpZ2h0UHJvYmVzO1xyXG5cclxuXHRcdFx0aGFzaC5kaXJlY3Rpb25hbExlbmd0aCA9IGRpcmVjdGlvbmFsTGVuZ3RoO1xyXG5cdFx0XHRoYXNoLnBvaW50TGVuZ3RoID0gcG9pbnRMZW5ndGg7XHJcblx0XHRcdGhhc2guc3BvdExlbmd0aCA9IHNwb3RMZW5ndGg7XHJcblx0XHRcdGhhc2gucmVjdEFyZWFMZW5ndGggPSByZWN0QXJlYUxlbmd0aDtcclxuXHRcdFx0aGFzaC5oZW1pTGVuZ3RoID0gaGVtaUxlbmd0aDtcclxuXHJcblx0XHRcdGhhc2gubnVtRGlyZWN0aW9uYWxTaGFkb3dzID0gbnVtRGlyZWN0aW9uYWxTaGFkb3dzO1xyXG5cdFx0XHRoYXNoLm51bVBvaW50U2hhZG93cyA9IG51bVBvaW50U2hhZG93cztcclxuXHRcdFx0aGFzaC5udW1TcG90U2hhZG93cyA9IG51bVNwb3RTaGFkb3dzO1xyXG5cdFx0XHRoYXNoLm51bVNwb3RNYXBzID0gbnVtU3BvdE1hcHM7XHJcblxyXG5cdFx0XHRoYXNoLm51bUxpZ2h0UHJvYmVzID0gbnVtTGlnaHRQcm9iZXM7XHJcblxyXG5cdFx0XHRzdGF0ZS52ZXJzaW9uID0gbmV4dFZlcnNpb24gKys7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHNldHVwVmlldyggbGlnaHRzLCBjYW1lcmEgKSB7XHJcblxyXG5cdFx0bGV0IGRpcmVjdGlvbmFsTGVuZ3RoID0gMDtcclxuXHRcdGxldCBwb2ludExlbmd0aCA9IDA7XHJcblx0XHRsZXQgc3BvdExlbmd0aCA9IDA7XHJcblx0XHRsZXQgcmVjdEFyZWFMZW5ndGggPSAwO1xyXG5cdFx0bGV0IGhlbWlMZW5ndGggPSAwO1xyXG5cclxuXHRcdGNvbnN0IHZpZXdNYXRyaXggPSBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGxpZ2h0cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgbGlnaHQgPSBsaWdodHNbIGkgXTtcclxuXHJcblx0XHRcdGlmICggbGlnaHQuaXNEaXJlY3Rpb25hbExpZ2h0ICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB1bmlmb3JtcyA9IHN0YXRlLmRpcmVjdGlvbmFsWyBkaXJlY3Rpb25hbExlbmd0aCBdO1xyXG5cclxuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC5tYXRyaXhXb3JsZCApO1xyXG5cdFx0XHRcdHZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC50YXJnZXQubWF0cml4V29ybGQgKTtcclxuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb24uc3ViKCB2ZWN0b3IzICk7XHJcblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbiggdmlld01hdHJpeCApO1xyXG5cclxuXHRcdFx0XHRkaXJlY3Rpb25hbExlbmd0aCArKztcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGxpZ2h0LmlzU3BvdExpZ2h0ICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB1bmlmb3JtcyA9IHN0YXRlLnNwb3RbIHNwb3RMZW5ndGggXTtcclxuXHJcblx0XHRcdFx0dW5pZm9ybXMucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC5tYXRyaXhXb3JsZCApO1xyXG5cdFx0XHRcdHVuaWZvcm1zLnBvc2l0aW9uLmFwcGx5TWF0cml4NCggdmlld01hdHJpeCApO1xyXG5cclxuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC5tYXRyaXhXb3JsZCApO1xyXG5cdFx0XHRcdHZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC50YXJnZXQubWF0cml4V29ybGQgKTtcclxuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb24uc3ViKCB2ZWN0b3IzICk7XHJcblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbiggdmlld01hdHJpeCApO1xyXG5cclxuXHRcdFx0XHRzcG90TGVuZ3RoICsrO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggbGlnaHQuaXNSZWN0QXJlYUxpZ2h0ICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB1bmlmb3JtcyA9IHN0YXRlLnJlY3RBcmVhWyByZWN0QXJlYUxlbmd0aCBdO1xyXG5cclxuXHRcdFx0XHR1bmlmb3Jtcy5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7XHJcblx0XHRcdFx0dW5pZm9ybXMucG9zaXRpb24uYXBwbHlNYXRyaXg0KCB2aWV3TWF0cml4ICk7XHJcblxyXG5cdFx0XHRcdC8vIGV4dHJhY3QgbG9jYWwgcm90YXRpb24gb2YgbGlnaHQgdG8gZGVyaXZlIHdpZHRoL2hlaWdodCBoYWxmIHZlY3RvcnNcclxuXHRcdFx0XHRtYXRyaXg0Mi5pZGVudGl0eSgpO1xyXG5cdFx0XHRcdG1hdHJpeDQuY29weSggbGlnaHQubWF0cml4V29ybGQgKTtcclxuXHRcdFx0XHRtYXRyaXg0LnByZW11bHRpcGx5KCB2aWV3TWF0cml4ICk7XHJcblx0XHRcdFx0bWF0cml4NDIuZXh0cmFjdFJvdGF0aW9uKCBtYXRyaXg0ICk7XHJcblxyXG5cdFx0XHRcdHVuaWZvcm1zLmhhbGZXaWR0aC5zZXQoIGxpZ2h0LndpZHRoICogMC41LCAwLjAsIDAuMCApO1xyXG5cdFx0XHRcdHVuaWZvcm1zLmhhbGZIZWlnaHQuc2V0KCAwLjAsIGxpZ2h0LmhlaWdodCAqIDAuNSwgMC4wICk7XHJcblxyXG5cdFx0XHRcdHVuaWZvcm1zLmhhbGZXaWR0aC5hcHBseU1hdHJpeDQoIG1hdHJpeDQyICk7XHJcblx0XHRcdFx0dW5pZm9ybXMuaGFsZkhlaWdodC5hcHBseU1hdHJpeDQoIG1hdHJpeDQyICk7XHJcblxyXG5cdFx0XHRcdHJlY3RBcmVhTGVuZ3RoICsrO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggbGlnaHQuaXNQb2ludExpZ2h0ICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB1bmlmb3JtcyA9IHN0YXRlLnBvaW50WyBwb2ludExlbmd0aCBdO1xyXG5cclxuXHRcdFx0XHR1bmlmb3Jtcy5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7XHJcblx0XHRcdFx0dW5pZm9ybXMucG9zaXRpb24uYXBwbHlNYXRyaXg0KCB2aWV3TWF0cml4ICk7XHJcblxyXG5cdFx0XHRcdHBvaW50TGVuZ3RoICsrO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggbGlnaHQuaXNIZW1pc3BoZXJlTGlnaHQgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHVuaWZvcm1zID0gc3RhdGUuaGVtaVsgaGVtaUxlbmd0aCBdO1xyXG5cclxuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC5tYXRyaXhXb3JsZCApO1xyXG5cdFx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24oIHZpZXdNYXRyaXggKTtcclxuXHJcblx0XHRcdFx0aGVtaUxlbmd0aCArKztcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIHtcclxuXHRcdHNldHVwOiBzZXR1cCxcclxuXHRcdHNldHVwVmlldzogc2V0dXBWaWV3LFxyXG5cdFx0c3RhdGU6IHN0YXRlXHJcblx0fTtcclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBXZWJHTExpZ2h0cyB9O1xyXG4iLCJpbXBvcnQgeyBXZWJHTExpZ2h0cyB9IGZyb20gJy4vV2ViR0xMaWdodHMuanMnO1xyXG5cclxuZnVuY3Rpb24gV2ViR0xSZW5kZXJTdGF0ZSggZXh0ZW5zaW9ucyApIHtcclxuXHJcblx0Y29uc3QgbGlnaHRzID0gbmV3IFdlYkdMTGlnaHRzKCBleHRlbnNpb25zICk7XHJcblxyXG5cdGNvbnN0IGxpZ2h0c0FycmF5ID0gW107XHJcblx0Y29uc3Qgc2hhZG93c0FycmF5ID0gW107XHJcblxyXG5cdGZ1bmN0aW9uIGluaXQoIGNhbWVyYSApIHtcclxuXHJcblx0XHRzdGF0ZS5jYW1lcmEgPSBjYW1lcmE7XHJcblxyXG5cdFx0bGlnaHRzQXJyYXkubGVuZ3RoID0gMDtcclxuXHRcdHNoYWRvd3NBcnJheS5sZW5ndGggPSAwO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHB1c2hMaWdodCggbGlnaHQgKSB7XHJcblxyXG5cdFx0bGlnaHRzQXJyYXkucHVzaCggbGlnaHQgKTtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBwdXNoU2hhZG93KCBzaGFkb3dMaWdodCApIHtcclxuXHJcblx0XHRzaGFkb3dzQXJyYXkucHVzaCggc2hhZG93TGlnaHQgKTtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBzZXR1cExpZ2h0cygpIHtcclxuXHJcblx0XHRsaWdodHMuc2V0dXAoIGxpZ2h0c0FycmF5ICk7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gc2V0dXBMaWdodHNWaWV3KCBjYW1lcmEgKSB7XHJcblxyXG5cdFx0bGlnaHRzLnNldHVwVmlldyggbGlnaHRzQXJyYXksIGNhbWVyYSApO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvbnN0IHN0YXRlID0ge1xyXG5cdFx0bGlnaHRzQXJyYXk6IGxpZ2h0c0FycmF5LFxyXG5cdFx0c2hhZG93c0FycmF5OiBzaGFkb3dzQXJyYXksXHJcblxyXG5cdFx0Y2FtZXJhOiBudWxsLFxyXG5cclxuXHRcdGxpZ2h0czogbGlnaHRzLFxyXG5cclxuXHRcdHRyYW5zbWlzc2lvblJlbmRlclRhcmdldDoge31cclxuXHR9O1xyXG5cclxuXHRyZXR1cm4ge1xyXG5cdFx0aW5pdDogaW5pdCxcclxuXHRcdHN0YXRlOiBzdGF0ZSxcclxuXHRcdHNldHVwTGlnaHRzOiBzZXR1cExpZ2h0cyxcclxuXHRcdHNldHVwTGlnaHRzVmlldzogc2V0dXBMaWdodHNWaWV3LFxyXG5cclxuXHRcdHB1c2hMaWdodDogcHVzaExpZ2h0LFxyXG5cdFx0cHVzaFNoYWRvdzogcHVzaFNoYWRvd1xyXG5cdH07XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBXZWJHTFJlbmRlclN0YXRlcyggZXh0ZW5zaW9ucyApIHtcclxuXHJcblx0bGV0IHJlbmRlclN0YXRlcyA9IG5ldyBXZWFrTWFwKCk7XHJcblxyXG5cdGZ1bmN0aW9uIGdldCggc2NlbmUsIHJlbmRlckNhbGxEZXB0aCA9IDAgKSB7XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyU3RhdGVBcnJheSA9IHJlbmRlclN0YXRlcy5nZXQoIHNjZW5lICk7XHJcblx0XHRsZXQgcmVuZGVyU3RhdGU7XHJcblxyXG5cdFx0aWYgKCByZW5kZXJTdGF0ZUFycmF5ID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRyZW5kZXJTdGF0ZSA9IG5ldyBXZWJHTFJlbmRlclN0YXRlKCBleHRlbnNpb25zICk7XHJcblx0XHRcdHJlbmRlclN0YXRlcy5zZXQoIHNjZW5lLCBbIHJlbmRlclN0YXRlIF0gKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0aWYgKCByZW5kZXJDYWxsRGVwdGggPj0gcmVuZGVyU3RhdGVBcnJheS5sZW5ndGggKSB7XHJcblxyXG5cdFx0XHRcdHJlbmRlclN0YXRlID0gbmV3IFdlYkdMUmVuZGVyU3RhdGUoIGV4dGVuc2lvbnMgKTtcclxuXHRcdFx0XHRyZW5kZXJTdGF0ZUFycmF5LnB1c2goIHJlbmRlclN0YXRlICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRyZW5kZXJTdGF0ZSA9IHJlbmRlclN0YXRlQXJyYXlbIHJlbmRlckNhbGxEZXB0aCBdO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcmVuZGVyU3RhdGU7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gZGlzcG9zZSgpIHtcclxuXHJcblx0XHRyZW5kZXJTdGF0ZXMgPSBuZXcgV2Vha01hcCgpO1xyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiB7XHJcblx0XHRnZXQ6IGdldCxcclxuXHRcdGRpc3Bvc2U6IGRpc3Bvc2VcclxuXHR9O1xyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCB7IFdlYkdMUmVuZGVyU3RhdGVzIH07XHJcbiIsImV4cG9ydCBjb25zdCB2ZXJ0ZXggPSAvKiBnbHNsICovYFxyXG52b2lkIG1haW4oKSB7XHJcblxyXG5cdGdsX1Bvc2l0aW9uID0gdmVjNCggcG9zaXRpb24sIDEuMCApO1xyXG5cclxufVxyXG5gO1xyXG5cclxuZXhwb3J0IGNvbnN0IGZyYWdtZW50ID0gLyogZ2xzbCAqL2BcclxudW5pZm9ybSBzYW1wbGVyMkQgc2hhZG93X3Bhc3M7XHJcbnVuaWZvcm0gdmVjMiByZXNvbHV0aW9uO1xyXG51bmlmb3JtIGZsb2F0IHJhZGl1cztcclxuXHJcbiNpbmNsdWRlIDxwYWNraW5nPlxyXG5cclxudm9pZCBtYWluKCkge1xyXG5cclxuXHRjb25zdCBmbG9hdCBzYW1wbGVzID0gZmxvYXQoIFZTTV9TQU1QTEVTICk7XHJcblxyXG5cdGZsb2F0IG1lYW4gPSAwLjA7XHJcblx0ZmxvYXQgc3F1YXJlZF9tZWFuID0gMC4wO1xyXG5cclxuXHRmbG9hdCB1dlN0cmlkZSA9IHNhbXBsZXMgPD0gMS4wID8gMC4wIDogMi4wIC8gKCBzYW1wbGVzIC0gMS4wICk7XHJcblx0ZmxvYXQgdXZTdGFydCA9IHNhbXBsZXMgPD0gMS4wID8gMC4wIDogLSAxLjA7XHJcblx0Zm9yICggZmxvYXQgaSA9IDAuMDsgaSA8IHNhbXBsZXM7IGkgKysgKSB7XHJcblxyXG5cdFx0ZmxvYXQgdXZPZmZzZXQgPSB1dlN0YXJ0ICsgaSAqIHV2U3RyaWRlO1xyXG5cclxuXHRcdCNpZmRlZiBIT1JJWk9OVEFMX1BBU1NcclxuXHJcblx0XHRcdHZlYzIgZGlzdHJpYnV0aW9uID0gdW5wYWNrUkdCQVRvMkhhbGYoIHRleHR1cmUyRCggc2hhZG93X3Bhc3MsICggZ2xfRnJhZ0Nvb3JkLnh5ICsgdmVjMiggdXZPZmZzZXQsIDAuMCApICogcmFkaXVzICkgLyByZXNvbHV0aW9uICkgKTtcclxuXHRcdFx0bWVhbiArPSBkaXN0cmlidXRpb24ueDtcclxuXHRcdFx0c3F1YXJlZF9tZWFuICs9IGRpc3RyaWJ1dGlvbi55ICogZGlzdHJpYnV0aW9uLnkgKyBkaXN0cmlidXRpb24ueCAqIGRpc3RyaWJ1dGlvbi54O1xyXG5cclxuXHRcdCNlbHNlXHJcblxyXG5cdFx0XHRmbG9hdCBkZXB0aCA9IHVucGFja1JHQkFUb0RlcHRoKCB0ZXh0dXJlMkQoIHNoYWRvd19wYXNzLCAoIGdsX0ZyYWdDb29yZC54eSArIHZlYzIoIDAuMCwgdXZPZmZzZXQgKSAqIHJhZGl1cyApIC8gcmVzb2x1dGlvbiApICk7XHJcblx0XHRcdG1lYW4gKz0gZGVwdGg7XHJcblx0XHRcdHNxdWFyZWRfbWVhbiArPSBkZXB0aCAqIGRlcHRoO1xyXG5cclxuXHRcdCNlbmRpZlxyXG5cclxuXHR9XHJcblxyXG5cdG1lYW4gPSBtZWFuIC8gc2FtcGxlcztcclxuXHRzcXVhcmVkX21lYW4gPSBzcXVhcmVkX21lYW4gLyBzYW1wbGVzO1xyXG5cclxuXHRmbG9hdCBzdGRfZGV2ID0gc3FydCggc3F1YXJlZF9tZWFuIC0gbWVhbiAqIG1lYW4gKTtcclxuXHJcblx0Z2xfRnJhZ0NvbG9yID0gcGFjazJIYWxmVG9SR0JBKCB2ZWMyKCBtZWFuLCBzdGRfZGV2ICkgKTtcclxuXHJcbn1cclxuYDtcclxuIiwiaW1wb3J0IHsgRnJvbnRTaWRlLCBCYWNrU2lkZSwgRG91YmxlU2lkZSwgTmVhcmVzdEZpbHRlciwgUENGU2hhZG93TWFwLCBWU01TaGFkb3dNYXAsIFJHQkFEZXB0aFBhY2tpbmcsIE5vQmxlbmRpbmcgfSBmcm9tICcuLi8uLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBXZWJHTFJlbmRlclRhcmdldCB9IGZyb20gJy4uL1dlYkdMUmVuZGVyVGFyZ2V0LmpzJztcclxuaW1wb3J0IHsgTWVzaERlcHRoTWF0ZXJpYWwgfSBmcm9tICcuLi8uLi9tYXRlcmlhbHMvTWVzaERlcHRoTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyBNZXNoRGlzdGFuY2VNYXRlcmlhbCB9IGZyb20gJy4uLy4uL21hdGVyaWFscy9NZXNoRGlzdGFuY2VNYXRlcmlhbC5qcyc7XHJcbmltcG9ydCB7IFNoYWRlck1hdGVyaWFsIH0gZnJvbSAnLi4vLi4vbWF0ZXJpYWxzL1NoYWRlck1hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5pbXBvcnQgeyBCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4uLy4uL2NvcmUvQnVmZmVyR2VvbWV0cnkuanMnO1xyXG5pbXBvcnQgeyBNZXNoIH0gZnJvbSAnLi4vLi4vb2JqZWN0cy9NZXNoLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yNCB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yNC5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjIuanMnO1xyXG5pbXBvcnQgeyBGcnVzdHVtIH0gZnJvbSAnLi4vLi4vbWF0aC9GcnVzdHVtLmpzJztcclxuXHJcbmltcG9ydCAqIGFzIHZzbSBmcm9tICcuLi9zaGFkZXJzL1NoYWRlckxpYi92c20uZ2xzbC5qcyc7XHJcblxyXG5mdW5jdGlvbiBXZWJHTFNoYWRvd01hcCggcmVuZGVyZXIsIG9iamVjdHMsIGNhcGFiaWxpdGllcyApIHtcclxuXHJcblx0bGV0IF9mcnVzdHVtID0gbmV3IEZydXN0dW0oKTtcclxuXHJcblx0Y29uc3QgX3NoYWRvd01hcFNpemUgPSBuZXcgVmVjdG9yMigpLFxyXG5cdFx0X3ZpZXdwb3J0U2l6ZSA9IG5ldyBWZWN0b3IyKCksXHJcblxyXG5cdFx0X3ZpZXdwb3J0ID0gbmV3IFZlY3RvcjQoKSxcclxuXHJcblx0XHRfZGVwdGhNYXRlcmlhbCA9IG5ldyBNZXNoRGVwdGhNYXRlcmlhbCggeyBkZXB0aFBhY2tpbmc6IFJHQkFEZXB0aFBhY2tpbmcgfSApLFxyXG5cdFx0X2Rpc3RhbmNlTWF0ZXJpYWwgPSBuZXcgTWVzaERpc3RhbmNlTWF0ZXJpYWwoKSxcclxuXHJcblx0XHRfbWF0ZXJpYWxDYWNoZSA9IHt9LFxyXG5cclxuXHRcdF9tYXhUZXh0dXJlU2l6ZSA9IGNhcGFiaWxpdGllcy5tYXhUZXh0dXJlU2l6ZTtcclxuXHJcblx0Y29uc3Qgc2hhZG93U2lkZSA9IHsgWyBGcm9udFNpZGUgXTogQmFja1NpZGUsIFsgQmFja1NpZGUgXTogRnJvbnRTaWRlLCBbIERvdWJsZVNpZGUgXTogRG91YmxlU2lkZSB9O1xyXG5cclxuXHRjb25zdCBzaGFkb3dNYXRlcmlhbFZlcnRpY2FsID0gbmV3IFNoYWRlck1hdGVyaWFsKCB7XHJcblx0XHRkZWZpbmVzOiB7XHJcblx0XHRcdFZTTV9TQU1QTEVTOiA4XHJcblx0XHR9LFxyXG5cdFx0dW5pZm9ybXM6IHtcclxuXHRcdFx0c2hhZG93X3Bhc3M6IHsgdmFsdWU6IG51bGwgfSxcclxuXHRcdFx0cmVzb2x1dGlvbjogeyB2YWx1ZTogbmV3IFZlY3RvcjIoKSB9LFxyXG5cdFx0XHRyYWRpdXM6IHsgdmFsdWU6IDQuMCB9XHJcblx0XHR9LFxyXG5cclxuXHRcdHZlcnRleFNoYWRlcjogdnNtLnZlcnRleCxcclxuXHRcdGZyYWdtZW50U2hhZGVyOiB2c20uZnJhZ21lbnRcclxuXHJcblx0fSApO1xyXG5cclxuXHRjb25zdCBzaGFkb3dNYXRlcmlhbEhvcml6b250YWwgPSBzaGFkb3dNYXRlcmlhbFZlcnRpY2FsLmNsb25lKCk7XHJcblx0c2hhZG93TWF0ZXJpYWxIb3Jpem9udGFsLmRlZmluZXMuSE9SSVpPTlRBTF9QQVNTID0gMTtcclxuXHJcblx0Y29uc3QgZnVsbFNjcmVlblRyaSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xyXG5cdGZ1bGxTY3JlZW5Ucmkuc2V0QXR0cmlidXRlKFxyXG5cdFx0J3Bvc2l0aW9uJyxcclxuXHRcdG5ldyBCdWZmZXJBdHRyaWJ1dGUoXHJcblx0XHRcdG5ldyBGbG9hdDMyQXJyYXkoIFsgLSAxLCAtIDEsIDAuNSwgMywgLSAxLCAwLjUsIC0gMSwgMywgMC41IF0gKSxcclxuXHRcdFx0M1xyXG5cdFx0KVxyXG5cdCk7XHJcblxyXG5cdGNvbnN0IGZ1bGxTY3JlZW5NZXNoID0gbmV3IE1lc2goIGZ1bGxTY3JlZW5UcmksIHNoYWRvd01hdGVyaWFsVmVydGljYWwgKTtcclxuXHJcblx0Y29uc3Qgc2NvcGUgPSB0aGlzO1xyXG5cclxuXHR0aGlzLmVuYWJsZWQgPSBmYWxzZTtcclxuXHJcblx0dGhpcy5hdXRvVXBkYXRlID0gdHJ1ZTtcclxuXHR0aGlzLm5lZWRzVXBkYXRlID0gZmFsc2U7XHJcblxyXG5cdHRoaXMudHlwZSA9IFBDRlNoYWRvd01hcDtcclxuXHRsZXQgX3ByZXZpb3VzVHlwZSA9IHRoaXMudHlwZTtcclxuXHJcblx0dGhpcy5yZW5kZXIgPSBmdW5jdGlvbiAoIGxpZ2h0cywgc2NlbmUsIGNhbWVyYSApIHtcclxuXHJcblx0XHRpZiAoIHNjb3BlLmVuYWJsZWQgPT09IGZhbHNlICkgcmV0dXJuO1xyXG5cdFx0aWYgKCBzY29wZS5hdXRvVXBkYXRlID09PSBmYWxzZSAmJiBzY29wZS5uZWVkc1VwZGF0ZSA9PT0gZmFsc2UgKSByZXR1cm47XHJcblxyXG5cdFx0aWYgKCBsaWdodHMubGVuZ3RoID09PSAwICkgcmV0dXJuO1xyXG5cclxuXHRcdGNvbnN0IGN1cnJlbnRSZW5kZXJUYXJnZXQgPSByZW5kZXJlci5nZXRSZW5kZXJUYXJnZXQoKTtcclxuXHRcdGNvbnN0IGFjdGl2ZUN1YmVGYWNlID0gcmVuZGVyZXIuZ2V0QWN0aXZlQ3ViZUZhY2UoKTtcclxuXHRcdGNvbnN0IGFjdGl2ZU1pcG1hcExldmVsID0gcmVuZGVyZXIuZ2V0QWN0aXZlTWlwbWFwTGV2ZWwoKTtcclxuXHJcblx0XHRjb25zdCBfc3RhdGUgPSByZW5kZXJlci5zdGF0ZTtcclxuXHJcblx0XHQvLyBTZXQgR0wgc3RhdGUgZm9yIGRlcHRoIG1hcC5cclxuXHRcdF9zdGF0ZS5zZXRCbGVuZGluZyggTm9CbGVuZGluZyApO1xyXG5cdFx0X3N0YXRlLmJ1ZmZlcnMuY29sb3Iuc2V0Q2xlYXIoIDEsIDEsIDEsIDEgKTtcclxuXHRcdF9zdGF0ZS5idWZmZXJzLmRlcHRoLnNldFRlc3QoIHRydWUgKTtcclxuXHRcdF9zdGF0ZS5zZXRTY2lzc29yVGVzdCggZmFsc2UgKTtcclxuXHJcblx0XHQvLyBjaGVjayBmb3Igc2hhZG93IG1hcCB0eXBlIGNoYW5nZXNcclxuXHJcblx0XHRjb25zdCB0b1ZTTSA9ICggX3ByZXZpb3VzVHlwZSAhPT0gVlNNU2hhZG93TWFwICYmIHRoaXMudHlwZSA9PT0gVlNNU2hhZG93TWFwICk7XHJcblx0XHRjb25zdCBmcm9tVlNNID0gKCBfcHJldmlvdXNUeXBlID09PSBWU01TaGFkb3dNYXAgJiYgdGhpcy50eXBlICE9PSBWU01TaGFkb3dNYXAgKTtcclxuXHJcblx0XHQvLyByZW5kZXIgZGVwdGggbWFwXHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IGxpZ2h0cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGxpZ2h0ID0gbGlnaHRzWyBpIF07XHJcblx0XHRcdGNvbnN0IHNoYWRvdyA9IGxpZ2h0LnNoYWRvdztcclxuXHJcblx0XHRcdGlmICggc2hhZG93ID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMU2hhZG93TWFwOicsIGxpZ2h0LCAnaGFzIG5vIHNoYWRvdy4nICk7XHJcblx0XHRcdFx0Y29udGludWU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHNoYWRvdy5hdXRvVXBkYXRlID09PSBmYWxzZSAmJiBzaGFkb3cubmVlZHNVcGRhdGUgPT09IGZhbHNlICkgY29udGludWU7XHJcblxyXG5cdFx0XHRfc2hhZG93TWFwU2l6ZS5jb3B5KCBzaGFkb3cubWFwU2l6ZSApO1xyXG5cclxuXHRcdFx0Y29uc3Qgc2hhZG93RnJhbWVFeHRlbnRzID0gc2hhZG93LmdldEZyYW1lRXh0ZW50cygpO1xyXG5cclxuXHRcdFx0X3NoYWRvd01hcFNpemUubXVsdGlwbHkoIHNoYWRvd0ZyYW1lRXh0ZW50cyApO1xyXG5cclxuXHRcdFx0X3ZpZXdwb3J0U2l6ZS5jb3B5KCBzaGFkb3cubWFwU2l6ZSApO1xyXG5cclxuXHRcdFx0aWYgKCBfc2hhZG93TWFwU2l6ZS54ID4gX21heFRleHR1cmVTaXplIHx8IF9zaGFkb3dNYXBTaXplLnkgPiBfbWF4VGV4dHVyZVNpemUgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggX3NoYWRvd01hcFNpemUueCA+IF9tYXhUZXh0dXJlU2l6ZSApIHtcclxuXHJcblx0XHRcdFx0XHRfdmlld3BvcnRTaXplLnggPSBNYXRoLmZsb29yKCBfbWF4VGV4dHVyZVNpemUgLyBzaGFkb3dGcmFtZUV4dGVudHMueCApO1xyXG5cdFx0XHRcdFx0X3NoYWRvd01hcFNpemUueCA9IF92aWV3cG9ydFNpemUueCAqIHNoYWRvd0ZyYW1lRXh0ZW50cy54O1xyXG5cdFx0XHRcdFx0c2hhZG93Lm1hcFNpemUueCA9IF92aWV3cG9ydFNpemUueDtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoIF9zaGFkb3dNYXBTaXplLnkgPiBfbWF4VGV4dHVyZVNpemUgKSB7XHJcblxyXG5cdFx0XHRcdFx0X3ZpZXdwb3J0U2l6ZS55ID0gTWF0aC5mbG9vciggX21heFRleHR1cmVTaXplIC8gc2hhZG93RnJhbWVFeHRlbnRzLnkgKTtcclxuXHRcdFx0XHRcdF9zaGFkb3dNYXBTaXplLnkgPSBfdmlld3BvcnRTaXplLnkgKiBzaGFkb3dGcmFtZUV4dGVudHMueTtcclxuXHRcdFx0XHRcdHNoYWRvdy5tYXBTaXplLnkgPSBfdmlld3BvcnRTaXplLnk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggc2hhZG93Lm1hcCA9PT0gbnVsbCB8fCB0b1ZTTSA9PT0gdHJ1ZSB8fCBmcm9tVlNNID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBwYXJzID0gKCB0aGlzLnR5cGUgIT09IFZTTVNoYWRvd01hcCApID8geyBtaW5GaWx0ZXI6IE5lYXJlc3RGaWx0ZXIsIG1hZ0ZpbHRlcjogTmVhcmVzdEZpbHRlciB9IDoge307XHJcblxyXG5cdFx0XHRcdGlmICggc2hhZG93Lm1hcCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHRzaGFkb3cubWFwLmRpc3Bvc2UoKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRzaGFkb3cubWFwID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KCBfc2hhZG93TWFwU2l6ZS54LCBfc2hhZG93TWFwU2l6ZS55LCBwYXJzICk7XHJcblx0XHRcdFx0c2hhZG93Lm1hcC50ZXh0dXJlLm5hbWUgPSBsaWdodC5uYW1lICsgJy5zaGFkb3dNYXAnO1xyXG5cclxuXHRcdFx0XHRzaGFkb3cuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggc2hhZG93Lm1hcCApO1xyXG5cdFx0XHRyZW5kZXJlci5jbGVhcigpO1xyXG5cclxuXHRcdFx0Y29uc3Qgdmlld3BvcnRDb3VudCA9IHNoYWRvdy5nZXRWaWV3cG9ydENvdW50KCk7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgdnAgPSAwOyB2cCA8IHZpZXdwb3J0Q291bnQ7IHZwICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB2aWV3cG9ydCA9IHNoYWRvdy5nZXRWaWV3cG9ydCggdnAgKTtcclxuXHJcblx0XHRcdFx0X3ZpZXdwb3J0LnNldChcclxuXHRcdFx0XHRcdF92aWV3cG9ydFNpemUueCAqIHZpZXdwb3J0LngsXHJcblx0XHRcdFx0XHRfdmlld3BvcnRTaXplLnkgKiB2aWV3cG9ydC55LFxyXG5cdFx0XHRcdFx0X3ZpZXdwb3J0U2l6ZS54ICogdmlld3BvcnQueixcclxuXHRcdFx0XHRcdF92aWV3cG9ydFNpemUueSAqIHZpZXdwb3J0LndcclxuXHRcdFx0XHQpO1xyXG5cclxuXHRcdFx0XHRfc3RhdGUudmlld3BvcnQoIF92aWV3cG9ydCApO1xyXG5cclxuXHRcdFx0XHRzaGFkb3cudXBkYXRlTWF0cmljZXMoIGxpZ2h0LCB2cCApO1xyXG5cclxuXHRcdFx0XHRfZnJ1c3R1bSA9IHNoYWRvdy5nZXRGcnVzdHVtKCk7XHJcblxyXG5cdFx0XHRcdHJlbmRlck9iamVjdCggc2NlbmUsIGNhbWVyYSwgc2hhZG93LmNhbWVyYSwgbGlnaHQsIHRoaXMudHlwZSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gZG8gYmx1ciBwYXNzIGZvciBWU01cclxuXHJcblx0XHRcdGlmICggc2hhZG93LmlzUG9pbnRMaWdodFNoYWRvdyAhPT0gdHJ1ZSAmJiB0aGlzLnR5cGUgPT09IFZTTVNoYWRvd01hcCApIHtcclxuXHJcblx0XHRcdFx0VlNNUGFzcyggc2hhZG93LCBjYW1lcmEgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHNoYWRvdy5uZWVkc1VwZGF0ZSA9IGZhbHNlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRfcHJldmlvdXNUeXBlID0gdGhpcy50eXBlO1xyXG5cclxuXHRcdHNjb3BlLm5lZWRzVXBkYXRlID0gZmFsc2U7XHJcblxyXG5cdFx0cmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCBjdXJyZW50UmVuZGVyVGFyZ2V0LCBhY3RpdmVDdWJlRmFjZSwgYWN0aXZlTWlwbWFwTGV2ZWwgKTtcclxuXHJcblx0fTtcclxuXHJcblx0ZnVuY3Rpb24gVlNNUGFzcyggc2hhZG93LCBjYW1lcmEgKSB7XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSBvYmplY3RzLnVwZGF0ZSggZnVsbFNjcmVlbk1lc2ggKTtcclxuXHJcblx0XHRpZiAoIHNoYWRvd01hdGVyaWFsVmVydGljYWwuZGVmaW5lcy5WU01fU0FNUExFUyAhPT0gc2hhZG93LmJsdXJTYW1wbGVzICkge1xyXG5cclxuXHRcdFx0c2hhZG93TWF0ZXJpYWxWZXJ0aWNhbC5kZWZpbmVzLlZTTV9TQU1QTEVTID0gc2hhZG93LmJsdXJTYW1wbGVzO1xyXG5cdFx0XHRzaGFkb3dNYXRlcmlhbEhvcml6b250YWwuZGVmaW5lcy5WU01fU0FNUExFUyA9IHNoYWRvdy5ibHVyU2FtcGxlcztcclxuXHJcblx0XHRcdHNoYWRvd01hdGVyaWFsVmVydGljYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cdFx0XHRzaGFkb3dNYXRlcmlhbEhvcml6b250YWwubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHNoYWRvdy5tYXBQYXNzID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0c2hhZG93Lm1hcFBhc3MgPSBuZXcgV2ViR0xSZW5kZXJUYXJnZXQoIF9zaGFkb3dNYXBTaXplLngsIF9zaGFkb3dNYXBTaXplLnkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gdmVydGljYWwgcGFzc1xyXG5cclxuXHRcdHNoYWRvd01hdGVyaWFsVmVydGljYWwudW5pZm9ybXMuc2hhZG93X3Bhc3MudmFsdWUgPSBzaGFkb3cubWFwLnRleHR1cmU7XHJcblx0XHRzaGFkb3dNYXRlcmlhbFZlcnRpY2FsLnVuaWZvcm1zLnJlc29sdXRpb24udmFsdWUgPSBzaGFkb3cubWFwU2l6ZTtcclxuXHRcdHNoYWRvd01hdGVyaWFsVmVydGljYWwudW5pZm9ybXMucmFkaXVzLnZhbHVlID0gc2hhZG93LnJhZGl1cztcclxuXHRcdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggc2hhZG93Lm1hcFBhc3MgKTtcclxuXHRcdHJlbmRlcmVyLmNsZWFyKCk7XHJcblx0XHRyZW5kZXJlci5yZW5kZXJCdWZmZXJEaXJlY3QoIGNhbWVyYSwgbnVsbCwgZ2VvbWV0cnksIHNoYWRvd01hdGVyaWFsVmVydGljYWwsIGZ1bGxTY3JlZW5NZXNoLCBudWxsICk7XHJcblxyXG5cdFx0Ly8gaG9yaXpvbnRhbCBwYXNzXHJcblxyXG5cdFx0c2hhZG93TWF0ZXJpYWxIb3Jpem9udGFsLnVuaWZvcm1zLnNoYWRvd19wYXNzLnZhbHVlID0gc2hhZG93Lm1hcFBhc3MudGV4dHVyZTtcclxuXHRcdHNoYWRvd01hdGVyaWFsSG9yaXpvbnRhbC51bmlmb3Jtcy5yZXNvbHV0aW9uLnZhbHVlID0gc2hhZG93Lm1hcFNpemU7XHJcblx0XHRzaGFkb3dNYXRlcmlhbEhvcml6b250YWwudW5pZm9ybXMucmFkaXVzLnZhbHVlID0gc2hhZG93LnJhZGl1cztcclxuXHRcdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggc2hhZG93Lm1hcCApO1xyXG5cdFx0cmVuZGVyZXIuY2xlYXIoKTtcclxuXHRcdHJlbmRlcmVyLnJlbmRlckJ1ZmZlckRpcmVjdCggY2FtZXJhLCBudWxsLCBnZW9tZXRyeSwgc2hhZG93TWF0ZXJpYWxIb3Jpem9udGFsLCBmdWxsU2NyZWVuTWVzaCwgbnVsbCApO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGdldERlcHRoTWF0ZXJpYWwoIG9iamVjdCwgbWF0ZXJpYWwsIGxpZ2h0LCB0eXBlICkge1xyXG5cclxuXHRcdGxldCByZXN1bHQgPSBudWxsO1xyXG5cclxuXHRcdGNvbnN0IGN1c3RvbU1hdGVyaWFsID0gKCBsaWdodC5pc1BvaW50TGlnaHQgPT09IHRydWUgKSA/IG9iamVjdC5jdXN0b21EaXN0YW5jZU1hdGVyaWFsIDogb2JqZWN0LmN1c3RvbURlcHRoTWF0ZXJpYWw7XHJcblxyXG5cdFx0aWYgKCBjdXN0b21NYXRlcmlhbCAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0cmVzdWx0ID0gY3VzdG9tTWF0ZXJpYWw7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHJlc3VsdCA9ICggbGlnaHQuaXNQb2ludExpZ2h0ID09PSB0cnVlICkgPyBfZGlzdGFuY2VNYXRlcmlhbCA6IF9kZXB0aE1hdGVyaWFsO1xyXG5cclxuXHRcdFx0aWYgKCAoIHJlbmRlcmVyLmxvY2FsQ2xpcHBpbmdFbmFibGVkICYmIG1hdGVyaWFsLmNsaXBTaGFkb3dzID09PSB0cnVlICYmIEFycmF5LmlzQXJyYXkoIG1hdGVyaWFsLmNsaXBwaW5nUGxhbmVzICkgJiYgbWF0ZXJpYWwuY2xpcHBpbmdQbGFuZXMubGVuZ3RoICE9PSAwICkgfHxcclxuXHRcdFx0XHQoIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCAmJiBtYXRlcmlhbC5kaXNwbGFjZW1lbnRTY2FsZSAhPT0gMCApIHx8XHJcblx0XHRcdFx0KCBtYXRlcmlhbC5hbHBoYU1hcCAmJiBtYXRlcmlhbC5hbHBoYVRlc3QgPiAwICkgfHxcclxuXHRcdFx0XHQoIG1hdGVyaWFsLm1hcCAmJiBtYXRlcmlhbC5hbHBoYVRlc3QgPiAwICkgKSB7XHJcblxyXG5cdFx0XHRcdC8vIGluIHRoaXMgY2FzZSB3ZSBuZWVkIGEgdW5pcXVlIG1hdGVyaWFsIGluc3RhbmNlIHJlZmxlY3RpbmcgdGhlXHJcblx0XHRcdFx0Ly8gYXBwcm9wcmlhdGUgc3RhdGVcclxuXHJcblx0XHRcdFx0Y29uc3Qga2V5QSA9IHJlc3VsdC51dWlkLCBrZXlCID0gbWF0ZXJpYWwudXVpZDtcclxuXHJcblx0XHRcdFx0bGV0IG1hdGVyaWFsc0ZvclZhcmlhbnQgPSBfbWF0ZXJpYWxDYWNoZVsga2V5QSBdO1xyXG5cclxuXHRcdFx0XHRpZiAoIG1hdGVyaWFsc0ZvclZhcmlhbnQgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRtYXRlcmlhbHNGb3JWYXJpYW50ID0ge307XHJcblx0XHRcdFx0XHRfbWF0ZXJpYWxDYWNoZVsga2V5QSBdID0gbWF0ZXJpYWxzRm9yVmFyaWFudDtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRsZXQgY2FjaGVkTWF0ZXJpYWwgPSBtYXRlcmlhbHNGb3JWYXJpYW50WyBrZXlCIF07XHJcblxyXG5cdFx0XHRcdGlmICggY2FjaGVkTWF0ZXJpYWwgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRjYWNoZWRNYXRlcmlhbCA9IHJlc3VsdC5jbG9uZSgpO1xyXG5cdFx0XHRcdFx0bWF0ZXJpYWxzRm9yVmFyaWFudFsga2V5QiBdID0gY2FjaGVkTWF0ZXJpYWw7XHJcblx0XHRcdFx0XHRtYXRlcmlhbC5hZGRFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uTWF0ZXJpYWxEaXNwb3NlICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0cmVzdWx0ID0gY2FjaGVkTWF0ZXJpYWw7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJlc3VsdC52aXNpYmxlID0gbWF0ZXJpYWwudmlzaWJsZTtcclxuXHRcdHJlc3VsdC53aXJlZnJhbWUgPSBtYXRlcmlhbC53aXJlZnJhbWU7XHJcblxyXG5cdFx0aWYgKCB0eXBlID09PSBWU01TaGFkb3dNYXAgKSB7XHJcblxyXG5cdFx0XHRyZXN1bHQuc2lkZSA9ICggbWF0ZXJpYWwuc2hhZG93U2lkZSAhPT0gbnVsbCApID8gbWF0ZXJpYWwuc2hhZG93U2lkZSA6IG1hdGVyaWFsLnNpZGU7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHJlc3VsdC5zaWRlID0gKCBtYXRlcmlhbC5zaGFkb3dTaWRlICE9PSBudWxsICkgPyBtYXRlcmlhbC5zaGFkb3dTaWRlIDogc2hhZG93U2lkZVsgbWF0ZXJpYWwuc2lkZSBdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXN1bHQuYWxwaGFNYXAgPSBtYXRlcmlhbC5hbHBoYU1hcDtcclxuXHRcdHJlc3VsdC5hbHBoYVRlc3QgPSBtYXRlcmlhbC5hbHBoYVRlc3Q7XHJcblx0XHRyZXN1bHQubWFwID0gbWF0ZXJpYWwubWFwO1xyXG5cclxuXHRcdHJlc3VsdC5jbGlwU2hhZG93cyA9IG1hdGVyaWFsLmNsaXBTaGFkb3dzO1xyXG5cdFx0cmVzdWx0LmNsaXBwaW5nUGxhbmVzID0gbWF0ZXJpYWwuY2xpcHBpbmdQbGFuZXM7XHJcblx0XHRyZXN1bHQuY2xpcEludGVyc2VjdGlvbiA9IG1hdGVyaWFsLmNsaXBJbnRlcnNlY3Rpb247XHJcblxyXG5cdFx0cmVzdWx0LmRpc3BsYWNlbWVudE1hcCA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcDtcclxuXHRcdHJlc3VsdC5kaXNwbGFjZW1lbnRTY2FsZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudFNjYWxlO1xyXG5cdFx0cmVzdWx0LmRpc3BsYWNlbWVudEJpYXMgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRCaWFzO1xyXG5cclxuXHRcdHJlc3VsdC53aXJlZnJhbWVMaW5ld2lkdGggPSBtYXRlcmlhbC53aXJlZnJhbWVMaW5ld2lkdGg7XHJcblx0XHRyZXN1bHQubGluZXdpZHRoID0gbWF0ZXJpYWwubGluZXdpZHRoO1xyXG5cclxuXHRcdGlmICggbGlnaHQuaXNQb2ludExpZ2h0ID09PSB0cnVlICYmIHJlc3VsdC5pc01lc2hEaXN0YW5jZU1hdGVyaWFsID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0Y29uc3QgbWF0ZXJpYWxQcm9wZXJ0aWVzID0gcmVuZGVyZXIucHJvcGVydGllcy5nZXQoIHJlc3VsdCApO1xyXG5cdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMubGlnaHQgPSBsaWdodDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiByZW5kZXJPYmplY3QoIG9iamVjdCwgY2FtZXJhLCBzaGFkb3dDYW1lcmEsIGxpZ2h0LCB0eXBlICkge1xyXG5cclxuXHRcdGlmICggb2JqZWN0LnZpc2libGUgPT09IGZhbHNlICkgcmV0dXJuO1xyXG5cclxuXHRcdGNvbnN0IHZpc2libGUgPSBvYmplY3QubGF5ZXJzLnRlc3QoIGNhbWVyYS5sYXllcnMgKTtcclxuXHJcblx0XHRpZiAoIHZpc2libGUgJiYgKCBvYmplY3QuaXNNZXNoIHx8IG9iamVjdC5pc0xpbmUgfHwgb2JqZWN0LmlzUG9pbnRzICkgKSB7XHJcblxyXG5cdFx0XHRpZiAoICggb2JqZWN0LmNhc3RTaGFkb3cgfHwgKCBvYmplY3QucmVjZWl2ZVNoYWRvdyAmJiB0eXBlID09PSBWU01TaGFkb3dNYXAgKSApICYmICggISBvYmplY3QuZnJ1c3R1bUN1bGxlZCB8fCBfZnJ1c3R1bS5pbnRlcnNlY3RzT2JqZWN0KCBvYmplY3QgKSApICkge1xyXG5cclxuXHRcdFx0XHRvYmplY3QubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIHNoYWRvd0NhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UsIG9iamVjdC5tYXRyaXhXb3JsZCApO1xyXG5cclxuXHRcdFx0XHRjb25zdCBnZW9tZXRyeSA9IG9iamVjdHMudXBkYXRlKCBvYmplY3QgKTtcclxuXHRcdFx0XHRjb25zdCBtYXRlcmlhbCA9IG9iamVjdC5tYXRlcmlhbDtcclxuXHJcblx0XHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBtYXRlcmlhbCApICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGdyb3VwcyA9IGdlb21ldHJ5Lmdyb3VwcztcclxuXHJcblx0XHRcdFx0XHRmb3IgKCBsZXQgayA9IDAsIGtsID0gZ3JvdXBzLmxlbmd0aDsgayA8IGtsOyBrICsrICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgZ3JvdXAgPSBncm91cHNbIGsgXTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgZ3JvdXBNYXRlcmlhbCA9IG1hdGVyaWFsWyBncm91cC5tYXRlcmlhbEluZGV4IF07XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIGdyb3VwTWF0ZXJpYWwgJiYgZ3JvdXBNYXRlcmlhbC52aXNpYmxlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRjb25zdCBkZXB0aE1hdGVyaWFsID0gZ2V0RGVwdGhNYXRlcmlhbCggb2JqZWN0LCBncm91cE1hdGVyaWFsLCBsaWdodCwgdHlwZSApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRvYmplY3Qub25CZWZvcmVTaGFkb3coIHJlbmRlcmVyLCBvYmplY3QsIGNhbWVyYSwgc2hhZG93Q2FtZXJhLCBnZW9tZXRyeSwgZGVwdGhNYXRlcmlhbCwgZ3JvdXAgKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0cmVuZGVyZXIucmVuZGVyQnVmZmVyRGlyZWN0KCBzaGFkb3dDYW1lcmEsIG51bGwsIGdlb21ldHJ5LCBkZXB0aE1hdGVyaWFsLCBvYmplY3QsIGdyb3VwICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdG9iamVjdC5vbkFmdGVyU2hhZG93KCByZW5kZXJlciwgb2JqZWN0LCBjYW1lcmEsIHNoYWRvd0NhbWVyYSwgZ2VvbWV0cnksIGRlcHRoTWF0ZXJpYWwsIGdyb3VwICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC52aXNpYmxlICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGRlcHRoTWF0ZXJpYWwgPSBnZXREZXB0aE1hdGVyaWFsKCBvYmplY3QsIG1hdGVyaWFsLCBsaWdodCwgdHlwZSApO1xyXG5cclxuXHRcdFx0XHRcdG9iamVjdC5vbkJlZm9yZVNoYWRvdyggcmVuZGVyZXIsIG9iamVjdCwgY2FtZXJhLCBzaGFkb3dDYW1lcmEsIGdlb21ldHJ5LCBkZXB0aE1hdGVyaWFsLCBudWxsICk7XHJcblxyXG5cdFx0XHRcdFx0cmVuZGVyZXIucmVuZGVyQnVmZmVyRGlyZWN0KCBzaGFkb3dDYW1lcmEsIG51bGwsIGdlb21ldHJ5LCBkZXB0aE1hdGVyaWFsLCBvYmplY3QsIG51bGwgKTtcclxuXHJcblx0XHRcdFx0XHRvYmplY3Qub25BZnRlclNoYWRvdyggcmVuZGVyZXIsIG9iamVjdCwgY2FtZXJhLCBzaGFkb3dDYW1lcmEsIGdlb21ldHJ5LCBkZXB0aE1hdGVyaWFsLCBudWxsICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgY2hpbGRyZW4gPSBvYmplY3QuY2hpbGRyZW47XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdHJlbmRlck9iamVjdCggY2hpbGRyZW5bIGkgXSwgY2FtZXJhLCBzaGFkb3dDYW1lcmEsIGxpZ2h0LCB0eXBlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIG9uTWF0ZXJpYWxEaXNwb3NlKCBldmVudCApIHtcclxuXHJcblx0XHRjb25zdCBtYXRlcmlhbCA9IGV2ZW50LnRhcmdldDtcclxuXHJcblx0XHRtYXRlcmlhbC5yZW1vdmVFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uTWF0ZXJpYWxEaXNwb3NlICk7XHJcblxyXG5cdFx0Ly8gbWFrZSBzdXJlIHRvIHJlbW92ZSB0aGUgdW5pcXVlIGRpc3RhbmNlL2RlcHRoIG1hdGVyaWFscyB1c2VkIGZvciBzaGFkb3cgbWFwIHJlbmRlcmluZ1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IGlkIGluIF9tYXRlcmlhbENhY2hlICkge1xyXG5cclxuXHRcdFx0Y29uc3QgY2FjaGUgPSBfbWF0ZXJpYWxDYWNoZVsgaWQgXTtcclxuXHJcblx0XHRcdGNvbnN0IHV1aWQgPSBldmVudC50YXJnZXQudXVpZDtcclxuXHJcblx0XHRcdGlmICggdXVpZCBpbiBjYWNoZSApIHtcclxuXHJcblx0XHRcdFx0Y29uc3Qgc2hhZG93TWF0ZXJpYWwgPSBjYWNoZVsgdXVpZCBdO1xyXG5cdFx0XHRcdHNoYWRvd01hdGVyaWFsLmRpc3Bvc2UoKTtcclxuXHRcdFx0XHRkZWxldGUgY2FjaGVbIHV1aWQgXTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBXZWJHTFNoYWRvd01hcCB9O1xyXG4iLCJpbXBvcnQgeyBOb3RFcXVhbERlcHRoLCBHcmVhdGVyRGVwdGgsIEdyZWF0ZXJFcXVhbERlcHRoLCBFcXVhbERlcHRoLCBMZXNzRXF1YWxEZXB0aCwgTGVzc0RlcHRoLCBBbHdheXNEZXB0aCwgTmV2ZXJEZXB0aCwgQ3VsbEZhY2VGcm9udCwgQ3VsbEZhY2VCYWNrLCBDdWxsRmFjZU5vbmUsIERvdWJsZVNpZGUsIEJhY2tTaWRlLCBDdXN0b21CbGVuZGluZywgTXVsdGlwbHlCbGVuZGluZywgU3VidHJhY3RpdmVCbGVuZGluZywgQWRkaXRpdmVCbGVuZGluZywgTm9CbGVuZGluZywgTm9ybWFsQmxlbmRpbmcsIEFkZEVxdWF0aW9uLCBTdWJ0cmFjdEVxdWF0aW9uLCBSZXZlcnNlU3VidHJhY3RFcXVhdGlvbiwgTWluRXF1YXRpb24sIE1heEVxdWF0aW9uLCBaZXJvRmFjdG9yLCBPbmVGYWN0b3IsIFNyY0NvbG9yRmFjdG9yLCBTcmNBbHBoYUZhY3RvciwgU3JjQWxwaGFTYXR1cmF0ZUZhY3RvciwgRHN0Q29sb3JGYWN0b3IsIERzdEFscGhhRmFjdG9yLCBPbmVNaW51c1NyY0NvbG9yRmFjdG9yLCBPbmVNaW51c1NyY0FscGhhRmFjdG9yLCBPbmVNaW51c0RzdENvbG9yRmFjdG9yLCBPbmVNaW51c0RzdEFscGhhRmFjdG9yLCBDb25zdGFudENvbG9yRmFjdG9yLCBPbmVNaW51c0NvbnN0YW50Q29sb3JGYWN0b3IsIENvbnN0YW50QWxwaGFGYWN0b3IsIE9uZU1pbnVzQ29uc3RhbnRBbHBoYUZhY3RvciB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vLi4vbWF0aC9Db2xvci5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjQgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjQuanMnO1xyXG5cclxuY29uc3QgcmV2ZXJzZWRGdW5jcyA9IHtcclxuXHRbIE5ldmVyRGVwdGggXTogQWx3YXlzRGVwdGgsXHJcblx0WyBMZXNzRGVwdGggXTogR3JlYXRlckRlcHRoLFxyXG5cdFsgRXF1YWxEZXB0aCBdOiBOb3RFcXVhbERlcHRoLFxyXG5cdFsgTGVzc0VxdWFsRGVwdGggXTogR3JlYXRlckVxdWFsRGVwdGgsXHJcblxyXG5cdFsgQWx3YXlzRGVwdGggXTogTmV2ZXJEZXB0aCxcclxuXHRbIEdyZWF0ZXJEZXB0aCBdOiBMZXNzRGVwdGgsXHJcblx0WyBOb3RFcXVhbERlcHRoIF06IEVxdWFsRGVwdGgsXHJcblx0WyBHcmVhdGVyRXF1YWxEZXB0aCBdOiBMZXNzRXF1YWxEZXB0aCxcclxufTtcclxuXHJcbmZ1bmN0aW9uIFdlYkdMU3RhdGUoIGdsLCBleHRlbnNpb25zICkge1xyXG5cclxuXHRmdW5jdGlvbiBDb2xvckJ1ZmZlcigpIHtcclxuXHJcblx0XHRsZXQgbG9ja2VkID0gZmFsc2U7XHJcblxyXG5cdFx0Y29uc3QgY29sb3IgPSBuZXcgVmVjdG9yNCgpO1xyXG5cdFx0bGV0IGN1cnJlbnRDb2xvck1hc2sgPSBudWxsO1xyXG5cdFx0Y29uc3QgY3VycmVudENvbG9yQ2xlYXIgPSBuZXcgVmVjdG9yNCggMCwgMCwgMCwgMCApO1xyXG5cclxuXHRcdHJldHVybiB7XHJcblxyXG5cdFx0XHRzZXRNYXNrOiBmdW5jdGlvbiAoIGNvbG9yTWFzayApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBjdXJyZW50Q29sb3JNYXNrICE9PSBjb2xvck1hc2sgJiYgISBsb2NrZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0Z2wuY29sb3JNYXNrKCBjb2xvck1hc2ssIGNvbG9yTWFzaywgY29sb3JNYXNrLCBjb2xvck1hc2sgKTtcclxuXHRcdFx0XHRcdGN1cnJlbnRDb2xvck1hc2sgPSBjb2xvck1hc2s7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHRzZXRMb2NrZWQ6IGZ1bmN0aW9uICggbG9jayApIHtcclxuXHJcblx0XHRcdFx0bG9ja2VkID0gbG9jaztcclxuXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHRzZXRDbGVhcjogZnVuY3Rpb24gKCByLCBnLCBiLCBhLCBwcmVtdWx0aXBsaWVkQWxwaGEgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggcHJlbXVsdGlwbGllZEFscGhhID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRcdHIgKj0gYTsgZyAqPSBhOyBiICo9IGE7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Y29sb3Iuc2V0KCByLCBnLCBiLCBhICk7XHJcblxyXG5cdFx0XHRcdGlmICggY3VycmVudENvbG9yQ2xlYXIuZXF1YWxzKCBjb2xvciApID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdFx0XHRnbC5jbGVhckNvbG9yKCByLCBnLCBiLCBhICk7XHJcblx0XHRcdFx0XHRjdXJyZW50Q29sb3JDbGVhci5jb3B5KCBjb2xvciApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9LFxyXG5cclxuXHRcdFx0cmVzZXQ6IGZ1bmN0aW9uICgpIHtcclxuXHJcblx0XHRcdFx0bG9ja2VkID0gZmFsc2U7XHJcblxyXG5cdFx0XHRcdGN1cnJlbnRDb2xvck1hc2sgPSBudWxsO1xyXG5cdFx0XHRcdGN1cnJlbnRDb2xvckNsZWFyLnNldCggLSAxLCAwLCAwLCAwICk7IC8vIHNldCB0byBpbnZhbGlkIHN0YXRlXHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fTtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBEZXB0aEJ1ZmZlcigpIHtcclxuXHJcblx0XHRsZXQgbG9ja2VkID0gZmFsc2U7XHJcblxyXG5cdFx0bGV0IGN1cnJlbnRSZXZlcnNlZCA9IGZhbHNlO1xyXG5cdFx0bGV0IGN1cnJlbnREZXB0aE1hc2sgPSBudWxsO1xyXG5cdFx0bGV0IGN1cnJlbnREZXB0aEZ1bmMgPSBudWxsO1xyXG5cdFx0bGV0IGN1cnJlbnREZXB0aENsZWFyID0gbnVsbDtcclxuXHJcblx0XHRyZXR1cm4ge1xyXG5cclxuXHRcdFx0c2V0UmV2ZXJzZWQ6IGZ1bmN0aW9uICggcmV2ZXJzZWQgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggY3VycmVudFJldmVyc2VkICE9PSByZXZlcnNlZCApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBleHQgPSBleHRlbnNpb25zLmdldCggJ0VYVF9jbGlwX2NvbnRyb2wnICk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCByZXZlcnNlZCApIHtcclxuXHJcblx0XHRcdFx0XHRcdGV4dC5jbGlwQ29udHJvbEVYVCggZXh0LkxPV0VSX0xFRlRfRVhULCBleHQuWkVST19UT19PTkVfRVhUICk7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdGV4dC5jbGlwQ29udHJvbEVYVCggZXh0LkxPV0VSX0xFRlRfRVhULCBleHQuTkVHQVRJVkVfT05FX1RPX09ORV9FWFQgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Y3VycmVudFJldmVyc2VkID0gcmV2ZXJzZWQ7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3Qgb2xkRGVwdGggPSBjdXJyZW50RGVwdGhDbGVhcjtcclxuXHRcdFx0XHRcdGN1cnJlbnREZXB0aENsZWFyID0gbnVsbDtcclxuXHRcdFx0XHRcdHRoaXMuc2V0Q2xlYXIoIG9sZERlcHRoICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHRnZXRSZXZlcnNlZDogZnVuY3Rpb24gKCkge1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gY3VycmVudFJldmVyc2VkO1xyXG5cclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdHNldFRlc3Q6IGZ1bmN0aW9uICggZGVwdGhUZXN0ICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIGRlcHRoVGVzdCApIHtcclxuXHJcblx0XHRcdFx0XHRlbmFibGUoIGdsLkRFUFRIX1RFU1QgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRkaXNhYmxlKCBnbC5ERVBUSF9URVNUICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHRzZXRNYXNrOiBmdW5jdGlvbiAoIGRlcHRoTWFzayApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBjdXJyZW50RGVwdGhNYXNrICE9PSBkZXB0aE1hc2sgJiYgISBsb2NrZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0Z2wuZGVwdGhNYXNrKCBkZXB0aE1hc2sgKTtcclxuXHRcdFx0XHRcdGN1cnJlbnREZXB0aE1hc2sgPSBkZXB0aE1hc2s7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHRzZXRGdW5jOiBmdW5jdGlvbiAoIGRlcHRoRnVuYyApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBjdXJyZW50UmV2ZXJzZWQgKSBkZXB0aEZ1bmMgPSByZXZlcnNlZEZ1bmNzWyBkZXB0aEZ1bmMgXTtcclxuXHJcblx0XHRcdFx0aWYgKCBjdXJyZW50RGVwdGhGdW5jICE9PSBkZXB0aEZ1bmMgKSB7XHJcblxyXG5cdFx0XHRcdFx0c3dpdGNoICggZGVwdGhGdW5jICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y2FzZSBOZXZlckRlcHRoOlxyXG5cclxuXHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIGdsLk5FVkVSICk7XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0XHRjYXNlIEFsd2F5c0RlcHRoOlxyXG5cclxuXHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIGdsLkFMV0FZUyApO1xyXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdFx0Y2FzZSBMZXNzRGVwdGg6XHJcblxyXG5cdFx0XHRcdFx0XHRcdGdsLmRlcHRoRnVuYyggZ2wuTEVTUyApO1xyXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdFx0Y2FzZSBMZXNzRXF1YWxEZXB0aDpcclxuXHJcblx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5MRVFVQUwgKTtcclxuXHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRcdGNhc2UgRXF1YWxEZXB0aDpcclxuXHJcblx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5FUVVBTCApO1xyXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdFx0Y2FzZSBHcmVhdGVyRXF1YWxEZXB0aDpcclxuXHJcblx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5HRVFVQUwgKTtcclxuXHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRcdGNhc2UgR3JlYXRlckRlcHRoOlxyXG5cclxuXHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIGdsLkdSRUFURVIgKTtcclxuXHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRcdGNhc2UgTm90RXF1YWxEZXB0aDpcclxuXHJcblx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5OT1RFUVVBTCApO1xyXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdFx0ZGVmYXVsdDpcclxuXHJcblx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5MRVFVQUwgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Y3VycmVudERlcHRoRnVuYyA9IGRlcHRoRnVuYztcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdHNldExvY2tlZDogZnVuY3Rpb24gKCBsb2NrICkge1xyXG5cclxuXHRcdFx0XHRsb2NrZWQgPSBsb2NrO1xyXG5cclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdHNldENsZWFyOiBmdW5jdGlvbiAoIGRlcHRoICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIGN1cnJlbnREZXB0aENsZWFyICE9PSBkZXB0aCApIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGN1cnJlbnRSZXZlcnNlZCApIHtcclxuXHJcblx0XHRcdFx0XHRcdGRlcHRoID0gMSAtIGRlcHRoO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRnbC5jbGVhckRlcHRoKCBkZXB0aCApO1xyXG5cdFx0XHRcdFx0Y3VycmVudERlcHRoQ2xlYXIgPSBkZXB0aDtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdHJlc2V0OiBmdW5jdGlvbiAoKSB7XHJcblxyXG5cdFx0XHRcdGxvY2tlZCA9IGZhbHNlO1xyXG5cclxuXHRcdFx0XHRjdXJyZW50RGVwdGhNYXNrID0gbnVsbDtcclxuXHRcdFx0XHRjdXJyZW50RGVwdGhGdW5jID0gbnVsbDtcclxuXHRcdFx0XHRjdXJyZW50RGVwdGhDbGVhciA9IG51bGw7XHJcblx0XHRcdFx0Y3VycmVudFJldmVyc2VkID0gZmFsc2U7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fTtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBTdGVuY2lsQnVmZmVyKCkge1xyXG5cclxuXHRcdGxldCBsb2NrZWQgPSBmYWxzZTtcclxuXHJcblx0XHRsZXQgY3VycmVudFN0ZW5jaWxNYXNrID0gbnVsbDtcclxuXHRcdGxldCBjdXJyZW50U3RlbmNpbEZ1bmMgPSBudWxsO1xyXG5cdFx0bGV0IGN1cnJlbnRTdGVuY2lsUmVmID0gbnVsbDtcclxuXHRcdGxldCBjdXJyZW50U3RlbmNpbEZ1bmNNYXNrID0gbnVsbDtcclxuXHRcdGxldCBjdXJyZW50U3RlbmNpbEZhaWwgPSBudWxsO1xyXG5cdFx0bGV0IGN1cnJlbnRTdGVuY2lsWkZhaWwgPSBudWxsO1xyXG5cdFx0bGV0IGN1cnJlbnRTdGVuY2lsWlBhc3MgPSBudWxsO1xyXG5cdFx0bGV0IGN1cnJlbnRTdGVuY2lsQ2xlYXIgPSBudWxsO1xyXG5cclxuXHRcdHJldHVybiB7XHJcblxyXG5cdFx0XHRzZXRUZXN0OiBmdW5jdGlvbiAoIHN0ZW5jaWxUZXN0ICkge1xyXG5cclxuXHRcdFx0XHRpZiAoICEgbG9ja2VkICkge1xyXG5cclxuXHRcdFx0XHRcdGlmICggc3RlbmNpbFRlc3QgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRlbmFibGUoIGdsLlNURU5DSUxfVEVTVCApO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRkaXNhYmxlKCBnbC5TVEVOQ0lMX1RFU1QgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHRzZXRNYXNrOiBmdW5jdGlvbiAoIHN0ZW5jaWxNYXNrICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIGN1cnJlbnRTdGVuY2lsTWFzayAhPT0gc3RlbmNpbE1hc2sgJiYgISBsb2NrZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0Z2wuc3RlbmNpbE1hc2soIHN0ZW5jaWxNYXNrICk7XHJcblx0XHRcdFx0XHRjdXJyZW50U3RlbmNpbE1hc2sgPSBzdGVuY2lsTWFzaztcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdHNldEZ1bmM6IGZ1bmN0aW9uICggc3RlbmNpbEZ1bmMsIHN0ZW5jaWxSZWYsIHN0ZW5jaWxNYXNrICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIGN1cnJlbnRTdGVuY2lsRnVuYyAhPT0gc3RlbmNpbEZ1bmMgfHxcclxuXHRcdFx0XHQgICAgIGN1cnJlbnRTdGVuY2lsUmVmICE9PSBzdGVuY2lsUmVmIHx8XHJcblx0XHRcdFx0ICAgICBjdXJyZW50U3RlbmNpbEZ1bmNNYXNrICE9PSBzdGVuY2lsTWFzayApIHtcclxuXHJcblx0XHRcdFx0XHRnbC5zdGVuY2lsRnVuYyggc3RlbmNpbEZ1bmMsIHN0ZW5jaWxSZWYsIHN0ZW5jaWxNYXNrICk7XHJcblxyXG5cdFx0XHRcdFx0Y3VycmVudFN0ZW5jaWxGdW5jID0gc3RlbmNpbEZ1bmM7XHJcblx0XHRcdFx0XHRjdXJyZW50U3RlbmNpbFJlZiA9IHN0ZW5jaWxSZWY7XHJcblx0XHRcdFx0XHRjdXJyZW50U3RlbmNpbEZ1bmNNYXNrID0gc3RlbmNpbE1hc2s7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHRzZXRPcDogZnVuY3Rpb24gKCBzdGVuY2lsRmFpbCwgc3RlbmNpbFpGYWlsLCBzdGVuY2lsWlBhc3MgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggY3VycmVudFN0ZW5jaWxGYWlsICE9PSBzdGVuY2lsRmFpbCB8fFxyXG5cdFx0XHRcdCAgICAgY3VycmVudFN0ZW5jaWxaRmFpbCAhPT0gc3RlbmNpbFpGYWlsIHx8XHJcblx0XHRcdFx0ICAgICBjdXJyZW50U3RlbmNpbFpQYXNzICE9PSBzdGVuY2lsWlBhc3MgKSB7XHJcblxyXG5cdFx0XHRcdFx0Z2wuc3RlbmNpbE9wKCBzdGVuY2lsRmFpbCwgc3RlbmNpbFpGYWlsLCBzdGVuY2lsWlBhc3MgKTtcclxuXHJcblx0XHRcdFx0XHRjdXJyZW50U3RlbmNpbEZhaWwgPSBzdGVuY2lsRmFpbDtcclxuXHRcdFx0XHRcdGN1cnJlbnRTdGVuY2lsWkZhaWwgPSBzdGVuY2lsWkZhaWw7XHJcblx0XHRcdFx0XHRjdXJyZW50U3RlbmNpbFpQYXNzID0gc3RlbmNpbFpQYXNzO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9LFxyXG5cclxuXHRcdFx0c2V0TG9ja2VkOiBmdW5jdGlvbiAoIGxvY2sgKSB7XHJcblxyXG5cdFx0XHRcdGxvY2tlZCA9IGxvY2s7XHJcblxyXG5cdFx0XHR9LFxyXG5cclxuXHRcdFx0c2V0Q2xlYXI6IGZ1bmN0aW9uICggc3RlbmNpbCApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBjdXJyZW50U3RlbmNpbENsZWFyICE9PSBzdGVuY2lsICkge1xyXG5cclxuXHRcdFx0XHRcdGdsLmNsZWFyU3RlbmNpbCggc3RlbmNpbCApO1xyXG5cdFx0XHRcdFx0Y3VycmVudFN0ZW5jaWxDbGVhciA9IHN0ZW5jaWw7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHRyZXNldDogZnVuY3Rpb24gKCkge1xyXG5cclxuXHRcdFx0XHRsb2NrZWQgPSBmYWxzZTtcclxuXHJcblx0XHRcdFx0Y3VycmVudFN0ZW5jaWxNYXNrID0gbnVsbDtcclxuXHRcdFx0XHRjdXJyZW50U3RlbmNpbEZ1bmMgPSBudWxsO1xyXG5cdFx0XHRcdGN1cnJlbnRTdGVuY2lsUmVmID0gbnVsbDtcclxuXHRcdFx0XHRjdXJyZW50U3RlbmNpbEZ1bmNNYXNrID0gbnVsbDtcclxuXHRcdFx0XHRjdXJyZW50U3RlbmNpbEZhaWwgPSBudWxsO1xyXG5cdFx0XHRcdGN1cnJlbnRTdGVuY2lsWkZhaWwgPSBudWxsO1xyXG5cdFx0XHRcdGN1cnJlbnRTdGVuY2lsWlBhc3MgPSBudWxsO1xyXG5cdFx0XHRcdGN1cnJlbnRTdGVuY2lsQ2xlYXIgPSBudWxsO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH07XHJcblxyXG5cdH1cclxuXHJcblx0Ly9cclxuXHJcblx0Y29uc3QgY29sb3JCdWZmZXIgPSBuZXcgQ29sb3JCdWZmZXIoKTtcclxuXHRjb25zdCBkZXB0aEJ1ZmZlciA9IG5ldyBEZXB0aEJ1ZmZlcigpO1xyXG5cdGNvbnN0IHN0ZW5jaWxCdWZmZXIgPSBuZXcgU3RlbmNpbEJ1ZmZlcigpO1xyXG5cclxuXHRjb25zdCB1Ym9CaW5kaW5ncyA9IG5ldyBXZWFrTWFwKCk7XHJcblx0Y29uc3QgdWJvUHJvZ3JhbU1hcCA9IG5ldyBXZWFrTWFwKCk7XHJcblxyXG5cdGxldCBlbmFibGVkQ2FwYWJpbGl0aWVzID0ge307XHJcblxyXG5cdGxldCBjdXJyZW50Qm91bmRGcmFtZWJ1ZmZlcnMgPSB7fTtcclxuXHRsZXQgY3VycmVudERyYXdidWZmZXJzID0gbmV3IFdlYWtNYXAoKTtcclxuXHRsZXQgZGVmYXVsdERyYXdidWZmZXJzID0gW107XHJcblxyXG5cdGxldCBjdXJyZW50UHJvZ3JhbSA9IG51bGw7XHJcblxyXG5cdGxldCBjdXJyZW50QmxlbmRpbmdFbmFibGVkID0gZmFsc2U7XHJcblx0bGV0IGN1cnJlbnRCbGVuZGluZyA9IG51bGw7XHJcblx0bGV0IGN1cnJlbnRCbGVuZEVxdWF0aW9uID0gbnVsbDtcclxuXHRsZXQgY3VycmVudEJsZW5kU3JjID0gbnVsbDtcclxuXHRsZXQgY3VycmVudEJsZW5kRHN0ID0gbnVsbDtcclxuXHRsZXQgY3VycmVudEJsZW5kRXF1YXRpb25BbHBoYSA9IG51bGw7XHJcblx0bGV0IGN1cnJlbnRCbGVuZFNyY0FscGhhID0gbnVsbDtcclxuXHRsZXQgY3VycmVudEJsZW5kRHN0QWxwaGEgPSBudWxsO1xyXG5cdGxldCBjdXJyZW50QmxlbmRDb2xvciA9IG5ldyBDb2xvciggMCwgMCwgMCApO1xyXG5cdGxldCBjdXJyZW50QmxlbmRBbHBoYSA9IDA7XHJcblx0bGV0IGN1cnJlbnRQcmVtdWx0aXBsZWRBbHBoYSA9IGZhbHNlO1xyXG5cclxuXHRsZXQgY3VycmVudEZsaXBTaWRlZCA9IG51bGw7XHJcblx0bGV0IGN1cnJlbnRDdWxsRmFjZSA9IG51bGw7XHJcblxyXG5cdGxldCBjdXJyZW50TGluZVdpZHRoID0gbnVsbDtcclxuXHJcblx0bGV0IGN1cnJlbnRQb2x5Z29uT2Zmc2V0RmFjdG9yID0gbnVsbDtcclxuXHRsZXQgY3VycmVudFBvbHlnb25PZmZzZXRVbml0cyA9IG51bGw7XHJcblxyXG5cdGNvbnN0IG1heFRleHR1cmVzID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfQ09NQklORURfVEVYVFVSRV9JTUFHRV9VTklUUyApO1xyXG5cclxuXHRsZXQgbGluZVdpZHRoQXZhaWxhYmxlID0gZmFsc2U7XHJcblx0bGV0IHZlcnNpb24gPSAwO1xyXG5cdGNvbnN0IGdsVmVyc2lvbiA9IGdsLmdldFBhcmFtZXRlciggZ2wuVkVSU0lPTiApO1xyXG5cclxuXHRpZiAoIGdsVmVyc2lvbi5pbmRleE9mKCAnV2ViR0wnICkgIT09IC0gMSApIHtcclxuXHJcblx0XHR2ZXJzaW9uID0gcGFyc2VGbG9hdCggL15XZWJHTCAoXFxkKS8uZXhlYyggZ2xWZXJzaW9uIClbIDEgXSApO1xyXG5cdFx0bGluZVdpZHRoQXZhaWxhYmxlID0gKCB2ZXJzaW9uID49IDEuMCApO1xyXG5cclxuXHR9IGVsc2UgaWYgKCBnbFZlcnNpb24uaW5kZXhPZiggJ09wZW5HTCBFUycgKSAhPT0gLSAxICkge1xyXG5cclxuXHRcdHZlcnNpb24gPSBwYXJzZUZsb2F0KCAvXk9wZW5HTCBFUyAoXFxkKS8uZXhlYyggZ2xWZXJzaW9uIClbIDEgXSApO1xyXG5cdFx0bGluZVdpZHRoQXZhaWxhYmxlID0gKCB2ZXJzaW9uID49IDIuMCApO1xyXG5cclxuXHR9XHJcblxyXG5cdGxldCBjdXJyZW50VGV4dHVyZVNsb3QgPSBudWxsO1xyXG5cdGxldCBjdXJyZW50Qm91bmRUZXh0dXJlcyA9IHt9O1xyXG5cclxuXHRjb25zdCBzY2lzc29yUGFyYW0gPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLlNDSVNTT1JfQk9YICk7XHJcblx0Y29uc3Qgdmlld3BvcnRQYXJhbSA9IGdsLmdldFBhcmFtZXRlciggZ2wuVklFV1BPUlQgKTtcclxuXHJcblx0Y29uc3QgY3VycmVudFNjaXNzb3IgPSBuZXcgVmVjdG9yNCgpLmZyb21BcnJheSggc2Npc3NvclBhcmFtICk7XHJcblx0Y29uc3QgY3VycmVudFZpZXdwb3J0ID0gbmV3IFZlY3RvcjQoKS5mcm9tQXJyYXkoIHZpZXdwb3J0UGFyYW0gKTtcclxuXHJcblx0ZnVuY3Rpb24gY3JlYXRlVGV4dHVyZSggdHlwZSwgdGFyZ2V0LCBjb3VudCwgZGltZW5zaW9ucyApIHtcclxuXHJcblx0XHRjb25zdCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoIDQgKTsgLy8gNCBpcyByZXF1aXJlZCB0byBtYXRjaCBkZWZhdWx0IHVucGFjayBhbGlnbm1lbnQgb2YgNC5cclxuXHRcdGNvbnN0IHRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7XHJcblxyXG5cdFx0Z2wuYmluZFRleHR1cmUoIHR5cGUsIHRleHR1cmUgKTtcclxuXHRcdGdsLnRleFBhcmFtZXRlcmkoIHR5cGUsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTkVBUkVTVCApO1xyXG5cdFx0Z2wudGV4UGFyYW1ldGVyaSggdHlwZSwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5ORUFSRVNUICk7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgY291bnQ7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHR5cGUgPT09IGdsLlRFWFRVUkVfM0QgfHwgdHlwZSA9PT0gZ2wuVEVYVFVSRV8yRF9BUlJBWSApIHtcclxuXHJcblx0XHRcdFx0Z2wudGV4SW1hZ2UzRCggdGFyZ2V0LCAwLCBnbC5SR0JBLCAxLCAxLCBkaW1lbnNpb25zLCAwLCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBkYXRhICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRnbC50ZXhJbWFnZTJEKCB0YXJnZXQgKyBpLCAwLCBnbC5SR0JBLCAxLCAxLCAwLCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBkYXRhICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0ZXh0dXJlO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvbnN0IGVtcHR5VGV4dHVyZXMgPSB7fTtcclxuXHRlbXB0eVRleHR1cmVzWyBnbC5URVhUVVJFXzJEIF0gPSBjcmVhdGVUZXh0dXJlKCBnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFXzJELCAxICk7XHJcblx0ZW1wdHlUZXh0dXJlc1sgZ2wuVEVYVFVSRV9DVUJFX01BUCBdID0gY3JlYXRlVGV4dHVyZSggZ2wuVEVYVFVSRV9DVUJFX01BUCwgZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YLCA2ICk7XHJcblx0ZW1wdHlUZXh0dXJlc1sgZ2wuVEVYVFVSRV8yRF9BUlJBWSBdID0gY3JlYXRlVGV4dHVyZSggZ2wuVEVYVFVSRV8yRF9BUlJBWSwgZ2wuVEVYVFVSRV8yRF9BUlJBWSwgMSwgMSApO1xyXG5cdGVtcHR5VGV4dHVyZXNbIGdsLlRFWFRVUkVfM0QgXSA9IGNyZWF0ZVRleHR1cmUoIGdsLlRFWFRVUkVfM0QsIGdsLlRFWFRVUkVfM0QsIDEsIDEgKTtcclxuXHJcblx0Ly8gaW5pdFxyXG5cclxuXHRjb2xvckJ1ZmZlci5zZXRDbGVhciggMCwgMCwgMCwgMSApO1xyXG5cdGRlcHRoQnVmZmVyLnNldENsZWFyKCAxICk7XHJcblx0c3RlbmNpbEJ1ZmZlci5zZXRDbGVhciggMCApO1xyXG5cclxuXHRlbmFibGUoIGdsLkRFUFRIX1RFU1QgKTtcclxuXHRkZXB0aEJ1ZmZlci5zZXRGdW5jKCBMZXNzRXF1YWxEZXB0aCApO1xyXG5cclxuXHRzZXRGbGlwU2lkZWQoIGZhbHNlICk7XHJcblx0c2V0Q3VsbEZhY2UoIEN1bGxGYWNlQmFjayApO1xyXG5cdGVuYWJsZSggZ2wuQ1VMTF9GQUNFICk7XHJcblxyXG5cdHNldEJsZW5kaW5nKCBOb0JsZW5kaW5nICk7XHJcblxyXG5cdC8vXHJcblxyXG5cdGZ1bmN0aW9uIGVuYWJsZSggaWQgKSB7XHJcblxyXG5cdFx0aWYgKCBlbmFibGVkQ2FwYWJpbGl0aWVzWyBpZCBdICE9PSB0cnVlICkge1xyXG5cclxuXHRcdFx0Z2wuZW5hYmxlKCBpZCApO1xyXG5cdFx0XHRlbmFibGVkQ2FwYWJpbGl0aWVzWyBpZCBdID0gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gZGlzYWJsZSggaWQgKSB7XHJcblxyXG5cdFx0aWYgKCBlbmFibGVkQ2FwYWJpbGl0aWVzWyBpZCBdICE9PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdGdsLmRpc2FibGUoIGlkICk7XHJcblx0XHRcdGVuYWJsZWRDYXBhYmlsaXRpZXNbIGlkIF0gPSBmYWxzZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gYmluZEZyYW1lYnVmZmVyKCB0YXJnZXQsIGZyYW1lYnVmZmVyICkge1xyXG5cclxuXHRcdGlmICggY3VycmVudEJvdW5kRnJhbWVidWZmZXJzWyB0YXJnZXQgXSAhPT0gZnJhbWVidWZmZXIgKSB7XHJcblxyXG5cdFx0XHRnbC5iaW5kRnJhbWVidWZmZXIoIHRhcmdldCwgZnJhbWVidWZmZXIgKTtcclxuXHJcblx0XHRcdGN1cnJlbnRCb3VuZEZyYW1lYnVmZmVyc1sgdGFyZ2V0IF0gPSBmcmFtZWJ1ZmZlcjtcclxuXHJcblx0XHRcdC8vIGdsLkRSQVdfRlJBTUVCVUZGRVIgaXMgZXF1aXZhbGVudCB0byBnbC5GUkFNRUJVRkZFUlxyXG5cclxuXHRcdFx0aWYgKCB0YXJnZXQgPT09IGdsLkRSQVdfRlJBTUVCVUZGRVIgKSB7XHJcblxyXG5cdFx0XHRcdGN1cnJlbnRCb3VuZEZyYW1lYnVmZmVyc1sgZ2wuRlJBTUVCVUZGRVIgXSA9IGZyYW1lYnVmZmVyO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCB0YXJnZXQgPT09IGdsLkZSQU1FQlVGRkVSICkge1xyXG5cclxuXHRcdFx0XHRjdXJyZW50Qm91bmRGcmFtZWJ1ZmZlcnNbIGdsLkRSQVdfRlJBTUVCVUZGRVIgXSA9IGZyYW1lYnVmZmVyO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBmYWxzZTtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBkcmF3QnVmZmVycyggcmVuZGVyVGFyZ2V0LCBmcmFtZWJ1ZmZlciApIHtcclxuXHJcblx0XHRsZXQgZHJhd0J1ZmZlcnMgPSBkZWZhdWx0RHJhd2J1ZmZlcnM7XHJcblxyXG5cdFx0bGV0IG5lZWRzVXBkYXRlID0gZmFsc2U7XHJcblxyXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQgKSB7XHJcblxyXG5cdFx0XHRkcmF3QnVmZmVycyA9IGN1cnJlbnREcmF3YnVmZmVycy5nZXQoIGZyYW1lYnVmZmVyICk7XHJcblxyXG5cdFx0XHRpZiAoIGRyYXdCdWZmZXJzID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGRyYXdCdWZmZXJzID0gW107XHJcblx0XHRcdFx0Y3VycmVudERyYXdidWZmZXJzLnNldCggZnJhbWVidWZmZXIsIGRyYXdCdWZmZXJzICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCB0ZXh0dXJlcyA9IHJlbmRlclRhcmdldC50ZXh0dXJlcztcclxuXHJcblx0XHRcdGlmICggZHJhd0J1ZmZlcnMubGVuZ3RoICE9PSB0ZXh0dXJlcy5sZW5ndGggfHwgZHJhd0J1ZmZlcnNbIDAgXSAhPT0gZ2wuQ09MT1JfQVRUQUNITUVOVDAgKSB7XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSB0ZXh0dXJlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRkcmF3QnVmZmVyc1sgaSBdID0gZ2wuQ09MT1JfQVRUQUNITUVOVDAgKyBpO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGRyYXdCdWZmZXJzLmxlbmd0aCA9IHRleHR1cmVzLmxlbmd0aDtcclxuXHJcblx0XHRcdFx0bmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRpZiAoIGRyYXdCdWZmZXJzWyAwIF0gIT09IGdsLkJBQ0sgKSB7XHJcblxyXG5cdFx0XHRcdGRyYXdCdWZmZXJzWyAwIF0gPSBnbC5CQUNLO1xyXG5cclxuXHRcdFx0XHRuZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggbmVlZHNVcGRhdGUgKSB7XHJcblxyXG5cdFx0XHRnbC5kcmF3QnVmZmVycyggZHJhd0J1ZmZlcnMgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gdXNlUHJvZ3JhbSggcHJvZ3JhbSApIHtcclxuXHJcblx0XHRpZiAoIGN1cnJlbnRQcm9ncmFtICE9PSBwcm9ncmFtICkge1xyXG5cclxuXHRcdFx0Z2wudXNlUHJvZ3JhbSggcHJvZ3JhbSApO1xyXG5cclxuXHRcdFx0Y3VycmVudFByb2dyYW0gPSBwcm9ncmFtO1xyXG5cclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBmYWxzZTtcclxuXHJcblx0fVxyXG5cclxuXHRjb25zdCBlcXVhdGlvblRvR0wgPSB7XHJcblx0XHRbIEFkZEVxdWF0aW9uIF06IGdsLkZVTkNfQURELFxyXG5cdFx0WyBTdWJ0cmFjdEVxdWF0aW9uIF06IGdsLkZVTkNfU1VCVFJBQ1QsXHJcblx0XHRbIFJldmVyc2VTdWJ0cmFjdEVxdWF0aW9uIF06IGdsLkZVTkNfUkVWRVJTRV9TVUJUUkFDVFxyXG5cdH07XHJcblxyXG5cdGVxdWF0aW9uVG9HTFsgTWluRXF1YXRpb24gXSA9IGdsLk1JTjtcclxuXHRlcXVhdGlvblRvR0xbIE1heEVxdWF0aW9uIF0gPSBnbC5NQVg7XHJcblxyXG5cdGNvbnN0IGZhY3RvclRvR0wgPSB7XHJcblx0XHRbIFplcm9GYWN0b3IgXTogZ2wuWkVSTyxcclxuXHRcdFsgT25lRmFjdG9yIF06IGdsLk9ORSxcclxuXHRcdFsgU3JjQ29sb3JGYWN0b3IgXTogZ2wuU1JDX0NPTE9SLFxyXG5cdFx0WyBTcmNBbHBoYUZhY3RvciBdOiBnbC5TUkNfQUxQSEEsXHJcblx0XHRbIFNyY0FscGhhU2F0dXJhdGVGYWN0b3IgXTogZ2wuU1JDX0FMUEhBX1NBVFVSQVRFLFxyXG5cdFx0WyBEc3RDb2xvckZhY3RvciBdOiBnbC5EU1RfQ09MT1IsXHJcblx0XHRbIERzdEFscGhhRmFjdG9yIF06IGdsLkRTVF9BTFBIQSxcclxuXHRcdFsgT25lTWludXNTcmNDb2xvckZhY3RvciBdOiBnbC5PTkVfTUlOVVNfU1JDX0NPTE9SLFxyXG5cdFx0WyBPbmVNaW51c1NyY0FscGhhRmFjdG9yIF06IGdsLk9ORV9NSU5VU19TUkNfQUxQSEEsXHJcblx0XHRbIE9uZU1pbnVzRHN0Q29sb3JGYWN0b3IgXTogZ2wuT05FX01JTlVTX0RTVF9DT0xPUixcclxuXHRcdFsgT25lTWludXNEc3RBbHBoYUZhY3RvciBdOiBnbC5PTkVfTUlOVVNfRFNUX0FMUEhBLFxyXG5cdFx0WyBDb25zdGFudENvbG9yRmFjdG9yIF06IGdsLkNPTlNUQU5UX0NPTE9SLFxyXG5cdFx0WyBPbmVNaW51c0NvbnN0YW50Q29sb3JGYWN0b3IgXTogZ2wuT05FX01JTlVTX0NPTlNUQU5UX0NPTE9SLFxyXG5cdFx0WyBDb25zdGFudEFscGhhRmFjdG9yIF06IGdsLkNPTlNUQU5UX0FMUEhBLFxyXG5cdFx0WyBPbmVNaW51c0NvbnN0YW50QWxwaGFGYWN0b3IgXTogZ2wuT05FX01JTlVTX0NPTlNUQU5UX0FMUEhBXHJcblx0fTtcclxuXHJcblx0ZnVuY3Rpb24gc2V0QmxlbmRpbmcoIGJsZW5kaW5nLCBibGVuZEVxdWF0aW9uLCBibGVuZFNyYywgYmxlbmREc3QsIGJsZW5kRXF1YXRpb25BbHBoYSwgYmxlbmRTcmNBbHBoYSwgYmxlbmREc3RBbHBoYSwgYmxlbmRDb2xvciwgYmxlbmRBbHBoYSwgcHJlbXVsdGlwbGllZEFscGhhICkge1xyXG5cclxuXHRcdGlmICggYmxlbmRpbmcgPT09IE5vQmxlbmRpbmcgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGN1cnJlbnRCbGVuZGluZ0VuYWJsZWQgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdGRpc2FibGUoIGdsLkJMRU5EICk7XHJcblx0XHRcdFx0Y3VycmVudEJsZW5kaW5nRW5hYmxlZCA9IGZhbHNlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGN1cnJlbnRCbGVuZGluZ0VuYWJsZWQgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0ZW5hYmxlKCBnbC5CTEVORCApO1xyXG5cdFx0XHRjdXJyZW50QmxlbmRpbmdFbmFibGVkID0gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBibGVuZGluZyAhPT0gQ3VzdG9tQmxlbmRpbmcgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGJsZW5kaW5nICE9PSBjdXJyZW50QmxlbmRpbmcgfHwgcHJlbXVsdGlwbGllZEFscGhhICE9PSBjdXJyZW50UHJlbXVsdGlwbGVkQWxwaGEgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggY3VycmVudEJsZW5kRXF1YXRpb24gIT09IEFkZEVxdWF0aW9uIHx8IGN1cnJlbnRCbGVuZEVxdWF0aW9uQWxwaGEgIT09IEFkZEVxdWF0aW9uICkge1xyXG5cclxuXHRcdFx0XHRcdGdsLmJsZW5kRXF1YXRpb24oIGdsLkZVTkNfQUREICk7XHJcblxyXG5cdFx0XHRcdFx0Y3VycmVudEJsZW5kRXF1YXRpb24gPSBBZGRFcXVhdGlvbjtcclxuXHRcdFx0XHRcdGN1cnJlbnRCbGVuZEVxdWF0aW9uQWxwaGEgPSBBZGRFcXVhdGlvbjtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoIHByZW11bHRpcGxpZWRBbHBoYSApIHtcclxuXHJcblx0XHRcdFx0XHRzd2l0Y2ggKCBibGVuZGluZyApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNhc2UgTm9ybWFsQmxlbmRpbmc6XHJcblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRGdW5jU2VwYXJhdGUoIGdsLk9ORSwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSwgZ2wuT05FLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBICk7XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0XHRjYXNlIEFkZGl0aXZlQmxlbmRpbmc6XHJcblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRGdW5jKCBnbC5PTkUsIGdsLk9ORSApO1xyXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdFx0Y2FzZSBTdWJ0cmFjdGl2ZUJsZW5kaW5nOlxyXG5cdFx0XHRcdFx0XHRcdGdsLmJsZW5kRnVuY1NlcGFyYXRlKCBnbC5aRVJPLCBnbC5PTkVfTUlOVVNfU1JDX0NPTE9SLCBnbC5aRVJPLCBnbC5PTkUgKTtcclxuXHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRcdGNhc2UgTXVsdGlwbHlCbGVuZGluZzpcclxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEZ1bmNTZXBhcmF0ZSggZ2wuWkVSTywgZ2wuU1JDX0NPTE9SLCBnbC5aRVJPLCBnbC5TUkNfQUxQSEEgKTtcclxuXHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMU3RhdGU6IEludmFsaWQgYmxlbmRpbmc6ICcsIGJsZW5kaW5nICk7XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdHN3aXRjaCAoIGJsZW5kaW5nICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y2FzZSBOb3JtYWxCbGVuZGluZzpcclxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEZ1bmNTZXBhcmF0ZSggZ2wuU1JDX0FMUEhBLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBLCBnbC5PTkUsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEgKTtcclxuXHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRcdGNhc2UgQWRkaXRpdmVCbGVuZGluZzpcclxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEZ1bmMoIGdsLlNSQ19BTFBIQSwgZ2wuT05FICk7XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0XHRjYXNlIFN1YnRyYWN0aXZlQmxlbmRpbmc6XHJcblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRGdW5jU2VwYXJhdGUoIGdsLlpFUk8sIGdsLk9ORV9NSU5VU19TUkNfQ09MT1IsIGdsLlpFUk8sIGdsLk9ORSApO1xyXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdFx0Y2FzZSBNdWx0aXBseUJsZW5kaW5nOlxyXG5cdFx0XHRcdFx0XHRcdGdsLmJsZW5kRnVuYyggZ2wuWkVSTywgZ2wuU1JDX0NPTE9SICk7XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFN0YXRlOiBJbnZhbGlkIGJsZW5kaW5nOiAnLCBibGVuZGluZyApO1xyXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRjdXJyZW50QmxlbmRTcmMgPSBudWxsO1xyXG5cdFx0XHRcdGN1cnJlbnRCbGVuZERzdCA9IG51bGw7XHJcblx0XHRcdFx0Y3VycmVudEJsZW5kU3JjQWxwaGEgPSBudWxsO1xyXG5cdFx0XHRcdGN1cnJlbnRCbGVuZERzdEFscGhhID0gbnVsbDtcclxuXHRcdFx0XHRjdXJyZW50QmxlbmRDb2xvci5zZXQoIDAsIDAsIDAgKTtcclxuXHRcdFx0XHRjdXJyZW50QmxlbmRBbHBoYSA9IDA7XHJcblxyXG5cdFx0XHRcdGN1cnJlbnRCbGVuZGluZyA9IGJsZW5kaW5nO1xyXG5cdFx0XHRcdGN1cnJlbnRQcmVtdWx0aXBsZWRBbHBoYSA9IHByZW11bHRpcGxpZWRBbHBoYTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gY3VzdG9tIGJsZW5kaW5nXHJcblxyXG5cdFx0YmxlbmRFcXVhdGlvbkFscGhhID0gYmxlbmRFcXVhdGlvbkFscGhhIHx8IGJsZW5kRXF1YXRpb247XHJcblx0XHRibGVuZFNyY0FscGhhID0gYmxlbmRTcmNBbHBoYSB8fCBibGVuZFNyYztcclxuXHRcdGJsZW5kRHN0QWxwaGEgPSBibGVuZERzdEFscGhhIHx8IGJsZW5kRHN0O1xyXG5cclxuXHRcdGlmICggYmxlbmRFcXVhdGlvbiAhPT0gY3VycmVudEJsZW5kRXF1YXRpb24gfHwgYmxlbmRFcXVhdGlvbkFscGhhICE9PSBjdXJyZW50QmxlbmRFcXVhdGlvbkFscGhhICkge1xyXG5cclxuXHRcdFx0Z2wuYmxlbmRFcXVhdGlvblNlcGFyYXRlKCBlcXVhdGlvblRvR0xbIGJsZW5kRXF1YXRpb24gXSwgZXF1YXRpb25Ub0dMWyBibGVuZEVxdWF0aW9uQWxwaGEgXSApO1xyXG5cclxuXHRcdFx0Y3VycmVudEJsZW5kRXF1YXRpb24gPSBibGVuZEVxdWF0aW9uO1xyXG5cdFx0XHRjdXJyZW50QmxlbmRFcXVhdGlvbkFscGhhID0gYmxlbmRFcXVhdGlvbkFscGhhO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGJsZW5kU3JjICE9PSBjdXJyZW50QmxlbmRTcmMgfHwgYmxlbmREc3QgIT09IGN1cnJlbnRCbGVuZERzdCB8fCBibGVuZFNyY0FscGhhICE9PSBjdXJyZW50QmxlbmRTcmNBbHBoYSB8fCBibGVuZERzdEFscGhhICE9PSBjdXJyZW50QmxlbmREc3RBbHBoYSApIHtcclxuXHJcblx0XHRcdGdsLmJsZW5kRnVuY1NlcGFyYXRlKCBmYWN0b3JUb0dMWyBibGVuZFNyYyBdLCBmYWN0b3JUb0dMWyBibGVuZERzdCBdLCBmYWN0b3JUb0dMWyBibGVuZFNyY0FscGhhIF0sIGZhY3RvclRvR0xbIGJsZW5kRHN0QWxwaGEgXSApO1xyXG5cclxuXHRcdFx0Y3VycmVudEJsZW5kU3JjID0gYmxlbmRTcmM7XHJcblx0XHRcdGN1cnJlbnRCbGVuZERzdCA9IGJsZW5kRHN0O1xyXG5cdFx0XHRjdXJyZW50QmxlbmRTcmNBbHBoYSA9IGJsZW5kU3JjQWxwaGE7XHJcblx0XHRcdGN1cnJlbnRCbGVuZERzdEFscGhhID0gYmxlbmREc3RBbHBoYTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBibGVuZENvbG9yLmVxdWFscyggY3VycmVudEJsZW5kQ29sb3IgKSA9PT0gZmFsc2UgfHwgYmxlbmRBbHBoYSAhPT0gY3VycmVudEJsZW5kQWxwaGEgKSB7XHJcblxyXG5cdFx0XHRnbC5ibGVuZENvbG9yKCBibGVuZENvbG9yLnIsIGJsZW5kQ29sb3IuZywgYmxlbmRDb2xvci5iLCBibGVuZEFscGhhICk7XHJcblxyXG5cdFx0XHRjdXJyZW50QmxlbmRDb2xvci5jb3B5KCBibGVuZENvbG9yICk7XHJcblx0XHRcdGN1cnJlbnRCbGVuZEFscGhhID0gYmxlbmRBbHBoYTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y3VycmVudEJsZW5kaW5nID0gYmxlbmRpbmc7XHJcblx0XHRjdXJyZW50UHJlbXVsdGlwbGVkQWxwaGEgPSBmYWxzZTtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBzZXRNYXRlcmlhbCggbWF0ZXJpYWwsIGZyb250RmFjZUNXICkge1xyXG5cclxuXHRcdG1hdGVyaWFsLnNpZGUgPT09IERvdWJsZVNpZGVcclxuXHRcdFx0PyBkaXNhYmxlKCBnbC5DVUxMX0ZBQ0UgKVxyXG5cdFx0XHQ6IGVuYWJsZSggZ2wuQ1VMTF9GQUNFICk7XHJcblxyXG5cdFx0bGV0IGZsaXBTaWRlZCA9ICggbWF0ZXJpYWwuc2lkZSA9PT0gQmFja1NpZGUgKTtcclxuXHRcdGlmICggZnJvbnRGYWNlQ1cgKSBmbGlwU2lkZWQgPSAhIGZsaXBTaWRlZDtcclxuXHJcblx0XHRzZXRGbGlwU2lkZWQoIGZsaXBTaWRlZCApO1xyXG5cclxuXHRcdCggbWF0ZXJpYWwuYmxlbmRpbmcgPT09IE5vcm1hbEJsZW5kaW5nICYmIG1hdGVyaWFsLnRyYW5zcGFyZW50ID09PSBmYWxzZSApXHJcblx0XHRcdD8gc2V0QmxlbmRpbmcoIE5vQmxlbmRpbmcgKVxyXG5cdFx0XHQ6IHNldEJsZW5kaW5nKCBtYXRlcmlhbC5ibGVuZGluZywgbWF0ZXJpYWwuYmxlbmRFcXVhdGlvbiwgbWF0ZXJpYWwuYmxlbmRTcmMsIG1hdGVyaWFsLmJsZW5kRHN0LCBtYXRlcmlhbC5ibGVuZEVxdWF0aW9uQWxwaGEsIG1hdGVyaWFsLmJsZW5kU3JjQWxwaGEsIG1hdGVyaWFsLmJsZW5kRHN0QWxwaGEsIG1hdGVyaWFsLmJsZW5kQ29sb3IsIG1hdGVyaWFsLmJsZW5kQWxwaGEsIG1hdGVyaWFsLnByZW11bHRpcGxpZWRBbHBoYSApO1xyXG5cclxuXHRcdGRlcHRoQnVmZmVyLnNldEZ1bmMoIG1hdGVyaWFsLmRlcHRoRnVuYyApO1xyXG5cdFx0ZGVwdGhCdWZmZXIuc2V0VGVzdCggbWF0ZXJpYWwuZGVwdGhUZXN0ICk7XHJcblx0XHRkZXB0aEJ1ZmZlci5zZXRNYXNrKCBtYXRlcmlhbC5kZXB0aFdyaXRlICk7XHJcblx0XHRjb2xvckJ1ZmZlci5zZXRNYXNrKCBtYXRlcmlhbC5jb2xvcldyaXRlICk7XHJcblxyXG5cdFx0Y29uc3Qgc3RlbmNpbFdyaXRlID0gbWF0ZXJpYWwuc3RlbmNpbFdyaXRlO1xyXG5cdFx0c3RlbmNpbEJ1ZmZlci5zZXRUZXN0KCBzdGVuY2lsV3JpdGUgKTtcclxuXHRcdGlmICggc3RlbmNpbFdyaXRlICkge1xyXG5cclxuXHRcdFx0c3RlbmNpbEJ1ZmZlci5zZXRNYXNrKCBtYXRlcmlhbC5zdGVuY2lsV3JpdGVNYXNrICk7XHJcblx0XHRcdHN0ZW5jaWxCdWZmZXIuc2V0RnVuYyggbWF0ZXJpYWwuc3RlbmNpbEZ1bmMsIG1hdGVyaWFsLnN0ZW5jaWxSZWYsIG1hdGVyaWFsLnN0ZW5jaWxGdW5jTWFzayApO1xyXG5cdFx0XHRzdGVuY2lsQnVmZmVyLnNldE9wKCBtYXRlcmlhbC5zdGVuY2lsRmFpbCwgbWF0ZXJpYWwuc3RlbmNpbFpGYWlsLCBtYXRlcmlhbC5zdGVuY2lsWlBhc3MgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0c2V0UG9seWdvbk9mZnNldCggbWF0ZXJpYWwucG9seWdvbk9mZnNldCwgbWF0ZXJpYWwucG9seWdvbk9mZnNldEZhY3RvciwgbWF0ZXJpYWwucG9seWdvbk9mZnNldFVuaXRzICk7XHJcblxyXG5cdFx0bWF0ZXJpYWwuYWxwaGFUb0NvdmVyYWdlID09PSB0cnVlXHJcblx0XHRcdD8gZW5hYmxlKCBnbC5TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UgKVxyXG5cdFx0XHQ6IGRpc2FibGUoIGdsLlNBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vXHJcblxyXG5cdGZ1bmN0aW9uIHNldEZsaXBTaWRlZCggZmxpcFNpZGVkICkge1xyXG5cclxuXHRcdGlmICggY3VycmVudEZsaXBTaWRlZCAhPT0gZmxpcFNpZGVkICkge1xyXG5cclxuXHRcdFx0aWYgKCBmbGlwU2lkZWQgKSB7XHJcblxyXG5cdFx0XHRcdGdsLmZyb250RmFjZSggZ2wuQ1cgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGdsLmZyb250RmFjZSggZ2wuQ0NXICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjdXJyZW50RmxpcFNpZGVkID0gZmxpcFNpZGVkO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBzZXRDdWxsRmFjZSggY3VsbEZhY2UgKSB7XHJcblxyXG5cdFx0aWYgKCBjdWxsRmFjZSAhPT0gQ3VsbEZhY2VOb25lICkge1xyXG5cclxuXHRcdFx0ZW5hYmxlKCBnbC5DVUxMX0ZBQ0UgKTtcclxuXHJcblx0XHRcdGlmICggY3VsbEZhY2UgIT09IGN1cnJlbnRDdWxsRmFjZSApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBjdWxsRmFjZSA9PT0gQ3VsbEZhY2VCYWNrICkge1xyXG5cclxuXHRcdFx0XHRcdGdsLmN1bGxGYWNlKCBnbC5CQUNLICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGN1bGxGYWNlID09PSBDdWxsRmFjZUZyb250ICkge1xyXG5cclxuXHRcdFx0XHRcdGdsLmN1bGxGYWNlKCBnbC5GUk9OVCApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdGdsLmN1bGxGYWNlKCBnbC5GUk9OVF9BTkRfQkFDSyApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGRpc2FibGUoIGdsLkNVTExfRkFDRSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjdXJyZW50Q3VsbEZhY2UgPSBjdWxsRmFjZTtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBzZXRMaW5lV2lkdGgoIHdpZHRoICkge1xyXG5cclxuXHRcdGlmICggd2lkdGggIT09IGN1cnJlbnRMaW5lV2lkdGggKSB7XHJcblxyXG5cdFx0XHRpZiAoIGxpbmVXaWR0aEF2YWlsYWJsZSApIGdsLmxpbmVXaWR0aCggd2lkdGggKTtcclxuXHJcblx0XHRcdGN1cnJlbnRMaW5lV2lkdGggPSB3aWR0aDtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gc2V0UG9seWdvbk9mZnNldCggcG9seWdvbk9mZnNldCwgZmFjdG9yLCB1bml0cyApIHtcclxuXHJcblx0XHRpZiAoIHBvbHlnb25PZmZzZXQgKSB7XHJcblxyXG5cdFx0XHRlbmFibGUoIGdsLlBPTFlHT05fT0ZGU0VUX0ZJTEwgKTtcclxuXHJcblx0XHRcdGlmICggY3VycmVudFBvbHlnb25PZmZzZXRGYWN0b3IgIT09IGZhY3RvciB8fCBjdXJyZW50UG9seWdvbk9mZnNldFVuaXRzICE9PSB1bml0cyApIHtcclxuXHJcblx0XHRcdFx0Z2wucG9seWdvbk9mZnNldCggZmFjdG9yLCB1bml0cyApO1xyXG5cclxuXHRcdFx0XHRjdXJyZW50UG9seWdvbk9mZnNldEZhY3RvciA9IGZhY3RvcjtcclxuXHRcdFx0XHRjdXJyZW50UG9seWdvbk9mZnNldFVuaXRzID0gdW5pdHM7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGRpc2FibGUoIGdsLlBPTFlHT05fT0ZGU0VUX0ZJTEwgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gc2V0U2Npc3NvclRlc3QoIHNjaXNzb3JUZXN0ICkge1xyXG5cclxuXHRcdGlmICggc2Npc3NvclRlc3QgKSB7XHJcblxyXG5cdFx0XHRlbmFibGUoIGdsLlNDSVNTT1JfVEVTVCApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRkaXNhYmxlKCBnbC5TQ0lTU09SX1RFU1QgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gdGV4dHVyZVxyXG5cclxuXHRmdW5jdGlvbiBhY3RpdmVUZXh0dXJlKCB3ZWJnbFNsb3QgKSB7XHJcblxyXG5cdFx0aWYgKCB3ZWJnbFNsb3QgPT09IHVuZGVmaW5lZCApIHdlYmdsU2xvdCA9IGdsLlRFWFRVUkUwICsgbWF4VGV4dHVyZXMgLSAxO1xyXG5cclxuXHRcdGlmICggY3VycmVudFRleHR1cmVTbG90ICE9PSB3ZWJnbFNsb3QgKSB7XHJcblxyXG5cdFx0XHRnbC5hY3RpdmVUZXh0dXJlKCB3ZWJnbFNsb3QgKTtcclxuXHRcdFx0Y3VycmVudFRleHR1cmVTbG90ID0gd2ViZ2xTbG90O1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBiaW5kVGV4dHVyZSggd2ViZ2xUeXBlLCB3ZWJnbFRleHR1cmUsIHdlYmdsU2xvdCApIHtcclxuXHJcblx0XHRpZiAoIHdlYmdsU2xvdCA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0aWYgKCBjdXJyZW50VGV4dHVyZVNsb3QgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdHdlYmdsU2xvdCA9IGdsLlRFWFRVUkUwICsgbWF4VGV4dHVyZXMgLSAxO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0d2ViZ2xTbG90ID0gY3VycmVudFRleHR1cmVTbG90O1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRsZXQgYm91bmRUZXh0dXJlID0gY3VycmVudEJvdW5kVGV4dHVyZXNbIHdlYmdsU2xvdCBdO1xyXG5cclxuXHRcdGlmICggYm91bmRUZXh0dXJlID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRib3VuZFRleHR1cmUgPSB7IHR5cGU6IHVuZGVmaW5lZCwgdGV4dHVyZTogdW5kZWZpbmVkIH07XHJcblx0XHRcdGN1cnJlbnRCb3VuZFRleHR1cmVzWyB3ZWJnbFNsb3QgXSA9IGJvdW5kVGV4dHVyZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBib3VuZFRleHR1cmUudHlwZSAhPT0gd2ViZ2xUeXBlIHx8IGJvdW5kVGV4dHVyZS50ZXh0dXJlICE9PSB3ZWJnbFRleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGN1cnJlbnRUZXh0dXJlU2xvdCAhPT0gd2ViZ2xTbG90ICkge1xyXG5cclxuXHRcdFx0XHRnbC5hY3RpdmVUZXh0dXJlKCB3ZWJnbFNsb3QgKTtcclxuXHRcdFx0XHRjdXJyZW50VGV4dHVyZVNsb3QgPSB3ZWJnbFNsb3Q7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRnbC5iaW5kVGV4dHVyZSggd2ViZ2xUeXBlLCB3ZWJnbFRleHR1cmUgfHwgZW1wdHlUZXh0dXJlc1sgd2ViZ2xUeXBlIF0gKTtcclxuXHJcblx0XHRcdGJvdW5kVGV4dHVyZS50eXBlID0gd2ViZ2xUeXBlO1xyXG5cdFx0XHRib3VuZFRleHR1cmUudGV4dHVyZSA9IHdlYmdsVGV4dHVyZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gdW5iaW5kVGV4dHVyZSgpIHtcclxuXHJcblx0XHRjb25zdCBib3VuZFRleHR1cmUgPSBjdXJyZW50Qm91bmRUZXh0dXJlc1sgY3VycmVudFRleHR1cmVTbG90IF07XHJcblxyXG5cdFx0aWYgKCBib3VuZFRleHR1cmUgIT09IHVuZGVmaW5lZCAmJiBib3VuZFRleHR1cmUudHlwZSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Z2wuYmluZFRleHR1cmUoIGJvdW5kVGV4dHVyZS50eXBlLCBudWxsICk7XHJcblxyXG5cdFx0XHRib3VuZFRleHR1cmUudHlwZSA9IHVuZGVmaW5lZDtcclxuXHRcdFx0Ym91bmRUZXh0dXJlLnRleHR1cmUgPSB1bmRlZmluZWQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGNvbXByZXNzZWRUZXhJbWFnZTJEKCkge1xyXG5cclxuXHRcdHRyeSB7XHJcblxyXG5cdFx0XHRnbC5jb21wcmVzc2VkVGV4SW1hZ2UyRCggLi4uYXJndW1lbnRzICk7XHJcblxyXG5cdFx0fSBjYXRjaCAoIGVycm9yICkge1xyXG5cclxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMU3RhdGU6JywgZXJyb3IgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gY29tcHJlc3NlZFRleEltYWdlM0QoKSB7XHJcblxyXG5cdFx0dHJ5IHtcclxuXHJcblx0XHRcdGdsLmNvbXByZXNzZWRUZXhJbWFnZTNEKCAuLi5hcmd1bWVudHMgKTtcclxuXHJcblx0XHR9IGNhdGNoICggZXJyb3IgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xTdGF0ZTonLCBlcnJvciApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiB0ZXhTdWJJbWFnZTJEKCkge1xyXG5cclxuXHRcdHRyeSB7XHJcblxyXG5cdFx0XHRnbC50ZXhTdWJJbWFnZTJEKCAuLi5hcmd1bWVudHMgKTtcclxuXHJcblx0XHR9IGNhdGNoICggZXJyb3IgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xTdGF0ZTonLCBlcnJvciApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiB0ZXhTdWJJbWFnZTNEKCkge1xyXG5cclxuXHRcdHRyeSB7XHJcblxyXG5cdFx0XHRnbC50ZXhTdWJJbWFnZTNEKCAuLi5hcmd1bWVudHMgKTtcclxuXHJcblx0XHR9IGNhdGNoICggZXJyb3IgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xTdGF0ZTonLCBlcnJvciApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBjb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCgpIHtcclxuXHJcblx0XHR0cnkge1xyXG5cclxuXHRcdFx0Z2wuY29tcHJlc3NlZFRleFN1YkltYWdlMkQoIC4uLmFyZ3VtZW50cyApO1xyXG5cclxuXHRcdH0gY2F0Y2ggKCBlcnJvciApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFN0YXRlOicsIGVycm9yICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGNvbXByZXNzZWRUZXhTdWJJbWFnZTNEKCkge1xyXG5cclxuXHRcdHRyeSB7XHJcblxyXG5cdFx0XHRnbC5jb21wcmVzc2VkVGV4U3ViSW1hZ2UzRCggLi4uYXJndW1lbnRzICk7XHJcblxyXG5cdFx0fSBjYXRjaCAoIGVycm9yICkge1xyXG5cclxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMU3RhdGU6JywgZXJyb3IgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gdGV4U3RvcmFnZTJEKCkge1xyXG5cclxuXHRcdHRyeSB7XHJcblxyXG5cdFx0XHRnbC50ZXhTdG9yYWdlMkQoIC4uLmFyZ3VtZW50cyApO1xyXG5cclxuXHRcdH0gY2F0Y2ggKCBlcnJvciApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFN0YXRlOicsIGVycm9yICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHRleFN0b3JhZ2UzRCgpIHtcclxuXHJcblx0XHR0cnkge1xyXG5cclxuXHRcdFx0Z2wudGV4U3RvcmFnZTNEKCAuLi5hcmd1bWVudHMgKTtcclxuXHJcblx0XHR9IGNhdGNoICggZXJyb3IgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xTdGF0ZTonLCBlcnJvciApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiB0ZXhJbWFnZTJEKCkge1xyXG5cclxuXHRcdHRyeSB7XHJcblxyXG5cdFx0XHRnbC50ZXhJbWFnZTJEKCAuLi5hcmd1bWVudHMgKTtcclxuXHJcblx0XHR9IGNhdGNoICggZXJyb3IgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xTdGF0ZTonLCBlcnJvciApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiB0ZXhJbWFnZTNEKCkge1xyXG5cclxuXHRcdHRyeSB7XHJcblxyXG5cdFx0XHRnbC50ZXhJbWFnZTNEKCAuLi5hcmd1bWVudHMgKTtcclxuXHJcblx0XHR9IGNhdGNoICggZXJyb3IgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xTdGF0ZTonLCBlcnJvciApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvL1xyXG5cclxuXHRmdW5jdGlvbiBzY2lzc29yKCBzY2lzc29yICkge1xyXG5cclxuXHRcdGlmICggY3VycmVudFNjaXNzb3IuZXF1YWxzKCBzY2lzc29yICkgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0Z2wuc2Npc3Nvciggc2Npc3Nvci54LCBzY2lzc29yLnksIHNjaXNzb3Iueiwgc2Npc3Nvci53ICk7XHJcblx0XHRcdGN1cnJlbnRTY2lzc29yLmNvcHkoIHNjaXNzb3IgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gdmlld3BvcnQoIHZpZXdwb3J0ICkge1xyXG5cclxuXHRcdGlmICggY3VycmVudFZpZXdwb3J0LmVxdWFscyggdmlld3BvcnQgKSA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRnbC52aWV3cG9ydCggdmlld3BvcnQueCwgdmlld3BvcnQueSwgdmlld3BvcnQueiwgdmlld3BvcnQudyApO1xyXG5cdFx0XHRjdXJyZW50Vmlld3BvcnQuY29weSggdmlld3BvcnQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gdXBkYXRlVUJPTWFwcGluZyggdW5pZm9ybXNHcm91cCwgcHJvZ3JhbSApIHtcclxuXHJcblx0XHRsZXQgbWFwcGluZyA9IHVib1Byb2dyYW1NYXAuZ2V0KCBwcm9ncmFtICk7XHJcblxyXG5cdFx0aWYgKCBtYXBwaW5nID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRtYXBwaW5nID0gbmV3IFdlYWtNYXAoKTtcclxuXHJcblx0XHRcdHVib1Byb2dyYW1NYXAuc2V0KCBwcm9ncmFtLCBtYXBwaW5nICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGxldCBibG9ja0luZGV4ID0gbWFwcGluZy5nZXQoIHVuaWZvcm1zR3JvdXAgKTtcclxuXHJcblx0XHRpZiAoIGJsb2NrSW5kZXggPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGJsb2NrSW5kZXggPSBnbC5nZXRVbmlmb3JtQmxvY2tJbmRleCggcHJvZ3JhbSwgdW5pZm9ybXNHcm91cC5uYW1lICk7XHJcblxyXG5cdFx0XHRtYXBwaW5nLnNldCggdW5pZm9ybXNHcm91cCwgYmxvY2tJbmRleCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiB1bmlmb3JtQmxvY2tCaW5kaW5nKCB1bmlmb3Jtc0dyb3VwLCBwcm9ncmFtICkge1xyXG5cclxuXHRcdGNvbnN0IG1hcHBpbmcgPSB1Ym9Qcm9ncmFtTWFwLmdldCggcHJvZ3JhbSApO1xyXG5cdFx0Y29uc3QgYmxvY2tJbmRleCA9IG1hcHBpbmcuZ2V0KCB1bmlmb3Jtc0dyb3VwICk7XHJcblxyXG5cdFx0aWYgKCB1Ym9CaW5kaW5ncy5nZXQoIHByb2dyYW0gKSAhPT0gYmxvY2tJbmRleCApIHtcclxuXHJcblx0XHRcdC8vIGJpbmQgc2hhZGVyIHNwZWNpZmljIGJsb2NrIGluZGV4IHRvIGdsb2JhbCBibG9jayBwb2ludFxyXG5cdFx0XHRnbC51bmlmb3JtQmxvY2tCaW5kaW5nKCBwcm9ncmFtLCBibG9ja0luZGV4LCB1bmlmb3Jtc0dyb3VwLl9fYmluZGluZ1BvaW50SW5kZXggKTtcclxuXHJcblx0XHRcdHVib0JpbmRpbmdzLnNldCggcHJvZ3JhbSwgYmxvY2tJbmRleCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvL1xyXG5cclxuXHRmdW5jdGlvbiByZXNldCgpIHtcclxuXHJcblx0XHQvLyByZXNldCBzdGF0ZVxyXG5cclxuXHRcdGdsLmRpc2FibGUoIGdsLkJMRU5EICk7XHJcblx0XHRnbC5kaXNhYmxlKCBnbC5DVUxMX0ZBQ0UgKTtcclxuXHRcdGdsLmRpc2FibGUoIGdsLkRFUFRIX1RFU1QgKTtcclxuXHRcdGdsLmRpc2FibGUoIGdsLlBPTFlHT05fT0ZGU0VUX0ZJTEwgKTtcclxuXHRcdGdsLmRpc2FibGUoIGdsLlNDSVNTT1JfVEVTVCApO1xyXG5cdFx0Z2wuZGlzYWJsZSggZ2wuU1RFTkNJTF9URVNUICk7XHJcblx0XHRnbC5kaXNhYmxlKCBnbC5TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UgKTtcclxuXHJcblx0XHRnbC5ibGVuZEVxdWF0aW9uKCBnbC5GVU5DX0FERCApO1xyXG5cdFx0Z2wuYmxlbmRGdW5jKCBnbC5PTkUsIGdsLlpFUk8gKTtcclxuXHRcdGdsLmJsZW5kRnVuY1NlcGFyYXRlKCBnbC5PTkUsIGdsLlpFUk8sIGdsLk9ORSwgZ2wuWkVSTyApO1xyXG5cdFx0Z2wuYmxlbmRDb2xvciggMCwgMCwgMCwgMCApO1xyXG5cclxuXHRcdGdsLmNvbG9yTWFzayggdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSApO1xyXG5cdFx0Z2wuY2xlYXJDb2xvciggMCwgMCwgMCwgMCApO1xyXG5cclxuXHRcdGdsLmRlcHRoTWFzayggdHJ1ZSApO1xyXG5cdFx0Z2wuZGVwdGhGdW5jKCBnbC5MRVNTICk7XHJcblxyXG5cdFx0ZGVwdGhCdWZmZXIuc2V0UmV2ZXJzZWQoIGZhbHNlICk7XHJcblxyXG5cdFx0Z2wuY2xlYXJEZXB0aCggMSApO1xyXG5cclxuXHRcdGdsLnN0ZW5jaWxNYXNrKCAweGZmZmZmZmZmICk7XHJcblx0XHRnbC5zdGVuY2lsRnVuYyggZ2wuQUxXQVlTLCAwLCAweGZmZmZmZmZmICk7XHJcblx0XHRnbC5zdGVuY2lsT3AoIGdsLktFRVAsIGdsLktFRVAsIGdsLktFRVAgKTtcclxuXHRcdGdsLmNsZWFyU3RlbmNpbCggMCApO1xyXG5cclxuXHRcdGdsLmN1bGxGYWNlKCBnbC5CQUNLICk7XHJcblx0XHRnbC5mcm9udEZhY2UoIGdsLkNDVyApO1xyXG5cclxuXHRcdGdsLnBvbHlnb25PZmZzZXQoIDAsIDAgKTtcclxuXHJcblx0XHRnbC5hY3RpdmVUZXh0dXJlKCBnbC5URVhUVVJFMCApO1xyXG5cclxuXHRcdGdsLmJpbmRGcmFtZWJ1ZmZlciggZ2wuRlJBTUVCVUZGRVIsIG51bGwgKTtcclxuXHRcdGdsLmJpbmRGcmFtZWJ1ZmZlciggZ2wuRFJBV19GUkFNRUJVRkZFUiwgbnVsbCApO1xyXG5cdFx0Z2wuYmluZEZyYW1lYnVmZmVyKCBnbC5SRUFEX0ZSQU1FQlVGRkVSLCBudWxsICk7XHJcblxyXG5cdFx0Z2wudXNlUHJvZ3JhbSggbnVsbCApO1xyXG5cclxuXHRcdGdsLmxpbmVXaWR0aCggMSApO1xyXG5cclxuXHRcdGdsLnNjaXNzb3IoIDAsIDAsIGdsLmNhbnZhcy53aWR0aCwgZ2wuY2FudmFzLmhlaWdodCApO1xyXG5cdFx0Z2wudmlld3BvcnQoIDAsIDAsIGdsLmNhbnZhcy53aWR0aCwgZ2wuY2FudmFzLmhlaWdodCApO1xyXG5cclxuXHRcdC8vIHJlc2V0IGludGVybmFsc1xyXG5cclxuXHRcdGVuYWJsZWRDYXBhYmlsaXRpZXMgPSB7fTtcclxuXHJcblx0XHRjdXJyZW50VGV4dHVyZVNsb3QgPSBudWxsO1xyXG5cdFx0Y3VycmVudEJvdW5kVGV4dHVyZXMgPSB7fTtcclxuXHJcblx0XHRjdXJyZW50Qm91bmRGcmFtZWJ1ZmZlcnMgPSB7fTtcclxuXHRcdGN1cnJlbnREcmF3YnVmZmVycyA9IG5ldyBXZWFrTWFwKCk7XHJcblx0XHRkZWZhdWx0RHJhd2J1ZmZlcnMgPSBbXTtcclxuXHJcblx0XHRjdXJyZW50UHJvZ3JhbSA9IG51bGw7XHJcblxyXG5cdFx0Y3VycmVudEJsZW5kaW5nRW5hYmxlZCA9IGZhbHNlO1xyXG5cdFx0Y3VycmVudEJsZW5kaW5nID0gbnVsbDtcclxuXHRcdGN1cnJlbnRCbGVuZEVxdWF0aW9uID0gbnVsbDtcclxuXHRcdGN1cnJlbnRCbGVuZFNyYyA9IG51bGw7XHJcblx0XHRjdXJyZW50QmxlbmREc3QgPSBudWxsO1xyXG5cdFx0Y3VycmVudEJsZW5kRXF1YXRpb25BbHBoYSA9IG51bGw7XHJcblx0XHRjdXJyZW50QmxlbmRTcmNBbHBoYSA9IG51bGw7XHJcblx0XHRjdXJyZW50QmxlbmREc3RBbHBoYSA9IG51bGw7XHJcblx0XHRjdXJyZW50QmxlbmRDb2xvciA9IG5ldyBDb2xvciggMCwgMCwgMCApO1xyXG5cdFx0Y3VycmVudEJsZW5kQWxwaGEgPSAwO1xyXG5cdFx0Y3VycmVudFByZW11bHRpcGxlZEFscGhhID0gZmFsc2U7XHJcblxyXG5cdFx0Y3VycmVudEZsaXBTaWRlZCA9IG51bGw7XHJcblx0XHRjdXJyZW50Q3VsbEZhY2UgPSBudWxsO1xyXG5cclxuXHRcdGN1cnJlbnRMaW5lV2lkdGggPSBudWxsO1xyXG5cclxuXHRcdGN1cnJlbnRQb2x5Z29uT2Zmc2V0RmFjdG9yID0gbnVsbDtcclxuXHRcdGN1cnJlbnRQb2x5Z29uT2Zmc2V0VW5pdHMgPSBudWxsO1xyXG5cclxuXHRcdGN1cnJlbnRTY2lzc29yLnNldCggMCwgMCwgZ2wuY2FudmFzLndpZHRoLCBnbC5jYW52YXMuaGVpZ2h0ICk7XHJcblx0XHRjdXJyZW50Vmlld3BvcnQuc2V0KCAwLCAwLCBnbC5jYW52YXMud2lkdGgsIGdsLmNhbnZhcy5oZWlnaHQgKTtcclxuXHJcblx0XHRjb2xvckJ1ZmZlci5yZXNldCgpO1xyXG5cdFx0ZGVwdGhCdWZmZXIucmVzZXQoKTtcclxuXHRcdHN0ZW5jaWxCdWZmZXIucmVzZXQoKTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4ge1xyXG5cclxuXHRcdGJ1ZmZlcnM6IHtcclxuXHRcdFx0Y29sb3I6IGNvbG9yQnVmZmVyLFxyXG5cdFx0XHRkZXB0aDogZGVwdGhCdWZmZXIsXHJcblx0XHRcdHN0ZW5jaWw6IHN0ZW5jaWxCdWZmZXJcclxuXHRcdH0sXHJcblxyXG5cdFx0ZW5hYmxlOiBlbmFibGUsXHJcblx0XHRkaXNhYmxlOiBkaXNhYmxlLFxyXG5cclxuXHRcdGJpbmRGcmFtZWJ1ZmZlcjogYmluZEZyYW1lYnVmZmVyLFxyXG5cdFx0ZHJhd0J1ZmZlcnM6IGRyYXdCdWZmZXJzLFxyXG5cclxuXHRcdHVzZVByb2dyYW06IHVzZVByb2dyYW0sXHJcblxyXG5cdFx0c2V0QmxlbmRpbmc6IHNldEJsZW5kaW5nLFxyXG5cdFx0c2V0TWF0ZXJpYWw6IHNldE1hdGVyaWFsLFxyXG5cclxuXHRcdHNldEZsaXBTaWRlZDogc2V0RmxpcFNpZGVkLFxyXG5cdFx0c2V0Q3VsbEZhY2U6IHNldEN1bGxGYWNlLFxyXG5cclxuXHRcdHNldExpbmVXaWR0aDogc2V0TGluZVdpZHRoLFxyXG5cdFx0c2V0UG9seWdvbk9mZnNldDogc2V0UG9seWdvbk9mZnNldCxcclxuXHJcblx0XHRzZXRTY2lzc29yVGVzdDogc2V0U2Npc3NvclRlc3QsXHJcblxyXG5cdFx0YWN0aXZlVGV4dHVyZTogYWN0aXZlVGV4dHVyZSxcclxuXHRcdGJpbmRUZXh0dXJlOiBiaW5kVGV4dHVyZSxcclxuXHRcdHVuYmluZFRleHR1cmU6IHVuYmluZFRleHR1cmUsXHJcblx0XHRjb21wcmVzc2VkVGV4SW1hZ2UyRDogY29tcHJlc3NlZFRleEltYWdlMkQsXHJcblx0XHRjb21wcmVzc2VkVGV4SW1hZ2UzRDogY29tcHJlc3NlZFRleEltYWdlM0QsXHJcblx0XHR0ZXhJbWFnZTJEOiB0ZXhJbWFnZTJELFxyXG5cdFx0dGV4SW1hZ2UzRDogdGV4SW1hZ2UzRCxcclxuXHJcblx0XHR1cGRhdGVVQk9NYXBwaW5nOiB1cGRhdGVVQk9NYXBwaW5nLFxyXG5cdFx0dW5pZm9ybUJsb2NrQmluZGluZzogdW5pZm9ybUJsb2NrQmluZGluZyxcclxuXHJcblx0XHR0ZXhTdG9yYWdlMkQ6IHRleFN0b3JhZ2UyRCxcclxuXHRcdHRleFN0b3JhZ2UzRDogdGV4U3RvcmFnZTNELFxyXG5cdFx0dGV4U3ViSW1hZ2UyRDogdGV4U3ViSW1hZ2UyRCxcclxuXHRcdHRleFN1YkltYWdlM0Q6IHRleFN1YkltYWdlM0QsXHJcblx0XHRjb21wcmVzc2VkVGV4U3ViSW1hZ2UyRDogY29tcHJlc3NlZFRleFN1YkltYWdlMkQsXHJcblx0XHRjb21wcmVzc2VkVGV4U3ViSW1hZ2UzRDogY29tcHJlc3NlZFRleFN1YkltYWdlM0QsXHJcblxyXG5cdFx0c2Npc3Nvcjogc2Npc3NvcixcclxuXHRcdHZpZXdwb3J0OiB2aWV3cG9ydCxcclxuXHJcblx0XHRyZXNldDogcmVzZXRcclxuXHJcblx0fTtcclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFdlYkdMU3RhdGUgfTtcclxuIiwiaW1wb3J0IHsgTGluZWFyRmlsdGVyLCBMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXIsIExpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXIsIE5lYXJlc3RGaWx0ZXIsIE5lYXJlc3RNaXBtYXBMaW5lYXJGaWx0ZXIsIE5lYXJlc3RNaXBtYXBOZWFyZXN0RmlsdGVyLCBSR0JBRm9ybWF0LCBEZXB0aEZvcm1hdCwgRGVwdGhTdGVuY2lsRm9ybWF0LCBVbnNpZ25lZEludFR5cGUsIEZsb2F0VHlwZSwgTWlycm9yZWRSZXBlYXRXcmFwcGluZywgQ2xhbXBUb0VkZ2VXcmFwcGluZywgUmVwZWF0V3JhcHBpbmcsIFVuc2lnbmVkQnl0ZVR5cGUsIE5vQ29sb3JTcGFjZSwgTGluZWFyU1JHQkNvbG9yU3BhY2UsIE5ldmVyQ29tcGFyZSwgQWx3YXlzQ29tcGFyZSwgTGVzc0NvbXBhcmUsIExlc3NFcXVhbENvbXBhcmUsIEVxdWFsQ29tcGFyZSwgR3JlYXRlckVxdWFsQ29tcGFyZSwgR3JlYXRlckNvbXBhcmUsIE5vdEVxdWFsQ29tcGFyZSwgU1JHQlRyYW5zZmVyLCBMaW5lYXJUcmFuc2ZlciwgVW5zaWduZWRTaG9ydFR5cGUsIFVuc2lnbmVkSW50MjQ4VHlwZSB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IGNyZWF0ZUVsZW1lbnROUyB9IGZyb20gJy4uLy4uL3V0aWxzLmpzJztcclxuaW1wb3J0IHsgQ29sb3JNYW5hZ2VtZW50IH0gZnJvbSAnLi4vLi4vbWF0aC9Db2xvck1hbmFnZW1lbnQuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IyLmpzJztcclxuaW1wb3J0IHsgZ2V0Qnl0ZUxlbmd0aCB9IGZyb20gJy4uLy4uL2V4dHJhcy9UZXh0dXJlVXRpbHMuanMnO1xyXG5cclxuZnVuY3Rpb24gV2ViR0xUZXh0dXJlcyggX2dsLCBleHRlbnNpb25zLCBzdGF0ZSwgcHJvcGVydGllcywgY2FwYWJpbGl0aWVzLCB1dGlscywgaW5mbyApIHtcclxuXHJcblx0Y29uc3QgbXVsdGlzYW1wbGVkUlRURXh0ID0gZXh0ZW5zaW9ucy5oYXMoICdXRUJHTF9tdWx0aXNhbXBsZWRfcmVuZGVyX3RvX3RleHR1cmUnICkgPyBleHRlbnNpb25zLmdldCggJ1dFQkdMX211bHRpc2FtcGxlZF9yZW5kZXJfdG9fdGV4dHVyZScgKSA6IG51bGw7XHJcblx0Y29uc3Qgc3VwcG9ydHNJbnZhbGlkYXRlRnJhbWVidWZmZXIgPSB0eXBlb2YgbmF2aWdhdG9yID09PSAndW5kZWZpbmVkJyA/IGZhbHNlIDogL09jdWx1c0Jyb3dzZXIvZy50ZXN0KCBuYXZpZ2F0b3IudXNlckFnZW50ICk7XHJcblxyXG5cdGNvbnN0IF9pbWFnZURpbWVuc2lvbnMgPSBuZXcgVmVjdG9yMigpO1xyXG5cdGNvbnN0IF92aWRlb1RleHR1cmVzID0gbmV3IFdlYWtNYXAoKTtcclxuXHRsZXQgX2NhbnZhcztcclxuXHJcblx0Y29uc3QgX3NvdXJjZXMgPSBuZXcgV2Vha01hcCgpOyAvLyBtYXBzIFdlYmdsVGV4dHVyZSBvYmplY3RzIHRvIGluc3RhbmNlcyBvZiBTb3VyY2VcclxuXHJcblx0Ly8gY29yZG92YSBpT1MgKGFzIG9mIDUuMCkgc3RpbGwgdXNlcyBVSVdlYlZpZXcsIHdoaWNoIHByb3ZpZGVzIE9mZnNjcmVlbkNhbnZhcyxcclxuXHQvLyBhbHNvIE9mZnNjcmVlbkNhbnZhcy5nZXRDb250ZXh0KFwid2ViZ2xcIiksIGJ1dCBub3QgT2Zmc2NyZWVuQ2FudmFzLmdldENvbnRleHQoXCIyZFwiKSFcclxuXHQvLyBTb21lIGltcGxlbWVudGF0aW9ucyBtYXkgb25seSBpbXBsZW1lbnQgT2Zmc2NyZWVuQ2FudmFzIHBhcnRpYWxseSAoZS5nLiBsYWNraW5nIDJkKS5cclxuXHJcblx0bGV0IHVzZU9mZnNjcmVlbkNhbnZhcyA9IGZhbHNlO1xyXG5cclxuXHR0cnkge1xyXG5cclxuXHRcdHVzZU9mZnNjcmVlbkNhbnZhcyA9IHR5cGVvZiBPZmZzY3JlZW5DYW52YXMgIT09ICd1bmRlZmluZWQnXHJcblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wYXQvY29tcGF0XHJcblx0XHRcdCYmICggbmV3IE9mZnNjcmVlbkNhbnZhcyggMSwgMSApLmdldENvbnRleHQoICcyZCcgKSApICE9PSBudWxsO1xyXG5cclxuXHR9IGNhdGNoICggZXJyICkge1xyXG5cclxuXHRcdC8vIElnbm9yZSBhbnkgZXJyb3JzXHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gY3JlYXRlQ2FudmFzKCB3aWR0aCwgaGVpZ2h0ICkge1xyXG5cclxuXHRcdC8vIFVzZSBPZmZzY3JlZW5DYW52YXMgd2hlbiBhdmFpbGFibGUuIFNwZWNpYWxseSBuZWVkZWQgaW4gd2ViIHdvcmtlcnNcclxuXHJcblx0XHRyZXR1cm4gdXNlT2Zmc2NyZWVuQ2FudmFzID9cclxuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBhdC9jb21wYXRcclxuXHRcdFx0bmV3IE9mZnNjcmVlbkNhbnZhcyggd2lkdGgsIGhlaWdodCApIDogY3JlYXRlRWxlbWVudE5TKCAnY2FudmFzJyApO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHJlc2l6ZUltYWdlKCBpbWFnZSwgbmVlZHNOZXdDYW52YXMsIG1heFNpemUgKSB7XHJcblxyXG5cdFx0bGV0IHNjYWxlID0gMTtcclxuXHJcblx0XHRjb25zdCBkaW1lbnNpb25zID0gZ2V0RGltZW5zaW9ucyggaW1hZ2UgKTtcclxuXHJcblx0XHQvLyBoYW5kbGUgY2FzZSBpZiB0ZXh0dXJlIGV4Y2VlZHMgbWF4IHNpemVcclxuXHJcblx0XHRpZiAoIGRpbWVuc2lvbnMud2lkdGggPiBtYXhTaXplIHx8IGRpbWVuc2lvbnMuaGVpZ2h0ID4gbWF4U2l6ZSApIHtcclxuXHJcblx0XHRcdHNjYWxlID0gbWF4U2l6ZSAvIE1hdGgubWF4KCBkaW1lbnNpb25zLndpZHRoLCBkaW1lbnNpb25zLmhlaWdodCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBvbmx5IHBlcmZvcm0gcmVzaXplIGlmIG5lY2Vzc2FyeVxyXG5cclxuXHRcdGlmICggc2NhbGUgPCAxICkge1xyXG5cclxuXHRcdFx0Ly8gb25seSBwZXJmb3JtIHJlc2l6ZSBmb3IgY2VydGFpbiBpbWFnZSB0eXBlc1xyXG5cclxuXHRcdFx0aWYgKCAoIHR5cGVvZiBIVE1MSW1hZ2VFbGVtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBpbWFnZSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQgKSB8fFxyXG5cdFx0XHRcdCggdHlwZW9mIEhUTUxDYW52YXNFbGVtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBpbWFnZSBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50ICkgfHxcclxuXHRcdFx0XHQoIHR5cGVvZiBJbWFnZUJpdG1hcCAhPT0gJ3VuZGVmaW5lZCcgJiYgaW1hZ2UgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCApIHx8XHJcblx0XHRcdFx0KCB0eXBlb2YgVmlkZW9GcmFtZSAhPT0gJ3VuZGVmaW5lZCcgJiYgaW1hZ2UgaW5zdGFuY2VvZiBWaWRlb0ZyYW1lICkgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHdpZHRoID0gTWF0aC5mbG9vciggc2NhbGUgKiBkaW1lbnNpb25zLndpZHRoICk7XHJcblx0XHRcdFx0Y29uc3QgaGVpZ2h0ID0gTWF0aC5mbG9vciggc2NhbGUgKiBkaW1lbnNpb25zLmhlaWdodCApO1xyXG5cclxuXHRcdFx0XHRpZiAoIF9jYW52YXMgPT09IHVuZGVmaW5lZCApIF9jYW52YXMgPSBjcmVhdGVDYW52YXMoIHdpZHRoLCBoZWlnaHQgKTtcclxuXHJcblx0XHRcdFx0Ly8gY3ViZSB0ZXh0dXJlcyBjYW4ndCByZXVzZSB0aGUgc2FtZSBjYW52YXNcclxuXHJcblx0XHRcdFx0Y29uc3QgY2FudmFzID0gbmVlZHNOZXdDYW52YXMgPyBjcmVhdGVDYW52YXMoIHdpZHRoLCBoZWlnaHQgKSA6IF9jYW52YXM7XHJcblxyXG5cdFx0XHRcdGNhbnZhcy53aWR0aCA9IHdpZHRoO1xyXG5cdFx0XHRcdGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCggJzJkJyApO1xyXG5cdFx0XHRcdGNvbnRleHQuZHJhd0ltYWdlKCBpbWFnZSwgMCwgMCwgd2lkdGgsIGhlaWdodCApO1xyXG5cclxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIGhhcyBiZWVuIHJlc2l6ZWQgZnJvbSAoJyArIGRpbWVuc2lvbnMud2lkdGggKyAneCcgKyBkaW1lbnNpb25zLmhlaWdodCArICcpIHRvICgnICsgd2lkdGggKyAneCcgKyBoZWlnaHQgKyAnKS4nICk7XHJcblxyXG5cdFx0XHRcdHJldHVybiBjYW52YXM7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRpZiAoICdkYXRhJyBpbiBpbWFnZSApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBJbWFnZSBpbiBEYXRhVGV4dHVyZSBpcyB0b28gYmlnICgnICsgZGltZW5zaW9ucy53aWR0aCArICd4JyArIGRpbWVuc2lvbnMuaGVpZ2h0ICsgJykuJyApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHJldHVybiBpbWFnZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGltYWdlO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHRleHR1cmVOZWVkc0dlbmVyYXRlTWlwbWFwcyggdGV4dHVyZSApIHtcclxuXHJcblx0XHRyZXR1cm4gdGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gZ2VuZXJhdGVNaXBtYXAoIHRhcmdldCApIHtcclxuXHJcblx0XHRfZ2wuZ2VuZXJhdGVNaXBtYXAoIHRhcmdldCApO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGdldFRhcmdldFR5cGUoIHRleHR1cmUgKSB7XHJcblxyXG5cdFx0aWYgKCB0ZXh0dXJlLmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0ICkgcmV0dXJuIF9nbC5URVhUVVJFX0NVQkVfTUFQO1xyXG5cdFx0aWYgKCB0ZXh0dXJlLmlzV2ViR0wzRFJlbmRlclRhcmdldCApIHJldHVybiBfZ2wuVEVYVFVSRV8zRDtcclxuXHRcdGlmICggdGV4dHVyZS5pc1dlYkdMQXJyYXlSZW5kZXJUYXJnZXQgfHwgdGV4dHVyZS5pc0NvbXByZXNzZWRBcnJheVRleHR1cmUgKSByZXR1cm4gX2dsLlRFWFRVUkVfMkRfQVJSQVk7XHJcblx0XHRyZXR1cm4gX2dsLlRFWFRVUkVfMkQ7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gZ2V0SW50ZXJuYWxGb3JtYXQoIGludGVybmFsRm9ybWF0TmFtZSwgZ2xGb3JtYXQsIGdsVHlwZSwgY29sb3JTcGFjZSwgZm9yY2VMaW5lYXJUcmFuc2ZlciA9IGZhbHNlICkge1xyXG5cclxuXHRcdGlmICggaW50ZXJuYWxGb3JtYXROYW1lICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0aWYgKCBfZ2xbIGludGVybmFsRm9ybWF0TmFtZSBdICE9PSB1bmRlZmluZWQgKSByZXR1cm4gX2dsWyBpbnRlcm5hbEZvcm1hdE5hbWUgXTtcclxuXHJcblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IEF0dGVtcHQgdG8gdXNlIG5vbi1leGlzdGluZyBXZWJHTCBpbnRlcm5hbCBmb3JtYXQgXFwnJyArIGludGVybmFsRm9ybWF0TmFtZSArICdcXCcnICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGxldCBpbnRlcm5hbEZvcm1hdCA9IGdsRm9ybWF0O1xyXG5cclxuXHRcdGlmICggZ2xGb3JtYXQgPT09IF9nbC5SRUQgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gX2dsLkZMT0FUICkgaW50ZXJuYWxGb3JtYXQgPSBfZ2wuUjMyRjtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IF9nbC5IQUxGX0ZMT0FUICkgaW50ZXJuYWxGb3JtYXQgPSBfZ2wuUjE2RjtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IF9nbC5VTlNJR05FRF9CWVRFICkgaW50ZXJuYWxGb3JtYXQgPSBfZ2wuUjg7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggZ2xGb3JtYXQgPT09IF9nbC5SRURfSU5URUdFUiApIHtcclxuXHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBfZ2wuVU5TSUdORURfQllURSApIGludGVybmFsRm9ybWF0ID0gX2dsLlI4VUk7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBfZ2wuVU5TSUdORURfU0hPUlQgKSBpbnRlcm5hbEZvcm1hdCA9IF9nbC5SMTZVSTtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IF9nbC5VTlNJR05FRF9JTlQgKSBpbnRlcm5hbEZvcm1hdCA9IF9nbC5SMzJVSTtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IF9nbC5CWVRFICkgaW50ZXJuYWxGb3JtYXQgPSBfZ2wuUjhJO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gX2dsLlNIT1JUICkgaW50ZXJuYWxGb3JtYXQgPSBfZ2wuUjE2STtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IF9nbC5JTlQgKSBpbnRlcm5hbEZvcm1hdCA9IF9nbC5SMzJJO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGdsRm9ybWF0ID09PSBfZ2wuUkcgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gX2dsLkZMT0FUICkgaW50ZXJuYWxGb3JtYXQgPSBfZ2wuUkczMkY7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBfZ2wuSEFMRl9GTE9BVCApIGludGVybmFsRm9ybWF0ID0gX2dsLlJHMTZGO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gX2dsLlVOU0lHTkVEX0JZVEUgKSBpbnRlcm5hbEZvcm1hdCA9IF9nbC5SRzg7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggZ2xGb3JtYXQgPT09IF9nbC5SR19JTlRFR0VSICkge1xyXG5cclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IF9nbC5VTlNJR05FRF9CWVRFICkgaW50ZXJuYWxGb3JtYXQgPSBfZ2wuUkc4VUk7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBfZ2wuVU5TSUdORURfU0hPUlQgKSBpbnRlcm5hbEZvcm1hdCA9IF9nbC5SRzE2VUk7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBfZ2wuVU5TSUdORURfSU5UICkgaW50ZXJuYWxGb3JtYXQgPSBfZ2wuUkczMlVJO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gX2dsLkJZVEUgKSBpbnRlcm5hbEZvcm1hdCA9IF9nbC5SRzhJO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gX2dsLlNIT1JUICkgaW50ZXJuYWxGb3JtYXQgPSBfZ2wuUkcxNkk7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBfZ2wuSU5UICkgaW50ZXJuYWxGb3JtYXQgPSBfZ2wuUkczMkk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggZ2xGb3JtYXQgPT09IF9nbC5SR0JfSU5URUdFUiApIHtcclxuXHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBfZ2wuVU5TSUdORURfQllURSApIGludGVybmFsRm9ybWF0ID0gX2dsLlJHQjhVSTtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IF9nbC5VTlNJR05FRF9TSE9SVCApIGludGVybmFsRm9ybWF0ID0gX2dsLlJHQjE2VUk7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBfZ2wuVU5TSUdORURfSU5UICkgaW50ZXJuYWxGb3JtYXQgPSBfZ2wuUkdCMzJVSTtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IF9nbC5CWVRFICkgaW50ZXJuYWxGb3JtYXQgPSBfZ2wuUkdCOEk7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBfZ2wuU0hPUlQgKSBpbnRlcm5hbEZvcm1hdCA9IF9nbC5SR0IxNkk7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBfZ2wuSU5UICkgaW50ZXJuYWxGb3JtYXQgPSBfZ2wuUkdCMzJJO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGdsRm9ybWF0ID09PSBfZ2wuUkdCQV9JTlRFR0VSICkge1xyXG5cclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IF9nbC5VTlNJR05FRF9CWVRFICkgaW50ZXJuYWxGb3JtYXQgPSBfZ2wuUkdCQThVSTtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IF9nbC5VTlNJR05FRF9TSE9SVCApIGludGVybmFsRm9ybWF0ID0gX2dsLlJHQkExNlVJO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gX2dsLlVOU0lHTkVEX0lOVCApIGludGVybmFsRm9ybWF0ID0gX2dsLlJHQkEzMlVJO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gX2dsLkJZVEUgKSBpbnRlcm5hbEZvcm1hdCA9IF9nbC5SR0JBOEk7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBfZ2wuU0hPUlQgKSBpbnRlcm5hbEZvcm1hdCA9IF9nbC5SR0JBMTZJO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gX2dsLklOVCApIGludGVybmFsRm9ybWF0ID0gX2dsLlJHQkEzMkk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggZ2xGb3JtYXQgPT09IF9nbC5SR0IgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gX2dsLlVOU0lHTkVEX0lOVF81XzlfOV85X1JFViApIGludGVybmFsRm9ybWF0ID0gX2dsLlJHQjlfRTU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggZ2xGb3JtYXQgPT09IF9nbC5SR0JBICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdHJhbnNmZXIgPSBmb3JjZUxpbmVhclRyYW5zZmVyID8gTGluZWFyVHJhbnNmZXIgOiBDb2xvck1hbmFnZW1lbnQuZ2V0VHJhbnNmZXIoIGNvbG9yU3BhY2UgKTtcclxuXHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBfZ2wuRkxPQVQgKSBpbnRlcm5hbEZvcm1hdCA9IF9nbC5SR0JBMzJGO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gX2dsLkhBTEZfRkxPQVQgKSBpbnRlcm5hbEZvcm1hdCA9IF9nbC5SR0JBMTZGO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gX2dsLlVOU0lHTkVEX0JZVEUgKSBpbnRlcm5hbEZvcm1hdCA9ICggdHJhbnNmZXIgPT09IFNSR0JUcmFuc2ZlciApID8gX2dsLlNSR0I4X0FMUEhBOCA6IF9nbC5SR0JBODtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IF9nbC5VTlNJR05FRF9TSE9SVF80XzRfNF80ICkgaW50ZXJuYWxGb3JtYXQgPSBfZ2wuUkdCQTQ7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBfZ2wuVU5TSUdORURfU0hPUlRfNV81XzVfMSApIGludGVybmFsRm9ybWF0ID0gX2dsLlJHQjVfQTE7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggaW50ZXJuYWxGb3JtYXQgPT09IF9nbC5SMTZGIHx8IGludGVybmFsRm9ybWF0ID09PSBfZ2wuUjMyRiB8fFxyXG5cdFx0XHRpbnRlcm5hbEZvcm1hdCA9PT0gX2dsLlJHMTZGIHx8IGludGVybmFsRm9ybWF0ID09PSBfZ2wuUkczMkYgfHxcclxuXHRcdFx0aW50ZXJuYWxGb3JtYXQgPT09IF9nbC5SR0JBMTZGIHx8IGludGVybmFsRm9ybWF0ID09PSBfZ2wuUkdCQTMyRiApIHtcclxuXHJcblx0XHRcdGV4dGVuc2lvbnMuZ2V0KCAnRVhUX2NvbG9yX2J1ZmZlcl9mbG9hdCcgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGludGVybmFsRm9ybWF0O1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGdldEludGVybmFsRGVwdGhGb3JtYXQoIHVzZVN0ZW5jaWwsIGRlcHRoVHlwZSApIHtcclxuXHJcblx0XHRsZXQgZ2xJbnRlcm5hbEZvcm1hdDtcclxuXHRcdGlmICggdXNlU3RlbmNpbCApIHtcclxuXHJcblx0XHRcdGlmICggZGVwdGhUeXBlID09PSBudWxsIHx8IGRlcHRoVHlwZSA9PT0gVW5zaWduZWRJbnRUeXBlIHx8IGRlcHRoVHlwZSA9PT0gVW5zaWduZWRJbnQyNDhUeXBlICkge1xyXG5cclxuXHRcdFx0XHRnbEludGVybmFsRm9ybWF0ID0gX2dsLkRFUFRIMjRfU1RFTkNJTDg7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBkZXB0aFR5cGUgPT09IEZsb2F0VHlwZSApIHtcclxuXHJcblx0XHRcdFx0Z2xJbnRlcm5hbEZvcm1hdCA9IF9nbC5ERVBUSDMyRl9TVEVOQ0lMODtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGRlcHRoVHlwZSA9PT0gVW5zaWduZWRTaG9ydFR5cGUgKSB7XHJcblxyXG5cdFx0XHRcdGdsSW50ZXJuYWxGb3JtYXQgPSBfZ2wuREVQVEgyNF9TVEVOQ0lMODtcclxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdEZXB0aFRleHR1cmU6IDE2IGJpdCBkZXB0aCBhdHRhY2htZW50IGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCBzdGVuY2lsLiBVc2luZyAyNC1iaXQgYXR0YWNobWVudC4nICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGlmICggZGVwdGhUeXBlID09PSBudWxsIHx8IGRlcHRoVHlwZSA9PT0gVW5zaWduZWRJbnRUeXBlIHx8IGRlcHRoVHlwZSA9PT0gVW5zaWduZWRJbnQyNDhUeXBlICkge1xyXG5cclxuXHRcdFx0XHRnbEludGVybmFsRm9ybWF0ID0gX2dsLkRFUFRIX0NPTVBPTkVOVDI0O1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggZGVwdGhUeXBlID09PSBGbG9hdFR5cGUgKSB7XHJcblxyXG5cdFx0XHRcdGdsSW50ZXJuYWxGb3JtYXQgPSBfZ2wuREVQVEhfQ09NUE9ORU5UMzJGO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggZGVwdGhUeXBlID09PSBVbnNpZ25lZFNob3J0VHlwZSApIHtcclxuXHJcblx0XHRcdFx0Z2xJbnRlcm5hbEZvcm1hdCA9IF9nbC5ERVBUSF9DT01QT05FTlQxNjtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGdsSW50ZXJuYWxGb3JtYXQ7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gZ2V0TWlwTGV2ZWxzKCB0ZXh0dXJlLCBpbWFnZSApIHtcclxuXHJcblx0XHRpZiAoIHRleHR1cmVOZWVkc0dlbmVyYXRlTWlwbWFwcyggdGV4dHVyZSApID09PSB0cnVlIHx8ICggdGV4dHVyZS5pc0ZyYW1lYnVmZmVyVGV4dHVyZSAmJiB0ZXh0dXJlLm1pbkZpbHRlciAhPT0gTmVhcmVzdEZpbHRlciAmJiB0ZXh0dXJlLm1pbkZpbHRlciAhPT0gTGluZWFyRmlsdGVyICkgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gTWF0aC5sb2cyKCBNYXRoLm1heCggaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCApICkgKyAxO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHRleHR1cmUubWlwbWFwcyAhPT0gdW5kZWZpbmVkICYmIHRleHR1cmUubWlwbWFwcy5sZW5ndGggPiAwICkge1xyXG5cclxuXHRcdFx0Ly8gdXNlci1kZWZpbmVkIG1pcG1hcHNcclxuXHJcblx0XHRcdHJldHVybiB0ZXh0dXJlLm1pcG1hcHMubGVuZ3RoO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHRleHR1cmUuaXNDb21wcmVzc2VkVGV4dHVyZSAmJiBBcnJheS5pc0FycmF5KCB0ZXh0dXJlLmltYWdlICkgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gaW1hZ2UubWlwbWFwcy5sZW5ndGg7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdC8vIHRleHR1cmUgd2l0aG91dCBtaXBtYXBzIChvbmx5IGJhc2UgbGV2ZWwpXHJcblxyXG5cdFx0XHRyZXR1cm4gMTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0Ly9cclxuXHJcblx0ZnVuY3Rpb24gb25UZXh0dXJlRGlzcG9zZSggZXZlbnQgKSB7XHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZSA9IGV2ZW50LnRhcmdldDtcclxuXHJcblx0XHR0ZXh0dXJlLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25UZXh0dXJlRGlzcG9zZSApO1xyXG5cclxuXHRcdGRlYWxsb2NhdGVUZXh0dXJlKCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0aWYgKCB0ZXh0dXJlLmlzVmlkZW9UZXh0dXJlICkge1xyXG5cclxuXHRcdFx0X3ZpZGVvVGV4dHVyZXMuZGVsZXRlKCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIG9uUmVuZGVyVGFyZ2V0RGlzcG9zZSggZXZlbnQgKSB7XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyVGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xyXG5cclxuXHRcdHJlbmRlclRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uUmVuZGVyVGFyZ2V0RGlzcG9zZSApO1xyXG5cclxuXHRcdGRlYWxsb2NhdGVSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vXHJcblxyXG5cdGZ1bmN0aW9uIGRlYWxsb2NhdGVUZXh0dXJlKCB0ZXh0dXJlICkge1xyXG5cclxuXHRcdGNvbnN0IHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKTtcclxuXHJcblx0XHRpZiAoIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xJbml0ID09PSB1bmRlZmluZWQgKSByZXR1cm47XHJcblxyXG5cdFx0Ly8gY2hlY2sgaWYgaXQncyBuZWNlc3NhcnkgdG8gcmVtb3ZlIHRoZSBXZWJHTFRleHR1cmUgb2JqZWN0XHJcblxyXG5cdFx0Y29uc3Qgc291cmNlID0gdGV4dHVyZS5zb3VyY2U7XHJcblx0XHRjb25zdCB3ZWJnbFRleHR1cmVzID0gX3NvdXJjZXMuZ2V0KCBzb3VyY2UgKTtcclxuXHJcblx0XHRpZiAoIHdlYmdsVGV4dHVyZXMgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB3ZWJnbFRleHR1cmUgPSB3ZWJnbFRleHR1cmVzWyB0ZXh0dXJlUHJvcGVydGllcy5fX2NhY2hlS2V5IF07XHJcblx0XHRcdHdlYmdsVGV4dHVyZS51c2VkVGltZXMgLS07XHJcblxyXG5cdFx0XHQvLyB0aGUgV2ViR0xUZXh0dXJlIG9iamVjdCBpcyBub3QgdXNlZCBhbnltb3JlLCByZW1vdmUgaXRcclxuXHJcblx0XHRcdGlmICggd2ViZ2xUZXh0dXJlLnVzZWRUaW1lcyA9PT0gMCApIHtcclxuXHJcblx0XHRcdFx0ZGVsZXRlVGV4dHVyZSggdGV4dHVyZSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gcmVtb3ZlIHRoZSB3ZWFrIG1hcCBlbnRyeSBpZiBubyBXZWJHTFRleHR1cmUgdXNlcyB0aGUgc291cmNlIGFueW1vcmVcclxuXHJcblx0XHRcdGlmICggT2JqZWN0LmtleXMoIHdlYmdsVGV4dHVyZXMgKS5sZW5ndGggPT09IDAgKSB7XHJcblxyXG5cdFx0XHRcdF9zb3VyY2VzLmRlbGV0ZSggc291cmNlICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHByb3BlcnRpZXMucmVtb3ZlKCB0ZXh0dXJlICk7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gZGVsZXRlVGV4dHVyZSggdGV4dHVyZSApIHtcclxuXHJcblx0XHRjb25zdCB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICk7XHJcblx0XHRfZ2wuZGVsZXRlVGV4dHVyZSggdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgKTtcclxuXHJcblx0XHRjb25zdCBzb3VyY2UgPSB0ZXh0dXJlLnNvdXJjZTtcclxuXHRcdGNvbnN0IHdlYmdsVGV4dHVyZXMgPSBfc291cmNlcy5nZXQoIHNvdXJjZSApO1xyXG5cdFx0ZGVsZXRlIHdlYmdsVGV4dHVyZXNbIHRleHR1cmVQcm9wZXJ0aWVzLl9fY2FjaGVLZXkgXTtcclxuXHJcblx0XHRpbmZvLm1lbW9yeS50ZXh0dXJlcyAtLTtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBkZWFsbG9jYXRlUmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQgKSB7XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyVGFyZ2V0UHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQgKTtcclxuXHJcblx0XHRpZiAoIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmRpc3Bvc2UoKTtcclxuXHJcblx0XHRcdHByb3BlcnRpZXMucmVtb3ZlKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggcmVuZGVyVGFyZ2V0LmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0ICkge1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgNjsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlclsgaSBdICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0Zm9yICggbGV0IGxldmVsID0gMDsgbGV2ZWwgPCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlclsgaSBdLmxlbmd0aDsgbGV2ZWwgKysgKSBfZ2wuZGVsZXRlRnJhbWVidWZmZXIoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyWyBpIF1bIGxldmVsIF0gKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRfZ2wuZGVsZXRlRnJhbWVidWZmZXIoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyWyBpIF0gKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyICkgX2dsLmRlbGV0ZVJlbmRlcmJ1ZmZlciggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXJbIGkgXSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyICkgKSB7XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBsZXZlbCA9IDA7IGxldmVsIDwgcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXIubGVuZ3RoOyBsZXZlbCArKyApIF9nbC5kZWxldGVGcmFtZWJ1ZmZlciggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXJbIGxldmVsIF0gKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdF9nbC5kZWxldGVGcmFtZWJ1ZmZlciggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXIgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXIgKSBfZ2wuZGVsZXRlUmVuZGVyYnVmZmVyKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlciApO1xyXG5cdFx0XHRpZiAoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyICkgX2dsLmRlbGV0ZUZyYW1lYnVmZmVyKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlciApO1xyXG5cclxuXHRcdFx0aWYgKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlciApIHtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXIubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdGlmICggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXJbIGkgXSApIF9nbC5kZWxldGVSZW5kZXJidWZmZXIoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyWyBpIF0gKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aFJlbmRlcmJ1ZmZlciApIF9nbC5kZWxldGVSZW5kZXJidWZmZXIoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoUmVuZGVyYnVmZmVyICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHRleHR1cmVzID0gcmVuZGVyVGFyZ2V0LnRleHR1cmVzO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSB0ZXh0dXJlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGF0dGFjaG1lbnRQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmVzWyBpIF0gKTtcclxuXHJcblx0XHRcdGlmICggYXR0YWNobWVudFByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRcdF9nbC5kZWxldGVUZXh0dXJlKCBhdHRhY2htZW50UHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApO1xyXG5cclxuXHRcdFx0XHRpbmZvLm1lbW9yeS50ZXh0dXJlcyAtLTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHByb3BlcnRpZXMucmVtb3ZlKCB0ZXh0dXJlc1sgaSBdICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHByb3BlcnRpZXMucmVtb3ZlKCByZW5kZXJUYXJnZXQgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvL1xyXG5cclxuXHRsZXQgdGV4dHVyZVVuaXRzID0gMDtcclxuXHJcblx0ZnVuY3Rpb24gcmVzZXRUZXh0dXJlVW5pdHMoKSB7XHJcblxyXG5cdFx0dGV4dHVyZVVuaXRzID0gMDtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBhbGxvY2F0ZVRleHR1cmVVbml0KCkge1xyXG5cclxuXHRcdGNvbnN0IHRleHR1cmVVbml0ID0gdGV4dHVyZVVuaXRzO1xyXG5cclxuXHRcdGlmICggdGV4dHVyZVVuaXQgPj0gY2FwYWJpbGl0aWVzLm1heFRleHR1cmVzICkge1xyXG5cclxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xUZXh0dXJlczogVHJ5aW5nIHRvIHVzZSAnICsgdGV4dHVyZVVuaXQgKyAnIHRleHR1cmUgdW5pdHMgd2hpbGUgdGhpcyBHUFUgc3VwcG9ydHMgb25seSAnICsgY2FwYWJpbGl0aWVzLm1heFRleHR1cmVzICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRleHR1cmVVbml0cyArPSAxO1xyXG5cclxuXHRcdHJldHVybiB0ZXh0dXJlVW5pdDtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBnZXRUZXh0dXJlQ2FjaGVLZXkoIHRleHR1cmUgKSB7XHJcblxyXG5cdFx0Y29uc3QgYXJyYXkgPSBbXTtcclxuXHJcblx0XHRhcnJheS5wdXNoKCB0ZXh0dXJlLndyYXBTICk7XHJcblx0XHRhcnJheS5wdXNoKCB0ZXh0dXJlLndyYXBUICk7XHJcblx0XHRhcnJheS5wdXNoKCB0ZXh0dXJlLndyYXBSIHx8IDAgKTtcclxuXHRcdGFycmF5LnB1c2goIHRleHR1cmUubWFnRmlsdGVyICk7XHJcblx0XHRhcnJheS5wdXNoKCB0ZXh0dXJlLm1pbkZpbHRlciApO1xyXG5cdFx0YXJyYXkucHVzaCggdGV4dHVyZS5hbmlzb3Ryb3B5ICk7XHJcblx0XHRhcnJheS5wdXNoKCB0ZXh0dXJlLmludGVybmFsRm9ybWF0ICk7XHJcblx0XHRhcnJheS5wdXNoKCB0ZXh0dXJlLmZvcm1hdCApO1xyXG5cdFx0YXJyYXkucHVzaCggdGV4dHVyZS50eXBlICk7XHJcblx0XHRhcnJheS5wdXNoKCB0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyApO1xyXG5cdFx0YXJyYXkucHVzaCggdGV4dHVyZS5wcmVtdWx0aXBseUFscGhhICk7XHJcblx0XHRhcnJheS5wdXNoKCB0ZXh0dXJlLmZsaXBZICk7XHJcblx0XHRhcnJheS5wdXNoKCB0ZXh0dXJlLnVucGFja0FsaWdubWVudCApO1xyXG5cdFx0YXJyYXkucHVzaCggdGV4dHVyZS5jb2xvclNwYWNlICk7XHJcblxyXG5cdFx0cmV0dXJuIGFycmF5LmpvaW4oKTtcclxuXHJcblx0fVxyXG5cclxuXHQvL1xyXG5cclxuXHRmdW5jdGlvbiBzZXRUZXh0dXJlMkQoIHRleHR1cmUsIHNsb3QgKSB7XHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggdGV4dHVyZSApO1xyXG5cclxuXHRcdGlmICggdGV4dHVyZS5pc1ZpZGVvVGV4dHVyZSApIHVwZGF0ZVZpZGVvVGV4dHVyZSggdGV4dHVyZSApO1xyXG5cclxuXHRcdGlmICggdGV4dHVyZS5pc1JlbmRlclRhcmdldFRleHR1cmUgPT09IGZhbHNlICYmIHRleHR1cmUudmVyc2lvbiA+IDAgJiYgdGV4dHVyZVByb3BlcnRpZXMuX192ZXJzaW9uICE9PSB0ZXh0dXJlLnZlcnNpb24gKSB7XHJcblxyXG5cdFx0XHRjb25zdCBpbWFnZSA9IHRleHR1cmUuaW1hZ2U7XHJcblxyXG5cdFx0XHRpZiAoIGltYWdlID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIG1hcmtlZCBmb3IgdXBkYXRlIGJ1dCBubyBpbWFnZSBkYXRhIGZvdW5kLicgKTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGltYWdlLmNvbXBsZXRlID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBtYXJrZWQgZm9yIHVwZGF0ZSBidXQgaW1hZ2UgaXMgaW5jb21wbGV0ZScgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHVwbG9hZFRleHR1cmUoIHRleHR1cmVQcm9wZXJ0aWVzLCB0ZXh0dXJlLCBzbG90ICk7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggX2dsLlRFWFRVUkVfMkQsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlLCBfZ2wuVEVYVFVSRTAgKyBzbG90ICk7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gc2V0VGV4dHVyZTJEQXJyYXkoIHRleHR1cmUsIHNsb3QgKSB7XHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggdGV4dHVyZSApO1xyXG5cclxuXHRcdGlmICggdGV4dHVyZS52ZXJzaW9uID4gMCAmJiB0ZXh0dXJlUHJvcGVydGllcy5fX3ZlcnNpb24gIT09IHRleHR1cmUudmVyc2lvbiApIHtcclxuXHJcblx0XHRcdHVwbG9hZFRleHR1cmUoIHRleHR1cmVQcm9wZXJ0aWVzLCB0ZXh0dXJlLCBzbG90ICk7XHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0c3RhdGUuYmluZFRleHR1cmUoIF9nbC5URVhUVVJFXzJEX0FSUkFZLCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSwgX2dsLlRFWFRVUkUwICsgc2xvdCApO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHNldFRleHR1cmUzRCggdGV4dHVyZSwgc2xvdCApIHtcclxuXHJcblx0XHRjb25zdCB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0aWYgKCB0ZXh0dXJlLnZlcnNpb24gPiAwICYmIHRleHR1cmVQcm9wZXJ0aWVzLl9fdmVyc2lvbiAhPT0gdGV4dHVyZS52ZXJzaW9uICkge1xyXG5cclxuXHRcdFx0dXBsb2FkVGV4dHVyZSggdGV4dHVyZVByb3BlcnRpZXMsIHRleHR1cmUsIHNsb3QgKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggX2dsLlRFWFRVUkVfM0QsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlLCBfZ2wuVEVYVFVSRTAgKyBzbG90ICk7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gc2V0VGV4dHVyZUN1YmUoIHRleHR1cmUsIHNsb3QgKSB7XHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggdGV4dHVyZSApO1xyXG5cclxuXHRcdGlmICggdGV4dHVyZS52ZXJzaW9uID4gMCAmJiB0ZXh0dXJlUHJvcGVydGllcy5fX3ZlcnNpb24gIT09IHRleHR1cmUudmVyc2lvbiApIHtcclxuXHJcblx0XHRcdHVwbG9hZEN1YmVUZXh0dXJlKCB0ZXh0dXJlUHJvcGVydGllcywgdGV4dHVyZSwgc2xvdCApO1xyXG5cdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHN0YXRlLmJpbmRUZXh0dXJlKCBfZ2wuVEVYVFVSRV9DVUJFX01BUCwgdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUsIF9nbC5URVhUVVJFMCArIHNsb3QgKTtcclxuXHJcblx0fVxyXG5cclxuXHRjb25zdCB3cmFwcGluZ1RvR0wgPSB7XHJcblx0XHRbIFJlcGVhdFdyYXBwaW5nIF06IF9nbC5SRVBFQVQsXHJcblx0XHRbIENsYW1wVG9FZGdlV3JhcHBpbmcgXTogX2dsLkNMQU1QX1RPX0VER0UsXHJcblx0XHRbIE1pcnJvcmVkUmVwZWF0V3JhcHBpbmcgXTogX2dsLk1JUlJPUkVEX1JFUEVBVFxyXG5cdH07XHJcblxyXG5cdGNvbnN0IGZpbHRlclRvR0wgPSB7XHJcblx0XHRbIE5lYXJlc3RGaWx0ZXIgXTogX2dsLk5FQVJFU1QsXHJcblx0XHRbIE5lYXJlc3RNaXBtYXBOZWFyZXN0RmlsdGVyIF06IF9nbC5ORUFSRVNUX01JUE1BUF9ORUFSRVNULFxyXG5cdFx0WyBOZWFyZXN0TWlwbWFwTGluZWFyRmlsdGVyIF06IF9nbC5ORUFSRVNUX01JUE1BUF9MSU5FQVIsXHJcblxyXG5cdFx0WyBMaW5lYXJGaWx0ZXIgXTogX2dsLkxJTkVBUixcclxuXHRcdFsgTGluZWFyTWlwbWFwTmVhcmVzdEZpbHRlciBdOiBfZ2wuTElORUFSX01JUE1BUF9ORUFSRVNULFxyXG5cdFx0WyBMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXIgXTogX2dsLkxJTkVBUl9NSVBNQVBfTElORUFSXHJcblx0fTtcclxuXHJcblx0Y29uc3QgY29tcGFyZVRvR0wgPSB7XHJcblx0XHRbIE5ldmVyQ29tcGFyZSBdOiBfZ2wuTkVWRVIsXHJcblx0XHRbIEFsd2F5c0NvbXBhcmUgXTogX2dsLkFMV0FZUyxcclxuXHRcdFsgTGVzc0NvbXBhcmUgXTogX2dsLkxFU1MsXHJcblx0XHRbIExlc3NFcXVhbENvbXBhcmUgXTogX2dsLkxFUVVBTCxcclxuXHRcdFsgRXF1YWxDb21wYXJlIF06IF9nbC5FUVVBTCxcclxuXHRcdFsgR3JlYXRlckVxdWFsQ29tcGFyZSBdOiBfZ2wuR0VRVUFMLFxyXG5cdFx0WyBHcmVhdGVyQ29tcGFyZSBdOiBfZ2wuR1JFQVRFUixcclxuXHRcdFsgTm90RXF1YWxDb21wYXJlIF06IF9nbC5OT1RFUVVBTFxyXG5cdH07XHJcblxyXG5cdGZ1bmN0aW9uIHNldFRleHR1cmVQYXJhbWV0ZXJzKCB0ZXh0dXJlVHlwZSwgdGV4dHVyZSApIHtcclxuXHJcblx0XHRpZiAoIHRleHR1cmUudHlwZSA9PT0gRmxvYXRUeXBlICYmIGV4dGVuc2lvbnMuaGFzKCAnT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyJyApID09PSBmYWxzZSAmJlxyXG5cdFx0XHQoIHRleHR1cmUubWFnRmlsdGVyID09PSBMaW5lYXJGaWx0ZXIgfHwgdGV4dHVyZS5tYWdGaWx0ZXIgPT09IExpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXIgfHwgdGV4dHVyZS5tYWdGaWx0ZXIgPT09IE5lYXJlc3RNaXBtYXBMaW5lYXJGaWx0ZXIgfHwgdGV4dHVyZS5tYWdGaWx0ZXIgPT09IExpbmVhck1pcG1hcExpbmVhckZpbHRlciB8fFxyXG5cdFx0XHR0ZXh0dXJlLm1pbkZpbHRlciA9PT0gTGluZWFyRmlsdGVyIHx8IHRleHR1cmUubWluRmlsdGVyID09PSBMaW5lYXJNaXBtYXBOZWFyZXN0RmlsdGVyIHx8IHRleHR1cmUubWluRmlsdGVyID09PSBOZWFyZXN0TWlwbWFwTGluZWFyRmlsdGVyIHx8IHRleHR1cmUubWluRmlsdGVyID09PSBMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXIgKSApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IFVuYWJsZSB0byB1c2UgbGluZWFyIGZpbHRlcmluZyB3aXRoIGZsb2F0aW5nIHBvaW50IHRleHR1cmVzLiBPRVNfdGV4dHVyZV9mbG9hdF9saW5lYXIgbm90IHN1cHBvcnRlZCBvbiB0aGlzIGRldmljZS4nICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdF9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgX2dsLlRFWFRVUkVfV1JBUF9TLCB3cmFwcGluZ1RvR0xbIHRleHR1cmUud3JhcFMgXSApO1xyXG5cdFx0X2dsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCBfZ2wuVEVYVFVSRV9XUkFQX1QsIHdyYXBwaW5nVG9HTFsgdGV4dHVyZS53cmFwVCBdICk7XHJcblxyXG5cdFx0aWYgKCB0ZXh0dXJlVHlwZSA9PT0gX2dsLlRFWFRVUkVfM0QgfHwgdGV4dHVyZVR5cGUgPT09IF9nbC5URVhUVVJFXzJEX0FSUkFZICkge1xyXG5cclxuXHRcdFx0X2dsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCBfZ2wuVEVYVFVSRV9XUkFQX1IsIHdyYXBwaW5nVG9HTFsgdGV4dHVyZS53cmFwUiBdICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdF9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgX2dsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZmlsdGVyVG9HTFsgdGV4dHVyZS5tYWdGaWx0ZXIgXSApO1xyXG5cdFx0X2dsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCBfZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBmaWx0ZXJUb0dMWyB0ZXh0dXJlLm1pbkZpbHRlciBdICk7XHJcblxyXG5cdFx0aWYgKCB0ZXh0dXJlLmNvbXBhcmVGdW5jdGlvbiApIHtcclxuXHJcblx0XHRcdF9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgX2dsLlRFWFRVUkVfQ09NUEFSRV9NT0RFLCBfZ2wuQ09NUEFSRV9SRUZfVE9fVEVYVFVSRSApO1xyXG5cdFx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIF9nbC5URVhUVVJFX0NPTVBBUkVfRlVOQywgY29tcGFyZVRvR0xbIHRleHR1cmUuY29tcGFyZUZ1bmN0aW9uIF0gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBleHRlbnNpb25zLmhhcyggJ0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYycgKSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdGlmICggdGV4dHVyZS5tYWdGaWx0ZXIgPT09IE5lYXJlc3RGaWx0ZXIgKSByZXR1cm47XHJcblx0XHRcdGlmICggdGV4dHVyZS5taW5GaWx0ZXIgIT09IE5lYXJlc3RNaXBtYXBMaW5lYXJGaWx0ZXIgJiYgdGV4dHVyZS5taW5GaWx0ZXIgIT09IExpbmVhck1pcG1hcExpbmVhckZpbHRlciApIHJldHVybjtcclxuXHRcdFx0aWYgKCB0ZXh0dXJlLnR5cGUgPT09IEZsb2F0VHlwZSAmJiBleHRlbnNpb25zLmhhcyggJ09FU190ZXh0dXJlX2Zsb2F0X2xpbmVhcicgKSA9PT0gZmFsc2UgKSByZXR1cm47IC8vIHZlcmlmeSBleHRlbnNpb25cclxuXHJcblx0XHRcdGlmICggdGV4dHVyZS5hbmlzb3Ryb3B5ID4gMSB8fCBwcm9wZXJ0aWVzLmdldCggdGV4dHVyZSApLl9fY3VycmVudEFuaXNvdHJvcHkgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJyApO1xyXG5cdFx0XHRcdF9nbC50ZXhQYXJhbWV0ZXJmKCB0ZXh0dXJlVHlwZSwgZXh0ZW5zaW9uLlRFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhULCBNYXRoLm1pbiggdGV4dHVyZS5hbmlzb3Ryb3B5LCBjYXBhYmlsaXRpZXMuZ2V0TWF4QW5pc290cm9weSgpICkgKTtcclxuXHRcdFx0XHRwcm9wZXJ0aWVzLmdldCggdGV4dHVyZSApLl9fY3VycmVudEFuaXNvdHJvcHkgPSB0ZXh0dXJlLmFuaXNvdHJvcHk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGluaXRUZXh0dXJlKCB0ZXh0dXJlUHJvcGVydGllcywgdGV4dHVyZSApIHtcclxuXHJcblx0XHRsZXQgZm9yY2VVcGxvYWQgPSBmYWxzZTtcclxuXHJcblx0XHRpZiAoIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xJbml0ID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsSW5pdCA9IHRydWU7XHJcblxyXG5cdFx0XHR0ZXh0dXJlLmFkZEV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25UZXh0dXJlRGlzcG9zZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBjcmVhdGUgU291cmNlIDwtPiBXZWJHTFRleHR1cmVzIG1hcHBpbmcgaWYgbmVjZXNzYXJ5XHJcblxyXG5cdFx0Y29uc3Qgc291cmNlID0gdGV4dHVyZS5zb3VyY2U7XHJcblx0XHRsZXQgd2ViZ2xUZXh0dXJlcyA9IF9zb3VyY2VzLmdldCggc291cmNlICk7XHJcblxyXG5cdFx0aWYgKCB3ZWJnbFRleHR1cmVzID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHR3ZWJnbFRleHR1cmVzID0ge307XHJcblx0XHRcdF9zb3VyY2VzLnNldCggc291cmNlLCB3ZWJnbFRleHR1cmVzICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGNoZWNrIGlmIHRoZXJlIGlzIGFscmVhZHkgYSBXZWJHTFRleHR1cmUgb2JqZWN0IGZvciB0aGUgZ2l2ZW4gdGV4dHVyZSBwYXJhbWV0ZXJzXHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZUNhY2hlS2V5ID0gZ2V0VGV4dHVyZUNhY2hlS2V5KCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0aWYgKCB0ZXh0dXJlQ2FjaGVLZXkgIT09IHRleHR1cmVQcm9wZXJ0aWVzLl9fY2FjaGVLZXkgKSB7XHJcblxyXG5cdFx0XHQvLyBpZiBub3QsIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBXZWJHTFRleHR1cmVcclxuXHJcblx0XHRcdGlmICggd2ViZ2xUZXh0dXJlc1sgdGV4dHVyZUNhY2hlS2V5IF0gPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0Ly8gY3JlYXRlIG5ldyBlbnRyeVxyXG5cclxuXHRcdFx0XHR3ZWJnbFRleHR1cmVzWyB0ZXh0dXJlQ2FjaGVLZXkgXSA9IHtcclxuXHRcdFx0XHRcdHRleHR1cmU6IF9nbC5jcmVhdGVUZXh0dXJlKCksXHJcblx0XHRcdFx0XHR1c2VkVGltZXM6IDBcclxuXHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0XHRpbmZvLm1lbW9yeS50ZXh0dXJlcyArKztcclxuXHJcblx0XHRcdFx0Ly8gd2hlbiBhIG5ldyBpbnN0YW5jZSBvZiBXZWJHTFRleHR1cmUgd2FzIGNyZWF0ZWQsIGEgdGV4dHVyZSB1cGxvYWQgaXMgcmVxdWlyZWRcclxuXHRcdFx0XHQvLyBldmVuIGlmIHRoZSBpbWFnZSBjb250ZW50cyBhcmUgaWRlbnRpY2FsXHJcblxyXG5cdFx0XHRcdGZvcmNlVXBsb2FkID0gdHJ1ZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHdlYmdsVGV4dHVyZXNbIHRleHR1cmVDYWNoZUtleSBdLnVzZWRUaW1lcyArKztcclxuXHJcblx0XHRcdC8vIGV2ZXJ5IHRpbWUgdGhlIHRleHR1cmUgY2FjaGUga2V5IGNoYW5nZXMsIGl0J3MgbmVjZXNzYXJ5IHRvIGNoZWNrIGlmIGFuIGluc3RhbmNlIG9mXHJcblx0XHRcdC8vIFdlYkdMVGV4dHVyZSBjYW4gYmUgZGVsZXRlZCBpbiBvcmRlciB0byBhdm9pZCBhIG1lbW9yeSBsZWFrLlxyXG5cclxuXHRcdFx0Y29uc3Qgd2ViZ2xUZXh0dXJlID0gd2ViZ2xUZXh0dXJlc1sgdGV4dHVyZVByb3BlcnRpZXMuX19jYWNoZUtleSBdO1xyXG5cclxuXHRcdFx0aWYgKCB3ZWJnbFRleHR1cmUgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0d2ViZ2xUZXh0dXJlc1sgdGV4dHVyZVByb3BlcnRpZXMuX19jYWNoZUtleSBdLnVzZWRUaW1lcyAtLTtcclxuXHJcblx0XHRcdFx0aWYgKCB3ZWJnbFRleHR1cmUudXNlZFRpbWVzID09PSAwICkge1xyXG5cclxuXHRcdFx0XHRcdGRlbGV0ZVRleHR1cmUoIHRleHR1cmUgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gc3RvcmUgcmVmZXJlbmNlcyB0byBjYWNoZSBrZXkgYW5kIFdlYkdMVGV4dHVyZSBvYmplY3RcclxuXHJcblx0XHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fY2FjaGVLZXkgPSB0ZXh0dXJlQ2FjaGVLZXk7XHJcblx0XHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlID0gd2ViZ2xUZXh0dXJlc1sgdGV4dHVyZUNhY2hlS2V5IF0udGV4dHVyZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGZvcmNlVXBsb2FkO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHVwbG9hZFRleHR1cmUoIHRleHR1cmVQcm9wZXJ0aWVzLCB0ZXh0dXJlLCBzbG90ICkge1xyXG5cclxuXHRcdGxldCB0ZXh0dXJlVHlwZSA9IF9nbC5URVhUVVJFXzJEO1xyXG5cclxuXHRcdGlmICggdGV4dHVyZS5pc0RhdGFBcnJheVRleHR1cmUgfHwgdGV4dHVyZS5pc0NvbXByZXNzZWRBcnJheVRleHR1cmUgKSB0ZXh0dXJlVHlwZSA9IF9nbC5URVhUVVJFXzJEX0FSUkFZO1xyXG5cdFx0aWYgKCB0ZXh0dXJlLmlzRGF0YTNEVGV4dHVyZSApIHRleHR1cmVUeXBlID0gX2dsLlRFWFRVUkVfM0Q7XHJcblxyXG5cdFx0Y29uc3QgZm9yY2VVcGxvYWQgPSBpbml0VGV4dHVyZSggdGV4dHVyZVByb3BlcnRpZXMsIHRleHR1cmUgKTtcclxuXHRcdGNvbnN0IHNvdXJjZSA9IHRleHR1cmUuc291cmNlO1xyXG5cclxuXHRcdHN0YXRlLmJpbmRUZXh0dXJlKCB0ZXh0dXJlVHlwZSwgdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUsIF9nbC5URVhUVVJFMCArIHNsb3QgKTtcclxuXHJcblx0XHRjb25zdCBzb3VyY2VQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHNvdXJjZSApO1xyXG5cclxuXHRcdGlmICggc291cmNlLnZlcnNpb24gIT09IHNvdXJjZVByb3BlcnRpZXMuX192ZXJzaW9uIHx8IGZvcmNlVXBsb2FkID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0c3RhdGUuYWN0aXZlVGV4dHVyZSggX2dsLlRFWFRVUkUwICsgc2xvdCApO1xyXG5cclxuXHRcdFx0Y29uc3Qgd29ya2luZ1ByaW1hcmllcyA9IENvbG9yTWFuYWdlbWVudC5nZXRQcmltYXJpZXMoIENvbG9yTWFuYWdlbWVudC53b3JraW5nQ29sb3JTcGFjZSApO1xyXG5cdFx0XHRjb25zdCB0ZXh0dXJlUHJpbWFyaWVzID0gdGV4dHVyZS5jb2xvclNwYWNlID09PSBOb0NvbG9yU3BhY2UgPyBudWxsIDogQ29sb3JNYW5hZ2VtZW50LmdldFByaW1hcmllcyggdGV4dHVyZS5jb2xvclNwYWNlICk7XHJcblx0XHRcdGNvbnN0IHVucGFja0NvbnZlcnNpb24gPSB0ZXh0dXJlLmNvbG9yU3BhY2UgPT09IE5vQ29sb3JTcGFjZSB8fCB3b3JraW5nUHJpbWFyaWVzID09PSB0ZXh0dXJlUHJpbWFyaWVzID8gX2dsLk5PTkUgOiBfZ2wuQlJPV1NFUl9ERUZBVUxUX1dFQkdMO1xyXG5cclxuXHRcdFx0X2dsLnBpeGVsU3RvcmVpKCBfZ2wuVU5QQUNLX0ZMSVBfWV9XRUJHTCwgdGV4dHVyZS5mbGlwWSApO1xyXG5cdFx0XHRfZ2wucGl4ZWxTdG9yZWkoIF9nbC5VTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wsIHRleHR1cmUucHJlbXVsdGlwbHlBbHBoYSApO1xyXG5cdFx0XHRfZ2wucGl4ZWxTdG9yZWkoIF9nbC5VTlBBQ0tfQUxJR05NRU5ULCB0ZXh0dXJlLnVucGFja0FsaWdubWVudCApO1xyXG5cdFx0XHRfZ2wucGl4ZWxTdG9yZWkoIF9nbC5VTlBBQ0tfQ09MT1JTUEFDRV9DT05WRVJTSU9OX1dFQkdMLCB1bnBhY2tDb252ZXJzaW9uICk7XHJcblxyXG5cdFx0XHRsZXQgaW1hZ2UgPSByZXNpemVJbWFnZSggdGV4dHVyZS5pbWFnZSwgZmFsc2UsIGNhcGFiaWxpdGllcy5tYXhUZXh0dXJlU2l6ZSApO1xyXG5cdFx0XHRpbWFnZSA9IHZlcmlmeUNvbG9yU3BhY2UoIHRleHR1cmUsIGltYWdlICk7XHJcblxyXG5cdFx0XHRjb25zdCBnbEZvcm1hdCA9IHV0aWxzLmNvbnZlcnQoIHRleHR1cmUuZm9ybWF0LCB0ZXh0dXJlLmNvbG9yU3BhY2UgKTtcclxuXHJcblx0XHRcdGNvbnN0IGdsVHlwZSA9IHV0aWxzLmNvbnZlcnQoIHRleHR1cmUudHlwZSApO1xyXG5cdFx0XHRsZXQgZ2xJbnRlcm5hbEZvcm1hdCA9IGdldEludGVybmFsRm9ybWF0KCB0ZXh0dXJlLmludGVybmFsRm9ybWF0LCBnbEZvcm1hdCwgZ2xUeXBlLCB0ZXh0dXJlLmNvbG9yU3BhY2UsIHRleHR1cmUuaXNWaWRlb1RleHR1cmUgKTtcclxuXHJcblx0XHRcdHNldFRleHR1cmVQYXJhbWV0ZXJzKCB0ZXh0dXJlVHlwZSwgdGV4dHVyZSApO1xyXG5cclxuXHRcdFx0bGV0IG1pcG1hcDtcclxuXHRcdFx0Y29uc3QgbWlwbWFwcyA9IHRleHR1cmUubWlwbWFwcztcclxuXHJcblx0XHRcdGNvbnN0IHVzZVRleFN0b3JhZ2UgPSAoIHRleHR1cmUuaXNWaWRlb1RleHR1cmUgIT09IHRydWUgKTtcclxuXHRcdFx0Y29uc3QgYWxsb2NhdGVNZW1vcnkgPSAoIHNvdXJjZVByb3BlcnRpZXMuX192ZXJzaW9uID09PSB1bmRlZmluZWQgKSB8fCAoIGZvcmNlVXBsb2FkID09PSB0cnVlICk7XHJcblx0XHRcdGNvbnN0IGRhdGFSZWFkeSA9IHNvdXJjZS5kYXRhUmVhZHk7XHJcblx0XHRcdGNvbnN0IGxldmVscyA9IGdldE1pcExldmVscyggdGV4dHVyZSwgaW1hZ2UgKTtcclxuXHJcblx0XHRcdGlmICggdGV4dHVyZS5pc0RlcHRoVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0Z2xJbnRlcm5hbEZvcm1hdCA9IGdldEludGVybmFsRGVwdGhGb3JtYXQoIHRleHR1cmUuZm9ybWF0ID09PSBEZXB0aFN0ZW5jaWxGb3JtYXQsIHRleHR1cmUudHlwZSApO1xyXG5cclxuXHRcdFx0XHQvL1xyXG5cclxuXHRcdFx0XHRpZiAoIGFsbG9jYXRlTWVtb3J5ICkge1xyXG5cclxuXHRcdFx0XHRcdGlmICggdXNlVGV4U3RvcmFnZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdHN0YXRlLnRleFN0b3JhZ2UyRCggX2dsLlRFWFRVUkVfMkQsIDEsIGdsSW50ZXJuYWxGb3JtYXQsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQgKTtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0c3RhdGUudGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIDAsIGdsSW50ZXJuYWxGb3JtYXQsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIG51bGwgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIHRleHR1cmUuaXNEYXRhVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0Ly8gdXNlIG1hbnVhbGx5IGNyZWF0ZWQgbWlwbWFwcyBpZiBhdmFpbGFibGVcclxuXHRcdFx0XHQvLyBpZiB0aGVyZSBhcmUgbm8gbWFudWFsIG1pcG1hcHNcclxuXHRcdFx0XHQvLyBzZXQgMCBsZXZlbCBtaXBtYXAgYW5kIHRoZW4gdXNlIEdMIHRvIGdlbmVyYXRlIG90aGVyIG1pcG1hcCBsZXZlbHNcclxuXHJcblx0XHRcdFx0aWYgKCBtaXBtYXBzLmxlbmd0aCA+IDAgKSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCB1c2VUZXhTdG9yYWdlICYmIGFsbG9jYXRlTWVtb3J5ICkge1xyXG5cclxuXHRcdFx0XHRcdFx0c3RhdGUudGV4U3RvcmFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgbGV2ZWxzLCBnbEludGVybmFsRm9ybWF0LCBtaXBtYXBzWyAwIF0ud2lkdGgsIG1pcG1hcHNbIDAgXS5oZWlnaHQgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IG1pcG1hcHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRtaXBtYXAgPSBtaXBtYXBzWyBpIF07XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIHVzZVRleFN0b3JhZ2UgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmICggZGF0YVJlYWR5ICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdHN0YXRlLnRleFN1YkltYWdlMkQoIF9nbC5URVhUVVJFXzJELCBpLCAwLCAwLCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIGdsRm9ybWF0LCBnbFR5cGUsIG1pcG1hcC5kYXRhICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFXzJELCBpLCBnbEludGVybmFsRm9ybWF0LCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIG1pcG1hcC5kYXRhICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCB1c2VUZXhTdG9yYWdlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCBhbGxvY2F0ZU1lbW9yeSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0c3RhdGUudGV4U3RvcmFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgbGV2ZWxzLCBnbEludGVybmFsRm9ybWF0LCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0ICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIGRhdGFSZWFkeSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0c3RhdGUudGV4U3ViSW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIDAsIDAsIDAsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQsIGdsRm9ybWF0LCBnbFR5cGUsIGltYWdlLmRhdGEgKTtcclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0c3RhdGUudGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIDAsIGdsSW50ZXJuYWxGb3JtYXQsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIGltYWdlLmRhdGEgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIHRleHR1cmUuaXNDb21wcmVzc2VkVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0aWYgKCB0ZXh0dXJlLmlzQ29tcHJlc3NlZEFycmF5VGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIHVzZVRleFN0b3JhZ2UgJiYgYWxsb2NhdGVNZW1vcnkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRzdGF0ZS50ZXhTdG9yYWdlM0QoIF9nbC5URVhUVVJFXzJEX0FSUkFZLCBsZXZlbHMsIGdsSW50ZXJuYWxGb3JtYXQsIG1pcG1hcHNbIDAgXS53aWR0aCwgbWlwbWFwc1sgMCBdLmhlaWdodCwgaW1hZ2UuZGVwdGggKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IG1pcG1hcHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRtaXBtYXAgPSBtaXBtYXBzWyBpIF07XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIHRleHR1cmUuZm9ybWF0ICE9PSBSR0JBRm9ybWF0ICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoIGdsRm9ybWF0ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGlmICggdXNlVGV4U3RvcmFnZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmICggZGF0YVJlYWR5ICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIHRleHR1cmUubGF5ZXJVcGRhdGVzLnNpemUgPiAwICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGxheWVyQnl0ZUxlbmd0aCA9IGdldEJ5dGVMZW5ndGgoIG1pcG1hcC53aWR0aCwgbWlwbWFwLmhlaWdodCwgdGV4dHVyZS5mb3JtYXQsIHRleHR1cmUudHlwZSApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZvciAoIGNvbnN0IGxheWVySW5kZXggb2YgdGV4dHVyZS5sYXllclVwZGF0ZXMgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBsYXllckRhdGEgPSBtaXBtYXAuZGF0YS5zdWJhcnJheShcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsYXllckluZGV4ICogbGF5ZXJCeXRlTGVuZ3RoIC8gbWlwbWFwLmRhdGEuQllURVNfUEVSX0VMRU1FTlQsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KCBsYXllckluZGV4ICsgMSApICogbGF5ZXJCeXRlTGVuZ3RoIC8gbWlwbWFwLmRhdGEuQllURVNfUEVSX0VMRU1FTlRcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0c3RhdGUuY29tcHJlc3NlZFRleFN1YkltYWdlM0QoIF9nbC5URVhUVVJFXzJEX0FSUkFZLCBpLCAwLCAwLCBsYXllckluZGV4LCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIDEsIGdsRm9ybWF0LCBsYXllckRhdGEgKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGV4dHVyZS5jbGVhckxheWVyVXBkYXRlcygpO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHN0YXRlLmNvbXByZXNzZWRUZXhTdWJJbWFnZTNEKCBfZ2wuVEVYVFVSRV8yRF9BUlJBWSwgaSwgMCwgMCwgMCwgbWlwbWFwLndpZHRoLCBtaXBtYXAuaGVpZ2h0LCBpbWFnZS5kZXB0aCwgZ2xGb3JtYXQsIG1pcG1hcC5kYXRhICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0c3RhdGUuY29tcHJlc3NlZFRleEltYWdlM0QoIF9nbC5URVhUVVJFXzJEX0FSUkFZLCBpLCBnbEludGVybmFsRm9ybWF0LCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIGltYWdlLmRlcHRoLCAwLCBtaXBtYXAuZGF0YSwgMCwgMCApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBBdHRlbXB0IHRvIGxvYWQgdW5zdXBwb3J0ZWQgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdCBpbiAudXBsb2FkVGV4dHVyZSgpJyApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoIHVzZVRleFN0b3JhZ2UgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBkYXRhUmVhZHkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRzdGF0ZS50ZXhTdWJJbWFnZTNEKCBfZ2wuVEVYVFVSRV8yRF9BUlJBWSwgaSwgMCwgMCwgMCwgbWlwbWFwLndpZHRoLCBtaXBtYXAuaGVpZ2h0LCBpbWFnZS5kZXB0aCwgZ2xGb3JtYXQsIGdsVHlwZSwgbWlwbWFwLmRhdGEgKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0c3RhdGUudGV4SW1hZ2UzRCggX2dsLlRFWFRVUkVfMkRfQVJSQVksIGksIGdsSW50ZXJuYWxGb3JtYXQsIG1pcG1hcC53aWR0aCwgbWlwbWFwLmhlaWdodCwgaW1hZ2UuZGVwdGgsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIG1pcG1hcC5kYXRhICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCB1c2VUZXhTdG9yYWdlICYmIGFsbG9jYXRlTWVtb3J5ICkge1xyXG5cclxuXHRcdFx0XHRcdFx0c3RhdGUudGV4U3RvcmFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgbGV2ZWxzLCBnbEludGVybmFsRm9ybWF0LCBtaXBtYXBzWyAwIF0ud2lkdGgsIG1pcG1hcHNbIDAgXS5oZWlnaHQgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IG1pcG1hcHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRtaXBtYXAgPSBtaXBtYXBzWyBpIF07XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIHRleHR1cmUuZm9ybWF0ICE9PSBSR0JBRm9ybWF0ICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoIGdsRm9ybWF0ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGlmICggdXNlVGV4U3RvcmFnZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmICggZGF0YVJlYWR5ICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRzdGF0ZS5jb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIGksIDAsIDAsIG1pcG1hcC53aWR0aCwgbWlwbWFwLmhlaWdodCwgZ2xGb3JtYXQsIG1pcG1hcC5kYXRhICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdHN0YXRlLmNvbXByZXNzZWRUZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgaSwgZ2xJbnRlcm5hbEZvcm1hdCwgbWlwbWFwLndpZHRoLCBtaXBtYXAuaGVpZ2h0LCAwLCBtaXBtYXAuZGF0YSApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBBdHRlbXB0IHRvIGxvYWQgdW5zdXBwb3J0ZWQgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdCBpbiAudXBsb2FkVGV4dHVyZSgpJyApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoIHVzZVRleFN0b3JhZ2UgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBkYXRhUmVhZHkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRzdGF0ZS50ZXhTdWJJbWFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgaSwgMCwgMCwgbWlwbWFwLndpZHRoLCBtaXBtYXAuaGVpZ2h0LCBnbEZvcm1hdCwgZ2xUeXBlLCBtaXBtYXAuZGF0YSApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgaSwgZ2xJbnRlcm5hbEZvcm1hdCwgbWlwbWFwLndpZHRoLCBtaXBtYXAuaGVpZ2h0LCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBtaXBtYXAuZGF0YSApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCB0ZXh0dXJlLmlzRGF0YUFycmF5VGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0aWYgKCB1c2VUZXhTdG9yYWdlICkge1xyXG5cclxuXHRcdFx0XHRcdGlmICggYWxsb2NhdGVNZW1vcnkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRzdGF0ZS50ZXhTdG9yYWdlM0QoIF9nbC5URVhUVVJFXzJEX0FSUkFZLCBsZXZlbHMsIGdsSW50ZXJuYWxGb3JtYXQsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQsIGltYWdlLmRlcHRoICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGlmICggZGF0YVJlYWR5ICkge1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCB0ZXh0dXJlLmxheWVyVXBkYXRlcy5zaXplID4gMCApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgbGF5ZXJCeXRlTGVuZ3RoID0gZ2V0Qnl0ZUxlbmd0aCggaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCwgdGV4dHVyZS5mb3JtYXQsIHRleHR1cmUudHlwZSApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRmb3IgKCBjb25zdCBsYXllckluZGV4IG9mIHRleHR1cmUubGF5ZXJVcGRhdGVzICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGxheWVyRGF0YSA9IGltYWdlLmRhdGEuc3ViYXJyYXkoXHJcblx0XHRcdFx0XHRcdFx0XHRcdGxheWVySW5kZXggKiBsYXllckJ5dGVMZW5ndGggLyBpbWFnZS5kYXRhLkJZVEVTX1BFUl9FTEVNRU5ULFxyXG5cdFx0XHRcdFx0XHRcdFx0XHQoIGxheWVySW5kZXggKyAxICkgKiBsYXllckJ5dGVMZW5ndGggLyBpbWFnZS5kYXRhLkJZVEVTX1BFUl9FTEVNRU5UXHJcblx0XHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdFx0c3RhdGUudGV4U3ViSW1hZ2UzRCggX2dsLlRFWFRVUkVfMkRfQVJSQVksIDAsIDAsIDAsIGxheWVySW5kZXgsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQsIDEsIGdsRm9ybWF0LCBnbFR5cGUsIGxheWVyRGF0YSApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdHRleHR1cmUuY2xlYXJMYXllclVwZGF0ZXMoKTtcclxuXHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdHN0YXRlLnRleFN1YkltYWdlM0QoIF9nbC5URVhUVVJFXzJEX0FSUkFZLCAwLCAwLCAwLCAwLCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0LCBpbWFnZS5kZXB0aCwgZ2xGb3JtYXQsIGdsVHlwZSwgaW1hZ2UuZGF0YSApO1xyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRzdGF0ZS50ZXhJbWFnZTNEKCBfZ2wuVEVYVFVSRV8yRF9BUlJBWSwgMCwgZ2xJbnRlcm5hbEZvcm1hdCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCwgaW1hZ2UuZGVwdGgsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIGltYWdlLmRhdGEgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggdGV4dHVyZS5pc0RhdGEzRFRleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggdXNlVGV4U3RvcmFnZSApIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGFsbG9jYXRlTWVtb3J5ICkge1xyXG5cclxuXHRcdFx0XHRcdFx0c3RhdGUudGV4U3RvcmFnZTNEKCBfZ2wuVEVYVFVSRV8zRCwgbGV2ZWxzLCBnbEludGVybmFsRm9ybWF0LCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0LCBpbWFnZS5kZXB0aCApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRpZiAoIGRhdGFSZWFkeSApIHtcclxuXHJcblx0XHRcdFx0XHRcdHN0YXRlLnRleFN1YkltYWdlM0QoIF9nbC5URVhUVVJFXzNELCAwLCAwLCAwLCAwLCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0LCBpbWFnZS5kZXB0aCwgZ2xGb3JtYXQsIGdsVHlwZSwgaW1hZ2UuZGF0YSApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRzdGF0ZS50ZXhJbWFnZTNEKCBfZ2wuVEVYVFVSRV8zRCwgMCwgZ2xJbnRlcm5hbEZvcm1hdCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCwgaW1hZ2UuZGVwdGgsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIGltYWdlLmRhdGEgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggdGV4dHVyZS5pc0ZyYW1lYnVmZmVyVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBhbGxvY2F0ZU1lbW9yeSApIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIHVzZVRleFN0b3JhZ2UgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRzdGF0ZS50ZXhTdG9yYWdlMkQoIF9nbC5URVhUVVJFXzJELCBsZXZlbHMsIGdsSW50ZXJuYWxGb3JtYXQsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQgKTtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0bGV0IHdpZHRoID0gaW1hZ2Uud2lkdGgsIGhlaWdodCA9IGltYWdlLmhlaWdodDtcclxuXHJcblx0XHRcdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGxldmVsczsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0c3RhdGUudGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIGksIGdsSW50ZXJuYWxGb3JtYXQsIHdpZHRoLCBoZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIG51bGwgKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0d2lkdGggPj49IDE7XHJcblx0XHRcdFx0XHRcdFx0aGVpZ2h0ID4+PSAxO1xyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0Ly8gcmVndWxhciBUZXh0dXJlIChpbWFnZSwgdmlkZW8sIGNhbnZhcylcclxuXHJcblx0XHRcdFx0Ly8gdXNlIG1hbnVhbGx5IGNyZWF0ZWQgbWlwbWFwcyBpZiBhdmFpbGFibGVcclxuXHRcdFx0XHQvLyBpZiB0aGVyZSBhcmUgbm8gbWFudWFsIG1pcG1hcHNcclxuXHRcdFx0XHQvLyBzZXQgMCBsZXZlbCBtaXBtYXAgYW5kIHRoZW4gdXNlIEdMIHRvIGdlbmVyYXRlIG90aGVyIG1pcG1hcCBsZXZlbHNcclxuXHJcblx0XHRcdFx0aWYgKCBtaXBtYXBzLmxlbmd0aCA+IDAgKSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCB1c2VUZXhTdG9yYWdlICYmIGFsbG9jYXRlTWVtb3J5ICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgZGltZW5zaW9ucyA9IGdldERpbWVuc2lvbnMoIG1pcG1hcHNbIDAgXSApO1xyXG5cclxuXHRcdFx0XHRcdFx0c3RhdGUudGV4U3RvcmFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgbGV2ZWxzLCBnbEludGVybmFsRm9ybWF0LCBkaW1lbnNpb25zLndpZHRoLCBkaW1lbnNpb25zLmhlaWdodCApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gbWlwbWFwcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRcdG1pcG1hcCA9IG1pcG1hcHNbIGkgXTtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggdXNlVGV4U3RvcmFnZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKCBkYXRhUmVhZHkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0c3RhdGUudGV4U3ViSW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIGksIDAsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIG1pcG1hcCApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgaSwgZ2xJbnRlcm5hbEZvcm1hdCwgZ2xGb3JtYXQsIGdsVHlwZSwgbWlwbWFwICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCB1c2VUZXhTdG9yYWdlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCBhbGxvY2F0ZU1lbW9yeSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgZGltZW5zaW9ucyA9IGdldERpbWVuc2lvbnMoIGltYWdlICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdHN0YXRlLnRleFN0b3JhZ2UyRCggX2dsLlRFWFRVUkVfMkQsIGxldmVscywgZ2xJbnRlcm5hbEZvcm1hdCwgZGltZW5zaW9ucy53aWR0aCwgZGltZW5zaW9ucy5oZWlnaHQgKTtcclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdGlmICggZGF0YVJlYWR5ICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRzdGF0ZS50ZXhTdWJJbWFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgMCwgMCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgaW1hZ2UgKTtcclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0c3RhdGUudGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIDAsIGdsSW50ZXJuYWxGb3JtYXQsIGdsRm9ybWF0LCBnbFR5cGUsIGltYWdlICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHRleHR1cmVOZWVkc0dlbmVyYXRlTWlwbWFwcyggdGV4dHVyZSApICkge1xyXG5cclxuXHRcdFx0XHRnZW5lcmF0ZU1pcG1hcCggdGV4dHVyZVR5cGUgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHNvdXJjZVByb3BlcnRpZXMuX192ZXJzaW9uID0gc291cmNlLnZlcnNpb247XHJcblxyXG5cdFx0XHRpZiAoIHRleHR1cmUub25VcGRhdGUgKSB0ZXh0dXJlLm9uVXBkYXRlKCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fdmVyc2lvbiA9IHRleHR1cmUudmVyc2lvbjtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiB1cGxvYWRDdWJlVGV4dHVyZSggdGV4dHVyZVByb3BlcnRpZXMsIHRleHR1cmUsIHNsb3QgKSB7XHJcblxyXG5cdFx0aWYgKCB0ZXh0dXJlLmltYWdlLmxlbmd0aCAhPT0gNiApIHJldHVybjtcclxuXHJcblx0XHRjb25zdCBmb3JjZVVwbG9hZCA9IGluaXRUZXh0dXJlKCB0ZXh0dXJlUHJvcGVydGllcywgdGV4dHVyZSApO1xyXG5cdFx0Y29uc3Qgc291cmNlID0gdGV4dHVyZS5zb3VyY2U7XHJcblxyXG5cdFx0c3RhdGUuYmluZFRleHR1cmUoIF9nbC5URVhUVVJFX0NVQkVfTUFQLCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSwgX2dsLlRFWFRVUkUwICsgc2xvdCApO1xyXG5cclxuXHRcdGNvbnN0IHNvdXJjZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggc291cmNlICk7XHJcblxyXG5cdFx0aWYgKCBzb3VyY2UudmVyc2lvbiAhPT0gc291cmNlUHJvcGVydGllcy5fX3ZlcnNpb24gfHwgZm9yY2VVcGxvYWQgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRzdGF0ZS5hY3RpdmVUZXh0dXJlKCBfZ2wuVEVYVFVSRTAgKyBzbG90ICk7XHJcblxyXG5cdFx0XHRjb25zdCB3b3JraW5nUHJpbWFyaWVzID0gQ29sb3JNYW5hZ2VtZW50LmdldFByaW1hcmllcyggQ29sb3JNYW5hZ2VtZW50LndvcmtpbmdDb2xvclNwYWNlICk7XHJcblx0XHRcdGNvbnN0IHRleHR1cmVQcmltYXJpZXMgPSB0ZXh0dXJlLmNvbG9yU3BhY2UgPT09IE5vQ29sb3JTcGFjZSA/IG51bGwgOiBDb2xvck1hbmFnZW1lbnQuZ2V0UHJpbWFyaWVzKCB0ZXh0dXJlLmNvbG9yU3BhY2UgKTtcclxuXHRcdFx0Y29uc3QgdW5wYWNrQ29udmVyc2lvbiA9IHRleHR1cmUuY29sb3JTcGFjZSA9PT0gTm9Db2xvclNwYWNlIHx8IHdvcmtpbmdQcmltYXJpZXMgPT09IHRleHR1cmVQcmltYXJpZXMgPyBfZ2wuTk9ORSA6IF9nbC5CUk9XU0VSX0RFRkFVTFRfV0VCR0w7XHJcblxyXG5cdFx0XHRfZ2wucGl4ZWxTdG9yZWkoIF9nbC5VTlBBQ0tfRkxJUF9ZX1dFQkdMLCB0ZXh0dXJlLmZsaXBZICk7XHJcblx0XHRcdF9nbC5waXhlbFN0b3JlaSggX2dsLlVOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTCwgdGV4dHVyZS5wcmVtdWx0aXBseUFscGhhICk7XHJcblx0XHRcdF9nbC5waXhlbFN0b3JlaSggX2dsLlVOUEFDS19BTElHTk1FTlQsIHRleHR1cmUudW5wYWNrQWxpZ25tZW50ICk7XHJcblx0XHRcdF9nbC5waXhlbFN0b3JlaSggX2dsLlVOUEFDS19DT0xPUlNQQUNFX0NPTlZFUlNJT05fV0VCR0wsIHVucGFja0NvbnZlcnNpb24gKTtcclxuXHJcblx0XHRcdGNvbnN0IGlzQ29tcHJlc3NlZCA9ICggdGV4dHVyZS5pc0NvbXByZXNzZWRUZXh0dXJlIHx8IHRleHR1cmUuaW1hZ2VbIDAgXS5pc0NvbXByZXNzZWRUZXh0dXJlICk7XHJcblx0XHRcdGNvbnN0IGlzRGF0YVRleHR1cmUgPSAoIHRleHR1cmUuaW1hZ2VbIDAgXSAmJiB0ZXh0dXJlLmltYWdlWyAwIF0uaXNEYXRhVGV4dHVyZSApO1xyXG5cclxuXHRcdFx0Y29uc3QgY3ViZUltYWdlID0gW107XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCA2OyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRpZiAoICEgaXNDb21wcmVzc2VkICYmICEgaXNEYXRhVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0XHRjdWJlSW1hZ2VbIGkgXSA9IHJlc2l6ZUltYWdlKCB0ZXh0dXJlLmltYWdlWyBpIF0sIHRydWUsIGNhcGFiaWxpdGllcy5tYXhDdWJlbWFwU2l6ZSApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdGN1YmVJbWFnZVsgaSBdID0gaXNEYXRhVGV4dHVyZSA/IHRleHR1cmUuaW1hZ2VbIGkgXS5pbWFnZSA6IHRleHR1cmUuaW1hZ2VbIGkgXTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRjdWJlSW1hZ2VbIGkgXSA9IHZlcmlmeUNvbG9yU3BhY2UoIHRleHR1cmUsIGN1YmVJbWFnZVsgaSBdICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBpbWFnZSA9IGN1YmVJbWFnZVsgMCBdLFxyXG5cdFx0XHRcdGdsRm9ybWF0ID0gdXRpbHMuY29udmVydCggdGV4dHVyZS5mb3JtYXQsIHRleHR1cmUuY29sb3JTcGFjZSApLFxyXG5cdFx0XHRcdGdsVHlwZSA9IHV0aWxzLmNvbnZlcnQoIHRleHR1cmUudHlwZSApLFxyXG5cdFx0XHRcdGdsSW50ZXJuYWxGb3JtYXQgPSBnZXRJbnRlcm5hbEZvcm1hdCggdGV4dHVyZS5pbnRlcm5hbEZvcm1hdCwgZ2xGb3JtYXQsIGdsVHlwZSwgdGV4dHVyZS5jb2xvclNwYWNlICk7XHJcblxyXG5cdFx0XHRjb25zdCB1c2VUZXhTdG9yYWdlID0gKCB0ZXh0dXJlLmlzVmlkZW9UZXh0dXJlICE9PSB0cnVlICk7XHJcblx0XHRcdGNvbnN0IGFsbG9jYXRlTWVtb3J5ID0gKCBzb3VyY2VQcm9wZXJ0aWVzLl9fdmVyc2lvbiA9PT0gdW5kZWZpbmVkICkgfHwgKCBmb3JjZVVwbG9hZCA9PT0gdHJ1ZSApO1xyXG5cdFx0XHRjb25zdCBkYXRhUmVhZHkgPSBzb3VyY2UuZGF0YVJlYWR5O1xyXG5cdFx0XHRsZXQgbGV2ZWxzID0gZ2V0TWlwTGV2ZWxzKCB0ZXh0dXJlLCBpbWFnZSApO1xyXG5cclxuXHRcdFx0c2V0VGV4dHVyZVBhcmFtZXRlcnMoIF9nbC5URVhUVVJFX0NVQkVfTUFQLCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0XHRsZXQgbWlwbWFwcztcclxuXHJcblx0XHRcdGlmICggaXNDb21wcmVzc2VkICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIHVzZVRleFN0b3JhZ2UgJiYgYWxsb2NhdGVNZW1vcnkgKSB7XHJcblxyXG5cdFx0XHRcdFx0c3RhdGUudGV4U3RvcmFnZTJEKCBfZ2wuVEVYVFVSRV9DVUJFX01BUCwgbGV2ZWxzLCBnbEludGVybmFsRm9ybWF0LCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0ICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgNjsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRtaXBtYXBzID0gY3ViZUltYWdlWyBpIF0ubWlwbWFwcztcclxuXHJcblx0XHRcdFx0XHRmb3IgKCBsZXQgaiA9IDA7IGogPCBtaXBtYXBzLmxlbmd0aDsgaiArKyApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnN0IG1pcG1hcCA9IG1pcG1hcHNbIGogXTtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggdGV4dHVyZS5mb3JtYXQgIT09IFJHQkFGb3JtYXQgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmICggZ2xGb3JtYXQgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCB1c2VUZXhTdG9yYWdlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBkYXRhUmVhZHkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHN0YXRlLmNvbXByZXNzZWRUZXhTdWJJbWFnZTJEKCBfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaSwgaiwgMCwgMCwgbWlwbWFwLndpZHRoLCBtaXBtYXAuaGVpZ2h0LCBnbEZvcm1hdCwgbWlwbWFwLmRhdGEgKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0c3RhdGUuY29tcHJlc3NlZFRleEltYWdlMkQoIF9nbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBpLCBqLCBnbEludGVybmFsRm9ybWF0LCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIDAsIG1pcG1hcC5kYXRhICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IEF0dGVtcHQgdG8gbG9hZCB1bnN1cHBvcnRlZCBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0IGluIC5zZXRUZXh0dXJlQ3ViZSgpJyApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoIHVzZVRleFN0b3JhZ2UgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBkYXRhUmVhZHkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRzdGF0ZS50ZXhTdWJJbWFnZTJEKCBfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaSwgaiwgMCwgMCwgbWlwbWFwLndpZHRoLCBtaXBtYXAuaGVpZ2h0LCBnbEZvcm1hdCwgZ2xUeXBlLCBtaXBtYXAuZGF0YSApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaSwgaiwgZ2xJbnRlcm5hbEZvcm1hdCwgbWlwbWFwLndpZHRoLCBtaXBtYXAuaGVpZ2h0LCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBtaXBtYXAuZGF0YSApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRtaXBtYXBzID0gdGV4dHVyZS5taXBtYXBzO1xyXG5cclxuXHRcdFx0XHRpZiAoIHVzZVRleFN0b3JhZ2UgJiYgYWxsb2NhdGVNZW1vcnkgKSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gVE9ETzogVW5pZm9ybWx5IGhhbmRsZSBtaXBtYXAgZGVmaW5pdGlvbnNcclxuXHRcdFx0XHRcdC8vIE5vcm1hbCB0ZXh0dXJlcyBhbmQgY29tcHJlc3NlZCBjdWJlIHRleHR1cmVzIGRlZmluZSBiYXNlIGxldmVsICsgbWlwcyB3aXRoIHRoZWlyIG1pcG1hcCBhcnJheVxyXG5cdFx0XHRcdFx0Ly8gVW5jb21wcmVzc2VkIGN1YmUgdGV4dHVyZXMgdXNlIHRoZWlyIG1pcG1hcCBhcnJheSBvbmx5IGZvciBtaXBzIChubyBiYXNlIGxldmVsKVxyXG5cclxuXHRcdFx0XHRcdGlmICggbWlwbWFwcy5sZW5ndGggPiAwICkgbGV2ZWxzICsrO1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGRpbWVuc2lvbnMgPSBnZXREaW1lbnNpb25zKCBjdWJlSW1hZ2VbIDAgXSApO1xyXG5cclxuXHRcdFx0XHRcdHN0YXRlLnRleFN0b3JhZ2UyRCggX2dsLlRFWFRVUkVfQ1VCRV9NQVAsIGxldmVscywgZ2xJbnRlcm5hbEZvcm1hdCwgZGltZW5zaW9ucy53aWR0aCwgZGltZW5zaW9ucy5oZWlnaHQgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCA2OyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdGlmICggaXNEYXRhVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggdXNlVGV4U3RvcmFnZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKCBkYXRhUmVhZHkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0c3RhdGUudGV4U3ViSW1hZ2UyRCggX2dsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCArIGksIDAsIDAsIDAsIGN1YmVJbWFnZVsgaSBdLndpZHRoLCBjdWJlSW1hZ2VbIGkgXS5oZWlnaHQsIGdsRm9ybWF0LCBnbFR5cGUsIGN1YmVJbWFnZVsgaSBdLmRhdGEgKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0c3RhdGUudGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCArIGksIDAsIGdsSW50ZXJuYWxGb3JtYXQsIGN1YmVJbWFnZVsgaSBdLndpZHRoLCBjdWJlSW1hZ2VbIGkgXS5oZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIGN1YmVJbWFnZVsgaSBdLmRhdGEgKTtcclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdGZvciAoIGxldCBqID0gMDsgaiA8IG1pcG1hcHMubGVuZ3RoOyBqICsrICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRjb25zdCBtaXBtYXAgPSBtaXBtYXBzWyBqIF07XHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgbWlwbWFwSW1hZ2UgPSBtaXBtYXAuaW1hZ2VbIGkgXS5pbWFnZTtcclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKCB1c2VUZXhTdG9yYWdlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGlmICggZGF0YVJlYWR5ICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0c3RhdGUudGV4U3ViSW1hZ2UyRCggX2dsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCArIGksIGogKyAxLCAwLCAwLCBtaXBtYXBJbWFnZS53aWR0aCwgbWlwbWFwSW1hZ2UuaGVpZ2h0LCBnbEZvcm1hdCwgZ2xUeXBlLCBtaXBtYXBJbWFnZS5kYXRhICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBpLCBqICsgMSwgZ2xJbnRlcm5hbEZvcm1hdCwgbWlwbWFwSW1hZ2Uud2lkdGgsIG1pcG1hcEltYWdlLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgbWlwbWFwSW1hZ2UuZGF0YSApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggdXNlVGV4U3RvcmFnZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKCBkYXRhUmVhZHkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0c3RhdGUudGV4U3ViSW1hZ2UyRCggX2dsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCArIGksIDAsIDAsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIGN1YmVJbWFnZVsgaSBdICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBpLCAwLCBnbEludGVybmFsRm9ybWF0LCBnbEZvcm1hdCwgZ2xUeXBlLCBjdWJlSW1hZ2VbIGkgXSApO1xyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0Zm9yICggbGV0IGogPSAwOyBqIDwgbWlwbWFwcy5sZW5ndGg7IGogKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IG1pcG1hcCA9IG1pcG1hcHNbIGogXTtcclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKCB1c2VUZXhTdG9yYWdlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGlmICggZGF0YVJlYWR5ICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0c3RhdGUudGV4U3ViSW1hZ2UyRCggX2dsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCArIGksIGogKyAxLCAwLCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBtaXBtYXAuaW1hZ2VbIGkgXSApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaSwgaiArIDEsIGdsSW50ZXJuYWxGb3JtYXQsIGdsRm9ybWF0LCBnbFR5cGUsIG1pcG1hcC5pbWFnZVsgaSBdICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggdGV4dHVyZU5lZWRzR2VuZXJhdGVNaXBtYXBzKCB0ZXh0dXJlICkgKSB7XHJcblxyXG5cdFx0XHRcdC8vIFdlIGFzc3VtZSBpbWFnZXMgZm9yIGN1YmUgbWFwIGhhdmUgdGhlIHNhbWUgc2l6ZS5cclxuXHRcdFx0XHRnZW5lcmF0ZU1pcG1hcCggX2dsLlRFWFRVUkVfQ1VCRV9NQVAgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHNvdXJjZVByb3BlcnRpZXMuX192ZXJzaW9uID0gc291cmNlLnZlcnNpb247XHJcblxyXG5cdFx0XHRpZiAoIHRleHR1cmUub25VcGRhdGUgKSB0ZXh0dXJlLm9uVXBkYXRlKCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fdmVyc2lvbiA9IHRleHR1cmUudmVyc2lvbjtcclxuXHJcblx0fVxyXG5cclxuXHQvLyBSZW5kZXIgdGFyZ2V0c1xyXG5cclxuXHQvLyBTZXR1cCBzdG9yYWdlIGZvciB0YXJnZXQgdGV4dHVyZSBhbmQgYmluZCBpdCB0byBjb3JyZWN0IGZyYW1lYnVmZmVyXHJcblx0ZnVuY3Rpb24gc2V0dXBGcmFtZUJ1ZmZlclRleHR1cmUoIGZyYW1lYnVmZmVyLCByZW5kZXJUYXJnZXQsIHRleHR1cmUsIGF0dGFjaG1lbnQsIHRleHR1cmVUYXJnZXQsIGxldmVsICkge1xyXG5cclxuXHRcdGNvbnN0IGdsRm9ybWF0ID0gdXRpbHMuY29udmVydCggdGV4dHVyZS5mb3JtYXQsIHRleHR1cmUuY29sb3JTcGFjZSApO1xyXG5cdFx0Y29uc3QgZ2xUeXBlID0gdXRpbHMuY29udmVydCggdGV4dHVyZS50eXBlICk7XHJcblx0XHRjb25zdCBnbEludGVybmFsRm9ybWF0ID0gZ2V0SW50ZXJuYWxGb3JtYXQoIHRleHR1cmUuaW50ZXJuYWxGb3JtYXQsIGdsRm9ybWF0LCBnbFR5cGUsIHRleHR1cmUuY29sb3JTcGFjZSApO1xyXG5cdFx0Y29uc3QgcmVuZGVyVGFyZ2V0UHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQgKTtcclxuXHRcdGNvbnN0IHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKTtcclxuXHJcblx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX3JlbmRlclRhcmdldCA9IHJlbmRlclRhcmdldDtcclxuXHJcblx0XHRpZiAoICEgcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX2hhc0V4dGVybmFsVGV4dHVyZXMgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB3aWR0aCA9IE1hdGgubWF4KCAxLCByZW5kZXJUYXJnZXQud2lkdGggPj4gbGV2ZWwgKTtcclxuXHRcdFx0Y29uc3QgaGVpZ2h0ID0gTWF0aC5tYXgoIDEsIHJlbmRlclRhcmdldC5oZWlnaHQgPj4gbGV2ZWwgKTtcclxuXHJcblx0XHRcdGlmICggdGV4dHVyZVRhcmdldCA9PT0gX2dsLlRFWFRVUkVfM0QgfHwgdGV4dHVyZVRhcmdldCA9PT0gX2dsLlRFWFRVUkVfMkRfQVJSQVkgKSB7XHJcblxyXG5cdFx0XHRcdHN0YXRlLnRleEltYWdlM0QoIHRleHR1cmVUYXJnZXQsIGxldmVsLCBnbEludGVybmFsRm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCByZW5kZXJUYXJnZXQuZGVwdGgsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIG51bGwgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIHRleHR1cmVUYXJnZXQsIGxldmVsLCBnbEludGVybmFsRm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBudWxsICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHN0YXRlLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBmcmFtZWJ1ZmZlciApO1xyXG5cclxuXHRcdGlmICggdXNlTXVsdGlzYW1wbGVkUlRUKCByZW5kZXJUYXJnZXQgKSApIHtcclxuXHJcblx0XHRcdG11bHRpc2FtcGxlZFJUVEV4dC5mcmFtZWJ1ZmZlclRleHR1cmUyRE11bHRpc2FtcGxlRVhUKCBfZ2wuRlJBTUVCVUZGRVIsIGF0dGFjaG1lbnQsIHRleHR1cmVUYXJnZXQsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlLCAwLCBnZXRSZW5kZXJUYXJnZXRTYW1wbGVzKCByZW5kZXJUYXJnZXQgKSApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHRleHR1cmVUYXJnZXQgPT09IF9nbC5URVhUVVJFXzJEIHx8ICggdGV4dHVyZVRhcmdldCA+PSBfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICYmIHRleHR1cmVUYXJnZXQgPD0gX2dsLlRFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWiApICkgeyAvLyBzZWUgIzI0NzUzXHJcblxyXG5cdFx0XHRfZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoIF9nbC5GUkFNRUJVRkZFUiwgYXR0YWNobWVudCwgdGV4dHVyZVRhcmdldCwgdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUsIGxldmVsICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHN0YXRlLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBudWxsICk7XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gU2V0dXAgc3RvcmFnZSBmb3IgaW50ZXJuYWwgZGVwdGgvc3RlbmNpbCBidWZmZXJzIGFuZCBiaW5kIHRvIGNvcnJlY3QgZnJhbWVidWZmZXJcclxuXHRmdW5jdGlvbiBzZXR1cFJlbmRlckJ1ZmZlclN0b3JhZ2UoIHJlbmRlcmJ1ZmZlciwgcmVuZGVyVGFyZ2V0LCBpc011bHRpc2FtcGxlICkge1xyXG5cclxuXHRcdF9nbC5iaW5kUmVuZGVyYnVmZmVyKCBfZ2wuUkVOREVSQlVGRkVSLCByZW5kZXJidWZmZXIgKTtcclxuXHJcblx0XHRpZiAoIHJlbmRlclRhcmdldC5kZXB0aEJ1ZmZlciApIHtcclxuXHJcblx0XHRcdC8vIHJldHJpZXZlIHRoZSBkZXB0aCBhdHRhY2htZW50IHR5cGVzXHJcblx0XHRcdGNvbnN0IGRlcHRoVGV4dHVyZSA9IHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmU7XHJcblx0XHRcdGNvbnN0IGRlcHRoVHlwZSA9IGRlcHRoVGV4dHVyZSAmJiBkZXB0aFRleHR1cmUuaXNEZXB0aFRleHR1cmUgPyBkZXB0aFRleHR1cmUudHlwZSA6IG51bGw7XHJcblx0XHRcdGNvbnN0IGdsSW50ZXJuYWxGb3JtYXQgPSBnZXRJbnRlcm5hbERlcHRoRm9ybWF0KCByZW5kZXJUYXJnZXQuc3RlbmNpbEJ1ZmZlciwgZGVwdGhUeXBlICk7XHJcblx0XHRcdGNvbnN0IGdsQXR0YWNobWVudFR5cGUgPSByZW5kZXJUYXJnZXQuc3RlbmNpbEJ1ZmZlciA/IF9nbC5ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQgOiBfZ2wuREVQVEhfQVRUQUNITUVOVDtcclxuXHJcblx0XHRcdC8vIHNldCB1cCB0aGUgYXR0YWNobWVudFxyXG5cdFx0XHRjb25zdCBzYW1wbGVzID0gZ2V0UmVuZGVyVGFyZ2V0U2FtcGxlcyggcmVuZGVyVGFyZ2V0ICk7XHJcblx0XHRcdGNvbnN0IGlzVXNlTXVsdGlzYW1wbGVkUlRUID0gdXNlTXVsdGlzYW1wbGVkUlRUKCByZW5kZXJUYXJnZXQgKTtcclxuXHRcdFx0aWYgKCBpc1VzZU11bHRpc2FtcGxlZFJUVCApIHtcclxuXHJcblx0XHRcdFx0bXVsdGlzYW1wbGVkUlRURXh0LnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUVYVCggX2dsLlJFTkRFUkJVRkZFUiwgc2FtcGxlcywgZ2xJbnRlcm5hbEZvcm1hdCwgcmVuZGVyVGFyZ2V0LndpZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0ICk7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBpc011bHRpc2FtcGxlICkge1xyXG5cclxuXHRcdFx0XHRfZ2wucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKCBfZ2wuUkVOREVSQlVGRkVSLCBzYW1wbGVzLCBnbEludGVybmFsRm9ybWF0LCByZW5kZXJUYXJnZXQud2lkdGgsIHJlbmRlclRhcmdldC5oZWlnaHQgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdF9nbC5yZW5kZXJidWZmZXJTdG9yYWdlKCBfZ2wuUkVOREVSQlVGRkVSLCBnbEludGVybmFsRm9ybWF0LCByZW5kZXJUYXJnZXQud2lkdGgsIHJlbmRlclRhcmdldC5oZWlnaHQgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdF9nbC5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBnbEF0dGFjaG1lbnRUeXBlLCBfZ2wuUkVOREVSQlVGRkVSLCByZW5kZXJidWZmZXIgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc3QgdGV4dHVyZXMgPSByZW5kZXJUYXJnZXQudGV4dHVyZXM7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB0ZXh0dXJlcy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHRleHR1cmUgPSB0ZXh0dXJlc1sgaSBdO1xyXG5cclxuXHRcdFx0XHRjb25zdCBnbEZvcm1hdCA9IHV0aWxzLmNvbnZlcnQoIHRleHR1cmUuZm9ybWF0LCB0ZXh0dXJlLmNvbG9yU3BhY2UgKTtcclxuXHRcdFx0XHRjb25zdCBnbFR5cGUgPSB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLnR5cGUgKTtcclxuXHRcdFx0XHRjb25zdCBnbEludGVybmFsRm9ybWF0ID0gZ2V0SW50ZXJuYWxGb3JtYXQoIHRleHR1cmUuaW50ZXJuYWxGb3JtYXQsIGdsRm9ybWF0LCBnbFR5cGUsIHRleHR1cmUuY29sb3JTcGFjZSApO1xyXG5cdFx0XHRcdGNvbnN0IHNhbXBsZXMgPSBnZXRSZW5kZXJUYXJnZXRTYW1wbGVzKCByZW5kZXJUYXJnZXQgKTtcclxuXHJcblx0XHRcdFx0aWYgKCBpc011bHRpc2FtcGxlICYmIHVzZU11bHRpc2FtcGxlZFJUVCggcmVuZGVyVGFyZ2V0ICkgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0XHRcdF9nbC5yZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGUoIF9nbC5SRU5ERVJCVUZGRVIsIHNhbXBsZXMsIGdsSW50ZXJuYWxGb3JtYXQsIHJlbmRlclRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCB1c2VNdWx0aXNhbXBsZWRSVFQoIHJlbmRlclRhcmdldCApICkge1xyXG5cclxuXHRcdFx0XHRcdG11bHRpc2FtcGxlZFJUVEV4dC5yZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVFWFQoIF9nbC5SRU5ERVJCVUZGRVIsIHNhbXBsZXMsIGdsSW50ZXJuYWxGb3JtYXQsIHJlbmRlclRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdF9nbC5yZW5kZXJidWZmZXJTdG9yYWdlKCBfZ2wuUkVOREVSQlVGRkVSLCBnbEludGVybmFsRm9ybWF0LCByZW5kZXJUYXJnZXQud2lkdGgsIHJlbmRlclRhcmdldC5oZWlnaHQgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRfZ2wuYmluZFJlbmRlcmJ1ZmZlciggX2dsLlJFTkRFUkJVRkZFUiwgbnVsbCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vIFNldHVwIHJlc291cmNlcyBmb3IgYSBEZXB0aCBUZXh0dXJlIGZvciBhIEZCTyAobmVlZHMgYW4gZXh0ZW5zaW9uKVxyXG5cdGZ1bmN0aW9uIHNldHVwRGVwdGhUZXh0dXJlKCBmcmFtZWJ1ZmZlciwgcmVuZGVyVGFyZ2V0ICkge1xyXG5cclxuXHRcdGNvbnN0IGlzQ3ViZSA9ICggcmVuZGVyVGFyZ2V0ICYmIHJlbmRlclRhcmdldC5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldCApO1xyXG5cdFx0aWYgKCBpc0N1YmUgKSB0aHJvdyBuZXcgRXJyb3IoICdEZXB0aCBUZXh0dXJlIHdpdGggY3ViZSByZW5kZXIgdGFyZ2V0cyBpcyBub3Qgc3VwcG9ydGVkJyApO1xyXG5cclxuXHRcdHN0YXRlLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBmcmFtZWJ1ZmZlciApO1xyXG5cclxuXHRcdGlmICggISAoIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUgJiYgcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS5pc0RlcHRoVGV4dHVyZSApICkge1xyXG5cclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAncmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIFRIUkVFLkRlcHRoVGV4dHVyZScgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSApO1xyXG5cdFx0dGV4dHVyZVByb3BlcnRpZXMuX19yZW5kZXJUYXJnZXQgPSByZW5kZXJUYXJnZXQ7XHJcblxyXG5cdFx0Ly8gdXBsb2FkIGFuIGVtcHR5IGRlcHRoIHRleHR1cmUgd2l0aCBmcmFtZWJ1ZmZlciBzaXplXHJcblx0XHRpZiAoICEgdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgfHxcclxuXHRcdFx0XHRyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmltYWdlLndpZHRoICE9PSByZW5kZXJUYXJnZXQud2lkdGggfHxcclxuXHRcdFx0XHRyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmltYWdlLmhlaWdodCAhPT0gcmVuZGVyVGFyZ2V0LmhlaWdodCApIHtcclxuXHJcblx0XHRcdHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuaW1hZ2Uud2lkdGggPSByZW5kZXJUYXJnZXQud2lkdGg7XHJcblx0XHRcdHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuaW1hZ2UuaGVpZ2h0ID0gcmVuZGVyVGFyZ2V0LmhlaWdodDtcclxuXHRcdFx0cmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHNldFRleHR1cmUyRCggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSwgMCApO1xyXG5cclxuXHRcdGNvbnN0IHdlYmdsRGVwdGhUZXh0dXJlID0gdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmU7XHJcblx0XHRjb25zdCBzYW1wbGVzID0gZ2V0UmVuZGVyVGFyZ2V0U2FtcGxlcyggcmVuZGVyVGFyZ2V0ICk7XHJcblxyXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmZvcm1hdCA9PT0gRGVwdGhGb3JtYXQgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHVzZU11bHRpc2FtcGxlZFJUVCggcmVuZGVyVGFyZ2V0ICkgKSB7XHJcblxyXG5cdFx0XHRcdG11bHRpc2FtcGxlZFJUVEV4dC5mcmFtZWJ1ZmZlclRleHR1cmUyRE11bHRpc2FtcGxlRVhUKCBfZ2wuRlJBTUVCVUZGRVIsIF9nbC5ERVBUSF9BVFRBQ0hNRU5ULCBfZ2wuVEVYVFVSRV8yRCwgd2ViZ2xEZXB0aFRleHR1cmUsIDAsIHNhbXBsZXMgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdF9nbC5mcmFtZWJ1ZmZlclRleHR1cmUyRCggX2dsLkZSQU1FQlVGRkVSLCBfZ2wuREVQVEhfQVRUQUNITUVOVCwgX2dsLlRFWFRVUkVfMkQsIHdlYmdsRGVwdGhUZXh0dXJlLCAwICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmICggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS5mb3JtYXQgPT09IERlcHRoU3RlbmNpbEZvcm1hdCApIHtcclxuXHJcblx0XHRcdGlmICggdXNlTXVsdGlzYW1wbGVkUlRUKCByZW5kZXJUYXJnZXQgKSApIHtcclxuXHJcblx0XHRcdFx0bXVsdGlzYW1wbGVkUlRURXh0LmZyYW1lYnVmZmVyVGV4dHVyZTJETXVsdGlzYW1wbGVFWFQoIF9nbC5GUkFNRUJVRkZFUiwgX2dsLkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVCwgX2dsLlRFWFRVUkVfMkQsIHdlYmdsRGVwdGhUZXh0dXJlLCAwLCBzYW1wbGVzICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRfZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoIF9nbC5GUkFNRUJVRkZFUiwgX2dsLkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVCwgX2dsLlRFWFRVUkVfMkQsIHdlYmdsRGVwdGhUZXh0dXJlLCAwICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHRocm93IG5ldyBFcnJvciggJ1Vua25vd24gZGVwdGhUZXh0dXJlIGZvcm1hdCcgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gU2V0dXAgR0wgcmVzb3VyY2VzIGZvciBhIG5vbi10ZXh0dXJlIGRlcHRoIGJ1ZmZlclxyXG5cdGZ1bmN0aW9uIHNldHVwRGVwdGhSZW5kZXJidWZmZXIoIHJlbmRlclRhcmdldCApIHtcclxuXHJcblx0XHRjb25zdCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCApO1xyXG5cdFx0Y29uc3QgaXNDdWJlID0gKCByZW5kZXJUYXJnZXQuaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQgPT09IHRydWUgKTtcclxuXHJcblx0XHQvLyBpZiB0aGUgYm91bmQgZGVwdGggdGV4dHVyZSBoYXMgY2hhbmdlZFxyXG5cdFx0aWYgKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fYm91bmREZXB0aFRleHR1cmUgIT09IHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUgKSB7XHJcblxyXG5cdFx0XHQvLyBmaXJlIHRoZSBkaXNwb3NlIGV2ZW50IHRvIGdldCByaWQgb2Ygc3RvcmVkIHN0YXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJldmlvdXNseSBib3VuZCBkZXB0aCBidWZmZXJcclxuXHRcdFx0Y29uc3QgZGVwdGhUZXh0dXJlID0gcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZTtcclxuXHRcdFx0aWYgKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fZGVwdGhEaXNwb3NlQ2FsbGJhY2sgKSB7XHJcblxyXG5cdFx0XHRcdHJlbmRlclRhcmdldFByb3BlcnRpZXMuX19kZXB0aERpc3Bvc2VDYWxsYmFjaygpO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gc2V0IHVwIGRpc3Bvc2UgbGlzdGVuZXJzIHRvIHRyYWNrIHdoZW4gdGhlIGN1cnJlbnRseSBhdHRhY2hlZCBidWZmZXIgaXMgaW1wbGljaXRseSB1bmJvdW5kXHJcblx0XHRcdGlmICggZGVwdGhUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBkaXNwb3NlRXZlbnQgPSAoKSA9PiB7XHJcblxyXG5cdFx0XHRcdFx0ZGVsZXRlIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX19ib3VuZERlcHRoVGV4dHVyZTtcclxuXHRcdFx0XHRcdGRlbGV0ZSByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fZGVwdGhEaXNwb3NlQ2FsbGJhY2s7XHJcblx0XHRcdFx0XHRkZXB0aFRleHR1cmUucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBkaXNwb3NlRXZlbnQgKTtcclxuXHJcblx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0ZGVwdGhUZXh0dXJlLmFkZEV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgZGlzcG9zZUV2ZW50ICk7XHJcblx0XHRcdFx0cmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX2RlcHRoRGlzcG9zZUNhbGxiYWNrID0gZGlzcG9zZUV2ZW50O1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX2JvdW5kRGVwdGhUZXh0dXJlID0gZGVwdGhUZXh0dXJlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUgJiYgISByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fYXV0b0FsbG9jYXRlRGVwdGhCdWZmZXIgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGlzQ3ViZSApIHRocm93IG5ldyBFcnJvciggJ3RhcmdldC5kZXB0aFRleHR1cmUgbm90IHN1cHBvcnRlZCBpbiBDdWJlIHJlbmRlciB0YXJnZXRzJyApO1xyXG5cclxuXHRcdFx0c2V0dXBEZXB0aFRleHR1cmUoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyLCByZW5kZXJUYXJnZXQgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0aWYgKCBpc0N1YmUgKSB7XHJcblxyXG5cdFx0XHRcdHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyID0gW107XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDY7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0c3RhdGUuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyWyBpIF0gKTtcclxuXHJcblx0XHRcdFx0XHRpZiAoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyWyBpIF0gPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRcdHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyWyBpIF0gPSBfZ2wuY3JlYXRlUmVuZGVyYnVmZmVyKCk7XHJcblx0XHRcdFx0XHRcdHNldHVwUmVuZGVyQnVmZmVyU3RvcmFnZSggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXJbIGkgXSwgcmVuZGVyVGFyZ2V0LCBmYWxzZSApO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBhdHRhY2ggYnVmZmVyIGlmIGl0J3MgYmVlbiBjcmVhdGVkIGFscmVhZHlcclxuXHRcdFx0XHRcdFx0Y29uc3QgZ2xBdHRhY2htZW50VHlwZSA9IHJlbmRlclRhcmdldC5zdGVuY2lsQnVmZmVyID8gX2dsLkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVCA6IF9nbC5ERVBUSF9BVFRBQ0hNRU5UO1xyXG5cdFx0XHRcdFx0XHRjb25zdCByZW5kZXJidWZmZXIgPSByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlclsgaSBdO1xyXG5cdFx0XHRcdFx0XHRfZ2wuYmluZFJlbmRlcmJ1ZmZlciggX2dsLlJFTkRFUkJVRkZFUiwgcmVuZGVyYnVmZmVyICk7XHJcblx0XHRcdFx0XHRcdF9nbC5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBnbEF0dGFjaG1lbnRUeXBlLCBfZ2wuUkVOREVSQlVGRkVSLCByZW5kZXJidWZmZXIgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHN0YXRlLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciApO1xyXG5cclxuXHRcdFx0XHRpZiAoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0cmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXIgPSBfZ2wuY3JlYXRlUmVuZGVyYnVmZmVyKCk7XHJcblx0XHRcdFx0XHRzZXR1cFJlbmRlckJ1ZmZlclN0b3JhZ2UoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyLCByZW5kZXJUYXJnZXQsIGZhbHNlICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gYXR0YWNoIGJ1ZmZlciBpZiBpdCdzIGJlZW4gY3JlYXRlZCBhbHJlYWR5XHJcblx0XHRcdFx0XHRjb25zdCBnbEF0dGFjaG1lbnRUeXBlID0gcmVuZGVyVGFyZ2V0LnN0ZW5jaWxCdWZmZXIgPyBfZ2wuREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UIDogX2dsLkRFUFRIX0FUVEFDSE1FTlQ7XHJcblx0XHRcdFx0XHRjb25zdCByZW5kZXJidWZmZXIgPSByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlcjtcclxuXHRcdFx0XHRcdF9nbC5iaW5kUmVuZGVyYnVmZmVyKCBfZ2wuUkVOREVSQlVGRkVSLCByZW5kZXJidWZmZXIgKTtcclxuXHRcdFx0XHRcdF9nbC5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBnbEF0dGFjaG1lbnRUeXBlLCBfZ2wuUkVOREVSQlVGRkVSLCByZW5kZXJidWZmZXIgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRzdGF0ZS5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgbnVsbCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vIHJlYmluZCBmcmFtZWJ1ZmZlciB3aXRoIGV4dGVybmFsIHRleHR1cmVzXHJcblx0ZnVuY3Rpb24gcmViaW5kVGV4dHVyZXMoIHJlbmRlclRhcmdldCwgY29sb3JUZXh0dXJlLCBkZXB0aFRleHR1cmUgKSB7XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyVGFyZ2V0UHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQgKTtcclxuXHJcblx0XHRpZiAoIGNvbG9yVGV4dHVyZSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0c2V0dXBGcmFtZUJ1ZmZlclRleHR1cmUoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyLCByZW5kZXJUYXJnZXQsIHJlbmRlclRhcmdldC50ZXh0dXJlLCBfZ2wuQ09MT1JfQVRUQUNITUVOVDAsIF9nbC5URVhUVVJFXzJELCAwICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggZGVwdGhUZXh0dXJlICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRzZXR1cERlcHRoUmVuZGVyYnVmZmVyKCByZW5kZXJUYXJnZXQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gU2V0IHVwIEdMIHJlc291cmNlcyBmb3IgdGhlIHJlbmRlciB0YXJnZXRcclxuXHRmdW5jdGlvbiBzZXR1cFJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICkge1xyXG5cclxuXHRcdGNvbnN0IHRleHR1cmUgPSByZW5kZXJUYXJnZXQudGV4dHVyZTtcclxuXHJcblx0XHRjb25zdCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCApO1xyXG5cdFx0Y29uc3QgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggdGV4dHVyZSApO1xyXG5cclxuXHRcdHJlbmRlclRhcmdldC5hZGRFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uUmVuZGVyVGFyZ2V0RGlzcG9zZSApO1xyXG5cclxuXHRcdGNvbnN0IHRleHR1cmVzID0gcmVuZGVyVGFyZ2V0LnRleHR1cmVzO1xyXG5cclxuXHRcdGNvbnN0IGlzQ3ViZSA9ICggcmVuZGVyVGFyZ2V0LmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0ID09PSB0cnVlICk7XHJcblx0XHRjb25zdCBpc011bHRpcGxlUmVuZGVyVGFyZ2V0cyA9ICggdGV4dHVyZXMubGVuZ3RoID4gMSApO1xyXG5cclxuXHRcdGlmICggISBpc011bHRpcGxlUmVuZGVyVGFyZ2V0cyApIHtcclxuXHJcblx0XHRcdGlmICggdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0dGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgPSBfZ2wuY3JlYXRlVGV4dHVyZSgpO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGV4dHVyZVByb3BlcnRpZXMuX192ZXJzaW9uID0gdGV4dHVyZS52ZXJzaW9uO1xyXG5cdFx0XHRpbmZvLm1lbW9yeS50ZXh0dXJlcyArKztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gU2V0dXAgZnJhbWVidWZmZXJcclxuXHJcblx0XHRpZiAoIGlzQ3ViZSApIHtcclxuXHJcblx0XHRcdHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyID0gW107XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCA2OyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIHRleHR1cmUubWlwbWFwcyAmJiB0ZXh0dXJlLm1pcG1hcHMubGVuZ3RoID4gMCApIHtcclxuXHJcblx0XHRcdFx0XHRyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlclsgaSBdID0gW107XHJcblxyXG5cdFx0XHRcdFx0Zm9yICggbGV0IGxldmVsID0gMDsgbGV2ZWwgPCB0ZXh0dXJlLm1pcG1hcHMubGVuZ3RoOyBsZXZlbCArKyApIHtcclxuXHJcblx0XHRcdFx0XHRcdHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyWyBpIF1bIGxldmVsIF0gPSBfZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0cmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXJbIGkgXSA9IF9nbC5jcmVhdGVGcmFtZWJ1ZmZlcigpO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGlmICggdGV4dHVyZS5taXBtYXBzICYmIHRleHR1cmUubWlwbWFwcy5sZW5ndGggPiAwICkge1xyXG5cclxuXHRcdFx0XHRyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciA9IFtdO1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgbGV2ZWwgPSAwOyBsZXZlbCA8IHRleHR1cmUubWlwbWFwcy5sZW5ndGg7IGxldmVsICsrICkge1xyXG5cclxuXHRcdFx0XHRcdHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyWyBsZXZlbCBdID0gX2dsLmNyZWF0ZUZyYW1lYnVmZmVyKCk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyID0gX2dsLmNyZWF0ZUZyYW1lYnVmZmVyKCk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIGlzTXVsdGlwbGVSZW5kZXJUYXJnZXRzICkge1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gdGV4dHVyZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgYXR0YWNobWVudFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggdGV4dHVyZXNbIGkgXSApO1xyXG5cclxuXHRcdFx0XHRcdGlmICggYXR0YWNobWVudFByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRcdGF0dGFjaG1lbnRQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlID0gX2dsLmNyZWF0ZVRleHR1cmUoKTtcclxuXHJcblx0XHRcdFx0XHRcdGluZm8ubWVtb3J5LnRleHR1cmVzICsrO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCAoIHJlbmRlclRhcmdldC5zYW1wbGVzID4gMCApICYmIHVzZU11bHRpc2FtcGxlZFJUVCggcmVuZGVyVGFyZ2V0ICkgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0XHRyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlciA9IF9nbC5jcmVhdGVGcmFtZWJ1ZmZlcigpO1xyXG5cdFx0XHRcdHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyID0gW107XHJcblxyXG5cdFx0XHRcdHN0YXRlLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlciApO1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB0ZXh0dXJlcy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgdGV4dHVyZSA9IHRleHR1cmVzWyBpIF07XHJcblx0XHRcdFx0XHRyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlclsgaSBdID0gX2dsLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpO1xyXG5cclxuXHRcdFx0XHRcdF9nbC5iaW5kUmVuZGVyYnVmZmVyKCBfZ2wuUkVOREVSQlVGRkVSLCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlclsgaSBdICk7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgZ2xGb3JtYXQgPSB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLmZvcm1hdCwgdGV4dHVyZS5jb2xvclNwYWNlICk7XHJcblx0XHRcdFx0XHRjb25zdCBnbFR5cGUgPSB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLnR5cGUgKTtcclxuXHRcdFx0XHRcdGNvbnN0IGdsSW50ZXJuYWxGb3JtYXQgPSBnZXRJbnRlcm5hbEZvcm1hdCggdGV4dHVyZS5pbnRlcm5hbEZvcm1hdCwgZ2xGb3JtYXQsIGdsVHlwZSwgdGV4dHVyZS5jb2xvclNwYWNlLCByZW5kZXJUYXJnZXQuaXNYUlJlbmRlclRhcmdldCA9PT0gdHJ1ZSApO1xyXG5cdFx0XHRcdFx0Y29uc3Qgc2FtcGxlcyA9IGdldFJlbmRlclRhcmdldFNhbXBsZXMoIHJlbmRlclRhcmdldCApO1xyXG5cdFx0XHRcdFx0X2dsLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZSggX2dsLlJFTkRFUkJVRkZFUiwgc2FtcGxlcywgZ2xJbnRlcm5hbEZvcm1hdCwgcmVuZGVyVGFyZ2V0LndpZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0ICk7XHJcblxyXG5cdFx0XHRcdFx0X2dsLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIF9nbC5DT0xPUl9BVFRBQ0hNRU5UMCArIGksIF9nbC5SRU5ERVJCVUZGRVIsIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyWyBpIF0gKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRfZ2wuYmluZFJlbmRlcmJ1ZmZlciggX2dsLlJFTkRFUkJVRkZFUiwgbnVsbCApO1xyXG5cclxuXHRcdFx0XHRpZiAoIHJlbmRlclRhcmdldC5kZXB0aEJ1ZmZlciApIHtcclxuXHJcblx0XHRcdFx0XHRyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aFJlbmRlcmJ1ZmZlciA9IF9nbC5jcmVhdGVSZW5kZXJidWZmZXIoKTtcclxuXHRcdFx0XHRcdHNldHVwUmVuZGVyQnVmZmVyU3RvcmFnZSggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhSZW5kZXJidWZmZXIsIHJlbmRlclRhcmdldCwgdHJ1ZSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHN0YXRlLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBudWxsICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFNldHVwIGNvbG9yIGJ1ZmZlclxyXG5cclxuXHRcdGlmICggaXNDdWJlICkge1xyXG5cclxuXHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIF9nbC5URVhUVVJFX0NVQkVfTUFQLCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApO1xyXG5cdFx0XHRzZXRUZXh0dXJlUGFyYW1ldGVycyggX2dsLlRFWFRVUkVfQ1VCRV9NQVAsIHRleHR1cmUgKTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDY7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggdGV4dHVyZS5taXBtYXBzICYmIHRleHR1cmUubWlwbWFwcy5sZW5ndGggPiAwICkge1xyXG5cclxuXHRcdFx0XHRcdGZvciAoIGxldCBsZXZlbCA9IDA7IGxldmVsIDwgdGV4dHVyZS5taXBtYXBzLmxlbmd0aDsgbGV2ZWwgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRzZXR1cEZyYW1lQnVmZmVyVGV4dHVyZSggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXJbIGkgXVsgbGV2ZWwgXSwgcmVuZGVyVGFyZ2V0LCB0ZXh0dXJlLCBfZ2wuQ09MT1JfQVRUQUNITUVOVDAsIF9nbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBpLCBsZXZlbCApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRzZXR1cEZyYW1lQnVmZmVyVGV4dHVyZSggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXJbIGkgXSwgcmVuZGVyVGFyZ2V0LCB0ZXh0dXJlLCBfZ2wuQ09MT1JfQVRUQUNITUVOVDAsIF9nbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBpLCAwICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggdGV4dHVyZU5lZWRzR2VuZXJhdGVNaXBtYXBzKCB0ZXh0dXJlICkgKSB7XHJcblxyXG5cdFx0XHRcdGdlbmVyYXRlTWlwbWFwKCBfZ2wuVEVYVFVSRV9DVUJFX01BUCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0c3RhdGUudW5iaW5kVGV4dHVyZSgpO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGlzTXVsdGlwbGVSZW5kZXJUYXJnZXRzICkge1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IHRleHR1cmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBhdHRhY2htZW50ID0gdGV4dHVyZXNbIGkgXTtcclxuXHRcdFx0XHRjb25zdCBhdHRhY2htZW50UHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCBhdHRhY2htZW50ICk7XHJcblxyXG5cdFx0XHRcdHN0YXRlLmJpbmRUZXh0dXJlKCBfZ2wuVEVYVFVSRV8yRCwgYXR0YWNobWVudFByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgKTtcclxuXHRcdFx0XHRzZXRUZXh0dXJlUGFyYW1ldGVycyggX2dsLlRFWFRVUkVfMkQsIGF0dGFjaG1lbnQgKTtcclxuXHRcdFx0XHRzZXR1cEZyYW1lQnVmZmVyVGV4dHVyZSggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXIsIHJlbmRlclRhcmdldCwgYXR0YWNobWVudCwgX2dsLkNPTE9SX0FUVEFDSE1FTlQwICsgaSwgX2dsLlRFWFRVUkVfMkQsIDAgKTtcclxuXHJcblx0XHRcdFx0aWYgKCB0ZXh0dXJlTmVlZHNHZW5lcmF0ZU1pcG1hcHMoIGF0dGFjaG1lbnQgKSApIHtcclxuXHJcblx0XHRcdFx0XHRnZW5lcmF0ZU1pcG1hcCggX2dsLlRFWFRVUkVfMkQgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0c3RhdGUudW5iaW5kVGV4dHVyZSgpO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRsZXQgZ2xUZXh0dXJlVHlwZSA9IF9nbC5URVhUVVJFXzJEO1xyXG5cclxuXHRcdFx0aWYgKCByZW5kZXJUYXJnZXQuaXNXZWJHTDNEUmVuZGVyVGFyZ2V0IHx8IHJlbmRlclRhcmdldC5pc1dlYkdMQXJyYXlSZW5kZXJUYXJnZXQgKSB7XHJcblxyXG5cdFx0XHRcdGdsVGV4dHVyZVR5cGUgPSByZW5kZXJUYXJnZXQuaXNXZWJHTDNEUmVuZGVyVGFyZ2V0ID8gX2dsLlRFWFRVUkVfM0QgOiBfZ2wuVEVYVFVSRV8yRF9BUlJBWTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHN0YXRlLmJpbmRUZXh0dXJlKCBnbFRleHR1cmVUeXBlLCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApO1xyXG5cdFx0XHRzZXRUZXh0dXJlUGFyYW1ldGVycyggZ2xUZXh0dXJlVHlwZSwgdGV4dHVyZSApO1xyXG5cclxuXHRcdFx0aWYgKCB0ZXh0dXJlLm1pcG1hcHMgJiYgdGV4dHVyZS5taXBtYXBzLmxlbmd0aCA+IDAgKSB7XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBsZXZlbCA9IDA7IGxldmVsIDwgdGV4dHVyZS5taXBtYXBzLmxlbmd0aDsgbGV2ZWwgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0c2V0dXBGcmFtZUJ1ZmZlclRleHR1cmUoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyWyBsZXZlbCBdLCByZW5kZXJUYXJnZXQsIHRleHR1cmUsIF9nbC5DT0xPUl9BVFRBQ0hNRU5UMCwgZ2xUZXh0dXJlVHlwZSwgbGV2ZWwgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0c2V0dXBGcmFtZUJ1ZmZlclRleHR1cmUoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyLCByZW5kZXJUYXJnZXQsIHRleHR1cmUsIF9nbC5DT0xPUl9BVFRBQ0hNRU5UMCwgZ2xUZXh0dXJlVHlwZSwgMCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCB0ZXh0dXJlTmVlZHNHZW5lcmF0ZU1pcG1hcHMoIHRleHR1cmUgKSApIHtcclxuXHJcblx0XHRcdFx0Z2VuZXJhdGVNaXBtYXAoIGdsVGV4dHVyZVR5cGUgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHN0YXRlLnVuYmluZFRleHR1cmUoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gU2V0dXAgZGVwdGggYW5kIHN0ZW5jaWwgYnVmZmVyc1xyXG5cclxuXHRcdGlmICggcmVuZGVyVGFyZ2V0LmRlcHRoQnVmZmVyICkge1xyXG5cclxuXHRcdFx0c2V0dXBEZXB0aFJlbmRlcmJ1ZmZlciggcmVuZGVyVGFyZ2V0ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcCggcmVuZGVyVGFyZ2V0ICkge1xyXG5cclxuXHRcdGNvbnN0IHRleHR1cmVzID0gcmVuZGVyVGFyZ2V0LnRleHR1cmVzO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSB0ZXh0dXJlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHRleHR1cmUgPSB0ZXh0dXJlc1sgaSBdO1xyXG5cclxuXHRcdFx0aWYgKCB0ZXh0dXJlTmVlZHNHZW5lcmF0ZU1pcG1hcHMoIHRleHR1cmUgKSApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgdGFyZ2V0VHlwZSA9IGdldFRhcmdldFR5cGUoIHJlbmRlclRhcmdldCApO1xyXG5cdFx0XHRcdGNvbnN0IHdlYmdsVGV4dHVyZSA9IHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICkuX193ZWJnbFRleHR1cmU7XHJcblxyXG5cdFx0XHRcdHN0YXRlLmJpbmRUZXh0dXJlKCB0YXJnZXRUeXBlLCB3ZWJnbFRleHR1cmUgKTtcclxuXHRcdFx0XHRnZW5lcmF0ZU1pcG1hcCggdGFyZ2V0VHlwZSApO1xyXG5cdFx0XHRcdHN0YXRlLnVuYmluZFRleHR1cmUoKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0Y29uc3QgaW52YWxpZGF0aW9uQXJyYXlSZWFkID0gW107XHJcblx0Y29uc3QgaW52YWxpZGF0aW9uQXJyYXlEcmF3ID0gW107XHJcblxyXG5cdGZ1bmN0aW9uIHVwZGF0ZU11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQgKSB7XHJcblxyXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQuc2FtcGxlcyA+IDAgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHVzZU11bHRpc2FtcGxlZFJUVCggcmVuZGVyVGFyZ2V0ICkgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB0ZXh0dXJlcyA9IHJlbmRlclRhcmdldC50ZXh0dXJlcztcclxuXHRcdFx0XHRjb25zdCB3aWR0aCA9IHJlbmRlclRhcmdldC53aWR0aDtcclxuXHRcdFx0XHRjb25zdCBoZWlnaHQgPSByZW5kZXJUYXJnZXQuaGVpZ2h0O1xyXG5cdFx0XHRcdGxldCBtYXNrID0gX2dsLkNPTE9SX0JVRkZFUl9CSVQ7XHJcblx0XHRcdFx0Y29uc3QgZGVwdGhTdHlsZSA9IHJlbmRlclRhcmdldC5zdGVuY2lsQnVmZmVyID8gX2dsLkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVCA6IF9nbC5ERVBUSF9BVFRBQ0hNRU5UO1xyXG5cdFx0XHRcdGNvbnN0IHJlbmRlclRhcmdldFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0ICk7XHJcblx0XHRcdFx0Y29uc3QgaXNNdWx0aXBsZVJlbmRlclRhcmdldHMgPSAoIHRleHR1cmVzLmxlbmd0aCA+IDEgKTtcclxuXHJcblx0XHRcdFx0Ly8gSWYgTVJUIHdlIG5lZWQgdG8gcmVtb3ZlIEZCTyBhdHRhY2htZW50c1xyXG5cdFx0XHRcdGlmICggaXNNdWx0aXBsZVJlbmRlclRhcmdldHMgKSB7XHJcblxyXG5cdFx0XHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdGV4dHVyZXMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdFx0c3RhdGUuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyICk7XHJcblx0XHRcdFx0XHRcdF9nbC5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBfZ2wuQ09MT1JfQVRUQUNITUVOVDAgKyBpLCBfZ2wuUkVOREVSQlVGRkVSLCBudWxsICk7XHJcblxyXG5cdFx0XHRcdFx0XHRzdGF0ZS5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXIgKTtcclxuXHRcdFx0XHRcdFx0X2dsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKCBfZ2wuRFJBV19GUkFNRUJVRkZFUiwgX2dsLkNPTE9SX0FUVEFDSE1FTlQwICsgaSwgX2dsLlRFWFRVUkVfMkQsIG51bGwsIDAgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0c3RhdGUuYmluZEZyYW1lYnVmZmVyKCBfZ2wuUkVBRF9GUkFNRUJVRkZFUiwgcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXIgKTtcclxuXHRcdFx0XHRzdGF0ZS5iaW5kRnJhbWVidWZmZXIoIF9nbC5EUkFXX0ZSQU1FQlVGRkVSLCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciApO1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB0ZXh0dXJlcy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCByZW5kZXJUYXJnZXQucmVzb2x2ZURlcHRoQnVmZmVyICkge1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCByZW5kZXJUYXJnZXQuZGVwdGhCdWZmZXIgKSBtYXNrIHw9IF9nbC5ERVBUSF9CVUZGRVJfQklUO1xyXG5cclxuXHRcdFx0XHRcdFx0Ly8gcmVzb2x2aW5nIHN0ZW5jaWwgaXMgc2xvdyB3aXRoIGEgRDNEIGJhY2tlbmQuIGRpc2FibGUgaXQgZm9yIGFsbCB0cmFuc21pc3Npb24gcmVuZGVyIHRhcmdldHMgKHNlZSAjMjc3OTkpXHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIHJlbmRlclRhcmdldC5zdGVuY2lsQnVmZmVyICYmIHJlbmRlclRhcmdldC5yZXNvbHZlU3RlbmNpbEJ1ZmZlciApIG1hc2sgfD0gX2dsLlNURU5DSUxfQlVGRkVSX0JJVDtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBpc011bHRpcGxlUmVuZGVyVGFyZ2V0cyApIHtcclxuXHJcblx0XHRcdFx0XHRcdF9nbC5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlciggX2dsLlJFQURfRlJBTUVCVUZGRVIsIF9nbC5DT0xPUl9BVFRBQ0hNRU5UMCwgX2dsLlJFTkRFUkJVRkZFUiwgcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXJbIGkgXSApO1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3Qgd2ViZ2xUZXh0dXJlID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmVzWyBpIF0gKS5fX3dlYmdsVGV4dHVyZTtcclxuXHRcdFx0XHRcdFx0X2dsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKCBfZ2wuRFJBV19GUkFNRUJVRkZFUiwgX2dsLkNPTE9SX0FUVEFDSE1FTlQwLCBfZ2wuVEVYVFVSRV8yRCwgd2ViZ2xUZXh0dXJlLCAwICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdF9nbC5ibGl0RnJhbWVidWZmZXIoIDAsIDAsIHdpZHRoLCBoZWlnaHQsIDAsIDAsIHdpZHRoLCBoZWlnaHQsIG1hc2ssIF9nbC5ORUFSRVNUICk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBzdXBwb3J0c0ludmFsaWRhdGVGcmFtZWJ1ZmZlciA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdGludmFsaWRhdGlvbkFycmF5UmVhZC5sZW5ndGggPSAwO1xyXG5cdFx0XHRcdFx0XHRpbnZhbGlkYXRpb25BcnJheURyYXcubGVuZ3RoID0gMDtcclxuXHJcblx0XHRcdFx0XHRcdGludmFsaWRhdGlvbkFycmF5UmVhZC5wdXNoKCBfZ2wuQ09MT1JfQVRUQUNITUVOVDAgKyBpICk7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIHJlbmRlclRhcmdldC5kZXB0aEJ1ZmZlciAmJiByZW5kZXJUYXJnZXQucmVzb2x2ZURlcHRoQnVmZmVyID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0aW52YWxpZGF0aW9uQXJyYXlSZWFkLnB1c2goIGRlcHRoU3R5bGUgKTtcclxuXHRcdFx0XHRcdFx0XHRpbnZhbGlkYXRpb25BcnJheURyYXcucHVzaCggZGVwdGhTdHlsZSApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRfZ2wuaW52YWxpZGF0ZUZyYW1lYnVmZmVyKCBfZ2wuRFJBV19GUkFNRUJVRkZFUiwgaW52YWxpZGF0aW9uQXJyYXlEcmF3ICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRfZ2wuaW52YWxpZGF0ZUZyYW1lYnVmZmVyKCBfZ2wuUkVBRF9GUkFNRUJVRkZFUiwgaW52YWxpZGF0aW9uQXJyYXlSZWFkICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHN0YXRlLmJpbmRGcmFtZWJ1ZmZlciggX2dsLlJFQURfRlJBTUVCVUZGRVIsIG51bGwgKTtcclxuXHRcdFx0XHRzdGF0ZS5iaW5kRnJhbWVidWZmZXIoIF9nbC5EUkFXX0ZSQU1FQlVGRkVSLCBudWxsICk7XHJcblxyXG5cdFx0XHRcdC8vIElmIE1SVCBzaW5jZSBwcmUtYmxpdCB3ZSByZW1vdmVkIHRoZSBGQk8gd2UgbmVlZCB0byByZWNvbnN0cnVjdCB0aGUgYXR0YWNobWVudHNcclxuXHRcdFx0XHRpZiAoIGlzTXVsdGlwbGVSZW5kZXJUYXJnZXRzICkge1xyXG5cclxuXHRcdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHRleHR1cmVzLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRcdHN0YXRlLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlciApO1xyXG5cdFx0XHRcdFx0XHRfZ2wuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgX2dsLkNPTE9SX0FUVEFDSE1FTlQwICsgaSwgX2dsLlJFTkRFUkJVRkZFUiwgcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXJbIGkgXSApO1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3Qgd2ViZ2xUZXh0dXJlID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmVzWyBpIF0gKS5fX3dlYmdsVGV4dHVyZTtcclxuXHJcblx0XHRcdFx0XHRcdHN0YXRlLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciApO1xyXG5cdFx0XHRcdFx0XHRfZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoIF9nbC5EUkFXX0ZSQU1FQlVGRkVSLCBfZ2wuQ09MT1JfQVRUQUNITUVOVDAgKyBpLCBfZ2wuVEVYVFVSRV8yRCwgd2ViZ2xUZXh0dXJlLCAwICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHN0YXRlLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkRSQVdfRlJBTUVCVUZGRVIsIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRpZiAoIHJlbmRlclRhcmdldC5kZXB0aEJ1ZmZlciAmJiByZW5kZXJUYXJnZXQucmVzb2x2ZURlcHRoQnVmZmVyID09PSBmYWxzZSAmJiBzdXBwb3J0c0ludmFsaWRhdGVGcmFtZWJ1ZmZlciApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBkZXB0aFN0eWxlID0gcmVuZGVyVGFyZ2V0LnN0ZW5jaWxCdWZmZXIgPyBfZ2wuREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UIDogX2dsLkRFUFRIX0FUVEFDSE1FTlQ7XHJcblxyXG5cdFx0XHRcdFx0X2dsLmludmFsaWRhdGVGcmFtZWJ1ZmZlciggX2dsLkRSQVdfRlJBTUVCVUZGRVIsIFsgZGVwdGhTdHlsZSBdICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gZ2V0UmVuZGVyVGFyZ2V0U2FtcGxlcyggcmVuZGVyVGFyZ2V0ICkge1xyXG5cclxuXHRcdHJldHVybiBNYXRoLm1pbiggY2FwYWJpbGl0aWVzLm1heFNhbXBsZXMsIHJlbmRlclRhcmdldC5zYW1wbGVzICk7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gdXNlTXVsdGlzYW1wbGVkUlRUKCByZW5kZXJUYXJnZXQgKSB7XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyVGFyZ2V0UHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQgKTtcclxuXHJcblx0XHRyZXR1cm4gcmVuZGVyVGFyZ2V0LnNhbXBsZXMgPiAwICYmIGV4dGVuc2lvbnMuaGFzKCAnV0VCR0xfbXVsdGlzYW1wbGVkX3JlbmRlcl90b190ZXh0dXJlJyApID09PSB0cnVlICYmIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX191c2VSZW5kZXJUb1RleHR1cmUgIT09IGZhbHNlO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHVwZGF0ZVZpZGVvVGV4dHVyZSggdGV4dHVyZSApIHtcclxuXHJcblx0XHRjb25zdCBmcmFtZSA9IGluZm8ucmVuZGVyLmZyYW1lO1xyXG5cclxuXHRcdC8vIENoZWNrIHRoZSBsYXN0IGZyYW1lIHdlIHVwZGF0ZWQgdGhlIFZpZGVvVGV4dHVyZVxyXG5cclxuXHRcdGlmICggX3ZpZGVvVGV4dHVyZXMuZ2V0KCB0ZXh0dXJlICkgIT09IGZyYW1lICkge1xyXG5cclxuXHRcdFx0X3ZpZGVvVGV4dHVyZXMuc2V0KCB0ZXh0dXJlLCBmcmFtZSApO1xyXG5cdFx0XHR0ZXh0dXJlLnVwZGF0ZSgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiB2ZXJpZnlDb2xvclNwYWNlKCB0ZXh0dXJlLCBpbWFnZSApIHtcclxuXHJcblx0XHRjb25zdCBjb2xvclNwYWNlID0gdGV4dHVyZS5jb2xvclNwYWNlO1xyXG5cdFx0Y29uc3QgZm9ybWF0ID0gdGV4dHVyZS5mb3JtYXQ7XHJcblx0XHRjb25zdCB0eXBlID0gdGV4dHVyZS50eXBlO1xyXG5cclxuXHRcdGlmICggdGV4dHVyZS5pc0NvbXByZXNzZWRUZXh0dXJlID09PSB0cnVlIHx8IHRleHR1cmUuaXNWaWRlb1RleHR1cmUgPT09IHRydWUgKSByZXR1cm4gaW1hZ2U7XHJcblxyXG5cdFx0aWYgKCBjb2xvclNwYWNlICE9PSBMaW5lYXJTUkdCQ29sb3JTcGFjZSAmJiBjb2xvclNwYWNlICE9PSBOb0NvbG9yU3BhY2UgKSB7XHJcblxyXG5cdFx0XHQvLyBzUkdCXHJcblxyXG5cdFx0XHRpZiAoIENvbG9yTWFuYWdlbWVudC5nZXRUcmFuc2ZlciggY29sb3JTcGFjZSApID09PSBTUkdCVHJhbnNmZXIgKSB7XHJcblxyXG5cdFx0XHRcdC8vIGluIFdlYkdMIDIgdW5jb21wcmVzc2VkIHRleHR1cmVzIGNhbiBvbmx5IGJlIHNSR0IgZW5jb2RlZCBpZiB0aGV5IGhhdmUgdGhlIFJHQkE4IGZvcm1hdFxyXG5cclxuXHRcdFx0XHRpZiAoIGZvcm1hdCAhPT0gUkdCQUZvcm1hdCB8fCB0eXBlICE9PSBVbnNpZ25lZEJ5dGVUeXBlICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMVGV4dHVyZXM6IHNSR0IgZW5jb2RlZCB0ZXh0dXJlcyBoYXZlIHRvIHVzZSBSR0JBRm9ybWF0IGFuZCBVbnNpZ25lZEJ5dGVUeXBlLicgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMVGV4dHVyZXM6IFVuc3VwcG9ydGVkIHRleHR1cmUgY29sb3Igc3BhY2U6JywgY29sb3JTcGFjZSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gaW1hZ2U7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gZ2V0RGltZW5zaW9ucyggaW1hZ2UgKSB7XHJcblxyXG5cdFx0aWYgKCB0eXBlb2YgSFRNTEltYWdlRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgaW1hZ2UgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50ICkge1xyXG5cclxuXHRcdFx0Ly8gaWYgaW50cmluc2ljIGRhdGEgYXJlIG5vdCBhdmFpbGFibGUsIGZhbGxiYWNrIHRvIHdpZHRoL2hlaWdodFxyXG5cclxuXHRcdFx0X2ltYWdlRGltZW5zaW9ucy53aWR0aCA9IGltYWdlLm5hdHVyYWxXaWR0aCB8fCBpbWFnZS53aWR0aDtcclxuXHRcdFx0X2ltYWdlRGltZW5zaW9ucy5oZWlnaHQgPSBpbWFnZS5uYXR1cmFsSGVpZ2h0IHx8IGltYWdlLmhlaWdodDtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCB0eXBlb2YgVmlkZW9GcmFtZSAhPT0gJ3VuZGVmaW5lZCcgJiYgaW1hZ2UgaW5zdGFuY2VvZiBWaWRlb0ZyYW1lICkge1xyXG5cclxuXHRcdFx0X2ltYWdlRGltZW5zaW9ucy53aWR0aCA9IGltYWdlLmRpc3BsYXlXaWR0aDtcclxuXHRcdFx0X2ltYWdlRGltZW5zaW9ucy5oZWlnaHQgPSBpbWFnZS5kaXNwbGF5SGVpZ2h0O1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRfaW1hZ2VEaW1lbnNpb25zLndpZHRoID0gaW1hZ2Uud2lkdGg7XHJcblx0XHRcdF9pbWFnZURpbWVuc2lvbnMuaGVpZ2h0ID0gaW1hZ2UuaGVpZ2h0O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gX2ltYWdlRGltZW5zaW9ucztcclxuXHJcblx0fVxyXG5cclxuXHQvL1xyXG5cclxuXHR0aGlzLmFsbG9jYXRlVGV4dHVyZVVuaXQgPSBhbGxvY2F0ZVRleHR1cmVVbml0O1xyXG5cdHRoaXMucmVzZXRUZXh0dXJlVW5pdHMgPSByZXNldFRleHR1cmVVbml0cztcclxuXHJcblx0dGhpcy5zZXRUZXh0dXJlMkQgPSBzZXRUZXh0dXJlMkQ7XHJcblx0dGhpcy5zZXRUZXh0dXJlMkRBcnJheSA9IHNldFRleHR1cmUyREFycmF5O1xyXG5cdHRoaXMuc2V0VGV4dHVyZTNEID0gc2V0VGV4dHVyZTNEO1xyXG5cdHRoaXMuc2V0VGV4dHVyZUN1YmUgPSBzZXRUZXh0dXJlQ3ViZTtcclxuXHR0aGlzLnJlYmluZFRleHR1cmVzID0gcmViaW5kVGV4dHVyZXM7XHJcblx0dGhpcy5zZXR1cFJlbmRlclRhcmdldCA9IHNldHVwUmVuZGVyVGFyZ2V0O1xyXG5cdHRoaXMudXBkYXRlUmVuZGVyVGFyZ2V0TWlwbWFwID0gdXBkYXRlUmVuZGVyVGFyZ2V0TWlwbWFwO1xyXG5cdHRoaXMudXBkYXRlTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQgPSB1cGRhdGVNdWx0aXNhbXBsZVJlbmRlclRhcmdldDtcclxuXHR0aGlzLnNldHVwRGVwdGhSZW5kZXJidWZmZXIgPSBzZXR1cERlcHRoUmVuZGVyYnVmZmVyO1xyXG5cdHRoaXMuc2V0dXBGcmFtZUJ1ZmZlclRleHR1cmUgPSBzZXR1cEZyYW1lQnVmZmVyVGV4dHVyZTtcclxuXHR0aGlzLnVzZU11bHRpc2FtcGxlZFJUVCA9IHVzZU11bHRpc2FtcGxlZFJUVDtcclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFdlYkdMVGV4dHVyZXMgfTtcclxuIiwiaW1wb3J0IHsgUkdCQV9BU1RDXzR4NF9Gb3JtYXQsIFJHQkFfQVNUQ181eDRfRm9ybWF0LCBSR0JBX0FTVENfNXg1X0Zvcm1hdCwgUkdCQV9BU1RDXzZ4NV9Gb3JtYXQsIFJHQkFfQVNUQ182eDZfRm9ybWF0LCBSR0JBX0FTVENfOHg1X0Zvcm1hdCwgUkdCQV9BU1RDXzh4Nl9Gb3JtYXQsIFJHQkFfQVNUQ184eDhfRm9ybWF0LCBSR0JBX0FTVENfMTB4NV9Gb3JtYXQsIFJHQkFfQVNUQ18xMHg2X0Zvcm1hdCwgUkdCQV9BU1RDXzEweDhfRm9ybWF0LCBSR0JBX0FTVENfMTB4MTBfRm9ybWF0LCBSR0JBX0FTVENfMTJ4MTBfRm9ybWF0LCBSR0JBX0FTVENfMTJ4MTJfRm9ybWF0LCBSR0JfRVRDMV9Gb3JtYXQsIFJHQl9FVEMyX0Zvcm1hdCwgUkdCQV9FVEMyX0VBQ19Gb3JtYXQsIFJHQkFfUFZSVENfMkJQUFYxX0Zvcm1hdCwgUkdCQV9QVlJUQ180QlBQVjFfRm9ybWF0LCBSR0JfUFZSVENfMkJQUFYxX0Zvcm1hdCwgUkdCX1BWUlRDXzRCUFBWMV9Gb3JtYXQsIFJHQkFfUzNUQ19EWFQ1X0Zvcm1hdCwgUkdCQV9TM1RDX0RYVDNfRm9ybWF0LCBSR0JBX1MzVENfRFhUMV9Gb3JtYXQsIFJHQl9TM1RDX0RYVDFfRm9ybWF0LCBEZXB0aEZvcm1hdCwgRGVwdGhTdGVuY2lsRm9ybWF0LCBMdW1pbmFuY2VBbHBoYUZvcm1hdCwgTHVtaW5hbmNlRm9ybWF0LCBSZWRGb3JtYXQsIFJHQkFGb3JtYXQsIEFscGhhRm9ybWF0LCBSZWRJbnRlZ2VyRm9ybWF0LCBSR0Zvcm1hdCwgUkdJbnRlZ2VyRm9ybWF0LCBSR0JBSW50ZWdlckZvcm1hdCwgSGFsZkZsb2F0VHlwZSwgRmxvYXRUeXBlLCBVbnNpZ25lZEludFR5cGUsIEludFR5cGUsIFVuc2lnbmVkU2hvcnRUeXBlLCBTaG9ydFR5cGUsIEJ5dGVUeXBlLCBVbnNpZ25lZEludDI0OFR5cGUsIFVuc2lnbmVkU2hvcnQ1NTUxVHlwZSwgVW5zaWduZWRTaG9ydDQ0NDRUeXBlLCBVbnNpZ25lZEJ5dGVUeXBlLCBSR0JBX0JQVENfRm9ybWF0LCBSR0JfQlBUQ19TSUdORURfRm9ybWF0LCBSR0JfQlBUQ19VTlNJR05FRF9Gb3JtYXQsIFJFRF9SR1RDMV9Gb3JtYXQsIFNJR05FRF9SRURfUkdUQzFfRm9ybWF0LCBSRURfR1JFRU5fUkdUQzJfRm9ybWF0LCBTSUdORURfUkVEX0dSRUVOX1JHVEMyX0Zvcm1hdCwgTm9Db2xvclNwYWNlLCBTUkdCVHJhbnNmZXIsIFVuc2lnbmVkSW50NTk5OVR5cGUsIFJHQkZvcm1hdCB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IENvbG9yTWFuYWdlbWVudCB9IGZyb20gJy4uLy4uL21hdGgvQ29sb3JNYW5hZ2VtZW50LmpzJztcclxuXHJcbmZ1bmN0aW9uIFdlYkdMVXRpbHMoIGdsLCBleHRlbnNpb25zICkge1xyXG5cclxuXHRmdW5jdGlvbiBjb252ZXJ0KCBwLCBjb2xvclNwYWNlID0gTm9Db2xvclNwYWNlICkge1xyXG5cclxuXHRcdGxldCBleHRlbnNpb247XHJcblxyXG5cdFx0Y29uc3QgdHJhbnNmZXIgPSBDb2xvck1hbmFnZW1lbnQuZ2V0VHJhbnNmZXIoIGNvbG9yU3BhY2UgKTtcclxuXHJcblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkQnl0ZVR5cGUgKSByZXR1cm4gZ2wuVU5TSUdORURfQllURTtcclxuXHRcdGlmICggcCA9PT0gVW5zaWduZWRTaG9ydDQ0NDRUeXBlICkgcmV0dXJuIGdsLlVOU0lHTkVEX1NIT1JUXzRfNF80XzQ7XHJcblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkU2hvcnQ1NTUxVHlwZSApIHJldHVybiBnbC5VTlNJR05FRF9TSE9SVF81XzVfNV8xO1xyXG5cdFx0aWYgKCBwID09PSBVbnNpZ25lZEludDU5OTlUeXBlICkgcmV0dXJuIGdsLlVOU0lHTkVEX0lOVF81XzlfOV85X1JFVjtcclxuXHJcblx0XHRpZiAoIHAgPT09IEJ5dGVUeXBlICkgcmV0dXJuIGdsLkJZVEU7XHJcblx0XHRpZiAoIHAgPT09IFNob3J0VHlwZSApIHJldHVybiBnbC5TSE9SVDtcclxuXHRcdGlmICggcCA9PT0gVW5zaWduZWRTaG9ydFR5cGUgKSByZXR1cm4gZ2wuVU5TSUdORURfU0hPUlQ7XHJcblx0XHRpZiAoIHAgPT09IEludFR5cGUgKSByZXR1cm4gZ2wuSU5UO1xyXG5cdFx0aWYgKCBwID09PSBVbnNpZ25lZEludFR5cGUgKSByZXR1cm4gZ2wuVU5TSUdORURfSU5UO1xyXG5cdFx0aWYgKCBwID09PSBGbG9hdFR5cGUgKSByZXR1cm4gZ2wuRkxPQVQ7XHJcblx0XHRpZiAoIHAgPT09IEhhbGZGbG9hdFR5cGUgKSByZXR1cm4gZ2wuSEFMRl9GTE9BVDtcclxuXHJcblx0XHRpZiAoIHAgPT09IEFscGhhRm9ybWF0ICkgcmV0dXJuIGdsLkFMUEhBO1xyXG5cdFx0aWYgKCBwID09PSBSR0JGb3JtYXQgKSByZXR1cm4gZ2wuUkdCO1xyXG5cdFx0aWYgKCBwID09PSBSR0JBRm9ybWF0ICkgcmV0dXJuIGdsLlJHQkE7XHJcblx0XHRpZiAoIHAgPT09IEx1bWluYW5jZUZvcm1hdCApIHJldHVybiBnbC5MVU1JTkFOQ0U7XHJcblx0XHRpZiAoIHAgPT09IEx1bWluYW5jZUFscGhhRm9ybWF0ICkgcmV0dXJuIGdsLkxVTUlOQU5DRV9BTFBIQTtcclxuXHRcdGlmICggcCA9PT0gRGVwdGhGb3JtYXQgKSByZXR1cm4gZ2wuREVQVEhfQ09NUE9ORU5UO1xyXG5cdFx0aWYgKCBwID09PSBEZXB0aFN0ZW5jaWxGb3JtYXQgKSByZXR1cm4gZ2wuREVQVEhfU1RFTkNJTDtcclxuXHJcblx0XHQvLyBXZWJHTDIgZm9ybWF0cy5cclxuXHJcblx0XHRpZiAoIHAgPT09IFJlZEZvcm1hdCApIHJldHVybiBnbC5SRUQ7XHJcblx0XHRpZiAoIHAgPT09IFJlZEludGVnZXJGb3JtYXQgKSByZXR1cm4gZ2wuUkVEX0lOVEVHRVI7XHJcblx0XHRpZiAoIHAgPT09IFJHRm9ybWF0ICkgcmV0dXJuIGdsLlJHO1xyXG5cdFx0aWYgKCBwID09PSBSR0ludGVnZXJGb3JtYXQgKSByZXR1cm4gZ2wuUkdfSU5URUdFUjtcclxuXHRcdGlmICggcCA9PT0gUkdCQUludGVnZXJGb3JtYXQgKSByZXR1cm4gZ2wuUkdCQV9JTlRFR0VSO1xyXG5cclxuXHRcdC8vIFMzVENcclxuXHJcblx0XHRpZiAoIHAgPT09IFJHQl9TM1RDX0RYVDFfRm9ybWF0IHx8IHAgPT09IFJHQkFfUzNUQ19EWFQxX0Zvcm1hdCB8fCBwID09PSBSR0JBX1MzVENfRFhUM19Gb3JtYXQgfHwgcCA9PT0gUkdCQV9TM1RDX0RYVDVfRm9ybWF0ICkge1xyXG5cclxuXHRcdFx0aWYgKCB0cmFuc2ZlciA9PT0gU1JHQlRyYW5zZmVyICkge1xyXG5cclxuXHRcdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjX3NyZ2InICk7XHJcblxyXG5cdFx0XHRcdGlmICggZXh0ZW5zaW9uICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRcdGlmICggcCA9PT0gUkdCX1MzVENfRFhUMV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU1JHQl9TM1RDX0RYVDFfRVhUO1xyXG5cdFx0XHRcdFx0aWYgKCBwID09PSBSR0JBX1MzVENfRFhUMV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU1JHQl9BTFBIQV9TM1RDX0RYVDFfRVhUO1xyXG5cdFx0XHRcdFx0aWYgKCBwID09PSBSR0JBX1MzVENfRFhUM19Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU1JHQl9BTFBIQV9TM1RDX0RYVDNfRVhUO1xyXG5cdFx0XHRcdFx0aWYgKCBwID09PSBSR0JBX1MzVENfRFhUNV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU1JHQl9BTFBIQV9TM1RDX0RYVDVfRVhUO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdHJldHVybiBudWxsO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApO1xyXG5cclxuXHRcdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIHAgPT09IFJHQl9TM1RDX0RYVDFfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhUO1xyXG5cdFx0XHRcdFx0aWYgKCBwID09PSBSR0JBX1MzVENfRFhUMV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDFfRVhUO1xyXG5cdFx0XHRcdFx0aWYgKCBwID09PSBSR0JBX1MzVENfRFhUM19Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDNfRVhUO1xyXG5cdFx0XHRcdFx0aWYgKCBwID09PSBSR0JBX1MzVENfRFhUNV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhUO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdHJldHVybiBudWxsO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFBWUlRDXHJcblxyXG5cdFx0aWYgKCBwID09PSBSR0JfUFZSVENfNEJQUFYxX0Zvcm1hdCB8fCBwID09PSBSR0JfUFZSVENfMkJQUFYxX0Zvcm1hdCB8fCBwID09PSBSR0JBX1BWUlRDXzRCUFBWMV9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9QVlJUQ18yQlBQVjFfRm9ybWF0ICkge1xyXG5cclxuXHRcdFx0ZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnICk7XHJcblxyXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBwID09PSBSR0JfUFZSVENfNEJQUFYxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JfUFZSVENfNEJQUFYxX0lNRztcclxuXHRcdFx0XHRpZiAoIHAgPT09IFJHQl9QVlJUQ18yQlBQVjFfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQl9QVlJUQ18yQlBQVjFfSU1HO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9QVlJUQ180QlBQVjFfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfUFZSVENfNEJQUFYxX0lNRztcclxuXHRcdFx0XHRpZiAoIHAgPT09IFJHQkFfUFZSVENfMkJQUFYxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzJCUFBWMV9JTUc7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gRVRDXHJcblxyXG5cdFx0aWYgKCBwID09PSBSR0JfRVRDMV9Gb3JtYXQgfHwgcCA9PT0gUkdCX0VUQzJfRm9ybWF0IHx8IHAgPT09IFJHQkFfRVRDMl9FQUNfRm9ybWF0ICkge1xyXG5cclxuXHRcdFx0ZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfZXRjJyApO1xyXG5cclxuXHRcdFx0aWYgKCBleHRlbnNpb24gIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCX0VUQzFfRm9ybWF0IHx8IHAgPT09IFJHQl9FVEMyX0Zvcm1hdCApIHJldHVybiAoIHRyYW5zZmVyID09PSBTUkdCVHJhbnNmZXIgKSA/IGV4dGVuc2lvbi5DT01QUkVTU0VEX1NSR0I4X0VUQzIgOiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0I4X0VUQzI7XHJcblx0XHRcdFx0aWYgKCBwID09PSBSR0JBX0VUQzJfRUFDX0Zvcm1hdCApIHJldHVybiAoIHRyYW5zZmVyID09PSBTUkdCVHJhbnNmZXIgKSA/IGV4dGVuc2lvbi5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9FVEMyX0VBQyA6IGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkE4X0VUQzJfRUFDO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0cmV0dXJuIG51bGw7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEFTVENcclxuXHJcblx0XHRpZiAoIHAgPT09IFJHQkFfQVNUQ180eDRfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ181eDRfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ181eDVfRm9ybWF0IHx8XHJcblx0XHRcdHAgPT09IFJHQkFfQVNUQ182eDVfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ182eDZfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ184eDVfRm9ybWF0IHx8XHJcblx0XHRcdHAgPT09IFJHQkFfQVNUQ184eDZfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ184eDhfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ18xMHg1X0Zvcm1hdCB8fFxyXG5cdFx0XHRwID09PSBSR0JBX0FTVENfMTB4Nl9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzEweDhfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ18xMHgxMF9Gb3JtYXQgfHxcclxuXHRcdFx0cCA9PT0gUkdCQV9BU1RDXzEyeDEwX0Zvcm1hdCB8fCBwID09PSBSR0JBX0FTVENfMTJ4MTJfRm9ybWF0ICkge1xyXG5cclxuXHRcdFx0ZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfYXN0YycgKTtcclxuXHJcblx0XHRcdGlmICggZXh0ZW5zaW9uICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIHAgPT09IFJHQkFfQVNUQ180eDRfRm9ybWF0ICkgcmV0dXJuICggdHJhbnNmZXIgPT09IFNSR0JUcmFuc2ZlciApID8gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfNHg0X0tIUiA6IGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfQVNUQ180eDRfS0hSO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9BU1RDXzV4NF9Gb3JtYXQgKSByZXR1cm4gKCB0cmFuc2ZlciA9PT0gU1JHQlRyYW5zZmVyICkgPyBleHRlbnNpb24uQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ181eDRfS0hSIDogZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9BU1RDXzV4NF9LSFI7XHJcblx0XHRcdFx0aWYgKCBwID09PSBSR0JBX0FTVENfNXg1X0Zvcm1hdCApIHJldHVybiAoIHRyYW5zZmVyID09PSBTUkdCVHJhbnNmZXIgKSA/IGV4dGVuc2lvbi5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzV4NV9LSFIgOiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX0FTVENfNXg1X0tIUjtcclxuXHRcdFx0XHRpZiAoIHAgPT09IFJHQkFfQVNUQ182eDVfRm9ybWF0ICkgcmV0dXJuICggdHJhbnNmZXIgPT09IFNSR0JUcmFuc2ZlciApID8gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfNng1X0tIUiA6IGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfQVNUQ182eDVfS0hSO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9BU1RDXzZ4Nl9Gb3JtYXQgKSByZXR1cm4gKCB0cmFuc2ZlciA9PT0gU1JHQlRyYW5zZmVyICkgPyBleHRlbnNpb24uQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ182eDZfS0hSIDogZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9BU1RDXzZ4Nl9LSFI7XHJcblx0XHRcdFx0aWYgKCBwID09PSBSR0JBX0FTVENfOHg1X0Zvcm1hdCApIHJldHVybiAoIHRyYW5zZmVyID09PSBTUkdCVHJhbnNmZXIgKSA/IGV4dGVuc2lvbi5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzh4NV9LSFIgOiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX0FTVENfOHg1X0tIUjtcclxuXHRcdFx0XHRpZiAoIHAgPT09IFJHQkFfQVNUQ184eDZfRm9ybWF0ICkgcmV0dXJuICggdHJhbnNmZXIgPT09IFNSR0JUcmFuc2ZlciApID8gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfOHg2X0tIUiA6IGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfQVNUQ184eDZfS0hSO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9BU1RDXzh4OF9Gb3JtYXQgKSByZXR1cm4gKCB0cmFuc2ZlciA9PT0gU1JHQlRyYW5zZmVyICkgPyBleHRlbnNpb24uQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ184eDhfS0hSIDogZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9BU1RDXzh4OF9LSFI7XHJcblx0XHRcdFx0aWYgKCBwID09PSBSR0JBX0FTVENfMTB4NV9Gb3JtYXQgKSByZXR1cm4gKCB0cmFuc2ZlciA9PT0gU1JHQlRyYW5zZmVyICkgPyBleHRlbnNpb24uQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ18xMHg1X0tIUiA6IGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfQVNUQ18xMHg1X0tIUjtcclxuXHRcdFx0XHRpZiAoIHAgPT09IFJHQkFfQVNUQ18xMHg2X0Zvcm1hdCApIHJldHVybiAoIHRyYW5zZmVyID09PSBTUkdCVHJhbnNmZXIgKSA/IGV4dGVuc2lvbi5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzEweDZfS0hSIDogZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9BU1RDXzEweDZfS0hSO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9BU1RDXzEweDhfRm9ybWF0ICkgcmV0dXJuICggdHJhbnNmZXIgPT09IFNSR0JUcmFuc2ZlciApID8gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfMTB4OF9LSFIgOiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX0FTVENfMTB4OF9LSFI7XHJcblx0XHRcdFx0aWYgKCBwID09PSBSR0JBX0FTVENfMTB4MTBfRm9ybWF0ICkgcmV0dXJuICggdHJhbnNmZXIgPT09IFNSR0JUcmFuc2ZlciApID8gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfMTB4MTBfS0hSIDogZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9BU1RDXzEweDEwX0tIUjtcclxuXHRcdFx0XHRpZiAoIHAgPT09IFJHQkFfQVNUQ18xMngxMF9Gb3JtYXQgKSByZXR1cm4gKCB0cmFuc2ZlciA9PT0gU1JHQlRyYW5zZmVyICkgPyBleHRlbnNpb24uQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ18xMngxMF9LSFIgOiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX0FTVENfMTJ4MTBfS0hSO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9BU1RDXzEyeDEyX0Zvcm1hdCApIHJldHVybiAoIHRyYW5zZmVyID09PSBTUkdCVHJhbnNmZXIgKSA/IGV4dGVuc2lvbi5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzEyeDEyX0tIUiA6IGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfQVNUQ18xMngxMl9LSFI7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQlBUQ1xyXG5cclxuXHRcdGlmICggcCA9PT0gUkdCQV9CUFRDX0Zvcm1hdCB8fCBwID09PSBSR0JfQlBUQ19TSUdORURfRm9ybWF0IHx8IHAgPT09IFJHQl9CUFRDX1VOU0lHTkVEX0Zvcm1hdCApIHtcclxuXHJcblx0XHRcdGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnRVhUX3RleHR1cmVfY29tcHJlc3Npb25fYnB0YycgKTtcclxuXHJcblx0XHRcdGlmICggZXh0ZW5zaW9uICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIHAgPT09IFJHQkFfQlBUQ19Gb3JtYXQgKSByZXR1cm4gKCB0cmFuc2ZlciA9PT0gU1JHQlRyYW5zZmVyICkgPyBleHRlbnNpb24uQ09NUFJFU1NFRF9TUkdCX0FMUEhBX0JQVENfVU5PUk1fRVhUIDogZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9CUFRDX1VOT1JNX0VYVDtcclxuXHRcdFx0XHRpZiAoIHAgPT09IFJHQl9CUFRDX1NJR05FRF9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCX0JQVENfU0lHTkVEX0ZMT0FUX0VYVDtcclxuXHRcdFx0XHRpZiAoIHAgPT09IFJHQl9CUFRDX1VOU0lHTkVEX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JfQlBUQ19VTlNJR05FRF9GTE9BVF9FWFQ7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gUkdUQ1xyXG5cclxuXHRcdGlmICggcCA9PT0gUkVEX1JHVEMxX0Zvcm1hdCB8fCBwID09PSBTSUdORURfUkVEX1JHVEMxX0Zvcm1hdCB8fCBwID09PSBSRURfR1JFRU5fUkdUQzJfRm9ybWF0IHx8IHAgPT09IFNJR05FRF9SRURfR1JFRU5fUkdUQzJfRm9ybWF0ICkge1xyXG5cclxuXHRcdFx0ZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdFWFRfdGV4dHVyZV9jb21wcmVzc2lvbl9yZ3RjJyApO1xyXG5cclxuXHRcdFx0aWYgKCBleHRlbnNpb24gIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9CUFRDX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SRURfUkdUQzFfRVhUO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gU0lHTkVEX1JFRF9SR1RDMV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU0lHTkVEX1JFRF9SR1RDMV9FWFQ7XHJcblx0XHRcdFx0aWYgKCBwID09PSBSRURfR1JFRU5fUkdUQzJfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JFRF9HUkVFTl9SR1RDMl9FWFQ7XHJcblx0XHRcdFx0aWYgKCBwID09PSBTSUdORURfUkVEX0dSRUVOX1JHVEMyX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9TSUdORURfUkVEX0dSRUVOX1JHVEMyX0VYVDtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHJldHVybiBudWxsO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGlmICggcCA9PT0gVW5zaWduZWRJbnQyNDhUeXBlICkgcmV0dXJuIGdsLlVOU0lHTkVEX0lOVF8yNF84O1xyXG5cclxuXHRcdC8vIGlmIFwicFwiIGNhbid0IGJlIHJlc29sdmVkLCBhc3N1bWUgdGhlIHVzZXIgZGVmaW5lcyBhIFdlYkdMIGNvbnN0YW50IGFzIGEgc3RyaW5nIChmYWxsYmFjay93b3JrYXJvdW5kIGZvciBwYWNrZWQgUkdCIGZvcm1hdHMpXHJcblxyXG5cdFx0cmV0dXJuICggZ2xbIHAgXSAhPT0gdW5kZWZpbmVkICkgPyBnbFsgcCBdIDogbnVsbDtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4geyBjb252ZXJ0OiBjb252ZXJ0IH07XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgV2ViR0xVdGlscyB9O1xyXG4iLCJpbXBvcnQgeyBQbGFuZUdlb21ldHJ5IH0gZnJvbSAnLi4vLi4vZ2VvbWV0cmllcy9QbGFuZUdlb21ldHJ5LmpzJztcclxuaW1wb3J0IHsgU2hhZGVyTWF0ZXJpYWwgfSBmcm9tICcuLi8uLi9tYXRlcmlhbHMvU2hhZGVyTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyBNZXNoIH0gZnJvbSAnLi4vLi4vb2JqZWN0cy9NZXNoLmpzJztcclxuaW1wb3J0IHsgVGV4dHVyZSB9IGZyb20gJy4uLy4uL3RleHR1cmVzL1RleHR1cmUuanMnO1xyXG5cclxuY29uc3QgX29jY2x1c2lvbl92ZXJ0ZXggPSBgXHJcbnZvaWQgbWFpbigpIHtcclxuXHJcblx0Z2xfUG9zaXRpb24gPSB2ZWM0KCBwb3NpdGlvbiwgMS4wICk7XHJcblxyXG59YDtcclxuXHJcbmNvbnN0IF9vY2NsdXNpb25fZnJhZ21lbnQgPSBgXHJcbnVuaWZvcm0gc2FtcGxlcjJEQXJyYXkgZGVwdGhDb2xvcjtcclxudW5pZm9ybSBmbG9hdCBkZXB0aFdpZHRoO1xyXG51bmlmb3JtIGZsb2F0IGRlcHRoSGVpZ2h0O1xyXG5cclxudm9pZCBtYWluKCkge1xyXG5cclxuXHR2ZWMyIGNvb3JkID0gdmVjMiggZ2xfRnJhZ0Nvb3JkLnggLyBkZXB0aFdpZHRoLCBnbF9GcmFnQ29vcmQueSAvIGRlcHRoSGVpZ2h0ICk7XHJcblxyXG5cdGlmICggY29vcmQueCA+PSAxLjAgKSB7XHJcblxyXG5cdFx0Z2xfRnJhZ0RlcHRoID0gdGV4dHVyZSggZGVwdGhDb2xvciwgdmVjMyggY29vcmQueCAtIDEuMCwgY29vcmQueSwgMSApICkucjtcclxuXHJcblx0fSBlbHNlIHtcclxuXHJcblx0XHRnbF9GcmFnRGVwdGggPSB0ZXh0dXJlKCBkZXB0aENvbG9yLCB2ZWMzKCBjb29yZC54LCBjb29yZC55LCAwICkgKS5yO1xyXG5cclxuXHR9XHJcblxyXG59YDtcclxuXHJcbi8qKlxyXG4gKiBBIFhSIG1vZHVsZSB0aGF0IG1hbmFnZXMgdGhlIGFjY2VzcyB0byB0aGUgRGVwdGggU2Vuc2luZyBBUEkuXHJcbiAqL1xyXG5jbGFzcyBXZWJYUkRlcHRoU2Vuc2luZyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgZGVwdGggc2Vuc2luZyBtb2R1bGUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHRleHR1cmUgcmVwcmVzZW50aW5nIHRoZSBkZXB0aCBvZiB0aGUgdXNlcidzIGVudmlyb25tZW50LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50ZXh0dXJlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcGxhbmUgbWVzaCBmb3IgdmlzdWFsaXppbmcgdGhlIGRlcHRoIHRleHR1cmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9NZXNofVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1lc2ggPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGRlcHRoIG5lYXIgdmFsdWUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kZXB0aE5lYXIgPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGRlcHRoIG5lYXIgZmFyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGVwdGhGYXIgPSAwO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEluaXRzIHRoZSBkZXB0aCBzZW5zaW5nIG1vZHVsZVxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcGFyYW0ge1hSV2ViR0xEZXB0aEluZm9ybWF0aW9ufSBkZXB0aERhdGEgLSBUaGUgWFIgZGVwdGggZGF0YS5cclxuXHQgKiBAcGFyYW0ge1hSUmVuZGVyU3RhdGV9IHJlbmRlclN0YXRlIC0gVGhlIFhSIHJlbmRlciBzdGF0ZS5cclxuXHQgKi9cclxuXHRpbml0KCByZW5kZXJlciwgZGVwdGhEYXRhLCByZW5kZXJTdGF0ZSApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMudGV4dHVyZSA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGNvbnN0IHRleHR1cmUgPSBuZXcgVGV4dHVyZSgpO1xyXG5cclxuXHRcdFx0Y29uc3QgdGV4UHJvcHMgPSByZW5kZXJlci5wcm9wZXJ0aWVzLmdldCggdGV4dHVyZSApO1xyXG5cdFx0XHR0ZXhQcm9wcy5fX3dlYmdsVGV4dHVyZSA9IGRlcHRoRGF0YS50ZXh0dXJlO1xyXG5cclxuXHRcdFx0aWYgKCAoIGRlcHRoRGF0YS5kZXB0aE5lYXIgIT09IHJlbmRlclN0YXRlLmRlcHRoTmVhciApIHx8ICggZGVwdGhEYXRhLmRlcHRoRmFyICE9PSByZW5kZXJTdGF0ZS5kZXB0aEZhciApICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLmRlcHRoTmVhciA9IGRlcHRoRGF0YS5kZXB0aE5lYXI7XHJcblx0XHRcdFx0dGhpcy5kZXB0aEZhciA9IGRlcHRoRGF0YS5kZXB0aEZhcjtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMudGV4dHVyZSA9IHRleHR1cmU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBwbGFuZSBtZXNoIHRoYXQgdmlzdWFsaXplcyB0aGUgZGVwdGggdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXlDYW1lcmF9IGNhbWVyYVhSIC0gVGhlIFhSIGNhbWVyYS5cclxuXHQgKiBAcmV0dXJuIHs/TWVzaH0gVGhlIHBsYW5lIG1lc2guXHJcblx0ICovXHJcblx0Z2V0TWVzaCggY2FtZXJhWFIgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLnRleHR1cmUgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMubWVzaCA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0Y29uc3Qgdmlld3BvcnQgPSBjYW1lcmFYUi5jYW1lcmFzWyAwIF0udmlld3BvcnQ7XHJcblx0XHRcdFx0Y29uc3QgbWF0ZXJpYWwgPSBuZXcgU2hhZGVyTWF0ZXJpYWwoIHtcclxuXHRcdFx0XHRcdHZlcnRleFNoYWRlcjogX29jY2x1c2lvbl92ZXJ0ZXgsXHJcblx0XHRcdFx0XHRmcmFnbWVudFNoYWRlcjogX29jY2x1c2lvbl9mcmFnbWVudCxcclxuXHRcdFx0XHRcdHVuaWZvcm1zOiB7XHJcblx0XHRcdFx0XHRcdGRlcHRoQ29sb3I6IHsgdmFsdWU6IHRoaXMudGV4dHVyZSB9LFxyXG5cdFx0XHRcdFx0XHRkZXB0aFdpZHRoOiB7IHZhbHVlOiB2aWV3cG9ydC56IH0sXHJcblx0XHRcdFx0XHRcdGRlcHRoSGVpZ2h0OiB7IHZhbHVlOiB2aWV3cG9ydC53IH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRcdHRoaXMubWVzaCA9IG5ldyBNZXNoKCBuZXcgUGxhbmVHZW9tZXRyeSggMjAsIDIwICksIG1hdGVyaWFsICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzLm1lc2g7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVzZXRzIHRoZSBtb2R1bGVcclxuXHQgKi9cclxuXHRyZXNldCgpIHtcclxuXHJcblx0XHR0aGlzLnRleHR1cmUgPSBudWxsO1xyXG5cdFx0dGhpcy5tZXNoID0gbnVsbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgdGV4dHVyZSByZXByZXNlbnRpbmcgdGhlIGRlcHRoIG9mIHRoZSB1c2VyJ3MgZW52aXJvbm1lbnQuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHs/VGV4dHVyZX0gVGhlIGRlcHRoIHRleHR1cmUuXHJcblx0ICovXHJcblx0Z2V0RGVwdGhUZXh0dXJlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnRleHR1cmU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFdlYlhSRGVwdGhTZW5zaW5nIH07XHJcbiIsImltcG9ydCB7IEFycmF5Q2FtZXJhIH0gZnJvbSAnLi4vLi4vY2FtZXJhcy9BcnJheUNhbWVyYS5qcyc7XHJcbmltcG9ydCB7IEV2ZW50RGlzcGF0Y2hlciB9IGZyb20gJy4uLy4uL2NvcmUvRXZlbnREaXNwYXRjaGVyLmpzJztcclxuaW1wb3J0IHsgUGVyc3BlY3RpdmVDYW1lcmEgfSBmcm9tICcuLi8uLi9jYW1lcmFzL1BlcnNwZWN0aXZlQ2FtZXJhLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMi5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3I0IH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3I0LmpzJztcclxuaW1wb3J0IHsgUkFEMkRFRyB9IGZyb20gJy4uLy4uL21hdGgvTWF0aFV0aWxzLmpzJztcclxuaW1wb3J0IHsgV2ViR0xBbmltYXRpb24gfSBmcm9tICcuLi93ZWJnbC9XZWJHTEFuaW1hdGlvbi5qcyc7XHJcbmltcG9ydCB7IFdlYkdMUmVuZGVyVGFyZ2V0IH0gZnJvbSAnLi4vV2ViR0xSZW5kZXJUYXJnZXQuanMnO1xyXG5pbXBvcnQgeyBXZWJYUkNvbnRyb2xsZXIgfSBmcm9tICcuL1dlYlhSQ29udHJvbGxlci5qcyc7XHJcbmltcG9ydCB7IERlcHRoVGV4dHVyZSB9IGZyb20gJy4uLy4uL3RleHR1cmVzL0RlcHRoVGV4dHVyZS5qcyc7XHJcbmltcG9ydCB7IERlcHRoRm9ybWF0LCBEZXB0aFN0ZW5jaWxGb3JtYXQsIFJHQkFGb3JtYXQsIFVuc2lnbmVkQnl0ZVR5cGUsIFVuc2lnbmVkSW50VHlwZSwgVW5zaWduZWRJbnQyNDhUeXBlIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgV2ViWFJEZXB0aFNlbnNpbmcgfSBmcm9tICcuL1dlYlhSRGVwdGhTZW5zaW5nLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gYWJzdHJhY3Rpb24gb2YgdGhlIFdlYlhSIERldmljZSBBUEkgYW5kIGlzXHJcbiAqIGludGVybmFsbHkgdXNlZCBieSB7QGxpbmsgV2ViR0xSZW5kZXJlcn0uIGBXZWJYUk1hbmFnZXJgIGFsc28gcHJvdmlkZXMgYSBwdWJsaWNcclxuICogaW50ZXJmYWNlIHRoYXQgYWxsb3dzIHVzZXJzIHRvIGVuYWJsZS9kaXNhYmxlIFhSIGFuZCBwZXJmb3JtIFhSIHJlbGF0ZWRcclxuICogdGFza3MgbGlrZSBmb3IgaW5zdGFuY2UgcmV0cmlldmluZyBjb250cm9sbGVycy5cclxuICpcclxuICogQGF1Z21lbnRzIEV2ZW50RGlzcGF0Y2hlclxyXG4gKiBAaGlkZWNvbnN0cnVjdG9yXHJcbiAqL1xyXG5jbGFzcyBXZWJYUk1hbmFnZXIgZXh0ZW5kcyBFdmVudERpc3BhdGNoZXIge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IFdlYkdMIHJlbmRlcmVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcGFyYW0ge1dlYkdMMlJlbmRlcmluZ0NvbnRleHR9IGdsIC0gVGhlIHJlbmRlcmluZyBjb250ZXh0LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCByZW5kZXJlciwgZ2wgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHRjb25zdCBzY29wZSA9IHRoaXM7XHJcblxyXG5cdFx0bGV0IHNlc3Npb24gPSBudWxsO1xyXG5cclxuXHRcdGxldCBmcmFtZWJ1ZmZlclNjYWxlRmFjdG9yID0gMS4wO1xyXG5cclxuXHRcdGxldCByZWZlcmVuY2VTcGFjZSA9IG51bGw7XHJcblx0XHRsZXQgcmVmZXJlbmNlU3BhY2VUeXBlID0gJ2xvY2FsLWZsb29yJztcclxuXHRcdC8vIFNldCBkZWZhdWx0IGZvdmVhdGlvbiB0byBtYXhpbXVtLlxyXG5cdFx0bGV0IGZvdmVhdGlvbiA9IDEuMDtcclxuXHRcdGxldCBjdXN0b21SZWZlcmVuY2VTcGFjZSA9IG51bGw7XHJcblxyXG5cdFx0bGV0IHBvc2UgPSBudWxsO1xyXG5cdFx0bGV0IGdsQmluZGluZyA9IG51bGw7XHJcblx0XHRsZXQgZ2xQcm9qTGF5ZXIgPSBudWxsO1xyXG5cdFx0bGV0IGdsQmFzZUxheWVyID0gbnVsbDtcclxuXHRcdGxldCB4ckZyYW1lID0gbnVsbDtcclxuXHJcblx0XHRjb25zdCBkZXB0aFNlbnNpbmcgPSBuZXcgV2ViWFJEZXB0aFNlbnNpbmcoKTtcclxuXHRcdGNvbnN0IGF0dHJpYnV0ZXMgPSBnbC5nZXRDb250ZXh0QXR0cmlidXRlcygpO1xyXG5cclxuXHRcdGxldCBpbml0aWFsUmVuZGVyVGFyZ2V0ID0gbnVsbDtcclxuXHRcdGxldCBuZXdSZW5kZXJUYXJnZXQgPSBudWxsO1xyXG5cclxuXHRcdGNvbnN0IGNvbnRyb2xsZXJzID0gW107XHJcblx0XHRjb25zdCBjb250cm9sbGVySW5wdXRTb3VyY2VzID0gW107XHJcblxyXG5cdFx0Y29uc3QgY3VycmVudFNpemUgPSBuZXcgVmVjdG9yMigpO1xyXG5cdFx0bGV0IGN1cnJlbnRQaXhlbFJhdGlvID0gbnVsbDtcclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGNvbnN0IGNhbWVyYUwgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoKTtcclxuXHRcdGNhbWVyYUwudmlld3BvcnQgPSBuZXcgVmVjdG9yNCgpO1xyXG5cclxuXHRcdGNvbnN0IGNhbWVyYVIgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoKTtcclxuXHRcdGNhbWVyYVIudmlld3BvcnQgPSBuZXcgVmVjdG9yNCgpO1xyXG5cclxuXHRcdGNvbnN0IGNhbWVyYXMgPSBbIGNhbWVyYUwsIGNhbWVyYVIgXTtcclxuXHJcblx0XHRjb25zdCBjYW1lcmFYUiA9IG5ldyBBcnJheUNhbWVyYSgpO1xyXG5cclxuXHRcdGxldCBfY3VycmVudERlcHRoTmVhciA9IG51bGw7XHJcblx0XHRsZXQgX2N1cnJlbnREZXB0aEZhciA9IG51bGw7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIG1hbmFnZXIncyBYUiBjYW1lcmEgc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkgdXBkYXRlZCBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2FtZXJhQXV0b1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgbm90aWZpZXMgdGhlIHJlbmRlcmVyIHRvIGJlIHJlYWR5IGZvciBYUiByZW5kZXJpbmcuIFNldCBpdCB0byBgdHJ1ZWBcclxuXHRcdCAqIGlmIHlvdSBhcmUgZ29pbmcgdG8gdXNlIFhSIGluIHlvdXIgYXBwLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5lbmFibGVkID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIFhSIHByZXNlbnRhdGlvbiBpcyBhY3RpdmUgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzUHJlc2VudGluZyA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmV0dXJucyBhIGdyb3VwIHJlcHJlc2VudGluZyB0aGUgYHRhcmdldCByYXlgIHNwYWNlIG9mIHRoZSBYUiBjb250cm9sbGVyLlxyXG5cdFx0ICogVXNlIHRoaXMgc3BhY2UgZm9yIHZpc3VhbGl6aW5nIDNEIG9iamVjdHMgdGhhdCBzdXBwb3J0IHRoZSB1c2VyIGluIHBvaW50aW5nXHJcblx0XHQgKiB0YXNrcyBsaWtlIFVJIGludGVyYWN0aW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgY29udHJvbGxlci5cclxuXHRcdCAqIEByZXR1cm4ge0dyb3VwfSBBIGdyb3VwIHJlcHJlc2VudGluZyB0aGUgYHRhcmdldCByYXlgIHNwYWNlLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdldENvbnRyb2xsZXIgPSBmdW5jdGlvbiAoIGluZGV4ICkge1xyXG5cclxuXHRcdFx0bGV0IGNvbnRyb2xsZXIgPSBjb250cm9sbGVyc1sgaW5kZXggXTtcclxuXHJcblx0XHRcdGlmICggY29udHJvbGxlciA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRjb250cm9sbGVyID0gbmV3IFdlYlhSQ29udHJvbGxlcigpO1xyXG5cdFx0XHRcdGNvbnRyb2xsZXJzWyBpbmRleCBdID0gY29udHJvbGxlcjtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBjb250cm9sbGVyLmdldFRhcmdldFJheVNwYWNlKCk7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJldHVybnMgYSBncm91cCByZXByZXNlbnRpbmcgdGhlIGBncmlwYCBzcGFjZSBvZiB0aGUgWFIgY29udHJvbGxlci5cclxuXHRcdCAqIFVzZSB0aGlzIHNwYWNlIGZvciB2aXN1YWxpemluZyAzRCBvYmplY3RzIHRoYXQgc3VwcG9ydCB0aGUgdXNlciBpbiBwb2ludGluZ1xyXG5cdFx0ICogdGFza3MgbGlrZSBVSSBpbnRlcmFjdGlvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBOb3RlOiBJZiB5b3Ugd2FudCB0byBzaG93IHNvbWV0aGluZyBpbiB0aGUgdXNlcidzIGhhbmQgQU5EIG9mZmVyIGFcclxuXHRcdCAqIHBvaW50aW5nIHJheSBhdCB0aGUgc2FtZSB0aW1lLCB5b3UnbGwgd2FudCB0byBhdHRhY2hlZCB0aGUgaGFuZGhlbGQgb2JqZWN0XHJcblx0XHQgKiB0byB0aGUgZ3JvdXAgcmV0dXJuZWQgYnkgYGdldENvbnRyb2xsZXJHcmlwKClgIGFuZCB0aGUgcmF5IHRvIHRoZVxyXG5cdFx0ICogZ3JvdXAgcmV0dXJuZWQgYnkgYGdldENvbnRyb2xsZXIoKWAuIFRoZSBpZGVhIGlzIHRvIGhhdmUgdHdvXHJcblx0XHQgKiBkaWZmZXJlbnQgZ3JvdXBzIGluIHR3byBkaWZmZXJlbnQgY29vcmRpbmF0ZSBzcGFjZXMgZm9yIHRoZSBzYW1lIFdlYlhSXHJcblx0XHQgKiBjb250cm9sbGVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgY29udHJvbGxlci5cclxuXHRcdCAqIEByZXR1cm4ge0dyb3VwfSBBIGdyb3VwIHJlcHJlc2VudGluZyB0aGUgYGdyaXBgIHNwYWNlLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdldENvbnRyb2xsZXJHcmlwID0gZnVuY3Rpb24gKCBpbmRleCApIHtcclxuXHJcblx0XHRcdGxldCBjb250cm9sbGVyID0gY29udHJvbGxlcnNbIGluZGV4IF07XHJcblxyXG5cdFx0XHRpZiAoIGNvbnRyb2xsZXIgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0Y29udHJvbGxlciA9IG5ldyBXZWJYUkNvbnRyb2xsZXIoKTtcclxuXHRcdFx0XHRjb250cm9sbGVyc1sgaW5kZXggXSA9IGNvbnRyb2xsZXI7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gY29udHJvbGxlci5nZXRHcmlwU3BhY2UoKTtcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmV0dXJucyBhIGdyb3VwIHJlcHJlc2VudGluZyB0aGUgYGhhbmRgIHNwYWNlIG9mIHRoZSBYUiBjb250cm9sbGVyLlxyXG5cdFx0ICogVXNlIHRoaXMgc3BhY2UgZm9yIHZpc3VhbGl6aW5nIDNEIG9iamVjdHMgdGhhdCBzdXBwb3J0IHRoZSB1c2VyIGluIHBvaW50aW5nXHJcblx0XHQgKiB0YXNrcyBsaWtlIFVJIGludGVyYWN0aW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgY29udHJvbGxlci5cclxuXHRcdCAqIEByZXR1cm4ge0dyb3VwfSBBIGdyb3VwIHJlcHJlc2VudGluZyB0aGUgYGhhbmRgIHNwYWNlLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdldEhhbmQgPSBmdW5jdGlvbiAoIGluZGV4ICkge1xyXG5cclxuXHRcdFx0bGV0IGNvbnRyb2xsZXIgPSBjb250cm9sbGVyc1sgaW5kZXggXTtcclxuXHJcblx0XHRcdGlmICggY29udHJvbGxlciA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRjb250cm9sbGVyID0gbmV3IFdlYlhSQ29udHJvbGxlcigpO1xyXG5cdFx0XHRcdGNvbnRyb2xsZXJzWyBpbmRleCBdID0gY29udHJvbGxlcjtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBjb250cm9sbGVyLmdldEhhbmRTcGFjZSgpO1xyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRmdW5jdGlvbiBvblNlc3Npb25FdmVudCggZXZlbnQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBjb250cm9sbGVySW5kZXggPSBjb250cm9sbGVySW5wdXRTb3VyY2VzLmluZGV4T2YoIGV2ZW50LmlucHV0U291cmNlICk7XHJcblxyXG5cdFx0XHRpZiAoIGNvbnRyb2xsZXJJbmRleCA9PT0gLSAxICkge1xyXG5cclxuXHRcdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBjb250cm9sbGVyID0gY29udHJvbGxlcnNbIGNvbnRyb2xsZXJJbmRleCBdO1xyXG5cclxuXHRcdFx0aWYgKCBjb250cm9sbGVyICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnRyb2xsZXIudXBkYXRlKCBldmVudC5pbnB1dFNvdXJjZSwgZXZlbnQuZnJhbWUsIGN1c3RvbVJlZmVyZW5jZVNwYWNlIHx8IHJlZmVyZW5jZVNwYWNlICk7XHJcblx0XHRcdFx0Y29udHJvbGxlci5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6IGV2ZW50LnR5cGUsIGRhdGE6IGV2ZW50LmlucHV0U291cmNlIH0gKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0ZnVuY3Rpb24gb25TZXNzaW9uRW5kKCkge1xyXG5cclxuXHRcdFx0c2Vzc2lvbi5yZW1vdmVFdmVudExpc3RlbmVyKCAnc2VsZWN0Jywgb25TZXNzaW9uRXZlbnQgKTtcclxuXHRcdFx0c2Vzc2lvbi5yZW1vdmVFdmVudExpc3RlbmVyKCAnc2VsZWN0c3RhcnQnLCBvblNlc3Npb25FdmVudCApO1xyXG5cdFx0XHRzZXNzaW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdzZWxlY3RlbmQnLCBvblNlc3Npb25FdmVudCApO1xyXG5cdFx0XHRzZXNzaW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdzcXVlZXplJywgb25TZXNzaW9uRXZlbnQgKTtcclxuXHRcdFx0c2Vzc2lvbi5yZW1vdmVFdmVudExpc3RlbmVyKCAnc3F1ZWV6ZXN0YXJ0Jywgb25TZXNzaW9uRXZlbnQgKTtcclxuXHRcdFx0c2Vzc2lvbi5yZW1vdmVFdmVudExpc3RlbmVyKCAnc3F1ZWV6ZWVuZCcsIG9uU2Vzc2lvbkV2ZW50ICk7XHJcblx0XHRcdHNlc3Npb24ucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2VuZCcsIG9uU2Vzc2lvbkVuZCApO1xyXG5cdFx0XHRzZXNzaW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdpbnB1dHNvdXJjZXNjaGFuZ2UnLCBvbklucHV0U291cmNlc0NoYW5nZSApO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgY29udHJvbGxlcnMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBpbnB1dFNvdXJjZSA9IGNvbnRyb2xsZXJJbnB1dFNvdXJjZXNbIGkgXTtcclxuXHJcblx0XHRcdFx0aWYgKCBpbnB1dFNvdXJjZSA9PT0gbnVsbCApIGNvbnRpbnVlO1xyXG5cclxuXHRcdFx0XHRjb250cm9sbGVySW5wdXRTb3VyY2VzWyBpIF0gPSBudWxsO1xyXG5cclxuXHRcdFx0XHRjb250cm9sbGVyc1sgaSBdLmRpc2Nvbm5lY3QoIGlucHV0U291cmNlICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRfY3VycmVudERlcHRoTmVhciA9IG51bGw7XHJcblx0XHRcdF9jdXJyZW50RGVwdGhGYXIgPSBudWxsO1xyXG5cclxuXHRcdFx0ZGVwdGhTZW5zaW5nLnJlc2V0KCk7XHJcblxyXG5cdFx0XHQvLyByZXN0b3JlIGZyYW1lYnVmZmVyL3JlbmRlcmluZyBzdGF0ZVxyXG5cclxuXHRcdFx0cmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCBpbml0aWFsUmVuZGVyVGFyZ2V0ICk7XHJcblxyXG5cdFx0XHRnbEJhc2VMYXllciA9IG51bGw7XHJcblx0XHRcdGdsUHJvakxheWVyID0gbnVsbDtcclxuXHRcdFx0Z2xCaW5kaW5nID0gbnVsbDtcclxuXHRcdFx0c2Vzc2lvbiA9IG51bGw7XHJcblx0XHRcdG5ld1JlbmRlclRhcmdldCA9IG51bGw7XHJcblxyXG5cdFx0XHQvL1xyXG5cclxuXHRcdFx0YW5pbWF0aW9uLnN0b3AoKTtcclxuXHJcblx0XHRcdHNjb3BlLmlzUHJlc2VudGluZyA9IGZhbHNlO1xyXG5cclxuXHRcdFx0cmVuZGVyZXIuc2V0UGl4ZWxSYXRpbyggY3VycmVudFBpeGVsUmF0aW8gKTtcclxuXHRcdFx0cmVuZGVyZXIuc2V0U2l6ZSggY3VycmVudFNpemUud2lkdGgsIGN1cnJlbnRTaXplLmhlaWdodCwgZmFsc2UgKTtcclxuXHJcblx0XHRcdHNjb3BlLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ3Nlc3Npb25lbmQnIH0gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTZXRzIHRoZSBmcmFtZWJ1ZmZlciBzY2FsZSBmYWN0b3IuXHJcblx0XHQgKlxyXG5cdFx0ICogVGhpcyBtZXRob2QgY2FuIG5vdCBiZSB1c2VkIGR1cmluZyBhIFhSIHNlc3Npb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIGZyYW1lYnVmZmVyIHNjYWxlIGZhY3Rvci5cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zZXRGcmFtZWJ1ZmZlclNjYWxlRmFjdG9yID0gZnVuY3Rpb24gKCB2YWx1ZSApIHtcclxuXHJcblx0XHRcdGZyYW1lYnVmZmVyU2NhbGVGYWN0b3IgPSB2YWx1ZTtcclxuXHJcblx0XHRcdGlmICggc2NvcGUuaXNQcmVzZW50aW5nID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJYUk1hbmFnZXI6IENhbm5vdCBjaGFuZ2UgZnJhbWVidWZmZXIgc2NhbGUgd2hpbGUgcHJlc2VudGluZy4nICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNldHMgdGhlIHJlZmVyZW5jZSBzcGFjZSB0eXBlLiBDYW4gYmUgdXNlZCB0byBjb25maWd1cmUgYSBzcGF0aWFsIHJlbGF0aW9uc2hpcCB3aXRoIHRoZSB1c2VyJ3MgcGh5c2ljYWxcclxuXHRcdCAqIGVudmlyb25tZW50LiBEZXBlbmRpbmcgb24gaG93IHRoZSB1c2VyIG1vdmVzIGluIDNEIHNwYWNlLCBzZXR0aW5nIGFuIGFwcHJvcHJpYXRlIHJlZmVyZW5jZSBzcGFjZSBjYW5cclxuXHRcdCAqIGltcHJvdmUgdHJhY2tpbmcuIERlZmF1bHQgaXMgYGxvY2FsLWZsb29yYC5cclxuXHRcdCAqXHJcblx0XHQgKiBUaGlzIG1ldGhvZCBjYW4gbm90IGJlIHVzZWQgZHVyaW5nIGEgWFIgc2Vzc2lvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBUaGUgcmVmZXJlbmNlIHNwYWNlIHR5cGUuXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2V0UmVmZXJlbmNlU3BhY2VUeXBlID0gZnVuY3Rpb24gKCB2YWx1ZSApIHtcclxuXHJcblx0XHRcdHJlZmVyZW5jZVNwYWNlVHlwZSA9IHZhbHVlO1xyXG5cclxuXHRcdFx0aWYgKCBzY29wZS5pc1ByZXNlbnRpbmcgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYlhSTWFuYWdlcjogQ2Fubm90IGNoYW5nZSByZWZlcmVuY2Ugc3BhY2UgdHlwZSB3aGlsZSBwcmVzZW50aW5nLicgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmV0dXJucyB0aGUgWFIgcmVmZXJlbmNlIHNwYWNlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEByZXR1cm4ge1hSUmVmZXJlbmNlU3BhY2V9IFRoZSBYUiByZWZlcmVuY2Ugc3BhY2UuXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ2V0UmVmZXJlbmNlU3BhY2UgPSBmdW5jdGlvbiAoKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gY3VzdG9tUmVmZXJlbmNlU3BhY2UgfHwgcmVmZXJlbmNlU3BhY2U7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNldHMgYSBjdXN0b20gWFIgcmVmZXJlbmNlIHNwYWNlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7WFJSZWZlcmVuY2VTcGFjZX0gc3BhY2UgLSBUaGUgWFIgcmVmZXJlbmNlIHNwYWNlLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNldFJlZmVyZW5jZVNwYWNlID0gZnVuY3Rpb24gKCBzcGFjZSApIHtcclxuXHJcblx0XHRcdGN1c3RvbVJlZmVyZW5jZVNwYWNlID0gc3BhY2U7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJldHVybnMgdGhlIGN1cnJlbnQgYmFzZSBsYXllci5cclxuXHRcdCAqXHJcblx0XHQgKiBAcmV0dXJuIHs/KFhSV2ViR0xMYXllcnxYUlByb2plY3Rpb25MYXllcil9IFRoZSBYUiBiYXNlIGxheWVyLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdldEJhc2VMYXllciA9IGZ1bmN0aW9uICgpIHtcclxuXHJcblx0XHRcdHJldHVybiBnbFByb2pMYXllciAhPT0gbnVsbCA/IGdsUHJvakxheWVyIDogZ2xCYXNlTGF5ZXI7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJldHVybnMgdGhlIGN1cnJlbnQgWFIgYmluZGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAcmV0dXJuIHs/WFJXZWJHTEJpbmRpbmd9IFRoZSBYUiBiaW5kaW5nLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdldEJpbmRpbmcgPSBmdW5jdGlvbiAoKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gZ2xCaW5kaW5nO1xyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXR1cm5zIHRoZSBjdXJyZW50IFhSIGZyYW1lLlxyXG5cdFx0ICpcclxuXHRcdCAqIEByZXR1cm4gez9YUkZyYW1lfSBUaGUgWFIgZnJhbWUuIFJldHVybnMgYG51bGxgIHdoZW4gdXNlZCBvdXRzaWRlIGEgWFIgc2Vzc2lvbi5cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nZXRGcmFtZSA9IGZ1bmN0aW9uICgpIHtcclxuXHJcblx0XHRcdHJldHVybiB4ckZyYW1lO1xyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXR1cm5zIHRoZSBjdXJyZW50IFhSIHNlc3Npb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHJldHVybiB7P1hSU2Vzc2lvbn0gVGhlIFhSIHNlc3Npb24uIFJldHVybnMgYG51bGxgIHdoZW4gdXNlZCBvdXRzaWRlIGEgWFIgc2Vzc2lvbi5cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nZXRTZXNzaW9uID0gZnVuY3Rpb24gKCkge1xyXG5cclxuXHRcdFx0cmV0dXJuIHNlc3Npb247XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFmdGVyIGEgWFIgc2Vzc2lvbiBoYXMgYmVlbiByZXF1ZXN0ZWQgdXN1YWxseSB3aXRoIG9uZSBvZiB0aGUgYCpCdXR0b25gIG1vZHVsZXMsIGl0XHJcblx0XHQgKiBpcyBpbmplY3RlZCBpbnRvIHRoZSByZW5kZXJlciB3aXRoIHRoaXMgbWV0aG9kLiBUaGlzIG1ldGhvZCB0cmlnZ2VycyB0aGUgc3RhcnQgb2ZcclxuXHRcdCAqIHRoZSBhY3R1YWwgWFIgcmVuZGVyaW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBhc3luY1xyXG5cdFx0ICogQHBhcmFtIHtYUlNlc3Npb259IHZhbHVlIC0gVGhlIFhSIHNlc3Npb24gdG8gc2V0LlxyXG5cdFx0ICogQHJldHVybiB7UHJvbWlzZX0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgc2Vzc2lvbiBoYXMgYmVlbiBzZXQuXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2V0U2Vzc2lvbiA9IGFzeW5jIGZ1bmN0aW9uICggdmFsdWUgKSB7XHJcblxyXG5cdFx0XHRzZXNzaW9uID0gdmFsdWU7XHJcblxyXG5cdFx0XHRpZiAoIHNlc3Npb24gIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdGluaXRpYWxSZW5kZXJUYXJnZXQgPSByZW5kZXJlci5nZXRSZW5kZXJUYXJnZXQoKTtcclxuXHJcblx0XHRcdFx0c2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCAnc2VsZWN0Jywgb25TZXNzaW9uRXZlbnQgKTtcclxuXHRcdFx0XHRzZXNzaW9uLmFkZEV2ZW50TGlzdGVuZXIoICdzZWxlY3RzdGFydCcsIG9uU2Vzc2lvbkV2ZW50ICk7XHJcblx0XHRcdFx0c2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCAnc2VsZWN0ZW5kJywgb25TZXNzaW9uRXZlbnQgKTtcclxuXHRcdFx0XHRzZXNzaW9uLmFkZEV2ZW50TGlzdGVuZXIoICdzcXVlZXplJywgb25TZXNzaW9uRXZlbnQgKTtcclxuXHRcdFx0XHRzZXNzaW9uLmFkZEV2ZW50TGlzdGVuZXIoICdzcXVlZXplc3RhcnQnLCBvblNlc3Npb25FdmVudCApO1xyXG5cdFx0XHRcdHNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lciggJ3NxdWVlemVlbmQnLCBvblNlc3Npb25FdmVudCApO1xyXG5cdFx0XHRcdHNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lciggJ2VuZCcsIG9uU2Vzc2lvbkVuZCApO1xyXG5cdFx0XHRcdHNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lciggJ2lucHV0c291cmNlc2NoYW5nZScsIG9uSW5wdXRTb3VyY2VzQ2hhbmdlICk7XHJcblxyXG5cdFx0XHRcdGlmICggYXR0cmlidXRlcy54ckNvbXBhdGlibGUgIT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0YXdhaXQgZ2wubWFrZVhSQ29tcGF0aWJsZSgpO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGN1cnJlbnRQaXhlbFJhdGlvID0gcmVuZGVyZXIuZ2V0UGl4ZWxSYXRpbygpO1xyXG5cdFx0XHRcdHJlbmRlcmVyLmdldFNpemUoIGN1cnJlbnRTaXplICk7XHJcblxyXG5cdFx0XHRcdC8vIENoZWNrIHRoYXQgdGhlIGJyb3dzZXIgaW1wbGVtZW50cyB0aGUgbmVjZXNzYXJ5IEFQSXMgdG8gdXNlIGFuXHJcblx0XHRcdFx0Ly8gWFJQcm9qZWN0aW9uTGF5ZXIgcmF0aGVyIHRoYW4gYW4gWFJXZWJHTExheWVyXHJcblx0XHRcdFx0Y29uc3QgdXNlTGF5ZXJzID0gdHlwZW9mIFhSV2ViR0xCaW5kaW5nICE9PSAndW5kZWZpbmVkJyAmJiAnY3JlYXRlUHJvamVjdGlvbkxheWVyJyBpbiBYUldlYkdMQmluZGluZy5wcm90b3R5cGU7XHJcblxyXG5cdFx0XHRcdGlmICggISB1c2VMYXllcnMgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgbGF5ZXJJbml0ID0ge1xyXG5cdFx0XHRcdFx0XHRhbnRpYWxpYXM6IGF0dHJpYnV0ZXMuYW50aWFsaWFzLFxyXG5cdFx0XHRcdFx0XHRhbHBoYTogdHJ1ZSxcclxuXHRcdFx0XHRcdFx0ZGVwdGg6IGF0dHJpYnV0ZXMuZGVwdGgsXHJcblx0XHRcdFx0XHRcdHN0ZW5jaWw6IGF0dHJpYnV0ZXMuc3RlbmNpbCxcclxuXHRcdFx0XHRcdFx0ZnJhbWVidWZmZXJTY2FsZUZhY3RvcjogZnJhbWVidWZmZXJTY2FsZUZhY3RvclxyXG5cdFx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0XHRnbEJhc2VMYXllciA9IG5ldyBYUldlYkdMTGF5ZXIoIHNlc3Npb24sIGdsLCBsYXllckluaXQgKTtcclxuXHJcblx0XHRcdFx0XHRzZXNzaW9uLnVwZGF0ZVJlbmRlclN0YXRlKCB7IGJhc2VMYXllcjogZ2xCYXNlTGF5ZXIgfSApO1xyXG5cclxuXHRcdFx0XHRcdHJlbmRlcmVyLnNldFBpeGVsUmF0aW8oIDEgKTtcclxuXHRcdFx0XHRcdHJlbmRlcmVyLnNldFNpemUoIGdsQmFzZUxheWVyLmZyYW1lYnVmZmVyV2lkdGgsIGdsQmFzZUxheWVyLmZyYW1lYnVmZmVySGVpZ2h0LCBmYWxzZSApO1xyXG5cclxuXHRcdFx0XHRcdG5ld1JlbmRlclRhcmdldCA9IG5ldyBXZWJHTFJlbmRlclRhcmdldChcclxuXHRcdFx0XHRcdFx0Z2xCYXNlTGF5ZXIuZnJhbWVidWZmZXJXaWR0aCxcclxuXHRcdFx0XHRcdFx0Z2xCYXNlTGF5ZXIuZnJhbWVidWZmZXJIZWlnaHQsXHJcblx0XHRcdFx0XHRcdHtcclxuXHRcdFx0XHRcdFx0XHRmb3JtYXQ6IFJHQkFGb3JtYXQsXHJcblx0XHRcdFx0XHRcdFx0dHlwZTogVW5zaWduZWRCeXRlVHlwZSxcclxuXHRcdFx0XHRcdFx0XHRjb2xvclNwYWNlOiByZW5kZXJlci5vdXRwdXRDb2xvclNwYWNlLFxyXG5cdFx0XHRcdFx0XHRcdHN0ZW5jaWxCdWZmZXI6IGF0dHJpYnV0ZXMuc3RlbmNpbCxcclxuXHRcdFx0XHRcdFx0XHRyZXNvbHZlRGVwdGhCdWZmZXI6ICggZ2xCYXNlTGF5ZXIuaWdub3JlRGVwdGhWYWx1ZXMgPT09IGZhbHNlICksXHJcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZVN0ZW5jaWxCdWZmZXI6ICggZ2xCYXNlTGF5ZXIuaWdub3JlRGVwdGhWYWx1ZXMgPT09IGZhbHNlIClcclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdCk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0bGV0IGRlcHRoRm9ybWF0ID0gbnVsbDtcclxuXHRcdFx0XHRcdGxldCBkZXB0aFR5cGUgPSBudWxsO1xyXG5cdFx0XHRcdFx0bGV0IGdsRGVwdGhGb3JtYXQgPSBudWxsO1xyXG5cclxuXHRcdFx0XHRcdGlmICggYXR0cmlidXRlcy5kZXB0aCApIHtcclxuXHJcblx0XHRcdFx0XHRcdGdsRGVwdGhGb3JtYXQgPSBhdHRyaWJ1dGVzLnN0ZW5jaWwgPyBnbC5ERVBUSDI0X1NURU5DSUw4IDogZ2wuREVQVEhfQ09NUE9ORU5UMjQ7XHJcblx0XHRcdFx0XHRcdGRlcHRoRm9ybWF0ID0gYXR0cmlidXRlcy5zdGVuY2lsID8gRGVwdGhTdGVuY2lsRm9ybWF0IDogRGVwdGhGb3JtYXQ7XHJcblx0XHRcdFx0XHRcdGRlcHRoVHlwZSA9IGF0dHJpYnV0ZXMuc3RlbmNpbCA/IFVuc2lnbmVkSW50MjQ4VHlwZSA6IFVuc2lnbmVkSW50VHlwZTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgcHJvamVjdGlvbmxheWVySW5pdCA9IHtcclxuXHRcdFx0XHRcdFx0Y29sb3JGb3JtYXQ6IGdsLlJHQkE4LFxyXG5cdFx0XHRcdFx0XHRkZXB0aEZvcm1hdDogZ2xEZXB0aEZvcm1hdCxcclxuXHRcdFx0XHRcdFx0c2NhbGVGYWN0b3I6IGZyYW1lYnVmZmVyU2NhbGVGYWN0b3JcclxuXHRcdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdFx0Z2xCaW5kaW5nID0gbmV3IFhSV2ViR0xCaW5kaW5nKCBzZXNzaW9uLCBnbCApO1xyXG5cclxuXHRcdFx0XHRcdGdsUHJvakxheWVyID0gZ2xCaW5kaW5nLmNyZWF0ZVByb2plY3Rpb25MYXllciggcHJvamVjdGlvbmxheWVySW5pdCApO1xyXG5cclxuXHRcdFx0XHRcdHNlc3Npb24udXBkYXRlUmVuZGVyU3RhdGUoIHsgbGF5ZXJzOiBbIGdsUHJvakxheWVyIF0gfSApO1xyXG5cclxuXHRcdFx0XHRcdHJlbmRlcmVyLnNldFBpeGVsUmF0aW8oIDEgKTtcclxuXHRcdFx0XHRcdHJlbmRlcmVyLnNldFNpemUoIGdsUHJvakxheWVyLnRleHR1cmVXaWR0aCwgZ2xQcm9qTGF5ZXIudGV4dHVyZUhlaWdodCwgZmFsc2UgKTtcclxuXHJcblx0XHRcdFx0XHRuZXdSZW5kZXJUYXJnZXQgPSBuZXcgV2ViR0xSZW5kZXJUYXJnZXQoXHJcblx0XHRcdFx0XHRcdGdsUHJvakxheWVyLnRleHR1cmVXaWR0aCxcclxuXHRcdFx0XHRcdFx0Z2xQcm9qTGF5ZXIudGV4dHVyZUhlaWdodCxcclxuXHRcdFx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0XHRcdGZvcm1hdDogUkdCQUZvcm1hdCxcclxuXHRcdFx0XHRcdFx0XHR0eXBlOiBVbnNpZ25lZEJ5dGVUeXBlLFxyXG5cdFx0XHRcdFx0XHRcdGRlcHRoVGV4dHVyZTogbmV3IERlcHRoVGV4dHVyZSggZ2xQcm9qTGF5ZXIudGV4dHVyZVdpZHRoLCBnbFByb2pMYXllci50ZXh0dXJlSGVpZ2h0LCBkZXB0aFR5cGUsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGRlcHRoRm9ybWF0ICksXHJcblx0XHRcdFx0XHRcdFx0c3RlbmNpbEJ1ZmZlcjogYXR0cmlidXRlcy5zdGVuY2lsLFxyXG5cdFx0XHRcdFx0XHRcdGNvbG9yU3BhY2U6IHJlbmRlcmVyLm91dHB1dENvbG9yU3BhY2UsXHJcblx0XHRcdFx0XHRcdFx0c2FtcGxlczogYXR0cmlidXRlcy5hbnRpYWxpYXMgPyA0IDogMCxcclxuXHRcdFx0XHRcdFx0XHRyZXNvbHZlRGVwdGhCdWZmZXI6ICggZ2xQcm9qTGF5ZXIuaWdub3JlRGVwdGhWYWx1ZXMgPT09IGZhbHNlICksXHJcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZVN0ZW5jaWxCdWZmZXI6ICggZ2xQcm9qTGF5ZXIuaWdub3JlRGVwdGhWYWx1ZXMgPT09IGZhbHNlIClcclxuXHRcdFx0XHRcdFx0fSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdG5ld1JlbmRlclRhcmdldC5pc1hSUmVuZGVyVGFyZ2V0ID0gdHJ1ZTsgLy8gVE9ETyBSZW1vdmUgdGhpcyB3aGVuIHBvc3NpYmxlLCBzZWUgIzIzMjc4XHJcblxyXG5cdFx0XHRcdHRoaXMuc2V0Rm92ZWF0aW9uKCBmb3ZlYXRpb24gKTtcclxuXHJcblx0XHRcdFx0Y3VzdG9tUmVmZXJlbmNlU3BhY2UgPSBudWxsO1xyXG5cdFx0XHRcdHJlZmVyZW5jZVNwYWNlID0gYXdhaXQgc2Vzc2lvbi5yZXF1ZXN0UmVmZXJlbmNlU3BhY2UoIHJlZmVyZW5jZVNwYWNlVHlwZSApO1xyXG5cclxuXHRcdFx0XHRhbmltYXRpb24uc2V0Q29udGV4dCggc2Vzc2lvbiApO1xyXG5cdFx0XHRcdGFuaW1hdGlvbi5zdGFydCgpO1xyXG5cclxuXHRcdFx0XHRzY29wZS5pc1ByZXNlbnRpbmcgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHRzY29wZS5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdzZXNzaW9uc3RhcnQnIH0gKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmV0dXJucyB0aGUgZW52aXJvbm1lbnQgYmxlbmQgbW9kZSBmcm9tIHRoZSBjdXJyZW50IFhSIHNlc3Npb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHJldHVybiB7J29wYXF1ZSd8J2FkZGl0aXZlJ3wnYWxwaGEtYmxlbmQnfHVuZGVmaW5lZH0gVGhlIGVudmlyb25tZW50IGJsZW5kIG1vZGUuIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB1c2VkIG91dHNpZGUgb2YgYSBYUiBzZXNzaW9uLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdldEVudmlyb25tZW50QmxlbmRNb2RlID0gZnVuY3Rpb24gKCkge1xyXG5cclxuXHRcdFx0aWYgKCBzZXNzaW9uICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gc2Vzc2lvbi5lbnZpcm9ubWVudEJsZW5kTW9kZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmV0dXJucyB0aGUgY3VycmVudCBkZXB0aCB0ZXh0dXJlIGNvbXB1dGVkIHZpYSBkZXB0aCBzZW5zaW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEByZXR1cm4gez9UZXh0dXJlfSBUaGUgZGVwdGggdGV4dHVyZS5cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nZXREZXB0aFRleHR1cmUgPSBmdW5jdGlvbiAoKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gZGVwdGhTZW5zaW5nLmdldERlcHRoVGV4dHVyZSgpO1xyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0ZnVuY3Rpb24gb25JbnB1dFNvdXJjZXNDaGFuZ2UoIGV2ZW50ICkge1xyXG5cclxuXHRcdFx0Ly8gTm90aWZ5IGRpc2Nvbm5lY3RlZFxyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgZXZlbnQucmVtb3ZlZC5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGlucHV0U291cmNlID0gZXZlbnQucmVtb3ZlZFsgaSBdO1xyXG5cdFx0XHRcdGNvbnN0IGluZGV4ID0gY29udHJvbGxlcklucHV0U291cmNlcy5pbmRleE9mKCBpbnB1dFNvdXJjZSApO1xyXG5cclxuXHRcdFx0XHRpZiAoIGluZGV4ID49IDAgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29udHJvbGxlcklucHV0U291cmNlc1sgaW5kZXggXSA9IG51bGw7XHJcblx0XHRcdFx0XHRjb250cm9sbGVyc1sgaW5kZXggXS5kaXNjb25uZWN0KCBpbnB1dFNvdXJjZSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBOb3RpZnkgY29ubmVjdGVkXHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBldmVudC5hZGRlZC5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGlucHV0U291cmNlID0gZXZlbnQuYWRkZWRbIGkgXTtcclxuXHJcblx0XHRcdFx0bGV0IGNvbnRyb2xsZXJJbmRleCA9IGNvbnRyb2xsZXJJbnB1dFNvdXJjZXMuaW5kZXhPZiggaW5wdXRTb3VyY2UgKTtcclxuXHJcblx0XHRcdFx0aWYgKCBjb250cm9sbGVySW5kZXggPT09IC0gMSApIHtcclxuXHJcblx0XHRcdFx0XHQvLyBBc3NpZ24gaW5wdXQgc291cmNlIGEgY29udHJvbGxlciB0aGF0IGN1cnJlbnRseSBoYXMgbm8gaW5wdXQgc291cmNlXHJcblxyXG5cdFx0XHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgY29udHJvbGxlcnMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCBpID49IGNvbnRyb2xsZXJJbnB1dFNvdXJjZXMubGVuZ3RoICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRjb250cm9sbGVySW5wdXRTb3VyY2VzLnB1c2goIGlucHV0U291cmNlICk7XHJcblx0XHRcdFx0XHRcdFx0Y29udHJvbGxlckluZGV4ID0gaTtcclxuXHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIGNvbnRyb2xsZXJJbnB1dFNvdXJjZXNbIGkgXSA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0Y29udHJvbGxlcklucHV0U291cmNlc1sgaSBdID0gaW5wdXRTb3VyY2U7XHJcblx0XHRcdFx0XHRcdFx0Y29udHJvbGxlckluZGV4ID0gaTtcclxuXHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Ly8gSWYgYWxsIGNvbnRyb2xsZXJzIGRvIGN1cnJlbnRseSByZWNlaXZlIGlucHV0IHdlIGlnbm9yZSBuZXcgb25lc1xyXG5cclxuXHRcdFx0XHRcdGlmICggY29udHJvbGxlckluZGV4ID09PSAtIDEgKSBicmVhaztcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRjb25zdCBjb250cm9sbGVyID0gY29udHJvbGxlcnNbIGNvbnRyb2xsZXJJbmRleCBdO1xyXG5cclxuXHRcdFx0XHRpZiAoIGNvbnRyb2xsZXIgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29udHJvbGxlci5jb25uZWN0KCBpbnB1dFNvdXJjZSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0Y29uc3QgY2FtZXJhTFBvcyA9IG5ldyBWZWN0b3IzKCk7XHJcblx0XHRjb25zdCBjYW1lcmFSUG9zID0gbmV3IFZlY3RvcjMoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFzc3VtZXMgMiBjYW1lcmFzIHRoYXQgYXJlIHBhcmFsbGVsIGFuZCBzaGFyZSBhbiBYLWF4aXMsIGFuZCB0aGF0XHJcblx0XHQgKiB0aGUgY2FtZXJhcycgcHJvamVjdGlvbiBhbmQgd29ybGQgbWF0cmljZXMgaGF2ZSBhbHJlYWR5IGJlZW4gc2V0LlxyXG5cdFx0ICogQW5kIHRoYXQgbmVhciBhbmQgZmFyIHBsYW5lcyBhcmUgaWRlbnRpY2FsIGZvciBib3RoIGNhbWVyYXMuXHJcblx0XHQgKiBWaXN1YWxpemF0aW9uIG9mIHRoaXMgdGVjaG5pcXVlOiBodHRwczovL2NvbXB1dGVyZ3JhcGhpY3Muc3RhY2tleGNoYW5nZS5jb20vYS80NzY1XHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtBcnJheUNhbWVyYX0gY2FtZXJhIC0gVGhlIGNhbWVyYSB0byB1cGRhdGUuXHJcblx0XHQgKiBAcGFyYW0ge1BlcnNwZWN0aXZlQ2FtZXJhfSBjYW1lcmFMIC0gVGhlIGxlZnQgY2FtZXJhLlxyXG5cdFx0ICogQHBhcmFtIHtQZXJzcGVjdGl2ZUNhbWVyYX0gY2FtZXJhUiAtIFRoZSByaWdodCBjYW1lcmEuXHJcblx0XHQgKi9cclxuXHRcdGZ1bmN0aW9uIHNldFByb2plY3Rpb25Gcm9tVW5pb24oIGNhbWVyYSwgY2FtZXJhTCwgY2FtZXJhUiApIHtcclxuXHJcblx0XHRcdGNhbWVyYUxQb3Muc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBjYW1lcmFMLm1hdHJpeFdvcmxkICk7XHJcblx0XHRcdGNhbWVyYVJQb3Muc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBjYW1lcmFSLm1hdHJpeFdvcmxkICk7XHJcblxyXG5cdFx0XHRjb25zdCBpcGQgPSBjYW1lcmFMUG9zLmRpc3RhbmNlVG8oIGNhbWVyYVJQb3MgKTtcclxuXHJcblx0XHRcdGNvbnN0IHByb2pMID0gY2FtZXJhTC5wcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzO1xyXG5cdFx0XHRjb25zdCBwcm9qUiA9IGNhbWVyYVIucHJvamVjdGlvbk1hdHJpeC5lbGVtZW50cztcclxuXHJcblx0XHRcdC8vIFZSIHN5c3RlbXMgd2lsbCBoYXZlIGlkZW50aWNhbCBmYXIgYW5kIG5lYXIgcGxhbmVzLCBhbmRcclxuXHRcdFx0Ly8gbW9zdCBsaWtlbHkgaWRlbnRpY2FsIHRvcCBhbmQgYm90dG9tIGZydXN0dW0gZXh0ZW50cy5cclxuXHRcdFx0Ly8gVXNlIHRoZSBsZWZ0IGNhbWVyYSBmb3IgdGhlc2UgdmFsdWVzLlxyXG5cdFx0XHRjb25zdCBuZWFyID0gcHJvakxbIDE0IF0gLyAoIHByb2pMWyAxMCBdIC0gMSApO1xyXG5cdFx0XHRjb25zdCBmYXIgPSBwcm9qTFsgMTQgXSAvICggcHJvakxbIDEwIF0gKyAxICk7XHJcblx0XHRcdGNvbnN0IHRvcEZvdiA9ICggcHJvakxbIDkgXSArIDEgKSAvIHByb2pMWyA1IF07XHJcblx0XHRcdGNvbnN0IGJvdHRvbUZvdiA9ICggcHJvakxbIDkgXSAtIDEgKSAvIHByb2pMWyA1IF07XHJcblxyXG5cdFx0XHRjb25zdCBsZWZ0Rm92ID0gKCBwcm9qTFsgOCBdIC0gMSApIC8gcHJvakxbIDAgXTtcclxuXHRcdFx0Y29uc3QgcmlnaHRGb3YgPSAoIHByb2pSWyA4IF0gKyAxICkgLyBwcm9qUlsgMCBdO1xyXG5cdFx0XHRjb25zdCBsZWZ0ID0gbmVhciAqIGxlZnRGb3Y7XHJcblx0XHRcdGNvbnN0IHJpZ2h0ID0gbmVhciAqIHJpZ2h0Rm92O1xyXG5cclxuXHRcdFx0Ly8gQ2FsY3VsYXRlIHRoZSBuZXcgY2FtZXJhJ3MgcG9zaXRpb24gb2Zmc2V0IGZyb20gdGhlXHJcblx0XHRcdC8vIGxlZnQgY2FtZXJhLiB4T2Zmc2V0IHNob3VsZCBiZSByb3VnaGx5IGhhbGYgYGlwZGAuXHJcblx0XHRcdGNvbnN0IHpPZmZzZXQgPSBpcGQgLyAoIC0gbGVmdEZvdiArIHJpZ2h0Rm92ICk7XHJcblx0XHRcdGNvbnN0IHhPZmZzZXQgPSB6T2Zmc2V0ICogLSBsZWZ0Rm92O1xyXG5cclxuXHRcdFx0Ly8gVE9ETzogQmV0dGVyIHdheSB0byBhcHBseSB0aGlzIG9mZnNldD9cclxuXHRcdFx0Y2FtZXJhTC5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoIGNhbWVyYS5wb3NpdGlvbiwgY2FtZXJhLnF1YXRlcm5pb24sIGNhbWVyYS5zY2FsZSApO1xyXG5cdFx0XHRjYW1lcmEudHJhbnNsYXRlWCggeE9mZnNldCApO1xyXG5cdFx0XHRjYW1lcmEudHJhbnNsYXRlWiggek9mZnNldCApO1xyXG5cdFx0XHRjYW1lcmEubWF0cml4V29ybGQuY29tcG9zZSggY2FtZXJhLnBvc2l0aW9uLCBjYW1lcmEucXVhdGVybmlvbiwgY2FtZXJhLnNjYWxlICk7XHJcblx0XHRcdGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UuY29weSggY2FtZXJhLm1hdHJpeFdvcmxkICkuaW52ZXJ0KCk7XHJcblxyXG5cdFx0XHQvLyBDaGVjayBpZiB0aGUgcHJvamVjdGlvbiB1c2VzIGFuIGluZmluaXRlIGZhciBwbGFuZS5cclxuXHRcdFx0aWYgKCBwcm9qTFsgMTAgXSA9PT0gLSAxLjAgKSB7XHJcblxyXG5cdFx0XHRcdC8vIFVzZSB0aGUgcHJvamVjdGlvbiBtYXRyaXggZnJvbSB0aGUgbGVmdCBleWUuXHJcblx0XHRcdFx0Ly8gVGhlIGNhbWVyYSBvZmZzZXQgaXMgc3VmZmljaWVudCB0byBpbmNsdWRlIHRoZSB2aWV3IHZvbHVtZXNcclxuXHRcdFx0XHQvLyBvZiBib3RoIGV5ZXMgKGFzc3VtaW5nIHN5bW1ldHJpYyBwcm9qZWN0aW9ucykuXHJcblx0XHRcdFx0Y2FtZXJhLnByb2plY3Rpb25NYXRyaXguY29weSggY2FtZXJhTC5wcm9qZWN0aW9uTWF0cml4ICk7XHJcblx0XHRcdFx0Y2FtZXJhLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkoIGNhbWVyYUwucHJvamVjdGlvbk1hdHJpeEludmVyc2UgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdC8vIEZpbmQgdGhlIHVuaW9uIG9mIHRoZSBmcnVzdHVtIHZhbHVlcyBvZiB0aGUgY2FtZXJhcyBhbmQgc2NhbGVcclxuXHRcdFx0XHQvLyB0aGUgdmFsdWVzIHNvIHRoYXQgdGhlIG5lYXIgcGxhbmUncyBwb3NpdGlvbiBkb2VzIG5vdCBjaGFuZ2UgaW4gd29ybGQgc3BhY2UsXHJcblx0XHRcdFx0Ly8gYWx0aG91Z2ggbXVzdCBub3cgYmUgcmVsYXRpdmUgdG8gdGhlIG5ldyB1bmlvbiBjYW1lcmEuXHJcblx0XHRcdFx0Y29uc3QgbmVhcjIgPSBuZWFyICsgek9mZnNldDtcclxuXHRcdFx0XHRjb25zdCBmYXIyID0gZmFyICsgek9mZnNldDtcclxuXHRcdFx0XHRjb25zdCBsZWZ0MiA9IGxlZnQgLSB4T2Zmc2V0O1xyXG5cdFx0XHRcdGNvbnN0IHJpZ2h0MiA9IHJpZ2h0ICsgKCBpcGQgLSB4T2Zmc2V0ICk7XHJcblx0XHRcdFx0Y29uc3QgdG9wMiA9IHRvcEZvdiAqIGZhciAvIGZhcjIgKiBuZWFyMjtcclxuXHRcdFx0XHRjb25zdCBib3R0b20yID0gYm90dG9tRm92ICogZmFyIC8gZmFyMiAqIG5lYXIyO1xyXG5cclxuXHRcdFx0XHRjYW1lcmEucHJvamVjdGlvbk1hdHJpeC5tYWtlUGVyc3BlY3RpdmUoIGxlZnQyLCByaWdodDIsIHRvcDIsIGJvdHRvbTIsIG5lYXIyLCBmYXIyICk7XHJcblx0XHRcdFx0Y2FtZXJhLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkoIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4ICkuaW52ZXJ0KCk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIHVwZGF0ZUNhbWVyYSggY2FtZXJhLCBwYXJlbnQgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHBhcmVudCA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0Y2FtZXJhLm1hdHJpeFdvcmxkLmNvcHkoIGNhbWVyYS5tYXRyaXggKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGNhbWVyYS5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKCBwYXJlbnQubWF0cml4V29ybGQsIGNhbWVyYS5tYXRyaXggKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UuY29weSggY2FtZXJhLm1hdHJpeFdvcmxkICkuaW52ZXJ0KCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVXBkYXRlcyB0aGUgc3RhdGUgb2YgdGhlIFhSIGNhbWVyYS4gVXNlIHRoaXMgbWV0aG9kIG9uIGFwcCBsZXZlbCBpZiB5b3VcclxuXHRcdCAqIHNldCBjYW1lcmFBdXRvVXBkYXRlYCB0byBgZmFsc2VgLiBUaGUgbWV0aG9kIHJlcXVpcmVzIHRoZSBub24tWFJcclxuXHRcdCAqIGNhbWVyYSBvZiB0aGUgc2NlbmUgYXMgYSBwYXJhbWV0ZXIuIFRoZSBwYXNzZWQgaW4gY2FtZXJhJ3MgdHJhbnNmb3JtYXRpb25cclxuXHRcdCAqIGlzIGF1dG9tYXRpY2FsbHkgYWRqdXN0ZWQgdG8gdGhlIHBvc2l0aW9uIG9mIHRoZSBYUiBjYW1lcmEgd2hlbiBjYWxsaW5nXHJcblx0XHQgKiB0aGlzIG1ldGhvZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge0NhbWVyYX0gY2FtZXJhIC0gVGhlIGNhbWVyYS5cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51cGRhdGVDYW1lcmEgPSBmdW5jdGlvbiAoIGNhbWVyYSApIHtcclxuXHJcblx0XHRcdGlmICggc2Vzc2lvbiA9PT0gbnVsbCApIHJldHVybjtcclxuXHJcblx0XHRcdGxldCBkZXB0aE5lYXIgPSBjYW1lcmEubmVhcjtcclxuXHRcdFx0bGV0IGRlcHRoRmFyID0gY2FtZXJhLmZhcjtcclxuXHJcblx0XHRcdGlmICggZGVwdGhTZW5zaW5nLnRleHR1cmUgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggZGVwdGhTZW5zaW5nLmRlcHRoTmVhciA+IDAgKSBkZXB0aE5lYXIgPSBkZXB0aFNlbnNpbmcuZGVwdGhOZWFyO1xyXG5cdFx0XHRcdGlmICggZGVwdGhTZW5zaW5nLmRlcHRoRmFyID4gMCApIGRlcHRoRmFyID0gZGVwdGhTZW5zaW5nLmRlcHRoRmFyO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y2FtZXJhWFIubmVhciA9IGNhbWVyYVIubmVhciA9IGNhbWVyYUwubmVhciA9IGRlcHRoTmVhcjtcclxuXHRcdFx0Y2FtZXJhWFIuZmFyID0gY2FtZXJhUi5mYXIgPSBjYW1lcmFMLmZhciA9IGRlcHRoRmFyO1xyXG5cclxuXHRcdFx0aWYgKCBfY3VycmVudERlcHRoTmVhciAhPT0gY2FtZXJhWFIubmVhciB8fCBfY3VycmVudERlcHRoRmFyICE9PSBjYW1lcmFYUi5mYXIgKSB7XHJcblxyXG5cdFx0XHRcdC8vIE5vdGUgdGhhdCB0aGUgbmV3IHJlbmRlclN0YXRlIHdvbid0IGFwcGx5IHVudGlsIHRoZSBuZXh0IGZyYW1lLiBTZWUgIzE4MzIwXHJcblxyXG5cdFx0XHRcdHNlc3Npb24udXBkYXRlUmVuZGVyU3RhdGUoIHtcclxuXHRcdFx0XHRcdGRlcHRoTmVhcjogY2FtZXJhWFIubmVhcixcclxuXHRcdFx0XHRcdGRlcHRoRmFyOiBjYW1lcmFYUi5mYXJcclxuXHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRcdF9jdXJyZW50RGVwdGhOZWFyID0gY2FtZXJhWFIubmVhcjtcclxuXHRcdFx0XHRfY3VycmVudERlcHRoRmFyID0gY2FtZXJhWFIuZmFyO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y2FtZXJhTC5sYXllcnMubWFzayA9IGNhbWVyYS5sYXllcnMubWFzayB8IDBiMDEwO1xyXG5cdFx0XHRjYW1lcmFSLmxheWVycy5tYXNrID0gY2FtZXJhLmxheWVycy5tYXNrIHwgMGIxMDA7XHJcblx0XHRcdGNhbWVyYVhSLmxheWVycy5tYXNrID0gY2FtZXJhTC5sYXllcnMubWFzayB8IGNhbWVyYVIubGF5ZXJzLm1hc2s7XHJcblxyXG5cdFx0XHRjb25zdCBwYXJlbnQgPSBjYW1lcmEucGFyZW50O1xyXG5cdFx0XHRjb25zdCBjYW1lcmFzID0gY2FtZXJhWFIuY2FtZXJhcztcclxuXHJcblx0XHRcdHVwZGF0ZUNhbWVyYSggY2FtZXJhWFIsIHBhcmVudCApO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgY2FtZXJhcy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdHVwZGF0ZUNhbWVyYSggY2FtZXJhc1sgaSBdLCBwYXJlbnQgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIHVwZGF0ZSBwcm9qZWN0aW9uIG1hdHJpeCBmb3IgcHJvcGVyIHZpZXcgZnJ1c3R1bSBjdWxsaW5nXHJcblxyXG5cdFx0XHRpZiAoIGNhbWVyYXMubGVuZ3RoID09PSAyICkge1xyXG5cclxuXHRcdFx0XHRzZXRQcm9qZWN0aW9uRnJvbVVuaW9uKCBjYW1lcmFYUiwgY2FtZXJhTCwgY2FtZXJhUiApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0Ly8gYXNzdW1lIHNpbmdsZSBjYW1lcmEgc2V0dXAgKEFSKVxyXG5cclxuXHRcdFx0XHRjYW1lcmFYUi5wcm9qZWN0aW9uTWF0cml4LmNvcHkoIGNhbWVyYUwucHJvamVjdGlvbk1hdHJpeCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gdXBkYXRlIHVzZXIgY2FtZXJhIGFuZCBpdHMgY2hpbGRyZW5cclxuXHJcblx0XHRcdHVwZGF0ZVVzZXJDYW1lcmEoIGNhbWVyYSwgY2FtZXJhWFIsIHBhcmVudCApO1xyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0ZnVuY3Rpb24gdXBkYXRlVXNlckNhbWVyYSggY2FtZXJhLCBjYW1lcmFYUiwgcGFyZW50ICkge1xyXG5cclxuXHRcdFx0aWYgKCBwYXJlbnQgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdGNhbWVyYS5tYXRyaXguY29weSggY2FtZXJhWFIubWF0cml4V29ybGQgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGNhbWVyYS5tYXRyaXguY29weSggcGFyZW50Lm1hdHJpeFdvcmxkICk7XHJcblx0XHRcdFx0Y2FtZXJhLm1hdHJpeC5pbnZlcnQoKTtcclxuXHRcdFx0XHRjYW1lcmEubWF0cml4Lm11bHRpcGx5KCBjYW1lcmFYUi5tYXRyaXhXb3JsZCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y2FtZXJhLm1hdHJpeC5kZWNvbXBvc2UoIGNhbWVyYS5wb3NpdGlvbiwgY2FtZXJhLnF1YXRlcm5pb24sIGNhbWVyYS5zY2FsZSApO1xyXG5cdFx0XHRjYW1lcmEudXBkYXRlTWF0cml4V29ybGQoIHRydWUgKTtcclxuXHJcblx0XHRcdGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LmNvcHkoIGNhbWVyYVhSLnByb2plY3Rpb25NYXRyaXggKTtcclxuXHRcdFx0Y2FtZXJhLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkoIGNhbWVyYVhSLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlICk7XHJcblxyXG5cdFx0XHRpZiAoIGNhbWVyYS5pc1BlcnNwZWN0aXZlQ2FtZXJhICkge1xyXG5cclxuXHRcdFx0XHRjYW1lcmEuZm92ID0gUkFEMkRFRyAqIDIgKiBNYXRoLmF0YW4oIDEgLyBjYW1lcmEucHJvamVjdGlvbk1hdHJpeC5lbGVtZW50c1sgNSBdICk7XHJcblx0XHRcdFx0Y2FtZXJhLnpvb20gPSAxO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEFycmF5Q2FtZXJhfSB3aGljaCByZXByZXNlbnRzIHRoZSBYUiBjYW1lcmFcclxuXHRcdCAqIG9mIHRoZSBhY3RpdmUgWFIgc2Vzc2lvbi4gRm9yIGVhY2ggdmlldyBpdCBob2xkcyBhIHNlcGFyYXRlIGNhbWVyYSBvYmplY3QuXHJcblx0XHQgKlxyXG5cdFx0ICogVGhlIGNhbWVyYSdzIGBmb3ZgIGlzIGN1cnJlbnRseSBub3QgdXNlZCBhbmQgZG9lcyBub3QgcmVmbGVjdCB0aGUgZm92IG9mXHJcblx0XHQgKiB0aGUgWFIgY2FtZXJhLiBJZiB5b3UgbmVlZCB0aGUgZm92IG9uIGFwcCBsZXZlbCwgeW91IGhhdmUgdG8gY29tcHV0ZSBpblxyXG5cdFx0ICogbWFudWFsbHkgZnJvbSB0aGUgWFIgY2FtZXJhJ3MgcHJvamVjdGlvbiBtYXRyaWNlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAcmV0dXJuIHtBcnJheUNhbWVyYX0gVGhlIFhSIGNhbWVyYS5cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nZXRDYW1lcmEgPSBmdW5jdGlvbiAoKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gY2FtZXJhWFI7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJldHVybnMgdGhlIGFtb3VudCBvZiBmb3ZlYXRpb24gdXNlZCBieSB0aGUgWFIgY29tcG9zaXRvciBmb3IgdGhlIHByb2plY3Rpb24gbGF5ZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgYW1vdW50IG9mIGZvdmVhdGlvbi5cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nZXRGb3ZlYXRpb24gPSBmdW5jdGlvbiAoKSB7XHJcblxyXG5cdFx0XHRpZiAoIGdsUHJvakxheWVyID09PSBudWxsICYmIGdsQmFzZUxheWVyID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIGZvdmVhdGlvbjtcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU2V0cyB0aGUgZm92ZWF0aW9uIHZhbHVlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIEEgbnVtYmVyIGluIHRoZSByYW5nZSBgWzAsMV1gIHdoZXJlIGAwYCBtZWFucyBubyBmb3ZlYXRpb24gKGZ1bGwgcmVzb2x1dGlvbilcclxuXHRcdCAqIGFuZCBgMWAgbWVhbnMgbWF4aW11bSBmb3ZlYXRpb24gKHRoZSBlZGdlcyByZW5kZXIgYXQgbG93ZXIgcmVzb2x1dGlvbikuXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2V0Rm92ZWF0aW9uID0gZnVuY3Rpb24gKCB2YWx1ZSApIHtcclxuXHJcblx0XHRcdC8vIDAgPSBubyBmb3ZlYXRpb24gPSBmdWxsIHJlc29sdXRpb25cclxuXHRcdFx0Ly8gMSA9IG1heGltdW0gZm92ZWF0aW9uID0gdGhlIGVkZ2VzIHJlbmRlciBhdCBsb3dlciByZXNvbHV0aW9uXHJcblxyXG5cdFx0XHRmb3ZlYXRpb24gPSB2YWx1ZTtcclxuXHJcblx0XHRcdGlmICggZ2xQcm9qTGF5ZXIgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdGdsUHJvakxheWVyLmZpeGVkRm92ZWF0aW9uID0gdmFsdWU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIGdsQmFzZUxheWVyICE9PSBudWxsICYmIGdsQmFzZUxheWVyLmZpeGVkRm92ZWF0aW9uICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGdsQmFzZUxheWVyLmZpeGVkRm92ZWF0aW9uID0gdmFsdWU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJldHVybnMgYHRydWVgIGlmIGRlcHRoIHNlbnNpbmcgaXMgc3VwcG9ydGVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgZGVwdGggc2Vuc2luZyBpcyBzdXBwb3J0ZWQgb3Igbm90LlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmhhc0RlcHRoU2Vuc2luZyA9IGZ1bmN0aW9uICgpIHtcclxuXHJcblx0XHRcdHJldHVybiBkZXB0aFNlbnNpbmcudGV4dHVyZSAhPT0gbnVsbDtcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmV0dXJucyB0aGUgZGVwdGggc2Vuc2luZyBtZXNoLlxyXG5cdFx0ICpcclxuXHRcdCAqIEByZXR1cm4ge01lc2h9IFRoZSBkZXB0aCBzZW5zaW5nIG1lc2guXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ2V0RGVwdGhTZW5zaW5nTWVzaCA9IGZ1bmN0aW9uICgpIHtcclxuXHJcblx0XHRcdHJldHVybiBkZXB0aFNlbnNpbmcuZ2V0TWVzaCggY2FtZXJhWFIgKTtcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8vIEFuaW1hdGlvbiBMb29wXHJcblxyXG5cdFx0bGV0IG9uQW5pbWF0aW9uRnJhbWVDYWxsYmFjayA9IG51bGw7XHJcblxyXG5cdFx0ZnVuY3Rpb24gb25BbmltYXRpb25GcmFtZSggdGltZSwgZnJhbWUgKSB7XHJcblxyXG5cdFx0XHRwb3NlID0gZnJhbWUuZ2V0Vmlld2VyUG9zZSggY3VzdG9tUmVmZXJlbmNlU3BhY2UgfHwgcmVmZXJlbmNlU3BhY2UgKTtcclxuXHRcdFx0eHJGcmFtZSA9IGZyYW1lO1xyXG5cclxuXHRcdFx0aWYgKCBwb3NlICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB2aWV3cyA9IHBvc2Uudmlld3M7XHJcblxyXG5cdFx0XHRcdGlmICggZ2xCYXNlTGF5ZXIgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdFx0cmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0RnJhbWVidWZmZXIoIG5ld1JlbmRlclRhcmdldCwgZ2xCYXNlTGF5ZXIuZnJhbWVidWZmZXIgKTtcclxuXHRcdFx0XHRcdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggbmV3UmVuZGVyVGFyZ2V0ICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0bGV0IGNhbWVyYVhSTmVlZHNVcGRhdGUgPSBmYWxzZTtcclxuXHJcblx0XHRcdFx0Ly8gY2hlY2sgaWYgaXQncyBuZWNlc3NhcnkgdG8gcmVidWlsZCBjYW1lcmFYUidzIGNhbWVyYSBsaXN0XHJcblxyXG5cdFx0XHRcdGlmICggdmlld3MubGVuZ3RoICE9PSBjYW1lcmFYUi5jYW1lcmFzLmxlbmd0aCApIHtcclxuXHJcblx0XHRcdFx0XHRjYW1lcmFYUi5jYW1lcmFzLmxlbmd0aCA9IDA7XHJcblx0XHRcdFx0XHRjYW1lcmFYUk5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB2aWV3cy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgdmlldyA9IHZpZXdzWyBpIF07XHJcblxyXG5cdFx0XHRcdFx0bGV0IHZpZXdwb3J0ID0gbnVsbDtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGdsQmFzZUxheWVyICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRcdFx0dmlld3BvcnQgPSBnbEJhc2VMYXllci5nZXRWaWV3cG9ydCggdmlldyApO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCBnbFN1YkltYWdlID0gZ2xCaW5kaW5nLmdldFZpZXdTdWJJbWFnZSggZ2xQcm9qTGF5ZXIsIHZpZXcgKTtcclxuXHRcdFx0XHRcdFx0dmlld3BvcnQgPSBnbFN1YkltYWdlLnZpZXdwb3J0O1xyXG5cclxuXHRcdFx0XHRcdFx0Ly8gRm9yIHNpZGUtYnktc2lkZSBwcm9qZWN0aW9uLCB3ZSBvbmx5IHByb2R1Y2UgYSBzaW5nbGUgdGV4dHVyZSBmb3IgYm90aCBleWVzLlxyXG5cdFx0XHRcdFx0XHRpZiAoIGkgPT09IDAgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldFRleHR1cmVzKFxyXG5cdFx0XHRcdFx0XHRcdFx0bmV3UmVuZGVyVGFyZ2V0LFxyXG5cdFx0XHRcdFx0XHRcdFx0Z2xTdWJJbWFnZS5jb2xvclRleHR1cmUsXHJcblx0XHRcdFx0XHRcdFx0XHRnbFN1YkltYWdlLmRlcHRoU3RlbmNpbFRleHR1cmUgKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0cmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCBuZXdSZW5kZXJUYXJnZXQgKTtcclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0bGV0IGNhbWVyYSA9IGNhbWVyYXNbIGkgXTtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGNhbWVyYSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y2FtZXJhID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCk7XHJcblx0XHRcdFx0XHRcdGNhbWVyYS5sYXllcnMuZW5hYmxlKCBpICk7XHJcblx0XHRcdFx0XHRcdGNhbWVyYS52aWV3cG9ydCA9IG5ldyBWZWN0b3I0KCk7XHJcblx0XHRcdFx0XHRcdGNhbWVyYXNbIGkgXSA9IGNhbWVyYTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Y2FtZXJhLm1hdHJpeC5mcm9tQXJyYXkoIHZpZXcudHJhbnNmb3JtLm1hdHJpeCApO1xyXG5cdFx0XHRcdFx0Y2FtZXJhLm1hdHJpeC5kZWNvbXBvc2UoIGNhbWVyYS5wb3NpdGlvbiwgY2FtZXJhLnF1YXRlcm5pb24sIGNhbWVyYS5zY2FsZSApO1xyXG5cdFx0XHRcdFx0Y2FtZXJhLnByb2plY3Rpb25NYXRyaXguZnJvbUFycmF5KCB2aWV3LnByb2plY3Rpb25NYXRyaXggKTtcclxuXHRcdFx0XHRcdGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5jb3B5KCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeCApLmludmVydCgpO1xyXG5cdFx0XHRcdFx0Y2FtZXJhLnZpZXdwb3J0LnNldCggdmlld3BvcnQueCwgdmlld3BvcnQueSwgdmlld3BvcnQud2lkdGgsIHZpZXdwb3J0LmhlaWdodCApO1xyXG5cclxuXHRcdFx0XHRcdGlmICggaSA9PT0gMCApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNhbWVyYVhSLm1hdHJpeC5jb3B5KCBjYW1lcmEubWF0cml4ICk7XHJcblx0XHRcdFx0XHRcdGNhbWVyYVhSLm1hdHJpeC5kZWNvbXBvc2UoIGNhbWVyYVhSLnBvc2l0aW9uLCBjYW1lcmFYUi5xdWF0ZXJuaW9uLCBjYW1lcmFYUi5zY2FsZSApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRpZiAoIGNhbWVyYVhSTmVlZHNVcGRhdGUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjYW1lcmFYUi5jYW1lcmFzLnB1c2goIGNhbWVyYSApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvL1xyXG5cclxuXHRcdFx0XHRjb25zdCBlbmFibGVkRmVhdHVyZXMgPSBzZXNzaW9uLmVuYWJsZWRGZWF0dXJlcztcclxuXHRcdFx0XHRjb25zdCBncHVEZXB0aFNlbnNpbmdFbmFibGVkID0gZW5hYmxlZEZlYXR1cmVzICYmXHJcblx0XHRcdFx0XHRlbmFibGVkRmVhdHVyZXMuaW5jbHVkZXMoICdkZXB0aC1zZW5zaW5nJyApICYmXHJcblx0XHRcdFx0XHRzZXNzaW9uLmRlcHRoVXNhZ2UgPT0gJ2dwdS1vcHRpbWl6ZWQnO1xyXG5cclxuXHRcdFx0XHRpZiAoIGdwdURlcHRoU2Vuc2luZ0VuYWJsZWQgJiYgZ2xCaW5kaW5nICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGRlcHRoRGF0YSA9IGdsQmluZGluZy5nZXREZXB0aEluZm9ybWF0aW9uKCB2aWV3c1sgMCBdICk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBkZXB0aERhdGEgJiYgZGVwdGhEYXRhLmlzVmFsaWQgJiYgZGVwdGhEYXRhLnRleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRkZXB0aFNlbnNpbmcuaW5pdCggcmVuZGVyZXIsIGRlcHRoRGF0YSwgc2Vzc2lvbi5yZW5kZXJTdGF0ZSApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly9cclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGNvbnRyb2xsZXJzLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgaW5wdXRTb3VyY2UgPSBjb250cm9sbGVySW5wdXRTb3VyY2VzWyBpIF07XHJcblx0XHRcdFx0Y29uc3QgY29udHJvbGxlciA9IGNvbnRyb2xsZXJzWyBpIF07XHJcblxyXG5cdFx0XHRcdGlmICggaW5wdXRTb3VyY2UgIT09IG51bGwgJiYgY29udHJvbGxlciAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnRyb2xsZXIudXBkYXRlKCBpbnB1dFNvdXJjZSwgZnJhbWUsIGN1c3RvbVJlZmVyZW5jZVNwYWNlIHx8IHJlZmVyZW5jZVNwYWNlICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggb25BbmltYXRpb25GcmFtZUNhbGxiYWNrICkgb25BbmltYXRpb25GcmFtZUNhbGxiYWNrKCB0aW1lLCBmcmFtZSApO1xyXG5cclxuXHRcdFx0aWYgKCBmcmFtZS5kZXRlY3RlZFBsYW5lcyApIHtcclxuXHJcblx0XHRcdFx0c2NvcGUuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAncGxhbmVzZGV0ZWN0ZWQnLCBkYXRhOiBmcmFtZSB9ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR4ckZyYW1lID0gbnVsbDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgYW5pbWF0aW9uID0gbmV3IFdlYkdMQW5pbWF0aW9uKCk7XHJcblxyXG5cdFx0YW5pbWF0aW9uLnNldEFuaW1hdGlvbkxvb3AoIG9uQW5pbWF0aW9uRnJhbWUgKTtcclxuXHJcblx0XHR0aGlzLnNldEFuaW1hdGlvbkxvb3AgPSBmdW5jdGlvbiAoIGNhbGxiYWNrICkge1xyXG5cclxuXHRcdFx0b25BbmltYXRpb25GcmFtZUNhbGxiYWNrID0gY2FsbGJhY2s7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHR0aGlzLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7fTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgV2ViWFJNYW5hZ2VyIH07XHJcbiIsImltcG9ydCB7IEJhY2tTaWRlIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgZ2V0VW5saXRVbmlmb3JtQ29sb3JTcGFjZSB9IGZyb20gJy4uL3NoYWRlcnMvVW5pZm9ybXNVdGlscy5qcyc7XHJcbmltcG9ydCB7IEV1bGVyIH0gZnJvbSAnLi4vLi4vbWF0aC9FdWxlci5qcyc7XHJcbmltcG9ydCB7IE1hdHJpeDQgfSBmcm9tICcuLi8uLi9tYXRoL01hdHJpeDQuanMnO1xyXG5cclxuY29uc3QgX2UxID0gLypAX19QVVJFX18qLyBuZXcgRXVsZXIoKTtcclxuY29uc3QgX20xID0gLypAX19QVVJFX18qLyBuZXcgTWF0cml4NCgpO1xyXG5cclxuZnVuY3Rpb24gV2ViR0xNYXRlcmlhbHMoIHJlbmRlcmVyLCBwcm9wZXJ0aWVzICkge1xyXG5cclxuXHRmdW5jdGlvbiByZWZyZXNoVHJhbnNmb3JtVW5pZm9ybSggbWFwLCB1bmlmb3JtICkge1xyXG5cclxuXHRcdGlmICggbWFwLm1hdHJpeEF1dG9VcGRhdGUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRtYXAudXBkYXRlTWF0cml4KCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHVuaWZvcm0udmFsdWUuY29weSggbWFwLm1hdHJpeCApO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHJlZnJlc2hGb2dVbmlmb3JtcyggdW5pZm9ybXMsIGZvZyApIHtcclxuXHJcblx0XHRmb2cuY29sb3IuZ2V0UkdCKCB1bmlmb3Jtcy5mb2dDb2xvci52YWx1ZSwgZ2V0VW5saXRVbmlmb3JtQ29sb3JTcGFjZSggcmVuZGVyZXIgKSApO1xyXG5cclxuXHRcdGlmICggZm9nLmlzRm9nICkge1xyXG5cclxuXHRcdFx0dW5pZm9ybXMuZm9nTmVhci52YWx1ZSA9IGZvZy5uZWFyO1xyXG5cdFx0XHR1bmlmb3Jtcy5mb2dGYXIudmFsdWUgPSBmb2cuZmFyO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGZvZy5pc0ZvZ0V4cDIgKSB7XHJcblxyXG5cdFx0XHR1bmlmb3Jtcy5mb2dEZW5zaXR5LnZhbHVlID0gZm9nLmRlbnNpdHk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHJlZnJlc2hNYXRlcmlhbFVuaWZvcm1zKCB1bmlmb3JtcywgbWF0ZXJpYWwsIHBpeGVsUmF0aW8sIGhlaWdodCwgdHJhbnNtaXNzaW9uUmVuZGVyVGFyZ2V0ICkge1xyXG5cclxuXHRcdGlmICggbWF0ZXJpYWwuaXNNZXNoQmFzaWNNYXRlcmlhbCApIHtcclxuXHJcblx0XHRcdHJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggdW5pZm9ybXMsIG1hdGVyaWFsICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoTGFtYmVydE1hdGVyaWFsICkge1xyXG5cclxuXHRcdFx0cmVmcmVzaFVuaWZvcm1zQ29tbW9uKCB1bmlmb3JtcywgbWF0ZXJpYWwgKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc01lc2hUb29uTWF0ZXJpYWwgKSB7XHJcblxyXG5cdFx0XHRyZWZyZXNoVW5pZm9ybXNDb21tb24oIHVuaWZvcm1zLCBtYXRlcmlhbCApO1xyXG5cdFx0XHRyZWZyZXNoVW5pZm9ybXNUb29uKCB1bmlmb3JtcywgbWF0ZXJpYWwgKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc01lc2hQaG9uZ01hdGVyaWFsICkge1xyXG5cclxuXHRcdFx0cmVmcmVzaFVuaWZvcm1zQ29tbW9uKCB1bmlmb3JtcywgbWF0ZXJpYWwgKTtcclxuXHRcdFx0cmVmcmVzaFVuaWZvcm1zUGhvbmcoIHVuaWZvcm1zLCBtYXRlcmlhbCApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwgKSB7XHJcblxyXG5cdFx0XHRyZWZyZXNoVW5pZm9ybXNDb21tb24oIHVuaWZvcm1zLCBtYXRlcmlhbCApO1xyXG5cdFx0XHRyZWZyZXNoVW5pZm9ybXNTdGFuZGFyZCggdW5pZm9ybXMsIG1hdGVyaWFsICk7XHJcblxyXG5cdFx0XHRpZiAoIG1hdGVyaWFsLmlzTWVzaFBoeXNpY2FsTWF0ZXJpYWwgKSB7XHJcblxyXG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc1BoeXNpY2FsKCB1bmlmb3JtcywgbWF0ZXJpYWwsIHRyYW5zbWlzc2lvblJlbmRlclRhcmdldCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzTWVzaE1hdGNhcE1hdGVyaWFsICkge1xyXG5cclxuXHRcdFx0cmVmcmVzaFVuaWZvcm1zQ29tbW9uKCB1bmlmb3JtcywgbWF0ZXJpYWwgKTtcclxuXHRcdFx0cmVmcmVzaFVuaWZvcm1zTWF0Y2FwKCB1bmlmb3JtcywgbWF0ZXJpYWwgKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc01lc2hEZXB0aE1hdGVyaWFsICkge1xyXG5cclxuXHRcdFx0cmVmcmVzaFVuaWZvcm1zQ29tbW9uKCB1bmlmb3JtcywgbWF0ZXJpYWwgKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc01lc2hEaXN0YW5jZU1hdGVyaWFsICkge1xyXG5cclxuXHRcdFx0cmVmcmVzaFVuaWZvcm1zQ29tbW9uKCB1bmlmb3JtcywgbWF0ZXJpYWwgKTtcclxuXHRcdFx0cmVmcmVzaFVuaWZvcm1zRGlzdGFuY2UoIHVuaWZvcm1zLCBtYXRlcmlhbCApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzTWVzaE5vcm1hbE1hdGVyaWFsICkge1xyXG5cclxuXHRcdFx0cmVmcmVzaFVuaWZvcm1zQ29tbW9uKCB1bmlmb3JtcywgbWF0ZXJpYWwgKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc0xpbmVCYXNpY01hdGVyaWFsICkge1xyXG5cclxuXHRcdFx0cmVmcmVzaFVuaWZvcm1zTGluZSggdW5pZm9ybXMsIG1hdGVyaWFsICk7XHJcblxyXG5cdFx0XHRpZiAoIG1hdGVyaWFsLmlzTGluZURhc2hlZE1hdGVyaWFsICkge1xyXG5cclxuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNEYXNoKCB1bmlmb3JtcywgbWF0ZXJpYWwgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc1BvaW50c01hdGVyaWFsICkge1xyXG5cclxuXHRcdFx0cmVmcmVzaFVuaWZvcm1zUG9pbnRzKCB1bmlmb3JtcywgbWF0ZXJpYWwsIHBpeGVsUmF0aW8sIGhlaWdodCApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzU3ByaXRlTWF0ZXJpYWwgKSB7XHJcblxyXG5cdFx0XHRyZWZyZXNoVW5pZm9ybXNTcHJpdGVzKCB1bmlmb3JtcywgbWF0ZXJpYWwgKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc1NoYWRvd01hdGVyaWFsICkge1xyXG5cclxuXHRcdFx0dW5pZm9ybXMuY29sb3IudmFsdWUuY29weSggbWF0ZXJpYWwuY29sb3IgKTtcclxuXHRcdFx0dW5pZm9ybXMub3BhY2l0eS52YWx1ZSA9IG1hdGVyaWFsLm9wYWNpdHk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNTaGFkZXJNYXRlcmlhbCApIHtcclxuXHJcblx0XHRcdG1hdGVyaWFsLnVuaWZvcm1zTmVlZFVwZGF0ZSA9IGZhbHNlOyAvLyAjMTU1ODFcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zQ29tbW9uKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XHJcblxyXG5cdFx0dW5pZm9ybXMub3BhY2l0eS52YWx1ZSA9IG1hdGVyaWFsLm9wYWNpdHk7XHJcblxyXG5cdFx0aWYgKCBtYXRlcmlhbC5jb2xvciApIHtcclxuXHJcblx0XHRcdHVuaWZvcm1zLmRpZmZ1c2UudmFsdWUuY29weSggbWF0ZXJpYWwuY29sb3IgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBtYXRlcmlhbC5lbWlzc2l2ZSApIHtcclxuXHJcblx0XHRcdHVuaWZvcm1zLmVtaXNzaXZlLnZhbHVlLmNvcHkoIG1hdGVyaWFsLmVtaXNzaXZlICkubXVsdGlwbHlTY2FsYXIoIG1hdGVyaWFsLmVtaXNzaXZlSW50ZW5zaXR5ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggbWF0ZXJpYWwubWFwICkge1xyXG5cclxuXHRcdFx0dW5pZm9ybXMubWFwLnZhbHVlID0gbWF0ZXJpYWwubWFwO1xyXG5cclxuXHRcdFx0cmVmcmVzaFRyYW5zZm9ybVVuaWZvcm0oIG1hdGVyaWFsLm1hcCwgdW5pZm9ybXMubWFwVHJhbnNmb3JtICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggbWF0ZXJpYWwuYWxwaGFNYXAgKSB7XHJcblxyXG5cdFx0XHR1bmlmb3Jtcy5hbHBoYU1hcC52YWx1ZSA9IG1hdGVyaWFsLmFscGhhTWFwO1xyXG5cclxuXHRcdFx0cmVmcmVzaFRyYW5zZm9ybVVuaWZvcm0oIG1hdGVyaWFsLmFscGhhTWFwLCB1bmlmb3Jtcy5hbHBoYU1hcFRyYW5zZm9ybSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIG1hdGVyaWFsLmJ1bXBNYXAgKSB7XHJcblxyXG5cdFx0XHR1bmlmb3Jtcy5idW1wTWFwLnZhbHVlID0gbWF0ZXJpYWwuYnVtcE1hcDtcclxuXHJcblx0XHRcdHJlZnJlc2hUcmFuc2Zvcm1Vbmlmb3JtKCBtYXRlcmlhbC5idW1wTWFwLCB1bmlmb3Jtcy5idW1wTWFwVHJhbnNmb3JtICk7XHJcblxyXG5cdFx0XHR1bmlmb3Jtcy5idW1wU2NhbGUudmFsdWUgPSBtYXRlcmlhbC5idW1wU2NhbGU7XHJcblxyXG5cdFx0XHRpZiAoIG1hdGVyaWFsLnNpZGUgPT09IEJhY2tTaWRlICkge1xyXG5cclxuXHRcdFx0XHR1bmlmb3Jtcy5idW1wU2NhbGUudmFsdWUgKj0gLSAxO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIG1hdGVyaWFsLm5vcm1hbE1hcCApIHtcclxuXHJcblx0XHRcdHVuaWZvcm1zLm5vcm1hbE1hcC52YWx1ZSA9IG1hdGVyaWFsLm5vcm1hbE1hcDtcclxuXHJcblx0XHRcdHJlZnJlc2hUcmFuc2Zvcm1Vbmlmb3JtKCBtYXRlcmlhbC5ub3JtYWxNYXAsIHVuaWZvcm1zLm5vcm1hbE1hcFRyYW5zZm9ybSApO1xyXG5cclxuXHRcdFx0dW5pZm9ybXMubm9ybWFsU2NhbGUudmFsdWUuY29weSggbWF0ZXJpYWwubm9ybWFsU2NhbGUgKTtcclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWwuc2lkZSA9PT0gQmFja1NpZGUgKSB7XHJcblxyXG5cdFx0XHRcdHVuaWZvcm1zLm5vcm1hbFNjYWxlLnZhbHVlLm5lZ2F0ZSgpO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCApIHtcclxuXHJcblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudE1hcC52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcDtcclxuXHJcblx0XHRcdHJlZnJlc2hUcmFuc2Zvcm1Vbmlmb3JtKCBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAsIHVuaWZvcm1zLmRpc3BsYWNlbWVudE1hcFRyYW5zZm9ybSApO1xyXG5cclxuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50U2NhbGUudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRTY2FsZTtcclxuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudEJpYXM7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggbWF0ZXJpYWwuZW1pc3NpdmVNYXAgKSB7XHJcblxyXG5cdFx0XHR1bmlmb3Jtcy5lbWlzc2l2ZU1hcC52YWx1ZSA9IG1hdGVyaWFsLmVtaXNzaXZlTWFwO1xyXG5cclxuXHRcdFx0cmVmcmVzaFRyYW5zZm9ybVVuaWZvcm0oIG1hdGVyaWFsLmVtaXNzaXZlTWFwLCB1bmlmb3Jtcy5lbWlzc2l2ZU1hcFRyYW5zZm9ybSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIG1hdGVyaWFsLnNwZWN1bGFyTWFwICkge1xyXG5cclxuXHRcdFx0dW5pZm9ybXMuc3BlY3VsYXJNYXAudmFsdWUgPSBtYXRlcmlhbC5zcGVjdWxhck1hcDtcclxuXHJcblx0XHRcdHJlZnJlc2hUcmFuc2Zvcm1Vbmlmb3JtKCBtYXRlcmlhbC5zcGVjdWxhck1hcCwgdW5pZm9ybXMuc3BlY3VsYXJNYXBUcmFuc2Zvcm0gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBtYXRlcmlhbC5hbHBoYVRlc3QgPiAwICkge1xyXG5cclxuXHRcdFx0dW5pZm9ybXMuYWxwaGFUZXN0LnZhbHVlID0gbWF0ZXJpYWwuYWxwaGFUZXN0O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBtYXRlcmlhbFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggbWF0ZXJpYWwgKTtcclxuXHJcblx0XHRjb25zdCBlbnZNYXAgPSBtYXRlcmlhbFByb3BlcnRpZXMuZW52TWFwO1xyXG5cdFx0Y29uc3QgZW52TWFwUm90YXRpb24gPSBtYXRlcmlhbFByb3BlcnRpZXMuZW52TWFwUm90YXRpb247XHJcblxyXG5cdFx0aWYgKCBlbnZNYXAgKSB7XHJcblxyXG5cdFx0XHR1bmlmb3Jtcy5lbnZNYXAudmFsdWUgPSBlbnZNYXA7XHJcblxyXG5cdFx0XHRfZTEuY29weSggZW52TWFwUm90YXRpb24gKTtcclxuXHJcblx0XHRcdC8vIGFjY29tbW9kYXRlIGxlZnQtaGFuZGVkIGZyYW1lXHJcblx0XHRcdF9lMS54ICo9IC0gMTsgX2UxLnkgKj0gLSAxOyBfZTEueiAqPSAtIDE7XHJcblxyXG5cdFx0XHRpZiAoIGVudk1hcC5pc0N1YmVUZXh0dXJlICYmIGVudk1hcC5pc1JlbmRlclRhcmdldFRleHR1cmUgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0XHQvLyBlbnZpcm9ubWVudCBtYXBzIHdoaWNoIGFyZSBub3QgY3ViZSByZW5kZXIgdGFyZ2V0cyBvciBQTVJFTXMgZm9sbG93IGEgZGlmZmVyZW50IGNvbnZlbnRpb25cclxuXHRcdFx0XHRfZTEueSAqPSAtIDE7XHJcblx0XHRcdFx0X2UxLnogKj0gLSAxO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dW5pZm9ybXMuZW52TWFwUm90YXRpb24udmFsdWUuc2V0RnJvbU1hdHJpeDQoIF9tMS5tYWtlUm90YXRpb25Gcm9tRXVsZXIoIF9lMSApICk7XHJcblxyXG5cdFx0XHR1bmlmb3Jtcy5mbGlwRW52TWFwLnZhbHVlID0gKCBlbnZNYXAuaXNDdWJlVGV4dHVyZSAmJiBlbnZNYXAuaXNSZW5kZXJUYXJnZXRUZXh0dXJlID09PSBmYWxzZSApID8gLSAxIDogMTtcclxuXHJcblx0XHRcdHVuaWZvcm1zLnJlZmxlY3Rpdml0eS52YWx1ZSA9IG1hdGVyaWFsLnJlZmxlY3Rpdml0eTtcclxuXHRcdFx0dW5pZm9ybXMuaW9yLnZhbHVlID0gbWF0ZXJpYWwuaW9yO1xyXG5cdFx0XHR1bmlmb3Jtcy5yZWZyYWN0aW9uUmF0aW8udmFsdWUgPSBtYXRlcmlhbC5yZWZyYWN0aW9uUmF0aW87XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggbWF0ZXJpYWwubGlnaHRNYXAgKSB7XHJcblxyXG5cdFx0XHR1bmlmb3Jtcy5saWdodE1hcC52YWx1ZSA9IG1hdGVyaWFsLmxpZ2h0TWFwO1xyXG5cdFx0XHR1bmlmb3Jtcy5saWdodE1hcEludGVuc2l0eS52YWx1ZSA9IG1hdGVyaWFsLmxpZ2h0TWFwSW50ZW5zaXR5O1xyXG5cclxuXHRcdFx0cmVmcmVzaFRyYW5zZm9ybVVuaWZvcm0oIG1hdGVyaWFsLmxpZ2h0TWFwLCB1bmlmb3Jtcy5saWdodE1hcFRyYW5zZm9ybSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIG1hdGVyaWFsLmFvTWFwICkge1xyXG5cclxuXHRcdFx0dW5pZm9ybXMuYW9NYXAudmFsdWUgPSBtYXRlcmlhbC5hb01hcDtcclxuXHRcdFx0dW5pZm9ybXMuYW9NYXBJbnRlbnNpdHkudmFsdWUgPSBtYXRlcmlhbC5hb01hcEludGVuc2l0eTtcclxuXHJcblx0XHRcdHJlZnJlc2hUcmFuc2Zvcm1Vbmlmb3JtKCBtYXRlcmlhbC5hb01hcCwgdW5pZm9ybXMuYW9NYXBUcmFuc2Zvcm0gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zTGluZSggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xyXG5cclxuXHRcdHVuaWZvcm1zLmRpZmZ1c2UudmFsdWUuY29weSggbWF0ZXJpYWwuY29sb3IgKTtcclxuXHRcdHVuaWZvcm1zLm9wYWNpdHkudmFsdWUgPSBtYXRlcmlhbC5vcGFjaXR5O1xyXG5cclxuXHRcdGlmICggbWF0ZXJpYWwubWFwICkge1xyXG5cclxuXHRcdFx0dW5pZm9ybXMubWFwLnZhbHVlID0gbWF0ZXJpYWwubWFwO1xyXG5cclxuXHRcdFx0cmVmcmVzaFRyYW5zZm9ybVVuaWZvcm0oIG1hdGVyaWFsLm1hcCwgdW5pZm9ybXMubWFwVHJhbnNmb3JtICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0Rhc2goIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcclxuXHJcblx0XHR1bmlmb3Jtcy5kYXNoU2l6ZS52YWx1ZSA9IG1hdGVyaWFsLmRhc2hTaXplO1xyXG5cdFx0dW5pZm9ybXMudG90YWxTaXplLnZhbHVlID0gbWF0ZXJpYWwuZGFzaFNpemUgKyBtYXRlcmlhbC5nYXBTaXplO1xyXG5cdFx0dW5pZm9ybXMuc2NhbGUudmFsdWUgPSBtYXRlcmlhbC5zY2FsZTtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNQb2ludHMoIHVuaWZvcm1zLCBtYXRlcmlhbCwgcGl4ZWxSYXRpbywgaGVpZ2h0ICkge1xyXG5cclxuXHRcdHVuaWZvcm1zLmRpZmZ1c2UudmFsdWUuY29weSggbWF0ZXJpYWwuY29sb3IgKTtcclxuXHRcdHVuaWZvcm1zLm9wYWNpdHkudmFsdWUgPSBtYXRlcmlhbC5vcGFjaXR5O1xyXG5cdFx0dW5pZm9ybXMuc2l6ZS52YWx1ZSA9IG1hdGVyaWFsLnNpemUgKiBwaXhlbFJhdGlvO1xyXG5cdFx0dW5pZm9ybXMuc2NhbGUudmFsdWUgPSBoZWlnaHQgKiAwLjU7XHJcblxyXG5cdFx0aWYgKCBtYXRlcmlhbC5tYXAgKSB7XHJcblxyXG5cdFx0XHR1bmlmb3Jtcy5tYXAudmFsdWUgPSBtYXRlcmlhbC5tYXA7XHJcblxyXG5cdFx0XHRyZWZyZXNoVHJhbnNmb3JtVW5pZm9ybSggbWF0ZXJpYWwubWFwLCB1bmlmb3Jtcy51dlRyYW5zZm9ybSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIG1hdGVyaWFsLmFscGhhTWFwICkge1xyXG5cclxuXHRcdFx0dW5pZm9ybXMuYWxwaGFNYXAudmFsdWUgPSBtYXRlcmlhbC5hbHBoYU1hcDtcclxuXHJcblx0XHRcdHJlZnJlc2hUcmFuc2Zvcm1Vbmlmb3JtKCBtYXRlcmlhbC5hbHBoYU1hcCwgdW5pZm9ybXMuYWxwaGFNYXBUcmFuc2Zvcm0gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBtYXRlcmlhbC5hbHBoYVRlc3QgPiAwICkge1xyXG5cclxuXHRcdFx0dW5pZm9ybXMuYWxwaGFUZXN0LnZhbHVlID0gbWF0ZXJpYWwuYWxwaGFUZXN0O1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNTcHJpdGVzKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XHJcblxyXG5cdFx0dW5pZm9ybXMuZGlmZnVzZS52YWx1ZS5jb3B5KCBtYXRlcmlhbC5jb2xvciApO1xyXG5cdFx0dW5pZm9ybXMub3BhY2l0eS52YWx1ZSA9IG1hdGVyaWFsLm9wYWNpdHk7XHJcblx0XHR1bmlmb3Jtcy5yb3RhdGlvbi52YWx1ZSA9IG1hdGVyaWFsLnJvdGF0aW9uO1xyXG5cclxuXHRcdGlmICggbWF0ZXJpYWwubWFwICkge1xyXG5cclxuXHRcdFx0dW5pZm9ybXMubWFwLnZhbHVlID0gbWF0ZXJpYWwubWFwO1xyXG5cclxuXHRcdFx0cmVmcmVzaFRyYW5zZm9ybVVuaWZvcm0oIG1hdGVyaWFsLm1hcCwgdW5pZm9ybXMubWFwVHJhbnNmb3JtICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggbWF0ZXJpYWwuYWxwaGFNYXAgKSB7XHJcblxyXG5cdFx0XHR1bmlmb3Jtcy5hbHBoYU1hcC52YWx1ZSA9IG1hdGVyaWFsLmFscGhhTWFwO1xyXG5cclxuXHRcdFx0cmVmcmVzaFRyYW5zZm9ybVVuaWZvcm0oIG1hdGVyaWFsLmFscGhhTWFwLCB1bmlmb3Jtcy5hbHBoYU1hcFRyYW5zZm9ybSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIG1hdGVyaWFsLmFscGhhVGVzdCA+IDAgKSB7XHJcblxyXG5cdFx0XHR1bmlmb3Jtcy5hbHBoYVRlc3QudmFsdWUgPSBtYXRlcmlhbC5hbHBoYVRlc3Q7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc1Bob25nKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XHJcblxyXG5cdFx0dW5pZm9ybXMuc3BlY3VsYXIudmFsdWUuY29weSggbWF0ZXJpYWwuc3BlY3VsYXIgKTtcclxuXHRcdHVuaWZvcm1zLnNoaW5pbmVzcy52YWx1ZSA9IE1hdGgubWF4KCBtYXRlcmlhbC5zaGluaW5lc3MsIDFlLTQgKTsgLy8gdG8gcHJldmVudCBwb3coIDAuMCwgMC4wIClcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNUb29uKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XHJcblxyXG5cdFx0aWYgKCBtYXRlcmlhbC5ncmFkaWVudE1hcCApIHtcclxuXHJcblx0XHRcdHVuaWZvcm1zLmdyYWRpZW50TWFwLnZhbHVlID0gbWF0ZXJpYWwuZ3JhZGllbnRNYXA7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc1N0YW5kYXJkKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XHJcblxyXG5cdFx0dW5pZm9ybXMubWV0YWxuZXNzLnZhbHVlID0gbWF0ZXJpYWwubWV0YWxuZXNzO1xyXG5cclxuXHRcdGlmICggbWF0ZXJpYWwubWV0YWxuZXNzTWFwICkge1xyXG5cclxuXHRcdFx0dW5pZm9ybXMubWV0YWxuZXNzTWFwLnZhbHVlID0gbWF0ZXJpYWwubWV0YWxuZXNzTWFwO1xyXG5cclxuXHRcdFx0cmVmcmVzaFRyYW5zZm9ybVVuaWZvcm0oIG1hdGVyaWFsLm1ldGFsbmVzc01hcCwgdW5pZm9ybXMubWV0YWxuZXNzTWFwVHJhbnNmb3JtICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHVuaWZvcm1zLnJvdWdobmVzcy52YWx1ZSA9IG1hdGVyaWFsLnJvdWdobmVzcztcclxuXHJcblx0XHRpZiAoIG1hdGVyaWFsLnJvdWdobmVzc01hcCApIHtcclxuXHJcblx0XHRcdHVuaWZvcm1zLnJvdWdobmVzc01hcC52YWx1ZSA9IG1hdGVyaWFsLnJvdWdobmVzc01hcDtcclxuXHJcblx0XHRcdHJlZnJlc2hUcmFuc2Zvcm1Vbmlmb3JtKCBtYXRlcmlhbC5yb3VnaG5lc3NNYXAsIHVuaWZvcm1zLnJvdWdobmVzc01hcFRyYW5zZm9ybSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIG1hdGVyaWFsLmVudk1hcCApIHtcclxuXHJcblx0XHRcdC8vdW5pZm9ybXMuZW52TWFwLnZhbHVlID0gbWF0ZXJpYWwuZW52TWFwOyAvLyBwYXJ0IG9mIHVuaWZvcm1zIGNvbW1vblxyXG5cclxuXHRcdFx0dW5pZm9ybXMuZW52TWFwSW50ZW5zaXR5LnZhbHVlID0gbWF0ZXJpYWwuZW52TWFwSW50ZW5zaXR5O1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNQaHlzaWNhbCggdW5pZm9ybXMsIG1hdGVyaWFsLCB0cmFuc21pc3Npb25SZW5kZXJUYXJnZXQgKSB7XHJcblxyXG5cdFx0dW5pZm9ybXMuaW9yLnZhbHVlID0gbWF0ZXJpYWwuaW9yOyAvLyBhbHNvIHBhcnQgb2YgdW5pZm9ybXMgY29tbW9uXHJcblxyXG5cdFx0aWYgKCBtYXRlcmlhbC5zaGVlbiA+IDAgKSB7XHJcblxyXG5cdFx0XHR1bmlmb3Jtcy5zaGVlbkNvbG9yLnZhbHVlLmNvcHkoIG1hdGVyaWFsLnNoZWVuQ29sb3IgKS5tdWx0aXBseVNjYWxhciggbWF0ZXJpYWwuc2hlZW4gKTtcclxuXHJcblx0XHRcdHVuaWZvcm1zLnNoZWVuUm91Z2huZXNzLnZhbHVlID0gbWF0ZXJpYWwuc2hlZW5Sb3VnaG5lc3M7XHJcblxyXG5cdFx0XHRpZiAoIG1hdGVyaWFsLnNoZWVuQ29sb3JNYXAgKSB7XHJcblxyXG5cdFx0XHRcdHVuaWZvcm1zLnNoZWVuQ29sb3JNYXAudmFsdWUgPSBtYXRlcmlhbC5zaGVlbkNvbG9yTWFwO1xyXG5cclxuXHRcdFx0XHRyZWZyZXNoVHJhbnNmb3JtVW5pZm9ybSggbWF0ZXJpYWwuc2hlZW5Db2xvck1hcCwgdW5pZm9ybXMuc2hlZW5Db2xvck1hcFRyYW5zZm9ybSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBtYXRlcmlhbC5zaGVlblJvdWdobmVzc01hcCApIHtcclxuXHJcblx0XHRcdFx0dW5pZm9ybXMuc2hlZW5Sb3VnaG5lc3NNYXAudmFsdWUgPSBtYXRlcmlhbC5zaGVlblJvdWdobmVzc01hcDtcclxuXHJcblx0XHRcdFx0cmVmcmVzaFRyYW5zZm9ybVVuaWZvcm0oIG1hdGVyaWFsLnNoZWVuUm91Z2huZXNzTWFwLCB1bmlmb3Jtcy5zaGVlblJvdWdobmVzc01hcFRyYW5zZm9ybSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIG1hdGVyaWFsLmNsZWFyY29hdCA+IDAgKSB7XHJcblxyXG5cdFx0XHR1bmlmb3Jtcy5jbGVhcmNvYXQudmFsdWUgPSBtYXRlcmlhbC5jbGVhcmNvYXQ7XHJcblx0XHRcdHVuaWZvcm1zLmNsZWFyY29hdFJvdWdobmVzcy52YWx1ZSA9IG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcztcclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWwuY2xlYXJjb2F0TWFwICkge1xyXG5cclxuXHRcdFx0XHR1bmlmb3Jtcy5jbGVhcmNvYXRNYXAudmFsdWUgPSBtYXRlcmlhbC5jbGVhcmNvYXRNYXA7XHJcblxyXG5cdFx0XHRcdHJlZnJlc2hUcmFuc2Zvcm1Vbmlmb3JtKCBtYXRlcmlhbC5jbGVhcmNvYXRNYXAsIHVuaWZvcm1zLmNsZWFyY29hdE1hcFRyYW5zZm9ybSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3NNYXAgKSB7XHJcblxyXG5cdFx0XHRcdHVuaWZvcm1zLmNsZWFyY29hdFJvdWdobmVzc01hcC52YWx1ZSA9IG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzc01hcDtcclxuXHJcblx0XHRcdFx0cmVmcmVzaFRyYW5zZm9ybVVuaWZvcm0oIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzc01hcCwgdW5pZm9ybXMuY2xlYXJjb2F0Um91Z2huZXNzTWFwVHJhbnNmb3JtICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIG1hdGVyaWFsLmNsZWFyY29hdE5vcm1hbE1hcCApIHtcclxuXHJcblx0XHRcdFx0dW5pZm9ybXMuY2xlYXJjb2F0Tm9ybWFsTWFwLnZhbHVlID0gbWF0ZXJpYWwuY2xlYXJjb2F0Tm9ybWFsTWFwO1xyXG5cclxuXHRcdFx0XHRyZWZyZXNoVHJhbnNmb3JtVW5pZm9ybSggbWF0ZXJpYWwuY2xlYXJjb2F0Tm9ybWFsTWFwLCB1bmlmb3Jtcy5jbGVhcmNvYXROb3JtYWxNYXBUcmFuc2Zvcm0gKTtcclxuXHJcblx0XHRcdFx0dW5pZm9ybXMuY2xlYXJjb2F0Tm9ybWFsU2NhbGUudmFsdWUuY29weSggbWF0ZXJpYWwuY2xlYXJjb2F0Tm9ybWFsU2NhbGUgKTtcclxuXHJcblx0XHRcdFx0aWYgKCBtYXRlcmlhbC5zaWRlID09PSBCYWNrU2lkZSApIHtcclxuXHJcblx0XHRcdFx0XHR1bmlmb3Jtcy5jbGVhcmNvYXROb3JtYWxTY2FsZS52YWx1ZS5uZWdhdGUoKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIG1hdGVyaWFsLmRpc3BlcnNpb24gPiAwICkge1xyXG5cclxuXHRcdFx0dW5pZm9ybXMuZGlzcGVyc2lvbi52YWx1ZSA9IG1hdGVyaWFsLmRpc3BlcnNpb247XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggbWF0ZXJpYWwuaXJpZGVzY2VuY2UgPiAwICkge1xyXG5cclxuXHRcdFx0dW5pZm9ybXMuaXJpZGVzY2VuY2UudmFsdWUgPSBtYXRlcmlhbC5pcmlkZXNjZW5jZTtcclxuXHRcdFx0dW5pZm9ybXMuaXJpZGVzY2VuY2VJT1IudmFsdWUgPSBtYXRlcmlhbC5pcmlkZXNjZW5jZUlPUjtcclxuXHRcdFx0dW5pZm9ybXMuaXJpZGVzY2VuY2VUaGlja25lc3NNaW5pbXVtLnZhbHVlID0gbWF0ZXJpYWwuaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZVsgMCBdO1xyXG5cdFx0XHR1bmlmb3Jtcy5pcmlkZXNjZW5jZVRoaWNrbmVzc01heGltdW0udmFsdWUgPSBtYXRlcmlhbC5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlWyAxIF07XHJcblxyXG5cdFx0XHRpZiAoIG1hdGVyaWFsLmlyaWRlc2NlbmNlTWFwICkge1xyXG5cclxuXHRcdFx0XHR1bmlmb3Jtcy5pcmlkZXNjZW5jZU1hcC52YWx1ZSA9IG1hdGVyaWFsLmlyaWRlc2NlbmNlTWFwO1xyXG5cclxuXHRcdFx0XHRyZWZyZXNoVHJhbnNmb3JtVW5pZm9ybSggbWF0ZXJpYWwuaXJpZGVzY2VuY2VNYXAsIHVuaWZvcm1zLmlyaWRlc2NlbmNlTWFwVHJhbnNmb3JtICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIG1hdGVyaWFsLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwICkge1xyXG5cclxuXHRcdFx0XHR1bmlmb3Jtcy5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcC52YWx1ZSA9IG1hdGVyaWFsLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwO1xyXG5cclxuXHRcdFx0XHRyZWZyZXNoVHJhbnNmb3JtVW5pZm9ybSggbWF0ZXJpYWwuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAsIHVuaWZvcm1zLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwVHJhbnNmb3JtICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggbWF0ZXJpYWwudHJhbnNtaXNzaW9uID4gMCApIHtcclxuXHJcblx0XHRcdHVuaWZvcm1zLnRyYW5zbWlzc2lvbi52YWx1ZSA9IG1hdGVyaWFsLnRyYW5zbWlzc2lvbjtcclxuXHRcdFx0dW5pZm9ybXMudHJhbnNtaXNzaW9uU2FtcGxlck1hcC52YWx1ZSA9IHRyYW5zbWlzc2lvblJlbmRlclRhcmdldC50ZXh0dXJlO1xyXG5cdFx0XHR1bmlmb3Jtcy50cmFuc21pc3Npb25TYW1wbGVyU2l6ZS52YWx1ZS5zZXQoIHRyYW5zbWlzc2lvblJlbmRlclRhcmdldC53aWR0aCwgdHJhbnNtaXNzaW9uUmVuZGVyVGFyZ2V0LmhlaWdodCApO1xyXG5cclxuXHRcdFx0aWYgKCBtYXRlcmlhbC50cmFuc21pc3Npb25NYXAgKSB7XHJcblxyXG5cdFx0XHRcdHVuaWZvcm1zLnRyYW5zbWlzc2lvbk1hcC52YWx1ZSA9IG1hdGVyaWFsLnRyYW5zbWlzc2lvbk1hcDtcclxuXHJcblx0XHRcdFx0cmVmcmVzaFRyYW5zZm9ybVVuaWZvcm0oIG1hdGVyaWFsLnRyYW5zbWlzc2lvbk1hcCwgdW5pZm9ybXMudHJhbnNtaXNzaW9uTWFwVHJhbnNmb3JtICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR1bmlmb3Jtcy50aGlja25lc3MudmFsdWUgPSBtYXRlcmlhbC50aGlja25lc3M7XHJcblxyXG5cdFx0XHRpZiAoIG1hdGVyaWFsLnRoaWNrbmVzc01hcCApIHtcclxuXHJcblx0XHRcdFx0dW5pZm9ybXMudGhpY2tuZXNzTWFwLnZhbHVlID0gbWF0ZXJpYWwudGhpY2tuZXNzTWFwO1xyXG5cclxuXHRcdFx0XHRyZWZyZXNoVHJhbnNmb3JtVW5pZm9ybSggbWF0ZXJpYWwudGhpY2tuZXNzTWFwLCB1bmlmb3Jtcy50aGlja25lc3NNYXBUcmFuc2Zvcm0gKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHVuaWZvcm1zLmF0dGVudWF0aW9uRGlzdGFuY2UudmFsdWUgPSBtYXRlcmlhbC5hdHRlbnVhdGlvbkRpc3RhbmNlO1xyXG5cdFx0XHR1bmlmb3Jtcy5hdHRlbnVhdGlvbkNvbG9yLnZhbHVlLmNvcHkoIG1hdGVyaWFsLmF0dGVudWF0aW9uQ29sb3IgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBtYXRlcmlhbC5hbmlzb3Ryb3B5ID4gMCApIHtcclxuXHJcblx0XHRcdHVuaWZvcm1zLmFuaXNvdHJvcHlWZWN0b3IudmFsdWUuc2V0KCBtYXRlcmlhbC5hbmlzb3Ryb3B5ICogTWF0aC5jb3MoIG1hdGVyaWFsLmFuaXNvdHJvcHlSb3RhdGlvbiApLCBtYXRlcmlhbC5hbmlzb3Ryb3B5ICogTWF0aC5zaW4oIG1hdGVyaWFsLmFuaXNvdHJvcHlSb3RhdGlvbiApICk7XHJcblxyXG5cdFx0XHRpZiAoIG1hdGVyaWFsLmFuaXNvdHJvcHlNYXAgKSB7XHJcblxyXG5cdFx0XHRcdHVuaWZvcm1zLmFuaXNvdHJvcHlNYXAudmFsdWUgPSBtYXRlcmlhbC5hbmlzb3Ryb3B5TWFwO1xyXG5cclxuXHRcdFx0XHRyZWZyZXNoVHJhbnNmb3JtVW5pZm9ybSggbWF0ZXJpYWwuYW5pc290cm9weU1hcCwgdW5pZm9ybXMuYW5pc290cm9weU1hcFRyYW5zZm9ybSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHR1bmlmb3Jtcy5zcGVjdWxhckludGVuc2l0eS52YWx1ZSA9IG1hdGVyaWFsLnNwZWN1bGFySW50ZW5zaXR5O1xyXG5cdFx0dW5pZm9ybXMuc3BlY3VsYXJDb2xvci52YWx1ZS5jb3B5KCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yICk7XHJcblxyXG5cdFx0aWYgKCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yTWFwICkge1xyXG5cclxuXHRcdFx0dW5pZm9ybXMuc3BlY3VsYXJDb2xvck1hcC52YWx1ZSA9IG1hdGVyaWFsLnNwZWN1bGFyQ29sb3JNYXA7XHJcblxyXG5cdFx0XHRyZWZyZXNoVHJhbnNmb3JtVW5pZm9ybSggbWF0ZXJpYWwuc3BlY3VsYXJDb2xvck1hcCwgdW5pZm9ybXMuc3BlY3VsYXJDb2xvck1hcFRyYW5zZm9ybSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIG1hdGVyaWFsLnNwZWN1bGFySW50ZW5zaXR5TWFwICkge1xyXG5cclxuXHRcdFx0dW5pZm9ybXMuc3BlY3VsYXJJbnRlbnNpdHlNYXAudmFsdWUgPSBtYXRlcmlhbC5zcGVjdWxhckludGVuc2l0eU1hcDtcclxuXHJcblx0XHRcdHJlZnJlc2hUcmFuc2Zvcm1Vbmlmb3JtKCBtYXRlcmlhbC5zcGVjdWxhckludGVuc2l0eU1hcCwgdW5pZm9ybXMuc3BlY3VsYXJJbnRlbnNpdHlNYXBUcmFuc2Zvcm0gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zTWF0Y2FwKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XHJcblxyXG5cdFx0aWYgKCBtYXRlcmlhbC5tYXRjYXAgKSB7XHJcblxyXG5cdFx0XHR1bmlmb3Jtcy5tYXRjYXAudmFsdWUgPSBtYXRlcmlhbC5tYXRjYXA7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0Rpc3RhbmNlKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XHJcblxyXG5cdFx0Y29uc3QgbGlnaHQgPSBwcm9wZXJ0aWVzLmdldCggbWF0ZXJpYWwgKS5saWdodDtcclxuXHJcblx0XHR1bmlmb3Jtcy5yZWZlcmVuY2VQb3NpdGlvbi52YWx1ZS5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7XHJcblx0XHR1bmlmb3Jtcy5uZWFyRGlzdGFuY2UudmFsdWUgPSBsaWdodC5zaGFkb3cuY2FtZXJhLm5lYXI7XHJcblx0XHR1bmlmb3Jtcy5mYXJEaXN0YW5jZS52YWx1ZSA9IGxpZ2h0LnNoYWRvdy5jYW1lcmEuZmFyO1xyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiB7XHJcblx0XHRyZWZyZXNoRm9nVW5pZm9ybXM6IHJlZnJlc2hGb2dVbmlmb3JtcyxcclxuXHRcdHJlZnJlc2hNYXRlcmlhbFVuaWZvcm1zOiByZWZyZXNoTWF0ZXJpYWxVbmlmb3Jtc1xyXG5cdH07XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBXZWJHTE1hdGVyaWFscyB9O1xyXG4iLCJmdW5jdGlvbiBXZWJHTFVuaWZvcm1zR3JvdXBzKCBnbCwgaW5mbywgY2FwYWJpbGl0aWVzLCBzdGF0ZSApIHtcclxuXHJcblx0bGV0IGJ1ZmZlcnMgPSB7fTtcclxuXHRsZXQgdXBkYXRlTGlzdCA9IHt9O1xyXG5cdGxldCBhbGxvY2F0ZWRCaW5kaW5nUG9pbnRzID0gW107XHJcblxyXG5cdGNvbnN0IG1heEJpbmRpbmdQb2ludHMgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9VTklGT1JNX0JVRkZFUl9CSU5ESU5HUyApOyAvLyBiaW5kaW5nIHBvaW50cyBhcmUgZ2xvYmFsIHdoZXJlYXMgYmxvY2sgaW5kaWNlcyBhcmUgcGVyIHNoYWRlciBwcm9ncmFtXHJcblxyXG5cdGZ1bmN0aW9uIGJpbmQoIHVuaWZvcm1zR3JvdXAsIHByb2dyYW0gKSB7XHJcblxyXG5cdFx0Y29uc3Qgd2ViZ2xQcm9ncmFtID0gcHJvZ3JhbS5wcm9ncmFtO1xyXG5cdFx0c3RhdGUudW5pZm9ybUJsb2NrQmluZGluZyggdW5pZm9ybXNHcm91cCwgd2ViZ2xQcm9ncmFtICk7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gdXBkYXRlKCB1bmlmb3Jtc0dyb3VwLCBwcm9ncmFtICkge1xyXG5cclxuXHRcdGxldCBidWZmZXIgPSBidWZmZXJzWyB1bmlmb3Jtc0dyb3VwLmlkIF07XHJcblxyXG5cdFx0aWYgKCBidWZmZXIgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHByZXBhcmVVbmlmb3Jtc0dyb3VwKCB1bmlmb3Jtc0dyb3VwICk7XHJcblxyXG5cdFx0XHRidWZmZXIgPSBjcmVhdGVCdWZmZXIoIHVuaWZvcm1zR3JvdXAgKTtcclxuXHRcdFx0YnVmZmVyc1sgdW5pZm9ybXNHcm91cC5pZCBdID0gYnVmZmVyO1xyXG5cclxuXHRcdFx0dW5pZm9ybXNHcm91cC5hZGRFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uVW5pZm9ybXNHcm91cHNEaXNwb3NlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGVuc3VyZSB0byB1cGRhdGUgdGhlIGJpbmRpbmcgcG9pbnRzL2Jsb2NrIGluZGljZXMgbWFwcGluZyBmb3IgdGhpcyBwcm9ncmFtXHJcblxyXG5cdFx0Y29uc3Qgd2ViZ2xQcm9ncmFtID0gcHJvZ3JhbS5wcm9ncmFtO1xyXG5cdFx0c3RhdGUudXBkYXRlVUJPTWFwcGluZyggdW5pZm9ybXNHcm91cCwgd2ViZ2xQcm9ncmFtICk7XHJcblxyXG5cdFx0Ly8gdXBkYXRlIFVCTyBvbmNlIHBlciBmcmFtZVxyXG5cclxuXHRcdGNvbnN0IGZyYW1lID0gaW5mby5yZW5kZXIuZnJhbWU7XHJcblxyXG5cdFx0aWYgKCB1cGRhdGVMaXN0WyB1bmlmb3Jtc0dyb3VwLmlkIF0gIT09IGZyYW1lICkge1xyXG5cclxuXHRcdFx0dXBkYXRlQnVmZmVyRGF0YSggdW5pZm9ybXNHcm91cCApO1xyXG5cclxuXHRcdFx0dXBkYXRlTGlzdFsgdW5pZm9ybXNHcm91cC5pZCBdID0gZnJhbWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGNyZWF0ZUJ1ZmZlciggdW5pZm9ybXNHcm91cCApIHtcclxuXHJcblx0XHQvLyB0aGUgc2V0dXAgb2YgYW4gVUJPIGlzIGluZGVwZW5kZW50IG9mIGEgcGFydGljdWxhciBzaGFkZXIgcHJvZ3JhbSBidXQgZ2xvYmFsXHJcblxyXG5cdFx0Y29uc3QgYmluZGluZ1BvaW50SW5kZXggPSBhbGxvY2F0ZUJpbmRpbmdQb2ludEluZGV4KCk7XHJcblx0XHR1bmlmb3Jtc0dyb3VwLl9fYmluZGluZ1BvaW50SW5kZXggPSBiaW5kaW5nUG9pbnRJbmRleDtcclxuXHJcblx0XHRjb25zdCBidWZmZXIgPSBnbC5jcmVhdGVCdWZmZXIoKTtcclxuXHRcdGNvbnN0IHNpemUgPSB1bmlmb3Jtc0dyb3VwLl9fc2l6ZTtcclxuXHRcdGNvbnN0IHVzYWdlID0gdW5pZm9ybXNHcm91cC51c2FnZTtcclxuXHJcblx0XHRnbC5iaW5kQnVmZmVyKCBnbC5VTklGT1JNX0JVRkZFUiwgYnVmZmVyICk7XHJcblx0XHRnbC5idWZmZXJEYXRhKCBnbC5VTklGT1JNX0JVRkZFUiwgc2l6ZSwgdXNhZ2UgKTtcclxuXHRcdGdsLmJpbmRCdWZmZXIoIGdsLlVOSUZPUk1fQlVGRkVSLCBudWxsICk7XHJcblx0XHRnbC5iaW5kQnVmZmVyQmFzZSggZ2wuVU5JRk9STV9CVUZGRVIsIGJpbmRpbmdQb2ludEluZGV4LCBidWZmZXIgKTtcclxuXHJcblx0XHRyZXR1cm4gYnVmZmVyO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGFsbG9jYXRlQmluZGluZ1BvaW50SW5kZXgoKSB7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgbWF4QmluZGluZ1BvaW50czsgaSArKyApIHtcclxuXHJcblx0XHRcdGlmICggYWxsb2NhdGVkQmluZGluZ1BvaW50cy5pbmRleE9mKCBpICkgPT09IC0gMSApIHtcclxuXHJcblx0XHRcdFx0YWxsb2NhdGVkQmluZGluZ1BvaW50cy5wdXNoKCBpICk7XHJcblx0XHRcdFx0cmV0dXJuIGk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBNYXhpbXVtIG51bWJlciBvZiBzaW11bHRhbmVvdXNseSB1c2FibGUgdW5pZm9ybXMgZ3JvdXBzIHJlYWNoZWQuJyApO1xyXG5cclxuXHRcdHJldHVybiAwO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHVwZGF0ZUJ1ZmZlckRhdGEoIHVuaWZvcm1zR3JvdXAgKSB7XHJcblxyXG5cdFx0Y29uc3QgYnVmZmVyID0gYnVmZmVyc1sgdW5pZm9ybXNHcm91cC5pZCBdO1xyXG5cdFx0Y29uc3QgdW5pZm9ybXMgPSB1bmlmb3Jtc0dyb3VwLnVuaWZvcm1zO1xyXG5cdFx0Y29uc3QgY2FjaGUgPSB1bmlmb3Jtc0dyb3VwLl9fY2FjaGU7XHJcblxyXG5cdFx0Z2wuYmluZEJ1ZmZlciggZ2wuVU5JRk9STV9CVUZGRVIsIGJ1ZmZlciApO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSB1bmlmb3Jtcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHVuaWZvcm1BcnJheSA9IEFycmF5LmlzQXJyYXkoIHVuaWZvcm1zWyBpIF0gKSA/IHVuaWZvcm1zWyBpIF0gOiBbIHVuaWZvcm1zWyBpIF0gXTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBqID0gMCwgamwgPSB1bmlmb3JtQXJyYXkubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHVuaWZvcm0gPSB1bmlmb3JtQXJyYXlbIGogXTtcclxuXHJcblx0XHRcdFx0aWYgKCBoYXNVbmlmb3JtQ2hhbmdlZCggdW5pZm9ybSwgaSwgaiwgY2FjaGUgKSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBvZmZzZXQgPSB1bmlmb3JtLl9fb2Zmc2V0O1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHZhbHVlcyA9IEFycmF5LmlzQXJyYXkoIHVuaWZvcm0udmFsdWUgKSA/IHVuaWZvcm0udmFsdWUgOiBbIHVuaWZvcm0udmFsdWUgXTtcclxuXHJcblx0XHRcdFx0XHRsZXQgYXJyYXlPZmZzZXQgPSAwO1xyXG5cclxuXHRcdFx0XHRcdGZvciAoIGxldCBrID0gMDsgayA8IHZhbHVlcy5sZW5ndGg7IGsgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCB2YWx1ZSA9IHZhbHVlc1sgayBdO1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgaW5mbyA9IGdldFVuaWZvcm1TaXplKCB2YWx1ZSApO1xyXG5cclxuXHRcdFx0XHRcdFx0Ly8gVE9ETyBhZGQgaW50ZWdlciBhbmQgc3RydWN0IHN1cHBvcnRcclxuXHRcdFx0XHRcdFx0aWYgKCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHR1bmlmb3JtLl9fZGF0YVsgMCBdID0gdmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0Z2wuYnVmZmVyU3ViRGF0YSggZ2wuVU5JRk9STV9CVUZGRVIsIG9mZnNldCArIGFycmF5T2Zmc2V0LCB1bmlmb3JtLl9fZGF0YSApO1xyXG5cclxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICggdmFsdWUuaXNNYXRyaXgzICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHQvLyBtYW51YWxseSBjb252ZXJ0aW5nIDN4MyB0byAzeDRcclxuXHJcblx0XHRcdFx0XHRcdFx0dW5pZm9ybS5fX2RhdGFbIDAgXSA9IHZhbHVlLmVsZW1lbnRzWyAwIF07XHJcblx0XHRcdFx0XHRcdFx0dW5pZm9ybS5fX2RhdGFbIDEgXSA9IHZhbHVlLmVsZW1lbnRzWyAxIF07XHJcblx0XHRcdFx0XHRcdFx0dW5pZm9ybS5fX2RhdGFbIDIgXSA9IHZhbHVlLmVsZW1lbnRzWyAyIF07XHJcblx0XHRcdFx0XHRcdFx0dW5pZm9ybS5fX2RhdGFbIDMgXSA9IDA7XHJcblx0XHRcdFx0XHRcdFx0dW5pZm9ybS5fX2RhdGFbIDQgXSA9IHZhbHVlLmVsZW1lbnRzWyAzIF07XHJcblx0XHRcdFx0XHRcdFx0dW5pZm9ybS5fX2RhdGFbIDUgXSA9IHZhbHVlLmVsZW1lbnRzWyA0IF07XHJcblx0XHRcdFx0XHRcdFx0dW5pZm9ybS5fX2RhdGFbIDYgXSA9IHZhbHVlLmVsZW1lbnRzWyA1IF07XHJcblx0XHRcdFx0XHRcdFx0dW5pZm9ybS5fX2RhdGFbIDcgXSA9IDA7XHJcblx0XHRcdFx0XHRcdFx0dW5pZm9ybS5fX2RhdGFbIDggXSA9IHZhbHVlLmVsZW1lbnRzWyA2IF07XHJcblx0XHRcdFx0XHRcdFx0dW5pZm9ybS5fX2RhdGFbIDkgXSA9IHZhbHVlLmVsZW1lbnRzWyA3IF07XHJcblx0XHRcdFx0XHRcdFx0dW5pZm9ybS5fX2RhdGFbIDEwIF0gPSB2YWx1ZS5lbGVtZW50c1sgOCBdO1xyXG5cdFx0XHRcdFx0XHRcdHVuaWZvcm0uX19kYXRhWyAxMSBdID0gMDtcclxuXHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdHZhbHVlLnRvQXJyYXkoIHVuaWZvcm0uX19kYXRhLCBhcnJheU9mZnNldCApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRhcnJheU9mZnNldCArPSBpbmZvLnN0b3JhZ2UgLyBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGdsLmJ1ZmZlclN1YkRhdGEoIGdsLlVOSUZPUk1fQlVGRkVSLCBvZmZzZXQsIHVuaWZvcm0uX19kYXRhICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Z2wuYmluZEJ1ZmZlciggZ2wuVU5JRk9STV9CVUZGRVIsIG51bGwgKTtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBoYXNVbmlmb3JtQ2hhbmdlZCggdW5pZm9ybSwgaW5kZXgsIGluZGV4QXJyYXksIGNhY2hlICkge1xyXG5cclxuXHRcdGNvbnN0IHZhbHVlID0gdW5pZm9ybS52YWx1ZTtcclxuXHRcdGNvbnN0IGluZGV4U3RyaW5nID0gaW5kZXggKyAnXycgKyBpbmRleEFycmF5O1xyXG5cclxuXHRcdGlmICggY2FjaGVbIGluZGV4U3RyaW5nIF0gPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdC8vIGNhY2hlIGVudHJ5IGRvZXMgbm90IGV4aXN0IHNvIGZhclxyXG5cclxuXHRcdFx0aWYgKCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nICkge1xyXG5cclxuXHRcdFx0XHRjYWNoZVsgaW5kZXhTdHJpbmcgXSA9IHZhbHVlO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0Y2FjaGVbIGluZGV4U3RyaW5nIF0gPSB2YWx1ZS5jbG9uZSgpO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGNvbnN0IGNhY2hlZE9iamVjdCA9IGNhY2hlWyBpbmRleFN0cmluZyBdO1xyXG5cclxuXHRcdFx0Ly8gY29tcGFyZSBjdXJyZW50IHZhbHVlIHdpdGggY2FjaGVkIGVudHJ5XHJcblxyXG5cdFx0XHRpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggY2FjaGVkT2JqZWN0ICE9PSB2YWx1ZSApIHtcclxuXHJcblx0XHRcdFx0XHRjYWNoZVsgaW5kZXhTdHJpbmcgXSA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGlmICggY2FjaGVkT2JqZWN0LmVxdWFscyggdmFsdWUgKSA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y2FjaGVkT2JqZWN0LmNvcHkoIHZhbHVlICk7XHJcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZmFsc2U7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gcHJlcGFyZVVuaWZvcm1zR3JvdXAoIHVuaWZvcm1zR3JvdXAgKSB7XHJcblxyXG5cdFx0Ly8gZGV0ZXJtaW5lIHRvdGFsIGJ1ZmZlciBzaXplIGFjY29yZGluZyB0byB0aGUgU1REMTQwIGxheW91dFxyXG5cdFx0Ly8gSGludDogU1REMTQwIGlzIHRoZSBvbmx5IHN1cHBvcnRlZCBsYXlvdXQgaW4gV2ViR0wgMlxyXG5cclxuXHRcdGNvbnN0IHVuaWZvcm1zID0gdW5pZm9ybXNHcm91cC51bmlmb3JtcztcclxuXHJcblx0XHRsZXQgb2Zmc2V0ID0gMDsgLy8gZ2xvYmFsIGJ1ZmZlciBvZmZzZXQgaW4gYnl0ZXNcclxuXHRcdGNvbnN0IGNodW5rU2l6ZSA9IDE2OyAvLyBzaXplIG9mIGEgY2h1bmsgaW4gYnl0ZXNcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSB1bmlmb3Jtcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdW5pZm9ybUFycmF5ID0gQXJyYXkuaXNBcnJheSggdW5pZm9ybXNbIGkgXSApID8gdW5pZm9ybXNbIGkgXSA6IFsgdW5pZm9ybXNbIGkgXSBdO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGogPSAwLCBqbCA9IHVuaWZvcm1BcnJheS5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgdW5pZm9ybSA9IHVuaWZvcm1BcnJheVsgaiBdO1xyXG5cclxuXHRcdFx0XHRjb25zdCB2YWx1ZXMgPSBBcnJheS5pc0FycmF5KCB1bmlmb3JtLnZhbHVlICkgPyB1bmlmb3JtLnZhbHVlIDogWyB1bmlmb3JtLnZhbHVlIF07XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBrID0gMCwga2wgPSB2YWx1ZXMubGVuZ3RoOyBrIDwga2w7IGsgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgdmFsdWUgPSB2YWx1ZXNbIGsgXTtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBpbmZvID0gZ2V0VW5pZm9ybVNpemUoIHZhbHVlICk7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgY2h1bmtPZmZzZXQgPSBvZmZzZXQgJSBjaHVua1NpemU7IC8vIG9mZnNldCBpbiB0aGUgY3VycmVudCBjaHVua1xyXG5cdFx0XHRcdFx0Y29uc3QgY2h1bmtQYWRkaW5nID0gY2h1bmtPZmZzZXQgJSBpbmZvLmJvdW5kYXJ5OyAvLyByZXF1aXJlZCBwYWRkaW5nIHRvIG1hdGNoIGJvdW5kYXJ5XHJcblx0XHRcdFx0XHRjb25zdCBjaHVua1N0YXJ0ID0gY2h1bmtPZmZzZXQgKyBjaHVua1BhZGRpbmc7IC8vIHRoZSBzdGFydCBwb3NpdGlvbiBpbiB0aGUgY3VycmVudCBjaHVuayBmb3IgdGhlIGRhdGFcclxuXHJcblx0XHRcdFx0XHRvZmZzZXQgKz0gY2h1bmtQYWRkaW5nO1xyXG5cclxuXHRcdFx0XHRcdC8vIENoZWNrIGZvciBjaHVuayBvdmVyZmxvd1xyXG5cdFx0XHRcdFx0aWYgKCBjaHVua1N0YXJ0ICE9PSAwICYmICggY2h1bmtTaXplIC0gY2h1bmtTdGFydCApIDwgaW5mby5zdG9yYWdlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Ly8gQWRkIHBhZGRpbmcgYW5kIGFkanVzdCBvZmZzZXRcclxuXHRcdFx0XHRcdFx0b2Zmc2V0ICs9ICggY2h1bmtTaXplIC0gY2h1bmtTdGFydCApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvLyB0aGUgZm9sbG93aW5nIHR3byBwcm9wZXJ0aWVzIHdpbGwgYmUgdXNlZCBmb3IgcGFydGlhbCBidWZmZXIgdXBkYXRlc1xyXG5cdFx0XHRcdFx0dW5pZm9ybS5fX2RhdGEgPSBuZXcgRmxvYXQzMkFycmF5KCBpbmZvLnN0b3JhZ2UgLyBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQgKTtcclxuXHRcdFx0XHRcdHVuaWZvcm0uX19vZmZzZXQgPSBvZmZzZXQ7XHJcblxyXG5cdFx0XHRcdFx0Ly8gVXBkYXRlIHRoZSBnbG9iYWwgb2Zmc2V0XHJcblx0XHRcdFx0XHRvZmZzZXQgKz0gaW5mby5zdG9yYWdlO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGVuc3VyZSBjb3JyZWN0IGZpbmFsIHBhZGRpbmdcclxuXHJcblx0XHRjb25zdCBjaHVua09mZnNldCA9IG9mZnNldCAlIGNodW5rU2l6ZTtcclxuXHJcblx0XHRpZiAoIGNodW5rT2Zmc2V0ID4gMCApIG9mZnNldCArPSAoIGNodW5rU2l6ZSAtIGNodW5rT2Zmc2V0ICk7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHR1bmlmb3Jtc0dyb3VwLl9fc2l6ZSA9IG9mZnNldDtcclxuXHRcdHVuaWZvcm1zR3JvdXAuX19jYWNoZSA9IHt9O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGdldFVuaWZvcm1TaXplKCB2YWx1ZSApIHtcclxuXHJcblx0XHRjb25zdCBpbmZvID0ge1xyXG5cdFx0XHRib3VuZGFyeTogMCwgLy8gYnl0ZXNcclxuXHRcdFx0c3RvcmFnZTogMCAvLyBieXRlc1xyXG5cdFx0fTtcclxuXHJcblx0XHQvLyBkZXRlcm1pbmUgc2l6ZXMgYWNjb3JkaW5nIHRvIFNURDE0MFxyXG5cclxuXHRcdGlmICggdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyApIHtcclxuXHJcblx0XHRcdC8vIGZsb2F0L2ludC9ib29sXHJcblxyXG5cdFx0XHRpbmZvLmJvdW5kYXJ5ID0gNDtcclxuXHRcdFx0aW5mby5zdG9yYWdlID0gNDtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCB2YWx1ZS5pc1ZlY3RvcjIgKSB7XHJcblxyXG5cdFx0XHQvLyB2ZWMyXHJcblxyXG5cdFx0XHRpbmZvLmJvdW5kYXJ5ID0gODtcclxuXHRcdFx0aW5mby5zdG9yYWdlID0gODtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCB2YWx1ZS5pc1ZlY3RvcjMgfHwgdmFsdWUuaXNDb2xvciApIHtcclxuXHJcblx0XHRcdC8vIHZlYzNcclxuXHJcblx0XHRcdGluZm8uYm91bmRhcnkgPSAxNjtcclxuXHRcdFx0aW5mby5zdG9yYWdlID0gMTI7IC8vIGV2aWw6IHZlYzMgbXVzdCBzdGFydCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkgYnV0IGl0IG9ubHkgY29uc3VtZXMgMTIgYnl0ZXNcclxuXHJcblx0XHR9IGVsc2UgaWYgKCB2YWx1ZS5pc1ZlY3RvcjQgKSB7XHJcblxyXG5cdFx0XHQvLyB2ZWM0XHJcblxyXG5cdFx0XHRpbmZvLmJvdW5kYXJ5ID0gMTY7XHJcblx0XHRcdGluZm8uc3RvcmFnZSA9IDE2O1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHZhbHVlLmlzTWF0cml4MyApIHtcclxuXHJcblx0XHRcdC8vIG1hdDMgKGluIFNURDE0MCBhIDN4MyBtYXRyaXggaXMgcmVwcmVzZW50ZWQgYXMgM3g0KVxyXG5cclxuXHRcdFx0aW5mby5ib3VuZGFyeSA9IDQ4O1xyXG5cdFx0XHRpbmZvLnN0b3JhZ2UgPSA0ODtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCB2YWx1ZS5pc01hdHJpeDQgKSB7XHJcblxyXG5cdFx0XHQvLyBtYXQ0XHJcblxyXG5cdFx0XHRpbmZvLmJvdW5kYXJ5ID0gNjQ7XHJcblx0XHRcdGluZm8uc3RvcmFnZSA9IDY0O1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHZhbHVlLmlzVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgc2FtcGxlcnMgY2FuIG5vdCBiZSBwYXJ0IG9mIGFuIHVuaWZvcm1zIGdyb3VwLicgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogVW5zdXBwb3J0ZWQgdW5pZm9ybSB2YWx1ZSB0eXBlLicsIHZhbHVlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBpbmZvO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIG9uVW5pZm9ybXNHcm91cHNEaXNwb3NlKCBldmVudCApIHtcclxuXHJcblx0XHRjb25zdCB1bmlmb3Jtc0dyb3VwID0gZXZlbnQudGFyZ2V0O1xyXG5cclxuXHRcdHVuaWZvcm1zR3JvdXAucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvblVuaWZvcm1zR3JvdXBzRGlzcG9zZSApO1xyXG5cclxuXHRcdGNvbnN0IGluZGV4ID0gYWxsb2NhdGVkQmluZGluZ1BvaW50cy5pbmRleE9mKCB1bmlmb3Jtc0dyb3VwLl9fYmluZGluZ1BvaW50SW5kZXggKTtcclxuXHRcdGFsbG9jYXRlZEJpbmRpbmdQb2ludHMuc3BsaWNlKCBpbmRleCwgMSApO1xyXG5cclxuXHRcdGdsLmRlbGV0ZUJ1ZmZlciggYnVmZmVyc1sgdW5pZm9ybXNHcm91cC5pZCBdICk7XHJcblxyXG5cdFx0ZGVsZXRlIGJ1ZmZlcnNbIHVuaWZvcm1zR3JvdXAuaWQgXTtcclxuXHRcdGRlbGV0ZSB1cGRhdGVMaXN0WyB1bmlmb3Jtc0dyb3VwLmlkIF07XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gZGlzcG9zZSgpIHtcclxuXHJcblx0XHRmb3IgKCBjb25zdCBpZCBpbiBidWZmZXJzICkge1xyXG5cclxuXHRcdFx0Z2wuZGVsZXRlQnVmZmVyKCBidWZmZXJzWyBpZCBdICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGFsbG9jYXRlZEJpbmRpbmdQb2ludHMgPSBbXTtcclxuXHRcdGJ1ZmZlcnMgPSB7fTtcclxuXHRcdHVwZGF0ZUxpc3QgPSB7fTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4ge1xyXG5cclxuXHRcdGJpbmQ6IGJpbmQsXHJcblx0XHR1cGRhdGU6IHVwZGF0ZSxcclxuXHJcblx0XHRkaXNwb3NlOiBkaXNwb3NlXHJcblxyXG5cdH07XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgV2ViR0xVbmlmb3Jtc0dyb3VwcyB9O1xyXG4iLCJpbXBvcnQge1xyXG5cdFJFVklTSU9OLFxyXG5cdEJhY2tTaWRlLFxyXG5cdEZyb250U2lkZSxcclxuXHREb3VibGVTaWRlLFxyXG5cdEhhbGZGbG9hdFR5cGUsXHJcblx0VW5zaWduZWRCeXRlVHlwZSxcclxuXHROb1RvbmVNYXBwaW5nLFxyXG5cdExpbmVhck1pcG1hcExpbmVhckZpbHRlcixcclxuXHRTUkdCQ29sb3JTcGFjZSxcclxuXHRMaW5lYXJTUkdCQ29sb3JTcGFjZSxcclxuXHRSR0JBSW50ZWdlckZvcm1hdCxcclxuXHRSR0ludGVnZXJGb3JtYXQsXHJcblx0UmVkSW50ZWdlckZvcm1hdCxcclxuXHRVbnNpZ25lZEludFR5cGUsXHJcblx0VW5zaWduZWRTaG9ydFR5cGUsXHJcblx0VW5zaWduZWRJbnQyNDhUeXBlLFxyXG5cdFVuc2lnbmVkU2hvcnQ0NDQ0VHlwZSxcclxuXHRVbnNpZ25lZFNob3J0NTU1MVR5cGUsXHJcblx0V2ViR0xDb29yZGluYXRlU3lzdGVtXHJcbn0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi9tYXRoL0NvbG9yLmpzJztcclxuaW1wb3J0IHsgRnJ1c3R1bSB9IGZyb20gJy4uL21hdGgvRnJ1c3R1bS5qcyc7XHJcbmltcG9ydCB7IE1hdHJpeDQgfSBmcm9tICcuLi9tYXRoL01hdHJpeDQuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yNCB9IGZyb20gJy4uL21hdGgvVmVjdG9yNC5qcyc7XHJcbmltcG9ydCB7IFdlYkdMQW5pbWF0aW9uIH0gZnJvbSAnLi93ZWJnbC9XZWJHTEFuaW1hdGlvbi5qcyc7XHJcbmltcG9ydCB7IFdlYkdMQXR0cmlidXRlcyB9IGZyb20gJy4vd2ViZ2wvV2ViR0xBdHRyaWJ1dGVzLmpzJztcclxuaW1wb3J0IHsgV2ViR0xCYWNrZ3JvdW5kIH0gZnJvbSAnLi93ZWJnbC9XZWJHTEJhY2tncm91bmQuanMnO1xyXG5pbXBvcnQgeyBXZWJHTEJpbmRpbmdTdGF0ZXMgfSBmcm9tICcuL3dlYmdsL1dlYkdMQmluZGluZ1N0YXRlcy5qcyc7XHJcbmltcG9ydCB7IFdlYkdMQnVmZmVyUmVuZGVyZXIgfSBmcm9tICcuL3dlYmdsL1dlYkdMQnVmZmVyUmVuZGVyZXIuanMnO1xyXG5pbXBvcnQgeyBXZWJHTENhcGFiaWxpdGllcyB9IGZyb20gJy4vd2ViZ2wvV2ViR0xDYXBhYmlsaXRpZXMuanMnO1xyXG5pbXBvcnQgeyBXZWJHTENsaXBwaW5nIH0gZnJvbSAnLi93ZWJnbC9XZWJHTENsaXBwaW5nLmpzJztcclxuaW1wb3J0IHsgV2ViR0xDdWJlTWFwcyB9IGZyb20gJy4vd2ViZ2wvV2ViR0xDdWJlTWFwcy5qcyc7XHJcbmltcG9ydCB7IFdlYkdMQ3ViZVVWTWFwcyB9IGZyb20gJy4vd2ViZ2wvV2ViR0xDdWJlVVZNYXBzLmpzJztcclxuaW1wb3J0IHsgV2ViR0xFeHRlbnNpb25zIH0gZnJvbSAnLi93ZWJnbC9XZWJHTEV4dGVuc2lvbnMuanMnO1xyXG5pbXBvcnQgeyBXZWJHTEdlb21ldHJpZXMgfSBmcm9tICcuL3dlYmdsL1dlYkdMR2VvbWV0cmllcy5qcyc7XHJcbmltcG9ydCB7IFdlYkdMSW5kZXhlZEJ1ZmZlclJlbmRlcmVyIH0gZnJvbSAnLi93ZWJnbC9XZWJHTEluZGV4ZWRCdWZmZXJSZW5kZXJlci5qcyc7XHJcbmltcG9ydCB7IFdlYkdMSW5mbyB9IGZyb20gJy4vd2ViZ2wvV2ViR0xJbmZvLmpzJztcclxuaW1wb3J0IHsgV2ViR0xNb3JwaHRhcmdldHMgfSBmcm9tICcuL3dlYmdsL1dlYkdMTW9ycGh0YXJnZXRzLmpzJztcclxuaW1wb3J0IHsgV2ViR0xPYmplY3RzIH0gZnJvbSAnLi93ZWJnbC9XZWJHTE9iamVjdHMuanMnO1xyXG5pbXBvcnQgeyBXZWJHTFByb2dyYW1zIH0gZnJvbSAnLi93ZWJnbC9XZWJHTFByb2dyYW1zLmpzJztcclxuaW1wb3J0IHsgV2ViR0xQcm9wZXJ0aWVzIH0gZnJvbSAnLi93ZWJnbC9XZWJHTFByb3BlcnRpZXMuanMnO1xyXG5pbXBvcnQgeyBXZWJHTFJlbmRlckxpc3RzIH0gZnJvbSAnLi93ZWJnbC9XZWJHTFJlbmRlckxpc3RzLmpzJztcclxuaW1wb3J0IHsgV2ViR0xSZW5kZXJTdGF0ZXMgfSBmcm9tICcuL3dlYmdsL1dlYkdMUmVuZGVyU3RhdGVzLmpzJztcclxuaW1wb3J0IHsgV2ViR0xSZW5kZXJUYXJnZXQgfSBmcm9tICcuL1dlYkdMUmVuZGVyVGFyZ2V0LmpzJztcclxuaW1wb3J0IHsgV2ViR0xTaGFkb3dNYXAgfSBmcm9tICcuL3dlYmdsL1dlYkdMU2hhZG93TWFwLmpzJztcclxuaW1wb3J0IHsgV2ViR0xTdGF0ZSB9IGZyb20gJy4vd2ViZ2wvV2ViR0xTdGF0ZS5qcyc7XHJcbmltcG9ydCB7IFdlYkdMVGV4dHVyZXMgfSBmcm9tICcuL3dlYmdsL1dlYkdMVGV4dHVyZXMuanMnO1xyXG5pbXBvcnQgeyBXZWJHTFVuaWZvcm1zIH0gZnJvbSAnLi93ZWJnbC9XZWJHTFVuaWZvcm1zLmpzJztcclxuaW1wb3J0IHsgV2ViR0xVdGlscyB9IGZyb20gJy4vd2ViZ2wvV2ViR0xVdGlscy5qcyc7XHJcbmltcG9ydCB7IFdlYlhSTWFuYWdlciB9IGZyb20gJy4vd2VieHIvV2ViWFJNYW5hZ2VyLmpzJztcclxuaW1wb3J0IHsgV2ViR0xNYXRlcmlhbHMgfSBmcm9tICcuL3dlYmdsL1dlYkdMTWF0ZXJpYWxzLmpzJztcclxuaW1wb3J0IHsgV2ViR0xVbmlmb3Jtc0dyb3VwcyB9IGZyb20gJy4vd2ViZ2wvV2ViR0xVbmlmb3Jtc0dyb3Vwcy5qcyc7XHJcbmltcG9ydCB7IGNyZWF0ZUNhbnZhc0VsZW1lbnQsIHByb2JlQXN5bmMsIHRvTm9ybWFsaXplZFByb2plY3Rpb25NYXRyaXgsIHRvUmV2ZXJzZWRQcm9qZWN0aW9uTWF0cml4LCB3YXJuT25jZSB9IGZyb20gJy4uL3V0aWxzLmpzJztcclxuaW1wb3J0IHsgQ29sb3JNYW5hZ2VtZW50IH0gZnJvbSAnLi4vbWF0aC9Db2xvck1hbmFnZW1lbnQuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgcmVuZGVyZXIgdXNlcyBXZWJHTCAyIHRvIGRpc3BsYXkgc2NlbmVzLlxyXG4gKlxyXG4gKiBXZWJHTCAxIGlzIG5vdCBzdXBwb3J0ZWQgc2luY2UgYHIxNjNgLlxyXG4gKi9cclxuY2xhc3MgV2ViR0xSZW5kZXJlciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgV2ViR0wgcmVuZGVyZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ+T3B0aW9uc30gW3BhcmFtZXRlcnNdIC0gVGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwYXJhbWV0ZXJzID0ge30gKSB7XHJcblxyXG5cdFx0Y29uc3Qge1xyXG5cdFx0XHRjYW52YXMgPSBjcmVhdGVDYW52YXNFbGVtZW50KCksXHJcblx0XHRcdGNvbnRleHQgPSBudWxsLFxyXG5cdFx0XHRkZXB0aCA9IHRydWUsXHJcblx0XHRcdHN0ZW5jaWwgPSBmYWxzZSxcclxuXHRcdFx0YWxwaGEgPSBmYWxzZSxcclxuXHRcdFx0YW50aWFsaWFzID0gZmFsc2UsXHJcblx0XHRcdHByZW11bHRpcGxpZWRBbHBoYSA9IHRydWUsXHJcblx0XHRcdHByZXNlcnZlRHJhd2luZ0J1ZmZlciA9IGZhbHNlLFxyXG5cdFx0XHRwb3dlclByZWZlcmVuY2UgPSAnZGVmYXVsdCcsXHJcblx0XHRcdGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQgPSBmYWxzZSxcclxuXHRcdFx0cmV2ZXJzZURlcHRoQnVmZmVyID0gZmFsc2UsXHJcblx0XHR9ID0gcGFyYW1ldGVycztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNXZWJHTFJlbmRlcmVyID0gdHJ1ZTtcclxuXHJcblx0XHRsZXQgX2FscGhhO1xyXG5cclxuXHRcdGlmICggY29udGV4dCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGlmICggdHlwZW9mIFdlYkdMUmVuZGVyaW5nQ29udGV4dCAhPT0gJ3VuZGVmaW5lZCcgJiYgY29udGV4dCBpbnN0YW5jZW9mIFdlYkdMUmVuZGVyaW5nQ29udGV4dCApIHtcclxuXHJcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogV2ViR0wgMSBpcyBub3Qgc3VwcG9ydGVkIHNpbmNlIHIxNjMuJyApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0X2FscGhhID0gY29udGV4dC5nZXRDb250ZXh0QXR0cmlidXRlcygpLmFscGhhO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRfYWxwaGEgPSBhbHBoYTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgdWludENsZWFyQ29sb3IgPSBuZXcgVWludDMyQXJyYXkoIDQgKTtcclxuXHRcdGNvbnN0IGludENsZWFyQ29sb3IgPSBuZXcgSW50MzJBcnJheSggNCApO1xyXG5cclxuXHRcdGxldCBjdXJyZW50UmVuZGVyTGlzdCA9IG51bGw7XHJcblx0XHRsZXQgY3VycmVudFJlbmRlclN0YXRlID0gbnVsbDtcclxuXHJcblx0XHQvLyByZW5kZXIoKSBjYW4gYmUgY2FsbGVkIGZyb20gd2l0aGluIGEgY2FsbGJhY2sgdHJpZ2dlcmVkIGJ5IGFub3RoZXIgcmVuZGVyLlxyXG5cdFx0Ly8gV2UgdHJhY2sgdGhpcyBzbyB0aGF0IHRoZSBuZXN0ZWQgcmVuZGVyIGNhbGwgZ2V0cyBpdHMgbGlzdCBhbmQgc3RhdGUgaXNvbGF0ZWQgZnJvbSB0aGUgcGFyZW50IHJlbmRlciBjYWxsLlxyXG5cclxuXHRcdGNvbnN0IHJlbmRlckxpc3RTdGFjayA9IFtdO1xyXG5cdFx0Y29uc3QgcmVuZGVyU3RhdGVTdGFjayA9IFtdO1xyXG5cclxuXHRcdC8vIHB1YmxpYyBwcm9wZXJ0aWVzXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGNhbnZhcyB3aGVyZSB0aGUgcmVuZGVyZXIgZHJhd3MgaXRzIG91dHB1dC5UaGlzIGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBieSB0aGUgcmVuZGVyZXJcclxuXHRcdCAqIGluIHRoZSBjb25zdHJ1Y3RvciAoaWYgbm90IHByb3ZpZGVkIGFscmVhZHkpOyB5b3UganVzdCBuZWVkIHRvIGFkZCBpdCB0byB5b3VyIHBhZ2UgbGlrZSBzbzpcclxuXHRcdCAqIGBgYGpzXHJcblx0XHQgKiBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKCByZW5kZXJlci5kb21FbGVtZW50ICk7XHJcblx0XHQgKiBgYGBcclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7RE9NRWxlbWVudH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kb21FbGVtZW50ID0gY2FudmFzO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBvYmplY3Qgd2l0aCBkZWJ1ZyBjb25maWd1cmF0aW9uIHNldHRpbmdzLlxyXG5cdFx0ICpcclxuXHRcdCAqIC0gYGNoZWNrU2hhZGVyRXJyb3JzYDogSWYgaXQgaXMgYHRydWVgLCBkZWZpbmVzIHdoZXRoZXIgbWF0ZXJpYWwgc2hhZGVyIHByb2dyYW1zIGFyZVxyXG5cdFx0ICogY2hlY2tlZCBmb3IgZXJyb3JzIGR1cmluZyBjb21waWxhdGlvbiBhbmQgbGlua2FnZSBwcm9jZXNzLiBJdCBtYXkgYmUgdXNlZnVsIHRvIGRpc2FibGVcclxuXHRcdCAqIHRoaXMgY2hlY2sgaW4gcHJvZHVjdGlvbiBmb3IgcGVyZm9ybWFuY2UgZ2Fpbi4gSXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8ga2VlcCB0aGVzZVxyXG5cdFx0ICogY2hlY2tzIGVuYWJsZWQgZHVyaW5nIGRldmVsb3BtZW50LiBJZiB0aGUgc2hhZGVyIGRvZXMgbm90IGNvbXBpbGUgYW5kIGxpbmsgLSBpdCB3aWxsIG5vdFxyXG5cdFx0ICogd29yayBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbCB3aWxsIG5vdCByZW5kZXIuXHJcblx0XHQgKiAtIGBvblNoYWRlckVycm9yKGdsLCBwcm9ncmFtLCBnbFZlcnRleFNoYWRlcixnbEZyYWdtZW50U2hhZGVyKWA6IEEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdFxyXG5cdFx0ICogY2FuIGJlIHVzZWQgZm9yIGN1c3RvbSBlcnJvciByZXBvcnRpbmcuIFRoZSBjYWxsYmFjayByZWNlaXZlcyB0aGUgV2ViR0wgY29udGV4dCwgYW4gaW5zdGFuY2VcclxuXHRcdCAqIG9mIFdlYkdMUHJvZ3JhbSBhcyB3ZWxsIHR3byBpbnN0YW5jZXMgb2YgV2ViR0xTaGFkZXIgcmVwcmVzZW50aW5nIHRoZSB2ZXJ0ZXggYW5kIGZyYWdtZW50IHNoYWRlci5cclxuXHRcdCAqIEFzc2lnbmluZyBhIGN1c3RvbSBmdW5jdGlvbiBkaXNhYmxlcyB0aGUgZGVmYXVsdCBlcnJvciByZXBvcnRpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kZWJ1ZyA9IHtcclxuXHJcblx0XHRcdC8qKlxyXG5cdFx0XHQgKiBFbmFibGVzIGVycm9yIGNoZWNraW5nIGFuZCByZXBvcnRpbmcgd2hlbiBzaGFkZXIgcHJvZ3JhbXMgYXJlIGJlaW5nIGNvbXBpbGVkLlxyXG5cdFx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdFx0ICovXHJcblx0XHRcdGNoZWNrU2hhZGVyRXJyb3JzOiB0cnVlLFxyXG5cdFx0XHQvKipcclxuXHRcdFx0ICogQ2FsbGJhY2sgZm9yIGN1c3RvbSBlcnJvciByZXBvcnRpbmcuXHJcblx0XHRcdCAqIEB0eXBlIHs/RnVuY3Rpb259XHJcblx0XHRcdCAqL1xyXG5cdFx0XHRvblNoYWRlckVycm9yOiBudWxsXHJcblx0XHR9O1xyXG5cclxuXHRcdC8vIGNsZWFyaW5nXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSByZW5kZXJlciBzaG91bGQgYXV0b21hdGljYWxseSBjbGVhciBpdHMgb3V0cHV0IGJlZm9yZSByZW5kZXJpbmcgYSBmcmFtZSBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYXV0b0NsZWFyID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIElmIHtAbGluayBXZWJHTFJlbmRlcmVyI2F1dG9DbGVhcn0gc2V0IHRvIGB0cnVlYCwgd2hldGhlciB0aGUgcmVuZGVyZXIgc2hvdWxkIGNsZWFyXHJcblx0XHQgKiB0aGUgY29sb3IgYnVmZmVyIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hdXRvQ2xlYXJDb2xvciA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBJZiB7QGxpbmsgV2ViR0xSZW5kZXJlciNhdXRvQ2xlYXJ9IHNldCB0byBgdHJ1ZWAsIHdoZXRoZXIgdGhlIHJlbmRlcmVyIHNob3VsZCBjbGVhclxyXG5cdFx0ICogdGhlIGRlcHRoIGJ1ZmZlciBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYXV0b0NsZWFyRGVwdGggPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSWYge0BsaW5rIFdlYkdMUmVuZGVyZXIjYXV0b0NsZWFyfSBzZXQgdG8gYHRydWVgLCB3aGV0aGVyIHRoZSByZW5kZXJlciBzaG91bGQgY2xlYXJcclxuXHRcdCAqIHRoZSBzdGVuY2lsIGJ1ZmZlciBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYXV0b0NsZWFyU3RlbmNpbCA9IHRydWU7XHJcblxyXG5cdFx0Ly8gc2NlbmUgZ3JhcGhcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIHJlbmRlcmVyIHNob3VsZCBzb3J0IG9iamVjdHMgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIE5vdGU6IFNvcnRpbmcgaXMgdXNlZCB0byBhdHRlbXB0IHRvIHByb3Blcmx5IHJlbmRlciBvYmplY3RzIHRoYXQgaGF2ZSBzb21lXHJcblx0XHQgKiBkZWdyZWUgb2YgdHJhbnNwYXJlbmN5LiBCeSBkZWZpbml0aW9uLCBzb3J0aW5nIG9iamVjdHMgbWF5IG5vdCB3b3JrIGluIGFsbFxyXG5cdFx0ICogY2FzZXMuIERlcGVuZGluZyBvbiB0aGUgbmVlZHMgb2YgYXBwbGljYXRpb24sIGl0IG1heSBiZSBuZWNlc3NhcnkgdG8gdHVyblxyXG5cdFx0ICogb2ZmIHNvcnRpbmcgYW5kIHVzZSBvdGhlciBtZXRob2RzIHRvIGRlYWwgd2l0aCB0cmFuc3BhcmVuY3kgcmVuZGVyaW5nIGUuZy5cclxuXHRcdCAqIG1hbnVhbGx5IGRldGVybWluaW5nIGVhY2ggb2JqZWN0J3MgcmVuZGVyaW5nIG9yZGVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNvcnRPYmplY3RzID0gdHJ1ZTtcclxuXHJcblx0XHQvLyB1c2VyLWRlZmluZWQgY2xpcHBpbmdcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFVzZXItZGVmaW5lZCBjbGlwcGluZyBwbGFuZXMgc3BlY2lmaWVkIGluIHdvcmxkIHNwYWNlLiBUaGVzZSBwbGFuZXMgYXBwbHkgZ2xvYmFsbHkuXHJcblx0XHQgKiBQb2ludHMgaW4gc3BhY2Ugd2hvc2UgZG90IHByb2R1Y3Qgd2l0aCB0aGUgcGxhbmUgaXMgbmVnYXRpdmUgYXJlIGN1dCBhd2F5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxQbGFuZT59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2xpcHBpbmdQbGFuZXMgPSBbXTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIHJlbmRlcmVyIHJlc3BlY3RzIG9iamVjdC1sZXZlbCBjbGlwcGluZyBwbGFuZXMgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5sb2NhbENsaXBwaW5nRW5hYmxlZCA9IGZhbHNlO1xyXG5cclxuXHRcdC8vIHRvbmUgbWFwcGluZ1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHRvbmUgbWFwcGluZyB0ZWNobmlxdWUgb2YgdGhlIHJlbmRlcmVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoTm9Ub25lTWFwcGluZ3xMaW5lYXJUb25lTWFwcGluZ3xSZWluaGFyZFRvbmVNYXBwaW5nfENpbmVvblRvbmVNYXBwaW5nfEFDRVNGaWxtaWNUb25lTWFwcGluZ3xDdXN0b21Ub25lTWFwcGluZ3xBZ1hUb25lTWFwcGluZ3xOZXV0cmFsVG9uZU1hcHBpbmcpfVxyXG5cdFx0ICogQGRlZmF1bHQgTm9Ub25lTWFwcGluZ1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRvbmVNYXBwaW5nID0gTm9Ub25lTWFwcGluZztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEV4cG9zdXJlIGxldmVsIG9mIHRvbmUgbWFwcGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRvbmVNYXBwaW5nRXhwb3N1cmUgPSAxLjA7XHJcblxyXG5cdFx0Ly8gdHJhbnNtaXNzaW9uXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbm9ybWFsaXplZCByZXNvbHV0aW9uIHNjYWxlIGZvciB0aGUgdHJhbnNtaXNzaW9uIHJlbmRlciB0YXJnZXQsIG1lYXN1cmVkIGluIHBlcmNlbnRhZ2VcclxuXHRcdCAqIG9mIHZpZXdwb3J0IGRpbWVuc2lvbnMuIExvd2VyaW5nIHRoaXMgdmFsdWUgY2FuIHJlc3VsdCBpbiBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHNcclxuXHRcdCAqIHdoZW4gdXNpbmcge0BsaW5rIE1lc2hQaHlzaWNhbE1hdGVyaWFsI3RyYW5zbWlzc2lvbn0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50cmFuc21pc3Npb25SZXNvbHV0aW9uU2NhbGUgPSAxLjA7XHJcblxyXG5cdFx0Ly8gaW50ZXJuYWwgcHJvcGVydGllc1xyXG5cclxuXHRcdGNvbnN0IF90aGlzID0gdGhpcztcclxuXHJcblx0XHRsZXQgX2lzQ29udGV4dExvc3QgPSBmYWxzZTtcclxuXHJcblx0XHQvLyBpbnRlcm5hbCBzdGF0ZSBjYWNoZVxyXG5cclxuXHRcdHRoaXMuX291dHB1dENvbG9yU3BhY2UgPSBTUkdCQ29sb3JTcGFjZTtcclxuXHJcblx0XHRsZXQgX2N1cnJlbnRBY3RpdmVDdWJlRmFjZSA9IDA7XHJcblx0XHRsZXQgX2N1cnJlbnRBY3RpdmVNaXBtYXBMZXZlbCA9IDA7XHJcblx0XHRsZXQgX2N1cnJlbnRSZW5kZXJUYXJnZXQgPSBudWxsO1xyXG5cdFx0bGV0IF9jdXJyZW50TWF0ZXJpYWxJZCA9IC0gMTtcclxuXHJcblx0XHRsZXQgX2N1cnJlbnRDYW1lcmEgPSBudWxsO1xyXG5cclxuXHRcdGNvbnN0IF9jdXJyZW50Vmlld3BvcnQgPSBuZXcgVmVjdG9yNCgpO1xyXG5cdFx0Y29uc3QgX2N1cnJlbnRTY2lzc29yID0gbmV3IFZlY3RvcjQoKTtcclxuXHRcdGxldCBfY3VycmVudFNjaXNzb3JUZXN0ID0gbnVsbDtcclxuXHJcblx0XHRjb25zdCBfY3VycmVudENsZWFyQ29sb3IgPSBuZXcgQ29sb3IoIDB4MDAwMDAwICk7XHJcblx0XHRsZXQgX2N1cnJlbnRDbGVhckFscGhhID0gMDtcclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGxldCBfd2lkdGggPSBjYW52YXMud2lkdGg7XHJcblx0XHRsZXQgX2hlaWdodCA9IGNhbnZhcy5oZWlnaHQ7XHJcblxyXG5cdFx0bGV0IF9waXhlbFJhdGlvID0gMTtcclxuXHRcdGxldCBfb3BhcXVlU29ydCA9IG51bGw7XHJcblx0XHRsZXQgX3RyYW5zcGFyZW50U29ydCA9IG51bGw7XHJcblxyXG5cdFx0Y29uc3QgX3ZpZXdwb3J0ID0gbmV3IFZlY3RvcjQoIDAsIDAsIF93aWR0aCwgX2hlaWdodCApO1xyXG5cdFx0Y29uc3QgX3NjaXNzb3IgPSBuZXcgVmVjdG9yNCggMCwgMCwgX3dpZHRoLCBfaGVpZ2h0ICk7XHJcblx0XHRsZXQgX3NjaXNzb3JUZXN0ID0gZmFsc2U7XHJcblxyXG5cdFx0Ly8gZnJ1c3R1bVxyXG5cclxuXHRcdGNvbnN0IF9mcnVzdHVtID0gbmV3IEZydXN0dW0oKTtcclxuXHJcblx0XHQvLyBjbGlwcGluZ1xyXG5cclxuXHRcdGxldCBfY2xpcHBpbmdFbmFibGVkID0gZmFsc2U7XHJcblx0XHRsZXQgX2xvY2FsQ2xpcHBpbmdFbmFibGVkID0gZmFsc2U7XHJcblxyXG5cdFx0Ly8gY2FtZXJhIG1hdHJpY2VzIGNhY2hlXHJcblxyXG5cdFx0Y29uc3QgX2N1cnJlbnRQcm9qZWN0aW9uTWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcclxuXHRcdGNvbnN0IF9wcm9qU2NyZWVuTWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcclxuXHJcblx0XHRjb25zdCBfdmVjdG9yMyA9IG5ldyBWZWN0b3IzKCk7XHJcblxyXG5cdFx0Y29uc3QgX3ZlY3RvcjQgPSBuZXcgVmVjdG9yNCgpO1xyXG5cclxuXHRcdGNvbnN0IF9lbXB0eVNjZW5lID0geyBiYWNrZ3JvdW5kOiBudWxsLCBmb2c6IG51bGwsIGVudmlyb25tZW50OiBudWxsLCBvdmVycmlkZU1hdGVyaWFsOiBudWxsLCBpc1NjZW5lOiB0cnVlIH07XHJcblxyXG5cdFx0bGV0IF9yZW5kZXJCYWNrZ3JvdW5kID0gZmFsc2U7XHJcblxyXG5cdFx0ZnVuY3Rpb24gZ2V0VGFyZ2V0UGl4ZWxSYXRpbygpIHtcclxuXHJcblx0XHRcdHJldHVybiBfY3VycmVudFJlbmRlclRhcmdldCA9PT0gbnVsbCA/IF9waXhlbFJhdGlvIDogMTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gaW5pdGlhbGl6ZVxyXG5cclxuXHRcdGxldCBfZ2wgPSBjb250ZXh0O1xyXG5cclxuXHRcdGZ1bmN0aW9uIGdldENvbnRleHQoIGNvbnRleHROYW1lLCBjb250ZXh0QXR0cmlidXRlcyApIHtcclxuXHJcblx0XHRcdHJldHVybiBjYW52YXMuZ2V0Q29udGV4dCggY29udGV4dE5hbWUsIGNvbnRleHRBdHRyaWJ1dGVzICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRyeSB7XHJcblxyXG5cdFx0XHRjb25zdCBjb250ZXh0QXR0cmlidXRlcyA9IHtcclxuXHRcdFx0XHRhbHBoYTogdHJ1ZSxcclxuXHRcdFx0XHRkZXB0aCxcclxuXHRcdFx0XHRzdGVuY2lsLFxyXG5cdFx0XHRcdGFudGlhbGlhcyxcclxuXHRcdFx0XHRwcmVtdWx0aXBsaWVkQWxwaGEsXHJcblx0XHRcdFx0cHJlc2VydmVEcmF3aW5nQnVmZmVyLFxyXG5cdFx0XHRcdHBvd2VyUHJlZmVyZW5jZSxcclxuXHRcdFx0XHRmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0LFxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0Ly8gT2Zmc2NyZWVuQ2FudmFzIGRvZXMgbm90IGhhdmUgc2V0QXR0cmlidXRlLCBzZWUgIzIyODExXHJcblx0XHRcdGlmICggJ3NldEF0dHJpYnV0ZScgaW4gY2FudmFzICkgY2FudmFzLnNldEF0dHJpYnV0ZSggJ2RhdGEtZW5naW5lJywgYHRocmVlLmpzIHIke1JFVklTSU9OfWAgKTtcclxuXHJcblx0XHRcdC8vIGV2ZW50IGxpc3RlbmVycyBtdXN0IGJlIHJlZ2lzdGVyZWQgYmVmb3JlIFdlYkdMIGNvbnRleHQgaXMgY3JlYXRlZCwgc2VlICMxMjc1M1xyXG5cdFx0XHRjYW52YXMuYWRkRXZlbnRMaXN0ZW5lciggJ3dlYmdsY29udGV4dGxvc3QnLCBvbkNvbnRleHRMb3N0LCBmYWxzZSApO1xyXG5cdFx0XHRjYW52YXMuYWRkRXZlbnRMaXN0ZW5lciggJ3dlYmdsY29udGV4dHJlc3RvcmVkJywgb25Db250ZXh0UmVzdG9yZSwgZmFsc2UgKTtcclxuXHRcdFx0Y2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoICd3ZWJnbGNvbnRleHRjcmVhdGlvbmVycm9yJywgb25Db250ZXh0Q3JlYXRpb25FcnJvciwgZmFsc2UgKTtcclxuXHJcblx0XHRcdGlmICggX2dsID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBjb250ZXh0TmFtZSA9ICd3ZWJnbDInO1xyXG5cclxuXHRcdFx0XHRfZ2wgPSBnZXRDb250ZXh0KCBjb250ZXh0TmFtZSwgY29udGV4dEF0dHJpYnV0ZXMgKTtcclxuXHJcblx0XHRcdFx0aWYgKCBfZ2wgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBnZXRDb250ZXh0KCBjb250ZXh0TmFtZSApICkge1xyXG5cclxuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnRXJyb3IgY3JlYXRpbmcgV2ViR0wgY29udGV4dCB3aXRoIHlvdXIgc2VsZWN0ZWQgYXR0cmlidXRlcy4nICk7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciggJ0Vycm9yIGNyZWF0aW5nIFdlYkdMIGNvbnRleHQuJyApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gY2F0Y2ggKCBlcnJvciApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAnICsgZXJyb3IubWVzc2FnZSApO1xyXG5cdFx0XHR0aHJvdyBlcnJvcjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0bGV0IGV4dGVuc2lvbnMsIGNhcGFiaWxpdGllcywgc3RhdGUsIGluZm87XHJcblx0XHRsZXQgcHJvcGVydGllcywgdGV4dHVyZXMsIGN1YmVtYXBzLCBjdWJldXZtYXBzLCBhdHRyaWJ1dGVzLCBnZW9tZXRyaWVzLCBvYmplY3RzO1xyXG5cdFx0bGV0IHByb2dyYW1DYWNoZSwgbWF0ZXJpYWxzLCByZW5kZXJMaXN0cywgcmVuZGVyU3RhdGVzLCBjbGlwcGluZywgc2hhZG93TWFwO1xyXG5cclxuXHRcdGxldCBiYWNrZ3JvdW5kLCBtb3JwaHRhcmdldHMsIGJ1ZmZlclJlbmRlcmVyLCBpbmRleGVkQnVmZmVyUmVuZGVyZXI7XHJcblxyXG5cdFx0bGV0IHV0aWxzLCBiaW5kaW5nU3RhdGVzLCB1bmlmb3Jtc0dyb3VwcztcclxuXHJcblx0XHRmdW5jdGlvbiBpbml0R0xDb250ZXh0KCkge1xyXG5cclxuXHRcdFx0ZXh0ZW5zaW9ucyA9IG5ldyBXZWJHTEV4dGVuc2lvbnMoIF9nbCApO1xyXG5cdFx0XHRleHRlbnNpb25zLmluaXQoKTtcclxuXHJcblx0XHRcdHV0aWxzID0gbmV3IFdlYkdMVXRpbHMoIF9nbCwgZXh0ZW5zaW9ucyApO1xyXG5cclxuXHRcdFx0Y2FwYWJpbGl0aWVzID0gbmV3IFdlYkdMQ2FwYWJpbGl0aWVzKCBfZ2wsIGV4dGVuc2lvbnMsIHBhcmFtZXRlcnMsIHV0aWxzICk7XHJcblxyXG5cdFx0XHRzdGF0ZSA9IG5ldyBXZWJHTFN0YXRlKCBfZ2wsIGV4dGVuc2lvbnMgKTtcclxuXHJcblx0XHRcdGlmICggY2FwYWJpbGl0aWVzLnJldmVyc2VEZXB0aEJ1ZmZlciAmJiByZXZlcnNlRGVwdGhCdWZmZXIgKSB7XHJcblxyXG5cdFx0XHRcdHN0YXRlLmJ1ZmZlcnMuZGVwdGguc2V0UmV2ZXJzZWQoIHRydWUgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGluZm8gPSBuZXcgV2ViR0xJbmZvKCBfZ2wgKTtcclxuXHRcdFx0cHJvcGVydGllcyA9IG5ldyBXZWJHTFByb3BlcnRpZXMoKTtcclxuXHRcdFx0dGV4dHVyZXMgPSBuZXcgV2ViR0xUZXh0dXJlcyggX2dsLCBleHRlbnNpb25zLCBzdGF0ZSwgcHJvcGVydGllcywgY2FwYWJpbGl0aWVzLCB1dGlscywgaW5mbyApO1xyXG5cdFx0XHRjdWJlbWFwcyA9IG5ldyBXZWJHTEN1YmVNYXBzKCBfdGhpcyApO1xyXG5cdFx0XHRjdWJldXZtYXBzID0gbmV3IFdlYkdMQ3ViZVVWTWFwcyggX3RoaXMgKTtcclxuXHRcdFx0YXR0cmlidXRlcyA9IG5ldyBXZWJHTEF0dHJpYnV0ZXMoIF9nbCApO1xyXG5cdFx0XHRiaW5kaW5nU3RhdGVzID0gbmV3IFdlYkdMQmluZGluZ1N0YXRlcyggX2dsLCBhdHRyaWJ1dGVzICk7XHJcblx0XHRcdGdlb21ldHJpZXMgPSBuZXcgV2ViR0xHZW9tZXRyaWVzKCBfZ2wsIGF0dHJpYnV0ZXMsIGluZm8sIGJpbmRpbmdTdGF0ZXMgKTtcclxuXHRcdFx0b2JqZWN0cyA9IG5ldyBXZWJHTE9iamVjdHMoIF9nbCwgZ2VvbWV0cmllcywgYXR0cmlidXRlcywgaW5mbyApO1xyXG5cdFx0XHRtb3JwaHRhcmdldHMgPSBuZXcgV2ViR0xNb3JwaHRhcmdldHMoIF9nbCwgY2FwYWJpbGl0aWVzLCB0ZXh0dXJlcyApO1xyXG5cdFx0XHRjbGlwcGluZyA9IG5ldyBXZWJHTENsaXBwaW5nKCBwcm9wZXJ0aWVzICk7XHJcblx0XHRcdHByb2dyYW1DYWNoZSA9IG5ldyBXZWJHTFByb2dyYW1zKCBfdGhpcywgY3ViZW1hcHMsIGN1YmV1dm1hcHMsIGV4dGVuc2lvbnMsIGNhcGFiaWxpdGllcywgYmluZGluZ1N0YXRlcywgY2xpcHBpbmcgKTtcclxuXHRcdFx0bWF0ZXJpYWxzID0gbmV3IFdlYkdMTWF0ZXJpYWxzKCBfdGhpcywgcHJvcGVydGllcyApO1xyXG5cdFx0XHRyZW5kZXJMaXN0cyA9IG5ldyBXZWJHTFJlbmRlckxpc3RzKCk7XHJcblx0XHRcdHJlbmRlclN0YXRlcyA9IG5ldyBXZWJHTFJlbmRlclN0YXRlcyggZXh0ZW5zaW9ucyApO1xyXG5cdFx0XHRiYWNrZ3JvdW5kID0gbmV3IFdlYkdMQmFja2dyb3VuZCggX3RoaXMsIGN1YmVtYXBzLCBjdWJldXZtYXBzLCBzdGF0ZSwgb2JqZWN0cywgX2FscGhhLCBwcmVtdWx0aXBsaWVkQWxwaGEgKTtcclxuXHRcdFx0c2hhZG93TWFwID0gbmV3IFdlYkdMU2hhZG93TWFwKCBfdGhpcywgb2JqZWN0cywgY2FwYWJpbGl0aWVzICk7XHJcblx0XHRcdHVuaWZvcm1zR3JvdXBzID0gbmV3IFdlYkdMVW5pZm9ybXNHcm91cHMoIF9nbCwgaW5mbywgY2FwYWJpbGl0aWVzLCBzdGF0ZSApO1xyXG5cclxuXHRcdFx0YnVmZmVyUmVuZGVyZXIgPSBuZXcgV2ViR0xCdWZmZXJSZW5kZXJlciggX2dsLCBleHRlbnNpb25zLCBpbmZvICk7XHJcblx0XHRcdGluZGV4ZWRCdWZmZXJSZW5kZXJlciA9IG5ldyBXZWJHTEluZGV4ZWRCdWZmZXJSZW5kZXJlciggX2dsLCBleHRlbnNpb25zLCBpbmZvICk7XHJcblxyXG5cdFx0XHRpbmZvLnByb2dyYW1zID0gcHJvZ3JhbUNhY2hlLnByb2dyYW1zO1xyXG5cclxuXHRcdFx0LyoqXHJcblx0XHRcdCAqIEhvbGRzIGRldGFpbHMgYWJvdXQgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgY3VycmVudCByZW5kZXJpbmcgY29udGV4dC5cclxuXHRcdFx0ICpcclxuXHRcdFx0ICogQG5hbWUgV2ViR0xSZW5kZXJlciNjYXBhYmlsaXRpZXNcclxuXHRcdFx0ICogQHR5cGUge1dlYkdMUmVuZGVyZXJ+Q2FwYWJpbGl0aWVzfVxyXG5cdFx0XHQgKi9cclxuXHRcdFx0X3RoaXMuY2FwYWJpbGl0aWVzID0gY2FwYWJpbGl0aWVzO1xyXG5cclxuXHRcdFx0LyoqXHJcblx0XHRcdCAqIFByb3ZpZGVzIG1ldGhvZHMgZm9yIHJldHJpZXZpbmcgYW5kIHRlc3RpbmcgV2ViR0wgZXh0ZW5zaW9ucy5cclxuXHRcdFx0ICpcclxuXHRcdFx0ICogLSBgZ2V0KGV4dGVuc2lvbk5hbWU6c3RyaW5nKWA6IFVzZWQgdG8gY2hlY2sgd2hldGhlciBhIFdlYkdMIGV4dGVuc2lvbiBpcyBzdXBwb3J0ZWRcclxuXHRcdFx0ICogYW5kIHJldHVybiB0aGUgZXh0ZW5zaW9uIG9iamVjdCBpZiBhdmFpbGFibGUuXHJcblx0XHRcdCAqIC0gYGhhcyhleHRlbnNpb25OYW1lOnN0cmluZylgOiByZXR1cm5zIGB0cnVlYCBpZiB0aGUgZXh0ZW5zaW9uIGlzIHN1cHBvcnRlZC5cclxuXHRcdFx0ICpcclxuXHRcdFx0ICogQG5hbWUgV2ViR0xSZW5kZXJlciNleHRlbnNpb25zXHJcblx0XHRcdCAqIEB0eXBlIHtPYmplY3R9XHJcblx0XHRcdCAqL1xyXG5cdFx0XHRfdGhpcy5leHRlbnNpb25zID0gZXh0ZW5zaW9ucztcclxuXHJcblx0XHRcdC8qKlxyXG5cdFx0XHQgKiBVc2VkIHRvIHRyYWNrIHByb3BlcnRpZXMgb2Ygb3RoZXIgb2JqZWN0cyBsaWtlIG5hdGl2ZSBXZWJHTCBvYmplY3RzLlxyXG5cdFx0XHQgKlxyXG5cdFx0XHQgKiBAbmFtZSBXZWJHTFJlbmRlcmVyI3Byb3BlcnRpZXNcclxuXHRcdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdFx0ICovXHJcblx0XHRcdF90aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzO1xyXG5cclxuXHRcdFx0LyoqXHJcblx0XHRcdCAqIE1hbmFnZXMgdGhlIHJlbmRlciBsaXN0cyBvZiB0aGUgcmVuZGVyZXIuXHJcblx0XHRcdCAqXHJcblx0XHRcdCAqIEBuYW1lIFdlYkdMUmVuZGVyZXIjcmVuZGVyTGlzdHNcclxuXHRcdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdFx0ICovXHJcblx0XHRcdF90aGlzLnJlbmRlckxpc3RzID0gcmVuZGVyTGlzdHM7XHJcblxyXG5cclxuXHJcblx0XHRcdC8qKlxyXG5cdFx0XHQgKiBJbnRlcmZhY2UgZm9yIG1hbmFnaW5nIHNoYWRvd3MuXHJcblx0XHRcdCAqXHJcblx0XHRcdCAqIEBuYW1lIFdlYkdMUmVuZGVyZXIjc2hhZG93TWFwXHJcblx0XHRcdCAqIEB0eXBlIHtXZWJHTFJlbmRlcmVyflNoYWRvd01hcH1cclxuXHRcdFx0ICovXHJcblx0XHRcdF90aGlzLnNoYWRvd01hcCA9IHNoYWRvd01hcDtcclxuXHJcblx0XHRcdC8qKlxyXG5cdFx0XHQgKiBJbnRlcmZhY2UgZm9yIG1hbmFnaW5nIHRoZSBXZWJHTCBzdGF0ZS5cclxuXHRcdFx0ICpcclxuXHRcdFx0ICogQG5hbWUgV2ViR0xSZW5kZXJlciNzdGF0ZVxyXG5cdFx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0XHQgKi9cclxuXHRcdFx0X3RoaXMuc3RhdGUgPSBzdGF0ZTtcclxuXHJcblx0XHRcdC8qKlxyXG5cdFx0XHQgKiBIb2xkcyBhIHNlcmllcyBvZiBzdGF0aXN0aWNhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgR1BVIG1lbW9yeVxyXG5cdFx0XHQgKiBhbmQgdGhlIHJlbmRlcmluZyBwcm9jZXNzLiBVc2VmdWwgZm9yIGRlYnVnZ2luZyBhbmQgbW9uaXRvcmluZy5cclxuXHRcdFx0ICpcclxuXHRcdFx0ICogQnkgZGVmYXVsdCB0aGVzZSBkYXRhIGFyZSByZXNldCBhdCBlYWNoIHJlbmRlciBjYWxsIGJ1dCB3aGVuIGhhdmluZ1xyXG5cdFx0XHQgKiBtdWx0aXBsZSByZW5kZXIgcGFzc2VzIHBlciBmcmFtZSAoZS5nLiB3aGVuIHVzaW5nIHBvc3QgcHJvY2Vzc2luZykgaXQgY2FuXHJcblx0XHRcdCAqIGJlIHByZWZlcnJlZCB0byByZXNldCB3aXRoIGEgY3VzdG9tIHBhdHRlcm4uIEZpcnN0LCBzZXQgYGF1dG9SZXNldGAgdG9cclxuXHRcdFx0ICogYGZhbHNlYC5cclxuXHRcdFx0ICogYGBganNcclxuXHRcdFx0ICogcmVuZGVyZXIuaW5mby5hdXRvUmVzZXQgPSBmYWxzZTtcclxuXHRcdFx0ICogYGBgXHJcblx0XHRcdCAqIENhbGwgYHJlc2V0KClgIHdoZW5ldmVyIHlvdSBoYXZlIGZpbmlzaGVkIHRvIHJlbmRlciBhIHNpbmdsZSBmcmFtZS5cclxuXHRcdFx0ICogYGBganNcclxuXHRcdFx0ICogcmVuZGVyZXIuaW5mby5yZXNldCgpO1xyXG5cdFx0XHQgKiBgYGBcclxuXHRcdFx0ICpcclxuXHRcdFx0ICogQG5hbWUgV2ViR0xSZW5kZXJlciNpbmZvXHJcblx0XHRcdCAqIEB0eXBlIHtXZWJHTFJlbmRlcmVyfkluZm99XHJcblx0XHRcdCAqL1xyXG5cdFx0XHRfdGhpcy5pbmZvID0gaW5mbztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aW5pdEdMQ29udGV4dCgpO1xyXG5cclxuXHRcdC8vIHhyXHJcblxyXG5cdFx0Y29uc3QgeHIgPSBuZXcgV2ViWFJNYW5hZ2VyKCBfdGhpcywgX2dsICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZSB0byB0aGUgWFIgbWFuYWdlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2ViWFJNYW5hZ2VyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnhyID0geHI7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXR1cm5zIHRoZSByZW5kZXJpbmcgY29udGV4dC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcmV0dXJuIHtXZWJHTDJSZW5kZXJpbmdDb250ZXh0fSBUaGUgcmVuZGVyaW5nIGNvbnRleHQuXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ2V0Q29udGV4dCA9IGZ1bmN0aW9uICgpIHtcclxuXHJcblx0XHRcdHJldHVybiBfZ2w7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJldHVybnMgdGhlIHJlbmRlcmluZyBjb250ZXh0IGF0dHJpYnV0ZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHJldHVybiB7V2ViR0xDb250ZXh0QXR0cmlidXRlc30gVGhlIHJlbmRlcmluZyBjb250ZXh0IGF0dHJpYnV0ZXMuXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ2V0Q29udGV4dEF0dHJpYnV0ZXMgPSBmdW5jdGlvbiAoKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gX2dsLmdldENvbnRleHRBdHRyaWJ1dGVzKCk7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNpbXVsYXRlcyBhIGxvc3Mgb2YgdGhlIFdlYkdMIGNvbnRleHQuIFRoaXMgcmVxdWlyZXMgc3VwcG9ydCBmb3IgdGhlIGBXRUJHTF9sb3NlX2NvbnRleHRgIGV4dGVuc2lvbi5cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5mb3JjZUNvbnRleHRMb3NzID0gZnVuY3Rpb24gKCkge1xyXG5cclxuXHRcdFx0Y29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9sb3NlX2NvbnRleHQnICk7XHJcblx0XHRcdGlmICggZXh0ZW5zaW9uICkgZXh0ZW5zaW9uLmxvc2VDb250ZXh0KCk7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNpbXVsYXRlcyBhIHJlc3RvcmUgb2YgdGhlIFdlYkdMIGNvbnRleHQuIFRoaXMgcmVxdWlyZXMgc3VwcG9ydCBmb3IgdGhlIGBXRUJHTF9sb3NlX2NvbnRleHRgIGV4dGVuc2lvbi5cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5mb3JjZUNvbnRleHRSZXN0b3JlID0gZnVuY3Rpb24gKCkge1xyXG5cclxuXHRcdFx0Y29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9sb3NlX2NvbnRleHQnICk7XHJcblx0XHRcdGlmICggZXh0ZW5zaW9uICkgZXh0ZW5zaW9uLnJlc3RvcmVDb250ZXh0KCk7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJldHVybnMgdGhlIHBpeGVsIHJhdGlvLlxyXG5cdFx0ICpcclxuXHRcdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIHBpeGVsIHJhdGlvLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdldFBpeGVsUmF0aW8gPSBmdW5jdGlvbiAoKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gX3BpeGVsUmF0aW87XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNldHMgdGhlIGdpdmVuIHBpeGVsIHJhdGlvIGFuZCByZXNpemVzIHRoZSBjYW52YXMgaWYgbmVjZXNzYXJ5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBwaXhlbCByYXRpby5cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zZXRQaXhlbFJhdGlvID0gZnVuY3Rpb24gKCB2YWx1ZSApIHtcclxuXHJcblx0XHRcdGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHJldHVybjtcclxuXHJcblx0XHRcdF9waXhlbFJhdGlvID0gdmFsdWU7XHJcblxyXG5cdFx0XHR0aGlzLnNldFNpemUoIF93aWR0aCwgX2hlaWdodCwgZmFsc2UgKTtcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmV0dXJucyB0aGUgcmVuZGVyZXIncyBzaXplIGluIGxvZ2ljYWwgcGl4ZWxzLiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBob25vciB0aGUgcGl4ZWwgcmF0aW8uXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtWZWN0b3IyfSB0YXJnZXQgLSBUaGUgbWV0aG9kIHdyaXRlcyB0aGUgcmVzdWx0IGluIHRoaXMgdGFyZ2V0IG9iamVjdC5cclxuXHRcdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IFRoZSByZW5kZXJlcidzIHNpemUgaW4gbG9naWNhbCBwaXhlbHMuXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ2V0U2l6ZSA9IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIHRhcmdldC5zZXQoIF93aWR0aCwgX2hlaWdodCApO1xyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXNpemVzIHRoZSBvdXRwdXQgY2FudmFzIHRvICh3aWR0aCwgaGVpZ2h0KSB3aXRoIGRldmljZSBwaXhlbCByYXRpbyB0YWtlblxyXG5cdFx0ICogaW50byBhY2NvdW50LCBhbmQgYWxzbyBzZXRzIHRoZSB2aWV3cG9ydCB0byBmaXQgdGhhdCBzaXplLCBzdGFydGluZyBpbiAoMCxcclxuXHRcdCAqIDApLiBTZXR0aW5nIGB1cGRhdGVTdHlsZWAgdG8gZmFsc2UgcHJldmVudHMgYW55IHN0eWxlIGNoYW5nZXMgdG8gdGhlIG91dHB1dCBjYW52YXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIGluIGxvZ2ljYWwgcGl4ZWxzLlxyXG5cdFx0ICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgaW4gbG9naWNhbCBwaXhlbHMuXHJcblx0XHQgKiBAcGFyYW0ge2Jvb2xlYW59IFt1cGRhdGVTdHlsZT10cnVlXSAtIFdoZXRoZXIgdG8gdXBkYXRlIHRoZSBgc3R5bGVgIGF0dHJpYnV0ZSBvZiB0aGUgY2FudmFzIG9yIG5vdC5cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zZXRTaXplID0gZnVuY3Rpb24gKCB3aWR0aCwgaGVpZ2h0LCB1cGRhdGVTdHlsZSA9IHRydWUgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHhyLmlzUHJlc2VudGluZyApIHtcclxuXHJcblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogQ2FuXFwndCBjaGFuZ2Ugc2l6ZSB3aGlsZSBWUiBkZXZpY2UgaXMgcHJlc2VudGluZy4nICk7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0X3dpZHRoID0gd2lkdGg7XHJcblx0XHRcdF9oZWlnaHQgPSBoZWlnaHQ7XHJcblxyXG5cdFx0XHRjYW52YXMud2lkdGggPSBNYXRoLmZsb29yKCB3aWR0aCAqIF9waXhlbFJhdGlvICk7XHJcblx0XHRcdGNhbnZhcy5oZWlnaHQgPSBNYXRoLmZsb29yKCBoZWlnaHQgKiBfcGl4ZWxSYXRpbyApO1xyXG5cclxuXHRcdFx0aWYgKCB1cGRhdGVTdHlsZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0Y2FudmFzLnN0eWxlLndpZHRoID0gd2lkdGggKyAncHgnO1xyXG5cdFx0XHRcdGNhbnZhcy5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAncHgnO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5zZXRWaWV3cG9ydCggMCwgMCwgd2lkdGgsIGhlaWdodCApO1xyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXR1cm5zIHRoZSBkcmF3aW5nIGJ1ZmZlciBzaXplIGluIHBoeXNpY2FsIHBpeGVscy4gVGhpcyBtZXRob2QgaG9ub3JzIHRoZSBwaXhlbCByYXRpby5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IHRhcmdldCAtIFRoZSBtZXRob2Qgd3JpdGVzIHRoZSByZXN1bHQgaW4gdGhpcyB0YXJnZXQgb2JqZWN0LlxyXG5cdFx0ICogQHJldHVybiB7VmVjdG9yMn0gVGhlIGRyYXdpbmcgYnVmZmVyIHNpemUuXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ2V0RHJhd2luZ0J1ZmZlclNpemUgPSBmdW5jdGlvbiAoIHRhcmdldCApIHtcclxuXHJcblx0XHRcdHJldHVybiB0YXJnZXQuc2V0KCBfd2lkdGggKiBfcGl4ZWxSYXRpbywgX2hlaWdodCAqIF9waXhlbFJhdGlvICkuZmxvb3IoKTtcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBtZXRob2QgYWxsb3dzIHRvIGRlZmluZSB0aGUgZHJhd2luZyBidWZmZXIgc2l6ZSBieSBzcGVjaWZ5aW5nXHJcblx0XHQgKiB3aWR0aCwgaGVpZ2h0IGFuZCBwaXhlbCByYXRpbyBhbGwgYXQgb25jZS4gVGhlIHNpemUgb2YgdGhlIGRyYXdpbmdcclxuXHRcdCAqIGJ1ZmZlciBpcyBjb21wdXRlZCB3aXRoIHRoaXMgZm9ybXVsYTpcclxuXHRcdCAqIGBgYGpzXHJcblx0XHQgKiBzaXplLnggPSB3aWR0aCAqIHBpeGVsUmF0aW87XHJcblx0XHQgKiBzaXplLnkgPSBoZWlnaHQgKiBwaXhlbFJhdGlvO1xyXG5cdFx0ICogYGBgXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIGluIGxvZ2ljYWwgcGl4ZWxzLlxyXG5cdFx0ICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgaW4gbG9naWNhbCBwaXhlbHMuXHJcblx0XHQgKiBAcGFyYW0ge251bWJlcn0gcGl4ZWxSYXRpbyAtIFRoZSBwaXhlbCByYXRpby5cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zZXREcmF3aW5nQnVmZmVyU2l6ZSA9IGZ1bmN0aW9uICggd2lkdGgsIGhlaWdodCwgcGl4ZWxSYXRpbyApIHtcclxuXHJcblx0XHRcdF93aWR0aCA9IHdpZHRoO1xyXG5cdFx0XHRfaGVpZ2h0ID0gaGVpZ2h0O1xyXG5cclxuXHRcdFx0X3BpeGVsUmF0aW8gPSBwaXhlbFJhdGlvO1xyXG5cclxuXHRcdFx0Y2FudmFzLndpZHRoID0gTWF0aC5mbG9vciggd2lkdGggKiBwaXhlbFJhdGlvICk7XHJcblx0XHRcdGNhbnZhcy5oZWlnaHQgPSBNYXRoLmZsb29yKCBoZWlnaHQgKiBwaXhlbFJhdGlvICk7XHJcblxyXG5cdFx0XHR0aGlzLnNldFZpZXdwb3J0KCAwLCAwLCB3aWR0aCwgaGVpZ2h0ICk7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJldHVybnMgdGhlIGN1cnJlbnQgdmlld3BvcnQgZGVmaW5pdGlvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IHRhcmdldCAtIFRoZSBtZXRob2Qgd3JpdGVzIHRoZSByZXN1bHQgaW4gdGhpcyB0YXJnZXQgb2JqZWN0LlxyXG5cdFx0ICogQHJldHVybiB7VmVjdG9yMn0gVGhlIGN1cnJlbnQgdmlld3BvcnQgZGVmaW5pdGlvbi5cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nZXRDdXJyZW50Vmlld3BvcnQgPSBmdW5jdGlvbiAoIHRhcmdldCApIHtcclxuXHJcblx0XHRcdHJldHVybiB0YXJnZXQuY29weSggX2N1cnJlbnRWaWV3cG9ydCApO1xyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXR1cm5zIHRoZSB2aWV3cG9ydCBkZWZpbml0aW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7VmVjdG9yNH0gdGFyZ2V0IC0gVGhlIG1ldGhvZCB3cml0ZXMgdGhlIHJlc3VsdCBpbiB0aGlzIHRhcmdldCBvYmplY3QuXHJcblx0XHQgKiBAcmV0dXJuIHtWZWN0b3I0fSBUaGUgdmlld3BvcnQgZGVmaW5pdGlvbi5cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nZXRWaWV3cG9ydCA9IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIHRhcmdldC5jb3B5KCBfdmlld3BvcnQgKTtcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU2V0cyB0aGUgdmlld3BvcnQgdG8gcmVuZGVyIGZyb20gYCh4LCB5KWAgdG8gYCh4ICsgd2lkdGgsIHkgKyBoZWlnaHQpYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge251bWJlciB8IFZlY3RvcjR9IHggLSBUaGUgaG9yaXpvbnRhbCBjb29yZGluYXRlIGZvciB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHZpZXdwb3J0IG9yaWdpbiBpbiBsb2dpY2FsIHBpeGVsIHVuaXQuXHJcblx0XHQgKiBPciBhbHRlcm5hdGl2ZWx5IGEgZm91ci1jb21wb25lbnQgdmVjdG9yIHNwZWNpZnlpbmcgYWxsIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSB2aWV3cG9ydC5cclxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHZlcnRpY2FsIGNvb3JkaW5hdGUgZm9yIHRoZSBsb3dlciBsZWZ0IGNvcm5lciBvZiB0aGUgdmlld3BvcnQgb3JpZ2luICBpbiBsb2dpY2FsIHBpeGVsIHVuaXQuXHJcblx0XHQgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIHZpZXdwb3J0IGluIGxvZ2ljYWwgcGl4ZWwgdW5pdC5cclxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSB2aWV3cG9ydCBpbiBsb2dpY2FsIHBpeGVsIHVuaXQuXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2V0Vmlld3BvcnQgPSBmdW5jdGlvbiAoIHgsIHksIHdpZHRoLCBoZWlnaHQgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHguaXNWZWN0b3I0ICkge1xyXG5cclxuXHRcdFx0XHRfdmlld3BvcnQuc2V0KCB4LngsIHgueSwgeC56LCB4LncgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdF92aWV3cG9ydC5zZXQoIHgsIHksIHdpZHRoLCBoZWlnaHQgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHN0YXRlLnZpZXdwb3J0KCBfY3VycmVudFZpZXdwb3J0LmNvcHkoIF92aWV3cG9ydCApLm11bHRpcGx5U2NhbGFyKCBfcGl4ZWxSYXRpbyApLnJvdW5kKCkgKTtcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmV0dXJucyB0aGUgc2Npc3NvciByZWdpb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtWZWN0b3I0fSB0YXJnZXQgLSBUaGUgbWV0aG9kIHdyaXRlcyB0aGUgcmVzdWx0IGluIHRoaXMgdGFyZ2V0IG9iamVjdC5cclxuXHRcdCAqIEByZXR1cm4ge1ZlY3RvcjR9IFRoZSBzY2lzc29yIHJlZ2lvbi5cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nZXRTY2lzc29yID0gZnVuY3Rpb24gKCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIF9zY2lzc29yICk7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNldHMgdGhlIHNjaXNzb3IgcmVnaW9uIHRvIHJlbmRlciBmcm9tIGAoeCwgeSlgIHRvIGAoeCArIHdpZHRoLCB5ICsgaGVpZ2h0KWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtudW1iZXIgfCBWZWN0b3I0fSB4IC0gVGhlIGhvcml6b250YWwgY29vcmRpbmF0ZSBmb3IgdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSBzY2lzc29yIHJlZ2lvbiBvcmlnaW4gaW4gbG9naWNhbCBwaXhlbCB1bml0LlxyXG5cdFx0ICogT3IgYWx0ZXJuYXRpdmVseSBhIGZvdXItY29tcG9uZW50IHZlY3RvciBzcGVjaWZ5aW5nIGFsbCB0aGUgcGFyYW1ldGVycyBvZiB0aGUgc2Npc3NvciByZWdpb24uXHJcblx0XHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB2ZXJ0aWNhbCBjb29yZGluYXRlIGZvciB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHNjaXNzb3IgcmVnaW9uIG9yaWdpbiAgaW4gbG9naWNhbCBwaXhlbCB1bml0LlxyXG5cdFx0ICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSBzY2lzc29yIHJlZ2lvbiBpbiBsb2dpY2FsIHBpeGVsIHVuaXQuXHJcblx0XHQgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgc2Npc3NvciByZWdpb24gaW4gbG9naWNhbCBwaXhlbCB1bml0LlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNldFNjaXNzb3IgPSBmdW5jdGlvbiAoIHgsIHksIHdpZHRoLCBoZWlnaHQgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHguaXNWZWN0b3I0ICkge1xyXG5cclxuXHRcdFx0XHRfc2Npc3Nvci5zZXQoIHgueCwgeC55LCB4LnosIHgudyApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0X3NjaXNzb3Iuc2V0KCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRzdGF0ZS5zY2lzc29yKCBfY3VycmVudFNjaXNzb3IuY29weSggX3NjaXNzb3IgKS5tdWx0aXBseVNjYWxhciggX3BpeGVsUmF0aW8gKS5yb3VuZCgpICk7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBzY2lzc29yIHRlc3QgaXMgZW5hYmxlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBzY2lzc29yIHRlc3QgaXMgZW5hYmxlZCBvciBub3QuXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ2V0U2Npc3NvclRlc3QgPSBmdW5jdGlvbiAoKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gX3NjaXNzb3JUZXN0O1xyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBFbmFibGUgb3IgZGlzYWJsZSB0aGUgc2Npc3NvciB0ZXN0LiBXaGVuIHRoaXMgaXMgZW5hYmxlZCwgb25seSB0aGUgcGl4ZWxzXHJcblx0XHQgKiB3aXRoaW4gdGhlIGRlZmluZWQgc2Npc3NvciBhcmVhIHdpbGwgYmUgYWZmZWN0ZWQgYnkgZnVydGhlciByZW5kZXJlclxyXG5cdFx0ICogYWN0aW9ucy5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge2Jvb2xlYW59IGJvb2xlYW4gLSBXaGV0aGVyIHRoZSBzY2lzc29yIHRlc3QgaXMgZW5hYmxlZCBvciBub3QuXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2V0U2Npc3NvclRlc3QgPSBmdW5jdGlvbiAoIGJvb2xlYW4gKSB7XHJcblxyXG5cdFx0XHRzdGF0ZS5zZXRTY2lzc29yVGVzdCggX3NjaXNzb3JUZXN0ID0gYm9vbGVhbiApO1xyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTZXRzIGEgY3VzdG9tIG9wYXF1ZSBzb3J0IGZ1bmN0aW9uIGZvciB0aGUgcmVuZGVyIGxpc3RzLiBQYXNzIGBudWxsYFxyXG5cdFx0ICogdG8gdXNlIHRoZSBkZWZhdWx0IGBwYWludGVyU29ydFN0YWJsZWAgZnVuY3Rpb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHs/RnVuY3Rpb259IG1ldGhvZCAtIFRoZSBvcGFxdWUgc29ydCBmdW5jdGlvbi5cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zZXRPcGFxdWVTb3J0ID0gZnVuY3Rpb24gKCBtZXRob2QgKSB7XHJcblxyXG5cdFx0XHRfb3BhcXVlU29ydCA9IG1ldGhvZDtcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU2V0cyBhIGN1c3RvbSB0cmFuc3BhcmVudCBzb3J0IGZ1bmN0aW9uIGZvciB0aGUgcmVuZGVyIGxpc3RzLiBQYXNzIGBudWxsYFxyXG5cdFx0ICogdG8gdXNlIHRoZSBkZWZhdWx0IGByZXZlcnNlUGFpbnRlclNvcnRTdGFibGVgIGZ1bmN0aW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7P0Z1bmN0aW9ufSBtZXRob2QgLSBUaGUgb3BhcXVlIHNvcnQgZnVuY3Rpb24uXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2V0VHJhbnNwYXJlbnRTb3J0ID0gZnVuY3Rpb24gKCBtZXRob2QgKSB7XHJcblxyXG5cdFx0XHRfdHJhbnNwYXJlbnRTb3J0ID0gbWV0aG9kO1xyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0Ly8gQ2xlYXJpbmdcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJldHVybnMgdGhlIGNsZWFyIGNvbG9yLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7Q29sb3J9IHRhcmdldCAtIFRoZSBtZXRob2Qgd3JpdGVzIHRoZSByZXN1bHQgaW4gdGhpcyB0YXJnZXQgb2JqZWN0LlxyXG5cdFx0ICogQHJldHVybiB7Q29sb3J9IFRoZSBjbGVhciBjb2xvci5cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nZXRDbGVhckNvbG9yID0gZnVuY3Rpb24gKCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIGJhY2tncm91bmQuZ2V0Q2xlYXJDb2xvcigpICk7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNldHMgdGhlIGNsZWFyIGNvbG9yIGFuZCBhbHBoYS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge0NvbG9yfSBjb2xvciAtIFRoZSBjbGVhciBjb2xvci5cclxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyfSBbYWxwaGE9MV0gLSBUaGUgY2xlYXIgYWxwaGEuXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2V0Q2xlYXJDb2xvciA9IGZ1bmN0aW9uICgpIHtcclxuXHJcblx0XHRcdGJhY2tncm91bmQuc2V0Q2xlYXJDb2xvciggLi4uYXJndW1lbnRzICk7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJldHVybnMgdGhlIGNsZWFyIGFscGhhLiBSYW5nZXMgd2l0aGluIGBbMCwxXWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgY2xlYXIgYWxwaGEuXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ2V0Q2xlYXJBbHBoYSA9IGZ1bmN0aW9uICgpIHtcclxuXHJcblx0XHRcdHJldHVybiBiYWNrZ3JvdW5kLmdldENsZWFyQWxwaGEoKTtcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU2V0cyB0aGUgY2xlYXIgYWxwaGEuXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtudW1iZXJ9IGFscGhhIC0gVGhlIGNsZWFyIGFscGhhLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNldENsZWFyQWxwaGEgPSBmdW5jdGlvbiAoKSB7XHJcblxyXG5cdFx0XHRiYWNrZ3JvdW5kLnNldENsZWFyQWxwaGEoIC4uLmFyZ3VtZW50cyApO1xyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUZWxscyB0aGUgcmVuZGVyZXIgdG8gY2xlYXIgaXRzIGNvbG9yLCBkZXB0aCBvciBzdGVuY2lsIGRyYXdpbmcgYnVmZmVyKHMpLlxyXG5cdFx0ICogVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgdGhlIGJ1ZmZlcnMgdG8gdGhlIGN1cnJlbnQgY2xlYXIgY29sb3IgdmFsdWVzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NvbG9yPXRydWVdIC0gV2hldGhlciB0aGUgY29sb3IgYnVmZmVyIHNob3VsZCBiZSBjbGVhcmVkIG9yIG5vdC5cclxuXHRcdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW2RlcHRoPXRydWVdIC0gV2hldGhlciB0aGUgZGVwdGggYnVmZmVyIHNob3VsZCBiZSBjbGVhcmVkIG9yIG5vdC5cclxuXHRcdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW3N0ZW5jaWw9dHJ1ZV0gLSBXaGV0aGVyIHRoZSBzdGVuY2lsIGJ1ZmZlciBzaG91bGQgYmUgY2xlYXJlZCBvciBub3QuXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2xlYXIgPSBmdW5jdGlvbiAoIGNvbG9yID0gdHJ1ZSwgZGVwdGggPSB0cnVlLCBzdGVuY2lsID0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdGxldCBiaXRzID0gMDtcclxuXHJcblx0XHRcdGlmICggY29sb3IgKSB7XHJcblxyXG5cdFx0XHRcdC8vIGNoZWNrIGlmIHdlJ3JlIHRyeWluZyB0byBjbGVhciBhbiBpbnRlZ2VyIHRhcmdldFxyXG5cdFx0XHRcdGxldCBpc0ludGVnZXJGb3JtYXQgPSBmYWxzZTtcclxuXHRcdFx0XHRpZiAoIF9jdXJyZW50UmVuZGVyVGFyZ2V0ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHRhcmdldEZvcm1hdCA9IF9jdXJyZW50UmVuZGVyVGFyZ2V0LnRleHR1cmUuZm9ybWF0O1xyXG5cdFx0XHRcdFx0aXNJbnRlZ2VyRm9ybWF0ID0gdGFyZ2V0Rm9ybWF0ID09PSBSR0JBSW50ZWdlckZvcm1hdCB8fFxyXG5cdFx0XHRcdFx0XHR0YXJnZXRGb3JtYXQgPT09IFJHSW50ZWdlckZvcm1hdCB8fFxyXG5cdFx0XHRcdFx0XHR0YXJnZXRGb3JtYXQgPT09IFJlZEludGVnZXJGb3JtYXQ7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Ly8gdXNlIHRoZSBhcHByb3ByaWF0ZSBjbGVhciBmdW5jdGlvbnMgdG8gY2xlYXIgdGhlIHRhcmdldCBpZiBpdCdzIGEgc2lnbmVkXHJcblx0XHRcdFx0Ly8gb3IgdW5zaWduZWQgaW50ZWdlciB0YXJnZXRcclxuXHRcdFx0XHRpZiAoIGlzSW50ZWdlckZvcm1hdCApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCB0YXJnZXRUeXBlID0gX2N1cnJlbnRSZW5kZXJUYXJnZXQudGV4dHVyZS50eXBlO1xyXG5cdFx0XHRcdFx0Y29uc3QgaXNVbnNpZ25lZFR5cGUgPSB0YXJnZXRUeXBlID09PSBVbnNpZ25lZEJ5dGVUeXBlIHx8XHJcblx0XHRcdFx0XHRcdHRhcmdldFR5cGUgPT09IFVuc2lnbmVkSW50VHlwZSB8fFxyXG5cdFx0XHRcdFx0XHR0YXJnZXRUeXBlID09PSBVbnNpZ25lZFNob3J0VHlwZSB8fFxyXG5cdFx0XHRcdFx0XHR0YXJnZXRUeXBlID09PSBVbnNpZ25lZEludDI0OFR5cGUgfHxcclxuXHRcdFx0XHRcdFx0dGFyZ2V0VHlwZSA9PT0gVW5zaWduZWRTaG9ydDQ0NDRUeXBlIHx8XHJcblx0XHRcdFx0XHRcdHRhcmdldFR5cGUgPT09IFVuc2lnbmVkU2hvcnQ1NTUxVHlwZTtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBjbGVhckNvbG9yID0gYmFja2dyb3VuZC5nZXRDbGVhckNvbG9yKCk7XHJcblx0XHRcdFx0XHRjb25zdCBhID0gYmFja2dyb3VuZC5nZXRDbGVhckFscGhhKCk7XHJcblx0XHRcdFx0XHRjb25zdCByID0gY2xlYXJDb2xvci5yO1xyXG5cdFx0XHRcdFx0Y29uc3QgZyA9IGNsZWFyQ29sb3IuZztcclxuXHRcdFx0XHRcdGNvbnN0IGIgPSBjbGVhckNvbG9yLmI7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBpc1Vuc2lnbmVkVHlwZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdHVpbnRDbGVhckNvbG9yWyAwIF0gPSByO1xyXG5cdFx0XHRcdFx0XHR1aW50Q2xlYXJDb2xvclsgMSBdID0gZztcclxuXHRcdFx0XHRcdFx0dWludENsZWFyQ29sb3JbIDIgXSA9IGI7XHJcblx0XHRcdFx0XHRcdHVpbnRDbGVhckNvbG9yWyAzIF0gPSBhO1xyXG5cdFx0XHRcdFx0XHRfZ2wuY2xlYXJCdWZmZXJ1aXYoIF9nbC5DT0xPUiwgMCwgdWludENsZWFyQ29sb3IgKTtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0aW50Q2xlYXJDb2xvclsgMCBdID0gcjtcclxuXHRcdFx0XHRcdFx0aW50Q2xlYXJDb2xvclsgMSBdID0gZztcclxuXHRcdFx0XHRcdFx0aW50Q2xlYXJDb2xvclsgMiBdID0gYjtcclxuXHRcdFx0XHRcdFx0aW50Q2xlYXJDb2xvclsgMyBdID0gYTtcclxuXHRcdFx0XHRcdFx0X2dsLmNsZWFyQnVmZmVyaXYoIF9nbC5DT0xPUiwgMCwgaW50Q2xlYXJDb2xvciApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRiaXRzIHw9IF9nbC5DT0xPUl9CVUZGRVJfQklUO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIGRlcHRoICkge1xyXG5cclxuXHRcdFx0XHRiaXRzIHw9IF9nbC5ERVBUSF9CVUZGRVJfQklUO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBzdGVuY2lsICkge1xyXG5cclxuXHRcdFx0XHRiaXRzIHw9IF9nbC5TVEVOQ0lMX0JVRkZFUl9CSVQ7XHJcblx0XHRcdFx0dGhpcy5zdGF0ZS5idWZmZXJzLnN0ZW5jaWwuc2V0TWFzayggMHhmZmZmZmZmZiApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0X2dsLmNsZWFyKCBiaXRzICk7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENsZWFycyB0aGUgY29sb3IgYnVmZmVyLiBFcXVpdmFsZW50IHRvIGNhbGxpbmcgYHJlbmRlcmVyLmNsZWFyKCB0cnVlLCBmYWxzZSwgZmFsc2UgKWAuXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2xlYXJDb2xvciA9IGZ1bmN0aW9uICgpIHtcclxuXHJcblx0XHRcdHRoaXMuY2xlYXIoIHRydWUsIGZhbHNlLCBmYWxzZSApO1xyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDbGVhcnMgdGhlIGRlcHRoIGJ1ZmZlci4gRXF1aXZhbGVudCB0byBjYWxsaW5nIGByZW5kZXJlci5jbGVhciggZmFsc2UsIHRydWUsIGZhbHNlIClgLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNsZWFyRGVwdGggPSBmdW5jdGlvbiAoKSB7XHJcblxyXG5cdFx0XHR0aGlzLmNsZWFyKCBmYWxzZSwgdHJ1ZSwgZmFsc2UgKTtcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQ2xlYXJzIHRoZSBzdGVuY2lsIGJ1ZmZlci4gRXF1aXZhbGVudCB0byBjYWxsaW5nIGByZW5kZXJlci5jbGVhciggZmFsc2UsIGZhbHNlLCB0cnVlIClgLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNsZWFyU3RlbmNpbCA9IGZ1bmN0aW9uICgpIHtcclxuXHJcblx0XHRcdHRoaXMuY2xlYXIoIGZhbHNlLCBmYWxzZSwgdHJ1ZSApO1xyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBGcmVlcyB0aGUgR1BVLXJlbGF0ZWQgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGlzIGluc3RhbmNlLiBDYWxsIHRoaXNcclxuXHRcdCAqIG1ldGhvZCB3aGVuZXZlciB0aGlzIGluc3RhbmNlIGlzIG5vIGxvbmdlciB1c2VkIGluIHlvdXIgYXBwLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XHJcblxyXG5cdFx0XHRjYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3dlYmdsY29udGV4dGxvc3QnLCBvbkNvbnRleHRMb3N0LCBmYWxzZSApO1xyXG5cdFx0XHRjYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3dlYmdsY29udGV4dHJlc3RvcmVkJywgb25Db250ZXh0UmVzdG9yZSwgZmFsc2UgKTtcclxuXHRcdFx0Y2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoICd3ZWJnbGNvbnRleHRjcmVhdGlvbmVycm9yJywgb25Db250ZXh0Q3JlYXRpb25FcnJvciwgZmFsc2UgKTtcclxuXHJcblx0XHRcdGJhY2tncm91bmQuZGlzcG9zZSgpO1xyXG5cdFx0XHRyZW5kZXJMaXN0cy5kaXNwb3NlKCk7XHJcblx0XHRcdHJlbmRlclN0YXRlcy5kaXNwb3NlKCk7XHJcblx0XHRcdHByb3BlcnRpZXMuZGlzcG9zZSgpO1xyXG5cdFx0XHRjdWJlbWFwcy5kaXNwb3NlKCk7XHJcblx0XHRcdGN1YmV1dm1hcHMuZGlzcG9zZSgpO1xyXG5cdFx0XHRvYmplY3RzLmRpc3Bvc2UoKTtcclxuXHRcdFx0YmluZGluZ1N0YXRlcy5kaXNwb3NlKCk7XHJcblx0XHRcdHVuaWZvcm1zR3JvdXBzLmRpc3Bvc2UoKTtcclxuXHRcdFx0cHJvZ3JhbUNhY2hlLmRpc3Bvc2UoKTtcclxuXHJcblx0XHRcdHhyLmRpc3Bvc2UoKTtcclxuXHJcblx0XHRcdHhyLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdzZXNzaW9uc3RhcnQnLCBvblhSU2Vzc2lvblN0YXJ0ICk7XHJcblx0XHRcdHhyLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdzZXNzaW9uZW5kJywgb25YUlNlc3Npb25FbmQgKTtcclxuXHJcblx0XHRcdGFuaW1hdGlvbi5zdG9wKCk7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHQvLyBFdmVudHNcclxuXHJcblx0XHRmdW5jdGlvbiBvbkNvbnRleHRMb3N0KCBldmVudCApIHtcclxuXHJcblx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG5cdFx0XHRjb25zb2xlLmxvZyggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IENvbnRleHQgTG9zdC4nICk7XHJcblxyXG5cdFx0XHRfaXNDb250ZXh0TG9zdCA9IHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIG9uQ29udGV4dFJlc3RvcmUoIC8qIGV2ZW50ICovICkge1xyXG5cclxuXHRcdFx0Y29uc29sZS5sb2coICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBDb250ZXh0IFJlc3RvcmVkLicgKTtcclxuXHJcblx0XHRcdF9pc0NvbnRleHRMb3N0ID0gZmFsc2U7XHJcblxyXG5cdFx0XHRjb25zdCBpbmZvQXV0b1Jlc2V0ID0gaW5mby5hdXRvUmVzZXQ7XHJcblx0XHRcdGNvbnN0IHNoYWRvd01hcEVuYWJsZWQgPSBzaGFkb3dNYXAuZW5hYmxlZDtcclxuXHRcdFx0Y29uc3Qgc2hhZG93TWFwQXV0b1VwZGF0ZSA9IHNoYWRvd01hcC5hdXRvVXBkYXRlO1xyXG5cdFx0XHRjb25zdCBzaGFkb3dNYXBOZWVkc1VwZGF0ZSA9IHNoYWRvd01hcC5uZWVkc1VwZGF0ZTtcclxuXHRcdFx0Y29uc3Qgc2hhZG93TWFwVHlwZSA9IHNoYWRvd01hcC50eXBlO1xyXG5cclxuXHRcdFx0aW5pdEdMQ29udGV4dCgpO1xyXG5cclxuXHRcdFx0aW5mby5hdXRvUmVzZXQgPSBpbmZvQXV0b1Jlc2V0O1xyXG5cdFx0XHRzaGFkb3dNYXAuZW5hYmxlZCA9IHNoYWRvd01hcEVuYWJsZWQ7XHJcblx0XHRcdHNoYWRvd01hcC5hdXRvVXBkYXRlID0gc2hhZG93TWFwQXV0b1VwZGF0ZTtcclxuXHRcdFx0c2hhZG93TWFwLm5lZWRzVXBkYXRlID0gc2hhZG93TWFwTmVlZHNVcGRhdGU7XHJcblx0XHRcdHNoYWRvd01hcC50eXBlID0gc2hhZG93TWFwVHlwZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0ZnVuY3Rpb24gb25Db250ZXh0Q3JlYXRpb25FcnJvciggZXZlbnQgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogQSBXZWJHTCBjb250ZXh0IGNvdWxkIG5vdCBiZSBjcmVhdGVkLiBSZWFzb246ICcsIGV2ZW50LnN0YXR1c01lc3NhZ2UgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0ZnVuY3Rpb24gb25NYXRlcmlhbERpc3Bvc2UoIGV2ZW50ICkge1xyXG5cclxuXHRcdFx0Y29uc3QgbWF0ZXJpYWwgPSBldmVudC50YXJnZXQ7XHJcblxyXG5cdFx0XHRtYXRlcmlhbC5yZW1vdmVFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uTWF0ZXJpYWxEaXNwb3NlICk7XHJcblxyXG5cdFx0XHRkZWFsbG9jYXRlTWF0ZXJpYWwoIG1hdGVyaWFsICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEJ1ZmZlciBkZWFsbG9jYXRpb25cclxuXHJcblx0XHRmdW5jdGlvbiBkZWFsbG9jYXRlTWF0ZXJpYWwoIG1hdGVyaWFsICkge1xyXG5cclxuXHRcdFx0cmVsZWFzZU1hdGVyaWFsUHJvZ3JhbVJlZmVyZW5jZXMoIG1hdGVyaWFsICk7XHJcblxyXG5cdFx0XHRwcm9wZXJ0aWVzLnJlbW92ZSggbWF0ZXJpYWwgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cclxuXHRcdGZ1bmN0aW9uIHJlbGVhc2VNYXRlcmlhbFByb2dyYW1SZWZlcmVuY2VzKCBtYXRlcmlhbCApIHtcclxuXHJcblx0XHRcdGNvbnN0IHByb2dyYW1zID0gcHJvcGVydGllcy5nZXQoIG1hdGVyaWFsICkucHJvZ3JhbXM7XHJcblxyXG5cdFx0XHRpZiAoIHByb2dyYW1zICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdHByb2dyYW1zLmZvckVhY2goIGZ1bmN0aW9uICggcHJvZ3JhbSApIHtcclxuXHJcblx0XHRcdFx0XHRwcm9ncmFtQ2FjaGUucmVsZWFzZVByb2dyYW0oIHByb2dyYW0gKTtcclxuXHJcblx0XHRcdFx0fSApO1xyXG5cclxuXHRcdFx0XHRpZiAoIG1hdGVyaWFsLmlzU2hhZGVyTWF0ZXJpYWwgKSB7XHJcblxyXG5cdFx0XHRcdFx0cHJvZ3JhbUNhY2hlLnJlbGVhc2VTaGFkZXJDYWNoZSggbWF0ZXJpYWwgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBCdWZmZXIgcmVuZGVyaW5nXHJcblxyXG5cdFx0dGhpcy5yZW5kZXJCdWZmZXJEaXJlY3QgPSBmdW5jdGlvbiAoIGNhbWVyYSwgc2NlbmUsIGdlb21ldHJ5LCBtYXRlcmlhbCwgb2JqZWN0LCBncm91cCApIHtcclxuXHJcblx0XHRcdGlmICggc2NlbmUgPT09IG51bGwgKSBzY2VuZSA9IF9lbXB0eVNjZW5lOyAvLyByZW5kZXJCdWZmZXJEaXJlY3Qgc2Vjb25kIHBhcmFtZXRlciB1c2VkIHRvIGJlIGZvZyAoY291bGQgYmUgbnVsbClcclxuXHJcblx0XHRcdGNvbnN0IGZyb250RmFjZUNXID0gKCBvYmplY3QuaXNNZXNoICYmIG9iamVjdC5tYXRyaXhXb3JsZC5kZXRlcm1pbmFudCgpIDwgMCApO1xyXG5cclxuXHRcdFx0Y29uc3QgcHJvZ3JhbSA9IHNldFByb2dyYW0oIGNhbWVyYSwgc2NlbmUsIGdlb21ldHJ5LCBtYXRlcmlhbCwgb2JqZWN0ICk7XHJcblxyXG5cdFx0XHRzdGF0ZS5zZXRNYXRlcmlhbCggbWF0ZXJpYWwsIGZyb250RmFjZUNXICk7XHJcblxyXG5cdFx0XHQvL1xyXG5cclxuXHRcdFx0bGV0IGluZGV4ID0gZ2VvbWV0cnkuaW5kZXg7XHJcblx0XHRcdGxldCByYW5nZUZhY3RvciA9IDE7XHJcblxyXG5cdFx0XHRpZiAoIG1hdGVyaWFsLndpcmVmcmFtZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0aW5kZXggPSBnZW9tZXRyaWVzLmdldFdpcmVmcmFtZUF0dHJpYnV0ZSggZ2VvbWV0cnkgKTtcclxuXHJcblx0XHRcdFx0aWYgKCBpbmRleCA9PT0gdW5kZWZpbmVkICkgcmV0dXJuO1xyXG5cclxuXHRcdFx0XHRyYW5nZUZhY3RvciA9IDI7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvL1xyXG5cclxuXHRcdFx0Y29uc3QgZHJhd1JhbmdlID0gZ2VvbWV0cnkuZHJhd1JhbmdlO1xyXG5cdFx0XHRjb25zdCBwb3NpdGlvbiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XHJcblxyXG5cdFx0XHRsZXQgZHJhd1N0YXJ0ID0gZHJhd1JhbmdlLnN0YXJ0ICogcmFuZ2VGYWN0b3I7XHJcblx0XHRcdGxldCBkcmF3RW5kID0gKCBkcmF3UmFuZ2Uuc3RhcnQgKyBkcmF3UmFuZ2UuY291bnQgKSAqIHJhbmdlRmFjdG9yO1xyXG5cclxuXHRcdFx0aWYgKCBncm91cCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0ZHJhd1N0YXJ0ID0gTWF0aC5tYXgoIGRyYXdTdGFydCwgZ3JvdXAuc3RhcnQgKiByYW5nZUZhY3RvciApO1xyXG5cdFx0XHRcdGRyYXdFbmQgPSBNYXRoLm1pbiggZHJhd0VuZCwgKCBncm91cC5zdGFydCArIGdyb3VwLmNvdW50ICkgKiByYW5nZUZhY3RvciApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBpbmRleCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0ZHJhd1N0YXJ0ID0gTWF0aC5tYXgoIGRyYXdTdGFydCwgMCApO1xyXG5cdFx0XHRcdGRyYXdFbmQgPSBNYXRoLm1pbiggZHJhd0VuZCwgaW5kZXguY291bnQgKTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIHBvc2l0aW9uICE9PSB1bmRlZmluZWQgJiYgcG9zaXRpb24gIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdGRyYXdTdGFydCA9IE1hdGgubWF4KCBkcmF3U3RhcnQsIDAgKTtcclxuXHRcdFx0XHRkcmF3RW5kID0gTWF0aC5taW4oIGRyYXdFbmQsIHBvc2l0aW9uLmNvdW50ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBkcmF3Q291bnQgPSBkcmF3RW5kIC0gZHJhd1N0YXJ0O1xyXG5cclxuXHRcdFx0aWYgKCBkcmF3Q291bnQgPCAwIHx8IGRyYXdDb3VudCA9PT0gSW5maW5pdHkgKSByZXR1cm47XHJcblxyXG5cdFx0XHQvL1xyXG5cclxuXHRcdFx0YmluZGluZ1N0YXRlcy5zZXR1cCggb2JqZWN0LCBtYXRlcmlhbCwgcHJvZ3JhbSwgZ2VvbWV0cnksIGluZGV4ICk7XHJcblxyXG5cdFx0XHRsZXQgYXR0cmlidXRlO1xyXG5cdFx0XHRsZXQgcmVuZGVyZXIgPSBidWZmZXJSZW5kZXJlcjtcclxuXHJcblx0XHRcdGlmICggaW5kZXggIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMuZ2V0KCBpbmRleCApO1xyXG5cclxuXHRcdFx0XHRyZW5kZXJlciA9IGluZGV4ZWRCdWZmZXJSZW5kZXJlcjtcclxuXHRcdFx0XHRyZW5kZXJlci5zZXRJbmRleCggYXR0cmlidXRlICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvL1xyXG5cclxuXHRcdFx0aWYgKCBvYmplY3QuaXNNZXNoICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIG1hdGVyaWFsLndpcmVmcmFtZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0XHRzdGF0ZS5zZXRMaW5lV2lkdGgoIG1hdGVyaWFsLndpcmVmcmFtZUxpbmV3aWR0aCAqIGdldFRhcmdldFBpeGVsUmF0aW8oKSApO1xyXG5cdFx0XHRcdFx0cmVuZGVyZXIuc2V0TW9kZSggX2dsLkxJTkVTICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0cmVuZGVyZXIuc2V0TW9kZSggX2dsLlRSSUFOR0xFUyApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBvYmplY3QuaXNMaW5lICkge1xyXG5cclxuXHRcdFx0XHRsZXQgbGluZVdpZHRoID0gbWF0ZXJpYWwubGluZXdpZHRoO1xyXG5cclxuXHRcdFx0XHRpZiAoIGxpbmVXaWR0aCA9PT0gdW5kZWZpbmVkICkgbGluZVdpZHRoID0gMTsgLy8gTm90IHVzaW5nIExpbmUqTWF0ZXJpYWxcclxuXHJcblx0XHRcdFx0c3RhdGUuc2V0TGluZVdpZHRoKCBsaW5lV2lkdGggKiBnZXRUYXJnZXRQaXhlbFJhdGlvKCkgKTtcclxuXHJcblx0XHRcdFx0aWYgKCBvYmplY3QuaXNMaW5lU2VnbWVudHMgKSB7XHJcblxyXG5cdFx0XHRcdFx0cmVuZGVyZXIuc2V0TW9kZSggX2dsLkxJTkVTICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc0xpbmVMb29wICkge1xyXG5cclxuXHRcdFx0XHRcdHJlbmRlcmVyLnNldE1vZGUoIF9nbC5MSU5FX0xPT1AgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRyZW5kZXJlci5zZXRNb2RlKCBfZ2wuTElORV9TVFJJUCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBvYmplY3QuaXNQb2ludHMgKSB7XHJcblxyXG5cdFx0XHRcdHJlbmRlcmVyLnNldE1vZGUoIF9nbC5QT0lOVFMgKTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc1Nwcml0ZSApIHtcclxuXHJcblx0XHRcdFx0cmVuZGVyZXIuc2V0TW9kZSggX2dsLlRSSUFOR0xFUyApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBvYmplY3QuaXNCYXRjaGVkTWVzaCApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBvYmplY3QuX211bHRpRHJhd0luc3RhbmNlcyAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHQvLyBAZGVwcmVjYXRlZCwgcjE3NFxyXG5cdFx0XHRcdFx0d2Fybk9uY2UoICdUSFJFRS5XZWJHTFJlbmRlcmVyOiByZW5kZXJNdWx0aURyYXdJbnN0YW5jZXMgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHIxODQuIEFwcGVuZCB0byByZW5kZXJNdWx0aURyYXcgYXJndW1lbnRzIGFuZCB1c2UgaW5kaXJlY3Rpb24uJyApO1xyXG5cdFx0XHRcdFx0cmVuZGVyZXIucmVuZGVyTXVsdGlEcmF3SW5zdGFuY2VzKCBvYmplY3QuX211bHRpRHJhd1N0YXJ0cywgb2JqZWN0Ll9tdWx0aURyYXdDb3VudHMsIG9iamVjdC5fbXVsdGlEcmF3Q291bnQsIG9iamVjdC5fbXVsdGlEcmF3SW5zdGFuY2VzICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCAhIGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfbXVsdGlfZHJhdycgKSApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnN0IHN0YXJ0cyA9IG9iamVjdC5fbXVsdGlEcmF3U3RhcnRzO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBjb3VudHMgPSBvYmplY3QuX211bHRpRHJhd0NvdW50cztcclxuXHRcdFx0XHRcdFx0Y29uc3QgZHJhd0NvdW50ID0gb2JqZWN0Ll9tdWx0aURyYXdDb3VudDtcclxuXHRcdFx0XHRcdFx0Y29uc3QgYnl0ZXNQZXJFbGVtZW50ID0gaW5kZXggPyBhdHRyaWJ1dGVzLmdldCggaW5kZXggKS5ieXRlc1BlckVsZW1lbnQgOiAxO1xyXG5cdFx0XHRcdFx0XHRjb25zdCB1bmlmb3JtcyA9IHByb3BlcnRpZXMuZ2V0KCBtYXRlcmlhbCApLmN1cnJlbnRQcm9ncmFtLmdldFVuaWZvcm1zKCk7XHJcblx0XHRcdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGRyYXdDb3VudDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0dW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ19nbF9EcmF3SUQnLCBpICk7XHJcblx0XHRcdFx0XHRcdFx0cmVuZGVyZXIucmVuZGVyKCBzdGFydHNbIGkgXSAvIGJ5dGVzUGVyRWxlbWVudCwgY291bnRzWyBpIF0gKTtcclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0cmVuZGVyZXIucmVuZGVyTXVsdGlEcmF3KCBvYmplY3QuX211bHRpRHJhd1N0YXJ0cywgb2JqZWN0Ll9tdWx0aURyYXdDb3VudHMsIG9iamVjdC5fbXVsdGlEcmF3Q291bnQgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc0luc3RhbmNlZE1lc2ggKSB7XHJcblxyXG5cdFx0XHRcdHJlbmRlcmVyLnJlbmRlckluc3RhbmNlcyggZHJhd1N0YXJ0LCBkcmF3Q291bnQsIG9iamVjdC5jb3VudCApO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggZ2VvbWV0cnkuaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgbWF4SW5zdGFuY2VDb3VudCA9IGdlb21ldHJ5Ll9tYXhJbnN0YW5jZUNvdW50ICE9PSB1bmRlZmluZWQgPyBnZW9tZXRyeS5fbWF4SW5zdGFuY2VDb3VudCA6IEluZmluaXR5O1xyXG5cdFx0XHRcdGNvbnN0IGluc3RhbmNlQ291bnQgPSBNYXRoLm1pbiggZ2VvbWV0cnkuaW5zdGFuY2VDb3VudCwgbWF4SW5zdGFuY2VDb3VudCApO1xyXG5cclxuXHRcdFx0XHRyZW5kZXJlci5yZW5kZXJJbnN0YW5jZXMoIGRyYXdTdGFydCwgZHJhd0NvdW50LCBpbnN0YW5jZUNvdW50ICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRyZW5kZXJlci5yZW5kZXIoIGRyYXdTdGFydCwgZHJhd0NvdW50ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHQvLyBDb21waWxlXHJcblxyXG5cdFx0ZnVuY3Rpb24gcHJlcGFyZU1hdGVyaWFsKCBtYXRlcmlhbCwgc2NlbmUsIG9iamVjdCApIHtcclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWwudHJhbnNwYXJlbnQgPT09IHRydWUgJiYgbWF0ZXJpYWwuc2lkZSA9PT0gRG91YmxlU2lkZSAmJiBtYXRlcmlhbC5mb3JjZVNpbmdsZVBhc3MgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0XHRtYXRlcmlhbC5zaWRlID0gQmFja1NpZGU7XHJcblx0XHRcdFx0bWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cdFx0XHRcdGdldFByb2dyYW0oIG1hdGVyaWFsLCBzY2VuZSwgb2JqZWN0ICk7XHJcblxyXG5cdFx0XHRcdG1hdGVyaWFsLnNpZGUgPSBGcm9udFNpZGU7XHJcblx0XHRcdFx0bWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cdFx0XHRcdGdldFByb2dyYW0oIG1hdGVyaWFsLCBzY2VuZSwgb2JqZWN0ICk7XHJcblxyXG5cdFx0XHRcdG1hdGVyaWFsLnNpZGUgPSBEb3VibGVTaWRlO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0Z2V0UHJvZ3JhbSggbWF0ZXJpYWwsIHNjZW5lLCBvYmplY3QgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDb21waWxlcyBhbGwgbWF0ZXJpYWxzIGluIHRoZSBzY2VuZSB3aXRoIHRoZSBjYW1lcmEuIFRoaXMgaXMgdXNlZnVsIHRvIHByZWNvbXBpbGUgc2hhZGVyc1xyXG5cdFx0ICogYmVmb3JlIHRoZSBmaXJzdCByZW5kZXJpbmcuIElmIHlvdSB3YW50IHRvIGFkZCBhIDNEIG9iamVjdCB0byBhbiBleGlzdGluZyBzY2VuZSwgdXNlIHRoZSB0aGlyZFxyXG5cdFx0ICogb3B0aW9uYWwgcGFyYW1ldGVyIGZvciBhcHBseWluZyB0aGUgdGFyZ2V0IHNjZW5lLlxyXG5cdFx0ICpcclxuXHRcdCAqIE5vdGUgdGhhdCB0aGUgKHRhcmdldCkgc2NlbmUncyBsaWdodGluZyBhbmQgZW52aXJvbm1lbnQgbXVzdCBiZSBjb25maWd1cmVkIGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0M0R9IHNjZW5lIC0gVGhlIHNjZW5lIG9yIGFub3RoZXIgdHlwZSBvZiAzRCBvYmplY3QgdG8gcHJlY29tcGlsZS5cclxuXHRcdCAqIEBwYXJhbSB7Q2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhLlxyXG5cdFx0ICogQHBhcmFtIHs/U2NlbmV9IFt0YXJnZXRTY2VuZT1udWxsXSAtIFRoZSB0YXJnZXQgc2NlbmUuXHJcblx0XHQgKiBAcmV0dXJuIHs/U2V0fSBUaGUgcHJlY29tcGlsZWQgbWF0ZXJpYWxzLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvbXBpbGUgPSBmdW5jdGlvbiAoIHNjZW5lLCBjYW1lcmEsIHRhcmdldFNjZW5lID0gbnVsbCApIHtcclxuXHJcblx0XHRcdGlmICggdGFyZ2V0U2NlbmUgPT09IG51bGwgKSB0YXJnZXRTY2VuZSA9IHNjZW5lO1xyXG5cclxuXHRcdFx0Y3VycmVudFJlbmRlclN0YXRlID0gcmVuZGVyU3RhdGVzLmdldCggdGFyZ2V0U2NlbmUgKTtcclxuXHRcdFx0Y3VycmVudFJlbmRlclN0YXRlLmluaXQoIGNhbWVyYSApO1xyXG5cclxuXHRcdFx0cmVuZGVyU3RhdGVTdGFjay5wdXNoKCBjdXJyZW50UmVuZGVyU3RhdGUgKTtcclxuXHJcblx0XHRcdC8vIGdhdGhlciBsaWdodHMgZnJvbSBib3RoIHRoZSB0YXJnZXQgc2NlbmUgYW5kIHRoZSBuZXcgb2JqZWN0IHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgc2NlbmUuXHJcblxyXG5cdFx0XHR0YXJnZXRTY2VuZS50cmF2ZXJzZVZpc2libGUoIGZ1bmN0aW9uICggb2JqZWN0ICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIG9iamVjdC5pc0xpZ2h0ICYmIG9iamVjdC5sYXllcnMudGVzdCggY2FtZXJhLmxheWVycyApICkge1xyXG5cclxuXHRcdFx0XHRcdGN1cnJlbnRSZW5kZXJTdGF0ZS5wdXNoTGlnaHQoIG9iamVjdCApO1xyXG5cclxuXHRcdFx0XHRcdGlmICggb2JqZWN0LmNhc3RTaGFkb3cgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjdXJyZW50UmVuZGVyU3RhdGUucHVzaFNoYWRvdyggb2JqZWN0ICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRpZiAoIHNjZW5lICE9PSB0YXJnZXRTY2VuZSApIHtcclxuXHJcblx0XHRcdFx0c2NlbmUudHJhdmVyc2VWaXNpYmxlKCBmdW5jdGlvbiAoIG9iamVjdCApIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIG9iamVjdC5pc0xpZ2h0ICYmIG9iamVjdC5sYXllcnMudGVzdCggY2FtZXJhLmxheWVycyApICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y3VycmVudFJlbmRlclN0YXRlLnB1c2hMaWdodCggb2JqZWN0ICk7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIG9iamVjdC5jYXN0U2hhZG93ICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRjdXJyZW50UmVuZGVyU3RhdGUucHVzaFNoYWRvdyggb2JqZWN0ICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjdXJyZW50UmVuZGVyU3RhdGUuc2V0dXBMaWdodHMoKTtcclxuXHJcblx0XHRcdC8vIE9ubHkgaW5pdGlhbGl6ZSBtYXRlcmlhbHMgaW4gdGhlIG5ldyBzY2VuZSwgbm90IHRoZSB0YXJnZXRTY2VuZS5cclxuXHJcblx0XHRcdGNvbnN0IG1hdGVyaWFscyA9IG5ldyBTZXQoKTtcclxuXHJcblx0XHRcdHNjZW5lLnRyYXZlcnNlKCBmdW5jdGlvbiAoIG9iamVjdCApIHtcclxuXHJcblx0XHRcdFx0aWYgKCAhICggb2JqZWN0LmlzTWVzaCB8fCBvYmplY3QuaXNQb2ludHMgfHwgb2JqZWN0LmlzTGluZSB8fCBvYmplY3QuaXNTcHJpdGUgKSApIHtcclxuXHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Y29uc3QgbWF0ZXJpYWwgPSBvYmplY3QubWF0ZXJpYWw7XHJcblxyXG5cdFx0XHRcdGlmICggbWF0ZXJpYWwgKSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBtYXRlcmlhbCApICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgbWF0ZXJpYWwubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRjb25zdCBtYXRlcmlhbDIgPSBtYXRlcmlhbFsgaSBdO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRwcmVwYXJlTWF0ZXJpYWwoIG1hdGVyaWFsMiwgdGFyZ2V0U2NlbmUsIG9iamVjdCApO1xyXG5cdFx0XHRcdFx0XHRcdG1hdGVyaWFscy5hZGQoIG1hdGVyaWFsMiApO1xyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRwcmVwYXJlTWF0ZXJpYWwoIG1hdGVyaWFsLCB0YXJnZXRTY2VuZSwgb2JqZWN0ICk7XHJcblx0XHRcdFx0XHRcdG1hdGVyaWFscy5hZGQoIG1hdGVyaWFsICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRjdXJyZW50UmVuZGVyU3RhdGUgPSByZW5kZXJTdGF0ZVN0YWNrLnBvcCgpO1xyXG5cclxuXHRcdFx0cmV0dXJuIG1hdGVyaWFscztcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8vIGNvbXBpbGVBc3luY1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQXN5bmNocm9ub3VzIHZlcnNpb24gb2Yge0BsaW5rIFdlYkdMUmVuZGVyZXIjY29tcGlsZX0uXHJcblx0XHQgKlxyXG5cdFx0ICogVGhpcyBtZXRob2QgbWFrZXMgdXNlIG9mIHRoZSBgS0hSX3BhcmFsbGVsX3NoYWRlcl9jb21waWxlYCBXZWJHTCBleHRlbnNpb24uIEhlbmNlLFxyXG5cdFx0ICogaXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIHRoaXMgdmVyc2lvbiBvZiBgY29tcGlsZSgpYCB3aGVuZXZlciBwb3NzaWJsZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAYXN5bmNcclxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0M0R9IHNjZW5lIC0gVGhlIHNjZW5lIG9yIGFub3RoZXIgdHlwZSBvZiAzRCBvYmplY3QgdG8gcHJlY29tcGlsZS5cclxuXHRcdCAqIEBwYXJhbSB7Q2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhLlxyXG5cdFx0ICogQHBhcmFtIHs/U2NlbmV9IFt0YXJnZXRTY2VuZT1udWxsXSAtIFRoZSB0YXJnZXQgc2NlbmUuXHJcblx0XHQgKiBAcmV0dXJuIHtQcm9taXNlfSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBnaXZlbiBzY2VuZSBjYW4gYmUgcmVuZGVyZWQgd2l0aG91dCB1bm5lY2Vzc2FyeSBzdGFsbGluZyBkdWUgdG8gc2hhZGVyIGNvbXBpbGF0aW9uLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvbXBpbGVBc3luYyA9IGZ1bmN0aW9uICggc2NlbmUsIGNhbWVyYSwgdGFyZ2V0U2NlbmUgPSBudWxsICkge1xyXG5cclxuXHRcdFx0Y29uc3QgbWF0ZXJpYWxzID0gdGhpcy5jb21waWxlKCBzY2VuZSwgY2FtZXJhLCB0YXJnZXRTY2VuZSApO1xyXG5cclxuXHRcdFx0Ly8gV2FpdCBmb3IgYWxsIHRoZSBtYXRlcmlhbHMgaW4gdGhlIG5ldyBvYmplY3QgdG8gaW5kaWNhdGUgdGhhdCB0aGV5J3JlXHJcblx0XHRcdC8vIHJlYWR5IHRvIGJlIHVzZWQgYmVmb3JlIHJlc29sdmluZyB0aGUgcHJvbWlzZS5cclxuXHJcblx0XHRcdHJldHVybiBuZXcgUHJvbWlzZSggKCByZXNvbHZlICkgPT4ge1xyXG5cclxuXHRcdFx0XHRmdW5jdGlvbiBjaGVja01hdGVyaWFsc1JlYWR5KCkge1xyXG5cclxuXHRcdFx0XHRcdG1hdGVyaWFscy5mb3JFYWNoKCBmdW5jdGlvbiAoIG1hdGVyaWFsICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgbWF0ZXJpYWxQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIG1hdGVyaWFsICk7XHJcblx0XHRcdFx0XHRcdGNvbnN0IHByb2dyYW0gPSBtYXRlcmlhbFByb3BlcnRpZXMuY3VycmVudFByb2dyYW07XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIHByb2dyYW0uaXNSZWFkeSgpICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHQvLyByZW1vdmUgYW55IHByb2dyYW1zIHRoYXQgcmVwb3J0IHRoZXkncmUgcmVhZHkgdG8gdXNlIGZyb20gdGhlIGxpc3RcclxuXHRcdFx0XHRcdFx0XHRtYXRlcmlhbHMuZGVsZXRlKCBtYXRlcmlhbCApO1xyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdH0gKTtcclxuXHJcblx0XHRcdFx0XHQvLyBvbmNlIHRoZSBsaXN0IG9mIGNvbXBpbGluZyBtYXRlcmlhbHMgaXMgZW1wdHksIGNhbGwgdGhlIGNhbGxiYWNrXHJcblxyXG5cdFx0XHRcdFx0aWYgKCBtYXRlcmlhbHMuc2l6ZSA9PT0gMCApIHtcclxuXHJcblx0XHRcdFx0XHRcdHJlc29sdmUoIHNjZW5lICk7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Ly8gaWYgc29tZSBtYXRlcmlhbHMgYXJlIHN0aWxsIG5vdCByZWFkeSwgd2FpdCBhIGJpdCBhbmQgY2hlY2sgYWdhaW5cclxuXHJcblx0XHRcdFx0XHRzZXRUaW1lb3V0KCBjaGVja01hdGVyaWFsc1JlYWR5LCAxMCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICggZXh0ZW5zaW9ucy5nZXQoICdLSFJfcGFyYWxsZWxfc2hhZGVyX2NvbXBpbGUnICkgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gSWYgd2UgY2FuIGNoZWNrIHRoZSBjb21waWxhdGlvbiBzdGF0dXMgb2YgdGhlIG1hdGVyaWFscyB3aXRob3V0XHJcblx0XHRcdFx0XHQvLyBibG9ja2luZyB0aGVuIGRvIHNvIHJpZ2h0IGF3YXkuXHJcblxyXG5cdFx0XHRcdFx0Y2hlY2tNYXRlcmlhbHNSZWFkeSgpO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdC8vIE90aGVyd2lzZSBzdGFydCBieSB3YWl0aW5nIGEgYml0IHRvIGdpdmUgdGhlIG1hdGVyaWFscyB3ZSBqdXN0XHJcblx0XHRcdFx0XHQvLyBpbml0aWFsaXplZCBhIGNoYW5jZSB0byBmaW5pc2guXHJcblxyXG5cdFx0XHRcdFx0c2V0VGltZW91dCggY2hlY2tNYXRlcmlhbHNSZWFkeSwgMTAgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0Ly8gQW5pbWF0aW9uIExvb3BcclxuXHJcblx0XHRsZXQgb25BbmltYXRpb25GcmFtZUNhbGxiYWNrID0gbnVsbDtcclxuXHJcblx0XHRmdW5jdGlvbiBvbkFuaW1hdGlvbkZyYW1lKCB0aW1lICkge1xyXG5cclxuXHRcdFx0aWYgKCBvbkFuaW1hdGlvbkZyYW1lQ2FsbGJhY2sgKSBvbkFuaW1hdGlvbkZyYW1lQ2FsbGJhY2soIHRpbWUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0ZnVuY3Rpb24gb25YUlNlc3Npb25TdGFydCgpIHtcclxuXHJcblx0XHRcdGFuaW1hdGlvbi5zdG9wKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIG9uWFJTZXNzaW9uRW5kKCkge1xyXG5cclxuXHRcdFx0YW5pbWF0aW9uLnN0YXJ0KCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGFuaW1hdGlvbiA9IG5ldyBXZWJHTEFuaW1hdGlvbigpO1xyXG5cdFx0YW5pbWF0aW9uLnNldEFuaW1hdGlvbkxvb3AoIG9uQW5pbWF0aW9uRnJhbWUgKTtcclxuXHJcblx0XHRpZiAoIHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyApIGFuaW1hdGlvbi5zZXRDb250ZXh0KCBzZWxmICk7XHJcblxyXG5cdFx0dGhpcy5zZXRBbmltYXRpb25Mb29wID0gZnVuY3Rpb24gKCBjYWxsYmFjayApIHtcclxuXHJcblx0XHRcdG9uQW5pbWF0aW9uRnJhbWVDYWxsYmFjayA9IGNhbGxiYWNrO1xyXG5cdFx0XHR4ci5zZXRBbmltYXRpb25Mb29wKCBjYWxsYmFjayApO1xyXG5cclxuXHRcdFx0KCBjYWxsYmFjayA9PT0gbnVsbCApID8gYW5pbWF0aW9uLnN0b3AoKSA6IGFuaW1hdGlvbi5zdGFydCgpO1xyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0eHIuYWRkRXZlbnRMaXN0ZW5lciggJ3Nlc3Npb25zdGFydCcsIG9uWFJTZXNzaW9uU3RhcnQgKTtcclxuXHRcdHhyLmFkZEV2ZW50TGlzdGVuZXIoICdzZXNzaW9uZW5kJywgb25YUlNlc3Npb25FbmQgKTtcclxuXHJcblx0XHQvLyBSZW5kZXJpbmdcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlbmRlcnMgdGhlIGdpdmVuIHNjZW5lIChvciBvdGhlciB0eXBlIG9mIDNEIG9iamVjdCkgdXNpbmcgdGhlIGdpdmVuIGNhbWVyYS5cclxuXHRcdCAqXHJcblx0XHQgKiBUaGUgcmVuZGVyIGlzIGRvbmUgdG8gYSBwcmV2aW91c2x5IHNwZWNpZmllZCByZW5kZXIgdGFyZ2V0IHNldCBieSBjYWxsaW5nIHtAbGluayBXZWJHTFJlbmRlcmVyI3NldFJlbmRlclRhcmdldH1cclxuXHRcdCAqIG9yIHRvIHRoZSBjYW52YXMgYXMgdXN1YWwuXHJcblx0XHQgKlxyXG5cdFx0ICogQnkgZGVmYXVsdCByZW5kZXIgYnVmZmVycyBhcmUgY2xlYXJlZCBiZWZvcmUgcmVuZGVyaW5nIGJ1dCB5b3UgY2FuIHByZXZlbnRcclxuXHRcdCAqIHRoaXMgYnkgc2V0dGluZyB0aGUgcHJvcGVydHkgYGF1dG9DbGVhcmAgdG8gYGZhbHNlYC4gSWYgeW91IHdhbnQgdG8gcHJldmVudFxyXG5cdFx0ICogb25seSBjZXJ0YWluIGJ1ZmZlcnMgYmVpbmcgY2xlYXJlZCB5b3UgY2FuIGBhdXRvQ2xlYXJDb2xvcmAsIGBhdXRvQ2xlYXJEZXB0aGBcclxuXHRcdCAqIG9yIGBhdXRvQ2xlYXJTdGVuY2lsYCB0byBgZmFsc2VgLiBUbyBmb3JjZSBhIGNsZWFyLCB1c2Uge0BsaW5rIFdlYkdMUmVuZGVyZXIjY2xlYXJ9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0M0R9IHNjZW5lIC0gVGhlIHNjZW5lIHRvIHJlbmRlci5cclxuXHRcdCAqIEBwYXJhbSB7Q2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJlbmRlciA9IGZ1bmN0aW9uICggc2NlbmUsIGNhbWVyYSApIHtcclxuXHJcblx0XHRcdGlmICggY2FtZXJhICE9PSB1bmRlZmluZWQgJiYgY2FtZXJhLmlzQ2FtZXJhICE9PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xSZW5kZXJlci5yZW5kZXI6IGNhbWVyYSBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuQ2FtZXJhLicgKTtcclxuXHRcdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIF9pc0NvbnRleHRMb3N0ID09PSB0cnVlICkgcmV0dXJuO1xyXG5cclxuXHRcdFx0Ly8gdXBkYXRlIHNjZW5lIGdyYXBoXHJcblxyXG5cdFx0XHRpZiAoIHNjZW5lLm1hdHJpeFdvcmxkQXV0b1VwZGF0ZSA9PT0gdHJ1ZSApIHNjZW5lLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XHJcblxyXG5cdFx0XHQvLyB1cGRhdGUgY2FtZXJhIG1hdHJpY2VzIGFuZCBmcnVzdHVtXHJcblxyXG5cdFx0XHRpZiAoIGNhbWVyYS5wYXJlbnQgPT09IG51bGwgJiYgY2FtZXJhLm1hdHJpeFdvcmxkQXV0b1VwZGF0ZSA9PT0gdHJ1ZSApIGNhbWVyYS51cGRhdGVNYXRyaXhXb3JsZCgpO1xyXG5cclxuXHRcdFx0aWYgKCB4ci5lbmFibGVkID09PSB0cnVlICYmIHhyLmlzUHJlc2VudGluZyA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0aWYgKCB4ci5jYW1lcmFBdXRvVXBkYXRlID09PSB0cnVlICkgeHIudXBkYXRlQ2FtZXJhKCBjYW1lcmEgKTtcclxuXHJcblx0XHRcdFx0Y2FtZXJhID0geHIuZ2V0Q2FtZXJhKCk7IC8vIHVzZSBYUiBjYW1lcmEgZm9yIHJlbmRlcmluZ1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly9cclxuXHRcdFx0aWYgKCBzY2VuZS5pc1NjZW5lID09PSB0cnVlICkgc2NlbmUub25CZWZvcmVSZW5kZXIoIF90aGlzLCBzY2VuZSwgY2FtZXJhLCBfY3VycmVudFJlbmRlclRhcmdldCApO1xyXG5cclxuXHRcdFx0Y3VycmVudFJlbmRlclN0YXRlID0gcmVuZGVyU3RhdGVzLmdldCggc2NlbmUsIHJlbmRlclN0YXRlU3RhY2subGVuZ3RoICk7XHJcblx0XHRcdGN1cnJlbnRSZW5kZXJTdGF0ZS5pbml0KCBjYW1lcmEgKTtcclxuXHJcblx0XHRcdHJlbmRlclN0YXRlU3RhY2sucHVzaCggY3VycmVudFJlbmRlclN0YXRlICk7XHJcblxyXG5cdFx0XHRfcHJvalNjcmVlbk1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeCwgY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSApO1xyXG5cdFx0XHRfZnJ1c3R1bS5zZXRGcm9tUHJvamVjdGlvbk1hdHJpeCggX3Byb2pTY3JlZW5NYXRyaXggKTtcclxuXHJcblx0XHRcdF9sb2NhbENsaXBwaW5nRW5hYmxlZCA9IHRoaXMubG9jYWxDbGlwcGluZ0VuYWJsZWQ7XHJcblx0XHRcdF9jbGlwcGluZ0VuYWJsZWQgPSBjbGlwcGluZy5pbml0KCB0aGlzLmNsaXBwaW5nUGxhbmVzLCBfbG9jYWxDbGlwcGluZ0VuYWJsZWQgKTtcclxuXHJcblx0XHRcdGN1cnJlbnRSZW5kZXJMaXN0ID0gcmVuZGVyTGlzdHMuZ2V0KCBzY2VuZSwgcmVuZGVyTGlzdFN0YWNrLmxlbmd0aCApO1xyXG5cdFx0XHRjdXJyZW50UmVuZGVyTGlzdC5pbml0KCk7XHJcblxyXG5cdFx0XHRyZW5kZXJMaXN0U3RhY2sucHVzaCggY3VycmVudFJlbmRlckxpc3QgKTtcclxuXHJcblx0XHRcdGlmICggeHIuZW5hYmxlZCA9PT0gdHJ1ZSAmJiB4ci5pc1ByZXNlbnRpbmcgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGRlcHRoU2Vuc2luZ01lc2ggPSBfdGhpcy54ci5nZXREZXB0aFNlbnNpbmdNZXNoKCk7XHJcblxyXG5cdFx0XHRcdGlmICggZGVwdGhTZW5zaW5nTWVzaCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHRwcm9qZWN0T2JqZWN0KCBkZXB0aFNlbnNpbmdNZXNoLCBjYW1lcmEsIC0gSW5maW5pdHksIF90aGlzLnNvcnRPYmplY3RzICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHByb2plY3RPYmplY3QoIHNjZW5lLCBjYW1lcmEsIDAsIF90aGlzLnNvcnRPYmplY3RzICk7XHJcblxyXG5cdFx0XHRjdXJyZW50UmVuZGVyTGlzdC5maW5pc2goKTtcclxuXHJcblx0XHRcdGlmICggX3RoaXMuc29ydE9iamVjdHMgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdGN1cnJlbnRSZW5kZXJMaXN0LnNvcnQoIF9vcGFxdWVTb3J0LCBfdHJhbnNwYXJlbnRTb3J0ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRfcmVuZGVyQmFja2dyb3VuZCA9IHhyLmVuYWJsZWQgPT09IGZhbHNlIHx8IHhyLmlzUHJlc2VudGluZyA9PT0gZmFsc2UgfHwgeHIuaGFzRGVwdGhTZW5zaW5nKCkgPT09IGZhbHNlO1xyXG5cdFx0XHRpZiAoIF9yZW5kZXJCYWNrZ3JvdW5kICkge1xyXG5cclxuXHRcdFx0XHRiYWNrZ3JvdW5kLmFkZFRvUmVuZGVyTGlzdCggY3VycmVudFJlbmRlckxpc3QsIHNjZW5lICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvL1xyXG5cclxuXHRcdFx0dGhpcy5pbmZvLnJlbmRlci5mcmFtZSArKztcclxuXHJcblx0XHRcdGlmICggX2NsaXBwaW5nRW5hYmxlZCA9PT0gdHJ1ZSApIGNsaXBwaW5nLmJlZ2luU2hhZG93cygpO1xyXG5cclxuXHRcdFx0Y29uc3Qgc2hhZG93c0FycmF5ID0gY3VycmVudFJlbmRlclN0YXRlLnN0YXRlLnNoYWRvd3NBcnJheTtcclxuXHJcblx0XHRcdHNoYWRvd01hcC5yZW5kZXIoIHNoYWRvd3NBcnJheSwgc2NlbmUsIGNhbWVyYSApO1xyXG5cclxuXHRcdFx0aWYgKCBfY2xpcHBpbmdFbmFibGVkID09PSB0cnVlICkgY2xpcHBpbmcuZW5kU2hhZG93cygpO1xyXG5cclxuXHRcdFx0Ly9cclxuXHJcblx0XHRcdGlmICggdGhpcy5pbmZvLmF1dG9SZXNldCA9PT0gdHJ1ZSApIHRoaXMuaW5mby5yZXNldCgpO1xyXG5cclxuXHRcdFx0Ly8gcmVuZGVyIHNjZW5lXHJcblxyXG5cdFx0XHRjb25zdCBvcGFxdWVPYmplY3RzID0gY3VycmVudFJlbmRlckxpc3Qub3BhcXVlO1xyXG5cdFx0XHRjb25zdCB0cmFuc21pc3NpdmVPYmplY3RzID0gY3VycmVudFJlbmRlckxpc3QudHJhbnNtaXNzaXZlO1xyXG5cclxuXHRcdFx0Y3VycmVudFJlbmRlclN0YXRlLnNldHVwTGlnaHRzKCk7XHJcblxyXG5cdFx0XHRpZiAoIGNhbWVyYS5pc0FycmF5Q2FtZXJhICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBjYW1lcmFzID0gY2FtZXJhLmNhbWVyYXM7XHJcblxyXG5cdFx0XHRcdGlmICggdHJhbnNtaXNzaXZlT2JqZWN0cy5sZW5ndGggPiAwICkge1xyXG5cclxuXHRcdFx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGNhbWVyYXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnN0IGNhbWVyYTIgPSBjYW1lcmFzWyBpIF07XHJcblxyXG5cdFx0XHRcdFx0XHRyZW5kZXJUcmFuc21pc3Npb25QYXNzKCBvcGFxdWVPYmplY3RzLCB0cmFuc21pc3NpdmVPYmplY3RzLCBzY2VuZSwgY2FtZXJhMiApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoIF9yZW5kZXJCYWNrZ3JvdW5kICkgYmFja2dyb3VuZC5yZW5kZXIoIHNjZW5lICk7XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGNhbWVyYXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBjYW1lcmEyID0gY2FtZXJhc1sgaSBdO1xyXG5cclxuXHRcdFx0XHRcdHJlbmRlclNjZW5lKCBjdXJyZW50UmVuZGVyTGlzdCwgc2NlbmUsIGNhbWVyYTIsIGNhbWVyYTIudmlld3BvcnQgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0aWYgKCB0cmFuc21pc3NpdmVPYmplY3RzLmxlbmd0aCA+IDAgKSByZW5kZXJUcmFuc21pc3Npb25QYXNzKCBvcGFxdWVPYmplY3RzLCB0cmFuc21pc3NpdmVPYmplY3RzLCBzY2VuZSwgY2FtZXJhICk7XHJcblxyXG5cdFx0XHRcdGlmICggX3JlbmRlckJhY2tncm91bmQgKSBiYWNrZ3JvdW5kLnJlbmRlciggc2NlbmUgKTtcclxuXHJcblx0XHRcdFx0cmVuZGVyU2NlbmUoIGN1cnJlbnRSZW5kZXJMaXN0LCBzY2VuZSwgY2FtZXJhICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvL1xyXG5cclxuXHRcdFx0aWYgKCBfY3VycmVudFJlbmRlclRhcmdldCAhPT0gbnVsbCAmJiBfY3VycmVudEFjdGl2ZU1pcG1hcExldmVsID09PSAwICkge1xyXG5cclxuXHRcdFx0XHQvLyByZXNvbHZlIG11bHRpc2FtcGxlIHJlbmRlcmJ1ZmZlcnMgdG8gYSBzaW5nbGUtc2FtcGxlIHRleHR1cmUgaWYgbmVjZXNzYXJ5XHJcblxyXG5cdFx0XHRcdHRleHR1cmVzLnVwZGF0ZU11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0KCBfY3VycmVudFJlbmRlclRhcmdldCApO1xyXG5cclxuXHRcdFx0XHQvLyBHZW5lcmF0ZSBtaXBtYXAgaWYgd2UncmUgdXNpbmcgYW55IGtpbmQgb2YgbWlwbWFwIGZpbHRlcmluZ1xyXG5cclxuXHRcdFx0XHR0ZXh0dXJlcy51cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXAoIF9jdXJyZW50UmVuZGVyVGFyZ2V0ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvL1xyXG5cclxuXHRcdFx0aWYgKCBzY2VuZS5pc1NjZW5lID09PSB0cnVlICkgc2NlbmUub25BZnRlclJlbmRlciggX3RoaXMsIHNjZW5lLCBjYW1lcmEgKTtcclxuXHJcblx0XHRcdC8vIF9nbC5maW5pc2goKTtcclxuXHJcblx0XHRcdGJpbmRpbmdTdGF0ZXMucmVzZXREZWZhdWx0U3RhdGUoKTtcclxuXHRcdFx0X2N1cnJlbnRNYXRlcmlhbElkID0gLSAxO1xyXG5cdFx0XHRfY3VycmVudENhbWVyYSA9IG51bGw7XHJcblxyXG5cdFx0XHRyZW5kZXJTdGF0ZVN0YWNrLnBvcCgpO1xyXG5cclxuXHRcdFx0aWYgKCByZW5kZXJTdGF0ZVN0YWNrLmxlbmd0aCA+IDAgKSB7XHJcblxyXG5cdFx0XHRcdGN1cnJlbnRSZW5kZXJTdGF0ZSA9IHJlbmRlclN0YXRlU3RhY2tbIHJlbmRlclN0YXRlU3RhY2subGVuZ3RoIC0gMSBdO1xyXG5cclxuXHRcdFx0XHRpZiAoIF9jbGlwcGluZ0VuYWJsZWQgPT09IHRydWUgKSBjbGlwcGluZy5zZXRHbG9iYWxTdGF0ZSggX3RoaXMuY2xpcHBpbmdQbGFuZXMsIGN1cnJlbnRSZW5kZXJTdGF0ZS5zdGF0ZS5jYW1lcmEgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGN1cnJlbnRSZW5kZXJTdGF0ZSA9IG51bGw7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZW5kZXJMaXN0U3RhY2sucG9wKCk7XHJcblxyXG5cdFx0XHRpZiAoIHJlbmRlckxpc3RTdGFjay5sZW5ndGggPiAwICkge1xyXG5cclxuXHRcdFx0XHRjdXJyZW50UmVuZGVyTGlzdCA9IHJlbmRlckxpc3RTdGFja1sgcmVuZGVyTGlzdFN0YWNrLmxlbmd0aCAtIDEgXTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGN1cnJlbnRSZW5kZXJMaXN0ID0gbnVsbDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdGZ1bmN0aW9uIHByb2plY3RPYmplY3QoIG9iamVjdCwgY2FtZXJhLCBncm91cE9yZGVyLCBzb3J0T2JqZWN0cyApIHtcclxuXHJcblx0XHRcdGlmICggb2JqZWN0LnZpc2libGUgPT09IGZhbHNlICkgcmV0dXJuO1xyXG5cclxuXHRcdFx0Y29uc3QgdmlzaWJsZSA9IG9iamVjdC5sYXllcnMudGVzdCggY2FtZXJhLmxheWVycyApO1xyXG5cclxuXHRcdFx0aWYgKCB2aXNpYmxlICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIG9iamVjdC5pc0dyb3VwICkge1xyXG5cclxuXHRcdFx0XHRcdGdyb3VwT3JkZXIgPSBvYmplY3QucmVuZGVyT3JkZXI7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc0xPRCApIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIG9iamVjdC5hdXRvVXBkYXRlID09PSB0cnVlICkgb2JqZWN0LnVwZGF0ZSggY2FtZXJhICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc0xpZ2h0ICkge1xyXG5cclxuXHRcdFx0XHRcdGN1cnJlbnRSZW5kZXJTdGF0ZS5wdXNoTGlnaHQoIG9iamVjdCApO1xyXG5cclxuXHRcdFx0XHRcdGlmICggb2JqZWN0LmNhc3RTaGFkb3cgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjdXJyZW50UmVuZGVyU3RhdGUucHVzaFNoYWRvdyggb2JqZWN0ICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCBvYmplY3QuaXNTcHJpdGUgKSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCAhIG9iamVjdC5mcnVzdHVtQ3VsbGVkIHx8IF9mcnVzdHVtLmludGVyc2VjdHNTcHJpdGUoIG9iamVjdCApICkge1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCBzb3J0T2JqZWN0cyApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0X3ZlY3RvcjQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBvYmplY3QubWF0cml4V29ybGQgKVxyXG5cdFx0XHRcdFx0XHRcdFx0LmFwcGx5TWF0cml4NCggX3Byb2pTY3JlZW5NYXRyaXggKTtcclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdGNvbnN0IGdlb21ldHJ5ID0gb2JqZWN0cy51cGRhdGUoIG9iamVjdCApO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBtYXRlcmlhbCA9IG9iamVjdC5tYXRlcmlhbDtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggbWF0ZXJpYWwudmlzaWJsZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0Y3VycmVudFJlbmRlckxpc3QucHVzaCggb2JqZWN0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwT3JkZXIsIF92ZWN0b3I0LnosIG51bGwgKTtcclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc01lc2ggfHwgb2JqZWN0LmlzTGluZSB8fCBvYmplY3QuaXNQb2ludHMgKSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCAhIG9iamVjdC5mcnVzdHVtQ3VsbGVkIHx8IF9mcnVzdHVtLmludGVyc2VjdHNPYmplY3QoIG9iamVjdCApICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgZ2VvbWV0cnkgPSBvYmplY3RzLnVwZGF0ZSggb2JqZWN0ICk7XHJcblx0XHRcdFx0XHRcdGNvbnN0IG1hdGVyaWFsID0gb2JqZWN0Lm1hdGVyaWFsO1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCBzb3J0T2JqZWN0cyApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKCBvYmplY3QuYm91bmRpbmdTcGhlcmUgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoIG9iamVjdC5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCApIG9iamVjdC5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcclxuXHRcdFx0XHRcdFx0XHRcdF92ZWN0b3I0LmNvcHkoIG9iamVjdC5ib3VuZGluZ1NwaGVyZS5jZW50ZXIgKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID09PSBudWxsICkgZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XHJcblx0XHRcdFx0XHRcdFx0XHRfdmVjdG9yNC5jb3B5KCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZS5jZW50ZXIgKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRfdmVjdG9yNFxyXG5cdFx0XHRcdFx0XHRcdFx0LmFwcGx5TWF0cml4NCggb2JqZWN0Lm1hdHJpeFdvcmxkIClcclxuXHRcdFx0XHRcdFx0XHRcdC5hcHBseU1hdHJpeDQoIF9wcm9qU2NyZWVuTWF0cml4ICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIG1hdGVyaWFsICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGdyb3VwcyA9IGdlb21ldHJ5Lmdyb3VwcztcclxuXHJcblx0XHRcdFx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gZ3JvdXBzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgZ3JvdXAgPSBncm91cHNbIGkgXTtcclxuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGdyb3VwTWF0ZXJpYWwgPSBtYXRlcmlhbFsgZ3JvdXAubWF0ZXJpYWxJbmRleCBdO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGlmICggZ3JvdXBNYXRlcmlhbCAmJiBncm91cE1hdGVyaWFsLnZpc2libGUgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRjdXJyZW50UmVuZGVyTGlzdC5wdXNoKCBvYmplY3QsIGdlb21ldHJ5LCBncm91cE1hdGVyaWFsLCBncm91cE9yZGVyLCBfdmVjdG9yNC56LCBncm91cCApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwudmlzaWJsZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0Y3VycmVudFJlbmRlckxpc3QucHVzaCggb2JqZWN0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwT3JkZXIsIF92ZWN0b3I0LnosIG51bGwgKTtcclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IGNoaWxkcmVuID0gb2JqZWN0LmNoaWxkcmVuO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0cHJvamVjdE9iamVjdCggY2hpbGRyZW5bIGkgXSwgY2FtZXJhLCBncm91cE9yZGVyLCBzb3J0T2JqZWN0cyApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiByZW5kZXJTY2VuZSggY3VycmVudFJlbmRlckxpc3QsIHNjZW5lLCBjYW1lcmEsIHZpZXdwb3J0ICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgb3BhcXVlT2JqZWN0cyA9IGN1cnJlbnRSZW5kZXJMaXN0Lm9wYXF1ZTtcclxuXHRcdFx0Y29uc3QgdHJhbnNtaXNzaXZlT2JqZWN0cyA9IGN1cnJlbnRSZW5kZXJMaXN0LnRyYW5zbWlzc2l2ZTtcclxuXHRcdFx0Y29uc3QgdHJhbnNwYXJlbnRPYmplY3RzID0gY3VycmVudFJlbmRlckxpc3QudHJhbnNwYXJlbnQ7XHJcblxyXG5cdFx0XHRjdXJyZW50UmVuZGVyU3RhdGUuc2V0dXBMaWdodHNWaWV3KCBjYW1lcmEgKTtcclxuXHJcblx0XHRcdGlmICggX2NsaXBwaW5nRW5hYmxlZCA9PT0gdHJ1ZSApIGNsaXBwaW5nLnNldEdsb2JhbFN0YXRlKCBfdGhpcy5jbGlwcGluZ1BsYW5lcywgY2FtZXJhICk7XHJcblxyXG5cdFx0XHRpZiAoIHZpZXdwb3J0ICkgc3RhdGUudmlld3BvcnQoIF9jdXJyZW50Vmlld3BvcnQuY29weSggdmlld3BvcnQgKSApO1xyXG5cclxuXHRcdFx0aWYgKCBvcGFxdWVPYmplY3RzLmxlbmd0aCA+IDAgKSByZW5kZXJPYmplY3RzKCBvcGFxdWVPYmplY3RzLCBzY2VuZSwgY2FtZXJhICk7XHJcblx0XHRcdGlmICggdHJhbnNtaXNzaXZlT2JqZWN0cy5sZW5ndGggPiAwICkgcmVuZGVyT2JqZWN0cyggdHJhbnNtaXNzaXZlT2JqZWN0cywgc2NlbmUsIGNhbWVyYSApO1xyXG5cdFx0XHRpZiAoIHRyYW5zcGFyZW50T2JqZWN0cy5sZW5ndGggPiAwICkgcmVuZGVyT2JqZWN0cyggdHJhbnNwYXJlbnRPYmplY3RzLCBzY2VuZSwgY2FtZXJhICk7XHJcblxyXG5cdFx0XHQvLyBFbnN1cmUgZGVwdGggYnVmZmVyIHdyaXRpbmcgaXMgZW5hYmxlZCBzbyBpdCBjYW4gYmUgY2xlYXJlZCBvbiBuZXh0IHJlbmRlclxyXG5cclxuXHRcdFx0c3RhdGUuYnVmZmVycy5kZXB0aC5zZXRUZXN0KCB0cnVlICk7XHJcblx0XHRcdHN0YXRlLmJ1ZmZlcnMuZGVwdGguc2V0TWFzayggdHJ1ZSApO1xyXG5cdFx0XHRzdGF0ZS5idWZmZXJzLmNvbG9yLnNldE1hc2soIHRydWUgKTtcclxuXHJcblx0XHRcdHN0YXRlLnNldFBvbHlnb25PZmZzZXQoIGZhbHNlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIHJlbmRlclRyYW5zbWlzc2lvblBhc3MoIG9wYXF1ZU9iamVjdHMsIHRyYW5zbWlzc2l2ZU9iamVjdHMsIHNjZW5lLCBjYW1lcmEgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBvdmVycmlkZU1hdGVyaWFsID0gc2NlbmUuaXNTY2VuZSA9PT0gdHJ1ZSA/IHNjZW5lLm92ZXJyaWRlTWF0ZXJpYWwgOiBudWxsO1xyXG5cclxuXHRcdFx0aWYgKCBvdmVycmlkZU1hdGVyaWFsICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIGN1cnJlbnRSZW5kZXJTdGF0ZS5zdGF0ZS50cmFuc21pc3Npb25SZW5kZXJUYXJnZXRbIGNhbWVyYS5pZCBdID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGN1cnJlbnRSZW5kZXJTdGF0ZS5zdGF0ZS50cmFuc21pc3Npb25SZW5kZXJUYXJnZXRbIGNhbWVyYS5pZCBdID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KCAxLCAxLCB7XHJcblx0XHRcdFx0XHRnZW5lcmF0ZU1pcG1hcHM6IHRydWUsXHJcblx0XHRcdFx0XHR0eXBlOiAoIGV4dGVuc2lvbnMuaGFzKCAnRVhUX2NvbG9yX2J1ZmZlcl9oYWxmX2Zsb2F0JyApIHx8IGV4dGVuc2lvbnMuaGFzKCAnRVhUX2NvbG9yX2J1ZmZlcl9mbG9hdCcgKSApID8gSGFsZkZsb2F0VHlwZSA6IFVuc2lnbmVkQnl0ZVR5cGUsXHJcblx0XHRcdFx0XHRtaW5GaWx0ZXI6IExpbmVhck1pcG1hcExpbmVhckZpbHRlcixcclxuXHRcdFx0XHRcdHNhbXBsZXM6IDQsXHJcblx0XHRcdFx0XHRzdGVuY2lsQnVmZmVyOiBzdGVuY2lsLFxyXG5cdFx0XHRcdFx0cmVzb2x2ZURlcHRoQnVmZmVyOiBmYWxzZSxcclxuXHRcdFx0XHRcdHJlc29sdmVTdGVuY2lsQnVmZmVyOiBmYWxzZSxcclxuXHRcdFx0XHRcdGNvbG9yU3BhY2U6IENvbG9yTWFuYWdlbWVudC53b3JraW5nQ29sb3JTcGFjZSxcclxuXHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRcdC8vIGRlYnVnXHJcblxyXG5cdFx0XHRcdC8qXHJcblx0XHRcdFx0Y29uc3QgZ2VvbWV0cnkgPSBuZXcgUGxhbmVHZW9tZXRyeSgpO1xyXG5cdFx0XHRcdGNvbnN0IG1hdGVyaWFsID0gbmV3IE1lc2hCYXNpY01hdGVyaWFsKCB7IG1hcDogX3RyYW5zbWlzc2lvblJlbmRlclRhcmdldC50ZXh0dXJlIH0gKTtcclxuXHJcblx0XHRcdFx0Y29uc3QgbWVzaCA9IG5ldyBNZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuXHRcdFx0XHRzY2VuZS5hZGQoIG1lc2ggKTtcclxuXHRcdFx0XHQqL1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgdHJhbnNtaXNzaW9uUmVuZGVyVGFyZ2V0ID0gY3VycmVudFJlbmRlclN0YXRlLnN0YXRlLnRyYW5zbWlzc2lvblJlbmRlclRhcmdldFsgY2FtZXJhLmlkIF07XHJcblxyXG5cdFx0XHRjb25zdCBhY3RpdmVWaWV3cG9ydCA9IGNhbWVyYS52aWV3cG9ydCB8fCBfY3VycmVudFZpZXdwb3J0O1xyXG5cdFx0XHR0cmFuc21pc3Npb25SZW5kZXJUYXJnZXQuc2V0U2l6ZSggYWN0aXZlVmlld3BvcnQueiAqIF90aGlzLnRyYW5zbWlzc2lvblJlc29sdXRpb25TY2FsZSwgYWN0aXZlVmlld3BvcnQudyAqIF90aGlzLnRyYW5zbWlzc2lvblJlc29sdXRpb25TY2FsZSApO1xyXG5cclxuXHRcdFx0Ly9cclxuXHJcblx0XHRcdGNvbnN0IGN1cnJlbnRSZW5kZXJUYXJnZXQgPSBfdGhpcy5nZXRSZW5kZXJUYXJnZXQoKTtcclxuXHRcdFx0X3RoaXMuc2V0UmVuZGVyVGFyZ2V0KCB0cmFuc21pc3Npb25SZW5kZXJUYXJnZXQgKTtcclxuXHJcblx0XHRcdF90aGlzLmdldENsZWFyQ29sb3IoIF9jdXJyZW50Q2xlYXJDb2xvciApO1xyXG5cdFx0XHRfY3VycmVudENsZWFyQWxwaGEgPSBfdGhpcy5nZXRDbGVhckFscGhhKCk7XHJcblx0XHRcdGlmICggX2N1cnJlbnRDbGVhckFscGhhIDwgMSApIF90aGlzLnNldENsZWFyQ29sb3IoIDB4ZmZmZmZmLCAwLjUgKTtcclxuXHJcblx0XHRcdF90aGlzLmNsZWFyKCk7XHJcblxyXG5cdFx0XHRpZiAoIF9yZW5kZXJCYWNrZ3JvdW5kICkgYmFja2dyb3VuZC5yZW5kZXIoIHNjZW5lICk7XHJcblxyXG5cdFx0XHQvLyBUdXJuIG9mZiB0aGUgZmVhdHVyZXMgd2hpY2ggY2FuIGFmZmVjdCB0aGUgZnJhZyBjb2xvciBmb3Igb3BhcXVlIG9iamVjdHMgcGFzcy5cclxuXHRcdFx0Ly8gT3RoZXJ3aXNlIHRoZXkgYXJlIGFwcGxpZWQgdHdpY2UgaW4gb3BhcXVlIG9iamVjdHMgcGFzcyBhbmQgdHJhbnNtaXNzaW9uIG9iamVjdHMgcGFzcy5cclxuXHRcdFx0Y29uc3QgY3VycmVudFRvbmVNYXBwaW5nID0gX3RoaXMudG9uZU1hcHBpbmc7XHJcblx0XHRcdF90aGlzLnRvbmVNYXBwaW5nID0gTm9Ub25lTWFwcGluZztcclxuXHJcblx0XHRcdC8vIFJlbW92ZSB2aWV3cG9ydCBmcm9tIGNhbWVyYSB0byBhdm9pZCBuZXN0ZWQgcmVuZGVyIGNhbGxzIHJlc2V0dGluZyB2aWV3cG9ydCB0byBpdCAoZS5nIFJlZmxlY3RvcikuXHJcblx0XHRcdC8vIFRyYW5zbWlzc2lvbiByZW5kZXIgcGFzcyByZXF1aXJlcyB2aWV3cG9ydCB0byBtYXRjaCB0aGUgdHJhbnNtaXNzaW9uUmVuZGVyVGFyZ2V0LlxyXG5cdFx0XHRjb25zdCBjdXJyZW50Q2FtZXJhVmlld3BvcnQgPSBjYW1lcmEudmlld3BvcnQ7XHJcblx0XHRcdGlmICggY2FtZXJhLnZpZXdwb3J0ICE9PSB1bmRlZmluZWQgKSBjYW1lcmEudmlld3BvcnQgPSB1bmRlZmluZWQ7XHJcblxyXG5cdFx0XHRjdXJyZW50UmVuZGVyU3RhdGUuc2V0dXBMaWdodHNWaWV3KCBjYW1lcmEgKTtcclxuXHJcblx0XHRcdGlmICggX2NsaXBwaW5nRW5hYmxlZCA9PT0gdHJ1ZSApIGNsaXBwaW5nLnNldEdsb2JhbFN0YXRlKCBfdGhpcy5jbGlwcGluZ1BsYW5lcywgY2FtZXJhICk7XHJcblxyXG5cdFx0XHRyZW5kZXJPYmplY3RzKCBvcGFxdWVPYmplY3RzLCBzY2VuZSwgY2FtZXJhICk7XHJcblxyXG5cdFx0XHR0ZXh0dXJlcy51cGRhdGVNdWx0aXNhbXBsZVJlbmRlclRhcmdldCggdHJhbnNtaXNzaW9uUmVuZGVyVGFyZ2V0ICk7XHJcblx0XHRcdHRleHR1cmVzLnVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcCggdHJhbnNtaXNzaW9uUmVuZGVyVGFyZ2V0ICk7XHJcblxyXG5cdFx0XHRpZiAoIGV4dGVuc2lvbnMuaGFzKCAnV0VCR0xfbXVsdGlzYW1wbGVkX3JlbmRlcl90b190ZXh0dXJlJyApID09PSBmYWxzZSApIHsgLy8gc2VlICMyODEzMVxyXG5cclxuXHRcdFx0XHRsZXQgcmVuZGVyVGFyZ2V0TmVlZHNVcGRhdGUgPSBmYWxzZTtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gdHJhbnNtaXNzaXZlT2JqZWN0cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHJlbmRlckl0ZW0gPSB0cmFuc21pc3NpdmVPYmplY3RzWyBpIF07XHJcblxyXG5cdFx0XHRcdFx0Y29uc3Qgb2JqZWN0ID0gcmVuZGVySXRlbS5vYmplY3Q7XHJcblx0XHRcdFx0XHRjb25zdCBnZW9tZXRyeSA9IHJlbmRlckl0ZW0uZ2VvbWV0cnk7XHJcblx0XHRcdFx0XHRjb25zdCBtYXRlcmlhbCA9IHJlbmRlckl0ZW0ubWF0ZXJpYWw7XHJcblx0XHRcdFx0XHRjb25zdCBncm91cCA9IHJlbmRlckl0ZW0uZ3JvdXA7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBtYXRlcmlhbC5zaWRlID09PSBEb3VibGVTaWRlICYmIG9iamVjdC5sYXllcnMudGVzdCggY2FtZXJhLmxheWVycyApICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgY3VycmVudFNpZGUgPSBtYXRlcmlhbC5zaWRlO1xyXG5cclxuXHRcdFx0XHRcdFx0bWF0ZXJpYWwuc2lkZSA9IEJhY2tTaWRlO1xyXG5cdFx0XHRcdFx0XHRtYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0XHRcdFx0XHRyZW5kZXJPYmplY3QoIG9iamVjdCwgc2NlbmUsIGNhbWVyYSwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cCApO1xyXG5cclxuXHRcdFx0XHRcdFx0bWF0ZXJpYWwuc2lkZSA9IGN1cnJlbnRTaWRlO1xyXG5cdFx0XHRcdFx0XHRtYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0XHRcdFx0XHRyZW5kZXJUYXJnZXROZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICggcmVuZGVyVGFyZ2V0TmVlZHNVcGRhdGUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0dGV4dHVyZXMudXBkYXRlTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQoIHRyYW5zbWlzc2lvblJlbmRlclRhcmdldCApO1xyXG5cdFx0XHRcdFx0dGV4dHVyZXMudXBkYXRlUmVuZGVyVGFyZ2V0TWlwbWFwKCB0cmFuc21pc3Npb25SZW5kZXJUYXJnZXQgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0X3RoaXMuc2V0UmVuZGVyVGFyZ2V0KCBjdXJyZW50UmVuZGVyVGFyZ2V0ICk7XHJcblxyXG5cdFx0XHRfdGhpcy5zZXRDbGVhckNvbG9yKCBfY3VycmVudENsZWFyQ29sb3IsIF9jdXJyZW50Q2xlYXJBbHBoYSApO1xyXG5cclxuXHRcdFx0aWYgKCBjdXJyZW50Q2FtZXJhVmlld3BvcnQgIT09IHVuZGVmaW5lZCApIGNhbWVyYS52aWV3cG9ydCA9IGN1cnJlbnRDYW1lcmFWaWV3cG9ydDtcclxuXHJcblx0XHRcdF90aGlzLnRvbmVNYXBwaW5nID0gY3VycmVudFRvbmVNYXBwaW5nO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiByZW5kZXJPYmplY3RzKCByZW5kZXJMaXN0LCBzY2VuZSwgY2FtZXJhICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgb3ZlcnJpZGVNYXRlcmlhbCA9IHNjZW5lLmlzU2NlbmUgPT09IHRydWUgPyBzY2VuZS5vdmVycmlkZU1hdGVyaWFsIDogbnVsbDtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHJlbmRlckxpc3QubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgcmVuZGVySXRlbSA9IHJlbmRlckxpc3RbIGkgXTtcclxuXHJcblx0XHRcdFx0Y29uc3Qgb2JqZWN0ID0gcmVuZGVySXRlbS5vYmplY3Q7XHJcblx0XHRcdFx0Y29uc3QgZ2VvbWV0cnkgPSByZW5kZXJJdGVtLmdlb21ldHJ5O1xyXG5cdFx0XHRcdGNvbnN0IGdyb3VwID0gcmVuZGVySXRlbS5ncm91cDtcclxuXHRcdFx0XHRsZXQgbWF0ZXJpYWwgPSByZW5kZXJJdGVtLm1hdGVyaWFsO1xyXG5cclxuXHRcdFx0XHRpZiAoIG1hdGVyaWFsLmFsbG93T3ZlcnJpZGUgPT09IHRydWUgJiYgb3ZlcnJpZGVNYXRlcmlhbCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHRtYXRlcmlhbCA9IG92ZXJyaWRlTWF0ZXJpYWw7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKCBvYmplY3QubGF5ZXJzLnRlc3QoIGNhbWVyYS5sYXllcnMgKSApIHtcclxuXHJcblx0XHRcdFx0XHRyZW5kZXJPYmplY3QoIG9iamVjdCwgc2NlbmUsIGNhbWVyYSwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIHJlbmRlck9iamVjdCggb2JqZWN0LCBzY2VuZSwgY2FtZXJhLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwICkge1xyXG5cclxuXHRcdFx0b2JqZWN0Lm9uQmVmb3JlUmVuZGVyKCBfdGhpcywgc2NlbmUsIGNhbWVyYSwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cCApO1xyXG5cclxuXHRcdFx0b2JqZWN0Lm1vZGVsVmlld01hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlLCBvYmplY3QubWF0cml4V29ybGQgKTtcclxuXHRcdFx0b2JqZWN0Lm5vcm1hbE1hdHJpeC5nZXROb3JtYWxNYXRyaXgoIG9iamVjdC5tb2RlbFZpZXdNYXRyaXggKTtcclxuXHJcblx0XHRcdG1hdGVyaWFsLm9uQmVmb3JlUmVuZGVyKCBfdGhpcywgc2NlbmUsIGNhbWVyYSwgZ2VvbWV0cnksIG9iamVjdCwgZ3JvdXAgKTtcclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWwudHJhbnNwYXJlbnQgPT09IHRydWUgJiYgbWF0ZXJpYWwuc2lkZSA9PT0gRG91YmxlU2lkZSAmJiBtYXRlcmlhbC5mb3JjZVNpbmdsZVBhc3MgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0XHRtYXRlcmlhbC5zaWRlID0gQmFja1NpZGU7XHJcblx0XHRcdFx0bWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cdFx0XHRcdF90aGlzLnJlbmRlckJ1ZmZlckRpcmVjdCggY2FtZXJhLCBzY2VuZSwgZ2VvbWV0cnksIG1hdGVyaWFsLCBvYmplY3QsIGdyb3VwICk7XHJcblxyXG5cdFx0XHRcdG1hdGVyaWFsLnNpZGUgPSBGcm9udFNpZGU7XHJcblx0XHRcdFx0bWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cdFx0XHRcdF90aGlzLnJlbmRlckJ1ZmZlckRpcmVjdCggY2FtZXJhLCBzY2VuZSwgZ2VvbWV0cnksIG1hdGVyaWFsLCBvYmplY3QsIGdyb3VwICk7XHJcblxyXG5cdFx0XHRcdG1hdGVyaWFsLnNpZGUgPSBEb3VibGVTaWRlO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0X3RoaXMucmVuZGVyQnVmZmVyRGlyZWN0KCBjYW1lcmEsIHNjZW5lLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIG9iamVjdCwgZ3JvdXAgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdG9iamVjdC5vbkFmdGVyUmVuZGVyKCBfdGhpcywgc2NlbmUsIGNhbWVyYSwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiBnZXRQcm9ncmFtKCBtYXRlcmlhbCwgc2NlbmUsIG9iamVjdCApIHtcclxuXHJcblx0XHRcdGlmICggc2NlbmUuaXNTY2VuZSAhPT0gdHJ1ZSApIHNjZW5lID0gX2VtcHR5U2NlbmU7IC8vIHNjZW5lIGNvdWxkIGJlIGEgTWVzaCwgTGluZSwgUG9pbnRzLCAuLi5cclxuXHJcblx0XHRcdGNvbnN0IG1hdGVyaWFsUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCBtYXRlcmlhbCApO1xyXG5cclxuXHRcdFx0Y29uc3QgbGlnaHRzID0gY3VycmVudFJlbmRlclN0YXRlLnN0YXRlLmxpZ2h0cztcclxuXHRcdFx0Y29uc3Qgc2hhZG93c0FycmF5ID0gY3VycmVudFJlbmRlclN0YXRlLnN0YXRlLnNoYWRvd3NBcnJheTtcclxuXHJcblx0XHRcdGNvbnN0IGxpZ2h0c1N0YXRlVmVyc2lvbiA9IGxpZ2h0cy5zdGF0ZS52ZXJzaW9uO1xyXG5cclxuXHRcdFx0Y29uc3QgcGFyYW1ldGVycyA9IHByb2dyYW1DYWNoZS5nZXRQYXJhbWV0ZXJzKCBtYXRlcmlhbCwgbGlnaHRzLnN0YXRlLCBzaGFkb3dzQXJyYXksIHNjZW5lLCBvYmplY3QgKTtcclxuXHRcdFx0Y29uc3QgcHJvZ3JhbUNhY2hlS2V5ID0gcHJvZ3JhbUNhY2hlLmdldFByb2dyYW1DYWNoZUtleSggcGFyYW1ldGVycyApO1xyXG5cclxuXHRcdFx0bGV0IHByb2dyYW1zID0gbWF0ZXJpYWxQcm9wZXJ0aWVzLnByb2dyYW1zO1xyXG5cclxuXHRcdFx0Ly8gYWx3YXlzIHVwZGF0ZSBlbnZpcm9ubWVudCBhbmQgZm9nIC0gY2hhbmdpbmcgdGhlc2UgdHJpZ2dlciBhbiBnZXRQcm9ncmFtIGNhbGwsIGJ1dCBpdCdzIHBvc3NpYmxlIHRoYXQgdGhlIHByb2dyYW0gZG9lc24ndCBjaGFuZ2VcclxuXHJcblx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy5lbnZpcm9ubWVudCA9IG1hdGVyaWFsLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwgPyBzY2VuZS5lbnZpcm9ubWVudCA6IG51bGw7XHJcblx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy5mb2cgPSBzY2VuZS5mb2c7XHJcblx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy5lbnZNYXAgPSAoIG1hdGVyaWFsLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwgPyBjdWJldXZtYXBzIDogY3ViZW1hcHMgKS5nZXQoIG1hdGVyaWFsLmVudk1hcCB8fCBtYXRlcmlhbFByb3BlcnRpZXMuZW52aXJvbm1lbnQgKTtcclxuXHRcdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLmVudk1hcFJvdGF0aW9uID0gKCBtYXRlcmlhbFByb3BlcnRpZXMuZW52aXJvbm1lbnQgIT09IG51bGwgJiYgbWF0ZXJpYWwuZW52TWFwID09PSBudWxsICkgPyBzY2VuZS5lbnZpcm9ubWVudFJvdGF0aW9uIDogbWF0ZXJpYWwuZW52TWFwUm90YXRpb247XHJcblxyXG5cdFx0XHRpZiAoIHByb2dyYW1zID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdC8vIG5ldyBtYXRlcmlhbFxyXG5cclxuXHRcdFx0XHRtYXRlcmlhbC5hZGRFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uTWF0ZXJpYWxEaXNwb3NlICk7XHJcblxyXG5cdFx0XHRcdHByb2dyYW1zID0gbmV3IE1hcCgpO1xyXG5cdFx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy5wcm9ncmFtcyA9IHByb2dyYW1zO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0bGV0IHByb2dyYW0gPSBwcm9ncmFtcy5nZXQoIHByb2dyYW1DYWNoZUtleSApO1xyXG5cclxuXHRcdFx0aWYgKCBwcm9ncmFtICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdC8vIGVhcmx5IG91dCBpZiBwcm9ncmFtIGFuZCBsaWdodCBzdGF0ZSBpcyBpZGVudGljYWxcclxuXHJcblx0XHRcdFx0aWYgKCBtYXRlcmlhbFByb3BlcnRpZXMuY3VycmVudFByb2dyYW0gPT09IHByb2dyYW0gJiYgbWF0ZXJpYWxQcm9wZXJ0aWVzLmxpZ2h0c1N0YXRlVmVyc2lvbiA9PT0gbGlnaHRzU3RhdGVWZXJzaW9uICkge1xyXG5cclxuXHRcdFx0XHRcdHVwZGF0ZUNvbW1vbk1hdGVyaWFsUHJvcGVydGllcyggbWF0ZXJpYWwsIHBhcmFtZXRlcnMgKTtcclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gcHJvZ3JhbTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0cGFyYW1ldGVycy51bmlmb3JtcyA9IHByb2dyYW1DYWNoZS5nZXRVbmlmb3JtcyggbWF0ZXJpYWwgKTtcclxuXHJcblx0XHRcdFx0bWF0ZXJpYWwub25CZWZvcmVDb21waWxlKCBwYXJhbWV0ZXJzLCBfdGhpcyApO1xyXG5cclxuXHRcdFx0XHRwcm9ncmFtID0gcHJvZ3JhbUNhY2hlLmFjcXVpcmVQcm9ncmFtKCBwYXJhbWV0ZXJzLCBwcm9ncmFtQ2FjaGVLZXkgKTtcclxuXHRcdFx0XHRwcm9ncmFtcy5zZXQoIHByb2dyYW1DYWNoZUtleSwgcHJvZ3JhbSApO1xyXG5cclxuXHRcdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMudW5pZm9ybXMgPSBwYXJhbWV0ZXJzLnVuaWZvcm1zO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgdW5pZm9ybXMgPSBtYXRlcmlhbFByb3BlcnRpZXMudW5pZm9ybXM7XHJcblxyXG5cdFx0XHRpZiAoICggISBtYXRlcmlhbC5pc1NoYWRlck1hdGVyaWFsICYmICEgbWF0ZXJpYWwuaXNSYXdTaGFkZXJNYXRlcmlhbCApIHx8IG1hdGVyaWFsLmNsaXBwaW5nID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHR1bmlmb3Jtcy5jbGlwcGluZ1BsYW5lcyA9IGNsaXBwaW5nLnVuaWZvcm07XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR1cGRhdGVDb21tb25NYXRlcmlhbFByb3BlcnRpZXMoIG1hdGVyaWFsLCBwYXJhbWV0ZXJzICk7XHJcblxyXG5cdFx0XHQvLyBzdG9yZSB0aGUgbGlnaHQgc2V0dXAgaXQgd2FzIGNyZWF0ZWQgZm9yXHJcblxyXG5cdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMubmVlZHNMaWdodHMgPSBtYXRlcmlhbE5lZWRzTGlnaHRzKCBtYXRlcmlhbCApO1xyXG5cdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMubGlnaHRzU3RhdGVWZXJzaW9uID0gbGlnaHRzU3RhdGVWZXJzaW9uO1xyXG5cclxuXHRcdFx0aWYgKCBtYXRlcmlhbFByb3BlcnRpZXMubmVlZHNMaWdodHMgKSB7XHJcblxyXG5cdFx0XHRcdC8vIHdpcmUgdXAgdGhlIG1hdGVyaWFsIHRvIHRoaXMgcmVuZGVyZXIncyBsaWdodGluZyBzdGF0ZVxyXG5cclxuXHRcdFx0XHR1bmlmb3Jtcy5hbWJpZW50TGlnaHRDb2xvci52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5hbWJpZW50O1xyXG5cdFx0XHRcdHVuaWZvcm1zLmxpZ2h0UHJvYmUudmFsdWUgPSBsaWdodHMuc3RhdGUucHJvYmU7XHJcblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uYWxMaWdodHMudmFsdWUgPSBsaWdodHMuc3RhdGUuZGlyZWN0aW9uYWw7XHJcblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uYWxMaWdodFNoYWRvd3MudmFsdWUgPSBsaWdodHMuc3RhdGUuZGlyZWN0aW9uYWxTaGFkb3c7XHJcblx0XHRcdFx0dW5pZm9ybXMuc3BvdExpZ2h0cy52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5zcG90O1xyXG5cdFx0XHRcdHVuaWZvcm1zLnNwb3RMaWdodFNoYWRvd3MudmFsdWUgPSBsaWdodHMuc3RhdGUuc3BvdFNoYWRvdztcclxuXHRcdFx0XHR1bmlmb3Jtcy5yZWN0QXJlYUxpZ2h0cy52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5yZWN0QXJlYTtcclxuXHRcdFx0XHR1bmlmb3Jtcy5sdGNfMS52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5yZWN0QXJlYUxUQzE7XHJcblx0XHRcdFx0dW5pZm9ybXMubHRjXzIudmFsdWUgPSBsaWdodHMuc3RhdGUucmVjdEFyZWFMVEMyO1xyXG5cdFx0XHRcdHVuaWZvcm1zLnBvaW50TGlnaHRzLnZhbHVlID0gbGlnaHRzLnN0YXRlLnBvaW50O1xyXG5cdFx0XHRcdHVuaWZvcm1zLnBvaW50TGlnaHRTaGFkb3dzLnZhbHVlID0gbGlnaHRzLnN0YXRlLnBvaW50U2hhZG93O1xyXG5cdFx0XHRcdHVuaWZvcm1zLmhlbWlzcGhlcmVMaWdodHMudmFsdWUgPSBsaWdodHMuc3RhdGUuaGVtaTtcclxuXHJcblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uYWxTaGFkb3dNYXAudmFsdWUgPSBsaWdodHMuc3RhdGUuZGlyZWN0aW9uYWxTaGFkb3dNYXA7XHJcblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXgudmFsdWUgPSBsaWdodHMuc3RhdGUuZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXg7XHJcblx0XHRcdFx0dW5pZm9ybXMuc3BvdFNoYWRvd01hcC52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5zcG90U2hhZG93TWFwO1xyXG5cdFx0XHRcdHVuaWZvcm1zLnNwb3RMaWdodE1hdHJpeC52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5zcG90TGlnaHRNYXRyaXg7XHJcblx0XHRcdFx0dW5pZm9ybXMuc3BvdExpZ2h0TWFwLnZhbHVlID0gbGlnaHRzLnN0YXRlLnNwb3RMaWdodE1hcDtcclxuXHRcdFx0XHR1bmlmb3Jtcy5wb2ludFNoYWRvd01hcC52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5wb2ludFNoYWRvd01hcDtcclxuXHRcdFx0XHR1bmlmb3Jtcy5wb2ludFNoYWRvd01hdHJpeC52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5wb2ludFNoYWRvd01hdHJpeDtcclxuXHRcdFx0XHQvLyBUT0RPIChhYmVsbmF0aW9uKTogYWRkIGFyZWEgbGlnaHRzIHNoYWRvdyBpbmZvIHRvIHVuaWZvcm1zXHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMuY3VycmVudFByb2dyYW0gPSBwcm9ncmFtO1xyXG5cdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMudW5pZm9ybXNMaXN0ID0gbnVsbDtcclxuXHJcblx0XHRcdHJldHVybiBwcm9ncmFtO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiBnZXRVbmlmb3JtTGlzdCggbWF0ZXJpYWxQcm9wZXJ0aWVzICkge1xyXG5cclxuXHRcdFx0aWYgKCBtYXRlcmlhbFByb3BlcnRpZXMudW5pZm9ybXNMaXN0ID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBwcm9nVW5pZm9ybXMgPSBtYXRlcmlhbFByb3BlcnRpZXMuY3VycmVudFByb2dyYW0uZ2V0VW5pZm9ybXMoKTtcclxuXHRcdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMudW5pZm9ybXNMaXN0ID0gV2ViR0xVbmlmb3Jtcy5zZXFXaXRoVmFsdWUoIHByb2dVbmlmb3Jtcy5zZXEsIG1hdGVyaWFsUHJvcGVydGllcy51bmlmb3JtcyApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIG1hdGVyaWFsUHJvcGVydGllcy51bmlmb3Jtc0xpc3Q7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIHVwZGF0ZUNvbW1vbk1hdGVyaWFsUHJvcGVydGllcyggbWF0ZXJpYWwsIHBhcmFtZXRlcnMgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBtYXRlcmlhbFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggbWF0ZXJpYWwgKTtcclxuXHJcblx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy5vdXRwdXRDb2xvclNwYWNlID0gcGFyYW1ldGVycy5vdXRwdXRDb2xvclNwYWNlO1xyXG5cdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMuYmF0Y2hpbmcgPSBwYXJhbWV0ZXJzLmJhdGNoaW5nO1xyXG5cdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMuYmF0Y2hpbmdDb2xvciA9IHBhcmFtZXRlcnMuYmF0Y2hpbmdDb2xvcjtcclxuXHRcdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLmluc3RhbmNpbmcgPSBwYXJhbWV0ZXJzLmluc3RhbmNpbmc7XHJcblx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy5pbnN0YW5jaW5nQ29sb3IgPSBwYXJhbWV0ZXJzLmluc3RhbmNpbmdDb2xvcjtcclxuXHRcdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLmluc3RhbmNpbmdNb3JwaCA9IHBhcmFtZXRlcnMuaW5zdGFuY2luZ01vcnBoO1xyXG5cdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMuc2tpbm5pbmcgPSBwYXJhbWV0ZXJzLnNraW5uaW5nO1xyXG5cdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMubW9ycGhUYXJnZXRzID0gcGFyYW1ldGVycy5tb3JwaFRhcmdldHM7XHJcblx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy5tb3JwaE5vcm1hbHMgPSBwYXJhbWV0ZXJzLm1vcnBoTm9ybWFscztcclxuXHRcdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLm1vcnBoQ29sb3JzID0gcGFyYW1ldGVycy5tb3JwaENvbG9ycztcclxuXHRcdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLm1vcnBoVGFyZ2V0c0NvdW50ID0gcGFyYW1ldGVycy5tb3JwaFRhcmdldHNDb3VudDtcclxuXHRcdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLm51bUNsaXBwaW5nUGxhbmVzID0gcGFyYW1ldGVycy5udW1DbGlwcGluZ1BsYW5lcztcclxuXHRcdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLm51bUludGVyc2VjdGlvbiA9IHBhcmFtZXRlcnMubnVtQ2xpcEludGVyc2VjdGlvbjtcclxuXHRcdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLnZlcnRleEFscGhhcyA9IHBhcmFtZXRlcnMudmVydGV4QWxwaGFzO1xyXG5cdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMudmVydGV4VGFuZ2VudHMgPSBwYXJhbWV0ZXJzLnZlcnRleFRhbmdlbnRzO1xyXG5cdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMudG9uZU1hcHBpbmcgPSBwYXJhbWV0ZXJzLnRvbmVNYXBwaW5nO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiBzZXRQcm9ncmFtKCBjYW1lcmEsIHNjZW5lLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIG9iamVjdCApIHtcclxuXHJcblx0XHRcdGlmICggc2NlbmUuaXNTY2VuZSAhPT0gdHJ1ZSApIHNjZW5lID0gX2VtcHR5U2NlbmU7IC8vIHNjZW5lIGNvdWxkIGJlIGEgTWVzaCwgTGluZSwgUG9pbnRzLCAuLi5cclxuXHJcblx0XHRcdHRleHR1cmVzLnJlc2V0VGV4dHVyZVVuaXRzKCk7XHJcblxyXG5cdFx0XHRjb25zdCBmb2cgPSBzY2VuZS5mb2c7XHJcblx0XHRcdGNvbnN0IGVudmlyb25tZW50ID0gbWF0ZXJpYWwuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCA/IHNjZW5lLmVudmlyb25tZW50IDogbnVsbDtcclxuXHRcdFx0Y29uc3QgY29sb3JTcGFjZSA9ICggX2N1cnJlbnRSZW5kZXJUYXJnZXQgPT09IG51bGwgKSA/IF90aGlzLm91dHB1dENvbG9yU3BhY2UgOiAoIF9jdXJyZW50UmVuZGVyVGFyZ2V0LmlzWFJSZW5kZXJUYXJnZXQgPT09IHRydWUgPyBfY3VycmVudFJlbmRlclRhcmdldC50ZXh0dXJlLmNvbG9yU3BhY2UgOiBMaW5lYXJTUkdCQ29sb3JTcGFjZSApO1xyXG5cdFx0XHRjb25zdCBlbnZNYXAgPSAoIG1hdGVyaWFsLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwgPyBjdWJldXZtYXBzIDogY3ViZW1hcHMgKS5nZXQoIG1hdGVyaWFsLmVudk1hcCB8fCBlbnZpcm9ubWVudCApO1xyXG5cdFx0XHRjb25zdCB2ZXJ0ZXhBbHBoYXMgPSBtYXRlcmlhbC52ZXJ0ZXhDb2xvcnMgPT09IHRydWUgJiYgISEgZ2VvbWV0cnkuYXR0cmlidXRlcy5jb2xvciAmJiBnZW9tZXRyeS5hdHRyaWJ1dGVzLmNvbG9yLml0ZW1TaXplID09PSA0O1xyXG5cdFx0XHRjb25zdCB2ZXJ0ZXhUYW5nZW50cyA9ICEhIGdlb21ldHJ5LmF0dHJpYnV0ZXMudGFuZ2VudCAmJiAoICEhIG1hdGVyaWFsLm5vcm1hbE1hcCB8fCBtYXRlcmlhbC5hbmlzb3Ryb3B5ID4gMCApO1xyXG5cdFx0XHRjb25zdCBtb3JwaFRhcmdldHMgPSAhISBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb247XHJcblx0XHRcdGNvbnN0IG1vcnBoTm9ybWFscyA9ICEhIGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5ub3JtYWw7XHJcblx0XHRcdGNvbnN0IG1vcnBoQ29sb3JzID0gISEgZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLmNvbG9yO1xyXG5cclxuXHRcdFx0bGV0IHRvbmVNYXBwaW5nID0gTm9Ub25lTWFwcGluZztcclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWwudG9uZU1hcHBlZCApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBfY3VycmVudFJlbmRlclRhcmdldCA9PT0gbnVsbCB8fCBfY3VycmVudFJlbmRlclRhcmdldC5pc1hSUmVuZGVyVGFyZ2V0ID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRcdHRvbmVNYXBwaW5nID0gX3RoaXMudG9uZU1hcHBpbmc7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IG1vcnBoQXR0cmlidXRlID0gZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uIHx8IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5ub3JtYWwgfHwgZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLmNvbG9yO1xyXG5cdFx0XHRjb25zdCBtb3JwaFRhcmdldHNDb3VudCA9ICggbW9ycGhBdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApID8gbW9ycGhBdHRyaWJ1dGUubGVuZ3RoIDogMDtcclxuXHJcblx0XHRcdGNvbnN0IG1hdGVyaWFsUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCBtYXRlcmlhbCApO1xyXG5cdFx0XHRjb25zdCBsaWdodHMgPSBjdXJyZW50UmVuZGVyU3RhdGUuc3RhdGUubGlnaHRzO1xyXG5cclxuXHRcdFx0aWYgKCBfY2xpcHBpbmdFbmFibGVkID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIF9sb2NhbENsaXBwaW5nRW5hYmxlZCA9PT0gdHJ1ZSB8fCBjYW1lcmEgIT09IF9jdXJyZW50Q2FtZXJhICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHVzZUNhY2hlID1cclxuXHRcdFx0XHRcdFx0Y2FtZXJhID09PSBfY3VycmVudENhbWVyYSAmJlxyXG5cdFx0XHRcdFx0XHRtYXRlcmlhbC5pZCA9PT0gX2N1cnJlbnRNYXRlcmlhbElkO1xyXG5cclxuXHRcdFx0XHRcdC8vIHdlIG1pZ2h0IHdhbnQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggc29tZSBDbGlwcGluZ0dyb3VwXHJcblx0XHRcdFx0XHQvLyBvYmplY3QgaW5zdGVhZCBvZiB0aGUgbWF0ZXJpYWwsIG9uY2UgaXQgYmVjb21lcyBmZWFzaWJsZVxyXG5cdFx0XHRcdFx0Ly8gKCM4NDY1LCAjODM3OSlcclxuXHRcdFx0XHRcdGNsaXBwaW5nLnNldFN0YXRlKCBtYXRlcmlhbCwgY2FtZXJhLCB1c2VDYWNoZSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvL1xyXG5cclxuXHRcdFx0bGV0IG5lZWRzUHJvZ3JhbUNoYW5nZSA9IGZhbHNlO1xyXG5cclxuXHRcdFx0aWYgKCBtYXRlcmlhbC52ZXJzaW9uID09PSBtYXRlcmlhbFByb3BlcnRpZXMuX192ZXJzaW9uICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIG1hdGVyaWFsUHJvcGVydGllcy5uZWVkc0xpZ2h0cyAmJiAoIG1hdGVyaWFsUHJvcGVydGllcy5saWdodHNTdGF0ZVZlcnNpb24gIT09IGxpZ2h0cy5zdGF0ZS52ZXJzaW9uICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0bmVlZHNQcm9ncmFtQ2hhbmdlID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWxQcm9wZXJ0aWVzLm91dHB1dENvbG9yU3BhY2UgIT09IGNvbG9yU3BhY2UgKSB7XHJcblxyXG5cdFx0XHRcdFx0bmVlZHNQcm9ncmFtQ2hhbmdlID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzQmF0Y2hlZE1lc2ggJiYgbWF0ZXJpYWxQcm9wZXJ0aWVzLmJhdGNoaW5nID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdFx0XHRuZWVkc1Byb2dyYW1DaGFuZ2UgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCAhIG9iamVjdC5pc0JhdGNoZWRNZXNoICYmIG1hdGVyaWFsUHJvcGVydGllcy5iYXRjaGluZyA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0XHRuZWVkc1Byb2dyYW1DaGFuZ2UgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCBvYmplY3QuaXNCYXRjaGVkTWVzaCAmJiBtYXRlcmlhbFByb3BlcnRpZXMuYmF0Y2hpbmdDb2xvciA9PT0gdHJ1ZSAmJiBvYmplY3QuY29sb3JUZXh0dXJlID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRcdG5lZWRzUHJvZ3JhbUNoYW5nZSA9IHRydWU7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc0JhdGNoZWRNZXNoICYmIG1hdGVyaWFsUHJvcGVydGllcy5iYXRjaGluZ0NvbG9yID09PSBmYWxzZSAmJiBvYmplY3QuY29sb3JUZXh0dXJlICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRcdG5lZWRzUHJvZ3JhbUNoYW5nZSA9IHRydWU7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc0luc3RhbmNlZE1lc2ggJiYgbWF0ZXJpYWxQcm9wZXJ0aWVzLmluc3RhbmNpbmcgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0XHRcdG5lZWRzUHJvZ3JhbUNoYW5nZSA9IHRydWU7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoICEgb2JqZWN0LmlzSW5zdGFuY2VkTWVzaCAmJiBtYXRlcmlhbFByb3BlcnRpZXMuaW5zdGFuY2luZyA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0XHRuZWVkc1Byb2dyYW1DaGFuZ2UgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCBvYmplY3QuaXNTa2lubmVkTWVzaCAmJiBtYXRlcmlhbFByb3BlcnRpZXMuc2tpbm5pbmcgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0XHRcdG5lZWRzUHJvZ3JhbUNoYW5nZSA9IHRydWU7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoICEgb2JqZWN0LmlzU2tpbm5lZE1lc2ggJiYgbWF0ZXJpYWxQcm9wZXJ0aWVzLnNraW5uaW5nID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRcdG5lZWRzUHJvZ3JhbUNoYW5nZSA9IHRydWU7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc0luc3RhbmNlZE1lc2ggJiYgbWF0ZXJpYWxQcm9wZXJ0aWVzLmluc3RhbmNpbmdDb2xvciA9PT0gdHJ1ZSAmJiBvYmplY3QuaW5zdGFuY2VDb2xvciA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHRuZWVkc1Byb2dyYW1DaGFuZ2UgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCBvYmplY3QuaXNJbnN0YW5jZWRNZXNoICYmIG1hdGVyaWFsUHJvcGVydGllcy5pbnN0YW5jaW5nQ29sb3IgPT09IGZhbHNlICYmIG9iamVjdC5pbnN0YW5jZUNvbG9yICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRcdG5lZWRzUHJvZ3JhbUNoYW5nZSA9IHRydWU7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc0luc3RhbmNlZE1lc2ggJiYgbWF0ZXJpYWxQcm9wZXJ0aWVzLmluc3RhbmNpbmdNb3JwaCA9PT0gdHJ1ZSAmJiBvYmplY3QubW9ycGhUZXh0dXJlID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRcdG5lZWRzUHJvZ3JhbUNoYW5nZSA9IHRydWU7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc0luc3RhbmNlZE1lc2ggJiYgbWF0ZXJpYWxQcm9wZXJ0aWVzLmluc3RhbmNpbmdNb3JwaCA9PT0gZmFsc2UgJiYgb2JqZWN0Lm1vcnBoVGV4dHVyZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHRuZWVkc1Byb2dyYW1DaGFuZ2UgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbFByb3BlcnRpZXMuZW52TWFwICE9PSBlbnZNYXAgKSB7XHJcblxyXG5cdFx0XHRcdFx0bmVlZHNQcm9ncmFtQ2hhbmdlID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuZm9nID09PSB0cnVlICYmIG1hdGVyaWFsUHJvcGVydGllcy5mb2cgIT09IGZvZyApIHtcclxuXHJcblx0XHRcdFx0XHRuZWVkc1Byb2dyYW1DaGFuZ2UgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbFByb3BlcnRpZXMubnVtQ2xpcHBpbmdQbGFuZXMgIT09IHVuZGVmaW5lZCAmJlxyXG5cdFx0XHRcdFx0KCBtYXRlcmlhbFByb3BlcnRpZXMubnVtQ2xpcHBpbmdQbGFuZXMgIT09IGNsaXBwaW5nLm51bVBsYW5lcyB8fFxyXG5cdFx0XHRcdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLm51bUludGVyc2VjdGlvbiAhPT0gY2xpcHBpbmcubnVtSW50ZXJzZWN0aW9uICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0bmVlZHNQcm9ncmFtQ2hhbmdlID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWxQcm9wZXJ0aWVzLnZlcnRleEFscGhhcyAhPT0gdmVydGV4QWxwaGFzICkge1xyXG5cclxuXHRcdFx0XHRcdG5lZWRzUHJvZ3JhbUNoYW5nZSA9IHRydWU7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsUHJvcGVydGllcy52ZXJ0ZXhUYW5nZW50cyAhPT0gdmVydGV4VGFuZ2VudHMgKSB7XHJcblxyXG5cdFx0XHRcdFx0bmVlZHNQcm9ncmFtQ2hhbmdlID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWxQcm9wZXJ0aWVzLm1vcnBoVGFyZ2V0cyAhPT0gbW9ycGhUYXJnZXRzICkge1xyXG5cclxuXHRcdFx0XHRcdG5lZWRzUHJvZ3JhbUNoYW5nZSA9IHRydWU7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsUHJvcGVydGllcy5tb3JwaE5vcm1hbHMgIT09IG1vcnBoTm9ybWFscyApIHtcclxuXHJcblx0XHRcdFx0XHRuZWVkc1Byb2dyYW1DaGFuZ2UgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbFByb3BlcnRpZXMubW9ycGhDb2xvcnMgIT09IG1vcnBoQ29sb3JzICkge1xyXG5cclxuXHRcdFx0XHRcdG5lZWRzUHJvZ3JhbUNoYW5nZSA9IHRydWU7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsUHJvcGVydGllcy50b25lTWFwcGluZyAhPT0gdG9uZU1hcHBpbmcgKSB7XHJcblxyXG5cdFx0XHRcdFx0bmVlZHNQcm9ncmFtQ2hhbmdlID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWxQcm9wZXJ0aWVzLm1vcnBoVGFyZ2V0c0NvdW50ICE9PSBtb3JwaFRhcmdldHNDb3VudCApIHtcclxuXHJcblx0XHRcdFx0XHRuZWVkc1Byb2dyYW1DaGFuZ2UgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRuZWVkc1Byb2dyYW1DaGFuZ2UgPSB0cnVlO1xyXG5cdFx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy5fX3ZlcnNpb24gPSBtYXRlcmlhbC52ZXJzaW9uO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly9cclxuXHJcblx0XHRcdGxldCBwcm9ncmFtID0gbWF0ZXJpYWxQcm9wZXJ0aWVzLmN1cnJlbnRQcm9ncmFtO1xyXG5cclxuXHRcdFx0aWYgKCBuZWVkc1Byb2dyYW1DaGFuZ2UgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdHByb2dyYW0gPSBnZXRQcm9ncmFtKCBtYXRlcmlhbCwgc2NlbmUsIG9iamVjdCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0bGV0IHJlZnJlc2hQcm9ncmFtID0gZmFsc2U7XHJcblx0XHRcdGxldCByZWZyZXNoTWF0ZXJpYWwgPSBmYWxzZTtcclxuXHRcdFx0bGV0IHJlZnJlc2hMaWdodHMgPSBmYWxzZTtcclxuXHJcblx0XHRcdGNvbnN0IHBfdW5pZm9ybXMgPSBwcm9ncmFtLmdldFVuaWZvcm1zKCksXHJcblx0XHRcdFx0bV91bmlmb3JtcyA9IG1hdGVyaWFsUHJvcGVydGllcy51bmlmb3JtcztcclxuXHJcblx0XHRcdGlmICggc3RhdGUudXNlUHJvZ3JhbSggcHJvZ3JhbS5wcm9ncmFtICkgKSB7XHJcblxyXG5cdFx0XHRcdHJlZnJlc2hQcm9ncmFtID0gdHJ1ZTtcclxuXHRcdFx0XHRyZWZyZXNoTWF0ZXJpYWwgPSB0cnVlO1xyXG5cdFx0XHRcdHJlZnJlc2hMaWdodHMgPSB0cnVlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBtYXRlcmlhbC5pZCAhPT0gX2N1cnJlbnRNYXRlcmlhbElkICkge1xyXG5cclxuXHRcdFx0XHRfY3VycmVudE1hdGVyaWFsSWQgPSBtYXRlcmlhbC5pZDtcclxuXHJcblx0XHRcdFx0cmVmcmVzaE1hdGVyaWFsID0gdHJ1ZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggcmVmcmVzaFByb2dyYW0gfHwgX2N1cnJlbnRDYW1lcmEgIT09IGNhbWVyYSApIHtcclxuXHJcblx0XHRcdFx0Ly8gY29tbW9uIGNhbWVyYSB1bmlmb3Jtc1xyXG5cclxuXHRcdFx0XHRjb25zdCByZXZlcnNlRGVwdGhCdWZmZXIgPSBzdGF0ZS5idWZmZXJzLmRlcHRoLmdldFJldmVyc2VkKCk7XHJcblxyXG5cdFx0XHRcdGlmICggcmV2ZXJzZURlcHRoQnVmZmVyICkge1xyXG5cclxuXHRcdFx0XHRcdF9jdXJyZW50UHJvamVjdGlvbk1hdHJpeC5jb3B5KCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeCApO1xyXG5cclxuXHRcdFx0XHRcdHRvTm9ybWFsaXplZFByb2plY3Rpb25NYXRyaXgoIF9jdXJyZW50UHJvamVjdGlvbk1hdHJpeCApO1xyXG5cdFx0XHRcdFx0dG9SZXZlcnNlZFByb2plY3Rpb25NYXRyaXgoIF9jdXJyZW50UHJvamVjdGlvbk1hdHJpeCApO1xyXG5cclxuXHRcdFx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ3Byb2plY3Rpb25NYXRyaXgnLCBfY3VycmVudFByb2plY3Rpb25NYXRyaXggKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdwcm9qZWN0aW9uTWF0cml4JywgY2FtZXJhLnByb2plY3Rpb25NYXRyaXggKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICd2aWV3TWF0cml4JywgY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSApO1xyXG5cclxuXHRcdFx0XHRjb25zdCB1Q2FtUG9zID0gcF91bmlmb3Jtcy5tYXAuY2FtZXJhUG9zaXRpb247XHJcblxyXG5cdFx0XHRcdGlmICggdUNhbVBvcyAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdHVDYW1Qb3Muc2V0VmFsdWUoIF9nbCwgX3ZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBjYW1lcmEubWF0cml4V29ybGQgKSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICggY2FwYWJpbGl0aWVzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIgKSB7XHJcblxyXG5cdFx0XHRcdFx0cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAnbG9nRGVwdGhCdWZGQycsXHJcblx0XHRcdFx0XHRcdDIuMCAvICggTWF0aC5sb2coIGNhbWVyYS5mYXIgKyAxLjAgKSAvIE1hdGguTE4yICkgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyBjb25zaWRlciBtb3ZpbmcgaXNPcnRob2dyYXBoaWMgdG8gVW5pZm9ybUxpYiBhbmQgV2ViR0xNYXRlcmlhbHMsIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbXJkb29iL3RocmVlLmpzL3B1bGwvMjY0NjcjaXNzdWVjb21tZW50LTE2NDUxODUwNjdcclxuXHJcblx0XHRcdFx0aWYgKCBtYXRlcmlhbC5pc01lc2hQaG9uZ01hdGVyaWFsIHx8XHJcblx0XHRcdFx0XHRtYXRlcmlhbC5pc01lc2hUb29uTWF0ZXJpYWwgfHxcclxuXHRcdFx0XHRcdG1hdGVyaWFsLmlzTWVzaExhbWJlcnRNYXRlcmlhbCB8fFxyXG5cdFx0XHRcdFx0bWF0ZXJpYWwuaXNNZXNoQmFzaWNNYXRlcmlhbCB8fFxyXG5cdFx0XHRcdFx0bWF0ZXJpYWwuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCB8fFxyXG5cdFx0XHRcdFx0bWF0ZXJpYWwuaXNTaGFkZXJNYXRlcmlhbCApIHtcclxuXHJcblx0XHRcdFx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdpc09ydGhvZ3JhcGhpYycsIGNhbWVyYS5pc09ydGhvZ3JhcGhpY0NhbWVyYSA9PT0gdHJ1ZSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICggX2N1cnJlbnRDYW1lcmEgIT09IGNhbWVyYSApIHtcclxuXHJcblx0XHRcdFx0XHRfY3VycmVudENhbWVyYSA9IGNhbWVyYTtcclxuXHJcblx0XHRcdFx0XHQvLyBsaWdodGluZyB1bmlmb3JtcyBkZXBlbmQgb24gdGhlIGNhbWVyYSBzbyBlbmZvcmNlIGFuIHVwZGF0ZVxyXG5cdFx0XHRcdFx0Ly8gbm93LCBpbiBjYXNlIHRoaXMgbWF0ZXJpYWwgc3VwcG9ydHMgbGlnaHRzIC0gb3IgbGF0ZXIsIHdoZW5cclxuXHRcdFx0XHRcdC8vIHRoZSBuZXh0IG1hdGVyaWFsIHRoYXQgZG9lcyBnZXRzIGFjdGl2YXRlZDpcclxuXHJcblx0XHRcdFx0XHRyZWZyZXNoTWF0ZXJpYWwgPSB0cnVlO1x0XHQvLyBzZXQgdG8gdHJ1ZSBvbiBtYXRlcmlhbCBjaGFuZ2VcclxuXHRcdFx0XHRcdHJlZnJlc2hMaWdodHMgPSB0cnVlO1x0XHQvLyByZW1haW5zIHNldCB1bnRpbCB1cGRhdGUgZG9uZVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBza2lubmluZyBhbmQgbW9ycGggdGFyZ2V0IHVuaWZvcm1zIG11c3QgYmUgc2V0IGV2ZW4gaWYgbWF0ZXJpYWwgZGlkbid0IGNoYW5nZVxyXG5cdFx0XHQvLyBhdXRvLXNldHRpbmcgb2YgdGV4dHVyZSB1bml0IGZvciBib25lIGFuZCBtb3JwaCB0ZXh0dXJlIG11c3QgZ28gYmVmb3JlIG90aGVyIHRleHR1cmVzXHJcblx0XHRcdC8vIG90aGVyd2lzZSB0ZXh0dXJlcyB1c2VkIGZvciBza2lubmluZyBhbmQgbW9ycGhpbmcgY2FuIHRha2Ugb3ZlciB0ZXh0dXJlIHVuaXRzIHJlc2VydmVkIGZvciBvdGhlciBtYXRlcmlhbCB0ZXh0dXJlc1xyXG5cclxuXHRcdFx0aWYgKCBvYmplY3QuaXNTa2lubmVkTWVzaCApIHtcclxuXHJcblx0XHRcdFx0cF91bmlmb3Jtcy5zZXRPcHRpb25hbCggX2dsLCBvYmplY3QsICdiaW5kTWF0cml4JyApO1xyXG5cdFx0XHRcdHBfdW5pZm9ybXMuc2V0T3B0aW9uYWwoIF9nbCwgb2JqZWN0LCAnYmluZE1hdHJpeEludmVyc2UnICk7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHNrZWxldG9uID0gb2JqZWN0LnNrZWxldG9uO1xyXG5cclxuXHRcdFx0XHRpZiAoIHNrZWxldG9uICkge1xyXG5cclxuXHRcdFx0XHRcdGlmICggc2tlbGV0b24uYm9uZVRleHR1cmUgPT09IG51bGwgKSBza2VsZXRvbi5jb21wdXRlQm9uZVRleHR1cmUoKTtcclxuXHJcblx0XHRcdFx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdib25lVGV4dHVyZScsIHNrZWxldG9uLmJvbmVUZXh0dXJlLCB0ZXh0dXJlcyApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIG9iamVjdC5pc0JhdGNoZWRNZXNoICkge1xyXG5cclxuXHRcdFx0XHRwX3VuaWZvcm1zLnNldE9wdGlvbmFsKCBfZ2wsIG9iamVjdCwgJ2JhdGNoaW5nVGV4dHVyZScgKTtcclxuXHRcdFx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdiYXRjaGluZ1RleHR1cmUnLCBvYmplY3QuX21hdHJpY2VzVGV4dHVyZSwgdGV4dHVyZXMgKTtcclxuXHJcblx0XHRcdFx0cF91bmlmb3Jtcy5zZXRPcHRpb25hbCggX2dsLCBvYmplY3QsICdiYXRjaGluZ0lkVGV4dHVyZScgKTtcclxuXHRcdFx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdiYXRjaGluZ0lkVGV4dHVyZScsIG9iamVjdC5faW5kaXJlY3RUZXh0dXJlLCB0ZXh0dXJlcyApO1xyXG5cclxuXHRcdFx0XHRwX3VuaWZvcm1zLnNldE9wdGlvbmFsKCBfZ2wsIG9iamVjdCwgJ2JhdGNoaW5nQ29sb3JUZXh0dXJlJyApO1xyXG5cdFx0XHRcdGlmICggb2JqZWN0Ll9jb2xvcnNUZXh0dXJlICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ2JhdGNoaW5nQ29sb3JUZXh0dXJlJywgb2JqZWN0Ll9jb2xvcnNUZXh0dXJlLCB0ZXh0dXJlcyApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBtb3JwaEF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXM7XHJcblxyXG5cdFx0XHRpZiAoIG1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbiAhPT0gdW5kZWZpbmVkIHx8IG1vcnBoQXR0cmlidXRlcy5ub3JtYWwgIT09IHVuZGVmaW5lZCB8fCAoIG1vcnBoQXR0cmlidXRlcy5jb2xvciAhPT0gdW5kZWZpbmVkICkgKSB7XHJcblxyXG5cdFx0XHRcdG1vcnBodGFyZ2V0cy51cGRhdGUoIG9iamVjdCwgZ2VvbWV0cnksIHByb2dyYW0gKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggcmVmcmVzaE1hdGVyaWFsIHx8IG1hdGVyaWFsUHJvcGVydGllcy5yZWNlaXZlU2hhZG93ICE9PSBvYmplY3QucmVjZWl2ZVNoYWRvdyApIHtcclxuXHJcblx0XHRcdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLnJlY2VpdmVTaGFkb3cgPSBvYmplY3QucmVjZWl2ZVNoYWRvdztcclxuXHRcdFx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdyZWNlaXZlU2hhZG93Jywgb2JqZWN0LnJlY2VpdmVTaGFkb3cgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tcmRvb2IvdGhyZWUuanMvcHVsbC8yNDQ2NyNpc3N1ZWNvbW1lbnQtMTIwOTAzMTUxMlxyXG5cclxuXHRcdFx0aWYgKCBtYXRlcmlhbC5pc01lc2hHb3VyYXVkTWF0ZXJpYWwgJiYgbWF0ZXJpYWwuZW52TWFwICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRtX3VuaWZvcm1zLmVudk1hcC52YWx1ZSA9IGVudk1hcDtcclxuXHJcblx0XHRcdFx0bV91bmlmb3Jtcy5mbGlwRW52TWFwLnZhbHVlID0gKCBlbnZNYXAuaXNDdWJlVGV4dHVyZSAmJiBlbnZNYXAuaXNSZW5kZXJUYXJnZXRUZXh0dXJlID09PSBmYWxzZSApID8gLSAxIDogMTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWwuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCAmJiBtYXRlcmlhbC5lbnZNYXAgPT09IG51bGwgJiYgc2NlbmUuZW52aXJvbm1lbnQgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdG1fdW5pZm9ybXMuZW52TWFwSW50ZW5zaXR5LnZhbHVlID0gc2NlbmUuZW52aXJvbm1lbnRJbnRlbnNpdHk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHJlZnJlc2hNYXRlcmlhbCApIHtcclxuXHJcblx0XHRcdFx0cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAndG9uZU1hcHBpbmdFeHBvc3VyZScsIF90aGlzLnRvbmVNYXBwaW5nRXhwb3N1cmUgKTtcclxuXHJcblx0XHRcdFx0aWYgKCBtYXRlcmlhbFByb3BlcnRpZXMubmVlZHNMaWdodHMgKSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gdGhlIGN1cnJlbnQgbWF0ZXJpYWwgcmVxdWlyZXMgbGlnaHRpbmcgaW5mb1xyXG5cclxuXHRcdFx0XHRcdC8vIG5vdGU6IGFsbCBsaWdodGluZyB1bmlmb3JtcyBhcmUgYWx3YXlzIHNldCBjb3JyZWN0bHlcclxuXHRcdFx0XHRcdC8vIHRoZXkgc2ltcGx5IHJlZmVyZW5jZSB0aGUgcmVuZGVyZXIncyBzdGF0ZSBmb3IgdGhlaXJcclxuXHRcdFx0XHRcdC8vIHZhbHVlc1xyXG5cdFx0XHRcdFx0Ly9cclxuXHRcdFx0XHRcdC8vIHVzZSB0aGUgY3VycmVudCBtYXRlcmlhbCdzIC5uZWVkc1VwZGF0ZSBmbGFncyB0byBzZXRcclxuXHRcdFx0XHRcdC8vIHRoZSBHTCBzdGF0ZSB3aGVuIHJlcXVpcmVkXHJcblxyXG5cdFx0XHRcdFx0bWFya1VuaWZvcm1zTGlnaHRzTmVlZHNVcGRhdGUoIG1fdW5pZm9ybXMsIHJlZnJlc2hMaWdodHMgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyByZWZyZXNoIHVuaWZvcm1zIGNvbW1vbiB0byBzZXZlcmFsIG1hdGVyaWFsc1xyXG5cclxuXHRcdFx0XHRpZiAoIGZvZyAmJiBtYXRlcmlhbC5mb2cgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0bWF0ZXJpYWxzLnJlZnJlc2hGb2dVbmlmb3JtcyggbV91bmlmb3JtcywgZm9nICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0bWF0ZXJpYWxzLnJlZnJlc2hNYXRlcmlhbFVuaWZvcm1zKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCwgX3BpeGVsUmF0aW8sIF9oZWlnaHQsIGN1cnJlbnRSZW5kZXJTdGF0ZS5zdGF0ZS50cmFuc21pc3Npb25SZW5kZXJUYXJnZXRbIGNhbWVyYS5pZCBdICk7XHJcblxyXG5cdFx0XHRcdFdlYkdMVW5pZm9ybXMudXBsb2FkKCBfZ2wsIGdldFVuaWZvcm1MaXN0KCBtYXRlcmlhbFByb3BlcnRpZXMgKSwgbV91bmlmb3JtcywgdGV4dHVyZXMgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWwuaXNTaGFkZXJNYXRlcmlhbCAmJiBtYXRlcmlhbC51bmlmb3Jtc05lZWRVcGRhdGUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFdlYkdMVW5pZm9ybXMudXBsb2FkKCBfZ2wsIGdldFVuaWZvcm1MaXN0KCBtYXRlcmlhbFByb3BlcnRpZXMgKSwgbV91bmlmb3JtcywgdGV4dHVyZXMgKTtcclxuXHRcdFx0XHRtYXRlcmlhbC51bmlmb3Jtc05lZWRVcGRhdGUgPSBmYWxzZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWwuaXNTcHJpdGVNYXRlcmlhbCApIHtcclxuXHJcblx0XHRcdFx0cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAnY2VudGVyJywgb2JqZWN0LmNlbnRlciApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gY29tbW9uIG1hdHJpY2VzXHJcblxyXG5cdFx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdtb2RlbFZpZXdNYXRyaXgnLCBvYmplY3QubW9kZWxWaWV3TWF0cml4ICk7XHJcblx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ25vcm1hbE1hdHJpeCcsIG9iamVjdC5ub3JtYWxNYXRyaXggKTtcclxuXHRcdFx0cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAnbW9kZWxNYXRyaXgnLCBvYmplY3QubWF0cml4V29ybGQgKTtcclxuXHJcblx0XHRcdC8vIFVCT3NcclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWwuaXNTaGFkZXJNYXRlcmlhbCB8fCBtYXRlcmlhbC5pc1Jhd1NoYWRlck1hdGVyaWFsICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBncm91cHMgPSBtYXRlcmlhbC51bmlmb3Jtc0dyb3VwcztcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gZ3JvdXBzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgZ3JvdXAgPSBncm91cHNbIGkgXTtcclxuXHJcblx0XHRcdFx0XHR1bmlmb3Jtc0dyb3Vwcy51cGRhdGUoIGdyb3VwLCBwcm9ncmFtICk7XHJcblx0XHRcdFx0XHR1bmlmb3Jtc0dyb3Vwcy5iaW5kKCBncm91cCwgcHJvZ3JhbSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gcHJvZ3JhbTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gSWYgdW5pZm9ybXMgYXJlIG1hcmtlZCBhcyBjbGVhbiwgdGhleSBkb24ndCBuZWVkIHRvIGJlIGxvYWRlZCB0byB0aGUgR1BVLlxyXG5cclxuXHRcdGZ1bmN0aW9uIG1hcmtVbmlmb3Jtc0xpZ2h0c05lZWRzVXBkYXRlKCB1bmlmb3JtcywgdmFsdWUgKSB7XHJcblxyXG5cdFx0XHR1bmlmb3Jtcy5hbWJpZW50TGlnaHRDb2xvci5uZWVkc1VwZGF0ZSA9IHZhbHVlO1xyXG5cdFx0XHR1bmlmb3Jtcy5saWdodFByb2JlLm5lZWRzVXBkYXRlID0gdmFsdWU7XHJcblxyXG5cdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb25hbExpZ2h0cy5uZWVkc1VwZGF0ZSA9IHZhbHVlO1xyXG5cdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb25hbExpZ2h0U2hhZG93cy5uZWVkc1VwZGF0ZSA9IHZhbHVlO1xyXG5cdFx0XHR1bmlmb3Jtcy5wb2ludExpZ2h0cy5uZWVkc1VwZGF0ZSA9IHZhbHVlO1xyXG5cdFx0XHR1bmlmb3Jtcy5wb2ludExpZ2h0U2hhZG93cy5uZWVkc1VwZGF0ZSA9IHZhbHVlO1xyXG5cdFx0XHR1bmlmb3Jtcy5zcG90TGlnaHRzLm5lZWRzVXBkYXRlID0gdmFsdWU7XHJcblx0XHRcdHVuaWZvcm1zLnNwb3RMaWdodFNoYWRvd3MubmVlZHNVcGRhdGUgPSB2YWx1ZTtcclxuXHRcdFx0dW5pZm9ybXMucmVjdEFyZWFMaWdodHMubmVlZHNVcGRhdGUgPSB2YWx1ZTtcclxuXHRcdFx0dW5pZm9ybXMuaGVtaXNwaGVyZUxpZ2h0cy5uZWVkc1VwZGF0ZSA9IHZhbHVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiBtYXRlcmlhbE5lZWRzTGlnaHRzKCBtYXRlcmlhbCApIHtcclxuXHJcblx0XHRcdHJldHVybiBtYXRlcmlhbC5pc01lc2hMYW1iZXJ0TWF0ZXJpYWwgfHwgbWF0ZXJpYWwuaXNNZXNoVG9vbk1hdGVyaWFsIHx8IG1hdGVyaWFsLmlzTWVzaFBob25nTWF0ZXJpYWwgfHxcclxuXHRcdFx0XHRtYXRlcmlhbC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsIHx8IG1hdGVyaWFsLmlzU2hhZG93TWF0ZXJpYWwgfHxcclxuXHRcdFx0XHQoIG1hdGVyaWFsLmlzU2hhZGVyTWF0ZXJpYWwgJiYgbWF0ZXJpYWwubGlnaHRzID09PSB0cnVlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmV0dXJucyB0aGUgYWN0aXZlIGN1YmUgZmFjZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBhY3RpdmUgY3ViZSBmYWNlLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdldEFjdGl2ZUN1YmVGYWNlID0gZnVuY3Rpb24gKCkge1xyXG5cclxuXHRcdFx0cmV0dXJuIF9jdXJyZW50QWN0aXZlQ3ViZUZhY2U7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJldHVybnMgdGhlIGFjdGl2ZSBtaXBtYXAgbGV2ZWwuXHJcblx0XHQgKlxyXG5cdFx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgYWN0aXZlIG1pcG1hcCBsZXZlbC5cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nZXRBY3RpdmVNaXBtYXBMZXZlbCA9IGZ1bmN0aW9uICgpIHtcclxuXHJcblx0XHRcdHJldHVybiBfY3VycmVudEFjdGl2ZU1pcG1hcExldmVsO1xyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXR1cm5zIHRoZSBhY3RpdmUgcmVuZGVyIHRhcmdldC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcmV0dXJuIHs/V2ViR0xSZW5kZXJUYXJnZXR9IFRoZSBhY3RpdmUgcmVuZGVyIHRhcmdldC4gUmV0dXJucyBgbnVsbGAgaWYgbm8gcmVuZGVyIHRhcmdldFxyXG5cdFx0ICogaXMgY3VycmVudGx5IHNldC5cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nZXRSZW5kZXJUYXJnZXQgPSBmdW5jdGlvbiAoKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gX2N1cnJlbnRSZW5kZXJUYXJnZXQ7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHR0aGlzLnNldFJlbmRlclRhcmdldFRleHR1cmVzID0gZnVuY3Rpb24gKCByZW5kZXJUYXJnZXQsIGNvbG9yVGV4dHVyZSwgZGVwdGhUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0Y29uc3QgcmVuZGVyVGFyZ2V0UHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQgKTtcclxuXHJcblx0XHRcdHJlbmRlclRhcmdldFByb3BlcnRpZXMuX19hdXRvQWxsb2NhdGVEZXB0aEJ1ZmZlciA9IHJlbmRlclRhcmdldC5yZXNvbHZlRGVwdGhCdWZmZXIgPT09IGZhbHNlO1xyXG5cdFx0XHRpZiAoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX19hdXRvQWxsb2NhdGVEZXB0aEJ1ZmZlciA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRcdC8vIFRoZSBtdWx0aXNhbXBsZV9yZW5kZXJfdG9fdGV4dHVyZSBleHRlbnNpb24gZG9lc24ndCB3b3JrIHByb3Blcmx5IGlmIHRoZXJlXHJcblx0XHRcdFx0Ly8gYXJlIG1pZGZyYW1lIGZsdXNoZXMgYW5kIGFuIGV4dGVybmFsIGRlcHRoIGJ1ZmZlci4gRGlzYWJsZSB1c2Ugb2YgdGhlIGV4dGVuc2lvbi5cclxuXHRcdFx0XHRyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fdXNlUmVuZGVyVG9UZXh0dXJlID0gZmFsc2U7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LnRleHR1cmUgKS5fX3dlYmdsVGV4dHVyZSA9IGNvbG9yVGV4dHVyZTtcclxuXHRcdFx0cHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUgKS5fX3dlYmdsVGV4dHVyZSA9IHJlbmRlclRhcmdldFByb3BlcnRpZXMuX19hdXRvQWxsb2NhdGVEZXB0aEJ1ZmZlciA/IHVuZGVmaW5lZCA6IGRlcHRoVGV4dHVyZTtcclxuXHJcblx0XHRcdHJlbmRlclRhcmdldFByb3BlcnRpZXMuX19oYXNFeHRlcm5hbFRleHR1cmVzID0gdHJ1ZTtcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdHRoaXMuc2V0UmVuZGVyVGFyZ2V0RnJhbWVidWZmZXIgPSBmdW5jdGlvbiAoIHJlbmRlclRhcmdldCwgZGVmYXVsdEZyYW1lYnVmZmVyICkge1xyXG5cclxuXHRcdFx0Y29uc3QgcmVuZGVyVGFyZ2V0UHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQgKTtcclxuXHRcdFx0cmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXIgPSBkZWZhdWx0RnJhbWVidWZmZXI7XHJcblx0XHRcdHJlbmRlclRhcmdldFByb3BlcnRpZXMuX191c2VEZWZhdWx0RnJhbWVidWZmZXIgPSBkZWZhdWx0RnJhbWVidWZmZXIgPT09IHVuZGVmaW5lZDtcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdGNvbnN0IF9zY3JhdGNoRnJhbWVCdWZmZXIgPSBfZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNldHMgdGhlIGFjdGl2ZSByZW5kZXJ0YXJnZXQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHs/V2ViR0xSZW5kZXJUYXJnZXR9IHJlbmRlclRhcmdldCAtIFRoZSByZW5kZXIgdGFyZ2V0IHRvIHNldC4gV2hlbiBgbnVsbGAgaXMgZ2l2ZW4sXHJcblx0XHQgKiB0aGUgY2FudmFzIGlzIHNldCBhcyB0aGUgYWN0aXZlIHJlbmRlciB0YXJnZXQgaW5zdGVhZC5cclxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyfSBbYWN0aXZlQ3ViZUZhY2U9MF0gLSBUaGUgYWN0aXZlIGN1YmUgZmFjZSB3aGVuIHVzaW5nIGEgY3ViZSByZW5kZXIgdGFyZ2V0LlxyXG5cdFx0ICogSW5kaWNhdGVzIHRoZSB6IGxheWVyIHRvIHJlbmRlciBpbiB0byB3aGVuIHVzaW5nIDNEIG9yIGFycmF5IHJlbmRlciB0YXJnZXRzLlxyXG5cdFx0ICogQHBhcmFtIHtudW1iZXJ9IFthY3RpdmVNaXBtYXBMZXZlbD0wXSAtIFRoZSBhY3RpdmUgbWlwbWFwIGxldmVsLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNldFJlbmRlclRhcmdldCA9IGZ1bmN0aW9uICggcmVuZGVyVGFyZ2V0LCBhY3RpdmVDdWJlRmFjZSA9IDAsIGFjdGl2ZU1pcG1hcExldmVsID0gMCApIHtcclxuXHJcblx0XHRcdF9jdXJyZW50UmVuZGVyVGFyZ2V0ID0gcmVuZGVyVGFyZ2V0O1xyXG5cdFx0XHRfY3VycmVudEFjdGl2ZUN1YmVGYWNlID0gYWN0aXZlQ3ViZUZhY2U7XHJcblx0XHRcdF9jdXJyZW50QWN0aXZlTWlwbWFwTGV2ZWwgPSBhY3RpdmVNaXBtYXBMZXZlbDtcclxuXHJcblx0XHRcdGxldCB1c2VEZWZhdWx0RnJhbWVidWZmZXIgPSB0cnVlO1xyXG5cdFx0XHRsZXQgZnJhbWVidWZmZXIgPSBudWxsO1xyXG5cdFx0XHRsZXQgaXNDdWJlID0gZmFsc2U7XHJcblx0XHRcdGxldCBpc1JlbmRlclRhcmdldDNEID0gZmFsc2U7XHJcblxyXG5cdFx0XHRpZiAoIHJlbmRlclRhcmdldCApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgcmVuZGVyVGFyZ2V0UHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQgKTtcclxuXHJcblx0XHRcdFx0aWYgKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fdXNlRGVmYXVsdEZyYW1lYnVmZmVyICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gV2UgbmVlZCB0byBtYWtlIHN1cmUgdG8gcmViaW5kIHRoZSBmcmFtZWJ1ZmZlci5cclxuXHRcdFx0XHRcdHN0YXRlLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBudWxsICk7XHJcblx0XHRcdFx0XHR1c2VEZWZhdWx0RnJhbWVidWZmZXIgPSBmYWxzZTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXIgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHR0ZXh0dXJlcy5zZXR1cFJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX19oYXNFeHRlcm5hbFRleHR1cmVzICkge1xyXG5cclxuXHRcdFx0XHRcdC8vIENvbG9yIGFuZCBkZXB0aCB0ZXh0dXJlIG11c3QgYmUgcmVib3VuZCBpbiBvcmRlciBmb3IgdGhlIHN3YXBjaGFpbiB0byB1cGRhdGUuXHJcblx0XHRcdFx0XHR0ZXh0dXJlcy5yZWJpbmRUZXh0dXJlcyggcmVuZGVyVGFyZ2V0LCBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LnRleHR1cmUgKS5fX3dlYmdsVGV4dHVyZSwgcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUgKS5fX3dlYmdsVGV4dHVyZSApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCByZW5kZXJUYXJnZXQuZGVwdGhCdWZmZXIgKSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gY2hlY2sgaWYgdGhlIGRlcHRoIHRleHR1cmUgaXMgYWxyZWFkeSBib3VuZCB0byB0aGUgZnJhbWUgYnVmZmVyIGFuZCB0aGF0IGl0J3MgYmVlbiBpbml0aWFsaXplZFxyXG5cdFx0XHRcdFx0Y29uc3QgZGVwdGhUZXh0dXJlID0gcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZTtcclxuXHRcdFx0XHRcdGlmICggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX2JvdW5kRGVwdGhUZXh0dXJlICE9PSBkZXB0aFRleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBjaGVjayBpZiB0aGUgZGVwdGggdGV4dHVyZSBpcyBjb21wYXRpYmxlXHJcblx0XHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0XHRkZXB0aFRleHR1cmUgIT09IG51bGwgJiZcclxuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0aWVzLmhhcyggZGVwdGhUZXh0dXJlICkgJiZcclxuXHRcdFx0XHRcdFx0XHQoIHJlbmRlclRhcmdldC53aWR0aCAhPT0gZGVwdGhUZXh0dXJlLmltYWdlLndpZHRoIHx8IHJlbmRlclRhcmdldC5oZWlnaHQgIT09IGRlcHRoVGV4dHVyZS5pbWFnZS5oZWlnaHQgKVxyXG5cdFx0XHRcdFx0XHQpIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnV2ViR0xSZW5kZXJUYXJnZXQ6IEF0dGFjaGVkIERlcHRoVGV4dHVyZSBpcyBpbml0aWFsaXplZCB0byB0aGUgaW5jb3JyZWN0IHNpemUuJyApO1xyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0Ly8gU3dhcCB0aGUgZGVwdGggYnVmZmVyIHRvIHRoZSBjdXJyZW50bHkgYXR0YWNoZWQgb25lXHJcblx0XHRcdFx0XHRcdHRleHR1cmVzLnNldHVwRGVwdGhSZW5kZXJidWZmZXIoIHJlbmRlclRhcmdldCApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRjb25zdCB0ZXh0dXJlID0gcmVuZGVyVGFyZ2V0LnRleHR1cmU7XHJcblxyXG5cdFx0XHRcdGlmICggdGV4dHVyZS5pc0RhdGEzRFRleHR1cmUgfHwgdGV4dHVyZS5pc0RhdGFBcnJheVRleHR1cmUgfHwgdGV4dHVyZS5pc0NvbXByZXNzZWRBcnJheVRleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRcdFx0aXNSZW5kZXJUYXJnZXQzRCA9IHRydWU7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Y29uc3QgX193ZWJnbEZyYW1lYnVmZmVyID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCApLl9fd2ViZ2xGcmFtZWJ1ZmZlcjtcclxuXHJcblx0XHRcdFx0aWYgKCByZW5kZXJUYXJnZXQuaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQgKSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBfX3dlYmdsRnJhbWVidWZmZXJbIGFjdGl2ZUN1YmVGYWNlIF0gKSApIHtcclxuXHJcblx0XHRcdFx0XHRcdGZyYW1lYnVmZmVyID0gX193ZWJnbEZyYW1lYnVmZmVyWyBhY3RpdmVDdWJlRmFjZSBdWyBhY3RpdmVNaXBtYXBMZXZlbCBdO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRmcmFtZWJ1ZmZlciA9IF9fd2ViZ2xGcmFtZWJ1ZmZlclsgYWN0aXZlQ3ViZUZhY2UgXTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aXNDdWJlID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggKCByZW5kZXJUYXJnZXQuc2FtcGxlcyA+IDAgKSAmJiB0ZXh0dXJlcy51c2VNdWx0aXNhbXBsZWRSVFQoIHJlbmRlclRhcmdldCApID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdFx0XHRmcmFtZWJ1ZmZlciA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQgKS5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXI7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBfX3dlYmdsRnJhbWVidWZmZXIgKSApIHtcclxuXHJcblx0XHRcdFx0XHRcdGZyYW1lYnVmZmVyID0gX193ZWJnbEZyYW1lYnVmZmVyWyBhY3RpdmVNaXBtYXBMZXZlbCBdO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRmcmFtZWJ1ZmZlciA9IF9fd2ViZ2xGcmFtZWJ1ZmZlcjtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0X2N1cnJlbnRWaWV3cG9ydC5jb3B5KCByZW5kZXJUYXJnZXQudmlld3BvcnQgKTtcclxuXHRcdFx0XHRfY3VycmVudFNjaXNzb3IuY29weSggcmVuZGVyVGFyZ2V0LnNjaXNzb3IgKTtcclxuXHRcdFx0XHRfY3VycmVudFNjaXNzb3JUZXN0ID0gcmVuZGVyVGFyZ2V0LnNjaXNzb3JUZXN0O1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0X2N1cnJlbnRWaWV3cG9ydC5jb3B5KCBfdmlld3BvcnQgKS5tdWx0aXBseVNjYWxhciggX3BpeGVsUmF0aW8gKS5mbG9vcigpO1xyXG5cdFx0XHRcdF9jdXJyZW50U2Npc3Nvci5jb3B5KCBfc2Npc3NvciApLm11bHRpcGx5U2NhbGFyKCBfcGl4ZWxSYXRpbyApLmZsb29yKCk7XHJcblx0XHRcdFx0X2N1cnJlbnRTY2lzc29yVGVzdCA9IF9zY2lzc29yVGVzdDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIFVzZSBhIHNjcmF0Y2ggZnJhbWUgYnVmZmVyIGlmIHJlbmRlcmluZyB0byBhIG1pcCBsZXZlbCB0byBhdm9pZCBkZXB0aCBidWZmZXJzXHJcblx0XHRcdC8vIGJlaW5nIGJvdW5kIHRoYXQgYXJlIGRpZmZlcmVudCBzaXplcy5cclxuXHRcdFx0aWYgKCBhY3RpdmVNaXBtYXBMZXZlbCAhPT0gMCApIHtcclxuXHJcblx0XHRcdFx0ZnJhbWVidWZmZXIgPSBfc2NyYXRjaEZyYW1lQnVmZmVyO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgZnJhbWVidWZmZXJCb3VuZCA9IHN0YXRlLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBmcmFtZWJ1ZmZlciApO1xyXG5cclxuXHRcdFx0aWYgKCBmcmFtZWJ1ZmZlckJvdW5kICYmIHVzZURlZmF1bHRGcmFtZWJ1ZmZlciApIHtcclxuXHJcblx0XHRcdFx0c3RhdGUuZHJhd0J1ZmZlcnMoIHJlbmRlclRhcmdldCwgZnJhbWVidWZmZXIgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHN0YXRlLnZpZXdwb3J0KCBfY3VycmVudFZpZXdwb3J0ICk7XHJcblx0XHRcdHN0YXRlLnNjaXNzb3IoIF9jdXJyZW50U2Npc3NvciApO1xyXG5cdFx0XHRzdGF0ZS5zZXRTY2lzc29yVGVzdCggX2N1cnJlbnRTY2lzc29yVGVzdCApO1xyXG5cclxuXHRcdFx0aWYgKCBpc0N1YmUgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldC50ZXh0dXJlICk7XHJcblx0XHRcdFx0X2dsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKCBfZ2wuRlJBTUVCVUZGRVIsIF9nbC5DT0xPUl9BVFRBQ0hNRU5UMCwgX2dsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCArIGFjdGl2ZUN1YmVGYWNlLCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSwgYWN0aXZlTWlwbWFwTGV2ZWwgKTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGlzUmVuZGVyVGFyZ2V0M0QgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldC50ZXh0dXJlICk7XHJcblx0XHRcdFx0Y29uc3QgbGF5ZXIgPSBhY3RpdmVDdWJlRmFjZTtcclxuXHRcdFx0XHRfZ2wuZnJhbWVidWZmZXJUZXh0dXJlTGF5ZXIoIF9nbC5GUkFNRUJVRkZFUiwgX2dsLkNPTE9SX0FUVEFDSE1FTlQwLCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSwgYWN0aXZlTWlwbWFwTGV2ZWwsIGxheWVyICk7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCByZW5kZXJUYXJnZXQgIT09IG51bGwgJiYgYWN0aXZlTWlwbWFwTGV2ZWwgIT09IDAgKSB7XHJcblxyXG5cdFx0XHRcdC8vIE9ubHkgYmluZCB0aGUgZnJhbWUgYnVmZmVyIGlmIHdlIGFyZSB1c2luZyBhIHNjcmF0Y2ggZnJhbWUgYnVmZmVyIHRvIHJlbmRlciB0byBhIG1pcG1hcC5cclxuXHRcdFx0XHQvLyBJZiB3ZSByZWJpbmQgdGhlIHRleHR1cmUgd2hlbiB1c2luZyBhIG11bHRpIHNhbXBsZSBidWZmZXIgdGhlbiBhbiBlcnJvciBhYm91dCBpbmNvbnNpc3RlbnQgc2FtcGxlcyB3aWxsIGJlIHRocm93bi5cclxuXHRcdFx0XHRjb25zdCB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQudGV4dHVyZSApO1xyXG5cdFx0XHRcdF9nbC5mcmFtZWJ1ZmZlclRleHR1cmUyRCggX2dsLkZSQU1FQlVGRkVSLCBfZ2wuQ09MT1JfQVRUQUNITUVOVDAsIF9nbC5URVhUVVJFXzJELCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSwgYWN0aXZlTWlwbWFwTGV2ZWwgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdF9jdXJyZW50TWF0ZXJpYWxJZCA9IC0gMTsgLy8gcmVzZXQgY3VycmVudCBtYXRlcmlhbCB0byBlbnN1cmUgY29ycmVjdCB1bmlmb3JtIGJpbmRpbmdzXHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlYWRzIHRoZSBwaXhlbCBkYXRhIGZyb20gdGhlIGdpdmVuIHJlbmRlciB0YXJnZXQgaW50byB0aGUgZ2l2ZW4gYnVmZmVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IHJlbmRlclRhcmdldCAtIFRoZSByZW5kZXIgdGFyZ2V0IHRvIHJlYWQgZnJvbS5cclxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGB4YCBjb29yZGluYXRlIG9mIHRoZSBjb3B5IHJlZ2lvbidzIG9yaWdpbi5cclxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIGB5YCBjb29yZGluYXRlIG9mIHRoZSBjb3B5IHJlZ2lvbidzIG9yaWdpbi5cclxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgY29weSByZWdpb24uXHJcblx0XHQgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgY29weSByZWdpb24uXHJcblx0XHQgKiBAcGFyYW0ge1R5cGVkQXJyYXl9IGJ1ZmZlciAtIFRoZSByZXN1bHQgYnVmZmVyLlxyXG5cdFx0ICogQHBhcmFtIHtudW1iZXJ9IFthY3RpdmVDdWJlRmFjZUluZGV4XSAtIFRoZSBhY3RpdmUgY3ViZSBmYWNlIGluZGV4LlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHMgPSBmdW5jdGlvbiAoIHJlbmRlclRhcmdldCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgYnVmZmVyLCBhY3RpdmVDdWJlRmFjZUluZGV4ICkge1xyXG5cclxuXHRcdFx0aWYgKCAhICggcmVuZGVyVGFyZ2V0ICYmIHJlbmRlclRhcmdldC5pc1dlYkdMUmVuZGVyVGFyZ2V0ICkgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlbmRlclRhcmdldCBpcyBub3QgVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQuJyApO1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGxldCBmcmFtZWJ1ZmZlciA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQgKS5fX3dlYmdsRnJhbWVidWZmZXI7XHJcblxyXG5cdFx0XHRpZiAoIHJlbmRlclRhcmdldC5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldCAmJiBhY3RpdmVDdWJlRmFjZUluZGV4ICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGZyYW1lYnVmZmVyID0gZnJhbWVidWZmZXJbIGFjdGl2ZUN1YmVGYWNlSW5kZXggXTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggZnJhbWVidWZmZXIgKSB7XHJcblxyXG5cdFx0XHRcdHN0YXRlLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBmcmFtZWJ1ZmZlciApO1xyXG5cclxuXHRcdFx0XHR0cnkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHRleHR1cmUgPSByZW5kZXJUYXJnZXQudGV4dHVyZTtcclxuXHRcdFx0XHRcdGNvbnN0IHRleHR1cmVGb3JtYXQgPSB0ZXh0dXJlLmZvcm1hdDtcclxuXHRcdFx0XHRcdGNvbnN0IHRleHR1cmVUeXBlID0gdGV4dHVyZS50eXBlO1xyXG5cclxuXHRcdFx0XHRcdGlmICggISBjYXBhYmlsaXRpZXMudGV4dHVyZUZvcm1hdFJlYWRhYmxlKCB0ZXh0dXJlRm9ybWF0ICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZW5kZXJUYXJnZXQgaXMgbm90IGluIFJHQkEgb3IgaW1wbGVtZW50YXRpb24gZGVmaW5lZCBmb3JtYXQuJyApO1xyXG5cdFx0XHRcdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGlmICggISBjYXBhYmlsaXRpZXMudGV4dHVyZVR5cGVSZWFkYWJsZSggdGV4dHVyZVR5cGUgKSApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlbmRlclRhcmdldCBpcyBub3QgaW4gVW5zaWduZWRCeXRlVHlwZSBvciBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIHR5cGUuJyApO1xyXG5cdFx0XHRcdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8vIHRoZSBmb2xsb3dpbmcgaWYgc3RhdGVtZW50IGVuc3VyZXMgdmFsaWQgcmVhZCByZXF1ZXN0cyAobm8gb3V0LW9mLWJvdW5kcyBwaXhlbHMsIHNlZSAjODYwNClcclxuXHJcblx0XHRcdFx0XHRpZiAoICggeCA+PSAwICYmIHggPD0gKCByZW5kZXJUYXJnZXQud2lkdGggLSB3aWR0aCApICkgJiYgKCB5ID49IDAgJiYgeSA8PSAoIHJlbmRlclRhcmdldC5oZWlnaHQgLSBoZWlnaHQgKSApICkge1xyXG5cclxuXHRcdFx0XHRcdFx0X2dsLnJlYWRQaXhlbHMoIHgsIHksIHdpZHRoLCBoZWlnaHQsIHV0aWxzLmNvbnZlcnQoIHRleHR1cmVGb3JtYXQgKSwgdXRpbHMuY29udmVydCggdGV4dHVyZVR5cGUgKSwgYnVmZmVyICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9IGZpbmFsbHkge1xyXG5cclxuXHRcdFx0XHRcdC8vIHJlc3RvcmUgZnJhbWVidWZmZXIgb2YgY3VycmVudCByZW5kZXIgdGFyZ2V0IGlmIG5lY2Vzc2FyeVxyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGZyYW1lYnVmZmVyID0gKCBfY3VycmVudFJlbmRlclRhcmdldCAhPT0gbnVsbCApID8gcHJvcGVydGllcy5nZXQoIF9jdXJyZW50UmVuZGVyVGFyZ2V0ICkuX193ZWJnbEZyYW1lYnVmZmVyIDogbnVsbDtcclxuXHRcdFx0XHRcdHN0YXRlLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBmcmFtZWJ1ZmZlciApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFzeW5jaHJvbm91cywgbm9uLWJsb2NraW5nIHZlcnNpb24gb2Yge0BsaW5rIFdlYkdMUmVuZGVyZXIjcmVhZFJlbmRlclRhcmdldFBpeGVsc30uXHJcblx0XHQgKlxyXG5cdFx0ICogSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIHRoaXMgdmVyc2lvbiBvZiBgcmVhZFJlbmRlclRhcmdldFBpeGVscygpYCB3aGVuZXZlciBwb3NzaWJsZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAYXN5bmNcclxuXHRcdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IHJlbmRlclRhcmdldCAtIFRoZSByZW5kZXIgdGFyZ2V0IHRvIHJlYWQgZnJvbS5cclxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGB4YCBjb29yZGluYXRlIG9mIHRoZSBjb3B5IHJlZ2lvbidzIG9yaWdpbi5cclxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIGB5YCBjb29yZGluYXRlIG9mIHRoZSBjb3B5IHJlZ2lvbidzIG9yaWdpbi5cclxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgY29weSByZWdpb24uXHJcblx0XHQgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgY29weSByZWdpb24uXHJcblx0XHQgKiBAcGFyYW0ge1R5cGVkQXJyYXl9IGJ1ZmZlciAtIFRoZSByZXN1bHQgYnVmZmVyLlxyXG5cdFx0ICogQHBhcmFtIHtudW1iZXJ9IFthY3RpdmVDdWJlRmFjZUluZGV4XSAtIFRoZSBhY3RpdmUgY3ViZSBmYWNlIGluZGV4LlxyXG5cdFx0ICogQHJldHVybiB7UHJvbWlzZTxUeXBlZEFycmF5Pn0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgcmVhZCBoYXMgYmVlbiBmaW5pc2hlZC4gVGhlIHJlc29sdmUgcHJvdmlkZXMgdGhlIHJlYWQgZGF0YSBhcyBhIHR5cGVkIGFycmF5LlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHNBc3luYyA9IGFzeW5jIGZ1bmN0aW9uICggcmVuZGVyVGFyZ2V0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBidWZmZXIsIGFjdGl2ZUN1YmVGYWNlSW5kZXggKSB7XHJcblxyXG5cdFx0XHRpZiAoICEgKCByZW5kZXJUYXJnZXQgJiYgcmVuZGVyVGFyZ2V0LmlzV2ViR0xSZW5kZXJUYXJnZXQgKSApIHtcclxuXHJcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZW5kZXJUYXJnZXQgaXMgbm90IFRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0LicgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGxldCBmcmFtZWJ1ZmZlciA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQgKS5fX3dlYmdsRnJhbWVidWZmZXI7XHJcblx0XHRcdGlmICggcmVuZGVyVGFyZ2V0LmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0ICYmIGFjdGl2ZUN1YmVGYWNlSW5kZXggIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0ZnJhbWVidWZmZXIgPSBmcmFtZWJ1ZmZlclsgYWN0aXZlQ3ViZUZhY2VJbmRleCBdO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBmcmFtZWJ1ZmZlciApIHtcclxuXHJcblx0XHRcdFx0Ly8gdGhlIGZvbGxvd2luZyBpZiBzdGF0ZW1lbnQgZW5zdXJlcyB2YWxpZCByZWFkIHJlcXVlc3RzIChubyBvdXQtb2YtYm91bmRzIHBpeGVscywgc2VlICM4NjA0KVxyXG5cdFx0XHRcdGlmICggKCB4ID49IDAgJiYgeCA8PSAoIHJlbmRlclRhcmdldC53aWR0aCAtIHdpZHRoICkgKSAmJiAoIHkgPj0gMCAmJiB5IDw9ICggcmVuZGVyVGFyZ2V0LmhlaWdodCAtIGhlaWdodCApICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gc2V0IHRoZSBhY3RpdmUgZnJhbWUgYnVmZmVyIHRvIHRoZSBvbmUgd2Ugd2FudCB0byByZWFkXHJcblx0XHRcdFx0XHRzdGF0ZS5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgZnJhbWVidWZmZXIgKTtcclxuXHJcblx0XHRcdFx0XHRjb25zdCB0ZXh0dXJlID0gcmVuZGVyVGFyZ2V0LnRleHR1cmU7XHJcblx0XHRcdFx0XHRjb25zdCB0ZXh0dXJlRm9ybWF0ID0gdGV4dHVyZS5mb3JtYXQ7XHJcblx0XHRcdFx0XHRjb25zdCB0ZXh0dXJlVHlwZSA9IHRleHR1cmUudHlwZTtcclxuXHJcblx0XHRcdFx0XHRpZiAoICEgY2FwYWJpbGl0aWVzLnRleHR1cmVGb3JtYXRSZWFkYWJsZSggdGV4dHVyZUZvcm1hdCApICkge1xyXG5cclxuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzQXN5bmM6IHJlbmRlclRhcmdldCBpcyBub3QgaW4gUkdCQSBvciBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGZvcm1hdC4nICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGlmICggISBjYXBhYmlsaXRpZXMudGV4dHVyZVR5cGVSZWFkYWJsZSggdGV4dHVyZVR5cGUgKSApIHtcclxuXHJcblx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciggJ1RIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsc0FzeW5jOiByZW5kZXJUYXJnZXQgaXMgbm90IGluIFVuc2lnbmVkQnl0ZVR5cGUgb3IgaW1wbGVtZW50YXRpb24gZGVmaW5lZCB0eXBlLicgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgZ2xCdWZmZXIgPSBfZ2wuY3JlYXRlQnVmZmVyKCk7XHJcblx0XHRcdFx0XHRfZ2wuYmluZEJ1ZmZlciggX2dsLlBJWEVMX1BBQ0tfQlVGRkVSLCBnbEJ1ZmZlciApO1xyXG5cdFx0XHRcdFx0X2dsLmJ1ZmZlckRhdGEoIF9nbC5QSVhFTF9QQUNLX0JVRkZFUiwgYnVmZmVyLmJ5dGVMZW5ndGgsIF9nbC5TVFJFQU1fUkVBRCApO1xyXG5cdFx0XHRcdFx0X2dsLnJlYWRQaXhlbHMoIHgsIHksIHdpZHRoLCBoZWlnaHQsIHV0aWxzLmNvbnZlcnQoIHRleHR1cmVGb3JtYXQgKSwgdXRpbHMuY29udmVydCggdGV4dHVyZVR5cGUgKSwgMCApO1xyXG5cclxuXHRcdFx0XHRcdC8vIHJlc2V0IHRoZSBmcmFtZSBidWZmZXIgdG8gdGhlIGN1cnJlbnRseSBzZXQgYnVmZmVyIGJlZm9yZSB3YWl0aW5nXHJcblx0XHRcdFx0XHRjb25zdCBjdXJyRnJhbWVidWZmZXIgPSBfY3VycmVudFJlbmRlclRhcmdldCAhPT0gbnVsbCA/IHByb3BlcnRpZXMuZ2V0KCBfY3VycmVudFJlbmRlclRhcmdldCApLl9fd2ViZ2xGcmFtZWJ1ZmZlciA6IG51bGw7XHJcblx0XHRcdFx0XHRzdGF0ZS5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgY3VyckZyYW1lYnVmZmVyICk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gY2hlY2sgaWYgdGhlIGNvbW1hbmRzIGhhdmUgZmluaXNoZWQgZXZlcnkgOCBtc1xyXG5cdFx0XHRcdFx0Y29uc3Qgc3luYyA9IF9nbC5mZW5jZVN5bmMoIF9nbC5TWU5DX0dQVV9DT01NQU5EU19DT01QTEVURSwgMCApO1xyXG5cclxuXHRcdFx0XHRcdF9nbC5mbHVzaCgpO1xyXG5cclxuXHRcdFx0XHRcdGF3YWl0IHByb2JlQXN5bmMoIF9nbCwgc3luYywgNCApO1xyXG5cclxuXHRcdFx0XHRcdC8vIHJlYWQgdGhlIGRhdGEgYW5kIGRlbGV0ZSB0aGUgYnVmZmVyXHJcblx0XHRcdFx0XHRfZ2wuYmluZEJ1ZmZlciggX2dsLlBJWEVMX1BBQ0tfQlVGRkVSLCBnbEJ1ZmZlciApO1xyXG5cdFx0XHRcdFx0X2dsLmdldEJ1ZmZlclN1YkRhdGEoIF9nbC5QSVhFTF9QQUNLX0JVRkZFUiwgMCwgYnVmZmVyICk7XHJcblx0XHRcdFx0XHRfZ2wuZGVsZXRlQnVmZmVyKCBnbEJ1ZmZlciApO1xyXG5cdFx0XHRcdFx0X2dsLmRlbGV0ZVN5bmMoIHN5bmMgKTtcclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gYnVmZmVyO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciggJ1RIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsc0FzeW5jOiByZXF1ZXN0ZWQgcmVhZCBib3VuZHMgYXJlIG91dCBvZiByYW5nZS4nICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQ29waWVzIHBpeGVscyBmcm9tIHRoZSBjdXJyZW50IGJvdW5kIGZyYW1lYnVmZmVyIGludG8gdGhlIGdpdmVuIHRleHR1cmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtGcmFtZWJ1ZmZlclRleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZS5cclxuXHRcdCAqIEBwYXJhbSB7VmVjdG9yMn0gcG9zaXRpb24gLSBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIGNvcHkgb3BlcmF0aW9uLlxyXG5cdFx0ICogQHBhcmFtIHtudW1iZXJ9IFtsZXZlbD0wXSAtIFRoZSBtaXAgbGV2ZWwuIFRoZSBkZWZhdWx0IHJlcHJlc2VudHMgdGhlIGJhc2UgbWlwLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvcHlGcmFtZWJ1ZmZlclRvVGV4dHVyZSA9IGZ1bmN0aW9uICggdGV4dHVyZSwgcG9zaXRpb24gPSBudWxsLCBsZXZlbCA9IDAgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBsZXZlbFNjYWxlID0gTWF0aC5wb3coIDIsIC0gbGV2ZWwgKTtcclxuXHRcdFx0Y29uc3Qgd2lkdGggPSBNYXRoLmZsb29yKCB0ZXh0dXJlLmltYWdlLndpZHRoICogbGV2ZWxTY2FsZSApO1xyXG5cdFx0XHRjb25zdCBoZWlnaHQgPSBNYXRoLmZsb29yKCB0ZXh0dXJlLmltYWdlLmhlaWdodCAqIGxldmVsU2NhbGUgKTtcclxuXHJcblx0XHRcdGNvbnN0IHggPSBwb3NpdGlvbiAhPT0gbnVsbCA/IHBvc2l0aW9uLnggOiAwO1xyXG5cdFx0XHRjb25zdCB5ID0gcG9zaXRpb24gIT09IG51bGwgPyBwb3NpdGlvbi55IDogMDtcclxuXHJcblx0XHRcdHRleHR1cmVzLnNldFRleHR1cmUyRCggdGV4dHVyZSwgMCApO1xyXG5cclxuXHRcdFx0X2dsLmNvcHlUZXhTdWJJbWFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgbGV2ZWwsIDAsIDAsIHgsIHksIHdpZHRoLCBoZWlnaHQgKTtcclxuXHJcblx0XHRcdHN0YXRlLnVuYmluZFRleHR1cmUoKTtcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdGNvbnN0IF9zcmNGcmFtZWJ1ZmZlciA9IF9nbC5jcmVhdGVGcmFtZWJ1ZmZlcigpO1xyXG5cdFx0Y29uc3QgX2RzdEZyYW1lYnVmZmVyID0gX2dsLmNyZWF0ZUZyYW1lYnVmZmVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDb3BpZXMgZGF0YSBvZiB0aGUgZ2l2ZW4gc291cmNlIHRleHR1cmUgaW50byBhIGRlc3RpbmF0aW9uIHRleHR1cmUuXHJcblx0XHQgKlxyXG5cdFx0ICogV2hlbiB1c2luZyByZW5kZXIgdGFyZ2V0IHRleHR1cmVzIGFzIGBzcmNUZXh0dXJlYCBhbmQgYGRzdFRleHR1cmVgLCB5b3UgbXVzdCBtYWtlIHN1cmUgYm90aCByZW5kZXIgdGFyZ2V0cyBhcmUgaW5pdGlhbGl6ZWRcclxuXHRcdCAqIHtAbGluayBXZWJHTFJlbmRlcmVyI2luaXRSZW5kZXJUYXJnZXR9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7VGV4dHVyZX0gc3JjVGV4dHVyZSAtIFRoZSBzb3VyY2UgdGV4dHVyZS5cclxuXHRcdCAqIEBwYXJhbSB7VGV4dHVyZX0gZHN0VGV4dHVyZSAtIFRoZSBkZXN0aW5hdGlvbiB0ZXh0dXJlLlxyXG5cdFx0ICogQHBhcmFtIHtCb3gyfEJveDN9IFtzcmNSZWdpb249bnVsbF0gLSBBIGJvdW5kaW5nIGJveCB3aGljaCBkZXNjcmliZXMgdGhlIHNvdXJjZSByZWdpb24uIENhbiBiZSB0d28gb3IgdGhyZWUtZGltZW5zaW9uYWwuXHJcblx0XHQgKiBAcGFyYW0ge1ZlY3RvcjJ8VmVjdG9yM30gW2RzdFBvc2l0aW9uPW51bGxdIC0gQSB2ZWN0b3IgdGhhdCByZXByZXNlbnRzIHRoZSBvcmlnaW4gb2YgdGhlIGRlc3RpbmF0aW9uIHJlZ2lvbi4gQ2FuIGJlIHR3byBvciB0aHJlZS1kaW1lbnNpb25hbC5cclxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyfSBzcmNMZXZlbCAtIFRoZSBzb3VyY2UgbWlwbWFwIGxldmVsIHRvIGNvcHkuXHJcblx0XHQgKiBAcGFyYW0ge251bWJlcn0gZHN0TGV2ZWwgLSBUaGUgZGVzdGluYXRpb24gbWlwbWFwIGxldmVsLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvcHlUZXh0dXJlVG9UZXh0dXJlID0gZnVuY3Rpb24gKCBzcmNUZXh0dXJlLCBkc3RUZXh0dXJlLCBzcmNSZWdpb24gPSBudWxsLCBkc3RQb3NpdGlvbiA9IG51bGwsIHNyY0xldmVsID0gMCwgZHN0TGV2ZWwgPSBudWxsICkge1xyXG5cclxuXHRcdFx0Ly8gc3VwcG9ydCB0aGUgcHJldmlvdXMgc2lnbmF0dXJlIHdpdGgganVzdCBhIHNpbmdsZSBkc3QgbWlwbWFwIGxldmVsXHJcblx0XHRcdGlmICggZHN0TGV2ZWwgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggc3JjTGV2ZWwgIT09IDAgKSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gQGRlcHJlY2F0ZWQsIHIxNzFcclxuXHRcdFx0XHRcdHdhcm5PbmNlKCAnV2ViR0xSZW5kZXJlcjogY29weVRleHR1cmVUb1RleHR1cmUgZnVuY3Rpb24gc2lnbmF0dXJlIGhhcyBjaGFuZ2VkIHRvIHN1cHBvcnQgc3JjIGFuZCBkc3QgbWlwbWFwIGxldmVscy4nICk7XHJcblx0XHRcdFx0XHRkc3RMZXZlbCA9IHNyY0xldmVsO1xyXG5cdFx0XHRcdFx0c3JjTGV2ZWwgPSAwO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdGRzdExldmVsID0gMDtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gZ2F0aGVyIHRoZSBuZWNlc3NhcnkgZGltZW5zaW9ucyB0byBjb3B5XHJcblx0XHRcdGxldCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgbWluWCwgbWluWSwgbWluWjtcclxuXHRcdFx0bGV0IGRzdFgsIGRzdFksIGRzdFo7XHJcblx0XHRcdGNvbnN0IGltYWdlID0gc3JjVGV4dHVyZS5pc0NvbXByZXNzZWRUZXh0dXJlID8gc3JjVGV4dHVyZS5taXBtYXBzWyBkc3RMZXZlbCBdIDogc3JjVGV4dHVyZS5pbWFnZTtcclxuXHRcdFx0aWYgKCBzcmNSZWdpb24gIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdHdpZHRoID0gc3JjUmVnaW9uLm1heC54IC0gc3JjUmVnaW9uLm1pbi54O1xyXG5cdFx0XHRcdGhlaWdodCA9IHNyY1JlZ2lvbi5tYXgueSAtIHNyY1JlZ2lvbi5taW4ueTtcclxuXHRcdFx0XHRkZXB0aCA9IHNyY1JlZ2lvbi5pc0JveDMgPyBzcmNSZWdpb24ubWF4LnogLSBzcmNSZWdpb24ubWluLnogOiAxO1xyXG5cdFx0XHRcdG1pblggPSBzcmNSZWdpb24ubWluLng7XHJcblx0XHRcdFx0bWluWSA9IHNyY1JlZ2lvbi5taW4ueTtcclxuXHRcdFx0XHRtaW5aID0gc3JjUmVnaW9uLmlzQm94MyA/IHNyY1JlZ2lvbi5taW4ueiA6IDA7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRjb25zdCBsZXZlbFNjYWxlID0gTWF0aC5wb3coIDIsIC0gc3JjTGV2ZWwgKTtcclxuXHRcdFx0XHR3aWR0aCA9IE1hdGguZmxvb3IoIGltYWdlLndpZHRoICogbGV2ZWxTY2FsZSApO1xyXG5cdFx0XHRcdGhlaWdodCA9IE1hdGguZmxvb3IoIGltYWdlLmhlaWdodCAqIGxldmVsU2NhbGUgKTtcclxuXHRcdFx0XHRpZiAoIHNyY1RleHR1cmUuaXNEYXRhQXJyYXlUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0XHRcdGRlcHRoID0gaW1hZ2UuZGVwdGg7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIHNyY1RleHR1cmUuaXNEYXRhM0RUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0XHRcdGRlcHRoID0gTWF0aC5mbG9vciggaW1hZ2UuZGVwdGggKiBsZXZlbFNjYWxlICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0ZGVwdGggPSAxO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdG1pblggPSAwO1xyXG5cdFx0XHRcdG1pblkgPSAwO1xyXG5cdFx0XHRcdG1pblogPSAwO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBkc3RQb3NpdGlvbiAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0ZHN0WCA9IGRzdFBvc2l0aW9uLng7XHJcblx0XHRcdFx0ZHN0WSA9IGRzdFBvc2l0aW9uLnk7XHJcblx0XHRcdFx0ZHN0WiA9IGRzdFBvc2l0aW9uLno7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRkc3RYID0gMDtcclxuXHRcdFx0XHRkc3RZID0gMDtcclxuXHRcdFx0XHRkc3RaID0gMDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIFNldCB1cCB0aGUgZGVzdGluYXRpb24gdGFyZ2V0XHJcblx0XHRcdGNvbnN0IGdsRm9ybWF0ID0gdXRpbHMuY29udmVydCggZHN0VGV4dHVyZS5mb3JtYXQgKTtcclxuXHRcdFx0Y29uc3QgZ2xUeXBlID0gdXRpbHMuY29udmVydCggZHN0VGV4dHVyZS50eXBlICk7XHJcblx0XHRcdGxldCBnbFRhcmdldDtcclxuXHJcblx0XHRcdGlmICggZHN0VGV4dHVyZS5pc0RhdGEzRFRleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRcdHRleHR1cmVzLnNldFRleHR1cmUzRCggZHN0VGV4dHVyZSwgMCApO1xyXG5cdFx0XHRcdGdsVGFyZ2V0ID0gX2dsLlRFWFRVUkVfM0Q7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBkc3RUZXh0dXJlLmlzRGF0YUFycmF5VGV4dHVyZSB8fCBkc3RUZXh0dXJlLmlzQ29tcHJlc3NlZEFycmF5VGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0dGV4dHVyZXMuc2V0VGV4dHVyZTJEQXJyYXkoIGRzdFRleHR1cmUsIDAgKTtcclxuXHRcdFx0XHRnbFRhcmdldCA9IF9nbC5URVhUVVJFXzJEX0FSUkFZO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0dGV4dHVyZXMuc2V0VGV4dHVyZTJEKCBkc3RUZXh0dXJlLCAwICk7XHJcblx0XHRcdFx0Z2xUYXJnZXQgPSBfZ2wuVEVYVFVSRV8yRDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdF9nbC5waXhlbFN0b3JlaSggX2dsLlVOUEFDS19GTElQX1lfV0VCR0wsIGRzdFRleHR1cmUuZmxpcFkgKTtcclxuXHRcdFx0X2dsLnBpeGVsU3RvcmVpKCBfZ2wuVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMLCBkc3RUZXh0dXJlLnByZW11bHRpcGx5QWxwaGEgKTtcclxuXHRcdFx0X2dsLnBpeGVsU3RvcmVpKCBfZ2wuVU5QQUNLX0FMSUdOTUVOVCwgZHN0VGV4dHVyZS51bnBhY2tBbGlnbm1lbnQgKTtcclxuXHJcblx0XHRcdC8vIHVzZWQgZm9yIGNvcHlpbmcgZGF0YSBmcm9tIGNwdVxyXG5cdFx0XHRjb25zdCBjdXJyZW50VW5wYWNrUm93TGVuID0gX2dsLmdldFBhcmFtZXRlciggX2dsLlVOUEFDS19ST1dfTEVOR1RIICk7XHJcblx0XHRcdGNvbnN0IGN1cnJlbnRVbnBhY2tJbWFnZUhlaWdodCA9IF9nbC5nZXRQYXJhbWV0ZXIoIF9nbC5VTlBBQ0tfSU1BR0VfSEVJR0hUICk7XHJcblx0XHRcdGNvbnN0IGN1cnJlbnRVbnBhY2tTa2lwUGl4ZWxzID0gX2dsLmdldFBhcmFtZXRlciggX2dsLlVOUEFDS19TS0lQX1BJWEVMUyApO1xyXG5cdFx0XHRjb25zdCBjdXJyZW50VW5wYWNrU2tpcFJvd3MgPSBfZ2wuZ2V0UGFyYW1ldGVyKCBfZ2wuVU5QQUNLX1NLSVBfUk9XUyApO1xyXG5cdFx0XHRjb25zdCBjdXJyZW50VW5wYWNrU2tpcEltYWdlcyA9IF9nbC5nZXRQYXJhbWV0ZXIoIF9nbC5VTlBBQ0tfU0tJUF9JTUFHRVMgKTtcclxuXHJcblx0XHRcdF9nbC5waXhlbFN0b3JlaSggX2dsLlVOUEFDS19ST1dfTEVOR1RILCBpbWFnZS53aWR0aCApO1xyXG5cdFx0XHRfZ2wucGl4ZWxTdG9yZWkoIF9nbC5VTlBBQ0tfSU1BR0VfSEVJR0hULCBpbWFnZS5oZWlnaHQgKTtcclxuXHRcdFx0X2dsLnBpeGVsU3RvcmVpKCBfZ2wuVU5QQUNLX1NLSVBfUElYRUxTLCBtaW5YICk7XHJcblx0XHRcdF9nbC5waXhlbFN0b3JlaSggX2dsLlVOUEFDS19TS0lQX1JPV1MsIG1pblkgKTtcclxuXHRcdFx0X2dsLnBpeGVsU3RvcmVpKCBfZ2wuVU5QQUNLX1NLSVBfSU1BR0VTLCBtaW5aICk7XHJcblxyXG5cdFx0XHQvLyBzZXQgdXAgdGhlIHNyYyB0ZXh0dXJlXHJcblx0XHRcdGNvbnN0IGlzU3JjM0QgPSBzcmNUZXh0dXJlLmlzRGF0YUFycmF5VGV4dHVyZSB8fCBzcmNUZXh0dXJlLmlzRGF0YTNEVGV4dHVyZTtcclxuXHRcdFx0Y29uc3QgaXNEc3QzRCA9IGRzdFRleHR1cmUuaXNEYXRhQXJyYXlUZXh0dXJlIHx8IGRzdFRleHR1cmUuaXNEYXRhM0RUZXh0dXJlO1xyXG5cdFx0XHRpZiAoIHNyY1RleHR1cmUuaXNEZXB0aFRleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHNyY1RleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHNyY1RleHR1cmUgKTtcclxuXHRcdFx0XHRjb25zdCBkc3RUZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCBkc3RUZXh0dXJlICk7XHJcblx0XHRcdFx0Y29uc3Qgc3JjUmVuZGVyVGFyZ2V0UHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCBzcmNUZXh0dXJlUHJvcGVydGllcy5fX3JlbmRlclRhcmdldCApO1xyXG5cdFx0XHRcdGNvbnN0IGRzdFJlbmRlclRhcmdldFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggZHN0VGV4dHVyZVByb3BlcnRpZXMuX19yZW5kZXJUYXJnZXQgKTtcclxuXHRcdFx0XHRzdGF0ZS5iaW5kRnJhbWVidWZmZXIoIF9nbC5SRUFEX0ZSQU1FQlVGRkVSLCBzcmNSZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciApO1xyXG5cdFx0XHRcdHN0YXRlLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkRSQVdfRlJBTUVCVUZGRVIsIGRzdFJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyICk7XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGRlcHRoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdC8vIGlmIHRoZSBzb3VyY2Ugb3IgZGVzdGluYXRpb24gYXJlIGEgM2QgdGFyZ2V0IHRoZW4gYSBsYXllciBuZWVkcyB0byBiZSBib3VuZFxyXG5cdFx0XHRcdFx0aWYgKCBpc1NyYzNEICkge1xyXG5cclxuXHRcdFx0XHRcdFx0X2dsLmZyYW1lYnVmZmVyVGV4dHVyZUxheWVyKCBfZ2wuUkVBRF9GUkFNRUJVRkZFUiwgX2dsLkNPTE9SX0FUVEFDSE1FTlQwLCBwcm9wZXJ0aWVzLmdldCggc3JjVGV4dHVyZSApLl9fd2ViZ2xUZXh0dXJlLCBzcmNMZXZlbCwgbWluWiArIGkgKTtcclxuXHRcdFx0XHRcdFx0X2dsLmZyYW1lYnVmZmVyVGV4dHVyZUxheWVyKCBfZ2wuRFJBV19GUkFNRUJVRkZFUiwgX2dsLkNPTE9SX0FUVEFDSE1FTlQwLCBwcm9wZXJ0aWVzLmdldCggZHN0VGV4dHVyZSApLl9fd2ViZ2xUZXh0dXJlLCBkc3RMZXZlbCwgZHN0WiArIGkgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0X2dsLmJsaXRGcmFtZWJ1ZmZlciggbWluWCwgbWluWSwgd2lkdGgsIGhlaWdodCwgZHN0WCwgZHN0WSwgd2lkdGgsIGhlaWdodCwgX2dsLkRFUFRIX0JVRkZFUl9CSVQsIF9nbC5ORUFSRVNUICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0c3RhdGUuYmluZEZyYW1lYnVmZmVyKCBfZ2wuUkVBRF9GUkFNRUJVRkZFUiwgbnVsbCApO1xyXG5cdFx0XHRcdHN0YXRlLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkRSQVdfRlJBTUVCVUZGRVIsIG51bGwgKTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIHNyY0xldmVsICE9PSAwIHx8IHNyY1RleHR1cmUuaXNSZW5kZXJUYXJnZXRUZXh0dXJlIHx8IHByb3BlcnRpZXMuaGFzKCBzcmNUZXh0dXJlICkgKSB7XHJcblxyXG5cdFx0XHRcdC8vIGdldCB0aGUgYXBwcm9wcmlhdGUgZnJhbWUgYnVmZmVyc1xyXG5cdFx0XHRcdGNvbnN0IHNyY1RleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHNyY1RleHR1cmUgKTtcclxuXHRcdFx0XHRjb25zdCBkc3RUZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCBkc3RUZXh0dXJlICk7XHJcblxyXG5cdFx0XHRcdC8vIGJpbmQgdGhlIGZyYW1lIGJ1ZmZlciB0YXJnZXRzXHJcblx0XHRcdFx0c3RhdGUuYmluZEZyYW1lYnVmZmVyKCBfZ2wuUkVBRF9GUkFNRUJVRkZFUiwgX3NyY0ZyYW1lYnVmZmVyICk7XHJcblx0XHRcdFx0c3RhdGUuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRFJBV19GUkFNRUJVRkZFUiwgX2RzdEZyYW1lYnVmZmVyICk7XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGRlcHRoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdC8vIGFzc2lnbiB0aGUgY29ycmVjdCBsYXllcnMgYW5kIG1pcCBtYXBzIHRvIHRoZSBmcmFtZSBidWZmZXJzXHJcblx0XHRcdFx0XHRpZiAoIGlzU3JjM0QgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRfZ2wuZnJhbWVidWZmZXJUZXh0dXJlTGF5ZXIoIF9nbC5SRUFEX0ZSQU1FQlVGRkVSLCBfZ2wuQ09MT1JfQVRUQUNITUVOVDAsIHNyY1RleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlLCBzcmNMZXZlbCwgbWluWiArIGkgKTtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0X2dsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKCBfZ2wuUkVBRF9GUkFNRUJVRkZFUiwgX2dsLkNPTE9SX0FUVEFDSE1FTlQwLCBfZ2wuVEVYVFVSRV8yRCwgc3JjVGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUsIHNyY0xldmVsICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGlmICggaXNEc3QzRCApIHtcclxuXHJcblx0XHRcdFx0XHRcdF9nbC5mcmFtZWJ1ZmZlclRleHR1cmVMYXllciggX2dsLkRSQVdfRlJBTUVCVUZGRVIsIF9nbC5DT0xPUl9BVFRBQ0hNRU5UMCwgZHN0VGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUsIGRzdExldmVsLCBkc3RaICsgaSApO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRfZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoIF9nbC5EUkFXX0ZSQU1FQlVGRkVSLCBfZ2wuQ09MT1JfQVRUQUNITUVOVDAsIF9nbC5URVhUVVJFXzJELCBkc3RUZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSwgZHN0TGV2ZWwgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Ly8gY29weSB0aGUgZGF0YSB1c2luZyB0aGUgZmFzdGVzdCBmdW5jdGlvbiB0aGF0IGNhbiBhY2hpZXZlIHRoZSBjb3B5XHJcblx0XHRcdFx0XHRpZiAoIHNyY0xldmVsICE9PSAwICkge1xyXG5cclxuXHRcdFx0XHRcdFx0X2dsLmJsaXRGcmFtZWJ1ZmZlciggbWluWCwgbWluWSwgd2lkdGgsIGhlaWdodCwgZHN0WCwgZHN0WSwgd2lkdGgsIGhlaWdodCwgX2dsLkNPTE9SX0JVRkZFUl9CSVQsIF9nbC5ORUFSRVNUICk7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIGlmICggaXNEc3QzRCApIHtcclxuXHJcblx0XHRcdFx0XHRcdF9nbC5jb3B5VGV4U3ViSW1hZ2UzRCggZ2xUYXJnZXQsIGRzdExldmVsLCBkc3RYLCBkc3RZLCBkc3RaICsgaSwgbWluWCwgbWluWSwgd2lkdGgsIGhlaWdodCApO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRfZ2wuY29weVRleFN1YkltYWdlMkQoIGdsVGFyZ2V0LCBkc3RMZXZlbCwgZHN0WCwgZHN0WSwgbWluWCwgbWluWSwgd2lkdGgsIGhlaWdodCApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyB1bmJpbmQgcmVhZCwgZHJhdyBidWZmZXJzXHJcblx0XHRcdFx0c3RhdGUuYmluZEZyYW1lYnVmZmVyKCBfZ2wuUkVBRF9GUkFNRUJVRkZFUiwgbnVsbCApO1xyXG5cdFx0XHRcdHN0YXRlLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkRSQVdfRlJBTUVCVUZGRVIsIG51bGwgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGlmICggaXNEc3QzRCApIHtcclxuXHJcblx0XHRcdFx0XHQvLyBjb3B5IGRhdGEgaW50byB0aGUgM2QgdGV4dHVyZVxyXG5cdFx0XHRcdFx0aWYgKCBzcmNUZXh0dXJlLmlzRGF0YVRleHR1cmUgfHwgc3JjVGV4dHVyZS5pc0RhdGEzRFRleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRfZ2wudGV4U3ViSW1hZ2UzRCggZ2xUYXJnZXQsIGRzdExldmVsLCBkc3RYLCBkc3RZLCBkc3RaLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgZ2xGb3JtYXQsIGdsVHlwZSwgaW1hZ2UuZGF0YSApO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIGRzdFRleHR1cmUuaXNDb21wcmVzc2VkQXJyYXlUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0X2dsLmNvbXByZXNzZWRUZXhTdWJJbWFnZTNEKCBnbFRhcmdldCwgZHN0TGV2ZWwsIGRzdFgsIGRzdFksIGRzdFosIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBnbEZvcm1hdCwgaW1hZ2UuZGF0YSApO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRfZ2wudGV4U3ViSW1hZ2UzRCggZ2xUYXJnZXQsIGRzdExldmVsLCBkc3RYLCBkc3RZLCBkc3RaLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgZ2xGb3JtYXQsIGdsVHlwZSwgaW1hZ2UgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gY29weSBkYXRhIGludG8gdGhlIDJkIHRleHR1cmVcclxuXHRcdFx0XHRcdGlmICggc3JjVGV4dHVyZS5pc0RhdGFUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0X2dsLnRleFN1YkltYWdlMkQoIF9nbC5URVhUVVJFXzJELCBkc3RMZXZlbCwgZHN0WCwgZHN0WSwgd2lkdGgsIGhlaWdodCwgZ2xGb3JtYXQsIGdsVHlwZSwgaW1hZ2UuZGF0YSApO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIHNyY1RleHR1cmUuaXNDb21wcmVzc2VkVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdF9nbC5jb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIGRzdExldmVsLCBkc3RYLCBkc3RZLCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0LCBnbEZvcm1hdCwgaW1hZ2UuZGF0YSApO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRfZ2wudGV4U3ViSW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIGRzdExldmVsLCBkc3RYLCBkc3RZLCB3aWR0aCwgaGVpZ2h0LCBnbEZvcm1hdCwgZ2xUeXBlLCBpbWFnZSApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gcmVzZXQgdmFsdWVzXHJcblx0XHRcdF9nbC5waXhlbFN0b3JlaSggX2dsLlVOUEFDS19ST1dfTEVOR1RILCBjdXJyZW50VW5wYWNrUm93TGVuICk7XHJcblx0XHRcdF9nbC5waXhlbFN0b3JlaSggX2dsLlVOUEFDS19JTUFHRV9IRUlHSFQsIGN1cnJlbnRVbnBhY2tJbWFnZUhlaWdodCApO1xyXG5cdFx0XHRfZ2wucGl4ZWxTdG9yZWkoIF9nbC5VTlBBQ0tfU0tJUF9QSVhFTFMsIGN1cnJlbnRVbnBhY2tTa2lwUGl4ZWxzICk7XHJcblx0XHRcdF9nbC5waXhlbFN0b3JlaSggX2dsLlVOUEFDS19TS0lQX1JPV1MsIGN1cnJlbnRVbnBhY2tTa2lwUm93cyApO1xyXG5cdFx0XHRfZ2wucGl4ZWxTdG9yZWkoIF9nbC5VTlBBQ0tfU0tJUF9JTUFHRVMsIGN1cnJlbnRVbnBhY2tTa2lwSW1hZ2VzICk7XHJcblxyXG5cdFx0XHQvLyBHZW5lcmF0ZSBtaXBtYXBzIG9ubHkgd2hlbiBjb3B5aW5nIGxldmVsIDBcclxuXHRcdFx0aWYgKCBkc3RMZXZlbCA9PT0gMCAmJiBkc3RUZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyApIHtcclxuXHJcblx0XHRcdFx0X2dsLmdlbmVyYXRlTWlwbWFwKCBnbFRhcmdldCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0c3RhdGUudW5iaW5kVGV4dHVyZSgpO1xyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0dGhpcy5jb3B5VGV4dHVyZVRvVGV4dHVyZTNEID0gZnVuY3Rpb24gKCBzcmNUZXh0dXJlLCBkc3RUZXh0dXJlLCBzcmNSZWdpb24gPSBudWxsLCBkc3RQb3NpdGlvbiA9IG51bGwsIGxldmVsID0gMCApIHtcclxuXHJcblx0XHRcdC8vIEBkZXByZWNhdGVkLCByMTcwXHJcblx0XHRcdHdhcm5PbmNlKCAnV2ViR0xSZW5kZXJlcjogY29weVRleHR1cmVUb1RleHR1cmUzRCBmdW5jdGlvbiBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgXCJjb3B5VGV4dHVyZVRvVGV4dHVyZVwiIGluc3RlYWQuJyApO1xyXG5cclxuXHRcdFx0cmV0dXJuIHRoaXMuY29weVRleHR1cmVUb1RleHR1cmUoIHNyY1RleHR1cmUsIGRzdFRleHR1cmUsIHNyY1JlZ2lvbiwgZHN0UG9zaXRpb24sIGxldmVsICk7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEluaXRpYWxpemVzIHRoZSBnaXZlbiBXZWJHTFJlbmRlclRhcmdldCBtZW1vcnkuIFVzZWZ1bCBmb3IgaW5pdGlhbGl6aW5nIGEgcmVuZGVyIHRhcmdldCBzbyBkYXRhXHJcblx0XHQgKiBjYW4gYmUgY29waWVkIGludG8gaXQgdXNpbmcge0BsaW5rIFdlYkdMUmVuZGVyZXIjY29weVRleHR1cmVUb1RleHR1cmV9IGJlZm9yZSBpdCBoYXMgYmVlblxyXG5cdFx0ICogcmVuZGVyZWQgdG8uXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gdGFyZ2V0IC0gVGhlIHJlbmRlciB0YXJnZXQuXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaW5pdFJlbmRlclRhcmdldCA9IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xyXG5cclxuXHRcdFx0aWYgKCBwcm9wZXJ0aWVzLmdldCggdGFyZ2V0ICkuX193ZWJnbEZyYW1lYnVmZmVyID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdHRleHR1cmVzLnNldHVwUmVuZGVyVGFyZ2V0KCB0YXJnZXQgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSW5pdGlhbGl6ZXMgdGhlIGdpdmVuIHRleHR1cmUuIFVzZWZ1bCBmb3IgcHJlbG9hZGluZyBhIHRleHR1cmUgcmF0aGVyIHRoYW4gd2FpdGluZyB1bnRpbCBmaXJzdFxyXG5cdFx0ICogcmVuZGVyICh3aGljaCBjYW4gY2F1c2Ugbm90aWNlYWJsZSBsYWdzIGR1ZSB0byBkZWNvZGUgYW5kIEdQVSB1cGxvYWQgb3ZlcmhlYWQpLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmluaXRUZXh0dXJlID0gZnVuY3Rpb24gKCB0ZXh0dXJlICkge1xyXG5cclxuXHRcdFx0aWYgKCB0ZXh0dXJlLmlzQ3ViZVRleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRcdHRleHR1cmVzLnNldFRleHR1cmVDdWJlKCB0ZXh0dXJlLCAwICk7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCB0ZXh0dXJlLmlzRGF0YTNEVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0dGV4dHVyZXMuc2V0VGV4dHVyZTNEKCB0ZXh0dXJlLCAwICk7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCB0ZXh0dXJlLmlzRGF0YUFycmF5VGV4dHVyZSB8fCB0ZXh0dXJlLmlzQ29tcHJlc3NlZEFycmF5VGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0dGV4dHVyZXMuc2V0VGV4dHVyZTJEQXJyYXkoIHRleHR1cmUsIDAgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHRleHR1cmVzLnNldFRleHR1cmUyRCggdGV4dHVyZSwgMCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0c3RhdGUudW5iaW5kVGV4dHVyZSgpO1xyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDYW4gYmUgdXNlZCB0byByZXNldCB0aGUgaW50ZXJuYWwgV2ViR0wgc3RhdGUuIFRoaXMgbWV0aG9kIGlzIG1vc3RseVxyXG5cdFx0ICogcmVsZXZhbnQgZm9yIGFwcGxpY2F0aW9ucyB3aGljaCBzaGFyZSBhIHNpbmdsZSBXZWJHTCBjb250ZXh0IGFjcm9zc1xyXG5cdFx0ICogbXVsdGlwbGUgV2ViR0wgbGlicmFyaWVzLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJlc2V0U3RhdGUgPSBmdW5jdGlvbiAoKSB7XHJcblxyXG5cdFx0XHRfY3VycmVudEFjdGl2ZUN1YmVGYWNlID0gMDtcclxuXHRcdFx0X2N1cnJlbnRBY3RpdmVNaXBtYXBMZXZlbCA9IDA7XHJcblx0XHRcdF9jdXJyZW50UmVuZGVyVGFyZ2V0ID0gbnVsbDtcclxuXHJcblx0XHRcdHN0YXRlLnJlc2V0KCk7XHJcblx0XHRcdGJpbmRpbmdTdGF0ZXMucmVzZXQoKTtcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdGlmICggdHlwZW9mIF9fVEhSRUVfREVWVE9PTFNfXyAhPT0gJ3VuZGVmaW5lZCcgKSB7XHJcblxyXG5cdFx0XHRfX1RIUkVFX0RFVlRPT0xTX18uZGlzcGF0Y2hFdmVudCggbmV3IEN1c3RvbUV2ZW50KCAnb2JzZXJ2ZScsIHsgZGV0YWlsOiB0aGlzIH0gKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWZpbmVzIHRoZSBjb29yZGluYXRlIHN5c3RlbSBvZiB0aGUgcmVuZGVyZXIuXHJcblx0ICpcclxuXHQgKiBJbiBgV2ViR0xSZW5kZXJlcmAsIHRoZSB2YWx1ZSBpcyBhbHdheXMgYFdlYkdMQ29vcmRpbmF0ZVN5c3RlbWAuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7V2ViR0xDb29yZGluYXRlU3lzdGVtfFdlYkdQVUNvb3JkaW5hdGVTeXN0ZW19XHJcblx0ICogQGRlZmF1bHQgV2ViR0xDb29yZGluYXRlU3lzdGVtXHJcblx0ICogQHJlYWRvbmx5XHJcblx0ICovXHJcblx0Z2V0IGNvb3JkaW5hdGVTeXN0ZW0oKSB7XHJcblxyXG5cdFx0cmV0dXJuIFdlYkdMQ29vcmRpbmF0ZVN5c3RlbTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWZpbmVzIHRoZSBvdXRwdXQgY29sb3Igc3BhY2Ugb2YgdGhlIHJlbmRlcmVyLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge1NSR0JDb2xvclNwYWNlfExpbmVhclNSR0JDb2xvclNwYWNlfVxyXG5cdCAqIEBkZWZhdWx0IFNSR0JDb2xvclNwYWNlXHJcblx0ICovXHJcblx0Z2V0IG91dHB1dENvbG9yU3BhY2UoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX291dHB1dENvbG9yU3BhY2U7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0IG91dHB1dENvbG9yU3BhY2UoIGNvbG9yU3BhY2UgKSB7XHJcblxyXG5cdFx0dGhpcy5fb3V0cHV0Q29sb3JTcGFjZSA9IGNvbG9yU3BhY2U7XHJcblxyXG5cdFx0Y29uc3QgZ2wgPSB0aGlzLmdldENvbnRleHQoKTtcclxuXHRcdGdsLmRyYXdpbmdCdWZmZXJDb2xvclNwYWNlID0gQ29sb3JNYW5hZ2VtZW50Ll9nZXREcmF3aW5nQnVmZmVyQ29sb3JTcGFjZSggY29sb3JTcGFjZSApO1xyXG5cdFx0Z2wudW5wYWNrQ29sb3JTcGFjZSA9IENvbG9yTWFuYWdlbWVudC5fZ2V0VW5wYWNrQ29sb3JTcGFjZSgpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vLyBKU0RvY1xyXG5cclxuLyoqXHJcbiAqIFdlYkdMUmVuZGVyZXIgb3B0aW9ucy5cclxuICpcclxuICogQHR5cGVkZWYge09iamVjdH0gV2ViR0xSZW5kZXJlcn5PcHRpb25zXHJcbiAqIEBwcm9wZXJ0eSB7RE9NRWxlbWVudH0gW2NhbnZhcz1udWxsXSAtIEEgY2FudmFzIGVsZW1lbnQgd2hlcmUgdGhlIHJlbmRlcmVyIGRyYXdzIGl0cyBvdXRwdXQuIElmIG5vdCBwYXNzZWQgaW4gaGVyZSwgYSBuZXcgY2FudmFzIGVsZW1lbnQgd2lsbCBiZSBjcmVhdGVkIGJ5IHRoZSByZW5kZXJlci5cclxuICogQHByb3BlcnR5IHtXZWJHTDJSZW5kZXJpbmdDb250ZXh0fSBbY29udGV4dD1udWxsXSAtIENhbiBiZSB1c2VkIHRvIGF0dGFjaCBhbiBleGlzdGluZyByZW5kZXJpbmcgY29udGV4dCB0byB0aGlzIHJlbmRlcmVyLlxyXG4gKiBAcHJvcGVydHkgeygnaGlnaHAnfCdtZWRpdW1wJ3wnbG93cCcpfSBbcHJlY2lzaW9uPSdoaWdocCddIC0gVGhlIGRlZmF1bHQgc2hhZGVyIHByZWNpc2lvbi4gVXNlcyBgaGlnaHBgIGlmIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlLlxyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFthbHBoYT1mYWxzZV0gLSBDb250cm9scyB0aGUgZGVmYXVsdCBjbGVhciBhbHBoYSB2YWx1ZS4gV2hlbiBzZXQgdG9gdHJ1ZWAsIHRoZSB2YWx1ZSBpcyBgMGAuIE90aGVyd2lzZSBpdCdzIGAxYC5cclxuICogQHByb3BlcnR5IHtib29sZWFufSBbcHJlbXVsdGlwbGllZEFscGhhPXRydWVdIFdoZXRoZXIgdGhlIHJlbmRlcmVyIHdpbGwgYXNzdW1lIGNvbG9ycyBoYXZlIHByZW11bHRpcGxpZWQgYWxwaGEgb3Igbm90LlxyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFthbnRpYWxpYXM9ZmFsc2VdIFdoZXRoZXIgdG8gdXNlIHRoZSBkZWZhdWx0IE1TQUEgb3Igbm90LlxyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtzdGVuY2lsPWZhbHNlXSBXaGV0aGVyIHRoZSBkcmF3aW5nIGJ1ZmZlciBoYXMgYSBzdGVuY2lsIGJ1ZmZlciBvZiBhdCBsZWFzdCA4IGJpdHMgb3Igbm90LlxyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtwcmVzZXJ2ZURyYXdpbmdCdWZmZXI9ZmFsc2VdIFdoZXRoZXIgdG8gcHJlc2VydmUgdGhlIGJ1ZmZlciB1bnRpbCBtYW51YWxseSBjbGVhcmVkIG9yIG92ZXJ3cml0dGVuLlxyXG4gKiBAcHJvcGVydHkgeygnZGVmYXVsdCd8J2xvdy1wb3dlcid8J2hpZ2gtcGVyZm9ybWFuY2UnKX0gW3Bvd2VyUHJlZmVyZW5jZT0nZGVmYXVsdCddIFByb3ZpZGVzIGEgaGludCB0byB0aGUgdXNlciBhZ2VudCBpbmRpY2F0aW5nIHdoYXQgY29uZmlndXJhdGlvbiBvZiBHUFUgaXMgc3VpdGFibGUgZm9yIHRoaXMgV2ViR0wgY29udGV4dC5cclxuICogQHByb3BlcnR5IHtib29sZWFufSBbZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdD1mYWxzZV0gV2hldGhlciB0aGUgcmVuZGVyZXIgY3JlYXRpb24gd2lsbCBmYWlsIHVwb24gbG93IHBlcmZvcm1hbmNlIGlzIGRldGVjdGVkLlxyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtkZXB0aD10cnVlXSBXaGV0aGVyIHRoZSBkcmF3aW5nIGJ1ZmZlciBoYXMgYSBkZXB0aCBidWZmZXIgb2YgYXQgbGVhc3QgMTYgYml0cy5cclxuICogQHByb3BlcnR5IHtib29sZWFufSBbbG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcj1mYWxzZV0gV2hldGhlciB0byB1c2UgYSBsb2dhcml0aG1pYyBkZXB0aCBidWZmZXIuIEl0IG1heSBiZSBuZWNlc3NhcnkgdG8gdXNlIHRoaXMgaWYgZGVhbGluZyB3aXRoIGh1Z2UgZGlmZmVyZW5jZXMgaW4gc2NhbGUgaW4gYSBzaW5nbGUgc2NlbmUuXHJcbiAqIE5vdGUgdGhhdCB0aGlzIHNldHRpbmcgdXNlcyBgZ2xfRnJhZ0RlcHRoYCBpZiBhdmFpbGFibGUgd2hpY2ggZGlzYWJsZXMgdGhlIEVhcmx5IEZyYWdtZW50IFRlc3Qgb3B0aW1pemF0aW9uIGFuZCBjYW4gY2F1c2UgYSBkZWNyZWFzZSBpbiBwZXJmb3JtYW5jZS5cclxuICogQHByb3BlcnR5IHtib29sZWFufSBbcmV2ZXJzZURlcHRoQnVmZmVyPWZhbHNlXSBXaGV0aGVyIHRvIHVzZSBhIHJldmVyc2UgZGVwdGggYnVmZmVyLiBSZXF1aXJlcyB0aGUgYEVYVF9jbGlwX2NvbnRyb2xgIGV4dGVuc2lvbi5cclxuICogVGhpcyBpcyBhIG1vcmUgZmFzdGVyIGFuZCBhY2N1cmF0ZSB2ZXJzaW9uIHRoYW4gbG9nYXJpdGhtaWMgZGVwdGggYnVmZmVyLlxyXG4gKiovXHJcblxyXG4vKipcclxuICogV2ViR0xSZW5kZXJlciBDYXBhYmlsaXRpZXMuXHJcbiAqXHJcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFdlYkdMUmVuZGVyZXJ+Q2FwYWJpbGl0aWVzXHJcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGdldE1heEFuaXNvdHJvcHkgLSBSZXR1cm5zIHRoZSBtYXhpbXVtIGF2YWlsYWJsZSBhbmlzb3Ryb3B5LlxyXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBnZXRNYXhQcmVjaXNpb24gLSBSZXR1cm5zIHRoZSBtYXhpbXVtIGF2YWlsYWJsZSBwcmVjaXNpb24gZm9yIHZlcnRleCBhbmQgZnJhZ21lbnQgc2hhZGVycy5cclxuICogQHByb3BlcnR5IHtib29sZWFufSBsb2dhcml0aG1pY0RlcHRoQnVmZmVyIC0gYHRydWVgIGlmIGBsb2dhcml0aG1pY0RlcHRoQnVmZmVyYCB3YXMgc2V0IHRvIGB0cnVlYCBpbiB0aGUgY29uc3RydWN0b3IuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBtYXhBdHRyaWJ1dGVzIC0gVGhlIG51bWJlciBvZiBzaGFkZXIgYXR0cmlidXRlcyB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRoZSB2ZXJ0ZXggc2hhZGVyLlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gbWF4Q3ViZW1hcFNpemUgLSBNYXhpbXVtIGhlaWdodCAqIHdpZHRoIG9mIGN1YmUgbWFwIHRleHR1cmVzIHRoYXQgYSBzaGFkZXIgY2FuIHVzZS5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IG1heEZyYWdtZW50VW5pZm9ybXMgLSBUaGUgbnVtYmVyIG9mIHVuaWZvcm1zIHRoYXQgY2FuIGJlIHVzZWQgYnkgYSBmcmFnbWVudCBzaGFkZXIuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBtYXhTYW1wbGVzIC0gTWF4aW11bSBudW1iZXIgb2Ygc2FtcGxlcyBpbiBjb250ZXh0IG9mIE11bHRpc2FtcGxlIGFudGktYWxpYXNpbmcgKE1TQUEpLlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gbWF4VGV4dHVyZXMgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGV4dHVyZXMgdGhhdCBjYW4gYmUgdXNlZCBieSBhIHNoYWRlci5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IG1heFRleHR1cmVTaXplIC0gTWF4aW11bSBoZWlnaHQgKiB3aWR0aCBvZiBhIHRleHR1cmUgdGhhdCBhIHNoYWRlciB1c2UuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBtYXhWYXJ5aW5ncyAtIFRoZSBudW1iZXIgb2YgdmFyeWluZyB2ZWN0b3JzIHRoYXQgY2FuIHVzZWQgYnkgc2hhZGVycy5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IG1heFZlcnRleFRleHR1cmVzIC0gVGhlIG51bWJlciBvZiB0ZXh0dXJlcyB0aGF0IGNhbiBiZSB1c2VkIGluIGEgdmVydGV4IHNoYWRlci5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IG1heFZlcnRleFVuaWZvcm1zIC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIHVuaWZvcm1zIHRoYXQgY2FuIGJlIHVzZWQgaW4gYSB2ZXJ0ZXggc2hhZGVyLlxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcHJlY2lzaW9uIC0gVGhlIHNoYWRlciBwcmVjaXNpb24gY3VycmVudGx5IGJlaW5nIHVzZWQgYnkgdGhlIHJlbmRlcmVyLlxyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHJldmVyc2VEZXB0aEJ1ZmZlciAtIGB0cnVlYCBpZiBgcmV2ZXJzZURlcHRoQnVmZmVyYCB3YXMgc2V0IHRvIGB0cnVlYCBpbiB0aGUgY29uc3RydWN0b3JcclxuICogYW5kIHRoZSByZW5kZXJpbmcgY29udGV4dCBzdXBwb3J0cyBgRVhUX2NsaXBfY29udHJvbGAuXHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdmVydGV4VGV4dHVyZXMgLSBgdHJ1ZWAgaWYgdmVydGV4IHRleHR1cmVzIGNhbiBiZSB1c2VkLlxyXG4gKiovXHJcblxyXG4vKipcclxuICogV2ViR0xSZW5kZXJlciBJbmZvIE1lbW9yeVxyXG4gKlxyXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBXZWJHTFJlbmRlcmVyfkluZm9NZW1vcnlcclxuICogQHByb3BlcnR5IHtudW1iZXJ9IGdlb21ldHJpZXMgLSBUaGUgbnVtYmVyIG9mIGFjdGl2ZSBnZW9tZXRyaWVzLlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gdGV4dHVyZXMgLSBUaGUgbnVtYmVyIG9mIGFjdGl2ZSB0ZXh0dXJlcy5cclxuICoqL1xyXG5cclxuLyoqXHJcbiAqIFdlYkdMUmVuZGVyZXIgSW5mbyBSZW5kZXJcclxuICpcclxuICogQHR5cGVkZWYge09iamVjdH0gV2ViR0xSZW5kZXJlcn5JbmZvUmVuZGVyXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBmcmFtZSAtIFRoZSBmcmFtZSBJRC5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IGNhbGxzIC0gVGhlIG51bWJlciBvZiBkcmF3IGNhbGxzIHBlciBmcmFtZS5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IHRyaWFuZ2xlcyAtIFRoZSBudW1iZXIgb2YgcmVuZGVyZWQgdHJpYW5nbGVzIHByaW1pdGl2ZXMgcGVyIGZyYW1lLlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gcG9pbnRzIC0gVGhlIG51bWJlciBvZiByZW5kZXJlZCBwb2ludHMgcHJpbWl0aXZlcyBwZXIgZnJhbWUuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsaW5lcyAtIFRoZSBudW1iZXIgb2YgcmVuZGVyZWQgbGluZXMgcHJpbWl0aXZlcyBwZXIgZnJhbWUuXHJcbiAqKi9cclxuXHJcbi8qKlxyXG4gKiBXZWJHTFJlbmRlcmVyIEluZm9cclxuICpcclxuICogQHR5cGVkZWYge09iamVjdH0gV2ViR0xSZW5kZXJlcn5JbmZvXHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2F1dG9SZXNldD10cnVlXSAtIFdoZXRoZXIgdG8gYXV0b21hdGljYWxseSByZXNldCB0aGUgaW5mbyBieSB0aGUgcmVuZGVyZXIgb3Igbm90LlxyXG4gKiBAcHJvcGVydHkge1dlYkdMUmVuZGVyZXJ+SW5mb01lbW9yeX0gbWVtb3J5IC0gSW5mb3JtYXRpb24gYWJvdXQgYWxsb2NhdGVkIG9iamVjdHMuXHJcbiAqIEBwcm9wZXJ0eSB7V2ViR0xSZW5kZXJlcn5JbmZvUmVuZGVyfSByZW5kZXIgLSBJbmZvcm1hdGlvbiBhYm91dCByZW5kZXJlZCBvYmplY3RzLlxyXG4gKiBAcHJvcGVydHkgez9BcnJheTxXZWJHTFByb2dyYW0+fSBwcm9ncmFtcyAtIEFuIGFycmF5IGBXZWJHTFByb2dyYW1gcyB1c2VkIGZvciByZW5kZXJpbmcuXHJcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IHJlc2V0IC0gUmVzZXRzIHRoZSBpbmZvIG9iamVjdCBmb3IgdGhlIG5leHQgZnJhbWUuXHJcbiAqKi9cclxuXHJcbi8qKlxyXG4gKiBXZWJHTFJlbmRlcmVyIFNoYWRvdyBNYXAuXHJcbiAqXHJcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFdlYkdMUmVuZGVyZXJ+U2hhZG93TWFwXHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2VuYWJsZWQ9ZmFsc2VdIC0gSWYgc2V0IHRvIGB0cnVlYCwgdXNlIHNoYWRvdyBtYXBzIGluIHRoZSBzY2VuZS5cclxuICogQHByb3BlcnR5IHtib29sZWFufSBbYXV0b1VwZGF0ZT10cnVlXSAtIEVuYWJsZXMgYXV0b21hdGljIHVwZGF0ZXMgdG8gdGhlIHNoYWRvd3MgaW4gdGhlIHNjZW5lLlxyXG4gKiBJZiB5b3UgZG8gbm90IHJlcXVpcmUgZHluYW1pYyBsaWdodGluZyAvIHNoYWRvd3MsIHlvdSBtYXkgc2V0IHRoaXMgdG8gYGZhbHNlYC5cclxuICogQHByb3BlcnR5IHtib29sZWFufSBbbmVlZHNVcGRhdGU9ZmFsc2VdIC0gV2hlbiBzZXQgdG8gYHRydWVgLCBzaGFkb3cgbWFwcyBpbiB0aGUgc2NlbmVcclxuICogd2lsbCBiZSB1cGRhdGVkIGluIHRoZSBuZXh0IGByZW5kZXJgIGNhbGwuXHJcbiAqIEBwcm9wZXJ0eSB7KEJhc2ljU2hhZG93TWFwfFBDRlNoYWRvd01hcHxQQ0ZTb2Z0U2hhZG93TWFwfFZTTVNoYWRvd01hcCl9IFt0eXBlPVBDRlNoYWRvd01hcF0gLSBEZWZpbmVzIHRoZSBzaGFkb3cgbWFwIHR5cGUuXHJcbiAqKi9cclxuXHJcbmV4cG9ydCB7IFdlYkdMUmVuZGVyZXIgfTtcclxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDQTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ0E7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ0E7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNBO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZtREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0s7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOXNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbGtCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FDMUxBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0cUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5aENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeDZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3h1Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNud0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuWUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdm9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDenZDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3YkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNrREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzk3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4K0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcFBBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeC9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzNUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoZUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyTkE7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDSzs7QUM1R0w7O0FDQUE7O0FDTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6T0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkxBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RhQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9KQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1UkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1VEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMVZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6WEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JZQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNVBBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbG1EQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDalVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOU5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3UEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25VQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUMzSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1UkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9UQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5TkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0VUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2VkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pLQTtBQUNBO0FBQ0E7QUFDQTtBQUNlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBOEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNycEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3MkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDNUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaGFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5Z0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25aQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6VEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbFlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzllQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMVRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5a0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDam1CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDSzs7QUN2Ukw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25FQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbktBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9HQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL1VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3REQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkxBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOXNDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaE5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbHdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3WEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbHhCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDclpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4NUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2gxQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaFFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2WEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0lBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25IQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9TQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25GQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6V0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckxBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyT0E7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7QUFZQTtBQUNBOztBQ2JBO0FBZ0JBO0FBQ0E7O0FDakJBO0FBZ0JBO0FBQ0E7O0FDakJBO0FBNENBO0FBQ0E7O0FDN0NBO0FBMENBO0FBQ0E7O0FDM0NBO0FBY0E7QUFDQTs7QUNmQTtBQStCQTtBQUNBOztBQ2hDQTtBQTJDQTtBQUNBOztBQzVDQTtBQW1EQTtBQUNBOztBQ3BEQTtBQStDQTtBQUNBOztBQ2hEQTtBQWdEQTtBQUNBOztBQ2pEQTtBQW1EQTtBQUNBOztBQ3BEQTtBQTREQTtBQUNBOztBQzdEQTtBQWlEQTtBQUNBOztBQ2xEQTtBQWtEQTtBQUNBOztBQ25EQTtBQWdDQTtBQUNBOztBQ2pDQTtBQTBDQTtBQUNBOztBQ21GWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDelFBO0FBQ0s7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1Tks7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6VkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5a0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcDdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkxBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNvQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pqQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDampCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0dBO0FBT0E7QUFDQTs7QUNNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hhQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzF5Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNub0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzEvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1a0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM1VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OyJ9 diff --git a/build/three.core.js b/build/three.core.js index 43bbc26e85cceb..22855611888686 100644 --- a/build/three.core.js +++ b/build/three.core.js @@ -3,7 +3,7 @@ * Copyright 2010-2025 Three.js Authors * SPDX-License-Identifier: MIT */ -const REVISION = '175'; +const REVISION = '176dev'; /** * Represents mouse buttons and interaction types in context of controls. @@ -57360,3 +57360,4 @@ if ( typeof window !== 'undefined' ) { } export { ACESFilmicToneMapping, AddEquation, AddOperation, AdditiveAnimationBlendMode, AdditiveBlending, AgXToneMapping, AlphaFormat, AlwaysCompare, AlwaysDepth, AlwaysStencilFunc, AmbientLight, AnimationAction, AnimationClip, AnimationLoader, AnimationMixer, AnimationObjectGroup, AnimationUtils, ArcCurve, ArrayCamera, ArrowHelper, AttachedBindMode, Audio, AudioAnalyser, AudioContext, AudioListener, AudioLoader, AxesHelper, BackSide, BasicDepthPacking, BasicShadowMap, BatchedMesh, Bone, BooleanKeyframeTrack, Box2, Box3, Box3Helper, BoxGeometry, BoxHelper, BufferAttribute, BufferGeometry, BufferGeometryLoader, ByteType, Cache, Camera, CameraHelper, CanvasTexture, CapsuleGeometry, CatmullRomCurve3, CineonToneMapping, CircleGeometry, ClampToEdgeWrapping, Clock, Color, ColorKeyframeTrack, ColorManagement, CompressedArrayTexture, CompressedCubeTexture, CompressedTexture, CompressedTextureLoader, ConeGeometry, ConstantAlphaFactor, ConstantColorFactor, Controls, CubeCamera, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeTextureLoader, CubeUVReflectionMapping, CubicBezierCurve, CubicBezierCurve3, CubicInterpolant, CullFaceBack, CullFaceFront, CullFaceFrontBack, CullFaceNone, Curve, CurvePath, CustomBlending, CustomToneMapping, CylinderGeometry, Cylindrical, Data3DTexture, DataArrayTexture, DataTexture, DataTextureLoader, DataUtils, DecrementStencilOp, DecrementWrapStencilOp, DefaultLoadingManager, DepthFormat, DepthStencilFormat, DepthTexture, DetachedBindMode, DirectionalLight, DirectionalLightHelper, DiscreteInterpolant, DodecahedronGeometry, DoubleSide, DstAlphaFactor, DstColorFactor, DynamicCopyUsage, DynamicDrawUsage, DynamicReadUsage, EdgesGeometry, EllipseCurve, EqualCompare, EqualDepth, EqualStencilFunc, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, ExtrudeGeometry, FileLoader, Float16BufferAttribute, Float32BufferAttribute, FloatType, Fog, FogExp2, FramebufferTexture, FrontSide, Frustum, GLBufferAttribute, GLSL1, GLSL3, GreaterCompare, GreaterDepth, GreaterEqualCompare, GreaterEqualDepth, GreaterEqualStencilFunc, GreaterStencilFunc, GridHelper, Group, HalfFloatType, HemisphereLight, HemisphereLightHelper, IcosahedronGeometry, ImageBitmapLoader, ImageLoader, ImageUtils, IncrementStencilOp, IncrementWrapStencilOp, InstancedBufferAttribute, InstancedBufferGeometry, InstancedInterleavedBuffer, InstancedMesh, Int16BufferAttribute, Int32BufferAttribute, Int8BufferAttribute, IntType, InterleavedBuffer, InterleavedBufferAttribute, Interpolant, InterpolateDiscrete, InterpolateLinear, InterpolateSmooth, InvertStencilOp, KeepStencilOp, KeyframeTrack, LOD, LatheGeometry, Layers, LessCompare, LessDepth, LessEqualCompare, LessEqualDepth, LessEqualStencilFunc, LessStencilFunc, Light, LightProbe, Line, Line3, LineBasicMaterial, LineCurve, LineCurve3, LineDashedMaterial, LineLoop, LineSegments, LinearFilter, LinearInterpolant, LinearMipMapLinearFilter, LinearMipMapNearestFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, LinearSRGBColorSpace, LinearToneMapping, LinearTransfer, Loader, LoaderUtils, LoadingManager, LoopOnce, LoopPingPong, LoopRepeat, LuminanceAlphaFormat, LuminanceFormat, MOUSE, Material, MaterialLoader, MathUtils, Matrix2, Matrix3, Matrix4, MaxEquation, Mesh, MeshBasicMaterial, MeshDepthMaterial, MeshDistanceMaterial, MeshLambertMaterial, MeshMatcapMaterial, MeshNormalMaterial, MeshPhongMaterial, MeshPhysicalMaterial, MeshStandardMaterial, MeshToonMaterial, MinEquation, MirroredRepeatWrapping, MixOperation, MultiplyBlending, MultiplyOperation, NearestFilter, NearestMipMapLinearFilter, NearestMipMapNearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NeutralToneMapping, NeverCompare, NeverDepth, NeverStencilFunc, NoBlending, NoColorSpace, NoToneMapping, NormalAnimationBlendMode, NormalBlending, NotEqualCompare, NotEqualDepth, NotEqualStencilFunc, NumberKeyframeTrack, Object3D, ObjectLoader, ObjectSpaceNormalMap, OctahedronGeometry, OneFactor, OneMinusConstantAlphaFactor, OneMinusConstantColorFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OrthographicCamera, PCFShadowMap, PCFSoftShadowMap, Path, PerspectiveCamera, Plane, PlaneGeometry, PlaneHelper, PointLight, PointLightHelper, Points, PointsMaterial, PolarGridHelper, PolyhedronGeometry, PositionalAudio, PropertyBinding, PropertyMixer, QuadraticBezierCurve, QuadraticBezierCurve3, Quaternion, QuaternionKeyframeTrack, QuaternionLinearInterpolant, RAD2DEG, RED_GREEN_RGTC2_Format, RED_RGTC1_Format, REVISION, RGBADepthPacking, RGBAFormat, RGBAIntegerFormat, RGBA_ASTC_10x10_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_BPTC_Format, RGBA_ETC2_EAC_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGBDepthPacking, RGBFormat, RGBIntegerFormat, RGB_BPTC_SIGNED_Format, RGB_BPTC_UNSIGNED_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGB_S3TC_DXT1_Format, RGDepthPacking, RGFormat, RGIntegerFormat, RawShaderMaterial, Ray, Raycaster, RectAreaLight, RedFormat, RedIntegerFormat, ReinhardToneMapping, RenderTarget, RenderTarget3D, RenderTargetArray, RepeatWrapping, ReplaceStencilOp, ReverseSubtractEquation, RingGeometry, SIGNED_RED_GREEN_RGTC2_Format, SIGNED_RED_RGTC1_Format, SRGBColorSpace, SRGBTransfer, Scene, ShaderMaterial, ShadowMaterial, Shape, ShapeGeometry, ShapePath, ShapeUtils, ShortType, Skeleton, SkeletonHelper, SkinnedMesh, Source, Sphere, SphereGeometry, Spherical, SphericalHarmonics3, SplineCurve, SpotLight, SpotLightHelper, Sprite, SpriteMaterial, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, StaticCopyUsage, StaticDrawUsage, StaticReadUsage, StereoCamera, StreamCopyUsage, StreamDrawUsage, StreamReadUsage, StringKeyframeTrack, SubtractEquation, SubtractiveBlending, TOUCH, TangentSpaceNormalMap, TetrahedronGeometry, Texture, TextureLoader, TextureUtils, TimestampQuery, TorusGeometry, TorusKnotGeometry, Triangle, TriangleFanDrawMode, TriangleStripDrawMode, TrianglesDrawMode, TubeGeometry, UVMapping, Uint16BufferAttribute, Uint32BufferAttribute, Uint8BufferAttribute, Uint8ClampedBufferAttribute, Uniform, UniformsGroup, UniformsUtils, UnsignedByteType, UnsignedInt248Type, UnsignedInt5999Type, UnsignedIntType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShortType, VSMShadowMap, Vector2, Vector3, Vector4, VectorKeyframeTrack, VideoFrameTexture, VideoTexture, WebGL3DRenderTarget, WebGLArrayRenderTarget, WebGLCoordinateSystem, WebGLCubeRenderTarget, WebGLRenderTarget, WebGPUCoordinateSystem, WebXRController, WireframeGeometry, WrapAroundEnding, ZeroCurvatureEnding, ZeroFactor, ZeroSlopeEnding, ZeroStencilOp, arrayNeedsUint32, cloneUniforms, createCanvasElement, createElementNS, getByteLength, getUnlitUniformColorSpace, mergeUniforms, probeAsync, toNormalizedProjectionMatrix, toReversedProjectionMatrix, warnOnce }; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhyZWUuY29yZS5qcyIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnN0YW50cy5qcyIsIi4uL3NyYy9jb3JlL0V2ZW50RGlzcGF0Y2hlci5qcyIsIi4uL3NyYy9tYXRoL01hdGhVdGlscy5qcyIsIi4uL3NyYy9tYXRoL1ZlY3RvcjIuanMiLCIuLi9zcmMvbWF0aC9NYXRyaXgzLmpzIiwiLi4vc3JjL3V0aWxzLmpzIiwiLi4vc3JjL21hdGgvQ29sb3JNYW5hZ2VtZW50LmpzIiwiLi4vc3JjL2V4dHJhcy9JbWFnZVV0aWxzLmpzIiwiLi4vc3JjL3RleHR1cmVzL1NvdXJjZS5qcyIsIi4uL3NyYy90ZXh0dXJlcy9UZXh0dXJlLmpzIiwiLi4vc3JjL21hdGgvVmVjdG9yNC5qcyIsIi4uL3NyYy9jb3JlL1JlbmRlclRhcmdldC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvV2ViR0xSZW5kZXJUYXJnZXQuanMiLCIuLi9zcmMvdGV4dHVyZXMvRGF0YUFycmF5VGV4dHVyZS5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvV2ViR0xBcnJheVJlbmRlclRhcmdldC5qcyIsIi4uL3NyYy90ZXh0dXJlcy9EYXRhM0RUZXh0dXJlLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9XZWJHTDNEUmVuZGVyVGFyZ2V0LmpzIiwiLi4vc3JjL21hdGgvUXVhdGVybmlvbi5qcyIsIi4uL3NyYy9tYXRoL1ZlY3RvcjMuanMiLCIuLi9zcmMvbWF0aC9Cb3gzLmpzIiwiLi4vc3JjL21hdGgvU3BoZXJlLmpzIiwiLi4vc3JjL21hdGgvUmF5LmpzIiwiLi4vc3JjL21hdGgvTWF0cml4NC5qcyIsIi4uL3NyYy9tYXRoL0V1bGVyLmpzIiwiLi4vc3JjL2NvcmUvTGF5ZXJzLmpzIiwiLi4vc3JjL2NvcmUvT2JqZWN0M0QuanMiLCIuLi9zcmMvbWF0aC9UcmlhbmdsZS5qcyIsIi4uL3NyYy9tYXRoL0NvbG9yLmpzIiwiLi4vc3JjL21hdGVyaWFscy9NYXRlcmlhbC5qcyIsIi4uL3NyYy9tYXRlcmlhbHMvTWVzaEJhc2ljTWF0ZXJpYWwuanMiLCIuLi9zcmMvZXh0cmFzL0RhdGFVdGlscy5qcyIsIi4uL3NyYy9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyIsIi4uL3NyYy9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzIiwiLi4vc3JjL29iamVjdHMvTWVzaC5qcyIsIi4uL3NyYy9nZW9tZXRyaWVzL0JveEdlb21ldHJ5LmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1VuaWZvcm1zVXRpbHMuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvZGVmYXVsdF92ZXJ0ZXguZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9kZWZhdWx0X2ZyYWdtZW50Lmdsc2wuanMiLCIuLi9zcmMvbWF0ZXJpYWxzL1NoYWRlck1hdGVyaWFsLmpzIiwiLi4vc3JjL2NhbWVyYXMvQ2FtZXJhLmpzIiwiLi4vc3JjL2NhbWVyYXMvUGVyc3BlY3RpdmVDYW1lcmEuanMiLCIuLi9zcmMvY2FtZXJhcy9DdWJlQ2FtZXJhLmpzIiwiLi4vc3JjL3RleHR1cmVzL0N1YmVUZXh0dXJlLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9XZWJHTEN1YmVSZW5kZXJUYXJnZXQuanMiLCIuLi9zcmMvb2JqZWN0cy9Hcm91cC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2VieHIvV2ViWFJDb250cm9sbGVyLmpzIiwiLi4vc3JjL3NjZW5lcy9Gb2dFeHAyLmpzIiwiLi4vc3JjL3NjZW5lcy9Gb2cuanMiLCIuLi9zcmMvc2NlbmVzL1NjZW5lLmpzIiwiLi4vc3JjL2NvcmUvSW50ZXJsZWF2ZWRCdWZmZXIuanMiLCIuLi9zcmMvY29yZS9JbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZS5qcyIsIi4uL3NyYy9tYXRlcmlhbHMvU3ByaXRlTWF0ZXJpYWwuanMiLCIuLi9zcmMvb2JqZWN0cy9TcHJpdGUuanMiLCIuLi9zcmMvb2JqZWN0cy9MT0QuanMiLCIuLi9zcmMvb2JqZWN0cy9Ta2lubmVkTWVzaC5qcyIsIi4uL3NyYy9vYmplY3RzL0JvbmUuanMiLCIuLi9zcmMvdGV4dHVyZXMvRGF0YVRleHR1cmUuanMiLCIuLi9zcmMvb2JqZWN0cy9Ta2VsZXRvbi5qcyIsIi4uL3NyYy9jb3JlL0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZS5qcyIsIi4uL3NyYy9vYmplY3RzL0luc3RhbmNlZE1lc2guanMiLCIuLi9zcmMvbWF0aC9QbGFuZS5qcyIsIi4uL3NyYy9tYXRoL0ZydXN0dW0uanMiLCIuLi9zcmMvb2JqZWN0cy9CYXRjaGVkTWVzaC5qcyIsIi4uL3NyYy9tYXRlcmlhbHMvTGluZUJhc2ljTWF0ZXJpYWwuanMiLCIuLi9zcmMvb2JqZWN0cy9MaW5lLmpzIiwiLi4vc3JjL29iamVjdHMvTGluZVNlZ21lbnRzLmpzIiwiLi4vc3JjL29iamVjdHMvTGluZUxvb3AuanMiLCIuLi9zcmMvbWF0ZXJpYWxzL1BvaW50c01hdGVyaWFsLmpzIiwiLi4vc3JjL29iamVjdHMvUG9pbnRzLmpzIiwiLi4vc3JjL3RleHR1cmVzL1ZpZGVvVGV4dHVyZS5qcyIsIi4uL3NyYy90ZXh0dXJlcy9WaWRlb0ZyYW1lVGV4dHVyZS5qcyIsIi4uL3NyYy90ZXh0dXJlcy9GcmFtZWJ1ZmZlclRleHR1cmUuanMiLCIuLi9zcmMvdGV4dHVyZXMvQ29tcHJlc3NlZFRleHR1cmUuanMiLCIuLi9zcmMvdGV4dHVyZXMvQ29tcHJlc3NlZEFycmF5VGV4dHVyZS5qcyIsIi4uL3NyYy90ZXh0dXJlcy9Db21wcmVzc2VkQ3ViZVRleHR1cmUuanMiLCIuLi9zcmMvdGV4dHVyZXMvQ2FudmFzVGV4dHVyZS5qcyIsIi4uL3NyYy90ZXh0dXJlcy9EZXB0aFRleHR1cmUuanMiLCIuLi9zcmMvZXh0cmFzL2NvcmUvQ3VydmUuanMiLCIuLi9zcmMvZXh0cmFzL2N1cnZlcy9FbGxpcHNlQ3VydmUuanMiLCIuLi9zcmMvZXh0cmFzL2N1cnZlcy9BcmNDdXJ2ZS5qcyIsIi4uL3NyYy9leHRyYXMvY3VydmVzL0NhdG11bGxSb21DdXJ2ZTMuanMiLCIuLi9zcmMvZXh0cmFzL2NvcmUvSW50ZXJwb2xhdGlvbnMuanMiLCIuLi9zcmMvZXh0cmFzL2N1cnZlcy9DdWJpY0JlemllckN1cnZlLmpzIiwiLi4vc3JjL2V4dHJhcy9jdXJ2ZXMvQ3ViaWNCZXppZXJDdXJ2ZTMuanMiLCIuLi9zcmMvZXh0cmFzL2N1cnZlcy9MaW5lQ3VydmUuanMiLCIuLi9zcmMvZXh0cmFzL2N1cnZlcy9MaW5lQ3VydmUzLmpzIiwiLi4vc3JjL2V4dHJhcy9jdXJ2ZXMvUXVhZHJhdGljQmV6aWVyQ3VydmUuanMiLCIuLi9zcmMvZXh0cmFzL2N1cnZlcy9RdWFkcmF0aWNCZXppZXJDdXJ2ZTMuanMiLCIuLi9zcmMvZXh0cmFzL2N1cnZlcy9TcGxpbmVDdXJ2ZS5qcyIsIi4uL3NyYy9leHRyYXMvY29yZS9DdXJ2ZVBhdGguanMiLCIuLi9zcmMvZXh0cmFzL2NvcmUvUGF0aC5qcyIsIi4uL3NyYy9nZW9tZXRyaWVzL0xhdGhlR2VvbWV0cnkuanMiLCIuLi9zcmMvZ2VvbWV0cmllcy9DYXBzdWxlR2VvbWV0cnkuanMiLCIuLi9zcmMvZ2VvbWV0cmllcy9DaXJjbGVHZW9tZXRyeS5qcyIsIi4uL3NyYy9nZW9tZXRyaWVzL0N5bGluZGVyR2VvbWV0cnkuanMiLCIuLi9zcmMvZ2VvbWV0cmllcy9Db25lR2VvbWV0cnkuanMiLCIuLi9zcmMvZ2VvbWV0cmllcy9Qb2x5aGVkcm9uR2VvbWV0cnkuanMiLCIuLi9zcmMvZ2VvbWV0cmllcy9Eb2RlY2FoZWRyb25HZW9tZXRyeS5qcyIsIi4uL3NyYy9nZW9tZXRyaWVzL0VkZ2VzR2VvbWV0cnkuanMiLCIuLi9zcmMvZXh0cmFzL2NvcmUvU2hhcGUuanMiLCIuLi9zcmMvZXh0cmFzL2xpYi9lYXJjdXQuanMiLCIuLi9zcmMvZXh0cmFzL0VhcmN1dC5qcyIsIi4uL3NyYy9leHRyYXMvU2hhcGVVdGlscy5qcyIsIi4uL3NyYy9nZW9tZXRyaWVzL0V4dHJ1ZGVHZW9tZXRyeS5qcyIsIi4uL3NyYy9nZW9tZXRyaWVzL0ljb3NhaGVkcm9uR2VvbWV0cnkuanMiLCIuLi9zcmMvZ2VvbWV0cmllcy9PY3RhaGVkcm9uR2VvbWV0cnkuanMiLCIuLi9zcmMvZ2VvbWV0cmllcy9QbGFuZUdlb21ldHJ5LmpzIiwiLi4vc3JjL2dlb21ldHJpZXMvUmluZ0dlb21ldHJ5LmpzIiwiLi4vc3JjL2dlb21ldHJpZXMvU2hhcGVHZW9tZXRyeS5qcyIsIi4uL3NyYy9nZW9tZXRyaWVzL1NwaGVyZUdlb21ldHJ5LmpzIiwiLi4vc3JjL2dlb21ldHJpZXMvVGV0cmFoZWRyb25HZW9tZXRyeS5qcyIsIi4uL3NyYy9nZW9tZXRyaWVzL1RvcnVzR2VvbWV0cnkuanMiLCIuLi9zcmMvZ2VvbWV0cmllcy9Ub3J1c0tub3RHZW9tZXRyeS5qcyIsIi4uL3NyYy9nZW9tZXRyaWVzL1R1YmVHZW9tZXRyeS5qcyIsIi4uL3NyYy9nZW9tZXRyaWVzL1dpcmVmcmFtZUdlb21ldHJ5LmpzIiwiLi4vc3JjL21hdGVyaWFscy9TaGFkb3dNYXRlcmlhbC5qcyIsIi4uL3NyYy9tYXRlcmlhbHMvUmF3U2hhZGVyTWF0ZXJpYWwuanMiLCIuLi9zcmMvbWF0ZXJpYWxzL01lc2hTdGFuZGFyZE1hdGVyaWFsLmpzIiwiLi4vc3JjL21hdGVyaWFscy9NZXNoUGh5c2ljYWxNYXRlcmlhbC5qcyIsIi4uL3NyYy9tYXRlcmlhbHMvTWVzaFBob25nTWF0ZXJpYWwuanMiLCIuLi9zcmMvbWF0ZXJpYWxzL01lc2hUb29uTWF0ZXJpYWwuanMiLCIuLi9zcmMvbWF0ZXJpYWxzL01lc2hOb3JtYWxNYXRlcmlhbC5qcyIsIi4uL3NyYy9tYXRlcmlhbHMvTWVzaExhbWJlcnRNYXRlcmlhbC5qcyIsIi4uL3NyYy9tYXRlcmlhbHMvTWVzaERlcHRoTWF0ZXJpYWwuanMiLCIuLi9zcmMvbWF0ZXJpYWxzL01lc2hEaXN0YW5jZU1hdGVyaWFsLmpzIiwiLi4vc3JjL21hdGVyaWFscy9NZXNoTWF0Y2FwTWF0ZXJpYWwuanMiLCIuLi9zcmMvbWF0ZXJpYWxzL0xpbmVEYXNoZWRNYXRlcmlhbC5qcyIsIi4uL3NyYy9hbmltYXRpb24vQW5pbWF0aW9uVXRpbHMuanMiLCIuLi9zcmMvbWF0aC9JbnRlcnBvbGFudC5qcyIsIi4uL3NyYy9tYXRoL2ludGVycG9sYW50cy9DdWJpY0ludGVycG9sYW50LmpzIiwiLi4vc3JjL21hdGgvaW50ZXJwb2xhbnRzL0xpbmVhckludGVycG9sYW50LmpzIiwiLi4vc3JjL21hdGgvaW50ZXJwb2xhbnRzL0Rpc2NyZXRlSW50ZXJwb2xhbnQuanMiLCIuLi9zcmMvYW5pbWF0aW9uL0tleWZyYW1lVHJhY2suanMiLCIuLi9zcmMvYW5pbWF0aW9uL3RyYWNrcy9Cb29sZWFuS2V5ZnJhbWVUcmFjay5qcyIsIi4uL3NyYy9hbmltYXRpb24vdHJhY2tzL0NvbG9yS2V5ZnJhbWVUcmFjay5qcyIsIi4uL3NyYy9hbmltYXRpb24vdHJhY2tzL051bWJlcktleWZyYW1lVHJhY2suanMiLCIuLi9zcmMvbWF0aC9pbnRlcnBvbGFudHMvUXVhdGVybmlvbkxpbmVhckludGVycG9sYW50LmpzIiwiLi4vc3JjL2FuaW1hdGlvbi90cmFja3MvUXVhdGVybmlvbktleWZyYW1lVHJhY2suanMiLCIuLi9zcmMvYW5pbWF0aW9uL3RyYWNrcy9TdHJpbmdLZXlmcmFtZVRyYWNrLmpzIiwiLi4vc3JjL2FuaW1hdGlvbi90cmFja3MvVmVjdG9yS2V5ZnJhbWVUcmFjay5qcyIsIi4uL3NyYy9hbmltYXRpb24vQW5pbWF0aW9uQ2xpcC5qcyIsIi4uL3NyYy9sb2FkZXJzL0NhY2hlLmpzIiwiLi4vc3JjL2xvYWRlcnMvTG9hZGluZ01hbmFnZXIuanMiLCIuLi9zcmMvbG9hZGVycy9Mb2FkZXIuanMiLCIuLi9zcmMvbG9hZGVycy9GaWxlTG9hZGVyLmpzIiwiLi4vc3JjL2xvYWRlcnMvQW5pbWF0aW9uTG9hZGVyLmpzIiwiLi4vc3JjL2xvYWRlcnMvQ29tcHJlc3NlZFRleHR1cmVMb2FkZXIuanMiLCIuLi9zcmMvbG9hZGVycy9JbWFnZUxvYWRlci5qcyIsIi4uL3NyYy9sb2FkZXJzL0N1YmVUZXh0dXJlTG9hZGVyLmpzIiwiLi4vc3JjL2xvYWRlcnMvRGF0YVRleHR1cmVMb2FkZXIuanMiLCIuLi9zcmMvbG9hZGVycy9UZXh0dXJlTG9hZGVyLmpzIiwiLi4vc3JjL2xpZ2h0cy9MaWdodC5qcyIsIi4uL3NyYy9saWdodHMvSGVtaXNwaGVyZUxpZ2h0LmpzIiwiLi4vc3JjL2xpZ2h0cy9MaWdodFNoYWRvdy5qcyIsIi4uL3NyYy9saWdodHMvU3BvdExpZ2h0U2hhZG93LmpzIiwiLi4vc3JjL2xpZ2h0cy9TcG90TGlnaHQuanMiLCIuLi9zcmMvbGlnaHRzL1BvaW50TGlnaHRTaGFkb3cuanMiLCIuLi9zcmMvbGlnaHRzL1BvaW50TGlnaHQuanMiLCIuLi9zcmMvY2FtZXJhcy9PcnRob2dyYXBoaWNDYW1lcmEuanMiLCIuLi9zcmMvbGlnaHRzL0RpcmVjdGlvbmFsTGlnaHRTaGFkb3cuanMiLCIuLi9zcmMvbGlnaHRzL0RpcmVjdGlvbmFsTGlnaHQuanMiLCIuLi9zcmMvbGlnaHRzL0FtYmllbnRMaWdodC5qcyIsIi4uL3NyYy9saWdodHMvUmVjdEFyZWFMaWdodC5qcyIsIi4uL3NyYy9tYXRoL1NwaGVyaWNhbEhhcm1vbmljczMuanMiLCIuLi9zcmMvbGlnaHRzL0xpZ2h0UHJvYmUuanMiLCIuLi9zcmMvbG9hZGVycy9NYXRlcmlhbExvYWRlci5qcyIsIi4uL3NyYy9sb2FkZXJzL0xvYWRlclV0aWxzLmpzIiwiLi4vc3JjL2NvcmUvSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkuanMiLCIuLi9zcmMvbG9hZGVycy9CdWZmZXJHZW9tZXRyeUxvYWRlci5qcyIsIi4uL3NyYy9sb2FkZXJzL09iamVjdExvYWRlci5qcyIsIi4uL3NyYy9sb2FkZXJzL0ltYWdlQml0bWFwTG9hZGVyLmpzIiwiLi4vc3JjL2F1ZGlvL0F1ZGlvQ29udGV4dC5qcyIsIi4uL3NyYy9sb2FkZXJzL0F1ZGlvTG9hZGVyLmpzIiwiLi4vc3JjL2NhbWVyYXMvU3RlcmVvQ2FtZXJhLmpzIiwiLi4vc3JjL2NhbWVyYXMvQXJyYXlDYW1lcmEuanMiLCIuLi9zcmMvY29yZS9DbG9jay5qcyIsIi4uL3NyYy9hdWRpby9BdWRpb0xpc3RlbmVyLmpzIiwiLi4vc3JjL2F1ZGlvL0F1ZGlvLmpzIiwiLi4vc3JjL2F1ZGlvL1Bvc2l0aW9uYWxBdWRpby5qcyIsIi4uL3NyYy9hdWRpby9BdWRpb0FuYWx5c2VyLmpzIiwiLi4vc3JjL2FuaW1hdGlvbi9Qcm9wZXJ0eU1peGVyLmpzIiwiLi4vc3JjL2FuaW1hdGlvbi9Qcm9wZXJ0eUJpbmRpbmcuanMiLCIuLi9zcmMvYW5pbWF0aW9uL0FuaW1hdGlvbk9iamVjdEdyb3VwLmpzIiwiLi4vc3JjL2FuaW1hdGlvbi9BbmltYXRpb25BY3Rpb24uanMiLCIuLi9zcmMvYW5pbWF0aW9uL0FuaW1hdGlvbk1peGVyLmpzIiwiLi4vc3JjL2NvcmUvUmVuZGVyVGFyZ2V0M0QuanMiLCIuLi9zcmMvY29yZS9SZW5kZXJUYXJnZXRBcnJheS5qcyIsIi4uL3NyYy9jb3JlL1VuaWZvcm0uanMiLCIuLi9zcmMvY29yZS9Vbmlmb3Jtc0dyb3VwLmpzIiwiLi4vc3JjL2NvcmUvSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIuanMiLCIuLi9zcmMvY29yZS9HTEJ1ZmZlckF0dHJpYnV0ZS5qcyIsIi4uL3NyYy9jb3JlL1JheWNhc3Rlci5qcyIsIi4uL3NyYy9tYXRoL1NwaGVyaWNhbC5qcyIsIi4uL3NyYy9tYXRoL0N5bGluZHJpY2FsLmpzIiwiLi4vc3JjL21hdGgvTWF0cml4Mi5qcyIsIi4uL3NyYy9tYXRoL0JveDIuanMiLCIuLi9zcmMvbWF0aC9MaW5lMy5qcyIsIi4uL3NyYy9oZWxwZXJzL1Nwb3RMaWdodEhlbHBlci5qcyIsIi4uL3NyYy9oZWxwZXJzL1NrZWxldG9uSGVscGVyLmpzIiwiLi4vc3JjL2hlbHBlcnMvUG9pbnRMaWdodEhlbHBlci5qcyIsIi4uL3NyYy9oZWxwZXJzL0hlbWlzcGhlcmVMaWdodEhlbHBlci5qcyIsIi4uL3NyYy9oZWxwZXJzL0dyaWRIZWxwZXIuanMiLCIuLi9zcmMvaGVscGVycy9Qb2xhckdyaWRIZWxwZXIuanMiLCIuLi9zcmMvaGVscGVycy9EaXJlY3Rpb25hbExpZ2h0SGVscGVyLmpzIiwiLi4vc3JjL2hlbHBlcnMvQ2FtZXJhSGVscGVyLmpzIiwiLi4vc3JjL2hlbHBlcnMvQm94SGVscGVyLmpzIiwiLi4vc3JjL2hlbHBlcnMvQm94M0hlbHBlci5qcyIsIi4uL3NyYy9oZWxwZXJzL1BsYW5lSGVscGVyLmpzIiwiLi4vc3JjL2hlbHBlcnMvQXJyb3dIZWxwZXIuanMiLCIuLi9zcmMvaGVscGVycy9BeGVzSGVscGVyLmpzIiwiLi4vc3JjL2V4dHJhcy9jb3JlL1NoYXBlUGF0aC5qcyIsIi4uL3NyYy9leHRyYXMvQ29udHJvbHMuanMiLCIuLi9zcmMvZXh0cmFzL1RleHR1cmVVdGlscy5qcyIsIi4uL3NyYy9UaHJlZS5Db3JlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBSRVZJU0lPTiA9ICcxNzZkZXYnO1xyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgbW91c2UgYnV0dG9ucyBhbmQgaW50ZXJhY3Rpb24gdHlwZXMgaW4gY29udGV4dCBvZiBjb250cm9scy5cclxuICpcclxuICogQHR5cGUge0NvbnN0YW50c01vdXNlfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBNT1VTRSA9IHsgTEVGVDogMCwgTUlERExFOiAxLCBSSUdIVDogMiwgUk9UQVRFOiAwLCBET0xMWTogMSwgUEFOOiAyIH07XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyB0b3VjaCBpbnRlcmFjdGlvbiB0eXBlcyBpbiBjb250ZXh0IG9mIGNvbnRyb2xzLlxyXG4gKlxyXG4gKiBAdHlwZSB7Q29uc3RhbnRzVG91Y2h9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFRPVUNIID0geyBST1RBVEU6IDAsIFBBTjogMSwgRE9MTFlfUEFOOiAyLCBET0xMWV9ST1RBVEU6IDMgfTtcclxuXHJcbi8qKlxyXG4gKiBEaXNhYmxlcyBmYWNlIGN1bGxpbmcuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEN1bGxGYWNlTm9uZSA9IDA7XHJcblxyXG4vKipcclxuICogQ3VsbHMgYmFjayBmYWNlcy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgQ3VsbEZhY2VCYWNrID0gMTtcclxuXHJcbi8qKlxyXG4gKiBDdWxscyBmcm9udCBmYWNlcy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgQ3VsbEZhY2VGcm9udCA9IDI7XHJcblxyXG4vKipcclxuICogQ3VsbHMgYm90aCBmcm9udCBhbmQgYmFjayBmYWNlcy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgQ3VsbEZhY2VGcm9udEJhY2sgPSAzO1xyXG5cclxuLyoqXHJcbiAqIEdpdmVzIHVuZmlsdGVyZWQgc2hhZG93IG1hcHMgLSBmYXN0ZXN0LCBidXQgbG93ZXN0IHF1YWxpdHkuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEJhc2ljU2hhZG93TWFwID0gMDtcclxuXHJcbi8qKlxyXG4gKiBGaWx0ZXJzIHNoYWRvdyBtYXBzIHVzaW5nIHRoZSBQZXJjZW50YWdlLUNsb3NlciBGaWx0ZXJpbmcgKFBDRikgYWxnb3JpdGhtLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBQQ0ZTaGFkb3dNYXAgPSAxO1xyXG5cclxuLyoqXHJcbiAqIEZpbHRlcnMgc2hhZG93IG1hcHMgdXNpbmcgdGhlIFBlcmNlbnRhZ2UtQ2xvc2VyIEZpbHRlcmluZyAoUENGKSBhbGdvcml0aG0gd2l0aFxyXG4gKiBiZXR0ZXIgc29mdCBzaGFkb3dzIGVzcGVjaWFsbHkgd2hlbiB1c2luZyBsb3ctcmVzb2x1dGlvbiBzaGFkb3cgbWFwcy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUENGU29mdFNoYWRvd01hcCA9IDI7XHJcblxyXG4vKipcclxuICogRmlsdGVycyBzaGFkb3cgbWFwcyB1c2luZyB0aGUgVmFyaWFuY2UgU2hhZG93IE1hcCAoVlNNKSBhbGdvcml0aG0uXHJcbiAqIFdoZW4gdXNpbmcgVlNNU2hhZG93TWFwIGFsbCBzaGFkb3cgcmVjZWl2ZXJzIHdpbGwgYWxzbyBjYXN0IHNoYWRvd3MuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFZTTVNoYWRvd01hcCA9IDM7XHJcblxyXG4vKipcclxuICogT25seSBmcm9udCBmYWNlcyBhcmUgcmVuZGVyZWQuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEZyb250U2lkZSA9IDA7XHJcblxyXG4vKipcclxuICogT25seSBiYWNrIGZhY2VzIGFyZSByZW5kZXJlZC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgQmFja1NpZGUgPSAxO1xyXG5cclxuLyoqXHJcbiAqIEJvdGggZnJvbnQgYW5kIGJhY2sgZmFjZXMgYXJlIHJlbmRlcmVkLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBEb3VibGVTaWRlID0gMjtcclxuXHJcbi8qKlxyXG4gKiBObyBibGVuZGluZyBpcyBwZXJmb3JtZWQgd2hpY2ggZWZmZWN0aXZlbHkgZGlzYWJsZXNcclxuICogYWxwaGEgdHJhbnNwYXJlbmN5LlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBOb0JsZW5kaW5nID0gMDtcclxuXHJcbi8qKlxyXG4gKiBUaGUgZGVmYXVsdCBibGVuZGluZy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTm9ybWFsQmxlbmRpbmcgPSAxO1xyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgYWRkaXRpdmUgYmxlbmRpbmcuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEFkZGl0aXZlQmxlbmRpbmcgPSAyO1xyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgc3VidHJhY3RpdmUgYmxlbmRpbmcuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFN1YnRyYWN0aXZlQmxlbmRpbmcgPSAzO1xyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgbXVsdGlwbHkgYmxlbmRpbmcuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IE11bHRpcGx5QmxlbmRpbmcgPSA0O1xyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgY3VzdG9tIGJsZW5kaW5nLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBDdXN0b21CbGVuZGluZyA9IDU7XHJcblxyXG4vKipcclxuICogQSBgc291cmNlICsgZGVzdGluYXRpb25gIGJsZW5kaW5nIGVxdWF0aW9uLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBBZGRFcXVhdGlvbiA9IDEwMDtcclxuXHJcbi8qKlxyXG4gKiBBIGBzb3VyY2UgLSBkZXN0aW5hdGlvbmAgYmxlbmRpbmcgZXF1YXRpb24uXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFN1YnRyYWN0RXF1YXRpb24gPSAxMDE7XHJcblxyXG4vKipcclxuICogQSBgZGVzdGluYXRpb24gLSBzb3VyY2VgIGJsZW5kaW5nIGVxdWF0aW9uLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBSZXZlcnNlU3VidHJhY3RFcXVhdGlvbiA9IDEwMjtcclxuXHJcbi8qKlxyXG4gKiBBIGJsZW5kIGVxdWF0aW9uIHRoYXQgdXNlcyB0aGUgbWluaW11bSBvZiBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBNaW5FcXVhdGlvbiA9IDEwMztcclxuXHJcbi8qKlxyXG4gKiBBIGJsZW5kIGVxdWF0aW9uIHRoYXQgdXNlcyB0aGUgbWF4aW11bSBvZiBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBNYXhFcXVhdGlvbiA9IDEwNDtcclxuXHJcbi8qKlxyXG4gKiBNdWx0aXBsaWVzIGFsbCBjb2xvcnMgYnkgYDBgLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBaZXJvRmFjdG9yID0gMjAwO1xyXG5cclxuLyoqXHJcbiAqIE11bHRpcGxpZXMgYWxsIGNvbG9ycyBieSBgMWAuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IE9uZUZhY3RvciA9IDIwMTtcclxuXHJcbi8qKlxyXG4gKiBNdWx0aXBsaWVzIGFsbCBjb2xvcnMgYnkgdGhlIHNvdXJjZSBjb2xvcnMuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFNyY0NvbG9yRmFjdG9yID0gMjAyO1xyXG5cclxuLyoqXHJcbiAqIE11bHRpcGxpZXMgYWxsIGNvbG9ycyBieSBgMWAgbWludXMgZWFjaCBzb3VyY2UgY29sb3IuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IE9uZU1pbnVzU3JjQ29sb3JGYWN0b3IgPSAyMDM7XHJcblxyXG4vKipcclxuICogTXVsdGlwbGllcyBhbGwgY29sb3JzIGJ5IHRoZSBzb3VyY2UgYWxwaGEgdmFsdWUuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFNyY0FscGhhRmFjdG9yID0gMjA0O1xyXG5cclxuLyoqXHJcbiAqIE11bHRpcGxpZXMgYWxsIGNvbG9ycyBieSAxIG1pbnVzIHRoZSBzb3VyY2UgYWxwaGEgdmFsdWUuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IE9uZU1pbnVzU3JjQWxwaGFGYWN0b3IgPSAyMDU7XHJcblxyXG4vKipcclxuICogTXVsdGlwbGllcyBhbGwgY29sb3JzIGJ5IHRoZSBkZXN0aW5hdGlvbiBhbHBoYSB2YWx1ZS5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgRHN0QWxwaGFGYWN0b3IgPSAyMDY7XHJcblxyXG4vKipcclxuICogTXVsdGlwbGllcyBhbGwgY29sb3JzIGJ5IGAxYCBtaW51cyB0aGUgZGVzdGluYXRpb24gYWxwaGEgdmFsdWUuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IE9uZU1pbnVzRHN0QWxwaGFGYWN0b3IgPSAyMDc7XHJcblxyXG4vKipcclxuICogTXVsdGlwbGllcyBhbGwgY29sb3JzIGJ5IHRoZSBkZXN0aW5hdGlvbiBjb2xvci5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgRHN0Q29sb3JGYWN0b3IgPSAyMDg7XHJcblxyXG4vKipcclxuICogTXVsdGlwbGllcyBhbGwgY29sb3JzIGJ5IGAxYCBtaW51cyBlYWNoIGRlc3RpbmF0aW9uIGNvbG9yLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBPbmVNaW51c0RzdENvbG9yRmFjdG9yID0gMjA5O1xyXG5cclxuLyoqXHJcbiAqIE11bHRpcGxpZXMgdGhlIFJHQiBjb2xvcnMgYnkgdGhlIHNtYWxsZXIgb2YgZWl0aGVyIHRoZSBzb3VyY2UgYWxwaGFcclxuICogdmFsdWUgb3IgdGhlIHZhbHVlIG9mIGAxYCBtaW51cyB0aGUgZGVzdGluYXRpb24gYWxwaGEgdmFsdWUuIFRoZSBhbHBoYVxyXG4gKiB2YWx1ZSBpcyBtdWx0aXBsaWVkIGJ5IGAxYC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgU3JjQWxwaGFTYXR1cmF0ZUZhY3RvciA9IDIxMDtcclxuXHJcbi8qKlxyXG4gKiBNdWx0aXBsaWVzIGFsbCBjb2xvcnMgYnkgYSBjb25zdGFudCBjb2xvci5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgQ29uc3RhbnRDb2xvckZhY3RvciA9IDIxMTtcclxuXHJcbi8qKlxyXG4gKiBNdWx0aXBsaWVzIGFsbCBjb2xvcnMgYnkgYDFgIG1pbnVzIGEgY29uc3RhbnQgY29sb3IuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IE9uZU1pbnVzQ29uc3RhbnRDb2xvckZhY3RvciA9IDIxMjtcclxuXHJcbi8qKlxyXG4gKiBNdWx0aXBsaWVzIGFsbCBjb2xvcnMgYnkgYSBjb25zdGFudCBhbHBoYSB2YWx1ZS5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgQ29uc3RhbnRBbHBoYUZhY3RvciA9IDIxMztcclxuXHJcbi8qKlxyXG4gKiBNdWx0aXBsaWVzIGFsbCBjb2xvcnMgYnkgMSBtaW51cyBhIGNvbnN0YW50IGFscGhhIHZhbHVlLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBPbmVNaW51c0NvbnN0YW50QWxwaGFGYWN0b3IgPSAyMTQ7XHJcblxyXG4vKipcclxuICogTmV2ZXIgcGFzcy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTmV2ZXJEZXB0aCA9IDA7XHJcblxyXG4vKipcclxuICogQWx3YXlzIHBhc3MuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEFsd2F5c0RlcHRoID0gMTtcclxuXHJcbi8qKlxyXG4gKiBQYXNzIGlmIHRoZSBpbmNvbWluZyB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIGRlcHRoIGJ1ZmZlciB2YWx1ZS5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTGVzc0RlcHRoID0gMjtcclxuXHJcbi8qKlxyXG4gKiBQYXNzIGlmIHRoZSBpbmNvbWluZyB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGRlcHRoIGJ1ZmZlciB2YWx1ZS5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTGVzc0VxdWFsRGVwdGggPSAzO1xyXG5cclxuLyoqXHJcbiAqIFBhc3MgaWYgdGhlIGluY29taW5nIHZhbHVlIGVxdWFscyB0aGUgZGVwdGggYnVmZmVyIHZhbHVlLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBFcXVhbERlcHRoID0gNDtcclxuXHJcbi8qKlxyXG4gKiBQYXNzIGlmIHRoZSBpbmNvbWluZyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGRlcHRoIGJ1ZmZlciB2YWx1ZS5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgR3JlYXRlckVxdWFsRGVwdGggPSA1O1xyXG5cclxuLyoqXHJcbiAqIFBhc3MgaWYgdGhlIGluY29taW5nIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgZGVwdGggYnVmZmVyIHZhbHVlLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBHcmVhdGVyRGVwdGggPSA2O1xyXG5cclxuLyoqXHJcbiAqIFBhc3MgaWYgdGhlIGluY29taW5nIHZhbHVlIGlzIG5vdCBlcXVhbCB0byB0aGUgZGVwdGggYnVmZmVyIHZhbHVlLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBOb3RFcXVhbERlcHRoID0gNztcclxuXHJcbi8qKlxyXG4gKiBNdWx0aXBsaWVzIHRoZSBlbnZpcm9ubWVudCBtYXAgY29sb3Igd2l0aCB0aGUgc3VyZmFjZSBjb2xvci5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTXVsdGlwbHlPcGVyYXRpb24gPSAwO1xyXG5cclxuLyoqXHJcbiAqIFVzZXMgcmVmbGVjdGl2aXR5IHRvIGJsZW5kIGJldHdlZW4gdGhlIHR3byBjb2xvcnMuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IE1peE9wZXJhdGlvbiA9IDE7XHJcblxyXG4vKipcclxuICogQWRkcyB0aGUgdHdvIGNvbG9ycy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgQWRkT3BlcmF0aW9uID0gMjtcclxuXHJcbi8qKlxyXG4gKiBObyB0b25lIG1hcHBpbmcgaXMgYXBwbGllZC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTm9Ub25lTWFwcGluZyA9IDA7XHJcblxyXG4vKipcclxuICogTGluZWFyIHRvbmUgbWFwcGluZy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTGluZWFyVG9uZU1hcHBpbmcgPSAxO1xyXG5cclxuLyoqXHJcbiAqIFJlaW5oYXJkIHRvbmUgbWFwcGluZy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUmVpbmhhcmRUb25lTWFwcGluZyA9IDI7XHJcblxyXG4vKipcclxuICogQ2luZW9uIHRvbmUgbWFwcGluZy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgQ2luZW9uVG9uZU1hcHBpbmcgPSAzO1xyXG5cclxuLyoqXHJcbiAqIEFDRVMgRmlsbWljIHRvbmUgbWFwcGluZy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgQUNFU0ZpbG1pY1RvbmVNYXBwaW5nID0gNDtcclxuXHJcbi8qKlxyXG4gKiBDdXN0b20gdG9uZSBtYXBwaW5nLlxyXG4gKlxyXG4gKiBFeHBlY3RzIGEgY3VzdG9tIGltcGxlbWVudGF0aW9uIGJ5IG1vZGlmeWluZyBzaGFkZXIgY29kZSBvZiB0aGUgbWF0ZXJpYWwncyBmcmFnbWVudCBzaGFkZXIuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEN1c3RvbVRvbmVNYXBwaW5nID0gNTtcclxuXHJcbi8qKlxyXG4gKiBBZ1ggdG9uZSBtYXBwaW5nLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBBZ1hUb25lTWFwcGluZyA9IDY7XHJcblxyXG4vKipcclxuICogTmV1dHJhbCB0b25lIG1hcHBpbmcuXHJcbiAqXHJcbiAqIEltcGxlbWVudGF0aW9uIGJhc2VkIG9uIHRoZSBLaHJvbm9zIDNEIENvbW1lcmNlIEdyb3VwIHN0YW5kYXJkIHRvbmUgbWFwcGluZy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTmV1dHJhbFRvbmVNYXBwaW5nID0gNztcclxuXHJcbi8qKlxyXG4gKiBUaGUgc2tpbm5lZCBtZXNoIHNoYXJlcyB0aGUgc2FtZSB3b3JsZCBzcGFjZSBhcyB0aGUgc2tlbGV0b24uXHJcbiAqXHJcbiAqIEB0eXBlIHtzdHJpbmd9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEF0dGFjaGVkQmluZE1vZGUgPSAnYXR0YWNoZWQnO1xyXG5cclxuLyoqXHJcbiAqIFRoZSBza2lubmVkIG1lc2ggZG9lcyBub3Qgc2hhcmUgdGhlIHNhbWUgd29ybGQgc3BhY2UgYXMgdGhlIHNrZWxldG9uLlxyXG4gKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGEgc2tlbGV0b24gaXMgc2hhcmVkIGFjcm9zcyBtdWx0aXBsZSBza2lubmVkIG1lc2hlcy5cclxuICpcclxuICogQHR5cGUge3N0cmluZ31cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgRGV0YWNoZWRCaW5kTW9kZSA9ICdkZXRhY2hlZCc7XHJcblxyXG4vKipcclxuICogTWFwcyB0ZXh0dXJlcyB1c2luZyB0aGUgZ2VvbWV0cnkncyBVViBjb29yZGluYXRlcy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgVVZNYXBwaW5nID0gMzAwO1xyXG5cclxuLyoqXHJcbiAqIFJlZmxlY3Rpb24gbWFwcGluZyBmb3IgY3ViZSB0ZXh0dXJlcy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgQ3ViZVJlZmxlY3Rpb25NYXBwaW5nID0gMzAxO1xyXG5cclxuLyoqXHJcbiAqIFJlZnJhY3Rpb24gbWFwcGluZyBmb3IgY3ViZSB0ZXh0dXJlcy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgQ3ViZVJlZnJhY3Rpb25NYXBwaW5nID0gMzAyO1xyXG5cclxuLyoqXHJcbiAqIFJlZmxlY3Rpb24gbWFwcGluZyBmb3IgZXF1aXJlY3Rhbmd1bGFyIHRleHR1cmVzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZyA9IDMwMztcclxuXHJcbi8qKlxyXG4gKiBSZWZyYWN0aW9uIG1hcHBpbmcgZm9yIGVxdWlyZWN0YW5ndWxhciB0ZXh0dXJlcy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgRXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmcgPSAzMDQ7XHJcblxyXG4vKipcclxuICogUmVmbGVjdGlvbiBtYXBwaW5nIGZvciBQTVJFTSB0ZXh0dXJlcy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmcgPSAzMDY7XHJcblxyXG4vKipcclxuICogVGhlIHRleHR1cmUgd2lsbCBzaW1wbHkgcmVwZWF0IHRvIGluZmluaXR5LlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBSZXBlYXRXcmFwcGluZyA9IDEwMDA7XHJcblxyXG4vKipcclxuICogVGhlIGxhc3QgcGl4ZWwgb2YgdGhlIHRleHR1cmUgc3RyZXRjaGVzIHRvIHRoZSBlZGdlIG9mIHRoZSBtZXNoLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBDbGFtcFRvRWRnZVdyYXBwaW5nID0gMTAwMTtcclxuXHJcbi8qKlxyXG4gKiBUaGUgdGV4dHVyZSB3aWxsIHJlcGVhdHMgdG8gaW5maW5pdHksIG1pcnJvcmluZyBvbiBlYWNoIHJlcGVhdC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTWlycm9yZWRSZXBlYXRXcmFwcGluZyA9IDEwMDI7XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHRleHR1cmUgZWxlbWVudCB0aGF0IGlzIG5lYXJlc3QgKGluIE1hbmhhdHRhbiBkaXN0YW5jZSlcclxuICogdG8gdGhlIHNwZWNpZmllZCB0ZXh0dXJlIGNvb3JkaW5hdGVzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBOZWFyZXN0RmlsdGVyID0gMTAwMztcclxuXHJcbi8qKlxyXG4gKiBDaG9vc2VzIHRoZSBtaXBtYXAgdGhhdCBtb3N0IGNsb3NlbHkgbWF0Y2hlcyB0aGUgc2l6ZSBvZiB0aGUgcGl4ZWwgYmVpbmcgdGV4dHVyZWRcclxuICogYW5kIHVzZXMgdGhlIGBOZWFyZXN0RmlsdGVyYCBjcml0ZXJpb24gKHRoZSB0ZXhlbCBuZWFyZXN0IHRvIHRoZSBjZW50ZXIgb2YgdGhlIHBpeGVsKVxyXG4gKiB0byBwcm9kdWNlIGEgdGV4dHVyZSB2YWx1ZS5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTmVhcmVzdE1pcG1hcE5lYXJlc3RGaWx0ZXIgPSAxMDA0O1xyXG5leHBvcnQgY29uc3QgTmVhcmVzdE1pcE1hcE5lYXJlc3RGaWx0ZXIgPSAxMDA0OyAvLyBsZWdhY3lcclxuXHJcbi8qKlxyXG4gKiBDaG9vc2VzIHRoZSB0d28gbWlwbWFwcyB0aGF0IG1vc3QgY2xvc2VseSBtYXRjaCB0aGUgc2l6ZSBvZiB0aGUgcGl4ZWwgYmVpbmcgdGV4dHVyZWQgYW5kXHJcbiAqIHVzZXMgdGhlIGBOZWFyZXN0RmlsdGVyYCBjcml0ZXJpb24gdG8gcHJvZHVjZSBhIHRleHR1cmUgdmFsdWUgZnJvbSBlYWNoIG1pcG1hcC5cclxuICogVGhlIGZpbmFsIHRleHR1cmUgdmFsdWUgaXMgYSB3ZWlnaHRlZCBhdmVyYWdlIG9mIHRob3NlIHR3byB2YWx1ZXMuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IE5lYXJlc3RNaXBtYXBMaW5lYXJGaWx0ZXIgPSAxMDA1O1xyXG5leHBvcnQgY29uc3QgTmVhcmVzdE1pcE1hcExpbmVhckZpbHRlciA9IDEwMDU7IC8vIGxlZ2FjeVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIHdlaWdodGVkIGF2ZXJhZ2Ugb2YgdGhlIGZvdXIgdGV4dHVyZSBlbGVtZW50cyB0aGF0IGFyZSBjbG9zZXN0IHRvIHRoZSBzcGVjaWZpZWRcclxuICogdGV4dHVyZSBjb29yZGluYXRlcywgYW5kIGNhbiBpbmNsdWRlIGl0ZW1zIHdyYXBwZWQgb3IgcmVwZWF0ZWQgZnJvbSBvdGhlciBwYXJ0cyBvZiBhIHRleHR1cmUsXHJcbiAqIGRlcGVuZGluZyBvbiB0aGUgdmFsdWVzIG9mIGB3cmFwU2AgYW5kIGB3cmFwVGAsIGFuZCBvbiB0aGUgZXhhY3QgbWFwcGluZy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTGluZWFyRmlsdGVyID0gMTAwNjtcclxuXHJcbi8qKlxyXG4gKiBDaG9vc2VzIHRoZSBtaXBtYXAgdGhhdCBtb3N0IGNsb3NlbHkgbWF0Y2hlcyB0aGUgc2l6ZSBvZiB0aGUgcGl4ZWwgYmVpbmcgdGV4dHVyZWQgYW5kIHVzZXNcclxuICogdGhlIGBMaW5lYXJGaWx0ZXJgIGNyaXRlcmlvbiAoYSB3ZWlnaHRlZCBhdmVyYWdlIG9mIHRoZSBmb3VyIHRleGVscyB0aGF0IGFyZSBjbG9zZXN0IHRvIHRoZVxyXG4gKiBjZW50ZXIgb2YgdGhlIHBpeGVsKSB0byBwcm9kdWNlIGEgdGV4dHVyZSB2YWx1ZS5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTGluZWFyTWlwbWFwTmVhcmVzdEZpbHRlciA9IDEwMDc7XHJcbmV4cG9ydCBjb25zdCBMaW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyID0gMTAwNzsgLy8gbGVnYWN5XHJcblxyXG4vKipcclxuICogQ2hvb3NlcyB0aGUgdHdvIG1pcG1hcHMgdGhhdCBtb3N0IGNsb3NlbHkgbWF0Y2ggdGhlIHNpemUgb2YgdGhlIHBpeGVsIGJlaW5nIHRleHR1cmVkIGFuZCB1c2VzXHJcbiAqIHRoZSBgTGluZWFyRmlsdGVyYCBjcml0ZXJpb24gdG8gcHJvZHVjZSBhIHRleHR1cmUgdmFsdWUgZnJvbSBlYWNoIG1pcG1hcC4gVGhlIGZpbmFsIHRleHR1cmUgdmFsdWVcclxuICogaXMgYSB3ZWlnaHRlZCBhdmVyYWdlIG9mIHRob3NlIHR3byB2YWx1ZXMuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IExpbmVhck1pcG1hcExpbmVhckZpbHRlciA9IDEwMDg7XHJcbmV4cG9ydCBjb25zdCBMaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXIgPSAxMDA4OyAvLyBsZWdhY3lcclxuXHJcbi8qKlxyXG4gKiBBbiB1bnNpZ25lZCBieXRlIGRhdGEgdHlwZSBmb3IgdGV4dHVyZXMuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFVuc2lnbmVkQnl0ZVR5cGUgPSAxMDA5O1xyXG5cclxuLyoqXHJcbiAqIEEgYnl0ZSBkYXRhIHR5cGUgZm9yIHRleHR1cmVzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBCeXRlVHlwZSA9IDEwMTA7XHJcblxyXG4vKipcclxuICogQSBzaG9ydCBkYXRhIHR5cGUgZm9yIHRleHR1cmVzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBTaG9ydFR5cGUgPSAxMDExO1xyXG5cclxuLyoqXHJcbiAqIEFuIHVuc2lnbmVkIHNob3J0IGRhdGEgdHlwZSBmb3IgdGV4dHVyZXMuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFVuc2lnbmVkU2hvcnRUeXBlID0gMTAxMjtcclxuXHJcbi8qKlxyXG4gKiBBbiBpbnQgZGF0YSB0eXBlIGZvciB0ZXh0dXJlcy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgSW50VHlwZSA9IDEwMTM7XHJcblxyXG4vKipcclxuICogQW4gdW5zaWduZWQgaW50IGRhdGEgdHlwZSBmb3IgdGV4dHVyZXMuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFVuc2lnbmVkSW50VHlwZSA9IDEwMTQ7XHJcblxyXG4vKipcclxuICogQSBmbG9hdCBkYXRhIHR5cGUgZm9yIHRleHR1cmVzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBGbG9hdFR5cGUgPSAxMDE1O1xyXG5cclxuLyoqXHJcbiAqIEEgaGFsZiBmbG9hdCBkYXRhIHR5cGUgZm9yIHRleHR1cmVzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBIYWxmRmxvYXRUeXBlID0gMTAxNjtcclxuXHJcbi8qKlxyXG4gKiBBbiB1bnNpZ25lZCBzaG9ydCA0XzRfNF80IChwYWNrZWQpIGRhdGEgdHlwZSBmb3IgdGV4dHVyZXMuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFVuc2lnbmVkU2hvcnQ0NDQ0VHlwZSA9IDEwMTc7XHJcblxyXG4vKipcclxuICogQW4gdW5zaWduZWQgc2hvcnQgNV81XzVfMSAocGFja2VkKSBkYXRhIHR5cGUgZm9yIHRleHR1cmVzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBVbnNpZ25lZFNob3J0NTU1MVR5cGUgPSAxMDE4O1xyXG5cclxuLyoqXHJcbiAqIEFuIHVuc2lnbmVkIGludCAyNF84IGRhdGEgdHlwZSBmb3IgdGV4dHVyZXMuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFVuc2lnbmVkSW50MjQ4VHlwZSA9IDEwMjA7XHJcblxyXG4vKipcclxuICogQW4gdW5zaWduZWQgaW50IDVfOV85XzkgKHBhY2tlZCkgZGF0YSB0eXBlIGZvciB0ZXh0dXJlcy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgVW5zaWduZWRJbnQ1OTk5VHlwZSA9IDM1OTAyO1xyXG5cclxuLyoqXHJcbiAqIERpc2NhcmRzIHRoZSByZWQsIGdyZWVuIGFuZCBibHVlIGNvbXBvbmVudHMgYW5kIHJlYWRzIGp1c3QgdGhlIGFscGhhIGNvbXBvbmVudC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgQWxwaGFGb3JtYXQgPSAxMDIxO1xyXG5cclxuLyoqXHJcbiAqIERpc2NhcmRzIHRoZSBhbHBoYSBjb21wb25lbnQgYW5kIHJlYWRzIHRoZSByZWQsIGdyZWVuIGFuZCBibHVlIGNvbXBvbmVudC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUkdCRm9ybWF0ID0gMTAyMjtcclxuXHJcbi8qKlxyXG4gKiBSZWFkcyB0aGUgcmVkLCBncmVlbiwgYmx1ZSBhbmQgYWxwaGEgY29tcG9uZW50cy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUkdCQUZvcm1hdCA9IDEwMjM7XHJcblxyXG4vKipcclxuICogcmVhZHMgZWFjaCBlbGVtZW50IGFzIGEgc2luZ2xlIGx1bWluYW5jZSBjb21wb25lbnQuIFRoaXMgaXMgdGhlbiBjb252ZXJ0ZWQgdG8gYSBmbG9hdGluZyBwb2ludCxcclxuICogY2xhbXBlZCB0byB0aGUgcmFuZ2UgYFswLDFdYCwgYW5kIHRoZW4gYXNzZW1ibGVkIGludG8gYW4gUkdCQSBlbGVtZW50IGJ5IHBsYWNpbmcgdGhlIGx1bWluYW5jZSB2YWx1ZVxyXG4gKiBpbiB0aGUgcmVkLCBncmVlbiBhbmQgYmx1ZSBjaGFubmVscywgYW5kIGF0dGFjaGluZyAxLjAgdG8gdGhlIGFscGhhIGNoYW5uZWwuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEx1bWluYW5jZUZvcm1hdCA9IDEwMjQ7XHJcblxyXG4vKipcclxuICogUmVhZHMgZWFjaCBlbGVtZW50IGFzIGEgbHVtaW5hbmNlL2FscGhhIGRvdWJsZS4gVGhlIHNhbWUgcHJvY2VzcyBvY2N1cnMgYXMgZm9yIHRoZSBgTHVtaW5hbmNlRm9ybWF0YCxcclxuICogZXhjZXB0IHRoYXQgdGhlIGFscGhhIGNoYW5uZWwgbWF5IGhhdmUgdmFsdWVzIG90aGVyIHRoYW4gYDEuMGAuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEx1bWluYW5jZUFscGhhRm9ybWF0ID0gMTAyNTtcclxuXHJcbi8qKlxyXG4gKiBSZWFkcyBlYWNoIGVsZW1lbnQgYXMgYSBzaW5nbGUgZGVwdGggdmFsdWUsIGNvbnZlcnRzIGl0IHRvIGZsb2F0aW5nIHBvaW50LCBhbmQgY2xhbXBzIHRvIHRoZSByYW5nZSBgWzAsMV1gLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBEZXB0aEZvcm1hdCA9IDEwMjY7XHJcblxyXG4vKipcclxuICogUmVhZHMgZWFjaCBlbGVtZW50IGlzIGEgcGFpciBvZiBkZXB0aCBhbmQgc3RlbmNpbCB2YWx1ZXMuIFRoZSBkZXB0aCBjb21wb25lbnQgb2YgdGhlIHBhaXIgaXMgaW50ZXJwcmV0ZWQgYXNcclxuICogaW4gYERlcHRoRm9ybWF0YC4gVGhlIHN0ZW5jaWwgY29tcG9uZW50IGlzIGludGVycHJldGVkIGJhc2VkIG9uIHRoZSBkZXB0aCArIHN0ZW5jaWwgaW50ZXJuYWwgZm9ybWF0LlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBEZXB0aFN0ZW5jaWxGb3JtYXQgPSAxMDI3O1xyXG5cclxuLyoqXHJcbiAqIERpc2NhcmRzIHRoZSBncmVlbiwgYmx1ZSBhbmQgYWxwaGEgY29tcG9uZW50cyBhbmQgcmVhZHMganVzdCB0aGUgcmVkIGNvbXBvbmVudC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUmVkRm9ybWF0ID0gMTAyODtcclxuXHJcbi8qKlxyXG4gKiBEaXNjYXJkcyB0aGUgZ3JlZW4sIGJsdWUgYW5kIGFscGhhIGNvbXBvbmVudHMgYW5kIHJlYWRzIGp1c3QgdGhlIHJlZCBjb21wb25lbnQuIFRoZSB0ZXhlbHMgYXJlIHJlYWQgYXMgaW50ZWdlcnMgaW5zdGVhZCBvZiBmbG9hdGluZyBwb2ludC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUmVkSW50ZWdlckZvcm1hdCA9IDEwMjk7XHJcblxyXG4vKipcclxuICogRGlzY2FyZHMgdGhlIGFscGhhLCBhbmQgYmx1ZSBjb21wb25lbnRzIGFuZCByZWFkcyB0aGUgcmVkLCBhbmQgZ3JlZW4gY29tcG9uZW50cy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUkdGb3JtYXQgPSAxMDMwO1xyXG5cclxuLyoqXHJcbiAqIERpc2NhcmRzIHRoZSBhbHBoYSwgYW5kIGJsdWUgY29tcG9uZW50cyBhbmQgcmVhZHMgdGhlIHJlZCwgYW5kIGdyZWVuIGNvbXBvbmVudHMuIFRoZSB0ZXhlbHMgYXJlIHJlYWQgYXMgaW50ZWdlcnMgaW5zdGVhZCBvZiBmbG9hdGluZyBwb2ludC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUkdJbnRlZ2VyRm9ybWF0ID0gMTAzMTtcclxuXHJcbi8qKlxyXG4gKiBEaXNjYXJkcyB0aGUgYWxwaGEgY29tcG9uZW50IGFuZCByZWFkcyB0aGUgcmVkLCBncmVlbiBhbmQgYmx1ZSBjb21wb25lbnQuIFRoZSB0ZXhlbHMgYXJlIHJlYWQgYXMgaW50ZWdlcnMgaW5zdGVhZCBvZiBmbG9hdGluZyBwb2ludC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUkdCSW50ZWdlckZvcm1hdCA9IDEwMzI7XHJcblxyXG4vKipcclxuICogUmVhZHMgdGhlIHJlZCwgZ3JlZW4sIGJsdWUgYW5kIGFscGhhIGNvbXBvbmVudHMuIFRoZSB0ZXhlbHMgYXJlIHJlYWQgYXMgaW50ZWdlcnMgaW5zdGVhZCBvZiBmbG9hdGluZyBwb2ludC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUkdCQUludGVnZXJGb3JtYXQgPSAxMDMzO1xyXG5cclxuLyoqXHJcbiAqIEEgRFhUMS1jb21wcmVzc2VkIGltYWdlIGluIGFuIFJHQiBpbWFnZSBmb3JtYXQuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFJHQl9TM1RDX0RYVDFfRm9ybWF0ID0gMzM3NzY7XHJcblxyXG4vKipcclxuICogQSBEWFQxLWNvbXByZXNzZWQgaW1hZ2UgaW4gYW4gUkdCIGltYWdlIGZvcm1hdCB3aXRoIGEgc2ltcGxlIG9uL29mZiBhbHBoYSB2YWx1ZS5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUkdCQV9TM1RDX0RYVDFfRm9ybWF0ID0gMzM3Nzc7XHJcblxyXG4vKipcclxuICogQSBEWFQzLWNvbXByZXNzZWQgaW1hZ2UgaW4gYW4gUkdCQSBpbWFnZSBmb3JtYXQuIENvbXBhcmVkIHRvIGEgMzItYml0IFJHQkEgdGV4dHVyZSwgaXQgb2ZmZXJzIDQ6MSBjb21wcmVzc2lvbi5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUkdCQV9TM1RDX0RYVDNfRm9ybWF0ID0gMzM3Nzg7XHJcblxyXG4vKipcclxuICogQSBEWFQ1LWNvbXByZXNzZWQgaW1hZ2UgaW4gYW4gUkdCQSBpbWFnZSBmb3JtYXQuIEl0IGFsc28gcHJvdmlkZXMgYSA0OjEgY29tcHJlc3Npb24sIGJ1dCBkaWZmZXJzIHRvIHRoZSBEWFQzXHJcbiAqIGNvbXByZXNzaW9uIGluIGhvdyB0aGUgYWxwaGEgY29tcHJlc3Npb24gaXMgZG9uZS5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUkdCQV9TM1RDX0RYVDVfRm9ybWF0ID0gMzM3Nzk7XHJcblxyXG4vKipcclxuICogUFZSVEMgUkdCIGNvbXByZXNzaW9uIGluIDQtYml0IG1vZGUuIE9uZSBibG9jayBmb3IgZWFjaCA0w5c0IHBpeGVscy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUkdCX1BWUlRDXzRCUFBWMV9Gb3JtYXQgPSAzNTg0MDtcclxuXHJcbi8qKlxyXG4gKiBQVlJUQyBSR0IgY29tcHJlc3Npb24gaW4gMi1iaXQgbW9kZS4gT25lIGJsb2NrIGZvciBlYWNoIDjDlzQgcGl4ZWxzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBSR0JfUFZSVENfMkJQUFYxX0Zvcm1hdCA9IDM1ODQxO1xyXG5cclxuLyoqXHJcbiAqIFBWUlRDIFJHQkEgY29tcHJlc3Npb24gaW4gNC1iaXQgbW9kZS4gT25lIGJsb2NrIGZvciBlYWNoIDTDlzQgcGl4ZWxzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBSR0JBX1BWUlRDXzRCUFBWMV9Gb3JtYXQgPSAzNTg0MjtcclxuXHJcbi8qKlxyXG4gKiBQVlJUQyBSR0JBIGNvbXByZXNzaW9uIGluIDItYml0IG1vZGUuIE9uZSBibG9jayBmb3IgZWFjaCA4w5c0IHBpeGVscy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUkdCQV9QVlJUQ18yQlBQVjFfRm9ybWF0ID0gMzU4NDM7XHJcblxyXG4vKipcclxuICogRVRDMSBSR0IgZm9ybWF0LlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBSR0JfRVRDMV9Gb3JtYXQgPSAzNjE5NjtcclxuXHJcbi8qKlxyXG4gKiBFVEMyIFJHQiBmb3JtYXQuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFJHQl9FVEMyX0Zvcm1hdCA9IDM3NDkyO1xyXG5cclxuLyoqXHJcbiAqIEVUQzIgUkdCQSBmb3JtYXQuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFJHQkFfRVRDMl9FQUNfRm9ybWF0ID0gMzc0OTY7XHJcblxyXG4vKipcclxuICogQVNUQyBSR0JBIDR4NCBmb3JtYXQuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFJHQkFfQVNUQ180eDRfRm9ybWF0ID0gMzc4MDg7XHJcblxyXG4vKipcclxuICogQVNUQyBSR0JBIDV4NCBmb3JtYXQuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFJHQkFfQVNUQ181eDRfRm9ybWF0ID0gMzc4MDk7XHJcblxyXG4vKipcclxuICogQVNUQyBSR0JBIDV4NSBmb3JtYXQuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFJHQkFfQVNUQ181eDVfRm9ybWF0ID0gMzc4MTA7XHJcblxyXG4vKipcclxuICogQVNUQyBSR0JBIDZ4NSBmb3JtYXQuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFJHQkFfQVNUQ182eDVfRm9ybWF0ID0gMzc4MTE7XHJcblxyXG4vKipcclxuICogQVNUQyBSR0JBIDZ4NiBmb3JtYXQuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFJHQkFfQVNUQ182eDZfRm9ybWF0ID0gMzc4MTI7XHJcblxyXG4vKipcclxuICogQVNUQyBSR0JBIDh4NSBmb3JtYXQuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFJHQkFfQVNUQ184eDVfRm9ybWF0ID0gMzc4MTM7XHJcblxyXG4vKipcclxuICogQVNUQyBSR0JBIDh4NiBmb3JtYXQuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFJHQkFfQVNUQ184eDZfRm9ybWF0ID0gMzc4MTQ7XHJcblxyXG4vKipcclxuICogQVNUQyBSR0JBIDh4OCBmb3JtYXQuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFJHQkFfQVNUQ184eDhfRm9ybWF0ID0gMzc4MTU7XHJcblxyXG4vKipcclxuICogQVNUQyBSR0JBIDEweDUgZm9ybWF0LlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBSR0JBX0FTVENfMTB4NV9Gb3JtYXQgPSAzNzgxNjtcclxuXHJcbi8qKlxyXG4gKiBBU1RDIFJHQkEgMTB4NiBmb3JtYXQuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFJHQkFfQVNUQ18xMHg2X0Zvcm1hdCA9IDM3ODE3O1xyXG5cclxuLyoqXHJcbiAqIEFTVEMgUkdCQSAxMHg4IGZvcm1hdC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUkdCQV9BU1RDXzEweDhfRm9ybWF0ID0gMzc4MTg7XHJcblxyXG4vKipcclxuICogQVNUQyBSR0JBIDEweDEwIGZvcm1hdC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUkdCQV9BU1RDXzEweDEwX0Zvcm1hdCA9IDM3ODE5O1xyXG5cclxuLyoqXHJcbiAqIEFTVEMgUkdCQSAxMngxMCBmb3JtYXQuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFJHQkFfQVNUQ18xMngxMF9Gb3JtYXQgPSAzNzgyMDtcclxuXHJcbi8qKlxyXG4gKiBBU1RDIFJHQkEgMTJ4MTIgZm9ybWF0LlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBSR0JBX0FTVENfMTJ4MTJfRm9ybWF0ID0gMzc4MjE7XHJcblxyXG4vKipcclxuICogQlBUQyBSR0JBIGZvcm1hdC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUkdCQV9CUFRDX0Zvcm1hdCA9IDM2NDkyO1xyXG5cclxuLyoqXHJcbiAqIEJQVEMgU2lnbmVkIFJHQiBmb3JtYXQuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFJHQl9CUFRDX1NJR05FRF9Gb3JtYXQgPSAzNjQ5NDtcclxuXHJcbi8qKlxyXG4gKiBCUFRDIFVuc2lnbmVkIFJHQiBmb3JtYXQuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFJHQl9CUFRDX1VOU0lHTkVEX0Zvcm1hdCA9IDM2NDk1O1xyXG5cclxuLyoqXHJcbiAqIFJHVEMxIFJlZCBmb3JtYXQuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFJFRF9SR1RDMV9Gb3JtYXQgPSAzNjI4MztcclxuXHJcbi8qKlxyXG4gKiBSR1RDMSBTaWduZWQgUmVkIGZvcm1hdC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgU0lHTkVEX1JFRF9SR1RDMV9Gb3JtYXQgPSAzNjI4NDtcclxuXHJcbi8qKlxyXG4gKiBSR1RDMiBSZWQgR3JlZW4gZm9ybWF0LlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBSRURfR1JFRU5fUkdUQzJfRm9ybWF0ID0gMzYyODU7XHJcblxyXG4vKipcclxuICogUkdUQzIgU2lnbmVkIFJlZCBHcmVlbiBmb3JtYXQuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFNJR05FRF9SRURfR1JFRU5fUkdUQzJfRm9ybWF0ID0gMzYyODY7XHJcblxyXG4vKipcclxuICogQW5pbWF0aW9ucyBhcmUgcGxheWVkIG9uY2UuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IExvb3BPbmNlID0gMjIwMDtcclxuXHJcbi8qKlxyXG4gKiBBbmltYXRpb25zIGFyZSBwbGF5ZWQgd2l0aCBhIGNob3NlbiBudW1iZXIgb2YgcmVwZXRpdGlvbnMsIGVhY2ggdGltZSBqdW1waW5nIGZyb21cclxuICogdGhlIGVuZCBvZiB0aGUgY2xpcCBkaXJlY3RseSB0byBpdHMgYmVnaW5uaW5nLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBMb29wUmVwZWF0ID0gMjIwMTtcclxuXHJcbi8qKlxyXG4gKiBBbmltYXRpb25zIGFyZSBwbGF5ZWQgd2l0aCBhIGNob3NlbiBudW1iZXIgb2YgcmVwZXRpdGlvbnMsIGFsdGVybmF0ZWx5IHBsYXlpbmcgZm9yd2FyZFxyXG4gKiBhbmQgYmFja3dhcmQuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IExvb3BQaW5nUG9uZyA9IDIyMDI7XHJcblxyXG4vKipcclxuICogRGlzY3JldGUgaW50ZXJwb2xhdGlvbiBtb2RlIGZvciBrZXlmcmFtZSB0cmFja3MuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEludGVycG9sYXRlRGlzY3JldGUgPSAyMzAwO1xyXG5cclxuLyoqXHJcbiAqIExpbmVhciBpbnRlcnBvbGF0aW9uIG1vZGUgZm9yIGtleWZyYW1lIHRyYWNrcy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgSW50ZXJwb2xhdGVMaW5lYXIgPSAyMzAxO1xyXG5cclxuLyoqXHJcbiAqIFNtb290aCBpbnRlcnBvbGF0aW9uIG1vZGUgZm9yIGtleWZyYW1lIHRyYWNrcy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgSW50ZXJwb2xhdGVTbW9vdGggPSAyMzAyO1xyXG5cclxuLyoqXHJcbiAqIFplcm8gY3VydmF0dXJlIGVuZGluZyBmb3IgYW5pbWF0aW9ucy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgWmVyb0N1cnZhdHVyZUVuZGluZyA9IDI0MDA7XHJcblxyXG4vKipcclxuICogWmVybyBzbG9wZSBlbmRpbmcgZm9yIGFuaW1hdGlvbnMuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFplcm9TbG9wZUVuZGluZyA9IDI0MDE7XHJcblxyXG4vKipcclxuICogV3JhcCBhcm91bmQgZW5kaW5nIGZvciBhbmltYXRpb25zLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBXcmFwQXJvdW5kRW5kaW5nID0gMjQwMjtcclxuXHJcbi8qKlxyXG4gKiBEZWZhdWx0IGFuaW1hdGlvbiBibGVuZCBtb2RlLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBOb3JtYWxBbmltYXRpb25CbGVuZE1vZGUgPSAyNTAwO1xyXG5cclxuLyoqXHJcbiAqIEFkZGl0aXZlIGFuaW1hdGlvbiBibGVuZCBtb2RlLiBDYW4gYmUgdXNlZCB0byBsYXllciBtb3Rpb25zIG9uIHRvcCBvZlxyXG4gKiBlYWNoIG90aGVyIHRvIGJ1aWxkIGNvbXBsZXggcGVyZm9ybWFuY2VzIGZyb20gc21hbGxlciByZS11c2FibGUgYXNzZXRzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBBZGRpdGl2ZUFuaW1hdGlvbkJsZW5kTW9kZSA9IDI1MDE7XHJcblxyXG4vKipcclxuICogRm9yIGV2ZXJ5IHRocmVlIHZlcnRpY2VzIGRyYXcgYSBzaW5nbGUgdHJpYW5nbGUuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFRyaWFuZ2xlc0RyYXdNb2RlID0gMDtcclxuXHJcbi8qKlxyXG4gKiBGb3IgZWFjaCB2ZXJ0ZXggZHJhdyBhIHRyaWFuZ2xlIGZyb20gdGhlIGxhc3QgdGhyZWUgdmVydGljZXMuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFRyaWFuZ2xlU3RyaXBEcmF3TW9kZSA9IDE7XHJcblxyXG4vKipcclxuICogRm9yIGVhY2ggdmVydGV4IGRyYXcgYSB0cmlhbmdsZSBmcm9tIHRoZSBmaXJzdCB2ZXJ0ZXggYW5kIHRoZSBsYXN0IHR3byB2ZXJ0aWNlcy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgVHJpYW5nbGVGYW5EcmF3TW9kZSA9IDI7XHJcblxyXG4vKipcclxuICogQmFzaWMgZGVwdGggcGFja2luZy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgQmFzaWNEZXB0aFBhY2tpbmcgPSAzMjAwO1xyXG5cclxuLyoqXHJcbiAqIEEgZGVwdGggdmFsdWUgaXMgcGFja2VkIGludG8gMzIgYml0IFJHQkEuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFJHQkFEZXB0aFBhY2tpbmcgPSAzMjAxO1xyXG5cclxuLyoqXHJcbiAqIEEgZGVwdGggdmFsdWUgaXMgcGFja2VkIGludG8gMjQgYml0IFJHQi5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUkdCRGVwdGhQYWNraW5nID0gMzIwMjtcclxuXHJcbi8qKlxyXG4gKiBBIGRlcHRoIHZhbHVlIGlzIHBhY2tlZCBpbnRvIDE2IGJpdCBSRy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUkdEZXB0aFBhY2tpbmcgPSAzMjAzO1xyXG5cclxuLyoqXHJcbiAqIE5vcm1hbCBpbmZvcm1hdGlvbiBpcyByZWxhdGl2ZSB0byB0aGUgdW5kZXJseWluZyBzdXJmYWNlLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBUYW5nZW50U3BhY2VOb3JtYWxNYXAgPSAwO1xyXG5cclxuLyoqXHJcbiAqIE5vcm1hbCBpbmZvcm1hdGlvbiBpcyByZWxhdGl2ZSB0byB0aGUgb2JqZWN0IG9yaWVudGF0aW9uLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBPYmplY3RTcGFjZU5vcm1hbE1hcCA9IDE7XHJcblxyXG4vLyBDb2xvciBzcGFjZSBzdHJpbmcgaWRlbnRpZmllcnMsIG1hdGNoaW5nIENTUyBDb2xvciBNb2R1bGUgTGV2ZWwgNCBhbmQgV2ViR1BVIG5hbWVzIHdoZXJlIGF2YWlsYWJsZS5cclxuXHJcbi8qKlxyXG4gKiBObyBjb2xvciBzcGFjZS5cclxuICpcclxuICogQHR5cGUge3N0cmluZ31cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTm9Db2xvclNwYWNlID0gJyc7XHJcblxyXG4vKipcclxuICogc1JHQiBjb2xvciBzcGFjZS5cclxuICpcclxuICogQHR5cGUge3N0cmluZ31cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgU1JHQkNvbG9yU3BhY2UgPSAnc3JnYic7XHJcblxyXG4vKipcclxuICogc1JHQi1saW5lYXIgY29sb3Igc3BhY2UuXHJcbiAqXHJcbiAqIEB0eXBlIHtzdHJpbmd9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IExpbmVhclNSR0JDb2xvclNwYWNlID0gJ3NyZ2ItbGluZWFyJztcclxuXHJcbi8qKlxyXG4gKiBMaW5lYXIgdHJhbnNmZXIgZnVuY3Rpb24uXHJcbiAqXHJcbiAqIEB0eXBlIHtzdHJpbmd9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IExpbmVhclRyYW5zZmVyID0gJ2xpbmVhcic7XHJcblxyXG4vKipcclxuICogc1JHQiB0cmFuc2ZlciBmdW5jdGlvbi5cclxuICpcclxuICogQHR5cGUge3N0cmluZ31cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgU1JHQlRyYW5zZmVyID0gJ3NyZ2InO1xyXG5cclxuLyoqXHJcbiAqIFNldHMgdGhlIHN0ZW5jaWwgYnVmZmVyIHZhbHVlIHRvIGAwYC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgWmVyb1N0ZW5jaWxPcCA9IDA7XHJcblxyXG4vKipcclxuICogS2VlcHMgdGhlIGN1cnJlbnQgdmFsdWUuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEtlZXBTdGVuY2lsT3AgPSA3NjgwO1xyXG5cclxuLyoqXHJcbiAqIFNldHMgdGhlIHN0ZW5jaWwgYnVmZmVyIHZhbHVlIHRvIHRoZSBzcGVjaWZpZWQgcmVmZXJlbmNlIHZhbHVlLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBSZXBsYWNlU3RlbmNpbE9wID0gNzY4MTtcclxuXHJcbi8qKlxyXG4gKiBJbmNyZW1lbnRzIHRoZSBjdXJyZW50IHN0ZW5jaWwgYnVmZmVyIHZhbHVlLiBDbGFtcHMgdG8gdGhlIG1heGltdW0gcmVwcmVzZW50YWJsZSB1bnNpZ25lZCB2YWx1ZS5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgSW5jcmVtZW50U3RlbmNpbE9wID0gNzY4MjtcclxuXHJcbi8qKlxyXG4gKiBEZWNyZW1lbnRzIHRoZSBjdXJyZW50IHN0ZW5jaWwgYnVmZmVyIHZhbHVlLiBDbGFtcHMgdG8gYDBgLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBEZWNyZW1lbnRTdGVuY2lsT3AgPSA3NjgzO1xyXG5cclxuLyoqXHJcbiAqIEluY3JlbWVudHMgdGhlIGN1cnJlbnQgc3RlbmNpbCBidWZmZXIgdmFsdWUuIFdyYXBzIHN0ZW5jaWwgYnVmZmVyIHZhbHVlIHRvIHplcm8gd2hlbiBpbmNyZW1lbnRpbmdcclxuICogdGhlIG1heGltdW0gcmVwcmVzZW50YWJsZSB1bnNpZ25lZCB2YWx1ZS5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgSW5jcmVtZW50V3JhcFN0ZW5jaWxPcCA9IDM0MDU1O1xyXG5cclxuLyoqXHJcbiAqIERlY3JlbWVudHMgdGhlIGN1cnJlbnQgc3RlbmNpbCBidWZmZXIgdmFsdWUuIFdyYXBzIHN0ZW5jaWwgYnVmZmVyIHZhbHVlIHRvIHRoZSBtYXhpbXVtIHJlcHJlc2VudGFibGVcclxuICogdW5zaWduZWQgdmFsdWUgd2hlbiBkZWNyZW1lbnRpbmcgYSBzdGVuY2lsIGJ1ZmZlciB2YWx1ZSBvZiBgMGAuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IERlY3JlbWVudFdyYXBTdGVuY2lsT3AgPSAzNDA1NjtcclxuXHJcbi8qKlxyXG4gKiBJbnZlcnRzIHRoZSBjdXJyZW50IHN0ZW5jaWwgYnVmZmVyIHZhbHVlIGJpdHdpc2UuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEludmVydFN0ZW5jaWxPcCA9IDUzODY7XHJcblxyXG4vKipcclxuICogV2lsbCBuZXZlciByZXR1cm4gdHJ1ZS5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTmV2ZXJTdGVuY2lsRnVuYyA9IDUxMjtcclxuXHJcbi8qKlxyXG4gKiBXaWxsIHJldHVybiB0cnVlIGlmIHRoZSBzdGVuY2lsIHJlZmVyZW5jZSB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIGN1cnJlbnQgc3RlbmNpbCB2YWx1ZS5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTGVzc1N0ZW5jaWxGdW5jID0gNTEzO1xyXG5cclxuLyoqXHJcbiAqIFdpbGwgcmV0dXJuIHRydWUgaWYgdGhlIHN0ZW5jaWwgcmVmZXJlbmNlIHZhbHVlIGlzIGVxdWFsIHRvIHRoZSBjdXJyZW50IHN0ZW5jaWwgdmFsdWUuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEVxdWFsU3RlbmNpbEZ1bmMgPSA1MTQ7XHJcblxyXG4vKipcclxuICogV2lsbCByZXR1cm4gdHJ1ZSBpZiB0aGUgc3RlbmNpbCByZWZlcmVuY2UgdmFsdWUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBjdXJyZW50IHN0ZW5jaWwgdmFsdWUuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IExlc3NFcXVhbFN0ZW5jaWxGdW5jID0gNTE1O1xyXG5cclxuLyoqXHJcbiAqIFdpbGwgcmV0dXJuIHRydWUgaWYgdGhlIHN0ZW5jaWwgcmVmZXJlbmNlIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCBzdGVuY2lsIHZhbHVlLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBHcmVhdGVyU3RlbmNpbEZ1bmMgPSA1MTY7XHJcblxyXG4vKipcclxuICogV2lsbCByZXR1cm4gdHJ1ZSBpZiB0aGUgc3RlbmNpbCByZWZlcmVuY2UgdmFsdWUgaXMgbm90IGVxdWFsIHRvIHRoZSBjdXJyZW50IHN0ZW5jaWwgdmFsdWUuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IE5vdEVxdWFsU3RlbmNpbEZ1bmMgPSA1MTc7XHJcblxyXG4vKipcclxuICogV2lsbCByZXR1cm4gdHJ1ZSBpZiB0aGUgc3RlbmNpbCByZWZlcmVuY2UgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBjdXJyZW50IHN0ZW5jaWwgdmFsdWUuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEdyZWF0ZXJFcXVhbFN0ZW5jaWxGdW5jID0gNTE4O1xyXG5cclxuLyoqXHJcbiAqIFdpbGwgYWx3YXlzIHJldHVybiB0cnVlLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBBbHdheXNTdGVuY2lsRnVuYyA9IDUxOTtcclxuXHJcbi8qKlxyXG4gKiBOZXZlciBwYXNzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBOZXZlckNvbXBhcmUgPSA1MTI7XHJcblxyXG4vKipcclxuICogUGFzcyBpZiB0aGUgaW5jb21pbmcgdmFsdWUgaXMgbGVzcyB0aGFuIHRoZSB0ZXh0dXJlIHZhbHVlLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBMZXNzQ29tcGFyZSA9IDUxMztcclxuXHJcbi8qKlxyXG4gKiBQYXNzIGlmIHRoZSBpbmNvbWluZyB2YWx1ZSBlcXVhbHMgdGhlIHRleHR1cmUgdmFsdWUuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEVxdWFsQ29tcGFyZSA9IDUxNDtcclxuXHJcbi8qKlxyXG4gKiBQYXNzIGlmIHRoZSBpbmNvbWluZyB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHRleHR1cmUgdmFsdWUuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IExlc3NFcXVhbENvbXBhcmUgPSA1MTU7XHJcblxyXG4vKipcclxuICogUGFzcyBpZiB0aGUgaW5jb21pbmcgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSB0ZXh0dXJlIHZhbHVlLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBHcmVhdGVyQ29tcGFyZSA9IDUxNjtcclxuXHJcbi8qKlxyXG4gKiBQYXNzIGlmIHRoZSBpbmNvbWluZyB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gdGhlIHRleHR1cmUgdmFsdWUuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IE5vdEVxdWFsQ29tcGFyZSA9IDUxNztcclxuXHJcbi8qKlxyXG4gKiBQYXNzIGlmIHRoZSBpbmNvbWluZyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHRleHR1cmUgdmFsdWUuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEdyZWF0ZXJFcXVhbENvbXBhcmUgPSA1MTg7XHJcblxyXG4vKipcclxuICogQWx3YXlzIHBhc3MuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEFsd2F5c0NvbXBhcmUgPSA1MTk7XHJcblxyXG4vKipcclxuICogVGhlIGNvbnRlbnRzIGFyZSBpbnRlbmRlZCB0byBiZSBzcGVjaWZpZWQgb25jZSBieSB0aGUgYXBwbGljYXRpb24sIGFuZCB1c2VkIG1hbnlcclxuICogdGltZXMgYXMgdGhlIHNvdXJjZSBmb3IgZHJhd2luZyBhbmQgaW1hZ2Ugc3BlY2lmaWNhdGlvbiBjb21tYW5kcy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgU3RhdGljRHJhd1VzYWdlID0gMzUwNDQ7XHJcblxyXG4vKipcclxuICogVGhlIGNvbnRlbnRzIGFyZSBpbnRlbmRlZCB0byBiZSByZXNwZWNpZmllZCByZXBlYXRlZGx5IGJ5IHRoZSBhcHBsaWNhdGlvbiwgYW5kXHJcbiAqIHVzZWQgbWFueSB0aW1lcyBhcyB0aGUgc291cmNlIGZvciBkcmF3aW5nIGFuZCBpbWFnZSBzcGVjaWZpY2F0aW9uIGNvbW1hbmRzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBEeW5hbWljRHJhd1VzYWdlID0gMzUwNDg7XHJcblxyXG4vKipcclxuICogVGhlIGNvbnRlbnRzIGFyZSBpbnRlbmRlZCB0byBiZSBzcGVjaWZpZWQgb25jZSBieSB0aGUgYXBwbGljYXRpb24sIGFuZCB1c2VkIGF0IG1vc3RcclxuICogYSBmZXcgdGltZXMgYXMgdGhlIHNvdXJjZSBmb3IgZHJhd2luZyBhbmQgaW1hZ2Ugc3BlY2lmaWNhdGlvbiBjb21tYW5kcy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgU3RyZWFtRHJhd1VzYWdlID0gMzUwNDA7XHJcblxyXG4vKipcclxuICogVGhlIGNvbnRlbnRzIGFyZSBpbnRlbmRlZCB0byBiZSBzcGVjaWZpZWQgb25jZSBieSByZWFkaW5nIGRhdGEgZnJvbSB0aGUgM0QgQVBJLCBhbmQgcXVlcmllZFxyXG4gKiBtYW55IHRpbWVzIGJ5IHRoZSBhcHBsaWNhdGlvbi5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgU3RhdGljUmVhZFVzYWdlID0gMzUwNDU7XHJcblxyXG4vKipcclxuICogVGhlIGNvbnRlbnRzIGFyZSBpbnRlbmRlZCB0byBiZSByZXNwZWNpZmllZCByZXBlYXRlZGx5IGJ5IHJlYWRpbmcgZGF0YSBmcm9tIHRoZSAzRCBBUEksIGFuZCBxdWVyaWVkXHJcbiAqIG1hbnkgdGltZXMgYnkgdGhlIGFwcGxpY2F0aW9uLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBEeW5hbWljUmVhZFVzYWdlID0gMzUwNDk7XHJcblxyXG4vKipcclxuICogVGhlIGNvbnRlbnRzIGFyZSBpbnRlbmRlZCB0byBiZSBzcGVjaWZpZWQgb25jZSBieSByZWFkaW5nIGRhdGEgZnJvbSB0aGUgM0QgQVBJLCBhbmQgcXVlcmllZCBhdCBtb3N0XHJcbiAqIGEgZmV3IHRpbWVzIGJ5IHRoZSBhcHBsaWNhdGlvblxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBTdHJlYW1SZWFkVXNhZ2UgPSAzNTA0MTtcclxuXHJcbi8qKlxyXG4gKiBUaGUgY29udGVudHMgYXJlIGludGVuZGVkIHRvIGJlIHNwZWNpZmllZCBvbmNlIGJ5IHJlYWRpbmcgZGF0YSBmcm9tIHRoZSAzRCBBUEksIGFuZCB1c2VkIG1hbnkgdGltZXMgYXNcclxuICogdGhlIHNvdXJjZSBmb3IgV2ViR0wgZHJhd2luZyBhbmQgaW1hZ2Ugc3BlY2lmaWNhdGlvbiBjb21tYW5kcy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgU3RhdGljQ29weVVzYWdlID0gMzUwNDY7XHJcblxyXG4vKipcclxuICogVGhlIGNvbnRlbnRzIGFyZSBpbnRlbmRlZCB0byBiZSByZXNwZWNpZmllZCByZXBlYXRlZGx5IGJ5IHJlYWRpbmcgZGF0YSBmcm9tIHRoZSAzRCBBUEksIGFuZCB1c2VkIG1hbnkgdGltZXNcclxuICogYXMgdGhlIHNvdXJjZSBmb3IgV2ViR0wgZHJhd2luZyBhbmQgaW1hZ2Ugc3BlY2lmaWNhdGlvbiBjb21tYW5kcy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgRHluYW1pY0NvcHlVc2FnZSA9IDM1MDUwO1xyXG5cclxuLyoqXHJcbiAqIFRoZSBjb250ZW50cyBhcmUgaW50ZW5kZWQgdG8gYmUgc3BlY2lmaWVkIG9uY2UgYnkgcmVhZGluZyBkYXRhIGZyb20gdGhlIDNEIEFQSSwgYW5kIHVzZWQgYXQgbW9zdCBhIGZldyB0aW1lc1xyXG4gKiBhcyB0aGUgc291cmNlIGZvciBXZWJHTCBkcmF3aW5nIGFuZCBpbWFnZSBzcGVjaWZpY2F0aW9uIGNvbW1hbmRzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBTdHJlYW1Db3B5VXNhZ2UgPSAzNTA0MjtcclxuXHJcbi8qKlxyXG4gKiBHTFNMIDEgc2hhZGVyIGNvZGUuXHJcbiAqXHJcbiAqIEB0eXBlIHtzdHJpbmd9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEdMU0wxID0gJzEwMCc7XHJcblxyXG4vKipcclxuICogR0xTTCAzIHNoYWRlciBjb2RlLlxyXG4gKlxyXG4gKiBAdHlwZSB7c3RyaW5nfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBHTFNMMyA9ICczMDAgZXMnO1xyXG5cclxuLyoqXHJcbiAqIFdlYkdMIGNvb3JkaW5hdGUgc3lzdGVtLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBXZWJHTENvb3JkaW5hdGVTeXN0ZW0gPSAyMDAwO1xyXG5cclxuLyoqXHJcbiAqIFdlYkdQVSBjb29yZGluYXRlIHN5c3RlbS5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgV2ViR1BVQ29vcmRpbmF0ZVN5c3RlbSA9IDIwMDE7XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyB0aGUgZGlmZmVyZW50IHRpbWVzdGFtcCBxdWVyeSB0eXBlcy5cclxuICpcclxuICogQHR5cGUge0NvbnN0YW50c1RpbWVzdGFtcFF1ZXJ5fVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBUaW1lc3RhbXBRdWVyeSA9IHtcclxuXHRDT01QVVRFOiAnY29tcHV0ZScsXHJcblx0UkVOREVSOiAncmVuZGVyJ1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgdHlwZSByZXByZXNlbnRzIG1vdXNlIGJ1dHRvbnMgYW5kIGludGVyYWN0aW9uIHR5cGVzIGluIGNvbnRleHQgb2YgY29udHJvbHMuXHJcbiAqXHJcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENvbnN0YW50c01vdXNlXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBNSURETEUgLSBUaGUgbGVmdCBtb3VzZSBidXR0b24uXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBMRUZUIC0gVGhlIG1pZGRsZSBtb3VzZSBidXR0b24uXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBSSUdIVCAtIFRoZSByaWdodCBtb3VzZSBidXR0b24uXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBST1RBVEUgLSBBIHJvdGF0ZSBpbnRlcmFjdGlvbi5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IERPTExZIC0gQSBkb2xseSBpbnRlcmFjdGlvbi5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFBBTiAtIEEgcGFuIGludGVyYWN0aW9uLlxyXG4gKiovXHJcblxyXG4vKipcclxuICogVGhpcyB0eXBlIHJlcHJlc2VudHMgdG91Y2ggaW50ZXJhY3Rpb24gdHlwZXMgaW4gY29udGV4dCBvZiBjb250cm9scy5cclxuICpcclxuICogQHR5cGVkZWYge09iamVjdH0gQ29uc3RhbnRzVG91Y2hcclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFJPVEFURSAtIEEgcm90YXRlIGludGVyYWN0aW9uLlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gUEFOIC0gQSBwYW4gaW50ZXJhY3Rpb24uXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBET0xMWV9QQU4gLSBUaGUgZG9sbHktcGFuIGludGVyYWN0aW9uLlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gRE9MTFlfUk9UQVRFIC0gQSBkb2xseS1yb3RhdGUgaW50ZXJhY3Rpb24uXHJcbiAqKi9cclxuXHJcbi8qKlxyXG4gKiBUaGlzIHR5cGUgcmVwcmVzZW50cyB0aGUgZGlmZmVyZW50IHRpbWVzdGFtcCBxdWVyeSB0eXBlcy5cclxuICpcclxuICogQHR5cGVkZWYge09iamVjdH0gQ29uc3RhbnRzVGltZXN0YW1wUXVlcnlcclxuICogQHByb3BlcnR5IHtzdHJpbmd9IENPTVBVVEUgLSBBIGBjb21wdXRlYCB0aW1lc3RhbXAgcXVlcnkuXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSRU5ERVIgLSBBIGByZW5kZXJgIHRpbWVzdGFtcCBxdWVyeS5cclxuICoqL1xyXG4iLCIvKipcclxuICogVGhpcyBtb2R1bGVzIGFsbG93cyB0byBkaXNwYXRjaCBldmVudCBvYmplY3RzIG9uIGN1c3RvbSBKYXZhU2NyaXB0IG9iamVjdHMuXHJcbiAqXHJcbiAqIE1haW4gcmVwb3NpdG9yeTogW2V2ZW50ZGlzcGF0Y2hlci5qc117QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL21yZG9vYi9ldmVudGRpc3BhdGNoZXIuanMvfVxyXG4gKlxyXG4gKiBDb2RlIEV4YW1wbGU6XHJcbiAqIGBgYGpzXHJcbiAqIGNsYXNzIENhciBleHRlbmRzIEV2ZW50RGlzcGF0Y2hlciB7XHJcbiAqIFx0c3RhcnQoKSB7XHJcbiAqXHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnc3RhcnQnLCBtZXNzYWdlOiAndnJvb20gdnJvb20hJyB9ICk7XHJcbiAqXHR9XHJcbiAqfTtcclxuICpcclxuICogLy8gVXNpbmcgZXZlbnRzIHdpdGggdGhlIGN1c3RvbSBvYmplY3RcclxuICogY29uc3QgY2FyID0gbmV3IENhcigpO1xyXG4gKiBjYXIuYWRkRXZlbnRMaXN0ZW5lciggJ3N0YXJ0JywgZnVuY3Rpb24gKCBldmVudCApIHtcclxuICogXHRhbGVydCggZXZlbnQubWVzc2FnZSApO1xyXG4gKiB9ICk7XHJcbiAqXHJcbiAqIGNhci5zdGFydCgpO1xyXG4gKiBgYGBcclxuICovXHJcbmNsYXNzIEV2ZW50RGlzcGF0Y2hlciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgdGhlIGdpdmVuIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBnaXZlbiBldmVudCB0eXBlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBUaGUgdHlwZSBvZiBldmVudCB0byBsaXN0ZW4gdG8uXHJcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgLSBUaGUgZnVuY3Rpb24gdGhhdCBnZXRzIGNhbGxlZCB3aGVuIHRoZSBldmVudCBpcyBmaXJlZC5cclxuXHQgKi9cclxuXHRhZGRFdmVudExpc3RlbmVyKCB0eXBlLCBsaXN0ZW5lciApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuX2xpc3RlbmVycyA9PT0gdW5kZWZpbmVkICkgdGhpcy5fbGlzdGVuZXJzID0ge307XHJcblxyXG5cdFx0Y29uc3QgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzO1xyXG5cclxuXHRcdGlmICggbGlzdGVuZXJzWyB0eXBlIF0gPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGxpc3RlbmVyc1sgdHlwZSBdID0gW107XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggbGlzdGVuZXJzWyB0eXBlIF0uaW5kZXhPZiggbGlzdGVuZXIgKSA9PT0gLSAxICkge1xyXG5cclxuXHRcdFx0bGlzdGVuZXJzWyB0eXBlIF0ucHVzaCggbGlzdGVuZXIgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIGV2ZW50IGxpc3RlbmVyIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBnaXZlbiBldmVudCB0eXBlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBUaGUgdHlwZSBvZiBldmVudC5cclxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciAtIFRoZSBsaXN0ZW5lciB0byBjaGVjay5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBnaXZlbiBldmVudCBsaXN0ZW5lciBoYXMgYmVlbiBhZGRlZCB0byB0aGUgZ2l2ZW4gZXZlbnQgdHlwZS5cclxuXHQgKi9cclxuXHRoYXNFdmVudExpc3RlbmVyKCB0eXBlLCBsaXN0ZW5lciApIHtcclxuXHJcblx0XHRjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnM7XHJcblxyXG5cdFx0aWYgKCBsaXN0ZW5lcnMgPT09IHVuZGVmaW5lZCApIHJldHVybiBmYWxzZTtcclxuXHJcblx0XHRyZXR1cm4gbGlzdGVuZXJzWyB0eXBlIF0gIT09IHVuZGVmaW5lZCAmJiBsaXN0ZW5lcnNbIHR5cGUgXS5pbmRleE9mKCBsaXN0ZW5lciApICE9PSAtIDE7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVtb3ZlcyB0aGUgZ2l2ZW4gZXZlbnQgbGlzdGVuZXIgZnJvbSB0aGUgZ2l2ZW4gZXZlbnQgdHlwZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIHR5cGUgb2YgZXZlbnQuXHJcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgLSBUaGUgbGlzdGVuZXIgdG8gcmVtb3ZlLlxyXG5cdCAqL1xyXG5cdHJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIGxpc3RlbmVyICkge1xyXG5cclxuXHRcdGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycztcclxuXHJcblx0XHRpZiAoIGxpc3RlbmVycyA9PT0gdW5kZWZpbmVkICkgcmV0dXJuO1xyXG5cclxuXHRcdGNvbnN0IGxpc3RlbmVyQXJyYXkgPSBsaXN0ZW5lcnNbIHR5cGUgXTtcclxuXHJcblx0XHRpZiAoIGxpc3RlbmVyQXJyYXkgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGluZGV4ID0gbGlzdGVuZXJBcnJheS5pbmRleE9mKCBsaXN0ZW5lciApO1xyXG5cclxuXHRcdFx0aWYgKCBpbmRleCAhPT0gLSAxICkge1xyXG5cclxuXHRcdFx0XHRsaXN0ZW5lckFycmF5LnNwbGljZSggaW5kZXgsIDEgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGlzcGF0Y2hlcyBhbiBldmVudCBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgLSBUaGUgZXZlbnQgdGhhdCBnZXRzIGZpcmVkLlxyXG5cdCAqL1xyXG5cdGRpc3BhdGNoRXZlbnQoIGV2ZW50ICkge1xyXG5cclxuXHRcdGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycztcclxuXHJcblx0XHRpZiAoIGxpc3RlbmVycyA9PT0gdW5kZWZpbmVkICkgcmV0dXJuO1xyXG5cclxuXHRcdGNvbnN0IGxpc3RlbmVyQXJyYXkgPSBsaXN0ZW5lcnNbIGV2ZW50LnR5cGUgXTtcclxuXHJcblx0XHRpZiAoIGxpc3RlbmVyQXJyYXkgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGV2ZW50LnRhcmdldCA9IHRoaXM7XHJcblxyXG5cdFx0XHQvLyBNYWtlIGEgY29weSwgaW4gY2FzZSBsaXN0ZW5lcnMgYXJlIHJlbW92ZWQgd2hpbGUgaXRlcmF0aW5nLlxyXG5cdFx0XHRjb25zdCBhcnJheSA9IGxpc3RlbmVyQXJyYXkuc2xpY2UoIDAgKTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGFycmF5WyBpIF0uY2FsbCggdGhpcywgZXZlbnQgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGV2ZW50LnRhcmdldCA9IG51bGw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgRXZlbnREaXNwYXRjaGVyIH07XHJcbiIsImNvbnN0IF9sdXQgPSBbICcwMCcsICcwMScsICcwMicsICcwMycsICcwNCcsICcwNScsICcwNicsICcwNycsICcwOCcsICcwOScsICcwYScsICcwYicsICcwYycsICcwZCcsICcwZScsICcwZicsICcxMCcsICcxMScsICcxMicsICcxMycsICcxNCcsICcxNScsICcxNicsICcxNycsICcxOCcsICcxOScsICcxYScsICcxYicsICcxYycsICcxZCcsICcxZScsICcxZicsICcyMCcsICcyMScsICcyMicsICcyMycsICcyNCcsICcyNScsICcyNicsICcyNycsICcyOCcsICcyOScsICcyYScsICcyYicsICcyYycsICcyZCcsICcyZScsICcyZicsICczMCcsICczMScsICczMicsICczMycsICczNCcsICczNScsICczNicsICczNycsICczOCcsICczOScsICczYScsICczYicsICczYycsICczZCcsICczZScsICczZicsICc0MCcsICc0MScsICc0MicsICc0MycsICc0NCcsICc0NScsICc0NicsICc0NycsICc0OCcsICc0OScsICc0YScsICc0YicsICc0YycsICc0ZCcsICc0ZScsICc0ZicsICc1MCcsICc1MScsICc1MicsICc1MycsICc1NCcsICc1NScsICc1NicsICc1NycsICc1OCcsICc1OScsICc1YScsICc1YicsICc1YycsICc1ZCcsICc1ZScsICc1ZicsICc2MCcsICc2MScsICc2MicsICc2MycsICc2NCcsICc2NScsICc2NicsICc2NycsICc2OCcsICc2OScsICc2YScsICc2YicsICc2YycsICc2ZCcsICc2ZScsICc2ZicsICc3MCcsICc3MScsICc3MicsICc3MycsICc3NCcsICc3NScsICc3NicsICc3NycsICc3OCcsICc3OScsICc3YScsICc3YicsICc3YycsICc3ZCcsICc3ZScsICc3ZicsICc4MCcsICc4MScsICc4MicsICc4MycsICc4NCcsICc4NScsICc4NicsICc4NycsICc4OCcsICc4OScsICc4YScsICc4YicsICc4YycsICc4ZCcsICc4ZScsICc4ZicsICc5MCcsICc5MScsICc5MicsICc5MycsICc5NCcsICc5NScsICc5NicsICc5NycsICc5OCcsICc5OScsICc5YScsICc5YicsICc5YycsICc5ZCcsICc5ZScsICc5ZicsICdhMCcsICdhMScsICdhMicsICdhMycsICdhNCcsICdhNScsICdhNicsICdhNycsICdhOCcsICdhOScsICdhYScsICdhYicsICdhYycsICdhZCcsICdhZScsICdhZicsICdiMCcsICdiMScsICdiMicsICdiMycsICdiNCcsICdiNScsICdiNicsICdiNycsICdiOCcsICdiOScsICdiYScsICdiYicsICdiYycsICdiZCcsICdiZScsICdiZicsICdjMCcsICdjMScsICdjMicsICdjMycsICdjNCcsICdjNScsICdjNicsICdjNycsICdjOCcsICdjOScsICdjYScsICdjYicsICdjYycsICdjZCcsICdjZScsICdjZicsICdkMCcsICdkMScsICdkMicsICdkMycsICdkNCcsICdkNScsICdkNicsICdkNycsICdkOCcsICdkOScsICdkYScsICdkYicsICdkYycsICdkZCcsICdkZScsICdkZicsICdlMCcsICdlMScsICdlMicsICdlMycsICdlNCcsICdlNScsICdlNicsICdlNycsICdlOCcsICdlOScsICdlYScsICdlYicsICdlYycsICdlZCcsICdlZScsICdlZicsICdmMCcsICdmMScsICdmMicsICdmMycsICdmNCcsICdmNScsICdmNicsICdmNycsICdmOCcsICdmOScsICdmYScsICdmYicsICdmYycsICdmZCcsICdmZScsICdmZicgXTtcclxuXHJcbmxldCBfc2VlZCA9IDEyMzQ1Njc7XHJcblxyXG5cclxuY29uc3QgREVHMlJBRCA9IE1hdGguUEkgLyAxODA7XHJcbmNvbnN0IFJBRDJERUcgPSAxODAgLyBNYXRoLlBJO1xyXG5cclxuLyoqXHJcbiAqIEdlbmVyYXRlIGEgW1VVSURde0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VuaXZlcnNhbGx5X3VuaXF1ZV9pZGVudGlmaWVyfVxyXG4gKiAodW5pdmVyc2FsbHkgdW5pcXVlIGlkZW50aWZpZXIpLlxyXG4gKlxyXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBVVUlELlxyXG4gKi9cclxuZnVuY3Rpb24gZ2VuZXJhdGVVVUlEKCkge1xyXG5cclxuXHQvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzEwNTAzNC9ob3ctdG8tY3JlYXRlLWEtZ3VpZC11dWlkLWluLWphdmFzY3JpcHQvMjE5NjMxMzYjMjE5NjMxMzZcclxuXHJcblx0Y29uc3QgZDAgPSBNYXRoLnJhbmRvbSgpICogMHhmZmZmZmZmZiB8IDA7XHJcblx0Y29uc3QgZDEgPSBNYXRoLnJhbmRvbSgpICogMHhmZmZmZmZmZiB8IDA7XHJcblx0Y29uc3QgZDIgPSBNYXRoLnJhbmRvbSgpICogMHhmZmZmZmZmZiB8IDA7XHJcblx0Y29uc3QgZDMgPSBNYXRoLnJhbmRvbSgpICogMHhmZmZmZmZmZiB8IDA7XHJcblx0Y29uc3QgdXVpZCA9IF9sdXRbIGQwICYgMHhmZiBdICsgX2x1dFsgZDAgPj4gOCAmIDB4ZmYgXSArIF9sdXRbIGQwID4+IDE2ICYgMHhmZiBdICsgX2x1dFsgZDAgPj4gMjQgJiAweGZmIF0gKyAnLScgK1xyXG5cdFx0XHRfbHV0WyBkMSAmIDB4ZmYgXSArIF9sdXRbIGQxID4+IDggJiAweGZmIF0gKyAnLScgKyBfbHV0WyBkMSA+PiAxNiAmIDB4MGYgfCAweDQwIF0gKyBfbHV0WyBkMSA+PiAyNCAmIDB4ZmYgXSArICctJyArXHJcblx0XHRcdF9sdXRbIGQyICYgMHgzZiB8IDB4ODAgXSArIF9sdXRbIGQyID4+IDggJiAweGZmIF0gKyAnLScgKyBfbHV0WyBkMiA+PiAxNiAmIDB4ZmYgXSArIF9sdXRbIGQyID4+IDI0ICYgMHhmZiBdICtcclxuXHRcdFx0X2x1dFsgZDMgJiAweGZmIF0gKyBfbHV0WyBkMyA+PiA4ICYgMHhmZiBdICsgX2x1dFsgZDMgPj4gMTYgJiAweGZmIF0gKyBfbHV0WyBkMyA+PiAyNCAmIDB4ZmYgXTtcclxuXHJcblx0Ly8gLnRvTG93ZXJDYXNlKCkgaGVyZSBmbGF0dGVucyBjb25jYXRlbmF0ZWQgc3RyaW5ncyB0byBzYXZlIGhlYXAgbWVtb3J5IHNwYWNlLlxyXG5cdHJldHVybiB1dWlkLnRvTG93ZXJDYXNlKCk7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQ2xhbXBzIHRoZSBnaXZlbiB2YWx1ZSBiZXR3ZWVuIG1pbiBhbmQgbWF4LlxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2xhbXAuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBtaW4gLSBUaGUgbWluIHZhbHVlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gbWF4IC0gVGhlIG1heCB2YWx1ZS5cclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgY2xhbXBlZCB2YWx1ZS5cclxuICovXHJcbmZ1bmN0aW9uIGNsYW1wKCB2YWx1ZSwgbWluLCBtYXggKSB7XHJcblxyXG5cdHJldHVybiBNYXRoLm1heCggbWluLCBNYXRoLm1pbiggbWF4LCB2YWx1ZSApICk7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQ29tcHV0ZXMgdGhlIEV1Y2xpZGVhbiBtb2R1bG8gb2YgdGhlIGdpdmVuIHBhcmFtZXRlcnMgdGhhdFxyXG4gKiBpcyBgKCAoIG4gJSBtICkgKyBtICkgJSBtYC5cclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IG4gLSBUaGUgZmlyc3QgcGFyYW1ldGVyLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gbSAtIFRoZSBzZWNvbmQgcGFyYW1ldGVyLlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBFdWNsaWRlYW4gbW9kdWxvLlxyXG4gKi9cclxuZnVuY3Rpb24gZXVjbGlkZWFuTW9kdWxvKCBuLCBtICkge1xyXG5cclxuXHQvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Nb2R1bG9fb3BlcmF0aW9uXHJcblxyXG5cdHJldHVybiAoICggbiAlIG0gKSArIG0gKSAlIG07XHJcblxyXG59XHJcblxyXG4vKipcclxuICogUGVyZm9ybXMgYSBsaW5lYXIgbWFwcGluZyBmcm9tIHJhbmdlIGA8YTEsIGEyPmAgdG8gcmFuZ2UgYDxiMSwgYjI+YFxyXG4gKiBmb3IgdGhlIGdpdmVuIHZhbHVlLlxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB2YWx1ZSB0byBiZSBtYXBwZWQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBhMSAtIE1pbmltdW0gdmFsdWUgZm9yIHJhbmdlIEEuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBhMiAtIE1heGltdW0gdmFsdWUgZm9yIHJhbmdlIEEuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBiMSAtIE1pbmltdW0gdmFsdWUgZm9yIHJhbmdlIEIuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBiMiAtIE1heGltdW0gdmFsdWUgZm9yIHJhbmdlIEIuXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIG1hcHBlZCB2YWx1ZS5cclxuICovXHJcbmZ1bmN0aW9uIG1hcExpbmVhciggeCwgYTEsIGEyLCBiMSwgYjIgKSB7XHJcblxyXG5cdHJldHVybiBiMSArICggeCAtIGExICkgKiAoIGIyIC0gYjEgKSAvICggYTIgLSBhMSApO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIHBlcmNlbnRhZ2UgaW4gdGhlIGNsb3NlZCBpbnRlcnZhbCBgWzAsIDFdYCBvZiB0aGUgZ2l2ZW4gdmFsdWVcclxuICogYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCBwb2ludC5cclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgc3RhcnQgcG9pbnRcclxuICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgZW5kIHBvaW50LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBBIHZhbHVlIGJldHdlZW4gc3RhcnQgYW5kIGVuZC5cclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgaW50ZXJwb2xhdGlvbiBmYWN0b3IuXHJcbiAqL1xyXG5mdW5jdGlvbiBpbnZlcnNlTGVycCggeCwgeSwgdmFsdWUgKSB7XHJcblxyXG5cdC8vIGh0dHBzOi8vd3d3LmdhbWVkZXYubmV0L3R1dG9yaWFscy9wcm9ncmFtbWluZy9nZW5lcmFsLWFuZC1nYW1lcGxheS1wcm9ncmFtbWluZy9pbnZlcnNlLWxlcnAtYS1zdXBlci11c2VmdWwteWV0LW9mdGVuLW92ZXJsb29rZWQtZnVuY3Rpb24tcjUyMzAvXHJcblxyXG5cdGlmICggeCAhPT0geSApIHtcclxuXHJcblx0XHRyZXR1cm4gKCB2YWx1ZSAtIHggKSAvICggeSAtIHggKTtcclxuXHJcblx0fSBlbHNlIHtcclxuXHJcblx0XHRyZXR1cm4gMDtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSB2YWx1ZSBsaW5lYXJseSBpbnRlcnBvbGF0ZWQgZnJvbSB0d28ga25vd24gcG9pbnRzIGJhc2VkIG9uIHRoZSBnaXZlbiBpbnRlcnZhbCAtXHJcbiAqIGB0ID0gMGAgd2lsbCByZXR1cm4gYHhgIGFuZCBgdCA9IDFgIHdpbGwgcmV0dXJuIGB5YC5cclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgc3RhcnQgcG9pbnRcclxuICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgZW5kIHBvaW50LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdCAtIFRoZSBpbnRlcnBvbGF0aW9uIGZhY3RvciBpbiB0aGUgY2xvc2VkIGludGVydmFsIGBbMCwgMV1gLlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBpbnRlcnBvbGF0ZWQgdmFsdWUuXHJcbiAqL1xyXG5mdW5jdGlvbiBsZXJwKCB4LCB5LCB0ICkge1xyXG5cclxuXHRyZXR1cm4gKCAxIC0gdCApICogeCArIHQgKiB5O1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFNtb290aGx5IGludGVycG9sYXRlIGEgbnVtYmVyIGZyb20gYHhgIHRvIGB5YCBpbiAgYSBzcHJpbmctbGlrZSBtYW5uZXIgdXNpbmcgYSBkZWx0YVxyXG4gKiB0aW1lIHRvIG1haW50YWluIGZyYW1lIHJhdGUgaW5kZXBlbmRlbnQgbW92ZW1lbnQuIEZvciBkZXRhaWxzLCBzZWVcclxuICogW0ZyYW1lIHJhdGUgaW5kZXBlbmRlbnQgZGFtcGluZyB1c2luZyBsZXJwXXtAbGluayBodHRwOi8vd3d3LnJvcnlkcmlzY29sbC5jb20vMjAxNi8wMy8wNy9mcmFtZS1yYXRlLWluZGVwZW5kZW50LWRhbXBpbmctdXNpbmctbGVycC99LlxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBjdXJyZW50IHBvaW50LlxyXG4gKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB0YXJnZXQgcG9pbnQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBsYW1iZGEgLSBBIGhpZ2hlciBsYW1iZGEgdmFsdWUgd2lsbCBtYWtlIHRoZSBtb3ZlbWVudCBtb3JlIHN1ZGRlbixcclxuICogYW5kIGEgbG93ZXIgdmFsdWUgd2lsbCBtYWtlIHRoZSBtb3ZlbWVudCBtb3JlIGdyYWR1YWwuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBkdCAtIERlbHRhIHRpbWUgaW4gc2Vjb25kcy5cclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgaW50ZXJwb2xhdGVkIHZhbHVlLlxyXG4gKi9cclxuZnVuY3Rpb24gZGFtcCggeCwgeSwgbGFtYmRhLCBkdCApIHtcclxuXHJcblx0cmV0dXJuIGxlcnAoIHgsIHksIDEgLSBNYXRoLmV4cCggLSBsYW1iZGEgKiBkdCApICk7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIHZhbHVlIHRoYXQgYWx0ZXJuYXRlcyBiZXR3ZWVuIGAwYCBhbmQgdGhlIGdpdmVuIGBsZW5ndGhgIHBhcmFtZXRlci5cclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgdmFsdWUgdG8gcGluZ3BvbmcuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPTFdIC0gVGhlIHBvc2l0aXZlIHZhbHVlIHRoZSBmdW5jdGlvbiB3aWxsIHBpbmdwb25nIHRvLlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBhbHRlcm5hdGVkIHZhbHVlLlxyXG4gKi9cclxuZnVuY3Rpb24gcGluZ3BvbmcoIHgsIGxlbmd0aCA9IDEgKSB7XHJcblxyXG5cdC8vIGh0dHBzOi8vd3d3LmRlc21vcy5jb20vY2FsY3VsYXRvci92Y3Nqbnl6N3g0XHJcblxyXG5cdHJldHVybiBsZW5ndGggLSBNYXRoLmFicyggZXVjbGlkZWFuTW9kdWxvKCB4LCBsZW5ndGggKiAyICkgLSBsZW5ndGggKTtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgdmFsdWUgaW4gdGhlIHJhbmdlIGBbMCwxXWAgdGhhdCByZXByZXNlbnRzIHRoZSBwZXJjZW50YWdlIHRoYXQgYHhgIGhhc1xyXG4gKiBtb3ZlZCBiZXR3ZWVuIGBtaW5gIGFuZCBgbWF4YCwgYnV0IHNtb290aGVkIG9yIHNsb3dlZCBkb3duIHRoZSBjbG9zZXIgYHhgIGlzIHRvXHJcbiAqIHRoZSBgbWluYCBhbmQgYG1heGAuXHJcbiAqXHJcbiAqIFNlZSBbU21vb3Roc3RlcF17QGxpbmsgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TbW9vdGhzdGVwfSBmb3IgbW9yZSBkZXRhaWxzLlxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB2YWx1ZSB0byBldmFsdWF0ZSBiYXNlZCBvbiBpdHMgcG9zaXRpb24gYmV0d2VlbiBtaW4gYW5kIG1heC5cclxuICogQHBhcmFtIHtudW1iZXJ9IG1pbiAtIFRoZSBtaW4gdmFsdWUuIEFueSB4IHZhbHVlIGJlbG93IG1pbiB3aWxsIGJlIGAwYC5cclxuICogQHBhcmFtIHtudW1iZXJ9IG1heCAtIFRoZSBtYXggdmFsdWUuIEFueSB4IHZhbHVlIGFib3ZlIG1heCB3aWxsIGJlIGAxYC5cclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgYWx0ZXJuYXRlZCB2YWx1ZS5cclxuICovXHJcbmZ1bmN0aW9uIHNtb290aHN0ZXAoIHgsIG1pbiwgbWF4ICkge1xyXG5cclxuXHRpZiAoIHggPD0gbWluICkgcmV0dXJuIDA7XHJcblx0aWYgKCB4ID49IG1heCApIHJldHVybiAxO1xyXG5cclxuXHR4ID0gKCB4IC0gbWluICkgLyAoIG1heCAtIG1pbiApO1xyXG5cclxuXHRyZXR1cm4geCAqIHggKiAoIDMgLSAyICogeCApO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIEEgW3ZhcmlhdGlvbiBvbiBzbW9vdGhzdGVwXXtAbGluayBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TbW9vdGhzdGVwI1ZhcmlhdGlvbnN9XHJcbiAqIHRoYXQgaGFzIHplcm8gMXN0IGFuZCAybmQgb3JkZXIgZGVyaXZhdGl2ZXMgYXQgeD0wIGFuZCB4PTEuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHZhbHVlIHRvIGV2YWx1YXRlIGJhc2VkIG9uIGl0cyBwb3NpdGlvbiBiZXR3ZWVuIG1pbiBhbmQgbWF4LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gbWluIC0gVGhlIG1pbiB2YWx1ZS4gQW55IHggdmFsdWUgYmVsb3cgbWluIHdpbGwgYmUgYDBgLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gbWF4IC0gVGhlIG1heCB2YWx1ZS4gQW55IHggdmFsdWUgYWJvdmUgbWF4IHdpbGwgYmUgYDFgLlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBhbHRlcm5hdGVkIHZhbHVlLlxyXG4gKi9cclxuZnVuY3Rpb24gc21vb3RoZXJzdGVwKCB4LCBtaW4sIG1heCApIHtcclxuXHJcblx0aWYgKCB4IDw9IG1pbiApIHJldHVybiAwO1xyXG5cdGlmICggeCA+PSBtYXggKSByZXR1cm4gMTtcclxuXHJcblx0eCA9ICggeCAtIG1pbiApIC8gKCBtYXggLSBtaW4gKTtcclxuXHJcblx0cmV0dXJuIHggKiB4ICogeCAqICggeCAqICggeCAqIDYgLSAxNSApICsgMTAgKTtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgcmFuZG9tIGludGVnZXIgZnJvbSBgPGxvdywgaGlnaD5gIGludGVydmFsLlxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gbG93IC0gVGhlIGxvd2VyIHZhbHVlIGJvdW5kYXJ5LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gaGlnaCAtIFRoZSB1cHBlciB2YWx1ZSBib3VuZGFyeVxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IEEgcmFuZG9tIGludGVnZXIuXHJcbiAqL1xyXG5mdW5jdGlvbiByYW5kSW50KCBsb3csIGhpZ2ggKSB7XHJcblxyXG5cdHJldHVybiBsb3cgKyBNYXRoLmZsb29yKCBNYXRoLnJhbmRvbSgpICogKCBoaWdoIC0gbG93ICsgMSApICk7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIHJhbmRvbSBmbG9hdCBmcm9tIGA8bG93LCBoaWdoPmAgaW50ZXJ2YWwuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBsb3cgLSBUaGUgbG93ZXIgdmFsdWUgYm91bmRhcnkuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBoaWdoIC0gVGhlIHVwcGVyIHZhbHVlIGJvdW5kYXJ5XHJcbiAqIEByZXR1cm4ge251bWJlcn0gQSByYW5kb20gZmxvYXQuXHJcbiAqL1xyXG5mdW5jdGlvbiByYW5kRmxvYXQoIGxvdywgaGlnaCApIHtcclxuXHJcblx0cmV0dXJuIGxvdyArIE1hdGgucmFuZG9tKCkgKiAoIGhpZ2ggLSBsb3cgKTtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgcmFuZG9tIGludGVnZXIgZnJvbSBgPC1yYW5nZS8yLCByYW5nZS8yPmAgaW50ZXJ2YWwuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSByYW5nZSAtIERlZmluZXMgdGhlIHZhbHVlIHJhbmdlLlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IEEgcmFuZG9tIGZsb2F0LlxyXG4gKi9cclxuZnVuY3Rpb24gcmFuZEZsb2F0U3ByZWFkKCByYW5nZSApIHtcclxuXHJcblx0cmV0dXJuIHJhbmdlICogKCAwLjUgLSBNYXRoLnJhbmRvbSgpICk7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIGRldGVybWluaXN0aWMgcHNldWRvLXJhbmRvbSBmbG9hdCBpbiB0aGUgaW50ZXJ2YWwgYFswLCAxXWAuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbc10gLSBUaGUgaW50ZWdlciBzZWVkLlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IEEgcmFuZG9tIGZsb2F0LlxyXG4gKi9cclxuZnVuY3Rpb24gc2VlZGVkUmFuZG9tKCBzICkge1xyXG5cclxuXHRpZiAoIHMgIT09IHVuZGVmaW5lZCApIF9zZWVkID0gcztcclxuXHJcblx0Ly8gTXVsYmVycnkzMiBnZW5lcmF0b3JcclxuXHJcblx0bGV0IHQgPSBfc2VlZCArPSAweDZEMkI3OUY1O1xyXG5cclxuXHR0ID0gTWF0aC5pbXVsKCB0IF4gdCA+Pj4gMTUsIHQgfCAxICk7XHJcblxyXG5cdHQgXj0gdCArIE1hdGguaW11bCggdCBeIHQgPj4+IDcsIHQgfCA2MSApO1xyXG5cclxuXHRyZXR1cm4gKCAoIHQgXiB0ID4+PiAxNCApID4+PiAwICkgLyA0Mjk0OTY3Mjk2O1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIENvbnZlcnRzIGRlZ3JlZXMgdG8gcmFkaWFucy5cclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IGRlZ3JlZXMgLSBBIHZhbHVlIGluIGRlZ3JlZXMuXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGNvbnZlcnRlZCB2YWx1ZSBpbiByYWRpYW5zLlxyXG4gKi9cclxuZnVuY3Rpb24gZGVnVG9SYWQoIGRlZ3JlZXMgKSB7XHJcblxyXG5cdHJldHVybiBkZWdyZWVzICogREVHMlJBRDtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyByYWRpYW5zIHRvIGRlZ3JlZXMuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSByYWRpYW5zIC0gQSB2YWx1ZSBpbiByYWRpYW5zLlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBjb252ZXJ0ZWQgdmFsdWUgaW4gZGVncmVlcy5cclxuICovXHJcbmZ1bmN0aW9uIHJhZFRvRGVnKCByYWRpYW5zICkge1xyXG5cclxuXHRyZXR1cm4gcmFkaWFucyAqIFJBRDJERUc7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIG51bWJlciBpcyBhIHBvd2VyIG9mIHR3by5cclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrLlxyXG4gKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBnaXZlbiBudW1iZXIgaXMgYSBwb3dlciBvZiB0d28gb3Igbm90LlxyXG4gKi9cclxuZnVuY3Rpb24gaXNQb3dlck9mVHdvKCB2YWx1ZSApIHtcclxuXHJcblx0cmV0dXJuICggdmFsdWUgJiAoIHZhbHVlIC0gMSApICkgPT09IDAgJiYgdmFsdWUgIT09IDA7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgc21hbGxlc3QgcG93ZXIgb2YgdHdvIHRoYXQgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBnaXZlbiBudW1iZXIuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBmaW5kIGEgUE9UIGZvci5cclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgc21hbGxlc3QgcG93ZXIgb2YgdHdvIHRoYXQgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBnaXZlbiBudW1iZXIuXHJcbiAqL1xyXG5mdW5jdGlvbiBjZWlsUG93ZXJPZlR3byggdmFsdWUgKSB7XHJcblxyXG5cdHJldHVybiBNYXRoLnBvdyggMiwgTWF0aC5jZWlsKCBNYXRoLmxvZyggdmFsdWUgKSAvIE1hdGguTE4yICkgKTtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBsYXJnZXN0IHBvd2VyIG9mIHR3byB0aGF0IGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgZ2l2ZW4gbnVtYmVyLlxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gZmluZCBhIFBPVCBmb3IuXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGxhcmdlc3QgcG93ZXIgb2YgdHdvIHRoYXQgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBnaXZlbiBudW1iZXIuXHJcbiAqL1xyXG5mdW5jdGlvbiBmbG9vclBvd2VyT2ZUd28oIHZhbHVlICkge1xyXG5cclxuXHRyZXR1cm4gTWF0aC5wb3coIDIsIE1hdGguZmxvb3IoIE1hdGgubG9nKCB2YWx1ZSApIC8gTWF0aC5MTjIgKSApO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFNldHMgdGhlIGdpdmVuIHF1YXRlcm5pb24gZnJvbSB0aGUgW0ludHJpbnNpYyBQcm9wZXIgRXVsZXIgQW5nbGVzXXtAbGluayBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FdWxlcl9hbmdsZXN9XHJcbiAqIGRlZmluZWQgYnkgdGhlIGdpdmVuIGFuZ2xlcyBhbmQgb3JkZXIuXHJcbiAqXHJcbiAqIFJvdGF0aW9ucyBhcmUgYXBwbGllZCB0byB0aGUgYXhlcyBpbiB0aGUgb3JkZXIgc3BlY2lmaWVkIGJ5IG9yZGVyOlxyXG4gKiByb3RhdGlvbiBieSBhbmdsZSBgYWAgaXMgYXBwbGllZCBmaXJzdCwgdGhlbiBieSBhbmdsZSBgYmAsIHRoZW4gYnkgYW5nbGUgYGNgLlxyXG4gKlxyXG4gKiBAcGFyYW0ge1F1YXRlcm5pb259IHEgLSBUaGUgcXVhdGVybmlvbiB0byBzZXQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBhIC0gVGhlIHJvdGF0aW9uIGFwcGxpZWQgdG8gdGhlIGZpcnN0IGF4aXMsIGluIHJhZGlhbnMuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBiIC0gVGhlIHJvdGF0aW9uIGFwcGxpZWQgdG8gdGhlIHNlY29uZCBheGlzLCBpbiByYWRpYW5zLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gYyAtIFRoZSByb3RhdGlvbiBhcHBsaWVkIHRvIHRoZSB0aGlyZCBheGlzLCBpbiByYWRpYW5zLlxyXG4gKiBAcGFyYW0geygnWFlYJ3wnWFpYJ3wnWVhZJ3wnWVpZJ3wnWlhaJ3wnWllaJyl9IG9yZGVyIC0gQSBzdHJpbmcgc3BlY2lmeWluZyB0aGUgYXhlcyBvcmRlci5cclxuICovXHJcbmZ1bmN0aW9uIHNldFF1YXRlcm5pb25Gcm9tUHJvcGVyRXVsZXIoIHEsIGEsIGIsIGMsIG9yZGVyICkge1xyXG5cclxuXHRjb25zdCBjb3MgPSBNYXRoLmNvcztcclxuXHRjb25zdCBzaW4gPSBNYXRoLnNpbjtcclxuXHJcblx0Y29uc3QgYzIgPSBjb3MoIGIgLyAyICk7XHJcblx0Y29uc3QgczIgPSBzaW4oIGIgLyAyICk7XHJcblxyXG5cdGNvbnN0IGMxMyA9IGNvcyggKCBhICsgYyApIC8gMiApO1xyXG5cdGNvbnN0IHMxMyA9IHNpbiggKCBhICsgYyApIC8gMiApO1xyXG5cclxuXHRjb25zdCBjMV8zID0gY29zKCAoIGEgLSBjICkgLyAyICk7XHJcblx0Y29uc3QgczFfMyA9IHNpbiggKCBhIC0gYyApIC8gMiApO1xyXG5cclxuXHRjb25zdCBjM18xID0gY29zKCAoIGMgLSBhICkgLyAyICk7XHJcblx0Y29uc3QgczNfMSA9IHNpbiggKCBjIC0gYSApIC8gMiApO1xyXG5cclxuXHRzd2l0Y2ggKCBvcmRlciApIHtcclxuXHJcblx0XHRjYXNlICdYWVgnOlxyXG5cdFx0XHRxLnNldCggYzIgKiBzMTMsIHMyICogYzFfMywgczIgKiBzMV8zLCBjMiAqIGMxMyApO1xyXG5cdFx0XHRicmVhaztcclxuXHJcblx0XHRjYXNlICdZWlknOlxyXG5cdFx0XHRxLnNldCggczIgKiBzMV8zLCBjMiAqIHMxMywgczIgKiBjMV8zLCBjMiAqIGMxMyApO1xyXG5cdFx0XHRicmVhaztcclxuXHJcblx0XHRjYXNlICdaWFonOlxyXG5cdFx0XHRxLnNldCggczIgKiBjMV8zLCBzMiAqIHMxXzMsIGMyICogczEzLCBjMiAqIGMxMyApO1xyXG5cdFx0XHRicmVhaztcclxuXHJcblx0XHRjYXNlICdYWlgnOlxyXG5cdFx0XHRxLnNldCggYzIgKiBzMTMsIHMyICogczNfMSwgczIgKiBjM18xLCBjMiAqIGMxMyApO1xyXG5cdFx0XHRicmVhaztcclxuXHJcblx0XHRjYXNlICdZWFknOlxyXG5cdFx0XHRxLnNldCggczIgKiBjM18xLCBjMiAqIHMxMywgczIgKiBzM18xLCBjMiAqIGMxMyApO1xyXG5cdFx0XHRicmVhaztcclxuXHJcblx0XHRjYXNlICdaWVonOlxyXG5cdFx0XHRxLnNldCggczIgKiBzM18xLCBzMiAqIGMzXzEsIGMyICogczEzLCBjMiAqIGMxMyApO1xyXG5cdFx0XHRicmVhaztcclxuXHJcblx0XHRkZWZhdWx0OlxyXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRoVXRpbHM6IC5zZXRRdWF0ZXJuaW9uRnJvbVByb3BlckV1bGVyKCkgZW5jb3VudGVyZWQgYW4gdW5rbm93biBvcmRlcjogJyArIG9yZGVyICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBEZW5vcm1hbGl6ZXMgdGhlIGdpdmVuIHZhbHVlIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gdHlwZWQgYXJyYXkuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBkZW5vcm1hbGl6ZS5cclxuICogQHBhcmFtIHtUeXBlZEFycmF5fSBhcnJheSAtIFRoZSB0eXBlZCBhcnJheSB0aGF0IGRlZmluZXMgdGhlIGRhdGEgdHlwZSBvZiB0aGUgdmFsdWUuXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGRlbm9ybWFsaXplIChmbG9hdCkgdmFsdWUgaW4gdGhlIHJhbmdlIGBbMCwxXWAuXHJcbiAqL1xyXG5mdW5jdGlvbiBkZW5vcm1hbGl6ZSggdmFsdWUsIGFycmF5ICkge1xyXG5cclxuXHRzd2l0Y2ggKCBhcnJheS5jb25zdHJ1Y3RvciApIHtcclxuXHJcblx0XHRjYXNlIEZsb2F0MzJBcnJheTpcclxuXHJcblx0XHRcdHJldHVybiB2YWx1ZTtcclxuXHJcblx0XHRjYXNlIFVpbnQzMkFycmF5OlxyXG5cclxuXHRcdFx0cmV0dXJuIHZhbHVlIC8gNDI5NDk2NzI5NS4wO1xyXG5cclxuXHRcdGNhc2UgVWludDE2QXJyYXk6XHJcblxyXG5cdFx0XHRyZXR1cm4gdmFsdWUgLyA2NTUzNS4wO1xyXG5cclxuXHRcdGNhc2UgVWludDhBcnJheTpcclxuXHJcblx0XHRcdHJldHVybiB2YWx1ZSAvIDI1NS4wO1xyXG5cclxuXHRcdGNhc2UgSW50MzJBcnJheTpcclxuXHJcblx0XHRcdHJldHVybiBNYXRoLm1heCggdmFsdWUgLyAyMTQ3NDgzNjQ3LjAsIC0gMS4wICk7XHJcblxyXG5cdFx0Y2FzZSBJbnQxNkFycmF5OlxyXG5cclxuXHRcdFx0cmV0dXJuIE1hdGgubWF4KCB2YWx1ZSAvIDMyNzY3LjAsIC0gMS4wICk7XHJcblxyXG5cdFx0Y2FzZSBJbnQ4QXJyYXk6XHJcblxyXG5cdFx0XHRyZXR1cm4gTWF0aC5tYXgoIHZhbHVlIC8gMTI3LjAsIC0gMS4wICk7XHJcblxyXG5cdFx0ZGVmYXVsdDpcclxuXHJcblx0XHRcdHRocm93IG5ldyBFcnJvciggJ0ludmFsaWQgY29tcG9uZW50IHR5cGUuJyApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogTm9ybWFsaXplcyB0aGUgZ2l2ZW4gdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiB0eXBlZCBhcnJheS5cclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIGZsb2F0IHZhbHVlIGluIHRoZSByYW5nZSBgWzAsMV1gIHRvIG5vcm1hbGl6ZS5cclxuICogQHBhcmFtIHtUeXBlZEFycmF5fSBhcnJheSAtIFRoZSB0eXBlZCBhcnJheSB0aGF0IGRlZmluZXMgdGhlIGRhdGEgdHlwZSBvZiB0aGUgdmFsdWUuXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIG5vcm1hbGl6ZSB2YWx1ZS5cclxuICovXHJcbmZ1bmN0aW9uIG5vcm1hbGl6ZSggdmFsdWUsIGFycmF5ICkge1xyXG5cclxuXHRzd2l0Y2ggKCBhcnJheS5jb25zdHJ1Y3RvciApIHtcclxuXHJcblx0XHRjYXNlIEZsb2F0MzJBcnJheTpcclxuXHJcblx0XHRcdHJldHVybiB2YWx1ZTtcclxuXHJcblx0XHRjYXNlIFVpbnQzMkFycmF5OlxyXG5cclxuXHRcdFx0cmV0dXJuIE1hdGgucm91bmQoIHZhbHVlICogNDI5NDk2NzI5NS4wICk7XHJcblxyXG5cdFx0Y2FzZSBVaW50MTZBcnJheTpcclxuXHJcblx0XHRcdHJldHVybiBNYXRoLnJvdW5kKCB2YWx1ZSAqIDY1NTM1LjAgKTtcclxuXHJcblx0XHRjYXNlIFVpbnQ4QXJyYXk6XHJcblxyXG5cdFx0XHRyZXR1cm4gTWF0aC5yb3VuZCggdmFsdWUgKiAyNTUuMCApO1xyXG5cclxuXHRcdGNhc2UgSW50MzJBcnJheTpcclxuXHJcblx0XHRcdHJldHVybiBNYXRoLnJvdW5kKCB2YWx1ZSAqIDIxNDc0ODM2NDcuMCApO1xyXG5cclxuXHRcdGNhc2UgSW50MTZBcnJheTpcclxuXHJcblx0XHRcdHJldHVybiBNYXRoLnJvdW5kKCB2YWx1ZSAqIDMyNzY3LjAgKTtcclxuXHJcblx0XHRjYXNlIEludDhBcnJheTpcclxuXHJcblx0XHRcdHJldHVybiBNYXRoLnJvdW5kKCB2YWx1ZSAqIDEyNy4wICk7XHJcblxyXG5cdFx0ZGVmYXVsdDpcclxuXHJcblx0XHRcdHRocm93IG5ldyBFcnJvciggJ0ludmFsaWQgY29tcG9uZW50IHR5cGUuJyApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQGNsYXNzXHJcbiAqIEBjbGFzc2Rlc2MgQSBjb2xsZWN0aW9uIG9mIG1hdGggdXRpbGl0eSBmdW5jdGlvbnMuXHJcbiAqIEBoaWRlY29uc3RydWN0b3JcclxuICovXHJcbmNvbnN0IE1hdGhVdGlscyA9IHtcclxuXHRERUcyUkFEOiBERUcyUkFELFxyXG5cdFJBRDJERUc6IFJBRDJERUcsXHJcblx0LyoqXHJcblx0ICogR2VuZXJhdGUgYSBbVVVJRF17QGxpbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVW5pdmVyc2FsbHlfdW5pcXVlX2lkZW50aWZpZXJ9XHJcblx0ICogKHVuaXZlcnNhbGx5IHVuaXF1ZSBpZGVudGlmaWVyKS5cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAbWV0aG9kXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgVVVJRC5cclxuXHQgKi9cclxuXHRnZW5lcmF0ZVVVSUQ6IGdlbmVyYXRlVVVJRCxcclxuXHQvKipcclxuXHQgKiBDbGFtcHMgdGhlIGdpdmVuIHZhbHVlIGJldHdlZW4gbWluIGFuZCBtYXguXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQG1ldGhvZFxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjbGFtcC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbWluIC0gVGhlIG1pbiB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbWF4IC0gVGhlIG1heCB2YWx1ZS5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBjbGFtcGVkIHZhbHVlLlxyXG5cdCAqL1xyXG5cdGNsYW1wOiBjbGFtcCxcclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB0aGUgRXVjbGlkZWFuIG1vZHVsbyBvZiB0aGUgZ2l2ZW4gcGFyYW1ldGVycyB0aGF0XHJcblx0ICogaXMgYCggKCBuICUgbSApICsgbSApICUgbWAuXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQG1ldGhvZFxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBuIC0gVGhlIGZpcnN0IHBhcmFtZXRlci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbSAtIFRoZSBzZWNvbmQgcGFyYW1ldGVyLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIEV1Y2xpZGVhbiBtb2R1bG8uXHJcblx0ICovXHJcblx0ZXVjbGlkZWFuTW9kdWxvOiBldWNsaWRlYW5Nb2R1bG8sXHJcblx0LyoqXHJcblx0ICogUGVyZm9ybXMgYSBsaW5lYXIgbWFwcGluZyBmcm9tIHJhbmdlIGA8YTEsIGEyPmAgdG8gcmFuZ2UgYDxiMSwgYjI+YFxyXG5cdCAqIGZvciB0aGUgZ2l2ZW4gdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQG1ldGhvZFxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHZhbHVlIHRvIGJlIG1hcHBlZC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYTEgLSBNaW5pbXVtIHZhbHVlIGZvciByYW5nZSBBLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhMiAtIE1heGltdW0gdmFsdWUgZm9yIHJhbmdlIEEuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGIxIC0gTWluaW11bSB2YWx1ZSBmb3IgcmFuZ2UgQi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYjIgLSBNYXhpbXVtIHZhbHVlIGZvciByYW5nZSBCLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIG1hcHBlZCB2YWx1ZS5cclxuXHQgKi9cclxuXHRtYXBMaW5lYXI6IG1hcExpbmVhcixcclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBwZXJjZW50YWdlIGluIHRoZSBjbG9zZWQgaW50ZXJ2YWwgYFswLCAxXWAgb2YgdGhlIGdpdmVuIHZhbHVlXHJcblx0ICogYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCBwb2ludC5cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAbWV0aG9kXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgc3RhcnQgcG9pbnRcclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSBlbmQgcG9pbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gQSB2YWx1ZSBiZXR3ZWVuIHN0YXJ0IGFuZCBlbmQuXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgaW50ZXJwb2xhdGlvbiBmYWN0b3IuXHJcblx0ICovXHJcblx0aW52ZXJzZUxlcnA6IGludmVyc2VMZXJwLFxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSB2YWx1ZSBsaW5lYXJseSBpbnRlcnBvbGF0ZWQgZnJvbSB0d28ga25vd24gcG9pbnRzIGJhc2VkIG9uIHRoZSBnaXZlbiBpbnRlcnZhbCAtXHJcblx0ICogYHQgPSAwYCB3aWxsIHJldHVybiBgeGAgYW5kIGB0ID0gMWAgd2lsbCByZXR1cm4gYHlgLlxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEBtZXRob2RcclxuXHQgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBzdGFydCBwb2ludFxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIGVuZCBwb2ludC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdCAtIFRoZSBpbnRlcnBvbGF0aW9uIGZhY3RvciBpbiB0aGUgY2xvc2VkIGludGVydmFsIGBbMCwgMV1gLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGludGVycG9sYXRlZCB2YWx1ZS5cclxuXHQgKi9cclxuXHRsZXJwOiBsZXJwLFxyXG5cdC8qKlxyXG5cdCAqIFNtb290aGx5IGludGVycG9sYXRlIGEgbnVtYmVyIGZyb20gYHhgIHRvIGB5YCBpbiAgYSBzcHJpbmctbGlrZSBtYW5uZXIgdXNpbmcgYSBkZWx0YVxyXG5cdCAqIHRpbWUgdG8gbWFpbnRhaW4gZnJhbWUgcmF0ZSBpbmRlcGVuZGVudCBtb3ZlbWVudC4gRm9yIGRldGFpbHMsIHNlZVxyXG5cdCAqIFtGcmFtZSByYXRlIGluZGVwZW5kZW50IGRhbXBpbmcgdXNpbmcgbGVycF17QGxpbmsgaHR0cDovL3d3dy5yb3J5ZHJpc2NvbGwuY29tLzIwMTYvMDMvMDcvZnJhbWUtcmF0ZS1pbmRlcGVuZGVudC1kYW1waW5nLXVzaW5nLWxlcnAvfS5cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAbWV0aG9kXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgY3VycmVudCBwb2ludC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB0YXJnZXQgcG9pbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGxhbWJkYSAtIEEgaGlnaGVyIGxhbWJkYSB2YWx1ZSB3aWxsIG1ha2UgdGhlIG1vdmVtZW50IG1vcmUgc3VkZGVuLFxyXG5cdCAqIGFuZCBhIGxvd2VyIHZhbHVlIHdpbGwgbWFrZSB0aGUgbW92ZW1lbnQgbW9yZSBncmFkdWFsLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBkdCAtIERlbHRhIHRpbWUgaW4gc2Vjb25kcy5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBpbnRlcnBvbGF0ZWQgdmFsdWUuXHJcblx0ICovXHJcblx0ZGFtcDogZGFtcCxcclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgdmFsdWUgdGhhdCBhbHRlcm5hdGVzIGJldHdlZW4gYDBgIGFuZCB0aGUgZ2l2ZW4gYGxlbmd0aGAgcGFyYW1ldGVyLlxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEBtZXRob2RcclxuXHQgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB2YWx1ZSB0byBwaW5ncG9uZy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD0xXSAtIFRoZSBwb3NpdGl2ZSB2YWx1ZSB0aGUgZnVuY3Rpb24gd2lsbCBwaW5ncG9uZyB0by5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBhbHRlcm5hdGVkIHZhbHVlLlxyXG5cdCAqL1xyXG5cdHBpbmdwb25nOiBwaW5ncG9uZyxcclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgdmFsdWUgaW4gdGhlIHJhbmdlIGBbMCwxXWAgdGhhdCByZXByZXNlbnRzIHRoZSBwZXJjZW50YWdlIHRoYXQgYHhgIGhhc1xyXG5cdCAqIG1vdmVkIGJldHdlZW4gYG1pbmAgYW5kIGBtYXhgLCBidXQgc21vb3RoZWQgb3Igc2xvd2VkIGRvd24gdGhlIGNsb3NlciBgeGAgaXMgdG9cclxuXHQgKiB0aGUgYG1pbmAgYW5kIGBtYXhgLlxyXG5cdCAqXHJcblx0ICogU2VlIFtTbW9vdGhzdGVwXXtAbGluayBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1Ntb290aHN0ZXB9IGZvciBtb3JlIGRldGFpbHMuXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQG1ldGhvZFxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHZhbHVlIHRvIGV2YWx1YXRlIGJhc2VkIG9uIGl0cyBwb3NpdGlvbiBiZXR3ZWVuIG1pbiBhbmQgbWF4LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBtaW4gLSBUaGUgbWluIHZhbHVlLiBBbnkgeCB2YWx1ZSBiZWxvdyBtaW4gd2lsbCBiZSBgMGAuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IG1heCAtIFRoZSBtYXggdmFsdWUuIEFueSB4IHZhbHVlIGFib3ZlIG1heCB3aWxsIGJlIGAxYC5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBhbHRlcm5hdGVkIHZhbHVlLlxyXG5cdCAqL1xyXG5cdHNtb290aHN0ZXA6IHNtb290aHN0ZXAsXHJcblx0LyoqXHJcblx0ICogQSBbdmFyaWF0aW9uIG9uIHNtb290aHN0ZXBde0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1Ntb290aHN0ZXAjVmFyaWF0aW9uc31cclxuXHQgKiB0aGF0IGhhcyB6ZXJvIDFzdCBhbmQgMm5kIG9yZGVyIGRlcml2YXRpdmVzIGF0IHg9MCBhbmQgeD0xLlxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEBtZXRob2RcclxuXHQgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB2YWx1ZSB0byBldmFsdWF0ZSBiYXNlZCBvbiBpdHMgcG9zaXRpb24gYmV0d2VlbiBtaW4gYW5kIG1heC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbWluIC0gVGhlIG1pbiB2YWx1ZS4gQW55IHggdmFsdWUgYmVsb3cgbWluIHdpbGwgYmUgYDBgLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBtYXggLSBUaGUgbWF4IHZhbHVlLiBBbnkgeCB2YWx1ZSBhYm92ZSBtYXggd2lsbCBiZSBgMWAuXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgYWx0ZXJuYXRlZCB2YWx1ZS5cclxuXHQgKi9cclxuXHRzbW9vdGhlcnN0ZXA6IHNtb290aGVyc3RlcCxcclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgcmFuZG9tIGludGVnZXIgZnJvbSBgPGxvdywgaGlnaD5gIGludGVydmFsLlxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEBtZXRob2RcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbG93IC0gVGhlIGxvd2VyIHZhbHVlIGJvdW5kYXJ5LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBoaWdoIC0gVGhlIHVwcGVyIHZhbHVlIGJvdW5kYXJ5XHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBBIHJhbmRvbSBpbnRlZ2VyLlxyXG5cdCAqL1xyXG5cdHJhbmRJbnQ6IHJhbmRJbnQsXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIHJhbmRvbSBmbG9hdCBmcm9tIGA8bG93LCBoaWdoPmAgaW50ZXJ2YWwuXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQG1ldGhvZFxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBsb3cgLSBUaGUgbG93ZXIgdmFsdWUgYm91bmRhcnkuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGhpZ2ggLSBUaGUgdXBwZXIgdmFsdWUgYm91bmRhcnlcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IEEgcmFuZG9tIGZsb2F0LlxyXG5cdCAqL1xyXG5cdHJhbmRGbG9hdDogcmFuZEZsb2F0LFxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSByYW5kb20gaW50ZWdlciBmcm9tIGA8LXJhbmdlLzIsIHJhbmdlLzI+YCBpbnRlcnZhbC5cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAbWV0aG9kXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHJhbmdlIC0gRGVmaW5lcyB0aGUgdmFsdWUgcmFuZ2UuXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBBIHJhbmRvbSBmbG9hdC5cclxuXHQgKi9cclxuXHRyYW5kRmxvYXRTcHJlYWQ6IHJhbmRGbG9hdFNwcmVhZCxcclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgZGV0ZXJtaW5pc3RpYyBwc2V1ZG8tcmFuZG9tIGZsb2F0IGluIHRoZSBpbnRlcnZhbCBgWzAsIDFdYC5cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAbWV0aG9kXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtzXSAtIFRoZSBpbnRlZ2VyIHNlZWQuXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBBIHJhbmRvbSBmbG9hdC5cclxuXHQgKi9cclxuXHRzZWVkZWRSYW5kb206IHNlZWRlZFJhbmRvbSxcclxuXHQvKipcclxuXHQgKiBDb252ZXJ0cyBkZWdyZWVzIHRvIHJhZGlhbnMuXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQG1ldGhvZFxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBkZWdyZWVzIC0gQSB2YWx1ZSBpbiBkZWdyZWVzLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGNvbnZlcnRlZCB2YWx1ZSBpbiByYWRpYW5zLlxyXG5cdCAqL1xyXG5cdGRlZ1RvUmFkOiBkZWdUb1JhZCxcclxuXHQvKipcclxuXHQgKiBDb252ZXJ0cyByYWRpYW5zIHRvIGRlZ3JlZXMuXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQG1ldGhvZFxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSByYWRpYW5zIC0gQSB2YWx1ZSBpbiByYWRpYW5zLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGNvbnZlcnRlZCB2YWx1ZSBpbiBkZWdyZWVzLlxyXG5cdCAqL1xyXG5cdHJhZFRvRGVnOiByYWRUb0RlZyxcclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gbnVtYmVyIGlzIGEgcG93ZXIgb2YgdHdvLlxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEBtZXRob2RcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2suXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZ2l2ZW4gbnVtYmVyIGlzIGEgcG93ZXIgb2YgdHdvIG9yIG5vdC5cclxuXHQgKi9cclxuXHRpc1Bvd2VyT2ZUd286IGlzUG93ZXJPZlR3byxcclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBzbWFsbGVzdCBwb3dlciBvZiB0d28gdGhhdCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGdpdmVuIG51bWJlci5cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAbWV0aG9kXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIGZpbmQgYSBQT1QgZm9yLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIHNtYWxsZXN0IHBvd2VyIG9mIHR3byB0aGF0IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgZ2l2ZW4gbnVtYmVyLlxyXG5cdCAqL1xyXG5cdGNlaWxQb3dlck9mVHdvOiBjZWlsUG93ZXJPZlR3byxcclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBsYXJnZXN0IHBvd2VyIG9mIHR3byB0aGF0IGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgZ2l2ZW4gbnVtYmVyLlxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEBtZXRob2RcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gZmluZCBhIFBPVCBmb3IuXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgbGFyZ2VzdCBwb3dlciBvZiB0d28gdGhhdCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGdpdmVuIG51bWJlci5cclxuXHQgKi9cclxuXHRmbG9vclBvd2VyT2ZUd286IGZsb29yUG93ZXJPZlR3byxcclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBnaXZlbiBxdWF0ZXJuaW9uIGZyb20gdGhlIFtJbnRyaW5zaWMgUHJvcGVyIEV1bGVyIEFuZ2xlc117QGxpbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRXVsZXJfYW5nbGVzfVxyXG5cdCAqIGRlZmluZWQgYnkgdGhlIGdpdmVuIGFuZ2xlcyBhbmQgb3JkZXIuXHJcblx0ICpcclxuXHQgKiBSb3RhdGlvbnMgYXJlIGFwcGxpZWQgdG8gdGhlIGF4ZXMgaW4gdGhlIG9yZGVyIHNwZWNpZmllZCBieSBvcmRlcjpcclxuXHQgKiByb3RhdGlvbiBieSBhbmdsZSBgYWAgaXMgYXBwbGllZCBmaXJzdCwgdGhlbiBieSBhbmdsZSBgYmAsIHRoZW4gYnkgYW5nbGUgYGNgLlxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEBtZXRob2RcclxuXHQgKiBAcGFyYW0ge1F1YXRlcm5pb259IHEgLSBUaGUgcXVhdGVybmlvbiB0byBzZXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGEgLSBUaGUgcm90YXRpb24gYXBwbGllZCB0byB0aGUgZmlyc3QgYXhpcywgaW4gcmFkaWFucy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYiAtIFRoZSByb3RhdGlvbiBhcHBsaWVkIHRvIHRoZSBzZWNvbmQgYXhpcywgaW4gcmFkaWFucy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYyAtIFRoZSByb3RhdGlvbiBhcHBsaWVkIHRvIHRoZSB0aGlyZCBheGlzLCBpbiByYWRpYW5zLlxyXG5cdCAqIEBwYXJhbSB7KCdYWVgnfCdYWlgnfCdZWFknfCdZWlknfCdaWFonfCdaWVonKX0gb3JkZXIgLSBBIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSBheGVzIG9yZGVyLlxyXG5cdCAqL1xyXG5cdHNldFF1YXRlcm5pb25Gcm9tUHJvcGVyRXVsZXI6IHNldFF1YXRlcm5pb25Gcm9tUHJvcGVyRXVsZXIsXHJcblx0LyoqXHJcblx0ICogTm9ybWFsaXplcyB0aGUgZ2l2ZW4gdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiB0eXBlZCBhcnJheS5cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAbWV0aG9kXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIGZsb2F0IHZhbHVlIGluIHRoZSByYW5nZSBgWzAsMV1gIHRvIG5vcm1hbGl6ZS5cclxuXHQgKiBAcGFyYW0ge1R5cGVkQXJyYXl9IGFycmF5IC0gVGhlIHR5cGVkIGFycmF5IHRoYXQgZGVmaW5lcyB0aGUgZGF0YSB0eXBlIG9mIHRoZSB2YWx1ZS5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBub3JtYWxpemUgdmFsdWUuXHJcblx0ICovXHJcblx0bm9ybWFsaXplOiBub3JtYWxpemUsXHJcblx0LyoqXHJcblx0ICogRGVub3JtYWxpemVzIHRoZSBnaXZlbiB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHR5cGVkIGFycmF5LlxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEBtZXRob2RcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gZGVub3JtYWxpemUuXHJcblx0ICogQHBhcmFtIHtUeXBlZEFycmF5fSBhcnJheSAtIFRoZSB0eXBlZCBhcnJheSB0aGF0IGRlZmluZXMgdGhlIGRhdGEgdHlwZSBvZiB0aGUgdmFsdWUuXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgZGVub3JtYWxpemUgKGZsb2F0KSB2YWx1ZSBpbiB0aGUgcmFuZ2UgYFswLDFdYC5cclxuXHQgKi9cclxuXHRkZW5vcm1hbGl6ZTogZGVub3JtYWxpemVcclxufTtcclxuXHJcbmV4cG9ydCB7XHJcblx0REVHMlJBRCxcclxuXHRSQUQyREVHLFxyXG5cdGdlbmVyYXRlVVVJRCxcclxuXHRjbGFtcCxcclxuXHRldWNsaWRlYW5Nb2R1bG8sXHJcblx0bWFwTGluZWFyLFxyXG5cdGludmVyc2VMZXJwLFxyXG5cdGxlcnAsXHJcblx0ZGFtcCxcclxuXHRwaW5ncG9uZyxcclxuXHRzbW9vdGhzdGVwLFxyXG5cdHNtb290aGVyc3RlcCxcclxuXHRyYW5kSW50LFxyXG5cdHJhbmRGbG9hdCxcclxuXHRyYW5kRmxvYXRTcHJlYWQsXHJcblx0c2VlZGVkUmFuZG9tLFxyXG5cdGRlZ1RvUmFkLFxyXG5cdHJhZFRvRGVnLFxyXG5cdGlzUG93ZXJPZlR3byxcclxuXHRjZWlsUG93ZXJPZlR3byxcclxuXHRmbG9vclBvd2VyT2ZUd28sXHJcblx0c2V0UXVhdGVybmlvbkZyb21Qcm9wZXJFdWxlcixcclxuXHRub3JtYWxpemUsXHJcblx0ZGVub3JtYWxpemUsXHJcblx0TWF0aFV0aWxzXHJcbn07XHJcbiIsImltcG9ydCB7IGNsYW1wIH0gZnJvbSAnLi9NYXRoVXRpbHMuanMnO1xyXG5cclxuLyoqXHJcbiAqIENsYXNzIHJlcHJlc2VudGluZyBhIDJEIHZlY3Rvci4gQSAyRCB2ZWN0b3IgaXMgYW4gb3JkZXJlZCBwYWlyIG9mIG51bWJlcnNcclxuICogKGxhYmVsZWQgeCBhbmQgeSksIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlcHJlc2VudCBhIG51bWJlciBvZiB0aGluZ3MsIHN1Y2ggYXM6XHJcbiAqXHJcbiAqIC0gQSBwb2ludCBpbiAyRCBzcGFjZSAoaS5lLiBhIHBvc2l0aW9uIG9uIGEgcGxhbmUpLlxyXG4gKiAtIEEgZGlyZWN0aW9uIGFuZCBsZW5ndGggYWNyb3NzIGEgcGxhbmUuIEluIHRocmVlLmpzIHRoZSBsZW5ndGggd2lsbFxyXG4gKiBhbHdheXMgYmUgdGhlIEV1Y2xpZGVhbiBkaXN0YW5jZShzdHJhaWdodC1saW5lIGRpc3RhbmNlKSBmcm9tIGAoMCwgMClgIHRvIGAoeCwgeSlgXHJcbiAqIGFuZCB0aGUgZGlyZWN0aW9uIGlzIGFsc28gbWVhc3VyZWQgZnJvbSBgKDAsIDApYCB0b3dhcmRzIGAoeCwgeSlgLlxyXG4gKiAtIEFueSBhcmJpdHJhcnkgb3JkZXJlZCBwYWlyIG9mIG51bWJlcnMuXHJcbiAqXHJcbiAqIFRoZXJlIGFyZSBvdGhlciB0aGluZ3MgYSAyRCB2ZWN0b3IgY2FuIGJlIHVzZWQgdG8gcmVwcmVzZW50LCBzdWNoIGFzXHJcbiAqIG1vbWVudHVtIHZlY3RvcnMsIGNvbXBsZXggbnVtYmVycyBhbmQgc28gb24sIGhvd2V2ZXIgdGhlc2UgYXJlIHRoZSBtb3N0XHJcbiAqIGNvbW1vbiB1c2VzIGluIHRocmVlLmpzLlxyXG4gKlxyXG4gKiBJdGVyYXRpbmcgdGhyb3VnaCBhIHZlY3RvciBpbnN0YW5jZSB3aWxsIHlpZWxkIGl0cyBjb21wb25lbnRzIGAoeCwgeSlgIGluXHJcbiAqIHRoZSBjb3JyZXNwb25kaW5nIG9yZGVyLlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBhID0gbmV3IFRIUkVFLlZlY3RvcjIoIDAsIDEgKTtcclxuICpcclxuICogLy9ubyBhcmd1bWVudHM7IHdpbGwgYmUgaW5pdGlhbGlzZWQgdG8gKDAsIDApXHJcbiAqIGNvbnN0IGIgPSBuZXcgVEhSRUUuVmVjdG9yMiggKTtcclxuICpcclxuICogY29uc3QgZCA9IGEuZGlzdGFuY2VUbyggYiApO1xyXG4gKiBgYGBcclxuICovXHJcbmNsYXNzIFZlY3RvcjIge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IDJEIHZlY3Rvci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbeD0wXSAtIFRoZSB4IHZhbHVlIG9mIHRoaXMgdmVjdG9yLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbeT0wXSAtIFRoZSB5IHZhbHVlIG9mIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCB4ID0gMCwgeSA9IDAgKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHRWZWN0b3IyLnByb3RvdHlwZS5pc1ZlY3RvcjIgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHggdmFsdWUgb2YgdGhpcyB2ZWN0b3IuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy54ID0geDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB5IHZhbHVlIG9mIHRoaXMgdmVjdG9yLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMueSA9IHk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWxpYXMgZm9yIHtAbGluayBWZWN0b3IyI3h9LlxyXG5cdCAqXHJcblx0ICogQHR5cGUge251bWJlcn1cclxuXHQgKi9cclxuXHRnZXQgd2lkdGgoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMueDtcclxuXHJcblx0fVxyXG5cclxuXHRzZXQgd2lkdGgoIHZhbHVlICkge1xyXG5cclxuXHRcdHRoaXMueCA9IHZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFsaWFzIGZvciB7QGxpbmsgVmVjdG9yMiN5fS5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0ICovXHJcblx0Z2V0IGhlaWdodCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy55O1xyXG5cclxuXHR9XHJcblxyXG5cdHNldCBoZWlnaHQoIHZhbHVlICkge1xyXG5cclxuXHRcdHRoaXMueSA9IHZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHZlY3RvciBjb21wb25lbnRzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgdmFsdWUgb2YgdGhlIHggY29tcG9uZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHZhbHVlIG9mIHRoZSB5IGNvbXBvbmVudC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRzZXQoIHgsIHkgKSB7XHJcblxyXG5cdFx0dGhpcy54ID0geDtcclxuXHRcdHRoaXMueSA9IHk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdmVjdG9yIGNvbXBvbmVudHMgdG8gdGhlIHNhbWUgdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc2NhbGFyIC0gVGhlIHZhbHVlIHRvIHNldCBmb3IgYWxsIHZlY3RvciBjb21wb25lbnRzLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHNldFNjYWxhciggc2NhbGFyICkge1xyXG5cclxuXHRcdHRoaXMueCA9IHNjYWxhcjtcclxuXHRcdHRoaXMueSA9IHNjYWxhcjtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB2ZWN0b3IncyB4IGNvbXBvbmVudCB0byB0aGUgZ2l2ZW4gdmFsdWVcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHZhbHVlIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRzZXRYKCB4ICkge1xyXG5cclxuXHRcdHRoaXMueCA9IHg7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdmVjdG9yJ3MgeSBjb21wb25lbnQgdG8gdGhlIGdpdmVuIHZhbHVlXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB2YWx1ZSB0byBzZXQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0c2V0WSggeSApIHtcclxuXHJcblx0XHR0aGlzLnkgPSB5O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFsbG93cyB0byBzZXQgYSB2ZWN0b3IgY29tcG9uZW50IHdpdGggYW4gaW5kZXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgY29tcG9uZW50IGluZGV4LiBgMGAgZXF1YWxzIHRvIHgsIGAxYCBlcXVhbHMgdG8geS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHNldENvbXBvbmVudCggaW5kZXgsIHZhbHVlICkge1xyXG5cclxuXHRcdHN3aXRjaCAoIGluZGV4ICkge1xyXG5cclxuXHRcdFx0Y2FzZSAwOiB0aGlzLnggPSB2YWx1ZTsgYnJlYWs7XHJcblx0XHRcdGNhc2UgMTogdGhpcy55ID0gdmFsdWU7IGJyZWFrO1xyXG5cdFx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoICdpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICcgKyBpbmRleCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgdmVjdG9yIGNvbXBvbmVudCB3aGljaCBtYXRjaGVzIHRoZSBnaXZlbiBpbmRleC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBjb21wb25lbnQgaW5kZXguIGAwYCBlcXVhbHMgdG8geCwgYDFgIGVxdWFscyB0byB5LlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gQSB2ZWN0b3IgY29tcG9uZW50IHZhbHVlLlxyXG5cdCAqL1xyXG5cdGdldENvbXBvbmVudCggaW5kZXggKSB7XHJcblxyXG5cdFx0c3dpdGNoICggaW5kZXggKSB7XHJcblxyXG5cdFx0XHRjYXNlIDA6IHJldHVybiB0aGlzLng7XHJcblx0XHRcdGNhc2UgMTogcmV0dXJuIHRoaXMueTtcclxuXHRcdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCAnaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAnICsgaW5kZXggKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIG5ldyB2ZWN0b3Igd2l0aCBjb3BpZWQgdmFsdWVzIGZyb20gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IEEgY2xvbmUgb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjbG9uZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMueCwgdGhpcy55ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29waWVzIHRoZSB2YWx1ZXMgb2YgdGhlIGdpdmVuIHZlY3RvciB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSB2IC0gVGhlIHZlY3RvciB0byBjb3B5LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGNvcHkoIHYgKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gdi54O1xyXG5cdFx0dGhpcy55ID0gdi55O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgdGhlIGdpdmVuIHZlY3RvciB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSB2IC0gVGhlIHZlY3RvciB0byBhZGQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0YWRkKCB2ICkge1xyXG5cclxuXHRcdHRoaXMueCArPSB2Lng7XHJcblx0XHR0aGlzLnkgKz0gdi55O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgdGhlIGdpdmVuIHNjYWxhciB2YWx1ZSB0byBhbGwgY29tcG9uZW50cyBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHMgLSBUaGUgc2NhbGFyIHRvIGFkZC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRhZGRTY2FsYXIoIHMgKSB7XHJcblxyXG5cdFx0dGhpcy54ICs9IHM7XHJcblx0XHR0aGlzLnkgKz0gcztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIHRoZSBnaXZlbiB2ZWN0b3JzIGFuZCBzdG9yZXMgdGhlIHJlc3VsdCBpbiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSBhIC0gVGhlIGZpcnN0IHZlY3Rvci5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IGIgLSBUaGUgc2Vjb25kIHZlY3Rvci5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRhZGRWZWN0b3JzKCBhLCBiICkge1xyXG5cclxuXHRcdHRoaXMueCA9IGEueCArIGIueDtcclxuXHRcdHRoaXMueSA9IGEueSArIGIueTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIHRoZSBnaXZlbiB2ZWN0b3Igc2NhbGVkIGJ5IHRoZSBnaXZlbiBmYWN0b3IgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gdiAtIFRoZSB2ZWN0b3IuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHMgLSBUaGUgZmFjdG9yIHRoYXQgc2NhbGVzIGB2YC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRhZGRTY2FsZWRWZWN0b3IoIHYsIHMgKSB7XHJcblxyXG5cdFx0dGhpcy54ICs9IHYueCAqIHM7XHJcblx0XHR0aGlzLnkgKz0gdi55ICogcztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTdWJ0cmFjdHMgdGhlIGdpdmVuIHZlY3RvciBmcm9tIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IHYgLSBUaGUgdmVjdG9yIHRvIHN1YnRyYWN0LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHN1YiggdiApIHtcclxuXHJcblx0XHR0aGlzLnggLT0gdi54O1xyXG5cdFx0dGhpcy55IC09IHYueTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTdWJ0cmFjdHMgdGhlIGdpdmVuIHNjYWxhciB2YWx1ZSBmcm9tIGFsbCBjb21wb25lbnRzIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gcyAtIFRoZSBzY2FsYXIgdG8gc3VidHJhY3QuXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0c3ViU2NhbGFyKCBzICkge1xyXG5cclxuXHRcdHRoaXMueCAtPSBzO1xyXG5cdFx0dGhpcy55IC09IHM7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3VidHJhY3RzIHRoZSBnaXZlbiB2ZWN0b3JzIGFuZCBzdG9yZXMgdGhlIHJlc3VsdCBpbiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSBhIC0gVGhlIGZpcnN0IHZlY3Rvci5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IGIgLSBUaGUgc2Vjb25kIHZlY3Rvci5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRzdWJWZWN0b3JzKCBhLCBiICkge1xyXG5cclxuXHRcdHRoaXMueCA9IGEueCAtIGIueDtcclxuXHRcdHRoaXMueSA9IGEueSAtIGIueTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBNdWx0aXBsaWVzIHRoZSBnaXZlbiB2ZWN0b3Igd2l0aCB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSB2IC0gVGhlIHZlY3RvciB0byBtdWx0aXBseS5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRtdWx0aXBseSggdiApIHtcclxuXHJcblx0XHR0aGlzLnggKj0gdi54O1xyXG5cdFx0dGhpcy55ICo9IHYueTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBNdWx0aXBsaWVzIHRoZSBnaXZlbiBzY2FsYXIgdmFsdWUgd2l0aCBhbGwgY29tcG9uZW50cyBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHNjYWxhciAtIFRoZSBzY2FsYXIgdG8gbXVsdGlwbHkuXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0bXVsdGlwbHlTY2FsYXIoIHNjYWxhciApIHtcclxuXHJcblx0XHR0aGlzLnggKj0gc2NhbGFyO1xyXG5cdFx0dGhpcy55ICo9IHNjYWxhcjtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEaXZpZGVzIHRoaXMgaW5zdGFuY2UgYnkgdGhlIGdpdmVuIHZlY3Rvci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gdiAtIFRoZSB2ZWN0b3IgdG8gZGl2aWRlLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGRpdmlkZSggdiApIHtcclxuXHJcblx0XHR0aGlzLnggLz0gdi54O1xyXG5cdFx0dGhpcy55IC89IHYueTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEaXZpZGVzIHRoaXMgdmVjdG9yIGJ5IHRoZSBnaXZlbiBzY2FsYXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc2NhbGFyIC0gVGhlIHNjYWxhciB0byBkaXZpZGUuXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0ZGl2aWRlU2NhbGFyKCBzY2FsYXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoIDEgLyBzY2FsYXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBNdWx0aXBsaWVzIHRoaXMgdmVjdG9yICh3aXRoIGFuIGltcGxpY2l0IDEgYXMgdGhlIDNyZCBjb21wb25lbnQpIGJ5XHJcblx0ICogdGhlIGdpdmVuIDN4MyBtYXRyaXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDN9IG0gLSBUaGUgbWF0cml4IHRvIGFwcGx5LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGFwcGx5TWF0cml4MyggbSApIHtcclxuXHJcblx0XHRjb25zdCB4ID0gdGhpcy54LCB5ID0gdGhpcy55O1xyXG5cdFx0Y29uc3QgZSA9IG0uZWxlbWVudHM7XHJcblxyXG5cdFx0dGhpcy54ID0gZVsgMCBdICogeCArIGVbIDMgXSAqIHkgKyBlWyA2IF07XHJcblx0XHR0aGlzLnkgPSBlWyAxIF0gKiB4ICsgZVsgNCBdICogeSArIGVbIDcgXTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJZiB0aGlzIHZlY3RvcidzIHggb3IgeSB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIGdpdmVuIHZlY3RvcidzIHggb3IgeVxyXG5cdCAqIHZhbHVlLCByZXBsYWNlIHRoYXQgdmFsdWUgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBtaW4gdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IHYgLSBUaGUgdmVjdG9yLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdG1pbiggdiApIHtcclxuXHJcblx0XHR0aGlzLnggPSBNYXRoLm1pbiggdGhpcy54LCB2LnggKTtcclxuXHRcdHRoaXMueSA9IE1hdGgubWluKCB0aGlzLnksIHYueSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIElmIHRoaXMgdmVjdG9yJ3MgeCBvciB5IHZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgZ2l2ZW4gdmVjdG9yJ3MgeCBvciB5XHJcblx0ICogdmFsdWUsIHJlcGxhY2UgdGhhdCB2YWx1ZSB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIG1heCB2YWx1ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gdiAtIFRoZSB2ZWN0b3IuXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0bWF4KCB2ICkge1xyXG5cclxuXHRcdHRoaXMueCA9IE1hdGgubWF4KCB0aGlzLngsIHYueCApO1xyXG5cdFx0dGhpcy55ID0gTWF0aC5tYXgoIHRoaXMueSwgdi55ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSWYgdGhpcyB2ZWN0b3IncyB4IG9yIHkgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSBtYXggdmVjdG9yJ3MgeCBvciB5XHJcblx0ICogdmFsdWUsIGl0IGlzIHJlcGxhY2VkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlLlxyXG5cdCAqIElmIHRoaXMgdmVjdG9yJ3MgeCBvciB5IHZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgbWluIHZlY3RvcidzIHggb3IgeSB2YWx1ZSxcclxuXHQgKiBpdCBpcyByZXBsYWNlZCBieSB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gbWluIC0gVGhlIG1pbmltdW0geCBhbmQgeSB2YWx1ZXMuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSBtYXggLSBUaGUgbWF4aW11bSB4IGFuZCB5IHZhbHVlcyBpbiB0aGUgZGVzaXJlZCByYW5nZS5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRjbGFtcCggbWluLCBtYXggKSB7XHJcblxyXG5cdFx0Ly8gYXNzdW1lcyBtaW4gPCBtYXgsIGNvbXBvbmVudHdpc2VcclxuXHJcblx0XHR0aGlzLnggPSBjbGFtcCggdGhpcy54LCBtaW4ueCwgbWF4LnggKTtcclxuXHRcdHRoaXMueSA9IGNsYW1wKCB0aGlzLnksIG1pbi55LCBtYXgueSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIElmIHRoaXMgdmVjdG9yJ3MgeCBvciB5IHZhbHVlcyBhcmUgZ3JlYXRlciB0aGFuIHRoZSBtYXggdmFsdWUsIHRoZXkgYXJlXHJcblx0ICogcmVwbGFjZWQgYnkgdGhlIG1heCB2YWx1ZS5cclxuXHQgKiBJZiB0aGlzIHZlY3RvcidzIHggb3IgeSB2YWx1ZXMgYXJlIGxlc3MgdGhhbiB0aGUgbWluIHZhbHVlLCB0aGV5IGFyZVxyXG5cdCAqIHJlcGxhY2VkIGJ5IHRoZSBtaW4gdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbWluVmFsIC0gVGhlIG1pbmltdW0gdmFsdWUgdGhlIGNvbXBvbmVudHMgd2lsbCBiZSBjbGFtcGVkIHRvLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBtYXhWYWwgLSBUaGUgbWF4aW11bSB2YWx1ZSB0aGUgY29tcG9uZW50cyB3aWxsIGJlIGNsYW1wZWQgdG8uXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0Y2xhbXBTY2FsYXIoIG1pblZhbCwgbWF4VmFsICkge1xyXG5cclxuXHRcdHRoaXMueCA9IGNsYW1wKCB0aGlzLngsIG1pblZhbCwgbWF4VmFsICk7XHJcblx0XHR0aGlzLnkgPSBjbGFtcCggdGhpcy55LCBtaW5WYWwsIG1heFZhbCApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIElmIHRoaXMgdmVjdG9yJ3MgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4IHZhbHVlLCBpdCBpcyByZXBsYWNlZCBieVxyXG5cdCAqIHRoZSBtYXggdmFsdWUuXHJcblx0ICogSWYgdGhpcyB2ZWN0b3IncyBsZW5ndGggaXMgbGVzcyB0aGFuIHRoZSBtaW4gdmFsdWUsIGl0IGlzIHJlcGxhY2VkIGJ5IHRoZVxyXG5cdCAqIG1pbiB2YWx1ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBtaW4gLSBUaGUgbWluaW11bSB2YWx1ZSB0aGUgdmVjdG9yIGxlbmd0aCB3aWxsIGJlIGNsYW1wZWQgdG8uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IG1heCAtIFRoZSBtYXhpbXVtIHZhbHVlIHRoZSB2ZWN0b3IgbGVuZ3RoIHdpbGwgYmUgY2xhbXBlZCB0by5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRjbGFtcExlbmd0aCggbWluLCBtYXggKSB7XHJcblxyXG5cdFx0Y29uc3QgbGVuZ3RoID0gdGhpcy5sZW5ndGgoKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoIGxlbmd0aCB8fCAxICkubXVsdGlwbHlTY2FsYXIoIGNsYW1wKCBsZW5ndGgsIG1pbiwgbWF4ICkgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgY29tcG9uZW50cyBvZiB0aGlzIHZlY3RvciBhcmUgcm91bmRlZCBkb3duIHRvIHRoZSBuZWFyZXN0IGludGVnZXIgdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRmbG9vcigpIHtcclxuXHJcblx0XHR0aGlzLnggPSBNYXRoLmZsb29yKCB0aGlzLnggKTtcclxuXHRcdHRoaXMueSA9IE1hdGguZmxvb3IoIHRoaXMueSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBjb21wb25lbnRzIG9mIHRoaXMgdmVjdG9yIGFyZSByb3VuZGVkIHVwIHRvIHRoZSBuZWFyZXN0IGludGVnZXIgdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRjZWlsKCkge1xyXG5cclxuXHRcdHRoaXMueCA9IE1hdGguY2VpbCggdGhpcy54ICk7XHJcblx0XHR0aGlzLnkgPSBNYXRoLmNlaWwoIHRoaXMueSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBjb21wb25lbnRzIG9mIHRoaXMgdmVjdG9yIGFyZSByb3VuZGVkIHRvIHRoZSBuZWFyZXN0IGludGVnZXIgdmFsdWVcclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHJvdW5kKCkge1xyXG5cclxuXHRcdHRoaXMueCA9IE1hdGgucm91bmQoIHRoaXMueCApO1xyXG5cdFx0dGhpcy55ID0gTWF0aC5yb3VuZCggdGhpcy55ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGNvbXBvbmVudHMgb2YgdGhpcyB2ZWN0b3IgYXJlIHJvdW5kZWQgdG93YXJkcyB6ZXJvICh1cCBpZiBuZWdhdGl2ZSxcclxuXHQgKiBkb3duIGlmIHBvc2l0aXZlKSB0byBhbiBpbnRlZ2VyIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0cm91bmRUb1plcm8oKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gTWF0aC50cnVuYyggdGhpcy54ICk7XHJcblx0XHR0aGlzLnkgPSBNYXRoLnRydW5jKCB0aGlzLnkgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJbnZlcnRzIHRoaXMgdmVjdG9yIC0gaS5lLiBzZXRzIHggPSAteCBhbmQgeSA9IC15LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0bmVnYXRlKCkge1xyXG5cclxuXHRcdHRoaXMueCA9IC0gdGhpcy54O1xyXG5cdFx0dGhpcy55ID0gLSB0aGlzLnk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2FsY3VsYXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdGhlIGdpdmVuIHZlY3RvciB3aXRoIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IHYgLSBUaGUgdmVjdG9yIHRvIGNvbXB1dGUgdGhlIGRvdCBwcm9kdWN0IHdpdGguXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgcmVzdWx0IG9mIHRoZSBkb3QgcHJvZHVjdC5cclxuXHQgKi9cclxuXHRkb3QoIHYgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMueCAqIHYueCArIHRoaXMueSAqIHYueTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDYWxjdWxhdGVzIHRoZSBjcm9zcyBwcm9kdWN0IG9mIHRoZSBnaXZlbiB2ZWN0b3Igd2l0aCB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSB2IC0gVGhlIHZlY3RvciB0byBjb21wdXRlIHRoZSBjcm9zcyBwcm9kdWN0IHdpdGguXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgcmVzdWx0IG9mIHRoZSBjcm9zcyBwcm9kdWN0LlxyXG5cdCAqL1xyXG5cdGNyb3NzKCB2ICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnggKiB2LnkgLSB0aGlzLnkgKiB2Lng7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgdGhlIHNxdWFyZSBvZiB0aGUgRXVjbGlkZWFuIGxlbmd0aCAoc3RyYWlnaHQtbGluZSBsZW5ndGgpIGZyb21cclxuXHQgKiAoMCwgMCkgdG8gKHgsIHkpLiBJZiB5b3UgYXJlIGNvbXBhcmluZyB0aGUgbGVuZ3RocyBvZiB2ZWN0b3JzLCB5b3Ugc2hvdWxkXHJcblx0ICogY29tcGFyZSB0aGUgbGVuZ3RoIHNxdWFyZWQgaW5zdGVhZCBhcyBpdCBpcyBzbGlnaHRseSBtb3JlIGVmZmljaWVudCB0byBjYWxjdWxhdGUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBzcXVhcmUgbGVuZ3RoIG9mIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGxlbmd0aFNxKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgdGhlICBFdWNsaWRlYW4gbGVuZ3RoIChzdHJhaWdodC1saW5lIGxlbmd0aCkgZnJvbSAoMCwgMCkgdG8gKHgsIHkpLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgbGVuZ3RoIG9mIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGxlbmd0aCgpIHtcclxuXHJcblx0XHRyZXR1cm4gTWF0aC5zcXJ0KCB0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB0aGUgTWFuaGF0dGFuIGxlbmd0aCBvZiB0aGlzIHZlY3Rvci5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGxlbmd0aCBvZiB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRtYW5oYXR0YW5MZW5ndGgoKSB7XHJcblxyXG5cdFx0cmV0dXJuIE1hdGguYWJzKCB0aGlzLnggKSArIE1hdGguYWJzKCB0aGlzLnkgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb252ZXJ0cyB0aGlzIHZlY3RvciB0byBhIHVuaXQgdmVjdG9yIC0gdGhhdCBpcywgc2V0cyBpdCBlcXVhbCB0byBhIHZlY3RvclxyXG5cdCAqIHdpdGggdGhlIHNhbWUgZGlyZWN0aW9uIGFzIHRoaXMgb25lLCBidXQgd2l0aCBhIHZlY3RvciBsZW5ndGggb2YgYDFgLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0bm9ybWFsaXplKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmRpdmlkZVNjYWxhciggdGhpcy5sZW5ndGgoKSB8fCAxICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgdGhlIGFuZ2xlIGluIHJhZGlhbnMgb2YgdGhpcyB2ZWN0b3Igd2l0aCByZXNwZWN0IHRvIHRoZSBwb3NpdGl2ZSB4LWF4aXMuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBhbmdsZSBpbiByYWRpYW5zLlxyXG5cdCAqL1xyXG5cdGFuZ2xlKCkge1xyXG5cclxuXHRcdGNvbnN0IGFuZ2xlID0gTWF0aC5hdGFuMiggLSB0aGlzLnksIC0gdGhpcy54ICkgKyBNYXRoLlBJO1xyXG5cclxuXHRcdHJldHVybiBhbmdsZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBhbmdsZSBiZXR3ZWVuIHRoZSBnaXZlbiB2ZWN0b3IgYW5kIHRoaXMgaW5zdGFuY2UgaW4gcmFkaWFucy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gdiAtIFRoZSB2ZWN0b3IgdG8gY29tcHV0ZSB0aGUgYW5nbGUgd2l0aC5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBhbmdsZSBpbiByYWRpYW5zLlxyXG5cdCAqL1xyXG5cdGFuZ2xlVG8oIHYgKSB7XHJcblxyXG5cdFx0Y29uc3QgZGVub21pbmF0b3IgPSBNYXRoLnNxcnQoIHRoaXMubGVuZ3RoU3EoKSAqIHYubGVuZ3RoU3EoKSApO1xyXG5cclxuXHRcdGlmICggZGVub21pbmF0b3IgPT09IDAgKSByZXR1cm4gTWF0aC5QSSAvIDI7XHJcblxyXG5cdFx0Y29uc3QgdGhldGEgPSB0aGlzLmRvdCggdiApIC8gZGVub21pbmF0b3I7XHJcblxyXG5cdFx0Ly8gY2xhbXAsIHRvIGhhbmRsZSBudW1lcmljYWwgcHJvYmxlbXNcclxuXHJcblx0XHRyZXR1cm4gTWF0aC5hY29zKCBjbGFtcCggdGhldGEsIC0gMSwgMSApICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgdGhlIGRpc3RhbmNlIGZyb20gdGhlIGdpdmVuIHZlY3RvciB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSB2IC0gVGhlIHZlY3RvciB0byBjb21wdXRlIHRoZSBkaXN0YW5jZSB0by5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBkaXN0YW5jZS5cclxuXHQgKi9cclxuXHRkaXN0YW5jZVRvKCB2ICkge1xyXG5cclxuXHRcdHJldHVybiBNYXRoLnNxcnQoIHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQoIHYgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSBzcXVhcmVkIGRpc3RhbmNlIGZyb20gdGhlIGdpdmVuIHZlY3RvciB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqIElmIHlvdSBhcmUganVzdCBjb21wYXJpbmcgdGhlIGRpc3RhbmNlIHdpdGggYW5vdGhlciBkaXN0YW5jZSwgeW91IHNob3VsZCBjb21wYXJlXHJcblx0ICogdGhlIGRpc3RhbmNlIHNxdWFyZWQgaW5zdGVhZCBhcyBpdCBpcyBzbGlnaHRseSBtb3JlIGVmZmljaWVudCB0byBjYWxjdWxhdGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IHYgLSBUaGUgdmVjdG9yIHRvIGNvbXB1dGUgdGhlIHNxdWFyZWQgZGlzdGFuY2UgdG8uXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgc3F1YXJlZCBkaXN0YW5jZS5cclxuXHQgKi9cclxuXHRkaXN0YW5jZVRvU3F1YXJlZCggdiApIHtcclxuXHJcblx0XHRjb25zdCBkeCA9IHRoaXMueCAtIHYueCwgZHkgPSB0aGlzLnkgLSB2Lnk7XHJcblx0XHRyZXR1cm4gZHggKiBkeCArIGR5ICogZHk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgdGhlIE1hbmhhdHRhbiBkaXN0YW5jZSBmcm9tIHRoZSBnaXZlbiB2ZWN0b3IgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gdiAtIFRoZSB2ZWN0b3IgdG8gY29tcHV0ZSB0aGUgTWFuaGF0dGFuIGRpc3RhbmNlIHRvLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIE1hbmhhdHRhbiBkaXN0YW5jZS5cclxuXHQgKi9cclxuXHRtYW5oYXR0YW5EaXN0YW5jZVRvKCB2ICkge1xyXG5cclxuXHRcdHJldHVybiBNYXRoLmFicyggdGhpcy54IC0gdi54ICkgKyBNYXRoLmFicyggdGhpcy55IC0gdi55ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGlzIHZlY3RvciB0byBhIHZlY3RvciB3aXRoIHRoZSBzYW1lIGRpcmVjdGlvbiBhcyB0aGlzIG9uZSwgYnV0XHJcblx0ICogd2l0aCB0aGUgc3BlY2lmaWVkIGxlbmd0aC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGggLSBUaGUgbmV3IGxlbmd0aCBvZiB0aGlzIHZlY3Rvci5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRzZXRMZW5ndGgoIGxlbmd0aCApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhciggbGVuZ3RoICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTGluZWFybHkgaW50ZXJwb2xhdGVzIGJldHdlZW4gdGhlIGdpdmVuIHZlY3RvciBhbmQgdGhpcyBpbnN0YW5jZSwgd2hlcmVcclxuXHQgKiBhbHBoYSBpcyB0aGUgcGVyY2VudCBkaXN0YW5jZSBhbG9uZyB0aGUgbGluZSAtIGFscGhhID0gMCB3aWxsIGJlIHRoaXNcclxuXHQgKiB2ZWN0b3IsIGFuZCBhbHBoYSA9IDEgd2lsbCBiZSB0aGUgZ2l2ZW4gb25lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSB2IC0gVGhlIHZlY3RvciB0byBpbnRlcnBvbGF0ZSB0b3dhcmRzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhbHBoYSAtIFRoZSBpbnRlcnBvbGF0aW9uIGZhY3RvciwgdHlwaWNhbGx5IGluIHRoZSBjbG9zZWQgaW50ZXJ2YWwgYFswLCAxXWAuXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0bGVycCggdiwgYWxwaGEgKSB7XHJcblxyXG5cdFx0dGhpcy54ICs9ICggdi54IC0gdGhpcy54ICkgKiBhbHBoYTtcclxuXHRcdHRoaXMueSArPSAoIHYueSAtIHRoaXMueSApICogYWxwaGE7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTGluZWFybHkgaW50ZXJwb2xhdGVzIGJldHdlZW4gdGhlIGdpdmVuIHZlY3RvcnMsIHdoZXJlIGFscGhhIGlzIHRoZSBwZXJjZW50XHJcblx0ICogZGlzdGFuY2UgYWxvbmcgdGhlIGxpbmUgLSBhbHBoYSA9IDAgd2lsbCBiZSBmaXJzdCB2ZWN0b3IsIGFuZCBhbHBoYSA9IDEgd2lsbFxyXG5cdCAqIGJlIHRoZSBzZWNvbmQgb25lLiBUaGUgcmVzdWx0IGlzIHN0b3JlZCBpbiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSB2MSAtIFRoZSBmaXJzdCB2ZWN0b3IuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSB2MiAtIFRoZSBzZWNvbmQgdmVjdG9yLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhbHBoYSAtIFRoZSBpbnRlcnBvbGF0aW9uIGZhY3RvciwgdHlwaWNhbGx5IGluIHRoZSBjbG9zZWQgaW50ZXJ2YWwgYFswLCAxXWAuXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0bGVycFZlY3RvcnMoIHYxLCB2MiwgYWxwaGEgKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gdjEueCArICggdjIueCAtIHYxLnggKSAqIGFscGhhO1xyXG5cdFx0dGhpcy55ID0gdjEueSArICggdjIueSAtIHYxLnkgKSAqIGFscGhhO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgdmVjdG9yIGlzIGVxdWFsIHdpdGggdGhlIGdpdmVuIG9uZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gdiAtIFRoZSB2ZWN0b3IgdG8gdGVzdCBmb3IgZXF1YWxpdHkuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGlzIHZlY3RvciBpcyBlcXVhbCB3aXRoIHRoZSBnaXZlbiBvbmUuXHJcblx0ICovXHJcblx0ZXF1YWxzKCB2ICkge1xyXG5cclxuXHRcdHJldHVybiAoICggdi54ID09PSB0aGlzLnggKSAmJiAoIHYueSA9PT0gdGhpcy55ICkgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoaXMgdmVjdG9yJ3MgeCB2YWx1ZSB0byBiZSBgYXJyYXlbIG9mZnNldCBdYCBhbmQgeVxyXG5cdCAqIHZhbHVlIHRvIGJlIGBhcnJheVsgb2Zmc2V0ICsgMSBdYC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gYXJyYXkgLSBBbiBhcnJheSBob2xkaW5nIHRoZSB2ZWN0b3IgY29tcG9uZW50IHZhbHVlcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW29mZnNldD0wXSAtIFRoZSBvZmZzZXQgaW50byB0aGUgYXJyYXkuXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0ZnJvbUFycmF5KCBhcnJheSwgb2Zmc2V0ID0gMCApIHtcclxuXHJcblx0XHR0aGlzLnggPSBhcnJheVsgb2Zmc2V0IF07XHJcblx0XHR0aGlzLnkgPSBhcnJheVsgb2Zmc2V0ICsgMSBdO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdyaXRlcyB0aGUgY29tcG9uZW50cyBvZiB0aGlzIHZlY3RvciB0byB0aGUgZ2l2ZW4gYXJyYXkuIElmIG5vIGFycmF5IGlzIHByb3ZpZGVkLFxyXG5cdCAqIHRoZSBtZXRob2QgcmV0dXJucyBhIG5ldyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gW2FycmF5PVtdXSAtIFRoZSB0YXJnZXQgYXJyYXkgaG9sZGluZyB0aGUgdmVjdG9yIGNvbXBvbmVudHMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXQ9MF0gLSBJbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgYXJyYXkuXHJcblx0ICogQHJldHVybiB7QXJyYXk8bnVtYmVyPn0gVGhlIHZlY3RvciBjb21wb25lbnRzLlxyXG5cdCAqL1xyXG5cdHRvQXJyYXkoIGFycmF5ID0gW10sIG9mZnNldCA9IDAgKSB7XHJcblxyXG5cdFx0YXJyYXlbIG9mZnNldCBdID0gdGhpcy54O1xyXG5cdFx0YXJyYXlbIG9mZnNldCArIDEgXSA9IHRoaXMueTtcclxuXHJcblx0XHRyZXR1cm4gYXJyYXk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgY29tcG9uZW50cyBvZiB0aGlzIHZlY3RvciBmcm9tIHRoZSBnaXZlbiBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCdWZmZXJBdHRyaWJ1dGV9IGF0dHJpYnV0ZSAtIFRoZSBidWZmZXIgYXR0cmlidXRlIGhvbGRpbmcgdmVjdG9yIGRhdGEuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluZGV4IGludG8gdGhlIGF0dHJpYnV0ZS5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRmcm9tQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGluZGV4ICkge1xyXG5cclxuXHRcdHRoaXMueCA9IGF0dHJpYnV0ZS5nZXRYKCBpbmRleCApO1xyXG5cdFx0dGhpcy55ID0gYXR0cmlidXRlLmdldFkoIGluZGV4ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUm90YXRlcyB0aGlzIHZlY3RvciBhcm91bmQgdGhlIGdpdmVuIGNlbnRlciBieSB0aGUgZ2l2ZW4gYW5nbGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IGNlbnRlciAtIFRoZSBwb2ludCBhcm91bmQgd2hpY2ggdG8gcm90YXRlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhbmdsZSAtIFRoZSBhbmdsZSB0byByb3RhdGUsIGluIHJhZGlhbnMuXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0cm90YXRlQXJvdW5kKCBjZW50ZXIsIGFuZ2xlICkge1xyXG5cclxuXHRcdGNvbnN0IGMgPSBNYXRoLmNvcyggYW5nbGUgKSwgcyA9IE1hdGguc2luKCBhbmdsZSApO1xyXG5cclxuXHRcdGNvbnN0IHggPSB0aGlzLnggLSBjZW50ZXIueDtcclxuXHRcdGNvbnN0IHkgPSB0aGlzLnkgLSBjZW50ZXIueTtcclxuXHJcblx0XHR0aGlzLnggPSB4ICogYyAtIHkgKiBzICsgY2VudGVyLng7XHJcblx0XHR0aGlzLnkgPSB4ICogcyArIHkgKiBjICsgY2VudGVyLnk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyBlYWNoIGNvbXBvbmVudCBvZiB0aGlzIHZlY3RvciB0byBhIHBzZXVkby1yYW5kb20gdmFsdWUgYmV0d2VlbiBgMGAgYW5kXHJcblx0ICogYDFgLCBleGNsdWRpbmcgYDFgLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0cmFuZG9tKCkge1xyXG5cclxuXHRcdHRoaXMueCA9IE1hdGgucmFuZG9tKCk7XHJcblx0XHR0aGlzLnkgPSBNYXRoLnJhbmRvbSgpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdCpbIFN5bWJvbC5pdGVyYXRvciBdKCkge1xyXG5cclxuXHRcdHlpZWxkIHRoaXMueDtcclxuXHRcdHlpZWxkIHRoaXMueTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgVmVjdG9yMiB9O1xyXG4iLCIvKipcclxuICogUmVwcmVzZW50cyBhIDN4MyBtYXRyaXguXHJcbiAqXHJcbiAqIEEgTm90ZSBvbiBSb3ctTWFqb3IgYW5kIENvbHVtbi1NYWpvciBPcmRlcmluZzpcclxuICpcclxuICogVGhlIGNvbnN0cnVjdG9yIGFuZCB7QGxpbmsgTWF0cml4MyNzZXR9IG1ldGhvZCB0YWtlIGFyZ3VtZW50cyBpblxyXG4gKiBbcm93LW1ham9yXXtAbGluayBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Sb3ctX2FuZF9jb2x1bW4tbWFqb3Jfb3JkZXIjQ29sdW1uLW1ham9yX29yZGVyfVxyXG4gKiBvcmRlciwgd2hpbGUgaW50ZXJuYWxseSB0aGV5IGFyZSBzdG9yZWQgaW4gdGhlIHtAbGluayBNYXRyaXgzI2VsZW1lbnRzfSBhcnJheSBpbiBjb2x1bW4tbWFqb3Igb3JkZXIuXHJcbiAqIFRoaXMgbWVhbnMgdGhhdCBjYWxsaW5nOlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBtID0gbmV3IFRIUkVFLk1hdHJpeCgpO1xyXG4gKiBtLnNldCggMTEsIDEyLCAxMyxcclxuICogICAgICAgIDIxLCAyMiwgMjMsXHJcbiAqICAgICAgICAzMSwgMzIsIDMzICk7XHJcbiAqIGBgYFxyXG4gKiB3aWxsIHJlc3VsdCBpbiB0aGUgZWxlbWVudHMgYXJyYXkgY29udGFpbmluZzpcclxuICogYGBganNcclxuICogbS5lbGVtZW50cyA9IFsgMTEsIDIxLCAzMSxcclxuICogICAgICAgICAgICAgICAgMTIsIDIyLCAzMixcclxuICogICAgICAgICAgICAgICAgMTMsIDIzLCAzMyBdO1xyXG4gKiBgYGBcclxuICogYW5kIGludGVybmFsbHkgYWxsIGNhbGN1bGF0aW9ucyBhcmUgcGVyZm9ybWVkIHVzaW5nIGNvbHVtbi1tYWpvciBvcmRlcmluZy5cclxuICogSG93ZXZlciwgYXMgdGhlIGFjdHVhbCBvcmRlcmluZyBtYWtlcyBubyBkaWZmZXJlbmNlIG1hdGhlbWF0aWNhbGx5IGFuZFxyXG4gKiBtb3N0IHBlb3BsZSBhcmUgdXNlZCB0byB0aGlua2luZyBhYm91dCBtYXRyaWNlcyBpbiByb3ctbWFqb3Igb3JkZXIsIHRoZVxyXG4gKiB0aHJlZS5qcyBkb2N1bWVudGF0aW9uIHNob3dzIG1hdHJpY2VzIGluIHJvdy1tYWpvciBvcmRlci4gSnVzdCBiZWFyIGluXHJcbiAqIG1pbmQgdGhhdCBpZiB5b3UgYXJlIHJlYWRpbmcgdGhlIHNvdXJjZSBjb2RlLCB5b3UnbGwgaGF2ZSB0byB0YWtlIHRoZVxyXG4gKiB0cmFuc3Bvc2Ugb2YgYW55IG1hdHJpY2VzIG91dGxpbmVkIGhlcmUgdG8gbWFrZSBzZW5zZSBvZiB0aGUgY2FsY3VsYXRpb25zLlxyXG4gKi9cclxuY2xhc3MgTWF0cml4MyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgM3gzIG1hdHJpeC4gVGhlIGFyZ3VtZW50cyBhcmUgc3VwcG9zZWQgdG8gYmVcclxuXHQgKiBpbiByb3ctbWFqb3Igb3JkZXIuIElmIG5vIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQsIHRoZSBjb25zdHJ1Y3RvclxyXG5cdCAqIGluaXRpYWxpemVzIHRoZSBtYXRyaXggYXMgYW4gaWRlbnRpdHkgbWF0cml4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuMTFdIC0gMS0xIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjEyXSAtIDEtMiBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW24xM10gLSAxLTMgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuMjFdIC0gMi0xIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjIyXSAtIDItMiBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW24yM10gLSAyLTMgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuMzFdIC0gMy0xIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjMyXSAtIDMtMiBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW24zM10gLSAzLTMgbWF0cml4IGVsZW1lbnQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG4xMSwgbjEyLCBuMTMsIG4yMSwgbjIyLCBuMjMsIG4zMSwgbjMyLCBuMzMgKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHRNYXRyaXgzLnByb3RvdHlwZS5pc01hdHJpeDMgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBjb2x1bW4tbWFqb3IgbGlzdCBvZiBtYXRyaXggdmFsdWVzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxudW1iZXI+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmVsZW1lbnRzID0gW1xyXG5cclxuXHRcdFx0MSwgMCwgMCxcclxuXHRcdFx0MCwgMSwgMCxcclxuXHRcdFx0MCwgMCwgMVxyXG5cclxuXHRcdF07XHJcblxyXG5cdFx0aWYgKCBuMTEgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHRoaXMuc2V0KCBuMTEsIG4xMiwgbjEzLCBuMjEsIG4yMiwgbjIzLCBuMzEsIG4zMiwgbjMzICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGVsZW1lbnRzIG9mIHRoZSBtYXRyaXguVGhlIGFyZ3VtZW50cyBhcmUgc3VwcG9zZWQgdG8gYmVcclxuXHQgKiBpbiByb3ctbWFqb3Igb3JkZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW24xMV0gLSAxLTEgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuMTJdIC0gMS0yIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjEzXSAtIDEtMyBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW24yMV0gLSAyLTEgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuMjJdIC0gMi0yIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjIzXSAtIDItMyBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW24zMV0gLSAzLTEgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuMzJdIC0gMy0yIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjMzXSAtIDMtMyBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXgzfSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRzZXQoIG4xMSwgbjEyLCBuMTMsIG4yMSwgbjIyLCBuMjMsIG4zMSwgbjMyLCBuMzMgKSB7XHJcblxyXG5cdFx0Y29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzO1xyXG5cclxuXHRcdHRlWyAwIF0gPSBuMTE7IHRlWyAxIF0gPSBuMjE7IHRlWyAyIF0gPSBuMzE7XHJcblx0XHR0ZVsgMyBdID0gbjEyOyB0ZVsgNCBdID0gbjIyOyB0ZVsgNSBdID0gbjMyO1xyXG5cdFx0dGVbIDYgXSA9IG4xMzsgdGVbIDcgXSA9IG4yMzsgdGVbIDggXSA9IG4zMztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoaXMgbWF0cml4IHRvIHRoZSAzeDMgaWRlbnRpdHkgbWF0cml4LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7TWF0cml4M30gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0aWRlbnRpdHkoKSB7XHJcblxyXG5cdFx0dGhpcy5zZXQoXHJcblxyXG5cdFx0XHQxLCAwLCAwLFxyXG5cdFx0XHQwLCAxLCAwLFxyXG5cdFx0XHQwLCAwLCAxXHJcblxyXG5cdFx0KTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gbWF0cml4IHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDN9IG0gLSBUaGUgbWF0cml4IHRvIGNvcHkuXHJcblx0ICogQHJldHVybiB7TWF0cml4M30gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0Y29weSggbSApIHtcclxuXHJcblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XHJcblx0XHRjb25zdCBtZSA9IG0uZWxlbWVudHM7XHJcblxyXG5cdFx0dGVbIDAgXSA9IG1lWyAwIF07IHRlWyAxIF0gPSBtZVsgMSBdOyB0ZVsgMiBdID0gbWVbIDIgXTtcclxuXHRcdHRlWyAzIF0gPSBtZVsgMyBdOyB0ZVsgNCBdID0gbWVbIDQgXTsgdGVbIDUgXSA9IG1lWyA1IF07XHJcblx0XHR0ZVsgNiBdID0gbWVbIDYgXTsgdGVbIDcgXSA9IG1lWyA3IF07IHRlWyA4IF0gPSBtZVsgOCBdO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEV4dHJhY3RzIHRoZSBiYXNpcyBvZiB0aGlzIG1hdHJpeCBpbnRvIHRoZSB0aHJlZSBheGlzIHZlY3RvcnMgcHJvdmlkZWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHhBeGlzIC0gVGhlIGJhc2lzJ3MgeCBheGlzLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30geUF4aXMgLSBUaGUgYmFzaXMncyB5IGF4aXMuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB6QXhpcyAtIFRoZSBiYXNpcydzIHogYXhpcy5cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXgzfSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRleHRyYWN0QmFzaXMoIHhBeGlzLCB5QXhpcywgekF4aXMgKSB7XHJcblxyXG5cdFx0eEF4aXMuc2V0RnJvbU1hdHJpeDNDb2x1bW4oIHRoaXMsIDAgKTtcclxuXHRcdHlBeGlzLnNldEZyb21NYXRyaXgzQ29sdW1uKCB0aGlzLCAxICk7XHJcblx0XHR6QXhpcy5zZXRGcm9tTWF0cml4M0NvbHVtbiggdGhpcywgMiApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldCB0aGlzIG1hdHJpeCB0byB0aGUgdXBwZXIgM3gzIG1hdHJpeCBvZiB0aGUgZ2l2ZW4gNHg0IG1hdHJpeC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4NH0gbSAtIFRoZSA0eDQgbWF0cml4LlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdHNldEZyb21NYXRyaXg0KCBtICkge1xyXG5cclxuXHRcdGNvbnN0IG1lID0gbS5lbGVtZW50cztcclxuXHJcblx0XHR0aGlzLnNldChcclxuXHJcblx0XHRcdG1lWyAwIF0sIG1lWyA0IF0sIG1lWyA4IF0sXHJcblx0XHRcdG1lWyAxIF0sIG1lWyA1IF0sIG1lWyA5IF0sXHJcblx0XHRcdG1lWyAyIF0sIG1lWyA2IF0sIG1lWyAxMCBdXHJcblxyXG5cdFx0KTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQb3N0LW11bHRpcGxpZXMgdGhpcyBtYXRyaXggYnkgdGhlIGdpdmVuIDN4MyBtYXRyaXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDN9IG0gLSBUaGUgbWF0cml4IHRvIG11bHRpcGx5IHdpdGguXHJcblx0ICogQHJldHVybiB7TWF0cml4M30gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0bXVsdGlwbHkoIG0gKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyggdGhpcywgbSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFByZS1tdWx0aXBsaWVzIHRoaXMgbWF0cml4IGJ5IHRoZSBnaXZlbiAzeDMgbWF0cml4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRyaXgzfSBtIC0gVGhlIG1hdHJpeCB0byBtdWx0aXBseSB3aXRoLlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdHByZW11bHRpcGx5KCBtICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXMoIG0sIHRoaXMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBNdWx0aXBsZXMgdGhlIGdpdmVuIDN4MyBtYXRyaWNlcyBhbmQgc3RvcmVzIHRoZSByZXN1bHRcclxuXHQgKiBpbiB0aGlzIG1hdHJpeC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4M30gYSAtIFRoZSBmaXJzdCBtYXRyaXguXHJcblx0ICogQHBhcmFtIHtNYXRyaXgzfSBiIC0gVGhlIHNlY29uZCBtYXRyaXguXHJcblx0ICogQHJldHVybiB7TWF0cml4M30gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0bXVsdGlwbHlNYXRyaWNlcyggYSwgYiApIHtcclxuXHJcblx0XHRjb25zdCBhZSA9IGEuZWxlbWVudHM7XHJcblx0XHRjb25zdCBiZSA9IGIuZWxlbWVudHM7XHJcblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XHJcblxyXG5cdFx0Y29uc3QgYTExID0gYWVbIDAgXSwgYTEyID0gYWVbIDMgXSwgYTEzID0gYWVbIDYgXTtcclxuXHRcdGNvbnN0IGEyMSA9IGFlWyAxIF0sIGEyMiA9IGFlWyA0IF0sIGEyMyA9IGFlWyA3IF07XHJcblx0XHRjb25zdCBhMzEgPSBhZVsgMiBdLCBhMzIgPSBhZVsgNSBdLCBhMzMgPSBhZVsgOCBdO1xyXG5cclxuXHRcdGNvbnN0IGIxMSA9IGJlWyAwIF0sIGIxMiA9IGJlWyAzIF0sIGIxMyA9IGJlWyA2IF07XHJcblx0XHRjb25zdCBiMjEgPSBiZVsgMSBdLCBiMjIgPSBiZVsgNCBdLCBiMjMgPSBiZVsgNyBdO1xyXG5cdFx0Y29uc3QgYjMxID0gYmVbIDIgXSwgYjMyID0gYmVbIDUgXSwgYjMzID0gYmVbIDggXTtcclxuXHJcblx0XHR0ZVsgMCBdID0gYTExICogYjExICsgYTEyICogYjIxICsgYTEzICogYjMxO1xyXG5cdFx0dGVbIDMgXSA9IGExMSAqIGIxMiArIGExMiAqIGIyMiArIGExMyAqIGIzMjtcclxuXHRcdHRlWyA2IF0gPSBhMTEgKiBiMTMgKyBhMTIgKiBiMjMgKyBhMTMgKiBiMzM7XHJcblxyXG5cdFx0dGVbIDEgXSA9IGEyMSAqIGIxMSArIGEyMiAqIGIyMSArIGEyMyAqIGIzMTtcclxuXHRcdHRlWyA0IF0gPSBhMjEgKiBiMTIgKyBhMjIgKiBiMjIgKyBhMjMgKiBiMzI7XHJcblx0XHR0ZVsgNyBdID0gYTIxICogYjEzICsgYTIyICogYjIzICsgYTIzICogYjMzO1xyXG5cclxuXHRcdHRlWyAyIF0gPSBhMzEgKiBiMTEgKyBhMzIgKiBiMjEgKyBhMzMgKiBiMzE7XHJcblx0XHR0ZVsgNSBdID0gYTMxICogYjEyICsgYTMyICogYjIyICsgYTMzICogYjMyO1xyXG5cdFx0dGVbIDggXSA9IGEzMSAqIGIxMyArIGEzMiAqIGIyMyArIGEzMyAqIGIzMztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBNdWx0aXBsaWVzIGV2ZXJ5IGNvbXBvbmVudCBvZiB0aGUgbWF0cml4IGJ5IHRoZSBnaXZlbiBzY2FsYXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gcyAtIFRoZSBzY2FsYXIuXHJcblx0ICogQHJldHVybiB7TWF0cml4M30gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0bXVsdGlwbHlTY2FsYXIoIHMgKSB7XHJcblxyXG5cdFx0Y29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzO1xyXG5cclxuXHRcdHRlWyAwIF0gKj0gczsgdGVbIDMgXSAqPSBzOyB0ZVsgNiBdICo9IHM7XHJcblx0XHR0ZVsgMSBdICo9IHM7IHRlWyA0IF0gKj0gczsgdGVbIDcgXSAqPSBzO1xyXG5cdFx0dGVbIDIgXSAqPSBzOyB0ZVsgNSBdICo9IHM7IHRlWyA4IF0gKj0gcztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyBhbmQgcmV0dXJucyB0aGUgZGV0ZXJtaW5hbnQgb2YgdGhpcyBtYXRyaXguXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBkZXRlcm1pbmFudC5cclxuXHQgKi9cclxuXHRkZXRlcm1pbmFudCgpIHtcclxuXHJcblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XHJcblxyXG5cdFx0Y29uc3QgYSA9IHRlWyAwIF0sIGIgPSB0ZVsgMSBdLCBjID0gdGVbIDIgXSxcclxuXHRcdFx0ZCA9IHRlWyAzIF0sIGUgPSB0ZVsgNCBdLCBmID0gdGVbIDUgXSxcclxuXHRcdFx0ZyA9IHRlWyA2IF0sIGggPSB0ZVsgNyBdLCBpID0gdGVbIDggXTtcclxuXHJcblx0XHRyZXR1cm4gYSAqIGUgKiBpIC0gYSAqIGYgKiBoIC0gYiAqIGQgKiBpICsgYiAqIGYgKiBnICsgYyAqIGQgKiBoIC0gYyAqIGUgKiBnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEludmVydHMgdGhpcyBtYXRyaXgsIHVzaW5nIHRoZSBbYW5hbHl0aWMgbWV0aG9kXXtAbGluayBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JbnZlcnRpYmxlX21hdHJpeCNBbmFseXRpY19zb2x1dGlvbn0uXHJcblx0ICogWW91IGNhbiBub3QgaW52ZXJ0IHdpdGggYSBkZXRlcm1pbmFudCBvZiB6ZXJvLiBJZiB5b3UgYXR0ZW1wdCB0aGlzLCB0aGUgbWV0aG9kIHByb2R1Y2VzXHJcblx0ICogYSB6ZXJvIG1hdHJpeCBpbnN0ZWFkLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7TWF0cml4M30gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0aW52ZXJ0KCkge1xyXG5cclxuXHRcdGNvbnN0IHRlID0gdGhpcy5lbGVtZW50cyxcclxuXHJcblx0XHRcdG4xMSA9IHRlWyAwIF0sIG4yMSA9IHRlWyAxIF0sIG4zMSA9IHRlWyAyIF0sXHJcblx0XHRcdG4xMiA9IHRlWyAzIF0sIG4yMiA9IHRlWyA0IF0sIG4zMiA9IHRlWyA1IF0sXHJcblx0XHRcdG4xMyA9IHRlWyA2IF0sIG4yMyA9IHRlWyA3IF0sIG4zMyA9IHRlWyA4IF0sXHJcblxyXG5cdFx0XHR0MTEgPSBuMzMgKiBuMjIgLSBuMzIgKiBuMjMsXHJcblx0XHRcdHQxMiA9IG4zMiAqIG4xMyAtIG4zMyAqIG4xMixcclxuXHRcdFx0dDEzID0gbjIzICogbjEyIC0gbjIyICogbjEzLFxyXG5cclxuXHRcdFx0ZGV0ID0gbjExICogdDExICsgbjIxICogdDEyICsgbjMxICogdDEzO1xyXG5cclxuXHRcdGlmICggZGV0ID09PSAwICkgcmV0dXJuIHRoaXMuc2V0KCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwICk7XHJcblxyXG5cdFx0Y29uc3QgZGV0SW52ID0gMSAvIGRldDtcclxuXHJcblx0XHR0ZVsgMCBdID0gdDExICogZGV0SW52O1xyXG5cdFx0dGVbIDEgXSA9ICggbjMxICogbjIzIC0gbjMzICogbjIxICkgKiBkZXRJbnY7XHJcblx0XHR0ZVsgMiBdID0gKCBuMzIgKiBuMjEgLSBuMzEgKiBuMjIgKSAqIGRldEludjtcclxuXHJcblx0XHR0ZVsgMyBdID0gdDEyICogZGV0SW52O1xyXG5cdFx0dGVbIDQgXSA9ICggbjMzICogbjExIC0gbjMxICogbjEzICkgKiBkZXRJbnY7XHJcblx0XHR0ZVsgNSBdID0gKCBuMzEgKiBuMTIgLSBuMzIgKiBuMTEgKSAqIGRldEludjtcclxuXHJcblx0XHR0ZVsgNiBdID0gdDEzICogZGV0SW52O1xyXG5cdFx0dGVbIDcgXSA9ICggbjIxICogbjEzIC0gbjIzICogbjExICkgKiBkZXRJbnY7XHJcblx0XHR0ZVsgOCBdID0gKCBuMjIgKiBuMTEgLSBuMjEgKiBuMTIgKSAqIGRldEludjtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUcmFuc3Bvc2VzIHRoaXMgbWF0cml4IGluIHBsYWNlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7TWF0cml4M30gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0dHJhbnNwb3NlKCkge1xyXG5cclxuXHRcdGxldCB0bXA7XHJcblx0XHRjb25zdCBtID0gdGhpcy5lbGVtZW50cztcclxuXHJcblx0XHR0bXAgPSBtWyAxIF07IG1bIDEgXSA9IG1bIDMgXTsgbVsgMyBdID0gdG1wO1xyXG5cdFx0dG1wID0gbVsgMiBdOyBtWyAyIF0gPSBtWyA2IF07IG1bIDYgXSA9IHRtcDtcclxuXHRcdHRtcCA9IG1bIDUgXTsgbVsgNSBdID0gbVsgNyBdOyBtWyA3IF0gPSB0bXA7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgdGhlIG5vcm1hbCBtYXRyaXggd2hpY2ggaXMgdGhlIGludmVyc2UgdHJhbnNwb3NlIG9mIHRoZSB1cHBlclxyXG5cdCAqIGxlZnQgM3gzIHBvcnRpb24gb2YgdGhlIGdpdmVuIDR4NCBtYXRyaXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDR9IG1hdHJpeDQgLSBUaGUgNHg0IG1hdHJpeC5cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXgzfSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRnZXROb3JtYWxNYXRyaXgoIG1hdHJpeDQgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeDQoIG1hdHJpeDQgKS5pbnZlcnQoKS50cmFuc3Bvc2UoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUcmFuc3Bvc2VzIHRoaXMgbWF0cml4IGludG8gdGhlIHN1cHBsaWVkIGFycmF5LCBhbmQgcmV0dXJucyBpdHNlbGYgdW5jaGFuZ2VkLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSByIC0gQW4gYXJyYXkgdG8gc3RvcmUgdGhlIHRyYW5zcG9zZWQgbWF0cml4IGVsZW1lbnRzLlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdHRyYW5zcG9zZUludG9BcnJheSggciApIHtcclxuXHJcblx0XHRjb25zdCBtID0gdGhpcy5lbGVtZW50cztcclxuXHJcblx0XHRyWyAwIF0gPSBtWyAwIF07XHJcblx0XHRyWyAxIF0gPSBtWyAzIF07XHJcblx0XHRyWyAyIF0gPSBtWyA2IF07XHJcblx0XHRyWyAzIF0gPSBtWyAxIF07XHJcblx0XHRyWyA0IF0gPSBtWyA0IF07XHJcblx0XHRyWyA1IF0gPSBtWyA3IF07XHJcblx0XHRyWyA2IF0gPSBtWyAyIF07XHJcblx0XHRyWyA3IF0gPSBtWyA1IF07XHJcblx0XHRyWyA4IF0gPSBtWyA4IF07XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgVVYgdHJhbnNmb3JtIG1hdHJpeCBmcm9tIG9mZnNldCwgcmVwZWF0LCByb3RhdGlvbiwgYW5kIGNlbnRlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0eCAtIE9mZnNldCB4LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0eSAtIE9mZnNldCB5LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzeCAtIFJlcGVhdCB4LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzeSAtIFJlcGVhdCB5LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSByb3RhdGlvbiAtIFJvdGF0aW9uLCBpbiByYWRpYW5zLiBQb3NpdGl2ZSB2YWx1ZXMgcm90YXRlIGNvdW50ZXJjbG9ja3dpc2UuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGN4IC0gQ2VudGVyIHggb2Ygcm90YXRpb24uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGN5IC0gQ2VudGVyIHkgb2Ygcm90YXRpb25cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXgzfSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRzZXRVdlRyYW5zZm9ybSggdHgsIHR5LCBzeCwgc3ksIHJvdGF0aW9uLCBjeCwgY3kgKSB7XHJcblxyXG5cdFx0Y29uc3QgYyA9IE1hdGguY29zKCByb3RhdGlvbiApO1xyXG5cdFx0Y29uc3QgcyA9IE1hdGguc2luKCByb3RhdGlvbiApO1xyXG5cclxuXHRcdHRoaXMuc2V0KFxyXG5cdFx0XHRzeCAqIGMsIHN4ICogcywgLSBzeCAqICggYyAqIGN4ICsgcyAqIGN5ICkgKyBjeCArIHR4LFxyXG5cdFx0XHQtIHN5ICogcywgc3kgKiBjLCAtIHN5ICogKCAtIHMgKiBjeCArIGMgKiBjeSApICsgY3kgKyB0eSxcclxuXHRcdFx0MCwgMCwgMVxyXG5cdFx0KTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTY2FsZXMgdGhpcyBtYXRyaXggd2l0aCB0aGUgZ2l2ZW4gc2NhbGFyIHZhbHVlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzeCAtIFRoZSBhbW91bnQgdG8gc2NhbGUgaW4gdGhlIFggYXhpcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc3kgLSBUaGUgYW1vdW50IHRvIHNjYWxlIGluIHRoZSBZIGF4aXMuXHJcblx0ICogQHJldHVybiB7TWF0cml4M30gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0c2NhbGUoIHN4LCBzeSApIHtcclxuXHJcblx0XHR0aGlzLnByZW11bHRpcGx5KCBfbTMubWFrZVNjYWxlKCBzeCwgc3kgKSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJvdGF0ZXMgdGhpcyBtYXRyaXggYnkgdGhlIGdpdmVuIGFuZ2xlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHRoZXRhIC0gVGhlIHJvdGF0aW9uIGluIHJhZGlhbnMuXHJcblx0ICogQHJldHVybiB7TWF0cml4M30gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0cm90YXRlKCB0aGV0YSApIHtcclxuXHJcblx0XHR0aGlzLnByZW11bHRpcGx5KCBfbTMubWFrZVJvdGF0aW9uKCAtIHRoZXRhICkgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUcmFuc2xhdGVzIHRoaXMgbWF0cml4IGJ5IHRoZSBnaXZlbiBzY2FsYXIgdmFsdWVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHR4IC0gVGhlIGFtb3VudCB0byB0cmFuc2xhdGUgaW4gdGhlIFggYXhpcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdHkgLSBUaGUgYW1vdW50IHRvIHRyYW5zbGF0ZSBpbiB0aGUgWSBheGlzLlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdHRyYW5zbGF0ZSggdHgsIHR5ICkge1xyXG5cclxuXHRcdHRoaXMucHJlbXVsdGlwbHkoIF9tMy5tYWtlVHJhbnNsYXRpb24oIHR4LCB0eSApICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gZm9yIDJEIFRyYW5zZm9ybXNcclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGlzIG1hdHJpeCBhcyBhIDJEIHRyYW5zbGF0aW9uIHRyYW5zZm9ybS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfFZlY3RvcjJ9IHggLSBUaGUgYW1vdW50IHRvIHRyYW5zbGF0ZSBpbiB0aGUgWCBheGlzIG9yIGFsdGVybmF0aXZlbHkgYSB0cmFuc2xhdGlvbiB2ZWN0b3IuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgYW1vdW50IHRvIHRyYW5zbGF0ZSBpbiB0aGUgWSBheGlzLlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdG1ha2VUcmFuc2xhdGlvbiggeCwgeSApIHtcclxuXHJcblx0XHRpZiAoIHguaXNWZWN0b3IyICkge1xyXG5cclxuXHRcdFx0dGhpcy5zZXQoXHJcblxyXG5cdFx0XHRcdDEsIDAsIHgueCxcclxuXHRcdFx0XHQwLCAxLCB4LnksXHJcblx0XHRcdFx0MCwgMCwgMVxyXG5cclxuXHRcdFx0KTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGhpcy5zZXQoXHJcblxyXG5cdFx0XHRcdDEsIDAsIHgsXHJcblx0XHRcdFx0MCwgMSwgeSxcclxuXHRcdFx0XHQwLCAwLCAxXHJcblxyXG5cdFx0XHQpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoaXMgbWF0cml4IGFzIGEgMkQgcm90YXRpb25hbCB0cmFuc2Zvcm1hdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0aGV0YSAtIFRoZSByb3RhdGlvbiBpbiByYWRpYW5zLlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdG1ha2VSb3RhdGlvbiggdGhldGEgKSB7XHJcblxyXG5cdFx0Ly8gY291bnRlcmNsb2Nrd2lzZVxyXG5cclxuXHRcdGNvbnN0IGMgPSBNYXRoLmNvcyggdGhldGEgKTtcclxuXHRcdGNvbnN0IHMgPSBNYXRoLnNpbiggdGhldGEgKTtcclxuXHJcblx0XHR0aGlzLnNldChcclxuXHJcblx0XHRcdGMsIC0gcywgMCxcclxuXHRcdFx0cywgYywgMCxcclxuXHRcdFx0MCwgMCwgMVxyXG5cclxuXHRcdCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGlzIG1hdHJpeCBhcyBhIDJEIHNjYWxlIHRyYW5zZm9ybS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGFtb3VudCB0byBzY2FsZSBpbiB0aGUgWCBheGlzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIGFtb3VudCB0byBzY2FsZSBpbiB0aGUgWSBheGlzLlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdG1ha2VTY2FsZSggeCwgeSApIHtcclxuXHJcblx0XHR0aGlzLnNldChcclxuXHJcblx0XHRcdHgsIDAsIDAsXHJcblx0XHRcdDAsIHksIDAsXHJcblx0XHRcdDAsIDAsIDFcclxuXHJcblx0XHQpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgbWF0cml4IGlzIGVxdWFsIHdpdGggdGhlIGdpdmVuIG9uZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4M30gbWF0cml4IC0gVGhlIG1hdHJpeCB0byB0ZXN0IGZvciBlcXVhbGl0eS5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoaXMgbWF0cml4IGlzIGVxdWFsIHdpdGggdGhlIGdpdmVuIG9uZS5cclxuXHQgKi9cclxuXHRlcXVhbHMoIG1hdHJpeCApIHtcclxuXHJcblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XHJcblx0XHRjb25zdCBtZSA9IG1hdHJpeC5lbGVtZW50cztcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCA5OyBpICsrICkge1xyXG5cclxuXHRcdFx0aWYgKCB0ZVsgaSBdICE9PSBtZVsgaSBdICkgcmV0dXJuIGZhbHNlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBlbGVtZW50cyBvZiB0aGUgbWF0cml4IGZyb20gdGhlIGdpdmVuIGFycmF5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBhcnJheSAtIFRoZSBtYXRyaXggZWxlbWVudHMgaW4gY29sdW1uLW1ham9yIG9yZGVyLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0PTBdIC0gSW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGFycmF5LlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdGZyb21BcnJheSggYXJyYXksIG9mZnNldCA9IDAgKSB7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgOTsgaSArKyApIHtcclxuXHJcblx0XHRcdHRoaXMuZWxlbWVudHNbIGkgXSA9IGFycmF5WyBpICsgb2Zmc2V0IF07XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdyaXRlcyB0aGUgZWxlbWVudHMgb2YgdGhpcyBtYXRyaXggdG8gdGhlIGdpdmVuIGFycmF5LiBJZiBubyBhcnJheSBpcyBwcm92aWRlZCxcclxuXHQgKiB0aGUgbWV0aG9kIHJldHVybnMgYSBuZXcgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IFthcnJheT1bXV0gLSBUaGUgdGFyZ2V0IGFycmF5IGhvbGRpbmcgdGhlIG1hdHJpeCBlbGVtZW50cyBpbiBjb2x1bW4tbWFqb3Igb3JkZXIuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXQ9MF0gLSBJbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgYXJyYXkuXHJcblx0ICogQHJldHVybiB7QXJyYXk8bnVtYmVyPn0gVGhlIG1hdHJpeCBlbGVtZW50cyBpbiBjb2x1bW4tbWFqb3Igb3JkZXIuXHJcblx0ICovXHJcblx0dG9BcnJheSggYXJyYXkgPSBbXSwgb2Zmc2V0ID0gMCApIHtcclxuXHJcblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XHJcblxyXG5cdFx0YXJyYXlbIG9mZnNldCBdID0gdGVbIDAgXTtcclxuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0ZVsgMSBdO1xyXG5cdFx0YXJyYXlbIG9mZnNldCArIDIgXSA9IHRlWyAyIF07XHJcblxyXG5cdFx0YXJyYXlbIG9mZnNldCArIDMgXSA9IHRlWyAzIF07XHJcblx0XHRhcnJheVsgb2Zmc2V0ICsgNCBdID0gdGVbIDQgXTtcclxuXHRcdGFycmF5WyBvZmZzZXQgKyA1IF0gPSB0ZVsgNSBdO1xyXG5cclxuXHRcdGFycmF5WyBvZmZzZXQgKyA2IF0gPSB0ZVsgNiBdO1xyXG5cdFx0YXJyYXlbIG9mZnNldCArIDcgXSA9IHRlWyA3IF07XHJcblx0XHRhcnJheVsgb2Zmc2V0ICsgOCBdID0gdGVbIDggXTtcclxuXHJcblx0XHRyZXR1cm4gYXJyYXk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIG1hdHJpeCB3aXRoIGNvcGllZCB2YWx1ZXMgZnJvbSB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7TWF0cml4M30gQSBjbG9uZSBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNsb25lKCkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmZyb21BcnJheSggdGhpcy5lbGVtZW50cyApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5jb25zdCBfbTMgPSAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXgzKCk7XHJcblxyXG5leHBvcnQgeyBNYXRyaXgzIH07XHJcbiIsImZ1bmN0aW9uIGFycmF5TWluKCBhcnJheSApIHtcclxuXHJcblx0aWYgKCBhcnJheS5sZW5ndGggPT09IDAgKSByZXR1cm4gSW5maW5pdHk7XHJcblxyXG5cdGxldCBtaW4gPSBhcnJheVsgMCBdO1xyXG5cclxuXHRmb3IgKCBsZXQgaSA9IDEsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyArKyBpICkge1xyXG5cclxuXHRcdGlmICggYXJyYXlbIGkgXSA8IG1pbiApIG1pbiA9IGFycmF5WyBpIF07XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIG1pbjtcclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFycmF5TWF4KCBhcnJheSApIHtcclxuXHJcblx0aWYgKCBhcnJheS5sZW5ndGggPT09IDAgKSByZXR1cm4gLSBJbmZpbml0eTtcclxuXHJcblx0bGV0IG1heCA9IGFycmF5WyAwIF07XHJcblxyXG5cdGZvciAoIGxldCBpID0gMSwgbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGw7ICsrIGkgKSB7XHJcblxyXG5cdFx0aWYgKCBhcnJheVsgaSBdID4gbWF4ICkgbWF4ID0gYXJyYXlbIGkgXTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gbWF4O1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gYXJyYXlOZWVkc1VpbnQzMiggYXJyYXkgKSB7XHJcblxyXG5cdC8vIGFzc3VtZXMgbGFyZ2VyIHZhbHVlcyB1c3VhbGx5IG9uIGxhc3RcclxuXHJcblx0Zm9yICggbGV0IGkgPSBhcnJheS5sZW5ndGggLSAxOyBpID49IDA7IC0tIGkgKSB7XHJcblxyXG5cdFx0aWYgKCBhcnJheVsgaSBdID49IDY1NTM1ICkgcmV0dXJuIHRydWU7IC8vIGFjY291bnQgZm9yIFBSSU1JVElWRV9SRVNUQVJUX0ZJWEVEX0lOREVYLCAjMjQ1NjVcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gZmFsc2U7XHJcblxyXG59XHJcblxyXG5jb25zdCBUWVBFRF9BUlJBWVMgPSB7XHJcblx0SW50OEFycmF5OiBJbnQ4QXJyYXksXHJcblx0VWludDhBcnJheTogVWludDhBcnJheSxcclxuXHRVaW50OENsYW1wZWRBcnJheTogVWludDhDbGFtcGVkQXJyYXksXHJcblx0SW50MTZBcnJheTogSW50MTZBcnJheSxcclxuXHRVaW50MTZBcnJheTogVWludDE2QXJyYXksXHJcblx0SW50MzJBcnJheTogSW50MzJBcnJheSxcclxuXHRVaW50MzJBcnJheTogVWludDMyQXJyYXksXHJcblx0RmxvYXQzMkFycmF5OiBGbG9hdDMyQXJyYXksXHJcblx0RmxvYXQ2NEFycmF5OiBGbG9hdDY0QXJyYXlcclxufTtcclxuXHJcbmZ1bmN0aW9uIGdldFR5cGVkQXJyYXkoIHR5cGUsIGJ1ZmZlciApIHtcclxuXHJcblx0cmV0dXJuIG5ldyBUWVBFRF9BUlJBWVNbIHR5cGUgXSggYnVmZmVyICk7XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50TlMoIG5hbWUgKSB7XHJcblxyXG5cdHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJywgbmFtZSApO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlQ2FudmFzRWxlbWVudCgpIHtcclxuXHJcblx0Y29uc3QgY2FudmFzID0gY3JlYXRlRWxlbWVudE5TKCAnY2FudmFzJyApO1xyXG5cdGNhbnZhcy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuXHRyZXR1cm4gY2FudmFzO1xyXG5cclxufVxyXG5cclxuY29uc3QgX2NhY2hlID0ge307XHJcblxyXG5mdW5jdGlvbiB3YXJuT25jZSggbWVzc2FnZSApIHtcclxuXHJcblx0aWYgKCBtZXNzYWdlIGluIF9jYWNoZSApIHJldHVybjtcclxuXHJcblx0X2NhY2hlWyBtZXNzYWdlIF0gPSB0cnVlO1xyXG5cclxuXHRjb25zb2xlLndhcm4oIG1lc3NhZ2UgKTtcclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHByb2JlQXN5bmMoIGdsLCBzeW5jLCBpbnRlcnZhbCApIHtcclxuXHJcblx0cmV0dXJuIG5ldyBQcm9taXNlKCBmdW5jdGlvbiAoIHJlc29sdmUsIHJlamVjdCApIHtcclxuXHJcblx0XHRmdW5jdGlvbiBwcm9iZSgpIHtcclxuXHJcblx0XHRcdHN3aXRjaCAoIGdsLmNsaWVudFdhaXRTeW5jKCBzeW5jLCBnbC5TWU5DX0ZMVVNIX0NPTU1BTkRTX0JJVCwgMCApICkge1xyXG5cclxuXHRcdFx0XHRjYXNlIGdsLldBSVRfRkFJTEVEOlxyXG5cdFx0XHRcdFx0cmVqZWN0KCk7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0Y2FzZSBnbC5USU1FT1VUX0VYUElSRUQ6XHJcblx0XHRcdFx0XHRzZXRUaW1lb3V0KCBwcm9iZSwgaW50ZXJ2YWwgKTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdFx0cmVzb2x2ZSgpO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRzZXRUaW1lb3V0KCBwcm9iZSwgaW50ZXJ2YWwgKTtcclxuXHJcblx0fSApO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gdG9Ob3JtYWxpemVkUHJvamVjdGlvbk1hdHJpeCggcHJvamVjdGlvbk1hdHJpeCApIHtcclxuXHJcblx0Y29uc3QgbSA9IHByb2plY3Rpb25NYXRyaXguZWxlbWVudHM7XHJcblxyXG5cdC8vIENvbnZlcnQgWy0xLCAxXSB0byBbMCwgMV0gcHJvamVjdGlvbiBtYXRyaXhcclxuXHRtWyAyIF0gPSAwLjUgKiBtWyAyIF0gKyAwLjUgKiBtWyAzIF07XHJcblx0bVsgNiBdID0gMC41ICogbVsgNiBdICsgMC41ICogbVsgNyBdO1xyXG5cdG1bIDEwIF0gPSAwLjUgKiBtWyAxMCBdICsgMC41ICogbVsgMTEgXTtcclxuXHRtWyAxNCBdID0gMC41ICogbVsgMTQgXSArIDAuNSAqIG1bIDE1IF07XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiB0b1JldmVyc2VkUHJvamVjdGlvbk1hdHJpeCggcHJvamVjdGlvbk1hdHJpeCApIHtcclxuXHJcblx0Y29uc3QgbSA9IHByb2plY3Rpb25NYXRyaXguZWxlbWVudHM7XHJcblx0Y29uc3QgaXNQZXJzcGVjdGl2ZU1hdHJpeCA9IG1bIDExIF0gPT09IC0gMTtcclxuXHJcblx0Ly8gUmV2ZXJzZSBbMCwgMV0gcHJvamVjdGlvbiBtYXRyaXhcclxuXHRpZiAoIGlzUGVyc3BlY3RpdmVNYXRyaXggKSB7XHJcblxyXG5cdFx0bVsgMTAgXSA9IC0gbVsgMTAgXSAtIDE7XHJcblx0XHRtWyAxNCBdID0gLSBtWyAxNCBdO1xyXG5cclxuXHR9IGVsc2Uge1xyXG5cclxuXHRcdG1bIDEwIF0gPSAtIG1bIDEwIF07XHJcblx0XHRtWyAxNCBdID0gLSBtWyAxNCBdICsgMTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgYXJyYXlNaW4sIGFycmF5TWF4LCBhcnJheU5lZWRzVWludDMyLCBnZXRUeXBlZEFycmF5LCBjcmVhdGVFbGVtZW50TlMsIGNyZWF0ZUNhbnZhc0VsZW1lbnQsIHdhcm5PbmNlLCBwcm9iZUFzeW5jLCB0b05vcm1hbGl6ZWRQcm9qZWN0aW9uTWF0cml4LCB0b1JldmVyc2VkUHJvamVjdGlvbk1hdHJpeCB9O1xyXG4iLCJpbXBvcnQgeyBTUkdCQ29sb3JTcGFjZSwgTGluZWFyU1JHQkNvbG9yU3BhY2UsIFNSR0JUcmFuc2ZlciwgTGluZWFyVHJhbnNmZXIsIE5vQ29sb3JTcGFjZSB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IE1hdHJpeDMgfSBmcm9tICcuL01hdHJpeDMuanMnO1xyXG5cclxuY29uc3QgTElORUFSX1JFQzcwOV9UT19YWVogPSAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXgzKCkuc2V0KFxyXG5cdDAuNDEyMzkwOCwgMC4zNTc1ODQzLCAwLjE4MDQ4MDgsXHJcblx0MC4yMTI2MzkwLCAwLjcxNTE2ODcsIDAuMDcyMTkyMyxcclxuXHQwLjAxOTMzMDgsIDAuMTE5MTk0OCwgMC45NTA1MzIyXHJcbik7XHJcblxyXG5jb25zdCBYWVpfVE9fTElORUFSX1JFQzcwOSA9IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDMoKS5zZXQoXHJcblx0My4yNDA5Njk5LCAtIDEuNTM3MzgzMiwgLSAwLjQ5ODYxMDgsXHJcblx0LSAwLjk2OTI0MzYsIDEuODc1OTY3NSwgMC4wNDE1NTUxLFxyXG5cdDAuMDU1NjMwMSwgLSAwLjIwMzk3NzAsIDEuMDU2OTcxNVxyXG4pO1xyXG5cclxuZnVuY3Rpb24gY3JlYXRlQ29sb3JNYW5hZ2VtZW50KCkge1xyXG5cclxuXHRjb25zdCBDb2xvck1hbmFnZW1lbnQgPSB7XHJcblxyXG5cdFx0ZW5hYmxlZDogdHJ1ZSxcclxuXHJcblx0XHR3b3JraW5nQ29sb3JTcGFjZTogTGluZWFyU1JHQkNvbG9yU3BhY2UsXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBJbXBsZW1lbnRhdGlvbnMgb2Ygc3VwcG9ydGVkIGNvbG9yIHNwYWNlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBSZXF1aXJlZDpcclxuXHRcdCAqXHQtIHByaW1hcmllczogY2hyb21hdGljaXR5IGNvb3JkaW5hdGVzIFsgcnggcnkgZ3ggZ3kgYnggYnkgXVxyXG5cdFx0ICpcdC0gd2hpdGVQb2ludDogcmVmZXJlbmNlIHdoaXRlIFsgeCB5IF1cclxuXHRcdCAqXHQtIHRyYW5zZmVyOiB0cmFuc2ZlciBmdW5jdGlvbiAocHJlLWRlZmluZWQpXHJcblx0XHQgKlx0LSB0b1hZWjogTWF0cml4MyBSR0IgdG8gWFlaIHRyYW5zZm9ybVxyXG5cdFx0ICpcdC0gZnJvbVhZWjogTWF0cml4MyBYWVogdG8gUkdCIHRyYW5zZm9ybVxyXG5cdFx0ICpcdC0gbHVtaW5hbmNlQ29lZmZpY2llbnRzOiBSR0IgbHVtaW5hbmNlIGNvZWZmaWNpZW50c1xyXG5cdFx0ICpcclxuXHRcdCAqIE9wdGlvbmFsOlxyXG5cdFx0ICogIC0gb3V0cHV0Q29sb3JTcGFjZUNvbmZpZzogeyBkcmF3aW5nQnVmZmVyQ29sb3JTcGFjZTogQ29sb3JTcGFjZSB9XHJcblx0XHQgKiAgLSB3b3JraW5nQ29sb3JTcGFjZUNvbmZpZzogeyB1bnBhY2tDb2xvclNwYWNlOiBDb2xvclNwYWNlIH1cclxuXHRcdCAqXHJcblx0XHQgKiBSZWZlcmVuY2U6XHJcblx0XHQgKiAtIGh0dHBzOi8vd3d3LnJ1c3NlbGxjb3R0cmVsbC5jb20vcGhvdG8vbWF0cml4Q2FsY3VsYXRvci5odG1cclxuXHRcdCAqL1xyXG5cdFx0c3BhY2VzOiB7fSxcclxuXHJcblx0XHRjb252ZXJ0OiBmdW5jdGlvbiAoIGNvbG9yLCBzb3VyY2VDb2xvclNwYWNlLCB0YXJnZXRDb2xvclNwYWNlICkge1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLmVuYWJsZWQgPT09IGZhbHNlIHx8IHNvdXJjZUNvbG9yU3BhY2UgPT09IHRhcmdldENvbG9yU3BhY2UgfHwgISBzb3VyY2VDb2xvclNwYWNlIHx8ICEgdGFyZ2V0Q29sb3JTcGFjZSApIHtcclxuXHJcblx0XHRcdFx0cmV0dXJuIGNvbG9yO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCB0aGlzLnNwYWNlc1sgc291cmNlQ29sb3JTcGFjZSBdLnRyYW5zZmVyID09PSBTUkdCVHJhbnNmZXIgKSB7XHJcblxyXG5cdFx0XHRcdGNvbG9yLnIgPSBTUkdCVG9MaW5lYXIoIGNvbG9yLnIgKTtcclxuXHRcdFx0XHRjb2xvci5nID0gU1JHQlRvTGluZWFyKCBjb2xvci5nICk7XHJcblx0XHRcdFx0Y29sb3IuYiA9IFNSR0JUb0xpbmVhciggY29sb3IuYiApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCB0aGlzLnNwYWNlc1sgc291cmNlQ29sb3JTcGFjZSBdLnByaW1hcmllcyAhPT0gdGhpcy5zcGFjZXNbIHRhcmdldENvbG9yU3BhY2UgXS5wcmltYXJpZXMgKSB7XHJcblxyXG5cdFx0XHRcdGNvbG9yLmFwcGx5TWF0cml4MyggdGhpcy5zcGFjZXNbIHNvdXJjZUNvbG9yU3BhY2UgXS50b1hZWiApO1xyXG5cdFx0XHRcdGNvbG9yLmFwcGx5TWF0cml4MyggdGhpcy5zcGFjZXNbIHRhcmdldENvbG9yU3BhY2UgXS5mcm9tWFlaICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMuc3BhY2VzWyB0YXJnZXRDb2xvclNwYWNlIF0udHJhbnNmZXIgPT09IFNSR0JUcmFuc2ZlciApIHtcclxuXHJcblx0XHRcdFx0Y29sb3IuciA9IExpbmVhclRvU1JHQiggY29sb3IuciApO1xyXG5cdFx0XHRcdGNvbG9yLmcgPSBMaW5lYXJUb1NSR0IoIGNvbG9yLmcgKTtcclxuXHRcdFx0XHRjb2xvci5iID0gTGluZWFyVG9TUkdCKCBjb2xvci5iICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gY29sb3I7XHJcblxyXG5cdFx0fSxcclxuXHJcblx0XHRmcm9tV29ya2luZ0NvbG9yU3BhY2U6IGZ1bmN0aW9uICggY29sb3IsIHRhcmdldENvbG9yU3BhY2UgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gdGhpcy5jb252ZXJ0KCBjb2xvciwgdGhpcy53b3JraW5nQ29sb3JTcGFjZSwgdGFyZ2V0Q29sb3JTcGFjZSApO1xyXG5cclxuXHRcdH0sXHJcblxyXG5cdFx0dG9Xb3JraW5nQ29sb3JTcGFjZTogZnVuY3Rpb24gKCBjb2xvciwgc291cmNlQ29sb3JTcGFjZSApIHtcclxuXHJcblx0XHRcdHJldHVybiB0aGlzLmNvbnZlcnQoIGNvbG9yLCBzb3VyY2VDb2xvclNwYWNlLCB0aGlzLndvcmtpbmdDb2xvclNwYWNlICk7XHJcblxyXG5cdFx0fSxcclxuXHJcblx0XHRnZXRQcmltYXJpZXM6IGZ1bmN0aW9uICggY29sb3JTcGFjZSApIHtcclxuXHJcblx0XHRcdHJldHVybiB0aGlzLnNwYWNlc1sgY29sb3JTcGFjZSBdLnByaW1hcmllcztcclxuXHJcblx0XHR9LFxyXG5cclxuXHRcdGdldFRyYW5zZmVyOiBmdW5jdGlvbiAoIGNvbG9yU3BhY2UgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGNvbG9yU3BhY2UgPT09IE5vQ29sb3JTcGFjZSApIHJldHVybiBMaW5lYXJUcmFuc2ZlcjtcclxuXHJcblx0XHRcdHJldHVybiB0aGlzLnNwYWNlc1sgY29sb3JTcGFjZSBdLnRyYW5zZmVyO1xyXG5cclxuXHRcdH0sXHJcblxyXG5cdFx0Z2V0THVtaW5hbmNlQ29lZmZpY2llbnRzOiBmdW5jdGlvbiAoIHRhcmdldCwgY29sb3JTcGFjZSA9IHRoaXMud29ya2luZ0NvbG9yU3BhY2UgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gdGFyZ2V0LmZyb21BcnJheSggdGhpcy5zcGFjZXNbIGNvbG9yU3BhY2UgXS5sdW1pbmFuY2VDb2VmZmljaWVudHMgKTtcclxuXHJcblx0XHR9LFxyXG5cclxuXHRcdGRlZmluZTogZnVuY3Rpb24gKCBjb2xvclNwYWNlcyApIHtcclxuXHJcblx0XHRcdE9iamVjdC5hc3NpZ24oIHRoaXMuc3BhY2VzLCBjb2xvclNwYWNlcyApO1xyXG5cclxuXHRcdH0sXHJcblxyXG5cdFx0Ly8gSW50ZXJuYWwgQVBJc1xyXG5cclxuXHRcdF9nZXRNYXRyaXg6IGZ1bmN0aW9uICggdGFyZ2V0TWF0cml4LCBzb3VyY2VDb2xvclNwYWNlLCB0YXJnZXRDb2xvclNwYWNlICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIHRhcmdldE1hdHJpeFxyXG5cdFx0XHRcdC5jb3B5KCB0aGlzLnNwYWNlc1sgc291cmNlQ29sb3JTcGFjZSBdLnRvWFlaIClcclxuXHRcdFx0XHQubXVsdGlwbHkoIHRoaXMuc3BhY2VzWyB0YXJnZXRDb2xvclNwYWNlIF0uZnJvbVhZWiApO1xyXG5cclxuXHRcdH0sXHJcblxyXG5cdFx0X2dldERyYXdpbmdCdWZmZXJDb2xvclNwYWNlOiBmdW5jdGlvbiAoIGNvbG9yU3BhY2UgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gdGhpcy5zcGFjZXNbIGNvbG9yU3BhY2UgXS5vdXRwdXRDb2xvclNwYWNlQ29uZmlnLmRyYXdpbmdCdWZmZXJDb2xvclNwYWNlO1xyXG5cclxuXHRcdH0sXHJcblxyXG5cdFx0X2dldFVucGFja0NvbG9yU3BhY2U6IGZ1bmN0aW9uICggY29sb3JTcGFjZSA9IHRoaXMud29ya2luZ0NvbG9yU3BhY2UgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gdGhpcy5zcGFjZXNbIGNvbG9yU3BhY2UgXS53b3JraW5nQ29sb3JTcGFjZUNvbmZpZy51bnBhY2tDb2xvclNwYWNlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fTtcclxuXHJcblx0LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5cdCAqIHNSR0IgZGVmaW5pdGlvbnNcclxuXHQgKi9cclxuXHJcblx0Y29uc3QgUkVDNzA5X1BSSU1BUklFUyA9IFsgMC42NDAsIDAuMzMwLCAwLjMwMCwgMC42MDAsIDAuMTUwLCAwLjA2MCBdO1xyXG5cdGNvbnN0IFJFQzcwOV9MVU1JTkFOQ0VfQ09FRkZJQ0lFTlRTID0gWyAwLjIxMjYsIDAuNzE1MiwgMC4wNzIyIF07XHJcblx0Y29uc3QgRDY1ID0gWyAwLjMxMjcsIDAuMzI5MCBdO1xyXG5cclxuXHRDb2xvck1hbmFnZW1lbnQuZGVmaW5lKCB7XHJcblxyXG5cdFx0WyBMaW5lYXJTUkdCQ29sb3JTcGFjZSBdOiB7XHJcblx0XHRcdHByaW1hcmllczogUkVDNzA5X1BSSU1BUklFUyxcclxuXHRcdFx0d2hpdGVQb2ludDogRDY1LFxyXG5cdFx0XHR0cmFuc2ZlcjogTGluZWFyVHJhbnNmZXIsXHJcblx0XHRcdHRvWFlaOiBMSU5FQVJfUkVDNzA5X1RPX1hZWixcclxuXHRcdFx0ZnJvbVhZWjogWFlaX1RPX0xJTkVBUl9SRUM3MDksXHJcblx0XHRcdGx1bWluYW5jZUNvZWZmaWNpZW50czogUkVDNzA5X0xVTUlOQU5DRV9DT0VGRklDSUVOVFMsXHJcblx0XHRcdHdvcmtpbmdDb2xvclNwYWNlQ29uZmlnOiB7IHVucGFja0NvbG9yU3BhY2U6IFNSR0JDb2xvclNwYWNlIH0sXHJcblx0XHRcdG91dHB1dENvbG9yU3BhY2VDb25maWc6IHsgZHJhd2luZ0J1ZmZlckNvbG9yU3BhY2U6IFNSR0JDb2xvclNwYWNlIH1cclxuXHRcdH0sXHJcblxyXG5cdFx0WyBTUkdCQ29sb3JTcGFjZSBdOiB7XHJcblx0XHRcdHByaW1hcmllczogUkVDNzA5X1BSSU1BUklFUyxcclxuXHRcdFx0d2hpdGVQb2ludDogRDY1LFxyXG5cdFx0XHR0cmFuc2ZlcjogU1JHQlRyYW5zZmVyLFxyXG5cdFx0XHR0b1hZWjogTElORUFSX1JFQzcwOV9UT19YWVosXHJcblx0XHRcdGZyb21YWVo6IFhZWl9UT19MSU5FQVJfUkVDNzA5LFxyXG5cdFx0XHRsdW1pbmFuY2VDb2VmZmljaWVudHM6IFJFQzcwOV9MVU1JTkFOQ0VfQ09FRkZJQ0lFTlRTLFxyXG5cdFx0XHRvdXRwdXRDb2xvclNwYWNlQ29uZmlnOiB7IGRyYXdpbmdCdWZmZXJDb2xvclNwYWNlOiBTUkdCQ29sb3JTcGFjZSB9XHJcblx0XHR9LFxyXG5cclxuXHR9ICk7XHJcblxyXG5cdHJldHVybiBDb2xvck1hbmFnZW1lbnQ7XHJcblxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgQ29sb3JNYW5hZ2VtZW50ID0gLypAX19QVVJFX18qLyBjcmVhdGVDb2xvck1hbmFnZW1lbnQoKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBTUkdCVG9MaW5lYXIoIGMgKSB7XHJcblxyXG5cdHJldHVybiAoIGMgPCAwLjA0MDQ1ICkgPyBjICogMC4wNzczOTkzODA4IDogTWF0aC5wb3coIGMgKiAwLjk0Nzg2NzI5ODYgKyAwLjA1MjEzMjcwMTQsIDIuNCApO1xyXG5cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIExpbmVhclRvU1JHQiggYyApIHtcclxuXHJcblx0cmV0dXJuICggYyA8IDAuMDAzMTMwOCApID8gYyAqIDEyLjkyIDogMS4wNTUgKiAoIE1hdGgucG93KCBjLCAwLjQxNjY2ICkgKSAtIDAuMDU1O1xyXG5cclxufVxyXG4iLCJpbXBvcnQgeyBjcmVhdGVFbGVtZW50TlMgfSBmcm9tICcuLi91dGlscy5qcyc7XHJcbmltcG9ydCB7IFNSR0JUb0xpbmVhciB9IGZyb20gJy4uL21hdGgvQ29sb3JNYW5hZ2VtZW50LmpzJztcclxuXHJcbmxldCBfY2FudmFzO1xyXG5cclxuLyoqXHJcbiAqIEEgY2xhc3MgY29udGFpbmluZyB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgaW1hZ2VzLlxyXG4gKlxyXG4gKiBAaGlkZWNvbnN0cnVjdG9yXHJcbiAqL1xyXG5jbGFzcyBJbWFnZVV0aWxzIHtcclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIGRhdGEgVVJJIGNvbnRhaW5pbmcgYSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gaW1hZ2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geyhIVE1MSW1hZ2VFbGVtZW50fEhUTUxDYW52YXNFbGVtZW50KX0gaW1hZ2UgLSBUaGUgaW1hZ2Ugb2JqZWN0LlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbdHlwZT0naW1hZ2UvcG5nJ10gLSBJbmRpY2F0ZXMgdGhlIGltYWdlIGZvcm1hdC5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBkYXRhIFVSSS5cclxuXHQgKi9cclxuXHRzdGF0aWMgZ2V0RGF0YVVSTCggaW1hZ2UsIHR5cGUgPSAnaW1hZ2UvcG5nJyApIHtcclxuXHJcblx0XHRpZiAoIC9eZGF0YTovaS50ZXN0KCBpbWFnZS5zcmMgKSApIHtcclxuXHJcblx0XHRcdHJldHVybiBpbWFnZS5zcmM7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdHlwZW9mIEhUTUxDYW52YXNFbGVtZW50ID09PSAndW5kZWZpbmVkJyApIHtcclxuXHJcblx0XHRcdHJldHVybiBpbWFnZS5zcmM7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGxldCBjYW52YXM7XHJcblxyXG5cdFx0aWYgKCBpbWFnZSBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50ICkge1xyXG5cclxuXHRcdFx0Y2FudmFzID0gaW1hZ2U7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGlmICggX2NhbnZhcyA9PT0gdW5kZWZpbmVkICkgX2NhbnZhcyA9IGNyZWF0ZUVsZW1lbnROUyggJ2NhbnZhcycgKTtcclxuXHJcblx0XHRcdF9jYW52YXMud2lkdGggPSBpbWFnZS53aWR0aDtcclxuXHRcdFx0X2NhbnZhcy5oZWlnaHQgPSBpbWFnZS5oZWlnaHQ7XHJcblxyXG5cdFx0XHRjb25zdCBjb250ZXh0ID0gX2NhbnZhcy5nZXRDb250ZXh0KCAnMmQnICk7XHJcblxyXG5cdFx0XHRpZiAoIGltYWdlIGluc3RhbmNlb2YgSW1hZ2VEYXRhICkge1xyXG5cclxuXHRcdFx0XHRjb250ZXh0LnB1dEltYWdlRGF0YSggaW1hZ2UsIDAsIDAgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGNvbnRleHQuZHJhd0ltYWdlKCBpbWFnZSwgMCwgMCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y2FudmFzID0gX2NhbnZhcztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGNhbnZhcy50b0RhdGFVUkwoIHR5cGUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gc1JHQiBpbWFnZSBkYXRhIHRvIGxpbmVhciBjb2xvciBzcGFjZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7KEhUTUxJbWFnZUVsZW1lbnR8SFRNTENhbnZhc0VsZW1lbnR8SW1hZ2VCaXRtYXB8T2JqZWN0KX0gaW1hZ2UgLSBUaGUgaW1hZ2Ugb2JqZWN0LlxyXG5cdCAqIEByZXR1cm4ge0hUTUxDYW52YXNFbGVtZW50fE9iamVjdH0gVGhlIGNvbnZlcnRlZCBpbWFnZS5cclxuXHQgKi9cclxuXHRzdGF0aWMgc1JHQlRvTGluZWFyKCBpbWFnZSApIHtcclxuXHJcblx0XHRpZiAoICggdHlwZW9mIEhUTUxJbWFnZUVsZW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGltYWdlIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCApIHx8XHJcblx0XHRcdCggdHlwZW9mIEhUTUxDYW52YXNFbGVtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBpbWFnZSBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50ICkgfHxcclxuXHRcdFx0KCB0eXBlb2YgSW1hZ2VCaXRtYXAgIT09ICd1bmRlZmluZWQnICYmIGltYWdlIGluc3RhbmNlb2YgSW1hZ2VCaXRtYXAgKSApIHtcclxuXHJcblx0XHRcdGNvbnN0IGNhbnZhcyA9IGNyZWF0ZUVsZW1lbnROUyggJ2NhbnZhcycgKTtcclxuXHJcblx0XHRcdGNhbnZhcy53aWR0aCA9IGltYWdlLndpZHRoO1xyXG5cdFx0XHRjYW52YXMuaGVpZ2h0ID0gaW1hZ2UuaGVpZ2h0O1xyXG5cclxuXHRcdFx0Y29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCAnMmQnICk7XHJcblx0XHRcdGNvbnRleHQuZHJhd0ltYWdlKCBpbWFnZSwgMCwgMCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCApO1xyXG5cclxuXHRcdFx0Y29uc3QgaW1hZ2VEYXRhID0gY29udGV4dC5nZXRJbWFnZURhdGEoIDAsIDAsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQgKTtcclxuXHRcdFx0Y29uc3QgZGF0YSA9IGltYWdlRGF0YS5kYXRhO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGRhdGFbIGkgXSA9IFNSR0JUb0xpbmVhciggZGF0YVsgaSBdIC8gMjU1ICkgKiAyNTU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb250ZXh0LnB1dEltYWdlRGF0YSggaW1hZ2VEYXRhLCAwLCAwICk7XHJcblxyXG5cdFx0XHRyZXR1cm4gY2FudmFzO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGltYWdlLmRhdGEgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBkYXRhID0gaW1hZ2UuZGF0YS5zbGljZSggMCApO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgfHwgZGF0YSBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5ICkge1xyXG5cclxuXHRcdFx0XHRcdGRhdGFbIGkgXSA9IE1hdGguZmxvb3IoIFNSR0JUb0xpbmVhciggZGF0YVsgaSBdIC8gMjU1ICkgKiAyNTUgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHQvLyBhc3N1bWluZyBmbG9hdFxyXG5cclxuXHRcdFx0XHRcdGRhdGFbIGkgXSA9IFNSR0JUb0xpbmVhciggZGF0YVsgaSBdICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiB7XHJcblx0XHRcdFx0ZGF0YTogZGF0YSxcclxuXHRcdFx0XHR3aWR0aDogaW1hZ2Uud2lkdGgsXHJcblx0XHRcdFx0aGVpZ2h0OiBpbWFnZS5oZWlnaHRcclxuXHRcdFx0fTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuSW1hZ2VVdGlscy5zUkdCVG9MaW5lYXIoKTogVW5zdXBwb3J0ZWQgaW1hZ2UgdHlwZS4gTm8gY29sb3Igc3BhY2UgY29udmVyc2lvbiBhcHBsaWVkLicgKTtcclxuXHRcdFx0cmV0dXJuIGltYWdlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgSW1hZ2VVdGlscyB9O1xyXG4iLCJpbXBvcnQgeyBJbWFnZVV0aWxzIH0gZnJvbSAnLi4vZXh0cmFzL0ltYWdlVXRpbHMuanMnO1xyXG5pbXBvcnQgeyBnZW5lcmF0ZVVVSUQgfSBmcm9tICcuLi9tYXRoL01hdGhVdGlscy5qcyc7XHJcblxyXG5sZXQgX3NvdXJjZUlkID0gMDtcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIHRoZSBkYXRhIHNvdXJjZSBvZiBhIHRleHR1cmUuXHJcbiAqXHJcbiAqIFRoZSBtYWluIHB1cnBvc2Ugb2YgdGhpcyBjbGFzcyBpcyB0byBkZWNvdXBsZSB0aGUgZGF0YSBkZWZpbml0aW9uIGZyb20gdGhlIHRleHR1cmVcclxuICogZGVmaW5pdGlvbiBzbyB0aGUgc2FtZSBkYXRhIGNhbiBiZSB1c2VkIHdpdGggbXVsdGlwbGUgdGV4dHVyZSBpbnN0YW5jZXMuXHJcbiAqL1xyXG5jbGFzcyBTb3VyY2Uge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHZpZGVvIHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge2FueX0gW2RhdGE9bnVsbF0gLSBUaGUgZGF0YSBkZWZpbml0aW9uIG9mIGEgdGV4dHVyZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggZGF0YSA9IG51bGwgKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzU291cmNlID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBJRCBvZiB0aGUgc291cmNlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBuYW1lIFNvdXJjZSNpZFxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICovXHJcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsICdpZCcsIHsgdmFsdWU6IF9zb3VyY2VJZCArKyB9ICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgVVVJRCBvZiB0aGUgc291cmNlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51dWlkID0gZ2VuZXJhdGVVVUlEKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZGF0YSBkZWZpbml0aW9uIG9mIGEgdGV4dHVyZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7YW55fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRhdGEgPSBkYXRhO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBwcm9wZXJ0eSBpcyBvbmx5IHJlbGV2YW50IHdoZW4ge0BsaW5rIFNvdXJjZSNuZWVkc1VwZGF0ZX0gaXMgc2V0IHRvIGB0cnVlYCBhbmRcclxuXHRcdCAqIHByb3ZpZGVzIG1vcmUgY29udHJvbCBvbiBob3cgdGV4dHVyZSBkYXRhIHNob3VsZCBiZSBwcm9jZXNzZWQuIFdoZW4gYGRhdGFSZWFkeWAgaXMgc2V0XHJcblx0XHQgKiB0byBgZmFsc2VgLCB0aGUgZW5naW5lIHBlcmZvcm1zIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiAoaWYgbmVjZXNzYXJ5KSBidXQgZG9lcyBub3QgdHJhbnNmZXJcclxuXHRcdCAqIHRoZSBkYXRhIGludG8gdGhlIEdQVSBtZW1vcnkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGF0YVJlYWR5ID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgc3RhcnRzIGF0IGAwYCBhbmQgY291bnRzIGhvdyBtYW55IHRpbWVzIHtAbGluayBTb3VyY2UjbmVlZHNVcGRhdGV9IGlzIHNldCB0byBgdHJ1ZWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnZlcnNpb24gPSAwO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdoZW4gdGhlIHByb3BlcnR5IGlzIHNldCB0byBgdHJ1ZWAsIHRoZSBlbmdpbmUgYWxsb2NhdGVzIHRoZSBtZW1vcnlcclxuXHQgKiBmb3IgdGhlIHRleHR1cmUgKGlmIG5lY2Vzc2FyeSkgYW5kIHRyaWdnZXJzIHRoZSBhY3R1YWwgdGV4dHVyZSB1cGxvYWRcclxuXHQgKiB0byB0aGUgR1BVIG5leHQgdGltZSB0aGUgc291cmNlIGlzIHVzZWQuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsdWVcclxuXHQgKi9cclxuXHRzZXQgbmVlZHNVcGRhdGUoIHZhbHVlICkge1xyXG5cclxuXHRcdGlmICggdmFsdWUgPT09IHRydWUgKSB0aGlzLnZlcnNpb24gKys7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2VyaWFsaXplcyB0aGUgc291cmNlIGludG8gSlNPTi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7PyhPYmplY3R8c3RyaW5nKX0gbWV0YSAtIEFuIG9wdGlvbmFsIHZhbHVlIGhvbGRpbmcgbWV0YSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VyaWFsaXphdGlvbi5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3R9IEEgSlNPTiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzZXJpYWxpemVkIHNvdXJjZS5cclxuXHQgKiBAc2VlIHtAbGluayBPYmplY3RMb2FkZXIjcGFyc2V9XHJcblx0ICovXHJcblx0dG9KU09OKCBtZXRhICkge1xyXG5cclxuXHRcdGNvbnN0IGlzUm9vdE9iamVjdCA9ICggbWV0YSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBtZXRhID09PSAnc3RyaW5nJyApO1xyXG5cclxuXHRcdGlmICggISBpc1Jvb3RPYmplY3QgJiYgbWV0YS5pbWFnZXNbIHRoaXMudXVpZCBdICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gbWV0YS5pbWFnZXNbIHRoaXMudXVpZCBdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBvdXRwdXQgPSB7XHJcblx0XHRcdHV1aWQ6IHRoaXMudXVpZCxcclxuXHRcdFx0dXJsOiAnJ1xyXG5cdFx0fTtcclxuXHJcblx0XHRjb25zdCBkYXRhID0gdGhpcy5kYXRhO1xyXG5cclxuXHRcdGlmICggZGF0YSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGxldCB1cmw7XHJcblxyXG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIGRhdGEgKSApIHtcclxuXHJcblx0XHRcdFx0Ly8gY3ViZSB0ZXh0dXJlXHJcblxyXG5cdFx0XHRcdHVybCA9IFtdO1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBkYXRhLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBkYXRhWyBpIF0uaXNEYXRhVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdHVybC5wdXNoKCBzZXJpYWxpemVJbWFnZSggZGF0YVsgaSBdLmltYWdlICkgKTtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0dXJsLnB1c2goIHNlcmlhbGl6ZUltYWdlKCBkYXRhWyBpIF0gKSApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0Ly8gdGV4dHVyZVxyXG5cclxuXHRcdFx0XHR1cmwgPSBzZXJpYWxpemVJbWFnZSggZGF0YSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0b3V0cHV0LnVybCA9IHVybDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCAhIGlzUm9vdE9iamVjdCApIHtcclxuXHJcblx0XHRcdG1ldGEuaW1hZ2VzWyB0aGlzLnV1aWQgXSA9IG91dHB1dDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG91dHB1dDtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gc2VyaWFsaXplSW1hZ2UoIGltYWdlICkge1xyXG5cclxuXHRpZiAoICggdHlwZW9mIEhUTUxJbWFnZUVsZW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGltYWdlIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCApIHx8XHJcblx0XHQoIHR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgaW1hZ2UgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCApIHx8XHJcblx0XHQoIHR5cGVvZiBJbWFnZUJpdG1hcCAhPT0gJ3VuZGVmaW5lZCcgJiYgaW1hZ2UgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCApICkge1xyXG5cclxuXHRcdC8vIGRlZmF1bHQgaW1hZ2VzXHJcblxyXG5cdFx0cmV0dXJuIEltYWdlVXRpbHMuZ2V0RGF0YVVSTCggaW1hZ2UgKTtcclxuXHJcblx0fSBlbHNlIHtcclxuXHJcblx0XHRpZiAoIGltYWdlLmRhdGEgKSB7XHJcblxyXG5cdFx0XHQvLyBpbWFnZXMgb2YgRGF0YVRleHR1cmVcclxuXHJcblx0XHRcdHJldHVybiB7XHJcblx0XHRcdFx0ZGF0YTogQXJyYXkuZnJvbSggaW1hZ2UuZGF0YSApLFxyXG5cdFx0XHRcdHdpZHRoOiBpbWFnZS53aWR0aCxcclxuXHRcdFx0XHRoZWlnaHQ6IGltYWdlLmhlaWdodCxcclxuXHRcdFx0XHR0eXBlOiBpbWFnZS5kYXRhLmNvbnN0cnVjdG9yLm5hbWVcclxuXHRcdFx0fTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVGV4dHVyZTogVW5hYmxlIHRvIHNlcmlhbGl6ZSBUZXh0dXJlLicgKTtcclxuXHRcdFx0cmV0dXJuIHt9O1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgU291cmNlIH07XHJcbiIsImltcG9ydCB7IEV2ZW50RGlzcGF0Y2hlciB9IGZyb20gJy4uL2NvcmUvRXZlbnREaXNwYXRjaGVyLmpzJztcclxuaW1wb3J0IHtcclxuXHRNaXJyb3JlZFJlcGVhdFdyYXBwaW5nLFxyXG5cdENsYW1wVG9FZGdlV3JhcHBpbmcsXHJcblx0UmVwZWF0V3JhcHBpbmcsXHJcblx0VW5zaWduZWRCeXRlVHlwZSxcclxuXHRSR0JBRm9ybWF0LFxyXG5cdExpbmVhck1pcG1hcExpbmVhckZpbHRlcixcclxuXHRMaW5lYXJGaWx0ZXIsXHJcblx0VVZNYXBwaW5nLFxyXG5cdE5vQ29sb3JTcGFjZSxcclxufSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBnZW5lcmF0ZVVVSUQgfSBmcm9tICcuLi9tYXRoL01hdGhVdGlscy5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjIuanMnO1xyXG5pbXBvcnQgeyBNYXRyaXgzIH0gZnJvbSAnLi4vbWF0aC9NYXRyaXgzLmpzJztcclxuaW1wb3J0IHsgU291cmNlIH0gZnJvbSAnLi9Tb3VyY2UuanMnO1xyXG5cclxubGV0IF90ZXh0dXJlSWQgPSAwO1xyXG5cclxuLyoqXHJcbiAqIEJhc2UgY2xhc3MgZm9yIGFsbCB0ZXh0dXJlcy5cclxuICpcclxuICogTm90ZTogQWZ0ZXIgdGhlIGluaXRpYWwgdXNlIG9mIGEgdGV4dHVyZSwgaXRzIGRpbWVuc2lvbnMsIGZvcm1hdCwgYW5kIHR5cGVcclxuICogY2Fubm90IGJlIGNoYW5nZWQuIEluc3RlYWQsIGNhbGwge0BsaW5rIFRleHR1cmUjZGlzcG9zZX0gb24gdGhlIHRleHR1cmUgYW5kIGluc3RhbnRpYXRlIGEgbmV3IG9uZS5cclxuICpcclxuICogQGF1Z21lbnRzIEV2ZW50RGlzcGF0Y2hlclxyXG4gKi9cclxuY2xhc3MgVGV4dHVyZSBleHRlbmRzIEV2ZW50RGlzcGF0Y2hlciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7P09iamVjdH0gW2ltYWdlPVRleHR1cmUuREVGQVVMVF9JTUFHRV0gLSBUaGUgaW1hZ2UgaG9sZGluZyB0aGUgdGV4dHVyZSBkYXRhLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbWFwcGluZz1UZXh0dXJlLkRFRkFVTFRfTUFQUElOR10gLSBUaGUgdGV4dHVyZSBtYXBwaW5nLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbd3JhcFM9Q2xhbXBUb0VkZ2VXcmFwcGluZ10gLSBUaGUgd3JhcFMgdmFsdWUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt3cmFwVD1DbGFtcFRvRWRnZVdyYXBwaW5nXSAtIFRoZSB3cmFwVCB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW21hZ0ZpbHRlcj1MaW5lYXJGaWx0ZXJdIC0gVGhlIG1hZyBmaWx0ZXIgdmFsdWUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFttaW5GaWx0ZXI9TGluZWFyTWlwbWFwTGluZWFyRmlsdGVyXSAtIFRoZSBtaW4gZmlsdGVyIHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZm9ybWF0PVJHQkFGb3JtYXRdIC0gVGhlIHRleHR1cmUgZm9ybWF0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbdHlwZT1VbnNpZ25lZEJ5dGVUeXBlXSAtIFRoZSB0ZXh0dXJlIHR5cGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFthbmlzb3Ryb3B5PVRleHR1cmUuREVGQVVMVF9BTklTT1RST1BZXSAtIFRoZSBhbmlzb3Ryb3B5IHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbY29sb3JTcGFjZT1Ob0NvbG9yU3BhY2VdIC0gVGhlIGNvbG9yIHNwYWNlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBpbWFnZSA9IFRleHR1cmUuREVGQVVMVF9JTUFHRSwgbWFwcGluZyA9IFRleHR1cmUuREVGQVVMVF9NQVBQSU5HLCB3cmFwUyA9IENsYW1wVG9FZGdlV3JhcHBpbmcsIHdyYXBUID0gQ2xhbXBUb0VkZ2VXcmFwcGluZywgbWFnRmlsdGVyID0gTGluZWFyRmlsdGVyLCBtaW5GaWx0ZXIgPSBMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXIsIGZvcm1hdCA9IFJHQkFGb3JtYXQsIHR5cGUgPSBVbnNpZ25lZEJ5dGVUeXBlLCBhbmlzb3Ryb3B5ID0gVGV4dHVyZS5ERUZBVUxUX0FOSVNPVFJPUFksIGNvbG9yU3BhY2UgPSBOb0NvbG9yU3BhY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNUZXh0dXJlID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBJRCBvZiB0aGUgdGV4dHVyZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAbmFtZSBUZXh0dXJlI2lkXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKi9cclxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ2lkJywgeyB2YWx1ZTogX3RleHR1cmVJZCArKyB9ICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgVVVJRCBvZiB0aGUgbWF0ZXJpYWwuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnV1aWQgPSBnZW5lcmF0ZVVVSUQoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBuYW1lIG9mIHRoZSBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5hbWUgPSAnJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBkYXRhIGRlZmluaXRpb24gb2YgYSB0ZXh0dXJlLiBBIHJlZmVyZW5jZSB0byB0aGUgZGF0YSBzb3VyY2UgY2FuIGJlXHJcblx0XHQgKiBzaGFyZWQgYWNyb3NzIHRleHR1cmVzLiBUaGlzIGlzIG9mdGVuIHVzZWZ1bCBpbiBjb250ZXh0IG9mIHNwcml0ZXNoZWV0c1xyXG5cdFx0ICogd2hlcmUgbXVsdGlwbGUgdGV4dHVyZXMgcmVuZGVyIHRoZSBzYW1lIGRhdGEgYnV0IHdpdGggZGlmZmVyZW50IHRleHR1cmVcclxuXHRcdCAqIHRyYW5zZm9ybWF0aW9ucy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7U291cmNlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNvdXJjZSA9IG5ldyBTb3VyY2UoIGltYWdlICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBhcnJheSBob2xkaW5nIHVzZXItZGVmaW5lZCBtaXBtYXBzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxPYmplY3Q+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1pcG1hcHMgPSBbXTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvdyB0aGUgdGV4dHVyZSBpcyBhcHBsaWVkIHRvIHRoZSBvYmplY3QuIFRoZSB2YWx1ZSBgVVZNYXBwaW5nYFxyXG5cdFx0ICogaXMgdGhlIGRlZmF1bHQsIHdoZXJlIHRleHR1cmUgb3IgdXYgY29vcmRpbmF0ZXMgYXJlIHVzZWQgdG8gYXBwbHkgdGhlIG1hcC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KFVWTWFwcGluZ3xDdWJlUmVmbGVjdGlvbk1hcHBpbmd8Q3ViZVJlZnJhY3Rpb25NYXBwaW5nfEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nfEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nfEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nKX1cclxuXHRcdCAqIEBkZWZhdWx0IFVWTWFwcGluZ1xyXG5cdFx0Ki9cclxuXHRcdHRoaXMubWFwcGluZyA9IG1hcHBpbmc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBMZXRzIHlvdSBzZWxlY3QgdGhlIHV2IGF0dHJpYnV0ZSB0byBtYXAgdGhlIHRleHR1cmUgdG8uIGAwYCBmb3IgYHV2YCxcclxuXHRcdCAqIGAxYCBmb3IgYHV2MWAsIGAyYCBmb3IgYHV2MmAgYW5kIGAzYCBmb3IgYHV2M2AuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jaGFubmVsID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZGVmaW5lcyBob3cgdGhlIHRleHR1cmUgaXMgd3JhcHBlZCBob3Jpem9udGFsbHkgYW5kIGNvcnJlc3BvbmRzIHRvXHJcblx0XHQgKiAqVSogaW4gVVYgbWFwcGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KFJlcGVhdFdyYXBwaW5nfENsYW1wVG9FZGdlV3JhcHBpbmd8TWlycm9yZWRSZXBlYXRXcmFwcGluZyl9XHJcblx0XHQgKiBAZGVmYXVsdCBDbGFtcFRvRWRnZVdyYXBwaW5nXHJcblx0XHQgKi9cclxuXHRcdHRoaXMud3JhcFMgPSB3cmFwUztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZGVmaW5lcyBob3cgdGhlIHRleHR1cmUgaXMgd3JhcHBlZCBob3Jpem9udGFsbHkgYW5kIGNvcnJlc3BvbmRzIHRvXHJcblx0XHQgKiAqViogaW4gVVYgbWFwcGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KFJlcGVhdFdyYXBwaW5nfENsYW1wVG9FZGdlV3JhcHBpbmd8TWlycm9yZWRSZXBlYXRXcmFwcGluZyl9XHJcblx0XHQgKiBAZGVmYXVsdCBDbGFtcFRvRWRnZVdyYXBwaW5nXHJcblx0XHQgKi9cclxuXHRcdHRoaXMud3JhcFQgPSB3cmFwVDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvdyB0aGUgdGV4dHVyZSBpcyBzYW1wbGVkIHdoZW4gYSB0ZXhlbCBjb3ZlcnMgbW9yZSB0aGFuIG9uZSBwaXhlbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KE5lYXJlc3RGaWx0ZXJ8TmVhcmVzdE1pcG1hcE5lYXJlc3RGaWx0ZXJ8TmVhcmVzdE1pcG1hcExpbmVhckZpbHRlcnxMaW5lYXJGaWx0ZXJ8TGluZWFyTWlwbWFwTmVhcmVzdEZpbHRlcnxMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXIpfVxyXG5cdFx0ICogQGRlZmF1bHQgTGluZWFyRmlsdGVyXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWFnRmlsdGVyID0gbWFnRmlsdGVyO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG93IHRoZSB0ZXh0dXJlIGlzIHNhbXBsZWQgd2hlbiBhIHRleGVsIGNvdmVycyBsZXNzIHRoYW4gb25lIHBpeGVsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoTmVhcmVzdEZpbHRlcnxOZWFyZXN0TWlwbWFwTmVhcmVzdEZpbHRlcnxOZWFyZXN0TWlwbWFwTGluZWFyRmlsdGVyfExpbmVhckZpbHRlcnxMaW5lYXJNaXBtYXBOZWFyZXN0RmlsdGVyfExpbmVhck1pcG1hcExpbmVhckZpbHRlcil9XHJcblx0XHQgKiBAZGVmYXVsdCBMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXJcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5taW5GaWx0ZXIgPSBtaW5GaWx0ZXI7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbnVtYmVyIG9mIHNhbXBsZXMgdGFrZW4gYWxvbmcgdGhlIGF4aXMgdGhyb3VnaCB0aGUgcGl4ZWwgdGhhdCBoYXMgdGhlXHJcblx0XHQgKiBoaWdoZXN0IGRlbnNpdHkgb2YgdGV4ZWxzLiBCeSBkZWZhdWx0LCB0aGlzIHZhbHVlIGlzIGAxYC4gQSBoaWdoZXIgdmFsdWVcclxuXHRcdCAqIGdpdmVzIGEgbGVzcyBibHVycnkgcmVzdWx0IHRoYW4gYSBiYXNpYyBtaXBtYXAsIGF0IHRoZSBjb3N0IG9mIG1vcmVcclxuXHRcdCAqIHRleHR1cmUgc2FtcGxlcyBiZWluZyB1c2VkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYW5pc290cm9weSA9IGFuaXNvdHJvcHk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZm9ybWF0IG9mIHRoZSB0ZXh0dXJlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCBSR0JBRm9ybWF0XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZm9ybWF0ID0gZm9ybWF0O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGRlZmF1bHQgaW50ZXJuYWwgZm9ybWF0IGlzIGRlcml2ZWQgZnJvbSB7QGxpbmsgVGV4dHVyZSNmb3JtYXR9IGFuZCB7QGxpbmsgVGV4dHVyZSN0eXBlfSBhbmRcclxuXHRcdCAqIGRlZmluZXMgaG93IHRoZSB0ZXh0dXJlIGRhdGEgaXMgZ29pbmcgdG8gYmUgc3RvcmVkIG9uIHRoZSBHUFUuXHJcblx0XHQgKlxyXG5cdFx0ICogVGhpcyBwcm9wZXJ0eSBhbGxvd3MgdG8gb3ZlcndyaXRlIHRoZSBkZWZhdWx0IGZvcm1hdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P3N0cmluZ31cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pbnRlcm5hbEZvcm1hdCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZGF0YSB0eXBlIG9mIHRoZSB0ZXh0dXJlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCBVbnNpZ25lZEJ5dGVUeXBlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudHlwZSA9IHR5cGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3cgbXVjaCBhIHNpbmdsZSByZXBldGl0aW9uIG9mIHRoZSB0ZXh0dXJlIGlzIG9mZnNldCBmcm9tIHRoZSBiZWdpbm5pbmcsXHJcblx0XHQgKiBpbiBlYWNoIGRpcmVjdGlvbiBVIGFuZCBWLiBUeXBpY2FsIHJhbmdlIGlzIGAwLjBgIHRvIGAxLjBgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3IyfVxyXG5cdFx0ICogQGRlZmF1bHQgKDAsMClcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5vZmZzZXQgPSBuZXcgVmVjdG9yMiggMCwgMCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG93IG1hbnkgdGltZXMgdGhlIHRleHR1cmUgaXMgcmVwZWF0ZWQgYWNyb3NzIHRoZSBzdXJmYWNlLCBpbiBlYWNoXHJcblx0XHQgKiBkaXJlY3Rpb24gVSBhbmQgVi4gSWYgcmVwZWF0IGlzIHNldCBncmVhdGVyIHRoYW4gYDFgIGluIGVpdGhlciBkaXJlY3Rpb24sXHJcblx0XHQgKiB0aGUgY29ycmVzcG9uZGluZyB3cmFwIHBhcmFtZXRlciBzaG91bGQgYWxzbyBiZSBzZXQgdG8gYFJlcGVhdFdyYXBwaW5nYFxyXG5cdFx0ICogb3IgYE1pcnJvcmVkUmVwZWF0V3JhcHBpbmdgIHRvIGFjaGlldmUgdGhlIGRlc2lyZWQgdGlsaW5nIGVmZmVjdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yMn1cclxuXHRcdCAqIEBkZWZhdWx0ICgxLDEpXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVwZWF0ID0gbmV3IFZlY3RvcjIoIDEsIDEgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBwb2ludCBhcm91bmQgd2hpY2ggcm90YXRpb24gb2NjdXJzLiBBIHZhbHVlIG9mIGAoMC41LCAwLjUpYCBjb3JyZXNwb25kc1xyXG5cdFx0ICogdG8gdGhlIGNlbnRlciBvZiB0aGUgdGV4dHVyZS4gRGVmYXVsdCBpcyBgKDAsIDApYCwgdGhlIGxvd2VyIGxlZnQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjJ9XHJcblx0XHQgKiBAZGVmYXVsdCAoMCwwKVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNlbnRlciA9IG5ldyBWZWN0b3IyKCAwLCAwICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3cgbXVjaCB0aGUgdGV4dHVyZSBpcyByb3RhdGVkIGFyb3VuZCB0aGUgY2VudGVyIHBvaW50LCBpbiByYWRpYW5zLlxyXG5cdFx0ICogUG9zaXRpdmUgdmFsdWVzIGFyZSBjb3VudGVyLWNsb2Nrd2lzZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJvdGF0aW9uID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdG8gdXBkYXRlIHRoZSB0ZXh0dXJlJ3MgdXYtdHJhbnNmb3JtYXRpb24ge0BsaW5rIFRleHR1cmUjbWF0cml4fVxyXG5cdFx0ICogZnJvbSB0aGUgcHJvcGVydGllcyB7QGxpbmsgVGV4dHVyZSNvZmZzZXR9LCB7QGxpbmsgVGV4dHVyZSNyZXBlYXR9LFxyXG5cdFx0ICoge0BsaW5rIFRleHR1cmUjcm90YXRpb259LCBhbmQge0BsaW5rIFRleHR1cmUjY2VudGVyfS5cclxuXHRcdCAqXHJcblx0XHQgKiBTZXQgdGhpcyB0byBgZmFsc2VgIGlmIHlvdSBhcmUgc3BlY2lmeWluZyB0aGUgdXYtdHJhbnNmb3JtIG1hdHJpeCBkaXJlY3RseS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB1di10cmFuc2Zvcm1hdGlvbiBtYXRyaXggb2YgdGhlIHRleHR1cmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge01hdHJpeDN9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWF0cml4ID0gbmV3IE1hdHJpeDMoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdG8gZ2VuZXJhdGUgbWlwbWFwcyAoaWYgcG9zc2libGUpIGZvciBhIHRleHR1cmUuXHJcblx0XHQgKlxyXG5cdFx0ICogU2V0IHRoaXMgdG8gYGZhbHNlYCBpZiB5b3UgYXJlIGNyZWF0aW5nIG1pcG1hcHMgbWFudWFsbHkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ2VuZXJhdGVNaXBtYXBzID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIElmIHNldCB0byBgdHJ1ZWAsIHRoZSBhbHBoYSBjaGFubmVsLCBpZiBwcmVzZW50LCBpcyBtdWx0aXBsaWVkIGludG8gdGhlXHJcblx0XHQgKiBjb2xvciBjaGFubmVscyB3aGVuIHRoZSB0ZXh0dXJlIGlzIHVwbG9hZGVkIHRvIHRoZSBHUFUuXHJcblx0XHQgKlxyXG5cdFx0ICogTm90ZSB0aGF0IHRoaXMgcHJvcGVydHkgaGFzIG5vIGVmZmVjdCB3aGVuIHVzaW5nIGBJbWFnZUJpdG1hcGAuIFlvdSBuZWVkIHRvXHJcblx0XHQgKiBjb25maWd1cmUgcHJlbXVsdGlwbHkgYWxwaGEgb24gYml0bWFwIGNyZWF0aW9uIGluc3RlYWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnByZW11bHRpcGx5QWxwaGEgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIElmIHNldCB0byBgdHJ1ZWAsIHRoZSB0ZXh0dXJlIGlzIGZsaXBwZWQgYWxvbmcgdGhlIHZlcnRpY2FsIGF4aXMgd2hlblxyXG5cdFx0ICogdXBsb2FkZWQgdG8gdGhlIEdQVS5cclxuXHRcdCAqXHJcblx0XHQgKiBOb3RlIHRoYXQgdGhpcyBwcm9wZXJ0eSBoYXMgbm8gZWZmZWN0IHdoZW4gdXNpbmcgYEltYWdlQml0bWFwYC4gWW91IG5lZWQgdG9cclxuXHRcdCAqIGNvbmZpZ3VyZSB0aGUgZmxpcCBvbiBiaXRtYXAgY3JlYXRpb24gaW5zdGVhZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5mbGlwWSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTcGVjaWZpZXMgdGhlIGFsaWdubWVudCByZXF1aXJlbWVudHMgZm9yIHRoZSBzdGFydCBvZiBlYWNoIHBpeGVsIHJvdyBpbiBtZW1vcnkuXHJcblx0XHQgKiBUaGUgYWxsb3dhYmxlIHZhbHVlcyBhcmUgYDFgIChieXRlLWFsaWdubWVudCksIGAyYCAocm93cyBhbGlnbmVkIHRvIGV2ZW4tbnVtYmVyZWQgYnl0ZXMpLFxyXG5cdFx0ICogYDRgICh3b3JkLWFsaWdubWVudCksIGFuZCBgOGAgKHJvd3Mgc3RhcnQgb24gZG91YmxlLXdvcmQgYm91bmRhcmllcykuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDRcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51bnBhY2tBbGlnbm1lbnQgPSA0O1x0Ly8gdmFsaWQgdmFsdWVzOiAxLCAyLCA0LCA4IChzZWUgaHR0cDovL3d3dy5raHJvbm9zLm9yZy9vcGVuZ2xlcy9zZGsvZG9jcy9tYW4veGh0bWwvZ2xQaXhlbFN0b3JlaS54bWwpXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUZXh0dXJlcyBjb250YWluaW5nIGNvbG9yIGRhdGEgc2hvdWxkIGJlIGFubm90YXRlZCB3aXRoIGBTUkdCQ29sb3JTcGFjZWAgb3IgYExpbmVhclNSR0JDb2xvclNwYWNlYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICogQGRlZmF1bHQgTm9Db2xvclNwYWNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29sb3JTcGFjZSA9IGNvbG9yU3BhY2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byBzdG9yZSBjdXN0b20gZGF0YSBhYm91dCB0aGUgdGV4dHVyZS4gSXRcclxuXHRcdCAqIHNob3VsZCBub3QgaG9sZCByZWZlcmVuY2VzIHRvIGZ1bmN0aW9ucyBhcyB0aGVzZSB3aWxsIG5vdCBiZSBjbG9uZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51c2VyRGF0YSA9IHt9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBzdGFydHMgYXQgYDBgIGFuZCBjb3VudHMgaG93IG1hbnkgdGltZXMge0BsaW5rIFRleHR1cmUjbmVlZHNVcGRhdGV9IGlzIHNldCB0byBgdHJ1ZWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnZlcnNpb24gPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBjYWxsYmFjayBmdW5jdGlvbiwgY2FsbGVkIHdoZW4gdGhlIHRleHR1cmUgaXMgdXBkYXRlZCAoZS5nLiwgd2hlblxyXG5cdFx0ICoge0BsaW5rIFRleHR1cmUjbmVlZHNVcGRhdGV9IGhhcyBiZWVuIHNldCB0byB0cnVlIGFuZCB0aGVuIHRoZSB0ZXh0dXJlIGlzIHVzZWQpLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/RnVuY3Rpb259XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMub25VcGRhdGUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQW4gb3B0aW9uYWwgYmFjayByZWZlcmVuY2UgdG8gdGhlIHRleHR1cmVzIHJlbmRlciB0YXJnZXQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez8oUmVuZGVyVGFyZ2V0fFdlYkdMUmVuZGVyVGFyZ2V0KX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXQgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSW5kaWNhdGVzIHdoZXRoZXIgYSB0ZXh0dXJlIGJlbG9uZ3MgdG8gYSByZW5kZXIgdGFyZ2V0IG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1JlbmRlclRhcmdldFRleHR1cmUgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgdGV4dHVyZSBzaG91bGQgYmUgcHJvY2Vzc2VkIGJ5IGBQTVJFTUdlbmVyYXRvcmAgb3Igbm90XHJcblx0XHQgKiAob25seSByZWxldmFudCBmb3IgcmVuZGVyIHRhcmdldCB0ZXh0dXJlcykuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBtcmVtVmVyc2lvbiA9IDA7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGltYWdlIG9iamVjdCBob2xkaW5nIHRoZSB0ZXh0dXJlIGRhdGEuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7P09iamVjdH1cclxuXHQgKi9cclxuXHRnZXQgaW1hZ2UoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuc291cmNlLmRhdGE7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0IGltYWdlKCB2YWx1ZSA9IG51bGwgKSB7XHJcblxyXG5cdFx0dGhpcy5zb3VyY2UuZGF0YSA9IHZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIHRleHR1cmUgdHJhbnNmb3JtYXRpb24gbWF0cml4IGZyb20gdGhlIGZyb20gdGhlIHByb3BlcnRpZXMge0BsaW5rIFRleHR1cmUjb2Zmc2V0fSxcclxuXHQgKiB7QGxpbmsgVGV4dHVyZSNyZXBlYXR9LCB7QGxpbmsgVGV4dHVyZSNyb3RhdGlvbn0sIGFuZCB7QGxpbmsgVGV4dHVyZSNjZW50ZXJ9LlxyXG5cdCAqL1xyXG5cdHVwZGF0ZU1hdHJpeCgpIHtcclxuXHJcblx0XHR0aGlzLm1hdHJpeC5zZXRVdlRyYW5zZm9ybSggdGhpcy5vZmZzZXQueCwgdGhpcy5vZmZzZXQueSwgdGhpcy5yZXBlYXQueCwgdGhpcy5yZXBlYXQueSwgdGhpcy5yb3RhdGlvbiwgdGhpcy5jZW50ZXIueCwgdGhpcy5jZW50ZXIueSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBuZXcgdGV4dHVyZSB3aXRoIGNvcGllZCB2YWx1ZXMgZnJvbSB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7VGV4dHVyZX0gQSBjbG9uZSBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNsb25lKCkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gdGV4dHVyZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSBzb3VyY2UgLSBUaGUgdGV4dHVyZSB0byBjb3B5LlxyXG5cdCAqIEByZXR1cm4ge1RleHR1cmV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHRoaXMubmFtZSA9IHNvdXJjZS5uYW1lO1xyXG5cclxuXHRcdHRoaXMuc291cmNlID0gc291cmNlLnNvdXJjZTtcclxuXHRcdHRoaXMubWlwbWFwcyA9IHNvdXJjZS5taXBtYXBzLnNsaWNlKCAwICk7XHJcblxyXG5cdFx0dGhpcy5tYXBwaW5nID0gc291cmNlLm1hcHBpbmc7XHJcblx0XHR0aGlzLmNoYW5uZWwgPSBzb3VyY2UuY2hhbm5lbDtcclxuXHJcblx0XHR0aGlzLndyYXBTID0gc291cmNlLndyYXBTO1xyXG5cdFx0dGhpcy53cmFwVCA9IHNvdXJjZS53cmFwVDtcclxuXHJcblx0XHR0aGlzLm1hZ0ZpbHRlciA9IHNvdXJjZS5tYWdGaWx0ZXI7XHJcblx0XHR0aGlzLm1pbkZpbHRlciA9IHNvdXJjZS5taW5GaWx0ZXI7XHJcblxyXG5cdFx0dGhpcy5hbmlzb3Ryb3B5ID0gc291cmNlLmFuaXNvdHJvcHk7XHJcblxyXG5cdFx0dGhpcy5mb3JtYXQgPSBzb3VyY2UuZm9ybWF0O1xyXG5cdFx0dGhpcy5pbnRlcm5hbEZvcm1hdCA9IHNvdXJjZS5pbnRlcm5hbEZvcm1hdDtcclxuXHRcdHRoaXMudHlwZSA9IHNvdXJjZS50eXBlO1xyXG5cclxuXHRcdHRoaXMub2Zmc2V0LmNvcHkoIHNvdXJjZS5vZmZzZXQgKTtcclxuXHRcdHRoaXMucmVwZWF0LmNvcHkoIHNvdXJjZS5yZXBlYXQgKTtcclxuXHRcdHRoaXMuY2VudGVyLmNvcHkoIHNvdXJjZS5jZW50ZXIgKTtcclxuXHRcdHRoaXMucm90YXRpb24gPSBzb3VyY2Uucm90YXRpb247XHJcblxyXG5cdFx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gc291cmNlLm1hdHJpeEF1dG9VcGRhdGU7XHJcblx0XHR0aGlzLm1hdHJpeC5jb3B5KCBzb3VyY2UubWF0cml4ICk7XHJcblxyXG5cdFx0dGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSBzb3VyY2UuZ2VuZXJhdGVNaXBtYXBzO1xyXG5cdFx0dGhpcy5wcmVtdWx0aXBseUFscGhhID0gc291cmNlLnByZW11bHRpcGx5QWxwaGE7XHJcblx0XHR0aGlzLmZsaXBZID0gc291cmNlLmZsaXBZO1xyXG5cdFx0dGhpcy51bnBhY2tBbGlnbm1lbnQgPSBzb3VyY2UudW5wYWNrQWxpZ25tZW50O1xyXG5cdFx0dGhpcy5jb2xvclNwYWNlID0gc291cmNlLmNvbG9yU3BhY2U7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXQgPSBzb3VyY2UucmVuZGVyVGFyZ2V0O1xyXG5cdFx0dGhpcy5pc1JlbmRlclRhcmdldFRleHR1cmUgPSBzb3VyY2UuaXNSZW5kZXJUYXJnZXRUZXh0dXJlO1xyXG5cclxuXHRcdHRoaXMudXNlckRhdGEgPSBKU09OLnBhcnNlKCBKU09OLnN0cmluZ2lmeSggc291cmNlLnVzZXJEYXRhICkgKTtcclxuXHJcblx0XHR0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXJpYWxpemVzIHRoZSB0ZXh0dXJlIGludG8gSlNPTi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7PyhPYmplY3R8c3RyaW5nKX0gbWV0YSAtIEFuIG9wdGlvbmFsIHZhbHVlIGhvbGRpbmcgbWV0YSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VyaWFsaXphdGlvbi5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3R9IEEgSlNPTiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzZXJpYWxpemVkIHRleHR1cmUuXHJcblx0ICogQHNlZSB7QGxpbmsgT2JqZWN0TG9hZGVyI3BhcnNlfVxyXG5cdCAqL1xyXG5cdHRvSlNPTiggbWV0YSApIHtcclxuXHJcblx0XHRjb25zdCBpc1Jvb3RPYmplY3QgPSAoIG1ldGEgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgbWV0YSA9PT0gJ3N0cmluZycgKTtcclxuXHJcblx0XHRpZiAoICEgaXNSb290T2JqZWN0ICYmIG1ldGEudGV4dHVyZXNbIHRoaXMudXVpZCBdICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gbWV0YS50ZXh0dXJlc1sgdGhpcy51dWlkIF07XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IG91dHB1dCA9IHtcclxuXHJcblx0XHRcdG1ldGFkYXRhOiB7XHJcblx0XHRcdFx0dmVyc2lvbjogNC42LFxyXG5cdFx0XHRcdHR5cGU6ICdUZXh0dXJlJyxcclxuXHRcdFx0XHRnZW5lcmF0b3I6ICdUZXh0dXJlLnRvSlNPTidcclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdHV1aWQ6IHRoaXMudXVpZCxcclxuXHRcdFx0bmFtZTogdGhpcy5uYW1lLFxyXG5cclxuXHRcdFx0aW1hZ2U6IHRoaXMuc291cmNlLnRvSlNPTiggbWV0YSApLnV1aWQsXHJcblxyXG5cdFx0XHRtYXBwaW5nOiB0aGlzLm1hcHBpbmcsXHJcblx0XHRcdGNoYW5uZWw6IHRoaXMuY2hhbm5lbCxcclxuXHJcblx0XHRcdHJlcGVhdDogWyB0aGlzLnJlcGVhdC54LCB0aGlzLnJlcGVhdC55IF0sXHJcblx0XHRcdG9mZnNldDogWyB0aGlzLm9mZnNldC54LCB0aGlzLm9mZnNldC55IF0sXHJcblx0XHRcdGNlbnRlcjogWyB0aGlzLmNlbnRlci54LCB0aGlzLmNlbnRlci55IF0sXHJcblx0XHRcdHJvdGF0aW9uOiB0aGlzLnJvdGF0aW9uLFxyXG5cclxuXHRcdFx0d3JhcDogWyB0aGlzLndyYXBTLCB0aGlzLndyYXBUIF0sXHJcblxyXG5cdFx0XHRmb3JtYXQ6IHRoaXMuZm9ybWF0LFxyXG5cdFx0XHRpbnRlcm5hbEZvcm1hdDogdGhpcy5pbnRlcm5hbEZvcm1hdCxcclxuXHRcdFx0dHlwZTogdGhpcy50eXBlLFxyXG5cdFx0XHRjb2xvclNwYWNlOiB0aGlzLmNvbG9yU3BhY2UsXHJcblxyXG5cdFx0XHRtaW5GaWx0ZXI6IHRoaXMubWluRmlsdGVyLFxyXG5cdFx0XHRtYWdGaWx0ZXI6IHRoaXMubWFnRmlsdGVyLFxyXG5cdFx0XHRhbmlzb3Ryb3B5OiB0aGlzLmFuaXNvdHJvcHksXHJcblxyXG5cdFx0XHRmbGlwWTogdGhpcy5mbGlwWSxcclxuXHJcblx0XHRcdGdlbmVyYXRlTWlwbWFwczogdGhpcy5nZW5lcmF0ZU1pcG1hcHMsXHJcblx0XHRcdHByZW11bHRpcGx5QWxwaGE6IHRoaXMucHJlbXVsdGlwbHlBbHBoYSxcclxuXHRcdFx0dW5wYWNrQWxpZ25tZW50OiB0aGlzLnVucGFja0FsaWdubWVudFxyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0aWYgKCBPYmplY3Qua2V5cyggdGhpcy51c2VyRGF0YSApLmxlbmd0aCA+IDAgKSBvdXRwdXQudXNlckRhdGEgPSB0aGlzLnVzZXJEYXRhO1xyXG5cclxuXHRcdGlmICggISBpc1Jvb3RPYmplY3QgKSB7XHJcblxyXG5cdFx0XHRtZXRhLnRleHR1cmVzWyB0aGlzLnV1aWQgXSA9IG91dHB1dDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG91dHB1dDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGcmVlcyB0aGUgR1BVLXJlbGF0ZWQgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGlzIGluc3RhbmNlLiBDYWxsIHRoaXNcclxuXHQgKiBtZXRob2Qgd2hlbmV2ZXIgdGhpcyBpbnN0YW5jZSBpcyBubyBsb25nZXIgdXNlZCBpbiB5b3VyIGFwcC5cclxuXHQgKlxyXG5cdCAqIEBmaXJlcyBUZXh0dXJlI2Rpc3Bvc2VcclxuXHQgKi9cclxuXHRkaXNwb3NlKCkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRmlyZXMgd2hlbiB0aGUgdGV4dHVyZSBoYXMgYmVlbiBkaXNwb3NlZCBvZi5cclxuXHRcdCAqXHJcblx0XHQgKiBAZXZlbnQgVGV4dHVyZSNkaXNwb3NlXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2Rpc3Bvc2UnIH0gKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUcmFuc2Zvcm1zIHRoZSBnaXZlbiB1diB2ZWN0b3Igd2l0aCB0aGUgdGV4dHVyZXMgdXYgdHJhbnNmb3JtYXRpb24gbWF0cml4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSB1diAtIFRoZSB1diB2ZWN0b3IuXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gVGhlIHRyYW5zZm9ybWVkIHV2IHZlY3Rvci5cclxuXHQgKi9cclxuXHR0cmFuc2Zvcm1VdiggdXYgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm1hcHBpbmcgIT09IFVWTWFwcGluZyApIHJldHVybiB1djtcclxuXHJcblx0XHR1di5hcHBseU1hdHJpeDMoIHRoaXMubWF0cml4ICk7XHJcblxyXG5cdFx0aWYgKCB1di54IDwgMCB8fCB1di54ID4gMSApIHtcclxuXHJcblx0XHRcdHN3aXRjaCAoIHRoaXMud3JhcFMgKSB7XHJcblxyXG5cdFx0XHRcdGNhc2UgUmVwZWF0V3JhcHBpbmc6XHJcblxyXG5cdFx0XHRcdFx0dXYueCA9IHV2LnggLSBNYXRoLmZsb29yKCB1di54ICk7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0Y2FzZSBDbGFtcFRvRWRnZVdyYXBwaW5nOlxyXG5cclxuXHRcdFx0XHRcdHV2LnggPSB1di54IDwgMCA/IDAgOiAxO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdGNhc2UgTWlycm9yZWRSZXBlYXRXcmFwcGluZzpcclxuXHJcblx0XHRcdFx0XHRpZiAoIE1hdGguYWJzKCBNYXRoLmZsb29yKCB1di54ICkgJSAyICkgPT09IDEgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHR1di54ID0gTWF0aC5jZWlsKCB1di54ICkgLSB1di54O1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHR1di54ID0gdXYueCAtIE1hdGguZmxvb3IoIHV2LnggKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdXYueSA8IDAgfHwgdXYueSA+IDEgKSB7XHJcblxyXG5cdFx0XHRzd2l0Y2ggKCB0aGlzLndyYXBUICkge1xyXG5cclxuXHRcdFx0XHRjYXNlIFJlcGVhdFdyYXBwaW5nOlxyXG5cclxuXHRcdFx0XHRcdHV2LnkgPSB1di55IC0gTWF0aC5mbG9vciggdXYueSApO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdGNhc2UgQ2xhbXBUb0VkZ2VXcmFwcGluZzpcclxuXHJcblx0XHRcdFx0XHR1di55ID0gdXYueSA8IDAgPyAwIDogMTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRjYXNlIE1pcnJvcmVkUmVwZWF0V3JhcHBpbmc6XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBNYXRoLmFicyggTWF0aC5mbG9vciggdXYueSApICUgMiApID09PSAxICkge1xyXG5cclxuXHRcdFx0XHRcdFx0dXYueSA9IE1hdGguY2VpbCggdXYueSApIC0gdXYueTtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0dXYueSA9IHV2LnkgLSBNYXRoLmZsb29yKCB1di55ICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMuZmxpcFkgKSB7XHJcblxyXG5cdFx0XHR1di55ID0gMSAtIHV2Lnk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB1djtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXR0aW5nIHRoaXMgcHJvcGVydHkgdG8gYHRydWVgIGluZGljYXRlcyB0aGUgZW5naW5lIHRoZSB0ZXh0dXJlXHJcblx0ICogbXVzdCBiZSB1cGRhdGVkIGluIHRoZSBuZXh0IHJlbmRlci4gVGhpcyB0cmlnZ2VycyBhIHRleHR1cmUgdXBsb2FkXHJcblx0ICogdG8gdGhlIEdQVSBhbmQgZW5zdXJlcyBjb3JyZWN0IHRleHR1cmUgcGFyYW1ldGVyIGNvbmZpZ3VyYXRpb24uXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsdWVcclxuXHQgKi9cclxuXHRzZXQgbmVlZHNVcGRhdGUoIHZhbHVlICkge1xyXG5cclxuXHRcdGlmICggdmFsdWUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnZlcnNpb24gKys7XHJcblx0XHRcdHRoaXMuc291cmNlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0dGluZyB0aGlzIHByb3BlcnR5IHRvIGB0cnVlYCBpbmRpY2F0ZXMgdGhlIGVuZ2luZSB0aGUgUE1SRU1cclxuXHQgKiBtdXN0IGJlIHJlZ2VuZXJhdGVkLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbHVlXHJcblx0ICovXHJcblx0c2V0IG5lZWRzUE1SRU1VcGRhdGUoIHZhbHVlICkge1xyXG5cclxuXHRcdGlmICggdmFsdWUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnBtcmVtVmVyc2lvbiArKztcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUaGUgZGVmYXVsdCBpbWFnZSBmb3IgYWxsIHRleHR1cmVzLlxyXG4gKlxyXG4gKiBAc3RhdGljXHJcbiAqIEB0eXBlIHs/SW1hZ2V9XHJcbiAqIEBkZWZhdWx0IG51bGxcclxuICovXHJcblRleHR1cmUuREVGQVVMVF9JTUFHRSA9IG51bGw7XHJcblxyXG4vKipcclxuICogVGhlIGRlZmF1bHQgbWFwcGluZyBmb3IgYWxsIHRleHR1cmVzLlxyXG4gKlxyXG4gKiBAc3RhdGljXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBkZWZhdWx0IFVWTWFwcGluZ1xyXG4gKi9cclxuVGV4dHVyZS5ERUZBVUxUX01BUFBJTkcgPSBVVk1hcHBpbmc7XHJcblxyXG4vKipcclxuICogVGhlIGRlZmF1bHQgYW5pc290cm9weSB2YWx1ZSBmb3IgYWxsIHRleHR1cmVzLlxyXG4gKlxyXG4gKiBAc3RhdGljXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBkZWZhdWx0IDFcclxuICovXHJcblRleHR1cmUuREVGQVVMVF9BTklTT1RST1BZID0gMTtcclxuXHJcbmV4cG9ydCB7IFRleHR1cmUgfTtcclxuIiwiaW1wb3J0IHsgY2xhbXAgfSBmcm9tICcuL01hdGhVdGlscy5qcyc7XHJcblxyXG4vKipcclxuICogQ2xhc3MgcmVwcmVzZW50aW5nIGEgNEQgdmVjdG9yLiBBIDREIHZlY3RvciBpcyBhbiBvcmRlcmVkIHF1YWRydXBsZXQgb2YgbnVtYmVyc1xyXG4gKiAobGFiZWxlZCB4LCB5LCB6IGFuZCB3KSwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gcmVwcmVzZW50IGEgbnVtYmVyIG9mIHRoaW5ncywgc3VjaCBhczpcclxuICpcclxuICogLSBBIHBvaW50IGluIDREIHNwYWNlLlxyXG4gKiAtIEEgZGlyZWN0aW9uIGFuZCBsZW5ndGggaW4gNEQgc3BhY2UuIEluIHRocmVlLmpzIHRoZSBsZW5ndGggd2lsbFxyXG4gKiBhbHdheXMgYmUgdGhlIEV1Y2xpZGVhbiBkaXN0YW5jZShzdHJhaWdodC1saW5lIGRpc3RhbmNlKSBmcm9tIGAoMCwgMCwgMCwgMClgIHRvIGAoeCwgeSwgeiwgdylgXHJcbiAqIGFuZCB0aGUgZGlyZWN0aW9uIGlzIGFsc28gbWVhc3VyZWQgZnJvbSBgKDAsIDAsIDAsIDApYCB0b3dhcmRzIGAoeCwgeSwgeiwgdylgLlxyXG4gKiAtIEFueSBhcmJpdHJhcnkgb3JkZXJlZCBxdWFkcnVwbGV0IG9mIG51bWJlcnMuXHJcbiAqXHJcbiAqIFRoZXJlIGFyZSBvdGhlciB0aGluZ3MgYSA0RCB2ZWN0b3IgY2FuIGJlIHVzZWQgdG8gcmVwcmVzZW50LCBob3dldmVyIHRoZXNlXHJcbiAqIGFyZSB0aGUgbW9zdCBjb21tb24gdXNlcyBpbiAqdGhyZWUuanMqLlxyXG4gKlxyXG4gKiBJdGVyYXRpbmcgdGhyb3VnaCBhIHZlY3RvciBpbnN0YW5jZSB3aWxsIHlpZWxkIGl0cyBjb21wb25lbnRzIGAoeCwgeSwgeiwgdylgIGluXHJcbiAqIHRoZSBjb3JyZXNwb25kaW5nIG9yZGVyLlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBhID0gbmV3IFRIUkVFLlZlY3RvcjQoIDAsIDEsIDAsIDAgKTtcclxuICpcclxuICogLy9ubyBhcmd1bWVudHM7IHdpbGwgYmUgaW5pdGlhbGlzZWQgdG8gKDAsIDAsIDAsIDEpXHJcbiAqIGNvbnN0IGIgPSBuZXcgVEhSRUUuVmVjdG9yNCggKTtcclxuICpcclxuICogY29uc3QgZCA9IGEuZG90KCBiICk7XHJcbiAqIGBgYFxyXG4gKi9cclxuY2xhc3MgVmVjdG9yNCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgNEQgdmVjdG9yLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt4PTBdIC0gVGhlIHggdmFsdWUgb2YgdGhpcyB2ZWN0b3IuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt5PTBdIC0gVGhlIHkgdmFsdWUgb2YgdGhpcyB2ZWN0b3IuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt6PTBdIC0gVGhlIHogdmFsdWUgb2YgdGhpcyB2ZWN0b3IuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt3PTFdIC0gVGhlIHcgdmFsdWUgb2YgdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHggPSAwLCB5ID0gMCwgeiA9IDAsIHcgPSAxICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0VmVjdG9yNC5wcm90b3R5cGUuaXNWZWN0b3I0ID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB4IHZhbHVlIG9mIHRoaXMgdmVjdG9yLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMueCA9IHg7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgeSB2YWx1ZSBvZiB0aGlzIHZlY3Rvci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnkgPSB5O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHogdmFsdWUgb2YgdGhpcyB2ZWN0b3IuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy56ID0gejtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB3IHZhbHVlIG9mIHRoaXMgdmVjdG9yLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudyA9IHc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWxpYXMgZm9yIHtAbGluayBWZWN0b3I0I3p9LlxyXG5cdCAqXHJcblx0ICogQHR5cGUge251bWJlcn1cclxuXHQgKi9cclxuXHRnZXQgd2lkdGgoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuejtcclxuXHJcblx0fVxyXG5cclxuXHRzZXQgd2lkdGgoIHZhbHVlICkge1xyXG5cclxuXHRcdHRoaXMueiA9IHZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFsaWFzIGZvciB7QGxpbmsgVmVjdG9yNCN3fS5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0ICovXHJcblx0Z2V0IGhlaWdodCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy53O1xyXG5cclxuXHR9XHJcblxyXG5cdHNldCBoZWlnaHQoIHZhbHVlICkge1xyXG5cclxuXHRcdHRoaXMudyA9IHZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHZlY3RvciBjb21wb25lbnRzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgdmFsdWUgb2YgdGhlIHggY29tcG9uZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHZhbHVlIG9mIHRoZSB5IGNvbXBvbmVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geiAtIFRoZSB2YWx1ZSBvZiB0aGUgeiBjb21wb25lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHcgLSBUaGUgdmFsdWUgb2YgdGhlIHcgY29tcG9uZW50LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHNldCggeCwgeSwgeiwgdyApIHtcclxuXHJcblx0XHR0aGlzLnggPSB4O1xyXG5cdFx0dGhpcy55ID0geTtcclxuXHRcdHRoaXMueiA9IHo7XHJcblx0XHR0aGlzLncgPSB3O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHZlY3RvciBjb21wb25lbnRzIHRvIHRoZSBzYW1lIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHNjYWxhciAtIFRoZSB2YWx1ZSB0byBzZXQgZm9yIGFsbCB2ZWN0b3IgY29tcG9uZW50cy5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3I0fSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRzZXRTY2FsYXIoIHNjYWxhciApIHtcclxuXHJcblx0XHR0aGlzLnggPSBzY2FsYXI7XHJcblx0XHR0aGlzLnkgPSBzY2FsYXI7XHJcblx0XHR0aGlzLnogPSBzY2FsYXI7XHJcblx0XHR0aGlzLncgPSBzY2FsYXI7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdmVjdG9yJ3MgeCBjb21wb25lbnQgdG8gdGhlIGdpdmVuIHZhbHVlXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB2YWx1ZSB0byBzZXQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yNH0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0c2V0WCggeCApIHtcclxuXHJcblx0XHR0aGlzLnggPSB4O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHZlY3RvcidzIHkgY29tcG9uZW50IHRvIHRoZSBnaXZlbiB2YWx1ZVxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmFsdWUgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHNldFkoIHkgKSB7XHJcblxyXG5cdFx0dGhpcy55ID0geTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB2ZWN0b3IncyB6IGNvbXBvbmVudCB0byB0aGUgZ2l2ZW4gdmFsdWVcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB6IC0gVGhlIHZhbHVlIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3I0fSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRzZXRaKCB6ICkge1xyXG5cclxuXHRcdHRoaXMueiA9IHo7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdmVjdG9yJ3MgdyBjb21wb25lbnQgdG8gdGhlIGdpdmVuIHZhbHVlXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdyAtIFRoZSB2YWx1ZSB0byBzZXQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yNH0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0c2V0VyggdyApIHtcclxuXHJcblx0XHR0aGlzLncgPSB3O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFsbG93cyB0byBzZXQgYSB2ZWN0b3IgY29tcG9uZW50IHdpdGggYW4gaW5kZXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgY29tcG9uZW50IGluZGV4LiBgMGAgZXF1YWxzIHRvIHgsIGAxYCBlcXVhbHMgdG8geSxcclxuXHQgKiBgMmAgZXF1YWxzIHRvIHosIGAzYCBlcXVhbHMgdG8gdy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHNldENvbXBvbmVudCggaW5kZXgsIHZhbHVlICkge1xyXG5cclxuXHRcdHN3aXRjaCAoIGluZGV4ICkge1xyXG5cclxuXHRcdFx0Y2FzZSAwOiB0aGlzLnggPSB2YWx1ZTsgYnJlYWs7XHJcblx0XHRcdGNhc2UgMTogdGhpcy55ID0gdmFsdWU7IGJyZWFrO1xyXG5cdFx0XHRjYXNlIDI6IHRoaXMueiA9IHZhbHVlOyBicmVhaztcclxuXHRcdFx0Y2FzZSAzOiB0aGlzLncgPSB2YWx1ZTsgYnJlYWs7XHJcblx0XHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvciggJ2luZGV4IGlzIG91dCBvZiByYW5nZTogJyArIGluZGV4ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSB2ZWN0b3IgY29tcG9uZW50IHdoaWNoIG1hdGNoZXMgdGhlIGdpdmVuIGluZGV4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGNvbXBvbmVudCBpbmRleC4gYDBgIGVxdWFscyB0byB4LCBgMWAgZXF1YWxzIHRvIHksXHJcblx0ICogYDJgIGVxdWFscyB0byB6LCBgM2AgZXF1YWxzIHRvIHcuXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBBIHZlY3RvciBjb21wb25lbnQgdmFsdWUuXHJcblx0ICovXHJcblx0Z2V0Q29tcG9uZW50KCBpbmRleCApIHtcclxuXHJcblx0XHRzd2l0Y2ggKCBpbmRleCApIHtcclxuXHJcblx0XHRcdGNhc2UgMDogcmV0dXJuIHRoaXMueDtcclxuXHRcdFx0Y2FzZSAxOiByZXR1cm4gdGhpcy55O1xyXG5cdFx0XHRjYXNlIDI6IHJldHVybiB0aGlzLno7XHJcblx0XHRcdGNhc2UgMzogcmV0dXJuIHRoaXMudztcclxuXHRcdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCAnaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAnICsgaW5kZXggKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIG5ldyB2ZWN0b3Igd2l0aCBjb3BpZWQgdmFsdWVzIGZyb20gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjR9IEEgY2xvbmUgb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjbG9uZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMueCwgdGhpcy55LCB0aGlzLnosIHRoaXMudyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvcGllcyB0aGUgdmFsdWVzIG9mIHRoZSBnaXZlbiB2ZWN0b3IgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM3xWZWN0b3I0fSB2IC0gVGhlIHZlY3RvciB0byBjb3B5LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGNvcHkoIHYgKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gdi54O1xyXG5cdFx0dGhpcy55ID0gdi55O1xyXG5cdFx0dGhpcy56ID0gdi56O1xyXG5cdFx0dGhpcy53ID0gKCB2LncgIT09IHVuZGVmaW5lZCApID8gdi53IDogMTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIHRoZSBnaXZlbiB2ZWN0b3IgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yNH0gdiAtIFRoZSB2ZWN0b3IgdG8gYWRkLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGFkZCggdiApIHtcclxuXHJcblx0XHR0aGlzLnggKz0gdi54O1xyXG5cdFx0dGhpcy55ICs9IHYueTtcclxuXHRcdHRoaXMueiArPSB2Lno7XHJcblx0XHR0aGlzLncgKz0gdi53O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgdGhlIGdpdmVuIHNjYWxhciB2YWx1ZSB0byBhbGwgY29tcG9uZW50cyBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHMgLSBUaGUgc2NhbGFyIHRvIGFkZC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3I0fSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRhZGRTY2FsYXIoIHMgKSB7XHJcblxyXG5cdFx0dGhpcy54ICs9IHM7XHJcblx0XHR0aGlzLnkgKz0gcztcclxuXHRcdHRoaXMueiArPSBzO1xyXG5cdFx0dGhpcy53ICs9IHM7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyB0aGUgZ2l2ZW4gdmVjdG9ycyBhbmQgc3RvcmVzIHRoZSByZXN1bHQgaW4gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yNH0gYSAtIFRoZSBmaXJzdCB2ZWN0b3IuXHJcblx0ICogQHBhcmFtIHtWZWN0b3I0fSBiIC0gVGhlIHNlY29uZCB2ZWN0b3IuXHJcblx0ICogQHJldHVybiB7VmVjdG9yNH0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0YWRkVmVjdG9ycyggYSwgYiApIHtcclxuXHJcblx0XHR0aGlzLnggPSBhLnggKyBiLng7XHJcblx0XHR0aGlzLnkgPSBhLnkgKyBiLnk7XHJcblx0XHR0aGlzLnogPSBhLnogKyBiLno7XHJcblx0XHR0aGlzLncgPSBhLncgKyBiLnc7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyB0aGUgZ2l2ZW4gdmVjdG9yIHNjYWxlZCBieSB0aGUgZ2l2ZW4gZmFjdG9yIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjR9IHYgLSBUaGUgdmVjdG9yLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzIC0gVGhlIGZhY3RvciB0aGF0IHNjYWxlcyBgdmAuXHJcblx0ICogQHJldHVybiB7VmVjdG9yNH0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0YWRkU2NhbGVkVmVjdG9yKCB2LCBzICkge1xyXG5cclxuXHRcdHRoaXMueCArPSB2LnggKiBzO1xyXG5cdFx0dGhpcy55ICs9IHYueSAqIHM7XHJcblx0XHR0aGlzLnogKz0gdi56ICogcztcclxuXHRcdHRoaXMudyArPSB2LncgKiBzO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFN1YnRyYWN0cyB0aGUgZ2l2ZW4gdmVjdG9yIGZyb20gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yNH0gdiAtIFRoZSB2ZWN0b3IgdG8gc3VidHJhY3QuXHJcblx0ICogQHJldHVybiB7VmVjdG9yNH0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0c3ViKCB2ICkge1xyXG5cclxuXHRcdHRoaXMueCAtPSB2Lng7XHJcblx0XHR0aGlzLnkgLT0gdi55O1xyXG5cdFx0dGhpcy56IC09IHYuejtcclxuXHRcdHRoaXMudyAtPSB2Lnc7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3VidHJhY3RzIHRoZSBnaXZlbiBzY2FsYXIgdmFsdWUgZnJvbSBhbGwgY29tcG9uZW50cyBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHMgLSBUaGUgc2NhbGFyIHRvIHN1YnRyYWN0LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHN1YlNjYWxhciggcyApIHtcclxuXHJcblx0XHR0aGlzLnggLT0gcztcclxuXHRcdHRoaXMueSAtPSBzO1xyXG5cdFx0dGhpcy56IC09IHM7XHJcblx0XHR0aGlzLncgLT0gcztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTdWJ0cmFjdHMgdGhlIGdpdmVuIHZlY3RvcnMgYW5kIHN0b3JlcyB0aGUgcmVzdWx0IGluIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjR9IGEgLSBUaGUgZmlyc3QgdmVjdG9yLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yNH0gYiAtIFRoZSBzZWNvbmQgdmVjdG9yLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHN1YlZlY3RvcnMoIGEsIGIgKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gYS54IC0gYi54O1xyXG5cdFx0dGhpcy55ID0gYS55IC0gYi55O1xyXG5cdFx0dGhpcy56ID0gYS56IC0gYi56O1xyXG5cdFx0dGhpcy53ID0gYS53IC0gYi53O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE11bHRpcGxpZXMgdGhlIGdpdmVuIHZlY3RvciB3aXRoIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjR9IHYgLSBUaGUgdmVjdG9yIHRvIG11bHRpcGx5LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdG11bHRpcGx5KCB2ICkge1xyXG5cclxuXHRcdHRoaXMueCAqPSB2Lng7XHJcblx0XHR0aGlzLnkgKj0gdi55O1xyXG5cdFx0dGhpcy56ICo9IHYuejtcclxuXHRcdHRoaXMudyAqPSB2Lnc7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTXVsdGlwbGllcyB0aGUgZ2l2ZW4gc2NhbGFyIHZhbHVlIHdpdGggYWxsIGNvbXBvbmVudHMgb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzY2FsYXIgLSBUaGUgc2NhbGFyIHRvIG11bHRpcGx5LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdG11bHRpcGx5U2NhbGFyKCBzY2FsYXIgKSB7XHJcblxyXG5cdFx0dGhpcy54ICo9IHNjYWxhcjtcclxuXHRcdHRoaXMueSAqPSBzY2FsYXI7XHJcblx0XHR0aGlzLnogKj0gc2NhbGFyO1xyXG5cdFx0dGhpcy53ICo9IHNjYWxhcjtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBNdWx0aXBsaWVzIHRoaXMgdmVjdG9yIHdpdGggdGhlIGdpdmVuIDR4NCBtYXRyaXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDR9IG0gLSBUaGUgNHg0IG1hdHJpeC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3I0fSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRhcHBseU1hdHJpeDQoIG0gKSB7XHJcblxyXG5cdFx0Y29uc3QgeCA9IHRoaXMueCwgeSA9IHRoaXMueSwgeiA9IHRoaXMueiwgdyA9IHRoaXMudztcclxuXHRcdGNvbnN0IGUgPSBtLmVsZW1lbnRzO1xyXG5cclxuXHRcdHRoaXMueCA9IGVbIDAgXSAqIHggKyBlWyA0IF0gKiB5ICsgZVsgOCBdICogeiArIGVbIDEyIF0gKiB3O1xyXG5cdFx0dGhpcy55ID0gZVsgMSBdICogeCArIGVbIDUgXSAqIHkgKyBlWyA5IF0gKiB6ICsgZVsgMTMgXSAqIHc7XHJcblx0XHR0aGlzLnogPSBlWyAyIF0gKiB4ICsgZVsgNiBdICogeSArIGVbIDEwIF0gKiB6ICsgZVsgMTQgXSAqIHc7XHJcblx0XHR0aGlzLncgPSBlWyAzIF0gKiB4ICsgZVsgNyBdICogeSArIGVbIDExIF0gKiB6ICsgZVsgMTUgXSAqIHc7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGl2aWRlcyB0aGlzIGluc3RhbmNlIGJ5IHRoZSBnaXZlbiB2ZWN0b3IuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjR9IHYgLSBUaGUgdmVjdG9yIHRvIGRpdmlkZS5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3I0fSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRkaXZpZGUoIHYgKSB7XHJcblxyXG5cdFx0dGhpcy54IC89IHYueDtcclxuXHRcdHRoaXMueSAvPSB2Lnk7XHJcblx0XHR0aGlzLnogLz0gdi56O1xyXG5cdFx0dGhpcy53IC89IHYudztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEaXZpZGVzIHRoaXMgdmVjdG9yIGJ5IHRoZSBnaXZlbiBzY2FsYXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc2NhbGFyIC0gVGhlIHNjYWxhciB0byBkaXZpZGUuXHJcblx0ICogQHJldHVybiB7VmVjdG9yNH0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0ZGl2aWRlU2NhbGFyKCBzY2FsYXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoIDEgLyBzY2FsYXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB4LCB5IGFuZCB6IGNvbXBvbmVudHMgb2YgdGhpc1xyXG5cdCAqIHZlY3RvciB0byB0aGUgcXVhdGVybmlvbidzIGF4aXMgYW5kIHcgdG8gdGhlIGFuZ2xlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtRdWF0ZXJuaW9ufSBxIC0gVGhlIFF1YXRlcm5pb24gdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHNldEF4aXNBbmdsZUZyb21RdWF0ZXJuaW9uKCBxICkge1xyXG5cclxuXHRcdC8vIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2dlb21ldHJ5L3JvdGF0aW9ucy9jb252ZXJzaW9ucy9xdWF0ZXJuaW9uVG9BbmdsZS9pbmRleC5odG1cclxuXHJcblx0XHQvLyBxIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZFxyXG5cclxuXHRcdHRoaXMudyA9IDIgKiBNYXRoLmFjb3MoIHEudyApO1xyXG5cclxuXHRcdGNvbnN0IHMgPSBNYXRoLnNxcnQoIDEgLSBxLncgKiBxLncgKTtcclxuXHJcblx0XHRpZiAoIHMgPCAwLjAwMDEgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnggPSAxO1xyXG5cdFx0XHR0aGlzLnkgPSAwO1xyXG5cdFx0XHR0aGlzLnogPSAwO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR0aGlzLnggPSBxLnggLyBzO1xyXG5cdFx0XHR0aGlzLnkgPSBxLnkgLyBzO1xyXG5cdFx0XHR0aGlzLnogPSBxLnogLyBzO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB4LCB5IGFuZCB6IGNvbXBvbmVudHMgb2YgdGhpc1xyXG5cdCAqIHZlY3RvciB0byB0aGUgYXhpcyBvZiByb3RhdGlvbiBhbmQgdyB0byB0aGUgYW5nbGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDR9IG0gLSBBIDR4NCBtYXRyaXggb2Ygd2hpY2ggdGhlIHVwcGVyIGxlZnQgM3gzIG1hdHJpeCBpcyBhIHB1cmUgcm90YXRpb24gbWF0cml4LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHNldEF4aXNBbmdsZUZyb21Sb3RhdGlvbk1hdHJpeCggbSApIHtcclxuXHJcblx0XHQvLyBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9nZW9tZXRyeS9yb3RhdGlvbnMvY29udmVyc2lvbnMvbWF0cml4VG9BbmdsZS9pbmRleC5odG1cclxuXHJcblx0XHQvLyBhc3N1bWVzIHRoZSB1cHBlciAzeDMgb2YgbSBpcyBhIHB1cmUgcm90YXRpb24gbWF0cml4IChpLmUsIHVuc2NhbGVkKVxyXG5cclxuXHRcdGxldCBhbmdsZSwgeCwgeSwgejsgLy8gdmFyaWFibGVzIGZvciByZXN1bHRcclxuXHRcdGNvbnN0IGVwc2lsb24gPSAwLjAxLFx0XHQvLyBtYXJnaW4gdG8gYWxsb3cgZm9yIHJvdW5kaW5nIGVycm9yc1xyXG5cdFx0XHRlcHNpbG9uMiA9IDAuMSxcdFx0Ly8gbWFyZ2luIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gMCBhbmQgMTgwIGRlZ3JlZXNcclxuXHJcblx0XHRcdHRlID0gbS5lbGVtZW50cyxcclxuXHJcblx0XHRcdG0xMSA9IHRlWyAwIF0sIG0xMiA9IHRlWyA0IF0sIG0xMyA9IHRlWyA4IF0sXHJcblx0XHRcdG0yMSA9IHRlWyAxIF0sIG0yMiA9IHRlWyA1IF0sIG0yMyA9IHRlWyA5IF0sXHJcblx0XHRcdG0zMSA9IHRlWyAyIF0sIG0zMiA9IHRlWyA2IF0sIG0zMyA9IHRlWyAxMCBdO1xyXG5cclxuXHRcdGlmICggKCBNYXRoLmFicyggbTEyIC0gbTIxICkgPCBlcHNpbG9uICkgJiZcclxuXHRcdCAgICAgKCBNYXRoLmFicyggbTEzIC0gbTMxICkgPCBlcHNpbG9uICkgJiZcclxuXHRcdCAgICAgKCBNYXRoLmFicyggbTIzIC0gbTMyICkgPCBlcHNpbG9uICkgKSB7XHJcblxyXG5cdFx0XHQvLyBzaW5ndWxhcml0eSBmb3VuZFxyXG5cdFx0XHQvLyBmaXJzdCBjaGVjayBmb3IgaWRlbnRpdHkgbWF0cml4IHdoaWNoIG11c3QgaGF2ZSArMSBmb3IgYWxsIHRlcm1zXHJcblx0XHRcdC8vIGluIGxlYWRpbmcgZGlhZ29uYWwgYW5kIHplcm8gaW4gb3RoZXIgdGVybXNcclxuXHJcblx0XHRcdGlmICggKCBNYXRoLmFicyggbTEyICsgbTIxICkgPCBlcHNpbG9uMiApICYmXHJcblx0XHRcdCAgICAgKCBNYXRoLmFicyggbTEzICsgbTMxICkgPCBlcHNpbG9uMiApICYmXHJcblx0XHRcdCAgICAgKCBNYXRoLmFicyggbTIzICsgbTMyICkgPCBlcHNpbG9uMiApICYmXHJcblx0XHRcdCAgICAgKCBNYXRoLmFicyggbTExICsgbTIyICsgbTMzIC0gMyApIDwgZXBzaWxvbjIgKSApIHtcclxuXHJcblx0XHRcdFx0Ly8gdGhpcyBzaW5ndWxhcml0eSBpcyBpZGVudGl0eSBtYXRyaXggc28gYW5nbGUgPSAwXHJcblxyXG5cdFx0XHRcdHRoaXMuc2V0KCAxLCAwLCAwLCAwICk7XHJcblxyXG5cdFx0XHRcdHJldHVybiB0aGlzOyAvLyB6ZXJvIGFuZ2xlLCBhcmJpdHJhcnkgYXhpc1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gb3RoZXJ3aXNlIHRoaXMgc2luZ3VsYXJpdHkgaXMgYW5nbGUgPSAxODBcclxuXHJcblx0XHRcdGFuZ2xlID0gTWF0aC5QSTtcclxuXHJcblx0XHRcdGNvbnN0IHh4ID0gKCBtMTEgKyAxICkgLyAyO1xyXG5cdFx0XHRjb25zdCB5eSA9ICggbTIyICsgMSApIC8gMjtcclxuXHRcdFx0Y29uc3QgenogPSAoIG0zMyArIDEgKSAvIDI7XHJcblx0XHRcdGNvbnN0IHh5ID0gKCBtMTIgKyBtMjEgKSAvIDQ7XHJcblx0XHRcdGNvbnN0IHh6ID0gKCBtMTMgKyBtMzEgKSAvIDQ7XHJcblx0XHRcdGNvbnN0IHl6ID0gKCBtMjMgKyBtMzIgKSAvIDQ7XHJcblxyXG5cdFx0XHRpZiAoICggeHggPiB5eSApICYmICggeHggPiB6eiApICkge1xyXG5cclxuXHRcdFx0XHQvLyBtMTEgaXMgdGhlIGxhcmdlc3QgZGlhZ29uYWwgdGVybVxyXG5cclxuXHRcdFx0XHRpZiAoIHh4IDwgZXBzaWxvbiApIHtcclxuXHJcblx0XHRcdFx0XHR4ID0gMDtcclxuXHRcdFx0XHRcdHkgPSAwLjcwNzEwNjc4MTtcclxuXHRcdFx0XHRcdHogPSAwLjcwNzEwNjc4MTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHR4ID0gTWF0aC5zcXJ0KCB4eCApO1xyXG5cdFx0XHRcdFx0eSA9IHh5IC8geDtcclxuXHRcdFx0XHRcdHogPSB4eiAvIHg7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIHl5ID4genogKSB7XHJcblxyXG5cdFx0XHRcdC8vIG0yMiBpcyB0aGUgbGFyZ2VzdCBkaWFnb25hbCB0ZXJtXHJcblxyXG5cdFx0XHRcdGlmICggeXkgPCBlcHNpbG9uICkge1xyXG5cclxuXHRcdFx0XHRcdHggPSAwLjcwNzEwNjc4MTtcclxuXHRcdFx0XHRcdHkgPSAwO1xyXG5cdFx0XHRcdFx0eiA9IDAuNzA3MTA2NzgxO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdHkgPSBNYXRoLnNxcnQoIHl5ICk7XHJcblx0XHRcdFx0XHR4ID0geHkgLyB5O1xyXG5cdFx0XHRcdFx0eiA9IHl6IC8geTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0Ly8gbTMzIGlzIHRoZSBsYXJnZXN0IGRpYWdvbmFsIHRlcm0gc28gYmFzZSByZXN1bHQgb24gdGhpc1xyXG5cclxuXHRcdFx0XHRpZiAoIHp6IDwgZXBzaWxvbiApIHtcclxuXHJcblx0XHRcdFx0XHR4ID0gMC43MDcxMDY3ODE7XHJcblx0XHRcdFx0XHR5ID0gMC43MDcxMDY3ODE7XHJcblx0XHRcdFx0XHR6ID0gMDtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHR6ID0gTWF0aC5zcXJ0KCB6eiApO1xyXG5cdFx0XHRcdFx0eCA9IHh6IC8gejtcclxuXHRcdFx0XHRcdHkgPSB5eiAvIHo7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuc2V0KCB4LCB5LCB6LCBhbmdsZSApO1xyXG5cclxuXHRcdFx0cmV0dXJuIHRoaXM7IC8vIHJldHVybiAxODAgZGVnIHJvdGF0aW9uXHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGFzIHdlIGhhdmUgcmVhY2hlZCBoZXJlIHRoZXJlIGFyZSBubyBzaW5ndWxhcml0aWVzIHNvIHdlIGNhbiBoYW5kbGUgbm9ybWFsbHlcclxuXHJcblx0XHRsZXQgcyA9IE1hdGguc3FydCggKCBtMzIgLSBtMjMgKSAqICggbTMyIC0gbTIzICkgK1xyXG5cdFx0XHQoIG0xMyAtIG0zMSApICogKCBtMTMgLSBtMzEgKSArXHJcblx0XHRcdCggbTIxIC0gbTEyICkgKiAoIG0yMSAtIG0xMiApICk7IC8vIHVzZWQgdG8gbm9ybWFsaXplXHJcblxyXG5cdFx0aWYgKCBNYXRoLmFicyggcyApIDwgMC4wMDEgKSBzID0gMTtcclxuXHJcblx0XHQvLyBwcmV2ZW50IGRpdmlkZSBieSB6ZXJvLCBzaG91bGQgbm90IGhhcHBlbiBpZiBtYXRyaXggaXMgb3J0aG9nb25hbCBhbmQgc2hvdWxkIGJlXHJcblx0XHQvLyBjYXVnaHQgYnkgc2luZ3VsYXJpdHkgdGVzdCBhYm92ZSwgYnV0IEkndmUgbGVmdCBpdCBpbiBqdXN0IGluIGNhc2VcclxuXHJcblx0XHR0aGlzLnggPSAoIG0zMiAtIG0yMyApIC8gcztcclxuXHRcdHRoaXMueSA9ICggbTEzIC0gbTMxICkgLyBzO1xyXG5cdFx0dGhpcy56ID0gKCBtMjEgLSBtMTIgKSAvIHM7XHJcblx0XHR0aGlzLncgPSBNYXRoLmFjb3MoICggbTExICsgbTIyICsgbTMzIC0gMSApIC8gMiApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHZlY3RvciBjb21wb25lbnRzIHRvIHRoZSBwb3NpdGlvbiBlbGVtZW50cyBvZiB0aGVcclxuXHQgKiBnaXZlbiB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDR9IG0gLSBUaGUgNHg0IG1hdHJpeC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3I0fSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRzZXRGcm9tTWF0cml4UG9zaXRpb24oIG0gKSB7XHJcblxyXG5cdFx0Y29uc3QgZSA9IG0uZWxlbWVudHM7XHJcblxyXG5cdFx0dGhpcy54ID0gZVsgMTIgXTtcclxuXHRcdHRoaXMueSA9IGVbIDEzIF07XHJcblx0XHR0aGlzLnogPSBlWyAxNCBdO1xyXG5cdFx0dGhpcy53ID0gZVsgMTUgXTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJZiB0aGlzIHZlY3RvcidzIHgsIHksIHogb3IgdyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIGdpdmVuIHZlY3RvcidzIHgsIHksIHogb3Igd1xyXG5cdCAqIHZhbHVlLCByZXBsYWNlIHRoYXQgdmFsdWUgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBtaW4gdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjR9IHYgLSBUaGUgdmVjdG9yLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdG1pbiggdiApIHtcclxuXHJcblx0XHR0aGlzLnggPSBNYXRoLm1pbiggdGhpcy54LCB2LnggKTtcclxuXHRcdHRoaXMueSA9IE1hdGgubWluKCB0aGlzLnksIHYueSApO1xyXG5cdFx0dGhpcy56ID0gTWF0aC5taW4oIHRoaXMueiwgdi56ICk7XHJcblx0XHR0aGlzLncgPSBNYXRoLm1pbiggdGhpcy53LCB2LncgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJZiB0aGlzIHZlY3RvcidzIHgsIHksIHogb3IgdyB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIGdpdmVuIHZlY3RvcidzIHgsIHksIHogb3Igd1xyXG5cdCAqIHZhbHVlLCByZXBsYWNlIHRoYXQgdmFsdWUgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBtYXggdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjR9IHYgLSBUaGUgdmVjdG9yLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdG1heCggdiApIHtcclxuXHJcblx0XHR0aGlzLnggPSBNYXRoLm1heCggdGhpcy54LCB2LnggKTtcclxuXHRcdHRoaXMueSA9IE1hdGgubWF4KCB0aGlzLnksIHYueSApO1xyXG5cdFx0dGhpcy56ID0gTWF0aC5tYXgoIHRoaXMueiwgdi56ICk7XHJcblx0XHR0aGlzLncgPSBNYXRoLm1heCggdGhpcy53LCB2LncgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJZiB0aGlzIHZlY3RvcidzIHgsIHksIHogb3IgdyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIG1heCB2ZWN0b3IncyB4LCB5LCB6IG9yIHdcclxuXHQgKiB2YWx1ZSwgaXQgaXMgcmVwbGFjZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUuXHJcblx0ICogSWYgdGhpcyB2ZWN0b3IncyB4LCB5LCB6IG9yIHcgdmFsdWUgaXMgbGVzcyB0aGFuIHRoZSBtaW4gdmVjdG9yJ3MgeCwgeSwgeiBvciB3IHZhbHVlLFxyXG5cdCAqIGl0IGlzIHJlcGxhY2VkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3I0fSBtaW4gLSBUaGUgbWluaW11bSB4LCB5IGFuZCB6IHZhbHVlcy5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjR9IG1heCAtIFRoZSBtYXhpbXVtIHgsIHkgYW5kIHogdmFsdWVzIGluIHRoZSBkZXNpcmVkIHJhbmdlLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGNsYW1wKCBtaW4sIG1heCApIHtcclxuXHJcblx0XHQvLyBhc3N1bWVzIG1pbiA8IG1heCwgY29tcG9uZW50d2lzZVxyXG5cclxuXHRcdHRoaXMueCA9IGNsYW1wKCB0aGlzLngsIG1pbi54LCBtYXgueCApO1xyXG5cdFx0dGhpcy55ID0gY2xhbXAoIHRoaXMueSwgbWluLnksIG1heC55ICk7XHJcblx0XHR0aGlzLnogPSBjbGFtcCggdGhpcy56LCBtaW4ueiwgbWF4LnogKTtcclxuXHRcdHRoaXMudyA9IGNsYW1wKCB0aGlzLncsIG1pbi53LCBtYXgudyApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIElmIHRoaXMgdmVjdG9yJ3MgeCwgeSwgeiBvciB3IHZhbHVlcyBhcmUgZ3JlYXRlciB0aGFuIHRoZSBtYXggdmFsdWUsIHRoZXkgYXJlXHJcblx0ICogcmVwbGFjZWQgYnkgdGhlIG1heCB2YWx1ZS5cclxuXHQgKiBJZiB0aGlzIHZlY3RvcidzIHgsIHksIHogb3IgdyB2YWx1ZXMgYXJlIGxlc3MgdGhhbiB0aGUgbWluIHZhbHVlLCB0aGV5IGFyZVxyXG5cdCAqIHJlcGxhY2VkIGJ5IHRoZSBtaW4gdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbWluVmFsIC0gVGhlIG1pbmltdW0gdmFsdWUgdGhlIGNvbXBvbmVudHMgd2lsbCBiZSBjbGFtcGVkIHRvLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBtYXhWYWwgLSBUaGUgbWF4aW11bSB2YWx1ZSB0aGUgY29tcG9uZW50cyB3aWxsIGJlIGNsYW1wZWQgdG8uXHJcblx0ICogQHJldHVybiB7VmVjdG9yNH0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0Y2xhbXBTY2FsYXIoIG1pblZhbCwgbWF4VmFsICkge1xyXG5cclxuXHRcdHRoaXMueCA9IGNsYW1wKCB0aGlzLngsIG1pblZhbCwgbWF4VmFsICk7XHJcblx0XHR0aGlzLnkgPSBjbGFtcCggdGhpcy55LCBtaW5WYWwsIG1heFZhbCApO1xyXG5cdFx0dGhpcy56ID0gY2xhbXAoIHRoaXMueiwgbWluVmFsLCBtYXhWYWwgKTtcclxuXHRcdHRoaXMudyA9IGNsYW1wKCB0aGlzLncsIG1pblZhbCwgbWF4VmFsICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSWYgdGhpcyB2ZWN0b3IncyBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIHRoZSBtYXggdmFsdWUsIGl0IGlzIHJlcGxhY2VkIGJ5XHJcblx0ICogdGhlIG1heCB2YWx1ZS5cclxuXHQgKiBJZiB0aGlzIHZlY3RvcidzIGxlbmd0aCBpcyBsZXNzIHRoYW4gdGhlIG1pbiB2YWx1ZSwgaXQgaXMgcmVwbGFjZWQgYnkgdGhlXHJcblx0ICogbWluIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IG1pbiAtIFRoZSBtaW5pbXVtIHZhbHVlIHRoZSB2ZWN0b3IgbGVuZ3RoIHdpbGwgYmUgY2xhbXBlZCB0by5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbWF4IC0gVGhlIG1heGltdW0gdmFsdWUgdGhlIHZlY3RvciBsZW5ndGggd2lsbCBiZSBjbGFtcGVkIHRvLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGNsYW1wTGVuZ3RoKCBtaW4sIG1heCApIHtcclxuXHJcblx0XHRjb25zdCBsZW5ndGggPSB0aGlzLmxlbmd0aCgpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmRpdmlkZVNjYWxhciggbGVuZ3RoIHx8IDEgKS5tdWx0aXBseVNjYWxhciggY2xhbXAoIGxlbmd0aCwgbWluLCBtYXggKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBjb21wb25lbnRzIG9mIHRoaXMgdmVjdG9yIGFyZSByb3VuZGVkIGRvd24gdG8gdGhlIG5lYXJlc3QgaW50ZWdlciB2YWx1ZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGZsb29yKCkge1xyXG5cclxuXHRcdHRoaXMueCA9IE1hdGguZmxvb3IoIHRoaXMueCApO1xyXG5cdFx0dGhpcy55ID0gTWF0aC5mbG9vciggdGhpcy55ICk7XHJcblx0XHR0aGlzLnogPSBNYXRoLmZsb29yKCB0aGlzLnogKTtcclxuXHRcdHRoaXMudyA9IE1hdGguZmxvb3IoIHRoaXMudyApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBjb21wb25lbnRzIG9mIHRoaXMgdmVjdG9yIGFyZSByb3VuZGVkIHVwIHRvIHRoZSBuZWFyZXN0IGludGVnZXIgdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtWZWN0b3I0fSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRjZWlsKCkge1xyXG5cclxuXHRcdHRoaXMueCA9IE1hdGguY2VpbCggdGhpcy54ICk7XHJcblx0XHR0aGlzLnkgPSBNYXRoLmNlaWwoIHRoaXMueSApO1xyXG5cdFx0dGhpcy56ID0gTWF0aC5jZWlsKCB0aGlzLnogKTtcclxuXHRcdHRoaXMudyA9IE1hdGguY2VpbCggdGhpcy53ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGNvbXBvbmVudHMgb2YgdGhpcyB2ZWN0b3IgYXJlIHJvdW5kZWQgdG8gdGhlIG5lYXJlc3QgaW50ZWdlciB2YWx1ZVxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7VmVjdG9yNH0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0cm91bmQoKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gTWF0aC5yb3VuZCggdGhpcy54ICk7XHJcblx0XHR0aGlzLnkgPSBNYXRoLnJvdW5kKCB0aGlzLnkgKTtcclxuXHRcdHRoaXMueiA9IE1hdGgucm91bmQoIHRoaXMueiApO1xyXG5cdFx0dGhpcy53ID0gTWF0aC5yb3VuZCggdGhpcy53ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGNvbXBvbmVudHMgb2YgdGhpcyB2ZWN0b3IgYXJlIHJvdW5kZWQgdG93YXJkcyB6ZXJvICh1cCBpZiBuZWdhdGl2ZSxcclxuXHQgKiBkb3duIGlmIHBvc2l0aXZlKSB0byBhbiBpbnRlZ2VyIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7VmVjdG9yNH0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0cm91bmRUb1plcm8oKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gTWF0aC50cnVuYyggdGhpcy54ICk7XHJcblx0XHR0aGlzLnkgPSBNYXRoLnRydW5jKCB0aGlzLnkgKTtcclxuXHRcdHRoaXMueiA9IE1hdGgudHJ1bmMoIHRoaXMueiApO1xyXG5cdFx0dGhpcy53ID0gTWF0aC50cnVuYyggdGhpcy53ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW52ZXJ0cyB0aGlzIHZlY3RvciAtIGkuZS4gc2V0cyB4ID0gLXgsIHkgPSAteSwgeiA9IC16LCB3ID0gLXcuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtWZWN0b3I0fSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRuZWdhdGUoKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gLSB0aGlzLng7XHJcblx0XHR0aGlzLnkgPSAtIHRoaXMueTtcclxuXHRcdHRoaXMueiA9IC0gdGhpcy56O1xyXG5cdFx0dGhpcy53ID0gLSB0aGlzLnc7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2FsY3VsYXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdGhlIGdpdmVuIHZlY3RvciB3aXRoIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjR9IHYgLSBUaGUgdmVjdG9yIHRvIGNvbXB1dGUgdGhlIGRvdCBwcm9kdWN0IHdpdGguXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgcmVzdWx0IG9mIHRoZSBkb3QgcHJvZHVjdC5cclxuXHQgKi9cclxuXHRkb3QoIHYgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMueCAqIHYueCArIHRoaXMueSAqIHYueSArIHRoaXMueiAqIHYueiArIHRoaXMudyAqIHYudztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB0aGUgc3F1YXJlIG9mIHRoZSBFdWNsaWRlYW4gbGVuZ3RoIChzdHJhaWdodC1saW5lIGxlbmd0aCkgZnJvbVxyXG5cdCAqICgwLCAwLCAwLCAwKSB0byAoeCwgeSwgeiwgdykuIElmIHlvdSBhcmUgY29tcGFyaW5nIHRoZSBsZW5ndGhzIG9mIHZlY3RvcnMsIHlvdSBzaG91bGRcclxuXHQgKiBjb21wYXJlIHRoZSBsZW5ndGggc3F1YXJlZCBpbnN0ZWFkIGFzIGl0IGlzIHNsaWdodGx5IG1vcmUgZWZmaWNpZW50IHRvIGNhbGN1bGF0ZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIHNxdWFyZSBsZW5ndGggb2YgdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0bGVuZ3RoU3EoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueSArIHRoaXMueiAqIHRoaXMueiArIHRoaXMudyAqIHRoaXMudztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB0aGUgIEV1Y2xpZGVhbiBsZW5ndGggKHN0cmFpZ2h0LWxpbmUgbGVuZ3RoKSBmcm9tICgwLCAwLCAwLCAwKSB0byAoeCwgeSwgeiwgdykuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBsZW5ndGggb2YgdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0bGVuZ3RoKCkge1xyXG5cclxuXHRcdHJldHVybiBNYXRoLnNxcnQoIHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueSArIHRoaXMueiAqIHRoaXMueiArIHRoaXMudyAqIHRoaXMudyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSBNYW5oYXR0YW4gbGVuZ3RoIG9mIHRoaXMgdmVjdG9yLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgbGVuZ3RoIG9mIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdG1hbmhhdHRhbkxlbmd0aCgpIHtcclxuXHJcblx0XHRyZXR1cm4gTWF0aC5hYnMoIHRoaXMueCApICsgTWF0aC5hYnMoIHRoaXMueSApICsgTWF0aC5hYnMoIHRoaXMueiApICsgTWF0aC5hYnMoIHRoaXMudyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnZlcnRzIHRoaXMgdmVjdG9yIHRvIGEgdW5pdCB2ZWN0b3IgLSB0aGF0IGlzLCBzZXRzIGl0IGVxdWFsIHRvIGEgdmVjdG9yXHJcblx0ICogd2l0aCB0aGUgc2FtZSBkaXJlY3Rpb24gYXMgdGhpcyBvbmUsIGJ1dCB3aXRoIGEgdmVjdG9yIGxlbmd0aCBvZiBgMWAuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtWZWN0b3I0fSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRub3JtYWxpemUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKCB0aGlzLmxlbmd0aCgpIHx8IDEgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoaXMgdmVjdG9yIHRvIGEgdmVjdG9yIHdpdGggdGhlIHNhbWUgZGlyZWN0aW9uIGFzIHRoaXMgb25lLCBidXRcclxuXHQgKiB3aXRoIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCAtIFRoZSBuZXcgbGVuZ3RoIG9mIHRoaXMgdmVjdG9yLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHNldExlbmd0aCggbGVuZ3RoICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKCBsZW5ndGggKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBMaW5lYXJseSBpbnRlcnBvbGF0ZXMgYmV0d2VlbiB0aGUgZ2l2ZW4gdmVjdG9yIGFuZCB0aGlzIGluc3RhbmNlLCB3aGVyZVxyXG5cdCAqIGFscGhhIGlzIHRoZSBwZXJjZW50IGRpc3RhbmNlIGFsb25nIHRoZSBsaW5lIC0gYWxwaGEgPSAwIHdpbGwgYmUgdGhpc1xyXG5cdCAqIHZlY3RvciwgYW5kIGFscGhhID0gMSB3aWxsIGJlIHRoZSBnaXZlbiBvbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjR9IHYgLSBUaGUgdmVjdG9yIHRvIGludGVycG9sYXRlIHRvd2FyZHMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFscGhhIC0gVGhlIGludGVycG9sYXRpb24gZmFjdG9yLCB0eXBpY2FsbHkgaW4gdGhlIGNsb3NlZCBpbnRlcnZhbCBgWzAsIDFdYC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3I0fSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRsZXJwKCB2LCBhbHBoYSApIHtcclxuXHJcblx0XHR0aGlzLnggKz0gKCB2LnggLSB0aGlzLnggKSAqIGFscGhhO1xyXG5cdFx0dGhpcy55ICs9ICggdi55IC0gdGhpcy55ICkgKiBhbHBoYTtcclxuXHRcdHRoaXMueiArPSAoIHYueiAtIHRoaXMueiApICogYWxwaGE7XHJcblx0XHR0aGlzLncgKz0gKCB2LncgLSB0aGlzLncgKSAqIGFscGhhO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIExpbmVhcmx5IGludGVycG9sYXRlcyBiZXR3ZWVuIHRoZSBnaXZlbiB2ZWN0b3JzLCB3aGVyZSBhbHBoYSBpcyB0aGUgcGVyY2VudFxyXG5cdCAqIGRpc3RhbmNlIGFsb25nIHRoZSBsaW5lIC0gYWxwaGEgPSAwIHdpbGwgYmUgZmlyc3QgdmVjdG9yLCBhbmQgYWxwaGEgPSAxIHdpbGxcclxuXHQgKiBiZSB0aGUgc2Vjb25kIG9uZS4gVGhlIHJlc3VsdCBpcyBzdG9yZWQgaW4gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yNH0gdjEgLSBUaGUgZmlyc3QgdmVjdG9yLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yNH0gdjIgLSBUaGUgc2Vjb25kIHZlY3Rvci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYWxwaGEgLSBUaGUgaW50ZXJwb2xhdGlvbiBmYWN0b3IsIHR5cGljYWxseSBpbiB0aGUgY2xvc2VkIGludGVydmFsIGBbMCwgMV1gLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGxlcnBWZWN0b3JzKCB2MSwgdjIsIGFscGhhICkge1xyXG5cclxuXHRcdHRoaXMueCA9IHYxLnggKyAoIHYyLnggLSB2MS54ICkgKiBhbHBoYTtcclxuXHRcdHRoaXMueSA9IHYxLnkgKyAoIHYyLnkgLSB2MS55ICkgKiBhbHBoYTtcclxuXHRcdHRoaXMueiA9IHYxLnogKyAoIHYyLnogLSB2MS56ICkgKiBhbHBoYTtcclxuXHRcdHRoaXMudyA9IHYxLncgKyAoIHYyLncgLSB2MS53ICkgKiBhbHBoYTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIHZlY3RvciBpcyBlcXVhbCB3aXRoIHRoZSBnaXZlbiBvbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjR9IHYgLSBUaGUgdmVjdG9yIHRvIHRlc3QgZm9yIGVxdWFsaXR5LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyB2ZWN0b3IgaXMgZXF1YWwgd2l0aCB0aGUgZ2l2ZW4gb25lLlxyXG5cdCAqL1xyXG5cdGVxdWFscyggdiApIHtcclxuXHJcblx0XHRyZXR1cm4gKCAoIHYueCA9PT0gdGhpcy54ICkgJiYgKCB2LnkgPT09IHRoaXMueSApICYmICggdi56ID09PSB0aGlzLnogKSAmJiAoIHYudyA9PT0gdGhpcy53ICkgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoaXMgdmVjdG9yJ3MgeCB2YWx1ZSB0byBiZSBgYXJyYXlbIG9mZnNldCBdYCwgeSB2YWx1ZSB0byBiZSBgYXJyYXlbIG9mZnNldCArIDEgXWAsXHJcblx0ICogeiB2YWx1ZSB0byBiZSBgYXJyYXlbIG9mZnNldCArIDIgXWAsIHcgdmFsdWUgdG8gYmUgYGFycmF5WyBvZmZzZXQgKyAzIF1gLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBhcnJheSAtIEFuIGFycmF5IGhvbGRpbmcgdGhlIHZlY3RvciBjb21wb25lbnQgdmFsdWVzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0PTBdIC0gVGhlIG9mZnNldCBpbnRvIHRoZSBhcnJheS5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3I0fSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRmcm9tQXJyYXkoIGFycmF5LCBvZmZzZXQgPSAwICkge1xyXG5cclxuXHRcdHRoaXMueCA9IGFycmF5WyBvZmZzZXQgXTtcclxuXHRcdHRoaXMueSA9IGFycmF5WyBvZmZzZXQgKyAxIF07XHJcblx0XHR0aGlzLnogPSBhcnJheVsgb2Zmc2V0ICsgMiBdO1xyXG5cdFx0dGhpcy53ID0gYXJyYXlbIG9mZnNldCArIDMgXTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBXcml0ZXMgdGhlIGNvbXBvbmVudHMgb2YgdGhpcyB2ZWN0b3IgdG8gdGhlIGdpdmVuIGFycmF5LiBJZiBubyBhcnJheSBpcyBwcm92aWRlZCxcclxuXHQgKiB0aGUgbWV0aG9kIHJldHVybnMgYSBuZXcgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IFthcnJheT1bXV0gLSBUaGUgdGFyZ2V0IGFycmF5IGhvbGRpbmcgdGhlIHZlY3RvciBjb21wb25lbnRzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0PTBdIC0gSW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGFycmF5LlxyXG5cdCAqIEByZXR1cm4ge0FycmF5PG51bWJlcj59IFRoZSB2ZWN0b3IgY29tcG9uZW50cy5cclxuXHQgKi9cclxuXHR0b0FycmF5KCBhcnJheSA9IFtdLCBvZmZzZXQgPSAwICkge1xyXG5cclxuXHRcdGFycmF5WyBvZmZzZXQgXSA9IHRoaXMueDtcclxuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLnk7XHJcblx0XHRhcnJheVsgb2Zmc2V0ICsgMiBdID0gdGhpcy56O1xyXG5cdFx0YXJyYXlbIG9mZnNldCArIDMgXSA9IHRoaXMudztcclxuXHJcblx0XHRyZXR1cm4gYXJyYXk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgY29tcG9uZW50cyBvZiB0aGlzIHZlY3RvciBmcm9tIHRoZSBnaXZlbiBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCdWZmZXJBdHRyaWJ1dGV9IGF0dHJpYnV0ZSAtIFRoZSBidWZmZXIgYXR0cmlidXRlIGhvbGRpbmcgdmVjdG9yIGRhdGEuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluZGV4IGludG8gdGhlIGF0dHJpYnV0ZS5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3I0fSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRmcm9tQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGluZGV4ICkge1xyXG5cclxuXHRcdHRoaXMueCA9IGF0dHJpYnV0ZS5nZXRYKCBpbmRleCApO1xyXG5cdFx0dGhpcy55ID0gYXR0cmlidXRlLmdldFkoIGluZGV4ICk7XHJcblx0XHR0aGlzLnogPSBhdHRyaWJ1dGUuZ2V0WiggaW5kZXggKTtcclxuXHRcdHRoaXMudyA9IGF0dHJpYnV0ZS5nZXRXKCBpbmRleCApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgZWFjaCBjb21wb25lbnQgb2YgdGhpcyB2ZWN0b3IgdG8gYSBwc2V1ZG8tcmFuZG9tIHZhbHVlIGJldHdlZW4gYDBgIGFuZFxyXG5cdCAqIGAxYCwgZXhjbHVkaW5nIGAxYC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHJhbmRvbSgpIHtcclxuXHJcblx0XHR0aGlzLnggPSBNYXRoLnJhbmRvbSgpO1xyXG5cdFx0dGhpcy55ID0gTWF0aC5yYW5kb20oKTtcclxuXHRcdHRoaXMueiA9IE1hdGgucmFuZG9tKCk7XHJcblx0XHR0aGlzLncgPSBNYXRoLnJhbmRvbSgpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdCpbIFN5bWJvbC5pdGVyYXRvciBdKCkge1xyXG5cclxuXHRcdHlpZWxkIHRoaXMueDtcclxuXHRcdHlpZWxkIHRoaXMueTtcclxuXHRcdHlpZWxkIHRoaXMuejtcclxuXHRcdHlpZWxkIHRoaXMudztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgVmVjdG9yNCB9O1xyXG4iLCJpbXBvcnQgeyBFdmVudERpc3BhdGNoZXIgfSBmcm9tICcuL0V2ZW50RGlzcGF0Y2hlci5qcyc7XHJcbmltcG9ydCB7IFRleHR1cmUgfSBmcm9tICcuLi90ZXh0dXJlcy9UZXh0dXJlLmpzJztcclxuaW1wb3J0IHsgTGluZWFyRmlsdGVyIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yNCB9IGZyb20gJy4uL21hdGgvVmVjdG9yNC5qcyc7XHJcbmltcG9ydCB7IFNvdXJjZSB9IGZyb20gJy4uL3RleHR1cmVzL1NvdXJjZS5qcyc7XHJcblxyXG4vKipcclxuICogQSByZW5kZXIgdGFyZ2V0IGlzIGEgYnVmZmVyIHdoZXJlIHRoZSB2aWRlbyBjYXJkIGRyYXdzIHBpeGVscyBmb3IgYSBzY2VuZVxyXG4gKiB0aGF0IGlzIGJlaW5nIHJlbmRlcmVkIGluIHRoZSBiYWNrZ3JvdW5kLiBJdCBpcyB1c2VkIGluIGRpZmZlcmVudCBlZmZlY3RzLFxyXG4gKiBzdWNoIGFzIGFwcGx5aW5nIHBvc3Rwcm9jZXNzaW5nIHRvIGEgcmVuZGVyZWQgaW1hZ2UgYmVmb3JlIGRpc3BsYXlpbmcgaXRcclxuICogb24gdGhlIHNjcmVlbi5cclxuICpcclxuICogQGF1Z21lbnRzIEV2ZW50RGlzcGF0Y2hlclxyXG4gKi9cclxuY2xhc3MgUmVuZGVyVGFyZ2V0IGV4dGVuZHMgRXZlbnREaXNwYXRjaGVyIHtcclxuXHJcblx0LyoqXHJcblx0ICogUmVuZGVyIHRhcmdldCBvcHRpb25zLlxyXG5cdCAqXHJcblx0ICogQHR5cGVkZWYge09iamVjdH0gUmVuZGVyVGFyZ2V0fk9wdGlvbnNcclxuXHQgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtnZW5lcmF0ZU1pcG1hcHM9ZmFsc2VdIC0gV2hldGhlciB0byBnZW5lcmF0ZSBtaXBtYXBzIG9yIG5vdC5cclxuXHQgKiBAcHJvcGVydHkge251bWJlcn0gW21hZ0ZpbHRlcj1MaW5lYXJGaWx0ZXJdIC0gVGhlIG1hZyBmaWx0ZXIuXHJcblx0ICogQHByb3BlcnR5IHtudW1iZXJ9IFttaW5GaWx0ZXI9TGluZWFyRmlsdGVyXSAtIFRoZSBtaW4gZmlsdGVyLlxyXG5cdCAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZm9ybWF0PVJHQkFGb3JtYXRdIC0gVGhlIHRleHR1cmUgZm9ybWF0LlxyXG5cdCAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdHlwZT1VbnNpZ25lZEJ5dGVUeXBlXSAtIFRoZSB0ZXh0dXJlIHR5cGUuXHJcblx0ICogQHByb3BlcnR5IHs/c3RyaW5nfSBbaW50ZXJuYWxGb3JtYXQ9bnVsbF0gLSBUaGUgdGV4dHVyZSdzIGludGVybmFsIGZvcm1hdC5cclxuXHQgKiBAcHJvcGVydHkge251bWJlcn0gW3dyYXBTPUNsYW1wVG9FZGdlV3JhcHBpbmddIC0gVGhlIHRleHR1cmUncyB1diB3cmFwcGluZyBtb2RlLlxyXG5cdCAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbd3JhcFQ9Q2xhbXBUb0VkZ2VXcmFwcGluZ10gLSBUaGUgdGV4dHVyZSdzIHV2IHdyYXBwaW5nIG1vZGUuXHJcblx0ICogQHByb3BlcnR5IHtudW1iZXJ9IFthbmlzb3Ryb3B5PTFdIC0gVGhlIHRleHR1cmUncyBhbmlzb3Ryb3B5IHZhbHVlLlxyXG5cdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY29sb3JTcGFjZT1Ob0NvbG9yU3BhY2VdIC0gVGhlIHRleHR1cmUncyBjb2xvciBzcGFjZS5cclxuXHQgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtkZXB0aEJ1ZmZlcj10cnVlXSAtIFdoZXRoZXIgdG8gYWxsb2NhdGUgYSBkZXB0aCBidWZmZXIgb3Igbm90LlxyXG5cdCAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3N0ZW5jaWxCdWZmZXI9ZmFsc2VdIC0gV2hldGhlciB0byBhbGxvY2F0ZSBhIHN0ZW5jaWwgYnVmZmVyIG9yIG5vdC5cclxuXHQgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtyZXNvbHZlRGVwdGhCdWZmZXI9dHJ1ZV0gLSBXaGV0aGVyIHRvIHJlc29sdmUgdGhlIGRlcHRoIGJ1ZmZlciBvciBub3QuXHJcblx0ICogQHByb3BlcnR5IHtib29sZWFufSBbcmVzb2x2ZVN0ZW5jaWxCdWZmZXI9dHJ1ZV0gLSBXaGV0aGVyICB0byByZXNvbHZlIHRoZSBzdGVuY2lsIGJ1ZmZlciBvciBub3QuXHJcblx0ICogQHByb3BlcnR5IHs/VGV4dHVyZX0gW2RlcHRoVGV4dHVyZT1udWxsXSAtIFJlZmVyZW5jZSB0byBhIGRlcHRoIHRleHR1cmUuXHJcblx0ICogQHByb3BlcnR5IHtudW1iZXJ9IFtzYW1wbGVzPTBdIC0gVGhlIE1TQUEgc2FtcGxlcyBjb3VudC5cclxuXHQgKiBAcHJvcGVydHkge251bWJlcn0gW2NvdW50PTFdIC0gRGVmaW5lcyB0aGUgbnVtYmVyIG9mIGNvbG9yIGF0dGFjaG1lbnRzIC4gTXVzdCBiZSBhdCBsZWFzdCBgMWAuXHJcblx0ICovXHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcmVuZGVyIHRhcmdldC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbd2lkdGg9MV0gLSBUaGUgd2lkdGggb2YgdGhlIHJlbmRlciB0YXJnZXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtoZWlnaHQ9MV0gLSBUaGUgaGVpZ2h0IG9mIHRoZSByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyVGFyZ2V0fk9wdGlvbnN9IFtvcHRpb25zXSAtIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggd2lkdGggPSAxLCBoZWlnaHQgPSAxLCBvcHRpb25zID0ge30gKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNSZW5kZXJUYXJnZXQgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHdpZHRoIG9mIHRoZSByZW5kZXIgdGFyZ2V0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMud2lkdGggPSB3aWR0aDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBoZWlnaHQgb2YgdGhlIHJlbmRlciB0YXJnZXQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5oZWlnaHQgPSBoZWlnaHQ7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZGVwdGggb2YgdGhlIHJlbmRlciB0YXJnZXQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kZXB0aCA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlY3Rhbmd1bGFyIGFyZWEgaW5zaWRlIHRoZSByZW5kZXIgdGFyZ2V0J3Mgdmlld3BvcnQuIEZyYWdtZW50cyB0aGF0IGFyZVxyXG5cdFx0ICogb3V0c2lkZSB0aGUgYXJlYSB3aWxsIGJlIGRpc2NhcmRlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yNH1cclxuXHRcdCAqIEBkZWZhdWx0ICgwLDAsd2lkdGgsaGVpZ2h0KVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNjaXNzb3IgPSBuZXcgVmVjdG9yNCggMCwgMCwgd2lkdGgsIGhlaWdodCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNjaXNzb3IgdGVzdCBzaG91bGQgYmUgZW5hYmxlZCB3aGVuIHJlbmRlcmluZyBpbnRvXHJcblx0XHQgKiB0aGlzIHJlbmRlciB0YXJnZXQgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zY2lzc29yVGVzdCA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWN0YW5ndWxhciBhcmVhIHJlcHJlc2VudGluZyB0aGUgcmVuZGVyIHRhcmdldCdzIHZpZXdwb3J0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3I0fVxyXG5cdFx0ICogQGRlZmF1bHQgKDAsMCx3aWR0aCxoZWlnaHQpXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudmlld3BvcnQgPSBuZXcgVmVjdG9yNCggMCwgMCwgd2lkdGgsIGhlaWdodCApO1xyXG5cclxuXHRcdGNvbnN0IGltYWdlID0geyB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0LCBkZXB0aDogMSB9O1xyXG5cclxuXHRcdG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKCB7XHJcblx0XHRcdGdlbmVyYXRlTWlwbWFwczogZmFsc2UsXHJcblx0XHRcdGludGVybmFsRm9ybWF0OiBudWxsLFxyXG5cdFx0XHRtaW5GaWx0ZXI6IExpbmVhckZpbHRlcixcclxuXHRcdFx0ZGVwdGhCdWZmZXI6IHRydWUsXHJcblx0XHRcdHN0ZW5jaWxCdWZmZXI6IGZhbHNlLFxyXG5cdFx0XHRyZXNvbHZlRGVwdGhCdWZmZXI6IHRydWUsXHJcblx0XHRcdHJlc29sdmVTdGVuY2lsQnVmZmVyOiB0cnVlLFxyXG5cdFx0XHRkZXB0aFRleHR1cmU6IG51bGwsXHJcblx0XHRcdHNhbXBsZXM6IDAsXHJcblx0XHRcdGNvdW50OiAxXHJcblx0XHR9LCBvcHRpb25zICk7XHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZSA9IG5ldyBUZXh0dXJlKCBpbWFnZSwgb3B0aW9ucy5tYXBwaW5nLCBvcHRpb25zLndyYXBTLCBvcHRpb25zLndyYXBULCBvcHRpb25zLm1hZ0ZpbHRlciwgb3B0aW9ucy5taW5GaWx0ZXIsIG9wdGlvbnMuZm9ybWF0LCBvcHRpb25zLnR5cGUsIG9wdGlvbnMuYW5pc290cm9weSwgb3B0aW9ucy5jb2xvclNwYWNlICk7XHJcblxyXG5cdFx0dGV4dHVyZS5mbGlwWSA9IGZhbHNlO1xyXG5cdFx0dGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBvcHRpb25zLmdlbmVyYXRlTWlwbWFwcztcclxuXHRcdHRleHR1cmUuaW50ZXJuYWxGb3JtYXQgPSBvcHRpb25zLmludGVybmFsRm9ybWF0O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQW4gYXJyYXkgb2YgdGV4dHVyZXMuIEVhY2ggY29sb3IgYXR0YWNobWVudCBpcyByZXByZXNlbnRlZCBhcyBhIHNlcGFyYXRlIHRleHR1cmUuXHJcblx0XHQgKiBIYXMgYXQgbGVhc3QgYSBzaW5nbGUgZW50cnkgZm9yIHRoZSBkZWZhdWx0IGNvbG9yIGF0dGFjaG1lbnQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PFRleHR1cmU+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRleHR1cmVzID0gW107XHJcblxyXG5cdFx0Y29uc3QgY291bnQgPSBvcHRpb25zLmNvdW50O1xyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgY291bnQ7IGkgKysgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnRleHR1cmVzWyBpIF0gPSB0ZXh0dXJlLmNsb25lKCk7XHJcblx0XHRcdHRoaXMudGV4dHVyZXNbIGkgXS5pc1JlbmRlclRhcmdldFRleHR1cmUgPSB0cnVlO1xyXG5cdFx0XHR0aGlzLnRleHR1cmVzWyBpIF0ucmVuZGVyVGFyZ2V0ID0gdGhpcztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRvIGFsbG9jYXRlIGEgZGVwdGggYnVmZmVyIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kZXB0aEJ1ZmZlciA9IG9wdGlvbnMuZGVwdGhCdWZmZXI7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRvIGFsbG9jYXRlIGEgc3RlbmNpbCBidWZmZXIgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zdGVuY2lsQnVmZmVyID0gb3B0aW9ucy5zdGVuY2lsQnVmZmVyO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0byByZXNvbHZlIHRoZSBkZXB0aCBidWZmZXIgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJlc29sdmVEZXB0aEJ1ZmZlciA9IG9wdGlvbnMucmVzb2x2ZURlcHRoQnVmZmVyO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0byByZXNvbHZlIHRoZSBzdGVuY2lsIGJ1ZmZlciBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVzb2x2ZVN0ZW5jaWxCdWZmZXIgPSBvcHRpb25zLnJlc29sdmVTdGVuY2lsQnVmZmVyO1xyXG5cclxuXHRcdHRoaXMuX2RlcHRoVGV4dHVyZSA9IG9wdGlvbnMuZGVwdGhUZXh0dXJlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG51bWJlciBvZiBNU0FBIHNhbXBsZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQSB2YWx1ZSBvZiBgMGAgZGlzYWJsZXMgTVNBQS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNhbXBsZXMgPSBvcHRpb25zLnNhbXBsZXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIHRleHR1cmUgcmVwcmVzZW50aW5nIHRoZSBkZWZhdWx0IGNvbG9yIGF0dGFjaG1lbnQuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7VGV4dHVyZX1cclxuXHQgKi9cclxuXHRnZXQgdGV4dHVyZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlc1sgMCBdO1xyXG5cclxuXHR9XHJcblxyXG5cdHNldCB0ZXh0dXJlKCB2YWx1ZSApIHtcclxuXHJcblx0XHR0aGlzLnRleHR1cmVzWyAwIF0gPSB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHRzZXQgZGVwdGhUZXh0dXJlKCBjdXJyZW50ICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5fZGVwdGhUZXh0dXJlICE9PSBudWxsICkgdGhpcy5fZGVwdGhUZXh0dXJlLnJlbmRlclRhcmdldCA9IG51bGw7XHJcblx0XHRpZiAoIGN1cnJlbnQgIT09IG51bGwgKSBjdXJyZW50LnJlbmRlclRhcmdldCA9IHRoaXM7XHJcblxyXG5cdFx0dGhpcy5fZGVwdGhUZXh0dXJlID0gY3VycmVudDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJbnN0ZWFkIG9mIHNhdmluZyB0aGUgZGVwdGggaW4gYSByZW5kZXJidWZmZXIsIGEgdGV4dHVyZVxyXG5cdCAqIGNhbiBiZSB1c2VkIGluc3RlYWQgd2hpY2ggaXMgdXNlZnVsIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmdcclxuXHQgKiBlLmcuIGluIGNvbnRleHQgb2YgcG9zdC1wcm9jZXNzaW5nLlxyXG5cdCAqXHJcblx0ICogQHR5cGUgez9EZXB0aFRleHR1cmV9XHJcblx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdCAqL1xyXG5cdGdldCBkZXB0aFRleHR1cmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX2RlcHRoVGV4dHVyZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBzaXplIG9mIHRoaXMgcmVuZGVyIHRhcmdldC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2RlcHRoPTFdIC0gVGhlIGRlcHRoLlxyXG5cdCAqL1xyXG5cdHNldFNpemUoIHdpZHRoLCBoZWlnaHQsIGRlcHRoID0gMSApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMud2lkdGggIT09IHdpZHRoIHx8IHRoaXMuaGVpZ2h0ICE9PSBoZWlnaHQgfHwgdGhpcy5kZXB0aCAhPT0gZGVwdGggKSB7XHJcblxyXG5cdFx0XHR0aGlzLndpZHRoID0gd2lkdGg7XHJcblx0XHRcdHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xyXG5cdFx0XHR0aGlzLmRlcHRoID0gZGVwdGg7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gdGhpcy50ZXh0dXJlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0dGhpcy50ZXh0dXJlc1sgaSBdLmltYWdlLndpZHRoID0gd2lkdGg7XHJcblx0XHRcdFx0dGhpcy50ZXh0dXJlc1sgaSBdLmltYWdlLmhlaWdodCA9IGhlaWdodDtcclxuXHRcdFx0XHR0aGlzLnRleHR1cmVzWyBpIF0uaW1hZ2UuZGVwdGggPSBkZXB0aDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuZGlzcG9zZSgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnZpZXdwb3J0LnNldCggMCwgMCwgd2lkdGgsIGhlaWdodCApO1xyXG5cdFx0dGhpcy5zY2lzc29yLnNldCggMCwgMCwgd2lkdGgsIGhlaWdodCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBuZXcgcmVuZGVyIHRhcmdldCB3aXRoIGNvcGllZCB2YWx1ZXMgZnJvbSB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7UmVuZGVyVGFyZ2V0fSBBIGNsb25lIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y2xvbmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvcGllcyB0aGUgc2V0dGluZ3Mgb2YgdGhlIGdpdmVuIHJlbmRlciB0YXJnZXQuIFRoaXMgaXMgYSBzdHJ1Y3R1cmFsIGNvcHkgc29cclxuXHQgKiBubyByZXNvdXJjZXMgYXJlIHNoYXJlZCBiZXR3ZWVuIHJlbmRlciB0YXJnZXRzIGFmdGVyIHRoZSBjb3B5LiBUaGF0IGluY2x1ZGVzXHJcblx0ICogYWxsIE1SVCB0ZXh0dXJlcyBhbmQgdGhlIGRlcHRoIHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JlbmRlclRhcmdldH0gc291cmNlIC0gVGhlIHJlbmRlciB0YXJnZXQgdG8gY29weS5cclxuXHQgKiBAcmV0dXJuIHtSZW5kZXJUYXJnZXR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHRoaXMud2lkdGggPSBzb3VyY2Uud2lkdGg7XHJcblx0XHR0aGlzLmhlaWdodCA9IHNvdXJjZS5oZWlnaHQ7XHJcblx0XHR0aGlzLmRlcHRoID0gc291cmNlLmRlcHRoO1xyXG5cclxuXHRcdHRoaXMuc2Npc3Nvci5jb3B5KCBzb3VyY2Uuc2Npc3NvciApO1xyXG5cdFx0dGhpcy5zY2lzc29yVGVzdCA9IHNvdXJjZS5zY2lzc29yVGVzdDtcclxuXHJcblx0XHR0aGlzLnZpZXdwb3J0LmNvcHkoIHNvdXJjZS52aWV3cG9ydCApO1xyXG5cclxuXHRcdHRoaXMudGV4dHVyZXMubGVuZ3RoID0gMDtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gc291cmNlLnRleHR1cmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdFx0dGhpcy50ZXh0dXJlc1sgaSBdID0gc291cmNlLnRleHR1cmVzWyBpIF0uY2xvbmUoKTtcclxuXHRcdFx0dGhpcy50ZXh0dXJlc1sgaSBdLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSA9IHRydWU7XHJcblx0XHRcdHRoaXMudGV4dHVyZXNbIGkgXS5yZW5kZXJUYXJnZXQgPSB0aGlzO1xyXG5cclxuXHRcdFx0Ly8gZW5zdXJlIGltYWdlIG9iamVjdCBpcyBub3Qgc2hhcmVkLCBzZWUgIzIwMzI4XHJcblxyXG5cdFx0XHRjb25zdCBpbWFnZSA9IE9iamVjdC5hc3NpZ24oIHt9LCBzb3VyY2UudGV4dHVyZXNbIGkgXS5pbWFnZSApO1xyXG5cdFx0XHR0aGlzLnRleHR1cmVzWyBpIF0uc291cmNlID0gbmV3IFNvdXJjZSggaW1hZ2UgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5kZXB0aEJ1ZmZlciA9IHNvdXJjZS5kZXB0aEJ1ZmZlcjtcclxuXHRcdHRoaXMuc3RlbmNpbEJ1ZmZlciA9IHNvdXJjZS5zdGVuY2lsQnVmZmVyO1xyXG5cclxuXHRcdHRoaXMucmVzb2x2ZURlcHRoQnVmZmVyID0gc291cmNlLnJlc29sdmVEZXB0aEJ1ZmZlcjtcclxuXHRcdHRoaXMucmVzb2x2ZVN0ZW5jaWxCdWZmZXIgPSBzb3VyY2UucmVzb2x2ZVN0ZW5jaWxCdWZmZXI7XHJcblxyXG5cdFx0aWYgKCBzb3VyY2UuZGVwdGhUZXh0dXJlICE9PSBudWxsICkgdGhpcy5kZXB0aFRleHR1cmUgPSBzb3VyY2UuZGVwdGhUZXh0dXJlLmNsb25lKCk7XHJcblxyXG5cdFx0dGhpcy5zYW1wbGVzID0gc291cmNlLnNhbXBsZXM7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRnJlZXMgdGhlIEdQVS1yZWxhdGVkIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhpcyBpbnN0YW5jZS4gQ2FsbCB0aGlzXHJcblx0ICogbWV0aG9kIHdoZW5ldmVyIHRoaXMgaW5zdGFuY2UgaXMgbm8gbG9uZ2VyIHVzZWQgaW4geW91ciBhcHAuXHJcblx0ICpcclxuXHQgKiBAZmlyZXMgUmVuZGVyVGFyZ2V0I2Rpc3Bvc2VcclxuXHQgKi9cclxuXHRkaXNwb3NlKCkge1xyXG5cclxuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnZGlzcG9zZScgfSApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBSZW5kZXJUYXJnZXQgfTtcclxuIiwiaW1wb3J0IHsgUmVuZGVyVGFyZ2V0IH0gZnJvbSAnLi4vY29yZS9SZW5kZXJUYXJnZXQuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgcmVuZGVyIHRhcmdldCB1c2VkIGluIGNvbnRleHQgb2Yge0BsaW5rIFdlYkdMUmVuZGVyZXJ9LlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgUmVuZGVyVGFyZ2V0XHJcbiAqL1xyXG5jbGFzcyBXZWJHTFJlbmRlclRhcmdldCBleHRlbmRzIFJlbmRlclRhcmdldCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgM0QgcmVuZGVyIHRhcmdldC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbd2lkdGg9MV0gLSBUaGUgd2lkdGggb2YgdGhlIHJlbmRlciB0YXJnZXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtoZWlnaHQ9MV0gLSBUaGUgaGVpZ2h0IG9mIHRoZSByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyVGFyZ2V0fk9wdGlvbnN9IFtvcHRpb25zXSAtIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggd2lkdGggPSAxLCBoZWlnaHQgPSAxLCBvcHRpb25zID0ge30gKSB7XHJcblxyXG5cdFx0c3VwZXIoIHdpZHRoLCBoZWlnaHQsIG9wdGlvbnMgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNXZWJHTFJlbmRlclRhcmdldCA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFdlYkdMUmVuZGVyVGFyZ2V0IH07XHJcbiIsImltcG9ydCB7IFRleHR1cmUgfSBmcm9tICcuL1RleHR1cmUuanMnO1xyXG5pbXBvcnQgeyBDbGFtcFRvRWRnZVdyYXBwaW5nLCBOZWFyZXN0RmlsdGVyIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRleHR1cmVzIGRpcmVjdGx5IGZyb20gcmF3IGJ1ZmZlciBkYXRhLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgVGV4dHVyZVxyXG4gKi9cclxuY2xhc3MgRGF0YUFycmF5VGV4dHVyZSBleHRlbmRzIFRleHR1cmUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGRhdGEgYXJyYXkgdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7P1R5cGVkQXJyYXl9IFtkYXRhPW51bGxdIC0gVGhlIGJ1ZmZlciBkYXRhLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbd2lkdGg9MV0gLSBUaGUgd2lkdGggb2YgdGhlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtoZWlnaHQ9MV0gLSBUaGUgaGVpZ2h0IG9mIHRoZSB0ZXh0dXJlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZGVwdGg9MV0gLSBUaGUgZGVwdGggb2YgdGhlIHRleHR1cmUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGRhdGEgPSBudWxsLCB3aWR0aCA9IDEsIGhlaWdodCA9IDEsIGRlcHRoID0gMSApIHtcclxuXHJcblx0XHRzdXBlciggbnVsbCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0RhdGFBcnJheVRleHR1cmUgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGltYWdlIGRlZmluaXRpb24gb2YgYSBkYXRhIHRleHR1cmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3tkYXRhOlR5cGVkQXJyYXksd2lkdGg6bnVtYmVyLGhlaWdodDpudW1iZXIsZGVwdGg6bnVtYmVyfX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pbWFnZSA9IHsgZGF0YSwgd2lkdGgsIGhlaWdodCwgZGVwdGggfTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvdyB0aGUgdGV4dHVyZSBpcyBzYW1wbGVkIHdoZW4gYSB0ZXhlbCBjb3ZlcnMgbW9yZSB0aGFuIG9uZSBwaXhlbC5cclxuXHRcdCAqXHJcblx0XHQgKiBPdmVyd3JpdHRlbiBhbmQgc2V0IHRvIGBOZWFyZXN0RmlsdGVyYCBieSBkZWZhdWx0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoTmVhcmVzdEZpbHRlcnxOZWFyZXN0TWlwbWFwTmVhcmVzdEZpbHRlcnxOZWFyZXN0TWlwbWFwTGluZWFyRmlsdGVyfExpbmVhckZpbHRlcnxMaW5lYXJNaXBtYXBOZWFyZXN0RmlsdGVyfExpbmVhck1pcG1hcExpbmVhckZpbHRlcil9XHJcblx0XHQgKiBAZGVmYXVsdCBOZWFyZXN0RmlsdGVyXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWFnRmlsdGVyID0gTmVhcmVzdEZpbHRlcjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvdyB0aGUgdGV4dHVyZSBpcyBzYW1wbGVkIHdoZW4gYSB0ZXhlbCBjb3ZlcnMgbGVzcyB0aGFuIG9uZSBwaXhlbC5cclxuXHRcdCAqXHJcblx0XHQgKiBPdmVyd3JpdHRlbiBhbmQgc2V0IHRvIGBOZWFyZXN0RmlsdGVyYCBieSBkZWZhdWx0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoTmVhcmVzdEZpbHRlcnxOZWFyZXN0TWlwbWFwTmVhcmVzdEZpbHRlcnxOZWFyZXN0TWlwbWFwTGluZWFyRmlsdGVyfExpbmVhckZpbHRlcnxMaW5lYXJNaXBtYXBOZWFyZXN0RmlsdGVyfExpbmVhck1pcG1hcExpbmVhckZpbHRlcil9XHJcblx0XHQgKiBAZGVmYXVsdCBOZWFyZXN0RmlsdGVyXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWluRmlsdGVyID0gTmVhcmVzdEZpbHRlcjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZGVmaW5lcyBob3cgdGhlIHRleHR1cmUgaXMgd3JhcHBlZCBpbiB0aGUgZGVwdGggYW5kIGNvcnJlc3BvbmRzIHRvXHJcblx0XHQgKiAqVyogaW4gVVZXIG1hcHBpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeyhSZXBlYXRXcmFwcGluZ3xDbGFtcFRvRWRnZVdyYXBwaW5nfE1pcnJvcmVkUmVwZWF0V3JhcHBpbmcpfVxyXG5cdFx0ICogQGRlZmF1bHQgQ2xhbXBUb0VkZ2VXcmFwcGluZ1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLndyYXBSID0gQ2xhbXBUb0VkZ2VXcmFwcGluZztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdG8gZ2VuZXJhdGUgbWlwbWFwcyAoaWYgcG9zc2libGUpIGZvciBhIHRleHR1cmUuXHJcblx0XHQgKlxyXG5cdFx0ICogT3ZlcndyaXR0ZW4gYW5kIHNldCB0byBgZmFsc2VgIGJ5IGRlZmF1bHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSWYgc2V0IHRvIGB0cnVlYCwgdGhlIHRleHR1cmUgaXMgZmxpcHBlZCBhbG9uZyB0aGUgdmVydGljYWwgYXhpcyB3aGVuXHJcblx0XHQgKiB1cGxvYWRlZCB0byB0aGUgR1BVLlxyXG5cdFx0ICpcclxuXHRcdCAqIE92ZXJ3cml0dGVuIGFuZCBzZXQgdG8gYGZhbHNlYCBieSBkZWZhdWx0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5mbGlwWSA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU3BlY2lmaWVzIHRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzIGZvciB0aGUgc3RhcnQgb2YgZWFjaCBwaXhlbCByb3cgaW4gbWVtb3J5LlxyXG5cdFx0ICpcclxuXHRcdCAqIE92ZXJ3cml0dGVuIGFuZCBzZXQgdG8gYDFgIGJ5IGRlZmF1bHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudW5wYWNrQWxpZ25tZW50ID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgc2V0IG9mIGFsbCBsYXllcnMgd2hpY2ggbmVlZCB0byBiZSB1cGRhdGVkIGluIHRoZSB0ZXh0dXJlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtTZXQ8bnVtYmVyPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5sYXllclVwZGF0ZXMgPSBuZXcgU2V0KCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVzY3JpYmVzIHRoYXQgYSBzcGVjaWZpYyBsYXllciBvZiB0aGUgdGV4dHVyZSBuZWVkcyB0byBiZSB1cGRhdGVkLlxyXG5cdCAqIE5vcm1hbGx5IHdoZW4ge0BsaW5rIFRleHR1cmUjbmVlZHNVcGRhdGV9IGlzIHNldCB0byBgdHJ1ZWAsIHRoZVxyXG5cdCAqIGVudGlyZSBkYXRhIHRleHR1cmUgYXJyYXkgaXMgc2VudCB0byB0aGUgR1BVLiBNYXJraW5nIHNwZWNpZmljXHJcblx0ICogbGF5ZXJzIHdpbGwgb25seSB0cmFuc21pdCBzdWJzZXRzIG9mIGFsbCBtaXBtYXBzIGFzc29jaWF0ZWQgd2l0aCBhXHJcblx0ICogc3BlY2lmaWMgZGVwdGggaW4gdGhlIGFycmF5IHdoaWNoIGlzIG9mdGVuIG11Y2ggbW9yZSBwZXJmb3JtYW50LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGxheWVySW5kZXggLSBUaGUgbGF5ZXIgaW5kZXggdGhhdCBzaG91bGQgYmUgdXBkYXRlZC5cclxuXHQgKi9cclxuXHRhZGRMYXllclVwZGF0ZSggbGF5ZXJJbmRleCApIHtcclxuXHJcblx0XHR0aGlzLmxheWVyVXBkYXRlcy5hZGQoIGxheWVySW5kZXggKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXNldHMgdGhlIGxheWVyIHVwZGF0ZXMgcmVnaXN0cnkuXHJcblx0ICovXHJcblx0Y2xlYXJMYXllclVwZGF0ZXMoKSB7XHJcblxyXG5cdFx0dGhpcy5sYXllclVwZGF0ZXMuY2xlYXIoKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgRGF0YUFycmF5VGV4dHVyZSB9O1xyXG4iLCJpbXBvcnQgeyBXZWJHTFJlbmRlclRhcmdldCB9IGZyb20gJy4vV2ViR0xSZW5kZXJUYXJnZXQuanMnO1xyXG5pbXBvcnQgeyBEYXRhQXJyYXlUZXh0dXJlIH0gZnJvbSAnLi4vdGV4dHVyZXMvRGF0YUFycmF5VGV4dHVyZS5qcyc7XHJcblxyXG4vKipcclxuICogQW4gYXJyYXkgcmVuZGVyIHRhcmdldCB1c2VkIGluIGNvbnRleHQgb2Yge0BsaW5rIFdlYkdMUmVuZGVyZXJ9LlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgV2ViR0xSZW5kZXJUYXJnZXRcclxuICovXHJcbmNsYXNzIFdlYkdMQXJyYXlSZW5kZXJUYXJnZXQgZXh0ZW5kcyBXZWJHTFJlbmRlclRhcmdldCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYXJyYXkgcmVuZGVyIHRhcmdldC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbd2lkdGg9MV0gLSBUaGUgd2lkdGggb2YgdGhlIHJlbmRlciB0YXJnZXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtoZWlnaHQ9MV0gLSBUaGUgaGVpZ2h0IG9mIHRoZSByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZGVwdGg9MV0gLSBUaGUgaGVpZ2h0IG9mIHRoZSByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyVGFyZ2V0fk9wdGlvbnN9IFtvcHRpb25zXSAtIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggd2lkdGggPSAxLCBoZWlnaHQgPSAxLCBkZXB0aCA9IDEsIG9wdGlvbnMgPSB7fSApIHtcclxuXHJcblx0XHRzdXBlciggd2lkdGgsIGhlaWdodCwgb3B0aW9ucyApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1dlYkdMQXJyYXlSZW5kZXJUYXJnZXQgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMuZGVwdGggPSBkZXB0aDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIE92ZXJ3cml0dGVuIHdpdGggYSBkaWZmZXJlbnQgdGV4dHVyZSB0eXBlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtEYXRhQXJyYXlUZXh0dXJlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRleHR1cmUgPSBuZXcgRGF0YUFycmF5VGV4dHVyZSggbnVsbCwgd2lkdGgsIGhlaWdodCwgZGVwdGggKTtcclxuXHJcblx0XHR0aGlzLnRleHR1cmUuaXNSZW5kZXJUYXJnZXRUZXh0dXJlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgV2ViR0xBcnJheVJlbmRlclRhcmdldCB9O1xyXG4iLCJpbXBvcnQgeyBUZXh0dXJlIH0gZnJvbSAnLi9UZXh0dXJlLmpzJztcclxuaW1wb3J0IHsgQ2xhbXBUb0VkZ2VXcmFwcGluZywgTmVhcmVzdEZpbHRlciB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIHRocmVlLWRpbWVuc2lvbmFsIHRleHR1cmUgZnJvbSByYXcgZGF0YSwgd2l0aCBwYXJhbWV0ZXJzIHRvXHJcbiAqIGRpdmlkZSBpdCBpbnRvIHdpZHRoLCBoZWlnaHQsIGFuZCBkZXB0aC5cclxuICpcclxuICogQGF1Z21lbnRzIFRleHR1cmVcclxuICovXHJcbmNsYXNzIERhdGEzRFRleHR1cmUgZXh0ZW5kcyBUZXh0dXJlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBkYXRhIGFycmF5IHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gez9UeXBlZEFycmF5fSBbZGF0YT1udWxsXSAtIFRoZSBidWZmZXIgZGF0YS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3dpZHRoPTFdIC0gVGhlIHdpZHRoIG9mIHRoZSB0ZXh0dXJlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbaGVpZ2h0PTFdIC0gVGhlIGhlaWdodCBvZiB0aGUgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2RlcHRoPTFdIC0gVGhlIGRlcHRoIG9mIHRoZSB0ZXh0dXJlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBkYXRhID0gbnVsbCwgd2lkdGggPSAxLCBoZWlnaHQgPSAxLCBkZXB0aCA9IDEgKSB7XHJcblxyXG5cdFx0Ly8gV2UncmUgZ29pbmcgdG8gYWRkIC5zZXRYWFgoKSBtZXRob2RzIGZvciBzZXR0aW5nIHByb3BlcnRpZXMgbGF0ZXIuXHJcblx0XHQvLyBVc2VycyBjYW4gc3RpbGwgc2V0IGluIERhdGEzRFRleHR1cmUgZGlyZWN0bHkuXHJcblx0XHQvL1xyXG5cdFx0Ly9cdGNvbnN0IHRleHR1cmUgPSBuZXcgVEhSRUUuRGF0YTNEVGV4dHVyZSggZGF0YSwgd2lkdGgsIGhlaWdodCwgZGVwdGggKTtcclxuXHRcdC8vIFx0dGV4dHVyZS5hbmlzb3Ryb3B5ID0gMTY7XHJcblx0XHQvL1xyXG5cdFx0Ly8gU2VlICMxNDgzOVxyXG5cclxuXHRcdHN1cGVyKCBudWxsICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzRGF0YTNEVGV4dHVyZSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgaW1hZ2UgZGVmaW5pdGlvbiBvZiBhIGRhdGEgdGV4dHVyZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7e2RhdGE6VHlwZWRBcnJheSx3aWR0aDpudW1iZXIsaGVpZ2h0Om51bWJlcixkZXB0aDpudW1iZXJ9fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmltYWdlID0geyBkYXRhLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCB9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG93IHRoZSB0ZXh0dXJlIGlzIHNhbXBsZWQgd2hlbiBhIHRleGVsIGNvdmVycyBtb3JlIHRoYW4gb25lIHBpeGVsLlxyXG5cdFx0ICpcclxuXHRcdCAqIE92ZXJ3cml0dGVuIGFuZCBzZXQgdG8gYE5lYXJlc3RGaWx0ZXJgIGJ5IGRlZmF1bHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeyhOZWFyZXN0RmlsdGVyfE5lYXJlc3RNaXBtYXBOZWFyZXN0RmlsdGVyfE5lYXJlc3RNaXBtYXBMaW5lYXJGaWx0ZXJ8TGluZWFyRmlsdGVyfExpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXJ8TGluZWFyTWlwbWFwTGluZWFyRmlsdGVyKX1cclxuXHRcdCAqIEBkZWZhdWx0IE5lYXJlc3RGaWx0ZXJcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tYWdGaWx0ZXIgPSBOZWFyZXN0RmlsdGVyO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG93IHRoZSB0ZXh0dXJlIGlzIHNhbXBsZWQgd2hlbiBhIHRleGVsIGNvdmVycyBsZXNzIHRoYW4gb25lIHBpeGVsLlxyXG5cdFx0ICpcclxuXHRcdCAqIE92ZXJ3cml0dGVuIGFuZCBzZXQgdG8gYE5lYXJlc3RGaWx0ZXJgIGJ5IGRlZmF1bHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeyhOZWFyZXN0RmlsdGVyfE5lYXJlc3RNaXBtYXBOZWFyZXN0RmlsdGVyfE5lYXJlc3RNaXBtYXBMaW5lYXJGaWx0ZXJ8TGluZWFyRmlsdGVyfExpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXJ8TGluZWFyTWlwbWFwTGluZWFyRmlsdGVyKX1cclxuXHRcdCAqIEBkZWZhdWx0IE5lYXJlc3RGaWx0ZXJcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5taW5GaWx0ZXIgPSBOZWFyZXN0RmlsdGVyO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBkZWZpbmVzIGhvdyB0aGUgdGV4dHVyZSBpcyB3cmFwcGVkIGluIHRoZSBkZXB0aCBhbmQgY29ycmVzcG9uZHMgdG9cclxuXHRcdCAqICpXKiBpbiBVVlcgbWFwcGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KFJlcGVhdFdyYXBwaW5nfENsYW1wVG9FZGdlV3JhcHBpbmd8TWlycm9yZWRSZXBlYXRXcmFwcGluZyl9XHJcblx0XHQgKiBAZGVmYXVsdCBDbGFtcFRvRWRnZVdyYXBwaW5nXHJcblx0XHQgKi9cclxuXHRcdHRoaXMud3JhcFIgPSBDbGFtcFRvRWRnZVdyYXBwaW5nO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0byBnZW5lcmF0ZSBtaXBtYXBzIChpZiBwb3NzaWJsZSkgZm9yIGEgdGV4dHVyZS5cclxuXHRcdCAqXHJcblx0XHQgKiBPdmVyd3JpdHRlbiBhbmQgc2V0IHRvIGBmYWxzZWAgYnkgZGVmYXVsdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBJZiBzZXQgdG8gYHRydWVgLCB0aGUgdGV4dHVyZSBpcyBmbGlwcGVkIGFsb25nIHRoZSB2ZXJ0aWNhbCBheGlzIHdoZW5cclxuXHRcdCAqIHVwbG9hZGVkIHRvIHRoZSBHUFUuXHJcblx0XHQgKlxyXG5cdFx0ICogT3ZlcndyaXR0ZW4gYW5kIHNldCB0byBgZmFsc2VgIGJ5IGRlZmF1bHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZsaXBZID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTcGVjaWZpZXMgdGhlIGFsaWdubWVudCByZXF1aXJlbWVudHMgZm9yIHRoZSBzdGFydCBvZiBlYWNoIHBpeGVsIHJvdyBpbiBtZW1vcnkuXHJcblx0XHQgKlxyXG5cdFx0ICogT3ZlcndyaXR0ZW4gYW5kIHNldCB0byBgMWAgYnkgZGVmYXVsdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51bnBhY2tBbGlnbm1lbnQgPSAxO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBEYXRhM0RUZXh0dXJlIH07XHJcbiIsImltcG9ydCB7IFdlYkdMUmVuZGVyVGFyZ2V0IH0gZnJvbSAnLi9XZWJHTFJlbmRlclRhcmdldC5qcyc7XHJcbmltcG9ydCB7IERhdGEzRFRleHR1cmUgfSBmcm9tICcuLi90ZXh0dXJlcy9EYXRhM0RUZXh0dXJlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIDNEIHJlbmRlciB0YXJnZXQgdXNlZCBpbiBjb250ZXh0IG9mIHtAbGluayBXZWJHTFJlbmRlcmVyfS5cclxuICpcclxuICogQGF1Z21lbnRzIFdlYkdMUmVuZGVyVGFyZ2V0XHJcbiAqL1xyXG5jbGFzcyBXZWJHTDNEUmVuZGVyVGFyZ2V0IGV4dGVuZHMgV2ViR0xSZW5kZXJUYXJnZXQge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IDNEIHJlbmRlciB0YXJnZXQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3dpZHRoPTFdIC0gVGhlIHdpZHRoIG9mIHRoZSByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbaGVpZ2h0PTFdIC0gVGhlIGhlaWdodCBvZiB0aGUgcmVuZGVyIHRhcmdldC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2RlcHRoPTFdIC0gVGhlIGhlaWdodCBvZiB0aGUgcmVuZGVyIHRhcmdldC5cclxuXHQgKiBAcGFyYW0ge1JlbmRlclRhcmdldH5PcHRpb25zfSBbb3B0aW9uc10gLSBUaGUgY29uZmlndXJhdGlvbiBvYmplY3QuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHdpZHRoID0gMSwgaGVpZ2h0ID0gMSwgZGVwdGggPSAxLCBvcHRpb25zID0ge30gKSB7XHJcblxyXG5cdFx0c3VwZXIoIHdpZHRoLCBoZWlnaHQsIG9wdGlvbnMgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNXZWJHTDNEUmVuZGVyVGFyZ2V0ID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLmRlcHRoID0gZGVwdGg7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBPdmVyd3JpdHRlbiB3aXRoIGEgZGlmZmVyZW50IHRleHR1cmUgdHlwZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7RGF0YTNEVGV4dHVyZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50ZXh0dXJlID0gbmV3IERhdGEzRFRleHR1cmUoIG51bGwsIHdpZHRoLCBoZWlnaHQsIGRlcHRoICk7XHJcblxyXG5cdFx0dGhpcy50ZXh0dXJlLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFdlYkdMM0RSZW5kZXJUYXJnZXQgfTtcclxuIiwiaW1wb3J0IHsgY2xhbXAgfSBmcm9tICcuL01hdGhVdGlscy5qcyc7XHJcblxyXG4vKipcclxuICogQ2xhc3MgZm9yIHJlcHJlc2VudGluZyBhIFF1YXRlcm5pb24uIFF1YXRlcm5pb25zIGFyZSB1c2VkIGluIHRocmVlLmpzIHRvIHJlcHJlc2VudCByb3RhdGlvbnMuXHJcbiAqXHJcbiAqIEl0ZXJhdGluZyB0aHJvdWdoIGEgdmVjdG9yIGluc3RhbmNlIHdpbGwgeWllbGQgaXRzIGNvbXBvbmVudHMgYCh4LCB5LCB6LCB3KWAgaW5cclxuICogdGhlIGNvcnJlc3BvbmRpbmcgb3JkZXIuXHJcbiAqXHJcbiAqIE5vdGUgdGhhdCB0aHJlZS5qcyBleHBlY3RzIFF1YXRlcm5pb25zIHRvIGJlIG5vcm1hbGl6ZWQuXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IHF1YXRlcm5pb24gPSBuZXcgVEhSRUUuUXVhdGVybmlvbigpO1xyXG4gKiBxdWF0ZXJuaW9uLnNldEZyb21BeGlzQW5nbGUoIG5ldyBUSFJFRS5WZWN0b3IzKCAwLCAxLCAwICksIE1hdGguUEkgLyAyICk7XHJcbiAqXHJcbiAqIGNvbnN0IHZlY3RvciA9IG5ldyBUSFJFRS5WZWN0b3IzKCAxLCAwLCAwICk7XHJcbiAqIHZlY3Rvci5hcHBseVF1YXRlcm5pb24oIHF1YXRlcm5pb24gKTtcclxuICogYGBgXHJcbiAqL1xyXG5jbGFzcyBRdWF0ZXJuaW9uIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBxdWF0ZXJuaW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt4PTBdIC0gVGhlIHggdmFsdWUgb2YgdGhpcyBxdWF0ZXJuaW9uLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbeT0wXSAtIFRoZSB5IHZhbHVlIG9mIHRoaXMgcXVhdGVybmlvbi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3o9MF0gLSBUaGUgeiB2YWx1ZSBvZiB0aGlzIHF1YXRlcm5pb24uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt3PTFdIC0gVGhlIHcgdmFsdWUgb2YgdGhpcyBxdWF0ZXJuaW9uLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCB4ID0gMCwgeSA9IDAsIHogPSAwLCB3ID0gMSApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNRdWF0ZXJuaW9uID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLl94ID0geDtcclxuXHRcdHRoaXMuX3kgPSB5O1xyXG5cdFx0dGhpcy5feiA9IHo7XHJcblx0XHR0aGlzLl93ID0gdztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJbnRlcnBvbGF0ZXMgYmV0d2VlbiB0d28gcXVhdGVybmlvbnMgdmlhIFNMRVJQLiBUaGlzIGltcGxlbWVudGF0aW9uIGFzc3VtZXMgdGhlXHJcblx0ICogcXVhdGVybmlvbiBkYXRhIGFyZSBtYW5hZ2VkICBpbiBmbGF0IGFycmF5cy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gZHN0IC0gVGhlIGRlc3RpbmF0aW9uIGFycmF5LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBkc3RPZmZzZXQgLSBBbiBvZmZzZXQgaW50byB0aGUgZGVzdGluYXRpb24gYXJyYXkuXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBzcmMwIC0gVGhlIHNvdXJjZSBhcnJheSBvZiB0aGUgZmlyc3QgcXVhdGVybmlvbi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc3JjT2Zmc2V0MCAtIEFuIG9mZnNldCBpbnRvIHRoZSBmaXJzdCBzb3VyY2UgYXJyYXkuXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBzcmMxIC0gIFRoZSBzb3VyY2UgYXJyYXkgb2YgdGhlIHNlY29uZCBxdWF0ZXJuaW9uLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzcmNPZmZzZXQxIC0gQW4gb2Zmc2V0IGludG8gdGhlIHNlY29uZCBzb3VyY2UgYXJyYXkuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHQgLSBUaGUgaW50ZXJwb2xhdGlvbiBmYWN0b3IgaW4gdGhlIHJhbmdlIGBbMCwxXWAuXHJcblx0ICogQHNlZSB7QGxpbmsgUXVhdGVybmlvbiNzbGVycH1cclxuXHQgKi9cclxuXHRzdGF0aWMgc2xlcnBGbGF0KCBkc3QsIGRzdE9mZnNldCwgc3JjMCwgc3JjT2Zmc2V0MCwgc3JjMSwgc3JjT2Zmc2V0MSwgdCApIHtcclxuXHJcblx0XHQvLyBmdXp6LWZyZWUsIGFycmF5LWJhc2VkIFF1YXRlcm5pb24gU0xFUlAgb3BlcmF0aW9uXHJcblxyXG5cdFx0bGV0IHgwID0gc3JjMFsgc3JjT2Zmc2V0MCArIDAgXSxcclxuXHRcdFx0eTAgPSBzcmMwWyBzcmNPZmZzZXQwICsgMSBdLFxyXG5cdFx0XHR6MCA9IHNyYzBbIHNyY09mZnNldDAgKyAyIF0sXHJcblx0XHRcdHcwID0gc3JjMFsgc3JjT2Zmc2V0MCArIDMgXTtcclxuXHJcblx0XHRjb25zdCB4MSA9IHNyYzFbIHNyY09mZnNldDEgKyAwIF0sXHJcblx0XHRcdHkxID0gc3JjMVsgc3JjT2Zmc2V0MSArIDEgXSxcclxuXHRcdFx0ejEgPSBzcmMxWyBzcmNPZmZzZXQxICsgMiBdLFxyXG5cdFx0XHR3MSA9IHNyYzFbIHNyY09mZnNldDEgKyAzIF07XHJcblxyXG5cdFx0aWYgKCB0ID09PSAwICkge1xyXG5cclxuXHRcdFx0ZHN0WyBkc3RPZmZzZXQgKyAwIF0gPSB4MDtcclxuXHRcdFx0ZHN0WyBkc3RPZmZzZXQgKyAxIF0gPSB5MDtcclxuXHRcdFx0ZHN0WyBkc3RPZmZzZXQgKyAyIF0gPSB6MDtcclxuXHRcdFx0ZHN0WyBkc3RPZmZzZXQgKyAzIF0gPSB3MDtcclxuXHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHQgPT09IDEgKSB7XHJcblxyXG5cdFx0XHRkc3RbIGRzdE9mZnNldCArIDAgXSA9IHgxO1xyXG5cdFx0XHRkc3RbIGRzdE9mZnNldCArIDEgXSA9IHkxO1xyXG5cdFx0XHRkc3RbIGRzdE9mZnNldCArIDIgXSA9IHoxO1xyXG5cdFx0XHRkc3RbIGRzdE9mZnNldCArIDMgXSA9IHcxO1xyXG5cdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdzAgIT09IHcxIHx8IHgwICE9PSB4MSB8fCB5MCAhPT0geTEgfHwgejAgIT09IHoxICkge1xyXG5cclxuXHRcdFx0bGV0IHMgPSAxIC0gdDtcclxuXHRcdFx0Y29uc3QgY29zID0geDAgKiB4MSArIHkwICogeTEgKyB6MCAqIHoxICsgdzAgKiB3MSxcclxuXHRcdFx0XHRkaXIgPSAoIGNvcyA+PSAwID8gMSA6IC0gMSApLFxyXG5cdFx0XHRcdHNxclNpbiA9IDEgLSBjb3MgKiBjb3M7XHJcblxyXG5cdFx0XHQvLyBTa2lwIHRoZSBTbGVycCBmb3IgdGlueSBzdGVwcyB0byBhdm9pZCBudW1lcmljIHByb2JsZW1zOlxyXG5cdFx0XHRpZiAoIHNxclNpbiA+IE51bWJlci5FUFNJTE9OICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBzaW4gPSBNYXRoLnNxcnQoIHNxclNpbiApLFxyXG5cdFx0XHRcdFx0bGVuID0gTWF0aC5hdGFuMiggc2luLCBjb3MgKiBkaXIgKTtcclxuXHJcblx0XHRcdFx0cyA9IE1hdGguc2luKCBzICogbGVuICkgLyBzaW47XHJcblx0XHRcdFx0dCA9IE1hdGguc2luKCB0ICogbGVuICkgLyBzaW47XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCB0RGlyID0gdCAqIGRpcjtcclxuXHJcblx0XHRcdHgwID0geDAgKiBzICsgeDEgKiB0RGlyO1xyXG5cdFx0XHR5MCA9IHkwICogcyArIHkxICogdERpcjtcclxuXHRcdFx0ejAgPSB6MCAqIHMgKyB6MSAqIHREaXI7XHJcblx0XHRcdHcwID0gdzAgKiBzICsgdzEgKiB0RGlyO1xyXG5cclxuXHRcdFx0Ly8gTm9ybWFsaXplIGluIGNhc2Ugd2UganVzdCBkaWQgYSBsZXJwOlxyXG5cdFx0XHRpZiAoIHMgPT09IDEgLSB0ICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBmID0gMSAvIE1hdGguc3FydCggeDAgKiB4MCArIHkwICogeTAgKyB6MCAqIHowICsgdzAgKiB3MCApO1xyXG5cclxuXHRcdFx0XHR4MCAqPSBmO1xyXG5cdFx0XHRcdHkwICo9IGY7XHJcblx0XHRcdFx0ejAgKj0gZjtcclxuXHRcdFx0XHR3MCAqPSBmO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRkc3RbIGRzdE9mZnNldCBdID0geDA7XHJcblx0XHRkc3RbIGRzdE9mZnNldCArIDEgXSA9IHkwO1xyXG5cdFx0ZHN0WyBkc3RPZmZzZXQgKyAyIF0gPSB6MDtcclxuXHRcdGRzdFsgZHN0T2Zmc2V0ICsgMyBdID0gdzA7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTXVsdGlwbGllcyB0d28gcXVhdGVybmlvbnMuIFRoaXMgaW1wbGVtZW50YXRpb24gYXNzdW1lcyB0aGUgcXVhdGVybmlvbiBkYXRhIGFyZSBtYW5hZ2VkXHJcblx0ICogaW4gZmxhdCBhcnJheXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IGRzdCAtIFRoZSBkZXN0aW5hdGlvbiBhcnJheS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZHN0T2Zmc2V0IC0gQW4gb2Zmc2V0IGludG8gdGhlIGRlc3RpbmF0aW9uIGFycmF5LlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gc3JjMCAtIFRoZSBzb3VyY2UgYXJyYXkgb2YgdGhlIGZpcnN0IHF1YXRlcm5pb24uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHNyY09mZnNldDAgLSBBbiBvZmZzZXQgaW50byB0aGUgZmlyc3Qgc291cmNlIGFycmF5LlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gc3JjMSAtICBUaGUgc291cmNlIGFycmF5IG9mIHRoZSBzZWNvbmQgcXVhdGVybmlvbi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc3JjT2Zmc2V0MSAtIEFuIG9mZnNldCBpbnRvIHRoZSBzZWNvbmQgc291cmNlIGFycmF5LlxyXG5cdCAqIEByZXR1cm4ge0FycmF5PG51bWJlcj59IFRoZSBkZXN0aW5hdGlvbiBhcnJheS5cclxuXHQgKiBAc2VlIHtAbGluayBRdWF0ZXJuaW9uI211bHRpcGx5UXVhdGVybmlvbnN9LlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBtdWx0aXBseVF1YXRlcm5pb25zRmxhdCggZHN0LCBkc3RPZmZzZXQsIHNyYzAsIHNyY09mZnNldDAsIHNyYzEsIHNyY09mZnNldDEgKSB7XHJcblxyXG5cdFx0Y29uc3QgeDAgPSBzcmMwWyBzcmNPZmZzZXQwIF07XHJcblx0XHRjb25zdCB5MCA9IHNyYzBbIHNyY09mZnNldDAgKyAxIF07XHJcblx0XHRjb25zdCB6MCA9IHNyYzBbIHNyY09mZnNldDAgKyAyIF07XHJcblx0XHRjb25zdCB3MCA9IHNyYzBbIHNyY09mZnNldDAgKyAzIF07XHJcblxyXG5cdFx0Y29uc3QgeDEgPSBzcmMxWyBzcmNPZmZzZXQxIF07XHJcblx0XHRjb25zdCB5MSA9IHNyYzFbIHNyY09mZnNldDEgKyAxIF07XHJcblx0XHRjb25zdCB6MSA9IHNyYzFbIHNyY09mZnNldDEgKyAyIF07XHJcblx0XHRjb25zdCB3MSA9IHNyYzFbIHNyY09mZnNldDEgKyAzIF07XHJcblxyXG5cdFx0ZHN0WyBkc3RPZmZzZXQgXSA9IHgwICogdzEgKyB3MCAqIHgxICsgeTAgKiB6MSAtIHowICogeTE7XHJcblx0XHRkc3RbIGRzdE9mZnNldCArIDEgXSA9IHkwICogdzEgKyB3MCAqIHkxICsgejAgKiB4MSAtIHgwICogejE7XHJcblx0XHRkc3RbIGRzdE9mZnNldCArIDIgXSA9IHowICogdzEgKyB3MCAqIHoxICsgeDAgKiB5MSAtIHkwICogeDE7XHJcblx0XHRkc3RbIGRzdE9mZnNldCArIDMgXSA9IHcwICogdzEgLSB4MCAqIHgxIC0geTAgKiB5MSAtIHowICogejE7XHJcblxyXG5cdFx0cmV0dXJuIGRzdDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgeCB2YWx1ZSBvZiB0aGlzIHF1YXRlcm5pb24uXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdCAqIEBkZWZhdWx0IDBcclxuXHQgKi9cclxuXHRnZXQgeCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5feDtcclxuXHJcblx0fVxyXG5cclxuXHRzZXQgeCggdmFsdWUgKSB7XHJcblxyXG5cdFx0dGhpcy5feCA9IHZhbHVlO1xyXG5cdFx0dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSB5IHZhbHVlIG9mIHRoaXMgcXVhdGVybmlvbi5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0ICogQGRlZmF1bHQgMFxyXG5cdCAqL1xyXG5cdGdldCB5KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl95O1xyXG5cclxuXHR9XHJcblxyXG5cdHNldCB5KCB2YWx1ZSApIHtcclxuXHJcblx0XHR0aGlzLl95ID0gdmFsdWU7XHJcblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIHogdmFsdWUgb2YgdGhpcyBxdWF0ZXJuaW9uLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge251bWJlcn1cclxuXHQgKiBAZGVmYXVsdCAwXHJcblx0ICovXHJcblx0Z2V0IHooKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX3o7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0IHooIHZhbHVlICkge1xyXG5cclxuXHRcdHRoaXMuX3ogPSB2YWx1ZTtcclxuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgdyB2YWx1ZSBvZiB0aGlzIHF1YXRlcm5pb24uXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdCAqIEBkZWZhdWx0IDFcclxuXHQgKi9cclxuXHRnZXQgdygpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fdztcclxuXHJcblx0fVxyXG5cclxuXHRzZXQgdyggdmFsdWUgKSB7XHJcblxyXG5cdFx0dGhpcy5fdyA9IHZhbHVlO1xyXG5cdFx0dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHF1YXRlcm5pb24gY29tcG9uZW50cy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHggdmFsdWUgb2YgdGhpcyBxdWF0ZXJuaW9uLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHkgdmFsdWUgb2YgdGhpcyBxdWF0ZXJuaW9uLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB6IC0gVGhlIHogdmFsdWUgb2YgdGhpcyBxdWF0ZXJuaW9uLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB3IC0gVGhlIHcgdmFsdWUgb2YgdGhpcyBxdWF0ZXJuaW9uLlxyXG5cdCAqIEByZXR1cm4ge1F1YXRlcm5pb259IEEgcmVmZXJlbmNlIHRvIHRoaXMgcXVhdGVybmlvbi5cclxuXHQgKi9cclxuXHRzZXQoIHgsIHksIHosIHcgKSB7XHJcblxyXG5cdFx0dGhpcy5feCA9IHg7XHJcblx0XHR0aGlzLl95ID0geTtcclxuXHRcdHRoaXMuX3ogPSB6O1xyXG5cdFx0dGhpcy5fdyA9IHc7XHJcblxyXG5cdFx0dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBuZXcgcXVhdGVybmlvbiB3aXRoIGNvcGllZCB2YWx1ZXMgZnJvbSB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7UXVhdGVybmlvbn0gQSBjbG9uZSBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNsb25lKCkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5feCwgdGhpcy5feSwgdGhpcy5feiwgdGhpcy5fdyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvcGllcyB0aGUgdmFsdWVzIG9mIHRoZSBnaXZlbiBxdWF0ZXJuaW9uIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1F1YXRlcm5pb259IHF1YXRlcm5pb24gLSBUaGUgcXVhdGVybmlvbiB0byBjb3B5LlxyXG5cdCAqIEByZXR1cm4ge1F1YXRlcm5pb259IEEgcmVmZXJlbmNlIHRvIHRoaXMgcXVhdGVybmlvbi5cclxuXHQgKi9cclxuXHRjb3B5KCBxdWF0ZXJuaW9uICkge1xyXG5cclxuXHRcdHRoaXMuX3ggPSBxdWF0ZXJuaW9uLng7XHJcblx0XHR0aGlzLl95ID0gcXVhdGVybmlvbi55O1xyXG5cdFx0dGhpcy5feiA9IHF1YXRlcm5pb24uejtcclxuXHRcdHRoaXMuX3cgPSBxdWF0ZXJuaW9uLnc7XHJcblxyXG5cdFx0dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhpcyBxdWF0ZXJuaW9uIGZyb20gdGhlIHJvdGF0aW9uIHNwZWNpZmllZCBieSB0aGUgZ2l2ZW5cclxuXHQgKiBFdWxlciBhbmdsZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0V1bGVyfSBldWxlciAtIFRoZSBFdWxlciBhbmdsZXMuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbdXBkYXRlPXRydWVdIC0gV2hldGhlciB0aGUgaW50ZXJuYWwgYG9uQ2hhbmdlYCBjYWxsYmFjayBzaG91bGQgYmUgZXhlY3V0ZWQgb3Igbm90LlxyXG5cdCAqIEByZXR1cm4ge1F1YXRlcm5pb259IEEgcmVmZXJlbmNlIHRvIHRoaXMgcXVhdGVybmlvbi5cclxuXHQgKi9cclxuXHRzZXRGcm9tRXVsZXIoIGV1bGVyLCB1cGRhdGUgPSB0cnVlICkge1xyXG5cclxuXHRcdGNvbnN0IHggPSBldWxlci5feCwgeSA9IGV1bGVyLl95LCB6ID0gZXVsZXIuX3osIG9yZGVyID0gZXVsZXIuX29yZGVyO1xyXG5cclxuXHRcdC8vIGh0dHA6Ly93d3cubWF0aHdvcmtzLmNvbS9tYXRsYWJjZW50cmFsL2ZpbGVleGNoYW5nZS9cclxuXHRcdC8vIFx0MjA2OTYtZnVuY3Rpb24tdG8tY29udmVydC1iZXR3ZWVuLWRjbS1ldWxlci1hbmdsZXMtcXVhdGVybmlvbnMtYW5kLWV1bGVyLXZlY3RvcnMvXHJcblx0XHQvL1x0Y29udGVudC9TcGluQ2FsYy5tXHJcblxyXG5cdFx0Y29uc3QgY29zID0gTWF0aC5jb3M7XHJcblx0XHRjb25zdCBzaW4gPSBNYXRoLnNpbjtcclxuXHJcblx0XHRjb25zdCBjMSA9IGNvcyggeCAvIDIgKTtcclxuXHRcdGNvbnN0IGMyID0gY29zKCB5IC8gMiApO1xyXG5cdFx0Y29uc3QgYzMgPSBjb3MoIHogLyAyICk7XHJcblxyXG5cdFx0Y29uc3QgczEgPSBzaW4oIHggLyAyICk7XHJcblx0XHRjb25zdCBzMiA9IHNpbiggeSAvIDIgKTtcclxuXHRcdGNvbnN0IHMzID0gc2luKCB6IC8gMiApO1xyXG5cclxuXHRcdHN3aXRjaCAoIG9yZGVyICkge1xyXG5cclxuXHRcdFx0Y2FzZSAnWFlaJzpcclxuXHRcdFx0XHR0aGlzLl94ID0gczEgKiBjMiAqIGMzICsgYzEgKiBzMiAqIHMzO1xyXG5cdFx0XHRcdHRoaXMuX3kgPSBjMSAqIHMyICogYzMgLSBzMSAqIGMyICogczM7XHJcblx0XHRcdFx0dGhpcy5feiA9IGMxICogYzIgKiBzMyArIHMxICogczIgKiBjMztcclxuXHRcdFx0XHR0aGlzLl93ID0gYzEgKiBjMiAqIGMzIC0gczEgKiBzMiAqIHMzO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSAnWVhaJzpcclxuXHRcdFx0XHR0aGlzLl94ID0gczEgKiBjMiAqIGMzICsgYzEgKiBzMiAqIHMzO1xyXG5cdFx0XHRcdHRoaXMuX3kgPSBjMSAqIHMyICogYzMgLSBzMSAqIGMyICogczM7XHJcblx0XHRcdFx0dGhpcy5feiA9IGMxICogYzIgKiBzMyAtIHMxICogczIgKiBjMztcclxuXHRcdFx0XHR0aGlzLl93ID0gYzEgKiBjMiAqIGMzICsgczEgKiBzMiAqIHMzO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSAnWlhZJzpcclxuXHRcdFx0XHR0aGlzLl94ID0gczEgKiBjMiAqIGMzIC0gYzEgKiBzMiAqIHMzO1xyXG5cdFx0XHRcdHRoaXMuX3kgPSBjMSAqIHMyICogYzMgKyBzMSAqIGMyICogczM7XHJcblx0XHRcdFx0dGhpcy5feiA9IGMxICogYzIgKiBzMyArIHMxICogczIgKiBjMztcclxuXHRcdFx0XHR0aGlzLl93ID0gYzEgKiBjMiAqIGMzIC0gczEgKiBzMiAqIHMzO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSAnWllYJzpcclxuXHRcdFx0XHR0aGlzLl94ID0gczEgKiBjMiAqIGMzIC0gYzEgKiBzMiAqIHMzO1xyXG5cdFx0XHRcdHRoaXMuX3kgPSBjMSAqIHMyICogYzMgKyBzMSAqIGMyICogczM7XHJcblx0XHRcdFx0dGhpcy5feiA9IGMxICogYzIgKiBzMyAtIHMxICogczIgKiBjMztcclxuXHRcdFx0XHR0aGlzLl93ID0gYzEgKiBjMiAqIGMzICsgczEgKiBzMiAqIHMzO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSAnWVpYJzpcclxuXHRcdFx0XHR0aGlzLl94ID0gczEgKiBjMiAqIGMzICsgYzEgKiBzMiAqIHMzO1xyXG5cdFx0XHRcdHRoaXMuX3kgPSBjMSAqIHMyICogYzMgKyBzMSAqIGMyICogczM7XHJcblx0XHRcdFx0dGhpcy5feiA9IGMxICogYzIgKiBzMyAtIHMxICogczIgKiBjMztcclxuXHRcdFx0XHR0aGlzLl93ID0gYzEgKiBjMiAqIGMzIC0gczEgKiBzMiAqIHMzO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSAnWFpZJzpcclxuXHRcdFx0XHR0aGlzLl94ID0gczEgKiBjMiAqIGMzIC0gYzEgKiBzMiAqIHMzO1xyXG5cdFx0XHRcdHRoaXMuX3kgPSBjMSAqIHMyICogYzMgLSBzMSAqIGMyICogczM7XHJcblx0XHRcdFx0dGhpcy5feiA9IGMxICogYzIgKiBzMyArIHMxICogczIgKiBjMztcclxuXHRcdFx0XHR0aGlzLl93ID0gYzEgKiBjMiAqIGMzICsgczEgKiBzMiAqIHMzO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5RdWF0ZXJuaW9uOiAuc2V0RnJvbUV1bGVyKCkgZW5jb3VudGVyZWQgYW4gdW5rbm93biBvcmRlcjogJyArIG9yZGVyICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdXBkYXRlID09PSB0cnVlICkgdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhpcyBxdWF0ZXJuaW9uIGZyb20gdGhlIGdpdmVuIGF4aXMgYW5kIGFuZ2xlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBheGlzIC0gVGhlIG5vcm1hbGl6ZWQgYXhpcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYW5nbGUgLSBUaGUgYW5nbGUgaW4gcmFkaWFucy5cclxuXHQgKiBAcmV0dXJuIHtRdWF0ZXJuaW9ufSBBIHJlZmVyZW5jZSB0byB0aGlzIHF1YXRlcm5pb24uXHJcblx0ICovXHJcblx0c2V0RnJvbUF4aXNBbmdsZSggYXhpcywgYW5nbGUgKSB7XHJcblxyXG5cdFx0Ly8gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvZ2VvbWV0cnkvcm90YXRpb25zL2NvbnZlcnNpb25zL2FuZ2xlVG9RdWF0ZXJuaW9uL2luZGV4Lmh0bVxyXG5cclxuXHRcdGNvbnN0IGhhbGZBbmdsZSA9IGFuZ2xlIC8gMiwgcyA9IE1hdGguc2luKCBoYWxmQW5nbGUgKTtcclxuXHJcblx0XHR0aGlzLl94ID0gYXhpcy54ICogcztcclxuXHRcdHRoaXMuX3kgPSBheGlzLnkgKiBzO1xyXG5cdFx0dGhpcy5feiA9IGF4aXMueiAqIHM7XHJcblx0XHR0aGlzLl93ID0gTWF0aC5jb3MoIGhhbGZBbmdsZSApO1xyXG5cclxuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoaXMgcXVhdGVybmlvbiBmcm9tIHRoZSBnaXZlbiByb3RhdGlvbiBtYXRyaXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDR9IG0gLSBBIDR4NCBtYXRyaXggb2Ygd2hpY2ggdGhlIHVwcGVyIDN4MyBvZiBtYXRyaXggaXMgYSBwdXJlIHJvdGF0aW9uIG1hdHJpeCAoaS5lLiB1bnNjYWxlZCkuXHJcblx0ICogQHJldHVybiB7UXVhdGVybmlvbn0gQSByZWZlcmVuY2UgdG8gdGhpcyBxdWF0ZXJuaW9uLlxyXG5cdCAqL1xyXG5cdHNldEZyb21Sb3RhdGlvbk1hdHJpeCggbSApIHtcclxuXHJcblx0XHQvLyBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9nZW9tZXRyeS9yb3RhdGlvbnMvY29udmVyc2lvbnMvbWF0cml4VG9RdWF0ZXJuaW9uL2luZGV4Lmh0bVxyXG5cclxuXHRcdC8vIGFzc3VtZXMgdGhlIHVwcGVyIDN4MyBvZiBtIGlzIGEgcHVyZSByb3RhdGlvbiBtYXRyaXggKGkuZSwgdW5zY2FsZWQpXHJcblxyXG5cdFx0Y29uc3QgdGUgPSBtLmVsZW1lbnRzLFxyXG5cclxuXHRcdFx0bTExID0gdGVbIDAgXSwgbTEyID0gdGVbIDQgXSwgbTEzID0gdGVbIDggXSxcclxuXHRcdFx0bTIxID0gdGVbIDEgXSwgbTIyID0gdGVbIDUgXSwgbTIzID0gdGVbIDkgXSxcclxuXHRcdFx0bTMxID0gdGVbIDIgXSwgbTMyID0gdGVbIDYgXSwgbTMzID0gdGVbIDEwIF0sXHJcblxyXG5cdFx0XHR0cmFjZSA9IG0xMSArIG0yMiArIG0zMztcclxuXHJcblx0XHRpZiAoIHRyYWNlID4gMCApIHtcclxuXHJcblx0XHRcdGNvbnN0IHMgPSAwLjUgLyBNYXRoLnNxcnQoIHRyYWNlICsgMS4wICk7XHJcblxyXG5cdFx0XHR0aGlzLl93ID0gMC4yNSAvIHM7XHJcblx0XHRcdHRoaXMuX3ggPSAoIG0zMiAtIG0yMyApICogcztcclxuXHRcdFx0dGhpcy5feSA9ICggbTEzIC0gbTMxICkgKiBzO1xyXG5cdFx0XHR0aGlzLl96ID0gKCBtMjEgLSBtMTIgKSAqIHM7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggbTExID4gbTIyICYmIG0xMSA+IG0zMyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHMgPSAyLjAgKiBNYXRoLnNxcnQoIDEuMCArIG0xMSAtIG0yMiAtIG0zMyApO1xyXG5cclxuXHRcdFx0dGhpcy5fdyA9ICggbTMyIC0gbTIzICkgLyBzO1xyXG5cdFx0XHR0aGlzLl94ID0gMC4yNSAqIHM7XHJcblx0XHRcdHRoaXMuX3kgPSAoIG0xMiArIG0yMSApIC8gcztcclxuXHRcdFx0dGhpcy5feiA9ICggbTEzICsgbTMxICkgLyBzO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIG0yMiA+IG0zMyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHMgPSAyLjAgKiBNYXRoLnNxcnQoIDEuMCArIG0yMiAtIG0xMSAtIG0zMyApO1xyXG5cclxuXHRcdFx0dGhpcy5fdyA9ICggbTEzIC0gbTMxICkgLyBzO1xyXG5cdFx0XHR0aGlzLl94ID0gKCBtMTIgKyBtMjEgKSAvIHM7XHJcblx0XHRcdHRoaXMuX3kgPSAwLjI1ICogcztcclxuXHRcdFx0dGhpcy5feiA9ICggbTIzICsgbTMyICkgLyBzO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRjb25zdCBzID0gMi4wICogTWF0aC5zcXJ0KCAxLjAgKyBtMzMgLSBtMTEgLSBtMjIgKTtcclxuXHJcblx0XHRcdHRoaXMuX3cgPSAoIG0yMSAtIG0xMiApIC8gcztcclxuXHRcdFx0dGhpcy5feCA9ICggbTEzICsgbTMxICkgLyBzO1xyXG5cdFx0XHR0aGlzLl95ID0gKCBtMjMgKyBtMzIgKSAvIHM7XHJcblx0XHRcdHRoaXMuX3ogPSAwLjI1ICogcztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhpcyBxdWF0ZXJuaW9uIHRvIHRoZSByb3RhdGlvbiByZXF1aXJlZCB0byByb3RhdGUgdGhlIGRpcmVjdGlvbiB2ZWN0b3JcclxuXHQgKiBgdkZyb21gIHRvIHRoZSBkaXJlY3Rpb24gdmVjdG9yIGB2VG9gLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB2RnJvbSAtIFRoZSBmaXJzdCAobm9ybWFsaXplZCkgZGlyZWN0aW9uIHZlY3Rvci5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHZUbyAtIFRoZSBzZWNvbmQgKG5vcm1hbGl6ZWQpIGRpcmVjdGlvbiB2ZWN0b3IuXHJcblx0ICogQHJldHVybiB7UXVhdGVybmlvbn0gQSByZWZlcmVuY2UgdG8gdGhpcyBxdWF0ZXJuaW9uLlxyXG5cdCAqL1xyXG5cdHNldEZyb21Vbml0VmVjdG9ycyggdkZyb20sIHZUbyApIHtcclxuXHJcblx0XHQvLyBhc3N1bWVzIGRpcmVjdGlvbiB2ZWN0b3JzIHZGcm9tIGFuZCB2VG8gYXJlIG5vcm1hbGl6ZWRcclxuXHJcblx0XHRsZXQgciA9IHZGcm9tLmRvdCggdlRvICkgKyAxO1xyXG5cclxuXHRcdGlmICggciA8IE51bWJlci5FUFNJTE9OICkge1xyXG5cclxuXHRcdFx0Ly8gdkZyb20gYW5kIHZUbyBwb2ludCBpbiBvcHBvc2l0ZSBkaXJlY3Rpb25zXHJcblxyXG5cdFx0XHRyID0gMDtcclxuXHJcblx0XHRcdGlmICggTWF0aC5hYnMoIHZGcm9tLnggKSA+IE1hdGguYWJzKCB2RnJvbS56ICkgKSB7XHJcblxyXG5cdFx0XHRcdHRoaXMuX3ggPSAtIHZGcm9tLnk7XHJcblx0XHRcdFx0dGhpcy5feSA9IHZGcm9tLng7XHJcblx0XHRcdFx0dGhpcy5feiA9IDA7XHJcblx0XHRcdFx0dGhpcy5fdyA9IHI7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHR0aGlzLl94ID0gMDtcclxuXHRcdFx0XHR0aGlzLl95ID0gLSB2RnJvbS56O1xyXG5cdFx0XHRcdHRoaXMuX3ogPSB2RnJvbS55O1xyXG5cdFx0XHRcdHRoaXMuX3cgPSByO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHQvLyBjcm9zc1ZlY3RvcnMoIHZGcm9tLCB2VG8gKTsgLy8gaW5saW5lZCB0byBhdm9pZCBjeWNsaWMgZGVwZW5kZW5jeSBvbiBWZWN0b3IzXHJcblxyXG5cdFx0XHR0aGlzLl94ID0gdkZyb20ueSAqIHZUby56IC0gdkZyb20ueiAqIHZUby55O1xyXG5cdFx0XHR0aGlzLl95ID0gdkZyb20ueiAqIHZUby54IC0gdkZyb20ueCAqIHZUby56O1xyXG5cdFx0XHR0aGlzLl96ID0gdkZyb20ueCAqIHZUby55IC0gdkZyb20ueSAqIHZUby54O1xyXG5cdFx0XHR0aGlzLl93ID0gcjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubm9ybWFsaXplKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgYW5nbGUgYmV0d2VlbiB0aGlzIHF1YXRlcm5pb24gYW5kIHRoZSBnaXZlbiBvbmUgaW4gcmFkaWFucy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UXVhdGVybmlvbn0gcSAtIFRoZSBxdWF0ZXJuaW9uIHRvIGNvbXB1dGUgdGhlIGFuZ2xlIHdpdGguXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgYW5nbGUgaW4gcmFkaWFucy5cclxuXHQgKi9cclxuXHRhbmdsZVRvKCBxICkge1xyXG5cclxuXHRcdHJldHVybiAyICogTWF0aC5hY29zKCBNYXRoLmFicyggY2xhbXAoIHRoaXMuZG90KCBxICksIC0gMSwgMSApICkgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSb3RhdGVzIHRoaXMgcXVhdGVybmlvbiBieSBhIGdpdmVuIGFuZ3VsYXIgc3RlcCB0byB0aGUgZ2l2ZW4gcXVhdGVybmlvbi5cclxuXHQgKiBUaGUgbWV0aG9kIGVuc3VyZXMgdGhhdCB0aGUgZmluYWwgcXVhdGVybmlvbiB3aWxsIG5vdCBvdmVyc2hvb3QgYHFgLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtRdWF0ZXJuaW9ufSBxIC0gVGhlIHRhcmdldCBxdWF0ZXJuaW9uLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzdGVwIC0gVGhlIGFuZ3VsYXIgc3RlcCBpbiByYWRpYW5zLlxyXG5cdCAqIEByZXR1cm4ge1F1YXRlcm5pb259IEEgcmVmZXJlbmNlIHRvIHRoaXMgcXVhdGVybmlvbi5cclxuXHQgKi9cclxuXHRyb3RhdGVUb3dhcmRzKCBxLCBzdGVwICkge1xyXG5cclxuXHRcdGNvbnN0IGFuZ2xlID0gdGhpcy5hbmdsZVRvKCBxICk7XHJcblxyXG5cdFx0aWYgKCBhbmdsZSA9PT0gMCApIHJldHVybiB0aGlzO1xyXG5cclxuXHRcdGNvbnN0IHQgPSBNYXRoLm1pbiggMSwgc3RlcCAvIGFuZ2xlICk7XHJcblxyXG5cdFx0dGhpcy5zbGVycCggcSwgdCApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhpcyBxdWF0ZXJuaW9uIHRvIHRoZSBpZGVudGl0eSBxdWF0ZXJuaW9uOyB0aGF0IGlzLCB0byB0aGVcclxuXHQgKiBxdWF0ZXJuaW9uIHRoYXQgcmVwcmVzZW50cyBcIm5vIHJvdGF0aW9uXCIuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtRdWF0ZXJuaW9ufSBBIHJlZmVyZW5jZSB0byB0aGlzIHF1YXRlcm5pb24uXHJcblx0ICovXHJcblx0aWRlbnRpdHkoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuc2V0KCAwLCAwLCAwLCAxICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW52ZXJ0cyB0aGlzIHF1YXRlcm5pb24gdmlhIHtAbGluayBRdWF0ZXJuaW9uI2Nvbmp1Z2F0ZX0uIFRoZVxyXG5cdCAqIHF1YXRlcm5pb24gaXMgYXNzdW1lZCB0byBoYXZlIHVuaXQgbGVuZ3RoLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7UXVhdGVybmlvbn0gQSByZWZlcmVuY2UgdG8gdGhpcyBxdWF0ZXJuaW9uLlxyXG5cdCAqL1xyXG5cdGludmVydCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5jb25qdWdhdGUoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSByb3RhdGlvbmFsIGNvbmp1Z2F0ZSBvZiB0aGlzIHF1YXRlcm5pb24uIFRoZSBjb25qdWdhdGUgb2YgYVxyXG5cdCAqIHF1YXRlcm5pb24gcmVwcmVzZW50cyB0aGUgc2FtZSByb3RhdGlvbiBpbiB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uIGFib3V0XHJcblx0ICogdGhlIHJvdGF0aW9uYWwgYXhpcy5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1F1YXRlcm5pb259IEEgcmVmZXJlbmNlIHRvIHRoaXMgcXVhdGVybmlvbi5cclxuXHQgKi9cclxuXHRjb25qdWdhdGUoKSB7XHJcblxyXG5cdFx0dGhpcy5feCAqPSAtIDE7XHJcblx0XHR0aGlzLl95ICo9IC0gMTtcclxuXHRcdHRoaXMuX3ogKj0gLSAxO1xyXG5cclxuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDYWxjdWxhdGVzIHRoZSBkb3QgcHJvZHVjdCBvZiB0aGlzIHF1YXRlcm5pb24gYW5kIHRoZSBnaXZlbiBvbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1F1YXRlcm5pb259IHYgLSBUaGUgcXVhdGVybmlvbiB0byBjb21wdXRlIHRoZSBkb3QgcHJvZHVjdCB3aXRoLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIHJlc3VsdCBvZiB0aGUgZG90IHByb2R1Y3QuXHJcblx0ICovXHJcblx0ZG90KCB2ICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl94ICogdi5feCArIHRoaXMuX3kgKiB2Ll95ICsgdGhpcy5feiAqIHYuX3ogKyB0aGlzLl93ICogdi5fdztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB0aGUgc3F1YXJlZCBFdWNsaWRlYW4gbGVuZ3RoIChzdHJhaWdodC1saW5lIGxlbmd0aCkgb2YgdGhpcyBxdWF0ZXJuaW9uLFxyXG5cdCAqIGNvbnNpZGVyZWQgYXMgYSA0IGRpbWVuc2lvbmFsIHZlY3Rvci4gVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSBhcmUgY29tcGFyaW5nIHRoZVxyXG5cdCAqIGxlbmd0aHMgb2YgdHdvIHF1YXRlcm5pb25zLCBhcyB0aGlzIGlzIGEgc2xpZ2h0bHkgbW9yZSBlZmZpY2llbnQgY2FsY3VsYXRpb24gdGhhblxyXG5cdCAqIHtAbGluayBRdWF0ZXJuaW9uI2xlbmd0aH0uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBzcXVhcmVkIEV1Y2xpZGVhbiBsZW5ndGguXHJcblx0ICovXHJcblx0bGVuZ3RoU3EoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX3ggKiB0aGlzLl94ICsgdGhpcy5feSAqIHRoaXMuX3kgKyB0aGlzLl96ICogdGhpcy5feiArIHRoaXMuX3cgKiB0aGlzLl93O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSBFdWNsaWRlYW4gbGVuZ3RoIChzdHJhaWdodC1saW5lIGxlbmd0aCkgb2YgdGhpcyBxdWF0ZXJuaW9uLFxyXG5cdCAqIGNvbnNpZGVyZWQgYXMgYSA0IGRpbWVuc2lvbmFsIHZlY3Rvci5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIEV1Y2xpZGVhbiBsZW5ndGguXHJcblx0ICovXHJcblx0bGVuZ3RoKCkge1xyXG5cclxuXHRcdHJldHVybiBNYXRoLnNxcnQoIHRoaXMuX3ggKiB0aGlzLl94ICsgdGhpcy5feSAqIHRoaXMuX3kgKyB0aGlzLl96ICogdGhpcy5feiArIHRoaXMuX3cgKiB0aGlzLl93ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTm9ybWFsaXplcyB0aGlzIHF1YXRlcm5pb24gLSB0aGF0IGlzLCBjYWxjdWxhdGVkIHRoZSBxdWF0ZXJuaW9uIHRoYXQgcGVyZm9ybXNcclxuXHQgKiB0aGUgc2FtZSByb3RhdGlvbiBhcyB0aGlzIG9uZSwgYnV0IGhhcyBhIGxlbmd0aCBlcXVhbCB0byBgMWAuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtRdWF0ZXJuaW9ufSBBIHJlZmVyZW5jZSB0byB0aGlzIHF1YXRlcm5pb24uXHJcblx0ICovXHJcblx0bm9ybWFsaXplKCkge1xyXG5cclxuXHRcdGxldCBsID0gdGhpcy5sZW5ndGgoKTtcclxuXHJcblx0XHRpZiAoIGwgPT09IDAgKSB7XHJcblxyXG5cdFx0XHR0aGlzLl94ID0gMDtcclxuXHRcdFx0dGhpcy5feSA9IDA7XHJcblx0XHRcdHRoaXMuX3ogPSAwO1xyXG5cdFx0XHR0aGlzLl93ID0gMTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0bCA9IDEgLyBsO1xyXG5cclxuXHRcdFx0dGhpcy5feCA9IHRoaXMuX3ggKiBsO1xyXG5cdFx0XHR0aGlzLl95ID0gdGhpcy5feSAqIGw7XHJcblx0XHRcdHRoaXMuX3ogPSB0aGlzLl96ICogbDtcclxuXHRcdFx0dGhpcy5fdyA9IHRoaXMuX3cgKiBsO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTXVsdGlwbGllcyB0aGlzIHF1YXRlcm5pb24gYnkgdGhlIGdpdmVuIG9uZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UXVhdGVybmlvbn0gcSAtIFRoZSBxdWF0ZXJuaW9uLlxyXG5cdCAqIEByZXR1cm4ge1F1YXRlcm5pb259IEEgcmVmZXJlbmNlIHRvIHRoaXMgcXVhdGVybmlvbi5cclxuXHQgKi9cclxuXHRtdWx0aXBseSggcSApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKCB0aGlzLCBxICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUHJlLW11bHRpcGxpZXMgdGhpcyBxdWF0ZXJuaW9uIGJ5IHRoZSBnaXZlbiBvbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1F1YXRlcm5pb259IHEgLSBUaGUgcXVhdGVybmlvbi5cclxuXHQgKiBAcmV0dXJuIHtRdWF0ZXJuaW9ufSBBIHJlZmVyZW5jZSB0byB0aGlzIHF1YXRlcm5pb24uXHJcblx0ICovXHJcblx0cHJlbXVsdGlwbHkoIHEgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyggcSwgdGhpcyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE11bHRpcGxpZXMgdGhlIGdpdmVuIHF1YXRlcm5pb25zIGFuZCBzdG9yZXMgdGhlIHJlc3VsdCBpbiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtRdWF0ZXJuaW9ufSBhIC0gVGhlIGZpcnN0IHF1YXRlcm5pb24uXHJcblx0ICogQHBhcmFtIHtRdWF0ZXJuaW9ufSBiIC0gVGhlIHNlY29uZCBxdWF0ZXJuaW9uLlxyXG5cdCAqIEByZXR1cm4ge1F1YXRlcm5pb259IEEgcmVmZXJlbmNlIHRvIHRoaXMgcXVhdGVybmlvbi5cclxuXHQgKi9cclxuXHRtdWx0aXBseVF1YXRlcm5pb25zKCBhLCBiICkge1xyXG5cclxuXHRcdC8vIGZyb20gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvYWxnZWJyYS9yZWFsTm9ybWVkQWxnZWJyYS9xdWF0ZXJuaW9ucy9jb2RlL2luZGV4Lmh0bVxyXG5cclxuXHRcdGNvbnN0IHFheCA9IGEuX3gsIHFheSA9IGEuX3ksIHFheiA9IGEuX3osIHFhdyA9IGEuX3c7XHJcblx0XHRjb25zdCBxYnggPSBiLl94LCBxYnkgPSBiLl95LCBxYnogPSBiLl96LCBxYncgPSBiLl93O1xyXG5cclxuXHRcdHRoaXMuX3ggPSBxYXggKiBxYncgKyBxYXcgKiBxYnggKyBxYXkgKiBxYnogLSBxYXogKiBxYnk7XHJcblx0XHR0aGlzLl95ID0gcWF5ICogcWJ3ICsgcWF3ICogcWJ5ICsgcWF6ICogcWJ4IC0gcWF4ICogcWJ6O1xyXG5cdFx0dGhpcy5feiA9IHFheiAqIHFidyArIHFhdyAqIHFieiArIHFheCAqIHFieSAtIHFheSAqIHFieDtcclxuXHRcdHRoaXMuX3cgPSBxYXcgKiBxYncgLSBxYXggKiBxYnggLSBxYXkgKiBxYnkgLSBxYXogKiBxYno7XHJcblxyXG5cdFx0dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBlcmZvcm1zIGEgc3BoZXJpY2FsIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gcXVhdGVybmlvbnMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1F1YXRlcm5pb259IHFiIC0gVGhlIHRhcmdldCBxdWF0ZXJuaW9uLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0IC0gVGhlIGludGVycG9sYXRpb24gZmFjdG9yIGluIHRoZSBjbG9zZWQgaW50ZXJ2YWwgYFswLCAxXWAuXHJcblx0ICogQHJldHVybiB7UXVhdGVybmlvbn0gQSByZWZlcmVuY2UgdG8gdGhpcyBxdWF0ZXJuaW9uLlxyXG5cdCAqL1xyXG5cdHNsZXJwKCBxYiwgdCApIHtcclxuXHJcblx0XHRpZiAoIHQgPT09IDAgKSByZXR1cm4gdGhpcztcclxuXHRcdGlmICggdCA9PT0gMSApIHJldHVybiB0aGlzLmNvcHkoIHFiICk7XHJcblxyXG5cdFx0Y29uc3QgeCA9IHRoaXMuX3gsIHkgPSB0aGlzLl95LCB6ID0gdGhpcy5feiwgdyA9IHRoaXMuX3c7XHJcblxyXG5cdFx0Ly8gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvYWxnZWJyYS9yZWFsTm9ybWVkQWxnZWJyYS9xdWF0ZXJuaW9ucy9zbGVycC9cclxuXHJcblx0XHRsZXQgY29zSGFsZlRoZXRhID0gdyAqIHFiLl93ICsgeCAqIHFiLl94ICsgeSAqIHFiLl95ICsgeiAqIHFiLl96O1xyXG5cclxuXHRcdGlmICggY29zSGFsZlRoZXRhIDwgMCApIHtcclxuXHJcblx0XHRcdHRoaXMuX3cgPSAtIHFiLl93O1xyXG5cdFx0XHR0aGlzLl94ID0gLSBxYi5feDtcclxuXHRcdFx0dGhpcy5feSA9IC0gcWIuX3k7XHJcblx0XHRcdHRoaXMuX3ogPSAtIHFiLl96O1xyXG5cclxuXHRcdFx0Y29zSGFsZlRoZXRhID0gLSBjb3NIYWxmVGhldGE7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHRoaXMuY29weSggcWIgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBjb3NIYWxmVGhldGEgPj0gMS4wICkge1xyXG5cclxuXHRcdFx0dGhpcy5fdyA9IHc7XHJcblx0XHRcdHRoaXMuX3ggPSB4O1xyXG5cdFx0XHR0aGlzLl95ID0geTtcclxuXHRcdFx0dGhpcy5feiA9IHo7XHJcblxyXG5cdFx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3Qgc3FyU2luSGFsZlRoZXRhID0gMS4wIC0gY29zSGFsZlRoZXRhICogY29zSGFsZlRoZXRhO1xyXG5cclxuXHRcdGlmICggc3FyU2luSGFsZlRoZXRhIDw9IE51bWJlci5FUFNJTE9OICkge1xyXG5cclxuXHRcdFx0Y29uc3QgcyA9IDEgLSB0O1xyXG5cdFx0XHR0aGlzLl93ID0gcyAqIHcgKyB0ICogdGhpcy5fdztcclxuXHRcdFx0dGhpcy5feCA9IHMgKiB4ICsgdCAqIHRoaXMuX3g7XHJcblx0XHRcdHRoaXMuX3kgPSBzICogeSArIHQgKiB0aGlzLl95O1xyXG5cdFx0XHR0aGlzLl96ID0gcyAqIHogKyB0ICogdGhpcy5fejtcclxuXHJcblx0XHRcdHRoaXMubm9ybWFsaXplKCk7IC8vIG5vcm1hbGl6ZSBjYWxscyBfb25DaGFuZ2VDYWxsYmFjaygpXHJcblxyXG5cdFx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3Qgc2luSGFsZlRoZXRhID0gTWF0aC5zcXJ0KCBzcXJTaW5IYWxmVGhldGEgKTtcclxuXHRcdGNvbnN0IGhhbGZUaGV0YSA9IE1hdGguYXRhbjIoIHNpbkhhbGZUaGV0YSwgY29zSGFsZlRoZXRhICk7XHJcblx0XHRjb25zdCByYXRpb0EgPSBNYXRoLnNpbiggKCAxIC0gdCApICogaGFsZlRoZXRhICkgLyBzaW5IYWxmVGhldGEsXHJcblx0XHRcdHJhdGlvQiA9IE1hdGguc2luKCB0ICogaGFsZlRoZXRhICkgLyBzaW5IYWxmVGhldGE7XHJcblxyXG5cdFx0dGhpcy5fdyA9ICggdyAqIHJhdGlvQSArIHRoaXMuX3cgKiByYXRpb0IgKTtcclxuXHRcdHRoaXMuX3ggPSAoIHggKiByYXRpb0EgKyB0aGlzLl94ICogcmF0aW9CICk7XHJcblx0XHR0aGlzLl95ID0gKCB5ICogcmF0aW9BICsgdGhpcy5feSAqIHJhdGlvQiApO1xyXG5cdFx0dGhpcy5feiA9ICggeiAqIHJhdGlvQSArIHRoaXMuX3ogKiByYXRpb0IgKTtcclxuXHJcblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUGVyZm9ybXMgYSBzcGhlcmljYWwgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0aGUgZ2l2ZW4gcXVhdGVybmlvbnNcclxuXHQgKiBhbmQgc3RvcmVzIHRoZSByZXN1bHQgaW4gdGhpcyBxdWF0ZXJuaW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtRdWF0ZXJuaW9ufSBxYSAtIFRoZSBzb3VyY2UgcXVhdGVybmlvbi5cclxuXHQgKiBAcGFyYW0ge1F1YXRlcm5pb259IHFiIC0gVGhlIHRhcmdldCBxdWF0ZXJuaW9uLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0IC0gVGhlIGludGVycG9sYXRpb24gZmFjdG9yIGluIHRoZSBjbG9zZWQgaW50ZXJ2YWwgYFswLCAxXWAuXHJcblx0ICogQHJldHVybiB7UXVhdGVybmlvbn0gQSByZWZlcmVuY2UgdG8gdGhpcyBxdWF0ZXJuaW9uLlxyXG5cdCAqL1xyXG5cdHNsZXJwUXVhdGVybmlvbnMoIHFhLCBxYiwgdCApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5jb3B5KCBxYSApLnNsZXJwKCBxYiwgdCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhpcyBxdWF0ZXJuaW9uIHRvIGEgdW5pZm9ybWx5IHJhbmRvbSwgbm9ybWFsaXplZCBxdWF0ZXJuaW9uLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7UXVhdGVybmlvbn0gQSByZWZlcmVuY2UgdG8gdGhpcyBxdWF0ZXJuaW9uLlxyXG5cdCAqL1xyXG5cdHJhbmRvbSgpIHtcclxuXHJcblx0XHQvLyBLZW4gU2hvZW1ha2VcclxuXHRcdC8vIFVuaWZvcm0gcmFuZG9tIHJvdGF0aW9uc1xyXG5cdFx0Ly8gRC4gS2lyaywgZWRpdG9yLCBHcmFwaGljcyBHZW1zIElJSSwgcGFnZXMgMTI0LTEzMi4gQWNhZGVtaWMgUHJlc3MsIE5ldyBZb3JrLCAxOTkyLlxyXG5cclxuXHRcdGNvbnN0IHRoZXRhMSA9IDIgKiBNYXRoLlBJICogTWF0aC5yYW5kb20oKTtcclxuXHRcdGNvbnN0IHRoZXRhMiA9IDIgKiBNYXRoLlBJICogTWF0aC5yYW5kb20oKTtcclxuXHJcblx0XHRjb25zdCB4MCA9IE1hdGgucmFuZG9tKCk7XHJcblx0XHRjb25zdCByMSA9IE1hdGguc3FydCggMSAtIHgwICk7XHJcblx0XHRjb25zdCByMiA9IE1hdGguc3FydCggeDAgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5zZXQoXHJcblx0XHRcdHIxICogTWF0aC5zaW4oIHRoZXRhMSApLFxyXG5cdFx0XHRyMSAqIE1hdGguY29zKCB0aGV0YTEgKSxcclxuXHRcdFx0cjIgKiBNYXRoLnNpbiggdGhldGEyICksXHJcblx0XHRcdHIyICogTWF0aC5jb3MoIHRoZXRhMiApLFxyXG5cdFx0KTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIHF1YXRlcm5pb24gaXMgZXF1YWwgd2l0aCB0aGUgZ2l2ZW4gb25lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtRdWF0ZXJuaW9ufSBxdWF0ZXJuaW9uIC0gVGhlIHF1YXRlcm5pb24gdG8gdGVzdCBmb3IgZXF1YWxpdHkuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGlzIHF1YXRlcm5pb24gaXMgZXF1YWwgd2l0aCB0aGUgZ2l2ZW4gb25lLlxyXG5cdCAqL1xyXG5cdGVxdWFscyggcXVhdGVybmlvbiApIHtcclxuXHJcblx0XHRyZXR1cm4gKCBxdWF0ZXJuaW9uLl94ID09PSB0aGlzLl94ICkgJiYgKCBxdWF0ZXJuaW9uLl95ID09PSB0aGlzLl95ICkgJiYgKCBxdWF0ZXJuaW9uLl96ID09PSB0aGlzLl96ICkgJiYgKCBxdWF0ZXJuaW9uLl93ID09PSB0aGlzLl93ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGlzIHF1YXRlcm5pb24ncyBjb21wb25lbnRzIGZyb20gdGhlIGdpdmVuIGFycmF5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBhcnJheSAtIEFuIGFycmF5IGhvbGRpbmcgdGhlIHF1YXRlcm5pb24gY29tcG9uZW50IHZhbHVlcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW29mZnNldD0wXSAtIFRoZSBvZmZzZXQgaW50byB0aGUgYXJyYXkuXHJcblx0ICogQHJldHVybiB7UXVhdGVybmlvbn0gQSByZWZlcmVuY2UgdG8gdGhpcyBxdWF0ZXJuaW9uLlxyXG5cdCAqL1xyXG5cdGZyb21BcnJheSggYXJyYXksIG9mZnNldCA9IDAgKSB7XHJcblxyXG5cdFx0dGhpcy5feCA9IGFycmF5WyBvZmZzZXQgXTtcclxuXHRcdHRoaXMuX3kgPSBhcnJheVsgb2Zmc2V0ICsgMSBdO1xyXG5cdFx0dGhpcy5feiA9IGFycmF5WyBvZmZzZXQgKyAyIF07XHJcblx0XHR0aGlzLl93ID0gYXJyYXlbIG9mZnNldCArIDMgXTtcclxuXHJcblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogV3JpdGVzIHRoZSBjb21wb25lbnRzIG9mIHRoaXMgcXVhdGVybmlvbiB0byB0aGUgZ2l2ZW4gYXJyYXkuIElmIG5vIGFycmF5IGlzIHByb3ZpZGVkLFxyXG5cdCAqIHRoZSBtZXRob2QgcmV0dXJucyBhIG5ldyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gW2FycmF5PVtdXSAtIFRoZSB0YXJnZXQgYXJyYXkgaG9sZGluZyB0aGUgcXVhdGVybmlvbiBjb21wb25lbnRzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0PTBdIC0gSW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGFycmF5LlxyXG5cdCAqIEByZXR1cm4ge0FycmF5PG51bWJlcj59IFRoZSBxdWF0ZXJuaW9uIGNvbXBvbmVudHMuXHJcblx0ICovXHJcblx0dG9BcnJheSggYXJyYXkgPSBbXSwgb2Zmc2V0ID0gMCApIHtcclxuXHJcblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0aGlzLl94O1xyXG5cdFx0YXJyYXlbIG9mZnNldCArIDEgXSA9IHRoaXMuX3k7XHJcblx0XHRhcnJheVsgb2Zmc2V0ICsgMiBdID0gdGhpcy5fejtcclxuXHRcdGFycmF5WyBvZmZzZXQgKyAzIF0gPSB0aGlzLl93O1xyXG5cclxuXHRcdHJldHVybiBhcnJheTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBjb21wb25lbnRzIG9mIHRoaXMgcXVhdGVybmlvbiBmcm9tIHRoZSBnaXZlbiBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCdWZmZXJBdHRyaWJ1dGV9IGF0dHJpYnV0ZSAtIFRoZSBidWZmZXIgYXR0cmlidXRlIGhvbGRpbmcgcXVhdGVybmlvbiBkYXRhLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBpbnRvIHRoZSBhdHRyaWJ1dGUuXHJcblx0ICogQHJldHVybiB7UXVhdGVybmlvbn0gQSByZWZlcmVuY2UgdG8gdGhpcyBxdWF0ZXJuaW9uLlxyXG5cdCAqL1xyXG5cdGZyb21CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgaW5kZXggKSB7XHJcblxyXG5cdFx0dGhpcy5feCA9IGF0dHJpYnV0ZS5nZXRYKCBpbmRleCApO1xyXG5cdFx0dGhpcy5feSA9IGF0dHJpYnV0ZS5nZXRZKCBpbmRleCApO1xyXG5cdFx0dGhpcy5feiA9IGF0dHJpYnV0ZS5nZXRaKCBpbmRleCApO1xyXG5cdFx0dGhpcy5fdyA9IGF0dHJpYnV0ZS5nZXRXKCBpbmRleCApO1xyXG5cclxuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZHMgZGVmaW5lcyB0aGUgc2VyaWFsaXphdGlvbiByZXN1bHQgb2YgdGhpcyBjbGFzcy4gUmV0dXJucyB0aGVcclxuXHQgKiBudW1lcmljYWwgZWxlbWVudHMgb2YgdGhpcyBxdWF0ZXJuaW9uIGluIGFuIGFycmF5IG9mIGZvcm1hdCBgW3gsIHksIHosIHddYC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0FycmF5PG51bWJlcj59IFRoZSBzZXJpYWxpemVkIHF1YXRlcm5pb24uXHJcblx0ICovXHJcblx0dG9KU09OKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnRvQXJyYXkoKTtcclxuXHJcblx0fVxyXG5cclxuXHRfb25DaGFuZ2UoIGNhbGxiYWNrICkge1xyXG5cclxuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2sgPSBjYWxsYmFjaztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHRfb25DaGFuZ2VDYWxsYmFjaygpIHt9XHJcblxyXG5cdCpbIFN5bWJvbC5pdGVyYXRvciBdKCkge1xyXG5cclxuXHRcdHlpZWxkIHRoaXMuX3g7XHJcblx0XHR5aWVsZCB0aGlzLl95O1xyXG5cdFx0eWllbGQgdGhpcy5fejtcclxuXHRcdHlpZWxkIHRoaXMuX3c7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFF1YXRlcm5pb24gfTtcclxuIiwiaW1wb3J0IHsgY2xhbXAgfSBmcm9tICcuL01hdGhVdGlscy5qcyc7XHJcbmltcG9ydCB7IFF1YXRlcm5pb24gfSBmcm9tICcuL1F1YXRlcm5pb24uanMnO1xyXG5cclxuLyoqXHJcbiAqIENsYXNzIHJlcHJlc2VudGluZyBhIDNEIHZlY3Rvci4gQSAzRCB2ZWN0b3IgaXMgYW4gb3JkZXJlZCB0cmlwbGV0IG9mIG51bWJlcnNcclxuICogKGxhYmVsZWQgeCwgeSBhbmQgeiksIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlcHJlc2VudCBhIG51bWJlciBvZiB0aGluZ3MsIHN1Y2ggYXM6XHJcbiAqXHJcbiAqIC0gQSBwb2ludCBpbiAzRCBzcGFjZS5cclxuICogLSBBIGRpcmVjdGlvbiBhbmQgbGVuZ3RoIGluIDNEIHNwYWNlLiBJbiB0aHJlZS5qcyB0aGUgbGVuZ3RoIHdpbGxcclxuICogYWx3YXlzIGJlIHRoZSBFdWNsaWRlYW4gZGlzdGFuY2Uoc3RyYWlnaHQtbGluZSBkaXN0YW5jZSkgZnJvbSBgKDAsIDAsIDApYCB0byBgKHgsIHksIHopYFxyXG4gKiBhbmQgdGhlIGRpcmVjdGlvbiBpcyBhbHNvIG1lYXN1cmVkIGZyb20gYCgwLCAwLCAwKWAgdG93YXJkcyBgKHgsIHksIHopYC5cclxuICogLSBBbnkgYXJiaXRyYXJ5IG9yZGVyZWQgdHJpcGxldCBvZiBudW1iZXJzLlxyXG4gKlxyXG4gKiBUaGVyZSBhcmUgb3RoZXIgdGhpbmdzIGEgM0QgdmVjdG9yIGNhbiBiZSB1c2VkIHRvIHJlcHJlc2VudCwgc3VjaCBhc1xyXG4gKiBtb21lbnR1bSB2ZWN0b3JzIGFuZCBzbyBvbiwgaG93ZXZlciB0aGVzZSBhcmUgdGhlIG1vc3RcclxuICogY29tbW9uIHVzZXMgaW4gdGhyZWUuanMuXHJcbiAqXHJcbiAqIEl0ZXJhdGluZyB0aHJvdWdoIGEgdmVjdG9yIGluc3RhbmNlIHdpbGwgeWllbGQgaXRzIGNvbXBvbmVudHMgYCh4LCB5LCB6KWAgaW5cclxuICogdGhlIGNvcnJlc3BvbmRpbmcgb3JkZXIuXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGEgPSBuZXcgVEhSRUUuVmVjdG9yMyggMCwgMSwgMCApO1xyXG4gKlxyXG4gKiAvL25vIGFyZ3VtZW50czsgd2lsbCBiZSBpbml0aWFsaXNlZCB0byAoMCwgMCwgMClcclxuICogY29uc3QgYiA9IG5ldyBUSFJFRS5WZWN0b3IzKCApO1xyXG4gKlxyXG4gKiBjb25zdCBkID0gYS5kaXN0YW5jZVRvKCBiICk7XHJcbiAqIGBgYFxyXG4gKi9cclxuY2xhc3MgVmVjdG9yMyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgM0QgdmVjdG9yLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt4PTBdIC0gVGhlIHggdmFsdWUgb2YgdGhpcyB2ZWN0b3IuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt5PTBdIC0gVGhlIHkgdmFsdWUgb2YgdGhpcyB2ZWN0b3IuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt6PTBdIC0gVGhlIHogdmFsdWUgb2YgdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHggPSAwLCB5ID0gMCwgeiA9IDAgKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHRWZWN0b3IzLnByb3RvdHlwZS5pc1ZlY3RvcjMgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHggdmFsdWUgb2YgdGhpcyB2ZWN0b3IuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy54ID0geDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB5IHZhbHVlIG9mIHRoaXMgdmVjdG9yLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMueSA9IHk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgeiB2YWx1ZSBvZiB0aGlzIHZlY3Rvci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnogPSB6O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHZlY3RvciBjb21wb25lbnRzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgdmFsdWUgb2YgdGhlIHggY29tcG9uZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHZhbHVlIG9mIHRoZSB5IGNvbXBvbmVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geiAtIFRoZSB2YWx1ZSBvZiB0aGUgeiBjb21wb25lbnQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0c2V0KCB4LCB5LCB6ICkge1xyXG5cclxuXHRcdGlmICggeiA9PT0gdW5kZWZpbmVkICkgeiA9IHRoaXMuejsgLy8gc3ByaXRlLnNjYWxlLnNldCh4LHkpXHJcblxyXG5cdFx0dGhpcy54ID0geDtcclxuXHRcdHRoaXMueSA9IHk7XHJcblx0XHR0aGlzLnogPSB6O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHZlY3RvciBjb21wb25lbnRzIHRvIHRoZSBzYW1lIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHNjYWxhciAtIFRoZSB2YWx1ZSB0byBzZXQgZm9yIGFsbCB2ZWN0b3IgY29tcG9uZW50cy5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRzZXRTY2FsYXIoIHNjYWxhciApIHtcclxuXHJcblx0XHR0aGlzLnggPSBzY2FsYXI7XHJcblx0XHR0aGlzLnkgPSBzY2FsYXI7XHJcblx0XHR0aGlzLnogPSBzY2FsYXI7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdmVjdG9yJ3MgeCBjb21wb25lbnQgdG8gdGhlIGdpdmVuIHZhbHVlXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB2YWx1ZSB0byBzZXQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0c2V0WCggeCApIHtcclxuXHJcblx0XHR0aGlzLnggPSB4O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHZlY3RvcidzIHkgY29tcG9uZW50IHRvIHRoZSBnaXZlbiB2YWx1ZVxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmFsdWUgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHNldFkoIHkgKSB7XHJcblxyXG5cdFx0dGhpcy55ID0geTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB2ZWN0b3IncyB6IGNvbXBvbmVudCB0byB0aGUgZ2l2ZW4gdmFsdWVcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB6IC0gVGhlIHZhbHVlIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRzZXRaKCB6ICkge1xyXG5cclxuXHRcdHRoaXMueiA9IHo7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWxsb3dzIHRvIHNldCBhIHZlY3RvciBjb21wb25lbnQgd2l0aCBhbiBpbmRleC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBjb21wb25lbnQgaW5kZXguIGAwYCBlcXVhbHMgdG8geCwgYDFgIGVxdWFscyB0byB5LCBgMmAgZXF1YWxzIHRvIHouXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRzZXRDb21wb25lbnQoIGluZGV4LCB2YWx1ZSApIHtcclxuXHJcblx0XHRzd2l0Y2ggKCBpbmRleCApIHtcclxuXHJcblx0XHRcdGNhc2UgMDogdGhpcy54ID0gdmFsdWU7IGJyZWFrO1xyXG5cdFx0XHRjYXNlIDE6IHRoaXMueSA9IHZhbHVlOyBicmVhaztcclxuXHRcdFx0Y2FzZSAyOiB0aGlzLnogPSB2YWx1ZTsgYnJlYWs7XHJcblx0XHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvciggJ2luZGV4IGlzIG91dCBvZiByYW5nZTogJyArIGluZGV4ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSB2ZWN0b3IgY29tcG9uZW50IHdoaWNoIG1hdGNoZXMgdGhlIGdpdmVuIGluZGV4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGNvbXBvbmVudCBpbmRleC4gYDBgIGVxdWFscyB0byB4LCBgMWAgZXF1YWxzIHRvIHksIGAyYCBlcXVhbHMgdG8gei5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IEEgdmVjdG9yIGNvbXBvbmVudCB2YWx1ZS5cclxuXHQgKi9cclxuXHRnZXRDb21wb25lbnQoIGluZGV4ICkge1xyXG5cclxuXHRcdHN3aXRjaCAoIGluZGV4ICkge1xyXG5cclxuXHRcdFx0Y2FzZSAwOiByZXR1cm4gdGhpcy54O1xyXG5cdFx0XHRjYXNlIDE6IHJldHVybiB0aGlzLnk7XHJcblx0XHRcdGNhc2UgMjogcmV0dXJuIHRoaXMuejtcclxuXHRcdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCAnaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAnICsgaW5kZXggKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIG5ldyB2ZWN0b3Igd2l0aCBjb3BpZWQgdmFsdWVzIGZyb20gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgY2xvbmUgb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjbG9uZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMueCwgdGhpcy55LCB0aGlzLnogKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gdmVjdG9yIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHYgLSBUaGUgdmVjdG9yIHRvIGNvcHkuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0Y29weSggdiApIHtcclxuXHJcblx0XHR0aGlzLnggPSB2Lng7XHJcblx0XHR0aGlzLnkgPSB2Lnk7XHJcblx0XHR0aGlzLnogPSB2Lno7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyB0aGUgZ2l2ZW4gdmVjdG9yIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHYgLSBUaGUgdmVjdG9yIHRvIGFkZC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRhZGQoIHYgKSB7XHJcblxyXG5cdFx0dGhpcy54ICs9IHYueDtcclxuXHRcdHRoaXMueSArPSB2Lnk7XHJcblx0XHR0aGlzLnogKz0gdi56O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgdGhlIGdpdmVuIHNjYWxhciB2YWx1ZSB0byBhbGwgY29tcG9uZW50cyBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHMgLSBUaGUgc2NhbGFyIHRvIGFkZC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRhZGRTY2FsYXIoIHMgKSB7XHJcblxyXG5cdFx0dGhpcy54ICs9IHM7XHJcblx0XHR0aGlzLnkgKz0gcztcclxuXHRcdHRoaXMueiArPSBzO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgdGhlIGdpdmVuIHZlY3RvcnMgYW5kIHN0b3JlcyB0aGUgcmVzdWx0IGluIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IGEgLSBUaGUgZmlyc3QgdmVjdG9yLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gYiAtIFRoZSBzZWNvbmQgdmVjdG9yLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGFkZFZlY3RvcnMoIGEsIGIgKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gYS54ICsgYi54O1xyXG5cdFx0dGhpcy55ID0gYS55ICsgYi55O1xyXG5cdFx0dGhpcy56ID0gYS56ICsgYi56O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgdGhlIGdpdmVuIHZlY3RvciBzY2FsZWQgYnkgdGhlIGdpdmVuIGZhY3RvciB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfFZlY3RvcjR9IHYgLSBUaGUgdmVjdG9yLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzIC0gVGhlIGZhY3RvciB0aGF0IHNjYWxlcyBgdmAuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0YWRkU2NhbGVkVmVjdG9yKCB2LCBzICkge1xyXG5cclxuXHRcdHRoaXMueCArPSB2LnggKiBzO1xyXG5cdFx0dGhpcy55ICs9IHYueSAqIHM7XHJcblx0XHR0aGlzLnogKz0gdi56ICogcztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTdWJ0cmFjdHMgdGhlIGdpdmVuIHZlY3RvciBmcm9tIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHYgLSBUaGUgdmVjdG9yIHRvIHN1YnRyYWN0LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHN1YiggdiApIHtcclxuXHJcblx0XHR0aGlzLnggLT0gdi54O1xyXG5cdFx0dGhpcy55IC09IHYueTtcclxuXHRcdHRoaXMueiAtPSB2Lno7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3VidHJhY3RzIHRoZSBnaXZlbiBzY2FsYXIgdmFsdWUgZnJvbSBhbGwgY29tcG9uZW50cyBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHMgLSBUaGUgc2NhbGFyIHRvIHN1YnRyYWN0LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHN1YlNjYWxhciggcyApIHtcclxuXHJcblx0XHR0aGlzLnggLT0gcztcclxuXHRcdHRoaXMueSAtPSBzO1xyXG5cdFx0dGhpcy56IC09IHM7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3VidHJhY3RzIHRoZSBnaXZlbiB2ZWN0b3JzIGFuZCBzdG9yZXMgdGhlIHJlc3VsdCBpbiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBhIC0gVGhlIGZpcnN0IHZlY3Rvci5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IGIgLSBUaGUgc2Vjb25kIHZlY3Rvci5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRzdWJWZWN0b3JzKCBhLCBiICkge1xyXG5cclxuXHRcdHRoaXMueCA9IGEueCAtIGIueDtcclxuXHRcdHRoaXMueSA9IGEueSAtIGIueTtcclxuXHRcdHRoaXMueiA9IGEueiAtIGIuejtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBNdWx0aXBsaWVzIHRoZSBnaXZlbiB2ZWN0b3Igd2l0aCB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB2IC0gVGhlIHZlY3RvciB0byBtdWx0aXBseS5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRtdWx0aXBseSggdiApIHtcclxuXHJcblx0XHR0aGlzLnggKj0gdi54O1xyXG5cdFx0dGhpcy55ICo9IHYueTtcclxuXHRcdHRoaXMueiAqPSB2Lno7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTXVsdGlwbGllcyB0aGUgZ2l2ZW4gc2NhbGFyIHZhbHVlIHdpdGggYWxsIGNvbXBvbmVudHMgb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzY2FsYXIgLSBUaGUgc2NhbGFyIHRvIG11bHRpcGx5LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdG11bHRpcGx5U2NhbGFyKCBzY2FsYXIgKSB7XHJcblxyXG5cdFx0dGhpcy54ICo9IHNjYWxhcjtcclxuXHRcdHRoaXMueSAqPSBzY2FsYXI7XHJcblx0XHR0aGlzLnogKj0gc2NhbGFyO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE11bHRpcGxpZXMgdGhlIGdpdmVuIHZlY3RvcnMgYW5kIHN0b3JlcyB0aGUgcmVzdWx0IGluIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IGEgLSBUaGUgZmlyc3QgdmVjdG9yLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gYiAtIFRoZSBzZWNvbmQgdmVjdG9yLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdG11bHRpcGx5VmVjdG9ycyggYSwgYiApIHtcclxuXHJcblx0XHR0aGlzLnggPSBhLnggKiBiLng7XHJcblx0XHR0aGlzLnkgPSBhLnkgKiBiLnk7XHJcblx0XHR0aGlzLnogPSBhLnogKiBiLno7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQXBwbGllcyB0aGUgZ2l2ZW4gRXVsZXIgcm90YXRpb24gdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0V1bGVyfSBldWxlciAtIFRoZSBFdWxlciBhbmdsZXMuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0YXBwbHlFdWxlciggZXVsZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuYXBwbHlRdWF0ZXJuaW9uKCBfcXVhdGVybmlvbi5zZXRGcm9tRXVsZXIoIGV1bGVyICkgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBcHBsaWVzIGEgcm90YXRpb24gc3BlY2lmaWVkIGJ5IGFuIGF4aXMgYW5kIGFuIGFuZ2xlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBheGlzIC0gQSBub3JtYWxpemVkIHZlY3RvciByZXByZXNlbnRpbmcgdGhlIHJvdGF0aW9uIGF4aXMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFuZ2xlIC0gVGhlIGFuZ2xlIGluIHJhZGlhbnMuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0YXBwbHlBeGlzQW5nbGUoIGF4aXMsIGFuZ2xlICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmFwcGx5UXVhdGVybmlvbiggX3F1YXRlcm5pb24uc2V0RnJvbUF4aXNBbmdsZSggYXhpcywgYW5nbGUgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE11bHRpcGxpZXMgdGhpcyB2ZWN0b3Igd2l0aCB0aGUgZ2l2ZW4gM3gzIG1hdHJpeC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4M30gbSAtIFRoZSAzeDMgbWF0cml4LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGFwcGx5TWF0cml4MyggbSApIHtcclxuXHJcblx0XHRjb25zdCB4ID0gdGhpcy54LCB5ID0gdGhpcy55LCB6ID0gdGhpcy56O1xyXG5cdFx0Y29uc3QgZSA9IG0uZWxlbWVudHM7XHJcblxyXG5cdFx0dGhpcy54ID0gZVsgMCBdICogeCArIGVbIDMgXSAqIHkgKyBlWyA2IF0gKiB6O1xyXG5cdFx0dGhpcy55ID0gZVsgMSBdICogeCArIGVbIDQgXSAqIHkgKyBlWyA3IF0gKiB6O1xyXG5cdFx0dGhpcy56ID0gZVsgMiBdICogeCArIGVbIDUgXSAqIHkgKyBlWyA4IF0gKiB6O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE11bHRpcGxpZXMgdGhpcyB2ZWN0b3IgYnkgdGhlIGdpdmVuIG5vcm1hbCBtYXRyaXggYW5kIG5vcm1hbGl6ZXNcclxuXHQgKiB0aGUgcmVzdWx0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRyaXgzfSBtIC0gVGhlIG5vcm1hbCBtYXRyaXguXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0YXBwbHlOb3JtYWxNYXRyaXgoIG0gKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXgzKCBtICkubm9ybWFsaXplKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTXVsdGlwbGllcyB0aGlzIHZlY3RvciAod2l0aCBhbiBpbXBsaWNpdCAxIGluIHRoZSA0dGggZGltZW5zaW9uKSBieSBtLCBhbmRcclxuXHQgKiBkaXZpZGVzIGJ5IHBlcnNwZWN0aXZlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRyaXg0fSBtIC0gVGhlIG1hdHJpeCB0byBhcHBseS5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRhcHBseU1hdHJpeDQoIG0gKSB7XHJcblxyXG5cdFx0Y29uc3QgeCA9IHRoaXMueCwgeSA9IHRoaXMueSwgeiA9IHRoaXMuejtcclxuXHRcdGNvbnN0IGUgPSBtLmVsZW1lbnRzO1xyXG5cclxuXHRcdGNvbnN0IHcgPSAxIC8gKCBlWyAzIF0gKiB4ICsgZVsgNyBdICogeSArIGVbIDExIF0gKiB6ICsgZVsgMTUgXSApO1xyXG5cclxuXHRcdHRoaXMueCA9ICggZVsgMCBdICogeCArIGVbIDQgXSAqIHkgKyBlWyA4IF0gKiB6ICsgZVsgMTIgXSApICogdztcclxuXHRcdHRoaXMueSA9ICggZVsgMSBdICogeCArIGVbIDUgXSAqIHkgKyBlWyA5IF0gKiB6ICsgZVsgMTMgXSApICogdztcclxuXHRcdHRoaXMueiA9ICggZVsgMiBdICogeCArIGVbIDYgXSAqIHkgKyBlWyAxMCBdICogeiArIGVbIDE0IF0gKSAqIHc7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQXBwbGllcyB0aGUgZ2l2ZW4gUXVhdGVybmlvbiB0byB0aGlzIHZlY3Rvci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UXVhdGVybmlvbn0gcSAtIFRoZSBRdWF0ZXJuaW9uLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGFwcGx5UXVhdGVybmlvbiggcSApIHtcclxuXHJcblx0XHQvLyBxdWF0ZXJuaW9uIHEgaXMgYXNzdW1lZCB0byBoYXZlIHVuaXQgbGVuZ3RoXHJcblxyXG5cdFx0Y29uc3QgdnggPSB0aGlzLngsIHZ5ID0gdGhpcy55LCB2eiA9IHRoaXMuejtcclxuXHRcdGNvbnN0IHF4ID0gcS54LCBxeSA9IHEueSwgcXogPSBxLnosIHF3ID0gcS53O1xyXG5cclxuXHRcdC8vIHQgPSAyICogY3Jvc3MoIHEueHl6LCB2ICk7XHJcblx0XHRjb25zdCB0eCA9IDIgKiAoIHF5ICogdnogLSBxeiAqIHZ5ICk7XHJcblx0XHRjb25zdCB0eSA9IDIgKiAoIHF6ICogdnggLSBxeCAqIHZ6ICk7XHJcblx0XHRjb25zdCB0eiA9IDIgKiAoIHF4ICogdnkgLSBxeSAqIHZ4ICk7XHJcblxyXG5cdFx0Ly8gdiArIHEudyAqIHQgKyBjcm9zcyggcS54eXosIHQgKTtcclxuXHRcdHRoaXMueCA9IHZ4ICsgcXcgKiB0eCArIHF5ICogdHogLSBxeiAqIHR5O1xyXG5cdFx0dGhpcy55ID0gdnkgKyBxdyAqIHR5ICsgcXogKiB0eCAtIHF4ICogdHo7XHJcblx0XHR0aGlzLnogPSB2eiArIHF3ICogdHogKyBxeCAqIHR5IC0gcXkgKiB0eDtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQcm9qZWN0cyB0aGlzIHZlY3RvciBmcm9tIHdvcmxkIHNwYWNlIGludG8gdGhlIGNhbWVyYSdzIG5vcm1hbGl6ZWRcclxuXHQgKiBkZXZpY2UgY29vcmRpbmF0ZSAoTkRDKSBzcGFjZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Q2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHByb2plY3QoIGNhbWVyYSApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQoIGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UgKS5hcHBseU1hdHJpeDQoIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVW5wcm9qZWN0cyB0aGlzIHZlY3RvciBmcm9tIHRoZSBjYW1lcmEncyBub3JtYWxpemVkIGRldmljZSBjb29yZGluYXRlIChOREMpXHJcblx0ICogc3BhY2UgaW50byB3b3JsZCBzcGFjZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Q2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHVucHJvamVjdCggY2FtZXJhICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmFwcGx5TWF0cml4NCggY2FtZXJhLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlICkuYXBwbHlNYXRyaXg0KCBjYW1lcmEubWF0cml4V29ybGQgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUcmFuc2Zvcm1zIHRoZSBkaXJlY3Rpb24gb2YgdGhpcyB2ZWN0b3IgYnkgYSBtYXRyaXggKHRoZSB1cHBlciBsZWZ0IDMgeCAzXHJcblx0ICogc3Vic2V0IG9mIHRoZSBnaXZlbiA0eDQgbWF0cml4IGFuZCB0aGVuIG5vcm1hbGl6ZXMgdGhlIHJlc3VsdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4NH0gbSAtIFRoZSBtYXRyaXguXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0dHJhbnNmb3JtRGlyZWN0aW9uKCBtICkge1xyXG5cclxuXHRcdC8vIGlucHV0OiBUSFJFRS5NYXRyaXg0IGFmZmluZSBtYXRyaXhcclxuXHRcdC8vIHZlY3RvciBpbnRlcnByZXRlZCBhcyBhIGRpcmVjdGlvblxyXG5cclxuXHRcdGNvbnN0IHggPSB0aGlzLngsIHkgPSB0aGlzLnksIHogPSB0aGlzLno7XHJcblx0XHRjb25zdCBlID0gbS5lbGVtZW50cztcclxuXHJcblx0XHR0aGlzLnggPSBlWyAwIF0gKiB4ICsgZVsgNCBdICogeSArIGVbIDggXSAqIHo7XHJcblx0XHR0aGlzLnkgPSBlWyAxIF0gKiB4ICsgZVsgNSBdICogeSArIGVbIDkgXSAqIHo7XHJcblx0XHR0aGlzLnogPSBlWyAyIF0gKiB4ICsgZVsgNiBdICogeSArIGVbIDEwIF0gKiB6O1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm5vcm1hbGl6ZSgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERpdmlkZXMgdGhpcyBpbnN0YW5jZSBieSB0aGUgZ2l2ZW4gdmVjdG9yLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB2IC0gVGhlIHZlY3RvciB0byBkaXZpZGUuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0ZGl2aWRlKCB2ICkge1xyXG5cclxuXHRcdHRoaXMueCAvPSB2Lng7XHJcblx0XHR0aGlzLnkgLz0gdi55O1xyXG5cdFx0dGhpcy56IC89IHYuejtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEaXZpZGVzIHRoaXMgdmVjdG9yIGJ5IHRoZSBnaXZlbiBzY2FsYXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc2NhbGFyIC0gVGhlIHNjYWxhciB0byBkaXZpZGUuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0ZGl2aWRlU2NhbGFyKCBzY2FsYXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoIDEgLyBzY2FsYXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJZiB0aGlzIHZlY3RvcidzIHgsIHkgb3IgeiB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIGdpdmVuIHZlY3RvcidzIHgsIHkgb3IgelxyXG5cdCAqIHZhbHVlLCByZXBsYWNlIHRoYXQgdmFsdWUgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBtaW4gdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHYgLSBUaGUgdmVjdG9yLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdG1pbiggdiApIHtcclxuXHJcblx0XHR0aGlzLnggPSBNYXRoLm1pbiggdGhpcy54LCB2LnggKTtcclxuXHRcdHRoaXMueSA9IE1hdGgubWluKCB0aGlzLnksIHYueSApO1xyXG5cdFx0dGhpcy56ID0gTWF0aC5taW4oIHRoaXMueiwgdi56ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSWYgdGhpcyB2ZWN0b3IncyB4LCB5IG9yIHogdmFsdWUgaXMgbGVzcyB0aGFuIHRoZSBnaXZlbiB2ZWN0b3IncyB4LCB5IG9yIHpcclxuXHQgKiB2YWx1ZSwgcmVwbGFjZSB0aGF0IHZhbHVlIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgbWF4IHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB2IC0gVGhlIHZlY3Rvci5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRtYXgoIHYgKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gTWF0aC5tYXgoIHRoaXMueCwgdi54ICk7XHJcblx0XHR0aGlzLnkgPSBNYXRoLm1heCggdGhpcy55LCB2LnkgKTtcclxuXHRcdHRoaXMueiA9IE1hdGgubWF4KCB0aGlzLnosIHYueiApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIElmIHRoaXMgdmVjdG9yJ3MgeCwgeSBvciB6IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4IHZlY3RvcidzIHgsIHkgb3IgelxyXG5cdCAqIHZhbHVlLCBpdCBpcyByZXBsYWNlZCBieSB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZS5cclxuXHQgKiBJZiB0aGlzIHZlY3RvcidzIHgsIHkgb3IgeiB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIG1pbiB2ZWN0b3IncyB4LCB5IG9yIHogdmFsdWUsXHJcblx0ICogaXQgaXMgcmVwbGFjZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IG1pbiAtIFRoZSBtaW5pbXVtIHgsIHkgYW5kIHogdmFsdWVzLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gbWF4IC0gVGhlIG1heGltdW0geCwgeSBhbmQgeiB2YWx1ZXMgaW4gdGhlIGRlc2lyZWQgcmFuZ2UuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0Y2xhbXAoIG1pbiwgbWF4ICkge1xyXG5cclxuXHRcdC8vIGFzc3VtZXMgbWluIDwgbWF4LCBjb21wb25lbnR3aXNlXHJcblxyXG5cdFx0dGhpcy54ID0gY2xhbXAoIHRoaXMueCwgbWluLngsIG1heC54ICk7XHJcblx0XHR0aGlzLnkgPSBjbGFtcCggdGhpcy55LCBtaW4ueSwgbWF4LnkgKTtcclxuXHRcdHRoaXMueiA9IGNsYW1wKCB0aGlzLnosIG1pbi56LCBtYXgueiApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIElmIHRoaXMgdmVjdG9yJ3MgeCwgeSBvciB6IHZhbHVlcyBhcmUgZ3JlYXRlciB0aGFuIHRoZSBtYXggdmFsdWUsIHRoZXkgYXJlXHJcblx0ICogcmVwbGFjZWQgYnkgdGhlIG1heCB2YWx1ZS5cclxuXHQgKiBJZiB0aGlzIHZlY3RvcidzIHgsIHkgb3IgeiB2YWx1ZXMgYXJlIGxlc3MgdGhhbiB0aGUgbWluIHZhbHVlLCB0aGV5IGFyZVxyXG5cdCAqIHJlcGxhY2VkIGJ5IHRoZSBtaW4gdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbWluVmFsIC0gVGhlIG1pbmltdW0gdmFsdWUgdGhlIGNvbXBvbmVudHMgd2lsbCBiZSBjbGFtcGVkIHRvLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBtYXhWYWwgLSBUaGUgbWF4aW11bSB2YWx1ZSB0aGUgY29tcG9uZW50cyB3aWxsIGJlIGNsYW1wZWQgdG8uXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0Y2xhbXBTY2FsYXIoIG1pblZhbCwgbWF4VmFsICkge1xyXG5cclxuXHRcdHRoaXMueCA9IGNsYW1wKCB0aGlzLngsIG1pblZhbCwgbWF4VmFsICk7XHJcblx0XHR0aGlzLnkgPSBjbGFtcCggdGhpcy55LCBtaW5WYWwsIG1heFZhbCApO1xyXG5cdFx0dGhpcy56ID0gY2xhbXAoIHRoaXMueiwgbWluVmFsLCBtYXhWYWwgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJZiB0aGlzIHZlY3RvcidzIGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gdGhlIG1heCB2YWx1ZSwgaXQgaXMgcmVwbGFjZWQgYnlcclxuXHQgKiB0aGUgbWF4IHZhbHVlLlxyXG5cdCAqIElmIHRoaXMgdmVjdG9yJ3MgbGVuZ3RoIGlzIGxlc3MgdGhhbiB0aGUgbWluIHZhbHVlLCBpdCBpcyByZXBsYWNlZCBieSB0aGVcclxuXHQgKiBtaW4gdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbWluIC0gVGhlIG1pbmltdW0gdmFsdWUgdGhlIHZlY3RvciBsZW5ndGggd2lsbCBiZSBjbGFtcGVkIHRvLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBtYXggLSBUaGUgbWF4aW11bSB2YWx1ZSB0aGUgdmVjdG9yIGxlbmd0aCB3aWxsIGJlIGNsYW1wZWQgdG8uXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0Y2xhbXBMZW5ndGgoIG1pbiwgbWF4ICkge1xyXG5cclxuXHRcdGNvbnN0IGxlbmd0aCA9IHRoaXMubGVuZ3RoKCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKCBsZW5ndGggfHwgMSApLm11bHRpcGx5U2NhbGFyKCBjbGFtcCggbGVuZ3RoLCBtaW4sIG1heCApICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGNvbXBvbmVudHMgb2YgdGhpcyB2ZWN0b3IgYXJlIHJvdW5kZWQgZG93biB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0Zmxvb3IoKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gTWF0aC5mbG9vciggdGhpcy54ICk7XHJcblx0XHR0aGlzLnkgPSBNYXRoLmZsb29yKCB0aGlzLnkgKTtcclxuXHRcdHRoaXMueiA9IE1hdGguZmxvb3IoIHRoaXMueiApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBjb21wb25lbnRzIG9mIHRoaXMgdmVjdG9yIGFyZSByb3VuZGVkIHVwIHRvIHRoZSBuZWFyZXN0IGludGVnZXIgdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRjZWlsKCkge1xyXG5cclxuXHRcdHRoaXMueCA9IE1hdGguY2VpbCggdGhpcy54ICk7XHJcblx0XHR0aGlzLnkgPSBNYXRoLmNlaWwoIHRoaXMueSApO1xyXG5cdFx0dGhpcy56ID0gTWF0aC5jZWlsKCB0aGlzLnogKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgY29tcG9uZW50cyBvZiB0aGlzIHZlY3RvciBhcmUgcm91bmRlZCB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyIHZhbHVlXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRyb3VuZCgpIHtcclxuXHJcblx0XHR0aGlzLnggPSBNYXRoLnJvdW5kKCB0aGlzLnggKTtcclxuXHRcdHRoaXMueSA9IE1hdGgucm91bmQoIHRoaXMueSApO1xyXG5cdFx0dGhpcy56ID0gTWF0aC5yb3VuZCggdGhpcy56ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGNvbXBvbmVudHMgb2YgdGhpcyB2ZWN0b3IgYXJlIHJvdW5kZWQgdG93YXJkcyB6ZXJvICh1cCBpZiBuZWdhdGl2ZSxcclxuXHQgKiBkb3duIGlmIHBvc2l0aXZlKSB0byBhbiBpbnRlZ2VyIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0cm91bmRUb1plcm8oKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gTWF0aC50cnVuYyggdGhpcy54ICk7XHJcblx0XHR0aGlzLnkgPSBNYXRoLnRydW5jKCB0aGlzLnkgKTtcclxuXHRcdHRoaXMueiA9IE1hdGgudHJ1bmMoIHRoaXMueiApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEludmVydHMgdGhpcyB2ZWN0b3IgLSBpLmUuIHNldHMgeCA9IC14LCB5ID0gLXkgYW5kIHogPSAtei5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdG5lZ2F0ZSgpIHtcclxuXHJcblx0XHR0aGlzLnggPSAtIHRoaXMueDtcclxuXHRcdHRoaXMueSA9IC0gdGhpcy55O1xyXG5cdFx0dGhpcy56ID0gLSB0aGlzLno7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2FsY3VsYXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdGhlIGdpdmVuIHZlY3RvciB3aXRoIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHYgLSBUaGUgdmVjdG9yIHRvIGNvbXB1dGUgdGhlIGRvdCBwcm9kdWN0IHdpdGguXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgcmVzdWx0IG9mIHRoZSBkb3QgcHJvZHVjdC5cclxuXHQgKi9cclxuXHRkb3QoIHYgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMueCAqIHYueCArIHRoaXMueSAqIHYueSArIHRoaXMueiAqIHYuejtcclxuXHJcblx0fVxyXG5cclxuXHQvLyBUT0RPIGxlbmd0aFNxdWFyZWQ/XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSBzcXVhcmUgb2YgdGhlIEV1Y2xpZGVhbiBsZW5ndGggKHN0cmFpZ2h0LWxpbmUgbGVuZ3RoKSBmcm9tXHJcblx0ICogKDAsIDAsIDApIHRvICh4LCB5LCB6KS4gSWYgeW91IGFyZSBjb21wYXJpbmcgdGhlIGxlbmd0aHMgb2YgdmVjdG9ycywgeW91IHNob3VsZFxyXG5cdCAqIGNvbXBhcmUgdGhlIGxlbmd0aCBzcXVhcmVkIGluc3RlYWQgYXMgaXQgaXMgc2xpZ2h0bHkgbW9yZSBlZmZpY2llbnQgdG8gY2FsY3VsYXRlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgc3F1YXJlIGxlbmd0aCBvZiB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRsZW5ndGhTcSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55ICsgdGhpcy56ICogdGhpcy56O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSAgRXVjbGlkZWFuIGxlbmd0aCAoc3RyYWlnaHQtbGluZSBsZW5ndGgpIGZyb20gKDAsIDAsIDApIHRvICh4LCB5LCB6KS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGxlbmd0aCBvZiB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRsZW5ndGgoKSB7XHJcblxyXG5cdFx0cmV0dXJuIE1hdGguc3FydCggdGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55ICsgdGhpcy56ICogdGhpcy56ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgdGhlIE1hbmhhdHRhbiBsZW5ndGggb2YgdGhpcyB2ZWN0b3IuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBsZW5ndGggb2YgdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0bWFuaGF0dGFuTGVuZ3RoKCkge1xyXG5cclxuXHRcdHJldHVybiBNYXRoLmFicyggdGhpcy54ICkgKyBNYXRoLmFicyggdGhpcy55ICkgKyBNYXRoLmFicyggdGhpcy56ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29udmVydHMgdGhpcyB2ZWN0b3IgdG8gYSB1bml0IHZlY3RvciAtIHRoYXQgaXMsIHNldHMgaXQgZXF1YWwgdG8gYSB2ZWN0b3JcclxuXHQgKiB3aXRoIHRoZSBzYW1lIGRpcmVjdGlvbiBhcyB0aGlzIG9uZSwgYnV0IHdpdGggYSB2ZWN0b3IgbGVuZ3RoIG9mIGAxYC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdG5vcm1hbGl6ZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoIHRoaXMubGVuZ3RoKCkgfHwgMSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhpcyB2ZWN0b3IgdG8gYSB2ZWN0b3Igd2l0aCB0aGUgc2FtZSBkaXJlY3Rpb24gYXMgdGhpcyBvbmUsIGJ1dFxyXG5cdCAqIHdpdGggdGhlIHNwZWNpZmllZCBsZW5ndGguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIC0gVGhlIG5ldyBsZW5ndGggb2YgdGhpcyB2ZWN0b3IuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0c2V0TGVuZ3RoKCBsZW5ndGggKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoIGxlbmd0aCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIExpbmVhcmx5IGludGVycG9sYXRlcyBiZXR3ZWVuIHRoZSBnaXZlbiB2ZWN0b3IgYW5kIHRoaXMgaW5zdGFuY2UsIHdoZXJlXHJcblx0ICogYWxwaGEgaXMgdGhlIHBlcmNlbnQgZGlzdGFuY2UgYWxvbmcgdGhlIGxpbmUgLSBhbHBoYSA9IDAgd2lsbCBiZSB0aGlzXHJcblx0ICogdmVjdG9yLCBhbmQgYWxwaGEgPSAxIHdpbGwgYmUgdGhlIGdpdmVuIG9uZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdiAtIFRoZSB2ZWN0b3IgdG8gaW50ZXJwb2xhdGUgdG93YXJkcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYWxwaGEgLSBUaGUgaW50ZXJwb2xhdGlvbiBmYWN0b3IsIHR5cGljYWxseSBpbiB0aGUgY2xvc2VkIGludGVydmFsIGBbMCwgMV1gLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGxlcnAoIHYsIGFscGhhICkge1xyXG5cclxuXHRcdHRoaXMueCArPSAoIHYueCAtIHRoaXMueCApICogYWxwaGE7XHJcblx0XHR0aGlzLnkgKz0gKCB2LnkgLSB0aGlzLnkgKSAqIGFscGhhO1xyXG5cdFx0dGhpcy56ICs9ICggdi56IC0gdGhpcy56ICkgKiBhbHBoYTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBMaW5lYXJseSBpbnRlcnBvbGF0ZXMgYmV0d2VlbiB0aGUgZ2l2ZW4gdmVjdG9ycywgd2hlcmUgYWxwaGEgaXMgdGhlIHBlcmNlbnRcclxuXHQgKiBkaXN0YW5jZSBhbG9uZyB0aGUgbGluZSAtIGFscGhhID0gMCB3aWxsIGJlIGZpcnN0IHZlY3RvciwgYW5kIGFscGhhID0gMSB3aWxsXHJcblx0ICogYmUgdGhlIHNlY29uZCBvbmUuIFRoZSByZXN1bHQgaXMgc3RvcmVkIGluIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHYxIC0gVGhlIGZpcnN0IHZlY3Rvci5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHYyIC0gVGhlIHNlY29uZCB2ZWN0b3IuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFscGhhIC0gVGhlIGludGVycG9sYXRpb24gZmFjdG9yLCB0eXBpY2FsbHkgaW4gdGhlIGNsb3NlZCBpbnRlcnZhbCBgWzAsIDFdYC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRsZXJwVmVjdG9ycyggdjEsIHYyLCBhbHBoYSApIHtcclxuXHJcblx0XHR0aGlzLnggPSB2MS54ICsgKCB2Mi54IC0gdjEueCApICogYWxwaGE7XHJcblx0XHR0aGlzLnkgPSB2MS55ICsgKCB2Mi55IC0gdjEueSApICogYWxwaGE7XHJcblx0XHR0aGlzLnogPSB2MS56ICsgKCB2Mi56IC0gdjEueiApICogYWxwaGE7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2FsY3VsYXRlcyB0aGUgY3Jvc3MgcHJvZHVjdCBvZiB0aGUgZ2l2ZW4gdmVjdG9yIHdpdGggdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdiAtIFRoZSB2ZWN0b3IgdG8gY29tcHV0ZSB0aGUgY3Jvc3MgcHJvZHVjdCB3aXRoLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IFRoZSByZXN1bHQgb2YgdGhlIGNyb3NzIHByb2R1Y3QuXHJcblx0ICovXHJcblx0Y3Jvc3MoIHYgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuY3Jvc3NWZWN0b3JzKCB0aGlzLCB2ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2FsY3VsYXRlcyB0aGUgY3Jvc3MgcHJvZHVjdCBvZiB0aGUgZ2l2ZW4gdmVjdG9ycyBhbmQgc3RvcmVzIHRoZSByZXN1bHRcclxuXHQgKiBpbiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBhIC0gVGhlIGZpcnN0IHZlY3Rvci5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IGIgLSBUaGUgc2Vjb25kIHZlY3Rvci5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRjcm9zc1ZlY3RvcnMoIGEsIGIgKSB7XHJcblxyXG5cdFx0Y29uc3QgYXggPSBhLngsIGF5ID0gYS55LCBheiA9IGEuejtcclxuXHRcdGNvbnN0IGJ4ID0gYi54LCBieSA9IGIueSwgYnogPSBiLno7XHJcblxyXG5cdFx0dGhpcy54ID0gYXkgKiBieiAtIGF6ICogYnk7XHJcblx0XHR0aGlzLnkgPSBheiAqIGJ4IC0gYXggKiBiejtcclxuXHRcdHRoaXMueiA9IGF4ICogYnkgLSBheSAqIGJ4O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFByb2plY3RzIHRoaXMgdmVjdG9yIG9udG8gdGhlIGdpdmVuIG9uZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdiAtIFRoZSB2ZWN0b3IgdG8gcHJvamVjdCB0by5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRwcm9qZWN0T25WZWN0b3IoIHYgKSB7XHJcblxyXG5cdFx0Y29uc3QgZGVub21pbmF0b3IgPSB2Lmxlbmd0aFNxKCk7XHJcblxyXG5cdFx0aWYgKCBkZW5vbWluYXRvciA9PT0gMCApIHJldHVybiB0aGlzLnNldCggMCwgMCwgMCApO1xyXG5cclxuXHRcdGNvbnN0IHNjYWxhciA9IHYuZG90KCB0aGlzICkgLyBkZW5vbWluYXRvcjtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5jb3B5KCB2ICkubXVsdGlwbHlTY2FsYXIoIHNjYWxhciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFByb2plY3RzIHRoaXMgdmVjdG9yIG9udG8gYSBwbGFuZSBieSBzdWJ0cmFjdGluZyB0aGlzXHJcblx0ICogdmVjdG9yIHByb2plY3RlZCBvbnRvIHRoZSBwbGFuZSdzIG5vcm1hbCBmcm9tIHRoaXMgdmVjdG9yLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBwbGFuZU5vcm1hbCAtIFRoZSBwbGFuZSBub3JtYWwuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0cHJvamVjdE9uUGxhbmUoIHBsYW5lTm9ybWFsICkge1xyXG5cclxuXHRcdF92ZWN0b3IuY29weSggdGhpcyApLnByb2plY3RPblZlY3RvciggcGxhbmVOb3JtYWwgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5zdWIoIF92ZWN0b3IgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZWZsZWN0cyB0aGlzIHZlY3RvciBvZmYgYSBwbGFuZSBvcnRob2dvbmFsIHRvIHRoZSBnaXZlbiBub3JtYWwgdmVjdG9yLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBub3JtYWwgLSBUaGUgKG5vcm1hbGl6ZWQpIG5vcm1hbCB2ZWN0b3IuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0cmVmbGVjdCggbm9ybWFsICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnN1YiggX3ZlY3Rvci5jb3B5KCBub3JtYWwgKS5tdWx0aXBseVNjYWxhciggMiAqIHRoaXMuZG90KCBub3JtYWwgKSApICk7XHJcblxyXG5cdH1cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBhbmdsZSBiZXR3ZWVuIHRoZSBnaXZlbiB2ZWN0b3IgYW5kIHRoaXMgaW5zdGFuY2UgaW4gcmFkaWFucy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdiAtIFRoZSB2ZWN0b3IgdG8gY29tcHV0ZSB0aGUgYW5nbGUgd2l0aC5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBhbmdsZSBpbiByYWRpYW5zLlxyXG5cdCAqL1xyXG5cdGFuZ2xlVG8oIHYgKSB7XHJcblxyXG5cdFx0Y29uc3QgZGVub21pbmF0b3IgPSBNYXRoLnNxcnQoIHRoaXMubGVuZ3RoU3EoKSAqIHYubGVuZ3RoU3EoKSApO1xyXG5cclxuXHRcdGlmICggZGVub21pbmF0b3IgPT09IDAgKSByZXR1cm4gTWF0aC5QSSAvIDI7XHJcblxyXG5cdFx0Y29uc3QgdGhldGEgPSB0aGlzLmRvdCggdiApIC8gZGVub21pbmF0b3I7XHJcblxyXG5cdFx0Ly8gY2xhbXAsIHRvIGhhbmRsZSBudW1lcmljYWwgcHJvYmxlbXNcclxuXHJcblx0XHRyZXR1cm4gTWF0aC5hY29zKCBjbGFtcCggdGhldGEsIC0gMSwgMSApICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgdGhlIGRpc3RhbmNlIGZyb20gdGhlIGdpdmVuIHZlY3RvciB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB2IC0gVGhlIHZlY3RvciB0byBjb21wdXRlIHRoZSBkaXN0YW5jZSB0by5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBkaXN0YW5jZS5cclxuXHQgKi9cclxuXHRkaXN0YW5jZVRvKCB2ICkge1xyXG5cclxuXHRcdHJldHVybiBNYXRoLnNxcnQoIHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQoIHYgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSBzcXVhcmVkIGRpc3RhbmNlIGZyb20gdGhlIGdpdmVuIHZlY3RvciB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqIElmIHlvdSBhcmUganVzdCBjb21wYXJpbmcgdGhlIGRpc3RhbmNlIHdpdGggYW5vdGhlciBkaXN0YW5jZSwgeW91IHNob3VsZCBjb21wYXJlXHJcblx0ICogdGhlIGRpc3RhbmNlIHNxdWFyZWQgaW5zdGVhZCBhcyBpdCBpcyBzbGlnaHRseSBtb3JlIGVmZmljaWVudCB0byBjYWxjdWxhdGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHYgLSBUaGUgdmVjdG9yIHRvIGNvbXB1dGUgdGhlIHNxdWFyZWQgZGlzdGFuY2UgdG8uXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgc3F1YXJlZCBkaXN0YW5jZS5cclxuXHQgKi9cclxuXHRkaXN0YW5jZVRvU3F1YXJlZCggdiApIHtcclxuXHJcblx0XHRjb25zdCBkeCA9IHRoaXMueCAtIHYueCwgZHkgPSB0aGlzLnkgLSB2LnksIGR6ID0gdGhpcy56IC0gdi56O1xyXG5cclxuXHRcdHJldHVybiBkeCAqIGR4ICsgZHkgKiBkeSArIGR6ICogZHo7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgdGhlIE1hbmhhdHRhbiBkaXN0YW5jZSBmcm9tIHRoZSBnaXZlbiB2ZWN0b3IgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdiAtIFRoZSB2ZWN0b3IgdG8gY29tcHV0ZSB0aGUgTWFuaGF0dGFuIGRpc3RhbmNlIHRvLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIE1hbmhhdHRhbiBkaXN0YW5jZS5cclxuXHQgKi9cclxuXHRtYW5oYXR0YW5EaXN0YW5jZVRvKCB2ICkge1xyXG5cclxuXHRcdHJldHVybiBNYXRoLmFicyggdGhpcy54IC0gdi54ICkgKyBNYXRoLmFicyggdGhpcy55IC0gdi55ICkgKyBNYXRoLmFicyggdGhpcy56IC0gdi56ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdmVjdG9yIGNvbXBvbmVudHMgZnJvbSB0aGUgZ2l2ZW4gc3BoZXJpY2FsIGNvb3JkaW5hdGVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTcGhlcmljYWx9IHMgLSBUaGUgc3BoZXJpY2FsIGNvb3JkaW5hdGVzLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHNldEZyb21TcGhlcmljYWwoIHMgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuc2V0RnJvbVNwaGVyaWNhbENvb3Jkcyggcy5yYWRpdXMsIHMucGhpLCBzLnRoZXRhICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdmVjdG9yIGNvbXBvbmVudHMgZnJvbSB0aGUgZ2l2ZW4gc3BoZXJpY2FsIGNvb3JkaW5hdGVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHJhZGl1cyAtIFRoZSByYWRpdXMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHBoaSAtIFRoZSBwaGkgYW5nbGUgaW4gcmFkaWFucy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdGhldGEgLSBUaGUgdGhldGEgYW5nbGUgaW4gcmFkaWFucy5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRzZXRGcm9tU3BoZXJpY2FsQ29vcmRzKCByYWRpdXMsIHBoaSwgdGhldGEgKSB7XHJcblxyXG5cdFx0Y29uc3Qgc2luUGhpUmFkaXVzID0gTWF0aC5zaW4oIHBoaSApICogcmFkaXVzO1xyXG5cclxuXHRcdHRoaXMueCA9IHNpblBoaVJhZGl1cyAqIE1hdGguc2luKCB0aGV0YSApO1xyXG5cdFx0dGhpcy55ID0gTWF0aC5jb3MoIHBoaSApICogcmFkaXVzO1xyXG5cdFx0dGhpcy56ID0gc2luUGhpUmFkaXVzICogTWF0aC5jb3MoIHRoZXRhICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdmVjdG9yIGNvbXBvbmVudHMgZnJvbSB0aGUgZ2l2ZW4gY3lsaW5kcmljYWwgY29vcmRpbmF0ZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0N5bGluZHJpY2FsfSBjIC0gVGhlIGN5bGluZHJpY2FsIGNvb3JkaW5hdGVzLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHNldEZyb21DeWxpbmRyaWNhbCggYyApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5zZXRGcm9tQ3lsaW5kcmljYWxDb29yZHMoIGMucmFkaXVzLCBjLnRoZXRhLCBjLnkgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB2ZWN0b3IgY29tcG9uZW50cyBmcm9tIHRoZSBnaXZlbiBjeWxpbmRyaWNhbCBjb29yZGluYXRlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSByYWRpdXMgLSBUaGUgcmFkaXVzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0aGV0YSAtIFRoZSB0aGV0YSBhbmdsZSBpbiByYWRpYW5zLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHkgdmFsdWUuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0c2V0RnJvbUN5bGluZHJpY2FsQ29vcmRzKCByYWRpdXMsIHRoZXRhLCB5ICkge1xyXG5cclxuXHRcdHRoaXMueCA9IHJhZGl1cyAqIE1hdGguc2luKCB0aGV0YSApO1xyXG5cdFx0dGhpcy55ID0geTtcclxuXHRcdHRoaXMueiA9IHJhZGl1cyAqIE1hdGguY29zKCB0aGV0YSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHZlY3RvciBjb21wb25lbnRzIHRvIHRoZSBwb3NpdGlvbiBlbGVtZW50cyBvZiB0aGVcclxuXHQgKiBnaXZlbiB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDR9IG0gLSBUaGUgNHg0IG1hdHJpeC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRzZXRGcm9tTWF0cml4UG9zaXRpb24oIG0gKSB7XHJcblxyXG5cdFx0Y29uc3QgZSA9IG0uZWxlbWVudHM7XHJcblxyXG5cdFx0dGhpcy54ID0gZVsgMTIgXTtcclxuXHRcdHRoaXMueSA9IGVbIDEzIF07XHJcblx0XHR0aGlzLnogPSBlWyAxNCBdO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHZlY3RvciBjb21wb25lbnRzIHRvIHRoZSBzY2FsZSBlbGVtZW50cyBvZiB0aGVcclxuXHQgKiBnaXZlbiB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDR9IG0gLSBUaGUgNHg0IG1hdHJpeC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRzZXRGcm9tTWF0cml4U2NhbGUoIG0gKSB7XHJcblxyXG5cdFx0Y29uc3Qgc3ggPSB0aGlzLnNldEZyb21NYXRyaXhDb2x1bW4oIG0sIDAgKS5sZW5ndGgoKTtcclxuXHRcdGNvbnN0IHN5ID0gdGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKCBtLCAxICkubGVuZ3RoKCk7XHJcblx0XHRjb25zdCBzeiA9IHRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbiggbSwgMiApLmxlbmd0aCgpO1xyXG5cclxuXHRcdHRoaXMueCA9IHN4O1xyXG5cdFx0dGhpcy55ID0gc3k7XHJcblx0XHR0aGlzLnogPSBzejtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB2ZWN0b3IgY29tcG9uZW50cyBmcm9tIHRoZSBzcGVjaWZpZWQgbWF0cml4IGNvbHVtbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4NH0gbSAtIFRoZSA0eDQgbWF0cml4LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBjb2x1bW4gaW5kZXguXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0c2V0RnJvbU1hdHJpeENvbHVtbiggbSwgaW5kZXggKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZnJvbUFycmF5KCBtLmVsZW1lbnRzLCBpbmRleCAqIDQgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB2ZWN0b3IgY29tcG9uZW50cyBmcm9tIHRoZSBzcGVjaWZpZWQgbWF0cml4IGNvbHVtbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4M30gbSAtIFRoZSAzeDMgbWF0cml4LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBjb2x1bW4gaW5kZXguXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0c2V0RnJvbU1hdHJpeDNDb2x1bW4oIG0sIGluZGV4ICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmZyb21BcnJheSggbS5lbGVtZW50cywgaW5kZXggKiAzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdmVjdG9yIGNvbXBvbmVudHMgZnJvbSB0aGUgZ2l2ZW4gRXVsZXIgYW5nbGVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtFdWxlcn0gZSAtIFRoZSBFdWxlciBhbmdsZXMgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHNldEZyb21FdWxlciggZSApIHtcclxuXHJcblx0XHR0aGlzLnggPSBlLl94O1xyXG5cdFx0dGhpcy55ID0gZS5feTtcclxuXHRcdHRoaXMueiA9IGUuX3o7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdmVjdG9yIGNvbXBvbmVudHMgZnJvbSB0aGUgUkdCIGNvbXBvbmVudHMgb2YgdGhlXHJcblx0ICogZ2l2ZW4gY29sb3IuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0NvbG9yfSBjIC0gVGhlIGNvbG9yIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRzZXRGcm9tQ29sb3IoIGMgKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gYy5yO1xyXG5cdFx0dGhpcy55ID0gYy5nO1xyXG5cdFx0dGhpcy56ID0gYy5iO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgdmVjdG9yIGlzIGVxdWFsIHdpdGggdGhlIGdpdmVuIG9uZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdiAtIFRoZSB2ZWN0b3IgdG8gdGVzdCBmb3IgZXF1YWxpdHkuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGlzIHZlY3RvciBpcyBlcXVhbCB3aXRoIHRoZSBnaXZlbiBvbmUuXHJcblx0ICovXHJcblx0ZXF1YWxzKCB2ICkge1xyXG5cclxuXHRcdHJldHVybiAoICggdi54ID09PSB0aGlzLnggKSAmJiAoIHYueSA9PT0gdGhpcy55ICkgJiYgKCB2LnogPT09IHRoaXMueiApICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGlzIHZlY3RvcidzIHggdmFsdWUgdG8gYmUgYGFycmF5WyBvZmZzZXQgXWAsIHkgdmFsdWUgdG8gYmUgYGFycmF5WyBvZmZzZXQgKyAxIF1gXHJcblx0ICogYW5kIHogdmFsdWUgdG8gYmUgYGFycmF5WyBvZmZzZXQgKyAyIF1gLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBhcnJheSAtIEFuIGFycmF5IGhvbGRpbmcgdGhlIHZlY3RvciBjb21wb25lbnQgdmFsdWVzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0PTBdIC0gVGhlIG9mZnNldCBpbnRvIHRoZSBhcnJheS5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRmcm9tQXJyYXkoIGFycmF5LCBvZmZzZXQgPSAwICkge1xyXG5cclxuXHRcdHRoaXMueCA9IGFycmF5WyBvZmZzZXQgXTtcclxuXHRcdHRoaXMueSA9IGFycmF5WyBvZmZzZXQgKyAxIF07XHJcblx0XHR0aGlzLnogPSBhcnJheVsgb2Zmc2V0ICsgMiBdO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdyaXRlcyB0aGUgY29tcG9uZW50cyBvZiB0aGlzIHZlY3RvciB0byB0aGUgZ2l2ZW4gYXJyYXkuIElmIG5vIGFycmF5IGlzIHByb3ZpZGVkLFxyXG5cdCAqIHRoZSBtZXRob2QgcmV0dXJucyBhIG5ldyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gW2FycmF5PVtdXSAtIFRoZSB0YXJnZXQgYXJyYXkgaG9sZGluZyB0aGUgdmVjdG9yIGNvbXBvbmVudHMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXQ9MF0gLSBJbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgYXJyYXkuXHJcblx0ICogQHJldHVybiB7QXJyYXk8bnVtYmVyPn0gVGhlIHZlY3RvciBjb21wb25lbnRzLlxyXG5cdCAqL1xyXG5cdHRvQXJyYXkoIGFycmF5ID0gW10sIG9mZnNldCA9IDAgKSB7XHJcblxyXG5cdFx0YXJyYXlbIG9mZnNldCBdID0gdGhpcy54O1xyXG5cdFx0YXJyYXlbIG9mZnNldCArIDEgXSA9IHRoaXMueTtcclxuXHRcdGFycmF5WyBvZmZzZXQgKyAyIF0gPSB0aGlzLno7XHJcblxyXG5cdFx0cmV0dXJuIGFycmF5O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGNvbXBvbmVudHMgb2YgdGhpcyB2ZWN0b3IgZnJvbSB0aGUgZ2l2ZW4gYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyQXR0cmlidXRlfSBhdHRyaWJ1dGUgLSBUaGUgYnVmZmVyIGF0dHJpYnV0ZSBob2xkaW5nIHZlY3RvciBkYXRhLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBpbnRvIHRoZSBhdHRyaWJ1dGUuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0ZnJvbUJ1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlLCBpbmRleCApIHtcclxuXHJcblx0XHR0aGlzLnggPSBhdHRyaWJ1dGUuZ2V0WCggaW5kZXggKTtcclxuXHRcdHRoaXMueSA9IGF0dHJpYnV0ZS5nZXRZKCBpbmRleCApO1xyXG5cdFx0dGhpcy56ID0gYXR0cmlidXRlLmdldFooIGluZGV4ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyBlYWNoIGNvbXBvbmVudCBvZiB0aGlzIHZlY3RvciB0byBhIHBzZXVkby1yYW5kb20gdmFsdWUgYmV0d2VlbiBgMGAgYW5kXHJcblx0ICogYDFgLCBleGNsdWRpbmcgYDFgLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0cmFuZG9tKCkge1xyXG5cclxuXHRcdHRoaXMueCA9IE1hdGgucmFuZG9tKCk7XHJcblx0XHR0aGlzLnkgPSBNYXRoLnJhbmRvbSgpO1xyXG5cdFx0dGhpcy56ID0gTWF0aC5yYW5kb20oKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoaXMgdmVjdG9yIHRvIGEgdW5pZm9ybWx5IHJhbmRvbSBwb2ludCBvbiBhIHVuaXQgc3BoZXJlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0cmFuZG9tRGlyZWN0aW9uKCkge1xyXG5cclxuXHRcdC8vIGh0dHBzOi8vbWF0aHdvcmxkLndvbGZyYW0uY29tL1NwaGVyZVBvaW50UGlja2luZy5odG1sXHJcblxyXG5cdFx0Y29uc3QgdGhldGEgPSBNYXRoLnJhbmRvbSgpICogTWF0aC5QSSAqIDI7XHJcblx0XHRjb25zdCB1ID0gTWF0aC5yYW5kb20oKSAqIDIgLSAxO1xyXG5cdFx0Y29uc3QgYyA9IE1hdGguc3FydCggMSAtIHUgKiB1ICk7XHJcblxyXG5cdFx0dGhpcy54ID0gYyAqIE1hdGguY29zKCB0aGV0YSApO1xyXG5cdFx0dGhpcy55ID0gdTtcclxuXHRcdHRoaXMueiA9IGMgKiBNYXRoLnNpbiggdGhldGEgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQqWyBTeW1ib2wuaXRlcmF0b3IgXSgpIHtcclxuXHJcblx0XHR5aWVsZCB0aGlzLng7XHJcblx0XHR5aWVsZCB0aGlzLnk7XHJcblx0XHR5aWVsZCB0aGlzLno7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmNvbnN0IF92ZWN0b3IgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF9xdWF0ZXJuaW9uID0gLypAX19QVVJFX18qLyBuZXcgUXVhdGVybmlvbigpO1xyXG5cclxuZXhwb3J0IHsgVmVjdG9yMyB9O1xyXG4iLCJpbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi9WZWN0b3IzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIGFuIGF4aXMtYWxpZ25lZCBib3VuZGluZyBib3ggKEFBQkIpIGluIDNEIHNwYWNlLlxyXG4gKi9cclxuY2xhc3MgQm94MyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYm91bmRpbmcgYm94LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBbbWluPShJbmZpbml0eSxJbmZpbml0eSxJbmZpbml0eSldIC0gQSB2ZWN0b3IgcmVwcmVzZW50aW5nIHRoZSBsb3dlciBib3VuZGFyeSBvZiB0aGUgYm94LlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gW21heD0oLUluZmluaXR5LC1JbmZpbml0eSwtSW5maW5pdHkpXSAtIEEgdmVjdG9yIHJlcHJlc2VudGluZyB0aGUgdXBwZXIgYm91bmRhcnkgb2YgdGhlIGJveC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbWluID0gbmV3IFZlY3RvcjMoICsgSW5maW5pdHksICsgSW5maW5pdHksICsgSW5maW5pdHkgKSwgbWF4ID0gbmV3IFZlY3RvcjMoIC0gSW5maW5pdHksIC0gSW5maW5pdHksIC0gSW5maW5pdHkgKSApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNCb3gzID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBsb3dlciBib3VuZGFyeSBvZiB0aGUgYm94LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3IzfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1pbiA9IG1pbjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB1cHBlciBib3VuZGFyeSBvZiB0aGUgYm94LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3IzfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1heCA9IG1heDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBsb3dlciBhbmQgdXBwZXIgYm91bmRhcmllcyBvZiB0aGlzIGJveC5cclxuXHQgKiBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgbWV0aG9kIG9ubHkgY29waWVzIHRoZSB2YWx1ZXMgZnJvbSB0aGUgZ2l2ZW4gb2JqZWN0cy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gbWluIC0gVGhlIGxvd2VyIGJvdW5kYXJ5IG9mIHRoZSBib3guXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBtYXggLSBUaGUgdXBwZXIgYm91bmRhcnkgb2YgdGhlIGJveC5cclxuXHQgKiBAcmV0dXJuIHtCb3gzfSBBIHJlZmVyZW5jZSB0byB0aGlzIGJvdW5kaW5nIGJveC5cclxuXHQgKi9cclxuXHRzZXQoIG1pbiwgbWF4ICkge1xyXG5cclxuXHRcdHRoaXMubWluLmNvcHkoIG1pbiApO1xyXG5cdFx0dGhpcy5tYXguY29weSggbWF4ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdXBwZXIgYW5kIGxvd2VyIGJvdW5kcyBvZiB0aGlzIGJveCBzbyBpdCBlbmNsb3NlcyB0aGUgcG9zaXRpb24gZGF0YVxyXG5cdCAqIGluIHRoZSBnaXZlbiBhcnJheS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gYXJyYXkgLSBBbiBhcnJheSBob2xkaW5nIDNEIHBvc2l0aW9uIGRhdGEuXHJcblx0ICogQHJldHVybiB7Qm94M30gQSByZWZlcmVuY2UgdG8gdGhpcyBib3VuZGluZyBib3guXHJcblx0ICovXHJcblx0c2V0RnJvbUFycmF5KCBhcnJheSApIHtcclxuXHJcblx0XHR0aGlzLm1ha2VFbXB0eSgpO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBhcnJheS5sZW5ndGg7IGkgPCBpbDsgaSArPSAzICkge1xyXG5cclxuXHRcdFx0dGhpcy5leHBhbmRCeVBvaW50KCBfdmVjdG9yLmZyb21BcnJheSggYXJyYXksIGkgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB1cHBlciBhbmQgbG93ZXIgYm91bmRzIG9mIHRoaXMgYm94IHNvIGl0IGVuY2xvc2VzIHRoZSBwb3NpdGlvbiBkYXRhXHJcblx0ICogaW4gdGhlIGdpdmVuIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0J1ZmZlckF0dHJpYnV0ZX0gYXR0cmlidXRlIC0gQSBidWZmZXIgYXR0cmlidXRlIGhvbGRpbmcgM0QgcG9zaXRpb24gZGF0YS5cclxuXHQgKiBAcmV0dXJuIHtCb3gzfSBBIHJlZmVyZW5jZSB0byB0aGlzIGJvdW5kaW5nIGJveC5cclxuXHQgKi9cclxuXHRzZXRGcm9tQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUgKSB7XHJcblxyXG5cdFx0dGhpcy5tYWtlRW1wdHkoKTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gYXR0cmlidXRlLmNvdW50OyBpIDwgaWw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmV4cGFuZEJ5UG9pbnQoIF92ZWN0b3IuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlLCBpICkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdXBwZXIgYW5kIGxvd2VyIGJvdW5kcyBvZiB0aGlzIGJveCBzbyBpdCBlbmNsb3NlcyB0aGUgcG9zaXRpb24gZGF0YVxyXG5cdCAqIGluIHRoZSBnaXZlbiBhcnJheS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8VmVjdG9yMz59IHBvaW50cyAtIEFuIGFycmF5IGhvbGRpbmcgM0QgcG9zaXRpb24gZGF0YSBhcyBpbnN0YW5jZXMgb2Yge0BsaW5rIFZlY3RvcjN9LlxyXG5cdCAqIEByZXR1cm4ge0JveDN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgYm91bmRpbmcgYm94LlxyXG5cdCAqL1xyXG5cdHNldEZyb21Qb2ludHMoIHBvaW50cyApIHtcclxuXHJcblx0XHR0aGlzLm1ha2VFbXB0eSgpO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBwb2ludHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmV4cGFuZEJ5UG9pbnQoIHBvaW50c1sgaSBdICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENlbnRlcnMgdGhpcyBib3ggb24gdGhlIGdpdmVuIGNlbnRlciB2ZWN0b3IgYW5kIHNldHMgdGhpcyBib3gncyB3aWR0aCwgaGVpZ2h0IGFuZFxyXG5cdCAqIGRlcHRoIHRvIHRoZSBnaXZlbiBzaXplIHZhbHVlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gY2VudGVyIC0gVGhlIGNlbnRlciBvZiB0aGUgYm94LlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gc2l6ZSAtIFRoZSB4LCB5IGFuZCB6IGRpbWVuc2lvbnMgb2YgdGhlIGJveC5cclxuXHQgKiBAcmV0dXJuIHtCb3gzfSBBIHJlZmVyZW5jZSB0byB0aGlzIGJvdW5kaW5nIGJveC5cclxuXHQgKi9cclxuXHRzZXRGcm9tQ2VudGVyQW5kU2l6ZSggY2VudGVyLCBzaXplICkge1xyXG5cclxuXHRcdGNvbnN0IGhhbGZTaXplID0gX3ZlY3Rvci5jb3B5KCBzaXplICkubXVsdGlwbHlTY2FsYXIoIDAuNSApO1xyXG5cclxuXHRcdHRoaXMubWluLmNvcHkoIGNlbnRlciApLnN1YiggaGFsZlNpemUgKTtcclxuXHRcdHRoaXMubWF4LmNvcHkoIGNlbnRlciApLmFkZCggaGFsZlNpemUgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB0aGUgd29ybGQtYXhpcy1hbGlnbmVkIGJvdW5kaW5nIGJveCBmb3IgdGhlIGdpdmVuIDNEIG9iamVjdFxyXG5cdCAqIChpbmNsdWRpbmcgaXRzIGNoaWxkcmVuKSwgYWNjb3VudGluZyBmb3IgdGhlIG9iamVjdCdzLCBhbmQgY2hpbGRyZW4ncyxcclxuXHQgKiB3b3JsZCB0cmFuc2Zvcm1zLiBUaGUgZnVuY3Rpb24gbWF5IHJlc3VsdCBpbiBhIGxhcmdlciBib3ggdGhhbiBzdHJpY3RseSBuZWNlc3NhcnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdDNEfSBvYmplY3QgLSBUaGUgM0Qgb2JqZWN0IHRvIGNvbXB1dGUgdGhlIGJvdW5kaW5nIGJveCBmb3IuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbcHJlY2lzZT1mYWxzZV0gLSBJZiBzZXQgdG8gYHRydWVgLCB0aGUgbWV0aG9kIGNvbXB1dGVzIHRoZSBzbWFsbGVzdFxyXG5cdCAqIHdvcmxkLWF4aXMtYWxpZ25lZCBib3VuZGluZyBib3ggYXQgdGhlIGV4cGVuc2Ugb2YgbW9yZSBjb21wdXRhdGlvbi5cclxuXHQgKiBAcmV0dXJuIHtCb3gzfSBBIHJlZmVyZW5jZSB0byB0aGlzIGJvdW5kaW5nIGJveC5cclxuXHQgKi9cclxuXHRzZXRGcm9tT2JqZWN0KCBvYmplY3QsIHByZWNpc2UgPSBmYWxzZSApIHtcclxuXHJcblx0XHR0aGlzLm1ha2VFbXB0eSgpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmV4cGFuZEJ5T2JqZWN0KCBvYmplY3QsIHByZWNpc2UgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbmV3IGJveCB3aXRoIGNvcGllZCB2YWx1ZXMgZnJvbSB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Qm94M30gQSBjbG9uZSBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNsb25lKCkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gYm94IHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0JveDN9IGJveCAtIFRoZSBib3ggdG8gY29weS5cclxuXHQgKiBAcmV0dXJuIHtCb3gzfSBBIHJlZmVyZW5jZSB0byB0aGlzIGJvdW5kaW5nIGJveC5cclxuXHQgKi9cclxuXHRjb3B5KCBib3ggKSB7XHJcblxyXG5cdFx0dGhpcy5taW4uY29weSggYm94Lm1pbiApO1xyXG5cdFx0dGhpcy5tYXguY29weSggYm94Lm1heCApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE1ha2VzIHRoaXMgYm94IGVtcHR5IHdoaWNoIG1lYW5zIGluIGVuY2xvc2VzIGEgemVybyBzcGFjZSBpbiAzRC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0JveDN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgYm91bmRpbmcgYm94LlxyXG5cdCAqL1xyXG5cdG1ha2VFbXB0eSgpIHtcclxuXHJcblx0XHR0aGlzLm1pbi54ID0gdGhpcy5taW4ueSA9IHRoaXMubWluLnogPSArIEluZmluaXR5O1xyXG5cdFx0dGhpcy5tYXgueCA9IHRoaXMubWF4LnkgPSB0aGlzLm1heC56ID0gLSBJbmZpbml0eTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBib3ggaW5jbHVkZXMgemVybyBwb2ludHMgd2l0aGluIGl0cyBib3VuZHMuXHJcblx0ICogTm90ZSB0aGF0IGEgYm94IHdpdGggZXF1YWwgbG93ZXIgYW5kIHVwcGVyIGJvdW5kcyBzdGlsbCBpbmNsdWRlcyBvbmVcclxuXHQgKiBwb2ludCwgdGhlIG9uZSBib3RoIGJvdW5kcyBzaGFyZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyBib3ggaXMgZW1wdHkgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGlzRW1wdHkoKSB7XHJcblxyXG5cdFx0Ly8gdGhpcyBpcyBhIG1vcmUgcm9idXN0IGNoZWNrIGZvciBlbXB0eSB0aGFuICggdm9sdW1lIDw9IDAgKSBiZWNhdXNlIHZvbHVtZSBjYW4gZ2V0IHBvc2l0aXZlIHdpdGggdHdvIG5lZ2F0aXZlIGF4ZXNcclxuXHJcblx0XHRyZXR1cm4gKCB0aGlzLm1heC54IDwgdGhpcy5taW4ueCApIHx8ICggdGhpcy5tYXgueSA8IHRoaXMubWluLnkgKSB8fCAoIHRoaXMubWF4LnogPCB0aGlzLm1pbi56ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgY2VudGVyIHBvaW50IG9mIHRoaXMgYm94LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IHZlY3RvciB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGhvZCdzIHJlc3VsdC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBUaGUgY2VudGVyIHBvaW50LlxyXG5cdCAqL1xyXG5cdGdldENlbnRlciggdGFyZ2V0ICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmlzRW1wdHkoKSA/IHRhcmdldC5zZXQoIDAsIDAsIDAgKSA6IHRhcmdldC5hZGRWZWN0b3JzKCB0aGlzLm1pbiwgdGhpcy5tYXggKS5tdWx0aXBseVNjYWxhciggMC41ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgZGltZW5zaW9ucyBvZiB0aGlzIGJveC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdGFyZ2V0IC0gVGhlIHRhcmdldCB2ZWN0b3IgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBtZXRob2QncyByZXN1bHQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gVGhlIHNpemUuXHJcblx0ICovXHJcblx0Z2V0U2l6ZSggdGFyZ2V0ICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmlzRW1wdHkoKSA/IHRhcmdldC5zZXQoIDAsIDAsIDAgKSA6IHRhcmdldC5zdWJWZWN0b3JzKCB0aGlzLm1heCwgdGhpcy5taW4gKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFeHBhbmRzIHRoZSBib3VuZGFyaWVzIG9mIHRoaXMgYm94IHRvIGluY2x1ZGUgdGhlIGdpdmVuIHBvaW50LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBwb2ludCAtIFRoZSBwb2ludCB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBieSB0aGUgYm91bmRpbmcgYm94LlxyXG5cdCAqIEByZXR1cm4ge0JveDN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgYm91bmRpbmcgYm94LlxyXG5cdCAqL1xyXG5cdGV4cGFuZEJ5UG9pbnQoIHBvaW50ICkge1xyXG5cclxuXHRcdHRoaXMubWluLm1pbiggcG9pbnQgKTtcclxuXHRcdHRoaXMubWF4Lm1heCggcG9pbnQgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFeHBhbmRzIHRoaXMgYm94IGVxdWlsYXRlcmFsbHkgYnkgdGhlIGdpdmVuIHZlY3Rvci4gVGhlIHdpZHRoIG9mIHRoaXNcclxuXHQgKiBib3ggd2lsbCBiZSBleHBhbmRlZCBieSB0aGUgeCBjb21wb25lbnQgb2YgdGhlIHZlY3RvciBpbiBib3RoXHJcblx0ICogZGlyZWN0aW9ucy4gVGhlIGhlaWdodCBvZiB0aGlzIGJveCB3aWxsIGJlIGV4cGFuZGVkIGJ5IHRoZSB5IGNvbXBvbmVudCBvZlxyXG5cdCAqIHRoZSB2ZWN0b3IgaW4gYm90aCBkaXJlY3Rpb25zLiBUaGUgZGVwdGggb2YgdGhpcyBib3ggd2lsbCBiZVxyXG5cdCAqIGV4cGFuZGVkIGJ5IHRoZSB6IGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yIGluIGJvdGggZGlyZWN0aW9ucy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdmVjdG9yIC0gVGhlIHZlY3RvciB0aGF0IHNob3VsZCBleHBhbmQgdGhlIGJvdW5kaW5nIGJveC5cclxuXHQgKiBAcmV0dXJuIHtCb3gzfSBBIHJlZmVyZW5jZSB0byB0aGlzIGJvdW5kaW5nIGJveC5cclxuXHQgKi9cclxuXHRleHBhbmRCeVZlY3RvciggdmVjdG9yICkge1xyXG5cclxuXHRcdHRoaXMubWluLnN1YiggdmVjdG9yICk7XHJcblx0XHR0aGlzLm1heC5hZGQoIHZlY3RvciApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEV4cGFuZHMgZWFjaCBkaW1lbnNpb24gb2YgdGhlIGJveCBieSB0aGUgZ2l2ZW4gc2NhbGFyLiBJZiBuZWdhdGl2ZSwgdGhlXHJcblx0ICogZGltZW5zaW9ucyBvZiB0aGUgYm94IHdpbGwgYmUgY29udHJhY3RlZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzY2FsYXIgLSBUaGUgc2NhbGFyIHZhbHVlIHRoYXQgc2hvdWxkIGV4cGFuZCB0aGUgYm91bmRpbmcgYm94LlxyXG5cdCAqIEByZXR1cm4ge0JveDN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgYm91bmRpbmcgYm94LlxyXG5cdCAqL1xyXG5cdGV4cGFuZEJ5U2NhbGFyKCBzY2FsYXIgKSB7XHJcblxyXG5cdFx0dGhpcy5taW4uYWRkU2NhbGFyKCAtIHNjYWxhciApO1xyXG5cdFx0dGhpcy5tYXguYWRkU2NhbGFyKCBzY2FsYXIgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFeHBhbmRzIHRoZSBib3VuZGFyaWVzIG9mIHRoaXMgYm94IHRvIGluY2x1ZGUgdGhlIGdpdmVuIDNEIG9iamVjdCBhbmRcclxuXHQgKiBpdHMgY2hpbGRyZW4sIGFjY291bnRpbmcgZm9yIHRoZSBvYmplY3QncywgYW5kIGNoaWxkcmVuJ3MsIHdvcmxkXHJcblx0ICogdHJhbnNmb3Jtcy4gVGhlIGZ1bmN0aW9uIG1heSByZXN1bHQgaW4gYSBsYXJnZXIgYm94IHRoYW4gc3RyaWN0bHlcclxuXHQgKiBuZWNlc3NhcnkgKHVubGVzcyB0aGUgcHJlY2lzZSBwYXJhbWV0ZXIgaXMgc2V0IHRvIHRydWUpLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3QzRH0gb2JqZWN0IC0gVGhlIDNEIG9iamVjdCB0aGF0IHNob3VsZCBleHBhbmQgdGhlIGJvdW5kaW5nIGJveC5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IHByZWNpc2UgLSBJZiBzZXQgdG8gYHRydWVgLCB0aGUgbWV0aG9kIGV4cGFuZHMgdGhlIGJvdW5kaW5nIGJveFxyXG5cdCAqIGFzIGxpdHRsZSBhcyBuZWNlc3NhcnkgYXQgdGhlIGV4cGVuc2Ugb2YgbW9yZSBjb21wdXRhdGlvbi5cclxuXHQgKiBAcmV0dXJuIHtCb3gzfSBBIHJlZmVyZW5jZSB0byB0aGlzIGJvdW5kaW5nIGJveC5cclxuXHQgKi9cclxuXHRleHBhbmRCeU9iamVjdCggb2JqZWN0LCBwcmVjaXNlID0gZmFsc2UgKSB7XHJcblxyXG5cdFx0Ly8gQ29tcHV0ZXMgdGhlIHdvcmxkLWF4aXMtYWxpZ25lZCBib3VuZGluZyBib3ggb2YgYW4gb2JqZWN0IChpbmNsdWRpbmcgaXRzIGNoaWxkcmVuKSxcclxuXHRcdC8vIGFjY291bnRpbmcgZm9yIGJvdGggdGhlIG9iamVjdCdzLCBhbmQgY2hpbGRyZW4ncywgd29ybGQgdHJhbnNmb3Jtc1xyXG5cclxuXHRcdG9iamVjdC51cGRhdGVXb3JsZE1hdHJpeCggZmFsc2UsIGZhbHNlICk7XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSBvYmplY3QuZ2VvbWV0cnk7XHJcblxyXG5cdFx0aWYgKCBnZW9tZXRyeSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Y29uc3QgcG9zaXRpb25BdHRyaWJ1dGUgPSBnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKTtcclxuXHJcblx0XHRcdC8vIHByZWNpc2UgQUFCQiBjb21wdXRhdGlvbiBiYXNlZCBvbiB2ZXJ0ZXggZGF0YSByZXF1aXJlcyBhdCBsZWFzdCBhIHBvc2l0aW9uIGF0dHJpYnV0ZS5cclxuXHRcdFx0Ly8gaW5zdGFuY2luZyBpc24ndCBzdXBwb3J0ZWQgc28gZmFyIGFuZCB1c2VzIHRoZSBub3JtYWwgKGNvbnNlcnZhdGl2ZSkgY29kZSBwYXRoLlxyXG5cclxuXHRcdFx0aWYgKCBwcmVjaXNlID09PSB0cnVlICYmIHBvc2l0aW9uQXR0cmlidXRlICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0LmlzSW5zdGFuY2VkTWVzaCAhPT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gcG9zaXRpb25BdHRyaWJ1dGUuY291bnQ7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdGlmICggb2JqZWN0LmlzTWVzaCA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdG9iamVjdC5nZXRWZXJ0ZXhQb3NpdGlvbiggaSwgX3ZlY3RvciApO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRfdmVjdG9yLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uQXR0cmlidXRlLCBpICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdF92ZWN0b3IuYXBwbHlNYXRyaXg0KCBvYmplY3QubWF0cml4V29ybGQgKTtcclxuXHRcdFx0XHRcdHRoaXMuZXhwYW5kQnlQb2ludCggX3ZlY3RvciApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRpZiAoIG9iamVjdC5ib3VuZGluZ0JveCAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdC8vIG9iamVjdC1sZXZlbCBib3VuZGluZyBib3hcclxuXHJcblx0XHRcdFx0XHRpZiAoIG9iamVjdC5ib3VuZGluZ0JveCA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHRcdG9iamVjdC5jb21wdXRlQm91bmRpbmdCb3goKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0X2JveC5jb3B5KCBvYmplY3QuYm91bmRpbmdCb3ggKTtcclxuXHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gZ2VvbWV0cnktbGV2ZWwgYm91bmRpbmcgYm94XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ0JveCA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHRcdGdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ0JveCgpO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRfYm94LmNvcHkoIGdlb21ldHJ5LmJvdW5kaW5nQm94ICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0X2JveC5hcHBseU1hdHJpeDQoIG9iamVjdC5tYXRyaXhXb3JsZCApO1xyXG5cclxuXHRcdFx0XHR0aGlzLnVuaW9uKCBfYm94ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGNoaWxkcmVuID0gb2JqZWN0LmNoaWxkcmVuO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmV4cGFuZEJ5T2JqZWN0KCBjaGlsZHJlblsgaSBdLCBwcmVjaXNlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBnaXZlbiBwb2ludCBsaWVzIHdpdGhpbiBvciBvbiB0aGUgYm91bmRhcmllcyBvZiB0aGlzIGJveC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gcG9pbnQgLSBUaGUgcG9pbnQgdG8gdGVzdC5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBib3VuZGluZyBib3ggY29udGFpbnMgdGhlIGdpdmVuIHBvaW50IG9yIG5vdC5cclxuXHQgKi9cclxuXHRjb250YWluc1BvaW50KCBwb2ludCApIHtcclxuXHJcblx0XHRyZXR1cm4gcG9pbnQueCA+PSB0aGlzLm1pbi54ICYmIHBvaW50LnggPD0gdGhpcy5tYXgueCAmJlxyXG5cdFx0XHRwb2ludC55ID49IHRoaXMubWluLnkgJiYgcG9pbnQueSA8PSB0aGlzLm1heC55ICYmXHJcblx0XHRcdHBvaW50LnogPj0gdGhpcy5taW4ueiAmJiBwb2ludC56IDw9IHRoaXMubWF4Lno7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBib3VuZGluZyBib3ggaW5jbHVkZXMgdGhlIGVudGlyZXR5IG9mIHRoZSBnaXZlbiBib3VuZGluZyBib3guXHJcblx0ICogSWYgdGhpcyBib3ggYW5kIHRoZSBnaXZlbiBvbmUgYXJlIGlkZW50aWNhbCwgdGhpcyBmdW5jdGlvbiBhbHNvIHJldHVybnMgYHRydWVgLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCb3gzfSBib3ggLSBUaGUgYm91bmRpbmcgYm94IHRvIHRlc3QuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgYm91bmRpbmcgYm94IGNvbnRhaW5zIHRoZSBnaXZlbiBib3VuZGluZyBib3ggb3Igbm90LlxyXG5cdCAqL1xyXG5cdGNvbnRhaW5zQm94KCBib3ggKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubWluLnggPD0gYm94Lm1pbi54ICYmIGJveC5tYXgueCA8PSB0aGlzLm1heC54ICYmXHJcblx0XHRcdHRoaXMubWluLnkgPD0gYm94Lm1pbi55ICYmIGJveC5tYXgueSA8PSB0aGlzLm1heC55ICYmXHJcblx0XHRcdHRoaXMubWluLnogPD0gYm94Lm1pbi56ICYmIGJveC5tYXgueiA8PSB0aGlzLm1heC56O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBwb2ludCBhcyBhIHByb3BvcnRpb24gb2YgdGhpcyBib3gncyB3aWR0aCwgaGVpZ2h0IGFuZCBkZXB0aC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gcG9pbnQgLSBBIHBvaW50IGluIDNEIHNwYWNlLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdGFyZ2V0IC0gVGhlIHRhcmdldCB2ZWN0b3IgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBtZXRob2QncyByZXN1bHQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSBwb2ludCBhcyBhIHByb3BvcnRpb24gb2YgdGhpcyBib3gncyB3aWR0aCwgaGVpZ2h0IGFuZCBkZXB0aC5cclxuXHQgKi9cclxuXHRnZXRQYXJhbWV0ZXIoIHBvaW50LCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0Ly8gVGhpcyBjYW4gcG90ZW50aWFsbHkgaGF2ZSBhIGRpdmlkZSBieSB6ZXJvIGlmIHRoZSBib3hcclxuXHRcdC8vIGhhcyBhIHNpemUgZGltZW5zaW9uIG9mIDAuXHJcblxyXG5cdFx0cmV0dXJuIHRhcmdldC5zZXQoXHJcblx0XHRcdCggcG9pbnQueCAtIHRoaXMubWluLnggKSAvICggdGhpcy5tYXgueCAtIHRoaXMubWluLnggKSxcclxuXHRcdFx0KCBwb2ludC55IC0gdGhpcy5taW4ueSApIC8gKCB0aGlzLm1heC55IC0gdGhpcy5taW4ueSApLFxyXG5cdFx0XHQoIHBvaW50LnogLSB0aGlzLm1pbi56ICkgLyAoIHRoaXMubWF4LnogLSB0aGlzLm1pbi56IClcclxuXHRcdCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIGJvdW5kaW5nIGJveCBpbnRlcnNlY3RzIHdpdGggdGhpcyBib3VuZGluZyBib3guXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0JveDN9IGJveCAtIFRoZSBib3VuZGluZyBib3ggdG8gdGVzdC5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBnaXZlbiBib3VuZGluZyBib3ggaW50ZXJzZWN0cyB3aXRoIHRoaXMgYm91bmRpbmcgYm94LlxyXG5cdCAqL1xyXG5cdGludGVyc2VjdHNCb3goIGJveCApIHtcclxuXHJcblx0XHQvLyB1c2luZyA2IHNwbGl0dGluZyBwbGFuZXMgdG8gcnVsZSBvdXQgaW50ZXJzZWN0aW9ucy5cclxuXHRcdHJldHVybiBib3gubWF4LnggPj0gdGhpcy5taW4ueCAmJiBib3gubWluLnggPD0gdGhpcy5tYXgueCAmJlxyXG5cdFx0XHRib3gubWF4LnkgPj0gdGhpcy5taW4ueSAmJiBib3gubWluLnkgPD0gdGhpcy5tYXgueSAmJlxyXG5cdFx0XHRib3gubWF4LnogPj0gdGhpcy5taW4ueiAmJiBib3gubWluLnogPD0gdGhpcy5tYXguejtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gYm91bmRpbmcgc3BoZXJlIGludGVyc2VjdHMgd2l0aCB0aGlzIGJvdW5kaW5nIGJveC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7U3BoZXJlfSBzcGhlcmUgLSBUaGUgYm91bmRpbmcgc3BoZXJlIHRvIHRlc3QuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZ2l2ZW4gYm91bmRpbmcgc3BoZXJlIGludGVyc2VjdHMgd2l0aCB0aGlzIGJvdW5kaW5nIGJveC5cclxuXHQgKi9cclxuXHRpbnRlcnNlY3RzU3BoZXJlKCBzcGhlcmUgKSB7XHJcblxyXG5cdFx0Ly8gRmluZCB0aGUgcG9pbnQgb24gdGhlIEFBQkIgY2xvc2VzdCB0byB0aGUgc3BoZXJlIGNlbnRlci5cclxuXHRcdHRoaXMuY2xhbXBQb2ludCggc3BoZXJlLmNlbnRlciwgX3ZlY3RvciApO1xyXG5cclxuXHRcdC8vIElmIHRoYXQgcG9pbnQgaXMgaW5zaWRlIHRoZSBzcGhlcmUsIHRoZSBBQUJCIGFuZCBzcGhlcmUgaW50ZXJzZWN0LlxyXG5cdFx0cmV0dXJuIF92ZWN0b3IuZGlzdGFuY2VUb1NxdWFyZWQoIHNwaGVyZS5jZW50ZXIgKSA8PSAoIHNwaGVyZS5yYWRpdXMgKiBzcGhlcmUucmFkaXVzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIHBsYW5lIGludGVyc2VjdHMgd2l0aCB0aGlzIGJvdW5kaW5nIGJveC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UGxhbmV9IHBsYW5lIC0gVGhlIHBsYW5lIHRvIHRlc3QuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZ2l2ZW4gcGxhbmUgaW50ZXJzZWN0cyB3aXRoIHRoaXMgYm91bmRpbmcgYm94LlxyXG5cdCAqL1xyXG5cdGludGVyc2VjdHNQbGFuZSggcGxhbmUgKSB7XHJcblxyXG5cdFx0Ly8gV2UgY29tcHV0ZSB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBkb3QgcHJvZHVjdCB2YWx1ZXMuIElmIHRob3NlIHZhbHVlc1xyXG5cdFx0Ly8gYXJlIG9uIHRoZSBzYW1lIHNpZGUgKGJhY2sgb3IgZnJvbnQpIG9mIHRoZSBwbGFuZSwgdGhlbiB0aGVyZSBpcyBubyBpbnRlcnNlY3Rpb24uXHJcblxyXG5cdFx0bGV0IG1pbiwgbWF4O1xyXG5cclxuXHRcdGlmICggcGxhbmUubm9ybWFsLnggPiAwICkge1xyXG5cclxuXHRcdFx0bWluID0gcGxhbmUubm9ybWFsLnggKiB0aGlzLm1pbi54O1xyXG5cdFx0XHRtYXggPSBwbGFuZS5ub3JtYWwueCAqIHRoaXMubWF4Lng7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdG1pbiA9IHBsYW5lLm5vcm1hbC54ICogdGhpcy5tYXgueDtcclxuXHRcdFx0bWF4ID0gcGxhbmUubm9ybWFsLnggKiB0aGlzLm1pbi54O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHBsYW5lLm5vcm1hbC55ID4gMCApIHtcclxuXHJcblx0XHRcdG1pbiArPSBwbGFuZS5ub3JtYWwueSAqIHRoaXMubWluLnk7XHJcblx0XHRcdG1heCArPSBwbGFuZS5ub3JtYWwueSAqIHRoaXMubWF4Lnk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdG1pbiArPSBwbGFuZS5ub3JtYWwueSAqIHRoaXMubWF4Lnk7XHJcblx0XHRcdG1heCArPSBwbGFuZS5ub3JtYWwueSAqIHRoaXMubWluLnk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggcGxhbmUubm9ybWFsLnogPiAwICkge1xyXG5cclxuXHRcdFx0bWluICs9IHBsYW5lLm5vcm1hbC56ICogdGhpcy5taW4uejtcclxuXHRcdFx0bWF4ICs9IHBsYW5lLm5vcm1hbC56ICogdGhpcy5tYXguejtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0bWluICs9IHBsYW5lLm5vcm1hbC56ICogdGhpcy5tYXguejtcclxuXHRcdFx0bWF4ICs9IHBsYW5lLm5vcm1hbC56ICogdGhpcy5taW4uejtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuICggbWluIDw9IC0gcGxhbmUuY29uc3RhbnQgJiYgbWF4ID49IC0gcGxhbmUuY29uc3RhbnQgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gdHJpYW5nbGUgaW50ZXJzZWN0cyB3aXRoIHRoaXMgYm91bmRpbmcgYm94LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUcmlhbmdsZX0gdHJpYW5nbGUgLSBUaGUgdHJpYW5nbGUgdG8gdGVzdC5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBnaXZlbiB0cmlhbmdsZSBpbnRlcnNlY3RzIHdpdGggdGhpcyBib3VuZGluZyBib3guXHJcblx0ICovXHJcblx0aW50ZXJzZWN0c1RyaWFuZ2xlKCB0cmlhbmdsZSApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuaXNFbXB0eSgpICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBjb21wdXRlIGJveCBjZW50ZXIgYW5kIGV4dGVudHNcclxuXHRcdHRoaXMuZ2V0Q2VudGVyKCBfY2VudGVyICk7XHJcblx0XHRfZXh0ZW50cy5zdWJWZWN0b3JzKCB0aGlzLm1heCwgX2NlbnRlciApO1xyXG5cclxuXHRcdC8vIHRyYW5zbGF0ZSB0cmlhbmdsZSB0byBhYWJiIG9yaWdpblxyXG5cdFx0X3YwLnN1YlZlY3RvcnMoIHRyaWFuZ2xlLmEsIF9jZW50ZXIgKTtcclxuXHRcdF92MS5zdWJWZWN0b3JzKCB0cmlhbmdsZS5iLCBfY2VudGVyICk7XHJcblx0XHRfdjIuc3ViVmVjdG9ycyggdHJpYW5nbGUuYywgX2NlbnRlciApO1xyXG5cclxuXHRcdC8vIGNvbXB1dGUgZWRnZSB2ZWN0b3JzIGZvciB0cmlhbmdsZVxyXG5cdFx0X2YwLnN1YlZlY3RvcnMoIF92MSwgX3YwICk7XHJcblx0XHRfZjEuc3ViVmVjdG9ycyggX3YyLCBfdjEgKTtcclxuXHRcdF9mMi5zdWJWZWN0b3JzKCBfdjAsIF92MiApO1xyXG5cclxuXHRcdC8vIHRlc3QgYWdhaW5zdCBheGVzIHRoYXQgYXJlIGdpdmVuIGJ5IGNyb3NzIHByb2R1Y3QgY29tYmluYXRpb25zIG9mIHRoZSBlZGdlcyBvZiB0aGUgdHJpYW5nbGUgYW5kIHRoZSBlZGdlcyBvZiB0aGUgYWFiYlxyXG5cdFx0Ly8gbWFrZSBhbiBheGlzIHRlc3Rpbmcgb2YgZWFjaCBvZiB0aGUgMyBzaWRlcyBvZiB0aGUgYWFiYiBhZ2FpbnN0IGVhY2ggb2YgdGhlIDMgc2lkZXMgb2YgdGhlIHRyaWFuZ2xlID0gOSBheGlzIG9mIHNlcGFyYXRpb25cclxuXHRcdC8vIGF4aXNfaWogPSB1X2kgeCBmX2ogKHUwLCB1MSwgdTIgPSBmYWNlIG5vcm1hbHMgb2YgYWFiYiA9IHgseSx6IGF4ZXMgdmVjdG9ycyBzaW5jZSBhYWJiIGlzIGF4aXMgYWxpZ25lZClcclxuXHRcdGxldCBheGVzID0gW1xyXG5cdFx0XHQwLCAtIF9mMC56LCBfZjAueSwgMCwgLSBfZjEueiwgX2YxLnksIDAsIC0gX2YyLnosIF9mMi55LFxyXG5cdFx0XHRfZjAueiwgMCwgLSBfZjAueCwgX2YxLnosIDAsIC0gX2YxLngsIF9mMi56LCAwLCAtIF9mMi54LFxyXG5cdFx0XHQtIF9mMC55LCBfZjAueCwgMCwgLSBfZjEueSwgX2YxLngsIDAsIC0gX2YyLnksIF9mMi54LCAwXHJcblx0XHRdO1xyXG5cdFx0aWYgKCAhIHNhdEZvckF4ZXMoIGF4ZXMsIF92MCwgX3YxLCBfdjIsIF9leHRlbnRzICkgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIHRlc3QgMyBmYWNlIG5vcm1hbHMgZnJvbSB0aGUgYWFiYlxyXG5cdFx0YXhlcyA9IFsgMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMSBdO1xyXG5cdFx0aWYgKCAhIHNhdEZvckF4ZXMoIGF4ZXMsIF92MCwgX3YxLCBfdjIsIF9leHRlbnRzICkgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGZpbmFsbHkgdGVzdGluZyB0aGUgZmFjZSBub3JtYWwgb2YgdGhlIHRyaWFuZ2xlXHJcblx0XHQvLyB1c2UgYWxyZWFkeSBleGlzdGluZyB0cmlhbmdsZSBlZGdlIHZlY3RvcnMgaGVyZVxyXG5cdFx0X3RyaWFuZ2xlTm9ybWFsLmNyb3NzVmVjdG9ycyggX2YwLCBfZjEgKTtcclxuXHRcdGF4ZXMgPSBbIF90cmlhbmdsZU5vcm1hbC54LCBfdHJpYW5nbGVOb3JtYWwueSwgX3RyaWFuZ2xlTm9ybWFsLnogXTtcclxuXHJcblx0XHRyZXR1cm4gc2F0Rm9yQXhlcyggYXhlcywgX3YwLCBfdjEsIF92MiwgX2V4dGVudHMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDbGFtcHMgdGhlIGdpdmVuIHBvaW50IHdpdGhpbiB0aGUgYm91bmRzIG9mIHRoaXMgYm94LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBwb2ludCAtIFRoZSBwb2ludCB0byBjbGFtcC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHRhcmdldCAtIFRoZSB0YXJnZXQgdmVjdG9yIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbWV0aG9kJ3MgcmVzdWx0LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IFRoZSBjbGFtcGVkIHBvaW50LlxyXG5cdCAqL1xyXG5cdGNsYW1wUG9pbnQoIHBvaW50LCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRhcmdldC5jb3B5KCBwb2ludCApLmNsYW1wKCB0aGlzLm1pbiwgdGhpcy5tYXggKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBldWNsaWRlYW4gZGlzdGFuY2UgZnJvbSBhbnkgZWRnZSBvZiB0aGlzIGJveCB0byB0aGUgc3BlY2lmaWVkIHBvaW50LiBJZlxyXG5cdCAqIHRoZSBnaXZlbiBwb2ludCBsaWVzIGluc2lkZSBvZiB0aGlzIGJveCwgdGhlIGRpc3RhbmNlIHdpbGwgYmUgYDBgLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBwb2ludCAtIFRoZSBwb2ludCB0byBjb21wdXRlIHRoZSBkaXN0YW5jZSB0by5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBldWNsaWRlYW4gZGlzdGFuY2UuXHJcblx0ICovXHJcblx0ZGlzdGFuY2VUb1BvaW50KCBwb2ludCApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5jbGFtcFBvaW50KCBwb2ludCwgX3ZlY3RvciApLmRpc3RhbmNlVG8oIHBvaW50ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIGJvdW5kaW5nIHNwaGVyZSB0aGF0IGVuY2xvc2VzIHRoaXMgYm91bmRpbmcgYm94LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTcGhlcmV9IHRhcmdldCAtIFRoZSB0YXJnZXQgc3BoZXJlIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbWV0aG9kJ3MgcmVzdWx0LlxyXG5cdCAqIEByZXR1cm4ge1NwaGVyZX0gVGhlIGJvdW5kaW5nIHNwaGVyZSB0aGF0IGVuY2xvc2VzIHRoaXMgYm91bmRpbmcgYm94LlxyXG5cdCAqL1xyXG5cdGdldEJvdW5kaW5nU3BoZXJlKCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmlzRW1wdHkoKSApIHtcclxuXHJcblx0XHRcdHRhcmdldC5tYWtlRW1wdHkoKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGhpcy5nZXRDZW50ZXIoIHRhcmdldC5jZW50ZXIgKTtcclxuXHJcblx0XHRcdHRhcmdldC5yYWRpdXMgPSB0aGlzLmdldFNpemUoIF92ZWN0b3IgKS5sZW5ndGgoKSAqIDAuNTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRhcmdldDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoaXMgYm91bmRpbmcgYm94IGFuZCB0aGUgZ2l2ZW4gb25lLCBzZXR0aW5nIHRoZSB1cHBlclxyXG5cdCAqIGJvdW5kIG9mIHRoaXMgYm94IHRvIHRoZSBsZXNzZXIgb2YgdGhlIHR3byBib3hlcycgdXBwZXIgYm91bmRzIGFuZCB0aGVcclxuXHQgKiBsb3dlciBib3VuZCBvZiB0aGlzIGJveCB0byB0aGUgZ3JlYXRlciBvZiB0aGUgdHdvIGJveGVzJyBsb3dlciBib3VuZHMuIElmXHJcblx0ICogdGhlcmUncyBubyBvdmVybGFwLCBtYWtlcyB0aGlzIGJveCBlbXB0eS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Qm94M30gYm94IC0gVGhlIGJvdW5kaW5nIGJveCB0byBpbnRlcnNlY3Qgd2l0aC5cclxuXHQgKiBAcmV0dXJuIHtCb3gzfSBBIHJlZmVyZW5jZSB0byB0aGlzIGJvdW5kaW5nIGJveC5cclxuXHQgKi9cclxuXHRpbnRlcnNlY3QoIGJveCApIHtcclxuXHJcblx0XHR0aGlzLm1pbi5tYXgoIGJveC5taW4gKTtcclxuXHRcdHRoaXMubWF4Lm1pbiggYm94Lm1heCApO1xyXG5cclxuXHRcdC8vIGVuc3VyZSB0aGF0IGlmIHRoZXJlIGlzIG5vIG92ZXJsYXAsIHRoZSByZXN1bHQgaXMgZnVsbHkgZW1wdHksIG5vdCBzbGlnaHRseSBlbXB0eSB3aXRoIG5vbi1pbmYvK2luZiB2YWx1ZXMgdGhhdCB3aWxsIGNhdXNlIHN1YnNlcXVlbmNlIGludGVyc2VjdHMgdG8gZXJyb25lb3VzbHkgcmV0dXJuIHZhbGlkIHZhbHVlcy5cclxuXHRcdGlmICggdGhpcy5pc0VtcHR5KCkgKSB0aGlzLm1ha2VFbXB0eSgpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSB1bmlvbiBvZiB0aGlzIGJveCBhbmQgYW5vdGhlciBhbmQgdGhlIGdpdmVuIG9uZSwgc2V0dGluZyB0aGUgdXBwZXJcclxuXHQgKiBib3VuZCBvZiB0aGlzIGJveCB0byB0aGUgZ3JlYXRlciBvZiB0aGUgdHdvIGJveGVzJyB1cHBlciBib3VuZHMgYW5kIHRoZVxyXG5cdCAqIGxvd2VyIGJvdW5kIG9mIHRoaXMgYm94IHRvIHRoZSBsZXNzZXIgb2YgdGhlIHR3byBib3hlcycgbG93ZXIgYm91bmRzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCb3gzfSBib3ggLSBUaGUgYm91bmRpbmcgYm94IHRoYXQgd2lsbCBiZSB1bmlvbmVkIHdpdGggdGhpcyBpbnN0YW5jZS5cclxuXHQgKiBAcmV0dXJuIHtCb3gzfSBBIHJlZmVyZW5jZSB0byB0aGlzIGJvdW5kaW5nIGJveC5cclxuXHQgKi9cclxuXHR1bmlvbiggYm94ICkge1xyXG5cclxuXHRcdHRoaXMubWluLm1pbiggYm94Lm1pbiApO1xyXG5cdFx0dGhpcy5tYXgubWF4KCBib3gubWF4ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVHJhbnNmb3JtcyB0aGlzIGJvdW5kaW5nIGJveCBieSB0aGUgZ2l2ZW4gNHg0IHRyYW5zZm9ybWF0aW9uIG1hdHJpeC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4NH0gbWF0cml4IC0gVGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC5cclxuXHQgKiBAcmV0dXJuIHtCb3gzfSBBIHJlZmVyZW5jZSB0byB0aGlzIGJvdW5kaW5nIGJveC5cclxuXHQgKi9cclxuXHRhcHBseU1hdHJpeDQoIG1hdHJpeCApIHtcclxuXHJcblx0XHQvLyB0cmFuc2Zvcm0gb2YgZW1wdHkgYm94IGlzIGFuIGVtcHR5IGJveC5cclxuXHRcdGlmICggdGhpcy5pc0VtcHR5KCkgKSByZXR1cm4gdGhpcztcclxuXHJcblx0XHQvLyBOT1RFOiBJIGFtIHVzaW5nIGEgYmluYXJ5IHBhdHRlcm4gdG8gc3BlY2lmeSBhbGwgMl4zIGNvbWJpbmF0aW9ucyBiZWxvd1xyXG5cdFx0X3BvaW50c1sgMCBdLnNldCggdGhpcy5taW4ueCwgdGhpcy5taW4ueSwgdGhpcy5taW4ueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDAwMFxyXG5cdFx0X3BvaW50c1sgMSBdLnNldCggdGhpcy5taW4ueCwgdGhpcy5taW4ueSwgdGhpcy5tYXgueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDAwMVxyXG5cdFx0X3BvaW50c1sgMiBdLnNldCggdGhpcy5taW4ueCwgdGhpcy5tYXgueSwgdGhpcy5taW4ueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDAxMFxyXG5cdFx0X3BvaW50c1sgMyBdLnNldCggdGhpcy5taW4ueCwgdGhpcy5tYXgueSwgdGhpcy5tYXgueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDAxMVxyXG5cdFx0X3BvaW50c1sgNCBdLnNldCggdGhpcy5tYXgueCwgdGhpcy5taW4ueSwgdGhpcy5taW4ueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDEwMFxyXG5cdFx0X3BvaW50c1sgNSBdLnNldCggdGhpcy5tYXgueCwgdGhpcy5taW4ueSwgdGhpcy5tYXgueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDEwMVxyXG5cdFx0X3BvaW50c1sgNiBdLnNldCggdGhpcy5tYXgueCwgdGhpcy5tYXgueSwgdGhpcy5taW4ueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDExMFxyXG5cdFx0X3BvaW50c1sgNyBdLnNldCggdGhpcy5tYXgueCwgdGhpcy5tYXgueSwgdGhpcy5tYXgueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDExMVxyXG5cclxuXHRcdHRoaXMuc2V0RnJvbVBvaW50cyggX3BvaW50cyApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgdGhlIGdpdmVuIG9mZnNldCB0byBib3RoIHRoZSB1cHBlciBhbmQgbG93ZXIgYm91bmRzIG9mIHRoaXMgYm91bmRpbmcgYm94LFxyXG5cdCAqIGVmZmVjdGl2ZWx5IG1vdmluZyBpdCBpbiAzRCBzcGFjZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gb2Zmc2V0IC0gVGhlIG9mZnNldCB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIHRyYW5zbGF0ZSB0aGUgYm91bmRpbmcgYm94LlxyXG5cdCAqIEByZXR1cm4ge0JveDN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgYm91bmRpbmcgYm94LlxyXG5cdCAqL1xyXG5cdHRyYW5zbGF0ZSggb2Zmc2V0ICkge1xyXG5cclxuXHRcdHRoaXMubWluLmFkZCggb2Zmc2V0ICk7XHJcblx0XHR0aGlzLm1heC5hZGQoIG9mZnNldCApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgYm91bmRpbmcgYm94IGlzIGVxdWFsIHdpdGggdGhlIGdpdmVuIG9uZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Qm94M30gYm94IC0gVGhlIGJveCB0byB0ZXN0IGZvciBlcXVhbGl0eS5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoaXMgYm91bmRpbmcgYm94IGlzIGVxdWFsIHdpdGggdGhlIGdpdmVuIG9uZS5cclxuXHQgKi9cclxuXHRlcXVhbHMoIGJveCApIHtcclxuXHJcblx0XHRyZXR1cm4gYm94Lm1pbi5lcXVhbHMoIHRoaXMubWluICkgJiYgYm94Lm1heC5lcXVhbHMoIHRoaXMubWF4ICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmNvbnN0IF9wb2ludHMgPSBbXHJcblx0LypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpLFxyXG5cdC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKSxcclxuXHQvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCksXHJcblx0LypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpLFxyXG5cdC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKSxcclxuXHQvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCksXHJcblx0LypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpLFxyXG5cdC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKVxyXG5dO1xyXG5cclxuY29uc3QgX3ZlY3RvciA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuXHJcbmNvbnN0IF9ib3ggPSAvKkBfX1BVUkVfXyovIG5ldyBCb3gzKCk7XHJcblxyXG4vLyB0cmlhbmdsZSBjZW50ZXJlZCB2ZXJ0aWNlc1xyXG5cclxuY29uc3QgX3YwID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfdjEgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF92MiA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuXHJcbi8vIHRyaWFuZ2xlIGVkZ2UgdmVjdG9yc1xyXG5cclxuY29uc3QgX2YwID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfZjEgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF9mMiA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuXHJcbmNvbnN0IF9jZW50ZXIgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF9leHRlbnRzID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfdHJpYW5nbGVOb3JtYWwgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF90ZXN0QXhpcyA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuXHJcbmZ1bmN0aW9uIHNhdEZvckF4ZXMoIGF4ZXMsIHYwLCB2MSwgdjIsIGV4dGVudHMgKSB7XHJcblxyXG5cdGZvciAoIGxldCBpID0gMCwgaiA9IGF4ZXMubGVuZ3RoIC0gMzsgaSA8PSBqOyBpICs9IDMgKSB7XHJcblxyXG5cdFx0X3Rlc3RBeGlzLmZyb21BcnJheSggYXhlcywgaSApO1xyXG5cdFx0Ly8gcHJvamVjdCB0aGUgYWFiYiBvbnRvIHRoZSBzZXBhcmF0aW5nIGF4aXNcclxuXHRcdGNvbnN0IHIgPSBleHRlbnRzLnggKiBNYXRoLmFicyggX3Rlc3RBeGlzLnggKSArIGV4dGVudHMueSAqIE1hdGguYWJzKCBfdGVzdEF4aXMueSApICsgZXh0ZW50cy56ICogTWF0aC5hYnMoIF90ZXN0QXhpcy56ICk7XHJcblx0XHQvLyBwcm9qZWN0IGFsbCAzIHZlcnRpY2VzIG9mIHRoZSB0cmlhbmdsZSBvbnRvIHRoZSBzZXBhcmF0aW5nIGF4aXNcclxuXHRcdGNvbnN0IHAwID0gdjAuZG90KCBfdGVzdEF4aXMgKTtcclxuXHRcdGNvbnN0IHAxID0gdjEuZG90KCBfdGVzdEF4aXMgKTtcclxuXHRcdGNvbnN0IHAyID0gdjIuZG90KCBfdGVzdEF4aXMgKTtcclxuXHRcdC8vIGFjdHVhbCB0ZXN0LCBiYXNpY2FsbHkgc2VlIGlmIGVpdGhlciBvZiB0aGUgbW9zdCBleHRyZW1lIG9mIHRoZSB0cmlhbmdsZSBwb2ludHMgaW50ZXJzZWN0cyByXHJcblx0XHRpZiAoIE1hdGgubWF4KCAtIE1hdGgubWF4KCBwMCwgcDEsIHAyICksIE1hdGgubWluKCBwMCwgcDEsIHAyICkgKSA+IHIgKSB7XHJcblxyXG5cdFx0XHQvLyBwb2ludHMgb2YgdGhlIHByb2plY3RlZCB0cmlhbmdsZSBhcmUgb3V0c2lkZSB0aGUgcHJvamVjdGVkIGhhbGYtbGVuZ3RoIG9mIHRoZSBhYWJiXHJcblx0XHRcdC8vIHRoZSBheGlzIGlzIHNlcGFyYXRpbmcgYW5kIHdlIGNhbiBleGl0XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIHRydWU7XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBCb3gzIH07XHJcbiIsImltcG9ydCB7IEJveDMgfSBmcm9tICcuL0JveDMuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi9WZWN0b3IzLmpzJztcclxuXHJcbmNvbnN0IF9ib3ggPSAvKkBfX1BVUkVfXyovIG5ldyBCb3gzKCk7XHJcbmNvbnN0IF92MSA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX3YyID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5cclxuLyoqXHJcbiAqIEFuIGFuYWx5dGljYWwgM0Qgc3BoZXJlIGRlZmluZWQgYnkgYSBjZW50ZXIgYW5kIHJhZGl1cy4gVGhpcyBjbGFzcyBpcyBtYWlubHlcclxuICogdXNlZCBhcyBhIEJvdW5kaW5nIFNwaGVyZSBmb3IgM0Qgb2JqZWN0cy5cclxuICovXHJcbmNsYXNzIFNwaGVyZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc3BoZXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBbY2VudGVyPSgwLDAsMCldIC0gVGhlIGNlbnRlciBvZiB0aGUgc3BoZXJlXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpdXM9LTFdIC0gVGhlIHJhZGl1cyBvZiB0aGUgc3BoZXJlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBjZW50ZXIgPSBuZXcgVmVjdG9yMygpLCByYWRpdXMgPSAtIDEgKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzU3BoZXJlID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjZW50ZXIgb2YgdGhlIHNwaGVyZVxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3IzfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNlbnRlciA9IGNlbnRlcjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByYWRpdXMgb2YgdGhlIHNwaGVyZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJhZGl1cyA9IHJhZGl1cztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBzcGhlcmUncyBjb21wb25lbnRzIGJ5IGNvcHlpbmcgdGhlIGdpdmVuIHZhbHVlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gY2VudGVyIC0gVGhlIGNlbnRlci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gcmFkaXVzIC0gVGhlIHJhZGl1cy5cclxuXHQgKiBAcmV0dXJuIHtTcGhlcmV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgc3BoZXJlLlxyXG5cdCAqL1xyXG5cdHNldCggY2VudGVyLCByYWRpdXMgKSB7XHJcblxyXG5cdFx0dGhpcy5jZW50ZXIuY29weSggY2VudGVyICk7XHJcblx0XHR0aGlzLnJhZGl1cyA9IHJhZGl1cztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB0aGUgbWluaW11bSBib3VuZGluZyBzcGhlcmUgZm9yIGxpc3Qgb2YgcG9pbnRzLlxyXG5cdCAqIElmIHRoZSBvcHRpb25hbCBjZW50ZXIgcG9pbnQgaXMgZ2l2ZW4sIGl0IGlzIHVzZWQgYXMgdGhlIHNwaGVyZSdzXHJcblx0ICogY2VudGVyLiBPdGhlcndpc2UsIHRoZSBjZW50ZXIgb2YgdGhlIGF4aXMtYWxpZ25lZCBib3VuZGluZyBib3hcclxuXHQgKiBlbmNvbXBhc3NpbmcgdGhlIHBvaW50cyBpcyBjYWxjdWxhdGVkLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxWZWN0b3IzPn0gcG9pbnRzIC0gQSBsaXN0IG9mIHBvaW50cyBpbiAzRCBzcGFjZS5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IFtvcHRpb25hbENlbnRlcl0gLSBUaGUgY2VudGVyIG9mIHRoZSBzcGhlcmUuXHJcblx0ICogQHJldHVybiB7U3BoZXJlfSBBIHJlZmVyZW5jZSB0byB0aGlzIHNwaGVyZS5cclxuXHQgKi9cclxuXHRzZXRGcm9tUG9pbnRzKCBwb2ludHMsIG9wdGlvbmFsQ2VudGVyICkge1xyXG5cclxuXHRcdGNvbnN0IGNlbnRlciA9IHRoaXMuY2VudGVyO1xyXG5cclxuXHRcdGlmICggb3B0aW9uYWxDZW50ZXIgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGNlbnRlci5jb3B5KCBvcHRpb25hbENlbnRlciApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRfYm94LnNldEZyb21Qb2ludHMoIHBvaW50cyApLmdldENlbnRlciggY2VudGVyICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGxldCBtYXhSYWRpdXNTcSA9IDA7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHRcdG1heFJhZGl1c1NxID0gTWF0aC5tYXgoIG1heFJhZGl1c1NxLCBjZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQoIHBvaW50c1sgaSBdICkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5yYWRpdXMgPSBNYXRoLnNxcnQoIG1heFJhZGl1c1NxICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29waWVzIHRoZSB2YWx1ZXMgb2YgdGhlIGdpdmVuIHNwaGVyZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTcGhlcmV9IHNwaGVyZSAtIFRoZSBzcGhlcmUgdG8gY29weS5cclxuXHQgKiBAcmV0dXJuIHtTcGhlcmV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgc3BoZXJlLlxyXG5cdCAqL1xyXG5cdGNvcHkoIHNwaGVyZSApIHtcclxuXHJcblx0XHR0aGlzLmNlbnRlci5jb3B5KCBzcGhlcmUuY2VudGVyICk7XHJcblx0XHR0aGlzLnJhZGl1cyA9IHNwaGVyZS5yYWRpdXM7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHNwaGVyZSBpcyBlbXB0eSAodGhlIHJhZGl1cyBzZXQgdG8gYSBuZWdhdGl2ZSBudW1iZXIpLlxyXG5cdCAqXHJcblx0ICogU3BoZXJlcyB3aXRoIGEgcmFkaXVzIG9mIGAwYCBjb250YWluIG9ubHkgdGhlaXIgY2VudGVyIHBvaW50IGFuZCBhcmUgbm90XHJcblx0ICogY29uc2lkZXJlZCB0byBiZSBlbXB0eS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyBzcGhlcmUgaXMgZW1wdHkgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGlzRW1wdHkoKSB7XHJcblxyXG5cdFx0cmV0dXJuICggdGhpcy5yYWRpdXMgPCAwICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTWFrZXMgdGhpcyBzcGhlcmUgZW1wdHkgd2hpY2ggbWVhbnMgaW4gZW5jbG9zZXMgYSB6ZXJvIHNwYWNlIGluIDNELlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7U3BoZXJlfSBBIHJlZmVyZW5jZSB0byB0aGlzIHNwaGVyZS5cclxuXHQgKi9cclxuXHRtYWtlRW1wdHkoKSB7XHJcblxyXG5cdFx0dGhpcy5jZW50ZXIuc2V0KCAwLCAwLCAwICk7XHJcblx0XHR0aGlzLnJhZGl1cyA9IC0gMTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIHNwaGVyZSBjb250YWlucyB0aGUgZ2l2ZW4gcG9pbnQgaW5jbHVzaXZlIG9mXHJcblx0ICogdGhlIHN1cmZhY2Ugb2YgdGhlIHNwaGVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gcG9pbnQgLSBUaGUgcG9pbnQgdG8gY2hlY2suXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGlzIHNwaGVyZSBjb250YWlucyB0aGUgZ2l2ZW4gcG9pbnQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGNvbnRhaW5zUG9pbnQoIHBvaW50ICkge1xyXG5cclxuXHRcdHJldHVybiAoIHBvaW50LmRpc3RhbmNlVG9TcXVhcmVkKCB0aGlzLmNlbnRlciApIDw9ICggdGhpcy5yYWRpdXMgKiB0aGlzLnJhZGl1cyApICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgY2xvc2VzdCBkaXN0YW5jZSBmcm9tIHRoZSBib3VuZGFyeSBvZiB0aGUgc3BoZXJlIHRvIHRoZVxyXG5cdCAqIGdpdmVuIHBvaW50LiBJZiB0aGUgc3BoZXJlIGNvbnRhaW5zIHRoZSBwb2ludCwgdGhlIGRpc3RhbmNlIHdpbGxcclxuXHQgKiBiZSBuZWdhdGl2ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gcG9pbnQgLSBUaGUgcG9pbnQgdG8gY29tcHV0ZSB0aGUgZGlzdGFuY2UgdG8uXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgZGlzdGFuY2UgdG8gdGhlIHBvaW50LlxyXG5cdCAqL1xyXG5cdGRpc3RhbmNlVG9Qb2ludCggcG9pbnQgKSB7XHJcblxyXG5cdFx0cmV0dXJuICggcG9pbnQuZGlzdGFuY2VUbyggdGhpcy5jZW50ZXIgKSAtIHRoaXMucmFkaXVzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBzcGhlcmUgaW50ZXJzZWN0cyB3aXRoIHRoZSBnaXZlbiBvbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1NwaGVyZX0gc3BoZXJlIC0gVGhlIHNwaGVyZSB0byB0ZXN0LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyBzcGhlcmUgaW50ZXJzZWN0cyB3aXRoIHRoZSBnaXZlbiBvbmUgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGludGVyc2VjdHNTcGhlcmUoIHNwaGVyZSApIHtcclxuXHJcblx0XHRjb25zdCByYWRpdXNTdW0gPSB0aGlzLnJhZGl1cyArIHNwaGVyZS5yYWRpdXM7XHJcblxyXG5cdFx0cmV0dXJuIHNwaGVyZS5jZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQoIHRoaXMuY2VudGVyICkgPD0gKCByYWRpdXNTdW0gKiByYWRpdXNTdW0gKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIHNwaGVyZSBpbnRlcnNlY3RzIHdpdGggdGhlIGdpdmVuIGJveC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Qm94M30gYm94IC0gVGhlIGJveCB0byB0ZXN0LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyBzcGhlcmUgaW50ZXJzZWN0cyB3aXRoIHRoZSBnaXZlbiBib3ggb3Igbm90LlxyXG5cdCAqL1xyXG5cdGludGVyc2VjdHNCb3goIGJveCApIHtcclxuXHJcblx0XHRyZXR1cm4gYm94LmludGVyc2VjdHNTcGhlcmUoIHRoaXMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIHNwaGVyZSBpbnRlcnNlY3RzIHdpdGggdGhlIGdpdmVuIHBsYW5lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtQbGFuZX0gcGxhbmUgLSBUaGUgcGxhbmUgdG8gdGVzdC5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoaXMgc3BoZXJlIGludGVyc2VjdHMgd2l0aCB0aGUgZ2l2ZW4gcGxhbmUgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGludGVyc2VjdHNQbGFuZSggcGxhbmUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIE1hdGguYWJzKCBwbGFuZS5kaXN0YW5jZVRvUG9pbnQoIHRoaXMuY2VudGVyICkgKSA8PSB0aGlzLnJhZGl1cztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDbGFtcHMgYSBwb2ludCB3aXRoaW4gdGhlIHNwaGVyZS4gSWYgdGhlIHBvaW50IGlzIG91dHNpZGUgdGhlIHNwaGVyZSwgaXRcclxuXHQgKiB3aWxsIGNsYW1wIGl0IHRvIHRoZSBjbG9zZXN0IHBvaW50IG9uIHRoZSBlZGdlIG9mIHRoZSBzcGhlcmUuIFBvaW50c1xyXG5cdCAqIGFscmVhZHkgaW5zaWRlIHRoZSBzcGhlcmUgd2lsbCBub3QgYmUgYWZmZWN0ZWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHBvaW50IC0gVGhlIHBsYW5lIHRvIGNsYW1wLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdGFyZ2V0IC0gVGhlIHRhcmdldCB2ZWN0b3IgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBtZXRob2QncyByZXN1bHQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gVGhlIGNsYW1wZWQgcG9pbnQuXHJcblx0ICovXHJcblx0Y2xhbXBQb2ludCggcG9pbnQsIHRhcmdldCApIHtcclxuXHJcblx0XHRjb25zdCBkZWx0YUxlbmd0aFNxID0gdGhpcy5jZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQoIHBvaW50ICk7XHJcblxyXG5cdFx0dGFyZ2V0LmNvcHkoIHBvaW50ICk7XHJcblxyXG5cdFx0aWYgKCBkZWx0YUxlbmd0aFNxID4gKCB0aGlzLnJhZGl1cyAqIHRoaXMucmFkaXVzICkgKSB7XHJcblxyXG5cdFx0XHR0YXJnZXQuc3ViKCB0aGlzLmNlbnRlciApLm5vcm1hbGl6ZSgpO1xyXG5cdFx0XHR0YXJnZXQubXVsdGlwbHlTY2FsYXIoIHRoaXMucmFkaXVzICkuYWRkKCB0aGlzLmNlbnRlciApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGFyZ2V0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBib3VuZGluZyBib3ggdGhhdCBlbmNsb3NlcyB0aGlzIHNwaGVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Qm94M30gdGFyZ2V0IC0gVGhlIHRhcmdldCBib3ggdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBtZXRob2QncyByZXN1bHQuXHJcblx0ICogQHJldHVybiB7Qm94M30gVGhlIGJvdW5kaW5nIGJveCB0aGF0IGVuY2xvc2VzIHRoaXMgc3BoZXJlLlxyXG5cdCAqL1xyXG5cdGdldEJvdW5kaW5nQm94KCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmlzRW1wdHkoKSApIHtcclxuXHJcblx0XHRcdC8vIEVtcHR5IHNwaGVyZSBwcm9kdWNlcyBlbXB0eSBib3VuZGluZyBib3hcclxuXHRcdFx0dGFyZ2V0Lm1ha2VFbXB0eSgpO1xyXG5cdFx0XHRyZXR1cm4gdGFyZ2V0O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0YXJnZXQuc2V0KCB0aGlzLmNlbnRlciwgdGhpcy5jZW50ZXIgKTtcclxuXHRcdHRhcmdldC5leHBhbmRCeVNjYWxhciggdGhpcy5yYWRpdXMgKTtcclxuXHJcblx0XHRyZXR1cm4gdGFyZ2V0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRyYW5zZm9ybXMgdGhpcyBzcGhlcmUgd2l0aCB0aGUgZ2l2ZW4gNHg0IHRyYW5zZm9ybWF0aW9uIG1hdHJpeC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4NH0gbWF0cml4IC0gVGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC5cclxuXHQgKiBAcmV0dXJuIHtTcGhlcmV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgc3BoZXJlLlxyXG5cdCAqL1xyXG5cdGFwcGx5TWF0cml4NCggbWF0cml4ICkge1xyXG5cclxuXHRcdHRoaXMuY2VudGVyLmFwcGx5TWF0cml4NCggbWF0cml4ICk7XHJcblx0XHR0aGlzLnJhZGl1cyA9IHRoaXMucmFkaXVzICogbWF0cml4LmdldE1heFNjYWxlT25BeGlzKCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVHJhbnNsYXRlcyB0aGUgc3BoZXJlJ3MgY2VudGVyIGJ5IHRoZSBnaXZlbiBvZmZzZXQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IG9mZnNldCAtIFRoZSBvZmZzZXQuXHJcblx0ICogQHJldHVybiB7U3BoZXJlfSBBIHJlZmVyZW5jZSB0byB0aGlzIHNwaGVyZS5cclxuXHQgKi9cclxuXHR0cmFuc2xhdGUoIG9mZnNldCApIHtcclxuXHJcblx0XHR0aGlzLmNlbnRlci5hZGQoIG9mZnNldCApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEV4cGFuZHMgdGhlIGJvdW5kYXJpZXMgb2YgdGhpcyBzcGhlcmUgdG8gaW5jbHVkZSB0aGUgZ2l2ZW4gcG9pbnQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHBvaW50IC0gVGhlIHBvaW50IHRvIGluY2x1ZGUuXHJcblx0ICogQHJldHVybiB7U3BoZXJlfSBBIHJlZmVyZW5jZSB0byB0aGlzIHNwaGVyZS5cclxuXHQgKi9cclxuXHRleHBhbmRCeVBvaW50KCBwb2ludCApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuaXNFbXB0eSgpICkge1xyXG5cclxuXHRcdFx0dGhpcy5jZW50ZXIuY29weSggcG9pbnQgKTtcclxuXHJcblx0XHRcdHRoaXMucmFkaXVzID0gMDtcclxuXHJcblx0XHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRfdjEuc3ViVmVjdG9ycyggcG9pbnQsIHRoaXMuY2VudGVyICk7XHJcblxyXG5cdFx0Y29uc3QgbGVuZ3RoU3EgPSBfdjEubGVuZ3RoU3EoKTtcclxuXHJcblx0XHRpZiAoIGxlbmd0aFNxID4gKCB0aGlzLnJhZGl1cyAqIHRoaXMucmFkaXVzICkgKSB7XHJcblxyXG5cdFx0XHQvLyBjYWxjdWxhdGUgdGhlIG1pbmltYWwgc3BoZXJlXHJcblxyXG5cdFx0XHRjb25zdCBsZW5ndGggPSBNYXRoLnNxcnQoIGxlbmd0aFNxICk7XHJcblxyXG5cdFx0XHRjb25zdCBkZWx0YSA9ICggbGVuZ3RoIC0gdGhpcy5yYWRpdXMgKSAqIDAuNTtcclxuXHJcblx0XHRcdHRoaXMuY2VudGVyLmFkZFNjYWxlZFZlY3RvciggX3YxLCBkZWx0YSAvIGxlbmd0aCApO1xyXG5cclxuXHRcdFx0dGhpcy5yYWRpdXMgKz0gZGVsdGE7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEV4cGFuZHMgdGhpcyBzcGhlcmUgdG8gZW5jbG9zZSBib3RoIHRoZSBvcmlnaW5hbCBzcGhlcmUgYW5kIHRoZSBnaXZlbiBzcGhlcmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1NwaGVyZX0gc3BoZXJlIC0gVGhlIHNwaGVyZSB0byBpbmNsdWRlLlxyXG5cdCAqIEByZXR1cm4ge1NwaGVyZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBzcGhlcmUuXHJcblx0ICovXHJcblx0dW5pb24oIHNwaGVyZSApIHtcclxuXHJcblx0XHRpZiAoIHNwaGVyZS5pc0VtcHR5KCkgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aGlzLmlzRW1wdHkoKSApIHtcclxuXHJcblx0XHRcdHRoaXMuY29weSggc3BoZXJlICk7XHJcblxyXG5cdFx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aGlzLmNlbnRlci5lcXVhbHMoIHNwaGVyZS5jZW50ZXIgKSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdCB0aGlzLnJhZGl1cyA9IE1hdGgubWF4KCB0aGlzLnJhZGl1cywgc3BoZXJlLnJhZGl1cyApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRfdjIuc3ViVmVjdG9ycyggc3BoZXJlLmNlbnRlciwgdGhpcy5jZW50ZXIgKS5zZXRMZW5ndGgoIHNwaGVyZS5yYWRpdXMgKTtcclxuXHJcblx0XHRcdHRoaXMuZXhwYW5kQnlQb2ludCggX3YxLmNvcHkoIHNwaGVyZS5jZW50ZXIgKS5hZGQoIF92MiApICk7XHJcblxyXG5cdFx0XHR0aGlzLmV4cGFuZEJ5UG9pbnQoIF92MS5jb3B5KCBzcGhlcmUuY2VudGVyICkuc3ViKCBfdjIgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIHNwaGVyZSBpcyBlcXVhbCB3aXRoIHRoZSBnaXZlbiBvbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1NwaGVyZX0gc3BoZXJlIC0gVGhlIHNwaGVyZSB0byB0ZXN0IGZvciBlcXVhbGl0eS5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoaXMgYm91bmRpbmcgc3BoZXJlIGlzIGVxdWFsIHdpdGggdGhlIGdpdmVuIG9uZS5cclxuXHQgKi9cclxuXHRlcXVhbHMoIHNwaGVyZSApIHtcclxuXHJcblx0XHRyZXR1cm4gc3BoZXJlLmNlbnRlci5lcXVhbHMoIHRoaXMuY2VudGVyICkgJiYgKCBzcGhlcmUucmFkaXVzID09PSB0aGlzLnJhZGl1cyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBuZXcgc3BoZXJlIHdpdGggY29waWVkIHZhbHVlcyBmcm9tIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtTcGhlcmV9IEEgY2xvbmUgb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjbG9uZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFNwaGVyZSB9O1xyXG4iLCJpbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi9WZWN0b3IzLmpzJztcclxuXHJcbmNvbnN0IF92ZWN0b3IgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF9zZWdDZW50ZXIgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF9zZWdEaXIgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF9kaWZmID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5cclxuY29uc3QgX2VkZ2UxID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfZWRnZTIgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF9ub3JtYWwgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcblxyXG4vKipcclxuICogQSByYXkgdGhhdCBlbWl0cyBmcm9tIGFuIG9yaWdpbiBpbiBhIGNlcnRhaW4gZGlyZWN0aW9uLiBUaGUgY2xhc3MgaXMgdXNlZCBieVxyXG4gKiB7QGxpbmsgUmF5Y2FzdGVyfSB0byBhc3Npc3Qgd2l0aCByYXljYXN0aW5nLiBSYXljYXN0aW5nIGlzIHVzZWQgZm9yXHJcbiAqIG1vdXNlIHBpY2tpbmcgKHdvcmtpbmcgb3V0IHdoYXQgb2JqZWN0cyBpbiB0aGUgM0Qgc3BhY2UgdGhlIG1vdXNlIGlzIG92ZXIpXHJcbiAqIGFtb25nc3Qgb3RoZXIgdGhpbmdzLlxyXG4gKi9cclxuY2xhc3MgUmF5IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyByYXkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IFtvcmlnaW49KDAsMCwwKV0gLSBUaGUgb3JpZ2luIG9mIHRoZSByYXkuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBbZGlyZWN0aW9uPSgwLDAsLTEpXSAtIFRoZSAobm9ybWFsaXplZCkgZGlyZWN0aW9uIG9mIHRoZSByYXkuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG9yaWdpbiA9IG5ldyBWZWN0b3IzKCksIGRpcmVjdGlvbiA9IG5ldyBWZWN0b3IzKCAwLCAwLCAtIDEgKSApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBvcmlnaW4gb2YgdGhlIHJheS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yM31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5vcmlnaW4gPSBvcmlnaW47XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgKG5vcm1hbGl6ZWQpIGRpcmVjdGlvbiBvZiB0aGUgcmF5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3IzfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRpcmVjdGlvbiA9IGRpcmVjdGlvbjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSByYXkncyBjb21wb25lbnRzIGJ5IGNvcHlpbmcgdGhlIGdpdmVuIHZhbHVlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gb3JpZ2luIC0gVGhlIG9yaWdpbi5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IGRpcmVjdGlvbiAtIFRoZSBkaXJlY3Rpb24uXHJcblx0ICogQHJldHVybiB7UmF5fSBBIHJlZmVyZW5jZSB0byB0aGlzIHJheS5cclxuXHQgKi9cclxuXHRzZXQoIG9yaWdpbiwgZGlyZWN0aW9uICkge1xyXG5cclxuXHRcdHRoaXMub3JpZ2luLmNvcHkoIG9yaWdpbiApO1xyXG5cdFx0dGhpcy5kaXJlY3Rpb24uY29weSggZGlyZWN0aW9uICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29waWVzIHRoZSB2YWx1ZXMgb2YgdGhlIGdpdmVuIHJheSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSYXl9IHJheSAtIFRoZSByYXkgdG8gY29weS5cclxuXHQgKiBAcmV0dXJuIHtSYXl9IEEgcmVmZXJlbmNlIHRvIHRoaXMgcmF5LlxyXG5cdCAqL1xyXG5cdGNvcHkoIHJheSApIHtcclxuXHJcblx0XHR0aGlzLm9yaWdpbi5jb3B5KCByYXkub3JpZ2luICk7XHJcblx0XHR0aGlzLmRpcmVjdGlvbi5jb3B5KCByYXkuZGlyZWN0aW9uICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIHZlY3RvciB0aGF0IGlzIGxvY2F0ZWQgYXQgYSBnaXZlbiBkaXN0YW5jZSBhbG9uZyB0aGlzIHJheS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0IC0gVGhlIGRpc3RhbmNlIGFsb25nIHRoZSByYXkgdG8gcmV0cmlldmUgYSBwb3NpdGlvbiBmb3IuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IHZlY3RvciB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGhvZCdzIHJlc3VsdC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHBvc2l0aW9uIG9uIHRoZSByYXkuXHJcblx0ICovXHJcblx0YXQoIHQsIHRhcmdldCApIHtcclxuXHJcblx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIHRoaXMub3JpZ2luICkuYWRkU2NhbGVkVmVjdG9yKCB0aGlzLmRpcmVjdGlvbiwgdCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkanVzdHMgdGhlIGRpcmVjdGlvbiBvZiB0aGUgcmF5IHRvIHBvaW50IGF0IHRoZSBnaXZlbiB2ZWN0b3IgaW4gd29ybGQgc3BhY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHYgLSBUaGUgdGFyZ2V0IHBvc2l0aW9uLlxyXG5cdCAqIEByZXR1cm4ge1JheX0gQSByZWZlcmVuY2UgdG8gdGhpcyByYXkuXHJcblx0ICovXHJcblx0bG9va0F0KCB2ICkge1xyXG5cclxuXHRcdHRoaXMuZGlyZWN0aW9uLmNvcHkoIHYgKS5zdWIoIHRoaXMub3JpZ2luICkubm9ybWFsaXplKCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2hpZnQgdGhlIG9yaWdpbiBvZiB0aGlzIHJheSBhbG9uZyBpdHMgZGlyZWN0aW9uIGJ5IHRoZSBnaXZlbiBkaXN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0IC0gVGhlIGRpc3RhbmNlIGFsb25nIHRoZSByYXkgdG8gaW50ZXJwb2xhdGUuXHJcblx0ICogQHJldHVybiB7UmF5fSBBIHJlZmVyZW5jZSB0byB0aGlzIHJheS5cclxuXHQgKi9cclxuXHRyZWNhc3QoIHQgKSB7XHJcblxyXG5cdFx0dGhpcy5vcmlnaW4uY29weSggdGhpcy5hdCggdCwgX3ZlY3RvciApICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgcG9pbnQgYWxvbmcgdGhpcyByYXkgdGhhdCBpcyBjbG9zZXN0IHRvIHRoZSBnaXZlbiBwb2ludC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gcG9pbnQgLSBBIHBvaW50IGluIDNEIHNwYWNlIHRvIGdldCB0aGUgY2xvc2V0IGxvY2F0aW9uIG9uIHRoZSByYXkgZm9yLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdGFyZ2V0IC0gVGhlIHRhcmdldCB2ZWN0b3IgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBtZXRob2QncyByZXN1bHQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gVGhlIGNsb3Nlc3QgcG9pbnQgb24gdGhpcyByYXkuXHJcblx0ICovXHJcblx0Y2xvc2VzdFBvaW50VG9Qb2ludCggcG9pbnQsIHRhcmdldCApIHtcclxuXHJcblx0XHR0YXJnZXQuc3ViVmVjdG9ycyggcG9pbnQsIHRoaXMub3JpZ2luICk7XHJcblxyXG5cdFx0Y29uc3QgZGlyZWN0aW9uRGlzdGFuY2UgPSB0YXJnZXQuZG90KCB0aGlzLmRpcmVjdGlvbiApO1xyXG5cclxuXHRcdGlmICggZGlyZWN0aW9uRGlzdGFuY2UgPCAwICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIHRhcmdldC5jb3B5KCB0aGlzLm9yaWdpbiApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIHRoaXMub3JpZ2luICkuYWRkU2NhbGVkVmVjdG9yKCB0aGlzLmRpcmVjdGlvbiwgZGlyZWN0aW9uRGlzdGFuY2UgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBkaXN0YW5jZSBvZiB0aGUgY2xvc2VzdCBhcHByb2FjaCBiZXR3ZWVuIHRoaXMgcmF5IGFuZCB0aGUgZ2l2ZW4gcG9pbnQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHBvaW50IC0gQSBwb2ludCBpbiAzRCBzcGFjZSB0byBjb21wdXRlIHRoZSBkaXN0YW5jZSB0by5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBkaXN0YW5jZS5cclxuXHQgKi9cclxuXHRkaXN0YW5jZVRvUG9pbnQoIHBvaW50ICkge1xyXG5cclxuXHRcdHJldHVybiBNYXRoLnNxcnQoIHRoaXMuZGlzdGFuY2VTcVRvUG9pbnQoIHBvaW50ICkgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBzcXVhcmVkIGRpc3RhbmNlIG9mIHRoZSBjbG9zZXN0IGFwcHJvYWNoIGJldHdlZW4gdGhpcyByYXkgYW5kIHRoZSBnaXZlbiBwb2ludC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gcG9pbnQgLSBBIHBvaW50IGluIDNEIHNwYWNlIHRvIGNvbXB1dGUgdGhlIGRpc3RhbmNlIHRvLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIHNxdWFyZWQgZGlzdGFuY2UuXHJcblx0ICovXHJcblx0ZGlzdGFuY2VTcVRvUG9pbnQoIHBvaW50ICkge1xyXG5cclxuXHRcdGNvbnN0IGRpcmVjdGlvbkRpc3RhbmNlID0gX3ZlY3Rvci5zdWJWZWN0b3JzKCBwb2ludCwgdGhpcy5vcmlnaW4gKS5kb3QoIHRoaXMuZGlyZWN0aW9uICk7XHJcblxyXG5cdFx0Ly8gcG9pbnQgYmVoaW5kIHRoZSByYXlcclxuXHJcblx0XHRpZiAoIGRpcmVjdGlvbkRpc3RhbmNlIDwgMCApIHtcclxuXHJcblx0XHRcdHJldHVybiB0aGlzLm9yaWdpbi5kaXN0YW5jZVRvU3F1YXJlZCggcG9pbnQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0X3ZlY3Rvci5jb3B5KCB0aGlzLm9yaWdpbiApLmFkZFNjYWxlZFZlY3RvciggdGhpcy5kaXJlY3Rpb24sIGRpcmVjdGlvbkRpc3RhbmNlICk7XHJcblxyXG5cdFx0cmV0dXJuIF92ZWN0b3IuZGlzdGFuY2VUb1NxdWFyZWQoIHBvaW50ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgc3F1YXJlZCBkaXN0YW5jZSBiZXR3ZWVuIHRoaXMgcmF5IGFuZCB0aGUgZ2l2ZW4gbGluZSBzZWdtZW50LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB2MCAtIFRoZSBzdGFydCBwb2ludCBvZiB0aGUgbGluZSBzZWdtZW50LlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdjEgLSBUaGUgZW5kIHBvaW50IG9mIHRoZSBsaW5lIHNlZ21lbnQuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBbb3B0aW9uYWxQb2ludE9uUmF5XSAtIFdoZW4gcHJvdmlkZWQsIGl0IHJlY2VpdmVzIHRoZSBwb2ludCBvbiB0aGlzIHJheSB0aGF0IGlzIGNsb3Nlc3QgdG8gdGhlIHNlZ21lbnQuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBbb3B0aW9uYWxQb2ludE9uU2VnbWVudF0gLSBXaGVuIHByb3ZpZGVkLCBpdCByZWNlaXZlcyB0aGUgcG9pbnQgb24gdGhlIGxpbmUgc2VnbWVudCB0aGF0IGlzIGNsb3Nlc3QgdG8gdGhpcyByYXkuXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgc3F1YXJlZCBkaXN0YW5jZS5cclxuXHQgKi9cclxuXHRkaXN0YW5jZVNxVG9TZWdtZW50KCB2MCwgdjEsIG9wdGlvbmFsUG9pbnRPblJheSwgb3B0aW9uYWxQb2ludE9uU2VnbWVudCApIHtcclxuXHJcblx0XHQvLyBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9wbWpvbmlhay9HZW9tZXRyaWNUb29scy9ibG9iL21hc3Rlci9HVEVuZ2luZS9JbmNsdWRlL01hdGhlbWF0aWNzL0d0ZURpc3RSYXlTZWdtZW50LmhcclxuXHRcdC8vIEl0IHJldHVybnMgdGhlIG1pbiBkaXN0YW5jZSBiZXR3ZWVuIHRoZSByYXkgYW5kIHRoZSBzZWdtZW50XHJcblx0XHQvLyBkZWZpbmVkIGJ5IHYwIGFuZCB2MVxyXG5cdFx0Ly8gSXQgY2FuIGFsc28gc2V0IHR3byBvcHRpb25hbCB0YXJnZXRzIDpcclxuXHRcdC8vIC0gVGhlIGNsb3Nlc3QgcG9pbnQgb24gdGhlIHJheVxyXG5cdFx0Ly8gLSBUaGUgY2xvc2VzdCBwb2ludCBvbiB0aGUgc2VnbWVudFxyXG5cclxuXHRcdF9zZWdDZW50ZXIuY29weSggdjAgKS5hZGQoIHYxICkubXVsdGlwbHlTY2FsYXIoIDAuNSApO1xyXG5cdFx0X3NlZ0Rpci5jb3B5KCB2MSApLnN1YiggdjAgKS5ub3JtYWxpemUoKTtcclxuXHRcdF9kaWZmLmNvcHkoIHRoaXMub3JpZ2luICkuc3ViKCBfc2VnQ2VudGVyICk7XHJcblxyXG5cdFx0Y29uc3Qgc2VnRXh0ZW50ID0gdjAuZGlzdGFuY2VUbyggdjEgKSAqIDAuNTtcclxuXHRcdGNvbnN0IGEwMSA9IC0gdGhpcy5kaXJlY3Rpb24uZG90KCBfc2VnRGlyICk7XHJcblx0XHRjb25zdCBiMCA9IF9kaWZmLmRvdCggdGhpcy5kaXJlY3Rpb24gKTtcclxuXHRcdGNvbnN0IGIxID0gLSBfZGlmZi5kb3QoIF9zZWdEaXIgKTtcclxuXHRcdGNvbnN0IGMgPSBfZGlmZi5sZW5ndGhTcSgpO1xyXG5cdFx0Y29uc3QgZGV0ID0gTWF0aC5hYnMoIDEgLSBhMDEgKiBhMDEgKTtcclxuXHRcdGxldCBzMCwgczEsIHNxckRpc3QsIGV4dERldDtcclxuXHJcblx0XHRpZiAoIGRldCA+IDAgKSB7XHJcblxyXG5cdFx0XHQvLyBUaGUgcmF5IGFuZCBzZWdtZW50IGFyZSBub3QgcGFyYWxsZWwuXHJcblxyXG5cdFx0XHRzMCA9IGEwMSAqIGIxIC0gYjA7XHJcblx0XHRcdHMxID0gYTAxICogYjAgLSBiMTtcclxuXHRcdFx0ZXh0RGV0ID0gc2VnRXh0ZW50ICogZGV0O1xyXG5cclxuXHRcdFx0aWYgKCBzMCA+PSAwICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIHMxID49IC0gZXh0RGV0ICkge1xyXG5cclxuXHRcdFx0XHRcdGlmICggczEgPD0gZXh0RGV0ICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Ly8gcmVnaW9uIDBcclxuXHRcdFx0XHRcdFx0Ly8gTWluaW11bSBhdCBpbnRlcmlvciBwb2ludHMgb2YgcmF5IGFuZCBzZWdtZW50LlxyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgaW52RGV0ID0gMSAvIGRldDtcclxuXHRcdFx0XHRcdFx0czAgKj0gaW52RGV0O1xyXG5cdFx0XHRcdFx0XHRzMSAqPSBpbnZEZXQ7XHJcblx0XHRcdFx0XHRcdHNxckRpc3QgPSBzMCAqICggczAgKyBhMDEgKiBzMSArIDIgKiBiMCApICsgczEgKiAoIGEwMSAqIHMwICsgczEgKyAyICogYjEgKSArIGM7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdC8vIHJlZ2lvbiAxXHJcblxyXG5cdFx0XHRcdFx0XHRzMSA9IHNlZ0V4dGVudDtcclxuXHRcdFx0XHRcdFx0czAgPSBNYXRoLm1heCggMCwgLSAoIGEwMSAqIHMxICsgYjAgKSApO1xyXG5cdFx0XHRcdFx0XHRzcXJEaXN0ID0gLSBzMCAqIHMwICsgczEgKiAoIHMxICsgMiAqIGIxICkgKyBjO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHQvLyByZWdpb24gNVxyXG5cclxuXHRcdFx0XHRcdHMxID0gLSBzZWdFeHRlbnQ7XHJcblx0XHRcdFx0XHRzMCA9IE1hdGgubWF4KCAwLCAtICggYTAxICogczEgKyBiMCApICk7XHJcblx0XHRcdFx0XHRzcXJEaXN0ID0gLSBzMCAqIHMwICsgczEgKiAoIHMxICsgMiAqIGIxICkgKyBjO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRpZiAoIHMxIDw9IC0gZXh0RGV0ICkge1xyXG5cclxuXHRcdFx0XHRcdC8vIHJlZ2lvbiA0XHJcblxyXG5cdFx0XHRcdFx0czAgPSBNYXRoLm1heCggMCwgLSAoIC0gYTAxICogc2VnRXh0ZW50ICsgYjAgKSApO1xyXG5cdFx0XHRcdFx0czEgPSAoIHMwID4gMCApID8gLSBzZWdFeHRlbnQgOiBNYXRoLm1pbiggTWF0aC5tYXgoIC0gc2VnRXh0ZW50LCAtIGIxICksIHNlZ0V4dGVudCApO1xyXG5cdFx0XHRcdFx0c3FyRGlzdCA9IC0gczAgKiBzMCArIHMxICogKCBzMSArIDIgKiBiMSApICsgYztcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggczEgPD0gZXh0RGV0ICkge1xyXG5cclxuXHRcdFx0XHRcdC8vIHJlZ2lvbiAzXHJcblxyXG5cdFx0XHRcdFx0czAgPSAwO1xyXG5cdFx0XHRcdFx0czEgPSBNYXRoLm1pbiggTWF0aC5tYXgoIC0gc2VnRXh0ZW50LCAtIGIxICksIHNlZ0V4dGVudCApO1xyXG5cdFx0XHRcdFx0c3FyRGlzdCA9IHMxICogKCBzMSArIDIgKiBiMSApICsgYztcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHQvLyByZWdpb24gMlxyXG5cclxuXHRcdFx0XHRcdHMwID0gTWF0aC5tYXgoIDAsIC0gKCBhMDEgKiBzZWdFeHRlbnQgKyBiMCApICk7XHJcblx0XHRcdFx0XHRzMSA9ICggczAgPiAwICkgPyBzZWdFeHRlbnQgOiBNYXRoLm1pbiggTWF0aC5tYXgoIC0gc2VnRXh0ZW50LCAtIGIxICksIHNlZ0V4dGVudCApO1xyXG5cdFx0XHRcdFx0c3FyRGlzdCA9IC0gczAgKiBzMCArIHMxICogKCBzMSArIDIgKiBiMSApICsgYztcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHQvLyBSYXkgYW5kIHNlZ21lbnQgYXJlIHBhcmFsbGVsLlxyXG5cclxuXHRcdFx0czEgPSAoIGEwMSA+IDAgKSA/IC0gc2VnRXh0ZW50IDogc2VnRXh0ZW50O1xyXG5cdFx0XHRzMCA9IE1hdGgubWF4KCAwLCAtICggYTAxICogczEgKyBiMCApICk7XHJcblx0XHRcdHNxckRpc3QgPSAtIHMwICogczAgKyBzMSAqICggczEgKyAyICogYjEgKSArIGM7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggb3B0aW9uYWxQb2ludE9uUmF5ICkge1xyXG5cclxuXHRcdFx0b3B0aW9uYWxQb2ludE9uUmF5LmNvcHkoIHRoaXMub3JpZ2luICkuYWRkU2NhbGVkVmVjdG9yKCB0aGlzLmRpcmVjdGlvbiwgczAgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBvcHRpb25hbFBvaW50T25TZWdtZW50ICkge1xyXG5cclxuXHRcdFx0b3B0aW9uYWxQb2ludE9uU2VnbWVudC5jb3B5KCBfc2VnQ2VudGVyICkuYWRkU2NhbGVkVmVjdG9yKCBfc2VnRGlyLCBzMSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gc3FyRGlzdDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJbnRlcnNlY3RzIHRoaXMgcmF5IHdpdGggdGhlIGdpdmVuIHNwaGVyZSwgcmV0dXJuaW5nIHRoZSBpbnRlcnNlY3Rpb25cclxuXHQgKiBwb2ludCBvciBgbnVsbGAgaWYgdGhlcmUgaXMgbm8gaW50ZXJzZWN0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTcGhlcmV9IHNwaGVyZSAtIFRoZSBzcGhlcmUgdG8gaW50ZXJzZWN0LlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdGFyZ2V0IC0gVGhlIHRhcmdldCB2ZWN0b3IgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBtZXRob2QncyByZXN1bHQuXHJcblx0ICogQHJldHVybiB7P1ZlY3RvcjN9IFRoZSBpbnRlcnNlY3Rpb24gcG9pbnQuXHJcblx0ICovXHJcblx0aW50ZXJzZWN0U3BoZXJlKCBzcGhlcmUsIHRhcmdldCApIHtcclxuXHJcblx0XHRfdmVjdG9yLnN1YlZlY3RvcnMoIHNwaGVyZS5jZW50ZXIsIHRoaXMub3JpZ2luICk7XHJcblx0XHRjb25zdCB0Y2EgPSBfdmVjdG9yLmRvdCggdGhpcy5kaXJlY3Rpb24gKTtcclxuXHRcdGNvbnN0IGQyID0gX3ZlY3Rvci5kb3QoIF92ZWN0b3IgKSAtIHRjYSAqIHRjYTtcclxuXHRcdGNvbnN0IHJhZGl1czIgPSBzcGhlcmUucmFkaXVzICogc3BoZXJlLnJhZGl1cztcclxuXHJcblx0XHRpZiAoIGQyID4gcmFkaXVzMiApIHJldHVybiBudWxsO1xyXG5cclxuXHRcdGNvbnN0IHRoYyA9IE1hdGguc3FydCggcmFkaXVzMiAtIGQyICk7XHJcblxyXG5cdFx0Ly8gdDAgPSBmaXJzdCBpbnRlcnNlY3QgcG9pbnQgLSBlbnRyYW5jZSBvbiBmcm9udCBvZiBzcGhlcmVcclxuXHRcdGNvbnN0IHQwID0gdGNhIC0gdGhjO1xyXG5cclxuXHRcdC8vIHQxID0gc2Vjb25kIGludGVyc2VjdCBwb2ludCAtIGV4aXQgcG9pbnQgb24gYmFjayBvZiBzcGhlcmVcclxuXHRcdGNvbnN0IHQxID0gdGNhICsgdGhjO1xyXG5cclxuXHRcdC8vIHRlc3QgdG8gc2VlIGlmIHQxIGlzIGJlaGluZCB0aGUgcmF5IC0gaWYgc28sIHJldHVybiBudWxsXHJcblx0XHRpZiAoIHQxIDwgMCApIHJldHVybiBudWxsO1xyXG5cclxuXHRcdC8vIHRlc3QgdG8gc2VlIGlmIHQwIGlzIGJlaGluZCB0aGUgcmF5OlxyXG5cdFx0Ly8gaWYgaXQgaXMsIHRoZSByYXkgaXMgaW5zaWRlIHRoZSBzcGhlcmUsIHNvIHJldHVybiB0aGUgc2Vjb25kIGV4aXQgcG9pbnQgc2NhbGVkIGJ5IHQxLFxyXG5cdFx0Ly8gaW4gb3JkZXIgdG8gYWx3YXlzIHJldHVybiBhbiBpbnRlcnNlY3QgcG9pbnQgdGhhdCBpcyBpbiBmcm9udCBvZiB0aGUgcmF5LlxyXG5cdFx0aWYgKCB0MCA8IDAgKSByZXR1cm4gdGhpcy5hdCggdDEsIHRhcmdldCApO1xyXG5cclxuXHRcdC8vIGVsc2UgdDAgaXMgaW4gZnJvbnQgb2YgdGhlIHJheSwgc28gcmV0dXJuIHRoZSBmaXJzdCBjb2xsaXNpb24gcG9pbnQgc2NhbGVkIGJ5IHQwXHJcblx0XHRyZXR1cm4gdGhpcy5hdCggdDAsIHRhcmdldCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgcmF5IGludGVyc2VjdHMgd2l0aCB0aGUgZ2l2ZW4gc3BoZXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTcGhlcmV9IHNwaGVyZSAtIFRoZSBzcGhlcmUgdG8gaW50ZXJzZWN0LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyByYXkgaW50ZXJzZWN0cyB3aXRoIHRoZSBnaXZlbiBzcGhlcmUgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGludGVyc2VjdHNTcGhlcmUoIHNwaGVyZSApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5kaXN0YW5jZVNxVG9Qb2ludCggc3BoZXJlLmNlbnRlciApIDw9ICggc3BoZXJlLnJhZGl1cyAqIHNwaGVyZS5yYWRpdXMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgcmF5J3Mgb3JpZ2luIHRvIHRoZSBnaXZlbiBwbGFuZS4gUmV0dXJucyBgbnVsbGAgaWYgdGhlIHJheVxyXG5cdCAqIGRvZXMgbm90IGludGVyc2VjdCB3aXRoIHRoZSBwbGFuZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UGxhbmV9IHBsYW5lIC0gVGhlIHBsYW5lIHRvIGNvbXB1dGUgdGhlIGRpc3RhbmNlIHRvLlxyXG5cdCAqIEByZXR1cm4gez9udW1iZXJ9IFdoZXRoZXIgdGhpcyByYXkgaW50ZXJzZWN0cyB3aXRoIHRoZSBnaXZlbiBzcGhlcmUgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGRpc3RhbmNlVG9QbGFuZSggcGxhbmUgKSB7XHJcblxyXG5cdFx0Y29uc3QgZGVub21pbmF0b3IgPSBwbGFuZS5ub3JtYWwuZG90KCB0aGlzLmRpcmVjdGlvbiApO1xyXG5cclxuXHRcdGlmICggZGVub21pbmF0b3IgPT09IDAgKSB7XHJcblxyXG5cdFx0XHQvLyBsaW5lIGlzIGNvcGxhbmFyLCByZXR1cm4gb3JpZ2luXHJcblx0XHRcdGlmICggcGxhbmUuZGlzdGFuY2VUb1BvaW50KCB0aGlzLm9yaWdpbiApID09PSAwICkge1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gMDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIE51bGwgaXMgcHJlZmVyYWJsZSB0byB1bmRlZmluZWQgc2luY2UgdW5kZWZpbmVkIG1lYW5zLi4uLiBpdCBpcyB1bmRlZmluZWRcclxuXHJcblx0XHRcdHJldHVybiBudWxsO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCB0ID0gLSAoIHRoaXMub3JpZ2luLmRvdCggcGxhbmUubm9ybWFsICkgKyBwbGFuZS5jb25zdGFudCApIC8gZGVub21pbmF0b3I7XHJcblxyXG5cdFx0Ly8gUmV0dXJuIGlmIHRoZSByYXkgbmV2ZXIgaW50ZXJzZWN0cyB0aGUgcGxhbmVcclxuXHJcblx0XHRyZXR1cm4gdCA+PSAwID8gdCA6IG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW50ZXJzZWN0cyB0aGlzIHJheSB3aXRoIHRoZSBnaXZlbiBwbGFuZSwgcmV0dXJuaW5nIHRoZSBpbnRlcnNlY3Rpb25cclxuXHQgKiBwb2ludCBvciBgbnVsbGAgaWYgdGhlcmUgaXMgbm8gaW50ZXJzZWN0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtQbGFuZX0gcGxhbmUgLSBUaGUgcGxhbmUgdG8gaW50ZXJzZWN0LlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdGFyZ2V0IC0gVGhlIHRhcmdldCB2ZWN0b3IgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBtZXRob2QncyByZXN1bHQuXHJcblx0ICogQHJldHVybiB7P1ZlY3RvcjN9IFRoZSBpbnRlcnNlY3Rpb24gcG9pbnQuXHJcblx0ICovXHJcblx0aW50ZXJzZWN0UGxhbmUoIHBsYW5lLCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0Y29uc3QgdCA9IHRoaXMuZGlzdGFuY2VUb1BsYW5lKCBwbGFuZSApO1xyXG5cclxuXHRcdGlmICggdCA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHJldHVybiBudWxsO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcy5hdCggdCwgdGFyZ2V0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyByYXkgaW50ZXJzZWN0cyB3aXRoIHRoZSBnaXZlbiBwbGFuZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UGxhbmV9IHBsYW5lIC0gVGhlIHBsYW5lIHRvIGludGVyc2VjdC5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoaXMgcmF5IGludGVyc2VjdHMgd2l0aCB0aGUgZ2l2ZW4gcGxhbmUgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGludGVyc2VjdHNQbGFuZSggcGxhbmUgKSB7XHJcblxyXG5cdFx0Ly8gY2hlY2sgaWYgdGhlIHJheSBsaWVzIG9uIHRoZSBwbGFuZSBmaXJzdFxyXG5cclxuXHRcdGNvbnN0IGRpc3RUb1BvaW50ID0gcGxhbmUuZGlzdGFuY2VUb1BvaW50KCB0aGlzLm9yaWdpbiApO1xyXG5cclxuXHRcdGlmICggZGlzdFRvUG9pbnQgPT09IDAgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgZGVub21pbmF0b3IgPSBwbGFuZS5ub3JtYWwuZG90KCB0aGlzLmRpcmVjdGlvbiApO1xyXG5cclxuXHRcdGlmICggZGVub21pbmF0b3IgKiBkaXN0VG9Qb2ludCA8IDAgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gcmF5IG9yaWdpbiBpcyBiZWhpbmQgdGhlIHBsYW5lIChhbmQgaXMgcG9pbnRpbmcgYmVoaW5kIGl0KVxyXG5cclxuXHRcdHJldHVybiBmYWxzZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJbnRlcnNlY3RzIHRoaXMgcmF5IHdpdGggdGhlIGdpdmVuIGJvdW5kaW5nIGJveCwgcmV0dXJuaW5nIHRoZSBpbnRlcnNlY3Rpb25cclxuXHQgKiBwb2ludCBvciBgbnVsbGAgaWYgdGhlcmUgaXMgbm8gaW50ZXJzZWN0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCb3gzfSBib3ggLSBUaGUgYm94IHRvIGludGVyc2VjdC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHRhcmdldCAtIFRoZSB0YXJnZXQgdmVjdG9yIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbWV0aG9kJ3MgcmVzdWx0LlxyXG5cdCAqIEByZXR1cm4gez9WZWN0b3IzfSBUaGUgaW50ZXJzZWN0aW9uIHBvaW50LlxyXG5cdCAqL1xyXG5cdGludGVyc2VjdEJveCggYm94LCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0bGV0IHRtaW4sIHRtYXgsIHR5bWluLCB0eW1heCwgdHptaW4sIHR6bWF4O1xyXG5cclxuXHRcdGNvbnN0IGludmRpcnggPSAxIC8gdGhpcy5kaXJlY3Rpb24ueCxcclxuXHRcdFx0aW52ZGlyeSA9IDEgLyB0aGlzLmRpcmVjdGlvbi55LFxyXG5cdFx0XHRpbnZkaXJ6ID0gMSAvIHRoaXMuZGlyZWN0aW9uLno7XHJcblxyXG5cdFx0Y29uc3Qgb3JpZ2luID0gdGhpcy5vcmlnaW47XHJcblxyXG5cdFx0aWYgKCBpbnZkaXJ4ID49IDAgKSB7XHJcblxyXG5cdFx0XHR0bWluID0gKCBib3gubWluLnggLSBvcmlnaW4ueCApICogaW52ZGlyeDtcclxuXHRcdFx0dG1heCA9ICggYm94Lm1heC54IC0gb3JpZ2luLnggKSAqIGludmRpcng7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHRtaW4gPSAoIGJveC5tYXgueCAtIG9yaWdpbi54ICkgKiBpbnZkaXJ4O1xyXG5cdFx0XHR0bWF4ID0gKCBib3gubWluLnggLSBvcmlnaW4ueCApICogaW52ZGlyeDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBpbnZkaXJ5ID49IDAgKSB7XHJcblxyXG5cdFx0XHR0eW1pbiA9ICggYm94Lm1pbi55IC0gb3JpZ2luLnkgKSAqIGludmRpcnk7XHJcblx0XHRcdHR5bWF4ID0gKCBib3gubWF4LnkgLSBvcmlnaW4ueSApICogaW52ZGlyeTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dHltaW4gPSAoIGJveC5tYXgueSAtIG9yaWdpbi55ICkgKiBpbnZkaXJ5O1xyXG5cdFx0XHR0eW1heCA9ICggYm94Lm1pbi55IC0gb3JpZ2luLnkgKSAqIGludmRpcnk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggKCB0bWluID4gdHltYXggKSB8fCAoIHR5bWluID4gdG1heCApICkgcmV0dXJuIG51bGw7XHJcblxyXG5cdFx0aWYgKCB0eW1pbiA+IHRtaW4gfHwgaXNOYU4oIHRtaW4gKSApIHRtaW4gPSB0eW1pbjtcclxuXHJcblx0XHRpZiAoIHR5bWF4IDwgdG1heCB8fCBpc05hTiggdG1heCApICkgdG1heCA9IHR5bWF4O1xyXG5cclxuXHRcdGlmICggaW52ZGlyeiA+PSAwICkge1xyXG5cclxuXHRcdFx0dHptaW4gPSAoIGJveC5taW4ueiAtIG9yaWdpbi56ICkgKiBpbnZkaXJ6O1xyXG5cdFx0XHR0em1heCA9ICggYm94Lm1heC56IC0gb3JpZ2luLnogKSAqIGludmRpcno7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHR6bWluID0gKCBib3gubWF4LnogLSBvcmlnaW4ueiApICogaW52ZGlyejtcclxuXHRcdFx0dHptYXggPSAoIGJveC5taW4ueiAtIG9yaWdpbi56ICkgKiBpbnZkaXJ6O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoICggdG1pbiA+IHR6bWF4ICkgfHwgKCB0em1pbiA+IHRtYXggKSApIHJldHVybiBudWxsO1xyXG5cclxuXHRcdGlmICggdHptaW4gPiB0bWluIHx8IHRtaW4gIT09IHRtaW4gKSB0bWluID0gdHptaW47XHJcblxyXG5cdFx0aWYgKCB0em1heCA8IHRtYXggfHwgdG1heCAhPT0gdG1heCApIHRtYXggPSB0em1heDtcclxuXHJcblx0XHQvL3JldHVybiBwb2ludCBjbG9zZXN0IHRvIHRoZSByYXkgKHBvc2l0aXZlIHNpZGUpXHJcblxyXG5cdFx0aWYgKCB0bWF4IDwgMCApIHJldHVybiBudWxsO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmF0KCB0bWluID49IDAgPyB0bWluIDogdG1heCwgdGFyZ2V0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyByYXkgaW50ZXJzZWN0cyB3aXRoIHRoZSBnaXZlbiBib3guXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0JveDN9IGJveCAtIFRoZSBib3ggdG8gaW50ZXJzZWN0LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyByYXkgaW50ZXJzZWN0cyB3aXRoIHRoZSBnaXZlbiBib3ggb3Igbm90LlxyXG5cdCAqL1xyXG5cdGludGVyc2VjdHNCb3goIGJveCApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5pbnRlcnNlY3RCb3goIGJveCwgX3ZlY3RvciApICE9PSBudWxsO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEludGVyc2VjdHMgdGhpcyByYXkgd2l0aCB0aGUgZ2l2ZW4gdHJpYW5nbGUsIHJldHVybmluZyB0aGUgaW50ZXJzZWN0aW9uXHJcblx0ICogcG9pbnQgb3IgYG51bGxgIGlmIHRoZXJlIGlzIG5vIGludGVyc2VjdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gYSAtIFRoZSBmaXJzdCB2ZXJ0ZXggb2YgdGhlIHRyaWFuZ2xlLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gYiAtIFRoZSBzZWNvbmQgdmVydGV4IG9mIHRoZSB0cmlhbmdsZS5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IGMgLSBUaGUgdGhpcmQgdmVydGV4IG9mIHRoZSB0cmlhbmdsZS5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IGJhY2tmYWNlQ3VsbGluZyAtIFdoZXRoZXIgdG8gdXNlIGJhY2tmYWNlIGN1bGxpbmcgb3Igbm90LlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdGFyZ2V0IC0gVGhlIHRhcmdldCB2ZWN0b3IgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBtZXRob2QncyByZXN1bHQuXHJcblx0ICogQHJldHVybiB7P1ZlY3RvcjN9IFRoZSBpbnRlcnNlY3Rpb24gcG9pbnQuXHJcblx0ICovXHJcblx0aW50ZXJzZWN0VHJpYW5nbGUoIGEsIGIsIGMsIGJhY2tmYWNlQ3VsbGluZywgdGFyZ2V0ICkge1xyXG5cclxuXHRcdC8vIENvbXB1dGUgdGhlIG9mZnNldCBvcmlnaW4sIGVkZ2VzLCBhbmQgbm9ybWFsLlxyXG5cclxuXHRcdC8vIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL3Btam9uaWFrL0dlb21ldHJpY1Rvb2xzL2Jsb2IvbWFzdGVyL0dURW5naW5lL0luY2x1ZGUvTWF0aGVtYXRpY3MvR3RlSW50clJheTNUcmlhbmdsZTMuaFxyXG5cclxuXHRcdF9lZGdlMS5zdWJWZWN0b3JzKCBiLCBhICk7XHJcblx0XHRfZWRnZTIuc3ViVmVjdG9ycyggYywgYSApO1xyXG5cdFx0X25vcm1hbC5jcm9zc1ZlY3RvcnMoIF9lZGdlMSwgX2VkZ2UyICk7XHJcblxyXG5cdFx0Ly8gU29sdmUgUSArIHQqRCA9IGIxKkUxICsgYjIqRTIgKFEgPSBrRGlmZiwgRCA9IHJheSBkaXJlY3Rpb24sXHJcblx0XHQvLyBFMSA9IGtFZGdlMSwgRTIgPSBrRWRnZTIsIE4gPSBDcm9zcyhFMSxFMikpIGJ5XHJcblx0XHQvLyAgIHxEb3QoRCxOKXwqYjEgPSBzaWduKERvdChELE4pKSpEb3QoRCxDcm9zcyhRLEUyKSlcclxuXHRcdC8vICAgfERvdChELE4pfCpiMiA9IHNpZ24oRG90KEQsTikpKkRvdChELENyb3NzKEUxLFEpKVxyXG5cdFx0Ly8gICB8RG90KEQsTil8KnQgPSAtc2lnbihEb3QoRCxOKSkqRG90KFEsTilcclxuXHRcdGxldCBEZE4gPSB0aGlzLmRpcmVjdGlvbi5kb3QoIF9ub3JtYWwgKTtcclxuXHRcdGxldCBzaWduO1xyXG5cclxuXHRcdGlmICggRGROID4gMCApIHtcclxuXHJcblx0XHRcdGlmICggYmFja2ZhY2VDdWxsaW5nICkgcmV0dXJuIG51bGw7XHJcblx0XHRcdHNpZ24gPSAxO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIERkTiA8IDAgKSB7XHJcblxyXG5cdFx0XHRzaWduID0gLSAxO1xyXG5cdFx0XHREZE4gPSAtIERkTjtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdF9kaWZmLnN1YlZlY3RvcnMoIHRoaXMub3JpZ2luLCBhICk7XHJcblx0XHRjb25zdCBEZFF4RTIgPSBzaWduICogdGhpcy5kaXJlY3Rpb24uZG90KCBfZWRnZTIuY3Jvc3NWZWN0b3JzKCBfZGlmZiwgX2VkZ2UyICkgKTtcclxuXHJcblx0XHQvLyBiMSA8IDAsIG5vIGludGVyc2VjdGlvblxyXG5cdFx0aWYgKCBEZFF4RTIgPCAwICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IERkRTF4USA9IHNpZ24gKiB0aGlzLmRpcmVjdGlvbi5kb3QoIF9lZGdlMS5jcm9zcyggX2RpZmYgKSApO1xyXG5cclxuXHRcdC8vIGIyIDwgMCwgbm8gaW50ZXJzZWN0aW9uXHJcblx0XHRpZiAoIERkRTF4USA8IDAgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gbnVsbDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gYjErYjIgPiAxLCBubyBpbnRlcnNlY3Rpb25cclxuXHRcdGlmICggRGRReEUyICsgRGRFMXhRID4gRGROICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIExpbmUgaW50ZXJzZWN0cyB0cmlhbmdsZSwgY2hlY2sgaWYgcmF5IGRvZXMuXHJcblx0XHRjb25zdCBRZE4gPSAtIHNpZ24gKiBfZGlmZi5kb3QoIF9ub3JtYWwgKTtcclxuXHJcblx0XHQvLyB0IDwgMCwgbm8gaW50ZXJzZWN0aW9uXHJcblx0XHRpZiAoIFFkTiA8IDAgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gbnVsbDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gUmF5IGludGVyc2VjdHMgdHJpYW5nbGUuXHJcblx0XHRyZXR1cm4gdGhpcy5hdCggUWROIC8gRGROLCB0YXJnZXQgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUcmFuc2Zvcm1zIHRoaXMgcmF5IHdpdGggdGhlIGdpdmVuIDR4NCB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDR9IG1hdHJpeDQgLSBUaGUgdHJhbnNmb3JtYXRpb24gbWF0cml4LlxyXG5cdCAqIEByZXR1cm4ge1JheX0gQSByZWZlcmVuY2UgdG8gdGhpcyByYXkuXHJcblx0ICovXHJcblx0YXBwbHlNYXRyaXg0KCBtYXRyaXg0ICkge1xyXG5cclxuXHRcdHRoaXMub3JpZ2luLmFwcGx5TWF0cml4NCggbWF0cml4NCApO1xyXG5cdFx0dGhpcy5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKCBtYXRyaXg0ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyByYXkgaXMgZXF1YWwgd2l0aCB0aGUgZ2l2ZW4gb25lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSYXl9IHJheSAtIFRoZSByYXkgdG8gdGVzdCBmb3IgZXF1YWxpdHkuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGlzIHJheSBpcyBlcXVhbCB3aXRoIHRoZSBnaXZlbiBvbmUuXHJcblx0ICovXHJcblx0ZXF1YWxzKCByYXkgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHJheS5vcmlnaW4uZXF1YWxzKCB0aGlzLm9yaWdpbiApICYmIHJheS5kaXJlY3Rpb24uZXF1YWxzKCB0aGlzLmRpcmVjdGlvbiApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBuZXcgcmF5IHdpdGggY29waWVkIHZhbHVlcyBmcm9tIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtSYXl9IEEgY2xvbmUgb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjbG9uZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFJheSB9O1xyXG4iLCJpbXBvcnQgeyBXZWJHTENvb3JkaW5hdGVTeXN0ZW0sIFdlYkdQVUNvb3JkaW5hdGVTeXN0ZW0gfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi9WZWN0b3IzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIGEgNHg0IG1hdHJpeC5cclxuICpcclxuICogVGhlIG1vc3QgY29tbW9uIHVzZSBvZiBhIDR4NCBtYXRyaXggaW4gM0QgY29tcHV0ZXIgZ3JhcGhpY3MgaXMgYXMgYSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguXHJcbiAqIEZvciBhbiBpbnRyb2R1Y3Rpb24gdG8gdHJhbnNmb3JtYXRpb24gbWF0cmljZXMgYXMgdXNlZCBpbiBXZWJHTCwgY2hlY2sgb3V0IFt0aGlzIHR1dG9yaWFsXXtAbGluayBodHRwczovL3d3dy5vcGVuZ2wtdHV0b3JpYWwub3JnL2JlZ2lubmVycy10dXRvcmlhbHMvdHV0b3JpYWwtMy1tYXRyaWNlc31cclxuICpcclxuICogVGhpcyBhbGxvd3MgYSAzRCB2ZWN0b3IgcmVwcmVzZW50aW5nIGEgcG9pbnQgaW4gM0Qgc3BhY2UgdG8gdW5kZXJnb1xyXG4gKiB0cmFuc2Zvcm1hdGlvbnMgc3VjaCBhcyB0cmFuc2xhdGlvbiwgcm90YXRpb24sIHNoZWFyLCBzY2FsZSwgcmVmbGVjdGlvbixcclxuICogb3J0aG9nb25hbCBvciBwZXJzcGVjdGl2ZSBwcm9qZWN0aW9uIGFuZCBzbyBvbiwgYnkgYmVpbmcgbXVsdGlwbGllZCBieSB0aGVcclxuICogbWF0cml4LiBUaGlzIGlzIGtub3duIGFzIGBhcHBseWluZ2AgdGhlIG1hdHJpeCB0byB0aGUgdmVjdG9yLlxyXG4gKlxyXG4gKiBBIE5vdGUgb24gUm93LU1ham9yIGFuZCBDb2x1bW4tTWFqb3IgT3JkZXJpbmc6XHJcbiAqXHJcbiAqIFRoZSBjb25zdHJ1Y3RvciBhbmQge0BsaW5rIE1hdHJpeDMjc2V0fSBtZXRob2QgdGFrZSBhcmd1bWVudHMgaW5cclxuICogW3Jvdy1tYWpvcl17QGxpbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUm93LV9hbmRfY29sdW1uLW1ham9yX29yZGVyI0NvbHVtbi1tYWpvcl9vcmRlcn1cclxuICogb3JkZXIsIHdoaWxlIGludGVybmFsbHkgdGhleSBhcmUgc3RvcmVkIGluIHRoZSB7QGxpbmsgTWF0cml4MyNlbGVtZW50c30gYXJyYXkgaW4gY29sdW1uLW1ham9yIG9yZGVyLlxyXG4gKiBUaGlzIG1lYW5zIHRoYXQgY2FsbGluZzpcclxuICogYGBganNcclxuICogY29uc3QgbSA9IG5ldyBUSFJFRS5NYXRyaXg0KCk7XHJcbiAqIG0uc2V0KCAxMSwgMTIsIDEzLCAxNCxcclxuICogICAgICAgIDIxLCAyMiwgMjMsIDI0LFxyXG4gKiAgICAgICAgMzEsIDMyLCAzMywgMzQsXHJcbiAqICAgICAgICA0MSwgNDIsIDQzLCA0NCApO1xyXG4gKiBgYGBcclxuICogd2lsbCByZXN1bHQgaW4gdGhlIGVsZW1lbnRzIGFycmF5IGNvbnRhaW5pbmc6XHJcbiAqIGBgYGpzXHJcbiAqIG0uZWxlbWVudHMgPSBbIDExLCAyMSwgMzEsIDQxLFxyXG4gKiAgICAgICAgICAgICAgICAxMiwgMjIsIDMyLCA0MixcclxuICogICAgICAgICAgICAgICAgMTMsIDIzLCAzMywgNDMsXHJcbiAqICAgICAgICAgICAgICAgIDE0LCAyNCwgMzQsIDQ0IF07XHJcbiAqIGBgYFxyXG4gKiBhbmQgaW50ZXJuYWxseSBhbGwgY2FsY3VsYXRpb25zIGFyZSBwZXJmb3JtZWQgdXNpbmcgY29sdW1uLW1ham9yIG9yZGVyaW5nLlxyXG4gKiBIb3dldmVyLCBhcyB0aGUgYWN0dWFsIG9yZGVyaW5nIG1ha2VzIG5vIGRpZmZlcmVuY2UgbWF0aGVtYXRpY2FsbHkgYW5kXHJcbiAqIG1vc3QgcGVvcGxlIGFyZSB1c2VkIHRvIHRoaW5raW5nIGFib3V0IG1hdHJpY2VzIGluIHJvdy1tYWpvciBvcmRlciwgdGhlXHJcbiAqIHRocmVlLmpzIGRvY3VtZW50YXRpb24gc2hvd3MgbWF0cmljZXMgaW4gcm93LW1ham9yIG9yZGVyLiBKdXN0IGJlYXIgaW5cclxuICogbWluZCB0aGF0IGlmIHlvdSBhcmUgcmVhZGluZyB0aGUgc291cmNlIGNvZGUsIHlvdSdsbCBoYXZlIHRvIHRha2UgdGhlXHJcbiAqIHRyYW5zcG9zZSBvZiBhbnkgbWF0cmljZXMgb3V0bGluZWQgaGVyZSB0byBtYWtlIHNlbnNlIG9mIHRoZSBjYWxjdWxhdGlvbnMuXHJcbiAqL1xyXG5jbGFzcyBNYXRyaXg0IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyA0eDQgbWF0cml4LiBUaGUgYXJndW1lbnRzIGFyZSBzdXBwb3NlZCB0byBiZVxyXG5cdCAqIGluIHJvdy1tYWpvciBvcmRlci4gSWYgbm8gYXJndW1lbnRzIGFyZSBwcm92aWRlZCwgdGhlIGNvbnN0cnVjdG9yXHJcblx0ICogaW5pdGlhbGl6ZXMgdGhlIG1hdHJpeCBhcyBhbiBpZGVudGl0eSBtYXRyaXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW24xMV0gLSAxLTEgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuMTJdIC0gMS0yIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjEzXSAtIDEtMyBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW24xNF0gLSAxLTQgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuMjFdIC0gMi0xIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjIyXSAtIDItMiBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW24yM10gLSAyLTMgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuMjRdIC0gMi00IG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjMxXSAtIDMtMSBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW24zMl0gLSAzLTIgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuMzNdIC0gMy0zIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjM0XSAtIDMtNCBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW240MV0gLSA0LTEgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuNDJdIC0gNC0yIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjQzXSAtIDQtMyBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW240NF0gLSA0LTQgbWF0cml4IGVsZW1lbnQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG4xMSwgbjEyLCBuMTMsIG4xNCwgbjIxLCBuMjIsIG4yMywgbjI0LCBuMzEsIG4zMiwgbjMzLCBuMzQsIG40MSwgbjQyLCBuNDMsIG40NCApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdE1hdHJpeDQucHJvdG90eXBlLmlzTWF0cml4NCA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGNvbHVtbi1tYWpvciBsaXN0IG9mIG1hdHJpeCB2YWx1ZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PG51bWJlcj59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZWxlbWVudHMgPSBbXHJcblxyXG5cdFx0XHQxLCAwLCAwLCAwLFxyXG5cdFx0XHQwLCAxLCAwLCAwLFxyXG5cdFx0XHQwLCAwLCAxLCAwLFxyXG5cdFx0XHQwLCAwLCAwLCAxXHJcblxyXG5cdFx0XTtcclxuXHJcblx0XHRpZiAoIG4xMSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0dGhpcy5zZXQoIG4xMSwgbjEyLCBuMTMsIG4xNCwgbjIxLCBuMjIsIG4yMywgbjI0LCBuMzEsIG4zMiwgbjMzLCBuMzQsIG40MSwgbjQyLCBuNDMsIG40NCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBlbGVtZW50cyBvZiB0aGUgbWF0cml4LlRoZSBhcmd1bWVudHMgYXJlIHN1cHBvc2VkIHRvIGJlXHJcblx0ICogaW4gcm93LW1ham9yIG9yZGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuMTFdIC0gMS0xIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjEyXSAtIDEtMiBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW24xM10gLSAxLTMgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuMTRdIC0gMS00IG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjIxXSAtIDItMSBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW24yMl0gLSAyLTIgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuMjNdIC0gMi0zIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjI0XSAtIDItNCBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW24zMV0gLSAzLTEgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuMzJdIC0gMy0yIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjMzXSAtIDMtMyBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW24zNF0gLSAzLTQgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuNDFdIC0gNC0xIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjQyXSAtIDQtMiBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW240M10gLSA0LTMgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuNDRdIC0gNC00IG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdHNldCggbjExLCBuMTIsIG4xMywgbjE0LCBuMjEsIG4yMiwgbjIzLCBuMjQsIG4zMSwgbjMyLCBuMzMsIG4zNCwgbjQxLCBuNDIsIG40MywgbjQ0ICkge1xyXG5cclxuXHRcdGNvbnN0IHRlID0gdGhpcy5lbGVtZW50cztcclxuXHJcblx0XHR0ZVsgMCBdID0gbjExOyB0ZVsgNCBdID0gbjEyOyB0ZVsgOCBdID0gbjEzOyB0ZVsgMTIgXSA9IG4xNDtcclxuXHRcdHRlWyAxIF0gPSBuMjE7IHRlWyA1IF0gPSBuMjI7IHRlWyA5IF0gPSBuMjM7IHRlWyAxMyBdID0gbjI0O1xyXG5cdFx0dGVbIDIgXSA9IG4zMTsgdGVbIDYgXSA9IG4zMjsgdGVbIDEwIF0gPSBuMzM7IHRlWyAxNCBdID0gbjM0O1xyXG5cdFx0dGVbIDMgXSA9IG40MTsgdGVbIDcgXSA9IG40MjsgdGVbIDExIF0gPSBuNDM7IHRlWyAxNSBdID0gbjQ0O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhpcyBtYXRyaXggdG8gdGhlIDR4NCBpZGVudGl0eSBtYXRyaXguXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtNYXRyaXg0fSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRpZGVudGl0eSgpIHtcclxuXHJcblx0XHR0aGlzLnNldChcclxuXHJcblx0XHRcdDEsIDAsIDAsIDAsXHJcblx0XHRcdDAsIDEsIDAsIDAsXHJcblx0XHRcdDAsIDAsIDEsIDAsXHJcblx0XHRcdDAsIDAsIDAsIDFcclxuXHJcblx0XHQpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBtYXRyaXggd2l0aCBjb3BpZWQgdmFsdWVzIGZyb20gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDR9IEEgY2xvbmUgb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjbG9uZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IE1hdHJpeDQoKS5mcm9tQXJyYXkoIHRoaXMuZWxlbWVudHMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gbWF0cml4IHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDR9IG0gLSBUaGUgbWF0cml4IHRvIGNvcHkuXHJcblx0ICogQHJldHVybiB7TWF0cml4NH0gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0Y29weSggbSApIHtcclxuXHJcblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XHJcblx0XHRjb25zdCBtZSA9IG0uZWxlbWVudHM7XHJcblxyXG5cdFx0dGVbIDAgXSA9IG1lWyAwIF07IHRlWyAxIF0gPSBtZVsgMSBdOyB0ZVsgMiBdID0gbWVbIDIgXTsgdGVbIDMgXSA9IG1lWyAzIF07XHJcblx0XHR0ZVsgNCBdID0gbWVbIDQgXTsgdGVbIDUgXSA9IG1lWyA1IF07IHRlWyA2IF0gPSBtZVsgNiBdOyB0ZVsgNyBdID0gbWVbIDcgXTtcclxuXHRcdHRlWyA4IF0gPSBtZVsgOCBdOyB0ZVsgOSBdID0gbWVbIDkgXTsgdGVbIDEwIF0gPSBtZVsgMTAgXTsgdGVbIDExIF0gPSBtZVsgMTEgXTtcclxuXHRcdHRlWyAxMiBdID0gbWVbIDEyIF07IHRlWyAxMyBdID0gbWVbIDEzIF07IHRlWyAxNCBdID0gbWVbIDE0IF07IHRlWyAxNSBdID0gbWVbIDE1IF07XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29waWVzIHRoZSB0cmFuc2xhdGlvbiBjb21wb25lbnQgb2YgdGhlIGdpdmVuIG1hdHJpeFxyXG5cdCAqIGludG8gdGhpcyBtYXRyaXgncyB0cmFuc2xhdGlvbiBjb21wb25lbnQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDR9IG0gLSBUaGUgbWF0cml4IHRvIGNvcHkgdGhlIHRyYW5zbGF0aW9uIGNvbXBvbmVudC5cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXg0fSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRjb3B5UG9zaXRpb24oIG0gKSB7XHJcblxyXG5cdFx0Y29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzLCBtZSA9IG0uZWxlbWVudHM7XHJcblxyXG5cdFx0dGVbIDEyIF0gPSBtZVsgMTIgXTtcclxuXHRcdHRlWyAxMyBdID0gbWVbIDEzIF07XHJcblx0XHR0ZVsgMTQgXSA9IG1lWyAxNCBdO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldCB0aGUgdXBwZXIgM3gzIGVsZW1lbnRzIG9mIHRoaXMgbWF0cml4IHRvIHRoZSB2YWx1ZXMgb2YgZ2l2ZW4gM3gzIG1hdHJpeC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4M30gbSAtIFRoZSAzeDMgbWF0cml4LlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdHNldEZyb21NYXRyaXgzKCBtICkge1xyXG5cclxuXHRcdGNvbnN0IG1lID0gbS5lbGVtZW50cztcclxuXHJcblx0XHR0aGlzLnNldChcclxuXHJcblx0XHRcdG1lWyAwIF0sIG1lWyAzIF0sIG1lWyA2IF0sIDAsXHJcblx0XHRcdG1lWyAxIF0sIG1lWyA0IF0sIG1lWyA3IF0sIDAsXHJcblx0XHRcdG1lWyAyIF0sIG1lWyA1IF0sIG1lWyA4IF0sIDAsXHJcblx0XHRcdDAsIDAsIDAsIDFcclxuXHJcblx0XHQpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEV4dHJhY3RzIHRoZSBiYXNpcyBvZiB0aGlzIG1hdHJpeCBpbnRvIHRoZSB0aHJlZSBheGlzIHZlY3RvcnMgcHJvdmlkZWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHhBeGlzIC0gVGhlIGJhc2lzJ3MgeCBheGlzLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30geUF4aXMgLSBUaGUgYmFzaXMncyB5IGF4aXMuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB6QXhpcyAtIFRoZSBiYXNpcydzIHogYXhpcy5cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXg0fSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRleHRyYWN0QmFzaXMoIHhBeGlzLCB5QXhpcywgekF4aXMgKSB7XHJcblxyXG5cdFx0eEF4aXMuc2V0RnJvbU1hdHJpeENvbHVtbiggdGhpcywgMCApO1xyXG5cdFx0eUF4aXMuc2V0RnJvbU1hdHJpeENvbHVtbiggdGhpcywgMSApO1xyXG5cdFx0ekF4aXMuc2V0RnJvbU1hdHJpeENvbHVtbiggdGhpcywgMiApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGdpdmVuIGJhc2lzIHZlY3RvcnMgdG8gdGhpcyBtYXRyaXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHhBeGlzIC0gVGhlIGJhc2lzJ3MgeCBheGlzLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30geUF4aXMgLSBUaGUgYmFzaXMncyB5IGF4aXMuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB6QXhpcyAtIFRoZSBiYXNpcydzIHogYXhpcy5cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXg0fSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRtYWtlQmFzaXMoIHhBeGlzLCB5QXhpcywgekF4aXMgKSB7XHJcblxyXG5cdFx0dGhpcy5zZXQoXHJcblx0XHRcdHhBeGlzLngsIHlBeGlzLngsIHpBeGlzLngsIDAsXHJcblx0XHRcdHhBeGlzLnksIHlBeGlzLnksIHpBeGlzLnksIDAsXHJcblx0XHRcdHhBeGlzLnosIHlBeGlzLnosIHpBeGlzLnosIDAsXHJcblx0XHRcdDAsIDAsIDAsIDFcclxuXHRcdCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRXh0cmFjdHMgdGhlIHJvdGF0aW9uIGNvbXBvbmVudCBvZiB0aGUgZ2l2ZW4gbWF0cml4XHJcblx0ICogaW50byB0aGlzIG1hdHJpeCdzIHJvdGF0aW9uIGNvbXBvbmVudC5cclxuXHQgKlxyXG5cdCAqIE5vdGU6IFRoaXMgbWV0aG9kIGRvZXMgbm90IHN1cHBvcnQgcmVmbGVjdGlvbiBtYXRyaWNlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4NH0gbSAtIFRoZSBtYXRyaXguXHJcblx0ICogQHJldHVybiB7TWF0cml4NH0gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0ZXh0cmFjdFJvdGF0aW9uKCBtICkge1xyXG5cclxuXHRcdGNvbnN0IHRlID0gdGhpcy5lbGVtZW50cztcclxuXHRcdGNvbnN0IG1lID0gbS5lbGVtZW50cztcclxuXHJcblx0XHRjb25zdCBzY2FsZVggPSAxIC8gX3YxLnNldEZyb21NYXRyaXhDb2x1bW4oIG0sIDAgKS5sZW5ndGgoKTtcclxuXHRcdGNvbnN0IHNjYWxlWSA9IDEgLyBfdjEuc2V0RnJvbU1hdHJpeENvbHVtbiggbSwgMSApLmxlbmd0aCgpO1xyXG5cdFx0Y29uc3Qgc2NhbGVaID0gMSAvIF92MS5zZXRGcm9tTWF0cml4Q29sdW1uKCBtLCAyICkubGVuZ3RoKCk7XHJcblxyXG5cdFx0dGVbIDAgXSA9IG1lWyAwIF0gKiBzY2FsZVg7XHJcblx0XHR0ZVsgMSBdID0gbWVbIDEgXSAqIHNjYWxlWDtcclxuXHRcdHRlWyAyIF0gPSBtZVsgMiBdICogc2NhbGVYO1xyXG5cdFx0dGVbIDMgXSA9IDA7XHJcblxyXG5cdFx0dGVbIDQgXSA9IG1lWyA0IF0gKiBzY2FsZVk7XHJcblx0XHR0ZVsgNSBdID0gbWVbIDUgXSAqIHNjYWxlWTtcclxuXHRcdHRlWyA2IF0gPSBtZVsgNiBdICogc2NhbGVZO1xyXG5cdFx0dGVbIDcgXSA9IDA7XHJcblxyXG5cdFx0dGVbIDggXSA9IG1lWyA4IF0gKiBzY2FsZVo7XHJcblx0XHR0ZVsgOSBdID0gbWVbIDkgXSAqIHNjYWxlWjtcclxuXHRcdHRlWyAxMCBdID0gbWVbIDEwIF0gKiBzY2FsZVo7XHJcblx0XHR0ZVsgMTEgXSA9IDA7XHJcblxyXG5cdFx0dGVbIDEyIF0gPSAwO1xyXG5cdFx0dGVbIDEzIF0gPSAwO1xyXG5cdFx0dGVbIDE0IF0gPSAwO1xyXG5cdFx0dGVbIDE1IF0gPSAxO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHJvdGF0aW9uIGNvbXBvbmVudCAodGhlIHVwcGVyIGxlZnQgM3gzIG1hdHJpeCkgb2YgdGhpcyBtYXRyaXggdG9cclxuXHQgKiB0aGUgcm90YXRpb24gc3BlY2lmaWVkIGJ5IHRoZSBnaXZlbiBFdWxlciBhbmdsZXMuIFRoZSByZXN0IG9mXHJcblx0ICogdGhlIG1hdHJpeCBpcyBzZXQgdG8gdGhlIGlkZW50aXR5LiBEZXBlbmRpbmcgb24gdGhlIHtAbGluayBFdWxlciNvcmRlcn0sXHJcblx0ICogdGhlcmUgYXJlIHNpeCBwb3NzaWJsZSBvdXRjb21lcy4gU2VlIFt0aGlzIHBhZ2Vde0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0V1bGVyX2FuZ2xlcyNSb3RhdGlvbl9tYXRyaXh9XHJcblx0ICogZm9yIGEgY29tcGxldGUgbGlzdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7RXVsZXJ9IGV1bGVyIC0gVGhlIEV1bGVyIGFuZ2xlcy5cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXg0fSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRtYWtlUm90YXRpb25Gcm9tRXVsZXIoIGV1bGVyICkge1xyXG5cclxuXHRcdGNvbnN0IHRlID0gdGhpcy5lbGVtZW50cztcclxuXHJcblx0XHRjb25zdCB4ID0gZXVsZXIueCwgeSA9IGV1bGVyLnksIHogPSBldWxlci56O1xyXG5cdFx0Y29uc3QgYSA9IE1hdGguY29zKCB4ICksIGIgPSBNYXRoLnNpbiggeCApO1xyXG5cdFx0Y29uc3QgYyA9IE1hdGguY29zKCB5ICksIGQgPSBNYXRoLnNpbiggeSApO1xyXG5cdFx0Y29uc3QgZSA9IE1hdGguY29zKCB6ICksIGYgPSBNYXRoLnNpbiggeiApO1xyXG5cclxuXHRcdGlmICggZXVsZXIub3JkZXIgPT09ICdYWVonICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYWUgPSBhICogZSwgYWYgPSBhICogZiwgYmUgPSBiICogZSwgYmYgPSBiICogZjtcclxuXHJcblx0XHRcdHRlWyAwIF0gPSBjICogZTtcclxuXHRcdFx0dGVbIDQgXSA9IC0gYyAqIGY7XHJcblx0XHRcdHRlWyA4IF0gPSBkO1xyXG5cclxuXHRcdFx0dGVbIDEgXSA9IGFmICsgYmUgKiBkO1xyXG5cdFx0XHR0ZVsgNSBdID0gYWUgLSBiZiAqIGQ7XHJcblx0XHRcdHRlWyA5IF0gPSAtIGIgKiBjO1xyXG5cclxuXHRcdFx0dGVbIDIgXSA9IGJmIC0gYWUgKiBkO1xyXG5cdFx0XHR0ZVsgNiBdID0gYmUgKyBhZiAqIGQ7XHJcblx0XHRcdHRlWyAxMCBdID0gYSAqIGM7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggZXVsZXIub3JkZXIgPT09ICdZWFonICkge1xyXG5cclxuXHRcdFx0Y29uc3QgY2UgPSBjICogZSwgY2YgPSBjICogZiwgZGUgPSBkICogZSwgZGYgPSBkICogZjtcclxuXHJcblx0XHRcdHRlWyAwIF0gPSBjZSArIGRmICogYjtcclxuXHRcdFx0dGVbIDQgXSA9IGRlICogYiAtIGNmO1xyXG5cdFx0XHR0ZVsgOCBdID0gYSAqIGQ7XHJcblxyXG5cdFx0XHR0ZVsgMSBdID0gYSAqIGY7XHJcblx0XHRcdHRlWyA1IF0gPSBhICogZTtcclxuXHRcdFx0dGVbIDkgXSA9IC0gYjtcclxuXHJcblx0XHRcdHRlWyAyIF0gPSBjZiAqIGIgLSBkZTtcclxuXHRcdFx0dGVbIDYgXSA9IGRmICsgY2UgKiBiO1xyXG5cdFx0XHR0ZVsgMTAgXSA9IGEgKiBjO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGV1bGVyLm9yZGVyID09PSAnWlhZJyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGNlID0gYyAqIGUsIGNmID0gYyAqIGYsIGRlID0gZCAqIGUsIGRmID0gZCAqIGY7XHJcblxyXG5cdFx0XHR0ZVsgMCBdID0gY2UgLSBkZiAqIGI7XHJcblx0XHRcdHRlWyA0IF0gPSAtIGEgKiBmO1xyXG5cdFx0XHR0ZVsgOCBdID0gZGUgKyBjZiAqIGI7XHJcblxyXG5cdFx0XHR0ZVsgMSBdID0gY2YgKyBkZSAqIGI7XHJcblx0XHRcdHRlWyA1IF0gPSBhICogZTtcclxuXHRcdFx0dGVbIDkgXSA9IGRmIC0gY2UgKiBiO1xyXG5cclxuXHRcdFx0dGVbIDIgXSA9IC0gYSAqIGQ7XHJcblx0XHRcdHRlWyA2IF0gPSBiO1xyXG5cdFx0XHR0ZVsgMTAgXSA9IGEgKiBjO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGV1bGVyLm9yZGVyID09PSAnWllYJyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGFlID0gYSAqIGUsIGFmID0gYSAqIGYsIGJlID0gYiAqIGUsIGJmID0gYiAqIGY7XHJcblxyXG5cdFx0XHR0ZVsgMCBdID0gYyAqIGU7XHJcblx0XHRcdHRlWyA0IF0gPSBiZSAqIGQgLSBhZjtcclxuXHRcdFx0dGVbIDggXSA9IGFlICogZCArIGJmO1xyXG5cclxuXHRcdFx0dGVbIDEgXSA9IGMgKiBmO1xyXG5cdFx0XHR0ZVsgNSBdID0gYmYgKiBkICsgYWU7XHJcblx0XHRcdHRlWyA5IF0gPSBhZiAqIGQgLSBiZTtcclxuXHJcblx0XHRcdHRlWyAyIF0gPSAtIGQ7XHJcblx0XHRcdHRlWyA2IF0gPSBiICogYztcclxuXHRcdFx0dGVbIDEwIF0gPSBhICogYztcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBldWxlci5vcmRlciA9PT0gJ1laWCcgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBhYyA9IGEgKiBjLCBhZCA9IGEgKiBkLCBiYyA9IGIgKiBjLCBiZCA9IGIgKiBkO1xyXG5cclxuXHRcdFx0dGVbIDAgXSA9IGMgKiBlO1xyXG5cdFx0XHR0ZVsgNCBdID0gYmQgLSBhYyAqIGY7XHJcblx0XHRcdHRlWyA4IF0gPSBiYyAqIGYgKyBhZDtcclxuXHJcblx0XHRcdHRlWyAxIF0gPSBmO1xyXG5cdFx0XHR0ZVsgNSBdID0gYSAqIGU7XHJcblx0XHRcdHRlWyA5IF0gPSAtIGIgKiBlO1xyXG5cclxuXHRcdFx0dGVbIDIgXSA9IC0gZCAqIGU7XHJcblx0XHRcdHRlWyA2IF0gPSBhZCAqIGYgKyBiYztcclxuXHRcdFx0dGVbIDEwIF0gPSBhYyAtIGJkICogZjtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBldWxlci5vcmRlciA9PT0gJ1haWScgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBhYyA9IGEgKiBjLCBhZCA9IGEgKiBkLCBiYyA9IGIgKiBjLCBiZCA9IGIgKiBkO1xyXG5cclxuXHRcdFx0dGVbIDAgXSA9IGMgKiBlO1xyXG5cdFx0XHR0ZVsgNCBdID0gLSBmO1xyXG5cdFx0XHR0ZVsgOCBdID0gZCAqIGU7XHJcblxyXG5cdFx0XHR0ZVsgMSBdID0gYWMgKiBmICsgYmQ7XHJcblx0XHRcdHRlWyA1IF0gPSBhICogZTtcclxuXHRcdFx0dGVbIDkgXSA9IGFkICogZiAtIGJjO1xyXG5cclxuXHRcdFx0dGVbIDIgXSA9IGJjICogZiAtIGFkO1xyXG5cdFx0XHR0ZVsgNiBdID0gYiAqIGU7XHJcblx0XHRcdHRlWyAxMCBdID0gYmQgKiBmICsgYWM7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGJvdHRvbSByb3dcclxuXHRcdHRlWyAzIF0gPSAwO1xyXG5cdFx0dGVbIDcgXSA9IDA7XHJcblx0XHR0ZVsgMTEgXSA9IDA7XHJcblxyXG5cdFx0Ly8gbGFzdCBjb2x1bW5cclxuXHRcdHRlWyAxMiBdID0gMDtcclxuXHRcdHRlWyAxMyBdID0gMDtcclxuXHRcdHRlWyAxNCBdID0gMDtcclxuXHRcdHRlWyAxNSBdID0gMTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSByb3RhdGlvbiBjb21wb25lbnQgb2YgdGhpcyBtYXRyaXggdG8gdGhlIHJvdGF0aW9uIHNwZWNpZmllZCBieVxyXG5cdCAqIHRoZSBnaXZlbiBRdWF0ZXJuaW9uIGFzIG91dGxpbmVkIFtoZXJlXXtAbGluayBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Sb3RhdGlvbl9tYXRyaXgjUXVhdGVybmlvbn1cclxuXHQgKiBUaGUgcmVzdCBvZiB0aGUgbWF0cml4IGlzIHNldCB0byB0aGUgaWRlbnRpdHkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1F1YXRlcm5pb259IHEgLSBUaGUgUXVhdGVybmlvbi5cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXg0fSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRtYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbiggcSApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5jb21wb3NlKCBfemVybywgcSwgX29uZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHJvdGF0aW9uIGNvbXBvbmVudCBvZiB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4LCBsb29raW5nIGZyb20gYGV5ZWAgdG93YXJkc1xyXG5cdCAqIGB0YXJnZXRgLCBhbmQgb3JpZW50ZWQgYnkgdGhlIHVwLWRpcmVjdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gZXllIC0gVGhlIGV5ZSB2ZWN0b3IuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IHZlY3Rvci5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHVwIC0gVGhlIHVwIHZlY3Rvci5cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXg0fSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRsb29rQXQoIGV5ZSwgdGFyZ2V0LCB1cCApIHtcclxuXHJcblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XHJcblxyXG5cdFx0X3ouc3ViVmVjdG9ycyggZXllLCB0YXJnZXQgKTtcclxuXHJcblx0XHRpZiAoIF96Lmxlbmd0aFNxKCkgPT09IDAgKSB7XHJcblxyXG5cdFx0XHQvLyBleWUgYW5kIHRhcmdldCBhcmUgaW4gdGhlIHNhbWUgcG9zaXRpb25cclxuXHJcblx0XHRcdF96LnogPSAxO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRfei5ub3JtYWxpemUoKTtcclxuXHRcdF94LmNyb3NzVmVjdG9ycyggdXAsIF96ICk7XHJcblxyXG5cdFx0aWYgKCBfeC5sZW5ndGhTcSgpID09PSAwICkge1xyXG5cclxuXHRcdFx0Ly8gdXAgYW5kIHogYXJlIHBhcmFsbGVsXHJcblxyXG5cdFx0XHRpZiAoIE1hdGguYWJzKCB1cC56ICkgPT09IDEgKSB7XHJcblxyXG5cdFx0XHRcdF96LnggKz0gMC4wMDAxO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0X3oueiArPSAwLjAwMDE7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRfei5ub3JtYWxpemUoKTtcclxuXHRcdFx0X3guY3Jvc3NWZWN0b3JzKCB1cCwgX3ogKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0X3gubm9ybWFsaXplKCk7XHJcblx0XHRfeS5jcm9zc1ZlY3RvcnMoIF96LCBfeCApO1xyXG5cclxuXHRcdHRlWyAwIF0gPSBfeC54OyB0ZVsgNCBdID0gX3kueDsgdGVbIDggXSA9IF96Lng7XHJcblx0XHR0ZVsgMSBdID0gX3gueTsgdGVbIDUgXSA9IF95Lnk7IHRlWyA5IF0gPSBfei55O1xyXG5cdFx0dGVbIDIgXSA9IF94Lno7IHRlWyA2IF0gPSBfeS56OyB0ZVsgMTAgXSA9IF96Lno7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUG9zdC1tdWx0aXBsaWVzIHRoaXMgbWF0cml4IGJ5IHRoZSBnaXZlbiA0eDQgbWF0cml4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRyaXg0fSBtIC0gVGhlIG1hdHJpeCB0byBtdWx0aXBseSB3aXRoLlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdG11bHRpcGx5KCBtICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXMoIHRoaXMsIG0gKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQcmUtbXVsdGlwbGllcyB0aGlzIG1hdHJpeCBieSB0aGUgZ2l2ZW4gNHg0IG1hdHJpeC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4NH0gbSAtIFRoZSBtYXRyaXggdG8gbXVsdGlwbHkgd2l0aC5cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXg0fSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRwcmVtdWx0aXBseSggbSApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKCBtLCB0aGlzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTXVsdGlwbGVzIHRoZSBnaXZlbiA0eDQgbWF0cmljZXMgYW5kIHN0b3JlcyB0aGUgcmVzdWx0XHJcblx0ICogaW4gdGhpcyBtYXRyaXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDR9IGEgLSBUaGUgZmlyc3QgbWF0cml4LlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4NH0gYiAtIFRoZSBzZWNvbmQgbWF0cml4LlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdG11bHRpcGx5TWF0cmljZXMoIGEsIGIgKSB7XHJcblxyXG5cdFx0Y29uc3QgYWUgPSBhLmVsZW1lbnRzO1xyXG5cdFx0Y29uc3QgYmUgPSBiLmVsZW1lbnRzO1xyXG5cdFx0Y29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzO1xyXG5cclxuXHRcdGNvbnN0IGExMSA9IGFlWyAwIF0sIGExMiA9IGFlWyA0IF0sIGExMyA9IGFlWyA4IF0sIGExNCA9IGFlWyAxMiBdO1xyXG5cdFx0Y29uc3QgYTIxID0gYWVbIDEgXSwgYTIyID0gYWVbIDUgXSwgYTIzID0gYWVbIDkgXSwgYTI0ID0gYWVbIDEzIF07XHJcblx0XHRjb25zdCBhMzEgPSBhZVsgMiBdLCBhMzIgPSBhZVsgNiBdLCBhMzMgPSBhZVsgMTAgXSwgYTM0ID0gYWVbIDE0IF07XHJcblx0XHRjb25zdCBhNDEgPSBhZVsgMyBdLCBhNDIgPSBhZVsgNyBdLCBhNDMgPSBhZVsgMTEgXSwgYTQ0ID0gYWVbIDE1IF07XHJcblxyXG5cdFx0Y29uc3QgYjExID0gYmVbIDAgXSwgYjEyID0gYmVbIDQgXSwgYjEzID0gYmVbIDggXSwgYjE0ID0gYmVbIDEyIF07XHJcblx0XHRjb25zdCBiMjEgPSBiZVsgMSBdLCBiMjIgPSBiZVsgNSBdLCBiMjMgPSBiZVsgOSBdLCBiMjQgPSBiZVsgMTMgXTtcclxuXHRcdGNvbnN0IGIzMSA9IGJlWyAyIF0sIGIzMiA9IGJlWyA2IF0sIGIzMyA9IGJlWyAxMCBdLCBiMzQgPSBiZVsgMTQgXTtcclxuXHRcdGNvbnN0IGI0MSA9IGJlWyAzIF0sIGI0MiA9IGJlWyA3IF0sIGI0MyA9IGJlWyAxMSBdLCBiNDQgPSBiZVsgMTUgXTtcclxuXHJcblx0XHR0ZVsgMCBdID0gYTExICogYjExICsgYTEyICogYjIxICsgYTEzICogYjMxICsgYTE0ICogYjQxO1xyXG5cdFx0dGVbIDQgXSA9IGExMSAqIGIxMiArIGExMiAqIGIyMiArIGExMyAqIGIzMiArIGExNCAqIGI0MjtcclxuXHRcdHRlWyA4IF0gPSBhMTEgKiBiMTMgKyBhMTIgKiBiMjMgKyBhMTMgKiBiMzMgKyBhMTQgKiBiNDM7XHJcblx0XHR0ZVsgMTIgXSA9IGExMSAqIGIxNCArIGExMiAqIGIyNCArIGExMyAqIGIzNCArIGExNCAqIGI0NDtcclxuXHJcblx0XHR0ZVsgMSBdID0gYTIxICogYjExICsgYTIyICogYjIxICsgYTIzICogYjMxICsgYTI0ICogYjQxO1xyXG5cdFx0dGVbIDUgXSA9IGEyMSAqIGIxMiArIGEyMiAqIGIyMiArIGEyMyAqIGIzMiArIGEyNCAqIGI0MjtcclxuXHRcdHRlWyA5IF0gPSBhMjEgKiBiMTMgKyBhMjIgKiBiMjMgKyBhMjMgKiBiMzMgKyBhMjQgKiBiNDM7XHJcblx0XHR0ZVsgMTMgXSA9IGEyMSAqIGIxNCArIGEyMiAqIGIyNCArIGEyMyAqIGIzNCArIGEyNCAqIGI0NDtcclxuXHJcblx0XHR0ZVsgMiBdID0gYTMxICogYjExICsgYTMyICogYjIxICsgYTMzICogYjMxICsgYTM0ICogYjQxO1xyXG5cdFx0dGVbIDYgXSA9IGEzMSAqIGIxMiArIGEzMiAqIGIyMiArIGEzMyAqIGIzMiArIGEzNCAqIGI0MjtcclxuXHRcdHRlWyAxMCBdID0gYTMxICogYjEzICsgYTMyICogYjIzICsgYTMzICogYjMzICsgYTM0ICogYjQzO1xyXG5cdFx0dGVbIDE0IF0gPSBhMzEgKiBiMTQgKyBhMzIgKiBiMjQgKyBhMzMgKiBiMzQgKyBhMzQgKiBiNDQ7XHJcblxyXG5cdFx0dGVbIDMgXSA9IGE0MSAqIGIxMSArIGE0MiAqIGIyMSArIGE0MyAqIGIzMSArIGE0NCAqIGI0MTtcclxuXHRcdHRlWyA3IF0gPSBhNDEgKiBiMTIgKyBhNDIgKiBiMjIgKyBhNDMgKiBiMzIgKyBhNDQgKiBiNDI7XHJcblx0XHR0ZVsgMTEgXSA9IGE0MSAqIGIxMyArIGE0MiAqIGIyMyArIGE0MyAqIGIzMyArIGE0NCAqIGI0MztcclxuXHRcdHRlWyAxNSBdID0gYTQxICogYjE0ICsgYTQyICogYjI0ICsgYTQzICogYjM0ICsgYTQ0ICogYjQ0O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE11bHRpcGxpZXMgZXZlcnkgY29tcG9uZW50IG9mIHRoZSBtYXRyaXggYnkgdGhlIGdpdmVuIHNjYWxhci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzIC0gVGhlIHNjYWxhci5cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXg0fSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRtdWx0aXBseVNjYWxhciggcyApIHtcclxuXHJcblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XHJcblxyXG5cdFx0dGVbIDAgXSAqPSBzOyB0ZVsgNCBdICo9IHM7IHRlWyA4IF0gKj0gczsgdGVbIDEyIF0gKj0gcztcclxuXHRcdHRlWyAxIF0gKj0gczsgdGVbIDUgXSAqPSBzOyB0ZVsgOSBdICo9IHM7IHRlWyAxMyBdICo9IHM7XHJcblx0XHR0ZVsgMiBdICo9IHM7IHRlWyA2IF0gKj0gczsgdGVbIDEwIF0gKj0gczsgdGVbIDE0IF0gKj0gcztcclxuXHRcdHRlWyAzIF0gKj0gczsgdGVbIDcgXSAqPSBzOyB0ZVsgMTEgXSAqPSBzOyB0ZVsgMTUgXSAqPSBzO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIGFuZCByZXR1cm5zIHRoZSBkZXRlcm1pbmFudCBvZiB0aGlzIG1hdHJpeC5cclxuXHQgKlxyXG5cdCAqIEJhc2VkIG9uIHRoZSBtZXRob2Qgb3V0bGluZWQgW2hlcmVde0BsaW5rIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2FsZ2VicmEvbWF0cml4L2Z1bmN0aW9ucy9pbnZlcnNlL2ZvdXJEL2luZGV4Lmh0bWx9LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgZGV0ZXJtaW5hbnQuXHJcblx0ICovXHJcblx0ZGV0ZXJtaW5hbnQoKSB7XHJcblxyXG5cdFx0Y29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzO1xyXG5cclxuXHRcdGNvbnN0IG4xMSA9IHRlWyAwIF0sIG4xMiA9IHRlWyA0IF0sIG4xMyA9IHRlWyA4IF0sIG4xNCA9IHRlWyAxMiBdO1xyXG5cdFx0Y29uc3QgbjIxID0gdGVbIDEgXSwgbjIyID0gdGVbIDUgXSwgbjIzID0gdGVbIDkgXSwgbjI0ID0gdGVbIDEzIF07XHJcblx0XHRjb25zdCBuMzEgPSB0ZVsgMiBdLCBuMzIgPSB0ZVsgNiBdLCBuMzMgPSB0ZVsgMTAgXSwgbjM0ID0gdGVbIDE0IF07XHJcblx0XHRjb25zdCBuNDEgPSB0ZVsgMyBdLCBuNDIgPSB0ZVsgNyBdLCBuNDMgPSB0ZVsgMTEgXSwgbjQ0ID0gdGVbIDE1IF07XHJcblxyXG5cdFx0Ly9UT0RPOiBtYWtlIHRoaXMgbW9yZSBlZmZpY2llbnRcclxuXHJcblx0XHRyZXR1cm4gKFxyXG5cdFx0XHRuNDEgKiAoXHJcblx0XHRcdFx0KyBuMTQgKiBuMjMgKiBuMzJcclxuXHRcdFx0XHQgLSBuMTMgKiBuMjQgKiBuMzJcclxuXHRcdFx0XHQgLSBuMTQgKiBuMjIgKiBuMzNcclxuXHRcdFx0XHQgKyBuMTIgKiBuMjQgKiBuMzNcclxuXHRcdFx0XHQgKyBuMTMgKiBuMjIgKiBuMzRcclxuXHRcdFx0XHQgLSBuMTIgKiBuMjMgKiBuMzRcclxuXHRcdFx0KSArXHJcblx0XHRcdG40MiAqIChcclxuXHRcdFx0XHQrIG4xMSAqIG4yMyAqIG4zNFxyXG5cdFx0XHRcdCAtIG4xMSAqIG4yNCAqIG4zM1xyXG5cdFx0XHRcdCArIG4xNCAqIG4yMSAqIG4zM1xyXG5cdFx0XHRcdCAtIG4xMyAqIG4yMSAqIG4zNFxyXG5cdFx0XHRcdCArIG4xMyAqIG4yNCAqIG4zMVxyXG5cdFx0XHRcdCAtIG4xNCAqIG4yMyAqIG4zMVxyXG5cdFx0XHQpICtcclxuXHRcdFx0bjQzICogKFxyXG5cdFx0XHRcdCsgbjExICogbjI0ICogbjMyXHJcblx0XHRcdFx0IC0gbjExICogbjIyICogbjM0XHJcblx0XHRcdFx0IC0gbjE0ICogbjIxICogbjMyXHJcblx0XHRcdFx0ICsgbjEyICogbjIxICogbjM0XHJcblx0XHRcdFx0ICsgbjE0ICogbjIyICogbjMxXHJcblx0XHRcdFx0IC0gbjEyICogbjI0ICogbjMxXHJcblx0XHRcdCkgK1xyXG5cdFx0XHRuNDQgKiAoXHJcblx0XHRcdFx0LSBuMTMgKiBuMjIgKiBuMzFcclxuXHRcdFx0XHQgLSBuMTEgKiBuMjMgKiBuMzJcclxuXHRcdFx0XHQgKyBuMTEgKiBuMjIgKiBuMzNcclxuXHRcdFx0XHQgKyBuMTMgKiBuMjEgKiBuMzJcclxuXHRcdFx0XHQgLSBuMTIgKiBuMjEgKiBuMzNcclxuXHRcdFx0XHQgKyBuMTIgKiBuMjMgKiBuMzFcclxuXHRcdFx0KVxyXG5cclxuXHRcdCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVHJhbnNwb3NlcyB0aGlzIG1hdHJpeCBpbiBwbGFjZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdHRyYW5zcG9zZSgpIHtcclxuXHJcblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XHJcblx0XHRsZXQgdG1wO1xyXG5cclxuXHRcdHRtcCA9IHRlWyAxIF07IHRlWyAxIF0gPSB0ZVsgNCBdOyB0ZVsgNCBdID0gdG1wO1xyXG5cdFx0dG1wID0gdGVbIDIgXTsgdGVbIDIgXSA9IHRlWyA4IF07IHRlWyA4IF0gPSB0bXA7XHJcblx0XHR0bXAgPSB0ZVsgNiBdOyB0ZVsgNiBdID0gdGVbIDkgXTsgdGVbIDkgXSA9IHRtcDtcclxuXHJcblx0XHR0bXAgPSB0ZVsgMyBdOyB0ZVsgMyBdID0gdGVbIDEyIF07IHRlWyAxMiBdID0gdG1wO1xyXG5cdFx0dG1wID0gdGVbIDcgXTsgdGVbIDcgXSA9IHRlWyAxMyBdOyB0ZVsgMTMgXSA9IHRtcDtcclxuXHRcdHRtcCA9IHRlWyAxMSBdOyB0ZVsgMTEgXSA9IHRlWyAxNCBdOyB0ZVsgMTQgXSA9IHRtcDtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBwb3NpdGlvbiBjb21wb25lbnQgZm9yIHRoaXMgbWF0cml4IGZyb20gdGhlIGdpdmVuIHZlY3RvcixcclxuXHQgKiB3aXRob3V0IGFmZmVjdGluZyB0aGUgcmVzdCBvZiB0aGUgbWF0cml4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ8VmVjdG9yM30geCAtIFRoZSB4IGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yIG9yIGFsdGVybmF0aXZlbHkgdGhlIHZlY3RvciBvYmplY3QuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgeSBjb21wb25lbnQgb2YgdGhlIHZlY3Rvci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geiAtIFRoZSB6IGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yLlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdHNldFBvc2l0aW9uKCB4LCB5LCB6ICkge1xyXG5cclxuXHRcdGNvbnN0IHRlID0gdGhpcy5lbGVtZW50cztcclxuXHJcblx0XHRpZiAoIHguaXNWZWN0b3IzICkge1xyXG5cclxuXHRcdFx0dGVbIDEyIF0gPSB4Lng7XHJcblx0XHRcdHRlWyAxMyBdID0geC55O1xyXG5cdFx0XHR0ZVsgMTQgXSA9IHguejtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGVbIDEyIF0gPSB4O1xyXG5cdFx0XHR0ZVsgMTMgXSA9IHk7XHJcblx0XHRcdHRlWyAxNCBdID0gejtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW52ZXJ0cyB0aGlzIG1hdHJpeCwgdXNpbmcgdGhlIFthbmFseXRpYyBtZXRob2Rde0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0ludmVydGlibGVfbWF0cml4I0FuYWx5dGljX3NvbHV0aW9ufS5cclxuXHQgKiBZb3UgY2FuIG5vdCBpbnZlcnQgd2l0aCBhIGRldGVybWluYW50IG9mIHplcm8uIElmIHlvdSBhdHRlbXB0IHRoaXMsIHRoZSBtZXRob2QgcHJvZHVjZXNcclxuXHQgKiBhIHplcm8gbWF0cml4IGluc3RlYWQuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtNYXRyaXg0fSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRpbnZlcnQoKSB7XHJcblxyXG5cdFx0Ly8gYmFzZWQgb24gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvYWxnZWJyYS9tYXRyaXgvZnVuY3Rpb25zL2ludmVyc2UvZm91ckQvaW5kZXguaHRtXHJcblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHMsXHJcblxyXG5cdFx0XHRuMTEgPSB0ZVsgMCBdLCBuMjEgPSB0ZVsgMSBdLCBuMzEgPSB0ZVsgMiBdLCBuNDEgPSB0ZVsgMyBdLFxyXG5cdFx0XHRuMTIgPSB0ZVsgNCBdLCBuMjIgPSB0ZVsgNSBdLCBuMzIgPSB0ZVsgNiBdLCBuNDIgPSB0ZVsgNyBdLFxyXG5cdFx0XHRuMTMgPSB0ZVsgOCBdLCBuMjMgPSB0ZVsgOSBdLCBuMzMgPSB0ZVsgMTAgXSwgbjQzID0gdGVbIDExIF0sXHJcblx0XHRcdG4xNCA9IHRlWyAxMiBdLCBuMjQgPSB0ZVsgMTMgXSwgbjM0ID0gdGVbIDE0IF0sIG40NCA9IHRlWyAxNSBdLFxyXG5cclxuXHRcdFx0dDExID0gbjIzICogbjM0ICogbjQyIC0gbjI0ICogbjMzICogbjQyICsgbjI0ICogbjMyICogbjQzIC0gbjIyICogbjM0ICogbjQzIC0gbjIzICogbjMyICogbjQ0ICsgbjIyICogbjMzICogbjQ0LFxyXG5cdFx0XHR0MTIgPSBuMTQgKiBuMzMgKiBuNDIgLSBuMTMgKiBuMzQgKiBuNDIgLSBuMTQgKiBuMzIgKiBuNDMgKyBuMTIgKiBuMzQgKiBuNDMgKyBuMTMgKiBuMzIgKiBuNDQgLSBuMTIgKiBuMzMgKiBuNDQsXHJcblx0XHRcdHQxMyA9IG4xMyAqIG4yNCAqIG40MiAtIG4xNCAqIG4yMyAqIG40MiArIG4xNCAqIG4yMiAqIG40MyAtIG4xMiAqIG4yNCAqIG40MyAtIG4xMyAqIG4yMiAqIG40NCArIG4xMiAqIG4yMyAqIG40NCxcclxuXHRcdFx0dDE0ID0gbjE0ICogbjIzICogbjMyIC0gbjEzICogbjI0ICogbjMyIC0gbjE0ICogbjIyICogbjMzICsgbjEyICogbjI0ICogbjMzICsgbjEzICogbjIyICogbjM0IC0gbjEyICogbjIzICogbjM0O1xyXG5cclxuXHRcdGNvbnN0IGRldCA9IG4xMSAqIHQxMSArIG4yMSAqIHQxMiArIG4zMSAqIHQxMyArIG40MSAqIHQxNDtcclxuXHJcblx0XHRpZiAoIGRldCA9PT0gMCApIHJldHVybiB0aGlzLnNldCggMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCApO1xyXG5cclxuXHRcdGNvbnN0IGRldEludiA9IDEgLyBkZXQ7XHJcblxyXG5cdFx0dGVbIDAgXSA9IHQxMSAqIGRldEludjtcclxuXHRcdHRlWyAxIF0gPSAoIG4yNCAqIG4zMyAqIG40MSAtIG4yMyAqIG4zNCAqIG40MSAtIG4yNCAqIG4zMSAqIG40MyArIG4yMSAqIG4zNCAqIG40MyArIG4yMyAqIG4zMSAqIG40NCAtIG4yMSAqIG4zMyAqIG40NCApICogZGV0SW52O1xyXG5cdFx0dGVbIDIgXSA9ICggbjIyICogbjM0ICogbjQxIC0gbjI0ICogbjMyICogbjQxICsgbjI0ICogbjMxICogbjQyIC0gbjIxICogbjM0ICogbjQyIC0gbjIyICogbjMxICogbjQ0ICsgbjIxICogbjMyICogbjQ0ICkgKiBkZXRJbnY7XHJcblx0XHR0ZVsgMyBdID0gKCBuMjMgKiBuMzIgKiBuNDEgLSBuMjIgKiBuMzMgKiBuNDEgLSBuMjMgKiBuMzEgKiBuNDIgKyBuMjEgKiBuMzMgKiBuNDIgKyBuMjIgKiBuMzEgKiBuNDMgLSBuMjEgKiBuMzIgKiBuNDMgKSAqIGRldEludjtcclxuXHJcblx0XHR0ZVsgNCBdID0gdDEyICogZGV0SW52O1xyXG5cdFx0dGVbIDUgXSA9ICggbjEzICogbjM0ICogbjQxIC0gbjE0ICogbjMzICogbjQxICsgbjE0ICogbjMxICogbjQzIC0gbjExICogbjM0ICogbjQzIC0gbjEzICogbjMxICogbjQ0ICsgbjExICogbjMzICogbjQ0ICkgKiBkZXRJbnY7XHJcblx0XHR0ZVsgNiBdID0gKCBuMTQgKiBuMzIgKiBuNDEgLSBuMTIgKiBuMzQgKiBuNDEgLSBuMTQgKiBuMzEgKiBuNDIgKyBuMTEgKiBuMzQgKiBuNDIgKyBuMTIgKiBuMzEgKiBuNDQgLSBuMTEgKiBuMzIgKiBuNDQgKSAqIGRldEludjtcclxuXHRcdHRlWyA3IF0gPSAoIG4xMiAqIG4zMyAqIG40MSAtIG4xMyAqIG4zMiAqIG40MSArIG4xMyAqIG4zMSAqIG40MiAtIG4xMSAqIG4zMyAqIG40MiAtIG4xMiAqIG4zMSAqIG40MyArIG4xMSAqIG4zMiAqIG40MyApICogZGV0SW52O1xyXG5cclxuXHRcdHRlWyA4IF0gPSB0MTMgKiBkZXRJbnY7XHJcblx0XHR0ZVsgOSBdID0gKCBuMTQgKiBuMjMgKiBuNDEgLSBuMTMgKiBuMjQgKiBuNDEgLSBuMTQgKiBuMjEgKiBuNDMgKyBuMTEgKiBuMjQgKiBuNDMgKyBuMTMgKiBuMjEgKiBuNDQgLSBuMTEgKiBuMjMgKiBuNDQgKSAqIGRldEludjtcclxuXHRcdHRlWyAxMCBdID0gKCBuMTIgKiBuMjQgKiBuNDEgLSBuMTQgKiBuMjIgKiBuNDEgKyBuMTQgKiBuMjEgKiBuNDIgLSBuMTEgKiBuMjQgKiBuNDIgLSBuMTIgKiBuMjEgKiBuNDQgKyBuMTEgKiBuMjIgKiBuNDQgKSAqIGRldEludjtcclxuXHRcdHRlWyAxMSBdID0gKCBuMTMgKiBuMjIgKiBuNDEgLSBuMTIgKiBuMjMgKiBuNDEgLSBuMTMgKiBuMjEgKiBuNDIgKyBuMTEgKiBuMjMgKiBuNDIgKyBuMTIgKiBuMjEgKiBuNDMgLSBuMTEgKiBuMjIgKiBuNDMgKSAqIGRldEludjtcclxuXHJcblx0XHR0ZVsgMTIgXSA9IHQxNCAqIGRldEludjtcclxuXHRcdHRlWyAxMyBdID0gKCBuMTMgKiBuMjQgKiBuMzEgLSBuMTQgKiBuMjMgKiBuMzEgKyBuMTQgKiBuMjEgKiBuMzMgLSBuMTEgKiBuMjQgKiBuMzMgLSBuMTMgKiBuMjEgKiBuMzQgKyBuMTEgKiBuMjMgKiBuMzQgKSAqIGRldEludjtcclxuXHRcdHRlWyAxNCBdID0gKCBuMTQgKiBuMjIgKiBuMzEgLSBuMTIgKiBuMjQgKiBuMzEgLSBuMTQgKiBuMjEgKiBuMzIgKyBuMTEgKiBuMjQgKiBuMzIgKyBuMTIgKiBuMjEgKiBuMzQgLSBuMTEgKiBuMjIgKiBuMzQgKSAqIGRldEludjtcclxuXHRcdHRlWyAxNSBdID0gKCBuMTIgKiBuMjMgKiBuMzEgLSBuMTMgKiBuMjIgKiBuMzEgKyBuMTMgKiBuMjEgKiBuMzIgLSBuMTEgKiBuMjMgKiBuMzIgLSBuMTIgKiBuMjEgKiBuMzMgKyBuMTEgKiBuMjIgKiBuMzMgKSAqIGRldEludjtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBNdWx0aXBsaWVzIHRoZSBjb2x1bW5zIG9mIHRoaXMgbWF0cml4IGJ5IHRoZSBnaXZlbiB2ZWN0b3IuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHYgLSBUaGUgc2NhbGUgdmVjdG9yLlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdHNjYWxlKCB2ICkge1xyXG5cclxuXHRcdGNvbnN0IHRlID0gdGhpcy5lbGVtZW50cztcclxuXHRcdGNvbnN0IHggPSB2LngsIHkgPSB2LnksIHogPSB2Lno7XHJcblxyXG5cdFx0dGVbIDAgXSAqPSB4OyB0ZVsgNCBdICo9IHk7IHRlWyA4IF0gKj0gejtcclxuXHRcdHRlWyAxIF0gKj0geDsgdGVbIDUgXSAqPSB5OyB0ZVsgOSBdICo9IHo7XHJcblx0XHR0ZVsgMiBdICo9IHg7IHRlWyA2IF0gKj0geTsgdGVbIDEwIF0gKj0gejtcclxuXHRcdHRlWyAzIF0gKj0geDsgdGVbIDcgXSAqPSB5OyB0ZVsgMTEgXSAqPSB6O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdldHMgdGhlIG1heGltdW0gc2NhbGUgdmFsdWUgb2YgdGhlIHRocmVlIGF4ZXMuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBtYXhpbXVtIHNjYWxlLlxyXG5cdCAqL1xyXG5cdGdldE1heFNjYWxlT25BeGlzKCkge1xyXG5cclxuXHRcdGNvbnN0IHRlID0gdGhpcy5lbGVtZW50cztcclxuXHJcblx0XHRjb25zdCBzY2FsZVhTcSA9IHRlWyAwIF0gKiB0ZVsgMCBdICsgdGVbIDEgXSAqIHRlWyAxIF0gKyB0ZVsgMiBdICogdGVbIDIgXTtcclxuXHRcdGNvbnN0IHNjYWxlWVNxID0gdGVbIDQgXSAqIHRlWyA0IF0gKyB0ZVsgNSBdICogdGVbIDUgXSArIHRlWyA2IF0gKiB0ZVsgNiBdO1xyXG5cdFx0Y29uc3Qgc2NhbGVaU3EgPSB0ZVsgOCBdICogdGVbIDggXSArIHRlWyA5IF0gKiB0ZVsgOSBdICsgdGVbIDEwIF0gKiB0ZVsgMTAgXTtcclxuXHJcblx0XHRyZXR1cm4gTWF0aC5zcXJ0KCBNYXRoLm1heCggc2NhbGVYU3EsIHNjYWxlWVNxLCBzY2FsZVpTcSApICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGlzIG1hdHJpeCBhcyBhIHRyYW5zbGF0aW9uIHRyYW5zZm9ybSBmcm9tIHRoZSBnaXZlbiB2ZWN0b3IuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcnxWZWN0b3IzfSB4IC0gVGhlIGFtb3VudCB0byB0cmFuc2xhdGUgaW4gdGhlIFggYXhpcyBvciBhbHRlcm5hdGl2ZWx5IGEgdHJhbnNsYXRpb24gdmVjdG9yLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIGFtb3VudCB0byB0cmFuc2xhdGUgaW4gdGhlIFkgYXhpcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geiAtIFRoZSBhbW91bnQgdG8gdHJhbnNsYXRlIGluIHRoZSB6IGF4aXMuXHJcblx0ICogQHJldHVybiB7TWF0cml4NH0gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0bWFrZVRyYW5zbGF0aW9uKCB4LCB5LCB6ICkge1xyXG5cclxuXHRcdGlmICggeC5pc1ZlY3RvcjMgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnNldChcclxuXHJcblx0XHRcdFx0MSwgMCwgMCwgeC54LFxyXG5cdFx0XHRcdDAsIDEsIDAsIHgueSxcclxuXHRcdFx0XHQwLCAwLCAxLCB4LnosXHJcblx0XHRcdFx0MCwgMCwgMCwgMVxyXG5cclxuXHRcdFx0KTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGhpcy5zZXQoXHJcblxyXG5cdFx0XHRcdDEsIDAsIDAsIHgsXHJcblx0XHRcdFx0MCwgMSwgMCwgeSxcclxuXHRcdFx0XHQwLCAwLCAxLCB6LFxyXG5cdFx0XHRcdDAsIDAsIDAsIDFcclxuXHJcblx0XHRcdCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhpcyBtYXRyaXggYXMgYSByb3RhdGlvbmFsIHRyYW5zZm9ybWF0aW9uIGFyb3VuZCB0aGUgWCBheGlzIGJ5XHJcblx0ICogdGhlIGdpdmVuIGFuZ2xlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHRoZXRhIC0gVGhlIHJvdGF0aW9uIGluIHJhZGlhbnMuXHJcblx0ICogQHJldHVybiB7TWF0cml4NH0gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0bWFrZVJvdGF0aW9uWCggdGhldGEgKSB7XHJcblxyXG5cdFx0Y29uc3QgYyA9IE1hdGguY29zKCB0aGV0YSApLCBzID0gTWF0aC5zaW4oIHRoZXRhICk7XHJcblxyXG5cdFx0dGhpcy5zZXQoXHJcblxyXG5cdFx0XHQxLCAwLCAwLCAwLFxyXG5cdFx0XHQwLCBjLCAtIHMsIDAsXHJcblx0XHRcdDAsIHMsIGMsIDAsXHJcblx0XHRcdDAsIDAsIDAsIDFcclxuXHJcblx0XHQpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhpcyBtYXRyaXggYXMgYSByb3RhdGlvbmFsIHRyYW5zZm9ybWF0aW9uIGFyb3VuZCB0aGUgWSBheGlzIGJ5XHJcblx0ICogdGhlIGdpdmVuIGFuZ2xlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHRoZXRhIC0gVGhlIHJvdGF0aW9uIGluIHJhZGlhbnMuXHJcblx0ICogQHJldHVybiB7TWF0cml4NH0gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0bWFrZVJvdGF0aW9uWSggdGhldGEgKSB7XHJcblxyXG5cdFx0Y29uc3QgYyA9IE1hdGguY29zKCB0aGV0YSApLCBzID0gTWF0aC5zaW4oIHRoZXRhICk7XHJcblxyXG5cdFx0dGhpcy5zZXQoXHJcblxyXG5cdFx0XHQgYywgMCwgcywgMCxcclxuXHRcdFx0IDAsIDEsIDAsIDAsXHJcblx0XHRcdC0gcywgMCwgYywgMCxcclxuXHRcdFx0IDAsIDAsIDAsIDFcclxuXHJcblx0XHQpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhpcyBtYXRyaXggYXMgYSByb3RhdGlvbmFsIHRyYW5zZm9ybWF0aW9uIGFyb3VuZCB0aGUgWiBheGlzIGJ5XHJcblx0ICogdGhlIGdpdmVuIGFuZ2xlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHRoZXRhIC0gVGhlIHJvdGF0aW9uIGluIHJhZGlhbnMuXHJcblx0ICogQHJldHVybiB7TWF0cml4NH0gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0bWFrZVJvdGF0aW9uWiggdGhldGEgKSB7XHJcblxyXG5cdFx0Y29uc3QgYyA9IE1hdGguY29zKCB0aGV0YSApLCBzID0gTWF0aC5zaW4oIHRoZXRhICk7XHJcblxyXG5cdFx0dGhpcy5zZXQoXHJcblxyXG5cdFx0XHRjLCAtIHMsIDAsIDAsXHJcblx0XHRcdHMsIGMsIDAsIDAsXHJcblx0XHRcdDAsIDAsIDEsIDAsXHJcblx0XHRcdDAsIDAsIDAsIDFcclxuXHJcblx0XHQpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhpcyBtYXRyaXggYXMgYSByb3RhdGlvbmFsIHRyYW5zZm9ybWF0aW9uIGFyb3VuZCB0aGUgZ2l2ZW4gYXhpcyBieVxyXG5cdCAqIHRoZSBnaXZlbiBhbmdsZS5cclxuXHQgKlxyXG5cdCAqIFRoaXMgaXMgYSBzb21ld2hhdCBjb250cm92ZXJzaWFsIGJ1dCBtYXRoZW1hdGljYWxseSBzb3VuZCBhbHRlcm5hdGl2ZSB0b1xyXG5cdCAqIHJvdGF0aW5nIHZpYSBRdWF0ZXJuaW9ucy4gU2VlIHRoZSBkaXNjdXNzaW9uIFtoZXJlXXtAbGluayBodHRwczovL3d3dy5nYW1lZGV2Lm5ldC9hcnRpY2xlcy9wcm9ncmFtbWluZy9tYXRoLWFuZC1waHlzaWNzL2RvLXdlLXJlYWxseS1uZWVkLXF1YXRlcm5pb25zLXIxMTk5fS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gYXhpcyAtIFRoZSBub3JtYWxpemVkIHJvdGF0aW9uIGF4aXMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFuZ2xlIC0gVGhlIHJvdGF0aW9uIGluIHJhZGlhbnMuXHJcblx0ICogQHJldHVybiB7TWF0cml4NH0gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0bWFrZVJvdGF0aW9uQXhpcyggYXhpcywgYW5nbGUgKSB7XHJcblxyXG5cdFx0Ly8gQmFzZWQgb24gaHR0cDovL3d3dy5nYW1lZGV2Lm5ldC9yZWZlcmVuY2UvYXJ0aWNsZXMvYXJ0aWNsZTExOTkuYXNwXHJcblxyXG5cdFx0Y29uc3QgYyA9IE1hdGguY29zKCBhbmdsZSApO1xyXG5cdFx0Y29uc3QgcyA9IE1hdGguc2luKCBhbmdsZSApO1xyXG5cdFx0Y29uc3QgdCA9IDEgLSBjO1xyXG5cdFx0Y29uc3QgeCA9IGF4aXMueCwgeSA9IGF4aXMueSwgeiA9IGF4aXMuejtcclxuXHRcdGNvbnN0IHR4ID0gdCAqIHgsIHR5ID0gdCAqIHk7XHJcblxyXG5cdFx0dGhpcy5zZXQoXHJcblxyXG5cdFx0XHR0eCAqIHggKyBjLCB0eCAqIHkgLSBzICogeiwgdHggKiB6ICsgcyAqIHksIDAsXHJcblx0XHRcdHR4ICogeSArIHMgKiB6LCB0eSAqIHkgKyBjLCB0eSAqIHogLSBzICogeCwgMCxcclxuXHRcdFx0dHggKiB6IC0gcyAqIHksIHR5ICogeiArIHMgKiB4LCB0ICogeiAqIHogKyBjLCAwLFxyXG5cdFx0XHQwLCAwLCAwLCAxXHJcblxyXG5cdFx0KTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoaXMgbWF0cml4IGFzIGEgc2NhbGUgdHJhbnNmb3JtYXRpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBhbW91bnQgdG8gc2NhbGUgaW4gdGhlIFggYXhpcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSBhbW91bnQgdG8gc2NhbGUgaW4gdGhlIFkgYXhpcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geiAtIFRoZSBhbW91bnQgdG8gc2NhbGUgaW4gdGhlIFogYXhpcy5cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXg0fSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRtYWtlU2NhbGUoIHgsIHksIHogKSB7XHJcblxyXG5cdFx0dGhpcy5zZXQoXHJcblxyXG5cdFx0XHR4LCAwLCAwLCAwLFxyXG5cdFx0XHQwLCB5LCAwLCAwLFxyXG5cdFx0XHQwLCAwLCB6LCAwLFxyXG5cdFx0XHQwLCAwLCAwLCAxXHJcblxyXG5cdFx0KTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoaXMgbWF0cml4IGFzIGEgc2hlYXIgdHJhbnNmb3JtYXRpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0geHkgLSBUaGUgYW1vdW50IHRvIHNoZWFyIFggYnkgWS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geHogLSBUaGUgYW1vdW50IHRvIHNoZWFyIFggYnkgWi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geXggLSBUaGUgYW1vdW50IHRvIHNoZWFyIFkgYnkgWC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geXogLSBUaGUgYW1vdW50IHRvIHNoZWFyIFkgYnkgWi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0genggLSBUaGUgYW1vdW50IHRvIHNoZWFyIFogYnkgWC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0genkgLSBUaGUgYW1vdW50IHRvIHNoZWFyIFogYnkgWS5cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXg0fSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRtYWtlU2hlYXIoIHh5LCB4eiwgeXgsIHl6LCB6eCwgenkgKSB7XHJcblxyXG5cdFx0dGhpcy5zZXQoXHJcblxyXG5cdFx0XHQxLCB5eCwgengsIDAsXHJcblx0XHRcdHh5LCAxLCB6eSwgMCxcclxuXHRcdFx0eHosIHl6LCAxLCAwLFxyXG5cdFx0XHQwLCAwLCAwLCAxXHJcblxyXG5cdFx0KTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoaXMgbWF0cml4IHRvIHRoZSB0cmFuc2Zvcm1hdGlvbiBjb21wb3NlZCBvZiB0aGUgZ2l2ZW4gcG9zaXRpb24sXHJcblx0ICogcm90YXRpb24gKFF1YXRlcm5pb24pIGFuZCBzY2FsZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gcG9zaXRpb24gLSBUaGUgcG9zaXRpb24gdmVjdG9yLlxyXG5cdCAqIEBwYXJhbSB7UXVhdGVybmlvbn0gcXVhdGVybmlvbiAtIFRoZSByb3RhdGlvbiBhcyBhIFF1YXRlcm5pb24uXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBzY2FsZSAtIFRoZSBzY2FsZSB2ZWN0b3IuXHJcblx0ICogQHJldHVybiB7TWF0cml4NH0gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0Y29tcG9zZSggcG9zaXRpb24sIHF1YXRlcm5pb24sIHNjYWxlICkge1xyXG5cclxuXHRcdGNvbnN0IHRlID0gdGhpcy5lbGVtZW50cztcclxuXHJcblx0XHRjb25zdCB4ID0gcXVhdGVybmlvbi5feCwgeSA9IHF1YXRlcm5pb24uX3ksIHogPSBxdWF0ZXJuaW9uLl96LCB3ID0gcXVhdGVybmlvbi5fdztcclxuXHRcdGNvbnN0IHgyID0geCArIHgsXHR5MiA9IHkgKyB5LCB6MiA9IHogKyB6O1xyXG5cdFx0Y29uc3QgeHggPSB4ICogeDIsIHh5ID0geCAqIHkyLCB4eiA9IHggKiB6MjtcclxuXHRcdGNvbnN0IHl5ID0geSAqIHkyLCB5eiA9IHkgKiB6MiwgenogPSB6ICogejI7XHJcblx0XHRjb25zdCB3eCA9IHcgKiB4Miwgd3kgPSB3ICogeTIsIHd6ID0gdyAqIHoyO1xyXG5cclxuXHRcdGNvbnN0IHN4ID0gc2NhbGUueCwgc3kgPSBzY2FsZS55LCBzeiA9IHNjYWxlLno7XHJcblxyXG5cdFx0dGVbIDAgXSA9ICggMSAtICggeXkgKyB6eiApICkgKiBzeDtcclxuXHRcdHRlWyAxIF0gPSAoIHh5ICsgd3ogKSAqIHN4O1xyXG5cdFx0dGVbIDIgXSA9ICggeHogLSB3eSApICogc3g7XHJcblx0XHR0ZVsgMyBdID0gMDtcclxuXHJcblx0XHR0ZVsgNCBdID0gKCB4eSAtIHd6ICkgKiBzeTtcclxuXHRcdHRlWyA1IF0gPSAoIDEgLSAoIHh4ICsgenogKSApICogc3k7XHJcblx0XHR0ZVsgNiBdID0gKCB5eiArIHd4ICkgKiBzeTtcclxuXHRcdHRlWyA3IF0gPSAwO1xyXG5cclxuXHRcdHRlWyA4IF0gPSAoIHh6ICsgd3kgKSAqIHN6O1xyXG5cdFx0dGVbIDkgXSA9ICggeXogLSB3eCApICogc3o7XHJcblx0XHR0ZVsgMTAgXSA9ICggMSAtICggeHggKyB5eSApICkgKiBzejtcclxuXHRcdHRlWyAxMSBdID0gMDtcclxuXHJcblx0XHR0ZVsgMTIgXSA9IHBvc2l0aW9uLng7XHJcblx0XHR0ZVsgMTMgXSA9IHBvc2l0aW9uLnk7XHJcblx0XHR0ZVsgMTQgXSA9IHBvc2l0aW9uLno7XHJcblx0XHR0ZVsgMTUgXSA9IDE7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVjb21wb3NlcyB0aGlzIG1hdHJpeCBpbnRvIGl0cyBwb3NpdGlvbiwgcm90YXRpb24gYW5kIHNjYWxlIGNvbXBvbmVudHNcclxuXHQgKiBhbmQgcHJvdmlkZXMgdGhlIHJlc3VsdCBpbiB0aGUgZ2l2ZW4gb2JqZWN0cy5cclxuXHQgKlxyXG5cdCAqIE5vdGU6IE5vdCBhbGwgbWF0cmljZXMgYXJlIGRlY29tcG9zYWJsZSBpbiB0aGlzIHdheS4gRm9yIGV4YW1wbGUsIGlmIGFuXHJcblx0ICogb2JqZWN0IGhhcyBhIG5vbi11bmlmb3JtbHkgc2NhbGVkIHBhcmVudCwgdGhlbiB0aGUgb2JqZWN0J3Mgd29ybGQgbWF0cml4XHJcblx0ICogbWF5IG5vdCBiZSBkZWNvbXBvc2FibGUsIGFuZCB0aGlzIG1ldGhvZCBtYXkgbm90IGJlIGFwcHJvcHJpYXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBwb3NpdGlvbiAtIFRoZSBwb3NpdGlvbiB2ZWN0b3IuXHJcblx0ICogQHBhcmFtIHtRdWF0ZXJuaW9ufSBxdWF0ZXJuaW9uIC0gVGhlIHJvdGF0aW9uIGFzIGEgUXVhdGVybmlvbi5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHNjYWxlIC0gVGhlIHNjYWxlIHZlY3Rvci5cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXg0fSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRkZWNvbXBvc2UoIHBvc2l0aW9uLCBxdWF0ZXJuaW9uLCBzY2FsZSApIHtcclxuXHJcblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XHJcblxyXG5cdFx0bGV0IHN4ID0gX3YxLnNldCggdGVbIDAgXSwgdGVbIDEgXSwgdGVbIDIgXSApLmxlbmd0aCgpO1xyXG5cdFx0Y29uc3Qgc3kgPSBfdjEuc2V0KCB0ZVsgNCBdLCB0ZVsgNSBdLCB0ZVsgNiBdICkubGVuZ3RoKCk7XHJcblx0XHRjb25zdCBzeiA9IF92MS5zZXQoIHRlWyA4IF0sIHRlWyA5IF0sIHRlWyAxMCBdICkubGVuZ3RoKCk7XHJcblxyXG5cdFx0Ly8gaWYgZGV0ZXJtaW5lIGlzIG5lZ2F0aXZlLCB3ZSBuZWVkIHRvIGludmVydCBvbmUgc2NhbGVcclxuXHRcdGNvbnN0IGRldCA9IHRoaXMuZGV0ZXJtaW5hbnQoKTtcclxuXHRcdGlmICggZGV0IDwgMCApIHN4ID0gLSBzeDtcclxuXHJcblx0XHRwb3NpdGlvbi54ID0gdGVbIDEyIF07XHJcblx0XHRwb3NpdGlvbi55ID0gdGVbIDEzIF07XHJcblx0XHRwb3NpdGlvbi56ID0gdGVbIDE0IF07XHJcblxyXG5cdFx0Ly8gc2NhbGUgdGhlIHJvdGF0aW9uIHBhcnRcclxuXHRcdF9tMS5jb3B5KCB0aGlzICk7XHJcblxyXG5cdFx0Y29uc3QgaW52U1ggPSAxIC8gc3g7XHJcblx0XHRjb25zdCBpbnZTWSA9IDEgLyBzeTtcclxuXHRcdGNvbnN0IGludlNaID0gMSAvIHN6O1xyXG5cclxuXHRcdF9tMS5lbGVtZW50c1sgMCBdICo9IGludlNYO1xyXG5cdFx0X20xLmVsZW1lbnRzWyAxIF0gKj0gaW52U1g7XHJcblx0XHRfbTEuZWxlbWVudHNbIDIgXSAqPSBpbnZTWDtcclxuXHJcblx0XHRfbTEuZWxlbWVudHNbIDQgXSAqPSBpbnZTWTtcclxuXHRcdF9tMS5lbGVtZW50c1sgNSBdICo9IGludlNZO1xyXG5cdFx0X20xLmVsZW1lbnRzWyA2IF0gKj0gaW52U1k7XHJcblxyXG5cdFx0X20xLmVsZW1lbnRzWyA4IF0gKj0gaW52U1o7XHJcblx0XHRfbTEuZWxlbWVudHNbIDkgXSAqPSBpbnZTWjtcclxuXHRcdF9tMS5lbGVtZW50c1sgMTAgXSAqPSBpbnZTWjtcclxuXHJcblx0XHRxdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeCggX20xICk7XHJcblxyXG5cdFx0c2NhbGUueCA9IHN4O1xyXG5cdFx0c2NhbGUueSA9IHN5O1xyXG5cdFx0c2NhbGUueiA9IHN6O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgYSBwZXJzcGVjdGl2ZSBwcm9qZWN0aW9uIG1hdHJpeC4gVGhpcyBpcyB1c2VkIGludGVybmFsbHkgYnlcclxuXHQgKiB7QGxpbmsgUGVyc3BlY3RpdmVDYW1lcmEjdXBkYXRlUHJvamVjdGlvbk1hdHJpeH0uXHJcblxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBsZWZ0IC0gTGVmdCBib3VuZGFyeSBvZiB0aGUgdmlld2luZyBmcnVzdHVtIGF0IHRoZSBuZWFyIHBsYW5lLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSByaWdodCAtIFJpZ2h0IGJvdW5kYXJ5IG9mIHRoZSB2aWV3aW5nIGZydXN0dW0gYXQgdGhlIG5lYXIgcGxhbmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHRvcCAtIFRvcCBib3VuZGFyeSBvZiB0aGUgdmlld2luZyBmcnVzdHVtIGF0IHRoZSBuZWFyIHBsYW5lLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBib3R0b20gLSBCb3R0b20gYm91bmRhcnkgb2YgdGhlIHZpZXdpbmcgZnJ1c3R1bSBhdCB0aGUgbmVhciBwbGFuZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbmVhciAtIFRoZSBkaXN0YW5jZSBmcm9tIHRoZSBjYW1lcmEgdG8gdGhlIG5lYXIgcGxhbmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGZhciAtIFRoZSBkaXN0YW5jZSBmcm9tIHRoZSBjYW1lcmEgdG8gdGhlIGZhciBwbGFuZS5cclxuXHQgKiBAcGFyYW0geyhXZWJHTENvb3JkaW5hdGVTeXN0ZW18V2ViR1BVQ29vcmRpbmF0ZVN5c3RlbSl9IFtjb29yZGluYXRlU3lzdGVtPVdlYkdMQ29vcmRpbmF0ZVN5c3RlbV0gLSBUaGUgY29vcmRpbmF0ZSBzeXN0ZW0uXHJcblx0ICogQHJldHVybiB7TWF0cml4NH0gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0bWFrZVBlcnNwZWN0aXZlKCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIG5lYXIsIGZhciwgY29vcmRpbmF0ZVN5c3RlbSA9IFdlYkdMQ29vcmRpbmF0ZVN5c3RlbSApIHtcclxuXHJcblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XHJcblx0XHRjb25zdCB4ID0gMiAqIG5lYXIgLyAoIHJpZ2h0IC0gbGVmdCApO1xyXG5cdFx0Y29uc3QgeSA9IDIgKiBuZWFyIC8gKCB0b3AgLSBib3R0b20gKTtcclxuXHJcblx0XHRjb25zdCBhID0gKCByaWdodCArIGxlZnQgKSAvICggcmlnaHQgLSBsZWZ0ICk7XHJcblx0XHRjb25zdCBiID0gKCB0b3AgKyBib3R0b20gKSAvICggdG9wIC0gYm90dG9tICk7XHJcblxyXG5cdFx0bGV0IGMsIGQ7XHJcblxyXG5cdFx0aWYgKCBjb29yZGluYXRlU3lzdGVtID09PSBXZWJHTENvb3JkaW5hdGVTeXN0ZW0gKSB7XHJcblxyXG5cdFx0XHRjID0gLSAoIGZhciArIG5lYXIgKSAvICggZmFyIC0gbmVhciApO1xyXG5cdFx0XHRkID0gKCAtIDIgKiBmYXIgKiBuZWFyICkgLyAoIGZhciAtIG5lYXIgKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBjb29yZGluYXRlU3lzdGVtID09PSBXZWJHUFVDb29yZGluYXRlU3lzdGVtICkge1xyXG5cclxuXHRcdFx0YyA9IC0gZmFyIC8gKCBmYXIgLSBuZWFyICk7XHJcblx0XHRcdGQgPSAoIC0gZmFyICogbmVhciApIC8gKCBmYXIgLSBuZWFyICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHRocm93IG5ldyBFcnJvciggJ1RIUkVFLk1hdHJpeDQubWFrZVBlcnNwZWN0aXZlKCk6IEludmFsaWQgY29vcmRpbmF0ZSBzeXN0ZW06ICcgKyBjb29yZGluYXRlU3lzdGVtICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRlWyAwIF0gPSB4O1x0dGVbIDQgXSA9IDA7XHR0ZVsgOCBdID0gYTsgXHR0ZVsgMTIgXSA9IDA7XHJcblx0XHR0ZVsgMSBdID0gMDtcdHRlWyA1IF0gPSB5O1x0dGVbIDkgXSA9IGI7IFx0dGVbIDEzIF0gPSAwO1xyXG5cdFx0dGVbIDIgXSA9IDA7XHR0ZVsgNiBdID0gMDtcdHRlWyAxMCBdID0gYzsgXHR0ZVsgMTQgXSA9IGQ7XHJcblx0XHR0ZVsgMyBdID0gMDtcdHRlWyA3IF0gPSAwO1x0dGVbIDExIF0gPSAtIDE7XHR0ZVsgMTUgXSA9IDA7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyBhIG9ydGhvZ3JhcGhpYyBwcm9qZWN0aW9uIG1hdHJpeC4gVGhpcyBpcyB1c2VkIGludGVybmFsbHkgYnlcclxuXHQgKiB7QGxpbmsgT3J0aG9ncmFwaGljQ2FtZXJhI3VwZGF0ZVByb2plY3Rpb25NYXRyaXh9LlxyXG5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbGVmdCAtIExlZnQgYm91bmRhcnkgb2YgdGhlIHZpZXdpbmcgZnJ1c3R1bSBhdCB0aGUgbmVhciBwbGFuZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gcmlnaHQgLSBSaWdodCBib3VuZGFyeSBvZiB0aGUgdmlld2luZyBmcnVzdHVtIGF0IHRoZSBuZWFyIHBsYW5lLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0b3AgLSBUb3AgYm91bmRhcnkgb2YgdGhlIHZpZXdpbmcgZnJ1c3R1bSBhdCB0aGUgbmVhciBwbGFuZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYm90dG9tIC0gQm90dG9tIGJvdW5kYXJ5IG9mIHRoZSB2aWV3aW5nIGZydXN0dW0gYXQgdGhlIG5lYXIgcGxhbmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IG5lYXIgLSBUaGUgZGlzdGFuY2UgZnJvbSB0aGUgY2FtZXJhIHRvIHRoZSBuZWFyIHBsYW5lLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBmYXIgLSBUaGUgZGlzdGFuY2UgZnJvbSB0aGUgY2FtZXJhIHRvIHRoZSBmYXIgcGxhbmUuXHJcblx0ICogQHBhcmFtIHsoV2ViR0xDb29yZGluYXRlU3lzdGVtfFdlYkdQVUNvb3JkaW5hdGVTeXN0ZW0pfSBbY29vcmRpbmF0ZVN5c3RlbT1XZWJHTENvb3JkaW5hdGVTeXN0ZW1dIC0gVGhlIGNvb3JkaW5hdGUgc3lzdGVtLlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdG1ha2VPcnRob2dyYXBoaWMoIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSwgbmVhciwgZmFyLCBjb29yZGluYXRlU3lzdGVtID0gV2ViR0xDb29yZGluYXRlU3lzdGVtICkge1xyXG5cclxuXHRcdGNvbnN0IHRlID0gdGhpcy5lbGVtZW50cztcclxuXHRcdGNvbnN0IHcgPSAxLjAgLyAoIHJpZ2h0IC0gbGVmdCApO1xyXG5cdFx0Y29uc3QgaCA9IDEuMCAvICggdG9wIC0gYm90dG9tICk7XHJcblx0XHRjb25zdCBwID0gMS4wIC8gKCBmYXIgLSBuZWFyICk7XHJcblxyXG5cdFx0Y29uc3QgeCA9ICggcmlnaHQgKyBsZWZ0ICkgKiB3O1xyXG5cdFx0Y29uc3QgeSA9ICggdG9wICsgYm90dG9tICkgKiBoO1xyXG5cclxuXHRcdGxldCB6LCB6SW52O1xyXG5cclxuXHRcdGlmICggY29vcmRpbmF0ZVN5c3RlbSA9PT0gV2ViR0xDb29yZGluYXRlU3lzdGVtICkge1xyXG5cclxuXHRcdFx0eiA9ICggZmFyICsgbmVhciApICogcDtcclxuXHRcdFx0ekludiA9IC0gMiAqIHA7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggY29vcmRpbmF0ZVN5c3RlbSA9PT0gV2ViR1BVQ29vcmRpbmF0ZVN5c3RlbSApIHtcclxuXHJcblx0XHRcdHogPSBuZWFyICogcDtcclxuXHRcdFx0ekludiA9IC0gMSAqIHA7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHRocm93IG5ldyBFcnJvciggJ1RIUkVFLk1hdHJpeDQubWFrZU9ydGhvZ3JhcGhpYygpOiBJbnZhbGlkIGNvb3JkaW5hdGUgc3lzdGVtOiAnICsgY29vcmRpbmF0ZVN5c3RlbSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0ZVsgMCBdID0gMiAqIHc7XHR0ZVsgNCBdID0gMDtcdFx0dGVbIDggXSA9IDA7IFx0XHR0ZVsgMTIgXSA9IC0geDtcclxuXHRcdHRlWyAxIF0gPSAwOyBcdFx0dGVbIDUgXSA9IDIgKiBoO1x0dGVbIDkgXSA9IDA7IFx0XHR0ZVsgMTMgXSA9IC0geTtcclxuXHRcdHRlWyAyIF0gPSAwOyBcdFx0dGVbIDYgXSA9IDA7XHRcdHRlWyAxMCBdID0gekludjtcdHRlWyAxNCBdID0gLSB6O1xyXG5cdFx0dGVbIDMgXSA9IDA7IFx0XHR0ZVsgNyBdID0gMDtcdFx0dGVbIDExIF0gPSAwO1x0XHR0ZVsgMTUgXSA9IDE7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBtYXRyaXggaXMgZXF1YWwgd2l0aCB0aGUgZ2l2ZW4gb25lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRyaXg0fSBtYXRyaXggLSBUaGUgbWF0cml4IHRvIHRlc3QgZm9yIGVxdWFsaXR5LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyBtYXRyaXggaXMgZXF1YWwgd2l0aCB0aGUgZ2l2ZW4gb25lLlxyXG5cdCAqL1xyXG5cdGVxdWFscyggbWF0cml4ICkge1xyXG5cclxuXHRcdGNvbnN0IHRlID0gdGhpcy5lbGVtZW50cztcclxuXHRcdGNvbnN0IG1lID0gbWF0cml4LmVsZW1lbnRzO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDE2OyBpICsrICkge1xyXG5cclxuXHRcdFx0aWYgKCB0ZVsgaSBdICE9PSBtZVsgaSBdICkgcmV0dXJuIGZhbHNlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBlbGVtZW50cyBvZiB0aGUgbWF0cml4IGZyb20gdGhlIGdpdmVuIGFycmF5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBhcnJheSAtIFRoZSBtYXRyaXggZWxlbWVudHMgaW4gY29sdW1uLW1ham9yIG9yZGVyLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0PTBdIC0gSW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGFycmF5LlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdGZyb21BcnJheSggYXJyYXksIG9mZnNldCA9IDAgKSB7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgMTY7IGkgKysgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmVsZW1lbnRzWyBpIF0gPSBhcnJheVsgaSArIG9mZnNldCBdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBXcml0ZXMgdGhlIGVsZW1lbnRzIG9mIHRoaXMgbWF0cml4IHRvIHRoZSBnaXZlbiBhcnJheS4gSWYgbm8gYXJyYXkgaXMgcHJvdmlkZWQsXHJcblx0ICogdGhlIG1ldGhvZCByZXR1cm5zIGEgbmV3IGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBbYXJyYXk9W11dIC0gVGhlIHRhcmdldCBhcnJheSBob2xkaW5nIHRoZSBtYXRyaXggZWxlbWVudHMgaW4gY29sdW1uLW1ham9yIG9yZGVyLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0PTBdIC0gSW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGFycmF5LlxyXG5cdCAqIEByZXR1cm4ge0FycmF5PG51bWJlcj59IFRoZSBtYXRyaXggZWxlbWVudHMgaW4gY29sdW1uLW1ham9yIG9yZGVyLlxyXG5cdCAqL1xyXG5cdHRvQXJyYXkoIGFycmF5ID0gW10sIG9mZnNldCA9IDAgKSB7XHJcblxyXG5cdFx0Y29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzO1xyXG5cclxuXHRcdGFycmF5WyBvZmZzZXQgXSA9IHRlWyAwIF07XHJcblx0XHRhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGVbIDEgXTtcclxuXHRcdGFycmF5WyBvZmZzZXQgKyAyIF0gPSB0ZVsgMiBdO1xyXG5cdFx0YXJyYXlbIG9mZnNldCArIDMgXSA9IHRlWyAzIF07XHJcblxyXG5cdFx0YXJyYXlbIG9mZnNldCArIDQgXSA9IHRlWyA0IF07XHJcblx0XHRhcnJheVsgb2Zmc2V0ICsgNSBdID0gdGVbIDUgXTtcclxuXHRcdGFycmF5WyBvZmZzZXQgKyA2IF0gPSB0ZVsgNiBdO1xyXG5cdFx0YXJyYXlbIG9mZnNldCArIDcgXSA9IHRlWyA3IF07XHJcblxyXG5cdFx0YXJyYXlbIG9mZnNldCArIDggXSA9IHRlWyA4IF07XHJcblx0XHRhcnJheVsgb2Zmc2V0ICsgOSBdID0gdGVbIDkgXTtcclxuXHRcdGFycmF5WyBvZmZzZXQgKyAxMCBdID0gdGVbIDEwIF07XHJcblx0XHRhcnJheVsgb2Zmc2V0ICsgMTEgXSA9IHRlWyAxMSBdO1xyXG5cclxuXHRcdGFycmF5WyBvZmZzZXQgKyAxMiBdID0gdGVbIDEyIF07XHJcblx0XHRhcnJheVsgb2Zmc2V0ICsgMTMgXSA9IHRlWyAxMyBdO1xyXG5cdFx0YXJyYXlbIG9mZnNldCArIDE0IF0gPSB0ZVsgMTQgXTtcclxuXHRcdGFycmF5WyBvZmZzZXQgKyAxNSBdID0gdGVbIDE1IF07XHJcblxyXG5cdFx0cmV0dXJuIGFycmF5O1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5jb25zdCBfdjEgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF9tMSA9IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDQoKTtcclxuY29uc3QgX3plcm8gPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCAwLCAwLCAwICk7XHJcbmNvbnN0IF9vbmUgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCAxLCAxLCAxICk7XHJcbmNvbnN0IF94ID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfeSA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX3ogPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcblxyXG5leHBvcnQgeyBNYXRyaXg0IH07XHJcbiIsImltcG9ydCB7IFF1YXRlcm5pb24gfSBmcm9tICcuL1F1YXRlcm5pb24uanMnO1xyXG5pbXBvcnQgeyBNYXRyaXg0IH0gZnJvbSAnLi9NYXRyaXg0LmpzJztcclxuaW1wb3J0IHsgY2xhbXAgfSBmcm9tICcuL01hdGhVdGlscy5qcyc7XHJcblxyXG5jb25zdCBfbWF0cml4ID0gLypAX19QVVJFX18qLyBuZXcgTWF0cml4NCgpO1xyXG5jb25zdCBfcXVhdGVybmlvbiA9IC8qQF9fUFVSRV9fKi8gbmV3IFF1YXRlcm5pb24oKTtcclxuXHJcbi8qKlxyXG4gKiBBIGNsYXNzIHJlcHJlc2VudGluZyBFdWxlciBhbmdsZXMuXHJcbiAqXHJcbiAqIEV1bGVyIGFuZ2xlcyBkZXNjcmliZSBhIHJvdGF0aW9uYWwgdHJhbnNmb3JtYXRpb24gYnkgcm90YXRpbmcgYW4gb2JqZWN0IG9uXHJcbiAqIGl0cyB2YXJpb3VzIGF4ZXMgaW4gc3BlY2lmaWVkIGFtb3VudHMgcGVyIGF4aXMsIGFuZCBhIHNwZWNpZmllZCBheGlzXHJcbiAqIG9yZGVyLlxyXG4gKlxyXG4gKiBJdGVyYXRpbmcgdGhyb3VnaCBhbiBpbnN0YW5jZSB3aWxsIHlpZWxkIGl0cyBjb21wb25lbnRzICh4LCB5LCB6LFxyXG4gKiBvcmRlcikgaW4gdGhlIGNvcnJlc3BvbmRpbmcgb3JkZXIuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGEgPSBuZXcgVEhSRUUuRXVsZXIoIDAsIDEsIDEuNTcsICdYWVonICk7XHJcbiAqIGNvbnN0IGIgPSBuZXcgVEhSRUUuVmVjdG9yMyggMSwgMCwgMSApO1xyXG4gKiBiLmFwcGx5RXVsZXIoYSk7XHJcbiAqIGBgYFxyXG4gKi9cclxuY2xhc3MgRXVsZXIge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGV1bGVyIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt4PTBdIC0gVGhlIGFuZ2xlIG9mIHRoZSB4IGF4aXMgaW4gcmFkaWFucy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3k9MF0gLSBUaGUgYW5nbGUgb2YgdGhlIHkgYXhpcyBpbiByYWRpYW5zLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbej0wXSAtIFRoZSBhbmdsZSBvZiB0aGUgeiBheGlzIGluIHJhZGlhbnMuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtvcmRlcj1FdWxlci5ERUZBVUxUX09SREVSXSAtIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgb3JkZXIgdGhhdCB0aGUgcm90YXRpb25zIGFyZSBhcHBsaWVkLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCB4ID0gMCwgeSA9IDAsIHogPSAwLCBvcmRlciA9IEV1bGVyLkRFRkFVTFRfT1JERVIgKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzRXVsZXIgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMuX3ggPSB4O1xyXG5cdFx0dGhpcy5feSA9IHk7XHJcblx0XHR0aGlzLl96ID0gejtcclxuXHRcdHRoaXMuX29yZGVyID0gb3JkZXI7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGFuZ2xlIG9mIHRoZSB4IGF4aXMgaW4gcmFkaWFucy5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0ICogQGRlZmF1bHQgMFxyXG5cdCAqL1xyXG5cdGdldCB4KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl94O1xyXG5cclxuXHR9XHJcblxyXG5cdHNldCB4KCB2YWx1ZSApIHtcclxuXHJcblx0XHR0aGlzLl94ID0gdmFsdWU7XHJcblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGFuZ2xlIG9mIHRoZSB5IGF4aXMgaW4gcmFkaWFucy5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0ICogQGRlZmF1bHQgMFxyXG5cdCAqL1xyXG5cdGdldCB5KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl95O1xyXG5cclxuXHR9XHJcblxyXG5cdHNldCB5KCB2YWx1ZSApIHtcclxuXHJcblx0XHR0aGlzLl95ID0gdmFsdWU7XHJcblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGFuZ2xlIG9mIHRoZSB6IGF4aXMgaW4gcmFkaWFucy5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0ICogQGRlZmF1bHQgMFxyXG5cdCAqL1xyXG5cdGdldCB6KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl96O1xyXG5cclxuXHR9XHJcblxyXG5cdHNldCB6KCB2YWx1ZSApIHtcclxuXHJcblx0XHR0aGlzLl96ID0gdmFsdWU7XHJcblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBvcmRlciB0aGF0IHRoZSByb3RhdGlvbnMgYXJlIGFwcGxpZWQuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdCAqIEBkZWZhdWx0ICdYWVonXHJcblx0ICovXHJcblx0Z2V0IG9yZGVyKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9vcmRlcjtcclxuXHJcblx0fVxyXG5cclxuXHRzZXQgb3JkZXIoIHZhbHVlICkge1xyXG5cclxuXHRcdHRoaXMuX29yZGVyID0gdmFsdWU7XHJcblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgRXVsZXIgY29tcG9uZW50cy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGFuZ2xlIG9mIHRoZSB4IGF4aXMgaW4gcmFkaWFucy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSBhbmdsZSBvZiB0aGUgeSBheGlzIGluIHJhZGlhbnMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHogLSBUaGUgYW5nbGUgb2YgdGhlIHogYXhpcyBpbiByYWRpYW5zLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbb3JkZXJdIC0gQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBvcmRlciB0aGF0IHRoZSByb3RhdGlvbnMgYXJlIGFwcGxpZWQuXHJcblx0ICogQHJldHVybiB7RXVsZXJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgRXVsZXIgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0KCB4LCB5LCB6LCBvcmRlciA9IHRoaXMuX29yZGVyICkge1xyXG5cclxuXHRcdHRoaXMuX3ggPSB4O1xyXG5cdFx0dGhpcy5feSA9IHk7XHJcblx0XHR0aGlzLl96ID0gejtcclxuXHRcdHRoaXMuX29yZGVyID0gb3JkZXI7XHJcblxyXG5cdFx0dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBuZXcgRXVsZXIgaW5zdGFuY2Ugd2l0aCBjb3BpZWQgdmFsdWVzIGZyb20gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0V1bGVyfSBBIGNsb25lIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y2xvbmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLl94LCB0aGlzLl95LCB0aGlzLl96LCB0aGlzLl9vcmRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvcGllcyB0aGUgdmFsdWVzIG9mIHRoZSBnaXZlbiBFdWxlciBpbnN0YW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtFdWxlcn0gZXVsZXIgLSBUaGUgRXVsZXIgaW5zdGFuY2UgdG8gY29weS5cclxuXHQgKiBAcmV0dXJuIHtFdWxlcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBFdWxlciBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjb3B5KCBldWxlciApIHtcclxuXHJcblx0XHR0aGlzLl94ID0gZXVsZXIuX3g7XHJcblx0XHR0aGlzLl95ID0gZXVsZXIuX3k7XHJcblx0XHR0aGlzLl96ID0gZXVsZXIuX3o7XHJcblx0XHR0aGlzLl9vcmRlciA9IGV1bGVyLl9vcmRlcjtcclxuXHJcblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgYW5nbGVzIG9mIHRoaXMgRXVsZXIgaW5zdGFuY2UgZnJvbSBhIHB1cmUgcm90YXRpb24gbWF0cml4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRyaXg0fSBtIC0gQSA0eDQgbWF0cml4IG9mIHdoaWNoIHRoZSB1cHBlciAzeDMgb2YgbWF0cml4IGlzIGEgcHVyZSByb3RhdGlvbiBtYXRyaXggKGkuZS4gdW5zY2FsZWQpLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbb3JkZXJdIC0gQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBvcmRlciB0aGF0IHRoZSByb3RhdGlvbnMgYXJlIGFwcGxpZWQuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbdXBkYXRlPXRydWVdIC0gV2hldGhlciB0aGUgaW50ZXJuYWwgYG9uQ2hhbmdlYCBjYWxsYmFjayBzaG91bGQgYmUgZXhlY3V0ZWQgb3Igbm90LlxyXG5cdCAqIEByZXR1cm4ge0V1bGVyfSBBIHJlZmVyZW5jZSB0byB0aGlzIEV1bGVyIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldEZyb21Sb3RhdGlvbk1hdHJpeCggbSwgb3JkZXIgPSB0aGlzLl9vcmRlciwgdXBkYXRlID0gdHJ1ZSApIHtcclxuXHJcblx0XHRjb25zdCB0ZSA9IG0uZWxlbWVudHM7XHJcblx0XHRjb25zdCBtMTEgPSB0ZVsgMCBdLCBtMTIgPSB0ZVsgNCBdLCBtMTMgPSB0ZVsgOCBdO1xyXG5cdFx0Y29uc3QgbTIxID0gdGVbIDEgXSwgbTIyID0gdGVbIDUgXSwgbTIzID0gdGVbIDkgXTtcclxuXHRcdGNvbnN0IG0zMSA9IHRlWyAyIF0sIG0zMiA9IHRlWyA2IF0sIG0zMyA9IHRlWyAxMCBdO1xyXG5cclxuXHRcdHN3aXRjaCAoIG9yZGVyICkge1xyXG5cclxuXHRcdFx0Y2FzZSAnWFlaJzpcclxuXHJcblx0XHRcdFx0dGhpcy5feSA9IE1hdGguYXNpbiggY2xhbXAoIG0xMywgLSAxLCAxICkgKTtcclxuXHJcblx0XHRcdFx0aWYgKCBNYXRoLmFicyggbTEzICkgPCAwLjk5OTk5OTkgKSB7XHJcblxyXG5cdFx0XHRcdFx0dGhpcy5feCA9IE1hdGguYXRhbjIoIC0gbTIzLCBtMzMgKTtcclxuXHRcdFx0XHRcdHRoaXMuX3ogPSBNYXRoLmF0YW4yKCAtIG0xMiwgbTExICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0dGhpcy5feCA9IE1hdGguYXRhbjIoIG0zMiwgbTIyICk7XHJcblx0XHRcdFx0XHR0aGlzLl96ID0gMDtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgJ1lYWic6XHJcblxyXG5cdFx0XHRcdHRoaXMuX3ggPSBNYXRoLmFzaW4oIC0gY2xhbXAoIG0yMywgLSAxLCAxICkgKTtcclxuXHJcblx0XHRcdFx0aWYgKCBNYXRoLmFicyggbTIzICkgPCAwLjk5OTk5OTkgKSB7XHJcblxyXG5cdFx0XHRcdFx0dGhpcy5feSA9IE1hdGguYXRhbjIoIG0xMywgbTMzICk7XHJcblx0XHRcdFx0XHR0aGlzLl96ID0gTWF0aC5hdGFuMiggbTIxLCBtMjIgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHR0aGlzLl95ID0gTWF0aC5hdGFuMiggLSBtMzEsIG0xMSApO1xyXG5cdFx0XHRcdFx0dGhpcy5feiA9IDA7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlICdaWFknOlxyXG5cclxuXHRcdFx0XHR0aGlzLl94ID0gTWF0aC5hc2luKCBjbGFtcCggbTMyLCAtIDEsIDEgKSApO1xyXG5cclxuXHRcdFx0XHRpZiAoIE1hdGguYWJzKCBtMzIgKSA8IDAuOTk5OTk5OSApIHtcclxuXHJcblx0XHRcdFx0XHR0aGlzLl95ID0gTWF0aC5hdGFuMiggLSBtMzEsIG0zMyApO1xyXG5cdFx0XHRcdFx0dGhpcy5feiA9IE1hdGguYXRhbjIoIC0gbTEyLCBtMjIgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHR0aGlzLl95ID0gMDtcclxuXHRcdFx0XHRcdHRoaXMuX3ogPSBNYXRoLmF0YW4yKCBtMjEsIG0xMSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSAnWllYJzpcclxuXHJcblx0XHRcdFx0dGhpcy5feSA9IE1hdGguYXNpbiggLSBjbGFtcCggbTMxLCAtIDEsIDEgKSApO1xyXG5cclxuXHRcdFx0XHRpZiAoIE1hdGguYWJzKCBtMzEgKSA8IDAuOTk5OTk5OSApIHtcclxuXHJcblx0XHRcdFx0XHR0aGlzLl94ID0gTWF0aC5hdGFuMiggbTMyLCBtMzMgKTtcclxuXHRcdFx0XHRcdHRoaXMuX3ogPSBNYXRoLmF0YW4yKCBtMjEsIG0xMSApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdHRoaXMuX3ggPSAwO1xyXG5cdFx0XHRcdFx0dGhpcy5feiA9IE1hdGguYXRhbjIoIC0gbTEyLCBtMjIgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgJ1laWCc6XHJcblxyXG5cdFx0XHRcdHRoaXMuX3ogPSBNYXRoLmFzaW4oIGNsYW1wKCBtMjEsIC0gMSwgMSApICk7XHJcblxyXG5cdFx0XHRcdGlmICggTWF0aC5hYnMoIG0yMSApIDwgMC45OTk5OTk5ICkge1xyXG5cclxuXHRcdFx0XHRcdHRoaXMuX3ggPSBNYXRoLmF0YW4yKCAtIG0yMywgbTIyICk7XHJcblx0XHRcdFx0XHR0aGlzLl95ID0gTWF0aC5hdGFuMiggLSBtMzEsIG0xMSApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdHRoaXMuX3ggPSAwO1xyXG5cdFx0XHRcdFx0dGhpcy5feSA9IE1hdGguYXRhbjIoIG0xMywgbTMzICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlICdYWlknOlxyXG5cclxuXHRcdFx0XHR0aGlzLl96ID0gTWF0aC5hc2luKCAtIGNsYW1wKCBtMTIsIC0gMSwgMSApICk7XHJcblxyXG5cdFx0XHRcdGlmICggTWF0aC5hYnMoIG0xMiApIDwgMC45OTk5OTk5ICkge1xyXG5cclxuXHRcdFx0XHRcdHRoaXMuX3ggPSBNYXRoLmF0YW4yKCBtMzIsIG0yMiApO1xyXG5cdFx0XHRcdFx0dGhpcy5feSA9IE1hdGguYXRhbjIoIG0xMywgbTExICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0dGhpcy5feCA9IE1hdGguYXRhbjIoIC0gbTIzLCBtMzMgKTtcclxuXHRcdFx0XHRcdHRoaXMuX3kgPSAwO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0ZGVmYXVsdDpcclxuXHJcblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuRXVsZXI6IC5zZXRGcm9tUm90YXRpb25NYXRyaXgoKSBlbmNvdW50ZXJlZCBhbiB1bmtub3duIG9yZGVyOiAnICsgb3JkZXIgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5fb3JkZXIgPSBvcmRlcjtcclxuXHJcblx0XHRpZiAoIHVwZGF0ZSA9PT0gdHJ1ZSApIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBhbmdsZXMgb2YgdGhpcyBFdWxlciBpbnN0YW5jZSBmcm9tIGEgbm9ybWFsaXplZCBxdWF0ZXJuaW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtRdWF0ZXJuaW9ufSBxIC0gQSBub3JtYWxpemVkIFF1YXRlcm5pb24uXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtvcmRlcl0gLSBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIG9yZGVyIHRoYXQgdGhlIHJvdGF0aW9ucyBhcmUgYXBwbGllZC5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFt1cGRhdGU9dHJ1ZV0gLSBXaGV0aGVyIHRoZSBpbnRlcm5hbCBgb25DaGFuZ2VgIGNhbGxiYWNrIHNob3VsZCBiZSBleGVjdXRlZCBvciBub3QuXHJcblx0ICogQHJldHVybiB7RXVsZXJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgRXVsZXIgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0RnJvbVF1YXRlcm5pb24oIHEsIG9yZGVyLCB1cGRhdGUgKSB7XHJcblxyXG5cdFx0X21hdHJpeC5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbiggcSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnNldEZyb21Sb3RhdGlvbk1hdHJpeCggX21hdHJpeCwgb3JkZXIsIHVwZGF0ZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGFuZ2xlcyBvZiB0aGlzIEV1bGVyIGluc3RhbmNlIGZyb20gdGhlIGdpdmVuIHZlY3Rvci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdiAtIFRoZSB2ZWN0b3IuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtvcmRlcl0gLSBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIG9yZGVyIHRoYXQgdGhlIHJvdGF0aW9ucyBhcmUgYXBwbGllZC5cclxuXHQgKiBAcmV0dXJuIHtFdWxlcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBFdWxlciBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXRGcm9tVmVjdG9yMyggdiwgb3JkZXIgPSB0aGlzLl9vcmRlciApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5zZXQoIHYueCwgdi55LCB2LnosIG9yZGVyICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVzZXRzIHRoZSBldWxlciBhbmdsZSB3aXRoIGEgbmV3IG9yZGVyIGJ5IGNyZWF0aW5nIGEgcXVhdGVybmlvbiBmcm9tIHRoaXNcclxuXHQgKiBldWxlciBhbmdsZSBhbmQgdGhlbiBzZXR0aW5nIHRoaXMgZXVsZXIgYW5nbGUgd2l0aCB0aGUgcXVhdGVybmlvbiBhbmQgdGhlXHJcblx0ICogbmV3IG9yZGVyLlxyXG5cdCAqXHJcblx0ICogV2FybmluZzogVGhpcyBkaXNjYXJkcyByZXZvbHV0aW9uIGluZm9ybWF0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtuZXdPcmRlcl0gLSBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIG5ldyBvcmRlciB0aGF0IHRoZSByb3RhdGlvbnMgYXJlIGFwcGxpZWQuXHJcblx0ICogQHJldHVybiB7RXVsZXJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgRXVsZXIgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0cmVvcmRlciggbmV3T3JkZXIgKSB7XHJcblxyXG5cdFx0X3F1YXRlcm5pb24uc2V0RnJvbUV1bGVyKCB0aGlzICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuc2V0RnJvbVF1YXRlcm5pb24oIF9xdWF0ZXJuaW9uLCBuZXdPcmRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgRXVsZXIgaW5zdGFuY2UgaXMgZXF1YWwgd2l0aCB0aGUgZ2l2ZW4gb25lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtFdWxlcn0gZXVsZXIgLSBUaGUgRXVsZXIgaW5zdGFuY2UgdG8gdGVzdCBmb3IgZXF1YWxpdHkuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGlzIEV1bGVyIGluc3RhbmNlIGlzIGVxdWFsIHdpdGggdGhlIGdpdmVuIG9uZS5cclxuXHQgKi9cclxuXHRlcXVhbHMoIGV1bGVyICkge1xyXG5cclxuXHRcdHJldHVybiAoIGV1bGVyLl94ID09PSB0aGlzLl94ICkgJiYgKCBldWxlci5feSA9PT0gdGhpcy5feSApICYmICggZXVsZXIuX3ogPT09IHRoaXMuX3ogKSAmJiAoIGV1bGVyLl9vcmRlciA9PT0gdGhpcy5fb3JkZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoaXMgRXVsZXIgaW5zdGFuY2UncyBjb21wb25lbnRzIHRvIHZhbHVlcyBmcm9tIHRoZSBnaXZlbiBhcnJheS4gVGhlIGZpcnN0IHRocmVlXHJcblx0ICogZW50cmllcyBvZiB0aGUgYXJyYXkgYXJlIGFzc2lnbiB0byB0aGUgeCx5IGFuZCB6IGNvbXBvbmVudHMuIEFuIG9wdGlvbmFsIGZvdXJ0aCBlbnRyeVxyXG5cdCAqIGRlZmluZXMgdGhlIEV1bGVyIG9yZGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXIsbnVtYmVyLG51bWJlciw/c3RyaW5nPn0gYXJyYXkgLSBBbiBhcnJheSBob2xkaW5nIHRoZSBFdWxlciBjb21wb25lbnQgdmFsdWVzLlxyXG5cdCAqIEByZXR1cm4ge0V1bGVyfSBBIHJlZmVyZW5jZSB0byB0aGlzIEV1bGVyIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGZyb21BcnJheSggYXJyYXkgKSB7XHJcblxyXG5cdFx0dGhpcy5feCA9IGFycmF5WyAwIF07XHJcblx0XHR0aGlzLl95ID0gYXJyYXlbIDEgXTtcclxuXHRcdHRoaXMuX3ogPSBhcnJheVsgMiBdO1xyXG5cdFx0aWYgKCBhcnJheVsgMyBdICE9PSB1bmRlZmluZWQgKSB0aGlzLl9vcmRlciA9IGFycmF5WyAzIF07XHJcblxyXG5cdFx0dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdyaXRlcyB0aGUgY29tcG9uZW50cyBvZiB0aGlzIEV1bGVyIGluc3RhbmNlIHRvIHRoZSBnaXZlbiBhcnJheS4gSWYgbm8gYXJyYXkgaXMgcHJvdmlkZWQsXHJcblx0ICogdGhlIG1ldGhvZCByZXR1cm5zIGEgbmV3IGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXIsbnVtYmVyLG51bWJlcixzdHJpbmc+fSBbYXJyYXk9W11dIC0gVGhlIHRhcmdldCBhcnJheSBob2xkaW5nIHRoZSBFdWxlciBjb21wb25lbnRzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0PTBdIC0gSW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGFycmF5LlxyXG5cdCAqIEByZXR1cm4ge0FycmF5PG51bWJlcixudW1iZXIsbnVtYmVyLHN0cmluZz59IFRoZSBFdWxlciBjb21wb25lbnRzLlxyXG5cdCAqL1xyXG5cdHRvQXJyYXkoIGFycmF5ID0gW10sIG9mZnNldCA9IDAgKSB7XHJcblxyXG5cdFx0YXJyYXlbIG9mZnNldCBdID0gdGhpcy5feDtcclxuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLl95O1xyXG5cdFx0YXJyYXlbIG9mZnNldCArIDIgXSA9IHRoaXMuX3o7XHJcblx0XHRhcnJheVsgb2Zmc2V0ICsgMyBdID0gdGhpcy5fb3JkZXI7XHJcblxyXG5cdFx0cmV0dXJuIGFycmF5O1xyXG5cclxuXHR9XHJcblxyXG5cdF9vbkNoYW5nZSggY2FsbGJhY2sgKSB7XHJcblxyXG5cdFx0dGhpcy5fb25DaGFuZ2VDYWxsYmFjayA9IGNhbGxiYWNrO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdF9vbkNoYW5nZUNhbGxiYWNrKCkge31cclxuXHJcblx0KlsgU3ltYm9sLml0ZXJhdG9yIF0oKSB7XHJcblxyXG5cdFx0eWllbGQgdGhpcy5feDtcclxuXHRcdHlpZWxkIHRoaXMuX3k7XHJcblx0XHR5aWVsZCB0aGlzLl96O1xyXG5cdFx0eWllbGQgdGhpcy5fb3JkZXI7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUaGUgZGVmYXVsdCBFdWxlciBhbmdsZSBvcmRlci5cclxuICpcclxuICogQHN0YXRpY1xyXG4gKiBAdHlwZSB7c3RyaW5nfVxyXG4gKiBAZGVmYXVsdCAnWFlaJ1xyXG4gKi9cclxuRXVsZXIuREVGQVVMVF9PUkRFUiA9ICdYWVonO1xyXG5cclxuZXhwb3J0IHsgRXVsZXIgfTtcclxuIiwiLyoqXHJcbiAqIEEgbGF5ZXJzIG9iamVjdCBhc3NpZ25zIGFuIDNEIG9iamVjdCB0byAxIG9yIG1vcmUgb2YgMzJcclxuICogbGF5ZXJzIG51bWJlcmVkIGAwYCB0byBgMzFgIC0gaW50ZXJuYWxseSB0aGUgbGF5ZXJzIGFyZSBzdG9yZWQgYXMgYVxyXG4gKiBiaXQgbWFza10sIGFuZCBieSBkZWZhdWx0IGFsbCAzRCBvYmplY3RzIGFyZSBhIG1lbWJlciBvZiBsYXllciBgMGAuXHJcbiAqXHJcbiAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gY29udHJvbCB2aXNpYmlsaXR5IC0gYW4gb2JqZWN0IG11c3Qgc2hhcmUgYSBsYXllciB3aXRoXHJcbiAqIGEgY2FtZXJhIHRvIGJlIHZpc2libGUgd2hlbiB0aGF0IGNhbWVyYSdzIHZpZXcgaXNcclxuICogcmVuZGVyZWQuXHJcbiAqXHJcbiAqIEFsbCBjbGFzc2VzIHRoYXQgaW5oZXJpdCBmcm9tIHtAbGluayBPYmplY3QzRH0gaGF2ZSBhbiBgbGF5ZXJzYCBwcm9wZXJ0eSB3aGljaFxyXG4gKiBpcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLlxyXG4gKi9cclxuY2xhc3MgTGF5ZXJzIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBsYXllcnMgaW5zdGFuY2UsIHdpdGggbWVtYmVyc2hpcFxyXG5cdCAqIGluaXRpYWxseSBzZXQgdG8gbGF5ZXIgYDBgLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBiaXQgbWFzayBzdG9yaW5nIHdoaWNoIG9mIHRoZSAzMiBsYXllcnMgdGhpcyBsYXllcnMgb2JqZWN0IGlzIGN1cnJlbnRseVxyXG5cdFx0ICogYSBtZW1iZXIgb2YuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tYXNrID0gMSB8IDA7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyBtZW1iZXJzaGlwIHRvIHRoZSBnaXZlbiBsYXllciwgYW5kIHJlbW92ZSBtZW1iZXJzaGlwIGFsbCBvdGhlciBsYXllcnMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbGF5ZXIgLSBUaGUgbGF5ZXIgdG8gc2V0LlxyXG5cdCAqL1xyXG5cdHNldCggbGF5ZXIgKSB7XHJcblxyXG5cdFx0dGhpcy5tYXNrID0gKCAxIDw8IGxheWVyIHwgMCApID4+PiAwO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgbWVtYmVyc2hpcCBvZiB0aGUgZ2l2ZW4gbGF5ZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbGF5ZXIgLSBUaGUgbGF5ZXIgdG8gZW5hYmxlLlxyXG5cdCAqL1xyXG5cdGVuYWJsZSggbGF5ZXIgKSB7XHJcblxyXG5cdFx0dGhpcy5tYXNrIHw9IDEgPDwgbGF5ZXIgfCAwO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgbWVtYmVyc2hpcCB0byBhbGwgbGF5ZXJzLlxyXG5cdCAqL1xyXG5cdGVuYWJsZUFsbCgpIHtcclxuXHJcblx0XHR0aGlzLm1hc2sgPSAweGZmZmZmZmZmIHwgMDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUb2dnbGVzIHRoZSBtZW1iZXJzaGlwIG9mIHRoZSBnaXZlbiBsYXllci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBsYXllciAtIFRoZSBsYXllciB0byB0b2dnbGUuXHJcblx0ICovXHJcblx0dG9nZ2xlKCBsYXllciApIHtcclxuXHJcblx0XHR0aGlzLm1hc2sgXj0gMSA8PCBsYXllciB8IDA7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVtb3ZlcyBtZW1iZXJzaGlwIG9mIHRoZSBnaXZlbiBsYXllci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBsYXllciAtIFRoZSBsYXllciB0byBlbmFibGUuXHJcblx0ICovXHJcblx0ZGlzYWJsZSggbGF5ZXIgKSB7XHJcblxyXG5cdFx0dGhpcy5tYXNrICY9IH4gKCAxIDw8IGxheWVyIHwgMCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbW92ZXMgdGhlIG1lbWJlcnNoaXAgZnJvbSBhbGwgbGF5ZXJzLlxyXG5cdCAqL1xyXG5cdGRpc2FibGVBbGwoKSB7XHJcblxyXG5cdFx0dGhpcy5tYXNrID0gMDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIGFuZCB0aGUgZ2l2ZW4gbGF5ZXJzIG9iamVjdCBoYXZlIGF0IGxlYXN0IG9uZVxyXG5cdCAqIGxheWVyIGluIGNvbW1vbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TGF5ZXJzfSBsYXllcnMgLSBUaGUgbGF5ZXJzIHRvIHRlc3QuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbiB9IFdoZXRoZXIgdGhpcyBhbmQgdGhlIGdpdmVuIGxheWVycyBvYmplY3QgaGF2ZSBhdCBsZWFzdCBvbmUgbGF5ZXIgaW4gY29tbW9uIG9yIG5vdC5cclxuXHQgKi9cclxuXHR0ZXN0KCBsYXllcnMgKSB7XHJcblxyXG5cdFx0cmV0dXJuICggdGhpcy5tYXNrICYgbGF5ZXJzLm1hc2sgKSAhPT0gMDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gbGF5ZXIgaXMgZW5hYmxlZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBsYXllciAtIFRoZSBsYXllciB0byB0ZXN0LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW4gfSBXaGV0aGVyIHRoZSBnaXZlbiBsYXllciBpcyBlbmFibGVkIG9yIG5vdC5cclxuXHQgKi9cclxuXHRpc0VuYWJsZWQoIGxheWVyICkge1xyXG5cclxuXHRcdHJldHVybiAoIHRoaXMubWFzayAmICggMSA8PCBsYXllciB8IDAgKSApICE9PSAwO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgTGF5ZXJzIH07XHJcbiIsImltcG9ydCB7IFF1YXRlcm5pb24gfSBmcm9tICcuLi9tYXRoL1F1YXRlcm5pb24uanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuaW1wb3J0IHsgTWF0cml4NCB9IGZyb20gJy4uL21hdGgvTWF0cml4NC5qcyc7XHJcbmltcG9ydCB7IEV2ZW50RGlzcGF0Y2hlciB9IGZyb20gJy4vRXZlbnREaXNwYXRjaGVyLmpzJztcclxuaW1wb3J0IHsgRXVsZXIgfSBmcm9tICcuLi9tYXRoL0V1bGVyLmpzJztcclxuaW1wb3J0IHsgTGF5ZXJzIH0gZnJvbSAnLi9MYXllcnMuanMnO1xyXG5pbXBvcnQgeyBNYXRyaXgzIH0gZnJvbSAnLi4vbWF0aC9NYXRyaXgzLmpzJztcclxuaW1wb3J0IHsgZ2VuZXJhdGVVVUlEIH0gZnJvbSAnLi4vbWF0aC9NYXRoVXRpbHMuanMnO1xyXG5cclxubGV0IF9vYmplY3QzRElkID0gMDtcclxuXHJcbmNvbnN0IF92MSA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX3ExID0gLypAX19QVVJFX18qLyBuZXcgUXVhdGVybmlvbigpO1xyXG5jb25zdCBfbTEgPSAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXg0KCk7XHJcbmNvbnN0IF90YXJnZXQgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcblxyXG5jb25zdCBfcG9zaXRpb24gPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF9zY2FsZSA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX3F1YXRlcm5pb24gPSAvKkBfX1BVUkVfXyovIG5ldyBRdWF0ZXJuaW9uKCk7XHJcblxyXG5jb25zdCBfeEF4aXMgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCAxLCAwLCAwICk7XHJcbmNvbnN0IF95QXhpcyA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoIDAsIDEsIDAgKTtcclxuY29uc3QgX3pBeGlzID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMyggMCwgMCwgMSApO1xyXG5cclxuLyoqXHJcbiAqIEZpcmVzIHdoZW4gdGhlIG9iamVjdCBoYXMgYmVlbiBhZGRlZCB0byBpdHMgcGFyZW50IG9iamVjdC5cclxuICpcclxuICogQGV2ZW50IE9iamVjdDNEI2FkZGVkXHJcbiAqIEB0eXBlIHtPYmplY3R9XHJcbiAqL1xyXG5jb25zdCBfYWRkZWRFdmVudCA9IHsgdHlwZTogJ2FkZGVkJyB9O1xyXG5cclxuLyoqXHJcbiAqIEZpcmVzIHdoZW4gdGhlIG9iamVjdCBoYXMgYmVlbiByZW1vdmVkIGZyb20gaXRzIHBhcmVudCBvYmplY3QuXHJcbiAqXHJcbiAqIEBldmVudCBPYmplY3QzRCNyZW1vdmVkXHJcbiAqIEB0eXBlIHtPYmplY3R9XHJcbiAqL1xyXG5jb25zdCBfcmVtb3ZlZEV2ZW50ID0geyB0eXBlOiAncmVtb3ZlZCcgfTtcclxuXHJcbi8qKlxyXG4gKiBGaXJlcyB3aGVuIGEgbmV3IGNoaWxkIG9iamVjdCBoYXMgYmVlbiBhZGRlZC5cclxuICpcclxuICogQGV2ZW50IE9iamVjdDNEI2NoaWxkYWRkZWRcclxuICogQHR5cGUge09iamVjdH1cclxuICovXHJcbmNvbnN0IF9jaGlsZGFkZGVkRXZlbnQgPSB7IHR5cGU6ICdjaGlsZGFkZGVkJywgY2hpbGQ6IG51bGwgfTtcclxuXHJcbi8qKlxyXG4gKiBGaXJlcyB3aGVuIGEgbmV3IGNoaWxkIG9iamVjdCBoYXMgYmVlbiBhZGRlZC5cclxuICpcclxuICogQGV2ZW50IE9iamVjdDNEI2NoaWxkcmVtb3ZlZFxyXG4gKiBAdHlwZSB7T2JqZWN0fVxyXG4gKi9cclxuY29uc3QgX2NoaWxkcmVtb3ZlZEV2ZW50ID0geyB0eXBlOiAnY2hpbGRyZW1vdmVkJywgY2hpbGQ6IG51bGwgfTtcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGlzIHRoZSBiYXNlIGNsYXNzIGZvciBtb3N0IG9iamVjdHMgaW4gdGhyZWUuanMgYW5kIHByb3ZpZGVzIGEgc2V0IG9mXHJcbiAqIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMgZm9yIG1hbmlwdWxhdGluZyBvYmplY3RzIGluIDNEIHNwYWNlLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgRXZlbnREaXNwYXRjaGVyXHJcbiAqL1xyXG5jbGFzcyBPYmplY3QzRCBleHRlbmRzIEV2ZW50RGlzcGF0Y2hlciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgM0Qgb2JqZWN0LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzT2JqZWN0M0QgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIElEIG9mIHRoZSAzRCBvYmplY3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQG5hbWUgT2JqZWN0M0QjaWRcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqL1xyXG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCAnaWQnLCB7IHZhbHVlOiBfb2JqZWN0M0RJZCArKyB9ICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgVVVJRCBvZiB0aGUgM0Qgb2JqZWN0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51dWlkID0gZ2VuZXJhdGVVVUlEKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbmFtZSBvZiB0aGUgM0Qgb2JqZWN0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubmFtZSA9ICcnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHR5cGUgcHJvcGVydHkgaXMgdXNlZCBmb3IgZGV0ZWN0aW5nIHRoZSBvYmplY3QgdHlwZVxyXG5cdFx0ICogaW4gY29udGV4dCBvZiBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudHlwZSA9ICdPYmplY3QzRCc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZSB0byB0aGUgcGFyZW50IG9iamVjdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P09iamVjdDNEfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBhcmVudCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBhcnJheSBob2xkaW5nIHRoZSBjaGlsZCAzRCBvYmplY3RzIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PE9iamVjdDNEPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jaGlsZHJlbiA9IFtdO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyB0aGUgYHVwYCBkaXJlY3Rpb24gb2YgdGhlIDNEIG9iamVjdCB3aGljaCBpbmZsdWVuY2VzXHJcblx0XHQgKiB0aGUgb3JpZW50YXRpb24gdmlhIG1ldGhvZHMgbGlrZSB7QGxpbmsgT2JqZWN0M0QjbG9va0F0fS5cclxuXHRcdCAqXHJcblx0XHQgKiBUaGUgZGVmYXVsdCB2YWx1ZXMgZm9yIGFsbCAzRCBvYmplY3RzIGlzIGRlZmluZWQgYnkgYE9iamVjdDNELkRFRkFVTFRfVVBgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3IzfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVwID0gT2JqZWN0M0QuREVGQVVMVF9VUC5jbG9uZSgpO1xyXG5cclxuXHRcdGNvbnN0IHBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcclxuXHRcdGNvbnN0IHJvdGF0aW9uID0gbmV3IEV1bGVyKCk7XHJcblx0XHRjb25zdCBxdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTtcclxuXHRcdGNvbnN0IHNjYWxlID0gbmV3IFZlY3RvcjMoIDEsIDEsIDEgKTtcclxuXHJcblx0XHRmdW5jdGlvbiBvblJvdGF0aW9uQ2hhbmdlKCkge1xyXG5cclxuXHRcdFx0cXVhdGVybmlvbi5zZXRGcm9tRXVsZXIoIHJvdGF0aW9uLCBmYWxzZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiBvblF1YXRlcm5pb25DaGFuZ2UoKSB7XHJcblxyXG5cdFx0XHRyb3RhdGlvbi5zZXRGcm9tUXVhdGVybmlvbiggcXVhdGVybmlvbiwgdW5kZWZpbmVkLCBmYWxzZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyb3RhdGlvbi5fb25DaGFuZ2UoIG9uUm90YXRpb25DaGFuZ2UgKTtcclxuXHRcdHF1YXRlcm5pb24uX29uQ2hhbmdlKCBvblF1YXRlcm5pb25DaGFuZ2UgKTtcclxuXHJcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydGllcyggdGhpcywge1xyXG5cdFx0XHQvKipcclxuXHRcdFx0ICogUmVwcmVzZW50cyB0aGUgb2JqZWN0J3MgbG9jYWwgcG9zaXRpb24uXHJcblx0XHRcdCAqXHJcblx0XHRcdCAqIEBuYW1lIE9iamVjdDNEI3Bvc2l0aW9uXHJcblx0XHRcdCAqIEB0eXBlIHtWZWN0b3IzfVxyXG5cdFx0XHQgKiBAZGVmYXVsdCAoMCwwLDApXHJcblx0XHRcdCAqL1xyXG5cdFx0XHRwb3NpdGlvbjoge1xyXG5cdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcclxuXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxyXG5cdFx0XHRcdHZhbHVlOiBwb3NpdGlvblxyXG5cdFx0XHR9LFxyXG5cdFx0XHQvKipcclxuXHRcdFx0ICogUmVwcmVzZW50cyB0aGUgb2JqZWN0J3MgbG9jYWwgcm90YXRpb24gYXMgRXVsZXIgYW5nbGVzLCBpbiByYWRpYW5zLlxyXG5cdFx0XHQgKlxyXG5cdFx0XHQgKiBAbmFtZSBPYmplY3QzRCNyb3RhdGlvblxyXG5cdFx0XHQgKiBAdHlwZSB7RXVsZXJ9XHJcblx0XHRcdCAqIEBkZWZhdWx0ICgwLDAsMClcclxuXHRcdFx0ICovXHJcblx0XHRcdHJvdGF0aW9uOiB7XHJcblx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxyXG5cdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXHJcblx0XHRcdFx0dmFsdWU6IHJvdGF0aW9uXHJcblx0XHRcdH0sXHJcblx0XHRcdC8qKlxyXG5cdFx0XHQgKiBSZXByZXNlbnRzIHRoZSBvYmplY3QncyBsb2NhbCByb3RhdGlvbiBhcyBRdWF0ZXJuaW9ucy5cclxuXHRcdFx0ICpcclxuXHRcdFx0ICogQG5hbWUgT2JqZWN0M0QjcXVhdGVybmlvblxyXG5cdFx0XHQgKiBAdHlwZSB7UXVhdGVybmlvbn1cclxuXHRcdFx0ICovXHJcblx0XHRcdHF1YXRlcm5pb246IHtcclxuXHRcdFx0XHRjb25maWd1cmFibGU6IHRydWUsXHJcblx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcclxuXHRcdFx0XHR2YWx1ZTogcXVhdGVybmlvblxyXG5cdFx0XHR9LFxyXG5cdFx0XHQvKipcclxuXHRcdFx0ICogUmVwcmVzZW50cyB0aGUgb2JqZWN0J3MgbG9jYWwgc2NhbGUuXHJcblx0XHRcdCAqXHJcblx0XHRcdCAqIEBuYW1lIE9iamVjdDNEI3NjYWxlXHJcblx0XHRcdCAqIEB0eXBlIHtWZWN0b3IzfVxyXG5cdFx0XHQgKiBAZGVmYXVsdCAoMSwxLDEpXHJcblx0XHRcdCAqL1xyXG5cdFx0XHRzY2FsZToge1xyXG5cdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcclxuXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxyXG5cdFx0XHRcdHZhbHVlOiBzY2FsZVxyXG5cdFx0XHR9LFxyXG5cdFx0XHQvKipcclxuXHRcdFx0ICogUmVwcmVzZW50cyB0aGUgb2JqZWN0J3MgbW9kZWwtdmlldyBtYXRyaXguXHJcblx0XHRcdCAqXHJcblx0XHRcdCAqIEBuYW1lIE9iamVjdDNEI21vZGVsVmlld01hdHJpeFxyXG5cdFx0XHQgKiBAdHlwZSB7TWF0cml4NH1cclxuXHRcdFx0ICovXHJcblx0XHRcdG1vZGVsVmlld01hdHJpeDoge1xyXG5cdFx0XHRcdHZhbHVlOiBuZXcgTWF0cml4NCgpXHJcblx0XHRcdH0sXHJcblx0XHRcdC8qKlxyXG5cdFx0XHQgKiBSZXByZXNlbnRzIHRoZSBvYmplY3QncyBub3JtYWwgbWF0cml4LlxyXG5cdFx0XHQgKlxyXG5cdFx0XHQgKiBAbmFtZSBPYmplY3QzRCNub3JtYWxNYXRyaXhcclxuXHRcdFx0ICogQHR5cGUge01hdHJpeDN9XHJcblx0XHRcdCAqL1xyXG5cdFx0XHRub3JtYWxNYXRyaXg6IHtcclxuXHRcdFx0XHR2YWx1ZTogbmV3IE1hdHJpeDMoKVxyXG5cdFx0XHR9XHJcblx0XHR9ICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXByZXNlbnRzIHRoZSBvYmplY3QncyB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggaW4gbG9jYWwgc3BhY2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge01hdHJpeDR9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlcHJlc2VudHMgdGhlIG9iamVjdCdzIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBpbiB3b3JsZCBzcGFjZS5cclxuXHRcdCAqIElmIHRoZSAzRCBvYmplY3QgaGFzIG5vIHBhcmVudCwgdGhlbiBpdCdzIGlkZW50aWNhbCB0byB0aGUgbG9jYWwgdHJhbnNmb3JtYXRpb24gbWF0cml4XHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge01hdHJpeDR9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWF0cml4V29ybGQgPSBuZXcgTWF0cml4NCgpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hlbiBzZXQgdG8gYHRydWVgLCB0aGUgZW5naW5lIGF1dG9tYXRpY2FsbHkgY29tcHV0ZXMgdGhlIGxvY2FsIG1hdHJpeCBmcm9tIHBvc2l0aW9uLFxyXG5cdFx0ICogcm90YXRpb24gYW5kIHNjYWxlIGV2ZXJ5IGZyYW1lLlxyXG5cdFx0ICpcclxuXHRcdCAqIFRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgYWxsIDNEIG9iamVjdHMgaXMgZGVmaW5lZCBieSBgT2JqZWN0M0QuREVGQVVMVF9NQVRSSVhfQVVUT19VUERBVEVgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBPYmplY3QzRC5ERUZBVUxUX01BVFJJWF9BVVRPX1VQREFURTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZW4gc2V0IHRvIGB0cnVlYCwgdGhlIGVuZ2luZSBhdXRvbWF0aWNhbGx5IGNvbXB1dGVzIHRoZSB3b3JsZCBtYXRyaXggZnJvbSB0aGUgY3VycmVudCBsb2NhbFxyXG5cdFx0ICogbWF0cml4IGFuZCB0aGUgb2JqZWN0J3MgdHJhbnNmb3JtYXRpb24gaGllcmFyY2h5LlxyXG5cdFx0ICpcclxuXHRcdCAqIFRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgYWxsIDNEIG9iamVjdHMgaXMgZGVmaW5lZCBieSBgT2JqZWN0M0QuREVGQVVMVF9NQVRSSVhfV09STERfQVVUT19VUERBVEVgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1hdHJpeFdvcmxkQXV0b1VwZGF0ZSA9IE9iamVjdDNELkRFRkFVTFRfTUFUUklYX1dPUkxEX0FVVE9fVVBEQVRFOyAvLyBjaGVja2VkIGJ5IHRoZSByZW5kZXJlclxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hlbiBzZXQgdG8gYHRydWVgLCBpdCBjYWxjdWxhdGVzIHRoZSB3b3JsZCBtYXRyaXggaW4gdGhhdCBmcmFtZSBhbmQgcmVzZXRzIHRoaXMgcHJvcGVydHlcclxuXHRcdCAqIHRvIGBmYWxzZWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBsYXllciBtZW1iZXJzaGlwIG9mIHRoZSAzRCBvYmplY3QuIFRoZSAzRCBvYmplY3QgaXMgb25seSB2aXNpYmxlIGlmIGl0IGhhc1xyXG5cdFx0ICogYXQgbGVhc3Qgb25lIGxheWVyIGluIGNvbW1vbiB3aXRoIHRoZSBjYW1lcmEgaW4gdXNlLiBUaGlzIHByb3BlcnR5IGNhbiBhbHNvIGJlXHJcblx0XHQgKiB1c2VkIHRvIGZpbHRlciBvdXQgdW53YW50ZWQgb2JqZWN0cyBpbiByYXktaW50ZXJzZWN0aW9uIHRlc3RzIHdoZW4gdXNpbmcge0BsaW5rIFJheWNhc3Rlcn0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0xheWVyc31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5sYXllcnMgPSBuZXcgTGF5ZXJzKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGVuIHNldCB0byBgdHJ1ZWAsIHRoZSAzRCBvYmplY3QgZ2V0cyByZW5kZXJlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52aXNpYmxlID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZW4gc2V0IHRvIGB0cnVlYCwgdGhlIDNEIG9iamVjdCBnZXRzIHJlbmRlcmVkIGludG8gc2hhZG93IG1hcHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNhc3RTaGFkb3cgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZW4gc2V0IHRvIGB0cnVlYCwgdGhlIDNEIG9iamVjdCBpcyBhZmZlY3RlZCBieSBzaGFkb3dzIGluIHRoZSBzY2VuZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVjZWl2ZVNoYWRvdyA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hlbiBzZXQgdG8gYHRydWVgLCB0aGUgM0Qgb2JqZWN0IGlzIGhvbm9yZWQgYnkgdmlldyBmcnVzdHVtIGN1bGxpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZnJ1c3R1bUN1bGxlZCA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIHZhbHVlIGFsbG93cyB0aGUgZGVmYXVsdCByZW5kZXJpbmcgb3JkZXIgb2Ygc2NlbmUgZ3JhcGggb2JqZWN0cyB0byBiZVxyXG5cdFx0ICogb3ZlcnJpZGRlbiBhbHRob3VnaCBvcGFxdWUgYW5kIHRyYW5zcGFyZW50IG9iamVjdHMgcmVtYWluIHNvcnRlZCBpbmRlcGVuZGVudGx5LlxyXG5cdFx0ICogV2hlbiB0aGlzIHByb3BlcnR5IGlzIHNldCBmb3IgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEdyb3VwfSxhbGwgZGVzY2VuZGFudHNcclxuXHRcdCAqIG9iamVjdHMgd2lsbCBiZSBzb3J0ZWQgYW5kIHJlbmRlcmVkIHRvZ2V0aGVyLiBTb3J0aW5nIGlzIGZyb20gbG93ZXN0IHRvIGhpZ2hlc3RcclxuXHRcdCAqIHJlbmRlciBvcmRlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJlbmRlck9yZGVyID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIGFycmF5IGhvbGRpbmcgdGhlIGFuaW1hdGlvbiBjbGlwcyBvZiB0aGUgM0Qgb2JqZWN0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxBbmltYXRpb25DbGlwPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hbmltYXRpb25zID0gW107XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDdXN0b20gZGVwdGggbWF0ZXJpYWwgdG8gYmUgdXNlZCB3aGVuIHJlbmRlcmluZyB0byB0aGUgZGVwdGggbWFwLiBDYW4gb25seSBiZSB1c2VkXHJcblx0XHQgKiBpbiBjb250ZXh0IG9mIG1lc2hlcy4gV2hlbiBzaGFkb3ctY2FzdGluZyB3aXRoIGEge0BsaW5rIERpcmVjdGlvbmFsTGlnaHR9IG9yIHtAbGluayBTcG90TGlnaHR9LFxyXG5cdFx0ICogaWYgeW91IGFyZSBtb2RpZnlpbmcgdmVydGV4IHBvc2l0aW9ucyBpbiB0aGUgdmVydGV4IHNoYWRlciB5b3UgbXVzdCBzcGVjaWZ5IGEgY3VzdG9tIGRlcHRoXHJcblx0XHQgKiBtYXRlcmlhbCBmb3IgcHJvcGVyIHNoYWRvd3MuXHJcblx0XHQgKlxyXG5cdFx0ICogT25seSByZWxldmFudCBpbiBjb250ZXh0IG9mIHtAbGluayBXZWJHTFJlbmRlcmVyfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KE1hdGVyaWFsfHVuZGVmaW5lZCl9XHJcblx0XHQgKiBAZGVmYXVsdCB1bmRlZmluZWRcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jdXN0b21EZXB0aE1hdGVyaWFsID0gdW5kZWZpbmVkO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU2FtZSBhcyB7QGxpbmsgT2JqZWN0M0QjY3VzdG9tRGVwdGhNYXRlcmlhbH0sIGJ1dCB1c2VkIHdpdGgge0BsaW5rIFBvaW50TGlnaHR9LlxyXG5cdFx0ICpcclxuXHRcdCAqIE9ubHkgcmVsZXZhbnQgaW4gY29udGV4dCBvZiB7QGxpbmsgV2ViR0xSZW5kZXJlcn0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeyhNYXRlcmlhbHx1bmRlZmluZWQpfVxyXG5cdFx0ICogQGRlZmF1bHQgdW5kZWZpbmVkXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY3VzdG9tRGlzdGFuY2VNYXRlcmlhbCA9IHVuZGVmaW5lZDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIHN0b3JlIGN1c3RvbSBkYXRhIGFib3V0IHRoZSAzRCBvYmplY3QuIEl0XHJcblx0XHQgKiBzaG91bGQgbm90IGhvbGQgcmVmZXJlbmNlcyB0byBmdW5jdGlvbnMgYXMgdGhlc2Ugd2lsbCBub3QgYmUgY2xvbmVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXNlckRhdGEgPSB7fTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBIGNhbGxiYWNrIHRoYXQgaXMgZXhlY3V0ZWQgaW1tZWRpYXRlbHkgYmVmb3JlIGEgM0Qgb2JqZWN0IGlzIHJlbmRlcmVkIHRvIGEgc2hhZG93IG1hcC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyZXJ8V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcblx0ICogQHBhcmFtIHtPYmplY3QzRH0gb2JqZWN0IC0gVGhlIDNEIG9iamVjdC5cclxuXHQgKiBAcGFyYW0ge0NhbWVyYX0gY2FtZXJhIC0gVGhlIGNhbWVyYSB0aGF0IGlzIHVzZWQgdG8gcmVuZGVyIHRoZSBzY2VuZS5cclxuXHQgKiBAcGFyYW0ge0NhbWVyYX0gc2hhZG93Q2FtZXJhIC0gVGhlIHNoYWRvdyBjYW1lcmEuXHJcblx0ICogQHBhcmFtIHtCdWZmZXJHZW9tZXRyeX0gZ2VvbWV0cnkgLSBUaGUgM0Qgb2JqZWN0J3MgZ2VvbWV0cnkuXHJcblx0ICogQHBhcmFtIHtNYXRlcmlhbH0gZGVwdGhNYXRlcmlhbCAtIFRoZSBkZXB0aCBtYXRlcmlhbC5cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gZ3JvdXAgLSBUaGUgZ2VvbWV0cnkgZ3JvdXAgZGF0YS5cclxuXHQgKi9cclxuXHRvbkJlZm9yZVNoYWRvdyggLyogcmVuZGVyZXIsIG9iamVjdCwgY2FtZXJhLCBzaGFkb3dDYW1lcmEsIGdlb21ldHJ5LCBkZXB0aE1hdGVyaWFsLCBncm91cCAqLyApIHt9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEEgY2FsbGJhY2sgdGhhdCBpcyBleGVjdXRlZCBpbW1lZGlhdGVseSBhZnRlciBhIDNEIG9iamVjdCBpcyByZW5kZXJlZCB0byBhIHNoYWRvdyBtYXAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JlbmRlcmVyfFdlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0M0R9IG9iamVjdCAtIFRoZSAzRCBvYmplY3QuXHJcblx0ICogQHBhcmFtIHtDYW1lcmF9IGNhbWVyYSAtIFRoZSBjYW1lcmEgdGhhdCBpcyB1c2VkIHRvIHJlbmRlciB0aGUgc2NlbmUuXHJcblx0ICogQHBhcmFtIHtDYW1lcmF9IHNoYWRvd0NhbWVyYSAtIFRoZSBzaGFkb3cgY2FtZXJhLlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyR2VvbWV0cnl9IGdlb21ldHJ5IC0gVGhlIDNEIG9iamVjdCdzIGdlb21ldHJ5LlxyXG5cdCAqIEBwYXJhbSB7TWF0ZXJpYWx9IGRlcHRoTWF0ZXJpYWwgLSBUaGUgZGVwdGggbWF0ZXJpYWwuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGdyb3VwIC0gVGhlIGdlb21ldHJ5IGdyb3VwIGRhdGEuXHJcblx0ICovXHJcblx0b25BZnRlclNoYWRvdyggLyogcmVuZGVyZXIsIG9iamVjdCwgY2FtZXJhLCBzaGFkb3dDYW1lcmEsIGdlb21ldHJ5LCBkZXB0aE1hdGVyaWFsLCBncm91cCAqLyApIHt9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEEgY2FsbGJhY2sgdGhhdCBpcyBleGVjdXRlZCBpbW1lZGlhdGVseSBiZWZvcmUgYSAzRCBvYmplY3QgaXMgcmVuZGVyZWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JlbmRlcmVyfFdlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0M0R9IG9iamVjdCAtIFRoZSAzRCBvYmplY3QuXHJcblx0ICogQHBhcmFtIHtDYW1lcmF9IGNhbWVyYSAtIFRoZSBjYW1lcmEgdGhhdCBpcyB1c2VkIHRvIHJlbmRlciB0aGUgc2NlbmUuXHJcblx0ICogQHBhcmFtIHtCdWZmZXJHZW9tZXRyeX0gZ2VvbWV0cnkgLSBUaGUgM0Qgb2JqZWN0J3MgZ2VvbWV0cnkuXHJcblx0ICogQHBhcmFtIHtNYXRlcmlhbH0gbWF0ZXJpYWwgLSBUaGUgM0Qgb2JqZWN0J3MgbWF0ZXJpYWwuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGdyb3VwIC0gVGhlIGdlb21ldHJ5IGdyb3VwIGRhdGEuXHJcblx0ICovXHJcblx0b25CZWZvcmVSZW5kZXIoIC8qIHJlbmRlcmVyLCBzY2VuZSwgY2FtZXJhLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwICovICkge31cclxuXHJcblx0LyoqXHJcblx0ICogQSBjYWxsYmFjayB0aGF0IGlzIGV4ZWN1dGVkIGltbWVkaWF0ZWx5IGFmdGVyIGEgM0Qgb2JqZWN0IGlzIHJlbmRlcmVkLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSZW5kZXJlcnxXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcGFyYW0ge09iamVjdDNEfSBvYmplY3QgLSBUaGUgM0Qgb2JqZWN0LlxyXG5cdCAqIEBwYXJhbSB7Q2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIHRoYXQgaXMgdXNlZCB0byByZW5kZXIgdGhlIHNjZW5lLlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyR2VvbWV0cnl9IGdlb21ldHJ5IC0gVGhlIDNEIG9iamVjdCdzIGdlb21ldHJ5LlxyXG5cdCAqIEBwYXJhbSB7TWF0ZXJpYWx9IG1hdGVyaWFsIC0gVGhlIDNEIG9iamVjdCdzIG1hdGVyaWFsLlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBncm91cCAtIFRoZSBnZW9tZXRyeSBncm91cCBkYXRhLlxyXG5cdCAqL1xyXG5cdG9uQWZ0ZXJSZW5kZXIoIC8qIHJlbmRlcmVyLCBzY2VuZSwgY2FtZXJhLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwICovICkge31cclxuXHJcblx0LyoqXHJcblx0ICogQXBwbGllcyB0aGUgZ2l2ZW4gdHJhbnNmb3JtYXRpb24gbWF0cml4IHRvIHRoZSBvYmplY3QgYW5kIHVwZGF0ZXMgdGhlIG9iamVjdCdzIHBvc2l0aW9uLFxyXG5cdCAqIHJvdGF0aW9uIGFuZCBzY2FsZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4NH0gbWF0cml4IC0gVGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC5cclxuXHQgKi9cclxuXHRhcHBseU1hdHJpeDQoIG1hdHJpeCApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMubWF0cml4QXV0b1VwZGF0ZSApIHRoaXMudXBkYXRlTWF0cml4KCk7XHJcblxyXG5cdFx0dGhpcy5tYXRyaXgucHJlbXVsdGlwbHkoIG1hdHJpeCApO1xyXG5cclxuXHRcdHRoaXMubWF0cml4LmRlY29tcG9zZSggdGhpcy5wb3NpdGlvbiwgdGhpcy5xdWF0ZXJuaW9uLCB0aGlzLnNjYWxlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQXBwbGllcyBhIHJvdGF0aW9uIHJlcHJlc2VudGVkIGJ5IGdpdmVuIHRoZSBxdWF0ZXJuaW9uIHRvIHRoZSAzRCBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1F1YXRlcm5pb259IHEgLSBUaGUgcXVhdGVybmlvbi5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3QzRH0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRhcHBseVF1YXRlcm5pb24oIHEgKSB7XHJcblxyXG5cdFx0dGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KCBxICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZ2l2ZW4gcm90YXRpb24gcmVwcmVzZW50ZWQgYXMgYW4gYXhpcy9hbmdsZSBjb3VwbGUgdG8gdGhlIDNEIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gYXhpcyAtIFRoZSAobm9ybWFsaXplZCkgYXhpcyB2ZWN0b3IuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFuZ2xlIC0gVGhlIGFuZ2xlIGluIHJhZGlhbnMuXHJcblx0ICovXHJcblx0c2V0Um90YXRpb25Gcm9tQXhpc0FuZ2xlKCBheGlzLCBhbmdsZSApIHtcclxuXHJcblx0XHQvLyBhc3N1bWVzIGF4aXMgaXMgbm9ybWFsaXplZFxyXG5cclxuXHRcdHRoaXMucXVhdGVybmlvbi5zZXRGcm9tQXhpc0FuZ2xlKCBheGlzLCBhbmdsZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGdpdmVuIHJvdGF0aW9uIHJlcHJlc2VudGVkIGFzIEV1bGVyIGFuZ2xlcyB0byB0aGUgM0Qgb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtFdWxlcn0gZXVsZXIgLSBUaGUgRXVsZXIgYW5nbGVzLlxyXG5cdCAqL1xyXG5cdHNldFJvdGF0aW9uRnJvbUV1bGVyKCBldWxlciApIHtcclxuXHJcblx0XHR0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUV1bGVyKCBldWxlciwgdHJ1ZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGdpdmVuIHJvdGF0aW9uIHJlcHJlc2VudGVkIGFzIHJvdGF0aW9uIG1hdHJpeCB0byB0aGUgM0Qgb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRyaXg0fSBtIC0gQWx0aG91Z2ggYSA0eDQgbWF0cml4IGlzIGV4cGVjdGVkLCB0aGUgdXBwZXIgM3gzIHBvcnRpb24gbXVzdCBiZVxyXG5cdCAqIGEgcHVyZSByb3RhdGlvbiBtYXRyaXggKGkuZSwgdW5zY2FsZWQpLlxyXG5cdCAqL1xyXG5cdHNldFJvdGF0aW9uRnJvbU1hdHJpeCggbSApIHtcclxuXHJcblx0XHQvLyBhc3N1bWVzIHRoZSB1cHBlciAzeDMgb2YgbSBpcyBhIHB1cmUgcm90YXRpb24gbWF0cml4IChpLmUsIHVuc2NhbGVkKVxyXG5cclxuXHRcdHRoaXMucXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgoIG0gKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBnaXZlbiByb3RhdGlvbiByZXByZXNlbnRlZCBhcyBhIFF1YXRlcm5pb24gdG8gdGhlIDNEIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UXVhdGVybmlvbn0gcSAtIFRoZSBRdWF0ZXJuaW9uXHJcblx0ICovXHJcblx0c2V0Um90YXRpb25Gcm9tUXVhdGVybmlvbiggcSApIHtcclxuXHJcblx0XHQvLyBhc3N1bWVzIHEgaXMgbm9ybWFsaXplZFxyXG5cclxuXHRcdHRoaXMucXVhdGVybmlvbi5jb3B5KCBxICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUm90YXRlcyB0aGUgM0Qgb2JqZWN0IGFsb25nIGFuIGF4aXMgaW4gbG9jYWwgc3BhY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IGF4aXMgLSBUaGUgKG5vcm1hbGl6ZWQpIGF4aXMgdmVjdG9yLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhbmdsZSAtIFRoZSBhbmdsZSBpbiByYWRpYW5zLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdDNEfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHJvdGF0ZU9uQXhpcyggYXhpcywgYW5nbGUgKSB7XHJcblxyXG5cdFx0Ly8gcm90YXRlIG9iamVjdCBvbiBheGlzIGluIG9iamVjdCBzcGFjZVxyXG5cdFx0Ly8gYXhpcyBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWRcclxuXHJcblx0XHRfcTEuc2V0RnJvbUF4aXNBbmdsZSggYXhpcywgYW5nbGUgKTtcclxuXHJcblx0XHR0aGlzLnF1YXRlcm5pb24ubXVsdGlwbHkoIF9xMSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJvdGF0ZXMgdGhlIDNEIG9iamVjdCBhbG9uZyBhbiBheGlzIGluIHdvcmxkIHNwYWNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBheGlzIC0gVGhlIChub3JtYWxpemVkKSBheGlzIHZlY3Rvci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYW5nbGUgLSBUaGUgYW5nbGUgaW4gcmFkaWFucy5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3QzRH0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRyb3RhdGVPbldvcmxkQXhpcyggYXhpcywgYW5nbGUgKSB7XHJcblxyXG5cdFx0Ly8gcm90YXRlIG9iamVjdCBvbiBheGlzIGluIHdvcmxkIHNwYWNlXHJcblx0XHQvLyBheGlzIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZFxyXG5cdFx0Ly8gbWV0aG9kIGFzc3VtZXMgbm8gcm90YXRlZCBwYXJlbnRcclxuXHJcblx0XHRfcTEuc2V0RnJvbUF4aXNBbmdsZSggYXhpcywgYW5nbGUgKTtcclxuXHJcblx0XHR0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkoIF9xMSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJvdGF0ZXMgdGhlIDNEIG9iamVjdCBhcm91bmQgaXRzIFggYXhpcyBpbiBsb2NhbCBzcGFjZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhbmdsZSAtIFRoZSBhbmdsZSBpbiByYWRpYW5zLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdDNEfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHJvdGF0ZVgoIGFuZ2xlICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyggX3hBeGlzLCBhbmdsZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJvdGF0ZXMgdGhlIDNEIG9iamVjdCBhcm91bmQgaXRzIFkgYXhpcyBpbiBsb2NhbCBzcGFjZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhbmdsZSAtIFRoZSBhbmdsZSBpbiByYWRpYW5zLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdDNEfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHJvdGF0ZVkoIGFuZ2xlICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyggX3lBeGlzLCBhbmdsZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJvdGF0ZXMgdGhlIDNEIG9iamVjdCBhcm91bmQgaXRzIFogYXhpcyBpbiBsb2NhbCBzcGFjZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhbmdsZSAtIFRoZSBhbmdsZSBpbiByYWRpYW5zLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdDNEfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHJvdGF0ZVooIGFuZ2xlICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyggX3pBeGlzLCBhbmdsZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRyYW5zbGF0ZSB0aGUgM0Qgb2JqZWN0IGJ5IGEgZGlzdGFuY2UgYWxvbmcgdGhlIGdpdmVuIGF4aXMgaW4gbG9jYWwgc3BhY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IGF4aXMgLSBUaGUgKG5vcm1hbGl6ZWQpIGF4aXMgdmVjdG9yLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBkaXN0YW5jZSAtIFRoZSBkaXN0YW5jZSBpbiB3b3JsZCB1bml0cy5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3QzRH0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHR0cmFuc2xhdGVPbkF4aXMoIGF4aXMsIGRpc3RhbmNlICkge1xyXG5cclxuXHRcdC8vIHRyYW5zbGF0ZSBvYmplY3QgYnkgZGlzdGFuY2UgYWxvbmcgYXhpcyBpbiBvYmplY3Qgc3BhY2VcclxuXHRcdC8vIGF4aXMgaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkXHJcblxyXG5cdFx0X3YxLmNvcHkoIGF4aXMgKS5hcHBseVF1YXRlcm5pb24oIHRoaXMucXVhdGVybmlvbiApO1xyXG5cclxuXHRcdHRoaXMucG9zaXRpb24uYWRkKCBfdjEubXVsdGlwbHlTY2FsYXIoIGRpc3RhbmNlICkgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUcmFuc2xhdGUgdGhlIDNEIG9iamVjdCBieSBhIGRpc3RhbmNlIGFsb25nIGl0cyBYLWF4aXMgaW4gbG9jYWwgc3BhY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZGlzdGFuY2UgLSBUaGUgZGlzdGFuY2UgaW4gd29ybGQgdW5pdHMuXHJcblx0ICogQHJldHVybiB7T2JqZWN0M0R9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0dHJhbnNsYXRlWCggZGlzdGFuY2UgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKCBfeEF4aXMsIGRpc3RhbmNlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVHJhbnNsYXRlIHRoZSAzRCBvYmplY3QgYnkgYSBkaXN0YW5jZSBhbG9uZyBpdHMgWS1heGlzIGluIGxvY2FsIHNwYWNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGRpc3RhbmNlIC0gVGhlIGRpc3RhbmNlIGluIHdvcmxkIHVuaXRzLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdDNEfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHRyYW5zbGF0ZVkoIGRpc3RhbmNlICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyggX3lBeGlzLCBkaXN0YW5jZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRyYW5zbGF0ZSB0aGUgM0Qgb2JqZWN0IGJ5IGEgZGlzdGFuY2UgYWxvbmcgaXRzIFotYXhpcyBpbiBsb2NhbCBzcGFjZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBkaXN0YW5jZSAtIFRoZSBkaXN0YW5jZSBpbiB3b3JsZCB1bml0cy5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3QzRH0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHR0cmFuc2xhdGVaKCBkaXN0YW5jZSApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMoIF96QXhpcywgZGlzdGFuY2UgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gdmVjdG9yIGZyb20gdGhpcyAzRCBvYmplY3QncyBsb2NhbCBzcGFjZSB0byB3b3JsZCBzcGFjZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdmVjdG9yIC0gVGhlIHZlY3RvciB0byBjb252ZXJ0LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IFRoZSBjb252ZXJ0ZWQgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGxvY2FsVG9Xb3JsZCggdmVjdG9yICkge1xyXG5cclxuXHRcdHRoaXMudXBkYXRlV29ybGRNYXRyaXgoIHRydWUsIGZhbHNlICk7XHJcblxyXG5cdFx0cmV0dXJuIHZlY3Rvci5hcHBseU1hdHJpeDQoIHRoaXMubWF0cml4V29ybGQgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gdmVjdG9yIGZyb20gdGhpcyAzRCBvYmplY3QncyB3b3JkIHNwYWNlIHRvIGxvY2FsIHNwYWNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB2ZWN0b3IgLSBUaGUgdmVjdG9yIHRvIGNvbnZlcnQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gVGhlIGNvbnZlcnRlZCB2ZWN0b3IuXHJcblx0ICovXHJcblx0d29ybGRUb0xvY2FsKCB2ZWN0b3IgKSB7XHJcblxyXG5cdFx0dGhpcy51cGRhdGVXb3JsZE1hdHJpeCggdHJ1ZSwgZmFsc2UgKTtcclxuXHJcblx0XHRyZXR1cm4gdmVjdG9yLmFwcGx5TWF0cml4NCggX20xLmNvcHkoIHRoaXMubWF0cml4V29ybGQgKS5pbnZlcnQoKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJvdGF0ZXMgdGhlIG9iamVjdCB0byBmYWNlIGEgcG9pbnQgaW4gd29ybGQgc3BhY2UuXHJcblx0ICpcclxuXHQgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBzdXBwb3J0IG9iamVjdHMgaGF2aW5nIG5vbi11bmlmb3JtbHktc2NhbGVkIHBhcmVudChzKS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfFZlY3RvcjN9IHggLSBUaGUgeCBjb29yZGluYXRlIGluIHdvcmxkIHNwYWNlLiBBbHRlcm5hdGl2ZWx5LCBhIHZlY3RvciByZXByZXNlbnRpbmcgYSBwb3NpdGlvbiBpbiB3b3JsZCBzcGFjZVxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbeV0gLSBUaGUgeSBjb29yZGluYXRlIGluIHdvcmxkIHNwYWNlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbel0gLSBUaGUgeiBjb29yZGluYXRlIGluIHdvcmxkIHNwYWNlLlxyXG5cdCAqL1xyXG5cdGxvb2tBdCggeCwgeSwgeiApIHtcclxuXHJcblx0XHQvLyBUaGlzIG1ldGhvZCBkb2VzIG5vdCBzdXBwb3J0IG9iamVjdHMgaGF2aW5nIG5vbi11bmlmb3JtbHktc2NhbGVkIHBhcmVudChzKVxyXG5cclxuXHRcdGlmICggeC5pc1ZlY3RvcjMgKSB7XHJcblxyXG5cdFx0XHRfdGFyZ2V0LmNvcHkoIHggKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0X3RhcmdldC5zZXQoIHgsIHksIHogKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgcGFyZW50ID0gdGhpcy5wYXJlbnQ7XHJcblxyXG5cdFx0dGhpcy51cGRhdGVXb3JsZE1hdHJpeCggdHJ1ZSwgZmFsc2UgKTtcclxuXHJcblx0XHRfcG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLm1hdHJpeFdvcmxkICk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmlzQ2FtZXJhIHx8IHRoaXMuaXNMaWdodCApIHtcclxuXHJcblx0XHRcdF9tMS5sb29rQXQoIF9wb3NpdGlvbiwgX3RhcmdldCwgdGhpcy51cCApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRfbTEubG9va0F0KCBfdGFyZ2V0LCBfcG9zaXRpb24sIHRoaXMudXAgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeCggX20xICk7XHJcblxyXG5cdFx0aWYgKCBwYXJlbnQgKSB7XHJcblxyXG5cdFx0XHRfbTEuZXh0cmFjdFJvdGF0aW9uKCBwYXJlbnQubWF0cml4V29ybGQgKTtcclxuXHRcdFx0X3ExLnNldEZyb21Sb3RhdGlvbk1hdHJpeCggX20xICk7XHJcblx0XHRcdHRoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseSggX3ExLmludmVydCgpICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgdGhlIGdpdmVuIDNEIG9iamVjdCBhcyBhIGNoaWxkIHRvIHRoaXMgM0Qgb2JqZWN0LiBBbiBhcmJpdHJhcnkgbnVtYmVyIG9mXHJcblx0ICogb2JqZWN0cyBtYXkgYmUgYWRkZWQuIEFueSBjdXJyZW50IHBhcmVudCBvbiBhbiBvYmplY3QgcGFzc2VkIGluIGhlcmUgd2lsbCBiZVxyXG5cdCAqIHJlbW92ZWQsIHNpbmNlIGFuIG9iamVjdCBjYW4gaGF2ZSBhdCBtb3N0IG9uZSBwYXJlbnQuXHJcblx0ICpcclxuXHQgKiBAZmlyZXMgT2JqZWN0M0QjYWRkZWRcclxuXHQgKiBAZmlyZXMgT2JqZWN0M0QjY2hpbGRhZGRlZFxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0M0R9IG9iamVjdCAtIFRoZSAzRCBvYmplY3QgdG8gYWRkLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdDNEfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGFkZCggb2JqZWN0ICkge1xyXG5cclxuXHRcdGlmICggYXJndW1lbnRzLmxlbmd0aCA+IDEgKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLmFkZCggYXJndW1lbnRzWyBpIF0gKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIG9iamVjdCA9PT0gdGhpcyApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5PYmplY3QzRC5hZGQ6IG9iamVjdCBjYW5cXCd0IGJlIGFkZGVkIGFzIGEgY2hpbGQgb2YgaXRzZWxmLicsIG9iamVjdCApO1xyXG5cdFx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBvYmplY3QgJiYgb2JqZWN0LmlzT2JqZWN0M0QgKSB7XHJcblxyXG5cdFx0XHRvYmplY3QucmVtb3ZlRnJvbVBhcmVudCgpO1xyXG5cdFx0XHRvYmplY3QucGFyZW50ID0gdGhpcztcclxuXHRcdFx0dGhpcy5jaGlsZHJlbi5wdXNoKCBvYmplY3QgKTtcclxuXHJcblx0XHRcdG9iamVjdC5kaXNwYXRjaEV2ZW50KCBfYWRkZWRFdmVudCApO1xyXG5cclxuXHRcdFx0X2NoaWxkYWRkZWRFdmVudC5jaGlsZCA9IG9iamVjdDtcclxuXHRcdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCBfY2hpbGRhZGRlZEV2ZW50ICk7XHJcblx0XHRcdF9jaGlsZGFkZGVkRXZlbnQuY2hpbGQgPSBudWxsO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuT2JqZWN0M0QuYWRkOiBvYmplY3Qgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLk9iamVjdDNELicsIG9iamVjdCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW1vdmVzIHRoZSBnaXZlbiAzRCBvYmplY3QgYXMgY2hpbGQgZnJvbSB0aGlzIDNEIG9iamVjdC5cclxuXHQgKiBBbiBhcmJpdHJhcnkgbnVtYmVyIG9mIG9iamVjdHMgbWF5IGJlIHJlbW92ZWQuXHJcblx0ICpcclxuXHQgKiBAZmlyZXMgT2JqZWN0M0QjcmVtb3ZlZFxyXG5cdCAqIEBmaXJlcyBPYmplY3QzRCNjaGlsZHJlbW92ZWRcclxuXHQgKiBAcGFyYW0ge09iamVjdDNEfSBvYmplY3QgLSBUaGUgM0Qgb2JqZWN0IHRvIHJlbW92ZS5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3QzRH0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRyZW1vdmUoIG9iamVjdCApIHtcclxuXHJcblx0XHRpZiAoIGFyZ3VtZW50cy5sZW5ndGggPiAxICkge1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5yZW1vdmUoIGFyZ3VtZW50c1sgaSBdICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgaW5kZXggPSB0aGlzLmNoaWxkcmVuLmluZGV4T2YoIG9iamVjdCApO1xyXG5cclxuXHRcdGlmICggaW5kZXggIT09IC0gMSApIHtcclxuXHJcblx0XHRcdG9iamVjdC5wYXJlbnQgPSBudWxsO1xyXG5cdFx0XHR0aGlzLmNoaWxkcmVuLnNwbGljZSggaW5kZXgsIDEgKTtcclxuXHJcblx0XHRcdG9iamVjdC5kaXNwYXRjaEV2ZW50KCBfcmVtb3ZlZEV2ZW50ICk7XHJcblxyXG5cdFx0XHRfY2hpbGRyZW1vdmVkRXZlbnQuY2hpbGQgPSBvYmplY3Q7XHJcblx0XHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggX2NoaWxkcmVtb3ZlZEV2ZW50ICk7XHJcblx0XHRcdF9jaGlsZHJlbW92ZWRFdmVudC5jaGlsZCA9IG51bGw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbW92ZXMgdGhpcyAzRCBvYmplY3QgZnJvbSBpdHMgY3VycmVudCBwYXJlbnQuXHJcblx0ICpcclxuXHQgKiBAZmlyZXMgT2JqZWN0M0QjcmVtb3ZlZFxyXG5cdCAqIEBmaXJlcyBPYmplY3QzRCNjaGlsZHJlbW92ZWRcclxuXHQgKiBAcmV0dXJuIHtPYmplY3QzRH0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRyZW1vdmVGcm9tUGFyZW50KCkge1xyXG5cclxuXHRcdGNvbnN0IHBhcmVudCA9IHRoaXMucGFyZW50O1xyXG5cclxuXHRcdGlmICggcGFyZW50ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0cGFyZW50LnJlbW92ZSggdGhpcyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW1vdmVzIGFsbCBjaGlsZCBvYmplY3RzLlxyXG5cdCAqXHJcblx0ICogQGZpcmVzIE9iamVjdDNEI3JlbW92ZWRcclxuXHQgKiBAZmlyZXMgT2JqZWN0M0QjY2hpbGRyZW1vdmVkXHJcblx0ICogQHJldHVybiB7T2JqZWN0M0R9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y2xlYXIoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMucmVtb3ZlKCAuLi4gdGhpcy5jaGlsZHJlbiApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgdGhlIGdpdmVuIDNEIG9iamVjdCBhcyBhIGNoaWxkIG9mIHRoaXMgM0Qgb2JqZWN0LCB3aGlsZSBtYWludGFpbmluZyB0aGUgb2JqZWN0J3Mgd29ybGRcclxuXHQgKiB0cmFuc2Zvcm0uIFRoaXMgbWV0aG9kIGRvZXMgbm90IHN1cHBvcnQgc2NlbmUgZ3JhcGhzIGhhdmluZyBub24tdW5pZm9ybWx5LXNjYWxlZCBub2RlcyhzKS5cclxuXHQgKlxyXG5cdCAqIEBmaXJlcyBPYmplY3QzRCNhZGRlZFxyXG5cdCAqIEBmaXJlcyBPYmplY3QzRCNjaGlsZGFkZGVkXHJcblx0ICogQHBhcmFtIHtPYmplY3QzRH0gb2JqZWN0IC0gVGhlIDNEIG9iamVjdCB0byBhdHRhY2guXHJcblx0ICogQHJldHVybiB7T2JqZWN0M0R9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0YXR0YWNoKCBvYmplY3QgKSB7XHJcblxyXG5cdFx0Ly8gYWRkcyBvYmplY3QgYXMgYSBjaGlsZCBvZiB0aGlzLCB3aGlsZSBtYWludGFpbmluZyB0aGUgb2JqZWN0J3Mgd29ybGQgdHJhbnNmb3JtXHJcblxyXG5cdFx0Ly8gTm90ZTogVGhpcyBtZXRob2QgZG9lcyBub3Qgc3VwcG9ydCBzY2VuZSBncmFwaHMgaGF2aW5nIG5vbi11bmlmb3JtbHktc2NhbGVkIG5vZGVzKHMpXHJcblxyXG5cdFx0dGhpcy51cGRhdGVXb3JsZE1hdHJpeCggdHJ1ZSwgZmFsc2UgKTtcclxuXHJcblx0XHRfbTEuY29weSggdGhpcy5tYXRyaXhXb3JsZCApLmludmVydCgpO1xyXG5cclxuXHRcdGlmICggb2JqZWN0LnBhcmVudCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdG9iamVjdC5wYXJlbnQudXBkYXRlV29ybGRNYXRyaXgoIHRydWUsIGZhbHNlICk7XHJcblxyXG5cdFx0XHRfbTEubXVsdGlwbHkoIG9iamVjdC5wYXJlbnQubWF0cml4V29ybGQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0b2JqZWN0LmFwcGx5TWF0cml4NCggX20xICk7XHJcblxyXG5cdFx0b2JqZWN0LnJlbW92ZUZyb21QYXJlbnQoKTtcclxuXHRcdG9iamVjdC5wYXJlbnQgPSB0aGlzO1xyXG5cdFx0dGhpcy5jaGlsZHJlbi5wdXNoKCBvYmplY3QgKTtcclxuXHJcblx0XHRvYmplY3QudXBkYXRlV29ybGRNYXRyaXgoIGZhbHNlLCB0cnVlICk7XHJcblxyXG5cdFx0b2JqZWN0LmRpc3BhdGNoRXZlbnQoIF9hZGRlZEV2ZW50ICk7XHJcblxyXG5cdFx0X2NoaWxkYWRkZWRFdmVudC5jaGlsZCA9IG9iamVjdDtcclxuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggX2NoaWxkYWRkZWRFdmVudCApO1xyXG5cdFx0X2NoaWxkYWRkZWRFdmVudC5jaGlsZCA9IG51bGw7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2VhcmNoZXMgdGhyb3VnaCB0aGUgM0Qgb2JqZWN0IGFuZCBpdHMgY2hpbGRyZW4sIHN0YXJ0aW5nIHdpdGggdGhlIDNEIG9iamVjdFxyXG5cdCAqIGl0c2VsZiwgYW5kIHJldHVybnMgdGhlIGZpcnN0IHdpdGggYSBtYXRjaGluZyBJRC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpZCAtIFRoZSBpZC5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3QzRHx1bmRlZmluZWR9IFRoZSBmb3VuZCAzRCBvYmplY3QuIFJldHVybnMgYHVuZGVmaW5lZGAgaWYgbm8gM0Qgb2JqZWN0IGhhcyBiZWVuIGZvdW5kLlxyXG5cdCAqL1xyXG5cdGdldE9iamVjdEJ5SWQoIGlkICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmdldE9iamVjdEJ5UHJvcGVydHkoICdpZCcsIGlkICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2VhcmNoZXMgdGhyb3VnaCB0aGUgM0Qgb2JqZWN0IGFuZCBpdHMgY2hpbGRyZW4sIHN0YXJ0aW5nIHdpdGggdGhlIDNEIG9iamVjdFxyXG5cdCAqIGl0c2VsZiwgYW5kIHJldHVybnMgdGhlIGZpcnN0IHdpdGggYSBtYXRjaGluZyBuYW1lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZS5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3QzRHx1bmRlZmluZWR9IFRoZSBmb3VuZCAzRCBvYmplY3QuIFJldHVybnMgYHVuZGVmaW5lZGAgaWYgbm8gM0Qgb2JqZWN0IGhhcyBiZWVuIGZvdW5kLlxyXG5cdCAqL1xyXG5cdGdldE9iamVjdEJ5TmFtZSggbmFtZSApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5nZXRPYmplY3RCeVByb3BlcnR5KCAnbmFtZScsIG5hbWUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZWFyY2hlcyB0aHJvdWdoIHRoZSAzRCBvYmplY3QgYW5kIGl0cyBjaGlsZHJlbiwgc3RhcnRpbmcgd2l0aCB0aGUgM0Qgb2JqZWN0XHJcblx0ICogaXRzZWxmLCBhbmQgcmV0dXJucyB0aGUgZmlyc3Qgd2l0aCBhIG1hdGNoaW5nIHByb3BlcnR5IHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkuXHJcblx0ICogQHBhcmFtIHthbnl9IHZhbHVlIC0gVGhlIHZhbHVlLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdDNEfHVuZGVmaW5lZH0gVGhlIGZvdW5kIDNEIG9iamVjdC4gUmV0dXJucyBgdW5kZWZpbmVkYCBpZiBubyAzRCBvYmplY3QgaGFzIGJlZW4gZm91bmQuXHJcblx0ICovXHJcblx0Z2V0T2JqZWN0QnlQcm9wZXJ0eSggbmFtZSwgdmFsdWUgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzWyBuYW1lIF0gPT09IHZhbHVlICkgcmV0dXJuIHRoaXM7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgY2hpbGQgPSB0aGlzLmNoaWxkcmVuWyBpIF07XHJcblx0XHRcdGNvbnN0IG9iamVjdCA9IGNoaWxkLmdldE9iamVjdEJ5UHJvcGVydHkoIG5hbWUsIHZhbHVlICk7XHJcblxyXG5cdFx0XHRpZiAoIG9iamVjdCAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gb2JqZWN0O1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNlYXJjaGVzIHRocm91Z2ggdGhlIDNEIG9iamVjdCBhbmQgaXRzIGNoaWxkcmVuLCBzdGFydGluZyB3aXRoIHRoZSAzRCBvYmplY3RcclxuXHQgKiBpdHNlbGYsIGFuZCByZXR1cm5zIGFsbCAzRCBvYmplY3RzIHdpdGggYSBtYXRjaGluZyBwcm9wZXJ0eSB2YWx1ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LlxyXG5cdCAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIFRoZSB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge0FycmF5PE9iamVjdDNEPn0gcmVzdWx0IC0gVGhlIG1ldGhvZCBzdG9yZXMgdGhlIHJlc3VsdCBpbiB0aGlzIGFycmF5LlxyXG5cdCAqIEByZXR1cm4ge0FycmF5PE9iamVjdDNEPn0gVGhlIGZvdW5kIDNEIG9iamVjdHMuXHJcblx0ICovXHJcblx0Z2V0T2JqZWN0c0J5UHJvcGVydHkoIG5hbWUsIHZhbHVlLCByZXN1bHQgPSBbXSApIHtcclxuXHJcblx0XHRpZiAoIHRoaXNbIG5hbWUgXSA9PT0gdmFsdWUgKSByZXN1bHQucHVzaCggdGhpcyApO1xyXG5cclxuXHRcdGNvbnN0IGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbjtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y2hpbGRyZW5bIGkgXS5nZXRPYmplY3RzQnlQcm9wZXJ0eSggbmFtZSwgdmFsdWUsIHJlc3VsdCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSB2ZWN0b3IgcmVwcmVzZW50aW5nIHRoZSBwb3NpdGlvbiBvZiB0aGUgM0Qgb2JqZWN0IGluIHdvcmxkIHNwYWNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IHZlY3RvciB0aGUgcmVzdWx0IGlzIHN0b3JlZCB0by5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBUaGUgM0Qgb2JqZWN0J3MgcG9zaXRpb24gaW4gd29ybGQgc3BhY2UuXHJcblx0ICovXHJcblx0Z2V0V29ybGRQb3NpdGlvbiggdGFyZ2V0ICkge1xyXG5cclxuXHRcdHRoaXMudXBkYXRlV29ybGRNYXRyaXgoIHRydWUsIGZhbHNlICk7XHJcblxyXG5cdFx0cmV0dXJuIHRhcmdldC5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubWF0cml4V29ybGQgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgUXVhdGVybmlvbiByZXByZXNlbnRpbmcgdGhlIHBvc2l0aW9uIG9mIHRoZSAzRCBvYmplY3QgaW4gd29ybGQgc3BhY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1F1YXRlcm5pb259IHRhcmdldCAtIFRoZSB0YXJnZXQgUXVhdGVybmlvbiB0aGUgcmVzdWx0IGlzIHN0b3JlZCB0by5cclxuXHQgKiBAcmV0dXJuIHtRdWF0ZXJuaW9ufSBUaGUgM0Qgb2JqZWN0J3Mgcm90YXRpb24gaW4gd29ybGQgc3BhY2UuXHJcblx0ICovXHJcblx0Z2V0V29ybGRRdWF0ZXJuaW9uKCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0dGhpcy51cGRhdGVXb3JsZE1hdHJpeCggdHJ1ZSwgZmFsc2UgKTtcclxuXHJcblx0XHR0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZSggX3Bvc2l0aW9uLCB0YXJnZXQsIF9zY2FsZSApO1xyXG5cclxuXHRcdHJldHVybiB0YXJnZXQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIHZlY3RvciByZXByZXNlbnRpbmcgdGhlIHNjYWxlIG9mIHRoZSAzRCBvYmplY3QgaW4gd29ybGQgc3BhY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHRhcmdldCAtIFRoZSB0YXJnZXQgdmVjdG9yIHRoZSByZXN1bHQgaXMgc3RvcmVkIHRvLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IFRoZSAzRCBvYmplY3QncyBzY2FsZSBpbiB3b3JsZCBzcGFjZS5cclxuXHQgKi9cclxuXHRnZXRXb3JsZFNjYWxlKCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0dGhpcy51cGRhdGVXb3JsZE1hdHJpeCggdHJ1ZSwgZmFsc2UgKTtcclxuXHJcblx0XHR0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZSggX3Bvc2l0aW9uLCBfcXVhdGVybmlvbiwgdGFyZ2V0ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRhcmdldDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgdmVjdG9yIHJlcHJlc2VudGluZyB0aGUgKFwibG9va1wiKSBkaXJlY3Rpb24gb2YgdGhlIDNEIG9iamVjdCBpbiB3b3JsZCBzcGFjZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdGFyZ2V0IC0gVGhlIHRhcmdldCB2ZWN0b3IgdGhlIHJlc3VsdCBpcyBzdG9yZWQgdG8uXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gVGhlIDNEIG9iamVjdCdzIGRpcmVjdGlvbiBpbiB3b3JsZCBzcGFjZS5cclxuXHQgKi9cclxuXHRnZXRXb3JsZERpcmVjdGlvbiggdGFyZ2V0ICkge1xyXG5cclxuXHRcdHRoaXMudXBkYXRlV29ybGRNYXRyaXgoIHRydWUsIGZhbHNlICk7XHJcblxyXG5cdFx0Y29uc3QgZSA9IHRoaXMubWF0cml4V29ybGQuZWxlbWVudHM7XHJcblxyXG5cdFx0cmV0dXJuIHRhcmdldC5zZXQoIGVbIDggXSwgZVsgOSBdLCBlWyAxMCBdICkubm9ybWFsaXplKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWJzdHJhY3QgbWV0aG9kIHRvIGdldCBpbnRlcnNlY3Rpb25zIGJldHdlZW4gYSBjYXN0ZWQgcmF5IGFuZCB0aGlzXHJcblx0ICogM0Qgb2JqZWN0LiBSZW5kZXJhYmxlIDNEIG9iamVjdHMgc3VjaCBhcyB7QGxpbmsgTWVzaH0sIHtAbGluayBMaW5lfSBvciB7QGxpbmsgUG9pbnRzfVxyXG5cdCAqIGltcGxlbWVudCB0aGlzIG1ldGhvZCBpbiBvcmRlciB0byB1c2UgcmF5Y2FzdGluZy5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7UmF5Y2FzdGVyfSByYXljYXN0ZXIgLSBUaGUgcmF5Y2FzdGVyLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8T2JqZWN0Pn0gaW50ZXJzZWN0cyAtIEFuIGFycmF5IGhvbGRpbmcgdGhlIHJlc3VsdCBvZiB0aGUgbWV0aG9kLlxyXG5cdCAqL1xyXG5cdHJheWNhc3QoIC8qIHJheWNhc3RlciwgaW50ZXJzZWN0cyAqLyApIHt9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEV4ZWN1dGVzIHRoZSBjYWxsYmFjayBvbiB0aGlzIDNEIG9iamVjdCBhbmQgYWxsIGRlc2NlbmRhbnRzLlxyXG5cdCAqXHJcblx0ICogTm90ZTogTW9kaWZ5aW5nIHRoZSBzY2VuZSBncmFwaCBpbnNpZGUgdGhlIGNhbGxiYWNrIGlzIGRpc2NvdXJhZ2VkLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgLSBBIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgYWxsb3dzIHRvIHByb2Nlc3MgdGhlIGN1cnJlbnQgM0Qgb2JqZWN0LlxyXG5cdCAqL1xyXG5cdHRyYXZlcnNlKCBjYWxsYmFjayApIHtcclxuXHJcblx0XHRjYWxsYmFjayggdGhpcyApO1xyXG5cclxuXHRcdGNvbnN0IGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbjtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y2hpbGRyZW5bIGkgXS50cmF2ZXJzZSggY2FsbGJhY2sgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTGlrZSB7QGxpbmsgT2JqZWN0M0QjdHJhdmVyc2V9LCBidXQgdGhlIGNhbGxiYWNrIHdpbGwgb25seSBiZSBleGVjdXRlZCBmb3IgdmlzaWJsZSAzRCBvYmplY3RzLlxyXG5cdCAqIERlc2NlbmRhbnRzIG9mIGludmlzaWJsZSAzRCBvYmplY3RzIGFyZSBub3QgdHJhdmVyc2VkLlxyXG5cdCAqXHJcblx0ICogTm90ZTogTW9kaWZ5aW5nIHRoZSBzY2VuZSBncmFwaCBpbnNpZGUgdGhlIGNhbGxiYWNrIGlzIGRpc2NvdXJhZ2VkLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgLSBBIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgYWxsb3dzIHRvIHByb2Nlc3MgdGhlIGN1cnJlbnQgM0Qgb2JqZWN0LlxyXG5cdCAqL1xyXG5cdHRyYXZlcnNlVmlzaWJsZSggY2FsbGJhY2sgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLnZpc2libGUgPT09IGZhbHNlICkgcmV0dXJuO1xyXG5cclxuXHRcdGNhbGxiYWNrKCB0aGlzICk7XHJcblxyXG5cdFx0Y29uc3QgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjaGlsZHJlblsgaSBdLnRyYXZlcnNlVmlzaWJsZSggY2FsbGJhY2sgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTGlrZSB7QGxpbmsgT2JqZWN0M0QjdHJhdmVyc2V9LCBidXQgdGhlIGNhbGxiYWNrIHdpbGwgb25seSBiZSBleGVjdXRlZCBmb3IgYWxsIGFuY2VzdG9ycy5cclxuXHQgKlxyXG5cdCAqIE5vdGU6IE1vZGlmeWluZyB0aGUgc2NlbmUgZ3JhcGggaW5zaWRlIHRoZSBjYWxsYmFjayBpcyBkaXNjb3VyYWdlZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIC0gQSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGFsbG93cyB0byBwcm9jZXNzIHRoZSBjdXJyZW50IDNEIG9iamVjdC5cclxuXHQgKi9cclxuXHR0cmF2ZXJzZUFuY2VzdG9ycyggY2FsbGJhY2sgKSB7XHJcblxyXG5cdFx0Y29uc3QgcGFyZW50ID0gdGhpcy5wYXJlbnQ7XHJcblxyXG5cdFx0aWYgKCBwYXJlbnQgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRjYWxsYmFjayggcGFyZW50ICk7XHJcblxyXG5cdFx0XHRwYXJlbnQudHJhdmVyc2VBbmNlc3RvcnMoIGNhbGxiYWNrICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBpbiBsb2NhbCBzcGFjZSBieSBjb21wdXRpbmcgaXQgZnJvbSB0aGUgY3VycmVudFxyXG5cdCAqIHBvc2l0aW9uLCByb3RhdGlvbiBhbmQgc2NhbGUgdmFsdWVzLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZU1hdHJpeCgpIHtcclxuXHJcblx0XHR0aGlzLm1hdHJpeC5jb21wb3NlKCB0aGlzLnBvc2l0aW9uLCB0aGlzLnF1YXRlcm5pb24sIHRoaXMuc2NhbGUgKTtcclxuXHJcblx0XHR0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBpbiB3b3JsZCBzcGFjZSBvZiB0aGlzIDNEIG9iamVjdHMgYW5kIGl0cyBkZXNjZW5kYW50cy5cclxuXHQgKlxyXG5cdCAqIFRvIGVuc3VyZSBjb3JyZWN0IHJlc3VsdHMsIHRoaXMgbWV0aG9kIGFsc28gcmVjb21wdXRlcyB0aGUgM0Qgb2JqZWN0J3MgdHJhbnNmb3JtYXRpb24gbWF0cml4IGluXHJcblx0ICogbG9jYWwgc3BhY2UuIFRoZSBjb21wdXRhdGlvbiBvZiB0aGUgbG9jYWwgYW5kIHdvcmxkIG1hdHJpeCBjYW4gYmUgY29udHJvbGxlZCB3aXRoIHRoZVxyXG5cdCAqIHtAbGluayBPYmplY3QzRCNtYXRyaXhBdXRvVXBkYXRlfSBhbmQge0BsaW5rIE9iamVjdDNEI21hdHJpeFdvcmxkQXV0b1VwZGF0ZX0gZmxhZ3Mgd2hpY2ggYXJlIGJvdGhcclxuXHQgKiBgdHJ1ZWAgYnkgZGVmYXVsdC4gIFNldCB0aGVzZSBmbGFncyB0byBgZmFsc2VgIGlmIHlvdSBuZWVkIG1vcmUgY29udHJvbCBvdmVyIHRoZSB1cGRhdGUgbWF0cml4IHByb2Nlc3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtmb3JjZT1mYWxzZV0gLSBXaGVuIHNldCB0byBgdHJ1ZWAsIGEgcmVjb21wdXRhdGlvbiBvZiB3b3JsZCBtYXRyaWNlcyBpcyBmb3JjZWQgZXZlblxyXG5cdCAqIHdoZW4ge0BsaW5rIE9iamVjdDNEI21hdHJpeFdvcmxkQXV0b1VwZGF0ZX0gaXMgc2V0IHRvIGBmYWxzZWAuXHJcblx0ICovXHJcblx0dXBkYXRlTWF0cml4V29ybGQoIGZvcmNlICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5tYXRyaXhBdXRvVXBkYXRlICkgdGhpcy51cGRhdGVNYXRyaXgoKTtcclxuXHJcblx0XHRpZiAoIHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZSB8fCBmb3JjZSApIHtcclxuXHJcblx0XHRcdGlmICggdGhpcy5tYXRyaXhXb3JsZEF1dG9VcGRhdGUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggdGhpcy5wYXJlbnQgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdFx0dGhpcy5tYXRyaXhXb3JsZC5jb3B5KCB0aGlzLm1hdHJpeCApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdHRoaXMubWF0cml4V29ybGQubXVsdGlwbHlNYXRyaWNlcyggdGhpcy5wYXJlbnQubWF0cml4V29ybGQsIHRoaXMubWF0cml4ICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IGZhbHNlO1xyXG5cclxuXHRcdFx0Zm9yY2UgPSB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBtYWtlIHN1cmUgZGVzY2VuZGFudHMgYXJlIHVwZGF0ZWQgaWYgcmVxdWlyZWRcclxuXHJcblx0XHRjb25zdCBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW47XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGNoaWxkID0gY2hpbGRyZW5bIGkgXTtcclxuXHJcblx0XHRcdGNoaWxkLnVwZGF0ZU1hdHJpeFdvcmxkKCBmb3JjZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBbiBhbHRlcm5hdGl2ZSB2ZXJzaW9uIG9mIHtAbGluayBPYmplY3QzRCN1cGRhdGVNYXRyaXhXb3JsZH0gd2l0aCBtb3JlIGNvbnRyb2wgb3ZlciB0aGVcclxuXHQgKiB1cGRhdGUgb2YgYW5jZXN0b3IgYW5kIGRlc2NlbmRhbnQgbm9kZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFt1cGRhdGVQYXJlbnRzPWZhbHNlXSBXaGV0aGVyIGFuY2VzdG9yIG5vZGVzIHNob3VsZCBiZSB1cGRhdGVkIG9yIG5vdC5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFt1cGRhdGVDaGlsZHJlbj1mYWxzZV0gV2hldGhlciBkZXNjZW5kYW50IG5vZGVzIHNob3VsZCBiZSB1cGRhdGVkIG9yIG5vdC5cclxuXHQgKi9cclxuXHR1cGRhdGVXb3JsZE1hdHJpeCggdXBkYXRlUGFyZW50cywgdXBkYXRlQ2hpbGRyZW4gKSB7XHJcblxyXG5cdFx0Y29uc3QgcGFyZW50ID0gdGhpcy5wYXJlbnQ7XHJcblxyXG5cdFx0aWYgKCB1cGRhdGVQYXJlbnRzID09PSB0cnVlICYmIHBhcmVudCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHBhcmVudC51cGRhdGVXb3JsZE1hdHJpeCggdHJ1ZSwgZmFsc2UgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aGlzLm1hdHJpeEF1dG9VcGRhdGUgKSB0aGlzLnVwZGF0ZU1hdHJpeCgpO1xyXG5cclxuXHRcdGlmICggdGhpcy5tYXRyaXhXb3JsZEF1dG9VcGRhdGUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMucGFyZW50ID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLm1hdHJpeFdvcmxkLmNvcHkoIHRoaXMubWF0cml4ICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHR0aGlzLm1hdHJpeFdvcmxkLm11bHRpcGx5TWF0cmljZXMoIHRoaXMucGFyZW50Lm1hdHJpeFdvcmxkLCB0aGlzLm1hdHJpeCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBtYWtlIHN1cmUgZGVzY2VuZGFudHMgYXJlIHVwZGF0ZWRcclxuXHJcblx0XHRpZiAoIHVwZGF0ZUNoaWxkcmVuID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0Y29uc3QgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgY2hpbGQgPSBjaGlsZHJlblsgaSBdO1xyXG5cclxuXHRcdFx0XHRjaGlsZC51cGRhdGVXb3JsZE1hdHJpeCggZmFsc2UsIHRydWUgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2VyaWFsaXplcyB0aGUgM0Qgb2JqZWN0IGludG8gSlNPTi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7PyhPYmplY3R8c3RyaW5nKX0gbWV0YSAtIEFuIG9wdGlvbmFsIHZhbHVlIGhvbGRpbmcgbWV0YSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VyaWFsaXphdGlvbi5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3R9IEEgSlNPTiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzZXJpYWxpemVkIDNEIG9iamVjdC5cclxuXHQgKiBAc2VlIHtAbGluayBPYmplY3RMb2FkZXIjcGFyc2V9XHJcblx0ICovXHJcblx0dG9KU09OKCBtZXRhICkge1xyXG5cclxuXHRcdC8vIG1ldGEgaXMgYSBzdHJpbmcgd2hlbiBjYWxsZWQgZnJvbSBKU09OLnN0cmluZ2lmeVxyXG5cdFx0Y29uc3QgaXNSb290T2JqZWN0ID0gKCBtZXRhID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIG1ldGEgPT09ICdzdHJpbmcnICk7XHJcblxyXG5cdFx0Y29uc3Qgb3V0cHV0ID0ge307XHJcblxyXG5cdFx0Ly8gbWV0YSBpcyBhIGhhc2ggdXNlZCB0byBjb2xsZWN0IGdlb21ldHJpZXMsIG1hdGVyaWFscy5cclxuXHRcdC8vIG5vdCBwcm92aWRpbmcgaXQgaW1wbGllcyB0aGF0IHRoaXMgaXMgdGhlIHJvb3Qgb2JqZWN0XHJcblx0XHQvLyBiZWluZyBzZXJpYWxpemVkLlxyXG5cdFx0aWYgKCBpc1Jvb3RPYmplY3QgKSB7XHJcblxyXG5cdFx0XHQvLyBpbml0aWFsaXplIG1ldGEgb2JqXHJcblx0XHRcdG1ldGEgPSB7XHJcblx0XHRcdFx0Z2VvbWV0cmllczoge30sXHJcblx0XHRcdFx0bWF0ZXJpYWxzOiB7fSxcclxuXHRcdFx0XHR0ZXh0dXJlczoge30sXHJcblx0XHRcdFx0aW1hZ2VzOiB7fSxcclxuXHRcdFx0XHRzaGFwZXM6IHt9LFxyXG5cdFx0XHRcdHNrZWxldG9uczoge30sXHJcblx0XHRcdFx0YW5pbWF0aW9uczoge30sXHJcblx0XHRcdFx0bm9kZXM6IHt9XHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHRvdXRwdXQubWV0YWRhdGEgPSB7XHJcblx0XHRcdFx0dmVyc2lvbjogNC42LFxyXG5cdFx0XHRcdHR5cGU6ICdPYmplY3QnLFxyXG5cdFx0XHRcdGdlbmVyYXRvcjogJ09iamVjdDNELnRvSlNPTidcclxuXHRcdFx0fTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gc3RhbmRhcmQgT2JqZWN0M0Qgc2VyaWFsaXphdGlvblxyXG5cclxuXHRcdGNvbnN0IG9iamVjdCA9IHt9O1xyXG5cclxuXHRcdG9iamVjdC51dWlkID0gdGhpcy51dWlkO1xyXG5cdFx0b2JqZWN0LnR5cGUgPSB0aGlzLnR5cGU7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5hbWUgIT09ICcnICkgb2JqZWN0Lm5hbWUgPSB0aGlzLm5hbWU7XHJcblx0XHRpZiAoIHRoaXMuY2FzdFNoYWRvdyA9PT0gdHJ1ZSApIG9iamVjdC5jYXN0U2hhZG93ID0gdHJ1ZTtcclxuXHRcdGlmICggdGhpcy5yZWNlaXZlU2hhZG93ID09PSB0cnVlICkgb2JqZWN0LnJlY2VpdmVTaGFkb3cgPSB0cnVlO1xyXG5cdFx0aWYgKCB0aGlzLnZpc2libGUgPT09IGZhbHNlICkgb2JqZWN0LnZpc2libGUgPSBmYWxzZTtcclxuXHRcdGlmICggdGhpcy5mcnVzdHVtQ3VsbGVkID09PSBmYWxzZSApIG9iamVjdC5mcnVzdHVtQ3VsbGVkID0gZmFsc2U7XHJcblx0XHRpZiAoIHRoaXMucmVuZGVyT3JkZXIgIT09IDAgKSBvYmplY3QucmVuZGVyT3JkZXIgPSB0aGlzLnJlbmRlck9yZGVyO1xyXG5cdFx0aWYgKCBPYmplY3Qua2V5cyggdGhpcy51c2VyRGF0YSApLmxlbmd0aCA+IDAgKSBvYmplY3QudXNlckRhdGEgPSB0aGlzLnVzZXJEYXRhO1xyXG5cclxuXHRcdG9iamVjdC5sYXllcnMgPSB0aGlzLmxheWVycy5tYXNrO1xyXG5cdFx0b2JqZWN0Lm1hdHJpeCA9IHRoaXMubWF0cml4LnRvQXJyYXkoKTtcclxuXHRcdG9iamVjdC51cCA9IHRoaXMudXAudG9BcnJheSgpO1xyXG5cclxuXHRcdGlmICggdGhpcy5tYXRyaXhBdXRvVXBkYXRlID09PSBmYWxzZSApIG9iamVjdC5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XHJcblxyXG5cdFx0Ly8gb2JqZWN0IHNwZWNpZmljIHByb3BlcnRpZXNcclxuXHJcblx0XHRpZiAoIHRoaXMuaXNJbnN0YW5jZWRNZXNoICkge1xyXG5cclxuXHRcdFx0b2JqZWN0LnR5cGUgPSAnSW5zdGFuY2VkTWVzaCc7XHJcblx0XHRcdG9iamVjdC5jb3VudCA9IHRoaXMuY291bnQ7XHJcblx0XHRcdG9iamVjdC5pbnN0YW5jZU1hdHJpeCA9IHRoaXMuaW5zdGFuY2VNYXRyaXgudG9KU09OKCk7XHJcblx0XHRcdGlmICggdGhpcy5pbnN0YW5jZUNvbG9yICE9PSBudWxsICkgb2JqZWN0Lmluc3RhbmNlQ29sb3IgPSB0aGlzLmluc3RhbmNlQ29sb3IudG9KU09OKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy5pc0JhdGNoZWRNZXNoICkge1xyXG5cclxuXHRcdFx0b2JqZWN0LnR5cGUgPSAnQmF0Y2hlZE1lc2gnO1xyXG5cdFx0XHRvYmplY3QucGVyT2JqZWN0RnJ1c3R1bUN1bGxlZCA9IHRoaXMucGVyT2JqZWN0RnJ1c3R1bUN1bGxlZDtcclxuXHRcdFx0b2JqZWN0LnNvcnRPYmplY3RzID0gdGhpcy5zb3J0T2JqZWN0cztcclxuXHJcblx0XHRcdG9iamVjdC5kcmF3UmFuZ2VzID0gdGhpcy5fZHJhd1JhbmdlcztcclxuXHRcdFx0b2JqZWN0LnJlc2VydmVkUmFuZ2VzID0gdGhpcy5fcmVzZXJ2ZWRSYW5nZXM7XHJcblxyXG5cdFx0XHRvYmplY3QudmlzaWJpbGl0eSA9IHRoaXMuX3Zpc2liaWxpdHk7XHJcblx0XHRcdG9iamVjdC5hY3RpdmUgPSB0aGlzLl9hY3RpdmU7XHJcblx0XHRcdG9iamVjdC5ib3VuZHMgPSB0aGlzLl9ib3VuZHMubWFwKCBib3VuZCA9PiAoIHtcclxuXHRcdFx0XHRib3hJbml0aWFsaXplZDogYm91bmQuYm94SW5pdGlhbGl6ZWQsXHJcblx0XHRcdFx0Ym94TWluOiBib3VuZC5ib3gubWluLnRvQXJyYXkoKSxcclxuXHRcdFx0XHRib3hNYXg6IGJvdW5kLmJveC5tYXgudG9BcnJheSgpLFxyXG5cclxuXHRcdFx0XHRzcGhlcmVJbml0aWFsaXplZDogYm91bmQuc3BoZXJlSW5pdGlhbGl6ZWQsXHJcblx0XHRcdFx0c3BoZXJlUmFkaXVzOiBib3VuZC5zcGhlcmUucmFkaXVzLFxyXG5cdFx0XHRcdHNwaGVyZUNlbnRlcjogYm91bmQuc3BoZXJlLmNlbnRlci50b0FycmF5KClcclxuXHRcdFx0fSApICk7XHJcblxyXG5cdFx0XHRvYmplY3QubWF4SW5zdGFuY2VDb3VudCA9IHRoaXMuX21heEluc3RhbmNlQ291bnQ7XHJcblx0XHRcdG9iamVjdC5tYXhWZXJ0ZXhDb3VudCA9IHRoaXMuX21heFZlcnRleENvdW50O1xyXG5cdFx0XHRvYmplY3QubWF4SW5kZXhDb3VudCA9IHRoaXMuX21heEluZGV4Q291bnQ7XHJcblxyXG5cdFx0XHRvYmplY3QuZ2VvbWV0cnlJbml0aWFsaXplZCA9IHRoaXMuX2dlb21ldHJ5SW5pdGlhbGl6ZWQ7XHJcblx0XHRcdG9iamVjdC5nZW9tZXRyeUNvdW50ID0gdGhpcy5fZ2VvbWV0cnlDb3VudDtcclxuXHJcblx0XHRcdG9iamVjdC5tYXRyaWNlc1RleHR1cmUgPSB0aGlzLl9tYXRyaWNlc1RleHR1cmUudG9KU09OKCBtZXRhICk7XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMuX2NvbG9yc1RleHR1cmUgIT09IG51bGwgKSBvYmplY3QuY29sb3JzVGV4dHVyZSA9IHRoaXMuX2NvbG9yc1RleHR1cmUudG9KU09OKCBtZXRhICk7XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMuYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdG9iamVjdC5ib3VuZGluZ1NwaGVyZSA9IHtcclxuXHRcdFx0XHRcdGNlbnRlcjogb2JqZWN0LmJvdW5kaW5nU3BoZXJlLmNlbnRlci50b0FycmF5KCksXHJcblx0XHRcdFx0XHRyYWRpdXM6IG9iamVjdC5ib3VuZGluZ1NwaGVyZS5yYWRpdXNcclxuXHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCB0aGlzLmJvdW5kaW5nQm94ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRvYmplY3QuYm91bmRpbmdCb3ggPSB7XHJcblx0XHRcdFx0XHRtaW46IG9iamVjdC5ib3VuZGluZ0JveC5taW4udG9BcnJheSgpLFxyXG5cdFx0XHRcdFx0bWF4OiBvYmplY3QuYm91bmRpbmdCb3gubWF4LnRvQXJyYXkoKVxyXG5cdFx0XHRcdH07XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0ZnVuY3Rpb24gc2VyaWFsaXplKCBsaWJyYXJ5LCBlbGVtZW50ICkge1xyXG5cclxuXHRcdFx0aWYgKCBsaWJyYXJ5WyBlbGVtZW50LnV1aWQgXSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRsaWJyYXJ5WyBlbGVtZW50LnV1aWQgXSA9IGVsZW1lbnQudG9KU09OKCBtZXRhICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gZWxlbWVudC51dWlkO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMuaXNTY2VuZSApIHtcclxuXHJcblx0XHRcdGlmICggdGhpcy5iYWNrZ3JvdW5kICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIHRoaXMuYmFja2dyb3VuZC5pc0NvbG9yICkge1xyXG5cclxuXHRcdFx0XHRcdG9iamVjdC5iYWNrZ3JvdW5kID0gdGhpcy5iYWNrZ3JvdW5kLnRvSlNPTigpO1xyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCB0aGlzLmJhY2tncm91bmQuaXNUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0XHRcdG9iamVjdC5iYWNrZ3JvdW5kID0gdGhpcy5iYWNrZ3JvdW5kLnRvSlNPTiggbWV0YSApLnV1aWQ7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggdGhpcy5lbnZpcm9ubWVudCAmJiB0aGlzLmVudmlyb25tZW50LmlzVGV4dHVyZSAmJiB0aGlzLmVudmlyb25tZW50LmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSAhPT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0b2JqZWN0LmVudmlyb25tZW50ID0gdGhpcy5lbnZpcm9ubWVudC50b0pTT04oIG1ldGEgKS51dWlkO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHRoaXMuaXNNZXNoIHx8IHRoaXMuaXNMaW5lIHx8IHRoaXMuaXNQb2ludHMgKSB7XHJcblxyXG5cdFx0XHRvYmplY3QuZ2VvbWV0cnkgPSBzZXJpYWxpemUoIG1ldGEuZ2VvbWV0cmllcywgdGhpcy5nZW9tZXRyeSApO1xyXG5cclxuXHRcdFx0Y29uc3QgcGFyYW1ldGVycyA9IHRoaXMuZ2VvbWV0cnkucGFyYW1ldGVycztcclxuXHJcblx0XHRcdGlmICggcGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkICYmIHBhcmFtZXRlcnMuc2hhcGVzICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHNoYXBlcyA9IHBhcmFtZXRlcnMuc2hhcGVzO1xyXG5cclxuXHRcdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHNoYXBlcyApICkge1xyXG5cclxuXHRcdFx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHNoYXBlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3Qgc2hhcGUgPSBzaGFwZXNbIGkgXTtcclxuXHJcblx0XHRcdFx0XHRcdHNlcmlhbGl6ZSggbWV0YS5zaGFwZXMsIHNoYXBlICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdHNlcmlhbGl6ZSggbWV0YS5zaGFwZXMsIHNoYXBlcyApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy5pc1NraW5uZWRNZXNoICkge1xyXG5cclxuXHRcdFx0b2JqZWN0LmJpbmRNb2RlID0gdGhpcy5iaW5kTW9kZTtcclxuXHRcdFx0b2JqZWN0LmJpbmRNYXRyaXggPSB0aGlzLmJpbmRNYXRyaXgudG9BcnJheSgpO1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLnNrZWxldG9uICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdHNlcmlhbGl6ZSggbWV0YS5za2VsZXRvbnMsIHRoaXMuc2tlbGV0b24gKTtcclxuXHJcblx0XHRcdFx0b2JqZWN0LnNrZWxldG9uID0gdGhpcy5za2VsZXRvbi51dWlkO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMubWF0ZXJpYWwgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggdGhpcy5tYXRlcmlhbCApICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB1dWlkcyA9IFtdO1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSB0aGlzLm1hdGVyaWFsLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0dXVpZHMucHVzaCggc2VyaWFsaXplKCBtZXRhLm1hdGVyaWFscywgdGhpcy5tYXRlcmlhbFsgaSBdICkgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRvYmplY3QubWF0ZXJpYWwgPSB1dWlkcztcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdG9iamVjdC5tYXRlcmlhbCA9IHNlcmlhbGl6ZSggbWV0YS5tYXRlcmlhbHMsIHRoaXMubWF0ZXJpYWwgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRpZiAoIHRoaXMuY2hpbGRyZW4ubGVuZ3RoID4gMCApIHtcclxuXHJcblx0XHRcdG9iamVjdC5jaGlsZHJlbiA9IFtdO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdG9iamVjdC5jaGlsZHJlbi5wdXNoKCB0aGlzLmNoaWxkcmVuWyBpIF0udG9KU09OKCBtZXRhICkub2JqZWN0ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0aWYgKCB0aGlzLmFuaW1hdGlvbnMubGVuZ3RoID4gMCApIHtcclxuXHJcblx0XHRcdG9iamVjdC5hbmltYXRpb25zID0gW107XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB0aGlzLmFuaW1hdGlvbnMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBhbmltYXRpb24gPSB0aGlzLmFuaW1hdGlvbnNbIGkgXTtcclxuXHJcblx0XHRcdFx0b2JqZWN0LmFuaW1hdGlvbnMucHVzaCggc2VyaWFsaXplKCBtZXRhLmFuaW1hdGlvbnMsIGFuaW1hdGlvbiApICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggaXNSb290T2JqZWN0ICkge1xyXG5cclxuXHRcdFx0Y29uc3QgZ2VvbWV0cmllcyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEuZ2VvbWV0cmllcyApO1xyXG5cdFx0XHRjb25zdCBtYXRlcmlhbHMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLm1hdGVyaWFscyApO1xyXG5cdFx0XHRjb25zdCB0ZXh0dXJlcyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEudGV4dHVyZXMgKTtcclxuXHRcdFx0Y29uc3QgaW1hZ2VzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS5pbWFnZXMgKTtcclxuXHRcdFx0Y29uc3Qgc2hhcGVzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS5zaGFwZXMgKTtcclxuXHRcdFx0Y29uc3Qgc2tlbGV0b25zID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS5za2VsZXRvbnMgKTtcclxuXHRcdFx0Y29uc3QgYW5pbWF0aW9ucyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEuYW5pbWF0aW9ucyApO1xyXG5cdFx0XHRjb25zdCBub2RlcyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEubm9kZXMgKTtcclxuXHJcblx0XHRcdGlmICggZ2VvbWV0cmllcy5sZW5ndGggPiAwICkgb3V0cHV0Lmdlb21ldHJpZXMgPSBnZW9tZXRyaWVzO1xyXG5cdFx0XHRpZiAoIG1hdGVyaWFscy5sZW5ndGggPiAwICkgb3V0cHV0Lm1hdGVyaWFscyA9IG1hdGVyaWFscztcclxuXHRcdFx0aWYgKCB0ZXh0dXJlcy5sZW5ndGggPiAwICkgb3V0cHV0LnRleHR1cmVzID0gdGV4dHVyZXM7XHJcblx0XHRcdGlmICggaW1hZ2VzLmxlbmd0aCA+IDAgKSBvdXRwdXQuaW1hZ2VzID0gaW1hZ2VzO1xyXG5cdFx0XHRpZiAoIHNoYXBlcy5sZW5ndGggPiAwICkgb3V0cHV0LnNoYXBlcyA9IHNoYXBlcztcclxuXHRcdFx0aWYgKCBza2VsZXRvbnMubGVuZ3RoID4gMCApIG91dHB1dC5za2VsZXRvbnMgPSBza2VsZXRvbnM7XHJcblx0XHRcdGlmICggYW5pbWF0aW9ucy5sZW5ndGggPiAwICkgb3V0cHV0LmFuaW1hdGlvbnMgPSBhbmltYXRpb25zO1xyXG5cdFx0XHRpZiAoIG5vZGVzLmxlbmd0aCA+IDAgKSBvdXRwdXQubm9kZXMgPSBub2RlcztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0b3V0cHV0Lm9iamVjdCA9IG9iamVjdDtcclxuXHJcblx0XHRyZXR1cm4gb3V0cHV0O1xyXG5cclxuXHRcdC8vIGV4dHJhY3QgZGF0YSBmcm9tIHRoZSBjYWNoZSBoYXNoXHJcblx0XHQvLyByZW1vdmUgbWV0YWRhdGEgb24gZWFjaCBpdGVtXHJcblx0XHQvLyBhbmQgcmV0dXJuIGFzIGFycmF5XHJcblx0XHRmdW5jdGlvbiBleHRyYWN0RnJvbUNhY2hlKCBjYWNoZSApIHtcclxuXHJcblx0XHRcdGNvbnN0IHZhbHVlcyA9IFtdO1xyXG5cdFx0XHRmb3IgKCBjb25zdCBrZXkgaW4gY2FjaGUgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGRhdGEgPSBjYWNoZVsga2V5IF07XHJcblx0XHRcdFx0ZGVsZXRlIGRhdGEubWV0YWRhdGE7XHJcblx0XHRcdFx0dmFsdWVzLnB1c2goIGRhdGEgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiB2YWx1ZXM7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBuZXcgM0Qgb2JqZWN0IHdpdGggY29waWVkIHZhbHVlcyBmcm9tIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZWN1cnNpdmU9dHJ1ZV0gLSBXaGVuIHNldCB0byBgdHJ1ZWAsIGRlc2NlbmRhbnRzIG9mIHRoZSAzRCBvYmplY3QgYXJlIGFsc28gY2xvbmVkLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdDNEfSBBIGNsb25lIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y2xvbmUoIHJlY3Vyc2l2ZSApIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzLCByZWN1cnNpdmUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gM0Qgb2JqZWN0IHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdDNEfSBzb3VyY2UgLSBUaGUgM0Qgb2JqZWN0IHRvIGNvcHkuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbcmVjdXJzaXZlPXRydWVdIC0gV2hlbiBzZXQgdG8gYHRydWVgLCBkZXNjZW5kYW50cyBvZiB0aGUgM0Qgb2JqZWN0IGFyZSBjbG9uZWQuXHJcblx0ICogQHJldHVybiB7T2JqZWN0M0R9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y29weSggc291cmNlLCByZWN1cnNpdmUgPSB0cnVlICkge1xyXG5cclxuXHRcdHRoaXMubmFtZSA9IHNvdXJjZS5uYW1lO1xyXG5cclxuXHRcdHRoaXMudXAuY29weSggc291cmNlLnVwICk7XHJcblxyXG5cdFx0dGhpcy5wb3NpdGlvbi5jb3B5KCBzb3VyY2UucG9zaXRpb24gKTtcclxuXHRcdHRoaXMucm90YXRpb24ub3JkZXIgPSBzb3VyY2Uucm90YXRpb24ub3JkZXI7XHJcblx0XHR0aGlzLnF1YXRlcm5pb24uY29weSggc291cmNlLnF1YXRlcm5pb24gKTtcclxuXHRcdHRoaXMuc2NhbGUuY29weSggc291cmNlLnNjYWxlICk7XHJcblxyXG5cdFx0dGhpcy5tYXRyaXguY29weSggc291cmNlLm1hdHJpeCApO1xyXG5cdFx0dGhpcy5tYXRyaXhXb3JsZC5jb3B5KCBzb3VyY2UubWF0cml4V29ybGQgKTtcclxuXHJcblx0XHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBzb3VyY2UubWF0cml4QXV0b1VwZGF0ZTtcclxuXHJcblx0XHR0aGlzLm1hdHJpeFdvcmxkQXV0b1VwZGF0ZSA9IHNvdXJjZS5tYXRyaXhXb3JsZEF1dG9VcGRhdGU7XHJcblx0XHR0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSBzb3VyY2UubWF0cml4V29ybGROZWVkc1VwZGF0ZTtcclxuXHJcblx0XHR0aGlzLmxheWVycy5tYXNrID0gc291cmNlLmxheWVycy5tYXNrO1xyXG5cdFx0dGhpcy52aXNpYmxlID0gc291cmNlLnZpc2libGU7XHJcblxyXG5cdFx0dGhpcy5jYXN0U2hhZG93ID0gc291cmNlLmNhc3RTaGFkb3c7XHJcblx0XHR0aGlzLnJlY2VpdmVTaGFkb3cgPSBzb3VyY2UucmVjZWl2ZVNoYWRvdztcclxuXHJcblx0XHR0aGlzLmZydXN0dW1DdWxsZWQgPSBzb3VyY2UuZnJ1c3R1bUN1bGxlZDtcclxuXHRcdHRoaXMucmVuZGVyT3JkZXIgPSBzb3VyY2UucmVuZGVyT3JkZXI7XHJcblxyXG5cdFx0dGhpcy5hbmltYXRpb25zID0gc291cmNlLmFuaW1hdGlvbnMuc2xpY2UoKTtcclxuXHJcblx0XHR0aGlzLnVzZXJEYXRhID0gSlNPTi5wYXJzZSggSlNPTi5zdHJpbmdpZnkoIHNvdXJjZS51c2VyRGF0YSApICk7XHJcblxyXG5cdFx0aWYgKCByZWN1cnNpdmUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBzb3VyY2UuY2hpbGRyZW4ubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBjaGlsZCA9IHNvdXJjZS5jaGlsZHJlblsgaSBdO1xyXG5cdFx0XHRcdHRoaXMuYWRkKCBjaGlsZC5jbG9uZSgpICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogVGhlIGRlZmF1bHQgdXAgZGlyZWN0aW9uIGZvciBvYmplY3RzLCBhbHNvIHVzZWQgYXMgdGhlIGRlZmF1bHRcclxuICogcG9zaXRpb24gZm9yIHtAbGluayBEaXJlY3Rpb25hbExpZ2h0fSBhbmQge0BsaW5rIEhlbWlzcGhlcmVMaWdodH0uXHJcbiAqXHJcbiAqIEBzdGF0aWNcclxuICogQHR5cGUge1ZlY3RvcjN9XHJcbiAqIEBkZWZhdWx0ICgwLDEsMClcclxuICovXHJcbk9iamVjdDNELkRFRkFVTFRfVVAgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCAwLCAxLCAwICk7XHJcblxyXG4vKipcclxuICogVGhlIGRlZmF1bHQgc2V0dGluZyBmb3Ige0BsaW5rIE9iamVjdDNEI21hdHJpeEF1dG9VcGRhdGV9IGZvclxyXG4gKiBuZXdseSBjcmVhdGVkIDNEIG9iamVjdHMuXHJcbiAqXHJcbiAqIEBzdGF0aWNcclxuICogQHR5cGUge2Jvb2xlYW59XHJcbiAqIEBkZWZhdWx0IHRydWVcclxuICovXHJcbk9iamVjdDNELkRFRkFVTFRfTUFUUklYX0FVVE9fVVBEQVRFID0gdHJ1ZTtcclxuXHJcbi8qKlxyXG4gKiBUaGUgZGVmYXVsdCBzZXR0aW5nIGZvciB7QGxpbmsgT2JqZWN0M0QjbWF0cml4V29ybGRBdXRvVXBkYXRlfSBmb3JcclxuICogbmV3bHkgY3JlYXRlZCAzRCBvYmplY3RzLlxyXG4gKlxyXG4gKiBAc3RhdGljXHJcbiAqIEB0eXBlIHtib29sZWFufVxyXG4gKiBAZGVmYXVsdCB0cnVlXHJcbiAqL1xyXG5PYmplY3QzRC5ERUZBVUxUX01BVFJJWF9XT1JMRF9BVVRPX1VQREFURSA9IHRydWU7XHJcblxyXG5leHBvcnQgeyBPYmplY3QzRCB9O1xyXG4iLCJpbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi9WZWN0b3IzLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yNCB9IGZyb20gJy4vVmVjdG9yNC5qcyc7XHJcblxyXG5jb25zdCBfdjAgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF92MSA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX3YyID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfdjMgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcblxyXG5jb25zdCBfdmFiID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfdmFjID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfdmJjID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfdmFwID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfdmJwID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfdmNwID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5cclxuY29uc3QgX3Y0MCA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjQoKTtcclxuY29uc3QgX3Y0MSA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjQoKTtcclxuY29uc3QgX3Y0MiA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjQoKTtcclxuXHJcbi8qKlxyXG4gKiBBIGdlb21ldHJpYyB0cmlhbmdsZSBhcyBkZWZpbmVkIGJ5IHRocmVlIHZlY3RvcnMgcmVwcmVzZW50aW5nIGl0cyB0aHJlZSBjb3JuZXJzLlxyXG4gKi9cclxuY2xhc3MgVHJpYW5nbGUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHRyaWFuZ2xlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBbYT0oMCwwLDApXSAtIFRoZSBmaXJzdCBjb3JuZXIgb2YgdGhlIHRyaWFuZ2xlLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gW2I9KDAsMCwwKV0gLSBUaGUgc2Vjb25kIGNvcm5lciBvZiB0aGUgdHJpYW5nbGUuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBbYz0oMCwwLDApXSAtIFRoZSB0aGlyZCBjb3JuZXIgb2YgdGhlIHRyaWFuZ2xlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBhID0gbmV3IFZlY3RvcjMoKSwgYiA9IG5ldyBWZWN0b3IzKCksIGMgPSBuZXcgVmVjdG9yMygpICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGZpcnN0IGNvcm5lciBvZiB0aGUgdHJpYW5nbGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjN9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYSA9IGE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc2Vjb25kIGNvcm5lciBvZiB0aGUgdHJpYW5nbGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjN9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYiA9IGI7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdGhpcmQgY29ybmVyIG9mIHRoZSB0cmlhbmdsZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yM31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jID0gYztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB0aGUgbm9ybWFsIHZlY3RvciBvZiBhIHRyaWFuZ2xlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBhIC0gVGhlIGZpcnN0IGNvcm5lciBvZiB0aGUgdHJpYW5nbGUuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBiIC0gVGhlIHNlY29uZCBjb3JuZXIgb2YgdGhlIHRyaWFuZ2xlLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gYyAtIFRoZSB0aGlyZCBjb3JuZXIgb2YgdGhlIHRyaWFuZ2xlLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdGFyZ2V0IC0gVGhlIHRhcmdldCB2ZWN0b3IgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBtZXRob2QncyByZXN1bHQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gVGhlIHRyaWFuZ2xlJ3Mgbm9ybWFsLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBnZXROb3JtYWwoIGEsIGIsIGMsIHRhcmdldCApIHtcclxuXHJcblx0XHR0YXJnZXQuc3ViVmVjdG9ycyggYywgYiApO1xyXG5cdFx0X3YwLnN1YlZlY3RvcnMoIGEsIGIgKTtcclxuXHRcdHRhcmdldC5jcm9zcyggX3YwICk7XHJcblxyXG5cdFx0Y29uc3QgdGFyZ2V0TGVuZ3RoU3EgPSB0YXJnZXQubGVuZ3RoU3EoKTtcclxuXHRcdGlmICggdGFyZ2V0TGVuZ3RoU3EgPiAwICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIHRhcmdldC5tdWx0aXBseVNjYWxhciggMSAvIE1hdGguc3FydCggdGFyZ2V0TGVuZ3RoU3EgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGFyZ2V0LnNldCggMCwgMCwgMCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIGEgYmFyeWNlbnRyaWMgY29vcmRpbmF0ZXMgZnJvbSB0aGUgZ2l2ZW4gdmVjdG9yLlxyXG5cdCAqIFJldHVybnMgYG51bGxgIGlmIHRoZSB0cmlhbmdsZSBpcyBkZWdlbmVyYXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBwb2ludCAtIEEgcG9pbnQgaW4gM0Qgc3BhY2UuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBhIC0gVGhlIGZpcnN0IGNvcm5lciBvZiB0aGUgdHJpYW5nbGUuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBiIC0gVGhlIHNlY29uZCBjb3JuZXIgb2YgdGhlIHRyaWFuZ2xlLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gYyAtIFRoZSB0aGlyZCBjb3JuZXIgb2YgdGhlIHRyaWFuZ2xlLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdGFyZ2V0IC0gVGhlIHRhcmdldCB2ZWN0b3IgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBtZXRob2QncyByZXN1bHQuXHJcblx0ICogQHJldHVybiB7P1ZlY3RvcjN9IFRoZSBiYXJ5Y2VudHJpYyBjb29yZGluYXRlcyBmb3IgdGhlIGdpdmVuIHBvaW50XHJcblx0ICovXHJcblx0c3RhdGljIGdldEJhcnljb29yZCggcG9pbnQsIGEsIGIsIGMsIHRhcmdldCApIHtcclxuXHJcblx0XHQvLyBiYXNlZCBvbjogaHR0cDovL3d3dy5ibGFja3Bhd24uY29tL3RleHRzL3BvaW50aW5wb2x5L2RlZmF1bHQuaHRtbFxyXG5cclxuXHRcdF92MC5zdWJWZWN0b3JzKCBjLCBhICk7XHJcblx0XHRfdjEuc3ViVmVjdG9ycyggYiwgYSApO1xyXG5cdFx0X3YyLnN1YlZlY3RvcnMoIHBvaW50LCBhICk7XHJcblxyXG5cdFx0Y29uc3QgZG90MDAgPSBfdjAuZG90KCBfdjAgKTtcclxuXHRcdGNvbnN0IGRvdDAxID0gX3YwLmRvdCggX3YxICk7XHJcblx0XHRjb25zdCBkb3QwMiA9IF92MC5kb3QoIF92MiApO1xyXG5cdFx0Y29uc3QgZG90MTEgPSBfdjEuZG90KCBfdjEgKTtcclxuXHRcdGNvbnN0IGRvdDEyID0gX3YxLmRvdCggX3YyICk7XHJcblxyXG5cdFx0Y29uc3QgZGVub20gPSAoIGRvdDAwICogZG90MTEgLSBkb3QwMSAqIGRvdDAxICk7XHJcblxyXG5cdFx0Ly8gY29sbGluZWFyIG9yIHNpbmd1bGFyIHRyaWFuZ2xlXHJcblx0XHRpZiAoIGRlbm9tID09PSAwICkge1xyXG5cclxuXHRcdFx0dGFyZ2V0LnNldCggMCwgMCwgMCApO1xyXG5cdFx0XHRyZXR1cm4gbnVsbDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgaW52RGVub20gPSAxIC8gZGVub207XHJcblx0XHRjb25zdCB1ID0gKCBkb3QxMSAqIGRvdDAyIC0gZG90MDEgKiBkb3QxMiApICogaW52RGVub207XHJcblx0XHRjb25zdCB2ID0gKCBkb3QwMCAqIGRvdDEyIC0gZG90MDEgKiBkb3QwMiApICogaW52RGVub207XHJcblxyXG5cdFx0Ly8gYmFyeWNlbnRyaWMgY29vcmRpbmF0ZXMgbXVzdCBhbHdheXMgc3VtIHRvIDFcclxuXHRcdHJldHVybiB0YXJnZXQuc2V0KCAxIC0gdSAtIHYsIHYsIHUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gcG9pbnQsIHdoZW4gcHJvamVjdGVkIG9udG8gdGhlIHBsYW5lIG9mIHRoZVxyXG5cdCAqIHRyaWFuZ2xlLCBsaWVzIHdpdGhpbiB0aGUgdHJpYW5nbGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHBvaW50IC0gVGhlIHBvaW50IGluIDNEIHNwYWNlIHRvIHRlc3QuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBhIC0gVGhlIGZpcnN0IGNvcm5lciBvZiB0aGUgdHJpYW5nbGUuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBiIC0gVGhlIHNlY29uZCBjb3JuZXIgb2YgdGhlIHRyaWFuZ2xlLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gYyAtIFRoZSB0aGlyZCBjb3JuZXIgb2YgdGhlIHRyaWFuZ2xlLlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGdpdmVuIHBvaW50LCB3aGVuIHByb2plY3RlZCBvbnRvIHRoZSBwbGFuZSBvZiB0aGVcclxuXHQgKiB0cmlhbmdsZSwgbGllcyB3aXRoaW4gdGhlIHRyaWFuZ2xlIG9yIG5vdC5cclxuXHQgKi9cclxuXHRzdGF0aWMgY29udGFpbnNQb2ludCggcG9pbnQsIGEsIGIsIGMgKSB7XHJcblxyXG5cdFx0Ly8gaWYgdGhlIHRyaWFuZ2xlIGlzIGRlZ2VuZXJhdGUgdGhlbiB3ZSBjYW4ndCBjb250YWluIGEgcG9pbnRcclxuXHRcdGlmICggdGhpcy5nZXRCYXJ5Y29vcmQoIHBvaW50LCBhLCBiLCBjLCBfdjMgKSA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuICggX3YzLnggPj0gMCApICYmICggX3YzLnkgPj0gMCApICYmICggKCBfdjMueCArIF92My55ICkgPD0gMSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSB2YWx1ZSBiYXJ5Y2VudHJpY2FsbHkgaW50ZXJwb2xhdGVkIGZvciB0aGUgZ2l2ZW4gcG9pbnQgb24gdGhlXHJcblx0ICogdHJpYW5nbGUuIFJldHVybnMgYG51bGxgIGlmIHRoZSB0cmlhbmdsZSBpcyBkZWdlbmVyYXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBwb2ludCAtIFBvc2l0aW9uIG9mIGludGVycG9sYXRlZCBwb2ludC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHAxIC0gVGhlIGZpcnN0IGNvcm5lciBvZiB0aGUgdHJpYW5nbGUuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBwMiAtIFRoZSBzZWNvbmQgY29ybmVyIG9mIHRoZSB0cmlhbmdsZS5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHAzIC0gVGhlIHRoaXJkIGNvcm5lciBvZiB0aGUgdHJpYW5nbGUuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB2MSAtIFZhbHVlIHRvIGludGVycG9sYXRlIG9mIGZpcnN0IHZlcnRleC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHYyIC0gVmFsdWUgdG8gaW50ZXJwb2xhdGUgb2Ygc2Vjb25kIHZlcnRleC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHYzIC0gVmFsdWUgdG8gaW50ZXJwb2xhdGUgb2YgdGhpcmQgdmVydGV4LlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdGFyZ2V0IC0gVGhlIHRhcmdldCB2ZWN0b3IgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBtZXRob2QncyByZXN1bHQuXHJcblx0ICogQHJldHVybiB7P1ZlY3RvcjN9IFRoZSBpbnRlcnBvbGF0ZWQgdmFsdWUuXHJcblx0ICovXHJcblx0c3RhdGljIGdldEludGVycG9sYXRpb24oIHBvaW50LCBwMSwgcDIsIHAzLCB2MSwgdjIsIHYzLCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmdldEJhcnljb29yZCggcG9pbnQsIHAxLCBwMiwgcDMsIF92MyApID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGFyZ2V0LnggPSAwO1xyXG5cdFx0XHR0YXJnZXQueSA9IDA7XHJcblx0XHRcdGlmICggJ3onIGluIHRhcmdldCApIHRhcmdldC56ID0gMDtcclxuXHRcdFx0aWYgKCAndycgaW4gdGFyZ2V0ICkgdGFyZ2V0LncgPSAwO1xyXG5cdFx0XHRyZXR1cm4gbnVsbDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGFyZ2V0LnNldFNjYWxhciggMCApO1xyXG5cdFx0dGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggdjEsIF92My54ICk7XHJcblx0XHR0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKCB2MiwgX3YzLnkgKTtcclxuXHRcdHRhcmdldC5hZGRTY2FsZWRWZWN0b3IoIHYzLCBfdjMueiApO1xyXG5cclxuXHRcdHJldHVybiB0YXJnZXQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgdGhlIHZhbHVlIGJhcnljZW50cmljYWxseSBpbnRlcnBvbGF0ZWQgZm9yIHRoZSBnaXZlbiBhdHRyaWJ1dGUgYW5kIGluZGljZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0J1ZmZlckF0dHJpYnV0ZX0gYXR0ciAtIFRoZSBhdHRyaWJ1dGUgdG8gaW50ZXJwb2xhdGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGkxIC0gSW5kZXggb2YgZmlyc3QgdmVydGV4LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpMiAtIEluZGV4IG9mIHNlY29uZCB2ZXJ0ZXguXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGkzIC0gSW5kZXggb2YgdGhpcmQgdmVydGV4LlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gYmFyeWNvb3JkIC0gVGhlIGJhcnljb29yZGluYXRlIHZhbHVlIHRvIHVzZSB0byBpbnRlcnBvbGF0ZS5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHRhcmdldCAtIFRoZSB0YXJnZXQgdmVjdG9yIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbWV0aG9kJ3MgcmVzdWx0LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IFRoZSBpbnRlcnBvbGF0ZWQgYXR0cmlidXRlIHZhbHVlLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBnZXRJbnRlcnBvbGF0ZWRBdHRyaWJ1dGUoIGF0dHIsIGkxLCBpMiwgaTMsIGJhcnljb29yZCwgdGFyZ2V0ICkge1xyXG5cclxuXHRcdF92NDAuc2V0U2NhbGFyKCAwICk7XHJcblx0XHRfdjQxLnNldFNjYWxhciggMCApO1xyXG5cdFx0X3Y0Mi5zZXRTY2FsYXIoIDAgKTtcclxuXHJcblx0XHRfdjQwLmZyb21CdWZmZXJBdHRyaWJ1dGUoIGF0dHIsIGkxICk7XHJcblx0XHRfdjQxLmZyb21CdWZmZXJBdHRyaWJ1dGUoIGF0dHIsIGkyICk7XHJcblx0XHRfdjQyLmZyb21CdWZmZXJBdHRyaWJ1dGUoIGF0dHIsIGkzICk7XHJcblxyXG5cdFx0dGFyZ2V0LnNldFNjYWxhciggMCApO1xyXG5cdFx0dGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggX3Y0MCwgYmFyeWNvb3JkLnggKTtcclxuXHRcdHRhcmdldC5hZGRTY2FsZWRWZWN0b3IoIF92NDEsIGJhcnljb29yZC55ICk7XHJcblx0XHR0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKCBfdjQyLCBiYXJ5Y29vcmQueiApO1xyXG5cclxuXHRcdHJldHVybiB0YXJnZXQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHRyaWFuZ2xlIGlzIG9yaWVudGVkIHRvd2FyZHMgdGhlIGdpdmVuIGRpcmVjdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gYSAtIFRoZSBmaXJzdCBjb3JuZXIgb2YgdGhlIHRyaWFuZ2xlLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gYiAtIFRoZSBzZWNvbmQgY29ybmVyIG9mIHRoZSB0cmlhbmdsZS5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IGMgLSBUaGUgdGhpcmQgY29ybmVyIG9mIHRoZSB0cmlhbmdsZS5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IGRpcmVjdGlvbiAtIFRoZSAobm9ybWFsaXplZCkgZGlyZWN0aW9uIHZlY3Rvci5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSB0cmlhbmdsZSBpcyBvcmllbnRlZCB0b3dhcmRzIHRoZSBnaXZlbiBkaXJlY3Rpb24gb3Igbm90LlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBpc0Zyb250RmFjaW5nKCBhLCBiLCBjLCBkaXJlY3Rpb24gKSB7XHJcblxyXG5cdFx0X3YwLnN1YlZlY3RvcnMoIGMsIGIgKTtcclxuXHRcdF92MS5zdWJWZWN0b3JzKCBhLCBiICk7XHJcblxyXG5cdFx0Ly8gc3RyaWN0bHkgZnJvbnQgZmFjaW5nXHJcblx0XHRyZXR1cm4gKCBfdjAuY3Jvc3MoIF92MSApLmRvdCggZGlyZWN0aW9uICkgPCAwICkgPyB0cnVlIDogZmFsc2U7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdHJpYW5nbGUncyB2ZXJ0aWNlcyBieSBjb3B5aW5nIHRoZSBnaXZlbiB2YWx1ZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IGEgLSBUaGUgZmlyc3QgY29ybmVyIG9mIHRoZSB0cmlhbmdsZS5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IGIgLSBUaGUgc2Vjb25kIGNvcm5lciBvZiB0aGUgdHJpYW5nbGUuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBjIC0gVGhlIHRoaXJkIGNvcm5lciBvZiB0aGUgdHJpYW5nbGUuXHJcblx0ICogQHJldHVybiB7VHJpYW5nbGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdHJpYW5nbGUuXHJcblx0ICovXHJcblx0c2V0KCBhLCBiLCBjICkge1xyXG5cclxuXHRcdHRoaXMuYS5jb3B5KCBhICk7XHJcblx0XHR0aGlzLmIuY29weSggYiApO1xyXG5cdFx0dGhpcy5jLmNvcHkoIGMgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB0cmlhbmdsZSdzIHZlcnRpY2VzIGJ5IGNvcHlpbmcgdGhlIGdpdmVuIGFycmF5IHZhbHVlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8VmVjdG9yMz59IHBvaW50cyAtIEFuIGFycmF5IHdpdGggM0QgcG9pbnRzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpMCAtIFRoZSBhcnJheSBpbmRleCByZXByZXNlbnRpbmcgdGhlIGZpcnN0IGNvcm5lciBvZiB0aGUgdHJpYW5nbGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGkxIC0gVGhlIGFycmF5IGluZGV4IHJlcHJlc2VudGluZyB0aGUgc2Vjb25kIGNvcm5lciBvZiB0aGUgdHJpYW5nbGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGkyIC0gVGhlIGFycmF5IGluZGV4IHJlcHJlc2VudGluZyB0aGUgdGhpcmQgY29ybmVyIG9mIHRoZSB0cmlhbmdsZS5cclxuXHQgKiBAcmV0dXJuIHtUcmlhbmdsZX0gQSByZWZlcmVuY2UgdG8gdGhpcyB0cmlhbmdsZS5cclxuXHQgKi9cclxuXHRzZXRGcm9tUG9pbnRzQW5kSW5kaWNlcyggcG9pbnRzLCBpMCwgaTEsIGkyICkge1xyXG5cclxuXHRcdHRoaXMuYS5jb3B5KCBwb2ludHNbIGkwIF0gKTtcclxuXHRcdHRoaXMuYi5jb3B5KCBwb2ludHNbIGkxIF0gKTtcclxuXHRcdHRoaXMuYy5jb3B5KCBwb2ludHNbIGkyIF0gKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB0cmlhbmdsZSdzIHZlcnRpY2VzIGJ5IGNvcHlpbmcgdGhlIGdpdmVuIGF0dHJpYnV0ZSB2YWx1ZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0J1ZmZlckF0dHJpYnV0ZX0gYXR0cmlidXRlIC0gQSBidWZmZXIgYXR0cmlidXRlIHdpdGggM0QgcG9pbnRzIGRhdGEuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGkwIC0gVGhlIGF0dHJpYnV0ZSBpbmRleCByZXByZXNlbnRpbmcgdGhlIGZpcnN0IGNvcm5lciBvZiB0aGUgdHJpYW5nbGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGkxIC0gVGhlIGF0dHJpYnV0ZSBpbmRleCByZXByZXNlbnRpbmcgdGhlIHNlY29uZCBjb3JuZXIgb2YgdGhlIHRyaWFuZ2xlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpMiAtIFRoZSBhdHRyaWJ1dGUgaW5kZXggcmVwcmVzZW50aW5nIHRoZSB0aGlyZCBjb3JuZXIgb2YgdGhlIHRyaWFuZ2xlLlxyXG5cdCAqIEByZXR1cm4ge1RyaWFuZ2xlfSBBIHJlZmVyZW5jZSB0byB0aGlzIHRyaWFuZ2xlLlxyXG5cdCAqL1xyXG5cdHNldEZyb21BdHRyaWJ1dGVBbmRJbmRpY2VzKCBhdHRyaWJ1dGUsIGkwLCBpMSwgaTIgKSB7XHJcblxyXG5cdFx0dGhpcy5hLmZyb21CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgaTAgKTtcclxuXHRcdHRoaXMuYi5mcm9tQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGkxICk7XHJcblx0XHR0aGlzLmMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlLCBpMiApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBuZXcgdHJpYW5nbGUgd2l0aCBjb3BpZWQgdmFsdWVzIGZyb20gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1RyaWFuZ2xlfSBBIGNsb25lIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y2xvbmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvcGllcyB0aGUgdmFsdWVzIG9mIHRoZSBnaXZlbiB0cmlhbmdsZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUcmlhbmdsZX0gdHJpYW5nbGUgLSBUaGUgdHJpYW5nbGUgdG8gY29weS5cclxuXHQgKiBAcmV0dXJuIHtUcmlhbmdsZX0gQSByZWZlcmVuY2UgdG8gdGhpcyB0cmlhbmdsZS5cclxuXHQgKi9cclxuXHRjb3B5KCB0cmlhbmdsZSApIHtcclxuXHJcblx0XHR0aGlzLmEuY29weSggdHJpYW5nbGUuYSApO1xyXG5cdFx0dGhpcy5iLmNvcHkoIHRyaWFuZ2xlLmIgKTtcclxuXHRcdHRoaXMuYy5jb3B5KCB0cmlhbmdsZS5jICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgdGhlIGFyZWEgb2YgdGhlIHRyaWFuZ2xlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgdHJpYW5nbGUncyBhcmVhLlxyXG5cdCAqL1xyXG5cdGdldEFyZWEoKSB7XHJcblxyXG5cdFx0X3YwLnN1YlZlY3RvcnMoIHRoaXMuYywgdGhpcy5iICk7XHJcblx0XHRfdjEuc3ViVmVjdG9ycyggdGhpcy5hLCB0aGlzLmIgKTtcclxuXHJcblx0XHRyZXR1cm4gX3YwLmNyb3NzKCBfdjEgKS5sZW5ndGgoKSAqIDAuNTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB0aGUgbWlkcG9pbnQgb2YgdGhlIHRyaWFuZ2xlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IHZlY3RvciB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGhvZCdzIHJlc3VsdC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBUaGUgdHJpYW5nbGUncyBtaWRwb2ludC5cclxuXHQgKi9cclxuXHRnZXRNaWRwb2ludCggdGFyZ2V0ICkge1xyXG5cclxuXHRcdHJldHVybiB0YXJnZXQuYWRkVmVjdG9ycyggdGhpcy5hLCB0aGlzLmIgKS5hZGQoIHRoaXMuYyApLm11bHRpcGx5U2NhbGFyKCAxIC8gMyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSBub3JtYWwgb2YgdGhlIHRyaWFuZ2xlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IHZlY3RvciB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGhvZCdzIHJlc3VsdC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBUaGUgdHJpYW5nbGUncyBub3JtYWwuXHJcblx0ICovXHJcblx0Z2V0Tm9ybWFsKCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0cmV0dXJuIFRyaWFuZ2xlLmdldE5vcm1hbCggdGhpcy5hLCB0aGlzLmIsIHRoaXMuYywgdGFyZ2V0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgYSBwbGFuZSB0aGUgdHJpYW5nbGUgbGllcyB3aXRoaW4uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1BsYW5lfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IHZlY3RvciB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGhvZCdzIHJlc3VsdC5cclxuXHQgKiBAcmV0dXJuIHtQbGFuZX0gVGhlIHBsYW5lIHRoZSB0cmlhbmdsZSBsaWVzIHdpdGhpbi5cclxuXHQgKi9cclxuXHRnZXRQbGFuZSggdGFyZ2V0ICkge1xyXG5cclxuXHRcdHJldHVybiB0YXJnZXQuc2V0RnJvbUNvcGxhbmFyUG9pbnRzKCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5jICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgYSBiYXJ5Y2VudHJpYyBjb29yZGluYXRlcyBmcm9tIHRoZSBnaXZlbiB2ZWN0b3IuXHJcblx0ICogUmV0dXJucyBgbnVsbGAgaWYgdGhlIHRyaWFuZ2xlIGlzIGRlZ2VuZXJhdGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHBvaW50IC0gQSBwb2ludCBpbiAzRCBzcGFjZS5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHRhcmdldCAtIFRoZSB0YXJnZXQgdmVjdG9yIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbWV0aG9kJ3MgcmVzdWx0LlxyXG5cdCAqIEByZXR1cm4gez9WZWN0b3IzfSBUaGUgYmFyeWNlbnRyaWMgY29vcmRpbmF0ZXMgZm9yIHRoZSBnaXZlbiBwb2ludFxyXG5cdCAqL1xyXG5cdGdldEJhcnljb29yZCggcG9pbnQsIHRhcmdldCApIHtcclxuXHJcblx0XHRyZXR1cm4gVHJpYW5nbGUuZ2V0QmFyeWNvb3JkKCBwb2ludCwgdGhpcy5hLCB0aGlzLmIsIHRoaXMuYywgdGFyZ2V0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgdGhlIHZhbHVlIGJhcnljZW50cmljYWxseSBpbnRlcnBvbGF0ZWQgZm9yIHRoZSBnaXZlbiBwb2ludCBvbiB0aGVcclxuXHQgKiB0cmlhbmdsZS4gUmV0dXJucyBgbnVsbGAgaWYgdGhlIHRyaWFuZ2xlIGlzIGRlZ2VuZXJhdGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHBvaW50IC0gUG9zaXRpb24gb2YgaW50ZXJwb2xhdGVkIHBvaW50LlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdjEgLSBWYWx1ZSB0byBpbnRlcnBvbGF0ZSBvZiBmaXJzdCB2ZXJ0ZXguXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB2MiAtIFZhbHVlIHRvIGludGVycG9sYXRlIG9mIHNlY29uZCB2ZXJ0ZXguXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB2MyAtIFZhbHVlIHRvIGludGVycG9sYXRlIG9mIHRoaXJkIHZlcnRleC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHRhcmdldCAtIFRoZSB0YXJnZXQgdmVjdG9yIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbWV0aG9kJ3MgcmVzdWx0LlxyXG5cdCAqIEByZXR1cm4gez9WZWN0b3IzfSBUaGUgaW50ZXJwb2xhdGVkIHZhbHVlLlxyXG5cdCAqL1xyXG5cdGdldEludGVycG9sYXRpb24oIHBvaW50LCB2MSwgdjIsIHYzLCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0cmV0dXJuIFRyaWFuZ2xlLmdldEludGVycG9sYXRpb24oIHBvaW50LCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5jLCB2MSwgdjIsIHYzLCB0YXJnZXQgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gcG9pbnQsIHdoZW4gcHJvamVjdGVkIG9udG8gdGhlIHBsYW5lIG9mIHRoZVxyXG5cdCAqIHRyaWFuZ2xlLCBsaWVzIHdpdGhpbiB0aGUgdHJpYW5nbGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHBvaW50IC0gVGhlIHBvaW50IGluIDNEIHNwYWNlIHRvIHRlc3QuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZ2l2ZW4gcG9pbnQsIHdoZW4gcHJvamVjdGVkIG9udG8gdGhlIHBsYW5lIG9mIHRoZVxyXG5cdCAqIHRyaWFuZ2xlLCBsaWVzIHdpdGhpbiB0aGUgdHJpYW5nbGUgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGNvbnRhaW5zUG9pbnQoIHBvaW50ICkge1xyXG5cclxuXHRcdHJldHVybiBUcmlhbmdsZS5jb250YWluc1BvaW50KCBwb2ludCwgdGhpcy5hLCB0aGlzLmIsIHRoaXMuYyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSB0cmlhbmdsZSBpcyBvcmllbnRlZCB0b3dhcmRzIHRoZSBnaXZlbiBkaXJlY3Rpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IGRpcmVjdGlvbiAtIFRoZSAobm9ybWFsaXplZCkgZGlyZWN0aW9uIHZlY3Rvci5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSB0cmlhbmdsZSBpcyBvcmllbnRlZCB0b3dhcmRzIHRoZSBnaXZlbiBkaXJlY3Rpb24gb3Igbm90LlxyXG5cdCAqL1xyXG5cdGlzRnJvbnRGYWNpbmcoIGRpcmVjdGlvbiApIHtcclxuXHJcblx0XHRyZXR1cm4gVHJpYW5nbGUuaXNGcm9udEZhY2luZyggdGhpcy5hLCB0aGlzLmIsIHRoaXMuYywgZGlyZWN0aW9uICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyB0cmlhbmdsZSBpbnRlcnNlY3RzIHdpdGggdGhlIGdpdmVuIGJveC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Qm94M30gYm94IC0gVGhlIGJveCB0byBpbnRlcnNlY3QuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGlzIHRyaWFuZ2xlIGludGVyc2VjdHMgd2l0aCB0aGUgZ2l2ZW4gYm94IG9yIG5vdC5cclxuXHQgKi9cclxuXHRpbnRlcnNlY3RzQm94KCBib3ggKSB7XHJcblxyXG5cdFx0cmV0dXJuIGJveC5pbnRlcnNlY3RzVHJpYW5nbGUoIHRoaXMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBjbG9zZXN0IHBvaW50IG9uIHRoZSB0cmlhbmdsZSB0byB0aGUgZ2l2ZW4gcG9pbnQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHAgLSBUaGUgcG9pbnQgdG8gY29tcHV0ZSB0aGUgY2xvc2VzdCBwb2ludCBmb3IuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IHZlY3RvciB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGhvZCdzIHJlc3VsdC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBUaGUgY2xvc2VzdCBwb2ludCBvbiB0aGUgdHJpYW5nbGUuXHJcblx0ICovXHJcblx0Y2xvc2VzdFBvaW50VG9Qb2ludCggcCwgdGFyZ2V0ICkge1xyXG5cclxuXHRcdGNvbnN0IGEgPSB0aGlzLmEsIGIgPSB0aGlzLmIsIGMgPSB0aGlzLmM7XHJcblx0XHRsZXQgdiwgdztcclxuXHJcblx0XHQvLyBhbGdvcml0aG0gdGhhbmtzIHRvIFJlYWwtVGltZSBDb2xsaXNpb24gRGV0ZWN0aW9uIGJ5IENocmlzdGVyIEVyaWNzb24sXHJcblx0XHQvLyBwdWJsaXNoZWQgYnkgTW9yZ2FuIEthdWZtYW5uIFB1Ymxpc2hlcnMsIChjKSAyMDA1IEVsc2V2aWVyIEluYy4sXHJcblx0XHQvLyB1bmRlciB0aGUgYWNjb21wYW55aW5nIGxpY2Vuc2U7IHNlZSBjaGFwdGVyIDUuMS41IGZvciBkZXRhaWxlZCBleHBsYW5hdGlvbi5cclxuXHRcdC8vIGJhc2ljYWxseSwgd2UncmUgZGlzdGluZ3Vpc2hpbmcgd2hpY2ggb2YgdGhlIHZvcm9ub2kgcmVnaW9ucyBvZiB0aGUgdHJpYW5nbGVcclxuXHRcdC8vIHRoZSBwb2ludCBsaWVzIGluIHdpdGggdGhlIG1pbmltdW0gYW1vdW50IG9mIHJlZHVuZGFudCBjb21wdXRhdGlvbi5cclxuXHJcblx0XHRfdmFiLnN1YlZlY3RvcnMoIGIsIGEgKTtcclxuXHRcdF92YWMuc3ViVmVjdG9ycyggYywgYSApO1xyXG5cdFx0X3ZhcC5zdWJWZWN0b3JzKCBwLCBhICk7XHJcblx0XHRjb25zdCBkMSA9IF92YWIuZG90KCBfdmFwICk7XHJcblx0XHRjb25zdCBkMiA9IF92YWMuZG90KCBfdmFwICk7XHJcblx0XHRpZiAoIGQxIDw9IDAgJiYgZDIgPD0gMCApIHtcclxuXHJcblx0XHRcdC8vIHZlcnRleCByZWdpb24gb2YgQTsgYmFyeWNlbnRyaWMgY29vcmRzICgxLCAwLCAwKVxyXG5cdFx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIGEgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0X3ZicC5zdWJWZWN0b3JzKCBwLCBiICk7XHJcblx0XHRjb25zdCBkMyA9IF92YWIuZG90KCBfdmJwICk7XHJcblx0XHRjb25zdCBkNCA9IF92YWMuZG90KCBfdmJwICk7XHJcblx0XHRpZiAoIGQzID49IDAgJiYgZDQgPD0gZDMgKSB7XHJcblxyXG5cdFx0XHQvLyB2ZXJ0ZXggcmVnaW9uIG9mIEI7IGJhcnljZW50cmljIGNvb3JkcyAoMCwgMSwgMClcclxuXHRcdFx0cmV0dXJuIHRhcmdldC5jb3B5KCBiICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHZjID0gZDEgKiBkNCAtIGQzICogZDI7XHJcblx0XHRpZiAoIHZjIDw9IDAgJiYgZDEgPj0gMCAmJiBkMyA8PSAwICkge1xyXG5cclxuXHRcdFx0diA9IGQxIC8gKCBkMSAtIGQzICk7XHJcblx0XHRcdC8vIGVkZ2UgcmVnaW9uIG9mIEFCOyBiYXJ5Y2VudHJpYyBjb29yZHMgKDEtdiwgdiwgMClcclxuXHRcdFx0cmV0dXJuIHRhcmdldC5jb3B5KCBhICkuYWRkU2NhbGVkVmVjdG9yKCBfdmFiLCB2ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdF92Y3Auc3ViVmVjdG9ycyggcCwgYyApO1xyXG5cdFx0Y29uc3QgZDUgPSBfdmFiLmRvdCggX3ZjcCApO1xyXG5cdFx0Y29uc3QgZDYgPSBfdmFjLmRvdCggX3ZjcCApO1xyXG5cdFx0aWYgKCBkNiA+PSAwICYmIGQ1IDw9IGQ2ICkge1xyXG5cclxuXHRcdFx0Ly8gdmVydGV4IHJlZ2lvbiBvZiBDOyBiYXJ5Y2VudHJpYyBjb29yZHMgKDAsIDAsIDEpXHJcblx0XHRcdHJldHVybiB0YXJnZXQuY29weSggYyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCB2YiA9IGQ1ICogZDIgLSBkMSAqIGQ2O1xyXG5cdFx0aWYgKCB2YiA8PSAwICYmIGQyID49IDAgJiYgZDYgPD0gMCApIHtcclxuXHJcblx0XHRcdHcgPSBkMiAvICggZDIgLSBkNiApO1xyXG5cdFx0XHQvLyBlZGdlIHJlZ2lvbiBvZiBBQzsgYmFyeWNlbnRyaWMgY29vcmRzICgxLXcsIDAsIHcpXHJcblx0XHRcdHJldHVybiB0YXJnZXQuY29weSggYSApLmFkZFNjYWxlZFZlY3RvciggX3ZhYywgdyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCB2YSA9IGQzICogZDYgLSBkNSAqIGQ0O1xyXG5cdFx0aWYgKCB2YSA8PSAwICYmICggZDQgLSBkMyApID49IDAgJiYgKCBkNSAtIGQ2ICkgPj0gMCApIHtcclxuXHJcblx0XHRcdF92YmMuc3ViVmVjdG9ycyggYywgYiApO1xyXG5cdFx0XHR3ID0gKCBkNCAtIGQzICkgLyAoICggZDQgLSBkMyApICsgKCBkNSAtIGQ2ICkgKTtcclxuXHRcdFx0Ly8gZWRnZSByZWdpb24gb2YgQkM7IGJhcnljZW50cmljIGNvb3JkcyAoMCwgMS13LCB3KVxyXG5cdFx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIGIgKS5hZGRTY2FsZWRWZWN0b3IoIF92YmMsIHcgKTsgLy8gZWRnZSByZWdpb24gb2YgQkNcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gZmFjZSByZWdpb25cclxuXHRcdGNvbnN0IGRlbm9tID0gMSAvICggdmEgKyB2YiArIHZjICk7XHJcblx0XHQvLyB1ID0gdmEgKiBkZW5vbVxyXG5cdFx0diA9IHZiICogZGVub207XHJcblx0XHR3ID0gdmMgKiBkZW5vbTtcclxuXHJcblx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIGEgKS5hZGRTY2FsZWRWZWN0b3IoIF92YWIsIHYgKS5hZGRTY2FsZWRWZWN0b3IoIF92YWMsIHcgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIHRyaWFuZ2xlIGlzIGVxdWFsIHdpdGggdGhlIGdpdmVuIG9uZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VHJpYW5nbGV9IHRyaWFuZ2xlIC0gVGhlIHRyaWFuZ2xlIHRvIHRlc3QgZm9yIGVxdWFsaXR5LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyB0cmlhbmdsZSBpcyBlcXVhbCB3aXRoIHRoZSBnaXZlbiBvbmUuXHJcblx0ICovXHJcblx0ZXF1YWxzKCB0cmlhbmdsZSApIHtcclxuXHJcblx0XHRyZXR1cm4gdHJpYW5nbGUuYS5lcXVhbHMoIHRoaXMuYSApICYmIHRyaWFuZ2xlLmIuZXF1YWxzKCB0aGlzLmIgKSAmJiB0cmlhbmdsZS5jLmVxdWFscyggdGhpcy5jICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFRyaWFuZ2xlIH07XHJcbiIsImltcG9ydCB7IGNsYW1wLCBldWNsaWRlYW5Nb2R1bG8sIGxlcnAgfSBmcm9tICcuL01hdGhVdGlscy5qcyc7XHJcbmltcG9ydCB7IENvbG9yTWFuYWdlbWVudCwgU1JHQlRvTGluZWFyLCBMaW5lYXJUb1NSR0IgfSBmcm9tICcuL0NvbG9yTWFuYWdlbWVudC5qcyc7XHJcbmltcG9ydCB7IFNSR0JDb2xvclNwYWNlIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcclxuXHJcbmNvbnN0IF9jb2xvcktleXdvcmRzID0geyAnYWxpY2VibHVlJzogMHhGMEY4RkYsICdhbnRpcXVld2hpdGUnOiAweEZBRUJENywgJ2FxdWEnOiAweDAwRkZGRiwgJ2FxdWFtYXJpbmUnOiAweDdGRkZENCwgJ2F6dXJlJzogMHhGMEZGRkYsXHJcblx0J2JlaWdlJzogMHhGNUY1REMsICdiaXNxdWUnOiAweEZGRTRDNCwgJ2JsYWNrJzogMHgwMDAwMDAsICdibGFuY2hlZGFsbW9uZCc6IDB4RkZFQkNELCAnYmx1ZSc6IDB4MDAwMEZGLCAnYmx1ZXZpb2xldCc6IDB4OEEyQkUyLFxyXG5cdCdicm93bic6IDB4QTUyQTJBLCAnYnVybHl3b29kJzogMHhERUI4ODcsICdjYWRldGJsdWUnOiAweDVGOUVBMCwgJ2NoYXJ0cmV1c2UnOiAweDdGRkYwMCwgJ2Nob2NvbGF0ZSc6IDB4RDI2OTFFLCAnY29yYWwnOiAweEZGN0Y1MCxcclxuXHQnY29ybmZsb3dlcmJsdWUnOiAweDY0OTVFRCwgJ2Nvcm5zaWxrJzogMHhGRkY4REMsICdjcmltc29uJzogMHhEQzE0M0MsICdjeWFuJzogMHgwMEZGRkYsICdkYXJrYmx1ZSc6IDB4MDAwMDhCLCAnZGFya2N5YW4nOiAweDAwOEI4QixcclxuXHQnZGFya2dvbGRlbnJvZCc6IDB4Qjg4NjBCLCAnZGFya2dyYXknOiAweEE5QTlBOSwgJ2RhcmtncmVlbic6IDB4MDA2NDAwLCAnZGFya2dyZXknOiAweEE5QTlBOSwgJ2RhcmtraGFraSc6IDB4QkRCNzZCLCAnZGFya21hZ2VudGEnOiAweDhCMDA4QixcclxuXHQnZGFya29saXZlZ3JlZW4nOiAweDU1NkIyRiwgJ2RhcmtvcmFuZ2UnOiAweEZGOEMwMCwgJ2RhcmtvcmNoaWQnOiAweDk5MzJDQywgJ2RhcmtyZWQnOiAweDhCMDAwMCwgJ2RhcmtzYWxtb24nOiAweEU5OTY3QSwgJ2RhcmtzZWFncmVlbic6IDB4OEZCQzhGLFxyXG5cdCdkYXJrc2xhdGVibHVlJzogMHg0ODNEOEIsICdkYXJrc2xhdGVncmF5JzogMHgyRjRGNEYsICdkYXJrc2xhdGVncmV5JzogMHgyRjRGNEYsICdkYXJrdHVycXVvaXNlJzogMHgwMENFRDEsICdkYXJrdmlvbGV0JzogMHg5NDAwRDMsXHJcblx0J2RlZXBwaW5rJzogMHhGRjE0OTMsICdkZWVwc2t5Ymx1ZSc6IDB4MDBCRkZGLCAnZGltZ3JheSc6IDB4Njk2OTY5LCAnZGltZ3JleSc6IDB4Njk2OTY5LCAnZG9kZ2VyYmx1ZSc6IDB4MUU5MEZGLCAnZmlyZWJyaWNrJzogMHhCMjIyMjIsXHJcblx0J2Zsb3JhbHdoaXRlJzogMHhGRkZBRjAsICdmb3Jlc3RncmVlbic6IDB4MjI4QjIyLCAnZnVjaHNpYSc6IDB4RkYwMEZGLCAnZ2FpbnNib3JvJzogMHhEQ0RDREMsICdnaG9zdHdoaXRlJzogMHhGOEY4RkYsICdnb2xkJzogMHhGRkQ3MDAsXHJcblx0J2dvbGRlbnJvZCc6IDB4REFBNTIwLCAnZ3JheSc6IDB4ODA4MDgwLCAnZ3JlZW4nOiAweDAwODAwMCwgJ2dyZWVueWVsbG93JzogMHhBREZGMkYsICdncmV5JzogMHg4MDgwODAsICdob25leWRldyc6IDB4RjBGRkYwLCAnaG90cGluayc6IDB4RkY2OUI0LFxyXG5cdCdpbmRpYW5yZWQnOiAweENENUM1QywgJ2luZGlnbyc6IDB4NEIwMDgyLCAnaXZvcnknOiAweEZGRkZGMCwgJ2toYWtpJzogMHhGMEU2OEMsICdsYXZlbmRlcic6IDB4RTZFNkZBLCAnbGF2ZW5kZXJibHVzaCc6IDB4RkZGMEY1LCAnbGF3bmdyZWVuJzogMHg3Q0ZDMDAsXHJcblx0J2xlbW9uY2hpZmZvbic6IDB4RkZGQUNELCAnbGlnaHRibHVlJzogMHhBREQ4RTYsICdsaWdodGNvcmFsJzogMHhGMDgwODAsICdsaWdodGN5YW4nOiAweEUwRkZGRiwgJ2xpZ2h0Z29sZGVucm9keWVsbG93JzogMHhGQUZBRDIsICdsaWdodGdyYXknOiAweEQzRDNEMyxcclxuXHQnbGlnaHRncmVlbic6IDB4OTBFRTkwLCAnbGlnaHRncmV5JzogMHhEM0QzRDMsICdsaWdodHBpbmsnOiAweEZGQjZDMSwgJ2xpZ2h0c2FsbW9uJzogMHhGRkEwN0EsICdsaWdodHNlYWdyZWVuJzogMHgyMEIyQUEsICdsaWdodHNreWJsdWUnOiAweDg3Q0VGQSxcclxuXHQnbGlnaHRzbGF0ZWdyYXknOiAweDc3ODg5OSwgJ2xpZ2h0c2xhdGVncmV5JzogMHg3Nzg4OTksICdsaWdodHN0ZWVsYmx1ZSc6IDB4QjBDNERFLCAnbGlnaHR5ZWxsb3cnOiAweEZGRkZFMCwgJ2xpbWUnOiAweDAwRkYwMCwgJ2xpbWVncmVlbic6IDB4MzJDRDMyLFxyXG5cdCdsaW5lbic6IDB4RkFGMEU2LCAnbWFnZW50YSc6IDB4RkYwMEZGLCAnbWFyb29uJzogMHg4MDAwMDAsICdtZWRpdW1hcXVhbWFyaW5lJzogMHg2NkNEQUEsICdtZWRpdW1ibHVlJzogMHgwMDAwQ0QsICdtZWRpdW1vcmNoaWQnOiAweEJBNTVEMyxcclxuXHQnbWVkaXVtcHVycGxlJzogMHg5MzcwREIsICdtZWRpdW1zZWFncmVlbic6IDB4M0NCMzcxLCAnbWVkaXVtc2xhdGVibHVlJzogMHg3QjY4RUUsICdtZWRpdW1zcHJpbmdncmVlbic6IDB4MDBGQTlBLCAnbWVkaXVtdHVycXVvaXNlJzogMHg0OEQxQ0MsXHJcblx0J21lZGl1bXZpb2xldHJlZCc6IDB4QzcxNTg1LCAnbWlkbmlnaHRibHVlJzogMHgxOTE5NzAsICdtaW50Y3JlYW0nOiAweEY1RkZGQSwgJ21pc3R5cm9zZSc6IDB4RkZFNEUxLCAnbW9jY2FzaW4nOiAweEZGRTRCNSwgJ25hdmFqb3doaXRlJzogMHhGRkRFQUQsXHJcblx0J25hdnknOiAweDAwMDA4MCwgJ29sZGxhY2UnOiAweEZERjVFNiwgJ29saXZlJzogMHg4MDgwMDAsICdvbGl2ZWRyYWInOiAweDZCOEUyMywgJ29yYW5nZSc6IDB4RkZBNTAwLCAnb3JhbmdlcmVkJzogMHhGRjQ1MDAsICdvcmNoaWQnOiAweERBNzBENixcclxuXHQncGFsZWdvbGRlbnJvZCc6IDB4RUVFOEFBLCAncGFsZWdyZWVuJzogMHg5OEZCOTgsICdwYWxldHVycXVvaXNlJzogMHhBRkVFRUUsICdwYWxldmlvbGV0cmVkJzogMHhEQjcwOTMsICdwYXBheWF3aGlwJzogMHhGRkVGRDUsICdwZWFjaHB1ZmYnOiAweEZGREFCOSxcclxuXHQncGVydSc6IDB4Q0Q4NTNGLCAncGluayc6IDB4RkZDMENCLCAncGx1bSc6IDB4RERBMERELCAncG93ZGVyYmx1ZSc6IDB4QjBFMEU2LCAncHVycGxlJzogMHg4MDAwODAsICdyZWJlY2NhcHVycGxlJzogMHg2NjMzOTksICdyZWQnOiAweEZGMDAwMCwgJ3Jvc3licm93bic6IDB4QkM4RjhGLFxyXG5cdCdyb3lhbGJsdWUnOiAweDQxNjlFMSwgJ3NhZGRsZWJyb3duJzogMHg4QjQ1MTMsICdzYWxtb24nOiAweEZBODA3MiwgJ3NhbmR5YnJvd24nOiAweEY0QTQ2MCwgJ3NlYWdyZWVuJzogMHgyRThCNTcsICdzZWFzaGVsbCc6IDB4RkZGNUVFLFxyXG5cdCdzaWVubmEnOiAweEEwNTIyRCwgJ3NpbHZlcic6IDB4QzBDMEMwLCAnc2t5Ymx1ZSc6IDB4ODdDRUVCLCAnc2xhdGVibHVlJzogMHg2QTVBQ0QsICdzbGF0ZWdyYXknOiAweDcwODA5MCwgJ3NsYXRlZ3JleSc6IDB4NzA4MDkwLCAnc25vdyc6IDB4RkZGQUZBLFxyXG5cdCdzcHJpbmdncmVlbic6IDB4MDBGRjdGLCAnc3RlZWxibHVlJzogMHg0NjgyQjQsICd0YW4nOiAweEQyQjQ4QywgJ3RlYWwnOiAweDAwODA4MCwgJ3RoaXN0bGUnOiAweEQ4QkZEOCwgJ3RvbWF0byc6IDB4RkY2MzQ3LCAndHVycXVvaXNlJzogMHg0MEUwRDAsXHJcblx0J3Zpb2xldCc6IDB4RUU4MkVFLCAnd2hlYXQnOiAweEY1REVCMywgJ3doaXRlJzogMHhGRkZGRkYsICd3aGl0ZXNtb2tlJzogMHhGNUY1RjUsICd5ZWxsb3cnOiAweEZGRkYwMCwgJ3llbGxvd2dyZWVuJzogMHg5QUNEMzIgfTtcclxuXHJcbmNvbnN0IF9oc2xBID0geyBoOiAwLCBzOiAwLCBsOiAwIH07XHJcbmNvbnN0IF9oc2xCID0geyBoOiAwLCBzOiAwLCBsOiAwIH07XHJcblxyXG5mdW5jdGlvbiBodWUycmdiKCBwLCBxLCB0ICkge1xyXG5cclxuXHRpZiAoIHQgPCAwICkgdCArPSAxO1xyXG5cdGlmICggdCA+IDEgKSB0IC09IDE7XHJcblx0aWYgKCB0IDwgMSAvIDYgKSByZXR1cm4gcCArICggcSAtIHAgKSAqIDYgKiB0O1xyXG5cdGlmICggdCA8IDEgLyAyICkgcmV0dXJuIHE7XHJcblx0aWYgKCB0IDwgMiAvIDMgKSByZXR1cm4gcCArICggcSAtIHAgKSAqIDYgKiAoIDIgLyAzIC0gdCApO1xyXG5cdHJldHVybiBwO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIEEgQ29sb3IgaW5zdGFuY2UgaXMgcmVwcmVzZW50ZWQgYnkgUkdCIGNvbXBvbmVudHMgaW4gdGhlIGxpbmVhciA8aT53b3JraW5nXHJcbiAqIGNvbG9yIHNwYWNlPC9pPiwgd2hpY2ggZGVmYXVsdHMgdG8gYExpbmVhclNSR0JDb2xvclNwYWNlYC4gSW5wdXRzXHJcbiAqIGNvbnZlbnRpb25hbGx5IHVzaW5nIGBTUkdCQ29sb3JTcGFjZWAgKHN1Y2ggYXMgaGV4YWRlY2ltYWxzIGFuZCBDU1NcclxuICogc3RyaW5ncykgYXJlIGNvbnZlcnRlZCB0byB0aGUgd29ya2luZyBjb2xvciBzcGFjZSBhdXRvbWF0aWNhbGx5LlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiAvLyBjb252ZXJ0ZWQgYXV0b21hdGljYWxseSBmcm9tIFNSR0JDb2xvclNwYWNlIHRvIExpbmVhclNSR0JDb2xvclNwYWNlXHJcbiAqIGNvbnN0IGNvbG9yID0gbmV3IFRIUkVFLkNvbG9yKCkuc2V0SGV4KCAweDExMjIzMyApO1xyXG4gKiBgYGBcclxuICogU291cmNlIGNvbG9yIHNwYWNlcyBtYXkgYmUgc3BlY2lmaWVkIGV4cGxpY2l0bHksIHRvIGVuc3VyZSBjb3JyZWN0IGNvbnZlcnNpb25zLlxyXG4gKiBgYGBqc1xyXG4gKiAvLyBhc3N1bWVkIGFscmVhZHkgTGluZWFyU1JHQkNvbG9yU3BhY2U7IG5vIGNvbnZlcnNpb25cclxuICogY29uc3QgY29sb3IgPSBuZXcgVEhSRUUuQ29sb3IoKS5zZXRSR0IoIDAuNSwgMC41LCAwLjUgKTtcclxuICpcclxuICogLy8gY29udmVydGVkIGV4cGxpY2l0bHkgZnJvbSBTUkdCQ29sb3JTcGFjZSB0byBMaW5lYXJTUkdCQ29sb3JTcGFjZVxyXG4gKiBjb25zdCBjb2xvciA9IG5ldyBUSFJFRS5Db2xvcigpLnNldFJHQiggMC41LCAwLjUsIDAuNSwgU1JHQkNvbG9yU3BhY2UgKTtcclxuICogYGBgXHJcbiAqIElmIFRIUkVFLkNvbG9yTWFuYWdlbWVudCBpcyBkaXNhYmxlZCwgbm8gY29udmVyc2lvbnMgb2NjdXIuIEZvciBkZXRhaWxzLFxyXG4gKiBzZWUgPGk+Q29sb3IgbWFuYWdlbWVudDwvaT4uIEl0ZXJhdGluZyB0aHJvdWdoIGEgQ29sb3IgaW5zdGFuY2Ugd2lsbCB5aWVsZFxyXG4gKiBpdHMgY29tcG9uZW50cyAociwgZywgYikgaW4gdGhlIGNvcnJlc3BvbmRpbmcgb3JkZXIuIEEgQ29sb3IgY2FuIGJlIGluaXRpYWxpc2VkXHJcbiAqIGluIGFueSBvZiB0aGUgZm9sbG93aW5nIHdheXM6XHJcbiAqIGBgYGpzXHJcbiAqIC8vZW1wdHkgY29uc3RydWN0b3IgLSB3aWxsIGRlZmF1bHQgd2hpdGVcclxuICogY29uc3QgY29sb3IxID0gbmV3IFRIUkVFLkNvbG9yKCk7XHJcbiAqXHJcbiAqIC8vSGV4YWRlY2ltYWwgY29sb3IgKHJlY29tbWVuZGVkKVxyXG4gKiBjb25zdCBjb2xvcjIgPSBuZXcgVEhSRUUuQ29sb3IoIDB4ZmYwMDAwICk7XHJcbiAqXHJcbiAqIC8vUkdCIHN0cmluZ1xyXG4gKiBjb25zdCBjb2xvcjMgPSBuZXcgVEhSRUUuQ29sb3IoXCJyZ2IoMjU1LCAwLCAwKVwiKTtcclxuICogY29uc3QgY29sb3I0ID0gbmV3IFRIUkVFLkNvbG9yKFwicmdiKDEwMCUsIDAlLCAwJSlcIik7XHJcbiAqXHJcbiAqIC8vWDExIGNvbG9yIG5hbWUgLSBhbGwgMTQwIGNvbG9yIG5hbWVzIGFyZSBzdXBwb3J0ZWQuXHJcbiAqIC8vTm90ZSB0aGUgbGFjayBvZiBDYW1lbENhc2UgaW4gdGhlIG5hbWVcclxuICogY29uc3QgY29sb3I1ID0gbmV3IFRIUkVFLkNvbG9yKCAnc2t5Ymx1ZScgKTtcclxuICogLy9IU0wgc3RyaW5nXHJcbiAqIGNvbnN0IGNvbG9yNiA9IG5ldyBUSFJFRS5Db2xvcihcImhzbCgwLCAxMDAlLCA1MCUpXCIpO1xyXG4gKlxyXG4gKiAvL1NlcGFyYXRlIFJHQiB2YWx1ZXMgYmV0d2VlbiAwIGFuZCAxXHJcbiAqIGNvbnN0IGNvbG9yNyA9IG5ldyBUSFJFRS5Db2xvciggMSwgMCwgMCApO1xyXG4gKiBgYGBcclxuICovXHJcbmNsYXNzIENvbG9yIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBjb2xvci5cclxuXHQgKlxyXG5cdCAqIE5vdGUgdGhhdCBzdGFuZGFyZCBtZXRob2Qgb2Ygc3BlY2lmeWluZyBjb2xvciBpbiB0aHJlZS5qcyBpcyB3aXRoIGEgaGV4YWRlY2ltYWwgdHJpcGxldCxcclxuXHQgKiBhbmQgdGhhdCBtZXRob2QgaXMgdXNlZCB0aHJvdWdob3V0IHRoZSByZXN0IG9mIHRoZSBkb2N1bWVudGF0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHsobnVtYmVyfHN0cmluZ3xDb2xvcil9IFtyXSAtIFRoZSByZWQgY29tcG9uZW50IG9mIHRoZSBjb2xvci4gSWYgYGdgIGFuZCBgYmAgYXJlXHJcblx0ICogbm90IHByb3ZpZGVkLCBpdCBjYW4gYmUgaGV4YWRlY2ltYWwgdHJpcGxldCwgYSBDU1Mtc3R5bGUgc3RyaW5nIG9yIGFub3RoZXIgYENvbG9yYCBpbnN0YW5jZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2ddIC0gVGhlIGdyZWVuIGNvbXBvbmVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2JdIC0gVGhlIGJsdWUgY29tcG9uZW50LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCByLCBnLCBiICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0NvbG9yID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByZWQgY29tcG9uZW50LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuciA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZ3JlZW4gY29tcG9uZW50LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZyA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYmx1ZSBjb21wb25lbnQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5iID0gMTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5zZXQoIHIsIGcsIGIgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBjb2xvcnMncyBjb21wb25lbnRzIGZyb20gdGhlIGdpdmVuIHZhbHVlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7KG51bWJlcnxzdHJpbmd8Q29sb3IpfSBbcl0gLSBUaGUgcmVkIGNvbXBvbmVudCBvZiB0aGUgY29sb3IuIElmIGBnYCBhbmQgYGJgIGFyZVxyXG5cdCAqIG5vdCBwcm92aWRlZCwgaXQgY2FuIGJlIGhleGFkZWNpbWFsIHRyaXBsZXQsIGEgQ1NTLXN0eWxlIHN0cmluZyBvciBhbm90aGVyIGBDb2xvcmAgaW5zdGFuY2UuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtnXSAtIFRoZSBncmVlbiBjb21wb25lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtiXSAtIFRoZSBibHVlIGNvbXBvbmVudC5cclxuXHQgKiBAcmV0dXJuIHtDb2xvcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBjb2xvci5cclxuXHQgKi9cclxuXHRzZXQoIHIsIGcsIGIgKSB7XHJcblxyXG5cdFx0aWYgKCBnID09PSB1bmRlZmluZWQgJiYgYiA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Ly8gciBpcyBUSFJFRS5Db2xvciwgaGV4IG9yIHN0cmluZ1xyXG5cclxuXHRcdFx0Y29uc3QgdmFsdWUgPSByO1xyXG5cclxuXHRcdFx0aWYgKCB2YWx1ZSAmJiB2YWx1ZS5pc0NvbG9yICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLmNvcHkoIHZhbHVlICk7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLnNldEhleCggdmFsdWUgKTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgKSB7XHJcblxyXG5cdFx0XHRcdHRoaXMuc2V0U3R5bGUoIHZhbHVlICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHRoaXMuc2V0UkdCKCByLCBnLCBiICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGNvbG9ycydzIGNvbXBvbmVudHMgdG8gdGhlIGdpdmVuIHNjYWxhciB2YWx1ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzY2FsYXIgLSBUaGUgc2NhbGFyIHZhbHVlLlxyXG5cdCAqIEByZXR1cm4ge0NvbG9yfSBBIHJlZmVyZW5jZSB0byB0aGlzIGNvbG9yLlxyXG5cdCAqL1xyXG5cdHNldFNjYWxhciggc2NhbGFyICkge1xyXG5cclxuXHRcdHRoaXMuciA9IHNjYWxhcjtcclxuXHRcdHRoaXMuZyA9IHNjYWxhcjtcclxuXHRcdHRoaXMuYiA9IHNjYWxhcjtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoaXMgY29sb3IgZnJvbSBhIGhleGFkZWNpbWFsIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGhleCAtIFRoZSBoZXhhZGVjaW1hbCB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW2NvbG9yU3BhY2U9U1JHQkNvbG9yU3BhY2VdIC0gVGhlIGNvbG9yIHNwYWNlLlxyXG5cdCAqIEByZXR1cm4ge0NvbG9yfSBBIHJlZmVyZW5jZSB0byB0aGlzIGNvbG9yLlxyXG5cdCAqL1xyXG5cdHNldEhleCggaGV4LCBjb2xvclNwYWNlID0gU1JHQkNvbG9yU3BhY2UgKSB7XHJcblxyXG5cdFx0aGV4ID0gTWF0aC5mbG9vciggaGV4ICk7XHJcblxyXG5cdFx0dGhpcy5yID0gKCBoZXggPj4gMTYgJiAyNTUgKSAvIDI1NTtcclxuXHRcdHRoaXMuZyA9ICggaGV4ID4+IDggJiAyNTUgKSAvIDI1NTtcclxuXHRcdHRoaXMuYiA9ICggaGV4ICYgMjU1ICkgLyAyNTU7XHJcblxyXG5cdFx0Q29sb3JNYW5hZ2VtZW50LnRvV29ya2luZ0NvbG9yU3BhY2UoIHRoaXMsIGNvbG9yU3BhY2UgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoaXMgY29sb3IgZnJvbSBSR0IgdmFsdWVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHIgLSBSZWQgY2hhbm5lbCB2YWx1ZSBiZXR3ZWVuIGAwLjBgIGFuZCBgMS4wYC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZyAtIEdyZWVuIGNoYW5uZWwgdmFsdWUgYmV0d2VlbiBgMC4wYCBhbmQgYDEuMGAuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGIgLSBCbHVlIGNoYW5uZWwgdmFsdWUgYmV0d2VlbiBgMC4wYCBhbmQgYDEuMGAuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtjb2xvclNwYWNlPUNvbG9yTWFuYWdlbWVudC53b3JraW5nQ29sb3JTcGFjZV0gLSBUaGUgY29sb3Igc3BhY2UuXHJcblx0ICogQHJldHVybiB7Q29sb3J9IEEgcmVmZXJlbmNlIHRvIHRoaXMgY29sb3IuXHJcblx0ICovXHJcblx0c2V0UkdCKCByLCBnLCBiLCBjb2xvclNwYWNlID0gQ29sb3JNYW5hZ2VtZW50LndvcmtpbmdDb2xvclNwYWNlICkge1xyXG5cclxuXHRcdHRoaXMuciA9IHI7XHJcblx0XHR0aGlzLmcgPSBnO1xyXG5cdFx0dGhpcy5iID0gYjtcclxuXHJcblx0XHRDb2xvck1hbmFnZW1lbnQudG9Xb3JraW5nQ29sb3JTcGFjZSggdGhpcywgY29sb3JTcGFjZSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhpcyBjb2xvciBmcm9tIFJHQiB2YWx1ZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaCAtIEh1ZSB2YWx1ZSBiZXR3ZWVuIGAwLjBgIGFuZCBgMS4wYC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gcyAtIFNhdHVyYXRpb24gdmFsdWUgYmV0d2VlbiBgMC4wYCBhbmQgYDEuMGAuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGwgLSBMaWdodG5lc3MgdmFsdWUgYmV0d2VlbiBgMC4wYCBhbmQgYDEuMGAuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtjb2xvclNwYWNlPUNvbG9yTWFuYWdlbWVudC53b3JraW5nQ29sb3JTcGFjZV0gLSBUaGUgY29sb3Igc3BhY2UuXHJcblx0ICogQHJldHVybiB7Q29sb3J9IEEgcmVmZXJlbmNlIHRvIHRoaXMgY29sb3IuXHJcblx0ICovXHJcblx0c2V0SFNMKCBoLCBzLCBsLCBjb2xvclNwYWNlID0gQ29sb3JNYW5hZ2VtZW50LndvcmtpbmdDb2xvclNwYWNlICkge1xyXG5cclxuXHRcdC8vIGgscyxsIHJhbmdlcyBhcmUgaW4gMC4wIC0gMS4wXHJcblx0XHRoID0gZXVjbGlkZWFuTW9kdWxvKCBoLCAxICk7XHJcblx0XHRzID0gY2xhbXAoIHMsIDAsIDEgKTtcclxuXHRcdGwgPSBjbGFtcCggbCwgMCwgMSApO1xyXG5cclxuXHRcdGlmICggcyA9PT0gMCApIHtcclxuXHJcblx0XHRcdHRoaXMuciA9IHRoaXMuZyA9IHRoaXMuYiA9IGw7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGNvbnN0IHAgPSBsIDw9IDAuNSA/IGwgKiAoIDEgKyBzICkgOiBsICsgcyAtICggbCAqIHMgKTtcclxuXHRcdFx0Y29uc3QgcSA9ICggMiAqIGwgKSAtIHA7XHJcblxyXG5cdFx0XHR0aGlzLnIgPSBodWUycmdiKCBxLCBwLCBoICsgMSAvIDMgKTtcclxuXHRcdFx0dGhpcy5nID0gaHVlMnJnYiggcSwgcCwgaCApO1xyXG5cdFx0XHR0aGlzLmIgPSBodWUycmdiKCBxLCBwLCBoIC0gMSAvIDMgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Q29sb3JNYW5hZ2VtZW50LnRvV29ya2luZ0NvbG9yU3BhY2UoIHRoaXMsIGNvbG9yU3BhY2UgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoaXMgY29sb3IgZnJvbSBhIENTUy1zdHlsZSBzdHJpbmcuIEZvciBleGFtcGxlLCBgcmdiKDI1MCwgMCwwKWAsXHJcblx0ICogYHJnYigxMDAlLCAwJSwgMCUpYCwgYGhzbCgwLCAxMDAlLCA1MCUpYCwgYCNmZjAwMDBgLCBgI2YwMGAsIG9yIGByZWRgICggb3JcclxuXHQgKiBhbnkgW1gxMSBjb2xvciBuYW1lXXtAbGluayBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9YMTFfY29sb3JfbmFtZXMjQ29sb3JfbmFtZV9jaGFydH0gLVxyXG5cdCAqIGFsbCAxNDAgY29sb3IgbmFtZXMgYXJlIHN1cHBvcnRlZCkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc3R5bGUgLSBDb2xvciBhcyBhIENTUy1zdHlsZSBzdHJpbmcuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtjb2xvclNwYWNlPVNSR0JDb2xvclNwYWNlXSAtIFRoZSBjb2xvciBzcGFjZS5cclxuXHQgKiBAcmV0dXJuIHtDb2xvcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBjb2xvci5cclxuXHQgKi9cclxuXHRzZXRTdHlsZSggc3R5bGUsIGNvbG9yU3BhY2UgPSBTUkdCQ29sb3JTcGFjZSApIHtcclxuXHJcblx0XHRmdW5jdGlvbiBoYW5kbGVBbHBoYSggc3RyaW5nICkge1xyXG5cclxuXHRcdFx0aWYgKCBzdHJpbmcgPT09IHVuZGVmaW5lZCApIHJldHVybjtcclxuXHJcblx0XHRcdGlmICggcGFyc2VGbG9hdCggc3RyaW5nICkgPCAxICkge1xyXG5cclxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Db2xvcjogQWxwaGEgY29tcG9uZW50IG9mICcgKyBzdHlsZSArICcgd2lsbCBiZSBpZ25vcmVkLicgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cclxuXHRcdGxldCBtO1xyXG5cclxuXHRcdGlmICggbSA9IC9eKFxcdyspXFwoKFteXFwpXSopXFwpLy5leGVjKCBzdHlsZSApICkge1xyXG5cclxuXHRcdFx0Ly8gcmdiIC8gaHNsXHJcblxyXG5cdFx0XHRsZXQgY29sb3I7XHJcblx0XHRcdGNvbnN0IG5hbWUgPSBtWyAxIF07XHJcblx0XHRcdGNvbnN0IGNvbXBvbmVudHMgPSBtWyAyIF07XHJcblxyXG5cdFx0XHRzd2l0Y2ggKCBuYW1lICkge1xyXG5cclxuXHRcdFx0XHRjYXNlICdyZ2InOlxyXG5cdFx0XHRcdGNhc2UgJ3JnYmEnOlxyXG5cclxuXHRcdFx0XHRcdGlmICggY29sb3IgPSAvXlxccyooXFxkKylcXHMqLFxccyooXFxkKylcXHMqLFxccyooXFxkKylcXHMqKD86LFxccyooXFxkKlxcLj9cXGQrKVxccyopPyQvLmV4ZWMoIGNvbXBvbmVudHMgKSApIHtcclxuXHJcblx0XHRcdFx0XHRcdC8vIHJnYigyNTUsMCwwKSByZ2JhKDI1NSwwLDAsMC41KVxyXG5cclxuXHRcdFx0XHRcdFx0aGFuZGxlQWxwaGEoIGNvbG9yWyA0IF0gKTtcclxuXHJcblx0XHRcdFx0XHRcdHJldHVybiB0aGlzLnNldFJHQihcclxuXHRcdFx0XHRcdFx0XHRNYXRoLm1pbiggMjU1LCBwYXJzZUludCggY29sb3JbIDEgXSwgMTAgKSApIC8gMjU1LFxyXG5cdFx0XHRcdFx0XHRcdE1hdGgubWluKCAyNTUsIHBhcnNlSW50KCBjb2xvclsgMiBdLCAxMCApICkgLyAyNTUsXHJcblx0XHRcdFx0XHRcdFx0TWF0aC5taW4oIDI1NSwgcGFyc2VJbnQoIGNvbG9yWyAzIF0sIDEwICkgKSAvIDI1NSxcclxuXHRcdFx0XHRcdFx0XHRjb2xvclNwYWNlXHJcblx0XHRcdFx0XHRcdCk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGlmICggY29sb3IgPSAvXlxccyooXFxkKylcXCVcXHMqLFxccyooXFxkKylcXCVcXHMqLFxccyooXFxkKylcXCVcXHMqKD86LFxccyooXFxkKlxcLj9cXGQrKVxccyopPyQvLmV4ZWMoIGNvbXBvbmVudHMgKSApIHtcclxuXHJcblx0XHRcdFx0XHRcdC8vIHJnYigxMDAlLDAlLDAlKSByZ2JhKDEwMCUsMCUsMCUsMC41KVxyXG5cclxuXHRcdFx0XHRcdFx0aGFuZGxlQWxwaGEoIGNvbG9yWyA0IF0gKTtcclxuXHJcblx0XHRcdFx0XHRcdHJldHVybiB0aGlzLnNldFJHQihcclxuXHRcdFx0XHRcdFx0XHRNYXRoLm1pbiggMTAwLCBwYXJzZUludCggY29sb3JbIDEgXSwgMTAgKSApIC8gMTAwLFxyXG5cdFx0XHRcdFx0XHRcdE1hdGgubWluKCAxMDAsIHBhcnNlSW50KCBjb2xvclsgMiBdLCAxMCApICkgLyAxMDAsXHJcblx0XHRcdFx0XHRcdFx0TWF0aC5taW4oIDEwMCwgcGFyc2VJbnQoIGNvbG9yWyAzIF0sIDEwICkgKSAvIDEwMCxcclxuXHRcdFx0XHRcdFx0XHRjb2xvclNwYWNlXHJcblx0XHRcdFx0XHRcdCk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRjYXNlICdoc2wnOlxyXG5cdFx0XHRcdGNhc2UgJ2hzbGEnOlxyXG5cclxuXHRcdFx0XHRcdGlmICggY29sb3IgPSAvXlxccyooXFxkKlxcLj9cXGQrKVxccyosXFxzKihcXGQqXFwuP1xcZCspXFwlXFxzKixcXHMqKFxcZCpcXC4/XFxkKylcXCVcXHMqKD86LFxccyooXFxkKlxcLj9cXGQrKVxccyopPyQvLmV4ZWMoIGNvbXBvbmVudHMgKSApIHtcclxuXHJcblx0XHRcdFx0XHRcdC8vIGhzbCgxMjAsNTAlLDUwJSkgaHNsYSgxMjAsNTAlLDUwJSwwLjUpXHJcblxyXG5cdFx0XHRcdFx0XHRoYW5kbGVBbHBoYSggY29sb3JbIDQgXSApO1xyXG5cclxuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuc2V0SFNMKFxyXG5cdFx0XHRcdFx0XHRcdHBhcnNlRmxvYXQoIGNvbG9yWyAxIF0gKSAvIDM2MCxcclxuXHRcdFx0XHRcdFx0XHRwYXJzZUZsb2F0KCBjb2xvclsgMiBdICkgLyAxMDAsXHJcblx0XHRcdFx0XHRcdFx0cGFyc2VGbG9hdCggY29sb3JbIDMgXSApIC8gMTAwLFxyXG5cdFx0XHRcdFx0XHRcdGNvbG9yU3BhY2VcclxuXHRcdFx0XHRcdFx0KTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdGRlZmF1bHQ6XHJcblxyXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ29sb3I6IFVua25vd24gY29sb3IgbW9kZWwgJyArIHN0eWxlICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmICggbSA9IC9eXFwjKFtBLUZhLWZcXGRdKykkLy5leGVjKCBzdHlsZSApICkge1xyXG5cclxuXHRcdFx0Ly8gaGV4IGNvbG9yXHJcblxyXG5cdFx0XHRjb25zdCBoZXggPSBtWyAxIF07XHJcblx0XHRcdGNvbnN0IHNpemUgPSBoZXgubGVuZ3RoO1xyXG5cclxuXHRcdFx0aWYgKCBzaXplID09PSAzICkge1xyXG5cclxuXHRcdFx0XHQvLyAjZmYwXHJcblx0XHRcdFx0cmV0dXJuIHRoaXMuc2V0UkdCKFxyXG5cdFx0XHRcdFx0cGFyc2VJbnQoIGhleC5jaGFyQXQoIDAgKSwgMTYgKSAvIDE1LFxyXG5cdFx0XHRcdFx0cGFyc2VJbnQoIGhleC5jaGFyQXQoIDEgKSwgMTYgKSAvIDE1LFxyXG5cdFx0XHRcdFx0cGFyc2VJbnQoIGhleC5jaGFyQXQoIDIgKSwgMTYgKSAvIDE1LFxyXG5cdFx0XHRcdFx0Y29sb3JTcGFjZVxyXG5cdFx0XHRcdCk7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBzaXplID09PSA2ICkge1xyXG5cclxuXHRcdFx0XHQvLyAjZmYwMDAwXHJcblx0XHRcdFx0cmV0dXJuIHRoaXMuc2V0SGV4KCBwYXJzZUludCggaGV4LCAxNiApLCBjb2xvclNwYWNlICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Db2xvcjogSW52YWxpZCBoZXggY29sb3IgJyArIHN0eWxlICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmICggc3R5bGUgJiYgc3R5bGUubGVuZ3RoID4gMCApIHtcclxuXHJcblx0XHRcdHJldHVybiB0aGlzLnNldENvbG9yTmFtZSggc3R5bGUsIGNvbG9yU3BhY2UgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGlzIGNvbG9yIGZyb20gYSBjb2xvciBuYW1lLiBGYXN0ZXIgdGhhbiB7QGxpbmsgQ29sb3Ijc2V0U3R5bGV9IGlmXHJcblx0ICogeW91IGRvbid0IG5lZWQgdGhlIG90aGVyIENTUy1zdHlsZSBmb3JtYXRzLlxyXG5cdCAqXHJcblx0ICogRm9yIGNvbnZlbmllbmNlLCB0aGUgbGlzdCBvZiBuYW1lcyBpcyBleHBvc2VkIGluIGBDb2xvci5OQU1FU2AgYXMgYSBoYXNoLlxyXG5cdCAqIGBgYGpzXHJcblx0ICogQ29sb3IuTkFNRVMuYWxpY2VibHVlIC8vIHJldHVybnMgMHhGMEY4RkZcclxuXHQgKiBgYGBcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzdHlsZSAtIFRoZSBjb2xvciBuYW1lLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbY29sb3JTcGFjZT1TUkdCQ29sb3JTcGFjZV0gLSBUaGUgY29sb3Igc3BhY2UuXHJcblx0ICogQHJldHVybiB7Q29sb3J9IEEgcmVmZXJlbmNlIHRvIHRoaXMgY29sb3IuXHJcblx0ICovXHJcblx0c2V0Q29sb3JOYW1lKCBzdHlsZSwgY29sb3JTcGFjZSA9IFNSR0JDb2xvclNwYWNlICkge1xyXG5cclxuXHRcdC8vIGNvbG9yIGtleXdvcmRzXHJcblx0XHRjb25zdCBoZXggPSBfY29sb3JLZXl3b3Jkc1sgc3R5bGUudG9Mb3dlckNhc2UoKSBdO1xyXG5cclxuXHRcdGlmICggaGV4ICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHQvLyByZWRcclxuXHRcdFx0dGhpcy5zZXRIZXgoIGhleCwgY29sb3JTcGFjZSApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHQvLyB1bmtub3duIGNvbG9yXHJcblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkNvbG9yOiBVbmtub3duIGNvbG9yICcgKyBzdHlsZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbmV3IGNvbG9yIHdpdGggY29waWVkIHZhbHVlcyBmcm9tIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtDb2xvcn0gQSBjbG9uZSBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNsb25lKCkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5yLCB0aGlzLmcsIHRoaXMuYiApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvcGllcyB0aGUgdmFsdWVzIG9mIHRoZSBnaXZlbiBjb2xvciB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtDb2xvcn0gY29sb3IgLSBUaGUgY29sb3IgdG8gY29weS5cclxuXHQgKiBAcmV0dXJuIHtDb2xvcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBjb2xvci5cclxuXHQgKi9cclxuXHRjb3B5KCBjb2xvciApIHtcclxuXHJcblx0XHR0aGlzLnIgPSBjb2xvci5yO1xyXG5cdFx0dGhpcy5nID0gY29sb3IuZztcclxuXHRcdHRoaXMuYiA9IGNvbG9yLmI7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29waWVzIHRoZSBnaXZlbiBjb2xvciBpbnRvIHRoaXMgY29sb3IsIGFuZCB0aGVuIGNvbnZlcnRzIHRoaXMgY29sb3IgZnJvbVxyXG5cdCAqIGBTUkdCQ29sb3JTcGFjZWAgdG8gYExpbmVhclNSR0JDb2xvclNwYWNlYC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Q29sb3J9IGNvbG9yIC0gVGhlIGNvbG9yIHRvIGNvcHkvY29udmVydC5cclxuXHQgKiBAcmV0dXJuIHtDb2xvcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBjb2xvci5cclxuXHQgKi9cclxuXHRjb3B5U1JHQlRvTGluZWFyKCBjb2xvciApIHtcclxuXHJcblx0XHR0aGlzLnIgPSBTUkdCVG9MaW5lYXIoIGNvbG9yLnIgKTtcclxuXHRcdHRoaXMuZyA9IFNSR0JUb0xpbmVhciggY29sb3IuZyApO1xyXG5cdFx0dGhpcy5iID0gU1JHQlRvTGluZWFyKCBjb2xvci5iICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29waWVzIHRoZSBnaXZlbiBjb2xvciBpbnRvIHRoaXMgY29sb3IsIGFuZCB0aGVuIGNvbnZlcnRzIHRoaXMgY29sb3IgZnJvbVxyXG5cdCAqIGBMaW5lYXJTUkdCQ29sb3JTcGFjZWAgdG8gYFNSR0JDb2xvclNwYWNlYC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Q29sb3J9IGNvbG9yIC0gVGhlIGNvbG9yIHRvIGNvcHkvY29udmVydC5cclxuXHQgKiBAcmV0dXJuIHtDb2xvcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBjb2xvci5cclxuXHQgKi9cclxuXHRjb3B5TGluZWFyVG9TUkdCKCBjb2xvciApIHtcclxuXHJcblx0XHR0aGlzLnIgPSBMaW5lYXJUb1NSR0IoIGNvbG9yLnIgKTtcclxuXHRcdHRoaXMuZyA9IExpbmVhclRvU1JHQiggY29sb3IuZyApO1xyXG5cdFx0dGhpcy5iID0gTGluZWFyVG9TUkdCKCBjb2xvci5iICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29udmVydHMgdGhpcyBjb2xvciBmcm9tIGBTUkdCQ29sb3JTcGFjZWAgdG8gYExpbmVhclNSR0JDb2xvclNwYWNlYC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0NvbG9yfSBBIHJlZmVyZW5jZSB0byB0aGlzIGNvbG9yLlxyXG5cdCAqL1xyXG5cdGNvbnZlcnRTUkdCVG9MaW5lYXIoKSB7XHJcblxyXG5cdFx0dGhpcy5jb3B5U1JHQlRvTGluZWFyKCB0aGlzICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29udmVydHMgdGhpcyBjb2xvciBmcm9tIGBMaW5lYXJTUkdCQ29sb3JTcGFjZWAgdG8gYFNSR0JDb2xvclNwYWNlYC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0NvbG9yfSBBIHJlZmVyZW5jZSB0byB0aGlzIGNvbG9yLlxyXG5cdCAqL1xyXG5cdGNvbnZlcnRMaW5lYXJUb1NSR0IoKSB7XHJcblxyXG5cdFx0dGhpcy5jb3B5TGluZWFyVG9TUkdCKCB0aGlzICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgaGV4YWRlY2ltYWwgdmFsdWUgb2YgdGhpcyBjb2xvci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbY29sb3JTcGFjZT1TUkdCQ29sb3JTcGFjZV0gLSBUaGUgY29sb3Igc3BhY2UuXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgaGV4YWRlY2ltYWwgdmFsdWUuXHJcblx0ICovXHJcblx0Z2V0SGV4KCBjb2xvclNwYWNlID0gU1JHQkNvbG9yU3BhY2UgKSB7XHJcblxyXG5cdFx0Q29sb3JNYW5hZ2VtZW50LmZyb21Xb3JraW5nQ29sb3JTcGFjZSggX2NvbG9yLmNvcHkoIHRoaXMgKSwgY29sb3JTcGFjZSApO1xyXG5cclxuXHRcdHJldHVybiBNYXRoLnJvdW5kKCBjbGFtcCggX2NvbG9yLnIgKiAyNTUsIDAsIDI1NSApICkgKiA2NTUzNiArIE1hdGgucm91bmQoIGNsYW1wKCBfY29sb3IuZyAqIDI1NSwgMCwgMjU1ICkgKSAqIDI1NiArIE1hdGgucm91bmQoIGNsYW1wKCBfY29sb3IuYiAqIDI1NSwgMCwgMjU1ICkgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBoZXhhZGVjaW1hbCB2YWx1ZSBvZiB0aGlzIGNvbG9yIGFzIGEgc3RyaW5nIChmb3IgZXhhbXBsZSwgJ0ZGRkZGRicpLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtjb2xvclNwYWNlPVNSR0JDb2xvclNwYWNlXSAtIFRoZSBjb2xvciBzcGFjZS5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBoZXhhZGVjaW1hbCB2YWx1ZSBhcyBhIHN0cmluZy5cclxuXHQgKi9cclxuXHRnZXRIZXhTdHJpbmcoIGNvbG9yU3BhY2UgPSBTUkdCQ29sb3JTcGFjZSApIHtcclxuXHJcblx0XHRyZXR1cm4gKCAnMDAwMDAwJyArIHRoaXMuZ2V0SGV4KCBjb2xvclNwYWNlICkudG9TdHJpbmcoIDE2ICkgKS5zbGljZSggLSA2ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29udmVydHMgdGhlIGNvbG9ycyBSR0IgdmFsdWVzIGludG8gdGhlIEhTTCBmb3JtYXQgYW5kIHN0b3JlcyB0aGVtIGludG8gdGhlXHJcblx0ICogZ2l2ZW4gdGFyZ2V0IG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7e2g6bnVtYmVyLHM6bnVtYmVyLGw6bnVtYmVyfX0gdGFyZ2V0IC0gVGhlIHRhcmdldCBvYmplY3QgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBtZXRob2QncyByZXN1bHQuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtjb2xvclNwYWNlPUNvbG9yTWFuYWdlbWVudC53b3JraW5nQ29sb3JTcGFjZV0gLSBUaGUgY29sb3Igc3BhY2UuXHJcblx0ICogQHJldHVybiB7e2g6bnVtYmVyLHM6bnVtYmVyLGw6bnVtYmVyfX0gVGhlIEhTTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGNvbG9yLlxyXG5cdCAqL1xyXG5cdGdldEhTTCggdGFyZ2V0LCBjb2xvclNwYWNlID0gQ29sb3JNYW5hZ2VtZW50LndvcmtpbmdDb2xvclNwYWNlICkge1xyXG5cclxuXHRcdC8vIGgscyxsIHJhbmdlcyBhcmUgaW4gMC4wIC0gMS4wXHJcblxyXG5cdFx0Q29sb3JNYW5hZ2VtZW50LmZyb21Xb3JraW5nQ29sb3JTcGFjZSggX2NvbG9yLmNvcHkoIHRoaXMgKSwgY29sb3JTcGFjZSApO1xyXG5cclxuXHRcdGNvbnN0IHIgPSBfY29sb3IuciwgZyA9IF9jb2xvci5nLCBiID0gX2NvbG9yLmI7XHJcblxyXG5cdFx0Y29uc3QgbWF4ID0gTWF0aC5tYXgoIHIsIGcsIGIgKTtcclxuXHRcdGNvbnN0IG1pbiA9IE1hdGgubWluKCByLCBnLCBiICk7XHJcblxyXG5cdFx0bGV0IGh1ZSwgc2F0dXJhdGlvbjtcclxuXHRcdGNvbnN0IGxpZ2h0bmVzcyA9ICggbWluICsgbWF4ICkgLyAyLjA7XHJcblxyXG5cdFx0aWYgKCBtaW4gPT09IG1heCApIHtcclxuXHJcblx0XHRcdGh1ZSA9IDA7XHJcblx0XHRcdHNhdHVyYXRpb24gPSAwO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRjb25zdCBkZWx0YSA9IG1heCAtIG1pbjtcclxuXHJcblx0XHRcdHNhdHVyYXRpb24gPSBsaWdodG5lc3MgPD0gMC41ID8gZGVsdGEgLyAoIG1heCArIG1pbiApIDogZGVsdGEgLyAoIDIgLSBtYXggLSBtaW4gKTtcclxuXHJcblx0XHRcdHN3aXRjaCAoIG1heCApIHtcclxuXHJcblx0XHRcdFx0Y2FzZSByOiBodWUgPSAoIGcgLSBiICkgLyBkZWx0YSArICggZyA8IGIgPyA2IDogMCApOyBicmVhaztcclxuXHRcdFx0XHRjYXNlIGc6IGh1ZSA9ICggYiAtIHIgKSAvIGRlbHRhICsgMjsgYnJlYWs7XHJcblx0XHRcdFx0Y2FzZSBiOiBodWUgPSAoIHIgLSBnICkgLyBkZWx0YSArIDQ7IGJyZWFrO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aHVlIC89IDY7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRhcmdldC5oID0gaHVlO1xyXG5cdFx0dGFyZ2V0LnMgPSBzYXR1cmF0aW9uO1xyXG5cdFx0dGFyZ2V0LmwgPSBsaWdodG5lc3M7XHJcblxyXG5cdFx0cmV0dXJuIHRhcmdldDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBSR0IgdmFsdWVzIG9mIHRoaXMgY29sb3IgYW5kIHN0b3JlcyB0aGVtIGludG8gdGhlIGdpdmVuIHRhcmdldCBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0NvbG9yfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IGNvbG9yIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbWV0aG9kJ3MgcmVzdWx0LlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbY29sb3JTcGFjZT1Db2xvck1hbmFnZW1lbnQud29ya2luZ0NvbG9yU3BhY2VdIC0gVGhlIGNvbG9yIHNwYWNlLlxyXG5cdCAqIEByZXR1cm4ge0NvbG9yfSBUaGUgUkdCIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgY29sb3IuXHJcblx0ICovXHJcblx0Z2V0UkdCKCB0YXJnZXQsIGNvbG9yU3BhY2UgPSBDb2xvck1hbmFnZW1lbnQud29ya2luZ0NvbG9yU3BhY2UgKSB7XHJcblxyXG5cdFx0Q29sb3JNYW5hZ2VtZW50LmZyb21Xb3JraW5nQ29sb3JTcGFjZSggX2NvbG9yLmNvcHkoIHRoaXMgKSwgY29sb3JTcGFjZSApO1xyXG5cclxuXHRcdHRhcmdldC5yID0gX2NvbG9yLnI7XHJcblx0XHR0YXJnZXQuZyA9IF9jb2xvci5nO1xyXG5cdFx0dGFyZ2V0LmIgPSBfY29sb3IuYjtcclxuXHJcblx0XHRyZXR1cm4gdGFyZ2V0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoaXMgY29sb3IgYXMgYSBDU1Mgc3R5bGUgc3RyaW5nLiBFeGFtcGxlOiBgcmdiKDI1NSwwLDApYC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbY29sb3JTcGFjZT1TUkdCQ29sb3JTcGFjZV0gLSBUaGUgY29sb3Igc3BhY2UuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgQ1NTIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgY29sb3IuXHJcblx0ICovXHJcblx0Z2V0U3R5bGUoIGNvbG9yU3BhY2UgPSBTUkdCQ29sb3JTcGFjZSApIHtcclxuXHJcblx0XHRDb2xvck1hbmFnZW1lbnQuZnJvbVdvcmtpbmdDb2xvclNwYWNlKCBfY29sb3IuY29weSggdGhpcyApLCBjb2xvclNwYWNlICk7XHJcblxyXG5cdFx0Y29uc3QgciA9IF9jb2xvci5yLCBnID0gX2NvbG9yLmcsIGIgPSBfY29sb3IuYjtcclxuXHJcblx0XHRpZiAoIGNvbG9yU3BhY2UgIT09IFNSR0JDb2xvclNwYWNlICkge1xyXG5cclxuXHRcdFx0Ly8gUmVxdWlyZXMgQ1NTIENvbG9yIE1vZHVsZSBMZXZlbCA0IChodHRwczovL3d3dy53My5vcmcvVFIvY3NzLWNvbG9yLTQvKS5cclxuXHRcdFx0cmV0dXJuIGBjb2xvcigkeyBjb2xvclNwYWNlIH0gJHsgci50b0ZpeGVkKCAzICkgfSAkeyBnLnRvRml4ZWQoIDMgKSB9ICR7IGIudG9GaXhlZCggMyApIH0pYDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGByZ2IoJHsgTWF0aC5yb3VuZCggciAqIDI1NSApIH0sJHsgTWF0aC5yb3VuZCggZyAqIDI1NSApIH0sJHsgTWF0aC5yb3VuZCggYiAqIDI1NSApIH0pYDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIHRoZSBnaXZlbiBIU0wgdmFsdWVzIHRvIHRoaXMgY29sb3IncyB2YWx1ZXMuXHJcblx0ICogSW50ZXJuYWxseSwgdGhpcyBjb252ZXJ0cyB0aGUgY29sb3IncyBSR0IgdmFsdWVzIHRvIEhTTCwgYWRkcyBIU0xcclxuXHQgKiBhbmQgdGhlbiBjb252ZXJ0cyB0aGUgY29sb3IgYmFjayB0byBSR0IuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaCAtIEh1ZSB2YWx1ZSBiZXR3ZWVuIGAwLjBgIGFuZCBgMS4wYC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gcyAtIFNhdHVyYXRpb24gdmFsdWUgYmV0d2VlbiBgMC4wYCBhbmQgYDEuMGAuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGwgLSBMaWdodG5lc3MgdmFsdWUgYmV0d2VlbiBgMC4wYCBhbmQgYDEuMGAuXHJcblx0ICogQHJldHVybiB7Q29sb3J9IEEgcmVmZXJlbmNlIHRvIHRoaXMgY29sb3IuXHJcblx0ICovXHJcblx0b2Zmc2V0SFNMKCBoLCBzLCBsICkge1xyXG5cclxuXHRcdHRoaXMuZ2V0SFNMKCBfaHNsQSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnNldEhTTCggX2hzbEEuaCArIGgsIF9oc2xBLnMgKyBzLCBfaHNsQS5sICsgbCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgdGhlIFJHQiB2YWx1ZXMgb2YgdGhlIGdpdmVuIGNvbG9yIHRvIHRoZSBSR0IgdmFsdWVzIG9mIHRoaXMgY29sb3IuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0NvbG9yfSBjb2xvciAtIFRoZSBjb2xvciB0byBhZGQuXHJcblx0ICogQHJldHVybiB7Q29sb3J9IEEgcmVmZXJlbmNlIHRvIHRoaXMgY29sb3IuXHJcblx0ICovXHJcblx0YWRkKCBjb2xvciApIHtcclxuXHJcblx0XHR0aGlzLnIgKz0gY29sb3IucjtcclxuXHRcdHRoaXMuZyArPSBjb2xvci5nO1xyXG5cdFx0dGhpcy5iICs9IGNvbG9yLmI7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyB0aGUgUkdCIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gY29sb3JzIGFuZCBzdG9yZXMgdGhlIHJlc3VsdCBpbiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtDb2xvcn0gY29sb3IxIC0gVGhlIGZpcnN0IGNvbG9yLlxyXG5cdCAqIEBwYXJhbSB7Q29sb3J9IGNvbG9yMiAtIFRoZSBzZWNvbmQgY29sb3IuXHJcblx0ICogQHJldHVybiB7Q29sb3J9IEEgcmVmZXJlbmNlIHRvIHRoaXMgY29sb3IuXHJcblx0ICovXHJcblx0YWRkQ29sb3JzKCBjb2xvcjEsIGNvbG9yMiApIHtcclxuXHJcblx0XHR0aGlzLnIgPSBjb2xvcjEuciArIGNvbG9yMi5yO1xyXG5cdFx0dGhpcy5nID0gY29sb3IxLmcgKyBjb2xvcjIuZztcclxuXHRcdHRoaXMuYiA9IGNvbG9yMS5iICsgY29sb3IyLmI7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyB0aGUgZ2l2ZW4gc2NhbGFyIHZhbHVlIHRvIHRoZSBSR0IgdmFsdWVzIG9mIHRoaXMgY29sb3IuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gcyAtIFRoZSBzY2FsYXIgdG8gYWRkLlxyXG5cdCAqIEByZXR1cm4ge0NvbG9yfSBBIHJlZmVyZW5jZSB0byB0aGlzIGNvbG9yLlxyXG5cdCAqL1xyXG5cdGFkZFNjYWxhciggcyApIHtcclxuXHJcblx0XHR0aGlzLnIgKz0gcztcclxuXHRcdHRoaXMuZyArPSBzO1xyXG5cdFx0dGhpcy5iICs9IHM7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3VidHJhY3RzIHRoZSBSR0IgdmFsdWVzIG9mIHRoZSBnaXZlbiBjb2xvciBmcm9tIHRoZSBSR0IgdmFsdWVzIG9mIHRoaXMgY29sb3IuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0NvbG9yfSBjb2xvciAtIFRoZSBjb2xvciB0byBzdWJ0cmFjdC5cclxuXHQgKiBAcmV0dXJuIHtDb2xvcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBjb2xvci5cclxuXHQgKi9cclxuXHRzdWIoIGNvbG9yICkge1xyXG5cclxuXHRcdHRoaXMuciA9IE1hdGgubWF4KCAwLCB0aGlzLnIgLSBjb2xvci5yICk7XHJcblx0XHR0aGlzLmcgPSBNYXRoLm1heCggMCwgdGhpcy5nIC0gY29sb3IuZyApO1xyXG5cdFx0dGhpcy5iID0gTWF0aC5tYXgoIDAsIHRoaXMuYiAtIGNvbG9yLmIgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBNdWx0aXBsaWVzIHRoZSBSR0IgdmFsdWVzIG9mIHRoZSBnaXZlbiBjb2xvciB3aXRoIHRoZSBSR0IgdmFsdWVzIG9mIHRoaXMgY29sb3IuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0NvbG9yfSBjb2xvciAtIFRoZSBjb2xvciB0byBtdWx0aXBseS5cclxuXHQgKiBAcmV0dXJuIHtDb2xvcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBjb2xvci5cclxuXHQgKi9cclxuXHRtdWx0aXBseSggY29sb3IgKSB7XHJcblxyXG5cdFx0dGhpcy5yICo9IGNvbG9yLnI7XHJcblx0XHR0aGlzLmcgKj0gY29sb3IuZztcclxuXHRcdHRoaXMuYiAqPSBjb2xvci5iO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE11bHRpcGxpZXMgdGhlIGdpdmVuIHNjYWxhciB2YWx1ZSB3aXRoIHRoZSBSR0IgdmFsdWVzIG9mIHRoaXMgY29sb3IuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gcyAtIFRoZSBzY2FsYXIgdG8gbXVsdGlwbHkuXHJcblx0ICogQHJldHVybiB7Q29sb3J9IEEgcmVmZXJlbmNlIHRvIHRoaXMgY29sb3IuXHJcblx0ICovXHJcblx0bXVsdGlwbHlTY2FsYXIoIHMgKSB7XHJcblxyXG5cdFx0dGhpcy5yICo9IHM7XHJcblx0XHR0aGlzLmcgKj0gcztcclxuXHRcdHRoaXMuYiAqPSBzO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIExpbmVhcmx5IGludGVycG9sYXRlcyB0aGlzIGNvbG9yJ3MgUkdCIHZhbHVlcyB0b3dhcmQgdGhlIFJHQiB2YWx1ZXMgb2YgdGhlXHJcblx0ICogZ2l2ZW4gY29sb3IuIFRoZSBhbHBoYSBhcmd1bWVudCBjYW4gYmUgdGhvdWdodCBvZiBhcyB0aGUgcmF0aW8gYmV0d2VlblxyXG5cdCAqIHRoZSB0d28gY29sb3JzLCB3aGVyZSBgMC4wYCBpcyB0aGlzIGNvbG9yIGFuZCBgMS4wYCBpcyB0aGUgZmlyc3QgYXJndW1lbnQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0NvbG9yfSBjb2xvciAtIFRoZSBjb2xvciB0byBjb252ZXJnZSBvbi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYWxwaGEgLSBUaGUgaW50ZXJwb2xhdGlvbiBmYWN0b3IgaW4gdGhlIGNsb3NlZCBpbnRlcnZhbCBgWzAsMV1gLlxyXG5cdCAqIEByZXR1cm4ge0NvbG9yfSBBIHJlZmVyZW5jZSB0byB0aGlzIGNvbG9yLlxyXG5cdCAqL1xyXG5cdGxlcnAoIGNvbG9yLCBhbHBoYSApIHtcclxuXHJcblx0XHR0aGlzLnIgKz0gKCBjb2xvci5yIC0gdGhpcy5yICkgKiBhbHBoYTtcclxuXHRcdHRoaXMuZyArPSAoIGNvbG9yLmcgLSB0aGlzLmcgKSAqIGFscGhhO1xyXG5cdFx0dGhpcy5iICs9ICggY29sb3IuYiAtIHRoaXMuYiApICogYWxwaGE7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTGluZWFybHkgaW50ZXJwb2xhdGVzIGJldHdlZW4gdGhlIGdpdmVuIGNvbG9ycyBhbmQgc3RvcmVzIHRoZSByZXN1bHQgaW4gdGhpcyBpbnN0YW5jZS5cclxuXHQgKiBUaGUgYWxwaGEgYXJndW1lbnQgY2FuIGJlIHRob3VnaHQgb2YgYXMgdGhlIHJhdGlvIGJldHdlZW4gdGhlIHR3byBjb2xvcnMsIHdoZXJlIGAwLjBgXHJcblx0ICogaXMgdGhlIGZpcnN0IGFuZCBgMS4wYCBpcyB0aGUgc2Vjb25kIGNvbG9yLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtDb2xvcn0gY29sb3IxIC0gVGhlIGZpcnN0IGNvbG9yLlxyXG5cdCAqIEBwYXJhbSB7Q29sb3J9IGNvbG9yMiAtIFRoZSBzZWNvbmQgY29sb3IuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFscGhhIC0gVGhlIGludGVycG9sYXRpb24gZmFjdG9yIGluIHRoZSBjbG9zZWQgaW50ZXJ2YWwgYFswLDFdYC5cclxuXHQgKiBAcmV0dXJuIHtDb2xvcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBjb2xvci5cclxuXHQgKi9cclxuXHRsZXJwQ29sb3JzKCBjb2xvcjEsIGNvbG9yMiwgYWxwaGEgKSB7XHJcblxyXG5cdFx0dGhpcy5yID0gY29sb3IxLnIgKyAoIGNvbG9yMi5yIC0gY29sb3IxLnIgKSAqIGFscGhhO1xyXG5cdFx0dGhpcy5nID0gY29sb3IxLmcgKyAoIGNvbG9yMi5nIC0gY29sb3IxLmcgKSAqIGFscGhhO1xyXG5cdFx0dGhpcy5iID0gY29sb3IxLmIgKyAoIGNvbG9yMi5iIC0gY29sb3IxLmIgKSAqIGFscGhhO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIExpbmVhcmx5IGludGVycG9sYXRlcyB0aGlzIGNvbG9yJ3MgSFNMIHZhbHVlcyB0b3dhcmQgdGhlIEhTTCB2YWx1ZXMgb2YgdGhlXHJcblx0ICogZ2l2ZW4gY29sb3IuIEl0IGRpZmZlcnMgZnJvbSB7QGxpbmsgQ29sb3IjbGVycH0gYnkgbm90IGludGVycG9sYXRpbmcgc3RyYWlnaHRcclxuXHQgKiBmcm9tIG9uZSBjb2xvciB0byB0aGUgb3RoZXIsIGJ1dCBpbnN0ZWFkIGdvaW5nIHRocm91Z2ggYWxsIHRoZSBodWVzIGluIGJldHdlZW5cclxuXHQgKiB0aG9zZSB0d28gY29sb3JzLiBUaGUgYWxwaGEgYXJndW1lbnQgY2FuIGJlIHRob3VnaHQgb2YgYXMgdGhlIHJhdGlvIGJldHdlZW5cclxuXHQgKiB0aGUgdHdvIGNvbG9ycywgd2hlcmUgMC4wIGlzIHRoaXMgY29sb3IgYW5kIDEuMCBpcyB0aGUgZmlyc3QgYXJndW1lbnQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0NvbG9yfSBjb2xvciAtIFRoZSBjb2xvciB0byBjb252ZXJnZSBvbi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYWxwaGEgLSBUaGUgaW50ZXJwb2xhdGlvbiBmYWN0b3IgaW4gdGhlIGNsb3NlZCBpbnRlcnZhbCBgWzAsMV1gLlxyXG5cdCAqIEByZXR1cm4ge0NvbG9yfSBBIHJlZmVyZW5jZSB0byB0aGlzIGNvbG9yLlxyXG5cdCAqL1xyXG5cdGxlcnBIU0woIGNvbG9yLCBhbHBoYSApIHtcclxuXHJcblx0XHR0aGlzLmdldEhTTCggX2hzbEEgKTtcclxuXHRcdGNvbG9yLmdldEhTTCggX2hzbEIgKTtcclxuXHJcblx0XHRjb25zdCBoID0gbGVycCggX2hzbEEuaCwgX2hzbEIuaCwgYWxwaGEgKTtcclxuXHRcdGNvbnN0IHMgPSBsZXJwKCBfaHNsQS5zLCBfaHNsQi5zLCBhbHBoYSApO1xyXG5cdFx0Y29uc3QgbCA9IGxlcnAoIF9oc2xBLmwsIF9oc2xCLmwsIGFscGhhICk7XHJcblxyXG5cdFx0dGhpcy5zZXRIU0woIGgsIHMsIGwgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBjb2xvcidzIFJHQiBjb21wb25lbnRzIGZyb20gdGhlIGdpdmVuIDNEIHZlY3Rvci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdiAtIFRoZSB2ZWN0b3IgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge0NvbG9yfSBBIHJlZmVyZW5jZSB0byB0aGlzIGNvbG9yLlxyXG5cdCAqL1xyXG5cdHNldEZyb21WZWN0b3IzKCB2ICkge1xyXG5cclxuXHRcdHRoaXMuciA9IHYueDtcclxuXHRcdHRoaXMuZyA9IHYueTtcclxuXHRcdHRoaXMuYiA9IHYuejtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUcmFuc2Zvcm1zIHRoaXMgY29sb3Igd2l0aCB0aGUgZ2l2ZW4gM3gzIG1hdHJpeC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4M30gbSAtIFRoZSBtYXRyaXguXHJcblx0ICogQHJldHVybiB7Q29sb3J9IEEgcmVmZXJlbmNlIHRvIHRoaXMgY29sb3IuXHJcblx0ICovXHJcblx0YXBwbHlNYXRyaXgzKCBtICkge1xyXG5cclxuXHRcdGNvbnN0IHIgPSB0aGlzLnIsIGcgPSB0aGlzLmcsIGIgPSB0aGlzLmI7XHJcblx0XHRjb25zdCBlID0gbS5lbGVtZW50cztcclxuXHJcblx0XHR0aGlzLnIgPSBlWyAwIF0gKiByICsgZVsgMyBdICogZyArIGVbIDYgXSAqIGI7XHJcblx0XHR0aGlzLmcgPSBlWyAxIF0gKiByICsgZVsgNCBdICogZyArIGVbIDcgXSAqIGI7XHJcblx0XHR0aGlzLmIgPSBlWyAyIF0gKiByICsgZVsgNSBdICogZyArIGVbIDggXSAqIGI7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBjb2xvciBpcyBlcXVhbCB3aXRoIHRoZSBnaXZlbiBvbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0NvbG9yfSBjIC0gVGhlIGNvbG9yIHRvIHRlc3QgZm9yIGVxdWFsaXR5LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyBib3VuZGluZyBjb2xvciBpcyBlcXVhbCB3aXRoIHRoZSBnaXZlbiBvbmUuXHJcblx0ICovXHJcblx0ZXF1YWxzKCBjICkge1xyXG5cclxuXHRcdHJldHVybiAoIGMuciA9PT0gdGhpcy5yICkgJiYgKCBjLmcgPT09IHRoaXMuZyApICYmICggYy5iID09PSB0aGlzLmIgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoaXMgY29sb3IncyBSR0IgY29tcG9uZW50cyBmcm9tIHRoZSBnaXZlbiBhcnJheS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gYXJyYXkgLSBBbiBhcnJheSBob2xkaW5nIHRoZSBSR0IgdmFsdWVzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0PTBdIC0gVGhlIG9mZnNldCBpbnRvIHRoZSBhcnJheS5cclxuXHQgKiBAcmV0dXJuIHtDb2xvcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBjb2xvci5cclxuXHQgKi9cclxuXHRmcm9tQXJyYXkoIGFycmF5LCBvZmZzZXQgPSAwICkge1xyXG5cclxuXHRcdHRoaXMuciA9IGFycmF5WyBvZmZzZXQgXTtcclxuXHRcdHRoaXMuZyA9IGFycmF5WyBvZmZzZXQgKyAxIF07XHJcblx0XHR0aGlzLmIgPSBhcnJheVsgb2Zmc2V0ICsgMiBdO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdyaXRlcyB0aGUgUkdCIGNvbXBvbmVudHMgb2YgdGhpcyBjb2xvciB0byB0aGUgZ2l2ZW4gYXJyYXkuIElmIG5vIGFycmF5IGlzIHByb3ZpZGVkLFxyXG5cdCAqIHRoZSBtZXRob2QgcmV0dXJucyBhIG5ldyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gW2FycmF5PVtdXSAtIFRoZSB0YXJnZXQgYXJyYXkgaG9sZGluZyB0aGUgY29sb3IgY29tcG9uZW50cy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW29mZnNldD0wXSAtIEluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBhcnJheS5cclxuXHQgKiBAcmV0dXJuIHtBcnJheTxudW1iZXI+fSBUaGUgY29sb3IgY29tcG9uZW50cy5cclxuXHQgKi9cclxuXHR0b0FycmF5KCBhcnJheSA9IFtdLCBvZmZzZXQgPSAwICkge1xyXG5cclxuXHRcdGFycmF5WyBvZmZzZXQgXSA9IHRoaXMucjtcclxuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLmc7XHJcblx0XHRhcnJheVsgb2Zmc2V0ICsgMiBdID0gdGhpcy5iO1xyXG5cclxuXHRcdHJldHVybiBhcnJheTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBjb21wb25lbnRzIG9mIHRoaXMgY29sb3IgZnJvbSB0aGUgZ2l2ZW4gYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyQXR0cmlidXRlfSBhdHRyaWJ1dGUgLSBUaGUgYnVmZmVyIGF0dHJpYnV0ZSBob2xkaW5nIGNvbG9yIGRhdGEuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluZGV4IGludG8gdGhlIGF0dHJpYnV0ZS5cclxuXHQgKiBAcmV0dXJuIHtDb2xvcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBjb2xvci5cclxuXHQgKi9cclxuXHRmcm9tQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGluZGV4ICkge1xyXG5cclxuXHRcdHRoaXMuciA9IGF0dHJpYnV0ZS5nZXRYKCBpbmRleCApO1xyXG5cdFx0dGhpcy5nID0gYXR0cmlidXRlLmdldFkoIGluZGV4ICk7XHJcblx0XHR0aGlzLmIgPSBhdHRyaWJ1dGUuZ2V0WiggaW5kZXggKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZHMgZGVmaW5lcyB0aGUgc2VyaWFsaXphdGlvbiByZXN1bHQgb2YgdGhpcyBjbGFzcy4gUmV0dXJucyB0aGUgY29sb3JcclxuXHQgKiBhcyBhIGhleGFkZWNpbWFsIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgaGV4YWRlY2ltYWwgdmFsdWUuXHJcblx0ICovXHJcblx0dG9KU09OKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmdldEhleCgpO1xyXG5cclxuXHR9XHJcblxyXG5cdCpbIFN5bWJvbC5pdGVyYXRvciBdKCkge1xyXG5cclxuXHRcdHlpZWxkIHRoaXMucjtcclxuXHRcdHlpZWxkIHRoaXMuZztcclxuXHRcdHlpZWxkIHRoaXMuYjtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuY29uc3QgX2NvbG9yID0gLypAX19QVVJFX18qLyBuZXcgQ29sb3IoKTtcclxuXHJcbi8qKlxyXG4gKiBBIGRpY3Rpb25hcnkgd2l0aCBYMTEgY29sb3IgbmFtZXMuXHJcbiAqXHJcbiAqIE5vdGUgdGhhdCBtdWx0aXBsZSB3b3JkcyBzdWNoIGFzIERhcmsgT3JhbmdlIGJlY29tZSB0aGUgc3RyaW5nICdkYXJrb3JhbmdlJy5cclxuICpcclxuICogQHN0YXRpY1xyXG4gKiBAdHlwZSB7T2JqZWN0fVxyXG4gKi9cclxuQ29sb3IuTkFNRVMgPSBfY29sb3JLZXl3b3JkcztcclxuXHJcbmV4cG9ydCB7IENvbG9yIH07XHJcbiIsImltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vbWF0aC9Db2xvci5qcyc7XHJcbmltcG9ydCB7IEV2ZW50RGlzcGF0Y2hlciB9IGZyb20gJy4uL2NvcmUvRXZlbnREaXNwYXRjaGVyLmpzJztcclxuaW1wb3J0IHsgRnJvbnRTaWRlLCBOb3JtYWxCbGVuZGluZywgTGVzc0VxdWFsRGVwdGgsIEFkZEVxdWF0aW9uLCBPbmVNaW51c1NyY0FscGhhRmFjdG9yLCBTcmNBbHBoYUZhY3RvciwgQWx3YXlzU3RlbmNpbEZ1bmMsIEtlZXBTdGVuY2lsT3AgfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBnZW5lcmF0ZVVVSUQgfSBmcm9tICcuLi9tYXRoL01hdGhVdGlscy5qcyc7XHJcblxyXG5sZXQgX21hdGVyaWFsSWQgPSAwO1xyXG5cclxuLyoqXHJcbiAqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIG1hdGVyaWFscy5cclxuICpcclxuICogTWF0ZXJpYWxzIGRlZmluZSB0aGUgYXBwZWFyYW5jZSBvZiByZW5kZXJhYmxlIDNEIG9iamVjdHMuXHJcbiAqXHJcbiAqIEBhYnN0cmFjdFxyXG4gKiBAYXVnbWVudHMgRXZlbnREaXNwYXRjaGVyXHJcbiAqL1xyXG5jbGFzcyBNYXRlcmlhbCBleHRlbmRzIEV2ZW50RGlzcGF0Y2hlciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbWF0ZXJpYWwuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNNYXRlcmlhbCA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgSUQgb2YgdGhlIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBuYW1lIE1hdGVyaWFsI2lkXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKi9cclxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ2lkJywgeyB2YWx1ZTogX21hdGVyaWFsSWQgKysgfSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIFVVSUQgb2YgdGhlIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51dWlkID0gZ2VuZXJhdGVVVUlEKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbmFtZSBvZiB0aGUgbWF0ZXJpYWwuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5uYW1lID0gJyc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdHlwZSBwcm9wZXJ0eSBpcyB1c2VkIGZvciBkZXRlY3RpbmcgdGhlIG9iamVjdCB0eXBlXHJcblx0XHQgKiBpbiBjb250ZXh0IG9mIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50eXBlID0gJ01hdGVyaWFsJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgdGhlIGJsZW5kaW5nIHR5cGUgb2YgdGhlIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEl0IG11c3QgYmUgc2V0IHRvIGBDdXN0b21CbGVuZGluZ2AgaWYgY3VzdG9tIGJsZW5kaW5nIHByb3BlcnRpZXMgbGlrZVxyXG5cdFx0ICoge0BsaW5rIE1hdGVyaWFsI2JsZW5kU3JjfSwge0BsaW5rIE1hdGVyaWFsI2JsZW5kRHN0fSBvciB7QGxpbmsgTWF0ZXJpYWwjYmxlbmRFcXVhdGlvbn1cclxuXHRcdCAqIHNob3VsZCBoYXZlIGFueSBlZmZlY3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeyhOb0JsZW5kaW5nfE5vcm1hbEJsZW5kaW5nfEFkZGl0aXZlQmxlbmRpbmd8U3VidHJhY3RpdmVCbGVuZGluZ3xNdWx0aXBseUJsZW5kaW5nfEN1c3RvbUJsZW5kaW5nKX1cclxuXHRcdCAqIEBkZWZhdWx0IE5vcm1hbEJsZW5kaW5nXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYmxlbmRpbmcgPSBOb3JtYWxCbGVuZGluZztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgd2hpY2ggc2lkZSBvZiBmYWNlcyB3aWxsIGJlIHJlbmRlcmVkIC0gZnJvbnQsIGJhY2sgb3IgYm90aC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KEZyb250U2lkZXxCYWNrU2lkZXxEb3VibGVTaWRlKX1cclxuXHRcdCAqIEBkZWZhdWx0IEZyb250U2lkZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNpZGUgPSBGcm9udFNpZGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBJZiBzZXQgdG8gYHRydWVgLCB2ZXJ0ZXggY29sb3JzIHNob3VsZCBiZSB1c2VkLlxyXG5cdFx0ICpcclxuXHRcdCAqIFRoZSBlbmdpbmUgc3VwcG9ydHMgUkdCIGFuZCBSR0JBIHZlcnRleCBjb2xvcnMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgYSB0aHJlZSAoUkdCKSBvclxyXG5cdFx0ICogZm91ciAoUkdCQSkgY29tcG9uZW50IGNvbG9yIGJ1ZmZlciBhdHRyaWJ1dGUgaXMgdXNlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudmVydGV4Q29sb3JzID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIGhvdyB0cmFuc3BhcmVudCB0aGUgbWF0ZXJpYWwgaXMuXHJcblx0XHQgKiBBIHZhbHVlIG9mIGAwLjBgIGluZGljYXRlcyBmdWxseSB0cmFuc3BhcmVudCwgYDEuMGAgaXMgZnVsbHkgb3BhcXVlLlxyXG5cdFx0ICpcclxuXHRcdCAqIElmIHRoZSB7QGxpbmsgTWF0ZXJpYWwjdHJhbnNwYXJlbnR9IGlzIG5vdCBzZXQgdG8gYHRydWVgLFxyXG5cdFx0ICogdGhlIG1hdGVyaWFsIHdpbGwgcmVtYWluIGZ1bGx5IG9wYXF1ZSBhbmQgdGhpcyB2YWx1ZSB3aWxsIG9ubHkgYWZmZWN0IGl0cyBjb2xvci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm9wYWNpdHkgPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyB3aGV0aGVyIHRoaXMgbWF0ZXJpYWwgaXMgdHJhbnNwYXJlbnQuIFRoaXMgaGFzIGFuIGVmZmVjdCBvblxyXG5cdFx0ICogcmVuZGVyaW5nIGFzIHRyYW5zcGFyZW50IG9iamVjdHMgbmVlZCBzcGVjaWFsIHRyZWF0bWVudCBhbmQgYXJlIHJlbmRlcmVkXHJcblx0XHQgKiBhZnRlciBub24tdHJhbnNwYXJlbnQgb2JqZWN0cy5cclxuXHRcdCAqXHJcblx0XHQgKiBXaGVuIHNldCB0byB0cnVlLCB0aGUgZXh0ZW50IHRvIHdoaWNoIHRoZSBtYXRlcmlhbCBpcyB0cmFuc3BhcmVudCBpc1xyXG5cdFx0ICogY29udHJvbGxlZCBieSB7QGxpbmsgTWF0ZXJpYWwjb3BhY2l0eX0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRyYW5zcGFyZW50ID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBFbmFibGVzIGFscGhhIGhhc2hlZCB0cmFuc3BhcmVuY3ksIGFuIGFsdGVybmF0aXZlIHRvIHtAbGluayBNYXRlcmlhbCN0cmFuc3BhcmVudH0gb3JcclxuXHRcdCAqIHtAbGluayBNYXRlcmlhbCNhbHBoYVRlc3R9LiBUaGUgbWF0ZXJpYWwgd2lsbCBub3QgYmUgcmVuZGVyZWQgaWYgb3BhY2l0eSBpcyBsb3dlciB0aGFuXHJcblx0XHQgKiBhIHJhbmRvbSB0aHJlc2hvbGQuIFJhbmRvbWl6YXRpb24gaW50cm9kdWNlcyBzb21lIGdyYWluIG9yIG5vaXNlLCBidXQgYXBwcm94aW1hdGVzIGFscGhhXHJcblx0XHQgKiBibGVuZGluZyB3aXRob3V0IHRoZSBhc3NvY2lhdGVkIHByb2JsZW1zIG9mIHNvcnRpbmcuIFVzaW5nIFRBQSBjYW4gcmVkdWNlIHRoZSByZXN1bHRpbmcgbm9pc2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFscGhhSGFzaCA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyB0aGUgYmxlbmRpbmcgc291cmNlIGZhY3Rvci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KFplcm9GYWN0b3J8T25lRmFjdG9yfFNyY0NvbG9yRmFjdG9yfE9uZU1pbnVzU3JjQ29sb3JGYWN0b3J8U3JjQWxwaGFGYWN0b3J8T25lTWludXNTcmNBbHBoYUZhY3RvcnxEc3RBbHBoYUZhY3RvcnxPbmVNaW51c0RzdEFscGhhRmFjdG9yfERzdENvbG9yRmFjdG9yfE9uZU1pbnVzRHN0Q29sb3JGYWN0b3J8U3JjQWxwaGFTYXR1cmF0ZUZhY3RvcnxDb25zdGFudENvbG9yRmFjdG9yfE9uZU1pbnVzQ29uc3RhbnRDb2xvckZhY3RvcnxDb25zdGFudEFscGhhRmFjdG9yfE9uZU1pbnVzQ29uc3RhbnRBbHBoYUZhY3Rvcil9XHJcblx0XHQgKiBAZGVmYXVsdCBTcmNBbHBoYUZhY3RvclxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJsZW5kU3JjID0gU3JjQWxwaGFGYWN0b3I7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIHRoZSBibGVuZGluZyBkZXN0aW5hdGlvbiBmYWN0b3IuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeyhaZXJvRmFjdG9yfE9uZUZhY3RvcnxTcmNDb2xvckZhY3RvcnxPbmVNaW51c1NyY0NvbG9yRmFjdG9yfFNyY0FscGhhRmFjdG9yfE9uZU1pbnVzU3JjQWxwaGFGYWN0b3J8RHN0QWxwaGFGYWN0b3J8T25lTWludXNEc3RBbHBoYUZhY3RvcnxEc3RDb2xvckZhY3RvcnxPbmVNaW51c0RzdENvbG9yRmFjdG9yfFNyY0FscGhhU2F0dXJhdGVGYWN0b3J8Q29uc3RhbnRDb2xvckZhY3RvcnxPbmVNaW51c0NvbnN0YW50Q29sb3JGYWN0b3J8Q29uc3RhbnRBbHBoYUZhY3RvcnxPbmVNaW51c0NvbnN0YW50QWxwaGFGYWN0b3IpfVxyXG5cdFx0ICogQGRlZmF1bHQgT25lTWludXNTcmNBbHBoYUZhY3RvclxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJsZW5kRHN0ID0gT25lTWludXNTcmNBbHBoYUZhY3RvcjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgdGhlIGJsZW5kaW5nIGVxdWF0aW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoQWRkRXF1YXRpb258U3VidHJhY3RFcXVhdGlvbnxSZXZlcnNlU3VidHJhY3RFcXVhdGlvbnxNaW5FcXVhdGlvbnxNYXhFcXVhdGlvbil9XHJcblx0XHQgKiBAZGVmYXVsdCBBZGRFcXVhdGlvblxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJsZW5kRXF1YXRpb24gPSBBZGRFcXVhdGlvbjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgdGhlIGJsZW5kaW5nIHNvdXJjZSBhbHBoYSBmYWN0b3IuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez8oWmVyb0ZhY3RvcnxPbmVGYWN0b3J8U3JjQ29sb3JGYWN0b3J8T25lTWludXNTcmNDb2xvckZhY3RvcnxTcmNBbHBoYUZhY3RvcnxPbmVNaW51c1NyY0FscGhhRmFjdG9yfERzdEFscGhhRmFjdG9yfE9uZU1pbnVzRHN0QWxwaGFGYWN0b3J8RHN0Q29sb3JGYWN0b3J8T25lTWludXNEc3RDb2xvckZhY3RvcnxTcmNBbHBoYVNhdHVyYXRlRmFjdG9yfENvbnN0YW50Q29sb3JGYWN0b3J8T25lTWludXNDb25zdGFudENvbG9yRmFjdG9yfENvbnN0YW50QWxwaGFGYWN0b3J8T25lTWludXNDb25zdGFudEFscGhhRmFjdG9yKX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ibGVuZFNyY0FscGhhID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgdGhlIGJsZW5kaW5nIGRlc3RpbmF0aW9uIGFscGhhIGZhY3Rvci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7PyhaZXJvRmFjdG9yfE9uZUZhY3RvcnxTcmNDb2xvckZhY3RvcnxPbmVNaW51c1NyY0NvbG9yRmFjdG9yfFNyY0FscGhhRmFjdG9yfE9uZU1pbnVzU3JjQWxwaGFGYWN0b3J8RHN0QWxwaGFGYWN0b3J8T25lTWludXNEc3RBbHBoYUZhY3RvcnxEc3RDb2xvckZhY3RvcnxPbmVNaW51c0RzdENvbG9yRmFjdG9yfFNyY0FscGhhU2F0dXJhdGVGYWN0b3J8Q29uc3RhbnRDb2xvckZhY3RvcnxPbmVNaW51c0NvbnN0YW50Q29sb3JGYWN0b3J8Q29uc3RhbnRBbHBoYUZhY3RvcnxPbmVNaW51c0NvbnN0YW50QWxwaGFGYWN0b3IpfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJsZW5kRHN0QWxwaGEgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyB0aGUgYmxlbmRpbmcgZXF1YXRpb24gb2YgdGhlIGFscGhhIGNoYW5uZWwuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez8oQWRkRXF1YXRpb258U3VidHJhY3RFcXVhdGlvbnxSZXZlcnNlU3VidHJhY3RFcXVhdGlvbnxNaW5FcXVhdGlvbnxNYXhFcXVhdGlvbil9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYmxlbmRFcXVhdGlvbkFscGhhID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlcHJlc2VudHMgdGhlIFJHQiB2YWx1ZXMgb2YgdGhlIGNvbnN0YW50IGJsZW5kIGNvbG9yLlxyXG5cdFx0ICpcclxuXHRcdCAqIFRoaXMgcHJvcGVydHkgaGFzIG9ubHkgYW4gZWZmZWN0IHdoZW4gdXNpbmcgY3VzdG9tIGJsZW5kaW5nIHdpdGggYENvbnN0YW50Q29sb3JgIG9yIGBPbmVNaW51c0NvbnN0YW50Q29sb3JgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtDb2xvcn1cclxuXHRcdCAqIEBkZWZhdWx0ICgwLDAsMClcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ibGVuZENvbG9yID0gbmV3IENvbG9yKCAwLCAwLCAwICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXByZXNlbnRzIHRoZSBhbHBoYSB2YWx1ZSBvZiB0aGUgY29uc3RhbnQgYmxlbmQgY29sb3IuXHJcblx0XHQgKlxyXG5cdFx0ICogVGhpcyBwcm9wZXJ0eSBoYXMgb25seSBhbiBlZmZlY3Qgd2hlbiB1c2luZyBjdXN0b20gYmxlbmRpbmcgd2l0aCBgQ29uc3RhbnRBbHBoYWAgb3IgYE9uZU1pbnVzQ29uc3RhbnRBbHBoYWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ibGVuZEFscGhhID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgdGhlIGRlcHRoIGZ1bmN0aW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoTmV2ZXJEZXB0aHxBbHdheXNEZXB0aHxMZXNzRGVwdGh8TGVzc0VxdWFsRGVwdGh8RXF1YWxEZXB0aHxHcmVhdGVyRXF1YWxEZXB0aHxHcmVhdGVyRGVwdGh8Tm90RXF1YWxEZXB0aCl9XHJcblx0XHQgKiBAZGVmYXVsdCBMZXNzRXF1YWxEZXB0aFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRlcHRoRnVuYyA9IExlc3NFcXVhbERlcHRoO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0byBoYXZlIGRlcHRoIHRlc3QgZW5hYmxlZCB3aGVuIHJlbmRlcmluZyB0aGlzIG1hdGVyaWFsLlxyXG5cdFx0ICogV2hlbiB0aGUgZGVwdGggdGVzdCBpcyBkaXNhYmxlZCwgdGhlIGRlcHRoIHdyaXRlIHdpbGwgYWxzbyBiZSBpbXBsaWNpdGx5IGRpc2FibGVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRlcHRoVGVzdCA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHJlbmRlcmluZyB0aGlzIG1hdGVyaWFsIGhhcyBhbnkgZWZmZWN0IG9uIHRoZSBkZXB0aCBidWZmZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogV2hlbiBkcmF3aW5nIDJEIG92ZXJsYXlzIGl0IGNhbiBiZSB1c2VmdWwgdG8gZGlzYWJsZSB0aGUgZGVwdGggd3JpdGluZyBpblxyXG5cdFx0ICogb3JkZXIgdG8gbGF5ZXIgc2V2ZXJhbCB0aGluZ3MgdG9nZXRoZXIgd2l0aG91dCBjcmVhdGluZyB6LWluZGV4IGFydGlmYWN0cy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kZXB0aFdyaXRlID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBiaXQgbWFzayB0byB1c2Ugd2hlbiB3cml0aW5nIHRvIHRoZSBzdGVuY2lsIGJ1ZmZlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMHhmZlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnN0ZW5jaWxXcml0ZU1hc2sgPSAweGZmO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHN0ZW5jaWwgY29tcGFyaXNvbiBmdW5jdGlvbiB0byB1c2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05ldmVyU3RlbmNpbEZ1bmN8TGVzc1N0ZW5jaWxGdW5jfEVxdWFsU3RlbmNpbEZ1bmN8TGVzc0VxdWFsU3RlbmNpbEZ1bmN8R3JlYXRlclN0ZW5jaWxGdW5jfE5vdEVxdWFsU3RlbmNpbEZ1bmN8R3JlYXRlckVxdWFsU3RlbmNpbEZ1bmN8QWx3YXlzU3RlbmNpbEZ1bmN9XHJcblx0XHQgKiBAZGVmYXVsdCBBbHdheXNTdGVuY2lsRnVuY1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLnN0ZW5jaWxGdW5jID0gQWx3YXlzU3RlbmNpbEZ1bmM7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdmFsdWUgdG8gdXNlIHdoZW4gcGVyZm9ybWluZyBzdGVuY2lsIGNvbXBhcmlzb25zIG9yIHN0ZW5jaWwgb3BlcmF0aW9ucy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnN0ZW5jaWxSZWYgPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGJpdCBtYXNrIHRvIHVzZSB3aGVuIGNvbXBhcmluZyBhZ2FpbnN0IHRoZSBzdGVuY2lsIGJ1ZmZlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMHhmZlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnN0ZW5jaWxGdW5jTWFzayA9IDB4ZmY7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGljaCBzdGVuY2lsIG9wZXJhdGlvbiB0byBwZXJmb3JtIHdoZW4gdGhlIGNvbXBhcmlzb24gZnVuY3Rpb24gcmV0dXJucyBgZmFsc2VgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtaZXJvU3RlbmNpbE9wfEtlZXBTdGVuY2lsT3B8UmVwbGFjZVN0ZW5jaWxPcHxJbmNyZW1lbnRTdGVuY2lsT3B8RGVjcmVtZW50U3RlbmNpbE9wfEluY3JlbWVudFdyYXBTdGVuY2lsT3B8RGVjcmVtZW50V3JhcFN0ZW5jaWxPcHxJbnZlcnRTdGVuY2lsT3B9XHJcblx0XHQgKiBAZGVmYXVsdCBLZWVwU3RlbmNpbE9wXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc3RlbmNpbEZhaWwgPSBLZWVwU3RlbmNpbE9wO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hpY2ggc3RlbmNpbCBvcGVyYXRpb24gdG8gcGVyZm9ybSB3aGVuIHRoZSBjb21wYXJpc29uIGZ1bmN0aW9uIHJldHVybnNcclxuXHRcdCAqIGB0cnVlYCBidXQgdGhlIGRlcHRoIHRlc3QgZmFpbHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1plcm9TdGVuY2lsT3B8S2VlcFN0ZW5jaWxPcHxSZXBsYWNlU3RlbmNpbE9wfEluY3JlbWVudFN0ZW5jaWxPcHxEZWNyZW1lbnRTdGVuY2lsT3B8SW5jcmVtZW50V3JhcFN0ZW5jaWxPcHxEZWNyZW1lbnRXcmFwU3RlbmNpbE9wfEludmVydFN0ZW5jaWxPcH1cclxuXHRcdCAqIEBkZWZhdWx0IEtlZXBTdGVuY2lsT3BcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zdGVuY2lsWkZhaWwgPSBLZWVwU3RlbmNpbE9wO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hpY2ggc3RlbmNpbCBvcGVyYXRpb24gdG8gcGVyZm9ybSB3aGVuIHRoZSBjb21wYXJpc29uIGZ1bmN0aW9uIHJldHVybnNcclxuXHRcdCAqIGB0cnVlYCBhbmQgdGhlIGRlcHRoIHRlc3QgcGFzc2VzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtaZXJvU3RlbmNpbE9wfEtlZXBTdGVuY2lsT3B8UmVwbGFjZVN0ZW5jaWxPcHxJbmNyZW1lbnRTdGVuY2lsT3B8RGVjcmVtZW50U3RlbmNpbE9wfEluY3JlbWVudFdyYXBTdGVuY2lsT3B8RGVjcmVtZW50V3JhcFN0ZW5jaWxPcHxJbnZlcnRTdGVuY2lsT3B9XHJcblx0XHQgKiBAZGVmYXVsdCBLZWVwU3RlbmNpbE9wXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc3RlbmNpbFpQYXNzID0gS2VlcFN0ZW5jaWxPcDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgc3RlbmNpbCBvcGVyYXRpb25zIGFyZSBwZXJmb3JtZWQgYWdhaW5zdCB0aGUgc3RlbmNpbCBidWZmZXIuIEluXHJcblx0XHQgKiBvcmRlciB0byBwZXJmb3JtIHdyaXRlcyBvciBjb21wYXJpc29ucyBhZ2FpbnN0IHRoZSBzdGVuY2lsIGJ1ZmZlciB0aGlzXHJcblx0XHQgKiB2YWx1ZSBtdXN0IGJlIGB0cnVlYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc3RlbmNpbFdyaXRlID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBVc2VyLWRlZmluZWQgY2xpcHBpbmcgcGxhbmVzIHNwZWNpZmllZCBhcyBUSFJFRS5QbGFuZSBvYmplY3RzIGluIHdvcmxkXHJcblx0XHQgKiBzcGFjZS4gVGhlc2UgcGxhbmVzIGFwcGx5IHRvIHRoZSBvYmplY3RzIHRoaXMgbWF0ZXJpYWwgaXMgYXR0YWNoZWQgdG8uXHJcblx0XHQgKiBQb2ludHMgaW4gc3BhY2Ugd2hvc2Ugc2lnbmVkIGRpc3RhbmNlIHRvIHRoZSBwbGFuZSBpcyBuZWdhdGl2ZSBhcmUgY2xpcHBlZFxyXG5cdFx0ICogKG5vdCByZW5kZXJlZCkuIFRoaXMgcmVxdWlyZXMge0BsaW5rIFdlYkdMUmVuZGVyZXIjbG9jYWxDbGlwcGluZ0VuYWJsZWR9IHRvXHJcblx0XHQgKiBiZSBgdHJ1ZWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9BcnJheTxQbGFuZT59XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2xpcHBpbmdQbGFuZXMgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQ2hhbmdlcyB0aGUgYmVoYXZpb3Igb2YgY2xpcHBpbmcgcGxhbmVzIHNvIHRoYXQgb25seSB0aGVpciBpbnRlcnNlY3Rpb24gaXNcclxuXHRcdCAqIGNsaXBwZWQsIHJhdGhlciB0aGFuIHRoZWlyIHVuaW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jbGlwSW50ZXJzZWN0aW9uID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIHdoZXRoZXIgdG8gY2xpcCBzaGFkb3dzIGFjY29yZGluZyB0byB0aGUgY2xpcHBpbmcgcGxhbmVzIHNwZWNpZmllZFxyXG5cdFx0ICogb24gdGhpcyBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2xpcFNoYWRvd3MgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgd2hpY2ggc2lkZSBvZiBmYWNlcyBjYXN0IHNoYWRvd3MuIElmIGBudWxsYCwgdGhlIHNpZGUgY2FzdGluZyBzaGFkb3dzXHJcblx0XHQgKiBpcyBkZXRlcm1pbmVkIGFzIGZvbGxvd3M6XHJcblx0XHQgKlxyXG5cdFx0ICogLSBXaGVuIHtAbGluayBNYXRlcmlhbCNzaWRlfSBpcyBzZXQgdG8gYEZyb250U2lkZWAsIHRoZSBiYWNrIHNpZGUgY2FzdCBzaGFkb3dzLlxyXG5cdFx0ICogLSBXaGVuIHtAbGluayBNYXRlcmlhbCNzaWRlfSBpcyBzZXQgdG8gYEJhY2tTaWRlYCwgdGhlIGZyb250IHNpZGUgY2FzdCBzaGFkb3dzLlxyXG5cdFx0ICogLSBXaGVuIHtAbGluayBNYXRlcmlhbCNzaWRlfSBpcyBzZXQgdG8gYERvdWJsZVNpZGVgLCBib3RoIHNpZGVzIGNhc3Qgc2hhZG93cy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7PyhGcm9udFNpZGV8QmFja1NpZGV8RG91YmxlU2lkZSl9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2hhZG93U2lkZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRvIHJlbmRlciB0aGUgbWF0ZXJpYWwncyBjb2xvci5cclxuXHRcdCAqXHJcblx0XHQgKiBUaGlzIGNhbiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGgge0BsaW5rIE9iamVjdDNEI3JlbmRlck9kZXJ9IHRvIGNyZWF0ZSBpbnZpc2libGVcclxuXHRcdCAqIG9iamVjdHMgdGhhdCBvY2NsdWRlIG90aGVyIG9iamVjdHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29sb3JXcml0ZSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBPdmVycmlkZSB0aGUgcmVuZGVyZXIncyBkZWZhdWx0IHByZWNpc2lvbiBmb3IgdGhpcyBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7PygnaGlnaHAnfCdtZWRpdW1wJ3wnbG93cCcpfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnByZWNpc2lvbiA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRvIHVzZSBwb2x5Z29uIG9mZnNldCBvciBub3QuIFdoZW4gZW5hYmxlZCwgZWFjaCBmcmFnbWVudCdzIGRlcHRoIHZhbHVlIHdpbGxcclxuXHRcdCAqIGJlIG9mZnNldCBhZnRlciBpdCBpcyBpbnRlcnBvbGF0ZWQgZnJvbSB0aGUgZGVwdGggdmFsdWVzIG9mIHRoZSBhcHByb3ByaWF0ZSB2ZXJ0aWNlcy5cclxuXHRcdCAqIFRoZSBvZmZzZXQgaXMgYWRkZWQgYmVmb3JlIHRoZSBkZXB0aCB0ZXN0IGlzIHBlcmZvcm1lZCBhbmQgYmVmb3JlIHRoZSB2YWx1ZSBpcyB3cml0dGVuXHJcblx0XHQgKiBpbnRvIHRoZSBkZXB0aCBidWZmZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQ2FuIGJlIHVzZWZ1bCBmb3IgcmVuZGVyaW5nIGhpZGRlbi1saW5lIGltYWdlcywgZm9yIGFwcGx5aW5nIGRlY2FscyB0byBzdXJmYWNlcywgYW5kIGZvclxyXG5cdFx0ICogcmVuZGVyaW5nIHNvbGlkcyB3aXRoIGhpZ2hsaWdodGVkIGVkZ2VzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wb2x5Z29uT2Zmc2V0ID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTcGVjaWZpZXMgYSBzY2FsZSBmYWN0b3IgdGhhdCBpcyB1c2VkIHRvIGNyZWF0ZSBhIHZhcmlhYmxlIGRlcHRoIG9mZnNldCBmb3IgZWFjaCBwb2x5Z29uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucG9seWdvbk9mZnNldEZhY3RvciA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBJcyBtdWx0aXBsaWVkIGJ5IGFuIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIHZhbHVlIHRvIGNyZWF0ZSBhIGNvbnN0YW50IGRlcHRoIG9mZnNldC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBvbHlnb25PZmZzZXRVbml0cyA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRvIGFwcGx5IGRpdGhlcmluZyB0byB0aGUgY29sb3IgdG8gcmVtb3ZlIHRoZSBhcHBlYXJhbmNlIG9mIGJhbmRpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRpdGhlcmluZyA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciBhbHBoYSB0byBjb3ZlcmFnZSBzaG91bGQgYmUgZW5hYmxlZCBvciBub3QuIENhbiBvbmx5IGJlIHVzZWQgd2l0aCBNU0FBLWVuYWJsZWQgY29udGV4dHNcclxuXHRcdCAqIChtZWFuaW5nIHdoZW4gdGhlIHJlbmRlcmVyIHdhcyBjcmVhdGVkIHdpdGggKmFudGlhbGlhcyogcGFyYW1ldGVyIHNldCB0byBgdHJ1ZWApLiBFbmFibGluZyB0aGlzXHJcblx0XHQgKiB3aWxsIHNtb290aCBhbGlhc2luZyBvbiBjbGlwIHBsYW5lIGVkZ2VzIGFuZCBhbHBoYVRlc3QtY2xpcHBlZCBlZGdlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYWxwaGFUb0NvdmVyYWdlID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRvIHByZW11bHRpcGx5IHRoZSBhbHBoYSAodHJhbnNwYXJlbmN5KSB2YWx1ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucHJlbXVsdGlwbGllZEFscGhhID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIGRvdWJsZS1zaWRlZCwgdHJhbnNwYXJlbnQgb2JqZWN0cyBzaG91bGQgYmUgcmVuZGVyZWQgd2l0aCBhIHNpbmdsZSBwYXNzIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBUaGUgZW5naW5lIHJlbmRlcnMgZG91YmxlLXNpZGVkLCB0cmFuc3BhcmVudCBvYmplY3RzIHdpdGggdHdvIGRyYXcgY2FsbHMgKGJhY2sgZmFjZXMgZmlyc3QsXHJcblx0XHQgKiB0aGVuIGZyb250IGZhY2VzKSB0byBtaXRpZ2F0ZSB0cmFuc3BhcmVuY3kgYXJ0aWZhY3RzLiBUaGVyZSBhcmUgc2NlbmFyaW9zIGhvd2V2ZXIgd2hlcmUgdGhpc1xyXG5cdFx0ICogYXBwcm9hY2ggcHJvZHVjZXMgbm8gcXVhbGl0eSBnYWlucyBidXQgc3RpbGwgZG91YmxlcyBkcmF3IGNhbGxzIGUuZy4gd2hlbiByZW5kZXJpbmcgZmxhdFxyXG5cdFx0ICogdmVnZXRhdGlvbiBsaWtlIGdyYXNzIHNwcml0ZXMuIEluIHRoZXNlIGNhc2VzLCBzZXQgdGhlIGBmb3JjZVNpbmdsZVBhc3NgIGZsYWcgdG8gYHRydWVgIHRvXHJcblx0XHQgKiBkaXNhYmxlIHRoZSB0d28gcGFzcyByZW5kZXJpbmcgdG8gYXZvaWQgcGVyZm9ybWFuY2UgaXNzdWVzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5mb3JjZVNpbmdsZVBhc3MgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgaXQncyBwb3NzaWJsZSB0byBvdmVycmlkZSB0aGUgbWF0ZXJpYWwgd2l0aCB7QGxpbmsgU2NlbmUjb3ZlcnJpZGVNYXRlcmlhbH0gb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFsbG93T3ZlcnJpZGUgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyB3aGV0aGVyIDNEIG9iamVjdHMgdXNpbmcgdGhpcyBtYXRlcmlhbCBhcmUgdmlzaWJsZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52aXNpYmxlID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgd2hldGhlciB0aGlzIG1hdGVyaWFsIGlzIHRvbmUgbWFwcGVkIGFjY29yZGluZyB0byB0aGUgcmVuZGVyZXIncyB0b25lIG1hcHBpbmcgc2V0dGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBJdCBpcyBpZ25vcmVkIHdoZW4gcmVuZGVyaW5nIHRvIGEgcmVuZGVyIHRhcmdldCBvciB1c2luZyBwb3N0IHByb2Nlc3Npbmcgb3Igd2hlbiB1c2luZ1xyXG5cdFx0ICogYFdlYkdQVVJlbmRlcmVyYC4gSW4gYWxsIHRoZXNlIGNhc2VzLCBhbGwgbWF0ZXJpYWxzIGFyZSBob25vcmVkIGJ5IHRvbmUgbWFwcGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50b25lTWFwcGVkID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIHN0b3JlIGN1c3RvbSBkYXRhIGFib3V0IHRoZSBNYXRlcmlhbC4gSXRcclxuXHRcdCAqIHNob3VsZCBub3QgaG9sZCByZWZlcmVuY2VzIHRvIGZ1bmN0aW9ucyBhcyB0aGVzZSB3aWxsIG5vdCBiZSBjbG9uZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51c2VyRGF0YSA9IHt9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBzdGFydHMgYXQgYDBgIGFuZCBjb3VudHMgaG93IG1hbnkgdGltZXMge0BsaW5rIE1hdGVyaWFsI25lZWRzVXBkYXRlfSBpcyBzZXQgdG8gYHRydWVgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52ZXJzaW9uID0gMDtcclxuXHJcblx0XHR0aGlzLl9hbHBoYVRlc3QgPSAwO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGFscGhhIHZhbHVlIHRvIGJlIHVzZWQgd2hlbiBydW5uaW5nIGFuIGFscGhhIHRlc3QuIFRoZSBtYXRlcmlhbFxyXG5cdCAqIHdpbGwgbm90IGJlIHJlbmRlcmVkIGlmIHRoZSBvcGFjaXR5IGlzIGxvd2VyIHRoYW4gdGhpcyB2YWx1ZS5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0ICogQHJlYWRvbmx5XHJcblx0ICogQGRlZmF1bHQgMFxyXG5cdCAqL1xyXG5cdGdldCBhbHBoYVRlc3QoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX2FscGhhVGVzdDtcclxuXHJcblx0fVxyXG5cclxuXHRzZXQgYWxwaGFUZXN0KCB2YWx1ZSApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuX2FscGhhVGVzdCA+IDAgIT09IHZhbHVlID4gMCApIHtcclxuXHJcblx0XHRcdHRoaXMudmVyc2lvbiArKztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5fYWxwaGFUZXN0ID0gdmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQW4gb3B0aW9uYWwgY2FsbGJhY2sgdGhhdCBpcyBleGVjdXRlZCBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIG1hdGVyaWFsIGlzIHVzZWQgdG8gcmVuZGVyIGEgM0Qgb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogVGhpcyBtZXRob2QgY2FuIG9ubHkgYmUgdXNlZCB3aGVuIHJlbmRlcmluZyB3aXRoIHtAbGluayBXZWJHTFJlbmRlcmVyfS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcblx0ICogQHBhcmFtIHtTY2VuZX0gc2NlbmUgLSBUaGUgc2NlbmUuXHJcblx0ICogQHBhcmFtIHtDYW1lcmF9IGNhbWVyYSAtIFRoZSBjYW1lcmEgdGhhdCBpcyB1c2VkIHRvIHJlbmRlciB0aGUgc2NlbmUuXHJcblx0ICogQHBhcmFtIHtCdWZmZXJHZW9tZXRyeX0gZ2VvbWV0cnkgLSBUaGUgM0Qgb2JqZWN0J3MgZ2VvbWV0cnkuXHJcblx0ICogQHBhcmFtIHtPYmplY3QzRH0gb2JqZWN0IC0gVGhlIDNEIG9iamVjdC5cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gZ3JvdXAgLSBUaGUgZ2VvbWV0cnkgZ3JvdXAgZGF0YS5cclxuXHQgKi9cclxuXHRvbkJlZm9yZVJlbmRlciggLyogcmVuZGVyZXIsIHNjZW5lLCBjYW1lcmEsIGdlb21ldHJ5LCBvYmplY3QsIGdyb3VwICovICkge31cclxuXHJcblx0LyoqXHJcblx0ICogQW4gb3B0aW9uYWwgY2FsbGJhY2sgdGhhdCBpcyBleGVjdXRlZCBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIHNoYWRlclxyXG5cdCAqIHByb2dyYW0gaXMgY29tcGlsZWQuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggdGhlIHNoYWRlciBzb3VyY2UgY29kZVxyXG5cdCAqIGFzIGEgcGFyYW1ldGVyLiBVc2VmdWwgZm9yIHRoZSBtb2RpZmljYXRpb24gb2YgYnVpbHQtaW4gbWF0ZXJpYWxzLlxyXG5cdCAqXHJcblx0ICogVGhpcyBtZXRob2QgY2FuIG9ubHkgYmUgdXNlZCB3aGVuIHJlbmRlcmluZyB3aXRoIHtAbGluayBXZWJHTFJlbmRlcmVyfS4gVGhlXHJcblx0ICogcmVjb21tZW5kZWQgYXBwcm9hY2ggd2hlbiBjdXN0b21pemluZyBtYXRlcmlhbHMgaXMgdG8gdXNlIGBXZWJHUFVSZW5kZXJlcmAgd2l0aCB0aGUgbmV3XHJcblx0ICogTm9kZSBNYXRlcmlhbCBzeXN0ZW0gYW5kIFtUU0xde0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9tcmRvb2IvdGhyZWUuanMvd2lraS9UaHJlZS5qcy1TaGFkaW5nLUxhbmd1YWdlfS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7e3ZlcnRleFNoYWRlcjpzdHJpbmcsZnJhZ21lbnRTaGFkZXI6c3RyaW5nLHVuaWZvcm1zOk9iamVjdH19IHNoYWRlcm9iamVjdCAtIFRoZSBvYmplY3QgaG9sZHMgdGhlIHVuaWZvcm1zIGFuZCB0aGUgdmVydGV4IGFuZCBmcmFnbWVudCBzaGFkZXIgc291cmNlLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgcmVuZGVyZXIuXHJcblx0ICovXHJcblx0b25CZWZvcmVDb21waWxlKCAvKiBzaGFkZXJvYmplY3QsIHJlbmRlcmVyICovICkge31cclxuXHJcblx0LyoqXHJcblx0ICogSW4gY2FzZSB7QGxpbmsgTWF0ZXJpYWwjb25CZWZvcmVDb21waWxlfSBpcyB1c2VkLCB0aGlzIGNhbGxiYWNrIGNhbiBiZSB1c2VkIHRvIGlkZW50aWZ5XHJcblx0ICogdmFsdWVzIG9mIHNldHRpbmdzIHVzZWQgaW4gYG9uQmVmb3JlQ29tcGlsZSgpYCwgc28gdGhyZWUuanMgY2FuIHJldXNlIGEgY2FjaGVkXHJcblx0ICogc2hhZGVyIG9yIHJlY29tcGlsZSB0aGUgc2hhZGVyIGZvciB0aGlzIG1hdGVyaWFsIGFzIG5lZWRlZC5cclxuXHQgKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGNhbiBvbmx5IGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgd2l0aCB7QGxpbmsgV2ViR0xSZW5kZXJlcn0uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBjdXN0b20gcHJvZ3JhbSBjYWNoZSBrZXkuXHJcblx0ICovXHJcblx0Y3VzdG9tUHJvZ3JhbUNhY2hlS2V5KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm9uQmVmb3JlQ29tcGlsZS50b1N0cmluZygpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIHNldCBkZWZhdWx0IHZhbHVlcyBmcm9tIHBhcmFtZXRlciBvYmplY3RzLlxyXG5cdCAqIEl0IGlzIGEgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBzbyBpdCBjYW4gYmUgdXNlZCB3aXRoIGRpZmZlcmVudCB0eXBlc1xyXG5cdCAqIG9mIG1hdGVyaWFscy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbdmFsdWVzXSAtIFRoZSBtYXRlcmlhbCB2YWx1ZXMgdG8gc2V0LlxyXG5cdCAqL1xyXG5cdHNldFZhbHVlcyggdmFsdWVzICkge1xyXG5cclxuXHRcdGlmICggdmFsdWVzID09PSB1bmRlZmluZWQgKSByZXR1cm47XHJcblxyXG5cdFx0Zm9yICggY29uc3Qga2V5IGluIHZhbHVlcyApIHtcclxuXHJcblx0XHRcdGNvbnN0IG5ld1ZhbHVlID0gdmFsdWVzWyBrZXkgXTtcclxuXHJcblx0XHRcdGlmICggbmV3VmFsdWUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0Y29uc29sZS53YXJuKCBgVEhSRUUuTWF0ZXJpYWw6IHBhcmFtZXRlciAnJHsga2V5IH0nIGhhcyB2YWx1ZSBvZiB1bmRlZmluZWQuYCApO1xyXG5cdFx0XHRcdGNvbnRpbnVlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgY3VycmVudFZhbHVlID0gdGhpc1sga2V5IF07XHJcblxyXG5cdFx0XHRpZiAoIGN1cnJlbnRWYWx1ZSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRjb25zb2xlLndhcm4oIGBUSFJFRS5NYXRlcmlhbDogJyR7IGtleSB9JyBpcyBub3QgYSBwcm9wZXJ0eSBvZiBUSFJFRS4keyB0aGlzLnR5cGUgfS5gICk7XHJcblx0XHRcdFx0Y29udGludWU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIGN1cnJlbnRWYWx1ZSAmJiBjdXJyZW50VmFsdWUuaXNDb2xvciApIHtcclxuXHJcblx0XHRcdFx0Y3VycmVudFZhbHVlLnNldCggbmV3VmFsdWUgKTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoICggY3VycmVudFZhbHVlICYmIGN1cnJlbnRWYWx1ZS5pc1ZlY3RvcjMgKSAmJiAoIG5ld1ZhbHVlICYmIG5ld1ZhbHVlLmlzVmVjdG9yMyApICkge1xyXG5cclxuXHRcdFx0XHRjdXJyZW50VmFsdWUuY29weSggbmV3VmFsdWUgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHRoaXNbIGtleSBdID0gbmV3VmFsdWU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNlcmlhbGl6ZXMgdGhlIG1hdGVyaWFsIGludG8gSlNPTi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7PyhPYmplY3R8c3RyaW5nKX0gbWV0YSAtIEFuIG9wdGlvbmFsIHZhbHVlIGhvbGRpbmcgbWV0YSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VyaWFsaXphdGlvbi5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3R9IEEgSlNPTiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzZXJpYWxpemVkIG1hdGVyaWFsLlxyXG5cdCAqIEBzZWUge0BsaW5rIE9iamVjdExvYWRlciNwYXJzZX1cclxuXHQgKi9cclxuXHR0b0pTT04oIG1ldGEgKSB7XHJcblxyXG5cdFx0Y29uc3QgaXNSb290T2JqZWN0ID0gKCBtZXRhID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIG1ldGEgPT09ICdzdHJpbmcnICk7XHJcblxyXG5cdFx0aWYgKCBpc1Jvb3RPYmplY3QgKSB7XHJcblxyXG5cdFx0XHRtZXRhID0ge1xyXG5cdFx0XHRcdHRleHR1cmVzOiB7fSxcclxuXHRcdFx0XHRpbWFnZXM6IHt9XHJcblx0XHRcdH07XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGRhdGEgPSB7XHJcblx0XHRcdG1ldGFkYXRhOiB7XHJcblx0XHRcdFx0dmVyc2lvbjogNC42LFxyXG5cdFx0XHRcdHR5cGU6ICdNYXRlcmlhbCcsXHJcblx0XHRcdFx0Z2VuZXJhdG9yOiAnTWF0ZXJpYWwudG9KU09OJ1xyXG5cdFx0XHR9XHJcblx0XHR9O1xyXG5cclxuXHRcdC8vIHN0YW5kYXJkIE1hdGVyaWFsIHNlcmlhbGl6YXRpb25cclxuXHRcdGRhdGEudXVpZCA9IHRoaXMudXVpZDtcclxuXHRcdGRhdGEudHlwZSA9IHRoaXMudHlwZTtcclxuXHJcblx0XHRpZiAoIHRoaXMubmFtZSAhPT0gJycgKSBkYXRhLm5hbWUgPSB0aGlzLm5hbWU7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmNvbG9yICYmIHRoaXMuY29sb3IuaXNDb2xvciApIGRhdGEuY29sb3IgPSB0aGlzLmNvbG9yLmdldEhleCgpO1xyXG5cclxuXHRcdGlmICggdGhpcy5yb3VnaG5lc3MgIT09IHVuZGVmaW5lZCApIGRhdGEucm91Z2huZXNzID0gdGhpcy5yb3VnaG5lc3M7XHJcblx0XHRpZiAoIHRoaXMubWV0YWxuZXNzICE9PSB1bmRlZmluZWQgKSBkYXRhLm1ldGFsbmVzcyA9IHRoaXMubWV0YWxuZXNzO1xyXG5cclxuXHRcdGlmICggdGhpcy5zaGVlbiAhPT0gdW5kZWZpbmVkICkgZGF0YS5zaGVlbiA9IHRoaXMuc2hlZW47XHJcblx0XHRpZiAoIHRoaXMuc2hlZW5Db2xvciAmJiB0aGlzLnNoZWVuQ29sb3IuaXNDb2xvciApIGRhdGEuc2hlZW5Db2xvciA9IHRoaXMuc2hlZW5Db2xvci5nZXRIZXgoKTtcclxuXHRcdGlmICggdGhpcy5zaGVlblJvdWdobmVzcyAhPT0gdW5kZWZpbmVkICkgZGF0YS5zaGVlblJvdWdobmVzcyA9IHRoaXMuc2hlZW5Sb3VnaG5lc3M7XHJcblx0XHRpZiAoIHRoaXMuZW1pc3NpdmUgJiYgdGhpcy5lbWlzc2l2ZS5pc0NvbG9yICkgZGF0YS5lbWlzc2l2ZSA9IHRoaXMuZW1pc3NpdmUuZ2V0SGV4KCk7XHJcblx0XHRpZiAoIHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ICE9PSAxICkgZGF0YS5lbWlzc2l2ZUludGVuc2l0eSA9IHRoaXMuZW1pc3NpdmVJbnRlbnNpdHk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLnNwZWN1bGFyICYmIHRoaXMuc3BlY3VsYXIuaXNDb2xvciApIGRhdGEuc3BlY3VsYXIgPSB0aGlzLnNwZWN1bGFyLmdldEhleCgpO1xyXG5cdFx0aWYgKCB0aGlzLnNwZWN1bGFySW50ZW5zaXR5ICE9PSB1bmRlZmluZWQgKSBkYXRhLnNwZWN1bGFySW50ZW5zaXR5ID0gdGhpcy5zcGVjdWxhckludGVuc2l0eTtcclxuXHRcdGlmICggdGhpcy5zcGVjdWxhckNvbG9yICYmIHRoaXMuc3BlY3VsYXJDb2xvci5pc0NvbG9yICkgZGF0YS5zcGVjdWxhckNvbG9yID0gdGhpcy5zcGVjdWxhckNvbG9yLmdldEhleCgpO1xyXG5cdFx0aWYgKCB0aGlzLnNoaW5pbmVzcyAhPT0gdW5kZWZpbmVkICkgZGF0YS5zaGluaW5lc3MgPSB0aGlzLnNoaW5pbmVzcztcclxuXHRcdGlmICggdGhpcy5jbGVhcmNvYXQgIT09IHVuZGVmaW5lZCApIGRhdGEuY2xlYXJjb2F0ID0gdGhpcy5jbGVhcmNvYXQ7XHJcblx0XHRpZiAoIHRoaXMuY2xlYXJjb2F0Um91Z2huZXNzICE9PSB1bmRlZmluZWQgKSBkYXRhLmNsZWFyY29hdFJvdWdobmVzcyA9IHRoaXMuY2xlYXJjb2F0Um91Z2huZXNzO1xyXG5cclxuXHRcdGlmICggdGhpcy5jbGVhcmNvYXRNYXAgJiYgdGhpcy5jbGVhcmNvYXRNYXAuaXNUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0ZGF0YS5jbGVhcmNvYXRNYXAgPSB0aGlzLmNsZWFyY29hdE1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMuY2xlYXJjb2F0Um91Z2huZXNzTWFwICYmIHRoaXMuY2xlYXJjb2F0Um91Z2huZXNzTWFwLmlzVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdGRhdGEuY2xlYXJjb2F0Um91Z2huZXNzTWFwID0gdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3NNYXAudG9KU09OKCBtZXRhICkudXVpZDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aGlzLmNsZWFyY29hdE5vcm1hbE1hcCAmJiB0aGlzLmNsZWFyY29hdE5vcm1hbE1hcC5pc1RleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRkYXRhLmNsZWFyY29hdE5vcm1hbE1hcCA9IHRoaXMuY2xlYXJjb2F0Tm9ybWFsTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XHJcblx0XHRcdGRhdGEuY2xlYXJjb2F0Tm9ybWFsU2NhbGUgPSB0aGlzLmNsZWFyY29hdE5vcm1hbFNjYWxlLnRvQXJyYXkoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aGlzLmRpc3BlcnNpb24gIT09IHVuZGVmaW5lZCApIGRhdGEuZGlzcGVyc2lvbiA9IHRoaXMuZGlzcGVyc2lvbjtcclxuXHJcblx0XHRpZiAoIHRoaXMuaXJpZGVzY2VuY2UgIT09IHVuZGVmaW5lZCApIGRhdGEuaXJpZGVzY2VuY2UgPSB0aGlzLmlyaWRlc2NlbmNlO1xyXG5cdFx0aWYgKCB0aGlzLmlyaWRlc2NlbmNlSU9SICE9PSB1bmRlZmluZWQgKSBkYXRhLmlyaWRlc2NlbmNlSU9SID0gdGhpcy5pcmlkZXNjZW5jZUlPUjtcclxuXHRcdGlmICggdGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlICE9PSB1bmRlZmluZWQgKSBkYXRhLmlyaWRlc2NlbmNlVGhpY2tuZXNzUmFuZ2UgPSB0aGlzLmlyaWRlc2NlbmNlVGhpY2tuZXNzUmFuZ2U7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmlyaWRlc2NlbmNlTWFwICYmIHRoaXMuaXJpZGVzY2VuY2VNYXAuaXNUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0ZGF0YS5pcmlkZXNjZW5jZU1hcCA9IHRoaXMuaXJpZGVzY2VuY2VNYXAudG9KU09OKCBtZXRhICkudXVpZDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aGlzLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwICYmIHRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAuaXNUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0ZGF0YS5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcCA9IHRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAudG9KU09OKCBtZXRhICkudXVpZDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aGlzLmFuaXNvdHJvcHkgIT09IHVuZGVmaW5lZCApIGRhdGEuYW5pc290cm9weSA9IHRoaXMuYW5pc290cm9weTtcclxuXHRcdGlmICggdGhpcy5hbmlzb3Ryb3B5Um90YXRpb24gIT09IHVuZGVmaW5lZCApIGRhdGEuYW5pc290cm9weVJvdGF0aW9uID0gdGhpcy5hbmlzb3Ryb3B5Um90YXRpb247XHJcblxyXG5cdFx0aWYgKCB0aGlzLmFuaXNvdHJvcHlNYXAgJiYgdGhpcy5hbmlzb3Ryb3B5TWFwLmlzVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdGRhdGEuYW5pc290cm9weU1hcCA9IHRoaXMuYW5pc290cm9weU1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMubWFwICYmIHRoaXMubWFwLmlzVGV4dHVyZSApIGRhdGEubWFwID0gdGhpcy5tYXAudG9KU09OKCBtZXRhICkudXVpZDtcclxuXHRcdGlmICggdGhpcy5tYXRjYXAgJiYgdGhpcy5tYXRjYXAuaXNUZXh0dXJlICkgZGF0YS5tYXRjYXAgPSB0aGlzLm1hdGNhcC50b0pTT04oIG1ldGEgKS51dWlkO1xyXG5cdFx0aWYgKCB0aGlzLmFscGhhTWFwICYmIHRoaXMuYWxwaGFNYXAuaXNUZXh0dXJlICkgZGF0YS5hbHBoYU1hcCA9IHRoaXMuYWxwaGFNYXAudG9KU09OKCBtZXRhICkudXVpZDtcclxuXHJcblx0XHRpZiAoIHRoaXMubGlnaHRNYXAgJiYgdGhpcy5saWdodE1hcC5pc1RleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRkYXRhLmxpZ2h0TWFwID0gdGhpcy5saWdodE1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xyXG5cdFx0XHRkYXRhLmxpZ2h0TWFwSW50ZW5zaXR5ID0gdGhpcy5saWdodE1hcEludGVuc2l0eTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aGlzLmFvTWFwICYmIHRoaXMuYW9NYXAuaXNUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0ZGF0YS5hb01hcCA9IHRoaXMuYW9NYXAudG9KU09OKCBtZXRhICkudXVpZDtcclxuXHRcdFx0ZGF0YS5hb01hcEludGVuc2l0eSA9IHRoaXMuYW9NYXBJbnRlbnNpdHk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy5idW1wTWFwICYmIHRoaXMuYnVtcE1hcC5pc1RleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRkYXRhLmJ1bXBNYXAgPSB0aGlzLmJ1bXBNYXAudG9KU09OKCBtZXRhICkudXVpZDtcclxuXHRcdFx0ZGF0YS5idW1wU2NhbGUgPSB0aGlzLmJ1bXBTY2FsZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5vcm1hbE1hcCAmJiB0aGlzLm5vcm1hbE1hcC5pc1RleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRkYXRhLm5vcm1hbE1hcCA9IHRoaXMubm9ybWFsTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XHJcblx0XHRcdGRhdGEubm9ybWFsTWFwVHlwZSA9IHRoaXMubm9ybWFsTWFwVHlwZTtcclxuXHRcdFx0ZGF0YS5ub3JtYWxTY2FsZSA9IHRoaXMubm9ybWFsU2NhbGUudG9BcnJheSgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMuZGlzcGxhY2VtZW50TWFwICYmIHRoaXMuZGlzcGxhY2VtZW50TWFwLmlzVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdGRhdGEuZGlzcGxhY2VtZW50TWFwID0gdGhpcy5kaXNwbGFjZW1lbnRNYXAudG9KU09OKCBtZXRhICkudXVpZDtcclxuXHRcdFx0ZGF0YS5kaXNwbGFjZW1lbnRTY2FsZSA9IHRoaXMuZGlzcGxhY2VtZW50U2NhbGU7XHJcblx0XHRcdGRhdGEuZGlzcGxhY2VtZW50QmlhcyA9IHRoaXMuZGlzcGxhY2VtZW50QmlhcztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aGlzLnJvdWdobmVzc01hcCAmJiB0aGlzLnJvdWdobmVzc01hcC5pc1RleHR1cmUgKSBkYXRhLnJvdWdobmVzc01hcCA9IHRoaXMucm91Z2huZXNzTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XHJcblx0XHRpZiAoIHRoaXMubWV0YWxuZXNzTWFwICYmIHRoaXMubWV0YWxuZXNzTWFwLmlzVGV4dHVyZSApIGRhdGEubWV0YWxuZXNzTWFwID0gdGhpcy5tZXRhbG5lc3NNYXAudG9KU09OKCBtZXRhICkudXVpZDtcclxuXHJcblx0XHRpZiAoIHRoaXMuZW1pc3NpdmVNYXAgJiYgdGhpcy5lbWlzc2l2ZU1hcC5pc1RleHR1cmUgKSBkYXRhLmVtaXNzaXZlTWFwID0gdGhpcy5lbWlzc2l2ZU1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xyXG5cdFx0aWYgKCB0aGlzLnNwZWN1bGFyTWFwICYmIHRoaXMuc3BlY3VsYXJNYXAuaXNUZXh0dXJlICkgZGF0YS5zcGVjdWxhck1hcCA9IHRoaXMuc3BlY3VsYXJNYXAudG9KU09OKCBtZXRhICkudXVpZDtcclxuXHRcdGlmICggdGhpcy5zcGVjdWxhckludGVuc2l0eU1hcCAmJiB0aGlzLnNwZWN1bGFySW50ZW5zaXR5TWFwLmlzVGV4dHVyZSApIGRhdGEuc3BlY3VsYXJJbnRlbnNpdHlNYXAgPSB0aGlzLnNwZWN1bGFySW50ZW5zaXR5TWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XHJcblx0XHRpZiAoIHRoaXMuc3BlY3VsYXJDb2xvck1hcCAmJiB0aGlzLnNwZWN1bGFyQ29sb3JNYXAuaXNUZXh0dXJlICkgZGF0YS5zcGVjdWxhckNvbG9yTWFwID0gdGhpcy5zcGVjdWxhckNvbG9yTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmVudk1hcCAmJiB0aGlzLmVudk1hcC5pc1RleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRkYXRhLmVudk1hcCA9IHRoaXMuZW52TWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMuY29tYmluZSAhPT0gdW5kZWZpbmVkICkgZGF0YS5jb21iaW5lID0gdGhpcy5jb21iaW5lO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMuZW52TWFwUm90YXRpb24gIT09IHVuZGVmaW5lZCApIGRhdGEuZW52TWFwUm90YXRpb24gPSB0aGlzLmVudk1hcFJvdGF0aW9uLnRvQXJyYXkoKTtcclxuXHRcdGlmICggdGhpcy5lbnZNYXBJbnRlbnNpdHkgIT09IHVuZGVmaW5lZCApIGRhdGEuZW52TWFwSW50ZW5zaXR5ID0gdGhpcy5lbnZNYXBJbnRlbnNpdHk7XHJcblx0XHRpZiAoIHRoaXMucmVmbGVjdGl2aXR5ICE9PSB1bmRlZmluZWQgKSBkYXRhLnJlZmxlY3Rpdml0eSA9IHRoaXMucmVmbGVjdGl2aXR5O1xyXG5cdFx0aWYgKCB0aGlzLnJlZnJhY3Rpb25SYXRpbyAhPT0gdW5kZWZpbmVkICkgZGF0YS5yZWZyYWN0aW9uUmF0aW8gPSB0aGlzLnJlZnJhY3Rpb25SYXRpbztcclxuXHJcblx0XHRpZiAoIHRoaXMuZ3JhZGllbnRNYXAgJiYgdGhpcy5ncmFkaWVudE1hcC5pc1RleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRkYXRhLmdyYWRpZW50TWFwID0gdGhpcy5ncmFkaWVudE1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMudHJhbnNtaXNzaW9uICE9PSB1bmRlZmluZWQgKSBkYXRhLnRyYW5zbWlzc2lvbiA9IHRoaXMudHJhbnNtaXNzaW9uO1xyXG5cdFx0aWYgKCB0aGlzLnRyYW5zbWlzc2lvbk1hcCAmJiB0aGlzLnRyYW5zbWlzc2lvbk1hcC5pc1RleHR1cmUgKSBkYXRhLnRyYW5zbWlzc2lvbk1hcCA9IHRoaXMudHJhbnNtaXNzaW9uTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XHJcblx0XHRpZiAoIHRoaXMudGhpY2tuZXNzICE9PSB1bmRlZmluZWQgKSBkYXRhLnRoaWNrbmVzcyA9IHRoaXMudGhpY2tuZXNzO1xyXG5cdFx0aWYgKCB0aGlzLnRoaWNrbmVzc01hcCAmJiB0aGlzLnRoaWNrbmVzc01hcC5pc1RleHR1cmUgKSBkYXRhLnRoaWNrbmVzc01hcCA9IHRoaXMudGhpY2tuZXNzTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XHJcblx0XHRpZiAoIHRoaXMuYXR0ZW51YXRpb25EaXN0YW5jZSAhPT0gdW5kZWZpbmVkICYmIHRoaXMuYXR0ZW51YXRpb25EaXN0YW5jZSAhPT0gSW5maW5pdHkgKSBkYXRhLmF0dGVudWF0aW9uRGlzdGFuY2UgPSB0aGlzLmF0dGVudWF0aW9uRGlzdGFuY2U7XHJcblx0XHRpZiAoIHRoaXMuYXR0ZW51YXRpb25Db2xvciAhPT0gdW5kZWZpbmVkICkgZGF0YS5hdHRlbnVhdGlvbkNvbG9yID0gdGhpcy5hdHRlbnVhdGlvbkNvbG9yLmdldEhleCgpO1xyXG5cclxuXHRcdGlmICggdGhpcy5zaXplICE9PSB1bmRlZmluZWQgKSBkYXRhLnNpemUgPSB0aGlzLnNpemU7XHJcblx0XHRpZiAoIHRoaXMuc2hhZG93U2lkZSAhPT0gbnVsbCApIGRhdGEuc2hhZG93U2lkZSA9IHRoaXMuc2hhZG93U2lkZTtcclxuXHRcdGlmICggdGhpcy5zaXplQXR0ZW51YXRpb24gIT09IHVuZGVmaW5lZCApIGRhdGEuc2l6ZUF0dGVudWF0aW9uID0gdGhpcy5zaXplQXR0ZW51YXRpb247XHJcblxyXG5cdFx0aWYgKCB0aGlzLmJsZW5kaW5nICE9PSBOb3JtYWxCbGVuZGluZyApIGRhdGEuYmxlbmRpbmcgPSB0aGlzLmJsZW5kaW5nO1xyXG5cdFx0aWYgKCB0aGlzLnNpZGUgIT09IEZyb250U2lkZSApIGRhdGEuc2lkZSA9IHRoaXMuc2lkZTtcclxuXHRcdGlmICggdGhpcy52ZXJ0ZXhDb2xvcnMgPT09IHRydWUgKSBkYXRhLnZlcnRleENvbG9ycyA9IHRydWU7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm9wYWNpdHkgPCAxICkgZGF0YS5vcGFjaXR5ID0gdGhpcy5vcGFjaXR5O1xyXG5cdFx0aWYgKCB0aGlzLnRyYW5zcGFyZW50ID09PSB0cnVlICkgZGF0YS50cmFuc3BhcmVudCA9IHRydWU7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmJsZW5kU3JjICE9PSBTcmNBbHBoYUZhY3RvciApIGRhdGEuYmxlbmRTcmMgPSB0aGlzLmJsZW5kU3JjO1xyXG5cdFx0aWYgKCB0aGlzLmJsZW5kRHN0ICE9PSBPbmVNaW51c1NyY0FscGhhRmFjdG9yICkgZGF0YS5ibGVuZERzdCA9IHRoaXMuYmxlbmREc3Q7XHJcblx0XHRpZiAoIHRoaXMuYmxlbmRFcXVhdGlvbiAhPT0gQWRkRXF1YXRpb24gKSBkYXRhLmJsZW5kRXF1YXRpb24gPSB0aGlzLmJsZW5kRXF1YXRpb247XHJcblx0XHRpZiAoIHRoaXMuYmxlbmRTcmNBbHBoYSAhPT0gbnVsbCApIGRhdGEuYmxlbmRTcmNBbHBoYSA9IHRoaXMuYmxlbmRTcmNBbHBoYTtcclxuXHRcdGlmICggdGhpcy5ibGVuZERzdEFscGhhICE9PSBudWxsICkgZGF0YS5ibGVuZERzdEFscGhhID0gdGhpcy5ibGVuZERzdEFscGhhO1xyXG5cdFx0aWYgKCB0aGlzLmJsZW5kRXF1YXRpb25BbHBoYSAhPT0gbnVsbCApIGRhdGEuYmxlbmRFcXVhdGlvbkFscGhhID0gdGhpcy5ibGVuZEVxdWF0aW9uQWxwaGE7XHJcblx0XHRpZiAoIHRoaXMuYmxlbmRDb2xvciAmJiB0aGlzLmJsZW5kQ29sb3IuaXNDb2xvciApIGRhdGEuYmxlbmRDb2xvciA9IHRoaXMuYmxlbmRDb2xvci5nZXRIZXgoKTtcclxuXHRcdGlmICggdGhpcy5ibGVuZEFscGhhICE9PSAwICkgZGF0YS5ibGVuZEFscGhhID0gdGhpcy5ibGVuZEFscGhhO1xyXG5cclxuXHRcdGlmICggdGhpcy5kZXB0aEZ1bmMgIT09IExlc3NFcXVhbERlcHRoICkgZGF0YS5kZXB0aEZ1bmMgPSB0aGlzLmRlcHRoRnVuYztcclxuXHRcdGlmICggdGhpcy5kZXB0aFRlc3QgPT09IGZhbHNlICkgZGF0YS5kZXB0aFRlc3QgPSB0aGlzLmRlcHRoVGVzdDtcclxuXHRcdGlmICggdGhpcy5kZXB0aFdyaXRlID09PSBmYWxzZSApIGRhdGEuZGVwdGhXcml0ZSA9IHRoaXMuZGVwdGhXcml0ZTtcclxuXHRcdGlmICggdGhpcy5jb2xvcldyaXRlID09PSBmYWxzZSApIGRhdGEuY29sb3JXcml0ZSA9IHRoaXMuY29sb3JXcml0ZTtcclxuXHJcblx0XHRpZiAoIHRoaXMuc3RlbmNpbFdyaXRlTWFzayAhPT0gMHhmZiApIGRhdGEuc3RlbmNpbFdyaXRlTWFzayA9IHRoaXMuc3RlbmNpbFdyaXRlTWFzaztcclxuXHRcdGlmICggdGhpcy5zdGVuY2lsRnVuYyAhPT0gQWx3YXlzU3RlbmNpbEZ1bmMgKSBkYXRhLnN0ZW5jaWxGdW5jID0gdGhpcy5zdGVuY2lsRnVuYztcclxuXHRcdGlmICggdGhpcy5zdGVuY2lsUmVmICE9PSAwICkgZGF0YS5zdGVuY2lsUmVmID0gdGhpcy5zdGVuY2lsUmVmO1xyXG5cdFx0aWYgKCB0aGlzLnN0ZW5jaWxGdW5jTWFzayAhPT0gMHhmZiApIGRhdGEuc3RlbmNpbEZ1bmNNYXNrID0gdGhpcy5zdGVuY2lsRnVuY01hc2s7XHJcblx0XHRpZiAoIHRoaXMuc3RlbmNpbEZhaWwgIT09IEtlZXBTdGVuY2lsT3AgKSBkYXRhLnN0ZW5jaWxGYWlsID0gdGhpcy5zdGVuY2lsRmFpbDtcclxuXHRcdGlmICggdGhpcy5zdGVuY2lsWkZhaWwgIT09IEtlZXBTdGVuY2lsT3AgKSBkYXRhLnN0ZW5jaWxaRmFpbCA9IHRoaXMuc3RlbmNpbFpGYWlsO1xyXG5cdFx0aWYgKCB0aGlzLnN0ZW5jaWxaUGFzcyAhPT0gS2VlcFN0ZW5jaWxPcCApIGRhdGEuc3RlbmNpbFpQYXNzID0gdGhpcy5zdGVuY2lsWlBhc3M7XHJcblx0XHRpZiAoIHRoaXMuc3RlbmNpbFdyaXRlID09PSB0cnVlICkgZGF0YS5zdGVuY2lsV3JpdGUgPSB0aGlzLnN0ZW5jaWxXcml0ZTtcclxuXHJcblx0XHQvLyByb3RhdGlvbiAoU3ByaXRlTWF0ZXJpYWwpXHJcblx0XHRpZiAoIHRoaXMucm90YXRpb24gIT09IHVuZGVmaW5lZCAmJiB0aGlzLnJvdGF0aW9uICE9PSAwICkgZGF0YS5yb3RhdGlvbiA9IHRoaXMucm90YXRpb247XHJcblxyXG5cdFx0aWYgKCB0aGlzLnBvbHlnb25PZmZzZXQgPT09IHRydWUgKSBkYXRhLnBvbHlnb25PZmZzZXQgPSB0cnVlO1xyXG5cdFx0aWYgKCB0aGlzLnBvbHlnb25PZmZzZXRGYWN0b3IgIT09IDAgKSBkYXRhLnBvbHlnb25PZmZzZXRGYWN0b3IgPSB0aGlzLnBvbHlnb25PZmZzZXRGYWN0b3I7XHJcblx0XHRpZiAoIHRoaXMucG9seWdvbk9mZnNldFVuaXRzICE9PSAwICkgZGF0YS5wb2x5Z29uT2Zmc2V0VW5pdHMgPSB0aGlzLnBvbHlnb25PZmZzZXRVbml0cztcclxuXHJcblx0XHRpZiAoIHRoaXMubGluZXdpZHRoICE9PSB1bmRlZmluZWQgJiYgdGhpcy5saW5ld2lkdGggIT09IDEgKSBkYXRhLmxpbmV3aWR0aCA9IHRoaXMubGluZXdpZHRoO1xyXG5cdFx0aWYgKCB0aGlzLmRhc2hTaXplICE9PSB1bmRlZmluZWQgKSBkYXRhLmRhc2hTaXplID0gdGhpcy5kYXNoU2l6ZTtcclxuXHRcdGlmICggdGhpcy5nYXBTaXplICE9PSB1bmRlZmluZWQgKSBkYXRhLmdhcFNpemUgPSB0aGlzLmdhcFNpemU7XHJcblx0XHRpZiAoIHRoaXMuc2NhbGUgIT09IHVuZGVmaW5lZCApIGRhdGEuc2NhbGUgPSB0aGlzLnNjYWxlO1xyXG5cclxuXHRcdGlmICggdGhpcy5kaXRoZXJpbmcgPT09IHRydWUgKSBkYXRhLmRpdGhlcmluZyA9IHRydWU7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmFscGhhVGVzdCA+IDAgKSBkYXRhLmFscGhhVGVzdCA9IHRoaXMuYWxwaGFUZXN0O1xyXG5cdFx0aWYgKCB0aGlzLmFscGhhSGFzaCA9PT0gdHJ1ZSApIGRhdGEuYWxwaGFIYXNoID0gdHJ1ZTtcclxuXHRcdGlmICggdGhpcy5hbHBoYVRvQ292ZXJhZ2UgPT09IHRydWUgKSBkYXRhLmFscGhhVG9Db3ZlcmFnZSA9IHRydWU7XHJcblx0XHRpZiAoIHRoaXMucHJlbXVsdGlwbGllZEFscGhhID09PSB0cnVlICkgZGF0YS5wcmVtdWx0aXBsaWVkQWxwaGEgPSB0cnVlO1xyXG5cdFx0aWYgKCB0aGlzLmZvcmNlU2luZ2xlUGFzcyA9PT0gdHJ1ZSApIGRhdGEuZm9yY2VTaW5nbGVQYXNzID0gdHJ1ZTtcclxuXHJcblx0XHRpZiAoIHRoaXMud2lyZWZyYW1lID09PSB0cnVlICkgZGF0YS53aXJlZnJhbWUgPSB0cnVlO1xyXG5cdFx0aWYgKCB0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA+IDEgKSBkYXRhLndpcmVmcmFtZUxpbmV3aWR0aCA9IHRoaXMud2lyZWZyYW1lTGluZXdpZHRoO1xyXG5cdFx0aWYgKCB0aGlzLndpcmVmcmFtZUxpbmVjYXAgIT09ICdyb3VuZCcgKSBkYXRhLndpcmVmcmFtZUxpbmVjYXAgPSB0aGlzLndpcmVmcmFtZUxpbmVjYXA7XHJcblx0XHRpZiAoIHRoaXMud2lyZWZyYW1lTGluZWpvaW4gIT09ICdyb3VuZCcgKSBkYXRhLndpcmVmcmFtZUxpbmVqb2luID0gdGhpcy53aXJlZnJhbWVMaW5lam9pbjtcclxuXHJcblx0XHRpZiAoIHRoaXMuZmxhdFNoYWRpbmcgPT09IHRydWUgKSBkYXRhLmZsYXRTaGFkaW5nID0gdHJ1ZTtcclxuXHJcblx0XHRpZiAoIHRoaXMudmlzaWJsZSA9PT0gZmFsc2UgKSBkYXRhLnZpc2libGUgPSBmYWxzZTtcclxuXHJcblx0XHRpZiAoIHRoaXMudG9uZU1hcHBlZCA9PT0gZmFsc2UgKSBkYXRhLnRvbmVNYXBwZWQgPSBmYWxzZTtcclxuXHJcblx0XHRpZiAoIHRoaXMuZm9nID09PSBmYWxzZSApIGRhdGEuZm9nID0gZmFsc2U7XHJcblxyXG5cdFx0aWYgKCBPYmplY3Qua2V5cyggdGhpcy51c2VyRGF0YSApLmxlbmd0aCA+IDAgKSBkYXRhLnVzZXJEYXRhID0gdGhpcy51c2VyRGF0YTtcclxuXHJcblx0XHQvLyBUT0RPOiBDb3BpZWQgZnJvbSBPYmplY3QzRC50b0pTT05cclxuXHJcblx0XHRmdW5jdGlvbiBleHRyYWN0RnJvbUNhY2hlKCBjYWNoZSApIHtcclxuXHJcblx0XHRcdGNvbnN0IHZhbHVlcyA9IFtdO1xyXG5cclxuXHRcdFx0Zm9yICggY29uc3Qga2V5IGluIGNhY2hlICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBkYXRhID0gY2FjaGVbIGtleSBdO1xyXG5cdFx0XHRcdGRlbGV0ZSBkYXRhLm1ldGFkYXRhO1xyXG5cdFx0XHRcdHZhbHVlcy5wdXNoKCBkYXRhICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gdmFsdWVzO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGlzUm9vdE9iamVjdCApIHtcclxuXHJcblx0XHRcdGNvbnN0IHRleHR1cmVzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS50ZXh0dXJlcyApO1xyXG5cdFx0XHRjb25zdCBpbWFnZXMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLmltYWdlcyApO1xyXG5cclxuXHRcdFx0aWYgKCB0ZXh0dXJlcy5sZW5ndGggPiAwICkgZGF0YS50ZXh0dXJlcyA9IHRleHR1cmVzO1xyXG5cdFx0XHRpZiAoIGltYWdlcy5sZW5ndGggPiAwICkgZGF0YS5pbWFnZXMgPSBpbWFnZXM7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBkYXRhO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBuZXcgbWF0ZXJpYWwgd2l0aCBjb3BpZWQgdmFsdWVzIGZyb20gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge01hdGVyaWFsfSBBIGNsb25lIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y2xvbmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvcGllcyB0aGUgdmFsdWVzIG9mIHRoZSBnaXZlbiBtYXRlcmlhbCB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRlcmlhbH0gc291cmNlIC0gVGhlIG1hdGVyaWFsIHRvIGNvcHkuXHJcblx0ICogQHJldHVybiB7TWF0ZXJpYWx9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHRoaXMubmFtZSA9IHNvdXJjZS5uYW1lO1xyXG5cclxuXHRcdHRoaXMuYmxlbmRpbmcgPSBzb3VyY2UuYmxlbmRpbmc7XHJcblx0XHR0aGlzLnNpZGUgPSBzb3VyY2Uuc2lkZTtcclxuXHRcdHRoaXMudmVydGV4Q29sb3JzID0gc291cmNlLnZlcnRleENvbG9ycztcclxuXHJcblx0XHR0aGlzLm9wYWNpdHkgPSBzb3VyY2Uub3BhY2l0eTtcclxuXHRcdHRoaXMudHJhbnNwYXJlbnQgPSBzb3VyY2UudHJhbnNwYXJlbnQ7XHJcblxyXG5cdFx0dGhpcy5ibGVuZFNyYyA9IHNvdXJjZS5ibGVuZFNyYztcclxuXHRcdHRoaXMuYmxlbmREc3QgPSBzb3VyY2UuYmxlbmREc3Q7XHJcblx0XHR0aGlzLmJsZW5kRXF1YXRpb24gPSBzb3VyY2UuYmxlbmRFcXVhdGlvbjtcclxuXHRcdHRoaXMuYmxlbmRTcmNBbHBoYSA9IHNvdXJjZS5ibGVuZFNyY0FscGhhO1xyXG5cdFx0dGhpcy5ibGVuZERzdEFscGhhID0gc291cmNlLmJsZW5kRHN0QWxwaGE7XHJcblx0XHR0aGlzLmJsZW5kRXF1YXRpb25BbHBoYSA9IHNvdXJjZS5ibGVuZEVxdWF0aW9uQWxwaGE7XHJcblx0XHR0aGlzLmJsZW5kQ29sb3IuY29weSggc291cmNlLmJsZW5kQ29sb3IgKTtcclxuXHRcdHRoaXMuYmxlbmRBbHBoYSA9IHNvdXJjZS5ibGVuZEFscGhhO1xyXG5cclxuXHRcdHRoaXMuZGVwdGhGdW5jID0gc291cmNlLmRlcHRoRnVuYztcclxuXHRcdHRoaXMuZGVwdGhUZXN0ID0gc291cmNlLmRlcHRoVGVzdDtcclxuXHRcdHRoaXMuZGVwdGhXcml0ZSA9IHNvdXJjZS5kZXB0aFdyaXRlO1xyXG5cclxuXHRcdHRoaXMuc3RlbmNpbFdyaXRlTWFzayA9IHNvdXJjZS5zdGVuY2lsV3JpdGVNYXNrO1xyXG5cdFx0dGhpcy5zdGVuY2lsRnVuYyA9IHNvdXJjZS5zdGVuY2lsRnVuYztcclxuXHRcdHRoaXMuc3RlbmNpbFJlZiA9IHNvdXJjZS5zdGVuY2lsUmVmO1xyXG5cdFx0dGhpcy5zdGVuY2lsRnVuY01hc2sgPSBzb3VyY2Uuc3RlbmNpbEZ1bmNNYXNrO1xyXG5cdFx0dGhpcy5zdGVuY2lsRmFpbCA9IHNvdXJjZS5zdGVuY2lsRmFpbDtcclxuXHRcdHRoaXMuc3RlbmNpbFpGYWlsID0gc291cmNlLnN0ZW5jaWxaRmFpbDtcclxuXHRcdHRoaXMuc3RlbmNpbFpQYXNzID0gc291cmNlLnN0ZW5jaWxaUGFzcztcclxuXHRcdHRoaXMuc3RlbmNpbFdyaXRlID0gc291cmNlLnN0ZW5jaWxXcml0ZTtcclxuXHJcblx0XHRjb25zdCBzcmNQbGFuZXMgPSBzb3VyY2UuY2xpcHBpbmdQbGFuZXM7XHJcblx0XHRsZXQgZHN0UGxhbmVzID0gbnVsbDtcclxuXHJcblx0XHRpZiAoIHNyY1BsYW5lcyAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGNvbnN0IG4gPSBzcmNQbGFuZXMubGVuZ3RoO1xyXG5cdFx0XHRkc3RQbGFuZXMgPSBuZXcgQXJyYXkoIG4gKTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSAhPT0gbjsgKysgaSApIHtcclxuXHJcblx0XHRcdFx0ZHN0UGxhbmVzWyBpIF0gPSBzcmNQbGFuZXNbIGkgXS5jbG9uZSgpO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmNsaXBwaW5nUGxhbmVzID0gZHN0UGxhbmVzO1xyXG5cdFx0dGhpcy5jbGlwSW50ZXJzZWN0aW9uID0gc291cmNlLmNsaXBJbnRlcnNlY3Rpb247XHJcblx0XHR0aGlzLmNsaXBTaGFkb3dzID0gc291cmNlLmNsaXBTaGFkb3dzO1xyXG5cclxuXHRcdHRoaXMuc2hhZG93U2lkZSA9IHNvdXJjZS5zaGFkb3dTaWRlO1xyXG5cclxuXHRcdHRoaXMuY29sb3JXcml0ZSA9IHNvdXJjZS5jb2xvcldyaXRlO1xyXG5cclxuXHRcdHRoaXMucHJlY2lzaW9uID0gc291cmNlLnByZWNpc2lvbjtcclxuXHJcblx0XHR0aGlzLnBvbHlnb25PZmZzZXQgPSBzb3VyY2UucG9seWdvbk9mZnNldDtcclxuXHRcdHRoaXMucG9seWdvbk9mZnNldEZhY3RvciA9IHNvdXJjZS5wb2x5Z29uT2Zmc2V0RmFjdG9yO1xyXG5cdFx0dGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHMgPSBzb3VyY2UucG9seWdvbk9mZnNldFVuaXRzO1xyXG5cclxuXHRcdHRoaXMuZGl0aGVyaW5nID0gc291cmNlLmRpdGhlcmluZztcclxuXHJcblx0XHR0aGlzLmFscGhhVGVzdCA9IHNvdXJjZS5hbHBoYVRlc3Q7XHJcblx0XHR0aGlzLmFscGhhSGFzaCA9IHNvdXJjZS5hbHBoYUhhc2g7XHJcblx0XHR0aGlzLmFscGhhVG9Db3ZlcmFnZSA9IHNvdXJjZS5hbHBoYVRvQ292ZXJhZ2U7XHJcblx0XHR0aGlzLnByZW11bHRpcGxpZWRBbHBoYSA9IHNvdXJjZS5wcmVtdWx0aXBsaWVkQWxwaGE7XHJcblx0XHR0aGlzLmZvcmNlU2luZ2xlUGFzcyA9IHNvdXJjZS5mb3JjZVNpbmdsZVBhc3M7XHJcblxyXG5cdFx0dGhpcy52aXNpYmxlID0gc291cmNlLnZpc2libGU7XHJcblxyXG5cdFx0dGhpcy50b25lTWFwcGVkID0gc291cmNlLnRvbmVNYXBwZWQ7XHJcblxyXG5cdFx0dGhpcy51c2VyRGF0YSA9IEpTT04ucGFyc2UoIEpTT04uc3RyaW5naWZ5KCBzb3VyY2UudXNlckRhdGEgKSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZyZWVzIHRoZSBHUFUtcmVsYXRlZCByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHRoaXMgaW5zdGFuY2UuIENhbGwgdGhpc1xyXG5cdCAqIG1ldGhvZCB3aGVuZXZlciB0aGlzIGluc3RhbmNlIGlzIG5vIGxvbmdlciB1c2VkIGluIHlvdXIgYXBwLlxyXG5cdCAqXHJcblx0ICogQGZpcmVzIE1hdGVyaWFsI2Rpc3Bvc2VcclxuXHQgKi9cclxuXHRkaXNwb3NlKCkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRmlyZXMgd2hlbiB0aGUgbWF0ZXJpYWwgaGFzIGJlZW4gZGlzcG9zZWQgb2YuXHJcblx0XHQgKlxyXG5cdFx0ICogQGV2ZW50IE1hdGVyaWFsI2Rpc3Bvc2VcclxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnZGlzcG9zZScgfSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHRpbmcgdGhpcyBwcm9wZXJ0eSB0byBgdHJ1ZWAgaW5kaWNhdGVzIHRoZSBlbmdpbmUgdGhlIG1hdGVyaWFsXHJcblx0ICogbmVlZHMgdG8gYmUgcmVjb21waWxlZC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0ICogQHBhcmFtIHtib29sZWFufSB2YWx1ZVxyXG5cdCAqL1xyXG5cdHNldCBuZWVkc1VwZGF0ZSggdmFsdWUgKSB7XHJcblxyXG5cdFx0aWYgKCB2YWx1ZSA9PT0gdHJ1ZSApIHRoaXMudmVyc2lvbiArKztcclxuXHJcblx0fVxyXG5cclxuXHRvbkJ1aWxkKCAvKiBzaGFkZXJvYmplY3QsIHJlbmRlcmVyICovICkge1xyXG5cclxuXHRcdGNvbnNvbGUud2FybiggJ01hdGVyaWFsOiBvbkJ1aWxkKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7IC8vIEBkZXByZWNhdGVkLCByMTY2XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IE1hdGVyaWFsIH07XHJcbiIsImltcG9ydCB7IE1hdGVyaWFsIH0gZnJvbSAnLi9NYXRlcmlhbC5qcyc7XHJcbmltcG9ydCB7IE11bHRpcGx5T3BlcmF0aW9uIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi9tYXRoL0NvbG9yLmpzJztcclxuaW1wb3J0IHsgRXVsZXIgfSBmcm9tICcuLi9tYXRoL0V1bGVyLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIG1hdGVyaWFsIGZvciBkcmF3aW5nIGdlb21ldHJpZXMgaW4gYSBzaW1wbGUgc2hhZGVkIChmbGF0IG9yIHdpcmVmcmFtZSkgd2F5LlxyXG4gKlxyXG4gKiBUaGlzIG1hdGVyaWFsIGlzIG5vdCBhZmZlY3RlZCBieSBsaWdodHMuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBNYXRlcmlhbFxyXG4gKi9cclxuY2xhc3MgTWVzaEJhc2ljTWF0ZXJpYWwgZXh0ZW5kcyBNYXRlcmlhbCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbWVzaCBiYXNpYyBtYXRlcmlhbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1ldGVyc10gLSBBbiBvYmplY3Qgd2l0aCBvbmUgb3IgbW9yZSBwcm9wZXJ0aWVzXHJcblx0ICogZGVmaW5pbmcgdGhlIG1hdGVyaWFsJ3MgYXBwZWFyYW5jZS4gQW55IHByb3BlcnR5IG9mIHRoZSBtYXRlcmlhbFxyXG5cdCAqIChpbmNsdWRpbmcgYW55IHByb3BlcnR5IGZyb20gaW5oZXJpdGVkIG1hdGVyaWFscykgY2FuIGJlIHBhc3NlZFxyXG5cdCAqIGluIGhlcmUuIENvbG9yIHZhbHVlcyBjYW4gYmUgcGFzc2VkIGFueSB0eXBlIG9mIHZhbHVlIGFjY2VwdGVkXHJcblx0ICogYnkge0BsaW5rIENvbG9yI3NldH0uXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHBhcmFtZXRlcnMgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNNZXNoQmFzaWNNYXRlcmlhbCA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ01lc2hCYXNpY01hdGVyaWFsJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENvbG9yIG9mIHRoZSBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Q29sb3J9XHJcblx0XHQgKiBAZGVmYXVsdCAoMSwxLDEpXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7IC8vIGVtaXNzaXZlXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY29sb3IgbWFwLiBNYXkgb3B0aW9uYWxseSBpbmNsdWRlIGFuIGFscGhhIGNoYW5uZWwsIHR5cGljYWxseSBjb21iaW5lZFxyXG5cdFx0ICogd2l0aCB7QGxpbmsgTWF0ZXJpYWwjdHJhbnNwYXJlbnR9IG9yIHtAbGluayBNYXRlcmlhbCNhbHBoYVRlc3R9LiBUaGUgdGV4dHVyZSBtYXBcclxuXHRcdCAqIGNvbG9yIGlzIG1vZHVsYXRlZCBieSB0aGUgZGlmZnVzZSBgY29sb3JgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGxpZ2h0IG1hcC4gUmVxdWlyZXMgYSBzZWNvbmQgc2V0IG9mIFVWcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGlnaHRNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSW50ZW5zaXR5IG9mIHRoZSBiYWtlZCBsaWdodC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gMS4wO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJlZCBjaGFubmVsIG9mIHRoaXMgdGV4dHVyZSBpcyB1c2VkIGFzIHRoZSBhbWJpZW50IG9jY2x1c2lvbiBtYXAuXHJcblx0XHQgKiBSZXF1aXJlcyBhIHNlY29uZCBzZXQgb2YgVVZzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hb01hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBJbnRlbnNpdHkgb2YgdGhlIGFtYmllbnQgb2NjbHVzaW9uIGVmZmVjdC4gUmFuZ2UgaXMgYFswLDFdYCwgd2hlcmUgYDBgXHJcblx0XHQgKiBkaXNhYmxlcyBhbWJpZW50IG9jY2x1c2lvbi4gV2hlcmUgaW50ZW5zaXR5IGlzIGAxYCBhbmQgdGhlIEFPIG1hcCdzXHJcblx0XHQgKiByZWQgY2hhbm5lbCBpcyBhbHNvIGAxYCwgYW1iaWVudCBsaWdodCBpcyBmdWxseSBvY2NsdWRlZCBvbiBhIHN1cmZhY2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hb01hcEludGVuc2l0eSA9IDEuMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNwZWN1bGFyIG1hcCB1c2VkIGJ5IHRoZSBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc3BlY3VsYXJNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGFscGhhIG1hcCBpcyBhIGdyYXlzY2FsZSB0ZXh0dXJlIHRoYXQgY29udHJvbHMgdGhlIG9wYWNpdHkgYWNyb3NzIHRoZVxyXG5cdFx0ICogc3VyZmFjZSAoYmxhY2s6IGZ1bGx5IHRyYW5zcGFyZW50OyB3aGl0ZTogZnVsbHkgb3BhcXVlKS5cclxuXHRcdCAqXHJcblx0XHQgKiBPbmx5IHRoZSBjb2xvciBvZiB0aGUgdGV4dHVyZSBpcyB1c2VkLCBpZ25vcmluZyB0aGUgYWxwaGEgY2hhbm5lbCBpZiBvbmVcclxuXHRcdCAqIGV4aXN0cy4gRm9yIFJHQiBhbmQgUkdCQSB0ZXh0dXJlcywgdGhlIHJlbmRlcmVyIHdpbGwgdXNlIHRoZSBncmVlbiBjaGFubmVsXHJcblx0XHQgKiB3aGVuIHNhbXBsaW5nIHRoaXMgdGV4dHVyZSBkdWUgdG8gdGhlIGV4dHJhIGJpdCBvZiBwcmVjaXNpb24gcHJvdmlkZWQgZm9yXHJcblx0XHQgKiBncmVlbiBpbiBEWFQtY29tcHJlc3NlZCBhbmQgdW5jb21wcmVzc2VkIFJHQiA1NjUgZm9ybWF0cy4gTHVtaW5hbmNlLW9ubHkgYW5kXHJcblx0XHQgKiBsdW1pbmFuY2UvYWxwaGEgdGV4dHVyZXMgd2lsbCBhbHNvIHN0aWxsIHdvcmsgYXMgZXhwZWN0ZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFscGhhTWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBlbnZpcm9ubWVudCBtYXAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmVudk1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcm90YXRpb24gb2YgdGhlIGVudmlyb25tZW50IG1hcCBpbiByYWRpYW5zLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtFdWxlcn1cclxuXHRcdCAqIEBkZWZhdWx0ICgwLDAsMClcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5lbnZNYXBSb3RhdGlvbiA9IG5ldyBFdWxlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG93IHRvIGNvbWJpbmUgdGhlIHJlc3VsdCBvZiB0aGUgc3VyZmFjZSdzIGNvbG9yIHdpdGggdGhlIGVudmlyb25tZW50IG1hcCwgaWYgYW55LlxyXG5cdFx0ICpcclxuXHRcdCAqIFdoZW4gc2V0IHRvIGBNaXhPcGVyYXRpb25gLCB0aGUge0BsaW5rIE1lc2hCYXNpY01hdGVyaWFsI3JlZmxlY3Rpdml0eX0gaXMgdXNlZCB0b1xyXG5cdFx0ICogYmxlbmQgYmV0d2VlbiB0aGUgdHdvIGNvbG9ycy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KE11bHRpcGx5T3BlcmF0aW9ufE1peE9wZXJhdGlvbnxBZGRPcGVyYXRpb24pfVxyXG5cdFx0ICogQGRlZmF1bHQgTXVsdGlwbHlPcGVyYXRpb25cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb21iaW5lID0gTXVsdGlwbHlPcGVyYXRpb247XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3cgbXVjaCB0aGUgZW52aXJvbm1lbnQgbWFwIGFmZmVjdHMgdGhlIHN1cmZhY2UuXHJcblx0XHQgKiBUaGUgdmFsaWQgcmFuZ2UgaXMgYmV0d2VlbiBgMGAgKG5vIHJlZmxlY3Rpb25zKSBhbmQgYDFgIChmdWxsIHJlZmxlY3Rpb25zKS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJlZmxlY3Rpdml0eSA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgaW5kZXggb2YgcmVmcmFjdGlvbiAoSU9SKSBvZiBhaXIgKGFwcHJveGltYXRlbHkgMSkgZGl2aWRlZCBieSB0aGVcclxuXHRcdCAqIGluZGV4IG9mIHJlZnJhY3Rpb24gb2YgdGhlIG1hdGVyaWFsLiBJdCBpcyB1c2VkIHdpdGggZW52aXJvbm1lbnQgbWFwcGluZ1xyXG5cdFx0ICogbW9kZXMge0BsaW5rIEN1YmVSZWZyYWN0aW9uTWFwcGluZ30gYW5kIHtAbGluayBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZ30uXHJcblx0XHQgKiBUaGUgcmVmcmFjdGlvbiByYXRpbyBzaG91bGQgbm90IGV4Y2VlZCBgMWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDAuOThcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yZWZyYWN0aW9uUmF0aW8gPSAwLjk4O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVuZGVycyB0aGUgZ2VvbWV0cnkgYXMgYSB3aXJlZnJhbWUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLndpcmVmcmFtZSA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQ29udHJvbHMgdGhlIHRoaWNrbmVzcyBvZiB0aGUgd2lyZWZyYW1lLlxyXG5cdFx0ICpcclxuXHRcdCAqIENhbiBvbmx5IGJlIHVzZWQgd2l0aCB7QGxpbmsgU1ZHUmVuZGVyZXJ9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgYXBwZWFyYW5jZSBvZiB3aXJlZnJhbWUgZW5kcy5cclxuXHRcdCAqXHJcblx0XHQgKiBDYW4gb25seSBiZSB1c2VkIHdpdGgge0BsaW5rIFNWR1JlbmRlcmVyfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KCdyb3VuZCd8J2JldmVsJ3wnbWl0ZXInKX1cclxuXHRcdCAqIEBkZWZhdWx0ICdyb3VuZCdcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy53aXJlZnJhbWVMaW5lY2FwID0gJ3JvdW5kJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgYXBwZWFyYW5jZSBvZiB3aXJlZnJhbWUgam9pbnRzLlxyXG5cdFx0ICpcclxuXHRcdCAqIENhbiBvbmx5IGJlIHVzZWQgd2l0aCB7QGxpbmsgU1ZHUmVuZGVyZXJ9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoJ3JvdW5kJ3wnYmV2ZWwnfCdtaXRlcicpfVxyXG5cdFx0ICogQGRlZmF1bHQgJ3JvdW5kJ1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gJ3JvdW5kJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIG1hdGVyaWFsIGlzIGFmZmVjdGVkIGJ5IGZvZyBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZm9nID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xyXG5cclxuXHRcdHRoaXMubWFwID0gc291cmNlLm1hcDtcclxuXHJcblx0XHR0aGlzLmxpZ2h0TWFwID0gc291cmNlLmxpZ2h0TWFwO1xyXG5cdFx0dGhpcy5saWdodE1hcEludGVuc2l0eSA9IHNvdXJjZS5saWdodE1hcEludGVuc2l0eTtcclxuXHJcblx0XHR0aGlzLmFvTWFwID0gc291cmNlLmFvTWFwO1xyXG5cdFx0dGhpcy5hb01hcEludGVuc2l0eSA9IHNvdXJjZS5hb01hcEludGVuc2l0eTtcclxuXHJcblx0XHR0aGlzLnNwZWN1bGFyTWFwID0gc291cmNlLnNwZWN1bGFyTWFwO1xyXG5cclxuXHRcdHRoaXMuYWxwaGFNYXAgPSBzb3VyY2UuYWxwaGFNYXA7XHJcblxyXG5cdFx0dGhpcy5lbnZNYXAgPSBzb3VyY2UuZW52TWFwO1xyXG5cdFx0dGhpcy5lbnZNYXBSb3RhdGlvbi5jb3B5KCBzb3VyY2UuZW52TWFwUm90YXRpb24gKTtcclxuXHRcdHRoaXMuY29tYmluZSA9IHNvdXJjZS5jb21iaW5lO1xyXG5cdFx0dGhpcy5yZWZsZWN0aXZpdHkgPSBzb3VyY2UucmVmbGVjdGl2aXR5O1xyXG5cdFx0dGhpcy5yZWZyYWN0aW9uUmF0aW8gPSBzb3VyY2UucmVmcmFjdGlvblJhdGlvO1xyXG5cclxuXHRcdHRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTtcclxuXHRcdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFtZUxpbmV3aWR0aDtcclxuXHRcdHRoaXMud2lyZWZyYW1lTGluZWNhcCA9IHNvdXJjZS53aXJlZnJhbWVMaW5lY2FwO1xyXG5cdFx0dGhpcy53aXJlZnJhbWVMaW5lam9pbiA9IHNvdXJjZS53aXJlZnJhbWVMaW5lam9pbjtcclxuXHJcblx0XHR0aGlzLmZvZyA9IHNvdXJjZS5mb2c7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IE1lc2hCYXNpY01hdGVyaWFsIH07XHJcbiIsImltcG9ydCB7IGNsYW1wIH0gZnJvbSAnLi4vbWF0aC9NYXRoVXRpbHMuanMnO1xyXG5cclxuLy8gRmFzdCBIYWxmIEZsb2F0IENvbnZlcnNpb25zLCBodHRwOi8vd3d3LmZveC10b29sa2l0Lm9yZy9mdHAvZmFzdGhhbGZmbG9hdGNvbnZlcnNpb24ucGRmXHJcblxyXG5jb25zdCBfdGFibGVzID0gLypAX19QVVJFX18qLyBfZ2VuZXJhdGVUYWJsZXMoKTtcclxuXHJcbmZ1bmN0aW9uIF9nZW5lcmF0ZVRhYmxlcygpIHtcclxuXHJcblx0Ly8gZmxvYXQzMiB0byBmbG9hdDE2IGhlbHBlcnNcclxuXHJcblx0Y29uc3QgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKCA0ICk7XHJcblx0Y29uc3QgZmxvYXRWaWV3ID0gbmV3IEZsb2F0MzJBcnJheSggYnVmZmVyICk7XHJcblx0Y29uc3QgdWludDMyVmlldyA9IG5ldyBVaW50MzJBcnJheSggYnVmZmVyICk7XHJcblxyXG5cdGNvbnN0IGJhc2VUYWJsZSA9IG5ldyBVaW50MzJBcnJheSggNTEyICk7XHJcblx0Y29uc3Qgc2hpZnRUYWJsZSA9IG5ldyBVaW50MzJBcnJheSggNTEyICk7XHJcblxyXG5cdGZvciAoIGxldCBpID0gMDsgaSA8IDI1NjsgKysgaSApIHtcclxuXHJcblx0XHRjb25zdCBlID0gaSAtIDEyNztcclxuXHJcblx0XHQvLyB2ZXJ5IHNtYWxsIG51bWJlciAoMCwgLTApXHJcblxyXG5cdFx0aWYgKCBlIDwgLSAyNyApIHtcclxuXHJcblx0XHRcdGJhc2VUYWJsZVsgaSBdID0gMHgwMDAwO1xyXG5cdFx0XHRiYXNlVGFibGVbIGkgfCAweDEwMCBdID0gMHg4MDAwO1xyXG5cdFx0XHRzaGlmdFRhYmxlWyBpIF0gPSAyNDtcclxuXHRcdFx0c2hpZnRUYWJsZVsgaSB8IDB4MTAwIF0gPSAyNDtcclxuXHJcblx0XHRcdC8vIHNtYWxsIG51bWJlciAoZGVub3JtKVxyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGUgPCAtIDE0ICkge1xyXG5cclxuXHRcdFx0YmFzZVRhYmxlWyBpIF0gPSAweDA0MDAgPj4gKCAtIGUgLSAxNCApO1xyXG5cdFx0XHRiYXNlVGFibGVbIGkgfCAweDEwMCBdID0gKCAweDA0MDAgPj4gKCAtIGUgLSAxNCApICkgfCAweDgwMDA7XHJcblx0XHRcdHNoaWZ0VGFibGVbIGkgXSA9IC0gZSAtIDE7XHJcblx0XHRcdHNoaWZ0VGFibGVbIGkgfCAweDEwMCBdID0gLSBlIC0gMTtcclxuXHJcblx0XHRcdC8vIG5vcm1hbCBudW1iZXJcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBlIDw9IDE1ICkge1xyXG5cclxuXHRcdFx0YmFzZVRhYmxlWyBpIF0gPSAoIGUgKyAxNSApIDw8IDEwO1xyXG5cdFx0XHRiYXNlVGFibGVbIGkgfCAweDEwMCBdID0gKCAoIGUgKyAxNSApIDw8IDEwICkgfCAweDgwMDA7XHJcblx0XHRcdHNoaWZ0VGFibGVbIGkgXSA9IDEzO1xyXG5cdFx0XHRzaGlmdFRhYmxlWyBpIHwgMHgxMDAgXSA9IDEzO1xyXG5cclxuXHRcdFx0Ly8gbGFyZ2UgbnVtYmVyIChJbmZpbml0eSwgLUluZmluaXR5KVxyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGUgPCAxMjggKSB7XHJcblxyXG5cdFx0XHRiYXNlVGFibGVbIGkgXSA9IDB4N2MwMDtcclxuXHRcdFx0YmFzZVRhYmxlWyBpIHwgMHgxMDAgXSA9IDB4ZmMwMDtcclxuXHRcdFx0c2hpZnRUYWJsZVsgaSBdID0gMjQ7XHJcblx0XHRcdHNoaWZ0VGFibGVbIGkgfCAweDEwMCBdID0gMjQ7XHJcblxyXG5cdFx0XHQvLyBzdGF5IChOYU4sIEluZmluaXR5LCAtSW5maW5pdHkpXHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGJhc2VUYWJsZVsgaSBdID0gMHg3YzAwO1xyXG5cdFx0XHRiYXNlVGFibGVbIGkgfCAweDEwMCBdID0gMHhmYzAwO1xyXG5cdFx0XHRzaGlmdFRhYmxlWyBpIF0gPSAxMztcclxuXHRcdFx0c2hpZnRUYWJsZVsgaSB8IDB4MTAwIF0gPSAxMztcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gZmxvYXQxNiB0byBmbG9hdDMyIGhlbHBlcnNcclxuXHJcblx0Y29uc3QgbWFudGlzc2FUYWJsZSA9IG5ldyBVaW50MzJBcnJheSggMjA0OCApO1xyXG5cdGNvbnN0IGV4cG9uZW50VGFibGUgPSBuZXcgVWludDMyQXJyYXkoIDY0ICk7XHJcblx0Y29uc3Qgb2Zmc2V0VGFibGUgPSBuZXcgVWludDMyQXJyYXkoIDY0ICk7XHJcblxyXG5cdGZvciAoIGxldCBpID0gMTsgaSA8IDEwMjQ7ICsrIGkgKSB7XHJcblxyXG5cdFx0bGV0IG0gPSBpIDw8IDEzOyAvLyB6ZXJvIHBhZCBtYW50aXNzYSBiaXRzXHJcblx0XHRsZXQgZSA9IDA7IC8vIHplcm8gZXhwb25lbnRcclxuXHJcblx0XHQvLyBub3JtYWxpemVkXHJcblx0XHR3aGlsZSAoICggbSAmIDB4MDA4MDAwMDAgKSA9PT0gMCApIHtcclxuXHJcblx0XHRcdG0gPDw9IDE7XHJcblx0XHRcdGUgLT0gMHgwMDgwMDAwMDsgLy8gZGVjcmVtZW50IGV4cG9uZW50XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdG0gJj0gfiAweDAwODAwMDAwOyAvLyBjbGVhciBsZWFkaW5nIDEgYml0XHJcblx0XHRlICs9IDB4Mzg4MDAwMDA7IC8vIGFkanVzdCBiaWFzXHJcblxyXG5cdFx0bWFudGlzc2FUYWJsZVsgaSBdID0gbSB8IGU7XHJcblxyXG5cdH1cclxuXHJcblx0Zm9yICggbGV0IGkgPSAxMDI0OyBpIDwgMjA0ODsgKysgaSApIHtcclxuXHJcblx0XHRtYW50aXNzYVRhYmxlWyBpIF0gPSAweDM4MDAwMDAwICsgKCAoIGkgLSAxMDI0ICkgPDwgMTMgKTtcclxuXHJcblx0fVxyXG5cclxuXHRmb3IgKCBsZXQgaSA9IDE7IGkgPCAzMTsgKysgaSApIHtcclxuXHJcblx0XHRleHBvbmVudFRhYmxlWyBpIF0gPSBpIDw8IDIzO1xyXG5cclxuXHR9XHJcblxyXG5cdGV4cG9uZW50VGFibGVbIDMxIF0gPSAweDQ3ODAwMDAwO1xyXG5cdGV4cG9uZW50VGFibGVbIDMyIF0gPSAweDgwMDAwMDAwO1xyXG5cclxuXHRmb3IgKCBsZXQgaSA9IDMzOyBpIDwgNjM7ICsrIGkgKSB7XHJcblxyXG5cdFx0ZXhwb25lbnRUYWJsZVsgaSBdID0gMHg4MDAwMDAwMCArICggKCBpIC0gMzIgKSA8PCAyMyApO1xyXG5cclxuXHR9XHJcblxyXG5cdGV4cG9uZW50VGFibGVbIDYzIF0gPSAweGM3ODAwMDAwO1xyXG5cclxuXHRmb3IgKCBsZXQgaSA9IDE7IGkgPCA2NDsgKysgaSApIHtcclxuXHJcblx0XHRpZiAoIGkgIT09IDMyICkge1xyXG5cclxuXHRcdFx0b2Zmc2V0VGFibGVbIGkgXSA9IDEwMjQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiB7XHJcblx0XHRmbG9hdFZpZXc6IGZsb2F0VmlldyxcclxuXHRcdHVpbnQzMlZpZXc6IHVpbnQzMlZpZXcsXHJcblx0XHRiYXNlVGFibGU6IGJhc2VUYWJsZSxcclxuXHRcdHNoaWZ0VGFibGU6IHNoaWZ0VGFibGUsXHJcblx0XHRtYW50aXNzYVRhYmxlOiBtYW50aXNzYVRhYmxlLFxyXG5cdFx0ZXhwb25lbnRUYWJsZTogZXhwb25lbnRUYWJsZSxcclxuXHRcdG9mZnNldFRhYmxlOiBvZmZzZXRUYWJsZVxyXG5cdH07XHJcblxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIGhhbGYgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IHZhbHVlIChGUDE2KSBmcm9tIHRoZSBnaXZlbiBzaW5nbGVcclxuICogcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IHZhbHVlIChGUDMyKS5cclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHZhbCAtIEEgc2luZ2xlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCB2YWx1ZS5cclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgRlAxNiB2YWx1ZS5cclxuICovXHJcbmZ1bmN0aW9uIHRvSGFsZkZsb2F0KCB2YWwgKSB7XHJcblxyXG5cdGlmICggTWF0aC5hYnMoIHZhbCApID4gNjU1MDQgKSBjb25zb2xlLndhcm4oICdUSFJFRS5EYXRhVXRpbHMudG9IYWxmRmxvYXQoKTogVmFsdWUgb3V0IG9mIHJhbmdlLicgKTtcclxuXHJcblx0dmFsID0gY2xhbXAoIHZhbCwgLSA2NTUwNCwgNjU1MDQgKTtcclxuXHJcblx0X3RhYmxlcy5mbG9hdFZpZXdbIDAgXSA9IHZhbDtcclxuXHRjb25zdCBmID0gX3RhYmxlcy51aW50MzJWaWV3WyAwIF07XHJcblx0Y29uc3QgZSA9ICggZiA+PiAyMyApICYgMHgxZmY7XHJcblx0cmV0dXJuIF90YWJsZXMuYmFzZVRhYmxlWyBlIF0gKyAoICggZiAmIDB4MDA3ZmZmZmYgKSA+PiBfdGFibGVzLnNoaWZ0VGFibGVbIGUgXSApO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSBzaW5nbGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IHZhbHVlIChGUDMyKSBmcm9tIHRoZSBnaXZlbiBoYWxmXHJcbiAqIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCB2YWx1ZSAoRlAxNikuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWwgLSBBIGhhbGYgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IHZhbHVlLlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBGUDMyIHZhbHVlLlxyXG4gKi9cclxuZnVuY3Rpb24gZnJvbUhhbGZGbG9hdCggdmFsICkge1xyXG5cclxuXHRjb25zdCBtID0gdmFsID4+IDEwO1xyXG5cdF90YWJsZXMudWludDMyVmlld1sgMCBdID0gX3RhYmxlcy5tYW50aXNzYVRhYmxlWyBfdGFibGVzLm9mZnNldFRhYmxlWyBtIF0gKyAoIHZhbCAmIDB4M2ZmICkgXSArIF90YWJsZXMuZXhwb25lbnRUYWJsZVsgbSBdO1xyXG5cdHJldHVybiBfdGFibGVzLmZsb2F0Vmlld1sgMCBdO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIEEgY2xhc3MgY29udGFpbmluZyB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgZGF0YS5cclxuICpcclxuICogQGhpZGVjb25zdHJ1Y3RvclxyXG4gKi9cclxuY2xhc3MgRGF0YVV0aWxzIHtcclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIGhhbGYgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IHZhbHVlIChGUDE2KSBmcm9tIHRoZSBnaXZlbiBzaW5nbGVcclxuXHQgKiBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgdmFsdWUgKEZQMzIpLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHZhbCAtIEEgc2luZ2xlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCB2YWx1ZS5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBGUDE2IHZhbHVlLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyB0b0hhbGZGbG9hdCggdmFsICkge1xyXG5cclxuXHRcdHJldHVybiB0b0hhbGZGbG9hdCggdmFsICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIHNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgdmFsdWUgKEZQMzIpIGZyb20gdGhlIGdpdmVuIGhhbGZcclxuXHQgKiBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgdmFsdWUgKEZQMTYpLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHZhbCAtIEEgaGFsZiBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgdmFsdWUuXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgRlAzMiB2YWx1ZS5cclxuXHQgKi9cclxuXHRzdGF0aWMgZnJvbUhhbGZGbG9hdCggdmFsICkge1xyXG5cclxuXHRcdHJldHVybiBmcm9tSGFsZkZsb2F0KCB2YWwgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHtcclxuXHR0b0hhbGZGbG9hdCxcclxuXHRmcm9tSGFsZkZsb2F0LFxyXG5cdERhdGFVdGlsc1xyXG59O1xyXG4iLCJpbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uL21hdGgvVmVjdG9yMi5qcyc7XHJcbmltcG9ydCB7IGRlbm9ybWFsaXplLCBub3JtYWxpemUgfSBmcm9tICcuLi9tYXRoL01hdGhVdGlscy5qcyc7XHJcbmltcG9ydCB7IFN0YXRpY0RyYXdVc2FnZSwgRmxvYXRUeXBlIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgZnJvbUhhbGZGbG9hdCwgdG9IYWxmRmxvYXQgfSBmcm9tICcuLi9leHRyYXMvRGF0YVV0aWxzLmpzJztcclxuXHJcbmNvbnN0IF92ZWN0b3IgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF92ZWN0b3IyID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMigpO1xyXG5cclxubGV0IF9pZCA9IDA7XHJcblxyXG4vKipcclxuICogVGhpcyBjbGFzcyBzdG9yZXMgZGF0YSBmb3IgYW4gYXR0cmlidXRlIChzdWNoIGFzIHZlcnRleCBwb3NpdGlvbnMsIGZhY2VcclxuICogaW5kaWNlcywgbm9ybWFscywgY29sb3JzLCBVVnMsIGFuZCBhbnkgY3VzdG9tIGF0dHJpYnV0ZXMgKSBhc3NvY2lhdGVkIHdpdGhcclxuICogYSBnZW9tZXRyeSwgd2hpY2ggYWxsb3dzIGZvciBtb3JlIGVmZmljaWVudCBwYXNzaW5nIG9mIGRhdGEgdG8gdGhlIEdQVS5cclxuICpcclxuICogV2hlbiB3b3JraW5nIHdpdGggdmVjdG9yLWxpa2UgZGF0YSwgdGhlIGBmcm9tQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGluZGV4IClgXHJcbiAqIGhlbHBlciBtZXRob2RzIG9uIHZlY3RvciBhbmQgY29sb3IgY2xhc3MgbWlnaHQgYmUgaGVscGZ1bC4gRS5nLiB7QGxpbmsgVmVjdG9yMyNmcm9tQnVmZmVyQXR0cmlidXRlfS5cclxuICovXHJcbmNsYXNzIEJ1ZmZlckF0dHJpYnV0ZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VHlwZWRBcnJheX0gYXJyYXkgLSBUaGUgYXJyYXkgaG9sZGluZyB0aGUgYXR0cmlidXRlIGRhdGEuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGl0ZW1TaXplIC0gVGhlIGl0ZW0gc2l6ZS5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtub3JtYWxpemVkPWZhbHNlXSAtIFdoZXRoZXIgdGhlIGRhdGEgYXJlIG5vcm1hbGl6ZWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgPSBmYWxzZSApIHtcclxuXHJcblx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIGFycmF5ICkgKSB7XHJcblxyXG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCAnVEhSRUUuQnVmZmVyQXR0cmlidXRlOiBhcnJheSBzaG91bGQgYmUgYSBUeXBlZCBBcnJheS4nICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0J1ZmZlckF0dHJpYnV0ZSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgSUQgb2YgdGhlIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQG5hbWUgQnVmZmVyQXR0cmlidXRlI2lkXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKi9cclxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ2lkJywgeyB2YWx1ZTogX2lkICsrIH0gKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBuYW1lIG9mIHRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubmFtZSA9ICcnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGFycmF5IGhvbGRpbmcgdGhlIGF0dHJpYnV0ZSBkYXRhLiBJdCBzaG91bGQgaGF2ZSBgaXRlbVNpemUgKiBudW1WZXJ0aWNlc2BcclxuXHRcdCAqIGVsZW1lbnRzLCB3aGVyZSBgbnVtVmVydGljZXNgIGlzIHRoZSBudW1iZXIgb2YgdmVydGljZXMgaW4gdGhlIGFzc29jaWF0ZWQgZ2VvbWV0cnkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1R5cGVkQXJyYXl9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYXJyYXkgPSBhcnJheTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBudW1iZXIgb2YgdmFsdWVzIG9mIHRoZSBhcnJheSB0aGF0IHNob3VsZCBiZSBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIHZlcnRleC5cclxuXHRcdCAqIEZvciBpbnN0YW5jZSwgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgc3RvcmluZyBhIDMtY29tcG9uZW50IHZlY3RvciAoc3VjaCBhcyBhIHBvc2l0aW9uLFxyXG5cdFx0ICogbm9ybWFsLCBvciBjb2xvciksIHRoZW4gdGhlIHZhbHVlIHNob3VsZCBiZSBgM2AuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pdGVtU2l6ZSA9IGl0ZW1TaXplO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mIGl0ZW1zIHRoaXMgYnVmZmVyIGF0dHJpYnV0ZSBzdG9yZXMuIEl0IGlzIGludGVybmFsbHkgY29tcHV0ZWRcclxuXHRcdCAqIGJ5IGRpdmlkaW5nIHRoZSBgYXJyYXlgIGxlbmd0aCBieSB0aGUgYGl0ZW1TaXplYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY291bnQgPSBhcnJheSAhPT0gdW5kZWZpbmVkID8gYXJyYXkubGVuZ3RoIC8gaXRlbVNpemUgOiAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQXBwbGllcyB0byBpbnRlZ2VyIGRhdGEgb25seS4gSW5kaWNhdGVzIGhvdyB0aGUgdW5kZXJseWluZyBkYXRhIGluIHRoZSBidWZmZXIgbWFwcyB0b1xyXG5cdFx0ICogdGhlIHZhbHVlcyBpbiB0aGUgR0xTTCBjb2RlLiBGb3IgaW5zdGFuY2UsIGlmIGBhcnJheWAgaXMgYW4gaW5zdGFuY2Ugb2YgYFVJbnQxNkFycmF5YCxcclxuXHRcdCAqIGFuZCBgbm9ybWFsaXplZGAgaXMgYHRydWVgLCB0aGUgdmFsdWVzIGAwIC0rNjU1MzVgIGluIHRoZSBhcnJheSBkYXRhIHdpbGwgYmUgbWFwcGVkIHRvXHJcblx0XHQgKiBgMC4wZiAtICsxLjBmYCBpbiB0aGUgR0xTTCBhdHRyaWJ1dGUuIElmIGBub3JtYWxpemVkYCBpcyBgZmFsc2VgLCB0aGUgdmFsdWVzIHdpbGwgYmUgY29udmVydGVkXHJcblx0XHQgKiB0byBmbG9hdHMgdW5tb2RpZmllZCwgaS5lLiBgNjU1MzVgIGJlY29tZXMgYDY1NTM1LjBmYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub3JtYWxpemVkID0gbm9ybWFsaXplZDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgdGhlIGludGVuZGVkIHVzYWdlIHBhdHRlcm4gb2YgdGhlIGRhdGEgc3RvcmUgZm9yIG9wdGltaXphdGlvbiBwdXJwb3Nlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBOb3RlOiBBZnRlciB0aGUgaW5pdGlhbCB1c2Ugb2YgYSBidWZmZXIsIGl0cyB1c2FnZSBjYW5ub3QgYmUgY2hhbmdlZC4gSW5zdGVhZCxcclxuXHRcdCAqIGluc3RhbnRpYXRlIGEgbmV3IG9uZSBhbmQgc2V0IHRoZSBkZXNpcmVkIHVzYWdlIGJlZm9yZSB0aGUgbmV4dCByZW5kZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeyhTdGF0aWNEcmF3VXNhZ2V8RHluYW1pY0RyYXdVc2FnZXxTdHJlYW1EcmF3VXNhZ2V8U3RhdGljUmVhZFVzYWdlfER5bmFtaWNSZWFkVXNhZ2V8U3RyZWFtUmVhZFVzYWdlfFN0YXRpY0NvcHlVc2FnZXxEeW5hbWljQ29weVVzYWdlfFN0cmVhbUNvcHlVc2FnZSl9XHJcblx0XHQgKiBAZGVmYXVsdCBTdGF0aWNEcmF3VXNhZ2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51c2FnZSA9IFN0YXRpY0RyYXdVc2FnZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gb25seSB1cGRhdGUgc29tZSBjb21wb25lbnRzIG9mIHN0b3JlZCB2ZWN0b3JzIChmb3IgZXhhbXBsZSwganVzdCB0aGVcclxuXHRcdCAqIGNvbXBvbmVudCByZWxhdGVkIHRvIGNvbG9yKS4gVXNlIHRoZSBgYWRkVXBkYXRlUmFuZ2UoKWAgZnVuY3Rpb24gdG8gYWRkIHJhbmdlcyB0byB0aGlzIGFycmF5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxPYmplY3Q+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVwZGF0ZVJhbmdlcyA9IFtdO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQ29uZmlndXJlcyB0aGUgYm91bmQgR1BVIHR5cGUgZm9yIHVzZSBpbiBzaGFkZXJzLlxyXG5cdFx0ICpcclxuXHRcdCAqIE5vdGU6IHRoaXMgb25seSBoYXMgYW4gZWZmZWN0IGZvciBpbnRlZ2VyIGFycmF5cyBhbmQgaXMgbm90IGNvbmZpZ3VyYWJsZSBmb3IgZmxvYXQgYXJyYXlzLlxyXG5cdFx0ICogRm9yIGxvd2VyIHByZWNpc2lvbiBmbG9hdCB0eXBlcywgdXNlIGBGbG9hdDE2QnVmZmVyQXR0cmlidXRlYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KEZsb2F0VHlwZXxJbnRUeXBlKX1cclxuXHRcdCAqIEBkZWZhdWx0IEZsb2F0VHlwZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdwdVR5cGUgPSBGbG9hdFR5cGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHZlcnNpb24gbnVtYmVyLCBpbmNyZW1lbnRlZCBldmVyeSB0aW1lIHRoZSBgbmVlZHNVcGRhdGVgIGlzIHNldCB0byBgdHJ1ZWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52ZXJzaW9uID0gMDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgZXhlY3V0ZWQgYWZ0ZXIgdGhlIHJlbmRlcmVyIGhhcyB0cmFuc2ZlcnJlZCB0aGUgYXR0cmlidXRlXHJcblx0ICogYXJyYXkgZGF0YSB0byB0aGUgR1BVLlxyXG5cdCAqL1xyXG5cdG9uVXBsb2FkQ2FsbGJhY2soKSB7fVxyXG5cclxuXHQvKipcclxuXHQgKiBGbGFnIHRvIGluZGljYXRlIHRoYXQgdGhpcyBhdHRyaWJ1dGUgaGFzIGNoYW5nZWQgYW5kIHNob3VsZCBiZSByZS1zZW50IHRvXHJcblx0ICogdGhlIEdQVS4gU2V0IHRoaXMgdG8gYHRydWVgIHdoZW4geW91IG1vZGlmeSB0aGUgdmFsdWUgb2YgdGhlIGFycmF5LlxyXG5cdCAqXHJcblx0ICogQHR5cGUge251bWJlcn1cclxuXHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsdWVcclxuXHQgKi9cclxuXHRzZXQgbmVlZHNVcGRhdGUoIHZhbHVlICkge1xyXG5cclxuXHRcdGlmICggdmFsdWUgPT09IHRydWUgKSB0aGlzLnZlcnNpb24gKys7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdXNhZ2Ugb2YgdGhpcyBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHsoU3RhdGljRHJhd1VzYWdlfER5bmFtaWNEcmF3VXNhZ2V8U3RyZWFtRHJhd1VzYWdlfFN0YXRpY1JlYWRVc2FnZXxEeW5hbWljUmVhZFVzYWdlfFN0cmVhbVJlYWRVc2FnZXxTdGF0aWNDb3B5VXNhZ2V8RHluYW1pY0NvcHlVc2FnZXxTdHJlYW1Db3B5VXNhZ2UpfSB2YWx1ZSAtIFRoZSB1c2FnZSB0byBzZXQuXHJcblx0ICogQHJldHVybiB7QnVmZmVyQXR0cmlidXRlfSBBIHJlZmVyZW5jZSB0byB0aGlzIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICovXHJcblx0c2V0VXNhZ2UoIHZhbHVlICkge1xyXG5cclxuXHRcdHRoaXMudXNhZ2UgPSB2YWx1ZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIGEgcmFuZ2Ugb2YgZGF0YSBpbiB0aGUgZGF0YSBhcnJheSB0byBiZSB1cGRhdGVkIG9uIHRoZSBHUFUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgLSBQb3NpdGlvbiBhdCB3aGljaCB0byBzdGFydCB1cGRhdGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGNvdW50IC0gVGhlIG51bWJlciBvZiBjb21wb25lbnRzIHRvIHVwZGF0ZS5cclxuXHQgKi9cclxuXHRhZGRVcGRhdGVSYW5nZSggc3RhcnQsIGNvdW50ICkge1xyXG5cclxuXHRcdHRoaXMudXBkYXRlUmFuZ2VzLnB1c2goIHsgc3RhcnQsIGNvdW50IH0gKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDbGVhcnMgdGhlIHVwZGF0ZSByYW5nZXMuXHJcblx0ICovXHJcblx0Y2xlYXJVcGRhdGVSYW5nZXMoKSB7XHJcblxyXG5cdFx0dGhpcy51cGRhdGVSYW5nZXMubGVuZ3RoID0gMDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gYnVmZmVyIGF0dHJpYnV0ZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCdWZmZXJBdHRyaWJ1dGV9IHNvdXJjZSAtIFRoZSBidWZmZXIgYXR0cmlidXRlIHRvIGNvcHkuXHJcblx0ICogQHJldHVybiB7QnVmZmVyQXR0cmlidXRlfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHR0aGlzLm5hbWUgPSBzb3VyY2UubmFtZTtcclxuXHRcdHRoaXMuYXJyYXkgPSBuZXcgc291cmNlLmFycmF5LmNvbnN0cnVjdG9yKCBzb3VyY2UuYXJyYXkgKTtcclxuXHRcdHRoaXMuaXRlbVNpemUgPSBzb3VyY2UuaXRlbVNpemU7XHJcblx0XHR0aGlzLmNvdW50ID0gc291cmNlLmNvdW50O1xyXG5cdFx0dGhpcy5ub3JtYWxpemVkID0gc291cmNlLm5vcm1hbGl6ZWQ7XHJcblxyXG5cdFx0dGhpcy51c2FnZSA9IHNvdXJjZS51c2FnZTtcclxuXHRcdHRoaXMuZ3B1VHlwZSA9IHNvdXJjZS5ncHVUeXBlO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvcGllcyBhIHZlY3RvciBmcm9tIHRoZSBnaXZlbiBidWZmZXIgYXR0cmlidXRlIHRvIHRoaXMgb25lLiBUaGUgc3RhcnRcclxuXHQgKiBhbmQgZGVzdGluYXRpb24gcG9zaXRpb24gaW4gdGhlIGF0dHJpYnV0ZSBidWZmZXJzIGFyZSByZXByZXNlbnRlZCBieSB0aGVcclxuXHQgKiBnaXZlbiBpbmRpY2VzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4MSAtIFRoZSBkZXN0aW5hdGlvbiBpbmRleCBpbnRvIHRoaXMgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKiBAcGFyYW0ge0J1ZmZlckF0dHJpYnV0ZX0gYXR0cmlidXRlIC0gVGhlIGJ1ZmZlciBhdHRyaWJ1dGUgdG8gY29weSBmcm9tLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleDIgLSBUaGUgc291cmNlIGluZGV4IGludG8gdGhlIGdpdmVuIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICogQHJldHVybiB7QnVmZmVyQXR0cmlidXRlfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNvcHlBdCggaW5kZXgxLCBhdHRyaWJ1dGUsIGluZGV4MiApIHtcclxuXHJcblx0XHRpbmRleDEgKj0gdGhpcy5pdGVtU2l6ZTtcclxuXHRcdGluZGV4MiAqPSBhdHRyaWJ1dGUuaXRlbVNpemU7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gdGhpcy5pdGVtU2l6ZTsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmFycmF5WyBpbmRleDEgKyBpIF0gPSBhdHRyaWJ1dGUuYXJyYXlbIGluZGV4MiArIGkgXTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29waWVzIHRoZSBnaXZlbiBhcnJheSBkYXRhIGludG8gdGhpcyBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHsoVHlwZWRBcnJheXxBcnJheSl9IGFycmF5IC0gVGhlIGFycmF5IHRvIGNvcHkuXHJcblx0ICogQHJldHVybiB7QnVmZmVyQXR0cmlidXRlfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNvcHlBcnJheSggYXJyYXkgKSB7XHJcblxyXG5cdFx0dGhpcy5hcnJheS5zZXQoIGFycmF5ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQXBwbGllcyB0aGUgZ2l2ZW4gM3gzIG1hdHJpeCB0byB0aGUgZ2l2ZW4gYXR0cmlidXRlLiBXb3JrcyB3aXRoXHJcblx0ICogaXRlbSBzaXplIGAyYCBhbmQgYDNgLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRyaXgzfSBtIC0gVGhlIG1hdHJpeCB0byBhcHBseS5cclxuXHQgKiBAcmV0dXJuIHtCdWZmZXJBdHRyaWJ1dGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0YXBwbHlNYXRyaXgzKCBtICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5pdGVtU2l6ZSA9PT0gMiApIHtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHRoaXMuY291bnQ7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRfdmVjdG9yMi5mcm9tQnVmZmVyQXR0cmlidXRlKCB0aGlzLCBpICk7XHJcblx0XHRcdFx0X3ZlY3RvcjIuYXBwbHlNYXRyaXgzKCBtICk7XHJcblxyXG5cdFx0XHRcdHRoaXMuc2V0WFkoIGksIF92ZWN0b3IyLngsIF92ZWN0b3IyLnkgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2UgaWYgKCB0aGlzLml0ZW1TaXplID09PSAzICkge1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gdGhpcy5jb3VudDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdF92ZWN0b3IuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggdGhpcywgaSApO1xyXG5cdFx0XHRcdF92ZWN0b3IuYXBwbHlNYXRyaXgzKCBtICk7XHJcblxyXG5cdFx0XHRcdHRoaXMuc2V0WFlaKCBpLCBfdmVjdG9yLngsIF92ZWN0b3IueSwgX3ZlY3Rvci56ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFwcGxpZXMgdGhlIGdpdmVuIDR4NCBtYXRyaXggdG8gdGhlIGdpdmVuIGF0dHJpYnV0ZS4gT25seSB3b3JrcyB3aXRoXHJcblx0ICogaXRlbSBzaXplIGAzYC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4NH0gbSAtIFRoZSBtYXRyaXggdG8gYXBwbHkuXHJcblx0ICogQHJldHVybiB7QnVmZmVyQXR0cmlidXRlfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGFwcGx5TWF0cml4NCggbSApIHtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSB0aGlzLmNvdW50OyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdF92ZWN0b3IuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggdGhpcywgaSApO1xyXG5cclxuXHRcdFx0X3ZlY3Rvci5hcHBseU1hdHJpeDQoIG0gKTtcclxuXHJcblx0XHRcdHRoaXMuc2V0WFlaKCBpLCBfdmVjdG9yLngsIF92ZWN0b3IueSwgX3ZlY3Rvci56ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFwcGxpZXMgdGhlIGdpdmVuIDN4MyBub3JtYWwgbWF0cml4IHRvIHRoZSBnaXZlbiBhdHRyaWJ1dGUuIE9ubHkgd29ya3Mgd2l0aFxyXG5cdCAqIGl0ZW0gc2l6ZSBgM2AuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDN9IG0gLSBUaGUgbm9ybWFsIG1hdHJpeCB0byBhcHBseS5cclxuXHQgKiBAcmV0dXJuIHtCdWZmZXJBdHRyaWJ1dGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0YXBwbHlOb3JtYWxNYXRyaXgoIG0gKSB7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gdGhpcy5jb3VudDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRfdmVjdG9yLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHRoaXMsIGkgKTtcclxuXHJcblx0XHRcdF92ZWN0b3IuYXBwbHlOb3JtYWxNYXRyaXgoIG0gKTtcclxuXHJcblx0XHRcdHRoaXMuc2V0WFlaKCBpLCBfdmVjdG9yLngsIF92ZWN0b3IueSwgX3ZlY3Rvci56ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFwcGxpZXMgdGhlIGdpdmVuIDR4NCBtYXRyaXggdG8gdGhlIGdpdmVuIGF0dHJpYnV0ZS4gT25seSB3b3JrcyB3aXRoXHJcblx0ICogaXRlbSBzaXplIGAzYCBhbmQgd2l0aCBkaXJlY3Rpb24gdmVjdG9ycy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4NH0gbSAtIFRoZSBtYXRyaXggdG8gYXBwbHkuXHJcblx0ICogQHJldHVybiB7QnVmZmVyQXR0cmlidXRlfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHRyYW5zZm9ybURpcmVjdGlvbiggbSApIHtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSB0aGlzLmNvdW50OyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdF92ZWN0b3IuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggdGhpcywgaSApO1xyXG5cclxuXHRcdFx0X3ZlY3Rvci50cmFuc2Zvcm1EaXJlY3Rpb24oIG0gKTtcclxuXHJcblx0XHRcdHRoaXMuc2V0WFlaKCBpLCBfdmVjdG9yLngsIF92ZWN0b3IueSwgX3ZlY3Rvci56ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGdpdmVuIGFycmF5IGRhdGEgaW4gdGhlIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geyhUeXBlZEFycmF5fEFycmF5KX0gdmFsdWUgLSBUaGUgYXJyYXkgZGF0YSB0byBzZXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXQ9MF0gLSBUaGUgb2Zmc2V0IGluIHRoaXMgYnVmZmVyIGF0dHJpYnV0ZSdzIGFycmF5LlxyXG5cdCAqIEByZXR1cm4ge0J1ZmZlckF0dHJpYnV0ZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXQoIHZhbHVlLCBvZmZzZXQgPSAwICkge1xyXG5cclxuXHRcdC8vIE1hdGNoaW5nIEJ1ZmZlckF0dHJpYnV0ZSBjb25zdHJ1Y3RvciwgZG8gbm90IG5vcm1hbGl6ZSB0aGUgYXJyYXkuXHJcblx0XHR0aGlzLmFycmF5LnNldCggdmFsdWUsIG9mZnNldCApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGdpdmVuIGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yIGF0IHRoZSBnaXZlbiBpbmRleC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBpbnRvIHRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBjb21wb25lbnQgLSBUaGUgY29tcG9uZW50IGluZGV4LlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIHJldHVybmVkIHZhbHVlLlxyXG5cdCAqL1xyXG5cdGdldENvbXBvbmVudCggaW5kZXgsIGNvbXBvbmVudCApIHtcclxuXHJcblx0XHRsZXQgdmFsdWUgPSB0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgKyBjb21wb25lbnQgXTtcclxuXHJcblx0XHRpZiAoIHRoaXMubm9ybWFsaXplZCApIHZhbHVlID0gZGVub3JtYWxpemUoIHZhbHVlLCB0aGlzLmFycmF5ICk7XHJcblxyXG5cdFx0cmV0dXJuIHZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBnaXZlbiBjb21wb25lbnQgb2YgdGhlIHZlY3RvciBhdCB0aGUgZ2l2ZW4gaW5kZXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggaW50byB0aGUgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gY29tcG9uZW50IC0gVGhlIGNvbXBvbmVudCBpbmRleC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge0J1ZmZlckF0dHJpYnV0ZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXRDb21wb25lbnQoIGluZGV4LCBjb21wb25lbnQsIHZhbHVlICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5ub3JtYWxpemVkICkgdmFsdWUgPSBub3JtYWxpemUoIHZhbHVlLCB0aGlzLmFycmF5ICk7XHJcblxyXG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgY29tcG9uZW50IF0gPSB2YWx1ZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSB4IGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yIGF0IHRoZSBnaXZlbiBpbmRleC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBpbnRvIHRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIHggY29tcG9uZW50LlxyXG5cdCAqL1xyXG5cdGdldFgoIGluZGV4ICkge1xyXG5cclxuXHRcdGxldCB4ID0gdGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplIF07XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5vcm1hbGl6ZWQgKSB4ID0gZGVub3JtYWxpemUoIHgsIHRoaXMuYXJyYXkgKTtcclxuXHJcblx0XHRyZXR1cm4geDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB4IGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yIGF0IHRoZSBnaXZlbiBpbmRleC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBpbnRvIHRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHZhbHVlIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtCdWZmZXJBdHRyaWJ1dGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0WCggaW5kZXgsIHggKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5vcm1hbGl6ZWQgKSB4ID0gbm9ybWFsaXplKCB4LCB0aGlzLmFycmF5ICk7XHJcblxyXG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplIF0gPSB4O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHkgY29tcG9uZW50IG9mIHRoZSB2ZWN0b3IgYXQgdGhlIGdpdmVuIGluZGV4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluZGV4IGludG8gdGhlIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgeSBjb21wb25lbnQuXHJcblx0ICovXHJcblx0Z2V0WSggaW5kZXggKSB7XHJcblxyXG5cdFx0bGV0IHkgPSB0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgKyAxIF07XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5vcm1hbGl6ZWQgKSB5ID0gZGVub3JtYWxpemUoIHksIHRoaXMuYXJyYXkgKTtcclxuXHJcblx0XHRyZXR1cm4geTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB5IGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yIGF0IHRoZSBnaXZlbiBpbmRleC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBpbnRvIHRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHZhbHVlIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtCdWZmZXJBdHRyaWJ1dGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0WSggaW5kZXgsIHkgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5vcm1hbGl6ZWQgKSB5ID0gbm9ybWFsaXplKCB5LCB0aGlzLmFycmF5ICk7XHJcblxyXG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMSBdID0geTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSB6IGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yIGF0IHRoZSBnaXZlbiBpbmRleC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBpbnRvIHRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIHogY29tcG9uZW50LlxyXG5cdCAqL1xyXG5cdGdldFooIGluZGV4ICkge1xyXG5cclxuXHRcdGxldCB6ID0gdGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMiBdO1xyXG5cclxuXHRcdGlmICggdGhpcy5ub3JtYWxpemVkICkgeiA9IGRlbm9ybWFsaXplKCB6LCB0aGlzLmFycmF5ICk7XHJcblxyXG5cdFx0cmV0dXJuIHo7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgeiBjb21wb25lbnQgb2YgdGhlIHZlY3RvciBhdCB0aGUgZ2l2ZW4gaW5kZXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggaW50byB0aGUgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geiAtIFRoZSB2YWx1ZSB0byBzZXQuXHJcblx0ICogQHJldHVybiB7QnVmZmVyQXR0cmlidXRlfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldFooIGluZGV4LCB6ICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5ub3JtYWxpemVkICkgeiA9IG5vcm1hbGl6ZSggeiwgdGhpcy5hcnJheSApO1xyXG5cclxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDIgXSA9IHo7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgdyBjb21wb25lbnQgb2YgdGhlIHZlY3RvciBhdCB0aGUgZ2l2ZW4gaW5kZXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggaW50byB0aGUgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB3IGNvbXBvbmVudC5cclxuXHQgKi9cclxuXHRnZXRXKCBpbmRleCApIHtcclxuXHJcblx0XHRsZXQgdyA9IHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDMgXTtcclxuXHJcblx0XHRpZiAoIHRoaXMubm9ybWFsaXplZCApIHcgPSBkZW5vcm1hbGl6ZSggdywgdGhpcy5hcnJheSApO1xyXG5cclxuXHRcdHJldHVybiB3O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHcgY29tcG9uZW50IG9mIHRoZSB2ZWN0b3IgYXQgdGhlIGdpdmVuIGluZGV4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluZGV4IGludG8gdGhlIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHcgLSBUaGUgdmFsdWUgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge0J1ZmZlckF0dHJpYnV0ZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXRXKCBpbmRleCwgdyApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMubm9ybWFsaXplZCApIHcgPSBub3JtYWxpemUoIHcsIHRoaXMuYXJyYXkgKTtcclxuXHJcblx0XHR0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgKyAzIF0gPSB3O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHggYW5kIHkgY29tcG9uZW50IG9mIHRoZSB2ZWN0b3IgYXQgdGhlIGdpdmVuIGluZGV4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluZGV4IGludG8gdGhlIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgdmFsdWUgZm9yIHRoZSB4IGNvbXBvbmVudCB0byBzZXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmFsdWUgZm9yIHRoZSB5IGNvbXBvbmVudCB0byBzZXQuXHJcblx0ICogQHJldHVybiB7QnVmZmVyQXR0cmlidXRlfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldFhZKCBpbmRleCwgeCwgeSApIHtcclxuXHJcblx0XHRpbmRleCAqPSB0aGlzLml0ZW1TaXplO1xyXG5cclxuXHRcdGlmICggdGhpcy5ub3JtYWxpemVkICkge1xyXG5cclxuXHRcdFx0eCA9IG5vcm1hbGl6ZSggeCwgdGhpcy5hcnJheSApO1xyXG5cdFx0XHR5ID0gbm9ybWFsaXplKCB5LCB0aGlzLmFycmF5ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMCBdID0geDtcclxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMSBdID0geTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB4LCB5IGFuZCB6IGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yIGF0IHRoZSBnaXZlbiBpbmRleC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBpbnRvIHRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHZhbHVlIGZvciB0aGUgeCBjb21wb25lbnQgdG8gc2V0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHZhbHVlIGZvciB0aGUgeSBjb21wb25lbnQgdG8gc2V0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB6IC0gVGhlIHZhbHVlIGZvciB0aGUgeiBjb21wb25lbnQgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge0J1ZmZlckF0dHJpYnV0ZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXRYWVooIGluZGV4LCB4LCB5LCB6ICkge1xyXG5cclxuXHRcdGluZGV4ICo9IHRoaXMuaXRlbVNpemU7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5vcm1hbGl6ZWQgKSB7XHJcblxyXG5cdFx0XHR4ID0gbm9ybWFsaXplKCB4LCB0aGlzLmFycmF5ICk7XHJcblx0XHRcdHkgPSBub3JtYWxpemUoIHksIHRoaXMuYXJyYXkgKTtcclxuXHRcdFx0eiA9IG5vcm1hbGl6ZSggeiwgdGhpcy5hcnJheSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDAgXSA9IHg7XHJcblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDEgXSA9IHk7XHJcblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDIgXSA9IHo7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgeCwgeSwgeiBhbmQgdyBjb21wb25lbnQgb2YgdGhlIHZlY3RvciBhdCB0aGUgZ2l2ZW4gaW5kZXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggaW50byB0aGUgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB2YWx1ZSBmb3IgdGhlIHggY29tcG9uZW50IHRvIHNldC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB2YWx1ZSBmb3IgdGhlIHkgY29tcG9uZW50IHRvIHNldC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geiAtIFRoZSB2YWx1ZSBmb3IgdGhlIHogY29tcG9uZW50IHRvIHNldC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdyAtIFRoZSB2YWx1ZSBmb3IgdGhlIHcgY29tcG9uZW50IHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtCdWZmZXJBdHRyaWJ1dGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0WFlaVyggaW5kZXgsIHgsIHksIHosIHcgKSB7XHJcblxyXG5cdFx0aW5kZXggKj0gdGhpcy5pdGVtU2l6ZTtcclxuXHJcblx0XHRpZiAoIHRoaXMubm9ybWFsaXplZCApIHtcclxuXHJcblx0XHRcdHggPSBub3JtYWxpemUoIHgsIHRoaXMuYXJyYXkgKTtcclxuXHRcdFx0eSA9IG5vcm1hbGl6ZSggeSwgdGhpcy5hcnJheSApO1xyXG5cdFx0XHR6ID0gbm9ybWFsaXplKCB6LCB0aGlzLmFycmF5ICk7XHJcblx0XHRcdHcgPSBub3JtYWxpemUoIHcsIHRoaXMuYXJyYXkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAwIF0gPSB4O1xyXG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAxIF0gPSB5O1xyXG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAyIF0gPSB6O1xyXG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAzIF0gPSB3O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGdpdmVuIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgZXhlY3V0ZWQgYWZ0ZXIgdGhlIFJlbmRlcmVyIGhhcyB0cmFuc2ZlcnJlZFxyXG5cdCAqIHRoZSBhdHRyaWJ1dGUgYXJyYXkgZGF0YSB0byB0aGUgR1BVLiBDYW4gYmUgdXNlZCB0byBwZXJmb3JtIGNsZWFuLXVwIG9wZXJhdGlvbnMgYWZ0ZXJcclxuXHQgKiB0aGUgdXBsb2FkIHdoZW4gYXR0cmlidXRlIGRhdGEgYXJlIG5vdCBuZWVkZWQgYW55bW9yZSBvbiB0aGUgQ1BVIHNpZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayAtIFRoZSBgb25VcGxvYWQoKWAgY2FsbGJhY2suXHJcblx0ICogQHJldHVybiB7QnVmZmVyQXR0cmlidXRlfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdG9uVXBsb2FkKCBjYWxsYmFjayApIHtcclxuXHJcblx0XHR0aGlzLm9uVXBsb2FkQ2FsbGJhY2sgPSBjYWxsYmFjaztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbmV3IGJ1ZmZlciBhdHRyaWJ1dGUgd2l0aCBjb3BpZWQgdmFsdWVzIGZyb20gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0J1ZmZlckF0dHJpYnV0ZX0gQSBjbG9uZSBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNsb25lKCkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5hcnJheSwgdGhpcy5pdGVtU2l6ZSApLmNvcHkoIHRoaXMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXJpYWxpemVzIHRoZSBidWZmZXIgYXR0cmlidXRlIGludG8gSlNPTi5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge09iamVjdH0gQSBKU09OIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNlcmlhbGl6ZWQgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKi9cclxuXHR0b0pTT04oKSB7XHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IHtcclxuXHRcdFx0aXRlbVNpemU6IHRoaXMuaXRlbVNpemUsXHJcblx0XHRcdHR5cGU6IHRoaXMuYXJyYXkuY29uc3RydWN0b3IubmFtZSxcclxuXHRcdFx0YXJyYXk6IEFycmF5LmZyb20oIHRoaXMuYXJyYXkgKSxcclxuXHRcdFx0bm9ybWFsaXplZDogdGhpcy5ub3JtYWxpemVkXHJcblx0XHR9O1xyXG5cclxuXHRcdGlmICggdGhpcy5uYW1lICE9PSAnJyApIGRhdGEubmFtZSA9IHRoaXMubmFtZTtcclxuXHRcdGlmICggdGhpcy51c2FnZSAhPT0gU3RhdGljRHJhd1VzYWdlICkgZGF0YS51c2FnZSA9IHRoaXMudXNhZ2U7XHJcblxyXG5cdFx0cmV0dXJuIGRhdGE7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb252ZW5pZW50IGNsYXNzIHRoYXQgY2FuIGJlIHVzZWQgd2hlbiBjcmVhdGluZyBhIGBJbnQ4YCBidWZmZXIgYXR0cmlidXRlIHdpdGhcclxuICogYSBwbGFpbiBgQXJyYXlgIGluc3RhbmNlLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQnVmZmVyQXR0cmlidXRlXHJcbiAqL1xyXG5jbGFzcyBJbnQ4QnVmZmVyQXR0cmlidXRlIGV4dGVuZHMgQnVmZmVyQXR0cmlidXRlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHsoQXJyYXk8bnVtYmVyPnxJbnQ4QXJyYXkpfSBhcnJheSAtIFRoZSBhcnJheSBob2xkaW5nIHRoZSBhdHRyaWJ1dGUgZGF0YS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaXRlbVNpemUgLSBUaGUgaXRlbSBzaXplLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW25vcm1hbGl6ZWQ9ZmFsc2VdIC0gV2hldGhlciB0aGUgZGF0YSBhcmUgbm9ybWFsaXplZCBvciBub3QuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHtcclxuXHJcblx0XHRzdXBlciggbmV3IEludDhBcnJheSggYXJyYXkgKSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIENvbnZlbmllbnQgY2xhc3MgdGhhdCBjYW4gYmUgdXNlZCB3aGVuIGNyZWF0aW5nIGEgYFVJbnQ4YCBidWZmZXIgYXR0cmlidXRlIHdpdGhcclxuICogYSBwbGFpbiBgQXJyYXlgIGluc3RhbmNlLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQnVmZmVyQXR0cmlidXRlXHJcbiAqL1xyXG5jbGFzcyBVaW50OEJ1ZmZlckF0dHJpYnV0ZSBleHRlbmRzIEJ1ZmZlckF0dHJpYnV0ZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7KEFycmF5PG51bWJlcj58VWludDhBcnJheSl9IGFycmF5IC0gVGhlIGFycmF5IGhvbGRpbmcgdGhlIGF0dHJpYnV0ZSBkYXRhLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpdGVtU2l6ZSAtIFRoZSBpdGVtIHNpemUuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbbm9ybWFsaXplZD1mYWxzZV0gLSBXaGV0aGVyIHRoZSBkYXRhIGFyZSBub3JtYWxpemVkIG9yIG5vdC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkge1xyXG5cclxuXHRcdHN1cGVyKCBuZXcgVWludDhBcnJheSggYXJyYXkgKSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIENvbnZlbmllbnQgY2xhc3MgdGhhdCBjYW4gYmUgdXNlZCB3aGVuIGNyZWF0aW5nIGEgYFVJbnQ4Q2xhbXBlZGAgYnVmZmVyIGF0dHJpYnV0ZSB3aXRoXHJcbiAqIGEgcGxhaW4gYEFycmF5YCBpbnN0YW5jZS5cclxuICpcclxuICogQGF1Z21lbnRzIEJ1ZmZlckF0dHJpYnV0ZVxyXG4gKi9cclxuY2xhc3MgVWludDhDbGFtcGVkQnVmZmVyQXR0cmlidXRlIGV4dGVuZHMgQnVmZmVyQXR0cmlidXRlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHsoQXJyYXk8bnVtYmVyPnxVaW50OENsYW1wZWRBcnJheSl9IGFycmF5IC0gVGhlIGFycmF5IGhvbGRpbmcgdGhlIGF0dHJpYnV0ZSBkYXRhLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpdGVtU2l6ZSAtIFRoZSBpdGVtIHNpemUuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbbm9ybWFsaXplZD1mYWxzZV0gLSBXaGV0aGVyIHRoZSBkYXRhIGFyZSBub3JtYWxpemVkIG9yIG5vdC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkge1xyXG5cclxuXHRcdHN1cGVyKCBuZXcgVWludDhDbGFtcGVkQXJyYXkoIGFycmF5ICksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb252ZW5pZW50IGNsYXNzIHRoYXQgY2FuIGJlIHVzZWQgd2hlbiBjcmVhdGluZyBhIGBJbnQxNmAgYnVmZmVyIGF0dHJpYnV0ZSB3aXRoXHJcbiAqIGEgcGxhaW4gYEFycmF5YCBpbnN0YW5jZS5cclxuICpcclxuICogQGF1Z21lbnRzIEJ1ZmZlckF0dHJpYnV0ZVxyXG4gKi9cclxuY2xhc3MgSW50MTZCdWZmZXJBdHRyaWJ1dGUgZXh0ZW5kcyBCdWZmZXJBdHRyaWJ1dGUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geyhBcnJheTxudW1iZXI+fEludDE2QXJyYXkpfSBhcnJheSAtIFRoZSBhcnJheSBob2xkaW5nIHRoZSBhdHRyaWJ1dGUgZGF0YS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaXRlbVNpemUgLSBUaGUgaXRlbSBzaXplLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW25vcm1hbGl6ZWQ9ZmFsc2VdIC0gV2hldGhlciB0aGUgZGF0YSBhcmUgbm9ybWFsaXplZCBvciBub3QuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHtcclxuXHJcblx0XHRzdXBlciggbmV3IEludDE2QXJyYXkoIGFycmF5ICksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb252ZW5pZW50IGNsYXNzIHRoYXQgY2FuIGJlIHVzZWQgd2hlbiBjcmVhdGluZyBhIGBVSW50MTZgIGJ1ZmZlciBhdHRyaWJ1dGUgd2l0aFxyXG4gKiBhIHBsYWluIGBBcnJheWAgaW5zdGFuY2UuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBCdWZmZXJBdHRyaWJ1dGVcclxuICovXHJcbmNsYXNzIFVpbnQxNkJ1ZmZlckF0dHJpYnV0ZSBleHRlbmRzIEJ1ZmZlckF0dHJpYnV0ZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7KEFycmF5PG51bWJlcj58VWludDE2QXJyYXkpfSBhcnJheSAtIFRoZSBhcnJheSBob2xkaW5nIHRoZSBhdHRyaWJ1dGUgZGF0YS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaXRlbVNpemUgLSBUaGUgaXRlbSBzaXplLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW25vcm1hbGl6ZWQ9ZmFsc2VdIC0gV2hldGhlciB0aGUgZGF0YSBhcmUgbm9ybWFsaXplZCBvciBub3QuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHtcclxuXHJcblx0XHRzdXBlciggbmV3IFVpbnQxNkFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQ29udmVuaWVudCBjbGFzcyB0aGF0IGNhbiBiZSB1c2VkIHdoZW4gY3JlYXRpbmcgYSBgSW50MzJgIGJ1ZmZlciBhdHRyaWJ1dGUgd2l0aFxyXG4gKiBhIHBsYWluIGBBcnJheWAgaW5zdGFuY2UuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBCdWZmZXJBdHRyaWJ1dGVcclxuICovXHJcbmNsYXNzIEludDMyQnVmZmVyQXR0cmlidXRlIGV4dGVuZHMgQnVmZmVyQXR0cmlidXRlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHsoQXJyYXk8bnVtYmVyPnxJbnQzMkFycmF5KX0gYXJyYXkgLSBUaGUgYXJyYXkgaG9sZGluZyB0aGUgYXR0cmlidXRlIGRhdGEuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGl0ZW1TaXplIC0gVGhlIGl0ZW0gc2l6ZS5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtub3JtYWxpemVkPWZhbHNlXSAtIFdoZXRoZXIgdGhlIGRhdGEgYXJlIG5vcm1hbGl6ZWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5ldyBJbnQzMkFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQ29udmVuaWVudCBjbGFzcyB0aGF0IGNhbiBiZSB1c2VkIHdoZW4gY3JlYXRpbmcgYSBgVUludDMyYCBidWZmZXIgYXR0cmlidXRlIHdpdGhcclxuICogYSBwbGFpbiBgQXJyYXlgIGluc3RhbmNlLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQnVmZmVyQXR0cmlidXRlXHJcbiAqL1xyXG5jbGFzcyBVaW50MzJCdWZmZXJBdHRyaWJ1dGUgZXh0ZW5kcyBCdWZmZXJBdHRyaWJ1dGUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geyhBcnJheTxudW1iZXI+fFVpbnQzMkFycmF5KX0gYXJyYXkgLSBUaGUgYXJyYXkgaG9sZGluZyB0aGUgYXR0cmlidXRlIGRhdGEuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGl0ZW1TaXplIC0gVGhlIGl0ZW0gc2l6ZS5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtub3JtYWxpemVkPWZhbHNlXSAtIFdoZXRoZXIgdGhlIGRhdGEgYXJlIG5vcm1hbGl6ZWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5ldyBVaW50MzJBcnJheSggYXJyYXkgKSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIENvbnZlbmllbnQgY2xhc3MgdGhhdCBjYW4gYmUgdXNlZCB3aGVuIGNyZWF0aW5nIGEgYEZsb2F0MTZgIGJ1ZmZlciBhdHRyaWJ1dGUgd2l0aFxyXG4gKiBhIHBsYWluIGBBcnJheWAgaW5zdGFuY2UuXHJcbiAqXHJcbiAqIFRoaXMgY2xhc3MgYXV0b21hdGljYWxseSBjb252ZXJ0cyB0byB0byBhbmQgZnJvbSBGUDE2IHNpbmNlIGBGbG9hdDE2QXJyYXlgIGlzIG5vdFxyXG4gKiBuYXRpdmVseSBzdXBwb3J0ZWQgaW4gSmF2YVNjcmlwdC5cclxuICpcclxuICogQGF1Z21lbnRzIEJ1ZmZlckF0dHJpYnV0ZVxyXG4gKi9cclxuY2xhc3MgRmxvYXQxNkJ1ZmZlckF0dHJpYnV0ZSBleHRlbmRzIEJ1ZmZlckF0dHJpYnV0ZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7KEFycmF5PG51bWJlcj58VWludDE2QXJyYXkpfSBhcnJheSAtIFRoZSBhcnJheSBob2xkaW5nIHRoZSBhdHRyaWJ1dGUgZGF0YS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaXRlbVNpemUgLSBUaGUgaXRlbSBzaXplLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW25vcm1hbGl6ZWQ9ZmFsc2VdIC0gV2hldGhlciB0aGUgZGF0YSBhcmUgbm9ybWFsaXplZCBvciBub3QuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHtcclxuXHJcblx0XHRzdXBlciggbmV3IFVpbnQxNkFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApO1xyXG5cclxuXHRcdHRoaXMuaXNGbG9hdDE2QnVmZmVyQXR0cmlidXRlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHRnZXRYKCBpbmRleCApIHtcclxuXHJcblx0XHRsZXQgeCA9IGZyb21IYWxmRmxvYXQoIHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSBdICk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5vcm1hbGl6ZWQgKSB4ID0gZGVub3JtYWxpemUoIHgsIHRoaXMuYXJyYXkgKTtcclxuXHJcblx0XHRyZXR1cm4geDtcclxuXHJcblx0fVxyXG5cclxuXHRzZXRYKCBpbmRleCwgeCApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMubm9ybWFsaXplZCApIHggPSBub3JtYWxpemUoIHgsIHRoaXMuYXJyYXkgKTtcclxuXHJcblx0XHR0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgXSA9IHRvSGFsZkZsb2F0KCB4ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0WSggaW5kZXggKSB7XHJcblxyXG5cdFx0bGV0IHkgPSBmcm9tSGFsZkZsb2F0KCB0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgKyAxIF0gKTtcclxuXHJcblx0XHRpZiAoIHRoaXMubm9ybWFsaXplZCApIHkgPSBkZW5vcm1hbGl6ZSggeSwgdGhpcy5hcnJheSApO1xyXG5cclxuXHRcdHJldHVybiB5O1xyXG5cclxuXHR9XHJcblxyXG5cdHNldFkoIGluZGV4LCB5ICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5ub3JtYWxpemVkICkgeSA9IG5vcm1hbGl6ZSggeSwgdGhpcy5hcnJheSApO1xyXG5cclxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDEgXSA9IHRvSGFsZkZsb2F0KCB5ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0WiggaW5kZXggKSB7XHJcblxyXG5cdFx0bGV0IHogPSBmcm9tSGFsZkZsb2F0KCB0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgKyAyIF0gKTtcclxuXHJcblx0XHRpZiAoIHRoaXMubm9ybWFsaXplZCApIHogPSBkZW5vcm1hbGl6ZSggeiwgdGhpcy5hcnJheSApO1xyXG5cclxuXHRcdHJldHVybiB6O1xyXG5cclxuXHR9XHJcblxyXG5cdHNldFooIGluZGV4LCB6ICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5ub3JtYWxpemVkICkgeiA9IG5vcm1hbGl6ZSggeiwgdGhpcy5hcnJheSApO1xyXG5cclxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDIgXSA9IHRvSGFsZkZsb2F0KCB6ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0VyggaW5kZXggKSB7XHJcblxyXG5cdFx0bGV0IHcgPSBmcm9tSGFsZkZsb2F0KCB0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgKyAzIF0gKTtcclxuXHJcblx0XHRpZiAoIHRoaXMubm9ybWFsaXplZCApIHcgPSBkZW5vcm1hbGl6ZSggdywgdGhpcy5hcnJheSApO1xyXG5cclxuXHRcdHJldHVybiB3O1xyXG5cclxuXHR9XHJcblxyXG5cdHNldFcoIGluZGV4LCB3ICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5ub3JtYWxpemVkICkgdyA9IG5vcm1hbGl6ZSggdywgdGhpcy5hcnJheSApO1xyXG5cclxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDMgXSA9IHRvSGFsZkZsb2F0KCB3ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0WFkoIGluZGV4LCB4LCB5ICkge1xyXG5cclxuXHRcdGluZGV4ICo9IHRoaXMuaXRlbVNpemU7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5vcm1hbGl6ZWQgKSB7XHJcblxyXG5cdFx0XHR4ID0gbm9ybWFsaXplKCB4LCB0aGlzLmFycmF5ICk7XHJcblx0XHRcdHkgPSBub3JtYWxpemUoIHksIHRoaXMuYXJyYXkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAwIF0gPSB0b0hhbGZGbG9hdCggeCApO1xyXG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAxIF0gPSB0b0hhbGZGbG9hdCggeSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdHNldFhZWiggaW5kZXgsIHgsIHksIHogKSB7XHJcblxyXG5cdFx0aW5kZXggKj0gdGhpcy5pdGVtU2l6ZTtcclxuXHJcblx0XHRpZiAoIHRoaXMubm9ybWFsaXplZCApIHtcclxuXHJcblx0XHRcdHggPSBub3JtYWxpemUoIHgsIHRoaXMuYXJyYXkgKTtcclxuXHRcdFx0eSA9IG5vcm1hbGl6ZSggeSwgdGhpcy5hcnJheSApO1xyXG5cdFx0XHR6ID0gbm9ybWFsaXplKCB6LCB0aGlzLmFycmF5ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMCBdID0gdG9IYWxmRmxvYXQoIHggKTtcclxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMSBdID0gdG9IYWxmRmxvYXQoIHkgKTtcclxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMiBdID0gdG9IYWxmRmxvYXQoIHogKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHRzZXRYWVpXKCBpbmRleCwgeCwgeSwgeiwgdyApIHtcclxuXHJcblx0XHRpbmRleCAqPSB0aGlzLml0ZW1TaXplO1xyXG5cclxuXHRcdGlmICggdGhpcy5ub3JtYWxpemVkICkge1xyXG5cclxuXHRcdFx0eCA9IG5vcm1hbGl6ZSggeCwgdGhpcy5hcnJheSApO1xyXG5cdFx0XHR5ID0gbm9ybWFsaXplKCB5LCB0aGlzLmFycmF5ICk7XHJcblx0XHRcdHogPSBub3JtYWxpemUoIHosIHRoaXMuYXJyYXkgKTtcclxuXHRcdFx0dyA9IG5vcm1hbGl6ZSggdywgdGhpcy5hcnJheSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDAgXSA9IHRvSGFsZkZsb2F0KCB4ICk7XHJcblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDEgXSA9IHRvSGFsZkZsb2F0KCB5ICk7XHJcblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDIgXSA9IHRvSGFsZkZsb2F0KCB6ICk7XHJcblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDMgXSA9IHRvSGFsZkZsb2F0KCB3ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb252ZW5pZW50IGNsYXNzIHRoYXQgY2FuIGJlIHVzZWQgd2hlbiBjcmVhdGluZyBhIGBGbG9hdDMyYCBidWZmZXIgYXR0cmlidXRlIHdpdGhcclxuICogYSBwbGFpbiBgQXJyYXlgIGluc3RhbmNlLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQnVmZmVyQXR0cmlidXRlXHJcbiAqL1xyXG5jbGFzcyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlIGV4dGVuZHMgQnVmZmVyQXR0cmlidXRlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHsoQXJyYXk8bnVtYmVyPnxGbG9hdDMyQXJyYXkpfSBhcnJheSAtIFRoZSBhcnJheSBob2xkaW5nIHRoZSBhdHRyaWJ1dGUgZGF0YS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaXRlbVNpemUgLSBUaGUgaXRlbSBzaXplLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW25vcm1hbGl6ZWQ9ZmFsc2VdIC0gV2hldGhlciB0aGUgZGF0YSBhcmUgbm9ybWFsaXplZCBvciBub3QuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHtcclxuXHJcblx0XHRzdXBlciggbmV3IEZsb2F0MzJBcnJheSggYXJyYXkgKSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLy9cclxuXHJcbmV4cG9ydCB7XHJcblx0RmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSxcclxuXHRGbG9hdDE2QnVmZmVyQXR0cmlidXRlLFxyXG5cdFVpbnQzMkJ1ZmZlckF0dHJpYnV0ZSxcclxuXHRJbnQzMkJ1ZmZlckF0dHJpYnV0ZSxcclxuXHRVaW50MTZCdWZmZXJBdHRyaWJ1dGUsXHJcblx0SW50MTZCdWZmZXJBdHRyaWJ1dGUsXHJcblx0VWludDhDbGFtcGVkQnVmZmVyQXR0cmlidXRlLFxyXG5cdFVpbnQ4QnVmZmVyQXR0cmlidXRlLFxyXG5cdEludDhCdWZmZXJBdHRyaWJ1dGUsXHJcblx0QnVmZmVyQXR0cmlidXRlXHJcbn07XHJcbiIsImltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IyLmpzJztcclxuaW1wb3J0IHsgQm94MyB9IGZyb20gJy4uL21hdGgvQm94My5qcyc7XHJcbmltcG9ydCB7IEV2ZW50RGlzcGF0Y2hlciB9IGZyb20gJy4vRXZlbnREaXNwYXRjaGVyLmpzJztcclxuaW1wb3J0IHsgQnVmZmVyQXR0cmlidXRlLCBGbG9hdDMyQnVmZmVyQXR0cmlidXRlLCBVaW50MTZCdWZmZXJBdHRyaWJ1dGUsIFVpbnQzMkJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4vQnVmZmVyQXR0cmlidXRlLmpzJztcclxuaW1wb3J0IHsgU3BoZXJlIH0gZnJvbSAnLi4vbWF0aC9TcGhlcmUuanMnO1xyXG5pbXBvcnQgeyBPYmplY3QzRCB9IGZyb20gJy4vT2JqZWN0M0QuanMnO1xyXG5pbXBvcnQgeyBNYXRyaXg0IH0gZnJvbSAnLi4vbWF0aC9NYXRyaXg0LmpzJztcclxuaW1wb3J0IHsgTWF0cml4MyB9IGZyb20gJy4uL21hdGgvTWF0cml4My5qcyc7XHJcbmltcG9ydCB7IGdlbmVyYXRlVVVJRCB9IGZyb20gJy4uL21hdGgvTWF0aFV0aWxzLmpzJztcclxuaW1wb3J0IHsgYXJyYXlOZWVkc1VpbnQzMiB9IGZyb20gJy4uL3V0aWxzLmpzJztcclxuXHJcbmxldCBfaWQgPSAwO1xyXG5cclxuY29uc3QgX20xID0gLypAX19QVVJFX18qLyBuZXcgTWF0cml4NCgpO1xyXG5jb25zdCBfb2JqID0gLypAX19QVVJFX18qLyBuZXcgT2JqZWN0M0QoKTtcclxuY29uc3QgX29mZnNldCA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX2JveCA9IC8qQF9fUFVSRV9fKi8gbmV3IEJveDMoKTtcclxuY29uc3QgX2JveE1vcnBoVGFyZ2V0cyA9IC8qQF9fUFVSRV9fKi8gbmV3IEJveDMoKTtcclxuY29uc3QgX3ZlY3RvciA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuXHJcbi8qKlxyXG4gKiBBIHJlcHJlc2VudGF0aW9uIG9mIG1lc2gsIGxpbmUsIG9yIHBvaW50IGdlb21ldHJ5LiBJbmNsdWRlcyB2ZXJ0ZXhcclxuICogcG9zaXRpb25zLCBmYWNlIGluZGljZXMsIG5vcm1hbHMsIGNvbG9ycywgVVZzLCBhbmQgY3VzdG9tIGF0dHJpYnV0ZXNcclxuICogd2l0aGluIGJ1ZmZlcnMsIHJlZHVjaW5nIHRoZSBjb3N0IG9mIHBhc3NpbmcgYWxsIHRoaXMgZGF0YSB0byB0aGUgR1BVLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBnZW9tZXRyeSA9IG5ldyBUSFJFRS5CdWZmZXJHZW9tZXRyeSgpO1xyXG4gKiAvLyBjcmVhdGUgYSBzaW1wbGUgc3F1YXJlIHNoYXBlLiBXZSBkdXBsaWNhdGUgdGhlIHRvcCBsZWZ0IGFuZCBib3R0b20gcmlnaHRcclxuICogLy8gdmVydGljZXMgYmVjYXVzZSBlYWNoIHZlcnRleCBuZWVkcyB0byBhcHBlYXIgb25jZSBwZXIgdHJpYW5nbGUuXHJcbiAqIGNvbnN0IHZlcnRpY2VzID0gbmV3IEZsb2F0MzJBcnJheSggW1xyXG4gKiBcdC0xLjAsIC0xLjAsICAxLjAsIC8vIHYwXHJcbiAqIFx0IDEuMCwgLTEuMCwgIDEuMCwgLy8gdjFcclxuICogXHQgMS4wLCAgMS4wLCAgMS4wLCAvLyB2MlxyXG4gKlxyXG4gKiBcdCAxLjAsICAxLjAsICAxLjAsIC8vIHYzXHJcbiAqIFx0LTEuMCwgIDEuMCwgIDEuMCwgLy8gdjRcclxuICogXHQtMS4wLCAtMS4wLCAgMS4wICAvLyB2NVxyXG4gKiBdICk7XHJcbiAqIC8vIGl0ZW1TaXplID0gMyBiZWNhdXNlIHRoZXJlIGFyZSAzIHZhbHVlcyAoY29tcG9uZW50cykgcGVyIHZlcnRleFxyXG4gKiBnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBUSFJFRS5CdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcclxuICogY29uc3QgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IDB4ZmYwMDAwIH0gKTtcclxuICogY29uc3QgbWVzaCA9IG5ldyBUSFJFRS5NZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBFdmVudERpc3BhdGNoZXJcclxuICovXHJcbmNsYXNzIEJ1ZmZlckdlb21ldHJ5IGV4dGVuZHMgRXZlbnREaXNwYXRjaGVyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBnZW9tZXRyeS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0J1ZmZlckdlb21ldHJ5ID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBJRCBvZiB0aGUgZ2VvbWV0cnkuXHJcblx0XHQgKlxyXG5cdFx0ICogQG5hbWUgQnVmZmVyR2VvbWV0cnkjaWRcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqL1xyXG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCAnaWQnLCB7IHZhbHVlOiBfaWQgKysgfSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIFVVSUQgb2YgdGhlIGdlb21ldHJ5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51dWlkID0gZ2VuZXJhdGVVVUlEKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbmFtZSBvZiB0aGUgZ2VvbWV0cnkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5uYW1lID0gJyc7XHJcblx0XHR0aGlzLnR5cGUgPSAnQnVmZmVyR2VvbWV0cnknO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQWxsb3dzIGZvciB2ZXJ0aWNlcyB0byBiZSByZS11c2VkIGFjcm9zcyBtdWx0aXBsZSB0cmlhbmdsZXM7IHRoaXMgaXNcclxuXHRcdCAqIGNhbGxlZCB1c2luZyBcImluZGV4ZWQgdHJpYW5nbGVzXCIuIEVhY2ggdHJpYW5nbGUgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZVxyXG5cdFx0ICogaW5kaWNlcyBvZiB0aHJlZSB2ZXJ0aWNlcy4gVGhpcyBhdHRyaWJ1dGUgdGhlcmVmb3JlIHN0b3JlcyB0aGUgaW5kZXggb2ZcclxuXHRcdCAqIGVhY2ggdmVydGV4IGZvciBlYWNoIHRyaWFuZ3VsYXIgZmFjZS4gSWYgdGhpcyBhdHRyaWJ1dGUgaXMgbm90IHNldCwgdGhlXHJcblx0XHQgKiByZW5kZXJlciBhc3N1bWVzIHRoYXQgZWFjaCB0aHJlZSBjb250aWd1b3VzIHBvc2l0aW9ucyByZXByZXNlbnQgYSBzaW5nbGUgdHJpYW5nbGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9CdWZmZXJBdHRyaWJ1dGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaW5kZXggPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSAoc3RvcmFnZSkgYnVmZmVyIGF0dHJpYnV0ZSB3aGljaCB3YXMgZ2VuZXJhdGVkIHdpdGggYSBjb21wdXRlIHNoYWRlciBhbmRcclxuXHRcdCAqIG5vdyBkZWZpbmVzIGluZGlyZWN0IGRyYXcgY2FsbHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQ2FuIG9ubHkgYmUgdXNlZCB3aXRoIHtAbGluayBXZWJHUFVSZW5kZXJlcn0gYW5kIGEgV2ViR1BVIGJhY2tlbmQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9CdWZmZXJBdHRyaWJ1dGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaW5kaXJlY3QgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBkaWN0aW9uYXJ5IGhhcyBhcyBpZCB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIGJlIHNldCBhbmQgYXMgdmFsdWVcclxuXHRcdCAqIHRoZSBidWZmZXIgYXR0cmlidXRlIHRvIHNldCBpdCB0by4gUmF0aGVyIHRoYW4gYWNjZXNzaW5nIHRoaXMgcHJvcGVydHkgZGlyZWN0bHksXHJcblx0XHQgKiB1c2UgYHNldEF0dHJpYnV0ZSgpYCBhbmQgYGdldEF0dHJpYnV0ZSgpYCB0byBhY2Nlc3MgYXR0cmlidXRlcyBvZiB0aGlzIGdlb21ldHJ5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLChCdWZmZXJBdHRyaWJ1dGV8SW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUpPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hdHRyaWJ1dGVzID0ge307XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGRpY3Rpb25hcnkgaG9sZHMgdGhlIG1vcnBoIHRhcmdldHMgb2YgdGhlIGdlb21ldHJ5LlxyXG5cdFx0ICpcclxuXHRcdCAqIE5vdGU6IE9uY2UgdGhlIGdlb21ldHJ5IGhhcyBiZWVuIHJlbmRlcmVkLCB0aGUgbW9ycGggYXR0cmlidXRlIGRhdGEgY2Fubm90XHJcblx0XHQgKiBiZSBjaGFuZ2VkLiBZb3Ugd2lsbCBoYXZlIHRvIGNhbGwgYGRpc3Bvc2UoKT8sIGFuZCBjcmVhdGUgYSBuZXcgZ2VvbWV0cnkgaW5zdGFuY2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tb3JwaEF0dHJpYnV0ZXMgPSB7fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFVzZWQgdG8gY29udHJvbCB0aGUgbW9ycGggdGFyZ2V0IGJlaGF2aW9yOyB3aGVuIHNldCB0byBgdHJ1ZWAsIHRoZSBtb3JwaFxyXG5cdFx0ICogdGFyZ2V0IGRhdGEgaXMgdHJlYXRlZCBhcyByZWxhdGl2ZSBvZmZzZXRzLCByYXRoZXIgdGhhbiBhcyBhYnNvbHV0ZVxyXG5cdFx0ICogcG9zaXRpb25zL25vcm1hbHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTcGxpdCB0aGUgZ2VvbWV0cnkgaW50byBncm91cHMsIGVhY2ggb2Ygd2hpY2ggd2lsbCBiZSByZW5kZXJlZCBpbiBhXHJcblx0XHQgKiBzZXBhcmF0ZSBkcmF3IGNhbGwuIFRoaXMgYWxsb3dzIGFuIGFycmF5IG9mIG1hdGVyaWFscyB0byBiZSB1c2VkIHdpdGggdGhlIGdlb21ldHJ5LlxyXG5cdFx0ICpcclxuXHRcdCAqIFVzZSBgYWRkR3JvdXAoKWAgYW5kIGBjbGVhckdyb3VwcygpYCB0byBlZGl0IGdyb3VwcywgcmF0aGVyIHRoYW4gbW9kaWZ5aW5nIHRoaXMgYXJyYXkgZGlyZWN0bHkuXHJcblx0XHQgKlxyXG5cdFx0ICogRXZlcnkgdmVydGV4IGFuZCBpbmRleCBtdXN0IGJlbG9uZyB0byBleGFjdGx5IG9uZSBncm91cCDigJQgZ3JvdXBzIG11c3Qgbm90IHNoYXJlIHZlcnRpY2VzIG9yXHJcblx0XHQgKiBpbmRpY2VzLCBhbmQgbXVzdCBub3QgbGVhdmUgdmVydGljZXMgb3IgaW5kaWNlcyB1bnVzZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PE9iamVjdD59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ3JvdXBzID0gW107XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBCb3VuZGluZyBib3ggZm9yIHRoZSBnZW9tZXRyeSB3aGljaCBjYW4gYmUgY2FsY3VsYXRlZCB3aXRoIGBjb21wdXRlQm91bmRpbmdCb3goKWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0JveDN9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYm91bmRpbmdCb3ggPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQm91bmRpbmcgc3BoZXJlIGZvciB0aGUgZ2VvbWV0cnkgd2hpY2ggY2FuIGJlIGNhbGN1bGF0ZWQgd2l0aCBgY29tcHV0ZUJvdW5kaW5nU3BoZXJlKClgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtTcGhlcmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGV0ZXJtaW5lcyB0aGUgcGFydCBvZiB0aGUgZ2VvbWV0cnkgdG8gcmVuZGVyLiBUaGlzIHNob3VsZCBub3QgYmUgc2V0IGRpcmVjdGx5LFxyXG5cdFx0ICogaW5zdGVhZCB1c2UgYHNldERyYXdSYW5nZSgpYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7e3N0YXJ0Om51bWJlcixjb3VudDpudW1iZXJ9fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRyYXdSYW5nZSA9IHsgc3RhcnQ6IDAsIGNvdW50OiBJbmZpbml0eSB9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQW4gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gc3RvcmUgY3VzdG9tIGRhdGEgYWJvdXQgdGhlIGdlb21ldHJ5LlxyXG5cdFx0ICogSXQgc2hvdWxkIG5vdCBob2xkIHJlZmVyZW5jZXMgdG8gZnVuY3Rpb25zIGFzIHRoZXNlIHdpbGwgbm90IGJlIGNsb25lZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVzZXJEYXRhID0ge307XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhpcyBnZW9tZXRyeS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4gez9CdWZmZXJBdHRyaWJ1dGV9IFRoZSBpbmRleC4gUmV0dXJucyBgbnVsbGAgaWYgbm8gaW5kZXggaXMgZGVmaW5lZC5cclxuXHQgKi9cclxuXHRnZXRJbmRleCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5pbmRleDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBnaXZlbiBpbmRleCB0byB0aGlzIGdlb21ldHJ5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fEJ1ZmZlckF0dHJpYnV0ZX0gaW5kZXggLSBUaGUgaW5kZXggdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge0J1ZmZlckdlb21ldHJ5fSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldEluZGV4KCBpbmRleCApIHtcclxuXHJcblx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIGluZGV4ICkgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmluZGV4ID0gbmV3ICggYXJyYXlOZWVkc1VpbnQzMiggaW5kZXggKSA/IFVpbnQzMkJ1ZmZlckF0dHJpYnV0ZSA6IFVpbnQxNkJ1ZmZlckF0dHJpYnV0ZSApKCBpbmRleCwgMSApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR0aGlzLmluZGV4ID0gaW5kZXg7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGdpdmVuIGluZGlyZWN0IGF0dHJpYnV0ZSB0byB0aGlzIGdlb21ldHJ5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCdWZmZXJBdHRyaWJ1dGV9IGluZGlyZWN0IC0gVGhlIGF0dHJpYnV0ZSBob2xkaW5nIGluZGlyZWN0IGRyYXcgY2FsbHMuXHJcblx0ICogQHJldHVybiB7QnVmZmVyR2VvbWV0cnl9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0SW5kaXJlY3QoIGluZGlyZWN0ICkge1xyXG5cclxuXHRcdHRoaXMuaW5kaXJlY3QgPSBpbmRpcmVjdDtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBpbmRpcmVjdCBhdHRyaWJ1dGUgb2YgdGhpcyBnZW9tZXRyeS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4gez9CdWZmZXJBdHRyaWJ1dGV9IFRoZSBpbmRpcmVjdCBhdHRyaWJ1dGUuIFJldHVybnMgYG51bGxgIGlmIG5vIGluZGlyZWN0IGF0dHJpYnV0ZSBpcyBkZWZpbmVkLlxyXG5cdCAqL1xyXG5cdGdldEluZGlyZWN0KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmluZGlyZWN0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGJ1ZmZlciBhdHRyaWJ1dGUgZm9yIHRoZSBnaXZlbiBuYW1lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgYXR0cmlidXRlIG5hbWUuXHJcblx0ICogQHJldHVybiB7QnVmZmVyQXR0cmlidXRlfEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlfHVuZGVmaW5lZH0gVGhlIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICogUmV0dXJucyBgdW5kZWZpbmVkYCBpZiBub3QgYXR0cmlidXRlIGhhcyBiZWVuIGZvdW5kLlxyXG5cdCAqL1xyXG5cdGdldEF0dHJpYnV0ZSggbmFtZSApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzWyBuYW1lIF07XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZ2l2ZW4gYXR0cmlidXRlIGZvciB0aGUgZ2l2ZW4gbmFtZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIGF0dHJpYnV0ZSBuYW1lLlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyQXR0cmlidXRlfEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlfSBhdHRyaWJ1dGUgLSBUaGUgYXR0cmlidXRlIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtCdWZmZXJHZW9tZXRyeX0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXRBdHRyaWJ1dGUoIG5hbWUsIGF0dHJpYnV0ZSApIHtcclxuXHJcblx0XHR0aGlzLmF0dHJpYnV0ZXNbIG5hbWUgXSA9IGF0dHJpYnV0ZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWxldGVzIHRoZSBhdHRyaWJ1dGUgZm9yIHRoZSBnaXZlbiBuYW1lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgYXR0cmlidXRlIG5hbWUgdG8gZGVsZXRlLlxyXG5cdCAqIEByZXR1cm4ge0J1ZmZlckdlb21ldHJ5fSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGRlbGV0ZUF0dHJpYnV0ZSggbmFtZSApIHtcclxuXHJcblx0XHRkZWxldGUgdGhpcy5hdHRyaWJ1dGVzWyBuYW1lIF07XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBnZW9tZXRyeSBoYXMgYW4gYXR0cmlidXRlIGZvciB0aGUgZ2l2ZW4gbmFtZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIGF0dHJpYnV0ZSBuYW1lLlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyBnZW9tZXRyeSBoYXMgYW4gYXR0cmlidXRlIGZvciB0aGUgZ2l2ZW4gbmFtZSBvciBub3QuXHJcblx0ICovXHJcblx0aGFzQXR0cmlidXRlKCBuYW1lICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmF0dHJpYnV0ZXNbIG5hbWUgXSAhPT0gdW5kZWZpbmVkO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgYSBncm91cCB0byB0aGlzIGdlb21ldHJ5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IC0gVGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhpcyBkcmF3IGNhbGwuIFRoYXQgaXMgdGhlIGZpcnN0XHJcblx0ICogdmVydGV4IGZvciBub24taW5kZXhlZCBnZW9tZXRyeSwgb3RoZXJ3aXNlIHRoZSBmaXJzdCB0cmlhbmdsZSBpbmRleC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gY291bnQgLSBTcGVjaWZpZXMgaG93IG1hbnkgdmVydGljZXMgKG9yIGluZGljZXMpIGFyZSBwYXJ0IG9mIHRoaXMgZ3JvdXAuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFttYXRlcmlhbEluZGV4PTBdIC0gVGhlIG1hdGVyaWFsIGFycmF5IGluZGV4IHRvIHVzZS5cclxuXHQgKi9cclxuXHRhZGRHcm91cCggc3RhcnQsIGNvdW50LCBtYXRlcmlhbEluZGV4ID0gMCApIHtcclxuXHJcblx0XHR0aGlzLmdyb3Vwcy5wdXNoKCB7XHJcblxyXG5cdFx0XHRzdGFydDogc3RhcnQsXHJcblx0XHRcdGNvdW50OiBjb3VudCxcclxuXHRcdFx0bWF0ZXJpYWxJbmRleDogbWF0ZXJpYWxJbmRleFxyXG5cclxuXHRcdH0gKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDbGVhcnMgYWxsIGdyb3Vwcy5cclxuXHQgKi9cclxuXHRjbGVhckdyb3VwcygpIHtcclxuXHJcblx0XHR0aGlzLmdyb3VwcyA9IFtdO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGRyYXcgcmFuZ2UgZm9yIHRoaXMgZ2VvbWV0cnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgLSBUaGUgZmlyc3QgdmVydGV4IGZvciBub24taW5kZXhlZCBnZW9tZXRyeSwgb3RoZXJ3aXNlIHRoZSBmaXJzdCB0cmlhbmdsZSBpbmRleC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gY291bnQgLSBGb3Igbm9uLWluZGV4ZWQgQnVmZmVyR2VvbWV0cnksIGBjb3VudGAgaXMgdGhlIG51bWJlciBvZiB2ZXJ0aWNlcyB0byByZW5kZXIuXHJcblx0ICogRm9yIGluZGV4ZWQgQnVmZmVyR2VvbWV0cnksIGBjb3VudGAgaXMgdGhlIG51bWJlciBvZiBpbmRpY2VzIHRvIHJlbmRlci5cclxuXHQgKi9cclxuXHRzZXREcmF3UmFuZ2UoIHN0YXJ0LCBjb3VudCApIHtcclxuXHJcblx0XHR0aGlzLmRyYXdSYW5nZS5zdGFydCA9IHN0YXJ0O1xyXG5cdFx0dGhpcy5kcmF3UmFuZ2UuY291bnQgPSBjb3VudDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBcHBsaWVzIHRoZSBnaXZlbiA0eDQgdHJhbnNmb3JtYXRpb24gbWF0cml4IHRvIHRoZSBnZW9tZXRyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4NH0gbWF0cml4IC0gVGhlIG1hdHJpeCB0byBhcHBseS5cclxuXHQgKiBAcmV0dXJuIHtCdWZmZXJHZW9tZXRyeX0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRhcHBseU1hdHJpeDQoIG1hdHJpeCApIHtcclxuXHJcblx0XHRjb25zdCBwb3NpdGlvbiA9IHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjtcclxuXHJcblx0XHRpZiAoIHBvc2l0aW9uICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRwb3NpdGlvbi5hcHBseU1hdHJpeDQoIG1hdHJpeCApO1xyXG5cclxuXHRcdFx0cG9zaXRpb24ubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBub3JtYWwgPSB0aGlzLmF0dHJpYnV0ZXMubm9ybWFsO1xyXG5cclxuXHRcdGlmICggbm9ybWFsICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBub3JtYWxNYXRyaXggPSBuZXcgTWF0cml4MygpLmdldE5vcm1hbE1hdHJpeCggbWF0cml4ICk7XHJcblxyXG5cdFx0XHRub3JtYWwuYXBwbHlOb3JtYWxNYXRyaXgoIG5vcm1hbE1hdHJpeCApO1xyXG5cclxuXHRcdFx0bm9ybWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgdGFuZ2VudCA9IHRoaXMuYXR0cmlidXRlcy50YW5nZW50O1xyXG5cclxuXHRcdGlmICggdGFuZ2VudCAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0dGFuZ2VudC50cmFuc2Zvcm1EaXJlY3Rpb24oIG1hdHJpeCApO1xyXG5cclxuXHRcdFx0dGFuZ2VudC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy5ib3VuZGluZ0JveCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy5ib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFwcGxpZXMgdGhlIHJvdGF0aW9uIHJlcHJlc2VudGVkIGJ5IHRoZSBRdWF0ZXJuaW9uIHRvIHRoZSBnZW9tZXRyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UXVhdGVybmlvbn0gcSAtIFRoZSBRdWF0ZXJuaW9uIHRvIGFwcGx5LlxyXG5cdCAqIEByZXR1cm4ge0J1ZmZlckdlb21ldHJ5fSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGFwcGx5UXVhdGVybmlvbiggcSApIHtcclxuXHJcblx0XHRfbTEubWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24oIHEgKTtcclxuXHJcblx0XHR0aGlzLmFwcGx5TWF0cml4NCggX20xICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUm90YXRlcyB0aGUgZ2VvbWV0cnkgYWJvdXQgdGhlIFggYXhpcy4gVGhpcyBpcyB0eXBpY2FsbHkgZG9uZSBhcyBhIG9uZSB0aW1lXHJcblx0ICogb3BlcmF0aW9uLCBhbmQgbm90IGR1cmluZyBhIGxvb3AuIFVzZSB7QGxpbmsgT2JqZWN0M0Qjcm90YXRpb259IGZvciB0eXBpY2FsXHJcblx0ICogcmVhbC10aW1lIG1lc2ggcm90YXRpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYW5nbGUgLSBUaGUgYW5nbGUgaW4gcmFkaWFucy5cclxuXHQgKiBAcmV0dXJuIHtCdWZmZXJHZW9tZXRyeX0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRyb3RhdGVYKCBhbmdsZSApIHtcclxuXHJcblx0XHQvLyByb3RhdGUgZ2VvbWV0cnkgYXJvdW5kIHdvcmxkIHgtYXhpc1xyXG5cclxuXHRcdF9tMS5tYWtlUm90YXRpb25YKCBhbmdsZSApO1xyXG5cclxuXHRcdHRoaXMuYXBwbHlNYXRyaXg0KCBfbTEgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSb3RhdGVzIHRoZSBnZW9tZXRyeSBhYm91dCB0aGUgWSBheGlzLiBUaGlzIGlzIHR5cGljYWxseSBkb25lIGFzIGEgb25lIHRpbWVcclxuXHQgKiBvcGVyYXRpb24sIGFuZCBub3QgZHVyaW5nIGEgbG9vcC4gVXNlIHtAbGluayBPYmplY3QzRCNyb3RhdGlvbn0gZm9yIHR5cGljYWxcclxuXHQgKiByZWFsLXRpbWUgbWVzaCByb3RhdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhbmdsZSAtIFRoZSBhbmdsZSBpbiByYWRpYW5zLlxyXG5cdCAqIEByZXR1cm4ge0J1ZmZlckdlb21ldHJ5fSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHJvdGF0ZVkoIGFuZ2xlICkge1xyXG5cclxuXHRcdC8vIHJvdGF0ZSBnZW9tZXRyeSBhcm91bmQgd29ybGQgeS1heGlzXHJcblxyXG5cdFx0X20xLm1ha2VSb3RhdGlvblkoIGFuZ2xlICk7XHJcblxyXG5cdFx0dGhpcy5hcHBseU1hdHJpeDQoIF9tMSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJvdGF0ZXMgdGhlIGdlb21ldHJ5IGFib3V0IHRoZSBaIGF4aXMuIFRoaXMgaXMgdHlwaWNhbGx5IGRvbmUgYXMgYSBvbmUgdGltZVxyXG5cdCAqIG9wZXJhdGlvbiwgYW5kIG5vdCBkdXJpbmcgYSBsb29wLiBVc2Uge0BsaW5rIE9iamVjdDNEI3JvdGF0aW9ufSBmb3IgdHlwaWNhbFxyXG5cdCAqIHJlYWwtdGltZSBtZXNoIHJvdGF0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFuZ2xlIC0gVGhlIGFuZ2xlIGluIHJhZGlhbnMuXHJcblx0ICogQHJldHVybiB7QnVmZmVyR2VvbWV0cnl9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0cm90YXRlWiggYW5nbGUgKSB7XHJcblxyXG5cdFx0Ly8gcm90YXRlIGdlb21ldHJ5IGFyb3VuZCB3b3JsZCB6LWF4aXNcclxuXHJcblx0XHRfbTEubWFrZVJvdGF0aW9uWiggYW5nbGUgKTtcclxuXHJcblx0XHR0aGlzLmFwcGx5TWF0cml4NCggX20xICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVHJhbnNsYXRlcyB0aGUgZ2VvbWV0cnkuIFRoaXMgaXMgdHlwaWNhbGx5IGRvbmUgYXMgYSBvbmUgdGltZVxyXG5cdCAqIG9wZXJhdGlvbiwgYW5kIG5vdCBkdXJpbmcgYSBsb29wLiBVc2Uge0BsaW5rIE9iamVjdDNEI3Bvc2l0aW9ufSBmb3IgdHlwaWNhbFxyXG5cdCAqIHJlYWwtdGltZSBtZXNoIHJvdGF0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeCBvZmZzZXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgeSBvZmZzZXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHogLSBUaGUgeiBvZmZzZXQuXHJcblx0ICogQHJldHVybiB7QnVmZmVyR2VvbWV0cnl9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0dHJhbnNsYXRlKCB4LCB5LCB6ICkge1xyXG5cclxuXHRcdC8vIHRyYW5zbGF0ZSBnZW9tZXRyeVxyXG5cclxuXHRcdF9tMS5tYWtlVHJhbnNsYXRpb24oIHgsIHksIHogKTtcclxuXHJcblx0XHR0aGlzLmFwcGx5TWF0cml4NCggX20xICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2NhbGVzIHRoZSBnZW9tZXRyeS4gVGhpcyBpcyB0eXBpY2FsbHkgZG9uZSBhcyBhIG9uZSB0aW1lXHJcblx0ICogb3BlcmF0aW9uLCBhbmQgbm90IGR1cmluZyBhIGxvb3AuIFVzZSB7QGxpbmsgT2JqZWN0M0Qjc2NhbGV9IGZvciB0eXBpY2FsXHJcblx0ICogcmVhbC10aW1lIG1lc2ggcm90YXRpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB4IHNjYWxlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHkgc2NhbGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHogLSBUaGUgeiBzY2FsZS5cclxuXHQgKiBAcmV0dXJuIHtCdWZmZXJHZW9tZXRyeX0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzY2FsZSggeCwgeSwgeiApIHtcclxuXHJcblx0XHQvLyBzY2FsZSBnZW9tZXRyeVxyXG5cclxuXHRcdF9tMS5tYWtlU2NhbGUoIHgsIHksIHogKTtcclxuXHJcblx0XHR0aGlzLmFwcGx5TWF0cml4NCggX20xICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUm90YXRlcyB0aGUgZ2VvbWV0cnkgdG8gZmFjZSBhIHBvaW50IGluIDNEIHNwYWNlLiBUaGlzIGlzIHR5cGljYWxseSBkb25lIGFzIGEgb25lIHRpbWVcclxuXHQgKiBvcGVyYXRpb24sIGFuZCBub3QgZHVyaW5nIGEgbG9vcC4gVXNlIHtAbGluayBPYmplY3QzRCNsb29rQXR9IGZvciB0eXBpY2FsXHJcblx0ICogcmVhbC10aW1lIG1lc2ggcm90YXRpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHZlY3RvciAtIFRoZSB0YXJnZXQgcG9pbnQuXHJcblx0ICogQHJldHVybiB7QnVmZmVyR2VvbWV0cnl9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0bG9va0F0KCB2ZWN0b3IgKSB7XHJcblxyXG5cdFx0X29iai5sb29rQXQoIHZlY3RvciApO1xyXG5cclxuXHRcdF9vYmoudXBkYXRlTWF0cml4KCk7XHJcblxyXG5cdFx0dGhpcy5hcHBseU1hdHJpeDQoIF9vYmoubWF0cml4ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2VudGVyIHRoZSBnZW9tZXRyeSBiYXNlZCBvbiBpdHMgYm91bmRpbmcgYm94LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7QnVmZmVyR2VvbWV0cnl9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y2VudGVyKCkge1xyXG5cclxuXHRcdHRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCk7XHJcblxyXG5cdFx0dGhpcy5ib3VuZGluZ0JveC5nZXRDZW50ZXIoIF9vZmZzZXQgKS5uZWdhdGUoKTtcclxuXHJcblx0XHR0aGlzLnRyYW5zbGF0ZSggX29mZnNldC54LCBfb2Zmc2V0LnksIF9vZmZzZXQueiApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgYSBnZW9tZXRyeSBieSBjcmVhdGluZyBhIGBwb3NpdGlvbmAgYXR0cmlidXRlIGJhc2VkIG9uIHRoZSBnaXZlbiBhcnJheSBvZiBwb2ludHMuIFRoZSBhcnJheVxyXG5cdCAqIGNhbiBob2xkIDJEIG9yIDNEIHZlY3RvcnMuIFdoZW4gdXNpbmcgdHdvLWRpbWVuc2lvbmFsIGRhdGEsIHRoZSBgemAgY29vcmRpbmF0ZSBmb3IgYWxsIHZlcnRpY2VzIGlzXHJcblx0ICogc2V0IHRvIGAwYC5cclxuXHQgKlxyXG5cdCAqIElmIHRoZSBtZXRob2QgaXMgdXNlZCB3aXRoIGFuIGV4aXN0aW5nIGBwb3NpdGlvbmAgYXR0cmlidXRlLCB0aGUgdmVydGV4IGRhdGEgYXJlIG92ZXJ3cml0dGVuIHdpdGggdGhlXHJcblx0ICogZGF0YSBmcm9tIHRoZSBhcnJheS4gVGhlIGxlbmd0aCBvZiB0aGUgYXJyYXkgbXVzdCBtYXRjaCB0aGUgdmVydGV4IGNvdW50LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxWZWN0b3IyPnxBcnJheTxWZWN0b3IzPn0gcG9pbnRzIC0gVGhlIHBvaW50cy5cclxuXHQgKiBAcmV0dXJuIHtCdWZmZXJHZW9tZXRyeX0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXRGcm9tUG9pbnRzKCBwb2ludHMgKSB7XHJcblxyXG5cdFx0Y29uc3QgcG9zaXRpb25BdHRyaWJ1dGUgPSB0aGlzLmdldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJyApO1xyXG5cclxuXHRcdGlmICggcG9zaXRpb25BdHRyaWJ1dGUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGNvbnN0IHBvc2l0aW9uID0gW107XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBwb2ludHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgcG9pbnQgPSBwb2ludHNbIGkgXTtcclxuXHRcdFx0XHRwb3NpdGlvbi5wdXNoKCBwb2ludC54LCBwb2ludC55LCBwb2ludC56IHx8IDAgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIDMgKSApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRjb25zdCBsID0gTWF0aC5taW4oIHBvaW50cy5sZW5ndGgsIHBvc2l0aW9uQXR0cmlidXRlLmNvdW50ICk7IC8vIG1ha2Ugc3VyZSBkYXRhIGRvIG5vdCBleGNlZWQgYnVmZmVyIHNpemVcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHBvaW50ID0gcG9pbnRzWyBpIF07XHJcblx0XHRcdFx0cG9zaXRpb25BdHRyaWJ1dGUuc2V0WFlaKCBpLCBwb2ludC54LCBwb2ludC55LCBwb2ludC56IHx8IDAgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggcG9pbnRzLmxlbmd0aCA+IHBvc2l0aW9uQXR0cmlidXRlLmNvdW50ICkge1xyXG5cclxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogQnVmZmVyIHNpemUgdG9vIHNtYWxsIGZvciBwb2ludHMgZGF0YS4gVXNlIC5kaXNwb3NlKCkgYW5kIGNyZWF0ZSBhIG5ldyBnZW9tZXRyeS4nICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRwb3NpdGlvbkF0dHJpYnV0ZS5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSBib3VuZGluZyBib3ggb2YgdGhlIGdlb21ldHJ5LCBhbmQgdXBkYXRlcyB0aGUgYGJvdW5kaW5nQm94YCBtZW1iZXIuXHJcblx0ICogVGhlIGJvdW5kaW5nIGJveCBpcyBub3QgY29tcHV0ZWQgYnkgdGhlIGVuZ2luZTsgaXQgbXVzdCBiZSBjb21wdXRlZCBieSB5b3VyIGFwcC5cclxuXHQgKiBZb3UgbWF5IG5lZWQgdG8gcmVjb21wdXRlIHRoZSBib3VuZGluZyBib3ggaWYgdGhlIGdlb21ldHJ5IHZlcnRpY2VzIGFyZSBtb2RpZmllZC5cclxuXHQgKi9cclxuXHRjb21wdXRlQm91bmRpbmdCb3goKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmJvdW5kaW5nQm94ID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveCA9IG5ldyBCb3gzKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHBvc2l0aW9uID0gdGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xyXG5cdFx0Y29uc3QgbW9ycGhBdHRyaWJ1dGVzUG9zaXRpb24gPSB0aGlzLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbjtcclxuXHJcblx0XHRpZiAoIHBvc2l0aW9uICYmIHBvc2l0aW9uLmlzR0xCdWZmZXJBdHRyaWJ1dGUgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nQm94KCk6IEdMQnVmZmVyQXR0cmlidXRlIHJlcXVpcmVzIGEgbWFudWFsIGJvdW5kaW5nIGJveC4nLCB0aGlzICk7XHJcblxyXG5cdFx0XHR0aGlzLmJvdW5kaW5nQm94LnNldChcclxuXHRcdFx0XHRuZXcgVmVjdG9yMyggLSBJbmZpbml0eSwgLSBJbmZpbml0eSwgLSBJbmZpbml0eSApLFxyXG5cdFx0XHRcdG5ldyBWZWN0b3IzKCArIEluZmluaXR5LCArIEluZmluaXR5LCArIEluZmluaXR5IClcclxuXHRcdFx0KTtcclxuXHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBwb3NpdGlvbiAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveC5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiApO1xyXG5cclxuXHRcdFx0Ly8gcHJvY2VzcyBtb3JwaCBhdHRyaWJ1dGVzIGlmIHByZXNlbnRcclxuXHJcblx0XHRcdGlmICggbW9ycGhBdHRyaWJ1dGVzUG9zaXRpb24gKSB7XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBtb3JwaEF0dHJpYnV0ZXNQb3NpdGlvbi5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBtb3JwaEF0dHJpYnV0ZSA9IG1vcnBoQXR0cmlidXRlc1Bvc2l0aW9uWyBpIF07XHJcblx0XHRcdFx0XHRfYm94LnNldEZyb21CdWZmZXJBdHRyaWJ1dGUoIG1vcnBoQXR0cmlidXRlICk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCB0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0X3ZlY3Rvci5hZGRWZWN0b3JzKCB0aGlzLmJvdW5kaW5nQm94Lm1pbiwgX2JveC5taW4gKTtcclxuXHRcdFx0XHRcdFx0dGhpcy5ib3VuZGluZ0JveC5leHBhbmRCeVBvaW50KCBfdmVjdG9yICk7XHJcblxyXG5cdFx0XHRcdFx0XHRfdmVjdG9yLmFkZFZlY3RvcnMoIHRoaXMuYm91bmRpbmdCb3gubWF4LCBfYm94Lm1heCApO1xyXG5cdFx0XHRcdFx0XHR0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoIF92ZWN0b3IgKTtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0dGhpcy5ib3VuZGluZ0JveC5leHBhbmRCeVBvaW50KCBfYm94Lm1pbiApO1xyXG5cdFx0XHRcdFx0XHR0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoIF9ib3gubWF4ICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHRoaXMuYm91bmRpbmdCb3gubWFrZUVtcHR5KCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggaXNOYU4oIHRoaXMuYm91bmRpbmdCb3gubWluLnggKSB8fCBpc05hTiggdGhpcy5ib3VuZGluZ0JveC5taW4ueSApIHx8IGlzTmFOKCB0aGlzLmJvdW5kaW5nQm94Lm1pbi56ICkgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nQm94KCk6IENvbXB1dGVkIG1pbi9tYXggaGF2ZSBOYU4gdmFsdWVzLiBUaGUgXCJwb3NpdGlvblwiIGF0dHJpYnV0ZSBpcyBsaWtlbHkgdG8gaGF2ZSBOYU4gdmFsdWVzLicsIHRoaXMgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgdGhlIGJvdW5kaW5nIHNwaGVyZSBvZiB0aGUgZ2VvbWV0cnksIGFuZCB1cGRhdGVzIHRoZSBgYm91bmRpbmdTcGhlcmVgIG1lbWJlci5cclxuXHQgKiBUaGUgZW5naW5lIGF1dG9tYXRpY2FsbHkgY29tcHV0ZXMgdGhlIGJvdW5kaW5nIHNwaGVyZSB3aGVuIGl0IGlzIG5lZWRlZCwgZS5nLiwgZm9yIHJheSBjYXN0aW5nIG9yIHZpZXcgZnJ1c3R1bSBjdWxsaW5nLlxyXG5cdCAqIFlvdSBtYXkgbmVlZCB0byByZWNvbXB1dGUgdGhlIGJvdW5kaW5nIHNwaGVyZSBpZiB0aGUgZ2VvbWV0cnkgdmVydGljZXMgYXJlIG1vZGlmaWVkLlxyXG5cdCAqL1xyXG5cdGNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gbmV3IFNwaGVyZSgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBwb3NpdGlvbiA9IHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjtcclxuXHRcdGNvbnN0IG1vcnBoQXR0cmlidXRlc1Bvc2l0aW9uID0gdGhpcy5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb247XHJcblxyXG5cdFx0aWYgKCBwb3NpdGlvbiAmJiBwb3NpdGlvbi5pc0dMQnVmZmVyQXR0cmlidXRlICkge1xyXG5cclxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOiBHTEJ1ZmZlckF0dHJpYnV0ZSByZXF1aXJlcyBhIG1hbnVhbCBib3VuZGluZyBzcGhlcmUuJywgdGhpcyApO1xyXG5cclxuXHRcdFx0dGhpcy5ib3VuZGluZ1NwaGVyZS5zZXQoIG5ldyBWZWN0b3IzKCksIEluZmluaXR5ICk7XHJcblxyXG5cdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggcG9zaXRpb24gKSB7XHJcblxyXG5cdFx0XHQvLyBmaXJzdCwgZmluZCB0aGUgY2VudGVyIG9mIHRoZSBib3VuZGluZyBzcGhlcmVcclxuXHJcblx0XHRcdGNvbnN0IGNlbnRlciA9IHRoaXMuYm91bmRpbmdTcGhlcmUuY2VudGVyO1xyXG5cclxuXHRcdFx0X2JveC5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiApO1xyXG5cclxuXHRcdFx0Ly8gcHJvY2VzcyBtb3JwaCBhdHRyaWJ1dGVzIGlmIHByZXNlbnRcclxuXHJcblx0XHRcdGlmICggbW9ycGhBdHRyaWJ1dGVzUG9zaXRpb24gKSB7XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBtb3JwaEF0dHJpYnV0ZXNQb3NpdGlvbi5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBtb3JwaEF0dHJpYnV0ZSA9IG1vcnBoQXR0cmlidXRlc1Bvc2l0aW9uWyBpIF07XHJcblx0XHRcdFx0XHRfYm94TW9ycGhUYXJnZXRzLnNldEZyb21CdWZmZXJBdHRyaWJ1dGUoIG1vcnBoQXR0cmlidXRlICk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCB0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0X3ZlY3Rvci5hZGRWZWN0b3JzKCBfYm94Lm1pbiwgX2JveE1vcnBoVGFyZ2V0cy5taW4gKTtcclxuXHRcdFx0XHRcdFx0X2JveC5leHBhbmRCeVBvaW50KCBfdmVjdG9yICk7XHJcblxyXG5cdFx0XHRcdFx0XHRfdmVjdG9yLmFkZFZlY3RvcnMoIF9ib3gubWF4LCBfYm94TW9ycGhUYXJnZXRzLm1heCApO1xyXG5cdFx0XHRcdFx0XHRfYm94LmV4cGFuZEJ5UG9pbnQoIF92ZWN0b3IgKTtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0X2JveC5leHBhbmRCeVBvaW50KCBfYm94TW9ycGhUYXJnZXRzLm1pbiApO1xyXG5cdFx0XHRcdFx0XHRfYm94LmV4cGFuZEJ5UG9pbnQoIF9ib3hNb3JwaFRhcmdldHMubWF4ICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRfYm94LmdldENlbnRlciggY2VudGVyICk7XHJcblxyXG5cdFx0XHQvLyBzZWNvbmQsIHRyeSB0byBmaW5kIGEgYm91bmRpbmdTcGhlcmUgd2l0aCBhIHJhZGl1cyBzbWFsbGVyIHRoYW4gdGhlXHJcblx0XHRcdC8vIGJvdW5kaW5nU3BoZXJlIG9mIHRoZSBib3VuZGluZ0JveDogc3FydCgzKSBzbWFsbGVyIGluIHRoZSBiZXN0IGNhc2VcclxuXHJcblx0XHRcdGxldCBtYXhSYWRpdXNTcSA9IDA7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gcG9zaXRpb24uY291bnQ7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0X3ZlY3Rvci5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgaSApO1xyXG5cclxuXHRcdFx0XHRtYXhSYWRpdXNTcSA9IE1hdGgubWF4KCBtYXhSYWRpdXNTcSwgY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKCBfdmVjdG9yICkgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIHByb2Nlc3MgbW9ycGggYXR0cmlidXRlcyBpZiBwcmVzZW50XHJcblxyXG5cdFx0XHRpZiAoIG1vcnBoQXR0cmlidXRlc1Bvc2l0aW9uICkge1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gbW9ycGhBdHRyaWJ1dGVzUG9zaXRpb24ubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgbW9ycGhBdHRyaWJ1dGUgPSBtb3JwaEF0dHJpYnV0ZXNQb3NpdGlvblsgaSBdO1xyXG5cdFx0XHRcdFx0Y29uc3QgbW9ycGhUYXJnZXRzUmVsYXRpdmUgPSB0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlO1xyXG5cclxuXHRcdFx0XHRcdGZvciAoIGxldCBqID0gMCwgamwgPSBtb3JwaEF0dHJpYnV0ZS5jb3VudDsgaiA8IGpsOyBqICsrICkge1xyXG5cclxuXHRcdFx0XHRcdFx0X3ZlY3Rvci5mcm9tQnVmZmVyQXR0cmlidXRlKCBtb3JwaEF0dHJpYnV0ZSwgaiApO1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCBtb3JwaFRhcmdldHNSZWxhdGl2ZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0X29mZnNldC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgaiApO1xyXG5cdFx0XHRcdFx0XHRcdF92ZWN0b3IuYWRkKCBfb2Zmc2V0ICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRtYXhSYWRpdXNTcSA9IE1hdGgubWF4KCBtYXhSYWRpdXNTcSwgY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKCBfdmVjdG9yICkgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzID0gTWF0aC5zcXJ0KCBtYXhSYWRpdXNTcSApO1xyXG5cclxuXHRcdFx0aWYgKCBpc05hTiggdGhpcy5ib3VuZGluZ1NwaGVyZS5yYWRpdXMgKSApIHtcclxuXHJcblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOiBDb21wdXRlZCByYWRpdXMgaXMgTmFOLiBUaGUgXCJwb3NpdGlvblwiIGF0dHJpYnV0ZSBpcyBsaWtlbHkgdG8gaGF2ZSBOYU4gdmFsdWVzLicsIHRoaXMgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2FsY3VsYXRlcyBhbmQgYWRkcyBhIHRhbmdlbnQgYXR0cmlidXRlIHRvIHRoaXMgZ2VvbWV0cnkuXHJcblx0ICpcclxuXHQgKiBUaGUgY29tcHV0YXRpb24gaXMgb25seSBzdXBwb3J0ZWQgZm9yIGluZGV4ZWQgZ2VvbWV0cmllcyBhbmQgaWYgcG9zaXRpb24sIG5vcm1hbCwgYW5kIHV2IGF0dHJpYnV0ZXNcclxuXHQgKiBhcmUgZGVmaW5lZC4gV2hlbiB1c2luZyBhIHRhbmdlbnQgc3BhY2Ugbm9ybWFsIG1hcCwgcHJlZmVyIHRoZSBNaWtrVFNwYWNlIGFsZ29yaXRobSBwcm92aWRlZCBieVxyXG5cdCAqIHtAbGluayBCdWZmZXJHZW9tZXRyeVV0aWxzI2NvbXB1dGVNaWtrVFNwYWNlVGFuZ2VudHN9IGluc3RlYWQuXHJcblx0ICovXHJcblx0Y29tcHV0ZVRhbmdlbnRzKCkge1xyXG5cclxuXHRcdGNvbnN0IGluZGV4ID0gdGhpcy5pbmRleDtcclxuXHRcdGNvbnN0IGF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZXM7XHJcblxyXG5cdFx0Ly8gYmFzZWQgb24gaHR0cDovL3d3dy50ZXJhdGhvbi5jb20vY29kZS90YW5nZW50Lmh0bWxcclxuXHRcdC8vIChwZXIgdmVydGV4IHRhbmdlbnRzKVxyXG5cclxuXHRcdGlmICggaW5kZXggPT09IG51bGwgfHxcclxuXHRcdFx0IGF0dHJpYnV0ZXMucG9zaXRpb24gPT09IHVuZGVmaW5lZCB8fFxyXG5cdFx0XHQgYXR0cmlidXRlcy5ub3JtYWwgPT09IHVuZGVmaW5lZCB8fFxyXG5cdFx0XHQgYXR0cmlidXRlcy51diA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuY29tcHV0ZVRhbmdlbnRzKCkgZmFpbGVkLiBNaXNzaW5nIHJlcXVpcmVkIGF0dHJpYnV0ZXMgKGluZGV4LCBwb3NpdGlvbiwgbm9ybWFsIG9yIHV2KScgKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBwb3NpdGlvbkF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMucG9zaXRpb247XHJcblx0XHRjb25zdCBub3JtYWxBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5vcm1hbDtcclxuXHRcdGNvbnN0IHV2QXR0cmlidXRlID0gYXR0cmlidXRlcy51djtcclxuXHJcblx0XHRpZiAoIHRoaXMuaGFzQXR0cmlidXRlKCAndGFuZ2VudCcgKSA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3RhbmdlbnQnLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBuZXcgRmxvYXQzMkFycmF5KCA0ICogcG9zaXRpb25BdHRyaWJ1dGUuY291bnQgKSwgNCApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHRhbmdlbnRBdHRyaWJ1dGUgPSB0aGlzLmdldEF0dHJpYnV0ZSggJ3RhbmdlbnQnICk7XHJcblxyXG5cdFx0Y29uc3QgdGFuMSA9IFtdLCB0YW4yID0gW107XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgcG9zaXRpb25BdHRyaWJ1dGUuY291bnQ7IGkgKysgKSB7XHJcblxyXG5cdFx0XHR0YW4xWyBpIF0gPSBuZXcgVmVjdG9yMygpO1xyXG5cdFx0XHR0YW4yWyBpIF0gPSBuZXcgVmVjdG9yMygpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCB2QSA9IG5ldyBWZWN0b3IzKCksXHJcblx0XHRcdHZCID0gbmV3IFZlY3RvcjMoKSxcclxuXHRcdFx0dkMgPSBuZXcgVmVjdG9yMygpLFxyXG5cclxuXHRcdFx0dXZBID0gbmV3IFZlY3RvcjIoKSxcclxuXHRcdFx0dXZCID0gbmV3IFZlY3RvcjIoKSxcclxuXHRcdFx0dXZDID0gbmV3IFZlY3RvcjIoKSxcclxuXHJcblx0XHRcdHNkaXIgPSBuZXcgVmVjdG9yMygpLFxyXG5cdFx0XHR0ZGlyID0gbmV3IFZlY3RvcjMoKTtcclxuXHJcblx0XHRmdW5jdGlvbiBoYW5kbGVUcmlhbmdsZSggYSwgYiwgYyApIHtcclxuXHJcblx0XHRcdHZBLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uQXR0cmlidXRlLCBhICk7XHJcblx0XHRcdHZCLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uQXR0cmlidXRlLCBiICk7XHJcblx0XHRcdHZDLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uQXR0cmlidXRlLCBjICk7XHJcblxyXG5cdFx0XHR1dkEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggdXZBdHRyaWJ1dGUsIGEgKTtcclxuXHRcdFx0dXZCLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHV2QXR0cmlidXRlLCBiICk7XHJcblx0XHRcdHV2Qy5mcm9tQnVmZmVyQXR0cmlidXRlKCB1dkF0dHJpYnV0ZSwgYyApO1xyXG5cclxuXHRcdFx0dkIuc3ViKCB2QSApO1xyXG5cdFx0XHR2Qy5zdWIoIHZBICk7XHJcblxyXG5cdFx0XHR1dkIuc3ViKCB1dkEgKTtcclxuXHRcdFx0dXZDLnN1YiggdXZBICk7XHJcblxyXG5cdFx0XHRjb25zdCByID0gMS4wIC8gKCB1dkIueCAqIHV2Qy55IC0gdXZDLnggKiB1dkIueSApO1xyXG5cclxuXHRcdFx0Ly8gc2lsZW50bHkgaWdub3JlIGRlZ2VuZXJhdGUgdXYgdHJpYW5nbGVzIGhhdmluZyBjb2luY2lkZW50IG9yIGNvbGluZWFyIHZlcnRpY2VzXHJcblxyXG5cdFx0XHRpZiAoICEgaXNGaW5pdGUoIHIgKSApIHJldHVybjtcclxuXHJcblx0XHRcdHNkaXIuY29weSggdkIgKS5tdWx0aXBseVNjYWxhciggdXZDLnkgKS5hZGRTY2FsZWRWZWN0b3IoIHZDLCAtIHV2Qi55ICkubXVsdGlwbHlTY2FsYXIoIHIgKTtcclxuXHRcdFx0dGRpci5jb3B5KCB2QyApLm11bHRpcGx5U2NhbGFyKCB1dkIueCApLmFkZFNjYWxlZFZlY3RvciggdkIsIC0gdXZDLnggKS5tdWx0aXBseVNjYWxhciggciApO1xyXG5cclxuXHRcdFx0dGFuMVsgYSBdLmFkZCggc2RpciApO1xyXG5cdFx0XHR0YW4xWyBiIF0uYWRkKCBzZGlyICk7XHJcblx0XHRcdHRhbjFbIGMgXS5hZGQoIHNkaXIgKTtcclxuXHJcblx0XHRcdHRhbjJbIGEgXS5hZGQoIHRkaXIgKTtcclxuXHRcdFx0dGFuMlsgYiBdLmFkZCggdGRpciApO1xyXG5cdFx0XHR0YW4yWyBjIF0uYWRkKCB0ZGlyICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGxldCBncm91cHMgPSB0aGlzLmdyb3VwcztcclxuXHJcblx0XHRpZiAoIGdyb3Vwcy5sZW5ndGggPT09IDAgKSB7XHJcblxyXG5cdFx0XHRncm91cHMgPSBbIHtcclxuXHRcdFx0XHRzdGFydDogMCxcclxuXHRcdFx0XHRjb3VudDogaW5kZXguY291bnRcclxuXHRcdFx0fSBdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gZ3JvdXBzLmxlbmd0aDsgaSA8IGlsOyArKyBpICkge1xyXG5cclxuXHRcdFx0Y29uc3QgZ3JvdXAgPSBncm91cHNbIGkgXTtcclxuXHJcblx0XHRcdGNvbnN0IHN0YXJ0ID0gZ3JvdXAuc3RhcnQ7XHJcblx0XHRcdGNvbnN0IGNvdW50ID0gZ3JvdXAuY291bnQ7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaiA9IHN0YXJ0LCBqbCA9IHN0YXJ0ICsgY291bnQ7IGogPCBqbDsgaiArPSAzICkge1xyXG5cclxuXHRcdFx0XHRoYW5kbGVUcmlhbmdsZShcclxuXHRcdFx0XHRcdGluZGV4LmdldFgoIGogKyAwICksXHJcblx0XHRcdFx0XHRpbmRleC5nZXRYKCBqICsgMSApLFxyXG5cdFx0XHRcdFx0aW5kZXguZ2V0WCggaiArIDIgKVxyXG5cdFx0XHRcdCk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHRtcCA9IG5ldyBWZWN0b3IzKCksIHRtcDIgPSBuZXcgVmVjdG9yMygpO1xyXG5cdFx0Y29uc3QgbiA9IG5ldyBWZWN0b3IzKCksIG4yID0gbmV3IFZlY3RvcjMoKTtcclxuXHJcblx0XHRmdW5jdGlvbiBoYW5kbGVWZXJ0ZXgoIHYgKSB7XHJcblxyXG5cdFx0XHRuLmZyb21CdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbEF0dHJpYnV0ZSwgdiApO1xyXG5cdFx0XHRuMi5jb3B5KCBuICk7XHJcblxyXG5cdFx0XHRjb25zdCB0ID0gdGFuMVsgdiBdO1xyXG5cclxuXHRcdFx0Ly8gR3JhbS1TY2htaWR0IG9ydGhvZ29uYWxpemVcclxuXHJcblx0XHRcdHRtcC5jb3B5KCB0ICk7XHJcblx0XHRcdHRtcC5zdWIoIG4ubXVsdGlwbHlTY2FsYXIoIG4uZG90KCB0ICkgKSApLm5vcm1hbGl6ZSgpO1xyXG5cclxuXHRcdFx0Ly8gQ2FsY3VsYXRlIGhhbmRlZG5lc3NcclxuXHJcblx0XHRcdHRtcDIuY3Jvc3NWZWN0b3JzKCBuMiwgdCApO1xyXG5cdFx0XHRjb25zdCB0ZXN0ID0gdG1wMi5kb3QoIHRhbjJbIHYgXSApO1xyXG5cdFx0XHRjb25zdCB3ID0gKCB0ZXN0IDwgMC4wICkgPyAtIDEuMCA6IDEuMDtcclxuXHJcblx0XHRcdHRhbmdlbnRBdHRyaWJ1dGUuc2V0WFlaVyggdiwgdG1wLngsIHRtcC55LCB0bXAueiwgdyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gZ3JvdXBzLmxlbmd0aDsgaSA8IGlsOyArKyBpICkge1xyXG5cclxuXHRcdFx0Y29uc3QgZ3JvdXAgPSBncm91cHNbIGkgXTtcclxuXHJcblx0XHRcdGNvbnN0IHN0YXJ0ID0gZ3JvdXAuc3RhcnQ7XHJcblx0XHRcdGNvbnN0IGNvdW50ID0gZ3JvdXAuY291bnQ7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaiA9IHN0YXJ0LCBqbCA9IHN0YXJ0ICsgY291bnQ7IGogPCBqbDsgaiArPSAzICkge1xyXG5cclxuXHRcdFx0XHRoYW5kbGVWZXJ0ZXgoIGluZGV4LmdldFgoIGogKyAwICkgKTtcclxuXHRcdFx0XHRoYW5kbGVWZXJ0ZXgoIGluZGV4LmdldFgoIGogKyAxICkgKTtcclxuXHRcdFx0XHRoYW5kbGVWZXJ0ZXgoIGluZGV4LmdldFgoIGogKyAyICkgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgdmVydGV4IG5vcm1hbHMgZm9yIHRoZSBnaXZlbiB2ZXJ0ZXggZGF0YS4gRm9yIGluZGV4ZWQgZ2VvbWV0cmllcywgdGhlIG1ldGhvZCBzZXRzXHJcblx0ICogZWFjaCB2ZXJ0ZXggbm9ybWFsIHRvIGJlIHRoZSBhdmVyYWdlIG9mIHRoZSBmYWNlIG5vcm1hbHMgb2YgdGhlIGZhY2VzIHRoYXQgc2hhcmUgdGhhdCB2ZXJ0ZXguXHJcblx0ICogRm9yIG5vbi1pbmRleGVkIGdlb21ldHJpZXMsIHZlcnRpY2VzIGFyZSBub3Qgc2hhcmVkLCBhbmQgdGhlIG1ldGhvZCBzZXRzIGVhY2ggdmVydGV4IG5vcm1hbFxyXG5cdCAqIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBmYWNlIG5vcm1hbC5cclxuXHQgKi9cclxuXHRjb21wdXRlVmVydGV4Tm9ybWFscygpIHtcclxuXHJcblx0XHRjb25zdCBpbmRleCA9IHRoaXMuaW5kZXg7XHJcblx0XHRjb25zdCBwb3NpdGlvbkF0dHJpYnV0ZSA9IHRoaXMuZ2V0QXR0cmlidXRlKCAncG9zaXRpb24nICk7XHJcblxyXG5cdFx0aWYgKCBwb3NpdGlvbkF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0bGV0IG5vcm1hbEF0dHJpYnV0ZSA9IHRoaXMuZ2V0QXR0cmlidXRlKCAnbm9ybWFsJyApO1xyXG5cclxuXHRcdFx0aWYgKCBub3JtYWxBdHRyaWJ1dGUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0bm9ybWFsQXR0cmlidXRlID0gbmV3IEJ1ZmZlckF0dHJpYnV0ZSggbmV3IEZsb2F0MzJBcnJheSggcG9zaXRpb25BdHRyaWJ1dGUuY291bnQgKiAzICksIDMgKTtcclxuXHRcdFx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5vcm1hbEF0dHJpYnV0ZSApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0Ly8gcmVzZXQgZXhpc3Rpbmcgbm9ybWFscyB0byB6ZXJvXHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBub3JtYWxBdHRyaWJ1dGUuY291bnQ7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRub3JtYWxBdHRyaWJ1dGUuc2V0WFlaKCBpLCAwLCAwLCAwICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IHBBID0gbmV3IFZlY3RvcjMoKSwgcEIgPSBuZXcgVmVjdG9yMygpLCBwQyA9IG5ldyBWZWN0b3IzKCk7XHJcblx0XHRcdGNvbnN0IG5BID0gbmV3IFZlY3RvcjMoKSwgbkIgPSBuZXcgVmVjdG9yMygpLCBuQyA9IG5ldyBWZWN0b3IzKCk7XHJcblx0XHRcdGNvbnN0IGNiID0gbmV3IFZlY3RvcjMoKSwgYWIgPSBuZXcgVmVjdG9yMygpO1xyXG5cclxuXHRcdFx0Ly8gaW5kZXhlZCBlbGVtZW50c1xyXG5cclxuXHRcdFx0aWYgKCBpbmRleCApIHtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IGluZGV4LmNvdW50OyBpIDwgaWw7IGkgKz0gMyApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCB2QSA9IGluZGV4LmdldFgoIGkgKyAwICk7XHJcblx0XHRcdFx0XHRjb25zdCB2QiA9IGluZGV4LmdldFgoIGkgKyAxICk7XHJcblx0XHRcdFx0XHRjb25zdCB2QyA9IGluZGV4LmdldFgoIGkgKyAyICk7XHJcblxyXG5cdFx0XHRcdFx0cEEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyaWJ1dGUsIHZBICk7XHJcblx0XHRcdFx0XHRwQi5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbkF0dHJpYnV0ZSwgdkIgKTtcclxuXHRcdFx0XHRcdHBDLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uQXR0cmlidXRlLCB2QyApO1xyXG5cclxuXHRcdFx0XHRcdGNiLnN1YlZlY3RvcnMoIHBDLCBwQiApO1xyXG5cdFx0XHRcdFx0YWIuc3ViVmVjdG9ycyggcEEsIHBCICk7XHJcblx0XHRcdFx0XHRjYi5jcm9zcyggYWIgKTtcclxuXHJcblx0XHRcdFx0XHRuQS5mcm9tQnVmZmVyQXR0cmlidXRlKCBub3JtYWxBdHRyaWJ1dGUsIHZBICk7XHJcblx0XHRcdFx0XHRuQi5mcm9tQnVmZmVyQXR0cmlidXRlKCBub3JtYWxBdHRyaWJ1dGUsIHZCICk7XHJcblx0XHRcdFx0XHRuQy5mcm9tQnVmZmVyQXR0cmlidXRlKCBub3JtYWxBdHRyaWJ1dGUsIHZDICk7XHJcblxyXG5cdFx0XHRcdFx0bkEuYWRkKCBjYiApO1xyXG5cdFx0XHRcdFx0bkIuYWRkKCBjYiApO1xyXG5cdFx0XHRcdFx0bkMuYWRkKCBjYiApO1xyXG5cclxuXHRcdFx0XHRcdG5vcm1hbEF0dHJpYnV0ZS5zZXRYWVooIHZBLCBuQS54LCBuQS55LCBuQS56ICk7XHJcblx0XHRcdFx0XHRub3JtYWxBdHRyaWJ1dGUuc2V0WFlaKCB2QiwgbkIueCwgbkIueSwgbkIueiApO1xyXG5cdFx0XHRcdFx0bm9ybWFsQXR0cmlidXRlLnNldFhZWiggdkMsIG5DLngsIG5DLnksIG5DLnogKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0Ly8gbm9uLWluZGV4ZWQgZWxlbWVudHMgKHVuY29ubmVjdGVkIHRyaWFuZ2xlIHNvdXApXHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBwb3NpdGlvbkF0dHJpYnV0ZS5jb3VudDsgaSA8IGlsOyBpICs9IDMgKSB7XHJcblxyXG5cdFx0XHRcdFx0cEEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyaWJ1dGUsIGkgKyAwICk7XHJcblx0XHRcdFx0XHRwQi5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbkF0dHJpYnV0ZSwgaSArIDEgKTtcclxuXHRcdFx0XHRcdHBDLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uQXR0cmlidXRlLCBpICsgMiApO1xyXG5cclxuXHRcdFx0XHRcdGNiLnN1YlZlY3RvcnMoIHBDLCBwQiApO1xyXG5cdFx0XHRcdFx0YWIuc3ViVmVjdG9ycyggcEEsIHBCICk7XHJcblx0XHRcdFx0XHRjYi5jcm9zcyggYWIgKTtcclxuXHJcblx0XHRcdFx0XHRub3JtYWxBdHRyaWJ1dGUuc2V0WFlaKCBpICsgMCwgY2IueCwgY2IueSwgY2IueiApO1xyXG5cdFx0XHRcdFx0bm9ybWFsQXR0cmlidXRlLnNldFhZWiggaSArIDEsIGNiLngsIGNiLnksIGNiLnogKTtcclxuXHRcdFx0XHRcdG5vcm1hbEF0dHJpYnV0ZS5zZXRYWVooIGkgKyAyLCBjYi54LCBjYi55LCBjYi56ICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMubm9ybWFsaXplTm9ybWFscygpO1xyXG5cclxuXHRcdFx0bm9ybWFsQXR0cmlidXRlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRW5zdXJlcyBldmVyeSBub3JtYWwgdmVjdG9yIGluIGEgZ2VvbWV0cnkgd2lsbCBoYXZlIGEgbWFnbml0dWRlIG9mIGAxYC4gVGhpcyB3aWxsXHJcblx0ICogY29ycmVjdCBsaWdodGluZyBvbiB0aGUgZ2VvbWV0cnkgc3VyZmFjZXMuXHJcblx0ICovXHJcblx0bm9ybWFsaXplTm9ybWFscygpIHtcclxuXHJcblx0XHRjb25zdCBub3JtYWxzID0gdGhpcy5hdHRyaWJ1dGVzLm5vcm1hbDtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gbm9ybWFscy5jb3VudDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdFx0X3ZlY3Rvci5mcm9tQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCBpICk7XHJcblxyXG5cdFx0XHRfdmVjdG9yLm5vcm1hbGl6ZSgpO1xyXG5cclxuXHRcdFx0bm9ybWFscy5zZXRYWVooIGksIF92ZWN0b3IueCwgX3ZlY3Rvci55LCBfdmVjdG9yLnogKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJuIGEgbmV3IG5vbi1pbmRleCB2ZXJzaW9uIG9mIHRoaXMgaW5kZXhlZCBnZW9tZXRyeS4gSWYgdGhlIGdlb21ldHJ5XHJcblx0ICogaXMgYWxyZWFkeSBub24taW5kZXhlZCwgdGhlIG1ldGhvZCBpcyBhIE5PT1AuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtCdWZmZXJHZW9tZXRyeX0gVGhlIG5vbi1pbmRleGVkIHZlcnNpb24gb2YgdGhpcyBpbmRleGVkIGdlb21ldHJ5LlxyXG5cdCAqL1xyXG5cdHRvTm9uSW5kZXhlZCgpIHtcclxuXHJcblx0XHRmdW5jdGlvbiBjb252ZXJ0QnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGluZGljZXMgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBhcnJheSA9IGF0dHJpYnV0ZS5hcnJheTtcclxuXHRcdFx0Y29uc3QgaXRlbVNpemUgPSBhdHRyaWJ1dGUuaXRlbVNpemU7XHJcblx0XHRcdGNvbnN0IG5vcm1hbGl6ZWQgPSBhdHRyaWJ1dGUubm9ybWFsaXplZDtcclxuXHJcblx0XHRcdGNvbnN0IGFycmF5MiA9IG5ldyBhcnJheS5jb25zdHJ1Y3RvciggaW5kaWNlcy5sZW5ndGggKiBpdGVtU2l6ZSApO1xyXG5cclxuXHRcdFx0bGV0IGluZGV4ID0gMCwgaW5kZXgyID0gMDtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGluZGljZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBhdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApIHtcclxuXHJcblx0XHRcdFx0XHRpbmRleCA9IGluZGljZXNbIGkgXSAqIGF0dHJpYnV0ZS5kYXRhLnN0cmlkZSArIGF0dHJpYnV0ZS5vZmZzZXQ7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0aW5kZXggPSBpbmRpY2VzWyBpIF0gKiBpdGVtU2l6ZTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaiA9IDA7IGogPCBpdGVtU2l6ZTsgaiArKyApIHtcclxuXHJcblx0XHRcdFx0XHRhcnJheTJbIGluZGV4MiArKyBdID0gYXJyYXlbIGluZGV4ICsrIF07XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBuZXcgQnVmZmVyQXR0cmlidXRlKCBhcnJheTIsIGl0ZW1TaXplLCBub3JtYWxpemVkICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0aWYgKCB0aGlzLmluZGV4ID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnkudG9Ob25JbmRleGVkKCk6IEJ1ZmZlckdlb21ldHJ5IGlzIGFscmVhZHkgbm9uLWluZGV4ZWQuJyApO1xyXG5cdFx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnkyID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XHJcblxyXG5cdFx0Y29uc3QgaW5kaWNlcyA9IHRoaXMuaW5kZXguYXJyYXk7XHJcblx0XHRjb25zdCBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzO1xyXG5cclxuXHRcdC8vIGF0dHJpYnV0ZXNcclxuXHJcblx0XHRmb3IgKCBjb25zdCBuYW1lIGluIGF0dHJpYnV0ZXMgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzWyBuYW1lIF07XHJcblxyXG5cdFx0XHRjb25zdCBuZXdBdHRyaWJ1dGUgPSBjb252ZXJ0QnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGluZGljZXMgKTtcclxuXHJcblx0XHRcdGdlb21ldHJ5Mi5zZXRBdHRyaWJ1dGUoIG5hbWUsIG5ld0F0dHJpYnV0ZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBtb3JwaCBhdHRyaWJ1dGVzXHJcblxyXG5cdFx0Y29uc3QgbW9ycGhBdHRyaWJ1dGVzID0gdGhpcy5tb3JwaEF0dHJpYnV0ZXM7XHJcblxyXG5cdFx0Zm9yICggY29uc3QgbmFtZSBpbiBtb3JwaEF0dHJpYnV0ZXMgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBtb3JwaEFycmF5ID0gW107XHJcblx0XHRcdGNvbnN0IG1vcnBoQXR0cmlidXRlID0gbW9ycGhBdHRyaWJ1dGVzWyBuYW1lIF07IC8vIG1vcnBoQXR0cmlidXRlOiBhcnJheSBvZiBGbG9hdDMyQnVmZmVyQXR0cmlidXRlc1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IG1vcnBoQXR0cmlidXRlLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBhdHRyaWJ1dGUgPSBtb3JwaEF0dHJpYnV0ZVsgaSBdO1xyXG5cclxuXHRcdFx0XHRjb25zdCBuZXdBdHRyaWJ1dGUgPSBjb252ZXJ0QnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGluZGljZXMgKTtcclxuXHJcblx0XHRcdFx0bW9ycGhBcnJheS5wdXNoKCBuZXdBdHRyaWJ1dGUgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGdlb21ldHJ5Mi5tb3JwaEF0dHJpYnV0ZXNbIG5hbWUgXSA9IG1vcnBoQXJyYXk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGdlb21ldHJ5Mi5tb3JwaFRhcmdldHNSZWxhdGl2ZSA9IHRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU7XHJcblxyXG5cdFx0Ly8gZ3JvdXBzXHJcblxyXG5cdFx0Y29uc3QgZ3JvdXBzID0gdGhpcy5ncm91cHM7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gZ3JvdXBzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBncm91cCA9IGdyb3Vwc1sgaSBdO1xyXG5cdFx0XHRnZW9tZXRyeTIuYWRkR3JvdXAoIGdyb3VwLnN0YXJ0LCBncm91cC5jb3VudCwgZ3JvdXAubWF0ZXJpYWxJbmRleCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZ2VvbWV0cnkyO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNlcmlhbGl6ZXMgdGhlIGdlb21ldHJ5IGludG8gSlNPTi5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge09iamVjdH0gQSBKU09OIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNlcmlhbGl6ZWQgZ2VvbWV0cnkuXHJcblx0ICovXHJcblx0dG9KU09OKCkge1xyXG5cclxuXHRcdGNvbnN0IGRhdGEgPSB7XHJcblx0XHRcdG1ldGFkYXRhOiB7XHJcblx0XHRcdFx0dmVyc2lvbjogNC42LFxyXG5cdFx0XHRcdHR5cGU6ICdCdWZmZXJHZW9tZXRyeScsXHJcblx0XHRcdFx0Z2VuZXJhdG9yOiAnQnVmZmVyR2VvbWV0cnkudG9KU09OJ1xyXG5cdFx0XHR9XHJcblx0XHR9O1xyXG5cclxuXHRcdC8vIHN0YW5kYXJkIEJ1ZmZlckdlb21ldHJ5IHNlcmlhbGl6YXRpb25cclxuXHJcblx0XHRkYXRhLnV1aWQgPSB0aGlzLnV1aWQ7XHJcblx0XHRkYXRhLnR5cGUgPSB0aGlzLnR5cGU7XHJcblx0XHRpZiAoIHRoaXMubmFtZSAhPT0gJycgKSBkYXRhLm5hbWUgPSB0aGlzLm5hbWU7XHJcblx0XHRpZiAoIE9iamVjdC5rZXlzKCB0aGlzLnVzZXJEYXRhICkubGVuZ3RoID4gMCApIGRhdGEudXNlckRhdGEgPSB0aGlzLnVzZXJEYXRhO1xyXG5cclxuXHRcdGlmICggdGhpcy5wYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBwYXJhbWV0ZXJzID0gdGhpcy5wYXJhbWV0ZXJzO1xyXG5cclxuXHRcdFx0Zm9yICggY29uc3Qga2V5IGluIHBhcmFtZXRlcnMgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggcGFyYW1ldGVyc1sga2V5IF0gIT09IHVuZGVmaW5lZCApIGRhdGFbIGtleSBdID0gcGFyYW1ldGVyc1sga2V5IF07XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gZGF0YTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gZm9yIHNpbXBsaWNpdHkgdGhlIGNvZGUgYXNzdW1lcyBhdHRyaWJ1dGVzIGFyZSBub3Qgc2hhcmVkIGFjcm9zcyBnZW9tZXRyaWVzLCBzZWUgIzE1ODExXHJcblxyXG5cdFx0ZGF0YS5kYXRhID0geyBhdHRyaWJ1dGVzOiB7fSB9O1xyXG5cclxuXHRcdGNvbnN0IGluZGV4ID0gdGhpcy5pbmRleDtcclxuXHJcblx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0ZGF0YS5kYXRhLmluZGV4ID0ge1xyXG5cdFx0XHRcdHR5cGU6IGluZGV4LmFycmF5LmNvbnN0cnVjdG9yLm5hbWUsXHJcblx0XHRcdFx0YXJyYXk6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBpbmRleC5hcnJheSApXHJcblx0XHRcdH07XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZXM7XHJcblxyXG5cdFx0Zm9yICggY29uc3Qga2V5IGluIGF0dHJpYnV0ZXMgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzWyBrZXkgXTtcclxuXHJcblx0XHRcdGRhdGEuZGF0YS5hdHRyaWJ1dGVzWyBrZXkgXSA9IGF0dHJpYnV0ZS50b0pTT04oIGRhdGEuZGF0YSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBtb3JwaEF0dHJpYnV0ZXMgPSB7fTtcclxuXHRcdGxldCBoYXNNb3JwaEF0dHJpYnV0ZXMgPSBmYWxzZTtcclxuXHJcblx0XHRmb3IgKCBjb25zdCBrZXkgaW4gdGhpcy5tb3JwaEF0dHJpYnV0ZXMgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBhdHRyaWJ1dGVBcnJheSA9IHRoaXMubW9ycGhBdHRyaWJ1dGVzWyBrZXkgXTtcclxuXHJcblx0XHRcdGNvbnN0IGFycmF5ID0gW107XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gYXR0cmlidXRlQXJyYXkubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZUFycmF5WyBpIF07XHJcblxyXG5cdFx0XHRcdGFycmF5LnB1c2goIGF0dHJpYnV0ZS50b0pTT04oIGRhdGEuZGF0YSApICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIGFycmF5Lmxlbmd0aCA+IDAgKSB7XHJcblxyXG5cdFx0XHRcdG1vcnBoQXR0cmlidXRlc1sga2V5IF0gPSBhcnJheTtcclxuXHJcblx0XHRcdFx0aGFzTW9ycGhBdHRyaWJ1dGVzID0gdHJ1ZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBoYXNNb3JwaEF0dHJpYnV0ZXMgKSB7XHJcblxyXG5cdFx0XHRkYXRhLmRhdGEubW9ycGhBdHRyaWJ1dGVzID0gbW9ycGhBdHRyaWJ1dGVzO1xyXG5cdFx0XHRkYXRhLmRhdGEubW9ycGhUYXJnZXRzUmVsYXRpdmUgPSB0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBncm91cHMgPSB0aGlzLmdyb3VwcztcclxuXHJcblx0XHRpZiAoIGdyb3Vwcy5sZW5ndGggPiAwICkge1xyXG5cclxuXHRcdFx0ZGF0YS5kYXRhLmdyb3VwcyA9IEpTT04ucGFyc2UoIEpTT04uc3RyaW5naWZ5KCBncm91cHMgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBib3VuZGluZ1NwaGVyZSA9IHRoaXMuYm91bmRpbmdTcGhlcmU7XHJcblxyXG5cdFx0aWYgKCBib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGRhdGEuZGF0YS5ib3VuZGluZ1NwaGVyZSA9IHtcclxuXHRcdFx0XHRjZW50ZXI6IGJvdW5kaW5nU3BoZXJlLmNlbnRlci50b0FycmF5KCksXHJcblx0XHRcdFx0cmFkaXVzOiBib3VuZGluZ1NwaGVyZS5yYWRpdXNcclxuXHRcdFx0fTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGRhdGE7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIG5ldyBnZW9tZXRyeSB3aXRoIGNvcGllZCB2YWx1ZXMgZnJvbSB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7QnVmZmVyR2VvbWV0cnl9IEEgY2xvbmUgb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjbG9uZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29waWVzIHRoZSB2YWx1ZXMgb2YgdGhlIGdpdmVuIGdlb21ldHJ5IHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0J1ZmZlckdlb21ldHJ5fSBzb3VyY2UgLSBUaGUgZ2VvbWV0cnkgdG8gY29weS5cclxuXHQgKiBAcmV0dXJuIHtCdWZmZXJHZW9tZXRyeX0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0Ly8gcmVzZXRcclxuXHJcblx0XHR0aGlzLmluZGV4ID0gbnVsbDtcclxuXHRcdHRoaXMuYXR0cmlidXRlcyA9IHt9O1xyXG5cdFx0dGhpcy5tb3JwaEF0dHJpYnV0ZXMgPSB7fTtcclxuXHRcdHRoaXMuZ3JvdXBzID0gW107XHJcblx0XHR0aGlzLmJvdW5kaW5nQm94ID0gbnVsbDtcclxuXHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBudWxsO1xyXG5cclxuXHRcdC8vIHVzZWQgZm9yIHN0b3JpbmcgY2xvbmVkLCBzaGFyZWQgZGF0YVxyXG5cclxuXHRcdGNvbnN0IGRhdGEgPSB7fTtcclxuXHJcblx0XHQvLyBuYW1lXHJcblxyXG5cdFx0dGhpcy5uYW1lID0gc291cmNlLm5hbWU7XHJcblxyXG5cdFx0Ly8gaW5kZXhcclxuXHJcblx0XHRjb25zdCBpbmRleCA9IHNvdXJjZS5pbmRleDtcclxuXHJcblx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5zZXRJbmRleCggaW5kZXguY2xvbmUoKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBhdHRyaWJ1dGVzXHJcblxyXG5cdFx0Y29uc3QgYXR0cmlidXRlcyA9IHNvdXJjZS5hdHRyaWJ1dGVzO1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IG5hbWUgaW4gYXR0cmlidXRlcyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbIG5hbWUgXTtcclxuXHRcdFx0dGhpcy5zZXRBdHRyaWJ1dGUoIG5hbWUsIGF0dHJpYnV0ZS5jbG9uZSggZGF0YSApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIG1vcnBoIGF0dHJpYnV0ZXNcclxuXHJcblx0XHRjb25zdCBtb3JwaEF0dHJpYnV0ZXMgPSBzb3VyY2UubW9ycGhBdHRyaWJ1dGVzO1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IG5hbWUgaW4gbW9ycGhBdHRyaWJ1dGVzICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYXJyYXkgPSBbXTtcclxuXHRcdFx0Y29uc3QgbW9ycGhBdHRyaWJ1dGUgPSBtb3JwaEF0dHJpYnV0ZXNbIG5hbWUgXTsgLy8gbW9ycGhBdHRyaWJ1dGU6IGFycmF5IG9mIEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGVzXHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBtb3JwaEF0dHJpYnV0ZS5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRhcnJheS5wdXNoKCBtb3JwaEF0dHJpYnV0ZVsgaSBdLmNsb25lKCBkYXRhICkgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMubW9ycGhBdHRyaWJ1dGVzWyBuYW1lIF0gPSBhcnJheTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZSA9IHNvdXJjZS5tb3JwaFRhcmdldHNSZWxhdGl2ZTtcclxuXHJcblx0XHQvLyBncm91cHNcclxuXHJcblx0XHRjb25zdCBncm91cHMgPSBzb3VyY2UuZ3JvdXBzO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGdyb3Vwcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgZ3JvdXAgPSBncm91cHNbIGkgXTtcclxuXHRcdFx0dGhpcy5hZGRHcm91cCggZ3JvdXAuc3RhcnQsIGdyb3VwLmNvdW50LCBncm91cC5tYXRlcmlhbEluZGV4ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGJvdW5kaW5nIGJveFxyXG5cclxuXHRcdGNvbnN0IGJvdW5kaW5nQm94ID0gc291cmNlLmJvdW5kaW5nQm94O1xyXG5cclxuXHRcdGlmICggYm91bmRpbmdCb3ggIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmJvdW5kaW5nQm94ID0gYm91bmRpbmdCb3guY2xvbmUoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gYm91bmRpbmcgc3BoZXJlXHJcblxyXG5cdFx0Y29uc3QgYm91bmRpbmdTcGhlcmUgPSBzb3VyY2UuYm91bmRpbmdTcGhlcmU7XHJcblxyXG5cdFx0aWYgKCBib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBib3VuZGluZ1NwaGVyZS5jbG9uZSgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBkcmF3IHJhbmdlXHJcblxyXG5cdFx0dGhpcy5kcmF3UmFuZ2Uuc3RhcnQgPSBzb3VyY2UuZHJhd1JhbmdlLnN0YXJ0O1xyXG5cdFx0dGhpcy5kcmF3UmFuZ2UuY291bnQgPSBzb3VyY2UuZHJhd1JhbmdlLmNvdW50O1xyXG5cclxuXHRcdC8vIHVzZXIgZGF0YVxyXG5cclxuXHRcdHRoaXMudXNlckRhdGEgPSBzb3VyY2UudXNlckRhdGE7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRnJlZXMgdGhlIEdQVS1yZWxhdGVkIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhpcyBpbnN0YW5jZS4gQ2FsbCB0aGlzXHJcblx0ICogbWV0aG9kIHdoZW5ldmVyIHRoaXMgaW5zdGFuY2UgaXMgbm8gbG9uZ2VyIHVzZWQgaW4geW91ciBhcHAuXHJcblx0ICpcclxuXHQgKiBAZmlyZXMgQnVmZmVyR2VvbWV0cnkjZGlzcG9zZVxyXG5cdCAqL1xyXG5cdGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdkaXNwb3NlJyB9ICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH07XHJcbiIsImltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IyLmpzJztcclxuaW1wb3J0IHsgU3BoZXJlIH0gZnJvbSAnLi4vbWF0aC9TcGhlcmUuanMnO1xyXG5pbXBvcnQgeyBSYXkgfSBmcm9tICcuLi9tYXRoL1JheS5qcyc7XHJcbmltcG9ydCB7IE1hdHJpeDQgfSBmcm9tICcuLi9tYXRoL01hdHJpeDQuanMnO1xyXG5pbXBvcnQgeyBPYmplY3QzRCB9IGZyb20gJy4uL2NvcmUvT2JqZWN0M0QuanMnO1xyXG5pbXBvcnQgeyBUcmlhbmdsZSB9IGZyb20gJy4uL21hdGgvVHJpYW5nbGUuanMnO1xyXG5pbXBvcnQgeyBCYWNrU2lkZSwgRnJvbnRTaWRlIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgTWVzaEJhc2ljTWF0ZXJpYWwgfSBmcm9tICcuLi9tYXRlcmlhbHMvTWVzaEJhc2ljTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyBCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyR2VvbWV0cnkuanMnO1xyXG5cclxuY29uc3QgX2ludmVyc2VNYXRyaXggPSAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXg0KCk7XHJcbmNvbnN0IF9yYXkgPSAvKkBfX1BVUkVfXyovIG5ldyBSYXkoKTtcclxuY29uc3QgX3NwaGVyZSA9IC8qQF9fUFVSRV9fKi8gbmV3IFNwaGVyZSgpO1xyXG5jb25zdCBfc3BoZXJlSGl0QXQgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcblxyXG5jb25zdCBfdkEgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF92QiA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX3ZDID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5cclxuY29uc3QgX3RlbXBBID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfbW9ycGhBID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5cclxuY29uc3QgX2ludGVyc2VjdGlvblBvaW50ID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfaW50ZXJzZWN0aW9uUG9pbnRXb3JsZCA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuXHJcbi8qKlxyXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgdHJpYW5ndWxhciBwb2x5Z29uIG1lc2ggYmFzZWQgb2JqZWN0cy5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgZ2VvbWV0cnkgPSBuZXcgVEhSRUUuQm94R2VvbWV0cnkoIDEsIDEsIDEgKTtcclxuICogY29uc3QgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IDB4ZmZmZjAwIH0gKTtcclxuICogY29uc3QgbWVzaCA9IG5ldyBUSFJFRS5NZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuICogc2NlbmUuYWRkKCBtZXNoICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgT2JqZWN0M0RcclxuICovXHJcbmNsYXNzIE1lc2ggZXh0ZW5kcyBPYmplY3QzRCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbWVzaC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyR2VvbWV0cnl9IFtnZW9tZXRyeV0gLSBUaGUgbWVzaCBnZW9tZXRyeS5cclxuXHQgKiBAcGFyYW0ge01hdGVyaWFsfEFycmF5PE1hdGVyaWFsPn0gW21hdGVyaWFsXSAtIFRoZSBtZXNoIG1hdGVyaWFsLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpLCBtYXRlcmlhbCA9IG5ldyBNZXNoQmFzaWNNYXRlcmlhbCgpICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzTWVzaCA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ01lc2gnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG1lc2ggZ2VvbWV0cnkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0J1ZmZlckdlb21ldHJ5fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdlb21ldHJ5ID0gZ2VvbWV0cnk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbWVzaCBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7TWF0ZXJpYWx8QXJyYXk8TWF0ZXJpYWw+fVxyXG5cdFx0ICogQGRlZmF1bHQgTWVzaEJhc2ljTWF0ZXJpYWxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tYXRlcmlhbCA9IG1hdGVyaWFsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBkaWN0aW9uYXJ5IHJlcHJlc2VudGluZyB0aGUgbW9ycGggdGFyZ2V0cyBpbiB0aGUgZ2VvbWV0cnkuIFRoZSBrZXkgaXMgdGhlXHJcblx0XHQgKiBtb3JwaCB0YXJnZXRzIG5hbWUsIHRoZSB2YWx1ZSBpdHMgYXR0cmlidXRlIGluZGV4LiBUaGlzIG1lbWJlciBpcyBgdW5kZWZpbmVkYFxyXG5cdFx0ICogYnkgZGVmYXVsdCBhbmQgb25seSBzZXQgd2hlbiBtb3JwaCB0YXJnZXRzIGFyZSBkZXRlY3RlZCBpbiB0aGUgZ2VvbWV0cnkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdDxTdHJpbmcsbnVtYmVyPnx1bmRlZmluZWR9XHJcblx0XHQgKiBAZGVmYXVsdCB1bmRlZmluZWRcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnkgPSB1bmRlZmluZWQ7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBhcnJheSBvZiB3ZWlnaHRzIHR5cGljYWxseSBpbiB0aGUgcmFuZ2UgYFswLDFdYCB0aGF0IHNwZWNpZnkgaG93IG11Y2ggb2YgdGhlIG1vcnBoXHJcblx0XHQgKiBpcyBhcHBsaWVkLiBUaGlzIG1lbWJlciBpcyBgdW5kZWZpbmVkYCBieSBkZWZhdWx0IGFuZCBvbmx5IHNldCB3aGVuIG1vcnBoIHRhcmdldHMgYXJlXHJcblx0XHQgKiBkZXRlY3RlZCBpbiB0aGUgZ2VvbWV0cnkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PG51bWJlcj58dW5kZWZpbmVkfVxyXG5cdFx0ICogQGRlZmF1bHQgdW5kZWZpbmVkXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzID0gdW5kZWZpbmVkO1xyXG5cclxuXHRcdHRoaXMudXBkYXRlTW9ycGhUYXJnZXRzKCk7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlLCByZWN1cnNpdmUgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlLCByZWN1cnNpdmUgKTtcclxuXHJcblx0XHRpZiAoIHNvdXJjZS5tb3JwaFRhcmdldEluZmx1ZW5jZXMgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzID0gc291cmNlLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5zbGljZSgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHNvdXJjZS5tb3JwaFRhcmdldERpY3Rpb25hcnkgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5ID0gT2JqZWN0LmFzc2lnbigge30sIHNvdXJjZS5tb3JwaFRhcmdldERpY3Rpb25hcnkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5tYXRlcmlhbCA9IEFycmF5LmlzQXJyYXkoIHNvdXJjZS5tYXRlcmlhbCApID8gc291cmNlLm1hdGVyaWFsLnNsaWNlKCkgOiBzb3VyY2UubWF0ZXJpYWw7XHJcblx0XHR0aGlzLmdlb21ldHJ5ID0gc291cmNlLmdlb21ldHJ5O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHZhbHVlcyBvZiB7QGxpbmsgTWVzaCNtb3JwaFRhcmdldERpY3Rpb25hcnl9IGFuZCB7QGxpbmsgTWVzaCNtb3JwaFRhcmdldEluZmx1ZW5jZXN9XHJcblx0ICogdG8gbWFrZSBzdXJlIGV4aXN0aW5nIG1vcnBoIHRhcmdldHMgY2FuIGluZmx1ZW5jZSB0aGlzIDNEIG9iamVjdC5cclxuXHQgKi9cclxuXHR1cGRhdGVNb3JwaFRhcmdldHMoKSB7XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xyXG5cclxuXHRcdGNvbnN0IG1vcnBoQXR0cmlidXRlcyA9IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcztcclxuXHRcdGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyggbW9ycGhBdHRyaWJ1dGVzICk7XHJcblxyXG5cdFx0aWYgKCBrZXlzLmxlbmd0aCA+IDAgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBtb3JwaEF0dHJpYnV0ZSA9IG1vcnBoQXR0cmlidXRlc1sga2V5c1sgMCBdIF07XHJcblxyXG5cdFx0XHRpZiAoIG1vcnBoQXR0cmlidXRlICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzID0gW107XHJcblx0XHRcdFx0dGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnkgPSB7fTtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IG0gPSAwLCBtbCA9IG1vcnBoQXR0cmlidXRlLmxlbmd0aDsgbSA8IG1sOyBtICsrICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IG5hbWUgPSBtb3JwaEF0dHJpYnV0ZVsgbSBdLm5hbWUgfHwgU3RyaW5nKCBtICk7XHJcblxyXG5cdFx0XHRcdFx0dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMucHVzaCggMCApO1xyXG5cdFx0XHRcdFx0dGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnlbIG5hbWUgXSA9IG07XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgbG9jYWwtc3BhY2UgcG9zaXRpb24gb2YgdGhlIHZlcnRleCBhdCB0aGUgZ2l2ZW4gaW5kZXgsIHRha2luZyBpbnRvXHJcblx0ICogYWNjb3VudCB0aGUgY3VycmVudCBhbmltYXRpb24gc3RhdGUgb2YgYm90aCBtb3JwaCB0YXJnZXRzIGFuZCBza2lubmluZy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSB2ZXJ0ZXggaW5kZXguXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IG9iamVjdCB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGhvZCdzIHJlc3VsdC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBUaGUgdmVydGV4IHBvc2l0aW9uIGluIGxvY2FsIHNwYWNlLlxyXG5cdCAqL1xyXG5cdGdldFZlcnRleFBvc2l0aW9uKCBpbmRleCwgdGFyZ2V0ICkge1xyXG5cclxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcclxuXHRcdGNvbnN0IHBvc2l0aW9uID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjtcclxuXHRcdGNvbnN0IG1vcnBoUG9zaXRpb24gPSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb247XHJcblx0XHRjb25zdCBtb3JwaFRhcmdldHNSZWxhdGl2ZSA9IGdlb21ldHJ5Lm1vcnBoVGFyZ2V0c1JlbGF0aXZlO1xyXG5cclxuXHRcdHRhcmdldC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgaW5kZXggKTtcclxuXHJcblx0XHRjb25zdCBtb3JwaEluZmx1ZW5jZXMgPSB0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcztcclxuXHJcblx0XHRpZiAoIG1vcnBoUG9zaXRpb24gJiYgbW9ycGhJbmZsdWVuY2VzICkge1xyXG5cclxuXHRcdFx0X21vcnBoQS5zZXQoIDAsIDAsIDAgKTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBtb3JwaFBvc2l0aW9uLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBpbmZsdWVuY2UgPSBtb3JwaEluZmx1ZW5jZXNbIGkgXTtcclxuXHRcdFx0XHRjb25zdCBtb3JwaEF0dHJpYnV0ZSA9IG1vcnBoUG9zaXRpb25bIGkgXTtcclxuXHJcblx0XHRcdFx0aWYgKCBpbmZsdWVuY2UgPT09IDAgKSBjb250aW51ZTtcclxuXHJcblx0XHRcdFx0X3RlbXBBLmZyb21CdWZmZXJBdHRyaWJ1dGUoIG1vcnBoQXR0cmlidXRlLCBpbmRleCApO1xyXG5cclxuXHRcdFx0XHRpZiAoIG1vcnBoVGFyZ2V0c1JlbGF0aXZlICkge1xyXG5cclxuXHRcdFx0XHRcdF9tb3JwaEEuYWRkU2NhbGVkVmVjdG9yKCBfdGVtcEEsIGluZmx1ZW5jZSApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdF9tb3JwaEEuYWRkU2NhbGVkVmVjdG9yKCBfdGVtcEEuc3ViKCB0YXJnZXQgKSwgaW5mbHVlbmNlICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRhcmdldC5hZGQoIF9tb3JwaEEgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRhcmdldDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyBpbnRlcnNlY3Rpb24gcG9pbnRzIGJldHdlZW4gYSBjYXN0ZWQgcmF5IGFuZCB0aGlzIGxpbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JheWNhc3Rlcn0gcmF5Y2FzdGVyIC0gVGhlIHJheWNhc3Rlci5cclxuXHQgKiBAcGFyYW0ge0FycmF5PE9iamVjdD59IGludGVyc2VjdHMgLSBUaGUgdGFyZ2V0IGFycmF5IHRoYXQgaG9sZHMgdGhlIGludGVyc2VjdGlvbiBwb2ludHMuXHJcblx0ICovXHJcblx0cmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICkge1xyXG5cclxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcclxuXHRcdGNvbnN0IG1hdGVyaWFsID0gdGhpcy5tYXRlcmlhbDtcclxuXHRcdGNvbnN0IG1hdHJpeFdvcmxkID0gdGhpcy5tYXRyaXhXb3JsZDtcclxuXHJcblx0XHRpZiAoIG1hdGVyaWFsID09PSB1bmRlZmluZWQgKSByZXR1cm47XHJcblxyXG5cdFx0Ly8gdGVzdCB3aXRoIGJvdW5kaW5nIHNwaGVyZSBpbiB3b3JsZCBzcGFjZVxyXG5cclxuXHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSBnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcclxuXHJcblx0XHRfc3BoZXJlLmNvcHkoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlICk7XHJcblx0XHRfc3BoZXJlLmFwcGx5TWF0cml4NCggbWF0cml4V29ybGQgKTtcclxuXHJcblx0XHQvLyBjaGVjayBkaXN0YW5jZSBmcm9tIHJheSBvcmlnaW4gdG8gYm91bmRpbmcgc3BoZXJlXHJcblxyXG5cdFx0X3JheS5jb3B5KCByYXljYXN0ZXIucmF5ICkucmVjYXN0KCByYXljYXN0ZXIubmVhciApO1xyXG5cclxuXHRcdGlmICggX3NwaGVyZS5jb250YWluc1BvaW50KCBfcmF5Lm9yaWdpbiApID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdGlmICggX3JheS5pbnRlcnNlY3RTcGhlcmUoIF9zcGhlcmUsIF9zcGhlcmVIaXRBdCApID09PSBudWxsICkgcmV0dXJuO1xyXG5cclxuXHRcdFx0aWYgKCBfcmF5Lm9yaWdpbi5kaXN0YW5jZVRvU3F1YXJlZCggX3NwaGVyZUhpdEF0ICkgPiAoIHJheWNhc3Rlci5mYXIgLSByYXljYXN0ZXIubmVhciApICoqIDIgKSByZXR1cm47XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGNvbnZlcnQgcmF5IHRvIGxvY2FsIHNwYWNlIG9mIG1lc2hcclxuXHJcblx0XHRfaW52ZXJzZU1hdHJpeC5jb3B5KCBtYXRyaXhXb3JsZCApLmludmVydCgpO1xyXG5cdFx0X3JheS5jb3B5KCByYXljYXN0ZXIucmF5ICkuYXBwbHlNYXRyaXg0KCBfaW52ZXJzZU1hdHJpeCApO1xyXG5cclxuXHRcdC8vIHRlc3Qgd2l0aCBib3VuZGluZyBib3ggaW4gbG9jYWwgc3BhY2VcclxuXHJcblx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nQm94ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0aWYgKCBfcmF5LmludGVyc2VjdHNCb3goIGdlb21ldHJ5LmJvdW5kaW5nQm94ICkgPT09IGZhbHNlICkgcmV0dXJuO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyB0ZXN0IGZvciBpbnRlcnNlY3Rpb25zIHdpdGggZ2VvbWV0cnlcclxuXHJcblx0XHR0aGlzLl9jb21wdXRlSW50ZXJzZWN0aW9ucyggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzLCBfcmF5ICk7XHJcblxyXG5cdH1cclxuXHJcblx0X2NvbXB1dGVJbnRlcnNlY3Rpb25zKCByYXljYXN0ZXIsIGludGVyc2VjdHMsIHJheUxvY2FsU3BhY2UgKSB7XHJcblxyXG5cdFx0bGV0IGludGVyc2VjdGlvbjtcclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XHJcblx0XHRjb25zdCBtYXRlcmlhbCA9IHRoaXMubWF0ZXJpYWw7XHJcblxyXG5cdFx0Y29uc3QgaW5kZXggPSBnZW9tZXRyeS5pbmRleDtcclxuXHRcdGNvbnN0IHBvc2l0aW9uID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjtcclxuXHRcdGNvbnN0IHV2ID0gZ2VvbWV0cnkuYXR0cmlidXRlcy51djtcclxuXHRcdGNvbnN0IHV2MSA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMudXYxO1xyXG5cdFx0Y29uc3Qgbm9ybWFsID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5ub3JtYWw7XHJcblx0XHRjb25zdCBncm91cHMgPSBnZW9tZXRyeS5ncm91cHM7XHJcblx0XHRjb25zdCBkcmF3UmFuZ2UgPSBnZW9tZXRyeS5kcmF3UmFuZ2U7XHJcblxyXG5cdFx0aWYgKCBpbmRleCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdC8vIGluZGV4ZWQgYnVmZmVyIGdlb21ldHJ5XHJcblxyXG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIG1hdGVyaWFsICkgKSB7XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBncm91cHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgZ3JvdXAgPSBncm91cHNbIGkgXTtcclxuXHRcdFx0XHRcdGNvbnN0IGdyb3VwTWF0ZXJpYWwgPSBtYXRlcmlhbFsgZ3JvdXAubWF0ZXJpYWxJbmRleCBdO1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHN0YXJ0ID0gTWF0aC5tYXgoIGdyb3VwLnN0YXJ0LCBkcmF3UmFuZ2Uuc3RhcnQgKTtcclxuXHRcdFx0XHRcdGNvbnN0IGVuZCA9IE1hdGgubWluKCBpbmRleC5jb3VudCwgTWF0aC5taW4oICggZ3JvdXAuc3RhcnQgKyBncm91cC5jb3VudCApLCAoIGRyYXdSYW5nZS5zdGFydCArIGRyYXdSYW5nZS5jb3VudCApICkgKTtcclxuXHJcblx0XHRcdFx0XHRmb3IgKCBsZXQgaiA9IHN0YXJ0LCBqbCA9IGVuZDsgaiA8IGpsOyBqICs9IDMgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCBhID0gaW5kZXguZ2V0WCggaiApO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBiID0gaW5kZXguZ2V0WCggaiArIDEgKTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgYyA9IGluZGV4LmdldFgoIGogKyAyICk7XHJcblxyXG5cdFx0XHRcdFx0XHRpbnRlcnNlY3Rpb24gPSBjaGVja0dlb21ldHJ5SW50ZXJzZWN0aW9uKCB0aGlzLCBncm91cE1hdGVyaWFsLCByYXljYXN0ZXIsIHJheUxvY2FsU3BhY2UsIHV2LCB1djEsIG5vcm1hbCwgYSwgYiwgYyApO1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCBpbnRlcnNlY3Rpb24gKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGludGVyc2VjdGlvbi5mYWNlSW5kZXggPSBNYXRoLmZsb29yKCBqIC8gMyApOyAvLyB0cmlhbmdsZSBudW1iZXIgaW4gaW5kZXhlZCBidWZmZXIgc2VtYW50aWNzXHJcblx0XHRcdFx0XHRcdFx0aW50ZXJzZWN0aW9uLmZhY2UubWF0ZXJpYWxJbmRleCA9IGdyb3VwLm1hdGVyaWFsSW5kZXg7XHJcblx0XHRcdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCBpbnRlcnNlY3Rpb24gKTtcclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHN0YXJ0ID0gTWF0aC5tYXgoIDAsIGRyYXdSYW5nZS5zdGFydCApO1xyXG5cdFx0XHRcdGNvbnN0IGVuZCA9IE1hdGgubWluKCBpbmRleC5jb3VudCwgKCBkcmF3UmFuZ2Uuc3RhcnQgKyBkcmF3UmFuZ2UuY291bnQgKSApO1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IHN0YXJ0LCBpbCA9IGVuZDsgaSA8IGlsOyBpICs9IDMgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgYSA9IGluZGV4LmdldFgoIGkgKTtcclxuXHRcdFx0XHRcdGNvbnN0IGIgPSBpbmRleC5nZXRYKCBpICsgMSApO1xyXG5cdFx0XHRcdFx0Y29uc3QgYyA9IGluZGV4LmdldFgoIGkgKyAyICk7XHJcblxyXG5cdFx0XHRcdFx0aW50ZXJzZWN0aW9uID0gY2hlY2tHZW9tZXRyeUludGVyc2VjdGlvbiggdGhpcywgbWF0ZXJpYWwsIHJheWNhc3RlciwgcmF5TG9jYWxTcGFjZSwgdXYsIHV2MSwgbm9ybWFsLCBhLCBiLCBjICk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBpbnRlcnNlY3Rpb24gKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRpbnRlcnNlY3Rpb24uZmFjZUluZGV4ID0gTWF0aC5mbG9vciggaSAvIDMgKTsgLy8gdHJpYW5nbGUgbnVtYmVyIGluIGluZGV4ZWQgYnVmZmVyIHNlbWFudGljc1xyXG5cdFx0XHRcdFx0XHRpbnRlcnNlY3RzLnB1c2goIGludGVyc2VjdGlvbiApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHBvc2l0aW9uICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHQvLyBub24taW5kZXhlZCBidWZmZXIgZ2VvbWV0cnlcclxuXHJcblx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggbWF0ZXJpYWwgKSApIHtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IGdyb3Vwcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBncm91cCA9IGdyb3Vwc1sgaSBdO1xyXG5cdFx0XHRcdFx0Y29uc3QgZ3JvdXBNYXRlcmlhbCA9IG1hdGVyaWFsWyBncm91cC5tYXRlcmlhbEluZGV4IF07XHJcblxyXG5cdFx0XHRcdFx0Y29uc3Qgc3RhcnQgPSBNYXRoLm1heCggZ3JvdXAuc3RhcnQsIGRyYXdSYW5nZS5zdGFydCApO1xyXG5cdFx0XHRcdFx0Y29uc3QgZW5kID0gTWF0aC5taW4oIHBvc2l0aW9uLmNvdW50LCBNYXRoLm1pbiggKCBncm91cC5zdGFydCArIGdyb3VwLmNvdW50ICksICggZHJhd1JhbmdlLnN0YXJ0ICsgZHJhd1JhbmdlLmNvdW50ICkgKSApO1xyXG5cclxuXHRcdFx0XHRcdGZvciAoIGxldCBqID0gc3RhcnQsIGpsID0gZW5kOyBqIDwgamw7IGogKz0gMyApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnN0IGEgPSBqO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBiID0gaiArIDE7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGMgPSBqICsgMjtcclxuXHJcblx0XHRcdFx0XHRcdGludGVyc2VjdGlvbiA9IGNoZWNrR2VvbWV0cnlJbnRlcnNlY3Rpb24oIHRoaXMsIGdyb3VwTWF0ZXJpYWwsIHJheWNhc3RlciwgcmF5TG9jYWxTcGFjZSwgdXYsIHV2MSwgbm9ybWFsLCBhLCBiLCBjICk7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIGludGVyc2VjdGlvbiApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0aW50ZXJzZWN0aW9uLmZhY2VJbmRleCA9IE1hdGguZmxvb3IoIGogLyAzICk7IC8vIHRyaWFuZ2xlIG51bWJlciBpbiBub24taW5kZXhlZCBidWZmZXIgc2VtYW50aWNzXHJcblx0XHRcdFx0XHRcdFx0aW50ZXJzZWN0aW9uLmZhY2UubWF0ZXJpYWxJbmRleCA9IGdyb3VwLm1hdGVyaWFsSW5kZXg7XHJcblx0XHRcdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCBpbnRlcnNlY3Rpb24gKTtcclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHN0YXJ0ID0gTWF0aC5tYXgoIDAsIGRyYXdSYW5nZS5zdGFydCApO1xyXG5cdFx0XHRcdGNvbnN0IGVuZCA9IE1hdGgubWluKCBwb3NpdGlvbi5jb3VudCwgKCBkcmF3UmFuZ2Uuc3RhcnQgKyBkcmF3UmFuZ2UuY291bnQgKSApO1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IHN0YXJ0LCBpbCA9IGVuZDsgaSA8IGlsOyBpICs9IDMgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgYSA9IGk7XHJcblx0XHRcdFx0XHRjb25zdCBiID0gaSArIDE7XHJcblx0XHRcdFx0XHRjb25zdCBjID0gaSArIDI7XHJcblxyXG5cdFx0XHRcdFx0aW50ZXJzZWN0aW9uID0gY2hlY2tHZW9tZXRyeUludGVyc2VjdGlvbiggdGhpcywgbWF0ZXJpYWwsIHJheWNhc3RlciwgcmF5TG9jYWxTcGFjZSwgdXYsIHV2MSwgbm9ybWFsLCBhLCBiLCBjICk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBpbnRlcnNlY3Rpb24gKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRpbnRlcnNlY3Rpb24uZmFjZUluZGV4ID0gTWF0aC5mbG9vciggaSAvIDMgKTsgLy8gdHJpYW5nbGUgbnVtYmVyIGluIG5vbi1pbmRleGVkIGJ1ZmZlciBzZW1hbnRpY3NcclxuXHRcdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCBpbnRlcnNlY3Rpb24gKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNoZWNrSW50ZXJzZWN0aW9uKCBvYmplY3QsIG1hdGVyaWFsLCByYXljYXN0ZXIsIHJheSwgcEEsIHBCLCBwQywgcG9pbnQgKSB7XHJcblxyXG5cdGxldCBpbnRlcnNlY3Q7XHJcblxyXG5cdGlmICggbWF0ZXJpYWwuc2lkZSA9PT0gQmFja1NpZGUgKSB7XHJcblxyXG5cdFx0aW50ZXJzZWN0ID0gcmF5LmludGVyc2VjdFRyaWFuZ2xlKCBwQywgcEIsIHBBLCB0cnVlLCBwb2ludCApO1xyXG5cclxuXHR9IGVsc2Uge1xyXG5cclxuXHRcdGludGVyc2VjdCA9IHJheS5pbnRlcnNlY3RUcmlhbmdsZSggcEEsIHBCLCBwQywgKCBtYXRlcmlhbC5zaWRlID09PSBGcm9udFNpZGUgKSwgcG9pbnQgKTtcclxuXHJcblx0fVxyXG5cclxuXHRpZiAoIGludGVyc2VjdCA9PT0gbnVsbCApIHJldHVybiBudWxsO1xyXG5cclxuXHRfaW50ZXJzZWN0aW9uUG9pbnRXb3JsZC5jb3B5KCBwb2ludCApO1xyXG5cdF9pbnRlcnNlY3Rpb25Qb2ludFdvcmxkLmFwcGx5TWF0cml4NCggb2JqZWN0Lm1hdHJpeFdvcmxkICk7XHJcblxyXG5cdGNvbnN0IGRpc3RhbmNlID0gcmF5Y2FzdGVyLnJheS5vcmlnaW4uZGlzdGFuY2VUbyggX2ludGVyc2VjdGlvblBvaW50V29ybGQgKTtcclxuXHJcblx0aWYgKCBkaXN0YW5jZSA8IHJheWNhc3Rlci5uZWFyIHx8IGRpc3RhbmNlID4gcmF5Y2FzdGVyLmZhciApIHJldHVybiBudWxsO1xyXG5cclxuXHRyZXR1cm4ge1xyXG5cdFx0ZGlzdGFuY2U6IGRpc3RhbmNlLFxyXG5cdFx0cG9pbnQ6IF9pbnRlcnNlY3Rpb25Qb2ludFdvcmxkLmNsb25lKCksXHJcblx0XHRvYmplY3Q6IG9iamVjdFxyXG5cdH07XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBjaGVja0dlb21ldHJ5SW50ZXJzZWN0aW9uKCBvYmplY3QsIG1hdGVyaWFsLCByYXljYXN0ZXIsIHJheSwgdXYsIHV2MSwgbm9ybWFsLCBhLCBiLCBjICkge1xyXG5cclxuXHRvYmplY3QuZ2V0VmVydGV4UG9zaXRpb24oIGEsIF92QSApO1xyXG5cdG9iamVjdC5nZXRWZXJ0ZXhQb3NpdGlvbiggYiwgX3ZCICk7XHJcblx0b2JqZWN0LmdldFZlcnRleFBvc2l0aW9uKCBjLCBfdkMgKTtcclxuXHJcblx0Y29uc3QgaW50ZXJzZWN0aW9uID0gY2hlY2tJbnRlcnNlY3Rpb24oIG9iamVjdCwgbWF0ZXJpYWwsIHJheWNhc3RlciwgcmF5LCBfdkEsIF92QiwgX3ZDLCBfaW50ZXJzZWN0aW9uUG9pbnQgKTtcclxuXHJcblx0aWYgKCBpbnRlcnNlY3Rpb24gKSB7XHJcblxyXG5cdFx0Y29uc3QgYmFyeWNvb3JkID0gbmV3IFZlY3RvcjMoKTtcclxuXHRcdFRyaWFuZ2xlLmdldEJhcnljb29yZCggX2ludGVyc2VjdGlvblBvaW50LCBfdkEsIF92QiwgX3ZDLCBiYXJ5Y29vcmQgKTtcclxuXHJcblx0XHRpZiAoIHV2ICkge1xyXG5cclxuXHRcdFx0aW50ZXJzZWN0aW9uLnV2ID0gVHJpYW5nbGUuZ2V0SW50ZXJwb2xhdGVkQXR0cmlidXRlKCB1diwgYSwgYiwgYywgYmFyeWNvb3JkLCBuZXcgVmVjdG9yMigpICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdXYxICkge1xyXG5cclxuXHRcdFx0aW50ZXJzZWN0aW9uLnV2MSA9IFRyaWFuZ2xlLmdldEludGVycG9sYXRlZEF0dHJpYnV0ZSggdXYxLCBhLCBiLCBjLCBiYXJ5Y29vcmQsIG5ldyBWZWN0b3IyKCkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBub3JtYWwgKSB7XHJcblxyXG5cdFx0XHRpbnRlcnNlY3Rpb24ubm9ybWFsID0gVHJpYW5nbGUuZ2V0SW50ZXJwb2xhdGVkQXR0cmlidXRlKCBub3JtYWwsIGEsIGIsIGMsIGJhcnljb29yZCwgbmV3IFZlY3RvcjMoKSApO1xyXG5cclxuXHRcdFx0aWYgKCBpbnRlcnNlY3Rpb24ubm9ybWFsLmRvdCggcmF5LmRpcmVjdGlvbiApID4gMCApIHtcclxuXHJcblx0XHRcdFx0aW50ZXJzZWN0aW9uLm5vcm1hbC5tdWx0aXBseVNjYWxhciggLSAxICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGZhY2UgPSB7XHJcblx0XHRcdGE6IGEsXHJcblx0XHRcdGI6IGIsXHJcblx0XHRcdGM6IGMsXHJcblx0XHRcdG5vcm1hbDogbmV3IFZlY3RvcjMoKSxcclxuXHRcdFx0bWF0ZXJpYWxJbmRleDogMFxyXG5cdFx0fTtcclxuXHJcblx0XHRUcmlhbmdsZS5nZXROb3JtYWwoIF92QSwgX3ZCLCBfdkMsIGZhY2Uubm9ybWFsICk7XHJcblxyXG5cdFx0aW50ZXJzZWN0aW9uLmZhY2UgPSBmYWNlO1xyXG5cdFx0aW50ZXJzZWN0aW9uLmJhcnljb29yZCA9IGJhcnljb29yZDtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gaW50ZXJzZWN0aW9uO1xyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgTWVzaCB9O1xyXG4iLCJpbXBvcnQgeyBCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyR2VvbWV0cnkuanMnO1xyXG5pbXBvcnQgeyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIGdlb21ldHJ5IGNsYXNzIGZvciBhIHJlY3Rhbmd1bGFyIGN1Ym9pZCB3aXRoIGEgZ2l2ZW4gd2lkdGgsIGhlaWdodCwgYW5kIGRlcHRoLlxyXG4gKiBPbiBjcmVhdGlvbiwgdGhlIGN1Ym9pZCBpcyBjZW50cmVkIG9uIHRoZSBvcmlnaW4sIHdpdGggZWFjaCBlZGdlIHBhcmFsbGVsIHRvIG9uZVxyXG4gKiBvZiB0aGUgYXhlcy5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgZ2VvbWV0cnkgPSBuZXcgVEhSRUUuQm94R2VvbWV0cnkoIDEsIDEsIDEgKTtcclxuICogY29uc3QgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IDB4MDBmZjAwIH0gKTtcclxuICogY29uc3QgY3ViZSA9IG5ldyBUSFJFRS5NZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuICogc2NlbmUuYWRkKCBjdWJlICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQnVmZmVyR2VvbWV0cnlcclxuICovXHJcbmNsYXNzIEJveEdlb21ldHJ5IGV4dGVuZHMgQnVmZmVyR2VvbWV0cnkge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGJveCBnZW9tZXRyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbd2lkdGg9MV0gLSBUaGUgd2lkdGguIFRoYXQgaXMsIHRoZSBsZW5ndGggb2YgdGhlIGVkZ2VzIHBhcmFsbGVsIHRvIHRoZSBYIGF4aXMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtoZWlnaHQ9MV0gLSBUaGUgaGVpZ2h0LiBUaGF0IGlzLCB0aGUgbGVuZ3RoIG9mIHRoZSBlZGdlcyBwYXJhbGxlbCB0byB0aGUgWSBheGlzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZGVwdGg9MV0gLSBUaGUgZGVwdGguIFRoYXQgaXMsIHRoZSBsZW5ndGggb2YgdGhlIGVkZ2VzIHBhcmFsbGVsIHRvIHRoZSBaIGF4aXMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt3aWR0aFNlZ21lbnRzPTFdIC0gTnVtYmVyIG9mIHNlZ21lbnRlZCByZWN0YW5ndWxhciBmYWNlcyBhbG9uZyB0aGUgd2lkdGggb2YgdGhlIHNpZGVzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbaGVpZ2h0U2VnbWVudHM9MV0gLSBOdW1iZXIgb2Ygc2VnbWVudGVkIHJlY3Rhbmd1bGFyIGZhY2VzIGFsb25nIHRoZSBoZWlnaHQgb2YgdGhlIHNpZGVzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZGVwdGhTZWdtZW50cz0xXSAtIE51bWJlciBvZiBzZWdtZW50ZWQgcmVjdGFuZ3VsYXIgZmFjZXMgYWxvbmcgdGhlIGRlcHRoIG9mIHRoZSBzaWRlcy5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggd2lkdGggPSAxLCBoZWlnaHQgPSAxLCBkZXB0aCA9IDEsIHdpZHRoU2VnbWVudHMgPSAxLCBoZWlnaHRTZWdtZW50cyA9IDEsIGRlcHRoU2VnbWVudHMgPSAxICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ0JveEdlb21ldHJ5JztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvbGRzIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzIHRoYXQgaGF2ZSBiZWVuXHJcblx0XHQgKiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBnZW9tZXRyeS4gQW55IG1vZGlmaWNhdGlvblxyXG5cdFx0ICogYWZ0ZXIgaW5zdGFudGlhdGlvbiBkb2VzIG5vdCBjaGFuZ2UgdGhlIGdlb21ldHJ5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucGFyYW1ldGVycyA9IHtcclxuXHRcdFx0d2lkdGg6IHdpZHRoLFxyXG5cdFx0XHRoZWlnaHQ6IGhlaWdodCxcclxuXHRcdFx0ZGVwdGg6IGRlcHRoLFxyXG5cdFx0XHR3aWR0aFNlZ21lbnRzOiB3aWR0aFNlZ21lbnRzLFxyXG5cdFx0XHRoZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHMsXHJcblx0XHRcdGRlcHRoU2VnbWVudHM6IGRlcHRoU2VnbWVudHNcclxuXHRcdH07XHJcblxyXG5cdFx0Y29uc3Qgc2NvcGUgPSB0aGlzO1xyXG5cclxuXHRcdC8vIHNlZ21lbnRzXHJcblxyXG5cdFx0d2lkdGhTZWdtZW50cyA9IE1hdGguZmxvb3IoIHdpZHRoU2VnbWVudHMgKTtcclxuXHRcdGhlaWdodFNlZ21lbnRzID0gTWF0aC5mbG9vciggaGVpZ2h0U2VnbWVudHMgKTtcclxuXHRcdGRlcHRoU2VnbWVudHMgPSBNYXRoLmZsb29yKCBkZXB0aFNlZ21lbnRzICk7XHJcblxyXG5cdFx0Ly8gYnVmZmVyc1xyXG5cclxuXHRcdGNvbnN0IGluZGljZXMgPSBbXTtcclxuXHRcdGNvbnN0IHZlcnRpY2VzID0gW107XHJcblx0XHRjb25zdCBub3JtYWxzID0gW107XHJcblx0XHRjb25zdCB1dnMgPSBbXTtcclxuXHJcblx0XHQvLyBoZWxwZXIgdmFyaWFibGVzXHJcblxyXG5cdFx0bGV0IG51bWJlck9mVmVydGljZXMgPSAwO1xyXG5cdFx0bGV0IGdyb3VwU3RhcnQgPSAwO1xyXG5cclxuXHRcdC8vIGJ1aWxkIGVhY2ggc2lkZSBvZiB0aGUgYm94IGdlb21ldHJ5XHJcblxyXG5cdFx0YnVpbGRQbGFuZSggJ3onLCAneScsICd4JywgLSAxLCAtIDEsIGRlcHRoLCBoZWlnaHQsIHdpZHRoLCBkZXB0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgMCApOyAvLyBweFxyXG5cdFx0YnVpbGRQbGFuZSggJ3onLCAneScsICd4JywgMSwgLSAxLCBkZXB0aCwgaGVpZ2h0LCAtIHdpZHRoLCBkZXB0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgMSApOyAvLyBueFxyXG5cdFx0YnVpbGRQbGFuZSggJ3gnLCAneicsICd5JywgMSwgMSwgd2lkdGgsIGRlcHRoLCBoZWlnaHQsIHdpZHRoU2VnbWVudHMsIGRlcHRoU2VnbWVudHMsIDIgKTsgLy8gcHlcclxuXHRcdGJ1aWxkUGxhbmUoICd4JywgJ3onLCAneScsIDEsIC0gMSwgd2lkdGgsIGRlcHRoLCAtIGhlaWdodCwgd2lkdGhTZWdtZW50cywgZGVwdGhTZWdtZW50cywgMyApOyAvLyBueVxyXG5cdFx0YnVpbGRQbGFuZSggJ3gnLCAneScsICd6JywgMSwgLSAxLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIDQgKTsgLy8gcHpcclxuXHRcdGJ1aWxkUGxhbmUoICd4JywgJ3knLCAneicsIC0gMSwgLSAxLCB3aWR0aCwgaGVpZ2h0LCAtIGRlcHRoLCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgNSApOyAvLyBuelxyXG5cclxuXHRcdC8vIGJ1aWxkIGdlb21ldHJ5XHJcblxyXG5cdFx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xyXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XHJcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcclxuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcclxuXHJcblx0XHRmdW5jdGlvbiBidWlsZFBsYW5lKCB1LCB2LCB3LCB1ZGlyLCB2ZGlyLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgZ3JpZFgsIGdyaWRZLCBtYXRlcmlhbEluZGV4ICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgc2VnbWVudFdpZHRoID0gd2lkdGggLyBncmlkWDtcclxuXHRcdFx0Y29uc3Qgc2VnbWVudEhlaWdodCA9IGhlaWdodCAvIGdyaWRZO1xyXG5cclxuXHRcdFx0Y29uc3Qgd2lkdGhIYWxmID0gd2lkdGggLyAyO1xyXG5cdFx0XHRjb25zdCBoZWlnaHRIYWxmID0gaGVpZ2h0IC8gMjtcclxuXHRcdFx0Y29uc3QgZGVwdGhIYWxmID0gZGVwdGggLyAyO1xyXG5cclxuXHRcdFx0Y29uc3QgZ3JpZFgxID0gZ3JpZFggKyAxO1xyXG5cdFx0XHRjb25zdCBncmlkWTEgPSBncmlkWSArIDE7XHJcblxyXG5cdFx0XHRsZXQgdmVydGV4Q291bnRlciA9IDA7XHJcblx0XHRcdGxldCBncm91cENvdW50ID0gMDtcclxuXHJcblx0XHRcdGNvbnN0IHZlY3RvciA9IG5ldyBWZWN0b3IzKCk7XHJcblxyXG5cdFx0XHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzXHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaXkgPSAwOyBpeSA8IGdyaWRZMTsgaXkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHkgPSBpeSAqIHNlZ21lbnRIZWlnaHQgLSBoZWlnaHRIYWxmO1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaXggPSAwOyBpeCA8IGdyaWRYMTsgaXggKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgeCA9IGl4ICogc2VnbWVudFdpZHRoIC0gd2lkdGhIYWxmO1xyXG5cclxuXHRcdFx0XHRcdC8vIHNldCB2YWx1ZXMgdG8gY29ycmVjdCB2ZWN0b3IgY29tcG9uZW50XHJcblxyXG5cdFx0XHRcdFx0dmVjdG9yWyB1IF0gPSB4ICogdWRpcjtcclxuXHRcdFx0XHRcdHZlY3RvclsgdiBdID0geSAqIHZkaXI7XHJcblx0XHRcdFx0XHR2ZWN0b3JbIHcgXSA9IGRlcHRoSGFsZjtcclxuXHJcblx0XHRcdFx0XHQvLyBub3cgYXBwbHkgdmVjdG9yIHRvIHZlcnRleCBidWZmZXJcclxuXHJcblx0XHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZWN0b3IueCwgdmVjdG9yLnksIHZlY3Rvci56ICk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gc2V0IHZhbHVlcyB0byBjb3JyZWN0IHZlY3RvciBjb21wb25lbnRcclxuXHJcblx0XHRcdFx0XHR2ZWN0b3JbIHUgXSA9IDA7XHJcblx0XHRcdFx0XHR2ZWN0b3JbIHYgXSA9IDA7XHJcblx0XHRcdFx0XHR2ZWN0b3JbIHcgXSA9IGRlcHRoID4gMCA/IDEgOiAtIDE7XHJcblxyXG5cdFx0XHRcdFx0Ly8gbm93IGFwcGx5IHZlY3RvciB0byBub3JtYWwgYnVmZmVyXHJcblxyXG5cdFx0XHRcdFx0bm9ybWFscy5wdXNoKCB2ZWN0b3IueCwgdmVjdG9yLnksIHZlY3Rvci56ICk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gdXZzXHJcblxyXG5cdFx0XHRcdFx0dXZzLnB1c2goIGl4IC8gZ3JpZFggKTtcclxuXHRcdFx0XHRcdHV2cy5wdXNoKCAxIC0gKCBpeSAvIGdyaWRZICkgKTtcclxuXHJcblx0XHRcdFx0XHQvLyBjb3VudGVyc1xyXG5cclxuXHRcdFx0XHRcdHZlcnRleENvdW50ZXIgKz0gMTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gaW5kaWNlc1xyXG5cclxuXHRcdFx0Ly8gMS4geW91IG5lZWQgdGhyZWUgaW5kaWNlcyB0byBkcmF3IGEgc2luZ2xlIGZhY2VcclxuXHRcdFx0Ly8gMi4gYSBzaW5nbGUgc2VnbWVudCBjb25zaXN0cyBvZiB0d28gZmFjZXNcclxuXHRcdFx0Ly8gMy4gc28gd2UgbmVlZCB0byBnZW5lcmF0ZSBzaXggKDIqMykgaW5kaWNlcyBwZXIgc2VnbWVudFxyXG5cclxuXHRcdFx0Zm9yICggbGV0IGl5ID0gMDsgaXkgPCBncmlkWTsgaXkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpeCA9IDA7IGl4IDwgZ3JpZFg7IGl4ICsrICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGEgPSBudW1iZXJPZlZlcnRpY2VzICsgaXggKyBncmlkWDEgKiBpeTtcclxuXHRcdFx0XHRcdGNvbnN0IGIgPSBudW1iZXJPZlZlcnRpY2VzICsgaXggKyBncmlkWDEgKiAoIGl5ICsgMSApO1xyXG5cdFx0XHRcdFx0Y29uc3QgYyA9IG51bWJlck9mVmVydGljZXMgKyAoIGl4ICsgMSApICsgZ3JpZFgxICogKCBpeSArIDEgKTtcclxuXHRcdFx0XHRcdGNvbnN0IGQgPSBudW1iZXJPZlZlcnRpY2VzICsgKCBpeCArIDEgKSArIGdyaWRYMSAqIGl5O1xyXG5cclxuXHRcdFx0XHRcdC8vIGZhY2VzXHJcblxyXG5cdFx0XHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XHJcblx0XHRcdFx0XHRpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcclxuXHJcblx0XHRcdFx0XHQvLyBpbmNyZWFzZSBjb3VudGVyXHJcblxyXG5cdFx0XHRcdFx0Z3JvdXBDb3VudCArPSA2O1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBhZGQgYSBncm91cCB0byB0aGUgZ2VvbWV0cnkuIHRoaXMgd2lsbCBlbnN1cmUgbXVsdGkgbWF0ZXJpYWwgc3VwcG9ydFxyXG5cclxuXHRcdFx0c2NvcGUuYWRkR3JvdXAoIGdyb3VwU3RhcnQsIGdyb3VwQ291bnQsIG1hdGVyaWFsSW5kZXggKTtcclxuXHJcblx0XHRcdC8vIGNhbGN1bGF0ZSBuZXcgc3RhcnQgdmFsdWUgZm9yIGdyb3Vwc1xyXG5cclxuXHRcdFx0Z3JvdXBTdGFydCArPSBncm91cENvdW50O1xyXG5cclxuXHRcdFx0Ly8gdXBkYXRlIHRvdGFsIG51bWJlciBvZiB2ZXJ0aWNlc1xyXG5cclxuXHRcdFx0bnVtYmVyT2ZWZXJ0aWNlcyArPSB2ZXJ0ZXhDb3VudGVyO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0gT2JqZWN0LmFzc2lnbigge30sIHNvdXJjZS5wYXJhbWV0ZXJzICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRmFjdG9yeSBtZXRob2QgZm9yIGNyZWF0aW5nIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZnJvbSB0aGUgZ2l2ZW5cclxuXHQgKiBKU09OIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gQSBKU09OIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNlcmlhbGl6ZWQgZ2VvbWV0cnkuXHJcblx0ICogQHJldHVybiB7Qm94R2VvbWV0cnl9IEEgbmV3IGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBmcm9tSlNPTiggZGF0YSApIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IEJveEdlb21ldHJ5KCBkYXRhLndpZHRoLCBkYXRhLmhlaWdodCwgZGF0YS5kZXB0aCwgZGF0YS53aWR0aFNlZ21lbnRzLCBkYXRhLmhlaWdodFNlZ21lbnRzLCBkYXRhLmRlcHRoU2VnbWVudHMgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgQm94R2VvbWV0cnkgfTtcclxuIiwiaW1wb3J0IHsgQ29sb3JNYW5hZ2VtZW50IH0gZnJvbSAnLi4vLi4vbWF0aC9Db2xvck1hbmFnZW1lbnQuanMnO1xyXG5cclxuLy8gVW5pZm9ybSBVdGlsaXRpZXNcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjbG9uZVVuaWZvcm1zKCBzcmMgKSB7XHJcblxyXG5cdGNvbnN0IGRzdCA9IHt9O1xyXG5cclxuXHRmb3IgKCBjb25zdCB1IGluIHNyYyApIHtcclxuXHJcblx0XHRkc3RbIHUgXSA9IHt9O1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IHAgaW4gc3JjWyB1IF0gKSB7XHJcblxyXG5cdFx0XHRjb25zdCBwcm9wZXJ0eSA9IHNyY1sgdSBdWyBwIF07XHJcblxyXG5cdFx0XHRpZiAoIHByb3BlcnR5ICYmICggcHJvcGVydHkuaXNDb2xvciB8fFxyXG5cdFx0XHRcdHByb3BlcnR5LmlzTWF0cml4MyB8fCBwcm9wZXJ0eS5pc01hdHJpeDQgfHxcclxuXHRcdFx0XHRwcm9wZXJ0eS5pc1ZlY3RvcjIgfHwgcHJvcGVydHkuaXNWZWN0b3IzIHx8IHByb3BlcnR5LmlzVmVjdG9yNCB8fFxyXG5cdFx0XHRcdHByb3BlcnR5LmlzVGV4dHVyZSB8fCBwcm9wZXJ0eS5pc1F1YXRlcm5pb24gKSApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBwcm9wZXJ0eS5pc1JlbmRlclRhcmdldFRleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVW5pZm9ybXNVdGlsczogVGV4dHVyZXMgb2YgcmVuZGVyIHRhcmdldHMgY2Fubm90IGJlIGNsb25lZCB2aWEgY2xvbmVVbmlmb3JtcygpIG9yIG1lcmdlVW5pZm9ybXMoKS4nICk7XHJcblx0XHRcdFx0XHRkc3RbIHUgXVsgcCBdID0gbnVsbDtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRkc3RbIHUgXVsgcCBdID0gcHJvcGVydHkuY2xvbmUoKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggQXJyYXkuaXNBcnJheSggcHJvcGVydHkgKSApIHtcclxuXHJcblx0XHRcdFx0ZHN0WyB1IF1bIHAgXSA9IHByb3BlcnR5LnNsaWNlKCk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRkc3RbIHUgXVsgcCBdID0gcHJvcGVydHk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiBkc3Q7XHJcblxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VVbmlmb3JtcyggdW5pZm9ybXMgKSB7XHJcblxyXG5cdGNvbnN0IG1lcmdlZCA9IHt9O1xyXG5cclxuXHRmb3IgKCBsZXQgdSA9IDA7IHUgPCB1bmlmb3Jtcy5sZW5ndGg7IHUgKysgKSB7XHJcblxyXG5cdFx0Y29uc3QgdG1wID0gY2xvbmVVbmlmb3JtcyggdW5pZm9ybXNbIHUgXSApO1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IHAgaW4gdG1wICkge1xyXG5cclxuXHRcdFx0bWVyZ2VkWyBwIF0gPSB0bXBbIHAgXTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIG1lcmdlZDtcclxuXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjbG9uZVVuaWZvcm1zR3JvdXBzKCBzcmMgKSB7XHJcblxyXG5cdGNvbnN0IGRzdCA9IFtdO1xyXG5cclxuXHRmb3IgKCBsZXQgdSA9IDA7IHUgPCBzcmMubGVuZ3RoOyB1ICsrICkge1xyXG5cclxuXHRcdGRzdC5wdXNoKCBzcmNbIHUgXS5jbG9uZSgpICk7XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIGRzdDtcclxuXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRVbmxpdFVuaWZvcm1Db2xvclNwYWNlKCByZW5kZXJlciApIHtcclxuXHJcblx0Y29uc3QgY3VycmVudFJlbmRlclRhcmdldCA9IHJlbmRlcmVyLmdldFJlbmRlclRhcmdldCgpO1xyXG5cclxuXHRpZiAoIGN1cnJlbnRSZW5kZXJUYXJnZXQgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL21yZG9vYi90aHJlZS5qcy9wdWxsLzIzOTM3I2lzc3VlY29tbWVudC0xMTExMDY3Mzk4XHJcblx0XHRyZXR1cm4gcmVuZGVyZXIub3V0cHV0Q29sb3JTcGFjZTtcclxuXHJcblx0fVxyXG5cclxuXHQvLyBodHRwczovL2dpdGh1Yi5jb20vbXJkb29iL3RocmVlLmpzL2lzc3Vlcy8yNzg2OFxyXG5cdGlmICggY3VycmVudFJlbmRlclRhcmdldC5pc1hSUmVuZGVyVGFyZ2V0ID09PSB0cnVlICkge1xyXG5cclxuXHRcdHJldHVybiBjdXJyZW50UmVuZGVyVGFyZ2V0LnRleHR1cmUuY29sb3JTcGFjZTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gQ29sb3JNYW5hZ2VtZW50LndvcmtpbmdDb2xvclNwYWNlO1xyXG5cclxufVxyXG5cclxuLy8gTGVnYWN5XHJcblxyXG5jb25zdCBVbmlmb3Jtc1V0aWxzID0geyBjbG9uZTogY2xvbmVVbmlmb3JtcywgbWVyZ2U6IG1lcmdlVW5pZm9ybXMgfTtcclxuXHJcbmV4cG9ydCB7IFVuaWZvcm1zVXRpbHMgfTtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2Bcclxudm9pZCBtYWluKCkge1xyXG5cdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQoIHBvc2l0aW9uLCAxLjAgKTtcclxufVxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG52b2lkIG1haW4oKSB7XHJcblx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggMS4wLCAwLjAsIDAuMCwgMS4wICk7XHJcbn1cclxuYDtcclxuIiwiaW1wb3J0IHsgTWF0ZXJpYWwgfSBmcm9tICcuL01hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgY2xvbmVVbmlmb3JtcywgY2xvbmVVbmlmb3Jtc0dyb3VwcyB9IGZyb20gJy4uL3JlbmRlcmVycy9zaGFkZXJzL1VuaWZvcm1zVXRpbHMuanMnO1xyXG5cclxuaW1wb3J0IGRlZmF1bHRfdmVydGV4IGZyb20gJy4uL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL2RlZmF1bHRfdmVydGV4Lmdsc2wuanMnO1xyXG5pbXBvcnQgZGVmYXVsdF9mcmFnbWVudCBmcm9tICcuLi9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9kZWZhdWx0X2ZyYWdtZW50Lmdsc2wuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgbWF0ZXJpYWwgcmVuZGVyZWQgd2l0aCBjdXN0b20gc2hhZGVycy4gQSBzaGFkZXIgaXMgYSBzbWFsbCBwcm9ncmFtIHdyaXR0ZW4gaW4gR0xTTC5cclxuICogdGhhdCBydW5zIG9uIHRoZSBHUFUuIFlvdSBtYXkgd2FudCB0byB1c2UgYSBjdXN0b20gc2hhZGVyIGlmIHlvdSBuZWVkIHRvIGltcGxlbWVudCBhblxyXG4gKiBlZmZlY3Qgbm90IGluY2x1ZGVkIHdpdGggYW55IG9mIHRoZSBidWlsdC1pbiBtYXRlcmlhbHMuXHJcbiAqXHJcbiAqIFRoZXJlIGFyZSB0aGUgZm9sbG93aW5nIG5vdGVzIHRvIGJlYXIgaW4gbWluZCB3aGVuIHVzaW5nIGEgYFNoYWRlck1hdGVyaWFsYDpcclxuICpcclxuICogLSBgU2hhZGVyTWF0ZXJpYWxgIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCB7QGxpbmsgV2ViR0xSZW5kZXJlcn0uXHJcbiAqIC0gQnVpbHQgaW4gYXR0cmlidXRlcyBhbmQgdW5pZm9ybXMgYXJlIHBhc3NlZCB0byB0aGUgc2hhZGVycyBhbG9uZyB3aXRoIHlvdXIgY29kZS4gSWZcclxuICogeW91IGRvbid0IHdhbnQgdGhhdCwgdXNlIHtAbGluayBSYXdTaGFkZXJNYXRlcmlhbH0gaW5zdGVhZC5cclxuICogLSBZb3UgY2FuIHVzZSB0aGUgZGlyZWN0aXZlIGAjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0YCBhbmQgYCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kYFxyXG4gKiBpbiBvcmRlciB0byB1bnJvbGwgYSBgZm9yYCBsb29wIGluIEdMU0wgYnkgdGhlIHNoYWRlciBwcmVwcm9jZXNzb3IuIFRoZSBkaXJlY3RpdmUgaGFzXHJcbiAqIHRvIGJlIHBsYWNlZCByaWdodCBhYm92ZSB0aGUgbG9vcC4gVGhlIGxvb3AgZm9ybWF0dGluZyBoYXMgdG8gY29ycmVzcG9uZCB0byBhIGRlZmluZWQgc3RhbmRhcmQuXHJcbiAqICAgLSBUaGUgbG9vcCBoYXMgdG8gYmUgW25vcm1hbGl6ZWRde0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL05vcm1hbGl6ZWRfbG9vcH0uXHJcbiAqICAgLSBUaGUgbG9vcCB2YXJpYWJsZSBoYXMgdG8gYmUgKmkqLlxyXG4gKiAgIC0gVGhlIHZhbHVlIGBVTlJPTExFRF9MT09QX0lOREVYYCB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIGV4cGxpY2l0bHlcclxuICogdmFsdWUgb2YgKmkqIGZvciB0aGUgZ2l2ZW4gaXRlcmF0aW9uIGFuZCBjYW4gYmUgdXNlZCBpbiBwcmVwcm9jZXNzb3JcclxuICogc3RhdGVtZW50cy5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuU2hhZGVyTWF0ZXJpYWwoIHtcclxuICogXHR1bmlmb3Jtczoge1xyXG4gKiBcdFx0dGltZTogeyB2YWx1ZTogMS4wIH0sXHJcbiAqIFx0XHRyZXNvbHV0aW9uOiB7IHZhbHVlOiBuZXcgVEhSRUUuVmVjdG9yMigpIH1cclxuICogXHR9LFxyXG4gKiBcdHZlcnRleFNoYWRlcjogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoICd2ZXJ0ZXhTaGFkZXInICkudGV4dENvbnRlbnQsXHJcbiAqIFx0ZnJhZ21lbnRTaGFkZXI6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCAnZnJhZ21lbnRTaGFkZXInICkudGV4dENvbnRlbnRcclxuICogfSApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIE1hdGVyaWFsXHJcbiAqL1xyXG5jbGFzcyBTaGFkZXJNYXRlcmlhbCBleHRlbmRzIE1hdGVyaWFsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBzaGFkZXIgbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtZXRlcnNdIC0gQW4gb2JqZWN0IHdpdGggb25lIG9yIG1vcmUgcHJvcGVydGllc1xyXG5cdCAqIGRlZmluaW5nIHRoZSBtYXRlcmlhbCdzIGFwcGVhcmFuY2UuIEFueSBwcm9wZXJ0eSBvZiB0aGUgbWF0ZXJpYWxcclxuXHQgKiAoaW5jbHVkaW5nIGFueSBwcm9wZXJ0eSBmcm9tIGluaGVyaXRlZCBtYXRlcmlhbHMpIGNhbiBiZSBwYXNzZWRcclxuXHQgKiBpbiBoZXJlLiBDb2xvciB2YWx1ZXMgY2FuIGJlIHBhc3NlZCBhbnkgdHlwZSBvZiB2YWx1ZSBhY2NlcHRlZFxyXG5cdCAqIGJ5IHtAbGluayBDb2xvciNzZXR9LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwYXJhbWV0ZXJzICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzU2hhZGVyTWF0ZXJpYWwgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdTaGFkZXJNYXRlcmlhbCc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIGN1c3RvbSBjb25zdGFudHMgdXNpbmcgYCNkZWZpbmVgIGRpcmVjdGl2ZXMgd2l0aGluIHRoZSBHTFNMIGNvZGVcclxuXHRcdCAqIGZvciBib3RoIHRoZSB2ZXJ0ZXggc2hhZGVyIGFuZCB0aGUgZnJhZ21lbnQgc2hhZGVyOyBlYWNoIGtleS92YWx1ZSBwYWlyXHJcblx0XHQgKiB5aWVsZHMgYW5vdGhlciBkaXJlY3RpdmUuXHJcblx0XHQgKiBgYGBqc1xyXG5cdFx0ICogZGVmaW5lczoge1xyXG5cdFx0ICogXHRGT086IDE1LFxyXG5cdFx0ICogXHRCQVI6IHRydWVcclxuXHRcdCAqIH1cclxuXHRcdCAqIGBgYFxyXG5cdFx0ICogWWllbGRzIHRoZSBsaW5lczpcclxuXHRcdCAqIGBgYFxyXG5cdFx0ICogI2RlZmluZSBGT08gMTVcclxuXHRcdCAqICNkZWZpbmUgQkFSIHRydWVcclxuXHRcdCAqIGBgYFxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGVmaW5lcyA9IHt9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQW4gb2JqZWN0IG9mIHRoZSBmb3JtOlxyXG5cdFx0ICogYGBganNcclxuXHRcdCAqIHtcclxuXHRcdCAqIFx0XCJ1bmlmb3JtMVwiOiB7IHZhbHVlOiAxLjAgfSxcclxuXHRcdCAqIFx0XCJ1bmlmb3JtMlwiOiB7IHZhbHVlOiAyIH1cclxuXHRcdCAqIH1cclxuXHRcdCAqIGBgYFxyXG5cdFx0ICogc3BlY2lmeWluZyB0aGUgdW5pZm9ybXMgdG8gYmUgcGFzc2VkIHRvIHRoZSBzaGFkZXIgY29kZTsga2V5cyBhcmUgdW5pZm9ybVxyXG5cdFx0ICogbmFtZXMsIHZhbHVlcyBhcmUgZGVmaW5pdGlvbnMgb2YgdGhlIGZvcm1cclxuXHRcdCAqIGBgYFxyXG5cdFx0ICoge1xyXG5cdFx0ICogXHR2YWx1ZTogMS4wXHJcblx0XHQgKiB9XHJcblx0XHQgKiBgYGBcclxuXHRcdCAqIHdoZXJlIGB2YWx1ZWAgaXMgdGhlIHZhbHVlIG9mIHRoZSB1bmlmb3JtLiBOYW1lcyBtdXN0IG1hdGNoIHRoZSBuYW1lIG9mXHJcblx0XHQgKiB0aGUgdW5pZm9ybSwgYXMgZGVmaW5lZCBpbiB0aGUgR0xTTCBjb2RlLiBOb3RlIHRoYXQgdW5pZm9ybXMgYXJlIHJlZnJlc2hlZFxyXG5cdFx0ICogb24gZXZlcnkgZnJhbWUsIHNvIHVwZGF0aW5nIHRoZSB2YWx1ZSBvZiB0aGUgdW5pZm9ybSB3aWxsIGltbWVkaWF0ZWx5XHJcblx0XHQgKiB1cGRhdGUgdGhlIHZhbHVlIGF2YWlsYWJsZSB0byB0aGUgR0xTTCBjb2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudW5pZm9ybXMgPSB7fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIGFycmF5IGhvbGRpbmcgdW5pZm9ybXMgZ3JvdXBzIGZvciBjb25maWd1cmluZyBVQk9zLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxVbmlmb3Jtc0dyb3VwPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51bmlmb3Jtc0dyb3VwcyA9IFtdO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVmVydGV4IHNoYWRlciBHTFNMIGNvZGUuIFRoaXMgaXMgdGhlIGFjdHVhbCBjb2RlIGZvciB0aGUgc2hhZGVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudmVydGV4U2hhZGVyID0gZGVmYXVsdF92ZXJ0ZXg7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBGcmFnbWVudCBzaGFkZXIgR0xTTCBjb2RlLiBUaGlzIGlzIHRoZSBhY3R1YWwgY29kZSBmb3IgdGhlIHNoYWRlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZyYWdtZW50U2hhZGVyID0gZGVmYXVsdF9mcmFnbWVudDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENvbnRyb2xzIGxpbmUgdGhpY2tuZXNzIG9yIGxpbmVzLlxyXG5cdFx0ICpcclxuXHRcdCAqIFdlYkdMIGFuZCBXZWJHUFUgaWdub3JlIHRoaXMgc2V0dGluZyBhbmQgYWx3YXlzIHJlbmRlciBsaW5lIHByaW1pdGl2ZXMgd2l0aCBhXHJcblx0XHQgKiB3aWR0aCBvZiBvbmUgcGl4ZWwuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5saW5ld2lkdGggPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVuZGVycyB0aGUgZ2VvbWV0cnkgYXMgYSB3aXJlZnJhbWUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLndpcmVmcmFtZSA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQ29udHJvbHMgdGhlIHRoaWNrbmVzcyBvZiB0aGUgd2lyZWZyYW1lLlxyXG5cdFx0ICpcclxuXHRcdCAqIFdlYkdMIGFuZCBXZWJHUFUgaWdub3JlIHRoaXMgcHJvcGVydHkgYW5kIGFsd2F5cyByZW5kZXJcclxuXHRcdCAqIDEgcGl4ZWwgd2lkZSBsaW5lcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmUgd2hldGhlciB0aGUgbWF0ZXJpYWwgY29sb3IgaXMgYWZmZWN0ZWQgYnkgZ2xvYmFsIGZvZyBzZXR0aW5nczsgYHRydWVgXHJcblx0XHQgKiB0byBwYXNzIGZvZyB1bmlmb3JtcyB0byB0aGUgc2hhZGVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5mb2cgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgd2hldGhlciB0aGlzIG1hdGVyaWFsIHVzZXMgbGlnaHRpbmc7IGB0cnVlYCB0byBwYXNzIHVuaWZvcm0gZGF0YVxyXG5cdFx0ICogcmVsYXRlZCB0byBsaWdodGluZyB0byB0aGlzIHNoYWRlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGlnaHRzID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIHdoZXRoZXIgdGhpcyBtYXRlcmlhbCBzdXBwb3J0cyBjbGlwcGluZzsgYHRydWVgIHRvIGxldCB0aGUgcmVuZGVyZXJcclxuXHRcdCAqIHBhc3MgdGhlIGNsaXBwaW5nUGxhbmVzIHVuaWZvcm0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNsaXBwaW5nID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBPdmVyd3JpdHRlbiBhbmQgc2V0IHRvIGB0cnVlYCBieSBkZWZhdWx0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZvcmNlU2luZ2xlUGFzcyA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIG9iamVjdCBhbGxvd3MgdG8gZW5hYmxlIGNlcnRhaW4gV2ViR0wgMiBleHRlbnNpb25zLlxyXG5cdFx0ICpcclxuXHRcdCAqIC0gY2xpcEN1bGxEaXN0YW5jZTogc2V0IHRvIGB0cnVlYCB0byB1c2UgdmVydGV4IHNoYWRlciBjbGlwcGluZ1xyXG5cdFx0ICogLSBtdWx0aURyYXc6IHNldCB0byBgdHJ1ZWAgdG8gdXNlIHZlcnRleCBzaGFkZXIgbXVsdGlfZHJhdyAvIGVuYWJsZSBnbF9EcmF3SURcclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7e2NsaXBDdWxsRGlzdGFuY2U6ZmFsc2UsbXVsdGlEcmF3OmZhbHNlfX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5leHRlbnNpb25zID0ge1xyXG5cdFx0XHRjbGlwQ3VsbERpc3RhbmNlOiBmYWxzZSwgLy8gc2V0IHRvIHVzZSB2ZXJ0ZXggc2hhZGVyIGNsaXBwaW5nXHJcblx0XHRcdG11bHRpRHJhdzogZmFsc2UgLy8gc2V0IHRvIHVzZSB2ZXJ0ZXggc2hhZGVyIG11bHRpX2RyYXcgLyBlbmFibGUgZ2xfRHJhd0lEXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hlbiB0aGUgcmVuZGVyZWQgZ2VvbWV0cnkgZG9lc24ndCBpbmNsdWRlIHRoZXNlIGF0dHJpYnV0ZXMgYnV0IHRoZVxyXG5cdFx0ICogbWF0ZXJpYWwgZG9lcywgdGhlc2UgZGVmYXVsdCB2YWx1ZXMgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHNoYWRlcnMuIFRoaXNcclxuXHRcdCAqIGF2b2lkcyBlcnJvcnMgd2hlbiBidWZmZXIgZGF0YSBpcyBtaXNzaW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIC0gY29sb3I6IFsgMSwgMSwgMSBdXHJcblx0XHQgKiAtIHV2OiBbIDAsIDAgXVxyXG5cdFx0ICogLSB1djE6IFsgMCwgMCBdXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kZWZhdWx0QXR0cmlidXRlVmFsdWVzID0ge1xyXG5cdFx0XHQnY29sb3InOiBbIDEsIDEsIDEgXSxcclxuXHRcdFx0J3V2JzogWyAwLCAwIF0sXHJcblx0XHRcdCd1djEnOiBbIDAsIDAgXVxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIElmIHNldCwgdGhpcyBjYWxscyBbZ2wuYmluZEF0dHJpYkxvY2F0aW9uXXtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2ViR0xSZW5kZXJpbmdDb250ZXh0L2JpbmRBdHRyaWJMb2NhdGlvbn1cclxuXHRcdCAqIHRvIGJpbmQgYSBnZW5lcmljIHZlcnRleCBpbmRleCB0byBhbiBhdHRyaWJ1dGUgdmFyaWFibGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ3x1bmRlZmluZWR9XHJcblx0XHQgKiBAZGVmYXVsdCB1bmRlZmluZWRcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pbmRleDBBdHRyaWJ1dGVOYW1lID0gdW5kZWZpbmVkO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQ2FuIGJlIHVzZWQgdG8gZm9yY2UgYSB1bmlmb3JtIHVwZGF0ZSB3aGlsZSBjaGFuZ2luZyB1bmlmb3JtcyBpblxyXG5cdFx0ICoge0BsaW5rIE9iamVjdDNEI29uQmVmb3JlUmVuZGVyfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudW5pZm9ybXNOZWVkVXBkYXRlID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIHRoZSBHTFNMIHZlcnNpb24gb2YgY3VzdG9tIHNoYWRlciBjb2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/KEdMU0wxfEdMU0wzKX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nbHNsVmVyc2lvbiA9IG51bGw7XHJcblxyXG5cdFx0aWYgKCBwYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy5mcmFnbWVudFNoYWRlciA9IHNvdXJjZS5mcmFnbWVudFNoYWRlcjtcclxuXHRcdHRoaXMudmVydGV4U2hhZGVyID0gc291cmNlLnZlcnRleFNoYWRlcjtcclxuXHJcblx0XHR0aGlzLnVuaWZvcm1zID0gY2xvbmVVbmlmb3Jtcyggc291cmNlLnVuaWZvcm1zICk7XHJcblx0XHR0aGlzLnVuaWZvcm1zR3JvdXBzID0gY2xvbmVVbmlmb3Jtc0dyb3Vwcyggc291cmNlLnVuaWZvcm1zR3JvdXBzICk7XHJcblxyXG5cdFx0dGhpcy5kZWZpbmVzID0gT2JqZWN0LmFzc2lnbigge30sIHNvdXJjZS5kZWZpbmVzICk7XHJcblxyXG5cdFx0dGhpcy53aXJlZnJhbWUgPSBzb3VyY2Uud2lyZWZyYW1lO1xyXG5cdFx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoO1xyXG5cclxuXHRcdHRoaXMuZm9nID0gc291cmNlLmZvZztcclxuXHRcdHRoaXMubGlnaHRzID0gc291cmNlLmxpZ2h0cztcclxuXHRcdHRoaXMuY2xpcHBpbmcgPSBzb3VyY2UuY2xpcHBpbmc7XHJcblxyXG5cdFx0dGhpcy5leHRlbnNpb25zID0gT2JqZWN0LmFzc2lnbigge30sIHNvdXJjZS5leHRlbnNpb25zICk7XHJcblxyXG5cdFx0dGhpcy5nbHNsVmVyc2lvbiA9IHNvdXJjZS5nbHNsVmVyc2lvbjtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHR0b0pTT04oIG1ldGEgKSB7XHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IHN1cGVyLnRvSlNPTiggbWV0YSApO1xyXG5cclxuXHRcdGRhdGEuZ2xzbFZlcnNpb24gPSB0aGlzLmdsc2xWZXJzaW9uO1xyXG5cdFx0ZGF0YS51bmlmb3JtcyA9IHt9O1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IG5hbWUgaW4gdGhpcy51bmlmb3JtcyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHVuaWZvcm0gPSB0aGlzLnVuaWZvcm1zWyBuYW1lIF07XHJcblx0XHRcdGNvbnN0IHZhbHVlID0gdW5pZm9ybS52YWx1ZTtcclxuXHJcblx0XHRcdGlmICggdmFsdWUgJiYgdmFsdWUuaXNUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0XHRkYXRhLnVuaWZvcm1zWyBuYW1lIF0gPSB7XHJcblx0XHRcdFx0XHR0eXBlOiAndCcsXHJcblx0XHRcdFx0XHR2YWx1ZTogdmFsdWUudG9KU09OKCBtZXRhICkudXVpZFxyXG5cdFx0XHRcdH07XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCB2YWx1ZSAmJiB2YWx1ZS5pc0NvbG9yICkge1xyXG5cclxuXHRcdFx0XHRkYXRhLnVuaWZvcm1zWyBuYW1lIF0gPSB7XHJcblx0XHRcdFx0XHR0eXBlOiAnYycsXHJcblx0XHRcdFx0XHR2YWx1ZTogdmFsdWUuZ2V0SGV4KClcclxuXHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggdmFsdWUgJiYgdmFsdWUuaXNWZWN0b3IyICkge1xyXG5cclxuXHRcdFx0XHRkYXRhLnVuaWZvcm1zWyBuYW1lIF0gPSB7XHJcblx0XHRcdFx0XHR0eXBlOiAndjInLFxyXG5cdFx0XHRcdFx0dmFsdWU6IHZhbHVlLnRvQXJyYXkoKVxyXG5cdFx0XHRcdH07XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCB2YWx1ZSAmJiB2YWx1ZS5pc1ZlY3RvcjMgKSB7XHJcblxyXG5cdFx0XHRcdGRhdGEudW5pZm9ybXNbIG5hbWUgXSA9IHtcclxuXHRcdFx0XHRcdHR5cGU6ICd2MycsXHJcblx0XHRcdFx0XHR2YWx1ZTogdmFsdWUudG9BcnJheSgpXHJcblx0XHRcdFx0fTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIHZhbHVlICYmIHZhbHVlLmlzVmVjdG9yNCApIHtcclxuXHJcblx0XHRcdFx0ZGF0YS51bmlmb3Jtc1sgbmFtZSBdID0ge1xyXG5cdFx0XHRcdFx0dHlwZTogJ3Y0JyxcclxuXHRcdFx0XHRcdHZhbHVlOiB2YWx1ZS50b0FycmF5KClcclxuXHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggdmFsdWUgJiYgdmFsdWUuaXNNYXRyaXgzICkge1xyXG5cclxuXHRcdFx0XHRkYXRhLnVuaWZvcm1zWyBuYW1lIF0gPSB7XHJcblx0XHRcdFx0XHR0eXBlOiAnbTMnLFxyXG5cdFx0XHRcdFx0dmFsdWU6IHZhbHVlLnRvQXJyYXkoKVxyXG5cdFx0XHRcdH07XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCB2YWx1ZSAmJiB2YWx1ZS5pc01hdHJpeDQgKSB7XHJcblxyXG5cdFx0XHRcdGRhdGEudW5pZm9ybXNbIG5hbWUgXSA9IHtcclxuXHRcdFx0XHRcdHR5cGU6ICdtNCcsXHJcblx0XHRcdFx0XHR2YWx1ZTogdmFsdWUudG9BcnJheSgpXHJcblx0XHRcdFx0fTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGRhdGEudW5pZm9ybXNbIG5hbWUgXSA9IHtcclxuXHRcdFx0XHRcdHZhbHVlOiB2YWx1ZVxyXG5cdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdC8vIG5vdGU6IHRoZSBhcnJheSB2YXJpYW50cyB2MnYsIHYzdiwgdjR2LCBtNHYgYW5kIHR2IGFyZSBub3Qgc3VwcG9ydGVkIHNvIGZhclxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIE9iamVjdC5rZXlzKCB0aGlzLmRlZmluZXMgKS5sZW5ndGggPiAwICkgZGF0YS5kZWZpbmVzID0gdGhpcy5kZWZpbmVzO1xyXG5cclxuXHRcdGRhdGEudmVydGV4U2hhZGVyID0gdGhpcy52ZXJ0ZXhTaGFkZXI7XHJcblx0XHRkYXRhLmZyYWdtZW50U2hhZGVyID0gdGhpcy5mcmFnbWVudFNoYWRlcjtcclxuXHJcblx0XHRkYXRhLmxpZ2h0cyA9IHRoaXMubGlnaHRzO1xyXG5cdFx0ZGF0YS5jbGlwcGluZyA9IHRoaXMuY2xpcHBpbmc7XHJcblxyXG5cdFx0Y29uc3QgZXh0ZW5zaW9ucyA9IHt9O1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IGtleSBpbiB0aGlzLmV4dGVuc2lvbnMgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMuZXh0ZW5zaW9uc1sga2V5IF0gPT09IHRydWUgKSBleHRlbnNpb25zWyBrZXkgXSA9IHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggT2JqZWN0LmtleXMoIGV4dGVuc2lvbnMgKS5sZW5ndGggPiAwICkgZGF0YS5leHRlbnNpb25zID0gZXh0ZW5zaW9ucztcclxuXHJcblx0XHRyZXR1cm4gZGF0YTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFRoaXMgdHlwZSByZXByZXNlbnRzIHRoZSBmaWVsZHMgcmVxdWlyZWQgdG8gc3RvcmUgYW5kIHJ1biB0aGUgc2hhZGVyIGNvZGUuXHJcbiAqXHJcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNoYWRlck1hdGVyaWFsflNoYWRlclxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBzaGFkZXIuXHJcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0PHN0cmluZywgVW5pZm9ybT59IHVuaWZvcm1zIC0gVGhlIHVuaWZvcm1zIG9mIHRoZSBzaGFkZXIuXHJcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0PHN0cmluZywgYW55Pn0gZGVmaW5lcyAtIFRoZSBkZWZpbmVzIG9mIHRoZSBzaGFkZXIuXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB2ZXJ0ZXhTaGFkZXIgLSBUaGUgdmVydGV4IHNoYWRlciBjb2RlLlxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZnJhZ21lbnRTaGFkZXIgLSBUaGUgZnJhZ21lbnQgc2hhZGVyIGNvZGUuXHJcbiAqKi9cclxuXHJcbmV4cG9ydCB7IFNoYWRlck1hdGVyaWFsIH07XHJcbiIsImltcG9ydCB7IFdlYkdMQ29vcmRpbmF0ZVN5c3RlbSB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IE1hdHJpeDQgfSBmcm9tICcuLi9tYXRoL01hdHJpeDQuanMnO1xyXG5pbXBvcnQgeyBPYmplY3QzRCB9IGZyb20gJy4uL2NvcmUvT2JqZWN0M0QuanMnO1xyXG5cclxuLyoqXHJcbiAqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGNhbWVyYXMuIFRoaXMgY2xhc3Mgc2hvdWxkIGFsd2F5cyBiZSBpbmhlcml0ZWRcclxuICogd2hlbiB5b3UgYnVpbGQgYSBuZXcgY2FtZXJhLlxyXG4gKlxyXG4gKiBAYWJzdHJhY3RcclxuICogQGF1Z21lbnRzIE9iamVjdDNEXHJcbiAqL1xyXG5jbGFzcyBDYW1lcmEgZXh0ZW5kcyBPYmplY3QzRCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgY2FtZXJhLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzQ2FtZXJhID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnQ2FtZXJhJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBpbnZlcnNlIG9mIHRoZSBjYW1lcmEncyB3b3JsZCBtYXRyaXguXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge01hdHJpeDR9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWF0cml4V29ybGRJbnZlcnNlID0gbmV3IE1hdHJpeDQoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjYW1lcmEncyBwcm9qZWN0aW9uIG1hdHJpeC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7TWF0cml4NH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wcm9qZWN0aW9uTWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBpbnZlcnNlIG9mIHRoZSBjYW1lcmEncyBwcm9qZWN0aW9uIG1hdHJpeC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7TWF0cml4NH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSA9IG5ldyBNYXRyaXg0KCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY29vcmRpbmF0ZSBzeXN0ZW0gaW4gd2hpY2ggdGhlIGNhbWVyYSBpcyB1c2VkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoV2ViR0xDb29yZGluYXRlU3lzdGVtfFdlYkdQVUNvb3JkaW5hdGVTeXN0ZW0pfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvb3JkaW5hdGVTeXN0ZW0gPSBXZWJHTENvb3JkaW5hdGVTeXN0ZW07XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlLCByZWN1cnNpdmUgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlLCByZWN1cnNpdmUgKTtcclxuXHJcblx0XHR0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZS5jb3B5KCBzb3VyY2UubWF0cml4V29ybGRJbnZlcnNlICk7XHJcblxyXG5cdFx0dGhpcy5wcm9qZWN0aW9uTWF0cml4LmNvcHkoIHNvdXJjZS5wcm9qZWN0aW9uTWF0cml4ICk7XHJcblx0XHR0aGlzLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkoIHNvdXJjZS5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSApO1xyXG5cclxuXHRcdHRoaXMuY29vcmRpbmF0ZVN5c3RlbSA9IHNvdXJjZS5jb29yZGluYXRlU3lzdGVtO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSB2ZWN0b3IgcmVwcmVzZW50aW5nIHRoZSAoXCJsb29rXCIpIGRpcmVjdGlvbiBvZiB0aGUgM0Qgb2JqZWN0IGluIHdvcmxkIHNwYWNlLlxyXG5cdCAqXHJcblx0ICogVGhpcyBtZXRob2QgaXMgb3ZlcndyaXR0ZW4gc2luY2UgY2FtZXJhcyBoYXZlIGEgZGlmZmVyZW50IGZvcndhcmQgdmVjdG9yIGNvbXBhcmVkIHRvIG90aGVyXHJcblx0ICogM0Qgb2JqZWN0cy4gQSBjYW1lcmEgbG9va3MgZG93biBpdHMgbG9jYWwsIG5lZ2F0aXZlIHotYXhpcyBieSBkZWZhdWx0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IHZlY3RvciB0aGUgcmVzdWx0IGlzIHN0b3JlZCB0by5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBUaGUgM0Qgb2JqZWN0J3MgZGlyZWN0aW9uIGluIHdvcmxkIHNwYWNlLlxyXG5cdCAqL1xyXG5cdGdldFdvcmxkRGlyZWN0aW9uKCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHN1cGVyLmdldFdvcmxkRGlyZWN0aW9uKCB0YXJnZXQgKS5uZWdhdGUoKTtcclxuXHJcblx0fVxyXG5cclxuXHR1cGRhdGVNYXRyaXhXb3JsZCggZm9yY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIudXBkYXRlTWF0cml4V29ybGQoIGZvcmNlICk7XHJcblxyXG5cdFx0dGhpcy5tYXRyaXhXb3JsZEludmVyc2UuY29weSggdGhpcy5tYXRyaXhXb3JsZCApLmludmVydCgpO1xyXG5cclxuXHR9XHJcblxyXG5cdHVwZGF0ZVdvcmxkTWF0cml4KCB1cGRhdGVQYXJlbnRzLCB1cGRhdGVDaGlsZHJlbiApIHtcclxuXHJcblx0XHRzdXBlci51cGRhdGVXb3JsZE1hdHJpeCggdXBkYXRlUGFyZW50cywgdXBkYXRlQ2hpbGRyZW4gKTtcclxuXHJcblx0XHR0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZS5jb3B5KCB0aGlzLm1hdHJpeFdvcmxkICkuaW52ZXJ0KCk7XHJcblxyXG5cdH1cclxuXHJcblx0Y2xvbmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBDYW1lcmEgfTtcclxuIiwiaW1wb3J0IHsgQ2FtZXJhIH0gZnJvbSAnLi9DYW1lcmEuanMnO1xyXG5pbXBvcnQgeyBSQUQyREVHLCBERUcyUkFEIH0gZnJvbSAnLi4vbWF0aC9NYXRoVXRpbHMuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IyLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcblxyXG5jb25zdCBfdjMgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF9taW5UYXJnZXQgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IyKCk7XHJcbmNvbnN0IF9tYXhUYXJnZXQgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IyKCk7XHJcblxyXG4vKipcclxuICogQ2FtZXJhIHRoYXQgdXNlcyBbcGVyc3BlY3RpdmUgcHJvamVjdGlvbl17QGxpbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUGVyc3BlY3RpdmVfKGdyYXBoaWNhbCl9LlxyXG4gKlxyXG4gKiBUaGlzIHByb2plY3Rpb24gbW9kZSBpcyBkZXNpZ25lZCB0byBtaW1pYyB0aGUgd2F5IHRoZSBodW1hbiBleWUgc2Vlcy4gSXRcclxuICogaXMgdGhlIG1vc3QgY29tbW9uIHByb2plY3Rpb24gbW9kZSB1c2VkIGZvciByZW5kZXJpbmcgYSAzRCBzY2VuZS5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgY2FtZXJhID0gbmV3IFRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhKCA0NSwgd2lkdGggLyBoZWlnaHQsIDEsIDEwMDAgKTtcclxuICogc2NlbmUuYWRkKCBjYW1lcmEgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBDYW1lcmFcclxuICovXHJcbmNsYXNzIFBlcnNwZWN0aXZlQ2FtZXJhIGV4dGVuZHMgQ2FtZXJhIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBwZXJzcGVjdGl2ZSBjYW1lcmEuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2Zvdj01MF0gLSBUaGUgdmVydGljYWwgZmllbGQgb2Ygdmlldy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2FzcGVjdD0xXSAtIFRoZSBhc3BlY3QgcmF0aW8uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuZWFyPTAuMV0gLSBUaGUgY2FtZXJhJ3MgbmVhciBwbGFuZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2Zhcj0yMDAwXSAtIFRoZSBjYW1lcmEncyBmYXIgcGxhbmUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGZvdiA9IDUwLCBhc3BlY3QgPSAxLCBuZWFyID0gMC4xLCBmYXIgPSAyMDAwICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzUGVyc3BlY3RpdmVDYW1lcmEgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdQZXJzcGVjdGl2ZUNhbWVyYSc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdmVydGljYWwgZmllbGQgb2YgdmlldywgZnJvbSBib3R0b20gdG8gdG9wIG9mIHZpZXcsXHJcblx0XHQgKiBpbiBkZWdyZWVzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCA1MFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZvdiA9IGZvdjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB6b29tIGZhY3RvciBvZiB0aGUgY2FtZXJhLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuem9vbSA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY2FtZXJhJ3MgbmVhciBwbGFuZS4gVGhlIHZhbGlkIHJhbmdlIGlzIGdyZWF0ZXIgdGhhbiBgMGBcclxuXHRcdCAqIGFuZCBsZXNzIHRoYW4gdGhlIGN1cnJlbnQgdmFsdWUgb2Yge0BsaW5rIFBlcnNwZWN0aXZlQ2FtZXJhI2Zhcn0uXHJcblx0XHQgKlxyXG5cdFx0ICogTm90ZSB0aGF0LCB1bmxpa2UgZm9yIHRoZSB7QGxpbmsgT3J0aG9ncmFwaGljQ2FtZXJhfSwgYDBgIGlzIDxlbT5ub3Q8L2VtPiBhXHJcblx0XHQgKiB2YWxpZCB2YWx1ZSBmb3IgYSBwZXJzcGVjdGl2ZSBjYW1lcmEncyBuZWFyIHBsYW5lLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwLjFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5uZWFyID0gbmVhcjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjYW1lcmEncyBmYXIgcGxhbmUuIE11c3QgYmUgZ3JlYXRlciB0aGFuIHRoZVxyXG5cdFx0ICogY3VycmVudCB2YWx1ZSBvZiB7QGxpbmsgUGVyc3BlY3RpdmVDYW1lcmEjbmVhcn0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDIwMDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5mYXIgPSBmYXI7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBPYmplY3QgZGlzdGFuY2UgdXNlZCBmb3Igc3RlcmVvc2NvcHkgYW5kIGRlcHRoLW9mLWZpZWxkIGVmZmVjdHMuIFRoaXNcclxuXHRcdCAqIHBhcmFtZXRlciBkb2VzIG5vdCBpbmZsdWVuY2UgdGhlIHByb2plY3Rpb24gbWF0cml4IHVubGVzcyBhXHJcblx0XHQgKiB7QGxpbmsgU3RlcmVvQ2FtZXJhfSBpcyBiZWluZyB1c2VkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZvY3VzID0gMTA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYXNwZWN0IHJhdGlvLCB1c3VhbGx5IHRoZSBjYW52YXMgd2lkdGggLyBjYW52YXMgaGVpZ2h0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYXNwZWN0ID0gYXNwZWN0O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVwcmVzZW50cyB0aGUgZnJ1c3R1bSB3aW5kb3cgc3BlY2lmaWNhdGlvbi4gVGhpcyBwcm9wZXJ0eSBzaG91bGQgbm90IGJlIGVkaXRlZFxyXG5cdFx0ICogZGlyZWN0bHkgYnV0IHZpYSB7QGxpbmsgUGVyc3BlY3RpdmVDYW1lcmEjc2V0Vmlld09mZnNldH0gYW5kIHtAbGluayBQZXJzcGVjdGl2ZUNhbWVyYSNjbGVhclZpZXdPZmZzZXR9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/T2JqZWN0fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnZpZXcgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRmlsbSBzaXplIHVzZWQgZm9yIHRoZSBsYXJnZXIgYXhpcy4gRGVmYXVsdCBpcyBgMzVgIChtaWxsaW1ldGVycykuIFRoaXNcclxuXHRcdCAqIHBhcmFtZXRlciBkb2VzIG5vdCBpbmZsdWVuY2UgdGhlIHByb2plY3Rpb24gbWF0cml4IHVubGVzcyB7QGxpbmsgUGVyc3BlY3RpdmVDYW1lcmEjZmlsbU9mZnNldH1cclxuXHRcdCAqIGlzIHNldCB0byBhIG5vbnplcm8gdmFsdWUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDM1XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZmlsbUdhdWdlID0gMzU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3Jpem9udGFsIG9mZi1jZW50ZXIgb2Zmc2V0IGluIHRoZSBzYW1lIHVuaXQgYXMge0BsaW5rIFBlcnNwZWN0aXZlQ2FtZXJhI2ZpbG1HYXVnZX0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5maWxtT2Zmc2V0ID0gMDtcclxuXHJcblx0XHR0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UsIHJlY3Vyc2l2ZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UsIHJlY3Vyc2l2ZSApO1xyXG5cclxuXHRcdHRoaXMuZm92ID0gc291cmNlLmZvdjtcclxuXHRcdHRoaXMuem9vbSA9IHNvdXJjZS56b29tO1xyXG5cclxuXHRcdHRoaXMubmVhciA9IHNvdXJjZS5uZWFyO1xyXG5cdFx0dGhpcy5mYXIgPSBzb3VyY2UuZmFyO1xyXG5cdFx0dGhpcy5mb2N1cyA9IHNvdXJjZS5mb2N1cztcclxuXHJcblx0XHR0aGlzLmFzcGVjdCA9IHNvdXJjZS5hc3BlY3Q7XHJcblx0XHR0aGlzLnZpZXcgPSBzb3VyY2UudmlldyA9PT0gbnVsbCA/IG51bGwgOiBPYmplY3QuYXNzaWduKCB7fSwgc291cmNlLnZpZXcgKTtcclxuXHJcblx0XHR0aGlzLmZpbG1HYXVnZSA9IHNvdXJjZS5maWxtR2F1Z2U7XHJcblx0XHR0aGlzLmZpbG1PZmZzZXQgPSBzb3VyY2UuZmlsbU9mZnNldDtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBGT1YgYnkgZm9jYWwgbGVuZ3RoIGluIHJlc3BlY3QgdG8gdGhlIGN1cnJlbnQge0BsaW5rIFBlcnNwZWN0aXZlQ2FtZXJhI2ZpbG1HYXVnZX0uXHJcblx0ICpcclxuXHQgKiBUaGUgZGVmYXVsdCBmaWxtIGdhdWdlIGlzIDM1LCBzbyB0aGF0IHRoZSBmb2NhbCBsZW5ndGggY2FuIGJlIHNwZWNpZmllZCBmb3JcclxuXHQgKiBhIDM1bW0gKGZ1bGwgZnJhbWUpIGNhbWVyYS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBmb2NhbExlbmd0aCAtIFZhbHVlcyBmb3IgZm9jYWwgbGVuZ3RoIGFuZCBmaWxtIGdhdWdlIG11c3QgaGF2ZSB0aGUgc2FtZSB1bml0LlxyXG5cdCAqL1xyXG5cdHNldEZvY2FsTGVuZ3RoKCBmb2NhbExlbmd0aCApIHtcclxuXHJcblx0XHQvKiogc2VlIHtAbGluayBodHRwOi8vd3d3LmJvYmF0a2lucy5jb20vcGhvdG9ncmFwaHkvdGVjaG5pY2FsL2ZpZWxkX29mX3ZpZXcuaHRtbH0gKi9cclxuXHRcdGNvbnN0IHZFeHRlbnRTbG9wZSA9IDAuNSAqIHRoaXMuZ2V0RmlsbUhlaWdodCgpIC8gZm9jYWxMZW5ndGg7XHJcblxyXG5cdFx0dGhpcy5mb3YgPSBSQUQyREVHICogMiAqIE1hdGguYXRhbiggdkV4dGVudFNsb3BlICk7XHJcblx0XHR0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBmb2NhbCBsZW5ndGggZnJvbSB0aGUgY3VycmVudCB7QGxpbmsgUGVyc3BlY3RpdmVDYW1lcmEjZm92fSBhbmRcclxuXHQgKiB7QGxpbmsgUGVyc3BlY3RpdmVDYW1lcmEjZmlsbUdhdWdlfS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGNvbXB1dGVkIGZvY2FsIGxlbmd0aC5cclxuXHQgKi9cclxuXHRnZXRGb2NhbExlbmd0aCgpIHtcclxuXHJcblx0XHRjb25zdCB2RXh0ZW50U2xvcGUgPSBNYXRoLnRhbiggREVHMlJBRCAqIDAuNSAqIHRoaXMuZm92ICk7XHJcblxyXG5cdFx0cmV0dXJuIDAuNSAqIHRoaXMuZ2V0RmlsbUhlaWdodCgpIC8gdkV4dGVudFNsb3BlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGN1cnJlbnQgdmVydGljYWwgZmllbGQgb2YgdmlldyBhbmdsZSBpbiBkZWdyZWVzIGNvbnNpZGVyaW5nIHtAbGluayBQZXJzcGVjdGl2ZUNhbWVyYSN6b29tfS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGVmZmVjdGl2ZSBGT1YuXHJcblx0ICovXHJcblx0Z2V0RWZmZWN0aXZlRk9WKCkge1xyXG5cclxuXHRcdHJldHVybiBSQUQyREVHICogMiAqIE1hdGguYXRhbihcclxuXHRcdFx0TWF0aC50YW4oIERFRzJSQUQgKiAwLjUgKiB0aGlzLmZvdiApIC8gdGhpcy56b29tICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgd2lkdGggb2YgdGhlIGltYWdlIG9uIHRoZSBmaWxtLiBJZiB7QGxpbmsgUGVyc3BlY3RpdmVDYW1lcmEjYXNwZWN0fSBpcyBncmVhdGVyIHRoYW4gb3JcclxuXHQgKiBlcXVhbCB0byBvbmUgKGxhbmRzY2FwZSBmb3JtYXQpLCB0aGUgcmVzdWx0IGVxdWFscyB7QGxpbmsgUGVyc3BlY3RpdmVDYW1lcmEjZmlsbUdhdWdlfS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGZpbG0gd2lkdGguXHJcblx0ICovXHJcblx0Z2V0RmlsbVdpZHRoKCkge1xyXG5cclxuXHRcdC8vIGZpbG0gbm90IGNvbXBsZXRlbHkgY292ZXJlZCBpbiBwb3J0cmFpdCBmb3JtYXQgKGFzcGVjdCA8IDEpXHJcblx0XHRyZXR1cm4gdGhpcy5maWxtR2F1Z2UgKiBNYXRoLm1pbiggdGhpcy5hc3BlY3QsIDEgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlIG9uIHRoZSBmaWxtLiBJZiB7QGxpbmsgUGVyc3BlY3RpdmVDYW1lcmEjYXNwZWN0fSBpcyBncmVhdGVyIHRoYW4gb3JcclxuXHQgKiBlcXVhbCB0byBvbmUgKGxhbmRzY2FwZSBmb3JtYXQpLCB0aGUgcmVzdWx0IGVxdWFscyB7QGxpbmsgUGVyc3BlY3RpdmVDYW1lcmEjZmlsbUdhdWdlfS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGZpbG0gd2lkdGguXHJcblx0ICovXHJcblx0Z2V0RmlsbUhlaWdodCgpIHtcclxuXHJcblx0XHQvLyBmaWxtIG5vdCBjb21wbGV0ZWx5IGNvdmVyZWQgaW4gbGFuZHNjYXBlIGZvcm1hdCAoYXNwZWN0ID4gMSlcclxuXHRcdHJldHVybiB0aGlzLmZpbG1HYXVnZSAvIE1hdGgubWF4KCB0aGlzLmFzcGVjdCwgMSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSAyRCBib3VuZHMgb2YgdGhlIGNhbWVyYSdzIHZpZXdhYmxlIHJlY3RhbmdsZSBhdCBhIGdpdmVuIGRpc3RhbmNlIGFsb25nIHRoZSB2aWV3aW5nIGRpcmVjdGlvbi5cclxuXHQgKiBTZXRzIGBtaW5UYXJnZXRgIGFuZCBgbWF4VGFyZ2V0YCB0byB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIGxvd2VyLWxlZnQgYW5kIHVwcGVyLXJpZ2h0IGNvcm5lcnMgb2YgdGhlIHZpZXcgcmVjdGFuZ2xlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGRpc3RhbmNlIC0gVGhlIHZpZXdpbmcgZGlzdGFuY2UuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSBtaW5UYXJnZXQgLSBUaGUgbG93ZXItbGVmdCBjb3JuZXIgb2YgdGhlIHZpZXcgcmVjdGFuZ2xlIGlzIHdyaXR0ZW4gaW50byB0aGlzIHZlY3Rvci5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IG1heFRhcmdldCAtIFRoZSB1cHBlci1yaWdodCBjb3JuZXIgb2YgdGhlIHZpZXcgcmVjdGFuZ2xlIGlzIHdyaXR0ZW4gaW50byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRnZXRWaWV3Qm91bmRzKCBkaXN0YW5jZSwgbWluVGFyZ2V0LCBtYXhUYXJnZXQgKSB7XHJcblxyXG5cdFx0X3YzLnNldCggLSAxLCAtIDEsIDAuNSApLmFwcGx5TWF0cml4NCggdGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSApO1xyXG5cclxuXHRcdG1pblRhcmdldC5zZXQoIF92My54LCBfdjMueSApLm11bHRpcGx5U2NhbGFyKCAtIGRpc3RhbmNlIC8gX3YzLnogKTtcclxuXHJcblx0XHRfdjMuc2V0KCAxLCAxLCAwLjUgKS5hcHBseU1hdHJpeDQoIHRoaXMucHJvamVjdGlvbk1hdHJpeEludmVyc2UgKTtcclxuXHJcblx0XHRtYXhUYXJnZXQuc2V0KCBfdjMueCwgX3YzLnkgKS5tdWx0aXBseVNjYWxhciggLSBkaXN0YW5jZSAvIF92My56ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGNhbWVyYSdzIHZpZXdhYmxlIHJlY3RhbmdsZSBhdCBhIGdpdmVuIGRpc3RhbmNlIGFsb25nIHRoZSB2aWV3aW5nIGRpcmVjdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBkaXN0YW5jZSAtIFRoZSB2aWV3aW5nIGRpc3RhbmNlLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gdGFyZ2V0IC0gVGhlIHRhcmdldCB2ZWN0b3IgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHJlc3VsdCB3aGVyZSB4IGlzIHdpZHRoIGFuZCB5IGlzIGhlaWdodC5cclxuXHQgKiBAcmV0dXJucyB7VmVjdG9yMn0gVGhlIHZpZXcgc2l6ZS5cclxuXHQgKi9cclxuXHRnZXRWaWV3U2l6ZSggZGlzdGFuY2UsIHRhcmdldCApIHtcclxuXHJcblx0XHR0aGlzLmdldFZpZXdCb3VuZHMoIGRpc3RhbmNlLCBfbWluVGFyZ2V0LCBfbWF4VGFyZ2V0ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRhcmdldC5zdWJWZWN0b3JzKCBfbWF4VGFyZ2V0LCBfbWluVGFyZ2V0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyBhbiBvZmZzZXQgaW4gYSBsYXJnZXIgZnJ1c3R1bS4gVGhpcyBpcyB1c2VmdWwgZm9yIG11bHRpLXdpbmRvdyBvclxyXG5cdCAqIG11bHRpLW1vbml0b3IvbXVsdGktbWFjaGluZSBzZXR1cHMuXHJcblx0ICpcclxuXHQgKiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgM3gyIG1vbml0b3JzIGFuZCBlYWNoIG1vbml0b3IgaXMgMTkyMHgxMDgwIGFuZFxyXG5cdCAqIHRoZSBtb25pdG9ycyBhcmUgaW4gZ3JpZCBsaWtlIHRoaXNcclxuXHQgKmBgYFxyXG5cdCAqICAgKy0tLSstLS0rLS0tK1xyXG5cdCAqICAgfCBBIHwgQiB8IEMgfFxyXG5cdCAqICAgKy0tLSstLS0rLS0tK1xyXG5cdCAqICAgfCBEIHwgRSB8IEYgfFxyXG5cdCAqICAgKy0tLSstLS0rLS0tK1xyXG5cdCAqYGBgXHJcblx0ICogdGhlbiBmb3IgZWFjaCBtb25pdG9yIHlvdSB3b3VsZCBjYWxsIGl0IGxpa2UgdGhpczpcclxuXHQgKmBgYGpzXHJcblx0ICogY29uc3QgdyA9IDE5MjA7XHJcblx0ICogY29uc3QgaCA9IDEwODA7XHJcblx0ICogY29uc3QgZnVsbFdpZHRoID0gdyAqIDM7XHJcblx0ICogY29uc3QgZnVsbEhlaWdodCA9IGggKiAyO1xyXG5cdCAqXHJcblx0ICogLy8gLS1BLS1cclxuXHQgKiBjYW1lcmEuc2V0Vmlld09mZnNldCggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB3ICogMCwgaCAqIDAsIHcsIGggKTtcclxuXHQgKiAvLyAtLUItLVxyXG5cdCAqIGNhbWVyYS5zZXRWaWV3T2Zmc2V0KCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHcgKiAxLCBoICogMCwgdywgaCApO1xyXG5cdCAqIC8vIC0tQy0tXHJcblx0ICogY2FtZXJhLnNldFZpZXdPZmZzZXQoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgdyAqIDIsIGggKiAwLCB3LCBoICk7XHJcblx0ICogLy8gLS1ELS1cclxuXHQgKiBjYW1lcmEuc2V0Vmlld09mZnNldCggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB3ICogMCwgaCAqIDEsIHcsIGggKTtcclxuXHQgKiAvLyAtLUUtLVxyXG5cdCAqIGNhbWVyYS5zZXRWaWV3T2Zmc2V0KCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHcgKiAxLCBoICogMSwgdywgaCApO1xyXG5cdCAqIC8vIC0tRi0tXHJcblx0ICogY2FtZXJhLnNldFZpZXdPZmZzZXQoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgdyAqIDIsIGggKiAxLCB3LCBoICk7XHJcblx0ICogYGBgXHJcblx0ICpcclxuXHQgKiBOb3RlIHRoZXJlIGlzIG5vIHJlYXNvbiBtb25pdG9ycyBoYXZlIHRvIGJlIHRoZSBzYW1lIHNpemUgb3IgaW4gYSBncmlkLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGZ1bGxXaWR0aCAtIFRoZSBmdWxsIHdpZHRoIG9mIG11bHRpdmlldyBzZXR1cC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZnVsbEhlaWdodCAtIFRoZSBmdWxsIGhlaWdodCBvZiBtdWx0aXZpZXcgc2V0dXAuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgaG9yaXpvbnRhbCBvZmZzZXQgb2YgdGhlIHN1YmNhbWVyYS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB2ZXJ0aWNhbCBvZmZzZXQgb2YgdGhlIHN1YmNhbWVyYS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2Ygc3ViY2FtZXJhLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHN1YmNhbWVyYS5cclxuXHQgKi9cclxuXHRzZXRWaWV3T2Zmc2V0KCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHgsIHksIHdpZHRoLCBoZWlnaHQgKSB7XHJcblxyXG5cdFx0dGhpcy5hc3BlY3QgPSBmdWxsV2lkdGggLyBmdWxsSGVpZ2h0O1xyXG5cclxuXHRcdGlmICggdGhpcy52aWV3ID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy52aWV3ID0ge1xyXG5cdFx0XHRcdGVuYWJsZWQ6IHRydWUsXHJcblx0XHRcdFx0ZnVsbFdpZHRoOiAxLFxyXG5cdFx0XHRcdGZ1bGxIZWlnaHQ6IDEsXHJcblx0XHRcdFx0b2Zmc2V0WDogMCxcclxuXHRcdFx0XHRvZmZzZXRZOiAwLFxyXG5cdFx0XHRcdHdpZHRoOiAxLFxyXG5cdFx0XHRcdGhlaWdodDogMVxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnZpZXcuZW5hYmxlZCA9IHRydWU7XHJcblx0XHR0aGlzLnZpZXcuZnVsbFdpZHRoID0gZnVsbFdpZHRoO1xyXG5cdFx0dGhpcy52aWV3LmZ1bGxIZWlnaHQgPSBmdWxsSGVpZ2h0O1xyXG5cdFx0dGhpcy52aWV3Lm9mZnNldFggPSB4O1xyXG5cdFx0dGhpcy52aWV3Lm9mZnNldFkgPSB5O1xyXG5cdFx0dGhpcy52aWV3LndpZHRoID0gd2lkdGg7XHJcblx0XHR0aGlzLnZpZXcuaGVpZ2h0ID0gaGVpZ2h0O1xyXG5cclxuXHRcdHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbW92ZXMgdGhlIHZpZXcgb2Zmc2V0IGZyb20gdGhlIHByb2plY3Rpb24gbWF0cml4LlxyXG5cdCAqL1xyXG5cdGNsZWFyVmlld09mZnNldCgpIHtcclxuXHJcblx0XHRpZiAoIHRoaXMudmlldyAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMudmlldy5lbmFibGVkID0gZmFsc2U7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIGNhbWVyYSdzIHByb2plY3Rpb24gbWF0cml4LiBNdXN0IGJlIGNhbGxlZCBhZnRlciBhbnkgY2hhbmdlIG9mXHJcblx0ICogY2FtZXJhIHByb3BlcnRpZXMuXHJcblx0ICovXHJcblx0dXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpIHtcclxuXHJcblx0XHRjb25zdCBuZWFyID0gdGhpcy5uZWFyO1xyXG5cdFx0bGV0IHRvcCA9IG5lYXIgKiBNYXRoLnRhbiggREVHMlJBRCAqIDAuNSAqIHRoaXMuZm92ICkgLyB0aGlzLnpvb207XHJcblx0XHRsZXQgaGVpZ2h0ID0gMiAqIHRvcDtcclxuXHRcdGxldCB3aWR0aCA9IHRoaXMuYXNwZWN0ICogaGVpZ2h0O1xyXG5cdFx0bGV0IGxlZnQgPSAtIDAuNSAqIHdpZHRoO1xyXG5cdFx0Y29uc3QgdmlldyA9IHRoaXMudmlldztcclxuXHJcblx0XHRpZiAoIHRoaXMudmlldyAhPT0gbnVsbCAmJiB0aGlzLnZpZXcuZW5hYmxlZCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGZ1bGxXaWR0aCA9IHZpZXcuZnVsbFdpZHRoLFxyXG5cdFx0XHRcdGZ1bGxIZWlnaHQgPSB2aWV3LmZ1bGxIZWlnaHQ7XHJcblxyXG5cdFx0XHRsZWZ0ICs9IHZpZXcub2Zmc2V0WCAqIHdpZHRoIC8gZnVsbFdpZHRoO1xyXG5cdFx0XHR0b3AgLT0gdmlldy5vZmZzZXRZICogaGVpZ2h0IC8gZnVsbEhlaWdodDtcclxuXHRcdFx0d2lkdGggKj0gdmlldy53aWR0aCAvIGZ1bGxXaWR0aDtcclxuXHRcdFx0aGVpZ2h0ICo9IHZpZXcuaGVpZ2h0IC8gZnVsbEhlaWdodDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3Qgc2tldyA9IHRoaXMuZmlsbU9mZnNldDtcclxuXHRcdGlmICggc2tldyAhPT0gMCApIGxlZnQgKz0gbmVhciAqIHNrZXcgLyB0aGlzLmdldEZpbG1XaWR0aCgpO1xyXG5cclxuXHRcdHRoaXMucHJvamVjdGlvbk1hdHJpeC5tYWtlUGVyc3BlY3RpdmUoIGxlZnQsIGxlZnQgKyB3aWR0aCwgdG9wLCB0b3AgLSBoZWlnaHQsIG5lYXIsIHRoaXMuZmFyLCB0aGlzLmNvb3JkaW5hdGVTeXN0ZW0gKTtcclxuXHJcblx0XHR0aGlzLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkoIHRoaXMucHJvamVjdGlvbk1hdHJpeCApLmludmVydCgpO1xyXG5cclxuXHR9XHJcblxyXG5cdHRvSlNPTiggbWV0YSApIHtcclxuXHJcblx0XHRjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCBtZXRhICk7XHJcblxyXG5cdFx0ZGF0YS5vYmplY3QuZm92ID0gdGhpcy5mb3Y7XHJcblx0XHRkYXRhLm9iamVjdC56b29tID0gdGhpcy56b29tO1xyXG5cclxuXHRcdGRhdGEub2JqZWN0Lm5lYXIgPSB0aGlzLm5lYXI7XHJcblx0XHRkYXRhLm9iamVjdC5mYXIgPSB0aGlzLmZhcjtcclxuXHRcdGRhdGEub2JqZWN0LmZvY3VzID0gdGhpcy5mb2N1cztcclxuXHJcblx0XHRkYXRhLm9iamVjdC5hc3BlY3QgPSB0aGlzLmFzcGVjdDtcclxuXHJcblx0XHRpZiAoIHRoaXMudmlldyAhPT0gbnVsbCApIGRhdGEub2JqZWN0LnZpZXcgPSBPYmplY3QuYXNzaWduKCB7fSwgdGhpcy52aWV3ICk7XHJcblxyXG5cdFx0ZGF0YS5vYmplY3QuZmlsbUdhdWdlID0gdGhpcy5maWxtR2F1Z2U7XHJcblx0XHRkYXRhLm9iamVjdC5maWxtT2Zmc2V0ID0gdGhpcy5maWxtT2Zmc2V0O1xyXG5cclxuXHRcdHJldHVybiBkYXRhO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBQZXJzcGVjdGl2ZUNhbWVyYSB9O1xyXG4iLCJpbXBvcnQgeyBXZWJHTENvb3JkaW5hdGVTeXN0ZW0sIFdlYkdQVUNvb3JkaW5hdGVTeXN0ZW0gfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBPYmplY3QzRCB9IGZyb20gJy4uL2NvcmUvT2JqZWN0M0QuanMnO1xyXG5pbXBvcnQgeyBQZXJzcGVjdGl2ZUNhbWVyYSB9IGZyb20gJy4vUGVyc3BlY3RpdmVDYW1lcmEuanMnO1xyXG5cclxuY29uc3QgZm92ID0gLSA5MDsgLy8gbmVnYXRpdmUgZm92IGlzIG5vdCBhbiBlcnJvclxyXG5jb25zdCBhc3BlY3QgPSAxO1xyXG5cclxuLyoqXHJcbiAqIEEgc3BlY2lhbCB0eXBlIG9mIGNhbWVyYSB0aGF0IGlzIHBvc2l0aW9uZWQgaW4gM0Qgc3BhY2UgdG8gcmVuZGVyIGl0cyBzdXJyb3VuZGluZ3MgaW50byBhXHJcbiAqIGN1YmUgcmVuZGVyIHRhcmdldC4gVGhlIHJlbmRlciB0YXJnZXQgY2FuIHRoZW4gYmUgdXNlZCBhcyBhbiBlbnZpcm9ubWVudCBtYXAgZm9yIHJlbmRlcmluZ1xyXG4gKiByZWFsdGltZSByZWZsZWN0aW9ucyBpbiB5b3VyIHNjZW5lLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiAvLyBDcmVhdGUgY3ViZSByZW5kZXIgdGFyZ2V0XHJcbiAqIGNvbnN0IGN1YmVSZW5kZXJUYXJnZXQgPSBuZXcgVEhSRUUuV2ViR0xDdWJlUmVuZGVyVGFyZ2V0KCAyNTYsIHsgZ2VuZXJhdGVNaXBtYXBzOiB0cnVlLCBtaW5GaWx0ZXI6IFRIUkVFLkxpbmVhck1pcG1hcExpbmVhckZpbHRlciB9ICk7XHJcbiAqXHJcbiAqIC8vIENyZWF0ZSBjdWJlIGNhbWVyYVxyXG4gKiBjb25zdCBjdWJlQ2FtZXJhID0gbmV3IFRIUkVFLkN1YmVDYW1lcmEoIDEsIDEwMDAwMCwgY3ViZVJlbmRlclRhcmdldCApO1xyXG4gKiBzY2VuZS5hZGQoIGN1YmVDYW1lcmEgKTtcclxuICpcclxuICogLy8gQ3JlYXRlIGNhclxyXG4gKiBjb25zdCBjaHJvbWVNYXRlcmlhbCA9IG5ldyBUSFJFRS5NZXNoTGFtYmVydE1hdGVyaWFsKCB7IGNvbG9yOiAweGZmZmZmZiwgZW52TWFwOiBjdWJlUmVuZGVyVGFyZ2V0LnRleHR1cmUgfSApO1xyXG4gKiBjb25zdCBjYXIgPSBuZXcgVEhSRUUuTWVzaCggY2FyR2VvbWV0cnksIGNocm9tZU1hdGVyaWFsICk7XHJcbiAqIHNjZW5lLmFkZCggY2FyICk7XHJcbiAqXHJcbiAqIC8vIFVwZGF0ZSB0aGUgcmVuZGVyIHRhcmdldCBjdWJlXHJcbiAqIGNhci52aXNpYmxlID0gZmFsc2U7XHJcbiAqIGN1YmVDYW1lcmEucG9zaXRpb24uY29weSggY2FyLnBvc2l0aW9uICk7XHJcbiAqIGN1YmVDYW1lcmEudXBkYXRlKCByZW5kZXJlciwgc2NlbmUgKTtcclxuICpcclxuICogLy8gUmVuZGVyIHRoZSBzY2VuZVxyXG4gKiBjYXIudmlzaWJsZSA9IHRydWU7XHJcbiAqIHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYSApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIE9iamVjdDNEXHJcbiAqL1xyXG5jbGFzcyBDdWJlQ2FtZXJhIGV4dGVuZHMgT2JqZWN0M0Qge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGN1YmUgY2FtZXJhLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IG5lYXIgLSBUaGUgY2FtZXJhJ3MgbmVhciBwbGFuZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZmFyIC0gVGhlIGNhbWVyYSdzIGZhciBwbGFuZS5cclxuXHQgKiBAcGFyYW0ge1dlYkdMQ3ViZVJlbmRlclRhcmdldH0gcmVuZGVyVGFyZ2V0IC0gVGhlIGN1YmUgcmVuZGVyIHRhcmdldC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbmVhciwgZmFyLCByZW5kZXJUYXJnZXQgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnQ3ViZUNhbWVyYSc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZSB0byB0aGUgY3ViZSByZW5kZXIgdGFyZ2V0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtXZWJHTEN1YmVSZW5kZXJUYXJnZXR9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0ID0gcmVuZGVyVGFyZ2V0O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGN1cnJlbnQgYWN0aXZlIGNvb3JkaW5hdGUgc3lzdGVtLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/KFdlYkdMQ29vcmRpbmF0ZVN5c3RlbXxXZWJHUFVDb29yZGluYXRlU3lzdGVtKX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb29yZGluYXRlU3lzdGVtID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjdXJyZW50IGFjdGl2ZSBtaXBtYXAgbGV2ZWxcclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFjdGl2ZU1pcG1hcExldmVsID0gMDtcclxuXHJcblx0XHRjb25zdCBjYW1lcmFQWCA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggZm92LCBhc3BlY3QsIG5lYXIsIGZhciApO1xyXG5cdFx0Y2FtZXJhUFgubGF5ZXJzID0gdGhpcy5sYXllcnM7XHJcblx0XHR0aGlzLmFkZCggY2FtZXJhUFggKTtcclxuXHJcblx0XHRjb25zdCBjYW1lcmFOWCA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggZm92LCBhc3BlY3QsIG5lYXIsIGZhciApO1xyXG5cdFx0Y2FtZXJhTlgubGF5ZXJzID0gdGhpcy5sYXllcnM7XHJcblx0XHR0aGlzLmFkZCggY2FtZXJhTlggKTtcclxuXHJcblx0XHRjb25zdCBjYW1lcmFQWSA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggZm92LCBhc3BlY3QsIG5lYXIsIGZhciApO1xyXG5cdFx0Y2FtZXJhUFkubGF5ZXJzID0gdGhpcy5sYXllcnM7XHJcblx0XHR0aGlzLmFkZCggY2FtZXJhUFkgKTtcclxuXHJcblx0XHRjb25zdCBjYW1lcmFOWSA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggZm92LCBhc3BlY3QsIG5lYXIsIGZhciApO1xyXG5cdFx0Y2FtZXJhTlkubGF5ZXJzID0gdGhpcy5sYXllcnM7XHJcblx0XHR0aGlzLmFkZCggY2FtZXJhTlkgKTtcclxuXHJcblx0XHRjb25zdCBjYW1lcmFQWiA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggZm92LCBhc3BlY3QsIG5lYXIsIGZhciApO1xyXG5cdFx0Y2FtZXJhUFoubGF5ZXJzID0gdGhpcy5sYXllcnM7XHJcblx0XHR0aGlzLmFkZCggY2FtZXJhUFogKTtcclxuXHJcblx0XHRjb25zdCBjYW1lcmFOWiA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggZm92LCBhc3BlY3QsIG5lYXIsIGZhciApO1xyXG5cdFx0Y2FtZXJhTloubGF5ZXJzID0gdGhpcy5sYXllcnM7XHJcblx0XHR0aGlzLmFkZCggY2FtZXJhTlogKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBNdXN0IGJlIGNhbGxlZCB3aGVuIHRoZSBjb29yZGluYXRlIHN5c3RlbSBvZiB0aGUgY3ViZSBjYW1lcmEgaXMgY2hhbmdlZC5cclxuXHQgKi9cclxuXHR1cGRhdGVDb29yZGluYXRlU3lzdGVtKCkge1xyXG5cclxuXHRcdGNvbnN0IGNvb3JkaW5hdGVTeXN0ZW0gPSB0aGlzLmNvb3JkaW5hdGVTeXN0ZW07XHJcblxyXG5cdFx0Y29uc3QgY2FtZXJhcyA9IHRoaXMuY2hpbGRyZW4uY29uY2F0KCk7XHJcblxyXG5cdFx0Y29uc3QgWyBjYW1lcmFQWCwgY2FtZXJhTlgsIGNhbWVyYVBZLCBjYW1lcmFOWSwgY2FtZXJhUFosIGNhbWVyYU5aIF0gPSBjYW1lcmFzO1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IGNhbWVyYSBvZiBjYW1lcmFzICkgdGhpcy5yZW1vdmUoIGNhbWVyYSApO1xyXG5cclxuXHRcdGlmICggY29vcmRpbmF0ZVN5c3RlbSA9PT0gV2ViR0xDb29yZGluYXRlU3lzdGVtICkge1xyXG5cclxuXHRcdFx0Y2FtZXJhUFgudXAuc2V0KCAwLCAxLCAwICk7XHJcblx0XHRcdGNhbWVyYVBYLmxvb2tBdCggMSwgMCwgMCApO1xyXG5cclxuXHRcdFx0Y2FtZXJhTlgudXAuc2V0KCAwLCAxLCAwICk7XHJcblx0XHRcdGNhbWVyYU5YLmxvb2tBdCggLSAxLCAwLCAwICk7XHJcblxyXG5cdFx0XHRjYW1lcmFQWS51cC5zZXQoIDAsIDAsIC0gMSApO1xyXG5cdFx0XHRjYW1lcmFQWS5sb29rQXQoIDAsIDEsIDAgKTtcclxuXHJcblx0XHRcdGNhbWVyYU5ZLnVwLnNldCggMCwgMCwgMSApO1xyXG5cdFx0XHRjYW1lcmFOWS5sb29rQXQoIDAsIC0gMSwgMCApO1xyXG5cclxuXHRcdFx0Y2FtZXJhUFoudXAuc2V0KCAwLCAxLCAwICk7XHJcblx0XHRcdGNhbWVyYVBaLmxvb2tBdCggMCwgMCwgMSApO1xyXG5cclxuXHRcdFx0Y2FtZXJhTloudXAuc2V0KCAwLCAxLCAwICk7XHJcblx0XHRcdGNhbWVyYU5aLmxvb2tBdCggMCwgMCwgLSAxICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggY29vcmRpbmF0ZVN5c3RlbSA9PT0gV2ViR1BVQ29vcmRpbmF0ZVN5c3RlbSApIHtcclxuXHJcblx0XHRcdGNhbWVyYVBYLnVwLnNldCggMCwgLSAxLCAwICk7XHJcblx0XHRcdGNhbWVyYVBYLmxvb2tBdCggLSAxLCAwLCAwICk7XHJcblxyXG5cdFx0XHRjYW1lcmFOWC51cC5zZXQoIDAsIC0gMSwgMCApO1xyXG5cdFx0XHRjYW1lcmFOWC5sb29rQXQoIDEsIDAsIDAgKTtcclxuXHJcblx0XHRcdGNhbWVyYVBZLnVwLnNldCggMCwgMCwgMSApO1xyXG5cdFx0XHRjYW1lcmFQWS5sb29rQXQoIDAsIDEsIDAgKTtcclxuXHJcblx0XHRcdGNhbWVyYU5ZLnVwLnNldCggMCwgMCwgLSAxICk7XHJcblx0XHRcdGNhbWVyYU5ZLmxvb2tBdCggMCwgLSAxLCAwICk7XHJcblxyXG5cdFx0XHRjYW1lcmFQWi51cC5zZXQoIDAsIC0gMSwgMCApO1xyXG5cdFx0XHRjYW1lcmFQWi5sb29rQXQoIDAsIDAsIDEgKTtcclxuXHJcblx0XHRcdGNhbWVyYU5aLnVwLnNldCggMCwgLSAxLCAwICk7XHJcblx0XHRcdGNhbWVyYU5aLmxvb2tBdCggMCwgMCwgLSAxICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHRocm93IG5ldyBFcnJvciggJ1RIUkVFLkN1YmVDYW1lcmEudXBkYXRlQ29vcmRpbmF0ZVN5c3RlbSgpOiBJbnZhbGlkIGNvb3JkaW5hdGUgc3lzdGVtOiAnICsgY29vcmRpbmF0ZVN5c3RlbSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmb3IgKCBjb25zdCBjYW1lcmEgb2YgY2FtZXJhcyApIHtcclxuXHJcblx0XHRcdHRoaXMuYWRkKCBjYW1lcmEgKTtcclxuXHJcblx0XHRcdGNhbWVyYS51cGRhdGVNYXRyaXhXb3JsZCgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgcmVuZGVyIHRoZSBnaXZlbiBzY2VuZSB3aXRoIHRoZSBnaXZlbiByZW5kZXJlclxyXG5cdCAqIGludG8gdGhlIGN1YmUgcmVuZGVyIHRhcmdldCBvZiB0aGUgY2FtZXJhLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHsoUmVuZGVyZXJ8V2ViR0xSZW5kZXJlcil9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7U2NlbmV9IHNjZW5lIC0gVGhlIHNjZW5lIHRvIHJlbmRlci5cclxuXHQgKi9cclxuXHR1cGRhdGUoIHJlbmRlcmVyLCBzY2VuZSApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMucGFyZW50ID09PSBudWxsICkgdGhpcy51cGRhdGVNYXRyaXhXb3JsZCgpO1xyXG5cclxuXHRcdGNvbnN0IHsgcmVuZGVyVGFyZ2V0LCBhY3RpdmVNaXBtYXBMZXZlbCB9ID0gdGhpcztcclxuXHJcblx0XHRpZiAoIHRoaXMuY29vcmRpbmF0ZVN5c3RlbSAhPT0gcmVuZGVyZXIuY29vcmRpbmF0ZVN5c3RlbSApIHtcclxuXHJcblx0XHRcdHRoaXMuY29vcmRpbmF0ZVN5c3RlbSA9IHJlbmRlcmVyLmNvb3JkaW5hdGVTeXN0ZW07XHJcblxyXG5cdFx0XHR0aGlzLnVwZGF0ZUNvb3JkaW5hdGVTeXN0ZW0oKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgWyBjYW1lcmFQWCwgY2FtZXJhTlgsIGNhbWVyYVBZLCBjYW1lcmFOWSwgY2FtZXJhUFosIGNhbWVyYU5aIF0gPSB0aGlzLmNoaWxkcmVuO1xyXG5cclxuXHRcdGNvbnN0IGN1cnJlbnRSZW5kZXJUYXJnZXQgPSByZW5kZXJlci5nZXRSZW5kZXJUYXJnZXQoKTtcclxuXHRcdGNvbnN0IGN1cnJlbnRBY3RpdmVDdWJlRmFjZSA9IHJlbmRlcmVyLmdldEFjdGl2ZUN1YmVGYWNlKCk7XHJcblx0XHRjb25zdCBjdXJyZW50QWN0aXZlTWlwbWFwTGV2ZWwgPSByZW5kZXJlci5nZXRBY3RpdmVNaXBtYXBMZXZlbCgpO1xyXG5cclxuXHRcdGNvbnN0IGN1cnJlbnRYckVuYWJsZWQgPSByZW5kZXJlci54ci5lbmFibGVkO1xyXG5cclxuXHRcdHJlbmRlcmVyLnhyLmVuYWJsZWQgPSBmYWxzZTtcclxuXHJcblx0XHRjb25zdCBnZW5lcmF0ZU1pcG1hcHMgPSByZW5kZXJUYXJnZXQudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM7XHJcblxyXG5cdFx0cmVuZGVyVGFyZ2V0LnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XHJcblxyXG5cdFx0cmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQsIDAsIGFjdGl2ZU1pcG1hcExldmVsICk7XHJcblx0XHRyZW5kZXJlci5yZW5kZXIoIHNjZW5lLCBjYW1lcmFQWCApO1xyXG5cclxuXHRcdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0LCAxLCBhY3RpdmVNaXBtYXBMZXZlbCApO1xyXG5cdFx0cmVuZGVyZXIucmVuZGVyKCBzY2VuZSwgY2FtZXJhTlggKTtcclxuXHJcblx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCwgMiwgYWN0aXZlTWlwbWFwTGV2ZWwgKTtcclxuXHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYVBZICk7XHJcblxyXG5cdFx0cmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQsIDMsIGFjdGl2ZU1pcG1hcExldmVsICk7XHJcblx0XHRyZW5kZXJlci5yZW5kZXIoIHNjZW5lLCBjYW1lcmFOWSApO1xyXG5cclxuXHRcdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0LCA0LCBhY3RpdmVNaXBtYXBMZXZlbCApO1xyXG5cdFx0cmVuZGVyZXIucmVuZGVyKCBzY2VuZSwgY2FtZXJhUFogKTtcclxuXHJcblx0XHQvLyBtaXBtYXBzIGFyZSBnZW5lcmF0ZWQgZHVyaW5nIHRoZSBsYXN0IGNhbGwgb2YgcmVuZGVyKClcclxuXHRcdC8vIGF0IHRoaXMgcG9pbnQsIGFsbCBzaWRlcyBvZiB0aGUgY3ViZSByZW5kZXIgdGFyZ2V0IGFyZSBkZWZpbmVkXHJcblxyXG5cdFx0cmVuZGVyVGFyZ2V0LnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZ2VuZXJhdGVNaXBtYXBzO1xyXG5cclxuXHRcdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0LCA1LCBhY3RpdmVNaXBtYXBMZXZlbCApO1xyXG5cdFx0cmVuZGVyZXIucmVuZGVyKCBzY2VuZSwgY2FtZXJhTlogKTtcclxuXHJcblx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIGN1cnJlbnRSZW5kZXJUYXJnZXQsIGN1cnJlbnRBY3RpdmVDdWJlRmFjZSwgY3VycmVudEFjdGl2ZU1pcG1hcExldmVsICk7XHJcblxyXG5cdFx0cmVuZGVyZXIueHIuZW5hYmxlZCA9IGN1cnJlbnRYckVuYWJsZWQ7XHJcblxyXG5cdFx0cmVuZGVyVGFyZ2V0LnRleHR1cmUubmVlZHNQTVJFTVVwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IEN1YmVDYW1lcmEgfTtcclxuIiwiaW1wb3J0IHsgVGV4dHVyZSB9IGZyb20gJy4vVGV4dHVyZS5qcyc7XHJcbmltcG9ydCB7IEN1YmVSZWZsZWN0aW9uTWFwcGluZyB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIGN1YmUgdGV4dHVyZSBtYWRlIHVwIG9mIHNpeCBpbWFnZXMuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGxvYWRlciA9IG5ldyBUSFJFRS5DdWJlVGV4dHVyZUxvYWRlcigpO1xyXG4gKiBsb2FkZXIuc2V0UGF0aCggJ3RleHR1cmVzL2N1YmUvcGlzYS8nICk7XHJcbiAqXHJcbiAqIGNvbnN0IHRleHR1cmVDdWJlID0gbG9hZGVyLmxvYWQoIFtcclxuICogXHQncHgucG5nJywgJ254LnBuZycsICdweS5wbmcnLCAnbnkucG5nJywgJ3B6LnBuZycsICduei5wbmcnXHJcbiAqIF0gKTtcclxuICpcclxuICogY29uc3QgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IDB4ZmZmZmZmLCBlbnZNYXA6IHRleHR1cmVDdWJlIH0gKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBUZXh0dXJlXHJcbiAqL1xyXG5jbGFzcyBDdWJlVGV4dHVyZSBleHRlbmRzIFRleHR1cmUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGN1YmUgdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8SW1hZ2U+fSBbaW1hZ2VzPVtdXSAtIEFuIGFycmF5IGhvbGRpbmcgYSBpbWFnZSBmb3IgZWFjaCBzaWRlIG9mIGEgY3ViZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW21hcHBpbmc9Q3ViZVJlZmxlY3Rpb25NYXBwaW5nXSAtIFRoZSB0ZXh0dXJlIG1hcHBpbmcuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt3cmFwUz1DbGFtcFRvRWRnZVdyYXBwaW5nXSAtIFRoZSB3cmFwUyB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3dyYXBUPUNsYW1wVG9FZGdlV3JhcHBpbmddIC0gVGhlIHdyYXBUIHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbWFnRmlsdGVyPUxpbmVhckZpbHRlcl0gLSBUaGUgbWFnIGZpbHRlciB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW21pbkZpbHRlcj1MaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXJdIC0gVGhlIG1pbiBmaWx0ZXIgdmFsdWUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtmb3JtYXQ9UkdCQUZvcm1hdF0gLSBUaGUgdGV4dHVyZSBmb3JtYXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt0eXBlPVVuc2lnbmVkQnl0ZVR5cGVdIC0gVGhlIHRleHR1cmUgdHlwZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2FuaXNvdHJvcHk9VGV4dHVyZS5ERUZBVUxUX0FOSVNPVFJPUFldIC0gVGhlIGFuaXNvdHJvcHkgdmFsdWUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtjb2xvclNwYWNlPU5vQ29sb3JTcGFjZV0gLSBUaGUgY29sb3Igc3BhY2UgdmFsdWUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGltYWdlcyA9IFtdLCBtYXBwaW5nID0gQ3ViZVJlZmxlY3Rpb25NYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHksIGNvbG9yU3BhY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIoIGltYWdlcywgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5LCBjb2xvclNwYWNlICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzQ3ViZVRleHR1cmUgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSWYgc2V0IHRvIGB0cnVlYCwgdGhlIHRleHR1cmUgaXMgZmxpcHBlZCBhbG9uZyB0aGUgdmVydGljYWwgYXhpcyB3aGVuXHJcblx0XHQgKiB1cGxvYWRlZCB0byB0aGUgR1BVLlxyXG5cdFx0ICpcclxuXHRcdCAqIE92ZXJ3cml0dGVuIGFuZCBzZXQgdG8gYGZhbHNlYCBieSBkZWZhdWx0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5mbGlwWSA9IGZhbHNlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFsaWFzIGZvciB7QGxpbmsgQ3ViZVRleHR1cmUjaW1hZ2V9LlxyXG5cdCAqXHJcblx0ICogQHR5cGUge0FycmF5PEltYWdlPn1cclxuXHQgKi9cclxuXHRnZXQgaW1hZ2VzKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmltYWdlO1xyXG5cclxuXHR9XHJcblxyXG5cdHNldCBpbWFnZXMoIHZhbHVlICkge1xyXG5cclxuXHRcdHRoaXMuaW1hZ2UgPSB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgQ3ViZVRleHR1cmUgfTtcclxuIiwiaW1wb3J0IHsgQmFja1NpZGUsIExpbmVhckZpbHRlciwgTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyLCBOb0JsZW5kaW5nIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgTWVzaCB9IGZyb20gJy4uL29iamVjdHMvTWVzaC5qcyc7XHJcbmltcG9ydCB7IEJveEdlb21ldHJ5IH0gZnJvbSAnLi4vZ2VvbWV0cmllcy9Cb3hHZW9tZXRyeS5qcyc7XHJcbmltcG9ydCB7IFNoYWRlck1hdGVyaWFsIH0gZnJvbSAnLi4vbWF0ZXJpYWxzL1NoYWRlck1hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgY2xvbmVVbmlmb3JtcyB9IGZyb20gJy4vc2hhZGVycy9Vbmlmb3Jtc1V0aWxzLmpzJztcclxuaW1wb3J0IHsgV2ViR0xSZW5kZXJUYXJnZXQgfSBmcm9tICcuL1dlYkdMUmVuZGVyVGFyZ2V0LmpzJztcclxuaW1wb3J0IHsgQ3ViZUNhbWVyYSB9IGZyb20gJy4uL2NhbWVyYXMvQ3ViZUNhbWVyYS5qcyc7XHJcbmltcG9ydCB7IEN1YmVUZXh0dXJlIH0gZnJvbSAnLi4vdGV4dHVyZXMvQ3ViZVRleHR1cmUuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgY3ViZSByZW5kZXIgdGFyZ2V0IHVzZWQgaW4gY29udGV4dCBvZiB7QGxpbmsgV2ViR0xSZW5kZXJlcn0uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBXZWJHTFJlbmRlclRhcmdldFxyXG4gKi9cclxuY2xhc3MgV2ViR0xDdWJlUmVuZGVyVGFyZ2V0IGV4dGVuZHMgV2ViR0xSZW5kZXJUYXJnZXQge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGN1YmUgcmVuZGVyIHRhcmdldC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbc2l6ZT0xXSAtIFRoZSBzaXplIG9mIHRoZSByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyVGFyZ2V0fk9wdGlvbnN9IFtvcHRpb25zXSAtIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggc2l6ZSA9IDEsIG9wdGlvbnMgPSB7fSApIHtcclxuXHJcblx0XHRzdXBlciggc2l6ZSwgc2l6ZSwgb3B0aW9ucyApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldCA9IHRydWU7XHJcblxyXG5cdFx0Y29uc3QgaW1hZ2UgPSB7IHdpZHRoOiBzaXplLCBoZWlnaHQ6IHNpemUsIGRlcHRoOiAxIH07XHJcblx0XHRjb25zdCBpbWFnZXMgPSBbIGltYWdlLCBpbWFnZSwgaW1hZ2UsIGltYWdlLCBpbWFnZSwgaW1hZ2UgXTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIE92ZXJ3cml0dGVuIHdpdGggYSBkaWZmZXJlbnQgdGV4dHVyZSB0eXBlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtEYXRhQXJyYXlUZXh0dXJlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRleHR1cmUgPSBuZXcgQ3ViZVRleHR1cmUoIGltYWdlcywgb3B0aW9ucy5tYXBwaW5nLCBvcHRpb25zLndyYXBTLCBvcHRpb25zLndyYXBULCBvcHRpb25zLm1hZ0ZpbHRlciwgb3B0aW9ucy5taW5GaWx0ZXIsIG9wdGlvbnMuZm9ybWF0LCBvcHRpb25zLnR5cGUsIG9wdGlvbnMuYW5pc290cm9weSwgb3B0aW9ucy5jb2xvclNwYWNlICk7XHJcblxyXG5cdFx0Ly8gQnkgY29udmVudGlvbiAtLSBsaWtlbHkgYmFzZWQgb24gdGhlIFJlbmRlck1hbiBzcGVjIGZyb20gdGhlIDE5OTAncyAtLSBjdWJlIG1hcHMgYXJlIHNwZWNpZmllZCBieSBXZWJHTCAoYW5kIHRocmVlLmpzKVxyXG5cdFx0Ly8gaW4gYSBjb29yZGluYXRlIHN5c3RlbSBpbiB3aGljaCBwb3NpdGl2ZS14IGlzIHRvIHRoZSByaWdodCB3aGVuIGxvb2tpbmcgdXAgdGhlIHBvc2l0aXZlLXogYXhpcyAtLSBpbiBvdGhlciB3b3JkcyxcclxuXHRcdC8vIGluIGEgbGVmdC1oYW5kZWQgY29vcmRpbmF0ZSBzeXN0ZW0uIEJ5IGNvbnRpbnVpbmcgdGhpcyBjb252ZW50aW9uLCBwcmVleGlzdGluZyBjdWJlIG1hcHMgY29udGludWVkIHRvIHJlbmRlciBjb3JyZWN0bHkuXHJcblxyXG5cdFx0Ly8gdGhyZWUuanMgdXNlcyBhIHJpZ2h0LWhhbmRlZCBjb29yZGluYXRlIHN5c3RlbS4gU28gZW52aXJvbm1lbnQgbWFwcyB1c2VkIGluIHRocmVlLmpzIGFwcGVhciB0byBoYXZlIHB4IGFuZCBueCBzd2FwcGVkXHJcblx0XHQvLyBhbmQgdGhlIGZsYWcgaXNSZW5kZXJUYXJnZXRUZXh0dXJlIGNvbnRyb2xzIHRoaXMgY29udmVyc2lvbi4gVGhlIGZsaXAgaXMgbm90IHJlcXVpcmVkIHdoZW4gdXNpbmcgV2ViR0xDdWJlUmVuZGVyVGFyZ2V0LnRleHR1cmVcclxuXHRcdC8vIGFzIGEgY3ViZSB0ZXh0dXJlICh0aGlzIGlzIGRldGVjdGVkIHdoZW4gaXNSZW5kZXJUYXJnZXRUZXh0dXJlIGlzIHNldCB0byB0cnVlIGZvciBjdWJlIHRleHR1cmVzKS5cclxuXHJcblx0XHR0aGlzLnRleHR1cmUuaXNSZW5kZXJUYXJnZXRUZXh0dXJlID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gb3B0aW9ucy5nZW5lcmF0ZU1pcG1hcHMgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZ2VuZXJhdGVNaXBtYXBzIDogZmFsc2U7XHJcblx0XHR0aGlzLnRleHR1cmUubWluRmlsdGVyID0gb3B0aW9ucy5taW5GaWx0ZXIgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMubWluRmlsdGVyIDogTGluZWFyRmlsdGVyO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnZlcnRzIHRoZSBnaXZlbiBlcXVpcmVjdGFuZ3VsYXIgdGV4dHVyZSB0byBhIGN1YmUgbWFwLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgZXF1aXJlY3Rhbmd1bGFyIHRleHR1cmUuXHJcblx0ICogQHJldHVybiB7V2ViR0xDdWJlUmVuZGVyVGFyZ2V0fSBBIHJlZmVyZW5jZSB0byB0aGlzIGN1YmUgcmVuZGVyIHRhcmdldC5cclxuXHQgKi9cclxuXHRmcm9tRXF1aXJlY3Rhbmd1bGFyVGV4dHVyZSggcmVuZGVyZXIsIHRleHR1cmUgKSB7XHJcblxyXG5cdFx0dGhpcy50ZXh0dXJlLnR5cGUgPSB0ZXh0dXJlLnR5cGU7XHJcblx0XHR0aGlzLnRleHR1cmUuY29sb3JTcGFjZSA9IHRleHR1cmUuY29sb3JTcGFjZTtcclxuXHJcblx0XHR0aGlzLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gdGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM7XHJcblx0XHR0aGlzLnRleHR1cmUubWluRmlsdGVyID0gdGV4dHVyZS5taW5GaWx0ZXI7XHJcblx0XHR0aGlzLnRleHR1cmUubWFnRmlsdGVyID0gdGV4dHVyZS5tYWdGaWx0ZXI7XHJcblxyXG5cdFx0Y29uc3Qgc2hhZGVyID0ge1xyXG5cclxuXHRcdFx0dW5pZm9ybXM6IHtcclxuXHRcdFx0XHR0RXF1aXJlY3Q6IHsgdmFsdWU6IG51bGwgfSxcclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdHZlcnRleFNoYWRlcjogLyogZ2xzbCAqL2BcclxuXHJcblx0XHRcdFx0dmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcclxuXHJcblx0XHRcdFx0dmVjMyB0cmFuc2Zvcm1EaXJlY3Rpb24oIGluIHZlYzMgZGlyLCBpbiBtYXQ0IG1hdHJpeCApIHtcclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gbm9ybWFsaXplKCAoIG1hdHJpeCAqIHZlYzQoIGRpciwgMC4wICkgKS54eXogKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR2b2lkIG1haW4oKSB7XHJcblxyXG5cdFx0XHRcdFx0dldvcmxkRGlyZWN0aW9uID0gdHJhbnNmb3JtRGlyZWN0aW9uKCBwb3NpdGlvbiwgbW9kZWxNYXRyaXggKTtcclxuXHJcblx0XHRcdFx0XHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxyXG5cdFx0XHRcdFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxyXG5cclxuXHRcdFx0XHR9XHJcblx0XHRcdGAsXHJcblxyXG5cdFx0XHRmcmFnbWVudFNoYWRlcjogLyogZ2xzbCAqL2BcclxuXHJcblx0XHRcdFx0dW5pZm9ybSBzYW1wbGVyMkQgdEVxdWlyZWN0O1xyXG5cclxuXHRcdFx0XHR2YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uO1xyXG5cclxuXHRcdFx0XHQjaW5jbHVkZSA8Y29tbW9uPlxyXG5cclxuXHRcdFx0XHR2b2lkIG1haW4oKSB7XHJcblxyXG5cdFx0XHRcdFx0dmVjMyBkaXJlY3Rpb24gPSBub3JtYWxpemUoIHZXb3JsZERpcmVjdGlvbiApO1xyXG5cclxuXHRcdFx0XHRcdHZlYzIgc2FtcGxlVVYgPSBlcXVpcmVjdFV2KCBkaXJlY3Rpb24gKTtcclxuXHJcblx0XHRcdFx0XHRnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQoIHRFcXVpcmVjdCwgc2FtcGxlVVYgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cdFx0XHRgXHJcblx0XHR9O1xyXG5cclxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gbmV3IEJveEdlb21ldHJ5KCA1LCA1LCA1ICk7XHJcblxyXG5cdFx0Y29uc3QgbWF0ZXJpYWwgPSBuZXcgU2hhZGVyTWF0ZXJpYWwoIHtcclxuXHJcblx0XHRcdG5hbWU6ICdDdWJlbWFwRnJvbUVxdWlyZWN0JyxcclxuXHJcblx0XHRcdHVuaWZvcm1zOiBjbG9uZVVuaWZvcm1zKCBzaGFkZXIudW5pZm9ybXMgKSxcclxuXHRcdFx0dmVydGV4U2hhZGVyOiBzaGFkZXIudmVydGV4U2hhZGVyLFxyXG5cdFx0XHRmcmFnbWVudFNoYWRlcjogc2hhZGVyLmZyYWdtZW50U2hhZGVyLFxyXG5cdFx0XHRzaWRlOiBCYWNrU2lkZSxcclxuXHRcdFx0YmxlbmRpbmc6IE5vQmxlbmRpbmdcclxuXHJcblx0XHR9ICk7XHJcblxyXG5cdFx0bWF0ZXJpYWwudW5pZm9ybXMudEVxdWlyZWN0LnZhbHVlID0gdGV4dHVyZTtcclxuXHJcblx0XHRjb25zdCBtZXNoID0gbmV3IE1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG5cclxuXHRcdGNvbnN0IGN1cnJlbnRNaW5GaWx0ZXIgPSB0ZXh0dXJlLm1pbkZpbHRlcjtcclxuXHJcblx0XHQvLyBBdm9pZCBibHVycmVkIHBvbGVzXHJcblx0XHRpZiAoIHRleHR1cmUubWluRmlsdGVyID09PSBMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXIgKSB0ZXh0dXJlLm1pbkZpbHRlciA9IExpbmVhckZpbHRlcjtcclxuXHJcblx0XHRjb25zdCBjYW1lcmEgPSBuZXcgQ3ViZUNhbWVyYSggMSwgMTAsIHRoaXMgKTtcclxuXHRcdGNhbWVyYS51cGRhdGUoIHJlbmRlcmVyLCBtZXNoICk7XHJcblxyXG5cdFx0dGV4dHVyZS5taW5GaWx0ZXIgPSBjdXJyZW50TWluRmlsdGVyO1xyXG5cclxuXHRcdG1lc2guZ2VvbWV0cnkuZGlzcG9zZSgpO1xyXG5cdFx0bWVzaC5tYXRlcmlhbC5kaXNwb3NlKCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2xlYXJzIHRoaXMgY3ViZSByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtjb2xvcj10cnVlXSAtIFdoZXRoZXIgdGhlIGNvbG9yIGJ1ZmZlciBzaG91bGQgYmUgY2xlYXJlZCBvciBub3QuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbZGVwdGg9dHJ1ZV0gLSBXaGV0aGVyIHRoZSBkZXB0aCBidWZmZXIgc2hvdWxkIGJlIGNsZWFyZWQgb3Igbm90LlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW3N0ZW5jaWw9dHJ1ZV0gLSBXaGV0aGVyIHRoZSBzdGVuY2lsIGJ1ZmZlciBzaG91bGQgYmUgY2xlYXJlZCBvciBub3QuXHJcblx0ICovXHJcblx0Y2xlYXIoIHJlbmRlcmVyLCBjb2xvciA9IHRydWUsIGRlcHRoID0gdHJ1ZSwgc3RlbmNpbCA9IHRydWUgKSB7XHJcblxyXG5cdFx0Y29uc3QgY3VycmVudFJlbmRlclRhcmdldCA9IHJlbmRlcmVyLmdldFJlbmRlclRhcmdldCgpO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDY7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHRoaXMsIGkgKTtcclxuXHJcblx0XHRcdHJlbmRlcmVyLmNsZWFyKCBjb2xvciwgZGVwdGgsIHN0ZW5jaWwgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCBjdXJyZW50UmVuZGVyVGFyZ2V0ICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFdlYkdMQ3ViZVJlbmRlclRhcmdldCB9O1xyXG4iLCJpbXBvcnQgeyBPYmplY3QzRCB9IGZyb20gJy4uL2NvcmUvT2JqZWN0M0QuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgaXMgYWxtb3N0IGlkZW50aWNhbCB0byBhbiB7QGxpbmsgT2JqZWN0M0R9LiBJdHMgcHVycG9zZSBpcyB0b1xyXG4gKiBtYWtlIHdvcmtpbmcgd2l0aCBncm91cHMgb2Ygb2JqZWN0cyBzeW50YWN0aWNhbGx5IGNsZWFyZXIuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIC8vIENyZWF0ZSBhIGdyb3VwIGFuZCBhZGQgdGhlIHR3byBjdWJlcy5cclxuICogLy8gVGhlc2UgY3ViZXMgY2FuIG5vdyBiZSByb3RhdGVkIC8gc2NhbGVkIGV0YyBhcyBhIGdyb3VwLlxyXG4gKiBjb25zdCBncm91cCA9IG5ldyBUSFJFRS5Hcm91cCgpO1xyXG4gKlxyXG4gKiBncm91cC5hZGQoIG1lc2hBICk7XHJcbiAqIGdyb3VwLmFkZCggbWVzaEIgKTtcclxuICpcclxuICogc2NlbmUuYWRkKCBncm91cCApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIE9iamVjdDNEXHJcbiAqL1xyXG5jbGFzcyBHcm91cCBleHRlbmRzIE9iamVjdDNEIHtcclxuXHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNHcm91cCA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ0dyb3VwJztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgR3JvdXAgfTtcclxuIiwiaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcbmltcG9ydCB7IEdyb3VwIH0gZnJvbSAnLi4vLi4vb2JqZWN0cy9Hcm91cC5qcyc7XHJcblxyXG5jb25zdCBfbW92ZUV2ZW50ID0geyB0eXBlOiAnbW92ZScgfTtcclxuXHJcbi8qKlxyXG4gKiBDbGFzcyBmb3IgcmVwcmVzZW50aW5nIGEgWFIgY29udHJvbGxlciB3aXRoIGl0c1xyXG4gKiBkaWZmZXJlbnQgY29vcmRpbmF0ZSBzeXN0ZW1zLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuY2xhc3MgV2ViWFJDb250cm9sbGVyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBYUiBjb250cm9sbGVyLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBncm91cCByZXByZXNlbnRpbmcgdGhlIHRhcmdldCByYXkgc3BhY2VcclxuXHRcdCAqIG9mIHRoZSBYUiBjb250cm9sbGVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7P0dyb3VwfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl90YXJnZXRSYXkgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBncm91cCByZXByZXNlbnRpbmcgdGhlIGdyaXAgc3BhY2VcclxuXHRcdCAqIG9mIHRoZSBYUiBjb250cm9sbGVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7P0dyb3VwfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9ncmlwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgZ3JvdXAgcmVwcmVzZW50aW5nIHRoZSBoYW5kIHNwYWNlXHJcblx0XHQgKiBvZiB0aGUgWFIgY29udHJvbGxlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUgez9Hcm91cH1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5faGFuZCA9IG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIGdyb3VwIHJlcHJlc2VudGluZyB0aGUgaGFuZCBzcGFjZSBvZiB0aGUgWFIgY29udHJvbGxlci5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0dyb3VwfSBBIGdyb3VwIHJlcHJlc2VudGluZyB0aGUgaGFuZCBzcGFjZSBvZiB0aGUgWFIgY29udHJvbGxlci5cclxuXHQgKi9cclxuXHRnZXRIYW5kU3BhY2UoKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9oYW5kID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5faGFuZCA9IG5ldyBHcm91cCgpO1xyXG5cdFx0XHR0aGlzLl9oYW5kLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcclxuXHRcdFx0dGhpcy5faGFuZC52aXNpYmxlID0gZmFsc2U7XHJcblxyXG5cdFx0XHR0aGlzLl9oYW5kLmpvaW50cyA9IHt9O1xyXG5cdFx0XHR0aGlzLl9oYW5kLmlucHV0U3RhdGUgPSB7IHBpbmNoaW5nOiBmYWxzZSB9O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcy5faGFuZDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgZ3JvdXAgcmVwcmVzZW50aW5nIHRoZSB0YXJnZXQgcmF5IHNwYWNlIG9mIHRoZSBYUiBjb250cm9sbGVyLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7R3JvdXB9IEEgZ3JvdXAgcmVwcmVzZW50aW5nIHRoZSB0YXJnZXQgcmF5IHNwYWNlIG9mIHRoZSBYUiBjb250cm9sbGVyLlxyXG5cdCAqL1xyXG5cdGdldFRhcmdldFJheVNwYWNlKCkge1xyXG5cclxuXHRcdGlmICggdGhpcy5fdGFyZ2V0UmF5ID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5fdGFyZ2V0UmF5ID0gbmV3IEdyb3VwKCk7XHJcblx0XHRcdHRoaXMuX3RhcmdldFJheS5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XHJcblx0XHRcdHRoaXMuX3RhcmdldFJheS52aXNpYmxlID0gZmFsc2U7XHJcblx0XHRcdHRoaXMuX3RhcmdldFJheS5oYXNMaW5lYXJWZWxvY2l0eSA9IGZhbHNlO1xyXG5cdFx0XHR0aGlzLl90YXJnZXRSYXkubGluZWFyVmVsb2NpdHkgPSBuZXcgVmVjdG9yMygpO1xyXG5cdFx0XHR0aGlzLl90YXJnZXRSYXkuaGFzQW5ndWxhclZlbG9jaXR5ID0gZmFsc2U7XHJcblx0XHRcdHRoaXMuX3RhcmdldFJheS5hbmd1bGFyVmVsb2NpdHkgPSBuZXcgVmVjdG9yMygpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fdGFyZ2V0UmF5O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBncm91cCByZXByZXNlbnRpbmcgdGhlIGdyaXAgc3BhY2Ugb2YgdGhlIFhSIGNvbnRyb2xsZXIuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtHcm91cH0gQSBncm91cCByZXByZXNlbnRpbmcgdGhlIGdyaXAgc3BhY2Ugb2YgdGhlIFhSIGNvbnRyb2xsZXIuXHJcblx0ICovXHJcblx0Z2V0R3JpcFNwYWNlKCkge1xyXG5cclxuXHRcdGlmICggdGhpcy5fZ3JpcCA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuX2dyaXAgPSBuZXcgR3JvdXAoKTtcclxuXHRcdFx0dGhpcy5fZ3JpcC5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XHJcblx0XHRcdHRoaXMuX2dyaXAudmlzaWJsZSA9IGZhbHNlO1xyXG5cdFx0XHR0aGlzLl9ncmlwLmhhc0xpbmVhclZlbG9jaXR5ID0gZmFsc2U7XHJcblx0XHRcdHRoaXMuX2dyaXAubGluZWFyVmVsb2NpdHkgPSBuZXcgVmVjdG9yMygpO1xyXG5cdFx0XHR0aGlzLl9ncmlwLmhhc0FuZ3VsYXJWZWxvY2l0eSA9IGZhbHNlO1xyXG5cdFx0XHR0aGlzLl9ncmlwLmFuZ3VsYXJWZWxvY2l0eSA9IG5ldyBWZWN0b3IzKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzLl9ncmlwO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERpc3BhdGNoZXMgdGhlIGdpdmVuIGV2ZW50IHRvIHRoZSBncm91cHMgcmVwcmVzZW50aW5nXHJcblx0ICogdGhlIGRpZmZlcmVudCBjb29yZGluYXRlIHNwYWNlcyBvZiB0aGUgWFIgY29udHJvbGxlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBldmVudCAtIFRoZSBldmVudCB0byBkaXNwYXRjaC5cclxuXHQgKiBAcmV0dXJuIHtXZWJYUkNvbnRyb2xsZXJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0ZGlzcGF0Y2hFdmVudCggZXZlbnQgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl90YXJnZXRSYXkgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLl90YXJnZXRSYXkuZGlzcGF0Y2hFdmVudCggZXZlbnQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9ncmlwICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5fZ3JpcC5kaXNwYXRjaEV2ZW50KCBldmVudCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMuX2hhbmQgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLl9oYW5kLmRpc3BhdGNoRXZlbnQoIGV2ZW50ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbm5lY3RzIHRoZSBjb250cm9sbGVyIHdpdGggdGhlIGdpdmVuIFhSIGlucHV0IHNvdXJjZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7WFJJbnB1dFNvdXJjZX0gaW5wdXRTb3VyY2UgLSBUaGUgaW5wdXQgc291cmNlLlxyXG5cdCAqIEByZXR1cm4ge1dlYlhSQ29udHJvbGxlcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjb25uZWN0KCBpbnB1dFNvdXJjZSApIHtcclxuXHJcblx0XHRpZiAoIGlucHV0U291cmNlICYmIGlucHV0U291cmNlLmhhbmQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBoYW5kID0gdGhpcy5faGFuZDtcclxuXHJcblx0XHRcdGlmICggaGFuZCApIHtcclxuXHJcblx0XHRcdFx0Zm9yICggY29uc3QgaW5wdXRqb2ludCBvZiBpbnB1dFNvdXJjZS5oYW5kLnZhbHVlcygpICkge1xyXG5cclxuXHRcdFx0XHRcdC8vIEluaXRpYWxpemUgaGFuZCB3aXRoIGpvaW50cyB3aGVuIGNvbm5lY3RlZFxyXG5cdFx0XHRcdFx0dGhpcy5fZ2V0SGFuZEpvaW50KCBoYW5kLCBpbnB1dGpvaW50ICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdjb25uZWN0ZWQnLCBkYXRhOiBpbnB1dFNvdXJjZSB9ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGlzY29ubmVjdHMgdGhlIGNvbnRyb2xsZXIgZnJvbSB0aGUgZ2l2ZW4gWFIgaW5wdXQgc291cmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtYUklucHV0U291cmNlfSBpbnB1dFNvdXJjZSAtIFRoZSBpbnB1dCBzb3VyY2UuXHJcblx0ICogQHJldHVybiB7V2ViWFJDb250cm9sbGVyfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGRpc2Nvbm5lY3QoIGlucHV0U291cmNlICkge1xyXG5cclxuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnZGlzY29ubmVjdGVkJywgZGF0YTogaW5wdXRTb3VyY2UgfSApO1xyXG5cclxuXHRcdGlmICggdGhpcy5fdGFyZ2V0UmF5ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5fdGFyZ2V0UmF5LnZpc2libGUgPSBmYWxzZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9ncmlwICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5fZ3JpcC52aXNpYmxlID0gZmFsc2U7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy5faGFuZCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuX2hhbmQudmlzaWJsZSA9IGZhbHNlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoZSBjb250cm9sbGVyIHdpdGggdGhlIGdpdmVuIGlucHV0IHNvdXJjZSwgWFIgZnJhbWUgYW5kIHJlZmVyZW5jZSBzcGFjZS5cclxuXHQgKiBUaGlzIHVwZGF0ZXMgdGhlIHRyYW5zZm9ybWF0aW9ucyBvZiB0aGUgZ3JvdXBzIHRoYXQgcmVwcmVzZW50IHRoZSBkaWZmZXJlbnRcclxuXHQgKiBjb29yZGluYXRlIHN5c3RlbXMgb2YgdGhlIGNvbnRyb2xsZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1hSSW5wdXRTb3VyY2V9IGlucHV0U291cmNlIC0gVGhlIGlucHV0IHNvdXJjZS5cclxuXHQgKiBAcGFyYW0ge1hSRnJhbWV9IGZyYW1lIC0gVGhlIFhSIGZyYW1lLlxyXG5cdCAqIEBwYXJhbSB7WFJSZWZlcmVuY2VTcGFjZX0gcmVmZXJlbmNlU3BhY2UgLSBUaGUgcmVmZXJlbmNlIHNwYWNlLlxyXG5cdCAqIEByZXR1cm4ge1dlYlhSQ29udHJvbGxlcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHR1cGRhdGUoIGlucHV0U291cmNlLCBmcmFtZSwgcmVmZXJlbmNlU3BhY2UgKSB7XHJcblxyXG5cdFx0bGV0IGlucHV0UG9zZSA9IG51bGw7XHJcblx0XHRsZXQgZ3JpcFBvc2UgPSBudWxsO1xyXG5cdFx0bGV0IGhhbmRQb3NlID0gbnVsbDtcclxuXHJcblx0XHRjb25zdCB0YXJnZXRSYXkgPSB0aGlzLl90YXJnZXRSYXk7XHJcblx0XHRjb25zdCBncmlwID0gdGhpcy5fZ3JpcDtcclxuXHRcdGNvbnN0IGhhbmQgPSB0aGlzLl9oYW5kO1xyXG5cclxuXHRcdGlmICggaW5wdXRTb3VyY2UgJiYgZnJhbWUuc2Vzc2lvbi52aXNpYmlsaXR5U3RhdGUgIT09ICd2aXNpYmxlLWJsdXJyZWQnICkge1xyXG5cclxuXHRcdFx0aWYgKCBoYW5kICYmIGlucHV0U291cmNlLmhhbmQgKSB7XHJcblxyXG5cdFx0XHRcdGhhbmRQb3NlID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0Zm9yICggY29uc3QgaW5wdXRqb2ludCBvZiBpbnB1dFNvdXJjZS5oYW5kLnZhbHVlcygpICkge1xyXG5cclxuXHRcdFx0XHRcdC8vIFVwZGF0ZSB0aGUgam9pbnRzIGdyb3VwcyB3aXRoIHRoZSBYUkpvaW50IHBvc2VzXHJcblx0XHRcdFx0XHRjb25zdCBqb2ludFBvc2UgPSBmcmFtZS5nZXRKb2ludFBvc2UoIGlucHV0am9pbnQsIHJlZmVyZW5jZVNwYWNlICk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gVGhlIHRyYW5zZm9ybSBvZiB0aGlzIGpvaW50IHdpbGwgYmUgdXBkYXRlZCB3aXRoIHRoZSBqb2ludCBwb3NlIG9uIGVhY2ggZnJhbWVcclxuXHRcdFx0XHRcdGNvbnN0IGpvaW50ID0gdGhpcy5fZ2V0SGFuZEpvaW50KCBoYW5kLCBpbnB1dGpvaW50ICk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBqb2ludFBvc2UgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRqb2ludC5tYXRyaXguZnJvbUFycmF5KCBqb2ludFBvc2UudHJhbnNmb3JtLm1hdHJpeCApO1xyXG5cdFx0XHRcdFx0XHRqb2ludC5tYXRyaXguZGVjb21wb3NlKCBqb2ludC5wb3NpdGlvbiwgam9pbnQucm90YXRpb24sIGpvaW50LnNjYWxlICk7XHJcblx0XHRcdFx0XHRcdGpvaW50Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cdFx0XHRcdFx0XHRqb2ludC5qb2ludFJhZGl1cyA9IGpvaW50UG9zZS5yYWRpdXM7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGpvaW50LnZpc2libGUgPSBqb2ludFBvc2UgIT09IG51bGw7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Ly8gQ3VzdG9tIGV2ZW50c1xyXG5cclxuXHRcdFx0XHQvLyBDaGVjayBwaW5jaHpcclxuXHRcdFx0XHRjb25zdCBpbmRleFRpcCA9IGhhbmQuam9pbnRzWyAnaW5kZXgtZmluZ2VyLXRpcCcgXTtcclxuXHRcdFx0XHRjb25zdCB0aHVtYlRpcCA9IGhhbmQuam9pbnRzWyAndGh1bWItdGlwJyBdO1xyXG5cdFx0XHRcdGNvbnN0IGRpc3RhbmNlID0gaW5kZXhUaXAucG9zaXRpb24uZGlzdGFuY2VUbyggdGh1bWJUaXAucG9zaXRpb24gKTtcclxuXHJcblx0XHRcdFx0Y29uc3QgZGlzdGFuY2VUb1BpbmNoID0gMC4wMjtcclxuXHRcdFx0XHRjb25zdCB0aHJlc2hvbGQgPSAwLjAwNTtcclxuXHJcblx0XHRcdFx0aWYgKCBoYW5kLmlucHV0U3RhdGUucGluY2hpbmcgJiYgZGlzdGFuY2UgPiBkaXN0YW5jZVRvUGluY2ggKyB0aHJlc2hvbGQgKSB7XHJcblxyXG5cdFx0XHRcdFx0aGFuZC5pbnB1dFN0YXRlLnBpbmNoaW5nID0gZmFsc2U7XHJcblx0XHRcdFx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoIHtcclxuXHRcdFx0XHRcdFx0dHlwZTogJ3BpbmNoZW5kJyxcclxuXHRcdFx0XHRcdFx0aGFuZGVkbmVzczogaW5wdXRTb3VyY2UuaGFuZGVkbmVzcyxcclxuXHRcdFx0XHRcdFx0dGFyZ2V0OiB0aGlzXHJcblx0XHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoICEgaGFuZC5pbnB1dFN0YXRlLnBpbmNoaW5nICYmIGRpc3RhbmNlIDw9IGRpc3RhbmNlVG9QaW5jaCAtIHRocmVzaG9sZCApIHtcclxuXHJcblx0XHRcdFx0XHRoYW5kLmlucHV0U3RhdGUucGluY2hpbmcgPSB0cnVlO1xyXG5cdFx0XHRcdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCB7XHJcblx0XHRcdFx0XHRcdHR5cGU6ICdwaW5jaHN0YXJ0JyxcclxuXHRcdFx0XHRcdFx0aGFuZGVkbmVzczogaW5wdXRTb3VyY2UuaGFuZGVkbmVzcyxcclxuXHRcdFx0XHRcdFx0dGFyZ2V0OiB0aGlzXHJcblx0XHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGlmICggZ3JpcCAhPT0gbnVsbCAmJiBpbnB1dFNvdXJjZS5ncmlwU3BhY2UgKSB7XHJcblxyXG5cdFx0XHRcdFx0Z3JpcFBvc2UgPSBmcmFtZS5nZXRQb3NlKCBpbnB1dFNvdXJjZS5ncmlwU3BhY2UsIHJlZmVyZW5jZVNwYWNlICk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBncmlwUG9zZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHRcdGdyaXAubWF0cml4LmZyb21BcnJheSggZ3JpcFBvc2UudHJhbnNmb3JtLm1hdHJpeCApO1xyXG5cdFx0XHRcdFx0XHRncmlwLm1hdHJpeC5kZWNvbXBvc2UoIGdyaXAucG9zaXRpb24sIGdyaXAucm90YXRpb24sIGdyaXAuc2NhbGUgKTtcclxuXHRcdFx0XHRcdFx0Z3JpcC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggZ3JpcFBvc2UubGluZWFyVmVsb2NpdHkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGdyaXAuaGFzTGluZWFyVmVsb2NpdHkgPSB0cnVlO1xyXG5cdFx0XHRcdFx0XHRcdGdyaXAubGluZWFyVmVsb2NpdHkuY29weSggZ3JpcFBvc2UubGluZWFyVmVsb2NpdHkgKTtcclxuXHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGdyaXAuaGFzTGluZWFyVmVsb2NpdHkgPSBmYWxzZTtcclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdGlmICggZ3JpcFBvc2UuYW5ndWxhclZlbG9jaXR5ICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRncmlwLmhhc0FuZ3VsYXJWZWxvY2l0eSA9IHRydWU7XHJcblx0XHRcdFx0XHRcdFx0Z3JpcC5hbmd1bGFyVmVsb2NpdHkuY29weSggZ3JpcFBvc2UuYW5ndWxhclZlbG9jaXR5ICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRncmlwLmhhc0FuZ3VsYXJWZWxvY2l0eSA9IGZhbHNlO1xyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCB0YXJnZXRSYXkgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdGlucHV0UG9zZSA9IGZyYW1lLmdldFBvc2UoIGlucHV0U291cmNlLnRhcmdldFJheVNwYWNlLCByZWZlcmVuY2VTcGFjZSApO1xyXG5cclxuXHRcdFx0XHQvLyBTb21lIHJ1bnRpbWVzIChuYW1lbHkgVml2ZSBDb3Ntb3Mgd2l0aCBWaXZlIE9wZW5YUiBSdW50aW1lKSBoYXZlIG9ubHkgZ3JpcCBzcGFjZSBhbmQgcmF5IHNwYWNlIGlzIGVxdWFsIHRvIGl0XHJcblx0XHRcdFx0aWYgKCBpbnB1dFBvc2UgPT09IG51bGwgJiYgZ3JpcFBvc2UgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdFx0aW5wdXRQb3NlID0gZ3JpcFBvc2U7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKCBpbnB1dFBvc2UgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdFx0dGFyZ2V0UmF5Lm1hdHJpeC5mcm9tQXJyYXkoIGlucHV0UG9zZS50cmFuc2Zvcm0ubWF0cml4ICk7XHJcblx0XHRcdFx0XHR0YXJnZXRSYXkubWF0cml4LmRlY29tcG9zZSggdGFyZ2V0UmF5LnBvc2l0aW9uLCB0YXJnZXRSYXkucm90YXRpb24sIHRhcmdldFJheS5zY2FsZSApO1xyXG5cdFx0XHRcdFx0dGFyZ2V0UmF5Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHRcdGlmICggaW5wdXRQb3NlLmxpbmVhclZlbG9jaXR5ICkge1xyXG5cclxuXHRcdFx0XHRcdFx0dGFyZ2V0UmF5Lmhhc0xpbmVhclZlbG9jaXR5ID0gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0dGFyZ2V0UmF5LmxpbmVhclZlbG9jaXR5LmNvcHkoIGlucHV0UG9zZS5saW5lYXJWZWxvY2l0eSApO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHR0YXJnZXRSYXkuaGFzTGluZWFyVmVsb2NpdHkgPSBmYWxzZTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBpbnB1dFBvc2UuYW5ndWxhclZlbG9jaXR5ICkge1xyXG5cclxuXHRcdFx0XHRcdFx0dGFyZ2V0UmF5Lmhhc0FuZ3VsYXJWZWxvY2l0eSA9IHRydWU7XHJcblx0XHRcdFx0XHRcdHRhcmdldFJheS5hbmd1bGFyVmVsb2NpdHkuY29weSggaW5wdXRQb3NlLmFuZ3VsYXJWZWxvY2l0eSApO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHR0YXJnZXRSYXkuaGFzQW5ndWxhclZlbG9jaXR5ID0gZmFsc2U7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggX21vdmVFdmVudCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRhcmdldFJheSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRhcmdldFJheS52aXNpYmxlID0gKCBpbnB1dFBvc2UgIT09IG51bGwgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBncmlwICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0Z3JpcC52aXNpYmxlID0gKCBncmlwUG9zZSAhPT0gbnVsbCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGhhbmQgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRoYW5kLnZpc2libGUgPSAoIGhhbmRQb3NlICE9PSBudWxsICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBncm91cCByZXByZXNlbnRpbmcgdGhlIGhhbmQgam9pbnQgZm9yIHRoZSBnaXZlbiBpbnB1dCBqb2ludC5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtHcm91cH0gaGFuZCAtIFRoZSBncm91cCByZXByZXNlbnRpbmcgdGhlIGhhbmQgc3BhY2UuXHJcblx0ICogQHBhcmFtIHtYUkhhbmRKb2ludH0gaW5wdXRqb2ludCAtIFRoZSBYUiBmcmFtZS5cclxuXHQgKiBAcmV0dXJuIHtHcm91cH0gQSBncm91cCByZXByZXNlbnRpbmcgdGhlIGhhbmQgam9pbnQgZm9yIHRoZSBnaXZlbiBpbnB1dCBqb2ludC5cclxuXHQgKi9cclxuXHRfZ2V0SGFuZEpvaW50KCBoYW5kLCBpbnB1dGpvaW50ICkge1xyXG5cclxuXHRcdGlmICggaGFuZC5qb2ludHNbIGlucHV0am9pbnQuam9pbnROYW1lIF0gPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGpvaW50ID0gbmV3IEdyb3VwKCk7XHJcblx0XHRcdGpvaW50Lm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcclxuXHRcdFx0am9pbnQudmlzaWJsZSA9IGZhbHNlO1xyXG5cdFx0XHRoYW5kLmpvaW50c1sgaW5wdXRqb2ludC5qb2ludE5hbWUgXSA9IGpvaW50O1xyXG5cclxuXHRcdFx0aGFuZC5hZGQoIGpvaW50ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBoYW5kLmpvaW50c1sgaW5wdXRqb2ludC5qb2ludE5hbWUgXTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCB7IFdlYlhSQ29udHJvbGxlciB9O1xyXG4iLCJpbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uL21hdGgvQ29sb3IuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIGFuIGV4cG9uZW50aWFsIHNxdWFyZWQgZm9nLFxyXG4gKiB3aGljaCBnaXZlcyBhIGNsZWFyIHZpZXcgbmVhciB0aGUgY2FtZXJhIGFuZCBhIGZhc3RlciB0aGFuIGV4cG9uZW50aWFsbHlcclxuICogZGVuc2VuaW5nIGZvZyBmYXJ0aGVyIGZyb20gdGhlIGNhbWVyYS5cclxuICpcclxuICogYGBganNcclxuICogY29uc3Qgc2NlbmUgPSBuZXcgVEhSRUUuU2NlbmUoKTtcclxuICogc2NlbmUuZm9nID0gbmV3IFRIUkVFLkZvZ0V4cDIoIDB4Y2NjY2NjLCAwLjAwMiApO1xyXG4gKiBgYGBcclxuICovXHJcbmNsYXNzIEZvZ0V4cDIge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGZvZy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfENvbG9yfSBjb2xvciAtIFRoZSBmb2cncyBjb2xvci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2RlbnNpdHk9MC4wMDAyNV0gLSBEZWZpbmVzIGhvdyBmYXN0IHRoZSBmb2cgd2lsbCBncm93IGRlbnNlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBjb2xvciwgZGVuc2l0eSA9IDAuMDAwMjUgKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzRm9nRXhwMiA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbmFtZSBvZiB0aGUgZm9nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubmFtZSA9ICcnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGZvZydzIGNvbG9yLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtDb2xvcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggY29sb3IgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqICBEZWZpbmVzIGhvdyBmYXN0IHRoZSBmb2cgd2lsbCBncm93IGRlbnNlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwLjAwMDI1XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGVuc2l0eSA9IGRlbnNpdHk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIG5ldyBmb2cgd2l0aCBjb3BpZWQgdmFsdWVzIGZyb20gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0ZvZ0V4cDJ9IEEgY2xvbmUgb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjbG9uZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IEZvZ0V4cDIoIHRoaXMuY29sb3IsIHRoaXMuZGVuc2l0eSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNlcmlhbGl6ZXMgdGhlIGZvZyBpbnRvIEpTT04uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gez8oT2JqZWN0fHN0cmluZyl9IG1ldGEgLSBBbiBvcHRpb25hbCB2YWx1ZSBob2xkaW5nIG1ldGEgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlcmlhbGl6YXRpb24uXHJcblx0ICogQHJldHVybiB7T2JqZWN0fSBBIEpTT04gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc2VyaWFsaXplZCBmb2dcclxuXHQgKi9cclxuXHR0b0pTT04oIC8qIG1ldGEgKi8gKSB7XHJcblxyXG5cdFx0cmV0dXJuIHtcclxuXHRcdFx0dHlwZTogJ0ZvZ0V4cDInLFxyXG5cdFx0XHRuYW1lOiB0aGlzLm5hbWUsXHJcblx0XHRcdGNvbG9yOiB0aGlzLmNvbG9yLmdldEhleCgpLFxyXG5cdFx0XHRkZW5zaXR5OiB0aGlzLmRlbnNpdHlcclxuXHRcdH07XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IEZvZ0V4cDIgfTtcclxuIiwiaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi9tYXRoL0NvbG9yLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIHRvIGRlZmluZSBhIGxpbmVhciBmb2cgdGhhdCBncm93cyBsaW5lYXJseSBkZW5zZXJcclxuICogd2l0aCB0aGUgZGlzdGFuY2UuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IHNjZW5lID0gbmV3IFRIUkVFLlNjZW5lKCk7XHJcbiAqIHNjZW5lLmZvZyA9IG5ldyBUSFJFRS5Gb2coIDB4Y2NjY2NjLCAxMCwgMTUgKTtcclxuICogYGBgXHJcbiAqL1xyXG5jbGFzcyBGb2cge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGZvZy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfENvbG9yfSBjb2xvciAtIFRoZSBmb2cncyBjb2xvci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW25lYXI9MV0gLSBUaGUgbWluaW11bSBkaXN0YW5jZSB0byBzdGFydCBhcHBseWluZyBmb2cuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtmYXI9MTAwMF0gLSBUaGUgbWF4aW11bSBkaXN0YW5jZSBhdCB3aGljaCBmb2cgc3RvcHMgYmVpbmcgY2FsY3VsYXRlZCBhbmQgYXBwbGllZC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggY29sb3IsIG5lYXIgPSAxLCBmYXIgPSAxMDAwICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0ZvZyA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbmFtZSBvZiB0aGUgZm9nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubmFtZSA9ICcnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGZvZydzIGNvbG9yLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtDb2xvcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggY29sb3IgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBtaW5pbXVtIGRpc3RhbmNlIHRvIHN0YXJ0IGFwcGx5aW5nIGZvZy4gT2JqZWN0cyB0aGF0IGFyZSBsZXNzIHRoYW5cclxuXHRcdCAqIGBuZWFyYCB1bml0cyBmcm9tIHRoZSBhY3RpdmUgY2FtZXJhIHdvbid0IGJlIGFmZmVjdGVkIGJ5IGZvZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5lYXIgPSBuZWFyO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG1heGltdW0gZGlzdGFuY2UgYXQgd2hpY2ggZm9nIHN0b3BzIGJlaW5nIGNhbGN1bGF0ZWQgYW5kIGFwcGxpZWQuXHJcblx0XHQgKiBPYmplY3RzIHRoYXQgYXJlIG1vcmUgdGhhbiBgZmFyYCB1bml0cyBhd2F5IGZyb20gdGhlIGFjdGl2ZSBjYW1lcmEgd29uJ3RcclxuXHRcdCAqIGJlIGFmZmVjdGVkIGJ5IGZvZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMTAwMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZhciA9IGZhcjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbmV3IGZvZyB3aXRoIGNvcGllZCB2YWx1ZXMgZnJvbSB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Rm9nfSBBIGNsb25lIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y2xvbmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBGb2coIHRoaXMuY29sb3IsIHRoaXMubmVhciwgdGhpcy5mYXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXJpYWxpemVzIHRoZSBmb2cgaW50byBKU09OLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHs/KE9iamVjdHxzdHJpbmcpfSBtZXRhIC0gQW4gb3B0aW9uYWwgdmFsdWUgaG9sZGluZyBtZXRhIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZXJpYWxpemF0aW9uLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdH0gQSBKU09OIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNlcmlhbGl6ZWQgZm9nXHJcblx0ICovXHJcblx0dG9KU09OKCAvKiBtZXRhICovICkge1xyXG5cclxuXHRcdHJldHVybiB7XHJcblx0XHRcdHR5cGU6ICdGb2cnLFxyXG5cdFx0XHRuYW1lOiB0aGlzLm5hbWUsXHJcblx0XHRcdGNvbG9yOiB0aGlzLmNvbG9yLmdldEhleCgpLFxyXG5cdFx0XHRuZWFyOiB0aGlzLm5lYXIsXHJcblx0XHRcdGZhcjogdGhpcy5mYXJcclxuXHRcdH07XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IEZvZyB9O1xyXG4iLCJpbXBvcnQgeyBPYmplY3QzRCB9IGZyb20gJy4uL2NvcmUvT2JqZWN0M0QuanMnO1xyXG5pbXBvcnQgeyBFdWxlciB9IGZyb20gJy4uL21hdGgvRXVsZXIuanMnO1xyXG5cclxuLyoqXHJcbiAqIFNjZW5lcyBhbGxvdyB5b3UgdG8gc2V0IHVwIHdoYXQgaXMgdG8gYmUgcmVuZGVyZWQgYW5kIHdoZXJlIGJ5IHRocmVlLmpzLlxyXG4gKiBUaGlzIGlzIHdoZXJlIHlvdSBwbGFjZSAzRCBvYmplY3RzIGxpa2UgbWVzaGVzLCBsaW5lcyBvciBsaWdodHMuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBPYmplY3QzRFxyXG4gKi9cclxuY2xhc3MgU2NlbmUgZXh0ZW5kcyBPYmplY3QzRCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc2NlbmUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNTY2VuZSA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ1NjZW5lJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgdGhlIGJhY2tncm91bmQgb2YgdGhlIHNjZW5lLiBWYWxpZCBpbnB1dHMgYXJlOlxyXG5cdFx0ICpcclxuXHRcdCAqIC0gQSBjb2xvciBmb3IgZGVmaW5pbmcgYSB1bmlmb3JtIGNvbG9yZWQgYmFja2dyb3VuZC5cclxuXHRcdCAqIC0gQSB0ZXh0dXJlIGZvciBkZWZpbmluZyBhIChmbGF0KSB0ZXh0dXJlZCBiYWNrZ3JvdW5kLlxyXG5cdFx0ICogLSBDdWJlIHRleHR1cmVzIG9yIGVxdWlyZWN0YW5ndWxhciB0ZXh0dXJlcyBmb3IgZGVmaW5pbmcgYSBza3lib3guXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez8oQ29sb3J8VGV4dHVyZSl9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYmFja2dyb3VuZCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTZXRzIHRoZSBlbnZpcm9ubWVudCBtYXAgZm9yIGFsbCBwaHlzaWNhbCBtYXRlcmlhbHMgaW4gdGhlIHNjZW5lLiBIb3dldmVyLFxyXG5cdFx0ICogaXQncyBub3QgcG9zc2libGUgdG8gb3ZlcndyaXRlIGFuIGV4aXN0aW5nIHRleHR1cmUgYXNzaWduZWQgdG8gdGhlIGBlbnZNYXBgXHJcblx0XHQgKiBtYXRlcmlhbCBwcm9wZXJ0eS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZW52aXJvbm1lbnQgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBmb2cgaW5zdGFuY2UgZGVmaW5pbmcgdGhlIHR5cGUgb2YgZm9nIHRoYXQgYWZmZWN0cyBldmVyeXRoaW5nXHJcblx0XHQgKiByZW5kZXJlZCBpbiB0aGUgc2NlbmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez8oRm9nfEZvZ0V4cDIpfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZvZyA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTZXRzIHRoZSBibHVycmluZXNzIG9mIHRoZSBiYWNrZ3JvdW5kLiBPbmx5IGluZmx1ZW5jZXMgZW52aXJvbm1lbnQgbWFwc1xyXG5cdFx0ICogYXNzaWduZWQgdG8ge0BsaW5rIFNjZW5lI2JhY2tncm91bmR9LiBWYWxpZCBpbnB1dCBpcyBhIGZsb2F0IGJldHdlZW4gYDBgXHJcblx0XHQgKiBhbmQgYDFgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYmFja2dyb3VuZEJsdXJyaW5lc3MgPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQXR0ZW51YXRlcyB0aGUgY29sb3Igb2YgdGhlIGJhY2tncm91bmQuIE9ubHkgYXBwbGllcyB0byBiYWNrZ3JvdW5kIHRleHR1cmVzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYmFja2dyb3VuZEludGVuc2l0eSA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcm90YXRpb24gb2YgdGhlIGJhY2tncm91bmQgaW4gcmFkaWFucy4gT25seSBpbmZsdWVuY2VzIGVudmlyb25tZW50IG1hcHNcclxuXHRcdCAqIGFzc2lnbmVkIHRvIHtAbGluayBTY2VuZSNiYWNrZ3JvdW5kfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7RXVsZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAoMCwwLDApXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYmFja2dyb3VuZFJvdGF0aW9uID0gbmV3IEV1bGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBdHRlbnVhdGVzIHRoZSBjb2xvciBvZiB0aGUgZW52aXJvbm1lbnQuIE9ubHkgaW5mbHVlbmNlcyBlbnZpcm9ubWVudCBtYXBzXHJcblx0XHQgKiBhc3NpZ25lZCB0byB7QGxpbmsgU2NlbmUjZW52aXJvbm1lbnR9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZW52aXJvbm1lbnRJbnRlbnNpdHkgPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJvdGF0aW9uIG9mIHRoZSBlbnZpcm9ubWVudCBtYXAgaW4gcmFkaWFucy4gT25seSBpbmZsdWVuY2VzIHBoeXNpY2FsIG1hdGVyaWFsc1xyXG5cdFx0ICogaW4gdGhlIHNjZW5lIHdoZW4ge0BsaW5rIFNjZW5lI2Vudmlyb25tZW50fSBpcyB1c2VkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtFdWxlcn1cclxuXHRcdCAqIEBkZWZhdWx0ICgwLDAsMClcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5lbnZpcm9ubWVudFJvdGF0aW9uID0gbmV3IEV1bGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBGb3JjZXMgZXZlcnl0aGluZyBpbiB0aGUgc2NlbmUgdG8gYmUgcmVuZGVyZWQgd2l0aCB0aGUgZGVmaW5lZCBtYXRlcmlhbC4gSXQgaXMgcG9zc2libGVcclxuXHRcdCAqIHRvIGV4Y2x1ZGUgbWF0ZXJpYWxzIGZyb20gb3ZlcnJpZGUgYnkgc2V0dGluZyB7QGxpbmsgTWF0ZXJpYWwjYWxsb3dPdmVycmlkZX0gdG8gYGZhbHNlYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P01hdGVyaWFsfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm92ZXJyaWRlTWF0ZXJpYWwgPSBudWxsO1xyXG5cclxuXHRcdGlmICggdHlwZW9mIF9fVEhSRUVfREVWVE9PTFNfXyAhPT0gJ3VuZGVmaW5lZCcgKSB7XHJcblxyXG5cdFx0XHRfX1RIUkVFX0RFVlRPT0xTX18uZGlzcGF0Y2hFdmVudCggbmV3IEN1c3RvbUV2ZW50KCAnb2JzZXJ2ZScsIHsgZGV0YWlsOiB0aGlzIH0gKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UsIHJlY3Vyc2l2ZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UsIHJlY3Vyc2l2ZSApO1xyXG5cclxuXHRcdGlmICggc291cmNlLmJhY2tncm91bmQgIT09IG51bGwgKSB0aGlzLmJhY2tncm91bmQgPSBzb3VyY2UuYmFja2dyb3VuZC5jbG9uZSgpO1xyXG5cdFx0aWYgKCBzb3VyY2UuZW52aXJvbm1lbnQgIT09IG51bGwgKSB0aGlzLmVudmlyb25tZW50ID0gc291cmNlLmVudmlyb25tZW50LmNsb25lKCk7XHJcblx0XHRpZiAoIHNvdXJjZS5mb2cgIT09IG51bGwgKSB0aGlzLmZvZyA9IHNvdXJjZS5mb2cuY2xvbmUoKTtcclxuXHJcblx0XHR0aGlzLmJhY2tncm91bmRCbHVycmluZXNzID0gc291cmNlLmJhY2tncm91bmRCbHVycmluZXNzO1xyXG5cdFx0dGhpcy5iYWNrZ3JvdW5kSW50ZW5zaXR5ID0gc291cmNlLmJhY2tncm91bmRJbnRlbnNpdHk7XHJcblx0XHR0aGlzLmJhY2tncm91bmRSb3RhdGlvbi5jb3B5KCBzb3VyY2UuYmFja2dyb3VuZFJvdGF0aW9uICk7XHJcblxyXG5cdFx0dGhpcy5lbnZpcm9ubWVudEludGVuc2l0eSA9IHNvdXJjZS5lbnZpcm9ubWVudEludGVuc2l0eTtcclxuXHRcdHRoaXMuZW52aXJvbm1lbnRSb3RhdGlvbi5jb3B5KCBzb3VyY2UuZW52aXJvbm1lbnRSb3RhdGlvbiApO1xyXG5cclxuXHRcdGlmICggc291cmNlLm92ZXJyaWRlTWF0ZXJpYWwgIT09IG51bGwgKSB0aGlzLm92ZXJyaWRlTWF0ZXJpYWwgPSBzb3VyY2Uub3ZlcnJpZGVNYXRlcmlhbC5jbG9uZSgpO1xyXG5cclxuXHRcdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IHNvdXJjZS5tYXRyaXhBdXRvVXBkYXRlO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdHRvSlNPTiggbWV0YSApIHtcclxuXHJcblx0XHRjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCBtZXRhICk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmZvZyAhPT0gbnVsbCApIGRhdGEub2JqZWN0LmZvZyA9IHRoaXMuZm9nLnRvSlNPTigpO1xyXG5cclxuXHRcdGlmICggdGhpcy5iYWNrZ3JvdW5kQmx1cnJpbmVzcyA+IDAgKSBkYXRhLm9iamVjdC5iYWNrZ3JvdW5kQmx1cnJpbmVzcyA9IHRoaXMuYmFja2dyb3VuZEJsdXJyaW5lc3M7XHJcblx0XHRpZiAoIHRoaXMuYmFja2dyb3VuZEludGVuc2l0eSAhPT0gMSApIGRhdGEub2JqZWN0LmJhY2tncm91bmRJbnRlbnNpdHkgPSB0aGlzLmJhY2tncm91bmRJbnRlbnNpdHk7XHJcblx0XHRkYXRhLm9iamVjdC5iYWNrZ3JvdW5kUm90YXRpb24gPSB0aGlzLmJhY2tncm91bmRSb3RhdGlvbi50b0FycmF5KCk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmVudmlyb25tZW50SW50ZW5zaXR5ICE9PSAxICkgZGF0YS5vYmplY3QuZW52aXJvbm1lbnRJbnRlbnNpdHkgPSB0aGlzLmVudmlyb25tZW50SW50ZW5zaXR5O1xyXG5cdFx0ZGF0YS5vYmplY3QuZW52aXJvbm1lbnRSb3RhdGlvbiA9IHRoaXMuZW52aXJvbm1lbnRSb3RhdGlvbi50b0FycmF5KCk7XHJcblxyXG5cdFx0cmV0dXJuIGRhdGE7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFNjZW5lIH07XHJcbiIsImltcG9ydCB7IGdlbmVyYXRlVVVJRCB9IGZyb20gJy4uL21hdGgvTWF0aFV0aWxzLmpzJztcclxuaW1wb3J0IHsgU3RhdGljRHJhd1VzYWdlIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBcIkludGVybGVhdmVkXCIgbWVhbnMgdGhhdCBtdWx0aXBsZSBhdHRyaWJ1dGVzLCBwb3NzaWJseSBvZiBkaWZmZXJlbnQgdHlwZXMsXHJcbiAqIChlLmcuLCBwb3NpdGlvbiwgbm9ybWFsLCB1diwgY29sb3IpIGFyZSBwYWNrZWQgaW50byBhIHNpbmdsZSBhcnJheSBidWZmZXIuXHJcbiAqXHJcbiAqIEFuIGludHJvZHVjdGlvbiBpbnRvIGludGVybGVhdmVkIGFycmF5cyBjYW4gYmUgZm91bmQgaGVyZTogW0ludGVybGVhdmVkIGFycmF5IGJhc2ljc117QGxpbmsgaHR0cHM6Ly9ibG9nLnRvamljb2RlLmNvbS8yMDExLzA1L2ludGVybGVhdmVkLWFycmF5LWJhc2ljcy5odG1sfVxyXG4gKi9cclxuY2xhc3MgSW50ZXJsZWF2ZWRCdWZmZXIge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGludGVybGVhdmVkIGJ1ZmZlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VHlwZWRBcnJheX0gYXJyYXkgLSBBIHR5cGVkIGFycmF5IHdpdGggYSBzaGFyZWQgYnVmZmVyIHN0b3JpbmcgYXR0cmlidXRlIGRhdGEuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHN0cmlkZSAtIFRoZSBudW1iZXIgb2YgdHlwZWQtYXJyYXkgZWxlbWVudHMgcGVyIHZlcnRleC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggYXJyYXksIHN0cmlkZSApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNJbnRlcmxlYXZlZEJ1ZmZlciA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHR5cGVkIGFycmF5IHdpdGggYSBzaGFyZWQgYnVmZmVyIHN0b3JpbmcgYXR0cmlidXRlIGRhdGEuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1R5cGVkQXJyYXl9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYXJyYXkgPSBhcnJheTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBudW1iZXIgb2YgdHlwZWQtYXJyYXkgZWxlbWVudHMgcGVyIHZlcnRleC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnN0cmlkZSA9IHN0cmlkZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB0b3RhbCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGFycmF5XHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvdW50ID0gYXJyYXkgIT09IHVuZGVmaW5lZCA/IGFycmF5Lmxlbmd0aCAvIHN0cmlkZSA6IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIHRoZSBpbnRlbmRlZCB1c2FnZSBwYXR0ZXJuIG9mIHRoZSBkYXRhIHN0b3JlIGZvciBvcHRpbWl6YXRpb24gcHVycG9zZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogTm90ZTogQWZ0ZXIgdGhlIGluaXRpYWwgdXNlIG9mIGEgYnVmZmVyLCBpdHMgdXNhZ2UgY2Fubm90IGJlIGNoYW5nZWQuIEluc3RlYWQsXHJcblx0XHQgKiBpbnN0YW50aWF0ZSBhIG5ldyBvbmUgYW5kIHNldCB0aGUgZGVzaXJlZCB1c2FnZSBiZWZvcmUgdGhlIG5leHQgcmVuZGVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoU3RhdGljRHJhd1VzYWdlfER5bmFtaWNEcmF3VXNhZ2V8U3RyZWFtRHJhd1VzYWdlfFN0YXRpY1JlYWRVc2FnZXxEeW5hbWljUmVhZFVzYWdlfFN0cmVhbVJlYWRVc2FnZXxTdGF0aWNDb3B5VXNhZ2V8RHluYW1pY0NvcHlVc2FnZXxTdHJlYW1Db3B5VXNhZ2UpfVxyXG5cdFx0ICogQGRlZmF1bHQgU3RhdGljRHJhd1VzYWdlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXNhZ2UgPSBTdGF0aWNEcmF3VXNhZ2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIG9ubHkgdXBkYXRlIHNvbWUgY29tcG9uZW50cyBvZiBzdG9yZWQgdmVjdG9ycyAoZm9yIGV4YW1wbGUsIGp1c3QgdGhlXHJcblx0XHQgKiBjb21wb25lbnQgcmVsYXRlZCB0byBjb2xvcikuIFVzZSB0aGUgYGFkZFVwZGF0ZVJhbmdlKClgIGZ1bmN0aW9uIHRvIGFkZCByYW5nZXMgdG8gdGhpcyBhcnJheS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8T2JqZWN0Pn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51cGRhdGVSYW5nZXMgPSBbXTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgdmVyc2lvbiBudW1iZXIsIGluY3JlbWVudGVkIGV2ZXJ5IHRpbWUgdGhlIGBuZWVkc1VwZGF0ZWAgaXMgc2V0IHRvIGB0cnVlYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnZlcnNpb24gPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIFVVSUQgb2YgdGhlIGludGVybGVhdmVkIGJ1ZmZlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXVpZCA9IGdlbmVyYXRlVVVJRCgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBleGVjdXRlZCBhZnRlciB0aGUgcmVuZGVyZXIgaGFzIHRyYW5zZmVycmVkIHRoZSBhdHRyaWJ1dGUgYXJyYXlcclxuXHQgKiBkYXRhIHRvIHRoZSBHUFUuXHJcblx0ICovXHJcblx0b25VcGxvYWRDYWxsYmFjaygpIHt9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZsYWcgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIGF0dHJpYnV0ZSBoYXMgY2hhbmdlZCBhbmQgc2hvdWxkIGJlIHJlLXNlbnQgdG9cclxuXHQgKiB0aGUgR1BVLiBTZXQgdGhpcyB0byBgdHJ1ZWAgd2hlbiB5b3UgbW9kaWZ5IHRoZSB2YWx1ZSBvZiB0aGUgYXJyYXkuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0ICogQHBhcmFtIHtib29sZWFufSB2YWx1ZVxyXG5cdCAqL1xyXG5cdHNldCBuZWVkc1VwZGF0ZSggdmFsdWUgKSB7XHJcblxyXG5cdFx0aWYgKCB2YWx1ZSA9PT0gdHJ1ZSApIHRoaXMudmVyc2lvbiArKztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB1c2FnZSBvZiB0aGlzIGludGVybGVhdmVkIGJ1ZmZlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7KFN0YXRpY0RyYXdVc2FnZXxEeW5hbWljRHJhd1VzYWdlfFN0cmVhbURyYXdVc2FnZXxTdGF0aWNSZWFkVXNhZ2V8RHluYW1pY1JlYWRVc2FnZXxTdHJlYW1SZWFkVXNhZ2V8U3RhdGljQ29weVVzYWdlfER5bmFtaWNDb3B5VXNhZ2V8U3RyZWFtQ29weVVzYWdlKX0gdmFsdWUgLSBUaGUgdXNhZ2UgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge0ludGVybGVhdmVkQnVmZmVyfSBBIHJlZmVyZW5jZSB0byB0aGlzIGludGVybGVhdmVkIGJ1ZmZlci5cclxuXHQgKi9cclxuXHRzZXRVc2FnZSggdmFsdWUgKSB7XHJcblxyXG5cdFx0dGhpcy51c2FnZSA9IHZhbHVlO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgYSByYW5nZSBvZiBkYXRhIGluIHRoZSBkYXRhIGFycmF5IHRvIGJlIHVwZGF0ZWQgb24gdGhlIEdQVS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCAtIFBvc2l0aW9uIGF0IHdoaWNoIHRvIHN0YXJ0IHVwZGF0ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gY291bnQgLSBUaGUgbnVtYmVyIG9mIGNvbXBvbmVudHMgdG8gdXBkYXRlLlxyXG5cdCAqL1xyXG5cdGFkZFVwZGF0ZVJhbmdlKCBzdGFydCwgY291bnQgKSB7XHJcblxyXG5cdFx0dGhpcy51cGRhdGVSYW5nZXMucHVzaCggeyBzdGFydCwgY291bnQgfSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENsZWFycyB0aGUgdXBkYXRlIHJhbmdlcy5cclxuXHQgKi9cclxuXHRjbGVhclVwZGF0ZVJhbmdlcygpIHtcclxuXHJcblx0XHR0aGlzLnVwZGF0ZVJhbmdlcy5sZW5ndGggPSAwO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvcGllcyB0aGUgdmFsdWVzIG9mIHRoZSBnaXZlbiBpbnRlcmxlYXZlZCBidWZmZXIgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7SW50ZXJsZWF2ZWRCdWZmZXJ9IHNvdXJjZSAtIFRoZSBpbnRlcmxlYXZlZCBidWZmZXIgdG8gY29weS5cclxuXHQgKiBAcmV0dXJuIHtJbnRlcmxlYXZlZEJ1ZmZlcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0dGhpcy5hcnJheSA9IG5ldyBzb3VyY2UuYXJyYXkuY29uc3RydWN0b3IoIHNvdXJjZS5hcnJheSApO1xyXG5cdFx0dGhpcy5jb3VudCA9IHNvdXJjZS5jb3VudDtcclxuXHRcdHRoaXMuc3RyaWRlID0gc291cmNlLnN0cmlkZTtcclxuXHRcdHRoaXMudXNhZ2UgPSBzb3VyY2UudXNhZ2U7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29waWVzIGEgdmVjdG9yIGZyb20gdGhlIGdpdmVuIGludGVybGVhdmVkIGJ1ZmZlciB0byB0aGlzIG9uZS4gVGhlIHN0YXJ0XHJcblx0ICogYW5kIGRlc3RpbmF0aW9uIHBvc2l0aW9uIGluIHRoZSBhdHRyaWJ1dGUgYnVmZmVycyBhcmUgcmVwcmVzZW50ZWQgYnkgdGhlXHJcblx0ICogZ2l2ZW4gaW5kaWNlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleDEgLSBUaGUgZGVzdGluYXRpb24gaW5kZXggaW50byB0aGlzIGludGVybGVhdmVkIGJ1ZmZlci5cclxuXHQgKiBAcGFyYW0ge0ludGVybGVhdmVkQnVmZmVyfSBpbnRlcmxlYXZlZEJ1ZmZlciAtIFRoZSBpbnRlcmxlYXZlZCBidWZmZXIgdG8gY29weSBmcm9tLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleDIgLSBUaGUgc291cmNlIGluZGV4IGludG8gdGhlIGdpdmVuIGludGVybGVhdmVkIGJ1ZmZlci5cclxuXHQgKiBAcmV0dXJuIHtJbnRlcmxlYXZlZEJ1ZmZlcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjb3B5QXQoIGluZGV4MSwgaW50ZXJsZWF2ZWRCdWZmZXIsIGluZGV4MiApIHtcclxuXHJcblx0XHRpbmRleDEgKj0gdGhpcy5zdHJpZGU7XHJcblx0XHRpbmRleDIgKj0gaW50ZXJsZWF2ZWRCdWZmZXIuc3RyaWRlO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHRoaXMuc3RyaWRlOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdHRoaXMuYXJyYXlbIGluZGV4MSArIGkgXSA9IGludGVybGVhdmVkQnVmZmVyLmFycmF5WyBpbmRleDIgKyBpIF07XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGdpdmVuIGFycmF5IGRhdGEgaW4gdGhlIGludGVybGVhdmVkIGJ1ZmZlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7KFR5cGVkQXJyYXl8QXJyYXkpfSB2YWx1ZSAtIFRoZSBhcnJheSBkYXRhIHRvIHNldC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW29mZnNldD0wXSAtIFRoZSBvZmZzZXQgaW4gdGhpcyBpbnRlcmxlYXZlZCBidWZmZXIncyBhcnJheS5cclxuXHQgKiBAcmV0dXJuIHtJbnRlcmxlYXZlZEJ1ZmZlcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXQoIHZhbHVlLCBvZmZzZXQgPSAwICkge1xyXG5cclxuXHRcdHRoaXMuYXJyYXkuc2V0KCB2YWx1ZSwgb2Zmc2V0ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIG5ldyBpbnRlcmxlYXZlZCBidWZmZXIgd2l0aCBjb3BpZWQgdmFsdWVzIGZyb20gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbZGF0YV0gLSBBbiBvYmplY3Qgd2l0aCBzaGFyZWQgYXJyYXkgYnVmZmVycyB0aGF0IGFsbG93cyB0byByZXRhaW4gc2hhcmVkIHN0cnVjdHVyZXMuXHJcblx0ICogQHJldHVybiB7SW50ZXJsZWF2ZWRCdWZmZXJ9IEEgY2xvbmUgb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjbG9uZSggZGF0YSApIHtcclxuXHJcblx0XHRpZiAoIGRhdGEuYXJyYXlCdWZmZXJzID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRkYXRhLmFycmF5QnVmZmVycyA9IHt9O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMuYXJyYXkuYnVmZmVyLl91dWlkID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZCA9IGdlbmVyYXRlVVVJRCgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGRhdGEuYXJyYXlCdWZmZXJzWyB0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZCBdID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRkYXRhLmFycmF5QnVmZmVyc1sgdGhpcy5hcnJheS5idWZmZXIuX3V1aWQgXSA9IHRoaXMuYXJyYXkuc2xpY2UoIDAgKS5idWZmZXI7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGFycmF5ID0gbmV3IHRoaXMuYXJyYXkuY29uc3RydWN0b3IoIGRhdGEuYXJyYXlCdWZmZXJzWyB0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZCBdICk7XHJcblxyXG5cdFx0Y29uc3QgaWIgPSBuZXcgdGhpcy5jb25zdHJ1Y3RvciggYXJyYXksIHRoaXMuc3RyaWRlICk7XHJcblx0XHRpYi5zZXRVc2FnZSggdGhpcy51c2FnZSApO1xyXG5cclxuXHRcdHJldHVybiBpYjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBnaXZlbiBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGV4ZWN1dGVkIGFmdGVyIHRoZSBSZW5kZXJlciBoYXMgdHJhbnNmZXJyZWRcclxuXHQgKiB0aGUgYXJyYXkgZGF0YSB0byB0aGUgR1BVLiBDYW4gYmUgdXNlZCB0byBwZXJmb3JtIGNsZWFuLXVwIG9wZXJhdGlvbnMgYWZ0ZXJcclxuXHQgKiB0aGUgdXBsb2FkIHdoZW4gZGF0YSBhcmUgbm90IG5lZWRlZCBhbnltb3JlIG9uIHRoZSBDUFUgc2lkZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIC0gVGhlIGBvblVwbG9hZCgpYCBjYWxsYmFjay5cclxuXHQgKiBAcmV0dXJuIHtJbnRlcmxlYXZlZEJ1ZmZlcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRvblVwbG9hZCggY2FsbGJhY2sgKSB7XHJcblxyXG5cdFx0dGhpcy5vblVwbG9hZENhbGxiYWNrID0gY2FsbGJhY2s7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2VyaWFsaXplcyB0aGUgaW50ZXJsZWF2ZWQgYnVmZmVyIGludG8gSlNPTi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbZGF0YV0gLSBBbiBvcHRpb25hbCB2YWx1ZSBob2xkaW5nIG1ldGEgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlcmlhbGl6YXRpb24uXHJcblx0ICogQHJldHVybiB7T2JqZWN0fSBBIEpTT04gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc2VyaWFsaXplZCBpbnRlcmxlYXZlZCBidWZmZXIuXHJcblx0ICovXHJcblx0dG9KU09OKCBkYXRhICkge1xyXG5cclxuXHRcdGlmICggZGF0YS5hcnJheUJ1ZmZlcnMgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGRhdGEuYXJyYXlCdWZmZXJzID0ge307XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGdlbmVyYXRlIFVVSUQgZm9yIGFycmF5IGJ1ZmZlciBpZiBuZWNlc3NhcnlcclxuXHJcblx0XHRpZiAoIHRoaXMuYXJyYXkuYnVmZmVyLl91dWlkID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZCA9IGdlbmVyYXRlVVVJRCgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGRhdGEuYXJyYXlCdWZmZXJzWyB0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZCBdID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRkYXRhLmFycmF5QnVmZmVyc1sgdGhpcy5hcnJheS5idWZmZXIuX3V1aWQgXSA9IEFycmF5LmZyb20oIG5ldyBVaW50MzJBcnJheSggdGhpcy5hcnJheS5idWZmZXIgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdHJldHVybiB7XHJcblx0XHRcdHV1aWQ6IHRoaXMudXVpZCxcclxuXHRcdFx0YnVmZmVyOiB0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZCxcclxuXHRcdFx0dHlwZTogdGhpcy5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLFxyXG5cdFx0XHRzdHJpZGU6IHRoaXMuc3RyaWRlXHJcblx0XHR9O1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBJbnRlcmxlYXZlZEJ1ZmZlciB9O1xyXG4iLCJpbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuaW1wb3J0IHsgQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi9CdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5pbXBvcnQgeyBkZW5vcm1hbGl6ZSwgbm9ybWFsaXplIH0gZnJvbSAnLi4vbWF0aC9NYXRoVXRpbHMuanMnO1xyXG5cclxuY29uc3QgX3ZlY3RvciA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuXHJcbi8qKlxyXG4gKiBBbiBhbHRlcm5hdGl2ZSB2ZXJzaW9uIG9mIGEgYnVmZmVyIGF0dHJpYnV0ZSB3aXRoIGludGVybGVhdmVkIGRhdGEuIEludGVybGVhdmVkXHJcbiAqIGF0dHJpYnV0ZXMgc2hhcmUgYSBjb21tb24gaW50ZXJsZWF2ZWQgZGF0YSBzdG9yYWdlICh7QGxpbmsgSW50ZXJsZWF2ZWRCdWZmZXJ9KSBhbmQgcmVmZXIgd2l0aFxyXG4gKiBkaWZmZXJlbnQgb2Zmc2V0cyBpbnRvIHRoZSBidWZmZXIuXHJcbiAqL1xyXG5jbGFzcyBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgaW50ZXJsZWF2ZWQgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7SW50ZXJsZWF2ZWRCdWZmZXJ9IGludGVybGVhdmVkQnVmZmVyIC0gVGhlIGJ1ZmZlciBob2xkaW5nIHRoZSBpbnRlcmxlYXZlZCBkYXRhLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpdGVtU2l6ZSAtIFRoZSBpdGVtIHNpemUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldCAtIFRoZSBhdHRyaWJ1dGUgb2Zmc2V0IGludG8gdGhlIGJ1ZmZlci5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtub3JtYWxpemVkPWZhbHNlXSAtIFdoZXRoZXIgdGhlIGRhdGEgYXJlIG5vcm1hbGl6ZWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBpbnRlcmxlYXZlZEJ1ZmZlciwgaXRlbVNpemUsIG9mZnNldCwgbm9ybWFsaXplZCA9IGZhbHNlICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBuYW1lIG9mIHRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubmFtZSA9ICcnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGJ1ZmZlciBob2xkaW5nIHRoZSBpbnRlcmxlYXZlZCBkYXRhLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtJbnRlcmxlYXZlZEJ1ZmZlcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kYXRhID0gaW50ZXJsZWF2ZWRCdWZmZXI7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgaXRlbSBzaXplLCBzZWUge0BsaW5rIEJ1ZmZlckF0dHJpYnV0ZSNpdGVtU2l6ZX0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pdGVtU2l6ZSA9IGl0ZW1TaXplO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGF0dHJpYnV0ZSBvZmZzZXQgaW50byB0aGUgYnVmZmVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMub2Zmc2V0ID0gb2Zmc2V0O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgZGF0YSBhcmUgbm9ybWFsaXplZCBvciBub3QsIHNlZSB7QGxpbmsgQnVmZmVyQXR0cmlidXRlI25vcm1hbGl6ZWR9XHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0ludGVybGVhdmVkQnVmZmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vcm1hbGl6ZWQgPSBub3JtYWxpemVkO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBpdGVtIGNvdW50IG9mIHRoaXMgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0ICogQHJlYWRvbmx5XHJcblx0ICovXHJcblx0Z2V0IGNvdW50KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmRhdGEuY291bnQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGFycmF5IGhvbGRpbmcgdGhlIGludGVybGVhdmVkIGJ1ZmZlciBhdHRyaWJ1dGUgZGF0YS5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtUeXBlZEFycmF5fVxyXG5cdCAqL1xyXG5cdGdldCBhcnJheSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5kYXRhLmFycmF5O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZsYWcgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIGF0dHJpYnV0ZSBoYXMgY2hhbmdlZCBhbmQgc2hvdWxkIGJlIHJlLXNlbnQgdG9cclxuXHQgKiB0aGUgR1BVLiBTZXQgdGhpcyB0byBgdHJ1ZWAgd2hlbiB5b3UgbW9kaWZ5IHRoZSB2YWx1ZSBvZiB0aGUgYXJyYXkuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0ICogQHBhcmFtIHtib29sZWFufSB2YWx1ZVxyXG5cdCAqL1xyXG5cdHNldCBuZWVkc1VwZGF0ZSggdmFsdWUgKSB7XHJcblxyXG5cdFx0dGhpcy5kYXRhLm5lZWRzVXBkYXRlID0gdmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQXBwbGllcyB0aGUgZ2l2ZW4gNHg0IG1hdHJpeCB0byB0aGUgZ2l2ZW4gYXR0cmlidXRlLiBPbmx5IHdvcmtzIHdpdGhcclxuXHQgKiBpdGVtIHNpemUgYDNgLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRyaXg0fSBtIC0gVGhlIG1hdHJpeCB0byBhcHBseS5cclxuXHQgKiBAcmV0dXJuIHtJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRhcHBseU1hdHJpeDQoIG0gKSB7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gdGhpcy5kYXRhLmNvdW50OyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdF92ZWN0b3IuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggdGhpcywgaSApO1xyXG5cclxuXHRcdFx0X3ZlY3Rvci5hcHBseU1hdHJpeDQoIG0gKTtcclxuXHJcblx0XHRcdHRoaXMuc2V0WFlaKCBpLCBfdmVjdG9yLngsIF92ZWN0b3IueSwgX3ZlY3Rvci56ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFwcGxpZXMgdGhlIGdpdmVuIDN4MyBub3JtYWwgbWF0cml4IHRvIHRoZSBnaXZlbiBhdHRyaWJ1dGUuIE9ubHkgd29ya3Mgd2l0aFxyXG5cdCAqIGl0ZW0gc2l6ZSBgM2AuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDN9IG0gLSBUaGUgbm9ybWFsIG1hdHJpeCB0byBhcHBseS5cclxuXHQgKiBAcmV0dXJuIHtJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRhcHBseU5vcm1hbE1hdHJpeCggbSApIHtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSB0aGlzLmNvdW50OyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdF92ZWN0b3IuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggdGhpcywgaSApO1xyXG5cclxuXHRcdFx0X3ZlY3Rvci5hcHBseU5vcm1hbE1hdHJpeCggbSApO1xyXG5cclxuXHRcdFx0dGhpcy5zZXRYWVooIGksIF92ZWN0b3IueCwgX3ZlY3Rvci55LCBfdmVjdG9yLnogKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQXBwbGllcyB0aGUgZ2l2ZW4gNHg0IG1hdHJpeCB0byB0aGUgZ2l2ZW4gYXR0cmlidXRlLiBPbmx5IHdvcmtzIHdpdGhcclxuXHQgKiBpdGVtIHNpemUgYDNgIGFuZCB3aXRoIGRpcmVjdGlvbiB2ZWN0b3JzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRyaXg0fSBtIC0gVGhlIG1hdHJpeCB0byBhcHBseS5cclxuXHQgKiBAcmV0dXJuIHtJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHR0cmFuc2Zvcm1EaXJlY3Rpb24oIG0gKSB7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gdGhpcy5jb3VudDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRfdmVjdG9yLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHRoaXMsIGkgKTtcclxuXHJcblx0XHRcdF92ZWN0b3IudHJhbnNmb3JtRGlyZWN0aW9uKCBtICk7XHJcblxyXG5cdFx0XHR0aGlzLnNldFhZWiggaSwgX3ZlY3Rvci54LCBfdmVjdG9yLnksIF92ZWN0b3IueiApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBnaXZlbiBjb21wb25lbnQgb2YgdGhlIHZlY3RvciBhdCB0aGUgZ2l2ZW4gaW5kZXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggaW50byB0aGUgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gY29tcG9uZW50IC0gVGhlIGNvbXBvbmVudCBpbmRleC5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSByZXR1cm5lZCB2YWx1ZS5cclxuXHQgKi9cclxuXHRnZXRDb21wb25lbnQoIGluZGV4LCBjb21wb25lbnQgKSB7XHJcblxyXG5cdFx0bGV0IHZhbHVlID0gdGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgKyBjb21wb25lbnQgXTtcclxuXHJcblx0XHRpZiAoIHRoaXMubm9ybWFsaXplZCApIHZhbHVlID0gZGVub3JtYWxpemUoIHZhbHVlLCB0aGlzLmFycmF5ICk7XHJcblxyXG5cdFx0cmV0dXJuIHZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBnaXZlbiBjb21wb25lbnQgb2YgdGhlIHZlY3RvciBhdCB0aGUgZ2l2ZW4gaW5kZXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggaW50byB0aGUgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gY29tcG9uZW50IC0gVGhlIGNvbXBvbmVudCBpbmRleC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldENvbXBvbmVudCggaW5kZXgsIGNvbXBvbmVudCwgdmFsdWUgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5vcm1hbGl6ZWQgKSB2YWx1ZSA9IG5vcm1hbGl6ZSggdmFsdWUsIHRoaXMuYXJyYXkgKTtcclxuXHJcblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0ICsgY29tcG9uZW50IF0gPSB2YWx1ZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB4IGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yIGF0IHRoZSBnaXZlbiBpbmRleC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBpbnRvIHRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHZhbHVlIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXRYKCBpbmRleCwgeCApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMubm9ybWFsaXplZCApIHggPSBub3JtYWxpemUoIHgsIHRoaXMuYXJyYXkgKTtcclxuXHJcblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0IF0gPSB4O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHkgY29tcG9uZW50IG9mIHRoZSB2ZWN0b3IgYXQgdGhlIGdpdmVuIGluZGV4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluZGV4IGludG8gdGhlIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmFsdWUgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldFkoIGluZGV4LCB5ICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5ub3JtYWxpemVkICkgeSA9IG5vcm1hbGl6ZSggeSwgdGhpcy5hcnJheSApO1xyXG5cclxuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgKyAxIF0gPSB5O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHogY29tcG9uZW50IG9mIHRoZSB2ZWN0b3IgYXQgdGhlIGdpdmVuIGluZGV4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluZGV4IGludG8gdGhlIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHogLSBUaGUgdmFsdWUgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldFooIGluZGV4LCB6ICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5ub3JtYWxpemVkICkgeiA9IG5vcm1hbGl6ZSggeiwgdGhpcy5hcnJheSApO1xyXG5cclxuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgKyAyIF0gPSB6O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHcgY29tcG9uZW50IG9mIHRoZSB2ZWN0b3IgYXQgdGhlIGdpdmVuIGluZGV4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluZGV4IGludG8gdGhlIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHcgLSBUaGUgdmFsdWUgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldFcoIGluZGV4LCB3ICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5ub3JtYWxpemVkICkgdyA9IG5vcm1hbGl6ZSggdywgdGhpcy5hcnJheSApO1xyXG5cclxuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgKyAzIF0gPSB3O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHggY29tcG9uZW50IG9mIHRoZSB2ZWN0b3IgYXQgdGhlIGdpdmVuIGluZGV4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluZGV4IGludG8gdGhlIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgeCBjb21wb25lbnQuXHJcblx0ICovXHJcblx0Z2V0WCggaW5kZXggKSB7XHJcblxyXG5cdFx0bGV0IHggPSB0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0IF07XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5vcm1hbGl6ZWQgKSB4ID0gZGVub3JtYWxpemUoIHgsIHRoaXMuYXJyYXkgKTtcclxuXHJcblx0XHRyZXR1cm4geDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSB5IGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yIGF0IHRoZSBnaXZlbiBpbmRleC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBpbnRvIHRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIHkgY29tcG9uZW50LlxyXG5cdCAqL1xyXG5cdGdldFkoIGluZGV4ICkge1xyXG5cclxuXHRcdGxldCB5ID0gdGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDEgXTtcclxuXHJcblx0XHRpZiAoIHRoaXMubm9ybWFsaXplZCApIHkgPSBkZW5vcm1hbGl6ZSggeSwgdGhpcy5hcnJheSApO1xyXG5cclxuXHRcdHJldHVybiB5O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHogY29tcG9uZW50IG9mIHRoZSB2ZWN0b3IgYXQgdGhlIGdpdmVuIGluZGV4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluZGV4IGludG8gdGhlIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgeiBjb21wb25lbnQuXHJcblx0ICovXHJcblx0Z2V0WiggaW5kZXggKSB7XHJcblxyXG5cdFx0bGV0IHogPSB0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0ICsgMiBdO1xyXG5cclxuXHRcdGlmICggdGhpcy5ub3JtYWxpemVkICkgeiA9IGRlbm9ybWFsaXplKCB6LCB0aGlzLmFycmF5ICk7XHJcblxyXG5cdFx0cmV0dXJuIHo7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgdyBjb21wb25lbnQgb2YgdGhlIHZlY3RvciBhdCB0aGUgZ2l2ZW4gaW5kZXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggaW50byB0aGUgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB3IGNvbXBvbmVudC5cclxuXHQgKi9cclxuXHRnZXRXKCBpbmRleCApIHtcclxuXHJcblx0XHRsZXQgdyA9IHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgKyAzIF07XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5vcm1hbGl6ZWQgKSB3ID0gZGVub3JtYWxpemUoIHcsIHRoaXMuYXJyYXkgKTtcclxuXHJcblx0XHRyZXR1cm4gdztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB4IGFuZCB5IGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yIGF0IHRoZSBnaXZlbiBpbmRleC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBpbnRvIHRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHZhbHVlIGZvciB0aGUgeCBjb21wb25lbnQgdG8gc2V0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHZhbHVlIGZvciB0aGUgeSBjb21wb25lbnQgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldFhZKCBpbmRleCwgeCwgeSApIHtcclxuXHJcblx0XHRpbmRleCA9IGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0O1xyXG5cclxuXHRcdGlmICggdGhpcy5ub3JtYWxpemVkICkge1xyXG5cclxuXHRcdFx0eCA9IG5vcm1hbGl6ZSggeCwgdGhpcy5hcnJheSApO1xyXG5cdFx0XHR5ID0gbm9ybWFsaXplKCB5LCB0aGlzLmFycmF5ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAwIF0gPSB4O1xyXG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDEgXSA9IHk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgeCwgeSBhbmQgeiBjb21wb25lbnQgb2YgdGhlIHZlY3RvciBhdCB0aGUgZ2l2ZW4gaW5kZXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggaW50byB0aGUgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB2YWx1ZSBmb3IgdGhlIHggY29tcG9uZW50IHRvIHNldC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB2YWx1ZSBmb3IgdGhlIHkgY29tcG9uZW50IHRvIHNldC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geiAtIFRoZSB2YWx1ZSBmb3IgdGhlIHogY29tcG9uZW50IHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXRYWVooIGluZGV4LCB4LCB5LCB6ICkge1xyXG5cclxuXHRcdGluZGV4ID0gaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQ7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5vcm1hbGl6ZWQgKSB7XHJcblxyXG5cdFx0XHR4ID0gbm9ybWFsaXplKCB4LCB0aGlzLmFycmF5ICk7XHJcblx0XHRcdHkgPSBub3JtYWxpemUoIHksIHRoaXMuYXJyYXkgKTtcclxuXHRcdFx0eiA9IG5vcm1hbGl6ZSggeiwgdGhpcy5hcnJheSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgMCBdID0geDtcclxuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAxIF0gPSB5O1xyXG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDIgXSA9IHo7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgeCwgeSwgeiBhbmQgdyBjb21wb25lbnQgb2YgdGhlIHZlY3RvciBhdCB0aGUgZ2l2ZW4gaW5kZXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggaW50byB0aGUgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB2YWx1ZSBmb3IgdGhlIHggY29tcG9uZW50IHRvIHNldC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB2YWx1ZSBmb3IgdGhlIHkgY29tcG9uZW50IHRvIHNldC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geiAtIFRoZSB2YWx1ZSBmb3IgdGhlIHogY29tcG9uZW50IHRvIHNldC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdyAtIFRoZSB2YWx1ZSBmb3IgdGhlIHcgY29tcG9uZW50IHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXRYWVpXKCBpbmRleCwgeCwgeSwgeiwgdyApIHtcclxuXHJcblx0XHRpbmRleCA9IGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0O1xyXG5cclxuXHRcdGlmICggdGhpcy5ub3JtYWxpemVkICkge1xyXG5cclxuXHRcdFx0eCA9IG5vcm1hbGl6ZSggeCwgdGhpcy5hcnJheSApO1xyXG5cdFx0XHR5ID0gbm9ybWFsaXplKCB5LCB0aGlzLmFycmF5ICk7XHJcblx0XHRcdHogPSBub3JtYWxpemUoIHosIHRoaXMuYXJyYXkgKTtcclxuXHRcdFx0dyA9IG5vcm1hbGl6ZSggdywgdGhpcy5hcnJheSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgMCBdID0geDtcclxuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAxIF0gPSB5O1xyXG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDIgXSA9IHo7XHJcblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgMyBdID0gdztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbmV3IGJ1ZmZlciBhdHRyaWJ1dGUgd2l0aCBjb3BpZWQgdmFsdWVzIGZyb20gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIElmIG5vIHBhcmFtZXRlciBpcyBwcm92aWRlZCwgY2xvbmluZyBhbiBpbnRlcmxlYXZlZCBidWZmZXIgYXR0cmlidXRlIHdpbGwgZGUtaW50ZXJsZWF2ZSBidWZmZXIgZGF0YS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbZGF0YV0gLSBBbiBvYmplY3Qgd2l0aCBpbnRlcmxlYXZlZCBidWZmZXJzIHRoYXQgYWxsb3dzIHRvIHJldGFpbiB0aGUgaW50ZXJsZWF2ZWQgcHJvcGVydHkuXHJcblx0ICogQHJldHVybiB7QnVmZmVyQXR0cmlidXRlfEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlfSBBIGNsb25lIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y2xvbmUoIGRhdGEgKSB7XHJcblxyXG5cdFx0aWYgKCBkYXRhID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLmxvZyggJ1RIUkVFLkludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlLmNsb25lKCk6IENsb25pbmcgYW4gaW50ZXJsZWF2ZWQgYnVmZmVyIGF0dHJpYnV0ZSB3aWxsIGRlLWludGVybGVhdmUgYnVmZmVyIGRhdGEuJyApO1xyXG5cclxuXHRcdFx0Y29uc3QgYXJyYXkgPSBbXTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHRoaXMuY291bnQ7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGluZGV4ID0gaSAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldDtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGogPSAwOyBqIDwgdGhpcy5pdGVtU2l6ZTsgaiArKyApIHtcclxuXHJcblx0XHRcdFx0XHRhcnJheS5wdXNoKCB0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgaiBdICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBuZXcgQnVmZmVyQXR0cmlidXRlKCBuZXcgdGhpcy5hcnJheS5jb25zdHJ1Y3RvciggYXJyYXkgKSwgdGhpcy5pdGVtU2l6ZSwgdGhpcy5ub3JtYWxpemVkICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGlmICggZGF0YS5pbnRlcmxlYXZlZEJ1ZmZlcnMgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0ZGF0YS5pbnRlcmxlYXZlZEJ1ZmZlcnMgPSB7fTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggZGF0YS5pbnRlcmxlYXZlZEJ1ZmZlcnNbIHRoaXMuZGF0YS51dWlkIF0gPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0ZGF0YS5pbnRlcmxlYXZlZEJ1ZmZlcnNbIHRoaXMuZGF0YS51dWlkIF0gPSB0aGlzLmRhdGEuY2xvbmUoIGRhdGEgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBuZXcgSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUoIGRhdGEuaW50ZXJsZWF2ZWRCdWZmZXJzWyB0aGlzLmRhdGEudXVpZCBdLCB0aGlzLml0ZW1TaXplLCB0aGlzLm9mZnNldCwgdGhpcy5ub3JtYWxpemVkICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNlcmlhbGl6ZXMgdGhlIGJ1ZmZlciBhdHRyaWJ1dGUgaW50byBKU09OLlxyXG5cdCAqXHJcblx0ICogSWYgbm8gcGFyYW1ldGVyIGlzIHByb3ZpZGVkLCBjbG9uaW5nIGFuIGludGVybGVhdmVkIGJ1ZmZlciBhdHRyaWJ1dGUgd2lsbCBkZS1pbnRlcmxlYXZlIGJ1ZmZlciBkYXRhLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtkYXRhXSAtIEFuIG9wdGlvbmFsIHZhbHVlIGhvbGRpbmcgbWV0YSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VyaWFsaXphdGlvbi5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3R9IEEgSlNPTiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzZXJpYWxpemVkIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICovXHJcblx0dG9KU09OKCBkYXRhICkge1xyXG5cclxuXHRcdGlmICggZGF0YSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Y29uc29sZS5sb2coICdUSFJFRS5JbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZS50b0pTT04oKTogU2VyaWFsaXppbmcgYW4gaW50ZXJsZWF2ZWQgYnVmZmVyIGF0dHJpYnV0ZSB3aWxsIGRlLWludGVybGVhdmUgYnVmZmVyIGRhdGEuJyApO1xyXG5cclxuXHRcdFx0Y29uc3QgYXJyYXkgPSBbXTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHRoaXMuY291bnQ7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGluZGV4ID0gaSAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldDtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGogPSAwOyBqIDwgdGhpcy5pdGVtU2l6ZTsgaiArKyApIHtcclxuXHJcblx0XHRcdFx0XHRhcnJheS5wdXNoKCB0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgaiBdICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIGRlLWludGVybGVhdmUgZGF0YSBhbmQgc2F2ZSBpdCBhcyBhbiBvcmRpbmFyeSBidWZmZXIgYXR0cmlidXRlIGZvciBub3dcclxuXHJcblx0XHRcdHJldHVybiB7XHJcblx0XHRcdFx0aXRlbVNpemU6IHRoaXMuaXRlbVNpemUsXHJcblx0XHRcdFx0dHlwZTogdGhpcy5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLFxyXG5cdFx0XHRcdGFycmF5OiBhcnJheSxcclxuXHRcdFx0XHRub3JtYWxpemVkOiB0aGlzLm5vcm1hbGl6ZWRcclxuXHRcdFx0fTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Ly8gc2F2ZSBhcyB0cnVlIGludGVybGVhdmVkIGF0dHJpYnV0ZVxyXG5cclxuXHRcdFx0aWYgKCBkYXRhLmludGVybGVhdmVkQnVmZmVycyA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRkYXRhLmludGVybGVhdmVkQnVmZmVycyA9IHt9O1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBkYXRhLmludGVybGVhdmVkQnVmZmVyc1sgdGhpcy5kYXRhLnV1aWQgXSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRkYXRhLmludGVybGVhdmVkQnVmZmVyc1sgdGhpcy5kYXRhLnV1aWQgXSA9IHRoaXMuZGF0YS50b0pTT04oIGRhdGEgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiB7XHJcblx0XHRcdFx0aXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZTogdHJ1ZSxcclxuXHRcdFx0XHRpdGVtU2l6ZTogdGhpcy5pdGVtU2l6ZSxcclxuXHRcdFx0XHRkYXRhOiB0aGlzLmRhdGEudXVpZCxcclxuXHRcdFx0XHRvZmZzZXQ6IHRoaXMub2Zmc2V0LFxyXG5cdFx0XHRcdG5vcm1hbGl6ZWQ6IHRoaXMubm9ybWFsaXplZFxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCB7IEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlIH07XHJcbiIsImltcG9ydCB7IE1hdGVyaWFsIH0gZnJvbSAnLi9NYXRlcmlhbC5qcyc7XHJcbmltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vbWF0aC9Db2xvci5qcyc7XHJcblxyXG4vKipcclxuICogQSBtYXRlcmlhbCBmb3IgcmVuZGVyaW5nIGluc3RhbmNlcyBvZiB7QGxpbmsgU3ByaXRlfS5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgbWFwID0gbmV3IFRIUkVFLlRleHR1cmVMb2FkZXIoKS5sb2FkKCAndGV4dHVyZXMvc3ByaXRlLnBuZycgKTtcclxuICogY29uc3QgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuU3ByaXRlTWF0ZXJpYWwoIHsgbWFwOiBtYXAsIGNvbG9yOiAweGZmZmZmZiB9ICk7XHJcbiAqXHJcbiAqIGNvbnN0IHNwcml0ZSA9IG5ldyBUSFJFRS5TcHJpdGUoIG1hdGVyaWFsICk7XHJcbiAqIHNwcml0ZS5zY2FsZS5zZXQoMjAwLCAyMDAsIDEpXHJcbiAqIHNjZW5lLmFkZCggc3ByaXRlICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTWF0ZXJpYWxcclxuICovXHJcbmNsYXNzIFNwcml0ZU1hdGVyaWFsIGV4dGVuZHMgTWF0ZXJpYWwge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHNwcml0ZSBtYXRlcmlhbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1ldGVyc10gLSBBbiBvYmplY3Qgd2l0aCBvbmUgb3IgbW9yZSBwcm9wZXJ0aWVzXHJcblx0ICogZGVmaW5pbmcgdGhlIG1hdGVyaWFsJ3MgYXBwZWFyYW5jZS4gQW55IHByb3BlcnR5IG9mIHRoZSBtYXRlcmlhbFxyXG5cdCAqIChpbmNsdWRpbmcgYW55IHByb3BlcnR5IGZyb20gaW5oZXJpdGVkIG1hdGVyaWFscykgY2FuIGJlIHBhc3NlZFxyXG5cdCAqIGluIGhlcmUuIENvbG9yIHZhbHVlcyBjYW4gYmUgcGFzc2VkIGFueSB0eXBlIG9mIHZhbHVlIGFjY2VwdGVkXHJcblx0ICogYnkge0BsaW5rIENvbG9yI3NldH0uXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHBhcmFtZXRlcnMgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNTcHJpdGVNYXRlcmlhbCA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ1Nwcml0ZU1hdGVyaWFsJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENvbG9yIG9mIHRoZSBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Q29sb3J9XHJcblx0XHQgKiBAZGVmYXVsdCAoMSwxLDEpXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY29sb3IgbWFwLiBNYXkgb3B0aW9uYWxseSBpbmNsdWRlIGFuIGFscGhhIGNoYW5uZWwsIHR5cGljYWxseSBjb21iaW5lZFxyXG5cdFx0ICogd2l0aCB7QGxpbmsgTWF0ZXJpYWwjdHJhbnNwYXJlbnR9IG9yIHtAbGluayBNYXRlcmlhbCNhbHBoYVRlc3R9LiBUaGUgdGV4dHVyZSBtYXBcclxuXHRcdCAqIGNvbG9yIGlzIG1vZHVsYXRlZCBieSB0aGUgZGlmZnVzZSBgY29sb3JgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGFscGhhIG1hcCBpcyBhIGdyYXlzY2FsZSB0ZXh0dXJlIHRoYXQgY29udHJvbHMgdGhlIG9wYWNpdHkgYWNyb3NzIHRoZVxyXG5cdFx0ICogc3VyZmFjZSAoYmxhY2s6IGZ1bGx5IHRyYW5zcGFyZW50OyB3aGl0ZTogZnVsbHkgb3BhcXVlKS5cclxuXHRcdCAqXHJcblx0XHQgKiBPbmx5IHRoZSBjb2xvciBvZiB0aGUgdGV4dHVyZSBpcyB1c2VkLCBpZ25vcmluZyB0aGUgYWxwaGEgY2hhbm5lbCBpZiBvbmVcclxuXHRcdCAqIGV4aXN0cy4gRm9yIFJHQiBhbmQgUkdCQSB0ZXh0dXJlcywgdGhlIHJlbmRlcmVyIHdpbGwgdXNlIHRoZSBncmVlbiBjaGFubmVsXHJcblx0XHQgKiB3aGVuIHNhbXBsaW5nIHRoaXMgdGV4dHVyZSBkdWUgdG8gdGhlIGV4dHJhIGJpdCBvZiBwcmVjaXNpb24gcHJvdmlkZWQgZm9yXHJcblx0XHQgKiBncmVlbiBpbiBEWFQtY29tcHJlc3NlZCBhbmQgdW5jb21wcmVzc2VkIFJHQiA1NjUgZm9ybWF0cy4gTHVtaW5hbmNlLW9ubHkgYW5kXHJcblx0XHQgKiBsdW1pbmFuY2UvYWxwaGEgdGV4dHVyZXMgd2lsbCBhbHNvIHN0aWxsIHdvcmsgYXMgZXhwZWN0ZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFscGhhTWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByb3RhdGlvbiBvZiB0aGUgc3ByaXRlIGluIHJhZGlhbnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yb3RhdGlvbiA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTcGVjaWZpZXMgd2hldGhlciBzaXplIG9mIHRoZSBzcHJpdGUgaXMgYXR0ZW51YXRlZCBieSB0aGUgY2FtZXJhIGRlcHRoIChwZXJzcGVjdGl2ZSBjYW1lcmEgb25seSkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2l6ZUF0dGVudWF0aW9uID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIE92ZXJ3cml0dGVuIHNpbmNlIHNwcml0ZSBtYXRlcmlhbHMgYXJlIHRyYW5zcGFyZW50XHJcblx0XHQgKiBieSBkZWZhdWx0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRyYW5zcGFyZW50ID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIG1hdGVyaWFsIGlzIGFmZmVjdGVkIGJ5IGZvZyBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZm9nID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xyXG5cclxuXHRcdHRoaXMubWFwID0gc291cmNlLm1hcDtcclxuXHJcblx0XHR0aGlzLmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwO1xyXG5cclxuXHRcdHRoaXMucm90YXRpb24gPSBzb3VyY2Uucm90YXRpb247XHJcblxyXG5cdFx0dGhpcy5zaXplQXR0ZW51YXRpb24gPSBzb3VyY2Uuc2l6ZUF0dGVudWF0aW9uO1xyXG5cclxuXHRcdHRoaXMuZm9nID0gc291cmNlLmZvZztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgU3ByaXRlTWF0ZXJpYWwgfTtcclxuIiwiaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uL21hdGgvVmVjdG9yMi5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBNYXRyaXg0IH0gZnJvbSAnLi4vbWF0aC9NYXRyaXg0LmpzJztcclxuaW1wb3J0IHsgVHJpYW5nbGUgfSBmcm9tICcuLi9tYXRoL1RyaWFuZ2xlLmpzJztcclxuaW1wb3J0IHsgT2JqZWN0M0QgfSBmcm9tICcuLi9jb3JlL09iamVjdDNELmpzJztcclxuaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcclxuaW1wb3J0IHsgSW50ZXJsZWF2ZWRCdWZmZXIgfSBmcm9tICcuLi9jb3JlL0ludGVybGVhdmVkQnVmZmVyLmpzJztcclxuaW1wb3J0IHsgSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlLmpzJztcclxuaW1wb3J0IHsgU3ByaXRlTWF0ZXJpYWwgfSBmcm9tICcuLi9tYXRlcmlhbHMvU3ByaXRlTWF0ZXJpYWwuanMnO1xyXG5cclxubGV0IF9nZW9tZXRyeTtcclxuXHJcbmNvbnN0IF9pbnRlcnNlY3RQb2ludCA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX3dvcmxkU2NhbGUgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF9tdlBvc2l0aW9uID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5cclxuY29uc3QgX2FsaWduZWRQb3NpdGlvbiA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjIoKTtcclxuY29uc3QgX3JvdGF0ZWRQb3NpdGlvbiA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjIoKTtcclxuY29uc3QgX3ZpZXdXb3JsZE1hdHJpeCA9IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDQoKTtcclxuXHJcbmNvbnN0IF92QSA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX3ZCID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfdkMgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcblxyXG5jb25zdCBfdXZBID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMigpO1xyXG5jb25zdCBfdXZCID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMigpO1xyXG5jb25zdCBfdXZDID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMigpO1xyXG5cclxuLyoqXHJcbiAqIEEgc3ByaXRlIGlzIGEgcGxhbmUgdGhhdCBhbHdheXMgZmFjZXMgdG93YXJkcyB0aGUgY2FtZXJhLCBnZW5lcmFsbHkgd2l0aCBhXHJcbiAqIHBhcnRpYWxseSB0cmFuc3BhcmVudCB0ZXh0dXJlIGFwcGxpZWQuXHJcbiAqXHJcbiAqIFNwcml0ZXMgZG8gbm90IGNhc3Qgc2hhZG93cywgc2V0dGluZyB7QGxpbmsgT2JqZWN0M0QjY2FzdFNoYWRvd30gdG8gYHRydWVgIHdpbGxcclxuICogaGF2ZSBubyBlZmZlY3QuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IG1hcCA9IG5ldyBUSFJFRS5UZXh0dXJlTG9hZGVyKCkubG9hZCggJ3Nwcml0ZS5wbmcnICk7XHJcbiAqIGNvbnN0IG1hdGVyaWFsID0gbmV3IFRIUkVFLlNwcml0ZU1hdGVyaWFsKCB7IG1hcDogbWFwIH0gKTtcclxuICpcclxuICogY29uc3Qgc3ByaXRlID0gbmV3IFRIUkVFLlNwcml0ZSggbWF0ZXJpYWwgKTtcclxuICogc2NlbmUuYWRkKCBzcHJpdGUgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBPYmplY3QzRFxyXG4gKi9cclxuY2xhc3MgU3ByaXRlIGV4dGVuZHMgT2JqZWN0M0Qge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHNwcml0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7U3ByaXRlTWF0ZXJpYWx9IFttYXRlcmlhbF0gLSBUaGUgc3ByaXRlIG1hdGVyaWFsLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBtYXRlcmlhbCA9IG5ldyBTcHJpdGVNYXRlcmlhbCgpICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzU3ByaXRlID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnU3ByaXRlJztcclxuXHJcblx0XHRpZiAoIF9nZW9tZXRyeSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0X2dlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XHJcblxyXG5cdFx0XHRjb25zdCBmbG9hdDMyQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KCBbXHJcblx0XHRcdFx0LSAwLjUsIC0gMC41LCAwLCAwLCAwLFxyXG5cdFx0XHRcdDAuNSwgLSAwLjUsIDAsIDEsIDAsXHJcblx0XHRcdFx0MC41LCAwLjUsIDAsIDEsIDEsXHJcblx0XHRcdFx0LSAwLjUsIDAuNSwgMCwgMCwgMVxyXG5cdFx0XHRdICk7XHJcblxyXG5cdFx0XHRjb25zdCBpbnRlcmxlYXZlZEJ1ZmZlciA9IG5ldyBJbnRlcmxlYXZlZEJ1ZmZlciggZmxvYXQzMkFycmF5LCA1ICk7XHJcblxyXG5cdFx0XHRfZ2VvbWV0cnkuc2V0SW5kZXgoIFsgMCwgMSwgMixcdDAsIDIsIDMgXSApO1xyXG5cdFx0XHRfZ2VvbWV0cnkuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUoIGludGVybGVhdmVkQnVmZmVyLCAzLCAwLCBmYWxzZSApICk7XHJcblx0XHRcdF9nZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICd1dicsIG5ldyBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSggaW50ZXJsZWF2ZWRCdWZmZXIsIDIsIDMsIGZhbHNlICkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc3ByaXRlIGdlb21ldHJ5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtCdWZmZXJHZW9tZXRyeX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nZW9tZXRyeSA9IF9nZW9tZXRyeTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBzcHJpdGUgbWF0ZXJpYWwuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1Nwcml0ZU1hdGVyaWFsfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1hdGVyaWFsID0gbWF0ZXJpYWw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc3ByaXRlJ3MgYW5jaG9yIHBvaW50LCBhbmQgdGhlIHBvaW50IGFyb3VuZCB3aGljaCB0aGUgc3ByaXRlIHJvdGF0ZXMuXHJcblx0XHQgKiBBIHZhbHVlIG9mIGAoMC41LCAwLjUpYCBjb3JyZXNwb25kcyB0byB0aGUgbWlkcG9pbnQgb2YgdGhlIHNwcml0ZS4gQSB2YWx1ZVxyXG5cdFx0ICogb2YgYCgwLCAwKWAgY29ycmVzcG9uZHMgdG8gdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSBzcHJpdGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjJ9XHJcblx0XHQgKiBAZGVmYXVsdCAoMC41LDAuNSlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jZW50ZXIgPSBuZXcgVmVjdG9yMiggMC41LCAwLjUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyBpbnRlcnNlY3Rpb24gcG9pbnRzIGJldHdlZW4gYSBjYXN0ZWQgcmF5IGFuZCB0aGlzIHNwcml0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmF5Y2FzdGVyfSByYXljYXN0ZXIgLSBUaGUgcmF5Y2FzdGVyLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8T2JqZWN0Pn0gaW50ZXJzZWN0cyAtIFRoZSB0YXJnZXQgYXJyYXkgdGhhdCBob2xkcyB0aGUgaW50ZXJzZWN0aW9uIHBvaW50cy5cclxuXHQgKi9cclxuXHRyYXljYXN0KCByYXljYXN0ZXIsIGludGVyc2VjdHMgKSB7XHJcblxyXG5cdFx0aWYgKCByYXljYXN0ZXIuY2FtZXJhID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlNwcml0ZTogXCJSYXljYXN0ZXIuY2FtZXJhXCIgbmVlZHMgdG8gYmUgc2V0IGluIG9yZGVyIHRvIHJheWNhc3QgYWdhaW5zdCBzcHJpdGVzLicgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0X3dvcmxkU2NhbGUuc2V0RnJvbU1hdHJpeFNjYWxlKCB0aGlzLm1hdHJpeFdvcmxkICk7XHJcblxyXG5cdFx0X3ZpZXdXb3JsZE1hdHJpeC5jb3B5KCByYXljYXN0ZXIuY2FtZXJhLm1hdHJpeFdvcmxkICk7XHJcblx0XHR0aGlzLm1vZGVsVmlld01hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCByYXljYXN0ZXIuY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSwgdGhpcy5tYXRyaXhXb3JsZCApO1xyXG5cclxuXHRcdF9tdlBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5tb2RlbFZpZXdNYXRyaXggKTtcclxuXHJcblx0XHRpZiAoIHJheWNhc3Rlci5jYW1lcmEuaXNQZXJzcGVjdGl2ZUNhbWVyYSAmJiB0aGlzLm1hdGVyaWFsLnNpemVBdHRlbnVhdGlvbiA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRfd29ybGRTY2FsZS5tdWx0aXBseVNjYWxhciggLSBfbXZQb3NpdGlvbi56ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHJvdGF0aW9uID0gdGhpcy5tYXRlcmlhbC5yb3RhdGlvbjtcclxuXHRcdGxldCBzaW4sIGNvcztcclxuXHJcblx0XHRpZiAoIHJvdGF0aW9uICE9PSAwICkge1xyXG5cclxuXHRcdFx0Y29zID0gTWF0aC5jb3MoIHJvdGF0aW9uICk7XHJcblx0XHRcdHNpbiA9IE1hdGguc2luKCByb3RhdGlvbiApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBjZW50ZXIgPSB0aGlzLmNlbnRlcjtcclxuXHJcblx0XHR0cmFuc2Zvcm1WZXJ0ZXgoIF92QS5zZXQoIC0gMC41LCAtIDAuNSwgMCApLCBfbXZQb3NpdGlvbiwgY2VudGVyLCBfd29ybGRTY2FsZSwgc2luLCBjb3MgKTtcclxuXHRcdHRyYW5zZm9ybVZlcnRleCggX3ZCLnNldCggMC41LCAtIDAuNSwgMCApLCBfbXZQb3NpdGlvbiwgY2VudGVyLCBfd29ybGRTY2FsZSwgc2luLCBjb3MgKTtcclxuXHRcdHRyYW5zZm9ybVZlcnRleCggX3ZDLnNldCggMC41LCAwLjUsIDAgKSwgX212UG9zaXRpb24sIGNlbnRlciwgX3dvcmxkU2NhbGUsIHNpbiwgY29zICk7XHJcblxyXG5cdFx0X3V2QS5zZXQoIDAsIDAgKTtcclxuXHRcdF91dkIuc2V0KCAxLCAwICk7XHJcblx0XHRfdXZDLnNldCggMSwgMSApO1xyXG5cclxuXHRcdC8vIGNoZWNrIGZpcnN0IHRyaWFuZ2xlXHJcblx0XHRsZXQgaW50ZXJzZWN0ID0gcmF5Y2FzdGVyLnJheS5pbnRlcnNlY3RUcmlhbmdsZSggX3ZBLCBfdkIsIF92QywgZmFsc2UsIF9pbnRlcnNlY3RQb2ludCApO1xyXG5cclxuXHRcdGlmICggaW50ZXJzZWN0ID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0Ly8gY2hlY2sgc2Vjb25kIHRyaWFuZ2xlXHJcblx0XHRcdHRyYW5zZm9ybVZlcnRleCggX3ZCLnNldCggLSAwLjUsIDAuNSwgMCApLCBfbXZQb3NpdGlvbiwgY2VudGVyLCBfd29ybGRTY2FsZSwgc2luLCBjb3MgKTtcclxuXHRcdFx0X3V2Qi5zZXQoIDAsIDEgKTtcclxuXHJcblx0XHRcdGludGVyc2VjdCA9IHJheWNhc3Rlci5yYXkuaW50ZXJzZWN0VHJpYW5nbGUoIF92QSwgX3ZDLCBfdkIsIGZhbHNlLCBfaW50ZXJzZWN0UG9pbnQgKTtcclxuXHRcdFx0aWYgKCBpbnRlcnNlY3QgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdHJldHVybjtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKCBfaW50ZXJzZWN0UG9pbnQgKTtcclxuXHJcblx0XHRpZiAoIGRpc3RhbmNlIDwgcmF5Y2FzdGVyLm5lYXIgfHwgZGlzdGFuY2UgPiByYXljYXN0ZXIuZmFyICkgcmV0dXJuO1xyXG5cclxuXHRcdGludGVyc2VjdHMucHVzaCgge1xyXG5cclxuXHRcdFx0ZGlzdGFuY2U6IGRpc3RhbmNlLFxyXG5cdFx0XHRwb2ludDogX2ludGVyc2VjdFBvaW50LmNsb25lKCksXHJcblx0XHRcdHV2OiBUcmlhbmdsZS5nZXRJbnRlcnBvbGF0aW9uKCBfaW50ZXJzZWN0UG9pbnQsIF92QSwgX3ZCLCBfdkMsIF91dkEsIF91dkIsIF91dkMsIG5ldyBWZWN0b3IyKCkgKSxcclxuXHRcdFx0ZmFjZTogbnVsbCxcclxuXHRcdFx0b2JqZWN0OiB0aGlzXHJcblxyXG5cdFx0fSApO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSwgcmVjdXJzaXZlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSwgcmVjdXJzaXZlICk7XHJcblxyXG5cdFx0aWYgKCBzb3VyY2UuY2VudGVyICE9PSB1bmRlZmluZWQgKSB0aGlzLmNlbnRlci5jb3B5KCBzb3VyY2UuY2VudGVyICk7XHJcblxyXG5cdFx0dGhpcy5tYXRlcmlhbCA9IHNvdXJjZS5tYXRlcmlhbDtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gdHJhbnNmb3JtVmVydGV4KCB2ZXJ0ZXhQb3NpdGlvbiwgbXZQb3NpdGlvbiwgY2VudGVyLCBzY2FsZSwgc2luLCBjb3MgKSB7XHJcblxyXG5cdC8vIGNvbXB1dGUgcG9zaXRpb24gaW4gY2FtZXJhIHNwYWNlXHJcblx0X2FsaWduZWRQb3NpdGlvbi5zdWJWZWN0b3JzKCB2ZXJ0ZXhQb3NpdGlvbiwgY2VudGVyICkuYWRkU2NhbGFyKCAwLjUgKS5tdWx0aXBseSggc2NhbGUgKTtcclxuXHJcblx0Ly8gdG8gY2hlY2sgaWYgcm90YXRpb24gaXMgbm90IHplcm9cclxuXHRpZiAoIHNpbiAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdF9yb3RhdGVkUG9zaXRpb24ueCA9ICggY29zICogX2FsaWduZWRQb3NpdGlvbi54ICkgLSAoIHNpbiAqIF9hbGlnbmVkUG9zaXRpb24ueSApO1xyXG5cdFx0X3JvdGF0ZWRQb3NpdGlvbi55ID0gKCBzaW4gKiBfYWxpZ25lZFBvc2l0aW9uLnggKSArICggY29zICogX2FsaWduZWRQb3NpdGlvbi55ICk7XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0X3JvdGF0ZWRQb3NpdGlvbi5jb3B5KCBfYWxpZ25lZFBvc2l0aW9uICk7XHJcblxyXG5cdH1cclxuXHJcblxyXG5cdHZlcnRleFBvc2l0aW9uLmNvcHkoIG12UG9zaXRpb24gKTtcclxuXHR2ZXJ0ZXhQb3NpdGlvbi54ICs9IF9yb3RhdGVkUG9zaXRpb24ueDtcclxuXHR2ZXJ0ZXhQb3NpdGlvbi55ICs9IF9yb3RhdGVkUG9zaXRpb24ueTtcclxuXHJcblx0Ly8gdHJhbnNmb3JtIHRvIHdvcmxkIHNwYWNlXHJcblx0dmVydGV4UG9zaXRpb24uYXBwbHlNYXRyaXg0KCBfdmlld1dvcmxkTWF0cml4ICk7XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBTcHJpdGUgfTtcclxuIiwiaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcbmltcG9ydCB7IE9iamVjdDNEIH0gZnJvbSAnLi4vY29yZS9PYmplY3QzRC5qcyc7XHJcblxyXG5jb25zdCBfdjEgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF92MiA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuXHJcbi8qKlxyXG4gKiBBIGNvbXBvbmVudCBmb3IgcHJvdmlkaW5nIGEgYmFzaWMgTGV2ZWwgb2YgRGV0YWlsIChMT0QpIG1lY2hhbmlzbS5cclxuICpcclxuICogRXZlcnkgTE9EIGxldmVsIGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBvYmplY3QsIGFuZCByZW5kZXJpbmcgY2FuIGJlIHN3aXRjaGVkXHJcbiAqIGJldHdlZW4gdGhlbSBhdCB0aGUgZGlzdGFuY2VzIHNwZWNpZmllZC4gVHlwaWNhbGx5IHlvdSB3b3VsZCBjcmVhdGUsIHNheSxcclxuICogdGhyZWUgbWVzaGVzLCBvbmUgZm9yIGZhciBhd2F5IChsb3cgZGV0YWlsKSwgb25lIGZvciBtaWQgcmFuZ2UgKG1lZGl1bVxyXG4gKiBkZXRhaWwpIGFuZCBvbmUgZm9yIGNsb3NlIHVwIChoaWdoIGRldGFpbCkuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGxvZCA9IG5ldyBUSFJFRS5MT0QoKTtcclxuICogY29uc3QgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IDB4ZmZmZjAwIH0gKTtcclxuICpcclxuICogLy9DcmVhdGUgc3BoZXJlcyB3aXRoIDMgbGV2ZWxzIG9mIGRldGFpbCBhbmQgY3JlYXRlIG5ldyBMT0QgbGV2ZWxzIGZvciB0aGVtXHJcbiAqIGZvciggbGV0IGkgPSAwOyBpIDwgMzsgaSsrICkge1xyXG4gKlxyXG4gKiBcdGNvbnN0IGdlb21ldHJ5ID0gbmV3IFRIUkVFLkljb3NhaGVkcm9uR2VvbWV0cnkoIDEwLCAzIC0gaSApO1xyXG4gKiBcdGNvbnN0IG1lc2ggPSBuZXcgVEhSRUUuTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcbiAqIFx0bG9kLmFkZExldmVsKCBtZXNoLCBpICogNzUgKTtcclxuICpcclxuICogfVxyXG4gKlxyXG4gKiBzY2VuZS5hZGQoIGxvZCApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIE9iamVjdDNEXHJcbiAqL1xyXG5jbGFzcyBMT0QgZXh0ZW5kcyBPYmplY3QzRCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgTE9ELlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzTE9EID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjdXJyZW50IExPRCBpbmRleC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fY3VycmVudExldmVsID0gMDtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnTE9EJztcclxuXHJcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydGllcyggdGhpcywge1xyXG5cdFx0XHQvKipcclxuXHRcdFx0ICogVGhpcyBhcnJheSBob2xkcyB0aGUgTE9EIGxldmVscy5cclxuXHRcdFx0ICpcclxuXHRcdFx0ICogQG5hbWUgTE9EI2xldmVsc1xyXG5cdFx0XHQgKiBAdHlwZSB7QXJyYXk8e29iamVjdDpPYmplY3QzRCxkaXN0YW5jZTpudW1iZXIsaHlzdGVyZXNpczpudW1iZXJ9Pn1cclxuXHRcdFx0ICovXHJcblx0XHRcdGxldmVsczoge1xyXG5cdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXHJcblx0XHRcdFx0dmFsdWU6IFtdXHJcblx0XHRcdH1cclxuXHRcdH0gKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIExPRCBvYmplY3QgaXMgdXBkYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSByZW5kZXJlciBwZXIgZnJhbWVcclxuXHRcdCAqIG9yIG5vdC4gSWYgc2V0IHRvIGBmYWxzZWAsIHlvdSBoYXZlIHRvIGNhbGwge0BsaW5rIExPRCN1cGRhdGV9IGluIHRoZVxyXG5cdFx0ICogcmVuZGVyIGxvb3AgYnkgeW91cnNlbGYuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYXV0b1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSwgZmFsc2UgKTtcclxuXHJcblx0XHRjb25zdCBsZXZlbHMgPSBzb3VyY2UubGV2ZWxzO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGxldmVscy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgbGV2ZWwgPSBsZXZlbHNbIGkgXTtcclxuXHJcblx0XHRcdHRoaXMuYWRkTGV2ZWwoIGxldmVsLm9iamVjdC5jbG9uZSgpLCBsZXZlbC5kaXN0YW5jZSwgbGV2ZWwuaHlzdGVyZXNpcyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmF1dG9VcGRhdGUgPSBzb3VyY2UuYXV0b1VwZGF0ZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIGEgbWVzaCB0aGF0IHdpbGwgZGlzcGxheSBhdCBhIGNlcnRhaW4gZGlzdGFuY2UgYW5kIGdyZWF0ZXIuIFR5cGljYWxseVxyXG5cdCAqIHRoZSBmdXJ0aGVyIGF3YXkgdGhlIGRpc3RhbmNlLCB0aGUgbG93ZXIgdGhlIGRldGFpbCBvbiB0aGUgbWVzaC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0M0R9IG9iamVjdCAtIFRoZSAzRCBvYmplY3QgdG8gZGlzcGxheSBhdCB0aGlzIGxldmVsLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZGlzdGFuY2U9MF0gLSBUaGUgZGlzdGFuY2UgYXQgd2hpY2ggdG8gZGlzcGxheSB0aGlzIGxldmVsIG9mIGRldGFpbC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2h5c3RlcmVzaXM9MF0gLSBUaHJlc2hvbGQgdXNlZCB0byBhdm9pZCBmbGlja2VyaW5nIGF0IExPRCBib3VuZGFyaWVzLCBhcyBhIGZyYWN0aW9uIG9mIGRpc3RhbmNlLlxyXG5cdCAqIEByZXR1cm4ge0xPRH0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRhZGRMZXZlbCggb2JqZWN0LCBkaXN0YW5jZSA9IDAsIGh5c3RlcmVzaXMgPSAwICkge1xyXG5cclxuXHRcdGRpc3RhbmNlID0gTWF0aC5hYnMoIGRpc3RhbmNlICk7XHJcblxyXG5cdFx0Y29uc3QgbGV2ZWxzID0gdGhpcy5sZXZlbHM7XHJcblxyXG5cdFx0bGV0IGw7XHJcblxyXG5cdFx0Zm9yICggbCA9IDA7IGwgPCBsZXZlbHMubGVuZ3RoOyBsICsrICkge1xyXG5cclxuXHRcdFx0aWYgKCBkaXN0YW5jZSA8IGxldmVsc1sgbCBdLmRpc3RhbmNlICkge1xyXG5cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0bGV2ZWxzLnNwbGljZSggbCwgMCwgeyBkaXN0YW5jZTogZGlzdGFuY2UsIGh5c3RlcmVzaXM6IGh5c3RlcmVzaXMsIG9iamVjdDogb2JqZWN0IH0gKTtcclxuXHJcblx0XHR0aGlzLmFkZCggb2JqZWN0ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVtb3ZlcyBhbiBleGlzdGluZyBsZXZlbCwgYmFzZWQgb24gdGhlIGRpc3RhbmNlIGZyb20gdGhlIGNhbWVyYS5cclxuXHQgKiBSZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBsZXZlbCBoYXMgYmVlbiByZW1vdmVkLiBPdGhlcndpc2UgYGZhbHNlYC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBkaXN0YW5jZSAtIERpc3RhbmNlIG9mIHRoZSBsZXZlbCB0byByZW1vdmUuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgbGV2ZWwgaGFzIGJlZW4gcmVtb3ZlZCBvciBub3QuXHJcblx0ICovXHJcblx0cmVtb3ZlTGV2ZWwoIGRpc3RhbmNlICkge1xyXG5cclxuXHRcdGNvbnN0IGxldmVscyA9IHRoaXMubGV2ZWxzO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGxldmVscy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGxldmVsc1sgaSBdLmRpc3RhbmNlID09PSBkaXN0YW5jZSApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgcmVtb3ZlZEVsZW1lbnRzID0gbGV2ZWxzLnNwbGljZSggaSwgMSApO1xyXG5cdFx0XHRcdHRoaXMucmVtb3ZlKCByZW1vdmVkRWxlbWVudHNbIDAgXS5vYmplY3QgKTtcclxuXHJcblx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBmYWxzZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBjdXJyZW50bHkgYWN0aXZlIExPRCBsZXZlbCBpbmRleC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGN1cnJlbnQgYWN0aXZlIExPRCBsZXZlbCBpbmRleC5cclxuXHQgKi9cclxuXHRnZXRDdXJyZW50TGV2ZWwoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX2N1cnJlbnRMZXZlbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBmaXJzdCAzRCBvYmplY3QgdGhhdCBpcyBncmVhdGVyIHRoYW5cclxuXHQgKiB0aGUgZ2l2ZW4gZGlzdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZGlzdGFuY2UgLSBUaGUgTE9EIGRpc3RhbmNlLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdDNEfG51bGx9IFRoZSBmb3VuZCAzRCBvYmplY3QuIGBudWxsYCBpZiBubyAzRCBvYmplY3QgaGFzIGJlZW4gZm91bmQuXHJcblx0ICovXHJcblx0Z2V0T2JqZWN0Rm9yRGlzdGFuY2UoIGRpc3RhbmNlICkge1xyXG5cclxuXHRcdGNvbnN0IGxldmVscyA9IHRoaXMubGV2ZWxzO1xyXG5cclxuXHRcdGlmICggbGV2ZWxzLmxlbmd0aCA+IDAgKSB7XHJcblxyXG5cdFx0XHRsZXQgaSwgbDtcclxuXHJcblx0XHRcdGZvciAoIGkgPSAxLCBsID0gbGV2ZWxzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGxldCBsZXZlbERpc3RhbmNlID0gbGV2ZWxzWyBpIF0uZGlzdGFuY2U7XHJcblxyXG5cdFx0XHRcdGlmICggbGV2ZWxzWyBpIF0ub2JqZWN0LnZpc2libGUgKSB7XHJcblxyXG5cdFx0XHRcdFx0bGV2ZWxEaXN0YW5jZSAtPSBsZXZlbERpc3RhbmNlICogbGV2ZWxzWyBpIF0uaHlzdGVyZXNpcztcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoIGRpc3RhbmNlIDwgbGV2ZWxEaXN0YW5jZSApIHtcclxuXHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIGxldmVsc1sgaSAtIDEgXS5vYmplY3Q7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBudWxsO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIGludGVyc2VjdGlvbiBwb2ludHMgYmV0d2VlbiBhIGNhc3RlZCByYXkgYW5kIHRoaXMgTE9ELlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSYXljYXN0ZXJ9IHJheWNhc3RlciAtIFRoZSByYXljYXN0ZXIuXHJcblx0ICogQHBhcmFtIHtBcnJheTxPYmplY3Q+fSBpbnRlcnNlY3RzIC0gVGhlIHRhcmdldCBhcnJheSB0aGF0IGhvbGRzIHRoZSBpbnRlcnNlY3Rpb24gcG9pbnRzLlxyXG5cdCAqL1xyXG5cdHJheWNhc3QoIHJheWNhc3RlciwgaW50ZXJzZWN0cyApIHtcclxuXHJcblx0XHRjb25zdCBsZXZlbHMgPSB0aGlzLmxldmVscztcclxuXHJcblx0XHRpZiAoIGxldmVscy5sZW5ndGggPiAwICkge1xyXG5cclxuXHRcdFx0X3YxLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5tYXRyaXhXb3JsZCApO1xyXG5cclxuXHRcdFx0Y29uc3QgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKCBfdjEgKTtcclxuXHJcblx0XHRcdHRoaXMuZ2V0T2JqZWN0Rm9yRGlzdGFuY2UoIGRpc3RhbmNlICkucmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIExPRCBieSBjb21wdXRpbmcgd2hpY2ggTE9EIGxldmVsIHNob3VsZCBiZSB2aXNpYmxlIGFjY29yZGluZ1xyXG5cdCAqIHRvIHRoZSBjdXJyZW50IGRpc3RhbmNlIG9mIHRoZSBnaXZlbiBjYW1lcmEuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0NhbWVyYX0gY2FtZXJhIC0gVGhlIGNhbWVyYSB0aGUgc2NlbmUgaXMgcmVuZGVyZWQgd2l0aC5cclxuXHQgKi9cclxuXHR1cGRhdGUoIGNhbWVyYSApIHtcclxuXHJcblx0XHRjb25zdCBsZXZlbHMgPSB0aGlzLmxldmVscztcclxuXHJcblx0XHRpZiAoIGxldmVscy5sZW5ndGggPiAxICkge1xyXG5cclxuXHRcdFx0X3YxLnNldEZyb21NYXRyaXhQb3NpdGlvbiggY2FtZXJhLm1hdHJpeFdvcmxkICk7XHJcblx0XHRcdF92Mi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubWF0cml4V29ybGQgKTtcclxuXHJcblx0XHRcdGNvbnN0IGRpc3RhbmNlID0gX3YxLmRpc3RhbmNlVG8oIF92MiApIC8gY2FtZXJhLnpvb207XHJcblxyXG5cdFx0XHRsZXZlbHNbIDAgXS5vYmplY3QudmlzaWJsZSA9IHRydWU7XHJcblxyXG5cdFx0XHRsZXQgaSwgbDtcclxuXHJcblx0XHRcdGZvciAoIGkgPSAxLCBsID0gbGV2ZWxzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGxldCBsZXZlbERpc3RhbmNlID0gbGV2ZWxzWyBpIF0uZGlzdGFuY2U7XHJcblxyXG5cdFx0XHRcdGlmICggbGV2ZWxzWyBpIF0ub2JqZWN0LnZpc2libGUgKSB7XHJcblxyXG5cdFx0XHRcdFx0bGV2ZWxEaXN0YW5jZSAtPSBsZXZlbERpc3RhbmNlICogbGV2ZWxzWyBpIF0uaHlzdGVyZXNpcztcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoIGRpc3RhbmNlID49IGxldmVsRGlzdGFuY2UgKSB7XHJcblxyXG5cdFx0XHRcdFx0bGV2ZWxzWyBpIC0gMSBdLm9iamVjdC52aXNpYmxlID0gZmFsc2U7XHJcblx0XHRcdFx0XHRsZXZlbHNbIGkgXS5vYmplY3QudmlzaWJsZSA9IHRydWU7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuX2N1cnJlbnRMZXZlbCA9IGkgLSAxO1xyXG5cclxuXHRcdFx0Zm9yICggOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0bGV2ZWxzWyBpIF0ub2JqZWN0LnZpc2libGUgPSBmYWxzZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0dG9KU09OKCBtZXRhICkge1xyXG5cclxuXHRcdGNvbnN0IGRhdGEgPSBzdXBlci50b0pTT04oIG1ldGEgKTtcclxuXHJcblx0XHRpZiAoIHRoaXMuYXV0b1VwZGF0ZSA9PT0gZmFsc2UgKSBkYXRhLm9iamVjdC5hdXRvVXBkYXRlID0gZmFsc2U7XHJcblxyXG5cdFx0ZGF0YS5vYmplY3QubGV2ZWxzID0gW107XHJcblxyXG5cdFx0Y29uc3QgbGV2ZWxzID0gdGhpcy5sZXZlbHM7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gbGV2ZWxzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBsZXZlbCA9IGxldmVsc1sgaSBdO1xyXG5cclxuXHRcdFx0ZGF0YS5vYmplY3QubGV2ZWxzLnB1c2goIHtcclxuXHRcdFx0XHRvYmplY3Q6IGxldmVsLm9iamVjdC51dWlkLFxyXG5cdFx0XHRcdGRpc3RhbmNlOiBsZXZlbC5kaXN0YW5jZSxcclxuXHRcdFx0XHRoeXN0ZXJlc2lzOiBsZXZlbC5oeXN0ZXJlc2lzXHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGRhdGE7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBMT0QgfTtcclxuIiwiaW1wb3J0IHsgTWVzaCB9IGZyb20gJy4vTWVzaC5qcyc7XHJcbmltcG9ydCB7IEJveDMgfSBmcm9tICcuLi9tYXRoL0JveDMuanMnO1xyXG5pbXBvcnQgeyBNYXRyaXg0IH0gZnJvbSAnLi4vbWF0aC9NYXRyaXg0LmpzJztcclxuaW1wb3J0IHsgU3BoZXJlIH0gZnJvbSAnLi4vbWF0aC9TcGhlcmUuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yNCB9IGZyb20gJy4uL21hdGgvVmVjdG9yNC5qcyc7XHJcbmltcG9ydCB7IFJheSB9IGZyb20gJy4uL21hdGgvUmF5LmpzJztcclxuaW1wb3J0IHsgQXR0YWNoZWRCaW5kTW9kZSwgRGV0YWNoZWRCaW5kTW9kZSB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XHJcblxyXG5jb25zdCBfYmFzZVBvc2l0aW9uID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5cclxuY29uc3QgX3NraW5JbmRleCA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjQoKTtcclxuY29uc3QgX3NraW5XZWlnaHQgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3I0KCk7XHJcblxyXG5jb25zdCBfdmVjdG9yMyA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX21hdHJpeDQgPSAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXg0KCk7XHJcbmNvbnN0IF92ZXJ0ZXggPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcblxyXG5jb25zdCBfc3BoZXJlID0gLypAX19QVVJFX18qLyBuZXcgU3BoZXJlKCk7XHJcbmNvbnN0IF9pbnZlcnNlTWF0cml4ID0gLypAX19QVVJFX18qLyBuZXcgTWF0cml4NCgpO1xyXG5jb25zdCBfcmF5ID0gLypAX19QVVJFX18qLyBuZXcgUmF5KCk7XHJcblxyXG4vKipcclxuICogQSBtZXNoIHRoYXQgaGFzIGEge0BsaW5rIFNrZWxldG9ufSB0aGF0IGNhbiB0aGVuIGJlIHVzZWQgdG8gYW5pbWF0ZSB0aGVcclxuICogdmVydGljZXMgb2YgdGhlIGdlb21ldHJ5IHdpdGggc2tpbm5pbmcvc2tlbGV0b24gYW5pbWF0aW9uLlxyXG4gKlxyXG4gKiBOZXh0IHRvIGEgdmFsaWQgc2tlbGV0b24sIHRoZSBza2lubmVkIG1lc2ggcmVxdWlyZXMgc2tpbiBpbmRpY2VzIGFuZCB3ZWlnaHRzXHJcbiAqIGFzIGJ1ZmZlciBhdHRyaWJ1dGVzIGluIGl0cyBnZW9tZXRyeS4gVGhlc2UgYXR0cmlidXRlIGRlZmluZSB3aGljaCBib25lcyBhZmZlY3QgYSBzaW5nbGVcclxuICogdmVydGV4IHRvIGEgY2VydGFpbiBleHRlbmQuXHJcbiAqXHJcbiAqIFR5cGljYWxseSBza2lubmVkIG1lc2hlcyBhcmUgbm90IGNyZWF0ZWQgbWFudWFsbHkgYnV0IGxvYWRlcnMgbGlrZSB7QGxpbmsgR0xURkxvYWRlcn1cclxuICogb3Ige0BsaW5rIEZCWExvYWRlciB9IGltcG9ydCByZXNwZWN0aXZlIG1vZGVscy5cclxuICpcclxuICogQGF1Z21lbnRzIE1lc2hcclxuICovXHJcbmNsYXNzIFNraW5uZWRNZXNoIGV4dGVuZHMgTWVzaCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc2tpbm5lZCBtZXNoLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCdWZmZXJHZW9tZXRyeX0gW2dlb21ldHJ5XSAtIFRoZSBtZXNoIGdlb21ldHJ5LlxyXG5cdCAqIEBwYXJhbSB7TWF0ZXJpYWx8QXJyYXk8TWF0ZXJpYWw+fSBbbWF0ZXJpYWxdIC0gVGhlIG1lc2ggbWF0ZXJpYWwuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGdlb21ldHJ5LCBtYXRlcmlhbCApIHtcclxuXHJcblx0XHRzdXBlciggZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzU2tpbm5lZE1lc2ggPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdTa2lubmVkTWVzaCc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBgQXR0YWNoZWRCaW5kTW9kZWAgbWVhbnMgdGhlIHNraW5uZWQgbWVzaCBzaGFyZXMgdGhlIHNhbWUgd29ybGQgc3BhY2UgYXMgdGhlIHNrZWxldG9uLlxyXG5cdFx0ICogVGhpcyBpcyBub3QgdHJ1ZSB3aGVuIHVzaW5nIGBEZXRhY2hlZEJpbmRNb2RlYCB3aGljaCBpcyB1c2VmdWwgd2hlbiBzaGFyaW5nIGEgc2tlbGV0b25cclxuXHRcdCAqIGFjcm9zcyBtdWx0aXBsZSBza2lubmVkIG1lc2hlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KEF0dGFjaGVkQmluZE1vZGV8RGV0YWNoZWRCaW5kTW9kZSl9XHJcblx0XHQgKiBAZGVmYXVsdCBBdHRhY2hlZEJpbmRNb2RlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYmluZE1vZGUgPSBBdHRhY2hlZEJpbmRNb2RlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGJhc2UgbWF0cml4IHRoYXQgaXMgdXNlZCBmb3IgdGhlIGJvdW5kIGJvbmUgdHJhbnNmb3Jtcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7TWF0cml4NH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5iaW5kTWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBiYXNlIG1hdHJpeCB0aGF0IGlzIHVzZWQgZm9yIHJlc2V0dGluZyB0aGUgYm91bmQgYm9uZSB0cmFuc2Zvcm1zLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtNYXRyaXg0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJpbmRNYXRyaXhJbnZlcnNlID0gbmV3IE1hdHJpeDQoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBib3VuZGluZyBib3ggb2YgdGhlIHNraW5uZWQgbWVzaC4gQ2FuIGJlIGNvbXB1dGVkIHZpYSB7QGxpbmsgU2tpbm5lZE1lc2gjY29tcHV0ZUJvdW5kaW5nQm94fS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P0JveDN9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYm91bmRpbmdCb3ggPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGJvdW5kaW5nIHNwaGVyZSBvZiB0aGUgc2tpbm5lZCBtZXNoLiBDYW4gYmUgY29tcHV0ZWQgdmlhIHtAbGluayBTa2lubmVkTWVzaCNjb21wdXRlQm91bmRpbmdTcGhlcmV9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/U3BoZXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gbnVsbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB0aGUgYm91bmRpbmcgYm94IG9mIHRoZSBza2lubmVkIG1lc2gsIGFuZCB1cGRhdGVzIHtAbGluayBTa2lubmVkTWVzaCNib3VuZGluZ0JveH0uXHJcblx0ICogVGhlIGJvdW5kaW5nIGJveCBpcyBub3QgYXV0b21hdGljYWxseSBjb21wdXRlZCBieSB0aGUgZW5naW5lOyB0aGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBieSB5b3VyIGFwcC5cclxuXHQgKiBJZiB0aGUgc2tpbm5lZCBtZXNoIGlzIGFuaW1hdGVkLCB0aGUgYm91bmRpbmcgYm94IHNob3VsZCBiZSByZWNvbXB1dGVkIHBlciBmcmFtZSBpbiBvcmRlciB0byByZWZsZWN0XHJcblx0ICogdGhlIGN1cnJlbnQgYW5pbWF0aW9uIHN0YXRlLlxyXG5cdCAqL1xyXG5cdGNvbXB1dGVCb3VuZGluZ0JveCgpIHtcclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmJvdW5kaW5nQm94ID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveCA9IG5ldyBCb3gzKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuYm91bmRpbmdCb3gubWFrZUVtcHR5KCk7XHJcblxyXG5cdFx0Y29uc3QgcG9zaXRpb25BdHRyaWJ1dGUgPSBnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbkF0dHJpYnV0ZS5jb3VudDsgaSArKyApIHtcclxuXHJcblx0XHRcdHRoaXMuZ2V0VmVydGV4UG9zaXRpb24oIGksIF92ZXJ0ZXggKTtcclxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveC5leHBhbmRCeVBvaW50KCBfdmVydGV4ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSBib3VuZGluZyBzcGhlcmUgb2YgdGhlIHNraW5uZWQgbWVzaCwgYW5kIHVwZGF0ZXMge0BsaW5rIFNraW5uZWRNZXNoI2JvdW5kaW5nU3BoZXJlfS5cclxuXHQgKiBUaGUgYm91bmRpbmcgc3BoZXJlIGlzIGF1dG9tYXRpY2FsbHkgY29tcHV0ZWQgYnkgdGhlIGVuZ2luZSBvbmNlIHdoZW4gaXQgaXMgbmVlZGVkLCBlLmcuLCBmb3IgcmF5IGNhc3RpbmdcclxuXHQgKiBhbmQgdmlldyBmcnVzdHVtIGN1bGxpbmcuIElmIHRoZSBza2lubmVkIG1lc2ggaXMgYW5pbWF0ZWQsIHRoZSBib3VuZGluZyBzcGhlcmUgc2hvdWxkIGJlIHJlY29tcHV0ZWRcclxuXHQgKiBwZXIgZnJhbWUgaW4gb3JkZXIgdG8gcmVmbGVjdCB0aGUgY3VycmVudCBhbmltYXRpb24gc3RhdGUuXHJcblx0ICovXHJcblx0Y29tcHV0ZUJvdW5kaW5nU3BoZXJlKCkge1xyXG5cclxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcclxuXHJcblx0XHRpZiAoIHRoaXMuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gbmV3IFNwaGVyZSgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlLm1ha2VFbXB0eSgpO1xyXG5cclxuXHRcdGNvbnN0IHBvc2l0aW9uQXR0cmlidXRlID0gZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCAncG9zaXRpb24nICk7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgcG9zaXRpb25BdHRyaWJ1dGUuY291bnQ7IGkgKysgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmdldFZlcnRleFBvc2l0aW9uKCBpLCBfdmVydGV4ICk7XHJcblx0XHRcdHRoaXMuYm91bmRpbmdTcGhlcmUuZXhwYW5kQnlQb2ludCggX3ZlcnRleCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UsIHJlY3Vyc2l2ZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UsIHJlY3Vyc2l2ZSApO1xyXG5cclxuXHRcdHRoaXMuYmluZE1vZGUgPSBzb3VyY2UuYmluZE1vZGU7XHJcblx0XHR0aGlzLmJpbmRNYXRyaXguY29weSggc291cmNlLmJpbmRNYXRyaXggKTtcclxuXHRcdHRoaXMuYmluZE1hdHJpeEludmVyc2UuY29weSggc291cmNlLmJpbmRNYXRyaXhJbnZlcnNlICk7XHJcblxyXG5cdFx0dGhpcy5za2VsZXRvbiA9IHNvdXJjZS5za2VsZXRvbjtcclxuXHJcblx0XHRpZiAoIHNvdXJjZS5ib3VuZGluZ0JveCAhPT0gbnVsbCApIHRoaXMuYm91bmRpbmdCb3ggPSBzb3VyY2UuYm91bmRpbmdCb3guY2xvbmUoKTtcclxuXHRcdGlmICggc291cmNlLmJvdW5kaW5nU3BoZXJlICE9PSBudWxsICkgdGhpcy5ib3VuZGluZ1NwaGVyZSA9IHNvdXJjZS5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdHJheWNhc3QoIHJheWNhc3RlciwgaW50ZXJzZWN0cyApIHtcclxuXHJcblx0XHRjb25zdCBtYXRlcmlhbCA9IHRoaXMubWF0ZXJpYWw7XHJcblx0XHRjb25zdCBtYXRyaXhXb3JsZCA9IHRoaXMubWF0cml4V29ybGQ7XHJcblxyXG5cdFx0aWYgKCBtYXRlcmlhbCA9PT0gdW5kZWZpbmVkICkgcmV0dXJuO1xyXG5cclxuXHRcdC8vIHRlc3Qgd2l0aCBib3VuZGluZyBzcGhlcmUgaW4gd29ybGQgc3BhY2VcclxuXHJcblx0XHRpZiAoIHRoaXMuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSB0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xyXG5cclxuXHRcdF9zcGhlcmUuY29weSggdGhpcy5ib3VuZGluZ1NwaGVyZSApO1xyXG5cdFx0X3NwaGVyZS5hcHBseU1hdHJpeDQoIG1hdHJpeFdvcmxkICk7XHJcblxyXG5cdFx0aWYgKCByYXljYXN0ZXIucmF5LmludGVyc2VjdHNTcGhlcmUoIF9zcGhlcmUgKSA9PT0gZmFsc2UgKSByZXR1cm47XHJcblxyXG5cdFx0Ly8gY29udmVydCByYXkgdG8gbG9jYWwgc3BhY2Ugb2Ygc2tpbm5lZCBtZXNoXHJcblxyXG5cdFx0X2ludmVyc2VNYXRyaXguY29weSggbWF0cml4V29ybGQgKS5pbnZlcnQoKTtcclxuXHRcdF9yYXkuY29weSggcmF5Y2FzdGVyLnJheSApLmFwcGx5TWF0cml4NCggX2ludmVyc2VNYXRyaXggKTtcclxuXHJcblx0XHQvLyB0ZXN0IHdpdGggYm91bmRpbmcgYm94IGluIGxvY2FsIHNwYWNlXHJcblxyXG5cdFx0aWYgKCB0aGlzLmJvdW5kaW5nQm94ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0aWYgKCBfcmF5LmludGVyc2VjdHNCb3goIHRoaXMuYm91bmRpbmdCb3ggKSA9PT0gZmFsc2UgKSByZXR1cm47XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIHRlc3QgZm9yIGludGVyc2VjdGlvbnMgd2l0aCBnZW9tZXRyeVxyXG5cclxuXHRcdHRoaXMuX2NvbXB1dGVJbnRlcnNlY3Rpb25zKCByYXljYXN0ZXIsIGludGVyc2VjdHMsIF9yYXkgKTtcclxuXHJcblx0fVxyXG5cclxuXHRnZXRWZXJ0ZXhQb3NpdGlvbiggaW5kZXgsIHRhcmdldCApIHtcclxuXHJcblx0XHRzdXBlci5nZXRWZXJ0ZXhQb3NpdGlvbiggaW5kZXgsIHRhcmdldCApO1xyXG5cclxuXHRcdHRoaXMuYXBwbHlCb25lVHJhbnNmb3JtKCBpbmRleCwgdGFyZ2V0ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRhcmdldDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBCaW5kcyB0aGUgZ2l2ZW4gc2tlbGV0b24gdG8gdGhlIHNraW5uZWQgbWVzaC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7U2tlbGV0b259IHNrZWxldG9uIC0gVGhlIHNrZWxldG9uIHRvIGJpbmQuXHJcblx0ICogQHBhcmFtIHtNYXRyaXg0fSBbYmluZE1hdHJpeF0gLSBUaGUgYmluZCBtYXRyaXguIElmIG5vIGJpbmQgbWF0cml4IGlzIHByb3ZpZGVkLFxyXG5cdCAqIHRoZSBza2lubmVkIG1lc2gncyB3b3JsZCBtYXRyaXggd2lsbCBiZSB1c2VkIGluc3RlYWQuXHJcblx0ICovXHJcblx0YmluZCggc2tlbGV0b24sIGJpbmRNYXRyaXggKSB7XHJcblxyXG5cdFx0dGhpcy5za2VsZXRvbiA9IHNrZWxldG9uO1xyXG5cclxuXHRcdGlmICggYmluZE1hdHJpeCA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0dGhpcy51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSApO1xyXG5cclxuXHRcdFx0dGhpcy5za2VsZXRvbi5jYWxjdWxhdGVJbnZlcnNlcygpO1xyXG5cclxuXHRcdFx0YmluZE1hdHJpeCA9IHRoaXMubWF0cml4V29ybGQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuYmluZE1hdHJpeC5jb3B5KCBiaW5kTWF0cml4ICk7XHJcblx0XHR0aGlzLmJpbmRNYXRyaXhJbnZlcnNlLmNvcHkoIGJpbmRNYXRyaXggKS5pbnZlcnQoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBzZXRzIHRoZSBza2lubmVkIG1lc2ggaW4gdGhlIHJlc3QgcG9zZSkuXHJcblx0ICovXHJcblx0cG9zZSgpIHtcclxuXHJcblx0XHR0aGlzLnNrZWxldG9uLnBvc2UoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBOb3JtYWxpemVzIHRoZSBza2luIHdlaWdodHMgd2hpY2ggYXJlIGRlZmluZWQgYXMgYSBidWZmZXIgYXR0cmlidXRlXHJcblx0ICogaW4gdGhlIHNraW5uZWQgbWVzaCdzIGdlb21ldHJ5LlxyXG5cdCAqL1xyXG5cdG5vcm1hbGl6ZVNraW5XZWlnaHRzKCkge1xyXG5cclxuXHRcdGNvbnN0IHZlY3RvciA9IG5ldyBWZWN0b3I0KCk7XHJcblxyXG5cdFx0Y29uc3Qgc2tpbldlaWdodCA9IHRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5za2luV2VpZ2h0O1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHNraW5XZWlnaHQuY291bnQ7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0dmVjdG9yLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHNraW5XZWlnaHQsIGkgKTtcclxuXHJcblx0XHRcdGNvbnN0IHNjYWxlID0gMS4wIC8gdmVjdG9yLm1hbmhhdHRhbkxlbmd0aCgpO1xyXG5cclxuXHRcdFx0aWYgKCBzY2FsZSAhPT0gSW5maW5pdHkgKSB7XHJcblxyXG5cdFx0XHRcdHZlY3Rvci5tdWx0aXBseVNjYWxhciggc2NhbGUgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHZlY3Rvci5zZXQoIDEsIDAsIDAsIDAgKTsgLy8gZG8gc29tZXRoaW5nIHJlYXNvbmFibGVcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHNraW5XZWlnaHQuc2V0WFlaVyggaSwgdmVjdG9yLngsIHZlY3Rvci55LCB2ZWN0b3IueiwgdmVjdG9yLncgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0dXBkYXRlTWF0cml4V29ybGQoIGZvcmNlICkge1xyXG5cclxuXHRcdHN1cGVyLnVwZGF0ZU1hdHJpeFdvcmxkKCBmb3JjZSApO1xyXG5cclxuXHRcdGlmICggdGhpcy5iaW5kTW9kZSA9PT0gQXR0YWNoZWRCaW5kTW9kZSApIHtcclxuXHJcblx0XHRcdHRoaXMuYmluZE1hdHJpeEludmVyc2UuY29weSggdGhpcy5tYXRyaXhXb3JsZCApLmludmVydCgpO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHRoaXMuYmluZE1vZGUgPT09IERldGFjaGVkQmluZE1vZGUgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmJpbmRNYXRyaXhJbnZlcnNlLmNvcHkoIHRoaXMuYmluZE1hdHJpeCApLmludmVydCgpO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Ta2lubmVkTWVzaDogVW5yZWNvZ25pemVkIGJpbmRNb2RlOiAnICsgdGhpcy5iaW5kTW9kZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBcHBsaWVzIHRoZSBib25lIHRyYW5zZm9ybSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGluZGV4IHRvIHRoZSBnaXZlblxyXG5cdCAqIHZlcnRleCBwb3NpdGlvbi4gUmV0dXJucyB0aGUgdXBkYXRlZCB2ZWN0b3IuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgdmVydGV4IGluZGV4LlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdGFyZ2V0IC0gVGhlIHRhcmdldCBvYmplY3QgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBtZXRob2QncyByZXN1bHQuXHJcblx0ICogdGhlIHNraW5uZWQgbWVzaCdzIHdvcmxkIG1hdHJpeCB3aWxsIGJlIHVzZWQgaW5zdGVhZC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBUaGUgdXBkYXRlZCB2ZXJ0ZXggcG9zaXRpb24uXHJcblx0ICovXHJcblx0YXBwbHlCb25lVHJhbnNmb3JtKCBpbmRleCwgdGFyZ2V0ICkge1xyXG5cclxuXHRcdGNvbnN0IHNrZWxldG9uID0gdGhpcy5za2VsZXRvbjtcclxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcclxuXHJcblx0XHRfc2tpbkluZGV4LmZyb21CdWZmZXJBdHRyaWJ1dGUoIGdlb21ldHJ5LmF0dHJpYnV0ZXMuc2tpbkluZGV4LCBpbmRleCApO1xyXG5cdFx0X3NraW5XZWlnaHQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggZ2VvbWV0cnkuYXR0cmlidXRlcy5za2luV2VpZ2h0LCBpbmRleCApO1xyXG5cclxuXHRcdF9iYXNlUG9zaXRpb24uY29weSggdGFyZ2V0ICkuYXBwbHlNYXRyaXg0KCB0aGlzLmJpbmRNYXRyaXggKTtcclxuXHJcblx0XHR0YXJnZXQuc2V0KCAwLCAwLCAwICk7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgNDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHdlaWdodCA9IF9za2luV2VpZ2h0LmdldENvbXBvbmVudCggaSApO1xyXG5cclxuXHRcdFx0aWYgKCB3ZWlnaHQgIT09IDAgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGJvbmVJbmRleCA9IF9za2luSW5kZXguZ2V0Q29tcG9uZW50KCBpICk7XHJcblxyXG5cdFx0XHRcdF9tYXRyaXg0Lm11bHRpcGx5TWF0cmljZXMoIHNrZWxldG9uLmJvbmVzWyBib25lSW5kZXggXS5tYXRyaXhXb3JsZCwgc2tlbGV0b24uYm9uZUludmVyc2VzWyBib25lSW5kZXggXSApO1xyXG5cclxuXHRcdFx0XHR0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKCBfdmVjdG9yMy5jb3B5KCBfYmFzZVBvc2l0aW9uICkuYXBwbHlNYXRyaXg0KCBfbWF0cml4NCApLCB3ZWlnaHQgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRhcmdldC5hcHBseU1hdHJpeDQoIHRoaXMuYmluZE1hdHJpeEludmVyc2UgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgU2tpbm5lZE1lc2ggfTtcclxuIiwiaW1wb3J0IHsgT2JqZWN0M0QgfSBmcm9tICcuLi9jb3JlL09iamVjdDNELmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIGJvbmUgd2hpY2ggaXMgcGFydCBvZiBhIHtAbGluayBTa2VsZXRvbn0uIFRoZSBza2VsZXRvbiBpbiB0dXJuIGlzIHVzZWQgYnlcclxuICogdGhlIHtAbGluayBTa2lubmVkTWVzaH0uXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IHJvb3QgPSBuZXcgVEhSRUUuQm9uZSgpO1xyXG4gKiBjb25zdCBjaGlsZCA9IG5ldyBUSFJFRS5Cb25lKCk7XHJcbiAqXHJcbiAqIHJvb3QuYWRkKCBjaGlsZCApO1xyXG4gKiBjaGlsZC5wb3NpdGlvbi55ID0gNTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBPYmplY3QzRFxyXG4gKi9cclxuY2xhc3MgQm9uZSBleHRlbmRzIE9iamVjdDNEIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBib25lLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzQm9uZSA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ0JvbmUnO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBCb25lIH07XHJcbiIsImltcG9ydCB7IFRleHR1cmUgfSBmcm9tICcuL1RleHR1cmUuanMnO1xyXG5pbXBvcnQgeyBOZWFyZXN0RmlsdGVyIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgdGV4dHVyZSBkaXJlY3RseSBmcm9tIHJhdyBidWZmZXIgZGF0YS5cclxuICpcclxuICogVGhlIGludGVycHJldGF0aW9uIG9mIHRoZSBkYXRhIGRlcGVuZHMgb24gdHlwZSBhbmQgZm9ybWF0OiBJZiB0aGUgdHlwZSBpc1xyXG4gKiBgVW5zaWduZWRCeXRlVHlwZWAsIGEgYFVpbnQ4QXJyYXlgIHdpbGwgYmUgdXNlZnVsIGZvciBhZGRyZXNzaW5nIHRoZVxyXG4gKiB0ZXhlbCBkYXRhLiBJZiB0aGUgZm9ybWF0IGlzIGBSR0JBRm9ybWF0YCwgZGF0YSBuZWVkcyBmb3VyIHZhbHVlcyBmb3JcclxuICogb25lIHRleGVsOyBSZWQsIEdyZWVuLCBCbHVlIGFuZCBBbHBoYSAodHlwaWNhbGx5IHRoZSBvcGFjaXR5KS5cclxuICpcclxuICogQGF1Z21lbnRzIFRleHR1cmVcclxuICovXHJcbmNsYXNzIERhdGFUZXh0dXJlIGV4dGVuZHMgVGV4dHVyZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgZGF0YSB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHs/VHlwZWRBcnJheX0gW2RhdGE9bnVsbF0gLSBUaGUgYnVmZmVyIGRhdGEuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt3aWR0aD0xXSAtIFRoZSB3aWR0aCBvZiB0aGUgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2hlaWdodD0xXSAtIFRoZSBoZWlnaHQgb2YgdGhlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtmb3JtYXQ9UkdCQUZvcm1hdF0gLSBUaGUgdGV4dHVyZSBmb3JtYXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt0eXBlPVVuc2lnbmVkQnl0ZVR5cGVdIC0gVGhlIHRleHR1cmUgdHlwZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW21hcHBpbmc9VGV4dHVyZS5ERUZBVUxUX01BUFBJTkddIC0gVGhlIHRleHR1cmUgbWFwcGluZy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3dyYXBTPUNsYW1wVG9FZGdlV3JhcHBpbmddIC0gVGhlIHdyYXBTIHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbd3JhcFQ9Q2xhbXBUb0VkZ2VXcmFwcGluZ10gLSBUaGUgd3JhcFQgdmFsdWUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFttYWdGaWx0ZXI9TmVhcmVzdEZpbHRlcl0gLSBUaGUgbWFnIGZpbHRlciB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW21pbkZpbHRlcj1OZWFyZXN0RmlsdGVyXSAtIFRoZSBtaW4gZmlsdGVyIHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbYW5pc290cm9weT1UZXh0dXJlLkRFRkFVTFRfQU5JU09UUk9QWV0gLSBUaGUgYW5pc290cm9weSB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW2NvbG9yU3BhY2U9Tm9Db2xvclNwYWNlXSAtIFRoZSBjb2xvciBzcGFjZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggZGF0YSA9IG51bGwsIHdpZHRoID0gMSwgaGVpZ2h0ID0gMSwgZm9ybWF0LCB0eXBlLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciA9IE5lYXJlc3RGaWx0ZXIsIG1pbkZpbHRlciA9IE5lYXJlc3RGaWx0ZXIsIGFuaXNvdHJvcHksIGNvbG9yU3BhY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG51bGwsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSwgY29sb3JTcGFjZSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0RhdGFUZXh0dXJlID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBpbWFnZSBkZWZpbml0aW9uIG9mIGEgZGF0YSB0ZXh0dXJlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHt7ZGF0YTpUeXBlZEFycmF5LHdpZHRoOm51bWJlcixoZWlnaHQ6bnVtYmVyfX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pbWFnZSA9IHsgZGF0YTogZGF0YSwgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCB9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0byBnZW5lcmF0ZSBtaXBtYXBzIChpZiBwb3NzaWJsZSkgZm9yIGEgdGV4dHVyZS5cclxuXHRcdCAqXHJcblx0XHQgKiBPdmVyd3JpdHRlbiBhbmQgc2V0IHRvIGBmYWxzZWAgYnkgZGVmYXVsdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBJZiBzZXQgdG8gYHRydWVgLCB0aGUgdGV4dHVyZSBpcyBmbGlwcGVkIGFsb25nIHRoZSB2ZXJ0aWNhbCBheGlzIHdoZW5cclxuXHRcdCAqIHVwbG9hZGVkIHRvIHRoZSBHUFUuXHJcblx0XHQgKlxyXG5cdFx0ICogT3ZlcndyaXR0ZW4gYW5kIHNldCB0byBgZmFsc2VgIGJ5IGRlZmF1bHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZsaXBZID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTcGVjaWZpZXMgdGhlIGFsaWdubWVudCByZXF1aXJlbWVudHMgZm9yIHRoZSBzdGFydCBvZiBlYWNoIHBpeGVsIHJvdyBpbiBtZW1vcnkuXHJcblx0XHQgKlxyXG5cdFx0ICogT3ZlcndyaXR0ZW4gYW5kIHNldCB0byBgMWAgYnkgZGVmYXVsdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51bnBhY2tBbGlnbm1lbnQgPSAxO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBEYXRhVGV4dHVyZSB9O1xyXG4iLCJpbXBvcnQge1xyXG5cdFJHQkFGb3JtYXQsXHJcblx0RmxvYXRUeXBlXHJcbn0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgQm9uZSB9IGZyb20gJy4vQm9uZS5qcyc7XHJcbmltcG9ydCB7IE1hdHJpeDQgfSBmcm9tICcuLi9tYXRoL01hdHJpeDQuanMnO1xyXG5pbXBvcnQgeyBEYXRhVGV4dHVyZSB9IGZyb20gJy4uL3RleHR1cmVzL0RhdGFUZXh0dXJlLmpzJztcclxuaW1wb3J0IHsgZ2VuZXJhdGVVVUlEIH0gZnJvbSAnLi4vbWF0aC9NYXRoVXRpbHMuanMnO1xyXG5cclxuY29uc3QgX29mZnNldE1hdHJpeCA9IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDQoKTtcclxuY29uc3QgX2lkZW50aXR5TWF0cml4ID0gLypAX19QVVJFX18qLyBuZXcgTWF0cml4NCgpO1xyXG5cclxuLyoqXHJcbiAqIENsYXNzIGZvciByZXByZXNlbnRpbmcgdGhlIGFybWF0dXJlcyBpbiBgdGhyZWUuanNgLiBUaGUgc2tlbGV0b25cclxuICogaXMgZGVmaW5lZCBieSBhIGhpZXJhcmNoeSBvZiBib25lcy5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgYm9uZXMgPSBbXTtcclxuICpcclxuICogY29uc3Qgc2hvdWxkZXIgPSBuZXcgVEhSRUUuQm9uZSgpO1xyXG4gKiBjb25zdCBlbGJvdyA9IG5ldyBUSFJFRS5Cb25lKCk7XHJcbiAqIGNvbnN0IGhhbmQgPSBuZXcgVEhSRUUuQm9uZSgpO1xyXG4gKlxyXG4gKiBzaG91bGRlci5hZGQoIGVsYm93ICk7XHJcbiAqIGVsYm93LmFkZCggaGFuZCApO1xyXG4gKlxyXG4gKiBib25lcy5wdXNoKCBzaG91bGRlciAsIGVsYm93LCBoYW5kKTtcclxuICpcclxuICogc2hvdWxkZXIucG9zaXRpb24ueSA9IC01O1xyXG4gKiBlbGJvdy5wb3NpdGlvbi55ID0gMDtcclxuICogaGFuZC5wb3NpdGlvbi55ID0gNTtcclxuICpcclxuICogY29uc3QgYXJtU2tlbGV0b24gPSBuZXcgVEhSRUUuU2tlbGV0b24oIGJvbmVzICk7XHJcbiAqIGBgYFxyXG4gKi9cclxuY2xhc3MgU2tlbGV0b24ge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHNrZWxldG9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxCb25lPn0gW2JvbmVzXSAtIEFuIGFycmF5IG9mIGJvbmVzLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8TWF0cml4ND59IFtib25lSW52ZXJzZXNdIC0gQW4gYXJyYXkgb2YgYm9uZSBpbnZlcnNlIG1hdHJpY2VzLlxyXG5cdCAqIElmIG5vdCBwcm92aWRlZCwgdGhlc2UgbWF0cmljZXMgd2lsbCBiZSBjb21wdXRlZCBhdXRvbWF0aWNhbGx5IHZpYSB7QGxpbmsgU2tlbGV0b24jY2FsY3VsYXRlSW52ZXJzZXN9LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBib25lcyA9IFtdLCBib25lSW52ZXJzZXMgPSBbXSApIHtcclxuXHJcblx0XHR0aGlzLnV1aWQgPSBnZW5lcmF0ZVVVSUQoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIGFycmF5IG9mIGJvbmVzIGRlZmluaW5nIHRoZSBza2VsZXRvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8Qm9uZT59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYm9uZXMgPSBib25lcy5zbGljZSggMCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQW4gYXJyYXkgb2YgYm9uZSBpbnZlcnNlIG1hdHJpY2VzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxNYXRyaXg0Pn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ib25lSW52ZXJzZXMgPSBib25lSW52ZXJzZXM7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBhcnJheSBidWZmZXIgaG9sZGluZyB0aGUgYm9uZSBkYXRhLlxyXG5cdFx0ICogSW5wdXQgZGF0YSBmb3Ige0BsaW5rIFNrZWxldG9uI2JvbmVUZXh0dXJlfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P0Zsb2F0MzJBcnJheX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ib25lTWF0cmljZXMgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSB0ZXh0dXJlIGhvbGRpbmcgdGhlIGJvbmUgZGF0YSBmb3IgdXNlXHJcblx0XHQgKiBpbiB0aGUgdmVydGV4IHNoYWRlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P0RhdGFUZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJvbmVUZXh0dXJlID0gbnVsbDtcclxuXHJcblx0XHR0aGlzLmluaXQoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJbml0aWFsaXplcyB0aGUgc2tlbGV0b24uIFRoaXMgbWV0aG9kIGdldHMgYXV0b21hdGljYWxseSBjYWxsZWQgYnkgdGhlIGNvbnN0cnVjdG9yXHJcblx0ICogYnV0IGRlcGVuZGluZyBvbiBob3cgdGhlIHNrZWxldG9uIGlzIGNyZWF0ZWQgaXQgbWlnaHQgYmUgbmVjZXNzYXJ5IHRvIGNhbGwgdGhpcyBtZXRob2RcclxuXHQgKiBtYW51YWxseS5cclxuXHQgKi9cclxuXHRpbml0KCkge1xyXG5cclxuXHRcdGNvbnN0IGJvbmVzID0gdGhpcy5ib25lcztcclxuXHRcdGNvbnN0IGJvbmVJbnZlcnNlcyA9IHRoaXMuYm9uZUludmVyc2VzO1xyXG5cclxuXHRcdHRoaXMuYm9uZU1hdHJpY2VzID0gbmV3IEZsb2F0MzJBcnJheSggYm9uZXMubGVuZ3RoICogMTYgKTtcclxuXHJcblx0XHQvLyBjYWxjdWxhdGUgaW52ZXJzZSBib25lIG1hdHJpY2VzIGlmIG5lY2Vzc2FyeVxyXG5cclxuXHRcdGlmICggYm9uZUludmVyc2VzLmxlbmd0aCA9PT0gMCApIHtcclxuXHJcblx0XHRcdHRoaXMuY2FsY3VsYXRlSW52ZXJzZXMoKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Ly8gaGFuZGxlIHNwZWNpYWwgY2FzZVxyXG5cclxuXHRcdFx0aWYgKCBib25lcy5sZW5ndGggIT09IGJvbmVJbnZlcnNlcy5sZW5ndGggKSB7XHJcblxyXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlNrZWxldG9uOiBOdW1iZXIgb2YgaW52ZXJzZSBib25lIG1hdHJpY2VzIGRvZXMgbm90IG1hdGNoIGFtb3VudCBvZiBib25lcy4nICk7XHJcblxyXG5cdFx0XHRcdHRoaXMuYm9uZUludmVyc2VzID0gW107XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSB0aGlzLmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdHRoaXMuYm9uZUludmVyc2VzLnB1c2goIG5ldyBNYXRyaXg0KCkgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB0aGUgYm9uZSBpbnZlcnNlIG1hdHJpY2VzLiBUaGlzIG1ldGhvZCByZXNldHMge0BsaW5rIFNrZWxldG9uI2JvbmVJbnZlcnNlc31cclxuXHQgKiBhbmQgZmlsbHMgaXQgd2l0aCBuZXcgbWF0cmljZXMuXHJcblx0ICovXHJcblx0Y2FsY3VsYXRlSW52ZXJzZXMoKSB7XHJcblxyXG5cdFx0dGhpcy5ib25lSW52ZXJzZXMubGVuZ3RoID0gMDtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gdGhpcy5ib25lcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGludmVyc2UgPSBuZXcgTWF0cml4NCgpO1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLmJvbmVzWyBpIF0gKSB7XHJcblxyXG5cdFx0XHRcdGludmVyc2UuY29weSggdGhpcy5ib25lc1sgaSBdLm1hdHJpeFdvcmxkICkuaW52ZXJ0KCk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0aGlzLmJvbmVJbnZlcnNlcy5wdXNoKCBpbnZlcnNlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlc2V0cyB0aGUgc2tlbGV0b24gdG8gdGhlIGJhc2UgcG9zZS5cclxuXHQgKi9cclxuXHRwb3NlKCkge1xyXG5cclxuXHRcdC8vIHJlY292ZXIgdGhlIGJpbmQtdGltZSB3b3JsZCBtYXRyaWNlc1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSB0aGlzLmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYm9uZSA9IHRoaXMuYm9uZXNbIGkgXTtcclxuXHJcblx0XHRcdGlmICggYm9uZSApIHtcclxuXHJcblx0XHRcdFx0Ym9uZS5tYXRyaXhXb3JsZC5jb3B5KCB0aGlzLmJvbmVJbnZlcnNlc1sgaSBdICkuaW52ZXJ0KCk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGNvbXB1dGUgdGhlIGxvY2FsIG1hdHJpY2VzLCBwb3NpdGlvbnMsIHJvdGF0aW9ucyBhbmQgc2NhbGVzXHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IHRoaXMuYm9uZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBib25lID0gdGhpcy5ib25lc1sgaSBdO1xyXG5cclxuXHRcdFx0aWYgKCBib25lICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIGJvbmUucGFyZW50ICYmIGJvbmUucGFyZW50LmlzQm9uZSApIHtcclxuXHJcblx0XHRcdFx0XHRib25lLm1hdHJpeC5jb3B5KCBib25lLnBhcmVudC5tYXRyaXhXb3JsZCApLmludmVydCgpO1xyXG5cdFx0XHRcdFx0Ym9uZS5tYXRyaXgubXVsdGlwbHkoIGJvbmUubWF0cml4V29ybGQgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRib25lLm1hdHJpeC5jb3B5KCBib25lLm1hdHJpeFdvcmxkICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Ym9uZS5tYXRyaXguZGVjb21wb3NlKCBib25lLnBvc2l0aW9uLCBib25lLnF1YXRlcm5pb24sIGJvbmUuc2NhbGUgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVzZXRzIHRoZSBza2VsZXRvbiB0byB0aGUgYmFzZSBwb3NlLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZSgpIHtcclxuXHJcblx0XHRjb25zdCBib25lcyA9IHRoaXMuYm9uZXM7XHJcblx0XHRjb25zdCBib25lSW52ZXJzZXMgPSB0aGlzLmJvbmVJbnZlcnNlcztcclxuXHRcdGNvbnN0IGJvbmVNYXRyaWNlcyA9IHRoaXMuYm9uZU1hdHJpY2VzO1xyXG5cdFx0Y29uc3QgYm9uZVRleHR1cmUgPSB0aGlzLmJvbmVUZXh0dXJlO1xyXG5cclxuXHRcdC8vIGZsYXR0ZW4gYm9uZSBtYXRyaWNlcyB0byBhcnJheVxyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBib25lcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHRcdC8vIGNvbXB1dGUgdGhlIG9mZnNldCBiZXR3ZWVuIHRoZSBjdXJyZW50IGFuZCB0aGUgb3JpZ2luYWwgdHJhbnNmb3JtXHJcblxyXG5cdFx0XHRjb25zdCBtYXRyaXggPSBib25lc1sgaSBdID8gYm9uZXNbIGkgXS5tYXRyaXhXb3JsZCA6IF9pZGVudGl0eU1hdHJpeDtcclxuXHJcblx0XHRcdF9vZmZzZXRNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggbWF0cml4LCBib25lSW52ZXJzZXNbIGkgXSApO1xyXG5cdFx0XHRfb2Zmc2V0TWF0cml4LnRvQXJyYXkoIGJvbmVNYXRyaWNlcywgaSAqIDE2ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggYm9uZVRleHR1cmUgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRib25lVGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBuZXcgc2tlbGV0b24gd2l0aCBjb3BpZWQgdmFsdWVzIGZyb20gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1NrZWxldG9ufSBBIGNsb25lIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y2xvbmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBTa2VsZXRvbiggdGhpcy5ib25lcywgdGhpcy5ib25lSW52ZXJzZXMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyBhIGRhdGEgdGV4dHVyZSBmb3IgcGFzc2luZyBib25lIGRhdGEgdG8gdGhlIHZlcnRleCBzaGFkZXIuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtTa2VsZXRvbn0gQSByZWZlcmVuY2Ugb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjb21wdXRlQm9uZVRleHR1cmUoKSB7XHJcblxyXG5cdFx0Ly8gbGF5b3V0ICgxIG1hdHJpeCA9IDQgcGl4ZWxzKVxyXG5cdFx0Ly8gICAgICBSR0JBIFJHQkEgUkdCQSBSR0JBICg9PiBjb2x1bW4xLCBjb2x1bW4yLCBjb2x1bW4zLCBjb2x1bW40KVxyXG5cdFx0Ly8gIHdpdGggIDh4OCAgcGl4ZWwgdGV4dHVyZSBtYXggICAxNiBib25lcyAqIDQgcGl4ZWxzID0gICg4ICogOClcclxuXHRcdC8vICAgICAgIDE2eDE2IHBpeGVsIHRleHR1cmUgbWF4ICAgNjQgYm9uZXMgKiA0IHBpeGVscyA9ICgxNiAqIDE2KVxyXG5cdFx0Ly8gICAgICAgMzJ4MzIgcGl4ZWwgdGV4dHVyZSBtYXggIDI1NiBib25lcyAqIDQgcGl4ZWxzID0gKDMyICogMzIpXHJcblx0XHQvLyAgICAgICA2NHg2NCBwaXhlbCB0ZXh0dXJlIG1heCAxMDI0IGJvbmVzICogNCBwaXhlbHMgPSAoNjQgKiA2NClcclxuXHJcblx0XHRsZXQgc2l6ZSA9IE1hdGguc3FydCggdGhpcy5ib25lcy5sZW5ndGggKiA0ICk7IC8vIDQgcGl4ZWxzIG5lZWRlZCBmb3IgMSBtYXRyaXhcclxuXHRcdHNpemUgPSBNYXRoLmNlaWwoIHNpemUgLyA0ICkgKiA0O1xyXG5cdFx0c2l6ZSA9IE1hdGgubWF4KCBzaXplLCA0ICk7XHJcblxyXG5cdFx0Y29uc3QgYm9uZU1hdHJpY2VzID0gbmV3IEZsb2F0MzJBcnJheSggc2l6ZSAqIHNpemUgKiA0ICk7IC8vIDQgZmxvYXRzIHBlciBSR0JBIHBpeGVsXHJcblx0XHRib25lTWF0cmljZXMuc2V0KCB0aGlzLmJvbmVNYXRyaWNlcyApOyAvLyBjb3B5IGN1cnJlbnQgdmFsdWVzXHJcblxyXG5cdFx0Y29uc3QgYm9uZVRleHR1cmUgPSBuZXcgRGF0YVRleHR1cmUoIGJvbmVNYXRyaWNlcywgc2l6ZSwgc2l6ZSwgUkdCQUZvcm1hdCwgRmxvYXRUeXBlICk7XHJcblx0XHRib25lVGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy5ib25lTWF0cmljZXMgPSBib25lTWF0cmljZXM7XHJcblx0XHR0aGlzLmJvbmVUZXh0dXJlID0gYm9uZVRleHR1cmU7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2VhcmNoZXMgdGhyb3VnaCB0aGUgc2tlbGV0b24ncyBib25lIGFycmF5IGFuZCByZXR1cm5zIHRoZSBmaXJzdCB3aXRoIGFcclxuXHQgKiBtYXRjaGluZyBuYW1lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgYm9uZS5cclxuXHQgKiBAcmV0dXJuIHtCb25lfHVuZGVmaW5lZH0gVGhlIGZvdW5kIGJvbmUuIGB1bmRlZmluZWRgIGlmIG5vIGJvbmUgaGFzIGJlZW4gZm91bmQuXHJcblx0ICovXHJcblx0Z2V0Qm9uZUJ5TmFtZSggbmFtZSApIHtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gdGhpcy5ib25lcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGJvbmUgPSB0aGlzLmJvbmVzWyBpIF07XHJcblxyXG5cdFx0XHRpZiAoIGJvbmUubmFtZSA9PT0gbmFtZSApIHtcclxuXHJcblx0XHRcdFx0cmV0dXJuIGJvbmU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB1bmRlZmluZWQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRnJlZXMgdGhlIEdQVS1yZWxhdGVkIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhpcyBpbnN0YW5jZS4gQ2FsbCB0aGlzXHJcblx0ICogbWV0aG9kIHdoZW5ldmVyIHRoaXMgaW5zdGFuY2UgaXMgbm8gbG9uZ2VyIHVzZWQgaW4geW91ciBhcHAuXHJcblx0ICovXHJcblx0ZGlzcG9zZSggKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmJvbmVUZXh0dXJlICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5ib25lVGV4dHVyZS5kaXNwb3NlKCk7XHJcblxyXG5cdFx0XHR0aGlzLmJvbmVUZXh0dXJlID0gbnVsbDtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0dXBzIHRoZSBza2VsZXRvbiBieSB0aGUgZ2l2ZW4gSlNPTiBhbmQgYm9uZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0ganNvbiAtIFRoZSBza2VsZXRvbiBhcyBzZXJpYWxpemVkIEpTT04uXHJcblx0ICogQHBhcmFtIHtPYmplY3Q8c3RyaW5nLCBCb25lPn0gYm9uZXMgLSBBbiBhcnJheSBvZiBib25lcy5cclxuXHQgKiBAcmV0dXJuIHtTa2VsZXRvbn0gQSByZWZlcmVuY2Ugb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRmcm9tSlNPTigganNvbiwgYm9uZXMgKSB7XHJcblxyXG5cdFx0dGhpcy51dWlkID0ganNvbi51dWlkO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGpzb24uYm9uZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHV1aWQgPSBqc29uLmJvbmVzWyBpIF07XHJcblx0XHRcdGxldCBib25lID0gYm9uZXNbIHV1aWQgXTtcclxuXHJcblx0XHRcdGlmICggYm9uZSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Ta2VsZXRvbjogTm8gYm9uZSBmb3VuZCB3aXRoIFVVSUQ6JywgdXVpZCApO1xyXG5cdFx0XHRcdGJvbmUgPSBuZXcgQm9uZSgpO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5ib25lcy5wdXNoKCBib25lICk7XHJcblx0XHRcdHRoaXMuYm9uZUludmVyc2VzLnB1c2goIG5ldyBNYXRyaXg0KCkuZnJvbUFycmF5KCBqc29uLmJvbmVJbnZlcnNlc1sgaSBdICkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5pbml0KCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2VyaWFsaXplcyB0aGUgc2tlbGV0b24gaW50byBKU09OLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7T2JqZWN0fSBBIEpTT04gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc2VyaWFsaXplZCBza2VsZXRvbi5cclxuXHQgKiBAc2VlIHtAbGluayBPYmplY3RMb2FkZXIjcGFyc2V9XHJcblx0ICovXHJcblx0dG9KU09OKCkge1xyXG5cclxuXHRcdGNvbnN0IGRhdGEgPSB7XHJcblx0XHRcdG1ldGFkYXRhOiB7XHJcblx0XHRcdFx0dmVyc2lvbjogNC42LFxyXG5cdFx0XHRcdHR5cGU6ICdTa2VsZXRvbicsXHJcblx0XHRcdFx0Z2VuZXJhdG9yOiAnU2tlbGV0b24udG9KU09OJ1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRib25lczogW10sXHJcblx0XHRcdGJvbmVJbnZlcnNlczogW11cclxuXHRcdH07XHJcblxyXG5cdFx0ZGF0YS51dWlkID0gdGhpcy51dWlkO1xyXG5cclxuXHRcdGNvbnN0IGJvbmVzID0gdGhpcy5ib25lcztcclxuXHRcdGNvbnN0IGJvbmVJbnZlcnNlcyA9IHRoaXMuYm9uZUludmVyc2VzO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGJvbmVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBib25lID0gYm9uZXNbIGkgXTtcclxuXHRcdFx0ZGF0YS5ib25lcy5wdXNoKCBib25lLnV1aWQgKTtcclxuXHJcblx0XHRcdGNvbnN0IGJvbmVJbnZlcnNlID0gYm9uZUludmVyc2VzWyBpIF07XHJcblx0XHRcdGRhdGEuYm9uZUludmVyc2VzLnB1c2goIGJvbmVJbnZlcnNlLnRvQXJyYXkoKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZGF0YTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgU2tlbGV0b24gfTtcclxuIiwiaW1wb3J0IHsgQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi9CdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5cclxuLyoqXHJcbiAqIEFuIGluc3RhbmNlZCB2ZXJzaW9uIG9mIGEgYnVmZmVyIGF0dHJpYnV0ZS5cclxuICpcclxuICogQGF1Z21lbnRzIEJ1ZmZlckF0dHJpYnV0ZVxyXG4gKi9cclxuY2xhc3MgSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlIGV4dGVuZHMgQnVmZmVyQXR0cmlidXRlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZWQgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VHlwZWRBcnJheX0gYXJyYXkgLSBUaGUgYXJyYXkgaG9sZGluZyB0aGUgYXR0cmlidXRlIGRhdGEuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGl0ZW1TaXplIC0gVGhlIGl0ZW0gc2l6ZS5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtub3JtYWxpemVkPWZhbHNlXSAtIFdoZXRoZXIgdGhlIGRhdGEgYXJlIG5vcm1hbGl6ZWQgb3Igbm90LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbWVzaFBlckF0dHJpYnV0ZT0xXSAtIEhvdyBvZnRlbiBhIHZhbHVlIG9mIHRoaXMgYnVmZmVyIGF0dHJpYnV0ZSBzaG91bGQgYmUgcmVwZWF0ZWQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCwgbWVzaFBlckF0dHJpYnV0ZSA9IDEgKSB7XHJcblxyXG5cdFx0c3VwZXIoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIGhvdyBvZnRlbiBhIHZhbHVlIG9mIHRoaXMgYnVmZmVyIGF0dHJpYnV0ZSBzaG91bGQgYmUgcmVwZWF0ZWQuIEFcclxuXHRcdCAqIHZhbHVlIG9mIG9uZSBtZWFucyB0aGF0IGVhY2ggdmFsdWUgb2YgdGhlIGluc3RhbmNlZCBhdHRyaWJ1dGUgaXMgdXNlZCBmb3JcclxuXHRcdCAqIGEgc2luZ2xlIGluc3RhbmNlLiBBIHZhbHVlIG9mIHR3byBtZWFucyB0aGF0IGVhY2ggdmFsdWUgaXMgdXNlZCBmb3IgdHdvXHJcblx0XHQgKiBjb25zZWN1dGl2ZSBpbnN0YW5jZXMgKGFuZCBzbyBvbikuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tZXNoUGVyQXR0cmlidXRlID0gbWVzaFBlckF0dHJpYnV0ZTtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy5tZXNoUGVyQXR0cmlidXRlID0gc291cmNlLm1lc2hQZXJBdHRyaWJ1dGU7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0dG9KU09OKCkge1xyXG5cclxuXHRcdGNvbnN0IGRhdGEgPSBzdXBlci50b0pTT04oKTtcclxuXHJcblx0XHRkYXRhLm1lc2hQZXJBdHRyaWJ1dGUgPSB0aGlzLm1lc2hQZXJBdHRyaWJ1dGU7XHJcblxyXG5cdFx0ZGF0YS5pc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSA9IHRydWU7XHJcblxyXG5cdFx0cmV0dXJuIGRhdGE7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IEluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSB9O1xyXG4iLCJpbXBvcnQgeyBJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcbmltcG9ydCB7IE1lc2ggfSBmcm9tICcuL01lc2guanMnO1xyXG5pbXBvcnQgeyBCb3gzIH0gZnJvbSAnLi4vbWF0aC9Cb3gzLmpzJztcclxuaW1wb3J0IHsgTWF0cml4NCB9IGZyb20gJy4uL21hdGgvTWF0cml4NC5qcyc7XHJcbmltcG9ydCB7IFNwaGVyZSB9IGZyb20gJy4uL21hdGgvU3BoZXJlLmpzJztcclxuaW1wb3J0IHsgRGF0YVRleHR1cmUgfSBmcm9tICcuLi90ZXh0dXJlcy9EYXRhVGV4dHVyZS5qcyc7XHJcbmltcG9ydCB7IEZsb2F0VHlwZSwgUmVkRm9ybWF0IH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcclxuXHJcbmNvbnN0IF9pbnN0YW5jZUxvY2FsTWF0cml4ID0gLypAX19QVVJFX18qLyBuZXcgTWF0cml4NCgpO1xyXG5jb25zdCBfaW5zdGFuY2VXb3JsZE1hdHJpeCA9IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDQoKTtcclxuXHJcbmNvbnN0IF9pbnN0YW5jZUludGVyc2VjdHMgPSBbXTtcclxuXHJcbmNvbnN0IF9ib3gzID0gLypAX19QVVJFX18qLyBuZXcgQm94MygpO1xyXG5jb25zdCBfaWRlbnRpdHkgPSAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXg0KCk7XHJcbmNvbnN0IF9tZXNoID0gLypAX19QVVJFX18qLyBuZXcgTWVzaCgpO1xyXG5jb25zdCBfc3BoZXJlID0gLypAX19QVVJFX18qLyBuZXcgU3BoZXJlKCk7XHJcblxyXG4vKipcclxuICogQSBzcGVjaWFsIHZlcnNpb24gb2YgYSBtZXNoIHdpdGggaW5zdGFuY2VkIHJlbmRlcmluZyBzdXBwb3J0LiBVc2VcclxuICogdGhpcyBjbGFzcyBpZiB5b3UgaGF2ZSB0byByZW5kZXIgYSBsYXJnZSBudW1iZXIgb2Ygb2JqZWN0cyB3aXRoIHRoZSBzYW1lXHJcbiAqIGdlb21ldHJ5IGFuZCBtYXRlcmlhbChzKSBidXQgd2l0aCBkaWZmZXJlbnQgd29ybGQgdHJhbnNmb3JtYXRpb25zLiBUaGUgdXNhZ2VcclxuICogb2YgJ0luc3RhbmNlZE1lc2gnIHdpbGwgaGVscCB5b3UgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgZHJhdyBjYWxscyBhbmQgdGh1c1xyXG4gKiBpbXByb3ZlIHRoZSBvdmVyYWxsIHJlbmRlcmluZyBwZXJmb3JtYW5jZSBpbiB5b3VyIGFwcGxpY2F0aW9uLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTWVzaFxyXG4gKi9cclxuY2xhc3MgSW5zdGFuY2VkTWVzaCBleHRlbmRzIE1lc2gge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlZCBtZXNoLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCdWZmZXJHZW9tZXRyeX0gW2dlb21ldHJ5XSAtIFRoZSBtZXNoIGdlb21ldHJ5LlxyXG5cdCAqIEBwYXJhbSB7TWF0ZXJpYWx8QXJyYXk8TWF0ZXJpYWw+fSBbbWF0ZXJpYWxdIC0gVGhlIG1lc2ggbWF0ZXJpYWwuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGNvdW50IC0gVGhlIG51bWJlciBvZiBpbnN0YW5jZXMuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGdlb21ldHJ5LCBtYXRlcmlhbCwgY291bnQgKSB7XHJcblxyXG5cdFx0c3VwZXIoIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0luc3RhbmNlZE1lc2ggPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVwcmVzZW50cyB0aGUgbG9jYWwgdHJhbnNmb3JtYXRpb24gb2YgYWxsIGluc3RhbmNlcy4gWW91IGhhdmUgdG8gc2V0IGl0c1xyXG5cdFx0ICoge0BsaW5rIEJ1ZmZlckF0dHJpYnV0ZSNuZWVkc1VwZGF0ZX0gZmxhZyB0byB0cnVlIGlmIHlvdSBtb2RpZnkgaW5zdGFuY2VkIGRhdGFcclxuXHRcdCAqIHZpYSB7QGxpbmsgSW5zdGFuY2VkTWVzaCNzZXRNYXRyaXhBdH0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pbnN0YW5jZU1hdHJpeCA9IG5ldyBJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUoIG5ldyBGbG9hdDMyQXJyYXkoIGNvdW50ICogMTYgKSwgMTYgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlcHJlc2VudHMgdGhlIGNvbG9yIG9mIGFsbCBpbnN0YW5jZXMuIFlvdSBoYXZlIHRvIHNldCBpdHNcclxuXHRcdCAqIHtAbGluayBCdWZmZXJBdHRyaWJ1dGUjbmVlZHNVcGRhdGV9IGZsYWcgdG8gdHJ1ZSBpZiB5b3UgbW9kaWZ5IGluc3RhbmNlZCBkYXRhXHJcblx0XHQgKiB2aWEge0BsaW5rIEluc3RhbmNlZE1lc2gjc2V0Q29sb3JBdH0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9JbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaW5zdGFuY2VDb2xvciA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXByZXNlbnRzIHRoZSBtb3JwaCB0YXJnZXQgd2VpZ2h0cyBvZiBhbGwgaW5zdGFuY2VzLiBZb3UgaGF2ZSB0byBzZXQgaXRzXHJcblx0XHQgKiB7QGxpbmsgVGV4dHVyZSNuZWVkc1VwZGF0ZX0gZmxhZyB0byB0cnVlIGlmIHlvdSBtb2RpZnkgaW5zdGFuY2VkIGRhdGFcclxuXHRcdCAqIHZpYSB7QGxpbmsgSW5zdGFuY2VkTWVzaCNzZXRNb3JwaEF0fS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P0RhdGFUZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1vcnBoVGV4dHVyZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbnVtYmVyIG9mIGluc3RhbmNlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvdW50ID0gY291bnQ7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYm91bmRpbmcgYm94IG9mIHRoZSBpbnN0YW5jZWQgbWVzaC4gQ2FuIGJlIGNvbXB1dGVkIHZpYSB7QGxpbmsgSW5zdGFuY2VkTWVzaCNjb21wdXRlQm91bmRpbmdCb3h9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Qm94M31cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ib3VuZGluZ0JveCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYm91bmRpbmcgc3BoZXJlIG9mIHRoZSBpbnN0YW5jZWQgbWVzaC4gQ2FuIGJlIGNvbXB1dGVkIHZpYSB7QGxpbmsgSW5zdGFuY2VkTWVzaCNjb21wdXRlQm91bmRpbmdTcGhlcmV9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/U3BoZXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gbnVsbDtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSArKyApIHtcclxuXHJcblx0XHRcdHRoaXMuc2V0TWF0cml4QXQoIGksIF9pZGVudGl0eSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB0aGUgYm91bmRpbmcgYm94IG9mIHRoZSBpbnN0YW5jZWQgbWVzaCwgYW5kIHVwZGF0ZXMge0BsaW5rIEluc3RhbmNlZE1lc2gjYm91bmRpbmdCb3h9LlxyXG5cdCAqIFRoZSBib3VuZGluZyBib3ggaXMgbm90IGF1dG9tYXRpY2FsbHkgY29tcHV0ZWQgYnkgdGhlIGVuZ2luZTsgdGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgYnkgeW91ciBhcHAuXHJcblx0ICogWW91IG1heSBuZWVkIHRvIHJlY29tcHV0ZSB0aGUgYm91bmRpbmcgYm94IGlmIGFuIGluc3RhbmNlIGlzIHRyYW5zZm9ybWVkIHZpYSB7QGxpbmsgSW5zdGFuY2VkTWVzaCNzZXRNYXRyaXhBdH0uXHJcblx0ICovXHJcblx0Y29tcHV0ZUJvdW5kaW5nQm94KCkge1xyXG5cclxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcclxuXHRcdGNvbnN0IGNvdW50ID0gdGhpcy5jb3VudDtcclxuXHJcblx0XHRpZiAoIHRoaXMuYm91bmRpbmdCb3ggPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmJvdW5kaW5nQm94ID0gbmV3IEJveDMoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ0JveCA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ0JveCgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmJvdW5kaW5nQm94Lm1ha2VFbXB0eSgpO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGNvdW50OyBpICsrICkge1xyXG5cclxuXHRcdFx0dGhpcy5nZXRNYXRyaXhBdCggaSwgX2luc3RhbmNlTG9jYWxNYXRyaXggKTtcclxuXHJcblx0XHRcdF9ib3gzLmNvcHkoIGdlb21ldHJ5LmJvdW5kaW5nQm94ICkuYXBwbHlNYXRyaXg0KCBfaW5zdGFuY2VMb2NhbE1hdHJpeCApO1xyXG5cclxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveC51bmlvbiggX2JveDMgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgdGhlIGJvdW5kaW5nIHNwaGVyZSBvZiB0aGUgaW5zdGFuY2VkIG1lc2gsIGFuZCB1cGRhdGVzIHtAbGluayBJbnN0YW5jZWRNZXNoI2JvdW5kaW5nU3BoZXJlfVxyXG5cdCAqIFRoZSBlbmdpbmUgYXV0b21hdGljYWxseSBjb21wdXRlcyB0aGUgYm91bmRpbmcgc3BoZXJlIHdoZW4gaXQgaXMgbmVlZGVkLCBlLmcuLCBmb3IgcmF5IGNhc3Rpbmcgb3IgdmlldyBmcnVzdHVtIGN1bGxpbmcuXHJcblx0ICogWW91IG1heSBuZWVkIHRvIHJlY29tcHV0ZSB0aGUgYm91bmRpbmcgc3BoZXJlIGlmIGFuIGluc3RhbmNlIGlzIHRyYW5zZm9ybWVkIHZpYSB7QGxpbmsgSW5zdGFuY2VkTWVzaCNzZXRNYXRyaXhBdH0uXHJcblx0ICovXHJcblx0Y29tcHV0ZUJvdW5kaW5nU3BoZXJlKCkge1xyXG5cclxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcclxuXHRcdGNvbnN0IGNvdW50ID0gdGhpcy5jb3VudDtcclxuXHJcblx0XHRpZiAoIHRoaXMuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gbmV3IFNwaGVyZSgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0Z2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuYm91bmRpbmdTcGhlcmUubWFrZUVtcHR5KCk7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgY291bnQ7IGkgKysgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmdldE1hdHJpeEF0KCBpLCBfaW5zdGFuY2VMb2NhbE1hdHJpeCApO1xyXG5cclxuXHRcdFx0X3NwaGVyZS5jb3B5KCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSApLmFwcGx5TWF0cml4NCggX2luc3RhbmNlTG9jYWxNYXRyaXggKTtcclxuXHJcblx0XHRcdHRoaXMuYm91bmRpbmdTcGhlcmUudW5pb24oIF9zcGhlcmUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlLCByZWN1cnNpdmUgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlLCByZWN1cnNpdmUgKTtcclxuXHJcblx0XHR0aGlzLmluc3RhbmNlTWF0cml4LmNvcHkoIHNvdXJjZS5pbnN0YW5jZU1hdHJpeCApO1xyXG5cclxuXHRcdGlmICggc291cmNlLm1vcnBoVGV4dHVyZSAhPT0gbnVsbCApIHRoaXMubW9ycGhUZXh0dXJlID0gc291cmNlLm1vcnBoVGV4dHVyZS5jbG9uZSgpO1xyXG5cdFx0aWYgKCBzb3VyY2UuaW5zdGFuY2VDb2xvciAhPT0gbnVsbCApIHRoaXMuaW5zdGFuY2VDb2xvciA9IHNvdXJjZS5pbnN0YW5jZUNvbG9yLmNsb25lKCk7XHJcblxyXG5cdFx0dGhpcy5jb3VudCA9IHNvdXJjZS5jb3VudDtcclxuXHJcblx0XHRpZiAoIHNvdXJjZS5ib3VuZGluZ0JveCAhPT0gbnVsbCApIHRoaXMuYm91bmRpbmdCb3ggPSBzb3VyY2UuYm91bmRpbmdCb3guY2xvbmUoKTtcclxuXHRcdGlmICggc291cmNlLmJvdW5kaW5nU3BoZXJlICE9PSBudWxsICkgdGhpcy5ib3VuZGluZ1NwaGVyZSA9IHNvdXJjZS5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdldHMgdGhlIGNvbG9yIG9mIHRoZSBkZWZpbmVkIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluc3RhbmNlIGluZGV4LlxyXG5cdCAqIEBwYXJhbSB7Q29sb3J9IGNvbG9yIC0gVGhlIHRhcmdldCBvYmplY3QgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBtZXRob2QncyByZXN1bHQuXHJcblx0ICovXHJcblx0Z2V0Q29sb3JBdCggaW5kZXgsIGNvbG9yICkge1xyXG5cclxuXHRcdGNvbG9yLmZyb21BcnJheSggdGhpcy5pbnN0YW5jZUNvbG9yLmFycmF5LCBpbmRleCAqIDMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZXRzIHRoZSBsb2NhbCB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggb2YgdGhlIGRlZmluZWQgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5zdGFuY2UgaW5kZXguXHJcblx0ICogQHBhcmFtIHtNYXRyaXg0fSBtYXRyaXggLSBUaGUgdGFyZ2V0IG9iamVjdCB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGhvZCdzIHJlc3VsdC5cclxuXHQgKi9cclxuXHRnZXRNYXRyaXhBdCggaW5kZXgsIG1hdHJpeCApIHtcclxuXHJcblx0XHRtYXRyaXguZnJvbUFycmF5KCB0aGlzLmluc3RhbmNlTWF0cml4LmFycmF5LCBpbmRleCAqIDE2ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2V0cyB0aGUgbW9ycGggdGFyZ2V0IHdlaWdodHMgb2YgdGhlIGRlZmluZWQgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5zdGFuY2UgaW5kZXguXHJcblx0ICogQHBhcmFtIHtNZXNofSBvYmplY3QgLSBUaGUgdGFyZ2V0IG9iamVjdCB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGhvZCdzIHJlc3VsdC5cclxuXHQgKi9cclxuXHRnZXRNb3JwaEF0KCBpbmRleCwgb2JqZWN0ICkge1xyXG5cclxuXHRcdGNvbnN0IG9iamVjdEluZmx1ZW5jZXMgPSBvYmplY3QubW9ycGhUYXJnZXRJbmZsdWVuY2VzO1xyXG5cclxuXHRcdGNvbnN0IGFycmF5ID0gdGhpcy5tb3JwaFRleHR1cmUuc291cmNlLmRhdGEuZGF0YTtcclxuXHJcblx0XHRjb25zdCBsZW4gPSBvYmplY3RJbmZsdWVuY2VzLmxlbmd0aCArIDE7IC8vIEFsbCBpbmZsdWVuY2VzICsgdGhlIGJhc2VJbmZsdWVuY2VTdW1cclxuXHJcblx0XHRjb25zdCBkYXRhSW5kZXggPSBpbmRleCAqIGxlbiArIDE7IC8vIFNraXAgdGhlIGJhc2VJbmZsdWVuY2VTdW0gYXQgdGhlIGJlZ2lubmluZ1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IG9iamVjdEluZmx1ZW5jZXMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0b2JqZWN0SW5mbHVlbmNlc1sgaSBdID0gYXJyYXlbIGRhdGFJbmRleCArIGkgXTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0cmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICkge1xyXG5cclxuXHRcdGNvbnN0IG1hdHJpeFdvcmxkID0gdGhpcy5tYXRyaXhXb3JsZDtcclxuXHRcdGNvbnN0IHJheWNhc3RUaW1lcyA9IHRoaXMuY291bnQ7XHJcblxyXG5cdFx0X21lc2guZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xyXG5cdFx0X21lc2gubWF0ZXJpYWwgPSB0aGlzLm1hdGVyaWFsO1xyXG5cclxuXHRcdGlmICggX21lc2gubWF0ZXJpYWwgPT09IHVuZGVmaW5lZCApIHJldHVybjtcclxuXHJcblx0XHQvLyB0ZXN0IHdpdGggYm91bmRpbmcgc3BoZXJlIGZpcnN0XHJcblxyXG5cdFx0aWYgKCB0aGlzLmJvdW5kaW5nU3BoZXJlID09PSBudWxsICkgdGhpcy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcclxuXHJcblx0XHRfc3BoZXJlLmNvcHkoIHRoaXMuYm91bmRpbmdTcGhlcmUgKTtcclxuXHRcdF9zcGhlcmUuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApO1xyXG5cclxuXHRcdGlmICggcmF5Y2FzdGVyLnJheS5pbnRlcnNlY3RzU3BoZXJlKCBfc3BoZXJlICkgPT09IGZhbHNlICkgcmV0dXJuO1xyXG5cclxuXHRcdC8vIG5vdyB0ZXN0IGVhY2ggaW5zdGFuY2VcclxuXHJcblx0XHRmb3IgKCBsZXQgaW5zdGFuY2VJZCA9IDA7IGluc3RhbmNlSWQgPCByYXljYXN0VGltZXM7IGluc3RhbmNlSWQgKysgKSB7XHJcblxyXG5cdFx0XHQvLyBjYWxjdWxhdGUgdGhlIHdvcmxkIG1hdHJpeCBmb3IgZWFjaCBpbnN0YW5jZVxyXG5cclxuXHRcdFx0dGhpcy5nZXRNYXRyaXhBdCggaW5zdGFuY2VJZCwgX2luc3RhbmNlTG9jYWxNYXRyaXggKTtcclxuXHJcblx0XHRcdF9pbnN0YW5jZVdvcmxkTWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIG1hdHJpeFdvcmxkLCBfaW5zdGFuY2VMb2NhbE1hdHJpeCApO1xyXG5cclxuXHRcdFx0Ly8gdGhlIG1lc2ggcmVwcmVzZW50cyB0aGlzIHNpbmdsZSBpbnN0YW5jZVxyXG5cclxuXHRcdFx0X21lc2gubWF0cml4V29ybGQgPSBfaW5zdGFuY2VXb3JsZE1hdHJpeDtcclxuXHJcblx0XHRcdF9tZXNoLnJheWNhc3QoIHJheWNhc3RlciwgX2luc3RhbmNlSW50ZXJzZWN0cyApO1xyXG5cclxuXHRcdFx0Ly8gcHJvY2VzcyB0aGUgcmVzdWx0IG9mIHJheWNhc3RcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IF9pbnN0YW5jZUludGVyc2VjdHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgaW50ZXJzZWN0ID0gX2luc3RhbmNlSW50ZXJzZWN0c1sgaSBdO1xyXG5cdFx0XHRcdGludGVyc2VjdC5pbnN0YW5jZUlkID0gaW5zdGFuY2VJZDtcclxuXHRcdFx0XHRpbnRlcnNlY3Qub2JqZWN0ID0gdGhpcztcclxuXHRcdFx0XHRpbnRlcnNlY3RzLnB1c2goIGludGVyc2VjdCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0X2luc3RhbmNlSW50ZXJzZWN0cy5sZW5ndGggPSAwO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBnaXZlbiBjb2xvciB0byB0aGUgZGVmaW5lZCBpbnN0YW5jZS4gTWFrZSBzdXJlIHlvdSBzZXQgdGhlIGBuZWVkc1VwZGF0ZWAgZmxhZyBvZlxyXG5cdCAqIHtAbGluayBJbnN0YW5jZWRNZXNoI2luc3RhbmNlQ29sb3J9IHRvIGB0cnVlYCBhZnRlciB1cGRhdGluZyBhbGwgdGhlIGNvbG9ycy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbnN0YW5jZSBpbmRleC5cclxuXHQgKiBAcGFyYW0ge0NvbG9yfSBjb2xvciAtIFRoZSBpbnN0YW5jZSBjb2xvci5cclxuXHQgKi9cclxuXHRzZXRDb2xvckF0KCBpbmRleCwgY29sb3IgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmluc3RhbmNlQ29sb3IgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmluc3RhbmNlQ29sb3IgPSBuZXcgSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlKCBuZXcgRmxvYXQzMkFycmF5KCB0aGlzLmluc3RhbmNlTWF0cml4LmNvdW50ICogMyApLmZpbGwoIDEgKSwgMyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb2xvci50b0FycmF5KCB0aGlzLmluc3RhbmNlQ29sb3IuYXJyYXksIGluZGV4ICogMyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGdpdmVuIGxvY2FsIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCB0byB0aGUgZGVmaW5lZCBpbnN0YW5jZS4gTWFrZSBzdXJlIHlvdSBzZXQgdGhlIGBuZWVkc1VwZGF0ZWAgZmxhZyBvZlxyXG5cdCAqIHtAbGluayBJbnN0YW5jZWRNZXNoI2luc3RhbmNlTWF0cml4fSB0byBgdHJ1ZWAgYWZ0ZXIgdXBkYXRpbmcgYWxsIHRoZSBjb2xvcnMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5zdGFuY2UgaW5kZXguXHJcblx0ICogQHBhcmFtIHtNYXRyaXg0fSBtYXRyaXggLSBUaGUgbG9jYWwgdHJhbnNmb3JtYXRpb24uXHJcblx0ICovXHJcblx0c2V0TWF0cml4QXQoIGluZGV4LCBtYXRyaXggKSB7XHJcblxyXG5cdFx0bWF0cml4LnRvQXJyYXkoIHRoaXMuaW5zdGFuY2VNYXRyaXguYXJyYXksIGluZGV4ICogMTYgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBtb3JwaCB0YXJnZXQgd2VpZ2h0cyB0byB0aGUgZGVmaW5lZCBpbnN0YW5jZS4gTWFrZSBzdXJlIHlvdSBzZXQgdGhlIGBuZWVkc1VwZGF0ZWAgZmxhZyBvZlxyXG5cdCAqIHtAbGluayBJbnN0YW5jZWRNZXNoI21vcnBoVGV4dHVyZX0gdG8gYHRydWVgIGFmdGVyIHVwZGF0aW5nIGFsbCB0aGUgaW5mbHVlbmNlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbnN0YW5jZSBpbmRleC5cclxuXHQgKiBAcGFyYW0ge01lc2h9IG9iamVjdCAtICBBIG1lc2ggd2hpY2ggYG1vcnBoVGFyZ2V0SW5mbHVlbmNlc2AgcHJvcGVydHkgY29udGFpbmluZyB0aGUgbW9ycGggdGFyZ2V0IHdlaWdodHNcclxuXHQgKiBvZiBhIHNpbmdsZSBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXRNb3JwaEF0KCBpbmRleCwgb2JqZWN0ICkge1xyXG5cclxuXHRcdGNvbnN0IG9iamVjdEluZmx1ZW5jZXMgPSBvYmplY3QubW9ycGhUYXJnZXRJbmZsdWVuY2VzO1xyXG5cclxuXHRcdGNvbnN0IGxlbiA9IG9iamVjdEluZmx1ZW5jZXMubGVuZ3RoICsgMTsgLy8gbW9ycGhCYXNlSW5mbHVlbmNlICsgYWxsIGluZmx1ZW5jZXNcclxuXHJcblx0XHRpZiAoIHRoaXMubW9ycGhUZXh0dXJlID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5tb3JwaFRleHR1cmUgPSBuZXcgRGF0YVRleHR1cmUoIG5ldyBGbG9hdDMyQXJyYXkoIGxlbiAqIHRoaXMuY291bnQgKSwgbGVuLCB0aGlzLmNvdW50LCBSZWRGb3JtYXQsIEZsb2F0VHlwZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBhcnJheSA9IHRoaXMubW9ycGhUZXh0dXJlLnNvdXJjZS5kYXRhLmRhdGE7XHJcblxyXG5cdFx0bGV0IG1vcnBoSW5mbHVlbmNlc1N1bSA9IDA7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgb2JqZWN0SW5mbHVlbmNlcy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRtb3JwaEluZmx1ZW5jZXNTdW0gKz0gb2JqZWN0SW5mbHVlbmNlc1sgaSBdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBtb3JwaEJhc2VJbmZsdWVuY2UgPSB0aGlzLmdlb21ldHJ5Lm1vcnBoVGFyZ2V0c1JlbGF0aXZlID8gMSA6IDEgLSBtb3JwaEluZmx1ZW5jZXNTdW07XHJcblxyXG5cdFx0Y29uc3QgZGF0YUluZGV4ID0gbGVuICogaW5kZXg7XHJcblxyXG5cdFx0YXJyYXlbIGRhdGFJbmRleCBdID0gbW9ycGhCYXNlSW5mbHVlbmNlO1xyXG5cclxuXHRcdGFycmF5LnNldCggb2JqZWN0SW5mbHVlbmNlcywgZGF0YUluZGV4ICsgMSApO1xyXG5cclxuXHR9XHJcblxyXG5cdHVwZGF0ZU1vcnBoVGFyZ2V0cygpIHtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGcmVlcyB0aGUgR1BVLXJlbGF0ZWQgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGlzIGluc3RhbmNlLiBDYWxsIHRoaXNcclxuXHQgKiBtZXRob2Qgd2hlbmV2ZXIgdGhpcyBpbnN0YW5jZSBpcyBubyBsb25nZXIgdXNlZCBpbiB5b3VyIGFwcC5cclxuXHQgKi9cclxuXHRkaXNwb3NlKCkge1xyXG5cclxuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnZGlzcG9zZScgfSApO1xyXG5cclxuXHRcdGlmICggdGhpcy5tb3JwaFRleHR1cmUgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLm1vcnBoVGV4dHVyZS5kaXNwb3NlKCk7XHJcblx0XHRcdHRoaXMubW9ycGhUZXh0dXJlID0gbnVsbDtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IEluc3RhbmNlZE1lc2ggfTtcclxuIiwiaW1wb3J0IHsgTWF0cml4MyB9IGZyb20gJy4vTWF0cml4My5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuL1ZlY3RvcjMuanMnO1xyXG5cclxuY29uc3QgX3ZlY3RvcjEgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF92ZWN0b3IyID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfbm9ybWFsTWF0cml4ID0gLypAX19QVVJFX18qLyBuZXcgTWF0cml4MygpO1xyXG5cclxuLyoqXHJcbiAqIEEgdHdvIGRpbWVuc2lvbmFsIHN1cmZhY2UgdGhhdCBleHRlbmRzIGluZmluaXRlbHkgaW4gM0Qgc3BhY2UsIHJlcHJlc2VudGVkXHJcbiAqIGluIFtIZXNzaWFuIG5vcm1hbCBmb3JtXXtAbGluayBodHRwOi8vbWF0aHdvcmxkLndvbGZyYW0uY29tL0hlc3NpYW5Ob3JtYWxGb3JtLmh0bWx9XHJcbiAqIGJ5IGEgdW5pdCBsZW5ndGggbm9ybWFsIHZlY3RvciBhbmQgYSBjb25zdGFudC5cclxuICovXHJcbmNsYXNzIFBsYW5lIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBwbGFuZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gW25vcm1hbD0oMSwwLDApXSAtIEEgdW5pdCBsZW5ndGggdmVjdG9yIGRlZmluaW5nIHRoZSBub3JtYWwgb2YgdGhlIHBsYW5lLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbY29uc3RhbnQ9MF0gLSBUaGUgc2lnbmVkIGRpc3RhbmNlIGZyb20gdGhlIG9yaWdpbiB0byB0aGUgcGxhbmUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5vcm1hbCA9IG5ldyBWZWN0b3IzKCAxLCAwLCAwICksIGNvbnN0YW50ID0gMCApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNQbGFuZSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHVuaXQgbGVuZ3RoIHZlY3RvciBkZWZpbmluZyB0aGUgbm9ybWFsIG9mIHRoZSBwbGFuZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yM31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub3JtYWwgPSBub3JtYWw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc2lnbmVkIGRpc3RhbmNlIGZyb20gdGhlIG9yaWdpbiB0byB0aGUgcGxhbmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb25zdGFudCA9IGNvbnN0YW50O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHBsYW5lIGNvbXBvbmVudHMgYnkgY29weWluZyB0aGUgZ2l2ZW4gdmFsdWVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBub3JtYWwgLSBUaGUgbm9ybWFsLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBjb25zdGFudCAtIFRoZSBjb25zdGFudC5cclxuXHQgKiBAcmV0dXJuIHtQbGFuZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBwbGFuZS5cclxuXHQgKi9cclxuXHRzZXQoIG5vcm1hbCwgY29uc3RhbnQgKSB7XHJcblxyXG5cdFx0dGhpcy5ub3JtYWwuY29weSggbm9ybWFsICk7XHJcblx0XHR0aGlzLmNvbnN0YW50ID0gY29uc3RhbnQ7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgcGxhbmUgY29tcG9uZW50cyBieSBkZWZpbmluZyBgeGAsIGB5YCwgYHpgIGFzIHRoZVxyXG5cdCAqIHBsYW5lIG5vcm1hbCBhbmQgYHdgIGFzIHRoZSBjb25zdGFudC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHZhbHVlIGZvciB0aGUgbm9ybWFsJ3MgeCBjb21wb25lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmFsdWUgZm9yIHRoZSBub3JtYWwncyB5IGNvbXBvbmVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geiAtIFRoZSB2YWx1ZSBmb3IgdGhlIG5vcm1hbCdzIHogY29tcG9uZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB3IC0gVGhlIGNvbnN0YW50IHZhbHVlLlxyXG5cdCAqIEByZXR1cm4ge1BsYW5lfSBBIHJlZmVyZW5jZSB0byB0aGlzIHBsYW5lLlxyXG5cdCAqL1xyXG5cdHNldENvbXBvbmVudHMoIHgsIHksIHosIHcgKSB7XHJcblxyXG5cdFx0dGhpcy5ub3JtYWwuc2V0KCB4LCB5LCB6ICk7XHJcblx0XHR0aGlzLmNvbnN0YW50ID0gdztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBwbGFuZSBmcm9tIHRoZSBnaXZlbiBub3JtYWwgYW5kIGNvcGxhbmFyIHBvaW50ICh0aGF0IGlzIGEgcG9pbnRcclxuXHQgKiB0aGF0IGxpZXMgb250byB0aGUgcGxhbmUpLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBub3JtYWwgLSBUaGUgbm9ybWFsLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gcG9pbnQgLSBBIGNvcGxhbmFyIHBvaW50LlxyXG5cdCAqIEByZXR1cm4ge1BsYW5lfSBBIHJlZmVyZW5jZSB0byB0aGlzIHBsYW5lLlxyXG5cdCAqL1xyXG5cdHNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50KCBub3JtYWwsIHBvaW50ICkge1xyXG5cclxuXHRcdHRoaXMubm9ybWFsLmNvcHkoIG5vcm1hbCApO1xyXG5cdFx0dGhpcy5jb25zdGFudCA9IC0gcG9pbnQuZG90KCB0aGlzLm5vcm1hbCApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHBsYW5lIGZyb20gdGhyZWUgY29wbGFuYXIgcG9pbnRzLiBUaGUgd2luZGluZyBvcmRlciBpc1xyXG5cdCAqIGFzc3VtZWQgdG8gYmUgY291bnRlci1jbG9ja3dpc2UsIGFuZCBkZXRlcm1pbmVzIHRoZSBkaXJlY3Rpb24gb2ZcclxuXHQgKiB0aGUgcGxhbmUgbm9ybWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBhIC0gVGhlIGZpcnN0IGNvcGxhbmFyIHBvaW50LlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gYiAtIFRoZSBzZWNvbmQgY29wbGFuYXIgcG9pbnQuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBjIC0gVGhlIHRoaXJkIGNvcGxhbmFyIHBvaW50LlxyXG5cdCAqIEByZXR1cm4ge1BsYW5lfSBBIHJlZmVyZW5jZSB0byB0aGlzIHBsYW5lLlxyXG5cdCAqL1xyXG5cdHNldEZyb21Db3BsYW5hclBvaW50cyggYSwgYiwgYyApIHtcclxuXHJcblx0XHRjb25zdCBub3JtYWwgPSBfdmVjdG9yMS5zdWJWZWN0b3JzKCBjLCBiICkuY3Jvc3MoIF92ZWN0b3IyLnN1YlZlY3RvcnMoIGEsIGIgKSApLm5vcm1hbGl6ZSgpO1xyXG5cclxuXHRcdC8vIFE6IHNob3VsZCBhbiBlcnJvciBiZSB0aHJvd24gaWYgbm9ybWFsIGlzIHplcm8gKGUuZy4gZGVnZW5lcmF0ZSBwbGFuZSk/XHJcblxyXG5cdFx0dGhpcy5zZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQb2ludCggbm9ybWFsLCBhICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29waWVzIHRoZSB2YWx1ZXMgb2YgdGhlIGdpdmVuIHBsYW5lIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1BsYW5lfSBwbGFuZSAtIFRoZSBwbGFuZSB0byBjb3B5LlxyXG5cdCAqIEByZXR1cm4ge1BsYW5lfSBBIHJlZmVyZW5jZSB0byB0aGlzIHBsYW5lLlxyXG5cdCAqL1xyXG5cdGNvcHkoIHBsYW5lICkge1xyXG5cclxuXHRcdHRoaXMubm9ybWFsLmNvcHkoIHBsYW5lLm5vcm1hbCApO1xyXG5cdFx0dGhpcy5jb25zdGFudCA9IHBsYW5lLmNvbnN0YW50O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE5vcm1hbGl6ZXMgdGhlIHBsYW5lIG5vcm1hbCBhbmQgYWRqdXN0cyB0aGUgY29uc3RhbnQgYWNjb3JkaW5nbHkuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtQbGFuZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBwbGFuZS5cclxuXHQgKi9cclxuXHRub3JtYWxpemUoKSB7XHJcblxyXG5cdFx0Ly8gTm90ZTogd2lsbCBsZWFkIHRvIGEgZGl2aWRlIGJ5IHplcm8gaWYgdGhlIHBsYW5lIGlzIGludmFsaWQuXHJcblxyXG5cdFx0Y29uc3QgaW52ZXJzZU5vcm1hbExlbmd0aCA9IDEuMCAvIHRoaXMubm9ybWFsLmxlbmd0aCgpO1xyXG5cdFx0dGhpcy5ub3JtYWwubXVsdGlwbHlTY2FsYXIoIGludmVyc2VOb3JtYWxMZW5ndGggKTtcclxuXHRcdHRoaXMuY29uc3RhbnQgKj0gaW52ZXJzZU5vcm1hbExlbmd0aDtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBOZWdhdGVzIGJvdGggdGhlIHBsYW5lIG5vcm1hbCBhbmQgdGhlIGNvbnN0YW50LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7UGxhbmV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgcGxhbmUuXHJcblx0ICovXHJcblx0bmVnYXRlKCkge1xyXG5cclxuXHRcdHRoaXMuY29uc3RhbnQgKj0gLSAxO1xyXG5cdFx0dGhpcy5ub3JtYWwubmVnYXRlKCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgc2lnbmVkIGRpc3RhbmNlIGZyb20gdGhlIGdpdmVuIHBvaW50IHRvIHRoaXMgcGxhbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHBvaW50IC0gVGhlIHBvaW50IHRvIGNvbXB1dGUgdGhlIGRpc3RhbmNlIGZvci5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBzaWduZWQgZGlzdGFuY2UuXHJcblx0ICovXHJcblx0ZGlzdGFuY2VUb1BvaW50KCBwb2ludCApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5ub3JtYWwuZG90KCBwb2ludCApICsgdGhpcy5jb25zdGFudDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBzaWduZWQgZGlzdGFuY2UgZnJvbSB0aGUgZ2l2ZW4gc3BoZXJlIHRvIHRoaXMgcGxhbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1NwaGVyZX0gc3BoZXJlIC0gVGhlIHNwaGVyZSB0byBjb21wdXRlIHRoZSBkaXN0YW5jZSBmb3IuXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgc2lnbmVkIGRpc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGRpc3RhbmNlVG9TcGhlcmUoIHNwaGVyZSApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5kaXN0YW5jZVRvUG9pbnQoIHNwaGVyZS5jZW50ZXIgKSAtIHNwaGVyZS5yYWRpdXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUHJvamVjdHMgYSB0aGUgZ2l2ZW4gcG9pbnQgb250byB0aGUgcGxhbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHBvaW50IC0gVGhlIHBvaW50IHRvIHByb2plY3QuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IHZlY3RvciB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGhvZCdzIHJlc3VsdC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBUaGUgcHJvamVjdGVkIHBvaW50IG9uIHRoZSBwbGFuZS5cclxuXHQgKi9cclxuXHRwcm9qZWN0UG9pbnQoIHBvaW50LCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRhcmdldC5jb3B5KCBwb2ludCApLmFkZFNjYWxlZFZlY3RvciggdGhpcy5ub3JtYWwsIC0gdGhpcy5kaXN0YW5jZVRvUG9pbnQoIHBvaW50ICkgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBpbnRlcnNlY3Rpb24gcG9pbnQgb2YgdGhlIHBhc3NlZCBsaW5lIGFuZCB0aGUgcGxhbmUuIFJldHVybnNcclxuXHQgKiBgbnVsbGAgaWYgdGhlIGxpbmUgZG9lcyBub3QgaW50ZXJzZWN0LiBSZXR1cm5zIHRoZSBsaW5lJ3Mgc3RhcnRpbmcgcG9pbnQgaWZcclxuXHQgKiB0aGUgbGluZSBpcyBjb3BsYW5hciB3aXRoIHRoZSBwbGFuZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TGluZTN9IGxpbmUgLSBUaGUgbGluZSB0byBjb21wdXRlIHRoZSBpbnRlcnNlY3Rpb24gZm9yLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdGFyZ2V0IC0gVGhlIHRhcmdldCB2ZWN0b3IgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBtZXRob2QncyByZXN1bHQuXHJcblx0ICogQHJldHVybiB7P1ZlY3RvcjN9IFRoZSBpbnRlcnNlY3Rpb24gcG9pbnQuXHJcblx0ICovXHJcblx0aW50ZXJzZWN0TGluZSggbGluZSwgdGFyZ2V0ICkge1xyXG5cclxuXHRcdGNvbnN0IGRpcmVjdGlvbiA9IGxpbmUuZGVsdGEoIF92ZWN0b3IxICk7XHJcblxyXG5cdFx0Y29uc3QgZGVub21pbmF0b3IgPSB0aGlzLm5vcm1hbC5kb3QoIGRpcmVjdGlvbiApO1xyXG5cclxuXHRcdGlmICggZGVub21pbmF0b3IgPT09IDAgKSB7XHJcblxyXG5cdFx0XHQvLyBsaW5lIGlzIGNvcGxhbmFyLCByZXR1cm4gb3JpZ2luXHJcblx0XHRcdGlmICggdGhpcy5kaXN0YW5jZVRvUG9pbnQoIGxpbmUuc3RhcnQgKSA9PT0gMCApIHtcclxuXHJcblx0XHRcdFx0cmV0dXJuIHRhcmdldC5jb3B5KCBsaW5lLnN0YXJ0ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBVbnN1cmUgaWYgdGhpcyBpcyB0aGUgY29ycmVjdCBtZXRob2QgdG8gaGFuZGxlIHRoaXMgY2FzZS5cclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHQgPSAtICggbGluZS5zdGFydC5kb3QoIHRoaXMubm9ybWFsICkgKyB0aGlzLmNvbnN0YW50ICkgLyBkZW5vbWluYXRvcjtcclxuXHJcblx0XHRpZiAoIHQgPCAwIHx8IHQgPiAxICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0YXJnZXQuY29weSggbGluZS5zdGFydCApLmFkZFNjYWxlZFZlY3RvciggZGlyZWN0aW9uLCB0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIGxpbmUgc2VnbWVudCBpbnRlcnNlY3RzIHdpdGggKHBhc3NlcyB0aHJvdWdoKSB0aGUgcGxhbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0xpbmUzfSBsaW5lIC0gVGhlIGxpbmUgdG8gdGVzdC5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBnaXZlbiBsaW5lIHNlZ21lbnQgaW50ZXJzZWN0cyB3aXRoIHRoZSBwbGFuZSBvciBub3QuXHJcblx0ICovXHJcblx0aW50ZXJzZWN0c0xpbmUoIGxpbmUgKSB7XHJcblxyXG5cdFx0Ly8gTm90ZTogdGhpcyB0ZXN0cyBpZiBhIGxpbmUgaW50ZXJzZWN0cyB0aGUgcGxhbmUsIG5vdCB3aGV0aGVyIGl0IChvciBpdHMgZW5kLXBvaW50cykgYXJlIGNvcGxhbmFyIHdpdGggaXQuXHJcblxyXG5cdFx0Y29uc3Qgc3RhcnRTaWduID0gdGhpcy5kaXN0YW5jZVRvUG9pbnQoIGxpbmUuc3RhcnQgKTtcclxuXHRcdGNvbnN0IGVuZFNpZ24gPSB0aGlzLmRpc3RhbmNlVG9Qb2ludCggbGluZS5lbmQgKTtcclxuXHJcblx0XHRyZXR1cm4gKCBzdGFydFNpZ24gPCAwICYmIGVuZFNpZ24gPiAwICkgfHwgKCBlbmRTaWduIDwgMCAmJiBzdGFydFNpZ24gPiAwICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIGJvdW5kaW5nIGJveCBpbnRlcnNlY3RzIHdpdGggdGhlIHBsYW5lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCb3gzfSBib3ggLSBUaGUgYm91bmRpbmcgYm94IHRvIHRlc3QuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZ2l2ZW4gYm91bmRpbmcgYm94IGludGVyc2VjdHMgd2l0aCB0aGUgcGxhbmUgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGludGVyc2VjdHNCb3goIGJveCApIHtcclxuXHJcblx0XHRyZXR1cm4gYm94LmludGVyc2VjdHNQbGFuZSggdGhpcyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBnaXZlbiBib3VuZGluZyBzcGhlcmUgaW50ZXJzZWN0cyB3aXRoIHRoZSBwbGFuZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7U3BoZXJlfSBzcGhlcmUgLSBUaGUgYm91bmRpbmcgc3BoZXJlIHRvIHRlc3QuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZ2l2ZW4gYm91bmRpbmcgc3BoZXJlIGludGVyc2VjdHMgd2l0aCB0aGUgcGxhbmUgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGludGVyc2VjdHNTcGhlcmUoIHNwaGVyZSApIHtcclxuXHJcblx0XHRyZXR1cm4gc3BoZXJlLmludGVyc2VjdHNQbGFuZSggdGhpcyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBjb3BsYW5hciB2ZWN0b3IgdG8gdGhlIHBsYW5lLCBieSBjYWxjdWxhdGluZyB0aGVcclxuXHQgKiBwcm9qZWN0aW9uIG9mIHRoZSBub3JtYWwgYXQgdGhlIG9yaWdpbiBvbnRvIHRoZSBwbGFuZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdGFyZ2V0IC0gVGhlIHRhcmdldCB2ZWN0b3IgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBtZXRob2QncyByZXN1bHQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gVGhlIGNvcGxhbmFyIHBvaW50LlxyXG5cdCAqL1xyXG5cdGNvcGxhbmFyUG9pbnQoIHRhcmdldCApIHtcclxuXHJcblx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIHRoaXMubm9ybWFsICkubXVsdGlwbHlTY2FsYXIoIC0gdGhpcy5jb25zdGFudCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFwcGx5IGEgNHg0IG1hdHJpeCB0byB0aGUgcGxhbmUuIFRoZSBtYXRyaXggbXVzdCBiZSBhbiBhZmZpbmUsIGhvbW9nZW5lb3VzIHRyYW5zZm9ybS5cclxuXHQgKlxyXG5cdCAqIFRoZSBvcHRpb25hbCBub3JtYWwgbWF0cml4IGNhbiBiZSBwcmUtY29tcHV0ZWQgbGlrZSBzbzpcclxuXHQgKiBgYGBqc1xyXG5cdCAqIGNvbnN0IG9wdGlvbmFsTm9ybWFsTWF0cml4ID0gbmV3IFRIUkVFLk1hdHJpeDMoKS5nZXROb3JtYWxNYXRyaXgoIG1hdHJpeCApO1xyXG5cdCAqIGBgYFxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRyaXg0fSBtYXRyaXggLSBUaGUgdHJhbnNmb3JtYXRpb24gbWF0cml4LlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4NH0gW29wdGlvbmFsTm9ybWFsTWF0cml4XSAtIEEgcHJlLWNvbXB1dGVkIG5vcm1hbCBtYXRyaXguXHJcblx0ICogQHJldHVybiB7UGxhbmV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgcGxhbmUuXHJcblx0ICovXHJcblx0YXBwbHlNYXRyaXg0KCBtYXRyaXgsIG9wdGlvbmFsTm9ybWFsTWF0cml4ICkge1xyXG5cclxuXHRcdGNvbnN0IG5vcm1hbE1hdHJpeCA9IG9wdGlvbmFsTm9ybWFsTWF0cml4IHx8IF9ub3JtYWxNYXRyaXguZ2V0Tm9ybWFsTWF0cml4KCBtYXRyaXggKTtcclxuXHJcblx0XHRjb25zdCByZWZlcmVuY2VQb2ludCA9IHRoaXMuY29wbGFuYXJQb2ludCggX3ZlY3RvcjEgKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApO1xyXG5cclxuXHRcdGNvbnN0IG5vcm1hbCA9IHRoaXMubm9ybWFsLmFwcGx5TWF0cml4Myggbm9ybWFsTWF0cml4ICkubm9ybWFsaXplKCk7XHJcblxyXG5cdFx0dGhpcy5jb25zdGFudCA9IC0gcmVmZXJlbmNlUG9pbnQuZG90KCBub3JtYWwgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUcmFuc2xhdGVzIHRoZSBwbGFuZSBieSB0aGUgZGlzdGFuY2UgZGVmaW5lZCBieSB0aGUgZ2l2ZW4gb2Zmc2V0IHZlY3Rvci5cclxuXHQgKiBOb3RlIHRoYXQgdGhpcyBvbmx5IGFmZmVjdHMgdGhlIHBsYW5lIGNvbnN0YW50IGFuZCB3aWxsIG5vdCBhZmZlY3QgdGhlIG5vcm1hbCB2ZWN0b3IuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IG9mZnNldCAtIFRoZSBvZmZzZXQgdmVjdG9yLlxyXG5cdCAqIEByZXR1cm4ge1BsYW5lfSBBIHJlZmVyZW5jZSB0byB0aGlzIHBsYW5lLlxyXG5cdCAqL1xyXG5cdHRyYW5zbGF0ZSggb2Zmc2V0ICkge1xyXG5cclxuXHRcdHRoaXMuY29uc3RhbnQgLT0gb2Zmc2V0LmRvdCggdGhpcy5ub3JtYWwgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIHBsYW5lIGlzIGVxdWFsIHdpdGggdGhlIGdpdmVuIG9uZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UGxhbmV9IHBsYW5lIC0gVGhlIHBsYW5lIHRvIHRlc3QgZm9yIGVxdWFsaXR5LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyBwbGFuZSBpcyBlcXVhbCB3aXRoIHRoZSBnaXZlbiBvbmUuXHJcblx0ICovXHJcblx0ZXF1YWxzKCBwbGFuZSApIHtcclxuXHJcblx0XHRyZXR1cm4gcGxhbmUubm9ybWFsLmVxdWFscyggdGhpcy5ub3JtYWwgKSAmJiAoIHBsYW5lLmNvbnN0YW50ID09PSB0aGlzLmNvbnN0YW50ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIG5ldyBwbGFuZSB3aXRoIGNvcGllZCB2YWx1ZXMgZnJvbSB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7UGxhbmV9IEEgY2xvbmUgb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjbG9uZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFBsYW5lIH07XHJcbiIsImltcG9ydCB7IFdlYkdMQ29vcmRpbmF0ZVN5c3RlbSwgV2ViR1BVQ29vcmRpbmF0ZVN5c3RlbSB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBTcGhlcmUgfSBmcm9tICcuL1NwaGVyZS5qcyc7XHJcbmltcG9ydCB7IFBsYW5lIH0gZnJvbSAnLi9QbGFuZS5qcyc7XHJcblxyXG5jb25zdCBfc3BoZXJlID0gLypAX19QVVJFX18qLyBuZXcgU3BoZXJlKCk7XHJcbmNvbnN0IF92ZWN0b3IgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcblxyXG4vKipcclxuICogRnJ1c3R1bXMgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoYXQgaXMgaW5zaWRlIHRoZSBjYW1lcmEncyBmaWVsZCBvZiB2aWV3LlxyXG4gKiBUaGV5IGhlbHAgc3BlZWQgdXAgdGhlIHJlbmRlcmluZyBwcm9jZXNzIC0gb2JqZWN0cyB3aGljaCBsaWUgb3V0c2lkZSBhIGNhbWVyYSdzXHJcbiAqIGZydXN0dW0gY2FuIHNhZmVseSBiZSBleGNsdWRlZCBmcm9tIHJlbmRlcmluZy5cclxuICpcclxuICogVGhpcyBjbGFzcyBpcyBtYWlubHkgaW50ZW5kZWQgZm9yIHVzZSBpbnRlcm5hbGx5IGJ5IGEgcmVuZGVyZXIuXHJcbiAqL1xyXG5jbGFzcyBGcnVzdHVtIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBmcnVzdHVtLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtQbGFuZX0gW3AwXSAtIFRoZSBmaXJzdCBwbGFuZSB0aGF0IGVuY2xvc2VzIHRoZSBmcnVzdHVtLlxyXG5cdCAqIEBwYXJhbSB7UGxhbmV9IFtwMV0gLSBUaGUgc2Vjb25kIHBsYW5lIHRoYXQgZW5jbG9zZXMgdGhlIGZydXN0dW0uXHJcblx0ICogQHBhcmFtIHtQbGFuZX0gW3AyXSAtIFRoZSB0aGlyZCBwbGFuZSB0aGF0IGVuY2xvc2VzIHRoZSBmcnVzdHVtLlxyXG5cdCAqIEBwYXJhbSB7UGxhbmV9IFtwM10gLSBUaGUgZm91cnRoIHBsYW5lIHRoYXQgZW5jbG9zZXMgdGhlIGZydXN0dW0uXHJcblx0ICogQHBhcmFtIHtQbGFuZX0gW3A0XSAtIFRoZSBmaWZ0aCBwbGFuZSB0aGF0IGVuY2xvc2VzIHRoZSBmcnVzdHVtLlxyXG5cdCAqIEBwYXJhbSB7UGxhbmV9IFtwNV0gLSBUaGUgc2l4dGggcGxhbmUgdGhhdCBlbmNsb3NlcyB0aGUgZnJ1c3R1bS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcDAgPSBuZXcgUGxhbmUoKSwgcDEgPSBuZXcgUGxhbmUoKSwgcDIgPSBuZXcgUGxhbmUoKSwgcDMgPSBuZXcgUGxhbmUoKSwgcDQgPSBuZXcgUGxhbmUoKSwgcDUgPSBuZXcgUGxhbmUoKSApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgYXJyYXkgaG9sZHMgdGhlIHBsYW5lcyB0aGF0IGVuY2xvc2UgdGhlIGZydXN0dW0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PFBsYW5lPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wbGFuZXMgPSBbIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUgXTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBmcnVzdHVtIHBsYW5lcyBieSBjb3B5aW5nIHRoZSBnaXZlbiBwbGFuZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1BsYW5lfSBbcDBdIC0gVGhlIGZpcnN0IHBsYW5lIHRoYXQgZW5jbG9zZXMgdGhlIGZydXN0dW0uXHJcblx0ICogQHBhcmFtIHtQbGFuZX0gW3AxXSAtIFRoZSBzZWNvbmQgcGxhbmUgdGhhdCBlbmNsb3NlcyB0aGUgZnJ1c3R1bS5cclxuXHQgKiBAcGFyYW0ge1BsYW5lfSBbcDJdIC0gVGhlIHRoaXJkIHBsYW5lIHRoYXQgZW5jbG9zZXMgdGhlIGZydXN0dW0uXHJcblx0ICogQHBhcmFtIHtQbGFuZX0gW3AzXSAtIFRoZSBmb3VydGggcGxhbmUgdGhhdCBlbmNsb3NlcyB0aGUgZnJ1c3R1bS5cclxuXHQgKiBAcGFyYW0ge1BsYW5lfSBbcDRdIC0gVGhlIGZpZnRoIHBsYW5lIHRoYXQgZW5jbG9zZXMgdGhlIGZydXN0dW0uXHJcblx0ICogQHBhcmFtIHtQbGFuZX0gW3A1XSAtIFRoZSBzaXh0aCBwbGFuZSB0aGF0IGVuY2xvc2VzIHRoZSBmcnVzdHVtLlxyXG5cdCAqIEByZXR1cm4ge0ZydXN0dW19IEEgcmVmZXJlbmNlIHRvIHRoaXMgZnJ1c3R1bS5cclxuXHQgKi9cclxuXHRzZXQoIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUgKSB7XHJcblxyXG5cdFx0Y29uc3QgcGxhbmVzID0gdGhpcy5wbGFuZXM7XHJcblxyXG5cdFx0cGxhbmVzWyAwIF0uY29weSggcDAgKTtcclxuXHRcdHBsYW5lc1sgMSBdLmNvcHkoIHAxICk7XHJcblx0XHRwbGFuZXNbIDIgXS5jb3B5KCBwMiApO1xyXG5cdFx0cGxhbmVzWyAzIF0uY29weSggcDMgKTtcclxuXHRcdHBsYW5lc1sgNCBdLmNvcHkoIHA0ICk7XHJcblx0XHRwbGFuZXNbIDUgXS5jb3B5KCBwNSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvcGllcyB0aGUgdmFsdWVzIG9mIHRoZSBnaXZlbiBmcnVzdHVtIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0ZydXN0dW19IGZydXN0dW0gLSBUaGUgZnJ1c3R1bSB0byBjb3B5LlxyXG5cdCAqIEByZXR1cm4ge0ZydXN0dW19IEEgcmVmZXJlbmNlIHRvIHRoaXMgZnJ1c3R1bS5cclxuXHQgKi9cclxuXHRjb3B5KCBmcnVzdHVtICkge1xyXG5cclxuXHRcdGNvbnN0IHBsYW5lcyA9IHRoaXMucGxhbmVzO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDY7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRwbGFuZXNbIGkgXS5jb3B5KCBmcnVzdHVtLnBsYW5lc1sgaSBdICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGZydXN0dW0gcGxhbmVzIGZyb20gdGhlIGdpdmVuIHByb2plY3Rpb24gbWF0cml4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRyaXg0fSBtIC0gVGhlIHByb2plY3Rpb24gbWF0cml4LlxyXG5cdCAqIEBwYXJhbSB7KFdlYkdMQ29vcmRpbmF0ZVN5c3RlbXxXZWJHUFVDb29yZGluYXRlU3lzdGVtKX0gY29vcmRpbmF0ZVN5c3RlbSAtIFRoZSBjb29yZGluYXRlIHN5c3RlbS5cclxuXHQgKiBAcmV0dXJuIHtGcnVzdHVtfSBBIHJlZmVyZW5jZSB0byB0aGlzIGZydXN0dW0uXHJcblx0ICovXHJcblx0c2V0RnJvbVByb2plY3Rpb25NYXRyaXgoIG0sIGNvb3JkaW5hdGVTeXN0ZW0gPSBXZWJHTENvb3JkaW5hdGVTeXN0ZW0gKSB7XHJcblxyXG5cdFx0Y29uc3QgcGxhbmVzID0gdGhpcy5wbGFuZXM7XHJcblx0XHRjb25zdCBtZSA9IG0uZWxlbWVudHM7XHJcblx0XHRjb25zdCBtZTAgPSBtZVsgMCBdLCBtZTEgPSBtZVsgMSBdLCBtZTIgPSBtZVsgMiBdLCBtZTMgPSBtZVsgMyBdO1xyXG5cdFx0Y29uc3QgbWU0ID0gbWVbIDQgXSwgbWU1ID0gbWVbIDUgXSwgbWU2ID0gbWVbIDYgXSwgbWU3ID0gbWVbIDcgXTtcclxuXHRcdGNvbnN0IG1lOCA9IG1lWyA4IF0sIG1lOSA9IG1lWyA5IF0sIG1lMTAgPSBtZVsgMTAgXSwgbWUxMSA9IG1lWyAxMSBdO1xyXG5cdFx0Y29uc3QgbWUxMiA9IG1lWyAxMiBdLCBtZTEzID0gbWVbIDEzIF0sIG1lMTQgPSBtZVsgMTQgXSwgbWUxNSA9IG1lWyAxNSBdO1xyXG5cclxuXHRcdHBsYW5lc1sgMCBdLnNldENvbXBvbmVudHMoIG1lMyAtIG1lMCwgbWU3IC0gbWU0LCBtZTExIC0gbWU4LCBtZTE1IC0gbWUxMiApLm5vcm1hbGl6ZSgpO1xyXG5cdFx0cGxhbmVzWyAxIF0uc2V0Q29tcG9uZW50cyggbWUzICsgbWUwLCBtZTcgKyBtZTQsIG1lMTEgKyBtZTgsIG1lMTUgKyBtZTEyICkubm9ybWFsaXplKCk7XHJcblx0XHRwbGFuZXNbIDIgXS5zZXRDb21wb25lbnRzKCBtZTMgKyBtZTEsIG1lNyArIG1lNSwgbWUxMSArIG1lOSwgbWUxNSArIG1lMTMgKS5ub3JtYWxpemUoKTtcclxuXHRcdHBsYW5lc1sgMyBdLnNldENvbXBvbmVudHMoIG1lMyAtIG1lMSwgbWU3IC0gbWU1LCBtZTExIC0gbWU5LCBtZTE1IC0gbWUxMyApLm5vcm1hbGl6ZSgpO1xyXG5cdFx0cGxhbmVzWyA0IF0uc2V0Q29tcG9uZW50cyggbWUzIC0gbWUyLCBtZTcgLSBtZTYsIG1lMTEgLSBtZTEwLCBtZTE1IC0gbWUxNCApLm5vcm1hbGl6ZSgpO1xyXG5cclxuXHRcdGlmICggY29vcmRpbmF0ZVN5c3RlbSA9PT0gV2ViR0xDb29yZGluYXRlU3lzdGVtICkge1xyXG5cclxuXHRcdFx0cGxhbmVzWyA1IF0uc2V0Q29tcG9uZW50cyggbWUzICsgbWUyLCBtZTcgKyBtZTYsIG1lMTEgKyBtZTEwLCBtZTE1ICsgbWUxNCApLm5vcm1hbGl6ZSgpO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGNvb3JkaW5hdGVTeXN0ZW0gPT09IFdlYkdQVUNvb3JkaW5hdGVTeXN0ZW0gKSB7XHJcblxyXG5cdFx0XHRwbGFuZXNbIDUgXS5zZXRDb21wb25lbnRzKCBtZTIsIG1lNiwgbWUxMCwgbWUxNCApLm5vcm1hbGl6ZSgpO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5GcnVzdHVtLnNldEZyb21Qcm9qZWN0aW9uTWF0cml4KCk6IEludmFsaWQgY29vcmRpbmF0ZSBzeXN0ZW06ICcgKyBjb29yZGluYXRlU3lzdGVtICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSAzRCBvYmplY3QncyBib3VuZGluZyBzcGhlcmUgaXMgaW50ZXJzZWN0aW5nIHRoaXMgZnJ1c3R1bS5cclxuXHQgKlxyXG5cdCAqIE5vdGUgdGhhdCB0aGUgM0Qgb2JqZWN0IG11c3QgaGF2ZSBhIGdlb21ldHJ5IHNvIHRoYXQgdGhlIGJvdW5kaW5nIHNwaGVyZSBjYW4gYmUgY2FsY3VsYXRlZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0M0R9IG9iamVjdCAtIFRoZSAzRCBvYmplY3QgdG8gdGVzdC5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSAzRCBvYmplY3QncyBib3VuZGluZyBzcGhlcmUgaXMgaW50ZXJzZWN0aW5nIHRoaXMgZnJ1c3R1bSBvciBub3QuXHJcblx0ICovXHJcblx0aW50ZXJzZWN0c09iamVjdCggb2JqZWN0ICkge1xyXG5cclxuXHRcdGlmICggb2JqZWN0LmJvdW5kaW5nU3BoZXJlICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRpZiAoIG9iamVjdC5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCApIG9iamVjdC5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcclxuXHJcblx0XHRcdF9zcGhlcmUuY29weSggb2JqZWN0LmJvdW5kaW5nU3BoZXJlICkuYXBwbHlNYXRyaXg0KCBvYmplY3QubWF0cml4V29ybGQgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc3QgZ2VvbWV0cnkgPSBvYmplY3QuZ2VvbWV0cnk7XHJcblxyXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID09PSBudWxsICkgZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XHJcblxyXG5cdFx0XHRfc3BoZXJlLmNvcHkoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlICkuYXBwbHlNYXRyaXg0KCBvYmplY3QubWF0cml4V29ybGQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0c1NwaGVyZSggX3NwaGVyZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBnaXZlbiBzcHJpdGUgaXMgaW50ZXJzZWN0aW5nIHRoaXMgZnJ1c3R1bS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7U3ByaXRlfSBzcHJpdGUgLSBUaGUgc3ByaXRlIHRvIHRlc3QuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgc3ByaXRlIGlzIGludGVyc2VjdGluZyB0aGlzIGZydXN0dW0gb3Igbm90LlxyXG5cdCAqL1xyXG5cdGludGVyc2VjdHNTcHJpdGUoIHNwcml0ZSApIHtcclxuXHJcblx0XHRfc3BoZXJlLmNlbnRlci5zZXQoIDAsIDAsIDAgKTtcclxuXHRcdF9zcGhlcmUucmFkaXVzID0gMC43MDcxMDY3ODExODY1NDc2O1xyXG5cdFx0X3NwaGVyZS5hcHBseU1hdHJpeDQoIHNwcml0ZS5tYXRyaXhXb3JsZCApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmludGVyc2VjdHNTcGhlcmUoIF9zcGhlcmUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gYm91bmRpbmcgc3BoZXJlIGlzIGludGVyc2VjdGluZyB0aGlzIGZydXN0dW0uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1NwaGVyZX0gc3BoZXJlIC0gVGhlIGJvdW5kaW5nIHNwaGVyZSB0byB0ZXN0LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGJvdW5kaW5nIHNwaGVyZSBpcyBpbnRlcnNlY3RpbmcgdGhpcyBmcnVzdHVtIG9yIG5vdC5cclxuXHQgKi9cclxuXHRpbnRlcnNlY3RzU3BoZXJlKCBzcGhlcmUgKSB7XHJcblxyXG5cdFx0Y29uc3QgcGxhbmVzID0gdGhpcy5wbGFuZXM7XHJcblx0XHRjb25zdCBjZW50ZXIgPSBzcGhlcmUuY2VudGVyO1xyXG5cdFx0Y29uc3QgbmVnUmFkaXVzID0gLSBzcGhlcmUucmFkaXVzO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDY7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBkaXN0YW5jZSA9IHBsYW5lc1sgaSBdLmRpc3RhbmNlVG9Qb2ludCggY2VudGVyICk7XHJcblxyXG5cdFx0XHRpZiAoIGRpc3RhbmNlIDwgbmVnUmFkaXVzICkge1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBnaXZlbiBib3VuZGluZyBib3ggaXMgaW50ZXJzZWN0aW5nIHRoaXMgZnJ1c3R1bS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Qm94M30gYm94IC0gVGhlIGJvdW5kaW5nIGJveCB0byB0ZXN0LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGJvdW5kaW5nIGJveCBpcyBpbnRlcnNlY3RpbmcgdGhpcyBmcnVzdHVtIG9yIG5vdC5cclxuXHQgKi9cclxuXHRpbnRlcnNlY3RzQm94KCBib3ggKSB7XHJcblxyXG5cdFx0Y29uc3QgcGxhbmVzID0gdGhpcy5wbGFuZXM7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgNjsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHBsYW5lID0gcGxhbmVzWyBpIF07XHJcblxyXG5cdFx0XHQvLyBjb3JuZXIgYXQgbWF4IGRpc3RhbmNlXHJcblxyXG5cdFx0XHRfdmVjdG9yLnggPSBwbGFuZS5ub3JtYWwueCA+IDAgPyBib3gubWF4LnggOiBib3gubWluLng7XHJcblx0XHRcdF92ZWN0b3IueSA9IHBsYW5lLm5vcm1hbC55ID4gMCA/IGJveC5tYXgueSA6IGJveC5taW4ueTtcclxuXHRcdFx0X3ZlY3Rvci56ID0gcGxhbmUubm9ybWFsLnogPiAwID8gYm94Lm1heC56IDogYm94Lm1pbi56O1xyXG5cclxuXHRcdFx0aWYgKCBwbGFuZS5kaXN0YW5jZVRvUG9pbnQoIF92ZWN0b3IgKSA8IDAgKSB7XHJcblxyXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIHBvaW50IGxpZXMgd2l0aGluIHRoZSBmcnVzdHVtLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBwb2ludCAtIFRoZSBwb2ludCB0byB0ZXN0LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHBvaW50IGxpZXMgd2l0aGluIHRoaXMgZnJ1c3R1bSBvciBub3QuXHJcblx0ICovXHJcblx0Y29udGFpbnNQb2ludCggcG9pbnQgKSB7XHJcblxyXG5cdFx0Y29uc3QgcGxhbmVzID0gdGhpcy5wbGFuZXM7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgNjsgaSArKyApIHtcclxuXHJcblx0XHRcdGlmICggcGxhbmVzWyBpIF0uZGlzdGFuY2VUb1BvaW50KCBwb2ludCApIDwgMCApIHtcclxuXHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbmV3IGZydXN0dW0gd2l0aCBjb3BpZWQgdmFsdWVzIGZyb20gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0ZydXN0dW19IEEgY2xvbmUgb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjbG9uZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBGcnVzdHVtIH07XHJcbiIsImltcG9ydCB7IEJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyQXR0cmlidXRlLmpzJztcclxuaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcclxuaW1wb3J0IHsgRGF0YVRleHR1cmUgfSBmcm9tICcuLi90ZXh0dXJlcy9EYXRhVGV4dHVyZS5qcyc7XHJcbmltcG9ydCB7IEZsb2F0VHlwZSwgUmVkSW50ZWdlckZvcm1hdCwgVW5zaWduZWRJbnRUeXBlLCBSR0JBRm9ybWF0IH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgTWF0cml4NCB9IGZyb20gJy4uL21hdGgvTWF0cml4NC5qcyc7XHJcbmltcG9ydCB7IE1lc2ggfSBmcm9tICcuL01lc2guanMnO1xyXG5pbXBvcnQgeyBDb2xvck1hbmFnZW1lbnQgfSBmcm9tICcuLi9tYXRoL0NvbG9yTWFuYWdlbWVudC5qcyc7XHJcbmltcG9ydCB7IEJveDMgfSBmcm9tICcuLi9tYXRoL0JveDMuanMnO1xyXG5pbXBvcnQgeyBTcGhlcmUgfSBmcm9tICcuLi9tYXRoL1NwaGVyZS5qcyc7XHJcbmltcG9ydCB7IEZydXN0dW0gfSBmcm9tICcuLi9tYXRoL0ZydXN0dW0uanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi9tYXRoL0NvbG9yLmpzJztcclxuXHJcbmZ1bmN0aW9uIGFzY0lkU29ydCggYSwgYiApIHtcclxuXHJcblx0cmV0dXJuIGEgLSBiO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gc29ydE9wYXF1ZSggYSwgYiApIHtcclxuXHJcblx0cmV0dXJuIGEueiAtIGIuejtcclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNvcnRUcmFuc3BhcmVudCggYSwgYiApIHtcclxuXHJcblx0cmV0dXJuIGIueiAtIGEuejtcclxuXHJcbn1cclxuXHJcbmNsYXNzIE11bHRpRHJhd1JlbmRlckxpc3Qge1xyXG5cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHJcblx0XHR0aGlzLmluZGV4ID0gMDtcclxuXHRcdHRoaXMucG9vbCA9IFtdO1xyXG5cdFx0dGhpcy5saXN0ID0gW107XHJcblxyXG5cdH1cclxuXHJcblx0cHVzaCggc3RhcnQsIGNvdW50LCB6LCBpbmRleCApIHtcclxuXHJcblx0XHRjb25zdCBwb29sID0gdGhpcy5wb29sO1xyXG5cdFx0Y29uc3QgbGlzdCA9IHRoaXMubGlzdDtcclxuXHRcdGlmICggdGhpcy5pbmRleCA+PSBwb29sLmxlbmd0aCApIHtcclxuXHJcblx0XHRcdHBvb2wucHVzaCgge1xyXG5cclxuXHRcdFx0XHRzdGFydDogLSAxLFxyXG5cdFx0XHRcdGNvdW50OiAtIDEsXHJcblx0XHRcdFx0ejogLSAxLFxyXG5cdFx0XHRcdGluZGV4OiAtIDEsXHJcblxyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGl0ZW0gPSBwb29sWyB0aGlzLmluZGV4IF07XHJcblx0XHRsaXN0LnB1c2goIGl0ZW0gKTtcclxuXHRcdHRoaXMuaW5kZXggKys7XHJcblxyXG5cdFx0aXRlbS5zdGFydCA9IHN0YXJ0O1xyXG5cdFx0aXRlbS5jb3VudCA9IGNvdW50O1xyXG5cdFx0aXRlbS56ID0gejtcclxuXHRcdGl0ZW0uaW5kZXggPSBpbmRleDtcclxuXHJcblx0fVxyXG5cclxuXHRyZXNldCgpIHtcclxuXHJcblx0XHR0aGlzLmxpc3QubGVuZ3RoID0gMDtcclxuXHRcdHRoaXMuaW5kZXggPSAwO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5jb25zdCBfbWF0cml4ID0gLypAX19QVVJFX18qLyBuZXcgTWF0cml4NCgpO1xyXG5jb25zdCBfd2hpdGVDb2xvciA9IC8qQF9fUFVSRV9fKi8gbmV3IENvbG9yKCAxLCAxLCAxICk7XHJcbmNvbnN0IF9mcnVzdHVtID0gLypAX19QVVJFX18qLyBuZXcgRnJ1c3R1bSgpO1xyXG5jb25zdCBfYm94ID0gLypAX19QVVJFX18qLyBuZXcgQm94MygpO1xyXG5jb25zdCBfc3BoZXJlID0gLypAX19QVVJFX18qLyBuZXcgU3BoZXJlKCk7XHJcbmNvbnN0IF92ZWN0b3IgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF9mb3J3YXJkID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfdGVtcCA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX3JlbmRlckxpc3QgPSAvKkBfX1BVUkVfXyovIG5ldyBNdWx0aURyYXdSZW5kZXJMaXN0KCk7XHJcbmNvbnN0IF9tZXNoID0gLypAX19QVVJFX18qLyBuZXcgTWVzaCgpO1xyXG5jb25zdCBfYmF0Y2hJbnRlcnNlY3RzID0gW107XHJcblxyXG4vLyBjb3BpZXMgZGF0YSBmcm9tIGF0dHJpYnV0ZSBcInNyY1wiIGludG8gXCJ0YXJnZXRcIiBzdGFydGluZyBhdCBcInRhcmdldE9mZnNldFwiXHJcbmZ1bmN0aW9uIGNvcHlBdHRyaWJ1dGVEYXRhKCBzcmMsIHRhcmdldCwgdGFyZ2V0T2Zmc2V0ID0gMCApIHtcclxuXHJcblx0Y29uc3QgaXRlbVNpemUgPSB0YXJnZXQuaXRlbVNpemU7XHJcblx0aWYgKCBzcmMuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSB8fCBzcmMuYXJyYXkuY29uc3RydWN0b3IgIT09IHRhcmdldC5hcnJheS5jb25zdHJ1Y3RvciApIHtcclxuXHJcblx0XHQvLyB1c2UgdGhlIGNvbXBvbmVudCBnZXR0ZXJzIGFuZCBzZXR0ZXJzIGlmIHRoZSBhcnJheSBkYXRhIGNhbm5vdFxyXG5cdFx0Ly8gYmUgY29waWVkIGRpcmVjdGx5XHJcblx0XHRjb25zdCB2ZXJ0ZXhDb3VudCA9IHNyYy5jb3VudDtcclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHZlcnRleENvdW50OyBpICsrICkge1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGMgPSAwOyBjIDwgaXRlbVNpemU7IGMgKysgKSB7XHJcblxyXG5cdFx0XHRcdHRhcmdldC5zZXRDb21wb25lbnQoIGkgKyB0YXJnZXRPZmZzZXQsIGMsIHNyYy5nZXRDb21wb25lbnQoIGksIGMgKSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fSBlbHNlIHtcclxuXHJcblx0XHQvLyBmYXN0ZXIgY29weSBhcHByb2FjaCB1c2luZyB0eXBlZCBhcnJheSBzZXQgZnVuY3Rpb25cclxuXHRcdHRhcmdldC5hcnJheS5zZXQoIHNyYy5hcnJheSwgdGFyZ2V0T2Zmc2V0ICogaXRlbVNpemUgKTtcclxuXHJcblx0fVxyXG5cclxuXHR0YXJnZXQubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxufVxyXG5cclxuLy8gc2FmZWx5IGNvcGllcyBhcnJheSBjb250ZW50cyB0byBhIHBvdGVudGlhbGx5IHNtYWxsZXIgYXJyYXlcclxuZnVuY3Rpb24gY29weUFycmF5Q29udGVudHMoIHNyYywgdGFyZ2V0ICkge1xyXG5cclxuXHRpZiAoIHNyYy5jb25zdHJ1Y3RvciAhPT0gdGFyZ2V0LmNvbnN0cnVjdG9yICkge1xyXG5cclxuXHRcdC8vIGlmIGFycmF5cyBhcmUgb2YgYSBkaWZmZXJlbnQgdHlwZSAoZWcgZHVlIHRvIGluZGV4IHNpemUgaW5jcmVhc2luZykgdGhlbiBkYXRhIG11c3QgYmUgcGVyLWVsZW1lbnQgY29waWVkXHJcblx0XHRjb25zdCBsZW4gPSBNYXRoLm1pbiggc3JjLmxlbmd0aCwgdGFyZ2V0Lmxlbmd0aCApO1xyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgbGVuOyBpICsrICkge1xyXG5cclxuXHRcdFx0dGFyZ2V0WyBpIF0gPSBzcmNbIGkgXTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0Ly8gaWYgdGhlIGFycmF5cyB1c2UgdGhlIHNhbWUgZGF0YSBsYXlvdXQgd2UgY2FuIHVzZSBhIGZhc3QgYmxvY2sgY29weVxyXG5cdFx0Y29uc3QgbGVuID0gTWF0aC5taW4oIHNyYy5sZW5ndGgsIHRhcmdldC5sZW5ndGggKTtcclxuXHRcdHRhcmdldC5zZXQoIG5ldyBzcmMuY29uc3RydWN0b3IoIHNyYy5idWZmZXIsIDAsIGxlbiApICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBIHNwZWNpYWwgdmVyc2lvbiBvZiBhIG1lc2ggd2l0aCBtdWx0aSBkcmF3IGJhdGNoIHJlbmRlcmluZyBzdXBwb3J0LiBVc2VcclxuICogdGhpcyBjbGFzcyBpZiB5b3UgaGF2ZSB0byByZW5kZXIgYSBsYXJnZSBudW1iZXIgb2Ygb2JqZWN0cyB3aXRoIHRoZSBzYW1lXHJcbiAqIG1hdGVyaWFsIGJ1dCB3aXRoIGRpZmZlcmVudCBnZW9tZXRyaWVzIG9yIHdvcmxkIHRyYW5zZm9ybWF0aW9ucy4gVGhlIHVzYWdlIG9mXHJcbiAqIGBCYXRjaGVkTWVzaGAgd2lsbCBoZWxwIHlvdSB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBkcmF3IGNhbGxzIGFuZCB0aHVzIGltcHJvdmUgdGhlIG92ZXJhbGxcclxuICogcmVuZGVyaW5nIHBlcmZvcm1hbmNlIGluIHlvdXIgYXBwbGljYXRpb24uXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGJveCA9IG5ldyBUSFJFRS5Cb3hHZW9tZXRyeSggMSwgMSwgMSApO1xyXG4gKiBjb25zdCBzcGhlcmUgPSBuZXcgVEhSRUUuU3BoZXJlR2VvbWV0cnkoIDEsIDEyLCAxMiApO1xyXG4gKiBjb25zdCBtYXRlcmlhbCA9IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogMHgwMGZmMDAgfSApO1xyXG4gKlxyXG4gKiAvLyBpbml0aWFsaXplIGFuZCBhZGQgZ2VvbWV0cmllcyBpbnRvIHRoZSBiYXRjaGVkIG1lc2hcclxuICogY29uc3QgYmF0Y2hlZE1lc2ggPSBuZXcgQmF0Y2hlZE1lc2goIDEwLCA1MDAwLCAxMDAwMCwgbWF0ZXJpYWwgKTtcclxuICogY29uc3QgYm94R2VvbWV0cnlJZCA9IGJhdGNoZWRNZXNoLmFkZEdlb21ldHJ5KCBib3ggKTtcclxuICogY29uc3Qgc3BoZXJlR2VvbWV0cnlJZCA9IGJhdGNoZWRNZXNoLmFkZEdlb21ldHJ5KCBzcGhlcmUgKTtcclxuICpcclxuICogLy8gY3JlYXRlIGluc3RhbmNlcyBvZiB0aG9zZSBnZW9tZXRyaWVzXHJcbiAqIGNvbnN0IGJveEluc3RhbmNlZElkMSA9IGJhdGNoZWRNZXNoLmFkZEluc3RhbmNlKCBib3hHZW9tZXRyeUlkICk7XHJcbiAqIGNvbnN0IGJveEluc3RhbmNlZElkMiA9IGJhdGNoZWRNZXNoLmFkZEluc3RhbmNlKCBib3hHZW9tZXRyeUlkICk7XHJcbiAqXHJcbiAqIGNvbnN0IHNwaGVyZUluc3RhbmNlZElkMSA9IGJhdGNoZWRNZXNoLmFkZEluc3RhbmNlKCBzcGhlcmVHZW9tZXRyeUlkICk7XHJcbiAqIGNvbnN0IHNwaGVyZUluc3RhbmNlZElkMiA9IGJhdGNoZWRNZXNoLmFkZEluc3RhbmNlKCBzcGhlcmVHZW9tZXRyeUlkICk7XHJcbiAqXHJcbiAqIC8vIHBvc2l0aW9uIHRoZSBnZW9tZXRyaWVzXHJcbiAqIGJhdGNoZWRNZXNoLnNldE1hdHJpeEF0KCBib3hJbnN0YW5jZWRJZDEsIGJveE1hdHJpeDEgKTtcclxuICogYmF0Y2hlZE1lc2guc2V0TWF0cml4QXQoIGJveEluc3RhbmNlZElkMiwgYm94TWF0cml4MiApO1xyXG4gKlxyXG4gKiBiYXRjaGVkTWVzaC5zZXRNYXRyaXhBdCggc3BoZXJlSW5zdGFuY2VkSWQxLCBzcGhlcmVNYXRyaXgxICk7XHJcbiAqIGJhdGNoZWRNZXNoLnNldE1hdHJpeEF0KCBzcGhlcmVJbnN0YW5jZWRJZDIsIHNwaGVyZU1hdHJpeDIgKTtcclxuICpcclxuICogc2NlbmUuYWRkKCBiYXRjaGVkTWVzaCApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIE1lc2hcclxuICovXHJcbmNsYXNzIEJhdGNoZWRNZXNoIGV4dGVuZHMgTWVzaCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYmF0Y2hlZCBtZXNoLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IG1heEluc3RhbmNlQ291bnQgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgaW5kaXZpZHVhbCBpbnN0YW5jZXMgcGxhbm5lZCB0byBiZSBhZGRlZCBhbmQgcmVuZGVyZWQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IG1heFZlcnRleENvdW50IC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIHZlcnRpY2VzIHRvIGJlIHVzZWQgYnkgYWxsIHVuaXF1ZSBnZW9tZXRyaWVzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbWF4SW5kZXhDb3VudD1tYXhWZXJ0ZXhDb3VudCoyXSAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiBpbmRpY2VzIHRvIGJlIHVzZWQgYnkgYWxsIHVuaXF1ZSBnZW9tZXRyaWVzXHJcblx0ICogQHBhcmFtIHtNYXRlcmlhbHxBcnJheTxNYXRlcmlhbD59IFttYXRlcmlhbF0gLSBUaGUgbWVzaCBtYXRlcmlhbC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbWF4SW5zdGFuY2VDb3VudCwgbWF4VmVydGV4Q291bnQsIG1heEluZGV4Q291bnQgPSBtYXhWZXJ0ZXhDb3VudCAqIDIsIG1hdGVyaWFsICkge1xyXG5cclxuXHRcdHN1cGVyKCBuZXcgQnVmZmVyR2VvbWV0cnkoKSwgbWF0ZXJpYWwgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNCYXRjaGVkTWVzaCA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGVuIHNldCBvdCBgdHJ1ZWAsIHRoZSBpbmRpdmlkdWFsIG9iamVjdHMgb2YgYSBiYXRjaCBhcmUgZnJ1c3R1bSBjdWxsZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucGVyT2JqZWN0RnJ1c3R1bUN1bGxlZCA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGVuIHNldCB0byBgdHJ1ZWAsIHRoZSBpbmRpdmlkdWFsIG9iamVjdHMgb2YgYSBiYXRjaCBhcmUgc29ydGVkIHRvIGltcHJvdmUgb3ZlcmRyYXctcmVsYXRlZCBhcnRpZmFjdHMuXHJcblx0XHQgKiBJZiB0aGUgbWF0ZXJpYWwgaXMgbWFya2VkIGFzIFwidHJhbnNwYXJlbnRcIiBvYmplY3RzIGFyZSByZW5kZXJlZCBiYWNrIHRvIGZyb250IGFuZCBpZiBub3QgdGhlbiB0aGV5IGFyZVxyXG5cdFx0ICogcmVuZGVyZWQgZnJvbnQgdG8gYmFjay5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zb3J0T2JqZWN0cyA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYm91bmRpbmcgYm94IG9mIHRoZSBiYXRjaGVkIG1lc2guIENhbiBiZSBjb21wdXRlZCB2aWEge0BsaW5rIEJhdGNoZWRNZXNoI2NvbXB1dGVCb3VuZGluZ0JveH0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Cb3gzfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJvdW5kaW5nQm94ID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBib3VuZGluZyBzcGhlcmUgb2YgdGhlIGJhdGNoZWQgbWVzaC4gQ2FuIGJlIGNvbXB1dGVkIHZpYSB7QGxpbmsgQmF0Y2hlZE1lc2gjY29tcHV0ZUJvdW5kaW5nU3BoZXJlfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1NwaGVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUYWtlcyBhIHNvcnQgYSBmdW5jdGlvbiB0aGF0IGlzIHJ1biBiZWZvcmUgcmVuZGVyLiBUaGUgZnVuY3Rpb24gdGFrZXMgYSBsaXN0IG9mIGluc3RhbmNlcyB0b1xyXG5cdFx0ICogc29ydCBhbmQgYSBjYW1lcmEuIFRoZSBvYmplY3RzIGluIHRoZSBsaXN0IGluY2x1ZGUgYSBcInpcIiBmaWVsZCB0byBwZXJmb3JtIGEgZGVwdGgtb3JkZXJlZFxyXG5cdFx0ICogc29ydCB3aXRoLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/RnVuY3Rpb259XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY3VzdG9tU29ydCA9IG51bGw7XHJcblxyXG5cdFx0Ly8gc3RvcmVzIHZpc2libGUsIGFjdGl2ZSwgYW5kIGdlb21ldHJ5IGlkIHBlciBpbnN0YW5jZSBhbmQgcmVzZXJ2ZWQgYnVmZmVyIHJhbmdlcyBmb3IgZ2VvbWV0cmllc1xyXG5cdFx0dGhpcy5faW5zdGFuY2VJbmZvID0gW107XHJcblx0XHR0aGlzLl9nZW9tZXRyeUluZm8gPSBbXTtcclxuXHJcblx0XHQvLyBpbnN0YW5jZSwgZ2VvbWV0cnkgaWRzIHRoYXQgaGF2ZSBiZWVuIHNldCBhcyBpbmFjdGl2ZSwgYW5kIGFyZSBhdmFpbGFibGUgdG8gYmUgb3ZlcndyaXR0ZW5cclxuXHRcdHRoaXMuX2F2YWlsYWJsZUluc3RhbmNlSWRzID0gW107XHJcblx0XHR0aGlzLl9hdmFpbGFibGVHZW9tZXRyeUlkcyA9IFtdO1xyXG5cclxuXHRcdC8vIHVzZWQgdG8gdHJhY2sgd2hlcmUgdGhlIG5leHQgcG9pbnQgaXMgdGhhdCBnZW9tZXRyeSBzaG91bGQgYmUgaW5zZXJ0ZWRcclxuXHRcdHRoaXMuX25leHRJbmRleFN0YXJ0ID0gMDtcclxuXHRcdHRoaXMuX25leHRWZXJ0ZXhTdGFydCA9IDA7XHJcblx0XHR0aGlzLl9nZW9tZXRyeUNvdW50ID0gMDtcclxuXHJcblx0XHQvLyBmbGFnc1xyXG5cdFx0dGhpcy5fdmlzaWJpbGl0eUNoYW5nZWQgPSB0cnVlO1xyXG5cdFx0dGhpcy5fZ2VvbWV0cnlJbml0aWFsaXplZCA9IGZhbHNlO1xyXG5cclxuXHRcdC8vIGNhY2hlZCB1c2VyIG9wdGlvbnNcclxuXHRcdHRoaXMuX21heEluc3RhbmNlQ291bnQgPSBtYXhJbnN0YW5jZUNvdW50O1xyXG5cdFx0dGhpcy5fbWF4VmVydGV4Q291bnQgPSBtYXhWZXJ0ZXhDb3VudDtcclxuXHRcdHRoaXMuX21heEluZGV4Q291bnQgPSBtYXhJbmRleENvdW50O1xyXG5cclxuXHRcdC8vIGJ1ZmZlcnMgZm9yIG11bHRpIGRyYXdcclxuXHRcdHRoaXMuX211bHRpRHJhd0NvdW50cyA9IG5ldyBJbnQzMkFycmF5KCBtYXhJbnN0YW5jZUNvdW50ICk7XHJcblx0XHR0aGlzLl9tdWx0aURyYXdTdGFydHMgPSBuZXcgSW50MzJBcnJheSggbWF4SW5zdGFuY2VDb3VudCApO1xyXG5cdFx0dGhpcy5fbXVsdGlEcmF3Q291bnQgPSAwO1xyXG5cdFx0dGhpcy5fbXVsdGlEcmF3SW5zdGFuY2VzID0gbnVsbDtcclxuXHJcblx0XHQvLyBMb2NhbCBtYXRyaXggcGVyIGdlb21ldHJ5IGJ5IHVzaW5nIGRhdGEgdGV4dHVyZVxyXG5cdFx0dGhpcy5fbWF0cmljZXNUZXh0dXJlID0gbnVsbDtcclxuXHRcdHRoaXMuX2luZGlyZWN0VGV4dHVyZSA9IG51bGw7XHJcblx0XHR0aGlzLl9jb2xvcnNUZXh0dXJlID0gbnVsbDtcclxuXHJcblx0XHR0aGlzLl9pbml0TWF0cmljZXNUZXh0dXJlKCk7XHJcblx0XHR0aGlzLl9pbml0SW5kaXJlY3RUZXh0dXJlKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGluZGl2aWR1YWwgaW5zdGFuY2VzIHRoYXQgY2FuIGJlIHN0b3JlZCBpbiB0aGUgYmF0Y2guXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdCAqIEByZWFkb25seVxyXG5cdCAqL1xyXG5cdGdldCBtYXhJbnN0YW5jZUNvdW50KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9tYXhJbnN0YW5jZUNvdW50O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBpbnN0YW5jZSBjb3VudC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0ICogQHJlYWRvbmx5XHJcblx0ICovXHJcblx0Z2V0IGluc3RhbmNlQ291bnQoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX2luc3RhbmNlSW5mby5sZW5ndGggLSB0aGlzLl9hdmFpbGFibGVJbnN0YW5jZUlkcy5sZW5ndGg7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIG51bWJlciBvZiB1bnVzZWQgdmVydGljZXMuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdCAqIEByZWFkb25seVxyXG5cdCAqL1xyXG5cdGdldCB1bnVzZWRWZXJ0ZXhDb3VudCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fbWF4VmVydGV4Q291bnQgLSB0aGlzLl9uZXh0VmVydGV4U3RhcnQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIG51bWJlciBvZiB1bnVzZWQgaW5kaWNlcy5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0ICogQHJlYWRvbmx5XHJcblx0ICovXHJcblx0Z2V0IHVudXNlZEluZGV4Q291bnQoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX21heEluZGV4Q291bnQgLSB0aGlzLl9uZXh0SW5kZXhTdGFydDtcclxuXHJcblx0fVxyXG5cclxuXHRfaW5pdE1hdHJpY2VzVGV4dHVyZSgpIHtcclxuXHJcblx0XHQvLyBsYXlvdXQgKDEgbWF0cml4ID0gNCBwaXhlbHMpXHJcblx0XHQvLyAgICAgIFJHQkEgUkdCQSBSR0JBIFJHQkEgKD0+IGNvbHVtbjEsIGNvbHVtbjIsIGNvbHVtbjMsIGNvbHVtbjQpXHJcblx0XHQvLyAgd2l0aCAgOHg4ICBwaXhlbCB0ZXh0dXJlIG1heCAgIDE2IG1hdHJpY2VzICogNCBwaXhlbHMgPSAgKDggKiA4KVxyXG5cdFx0Ly8gICAgICAgMTZ4MTYgcGl4ZWwgdGV4dHVyZSBtYXggICA2NCBtYXRyaWNlcyAqIDQgcGl4ZWxzID0gKDE2ICogMTYpXHJcblx0XHQvLyAgICAgICAzMngzMiBwaXhlbCB0ZXh0dXJlIG1heCAgMjU2IG1hdHJpY2VzICogNCBwaXhlbHMgPSAoMzIgKiAzMilcclxuXHRcdC8vICAgICAgIDY0eDY0IHBpeGVsIHRleHR1cmUgbWF4IDEwMjQgbWF0cmljZXMgKiA0IHBpeGVscyA9ICg2NCAqIDY0KVxyXG5cclxuXHRcdGxldCBzaXplID0gTWF0aC5zcXJ0KCB0aGlzLl9tYXhJbnN0YW5jZUNvdW50ICogNCApOyAvLyA0IHBpeGVscyBuZWVkZWQgZm9yIDEgbWF0cml4XHJcblx0XHRzaXplID0gTWF0aC5jZWlsKCBzaXplIC8gNCApICogNDtcclxuXHRcdHNpemUgPSBNYXRoLm1heCggc2l6ZSwgNCApO1xyXG5cclxuXHRcdGNvbnN0IG1hdHJpY2VzQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KCBzaXplICogc2l6ZSAqIDQgKTsgLy8gNCBmbG9hdHMgcGVyIFJHQkEgcGl4ZWxcclxuXHRcdGNvbnN0IG1hdHJpY2VzVGV4dHVyZSA9IG5ldyBEYXRhVGV4dHVyZSggbWF0cmljZXNBcnJheSwgc2l6ZSwgc2l6ZSwgUkdCQUZvcm1hdCwgRmxvYXRUeXBlICk7XHJcblxyXG5cdFx0dGhpcy5fbWF0cmljZXNUZXh0dXJlID0gbWF0cmljZXNUZXh0dXJlO1xyXG5cclxuXHR9XHJcblxyXG5cdF9pbml0SW5kaXJlY3RUZXh0dXJlKCkge1xyXG5cclxuXHRcdGxldCBzaXplID0gTWF0aC5zcXJ0KCB0aGlzLl9tYXhJbnN0YW5jZUNvdW50ICk7XHJcblx0XHRzaXplID0gTWF0aC5jZWlsKCBzaXplICk7XHJcblxyXG5cdFx0Y29uc3QgaW5kaXJlY3RBcnJheSA9IG5ldyBVaW50MzJBcnJheSggc2l6ZSAqIHNpemUgKTtcclxuXHRcdGNvbnN0IGluZGlyZWN0VGV4dHVyZSA9IG5ldyBEYXRhVGV4dHVyZSggaW5kaXJlY3RBcnJheSwgc2l6ZSwgc2l6ZSwgUmVkSW50ZWdlckZvcm1hdCwgVW5zaWduZWRJbnRUeXBlICk7XHJcblxyXG5cdFx0dGhpcy5faW5kaXJlY3RUZXh0dXJlID0gaW5kaXJlY3RUZXh0dXJlO1xyXG5cclxuXHR9XHJcblxyXG5cdF9pbml0Q29sb3JzVGV4dHVyZSgpIHtcclxuXHJcblx0XHRsZXQgc2l6ZSA9IE1hdGguc3FydCggdGhpcy5fbWF4SW5zdGFuY2VDb3VudCApO1xyXG5cdFx0c2l6ZSA9IE1hdGguY2VpbCggc2l6ZSApO1xyXG5cclxuXHRcdC8vIDQgZmxvYXRzIHBlciBSR0JBIHBpeGVsIGluaXRpYWxpemVkIHRvIHdoaXRlXHJcblx0XHRjb25zdCBjb2xvcnNBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoIHNpemUgKiBzaXplICogNCApLmZpbGwoIDEgKTtcclxuXHRcdGNvbnN0IGNvbG9yc1RleHR1cmUgPSBuZXcgRGF0YVRleHR1cmUoIGNvbG9yc0FycmF5LCBzaXplLCBzaXplLCBSR0JBRm9ybWF0LCBGbG9hdFR5cGUgKTtcclxuXHRcdGNvbG9yc1RleHR1cmUuY29sb3JTcGFjZSA9IENvbG9yTWFuYWdlbWVudC53b3JraW5nQ29sb3JTcGFjZTtcclxuXHJcblx0XHR0aGlzLl9jb2xvcnNUZXh0dXJlID0gY29sb3JzVGV4dHVyZTtcclxuXHJcblx0fVxyXG5cclxuXHRfaW5pdGlhbGl6ZUdlb21ldHJ5KCByZWZlcmVuY2UgKSB7XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xyXG5cdFx0Y29uc3QgbWF4VmVydGV4Q291bnQgPSB0aGlzLl9tYXhWZXJ0ZXhDb3VudDtcclxuXHRcdGNvbnN0IG1heEluZGV4Q291bnQgPSB0aGlzLl9tYXhJbmRleENvdW50O1xyXG5cdFx0aWYgKCB0aGlzLl9nZW9tZXRyeUluaXRpYWxpemVkID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdGZvciAoIGNvbnN0IGF0dHJpYnV0ZU5hbWUgaW4gcmVmZXJlbmNlLmF0dHJpYnV0ZXMgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHNyY0F0dHJpYnV0ZSA9IHJlZmVyZW5jZS5nZXRBdHRyaWJ1dGUoIGF0dHJpYnV0ZU5hbWUgKTtcclxuXHRcdFx0XHRjb25zdCB7IGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCB9ID0gc3JjQXR0cmlidXRlO1xyXG5cclxuXHRcdFx0XHRjb25zdCBkc3RBcnJheSA9IG5ldyBhcnJheS5jb25zdHJ1Y3RvciggbWF4VmVydGV4Q291bnQgKiBpdGVtU2l6ZSApO1xyXG5cdFx0XHRcdGNvbnN0IGRzdEF0dHJpYnV0ZSA9IG5ldyBCdWZmZXJBdHRyaWJ1dGUoIGRzdEFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApO1xyXG5cclxuXHRcdFx0XHRnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoIGF0dHJpYnV0ZU5hbWUsIGRzdEF0dHJpYnV0ZSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCByZWZlcmVuY2UuZ2V0SW5kZXgoKSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0Ly8gUmVzZXJ2ZSBsYXN0IHUxNiBpbmRleCBmb3IgcHJpbWl0aXZlIHJlc3RhcnQuXHJcblx0XHRcdFx0Y29uc3QgaW5kZXhBcnJheSA9IG1heFZlcnRleENvdW50ID4gNjU1MzVcclxuXHRcdFx0XHRcdD8gbmV3IFVpbnQzMkFycmF5KCBtYXhJbmRleENvdW50IClcclxuXHRcdFx0XHRcdDogbmV3IFVpbnQxNkFycmF5KCBtYXhJbmRleENvdW50ICk7XHJcblxyXG5cdFx0XHRcdGdlb21ldHJ5LnNldEluZGV4KCBuZXcgQnVmZmVyQXR0cmlidXRlKCBpbmRleEFycmF5LCAxICkgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuX2dlb21ldHJ5SW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvLyBNYWtlIHN1cmUgdGhlIGdlb21ldHJ5IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgZXhpc3RpbmcgY29tYmluZWQgZ2VvbWV0cnkgYXR0cmlidXRlc1xyXG5cdF92YWxpZGF0ZUdlb21ldHJ5KCBnZW9tZXRyeSApIHtcclxuXHJcblx0XHQvLyBjaGVjayB0byBlbnN1cmUgdGhlIGdlb21ldHJpZXMgYXJlIHVzaW5nIGNvbnNpc3RlbnQgYXR0cmlidXRlcyBhbmQgaW5kaWNlc1xyXG5cdFx0Y29uc3QgYmF0Y2hHZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XHJcblx0XHRpZiAoIEJvb2xlYW4oIGdlb21ldHJ5LmdldEluZGV4KCkgKSAhPT0gQm9vbGVhbiggYmF0Y2hHZW9tZXRyeS5nZXRJbmRleCgpICkgKSB7XHJcblxyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5CYXRjaGVkTWVzaDogQWxsIGdlb21ldHJpZXMgbXVzdCBjb25zaXN0ZW50bHkgaGF2ZSBcImluZGV4XCIuJyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmb3IgKCBjb25zdCBhdHRyaWJ1dGVOYW1lIGluIGJhdGNoR2VvbWV0cnkuYXR0cmlidXRlcyApIHtcclxuXHJcblx0XHRcdGlmICggISBnZW9tZXRyeS5oYXNBdHRyaWJ1dGUoIGF0dHJpYnV0ZU5hbWUgKSApIHtcclxuXHJcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCBgVEhSRUUuQmF0Y2hlZE1lc2g6IEFkZGVkIGdlb21ldHJ5IG1pc3NpbmcgXCIkeyBhdHRyaWJ1dGVOYW1lIH1cIi4gQWxsIGdlb21ldHJpZXMgbXVzdCBoYXZlIGNvbnNpc3RlbnQgYXR0cmlidXRlcy5gICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBzcmNBdHRyaWJ1dGUgPSBnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoIGF0dHJpYnV0ZU5hbWUgKTtcclxuXHRcdFx0Y29uc3QgZHN0QXR0cmlidXRlID0gYmF0Y2hHZW9tZXRyeS5nZXRBdHRyaWJ1dGUoIGF0dHJpYnV0ZU5hbWUgKTtcclxuXHRcdFx0aWYgKCBzcmNBdHRyaWJ1dGUuaXRlbVNpemUgIT09IGRzdEF0dHJpYnV0ZS5pdGVtU2l6ZSB8fCBzcmNBdHRyaWJ1dGUubm9ybWFsaXplZCAhPT0gZHN0QXR0cmlidXRlLm5vcm1hbGl6ZWQgKSB7XHJcblxyXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciggJ1RIUkVFLkJhdGNoZWRNZXNoOiBBbGwgYXR0cmlidXRlcyBtdXN0IGhhdmUgYSBjb25zaXN0ZW50IGl0ZW1TaXplIGFuZCBub3JtYWxpemVkIHZhbHVlLicgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVmFsaWRhdGVzIHRoZSBpbnN0YW5jZSBkZWZpbmVkIGJ5IHRoZSBnaXZlbiBJRC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbnN0YW5jZUlkIC0gVGhlIGluc3RhbmNlIHRvIHZhbGlkYXRlLlxyXG5cdCAqL1xyXG5cdHZhbGlkYXRlSW5zdGFuY2VJZCggaW5zdGFuY2VJZCApIHtcclxuXHJcblx0XHRjb25zdCBpbnN0YW5jZUluZm8gPSB0aGlzLl9pbnN0YW5jZUluZm87XHJcblx0XHRpZiAoIGluc3RhbmNlSWQgPCAwIHx8IGluc3RhbmNlSWQgPj0gaW5zdGFuY2VJbmZvLmxlbmd0aCB8fCBpbnN0YW5jZUluZm9bIGluc3RhbmNlSWQgXS5hY3RpdmUgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCBgVEhSRUUuQmF0Y2hlZE1lc2g6IEludmFsaWQgaW5zdGFuY2VJZCAke2luc3RhbmNlSWR9LiBJbnN0YW5jZSBpcyBlaXRoZXIgb3V0IG9mIHJhbmdlIG9yIGhhcyBiZWVuIGRlbGV0ZWQuYCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBWYWxpZGF0ZXMgdGhlIGdlb21ldHJ5IGRlZmluZWQgYnkgdGhlIGdpdmVuIElELlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGdlb21ldHJ5SWQgLSBUaGUgZ2VvbWV0cnkgdG8gdmFsaWRhdGUuXHJcblx0ICovXHJcblx0dmFsaWRhdGVHZW9tZXRyeUlkKCBnZW9tZXRyeUlkICkge1xyXG5cclxuXHRcdGNvbnN0IGdlb21ldHJ5SW5mb0xpc3QgPSB0aGlzLl9nZW9tZXRyeUluZm87XHJcblx0XHRpZiAoIGdlb21ldHJ5SWQgPCAwIHx8IGdlb21ldHJ5SWQgPj0gZ2VvbWV0cnlJbmZvTGlzdC5sZW5ndGggfHwgZ2VvbWV0cnlJbmZvTGlzdFsgZ2VvbWV0cnlJZCBdLmFjdGl2ZSA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoIGBUSFJFRS5CYXRjaGVkTWVzaDogSW52YWxpZCBnZW9tZXRyeUlkICR7Z2VvbWV0cnlJZH0uIEdlb21ldHJ5IGlzIGVpdGhlciBvdXQgb2YgcmFuZ2Ugb3IgaGFzIGJlZW4gZGVsZXRlZC5gICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRha2VzIGEgc29ydCBhIGZ1bmN0aW9uIHRoYXQgaXMgcnVuIGJlZm9yZSByZW5kZXIuIFRoZSBmdW5jdGlvbiB0YWtlcyBhIGxpc3Qgb2YgaW5zdGFuY2VzIHRvXHJcblx0ICogc29ydCBhbmQgYSBjYW1lcmEuIFRoZSBvYmplY3RzIGluIHRoZSBsaXN0IGluY2x1ZGUgYSBcInpcIiBmaWVsZCB0byBwZXJmb3JtIGEgZGVwdGgtb3JkZXJlZCBzb3J0IHdpdGguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIC0gVGhlIGN1c3RvbSBzb3J0IGZ1bmN0aW9uLlxyXG5cdCAqIEByZXR1cm4ge0JhdGNoZWRNZXNofSBBIHJlZmVyZW5jZSB0byB0aGlzIGJhdGNoZWQgbWVzaC5cclxuXHQgKi9cclxuXHRzZXRDdXN0b21Tb3J0KCBmdW5jICkge1xyXG5cclxuXHRcdHRoaXMuY3VzdG9tU29ydCA9IGZ1bmM7XHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB0aGUgYm91bmRpbmcgYm94LCB1cGRhdGluZyB7QGxpbmsgQmF0Y2hlZE1lc2gjYm91bmRpbmdCb3h9LlxyXG5cdCAqIEJvdW5kaW5nIGJveGVzIGFyZW4ndCBjb21wdXRlZCBieSBkZWZhdWx0LiBUaGV5IG5lZWQgdG8gYmUgZXhwbGljaXRseSBjb21wdXRlZCxcclxuXHQgKiBvdGhlcndpc2UgdGhleSBhcmUgYG51bGxgLlxyXG5cdCAqL1xyXG5cdGNvbXB1dGVCb3VuZGluZ0JveCgpIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuYm91bmRpbmdCb3ggPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmJvdW5kaW5nQm94ID0gbmV3IEJveDMoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgYm91bmRpbmdCb3ggPSB0aGlzLmJvdW5kaW5nQm94O1xyXG5cdFx0Y29uc3QgaW5zdGFuY2VJbmZvID0gdGhpcy5faW5zdGFuY2VJbmZvO1xyXG5cclxuXHRcdGJvdW5kaW5nQm94Lm1ha2VFbXB0eSgpO1xyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gaW5zdGFuY2VJbmZvLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGluc3RhbmNlSW5mb1sgaSBdLmFjdGl2ZSA9PT0gZmFsc2UgKSBjb250aW51ZTtcclxuXHJcblx0XHRcdGNvbnN0IGdlb21ldHJ5SWQgPSBpbnN0YW5jZUluZm9bIGkgXS5nZW9tZXRyeUluZGV4O1xyXG5cdFx0XHR0aGlzLmdldE1hdHJpeEF0KCBpLCBfbWF0cml4ICk7XHJcblx0XHRcdHRoaXMuZ2V0Qm91bmRpbmdCb3hBdCggZ2VvbWV0cnlJZCwgX2JveCApLmFwcGx5TWF0cml4NCggX21hdHJpeCApO1xyXG5cdFx0XHRib3VuZGluZ0JveC51bmlvbiggX2JveCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB0aGUgYm91bmRpbmcgc3BoZXJlLCB1cGRhdGluZyB7QGxpbmsgQmF0Y2hlZE1lc2gjYm91bmRpbmdTcGhlcmV9LlxyXG5cdCAqIEJvdW5kaW5nIHNwaGVyZXMgYXJlbid0IGNvbXB1dGVkIGJ5IGRlZmF1bHQuIFRoZXkgbmVlZCB0byBiZSBleHBsaWNpdGx5IGNvbXB1dGVkLFxyXG5cdCAqIG90aGVyd2lzZSB0aGV5IGFyZSBgbnVsbGAuXHJcblx0ICovXHJcblx0Y29tcHV0ZUJvdW5kaW5nU3BoZXJlKCkge1xyXG5cclxuXHRcdGlmICggdGhpcy5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBuZXcgU3BoZXJlKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGJvdW5kaW5nU3BoZXJlID0gdGhpcy5ib3VuZGluZ1NwaGVyZTtcclxuXHRcdGNvbnN0IGluc3RhbmNlSW5mbyA9IHRoaXMuX2luc3RhbmNlSW5mbztcclxuXHJcblx0XHRib3VuZGluZ1NwaGVyZS5tYWtlRW1wdHkoKTtcclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGluc3RhbmNlSW5mby5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0aWYgKCBpbnN0YW5jZUluZm9bIGkgXS5hY3RpdmUgPT09IGZhbHNlICkgY29udGludWU7XHJcblxyXG5cdFx0XHRjb25zdCBnZW9tZXRyeUlkID0gaW5zdGFuY2VJbmZvWyBpIF0uZ2VvbWV0cnlJbmRleDtcclxuXHRcdFx0dGhpcy5nZXRNYXRyaXhBdCggaSwgX21hdHJpeCApO1xyXG5cdFx0XHR0aGlzLmdldEJvdW5kaW5nU3BoZXJlQXQoIGdlb21ldHJ5SWQsIF9zcGhlcmUgKS5hcHBseU1hdHJpeDQoIF9tYXRyaXggKTtcclxuXHRcdFx0Ym91bmRpbmdTcGhlcmUudW5pb24oIF9zcGhlcmUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyBhIG5ldyBpbnN0YW5jZSB0byB0aGUgYmF0Y2ggdXNpbmcgdGhlIGdlb21ldHJ5IG9mIHRoZSBnaXZlbiBJRCBhbmQgcmV0dXJuc1xyXG5cdCAqIGEgbmV3IGlkIHJlZmVycmluZyB0byB0aGUgbmV3IGluc3RhbmNlIHRvIGJlIHVzZWQgYnkgb3RoZXIgZnVuY3Rpb25zLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGdlb21ldHJ5SWQgLSBUaGUgSUQgb2YgYSBwcmV2aW91c2x5IGFkZGVkIGdlb21ldHJ5IHZpYSB7QGxpbmsgQmF0Y2hlZE1lc2gjYWRkR2VvbWV0cnl9LlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGluc3RhbmNlIElELlxyXG5cdCAqL1xyXG5cdGFkZEluc3RhbmNlKCBnZW9tZXRyeUlkICkge1xyXG5cclxuXHRcdGNvbnN0IGF0Q2FwYWNpdHkgPSB0aGlzLl9pbnN0YW5jZUluZm8ubGVuZ3RoID49IHRoaXMubWF4SW5zdGFuY2VDb3VudDtcclxuXHJcblx0XHQvLyBlbnN1cmUgd2UncmUgbm90IG92ZXIgZ2VvbWV0cnlcclxuXHRcdGlmICggYXRDYXBhY2l0eSAmJiB0aGlzLl9hdmFpbGFibGVJbnN0YW5jZUlkcy5sZW5ndGggPT09IDAgKSB7XHJcblxyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5CYXRjaGVkTWVzaDogTWF4aW11bSBpdGVtIGNvdW50IHJlYWNoZWQuJyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBpbnN0YW5jZUluZm8gPSB7XHJcblx0XHRcdHZpc2libGU6IHRydWUsXHJcblx0XHRcdGFjdGl2ZTogdHJ1ZSxcclxuXHRcdFx0Z2VvbWV0cnlJbmRleDogZ2VvbWV0cnlJZCxcclxuXHRcdH07XHJcblxyXG5cdFx0bGV0IGRyYXdJZCA9IG51bGw7XHJcblxyXG5cdFx0Ly8gUHJpb3JpdGl6ZSB1c2luZyBwcmV2aW91c2x5IGZyZWVkIGluc3RhbmNlIGlkc1xyXG5cdFx0aWYgKCB0aGlzLl9hdmFpbGFibGVJbnN0YW5jZUlkcy5sZW5ndGggPiAwICkge1xyXG5cclxuXHRcdFx0dGhpcy5fYXZhaWxhYmxlSW5zdGFuY2VJZHMuc29ydCggYXNjSWRTb3J0ICk7XHJcblxyXG5cdFx0XHRkcmF3SWQgPSB0aGlzLl9hdmFpbGFibGVJbnN0YW5jZUlkcy5zaGlmdCgpO1xyXG5cdFx0XHR0aGlzLl9pbnN0YW5jZUluZm9bIGRyYXdJZCBdID0gaW5zdGFuY2VJbmZvO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRkcmF3SWQgPSB0aGlzLl9pbnN0YW5jZUluZm8ubGVuZ3RoO1xyXG5cdFx0XHR0aGlzLl9pbnN0YW5jZUluZm8ucHVzaCggaW5zdGFuY2VJbmZvICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IG1hdHJpY2VzVGV4dHVyZSA9IHRoaXMuX21hdHJpY2VzVGV4dHVyZTtcclxuXHRcdF9tYXRyaXguaWRlbnRpdHkoKS50b0FycmF5KCBtYXRyaWNlc1RleHR1cmUuaW1hZ2UuZGF0YSwgZHJhd0lkICogMTYgKTtcclxuXHRcdG1hdHJpY2VzVGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0Y29uc3QgY29sb3JzVGV4dHVyZSA9IHRoaXMuX2NvbG9yc1RleHR1cmU7XHJcblx0XHRpZiAoIGNvbG9yc1RleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRfd2hpdGVDb2xvci50b0FycmF5KCBjb2xvcnNUZXh0dXJlLmltYWdlLmRhdGEsIGRyYXdJZCAqIDQgKTtcclxuXHRcdFx0Y29sb3JzVGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuX3Zpc2liaWxpdHlDaGFuZ2VkID0gdHJ1ZTtcclxuXHRcdHJldHVybiBkcmF3SWQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyB0aGUgZ2l2ZW4gZ2VvbWV0cnkgdG8gdGhlIGJhdGNoIGFuZCByZXR1cm5zIHRoZSBhc3NvY2lhdGVkXHJcblx0ICogZ2VvbWV0cnkgaWQgcmVmZXJyaW5nIHRvIGl0IHRvIGJlIHVzZWQgaW4gb3RoZXIgZnVuY3Rpb25zLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCdWZmZXJHZW9tZXRyeX0gZ2VvbWV0cnkgLSBUaGUgZ2VvbWV0cnkgdG8gYWRkLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbcmVzZXJ2ZWRWZXJ0ZXhDb3VudD0tMV0gLSBPcHRpb25hbCBwYXJhbWV0ZXIgc3BlY2lmeWluZyB0aGUgYW1vdW50IG9mXHJcblx0ICogdmVydGV4IGJ1ZmZlciBzcGFjZSB0byByZXNlcnZlIGZvciB0aGUgYWRkZWQgZ2VvbWV0cnkuIFRoaXMgaXMgbmVjZXNzYXJ5IGlmIGl0IGlzIHBsYW5uZWRcclxuXHQgKiB0byBzZXQgYSBuZXcgZ2VvbWV0cnkgYXQgdGhpcyBpbmRleCBhdCBhIGxhdGVyIHRpbWUgdGhhdCBpcyBsYXJnZXIgdGhhbiB0aGUgb3JpZ2luYWwgZ2VvbWV0cnkuXHJcblx0ICogRGVmYXVsdHMgdG8gdGhlIGxlbmd0aCBvZiB0aGUgZ2l2ZW4gZ2VvbWV0cnkgdmVydGV4IGJ1ZmZlci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3Jlc2VydmVkSW5kZXhDb3VudD0tMV0gLSBPcHRpb25hbCBwYXJhbWV0ZXIgc3BlY2lmeWluZyB0aGUgYW1vdW50IG9mIGluZGV4XHJcblx0ICogYnVmZmVyIHNwYWNlIHRvIHJlc2VydmUgZm9yIHRoZSBhZGRlZCBnZW9tZXRyeS4gVGhpcyBpcyBuZWNlc3NhcnkgaWYgaXQgaXMgcGxhbm5lZCB0byBzZXQgYVxyXG5cdCAqIG5ldyBnZW9tZXRyeSBhdCB0aGlzIGluZGV4IGF0IGEgbGF0ZXIgdGltZSB0aGF0IGlzIGxhcmdlciB0aGFuIHRoZSBvcmlnaW5hbCBnZW9tZXRyeS4gRGVmYXVsdHMgdG9cclxuXHQgKiB0aGUgbGVuZ3RoIG9mIHRoZSBnaXZlbiBnZW9tZXRyeSBpbmRleCBidWZmZXIuXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgZ2VvbWV0cnkgSUQuXHJcblx0ICovXHJcblx0YWRkR2VvbWV0cnkoIGdlb21ldHJ5LCByZXNlcnZlZFZlcnRleENvdW50ID0gLSAxLCByZXNlcnZlZEluZGV4Q291bnQgPSAtIDEgKSB7XHJcblxyXG5cdFx0dGhpcy5faW5pdGlhbGl6ZUdlb21ldHJ5KCBnZW9tZXRyeSApO1xyXG5cclxuXHRcdHRoaXMuX3ZhbGlkYXRlR2VvbWV0cnkoIGdlb21ldHJ5ICk7XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnlJbmZvID0ge1xyXG5cdFx0XHQvLyBnZW9tZXRyeSBpbmZvcm1hdGlvblxyXG5cdFx0XHR2ZXJ0ZXhTdGFydDogLSAxLFxyXG5cdFx0XHR2ZXJ0ZXhDb3VudDogLSAxLFxyXG5cdFx0XHRyZXNlcnZlZFZlcnRleENvdW50OiAtIDEsXHJcblxyXG5cdFx0XHRpbmRleFN0YXJ0OiAtIDEsXHJcblx0XHRcdGluZGV4Q291bnQ6IC0gMSxcclxuXHRcdFx0cmVzZXJ2ZWRJbmRleENvdW50OiAtIDEsXHJcblxyXG5cdFx0XHQvLyBkcmF3IHJhbmdlIGluZm9ybWF0aW9uXHJcblx0XHRcdHN0YXJ0OiAtIDEsXHJcblx0XHRcdGNvdW50OiAtIDEsXHJcblxyXG5cdFx0XHQvLyBzdGF0ZVxyXG5cdFx0XHRib3VuZGluZ0JveDogbnVsbCxcclxuXHRcdFx0Ym91bmRpbmdTcGhlcmU6IG51bGwsXHJcblx0XHRcdGFjdGl2ZTogdHJ1ZSxcclxuXHRcdH07XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnlJbmZvTGlzdCA9IHRoaXMuX2dlb21ldHJ5SW5mbztcclxuXHRcdGdlb21ldHJ5SW5mby52ZXJ0ZXhTdGFydCA9IHRoaXMuX25leHRWZXJ0ZXhTdGFydDtcclxuXHRcdGdlb21ldHJ5SW5mby5yZXNlcnZlZFZlcnRleENvdW50ID0gcmVzZXJ2ZWRWZXJ0ZXhDb3VudCA9PT0gLSAxID8gZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCAncG9zaXRpb24nICkuY291bnQgOiByZXNlcnZlZFZlcnRleENvdW50O1xyXG5cclxuXHRcdGNvbnN0IGluZGV4ID0gZ2VvbWV0cnkuZ2V0SW5kZXgoKTtcclxuXHRcdGNvbnN0IGhhc0luZGV4ID0gaW5kZXggIT09IG51bGw7XHJcblx0XHRpZiAoIGhhc0luZGV4ICkge1xyXG5cclxuXHRcdFx0Z2VvbWV0cnlJbmZvLmluZGV4U3RhcnQgPSB0aGlzLl9uZXh0SW5kZXhTdGFydDtcclxuXHRcdFx0Z2VvbWV0cnlJbmZvLnJlc2VydmVkSW5kZXhDb3VudCA9IHJlc2VydmVkSW5kZXhDb3VudCA9PT0gLSAxID8gaW5kZXguY291bnQgOiByZXNlcnZlZEluZGV4Q291bnQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChcclxuXHRcdFx0Z2VvbWV0cnlJbmZvLmluZGV4U3RhcnQgIT09IC0gMSAmJlxyXG5cdFx0XHRnZW9tZXRyeUluZm8uaW5kZXhTdGFydCArIGdlb21ldHJ5SW5mby5yZXNlcnZlZEluZGV4Q291bnQgPiB0aGlzLl9tYXhJbmRleENvdW50IHx8XHJcblx0XHRcdGdlb21ldHJ5SW5mby52ZXJ0ZXhTdGFydCArIGdlb21ldHJ5SW5mby5yZXNlcnZlZFZlcnRleENvdW50ID4gdGhpcy5fbWF4VmVydGV4Q291bnRcclxuXHRcdCkge1xyXG5cclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuQmF0Y2hlZE1lc2g6IFJlc2VydmVkIHNwYWNlIHJlcXVlc3QgZXhjZWVkcyB0aGUgbWF4aW11bSBidWZmZXIgc2l6ZS4nICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIHVwZGF0ZSBpZFxyXG5cdFx0bGV0IGdlb21ldHJ5SWQ7XHJcblx0XHRpZiAoIHRoaXMuX2F2YWlsYWJsZUdlb21ldHJ5SWRzLmxlbmd0aCA+IDAgKSB7XHJcblxyXG5cdFx0XHR0aGlzLl9hdmFpbGFibGVHZW9tZXRyeUlkcy5zb3J0KCBhc2NJZFNvcnQgKTtcclxuXHJcblx0XHRcdGdlb21ldHJ5SWQgPSB0aGlzLl9hdmFpbGFibGVHZW9tZXRyeUlkcy5zaGlmdCgpO1xyXG5cdFx0XHRnZW9tZXRyeUluZm9MaXN0WyBnZW9tZXRyeUlkIF0gPSBnZW9tZXRyeUluZm87XHJcblxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRnZW9tZXRyeUlkID0gdGhpcy5fZ2VvbWV0cnlDb3VudDtcclxuXHRcdFx0dGhpcy5fZ2VvbWV0cnlDb3VudCArKztcclxuXHRcdFx0Z2VvbWV0cnlJbmZvTGlzdC5wdXNoKCBnZW9tZXRyeUluZm8gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gdXBkYXRlIHRoZSBnZW9tZXRyeVxyXG5cdFx0dGhpcy5zZXRHZW9tZXRyeUF0KCBnZW9tZXRyeUlkLCBnZW9tZXRyeSApO1xyXG5cclxuXHRcdC8vIGluY3JlbWVudCB0aGUgbmV4dCBnZW9tZXRyeSBwb3NpdGlvblxyXG5cdFx0dGhpcy5fbmV4dEluZGV4U3RhcnQgPSBnZW9tZXRyeUluZm8uaW5kZXhTdGFydCArIGdlb21ldHJ5SW5mby5yZXNlcnZlZEluZGV4Q291bnQ7XHJcblx0XHR0aGlzLl9uZXh0VmVydGV4U3RhcnQgPSBnZW9tZXRyeUluZm8udmVydGV4U3RhcnQgKyBnZW9tZXRyeUluZm8ucmVzZXJ2ZWRWZXJ0ZXhDb3VudDtcclxuXHJcblx0XHRyZXR1cm4gZ2VvbWV0cnlJZDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXBsYWNlcyB0aGUgZ2VvbWV0cnkgYXQgdGhlIGdpdmVuIElEIHdpdGggdGhlIHByb3ZpZGVkIGdlb21ldHJ5LiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlcmVcclxuXHQgKiBpcyBub3QgZW5vdWdoIHNwYWNlIHJlc2VydmVkIGZvciBnZW9tZXRyeS4gQ2FsbGluZyB0aGlzIHdpbGwgY2hhbmdlIGFsbCBpbnN0YW5jZXMgdGhhdCBhcmVcclxuXHQgKiByZW5kZXJpbmcgdGhhdCBnZW9tZXRyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBnZW9tZXRyeUlkIC0gVGhlIElEIG9mIHRoZSBnZW9tZXRyeSB0aGF0IHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIHRoZSBnaXZlbiBnZW9tZXRyeS5cclxuXHQgKiBAcGFyYW0ge0J1ZmZlckdlb21ldHJ5fSBnZW9tZXRyeSAtIFRoZSBuZXcgZ2VvbWV0cnkuXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgZ2VvbWV0cnkgSUQuXHJcblx0ICovXHJcblx0c2V0R2VvbWV0cnlBdCggZ2VvbWV0cnlJZCwgZ2VvbWV0cnkgKSB7XHJcblxyXG5cdFx0aWYgKCBnZW9tZXRyeUlkID49IHRoaXMuX2dlb21ldHJ5Q291bnQgKSB7XHJcblxyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5CYXRjaGVkTWVzaDogTWF4aW11bSBnZW9tZXRyeSBjb3VudCByZWFjaGVkLicgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5fdmFsaWRhdGVHZW9tZXRyeSggZ2VvbWV0cnkgKTtcclxuXHJcblx0XHRjb25zdCBiYXRjaEdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcclxuXHRcdGNvbnN0IGhhc0luZGV4ID0gYmF0Y2hHZW9tZXRyeS5nZXRJbmRleCgpICE9PSBudWxsO1xyXG5cdFx0Y29uc3QgZHN0SW5kZXggPSBiYXRjaEdlb21ldHJ5LmdldEluZGV4KCk7XHJcblx0XHRjb25zdCBzcmNJbmRleCA9IGdlb21ldHJ5LmdldEluZGV4KCk7XHJcblx0XHRjb25zdCBnZW9tZXRyeUluZm8gPSB0aGlzLl9nZW9tZXRyeUluZm9bIGdlb21ldHJ5SWQgXTtcclxuXHRcdGlmIChcclxuXHRcdFx0aGFzSW5kZXggJiZcclxuXHRcdFx0c3JjSW5kZXguY291bnQgPiBnZW9tZXRyeUluZm8ucmVzZXJ2ZWRJbmRleENvdW50IHx8XHJcblx0XHRcdGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24uY291bnQgPiBnZW9tZXRyeUluZm8ucmVzZXJ2ZWRWZXJ0ZXhDb3VudFxyXG5cdFx0KSB7XHJcblxyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5CYXRjaGVkTWVzaDogUmVzZXJ2ZWQgc3BhY2Ugbm90IGxhcmdlIGVub3VnaCBmb3IgcHJvdmlkZWQgZ2VvbWV0cnkuJyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBjb3B5IGdlb21ldHJ5IGJ1ZmZlciBkYXRhIG92ZXJcclxuXHRcdGNvbnN0IHZlcnRleFN0YXJ0ID0gZ2VvbWV0cnlJbmZvLnZlcnRleFN0YXJ0O1xyXG5cdFx0Y29uc3QgcmVzZXJ2ZWRWZXJ0ZXhDb3VudCA9IGdlb21ldHJ5SW5mby5yZXNlcnZlZFZlcnRleENvdW50O1xyXG5cdFx0Z2VvbWV0cnlJbmZvLnZlcnRleENvdW50ID0gZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCAncG9zaXRpb24nICkuY291bnQ7XHJcblxyXG5cdFx0Zm9yICggY29uc3QgYXR0cmlidXRlTmFtZSBpbiBiYXRjaEdlb21ldHJ5LmF0dHJpYnV0ZXMgKSB7XHJcblxyXG5cdFx0XHQvLyBjb3B5IGF0dHJpYnV0ZSBkYXRhXHJcblx0XHRcdGNvbnN0IHNyY0F0dHJpYnV0ZSA9IGdlb21ldHJ5LmdldEF0dHJpYnV0ZSggYXR0cmlidXRlTmFtZSApO1xyXG5cdFx0XHRjb25zdCBkc3RBdHRyaWJ1dGUgPSBiYXRjaEdlb21ldHJ5LmdldEF0dHJpYnV0ZSggYXR0cmlidXRlTmFtZSApO1xyXG5cdFx0XHRjb3B5QXR0cmlidXRlRGF0YSggc3JjQXR0cmlidXRlLCBkc3RBdHRyaWJ1dGUsIHZlcnRleFN0YXJ0ICk7XHJcblxyXG5cdFx0XHQvLyBmaWxsIHRoZSByZXN0IGluIHdpdGggemVyb2VzXHJcblx0XHRcdGNvbnN0IGl0ZW1TaXplID0gc3JjQXR0cmlidXRlLml0ZW1TaXplO1xyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IHNyY0F0dHJpYnV0ZS5jb3VudCwgbCA9IHJlc2VydmVkVmVydGV4Q291bnQ7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBpbmRleCA9IHZlcnRleFN0YXJ0ICsgaTtcclxuXHRcdFx0XHRmb3IgKCBsZXQgYyA9IDA7IGMgPCBpdGVtU2l6ZTsgYyArKyApIHtcclxuXHJcblx0XHRcdFx0XHRkc3RBdHRyaWJ1dGUuc2V0Q29tcG9uZW50KCBpbmRleCwgYywgMCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRkc3RBdHRyaWJ1dGUubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cdFx0XHRkc3RBdHRyaWJ1dGUuYWRkVXBkYXRlUmFuZ2UoIHZlcnRleFN0YXJ0ICogaXRlbVNpemUsIHJlc2VydmVkVmVydGV4Q291bnQgKiBpdGVtU2l6ZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBjb3B5IGluZGV4XHJcblx0XHRpZiAoIGhhc0luZGV4ICkge1xyXG5cclxuXHRcdFx0Y29uc3QgaW5kZXhTdGFydCA9IGdlb21ldHJ5SW5mby5pbmRleFN0YXJ0O1xyXG5cdFx0XHRjb25zdCByZXNlcnZlZEluZGV4Q291bnQgPSBnZW9tZXRyeUluZm8ucmVzZXJ2ZWRJbmRleENvdW50O1xyXG5cdFx0XHRnZW9tZXRyeUluZm8uaW5kZXhDb3VudCA9IGdlb21ldHJ5LmdldEluZGV4KCkuY291bnQ7XHJcblxyXG5cdFx0XHQvLyBjb3B5IGluZGV4IGRhdGEgb3ZlclxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBzcmNJbmRleC5jb3VudDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0ZHN0SW5kZXguc2V0WCggaW5kZXhTdGFydCArIGksIHZlcnRleFN0YXJ0ICsgc3JjSW5kZXguZ2V0WCggaSApICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBmaWxsIHRoZSByZXN0IGluIHdpdGggemVyb2VzXHJcblx0XHRcdGZvciAoIGxldCBpID0gc3JjSW5kZXguY291bnQsIGwgPSByZXNlcnZlZEluZGV4Q291bnQ7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRkc3RJbmRleC5zZXRYKCBpbmRleFN0YXJ0ICsgaSwgdmVydGV4U3RhcnQgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGRzdEluZGV4Lm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHRcdFx0ZHN0SW5kZXguYWRkVXBkYXRlUmFuZ2UoIGluZGV4U3RhcnQsIGdlb21ldHJ5SW5mby5yZXNlcnZlZEluZGV4Q291bnQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gdXBkYXRlIHRoZSBkcmF3IHJhbmdlXHJcblx0XHRnZW9tZXRyeUluZm8uc3RhcnQgPSBoYXNJbmRleCA/IGdlb21ldHJ5SW5mby5pbmRleFN0YXJ0IDogZ2VvbWV0cnlJbmZvLnZlcnRleFN0YXJ0O1xyXG5cdFx0Z2VvbWV0cnlJbmZvLmNvdW50ID0gaGFzSW5kZXggPyBnZW9tZXRyeUluZm8uaW5kZXhDb3VudCA6IGdlb21ldHJ5SW5mby52ZXJ0ZXhDb3VudDtcclxuXHJcblx0XHQvLyBzdG9yZSB0aGUgYm91bmRpbmcgYm94ZXNcclxuXHRcdGdlb21ldHJ5SW5mby5ib3VuZGluZ0JveCA9IG51bGw7XHJcblx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nQm94ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0Z2VvbWV0cnlJbmZvLmJvdW5kaW5nQm94ID0gZ2VvbWV0cnkuYm91bmRpbmdCb3guY2xvbmUoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Z2VvbWV0cnlJbmZvLmJvdW5kaW5nU3BoZXJlID0gbnVsbDtcclxuXHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRnZW9tZXRyeUluZm8uYm91bmRpbmdTcGhlcmUgPSBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLl92aXNpYmlsaXR5Q2hhbmdlZCA9IHRydWU7XHJcblx0XHRyZXR1cm4gZ2VvbWV0cnlJZDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWxldGVzIHRoZSBnZW9tZXRyeSBkZWZpbmVkIGJ5IHRoZSBnaXZlbiBJRCBmcm9tIHRoaXMgYmF0Y2guIEFueSBpbnN0YW5jZXMgcmVmZXJlbmNpbmdcclxuXHQgKiB0aGlzIGdlb21ldHJ5IHdpbGwgYWxzbyBiZSByZW1vdmVkIGFzIGEgc2lkZSBlZmZlY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZ2VvbWV0cnlJZCAtIFRoZSBJRCBvZiB0aGUgZ2VvbWV0cnkgdG8gcmVtb3ZlIGZyb20gdGhlIGJhdGNoLlxyXG5cdCAqIEByZXR1cm4ge0JhdGNoZWRNZXNofSBBIHJlZmVyZW5jZSB0byB0aGlzIGJhdGNoZWQgbWVzaC5cclxuXHQgKi9cclxuXHRkZWxldGVHZW9tZXRyeSggZ2VvbWV0cnlJZCApIHtcclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeUluZm9MaXN0ID0gdGhpcy5fZ2VvbWV0cnlJbmZvO1xyXG5cdFx0aWYgKCBnZW9tZXRyeUlkID49IGdlb21ldHJ5SW5mb0xpc3QubGVuZ3RoIHx8IGdlb21ldHJ5SW5mb0xpc3RbIGdlb21ldHJ5SWQgXS5hY3RpdmUgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGRlbGV0ZSBhbnkgaW5zdGFuY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGdlb21ldHJ5XHJcblx0XHRjb25zdCBpbnN0YW5jZUluZm8gPSB0aGlzLl9pbnN0YW5jZUluZm87XHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBpbnN0YW5jZUluZm8ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGlmICggaW5zdGFuY2VJbmZvWyBpIF0uYWN0aXZlICYmIGluc3RhbmNlSW5mb1sgaSBdLmdlb21ldHJ5SW5kZXggPT09IGdlb21ldHJ5SWQgKSB7XHJcblxyXG5cdFx0XHRcdHRoaXMuZGVsZXRlSW5zdGFuY2UoIGkgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Z2VvbWV0cnlJbmZvTGlzdFsgZ2VvbWV0cnlJZCBdLmFjdGl2ZSA9IGZhbHNlO1xyXG5cdFx0dGhpcy5fYXZhaWxhYmxlR2VvbWV0cnlJZHMucHVzaCggZ2VvbWV0cnlJZCApO1xyXG5cdFx0dGhpcy5fdmlzaWJpbGl0eUNoYW5nZWQgPSB0cnVlO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlbGV0ZXMgYW4gZXhpc3RpbmcgaW5zdGFuY2UgZnJvbSB0aGUgYmF0Y2ggdXNpbmcgdGhlIGdpdmVuIElELlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluc3RhbmNlSWQgLSBUaGUgSUQgb2YgdGhlIGluc3RhbmNlIHRvIHJlbW92ZSBmcm9tIHRoZSBiYXRjaC5cclxuXHQgKiBAcmV0dXJuIHtCYXRjaGVkTWVzaH0gQSByZWZlcmVuY2UgdG8gdGhpcyBiYXRjaGVkIG1lc2guXHJcblx0ICovXHJcblx0ZGVsZXRlSW5zdGFuY2UoIGluc3RhbmNlSWQgKSB7XHJcblxyXG5cdFx0dGhpcy52YWxpZGF0ZUluc3RhbmNlSWQoIGluc3RhbmNlSWQgKTtcclxuXHJcblx0XHR0aGlzLl9pbnN0YW5jZUluZm9bIGluc3RhbmNlSWQgXS5hY3RpdmUgPSBmYWxzZTtcclxuXHRcdHRoaXMuX2F2YWlsYWJsZUluc3RhbmNlSWRzLnB1c2goIGluc3RhbmNlSWQgKTtcclxuXHRcdHRoaXMuX3Zpc2liaWxpdHlDaGFuZ2VkID0gdHJ1ZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXBhY2tzIHRoZSBzdWIgZ2VvbWV0cmllcyBpbiBbbmFtZV0gdG8gcmVtb3ZlIGFueSB1bnVzZWQgc3BhY2UgcmVtYWluaW5nIGZyb21cclxuXHQgKiBwcmV2aW91c2x5IGRlbGV0ZWQgZ2VvbWV0cnksIGZyZWVpbmcgdXAgc3BhY2UgdG8gYWRkIG5ldyBnZW9tZXRyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbnN0YW5jZUlkIC0gVGhlIElEIG9mIHRoZSBpbnN0YW5jZSB0byByZW1vdmUgZnJvbSB0aGUgYmF0Y2guXHJcblx0ICogQHJldHVybiB7QmF0Y2hlZE1lc2h9IEEgcmVmZXJlbmNlIHRvIHRoaXMgYmF0Y2hlZCBtZXNoLlxyXG5cdCAqL1xyXG5cdG9wdGltaXplKCkge1xyXG5cclxuXHRcdC8vIHRyYWNrIHRoZSBuZXh0IGluZGljZXMgdG8gY29weSBkYXRhIHRvXHJcblx0XHRsZXQgbmV4dFZlcnRleFN0YXJ0ID0gMDtcclxuXHRcdGxldCBuZXh0SW5kZXhTdGFydCA9IDA7XHJcblxyXG5cdFx0Ly8gSXRlcmF0ZSBvdmVyIGFsbCBnZW9tZXRyeSByYW5nZXMgaW4gb3JkZXIgc29ydGVkIGZyb20gZWFybGllc3QgaW4gdGhlIGdlb21ldHJ5IGJ1ZmZlciB0byBsYXRlc3RcclxuXHRcdC8vIGluIHRoZSBnZW9tZXRyeSBidWZmZXIuIEJlY2F1c2UgZHJhdyByYW5nZSBvYmplY3RzIGNhbiBiZSByZXVzZWQgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIG9mIHRoZWlyIG9yZGVyLlxyXG5cdFx0Y29uc3QgZ2VvbWV0cnlJbmZvTGlzdCA9IHRoaXMuX2dlb21ldHJ5SW5mbztcclxuXHRcdGNvbnN0IGluZGljZXMgPSBnZW9tZXRyeUluZm9MaXN0XHJcblx0XHRcdC5tYXAoICggZSwgaSApID0+IGkgKVxyXG5cdFx0XHQuc29ydCggKCBhLCBiICkgPT4ge1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gZ2VvbWV0cnlJbmZvTGlzdFsgYSBdLnZlcnRleFN0YXJ0IC0gZ2VvbWV0cnlJbmZvTGlzdFsgYiBdLnZlcnRleFN0YXJ0O1xyXG5cclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGdlb21ldHJ5SW5mb0xpc3QubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdC8vIGlmIGEgZ2VvbWV0cnkgcmFuZ2UgaXMgaW5hY3RpdmUgdGhlbiBkb24ndCBjb3B5IGFueXRoaW5nXHJcblx0XHRcdGNvbnN0IGluZGV4ID0gaW5kaWNlc1sgaSBdO1xyXG5cdFx0XHRjb25zdCBnZW9tZXRyeUluZm8gPSBnZW9tZXRyeUluZm9MaXN0WyBpbmRleCBdO1xyXG5cdFx0XHRpZiAoIGdlb21ldHJ5SW5mby5hY3RpdmUgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0XHRjb250aW51ZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIGlmIGEgZ2VvbWV0cnkgY29udGFpbnMgYW4gaW5kZXggYnVmZmVyIHRoZW4gc2hpZnQgaXQsIGFzIHdlbGxcclxuXHRcdFx0aWYgKCBnZW9tZXRyeS5pbmRleCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBnZW9tZXRyeUluZm8uaW5kZXhTdGFydCAhPT0gbmV4dEluZGV4U3RhcnQgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgeyBpbmRleFN0YXJ0LCB2ZXJ0ZXhTdGFydCwgcmVzZXJ2ZWRJbmRleENvdW50IH0gPSBnZW9tZXRyeUluZm87XHJcblx0XHRcdFx0XHRjb25zdCBpbmRleCA9IGdlb21ldHJ5LmluZGV4O1xyXG5cdFx0XHRcdFx0Y29uc3QgYXJyYXkgPSBpbmRleC5hcnJheTtcclxuXHJcblx0XHRcdFx0XHQvLyBzaGlmdCB0aGUgaW5kZXggcG9pbnRlcnMgYmFzZWQgb24gaG93IHRoZSB2ZXJ0ZXggZGF0YSB3aWxsIHNoaWZ0XHJcblx0XHRcdFx0XHQvLyBhZGp1c3RpbmcgdGhlIGluZGV4IG11c3QgaGFwcGVuIGZpcnN0IHNvIHRoZSBvcmlnaW5hbCB2ZXJ0ZXggc3RhcnQgdmFsdWUgaXMgYXZhaWxhYmxlXHJcblx0XHRcdFx0XHRjb25zdCBlbGVtZW50RGVsdGEgPSBuZXh0VmVydGV4U3RhcnQgLSB2ZXJ0ZXhTdGFydDtcclxuXHRcdFx0XHRcdGZvciAoIGxldCBqID0gaW5kZXhTdGFydDsgaiA8IGluZGV4U3RhcnQgKyByZXNlcnZlZEluZGV4Q291bnQ7IGogKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRhcnJheVsgaiBdID0gYXJyYXlbIGogXSArIGVsZW1lbnREZWx0YTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aW5kZXguYXJyYXkuY29weVdpdGhpbiggbmV4dEluZGV4U3RhcnQsIGluZGV4U3RhcnQsIGluZGV4U3RhcnQgKyByZXNlcnZlZEluZGV4Q291bnQgKTtcclxuXHRcdFx0XHRcdGluZGV4LmFkZFVwZGF0ZVJhbmdlKCBuZXh0SW5kZXhTdGFydCwgcmVzZXJ2ZWRJbmRleENvdW50ICk7XHJcblxyXG5cdFx0XHRcdFx0Z2VvbWV0cnlJbmZvLmluZGV4U3RhcnQgPSBuZXh0SW5kZXhTdGFydDtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRuZXh0SW5kZXhTdGFydCArPSBnZW9tZXRyeUluZm8ucmVzZXJ2ZWRJbmRleENvdW50O1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gaWYgYSBnZW9tZXRyeSBuZWVkcyB0byBiZSBtb3ZlZCB0aGVuIGNvcHkgYXR0cmlidXRlIGRhdGEgdG8gb3ZlcndyaXRlIHVudXNlZCBzcGFjZVxyXG5cdFx0XHRpZiAoIGdlb21ldHJ5SW5mby52ZXJ0ZXhTdGFydCAhPT0gbmV4dFZlcnRleFN0YXJ0ICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB7IHZlcnRleFN0YXJ0LCByZXNlcnZlZFZlcnRleENvdW50IH0gPSBnZW9tZXRyeUluZm87XHJcblx0XHRcdFx0Y29uc3QgYXR0cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXM7XHJcblx0XHRcdFx0Zm9yICggY29uc3Qga2V5IGluIGF0dHJpYnV0ZXMgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgYXR0cmlidXRlID0gYXR0cmlidXRlc1sga2V5IF07XHJcblx0XHRcdFx0XHRjb25zdCB7IGFycmF5LCBpdGVtU2l6ZSB9ID0gYXR0cmlidXRlO1xyXG5cdFx0XHRcdFx0YXJyYXkuY29weVdpdGhpbiggbmV4dFZlcnRleFN0YXJ0ICogaXRlbVNpemUsIHZlcnRleFN0YXJ0ICogaXRlbVNpemUsICggdmVydGV4U3RhcnQgKyByZXNlcnZlZFZlcnRleENvdW50ICkgKiBpdGVtU2l6ZSApO1xyXG5cdFx0XHRcdFx0YXR0cmlidXRlLmFkZFVwZGF0ZVJhbmdlKCBuZXh0VmVydGV4U3RhcnQgKiBpdGVtU2l6ZSwgcmVzZXJ2ZWRWZXJ0ZXhDb3VudCAqIGl0ZW1TaXplICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Z2VvbWV0cnlJbmZvLnZlcnRleFN0YXJ0ID0gbmV4dFZlcnRleFN0YXJ0O1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0bmV4dFZlcnRleFN0YXJ0ICs9IGdlb21ldHJ5SW5mby5yZXNlcnZlZFZlcnRleENvdW50O1xyXG5cdFx0XHRnZW9tZXRyeUluZm8uc3RhcnQgPSBnZW9tZXRyeS5pbmRleCA/IGdlb21ldHJ5SW5mby5pbmRleFN0YXJ0IDogZ2VvbWV0cnlJbmZvLnZlcnRleFN0YXJ0O1xyXG5cclxuXHRcdFx0Ly8gc3RlcCB0aGUgbmV4dCBnZW9tZXRyeSBwb2ludHMgdG8gdGhlIHNoaWZ0ZWQgcG9zaXRpb25cclxuXHRcdFx0dGhpcy5fbmV4dEluZGV4U3RhcnQgPSBnZW9tZXRyeS5pbmRleCA/IGdlb21ldHJ5SW5mby5pbmRleFN0YXJ0ICsgZ2VvbWV0cnlJbmZvLnJlc2VydmVkSW5kZXhDb3VudCA6IDA7XHJcblx0XHRcdHRoaXMuX25leHRWZXJ0ZXhTdGFydCA9IGdlb21ldHJ5SW5mby52ZXJ0ZXhTdGFydCArIGdlb21ldHJ5SW5mby5yZXNlcnZlZFZlcnRleENvdW50O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBib3VuZGluZyBib3ggZm9yIHRoZSBnaXZlbiBnZW9tZXRyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBnZW9tZXRyeUlkIC0gVGhlIElEIG9mIHRoZSBnZW9tZXRyeSB0byByZXR1cm4gdGhlIGJvdW5kaW5nIGJveCBmb3IuXHJcblx0ICogQHBhcmFtIHtCb3gzfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IG9iamVjdCB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGhvZCdzIHJlc3VsdC5cclxuXHQgKiBAcmV0dXJuIHtCb3gzfG51bGx9IFRoZSBnZW9tZXRyeSdzIGJvdW5kaW5nIGJveC4gUmV0dXJucyBgbnVsbGAgaWYgbm8gZ2VvbWV0cnkgaGFzIGJlZW4gZm91bmQgZm9yIHRoZSBnaXZlbiBJRC5cclxuXHQgKi9cclxuXHRnZXRCb3VuZGluZ0JveEF0KCBnZW9tZXRyeUlkLCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0aWYgKCBnZW9tZXRyeUlkID49IHRoaXMuX2dlb21ldHJ5Q291bnQgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gbnVsbDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gY29tcHV0ZSBib3VuZGluZyBib3hcclxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcclxuXHRcdGNvbnN0IGdlb21ldHJ5SW5mbyA9IHRoaXMuX2dlb21ldHJ5SW5mb1sgZ2VvbWV0cnlJZCBdO1xyXG5cdFx0aWYgKCBnZW9tZXRyeUluZm8uYm91bmRpbmdCb3ggPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBib3ggPSBuZXcgQm94MygpO1xyXG5cdFx0XHRjb25zdCBpbmRleCA9IGdlb21ldHJ5LmluZGV4O1xyXG5cdFx0XHRjb25zdCBwb3NpdGlvbiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XHJcblx0XHRcdGZvciAoIGxldCBpID0gZ2VvbWV0cnlJbmZvLnN0YXJ0LCBsID0gZ2VvbWV0cnlJbmZvLnN0YXJ0ICsgZ2VvbWV0cnlJbmZvLmNvdW50OyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0bGV0IGl2ID0gaTtcclxuXHRcdFx0XHRpZiAoIGluZGV4ICkge1xyXG5cclxuXHRcdFx0XHRcdGl2ID0gaW5kZXguZ2V0WCggaXYgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRib3guZXhwYW5kQnlQb2ludCggX3ZlY3Rvci5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgaXYgKSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Z2VvbWV0cnlJbmZvLmJvdW5kaW5nQm94ID0gYm94O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0YXJnZXQuY29weSggZ2VvbWV0cnlJbmZvLmJvdW5kaW5nQm94ICk7XHJcblx0XHRyZXR1cm4gdGFyZ2V0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGJvdW5kaW5nIHNwaGVyZSBmb3IgdGhlIGdpdmVuIGdlb21ldHJ5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGdlb21ldHJ5SWQgLSBUaGUgSUQgb2YgdGhlIGdlb21ldHJ5IHRvIHJldHVybiB0aGUgYm91bmRpbmcgc3BoZXJlIGZvci5cclxuXHQgKiBAcGFyYW0ge1NwaGVyZX0gdGFyZ2V0IC0gVGhlIHRhcmdldCBvYmplY3QgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBtZXRob2QncyByZXN1bHQuXHJcblx0ICogQHJldHVybiB7U3BoZXJlfG51bGx9IFRoZSBnZW9tZXRyeSdzIGJvdW5kaW5nIHNwaGVyZS4gUmV0dXJucyBgbnVsbGAgaWYgbm8gZ2VvbWV0cnkgaGFzIGJlZW4gZm91bmQgZm9yIHRoZSBnaXZlbiBJRC5cclxuXHQgKi9cclxuXHRnZXRCb3VuZGluZ1NwaGVyZUF0KCBnZW9tZXRyeUlkLCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0aWYgKCBnZW9tZXRyeUlkID49IHRoaXMuX2dlb21ldHJ5Q291bnQgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gbnVsbDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gY29tcHV0ZSBib3VuZGluZyBzcGhlcmVcclxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcclxuXHRcdGNvbnN0IGdlb21ldHJ5SW5mbyA9IHRoaXMuX2dlb21ldHJ5SW5mb1sgZ2VvbWV0cnlJZCBdO1xyXG5cdFx0aWYgKCBnZW9tZXRyeUluZm8uYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBzcGhlcmUgPSBuZXcgU3BoZXJlKCk7XHJcblx0XHRcdHRoaXMuZ2V0Qm91bmRpbmdCb3hBdCggZ2VvbWV0cnlJZCwgX2JveCApO1xyXG5cdFx0XHRfYm94LmdldENlbnRlciggc3BoZXJlLmNlbnRlciApO1xyXG5cclxuXHRcdFx0Y29uc3QgaW5kZXggPSBnZW9tZXRyeS5pbmRleDtcclxuXHRcdFx0Y29uc3QgcG9zaXRpb24gPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xyXG5cclxuXHRcdFx0bGV0IG1heFJhZGl1c1NxID0gMDtcclxuXHRcdFx0Zm9yICggbGV0IGkgPSBnZW9tZXRyeUluZm8uc3RhcnQsIGwgPSBnZW9tZXRyeUluZm8uc3RhcnQgKyBnZW9tZXRyeUluZm8uY291bnQ7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRsZXQgaXYgPSBpO1xyXG5cdFx0XHRcdGlmICggaW5kZXggKSB7XHJcblxyXG5cdFx0XHRcdFx0aXYgPSBpbmRleC5nZXRYKCBpdiApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdF92ZWN0b3IuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIGl2ICk7XHJcblx0XHRcdFx0bWF4UmFkaXVzU3EgPSBNYXRoLm1heCggbWF4UmFkaXVzU3EsIHNwaGVyZS5jZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQoIF92ZWN0b3IgKSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0c3BoZXJlLnJhZGl1cyA9IE1hdGguc3FydCggbWF4UmFkaXVzU3EgKTtcclxuXHRcdFx0Z2VvbWV0cnlJbmZvLmJvdW5kaW5nU3BoZXJlID0gc3BoZXJlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0YXJnZXQuY29weSggZ2VvbWV0cnlJbmZvLmJvdW5kaW5nU3BoZXJlICk7XHJcblx0XHRyZXR1cm4gdGFyZ2V0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGdpdmVuIGxvY2FsIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCB0byB0aGUgZGVmaW5lZCBpbnN0YW5jZS5cclxuXHQgKiBOZWdhdGl2ZWx5IHNjYWxlZCBtYXRyaWNlcyBhcmUgbm90IHN1cHBvcnRlZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbnN0YW5jZUlkIC0gVGhlIElEIG9mIGFuIGluc3RhbmNlIHRvIHNldCB0aGUgbWF0cml4IG9mLlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4NH0gbWF0cml4IC0gQSA0eDQgbWF0cml4IHJlcHJlc2VudGluZyB0aGUgbG9jYWwgdHJhbnNmb3JtYXRpb24gb2YgYSBzaW5nbGUgaW5zdGFuY2UuXHJcblx0ICogQHJldHVybiB7QmF0Y2hlZE1lc2h9IEEgcmVmZXJlbmNlIHRvIHRoaXMgYmF0Y2hlZCBtZXNoLlxyXG5cdCAqL1xyXG5cdHNldE1hdHJpeEF0KCBpbnN0YW5jZUlkLCBtYXRyaXggKSB7XHJcblxyXG5cdFx0dGhpcy52YWxpZGF0ZUluc3RhbmNlSWQoIGluc3RhbmNlSWQgKTtcclxuXHJcblx0XHRjb25zdCBtYXRyaWNlc1RleHR1cmUgPSB0aGlzLl9tYXRyaWNlc1RleHR1cmU7XHJcblx0XHRjb25zdCBtYXRyaWNlc0FycmF5ID0gdGhpcy5fbWF0cmljZXNUZXh0dXJlLmltYWdlLmRhdGE7XHJcblx0XHRtYXRyaXgudG9BcnJheSggbWF0cmljZXNBcnJheSwgaW5zdGFuY2VJZCAqIDE2ICk7XHJcblx0XHRtYXRyaWNlc1RleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGxvY2FsIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBvZiB0aGUgZGVmaW5lZCBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbnN0YW5jZUlkIC0gVGhlIElEIG9mIGFuIGluc3RhbmNlIHRvIGdldCB0aGUgbWF0cml4IG9mLlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4NH0gbWF0cml4IC0gVGhlIHRhcmdldCBvYmplY3QgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBtZXRob2QncyByZXN1bHQuXHJcblx0ICogQHJldHVybiB7TWF0cml4NH0gVGhlIGluc3RhbmNlJ3MgbG9jYWwgdHJhbnNmb3JtYXRpb24gbWF0cml4LlxyXG5cdCAqL1xyXG5cdGdldE1hdHJpeEF0KCBpbnN0YW5jZUlkLCBtYXRyaXggKSB7XHJcblxyXG5cdFx0dGhpcy52YWxpZGF0ZUluc3RhbmNlSWQoIGluc3RhbmNlSWQgKTtcclxuXHRcdHJldHVybiBtYXRyaXguZnJvbUFycmF5KCB0aGlzLl9tYXRyaWNlc1RleHR1cmUuaW1hZ2UuZGF0YSwgaW5zdGFuY2VJZCAqIDE2ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZ2l2ZW4gY29sb3IgdG8gdGhlIGRlZmluZWQgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5zdGFuY2VJZCAtIFRoZSBJRCBvZiBhbiBpbnN0YW5jZSB0byBzZXQgdGhlIGNvbG9yIG9mLlxyXG5cdCAqIEBwYXJhbSB7Q29sb3J9IGNvbG9yIC0gVGhlIGNvbG9yIHRvIHNldCB0aGUgaW5zdGFuY2UgdG8uXHJcblx0ICogQHJldHVybiB7QmF0Y2hlZE1lc2h9IEEgcmVmZXJlbmNlIHRvIHRoaXMgYmF0Y2hlZCBtZXNoLlxyXG5cdCAqL1xyXG5cdHNldENvbG9yQXQoIGluc3RhbmNlSWQsIGNvbG9yICkge1xyXG5cclxuXHRcdHRoaXMudmFsaWRhdGVJbnN0YW5jZUlkKCBpbnN0YW5jZUlkICk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9jb2xvcnNUZXh0dXJlID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5faW5pdENvbG9yc1RleHR1cmUoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29sb3IudG9BcnJheSggdGhpcy5fY29sb3JzVGV4dHVyZS5pbWFnZS5kYXRhLCBpbnN0YW5jZUlkICogNCApO1xyXG5cdFx0dGhpcy5fY29sb3JzVGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgY29sb3Igb2YgdGhlIGRlZmluZWQgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5zdGFuY2VJZCAtIFRoZSBJRCBvZiBhbiBpbnN0YW5jZSB0byBnZXQgdGhlIGNvbG9yIG9mLlxyXG5cdCAqIEBwYXJhbSB7Q29sb3J9IGNvbG9yIC0gVGhlIHRhcmdldCBvYmplY3QgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBtZXRob2QncyByZXN1bHQuXHJcblx0ICogQHJldHVybiB7Q29sb3J9IFRoZSBpbnN0YW5jZSdzIGNvbG9yLlxyXG5cdCAqL1xyXG5cdGdldENvbG9yQXQoIGluc3RhbmNlSWQsIGNvbG9yICkge1xyXG5cclxuXHRcdHRoaXMudmFsaWRhdGVJbnN0YW5jZUlkKCBpbnN0YW5jZUlkICk7XHJcblx0XHRyZXR1cm4gY29sb3IuZnJvbUFycmF5KCB0aGlzLl9jb2xvcnNUZXh0dXJlLmltYWdlLmRhdGEsIGluc3RhbmNlSWQgKiA0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5zdGFuY2VJZCAtIFRoZSBpZCBvZiB0aGUgaW5zdGFuY2UgdG8gc2V0IHRoZSB2aXNpYmlsaXR5IG9mLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gdmlzaWJsZSAtIFdoZXRoZXIgdGhlIGluc3RhbmNlIGlzIHZpc2libGUgb3Igbm90LlxyXG5cdCAqIEByZXR1cm4ge0JhdGNoZWRNZXNofSBBIHJlZmVyZW5jZSB0byB0aGlzIGJhdGNoZWQgbWVzaC5cclxuXHQgKi9cclxuXHRzZXRWaXNpYmxlQXQoIGluc3RhbmNlSWQsIHZpc2libGUgKSB7XHJcblxyXG5cdFx0dGhpcy52YWxpZGF0ZUluc3RhbmNlSWQoIGluc3RhbmNlSWQgKTtcclxuXHJcblx0XHRpZiAoIHRoaXMuX2luc3RhbmNlSW5mb1sgaW5zdGFuY2VJZCBdLnZpc2libGUgPT09IHZpc2libGUgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5faW5zdGFuY2VJbmZvWyBpbnN0YW5jZUlkIF0udmlzaWJsZSA9IHZpc2libGU7XHJcblx0XHR0aGlzLl92aXNpYmlsaXR5Q2hhbmdlZCA9IHRydWU7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgdmlzaWJpbGl0eSBzdGF0ZSBvZiB0aGUgZGVmaW5lZCBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbnN0YW5jZUlkIC0gVGhlIElEIG9mIGFuIGluc3RhbmNlIHRvIGdldCB0aGUgdmlzaWJpbGl0eSBzdGF0ZSBvZi5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBpbnN0YW5jZSBpcyB2aXNpYmxlIG9yIG5vdC5cclxuXHQgKi9cclxuXHRnZXRWaXNpYmxlQXQoIGluc3RhbmNlSWQgKSB7XHJcblxyXG5cdFx0dGhpcy52YWxpZGF0ZUluc3RhbmNlSWQoIGluc3RhbmNlSWQgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5faW5zdGFuY2VJbmZvWyBpbnN0YW5jZUlkIF0udmlzaWJsZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBnZW9tZXRyeSBJRCBvZiB0aGUgaW5zdGFuY2UgYXQgdGhlIGdpdmVuIGluZGV4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluc3RhbmNlSWQgLSBUaGUgSUQgb2YgdGhlIGluc3RhbmNlIHRvIHNldCB0aGUgZ2VvbWV0cnkgSUQgb2YuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGdlb21ldHJ5SWQgLSBUaGUgZ2VvbWV0cnkgSUQgdG8gYmUgdXNlIGJ5IHRoZSBpbnN0YW5jZS5cclxuXHQgKiBAcmV0dXJuIHtCYXRjaGVkTWVzaH0gQSByZWZlcmVuY2UgdG8gdGhpcyBiYXRjaGVkIG1lc2guXHJcblx0ICovXHJcblx0c2V0R2VvbWV0cnlJZEF0KCBpbnN0YW5jZUlkLCBnZW9tZXRyeUlkICkge1xyXG5cclxuXHRcdHRoaXMudmFsaWRhdGVJbnN0YW5jZUlkKCBpbnN0YW5jZUlkICk7XHJcblx0XHR0aGlzLnZhbGlkYXRlR2VvbWV0cnlJZCggZ2VvbWV0cnlJZCApO1xyXG5cclxuXHRcdHRoaXMuX2luc3RhbmNlSW5mb1sgaW5zdGFuY2VJZCBdLmdlb21ldHJ5SW5kZXggPSBnZW9tZXRyeUlkO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGdlb21ldHJ5IElEIG9mIHRoZSBkZWZpbmVkIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluc3RhbmNlSWQgLSBUaGUgSUQgb2YgYW4gaW5zdGFuY2UgdG8gZ2V0IHRoZSBnZW9tZXRyeSBJRCBvZi5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBpbnN0YW5jZSdzIGdlb21ldHJ5IElELlxyXG5cdCAqL1xyXG5cdGdldEdlb21ldHJ5SWRBdCggaW5zdGFuY2VJZCApIHtcclxuXHJcblx0XHR0aGlzLnZhbGlkYXRlSW5zdGFuY2VJZCggaW5zdGFuY2VJZCApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9pbnN0YW5jZUluZm9bIGluc3RhbmNlSWQgXS5nZW9tZXRyeUluZGV4O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdldCB0aGUgcmFuZ2UgcmVwcmVzZW50aW5nIHRoZSBzdWJzZXQgb2YgdHJpYW5nbGVzIHJlbGF0ZWQgdG8gdGhlIGF0dGFjaGVkIGdlb21ldHJ5LFxyXG5cdCAqIGluZGljYXRpbmcgdGhlIHN0YXJ0aW5nIG9mZnNldCBhbmQgY291bnQsIG9yIGBudWxsYCBpZiBpbnZhbGlkLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGdlb21ldHJ5SWQgLSBUaGUgaWQgb2YgdGhlIGdlb21ldHJ5IHRvIGdldCB0aGUgcmFuZ2Ugb2YuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFt0YXJnZXRdIC0gVGhlIHRhcmdldCBvYmplY3QgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBtZXRob2QncyByZXN1bHQuXHJcblx0ICogQHJldHVybiB7e1xyXG5cdCAqIFx0dmVydGV4U3RhcnQ6bnVtYmVyLHZlcnRleENvdW50Om51bWJlcixyZXNlcnZlZFZlcnRleENvdW50Om51bWJlcixcclxuXHQgKiBcdGluZGV4U3RhcnQ6bnVtYmVyLGluZGV4Q291bnQ6bnVtYmVyLHJlc2VydmVkSW5kZXhDb3VudDpudW1iZXIsXHJcblx0ICogXHRzdGFydDpudW1iZXIsY291bnQ6bnVtYmVyXHJcblx0ICogfX0gVGhlIHJlc3VsdCBvYmplY3Qgd2l0aCByYW5nZSBkYXRhLlxyXG5cdCAqL1xyXG5cdGdldEdlb21ldHJ5UmFuZ2VBdCggZ2VvbWV0cnlJZCwgdGFyZ2V0ID0ge30gKSB7XHJcblxyXG5cdFx0dGhpcy52YWxpZGF0ZUdlb21ldHJ5SWQoIGdlb21ldHJ5SWQgKTtcclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeUluZm8gPSB0aGlzLl9nZW9tZXRyeUluZm9bIGdlb21ldHJ5SWQgXTtcclxuXHRcdHRhcmdldC52ZXJ0ZXhTdGFydCA9IGdlb21ldHJ5SW5mby52ZXJ0ZXhTdGFydDtcclxuXHRcdHRhcmdldC52ZXJ0ZXhDb3VudCA9IGdlb21ldHJ5SW5mby52ZXJ0ZXhDb3VudDtcclxuXHRcdHRhcmdldC5yZXNlcnZlZFZlcnRleENvdW50ID0gZ2VvbWV0cnlJbmZvLnJlc2VydmVkVmVydGV4Q291bnQ7XHJcblxyXG5cdFx0dGFyZ2V0LmluZGV4U3RhcnQgPSBnZW9tZXRyeUluZm8uaW5kZXhTdGFydDtcclxuXHRcdHRhcmdldC5pbmRleENvdW50ID0gZ2VvbWV0cnlJbmZvLmluZGV4Q291bnQ7XHJcblx0XHR0YXJnZXQucmVzZXJ2ZWRJbmRleENvdW50ID0gZ2VvbWV0cnlJbmZvLnJlc2VydmVkSW5kZXhDb3VudDtcclxuXHJcblx0XHR0YXJnZXQuc3RhcnQgPSBnZW9tZXRyeUluZm8uc3RhcnQ7XHJcblx0XHR0YXJnZXQuY291bnQgPSBnZW9tZXRyeUluZm8uY291bnQ7XHJcblxyXG5cdFx0cmV0dXJuIHRhcmdldDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXNpemVzIHRoZSBuZWNlc3NhcnkgYnVmZmVycyB0byBzdXBwb3J0IHRoZSBwcm92aWRlZCBudW1iZXIgb2YgaW5zdGFuY2VzLlxyXG5cdCAqIElmIHRoZSBwcm92aWRlZCBhcmd1bWVudHMgc2hyaW5rIHRoZSBudW1iZXIgb2YgaW5zdGFuY2VzIGJ1dCB0aGVyZSBhcmUgbm90IGVub3VnaFxyXG5cdCAqIHVudXNlZCBJZHMgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdCB0aGVuIGFuIGVycm9yIGlzIHRocm93bi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBtYXhJbnN0YW5jZUNvdW50IC0gVGhlIG1heCBudW1iZXIgb2YgaW5kaXZpZHVhbCBpbnN0YW5jZXMgdGhhdCBjYW4gYmUgYWRkZWQgYW5kIHJlbmRlcmVkIGJ5IHRoZSBiYXRjaC5cclxuXHQqL1xyXG5cdHNldEluc3RhbmNlQ291bnQoIG1heEluc3RhbmNlQ291bnQgKSB7XHJcblxyXG5cdFx0Ly8gc2hyaW5rIHRoZSBhdmFpbGFibGUgaW5zdGFuY2VzIGFzIG11Y2ggYXMgcG9zc2libGVcclxuXHRcdGNvbnN0IGF2YWlsYWJsZUluc3RhbmNlSWRzID0gdGhpcy5fYXZhaWxhYmxlSW5zdGFuY2VJZHM7XHJcblx0XHRjb25zdCBpbnN0YW5jZUluZm8gPSB0aGlzLl9pbnN0YW5jZUluZm87XHJcblx0XHRhdmFpbGFibGVJbnN0YW5jZUlkcy5zb3J0KCBhc2NJZFNvcnQgKTtcclxuXHRcdHdoaWxlICggYXZhaWxhYmxlSW5zdGFuY2VJZHNbIGF2YWlsYWJsZUluc3RhbmNlSWRzLmxlbmd0aCAtIDEgXSA9PT0gaW5zdGFuY2VJbmZvLmxlbmd0aCApIHtcclxuXHJcblx0XHRcdGluc3RhbmNlSW5mby5wb3AoKTtcclxuXHRcdFx0YXZhaWxhYmxlSW5zdGFuY2VJZHMucG9wKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIHRocm93IGFuIGVycm9yIGlmIGl0IGNhbid0IGJlIHNocnVuayB0byB0aGUgZGVzaXJlZCBzaXplXHJcblx0XHRpZiAoIG1heEluc3RhbmNlQ291bnQgPCBpbnN0YW5jZUluZm8ubGVuZ3RoICkge1xyXG5cclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCBgQmF0Y2hlZE1lc2g6IEluc3RhbmNlIGlkcyBvdXRzaWRlIHRoZSByYW5nZSAkeyBtYXhJbnN0YW5jZUNvdW50IH0gYXJlIGJlaW5nIHVzZWQuIENhbm5vdCBzaHJpbmsgaW5zdGFuY2UgY291bnQuYCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBjb3B5IHRoZSBtdWx0aSBkcmF3IGNvdW50c1xyXG5cdFx0Y29uc3QgbXVsdGlEcmF3Q291bnRzID0gbmV3IEludDMyQXJyYXkoIG1heEluc3RhbmNlQ291bnQgKTtcclxuXHRcdGNvbnN0IG11bHRpRHJhd1N0YXJ0cyA9IG5ldyBJbnQzMkFycmF5KCBtYXhJbnN0YW5jZUNvdW50ICk7XHJcblx0XHRjb3B5QXJyYXlDb250ZW50cyggdGhpcy5fbXVsdGlEcmF3Q291bnRzLCBtdWx0aURyYXdDb3VudHMgKTtcclxuXHRcdGNvcHlBcnJheUNvbnRlbnRzKCB0aGlzLl9tdWx0aURyYXdTdGFydHMsIG11bHRpRHJhd1N0YXJ0cyApO1xyXG5cclxuXHRcdHRoaXMuX211bHRpRHJhd0NvdW50cyA9IG11bHRpRHJhd0NvdW50cztcclxuXHRcdHRoaXMuX211bHRpRHJhd1N0YXJ0cyA9IG11bHRpRHJhd1N0YXJ0cztcclxuXHRcdHRoaXMuX21heEluc3RhbmNlQ291bnQgPSBtYXhJbnN0YW5jZUNvdW50O1xyXG5cclxuXHRcdC8vIHVwZGF0ZSB0ZXh0dXJlIGRhdGEgZm9yIGluc3RhbmNlIHNhbXBsaW5nXHJcblx0XHRjb25zdCBpbmRpcmVjdFRleHR1cmUgPSB0aGlzLl9pbmRpcmVjdFRleHR1cmU7XHJcblx0XHRjb25zdCBtYXRyaWNlc1RleHR1cmUgPSB0aGlzLl9tYXRyaWNlc1RleHR1cmU7XHJcblx0XHRjb25zdCBjb2xvcnNUZXh0dXJlID0gdGhpcy5fY29sb3JzVGV4dHVyZTtcclxuXHJcblx0XHRpbmRpcmVjdFRleHR1cmUuZGlzcG9zZSgpO1xyXG5cdFx0dGhpcy5faW5pdEluZGlyZWN0VGV4dHVyZSgpO1xyXG5cdFx0Y29weUFycmF5Q29udGVudHMoIGluZGlyZWN0VGV4dHVyZS5pbWFnZS5kYXRhLCB0aGlzLl9pbmRpcmVjdFRleHR1cmUuaW1hZ2UuZGF0YSApO1xyXG5cclxuXHRcdG1hdHJpY2VzVGV4dHVyZS5kaXNwb3NlKCk7XHJcblx0XHR0aGlzLl9pbml0TWF0cmljZXNUZXh0dXJlKCk7XHJcblx0XHRjb3B5QXJyYXlDb250ZW50cyggbWF0cmljZXNUZXh0dXJlLmltYWdlLmRhdGEsIHRoaXMuX21hdHJpY2VzVGV4dHVyZS5pbWFnZS5kYXRhICk7XHJcblxyXG5cdFx0aWYgKCBjb2xvcnNUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0Y29sb3JzVGV4dHVyZS5kaXNwb3NlKCk7XHJcblx0XHRcdHRoaXMuX2luaXRDb2xvcnNUZXh0dXJlKCk7XHJcblx0XHRcdGNvcHlBcnJheUNvbnRlbnRzKCBjb2xvcnNUZXh0dXJlLmltYWdlLmRhdGEsIHRoaXMuX2NvbG9yc1RleHR1cmUuaW1hZ2UuZGF0YSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXNpemVzIHRoZSBhdmFpbGFibGUgc3BhY2UgaW4gdGhlIGJhdGNoJ3MgdmVydGV4IGFuZCBpbmRleCBidWZmZXIgYXR0cmlidXRlcyB0byB0aGUgcHJvdmlkZWQgc2l6ZXMuXHJcblx0ICogSWYgdGhlIHByb3ZpZGVkIGFyZ3VtZW50cyBzaHJpbmsgdGhlIGdlb21ldHJ5IGJ1ZmZlcnMgYnV0IHRoZXJlIGlzIG5vdCBlbm91Z2ggdW51c2VkIHNwYWNlIGF0IHRoZVxyXG5cdCAqIGVuZCBvZiB0aGUgZ2VvbWV0cnkgYXR0cmlidXRlcyB0aGVuIGFuIGVycm9yIGlzIHRocm93bi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBtYXhWZXJ0ZXhDb3VudCAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiB2ZXJ0aWNlcyB0byBiZSB1c2VkIGJ5IGFsbCB1bmlxdWUgZ2VvbWV0cmllcyB0byByZXNpemUgdG8uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IG1heEluZGV4Q291bnQgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgaW5kaWNlcyB0byBiZSB1c2VkIGJ5IGFsbCB1bmlxdWUgZ2VvbWV0cmllcyB0byByZXNpemUgdG8uXHJcblx0Ki9cclxuXHRzZXRHZW9tZXRyeVNpemUoIG1heFZlcnRleENvdW50LCBtYXhJbmRleENvdW50ICkge1xyXG5cclxuXHRcdC8vIENoZWNrIGlmIHdlIGNhbiBzaHJpbmsgdG8gdGhlIHJlcXVlc3RlZCB2ZXJ0ZXggYXR0cmlidXRlIHNpemVcclxuXHRcdGNvbnN0IHZhbGlkUmFuZ2VzID0gWyAuLi50aGlzLl9nZW9tZXRyeUluZm8gXS5maWx0ZXIoIGluZm8gPT4gaW5mby5hY3RpdmUgKTtcclxuXHRcdGNvbnN0IHJlcXVpcmVkVmVydGV4TGVuZ3RoID0gTWF0aC5tYXgoIC4uLnZhbGlkUmFuZ2VzLm1hcCggcmFuZ2UgPT4gcmFuZ2UudmVydGV4U3RhcnQgKyByYW5nZS5yZXNlcnZlZFZlcnRleENvdW50ICkgKTtcclxuXHRcdGlmICggcmVxdWlyZWRWZXJ0ZXhMZW5ndGggPiBtYXhWZXJ0ZXhDb3VudCApIHtcclxuXHJcblx0XHRcdHRocm93IG5ldyBFcnJvciggYEJhdGNoZWRNZXNoOiBHZW9tZXRyeSB2ZXJ0ZXggdmFsdWVzIGFyZSBiZWluZyB1c2VkIG91dHNpZGUgdGhlIHJhbmdlICR7IG1heEluZGV4Q291bnQgfS4gQ2Fubm90IHNocmluayBmdXJ0aGVyLmAgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQ2hlY2sgaWYgd2UgY2FuIHNocmluayB0byB0aGUgcmVxdWVzdGVkIGluZGV4IGF0dHJpYnV0ZSBzaXplXHJcblx0XHRpZiAoIHRoaXMuZ2VvbWV0cnkuaW5kZXggKSB7XHJcblxyXG5cdFx0XHRjb25zdCByZXF1aXJlZEluZGV4TGVuZ3RoID0gTWF0aC5tYXgoIC4uLnZhbGlkUmFuZ2VzLm1hcCggcmFuZ2UgPT4gcmFuZ2UuaW5kZXhTdGFydCArIHJhbmdlLnJlc2VydmVkSW5kZXhDb3VudCApICk7XHJcblx0XHRcdGlmICggcmVxdWlyZWRJbmRleExlbmd0aCA+IG1heEluZGV4Q291bnQgKSB7XHJcblxyXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciggYEJhdGNoZWRNZXNoOiBHZW9tZXRyeSBpbmRleCB2YWx1ZXMgYXJlIGJlaW5nIHVzZWQgb3V0c2lkZSB0aGUgcmFuZ2UgJHsgbWF4SW5kZXhDb3VudCB9LiBDYW5ub3Qgc2hyaW5rIGZ1cnRoZXIuYCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdC8vIGRpc3Bvc2Ugb2YgdGhlIHByZXZpb3VzIGdlb21ldHJ5XHJcblx0XHRjb25zdCBvbGRHZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XHJcblx0XHRvbGRHZW9tZXRyeS5kaXNwb3NlKCk7XHJcblxyXG5cdFx0Ly8gcmVjcmVhdGUgdGhlIGdlb21ldHJ5IG5lZWRlZCBiYXNlZCBvbiB0aGUgcHJldmlvdXMgdmFyaWFudFxyXG5cdFx0dGhpcy5fbWF4VmVydGV4Q291bnQgPSBtYXhWZXJ0ZXhDb3VudDtcclxuXHRcdHRoaXMuX21heEluZGV4Q291bnQgPSBtYXhJbmRleENvdW50O1xyXG5cclxuXHRcdGlmICggdGhpcy5fZ2VvbWV0cnlJbml0aWFsaXplZCApIHtcclxuXHJcblx0XHRcdHRoaXMuX2dlb21ldHJ5SW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuXHRcdFx0dGhpcy5nZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xyXG5cdFx0XHR0aGlzLl9pbml0aWFsaXplR2VvbWV0cnkoIG9sZEdlb21ldHJ5ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGNvcHkgZGF0YSBmcm9tIHRoZSBwcmV2aW91cyBnZW9tZXRyeVxyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xyXG5cdFx0aWYgKCBvbGRHZW9tZXRyeS5pbmRleCApIHtcclxuXHJcblx0XHRcdGNvcHlBcnJheUNvbnRlbnRzKCBvbGRHZW9tZXRyeS5pbmRleC5hcnJheSwgZ2VvbWV0cnkuaW5kZXguYXJyYXkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Zm9yICggY29uc3Qga2V5IGluIG9sZEdlb21ldHJ5LmF0dHJpYnV0ZXMgKSB7XHJcblxyXG5cdFx0XHRjb3B5QXJyYXlDb250ZW50cyggb2xkR2VvbWV0cnkuYXR0cmlidXRlc1sga2V5IF0uYXJyYXksIGdlb21ldHJ5LmF0dHJpYnV0ZXNbIGtleSBdLmFycmF5ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdHJheWNhc3QoIHJheWNhc3RlciwgaW50ZXJzZWN0cyApIHtcclxuXHJcblx0XHRjb25zdCBpbnN0YW5jZUluZm8gPSB0aGlzLl9pbnN0YW5jZUluZm87XHJcblx0XHRjb25zdCBnZW9tZXRyeUluZm9MaXN0ID0gdGhpcy5fZ2VvbWV0cnlJbmZvO1xyXG5cdFx0Y29uc3QgbWF0cml4V29ybGQgPSB0aGlzLm1hdHJpeFdvcmxkO1xyXG5cdFx0Y29uc3QgYmF0Y2hHZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XHJcblxyXG5cdFx0Ly8gaXRlcmF0ZSBvdmVyIGVhY2ggZ2VvbWV0cnlcclxuXHRcdF9tZXNoLm1hdGVyaWFsID0gdGhpcy5tYXRlcmlhbDtcclxuXHRcdF9tZXNoLmdlb21ldHJ5LmluZGV4ID0gYmF0Y2hHZW9tZXRyeS5pbmRleDtcclxuXHRcdF9tZXNoLmdlb21ldHJ5LmF0dHJpYnV0ZXMgPSBiYXRjaEdlb21ldHJ5LmF0dHJpYnV0ZXM7XHJcblx0XHRpZiAoIF9tZXNoLmdlb21ldHJ5LmJvdW5kaW5nQm94ID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0X21lc2guZ2VvbWV0cnkuYm91bmRpbmdCb3ggPSBuZXcgQm94MygpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIF9tZXNoLmdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0X21lc2guZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgPSBuZXcgU3BoZXJlKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGluc3RhbmNlSW5mby5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0aWYgKCAhIGluc3RhbmNlSW5mb1sgaSBdLnZpc2libGUgfHwgISBpbnN0YW5jZUluZm9bIGkgXS5hY3RpdmUgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnRpbnVlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgZ2VvbWV0cnlJZCA9IGluc3RhbmNlSW5mb1sgaSBdLmdlb21ldHJ5SW5kZXg7XHJcblx0XHRcdGNvbnN0IGdlb21ldHJ5SW5mbyA9IGdlb21ldHJ5SW5mb0xpc3RbIGdlb21ldHJ5SWQgXTtcclxuXHRcdFx0X21lc2guZ2VvbWV0cnkuc2V0RHJhd1JhbmdlKCBnZW9tZXRyeUluZm8uc3RhcnQsIGdlb21ldHJ5SW5mby5jb3VudCApO1xyXG5cclxuXHRcdFx0Ly8gZ2V0IHRoZSBpbnRlcnNlY3RzXHJcblx0XHRcdHRoaXMuZ2V0TWF0cml4QXQoIGksIF9tZXNoLm1hdHJpeFdvcmxkICkucHJlbXVsdGlwbHkoIG1hdHJpeFdvcmxkICk7XHJcblx0XHRcdHRoaXMuZ2V0Qm91bmRpbmdCb3hBdCggZ2VvbWV0cnlJZCwgX21lc2guZ2VvbWV0cnkuYm91bmRpbmdCb3ggKTtcclxuXHRcdFx0dGhpcy5nZXRCb3VuZGluZ1NwaGVyZUF0KCBnZW9tZXRyeUlkLCBfbWVzaC5nZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSApO1xyXG5cdFx0XHRfbWVzaC5yYXljYXN0KCByYXljYXN0ZXIsIF9iYXRjaEludGVyc2VjdHMgKTtcclxuXHJcblx0XHRcdC8vIGFkZCBiYXRjaCBpZCB0byB0aGUgaW50ZXJzZWN0c1xyXG5cdFx0XHRmb3IgKCBsZXQgaiA9IDAsIGwgPSBfYmF0Y2hJbnRlcnNlY3RzLmxlbmd0aDsgaiA8IGw7IGogKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGludGVyc2VjdCA9IF9iYXRjaEludGVyc2VjdHNbIGogXTtcclxuXHRcdFx0XHRpbnRlcnNlY3Qub2JqZWN0ID0gdGhpcztcclxuXHRcdFx0XHRpbnRlcnNlY3QuYmF0Y2hJZCA9IGk7XHJcblx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCBpbnRlcnNlY3QgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdF9iYXRjaEludGVyc2VjdHMubGVuZ3RoID0gMDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0X21lc2gubWF0ZXJpYWwgPSBudWxsO1xyXG5cdFx0X21lc2guZ2VvbWV0cnkuaW5kZXggPSBudWxsO1xyXG5cdFx0X21lc2guZ2VvbWV0cnkuYXR0cmlidXRlcyA9IHt9O1xyXG5cdFx0X21lc2guZ2VvbWV0cnkuc2V0RHJhd1JhbmdlKCAwLCBJbmZpbml0eSApO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLmdlb21ldHJ5ID0gc291cmNlLmdlb21ldHJ5LmNsb25lKCk7XHJcblx0XHR0aGlzLnBlck9iamVjdEZydXN0dW1DdWxsZWQgPSBzb3VyY2UucGVyT2JqZWN0RnJ1c3R1bUN1bGxlZDtcclxuXHRcdHRoaXMuc29ydE9iamVjdHMgPSBzb3VyY2Uuc29ydE9iamVjdHM7XHJcblx0XHR0aGlzLmJvdW5kaW5nQm94ID0gc291cmNlLmJvdW5kaW5nQm94ICE9PSBudWxsID8gc291cmNlLmJvdW5kaW5nQm94LmNsb25lKCkgOiBudWxsO1xyXG5cdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IHNvdXJjZS5ib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCA/IHNvdXJjZS5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpIDogbnVsbDtcclxuXHJcblx0XHR0aGlzLl9nZW9tZXRyeUluZm8gPSBzb3VyY2UuX2dlb21ldHJ5SW5mby5tYXAoIGluZm8gPT4gKCB7XHJcblx0XHRcdC4uLmluZm8sXHJcblxyXG5cdFx0XHRib3VuZGluZ0JveDogaW5mby5ib3VuZGluZ0JveCAhPT0gbnVsbCA/IGluZm8uYm91bmRpbmdCb3guY2xvbmUoKSA6IG51bGwsXHJcblx0XHRcdGJvdW5kaW5nU3BoZXJlOiBpbmZvLmJvdW5kaW5nU3BoZXJlICE9PSBudWxsID8gaW5mby5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpIDogbnVsbCxcclxuXHRcdH0gKSApO1xyXG5cdFx0dGhpcy5faW5zdGFuY2VJbmZvID0gc291cmNlLl9pbnN0YW5jZUluZm8ubWFwKCBpbmZvID0+ICggeyAuLi5pbmZvIH0gKSApO1xyXG5cclxuXHRcdHRoaXMuX21heEluc3RhbmNlQ291bnQgPSBzb3VyY2UuX21heEluc3RhbmNlQ291bnQ7XHJcblx0XHR0aGlzLl9tYXhWZXJ0ZXhDb3VudCA9IHNvdXJjZS5fbWF4VmVydGV4Q291bnQ7XHJcblx0XHR0aGlzLl9tYXhJbmRleENvdW50ID0gc291cmNlLl9tYXhJbmRleENvdW50O1xyXG5cclxuXHRcdHRoaXMuX2dlb21ldHJ5SW5pdGlhbGl6ZWQgPSBzb3VyY2UuX2dlb21ldHJ5SW5pdGlhbGl6ZWQ7XHJcblx0XHR0aGlzLl9nZW9tZXRyeUNvdW50ID0gc291cmNlLl9nZW9tZXRyeUNvdW50O1xyXG5cdFx0dGhpcy5fbXVsdGlEcmF3Q291bnRzID0gc291cmNlLl9tdWx0aURyYXdDb3VudHMuc2xpY2UoKTtcclxuXHRcdHRoaXMuX211bHRpRHJhd1N0YXJ0cyA9IHNvdXJjZS5fbXVsdGlEcmF3U3RhcnRzLnNsaWNlKCk7XHJcblxyXG5cdFx0dGhpcy5fbWF0cmljZXNUZXh0dXJlID0gc291cmNlLl9tYXRyaWNlc1RleHR1cmUuY2xvbmUoKTtcclxuXHRcdHRoaXMuX21hdHJpY2VzVGV4dHVyZS5pbWFnZS5kYXRhID0gdGhpcy5fbWF0cmljZXNUZXh0dXJlLmltYWdlLmRhdGEuc2xpY2UoKTtcclxuXHJcblx0XHRpZiAoIHRoaXMuX2NvbG9yc1RleHR1cmUgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLl9jb2xvcnNUZXh0dXJlID0gc291cmNlLl9jb2xvcnNUZXh0dXJlLmNsb25lKCk7XHJcblx0XHRcdHRoaXMuX2NvbG9yc1RleHR1cmUuaW1hZ2UuZGF0YSA9IHRoaXMuX2NvbG9yc1RleHR1cmUuaW1hZ2UuZGF0YS5zbGljZSgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGcmVlcyB0aGUgR1BVLXJlbGF0ZWQgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGlzIGluc3RhbmNlLiBDYWxsIHRoaXNcclxuXHQgKiBtZXRob2Qgd2hlbmV2ZXIgdGhpcyBpbnN0YW5jZSBpcyBubyBsb25nZXIgdXNlZCBpbiB5b3VyIGFwcC5cclxuXHQgKi9cclxuXHRkaXNwb3NlKCkge1xyXG5cclxuXHRcdC8vIEFzc3VtaW5nIHRoZSBnZW9tZXRyeSBpcyBub3Qgc2hhcmVkIHdpdGggb3RoZXIgbWVzaGVzXHJcblx0XHR0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKTtcclxuXHJcblx0XHR0aGlzLl9tYXRyaWNlc1RleHR1cmUuZGlzcG9zZSgpO1xyXG5cdFx0dGhpcy5fbWF0cmljZXNUZXh0dXJlID0gbnVsbDtcclxuXHJcblx0XHR0aGlzLl9pbmRpcmVjdFRleHR1cmUuZGlzcG9zZSgpO1xyXG5cdFx0dGhpcy5faW5kaXJlY3RUZXh0dXJlID0gbnVsbDtcclxuXHJcblx0XHRpZiAoIHRoaXMuX2NvbG9yc1RleHR1cmUgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLl9jb2xvcnNUZXh0dXJlLmRpc3Bvc2UoKTtcclxuXHRcdFx0dGhpcy5fY29sb3JzVGV4dHVyZSA9IG51bGw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdG9uQmVmb3JlUmVuZGVyKCByZW5kZXJlciwgc2NlbmUsIGNhbWVyYSwgZ2VvbWV0cnksIG1hdGVyaWFsLyosIF9ncm91cCovICkge1xyXG5cclxuXHRcdC8vIGlmIHZpc2liaWxpdHkgaGFzIG5vdCBjaGFuZ2VkIGFuZCBmcnVzdHVtIGN1bGxpbmcgYW5kIG9iamVjdCBzb3J0aW5nIGlzIG5vdCByZXF1aXJlZFxyXG5cdFx0Ly8gdGhlbiBza2lwIGl0ZXJhdGluZyBvdmVyIGFsbCBpdGVtc1xyXG5cdFx0aWYgKCAhIHRoaXMuX3Zpc2liaWxpdHlDaGFuZ2VkICYmICEgdGhpcy5wZXJPYmplY3RGcnVzdHVtQ3VsbGVkICYmICEgdGhpcy5zb3J0T2JqZWN0cyApIHtcclxuXHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gdGhlIGluZGV4ZWQgdmVyc2lvbiBvZiB0aGUgbXVsdGkgZHJhdyBmdW5jdGlvbiByZXF1aXJlcyBzcGVjaWZ5aW5nIHRoZSBzdGFydFxyXG5cdFx0Ly8gb2Zmc2V0IGluIGJ5dGVzLlxyXG5cdFx0Y29uc3QgaW5kZXggPSBnZW9tZXRyeS5nZXRJbmRleCgpO1xyXG5cdFx0Y29uc3QgYnl0ZXNQZXJFbGVtZW50ID0gaW5kZXggPT09IG51bGwgPyAxIDogaW5kZXguYXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7XHJcblxyXG5cdFx0Y29uc3QgaW5zdGFuY2VJbmZvID0gdGhpcy5faW5zdGFuY2VJbmZvO1xyXG5cdFx0Y29uc3QgbXVsdGlEcmF3U3RhcnRzID0gdGhpcy5fbXVsdGlEcmF3U3RhcnRzO1xyXG5cdFx0Y29uc3QgbXVsdGlEcmF3Q291bnRzID0gdGhpcy5fbXVsdGlEcmF3Q291bnRzO1xyXG5cdFx0Y29uc3QgZ2VvbWV0cnlJbmZvTGlzdCA9IHRoaXMuX2dlb21ldHJ5SW5mbztcclxuXHRcdGNvbnN0IHBlck9iamVjdEZydXN0dW1DdWxsZWQgPSB0aGlzLnBlck9iamVjdEZydXN0dW1DdWxsZWQ7XHJcblx0XHRjb25zdCBpbmRpcmVjdFRleHR1cmUgPSB0aGlzLl9pbmRpcmVjdFRleHR1cmU7XHJcblx0XHRjb25zdCBpbmRpcmVjdEFycmF5ID0gaW5kaXJlY3RUZXh0dXJlLmltYWdlLmRhdGE7XHJcblxyXG5cdFx0Ly8gcHJlcGFyZSB0aGUgZnJ1c3R1bSBpbiB0aGUgbG9jYWwgZnJhbWVcclxuXHRcdGlmICggcGVyT2JqZWN0RnJ1c3R1bUN1bGxlZCApIHtcclxuXHJcblx0XHRcdF9tYXRyaXhcclxuXHRcdFx0XHQubXVsdGlwbHlNYXRyaWNlcyggY2FtZXJhLnByb2plY3Rpb25NYXRyaXgsIGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UgKVxyXG5cdFx0XHRcdC5tdWx0aXBseSggdGhpcy5tYXRyaXhXb3JsZCApO1xyXG5cdFx0XHRfZnJ1c3R1bS5zZXRGcm9tUHJvamVjdGlvbk1hdHJpeChcclxuXHRcdFx0XHRfbWF0cml4LFxyXG5cdFx0XHRcdHJlbmRlcmVyLmNvb3JkaW5hdGVTeXN0ZW1cclxuXHRcdFx0KTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0bGV0IG11bHRpRHJhd0NvdW50ID0gMDtcclxuXHRcdGlmICggdGhpcy5zb3J0T2JqZWN0cyApIHtcclxuXHJcblx0XHRcdC8vIGdldCB0aGUgY2FtZXJhIHBvc2l0aW9uIGluIHRoZSBsb2NhbCBmcmFtZVxyXG5cdFx0XHRfbWF0cml4LmNvcHkoIHRoaXMubWF0cml4V29ybGQgKS5pbnZlcnQoKTtcclxuXHRcdFx0X3ZlY3Rvci5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGNhbWVyYS5tYXRyaXhXb3JsZCApLmFwcGx5TWF0cml4NCggX21hdHJpeCApO1xyXG5cdFx0XHRfZm9yd2FyZC5zZXQoIDAsIDAsIC0gMSApLnRyYW5zZm9ybURpcmVjdGlvbiggY2FtZXJhLm1hdHJpeFdvcmxkICkudHJhbnNmb3JtRGlyZWN0aW9uKCBfbWF0cml4ICk7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBpbnN0YW5jZUluZm8ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBpbnN0YW5jZUluZm9bIGkgXS52aXNpYmxlICYmIGluc3RhbmNlSW5mb1sgaSBdLmFjdGl2ZSApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBnZW9tZXRyeUlkID0gaW5zdGFuY2VJbmZvWyBpIF0uZ2VvbWV0cnlJbmRleDtcclxuXHJcblx0XHRcdFx0XHQvLyBnZXQgdGhlIGJvdW5kcyBpbiB3b3JsZCBzcGFjZVxyXG5cdFx0XHRcdFx0dGhpcy5nZXRNYXRyaXhBdCggaSwgX21hdHJpeCApO1xyXG5cdFx0XHRcdFx0dGhpcy5nZXRCb3VuZGluZ1NwaGVyZUF0KCBnZW9tZXRyeUlkLCBfc3BoZXJlICkuYXBwbHlNYXRyaXg0KCBfbWF0cml4ICk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGJhdGNoZWQgZ2VvbWV0cnkgaXMgd2l0aGluIHRoZSBmcnVzdHVtXHJcblx0XHRcdFx0XHRsZXQgY3VsbGVkID0gZmFsc2U7XHJcblx0XHRcdFx0XHRpZiAoIHBlck9iamVjdEZydXN0dW1DdWxsZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjdWxsZWQgPSAhIF9mcnVzdHVtLmludGVyc2VjdHNTcGhlcmUoIF9zcGhlcmUgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aWYgKCAhIGN1bGxlZCApIHtcclxuXHJcblx0XHRcdFx0XHRcdC8vIGdldCB0aGUgZGlzdGFuY2UgZnJvbSBjYW1lcmEgdXNlZCBmb3Igc29ydGluZ1xyXG5cdFx0XHRcdFx0XHRjb25zdCBnZW9tZXRyeUluZm8gPSBnZW9tZXRyeUluZm9MaXN0WyBnZW9tZXRyeUlkIF07XHJcblx0XHRcdFx0XHRcdGNvbnN0IHogPSBfdGVtcC5zdWJWZWN0b3JzKCBfc3BoZXJlLmNlbnRlciwgX3ZlY3RvciApLmRvdCggX2ZvcndhcmQgKTtcclxuXHRcdFx0XHRcdFx0X3JlbmRlckxpc3QucHVzaCggZ2VvbWV0cnlJbmZvLnN0YXJ0LCBnZW9tZXRyeUluZm8uY291bnQsIHosIGkgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIFNvcnQgdGhlIGRyYXcgcmFuZ2VzIGFuZCBwcmVwIGZvciByZW5kZXJpbmdcclxuXHRcdFx0Y29uc3QgbGlzdCA9IF9yZW5kZXJMaXN0Lmxpc3Q7XHJcblx0XHRcdGNvbnN0IGN1c3RvbVNvcnQgPSB0aGlzLmN1c3RvbVNvcnQ7XHJcblx0XHRcdGlmICggY3VzdG9tU29ydCA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0bGlzdC5zb3J0KCBtYXRlcmlhbC50cmFuc3BhcmVudCA/IHNvcnRUcmFuc3BhcmVudCA6IHNvcnRPcGFxdWUgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGN1c3RvbVNvcnQuY2FsbCggdGhpcywgbGlzdCwgY2FtZXJhICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBsaXN0Lmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGl0ZW0gPSBsaXN0WyBpIF07XHJcblx0XHRcdFx0bXVsdGlEcmF3U3RhcnRzWyBtdWx0aURyYXdDb3VudCBdID0gaXRlbS5zdGFydCAqIGJ5dGVzUGVyRWxlbWVudDtcclxuXHRcdFx0XHRtdWx0aURyYXdDb3VudHNbIG11bHRpRHJhd0NvdW50IF0gPSBpdGVtLmNvdW50O1xyXG5cdFx0XHRcdGluZGlyZWN0QXJyYXlbIG11bHRpRHJhd0NvdW50IF0gPSBpdGVtLmluZGV4O1xyXG5cdFx0XHRcdG11bHRpRHJhd0NvdW50ICsrO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0X3JlbmRlckxpc3QucmVzZXQoKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gaW5zdGFuY2VJbmZvLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggaW5zdGFuY2VJbmZvWyBpIF0udmlzaWJsZSAmJiBpbnN0YW5jZUluZm9bIGkgXS5hY3RpdmUgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgZ2VvbWV0cnlJZCA9IGluc3RhbmNlSW5mb1sgaSBdLmdlb21ldHJ5SW5kZXg7XHJcblxyXG5cdFx0XHRcdFx0Ly8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGJhdGNoZWQgZ2VvbWV0cnkgaXMgd2l0aGluIHRoZSBmcnVzdHVtXHJcblx0XHRcdFx0XHRsZXQgY3VsbGVkID0gZmFsc2U7XHJcblx0XHRcdFx0XHRpZiAoIHBlck9iamVjdEZydXN0dW1DdWxsZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBnZXQgdGhlIGJvdW5kcyBpbiB3b3JsZCBzcGFjZVxyXG5cdFx0XHRcdFx0XHR0aGlzLmdldE1hdHJpeEF0KCBpLCBfbWF0cml4ICk7XHJcblx0XHRcdFx0XHRcdHRoaXMuZ2V0Qm91bmRpbmdTcGhlcmVBdCggZ2VvbWV0cnlJZCwgX3NwaGVyZSApLmFwcGx5TWF0cml4NCggX21hdHJpeCApO1xyXG5cdFx0XHRcdFx0XHRjdWxsZWQgPSAhIF9mcnVzdHVtLmludGVyc2VjdHNTcGhlcmUoIF9zcGhlcmUgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aWYgKCAhIGN1bGxlZCApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnN0IGdlb21ldHJ5SW5mbyA9IGdlb21ldHJ5SW5mb0xpc3RbIGdlb21ldHJ5SWQgXTtcclxuXHRcdFx0XHRcdFx0bXVsdGlEcmF3U3RhcnRzWyBtdWx0aURyYXdDb3VudCBdID0gZ2VvbWV0cnlJbmZvLnN0YXJ0ICogYnl0ZXNQZXJFbGVtZW50O1xyXG5cdFx0XHRcdFx0XHRtdWx0aURyYXdDb3VudHNbIG11bHRpRHJhd0NvdW50IF0gPSBnZW9tZXRyeUluZm8uY291bnQ7XHJcblx0XHRcdFx0XHRcdGluZGlyZWN0QXJyYXlbIG11bHRpRHJhd0NvdW50IF0gPSBpO1xyXG5cdFx0XHRcdFx0XHRtdWx0aURyYXdDb3VudCArKztcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aW5kaXJlY3RUZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHRcdHRoaXMuX211bHRpRHJhd0NvdW50ID0gbXVsdGlEcmF3Q291bnQ7XHJcblx0XHR0aGlzLl92aXNpYmlsaXR5Q2hhbmdlZCA9IGZhbHNlO1xyXG5cclxuXHR9XHJcblxyXG5cdG9uQmVmb3JlU2hhZG93KCByZW5kZXJlciwgb2JqZWN0LCBjYW1lcmEsIHNoYWRvd0NhbWVyYSwgZ2VvbWV0cnksIGRlcHRoTWF0ZXJpYWwvKiAsIGdyb3VwICovICkge1xyXG5cclxuXHRcdHRoaXMub25CZWZvcmVSZW5kZXIoIHJlbmRlcmVyLCBudWxsLCBzaGFkb3dDYW1lcmEsIGdlb21ldHJ5LCBkZXB0aE1hdGVyaWFsICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IEJhdGNoZWRNZXNoIH07XHJcbiIsImltcG9ydCB7IE1hdGVyaWFsIH0gZnJvbSAnLi9NYXRlcmlhbC5qcyc7XHJcbmltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vbWF0aC9Db2xvci5qcyc7XHJcblxyXG4vKipcclxuICogQSBtYXRlcmlhbCBmb3IgcmVuZGVyaW5nIGxpbmUgcHJpbWl0aXZlcy5cclxuICpcclxuICogTWF0ZXJpYWxzIGRlZmluZSB0aGUgYXBwZWFyYW5jZSBvZiByZW5kZXJhYmxlIDNEIG9iamVjdHMuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IG1hdGVyaWFsID0gbmV3IFRIUkVFLkxpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiAweGZmZmZmZiB9ICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTWF0ZXJpYWxcclxuICovXHJcbmNsYXNzIExpbmVCYXNpY01hdGVyaWFsIGV4dGVuZHMgTWF0ZXJpYWwge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGxpbmUgYmFzaWMgbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtZXRlcnNdIC0gQW4gb2JqZWN0IHdpdGggb25lIG9yIG1vcmUgcHJvcGVydGllc1xyXG5cdCAqIGRlZmluaW5nIHRoZSBtYXRlcmlhbCdzIGFwcGVhcmFuY2UuIEFueSBwcm9wZXJ0eSBvZiB0aGUgbWF0ZXJpYWxcclxuXHQgKiAoaW5jbHVkaW5nIGFueSBwcm9wZXJ0eSBmcm9tIGluaGVyaXRlZCBtYXRlcmlhbHMpIGNhbiBiZSBwYXNzZWRcclxuXHQgKiBpbiBoZXJlLiBDb2xvciB2YWx1ZXMgY2FuIGJlIHBhc3NlZCBhbnkgdHlwZSBvZiB2YWx1ZSBhY2NlcHRlZFxyXG5cdCAqIGJ5IHtAbGluayBDb2xvciNzZXR9LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwYXJhbWV0ZXJzICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzTGluZUJhc2ljTWF0ZXJpYWwgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdMaW5lQmFzaWNNYXRlcmlhbCc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDb2xvciBvZiB0aGUgbWF0ZXJpYWwuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0NvbG9yfVxyXG5cdFx0ICogQGRlZmF1bHQgKDEsMSwxKVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCAweGZmZmZmZiApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU2V0cyB0aGUgY29sb3Igb2YgdGhlIGxpbmVzIHVzaW5nIGRhdGEgZnJvbSBhIHRleHR1cmUuIFRoZSB0ZXh0dXJlIG1hcFxyXG5cdFx0ICogY29sb3IgaXMgbW9kdWxhdGVkIGJ5IHRoZSBkaWZmdXNlIGBjb2xvcmAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDb250cm9scyBsaW5lIHRoaWNrbmVzcyBvciBsaW5lcy5cclxuXHRcdCAqXHJcblx0XHQgKiBDYW4gb25seSBiZSB1c2VkIHdpdGgge0BsaW5rIFNWR1JlbmRlcmVyfS4gV2ViR0wgYW5kIFdlYkdQVVxyXG5cdFx0ICogaWdub3JlIHRoaXMgc2V0dGluZyBhbmQgYWx3YXlzIHJlbmRlciBsaW5lIHByaW1pdGl2ZXMgd2l0aCBhXHJcblx0XHQgKiB3aWR0aCBvZiBvbmUgcGl4ZWwuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5saW5ld2lkdGggPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyBhcHBlYXJhbmNlIG9mIGxpbmUgZW5kcy5cclxuXHRcdCAqXHJcblx0XHQgKiBDYW4gb25seSBiZSB1c2VkIHdpdGgge0BsaW5rIFNWR1JlbmRlcmVyfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KCdidXR0J3wncm91bmQnfCdzcXVhcmUnKX1cclxuXHRcdCAqIEBkZWZhdWx0ICdyb3VuZCdcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5saW5lY2FwID0gJ3JvdW5kJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgYXBwZWFyYW5jZSBvZiBsaW5lIGpvaW50cy5cclxuXHRcdCAqXHJcblx0XHQgKiBDYW4gb25seSBiZSB1c2VkIHdpdGgge0BsaW5rIFNWR1JlbmRlcmVyfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KCdyb3VuZCd8J2JldmVsJ3wnbWl0ZXInKX1cclxuXHRcdCAqIEBkZWZhdWx0ICdyb3VuZCdcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5saW5lam9pbiA9ICdyb3VuZCc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSBtYXRlcmlhbCBpcyBhZmZlY3RlZCBieSBmb2cgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZvZyA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcclxuXHJcblx0XHR0aGlzLm1hcCA9IHNvdXJjZS5tYXA7XHJcblxyXG5cdFx0dGhpcy5saW5ld2lkdGggPSBzb3VyY2UubGluZXdpZHRoO1xyXG5cdFx0dGhpcy5saW5lY2FwID0gc291cmNlLmxpbmVjYXA7XHJcblx0XHR0aGlzLmxpbmVqb2luID0gc291cmNlLmxpbmVqb2luO1xyXG5cclxuXHRcdHRoaXMuZm9nID0gc291cmNlLmZvZztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgTGluZUJhc2ljTWF0ZXJpYWwgfTtcclxuIiwiaW1wb3J0IHsgU3BoZXJlIH0gZnJvbSAnLi4vbWF0aC9TcGhlcmUuanMnO1xyXG5pbXBvcnQgeyBSYXkgfSBmcm9tICcuLi9tYXRoL1JheS5qcyc7XHJcbmltcG9ydCB7IE1hdHJpeDQgfSBmcm9tICcuLi9tYXRoL01hdHJpeDQuanMnO1xyXG5pbXBvcnQgeyBPYmplY3QzRCB9IGZyb20gJy4uL2NvcmUvT2JqZWN0M0QuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuaW1wb3J0IHsgTGluZUJhc2ljTWF0ZXJpYWwgfSBmcm9tICcuLi9tYXRlcmlhbHMvTGluZUJhc2ljTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyBCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyR2VvbWV0cnkuanMnO1xyXG5pbXBvcnQgeyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5cclxuY29uc3QgX3ZTdGFydCA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX3ZFbmQgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcblxyXG5jb25zdCBfaW52ZXJzZU1hdHJpeCA9IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDQoKTtcclxuY29uc3QgX3JheSA9IC8qQF9fUFVSRV9fKi8gbmV3IFJheSgpO1xyXG5jb25zdCBfc3BoZXJlID0gLypAX19QVVJFX18qLyBuZXcgU3BoZXJlKCk7XHJcblxyXG5jb25zdCBfaW50ZXJzZWN0UG9pbnRPblJheSA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX2ludGVyc2VjdFBvaW50T25TZWdtZW50ID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5cclxuLyoqXHJcbiAqIEEgY29udGludW91cyBsaW5lLiBUaGUgbGluZSBhcmUgcmVuZGVyZWQgYnkgY29ubmVjdGluZyBjb25zZWN1dGl2ZVxyXG4gKiB2ZXJ0aWNlcyB3aXRoIHN0cmFpZ2h0IGxpbmVzLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBtYXRlcmlhbCA9IG5ldyBUSFJFRS5MaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogMHgwMDAwZmYgfSApO1xyXG4gKlxyXG4gKiBjb25zdCBwb2ludHMgPSBbXTtcclxuICogcG9pbnRzLnB1c2goIG5ldyBUSFJFRS5WZWN0b3IzKCAtIDEwLCAwLCAwICkgKTtcclxuICogcG9pbnRzLnB1c2goIG5ldyBUSFJFRS5WZWN0b3IzKCAwLCAxMCwgMCApICk7XHJcbiAqIHBvaW50cy5wdXNoKCBuZXcgVEhSRUUuVmVjdG9yMyggMTAsIDAsIDAgKSApO1xyXG4gKlxyXG4gKiBjb25zdCBnZW9tZXRyeSA9IG5ldyBUSFJFRS5CdWZmZXJHZW9tZXRyeSgpLnNldEZyb21Qb2ludHMoIHBvaW50cyApO1xyXG4gKlxyXG4gKiBjb25zdCBsaW5lID0gbmV3IFRIUkVFLkxpbmUoIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG4gKiBzY2VuZS5hZGQoIGxpbmUgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBPYmplY3QzRFxyXG4gKi9cclxuY2xhc3MgTGluZSBleHRlbmRzIE9iamVjdDNEIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBsaW5lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCdWZmZXJHZW9tZXRyeX0gW2dlb21ldHJ5XSAtIFRoZSBsaW5lIGdlb21ldHJ5LlxyXG5cdCAqIEBwYXJhbSB7TWF0ZXJpYWx8QXJyYXk8TWF0ZXJpYWw+fSBbbWF0ZXJpYWxdIC0gVGhlIGxpbmUgbWF0ZXJpYWwuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCksIG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCkgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNMaW5lID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnTGluZSc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbGluZSBnZW9tZXRyeS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QnVmZmVyR2VvbWV0cnl9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ2VvbWV0cnkgPSBnZW9tZXRyeTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBsaW5lIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtNYXRlcmlhbHxBcnJheTxNYXRlcmlhbD59XHJcblx0XHQgKiBAZGVmYXVsdCBMaW5lQmFzaWNNYXRlcmlhbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1hdGVyaWFsID0gbWF0ZXJpYWw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGRpY3Rpb25hcnkgcmVwcmVzZW50aW5nIHRoZSBtb3JwaCB0YXJnZXRzIGluIHRoZSBnZW9tZXRyeS4gVGhlIGtleSBpcyB0aGVcclxuXHRcdCAqIG1vcnBoIHRhcmdldHMgbmFtZSwgdGhlIHZhbHVlIGl0cyBhdHRyaWJ1dGUgaW5kZXguIFRoaXMgbWVtYmVyIGlzIGB1bmRlZmluZWRgXHJcblx0XHQgKiBieSBkZWZhdWx0IGFuZCBvbmx5IHNldCB3aGVuIG1vcnBoIHRhcmdldHMgYXJlIGRldGVjdGVkIGluIHRoZSBnZW9tZXRyeS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0PFN0cmluZyxudW1iZXI+fHVuZGVmaW5lZH1cclxuXHRcdCAqIEBkZWZhdWx0IHVuZGVmaW5lZFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeSA9IHVuZGVmaW5lZDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIGFycmF5IG9mIHdlaWdodHMgdHlwaWNhbGx5IGluIHRoZSByYW5nZSBgWzAsMV1gIHRoYXQgc3BlY2lmeSBob3cgbXVjaCBvZiB0aGUgbW9ycGhcclxuXHRcdCAqIGlzIGFwcGxpZWQuIFRoaXMgbWVtYmVyIGlzIGB1bmRlZmluZWRgIGJ5IGRlZmF1bHQgYW5kIG9ubHkgc2V0IHdoZW4gbW9ycGggdGFyZ2V0cyBhcmVcclxuXHRcdCAqIGRldGVjdGVkIGluIHRoZSBnZW9tZXRyeS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8bnVtYmVyPnx1bmRlZmluZWR9XHJcblx0XHQgKiBAZGVmYXVsdCB1bmRlZmluZWRcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMgPSB1bmRlZmluZWQ7XHJcblxyXG5cdFx0dGhpcy51cGRhdGVNb3JwaFRhcmdldHMoKTtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UsIHJlY3Vyc2l2ZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UsIHJlY3Vyc2l2ZSApO1xyXG5cclxuXHRcdHRoaXMubWF0ZXJpYWwgPSBBcnJheS5pc0FycmF5KCBzb3VyY2UubWF0ZXJpYWwgKSA/IHNvdXJjZS5tYXRlcmlhbC5zbGljZSgpIDogc291cmNlLm1hdGVyaWFsO1xyXG5cdFx0dGhpcy5nZW9tZXRyeSA9IHNvdXJjZS5nZW9tZXRyeTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyBhbiBhcnJheSBvZiBkaXN0YW5jZSB2YWx1ZXMgd2hpY2ggYXJlIG5lY2Vzc2FyeSBmb3IgcmVuZGVyaW5nIGRhc2hlZCBsaW5lcy5cclxuXHQgKiBGb3IgZWFjaCB2ZXJ0ZXggaW4gdGhlIGdlb21ldHJ5LCB0aGUgbWV0aG9kIGNhbGN1bGF0ZXMgdGhlIGN1bXVsYXRpdmUgbGVuZ3RoIGZyb20gdGhlXHJcblx0ICogY3VycmVudCBwb2ludCB0byB0aGUgdmVyeSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtMaW5lfSBBIHJlZmVyZW5jZSB0byB0aGlzIGxpbmUuXHJcblx0ICovXHJcblx0Y29tcHV0ZUxpbmVEaXN0YW5jZXMoKSB7XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xyXG5cclxuXHRcdC8vIHdlIGFzc3VtZSBub24taW5kZXhlZCBnZW9tZXRyeVxyXG5cclxuXHRcdGlmICggZ2VvbWV0cnkuaW5kZXggPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBwb3NpdGlvbkF0dHJpYnV0ZSA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XHJcblx0XHRcdGNvbnN0IGxpbmVEaXN0YW5jZXMgPSBbIDAgXTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMSwgbCA9IHBvc2l0aW9uQXR0cmlidXRlLmNvdW50OyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0X3ZTdGFydC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbkF0dHJpYnV0ZSwgaSAtIDEgKTtcclxuXHRcdFx0XHRfdkVuZC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbkF0dHJpYnV0ZSwgaSApO1xyXG5cclxuXHRcdFx0XHRsaW5lRGlzdGFuY2VzWyBpIF0gPSBsaW5lRGlzdGFuY2VzWyBpIC0gMSBdO1xyXG5cdFx0XHRcdGxpbmVEaXN0YW5jZXNbIGkgXSArPSBfdlN0YXJ0LmRpc3RhbmNlVG8oIF92RW5kICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdsaW5lRGlzdGFuY2UnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbGluZURpc3RhbmNlcywgMSApICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpbmUuY29tcHV0ZUxpbmVEaXN0YW5jZXMoKTogQ29tcHV0YXRpb24gb25seSBwb3NzaWJsZSB3aXRoIG5vbi1pbmRleGVkIEJ1ZmZlckdlb21ldHJ5LicgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgaW50ZXJzZWN0aW9uIHBvaW50cyBiZXR3ZWVuIGEgY2FzdGVkIHJheSBhbmQgdGhpcyBsaW5lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSYXljYXN0ZXJ9IHJheWNhc3RlciAtIFRoZSByYXljYXN0ZXIuXHJcblx0ICogQHBhcmFtIHtBcnJheTxPYmplY3Q+fSBpbnRlcnNlY3RzIC0gVGhlIHRhcmdldCBhcnJheSB0aGF0IGhvbGRzIHRoZSBpbnRlcnNlY3Rpb24gcG9pbnRzLlxyXG5cdCAqL1xyXG5cdHJheWNhc3QoIHJheWNhc3RlciwgaW50ZXJzZWN0cyApIHtcclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XHJcblx0XHRjb25zdCBtYXRyaXhXb3JsZCA9IHRoaXMubWF0cml4V29ybGQ7XHJcblx0XHRjb25zdCB0aHJlc2hvbGQgPSByYXljYXN0ZXIucGFyYW1zLkxpbmUudGhyZXNob2xkO1xyXG5cdFx0Y29uc3QgZHJhd1JhbmdlID0gZ2VvbWV0cnkuZHJhd1JhbmdlO1xyXG5cclxuXHRcdC8vIENoZWNraW5nIGJvdW5kaW5nU3BoZXJlIGRpc3RhbmNlIHRvIHJheVxyXG5cclxuXHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSBnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcclxuXHJcblx0XHRfc3BoZXJlLmNvcHkoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlICk7XHJcblx0XHRfc3BoZXJlLmFwcGx5TWF0cml4NCggbWF0cml4V29ybGQgKTtcclxuXHRcdF9zcGhlcmUucmFkaXVzICs9IHRocmVzaG9sZDtcclxuXHJcblx0XHRpZiAoIHJheWNhc3Rlci5yYXkuaW50ZXJzZWN0c1NwaGVyZSggX3NwaGVyZSApID09PSBmYWxzZSApIHJldHVybjtcclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdF9pbnZlcnNlTWF0cml4LmNvcHkoIG1hdHJpeFdvcmxkICkuaW52ZXJ0KCk7XHJcblx0XHRfcmF5LmNvcHkoIHJheWNhc3Rlci5yYXkgKS5hcHBseU1hdHJpeDQoIF9pbnZlcnNlTWF0cml4ICk7XHJcblxyXG5cdFx0Y29uc3QgbG9jYWxUaHJlc2hvbGQgPSB0aHJlc2hvbGQgLyAoICggdGhpcy5zY2FsZS54ICsgdGhpcy5zY2FsZS55ICsgdGhpcy5zY2FsZS56ICkgLyAzICk7XHJcblx0XHRjb25zdCBsb2NhbFRocmVzaG9sZFNxID0gbG9jYWxUaHJlc2hvbGQgKiBsb2NhbFRocmVzaG9sZDtcclxuXHJcblx0XHRjb25zdCBzdGVwID0gdGhpcy5pc0xpbmVTZWdtZW50cyA/IDIgOiAxO1xyXG5cclxuXHRcdGNvbnN0IGluZGV4ID0gZ2VvbWV0cnkuaW5kZXg7XHJcblx0XHRjb25zdCBhdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlcztcclxuXHRcdGNvbnN0IHBvc2l0aW9uQXR0cmlidXRlID0gYXR0cmlidXRlcy5wb3NpdGlvbjtcclxuXHJcblx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgc3RhcnQgPSBNYXRoLm1heCggMCwgZHJhd1JhbmdlLnN0YXJ0ICk7XHJcblx0XHRcdGNvbnN0IGVuZCA9IE1hdGgubWluKCBpbmRleC5jb3VudCwgKCBkcmF3UmFuZ2Uuc3RhcnQgKyBkcmF3UmFuZ2UuY291bnQgKSApO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSBzdGFydCwgbCA9IGVuZCAtIDE7IGkgPCBsOyBpICs9IHN0ZXAgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGEgPSBpbmRleC5nZXRYKCBpICk7XHJcblx0XHRcdFx0Y29uc3QgYiA9IGluZGV4LmdldFgoIGkgKyAxICk7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGludGVyc2VjdCA9IGNoZWNrSW50ZXJzZWN0aW9uKCB0aGlzLCByYXljYXN0ZXIsIF9yYXksIGxvY2FsVGhyZXNob2xkU3EsIGEsIGIsIGkgKTtcclxuXHJcblx0XHRcdFx0aWYgKCBpbnRlcnNlY3QgKSB7XHJcblxyXG5cdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCBpbnRlcnNlY3QgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCB0aGlzLmlzTGluZUxvb3AgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGEgPSBpbmRleC5nZXRYKCBlbmQgLSAxICk7XHJcblx0XHRcdFx0Y29uc3QgYiA9IGluZGV4LmdldFgoIHN0YXJ0ICk7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGludGVyc2VjdCA9IGNoZWNrSW50ZXJzZWN0aW9uKCB0aGlzLCByYXljYXN0ZXIsIF9yYXksIGxvY2FsVGhyZXNob2xkU3EsIGEsIGIsIGVuZCAtIDEgKTtcclxuXHJcblx0XHRcdFx0aWYgKCBpbnRlcnNlY3QgKSB7XHJcblxyXG5cdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCBpbnRlcnNlY3QgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRjb25zdCBzdGFydCA9IE1hdGgubWF4KCAwLCBkcmF3UmFuZ2Uuc3RhcnQgKTtcclxuXHRcdFx0Y29uc3QgZW5kID0gTWF0aC5taW4oIHBvc2l0aW9uQXR0cmlidXRlLmNvdW50LCAoIGRyYXdSYW5nZS5zdGFydCArIGRyYXdSYW5nZS5jb3VudCApICk7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IHN0YXJ0LCBsID0gZW5kIC0gMTsgaSA8IGw7IGkgKz0gc3RlcCApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgaW50ZXJzZWN0ID0gY2hlY2tJbnRlcnNlY3Rpb24oIHRoaXMsIHJheWNhc3RlciwgX3JheSwgbG9jYWxUaHJlc2hvbGRTcSwgaSwgaSArIDEsIGkgKTtcclxuXHJcblx0XHRcdFx0aWYgKCBpbnRlcnNlY3QgKSB7XHJcblxyXG5cdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCBpbnRlcnNlY3QgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCB0aGlzLmlzTGluZUxvb3AgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGludGVyc2VjdCA9IGNoZWNrSW50ZXJzZWN0aW9uKCB0aGlzLCByYXljYXN0ZXIsIF9yYXksIGxvY2FsVGhyZXNob2xkU3EsIGVuZCAtIDEsIHN0YXJ0LCBlbmQgLSAxICk7XHJcblxyXG5cdFx0XHRcdGlmICggaW50ZXJzZWN0ICkge1xyXG5cclxuXHRcdFx0XHRcdGludGVyc2VjdHMucHVzaCggaW50ZXJzZWN0ICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdmFsdWVzIG9mIHtAbGluayBMaW5lI21vcnBoVGFyZ2V0RGljdGlvbmFyeX0gYW5kIHtAbGluayBMaW5lI21vcnBoVGFyZ2V0SW5mbHVlbmNlc31cclxuXHQgKiB0byBtYWtlIHN1cmUgZXhpc3RpbmcgbW9ycGggdGFyZ2V0cyBjYW4gaW5mbHVlbmNlIHRoaXMgM0Qgb2JqZWN0LlxyXG5cdCAqL1xyXG5cdHVwZGF0ZU1vcnBoVGFyZ2V0cygpIHtcclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XHJcblxyXG5cdFx0Y29uc3QgbW9ycGhBdHRyaWJ1dGVzID0gZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzO1xyXG5cdFx0Y29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKCBtb3JwaEF0dHJpYnV0ZXMgKTtcclxuXHJcblx0XHRpZiAoIGtleXMubGVuZ3RoID4gMCApIHtcclxuXHJcblx0XHRcdGNvbnN0IG1vcnBoQXR0cmlidXRlID0gbW9ycGhBdHRyaWJ1dGVzWyBrZXlzWyAwIF0gXTtcclxuXHJcblx0XHRcdGlmICggbW9ycGhBdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMgPSBbXTtcclxuXHRcdFx0XHR0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeSA9IHt9O1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgbSA9IDAsIG1sID0gbW9ycGhBdHRyaWJ1dGUubGVuZ3RoOyBtIDwgbWw7IG0gKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgbmFtZSA9IG1vcnBoQXR0cmlidXRlWyBtIF0ubmFtZSB8fCBTdHJpbmcoIG0gKTtcclxuXHJcblx0XHRcdFx0XHR0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5wdXNoKCAwICk7XHJcblx0XHRcdFx0XHR0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeVsgbmFtZSBdID0gbTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gY2hlY2tJbnRlcnNlY3Rpb24oIG9iamVjdCwgcmF5Y2FzdGVyLCByYXksIHRocmVzaG9sZFNxLCBhLCBiLCBpICkge1xyXG5cclxuXHRjb25zdCBwb3NpdGlvbkF0dHJpYnV0ZSA9IG9iamVjdC5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xyXG5cclxuXHRfdlN0YXJ0LmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uQXR0cmlidXRlLCBhICk7XHJcblx0X3ZFbmQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyaWJ1dGUsIGIgKTtcclxuXHJcblx0Y29uc3QgZGlzdFNxID0gcmF5LmRpc3RhbmNlU3FUb1NlZ21lbnQoIF92U3RhcnQsIF92RW5kLCBfaW50ZXJzZWN0UG9pbnRPblJheSwgX2ludGVyc2VjdFBvaW50T25TZWdtZW50ICk7XHJcblxyXG5cdGlmICggZGlzdFNxID4gdGhyZXNob2xkU3EgKSByZXR1cm47XHJcblxyXG5cdF9pbnRlcnNlY3RQb2ludE9uUmF5LmFwcGx5TWF0cml4NCggb2JqZWN0Lm1hdHJpeFdvcmxkICk7IC8vIE1vdmUgYmFjayB0byB3b3JsZCBzcGFjZSBmb3IgZGlzdGFuY2UgY2FsY3VsYXRpb25cclxuXHJcblx0Y29uc3QgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKCBfaW50ZXJzZWN0UG9pbnRPblJheSApO1xyXG5cclxuXHRpZiAoIGRpc3RhbmNlIDwgcmF5Y2FzdGVyLm5lYXIgfHwgZGlzdGFuY2UgPiByYXljYXN0ZXIuZmFyICkgcmV0dXJuO1xyXG5cclxuXHRyZXR1cm4ge1xyXG5cclxuXHRcdGRpc3RhbmNlOiBkaXN0YW5jZSxcclxuXHRcdC8vIFdoYXQgZG8gd2Ugd2FudD8gaW50ZXJzZWN0aW9uIHBvaW50IG9uIHRoZSByYXkgb3Igb24gdGhlIHNlZ21lbnQ/P1xyXG5cdFx0Ly8gcG9pbnQ6IHJheWNhc3Rlci5yYXkuYXQoIGRpc3RhbmNlICksXHJcblx0XHRwb2ludDogX2ludGVyc2VjdFBvaW50T25TZWdtZW50LmNsb25lKCkuYXBwbHlNYXRyaXg0KCBvYmplY3QubWF0cml4V29ybGQgKSxcclxuXHRcdGluZGV4OiBpLFxyXG5cdFx0ZmFjZTogbnVsbCxcclxuXHRcdGZhY2VJbmRleDogbnVsbCxcclxuXHRcdGJhcnljb29yZDogbnVsbCxcclxuXHRcdG9iamVjdDogb2JqZWN0XHJcblxyXG5cdH07XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBMaW5lIH07XHJcbiIsImltcG9ydCB7IExpbmUgfSBmcm9tICcuL0xpbmUuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuaW1wb3J0IHsgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyQXR0cmlidXRlLmpzJztcclxuXHJcbmNvbnN0IF9zdGFydCA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX2VuZCA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuXHJcbi8qKlxyXG4gKiBBIHNlcmllcyBvZiBsaW5lcyBkcmF3biBiZXR3ZWVuIHBhaXJzIG9mIHZlcnRpY2VzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTGluZVxyXG4gKi9cclxuY2xhc3MgTGluZVNlZ21lbnRzIGV4dGVuZHMgTGluZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbGluZSBzZWdtZW50cy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyR2VvbWV0cnl9IFtnZW9tZXRyeV0gLSBUaGUgbGluZSBnZW9tZXRyeS5cclxuXHQgKiBAcGFyYW0ge01hdGVyaWFsfEFycmF5PE1hdGVyaWFsPn0gW21hdGVyaWFsXSAtIFRoZSBsaW5lIG1hdGVyaWFsLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKSB7XHJcblxyXG5cdFx0c3VwZXIoIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0xpbmVTZWdtZW50cyA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ0xpbmVTZWdtZW50cyc7XHJcblxyXG5cdH1cclxuXHJcblx0Y29tcHV0ZUxpbmVEaXN0YW5jZXMoKSB7XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xyXG5cclxuXHRcdC8vIHdlIGFzc3VtZSBub24taW5kZXhlZCBnZW9tZXRyeVxyXG5cclxuXHRcdGlmICggZ2VvbWV0cnkuaW5kZXggPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBwb3NpdGlvbkF0dHJpYnV0ZSA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XHJcblx0XHRcdGNvbnN0IGxpbmVEaXN0YW5jZXMgPSBbXTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHBvc2l0aW9uQXR0cmlidXRlLmNvdW50OyBpIDwgbDsgaSArPSAyICkge1xyXG5cclxuXHRcdFx0XHRfc3RhcnQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyaWJ1dGUsIGkgKTtcclxuXHRcdFx0XHRfZW5kLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uQXR0cmlidXRlLCBpICsgMSApO1xyXG5cclxuXHRcdFx0XHRsaW5lRGlzdGFuY2VzWyBpIF0gPSAoIGkgPT09IDAgKSA/IDAgOiBsaW5lRGlzdGFuY2VzWyBpIC0gMSBdO1xyXG5cdFx0XHRcdGxpbmVEaXN0YW5jZXNbIGkgKyAxIF0gPSBsaW5lRGlzdGFuY2VzWyBpIF0gKyBfc3RhcnQuZGlzdGFuY2VUbyggX2VuZCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Z2VvbWV0cnkuc2V0QXR0cmlidXRlKCAnbGluZURpc3RhbmNlJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGxpbmVEaXN0YW5jZXMsIDEgKSApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaW5lU2VnbWVudHMuY29tcHV0ZUxpbmVEaXN0YW5jZXMoKTogQ29tcHV0YXRpb24gb25seSBwb3NzaWJsZSB3aXRoIG5vbi1pbmRleGVkIEJ1ZmZlckdlb21ldHJ5LicgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IExpbmVTZWdtZW50cyB9O1xyXG4iLCJpbXBvcnQgeyBMaW5lIH0gZnJvbSAnLi9MaW5lLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIGNvbnRpbnVvdXMgbGluZS4gVGhpcyBpcyBuZWFybHkgdGhlIHNhbWUgYXMge0BsaW5rIExpbmV9IHRoZSBvbmx5IGRpZmZlcmVuY2VcclxuICogaXMgdGhhdCB0aGUgbGFzdCB2ZXJ0ZXggaXMgY29ubmVjdGVkIHdpdGggdGhlIGZpcnN0IHZlcnRleCBpbiBvcmRlciB0byBjbG9zZVxyXG4gKiB0aGUgbGluZSB0byBmb3JtIGEgbG9vcC5cclxuICpcclxuICogQGF1Z21lbnRzIExpbmVcclxuICovXHJcbmNsYXNzIExpbmVMb29wIGV4dGVuZHMgTGluZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbGluZSBsb29wLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCdWZmZXJHZW9tZXRyeX0gW2dlb21ldHJ5XSAtIFRoZSBsaW5lIGdlb21ldHJ5LlxyXG5cdCAqIEBwYXJhbSB7TWF0ZXJpYWx8QXJyYXk8TWF0ZXJpYWw+fSBbbWF0ZXJpYWxdIC0gVGhlIGxpbmUgbWF0ZXJpYWwuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGdlb21ldHJ5LCBtYXRlcmlhbCApIHtcclxuXHJcblx0XHRzdXBlciggZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzTGluZUxvb3AgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdMaW5lTG9vcCc7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IExpbmVMb29wIH07XHJcbiIsImltcG9ydCB7IE1hdGVyaWFsIH0gZnJvbSAnLi9NYXRlcmlhbC5qcyc7XHJcbmltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vbWF0aC9Db2xvci5qcyc7XHJcblxyXG4vKipcclxuICogQSBtYXRlcmlhbCBmb3IgcmVuZGVyaW5nIHBvaW50IHByaW1pdGl2ZXMuXHJcbiAqXHJcbiAqIE1hdGVyaWFscyBkZWZpbmUgdGhlIGFwcGVhcmFuY2Ugb2YgcmVuZGVyYWJsZSAzRCBvYmplY3RzLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCB2ZXJ0aWNlcyA9IFtdO1xyXG4gKlxyXG4gKiBmb3IgKCBsZXQgaSA9IDA7IGkgPCAxMDAwMDsgaSArKyApIHtcclxuICogXHRjb25zdCB4ID0gVEhSRUUuTWF0aFV0aWxzLnJhbmRGbG9hdFNwcmVhZCggMjAwMCApO1xyXG4gKiBcdGNvbnN0IHkgPSBUSFJFRS5NYXRoVXRpbHMucmFuZEZsb2F0U3ByZWFkKCAyMDAwICk7XHJcbiAqIFx0Y29uc3QgeiA9IFRIUkVFLk1hdGhVdGlscy5yYW5kRmxvYXRTcHJlYWQoIDIwMDAgKTtcclxuICpcclxuICogXHR2ZXJ0aWNlcy5wdXNoKCB4LCB5LCB6ICk7XHJcbiAqIH1cclxuICpcclxuICogY29uc3QgZ2VvbWV0cnkgPSBuZXcgVEhSRUUuQnVmZmVyR2VvbWV0cnkoKTtcclxuICogZ2VvbWV0cnkuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgVEhSRUUuRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xyXG4gKiBjb25zdCBtYXRlcmlhbCA9IG5ldyBUSFJFRS5Qb2ludHNNYXRlcmlhbCggeyBjb2xvcjogMHg4ODg4ODggfSApO1xyXG4gKiBjb25zdCBwb2ludHMgPSBuZXcgVEhSRUUuUG9pbnRzKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuICogc2NlbmUuYWRkKCBwb2ludHMgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBNYXRlcmlhbFxyXG4gKi9cclxuY2xhc3MgUG9pbnRzTWF0ZXJpYWwgZXh0ZW5kcyBNYXRlcmlhbCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcG9pbnRzIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbWV0ZXJzXSAtIEFuIG9iamVjdCB3aXRoIG9uZSBvciBtb3JlIHByb3BlcnRpZXNcclxuXHQgKiBkZWZpbmluZyB0aGUgbWF0ZXJpYWwncyBhcHBlYXJhbmNlLiBBbnkgcHJvcGVydHkgb2YgdGhlIG1hdGVyaWFsXHJcblx0ICogKGluY2x1ZGluZyBhbnkgcHJvcGVydHkgZnJvbSBpbmhlcml0ZWQgbWF0ZXJpYWxzKSBjYW4gYmUgcGFzc2VkXHJcblx0ICogaW4gaGVyZS4gQ29sb3IgdmFsdWVzIGNhbiBiZSBwYXNzZWQgYW55IHR5cGUgb2YgdmFsdWUgYWNjZXB0ZWRcclxuXHQgKiBieSB7QGxpbmsgQ29sb3Ijc2V0fS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVycyApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1BvaW50c01hdGVyaWFsID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnUG9pbnRzTWF0ZXJpYWwnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQ29sb3Igb2YgdGhlIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtDb2xvcn1cclxuXHRcdCAqIEBkZWZhdWx0ICgxLDEsMSlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjb2xvciBtYXAuIE1heSBvcHRpb25hbGx5IGluY2x1ZGUgYW4gYWxwaGEgY2hhbm5lbCwgdHlwaWNhbGx5IGNvbWJpbmVkXHJcblx0XHQgKiB3aXRoIHtAbGluayBNYXRlcmlhbCN0cmFuc3BhcmVudH0gb3Ige0BsaW5rIE1hdGVyaWFsI2FscGhhVGVzdH0uIFRoZSB0ZXh0dXJlIG1hcFxyXG5cdFx0ICogY29sb3IgaXMgbW9kdWxhdGVkIGJ5IHRoZSBkaWZmdXNlIGBjb2xvcmAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYWxwaGEgbWFwIGlzIGEgZ3JheXNjYWxlIHRleHR1cmUgdGhhdCBjb250cm9scyB0aGUgb3BhY2l0eSBhY3Jvc3MgdGhlXHJcblx0XHQgKiBzdXJmYWNlIChibGFjazogZnVsbHkgdHJhbnNwYXJlbnQ7IHdoaXRlOiBmdWxseSBvcGFxdWUpLlxyXG5cdFx0ICpcclxuXHRcdCAqIE9ubHkgdGhlIGNvbG9yIG9mIHRoZSB0ZXh0dXJlIGlzIHVzZWQsIGlnbm9yaW5nIHRoZSBhbHBoYSBjaGFubmVsIGlmIG9uZVxyXG5cdFx0ICogZXhpc3RzLiBGb3IgUkdCIGFuZCBSR0JBIHRleHR1cmVzLCB0aGUgcmVuZGVyZXIgd2lsbCB1c2UgdGhlIGdyZWVuIGNoYW5uZWxcclxuXHRcdCAqIHdoZW4gc2FtcGxpbmcgdGhpcyB0ZXh0dXJlIGR1ZSB0byB0aGUgZXh0cmEgYml0IG9mIHByZWNpc2lvbiBwcm92aWRlZCBmb3JcclxuXHRcdCAqIGdyZWVuIGluIERYVC1jb21wcmVzc2VkIGFuZCB1bmNvbXByZXNzZWQgUkdCIDU2NSBmb3JtYXRzLiBMdW1pbmFuY2Utb25seSBhbmRcclxuXHRcdCAqIGx1bWluYW5jZS9hbHBoYSB0ZXh0dXJlcyB3aWxsIGFsc28gc3RpbGwgd29yayBhcyBleHBlY3RlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYWxwaGFNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyB0aGUgc2l6ZSBvZiB0aGUgcG9pbnRzIGluIHBpeGVscy5cclxuXHRcdCAqXHJcblx0XHQgKiBNaWdodCBiZSBjYXBwZWQgaWYgdGhlIHZhbHVlIGV4Y2VlZHMgaGFyZHdhcmUgZGVwZW5kZW50IHBhcmFtZXRlcnMgbGlrZSBbZ2wuQUxJQVNFRF9QT0lOVF9TSVpFX1JBTkdFXXtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2ViR0xSZW5kZXJpbmdDb250ZXh0L2dldFBhcmFtZXRlfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNpemUgPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU3BlY2lmaWVzIHdoZXRoZXIgc2l6ZSBvZiBpbmRpdmlkdWFsIHBvaW50cyBpcyBhdHRlbnVhdGVkIGJ5IHRoZSBjYW1lcmEgZGVwdGggKHBlcnNwZWN0aXZlIGNhbWVyYSBvbmx5KS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zaXplQXR0ZW51YXRpb24gPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgbWF0ZXJpYWwgaXMgYWZmZWN0ZWQgYnkgZm9nIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5mb2cgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XHJcblxyXG5cdFx0dGhpcy5tYXAgPSBzb3VyY2UubWFwO1xyXG5cclxuXHRcdHRoaXMuYWxwaGFNYXAgPSBzb3VyY2UuYWxwaGFNYXA7XHJcblxyXG5cdFx0dGhpcy5zaXplID0gc291cmNlLnNpemU7XHJcblx0XHR0aGlzLnNpemVBdHRlbnVhdGlvbiA9IHNvdXJjZS5zaXplQXR0ZW51YXRpb247XHJcblxyXG5cdFx0dGhpcy5mb2cgPSBzb3VyY2UuZm9nO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBQb2ludHNNYXRlcmlhbCB9O1xyXG4iLCJpbXBvcnQgeyBTcGhlcmUgfSBmcm9tICcuLi9tYXRoL1NwaGVyZS5qcyc7XHJcbmltcG9ydCB7IFJheSB9IGZyb20gJy4uL21hdGgvUmF5LmpzJztcclxuaW1wb3J0IHsgTWF0cml4NCB9IGZyb20gJy4uL21hdGgvTWF0cml4NC5qcyc7XHJcbmltcG9ydCB7IE9iamVjdDNEIH0gZnJvbSAnLi4vY29yZS9PYmplY3QzRC5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBQb2ludHNNYXRlcmlhbCB9IGZyb20gJy4uL21hdGVyaWFscy9Qb2ludHNNYXRlcmlhbC5qcyc7XHJcbmltcG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9CdWZmZXJHZW9tZXRyeS5qcyc7XHJcblxyXG5jb25zdCBfaW52ZXJzZU1hdHJpeCA9IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDQoKTtcclxuY29uc3QgX3JheSA9IC8qQF9fUFVSRV9fKi8gbmV3IFJheSgpO1xyXG5jb25zdCBfc3BoZXJlID0gLypAX19QVVJFX18qLyBuZXcgU3BoZXJlKCk7XHJcbmNvbnN0IF9wb3NpdGlvbiA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuXHJcbi8qKlxyXG4gKiBBIGNsYXNzIGZvciBkaXNwbGF5aW5nIHBvaW50cyBvciBwb2ludCBjbG91ZHMuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBPYmplY3QzRFxyXG4gKi9cclxuY2xhc3MgUG9pbnRzIGV4dGVuZHMgT2JqZWN0M0Qge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHBvaW50IGNsb3VkLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCdWZmZXJHZW9tZXRyeX0gW2dlb21ldHJ5XSAtIFRoZSBwb2ludHMgZ2VvbWV0cnkuXHJcblx0ICogQHBhcmFtIHtNYXRlcmlhbHxBcnJheTxNYXRlcmlhbD59IFttYXRlcmlhbF0gLSBUaGUgcG9pbnRzIG1hdGVyaWFsLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpLCBtYXRlcmlhbCA9IG5ldyBQb2ludHNNYXRlcmlhbCgpICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzUG9pbnRzID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnUG9pbnRzJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBwb2ludHMgZ2VvbWV0cnkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0J1ZmZlckdlb21ldHJ5fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdlb21ldHJ5ID0gZ2VvbWV0cnk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbGluZSBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7TWF0ZXJpYWx8QXJyYXk8TWF0ZXJpYWw+fVxyXG5cdFx0ICogQGRlZmF1bHQgUG9pbnRzTWF0ZXJpYWxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tYXRlcmlhbCA9IG1hdGVyaWFsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBkaWN0aW9uYXJ5IHJlcHJlc2VudGluZyB0aGUgbW9ycGggdGFyZ2V0cyBpbiB0aGUgZ2VvbWV0cnkuIFRoZSBrZXkgaXMgdGhlXHJcblx0XHQgKiBtb3JwaCB0YXJnZXRzIG5hbWUsIHRoZSB2YWx1ZSBpdHMgYXR0cmlidXRlIGluZGV4LiBUaGlzIG1lbWJlciBpcyBgdW5kZWZpbmVkYFxyXG5cdFx0ICogYnkgZGVmYXVsdCBhbmQgb25seSBzZXQgd2hlbiBtb3JwaCB0YXJnZXRzIGFyZSBkZXRlY3RlZCBpbiB0aGUgZ2VvbWV0cnkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdDxTdHJpbmcsbnVtYmVyPnx1bmRlZmluZWR9XHJcblx0XHQgKiBAZGVmYXVsdCB1bmRlZmluZWRcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnkgPSB1bmRlZmluZWQ7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBhcnJheSBvZiB3ZWlnaHRzIHR5cGljYWxseSBpbiB0aGUgcmFuZ2UgYFswLDFdYCB0aGF0IHNwZWNpZnkgaG93IG11Y2ggb2YgdGhlIG1vcnBoXHJcblx0XHQgKiBpcyBhcHBsaWVkLiBUaGlzIG1lbWJlciBpcyBgdW5kZWZpbmVkYCBieSBkZWZhdWx0IGFuZCBvbmx5IHNldCB3aGVuIG1vcnBoIHRhcmdldHMgYXJlXHJcblx0XHQgKiBkZXRlY3RlZCBpbiB0aGUgZ2VvbWV0cnkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PG51bWJlcj58dW5kZWZpbmVkfVxyXG5cdFx0ICogQGRlZmF1bHQgdW5kZWZpbmVkXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzID0gdW5kZWZpbmVkO1xyXG5cclxuXHRcdHRoaXMudXBkYXRlTW9ycGhUYXJnZXRzKCk7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlLCByZWN1cnNpdmUgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlLCByZWN1cnNpdmUgKTtcclxuXHJcblx0XHR0aGlzLm1hdGVyaWFsID0gQXJyYXkuaXNBcnJheSggc291cmNlLm1hdGVyaWFsICkgPyBzb3VyY2UubWF0ZXJpYWwuc2xpY2UoKSA6IHNvdXJjZS5tYXRlcmlhbDtcclxuXHRcdHRoaXMuZ2VvbWV0cnkgPSBzb3VyY2UuZ2VvbWV0cnk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgaW50ZXJzZWN0aW9uIHBvaW50cyBiZXR3ZWVuIGEgY2FzdGVkIHJheSBhbmQgdGhpcyBwb2ludCBjbG91ZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmF5Y2FzdGVyfSByYXljYXN0ZXIgLSBUaGUgcmF5Y2FzdGVyLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8T2JqZWN0Pn0gaW50ZXJzZWN0cyAtIFRoZSB0YXJnZXQgYXJyYXkgdGhhdCBob2xkcyB0aGUgaW50ZXJzZWN0aW9uIHBvaW50cy5cclxuXHQgKi9cclxuXHRyYXljYXN0KCByYXljYXN0ZXIsIGludGVyc2VjdHMgKSB7XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xyXG5cdFx0Y29uc3QgbWF0cml4V29ybGQgPSB0aGlzLm1hdHJpeFdvcmxkO1xyXG5cdFx0Y29uc3QgdGhyZXNob2xkID0gcmF5Y2FzdGVyLnBhcmFtcy5Qb2ludHMudGhyZXNob2xkO1xyXG5cdFx0Y29uc3QgZHJhd1JhbmdlID0gZ2VvbWV0cnkuZHJhd1JhbmdlO1xyXG5cclxuXHRcdC8vIENoZWNraW5nIGJvdW5kaW5nU3BoZXJlIGRpc3RhbmNlIHRvIHJheVxyXG5cclxuXHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSBnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcclxuXHJcblx0XHRfc3BoZXJlLmNvcHkoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlICk7XHJcblx0XHRfc3BoZXJlLmFwcGx5TWF0cml4NCggbWF0cml4V29ybGQgKTtcclxuXHRcdF9zcGhlcmUucmFkaXVzICs9IHRocmVzaG9sZDtcclxuXHJcblx0XHRpZiAoIHJheWNhc3Rlci5yYXkuaW50ZXJzZWN0c1NwaGVyZSggX3NwaGVyZSApID09PSBmYWxzZSApIHJldHVybjtcclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdF9pbnZlcnNlTWF0cml4LmNvcHkoIG1hdHJpeFdvcmxkICkuaW52ZXJ0KCk7XHJcblx0XHRfcmF5LmNvcHkoIHJheWNhc3Rlci5yYXkgKS5hcHBseU1hdHJpeDQoIF9pbnZlcnNlTWF0cml4ICk7XHJcblxyXG5cdFx0Y29uc3QgbG9jYWxUaHJlc2hvbGQgPSB0aHJlc2hvbGQgLyAoICggdGhpcy5zY2FsZS54ICsgdGhpcy5zY2FsZS55ICsgdGhpcy5zY2FsZS56ICkgLyAzICk7XHJcblx0XHRjb25zdCBsb2NhbFRocmVzaG9sZFNxID0gbG9jYWxUaHJlc2hvbGQgKiBsb2NhbFRocmVzaG9sZDtcclxuXHJcblx0XHRjb25zdCBpbmRleCA9IGdlb21ldHJ5LmluZGV4O1xyXG5cdFx0Y29uc3QgYXR0cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXM7XHJcblx0XHRjb25zdCBwb3NpdGlvbkF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMucG9zaXRpb247XHJcblxyXG5cdFx0aWYgKCBpbmRleCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGNvbnN0IHN0YXJ0ID0gTWF0aC5tYXgoIDAsIGRyYXdSYW5nZS5zdGFydCApO1xyXG5cdFx0XHRjb25zdCBlbmQgPSBNYXRoLm1pbiggaW5kZXguY291bnQsICggZHJhd1JhbmdlLnN0YXJ0ICsgZHJhd1JhbmdlLmNvdW50ICkgKTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gc3RhcnQsIGlsID0gZW5kOyBpIDwgaWw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGEgPSBpbmRleC5nZXRYKCBpICk7XHJcblxyXG5cdFx0XHRcdF9wb3NpdGlvbi5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbkF0dHJpYnV0ZSwgYSApO1xyXG5cclxuXHRcdFx0XHR0ZXN0UG9pbnQoIF9wb3NpdGlvbiwgYSwgbG9jYWxUaHJlc2hvbGRTcSwgbWF0cml4V29ybGQsIHJheWNhc3RlciwgaW50ZXJzZWN0cywgdGhpcyApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRjb25zdCBzdGFydCA9IE1hdGgubWF4KCAwLCBkcmF3UmFuZ2Uuc3RhcnQgKTtcclxuXHRcdFx0Y29uc3QgZW5kID0gTWF0aC5taW4oIHBvc2l0aW9uQXR0cmlidXRlLmNvdW50LCAoIGRyYXdSYW5nZS5zdGFydCArIGRyYXdSYW5nZS5jb3VudCApICk7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IHN0YXJ0LCBsID0gZW5kOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0X3Bvc2l0aW9uLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uQXR0cmlidXRlLCBpICk7XHJcblxyXG5cdFx0XHRcdHRlc3RQb2ludCggX3Bvc2l0aW9uLCBpLCBsb2NhbFRocmVzaG9sZFNxLCBtYXRyaXhXb3JsZCwgcmF5Y2FzdGVyLCBpbnRlcnNlY3RzLCB0aGlzICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHZhbHVlcyBvZiB7QGxpbmsgUG9pbnRzI21vcnBoVGFyZ2V0RGljdGlvbmFyeX0gYW5kIHtAbGluayBQb2ludHMjbW9ycGhUYXJnZXRJbmZsdWVuY2VzfVxyXG5cdCAqIHRvIG1ha2Ugc3VyZSBleGlzdGluZyBtb3JwaCB0YXJnZXRzIGNhbiBpbmZsdWVuY2UgdGhpcyAzRCBvYmplY3QuXHJcblx0ICovXHJcblx0dXBkYXRlTW9ycGhUYXJnZXRzKCkge1xyXG5cclxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcclxuXHJcblx0XHRjb25zdCBtb3JwaEF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXM7XHJcblx0XHRjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoIG1vcnBoQXR0cmlidXRlcyApO1xyXG5cclxuXHRcdGlmICgga2V5cy5sZW5ndGggPiAwICkge1xyXG5cclxuXHRcdFx0Y29uc3QgbW9ycGhBdHRyaWJ1dGUgPSBtb3JwaEF0dHJpYnV0ZXNbIGtleXNbIDAgXSBdO1xyXG5cclxuXHRcdFx0aWYgKCBtb3JwaEF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyA9IFtdO1xyXG5cdFx0XHRcdHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5ID0ge307XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBtID0gMCwgbWwgPSBtb3JwaEF0dHJpYnV0ZS5sZW5ndGg7IG0gPCBtbDsgbSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBuYW1lID0gbW9ycGhBdHRyaWJ1dGVbIG0gXS5uYW1lIHx8IFN0cmluZyggbSApO1xyXG5cclxuXHRcdFx0XHRcdHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnB1c2goIDAgKTtcclxuXHRcdFx0XHRcdHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5WyBuYW1lIF0gPSBtO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiB0ZXN0UG9pbnQoIHBvaW50LCBpbmRleCwgbG9jYWxUaHJlc2hvbGRTcSwgbWF0cml4V29ybGQsIHJheWNhc3RlciwgaW50ZXJzZWN0cywgb2JqZWN0ICkge1xyXG5cclxuXHRjb25zdCByYXlQb2ludERpc3RhbmNlU3EgPSBfcmF5LmRpc3RhbmNlU3FUb1BvaW50KCBwb2ludCApO1xyXG5cclxuXHRpZiAoIHJheVBvaW50RGlzdGFuY2VTcSA8IGxvY2FsVGhyZXNob2xkU3EgKSB7XHJcblxyXG5cdFx0Y29uc3QgaW50ZXJzZWN0UG9pbnQgPSBuZXcgVmVjdG9yMygpO1xyXG5cclxuXHRcdF9yYXkuY2xvc2VzdFBvaW50VG9Qb2ludCggcG9pbnQsIGludGVyc2VjdFBvaW50ICk7XHJcblx0XHRpbnRlcnNlY3RQb2ludC5hcHBseU1hdHJpeDQoIG1hdHJpeFdvcmxkICk7XHJcblxyXG5cdFx0Y29uc3QgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKCBpbnRlcnNlY3RQb2ludCApO1xyXG5cclxuXHRcdGlmICggZGlzdGFuY2UgPCByYXljYXN0ZXIubmVhciB8fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSByZXR1cm47XHJcblxyXG5cdFx0aW50ZXJzZWN0cy5wdXNoKCB7XHJcblxyXG5cdFx0XHRkaXN0YW5jZTogZGlzdGFuY2UsXHJcblx0XHRcdGRpc3RhbmNlVG9SYXk6IE1hdGguc3FydCggcmF5UG9pbnREaXN0YW5jZVNxICksXHJcblx0XHRcdHBvaW50OiBpbnRlcnNlY3RQb2ludCxcclxuXHRcdFx0aW5kZXg6IGluZGV4LFxyXG5cdFx0XHRmYWNlOiBudWxsLFxyXG5cdFx0XHRmYWNlSW5kZXg6IG51bGwsXHJcblx0XHRcdGJhcnljb29yZDogbnVsbCxcclxuXHRcdFx0b2JqZWN0OiBvYmplY3RcclxuXHJcblx0XHR9ICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFBvaW50cyB9O1xyXG4iLCJpbXBvcnQgeyBMaW5lYXJGaWx0ZXIgfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBUZXh0dXJlIH0gZnJvbSAnLi9UZXh0dXJlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIHRleHR1cmUgZm9yIHVzZSB3aXRoIGEgdmlkZW8uXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIC8vIGFzc3VtaW5nIHlvdSBoYXZlIGNyZWF0ZWQgYSBIVE1MIHZpZGVvIGVsZW1lbnQgd2l0aCBpZD1cInZpZGVvXCJcclxuICogY29uc3QgdmlkZW8gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggJ3ZpZGVvJyApO1xyXG4gKiBjb25zdCB0ZXh0dXJlID0gbmV3IFRIUkVFLlZpZGVvVGV4dHVyZSggdmlkZW8gKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIE5vdGU6IEFmdGVyIHRoZSBpbml0aWFsIHVzZSBvZiBhIHRleHR1cmUsIGl0cyBkaW1lbnNpb25zLCBmb3JtYXQsIGFuZCB0eXBlXHJcbiAqIGNhbm5vdCBiZSBjaGFuZ2VkLiBJbnN0ZWFkLCBjYWxsIHtAbGluayBUZXh0dXJlI2Rpc3Bvc2V9IG9uIHRoZSB0ZXh0dXJlIGFuZCBpbnN0YW50aWF0ZSBhIG5ldyBvbmUuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBUZXh0dXJlXHJcbiAqL1xyXG5jbGFzcyBWaWRlb1RleHR1cmUgZXh0ZW5kcyBUZXh0dXJlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB2aWRlbyB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWaWRlb30gdmlkZW8gLSBUaGUgdmlkZW8gZWxlbWVudCB0byB1c2UgYXMgYSBkYXRhIHNvdXJjZSBmb3IgdGhlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFttYXBwaW5nPVRleHR1cmUuREVGQVVMVF9NQVBQSU5HXSAtIFRoZSB0ZXh0dXJlIG1hcHBpbmcuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt3cmFwUz1DbGFtcFRvRWRnZVdyYXBwaW5nXSAtIFRoZSB3cmFwUyB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3dyYXBUPUNsYW1wVG9FZGdlV3JhcHBpbmddIC0gVGhlIHdyYXBUIHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbWFnRmlsdGVyPUxpbmVhckZpbHRlcl0gLSBUaGUgbWFnIGZpbHRlciB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW21pbkZpbHRlcj1MaW5lYXJGaWx0ZXJdIC0gVGhlIG1pbiBmaWx0ZXIgdmFsdWUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtmb3JtYXQ9UkdCQUZvcm1hdF0gLSBUaGUgdGV4dHVyZSBmb3JtYXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt0eXBlPVVuc2lnbmVkQnl0ZVR5cGVdIC0gVGhlIHRleHR1cmUgdHlwZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2FuaXNvdHJvcHk9VGV4dHVyZS5ERUZBVUxUX0FOSVNPVFJPUFldIC0gVGhlIGFuaXNvdHJvcHkgdmFsdWUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHZpZGVvLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciA9IExpbmVhckZpbHRlciwgbWluRmlsdGVyID0gTGluZWFyRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHkgKSB7XHJcblxyXG5cdFx0c3VwZXIoIHZpZGVvLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHkgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNWaWRlb1RleHR1cmUgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0byBnZW5lcmF0ZSBtaXBtYXBzIChpZiBwb3NzaWJsZSkgZm9yIGEgdGV4dHVyZS5cclxuXHRcdCAqXHJcblx0XHQgKiBPdmVyd3JpdHRlbiBhbmQgc2V0IHRvIGBmYWxzZWAgYnkgZGVmYXVsdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XHJcblxyXG5cdFx0Y29uc3Qgc2NvcGUgPSB0aGlzO1xyXG5cclxuXHRcdGZ1bmN0aW9uIHVwZGF0ZVZpZGVvKCkge1xyXG5cclxuXHRcdFx0c2NvcGUubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cdFx0XHR2aWRlby5yZXF1ZXN0VmlkZW9GcmFtZUNhbGxiYWNrKCB1cGRhdGVWaWRlbyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoICdyZXF1ZXN0VmlkZW9GcmFtZUNhbGxiYWNrJyBpbiB2aWRlbyApIHtcclxuXHJcblx0XHRcdHZpZGVvLnJlcXVlc3RWaWRlb0ZyYW1lQ2FsbGJhY2soIHVwZGF0ZVZpZGVvICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGNsb25lKCkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5pbWFnZSApLmNvcHkoIHRoaXMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSBieSB0aGUgcmVuZGVyZXIgYW5kIHNldHMge0BsaW5rIFRleHR1cmUjbmVlZHNVcGRhdGV9XHJcblx0ICogdG8gYHRydWVgIGV2ZXJ5IHRpbWUgYSBuZXcgZnJhbWUgaXMgYXZhaWxhYmxlLlxyXG5cdCAqXHJcblx0ICogT25seSByZWxldmFudCBpZiBgcmVxdWVzdFZpZGVvRnJhbWVDYWxsYmFja2AgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgYnJvd3Nlci5cclxuXHQgKi9cclxuXHR1cGRhdGUoKSB7XHJcblxyXG5cdFx0Y29uc3QgdmlkZW8gPSB0aGlzLmltYWdlO1xyXG5cdFx0Y29uc3QgaGFzVmlkZW9GcmFtZUNhbGxiYWNrID0gJ3JlcXVlc3RWaWRlb0ZyYW1lQ2FsbGJhY2snIGluIHZpZGVvO1xyXG5cclxuXHRcdGlmICggaGFzVmlkZW9GcmFtZUNhbGxiYWNrID09PSBmYWxzZSAmJiB2aWRlby5yZWFkeVN0YXRlID49IHZpZGVvLkhBVkVfQ1VSUkVOVF9EQVRBICkge1xyXG5cclxuXHRcdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBWaWRlb1RleHR1cmUgfTtcclxuIiwiaW1wb3J0IHsgVmlkZW9UZXh0dXJlIH0gZnJvbSAnLi9WaWRlb1RleHR1cmUuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgYXMgYW4gYWx0ZXJuYXRpdmUgd2F5IHRvIGRlZmluZSB2aWRlbyBkYXRhLiBJbnN0ZWFkIG9mIHVzaW5nXHJcbiAqIGFuIGluc3RhbmNlIG9mIGBIVE1MVmlkZW9FbGVtZW50YCBsaWtlIHdpdGggYFZpZGVvVGV4dHVyZWAsIGBWaWRlb0ZyYW1lVGV4dHVyZWAgZXhwZWN0cyBlYWNoIGZyYW1lIGlzXHJcbiAqIGRlZmluZWQgbWFudWFsbHkgdmlhIHtAbGluayBWaWRlb0ZyYW1lVGV4dHVyZSNzZXRGcmFtZX0uIEEgdHlwaWNhbCB1c2UgY2FzZSBmb3IgdGhpcyBtb2R1bGUgaXMgd2hlblxyXG4gKiB2aWRlbyBmcmFtZXMgYXJlIGRlY29kZWQgd2l0aCB0aGUgV2ViQ29kZWNzIEFQSS5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgdGV4dHVyZSA9IG5ldyBUSFJFRS5WaWRlb0ZyYW1lVGV4dHVyZSgpO1xyXG4gKiB0ZXh0dXJlLnNldEZyYW1lKCBmcmFtZSApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIFZpZGVvVGV4dHVyZVxyXG4gKi9cclxuY2xhc3MgVmlkZW9GcmFtZVRleHR1cmUgZXh0ZW5kcyBWaWRlb1RleHR1cmUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHZpZGVvIGZyYW1lIHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW21hcHBpbmc9VGV4dHVyZS5ERUZBVUxUX01BUFBJTkddIC0gVGhlIHRleHR1cmUgbWFwcGluZy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3dyYXBTPUNsYW1wVG9FZGdlV3JhcHBpbmddIC0gVGhlIHdyYXBTIHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbd3JhcFQ9Q2xhbXBUb0VkZ2VXcmFwcGluZ10gLSBUaGUgd3JhcFQgdmFsdWUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFttYWdGaWx0ZXI9TGluZWFyRmlsdGVyXSAtIFRoZSBtYWcgZmlsdGVyIHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbWluRmlsdGVyPUxpbmVhckZpbHRlcl0gLSBUaGUgbWluIGZpbHRlciB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2Zvcm1hdD1SR0JBRm9ybWF0XSAtIFRoZSB0ZXh0dXJlIGZvcm1hdC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3R5cGU9VW5zaWduZWRCeXRlVHlwZV0gLSBUaGUgdGV4dHVyZSB0eXBlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbYW5pc290cm9weT1UZXh0dXJlLkRFRkFVTFRfQU5JU09UUk9QWV0gLSBUaGUgYW5pc290cm9weSB2YWx1ZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5ICkge1xyXG5cclxuXHRcdHN1cGVyKCB7fSwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5ICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzVmlkZW9GcmFtZVRleHR1cmUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIG92ZXJ3cml0dGVuIHdpdGggYW4gZW1wdHkgaW1wbGVtZW50YXRpb24gc2luY2VcclxuXHQgKiB0aGlzIHR5cGUgb2YgdGV4dHVyZSBpcyB1cGRhdGVkIHZpYSBgc2V0RnJhbWUoKWAuXHJcblx0ICovXHJcblx0dXBkYXRlKCkge31cclxuXHJcblx0Y2xvbmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApOyAvLyByZXN0b3JpbmcgVGV4dHVyZS5jbG9uZSgpXHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgY3VycmVudCBmcmFtZSBvZiB0aGUgdmlkZW8uIFRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IHVwZGF0ZSB0aGUgdGV4dHVyZVxyXG5cdCAqIHNvIHRoZSBkYXRhIGNhbiBiZSB1c2VkIGZvciByZW5kZXJpbmcuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZpZGVvRnJhbWV9IGZyYW1lIC0gVGhlIHZpZGVvIGZyYW1lLlxyXG5cdCAqL1xyXG5cdHNldEZyYW1lKCBmcmFtZSApIHtcclxuXHJcblx0XHR0aGlzLmltYWdlID0gZnJhbWU7XHJcblx0XHR0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgVmlkZW9GcmFtZVRleHR1cmUgfTtcclxuIiwiaW1wb3J0IHsgVGV4dHVyZSB9IGZyb20gJy4vVGV4dHVyZS5qcyc7XHJcbmltcG9ydCB7IE5lYXJlc3RGaWx0ZXIgfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgY2xhc3MgY2FuIG9ubHkgYmUgdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIGBjb3B5RnJhbWVidWZmZXJUb1RleHR1cmUoKWAgbWV0aG9kc1xyXG4gKiBvZiByZW5kZXJlcnMuIEl0IGV4dHJhY3RzIHRoZSBjb250ZW50cyBvZiB0aGUgY3VycmVudCBib3VuZCBmcmFtZWJ1ZmZlciBhbmQgcHJvdmlkZXMgaXRcclxuICogYXMgYSB0ZXh0dXJlIGZvciBmdXJ0aGVyIHVzYWdlLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBwaXhlbFJhdGlvID0gd2luZG93LmRldmljZVBpeGVsUmF0aW87XHJcbiAqIGNvbnN0IHRleHR1cmVTaXplID0gMTI4ICogcGl4ZWxSYXRpbztcclxuICpcclxuICogY29uc3QgZnJhbWVUZXh0dXJlID0gbmV3IEZyYW1lYnVmZmVyVGV4dHVyZSggdGV4dHVyZVNpemUsIHRleHR1cmVTaXplICk7XHJcbiAqXHJcbiAqIC8vIGNhbGN1bGF0ZSBzdGFydCBwb3NpdGlvbiBmb3IgY29weWluZyBwYXJ0IG9mIHRoZSBmcmFtZSBkYXRhXHJcbiAqIGNvbnN0IHZlY3RvciA9IG5ldyBWZWN0b3IyKCk7XHJcbiAqIHZlY3Rvci54ID0gKCB3aW5kb3cuaW5uZXJXaWR0aCAqIHBpeGVsUmF0aW8gLyAyICkgLSAoIHRleHR1cmVTaXplIC8gMiApO1xyXG4gKiB2ZWN0b3IueSA9ICggd2luZG93LmlubmVySGVpZ2h0ICogcGl4ZWxSYXRpbyAvIDIgKSAtICggdGV4dHVyZVNpemUgLyAyICk7XHJcbiAqXHJcbiAqIHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYSApO1xyXG4gKlxyXG4gKiAvLyBjb3B5IHBhcnQgb2YgdGhlIHJlbmRlcmVkIGZyYW1lIGludG8gdGhlIGZyYW1lYnVmZmVyIHRleHR1cmVcclxuICogcmVuZGVyZXIuY29weUZyYW1lYnVmZmVyVG9UZXh0dXJlKCBmcmFtZVRleHR1cmUsIHZlY3RvciApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIFRleHR1cmVcclxuICovXHJcbmNsYXNzIEZyYW1lYnVmZmVyVGV4dHVyZSBleHRlbmRzIFRleHR1cmUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGZyYW1lYnVmZmVyIHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIHRleHR1cmUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHdpZHRoLCBoZWlnaHQgKSB7XHJcblxyXG5cdFx0c3VwZXIoIHsgd2lkdGgsIGhlaWdodCB9ICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzRnJhbWVidWZmZXJUZXh0dXJlID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvdyB0aGUgdGV4dHVyZSBpcyBzYW1wbGVkIHdoZW4gYSB0ZXhlbCBjb3ZlcnMgbW9yZSB0aGFuIG9uZSBwaXhlbC5cclxuXHRcdCAqXHJcblx0XHQgKiBPdmVyd3JpdHRlbiBhbmQgc2V0IHRvIGBOZWFyZXN0RmlsdGVyYCBieSBkZWZhdWx0IHRvIGRpc2FibGUgZmlsdGVyaW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoTmVhcmVzdEZpbHRlcnxOZWFyZXN0TWlwbWFwTmVhcmVzdEZpbHRlcnxOZWFyZXN0TWlwbWFwTGluZWFyRmlsdGVyfExpbmVhckZpbHRlcnxMaW5lYXJNaXBtYXBOZWFyZXN0RmlsdGVyfExpbmVhck1pcG1hcExpbmVhckZpbHRlcil9XHJcblx0XHQgKiBAZGVmYXVsdCBOZWFyZXN0RmlsdGVyXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWFnRmlsdGVyID0gTmVhcmVzdEZpbHRlcjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvdyB0aGUgdGV4dHVyZSBpcyBzYW1wbGVkIHdoZW4gYSB0ZXhlbCBjb3ZlcnMgbGVzcyB0aGFuIG9uZSBwaXhlbC5cclxuXHRcdCAqXHJcblx0XHQgKiBPdmVyd3JpdHRlbiBhbmQgc2V0IHRvIGBOZWFyZXN0RmlsdGVyYCBieSBkZWZhdWx0IHRvIGRpc2FibGUgZmlsdGVyaW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoTmVhcmVzdEZpbHRlcnxOZWFyZXN0TWlwbWFwTmVhcmVzdEZpbHRlcnxOZWFyZXN0TWlwbWFwTGluZWFyRmlsdGVyfExpbmVhckZpbHRlcnxMaW5lYXJNaXBtYXBOZWFyZXN0RmlsdGVyfExpbmVhck1pcG1hcExpbmVhckZpbHRlcil9XHJcblx0XHQgKiBAZGVmYXVsdCBOZWFyZXN0RmlsdGVyXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWluRmlsdGVyID0gTmVhcmVzdEZpbHRlcjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdG8gZ2VuZXJhdGUgbWlwbWFwcyAoaWYgcG9zc2libGUpIGZvciBhIHRleHR1cmUuXHJcblx0XHQgKlxyXG5cdFx0ICogT3ZlcndyaXR0ZW4gYW5kIHNldCB0byBgZmFsc2VgIGJ5IGRlZmF1bHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xyXG5cclxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBGcmFtZWJ1ZmZlclRleHR1cmUgfTtcclxuIiwiaW1wb3J0IHsgVGV4dHVyZSB9IGZyb20gJy4vVGV4dHVyZS5qcyc7XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIHRleHR1cmUgYmFzZWQgb24gZGF0YSBpbiBjb21wcmVzc2VkIGZvcm0uXHJcbiAqXHJcbiAqIFRoZXNlIHRleHR1cmUgYXJlIHVzdWFsbHkgbG9hZGVkIHdpdGgge0BsaW5rIENvbXByZXNzZWRUZXh0dXJlTG9hZGVyfS5cclxuICpcclxuICogQGF1Z21lbnRzIFRleHR1cmVcclxuICovXHJcbmNsYXNzIENvbXByZXNzZWRUZXh0dXJlIGV4dGVuZHMgVGV4dHVyZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgY29tcHJlc3NlZCB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxPYmplY3Q+fSBtaXBtYXBzIC0gVGhpcyBhcnJheSBob2xkcyBmb3IgYWxsIG1pcG1hcHMgKGluY2x1ZGluZyB0aGUgYmFzZXMgbWlwKVxyXG5cdCAqIHRoZSBkYXRhIGFuZCBkaW1lbnNpb25zLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2Zvcm1hdD1SR0JBRm9ybWF0XSAtIFRoZSB0ZXh0dXJlIGZvcm1hdC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3R5cGU9VW5zaWduZWRCeXRlVHlwZV0gLSBUaGUgdGV4dHVyZSB0eXBlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbWFwcGluZz1UZXh0dXJlLkRFRkFVTFRfTUFQUElOR10gLSBUaGUgdGV4dHVyZSBtYXBwaW5nLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbd3JhcFM9Q2xhbXBUb0VkZ2VXcmFwcGluZ10gLSBUaGUgd3JhcFMgdmFsdWUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt3cmFwVD1DbGFtcFRvRWRnZVdyYXBwaW5nXSAtIFRoZSB3cmFwVCB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW21hZ0ZpbHRlcj1MaW5lYXJGaWx0ZXJdIC0gVGhlIG1hZyBmaWx0ZXIgdmFsdWUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFttaW5GaWx0ZXI9TGluZWFyTWlwbWFwTGluZWFyRmlsdGVyXSAtIFRoZSBtaW4gZmlsdGVyIHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbYW5pc290cm9weT1UZXh0dXJlLkRFRkFVTFRfQU5JU09UUk9QWV0gLSBUaGUgYW5pc290cm9weSB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW2NvbG9yU3BhY2U9Tm9Db2xvclNwYWNlXSAtIFRoZSBjb2xvciBzcGFjZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbWlwbWFwcywgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0eXBlLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBhbmlzb3Ryb3B5LCBjb2xvclNwYWNlICkge1xyXG5cclxuXHRcdHN1cGVyKCBudWxsLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHksIGNvbG9yU3BhY2UgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNDb21wcmVzc2VkVGV4dHVyZSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgaW1hZ2UgcHJvcGVydHkgb2YgYSBjb21wcmVzc2VkIHRleHR1cmUganVzdCBkZWZpbmVzIGl0cyBkaW1lbnNpb25zLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHt7d2lkdGg6bnVtYmVyLGhlaWdodDpudW1iZXJ9fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmltYWdlID0geyB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0IH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGFycmF5IGhvbGRzIGZvciBhbGwgbWlwbWFwcyAoaW5jbHVkaW5nIHRoZSBiYXNlcyBtaXApIHRoZSBkYXRhIGFuZCBkaW1lbnNpb25zLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxPYmplY3Q+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1pcG1hcHMgPSBtaXBtYXBzO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSWYgc2V0IHRvIGB0cnVlYCwgdGhlIHRleHR1cmUgaXMgZmxpcHBlZCBhbG9uZyB0aGUgdmVydGljYWwgYXhpcyB3aGVuXHJcblx0XHQgKiB1cGxvYWRlZCB0byB0aGUgR1BVLlxyXG5cdFx0ICpcclxuXHRcdCAqIE92ZXJ3cml0dGVuIGFuZCBzZXQgdG8gYGZhbHNlYCBieSBkZWZhdWx0IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0b1xyXG5cdFx0ICogZmxpcCBjb21wcmVzc2VkIHRleHR1cmVzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZsaXBZID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRvIGdlbmVyYXRlIG1pcG1hcHMgKGlmIHBvc3NpYmxlKSBmb3IgYSB0ZXh0dXJlLlxyXG5cdFx0ICpcclxuXHRcdCAqIE92ZXJ3cml0dGVuIGFuZCBzZXQgdG8gYGZhbHNlYCBieSBkZWZhdWx0IHNpbmNlIGl0IGlzIG5vdFxyXG5cdFx0ICogcG9zc2libGUgdG8gZ2VuZXJhdGUgbWlwbWFwcyBmb3IgY29tcHJlc3NlZCBkYXRhLiBNaXBtYXBzXHJcblx0XHQgKiBtdXN0IGJlIGVtYmVkZGVkIGluIHRoZSBjb21wcmVzc2VkIHRleHR1cmUgZmlsZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgQ29tcHJlc3NlZFRleHR1cmUgfTtcclxuIiwiaW1wb3J0IHsgQ2xhbXBUb0VkZ2VXcmFwcGluZyB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IENvbXByZXNzZWRUZXh0dXJlIH0gZnJvbSAnLi9Db21wcmVzc2VkVGV4dHVyZS5qcyc7XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIHRleHR1cmUgMkQgYXJyYXkgYmFzZWQgb24gZGF0YSBpbiBjb21wcmVzc2VkIGZvcm0uXHJcbiAqXHJcbiAqIFRoZXNlIHRleHR1cmUgYXJlIHVzdWFsbHkgbG9hZGVkIHdpdGgge0BsaW5rIENvbXByZXNzZWRUZXh0dXJlTG9hZGVyfS5cclxuICpcclxuICogQGF1Z21lbnRzIENvbXByZXNzZWRUZXh0dXJlXHJcbiAqL1xyXG5jbGFzcyBDb21wcmVzc2VkQXJyYXlUZXh0dXJlIGV4dGVuZHMgQ29tcHJlc3NlZFRleHR1cmUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGNvbXByZXNzZWQgYXJyYXkgdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8T2JqZWN0Pn0gbWlwbWFwcyAtIFRoaXMgYXJyYXkgaG9sZHMgZm9yIGFsbCBtaXBtYXBzIChpbmNsdWRpbmcgdGhlIGJhc2VzIG1pcClcclxuXHQgKiB0aGUgZGF0YSBhbmQgZGltZW5zaW9ucy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGRlcHRoIC0gVGhlIGRlcHRoIG9mIHRoZSB0ZXh0dXJlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZm9ybWF0PVJHQkFGb3JtYXRdIC0gVGhlIG1pbiBmaWx0ZXIgdmFsdWUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt0eXBlPVVuc2lnbmVkQnl0ZVR5cGVdIC0gVGhlIG1pbiBmaWx0ZXIgdmFsdWUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG1pcG1hcHMsIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBmb3JtYXQsIHR5cGUgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG1pcG1hcHMsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0NvbXByZXNzZWRBcnJheVRleHR1cmUgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGltYWdlIHByb3BlcnR5IG9mIGEgY29tcHJlc3NlZCB0ZXh0dXJlIGp1c3QgZGVmaW5lcyBpdHMgZGltZW5zaW9ucy5cclxuXHRcdCAqXHJcblx0XHQgKiBAbmFtZSBDb21wcmVzc2VkQXJyYXlUZXh0dXJlI2ltYWdlXHJcblx0XHQgKiBAdHlwZSB7e3dpZHRoOm51bWJlcixoZWlnaHQ6bnVtYmVyLGRlcHRoOm51bWJlcn19XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaW1hZ2UuZGVwdGggPSBkZXB0aDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZGVmaW5lcyBob3cgdGhlIHRleHR1cmUgaXMgd3JhcHBlZCBpbiB0aGUgZGVwdGggYW5kIGNvcnJlc3BvbmRzIHRvXHJcblx0XHQgKiAqVyogaW4gVVZXIG1hcHBpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeyhSZXBlYXRXcmFwcGluZ3xDbGFtcFRvRWRnZVdyYXBwaW5nfE1pcnJvcmVkUmVwZWF0V3JhcHBpbmcpfVxyXG5cdFx0ICogQGRlZmF1bHQgQ2xhbXBUb0VkZ2VXcmFwcGluZ1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLndyYXBSID0gQ2xhbXBUb0VkZ2VXcmFwcGluZztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgc2V0IG9mIGFsbCBsYXllcnMgd2hpY2ggbmVlZCB0byBiZSB1cGRhdGVkIGluIHRoZSB0ZXh0dXJlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtTZXQ8bnVtYmVyPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5sYXllclVwZGF0ZXMgPSBuZXcgU2V0KCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVzY3JpYmVzIHRoYXQgYSBzcGVjaWZpYyBsYXllciBvZiB0aGUgdGV4dHVyZSBuZWVkcyB0byBiZSB1cGRhdGVkLlxyXG5cdCAqIE5vcm1hbGx5IHdoZW4ge0BsaW5rIFRleHR1cmUjbmVlZHNVcGRhdGV9IGlzIHNldCB0byBgdHJ1ZWAsIHRoZVxyXG5cdCAqIGVudGlyZSBjb21wcmVzc2VkIHRleHR1cmUgYXJyYXkgaXMgc2VudCB0byB0aGUgR1BVLiBNYXJraW5nIHNwZWNpZmljXHJcblx0ICogbGF5ZXJzIHdpbGwgb25seSB0cmFuc21pdCBzdWJzZXRzIG9mIGFsbCBtaXBtYXBzIGFzc29jaWF0ZWQgd2l0aCBhXHJcblx0ICogc3BlY2lmaWMgZGVwdGggaW4gdGhlIGFycmF5IHdoaWNoIGlzIG9mdGVuIG11Y2ggbW9yZSBwZXJmb3JtYW50LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGxheWVySW5kZXggLSBUaGUgbGF5ZXIgaW5kZXggdGhhdCBzaG91bGQgYmUgdXBkYXRlZC5cclxuXHQgKi9cclxuXHRhZGRMYXllclVwZGF0ZSggbGF5ZXJJbmRleCApIHtcclxuXHJcblx0XHR0aGlzLmxheWVyVXBkYXRlcy5hZGQoIGxheWVySW5kZXggKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXNldHMgdGhlIGxheWVyIHVwZGF0ZXMgcmVnaXN0cnkuXHJcblx0ICovXHJcblx0Y2xlYXJMYXllclVwZGF0ZXMoKSB7XHJcblxyXG5cdFx0dGhpcy5sYXllclVwZGF0ZXMuY2xlYXIoKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgQ29tcHJlc3NlZEFycmF5VGV4dHVyZSB9O1xyXG4iLCJpbXBvcnQgeyBDdWJlUmVmbGVjdGlvbk1hcHBpbmcgfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBDb21wcmVzc2VkVGV4dHVyZSB9IGZyb20gJy4vQ29tcHJlc3NlZFRleHR1cmUuanMnO1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSBjdWJlIHRleHR1cmUgYmFzZWQgb24gZGF0YSBpbiBjb21wcmVzc2VkIGZvcm0uXHJcbiAqXHJcbiAqIFRoZXNlIHRleHR1cmUgYXJlIHVzdWFsbHkgbG9hZGVkIHdpdGgge0BsaW5rIENvbXByZXNzZWRUZXh0dXJlTG9hZGVyfS5cclxuICpcclxuICogQGF1Z21lbnRzIENvbXByZXNzZWRUZXh0dXJlXHJcbiAqL1xyXG5jbGFzcyBDb21wcmVzc2VkQ3ViZVRleHR1cmUgZXh0ZW5kcyBDb21wcmVzc2VkVGV4dHVyZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgY29tcHJlc3NlZCB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxDb21wcmVzc2VkVGV4dHVyZT59IGltYWdlcyAtIEFuIGFycmF5IG9mIGNvbXByZXNzZWQgdGV4dHVyZXMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtmb3JtYXQ9UkdCQUZvcm1hdF0gLSBUaGUgdGV4dHVyZSBmb3JtYXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt0eXBlPVVuc2lnbmVkQnl0ZVR5cGVdIC0gVGhlIHRleHR1cmUgdHlwZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggaW1hZ2VzLCBmb3JtYXQsIHR5cGUgKSB7XHJcblxyXG5cdFx0c3VwZXIoIHVuZGVmaW5lZCwgaW1hZ2VzWyAwIF0ud2lkdGgsIGltYWdlc1sgMCBdLmhlaWdodCwgZm9ybWF0LCB0eXBlLCBDdWJlUmVmbGVjdGlvbk1hcHBpbmcgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNDb21wcmVzc2VkQ3ViZVRleHR1cmUgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0N1YmVUZXh0dXJlID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLmltYWdlID0gaW1hZ2VzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBDb21wcmVzc2VkQ3ViZVRleHR1cmUgfTtcclxuIiwiaW1wb3J0IHsgVGV4dHVyZSB9IGZyb20gJy4vVGV4dHVyZS5qcyc7XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIHRleHR1cmUgZnJvbSBhIGNhbnZhcyBlbGVtZW50LlxyXG4gKlxyXG4gKiBUaGlzIGlzIGFsbW9zdCB0aGUgc2FtZSBhcyB0aGUgYmFzZSB0ZXh0dXJlIGNsYXNzLCBleGNlcHQgdGhhdCBpdCBzZXRzIHtAbGluayBUZXh0dXJlI25lZWRzVXBkYXRlfVxyXG4gKiB0byBgdHJ1ZWAgaW1tZWRpYXRlbHkgc2luY2UgYSBjYW52YXMgY2FuIGRpcmVjdGx5IGJlIHVzZWQgZm9yIHJlbmRlcmluZy5cclxuICpcclxuICogQGF1Z21lbnRzIFRleHR1cmVcclxuICovXHJcbmNsYXNzIENhbnZhc1RleHR1cmUgZXh0ZW5kcyBUZXh0dXJlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtIVE1MQ2FudmFzRWxlbWVudH0gW2NhbnZhc10gLSBUaGUgSFRNTCBjYW52YXMgZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW21hcHBpbmc9VGV4dHVyZS5ERUZBVUxUX01BUFBJTkddIC0gVGhlIHRleHR1cmUgbWFwcGluZy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3dyYXBTPUNsYW1wVG9FZGdlV3JhcHBpbmddIC0gVGhlIHdyYXBTIHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbd3JhcFQ9Q2xhbXBUb0VkZ2VXcmFwcGluZ10gLSBUaGUgd3JhcFQgdmFsdWUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFttYWdGaWx0ZXI9TGluZWFyRmlsdGVyXSAtIFRoZSBtYWcgZmlsdGVyIHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbWluRmlsdGVyPUxpbmVhck1pcG1hcExpbmVhckZpbHRlcl0gLSBUaGUgbWluIGZpbHRlciB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2Zvcm1hdD1SR0JBRm9ybWF0XSAtIFRoZSB0ZXh0dXJlIGZvcm1hdC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3R5cGU9VW5zaWduZWRCeXRlVHlwZV0gLSBUaGUgdGV4dHVyZSB0eXBlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbYW5pc290cm9weT1UZXh0dXJlLkRFRkFVTFRfQU5JU09UUk9QWV0gLSBUaGUgYW5pc290cm9weSB2YWx1ZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggY2FudmFzLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHkgKSB7XHJcblxyXG5cdFx0c3VwZXIoIGNhbnZhcywgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5ICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzQ2FudmFzVGV4dHVyZSA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IENhbnZhc1RleHR1cmUgfTtcclxuIiwiaW1wb3J0IHsgU291cmNlIH0gZnJvbSAnLi9Tb3VyY2UuanMnO1xyXG5pbXBvcnQgeyBUZXh0dXJlIH0gZnJvbSAnLi9UZXh0dXJlLmpzJztcclxuaW1wb3J0IHsgTmVhcmVzdEZpbHRlciwgVW5zaWduZWRJbnRUeXBlLCBEZXB0aEZvcm1hdCwgRGVwdGhTdGVuY2lsRm9ybWF0IH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIHRvIGF1dG9tYXRpY2FsbHkgc2F2ZSB0aGUgZGVwdGggaW5mb3JtYXRpb24gb2YgYVxyXG4gKiByZW5kZXJpbmcgaW50byBhIHRleHR1cmUuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBUZXh0dXJlXHJcbiAqL1xyXG5jbGFzcyBEZXB0aFRleHR1cmUgZXh0ZW5kcyBUZXh0dXJlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBkZXB0aCB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSB0ZXh0dXJlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSB0ZXh0dXJlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbdHlwZT1VbnNpZ25lZEludFR5cGVdIC0gVGhlIHRleHR1cmUgdHlwZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW21hcHBpbmc9VGV4dHVyZS5ERUZBVUxUX01BUFBJTkddIC0gVGhlIHRleHR1cmUgbWFwcGluZy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3dyYXBTPUNsYW1wVG9FZGdlV3JhcHBpbmddIC0gVGhlIHdyYXBTIHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbd3JhcFQ9Q2xhbXBUb0VkZ2VXcmFwcGluZ10gLSBUaGUgd3JhcFQgdmFsdWUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFttYWdGaWx0ZXI9TGluZWFyRmlsdGVyXSAtIFRoZSBtYWcgZmlsdGVyIHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbWluRmlsdGVyPUxpbmVhckZpbHRlcl0gLSBUaGUgbWluIGZpbHRlciB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2FuaXNvdHJvcHk9VGV4dHVyZS5ERUZBVUxUX0FOSVNPVFJPUFldIC0gVGhlIGFuaXNvdHJvcHkgdmFsdWUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtmb3JtYXQ9RGVwdGhGb3JtYXRdIC0gVGhlIHRleHR1cmUgZm9ybWF0LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCB3aWR0aCwgaGVpZ2h0LCB0eXBlID0gVW5zaWduZWRJbnRUeXBlLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciA9IE5lYXJlc3RGaWx0ZXIsIG1pbkZpbHRlciA9IE5lYXJlc3RGaWx0ZXIsIGFuaXNvdHJvcHksIGZvcm1hdCA9IERlcHRoRm9ybWF0ICkge1xyXG5cclxuXHRcdGlmICggZm9ybWF0ICE9PSBEZXB0aEZvcm1hdCAmJiBmb3JtYXQgIT09IERlcHRoU3RlbmNpbEZvcm1hdCApIHtcclxuXHJcblx0XHRcdHRocm93IG5ldyBFcnJvciggJ0RlcHRoVGV4dHVyZSBmb3JtYXQgbXVzdCBiZSBlaXRoZXIgVEhSRUUuRGVwdGhGb3JtYXQgb3IgVEhSRUUuRGVwdGhTdGVuY2lsRm9ybWF0JyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRzdXBlciggbnVsbCwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5ICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzRGVwdGhUZXh0dXJlID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBpbWFnZSBwcm9wZXJ0eSBvZiBhIGRlcHRoIHRleHR1cmUganVzdCBkZWZpbmVzIGl0cyBkaW1lbnNpb25zLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHt7d2lkdGg6bnVtYmVyLGhlaWdodDpudW1iZXJ9fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmltYWdlID0geyB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0IH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBJZiBzZXQgdG8gYHRydWVgLCB0aGUgdGV4dHVyZSBpcyBmbGlwcGVkIGFsb25nIHRoZSB2ZXJ0aWNhbCBheGlzIHdoZW5cclxuXHRcdCAqIHVwbG9hZGVkIHRvIHRoZSBHUFUuXHJcblx0XHQgKlxyXG5cdFx0ICogT3ZlcndyaXR0ZW4gYW5kIHNldCB0byBgZmFsc2VgIGJ5IGRlZmF1bHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZsaXBZID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRvIGdlbmVyYXRlIG1pcG1hcHMgKGlmIHBvc3NpYmxlKSBmb3IgYSB0ZXh0dXJlLlxyXG5cdFx0ICpcclxuXHRcdCAqIE92ZXJ3cml0dGVuIGFuZCBzZXQgdG8gYGZhbHNlYCBieSBkZWZhdWx0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBkZXB0aCBjb21wYXJlIGZ1bmN0aW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/KE5ldmVyQ29tcGFyZXxMZXNzQ29tcGFyZXxFcXVhbENvbXBhcmV8TGVzc0VxdWFsQ29tcGFyZXxHcmVhdGVyQ29tcGFyZXxOb3RFcXVhbENvbXBhcmV8R3JlYXRlckVxdWFsQ29tcGFyZXxBbHdheXNDb21wYXJlKX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb21wYXJlRnVuY3Rpb24gPSBudWxsO1xyXG5cclxuXHR9XHJcblxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy5zb3VyY2UgPSBuZXcgU291cmNlKCBPYmplY3QuYXNzaWduKCB7fSwgc291cmNlLmltYWdlICkgKTsgLy8gc2VlICMzMDU0MFxyXG5cdFx0dGhpcy5jb21wYXJlRnVuY3Rpb24gPSBzb3VyY2UuY29tcGFyZUZ1bmN0aW9uO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdHRvSlNPTiggbWV0YSApIHtcclxuXHJcblx0XHRjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCBtZXRhICk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmNvbXBhcmVGdW5jdGlvbiAhPT0gbnVsbCApIGRhdGEuY29tcGFyZUZ1bmN0aW9uID0gdGhpcy5jb21wYXJlRnVuY3Rpb247XHJcblxyXG5cdFx0cmV0dXJuIGRhdGE7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IERlcHRoVGV4dHVyZSB9O1xyXG4iLCJpbXBvcnQgeyBjbGFtcCB9IGZyb20gJy4uLy4uL21hdGgvTWF0aFV0aWxzLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMi5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBNYXRyaXg0IH0gZnJvbSAnLi4vLi4vbWF0aC9NYXRyaXg0LmpzJztcclxuXHJcbi8qKlxyXG4gKiBBbiBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBjcmVhdGluZyBhbiBhbmFseXRpYyBjdXJ2ZSBvYmplY3QgdGhhdCBjb250YWlucyBtZXRob2RzXHJcbiAqIGZvciBpbnRlcnBvbGF0aW9uLlxyXG4gKlxyXG4gKiBAYWJzdHJhY3RcclxuICovXHJcbmNsYXNzIEN1cnZlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBjdXJ2ZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB0eXBlIHByb3BlcnR5IGlzIHVzZWQgZm9yIGRldGVjdGluZyB0aGUgb2JqZWN0IHR5cGVcclxuXHRcdCAqIGluIGNvbnRleHQgb2Ygc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnR5cGUgPSAnQ3VydmUnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyB2YWx1ZSBkZXRlcm1pbmVzIHRoZSBhbW91bnQgb2YgZGl2aXNpb25zIHdoZW4gY2FsY3VsYXRpbmcgdGhlXHJcblx0XHQgKiBjdW11bGF0aXZlIHNlZ21lbnQgbGVuZ3RocyBvZiBhIGN1cnZlIHZpYSB7QGxpbmsgQ3VydmUjZ2V0TGVuZ3Roc30uIFRvIGVuc3VyZVxyXG5cdFx0ICogcHJlY2lzaW9uIHdoZW4gdXNpbmcgbWV0aG9kcyBsaWtlIHtAbGluayBDdXJ2ZSNnZXRTcGFjZWRQb2ludHN9LCBpdCBpc1xyXG5cdFx0ICogcmVjb21tZW5kZWQgdG8gaW5jcmVhc2UgdGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgaWYgdGhlIGN1cnZlIGlzIHZlcnkgbGFyZ2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDIwMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFyY0xlbmd0aERpdmlzaW9ucyA9IDIwMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIE11c3QgYmUgc2V0IHRvIGB0cnVlYCBpZiB0aGUgY3VydmUgcGFyYW1ldGVycyBoYXZlIGNoYW5nZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5lZWRzVXBkYXRlID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBpbnRlcm5hbCBjYWNoZSB0aGF0IGhvbGRzIHByZWNvbXB1dGVkIGN1cnZlIGxlbmd0aCB2YWx1ZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHs/QXJyYXk8bnVtYmVyPn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jYWNoZUFyY0xlbmd0aHMgPSBudWxsO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSB2ZWN0b3IgaW4gMkQgb3IgM0Qgc3BhY2UgKGRlcGVuZGluZyBvbiB0aGUgY3VydmUgZGVmaW5pdGlvbilcclxuXHQgKiBmb3IgdGhlIGdpdmVuIGludGVycG9sYXRpb24gZmFjdG9yLlxyXG5cdCAqXHJcblx0ICogQGFic3RyYWN0XHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHQgLSBBIGludGVycG9sYXRpb24gZmFjdG9yIHJlcHJlc2VudGluZyBhIHBvc2l0aW9uIG9uIHRoZSBjdXJ2ZS4gTXVzdCBiZSBpbiB0aGUgcmFuZ2UgYFswLDFdYC5cclxuXHQgKiBAcGFyYW0geyhWZWN0b3IyfFZlY3RvcjMpfSBbb3B0aW9uYWxUYXJnZXRdIC0gVGhlIG9wdGlvbmFsIHRhcmdldCB2ZWN0b3IgdGhlIHJlc3VsdCBpcyB3cml0dGVuIHRvLlxyXG5cdCAqIEByZXR1cm4geyhWZWN0b3IyfFZlY3RvcjMpfSBUaGUgcG9zaXRpb24gb24gdGhlIGN1cnZlLiBJdCBjYW4gYmUgYSAyRCBvciAzRCB2ZWN0b3IgZGVwZW5kaW5nIG9uIHRoZSBjdXJ2ZSBkZWZpbml0aW9uLlxyXG5cdCAqL1xyXG5cdGdldFBvaW50KCAvKiB0LCBvcHRpb25hbFRhcmdldCAqLyApIHtcclxuXHJcblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5DdXJ2ZTogLmdldFBvaW50KCkgbm90IGltcGxlbWVudGVkLicgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgdmVjdG9yIGluIDJEIG9yIDNEIHNwYWNlIChkZXBlbmRpbmcgb24gdGhlIGN1cnZlIGRlZmluaXRpb24pXHJcblx0ICogZm9yIHRoZSBnaXZlbiBpbnRlcnBvbGF0aW9uIGZhY3Rvci4gVW5saWtlIHtAbGluayBDdXJ2ZSNnZXRQb2ludH0sIHRoaXMgbWV0aG9kIGhvbm9ycyB0aGUgbGVuZ3RoXHJcblx0ICogb2YgdGhlIGN1cnZlIHdoaWNoIGVxdWlkaXN0YW50IHNhbXBsZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdSAtIEEgaW50ZXJwb2xhdGlvbiBmYWN0b3IgcmVwcmVzZW50aW5nIGEgcG9zaXRpb24gb24gdGhlIGN1cnZlLiBNdXN0IGJlIGluIHRoZSByYW5nZSBgWzAsMV1gLlxyXG5cdCAqIEBwYXJhbSB7KFZlY3RvcjJ8VmVjdG9yMyl9IFtvcHRpb25hbFRhcmdldF0gLSBUaGUgb3B0aW9uYWwgdGFyZ2V0IHZlY3RvciB0aGUgcmVzdWx0IGlzIHdyaXR0ZW4gdG8uXHJcblx0ICogQHJldHVybiB7KFZlY3RvcjJ8VmVjdG9yMyl9IFRoZSBwb3NpdGlvbiBvbiB0aGUgY3VydmUuIEl0IGNhbiBiZSBhIDJEIG9yIDNEIHZlY3RvciBkZXBlbmRpbmcgb24gdGhlIGN1cnZlIGRlZmluaXRpb24uXHJcblx0ICovXHJcblx0Z2V0UG9pbnRBdCggdSwgb3B0aW9uYWxUYXJnZXQgKSB7XHJcblxyXG5cdFx0Y29uc3QgdCA9IHRoaXMuZ2V0VXRvVG1hcHBpbmcoIHUgKTtcclxuXHRcdHJldHVybiB0aGlzLmdldFBvaW50KCB0LCBvcHRpb25hbFRhcmdldCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIHNhbXBsZXMgdGhlIGN1cnZlIHZpYSB7QGxpbmsgQ3VydmUjZ2V0UG9pbnR9IGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIHBvaW50cyByZXByZXNlbnRpbmdcclxuXHQgKiB0aGUgY3VydmUgc2hhcGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2RpdmlzaW9ucz01XSAtIFRoZSBudW1iZXIgb2YgZGl2aXNpb25zLlxyXG5cdCAqIEByZXR1cm4ge0FycmF5PChWZWN0b3IyfFZlY3RvcjMpPn0gQW4gYXJyYXkgaG9sZGluZyB0aGUgc2FtcGxlZCBjdXJ2ZSB2YWx1ZXMuIFRoZSBudW1iZXIgb2YgcG9pbnRzIGlzIGBkaXZpc2lvbnMgKyAxYC5cclxuXHQgKi9cclxuXHRnZXRQb2ludHMoIGRpdmlzaW9ucyA9IDUgKSB7XHJcblxyXG5cdFx0Y29uc3QgcG9pbnRzID0gW107XHJcblxyXG5cdFx0Zm9yICggbGV0IGQgPSAwOyBkIDw9IGRpdmlzaW9uczsgZCArKyApIHtcclxuXHJcblx0XHRcdHBvaW50cy5wdXNoKCB0aGlzLmdldFBvaW50KCBkIC8gZGl2aXNpb25zICkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHBvaW50cztcclxuXHJcblx0fVxyXG5cclxuXHQvLyBHZXQgc2VxdWVuY2Ugb2YgcG9pbnRzIHVzaW5nIGdldFBvaW50QXQoIHUgKVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBzYW1wbGVzIHRoZSBjdXJ2ZSB2aWEge0BsaW5rIEN1cnZlI2dldFBvaW50QXR9IGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIHBvaW50cyByZXByZXNlbnRpbmdcclxuXHQgKiB0aGUgY3VydmUgc2hhcGUuIFVubGlrZSB7QGxpbmsgQ3VydmUjZ2V0UG9pbnRzfSwgdGhpcyBtZXRob2QgcmV0dXJucyBlcXVpLXNwYWNlZCBwb2ludHMgYWNyb3NzIHRoZSBlbnRpcmVcclxuXHQgKiBjdXJ2ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZGl2aXNpb25zPTVdIC0gVGhlIG51bWJlciBvZiBkaXZpc2lvbnMuXHJcblx0ICogQHJldHVybiB7QXJyYXk8KFZlY3RvcjJ8VmVjdG9yMyk+fSBBbiBhcnJheSBob2xkaW5nIHRoZSBzYW1wbGVkIGN1cnZlIHZhbHVlcy4gVGhlIG51bWJlciBvZiBwb2ludHMgaXMgYGRpdmlzaW9ucyArIDFgLlxyXG5cdCAqL1xyXG5cdGdldFNwYWNlZFBvaW50cyggZGl2aXNpb25zID0gNSApIHtcclxuXHJcblx0XHRjb25zdCBwb2ludHMgPSBbXTtcclxuXHJcblx0XHRmb3IgKCBsZXQgZCA9IDA7IGQgPD0gZGl2aXNpb25zOyBkICsrICkge1xyXG5cclxuXHRcdFx0cG9pbnRzLnB1c2goIHRoaXMuZ2V0UG9pbnRBdCggZCAvIGRpdmlzaW9ucyApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBwb2ludHM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgdG90YWwgYXJjIGxlbmd0aCBvZiB0aGUgY3VydmUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBsZW5ndGggb2YgdGhlIGN1cnZlLlxyXG5cdCAqL1xyXG5cdGdldExlbmd0aCgpIHtcclxuXHJcblx0XHRjb25zdCBsZW5ndGhzID0gdGhpcy5nZXRMZW5ndGhzKCk7XHJcblx0XHRyZXR1cm4gbGVuZ3Roc1sgbGVuZ3Rocy5sZW5ndGggLSAxIF07XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhbiBhcnJheSBvZiBjdW11bGF0aXZlIHNlZ21lbnQgbGVuZ3RocyBvZiB0aGUgY3VydmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2RpdmlzaW9ucz10aGlzLmFyY0xlbmd0aERpdmlzaW9uc10gLSBUaGUgbnVtYmVyIG9mIGRpdmlzaW9ucy5cclxuXHQgKiBAcmV0dXJuIHtBcnJheTxudW1iZXI+fSBBbiBhcnJheSBob2xkaW5nIHRoZSBjdW11bGF0aXZlIHNlZ21lbnQgbGVuZ3Rocy5cclxuXHQgKi9cclxuXHRnZXRMZW5ndGhzKCBkaXZpc2lvbnMgPSB0aGlzLmFyY0xlbmd0aERpdmlzaW9ucyApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuY2FjaGVBcmNMZW5ndGhzICYmXHJcblx0XHRcdCggdGhpcy5jYWNoZUFyY0xlbmd0aHMubGVuZ3RoID09PSBkaXZpc2lvbnMgKyAxICkgJiZcclxuXHRcdFx0ISB0aGlzLm5lZWRzVXBkYXRlICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIHRoaXMuY2FjaGVBcmNMZW5ndGhzO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLm5lZWRzVXBkYXRlID0gZmFsc2U7XHJcblxyXG5cdFx0Y29uc3QgY2FjaGUgPSBbXTtcclxuXHRcdGxldCBjdXJyZW50LCBsYXN0ID0gdGhpcy5nZXRQb2ludCggMCApO1xyXG5cdFx0bGV0IHN1bSA9IDA7XHJcblxyXG5cdFx0Y2FjaGUucHVzaCggMCApO1xyXG5cclxuXHRcdGZvciAoIGxldCBwID0gMTsgcCA8PSBkaXZpc2lvbnM7IHAgKysgKSB7XHJcblxyXG5cdFx0XHRjdXJyZW50ID0gdGhpcy5nZXRQb2ludCggcCAvIGRpdmlzaW9ucyApO1xyXG5cdFx0XHRzdW0gKz0gY3VycmVudC5kaXN0YW5jZVRvKCBsYXN0ICk7XHJcblx0XHRcdGNhY2hlLnB1c2goIHN1bSApO1xyXG5cdFx0XHRsYXN0ID0gY3VycmVudDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5jYWNoZUFyY0xlbmd0aHMgPSBjYWNoZTtcclxuXHJcblx0XHRyZXR1cm4gY2FjaGU7IC8vIHsgc3VtczogY2FjaGUsIHN1bTogc3VtIH07IFN1bSBpcyBpbiB0aGUgbGFzdCBlbGVtZW50LlxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZSB0aGUgY3VtdWxhdGl2ZSBzZWdtZW50IGRpc3RhbmNlIGNhY2hlLiBUaGUgbWV0aG9kIG11c3QgYmUgY2FsbGVkXHJcblx0ICogZXZlcnkgdGltZSBjdXJ2ZSBwYXJhbWV0ZXJzIGFyZSBjaGFuZ2VkLiBJZiBhbiB1cGRhdGVkIGN1cnZlIGlzIHBhcnQgb2YgYVxyXG5cdCAqIGNvbXBvc2VkIGN1cnZlIGxpa2Uge0BsaW5rIEN1cnZlUGF0aH0sIHRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIG9uIHRoZVxyXG5cdCAqIGNvbXBvc2VkIGN1cnZlLCB0b28uXHJcblx0ICovXHJcblx0dXBkYXRlQXJjTGVuZ3RocygpIHtcclxuXHJcblx0XHR0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHRcdHRoaXMuZ2V0TGVuZ3RocygpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdpdmVuIGFuIGludGVycG9sYXRpb24gZmFjdG9yIGluIHRoZSByYW5nZSBgWzAsMV1gLCB0aGlzIG1ldGhvZCByZXR1cm5zIGFuIHVwZGF0ZWRcclxuXHQgKiBpbnRlcnBvbGF0aW9uIGZhY3RvciBpbiB0aGUgc2FtZSByYW5nZSB0aGF0IGNhbiBiZSB1ZWQgdG8gc2FtcGxlIGVxdWlkaXN0YW50IHBvaW50c1xyXG5cdCAqIGZyb20gYSBjdXJ2ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB1IC0gVGhlIGludGVycG9sYXRpb24gZmFjdG9yLlxyXG5cdCAqIEBwYXJhbSB7P251bWJlcn0gZGlzdGFuY2UgLSBBbiBvcHRpb25hbCBkaXN0YW5jZSBvbiB0aGUgY3VydmUuXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgdXBkYXRlZCBpbnRlcnBvbGF0aW9uIGZhY3Rvci5cclxuXHQgKi9cclxuXHRnZXRVdG9UbWFwcGluZyggdSwgZGlzdGFuY2UgPSBudWxsICkge1xyXG5cclxuXHRcdGNvbnN0IGFyY0xlbmd0aHMgPSB0aGlzLmdldExlbmd0aHMoKTtcclxuXHJcblx0XHRsZXQgaSA9IDA7XHJcblx0XHRjb25zdCBpbCA9IGFyY0xlbmd0aHMubGVuZ3RoO1xyXG5cclxuXHRcdGxldCB0YXJnZXRBcmNMZW5ndGg7IC8vIFRoZSB0YXJnZXRlZCB1IGRpc3RhbmNlIHZhbHVlIHRvIGdldFxyXG5cclxuXHRcdGlmICggZGlzdGFuY2UgKSB7XHJcblxyXG5cdFx0XHR0YXJnZXRBcmNMZW5ndGggPSBkaXN0YW5jZTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGFyZ2V0QXJjTGVuZ3RoID0gdSAqIGFyY0xlbmd0aHNbIGlsIC0gMSBdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBiaW5hcnkgc2VhcmNoIGZvciB0aGUgaW5kZXggd2l0aCBsYXJnZXN0IHZhbHVlIHNtYWxsZXIgdGhhbiB0YXJnZXQgdSBkaXN0YW5jZVxyXG5cclxuXHRcdGxldCBsb3cgPSAwLCBoaWdoID0gaWwgLSAxLCBjb21wYXJpc29uO1xyXG5cclxuXHRcdHdoaWxlICggbG93IDw9IGhpZ2ggKSB7XHJcblxyXG5cdFx0XHRpID0gTWF0aC5mbG9vciggbG93ICsgKCBoaWdoIC0gbG93ICkgLyAyICk7IC8vIGxlc3MgbGlrZWx5IHRvIG92ZXJmbG93LCB0aG91Z2ggcHJvYmFibHkgbm90IGlzc3VlIGhlcmUsIEpTIGRvZXNuJ3QgcmVhbGx5IGhhdmUgaW50ZWdlcnMsIGFsbCBudW1iZXJzIGFyZSBmbG9hdHNcclxuXHJcblx0XHRcdGNvbXBhcmlzb24gPSBhcmNMZW5ndGhzWyBpIF0gLSB0YXJnZXRBcmNMZW5ndGg7XHJcblxyXG5cdFx0XHRpZiAoIGNvbXBhcmlzb24gPCAwICkge1xyXG5cclxuXHRcdFx0XHRsb3cgPSBpICsgMTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGNvbXBhcmlzb24gPiAwICkge1xyXG5cclxuXHRcdFx0XHRoaWdoID0gaSAtIDE7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRoaWdoID0gaTtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0Ly8gRE9ORVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpID0gaGlnaDtcclxuXHJcblx0XHRpZiAoIGFyY0xlbmd0aHNbIGkgXSA9PT0gdGFyZ2V0QXJjTGVuZ3RoICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIGkgLyAoIGlsIC0gMSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyB3ZSBjb3VsZCBnZXQgZmluZXIgZ3JhaW4gYXQgbGVuZ3Rocywgb3IgdXNlIHNpbXBsZSBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdHdvIHBvaW50c1xyXG5cclxuXHRcdGNvbnN0IGxlbmd0aEJlZm9yZSA9IGFyY0xlbmd0aHNbIGkgXTtcclxuXHRcdGNvbnN0IGxlbmd0aEFmdGVyID0gYXJjTGVuZ3Roc1sgaSArIDEgXTtcclxuXHJcblx0XHRjb25zdCBzZWdtZW50TGVuZ3RoID0gbGVuZ3RoQWZ0ZXIgLSBsZW5ndGhCZWZvcmU7XHJcblxyXG5cdFx0Ly8gZGV0ZXJtaW5lIHdoZXJlIHdlIGFyZSBiZXR3ZWVuIHRoZSAnYmVmb3JlJyBhbmQgJ2FmdGVyJyBwb2ludHNcclxuXHJcblx0XHRjb25zdCBzZWdtZW50RnJhY3Rpb24gPSAoIHRhcmdldEFyY0xlbmd0aCAtIGxlbmd0aEJlZm9yZSApIC8gc2VnbWVudExlbmd0aDtcclxuXHJcblx0XHQvLyBhZGQgdGhhdCBmcmFjdGlvbmFsIGFtb3VudCB0byB0XHJcblxyXG5cdFx0Y29uc3QgdCA9ICggaSArIHNlZ21lbnRGcmFjdGlvbiApIC8gKCBpbCAtIDEgKTtcclxuXHJcblx0XHRyZXR1cm4gdDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgdW5pdCB2ZWN0b3IgdGFuZ2VudCBmb3IgdGhlIGdpdmVuIGludGVycG9sYXRpb24gZmFjdG9yLlxyXG5cdCAqIElmIHRoZSBkZXJpdmVkIGN1cnZlIGRvZXMgbm90IGltcGxlbWVudCBpdHMgdGFuZ2VudCBkZXJpdmF0aW9uLFxyXG5cdCAqIHR3byBwb2ludHMgYSBzbWFsbCBkZWx0YSBhcGFydCB3aWxsIGJlIHVzZWQgdG8gZmluZCBpdHMgZ3JhZGllbnRcclxuXHQgKiB3aGljaCBzZWVtcyB0byBnaXZlIGEgcmVhc29uYWJsZSBhcHByb3hpbWF0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHQgLSBUaGUgaW50ZXJwb2xhdGlvbiBmYWN0b3IuXHJcblx0ICogQHBhcmFtIHsoVmVjdG9yMnxWZWN0b3IzKX0gW29wdGlvbmFsVGFyZ2V0XSAtIFRoZSBvcHRpb25hbCB0YXJnZXQgdmVjdG9yIHRoZSByZXN1bHQgaXMgd3JpdHRlbiB0by5cclxuXHQgKiBAcmV0dXJuIHsoVmVjdG9yMnxWZWN0b3IzKX0gVGhlIHRhbmdlbnQgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGdldFRhbmdlbnQoIHQsIG9wdGlvbmFsVGFyZ2V0ICkge1xyXG5cclxuXHRcdGNvbnN0IGRlbHRhID0gMC4wMDAxO1xyXG5cdFx0bGV0IHQxID0gdCAtIGRlbHRhO1xyXG5cdFx0bGV0IHQyID0gdCArIGRlbHRhO1xyXG5cclxuXHRcdC8vIENhcHBpbmcgaW4gY2FzZSBvZiBkYW5nZXJcclxuXHJcblx0XHRpZiAoIHQxIDwgMCApIHQxID0gMDtcclxuXHRcdGlmICggdDIgPiAxICkgdDIgPSAxO1xyXG5cclxuXHRcdGNvbnN0IHB0MSA9IHRoaXMuZ2V0UG9pbnQoIHQxICk7XHJcblx0XHRjb25zdCBwdDIgPSB0aGlzLmdldFBvaW50KCB0MiApO1xyXG5cclxuXHRcdGNvbnN0IHRhbmdlbnQgPSBvcHRpb25hbFRhcmdldCB8fCAoICggcHQxLmlzVmVjdG9yMiApID8gbmV3IFZlY3RvcjIoKSA6IG5ldyBWZWN0b3IzKCkgKTtcclxuXHJcblx0XHR0YW5nZW50LmNvcHkoIHB0MiApLnN1YiggcHQxICkubm9ybWFsaXplKCk7XHJcblxyXG5cdFx0cmV0dXJuIHRhbmdlbnQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2FtZSBhcyB7QGxpbmsgQ3VydmUjZ2V0VGFuZ2VudH0gYnV0IHdpdGggZXF1aWRpc3RhbnQgc2FtcGxlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB1IC0gVGhlIGludGVycG9sYXRpb24gZmFjdG9yLlxyXG5cdCAqIEBwYXJhbSB7KFZlY3RvcjJ8VmVjdG9yMyl9IFtvcHRpb25hbFRhcmdldF0gLSBUaGUgb3B0aW9uYWwgdGFyZ2V0IHZlY3RvciB0aGUgcmVzdWx0IGlzIHdyaXR0ZW4gdG8uXHJcblx0ICogQHJldHVybiB7KFZlY3RvcjJ8VmVjdG9yMyl9IFRoZSB0YW5nZW50IHZlY3Rvci5cclxuXHQgKiBAc2VlIHtAbGluayBDdXJ2ZSNnZXRQb2ludEF0fVxyXG5cdCAqL1xyXG5cdGdldFRhbmdlbnRBdCggdSwgb3B0aW9uYWxUYXJnZXQgKSB7XHJcblxyXG5cdFx0Y29uc3QgdCA9IHRoaXMuZ2V0VXRvVG1hcHBpbmcoIHUgKTtcclxuXHRcdHJldHVybiB0aGlzLmdldFRhbmdlbnQoIHQsIG9wdGlvbmFsVGFyZ2V0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2VuZXJhdGVzIHRoZSBGcmVuZXQgRnJhbWVzLiBSZXF1aXJlcyBhIGN1cnZlIGRlZmluaXRpb24gaW4gM0Qgc3BhY2UuIFVzZWRcclxuXHQgKiBpbiBnZW9tZXRyaWVzIGxpa2Uge0BsaW5rIFR1YmVHZW9tZXRyeX0gb3Ige0BsaW5rIEV4dHJ1ZGVHZW9tZXRyeX0uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc2VnbWVudHMgLSBUaGUgbnVtYmVyIG9mIHNlZ21lbnRzLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Nsb3NlZD1mYWxzZV0gLSBXaGV0aGVyIHRoZSBjdXJ2ZSBpcyBjbG9zZWQgb3Igbm90LlxyXG5cdCAqIEByZXR1cm4ge3t0YW5nZW50czogQXJyYXk8VmVjdG9yMz4sIG5vcm1hbHM6IEFycmF5PFZlY3RvcjM+LCBiaW5vcm1hbHM6IEFycmF5PFZlY3RvcjM+fX0gVGhlIEZyZW5ldCBGcmFtZXMuXHJcblx0ICovXHJcblx0Y29tcHV0ZUZyZW5ldEZyYW1lcyggc2VnbWVudHMsIGNsb3NlZCA9IGZhbHNlICkge1xyXG5cclxuXHRcdC8vIHNlZSBodHRwOi8vd3d3LmNzLmluZGlhbmEuZWR1L3B1Yi90ZWNocmVwb3J0cy9UUjQyNS5wZGZcclxuXHJcblx0XHRjb25zdCBub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xyXG5cclxuXHRcdGNvbnN0IHRhbmdlbnRzID0gW107XHJcblx0XHRjb25zdCBub3JtYWxzID0gW107XHJcblx0XHRjb25zdCBiaW5vcm1hbHMgPSBbXTtcclxuXHJcblx0XHRjb25zdCB2ZWMgPSBuZXcgVmVjdG9yMygpO1xyXG5cdFx0Y29uc3QgbWF0ID0gbmV3IE1hdHJpeDQoKTtcclxuXHJcblx0XHQvLyBjb21wdXRlIHRoZSB0YW5nZW50IHZlY3RvcnMgZm9yIGVhY2ggc2VnbWVudCBvbiB0aGUgY3VydmVcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPD0gc2VnbWVudHM7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB1ID0gaSAvIHNlZ21lbnRzO1xyXG5cclxuXHRcdFx0dGFuZ2VudHNbIGkgXSA9IHRoaXMuZ2V0VGFuZ2VudEF0KCB1LCBuZXcgVmVjdG9yMygpICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIHNlbGVjdCBhbiBpbml0aWFsIG5vcm1hbCB2ZWN0b3IgcGVycGVuZGljdWxhciB0byB0aGUgZmlyc3QgdGFuZ2VudCB2ZWN0b3IsXHJcblx0XHQvLyBhbmQgaW4gdGhlIGRpcmVjdGlvbiBvZiB0aGUgbWluaW11bSB0YW5nZW50IHh5eiBjb21wb25lbnRcclxuXHJcblx0XHRub3JtYWxzWyAwIF0gPSBuZXcgVmVjdG9yMygpO1xyXG5cdFx0Ymlub3JtYWxzWyAwIF0gPSBuZXcgVmVjdG9yMygpO1xyXG5cdFx0bGV0IG1pbiA9IE51bWJlci5NQVhfVkFMVUU7XHJcblx0XHRjb25zdCB0eCA9IE1hdGguYWJzKCB0YW5nZW50c1sgMCBdLnggKTtcclxuXHRcdGNvbnN0IHR5ID0gTWF0aC5hYnMoIHRhbmdlbnRzWyAwIF0ueSApO1xyXG5cdFx0Y29uc3QgdHogPSBNYXRoLmFicyggdGFuZ2VudHNbIDAgXS56ICk7XHJcblxyXG5cdFx0aWYgKCB0eCA8PSBtaW4gKSB7XHJcblxyXG5cdFx0XHRtaW4gPSB0eDtcclxuXHRcdFx0bm9ybWFsLnNldCggMSwgMCwgMCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHR5IDw9IG1pbiApIHtcclxuXHJcblx0XHRcdG1pbiA9IHR5O1xyXG5cdFx0XHRub3JtYWwuc2V0KCAwLCAxLCAwICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdHogPD0gbWluICkge1xyXG5cclxuXHRcdFx0bm9ybWFsLnNldCggMCwgMCwgMSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR2ZWMuY3Jvc3NWZWN0b3JzKCB0YW5nZW50c1sgMCBdLCBub3JtYWwgKS5ub3JtYWxpemUoKTtcclxuXHJcblx0XHRub3JtYWxzWyAwIF0uY3Jvc3NWZWN0b3JzKCB0YW5nZW50c1sgMCBdLCB2ZWMgKTtcclxuXHRcdGJpbm9ybWFsc1sgMCBdLmNyb3NzVmVjdG9ycyggdGFuZ2VudHNbIDAgXSwgbm9ybWFsc1sgMCBdICk7XHJcblxyXG5cclxuXHRcdC8vIGNvbXB1dGUgdGhlIHNsb3dseS12YXJ5aW5nIG5vcm1hbCBhbmQgYmlub3JtYWwgdmVjdG9ycyBmb3IgZWFjaCBzZWdtZW50IG9uIHRoZSBjdXJ2ZVxyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMTsgaSA8PSBzZWdtZW50czsgaSArKyApIHtcclxuXHJcblx0XHRcdG5vcm1hbHNbIGkgXSA9IG5vcm1hbHNbIGkgLSAxIF0uY2xvbmUoKTtcclxuXHJcblx0XHRcdGJpbm9ybWFsc1sgaSBdID0gYmlub3JtYWxzWyBpIC0gMSBdLmNsb25lKCk7XHJcblxyXG5cdFx0XHR2ZWMuY3Jvc3NWZWN0b3JzKCB0YW5nZW50c1sgaSAtIDEgXSwgdGFuZ2VudHNbIGkgXSApO1xyXG5cclxuXHRcdFx0aWYgKCB2ZWMubGVuZ3RoKCkgPiBOdW1iZXIuRVBTSUxPTiApIHtcclxuXHJcblx0XHRcdFx0dmVjLm5vcm1hbGl6ZSgpO1xyXG5cclxuXHRcdFx0XHRjb25zdCB0aGV0YSA9IE1hdGguYWNvcyggY2xhbXAoIHRhbmdlbnRzWyBpIC0gMSBdLmRvdCggdGFuZ2VudHNbIGkgXSApLCAtIDEsIDEgKSApOyAvLyBjbGFtcCBmb3IgZmxvYXRpbmcgcHQgZXJyb3JzXHJcblxyXG5cdFx0XHRcdG5vcm1hbHNbIGkgXS5hcHBseU1hdHJpeDQoIG1hdC5tYWtlUm90YXRpb25BeGlzKCB2ZWMsIHRoZXRhICkgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGJpbm9ybWFsc1sgaSBdLmNyb3NzVmVjdG9ycyggdGFuZ2VudHNbIGkgXSwgbm9ybWFsc1sgaSBdICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGlmIHRoZSBjdXJ2ZSBpcyBjbG9zZWQsIHBvc3Rwcm9jZXNzIHRoZSB2ZWN0b3JzIHNvIHRoZSBmaXJzdCBhbmQgbGFzdCBub3JtYWwgdmVjdG9ycyBhcmUgdGhlIHNhbWVcclxuXHJcblx0XHRpZiAoIGNsb3NlZCA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdGxldCB0aGV0YSA9IE1hdGguYWNvcyggY2xhbXAoIG5vcm1hbHNbIDAgXS5kb3QoIG5vcm1hbHNbIHNlZ21lbnRzIF0gKSwgLSAxLCAxICkgKTtcclxuXHRcdFx0dGhldGEgLz0gc2VnbWVudHM7XHJcblxyXG5cdFx0XHRpZiAoIHRhbmdlbnRzWyAwIF0uZG90KCB2ZWMuY3Jvc3NWZWN0b3JzKCBub3JtYWxzWyAwIF0sIG5vcm1hbHNbIHNlZ21lbnRzIF0gKSApID4gMCApIHtcclxuXHJcblx0XHRcdFx0dGhldGEgPSAtIHRoZXRhO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAxOyBpIDw9IHNlZ21lbnRzOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHQvLyB0d2lzdCBhIGxpdHRsZS4uLlxyXG5cdFx0XHRcdG5vcm1hbHNbIGkgXS5hcHBseU1hdHJpeDQoIG1hdC5tYWtlUm90YXRpb25BeGlzKCB0YW5nZW50c1sgaSBdLCB0aGV0YSAqIGkgKSApO1xyXG5cdFx0XHRcdGJpbm9ybWFsc1sgaSBdLmNyb3NzVmVjdG9ycyggdGFuZ2VudHNbIGkgXSwgbm9ybWFsc1sgaSBdICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB7XHJcblx0XHRcdHRhbmdlbnRzOiB0YW5nZW50cyxcclxuXHRcdFx0bm9ybWFsczogbm9ybWFscyxcclxuXHRcdFx0Ymlub3JtYWxzOiBiaW5vcm1hbHNcclxuXHRcdH07XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIG5ldyBjdXJ2ZSB3aXRoIGNvcGllZCB2YWx1ZXMgZnJvbSB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Q3VydmV9IEEgY2xvbmUgb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjbG9uZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29waWVzIHRoZSB2YWx1ZXMgb2YgdGhlIGdpdmVuIGN1cnZlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0N1cnZlfSBzb3VyY2UgLSBUaGUgY3VydmUgdG8gY29weS5cclxuXHQgKiBAcmV0dXJuIHtDdXJ2ZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBjdXJ2ZS5cclxuXHQgKi9cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0dGhpcy5hcmNMZW5ndGhEaXZpc2lvbnMgPSBzb3VyY2UuYXJjTGVuZ3RoRGl2aXNpb25zO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNlcmlhbGl6ZXMgdGhlIGN1cnZlIGludG8gSlNPTi5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge09iamVjdH0gQSBKU09OIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNlcmlhbGl6ZWQgY3VydmUuXHJcblx0ICogQHNlZSB7QGxpbmsgT2JqZWN0TG9hZGVyI3BhcnNlfVxyXG5cdCAqL1xyXG5cdHRvSlNPTigpIHtcclxuXHJcblx0XHRjb25zdCBkYXRhID0ge1xyXG5cdFx0XHRtZXRhZGF0YToge1xyXG5cdFx0XHRcdHZlcnNpb246IDQuNixcclxuXHRcdFx0XHR0eXBlOiAnQ3VydmUnLFxyXG5cdFx0XHRcdGdlbmVyYXRvcjogJ0N1cnZlLnRvSlNPTidcclxuXHRcdFx0fVxyXG5cdFx0fTtcclxuXHJcblx0XHRkYXRhLmFyY0xlbmd0aERpdmlzaW9ucyA9IHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zO1xyXG5cdFx0ZGF0YS50eXBlID0gdGhpcy50eXBlO1xyXG5cclxuXHRcdHJldHVybiBkYXRhO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlc2VyaWFsaXplcyB0aGUgY3VydmUgZnJvbSB0aGUgZ2l2ZW4gSlNPTi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBqc29uIC0gVGhlIEpTT04gaG9sZGluZyB0aGUgc2VyaWFsaXplZCBjdXJ2ZS5cclxuXHQgKiBAcmV0dXJuIHtDdXJ2ZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBjdXJ2ZS5cclxuXHQgKi9cclxuXHRmcm9tSlNPTigganNvbiApIHtcclxuXHJcblx0XHR0aGlzLmFyY0xlbmd0aERpdmlzaW9ucyA9IGpzb24uYXJjTGVuZ3RoRGl2aXNpb25zO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgQ3VydmUgfTtcclxuIiwiaW1wb3J0IHsgQ3VydmUgfSBmcm9tICcuLi9jb3JlL0N1cnZlLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMi5qcyc7XHJcblxyXG4vKipcclxuICogQSBjdXJ2ZSByZXByZXNlbnRpbmcgYW4gZWxsaXBzZS5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgY3VydmUgPSBuZXcgVEhSRUUuRWxsaXBzZUN1cnZlKFxyXG4gKiBcdDAsIDAsXHJcbiAqIFx0MTAsIDEwLFxyXG4gKiBcdDAsIDIgKiBNYXRoLlBJLFxyXG4gKiBcdGZhbHNlLFxyXG4gKiBcdDBcclxuICogKTtcclxuICpcclxuICogY29uc3QgcG9pbnRzID0gY3VydmUuZ2V0UG9pbnRzKCA1MCApO1xyXG4gKiBjb25zdCBnZW9tZXRyeSA9IG5ldyBUSFJFRS5CdWZmZXJHZW9tZXRyeSgpLnNldEZyb21Qb2ludHMoIHBvaW50cyApO1xyXG4gKlxyXG4gKiBjb25zdCBtYXRlcmlhbCA9IG5ldyBUSFJFRS5MaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogMHhmZjAwMDAgfSApO1xyXG4gKlxyXG4gKiAvLyBDcmVhdGUgdGhlIGZpbmFsIG9iamVjdCB0byBhZGQgdG8gdGhlIHNjZW5lXHJcbiAqIGNvbnN0IGVsbGlwc2UgPSBuZXcgVEhSRUUuTGluZSggZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQ3VydmVcclxuICovXHJcbmNsYXNzIEVsbGlwc2VDdXJ2ZSBleHRlbmRzIEN1cnZlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBlbGxpcHNlIGN1cnZlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFthWD0wXSAtIFRoZSBYIGNlbnRlciBvZiB0aGUgZWxsaXBzZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2FZPTBdIC0gVGhlIFkgY2VudGVyIG9mIHRoZSBlbGxpcHNlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbeFJhZGl1cz0xXSAtIFRoZSByYWRpdXMgb2YgdGhlIGVsbGlwc2UgaW4gdGhlIHggZGlyZWN0aW9uLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbeVJhZGl1cz0xXSAtIFRoZSByYWRpdXMgb2YgdGhlIGVsbGlwc2UgaW4gdGhlIHkgZGlyZWN0aW9uLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbYVN0YXJ0QW5nbGU9MF0gLSBUaGUgc3RhcnQgYW5nbGUgb2YgdGhlIGN1cnZlIGluIHJhZGlhbnMgc3RhcnRpbmcgZnJvbSB0aGUgcG9zaXRpdmUgWCBheGlzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbYUVuZEFuZ2xlPU1hdGguUEkqMl0gLSBUaGUgZW5kIGFuZ2xlIG9mIHRoZSBjdXJ2ZSBpbiByYWRpYW5zIHN0YXJ0aW5nIGZyb20gdGhlIHBvc2l0aXZlIFggYXhpcy5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFthQ2xvY2t3aXNlPWZhbHNlXSAtIFdoZXRoZXIgdGhlIGVsbGlwc2UgaXMgZHJhd24gY2xvY2t3aXNlIG9yIG5vdC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2FSb3RhdGlvbj0wXSAtIFRoZSByb3RhdGlvbiBhbmdsZSBvZiB0aGUgZWxsaXBzZSBpbiByYWRpYW5zLCBjb3VudGVyY2xvY2t3aXNlIGZyb20gdGhlIHBvc2l0aXZlIFggYXhpcy5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggYVggPSAwLCBhWSA9IDAsIHhSYWRpdXMgPSAxLCB5UmFkaXVzID0gMSwgYVN0YXJ0QW5nbGUgPSAwLCBhRW5kQW5nbGUgPSBNYXRoLlBJICogMiwgYUNsb2Nrd2lzZSA9IGZhbHNlLCBhUm90YXRpb24gPSAwICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzRWxsaXBzZUN1cnZlID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnRWxsaXBzZUN1cnZlJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBYIGNlbnRlciBvZiB0aGUgZWxsaXBzZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFYID0gYVg7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgWSBjZW50ZXIgb2YgdGhlIGVsbGlwc2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hWSA9IGFZO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJhZGl1cyBvZiB0aGUgZWxsaXBzZSBpbiB0aGUgeCBkaXJlY3Rpb24uXHJcblx0XHQgKiBTZXR0aW5nIHRoZSB0aGlzIHZhbHVlIGVxdWFsIHRvIHRoZSB7QGxpbmsgRWxsaXBzZUN1cnZlI3lSYWRpdXN9IHdpbGwgcmVzdWx0IGluIGEgY2lyY2xlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMueFJhZGl1cyA9IHhSYWRpdXM7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcmFkaXVzIG9mIHRoZSBlbGxpcHNlIGluIHRoZSB5IGRpcmVjdGlvbi5cclxuXHRcdCAqIFNldHRpbmcgdGhlIHRoaXMgdmFsdWUgZXF1YWwgdG8gdGhlIHtAbGluayBFbGxpcHNlQ3VydmUjeFJhZGl1c30gd2lsbCByZXN1bHQgaW4gYSBjaXJjbGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy55UmFkaXVzID0geVJhZGl1cztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBzdGFydCBhbmdsZSBvZiB0aGUgY3VydmUgaW4gcmFkaWFucyBzdGFydGluZyBmcm9tIHRoZSBwb3NpdGl2ZSBYIGF4aXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hU3RhcnRBbmdsZSA9IGFTdGFydEFuZ2xlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGVuZCBhbmdsZSBvZiB0aGUgY3VydmUgaW4gcmFkaWFucyBzdGFydGluZyBmcm9tIHRoZSBwb3NpdGl2ZSBYIGF4aXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IE1hdGguUEkqMlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFFbmRBbmdsZSA9IGFFbmRBbmdsZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIGVsbGlwc2UgaXMgZHJhd24gY2xvY2t3aXNlIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYUNsb2Nrd2lzZSA9IGFDbG9ja3dpc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcm90YXRpb24gYW5nbGUgb2YgdGhlIGVsbGlwc2UgaW4gcmFkaWFucywgY291bnRlcmNsb2Nrd2lzZSBmcm9tIHRoZSBwb3NpdGl2ZSBYIGF4aXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hUm90YXRpb24gPSBhUm90YXRpb247XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIHBvaW50IG9uIHRoZSBjdXJ2ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0IC0gQSBpbnRlcnBvbGF0aW9uIGZhY3RvciByZXByZXNlbnRpbmcgYSBwb3NpdGlvbiBvbiB0aGUgY3VydmUuIE11c3QgYmUgaW4gdGhlIHJhbmdlIGBbMCwxXWAuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSBbb3B0aW9uYWxUYXJnZXRdIC0gVGhlIG9wdGlvbmFsIHRhcmdldCB2ZWN0b3IgdGhlIHJlc3VsdCBpcyB3cml0dGVuIHRvLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IFRoZSBwb3NpdGlvbiBvbiB0aGUgY3VydmUuXHJcblx0ICovXHJcblx0Z2V0UG9pbnQoIHQsIG9wdGlvbmFsVGFyZ2V0ID0gbmV3IFZlY3RvcjIoKSApIHtcclxuXHJcblx0XHRjb25zdCBwb2ludCA9IG9wdGlvbmFsVGFyZ2V0O1xyXG5cclxuXHRcdGNvbnN0IHR3b1BpID0gTWF0aC5QSSAqIDI7XHJcblx0XHRsZXQgZGVsdGFBbmdsZSA9IHRoaXMuYUVuZEFuZ2xlIC0gdGhpcy5hU3RhcnRBbmdsZTtcclxuXHRcdGNvbnN0IHNhbWVQb2ludHMgPSBNYXRoLmFicyggZGVsdGFBbmdsZSApIDwgTnVtYmVyLkVQU0lMT047XHJcblxyXG5cdFx0Ly8gZW5zdXJlcyB0aGF0IGRlbHRhQW5nbGUgaXMgMCAuLiAyIFBJXHJcblx0XHR3aGlsZSAoIGRlbHRhQW5nbGUgPCAwICkgZGVsdGFBbmdsZSArPSB0d29QaTtcclxuXHRcdHdoaWxlICggZGVsdGFBbmdsZSA+IHR3b1BpICkgZGVsdGFBbmdsZSAtPSB0d29QaTtcclxuXHJcblx0XHRpZiAoIGRlbHRhQW5nbGUgPCBOdW1iZXIuRVBTSUxPTiApIHtcclxuXHJcblx0XHRcdGlmICggc2FtZVBvaW50cyApIHtcclxuXHJcblx0XHRcdFx0ZGVsdGFBbmdsZSA9IDA7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRkZWx0YUFuZ2xlID0gdHdvUGk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy5hQ2xvY2t3aXNlID09PSB0cnVlICYmICEgc2FtZVBvaW50cyApIHtcclxuXHJcblx0XHRcdGlmICggZGVsdGFBbmdsZSA9PT0gdHdvUGkgKSB7XHJcblxyXG5cdFx0XHRcdGRlbHRhQW5nbGUgPSAtIHR3b1BpO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0ZGVsdGFBbmdsZSA9IGRlbHRhQW5nbGUgLSB0d29QaTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgYW5nbGUgPSB0aGlzLmFTdGFydEFuZ2xlICsgdCAqIGRlbHRhQW5nbGU7XHJcblx0XHRsZXQgeCA9IHRoaXMuYVggKyB0aGlzLnhSYWRpdXMgKiBNYXRoLmNvcyggYW5nbGUgKTtcclxuXHRcdGxldCB5ID0gdGhpcy5hWSArIHRoaXMueVJhZGl1cyAqIE1hdGguc2luKCBhbmdsZSApO1xyXG5cclxuXHRcdGlmICggdGhpcy5hUm90YXRpb24gIT09IDAgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBjb3MgPSBNYXRoLmNvcyggdGhpcy5hUm90YXRpb24gKTtcclxuXHRcdFx0Y29uc3Qgc2luID0gTWF0aC5zaW4oIHRoaXMuYVJvdGF0aW9uICk7XHJcblxyXG5cdFx0XHRjb25zdCB0eCA9IHggLSB0aGlzLmFYO1xyXG5cdFx0XHRjb25zdCB0eSA9IHkgLSB0aGlzLmFZO1xyXG5cclxuXHRcdFx0Ly8gUm90YXRlIHRoZSBwb2ludCBhYm91dCB0aGUgY2VudGVyIG9mIHRoZSBlbGxpcHNlLlxyXG5cdFx0XHR4ID0gdHggKiBjb3MgLSB0eSAqIHNpbiArIHRoaXMuYVg7XHJcblx0XHRcdHkgPSB0eCAqIHNpbiArIHR5ICogY29zICsgdGhpcy5hWTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHBvaW50LnNldCggeCwgeSApO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLmFYID0gc291cmNlLmFYO1xyXG5cdFx0dGhpcy5hWSA9IHNvdXJjZS5hWTtcclxuXHJcblx0XHR0aGlzLnhSYWRpdXMgPSBzb3VyY2UueFJhZGl1cztcclxuXHRcdHRoaXMueVJhZGl1cyA9IHNvdXJjZS55UmFkaXVzO1xyXG5cclxuXHRcdHRoaXMuYVN0YXJ0QW5nbGUgPSBzb3VyY2UuYVN0YXJ0QW5nbGU7XHJcblx0XHR0aGlzLmFFbmRBbmdsZSA9IHNvdXJjZS5hRW5kQW5nbGU7XHJcblxyXG5cdFx0dGhpcy5hQ2xvY2t3aXNlID0gc291cmNlLmFDbG9ja3dpc2U7XHJcblxyXG5cdFx0dGhpcy5hUm90YXRpb24gPSBzb3VyY2UuYVJvdGF0aW9uO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdHRvSlNPTigpIHtcclxuXHJcblx0XHRjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCk7XHJcblxyXG5cdFx0ZGF0YS5hWCA9IHRoaXMuYVg7XHJcblx0XHRkYXRhLmFZID0gdGhpcy5hWTtcclxuXHJcblx0XHRkYXRhLnhSYWRpdXMgPSB0aGlzLnhSYWRpdXM7XHJcblx0XHRkYXRhLnlSYWRpdXMgPSB0aGlzLnlSYWRpdXM7XHJcblxyXG5cdFx0ZGF0YS5hU3RhcnRBbmdsZSA9IHRoaXMuYVN0YXJ0QW5nbGU7XHJcblx0XHRkYXRhLmFFbmRBbmdsZSA9IHRoaXMuYUVuZEFuZ2xlO1xyXG5cclxuXHRcdGRhdGEuYUNsb2Nrd2lzZSA9IHRoaXMuYUNsb2Nrd2lzZTtcclxuXHJcblx0XHRkYXRhLmFSb3RhdGlvbiA9IHRoaXMuYVJvdGF0aW9uO1xyXG5cclxuXHRcdHJldHVybiBkYXRhO1xyXG5cclxuXHR9XHJcblxyXG5cdGZyb21KU09OKCBqc29uICkge1xyXG5cclxuXHRcdHN1cGVyLmZyb21KU09OKCBqc29uICk7XHJcblxyXG5cdFx0dGhpcy5hWCA9IGpzb24uYVg7XHJcblx0XHR0aGlzLmFZID0ganNvbi5hWTtcclxuXHJcblx0XHR0aGlzLnhSYWRpdXMgPSBqc29uLnhSYWRpdXM7XHJcblx0XHR0aGlzLnlSYWRpdXMgPSBqc29uLnlSYWRpdXM7XHJcblxyXG5cdFx0dGhpcy5hU3RhcnRBbmdsZSA9IGpzb24uYVN0YXJ0QW5nbGU7XHJcblx0XHR0aGlzLmFFbmRBbmdsZSA9IGpzb24uYUVuZEFuZ2xlO1xyXG5cclxuXHRcdHRoaXMuYUNsb2Nrd2lzZSA9IGpzb24uYUNsb2Nrd2lzZTtcclxuXHJcblx0XHR0aGlzLmFSb3RhdGlvbiA9IGpzb24uYVJvdGF0aW9uO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBFbGxpcHNlQ3VydmUgfTtcclxuIiwiaW1wb3J0IHsgRWxsaXBzZUN1cnZlIH0gZnJvbSAnLi9FbGxpcHNlQ3VydmUuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgY3VydmUgcmVwcmVzZW50aW5nIGFuIGFyYy5cclxuICpcclxuICogQGF1Z21lbnRzIEVsbGlwc2VDdXJ2ZVxyXG4gKi9cclxuY2xhc3MgQXJjQ3VydmUgZXh0ZW5kcyBFbGxpcHNlQ3VydmUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGFyYyBjdXJ2ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbYVg9MF0gLSBUaGUgWCBjZW50ZXIgb2YgdGhlIGVsbGlwc2UuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFthWT0wXSAtIFRoZSBZIGNlbnRlciBvZiB0aGUgZWxsaXBzZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2FSYWRpdXM9MV0gLSBUaGUgcmFkaXVzIG9mIHRoZSBlbGxpcHNlIGluIHRoZSB4IGRpcmVjdGlvbi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2FTdGFydEFuZ2xlPTBdIC0gVGhlIHN0YXJ0IGFuZ2xlIG9mIHRoZSBjdXJ2ZSBpbiByYWRpYW5zIHN0YXJ0aW5nIGZyb20gdGhlIHBvc2l0aXZlIFggYXhpcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2FFbmRBbmdsZT1NYXRoLlBJKjJdIC0gVGhlIGVuZCBhbmdsZSBvZiB0aGUgY3VydmUgaW4gcmFkaWFucyBzdGFydGluZyBmcm9tIHRoZSBwb3NpdGl2ZSBYIGF4aXMuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbYUNsb2Nrd2lzZT1mYWxzZV0gLSBXaGV0aGVyIHRoZSBlbGxpcHNlIGlzIGRyYXduIGNsb2Nrd2lzZSBvciBub3QuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGFYLCBhWSwgYVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSApIHtcclxuXHJcblx0XHRzdXBlciggYVgsIGFZLCBhUmFkaXVzLCBhUmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzQXJjQ3VydmUgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdBcmNDdXJ2ZSc7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IEFyY0N1cnZlIH07XHJcbiIsImltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBDdXJ2ZSB9IGZyb20gJy4uL2NvcmUvQ3VydmUuanMnO1xyXG5cclxuZnVuY3Rpb24gQ3ViaWNQb2x5KCkge1xyXG5cclxuXHQvKipcclxuXHQgKiBDZW50cmlwZXRhbCBDYXRtdWxsUm9tIEN1cnZlIC0gd2hpY2ggaXMgdXNlZnVsIGZvciBhdm9pZGluZ1xyXG5cdCogY3VzcHMgYW5kIHNlbGYtaW50ZXJzZWN0aW9ucyBpbiBub24tdW5pZm9ybSBjYXRtdWxsIHJvbSBjdXJ2ZXMuXHJcblx0KiBodHRwOi8vd3d3LmNlbXl1a3NlbC5jb20vcmVzZWFyY2gvY2F0bXVsbHJvbV9wYXJhbS9jYXRtdWxscm9tLnBkZlxyXG5cdCpcclxuXHQqIGN1cnZlLnR5cGUgYWNjZXB0cyBjZW50cmlwZXRhbChkZWZhdWx0KSwgY2hvcmRhbCBhbmQgY2F0bXVsbHJvbVxyXG5cdCogY3VydmUudGVuc2lvbiBpcyB1c2VkIGZvciBjYXRtdWxscm9tIHdoaWNoIGRlZmF1bHRzIHRvIDAuNVxyXG5cdCovXHJcblxyXG5cdC8qXHJcblx0QmFzZWQgb24gYW4gb3B0aW1pemVkIGMrKyBzb2x1dGlvbiBpblxyXG5cdC0gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy85NDg5NzM2L2NhdG11bGwtcm9tLWN1cnZlLXdpdGgtbm8tY3VzcHMtYW5kLW5vLXNlbGYtaW50ZXJzZWN0aW9ucy9cclxuXHQtIGh0dHA6Ly9pZGVvbmUuY29tL05vRWJWTVxyXG5cclxuXHRUaGlzIEN1YmljUG9seSBjbGFzcyBjb3VsZCBiZSB1c2VkIGZvciByZXVzaW5nIHNvbWUgdmFyaWFibGVzIGFuZCBjYWxjdWxhdGlvbnMsXHJcblx0YnV0IGZvciB0aHJlZS5qcyBjdXJ2ZSB1c2UsIGl0IGNvdWxkIGJlIHBvc3NpYmxlIGlubGluZWQgYW5kIGZsYXR0ZW4gaW50byBhIHNpbmdsZSBmdW5jdGlvbiBjYWxsXHJcblx0d2hpY2ggY2FuIGJlIHBsYWNlZCBpbiBDdXJ2ZVV0aWxzLlxyXG5cdCovXHJcblxyXG5cdGxldCBjMCA9IDAsIGMxID0gMCwgYzIgPSAwLCBjMyA9IDA7XHJcblxyXG5cdC8qXHJcblx0ICogQ29tcHV0ZSBjb2VmZmljaWVudHMgZm9yIGEgY3ViaWMgcG9seW5vbWlhbFxyXG5cdCAqICAgcChzKSA9IGMwICsgYzEqcyArIGMyKnNeMiArIGMzKnNeM1xyXG5cdCAqIHN1Y2ggdGhhdFxyXG5cdCAqICAgcCgwKSA9IHgwLCBwKDEpID0geDFcclxuXHQgKiAgYW5kXHJcblx0ICogICBwJygwKSA9IHQwLCBwJygxKSA9IHQxLlxyXG5cdCAqL1xyXG5cdGZ1bmN0aW9uIGluaXQoIHgwLCB4MSwgdDAsIHQxICkge1xyXG5cclxuXHRcdGMwID0geDA7XHJcblx0XHRjMSA9IHQwO1xyXG5cdFx0YzIgPSAtIDMgKiB4MCArIDMgKiB4MSAtIDIgKiB0MCAtIHQxO1xyXG5cdFx0YzMgPSAyICogeDAgLSAyICogeDEgKyB0MCArIHQxO1xyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiB7XHJcblxyXG5cdFx0aW5pdENhdG11bGxSb206IGZ1bmN0aW9uICggeDAsIHgxLCB4MiwgeDMsIHRlbnNpb24gKSB7XHJcblxyXG5cdFx0XHRpbml0KCB4MSwgeDIsIHRlbnNpb24gKiAoIHgyIC0geDAgKSwgdGVuc2lvbiAqICggeDMgLSB4MSApICk7XHJcblxyXG5cdFx0fSxcclxuXHJcblx0XHRpbml0Tm9udW5pZm9ybUNhdG11bGxSb206IGZ1bmN0aW9uICggeDAsIHgxLCB4MiwgeDMsIGR0MCwgZHQxLCBkdDIgKSB7XHJcblxyXG5cdFx0XHQvLyBjb21wdXRlIHRhbmdlbnRzIHdoZW4gcGFyYW1ldGVyaXplZCBpbiBbdDEsdDJdXHJcblx0XHRcdGxldCB0MSA9ICggeDEgLSB4MCApIC8gZHQwIC0gKCB4MiAtIHgwICkgLyAoIGR0MCArIGR0MSApICsgKCB4MiAtIHgxICkgLyBkdDE7XHJcblx0XHRcdGxldCB0MiA9ICggeDIgLSB4MSApIC8gZHQxIC0gKCB4MyAtIHgxICkgLyAoIGR0MSArIGR0MiApICsgKCB4MyAtIHgyICkgLyBkdDI7XHJcblxyXG5cdFx0XHQvLyByZXNjYWxlIHRhbmdlbnRzIGZvciBwYXJhbWV0cml6YXRpb24gaW4gWzAsMV1cclxuXHRcdFx0dDEgKj0gZHQxO1xyXG5cdFx0XHR0MiAqPSBkdDE7XHJcblxyXG5cdFx0XHRpbml0KCB4MSwgeDIsIHQxLCB0MiApO1xyXG5cclxuXHRcdH0sXHJcblxyXG5cdFx0Y2FsYzogZnVuY3Rpb24gKCB0ICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdDIgPSB0ICogdDtcclxuXHRcdFx0Y29uc3QgdDMgPSB0MiAqIHQ7XHJcblx0XHRcdHJldHVybiBjMCArIGMxICogdCArIGMyICogdDIgKyBjMyAqIHQzO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fTtcclxuXHJcbn1cclxuXHJcbi8vXHJcblxyXG5jb25zdCB0bXAgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IHB4ID0gLypAX19QVVJFX18qLyBuZXcgQ3ViaWNQb2x5KCk7XHJcbmNvbnN0IHB5ID0gLypAX19QVVJFX18qLyBuZXcgQ3ViaWNQb2x5KCk7XHJcbmNvbnN0IHB6ID0gLypAX19QVVJFX18qLyBuZXcgQ3ViaWNQb2x5KCk7XHJcblxyXG4vKipcclxuICogQSBjdXJ2ZSByZXByZXNlbnRpbmcgYSBDYXRtdWxsLVJvbSBzcGxpbmUuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIC8vQ3JlYXRlIGEgY2xvc2VkIHdhdmV5IGxvb3BcclxuICogY29uc3QgY3VydmUgPSBuZXcgVEhSRUUuQ2F0bXVsbFJvbUN1cnZlMyggW1xyXG4gKiBcdG5ldyBUSFJFRS5WZWN0b3IzKCAtMTAsIDAsIDEwICksXHJcbiAqIFx0bmV3IFRIUkVFLlZlY3RvcjMoIC01LCA1LCA1ICksXHJcbiAqIFx0bmV3IFRIUkVFLlZlY3RvcjMoIDAsIDAsIDAgKSxcclxuICogXHRuZXcgVEhSRUUuVmVjdG9yMyggNSwgLTUsIDUgKSxcclxuICogXHRuZXcgVEhSRUUuVmVjdG9yMyggMTAsIDAsIDEwIClcclxuICogXSApO1xyXG4gKlxyXG4gKiBjb25zdCBwb2ludHMgPSBjdXJ2ZS5nZXRQb2ludHMoIDUwICk7XHJcbiAqIGNvbnN0IGdlb21ldHJ5ID0gbmV3IFRIUkVFLkJ1ZmZlckdlb21ldHJ5KCkuc2V0RnJvbVBvaW50cyggcG9pbnRzICk7XHJcbiAqXHJcbiAqIGNvbnN0IG1hdGVyaWFsID0gbmV3IFRIUkVFLkxpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiAweGZmMDAwMCB9ICk7XHJcbiAqXHJcbiAqIC8vIENyZWF0ZSB0aGUgZmluYWwgb2JqZWN0IHRvIGFkZCB0byB0aGUgc2NlbmVcclxuICogY29uc3QgY3VydmVPYmplY3QgPSBuZXcgVEhSRUUuTGluZSggZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQ3VydmVcclxuICovXHJcbmNsYXNzIENhdG11bGxSb21DdXJ2ZTMgZXh0ZW5kcyBDdXJ2ZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgQ2F0bXVsbC1Sb20gY3VydmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PFZlY3RvcjM+fSBbcG9pbnRzXSAtIEFuIGFycmF5IG9mIDNEIHBvaW50cyBkZWZpbmluZyB0aGUgY3VydmUuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbY2xvc2VkPWZhbHNlXSAtIFdoZXRoZXIgdGhlIGN1cnZlIGlzIGNsb3NlZCBvciBub3QuXHJcblx0ICogQHBhcmFtIHsoJ2NlbnRyaXBldGFsJ3wnY2hvcmRhbCd8J2NhdG11bGxyb20nKX0gW2N1cnZlVHlwZT0nY2VudHJpcGV0YWwnXSAtIFRoZSBjdXJ2ZSB0eXBlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbdGVuc2lvbj0wLjVdIC0gVGVuc2lvbiBvZiB0aGUgY3VydmUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHBvaW50cyA9IFtdLCBjbG9zZWQgPSBmYWxzZSwgY3VydmVUeXBlID0gJ2NlbnRyaXBldGFsJywgdGVuc2lvbiA9IDAuNSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0NhdG11bGxSb21DdXJ2ZTMgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdDYXRtdWxsUm9tQ3VydmUzJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIGFycmF5IG9mIDNEIHBvaW50cyBkZWZpbmluZyB0aGUgY3VydmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PFZlY3RvcjM+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBvaW50cyA9IHBvaW50cztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIGN1cnZlIGlzIGNsb3NlZCBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNsb3NlZCA9IGNsb3NlZDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjdXJ2ZSB0eXBlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoJ2NlbnRyaXBldGFsJ3wnY2hvcmRhbCd8J2NhdG11bGxyb20nKX1cclxuXHRcdCAqIEBkZWZhdWx0ICdjZW50cmlwZXRhbCdcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jdXJ2ZVR5cGUgPSBjdXJ2ZVR5cGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUZW5zaW9uIG9mIHRoZSBjdXJ2ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMC41XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudGVuc2lvbiA9IHRlbnNpb247XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIHBvaW50IG9uIHRoZSBjdXJ2ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0IC0gQSBpbnRlcnBvbGF0aW9uIGZhY3RvciByZXByZXNlbnRpbmcgYSBwb3NpdGlvbiBvbiB0aGUgY3VydmUuIE11c3QgYmUgaW4gdGhlIHJhbmdlIGBbMCwxXWAuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBbb3B0aW9uYWxUYXJnZXRdIC0gVGhlIG9wdGlvbmFsIHRhcmdldCB2ZWN0b3IgdGhlIHJlc3VsdCBpcyB3cml0dGVuIHRvLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IFRoZSBwb3NpdGlvbiBvbiB0aGUgY3VydmUuXHJcblx0ICovXHJcblx0Z2V0UG9pbnQoIHQsIG9wdGlvbmFsVGFyZ2V0ID0gbmV3IFZlY3RvcjMoKSApIHtcclxuXHJcblx0XHRjb25zdCBwb2ludCA9IG9wdGlvbmFsVGFyZ2V0O1xyXG5cclxuXHRcdGNvbnN0IHBvaW50cyA9IHRoaXMucG9pbnRzO1xyXG5cdFx0Y29uc3QgbCA9IHBvaW50cy5sZW5ndGg7XHJcblxyXG5cdFx0Y29uc3QgcCA9ICggbCAtICggdGhpcy5jbG9zZWQgPyAwIDogMSApICkgKiB0O1xyXG5cdFx0bGV0IGludFBvaW50ID0gTWF0aC5mbG9vciggcCApO1xyXG5cdFx0bGV0IHdlaWdodCA9IHAgLSBpbnRQb2ludDtcclxuXHJcblx0XHRpZiAoIHRoaXMuY2xvc2VkICkge1xyXG5cclxuXHRcdFx0aW50UG9pbnQgKz0gaW50UG9pbnQgPiAwID8gMCA6ICggTWF0aC5mbG9vciggTWF0aC5hYnMoIGludFBvaW50ICkgLyBsICkgKyAxICkgKiBsO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHdlaWdodCA9PT0gMCAmJiBpbnRQb2ludCA9PT0gbCAtIDEgKSB7XHJcblxyXG5cdFx0XHRpbnRQb2ludCA9IGwgLSAyO1xyXG5cdFx0XHR3ZWlnaHQgPSAxO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRsZXQgcDAsIHAzOyAvLyA0IHBvaW50cyAocDEgJiBwMiBkZWZpbmVkIGJlbG93KVxyXG5cclxuXHRcdGlmICggdGhpcy5jbG9zZWQgfHwgaW50UG9pbnQgPiAwICkge1xyXG5cclxuXHRcdFx0cDAgPSBwb2ludHNbICggaW50UG9pbnQgLSAxICkgJSBsIF07XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdC8vIGV4dHJhcG9sYXRlIGZpcnN0IHBvaW50XHJcblx0XHRcdHRtcC5zdWJWZWN0b3JzKCBwb2ludHNbIDAgXSwgcG9pbnRzWyAxIF0gKS5hZGQoIHBvaW50c1sgMCBdICk7XHJcblx0XHRcdHAwID0gdG1wO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBwMSA9IHBvaW50c1sgaW50UG9pbnQgJSBsIF07XHJcblx0XHRjb25zdCBwMiA9IHBvaW50c1sgKCBpbnRQb2ludCArIDEgKSAlIGwgXTtcclxuXHJcblx0XHRpZiAoIHRoaXMuY2xvc2VkIHx8IGludFBvaW50ICsgMiA8IGwgKSB7XHJcblxyXG5cdFx0XHRwMyA9IHBvaW50c1sgKCBpbnRQb2ludCArIDIgKSAlIGwgXTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Ly8gZXh0cmFwb2xhdGUgbGFzdCBwb2ludFxyXG5cdFx0XHR0bXAuc3ViVmVjdG9ycyggcG9pbnRzWyBsIC0gMSBdLCBwb2ludHNbIGwgLSAyIF0gKS5hZGQoIHBvaW50c1sgbCAtIDEgXSApO1xyXG5cdFx0XHRwMyA9IHRtcDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aGlzLmN1cnZlVHlwZSA9PT0gJ2NlbnRyaXBldGFsJyB8fCB0aGlzLmN1cnZlVHlwZSA9PT0gJ2Nob3JkYWwnICkge1xyXG5cclxuXHRcdFx0Ly8gaW5pdCBDZW50cmlwZXRhbCAvIENob3JkYWwgQ2F0bXVsbC1Sb21cclxuXHRcdFx0Y29uc3QgcG93ID0gdGhpcy5jdXJ2ZVR5cGUgPT09ICdjaG9yZGFsJyA/IDAuNSA6IDAuMjU7XHJcblx0XHRcdGxldCBkdDAgPSBNYXRoLnBvdyggcDAuZGlzdGFuY2VUb1NxdWFyZWQoIHAxICksIHBvdyApO1xyXG5cdFx0XHRsZXQgZHQxID0gTWF0aC5wb3coIHAxLmRpc3RhbmNlVG9TcXVhcmVkKCBwMiApLCBwb3cgKTtcclxuXHRcdFx0bGV0IGR0MiA9IE1hdGgucG93KCBwMi5kaXN0YW5jZVRvU3F1YXJlZCggcDMgKSwgcG93ICk7XHJcblxyXG5cdFx0XHQvLyBzYWZldHkgY2hlY2sgZm9yIHJlcGVhdGVkIHBvaW50c1xyXG5cdFx0XHRpZiAoIGR0MSA8IDFlLTQgKSBkdDEgPSAxLjA7XHJcblx0XHRcdGlmICggZHQwIDwgMWUtNCApIGR0MCA9IGR0MTtcclxuXHRcdFx0aWYgKCBkdDIgPCAxZS00ICkgZHQyID0gZHQxO1xyXG5cclxuXHRcdFx0cHguaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tKCBwMC54LCBwMS54LCBwMi54LCBwMy54LCBkdDAsIGR0MSwgZHQyICk7XHJcblx0XHRcdHB5LmluaXROb251bmlmb3JtQ2F0bXVsbFJvbSggcDAueSwgcDEueSwgcDIueSwgcDMueSwgZHQwLCBkdDEsIGR0MiApO1xyXG5cdFx0XHRwei5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20oIHAwLnosIHAxLnosIHAyLnosIHAzLnosIGR0MCwgZHQxLCBkdDIgKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCB0aGlzLmN1cnZlVHlwZSA9PT0gJ2NhdG11bGxyb20nICkge1xyXG5cclxuXHRcdFx0cHguaW5pdENhdG11bGxSb20oIHAwLngsIHAxLngsIHAyLngsIHAzLngsIHRoaXMudGVuc2lvbiApO1xyXG5cdFx0XHRweS5pbml0Q2F0bXVsbFJvbSggcDAueSwgcDEueSwgcDIueSwgcDMueSwgdGhpcy50ZW5zaW9uICk7XHJcblx0XHRcdHB6LmluaXRDYXRtdWxsUm9tKCBwMC56LCBwMS56LCBwMi56LCBwMy56LCB0aGlzLnRlbnNpb24gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cG9pbnQuc2V0KFxyXG5cdFx0XHRweC5jYWxjKCB3ZWlnaHQgKSxcclxuXHRcdFx0cHkuY2FsYyggd2VpZ2h0ICksXHJcblx0XHRcdHB6LmNhbGMoIHdlaWdodCApXHJcblx0XHQpO1xyXG5cclxuXHRcdHJldHVybiBwb2ludDtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy5wb2ludHMgPSBbXTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBzb3VyY2UucG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBwb2ludCA9IHNvdXJjZS5wb2ludHNbIGkgXTtcclxuXHJcblx0XHRcdHRoaXMucG9pbnRzLnB1c2goIHBvaW50LmNsb25lKCkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5jbG9zZWQgPSBzb3VyY2UuY2xvc2VkO1xyXG5cdFx0dGhpcy5jdXJ2ZVR5cGUgPSBzb3VyY2UuY3VydmVUeXBlO1xyXG5cdFx0dGhpcy50ZW5zaW9uID0gc291cmNlLnRlbnNpb247XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0dG9KU09OKCkge1xyXG5cclxuXHRcdGNvbnN0IGRhdGEgPSBzdXBlci50b0pTT04oKTtcclxuXHJcblx0XHRkYXRhLnBvaW50cyA9IFtdO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHRoaXMucG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBwb2ludCA9IHRoaXMucG9pbnRzWyBpIF07XHJcblx0XHRcdGRhdGEucG9pbnRzLnB1c2goIHBvaW50LnRvQXJyYXkoKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRkYXRhLmNsb3NlZCA9IHRoaXMuY2xvc2VkO1xyXG5cdFx0ZGF0YS5jdXJ2ZVR5cGUgPSB0aGlzLmN1cnZlVHlwZTtcclxuXHRcdGRhdGEudGVuc2lvbiA9IHRoaXMudGVuc2lvbjtcclxuXHJcblx0XHRyZXR1cm4gZGF0YTtcclxuXHJcblx0fVxyXG5cclxuXHRmcm9tSlNPTigganNvbiApIHtcclxuXHJcblx0XHRzdXBlci5mcm9tSlNPTigganNvbiApO1xyXG5cclxuXHRcdHRoaXMucG9pbnRzID0gW107XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0ganNvbi5wb2ludHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHBvaW50ID0ganNvbi5wb2ludHNbIGkgXTtcclxuXHRcdFx0dGhpcy5wb2ludHMucHVzaCggbmV3IFZlY3RvcjMoKS5mcm9tQXJyYXkoIHBvaW50ICkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5jbG9zZWQgPSBqc29uLmNsb3NlZDtcclxuXHRcdHRoaXMuY3VydmVUeXBlID0ganNvbi5jdXJ2ZVR5cGU7XHJcblx0XHR0aGlzLnRlbnNpb24gPSBqc29uLnRlbnNpb247XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IENhdG11bGxSb21DdXJ2ZTMgfTtcclxuIiwiLy8gQmV6aWVyIEN1cnZlcyBmb3JtdWxhcyBvYnRhaW5lZCBmcm9tOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CJUMzJUE5emllcl9jdXJ2ZVxyXG5cclxuLyoqXHJcbiAqIENvbXB1dGVzIGEgcG9pbnQgb24gYSBDYXRtdWxsLVJvbSBzcGxpbmUuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB0IC0gVGhlIGludGVycG9sYXRpb24gZmFjdG9yLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gcDAgLSBUaGUgZmlyc3QgY29udHJvbCBwb2ludC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHAxIC0gVGhlIHNlY29uZCBjb250cm9sIHBvaW50LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gcDIgLSBUaGUgdGhpcmQgY29udHJvbCBwb2ludC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHAzIC0gVGhlIGZvdXJ0aCBjb250cm9sIHBvaW50LlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBjYWxjdWxhdGVkIHBvaW50IG9uIGEgQ2F0bXVsbC1Sb20gc3BsaW5lLlxyXG4gKi9cclxuZnVuY3Rpb24gQ2F0bXVsbFJvbSggdCwgcDAsIHAxLCBwMiwgcDMgKSB7XHJcblxyXG5cdGNvbnN0IHYwID0gKCBwMiAtIHAwICkgKiAwLjU7XHJcblx0Y29uc3QgdjEgPSAoIHAzIC0gcDEgKSAqIDAuNTtcclxuXHRjb25zdCB0MiA9IHQgKiB0O1xyXG5cdGNvbnN0IHQzID0gdCAqIHQyO1xyXG5cdHJldHVybiAoIDIgKiBwMSAtIDIgKiBwMiArIHYwICsgdjEgKSAqIHQzICsgKCAtIDMgKiBwMSArIDMgKiBwMiAtIDIgKiB2MCAtIHYxICkgKiB0MiArIHYwICogdCArIHAxO1xyXG5cclxufVxyXG5cclxuLy9cclxuXHJcbmZ1bmN0aW9uIFF1YWRyYXRpY0JlemllclAwKCB0LCBwICkge1xyXG5cclxuXHRjb25zdCBrID0gMSAtIHQ7XHJcblx0cmV0dXJuIGsgKiBrICogcDtcclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIFF1YWRyYXRpY0JlemllclAxKCB0LCBwICkge1xyXG5cclxuXHRyZXR1cm4gMiAqICggMSAtIHQgKSAqIHQgKiBwO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gUXVhZHJhdGljQmV6aWVyUDIoIHQsIHAgKSB7XHJcblxyXG5cdHJldHVybiB0ICogdCAqIHA7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQ29tcHV0ZXMgYSBwb2ludCBvbiBhIFF1YWRyYXRpYyBCZXppZXIgY3VydmUuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB0IC0gVGhlIGludGVycG9sYXRpb24gZmFjdG9yLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gcDAgLSBUaGUgZmlyc3QgY29udHJvbCBwb2ludC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHAxIC0gVGhlIHNlY29uZCBjb250cm9sIHBvaW50LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gcDIgLSBUaGUgdGhpcmQgY29udHJvbCBwb2ludC5cclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgY2FsY3VsYXRlZCBwb2ludCBvbiBhIFF1YWRyYXRpYyBCZXppZXIgY3VydmUuXHJcbiAqL1xyXG5mdW5jdGlvbiBRdWFkcmF0aWNCZXppZXIoIHQsIHAwLCBwMSwgcDIgKSB7XHJcblxyXG5cdHJldHVybiBRdWFkcmF0aWNCZXppZXJQMCggdCwgcDAgKSArIFF1YWRyYXRpY0JlemllclAxKCB0LCBwMSApICtcclxuXHRcdFF1YWRyYXRpY0JlemllclAyKCB0LCBwMiApO1xyXG5cclxufVxyXG5cclxuLy9cclxuXHJcbmZ1bmN0aW9uIEN1YmljQmV6aWVyUDAoIHQsIHAgKSB7XHJcblxyXG5cdGNvbnN0IGsgPSAxIC0gdDtcclxuXHRyZXR1cm4gayAqIGsgKiBrICogcDtcclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIEN1YmljQmV6aWVyUDEoIHQsIHAgKSB7XHJcblxyXG5cdGNvbnN0IGsgPSAxIC0gdDtcclxuXHRyZXR1cm4gMyAqIGsgKiBrICogdCAqIHA7XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBDdWJpY0JlemllclAyKCB0LCBwICkge1xyXG5cclxuXHRyZXR1cm4gMyAqICggMSAtIHQgKSAqIHQgKiB0ICogcDtcclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIEN1YmljQmV6aWVyUDMoIHQsIHAgKSB7XHJcblxyXG5cdHJldHVybiB0ICogdCAqIHQgKiBwO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIENvbXB1dGVzIGEgcG9pbnQgb24gYSBDdWJpYyBCZXppZXIgY3VydmUuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB0IC0gVGhlIGludGVycG9sYXRpb24gZmFjdG9yLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gcDAgLSBUaGUgZmlyc3QgY29udHJvbCBwb2ludC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHAxIC0gVGhlIHNlY29uZCBjb250cm9sIHBvaW50LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gcDIgLSBUaGUgdGhpcmQgY29udHJvbCBwb2ludC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHAzIC0gVGhlIGZvdXJ0aCBjb250cm9sIHBvaW50LlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBjYWxjdWxhdGVkIHBvaW50IG9uIGEgQ3ViaWMgQmV6aWVyIGN1cnZlLlxyXG4gKi9cclxuZnVuY3Rpb24gQ3ViaWNCZXppZXIoIHQsIHAwLCBwMSwgcDIsIHAzICkge1xyXG5cclxuXHRyZXR1cm4gQ3ViaWNCZXppZXJQMCggdCwgcDAgKSArIEN1YmljQmV6aWVyUDEoIHQsIHAxICkgKyBDdWJpY0JlemllclAyKCB0LCBwMiApICtcclxuXHRcdEN1YmljQmV6aWVyUDMoIHQsIHAzICk7XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBDYXRtdWxsUm9tLCBRdWFkcmF0aWNCZXppZXIsIEN1YmljQmV6aWVyIH07XHJcbiIsImltcG9ydCB7IEN1cnZlIH0gZnJvbSAnLi4vY29yZS9DdXJ2ZS5qcyc7XHJcbmltcG9ydCB7IEN1YmljQmV6aWVyIH0gZnJvbSAnLi4vY29yZS9JbnRlcnBvbGF0aW9ucy5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjIuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgY3VydmUgcmVwcmVzZW50aW5nIGEgMkQgQ3ViaWMgQmV6aWVyIGN1cnZlLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBjdXJ2ZSA9IG5ldyBUSFJFRS5DdWJpY0JlemllckN1cnZlKFxyXG4gKiBcdG5ldyBUSFJFRS5WZWN0b3IyKCAtIDAsIDAgKSxcclxuICogXHRuZXcgVEhSRUUuVmVjdG9yMiggLSA1LCAxNSApLFxyXG4gKiBcdG5ldyBUSFJFRS5WZWN0b3IyKCAyMCwgMTUgKSxcclxuICogXHRuZXcgVEhSRUUuVmVjdG9yMiggMTAsIDAgKVxyXG4gKiApO1xyXG4gKlxyXG4gKiBjb25zdCBwb2ludHMgPSBjdXJ2ZS5nZXRQb2ludHMoIDUwICk7XHJcbiAqIGNvbnN0IGdlb21ldHJ5ID0gbmV3IFRIUkVFLkJ1ZmZlckdlb21ldHJ5KCkuc2V0RnJvbVBvaW50cyggcG9pbnRzICk7XHJcbiAqXHJcbiAqIGNvbnN0IG1hdGVyaWFsID0gbmV3IFRIUkVFLkxpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiAweGZmMDAwMCB9ICk7XHJcbiAqXHJcbiAqIC8vIENyZWF0ZSB0aGUgZmluYWwgb2JqZWN0IHRvIGFkZCB0byB0aGUgc2NlbmVcclxuICogY29uc3QgY3VydmVPYmplY3QgPSBuZXcgVEhSRUUuTGluZSggZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQ3VydmVcclxuICovXHJcbmNsYXNzIEN1YmljQmV6aWVyQ3VydmUgZXh0ZW5kcyBDdXJ2ZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgQ3ViaWMgQmV6aWVyIGN1cnZlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSBbdjBdIC0gVGhlIHN0YXJ0IHBvaW50LlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gW3YxXSAtIFRoZSBmaXJzdCBjb250cm9sIHBvaW50LlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gW3YyXSAtIFRoZSBzZWNvbmQgY29udHJvbCBwb2ludC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IFt2M10gLSBUaGUgZW5kIHBvaW50LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCB2MCA9IG5ldyBWZWN0b3IyKCksIHYxID0gbmV3IFZlY3RvcjIoKSwgdjIgPSBuZXcgVmVjdG9yMigpLCB2MyA9IG5ldyBWZWN0b3IyKCkgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNDdWJpY0JlemllckN1cnZlID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnQ3ViaWNCZXppZXJDdXJ2ZSc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc3RhcnQgcG9pbnQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudjAgPSB2MDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBmaXJzdCBjb250cm9sIHBvaW50LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3IyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnYxID0gdjE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudjIgPSB2MjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBlbmQgcG9pbnQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudjMgPSB2MztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgcG9pbnQgb24gdGhlIGN1cnZlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHQgLSBBIGludGVycG9sYXRpb24gZmFjdG9yIHJlcHJlc2VudGluZyBhIHBvc2l0aW9uIG9uIHRoZSBjdXJ2ZS4gTXVzdCBiZSBpbiB0aGUgcmFuZ2UgYFswLDFdYC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IFtvcHRpb25hbFRhcmdldF0gLSBUaGUgb3B0aW9uYWwgdGFyZ2V0IHZlY3RvciB0aGUgcmVzdWx0IGlzIHdyaXR0ZW4gdG8uXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gVGhlIHBvc2l0aW9uIG9uIHRoZSBjdXJ2ZS5cclxuXHQgKi9cclxuXHRnZXRQb2ludCggdCwgb3B0aW9uYWxUYXJnZXQgPSBuZXcgVmVjdG9yMigpICkge1xyXG5cclxuXHRcdGNvbnN0IHBvaW50ID0gb3B0aW9uYWxUYXJnZXQ7XHJcblxyXG5cdFx0Y29uc3QgdjAgPSB0aGlzLnYwLCB2MSA9IHRoaXMudjEsIHYyID0gdGhpcy52MiwgdjMgPSB0aGlzLnYzO1xyXG5cclxuXHRcdHBvaW50LnNldChcclxuXHRcdFx0Q3ViaWNCZXppZXIoIHQsIHYwLngsIHYxLngsIHYyLngsIHYzLnggKSxcclxuXHRcdFx0Q3ViaWNCZXppZXIoIHQsIHYwLnksIHYxLnksIHYyLnksIHYzLnkgKVxyXG5cdFx0KTtcclxuXHJcblx0XHRyZXR1cm4gcG9pbnQ7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMudjAuY29weSggc291cmNlLnYwICk7XHJcblx0XHR0aGlzLnYxLmNvcHkoIHNvdXJjZS52MSApO1xyXG5cdFx0dGhpcy52Mi5jb3B5KCBzb3VyY2UudjIgKTtcclxuXHRcdHRoaXMudjMuY29weSggc291cmNlLnYzICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0dG9KU09OKCkge1xyXG5cclxuXHRcdGNvbnN0IGRhdGEgPSBzdXBlci50b0pTT04oKTtcclxuXHJcblx0XHRkYXRhLnYwID0gdGhpcy52MC50b0FycmF5KCk7XHJcblx0XHRkYXRhLnYxID0gdGhpcy52MS50b0FycmF5KCk7XHJcblx0XHRkYXRhLnYyID0gdGhpcy52Mi50b0FycmF5KCk7XHJcblx0XHRkYXRhLnYzID0gdGhpcy52My50b0FycmF5KCk7XHJcblxyXG5cdFx0cmV0dXJuIGRhdGE7XHJcblxyXG5cdH1cclxuXHJcblx0ZnJvbUpTT04oIGpzb24gKSB7XHJcblxyXG5cdFx0c3VwZXIuZnJvbUpTT04oIGpzb24gKTtcclxuXHJcblx0XHR0aGlzLnYwLmZyb21BcnJheSgganNvbi52MCApO1xyXG5cdFx0dGhpcy52MS5mcm9tQXJyYXkoIGpzb24udjEgKTtcclxuXHRcdHRoaXMudjIuZnJvbUFycmF5KCBqc29uLnYyICk7XHJcblx0XHR0aGlzLnYzLmZyb21BcnJheSgganNvbi52MyApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBDdWJpY0JlemllckN1cnZlIH07XHJcbiIsImltcG9ydCB7IEN1cnZlIH0gZnJvbSAnLi4vY29yZS9DdXJ2ZS5qcyc7XHJcbmltcG9ydCB7IEN1YmljQmV6aWVyIH0gZnJvbSAnLi4vY29yZS9JbnRlcnBvbGF0aW9ucy5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgY3VydmUgcmVwcmVzZW50aW5nIGEgM0QgQ3ViaWMgQmV6aWVyIGN1cnZlLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQ3VydmVcclxuICovXHJcbmNsYXNzIEN1YmljQmV6aWVyQ3VydmUzIGV4dGVuZHMgQ3VydmUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IEN1YmljIEJlemllciBjdXJ2ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gW3YwXSAtIFRoZSBzdGFydCBwb2ludC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IFt2MV0gLSBUaGUgZmlyc3QgY29udHJvbCBwb2ludC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IFt2Ml0gLSBUaGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBbdjNdIC0gVGhlIGVuZCBwb2ludC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggdjAgPSBuZXcgVmVjdG9yMygpLCB2MSA9IG5ldyBWZWN0b3IzKCksIHYyID0gbmV3IFZlY3RvcjMoKSwgdjMgPSBuZXcgVmVjdG9yMygpICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzQ3ViaWNCZXppZXJDdXJ2ZTMgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdDdWJpY0JlemllckN1cnZlMyc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc3RhcnQgcG9pbnQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjN9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudjAgPSB2MDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBmaXJzdCBjb250cm9sIHBvaW50LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3IzfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnYxID0gdjE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjN9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudjIgPSB2MjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBlbmQgcG9pbnQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjN9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudjMgPSB2MztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgcG9pbnQgb24gdGhlIGN1cnZlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHQgLSBBIGludGVycG9sYXRpb24gZmFjdG9yIHJlcHJlc2VudGluZyBhIHBvc2l0aW9uIG9uIHRoZSBjdXJ2ZS4gTXVzdCBiZSBpbiB0aGUgcmFuZ2UgYFswLDFdYC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IFtvcHRpb25hbFRhcmdldF0gLSBUaGUgb3B0aW9uYWwgdGFyZ2V0IHZlY3RvciB0aGUgcmVzdWx0IGlzIHdyaXR0ZW4gdG8uXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gVGhlIHBvc2l0aW9uIG9uIHRoZSBjdXJ2ZS5cclxuXHQgKi9cclxuXHRnZXRQb2ludCggdCwgb3B0aW9uYWxUYXJnZXQgPSBuZXcgVmVjdG9yMygpICkge1xyXG5cclxuXHRcdGNvbnN0IHBvaW50ID0gb3B0aW9uYWxUYXJnZXQ7XHJcblxyXG5cdFx0Y29uc3QgdjAgPSB0aGlzLnYwLCB2MSA9IHRoaXMudjEsIHYyID0gdGhpcy52MiwgdjMgPSB0aGlzLnYzO1xyXG5cclxuXHRcdHBvaW50LnNldChcclxuXHRcdFx0Q3ViaWNCZXppZXIoIHQsIHYwLngsIHYxLngsIHYyLngsIHYzLnggKSxcclxuXHRcdFx0Q3ViaWNCZXppZXIoIHQsIHYwLnksIHYxLnksIHYyLnksIHYzLnkgKSxcclxuXHRcdFx0Q3ViaWNCZXppZXIoIHQsIHYwLnosIHYxLnosIHYyLnosIHYzLnogKVxyXG5cdFx0KTtcclxuXHJcblx0XHRyZXR1cm4gcG9pbnQ7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMudjAuY29weSggc291cmNlLnYwICk7XHJcblx0XHR0aGlzLnYxLmNvcHkoIHNvdXJjZS52MSApO1xyXG5cdFx0dGhpcy52Mi5jb3B5KCBzb3VyY2UudjIgKTtcclxuXHRcdHRoaXMudjMuY29weSggc291cmNlLnYzICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0dG9KU09OKCkge1xyXG5cclxuXHRcdGNvbnN0IGRhdGEgPSBzdXBlci50b0pTT04oKTtcclxuXHJcblx0XHRkYXRhLnYwID0gdGhpcy52MC50b0FycmF5KCk7XHJcblx0XHRkYXRhLnYxID0gdGhpcy52MS50b0FycmF5KCk7XHJcblx0XHRkYXRhLnYyID0gdGhpcy52Mi50b0FycmF5KCk7XHJcblx0XHRkYXRhLnYzID0gdGhpcy52My50b0FycmF5KCk7XHJcblxyXG5cdFx0cmV0dXJuIGRhdGE7XHJcblxyXG5cdH1cclxuXHJcblx0ZnJvbUpTT04oIGpzb24gKSB7XHJcblxyXG5cdFx0c3VwZXIuZnJvbUpTT04oIGpzb24gKTtcclxuXHJcblx0XHR0aGlzLnYwLmZyb21BcnJheSgganNvbi52MCApO1xyXG5cdFx0dGhpcy52MS5mcm9tQXJyYXkoIGpzb24udjEgKTtcclxuXHRcdHRoaXMudjIuZnJvbUFycmF5KCBqc29uLnYyICk7XHJcblx0XHR0aGlzLnYzLmZyb21BcnJheSgganNvbi52MyApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBDdWJpY0JlemllckN1cnZlMyB9O1xyXG4iLCJpbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IyLmpzJztcclxuaW1wb3J0IHsgQ3VydmUgfSBmcm9tICcuLi9jb3JlL0N1cnZlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIGN1cnZlIHJlcHJlc2VudGluZyBhIDJEIGxpbmUgc2VnbWVudC5cclxuICpcclxuICogQGF1Z21lbnRzIEN1cnZlXHJcbiAqL1xyXG5jbGFzcyBMaW5lQ3VydmUgZXh0ZW5kcyBDdXJ2ZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbGluZSBjdXJ2ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gW3YxXSAtIFRoZSBzdGFydCBwb2ludC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IFt2Ml0gLSBUaGUgZW5kIHBvaW50LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCB2MSA9IG5ldyBWZWN0b3IyKCksIHYyID0gbmV3IFZlY3RvcjIoKSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0xpbmVDdXJ2ZSA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ0xpbmVDdXJ2ZSc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc3RhcnQgcG9pbnQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudjEgPSB2MTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBlbmQgcG9pbnQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudjIgPSB2MjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgcG9pbnQgb24gdGhlIGxpbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdCAtIEEgaW50ZXJwb2xhdGlvbiBmYWN0b3IgcmVwcmVzZW50aW5nIGEgcG9zaXRpb24gb24gdGhlIGxpbmUuIE11c3QgYmUgaW4gdGhlIHJhbmdlIGBbMCwxXWAuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSBbb3B0aW9uYWxUYXJnZXRdIC0gVGhlIG9wdGlvbmFsIHRhcmdldCB2ZWN0b3IgdGhlIHJlc3VsdCBpcyB3cml0dGVuIHRvLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IFRoZSBwb3NpdGlvbiBvbiB0aGUgbGluZS5cclxuXHQgKi9cclxuXHRnZXRQb2ludCggdCwgb3B0aW9uYWxUYXJnZXQgPSBuZXcgVmVjdG9yMigpICkge1xyXG5cclxuXHRcdGNvbnN0IHBvaW50ID0gb3B0aW9uYWxUYXJnZXQ7XHJcblxyXG5cdFx0aWYgKCB0ID09PSAxICkge1xyXG5cclxuXHRcdFx0cG9pbnQuY29weSggdGhpcy52MiApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRwb2ludC5jb3B5KCB0aGlzLnYyICkuc3ViKCB0aGlzLnYxICk7XHJcblx0XHRcdHBvaW50Lm11bHRpcGx5U2NhbGFyKCB0ICkuYWRkKCB0aGlzLnYxICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBwb2ludDtcclxuXHJcblx0fVxyXG5cclxuXHQvLyBMaW5lIGN1cnZlIGlzIGxpbmVhciwgc28gd2UgY2FuIG92ZXJ3cml0ZSBkZWZhdWx0IGdldFBvaW50QXRcclxuXHRnZXRQb2ludEF0KCB1LCBvcHRpb25hbFRhcmdldCApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5nZXRQb2ludCggdSwgb3B0aW9uYWxUYXJnZXQgKTtcclxuXHJcblx0fVxyXG5cclxuXHRnZXRUYW5nZW50KCB0LCBvcHRpb25hbFRhcmdldCA9IG5ldyBWZWN0b3IyKCkgKSB7XHJcblxyXG5cdFx0cmV0dXJuIG9wdGlvbmFsVGFyZ2V0LnN1YlZlY3RvcnMoIHRoaXMudjIsIHRoaXMudjEgKS5ub3JtYWxpemUoKTtcclxuXHJcblx0fVxyXG5cclxuXHRnZXRUYW5nZW50QXQoIHUsIG9wdGlvbmFsVGFyZ2V0ICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmdldFRhbmdlbnQoIHUsIG9wdGlvbmFsVGFyZ2V0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMudjEuY29weSggc291cmNlLnYxICk7XHJcblx0XHR0aGlzLnYyLmNvcHkoIHNvdXJjZS52MiApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdHRvSlNPTigpIHtcclxuXHJcblx0XHRjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCk7XHJcblxyXG5cdFx0ZGF0YS52MSA9IHRoaXMudjEudG9BcnJheSgpO1xyXG5cdFx0ZGF0YS52MiA9IHRoaXMudjIudG9BcnJheSgpO1xyXG5cclxuXHRcdHJldHVybiBkYXRhO1xyXG5cclxuXHR9XHJcblxyXG5cdGZyb21KU09OKCBqc29uICkge1xyXG5cclxuXHRcdHN1cGVyLmZyb21KU09OKCBqc29uICk7XHJcblxyXG5cdFx0dGhpcy52MS5mcm9tQXJyYXkoIGpzb24udjEgKTtcclxuXHRcdHRoaXMudjIuZnJvbUFycmF5KCBqc29uLnYyICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IExpbmVDdXJ2ZSB9O1xyXG4iLCJpbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuaW1wb3J0IHsgQ3VydmUgfSBmcm9tICcuLi9jb3JlL0N1cnZlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIGN1cnZlIHJlcHJlc2VudGluZyBhIDNEIGxpbmUgc2VnbWVudC5cclxuICpcclxuICogQGF1Z21lbnRzIEN1cnZlXHJcbiAqL1xyXG5jbGFzcyBMaW5lQ3VydmUzIGV4dGVuZHMgQ3VydmUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGxpbmUgY3VydmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IFt2MV0gLSBUaGUgc3RhcnQgcG9pbnQuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBbdjJdIC0gVGhlIGVuZCBwb2ludC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggdjEgPSBuZXcgVmVjdG9yMygpLCB2MiA9IG5ldyBWZWN0b3IzKCkgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNMaW5lQ3VydmUzID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnTGluZUN1cnZlMyc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc3RhcnQgcG9pbnQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjN9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudjEgPSB2MTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBlbmQgcG9pbnQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudjIgPSB2MjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgcG9pbnQgb24gdGhlIGxpbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdCAtIEEgaW50ZXJwb2xhdGlvbiBmYWN0b3IgcmVwcmVzZW50aW5nIGEgcG9zaXRpb24gb24gdGhlIGxpbmUuIE11c3QgYmUgaW4gdGhlIHJhbmdlIGBbMCwxXWAuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBbb3B0aW9uYWxUYXJnZXRdIC0gVGhlIG9wdGlvbmFsIHRhcmdldCB2ZWN0b3IgdGhlIHJlc3VsdCBpcyB3cml0dGVuIHRvLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IFRoZSBwb3NpdGlvbiBvbiB0aGUgbGluZS5cclxuXHQgKi9cclxuXHRnZXRQb2ludCggdCwgb3B0aW9uYWxUYXJnZXQgPSBuZXcgVmVjdG9yMygpICkge1xyXG5cclxuXHRcdGNvbnN0IHBvaW50ID0gb3B0aW9uYWxUYXJnZXQ7XHJcblxyXG5cdFx0aWYgKCB0ID09PSAxICkge1xyXG5cclxuXHRcdFx0cG9pbnQuY29weSggdGhpcy52MiApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRwb2ludC5jb3B5KCB0aGlzLnYyICkuc3ViKCB0aGlzLnYxICk7XHJcblx0XHRcdHBvaW50Lm11bHRpcGx5U2NhbGFyKCB0ICkuYWRkKCB0aGlzLnYxICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBwb2ludDtcclxuXHJcblx0fVxyXG5cclxuXHQvLyBMaW5lIGN1cnZlIGlzIGxpbmVhciwgc28gd2UgY2FuIG92ZXJ3cml0ZSBkZWZhdWx0IGdldFBvaW50QXRcclxuXHRnZXRQb2ludEF0KCB1LCBvcHRpb25hbFRhcmdldCApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5nZXRQb2ludCggdSwgb3B0aW9uYWxUYXJnZXQgKTtcclxuXHJcblx0fVxyXG5cclxuXHRnZXRUYW5nZW50KCB0LCBvcHRpb25hbFRhcmdldCA9IG5ldyBWZWN0b3IzKCkgKSB7XHJcblxyXG5cdFx0cmV0dXJuIG9wdGlvbmFsVGFyZ2V0LnN1YlZlY3RvcnMoIHRoaXMudjIsIHRoaXMudjEgKS5ub3JtYWxpemUoKTtcclxuXHJcblx0fVxyXG5cclxuXHRnZXRUYW5nZW50QXQoIHUsIG9wdGlvbmFsVGFyZ2V0ICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmdldFRhbmdlbnQoIHUsIG9wdGlvbmFsVGFyZ2V0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMudjEuY29weSggc291cmNlLnYxICk7XHJcblx0XHR0aGlzLnYyLmNvcHkoIHNvdXJjZS52MiApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdHRvSlNPTigpIHtcclxuXHJcblx0XHRjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCk7XHJcblxyXG5cdFx0ZGF0YS52MSA9IHRoaXMudjEudG9BcnJheSgpO1xyXG5cdFx0ZGF0YS52MiA9IHRoaXMudjIudG9BcnJheSgpO1xyXG5cclxuXHRcdHJldHVybiBkYXRhO1xyXG5cclxuXHR9XHJcblxyXG5cdGZyb21KU09OKCBqc29uICkge1xyXG5cclxuXHRcdHN1cGVyLmZyb21KU09OKCBqc29uICk7XHJcblxyXG5cdFx0dGhpcy52MS5mcm9tQXJyYXkoIGpzb24udjEgKTtcclxuXHRcdHRoaXMudjIuZnJvbUFycmF5KCBqc29uLnYyICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IExpbmVDdXJ2ZTMgfTtcclxuIiwiaW1wb3J0IHsgQ3VydmUgfSBmcm9tICcuLi9jb3JlL0N1cnZlLmpzJztcclxuaW1wb3J0IHsgUXVhZHJhdGljQmV6aWVyIH0gZnJvbSAnLi4vY29yZS9JbnRlcnBvbGF0aW9ucy5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjIuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgY3VydmUgcmVwcmVzZW50aW5nIGEgMkQgUXVhZHJhdGljIEJlemllciBjdXJ2ZS5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgY3VydmUgPSBuZXcgVEhSRUUuUXVhZHJhdGljQmV6aWVyQ3VydmUoXHJcbiAqIFx0bmV3IFRIUkVFLlZlY3RvcjIoIC0gMTAsIDAgKSxcclxuICogXHRuZXcgVEhSRUUuVmVjdG9yMiggMjAsIDE1ICksXHJcbiAqIFx0bmV3IFRIUkVFLlZlY3RvcjIoIDEwLCAwIClcclxuICogKVxyXG4gKlxyXG4gKiBjb25zdCBwb2ludHMgPSBjdXJ2ZS5nZXRQb2ludHMoIDUwICk7XHJcbiAqIGNvbnN0IGdlb21ldHJ5ID0gbmV3IFRIUkVFLkJ1ZmZlckdlb21ldHJ5KCkuc2V0RnJvbVBvaW50cyggcG9pbnRzICk7XHJcbiAqXHJcbiAqIGNvbnN0IG1hdGVyaWFsID0gbmV3IFRIUkVFLkxpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiAweGZmMDAwMCB9ICk7XHJcbiAqXHJcbiAqIC8vIENyZWF0ZSB0aGUgZmluYWwgb2JqZWN0IHRvIGFkZCB0byB0aGUgc2NlbmVcclxuICogY29uc3QgY3VydmVPYmplY3QgPSBuZXcgVEhSRUUuTGluZSggZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQ3VydmVcclxuICovXHJcbmNsYXNzIFF1YWRyYXRpY0JlemllckN1cnZlIGV4dGVuZHMgQ3VydmUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IFF1YWRyYXRpYyBCZXppZXIgY3VydmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IFt2MF0gLSBUaGUgc3RhcnQgcG9pbnQuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSBbdjFdIC0gVGhlIGNvbnRyb2wgcG9pbnQuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSBbdjJdIC0gVGhlIGVuZCBwb2ludC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggdjAgPSBuZXcgVmVjdG9yMigpLCB2MSA9IG5ldyBWZWN0b3IyKCksIHYyID0gbmV3IFZlY3RvcjIoKSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1F1YWRyYXRpY0JlemllckN1cnZlID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnUXVhZHJhdGljQmV6aWVyQ3VydmUnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHN0YXJ0IHBvaW50LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3IyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnYwID0gdjA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY29udHJvbCBwb2ludC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yMn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52MSA9IHYxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGVuZCBwb2ludC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yMn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52MiA9IHYyO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBwb2ludCBvbiB0aGUgY3VydmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdCAtIEEgaW50ZXJwb2xhdGlvbiBmYWN0b3IgcmVwcmVzZW50aW5nIGEgcG9zaXRpb24gb24gdGhlIGN1cnZlLiBNdXN0IGJlIGluIHRoZSByYW5nZSBgWzAsMV1gLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gW29wdGlvbmFsVGFyZ2V0XSAtIFRoZSBvcHRpb25hbCB0YXJnZXQgdmVjdG9yIHRoZSByZXN1bHQgaXMgd3JpdHRlbiB0by5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBUaGUgcG9zaXRpb24gb24gdGhlIGN1cnZlLlxyXG5cdCAqL1xyXG5cdGdldFBvaW50KCB0LCBvcHRpb25hbFRhcmdldCA9IG5ldyBWZWN0b3IyKCkgKSB7XHJcblxyXG5cdFx0Y29uc3QgcG9pbnQgPSBvcHRpb25hbFRhcmdldDtcclxuXHJcblx0XHRjb25zdCB2MCA9IHRoaXMudjAsIHYxID0gdGhpcy52MSwgdjIgPSB0aGlzLnYyO1xyXG5cclxuXHRcdHBvaW50LnNldChcclxuXHRcdFx0UXVhZHJhdGljQmV6aWVyKCB0LCB2MC54LCB2MS54LCB2Mi54ICksXHJcblx0XHRcdFF1YWRyYXRpY0JlemllciggdCwgdjAueSwgdjEueSwgdjIueSApXHJcblx0XHQpO1xyXG5cclxuXHRcdHJldHVybiBwb2ludDtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy52MC5jb3B5KCBzb3VyY2UudjAgKTtcclxuXHRcdHRoaXMudjEuY29weSggc291cmNlLnYxICk7XHJcblx0XHR0aGlzLnYyLmNvcHkoIHNvdXJjZS52MiApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdHRvSlNPTigpIHtcclxuXHJcblx0XHRjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCk7XHJcblxyXG5cdFx0ZGF0YS52MCA9IHRoaXMudjAudG9BcnJheSgpO1xyXG5cdFx0ZGF0YS52MSA9IHRoaXMudjEudG9BcnJheSgpO1xyXG5cdFx0ZGF0YS52MiA9IHRoaXMudjIudG9BcnJheSgpO1xyXG5cclxuXHRcdHJldHVybiBkYXRhO1xyXG5cclxuXHR9XHJcblxyXG5cdGZyb21KU09OKCBqc29uICkge1xyXG5cclxuXHRcdHN1cGVyLmZyb21KU09OKCBqc29uICk7XHJcblxyXG5cdFx0dGhpcy52MC5mcm9tQXJyYXkoIGpzb24udjAgKTtcclxuXHRcdHRoaXMudjEuZnJvbUFycmF5KCBqc29uLnYxICk7XHJcblx0XHR0aGlzLnYyLmZyb21BcnJheSgganNvbi52MiApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBRdWFkcmF0aWNCZXppZXJDdXJ2ZSB9O1xyXG4iLCJpbXBvcnQgeyBDdXJ2ZSB9IGZyb20gJy4uL2NvcmUvQ3VydmUuanMnO1xyXG5pbXBvcnQgeyBRdWFkcmF0aWNCZXppZXIgfSBmcm9tICcuLi9jb3JlL0ludGVycG9sYXRpb25zLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcblxyXG4vKipcclxuICogQSBjdXJ2ZSByZXByZXNlbnRpbmcgYSAzRCBRdWFkcmF0aWMgQmV6aWVyIGN1cnZlLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQ3VydmVcclxuICovXHJcbmNsYXNzIFF1YWRyYXRpY0JlemllckN1cnZlMyBleHRlbmRzIEN1cnZlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBRdWFkcmF0aWMgQmV6aWVyIGN1cnZlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBbdjBdIC0gVGhlIHN0YXJ0IHBvaW50LlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gW3YxXSAtIFRoZSBjb250cm9sIHBvaW50LlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gW3YyXSAtIFRoZSBlbmQgcG9pbnQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHYwID0gbmV3IFZlY3RvcjMoKSwgdjEgPSBuZXcgVmVjdG9yMygpLCB2MiA9IG5ldyBWZWN0b3IzKCkgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNRdWFkcmF0aWNCZXppZXJDdXJ2ZTMgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdRdWFkcmF0aWNCZXppZXJDdXJ2ZTMnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHN0YXJ0IHBvaW50LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3IzfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnYwID0gdjA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY29udHJvbCBwb2ludC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yM31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52MSA9IHYxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGVuZCBwb2ludC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yM31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52MiA9IHYyO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBwb2ludCBvbiB0aGUgY3VydmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdCAtIEEgaW50ZXJwb2xhdGlvbiBmYWN0b3IgcmVwcmVzZW50aW5nIGEgcG9zaXRpb24gb24gdGhlIGN1cnZlLiBNdXN0IGJlIGluIHRoZSByYW5nZSBgWzAsMV1gLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gW29wdGlvbmFsVGFyZ2V0XSAtIFRoZSBvcHRpb25hbCB0YXJnZXQgdmVjdG9yIHRoZSByZXN1bHQgaXMgd3JpdHRlbiB0by5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBUaGUgcG9zaXRpb24gb24gdGhlIGN1cnZlLlxyXG5cdCAqL1xyXG5cdGdldFBvaW50KCB0LCBvcHRpb25hbFRhcmdldCA9IG5ldyBWZWN0b3IzKCkgKSB7XHJcblxyXG5cdFx0Y29uc3QgcG9pbnQgPSBvcHRpb25hbFRhcmdldDtcclxuXHJcblx0XHRjb25zdCB2MCA9IHRoaXMudjAsIHYxID0gdGhpcy52MSwgdjIgPSB0aGlzLnYyO1xyXG5cclxuXHRcdHBvaW50LnNldChcclxuXHRcdFx0UXVhZHJhdGljQmV6aWVyKCB0LCB2MC54LCB2MS54LCB2Mi54ICksXHJcblx0XHRcdFF1YWRyYXRpY0JlemllciggdCwgdjAueSwgdjEueSwgdjIueSApLFxyXG5cdFx0XHRRdWFkcmF0aWNCZXppZXIoIHQsIHYwLnosIHYxLnosIHYyLnogKVxyXG5cdFx0KTtcclxuXHJcblx0XHRyZXR1cm4gcG9pbnQ7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMudjAuY29weSggc291cmNlLnYwICk7XHJcblx0XHR0aGlzLnYxLmNvcHkoIHNvdXJjZS52MSApO1xyXG5cdFx0dGhpcy52Mi5jb3B5KCBzb3VyY2UudjIgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHR0b0pTT04oKSB7XHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IHN1cGVyLnRvSlNPTigpO1xyXG5cclxuXHRcdGRhdGEudjAgPSB0aGlzLnYwLnRvQXJyYXkoKTtcclxuXHRcdGRhdGEudjEgPSB0aGlzLnYxLnRvQXJyYXkoKTtcclxuXHRcdGRhdGEudjIgPSB0aGlzLnYyLnRvQXJyYXkoKTtcclxuXHJcblx0XHRyZXR1cm4gZGF0YTtcclxuXHJcblx0fVxyXG5cclxuXHRmcm9tSlNPTigganNvbiApIHtcclxuXHJcblx0XHRzdXBlci5mcm9tSlNPTigganNvbiApO1xyXG5cclxuXHRcdHRoaXMudjAuZnJvbUFycmF5KCBqc29uLnYwICk7XHJcblx0XHR0aGlzLnYxLmZyb21BcnJheSgganNvbi52MSApO1xyXG5cdFx0dGhpcy52Mi5mcm9tQXJyYXkoIGpzb24udjIgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgUXVhZHJhdGljQmV6aWVyQ3VydmUzIH07XHJcbiIsImltcG9ydCB7IEN1cnZlIH0gZnJvbSAnLi4vY29yZS9DdXJ2ZS5qcyc7XHJcbmltcG9ydCB7IENhdG11bGxSb20gfSBmcm9tICcuLi9jb3JlL0ludGVycG9sYXRpb25zLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMi5qcyc7XHJcblxyXG4vKipcclxuICogQSBjdXJ2ZSByZXByZXNlbnRpbmcgYSAyRCBzcGxpbmUgY3VydmUuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIC8vIENyZWF0ZSBhIHNpbmUtbGlrZSB3YXZlXHJcbiAqIGNvbnN0IGN1cnZlID0gbmV3IFRIUkVFLlNwbGluZUN1cnZlKCBbXHJcbiAqIFx0bmV3IFRIUkVFLlZlY3RvcjIoIC0xMCwgMCApLFxyXG4gKiBcdG5ldyBUSFJFRS5WZWN0b3IyKCAtNSwgNSApLFxyXG4gKiBcdG5ldyBUSFJFRS5WZWN0b3IyKCAwLCAwICksXHJcbiAqIFx0bmV3IFRIUkVFLlZlY3RvcjIoIDUsIC01ICksXHJcbiAqIFx0bmV3IFRIUkVFLlZlY3RvcjIoIDEwLCAwIClcclxuICogXSApO1xyXG4gKlxyXG4gKiBjb25zdCBwb2ludHMgPSBjdXJ2ZS5nZXRQb2ludHMoIDUwICk7XHJcbiAqIGNvbnN0IGdlb21ldHJ5ID0gbmV3IFRIUkVFLkJ1ZmZlckdlb21ldHJ5KCkuc2V0RnJvbVBvaW50cyggcG9pbnRzICk7XHJcbiAqXHJcbiAqIGNvbnN0IG1hdGVyaWFsID0gbmV3IFRIUkVFLkxpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiAweGZmMDAwMCB9ICk7XHJcbiAqXHJcbiAqIC8vIENyZWF0ZSB0aGUgZmluYWwgb2JqZWN0IHRvIGFkZCB0byB0aGUgc2NlbmVcclxuICogY29uc3Qgc3BsaW5lT2JqZWN0ID0gbmV3IFRIUkVFLkxpbmUoIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIEN1cnZlXHJcbiAqL1xyXG5jbGFzcyBTcGxpbmVDdXJ2ZSBleHRlbmRzIEN1cnZlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyAyRCBzcGxpbmUgY3VydmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PFZlY3RvcjI+fSBbcG9pbnRzXSAtICBBbiBhcnJheSBvZiAyRCBwb2ludHMgZGVmaW5pbmcgdGhlIGN1cnZlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwb2ludHMgPSBbXSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1NwbGluZUN1cnZlID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnU3BsaW5lQ3VydmUnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQW4gYXJyYXkgb2YgMkQgcG9pbnRzIGRlZmluaW5nIHRoZSBjdXJ2ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8VmVjdG9yMj59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucG9pbnRzID0gcG9pbnRzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBwb2ludCBvbiB0aGUgY3VydmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdCAtIEEgaW50ZXJwb2xhdGlvbiBmYWN0b3IgcmVwcmVzZW50aW5nIGEgcG9zaXRpb24gb24gdGhlIGN1cnZlLiBNdXN0IGJlIGluIHRoZSByYW5nZSBgWzAsMV1gLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gW29wdGlvbmFsVGFyZ2V0XSAtIFRoZSBvcHRpb25hbCB0YXJnZXQgdmVjdG9yIHRoZSByZXN1bHQgaXMgd3JpdHRlbiB0by5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBUaGUgcG9zaXRpb24gb24gdGhlIGN1cnZlLlxyXG5cdCAqL1xyXG5cdGdldFBvaW50KCB0LCBvcHRpb25hbFRhcmdldCA9IG5ldyBWZWN0b3IyKCkgKSB7XHJcblxyXG5cdFx0Y29uc3QgcG9pbnQgPSBvcHRpb25hbFRhcmdldDtcclxuXHJcblx0XHRjb25zdCBwb2ludHMgPSB0aGlzLnBvaW50cztcclxuXHRcdGNvbnN0IHAgPSAoIHBvaW50cy5sZW5ndGggLSAxICkgKiB0O1xyXG5cclxuXHRcdGNvbnN0IGludFBvaW50ID0gTWF0aC5mbG9vciggcCApO1xyXG5cdFx0Y29uc3Qgd2VpZ2h0ID0gcCAtIGludFBvaW50O1xyXG5cclxuXHRcdGNvbnN0IHAwID0gcG9pbnRzWyBpbnRQb2ludCA9PT0gMCA/IGludFBvaW50IDogaW50UG9pbnQgLSAxIF07XHJcblx0XHRjb25zdCBwMSA9IHBvaW50c1sgaW50UG9pbnQgXTtcclxuXHRcdGNvbnN0IHAyID0gcG9pbnRzWyBpbnRQb2ludCA+IHBvaW50cy5sZW5ndGggLSAyID8gcG9pbnRzLmxlbmd0aCAtIDEgOiBpbnRQb2ludCArIDEgXTtcclxuXHRcdGNvbnN0IHAzID0gcG9pbnRzWyBpbnRQb2ludCA+IHBvaW50cy5sZW5ndGggLSAzID8gcG9pbnRzLmxlbmd0aCAtIDEgOiBpbnRQb2ludCArIDIgXTtcclxuXHJcblx0XHRwb2ludC5zZXQoXHJcblx0XHRcdENhdG11bGxSb20oIHdlaWdodCwgcDAueCwgcDEueCwgcDIueCwgcDMueCApLFxyXG5cdFx0XHRDYXRtdWxsUm9tKCB3ZWlnaHQsIHAwLnksIHAxLnksIHAyLnksIHAzLnkgKVxyXG5cdFx0KTtcclxuXHJcblx0XHRyZXR1cm4gcG9pbnQ7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMucG9pbnRzID0gW107XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gc291cmNlLnBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgcG9pbnQgPSBzb3VyY2UucG9pbnRzWyBpIF07XHJcblxyXG5cdFx0XHR0aGlzLnBvaW50cy5wdXNoKCBwb2ludC5jbG9uZSgpICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdHRvSlNPTigpIHtcclxuXHJcblx0XHRjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCk7XHJcblxyXG5cdFx0ZGF0YS5wb2ludHMgPSBbXTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSB0aGlzLnBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgcG9pbnQgPSB0aGlzLnBvaW50c1sgaSBdO1xyXG5cdFx0XHRkYXRhLnBvaW50cy5wdXNoKCBwb2ludC50b0FycmF5KCkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGRhdGE7XHJcblxyXG5cdH1cclxuXHJcblx0ZnJvbUpTT04oIGpzb24gKSB7XHJcblxyXG5cdFx0c3VwZXIuZnJvbUpTT04oIGpzb24gKTtcclxuXHJcblx0XHR0aGlzLnBvaW50cyA9IFtdO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGpzb24ucG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBwb2ludCA9IGpzb24ucG9pbnRzWyBpIF07XHJcblx0XHRcdHRoaXMucG9pbnRzLnB1c2goIG5ldyBWZWN0b3IyKCkuZnJvbUFycmF5KCBwb2ludCApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBTcGxpbmVDdXJ2ZSB9O1xyXG4iLCJpbXBvcnQgeyBDdXJ2ZSB9IGZyb20gJy4vQ3VydmUuanMnO1xyXG5pbXBvcnQgKiBhcyBDdXJ2ZXMgZnJvbSAnLi4vY3VydmVzL0N1cnZlcy5qcyc7XHJcblxyXG4vKipcclxuICogQSBiYXNlIGNsYXNzIGV4dGVuZGluZyB7QGxpbmsgQ3VydmV9LiBgQ3VydmVQYXRoYCBpcyBzaW1wbHkgYW5cclxuICogYXJyYXkgb2YgY29ubmVjdGVkIGN1cnZlcywgYnV0IHJldGFpbnMgdGhlIEFQSSBvZiBhIGN1cnZlLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQ3VydmVcclxuICovXHJcbmNsYXNzIEN1cnZlUGF0aCBleHRlbmRzIEN1cnZlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBjdXJ2ZSBwYXRoLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ0N1cnZlUGF0aCc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBhcnJheSBvZiBjdXJ2ZXMgZGVmaW5pbmcgdGhlXHJcblx0XHQgKiBwYXRoLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxDdXJ2ZT59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY3VydmVzID0gW107XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSBwYXRoIHNob3VsZCBhdXRvbWF0aWNhbGx5IGJlIGNsb3NlZFxyXG5cdFx0ICogYnkgYSBsaW5lIGN1cnZlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hdXRvQ2xvc2UgPSBmYWxzZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIGEgY3VydmUgdG8gdGhpcyBjdXJ2ZSBwYXRoLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtDdXJ2ZX0gY3VydmUgLSBUaGUgY3VydmUgdG8gYWRkLlxyXG5cdCAqL1xyXG5cdGFkZCggY3VydmUgKSB7XHJcblxyXG5cdFx0dGhpcy5jdXJ2ZXMucHVzaCggY3VydmUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIGEgbGluZSBjdXJ2ZSB0byBjbG9zZSB0aGUgcGF0aC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0N1cnZlUGF0aH0gQSByZWZlcmVuY2UgdG8gdGhpcyBjdXJ2ZSBwYXRoLlxyXG5cdCAqL1xyXG5cdGNsb3NlUGF0aCgpIHtcclxuXHJcblx0XHQvLyBBZGQgYSBsaW5lIGN1cnZlIGlmIHN0YXJ0IGFuZCBlbmQgb2YgbGluZXMgYXJlIG5vdCBjb25uZWN0ZWRcclxuXHRcdGNvbnN0IHN0YXJ0UG9pbnQgPSB0aGlzLmN1cnZlc1sgMCBdLmdldFBvaW50KCAwICk7XHJcblx0XHRjb25zdCBlbmRQb2ludCA9IHRoaXMuY3VydmVzWyB0aGlzLmN1cnZlcy5sZW5ndGggLSAxIF0uZ2V0UG9pbnQoIDEgKTtcclxuXHJcblx0XHRpZiAoICEgc3RhcnRQb2ludC5lcXVhbHMoIGVuZFBvaW50ICkgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBsaW5lVHlwZSA9ICggc3RhcnRQb2ludC5pc1ZlY3RvcjIgPT09IHRydWUgKSA/ICdMaW5lQ3VydmUnIDogJ0xpbmVDdXJ2ZTMnO1xyXG5cdFx0XHR0aGlzLmN1cnZlcy5wdXNoKCBuZXcgQ3VydmVzWyBsaW5lVHlwZSBdKCBlbmRQb2ludCwgc3RhcnRQb2ludCApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSB2ZWN0b3IgaW4gMkQgb3IgM0Qgc3BhY2UgKGRlcGVuZGluZyBvbiB0aGUgY3VydmUgZGVmaW5pdGlvbnMpXHJcblx0ICogZm9yIHRoZSBnaXZlbiBpbnRlcnBvbGF0aW9uIGZhY3Rvci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0IC0gQSBpbnRlcnBvbGF0aW9uIGZhY3RvciByZXByZXNlbnRpbmcgYSBwb3NpdGlvbiBvbiB0aGUgY3VydmUuIE11c3QgYmUgaW4gdGhlIHJhbmdlIGBbMCwxXWAuXHJcblx0ICogQHBhcmFtIHsoVmVjdG9yMnxWZWN0b3IzKX0gW29wdGlvbmFsVGFyZ2V0XSAtIFRoZSBvcHRpb25hbCB0YXJnZXQgdmVjdG9yIHRoZSByZXN1bHQgaXMgd3JpdHRlbiB0by5cclxuXHQgKiBAcmV0dXJuIHs/KFZlY3RvcjJ8VmVjdG9yMyl9IFRoZSBwb3NpdGlvbiBvbiB0aGUgY3VydmUuIEl0IGNhbiBiZSBhIDJEIG9yIDNEIHZlY3RvciBkZXBlbmRpbmcgb24gdGhlIGN1cnZlIGRlZmluaXRpb24uXHJcblx0ICovXHJcblx0Z2V0UG9pbnQoIHQsIG9wdGlvbmFsVGFyZ2V0ICkge1xyXG5cclxuXHRcdC8vIFRvIGdldCBhY2N1cmF0ZSBwb2ludCB3aXRoIHJlZmVyZW5jZSB0b1xyXG5cdFx0Ly8gZW50aXJlIHBhdGggZGlzdGFuY2UgYXQgdGltZSB0LFxyXG5cdFx0Ly8gZm9sbG93aW5nIGhhcyB0byBiZSBkb25lOlxyXG5cclxuXHRcdC8vIDEuIExlbmd0aCBvZiBlYWNoIHN1YiBwYXRoIGhhdmUgdG8gYmUga25vd25cclxuXHRcdC8vIDIuIExvY2F0ZSBhbmQgaWRlbnRpZnkgdHlwZSBvZiBjdXJ2ZVxyXG5cdFx0Ly8gMy4gR2V0IHQgZm9yIHRoZSBjdXJ2ZVxyXG5cdFx0Ly8gNC4gUmV0dXJuIGN1cnZlLmdldFBvaW50QXQodCcpXHJcblxyXG5cdFx0Y29uc3QgZCA9IHQgKiB0aGlzLmdldExlbmd0aCgpO1xyXG5cdFx0Y29uc3QgY3VydmVMZW5ndGhzID0gdGhpcy5nZXRDdXJ2ZUxlbmd0aHMoKTtcclxuXHRcdGxldCBpID0gMDtcclxuXHJcblx0XHQvLyBUbyB0aGluayBhYm91dCBib3VuZGFyaWVzIHBvaW50cy5cclxuXHJcblx0XHR3aGlsZSAoIGkgPCBjdXJ2ZUxlbmd0aHMubGVuZ3RoICkge1xyXG5cclxuXHRcdFx0aWYgKCBjdXJ2ZUxlbmd0aHNbIGkgXSA+PSBkICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBkaWZmID0gY3VydmVMZW5ndGhzWyBpIF0gLSBkO1xyXG5cdFx0XHRcdGNvbnN0IGN1cnZlID0gdGhpcy5jdXJ2ZXNbIGkgXTtcclxuXHJcblx0XHRcdFx0Y29uc3Qgc2VnbWVudExlbmd0aCA9IGN1cnZlLmdldExlbmd0aCgpO1xyXG5cdFx0XHRcdGNvbnN0IHUgPSBzZWdtZW50TGVuZ3RoID09PSAwID8gMCA6IDEgLSBkaWZmIC8gc2VnbWVudExlbmd0aDtcclxuXHJcblx0XHRcdFx0cmV0dXJuIGN1cnZlLmdldFBvaW50QXQoIHUsIG9wdGlvbmFsVGFyZ2V0ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpICsrO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHJcblx0XHQvLyBsb29wIHdoZXJlIHN1bSAhPSAwLCBzdW0gPiBkICwgc3VtKzEgPGRcclxuXHJcblx0fVxyXG5cclxuXHRnZXRMZW5ndGgoKSB7XHJcblxyXG5cdFx0Ly8gV2UgY2Fubm90IHVzZSB0aGUgZGVmYXVsdCBUSFJFRS5DdXJ2ZSBnZXRQb2ludCgpIHdpdGggZ2V0TGVuZ3RoKCkgYmVjYXVzZSBpblxyXG5cdFx0Ly8gVEhSRUUuQ3VydmUsIGdldExlbmd0aCgpIGRlcGVuZHMgb24gZ2V0UG9pbnQoKSBidXQgaW4gVEhSRUUuQ3VydmVQYXRoXHJcblx0XHQvLyBnZXRQb2ludCgpIGRlcGVuZHMgb24gZ2V0TGVuZ3RoXHJcblxyXG5cdFx0Y29uc3QgbGVucyA9IHRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7XHJcblx0XHRyZXR1cm4gbGVuc1sgbGVucy5sZW5ndGggLSAxIF07XHJcblxyXG5cdH1cclxuXHJcblx0dXBkYXRlQXJjTGVuZ3RocygpIHtcclxuXHJcblx0XHQvLyBjYWNoZUxlbmd0aHMgbXVzdCBiZSByZWNhbGN1bGF0ZWQuXHJcblxyXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblx0XHR0aGlzLmNhY2hlTGVuZ3RocyA9IG51bGw7XHJcblx0XHR0aGlzLmdldEN1cnZlTGVuZ3RocygpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgbGlzdCBvZiBjdW11bGF0aXZlIGN1cnZlIGxlbmd0aHMgb2YgdGhlIGRlZmluZWQgY3VydmVzLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7QXJyYXk8bnVtYmVyPn0gVGhlIGN1cnZlIGxlbmd0aHMuXHJcblx0ICovXHJcblx0Z2V0Q3VydmVMZW5ndGhzKCkge1xyXG5cclxuXHRcdC8vIENvbXB1dGUgbGVuZ3RocyBhbmQgY2FjaGUgdGhlbVxyXG5cdFx0Ly8gV2UgY2Fubm90IG92ZXJ3cml0ZSBnZXRMZW5ndGhzKCkgYmVjYXVzZSBVdG9UIG1hcHBpbmcgdXNlcyBpdC5cclxuXHRcdC8vIFdlIHVzZSBjYWNoZSB2YWx1ZXMgaWYgY3VydmVzIGFuZCBjYWNoZSBhcnJheSBhcmUgc2FtZSBsZW5ndGhcclxuXHJcblx0XHRpZiAoIHRoaXMuY2FjaGVMZW5ndGhzICYmIHRoaXMuY2FjaGVMZW5ndGhzLmxlbmd0aCA9PT0gdGhpcy5jdXJ2ZXMubGVuZ3RoICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIHRoaXMuY2FjaGVMZW5ndGhzO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBHZXQgbGVuZ3RoIG9mIHN1Yi1jdXJ2ZVxyXG5cdFx0Ly8gUHVzaCBzdW1zIGludG8gY2FjaGVkIGFycmF5XHJcblxyXG5cdFx0Y29uc3QgbGVuZ3RocyA9IFtdO1xyXG5cdFx0bGV0IHN1bXMgPSAwO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHRoaXMuY3VydmVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRzdW1zICs9IHRoaXMuY3VydmVzWyBpIF0uZ2V0TGVuZ3RoKCk7XHJcblx0XHRcdGxlbmd0aHMucHVzaCggc3VtcyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmNhY2hlTGVuZ3RocyA9IGxlbmd0aHM7XHJcblxyXG5cdFx0cmV0dXJuIGxlbmd0aHM7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0U3BhY2VkUG9pbnRzKCBkaXZpc2lvbnMgPSA0MCApIHtcclxuXHJcblx0XHRjb25zdCBwb2ludHMgPSBbXTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPD0gZGl2aXNpb25zOyBpICsrICkge1xyXG5cclxuXHRcdFx0cG9pbnRzLnB1c2goIHRoaXMuZ2V0UG9pbnQoIGkgLyBkaXZpc2lvbnMgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMuYXV0b0Nsb3NlICkge1xyXG5cclxuXHRcdFx0cG9pbnRzLnB1c2goIHBvaW50c1sgMCBdICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBwb2ludHM7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0UG9pbnRzKCBkaXZpc2lvbnMgPSAxMiApIHtcclxuXHJcblx0XHRjb25zdCBwb2ludHMgPSBbXTtcclxuXHRcdGxldCBsYXN0O1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgY3VydmVzID0gdGhpcy5jdXJ2ZXM7IGkgPCBjdXJ2ZXMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgY3VydmUgPSBjdXJ2ZXNbIGkgXTtcclxuXHRcdFx0Y29uc3QgcmVzb2x1dGlvbiA9IGN1cnZlLmlzRWxsaXBzZUN1cnZlID8gZGl2aXNpb25zICogMlxyXG5cdFx0XHRcdDogKCBjdXJ2ZS5pc0xpbmVDdXJ2ZSB8fCBjdXJ2ZS5pc0xpbmVDdXJ2ZTMgKSA/IDFcclxuXHRcdFx0XHRcdDogY3VydmUuaXNTcGxpbmVDdXJ2ZSA/IGRpdmlzaW9ucyAqIGN1cnZlLnBvaW50cy5sZW5ndGhcclxuXHRcdFx0XHRcdFx0OiBkaXZpc2lvbnM7XHJcblxyXG5cdFx0XHRjb25zdCBwdHMgPSBjdXJ2ZS5nZXRQb2ludHMoIHJlc29sdXRpb24gKTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBqID0gMDsgaiA8IHB0cy5sZW5ndGg7IGogKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHBvaW50ID0gcHRzWyBqIF07XHJcblxyXG5cdFx0XHRcdGlmICggbGFzdCAmJiBsYXN0LmVxdWFscyggcG9pbnQgKSApIGNvbnRpbnVlOyAvLyBlbnN1cmVzIG5vIGNvbnNlY3V0aXZlIHBvaW50cyBhcmUgZHVwbGljYXRlc1xyXG5cclxuXHRcdFx0XHRwb2ludHMucHVzaCggcG9pbnQgKTtcclxuXHRcdFx0XHRsYXN0ID0gcG9pbnQ7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy5hdXRvQ2xvc2UgJiYgcG9pbnRzLmxlbmd0aCA+IDEgJiYgISBwb2ludHNbIHBvaW50cy5sZW5ndGggLSAxIF0uZXF1YWxzKCBwb2ludHNbIDAgXSApICkge1xyXG5cclxuXHRcdFx0cG9pbnRzLnB1c2goIHBvaW50c1sgMCBdICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBwb2ludHM7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMuY3VydmVzID0gW107XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gc291cmNlLmN1cnZlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgY3VydmUgPSBzb3VyY2UuY3VydmVzWyBpIF07XHJcblxyXG5cdFx0XHR0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZS5jbG9uZSgpICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuYXV0b0Nsb3NlID0gc291cmNlLmF1dG9DbG9zZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHR0b0pTT04oKSB7XHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IHN1cGVyLnRvSlNPTigpO1xyXG5cclxuXHRcdGRhdGEuYXV0b0Nsb3NlID0gdGhpcy5hdXRvQ2xvc2U7XHJcblx0XHRkYXRhLmN1cnZlcyA9IFtdO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHRoaXMuY3VydmVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBjdXJ2ZSA9IHRoaXMuY3VydmVzWyBpIF07XHJcblx0XHRcdGRhdGEuY3VydmVzLnB1c2goIGN1cnZlLnRvSlNPTigpICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBkYXRhO1xyXG5cclxuXHR9XHJcblxyXG5cdGZyb21KU09OKCBqc29uICkge1xyXG5cclxuXHRcdHN1cGVyLmZyb21KU09OKCBqc29uICk7XHJcblxyXG5cdFx0dGhpcy5hdXRvQ2xvc2UgPSBqc29uLmF1dG9DbG9zZTtcclxuXHRcdHRoaXMuY3VydmVzID0gW107XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0ganNvbi5jdXJ2ZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGN1cnZlID0ganNvbi5jdXJ2ZXNbIGkgXTtcclxuXHRcdFx0dGhpcy5jdXJ2ZXMucHVzaCggbmV3IEN1cnZlc1sgY3VydmUudHlwZSBdKCkuZnJvbUpTT04oIGN1cnZlICkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBDdXJ2ZVBhdGggfTtcclxuIiwiaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMi5qcyc7XHJcbmltcG9ydCB7IEN1cnZlUGF0aCB9IGZyb20gJy4vQ3VydmVQYXRoLmpzJztcclxuaW1wb3J0IHsgRWxsaXBzZUN1cnZlIH0gZnJvbSAnLi4vY3VydmVzL0VsbGlwc2VDdXJ2ZS5qcyc7XHJcbmltcG9ydCB7IFNwbGluZUN1cnZlIH0gZnJvbSAnLi4vY3VydmVzL1NwbGluZUN1cnZlLmpzJztcclxuaW1wb3J0IHsgQ3ViaWNCZXppZXJDdXJ2ZSB9IGZyb20gJy4uL2N1cnZlcy9DdWJpY0JlemllckN1cnZlLmpzJztcclxuaW1wb3J0IHsgUXVhZHJhdGljQmV6aWVyQ3VydmUgfSBmcm9tICcuLi9jdXJ2ZXMvUXVhZHJhdGljQmV6aWVyQ3VydmUuanMnO1xyXG5pbXBvcnQgeyBMaW5lQ3VydmUgfSBmcm9tICcuLi9jdXJ2ZXMvTGluZUN1cnZlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIDJEIHBhdGggcmVwcmVzZW50YXRpb24uIFRoZSBjbGFzcyBwcm92aWRlcyBtZXRob2RzIGZvciBjcmVhdGluZyBwYXRoc1xyXG4gKiBhbmQgY29udG91cnMgb2YgMkQgc2hhcGVzIHNpbWlsYXIgdG8gdGhlIDJEIENhbnZhcyBBUEkuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IHBhdGggPSBuZXcgVEhSRUUuUGF0aCgpO1xyXG4gKlxyXG4gKiBwYXRoLmxpbmVUbyggMCwgMC44ICk7XHJcbiAqIHBhdGgucXVhZHJhdGljQ3VydmVUbyggMCwgMSwgMC4yLCAxICk7XHJcbiAqIHBhdGgubGluZVRvKCAxLCAxICk7XHJcbiAqXHJcbiAqIGNvbnN0IHBvaW50cyA9IHBhdGguZ2V0UG9pbnRzKCk7XHJcbiAqXHJcbiAqIGNvbnN0IGdlb21ldHJ5ID0gbmV3IFRIUkVFLkJ1ZmZlckdlb21ldHJ5KCkuc2V0RnJvbVBvaW50cyggcG9pbnRzICk7XHJcbiAqIGNvbnN0IG1hdGVyaWFsID0gbmV3IFRIUkVFLkxpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiAweGZmZmZmZiB9ICk7XHJcbiAqXHJcbiAqIGNvbnN0IGxpbmUgPSBuZXcgVEhSRUUuTGluZSggZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcbiAqIHNjZW5lLmFkZCggbGluZSApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIEN1cnZlUGF0aFxyXG4gKi9cclxuY2xhc3MgUGF0aCBleHRlbmRzIEN1cnZlUGF0aCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcGF0aC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8VmVjdG9yMj59IFtwb2ludHNdIC0gQW4gYXJyYXkgb2YgMkQgcG9pbnRzIGRlZmluaW5nIHRoZSBwYXRoLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwb2ludHMgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnUGF0aCc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY3VycmVudCBvZmZzZXQgb2YgdGhlIHBhdGguIEFueSBuZXcgY3VydmUgYWRkZWQgd2lsbCBzdGFydCBoZXJlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3IyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmN1cnJlbnRQb2ludCA9IG5ldyBWZWN0b3IyKCk7XHJcblxyXG5cdFx0aWYgKCBwb2ludHMgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnNldEZyb21Qb2ludHMoIHBvaW50cyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGEgcGF0aCBmcm9tIHRoZSBnaXZlbiBsaXN0IG9mIHBvaW50cy4gVGhlIHBvaW50cyBhcmUgYWRkZWRcclxuXHQgKiB0byB0aGUgcGF0aCBhcyBpbnN0YW5jZXMgb2Yge0BsaW5rIExpbmVDdXJ2ZX0uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PFZlY3RvcjI+fSBwb2ludHMgLSBBbiBhcnJheSBvZiAyRCBwb2ludHMuXHJcblx0ICogQHJldHVybiB7UGF0aH0gQSByZWZlcmVuY2UgdG8gdGhpcyBwYXRoLlxyXG5cdCAqL1xyXG5cdHNldEZyb21Qb2ludHMoIHBvaW50cyApIHtcclxuXHJcblx0XHR0aGlzLm1vdmVUbyggcG9pbnRzWyAwIF0ueCwgcG9pbnRzWyAwIF0ueSApO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMSwgbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0dGhpcy5saW5lVG8oIHBvaW50c1sgaSBdLngsIHBvaW50c1sgaSBdLnkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTW92ZXMge0BsaW5rIFBhdGgjY3VycmVudFBvaW50fSB0byB0aGUgZ2l2ZW4gcG9pbnQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB4IGNvb3JkaW5hdGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgeSBjb29yZGluYXRlLlxyXG5cdCAqIEByZXR1cm4ge1BhdGh9IEEgcmVmZXJlbmNlIHRvIHRoaXMgcGF0aC5cclxuXHQgKi9cclxuXHRtb3ZlVG8oIHgsIHkgKSB7XHJcblxyXG5cdFx0dGhpcy5jdXJyZW50UG9pbnQuc2V0KCB4LCB5ICk7IC8vIFRPRE8gY29uc2lkZXIgcmVmZXJlbmNpbmcgdmVjdG9ycyBpbnN0ZWFkIG9mIGNvcHlpbmc/XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgTGluZUN1cnZlfSB0byB0aGUgcGF0aCBieSBjb25uZWN0aW5nXHJcblx0ICogdGhlIGN1cnJlbnQgcG9pbnQgd2l0aCB0aGUgZ2l2ZW4gb25lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuXHJcblx0ICogQHJldHVybiB7UGF0aH0gQSByZWZlcmVuY2UgdG8gdGhpcyBwYXRoLlxyXG5cdCAqL1xyXG5cdGxpbmVUbyggeCwgeSApIHtcclxuXHJcblx0XHRjb25zdCBjdXJ2ZSA9IG5ldyBMaW5lQ3VydmUoIHRoaXMuY3VycmVudFBvaW50LmNsb25lKCksIG5ldyBWZWN0b3IyKCB4LCB5ICkgKTtcclxuXHRcdHRoaXMuY3VydmVzLnB1c2goIGN1cnZlICk7XHJcblxyXG5cdFx0dGhpcy5jdXJyZW50UG9pbnQuc2V0KCB4LCB5ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgUXVhZHJhdGljQmV6aWVyQ3VydmV9IHRvIHRoZSBwYXRoIGJ5IGNvbm5lY3RpbmdcclxuXHQgKiB0aGUgY3VycmVudCBwb2ludCB3aXRoIHRoZSBnaXZlbiBvbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYUNQeCAtIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGNvbnRyb2wgcG9pbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFDUHkgLSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBjb250cm9sIHBvaW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhWCAtIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYVkgLSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuXHJcblx0ICogQHJldHVybiB7UGF0aH0gQSByZWZlcmVuY2UgdG8gdGhpcyBwYXRoLlxyXG5cdCAqL1xyXG5cdHF1YWRyYXRpY0N1cnZlVG8oIGFDUHgsIGFDUHksIGFYLCBhWSApIHtcclxuXHJcblx0XHRjb25zdCBjdXJ2ZSA9IG5ldyBRdWFkcmF0aWNCZXppZXJDdXJ2ZShcclxuXHRcdFx0dGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxcclxuXHRcdFx0bmV3IFZlY3RvcjIoIGFDUHgsIGFDUHkgKSxcclxuXHRcdFx0bmV3IFZlY3RvcjIoIGFYLCBhWSApXHJcblx0XHQpO1xyXG5cclxuXHRcdHRoaXMuY3VydmVzLnB1c2goIGN1cnZlICk7XHJcblxyXG5cdFx0dGhpcy5jdXJyZW50UG9pbnQuc2V0KCBhWCwgYVkgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIGFuIGluc3RhbmNlIG9mIHtAbGluayBDdWJpY0JlemllckN1cnZlfSB0byB0aGUgcGF0aCBieSBjb25uZWN0aW5nXHJcblx0ICogdGhlIGN1cnJlbnQgcG9pbnQgd2l0aCB0aGUgZ2l2ZW4gb25lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFDUDF4IC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYUNQMXkgLSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhQ1AyeCAtIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb250cm9sIHBvaW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhQ1AyeSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb250cm9sIHBvaW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhWCAtIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYVkgLSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuXHJcblx0ICogQHJldHVybiB7UGF0aH0gQSByZWZlcmVuY2UgdG8gdGhpcyBwYXRoLlxyXG5cdCAqL1xyXG5cdGJlemllckN1cnZlVG8oIGFDUDF4LCBhQ1AxeSwgYUNQMngsIGFDUDJ5LCBhWCwgYVkgKSB7XHJcblxyXG5cdFx0Y29uc3QgY3VydmUgPSBuZXcgQ3ViaWNCZXppZXJDdXJ2ZShcclxuXHRcdFx0dGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxcclxuXHRcdFx0bmV3IFZlY3RvcjIoIGFDUDF4LCBhQ1AxeSApLFxyXG5cdFx0XHRuZXcgVmVjdG9yMiggYUNQMngsIGFDUDJ5ICksXHJcblx0XHRcdG5ldyBWZWN0b3IyKCBhWCwgYVkgKVxyXG5cdFx0KTtcclxuXHJcblx0XHR0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZSApO1xyXG5cclxuXHRcdHRoaXMuY3VycmVudFBvaW50LnNldCggYVgsIGFZICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgU3BsaW5lQ3VydmV9IHRvIHRoZSBwYXRoIGJ5IGNvbm5lY3RpbmdcclxuXHQgKiB0aGUgY3VycmVudCBwb2ludCB3aXRoIHRoZSBnaXZlbiBsaXN0IG9mIHBvaW50cy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8VmVjdG9yMj59IHB0cyAtIEFuIGFycmF5IG9mIHBvaW50cyBpbiAyRCBzcGFjZS5cclxuXHQgKiBAcmV0dXJuIHtQYXRofSBBIHJlZmVyZW5jZSB0byB0aGlzIHBhdGguXHJcblx0ICovXHJcblx0c3BsaW5lVGhydSggcHRzICkge1xyXG5cclxuXHRcdGNvbnN0IG5wdHMgPSBbIHRoaXMuY3VycmVudFBvaW50LmNsb25lKCkgXS5jb25jYXQoIHB0cyApO1xyXG5cclxuXHRcdGNvbnN0IGN1cnZlID0gbmV3IFNwbGluZUN1cnZlKCBucHRzICk7XHJcblx0XHR0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZSApO1xyXG5cclxuXHRcdHRoaXMuY3VycmVudFBvaW50LmNvcHkoIHB0c1sgcHRzLmxlbmd0aCAtIDEgXSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgYW4gYXJjIGFzIGFuIGluc3RhbmNlIG9mIHtAbGluayBFbGxpcHNlQ3VydmV9IHRvIHRoZSBwYXRoLCBwb3NpdGlvbmVkIHJlbGF0aXZlXHJcblx0ICogdG8gdGhlIGN1cnJlbnQgcG9pbnQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYVggLSBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBjZW50ZXIgb2YgdGhlIGFyYyBvZmZzZXR0ZWQgZnJvbSB0aGUgcHJldmlvdXMgY3VydmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFZIC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgY2VudGVyIG9mIHRoZSBhcmMgb2Zmc2V0dGVkIGZyb20gdGhlIHByZXZpb3VzIGN1cnZlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhUmFkaXVzIC0gVGhlIHJhZGl1cyBvZiB0aGUgYXJjLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhU3RhcnRBbmdsZSAtIFRoZSBzdGFydCBhbmdsZSBpbiByYWRpYW5zLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhRW5kQW5nbGUgLSBUaGUgZW5kIGFuZ2xlIGluIHJhZGlhbnMuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbYUNsb2Nrd2lzZT1mYWxzZV0gLSBXaGV0aGVyIHRvIHN3ZWVwIHRoZSBhcmMgY2xvY2t3aXNlIG9yIG5vdC5cclxuXHQgKiBAcmV0dXJuIHtQYXRofSBBIHJlZmVyZW5jZSB0byB0aGlzIHBhdGguXHJcblx0ICovXHJcblx0YXJjKCBhWCwgYVksIGFSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UgKSB7XHJcblxyXG5cdFx0Y29uc3QgeDAgPSB0aGlzLmN1cnJlbnRQb2ludC54O1xyXG5cdFx0Y29uc3QgeTAgPSB0aGlzLmN1cnJlbnRQb2ludC55O1xyXG5cclxuXHRcdHRoaXMuYWJzYXJjKCBhWCArIHgwLCBhWSArIHkwLCBhUmFkaXVzLFxyXG5cdFx0XHRhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyBhbiBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgYXJjIGFzIGFuIGluc3RhbmNlIG9mIHtAbGluayBFbGxpcHNlQ3VydmV9IHRvIHRoZSBwYXRoLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFYIC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgY2VudGVyIG9mIHRoZSBhcmMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFZIC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgY2VudGVyIG9mIHRoZSBhcmMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFSYWRpdXMgLSBUaGUgcmFkaXVzIG9mIHRoZSBhcmMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFTdGFydEFuZ2xlIC0gVGhlIHN0YXJ0IGFuZ2xlIGluIHJhZGlhbnMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFFbmRBbmdsZSAtIFRoZSBlbmQgYW5nbGUgaW4gcmFkaWFucy5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFthQ2xvY2t3aXNlPWZhbHNlXSAtIFdoZXRoZXIgdG8gc3dlZXAgdGhlIGFyYyBjbG9ja3dpc2Ugb3Igbm90LlxyXG5cdCAqIEByZXR1cm4ge1BhdGh9IEEgcmVmZXJlbmNlIHRvIHRoaXMgcGF0aC5cclxuXHQgKi9cclxuXHRhYnNhcmMoIGFYLCBhWSwgYVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSApIHtcclxuXHJcblx0XHR0aGlzLmFic2VsbGlwc2UoIGFYLCBhWSwgYVJhZGl1cywgYVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgYW4gZWxsaXBzZSBhcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgRWxsaXBzZUN1cnZlfSB0byB0aGUgcGF0aCwgcG9zaXRpb25lZCByZWxhdGl2ZVxyXG5cdCAqIHRvIHRoZSBjdXJyZW50IHBvaW50XHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYVggLSBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBjZW50ZXIgb2YgdGhlIGVsbGlwc2Ugb2Zmc2V0dGVkIGZyb20gdGhlIHByZXZpb3VzIGN1cnZlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhWSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGNlbnRlciBvZiB0aGUgZWxsaXBzZSBvZmZzZXR0ZWQgZnJvbSB0aGUgcHJldmlvdXMgY3VydmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHhSYWRpdXMgLSBUaGUgcmFkaXVzIG9mIHRoZSBlbGxpcHNlIGluIHRoZSB4IGF4aXMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHlSYWRpdXMgLSBUaGUgcmFkaXVzIG9mIHRoZSBlbGxpcHNlIGluIHRoZSB5IGF4aXMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFTdGFydEFuZ2xlIC0gVGhlIHN0YXJ0IGFuZ2xlIGluIHJhZGlhbnMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFFbmRBbmdsZSAtIFRoZSBlbmQgYW5nbGUgaW4gcmFkaWFucy5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFthQ2xvY2t3aXNlPWZhbHNlXSAtIFdoZXRoZXIgdG8gc3dlZXAgdGhlIGVsbGlwc2UgY2xvY2t3aXNlIG9yIG5vdC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2FSb3RhdGlvbj0wXSAtIFRoZSByb3RhdGlvbiBhbmdsZSBvZiB0aGUgZWxsaXBzZSBpbiByYWRpYW5zLCBjb3VudGVyY2xvY2t3aXNlIGZyb20gdGhlIHBvc2l0aXZlIFggYXhpcy5cclxuXHQgKiBAcmV0dXJuIHtQYXRofSBBIHJlZmVyZW5jZSB0byB0aGlzIHBhdGguXHJcblx0ICovXHJcblx0ZWxsaXBzZSggYVgsIGFZLCB4UmFkaXVzLCB5UmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlLCBhUm90YXRpb24gKSB7XHJcblxyXG5cdFx0Y29uc3QgeDAgPSB0aGlzLmN1cnJlbnRQb2ludC54O1xyXG5cdFx0Y29uc3QgeTAgPSB0aGlzLmN1cnJlbnRQb2ludC55O1xyXG5cclxuXHRcdHRoaXMuYWJzZWxsaXBzZSggYVggKyB4MCwgYVkgKyB5MCwgeFJhZGl1cywgeVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSwgYVJvdGF0aW9uICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyBhbiBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgZWxsaXBzZSBhcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgRWxsaXBzZUN1cnZlfSB0byB0aGUgcGF0aC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhWCAtIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGFic29sdXRlIGNlbnRlciBvZiB0aGUgZWxsaXBzZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYVkgLSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBhYnNvbHV0ZSBjZW50ZXIgb2YgdGhlIGVsbGlwc2UuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHhSYWRpdXMgLSBUaGUgcmFkaXVzIG9mIHRoZSBlbGxpcHNlIGluIHRoZSB4IGF4aXMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHlSYWRpdXMgLSBUaGUgcmFkaXVzIG9mIHRoZSBlbGxpcHNlIGluIHRoZSB5IGF4aXMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFTdGFydEFuZ2xlIC0gVGhlIHN0YXJ0IGFuZ2xlIGluIHJhZGlhbnMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFFbmRBbmdsZSAtIFRoZSBlbmQgYW5nbGUgaW4gcmFkaWFucy5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFthQ2xvY2t3aXNlPWZhbHNlXSAtIFdoZXRoZXIgdG8gc3dlZXAgdGhlIGVsbGlwc2UgY2xvY2t3aXNlIG9yIG5vdC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2FSb3RhdGlvbj0wXSAtIFRoZSByb3RhdGlvbiBhbmdsZSBvZiB0aGUgZWxsaXBzZSBpbiByYWRpYW5zLCBjb3VudGVyY2xvY2t3aXNlIGZyb20gdGhlIHBvc2l0aXZlIFggYXhpcy5cclxuXHQgKiBAcmV0dXJuIHtQYXRofSBBIHJlZmVyZW5jZSB0byB0aGlzIHBhdGguXHJcblx0ICovXHJcblx0YWJzZWxsaXBzZSggYVgsIGFZLCB4UmFkaXVzLCB5UmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlLCBhUm90YXRpb24gKSB7XHJcblxyXG5cdFx0Y29uc3QgY3VydmUgPSBuZXcgRWxsaXBzZUN1cnZlKCBhWCwgYVksIHhSYWRpdXMsIHlSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UsIGFSb3RhdGlvbiApO1xyXG5cclxuXHRcdGlmICggdGhpcy5jdXJ2ZXMubGVuZ3RoID4gMCApIHtcclxuXHJcblx0XHRcdC8vIGlmIGEgcHJldmlvdXMgY3VydmUgaXMgcHJlc2VudCwgYXR0ZW1wdCB0byBqb2luXHJcblx0XHRcdGNvbnN0IGZpcnN0UG9pbnQgPSBjdXJ2ZS5nZXRQb2ludCggMCApO1xyXG5cclxuXHRcdFx0aWYgKCAhIGZpcnN0UG9pbnQuZXF1YWxzKCB0aGlzLmN1cnJlbnRQb2ludCApICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLmxpbmVUbyggZmlyc3RQb2ludC54LCBmaXJzdFBvaW50LnkgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5jdXJ2ZXMucHVzaCggY3VydmUgKTtcclxuXHJcblx0XHRjb25zdCBsYXN0UG9pbnQgPSBjdXJ2ZS5nZXRQb2ludCggMSApO1xyXG5cdFx0dGhpcy5jdXJyZW50UG9pbnQuY29weSggbGFzdFBvaW50ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMuY3VycmVudFBvaW50LmNvcHkoIHNvdXJjZS5jdXJyZW50UG9pbnQgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHR0b0pTT04oKSB7XHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IHN1cGVyLnRvSlNPTigpO1xyXG5cclxuXHRcdGRhdGEuY3VycmVudFBvaW50ID0gdGhpcy5jdXJyZW50UG9pbnQudG9BcnJheSgpO1xyXG5cclxuXHRcdHJldHVybiBkYXRhO1xyXG5cclxuXHR9XHJcblxyXG5cdGZyb21KU09OKCBqc29uICkge1xyXG5cclxuXHRcdHN1cGVyLmZyb21KU09OKCBqc29uICk7XHJcblxyXG5cdFx0dGhpcy5jdXJyZW50UG9pbnQuZnJvbUFycmF5KCBqc29uLmN1cnJlbnRQb2ludCApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgUGF0aCB9O1xyXG4iLCJpbXBvcnQgeyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5pbXBvcnQgeyBCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyR2VvbWV0cnkuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uL21hdGgvVmVjdG9yMi5qcyc7XHJcbmltcG9ydCB7IGNsYW1wIH0gZnJvbSAnLi4vbWF0aC9NYXRoVXRpbHMuanMnO1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgbWVzaGVzIHdpdGggYXhpYWwgc3ltbWV0cnkgbGlrZSB2YXNlcy4gVGhlIGxhdGhlIHJvdGF0ZXMgYXJvdW5kIHRoZSBZIGF4aXMuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IHBvaW50cyA9IFtdO1xyXG4gKiBmb3IgKCBsZXQgaSA9IDA7IGkgPCAxMDsgaSArKyApIHtcclxuICogXHRwb2ludHMucHVzaCggbmV3IFRIUkVFLlZlY3RvcjIoIE1hdGguc2luKCBpICogMC4yICkgKiAxMCArIDUsICggaSAtIDUgKSAqIDIgKSApO1xyXG4gKiB9XHJcbiAqIGNvbnN0IGdlb21ldHJ5ID0gbmV3IFRIUkVFLkxhdGhlR2VvbWV0cnkoIHBvaW50cyApO1xyXG4gKiBjb25zdCBtYXRlcmlhbCA9IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogMHhmZmZmMDAgfSApO1xyXG4gKiBjb25zdCBsYXRoZSA9IG5ldyBUSFJFRS5NZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuICogc2NlbmUuYWRkKCBsYXRoZSApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIEJ1ZmZlckdlb21ldHJ5XHJcbiAqL1xyXG5jbGFzcyBMYXRoZUdlb21ldHJ5IGV4dGVuZHMgQnVmZmVyR2VvbWV0cnkge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGxhdGhlIGdlb21ldHJ5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxWZWN0b3IyfFZlY3RvcjM+fSBbcG9pbnRzXSAtIEFuIGFycmF5IG9mIHBvaW50cyBpbiAyRCBzcGFjZS4gVGhlIHgtY29vcmRpbmF0ZSBvZiBlYWNoIHBvaW50XHJcblx0ICogbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3NlZ21lbnRzPTEyXSAtIFRoZSBudW1iZXIgb2YgY2lyY3VtZmVyZW5jZSBzZWdtZW50cyB0byBnZW5lcmF0ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3BoaVN0YXJ0PTBdIC0gVGhlIHN0YXJ0aW5nIGFuZ2xlIGluIHJhZGlhbnMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtwaGlMZW5ndGg9TWF0aC5QSSoyXSAtIFRoZSByYWRpYW4gKDAgdG8gMlBJKSByYW5nZSBvZiB0aGUgbGF0aGVkIHNlY3Rpb24gMlBJIGlzIGFcclxuXHQgKiBjbG9zZWQgbGF0aGUsIGxlc3MgdGhhbiAyUEkgaXMgYSBwb3J0aW9uLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwb2ludHMgPSBbIG5ldyBWZWN0b3IyKCAwLCAtIDAuNSApLCBuZXcgVmVjdG9yMiggMC41LCAwICksIG5ldyBWZWN0b3IyKCAwLCAwLjUgKSBdLCBzZWdtZW50cyA9IDEyLCBwaGlTdGFydCA9IDAsIHBoaUxlbmd0aCA9IE1hdGguUEkgKiAyICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ0xhdGhlR2VvbWV0cnknO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG9sZHMgdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMgdGhhdCBoYXZlIGJlZW5cclxuXHRcdCAqIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGdlb21ldHJ5LiBBbnkgbW9kaWZpY2F0aW9uXHJcblx0XHQgKiBhZnRlciBpbnN0YW50aWF0aW9uIGRvZXMgbm90IGNoYW5nZSB0aGUgZ2VvbWV0cnkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0ge1xyXG5cdFx0XHRwb2ludHM6IHBvaW50cyxcclxuXHRcdFx0c2VnbWVudHM6IHNlZ21lbnRzLFxyXG5cdFx0XHRwaGlTdGFydDogcGhpU3RhcnQsXHJcblx0XHRcdHBoaUxlbmd0aDogcGhpTGVuZ3RoXHJcblx0XHR9O1xyXG5cclxuXHRcdHNlZ21lbnRzID0gTWF0aC5mbG9vciggc2VnbWVudHMgKTtcclxuXHJcblx0XHQvLyBjbGFtcCBwaGlMZW5ndGggc28gaXQncyBpbiByYW5nZSBvZiBbIDAsIDJQSSBdXHJcblxyXG5cdFx0cGhpTGVuZ3RoID0gY2xhbXAoIHBoaUxlbmd0aCwgMCwgTWF0aC5QSSAqIDIgKTtcclxuXHJcblx0XHQvLyBidWZmZXJzXHJcblxyXG5cdFx0Y29uc3QgaW5kaWNlcyA9IFtdO1xyXG5cdFx0Y29uc3QgdmVydGljZXMgPSBbXTtcclxuXHRcdGNvbnN0IHV2cyA9IFtdO1xyXG5cdFx0Y29uc3QgaW5pdE5vcm1hbHMgPSBbXTtcclxuXHRcdGNvbnN0IG5vcm1hbHMgPSBbXTtcclxuXHJcblx0XHQvLyBoZWxwZXIgdmFyaWFibGVzXHJcblxyXG5cdFx0Y29uc3QgaW52ZXJzZVNlZ21lbnRzID0gMS4wIC8gc2VnbWVudHM7XHJcblx0XHRjb25zdCB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xyXG5cdFx0Y29uc3QgdXYgPSBuZXcgVmVjdG9yMigpO1xyXG5cdFx0Y29uc3Qgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcclxuXHRcdGNvbnN0IGN1ck5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XHJcblx0XHRjb25zdCBwcmV2Tm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcclxuXHRcdGxldCBkeCA9IDA7XHJcblx0XHRsZXQgZHkgPSAwO1xyXG5cclxuXHRcdC8vIHByZS1jb21wdXRlIG5vcm1hbHMgZm9yIGluaXRpYWwgXCJtZXJpZGlhblwiXHJcblxyXG5cdFx0Zm9yICggbGV0IGogPSAwOyBqIDw9ICggcG9pbnRzLmxlbmd0aCAtIDEgKTsgaiArKyApIHtcclxuXHJcblx0XHRcdHN3aXRjaCAoIGogKSB7XHJcblxyXG5cdFx0XHRcdGNhc2UgMDpcdFx0XHRcdC8vIHNwZWNpYWwgaGFuZGxpbmcgZm9yIDFzdCB2ZXJ0ZXggb24gcGF0aFxyXG5cclxuXHRcdFx0XHRcdGR4ID0gcG9pbnRzWyBqICsgMSBdLnggLSBwb2ludHNbIGogXS54O1xyXG5cdFx0XHRcdFx0ZHkgPSBwb2ludHNbIGogKyAxIF0ueSAtIHBvaW50c1sgaiBdLnk7XHJcblxyXG5cdFx0XHRcdFx0bm9ybWFsLnggPSBkeSAqIDEuMDtcclxuXHRcdFx0XHRcdG5vcm1hbC55ID0gLSBkeDtcclxuXHRcdFx0XHRcdG5vcm1hbC56ID0gZHkgKiAwLjA7XHJcblxyXG5cdFx0XHRcdFx0cHJldk5vcm1hbC5jb3B5KCBub3JtYWwgKTtcclxuXHJcblx0XHRcdFx0XHRub3JtYWwubm9ybWFsaXplKCk7XHJcblxyXG5cdFx0XHRcdFx0aW5pdE5vcm1hbHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApO1xyXG5cclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRjYXNlICggcG9pbnRzLmxlbmd0aCAtIDEgKTpcdC8vIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGxhc3QgVmVydGV4IG9uIHBhdGhcclxuXHJcblx0XHRcdFx0XHRpbml0Tm9ybWFscy5wdXNoKCBwcmV2Tm9ybWFsLngsIHByZXZOb3JtYWwueSwgcHJldk5vcm1hbC56ICk7XHJcblxyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdGRlZmF1bHQ6XHRcdFx0Ly8gZGVmYXVsdCBoYW5kbGluZyBmb3IgYWxsIHZlcnRpY2VzIGluIGJldHdlZW5cclxuXHJcblx0XHRcdFx0XHRkeCA9IHBvaW50c1sgaiArIDEgXS54IC0gcG9pbnRzWyBqIF0ueDtcclxuXHRcdFx0XHRcdGR5ID0gcG9pbnRzWyBqICsgMSBdLnkgLSBwb2ludHNbIGogXS55O1xyXG5cclxuXHRcdFx0XHRcdG5vcm1hbC54ID0gZHkgKiAxLjA7XHJcblx0XHRcdFx0XHRub3JtYWwueSA9IC0gZHg7XHJcblx0XHRcdFx0XHRub3JtYWwueiA9IGR5ICogMC4wO1xyXG5cclxuXHRcdFx0XHRcdGN1ck5vcm1hbC5jb3B5KCBub3JtYWwgKTtcclxuXHJcblx0XHRcdFx0XHRub3JtYWwueCArPSBwcmV2Tm9ybWFsLng7XHJcblx0XHRcdFx0XHRub3JtYWwueSArPSBwcmV2Tm9ybWFsLnk7XHJcblx0XHRcdFx0XHRub3JtYWwueiArPSBwcmV2Tm9ybWFsLno7XHJcblxyXG5cdFx0XHRcdFx0bm9ybWFsLm5vcm1hbGl6ZSgpO1xyXG5cclxuXHRcdFx0XHRcdGluaXROb3JtYWxzLnB1c2goIG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnogKTtcclxuXHJcblx0XHRcdFx0XHRwcmV2Tm9ybWFsLmNvcHkoIGN1ck5vcm1hbCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlcywgdXZzIGFuZCBub3JtYWxzXHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDw9IHNlZ21lbnRzOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgcGhpID0gcGhpU3RhcnQgKyBpICogaW52ZXJzZVNlZ21lbnRzICogcGhpTGVuZ3RoO1xyXG5cclxuXHRcdFx0Y29uc3Qgc2luID0gTWF0aC5zaW4oIHBoaSApO1xyXG5cdFx0XHRjb25zdCBjb3MgPSBNYXRoLmNvcyggcGhpICk7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaiA9IDA7IGogPD0gKCBwb2ludHMubGVuZ3RoIC0gMSApOyBqICsrICkge1xyXG5cclxuXHRcdFx0XHQvLyB2ZXJ0ZXhcclxuXHJcblx0XHRcdFx0dmVydGV4LnggPSBwb2ludHNbIGogXS54ICogc2luO1xyXG5cdFx0XHRcdHZlcnRleC55ID0gcG9pbnRzWyBqIF0ueTtcclxuXHRcdFx0XHR2ZXJ0ZXgueiA9IHBvaW50c1sgaiBdLnggKiBjb3M7XHJcblxyXG5cdFx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcclxuXHJcblx0XHRcdFx0Ly8gdXZcclxuXHJcblx0XHRcdFx0dXYueCA9IGkgLyBzZWdtZW50cztcclxuXHRcdFx0XHR1di55ID0gaiAvICggcG9pbnRzLmxlbmd0aCAtIDEgKTtcclxuXHJcblx0XHRcdFx0dXZzLnB1c2goIHV2LngsIHV2LnkgKTtcclxuXHJcblx0XHRcdFx0Ly8gbm9ybWFsXHJcblxyXG5cdFx0XHRcdGNvbnN0IHggPSBpbml0Tm9ybWFsc1sgMyAqIGogKyAwIF0gKiBzaW47XHJcblx0XHRcdFx0Y29uc3QgeSA9IGluaXROb3JtYWxzWyAzICogaiArIDEgXTtcclxuXHRcdFx0XHRjb25zdCB6ID0gaW5pdE5vcm1hbHNbIDMgKiBqICsgMCBdICogY29zO1xyXG5cclxuXHRcdFx0XHRub3JtYWxzLnB1c2goIHgsIHksIHogKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gaW5kaWNlc1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHNlZ21lbnRzOyBpICsrICkge1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGogPSAwOyBqIDwgKCBwb2ludHMubGVuZ3RoIC0gMSApOyBqICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBiYXNlID0gaiArIGkgKiBwb2ludHMubGVuZ3RoO1xyXG5cclxuXHRcdFx0XHRjb25zdCBhID0gYmFzZTtcclxuXHRcdFx0XHRjb25zdCBiID0gYmFzZSArIHBvaW50cy5sZW5ndGg7XHJcblx0XHRcdFx0Y29uc3QgYyA9IGJhc2UgKyBwb2ludHMubGVuZ3RoICsgMTtcclxuXHRcdFx0XHRjb25zdCBkID0gYmFzZSArIDE7XHJcblxyXG5cdFx0XHRcdC8vIGZhY2VzXHJcblxyXG5cdFx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgZCApO1xyXG5cdFx0XHRcdGluZGljZXMucHVzaCggYywgZCwgYiApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBidWlsZCBnZW9tZXRyeVxyXG5cclxuXHRcdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcclxuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xyXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xyXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMucGFyYW1ldGVycyA9IE9iamVjdC5hc3NpZ24oIHt9LCBzb3VyY2UucGFyYW1ldGVycyApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGZyb20gdGhlIGdpdmVuXHJcblx0ICogSlNPTiBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIEEgSlNPTiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzZXJpYWxpemVkIGdlb21ldHJ5LlxyXG5cdCAqIEByZXR1cm4ge0xhdGhlR2VvbWV0cnl9IEEgbmV3IGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBmcm9tSlNPTiggZGF0YSApIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IExhdGhlR2VvbWV0cnkoIGRhdGEucG9pbnRzLCBkYXRhLnNlZ21lbnRzLCBkYXRhLnBoaVN0YXJ0LCBkYXRhLnBoaUxlbmd0aCApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgTGF0aGVHZW9tZXRyeSB9O1xyXG4iLCJpbXBvcnQgeyBQYXRoIH0gZnJvbSAnLi4vZXh0cmFzL2NvcmUvUGF0aC5qcyc7XHJcbmltcG9ydCB7IExhdGhlR2VvbWV0cnkgfSBmcm9tICcuL0xhdGhlR2VvbWV0cnkuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgZ2VvbWV0cnkgY2xhc3MgZm9yIGEgY2Fwc3VsZSB3aXRoIGdpdmVuIHJhZGlpIGFuZCBoZWlnaHQuIEl0IGlzIGNvbnN0cnVjdGVkIHVzaW5nIGEgbGF0aGUuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGdlb21ldHJ5ID0gbmV3IFRIUkVFLkNhcHN1bGVHZW9tZXRyeSggMSwgMSwgNCwgOCApO1xyXG4gKiBjb25zdCBtYXRlcmlhbCA9IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogMHgwMGZmMDAgfSApO1xyXG4gKiBjb25zdCBjYXBzdWxlID0gbmV3IFRIUkVFLk1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG4gKiBzY2VuZS5hZGQoIGNhcHN1bGUgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBMYXRoZUdlb21ldHJ5XHJcbiAqL1xyXG5jbGFzcyBDYXBzdWxlR2VvbWV0cnkgZXh0ZW5kcyBMYXRoZUdlb21ldHJ5IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBjYXBzdWxlIGdlb21ldHJ5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpdXM9MV0gLSBSYWRpdXMgb2YgdGhlIGNhcHN1bGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9MV0gLSBMZW5ndGggb2YgdGhlIG1pZGRsZSBzZWN0aW9uLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbY2FwU2VnbWVudHM9NF0gLSBOdW1iZXIgb2YgY3VydmUgc2VnbWVudHMgdXNlZCB0byBidWlsZCB0aGUgY2Fwcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3JhZGlhbFNlZ21lbnRzPThdIC0gTnVtYmVyIG9mIHNlZ21lbnRlZCBmYWNlcyBhcm91bmQgdGhlIGNpcmN1bWZlcmVuY2Ugb2YgdGhlIGNhcHN1bGUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHJhZGl1cyA9IDEsIGxlbmd0aCA9IDEsIGNhcFNlZ21lbnRzID0gNCwgcmFkaWFsU2VnbWVudHMgPSA4ICkge1xyXG5cclxuXHRcdGNvbnN0IHBhdGggPSBuZXcgUGF0aCgpO1xyXG5cdFx0cGF0aC5hYnNhcmMoIDAsIC0gbGVuZ3RoIC8gMiwgcmFkaXVzLCBNYXRoLlBJICogMS41LCAwICk7XHJcblx0XHRwYXRoLmFic2FyYyggMCwgbGVuZ3RoIC8gMiwgcmFkaXVzLCAwLCBNYXRoLlBJICogMC41ICk7XHJcblxyXG5cdFx0c3VwZXIoIHBhdGguZ2V0UG9pbnRzKCBjYXBTZWdtZW50cyApLCByYWRpYWxTZWdtZW50cyApO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdDYXBzdWxlR2VvbWV0cnknO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG9sZHMgdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMgdGhhdCBoYXZlIGJlZW5cclxuXHRcdCAqIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGdlb21ldHJ5LiBBbnkgbW9kaWZpY2F0aW9uXHJcblx0XHQgKiBhZnRlciBpbnN0YW50aWF0aW9uIGRvZXMgbm90IGNoYW5nZSB0aGUgZ2VvbWV0cnkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0ge1xyXG5cdFx0XHRyYWRpdXM6IHJhZGl1cyxcclxuXHRcdFx0bGVuZ3RoOiBsZW5ndGgsXHJcblx0XHRcdGNhcFNlZ21lbnRzOiBjYXBTZWdtZW50cyxcclxuXHRcdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxyXG5cdFx0fTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGYWN0b3J5IG1ldGhvZCBmb3IgY3JlYXRpbmcgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBmcm9tIHRoZSBnaXZlblxyXG5cdCAqIEpTT04gb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBBIEpTT04gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc2VyaWFsaXplZCBnZW9tZXRyeS5cclxuXHQgKiBAcmV0dXJuIHtDYXBzdWxlR2VvbWV0cnl9IEEgbmV3IGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBmcm9tSlNPTiggZGF0YSApIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IENhcHN1bGVHZW9tZXRyeSggZGF0YS5yYWRpdXMsIGRhdGEubGVuZ3RoLCBkYXRhLmNhcFNlZ21lbnRzLCBkYXRhLnJhZGlhbFNlZ21lbnRzICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IENhcHN1bGVHZW9tZXRyeSB9O1xyXG4iLCJpbXBvcnQgeyBCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyR2VvbWV0cnkuanMnO1xyXG5pbXBvcnQgeyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uL21hdGgvVmVjdG9yMi5qcyc7XHJcblxyXG4vKipcclxuICogQSBzaW1wbGUgc2hhcGUgb2YgRXVjbGlkZWFuIGdlb21ldHJ5LiBJdCBpcyBjb25zdHJ1Y3RlZCBmcm9tIGFcclxuICogbnVtYmVyIG9mIHRyaWFuZ3VsYXIgc2VnbWVudHMgdGhhdCBhcmUgb3JpZW50ZWQgYXJvdW5kIGEgY2VudHJhbCBwb2ludCBhbmRcclxuICogZXh0ZW5kIGFzIGZhciBvdXQgYXMgYSBnaXZlbiByYWRpdXMuIEl0IGlzIGJ1aWx0IGNvdW50ZXItY2xvY2t3aXNlIGZyb20gYVxyXG4gKiBzdGFydCBhbmdsZSBhbmQgYSBnaXZlbiBjZW50cmFsIGFuZ2xlLiBJdCBjYW4gYWxzbyBiZSB1c2VkIHRvIGNyZWF0ZVxyXG4gKiByZWd1bGFyIHBvbHlnb25zLCB3aGVyZSB0aGUgbnVtYmVyIG9mIHNlZ21lbnRzIGRldGVybWluZXMgdGhlIG51bWJlciBvZlxyXG4gKiBzaWRlcy5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgZ2VvbWV0cnkgPSBuZXcgVEhSRUUuQ2lyY2xlR2VvbWV0cnkoIDUsIDMyICk7XHJcbiAqIGNvbnN0IG1hdGVyaWFsID0gbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiAweGZmZmYwMCB9ICk7XHJcbiAqIGNvbnN0IGNpcmNsZSA9IG5ldyBUSFJFRS5NZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuICogc2NlbmUuYWRkKCBjaXJjbGUgKVxyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIEJ1ZmZlckdlb21ldHJ5XHJcbiAqL1xyXG5jbGFzcyBDaXJjbGVHZW9tZXRyeSBleHRlbmRzIEJ1ZmZlckdlb21ldHJ5IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBjaXJjbGUgZ2VvbWV0cnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3JhZGl1cz0xXSAtIFJhZGl1cyBvZiB0aGUgY2lyY2xlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbc2VnbWVudHM9MzJdIC0gTnVtYmVyIG9mIHNlZ21lbnRzICh0cmlhbmdsZXMpLCBtaW5pbXVtID0gYDNgLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbdGhldGFTdGFydD0wXSAtIFN0YXJ0IGFuZ2xlIGZvciBmaXJzdCBzZWdtZW50IGluIHJhZGlhbnMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt0aGV0YUxlbmd0aD1NYXRoLlBJKjJdIC0gVGhlIGNlbnRyYWwgYW5nbGUsIG9mdGVuIGNhbGxlZCB0aGV0YSxcclxuXHQgKiBvZiB0aGUgY2lyY3VsYXIgc2VjdG9yIGluIHJhZGlhbnMuIFRoZSBkZWZhdWx0IHZhbHVlIHJlc3VsdHMgaW4gYSBjb21wbGV0ZSBjaXJjbGUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHJhZGl1cyA9IDEsIHNlZ21lbnRzID0gMzIsIHRoZXRhU3RhcnQgPSAwLCB0aGV0YUxlbmd0aCA9IE1hdGguUEkgKiAyICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ0NpcmNsZUdlb21ldHJ5JztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvbGRzIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzIHRoYXQgaGF2ZSBiZWVuXHJcblx0XHQgKiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBnZW9tZXRyeS4gQW55IG1vZGlmaWNhdGlvblxyXG5cdFx0ICogYWZ0ZXIgaW5zdGFudGlhdGlvbiBkb2VzIG5vdCBjaGFuZ2UgdGhlIGdlb21ldHJ5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucGFyYW1ldGVycyA9IHtcclxuXHRcdFx0cmFkaXVzOiByYWRpdXMsXHJcblx0XHRcdHNlZ21lbnRzOiBzZWdtZW50cyxcclxuXHRcdFx0dGhldGFTdGFydDogdGhldGFTdGFydCxcclxuXHRcdFx0dGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoXHJcblx0XHR9O1xyXG5cclxuXHRcdHNlZ21lbnRzID0gTWF0aC5tYXgoIDMsIHNlZ21lbnRzICk7XHJcblxyXG5cdFx0Ly8gYnVmZmVyc1xyXG5cclxuXHRcdGNvbnN0IGluZGljZXMgPSBbXTtcclxuXHRcdGNvbnN0IHZlcnRpY2VzID0gW107XHJcblx0XHRjb25zdCBub3JtYWxzID0gW107XHJcblx0XHRjb25zdCB1dnMgPSBbXTtcclxuXHJcblx0XHQvLyBoZWxwZXIgdmFyaWFibGVzXHJcblxyXG5cdFx0Y29uc3QgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcclxuXHRcdGNvbnN0IHV2ID0gbmV3IFZlY3RvcjIoKTtcclxuXHJcblx0XHQvLyBjZW50ZXIgcG9pbnRcclxuXHJcblx0XHR2ZXJ0aWNlcy5wdXNoKCAwLCAwLCAwICk7XHJcblx0XHRub3JtYWxzLnB1c2goIDAsIDAsIDEgKTtcclxuXHRcdHV2cy5wdXNoKCAwLjUsIDAuNSApO1xyXG5cclxuXHRcdGZvciAoIGxldCBzID0gMCwgaSA9IDM7IHMgPD0gc2VnbWVudHM7IHMgKyssIGkgKz0gMyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHNlZ21lbnQgPSB0aGV0YVN0YXJ0ICsgcyAvIHNlZ21lbnRzICogdGhldGFMZW5ndGg7XHJcblxyXG5cdFx0XHQvLyB2ZXJ0ZXhcclxuXHJcblx0XHRcdHZlcnRleC54ID0gcmFkaXVzICogTWF0aC5jb3MoIHNlZ21lbnQgKTtcclxuXHRcdFx0dmVydGV4LnkgPSByYWRpdXMgKiBNYXRoLnNpbiggc2VnbWVudCApO1xyXG5cclxuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xyXG5cclxuXHRcdFx0Ly8gbm9ybWFsXHJcblxyXG5cdFx0XHRub3JtYWxzLnB1c2goIDAsIDAsIDEgKTtcclxuXHJcblx0XHRcdC8vIHV2c1xyXG5cclxuXHRcdFx0dXYueCA9ICggdmVydGljZXNbIGkgXSAvIHJhZGl1cyArIDEgKSAvIDI7XHJcblx0XHRcdHV2LnkgPSAoIHZlcnRpY2VzWyBpICsgMSBdIC8gcmFkaXVzICsgMSApIC8gMjtcclxuXHJcblx0XHRcdHV2cy5wdXNoKCB1di54LCB1di55ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGluZGljZXNcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDE7IGkgPD0gc2VnbWVudHM7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRpbmRpY2VzLnB1c2goIGksIGkgKyAxLCAwICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGJ1aWxkIGdlb21ldHJ5XHJcblxyXG5cdFx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xyXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XHJcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcclxuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0gT2JqZWN0LmFzc2lnbigge30sIHNvdXJjZS5wYXJhbWV0ZXJzICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRmFjdG9yeSBtZXRob2QgZm9yIGNyZWF0aW5nIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZnJvbSB0aGUgZ2l2ZW5cclxuXHQgKiBKU09OIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gQSBKU09OIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNlcmlhbGl6ZWQgZ2VvbWV0cnkuXHJcblx0ICogQHJldHVybiB7Q2lyY2xlR2VvbWV0cnl9IEEgbmV3IGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBmcm9tSlNPTiggZGF0YSApIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IENpcmNsZUdlb21ldHJ5KCBkYXRhLnJhZGl1cywgZGF0YS5zZWdtZW50cywgZGF0YS50aGV0YVN0YXJ0LCBkYXRhLnRoZXRhTGVuZ3RoICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBDaXJjbGVHZW9tZXRyeSB9O1xyXG4iLCJpbXBvcnQgeyBCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyR2VvbWV0cnkuanMnO1xyXG5pbXBvcnQgeyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uL21hdGgvVmVjdG9yMi5qcyc7XHJcblxyXG4vKipcclxuICogQSBnZW9tZXRyeSBjbGFzcyBmb3IgcmVwcmVzZW50aW5nIGEgY3lsaW5kZXIuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGdlb21ldHJ5ID0gbmV3IFRIUkVFLkN5bGluZGVyR2VvbWV0cnkoIDUsIDUsIDIwLCAzMiApO1xyXG4gKiBjb25zdCBtYXRlcmlhbCA9IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogMHhmZmZmMDAgfSApO1xyXG4gKiBjb25zdCBjeWxpbmRlciA9IG5ldyBUSFJFRS5NZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuICogc2NlbmUuYWRkKCBjeWxpbmRlciApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIEJ1ZmZlckdlb21ldHJ5XHJcbiAqL1xyXG5jbGFzcyBDeWxpbmRlckdlb21ldHJ5IGV4dGVuZHMgQnVmZmVyR2VvbWV0cnkge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGN5bGluZGVyIGdlb21ldHJ5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpdXNUb3A9MV0gLSBSYWRpdXMgb2YgdGhlIGN5bGluZGVyIGF0IHRoZSB0b3AuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpdXNCb3R0b209MV0gLSBSYWRpdXMgb2YgdGhlIGN5bGluZGVyIGF0IHRoZSBib3R0b20uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtoZWlnaHQ9MV0gLSBIZWlnaHQgb2YgdGhlIGN5bGluZGVyLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbcmFkaWFsU2VnbWVudHM9MzJdIC0gTnVtYmVyIG9mIHNlZ21lbnRlZCBmYWNlcyBhcm91bmQgdGhlIGNpcmN1bWZlcmVuY2Ugb2YgdGhlIGN5bGluZGVyLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbaGVpZ2h0U2VnbWVudHM9MV0gLSBOdW1iZXIgb2Ygcm93cyBvZiBmYWNlcyBhbG9uZyB0aGUgaGVpZ2h0IG9mIHRoZSBjeWxpbmRlci5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcGVuRW5kZWQ9ZmFsc2VdIC0gV2hldGhlciB0aGUgYmFzZSBvZiB0aGUgY3lsaW5kZXIgaXMgb3BlbiBvciBjYXBwZWQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt0aGV0YVN0YXJ0PTBdIC0gU3RhcnQgYW5nbGUgZm9yIGZpcnN0IHNlZ21lbnQsIGluIHJhZGlhbnMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt0aGV0YUxlbmd0aD1NYXRoLlBJKjJdIC0gVGhlIGNlbnRyYWwgYW5nbGUsIG9mdGVuIGNhbGxlZCB0aGV0YSwgb2YgdGhlIGNpcmN1bGFyIHNlY3RvciwgaW4gcmFkaWFucy5cclxuXHQgKiBUaGUgZGVmYXVsdCB2YWx1ZSByZXN1bHRzIGluIGEgY29tcGxldGUgY3lsaW5kZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHJhZGl1c1RvcCA9IDEsIHJhZGl1c0JvdHRvbSA9IDEsIGhlaWdodCA9IDEsIHJhZGlhbFNlZ21lbnRzID0gMzIsIGhlaWdodFNlZ21lbnRzID0gMSwgb3BlbkVuZGVkID0gZmFsc2UsIHRoZXRhU3RhcnQgPSAwLCB0aGV0YUxlbmd0aCA9IE1hdGguUEkgKiAyICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ0N5bGluZGVyR2VvbWV0cnknO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG9sZHMgdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMgdGhhdCBoYXZlIGJlZW5cclxuXHRcdCAqIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGdlb21ldHJ5LiBBbnkgbW9kaWZpY2F0aW9uXHJcblx0XHQgKiBhZnRlciBpbnN0YW50aWF0aW9uIGRvZXMgbm90IGNoYW5nZSB0aGUgZ2VvbWV0cnkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0ge1xyXG5cdFx0XHRyYWRpdXNUb3A6IHJhZGl1c1RvcCxcclxuXHRcdFx0cmFkaXVzQm90dG9tOiByYWRpdXNCb3R0b20sXHJcblx0XHRcdGhlaWdodDogaGVpZ2h0LFxyXG5cdFx0XHRyYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsXHJcblx0XHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cyxcclxuXHRcdFx0b3BlbkVuZGVkOiBvcGVuRW5kZWQsXHJcblx0XHRcdHRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsXHJcblx0XHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxyXG5cdFx0fTtcclxuXHJcblx0XHRjb25zdCBzY29wZSA9IHRoaXM7XHJcblxyXG5cdFx0cmFkaWFsU2VnbWVudHMgPSBNYXRoLmZsb29yKCByYWRpYWxTZWdtZW50cyApO1xyXG5cdFx0aGVpZ2h0U2VnbWVudHMgPSBNYXRoLmZsb29yKCBoZWlnaHRTZWdtZW50cyApO1xyXG5cclxuXHRcdC8vIGJ1ZmZlcnNcclxuXHJcblx0XHRjb25zdCBpbmRpY2VzID0gW107XHJcblx0XHRjb25zdCB2ZXJ0aWNlcyA9IFtdO1xyXG5cdFx0Y29uc3Qgbm9ybWFscyA9IFtdO1xyXG5cdFx0Y29uc3QgdXZzID0gW107XHJcblxyXG5cdFx0Ly8gaGVscGVyIHZhcmlhYmxlc1xyXG5cclxuXHRcdGxldCBpbmRleCA9IDA7XHJcblx0XHRjb25zdCBpbmRleEFycmF5ID0gW107XHJcblx0XHRjb25zdCBoYWxmSGVpZ2h0ID0gaGVpZ2h0IC8gMjtcclxuXHRcdGxldCBncm91cFN0YXJ0ID0gMDtcclxuXHJcblx0XHQvLyBnZW5lcmF0ZSBnZW9tZXRyeVxyXG5cclxuXHRcdGdlbmVyYXRlVG9yc28oKTtcclxuXHJcblx0XHRpZiAoIG9wZW5FbmRlZCA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHJhZGl1c1RvcCA+IDAgKSBnZW5lcmF0ZUNhcCggdHJ1ZSApO1xyXG5cdFx0XHRpZiAoIHJhZGl1c0JvdHRvbSA+IDAgKSBnZW5lcmF0ZUNhcCggZmFsc2UgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gYnVpbGQgZ2VvbWV0cnlcclxuXHJcblx0XHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XHJcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcclxuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xyXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xyXG5cclxuXHRcdGZ1bmN0aW9uIGdlbmVyYXRlVG9yc28oKSB7XHJcblxyXG5cdFx0XHRjb25zdCBub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xyXG5cdFx0XHRjb25zdCB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xyXG5cclxuXHRcdFx0bGV0IGdyb3VwQ291bnQgPSAwO1xyXG5cclxuXHRcdFx0Ly8gdGhpcyB3aWxsIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBub3JtYWxcclxuXHRcdFx0Y29uc3Qgc2xvcGUgPSAoIHJhZGl1c0JvdHRvbSAtIHJhZGl1c1RvcCApIC8gaGVpZ2h0O1xyXG5cclxuXHRcdFx0Ly8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IHkgPSAwOyB5IDw9IGhlaWdodFNlZ21lbnRzOyB5ICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBpbmRleFJvdyA9IFtdO1xyXG5cclxuXHRcdFx0XHRjb25zdCB2ID0geSAvIGhlaWdodFNlZ21lbnRzO1xyXG5cclxuXHRcdFx0XHQvLyBjYWxjdWxhdGUgdGhlIHJhZGl1cyBvZiB0aGUgY3VycmVudCByb3dcclxuXHJcblx0XHRcdFx0Y29uc3QgcmFkaXVzID0gdiAqICggcmFkaXVzQm90dG9tIC0gcmFkaXVzVG9wICkgKyByYWRpdXNUb3A7XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCB4ID0gMDsgeCA8PSByYWRpYWxTZWdtZW50czsgeCArKyApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCB1ID0geCAvIHJhZGlhbFNlZ21lbnRzO1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHRoZXRhID0gdSAqIHRoZXRhTGVuZ3RoICsgdGhldGFTdGFydDtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBzaW5UaGV0YSA9IE1hdGguc2luKCB0aGV0YSApO1xyXG5cdFx0XHRcdFx0Y29uc3QgY29zVGhldGEgPSBNYXRoLmNvcyggdGhldGEgKTtcclxuXHJcblx0XHRcdFx0XHQvLyB2ZXJ0ZXhcclxuXHJcblx0XHRcdFx0XHR2ZXJ0ZXgueCA9IHJhZGl1cyAqIHNpblRoZXRhO1xyXG5cdFx0XHRcdFx0dmVydGV4LnkgPSAtIHYgKiBoZWlnaHQgKyBoYWxmSGVpZ2h0O1xyXG5cdFx0XHRcdFx0dmVydGV4LnogPSByYWRpdXMgKiBjb3NUaGV0YTtcclxuXHRcdFx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcclxuXHJcblx0XHRcdFx0XHQvLyBub3JtYWxcclxuXHJcblx0XHRcdFx0XHRub3JtYWwuc2V0KCBzaW5UaGV0YSwgc2xvcGUsIGNvc1RoZXRhICkubm9ybWFsaXplKCk7XHJcblx0XHRcdFx0XHRub3JtYWxzLnB1c2goIG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnogKTtcclxuXHJcblx0XHRcdFx0XHQvLyB1dlxyXG5cclxuXHRcdFx0XHRcdHV2cy5wdXNoKCB1LCAxIC0gdiApO1xyXG5cclxuXHRcdFx0XHRcdC8vIHNhdmUgaW5kZXggb2YgdmVydGV4IGluIHJlc3BlY3RpdmUgcm93XHJcblxyXG5cdFx0XHRcdFx0aW5kZXhSb3cucHVzaCggaW5kZXggKysgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyBub3cgc2F2ZSB2ZXJ0aWNlcyBvZiB0aGUgcm93IGluIG91ciBpbmRleCBhcnJheVxyXG5cclxuXHRcdFx0XHRpbmRleEFycmF5LnB1c2goIGluZGV4Um93ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBnZW5lcmF0ZSBpbmRpY2VzXHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgeCA9IDA7IHggPCByYWRpYWxTZWdtZW50czsgeCArKyApIHtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IHkgPSAwOyB5IDwgaGVpZ2h0U2VnbWVudHM7IHkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gd2UgdXNlIHRoZSBpbmRleCBhcnJheSB0byBhY2Nlc3MgdGhlIGNvcnJlY3QgaW5kaWNlc1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGEgPSBpbmRleEFycmF5WyB5IF1bIHggXTtcclxuXHRcdFx0XHRcdGNvbnN0IGIgPSBpbmRleEFycmF5WyB5ICsgMSBdWyB4IF07XHJcblx0XHRcdFx0XHRjb25zdCBjID0gaW5kZXhBcnJheVsgeSArIDEgXVsgeCArIDEgXTtcclxuXHRcdFx0XHRcdGNvbnN0IGQgPSBpbmRleEFycmF5WyB5IF1bIHggKyAxIF07XHJcblxyXG5cdFx0XHRcdFx0Ly8gZmFjZXNcclxuXHJcblx0XHRcdFx0XHRpZiAoIHJhZGl1c1RvcCA+IDAgfHwgeSAhPT0gMCApIHtcclxuXHJcblx0XHRcdFx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgZCApO1xyXG5cdFx0XHRcdFx0XHRncm91cENvdW50ICs9IDM7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGlmICggcmFkaXVzQm90dG9tID4gMCB8fCB5ICE9PSBoZWlnaHRTZWdtZW50cyAtIDEgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcclxuXHRcdFx0XHRcdFx0Z3JvdXBDb3VudCArPSAzO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gYWRkIGEgZ3JvdXAgdG8gdGhlIGdlb21ldHJ5LiB0aGlzIHdpbGwgZW5zdXJlIG11bHRpIG1hdGVyaWFsIHN1cHBvcnRcclxuXHJcblx0XHRcdHNjb3BlLmFkZEdyb3VwKCBncm91cFN0YXJ0LCBncm91cENvdW50LCAwICk7XHJcblxyXG5cdFx0XHQvLyBjYWxjdWxhdGUgbmV3IHN0YXJ0IHZhbHVlIGZvciBncm91cHNcclxuXHJcblx0XHRcdGdyb3VwU3RhcnQgKz0gZ3JvdXBDb3VudDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0ZnVuY3Rpb24gZ2VuZXJhdGVDYXAoIHRvcCApIHtcclxuXHJcblx0XHRcdC8vIHNhdmUgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjZW50ZXIgdmVydGV4XHJcblx0XHRcdGNvbnN0IGNlbnRlckluZGV4U3RhcnQgPSBpbmRleDtcclxuXHJcblx0XHRcdGNvbnN0IHV2ID0gbmV3IFZlY3RvcjIoKTtcclxuXHRcdFx0Y29uc3QgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcclxuXHJcblx0XHRcdGxldCBncm91cENvdW50ID0gMDtcclxuXHJcblx0XHRcdGNvbnN0IHJhZGl1cyA9ICggdG9wID09PSB0cnVlICkgPyByYWRpdXNUb3AgOiByYWRpdXNCb3R0b207XHJcblx0XHRcdGNvbnN0IHNpZ24gPSAoIHRvcCA9PT0gdHJ1ZSApID8gMSA6IC0gMTtcclxuXHJcblx0XHRcdC8vIGZpcnN0IHdlIGdlbmVyYXRlIHRoZSBjZW50ZXIgdmVydGV4IGRhdGEgb2YgdGhlIGNhcC5cclxuXHRcdFx0Ly8gYmVjYXVzZSB0aGUgZ2VvbWV0cnkgbmVlZHMgb25lIHNldCBvZiB1dnMgcGVyIGZhY2UsXHJcblx0XHRcdC8vIHdlIG11c3QgZ2VuZXJhdGUgYSBjZW50ZXIgdmVydGV4IHBlciBmYWNlL3NlZ21lbnRcclxuXHJcblx0XHRcdGZvciAoIGxldCB4ID0gMTsgeCA8PSByYWRpYWxTZWdtZW50czsgeCArKyApIHtcclxuXHJcblx0XHRcdFx0Ly8gdmVydGV4XHJcblxyXG5cdFx0XHRcdHZlcnRpY2VzLnB1c2goIDAsIGhhbGZIZWlnaHQgKiBzaWduLCAwICk7XHJcblxyXG5cdFx0XHRcdC8vIG5vcm1hbFxyXG5cclxuXHRcdFx0XHRub3JtYWxzLnB1c2goIDAsIHNpZ24sIDAgKTtcclxuXHJcblx0XHRcdFx0Ly8gdXZcclxuXHJcblx0XHRcdFx0dXZzLnB1c2goIDAuNSwgMC41ICk7XHJcblxyXG5cdFx0XHRcdC8vIGluY3JlYXNlIGluZGV4XHJcblxyXG5cdFx0XHRcdGluZGV4ICsrO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gc2F2ZSB0aGUgaW5kZXggb2YgdGhlIGxhc3QgY2VudGVyIHZlcnRleFxyXG5cdFx0XHRjb25zdCBjZW50ZXJJbmRleEVuZCA9IGluZGV4O1xyXG5cclxuXHRcdFx0Ly8gbm93IHdlIGdlbmVyYXRlIHRoZSBzdXJyb3VuZGluZyB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzXHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgeCA9IDA7IHggPD0gcmFkaWFsU2VnbWVudHM7IHggKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHUgPSB4IC8gcmFkaWFsU2VnbWVudHM7XHJcblx0XHRcdFx0Y29uc3QgdGhldGEgPSB1ICogdGhldGFMZW5ndGggKyB0aGV0YVN0YXJ0O1xyXG5cclxuXHRcdFx0XHRjb25zdCBjb3NUaGV0YSA9IE1hdGguY29zKCB0aGV0YSApO1xyXG5cdFx0XHRcdGNvbnN0IHNpblRoZXRhID0gTWF0aC5zaW4oIHRoZXRhICk7XHJcblxyXG5cdFx0XHRcdC8vIHZlcnRleFxyXG5cclxuXHRcdFx0XHR2ZXJ0ZXgueCA9IHJhZGl1cyAqIHNpblRoZXRhO1xyXG5cdFx0XHRcdHZlcnRleC55ID0gaGFsZkhlaWdodCAqIHNpZ247XHJcblx0XHRcdFx0dmVydGV4LnogPSByYWRpdXMgKiBjb3NUaGV0YTtcclxuXHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XHJcblxyXG5cdFx0XHRcdC8vIG5vcm1hbFxyXG5cclxuXHRcdFx0XHRub3JtYWxzLnB1c2goIDAsIHNpZ24sIDAgKTtcclxuXHJcblx0XHRcdFx0Ly8gdXZcclxuXHJcblx0XHRcdFx0dXYueCA9ICggY29zVGhldGEgKiAwLjUgKSArIDAuNTtcclxuXHRcdFx0XHR1di55ID0gKCBzaW5UaGV0YSAqIDAuNSAqIHNpZ24gKSArIDAuNTtcclxuXHRcdFx0XHR1dnMucHVzaCggdXYueCwgdXYueSApO1xyXG5cclxuXHRcdFx0XHQvLyBpbmNyZWFzZSBpbmRleFxyXG5cclxuXHRcdFx0XHRpbmRleCArKztcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIGdlbmVyYXRlIGluZGljZXNcclxuXHJcblx0XHRcdGZvciAoIGxldCB4ID0gMDsgeCA8IHJhZGlhbFNlZ21lbnRzOyB4ICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBjID0gY2VudGVySW5kZXhTdGFydCArIHg7XHJcblx0XHRcdFx0Y29uc3QgaSA9IGNlbnRlckluZGV4RW5kICsgeDtcclxuXHJcblx0XHRcdFx0aWYgKCB0b3AgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gZmFjZSB0b3BcclxuXHJcblx0XHRcdFx0XHRpbmRpY2VzLnB1c2goIGksIGkgKyAxLCBjICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gZmFjZSBib3R0b21cclxuXHJcblx0XHRcdFx0XHRpbmRpY2VzLnB1c2goIGkgKyAxLCBpLCBjICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Z3JvdXBDb3VudCArPSAzO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gYWRkIGEgZ3JvdXAgdG8gdGhlIGdlb21ldHJ5LiB0aGlzIHdpbGwgZW5zdXJlIG11bHRpIG1hdGVyaWFsIHN1cHBvcnRcclxuXHJcblx0XHRcdHNjb3BlLmFkZEdyb3VwKCBncm91cFN0YXJ0LCBncm91cENvdW50LCB0b3AgPT09IHRydWUgPyAxIDogMiApO1xyXG5cclxuXHRcdFx0Ly8gY2FsY3VsYXRlIG5ldyBzdGFydCB2YWx1ZSBmb3IgZ3JvdXBzXHJcblxyXG5cdFx0XHRncm91cFN0YXJ0ICs9IGdyb3VwQ291bnQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLnBhcmFtZXRlcnMgPSBPYmplY3QuYXNzaWduKCB7fSwgc291cmNlLnBhcmFtZXRlcnMgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGYWN0b3J5IG1ldGhvZCBmb3IgY3JlYXRpbmcgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBmcm9tIHRoZSBnaXZlblxyXG5cdCAqIEpTT04gb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBBIEpTT04gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc2VyaWFsaXplZCBnZW9tZXRyeS5cclxuXHQgKiBAcmV0dXJuIHtDeWxpbmRlckdlb21ldHJ5fSBBIG5ldyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzdGF0aWMgZnJvbUpTT04oIGRhdGEgKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBDeWxpbmRlckdlb21ldHJ5KCBkYXRhLnJhZGl1c1RvcCwgZGF0YS5yYWRpdXNCb3R0b20sIGRhdGEuaGVpZ2h0LCBkYXRhLnJhZGlhbFNlZ21lbnRzLCBkYXRhLmhlaWdodFNlZ21lbnRzLCBkYXRhLm9wZW5FbmRlZCwgZGF0YS50aGV0YVN0YXJ0LCBkYXRhLnRoZXRhTGVuZ3RoICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBDeWxpbmRlckdlb21ldHJ5IH07XHJcbiIsImltcG9ydCB7IEN5bGluZGVyR2VvbWV0cnkgfSBmcm9tICcuL0N5bGluZGVyR2VvbWV0cnkuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgZ2VvbWV0cnkgY2xhc3MgZm9yIHJlcHJlc2VudGluZyBhIGNvbmUuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGdlb21ldHJ5ID0gbmV3IFRIUkVFLkNvbmVHZW9tZXRyeSggNSwgMjAsIDMyICk7XHJcbiAqIGNvbnN0IG1hdGVyaWFsID0gbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiAweGZmZmYwMCB9ICk7XHJcbiAqIGNvbnN0IGNvbmUgPSBuZXcgVEhSRUUuTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuICogc2NlbmUuYWRkKCBjb25lICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQ3lsaW5kZXJHZW9tZXRyeVxyXG4gKi9cclxuY2xhc3MgQ29uZUdlb21ldHJ5IGV4dGVuZHMgQ3lsaW5kZXJHZW9tZXRyeSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgY29uZSBnZW9tZXRyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbcmFkaXVzPTFdIC0gUmFkaXVzIG9mIHRoZSBjb25lIGJhc2UuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtoZWlnaHQ9MV0gLSBIZWlnaHQgb2YgdGhlIGNvbmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpYWxTZWdtZW50cz0zMl0gLSBOdW1iZXIgb2Ygc2VnbWVudGVkIGZhY2VzIGFyb3VuZCB0aGUgY2lyY3VtZmVyZW5jZSBvZiB0aGUgY29uZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2hlaWdodFNlZ21lbnRzPTFdIC0gTnVtYmVyIG9mIHJvd3Mgb2YgZmFjZXMgYWxvbmcgdGhlIGhlaWdodCBvZiB0aGUgY29uZS5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcGVuRW5kZWQ9ZmFsc2VdIC0gV2hldGhlciB0aGUgYmFzZSBvZiB0aGUgY29uZSBpcyBvcGVuIG9yIGNhcHBlZC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3RoZXRhU3RhcnQ9MF0gLSBTdGFydCBhbmdsZSBmb3IgZmlyc3Qgc2VnbWVudCwgaW4gcmFkaWFucy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3RoZXRhTGVuZ3RoPU1hdGguUEkqMl0gLSBUaGUgY2VudHJhbCBhbmdsZSwgb2Z0ZW4gY2FsbGVkIHRoZXRhLCBvZiB0aGUgY2lyY3VsYXIgc2VjdG9yLCBpbiByYWRpYW5zLlxyXG5cdCAqIFRoZSBkZWZhdWx0IHZhbHVlIHJlc3VsdHMgaW4gYSBjb21wbGV0ZSBjb25lLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCByYWRpdXMgPSAxLCBoZWlnaHQgPSAxLCByYWRpYWxTZWdtZW50cyA9IDMyLCBoZWlnaHRTZWdtZW50cyA9IDEsIG9wZW5FbmRlZCA9IGZhbHNlLCB0aGV0YVN0YXJ0ID0gMCwgdGhldGFMZW5ndGggPSBNYXRoLlBJICogMiApIHtcclxuXHJcblx0XHRzdXBlciggMCwgcmFkaXVzLCBoZWlnaHQsIHJhZGlhbFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgb3BlbkVuZGVkLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdDb25lR2VvbWV0cnknO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG9sZHMgdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMgdGhhdCBoYXZlIGJlZW5cclxuXHRcdCAqIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGdlb21ldHJ5LiBBbnkgbW9kaWZpY2F0aW9uXHJcblx0XHQgKiBhZnRlciBpbnN0YW50aWF0aW9uIGRvZXMgbm90IGNoYW5nZSB0aGUgZ2VvbWV0cnkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0ge1xyXG5cdFx0XHRyYWRpdXM6IHJhZGl1cyxcclxuXHRcdFx0aGVpZ2h0OiBoZWlnaHQsXHJcblx0XHRcdHJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cyxcclxuXHRcdFx0aGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzLFxyXG5cdFx0XHRvcGVuRW5kZWQ6IG9wZW5FbmRlZCxcclxuXHRcdFx0dGhldGFTdGFydDogdGhldGFTdGFydCxcclxuXHRcdFx0dGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoXHJcblx0XHR9O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGZyb20gdGhlIGdpdmVuXHJcblx0ICogSlNPTiBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIEEgSlNPTiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzZXJpYWxpemVkIGdlb21ldHJ5LlxyXG5cdCAqIEByZXR1cm4ge0NvbmVHZW9tZXRyeX0gQSBuZXcgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c3RhdGljIGZyb21KU09OKCBkYXRhICkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgQ29uZUdlb21ldHJ5KCBkYXRhLnJhZGl1cywgZGF0YS5oZWlnaHQsIGRhdGEucmFkaWFsU2VnbWVudHMsIGRhdGEuaGVpZ2h0U2VnbWVudHMsIGRhdGEub3BlbkVuZGVkLCBkYXRhLnRoZXRhU3RhcnQsIGRhdGEudGhldGFMZW5ndGggKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgQ29uZUdlb21ldHJ5IH07XHJcbiIsImltcG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9CdWZmZXJHZW9tZXRyeS5qcyc7XHJcbmltcG9ydCB7IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IyLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIHBvbHloZWRyb24gaXMgYSBzb2xpZCBpbiB0aHJlZSBkaW1lbnNpb25zIHdpdGggZmxhdCBmYWNlcy4gVGhpcyBjbGFzc1xyXG4gKiB3aWxsIHRha2UgYW4gYXJyYXkgb2YgdmVydGljZXMsIHByb2plY3QgdGhlbSBvbnRvIGEgc3BoZXJlLCBhbmQgdGhlblxyXG4gKiBkaXZpZGUgdGhlbSB1cCB0byB0aGUgZGVzaXJlZCBsZXZlbCBvZiBkZXRhaWwuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBCdWZmZXJHZW9tZXRyeVxyXG4gKi9cclxuY2xhc3MgUG9seWhlZHJvbkdlb21ldHJ5IGV4dGVuZHMgQnVmZmVyR2VvbWV0cnkge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHBvbHloZWRyb24gZ2VvbWV0cnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IFt2ZXJ0aWNlc10gLSBBIGZsYXQgYXJyYXkgb2YgdmVydGljZXMgZGVzY3JpYmluZyB0aGUgYmFzZSBzaGFwZS5cclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IFtpbmRpY2VzXSAtIEEgZmxhdCBhcnJheSBvZiBpbmRpY2VzIGRlc2NyaWJpbmcgdGhlIGJhc2Ugc2hhcGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpdXM9MV0gLSBUaGUgcmFkaXVzIG9mIHRoZSBzaGFwZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2RldGFpbD0wXSAtIEhvdyBtYW55IGxldmVscyB0byBzdWJkaXZpZGUgdGhlIGdlb21ldHJ5LiBUaGUgbW9yZSBkZXRhaWwsIHRoZSBzbW9vdGhlciB0aGUgc2hhcGUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHZlcnRpY2VzID0gW10sIGluZGljZXMgPSBbXSwgcmFkaXVzID0gMSwgZGV0YWlsID0gMCApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdQb2x5aGVkcm9uR2VvbWV0cnknO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG9sZHMgdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMgdGhhdCBoYXZlIGJlZW5cclxuXHRcdCAqIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGdlb21ldHJ5LiBBbnkgbW9kaWZpY2F0aW9uXHJcblx0XHQgKiBhZnRlciBpbnN0YW50aWF0aW9uIGRvZXMgbm90IGNoYW5nZSB0aGUgZ2VvbWV0cnkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0ge1xyXG5cdFx0XHR2ZXJ0aWNlczogdmVydGljZXMsXHJcblx0XHRcdGluZGljZXM6IGluZGljZXMsXHJcblx0XHRcdHJhZGl1czogcmFkaXVzLFxyXG5cdFx0XHRkZXRhaWw6IGRldGFpbFxyXG5cdFx0fTtcclxuXHJcblx0XHQvLyBkZWZhdWx0IGJ1ZmZlciBkYXRhXHJcblxyXG5cdFx0Y29uc3QgdmVydGV4QnVmZmVyID0gW107XHJcblx0XHRjb25zdCB1dkJ1ZmZlciA9IFtdO1xyXG5cclxuXHRcdC8vIHRoZSBzdWJkaXZpc2lvbiBjcmVhdGVzIHRoZSB2ZXJ0ZXggYnVmZmVyIGRhdGFcclxuXHJcblx0XHRzdWJkaXZpZGUoIGRldGFpbCApO1xyXG5cclxuXHRcdC8vIGFsbCB2ZXJ0aWNlcyBzaG91bGQgbGllIG9uIGEgY29uY2VwdHVhbCBzcGhlcmUgd2l0aCBhIGdpdmVuIHJhZGl1c1xyXG5cclxuXHRcdGFwcGx5UmFkaXVzKCByYWRpdXMgKTtcclxuXHJcblx0XHQvLyBmaW5hbGx5LCBjcmVhdGUgdGhlIHV2IGRhdGFcclxuXHJcblx0XHRnZW5lcmF0ZVVWcygpO1xyXG5cclxuXHRcdC8vIGJ1aWxkIG5vbi1pbmRleGVkIGdlb21ldHJ5XHJcblxyXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0ZXhCdWZmZXIsIDMgKSApO1xyXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGV4QnVmZmVyLnNsaWNlKCksIDMgKSApO1xyXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dkJ1ZmZlciwgMiApICk7XHJcblxyXG5cdFx0aWYgKCBkZXRhaWwgPT09IDAgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7IC8vIGZsYXQgbm9ybWFsc1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR0aGlzLm5vcm1hbGl6ZU5vcm1hbHMoKTsgLy8gc21vb3RoIG5vcm1hbHNcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gaGVscGVyIGZ1bmN0aW9uc1xyXG5cclxuXHRcdGZ1bmN0aW9uIHN1YmRpdmlkZSggZGV0YWlsICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYSA9IG5ldyBWZWN0b3IzKCk7XHJcblx0XHRcdGNvbnN0IGIgPSBuZXcgVmVjdG9yMygpO1xyXG5cdFx0XHRjb25zdCBjID0gbmV3IFZlY3RvcjMoKTtcclxuXHJcblx0XHRcdC8vIGl0ZXJhdGUgb3ZlciBhbGwgZmFjZXMgYW5kIGFwcGx5IGEgc3ViZGl2aXNpb24gd2l0aCB0aGUgZ2l2ZW4gZGV0YWlsIHZhbHVlXHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBpbmRpY2VzLmxlbmd0aDsgaSArPSAzICkge1xyXG5cclxuXHRcdFx0XHQvLyBnZXQgdGhlIHZlcnRpY2VzIG9mIHRoZSBmYWNlXHJcblxyXG5cdFx0XHRcdGdldFZlcnRleEJ5SW5kZXgoIGluZGljZXNbIGkgKyAwIF0sIGEgKTtcclxuXHRcdFx0XHRnZXRWZXJ0ZXhCeUluZGV4KCBpbmRpY2VzWyBpICsgMSBdLCBiICk7XHJcblx0XHRcdFx0Z2V0VmVydGV4QnlJbmRleCggaW5kaWNlc1sgaSArIDIgXSwgYyApO1xyXG5cclxuXHRcdFx0XHQvLyBwZXJmb3JtIHN1YmRpdmlzaW9uXHJcblxyXG5cdFx0XHRcdHN1YmRpdmlkZUZhY2UoIGEsIGIsIGMsIGRldGFpbCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiBzdWJkaXZpZGVGYWNlKCBhLCBiLCBjLCBkZXRhaWwgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBjb2xzID0gZGV0YWlsICsgMTtcclxuXHJcblx0XHRcdC8vIHdlIHVzZSB0aGlzIG11bHRpZGltZW5zaW9uYWwgYXJyYXkgYXMgYSBkYXRhIHN0cnVjdHVyZSBmb3IgY3JlYXRpbmcgdGhlIHN1YmRpdmlzaW9uXHJcblxyXG5cdFx0XHRjb25zdCB2ID0gW107XHJcblxyXG5cdFx0XHQvLyBjb25zdHJ1Y3QgYWxsIG9mIHRoZSB2ZXJ0aWNlcyBmb3IgdGhpcyBzdWJkaXZpc2lvblxyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDw9IGNvbHM7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdHZbIGkgXSA9IFtdO1xyXG5cclxuXHRcdFx0XHRjb25zdCBhaiA9IGEuY2xvbmUoKS5sZXJwKCBjLCBpIC8gY29scyApO1xyXG5cdFx0XHRcdGNvbnN0IGJqID0gYi5jbG9uZSgpLmxlcnAoIGMsIGkgLyBjb2xzICk7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHJvd3MgPSBjb2xzIC0gaTtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGogPSAwOyBqIDw9IHJvd3M7IGogKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBqID09PSAwICYmIGkgPT09IGNvbHMgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHR2WyBpIF1bIGogXSA9IGFqO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHR2WyBpIF1bIGogXSA9IGFqLmNsb25lKCkubGVycCggYmosIGogLyByb3dzICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBjb25zdHJ1Y3QgYWxsIG9mIHRoZSBmYWNlc1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgY29sczsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGogPSAwOyBqIDwgMiAqICggY29scyAtIGkgKSAtIDE7IGogKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgayA9IE1hdGguZmxvb3IoIGogLyAyICk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBqICUgMiA9PT0gMCApIHtcclxuXHJcblx0XHRcdFx0XHRcdHB1c2hWZXJ0ZXgoIHZbIGkgXVsgayArIDEgXSApO1xyXG5cdFx0XHRcdFx0XHRwdXNoVmVydGV4KCB2WyBpICsgMSBdWyBrIF0gKTtcclxuXHRcdFx0XHRcdFx0cHVzaFZlcnRleCggdlsgaSBdWyBrIF0gKTtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0cHVzaFZlcnRleCggdlsgaSBdWyBrICsgMSBdICk7XHJcblx0XHRcdFx0XHRcdHB1c2hWZXJ0ZXgoIHZbIGkgKyAxIF1bIGsgKyAxIF0gKTtcclxuXHRcdFx0XHRcdFx0cHVzaFZlcnRleCggdlsgaSArIDEgXVsgayBdICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIGFwcGx5UmFkaXVzKCByYWRpdXMgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xyXG5cclxuXHRcdFx0Ly8gaXRlcmF0ZSBvdmVyIHRoZSBlbnRpcmUgYnVmZmVyIGFuZCBhcHBseSB0aGUgcmFkaXVzIHRvIGVhY2ggdmVydGV4XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB2ZXJ0ZXhCdWZmZXIubGVuZ3RoOyBpICs9IDMgKSB7XHJcblxyXG5cdFx0XHRcdHZlcnRleC54ID0gdmVydGV4QnVmZmVyWyBpICsgMCBdO1xyXG5cdFx0XHRcdHZlcnRleC55ID0gdmVydGV4QnVmZmVyWyBpICsgMSBdO1xyXG5cdFx0XHRcdHZlcnRleC56ID0gdmVydGV4QnVmZmVyWyBpICsgMiBdO1xyXG5cclxuXHRcdFx0XHR2ZXJ0ZXgubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoIHJhZGl1cyApO1xyXG5cclxuXHRcdFx0XHR2ZXJ0ZXhCdWZmZXJbIGkgKyAwIF0gPSB2ZXJ0ZXgueDtcclxuXHRcdFx0XHR2ZXJ0ZXhCdWZmZXJbIGkgKyAxIF0gPSB2ZXJ0ZXgueTtcclxuXHRcdFx0XHR2ZXJ0ZXhCdWZmZXJbIGkgKyAyIF0gPSB2ZXJ0ZXguejtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0ZnVuY3Rpb24gZ2VuZXJhdGVVVnMoKSB7XHJcblxyXG5cdFx0XHRjb25zdCB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdmVydGV4QnVmZmVyLmxlbmd0aDsgaSArPSAzICkge1xyXG5cclxuXHRcdFx0XHR2ZXJ0ZXgueCA9IHZlcnRleEJ1ZmZlclsgaSArIDAgXTtcclxuXHRcdFx0XHR2ZXJ0ZXgueSA9IHZlcnRleEJ1ZmZlclsgaSArIDEgXTtcclxuXHRcdFx0XHR2ZXJ0ZXgueiA9IHZlcnRleEJ1ZmZlclsgaSArIDIgXTtcclxuXHJcblx0XHRcdFx0Y29uc3QgdSA9IGF6aW11dGgoIHZlcnRleCApIC8gMiAvIE1hdGguUEkgKyAwLjU7XHJcblx0XHRcdFx0Y29uc3QgdiA9IGluY2xpbmF0aW9uKCB2ZXJ0ZXggKSAvIE1hdGguUEkgKyAwLjU7XHJcblx0XHRcdFx0dXZCdWZmZXIucHVzaCggdSwgMSAtIHYgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvcnJlY3RVVnMoKTtcclxuXHJcblx0XHRcdGNvcnJlY3RTZWFtKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIGNvcnJlY3RTZWFtKCkge1xyXG5cclxuXHRcdFx0Ly8gaGFuZGxlIGNhc2Ugd2hlbiBmYWNlIHN0cmFkZGxlcyB0aGUgc2VhbSwgc2VlICMzMjY5XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB1dkJ1ZmZlci5sZW5ndGg7IGkgKz0gNiApIHtcclxuXHJcblx0XHRcdFx0Ly8gdXYgZGF0YSBvZiBhIHNpbmdsZSBmYWNlXHJcblxyXG5cdFx0XHRcdGNvbnN0IHgwID0gdXZCdWZmZXJbIGkgKyAwIF07XHJcblx0XHRcdFx0Y29uc3QgeDEgPSB1dkJ1ZmZlclsgaSArIDIgXTtcclxuXHRcdFx0XHRjb25zdCB4MiA9IHV2QnVmZmVyWyBpICsgNCBdO1xyXG5cclxuXHRcdFx0XHRjb25zdCBtYXggPSBNYXRoLm1heCggeDAsIHgxLCB4MiApO1xyXG5cdFx0XHRcdGNvbnN0IG1pbiA9IE1hdGgubWluKCB4MCwgeDEsIHgyICk7XHJcblxyXG5cdFx0XHRcdC8vIDAuOSBpcyBzb21ld2hhdCBhcmJpdHJhcnlcclxuXHJcblx0XHRcdFx0aWYgKCBtYXggPiAwLjkgJiYgbWluIDwgMC4xICkge1xyXG5cclxuXHRcdFx0XHRcdGlmICggeDAgPCAwLjIgKSB1dkJ1ZmZlclsgaSArIDAgXSArPSAxO1xyXG5cdFx0XHRcdFx0aWYgKCB4MSA8IDAuMiApIHV2QnVmZmVyWyBpICsgMiBdICs9IDE7XHJcblx0XHRcdFx0XHRpZiAoIHgyIDwgMC4yICkgdXZCdWZmZXJbIGkgKyA0IF0gKz0gMTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiBwdXNoVmVydGV4KCB2ZXJ0ZXggKSB7XHJcblxyXG5cdFx0XHR2ZXJ0ZXhCdWZmZXIucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiBnZXRWZXJ0ZXhCeUluZGV4KCBpbmRleCwgdmVydGV4ICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgc3RyaWRlID0gaW5kZXggKiAzO1xyXG5cclxuXHRcdFx0dmVydGV4LnggPSB2ZXJ0aWNlc1sgc3RyaWRlICsgMCBdO1xyXG5cdFx0XHR2ZXJ0ZXgueSA9IHZlcnRpY2VzWyBzdHJpZGUgKyAxIF07XHJcblx0XHRcdHZlcnRleC56ID0gdmVydGljZXNbIHN0cmlkZSArIDIgXTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0ZnVuY3Rpb24gY29ycmVjdFVWcygpIHtcclxuXHJcblx0XHRcdGNvbnN0IGEgPSBuZXcgVmVjdG9yMygpO1xyXG5cdFx0XHRjb25zdCBiID0gbmV3IFZlY3RvcjMoKTtcclxuXHRcdFx0Y29uc3QgYyA9IG5ldyBWZWN0b3IzKCk7XHJcblxyXG5cdFx0XHRjb25zdCBjZW50cm9pZCA9IG5ldyBWZWN0b3IzKCk7XHJcblxyXG5cdFx0XHRjb25zdCB1dkEgPSBuZXcgVmVjdG9yMigpO1xyXG5cdFx0XHRjb25zdCB1dkIgPSBuZXcgVmVjdG9yMigpO1xyXG5cdFx0XHRjb25zdCB1dkMgPSBuZXcgVmVjdG9yMigpO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBqID0gMDsgaSA8IHZlcnRleEJ1ZmZlci5sZW5ndGg7IGkgKz0gOSwgaiArPSA2ICkge1xyXG5cclxuXHRcdFx0XHRhLnNldCggdmVydGV4QnVmZmVyWyBpICsgMCBdLCB2ZXJ0ZXhCdWZmZXJbIGkgKyAxIF0sIHZlcnRleEJ1ZmZlclsgaSArIDIgXSApO1xyXG5cdFx0XHRcdGIuc2V0KCB2ZXJ0ZXhCdWZmZXJbIGkgKyAzIF0sIHZlcnRleEJ1ZmZlclsgaSArIDQgXSwgdmVydGV4QnVmZmVyWyBpICsgNSBdICk7XHJcblx0XHRcdFx0Yy5zZXQoIHZlcnRleEJ1ZmZlclsgaSArIDYgXSwgdmVydGV4QnVmZmVyWyBpICsgNyBdLCB2ZXJ0ZXhCdWZmZXJbIGkgKyA4IF0gKTtcclxuXHJcblx0XHRcdFx0dXZBLnNldCggdXZCdWZmZXJbIGogKyAwIF0sIHV2QnVmZmVyWyBqICsgMSBdICk7XHJcblx0XHRcdFx0dXZCLnNldCggdXZCdWZmZXJbIGogKyAyIF0sIHV2QnVmZmVyWyBqICsgMyBdICk7XHJcblx0XHRcdFx0dXZDLnNldCggdXZCdWZmZXJbIGogKyA0IF0sIHV2QnVmZmVyWyBqICsgNSBdICk7XHJcblxyXG5cdFx0XHRcdGNlbnRyb2lkLmNvcHkoIGEgKS5hZGQoIGIgKS5hZGQoIGMgKS5kaXZpZGVTY2FsYXIoIDMgKTtcclxuXHJcblx0XHRcdFx0Y29uc3QgYXppID0gYXppbXV0aCggY2VudHJvaWQgKTtcclxuXHJcblx0XHRcdFx0Y29ycmVjdFVWKCB1dkEsIGogKyAwLCBhLCBhemkgKTtcclxuXHRcdFx0XHRjb3JyZWN0VVYoIHV2QiwgaiArIDIsIGIsIGF6aSApO1xyXG5cdFx0XHRcdGNvcnJlY3RVViggdXZDLCBqICsgNCwgYywgYXppICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIGNvcnJlY3RVViggdXYsIHN0cmlkZSwgdmVjdG9yLCBhemltdXRoICkge1xyXG5cclxuXHRcdFx0aWYgKCAoIGF6aW11dGggPCAwICkgJiYgKCB1di54ID09PSAxICkgKSB7XHJcblxyXG5cdFx0XHRcdHV2QnVmZmVyWyBzdHJpZGUgXSA9IHV2LnggLSAxO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCAoIHZlY3Rvci54ID09PSAwICkgJiYgKCB2ZWN0b3IueiA9PT0gMCApICkge1xyXG5cclxuXHRcdFx0XHR1dkJ1ZmZlclsgc3RyaWRlIF0gPSBhemltdXRoIC8gMiAvIE1hdGguUEkgKyAwLjU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEFuZ2xlIGFyb3VuZCB0aGUgWSBheGlzLCBjb3VudGVyLWNsb2Nrd2lzZSB3aGVuIGxvb2tpbmcgZnJvbSBhYm92ZS5cclxuXHJcblx0XHRmdW5jdGlvbiBhemltdXRoKCB2ZWN0b3IgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gTWF0aC5hdGFuMiggdmVjdG9yLnosIC0gdmVjdG9yLnggKTtcclxuXHJcblx0XHR9XHJcblxyXG5cclxuXHRcdC8vIEFuZ2xlIGFib3ZlIHRoZSBYWiBwbGFuZS5cclxuXHJcblx0XHRmdW5jdGlvbiBpbmNsaW5hdGlvbiggdmVjdG9yICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIE1hdGguYXRhbjIoIC0gdmVjdG9yLnksIE1hdGguc3FydCggKCB2ZWN0b3IueCAqIHZlY3Rvci54ICkgKyAoIHZlY3Rvci56ICogdmVjdG9yLnogKSApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLnBhcmFtZXRlcnMgPSBPYmplY3QuYXNzaWduKCB7fSwgc291cmNlLnBhcmFtZXRlcnMgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGYWN0b3J5IG1ldGhvZCBmb3IgY3JlYXRpbmcgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBmcm9tIHRoZSBnaXZlblxyXG5cdCAqIEpTT04gb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBBIEpTT04gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc2VyaWFsaXplZCBnZW9tZXRyeS5cclxuXHQgKiBAcmV0dXJuIHtQb2x5aGVkcm9uR2VvbWV0cnl9IEEgbmV3IGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBmcm9tSlNPTiggZGF0YSApIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IFBvbHloZWRyb25HZW9tZXRyeSggZGF0YS52ZXJ0aWNlcywgZGF0YS5pbmRpY2VzLCBkYXRhLnJhZGl1cywgZGF0YS5kZXRhaWxzICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFBvbHloZWRyb25HZW9tZXRyeSB9O1xyXG4iLCJpbXBvcnQgeyBQb2x5aGVkcm9uR2VvbWV0cnkgfSBmcm9tICcuL1BvbHloZWRyb25HZW9tZXRyeS5qcyc7XHJcblxyXG4vKipcclxuICogQSBnZW9tZXRyeSBjbGFzcyBmb3IgcmVwcmVzZW50aW5nIGEgZG9kZWNhaGVkcm9uLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBnZW9tZXRyeSA9IG5ldyBUSFJFRS5Eb2RlY2FoZWRyb25HZW9tZXRyeSgpO1xyXG4gKiBjb25zdCBtYXRlcmlhbCA9IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogMHhmZmZmMDAgfSApO1xyXG4gKiBjb25zdCBkb2RlY2FoZWRyb24gPSBuZXcgVEhSRUUuTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcbiAqIHNjZW5lLmFkZCggZG9kZWNhaGVkcm9uICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgUG9seWhlZHJvbkdlb21ldHJ5XHJcbiAqL1xyXG5jbGFzcyBEb2RlY2FoZWRyb25HZW9tZXRyeSBleHRlbmRzIFBvbHloZWRyb25HZW9tZXRyeSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgZG9kZWNhaGVkcm9uIGdlb21ldHJ5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpdXM9MV0gLSBSYWRpdXMgb2YgdGhlIGRvZGVjYWhlZHJvbi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2RldGFpbD0wXSAtIFNldHRpbmcgdGhpcyB0byBhIHZhbHVlIGdyZWF0ZXIgdGhhbiBgMGAgYWRkcyB2ZXJ0aWNlcyBtYWtpbmcgaXQgbm8gbG9uZ2VyIGEgZG9kZWNhaGVkcm9uLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCByYWRpdXMgPSAxLCBkZXRhaWwgPSAwICkge1xyXG5cclxuXHRcdGNvbnN0IHQgPSAoIDEgKyBNYXRoLnNxcnQoIDUgKSApIC8gMjtcclxuXHRcdGNvbnN0IHIgPSAxIC8gdDtcclxuXHJcblx0XHRjb25zdCB2ZXJ0aWNlcyA9IFtcclxuXHJcblx0XHRcdC8vICjCsTEsIMKxMSwgwrExKVxyXG5cdFx0XHQtIDEsIC0gMSwgLSAxLFx0LSAxLCAtIDEsIDEsXHJcblx0XHRcdC0gMSwgMSwgLSAxLCAtIDEsIDEsIDEsXHJcblx0XHRcdDEsIC0gMSwgLSAxLCAxLCAtIDEsIDEsXHJcblx0XHRcdDEsIDEsIC0gMSwgMSwgMSwgMSxcclxuXHJcblx0XHRcdC8vICgwLCDCsTEvz4YsIMKxz4YpXHJcblx0XHRcdDAsIC0gciwgLSB0LCAwLCAtIHIsIHQsXHJcblx0XHRcdDAsIHIsIC0gdCwgMCwgciwgdCxcclxuXHJcblx0XHRcdC8vICjCsTEvz4YsIMKxz4YsIDApXHJcblx0XHRcdC0gciwgLSB0LCAwLCAtIHIsIHQsIDAsXHJcblx0XHRcdHIsIC0gdCwgMCwgciwgdCwgMCxcclxuXHJcblx0XHRcdC8vICjCsc+GLCAwLCDCsTEvz4YpXHJcblx0XHRcdC0gdCwgMCwgLSByLCB0LCAwLCAtIHIsXHJcblx0XHRcdC0gdCwgMCwgciwgdCwgMCwgclxyXG5cdFx0XTtcclxuXHJcblx0XHRjb25zdCBpbmRpY2VzID0gW1xyXG5cdFx0XHQzLCAxMSwgNywgXHQzLCA3LCAxNSwgXHQzLCAxNSwgMTMsXHJcblx0XHRcdDcsIDE5LCAxNywgXHQ3LCAxNywgNiwgXHQ3LCA2LCAxNSxcclxuXHRcdFx0MTcsIDQsIDgsIFx0MTcsIDgsIDEwLCBcdDE3LCAxMCwgNixcclxuXHRcdFx0OCwgMCwgMTYsIFx0OCwgMTYsIDIsIFx0OCwgMiwgMTAsXHJcblx0XHRcdDAsIDEyLCAxLCBcdDAsIDEsIDE4LCBcdDAsIDE4LCAxNixcclxuXHRcdFx0NiwgMTAsIDIsIFx0NiwgMiwgMTMsIFx0NiwgMTMsIDE1LFxyXG5cdFx0XHQyLCAxNiwgMTgsIFx0MiwgMTgsIDMsIFx0MiwgMywgMTMsXHJcblx0XHRcdDE4LCAxLCA5LCBcdDE4LCA5LCAxMSwgXHQxOCwgMTEsIDMsXHJcblx0XHRcdDQsIDE0LCAxMiwgXHQ0LCAxMiwgMCwgXHQ0LCAwLCA4LFxyXG5cdFx0XHQxMSwgOSwgNSwgXHQxMSwgNSwgMTksIFx0MTEsIDE5LCA3LFxyXG5cdFx0XHQxOSwgNSwgMTQsIFx0MTksIDE0LCA0LCBcdDE5LCA0LCAxNyxcclxuXHRcdFx0MSwgMTIsIDE0LCBcdDEsIDE0LCA1LCBcdDEsIDUsIDlcclxuXHRcdF07XHJcblxyXG5cdFx0c3VwZXIoIHZlcnRpY2VzLCBpbmRpY2VzLCByYWRpdXMsIGRldGFpbCApO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdEb2RlY2FoZWRyb25HZW9tZXRyeSc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb2xkcyB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVycyB0aGF0IGhhdmUgYmVlblxyXG5cdFx0ICogdXNlZCB0byBnZW5lcmF0ZSB0aGUgZ2VvbWV0cnkuIEFueSBtb2RpZmljYXRpb25cclxuXHRcdCAqIGFmdGVyIGluc3RhbnRpYXRpb24gZG9lcyBub3QgY2hhbmdlIHRoZSBnZW9tZXRyeS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBhcmFtZXRlcnMgPSB7XHJcblx0XHRcdHJhZGl1czogcmFkaXVzLFxyXG5cdFx0XHRkZXRhaWw6IGRldGFpbFxyXG5cdFx0fTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGYWN0b3J5IG1ldGhvZCBmb3IgY3JlYXRpbmcgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBmcm9tIHRoZSBnaXZlblxyXG5cdCAqIEpTT04gb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBBIEpTT04gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc2VyaWFsaXplZCBnZW9tZXRyeS5cclxuXHQgKiBAcmV0dXJuIHtEb2RlY2FoZWRyb25HZW9tZXRyeX0gQSBuZXcgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c3RhdGljIGZyb21KU09OKCBkYXRhICkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgRG9kZWNhaGVkcm9uR2VvbWV0cnkoIGRhdGEucmFkaXVzLCBkYXRhLmRldGFpbCApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgRG9kZWNhaGVkcm9uR2VvbWV0cnkgfTtcclxuIiwiaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcclxuaW1wb3J0IHsgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyQXR0cmlidXRlLmpzJztcclxuaW1wb3J0IHsgREVHMlJBRCB9IGZyb20gJy4uL21hdGgvTWF0aFV0aWxzLmpzJztcclxuaW1wb3J0IHsgVHJpYW5nbGUgfSBmcm9tICcuLi9tYXRoL1RyaWFuZ2xlLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcblxyXG5jb25zdCBfdjAgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF92MSA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX25vcm1hbCA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX3RyaWFuZ2xlID0gLypAX19QVVJFX18qLyBuZXcgVHJpYW5nbGUoKTtcclxuXHJcbi8qKlxyXG4gKiBDYW4gYmUgdXNlZCBhcyBhIGhlbHBlciBvYmplY3QgdG8gdmlldyB0aGUgZWRnZXMgb2YgYSBnZW9tZXRyeS5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgZ2VvbWV0cnkgPSBuZXcgVEhSRUUuQm94R2VvbWV0cnkoKTtcclxuICogY29uc3QgZWRnZXMgPSBuZXcgVEhSRUUuRWRnZXNHZW9tZXRyeSggZ2VvbWV0cnkgKTtcclxuICogY29uc3QgbGluZSA9IG5ldyBUSFJFRS5MaW5lU2VnbWVudHMoIGVkZ2VzICk7XHJcbiAqIHNjZW5lLmFkZCggbGluZSApO1xyXG4gKiBgYGBcclxuICpcclxuICogTm90ZTogSXQgaXMgbm90IHlldCBwb3NzaWJsZSB0byBzZXJpYWxpemUvZGVzZXJpYWxpemUgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBCdWZmZXJHZW9tZXRyeVxyXG4gKi9cclxuY2xhc3MgRWRnZXNHZW9tZXRyeSBleHRlbmRzIEJ1ZmZlckdlb21ldHJ5IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBlZGdlcyBnZW9tZXRyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7P0J1ZmZlckdlb21ldHJ5fSBbZ2VvbWV0cnk9bnVsbF0gLSBUaGUgZ2VvbWV0cnkuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt0aHJlc2hvbGRBbmdsZT0xXSAtIEFuIGVkZ2UgaXMgb25seSByZW5kZXJlZCBpZiB0aGUgYW5nbGUgKGluIGRlZ3JlZXMpXHJcblx0ICogYmV0d2VlbiB0aGUgZmFjZSBub3JtYWxzIG9mIHRoZSBhZGpvaW5pbmcgZmFjZXMgZXhjZWVkcyB0aGlzIHZhbHVlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBnZW9tZXRyeSA9IG51bGwsIHRocmVzaG9sZEFuZ2xlID0gMSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdFZGdlc0dlb21ldHJ5JztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvbGRzIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzIHRoYXQgaGF2ZSBiZWVuXHJcblx0XHQgKiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBnZW9tZXRyeS4gQW55IG1vZGlmaWNhdGlvblxyXG5cdFx0ICogYWZ0ZXIgaW5zdGFudGlhdGlvbiBkb2VzIG5vdCBjaGFuZ2UgdGhlIGdlb21ldHJ5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucGFyYW1ldGVycyA9IHtcclxuXHRcdFx0Z2VvbWV0cnk6IGdlb21ldHJ5LFxyXG5cdFx0XHR0aHJlc2hvbGRBbmdsZTogdGhyZXNob2xkQW5nbGVcclxuXHRcdH07XHJcblxyXG5cdFx0aWYgKCBnZW9tZXRyeSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGNvbnN0IHByZWNpc2lvblBvaW50cyA9IDQ7XHJcblx0XHRcdGNvbnN0IHByZWNpc2lvbiA9IE1hdGgucG93KCAxMCwgcHJlY2lzaW9uUG9pbnRzICk7XHJcblx0XHRcdGNvbnN0IHRocmVzaG9sZERvdCA9IE1hdGguY29zKCBERUcyUkFEICogdGhyZXNob2xkQW5nbGUgKTtcclxuXHJcblx0XHRcdGNvbnN0IGluZGV4QXR0ciA9IGdlb21ldHJ5LmdldEluZGV4KCk7XHJcblx0XHRcdGNvbnN0IHBvc2l0aW9uQXR0ciA9IGdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJyApO1xyXG5cdFx0XHRjb25zdCBpbmRleENvdW50ID0gaW5kZXhBdHRyID8gaW5kZXhBdHRyLmNvdW50IDogcG9zaXRpb25BdHRyLmNvdW50O1xyXG5cclxuXHRcdFx0Y29uc3QgaW5kZXhBcnIgPSBbIDAsIDAsIDAgXTtcclxuXHRcdFx0Y29uc3QgdmVydEtleXMgPSBbICdhJywgJ2InLCAnYycgXTtcclxuXHRcdFx0Y29uc3QgaGFzaGVzID0gbmV3IEFycmF5KCAzICk7XHJcblxyXG5cdFx0XHRjb25zdCBlZGdlRGF0YSA9IHt9O1xyXG5cdFx0XHRjb25zdCB2ZXJ0aWNlcyA9IFtdO1xyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBpbmRleENvdW50OyBpICs9IDMgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggaW5kZXhBdHRyICkge1xyXG5cclxuXHRcdFx0XHRcdGluZGV4QXJyWyAwIF0gPSBpbmRleEF0dHIuZ2V0WCggaSApO1xyXG5cdFx0XHRcdFx0aW5kZXhBcnJbIDEgXSA9IGluZGV4QXR0ci5nZXRYKCBpICsgMSApO1xyXG5cdFx0XHRcdFx0aW5kZXhBcnJbIDIgXSA9IGluZGV4QXR0ci5nZXRYKCBpICsgMiApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdGluZGV4QXJyWyAwIF0gPSBpO1xyXG5cdFx0XHRcdFx0aW5kZXhBcnJbIDEgXSA9IGkgKyAxO1xyXG5cdFx0XHRcdFx0aW5kZXhBcnJbIDIgXSA9IGkgKyAyO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGNvbnN0IHsgYSwgYiwgYyB9ID0gX3RyaWFuZ2xlO1xyXG5cdFx0XHRcdGEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyLCBpbmRleEFyclsgMCBdICk7XHJcblx0XHRcdFx0Yi5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbkF0dHIsIGluZGV4QXJyWyAxIF0gKTtcclxuXHRcdFx0XHRjLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uQXR0ciwgaW5kZXhBcnJbIDIgXSApO1xyXG5cdFx0XHRcdF90cmlhbmdsZS5nZXROb3JtYWwoIF9ub3JtYWwgKTtcclxuXHJcblx0XHRcdFx0Ly8gY3JlYXRlIGhhc2hlcyBmb3IgdGhlIGVkZ2UgZnJvbSB0aGUgdmVydGljZXNcclxuXHRcdFx0XHRoYXNoZXNbIDAgXSA9IGAkeyBNYXRoLnJvdW5kKCBhLnggKiBwcmVjaXNpb24gKSB9LCR7IE1hdGgucm91bmQoIGEueSAqIHByZWNpc2lvbiApIH0sJHsgTWF0aC5yb3VuZCggYS56ICogcHJlY2lzaW9uICkgfWA7XHJcblx0XHRcdFx0aGFzaGVzWyAxIF0gPSBgJHsgTWF0aC5yb3VuZCggYi54ICogcHJlY2lzaW9uICkgfSwkeyBNYXRoLnJvdW5kKCBiLnkgKiBwcmVjaXNpb24gKSB9LCR7IE1hdGgucm91bmQoIGIueiAqIHByZWNpc2lvbiApIH1gO1xyXG5cdFx0XHRcdGhhc2hlc1sgMiBdID0gYCR7IE1hdGgucm91bmQoIGMueCAqIHByZWNpc2lvbiApIH0sJHsgTWF0aC5yb3VuZCggYy55ICogcHJlY2lzaW9uICkgfSwkeyBNYXRoLnJvdW5kKCBjLnogKiBwcmVjaXNpb24gKSB9YDtcclxuXHJcblx0XHRcdFx0Ly8gc2tpcCBkZWdlbmVyYXRlIHRyaWFuZ2xlc1xyXG5cdFx0XHRcdGlmICggaGFzaGVzWyAwIF0gPT09IGhhc2hlc1sgMSBdIHx8IGhhc2hlc1sgMSBdID09PSBoYXNoZXNbIDIgXSB8fCBoYXNoZXNbIDIgXSA9PT0gaGFzaGVzWyAwIF0gKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29udGludWU7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Ly8gaXRlcmF0ZSBvdmVyIGV2ZXJ5IGVkZ2VcclxuXHRcdFx0XHRmb3IgKCBsZXQgaiA9IDA7IGogPCAzOyBqICsrICkge1xyXG5cclxuXHRcdFx0XHRcdC8vIGdldCB0aGUgZmlyc3QgYW5kIG5leHQgdmVydGV4IG1ha2luZyB1cCB0aGUgZWRnZVxyXG5cdFx0XHRcdFx0Y29uc3Qgak5leHQgPSAoIGogKyAxICkgJSAzO1xyXG5cdFx0XHRcdFx0Y29uc3QgdmVjSGFzaDAgPSBoYXNoZXNbIGogXTtcclxuXHRcdFx0XHRcdGNvbnN0IHZlY0hhc2gxID0gaGFzaGVzWyBqTmV4dCBdO1xyXG5cdFx0XHRcdFx0Y29uc3QgdjAgPSBfdHJpYW5nbGVbIHZlcnRLZXlzWyBqIF0gXTtcclxuXHRcdFx0XHRcdGNvbnN0IHYxID0gX3RyaWFuZ2xlWyB2ZXJ0S2V5c1sgak5leHQgXSBdO1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGhhc2ggPSBgJHsgdmVjSGFzaDAgfV8keyB2ZWNIYXNoMSB9YDtcclxuXHRcdFx0XHRcdGNvbnN0IHJldmVyc2VIYXNoID0gYCR7IHZlY0hhc2gxIH1fJHsgdmVjSGFzaDAgfWA7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCByZXZlcnNlSGFzaCBpbiBlZGdlRGF0YSAmJiBlZGdlRGF0YVsgcmV2ZXJzZUhhc2ggXSApIHtcclxuXHJcblx0XHRcdFx0XHRcdC8vIGlmIHdlIGZvdW5kIGEgc2libGluZyBlZGdlIGFkZCBpdCBpbnRvIHRoZSB2ZXJ0ZXggYXJyYXkgaWZcclxuXHRcdFx0XHRcdFx0Ly8gaXQgbWVldHMgdGhlIGFuZ2xlIHRocmVzaG9sZCBhbmQgZGVsZXRlIHRoZSBlZGdlIGZyb20gdGhlIG1hcC5cclxuXHRcdFx0XHRcdFx0aWYgKCBfbm9ybWFsLmRvdCggZWRnZURhdGFbIHJldmVyc2VIYXNoIF0ubm9ybWFsICkgPD0gdGhyZXNob2xkRG90ICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2MC54LCB2MC55LCB2MC56ICk7XHJcblx0XHRcdFx0XHRcdFx0dmVydGljZXMucHVzaCggdjEueCwgdjEueSwgdjEueiApO1xyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0ZWRnZURhdGFbIHJldmVyc2VIYXNoIF0gPSBudWxsO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoICEgKCBoYXNoIGluIGVkZ2VEYXRhICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBpZiB3ZSd2ZSBhbHJlYWR5IGdvdCBhbiBlZGdlIGhlcmUgdGhlbiBza2lwIGFkZGluZyBhIG5ldyBvbmVcclxuXHRcdFx0XHRcdFx0ZWRnZURhdGFbIGhhc2ggXSA9IHtcclxuXHJcblx0XHRcdFx0XHRcdFx0aW5kZXgwOiBpbmRleEFyclsgaiBdLFxyXG5cdFx0XHRcdFx0XHRcdGluZGV4MTogaW5kZXhBcnJbIGpOZXh0IF0sXHJcblx0XHRcdFx0XHRcdFx0bm9ybWFsOiBfbm9ybWFsLmNsb25lKCksXHJcblxyXG5cdFx0XHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gaXRlcmF0ZSBvdmVyIGFsbCByZW1haW5pbmcsIHVubWF0Y2hlZCBlZGdlcyBhbmQgYWRkIHRoZW0gdG8gdGhlIHZlcnRleCBhcnJheVxyXG5cdFx0XHRmb3IgKCBjb25zdCBrZXkgaW4gZWRnZURhdGEgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggZWRnZURhdGFbIGtleSBdICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHsgaW5kZXgwLCBpbmRleDEgfSA9IGVkZ2VEYXRhWyBrZXkgXTtcclxuXHRcdFx0XHRcdF92MC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbkF0dHIsIGluZGV4MCApO1xyXG5cdFx0XHRcdFx0X3YxLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uQXR0ciwgaW5kZXgxICk7XHJcblxyXG5cdFx0XHRcdFx0dmVydGljZXMucHVzaCggX3YwLngsIF92MC55LCBfdjAueiApO1xyXG5cdFx0XHRcdFx0dmVydGljZXMucHVzaCggX3YxLngsIF92MS55LCBfdjEueiApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMucGFyYW1ldGVycyA9IE9iamVjdC5hc3NpZ24oIHt9LCBzb3VyY2UucGFyYW1ldGVycyApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBFZGdlc0dlb21ldHJ5IH07XHJcbiIsImltcG9ydCB7IFBhdGggfSBmcm9tICcuL1BhdGguanMnO1xyXG5pbXBvcnQgeyBnZW5lcmF0ZVVVSUQgfSBmcm9tICcuLi8uLi9tYXRoL01hdGhVdGlscy5qcyc7XHJcblxyXG4vKipcclxuICogRGVmaW5lcyBhbiBhcmJpdHJhcnkgMmQgc2hhcGUgcGxhbmUgdXNpbmcgcGF0aHMgd2l0aCBvcHRpb25hbCBob2xlcy4gSXRcclxuICogY2FuIGJlIHVzZWQgd2l0aCB7QGxpbmsgRXh0cnVkZUdlb21ldHJ5fSwge0BsaW5rIFNoYXBlR2VvbWV0cnl9LCB0byBnZXRcclxuICogcG9pbnRzLCBvciB0byBnZXQgdHJpYW5ndWxhdGVkIGZhY2VzLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBoZWFydFNoYXBlID0gbmV3IFRIUkVFLlNoYXBlKCk7XHJcbiAqXHJcbiAqIGhlYXJ0U2hhcGUubW92ZVRvKCAyNSwgMjUgKTtcclxuICogaGVhcnRTaGFwZS5iZXppZXJDdXJ2ZVRvKCAyNSwgMjUsIDIwLCAwLCAwLCAwICk7XHJcbiAqIGhlYXJ0U2hhcGUuYmV6aWVyQ3VydmVUbyggLSAzMCwgMCwgLSAzMCwgMzUsIC0gMzAsIDM1ICk7XHJcbiAqIGhlYXJ0U2hhcGUuYmV6aWVyQ3VydmVUbyggLSAzMCwgNTUsIC0gMTAsIDc3LCAyNSwgOTUgKTtcclxuICogaGVhcnRTaGFwZS5iZXppZXJDdXJ2ZVRvKCA2MCwgNzcsIDgwLCA1NSwgODAsIDM1ICk7XHJcbiAqIGhlYXJ0U2hhcGUuYmV6aWVyQ3VydmVUbyggODAsIDM1LCA4MCwgMCwgNTAsIDAgKTtcclxuICogaGVhcnRTaGFwZS5iZXppZXJDdXJ2ZVRvKCAzNSwgMCwgMjUsIDI1LCAyNSwgMjUgKTtcclxuICpcclxuICogY29uc3QgZXh0cnVkZVNldHRpbmdzID0ge1xyXG4gKiBcdGRlcHRoOiA4LFxyXG4gKiBcdGJldmVsRW5hYmxlZDogdHJ1ZSxcclxuICogXHRiZXZlbFNlZ21lbnRzOiAyLFxyXG4gKiBcdHN0ZXBzOiAyLFxyXG4gKiBcdGJldmVsU2l6ZTogMSxcclxuICogXHRiZXZlbFRoaWNrbmVzczogMVxyXG4gKiB9O1xyXG4gKlxyXG4gKiBjb25zdCBnZW9tZXRyeSA9IG5ldyBUSFJFRS5FeHRydWRlR2VvbWV0cnkoIGhlYXJ0U2hhcGUsIGV4dHJ1ZGVTZXR0aW5ncyApO1xyXG4gKiBjb25zdCBtZXNoID0gbmV3IFRIUkVFLk1lc2goIGdlb21ldHJ5LCBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoKSApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIFBhdGhcclxuICovXHJcbmNsYXNzIFNoYXBlIGV4dGVuZHMgUGF0aCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc2hhcGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PFZlY3RvcjI+fSBbcG9pbnRzXSAtIEFuIGFycmF5IG9mIDJEIHBvaW50cyBkZWZpbmluZyB0aGUgc2hhcGUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHBvaW50cyApIHtcclxuXHJcblx0XHRzdXBlciggcG9pbnRzICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgVVVJRCBvZiB0aGUgc2hhcGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnV1aWQgPSBnZW5lcmF0ZVVVSUQoKTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnU2hhcGUnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyB0aGUgaG9sZXMgaW4gdGhlIHNoYXBlLiBIb2xlIGRlZmluaXRpb25zIG11c3QgdXNlIHRoZVxyXG5cdFx0ICogb3Bwb3NpdGUgd2luZGluZyBvcmRlciAoQ1cvQ0NXKSB0aGFuIHRoZSBvdXRlciBzaGFwZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8UGF0aD59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ob2xlcyA9IFtdO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYW4gYXJyYXkgcmVwcmVzZW50aW5nIGVhY2ggY29udG91ciBvZiB0aGUgaG9sZXNcclxuXHQgKiBhcyBhIGxpc3Qgb2YgMkQgcG9pbnRzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGRpdmlzaW9ucyAtIFRoZSBmaW5lbmVzcyBvZiB0aGUgcmVzdWx0LlxyXG5cdCAqIEByZXR1cm4ge0FycmF5PEFycmF5PFZlY3RvcjI+Pn0gVGhlIGhvbGVzIGFzIGEgc2VyaWVzIG9mIDJEIHBvaW50cy5cclxuXHQgKi9cclxuXHRnZXRQb2ludHNIb2xlcyggZGl2aXNpb25zICkge1xyXG5cclxuXHRcdGNvbnN0IGhvbGVzUHRzID0gW107XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gdGhpcy5ob2xlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0aG9sZXNQdHNbIGkgXSA9IHRoaXMuaG9sZXNbIGkgXS5nZXRQb2ludHMoIGRpdmlzaW9ucyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gaG9sZXNQdHM7XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gZ2V0IHBvaW50cyBvZiBzaGFwZSBhbmQgaG9sZXMgKGtleXBvaW50cyBiYXNlZCBvbiBzZWdtZW50cyBwYXJhbWV0ZXIpXHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYW4gb2JqZWN0IHRoYXQgaG9sZHMgY29udG91ciBkYXRhIGZvciB0aGUgc2hhcGUgYW5kIGl0cyBob2xlcyBhc1xyXG5cdCAqIGFycmF5cyBvZiAyRCBwb2ludHMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZGl2aXNpb25zIC0gVGhlIGZpbmVuZXNzIG9mIHRoZSByZXN1bHQuXHJcblx0ICogQHJldHVybiB7e3NoYXBlOkFycmF5PFZlY3RvcjI+LGhvbGVzOkFycmF5PEFycmF5PFZlY3RvcjI+Pn19IEFuIG9iamVjdCB3aXRoIGNvbnRvdXIgZGF0YS5cclxuXHQgKi9cclxuXHRleHRyYWN0UG9pbnRzKCBkaXZpc2lvbnMgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHtcclxuXHJcblx0XHRcdHNoYXBlOiB0aGlzLmdldFBvaW50cyggZGl2aXNpb25zICksXHJcblx0XHRcdGhvbGVzOiB0aGlzLmdldFBvaW50c0hvbGVzKCBkaXZpc2lvbnMgKVxyXG5cclxuXHRcdH07XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMuaG9sZXMgPSBbXTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBzb3VyY2UuaG9sZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGhvbGUgPSBzb3VyY2UuaG9sZXNbIGkgXTtcclxuXHJcblx0XHRcdHRoaXMuaG9sZXMucHVzaCggaG9sZS5jbG9uZSgpICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdHRvSlNPTigpIHtcclxuXHJcblx0XHRjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCk7XHJcblxyXG5cdFx0ZGF0YS51dWlkID0gdGhpcy51dWlkO1xyXG5cdFx0ZGF0YS5ob2xlcyA9IFtdO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHRoaXMuaG9sZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGhvbGUgPSB0aGlzLmhvbGVzWyBpIF07XHJcblx0XHRcdGRhdGEuaG9sZXMucHVzaCggaG9sZS50b0pTT04oKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZGF0YTtcclxuXHJcblx0fVxyXG5cclxuXHRmcm9tSlNPTigganNvbiApIHtcclxuXHJcblx0XHRzdXBlci5mcm9tSlNPTigganNvbiApO1xyXG5cclxuXHRcdHRoaXMudXVpZCA9IGpzb24udXVpZDtcclxuXHRcdHRoaXMuaG9sZXMgPSBbXTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBqc29uLmhvbGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBob2xlID0ganNvbi5ob2xlc1sgaSBdO1xyXG5cdFx0XHR0aGlzLmhvbGVzLnB1c2goIG5ldyBQYXRoKCkuZnJvbUpTT04oIGhvbGUgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCB7IFNoYXBlIH07XHJcbiIsIi8qIGVzbGludC1kaXNhYmxlICovXHJcbi8vIGNvcHkgb2YgbWFwYm94L2VhcmN1dCB2ZXJzaW9uIDMuMC4xXHJcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvZWFyY3V0L3RyZWUvdjMuMC4xXHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBlYXJjdXQoZGF0YSwgaG9sZUluZGljZXMsIGRpbSA9IDIpIHtcclxuXHJcbiAgICBjb25zdCBoYXNIb2xlcyA9IGhvbGVJbmRpY2VzICYmIGhvbGVJbmRpY2VzLmxlbmd0aDtcclxuICAgIGNvbnN0IG91dGVyTGVuID0gaGFzSG9sZXMgPyBob2xlSW5kaWNlc1swXSAqIGRpbSA6IGRhdGEubGVuZ3RoO1xyXG4gICAgbGV0IG91dGVyTm9kZSA9IGxpbmtlZExpc3QoZGF0YSwgMCwgb3V0ZXJMZW4sIGRpbSwgdHJ1ZSk7XHJcbiAgICBjb25zdCB0cmlhbmdsZXMgPSBbXTtcclxuXHJcbiAgICBpZiAoIW91dGVyTm9kZSB8fCBvdXRlck5vZGUubmV4dCA9PT0gb3V0ZXJOb2RlLnByZXYpIHJldHVybiB0cmlhbmdsZXM7XHJcblxyXG4gICAgbGV0IG1pblgsIG1pblksIGludlNpemU7XHJcblxyXG4gICAgaWYgKGhhc0hvbGVzKSBvdXRlck5vZGUgPSBlbGltaW5hdGVIb2xlcyhkYXRhLCBob2xlSW5kaWNlcywgb3V0ZXJOb2RlLCBkaW0pO1xyXG5cclxuICAgIC8vIGlmIHRoZSBzaGFwZSBpcyBub3QgdG9vIHNpbXBsZSwgd2UnbGwgdXNlIHotb3JkZXIgY3VydmUgaGFzaCBsYXRlcjsgY2FsY3VsYXRlIHBvbHlnb24gYmJveFxyXG4gICAgaWYgKGRhdGEubGVuZ3RoID4gODAgKiBkaW0pIHtcclxuICAgICAgICBtaW5YID0gSW5maW5pdHk7XHJcbiAgICAgICAgbWluWSA9IEluZmluaXR5O1xyXG4gICAgICAgIGxldCBtYXhYID0gLUluZmluaXR5O1xyXG4gICAgICAgIGxldCBtYXhZID0gLUluZmluaXR5O1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gZGltOyBpIDwgb3V0ZXJMZW47IGkgKz0gZGltKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHggPSBkYXRhW2ldO1xyXG4gICAgICAgICAgICBjb25zdCB5ID0gZGF0YVtpICsgMV07XHJcbiAgICAgICAgICAgIGlmICh4IDwgbWluWCkgbWluWCA9IHg7XHJcbiAgICAgICAgICAgIGlmICh5IDwgbWluWSkgbWluWSA9IHk7XHJcbiAgICAgICAgICAgIGlmICh4ID4gbWF4WCkgbWF4WCA9IHg7XHJcbiAgICAgICAgICAgIGlmICh5ID4gbWF4WSkgbWF4WSA9IHk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBtaW5YLCBtaW5ZIGFuZCBpbnZTaXplIGFyZSBsYXRlciB1c2VkIHRvIHRyYW5zZm9ybSBjb29yZHMgaW50byBpbnRlZ2VycyBmb3Igei1vcmRlciBjYWxjdWxhdGlvblxyXG4gICAgICAgIGludlNpemUgPSBNYXRoLm1heChtYXhYIC0gbWluWCwgbWF4WSAtIG1pblkpO1xyXG4gICAgICAgIGludlNpemUgPSBpbnZTaXplICE9PSAwID8gMzI3NjcgLyBpbnZTaXplIDogMDtcclxuICAgIH1cclxuXHJcbiAgICBlYXJjdXRMaW5rZWQob3V0ZXJOb2RlLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSwgMCk7XHJcblxyXG4gICAgcmV0dXJuIHRyaWFuZ2xlcztcclxufVxyXG5cclxuLy8gY3JlYXRlIGEgY2lyY3VsYXIgZG91Ymx5IGxpbmtlZCBsaXN0IGZyb20gcG9seWdvbiBwb2ludHMgaW4gdGhlIHNwZWNpZmllZCB3aW5kaW5nIG9yZGVyXHJcbmZ1bmN0aW9uIGxpbmtlZExpc3QoZGF0YSwgc3RhcnQsIGVuZCwgZGltLCBjbG9ja3dpc2UpIHtcclxuICAgIGxldCBsYXN0O1xyXG5cclxuICAgIGlmIChjbG9ja3dpc2UgPT09IChzaWduZWRBcmVhKGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSkgPiAwKSkge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSBkaW0pIGxhc3QgPSBpbnNlcnROb2RlKGkgLyBkaW0gfCAwLCBkYXRhW2ldLCBkYXRhW2kgKyAxXSwgbGFzdCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSBlbmQgLSBkaW07IGkgPj0gc3RhcnQ7IGkgLT0gZGltKSBsYXN0ID0gaW5zZXJ0Tm9kZShpIC8gZGltIHwgMCwgZGF0YVtpXSwgZGF0YVtpICsgMV0sIGxhc3QpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChsYXN0ICYmIGVxdWFscyhsYXN0LCBsYXN0Lm5leHQpKSB7XHJcbiAgICAgICAgcmVtb3ZlTm9kZShsYXN0KTtcclxuICAgICAgICBsYXN0ID0gbGFzdC5uZXh0O1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBsYXN0O1xyXG59XHJcblxyXG4vLyBlbGltaW5hdGUgY29saW5lYXIgb3IgZHVwbGljYXRlIHBvaW50c1xyXG5mdW5jdGlvbiBmaWx0ZXJQb2ludHMoc3RhcnQsIGVuZCkge1xyXG4gICAgaWYgKCFzdGFydCkgcmV0dXJuIHN0YXJ0O1xyXG4gICAgaWYgKCFlbmQpIGVuZCA9IHN0YXJ0O1xyXG5cclxuICAgIGxldCBwID0gc3RhcnQsXHJcbiAgICAgICAgYWdhaW47XHJcbiAgICBkbyB7XHJcbiAgICAgICAgYWdhaW4gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKCFwLnN0ZWluZXIgJiYgKGVxdWFscyhwLCBwLm5leHQpIHx8IGFyZWEocC5wcmV2LCBwLCBwLm5leHQpID09PSAwKSkge1xyXG4gICAgICAgICAgICByZW1vdmVOb2RlKHApO1xyXG4gICAgICAgICAgICBwID0gZW5kID0gcC5wcmV2O1xyXG4gICAgICAgICAgICBpZiAocCA9PT0gcC5uZXh0KSBicmVhaztcclxuICAgICAgICAgICAgYWdhaW4gPSB0cnVlO1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwID0gcC5uZXh0O1xyXG4gICAgICAgIH1cclxuICAgIH0gd2hpbGUgKGFnYWluIHx8IHAgIT09IGVuZCk7XHJcblxyXG4gICAgcmV0dXJuIGVuZDtcclxufVxyXG5cclxuLy8gbWFpbiBlYXIgc2xpY2luZyBsb29wIHdoaWNoIHRyaWFuZ3VsYXRlcyBhIHBvbHlnb24gKGdpdmVuIGFzIGEgbGlua2VkIGxpc3QpXHJcbmZ1bmN0aW9uIGVhcmN1dExpbmtlZChlYXIsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplLCBwYXNzKSB7XHJcbiAgICBpZiAoIWVhcikgcmV0dXJuO1xyXG5cclxuICAgIC8vIGludGVybGluayBwb2x5Z29uIG5vZGVzIGluIHotb3JkZXJcclxuICAgIGlmICghcGFzcyAmJiBpbnZTaXplKSBpbmRleEN1cnZlKGVhciwgbWluWCwgbWluWSwgaW52U2l6ZSk7XHJcblxyXG4gICAgbGV0IHN0b3AgPSBlYXI7XHJcblxyXG4gICAgLy8gaXRlcmF0ZSB0aHJvdWdoIGVhcnMsIHNsaWNpbmcgdGhlbSBvbmUgYnkgb25lXHJcbiAgICB3aGlsZSAoZWFyLnByZXYgIT09IGVhci5uZXh0KSB7XHJcbiAgICAgICAgY29uc3QgcHJldiA9IGVhci5wcmV2O1xyXG4gICAgICAgIGNvbnN0IG5leHQgPSBlYXIubmV4dDtcclxuXHJcbiAgICAgICAgaWYgKGludlNpemUgPyBpc0Vhckhhc2hlZChlYXIsIG1pblgsIG1pblksIGludlNpemUpIDogaXNFYXIoZWFyKSkge1xyXG4gICAgICAgICAgICB0cmlhbmdsZXMucHVzaChwcmV2LmksIGVhci5pLCBuZXh0LmkpOyAvLyBjdXQgb2ZmIHRoZSB0cmlhbmdsZVxyXG5cclxuICAgICAgICAgICAgcmVtb3ZlTm9kZShlYXIpO1xyXG5cclxuICAgICAgICAgICAgLy8gc2tpcHBpbmcgdGhlIG5leHQgdmVydGV4IGxlYWRzIHRvIGxlc3Mgc2xpdmVyIHRyaWFuZ2xlc1xyXG4gICAgICAgICAgICBlYXIgPSBuZXh0Lm5leHQ7XHJcbiAgICAgICAgICAgIHN0b3AgPSBuZXh0Lm5leHQ7XHJcblxyXG4gICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGVhciA9IG5leHQ7XHJcblxyXG4gICAgICAgIC8vIGlmIHdlIGxvb3BlZCB0aHJvdWdoIHRoZSB3aG9sZSByZW1haW5pbmcgcG9seWdvbiBhbmQgY2FuJ3QgZmluZCBhbnkgbW9yZSBlYXJzXHJcbiAgICAgICAgaWYgKGVhciA9PT0gc3RvcCkge1xyXG4gICAgICAgICAgICAvLyB0cnkgZmlsdGVyaW5nIHBvaW50cyBhbmQgc2xpY2luZyBhZ2FpblxyXG4gICAgICAgICAgICBpZiAoIXBhc3MpIHtcclxuICAgICAgICAgICAgICAgIGVhcmN1dExpbmtlZChmaWx0ZXJQb2ludHMoZWFyKSwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUsIDEpO1xyXG5cclxuICAgICAgICAgICAgLy8gaWYgdGhpcyBkaWRuJ3Qgd29yaywgdHJ5IGN1cmluZyBhbGwgc21hbGwgc2VsZi1pbnRlcnNlY3Rpb25zIGxvY2FsbHlcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXNzID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICBlYXIgPSBjdXJlTG9jYWxJbnRlcnNlY3Rpb25zKGZpbHRlclBvaW50cyhlYXIpLCB0cmlhbmdsZXMpO1xyXG4gICAgICAgICAgICAgICAgZWFyY3V0TGlua2VkKGVhciwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUsIDIpO1xyXG5cclxuICAgICAgICAgICAgLy8gYXMgYSBsYXN0IHJlc29ydCwgdHJ5IHNwbGl0dGluZyB0aGUgcmVtYWluaW5nIHBvbHlnb24gaW50byB0d29cclxuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXNzID09PSAyKSB7XHJcbiAgICAgICAgICAgICAgICBzcGxpdEVhcmN1dChlYXIsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vLyBjaGVjayB3aGV0aGVyIGEgcG9seWdvbiBub2RlIGZvcm1zIGEgdmFsaWQgZWFyIHdpdGggYWRqYWNlbnQgbm9kZXNcclxuZnVuY3Rpb24gaXNFYXIoZWFyKSB7XHJcbiAgICBjb25zdCBhID0gZWFyLnByZXYsXHJcbiAgICAgICAgYiA9IGVhcixcclxuICAgICAgICBjID0gZWFyLm5leHQ7XHJcblxyXG4gICAgaWYgKGFyZWEoYSwgYiwgYykgPj0gMCkgcmV0dXJuIGZhbHNlOyAvLyByZWZsZXgsIGNhbid0IGJlIGFuIGVhclxyXG5cclxuICAgIC8vIG5vdyBtYWtlIHN1cmUgd2UgZG9uJ3QgaGF2ZSBvdGhlciBwb2ludHMgaW5zaWRlIHRoZSBwb3RlbnRpYWwgZWFyXHJcbiAgICBjb25zdCBheCA9IGEueCwgYnggPSBiLngsIGN4ID0gYy54LCBheSA9IGEueSwgYnkgPSBiLnksIGN5ID0gYy55O1xyXG5cclxuICAgIC8vIHRyaWFuZ2xlIGJib3hcclxuICAgIGNvbnN0IHgwID0gTWF0aC5taW4oYXgsIGJ4LCBjeCksXHJcbiAgICAgICAgeTAgPSBNYXRoLm1pbihheSwgYnksIGN5KSxcclxuICAgICAgICB4MSA9IE1hdGgubWF4KGF4LCBieCwgY3gpLFxyXG4gICAgICAgIHkxID0gTWF0aC5tYXgoYXksIGJ5LCBjeSk7XHJcblxyXG4gICAgbGV0IHAgPSBjLm5leHQ7XHJcbiAgICB3aGlsZSAocCAhPT0gYSkge1xyXG4gICAgICAgIGlmIChwLnggPj0geDAgJiYgcC54IDw9IHgxICYmIHAueSA+PSB5MCAmJiBwLnkgPD0geTEgJiZcclxuICAgICAgICAgICAgcG9pbnRJblRyaWFuZ2xlRXhjZXB0Rmlyc3QoYXgsIGF5LCBieCwgYnksIGN4LCBjeSwgcC54LCBwLnkpICYmXHJcbiAgICAgICAgICAgIGFyZWEocC5wcmV2LCBwLCBwLm5leHQpID49IDApIHJldHVybiBmYWxzZTtcclxuICAgICAgICBwID0gcC5uZXh0O1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc0Vhckhhc2hlZChlYXIsIG1pblgsIG1pblksIGludlNpemUpIHtcclxuICAgIGNvbnN0IGEgPSBlYXIucHJldixcclxuICAgICAgICBiID0gZWFyLFxyXG4gICAgICAgIGMgPSBlYXIubmV4dDtcclxuXHJcbiAgICBpZiAoYXJlYShhLCBiLCBjKSA+PSAwKSByZXR1cm4gZmFsc2U7IC8vIHJlZmxleCwgY2FuJ3QgYmUgYW4gZWFyXHJcblxyXG4gICAgY29uc3QgYXggPSBhLngsIGJ4ID0gYi54LCBjeCA9IGMueCwgYXkgPSBhLnksIGJ5ID0gYi55LCBjeSA9IGMueTtcclxuXHJcbiAgICAvLyB0cmlhbmdsZSBiYm94XHJcbiAgICBjb25zdCB4MCA9IE1hdGgubWluKGF4LCBieCwgY3gpLFxyXG4gICAgICAgIHkwID0gTWF0aC5taW4oYXksIGJ5LCBjeSksXHJcbiAgICAgICAgeDEgPSBNYXRoLm1heChheCwgYngsIGN4KSxcclxuICAgICAgICB5MSA9IE1hdGgubWF4KGF5LCBieSwgY3kpO1xyXG5cclxuICAgIC8vIHotb3JkZXIgcmFuZ2UgZm9yIHRoZSBjdXJyZW50IHRyaWFuZ2xlIGJib3g7XHJcbiAgICBjb25zdCBtaW5aID0gek9yZGVyKHgwLCB5MCwgbWluWCwgbWluWSwgaW52U2l6ZSksXHJcbiAgICAgICAgbWF4WiA9IHpPcmRlcih4MSwgeTEsIG1pblgsIG1pblksIGludlNpemUpO1xyXG5cclxuICAgIGxldCBwID0gZWFyLnByZXZaLFxyXG4gICAgICAgIG4gPSBlYXIubmV4dFo7XHJcblxyXG4gICAgLy8gbG9vayBmb3IgcG9pbnRzIGluc2lkZSB0aGUgdHJpYW5nbGUgaW4gYm90aCBkaXJlY3Rpb25zXHJcbiAgICB3aGlsZSAocCAmJiBwLnogPj0gbWluWiAmJiBuICYmIG4ueiA8PSBtYXhaKSB7XHJcbiAgICAgICAgaWYgKHAueCA+PSB4MCAmJiBwLnggPD0geDEgJiYgcC55ID49IHkwICYmIHAueSA8PSB5MSAmJiBwICE9PSBhICYmIHAgIT09IGMgJiZcclxuICAgICAgICAgICAgcG9pbnRJblRyaWFuZ2xlRXhjZXB0Rmlyc3QoYXgsIGF5LCBieCwgYnksIGN4LCBjeSwgcC54LCBwLnkpICYmIGFyZWEocC5wcmV2LCBwLCBwLm5leHQpID49IDApIHJldHVybiBmYWxzZTtcclxuICAgICAgICBwID0gcC5wcmV2WjtcclxuXHJcbiAgICAgICAgaWYgKG4ueCA+PSB4MCAmJiBuLnggPD0geDEgJiYgbi55ID49IHkwICYmIG4ueSA8PSB5MSAmJiBuICE9PSBhICYmIG4gIT09IGMgJiZcclxuICAgICAgICAgICAgcG9pbnRJblRyaWFuZ2xlRXhjZXB0Rmlyc3QoYXgsIGF5LCBieCwgYnksIGN4LCBjeSwgbi54LCBuLnkpICYmIGFyZWEobi5wcmV2LCBuLCBuLm5leHQpID49IDApIHJldHVybiBmYWxzZTtcclxuICAgICAgICBuID0gbi5uZXh0WjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBsb29rIGZvciByZW1haW5pbmcgcG9pbnRzIGluIGRlY3JlYXNpbmcgei1vcmRlclxyXG4gICAgd2hpbGUgKHAgJiYgcC56ID49IG1pblopIHtcclxuICAgICAgICBpZiAocC54ID49IHgwICYmIHAueCA8PSB4MSAmJiBwLnkgPj0geTAgJiYgcC55IDw9IHkxICYmIHAgIT09IGEgJiYgcCAhPT0gYyAmJlxyXG4gICAgICAgICAgICBwb2ludEluVHJpYW5nbGVFeGNlcHRGaXJzdChheCwgYXksIGJ4LCBieSwgY3gsIGN5LCBwLngsIHAueSkgJiYgYXJlYShwLnByZXYsIHAsIHAubmV4dCkgPj0gMCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIHAgPSBwLnByZXZaO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGxvb2sgZm9yIHJlbWFpbmluZyBwb2ludHMgaW4gaW5jcmVhc2luZyB6LW9yZGVyXHJcbiAgICB3aGlsZSAobiAmJiBuLnogPD0gbWF4Wikge1xyXG4gICAgICAgIGlmIChuLnggPj0geDAgJiYgbi54IDw9IHgxICYmIG4ueSA+PSB5MCAmJiBuLnkgPD0geTEgJiYgbiAhPT0gYSAmJiBuICE9PSBjICYmXHJcbiAgICAgICAgICAgIHBvaW50SW5UcmlhbmdsZUV4Y2VwdEZpcnN0KGF4LCBheSwgYngsIGJ5LCBjeCwgY3ksIG4ueCwgbi55KSAmJiBhcmVhKG4ucHJldiwgbiwgbi5uZXh0KSA+PSAwKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgbiA9IG4ubmV4dFo7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbn1cclxuXHJcbi8vIGdvIHRocm91Z2ggYWxsIHBvbHlnb24gbm9kZXMgYW5kIGN1cmUgc21hbGwgbG9jYWwgc2VsZi1pbnRlcnNlY3Rpb25zXHJcbmZ1bmN0aW9uIGN1cmVMb2NhbEludGVyc2VjdGlvbnMoc3RhcnQsIHRyaWFuZ2xlcykge1xyXG4gICAgbGV0IHAgPSBzdGFydDtcclxuICAgIGRvIHtcclxuICAgICAgICBjb25zdCBhID0gcC5wcmV2LFxyXG4gICAgICAgICAgICBiID0gcC5uZXh0Lm5leHQ7XHJcblxyXG4gICAgICAgIGlmICghZXF1YWxzKGEsIGIpICYmIGludGVyc2VjdHMoYSwgcCwgcC5uZXh0LCBiKSAmJiBsb2NhbGx5SW5zaWRlKGEsIGIpICYmIGxvY2FsbHlJbnNpZGUoYiwgYSkpIHtcclxuXHJcbiAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKGEuaSwgcC5pLCBiLmkpO1xyXG5cclxuICAgICAgICAgICAgLy8gcmVtb3ZlIHR3byBub2RlcyBpbnZvbHZlZFxyXG4gICAgICAgICAgICByZW1vdmVOb2RlKHApO1xyXG4gICAgICAgICAgICByZW1vdmVOb2RlKHAubmV4dCk7XHJcblxyXG4gICAgICAgICAgICBwID0gc3RhcnQgPSBiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBwID0gcC5uZXh0O1xyXG4gICAgfSB3aGlsZSAocCAhPT0gc3RhcnQpO1xyXG5cclxuICAgIHJldHVybiBmaWx0ZXJQb2ludHMocCk7XHJcbn1cclxuXHJcbi8vIHRyeSBzcGxpdHRpbmcgcG9seWdvbiBpbnRvIHR3byBhbmQgdHJpYW5ndWxhdGUgdGhlbSBpbmRlcGVuZGVudGx5XHJcbmZ1bmN0aW9uIHNwbGl0RWFyY3V0KHN0YXJ0LCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSkge1xyXG4gICAgLy8gbG9vayBmb3IgYSB2YWxpZCBkaWFnb25hbCB0aGF0IGRpdmlkZXMgdGhlIHBvbHlnb24gaW50byB0d29cclxuICAgIGxldCBhID0gc3RhcnQ7XHJcbiAgICBkbyB7XHJcbiAgICAgICAgbGV0IGIgPSBhLm5leHQubmV4dDtcclxuICAgICAgICB3aGlsZSAoYiAhPT0gYS5wcmV2KSB7XHJcbiAgICAgICAgICAgIGlmIChhLmkgIT09IGIuaSAmJiBpc1ZhbGlkRGlhZ29uYWwoYSwgYikpIHtcclxuICAgICAgICAgICAgICAgIC8vIHNwbGl0IHRoZSBwb2x5Z29uIGluIHR3byBieSB0aGUgZGlhZ29uYWxcclxuICAgICAgICAgICAgICAgIGxldCBjID0gc3BsaXRQb2x5Z29uKGEsIGIpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIGZpbHRlciBjb2xpbmVhciBwb2ludHMgYXJvdW5kIHRoZSBjdXRzXHJcbiAgICAgICAgICAgICAgICBhID0gZmlsdGVyUG9pbnRzKGEsIGEubmV4dCk7XHJcbiAgICAgICAgICAgICAgICBjID0gZmlsdGVyUG9pbnRzKGMsIGMubmV4dCk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gcnVuIGVhcmN1dCBvbiBlYWNoIGhhbGZcclxuICAgICAgICAgICAgICAgIGVhcmN1dExpbmtlZChhLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSwgMCk7XHJcbiAgICAgICAgICAgICAgICBlYXJjdXRMaW5rZWQoYywgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUsIDApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGIgPSBiLm5leHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGEgPSBhLm5leHQ7XHJcbiAgICB9IHdoaWxlIChhICE9PSBzdGFydCk7XHJcbn1cclxuXHJcbi8vIGxpbmsgZXZlcnkgaG9sZSBpbnRvIHRoZSBvdXRlciBsb29wLCBwcm9kdWNpbmcgYSBzaW5nbGUtcmluZyBwb2x5Z29uIHdpdGhvdXQgaG9sZXNcclxuZnVuY3Rpb24gZWxpbWluYXRlSG9sZXMoZGF0YSwgaG9sZUluZGljZXMsIG91dGVyTm9kZSwgZGltKSB7XHJcbiAgICBjb25zdCBxdWV1ZSA9IFtdO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBob2xlSW5kaWNlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gaG9sZUluZGljZXNbaV0gKiBkaW07XHJcbiAgICAgICAgY29uc3QgZW5kID0gaSA8IGxlbiAtIDEgPyBob2xlSW5kaWNlc1tpICsgMV0gKiBkaW0gOiBkYXRhLmxlbmd0aDtcclxuICAgICAgICBjb25zdCBsaXN0ID0gbGlua2VkTGlzdChkYXRhLCBzdGFydCwgZW5kLCBkaW0sIGZhbHNlKTtcclxuICAgICAgICBpZiAobGlzdCA9PT0gbGlzdC5uZXh0KSBsaXN0LnN0ZWluZXIgPSB0cnVlO1xyXG4gICAgICAgIHF1ZXVlLnB1c2goZ2V0TGVmdG1vc3QobGlzdCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHF1ZXVlLnNvcnQoY29tcGFyZVhZU2xvcGUpO1xyXG5cclxuICAgIC8vIHByb2Nlc3MgaG9sZXMgZnJvbSBsZWZ0IHRvIHJpZ2h0XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgb3V0ZXJOb2RlID0gZWxpbWluYXRlSG9sZShxdWV1ZVtpXSwgb3V0ZXJOb2RlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb3V0ZXJOb2RlO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjb21wYXJlWFlTbG9wZShhLCBiKSB7XHJcbiAgICBsZXQgcmVzdWx0ID0gYS54IC0gYi54O1xyXG4gICAgLy8gd2hlbiB0aGUgbGVmdC1tb3N0IHBvaW50IG9mIDIgaG9sZXMgbWVldCBhdCBhIHZlcnRleCwgc29ydCB0aGUgaG9sZXMgY291bnRlcmNsb2Nrd2lzZSBzbyB0aGF0IHdoZW4gd2UgZmluZFxyXG4gICAgLy8gdGhlIGJyaWRnZSB0byB0aGUgb3V0ZXIgc2hlbGwgaXMgYWx3YXlzIHRoZSBwb2ludCB0aGF0IHRoZXkgbWVldCBhdC5cclxuICAgIGlmIChyZXN1bHQgPT09IDApIHtcclxuICAgICAgICByZXN1bHQgPSBhLnkgLSBiLnk7XHJcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gMCkge1xyXG4gICAgICAgICAgICBjb25zdCBhU2xvcGUgPSAoYS5uZXh0LnkgLSBhLnkpIC8gKGEubmV4dC54IC0gYS54KTtcclxuICAgICAgICAgICAgY29uc3QgYlNsb3BlID0gKGIubmV4dC55IC0gYi55KSAvIChiLm5leHQueCAtIGIueCk7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IGFTbG9wZSAtIGJTbG9wZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG4vLyBmaW5kIGEgYnJpZGdlIGJldHdlZW4gdmVydGljZXMgdGhhdCBjb25uZWN0cyBob2xlIHdpdGggYW4gb3V0ZXIgcmluZyBhbmQgYW5kIGxpbmsgaXRcclxuZnVuY3Rpb24gZWxpbWluYXRlSG9sZShob2xlLCBvdXRlck5vZGUpIHtcclxuICAgIGNvbnN0IGJyaWRnZSA9IGZpbmRIb2xlQnJpZGdlKGhvbGUsIG91dGVyTm9kZSk7XHJcbiAgICBpZiAoIWJyaWRnZSkge1xyXG4gICAgICAgIHJldHVybiBvdXRlck5vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYnJpZGdlUmV2ZXJzZSA9IHNwbGl0UG9seWdvbihicmlkZ2UsIGhvbGUpO1xyXG5cclxuICAgIC8vIGZpbHRlciBjb2xsaW5lYXIgcG9pbnRzIGFyb3VuZCB0aGUgY3V0c1xyXG4gICAgZmlsdGVyUG9pbnRzKGJyaWRnZVJldmVyc2UsIGJyaWRnZVJldmVyc2UubmV4dCk7XHJcbiAgICByZXR1cm4gZmlsdGVyUG9pbnRzKGJyaWRnZSwgYnJpZGdlLm5leHQpO1xyXG59XHJcblxyXG4vLyBEYXZpZCBFYmVybHkncyBhbGdvcml0aG0gZm9yIGZpbmRpbmcgYSBicmlkZ2UgYmV0d2VlbiBob2xlIGFuZCBvdXRlciBwb2x5Z29uXHJcbmZ1bmN0aW9uIGZpbmRIb2xlQnJpZGdlKGhvbGUsIG91dGVyTm9kZSkge1xyXG4gICAgbGV0IHAgPSBvdXRlck5vZGU7XHJcbiAgICBjb25zdCBoeCA9IGhvbGUueDtcclxuICAgIGNvbnN0IGh5ID0gaG9sZS55O1xyXG4gICAgbGV0IHF4ID0gLUluZmluaXR5O1xyXG4gICAgbGV0IG07XHJcblxyXG4gICAgLy8gZmluZCBhIHNlZ21lbnQgaW50ZXJzZWN0ZWQgYnkgYSByYXkgZnJvbSB0aGUgaG9sZSdzIGxlZnRtb3N0IHBvaW50IHRvIHRoZSBsZWZ0O1xyXG4gICAgLy8gc2VnbWVudCdzIGVuZHBvaW50IHdpdGggbGVzc2VyIHggd2lsbCBiZSBwb3RlbnRpYWwgY29ubmVjdGlvbiBwb2ludFxyXG4gICAgLy8gdW5sZXNzIHRoZXkgaW50ZXJzZWN0IGF0IGEgdmVydGV4LCB0aGVuIGNob29zZSB0aGUgdmVydGV4XHJcbiAgICBpZiAoZXF1YWxzKGhvbGUsIHApKSByZXR1cm4gcDtcclxuICAgIGRvIHtcclxuICAgICAgICBpZiAoZXF1YWxzKGhvbGUsIHAubmV4dCkpIHJldHVybiBwLm5leHQ7XHJcbiAgICAgICAgZWxzZSBpZiAoaHkgPD0gcC55ICYmIGh5ID49IHAubmV4dC55ICYmIHAubmV4dC55ICE9PSBwLnkpIHtcclxuICAgICAgICAgICAgY29uc3QgeCA9IHAueCArIChoeSAtIHAueSkgKiAocC5uZXh0LnggLSBwLngpIC8gKHAubmV4dC55IC0gcC55KTtcclxuICAgICAgICAgICAgaWYgKHggPD0gaHggJiYgeCA+IHF4KSB7XHJcbiAgICAgICAgICAgICAgICBxeCA9IHg7XHJcbiAgICAgICAgICAgICAgICBtID0gcC54IDwgcC5uZXh0LnggPyBwIDogcC5uZXh0O1xyXG4gICAgICAgICAgICAgICAgaWYgKHggPT09IGh4KSByZXR1cm4gbTsgLy8gaG9sZSB0b3VjaGVzIG91dGVyIHNlZ21lbnQ7IHBpY2sgbGVmdG1vc3QgZW5kcG9pbnRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBwID0gcC5uZXh0O1xyXG4gICAgfSB3aGlsZSAocCAhPT0gb3V0ZXJOb2RlKTtcclxuXHJcbiAgICBpZiAoIW0pIHJldHVybiBudWxsO1xyXG5cclxuICAgIC8vIGxvb2sgZm9yIHBvaW50cyBpbnNpZGUgdGhlIHRyaWFuZ2xlIG9mIGhvbGUgcG9pbnQsIHNlZ21lbnQgaW50ZXJzZWN0aW9uIGFuZCBlbmRwb2ludDtcclxuICAgIC8vIGlmIHRoZXJlIGFyZSBubyBwb2ludHMgZm91bmQsIHdlIGhhdmUgYSB2YWxpZCBjb25uZWN0aW9uO1xyXG4gICAgLy8gb3RoZXJ3aXNlIGNob29zZSB0aGUgcG9pbnQgb2YgdGhlIG1pbmltdW0gYW5nbGUgd2l0aCB0aGUgcmF5IGFzIGNvbm5lY3Rpb24gcG9pbnRcclxuXHJcbiAgICBjb25zdCBzdG9wID0gbTtcclxuICAgIGNvbnN0IG14ID0gbS54O1xyXG4gICAgY29uc3QgbXkgPSBtLnk7XHJcbiAgICBsZXQgdGFuTWluID0gSW5maW5pdHk7XHJcblxyXG4gICAgcCA9IG07XHJcblxyXG4gICAgZG8ge1xyXG4gICAgICAgIGlmIChoeCA+PSBwLnggJiYgcC54ID49IG14ICYmIGh4ICE9PSBwLnggJiZcclxuICAgICAgICAgICAgICAgIHBvaW50SW5UcmlhbmdsZShoeSA8IG15ID8gaHggOiBxeCwgaHksIG14LCBteSwgaHkgPCBteSA/IHF4IDogaHgsIGh5LCBwLngsIHAueSkpIHtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHRhbiA9IE1hdGguYWJzKGh5IC0gcC55KSAvIChoeCAtIHAueCk7IC8vIHRhbmdlbnRpYWxcclxuXHJcbiAgICAgICAgICAgIGlmIChsb2NhbGx5SW5zaWRlKHAsIGhvbGUpICYmXHJcbiAgICAgICAgICAgICAgICAodGFuIDwgdGFuTWluIHx8ICh0YW4gPT09IHRhbk1pbiAmJiAocC54ID4gbS54IHx8IChwLnggPT09IG0ueCAmJiBzZWN0b3JDb250YWluc1NlY3RvcihtLCBwKSkpKSkpIHtcclxuICAgICAgICAgICAgICAgIG0gPSBwO1xyXG4gICAgICAgICAgICAgICAgdGFuTWluID0gdGFuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwID0gcC5uZXh0O1xyXG4gICAgfSB3aGlsZSAocCAhPT0gc3RvcCk7XHJcblxyXG4gICAgcmV0dXJuIG07XHJcbn1cclxuXHJcbi8vIHdoZXRoZXIgc2VjdG9yIGluIHZlcnRleCBtIGNvbnRhaW5zIHNlY3RvciBpbiB2ZXJ0ZXggcCBpbiB0aGUgc2FtZSBjb29yZGluYXRlc1xyXG5mdW5jdGlvbiBzZWN0b3JDb250YWluc1NlY3RvcihtLCBwKSB7XHJcbiAgICByZXR1cm4gYXJlYShtLnByZXYsIG0sIHAucHJldikgPCAwICYmIGFyZWEocC5uZXh0LCBtLCBtLm5leHQpIDwgMDtcclxufVxyXG5cclxuLy8gaW50ZXJsaW5rIHBvbHlnb24gbm9kZXMgaW4gei1vcmRlclxyXG5mdW5jdGlvbiBpbmRleEN1cnZlKHN0YXJ0LCBtaW5YLCBtaW5ZLCBpbnZTaXplKSB7XHJcbiAgICBsZXQgcCA9IHN0YXJ0O1xyXG4gICAgZG8ge1xyXG4gICAgICAgIGlmIChwLnogPT09IDApIHAueiA9IHpPcmRlcihwLngsIHAueSwgbWluWCwgbWluWSwgaW52U2l6ZSk7XHJcbiAgICAgICAgcC5wcmV2WiA9IHAucHJldjtcclxuICAgICAgICBwLm5leHRaID0gcC5uZXh0O1xyXG4gICAgICAgIHAgPSBwLm5leHQ7XHJcbiAgICB9IHdoaWxlIChwICE9PSBzdGFydCk7XHJcblxyXG4gICAgcC5wcmV2Wi5uZXh0WiA9IG51bGw7XHJcbiAgICBwLnByZXZaID0gbnVsbDtcclxuXHJcbiAgICBzb3J0TGlua2VkKHApO1xyXG59XHJcblxyXG4vLyBTaW1vbiBUYXRoYW0ncyBsaW5rZWQgbGlzdCBtZXJnZSBzb3J0IGFsZ29yaXRobVxyXG4vLyBodHRwOi8vd3d3LmNoaWFyay5ncmVlbmVuZC5vcmcudWsvfnNndGF0aGFtL2FsZ29yaXRobXMvbGlzdHNvcnQuaHRtbFxyXG5mdW5jdGlvbiBzb3J0TGlua2VkKGxpc3QpIHtcclxuICAgIGxldCBudW1NZXJnZXM7XHJcbiAgICBsZXQgaW5TaXplID0gMTtcclxuXHJcbiAgICBkbyB7XHJcbiAgICAgICAgbGV0IHAgPSBsaXN0O1xyXG4gICAgICAgIGxldCBlO1xyXG4gICAgICAgIGxpc3QgPSBudWxsO1xyXG4gICAgICAgIGxldCB0YWlsID0gbnVsbDtcclxuICAgICAgICBudW1NZXJnZXMgPSAwO1xyXG5cclxuICAgICAgICB3aGlsZSAocCkge1xyXG4gICAgICAgICAgICBudW1NZXJnZXMrKztcclxuICAgICAgICAgICAgbGV0IHEgPSBwO1xyXG4gICAgICAgICAgICBsZXQgcFNpemUgPSAwO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluU2l6ZTsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBwU2l6ZSsrO1xyXG4gICAgICAgICAgICAgICAgcSA9IHEubmV4dFo7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXEpIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBxU2l6ZSA9IGluU2l6ZTtcclxuXHJcbiAgICAgICAgICAgIHdoaWxlIChwU2l6ZSA+IDAgfHwgKHFTaXplID4gMCAmJiBxKSkge1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChwU2l6ZSAhPT0gMCAmJiAocVNpemUgPT09IDAgfHwgIXEgfHwgcC56IDw9IHEueikpIHtcclxuICAgICAgICAgICAgICAgICAgICBlID0gcDtcclxuICAgICAgICAgICAgICAgICAgICBwID0gcC5uZXh0WjtcclxuICAgICAgICAgICAgICAgICAgICBwU2l6ZS0tO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBlID0gcTtcclxuICAgICAgICAgICAgICAgICAgICBxID0gcS5uZXh0WjtcclxuICAgICAgICAgICAgICAgICAgICBxU2l6ZS0tO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0YWlsKSB0YWlsLm5leHRaID0gZTtcclxuICAgICAgICAgICAgICAgIGVsc2UgbGlzdCA9IGU7XHJcblxyXG4gICAgICAgICAgICAgICAgZS5wcmV2WiA9IHRhaWw7XHJcbiAgICAgICAgICAgICAgICB0YWlsID0gZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcCA9IHE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0YWlsLm5leHRaID0gbnVsbDtcclxuICAgICAgICBpblNpemUgKj0gMjtcclxuXHJcbiAgICB9IHdoaWxlIChudW1NZXJnZXMgPiAxKTtcclxuXHJcbiAgICByZXR1cm4gbGlzdDtcclxufVxyXG5cclxuLy8gei1vcmRlciBvZiBhIHBvaW50IGdpdmVuIGNvb3JkcyBhbmQgaW52ZXJzZSBvZiB0aGUgbG9uZ2VyIHNpZGUgb2YgZGF0YSBiYm94XHJcbmZ1bmN0aW9uIHpPcmRlcih4LCB5LCBtaW5YLCBtaW5ZLCBpbnZTaXplKSB7XHJcbiAgICAvLyBjb29yZHMgYXJlIHRyYW5zZm9ybWVkIGludG8gbm9uLW5lZ2F0aXZlIDE1LWJpdCBpbnRlZ2VyIHJhbmdlXHJcbiAgICB4ID0gKHggLSBtaW5YKSAqIGludlNpemUgfCAwO1xyXG4gICAgeSA9ICh5IC0gbWluWSkgKiBpbnZTaXplIHwgMDtcclxuXHJcbiAgICB4ID0gKHggfCAoeCA8PCA4KSkgJiAweDAwRkYwMEZGO1xyXG4gICAgeCA9ICh4IHwgKHggPDwgNCkpICYgMHgwRjBGMEYwRjtcclxuICAgIHggPSAoeCB8ICh4IDw8IDIpKSAmIDB4MzMzMzMzMzM7XHJcbiAgICB4ID0gKHggfCAoeCA8PCAxKSkgJiAweDU1NTU1NTU1O1xyXG5cclxuICAgIHkgPSAoeSB8ICh5IDw8IDgpKSAmIDB4MDBGRjAwRkY7XHJcbiAgICB5ID0gKHkgfCAoeSA8PCA0KSkgJiAweDBGMEYwRjBGO1xyXG4gICAgeSA9ICh5IHwgKHkgPDwgMikpICYgMHgzMzMzMzMzMztcclxuICAgIHkgPSAoeSB8ICh5IDw8IDEpKSAmIDB4NTU1NTU1NTU7XHJcblxyXG4gICAgcmV0dXJuIHggfCAoeSA8PCAxKTtcclxufVxyXG5cclxuLy8gZmluZCB0aGUgbGVmdG1vc3Qgbm9kZSBvZiBhIHBvbHlnb24gcmluZ1xyXG5mdW5jdGlvbiBnZXRMZWZ0bW9zdChzdGFydCkge1xyXG4gICAgbGV0IHAgPSBzdGFydCxcclxuICAgICAgICBsZWZ0bW9zdCA9IHN0YXJ0O1xyXG4gICAgZG8ge1xyXG4gICAgICAgIGlmIChwLnggPCBsZWZ0bW9zdC54IHx8IChwLnggPT09IGxlZnRtb3N0LnggJiYgcC55IDwgbGVmdG1vc3QueSkpIGxlZnRtb3N0ID0gcDtcclxuICAgICAgICBwID0gcC5uZXh0O1xyXG4gICAgfSB3aGlsZSAocCAhPT0gc3RhcnQpO1xyXG5cclxuICAgIHJldHVybiBsZWZ0bW9zdDtcclxufVxyXG5cclxuLy8gY2hlY2sgaWYgYSBwb2ludCBsaWVzIHdpdGhpbiBhIGNvbnZleCB0cmlhbmdsZVxyXG5mdW5jdGlvbiBwb2ludEluVHJpYW5nbGUoYXgsIGF5LCBieCwgYnksIGN4LCBjeSwgcHgsIHB5KSB7XHJcbiAgICByZXR1cm4gKGN4IC0gcHgpICogKGF5IC0gcHkpID49IChheCAtIHB4KSAqIChjeSAtIHB5KSAmJlxyXG4gICAgICAgICAgIChheCAtIHB4KSAqIChieSAtIHB5KSA+PSAoYnggLSBweCkgKiAoYXkgLSBweSkgJiZcclxuICAgICAgICAgICAoYnggLSBweCkgKiAoY3kgLSBweSkgPj0gKGN4IC0gcHgpICogKGJ5IC0gcHkpO1xyXG59XHJcblxyXG4vLyBjaGVjayBpZiBhIHBvaW50IGxpZXMgd2l0aGluIGEgY29udmV4IHRyaWFuZ2xlIGJ1dCBmYWxzZSBpZiBpdHMgZXF1YWwgdG8gdGhlIGZpcnN0IHBvaW50IG9mIHRoZSB0cmlhbmdsZVxyXG5mdW5jdGlvbiBwb2ludEluVHJpYW5nbGVFeGNlcHRGaXJzdChheCwgYXksIGJ4LCBieSwgY3gsIGN5LCBweCwgcHkpIHtcclxuICAgIHJldHVybiAhKGF4ID09PSBweCAmJiBheSA9PT0gcHkpICYmIHBvaW50SW5UcmlhbmdsZShheCwgYXksIGJ4LCBieSwgY3gsIGN5LCBweCwgcHkpO1xyXG59XHJcblxyXG4vLyBjaGVjayBpZiBhIGRpYWdvbmFsIGJldHdlZW4gdHdvIHBvbHlnb24gbm9kZXMgaXMgdmFsaWQgKGxpZXMgaW4gcG9seWdvbiBpbnRlcmlvcilcclxuZnVuY3Rpb24gaXNWYWxpZERpYWdvbmFsKGEsIGIpIHtcclxuICAgIHJldHVybiBhLm5leHQuaSAhPT0gYi5pICYmIGEucHJldi5pICE9PSBiLmkgJiYgIWludGVyc2VjdHNQb2x5Z29uKGEsIGIpICYmIC8vIGRvbmVzJ3QgaW50ZXJzZWN0IG90aGVyIGVkZ2VzXHJcbiAgICAgICAgICAgKGxvY2FsbHlJbnNpZGUoYSwgYikgJiYgbG9jYWxseUluc2lkZShiLCBhKSAmJiBtaWRkbGVJbnNpZGUoYSwgYikgJiYgLy8gbG9jYWxseSB2aXNpYmxlXHJcbiAgICAgICAgICAgIChhcmVhKGEucHJldiwgYSwgYi5wcmV2KSB8fCBhcmVhKGEsIGIucHJldiwgYikpIHx8IC8vIGRvZXMgbm90IGNyZWF0ZSBvcHBvc2l0ZS1mYWNpbmcgc2VjdG9yc1xyXG4gICAgICAgICAgICBlcXVhbHMoYSwgYikgJiYgYXJlYShhLnByZXYsIGEsIGEubmV4dCkgPiAwICYmIGFyZWEoYi5wcmV2LCBiLCBiLm5leHQpID4gMCk7IC8vIHNwZWNpYWwgemVyby1sZW5ndGggY2FzZVxyXG59XHJcblxyXG4vLyBzaWduZWQgYXJlYSBvZiBhIHRyaWFuZ2xlXHJcbmZ1bmN0aW9uIGFyZWEocCwgcSwgcikge1xyXG4gICAgcmV0dXJuIChxLnkgLSBwLnkpICogKHIueCAtIHEueCkgLSAocS54IC0gcC54KSAqIChyLnkgLSBxLnkpO1xyXG59XHJcblxyXG4vLyBjaGVjayBpZiB0d28gcG9pbnRzIGFyZSBlcXVhbFxyXG5mdW5jdGlvbiBlcXVhbHMocDEsIHAyKSB7XHJcbiAgICByZXR1cm4gcDEueCA9PT0gcDIueCAmJiBwMS55ID09PSBwMi55O1xyXG59XHJcblxyXG4vLyBjaGVjayBpZiB0d28gc2VnbWVudHMgaW50ZXJzZWN0XHJcbmZ1bmN0aW9uIGludGVyc2VjdHMocDEsIHExLCBwMiwgcTIpIHtcclxuICAgIGNvbnN0IG8xID0gc2lnbihhcmVhKHAxLCBxMSwgcDIpKTtcclxuICAgIGNvbnN0IG8yID0gc2lnbihhcmVhKHAxLCBxMSwgcTIpKTtcclxuICAgIGNvbnN0IG8zID0gc2lnbihhcmVhKHAyLCBxMiwgcDEpKTtcclxuICAgIGNvbnN0IG80ID0gc2lnbihhcmVhKHAyLCBxMiwgcTEpKTtcclxuXHJcbiAgICBpZiAobzEgIT09IG8yICYmIG8zICE9PSBvNCkgcmV0dXJuIHRydWU7IC8vIGdlbmVyYWwgY2FzZVxyXG5cclxuICAgIGlmIChvMSA9PT0gMCAmJiBvblNlZ21lbnQocDEsIHAyLCBxMSkpIHJldHVybiB0cnVlOyAvLyBwMSwgcTEgYW5kIHAyIGFyZSBjb2xsaW5lYXIgYW5kIHAyIGxpZXMgb24gcDFxMVxyXG4gICAgaWYgKG8yID09PSAwICYmIG9uU2VnbWVudChwMSwgcTIsIHExKSkgcmV0dXJuIHRydWU7IC8vIHAxLCBxMSBhbmQgcTIgYXJlIGNvbGxpbmVhciBhbmQgcTIgbGllcyBvbiBwMXExXHJcbiAgICBpZiAobzMgPT09IDAgJiYgb25TZWdtZW50KHAyLCBwMSwgcTIpKSByZXR1cm4gdHJ1ZTsgLy8gcDIsIHEyIGFuZCBwMSBhcmUgY29sbGluZWFyIGFuZCBwMSBsaWVzIG9uIHAycTJcclxuICAgIGlmIChvNCA9PT0gMCAmJiBvblNlZ21lbnQocDIsIHExLCBxMikpIHJldHVybiB0cnVlOyAvLyBwMiwgcTIgYW5kIHExIGFyZSBjb2xsaW5lYXIgYW5kIHExIGxpZXMgb24gcDJxMlxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxufVxyXG5cclxuLy8gZm9yIGNvbGxpbmVhciBwb2ludHMgcCwgcSwgciwgY2hlY2sgaWYgcG9pbnQgcSBsaWVzIG9uIHNlZ21lbnQgcHJcclxuZnVuY3Rpb24gb25TZWdtZW50KHAsIHEsIHIpIHtcclxuICAgIHJldHVybiBxLnggPD0gTWF0aC5tYXgocC54LCByLngpICYmIHEueCA+PSBNYXRoLm1pbihwLngsIHIueCkgJiYgcS55IDw9IE1hdGgubWF4KHAueSwgci55KSAmJiBxLnkgPj0gTWF0aC5taW4ocC55LCByLnkpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBzaWduKG51bSkge1xyXG4gICAgcmV0dXJuIG51bSA+IDAgPyAxIDogbnVtIDwgMCA/IC0xIDogMDtcclxufVxyXG5cclxuLy8gY2hlY2sgaWYgYSBwb2x5Z29uIGRpYWdvbmFsIGludGVyc2VjdHMgYW55IHBvbHlnb24gc2VnbWVudHNcclxuZnVuY3Rpb24gaW50ZXJzZWN0c1BvbHlnb24oYSwgYikge1xyXG4gICAgbGV0IHAgPSBhO1xyXG4gICAgZG8ge1xyXG4gICAgICAgIGlmIChwLmkgIT09IGEuaSAmJiBwLm5leHQuaSAhPT0gYS5pICYmIHAuaSAhPT0gYi5pICYmIHAubmV4dC5pICE9PSBiLmkgJiZcclxuICAgICAgICAgICAgICAgIGludGVyc2VjdHMocCwgcC5uZXh0LCBhLCBiKSkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgcCA9IHAubmV4dDtcclxuICAgIH0gd2hpbGUgKHAgIT09IGEpO1xyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxufVxyXG5cclxuLy8gY2hlY2sgaWYgYSBwb2x5Z29uIGRpYWdvbmFsIGlzIGxvY2FsbHkgaW5zaWRlIHRoZSBwb2x5Z29uXHJcbmZ1bmN0aW9uIGxvY2FsbHlJbnNpZGUoYSwgYikge1xyXG4gICAgcmV0dXJuIGFyZWEoYS5wcmV2LCBhLCBhLm5leHQpIDwgMCA/XHJcbiAgICAgICAgYXJlYShhLCBiLCBhLm5leHQpID49IDAgJiYgYXJlYShhLCBhLnByZXYsIGIpID49IDAgOlxyXG4gICAgICAgIGFyZWEoYSwgYiwgYS5wcmV2KSA8IDAgfHwgYXJlYShhLCBhLm5leHQsIGIpIDwgMDtcclxufVxyXG5cclxuLy8gY2hlY2sgaWYgdGhlIG1pZGRsZSBwb2ludCBvZiBhIHBvbHlnb24gZGlhZ29uYWwgaXMgaW5zaWRlIHRoZSBwb2x5Z29uXHJcbmZ1bmN0aW9uIG1pZGRsZUluc2lkZShhLCBiKSB7XHJcbiAgICBsZXQgcCA9IGE7XHJcbiAgICBsZXQgaW5zaWRlID0gZmFsc2U7XHJcbiAgICBjb25zdCBweCA9IChhLnggKyBiLngpIC8gMjtcclxuICAgIGNvbnN0IHB5ID0gKGEueSArIGIueSkgLyAyO1xyXG4gICAgZG8ge1xyXG4gICAgICAgIGlmICgoKHAueSA+IHB5KSAhPT0gKHAubmV4dC55ID4gcHkpKSAmJiBwLm5leHQueSAhPT0gcC55ICYmXHJcbiAgICAgICAgICAgICAgICAocHggPCAocC5uZXh0LnggLSBwLngpICogKHB5IC0gcC55KSAvIChwLm5leHQueSAtIHAueSkgKyBwLngpKVxyXG4gICAgICAgICAgICBpbnNpZGUgPSAhaW5zaWRlO1xyXG4gICAgICAgIHAgPSBwLm5leHQ7XHJcbiAgICB9IHdoaWxlIChwICE9PSBhKTtcclxuXHJcbiAgICByZXR1cm4gaW5zaWRlO1xyXG59XHJcblxyXG4vLyBsaW5rIHR3byBwb2x5Z29uIHZlcnRpY2VzIHdpdGggYSBicmlkZ2U7IGlmIHRoZSB2ZXJ0aWNlcyBiZWxvbmcgdG8gdGhlIHNhbWUgcmluZywgaXQgc3BsaXRzIHBvbHlnb24gaW50byB0d287XHJcbi8vIGlmIG9uZSBiZWxvbmdzIHRvIHRoZSBvdXRlciByaW5nIGFuZCBhbm90aGVyIHRvIGEgaG9sZSwgaXQgbWVyZ2VzIGl0IGludG8gYSBzaW5nbGUgcmluZ1xyXG5mdW5jdGlvbiBzcGxpdFBvbHlnb24oYSwgYikge1xyXG4gICAgY29uc3QgYTIgPSBjcmVhdGVOb2RlKGEuaSwgYS54LCBhLnkpLFxyXG4gICAgICAgIGIyID0gY3JlYXRlTm9kZShiLmksIGIueCwgYi55KSxcclxuICAgICAgICBhbiA9IGEubmV4dCxcclxuICAgICAgICBicCA9IGIucHJldjtcclxuXHJcbiAgICBhLm5leHQgPSBiO1xyXG4gICAgYi5wcmV2ID0gYTtcclxuXHJcbiAgICBhMi5uZXh0ID0gYW47XHJcbiAgICBhbi5wcmV2ID0gYTI7XHJcblxyXG4gICAgYjIubmV4dCA9IGEyO1xyXG4gICAgYTIucHJldiA9IGIyO1xyXG5cclxuICAgIGJwLm5leHQgPSBiMjtcclxuICAgIGIyLnByZXYgPSBicDtcclxuXHJcbiAgICByZXR1cm4gYjI7XHJcbn1cclxuXHJcbi8vIGNyZWF0ZSBhIG5vZGUgYW5kIG9wdGlvbmFsbHkgbGluayBpdCB3aXRoIHByZXZpb3VzIG9uZSAoaW4gYSBjaXJjdWxhciBkb3VibHkgbGlua2VkIGxpc3QpXHJcbmZ1bmN0aW9uIGluc2VydE5vZGUoaSwgeCwgeSwgbGFzdCkge1xyXG4gICAgY29uc3QgcCA9IGNyZWF0ZU5vZGUoaSwgeCwgeSk7XHJcblxyXG4gICAgaWYgKCFsYXN0KSB7XHJcbiAgICAgICAgcC5wcmV2ID0gcDtcclxuICAgICAgICBwLm5leHQgPSBwO1xyXG5cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcC5uZXh0ID0gbGFzdC5uZXh0O1xyXG4gICAgICAgIHAucHJldiA9IGxhc3Q7XHJcbiAgICAgICAgbGFzdC5uZXh0LnByZXYgPSBwO1xyXG4gICAgICAgIGxhc3QubmV4dCA9IHA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcDtcclxufVxyXG5cclxuZnVuY3Rpb24gcmVtb3ZlTm9kZShwKSB7XHJcbiAgICBwLm5leHQucHJldiA9IHAucHJldjtcclxuICAgIHAucHJldi5uZXh0ID0gcC5uZXh0O1xyXG5cclxuICAgIGlmIChwLnByZXZaKSBwLnByZXZaLm5leHRaID0gcC5uZXh0WjtcclxuICAgIGlmIChwLm5leHRaKSBwLm5leHRaLnByZXZaID0gcC5wcmV2WjtcclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlTm9kZShpLCB4LCB5KSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGksIC8vIHZlcnRleCBpbmRleCBpbiBjb29yZGluYXRlcyBhcnJheVxyXG4gICAgICAgIHgsIHksIC8vIHZlcnRleCBjb29yZGluYXRlc1xyXG4gICAgICAgIHByZXY6IG51bGwsIC8vIHByZXZpb3VzIGFuZCBuZXh0IHZlcnRleCBub2RlcyBpbiBhIHBvbHlnb24gcmluZ1xyXG4gICAgICAgIG5leHQ6IG51bGwsXHJcbiAgICAgICAgejogMCwgLy8gei1vcmRlciBjdXJ2ZSB2YWx1ZVxyXG4gICAgICAgIHByZXZaOiBudWxsLCAvLyBwcmV2aW91cyBhbmQgbmV4dCBub2RlcyBpbiB6LW9yZGVyXHJcbiAgICAgICAgbmV4dFo6IG51bGwsXHJcbiAgICAgICAgc3RlaW5lcjogZmFsc2UgLy8gaW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBpcyBhIHN0ZWluZXIgcG9pbnRcclxuICAgIH07XHJcbn1cclxuXHJcbi8vIHJldHVybiBhIHBlcmNlbnRhZ2UgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBwb2x5Z29uIGFyZWEgYW5kIGl0cyB0cmlhbmd1bGF0aW9uIGFyZWE7XHJcbi8vIHVzZWQgdG8gdmVyaWZ5IGNvcnJlY3RuZXNzIG9mIHRyaWFuZ3VsYXRpb25cclxuZXhwb3J0IGZ1bmN0aW9uIGRldmlhdGlvbihkYXRhLCBob2xlSW5kaWNlcywgZGltLCB0cmlhbmdsZXMpIHtcclxuICAgIGNvbnN0IGhhc0hvbGVzID0gaG9sZUluZGljZXMgJiYgaG9sZUluZGljZXMubGVuZ3RoO1xyXG4gICAgY29uc3Qgb3V0ZXJMZW4gPSBoYXNIb2xlcyA/IGhvbGVJbmRpY2VzWzBdICogZGltIDogZGF0YS5sZW5ndGg7XHJcblxyXG4gICAgbGV0IHBvbHlnb25BcmVhID0gTWF0aC5hYnMoc2lnbmVkQXJlYShkYXRhLCAwLCBvdXRlckxlbiwgZGltKSk7XHJcbiAgICBpZiAoaGFzSG9sZXMpIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gaG9sZUluZGljZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBob2xlSW5kaWNlc1tpXSAqIGRpbTtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gaSA8IGxlbiAtIDEgPyBob2xlSW5kaWNlc1tpICsgMV0gKiBkaW0gOiBkYXRhLmxlbmd0aDtcclxuICAgICAgICAgICAgcG9seWdvbkFyZWEgLT0gTWF0aC5hYnMoc2lnbmVkQXJlYShkYXRhLCBzdGFydCwgZW5kLCBkaW0pKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHRyaWFuZ2xlc0FyZWEgPSAwO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0cmlhbmdsZXMubGVuZ3RoOyBpICs9IDMpIHtcclxuICAgICAgICBjb25zdCBhID0gdHJpYW5nbGVzW2ldICogZGltO1xyXG4gICAgICAgIGNvbnN0IGIgPSB0cmlhbmdsZXNbaSArIDFdICogZGltO1xyXG4gICAgICAgIGNvbnN0IGMgPSB0cmlhbmdsZXNbaSArIDJdICogZGltO1xyXG4gICAgICAgIHRyaWFuZ2xlc0FyZWEgKz0gTWF0aC5hYnMoXHJcbiAgICAgICAgICAgIChkYXRhW2FdIC0gZGF0YVtjXSkgKiAoZGF0YVtiICsgMV0gLSBkYXRhW2EgKyAxXSkgLVxyXG4gICAgICAgICAgICAoZGF0YVthXSAtIGRhdGFbYl0pICogKGRhdGFbYyArIDFdIC0gZGF0YVthICsgMV0pKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcG9seWdvbkFyZWEgPT09IDAgJiYgdHJpYW5nbGVzQXJlYSA9PT0gMCA/IDAgOlxyXG4gICAgICAgIE1hdGguYWJzKCh0cmlhbmdsZXNBcmVhIC0gcG9seWdvbkFyZWEpIC8gcG9seWdvbkFyZWEpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBzaWduZWRBcmVhKGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSkge1xyXG4gICAgbGV0IHN1bSA9IDA7XHJcbiAgICBmb3IgKGxldCBpID0gc3RhcnQsIGogPSBlbmQgLSBkaW07IGkgPCBlbmQ7IGkgKz0gZGltKSB7XHJcbiAgICAgICAgc3VtICs9IChkYXRhW2pdIC0gZGF0YVtpXSkgKiAoZGF0YVtpICsgMV0gKyBkYXRhW2ogKyAxXSk7XHJcbiAgICAgICAgaiA9IGk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3VtO1xyXG59XHJcblxyXG4vLyB0dXJuIGEgcG9seWdvbiBpbiBhIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5IGZvcm0gKGUuZy4gYXMgaW4gR2VvSlNPTikgaW50byBhIGZvcm0gRWFyY3V0IGFjY2VwdHNcclxuZXhwb3J0IGZ1bmN0aW9uIGZsYXR0ZW4oZGF0YSkge1xyXG4gICAgY29uc3QgdmVydGljZXMgPSBbXTtcclxuICAgIGNvbnN0IGhvbGVzID0gW107XHJcbiAgICBjb25zdCBkaW1lbnNpb25zID0gZGF0YVswXVswXS5sZW5ndGg7XHJcbiAgICBsZXQgaG9sZUluZGV4ID0gMDtcclxuICAgIGxldCBwcmV2TGVuID0gMDtcclxuXHJcbiAgICBmb3IgKGNvbnN0IHJpbmcgb2YgZGF0YSkge1xyXG4gICAgICAgIGZvciAoY29uc3QgcCBvZiByaW5nKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGQgPSAwOyBkIDwgZGltZW5zaW9uczsgZCsrKSB2ZXJ0aWNlcy5wdXNoKHBbZF0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocHJldkxlbikge1xyXG4gICAgICAgICAgICBob2xlSW5kZXggKz0gcHJldkxlbjtcclxuICAgICAgICAgICAgaG9sZXMucHVzaChob2xlSW5kZXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBwcmV2TGVuID0gcmluZy5sZW5ndGg7XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge3ZlcnRpY2VzLCBob2xlcywgZGltZW5zaW9uc307XHJcbn1cclxuIiwiaW1wb3J0IGVhcmN1dCBmcm9tICcuL2xpYi9lYXJjdXQuanMnO1xyXG5cclxuY2xhc3MgRWFyY3V0IHtcclxuXHJcblx0LyoqXHJcblx0ICogVHJpYW5ndWxhdGVzIHRoZSBnaXZlbiBzaGFwZSBkZWZpbml0aW9uIGJ5IHJldHVybmluZyBhbiBhcnJheSBvZiB0cmlhbmdsZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IGRhdGEgLSBBbiBhcnJheSB3aXRoIDJEIHBvaW50cy5cclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IGhvbGVJbmRpY2VzIC0gQW4gYXJyYXkgd2l0aCBpbmRpY2VzIGRlZmluaW5nIGhvbGVzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZGltPTJdIC0gVGhlIG51bWJlciBvZiBjb29yZGluYXRlcyBwZXIgdmVydGV4IGluIHRoZSBpbnB1dCBhcnJheS5cclxuXHQgKiBAcmV0dXJuIHtBcnJheTxudW1iZXI+fSBBbiBhcnJheSByZXByZXNlbnRpbmcgdGhlIHRyaWFuZ3VsYXRlZCBmYWNlcy4gRWFjaCBmYWNlIGlzIGRlZmluZWQgYnkgdGhyZWUgY29uc2VjdXRpdmUgbnVtYmVyc1xyXG5cdCAqIHJlcHJlc2VudGluZyB2ZXJ0ZXggaW5kaWNlcy5cclxuXHQgKi9cclxuXHRzdGF0aWMgdHJpYW5ndWxhdGUoIGRhdGEsIGhvbGVJbmRpY2VzLCBkaW0gPSAyICkge1xyXG5cclxuXHRcdHJldHVybiBlYXJjdXQoIGRhdGEsIGhvbGVJbmRpY2VzLCBkaW0gKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgRWFyY3V0IH07XHJcbiIsImltcG9ydCB7IEVhcmN1dCB9IGZyb20gJy4vRWFyY3V0LmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIGNsYXNzIGNvbnRhaW5pbmcgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHNoYXBlcy5cclxuICpcclxuICogQGhpZGVjb25zdHJ1Y3RvclxyXG4gKi9cclxuY2xhc3MgU2hhcGVVdGlscyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENhbGN1bGF0ZSBhcmVhIG9mIGEgKCAyRCApIGNvbnRvdXIgcG9seWdvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8VmVjdG9yMj59IGNvbnRvdXIgLSBBbiBhcnJheSBvZiAyRCBwb2ludHMuXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgYXJlYS5cclxuXHQgKi9cclxuXHRzdGF0aWMgYXJlYSggY29udG91ciApIHtcclxuXHJcblx0XHRjb25zdCBuID0gY29udG91ci5sZW5ndGg7XHJcblx0XHRsZXQgYSA9IDAuMDtcclxuXHJcblx0XHRmb3IgKCBsZXQgcCA9IG4gLSAxLCBxID0gMDsgcSA8IG47IHAgPSBxICsrICkge1xyXG5cclxuXHRcdFx0YSArPSBjb250b3VyWyBwIF0ueCAqIGNvbnRvdXJbIHEgXS55IC0gY29udG91clsgcSBdLnggKiBjb250b3VyWyBwIF0ueTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGEgKiAwLjU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIGNvbnRvdXIgdXNlcyBhIGNsb2Nrd2lzZSB3aW5kaW5nIG9yZGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxWZWN0b3IyPn0gcHRzIC0gQW4gYXJyYXkgb2YgMkQgcG9pbnRzIGRlZmluaW5nIGEgcG9seWdvbi5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBnaXZlbiBjb250b3VyIHVzZXMgYSBjbG9ja3dpc2Ugd2luZGluZyBvcmRlciBvciBub3QuXHJcblx0ICovXHJcblx0c3RhdGljIGlzQ2xvY2tXaXNlKCBwdHMgKSB7XHJcblxyXG5cdFx0cmV0dXJuIFNoYXBlVXRpbHMuYXJlYSggcHRzICkgPCAwO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRyaWFuZ3VsYXRlcyB0aGUgZ2l2ZW4gc2hhcGUgZGVmaW5pdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8VmVjdG9yMj59IGNvbnRvdXIgLSBBbiBhcnJheSBvZiAyRCBwb2ludHMgZGVmaW5pbmcgdGhlIGNvbnRvdXIuXHJcblx0ICogQHBhcmFtIHtBcnJheTxBcnJheTxWZWN0b3IyPj59IGhvbGVzIC0gQW4gYXJyYXkgdGhhdCBob2xkcyBhcnJheXMgb2YgMkQgcG9pbnRzIGRlZmluaW5nIHRoZSBob2xlcy5cclxuXHQgKiBAcmV0dXJuIHtBcnJheTxBcnJheTxudW1iZXI+Pn0gQW4gYXJyYXkgdGhhdCBob2xkcyBmb3IgZWFjaCBmYWNlIGRlZmluaXRpb24gYW4gYXJyYXkgd2l0aCB0aHJlZSBpbmRpY2VzLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyB0cmlhbmd1bGF0ZVNoYXBlKCBjb250b3VyLCBob2xlcyApIHtcclxuXHJcblx0XHRjb25zdCB2ZXJ0aWNlcyA9IFtdOyAvLyBmbGF0IGFycmF5IG9mIHZlcnRpY2VzIGxpa2UgWyB4MCx5MCwgeDEseTEsIHgyLHkyLCAuLi4gXVxyXG5cdFx0Y29uc3QgaG9sZUluZGljZXMgPSBbXTsgLy8gYXJyYXkgb2YgaG9sZSBpbmRpY2VzXHJcblx0XHRjb25zdCBmYWNlcyA9IFtdOyAvLyBmaW5hbCBhcnJheSBvZiB2ZXJ0ZXggaW5kaWNlcyBsaWtlIFsgWyBhLGIsZCBdLCBbIGIsYyxkIF0gXVxyXG5cclxuXHRcdHJlbW92ZUR1cEVuZFB0cyggY29udG91ciApO1xyXG5cdFx0YWRkQ29udG91ciggdmVydGljZXMsIGNvbnRvdXIgKTtcclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGxldCBob2xlSW5kZXggPSBjb250b3VyLmxlbmd0aDtcclxuXHJcblx0XHRob2xlcy5mb3JFYWNoKCByZW1vdmVEdXBFbmRQdHMgKTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBob2xlcy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRob2xlSW5kaWNlcy5wdXNoKCBob2xlSW5kZXggKTtcclxuXHRcdFx0aG9sZUluZGV4ICs9IGhvbGVzWyBpIF0ubGVuZ3RoO1xyXG5cdFx0XHRhZGRDb250b3VyKCB2ZXJ0aWNlcywgaG9sZXNbIGkgXSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGNvbnN0IHRyaWFuZ2xlcyA9IEVhcmN1dC50cmlhbmd1bGF0ZSggdmVydGljZXMsIGhvbGVJbmRpY2VzICk7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB0cmlhbmdsZXMubGVuZ3RoOyBpICs9IDMgKSB7XHJcblxyXG5cdFx0XHRmYWNlcy5wdXNoKCB0cmlhbmdsZXMuc2xpY2UoIGksIGkgKyAzICkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGZhY2VzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiByZW1vdmVEdXBFbmRQdHMoIHBvaW50cyApIHtcclxuXHJcblx0Y29uc3QgbCA9IHBvaW50cy5sZW5ndGg7XHJcblxyXG5cdGlmICggbCA+IDIgJiYgcG9pbnRzWyBsIC0gMSBdLmVxdWFscyggcG9pbnRzWyAwIF0gKSApIHtcclxuXHJcblx0XHRwb2ludHMucG9wKCk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFkZENvbnRvdXIoIHZlcnRpY2VzLCBjb250b3VyICkge1xyXG5cclxuXHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBjb250b3VyLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHR2ZXJ0aWNlcy5wdXNoKCBjb250b3VyWyBpIF0ueCApO1xyXG5cdFx0dmVydGljZXMucHVzaCggY29udG91clsgaSBdLnkgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgU2hhcGVVdGlscyB9O1xyXG4iLCJpbXBvcnQgeyBCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyR2VvbWV0cnkuanMnO1xyXG5pbXBvcnQgeyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5pbXBvcnQgKiBhcyBDdXJ2ZXMgZnJvbSAnLi4vZXh0cmFzL2N1cnZlcy9DdXJ2ZXMuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IyLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcbmltcG9ydCB7IFNoYXBlIH0gZnJvbSAnLi4vZXh0cmFzL2NvcmUvU2hhcGUuanMnO1xyXG5pbXBvcnQgeyBTaGFwZVV0aWxzIH0gZnJvbSAnLi4vZXh0cmFzL1NoYXBlVXRpbHMuanMnO1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgZXh0cnVkZWQgZ2VvbWV0cnkgZnJvbSBhIHBhdGggc2hhcGUuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGxlbmd0aCA9IDEyLCB3aWR0aCA9IDg7XHJcbiAqXHJcbiAqIGNvbnN0IHNoYXBlID0gbmV3IFRIUkVFLlNoYXBlKCk7XHJcbiAqIHNoYXBlLm1vdmVUbyggMCwwICk7XHJcbiAqIHNoYXBlLmxpbmVUbyggMCwgd2lkdGggKTtcclxuICogc2hhcGUubGluZVRvKCBsZW5ndGgsIHdpZHRoICk7XHJcbiAqIHNoYXBlLmxpbmVUbyggbGVuZ3RoLCAwICk7XHJcbiAqIHNoYXBlLmxpbmVUbyggMCwgMCApO1xyXG4gKlxyXG4gKiBjb25zdCBnZW9tZXRyeSA9IG5ldyBUSFJFRS5FeHRydWRlR2VvbWV0cnkoIHNoYXBlICk7XHJcbiAqIGNvbnN0IG1hdGVyaWFsID0gbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiAweDAwZmYwMCB9ICk7XHJcbiAqIGNvbnN0IG1lc2ggPSBuZXcgVEhSRUUuTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICkgO1xyXG4gKiBzY2VuZS5hZGQoIG1lc2ggKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBCdWZmZXJHZW9tZXRyeVxyXG4gKi9cclxuY2xhc3MgRXh0cnVkZUdlb21ldHJ5IGV4dGVuZHMgQnVmZmVyR2VvbWV0cnkge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGV4dHJ1ZGUgZ2VvbWV0cnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1NoYXBlfEFycmF5PFNoYXBlPn0gW3NoYXBlc10gLSBBIHNoYXBlIG9yIGFuIGFycmF5IG9mIHNoYXBlcy5cclxuXHQgKiBAcGFyYW0ge0V4dHJ1ZGVHZW9tZXRyeX5PcHRpb25zfSBbb3B0aW9uc10gLSBUaGUgZXh0cnVkZSBzZXR0aW5ncy5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggc2hhcGVzID0gbmV3IFNoYXBlKCBbIG5ldyBWZWN0b3IyKCAwLjUsIDAuNSApLCBuZXcgVmVjdG9yMiggLSAwLjUsIDAuNSApLCBuZXcgVmVjdG9yMiggLSAwLjUsIC0gMC41ICksIG5ldyBWZWN0b3IyKCAwLjUsIC0gMC41ICkgXSApLCBvcHRpb25zID0ge30gKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnRXh0cnVkZUdlb21ldHJ5JztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvbGRzIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzIHRoYXQgaGF2ZSBiZWVuXHJcblx0XHQgKiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBnZW9tZXRyeS4gQW55IG1vZGlmaWNhdGlvblxyXG5cdFx0ICogYWZ0ZXIgaW5zdGFudGlhdGlvbiBkb2VzIG5vdCBjaGFuZ2UgdGhlIGdlb21ldHJ5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucGFyYW1ldGVycyA9IHtcclxuXHRcdFx0c2hhcGVzOiBzaGFwZXMsXHJcblx0XHRcdG9wdGlvbnM6IG9wdGlvbnNcclxuXHRcdH07XHJcblxyXG5cdFx0c2hhcGVzID0gQXJyYXkuaXNBcnJheSggc2hhcGVzICkgPyBzaGFwZXMgOiBbIHNoYXBlcyBdO1xyXG5cclxuXHRcdGNvbnN0IHNjb3BlID0gdGhpcztcclxuXHJcblx0XHRjb25zdCB2ZXJ0aWNlc0FycmF5ID0gW107XHJcblx0XHRjb25zdCB1dkFycmF5ID0gW107XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gc2hhcGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBzaGFwZSA9IHNoYXBlc1sgaSBdO1xyXG5cdFx0XHRhZGRTaGFwZSggc2hhcGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gYnVpbGQgZ2VvbWV0cnlcclxuXHJcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzQXJyYXksIDMgKSApO1xyXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dkFycmF5LCAyICkgKTtcclxuXHJcblx0XHR0aGlzLmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7XHJcblxyXG5cdFx0Ly8gZnVuY3Rpb25zXHJcblxyXG5cdFx0ZnVuY3Rpb24gYWRkU2hhcGUoIHNoYXBlICkge1xyXG5cclxuXHRcdFx0Y29uc3QgcGxhY2Vob2xkZXIgPSBbXTtcclxuXHJcblx0XHRcdC8vIG9wdGlvbnNcclxuXHJcblx0XHRcdGNvbnN0IGN1cnZlU2VnbWVudHMgPSBvcHRpb25zLmN1cnZlU2VnbWVudHMgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuY3VydmVTZWdtZW50cyA6IDEyO1xyXG5cdFx0XHRjb25zdCBzdGVwcyA9IG9wdGlvbnMuc3RlcHMgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuc3RlcHMgOiAxO1xyXG5cdFx0XHRjb25zdCBkZXB0aCA9IG9wdGlvbnMuZGVwdGggIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZGVwdGggOiAxO1xyXG5cclxuXHRcdFx0bGV0IGJldmVsRW5hYmxlZCA9IG9wdGlvbnMuYmV2ZWxFbmFibGVkICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJldmVsRW5hYmxlZCA6IHRydWU7XHJcblx0XHRcdGxldCBiZXZlbFRoaWNrbmVzcyA9IG9wdGlvbnMuYmV2ZWxUaGlja25lc3MgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuYmV2ZWxUaGlja25lc3MgOiAwLjI7XHJcblx0XHRcdGxldCBiZXZlbFNpemUgPSBvcHRpb25zLmJldmVsU2l6ZSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5iZXZlbFNpemUgOiBiZXZlbFRoaWNrbmVzcyAtIDAuMTtcclxuXHRcdFx0bGV0IGJldmVsT2Zmc2V0ID0gb3B0aW9ucy5iZXZlbE9mZnNldCAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5iZXZlbE9mZnNldCA6IDA7XHJcblx0XHRcdGxldCBiZXZlbFNlZ21lbnRzID0gb3B0aW9ucy5iZXZlbFNlZ21lbnRzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJldmVsU2VnbWVudHMgOiAzO1xyXG5cclxuXHRcdFx0Y29uc3QgZXh0cnVkZVBhdGggPSBvcHRpb25zLmV4dHJ1ZGVQYXRoO1xyXG5cclxuXHRcdFx0Y29uc3QgdXZnZW4gPSBvcHRpb25zLlVWR2VuZXJhdG9yICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLlVWR2VuZXJhdG9yIDogV29ybGRVVkdlbmVyYXRvcjtcclxuXHJcblx0XHRcdC8vXHJcblxyXG5cdFx0XHRsZXQgZXh0cnVkZVB0cywgZXh0cnVkZUJ5UGF0aCA9IGZhbHNlO1xyXG5cdFx0XHRsZXQgc3BsaW5lVHViZSwgYmlub3JtYWwsIG5vcm1hbCwgcG9zaXRpb24yO1xyXG5cclxuXHRcdFx0aWYgKCBleHRydWRlUGF0aCApIHtcclxuXHJcblx0XHRcdFx0ZXh0cnVkZVB0cyA9IGV4dHJ1ZGVQYXRoLmdldFNwYWNlZFBvaW50cyggc3RlcHMgKTtcclxuXHJcblx0XHRcdFx0ZXh0cnVkZUJ5UGF0aCA9IHRydWU7XHJcblx0XHRcdFx0YmV2ZWxFbmFibGVkID0gZmFsc2U7IC8vIGJldmVscyBub3Qgc3VwcG9ydGVkIGZvciBwYXRoIGV4dHJ1c2lvblxyXG5cclxuXHRcdFx0XHQvLyBTRVRVUCBUTkIgdmFyaWFibGVzXHJcblxyXG5cdFx0XHRcdC8vIFRPRE8xIC0gaGF2ZSBhIC5pc0Nsb3NlZCBpbiBzcGxpbmU/XHJcblxyXG5cdFx0XHRcdHNwbGluZVR1YmUgPSBleHRydWRlUGF0aC5jb21wdXRlRnJlbmV0RnJhbWVzKCBzdGVwcywgZmFsc2UgKTtcclxuXHJcblx0XHRcdFx0Ly8gY29uc29sZS5sb2coc3BsaW5lVHViZSwgJ3NwbGluZVR1YmUnLCBzcGxpbmVUdWJlLm5vcm1hbHMubGVuZ3RoLCAnc3RlcHMnLCBzdGVwcywgJ2V4dHJ1ZGVQdHMnLCBleHRydWRlUHRzLmxlbmd0aCk7XHJcblxyXG5cdFx0XHRcdGJpbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcclxuXHRcdFx0XHRub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xyXG5cdFx0XHRcdHBvc2l0aW9uMiA9IG5ldyBWZWN0b3IzKCk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBTYWZlZ3VhcmRzIGlmIGJldmVscyBhcmUgbm90IGVuYWJsZWRcclxuXHJcblx0XHRcdGlmICggISBiZXZlbEVuYWJsZWQgKSB7XHJcblxyXG5cdFx0XHRcdGJldmVsU2VnbWVudHMgPSAwO1xyXG5cdFx0XHRcdGJldmVsVGhpY2tuZXNzID0gMDtcclxuXHRcdFx0XHRiZXZlbFNpemUgPSAwO1xyXG5cdFx0XHRcdGJldmVsT2Zmc2V0ID0gMDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIFZhcmlhYmxlcyBpbml0aWFsaXphdGlvblxyXG5cclxuXHRcdFx0Y29uc3Qgc2hhcGVQb2ludHMgPSBzaGFwZS5leHRyYWN0UG9pbnRzKCBjdXJ2ZVNlZ21lbnRzICk7XHJcblxyXG5cdFx0XHRsZXQgdmVydGljZXMgPSBzaGFwZVBvaW50cy5zaGFwZTtcclxuXHRcdFx0Y29uc3QgaG9sZXMgPSBzaGFwZVBvaW50cy5ob2xlcztcclxuXHJcblx0XHRcdGNvbnN0IHJldmVyc2UgPSAhIFNoYXBlVXRpbHMuaXNDbG9ja1dpc2UoIHZlcnRpY2VzICk7XHJcblxyXG5cdFx0XHRpZiAoIHJldmVyc2UgKSB7XHJcblxyXG5cdFx0XHRcdHZlcnRpY2VzID0gdmVydGljZXMucmV2ZXJzZSgpO1xyXG5cclxuXHRcdFx0XHQvLyBNYXliZSB3ZSBzaG91bGQgYWxzbyBjaGVjayBpZiBob2xlcyBhcmUgaW4gdGhlIG9wcG9zaXRlIGRpcmVjdGlvbiwganVzdCB0byBiZSBzYWZlIC4uLlxyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaCA9IDAsIGhsID0gaG9sZXMubGVuZ3RoOyBoIDwgaGw7IGggKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgYWhvbGUgPSBob2xlc1sgaCBdO1xyXG5cclxuXHRcdFx0XHRcdGlmICggU2hhcGVVdGlscy5pc0Nsb2NrV2lzZSggYWhvbGUgKSApIHtcclxuXHJcblx0XHRcdFx0XHRcdGhvbGVzWyBoIF0gPSBhaG9sZS5yZXZlcnNlKCk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvKipNZXJnZXMgaW5kZXgtYWRqYWNlbnQgcG9pbnRzIHRoYXQgYXJlIHdpdGhpbiBhIHRocmVzaG9sZCBkaXN0YW5jZSBvZiBlYWNoIG90aGVyLiBBcnJheSBpcyBtb2RpZmllZCBpbi1wbGFjZS4gVGhyZXNob2xkIGRpc3RhbmNlIGlzIGVtcGlyaWNhbCwgYW5kIHNjYWxlZCBiYXNlZCBvbiB0aGUgbWFnbml0dWRlIG9mIHBvaW50IGNvb3JkaW5hdGVzLlxyXG5cdFx0XHQgKiBAcGFyYW0ge0FycmF5PFZlY3RvcjI+fSBwb2ludHNcclxuXHRcdFx0Ki9cclxuXHRcdFx0ZnVuY3Rpb24gbWVyZ2VPdmVybGFwcGluZ1BvaW50cyggcG9pbnRzICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBUSFJFU0hPTEQgPSAxZS0xMDtcclxuXHRcdFx0XHRjb25zdCBUSFJFU0hPTERfU1EgPSBUSFJFU0hPTEQgKiBUSFJFU0hPTEQ7XHJcblx0XHRcdFx0bGV0IHByZXZQb3MgPSBwb2ludHNbIDAgXTtcclxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDE7IGkgPD0gcG9pbnRzLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBjdXJyZW50SW5kZXggPSBpICUgcG9pbnRzLmxlbmd0aDtcclxuXHRcdFx0XHRcdGNvbnN0IGN1cnJlbnRQb3MgPSBwb2ludHNbIGN1cnJlbnRJbmRleCBdO1xyXG5cdFx0XHRcdFx0Y29uc3QgZHggPSBjdXJyZW50UG9zLnggLSBwcmV2UG9zLng7XHJcblx0XHRcdFx0XHRjb25zdCBkeSA9IGN1cnJlbnRQb3MueSAtIHByZXZQb3MueTtcclxuXHRcdFx0XHRcdGNvbnN0IGRpc3RTcSA9IGR4ICogZHggKyBkeSAqIGR5O1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHNjYWxpbmdGYWN0b3JTcXJ0ID0gTWF0aC5tYXgoXHJcblx0XHRcdFx0XHRcdE1hdGguYWJzKCBjdXJyZW50UG9zLnggKSxcclxuXHRcdFx0XHRcdFx0TWF0aC5hYnMoIGN1cnJlbnRQb3MueSApLFxyXG5cdFx0XHRcdFx0XHRNYXRoLmFicyggcHJldlBvcy54ICksXHJcblx0XHRcdFx0XHRcdE1hdGguYWJzKCBwcmV2UG9zLnkgKVxyXG5cdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdGNvbnN0IHRoZXNob2xkU3FTY2FsZWQgPSBUSFJFU0hPTERfU1EgKiBzY2FsaW5nRmFjdG9yU3FydCAqIHNjYWxpbmdGYWN0b3JTcXJ0O1xyXG5cdFx0XHRcdFx0aWYgKCBkaXN0U3EgPD0gdGhlc2hvbGRTcVNjYWxlZCApIHtcclxuXHJcblx0XHRcdFx0XHRcdHBvaW50cy5zcGxpY2UoIGN1cnJlbnRJbmRleCwgMSApO1xyXG5cdFx0XHRcdFx0XHRpIC0tO1xyXG5cdFx0XHRcdFx0XHRjb250aW51ZTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0cHJldlBvcyA9IGN1cnJlbnRQb3M7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdG1lcmdlT3ZlcmxhcHBpbmdQb2ludHMoIHZlcnRpY2VzICk7XHJcblx0XHRcdGhvbGVzLmZvckVhY2goIG1lcmdlT3ZlcmxhcHBpbmdQb2ludHMgKTtcclxuXHJcblx0XHRcdGNvbnN0IG51bUhvbGVzID0gaG9sZXMubGVuZ3RoO1xyXG5cclxuXHRcdFx0LyogVmVydGljZXMgKi9cclxuXHJcblx0XHRcdGNvbnN0IGNvbnRvdXIgPSB2ZXJ0aWNlczsgLy8gdmVydGljZXMgaGFzIGFsbCBwb2ludHMgYnV0IGNvbnRvdXIgaGFzIG9ubHkgcG9pbnRzIG9mIGNpcmN1bWZlcmVuY2VcclxuXHJcblx0XHRcdGZvciAoIGxldCBoID0gMDsgaCA8IG51bUhvbGVzOyBoICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBhaG9sZSA9IGhvbGVzWyBoIF07XHJcblxyXG5cdFx0XHRcdHZlcnRpY2VzID0gdmVydGljZXMuY29uY2F0KCBhaG9sZSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHJcblx0XHRcdGZ1bmN0aW9uIHNjYWxlUHQyKCBwdCwgdmVjLCBzaXplICkge1xyXG5cclxuXHRcdFx0XHRpZiAoICEgdmVjICkgY29uc29sZS5lcnJvciggJ1RIUkVFLkV4dHJ1ZGVHZW9tZXRyeTogdmVjIGRvZXMgbm90IGV4aXN0JyApO1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gcHQuY2xvbmUoKS5hZGRTY2FsZWRWZWN0b3IoIHZlYywgc2l6ZSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgdmxlbiA9IHZlcnRpY2VzLmxlbmd0aDtcclxuXHJcblxyXG5cdFx0XHQvLyBGaW5kIGRpcmVjdGlvbnMgZm9yIHBvaW50IG1vdmVtZW50XHJcblxyXG5cclxuXHRcdFx0ZnVuY3Rpb24gZ2V0QmV2ZWxWZWMoIGluUHQsIGluUHJldiwgaW5OZXh0ICkge1xyXG5cclxuXHRcdFx0XHQvLyBjb21wdXRlcyBmb3IgaW5QdCB0aGUgY29ycmVzcG9uZGluZyBwb2ludCBpblB0JyBvbiBhIG5ldyBjb250b3VyXHJcblx0XHRcdFx0Ly8gICBzaGlmdGVkIGJ5IDEgdW5pdCAobGVuZ3RoIG9mIG5vcm1hbGl6ZWQgdmVjdG9yKSB0byB0aGUgbGVmdFxyXG5cdFx0XHRcdC8vIGlmIHdlIHdhbGsgYWxvbmcgY29udG91ciBjbG9ja3dpc2UsIHRoaXMgbmV3IGNvbnRvdXIgaXMgb3V0c2lkZSB0aGUgb2xkIG9uZVxyXG5cdFx0XHRcdC8vXHJcblx0XHRcdFx0Ly8gaW5QdCcgaXMgdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgdHdvIGxpbmVzIHBhcmFsbGVsIHRvIHRoZSB0d29cclxuXHRcdFx0XHQvLyAgYWRqYWNlbnQgZWRnZXMgb2YgaW5QdCBhdCBhIGRpc3RhbmNlIG9mIDEgdW5pdCBvbiB0aGUgbGVmdCBzaWRlLlxyXG5cclxuXHRcdFx0XHRsZXQgdl90cmFuc194LCB2X3RyYW5zX3ksIHNocmlua19ieTsgLy8gcmVzdWx0aW5nIHRyYW5zbGF0aW9uIHZlY3RvciBmb3IgaW5QdFxyXG5cclxuXHRcdFx0XHQvLyBnb29kIHJlYWRpbmcgZm9yIGdlb21ldHJ5IGFsZ29yaXRobXMgKGhlcmU6IGxpbmUtbGluZSBpbnRlcnNlY3Rpb24pXHJcblx0XHRcdFx0Ly8gaHR0cDovL2dlb21hbGdvcml0aG1zLmNvbS9hMDUtX2ludGVyc2VjdC0xLmh0bWxcclxuXHJcblx0XHRcdFx0Y29uc3Qgdl9wcmV2X3ggPSBpblB0LnggLSBpblByZXYueCxcclxuXHRcdFx0XHRcdHZfcHJldl95ID0gaW5QdC55IC0gaW5QcmV2Lnk7XHJcblx0XHRcdFx0Y29uc3Qgdl9uZXh0X3ggPSBpbk5leHQueCAtIGluUHQueCxcclxuXHRcdFx0XHRcdHZfbmV4dF95ID0gaW5OZXh0LnkgLSBpblB0Lnk7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHZfcHJldl9sZW5zcSA9ICggdl9wcmV2X3ggKiB2X3ByZXZfeCArIHZfcHJldl95ICogdl9wcmV2X3kgKTtcclxuXHJcblx0XHRcdFx0Ly8gY2hlY2sgZm9yIGNvbGxpbmVhciBlZGdlc1xyXG5cdFx0XHRcdGNvbnN0IGNvbGxpbmVhcjAgPSAoIHZfcHJldl94ICogdl9uZXh0X3kgLSB2X3ByZXZfeSAqIHZfbmV4dF94ICk7XHJcblxyXG5cdFx0XHRcdGlmICggTWF0aC5hYnMoIGNvbGxpbmVhcjAgKSA+IE51bWJlci5FUFNJTE9OICkge1xyXG5cclxuXHRcdFx0XHRcdC8vIG5vdCBjb2xsaW5lYXJcclxuXHJcblx0XHRcdFx0XHQvLyBsZW5ndGggb2YgdmVjdG9ycyBmb3Igbm9ybWFsaXppbmdcclxuXHJcblx0XHRcdFx0XHRjb25zdCB2X3ByZXZfbGVuID0gTWF0aC5zcXJ0KCB2X3ByZXZfbGVuc3EgKTtcclxuXHRcdFx0XHRcdGNvbnN0IHZfbmV4dF9sZW4gPSBNYXRoLnNxcnQoIHZfbmV4dF94ICogdl9uZXh0X3ggKyB2X25leHRfeSAqIHZfbmV4dF95ICk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gc2hpZnQgYWRqYWNlbnQgcG9pbnRzIGJ5IHVuaXQgdmVjdG9ycyB0byB0aGUgbGVmdFxyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHB0UHJldlNoaWZ0X3ggPSAoIGluUHJldi54IC0gdl9wcmV2X3kgLyB2X3ByZXZfbGVuICk7XHJcblx0XHRcdFx0XHRjb25zdCBwdFByZXZTaGlmdF95ID0gKCBpblByZXYueSArIHZfcHJldl94IC8gdl9wcmV2X2xlbiApO1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHB0TmV4dFNoaWZ0X3ggPSAoIGluTmV4dC54IC0gdl9uZXh0X3kgLyB2X25leHRfbGVuICk7XHJcblx0XHRcdFx0XHRjb25zdCBwdE5leHRTaGlmdF95ID0gKCBpbk5leHQueSArIHZfbmV4dF94IC8gdl9uZXh0X2xlbiApO1xyXG5cclxuXHRcdFx0XHRcdC8vIHNjYWxpbmcgZmFjdG9yIGZvciB2X3ByZXYgdG8gaW50ZXJzZWN0aW9uIHBvaW50XHJcblxyXG5cdFx0XHRcdFx0Y29uc3Qgc2YgPSAoICggcHROZXh0U2hpZnRfeCAtIHB0UHJldlNoaWZ0X3ggKSAqIHZfbmV4dF95IC1cclxuXHRcdFx0XHRcdFx0XHQoIHB0TmV4dFNoaWZ0X3kgLSBwdFByZXZTaGlmdF95ICkgKiB2X25leHRfeCApIC9cclxuXHRcdFx0XHRcdFx0KCB2X3ByZXZfeCAqIHZfbmV4dF95IC0gdl9wcmV2X3kgKiB2X25leHRfeCApO1xyXG5cclxuXHRcdFx0XHRcdC8vIHZlY3RvciBmcm9tIGluUHQgdG8gaW50ZXJzZWN0aW9uIHBvaW50XHJcblxyXG5cdFx0XHRcdFx0dl90cmFuc194ID0gKCBwdFByZXZTaGlmdF94ICsgdl9wcmV2X3ggKiBzZiAtIGluUHQueCApO1xyXG5cdFx0XHRcdFx0dl90cmFuc195ID0gKCBwdFByZXZTaGlmdF95ICsgdl9wcmV2X3kgKiBzZiAtIGluUHQueSApO1xyXG5cclxuXHRcdFx0XHRcdC8vIERvbid0IG5vcm1hbGl6ZSEsIG90aGVyd2lzZSBzaGFycCBjb3JuZXJzIGJlY29tZSB1Z2x5XHJcblx0XHRcdFx0XHQvLyAgYnV0IHByZXZlbnQgY3Jhenkgc3Bpa2VzXHJcblx0XHRcdFx0XHRjb25zdCB2X3RyYW5zX2xlbnNxID0gKCB2X3RyYW5zX3ggKiB2X3RyYW5zX3ggKyB2X3RyYW5zX3kgKiB2X3RyYW5zX3kgKTtcclxuXHRcdFx0XHRcdGlmICggdl90cmFuc19sZW5zcSA8PSAyICkge1xyXG5cclxuXHRcdFx0XHRcdFx0cmV0dXJuIG5ldyBWZWN0b3IyKCB2X3RyYW5zX3gsIHZfdHJhbnNfeSApO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRzaHJpbmtfYnkgPSBNYXRoLnNxcnQoIHZfdHJhbnNfbGVuc3EgLyAyICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdC8vIGhhbmRsZSBzcGVjaWFsIGNhc2Ugb2YgY29sbGluZWFyIGVkZ2VzXHJcblxyXG5cdFx0XHRcdFx0bGV0IGRpcmVjdGlvbl9lcSA9IGZhbHNlOyAvLyBhc3N1bWVzOiBvcHBvc2l0ZVxyXG5cclxuXHRcdFx0XHRcdGlmICggdl9wcmV2X3ggPiBOdW1iZXIuRVBTSUxPTiApIHtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggdl9uZXh0X3ggPiBOdW1iZXIuRVBTSUxPTiApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0ZGlyZWN0aW9uX2VxID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCB2X3ByZXZfeCA8IC0gTnVtYmVyLkVQU0lMT04gKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmICggdl9uZXh0X3ggPCAtIE51bWJlci5FUFNJTE9OICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGRpcmVjdGlvbl9lcSA9IHRydWU7XHJcblxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmICggTWF0aC5zaWduKCB2X3ByZXZfeSApID09PSBNYXRoLnNpZ24oIHZfbmV4dF95ICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0ZGlyZWN0aW9uX2VxID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRpZiAoIGRpcmVjdGlvbl9lcSApIHtcclxuXHJcblx0XHRcdFx0XHRcdC8vIGNvbnNvbGUubG9nKFwiV2FybmluZzogbGluZXMgYXJlIGEgc3RyYWlnaHQgc2VxdWVuY2VcIik7XHJcblx0XHRcdFx0XHRcdHZfdHJhbnNfeCA9IC0gdl9wcmV2X3k7XHJcblx0XHRcdFx0XHRcdHZfdHJhbnNfeSA9IHZfcHJldl94O1xyXG5cdFx0XHRcdFx0XHRzaHJpbmtfYnkgPSBNYXRoLnNxcnQoIHZfcHJldl9sZW5zcSApO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBjb25zb2xlLmxvZyhcIldhcm5pbmc6IGxpbmVzIGFyZSBhIHN0cmFpZ2h0IHNwaWtlXCIpO1xyXG5cdFx0XHRcdFx0XHR2X3RyYW5zX3ggPSB2X3ByZXZfeDtcclxuXHRcdFx0XHRcdFx0dl90cmFuc195ID0gdl9wcmV2X3k7XHJcblx0XHRcdFx0XHRcdHNocmlua19ieSA9IE1hdGguc3FydCggdl9wcmV2X2xlbnNxIC8gMiApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRyZXR1cm4gbmV3IFZlY3RvcjIoIHZfdHJhbnNfeCAvIHNocmlua19ieSwgdl90cmFuc195IC8gc2hyaW5rX2J5ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cclxuXHRcdFx0Y29uc3QgY29udG91ck1vdmVtZW50cyA9IFtdO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IGNvbnRvdXIubGVuZ3RoLCBqID0gaWwgLSAxLCBrID0gaSArIDE7IGkgPCBpbDsgaSArKywgaiArKywgayArKyApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBqID09PSBpbCApIGogPSAwO1xyXG5cdFx0XHRcdGlmICggayA9PT0gaWwgKSBrID0gMDtcclxuXHJcblx0XHRcdFx0Ly8gIChqKS0tLShpKS0tLShrKVxyXG5cdFx0XHRcdC8vIGNvbnNvbGUubG9nKCdpLGosaycsIGksIGogLCBrKVxyXG5cclxuXHRcdFx0XHRjb250b3VyTW92ZW1lbnRzWyBpIF0gPSBnZXRCZXZlbFZlYyggY29udG91clsgaSBdLCBjb250b3VyWyBqIF0sIGNvbnRvdXJbIGsgXSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgaG9sZXNNb3ZlbWVudHMgPSBbXTtcclxuXHRcdFx0bGV0IG9uZUhvbGVNb3ZlbWVudHMsIHZlcnRpY2VzTW92ZW1lbnRzID0gY29udG91ck1vdmVtZW50cy5jb25jYXQoKTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBoID0gMCwgaGwgPSBudW1Ib2xlczsgaCA8IGhsOyBoICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBhaG9sZSA9IGhvbGVzWyBoIF07XHJcblxyXG5cdFx0XHRcdG9uZUhvbGVNb3ZlbWVudHMgPSBbXTtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IGFob2xlLmxlbmd0aCwgaiA9IGlsIC0gMSwgayA9IGkgKyAxOyBpIDwgaWw7IGkgKyssIGogKyssIGsgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBqID09PSBpbCApIGogPSAwO1xyXG5cdFx0XHRcdFx0aWYgKCBrID09PSBpbCApIGsgPSAwO1xyXG5cclxuXHRcdFx0XHRcdC8vICAoaiktLS0oaSktLS0oaylcclxuXHRcdFx0XHRcdG9uZUhvbGVNb3ZlbWVudHNbIGkgXSA9IGdldEJldmVsVmVjKCBhaG9sZVsgaSBdLCBhaG9sZVsgaiBdLCBhaG9sZVsgayBdICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aG9sZXNNb3ZlbWVudHMucHVzaCggb25lSG9sZU1vdmVtZW50cyApO1xyXG5cdFx0XHRcdHZlcnRpY2VzTW92ZW1lbnRzID0gdmVydGljZXNNb3ZlbWVudHMuY29uY2F0KCBvbmVIb2xlTW92ZW1lbnRzICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBjb250cmFjdGVkQ29udG91clZlcnRpY2VzID0gW107XHJcblx0XHRcdGNvbnN0IGV4cGFuZGVkSG9sZVZlcnRpY2VzID0gW107XHJcblxyXG5cdFx0XHQvLyBMb29wIGJldmVsU2VnbWVudHMsIDEgZm9yIHRoZSBmcm9udCwgMSBmb3IgdGhlIGJhY2tcclxuXHJcblx0XHRcdGZvciAoIGxldCBiID0gMDsgYiA8IGJldmVsU2VnbWVudHM7IGIgKysgKSB7XHJcblxyXG5cdFx0XHRcdC8vZm9yICggYiA9IGJldmVsU2VnbWVudHM7IGIgPiAwOyBiIC0tICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB0ID0gYiAvIGJldmVsU2VnbWVudHM7XHJcblx0XHRcdFx0Y29uc3QgeiA9IGJldmVsVGhpY2tuZXNzICogTWF0aC5jb3MoIHQgKiBNYXRoLlBJIC8gMiApO1xyXG5cdFx0XHRcdGNvbnN0IGJzID0gYmV2ZWxTaXplICogTWF0aC5zaW4oIHQgKiBNYXRoLlBJIC8gMiApICsgYmV2ZWxPZmZzZXQ7XHJcblxyXG5cdFx0XHRcdC8vIGNvbnRyYWN0IHNoYXBlXHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBjb250b3VyLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHZlcnQgPSBzY2FsZVB0MiggY29udG91clsgaSBdLCBjb250b3VyTW92ZW1lbnRzWyBpIF0sIGJzICk7XHJcblxyXG5cdFx0XHRcdFx0diggdmVydC54LCB2ZXJ0LnksIC0geiApO1xyXG5cdFx0XHRcdFx0aWYgKCB0ID09IDAgKSBjb250cmFjdGVkQ29udG91clZlcnRpY2VzLnB1c2goIHZlcnQgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyBleHBhbmQgaG9sZXNcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGggPSAwLCBobCA9IG51bUhvbGVzOyBoIDwgaGw7IGggKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgYWhvbGUgPSBob2xlc1sgaCBdO1xyXG5cdFx0XHRcdFx0b25lSG9sZU1vdmVtZW50cyA9IGhvbGVzTW92ZW1lbnRzWyBoIF07XHJcblx0XHRcdFx0XHRjb25zdCBvbmVIb2xlVmVydGljZXMgPSBbXTtcclxuXHRcdFx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBhaG9sZS5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnN0IHZlcnQgPSBzY2FsZVB0MiggYWhvbGVbIGkgXSwgb25lSG9sZU1vdmVtZW50c1sgaSBdLCBicyApO1xyXG5cclxuXHRcdFx0XHRcdFx0diggdmVydC54LCB2ZXJ0LnksIC0geiApO1xyXG5cdFx0XHRcdFx0XHRpZiAoIHQgPT0gMCApIG9uZUhvbGVWZXJ0aWNlcy5wdXNoKCB2ZXJ0ICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGlmICggdCA9PSAwICkgZXhwYW5kZWRIb2xlVmVydGljZXMucHVzaCggb25lSG9sZVZlcnRpY2VzICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IGZhY2VzID0gU2hhcGVVdGlscy50cmlhbmd1bGF0ZVNoYXBlKCBjb250cmFjdGVkQ29udG91clZlcnRpY2VzLCBleHBhbmRlZEhvbGVWZXJ0aWNlcyApO1xyXG5cclxuXHRcdFx0Y29uc3QgZmxlbiA9IGZhY2VzLmxlbmd0aDtcclxuXHJcblx0XHRcdGNvbnN0IGJzID0gYmV2ZWxTaXplICsgYmV2ZWxPZmZzZXQ7XHJcblxyXG5cdFx0XHQvLyBCYWNrIGZhY2luZyB2ZXJ0aWNlc1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdmxlbjsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgdmVydCA9IGJldmVsRW5hYmxlZCA/IHNjYWxlUHQyKCB2ZXJ0aWNlc1sgaSBdLCB2ZXJ0aWNlc01vdmVtZW50c1sgaSBdLCBicyApIDogdmVydGljZXNbIGkgXTtcclxuXHJcblx0XHRcdFx0aWYgKCAhIGV4dHJ1ZGVCeVBhdGggKSB7XHJcblxyXG5cdFx0XHRcdFx0diggdmVydC54LCB2ZXJ0LnksIDAgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHQvLyB2KCB2ZXJ0LngsIHZlcnQueSArIGV4dHJ1ZGVQdHNbIDAgXS55LCBleHRydWRlUHRzWyAwIF0ueCApO1xyXG5cclxuXHRcdFx0XHRcdG5vcm1hbC5jb3B5KCBzcGxpbmVUdWJlLm5vcm1hbHNbIDAgXSApLm11bHRpcGx5U2NhbGFyKCB2ZXJ0LnggKTtcclxuXHRcdFx0XHRcdGJpbm9ybWFsLmNvcHkoIHNwbGluZVR1YmUuYmlub3JtYWxzWyAwIF0gKS5tdWx0aXBseVNjYWxhciggdmVydC55ICk7XHJcblxyXG5cdFx0XHRcdFx0cG9zaXRpb24yLmNvcHkoIGV4dHJ1ZGVQdHNbIDAgXSApLmFkZCggbm9ybWFsICkuYWRkKCBiaW5vcm1hbCApO1xyXG5cclxuXHRcdFx0XHRcdHYoIHBvc2l0aW9uMi54LCBwb3NpdGlvbjIueSwgcG9zaXRpb24yLnogKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gQWRkIHN0ZXBwZWQgdmVydGljZXMuLi5cclxuXHRcdFx0Ly8gSW5jbHVkaW5nIGZyb250IGZhY2luZyB2ZXJ0aWNlc1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IHMgPSAxOyBzIDw9IHN0ZXBzOyBzICsrICkge1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB2bGVuOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHZlcnQgPSBiZXZlbEVuYWJsZWQgPyBzY2FsZVB0MiggdmVydGljZXNbIGkgXSwgdmVydGljZXNNb3ZlbWVudHNbIGkgXSwgYnMgKSA6IHZlcnRpY2VzWyBpIF07XHJcblxyXG5cdFx0XHRcdFx0aWYgKCAhIGV4dHJ1ZGVCeVBhdGggKSB7XHJcblxyXG5cdFx0XHRcdFx0XHR2KCB2ZXJ0LngsIHZlcnQueSwgZGVwdGggLyBzdGVwcyAqIHMgKTtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0Ly8gdiggdmVydC54LCB2ZXJ0LnkgKyBleHRydWRlUHRzWyBzIC0gMSBdLnksIGV4dHJ1ZGVQdHNbIHMgLSAxIF0ueCApO1xyXG5cclxuXHRcdFx0XHRcdFx0bm9ybWFsLmNvcHkoIHNwbGluZVR1YmUubm9ybWFsc1sgcyBdICkubXVsdGlwbHlTY2FsYXIoIHZlcnQueCApO1xyXG5cdFx0XHRcdFx0XHRiaW5vcm1hbC5jb3B5KCBzcGxpbmVUdWJlLmJpbm9ybWFsc1sgcyBdICkubXVsdGlwbHlTY2FsYXIoIHZlcnQueSApO1xyXG5cclxuXHRcdFx0XHRcdFx0cG9zaXRpb24yLmNvcHkoIGV4dHJ1ZGVQdHNbIHMgXSApLmFkZCggbm9ybWFsICkuYWRkKCBiaW5vcm1hbCApO1xyXG5cclxuXHRcdFx0XHRcdFx0diggcG9zaXRpb24yLngsIHBvc2l0aW9uMi55LCBwb3NpdGlvbjIueiApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHJcblx0XHRcdC8vIEFkZCBiZXZlbCBzZWdtZW50cyBwbGFuZXNcclxuXHJcblx0XHRcdC8vZm9yICggYiA9IDE7IGIgPD0gYmV2ZWxTZWdtZW50czsgYiArKyApIHtcclxuXHRcdFx0Zm9yICggbGV0IGIgPSBiZXZlbFNlZ21lbnRzIC0gMTsgYiA+PSAwOyBiIC0tICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB0ID0gYiAvIGJldmVsU2VnbWVudHM7XHJcblx0XHRcdFx0Y29uc3QgeiA9IGJldmVsVGhpY2tuZXNzICogTWF0aC5jb3MoIHQgKiBNYXRoLlBJIC8gMiApO1xyXG5cdFx0XHRcdGNvbnN0IGJzID0gYmV2ZWxTaXplICogTWF0aC5zaW4oIHQgKiBNYXRoLlBJIC8gMiApICsgYmV2ZWxPZmZzZXQ7XHJcblxyXG5cdFx0XHRcdC8vIGNvbnRyYWN0IHNoYXBlXHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBjb250b3VyLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHZlcnQgPSBzY2FsZVB0MiggY29udG91clsgaSBdLCBjb250b3VyTW92ZW1lbnRzWyBpIF0sIGJzICk7XHJcblx0XHRcdFx0XHR2KCB2ZXJ0LngsIHZlcnQueSwgZGVwdGggKyB6ICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Ly8gZXhwYW5kIGhvbGVzXHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBoID0gMCwgaGwgPSBob2xlcy5sZW5ndGg7IGggPCBobDsgaCArKyApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBhaG9sZSA9IGhvbGVzWyBoIF07XHJcblx0XHRcdFx0XHRvbmVIb2xlTW92ZW1lbnRzID0gaG9sZXNNb3ZlbWVudHNbIGggXTtcclxuXHJcblx0XHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gYWhvbGUubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCB2ZXJ0ID0gc2NhbGVQdDIoIGFob2xlWyBpIF0sIG9uZUhvbGVNb3ZlbWVudHNbIGkgXSwgYnMgKTtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggISBleHRydWRlQnlQYXRoICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHR2KCB2ZXJ0LngsIHZlcnQueSwgZGVwdGggKyB6ICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0XHR2KCB2ZXJ0LngsIHZlcnQueSArIGV4dHJ1ZGVQdHNbIHN0ZXBzIC0gMSBdLnksIGV4dHJ1ZGVQdHNbIHN0ZXBzIC0gMSBdLnggKyB6ICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvKiBGYWNlcyAqL1xyXG5cclxuXHRcdFx0Ly8gVG9wIGFuZCBib3R0b20gZmFjZXNcclxuXHJcblx0XHRcdGJ1aWxkTGlkRmFjZXMoKTtcclxuXHJcblx0XHRcdC8vIFNpZGVzIGZhY2VzXHJcblxyXG5cdFx0XHRidWlsZFNpZGVGYWNlcygpO1xyXG5cclxuXHJcblx0XHRcdC8vLy8vICBJbnRlcm5hbCBmdW5jdGlvbnNcclxuXHJcblx0XHRcdGZ1bmN0aW9uIGJ1aWxkTGlkRmFjZXMoKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHN0YXJ0ID0gdmVydGljZXNBcnJheS5sZW5ndGggLyAzO1xyXG5cclxuXHRcdFx0XHRpZiAoIGJldmVsRW5hYmxlZCApIHtcclxuXHJcblx0XHRcdFx0XHRsZXQgbGF5ZXIgPSAwOyAvLyBzdGVwcyArIDFcclxuXHRcdFx0XHRcdGxldCBvZmZzZXQgPSB2bGVuICogbGF5ZXI7XHJcblxyXG5cdFx0XHRcdFx0Ly8gQm90dG9tIGZhY2VzXHJcblxyXG5cdFx0XHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgZmxlbjsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnN0IGZhY2UgPSBmYWNlc1sgaSBdO1xyXG5cdFx0XHRcdFx0XHRmMyggZmFjZVsgMiBdICsgb2Zmc2V0LCBmYWNlWyAxIF0gKyBvZmZzZXQsIGZhY2VbIDAgXSArIG9mZnNldCApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRsYXllciA9IHN0ZXBzICsgYmV2ZWxTZWdtZW50cyAqIDI7XHJcblx0XHRcdFx0XHRvZmZzZXQgPSB2bGVuICogbGF5ZXI7XHJcblxyXG5cdFx0XHRcdFx0Ly8gVG9wIGZhY2VzXHJcblxyXG5cdFx0XHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgZmxlbjsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnN0IGZhY2UgPSBmYWNlc1sgaSBdO1xyXG5cdFx0XHRcdFx0XHRmMyggZmFjZVsgMCBdICsgb2Zmc2V0LCBmYWNlWyAxIF0gKyBvZmZzZXQsIGZhY2VbIDIgXSArIG9mZnNldCApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHQvLyBCb3R0b20gZmFjZXNcclxuXHJcblx0XHRcdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBmbGVuOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgZmFjZSA9IGZhY2VzWyBpIF07XHJcblx0XHRcdFx0XHRcdGYzKCBmYWNlWyAyIF0sIGZhY2VbIDEgXSwgZmFjZVsgMCBdICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8vIFRvcCBmYWNlc1xyXG5cclxuXHRcdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGZsZW47IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCBmYWNlID0gZmFjZXNbIGkgXTtcclxuXHRcdFx0XHRcdFx0ZjMoIGZhY2VbIDAgXSArIHZsZW4gKiBzdGVwcywgZmFjZVsgMSBdICsgdmxlbiAqIHN0ZXBzLCBmYWNlWyAyIF0gKyB2bGVuICogc3RlcHMgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0c2NvcGUuYWRkR3JvdXAoIHN0YXJ0LCB2ZXJ0aWNlc0FycmF5Lmxlbmd0aCAvIDMgLSBzdGFydCwgMCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gQ3JlYXRlIGZhY2VzIGZvciB0aGUgei1zaWRlcyBvZiB0aGUgc2hhcGVcclxuXHJcblx0XHRcdGZ1bmN0aW9uIGJ1aWxkU2lkZUZhY2VzKCkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBzdGFydCA9IHZlcnRpY2VzQXJyYXkubGVuZ3RoIC8gMztcclxuXHRcdFx0XHRsZXQgbGF5ZXJvZmZzZXQgPSAwO1xyXG5cdFx0XHRcdHNpZGV3YWxscyggY29udG91ciwgbGF5ZXJvZmZzZXQgKTtcclxuXHRcdFx0XHRsYXllcm9mZnNldCArPSBjb250b3VyLmxlbmd0aDtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGggPSAwLCBobCA9IGhvbGVzLmxlbmd0aDsgaCA8IGhsOyBoICsrICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGFob2xlID0gaG9sZXNbIGggXTtcclxuXHRcdFx0XHRcdHNpZGV3YWxscyggYWhvbGUsIGxheWVyb2Zmc2V0ICk7XHJcblxyXG5cdFx0XHRcdFx0Ly8sIHRydWVcclxuXHRcdFx0XHRcdGxheWVyb2Zmc2V0ICs9IGFob2xlLmxlbmd0aDtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHJcblx0XHRcdFx0c2NvcGUuYWRkR3JvdXAoIHN0YXJ0LCB2ZXJ0aWNlc0FycmF5Lmxlbmd0aCAvIDMgLSBzdGFydCwgMSApO1xyXG5cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGZ1bmN0aW9uIHNpZGV3YWxscyggY29udG91ciwgbGF5ZXJvZmZzZXQgKSB7XHJcblxyXG5cdFx0XHRcdGxldCBpID0gY29udG91ci5sZW5ndGg7XHJcblxyXG5cdFx0XHRcdHdoaWxlICggLS0gaSA+PSAwICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGogPSBpO1xyXG5cdFx0XHRcdFx0bGV0IGsgPSBpIC0gMTtcclxuXHRcdFx0XHRcdGlmICggayA8IDAgKSBrID0gY29udG91ci5sZW5ndGggLSAxO1xyXG5cclxuXHRcdFx0XHRcdC8vY29uc29sZS5sb2coJ2InLCBpLGosIGktMSwgayx2ZXJ0aWNlcy5sZW5ndGgpO1xyXG5cclxuXHRcdFx0XHRcdGZvciAoIGxldCBzID0gMCwgc2wgPSAoIHN0ZXBzICsgYmV2ZWxTZWdtZW50cyAqIDIgKTsgcyA8IHNsOyBzICsrICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3Qgc2xlbjEgPSB2bGVuICogcztcclxuXHRcdFx0XHRcdFx0Y29uc3Qgc2xlbjIgPSB2bGVuICogKCBzICsgMSApO1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgYSA9IGxheWVyb2Zmc2V0ICsgaiArIHNsZW4xLFxyXG5cdFx0XHRcdFx0XHRcdGIgPSBsYXllcm9mZnNldCArIGsgKyBzbGVuMSxcclxuXHRcdFx0XHRcdFx0XHRjID0gbGF5ZXJvZmZzZXQgKyBrICsgc2xlbjIsXHJcblx0XHRcdFx0XHRcdFx0ZCA9IGxheWVyb2Zmc2V0ICsgaiArIHNsZW4yO1xyXG5cclxuXHRcdFx0XHRcdFx0ZjQoIGEsIGIsIGMsIGQgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGZ1bmN0aW9uIHYoIHgsIHksIHogKSB7XHJcblxyXG5cdFx0XHRcdHBsYWNlaG9sZGVyLnB1c2goIHggKTtcclxuXHRcdFx0XHRwbGFjZWhvbGRlci5wdXNoKCB5ICk7XHJcblx0XHRcdFx0cGxhY2Vob2xkZXIucHVzaCggeiApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHJcblx0XHRcdGZ1bmN0aW9uIGYzKCBhLCBiLCBjICkge1xyXG5cclxuXHRcdFx0XHRhZGRWZXJ0ZXgoIGEgKTtcclxuXHRcdFx0XHRhZGRWZXJ0ZXgoIGIgKTtcclxuXHRcdFx0XHRhZGRWZXJ0ZXgoIGMgKTtcclxuXHJcblx0XHRcdFx0Y29uc3QgbmV4dEluZGV4ID0gdmVydGljZXNBcnJheS5sZW5ndGggLyAzO1xyXG5cdFx0XHRcdGNvbnN0IHV2cyA9IHV2Z2VuLmdlbmVyYXRlVG9wVVYoIHNjb3BlLCB2ZXJ0aWNlc0FycmF5LCBuZXh0SW5kZXggLSAzLCBuZXh0SW5kZXggLSAyLCBuZXh0SW5kZXggLSAxICk7XHJcblxyXG5cdFx0XHRcdGFkZFVWKCB1dnNbIDAgXSApO1xyXG5cdFx0XHRcdGFkZFVWKCB1dnNbIDEgXSApO1xyXG5cdFx0XHRcdGFkZFVWKCB1dnNbIDIgXSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZnVuY3Rpb24gZjQoIGEsIGIsIGMsIGQgKSB7XHJcblxyXG5cdFx0XHRcdGFkZFZlcnRleCggYSApO1xyXG5cdFx0XHRcdGFkZFZlcnRleCggYiApO1xyXG5cdFx0XHRcdGFkZFZlcnRleCggZCApO1xyXG5cclxuXHRcdFx0XHRhZGRWZXJ0ZXgoIGIgKTtcclxuXHRcdFx0XHRhZGRWZXJ0ZXgoIGMgKTtcclxuXHRcdFx0XHRhZGRWZXJ0ZXgoIGQgKTtcclxuXHJcblxyXG5cdFx0XHRcdGNvbnN0IG5leHRJbmRleCA9IHZlcnRpY2VzQXJyYXkubGVuZ3RoIC8gMztcclxuXHRcdFx0XHRjb25zdCB1dnMgPSB1dmdlbi5nZW5lcmF0ZVNpZGVXYWxsVVYoIHNjb3BlLCB2ZXJ0aWNlc0FycmF5LCBuZXh0SW5kZXggLSA2LCBuZXh0SW5kZXggLSAzLCBuZXh0SW5kZXggLSAyLCBuZXh0SW5kZXggLSAxICk7XHJcblxyXG5cdFx0XHRcdGFkZFVWKCB1dnNbIDAgXSApO1xyXG5cdFx0XHRcdGFkZFVWKCB1dnNbIDEgXSApO1xyXG5cdFx0XHRcdGFkZFVWKCB1dnNbIDMgXSApO1xyXG5cclxuXHRcdFx0XHRhZGRVViggdXZzWyAxIF0gKTtcclxuXHRcdFx0XHRhZGRVViggdXZzWyAyIF0gKTtcclxuXHRcdFx0XHRhZGRVViggdXZzWyAzIF0gKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGZ1bmN0aW9uIGFkZFZlcnRleCggaW5kZXggKSB7XHJcblxyXG5cdFx0XHRcdHZlcnRpY2VzQXJyYXkucHVzaCggcGxhY2Vob2xkZXJbIGluZGV4ICogMyArIDAgXSApO1xyXG5cdFx0XHRcdHZlcnRpY2VzQXJyYXkucHVzaCggcGxhY2Vob2xkZXJbIGluZGV4ICogMyArIDEgXSApO1xyXG5cdFx0XHRcdHZlcnRpY2VzQXJyYXkucHVzaCggcGxhY2Vob2xkZXJbIGluZGV4ICogMyArIDIgXSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHJcblx0XHRcdGZ1bmN0aW9uIGFkZFVWKCB2ZWN0b3IyICkge1xyXG5cclxuXHRcdFx0XHR1dkFycmF5LnB1c2goIHZlY3RvcjIueCApO1xyXG5cdFx0XHRcdHV2QXJyYXkucHVzaCggdmVjdG9yMi55ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLnBhcmFtZXRlcnMgPSBPYmplY3QuYXNzaWduKCB7fSwgc291cmNlLnBhcmFtZXRlcnMgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHR0b0pTT04oKSB7XHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IHN1cGVyLnRvSlNPTigpO1xyXG5cclxuXHRcdGNvbnN0IHNoYXBlcyA9IHRoaXMucGFyYW1ldGVycy5zaGFwZXM7XHJcblx0XHRjb25zdCBvcHRpb25zID0gdGhpcy5wYXJhbWV0ZXJzLm9wdGlvbnM7XHJcblxyXG5cdFx0cmV0dXJuIHRvSlNPTiggc2hhcGVzLCBvcHRpb25zLCBkYXRhICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRmFjdG9yeSBtZXRob2QgZm9yIGNyZWF0aW5nIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZnJvbSB0aGUgZ2l2ZW5cclxuXHQgKiBKU09OIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gQSBKU09OIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNlcmlhbGl6ZWQgZ2VvbWV0cnkuXHJcblx0ICogQHBhcmFtIHtBcnJheTxTaGFwZT59IHNoYXBlcyAtIEFuIGFycmF5IG9mIHNoYXBlcy5cclxuXHQgKiBAcmV0dXJuIHtFeHRydWRlR2VvbWV0cnl9IEEgbmV3IGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBmcm9tSlNPTiggZGF0YSwgc2hhcGVzICkge1xyXG5cclxuXHRcdGNvbnN0IGdlb21ldHJ5U2hhcGVzID0gW107XHJcblxyXG5cdFx0Zm9yICggbGV0IGogPSAwLCBqbCA9IGRhdGEuc2hhcGVzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgc2hhcGUgPSBzaGFwZXNbIGRhdGEuc2hhcGVzWyBqIF0gXTtcclxuXHJcblx0XHRcdGdlb21ldHJ5U2hhcGVzLnB1c2goIHNoYXBlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGV4dHJ1ZGVQYXRoID0gZGF0YS5vcHRpb25zLmV4dHJ1ZGVQYXRoO1xyXG5cclxuXHRcdGlmICggZXh0cnVkZVBhdGggIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGRhdGEub3B0aW9ucy5leHRydWRlUGF0aCA9IG5ldyBDdXJ2ZXNbIGV4dHJ1ZGVQYXRoLnR5cGUgXSgpLmZyb21KU09OKCBleHRydWRlUGF0aCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbmV3IEV4dHJ1ZGVHZW9tZXRyeSggZ2VvbWV0cnlTaGFwZXMsIGRhdGEub3B0aW9ucyApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5jb25zdCBXb3JsZFVWR2VuZXJhdG9yID0ge1xyXG5cclxuXHRnZW5lcmF0ZVRvcFVWOiBmdW5jdGlvbiAoIGdlb21ldHJ5LCB2ZXJ0aWNlcywgaW5kZXhBLCBpbmRleEIsIGluZGV4QyApIHtcclxuXHJcblx0XHRjb25zdCBhX3ggPSB2ZXJ0aWNlc1sgaW5kZXhBICogMyBdO1xyXG5cdFx0Y29uc3QgYV95ID0gdmVydGljZXNbIGluZGV4QSAqIDMgKyAxIF07XHJcblx0XHRjb25zdCBiX3ggPSB2ZXJ0aWNlc1sgaW5kZXhCICogMyBdO1xyXG5cdFx0Y29uc3QgYl95ID0gdmVydGljZXNbIGluZGV4QiAqIDMgKyAxIF07XHJcblx0XHRjb25zdCBjX3ggPSB2ZXJ0aWNlc1sgaW5kZXhDICogMyBdO1xyXG5cdFx0Y29uc3QgY195ID0gdmVydGljZXNbIGluZGV4QyAqIDMgKyAxIF07XHJcblxyXG5cdFx0cmV0dXJuIFtcclxuXHRcdFx0bmV3IFZlY3RvcjIoIGFfeCwgYV95ICksXHJcblx0XHRcdG5ldyBWZWN0b3IyKCBiX3gsIGJfeSApLFxyXG5cdFx0XHRuZXcgVmVjdG9yMiggY194LCBjX3kgKVxyXG5cdFx0XTtcclxuXHJcblx0fSxcclxuXHJcblx0Z2VuZXJhdGVTaWRlV2FsbFVWOiBmdW5jdGlvbiAoIGdlb21ldHJ5LCB2ZXJ0aWNlcywgaW5kZXhBLCBpbmRleEIsIGluZGV4QywgaW5kZXhEICkge1xyXG5cclxuXHRcdGNvbnN0IGFfeCA9IHZlcnRpY2VzWyBpbmRleEEgKiAzIF07XHJcblx0XHRjb25zdCBhX3kgPSB2ZXJ0aWNlc1sgaW5kZXhBICogMyArIDEgXTtcclxuXHRcdGNvbnN0IGFfeiA9IHZlcnRpY2VzWyBpbmRleEEgKiAzICsgMiBdO1xyXG5cdFx0Y29uc3QgYl94ID0gdmVydGljZXNbIGluZGV4QiAqIDMgXTtcclxuXHRcdGNvbnN0IGJfeSA9IHZlcnRpY2VzWyBpbmRleEIgKiAzICsgMSBdO1xyXG5cdFx0Y29uc3QgYl96ID0gdmVydGljZXNbIGluZGV4QiAqIDMgKyAyIF07XHJcblx0XHRjb25zdCBjX3ggPSB2ZXJ0aWNlc1sgaW5kZXhDICogMyBdO1xyXG5cdFx0Y29uc3QgY195ID0gdmVydGljZXNbIGluZGV4QyAqIDMgKyAxIF07XHJcblx0XHRjb25zdCBjX3ogPSB2ZXJ0aWNlc1sgaW5kZXhDICogMyArIDIgXTtcclxuXHRcdGNvbnN0IGRfeCA9IHZlcnRpY2VzWyBpbmRleEQgKiAzIF07XHJcblx0XHRjb25zdCBkX3kgPSB2ZXJ0aWNlc1sgaW5kZXhEICogMyArIDEgXTtcclxuXHRcdGNvbnN0IGRfeiA9IHZlcnRpY2VzWyBpbmRleEQgKiAzICsgMiBdO1xyXG5cclxuXHRcdGlmICggTWF0aC5hYnMoIGFfeSAtIGJfeSApIDwgTWF0aC5hYnMoIGFfeCAtIGJfeCApICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIFtcclxuXHRcdFx0XHRuZXcgVmVjdG9yMiggYV94LCAxIC0gYV96ICksXHJcblx0XHRcdFx0bmV3IFZlY3RvcjIoIGJfeCwgMSAtIGJfeiApLFxyXG5cdFx0XHRcdG5ldyBWZWN0b3IyKCBjX3gsIDEgLSBjX3ogKSxcclxuXHRcdFx0XHRuZXcgVmVjdG9yMiggZF94LCAxIC0gZF96IClcclxuXHRcdFx0XTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0cmV0dXJuIFtcclxuXHRcdFx0XHRuZXcgVmVjdG9yMiggYV95LCAxIC0gYV96ICksXHJcblx0XHRcdFx0bmV3IFZlY3RvcjIoIGJfeSwgMSAtIGJfeiApLFxyXG5cdFx0XHRcdG5ldyBWZWN0b3IyKCBjX3ksIDEgLSBjX3ogKSxcclxuXHRcdFx0XHRuZXcgVmVjdG9yMiggZF95LCAxIC0gZF96IClcclxuXHRcdFx0XTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn07XHJcblxyXG5mdW5jdGlvbiB0b0pTT04oIHNoYXBlcywgb3B0aW9ucywgZGF0YSApIHtcclxuXHJcblx0ZGF0YS5zaGFwZXMgPSBbXTtcclxuXHJcblx0aWYgKCBBcnJheS5pc0FycmF5KCBzaGFwZXMgKSApIHtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBzaGFwZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHNoYXBlID0gc2hhcGVzWyBpIF07XHJcblxyXG5cdFx0XHRkYXRhLnNoYXBlcy5wdXNoKCBzaGFwZS51dWlkICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9IGVsc2Uge1xyXG5cclxuXHRcdGRhdGEuc2hhcGVzLnB1c2goIHNoYXBlcy51dWlkICk7XHJcblxyXG5cdH1cclxuXHJcblx0ZGF0YS5vcHRpb25zID0gT2JqZWN0LmFzc2lnbigge30sIG9wdGlvbnMgKTtcclxuXHJcblx0aWYgKCBvcHRpb25zLmV4dHJ1ZGVQYXRoICE9PSB1bmRlZmluZWQgKSBkYXRhLm9wdGlvbnMuZXh0cnVkZVBhdGggPSBvcHRpb25zLmV4dHJ1ZGVQYXRoLnRvSlNPTigpO1xyXG5cclxuXHRyZXR1cm4gZGF0YTtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIHRoZSBgb3B0aW9uc2AgdHlwZSBvZiB0aGUgZ2VvbWV0cnkncyBjb25zdHJ1Y3Rvci5cclxuICpcclxuICogQHR5cGVkZWYge09iamVjdH0gRXh0cnVkZUdlb21ldHJ5fk9wdGlvbnNcclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtjdXJ2ZVNlZ21lbnRzPTEyXSAtIE51bWJlciBvZiBwb2ludHMgb24gdGhlIGN1cnZlcy5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtzdGVwcz0xXSAtIE51bWJlciBvZiBwb2ludHMgdXNlZCBmb3Igc3ViZGl2aWRpbmcgc2VnbWVudHMgYWxvbmcgdGhlIGRlcHRoIG9mIHRoZSBleHRydWRlZCBzcGxpbmUuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZGVwdGg9MV0gLSBEZXB0aCB0byBleHRydWRlIHRoZSBzaGFwZS5cclxuICogQHByb3BlcnR5IHtib29sZWFufSBbYmV2ZWxFbmFibGVkPXRydWVdIC0gV2hldGhlciB0byBiZXZlbGluZyB0byB0aGUgc2hhcGUgb3Igbm90LlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2JldmVsVGhpY2tuZXNzPTAuMl0gLSBIb3cgZGVlcCBpbnRvIHRoZSBvcmlnaW5hbCBzaGFwZSB0aGUgYmV2ZWwgZ29lcy5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtiZXZlbFNpemU9YmV2ZWxUaGlja25lc3MtMC4xXSAtIERpc3RhbmNlIGZyb20gdGhlIHNoYXBlIG91dGxpbmUgdGhhdCB0aGUgYmV2ZWwgZXh0ZW5kcy5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtiZXZlbE9mZnNldD0wXSAtIERpc3RhbmNlIGZyb20gdGhlIHNoYXBlIG91dGxpbmUgdGhhdCB0aGUgYmV2ZWwgc3RhcnRzLlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2JldmVsU2VnbWVudHM9M10gLSBOdW1iZXIgb2YgYmV2ZWwgbGF5ZXJzLlxyXG4gKiBAcHJvcGVydHkgez9DdXJ2ZX0gW2V4dHJ1ZGVQYXRoPW51bGxdIC0gQSAzRCBzcGxpbmUgcGF0aCBhbG9uZyB3aGljaCB0aGUgc2hhcGUgc2hvdWxkIGJlIGV4dHJ1ZGVkLiBCZXZlbHMgbm90IHN1cHBvcnRlZCBmb3IgcGF0aCBleHRydXNpb24uXHJcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBbVVZHZW5lcmF0b3JdIC0gQW4gb2JqZWN0IHRoYXQgcHJvdmlkZXMgVVYgZ2VuZXJhdG9yIGZ1bmN0aW9ucyBmb3IgY3VzdG9tIFVWIGdlbmVyYXRpb24uXHJcbiAqKi9cclxuXHJcbmV4cG9ydCB7IEV4dHJ1ZGVHZW9tZXRyeSB9O1xyXG4iLCJpbXBvcnQgeyBQb2x5aGVkcm9uR2VvbWV0cnkgfSBmcm9tICcuL1BvbHloZWRyb25HZW9tZXRyeS5qcyc7XHJcblxyXG4vKipcclxuICogQSBnZW9tZXRyeSBjbGFzcyBmb3IgcmVwcmVzZW50aW5nIGFuIGljb3NhaGVkcm9uLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBnZW9tZXRyeSA9IG5ldyBUSFJFRS5JY29zYWhlZHJvbkdlb21ldHJ5KCk7XHJcbiAqIGNvbnN0IG1hdGVyaWFsID0gbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiAweGZmZmYwMCB9ICk7XHJcbiAqIGNvbnN0IGljb3NhaGVkcm9uID0gbmV3IFRIUkVFLk1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG4gKiBzY2VuZS5hZGQoIGljb3NhaGVkcm9uICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgUG9seWhlZHJvbkdlb21ldHJ5XHJcbiAqL1xyXG5jbGFzcyBJY29zYWhlZHJvbkdlb21ldHJ5IGV4dGVuZHMgUG9seWhlZHJvbkdlb21ldHJ5IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBpY29zYWhlZHJvbiBnZW9tZXRyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbcmFkaXVzPTFdIC0gUmFkaXVzIG9mIHRoZSBpY29zYWhlZHJvbi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2RldGFpbD0wXSAtIFNldHRpbmcgdGhpcyB0byBhIHZhbHVlIGdyZWF0ZXIgdGhhbiBgMGAgYWRkcyB2ZXJ0aWNlcyBtYWtpbmcgaXQgbm8gbG9uZ2VyIGEgaWNvc2FoZWRyb24uXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHJhZGl1cyA9IDEsIGRldGFpbCA9IDAgKSB7XHJcblxyXG5cdFx0Y29uc3QgdCA9ICggMSArIE1hdGguc3FydCggNSApICkgLyAyO1xyXG5cclxuXHRcdGNvbnN0IHZlcnRpY2VzID0gW1xyXG5cdFx0XHQtIDEsIHQsIDAsIFx0MSwgdCwgMCwgXHQtIDEsIC0gdCwgMCwgXHQxLCAtIHQsIDAsXHJcblx0XHRcdDAsIC0gMSwgdCwgXHQwLCAxLCB0LFx0MCwgLSAxLCAtIHQsIFx0MCwgMSwgLSB0LFxyXG5cdFx0XHR0LCAwLCAtIDEsIFx0dCwgMCwgMSwgXHQtIHQsIDAsIC0gMSwgXHQtIHQsIDAsIDFcclxuXHRcdF07XHJcblxyXG5cdFx0Y29uc3QgaW5kaWNlcyA9IFtcclxuXHRcdFx0MCwgMTEsIDUsIFx0MCwgNSwgMSwgXHQwLCAxLCA3LCBcdDAsIDcsIDEwLCBcdDAsIDEwLCAxMSxcclxuXHRcdFx0MSwgNSwgOSwgXHQ1LCAxMSwgNCxcdDExLCAxMCwgMixcdDEwLCA3LCA2LFx0NywgMSwgOCxcclxuXHRcdFx0MywgOSwgNCwgXHQzLCA0LCAyLFx0MywgMiwgNixcdDMsIDYsIDgsXHQzLCA4LCA5LFxyXG5cdFx0XHQ0LCA5LCA1LCBcdDIsIDQsIDExLFx0NiwgMiwgMTAsXHQ4LCA2LCA3LFx0OSwgOCwgMVxyXG5cdFx0XTtcclxuXHJcblx0XHRzdXBlciggdmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWlsICk7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ0ljb3NhaGVkcm9uR2VvbWV0cnknO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG9sZHMgdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMgdGhhdCBoYXZlIGJlZW5cclxuXHRcdCAqIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGdlb21ldHJ5LiBBbnkgbW9kaWZpY2F0aW9uXHJcblx0XHQgKiBhZnRlciBpbnN0YW50aWF0aW9uIGRvZXMgbm90IGNoYW5nZSB0aGUgZ2VvbWV0cnkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0ge1xyXG5cdFx0XHRyYWRpdXM6IHJhZGl1cyxcclxuXHRcdFx0ZGV0YWlsOiBkZXRhaWxcclxuXHRcdH07XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRmFjdG9yeSBtZXRob2QgZm9yIGNyZWF0aW5nIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZnJvbSB0aGUgZ2l2ZW5cclxuXHQgKiBKU09OIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gQSBKU09OIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNlcmlhbGl6ZWQgZ2VvbWV0cnkuXHJcblx0ICogQHJldHVybiB7SWNvc2FoZWRyb25HZW9tZXRyeX0gQSBuZXcgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c3RhdGljIGZyb21KU09OKCBkYXRhICkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgSWNvc2FoZWRyb25HZW9tZXRyeSggZGF0YS5yYWRpdXMsIGRhdGEuZGV0YWlsICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBJY29zYWhlZHJvbkdlb21ldHJ5IH07XHJcbiIsImltcG9ydCB7IFBvbHloZWRyb25HZW9tZXRyeSB9IGZyb20gJy4vUG9seWhlZHJvbkdlb21ldHJ5LmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIGdlb21ldHJ5IGNsYXNzIGZvciByZXByZXNlbnRpbmcgYW4gb2N0YWhlZHJvbi5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgZ2VvbWV0cnkgPSBuZXcgVEhSRUUuT2N0YWhlZHJvbkdlb21ldHJ5KCk7XHJcbiAqIGNvbnN0IG1hdGVyaWFsID0gbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiAweGZmZmYwMCB9ICk7XHJcbiAqIGNvbnN0IG9jdGFoZWRyb24gPSBuZXcgVEhSRUUuTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcbiAqIHNjZW5lLmFkZCggb2N0YWhlZHJvbiApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIFBvbHloZWRyb25HZW9tZXRyeVxyXG4gKi9cclxuY2xhc3MgT2N0YWhlZHJvbkdlb21ldHJ5IGV4dGVuZHMgUG9seWhlZHJvbkdlb21ldHJ5IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBvY3RhaGVkcm9uIGdlb21ldHJ5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpdXM9MV0gLSBSYWRpdXMgb2YgdGhlIG9jdGFoZWRyb24uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtkZXRhaWw9MF0gLSBTZXR0aW5nIHRoaXMgdG8gYSB2YWx1ZSBncmVhdGVyIHRoYW4gYDBgIGFkZHMgdmVydGljZXMgbWFraW5nIGl0IG5vIGxvbmdlciBhIG9jdGFoZWRyb24uXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHJhZGl1cyA9IDEsIGRldGFpbCA9IDAgKSB7XHJcblxyXG5cdFx0Y29uc3QgdmVydGljZXMgPSBbXHJcblx0XHRcdDEsIDAsIDAsIFx0LSAxLCAwLCAwLFx0MCwgMSwgMCxcclxuXHRcdFx0MCwgLSAxLCAwLCBcdDAsIDAsIDEsXHQwLCAwLCAtIDFcclxuXHRcdF07XHJcblxyXG5cdFx0Y29uc3QgaW5kaWNlcyA9IFtcclxuXHRcdFx0MCwgMiwgNCxcdDAsIDQsIDMsXHQwLCAzLCA1LFxyXG5cdFx0XHQwLCA1LCAyLFx0MSwgMiwgNSxcdDEsIDUsIDMsXHJcblx0XHRcdDEsIDMsIDQsXHQxLCA0LCAyXHJcblx0XHRdO1xyXG5cclxuXHRcdHN1cGVyKCB2ZXJ0aWNlcywgaW5kaWNlcywgcmFkaXVzLCBkZXRhaWwgKTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnT2N0YWhlZHJvbkdlb21ldHJ5JztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvbGRzIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzIHRoYXQgaGF2ZSBiZWVuXHJcblx0XHQgKiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBnZW9tZXRyeS4gQW55IG1vZGlmaWNhdGlvblxyXG5cdFx0ICogYWZ0ZXIgaW5zdGFudGlhdGlvbiBkb2VzIG5vdCBjaGFuZ2UgdGhlIGdlb21ldHJ5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucGFyYW1ldGVycyA9IHtcclxuXHRcdFx0cmFkaXVzOiByYWRpdXMsXHJcblx0XHRcdGRldGFpbDogZGV0YWlsXHJcblx0XHR9O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGZyb20gdGhlIGdpdmVuXHJcblx0ICogSlNPTiBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIEEgSlNPTiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzZXJpYWxpemVkIGdlb21ldHJ5LlxyXG5cdCAqIEByZXR1cm4ge09jdGFoZWRyb25HZW9tZXRyeX0gQSBuZXcgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c3RhdGljIGZyb21KU09OKCBkYXRhICkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgT2N0YWhlZHJvbkdlb21ldHJ5KCBkYXRhLnJhZGl1cywgZGF0YS5kZXRhaWwgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgT2N0YWhlZHJvbkdlb21ldHJ5IH07XHJcbiIsImltcG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9CdWZmZXJHZW9tZXRyeS5qcyc7XHJcbmltcG9ydCB7IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcblxyXG4vKipcclxuICogQSBnZW9tZXRyeSBjbGFzcyBmb3IgcmVwcmVzZW50aW5nIGEgcGxhbmUuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGdlb21ldHJ5ID0gbmV3IFRIUkVFLlBsYW5lR2VvbWV0cnkoIDEsIDEgKTtcclxuICogY29uc3QgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IDB4ZmZmZjAwLCBzaWRlOiBUSFJFRS5Eb3VibGVTaWRlIH0gKTtcclxuICogY29uc3QgcGxhbmUgPSBuZXcgVEhSRUUuTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcbiAqIHNjZW5lLmFkZCggcGxhbmUgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBCdWZmZXJHZW9tZXRyeVxyXG4gKi9cclxuY2xhc3MgUGxhbmVHZW9tZXRyeSBleHRlbmRzIEJ1ZmZlckdlb21ldHJ5IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBwbGFuZSBnZW9tZXRyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbd2lkdGg9MV0gLSBUaGUgd2lkdGggYWxvbmcgdGhlIFggYXhpcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2hlaWdodD0xXSAtIFRoZSBoZWlnaHQgYWxvbmcgdGhlIFkgYXhpc1xyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbd2lkdGhTZWdtZW50cz0xXSAtIFRoZSBudW1iZXIgb2Ygc2VnbWVudHMgYWxvbmcgdGhlIFggYXhpcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2hlaWdodFNlZ21lbnRzPTFdIC0gVGhlIG51bWJlciBvZiBzZWdtZW50cyBhbG9uZyB0aGUgWSBheGlzLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCB3aWR0aCA9IDEsIGhlaWdodCA9IDEsIHdpZHRoU2VnbWVudHMgPSAxLCBoZWlnaHRTZWdtZW50cyA9IDEgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnUGxhbmVHZW9tZXRyeSc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb2xkcyB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVycyB0aGF0IGhhdmUgYmVlblxyXG5cdFx0ICogdXNlZCB0byBnZW5lcmF0ZSB0aGUgZ2VvbWV0cnkuIEFueSBtb2RpZmljYXRpb25cclxuXHRcdCAqIGFmdGVyIGluc3RhbnRpYXRpb24gZG9lcyBub3QgY2hhbmdlIHRoZSBnZW9tZXRyeS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBhcmFtZXRlcnMgPSB7XHJcblx0XHRcdHdpZHRoOiB3aWR0aCxcclxuXHRcdFx0aGVpZ2h0OiBoZWlnaHQsXHJcblx0XHRcdHdpZHRoU2VnbWVudHM6IHdpZHRoU2VnbWVudHMsXHJcblx0XHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50c1xyXG5cdFx0fTtcclxuXHJcblx0XHRjb25zdCB3aWR0aF9oYWxmID0gd2lkdGggLyAyO1xyXG5cdFx0Y29uc3QgaGVpZ2h0X2hhbGYgPSBoZWlnaHQgLyAyO1xyXG5cclxuXHRcdGNvbnN0IGdyaWRYID0gTWF0aC5mbG9vciggd2lkdGhTZWdtZW50cyApO1xyXG5cdFx0Y29uc3QgZ3JpZFkgPSBNYXRoLmZsb29yKCBoZWlnaHRTZWdtZW50cyApO1xyXG5cclxuXHRcdGNvbnN0IGdyaWRYMSA9IGdyaWRYICsgMTtcclxuXHRcdGNvbnN0IGdyaWRZMSA9IGdyaWRZICsgMTtcclxuXHJcblx0XHRjb25zdCBzZWdtZW50X3dpZHRoID0gd2lkdGggLyBncmlkWDtcclxuXHRcdGNvbnN0IHNlZ21lbnRfaGVpZ2h0ID0gaGVpZ2h0IC8gZ3JpZFk7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCBpbmRpY2VzID0gW107XHJcblx0XHRjb25zdCB2ZXJ0aWNlcyA9IFtdO1xyXG5cdFx0Y29uc3Qgbm9ybWFscyA9IFtdO1xyXG5cdFx0Y29uc3QgdXZzID0gW107XHJcblxyXG5cdFx0Zm9yICggbGV0IGl5ID0gMDsgaXkgPCBncmlkWTE7IGl5ICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgeSA9IGl5ICogc2VnbWVudF9oZWlnaHQgLSBoZWlnaHRfaGFsZjtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpeCA9IDA7IGl4IDwgZ3JpZFgxOyBpeCArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgeCA9IGl4ICogc2VnbWVudF93aWR0aCAtIHdpZHRoX2hhbGY7XHJcblxyXG5cdFx0XHRcdHZlcnRpY2VzLnB1c2goIHgsIC0geSwgMCApO1xyXG5cclxuXHRcdFx0XHRub3JtYWxzLnB1c2goIDAsIDAsIDEgKTtcclxuXHJcblx0XHRcdFx0dXZzLnB1c2goIGl4IC8gZ3JpZFggKTtcclxuXHRcdFx0XHR1dnMucHVzaCggMSAtICggaXkgLyBncmlkWSApICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZvciAoIGxldCBpeSA9IDA7IGl5IDwgZ3JpZFk7IGl5ICsrICkge1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGl4ID0gMDsgaXggPCBncmlkWDsgaXggKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGEgPSBpeCArIGdyaWRYMSAqIGl5O1xyXG5cdFx0XHRcdGNvbnN0IGIgPSBpeCArIGdyaWRYMSAqICggaXkgKyAxICk7XHJcblx0XHRcdFx0Y29uc3QgYyA9ICggaXggKyAxICkgKyBncmlkWDEgKiAoIGl5ICsgMSApO1xyXG5cdFx0XHRcdGNvbnN0IGQgPSAoIGl4ICsgMSApICsgZ3JpZFgxICogaXk7XHJcblxyXG5cdFx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgZCApO1xyXG5cdFx0XHRcdGluZGljZXMucHVzaCggYiwgYywgZCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XHJcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcclxuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xyXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLnBhcmFtZXRlcnMgPSBPYmplY3QuYXNzaWduKCB7fSwgc291cmNlLnBhcmFtZXRlcnMgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGYWN0b3J5IG1ldGhvZCBmb3IgY3JlYXRpbmcgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBmcm9tIHRoZSBnaXZlblxyXG5cdCAqIEpTT04gb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBBIEpTT04gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc2VyaWFsaXplZCBnZW9tZXRyeS5cclxuXHQgKiBAcmV0dXJuIHtQbGFuZUdlb21ldHJ5fSBBIG5ldyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzdGF0aWMgZnJvbUpTT04oIGRhdGEgKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBQbGFuZUdlb21ldHJ5KCBkYXRhLndpZHRoLCBkYXRhLmhlaWdodCwgZGF0YS53aWR0aFNlZ21lbnRzLCBkYXRhLmhlaWdodFNlZ21lbnRzICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFBsYW5lR2VvbWV0cnkgfTtcclxuIiwiaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcclxuaW1wb3J0IHsgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyQXR0cmlidXRlLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uL21hdGgvVmVjdG9yMi5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgY2xhc3MgZm9yIGdlbmVyYXRpbmcgYSB0d28tZGltZW5zaW9uYWwgcmluZyBnZW9tZXRyeS5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgZ2VvbWV0cnkgPSBuZXcgVEhSRUUuUmluZ0dlb21ldHJ5KCAxLCA1LCAzMiApO1xyXG4gKiBjb25zdCBtYXRlcmlhbCA9IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogMHhmZmZmMDAsIHNpZGU6IFRIUkVFLkRvdWJsZVNpZGUgfSApO1xyXG4gKiBjb25zdCBtZXNoID0gbmV3IFRIUkVFLk1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG4gKiBzY2VuZS5hZGQoIG1lc2ggKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBCdWZmZXJHZW9tZXRyeVxyXG4gKi9cclxuY2xhc3MgUmluZ0dlb21ldHJ5IGV4dGVuZHMgQnVmZmVyR2VvbWV0cnkge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHJpbmcgZ2VvbWV0cnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2lubmVyUmFkaXVzPTAuNV0gLSBUaGUgaW5uZXIgcmFkaXVzIG9mIHRoZSByaW5nLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbb3V0ZXJSYWRpdXM9MV0gLSBUaGUgb3V0ZXIgcmFkaXVzIG9mIHRoZSByaW5nLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbdGhldGFTZWdtZW50cz0zMl0gLSBOdW1iZXIgb2Ygc2VnbWVudHMuIEEgaGlnaGVyIG51bWJlciBtZWFucyB0aGUgcmluZyB3aWxsIGJlIG1vcmUgcm91bmQuIE1pbmltdW0gaXMgYDNgLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbcGhpU2VnbWVudHM9MV0gLSBOdW1iZXIgb2Ygc2VnbWVudHMgcGVyIHJpbmcgc2VnbWVudC4gTWluaW11bSBpcyBgMWAuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt0aGV0YVN0YXJ0PTBdIC0gU3RhcnRpbmcgYW5nbGUgaW4gcmFkaWFucy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3RoZXRhTGVuZ3RoPU1hdGguUEkqMl0gLSBDZW50cmFsIGFuZ2xlIGluIHJhZGlhbnMuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGlubmVyUmFkaXVzID0gMC41LCBvdXRlclJhZGl1cyA9IDEsIHRoZXRhU2VnbWVudHMgPSAzMiwgcGhpU2VnbWVudHMgPSAxLCB0aGV0YVN0YXJ0ID0gMCwgdGhldGFMZW5ndGggPSBNYXRoLlBJICogMiApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdSaW5nR2VvbWV0cnknO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG9sZHMgdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMgdGhhdCBoYXZlIGJlZW5cclxuXHRcdCAqIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGdlb21ldHJ5LiBBbnkgbW9kaWZpY2F0aW9uXHJcblx0XHQgKiBhZnRlciBpbnN0YW50aWF0aW9uIGRvZXMgbm90IGNoYW5nZSB0aGUgZ2VvbWV0cnkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0ge1xyXG5cdFx0XHRpbm5lclJhZGl1czogaW5uZXJSYWRpdXMsXHJcblx0XHRcdG91dGVyUmFkaXVzOiBvdXRlclJhZGl1cyxcclxuXHRcdFx0dGhldGFTZWdtZW50czogdGhldGFTZWdtZW50cyxcclxuXHRcdFx0cGhpU2VnbWVudHM6IHBoaVNlZ21lbnRzLFxyXG5cdFx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxyXG5cdFx0XHR0aGV0YUxlbmd0aDogdGhldGFMZW5ndGhcclxuXHRcdH07XHJcblxyXG5cdFx0dGhldGFTZWdtZW50cyA9IE1hdGgubWF4KCAzLCB0aGV0YVNlZ21lbnRzICk7XHJcblx0XHRwaGlTZWdtZW50cyA9IE1hdGgubWF4KCAxLCBwaGlTZWdtZW50cyApO1xyXG5cclxuXHRcdC8vIGJ1ZmZlcnNcclxuXHJcblx0XHRjb25zdCBpbmRpY2VzID0gW107XHJcblx0XHRjb25zdCB2ZXJ0aWNlcyA9IFtdO1xyXG5cdFx0Y29uc3Qgbm9ybWFscyA9IFtdO1xyXG5cdFx0Y29uc3QgdXZzID0gW107XHJcblxyXG5cdFx0Ly8gc29tZSBoZWxwZXIgdmFyaWFibGVzXHJcblxyXG5cdFx0bGV0IHJhZGl1cyA9IGlubmVyUmFkaXVzO1xyXG5cdFx0Y29uc3QgcmFkaXVzU3RlcCA9ICggKCBvdXRlclJhZGl1cyAtIGlubmVyUmFkaXVzICkgLyBwaGlTZWdtZW50cyApO1xyXG5cdFx0Y29uc3QgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcclxuXHRcdGNvbnN0IHV2ID0gbmV3IFZlY3RvcjIoKTtcclxuXHJcblx0XHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzXHJcblxyXG5cdFx0Zm9yICggbGV0IGogPSAwOyBqIDw9IHBoaVNlZ21lbnRzOyBqICsrICkge1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDw9IHRoZXRhU2VnbWVudHM7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdC8vIHZhbHVlcyBhcmUgZ2VuZXJhdGUgZnJvbSB0aGUgaW5zaWRlIG9mIHRoZSByaW5nIHRvIHRoZSBvdXRzaWRlXHJcblxyXG5cdFx0XHRcdGNvbnN0IHNlZ21lbnQgPSB0aGV0YVN0YXJ0ICsgaSAvIHRoZXRhU2VnbWVudHMgKiB0aGV0YUxlbmd0aDtcclxuXHJcblx0XHRcdFx0Ly8gdmVydGV4XHJcblxyXG5cdFx0XHRcdHZlcnRleC54ID0gcmFkaXVzICogTWF0aC5jb3MoIHNlZ21lbnQgKTtcclxuXHRcdFx0XHR2ZXJ0ZXgueSA9IHJhZGl1cyAqIE1hdGguc2luKCBzZWdtZW50ICk7XHJcblxyXG5cdFx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcclxuXHJcblx0XHRcdFx0Ly8gbm9ybWFsXHJcblxyXG5cdFx0XHRcdG5vcm1hbHMucHVzaCggMCwgMCwgMSApO1xyXG5cclxuXHRcdFx0XHQvLyB1dlxyXG5cclxuXHRcdFx0XHR1di54ID0gKCB2ZXJ0ZXgueCAvIG91dGVyUmFkaXVzICsgMSApIC8gMjtcclxuXHRcdFx0XHR1di55ID0gKCB2ZXJ0ZXgueSAvIG91dGVyUmFkaXVzICsgMSApIC8gMjtcclxuXHJcblx0XHRcdFx0dXZzLnB1c2goIHV2LngsIHV2LnkgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIGluY3JlYXNlIHRoZSByYWRpdXMgZm9yIG5leHQgcm93IG9mIHZlcnRpY2VzXHJcblxyXG5cdFx0XHRyYWRpdXMgKz0gcmFkaXVzU3RlcDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gaW5kaWNlc1xyXG5cclxuXHRcdGZvciAoIGxldCBqID0gMDsgaiA8IHBoaVNlZ21lbnRzOyBqICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdGhldGFTZWdtZW50TGV2ZWwgPSBqICogKCB0aGV0YVNlZ21lbnRzICsgMSApO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdGhldGFTZWdtZW50czsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3Qgc2VnbWVudCA9IGkgKyB0aGV0YVNlZ21lbnRMZXZlbDtcclxuXHJcblx0XHRcdFx0Y29uc3QgYSA9IHNlZ21lbnQ7XHJcblx0XHRcdFx0Y29uc3QgYiA9IHNlZ21lbnQgKyB0aGV0YVNlZ21lbnRzICsgMTtcclxuXHRcdFx0XHRjb25zdCBjID0gc2VnbWVudCArIHRoZXRhU2VnbWVudHMgKyAyO1xyXG5cdFx0XHRcdGNvbnN0IGQgPSBzZWdtZW50ICsgMTtcclxuXHJcblx0XHRcdFx0Ly8gZmFjZXNcclxuXHJcblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XHJcblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGJ1aWxkIGdlb21ldHJ5XHJcblxyXG5cdFx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xyXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XHJcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcclxuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0gT2JqZWN0LmFzc2lnbigge30sIHNvdXJjZS5wYXJhbWV0ZXJzICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRmFjdG9yeSBtZXRob2QgZm9yIGNyZWF0aW5nIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZnJvbSB0aGUgZ2l2ZW5cclxuXHQgKiBKU09OIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gQSBKU09OIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNlcmlhbGl6ZWQgZ2VvbWV0cnkuXHJcblx0ICogQHJldHVybiB7UmluZ0dlb21ldHJ5fSBBIG5ldyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzdGF0aWMgZnJvbUpTT04oIGRhdGEgKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBSaW5nR2VvbWV0cnkoIGRhdGEuaW5uZXJSYWRpdXMsIGRhdGEub3V0ZXJSYWRpdXMsIGRhdGEudGhldGFTZWdtZW50cywgZGF0YS5waGlTZWdtZW50cywgZGF0YS50aGV0YVN0YXJ0LCBkYXRhLnRoZXRhTGVuZ3RoICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBSaW5nR2VvbWV0cnkgfTtcclxuIiwiaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcclxuaW1wb3J0IHsgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyQXR0cmlidXRlLmpzJztcclxuaW1wb3J0IHsgU2hhcGUgfSBmcm9tICcuLi9leHRyYXMvY29yZS9TaGFwZS5qcyc7XHJcbmltcG9ydCB7IFNoYXBlVXRpbHMgfSBmcm9tICcuLi9leHRyYXMvU2hhcGVVdGlscy5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjIuanMnO1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYW4gb25lLXNpZGVkIHBvbHlnb25hbCBnZW9tZXRyeSBmcm9tIG9uZSBvciBtb3JlIHBhdGggc2hhcGVzLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBhcmNTaGFwZSA9IG5ldyBUSFJFRS5TaGFwZSgpXHJcbiAqXHQubW92ZVRvKCA1LCAxIClcclxuICpcdC5hYnNhcmMoIDEsIDEsIDQsIDAsIE1hdGguUEkgKiAyLCBmYWxzZSApO1xyXG4gKlxyXG4gKiBjb25zdCBnZW9tZXRyeSA9IG5ldyBUSFJFRS5TaGFwZUdlb21ldHJ5KCBhcmNTaGFwZSApO1xyXG4gKiBjb25zdCBtYXRlcmlhbCA9IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogMHgwMGZmMDAsIHNpZGU6IFRIUkVFLkRvdWJsZVNpZGUgfSApO1xyXG4gKiBjb25zdCBtZXNoID0gbmV3IFRIUkVFLk1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApIDtcclxuICogc2NlbmUuYWRkKCBtZXNoICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQnVmZmVyR2VvbWV0cnlcclxuICovXHJcbmNsYXNzIFNoYXBlR2VvbWV0cnkgZXh0ZW5kcyBCdWZmZXJHZW9tZXRyeSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc2hhcGUgZ2VvbWV0cnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1NoYXBlfEFycmF5PFNoYXBlPn0gW3NoYXBlc10gLSBBIHNoYXBlIG9yIGFuIGFycmF5IG9mIHNoYXBlcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2N1cnZlU2VnbWVudHM9MTJdIC0gTnVtYmVyIG9mIHNlZ21lbnRzIHBlciBzaGFwZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggc2hhcGVzID0gbmV3IFNoYXBlKCBbIG5ldyBWZWN0b3IyKCAwLCAwLjUgKSwgbmV3IFZlY3RvcjIoIC0gMC41LCAtIDAuNSApLCBuZXcgVmVjdG9yMiggMC41LCAtIDAuNSApIF0gKSwgY3VydmVTZWdtZW50cyA9IDEyICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ1NoYXBlR2VvbWV0cnknO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG9sZHMgdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMgdGhhdCBoYXZlIGJlZW5cclxuXHRcdCAqIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGdlb21ldHJ5LiBBbnkgbW9kaWZpY2F0aW9uXHJcblx0XHQgKiBhZnRlciBpbnN0YW50aWF0aW9uIGRvZXMgbm90IGNoYW5nZSB0aGUgZ2VvbWV0cnkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0ge1xyXG5cdFx0XHRzaGFwZXM6IHNoYXBlcyxcclxuXHRcdFx0Y3VydmVTZWdtZW50czogY3VydmVTZWdtZW50c1xyXG5cdFx0fTtcclxuXHJcblx0XHQvLyBidWZmZXJzXHJcblxyXG5cdFx0Y29uc3QgaW5kaWNlcyA9IFtdO1xyXG5cdFx0Y29uc3QgdmVydGljZXMgPSBbXTtcclxuXHRcdGNvbnN0IG5vcm1hbHMgPSBbXTtcclxuXHRcdGNvbnN0IHV2cyA9IFtdO1xyXG5cclxuXHRcdC8vIGhlbHBlciB2YXJpYWJsZXNcclxuXHJcblx0XHRsZXQgZ3JvdXBTdGFydCA9IDA7XHJcblx0XHRsZXQgZ3JvdXBDb3VudCA9IDA7XHJcblxyXG5cdFx0Ly8gYWxsb3cgc2luZ2xlIGFuZCBhcnJheSB2YWx1ZXMgZm9yIFwic2hhcGVzXCIgcGFyYW1ldGVyXHJcblxyXG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCBzaGFwZXMgKSA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRhZGRTaGFwZSggc2hhcGVzICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHNoYXBlcy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGFkZFNoYXBlKCBzaGFwZXNbIGkgXSApO1xyXG5cclxuXHRcdFx0XHR0aGlzLmFkZEdyb3VwKCBncm91cFN0YXJ0LCBncm91cENvdW50LCBpICk7IC8vIGVuYWJsZXMgTXVsdGlNYXRlcmlhbCBzdXBwb3J0XHJcblxyXG5cdFx0XHRcdGdyb3VwU3RhcnQgKz0gZ3JvdXBDb3VudDtcclxuXHRcdFx0XHRncm91cENvdW50ID0gMDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gYnVpbGQgZ2VvbWV0cnlcclxuXHJcblx0XHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XHJcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcclxuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xyXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xyXG5cclxuXHJcblx0XHQvLyBoZWxwZXIgZnVuY3Rpb25zXHJcblxyXG5cdFx0ZnVuY3Rpb24gYWRkU2hhcGUoIHNoYXBlICkge1xyXG5cclxuXHRcdFx0Y29uc3QgaW5kZXhPZmZzZXQgPSB2ZXJ0aWNlcy5sZW5ndGggLyAzO1xyXG5cdFx0XHRjb25zdCBwb2ludHMgPSBzaGFwZS5leHRyYWN0UG9pbnRzKCBjdXJ2ZVNlZ21lbnRzICk7XHJcblxyXG5cdFx0XHRsZXQgc2hhcGVWZXJ0aWNlcyA9IHBvaW50cy5zaGFwZTtcclxuXHRcdFx0Y29uc3Qgc2hhcGVIb2xlcyA9IHBvaW50cy5ob2xlcztcclxuXHJcblx0XHRcdC8vIGNoZWNrIGRpcmVjdGlvbiBvZiB2ZXJ0aWNlc1xyXG5cclxuXHRcdFx0aWYgKCBTaGFwZVV0aWxzLmlzQ2xvY2tXaXNlKCBzaGFwZVZlcnRpY2VzICkgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0XHRzaGFwZVZlcnRpY2VzID0gc2hhcGVWZXJ0aWNlcy5yZXZlcnNlKCk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBzaGFwZUhvbGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHNoYXBlSG9sZSA9IHNoYXBlSG9sZXNbIGkgXTtcclxuXHJcblx0XHRcdFx0aWYgKCBTaGFwZVV0aWxzLmlzQ2xvY2tXaXNlKCBzaGFwZUhvbGUgKSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0XHRzaGFwZUhvbGVzWyBpIF0gPSBzaGFwZUhvbGUucmV2ZXJzZSgpO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBmYWNlcyA9IFNoYXBlVXRpbHMudHJpYW5ndWxhdGVTaGFwZSggc2hhcGVWZXJ0aWNlcywgc2hhcGVIb2xlcyApO1xyXG5cclxuXHRcdFx0Ly8gam9pbiB2ZXJ0aWNlcyBvZiBpbm5lciBhbmQgb3V0ZXIgcGF0aHMgdG8gYSBzaW5nbGUgYXJyYXlcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHNoYXBlSG9sZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3Qgc2hhcGVIb2xlID0gc2hhcGVIb2xlc1sgaSBdO1xyXG5cdFx0XHRcdHNoYXBlVmVydGljZXMgPSBzaGFwZVZlcnRpY2VzLmNvbmNhdCggc2hhcGVIb2xlICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyB2ZXJ0aWNlcywgbm9ybWFscywgdXZzXHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBzaGFwZVZlcnRpY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHZlcnRleCA9IHNoYXBlVmVydGljZXNbIGkgXTtcclxuXHJcblx0XHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCAwICk7XHJcblx0XHRcdFx0bm9ybWFscy5wdXNoKCAwLCAwLCAxICk7XHJcblx0XHRcdFx0dXZzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSApOyAvLyB3b3JsZCB1dnNcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIGluZGljZXNcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGZhY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGZhY2UgPSBmYWNlc1sgaSBdO1xyXG5cclxuXHRcdFx0XHRjb25zdCBhID0gZmFjZVsgMCBdICsgaW5kZXhPZmZzZXQ7XHJcblx0XHRcdFx0Y29uc3QgYiA9IGZhY2VbIDEgXSArIGluZGV4T2Zmc2V0O1xyXG5cdFx0XHRcdGNvbnN0IGMgPSBmYWNlWyAyIF0gKyBpbmRleE9mZnNldDtcclxuXHJcblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBjICk7XHJcblx0XHRcdFx0Z3JvdXBDb3VudCArPSAzO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0gT2JqZWN0LmFzc2lnbigge30sIHNvdXJjZS5wYXJhbWV0ZXJzICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0dG9KU09OKCkge1xyXG5cclxuXHRcdGNvbnN0IGRhdGEgPSBzdXBlci50b0pTT04oKTtcclxuXHJcblx0XHRjb25zdCBzaGFwZXMgPSB0aGlzLnBhcmFtZXRlcnMuc2hhcGVzO1xyXG5cclxuXHRcdHJldHVybiB0b0pTT04oIHNoYXBlcywgZGF0YSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGZyb20gdGhlIGdpdmVuXHJcblx0ICogSlNPTiBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIEEgSlNPTiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzZXJpYWxpemVkIGdlb21ldHJ5LlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8U2hhcGU+fSBzaGFwZXMgLSBBbiBhcnJheSBvZiBzaGFwZXMuXHJcblx0ICogQHJldHVybiB7U2hhcGVHZW9tZXRyeX0gQSBuZXcgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c3RhdGljIGZyb21KU09OKCBkYXRhLCBzaGFwZXMgKSB7XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnlTaGFwZXMgPSBbXTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaiA9IDAsIGpsID0gZGF0YS5zaGFwZXMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBzaGFwZSA9IHNoYXBlc1sgZGF0YS5zaGFwZXNbIGogXSBdO1xyXG5cclxuXHRcdFx0Z2VvbWV0cnlTaGFwZXMucHVzaCggc2hhcGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBTaGFwZUdlb21ldHJ5KCBnZW9tZXRyeVNoYXBlcywgZGF0YS5jdXJ2ZVNlZ21lbnRzICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHRvSlNPTiggc2hhcGVzLCBkYXRhICkge1xyXG5cclxuXHRkYXRhLnNoYXBlcyA9IFtdO1xyXG5cclxuXHRpZiAoIEFycmF5LmlzQXJyYXkoIHNoYXBlcyApICkge1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHNoYXBlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgc2hhcGUgPSBzaGFwZXNbIGkgXTtcclxuXHJcblx0XHRcdGRhdGEuc2hhcGVzLnB1c2goIHNoYXBlLnV1aWQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0ZGF0YS5zaGFwZXMucHVzaCggc2hhcGVzLnV1aWQgKTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gZGF0YTtcclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFNoYXBlR2VvbWV0cnkgfTtcclxuIiwiaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcclxuaW1wb3J0IHsgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyQXR0cmlidXRlLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcblxyXG4vKipcclxuICogQSBjbGFzcyBmb3IgZ2VuZXJhdGluZyBhIHNwaGVyZSBnZW9tZXRyeS5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgZ2VvbWV0cnkgPSBuZXcgVEhSRUUuU3BoZXJlR2VvbWV0cnkoIDE1LCAzMiwgMTYgKTtcclxuICogY29uc3QgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IDB4ZmZmZjAwIH0gKTtcclxuICogY29uc3Qgc3BoZXJlID0gbmV3IFRIUkVFLk1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG4gKiBzY2VuZS5hZGQoIHNwaGVyZSApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIEJ1ZmZlckdlb21ldHJ5XHJcbiAqL1xyXG5jbGFzcyBTcGhlcmVHZW9tZXRyeSBleHRlbmRzIEJ1ZmZlckdlb21ldHJ5IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBzcGhlcmUgZ2VvbWV0cnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3JhZGl1cz0xXSAtIFRoZSBzcGhlcmUgcmFkaXVzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbd2lkdGhTZWdtZW50cz0zMl0gLSBUaGUgbnVtYmVyIG9mIGhvcml6b250YWwgc2VnbWVudHMuIE1pbmltdW0gdmFsdWUgaXMgYDNgLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbaGVpZ2h0U2VnbWVudHM9MTZdIC0gVGhlIG51bWJlciBvZiB2ZXJ0aWNhbCBzZWdtZW50cy4gTWluaW11bSB2YWx1ZSBpcyBgMmAuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtwaGlTdGFydD0wXSAtIFRoZSBob3Jpem9udGFsIHN0YXJ0aW5nIGFuZ2xlIGluIHJhZGlhbnMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtwaGlMZW5ndGg9TWF0aC5QSSoyXSAtIFRoZSBob3Jpem9udGFsIHN3ZWVwIGFuZ2xlIHNpemUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt0aGV0YVN0YXJ0PTBdIC0gVGhlIHZlcnRpY2FsIHN0YXJ0aW5nIGFuZ2xlIGluIHJhZGlhbnMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt0aGV0YUxlbmd0aD1NYXRoLlBJXSAtIFRoZSB2ZXJ0aWNhbCBzd2VlcCBhbmdsZSBzaXplLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCByYWRpdXMgPSAxLCB3aWR0aFNlZ21lbnRzID0gMzIsIGhlaWdodFNlZ21lbnRzID0gMTYsIHBoaVN0YXJ0ID0gMCwgcGhpTGVuZ3RoID0gTWF0aC5QSSAqIDIsIHRoZXRhU3RhcnQgPSAwLCB0aGV0YUxlbmd0aCA9IE1hdGguUEkgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnU3BoZXJlR2VvbWV0cnknO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG9sZHMgdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMgdGhhdCBoYXZlIGJlZW5cclxuXHRcdCAqIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGdlb21ldHJ5LiBBbnkgbW9kaWZpY2F0aW9uXHJcblx0XHQgKiBhZnRlciBpbnN0YW50aWF0aW9uIGRvZXMgbm90IGNoYW5nZSB0aGUgZ2VvbWV0cnkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0ge1xyXG5cdFx0XHRyYWRpdXM6IHJhZGl1cyxcclxuXHRcdFx0d2lkdGhTZWdtZW50czogd2lkdGhTZWdtZW50cyxcclxuXHRcdFx0aGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzLFxyXG5cdFx0XHRwaGlTdGFydDogcGhpU3RhcnQsXHJcblx0XHRcdHBoaUxlbmd0aDogcGhpTGVuZ3RoLFxyXG5cdFx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxyXG5cdFx0XHR0aGV0YUxlbmd0aDogdGhldGFMZW5ndGhcclxuXHRcdH07XHJcblxyXG5cdFx0d2lkdGhTZWdtZW50cyA9IE1hdGgubWF4KCAzLCBNYXRoLmZsb29yKCB3aWR0aFNlZ21lbnRzICkgKTtcclxuXHRcdGhlaWdodFNlZ21lbnRzID0gTWF0aC5tYXgoIDIsIE1hdGguZmxvb3IoIGhlaWdodFNlZ21lbnRzICkgKTtcclxuXHJcblx0XHRjb25zdCB0aGV0YUVuZCA9IE1hdGgubWluKCB0aGV0YVN0YXJ0ICsgdGhldGFMZW5ndGgsIE1hdGguUEkgKTtcclxuXHJcblx0XHRsZXQgaW5kZXggPSAwO1xyXG5cdFx0Y29uc3QgZ3JpZCA9IFtdO1xyXG5cclxuXHRcdGNvbnN0IHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XHJcblx0XHRjb25zdCBub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xyXG5cclxuXHRcdC8vIGJ1ZmZlcnNcclxuXHJcblx0XHRjb25zdCBpbmRpY2VzID0gW107XHJcblx0XHRjb25zdCB2ZXJ0aWNlcyA9IFtdO1xyXG5cdFx0Y29uc3Qgbm9ybWFscyA9IFtdO1xyXG5cdFx0Y29uc3QgdXZzID0gW107XHJcblxyXG5cdFx0Ly8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xyXG5cclxuXHRcdGZvciAoIGxldCBpeSA9IDA7IGl5IDw9IGhlaWdodFNlZ21lbnRzOyBpeSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHZlcnRpY2VzUm93ID0gW107XHJcblxyXG5cdFx0XHRjb25zdCB2ID0gaXkgLyBoZWlnaHRTZWdtZW50cztcclxuXHJcblx0XHRcdC8vIHNwZWNpYWwgY2FzZSBmb3IgdGhlIHBvbGVzXHJcblxyXG5cdFx0XHRsZXQgdU9mZnNldCA9IDA7XHJcblxyXG5cdFx0XHRpZiAoIGl5ID09PSAwICYmIHRoZXRhU3RhcnQgPT09IDAgKSB7XHJcblxyXG5cdFx0XHRcdHVPZmZzZXQgPSAwLjUgLyB3aWR0aFNlZ21lbnRzO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggaXkgPT09IGhlaWdodFNlZ21lbnRzICYmIHRoZXRhRW5kID09PSBNYXRoLlBJICkge1xyXG5cclxuXHRcdFx0XHR1T2Zmc2V0ID0gLSAwLjUgLyB3aWR0aFNlZ21lbnRzO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Zm9yICggbGV0IGl4ID0gMDsgaXggPD0gd2lkdGhTZWdtZW50czsgaXggKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHUgPSBpeCAvIHdpZHRoU2VnbWVudHM7XHJcblxyXG5cdFx0XHRcdC8vIHZlcnRleFxyXG5cclxuXHRcdFx0XHR2ZXJ0ZXgueCA9IC0gcmFkaXVzICogTWF0aC5jb3MoIHBoaVN0YXJ0ICsgdSAqIHBoaUxlbmd0aCApICogTWF0aC5zaW4oIHRoZXRhU3RhcnQgKyB2ICogdGhldGFMZW5ndGggKTtcclxuXHRcdFx0XHR2ZXJ0ZXgueSA9IHJhZGl1cyAqIE1hdGguY29zKCB0aGV0YVN0YXJ0ICsgdiAqIHRoZXRhTGVuZ3RoICk7XHJcblx0XHRcdFx0dmVydGV4LnogPSByYWRpdXMgKiBNYXRoLnNpbiggcGhpU3RhcnQgKyB1ICogcGhpTGVuZ3RoICkgKiBNYXRoLnNpbiggdGhldGFTdGFydCArIHYgKiB0aGV0YUxlbmd0aCApO1xyXG5cclxuXHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XHJcblxyXG5cdFx0XHRcdC8vIG5vcm1hbFxyXG5cclxuXHRcdFx0XHRub3JtYWwuY29weSggdmVydGV4ICkubm9ybWFsaXplKCk7XHJcblx0XHRcdFx0bm9ybWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7XHJcblxyXG5cdFx0XHRcdC8vIHV2XHJcblxyXG5cdFx0XHRcdHV2cy5wdXNoKCB1ICsgdU9mZnNldCwgMSAtIHYgKTtcclxuXHJcblx0XHRcdFx0dmVydGljZXNSb3cucHVzaCggaW5kZXggKysgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGdyaWQucHVzaCggdmVydGljZXNSb3cgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gaW5kaWNlc1xyXG5cclxuXHRcdGZvciAoIGxldCBpeSA9IDA7IGl5IDwgaGVpZ2h0U2VnbWVudHM7IGl5ICsrICkge1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGl4ID0gMDsgaXggPCB3aWR0aFNlZ21lbnRzOyBpeCArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgYSA9IGdyaWRbIGl5IF1bIGl4ICsgMSBdO1xyXG5cdFx0XHRcdGNvbnN0IGIgPSBncmlkWyBpeSBdWyBpeCBdO1xyXG5cdFx0XHRcdGNvbnN0IGMgPSBncmlkWyBpeSArIDEgXVsgaXggXTtcclxuXHRcdFx0XHRjb25zdCBkID0gZ3JpZFsgaXkgKyAxIF1bIGl4ICsgMSBdO1xyXG5cclxuXHRcdFx0XHRpZiAoIGl5ICE9PSAwIHx8IHRoZXRhU3RhcnQgPiAwICkgaW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XHJcblx0XHRcdFx0aWYgKCBpeSAhPT0gaGVpZ2h0U2VnbWVudHMgLSAxIHx8IHRoZXRhRW5kIDwgTWF0aC5QSSApIGluZGljZXMucHVzaCggYiwgYywgZCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBidWlsZCBnZW9tZXRyeVxyXG5cclxuXHRcdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcclxuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xyXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XHJcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMucGFyYW1ldGVycyA9IE9iamVjdC5hc3NpZ24oIHt9LCBzb3VyY2UucGFyYW1ldGVycyApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGZyb20gdGhlIGdpdmVuXHJcblx0ICogSlNPTiBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIEEgSlNPTiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzZXJpYWxpemVkIGdlb21ldHJ5LlxyXG5cdCAqIEByZXR1cm4ge1NwaGVyZUdlb21ldHJ5fSBBIG5ldyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzdGF0aWMgZnJvbUpTT04oIGRhdGEgKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBTcGhlcmVHZW9tZXRyeSggZGF0YS5yYWRpdXMsIGRhdGEud2lkdGhTZWdtZW50cywgZGF0YS5oZWlnaHRTZWdtZW50cywgZGF0YS5waGlTdGFydCwgZGF0YS5waGlMZW5ndGgsIGRhdGEudGhldGFTdGFydCwgZGF0YS50aGV0YUxlbmd0aCApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBTcGhlcmVHZW9tZXRyeSB9O1xyXG4iLCJpbXBvcnQgeyBQb2x5aGVkcm9uR2VvbWV0cnkgfSBmcm9tICcuL1BvbHloZWRyb25HZW9tZXRyeS5qcyc7XHJcblxyXG4vKipcclxuICogQSBnZW9tZXRyeSBjbGFzcyBmb3IgcmVwcmVzZW50aW5nIGFuIHRldHJhaGVkcm9uLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBnZW9tZXRyeSA9IG5ldyBUSFJFRS5UZXRyYWhlZHJvbkdlb21ldHJ5KCk7XHJcbiAqIGNvbnN0IG1hdGVyaWFsID0gbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiAweGZmZmYwMCB9ICk7XHJcbiAqIGNvbnN0IHRldHJhaGVkcm9uID0gbmV3IFRIUkVFLk1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG4gKiBzY2VuZS5hZGQoIHRldHJhaGVkcm9uICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgUG9seWhlZHJvbkdlb21ldHJ5XHJcbiAqL1xyXG5jbGFzcyBUZXRyYWhlZHJvbkdlb21ldHJ5IGV4dGVuZHMgUG9seWhlZHJvbkdlb21ldHJ5IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB0ZXRyYWhlZHJvbiBnZW9tZXRyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbcmFkaXVzPTFdIC0gUmFkaXVzIG9mIHRoZSB0ZXRyYWhlZHJvbi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2RldGFpbD0wXSAtIFNldHRpbmcgdGhpcyB0byBhIHZhbHVlIGdyZWF0ZXIgdGhhbiBgMGAgYWRkcyB2ZXJ0aWNlcyBtYWtpbmcgaXQgbm8gbG9uZ2VyIGEgdGV0cmFoZWRyb24uXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHJhZGl1cyA9IDEsIGRldGFpbCA9IDAgKSB7XHJcblxyXG5cdFx0Y29uc3QgdmVydGljZXMgPSBbXHJcblx0XHRcdDEsIDEsIDEsIFx0LSAxLCAtIDEsIDEsIFx0LSAxLCAxLCAtIDEsIFx0MSwgLSAxLCAtIDFcclxuXHRcdF07XHJcblxyXG5cdFx0Y29uc3QgaW5kaWNlcyA9IFtcclxuXHRcdFx0MiwgMSwgMCwgXHQwLCAzLCAyLFx0MSwgMywgMCxcdDIsIDMsIDFcclxuXHRcdF07XHJcblxyXG5cdFx0c3VwZXIoIHZlcnRpY2VzLCBpbmRpY2VzLCByYWRpdXMsIGRldGFpbCApO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdUZXRyYWhlZHJvbkdlb21ldHJ5JztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvbGRzIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzIHRoYXQgaGF2ZSBiZWVuXHJcblx0XHQgKiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBnZW9tZXRyeS4gQW55IG1vZGlmaWNhdGlvblxyXG5cdFx0ICogYWZ0ZXIgaW5zdGFudGlhdGlvbiBkb2VzIG5vdCBjaGFuZ2UgdGhlIGdlb21ldHJ5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucGFyYW1ldGVycyA9IHtcclxuXHRcdFx0cmFkaXVzOiByYWRpdXMsXHJcblx0XHRcdGRldGFpbDogZGV0YWlsXHJcblx0XHR9O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGZyb20gdGhlIGdpdmVuXHJcblx0ICogSlNPTiBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIEEgSlNPTiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzZXJpYWxpemVkIGdlb21ldHJ5LlxyXG5cdCAqIEByZXR1cm4ge1RldHJhaGVkcm9uR2VvbWV0cnl9IEEgbmV3IGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBmcm9tSlNPTiggZGF0YSApIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IFRldHJhaGVkcm9uR2VvbWV0cnkoIGRhdGEucmFkaXVzLCBkYXRhLmRldGFpbCApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBUZXRyYWhlZHJvbkdlb21ldHJ5IH07XHJcbiIsImltcG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9CdWZmZXJHZW9tZXRyeS5qcyc7XHJcbmltcG9ydCB7IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgZ2VvbWV0cnkgY2xhc3MgZm9yIHJlcHJlc2VudGluZyBhbiB0b3J1cy5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgZ2VvbWV0cnkgPSBuZXcgVEhSRUUuVG9ydXNHZW9tZXRyeSggMTAsIDMsIDE2LCAxMDAgKTtcclxuICogY29uc3QgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IDB4ZmZmZjAwIH0gKTtcclxuICogY29uc3QgdG9ydXMgPSBuZXcgVEhSRUUuTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcbiAqIHNjZW5lLmFkZCggdG9ydXMgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBCdWZmZXJHZW9tZXRyeVxyXG4gKi9cclxuY2xhc3MgVG9ydXNHZW9tZXRyeSBleHRlbmRzIEJ1ZmZlckdlb21ldHJ5IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB0b3J1cyBnZW9tZXRyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbcmFkaXVzPTFdIC0gUmFkaXVzIG9mIHRoZSB0b3J1cywgZnJvbSB0aGUgY2VudGVyIG9mIHRoZSB0b3J1cyB0byB0aGUgY2VudGVyIG9mIHRoZSB0dWJlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbdHViZT0wLjRdIC0gUmFkaXVzIG9mIHRoZSB0dWJlLiBNdXN0IGJlIHNtYWxsZXIgdGhhbiBgcmFkaXVzYC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3JhZGlhbFNlZ21lbnRzPTEyXSAtIFRoZSBudW1iZXIgb2YgcmFkaWFsIHNlZ21lbnRzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbdHVidWxhclNlZ21lbnRzPTQ4XSAtIFRoZSBudW1iZXIgb2YgdHVidWxhciBzZWdtZW50cy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2FyYz1NYXRoLlBJKjJdIC0gQ2VudHJhbCBhbmdsZSBpbiByYWRpYW5zLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCByYWRpdXMgPSAxLCB0dWJlID0gMC40LCByYWRpYWxTZWdtZW50cyA9IDEyLCB0dWJ1bGFyU2VnbWVudHMgPSA0OCwgYXJjID0gTWF0aC5QSSAqIDIgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnVG9ydXNHZW9tZXRyeSc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb2xkcyB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVycyB0aGF0IGhhdmUgYmVlblxyXG5cdFx0ICogdXNlZCB0byBnZW5lcmF0ZSB0aGUgZ2VvbWV0cnkuIEFueSBtb2RpZmljYXRpb25cclxuXHRcdCAqIGFmdGVyIGluc3RhbnRpYXRpb24gZG9lcyBub3QgY2hhbmdlIHRoZSBnZW9tZXRyeS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBhcmFtZXRlcnMgPSB7XHJcblx0XHRcdHJhZGl1czogcmFkaXVzLFxyXG5cdFx0XHR0dWJlOiB0dWJlLFxyXG5cdFx0XHRyYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsXHJcblx0XHRcdHR1YnVsYXJTZWdtZW50czogdHVidWxhclNlZ21lbnRzLFxyXG5cdFx0XHRhcmM6IGFyY1xyXG5cdFx0fTtcclxuXHJcblx0XHRyYWRpYWxTZWdtZW50cyA9IE1hdGguZmxvb3IoIHJhZGlhbFNlZ21lbnRzICk7XHJcblx0XHR0dWJ1bGFyU2VnbWVudHMgPSBNYXRoLmZsb29yKCB0dWJ1bGFyU2VnbWVudHMgKTtcclxuXHJcblx0XHQvLyBidWZmZXJzXHJcblxyXG5cdFx0Y29uc3QgaW5kaWNlcyA9IFtdO1xyXG5cdFx0Y29uc3QgdmVydGljZXMgPSBbXTtcclxuXHRcdGNvbnN0IG5vcm1hbHMgPSBbXTtcclxuXHRcdGNvbnN0IHV2cyA9IFtdO1xyXG5cclxuXHRcdC8vIGhlbHBlciB2YXJpYWJsZXNcclxuXHJcblx0XHRjb25zdCBjZW50ZXIgPSBuZXcgVmVjdG9yMygpO1xyXG5cdFx0Y29uc3QgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcclxuXHRcdGNvbnN0IG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XHJcblxyXG5cdFx0Ly8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xyXG5cclxuXHRcdGZvciAoIGxldCBqID0gMDsgaiA8PSByYWRpYWxTZWdtZW50czsgaiArKyApIHtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8PSB0dWJ1bGFyU2VnbWVudHM7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHUgPSBpIC8gdHVidWxhclNlZ21lbnRzICogYXJjO1xyXG5cdFx0XHRcdGNvbnN0IHYgPSBqIC8gcmFkaWFsU2VnbWVudHMgKiBNYXRoLlBJICogMjtcclxuXHJcblx0XHRcdFx0Ly8gdmVydGV4XHJcblxyXG5cdFx0XHRcdHZlcnRleC54ID0gKCByYWRpdXMgKyB0dWJlICogTWF0aC5jb3MoIHYgKSApICogTWF0aC5jb3MoIHUgKTtcclxuXHRcdFx0XHR2ZXJ0ZXgueSA9ICggcmFkaXVzICsgdHViZSAqIE1hdGguY29zKCB2ICkgKSAqIE1hdGguc2luKCB1ICk7XHJcblx0XHRcdFx0dmVydGV4LnogPSB0dWJlICogTWF0aC5zaW4oIHYgKTtcclxuXHJcblx0XHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xyXG5cclxuXHRcdFx0XHQvLyBub3JtYWxcclxuXHJcblx0XHRcdFx0Y2VudGVyLnggPSByYWRpdXMgKiBNYXRoLmNvcyggdSApO1xyXG5cdFx0XHRcdGNlbnRlci55ID0gcmFkaXVzICogTWF0aC5zaW4oIHUgKTtcclxuXHRcdFx0XHRub3JtYWwuc3ViVmVjdG9ycyggdmVydGV4LCBjZW50ZXIgKS5ub3JtYWxpemUoKTtcclxuXHJcblx0XHRcdFx0bm9ybWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7XHJcblxyXG5cdFx0XHRcdC8vIHV2XHJcblxyXG5cdFx0XHRcdHV2cy5wdXNoKCBpIC8gdHVidWxhclNlZ21lbnRzICk7XHJcblx0XHRcdFx0dXZzLnB1c2goIGogLyByYWRpYWxTZWdtZW50cyApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBnZW5lcmF0ZSBpbmRpY2VzXHJcblxyXG5cdFx0Zm9yICggbGV0IGogPSAxOyBqIDw9IHJhZGlhbFNlZ21lbnRzOyBqICsrICkge1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAxOyBpIDw9IHR1YnVsYXJTZWdtZW50czsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Ly8gaW5kaWNlc1xyXG5cclxuXHRcdFx0XHRjb25zdCBhID0gKCB0dWJ1bGFyU2VnbWVudHMgKyAxICkgKiBqICsgaSAtIDE7XHJcblx0XHRcdFx0Y29uc3QgYiA9ICggdHVidWxhclNlZ21lbnRzICsgMSApICogKCBqIC0gMSApICsgaSAtIDE7XHJcblx0XHRcdFx0Y29uc3QgYyA9ICggdHVidWxhclNlZ21lbnRzICsgMSApICogKCBqIC0gMSApICsgaTtcclxuXHRcdFx0XHRjb25zdCBkID0gKCB0dWJ1bGFyU2VnbWVudHMgKyAxICkgKiBqICsgaTtcclxuXHJcblx0XHRcdFx0Ly8gZmFjZXNcclxuXHJcblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XHJcblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGJ1aWxkIGdlb21ldHJ5XHJcblxyXG5cdFx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xyXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XHJcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcclxuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0gT2JqZWN0LmFzc2lnbigge30sIHNvdXJjZS5wYXJhbWV0ZXJzICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRmFjdG9yeSBtZXRob2QgZm9yIGNyZWF0aW5nIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZnJvbSB0aGUgZ2l2ZW5cclxuXHQgKiBKU09OIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gQSBKU09OIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNlcmlhbGl6ZWQgZ2VvbWV0cnkuXHJcblx0ICogQHJldHVybiB7VG9ydXNHZW9tZXRyeX0gQSBuZXcgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c3RhdGljIGZyb21KU09OKCBkYXRhICkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgVG9ydXNHZW9tZXRyeSggZGF0YS5yYWRpdXMsIGRhdGEudHViZSwgZGF0YS5yYWRpYWxTZWdtZW50cywgZGF0YS50dWJ1bGFyU2VnbWVudHMsIGRhdGEuYXJjICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFRvcnVzR2VvbWV0cnkgfTtcclxuIiwiaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcclxuaW1wb3J0IHsgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyQXR0cmlidXRlLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIHRvcnVzIGtub3QsIHRoZSBwYXJ0aWN1bGFyIHNoYXBlIG9mIHdoaWNoIGlzIGRlZmluZWQgYnkgYSBwYWlyXHJcbiAqIG9mIGNvcHJpbWUgaW50ZWdlcnMsIHAgYW5kIHEuIElmIHAgYW5kIHEgYXJlIG5vdCBjb3ByaW1lLCB0aGUgcmVzdWx0IHdpbGxcclxuICogYmUgYSB0b3J1cyBsaW5rLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBnZW9tZXRyeSA9IG5ldyBUSFJFRS5Ub3J1c0tub3RHZW9tZXRyeSggMTAsIDMsIDEwMCwgMTYgKTtcclxuICogY29uc3QgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IDB4ZmZmZjAwIH0gKTtcclxuICogY29uc3QgdG9ydXNLbm90ID0gbmV3IFRIUkVFLk1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG4gKiBzY2VuZS5hZGQoIHRvcnVzS25vdCApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIEJ1ZmZlckdlb21ldHJ5XHJcbiAqL1xyXG5jbGFzcyBUb3J1c0tub3RHZW9tZXRyeSBleHRlbmRzIEJ1ZmZlckdlb21ldHJ5IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB0b3J1cyBrbm90IGdlb21ldHJ5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpdXM9MV0gLSBSYWRpdXMgb2YgdGhlIHRvcnVzIGtub3QuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt0dWJlPTAuNF0gLSBSYWRpdXMgb2YgdGhlIHR1YmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt0dWJ1bGFyU2VnbWVudHM9NjRdIC0gVGhlIG51bWJlciBvZiB0dWJ1bGFyIHNlZ21lbnRzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbcmFkaWFsU2VnbWVudHM9OF0gLSBUaGUgbnVtYmVyIG9mIHJhZGlhbCBzZWdtZW50cy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3A9Ml0gLSBUaGlzIHZhbHVlIGRldGVybWluZXMsIGhvdyBtYW55IHRpbWVzIHRoZSBnZW9tZXRyeSB3aW5kcyBhcm91bmQgaXRzIGF4aXMgb2Ygcm90YXRpb25hbCBzeW1tZXRyeS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3E9M10gLSBUaGlzIHZhbHVlIGRldGVybWluZXMsIGhvdyBtYW55IHRpbWVzIHRoZSBnZW9tZXRyeSB3aW5kcyBhcm91bmQgYSBjaXJjbGUgaW4gdGhlIGludGVyaW9yIG9mIHRoZSB0b3J1cy5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcmFkaXVzID0gMSwgdHViZSA9IDAuNCwgdHVidWxhclNlZ21lbnRzID0gNjQsIHJhZGlhbFNlZ21lbnRzID0gOCwgcCA9IDIsIHEgPSAzICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ1RvcnVzS25vdEdlb21ldHJ5JztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvbGRzIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzIHRoYXQgaGF2ZSBiZWVuXHJcblx0XHQgKiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBnZW9tZXRyeS4gQW55IG1vZGlmaWNhdGlvblxyXG5cdFx0ICogYWZ0ZXIgaW5zdGFudGlhdGlvbiBkb2VzIG5vdCBjaGFuZ2UgdGhlIGdlb21ldHJ5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucGFyYW1ldGVycyA9IHtcclxuXHRcdFx0cmFkaXVzOiByYWRpdXMsXHJcblx0XHRcdHR1YmU6IHR1YmUsXHJcblx0XHRcdHR1YnVsYXJTZWdtZW50czogdHVidWxhclNlZ21lbnRzLFxyXG5cdFx0XHRyYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsXHJcblx0XHRcdHA6IHAsXHJcblx0XHRcdHE6IHFcclxuXHRcdH07XHJcblxyXG5cdFx0dHVidWxhclNlZ21lbnRzID0gTWF0aC5mbG9vciggdHVidWxhclNlZ21lbnRzICk7XHJcblx0XHRyYWRpYWxTZWdtZW50cyA9IE1hdGguZmxvb3IoIHJhZGlhbFNlZ21lbnRzICk7XHJcblxyXG5cdFx0Ly8gYnVmZmVyc1xyXG5cclxuXHRcdGNvbnN0IGluZGljZXMgPSBbXTtcclxuXHRcdGNvbnN0IHZlcnRpY2VzID0gW107XHJcblx0XHRjb25zdCBub3JtYWxzID0gW107XHJcblx0XHRjb25zdCB1dnMgPSBbXTtcclxuXHJcblx0XHQvLyBoZWxwZXIgdmFyaWFibGVzXHJcblxyXG5cdFx0Y29uc3QgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcclxuXHRcdGNvbnN0IG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XHJcblxyXG5cdFx0Y29uc3QgUDEgPSBuZXcgVmVjdG9yMygpO1xyXG5cdFx0Y29uc3QgUDIgPSBuZXcgVmVjdG9yMygpO1xyXG5cclxuXHRcdGNvbnN0IEIgPSBuZXcgVmVjdG9yMygpO1xyXG5cdFx0Y29uc3QgVCA9IG5ldyBWZWN0b3IzKCk7XHJcblx0XHRjb25zdCBOID0gbmV3IFZlY3RvcjMoKTtcclxuXHJcblx0XHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzXHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDw9IHR1YnVsYXJTZWdtZW50czsgKysgaSApIHtcclxuXHJcblx0XHRcdC8vIHRoZSByYWRpYW4gXCJ1XCIgaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIHBvc2l0aW9uIG9uIHRoZSB0b3J1cyBjdXJ2ZSBvZiB0aGUgY3VycmVudCB0dWJ1bGFyIHNlZ21lbnRcclxuXHJcblx0XHRcdGNvbnN0IHUgPSBpIC8gdHVidWxhclNlZ21lbnRzICogcCAqIE1hdGguUEkgKiAyO1xyXG5cclxuXHRcdFx0Ly8gbm93IHdlIGNhbGN1bGF0ZSB0d28gcG9pbnRzLiBQMSBpcyBvdXIgY3VycmVudCBwb3NpdGlvbiBvbiB0aGUgY3VydmUsIFAyIGlzIGEgbGl0dGxlIGZhcnRoZXIgYWhlYWQuXHJcblx0XHRcdC8vIHRoZXNlIHBvaW50cyBhcmUgdXNlZCB0byBjcmVhdGUgYSBzcGVjaWFsIFwiY29vcmRpbmF0ZSBzcGFjZVwiLCB3aGljaCBpcyBuZWNlc3NhcnkgdG8gY2FsY3VsYXRlIHRoZSBjb3JyZWN0IHZlcnRleCBwb3NpdGlvbnNcclxuXHJcblx0XHRcdGNhbGN1bGF0ZVBvc2l0aW9uT25DdXJ2ZSggdSwgcCwgcSwgcmFkaXVzLCBQMSApO1xyXG5cdFx0XHRjYWxjdWxhdGVQb3NpdGlvbk9uQ3VydmUoIHUgKyAwLjAxLCBwLCBxLCByYWRpdXMsIFAyICk7XHJcblxyXG5cdFx0XHQvLyBjYWxjdWxhdGUgb3J0aG9ub3JtYWwgYmFzaXNcclxuXHJcblx0XHRcdFQuc3ViVmVjdG9ycyggUDIsIFAxICk7XHJcblx0XHRcdE4uYWRkVmVjdG9ycyggUDIsIFAxICk7XHJcblx0XHRcdEIuY3Jvc3NWZWN0b3JzKCBULCBOICk7XHJcblx0XHRcdE4uY3Jvc3NWZWN0b3JzKCBCLCBUICk7XHJcblxyXG5cdFx0XHQvLyBub3JtYWxpemUgQiwgTi4gVCBjYW4gYmUgaWdub3JlZCwgd2UgZG9uJ3QgdXNlIGl0XHJcblxyXG5cdFx0XHRCLm5vcm1hbGl6ZSgpO1xyXG5cdFx0XHROLm5vcm1hbGl6ZSgpO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGogPSAwOyBqIDw9IHJhZGlhbFNlZ21lbnRzOyArKyBqICkge1xyXG5cclxuXHRcdFx0XHQvLyBub3cgY2FsY3VsYXRlIHRoZSB2ZXJ0aWNlcy4gdGhleSBhcmUgbm90aGluZyBtb3JlIHRoYW4gYW4gZXh0cnVzaW9uIG9mIHRoZSB0b3J1cyBjdXJ2ZS5cclxuXHRcdFx0XHQvLyBiZWNhdXNlIHdlIGV4dHJ1ZGUgYSBzaGFwZSBpbiB0aGUgeHktcGxhbmUsIHRoZXJlIGlzIG5vIG5lZWQgdG8gY2FsY3VsYXRlIGEgei12YWx1ZS5cclxuXHJcblx0XHRcdFx0Y29uc3QgdiA9IGogLyByYWRpYWxTZWdtZW50cyAqIE1hdGguUEkgKiAyO1xyXG5cdFx0XHRcdGNvbnN0IGN4ID0gLSB0dWJlICogTWF0aC5jb3MoIHYgKTtcclxuXHRcdFx0XHRjb25zdCBjeSA9IHR1YmUgKiBNYXRoLnNpbiggdiApO1xyXG5cclxuXHRcdFx0XHQvLyBub3cgY2FsY3VsYXRlIHRoZSBmaW5hbCB2ZXJ0ZXggcG9zaXRpb24uXHJcblx0XHRcdFx0Ly8gZmlyc3Qgd2Ugb3JpZW50IHRoZSBleHRydXNpb24gd2l0aCBvdXIgYmFzaXMgdmVjdG9ycywgdGhlbiB3ZSBhZGQgaXQgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gb24gdGhlIGN1cnZlXHJcblxyXG5cdFx0XHRcdHZlcnRleC54ID0gUDEueCArICggY3ggKiBOLnggKyBjeSAqIEIueCApO1xyXG5cdFx0XHRcdHZlcnRleC55ID0gUDEueSArICggY3ggKiBOLnkgKyBjeSAqIEIueSApO1xyXG5cdFx0XHRcdHZlcnRleC56ID0gUDEueiArICggY3ggKiBOLnogKyBjeSAqIEIueiApO1xyXG5cclxuXHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XHJcblxyXG5cdFx0XHRcdC8vIG5vcm1hbCAoUDEgaXMgYWx3YXlzIHRoZSBjZW50ZXIvb3JpZ2luIG9mIHRoZSBleHRydXNpb24sIHRodXMgd2UgY2FuIHVzZSBpdCB0byBjYWxjdWxhdGUgdGhlIG5vcm1hbClcclxuXHJcblx0XHRcdFx0bm9ybWFsLnN1YlZlY3RvcnMoIHZlcnRleCwgUDEgKS5ub3JtYWxpemUoKTtcclxuXHJcblx0XHRcdFx0bm9ybWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7XHJcblxyXG5cdFx0XHRcdC8vIHV2XHJcblxyXG5cdFx0XHRcdHV2cy5wdXNoKCBpIC8gdHVidWxhclNlZ21lbnRzICk7XHJcblx0XHRcdFx0dXZzLnB1c2goIGogLyByYWRpYWxTZWdtZW50cyApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBnZW5lcmF0ZSBpbmRpY2VzXHJcblxyXG5cdFx0Zm9yICggbGV0IGogPSAxOyBqIDw9IHR1YnVsYXJTZWdtZW50czsgaiArKyApIHtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMTsgaSA8PSByYWRpYWxTZWdtZW50czsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Ly8gaW5kaWNlc1xyXG5cclxuXHRcdFx0XHRjb25zdCBhID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqICggaiAtIDEgKSArICggaSAtIDEgKTtcclxuXHRcdFx0XHRjb25zdCBiID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqIGogKyAoIGkgLSAxICk7XHJcblx0XHRcdFx0Y29uc3QgYyA9ICggcmFkaWFsU2VnbWVudHMgKyAxICkgKiBqICsgaTtcclxuXHRcdFx0XHRjb25zdCBkID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqICggaiAtIDEgKSArIGk7XHJcblxyXG5cdFx0XHRcdC8vIGZhY2VzXHJcblxyXG5cdFx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgZCApO1xyXG5cdFx0XHRcdGluZGljZXMucHVzaCggYiwgYywgZCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBidWlsZCBnZW9tZXRyeVxyXG5cclxuXHRcdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcclxuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xyXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XHJcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XHJcblxyXG5cdFx0Ly8gdGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9uIHRoZSB0b3J1cyBjdXJ2ZVxyXG5cclxuXHRcdGZ1bmN0aW9uIGNhbGN1bGF0ZVBvc2l0aW9uT25DdXJ2ZSggdSwgcCwgcSwgcmFkaXVzLCBwb3NpdGlvbiApIHtcclxuXHJcblx0XHRcdGNvbnN0IGN1ID0gTWF0aC5jb3MoIHUgKTtcclxuXHRcdFx0Y29uc3Qgc3UgPSBNYXRoLnNpbiggdSApO1xyXG5cdFx0XHRjb25zdCBxdU92ZXJQID0gcSAvIHAgKiB1O1xyXG5cdFx0XHRjb25zdCBjcyA9IE1hdGguY29zKCBxdU92ZXJQICk7XHJcblxyXG5cdFx0XHRwb3NpdGlvbi54ID0gcmFkaXVzICogKCAyICsgY3MgKSAqIDAuNSAqIGN1O1xyXG5cdFx0XHRwb3NpdGlvbi55ID0gcmFkaXVzICogKCAyICsgY3MgKSAqIHN1ICogMC41O1xyXG5cdFx0XHRwb3NpdGlvbi56ID0gcmFkaXVzICogTWF0aC5zaW4oIHF1T3ZlclAgKSAqIDAuNTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMucGFyYW1ldGVycyA9IE9iamVjdC5hc3NpZ24oIHt9LCBzb3VyY2UucGFyYW1ldGVycyApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGZyb20gdGhlIGdpdmVuXHJcblx0ICogSlNPTiBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIEEgSlNPTiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzZXJpYWxpemVkIGdlb21ldHJ5LlxyXG5cdCAqIEByZXR1cm4ge1RvcnVzS25vdEdlb21ldHJ5fSBBIG5ldyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzdGF0aWMgZnJvbUpTT04oIGRhdGEgKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBUb3J1c0tub3RHZW9tZXRyeSggZGF0YS5yYWRpdXMsIGRhdGEudHViZSwgZGF0YS50dWJ1bGFyU2VnbWVudHMsIGRhdGEucmFkaWFsU2VnbWVudHMsIGRhdGEucCwgZGF0YS5xICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFRvcnVzS25vdEdlb21ldHJ5IH07XHJcbiIsImltcG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9CdWZmZXJHZW9tZXRyeS5qcyc7XHJcbmltcG9ydCB7IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcbmltcG9ydCAqIGFzIEN1cnZlcyBmcm9tICcuLi9leHRyYXMvY3VydmVzL0N1cnZlcy5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjIuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgdHViZSB0aGF0IGV4dHJ1ZGVzIGFsb25nIGEgM0QgY3VydmUuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNsYXNzIEN1c3RvbVNpbkN1cnZlIGV4dGVuZHMgVEhSRUUuQ3VydmUge1xyXG4gKlxyXG4gKiBcdGdldFBvaW50KCB0LCBvcHRpb25hbFRhcmdldCA9IG5ldyBUSFJFRS5WZWN0b3IzKCkgKSB7XHJcbiAqXHJcbiAqIFx0XHRjb25zdCB0eCA9IHQgKiAzIC0gMS41O1xyXG4gKiBcdFx0Y29uc3QgdHkgPSBNYXRoLnNpbiggMiAqIE1hdGguUEkgKiB0ICk7XHJcbiAqIFx0XHRjb25zdCB0eiA9IDA7XHJcbiAqXHJcbiAqIFx0XHRyZXR1cm4gb3B0aW9uYWxUYXJnZXQuc2V0KCB0eCwgdHksIHR6ICk7XHJcbiAqIFx0fVxyXG4gKlxyXG4gKiB9XHJcbiAqXHJcbiAqIGNvbnN0IHBhdGggPSBuZXcgQ3VzdG9tU2luQ3VydmUoIDEwICk7XHJcbiAqIGNvbnN0IGdlb21ldHJ5ID0gbmV3IFRIUkVFLlR1YmVHZW9tZXRyeSggcGF0aCwgMjAsIDIsIDgsIGZhbHNlICk7XHJcbiAqIGNvbnN0IG1hdGVyaWFsID0gbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiAweDAwZmYwMCB9ICk7XHJcbiAqIGNvbnN0IG1lc2ggPSBuZXcgVEhSRUUuTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcbiAqIHNjZW5lLmFkZCggbWVzaCApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIEJ1ZmZlckdlb21ldHJ5XHJcbiAqL1xyXG5jbGFzcyBUdWJlR2VvbWV0cnkgZXh0ZW5kcyBCdWZmZXJHZW9tZXRyeSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgdHViZSBnZW9tZXRyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Q3VydmV9IFtwYXRoPVF1YWRyYXRpY0JlemllckN1cnZlM10gLSBBIDNEIGN1cnZlIGRlZmluaW5nIHRoZSBwYXRoIG9mIHRoZSB0dWJlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbdHVidWxhclNlZ21lbnRzPTY0XSAtIFRoZSBudW1iZXIgb2Ygc2VnbWVudHMgdGhhdCBtYWtlIHVwIHRoZSB0dWJlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbcmFkaXVzPTFdIC1UaGUgcmFkaXVzIG9mIHRoZSB0dWJlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbcmFkaWFsU2VnbWVudHM9OF0gLSBUaGUgbnVtYmVyIG9mIHNlZ21lbnRzIHRoYXQgbWFrZSB1cCB0aGUgY3Jvc3Mtc2VjdGlvbi5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtjbG9zZWQ9ZmFsc2VdIC0gV2hldGhlciB0aGUgdHViZSBpcyBjbG9zZWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwYXRoID0gbmV3IEN1cnZlc1sgJ1F1YWRyYXRpY0JlemllckN1cnZlMycgXSggbmV3IFZlY3RvcjMoIC0gMSwgLSAxLCAwICksIG5ldyBWZWN0b3IzKCAtIDEsIDEsIDAgKSwgbmV3IFZlY3RvcjMoIDEsIDEsIDAgKSApLCB0dWJ1bGFyU2VnbWVudHMgPSA2NCwgcmFkaXVzID0gMSwgcmFkaWFsU2VnbWVudHMgPSA4LCBjbG9zZWQgPSBmYWxzZSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdUdWJlR2VvbWV0cnknO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG9sZHMgdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMgdGhhdCBoYXZlIGJlZW5cclxuXHRcdCAqIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGdlb21ldHJ5LiBBbnkgbW9kaWZpY2F0aW9uXHJcblx0XHQgKiBhZnRlciBpbnN0YW50aWF0aW9uIGRvZXMgbm90IGNoYW5nZSB0aGUgZ2VvbWV0cnkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0ge1xyXG5cdFx0XHRwYXRoOiBwYXRoLFxyXG5cdFx0XHR0dWJ1bGFyU2VnbWVudHM6IHR1YnVsYXJTZWdtZW50cyxcclxuXHRcdFx0cmFkaXVzOiByYWRpdXMsXHJcblx0XHRcdHJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cyxcclxuXHRcdFx0Y2xvc2VkOiBjbG9zZWRcclxuXHRcdH07XHJcblxyXG5cdFx0Y29uc3QgZnJhbWVzID0gcGF0aC5jb21wdXRlRnJlbmV0RnJhbWVzKCB0dWJ1bGFyU2VnbWVudHMsIGNsb3NlZCApO1xyXG5cclxuXHRcdC8vIGV4cG9zZSBpbnRlcm5hbHNcclxuXHJcblx0XHR0aGlzLnRhbmdlbnRzID0gZnJhbWVzLnRhbmdlbnRzO1xyXG5cdFx0dGhpcy5ub3JtYWxzID0gZnJhbWVzLm5vcm1hbHM7XHJcblx0XHR0aGlzLmJpbm9ybWFscyA9IGZyYW1lcy5iaW5vcm1hbHM7XHJcblxyXG5cdFx0Ly8gaGVscGVyIHZhcmlhYmxlc1xyXG5cclxuXHRcdGNvbnN0IHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XHJcblx0XHRjb25zdCBub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xyXG5cdFx0Y29uc3QgdXYgPSBuZXcgVmVjdG9yMigpO1xyXG5cdFx0bGV0IFAgPSBuZXcgVmVjdG9yMygpO1xyXG5cclxuXHRcdC8vIGJ1ZmZlclxyXG5cclxuXHRcdGNvbnN0IHZlcnRpY2VzID0gW107XHJcblx0XHRjb25zdCBub3JtYWxzID0gW107XHJcblx0XHRjb25zdCB1dnMgPSBbXTtcclxuXHRcdGNvbnN0IGluZGljZXMgPSBbXTtcclxuXHJcblx0XHQvLyBjcmVhdGUgYnVmZmVyIGRhdGFcclxuXHJcblx0XHRnZW5lcmF0ZUJ1ZmZlckRhdGEoKTtcclxuXHJcblx0XHQvLyBidWlsZCBnZW9tZXRyeVxyXG5cclxuXHRcdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcclxuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xyXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XHJcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XHJcblxyXG5cdFx0Ly8gZnVuY3Rpb25zXHJcblxyXG5cdFx0ZnVuY3Rpb24gZ2VuZXJhdGVCdWZmZXJEYXRhKCkge1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdHVidWxhclNlZ21lbnRzOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRnZW5lcmF0ZVNlZ21lbnQoIGkgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIGlmIHRoZSBnZW9tZXRyeSBpcyBub3QgY2xvc2VkLCBnZW5lcmF0ZSB0aGUgbGFzdCByb3cgb2YgdmVydGljZXMgYW5kIG5vcm1hbHNcclxuXHRcdFx0Ly8gYXQgdGhlIHJlZ3VsYXIgcG9zaXRpb24gb24gdGhlIGdpdmVuIHBhdGhcclxuXHRcdFx0Ly9cclxuXHRcdFx0Ly8gaWYgdGhlIGdlb21ldHJ5IGlzIGNsb3NlZCwgZHVwbGljYXRlIHRoZSBmaXJzdCByb3cgb2YgdmVydGljZXMgYW5kIG5vcm1hbHMgKHV2cyB3aWxsIGRpZmZlcilcclxuXHJcblx0XHRcdGdlbmVyYXRlU2VnbWVudCggKCBjbG9zZWQgPT09IGZhbHNlICkgPyB0dWJ1bGFyU2VnbWVudHMgOiAwICk7XHJcblxyXG5cdFx0XHQvLyB1dnMgYXJlIGdlbmVyYXRlZCBpbiBhIHNlcGFyYXRlIGZ1bmN0aW9uLlxyXG5cdFx0XHQvLyB0aGlzIG1ha2VzIGl0IGVhc3kgY29tcHV0ZSBjb3JyZWN0IHZhbHVlcyBmb3IgY2xvc2VkIGdlb21ldHJpZXNcclxuXHJcblx0XHRcdGdlbmVyYXRlVVZzKCk7XHJcblxyXG5cdFx0XHQvLyBmaW5hbGx5IGNyZWF0ZSBmYWNlc1xyXG5cclxuXHRcdFx0Z2VuZXJhdGVJbmRpY2VzKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIGdlbmVyYXRlU2VnbWVudCggaSApIHtcclxuXHJcblx0XHRcdC8vIHdlIHVzZSBnZXRQb2ludEF0IHRvIHNhbXBsZSBldmVubHkgZGlzdHJpYnV0ZWQgcG9pbnRzIGZyb20gdGhlIGdpdmVuIHBhdGhcclxuXHJcblx0XHRcdFAgPSBwYXRoLmdldFBvaW50QXQoIGkgLyB0dWJ1bGFyU2VnbWVudHMsIFAgKTtcclxuXHJcblx0XHRcdC8vIHJldHJpZXZlIGNvcnJlc3BvbmRpbmcgbm9ybWFsIGFuZCBiaW5vcm1hbFxyXG5cclxuXHRcdFx0Y29uc3QgTiA9IGZyYW1lcy5ub3JtYWxzWyBpIF07XHJcblx0XHRcdGNvbnN0IEIgPSBmcmFtZXMuYmlub3JtYWxzWyBpIF07XHJcblxyXG5cdFx0XHQvLyBnZW5lcmF0ZSBub3JtYWxzIGFuZCB2ZXJ0aWNlcyBmb3IgdGhlIGN1cnJlbnQgc2VnbWVudFxyXG5cclxuXHRcdFx0Zm9yICggbGV0IGogPSAwOyBqIDw9IHJhZGlhbFNlZ21lbnRzOyBqICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB2ID0gaiAvIHJhZGlhbFNlZ21lbnRzICogTWF0aC5QSSAqIDI7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHNpbiA9IE1hdGguc2luKCB2ICk7XHJcblx0XHRcdFx0Y29uc3QgY29zID0gLSBNYXRoLmNvcyggdiApO1xyXG5cclxuXHRcdFx0XHQvLyBub3JtYWxcclxuXHJcblx0XHRcdFx0bm9ybWFsLnggPSAoIGNvcyAqIE4ueCArIHNpbiAqIEIueCApO1xyXG5cdFx0XHRcdG5vcm1hbC55ID0gKCBjb3MgKiBOLnkgKyBzaW4gKiBCLnkgKTtcclxuXHRcdFx0XHRub3JtYWwueiA9ICggY29zICogTi56ICsgc2luICogQi56ICk7XHJcblx0XHRcdFx0bm9ybWFsLm5vcm1hbGl6ZSgpO1xyXG5cclxuXHRcdFx0XHRub3JtYWxzLnB1c2goIG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnogKTtcclxuXHJcblx0XHRcdFx0Ly8gdmVydGV4XHJcblxyXG5cdFx0XHRcdHZlcnRleC54ID0gUC54ICsgcmFkaXVzICogbm9ybWFsLng7XHJcblx0XHRcdFx0dmVydGV4LnkgPSBQLnkgKyByYWRpdXMgKiBub3JtYWwueTtcclxuXHRcdFx0XHR2ZXJ0ZXgueiA9IFAueiArIHJhZGl1cyAqIG5vcm1hbC56O1xyXG5cclxuXHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIGdlbmVyYXRlSW5kaWNlcygpIHtcclxuXHJcblx0XHRcdGZvciAoIGxldCBqID0gMTsgaiA8PSB0dWJ1bGFyU2VnbWVudHM7IGogKysgKSB7XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMTsgaSA8PSByYWRpYWxTZWdtZW50czsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBhID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqICggaiAtIDEgKSArICggaSAtIDEgKTtcclxuXHRcdFx0XHRcdGNvbnN0IGIgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogaiArICggaSAtIDEgKTtcclxuXHRcdFx0XHRcdGNvbnN0IGMgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogaiArIGk7XHJcblx0XHRcdFx0XHRjb25zdCBkID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqICggaiAtIDEgKSArIGk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gZmFjZXNcclxuXHJcblx0XHRcdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTtcclxuXHRcdFx0XHRcdGluZGljZXMucHVzaCggYiwgYywgZCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIGdlbmVyYXRlVVZzKCkge1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDw9IHR1YnVsYXJTZWdtZW50czsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGogPSAwOyBqIDw9IHJhZGlhbFNlZ21lbnRzOyBqICsrICkge1xyXG5cclxuXHRcdFx0XHRcdHV2LnggPSBpIC8gdHVidWxhclNlZ21lbnRzO1xyXG5cdFx0XHRcdFx0dXYueSA9IGogLyByYWRpYWxTZWdtZW50cztcclxuXHJcblx0XHRcdFx0XHR1dnMucHVzaCggdXYueCwgdXYueSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLnBhcmFtZXRlcnMgPSBPYmplY3QuYXNzaWduKCB7fSwgc291cmNlLnBhcmFtZXRlcnMgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHR0b0pTT04oKSB7XHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IHN1cGVyLnRvSlNPTigpO1xyXG5cclxuXHRcdGRhdGEucGF0aCA9IHRoaXMucGFyYW1ldGVycy5wYXRoLnRvSlNPTigpO1xyXG5cclxuXHRcdHJldHVybiBkYXRhO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGZyb20gdGhlIGdpdmVuXHJcblx0ICogSlNPTiBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIEEgSlNPTiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzZXJpYWxpemVkIGdlb21ldHJ5LlxyXG5cdCAqIEByZXR1cm4ge1R1YmVHZW9tZXRyeX0gQSBuZXcgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c3RhdGljIGZyb21KU09OKCBkYXRhICkge1xyXG5cclxuXHRcdC8vIFRoaXMgb25seSB3b3JrcyBmb3IgYnVpbHQtaW4gY3VydmVzIChlLmcuIENhdG11bGxSb21DdXJ2ZTMpLlxyXG5cdFx0Ly8gVXNlciBkZWZpbmVkIGN1cnZlcyBvciBpbnN0YW5jZXMgb2YgQ3VydmVQYXRoIHdpbGwgbm90IGJlIGRlc2VyaWFsaXplZC5cclxuXHRcdHJldHVybiBuZXcgVHViZUdlb21ldHJ5KFxyXG5cdFx0XHRuZXcgQ3VydmVzWyBkYXRhLnBhdGgudHlwZSBdKCkuZnJvbUpTT04oIGRhdGEucGF0aCApLFxyXG5cdFx0XHRkYXRhLnR1YnVsYXJTZWdtZW50cyxcclxuXHRcdFx0ZGF0YS5yYWRpdXMsXHJcblx0XHRcdGRhdGEucmFkaWFsU2VnbWVudHMsXHJcblx0XHRcdGRhdGEuY2xvc2VkXHJcblx0XHQpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgVHViZUdlb21ldHJ5IH07XHJcbiIsImltcG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9CdWZmZXJHZW9tZXRyeS5qcyc7XHJcbmltcG9ydCB7IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5cclxuLyoqXHJcbiAqIENhbiBiZSB1c2VkIGFzIGEgaGVscGVyIG9iamVjdCB0byB2aXN1YWxpemUgYSBnZW9tZXRyeSBhcyBhIHdpcmVmcmFtZS5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgZ2VvbWV0cnkgPSBuZXcgVEhSRUUuU3BoZXJlR2VvbWV0cnkoKTtcclxuICpcclxuICogY29uc3Qgd2lyZWZyYW1lID0gbmV3IFRIUkVFLldpcmVmcmFtZUdlb21ldHJ5KCBnZW9tZXRyeSApO1xyXG4gKlxyXG4gKiBjb25zdCBsaW5lID0gbmV3IFRIUkVFLkxpbmVTZWdtZW50cyggd2lyZWZyYW1lICk7XHJcbiAqIGxpbmUubWF0ZXJpYWwuZGVwdGhXcml0ZSA9IGZhbHNlO1xyXG4gKiBsaW5lLm1hdGVyaWFsLm9wYWNpdHkgPSAwLjI1O1xyXG4gKiBsaW5lLm1hdGVyaWFsLnRyYW5zcGFyZW50ID0gdHJ1ZTtcclxuICpcclxuICogc2NlbmUuYWRkKCBsaW5lICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBOb3RlOiBJdCBpcyBub3QgeWV0IHBvc3NpYmxlIHRvIHNlcmlhbGl6ZS9kZXNlcmlhbGl6ZSBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcy5cclxuICpcclxuICogQGF1Z21lbnRzIEJ1ZmZlckdlb21ldHJ5XHJcbiAqL1xyXG5jbGFzcyBXaXJlZnJhbWVHZW9tZXRyeSBleHRlbmRzIEJ1ZmZlckdlb21ldHJ5IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB3aXJlZnJhbWUgZ2VvbWV0cnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gez9CdWZmZXJHZW9tZXRyeX0gW2dlb21ldHJ5PW51bGxdIC0gVGhlIGdlb21ldHJ5LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBnZW9tZXRyeSA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnV2lyZWZyYW1lR2VvbWV0cnknO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG9sZHMgdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMgdGhhdCBoYXZlIGJlZW5cclxuXHRcdCAqIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGdlb21ldHJ5LiBBbnkgbW9kaWZpY2F0aW9uXHJcblx0XHQgKiBhZnRlciBpbnN0YW50aWF0aW9uIGRvZXMgbm90IGNoYW5nZSB0aGUgZ2VvbWV0cnkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0ge1xyXG5cdFx0XHRnZW9tZXRyeTogZ2VvbWV0cnlcclxuXHRcdH07XHJcblxyXG5cdFx0aWYgKCBnZW9tZXRyeSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdC8vIGJ1ZmZlclxyXG5cclxuXHRcdFx0Y29uc3QgdmVydGljZXMgPSBbXTtcclxuXHRcdFx0Y29uc3QgZWRnZXMgPSBuZXcgU2V0KCk7XHJcblxyXG5cdFx0XHQvLyBoZWxwZXIgdmFyaWFibGVzXHJcblxyXG5cdFx0XHRjb25zdCBzdGFydCA9IG5ldyBWZWN0b3IzKCk7XHJcblx0XHRcdGNvbnN0IGVuZCA9IG5ldyBWZWN0b3IzKCk7XHJcblxyXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmluZGV4ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHQvLyBpbmRleGVkIEJ1ZmZlckdlb21ldHJ5XHJcblxyXG5cdFx0XHRcdGNvbnN0IHBvc2l0aW9uID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjtcclxuXHRcdFx0XHRjb25zdCBpbmRpY2VzID0gZ2VvbWV0cnkuaW5kZXg7XHJcblx0XHRcdFx0bGV0IGdyb3VwcyA9IGdlb21ldHJ5Lmdyb3VwcztcclxuXHJcblx0XHRcdFx0aWYgKCBncm91cHMubGVuZ3RoID09PSAwICkge1xyXG5cclxuXHRcdFx0XHRcdGdyb3VwcyA9IFsgeyBzdGFydDogMCwgY291bnQ6IGluZGljZXMuY291bnQsIG1hdGVyaWFsSW5kZXg6IDAgfSBdO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8vIGNyZWF0ZSBhIGRhdGEgc3RydWN0dXJlIHRoYXQgY29udGFpbnMgYWxsIGVkZ2VzIHdpdGhvdXQgZHVwbGljYXRlc1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgbyA9IDAsIG9sID0gZ3JvdXBzLmxlbmd0aDsgbyA8IG9sOyArKyBvICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGdyb3VwID0gZ3JvdXBzWyBvIF07XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgZ3JvdXBTdGFydCA9IGdyb3VwLnN0YXJ0O1xyXG5cdFx0XHRcdFx0Y29uc3QgZ3JvdXBDb3VudCA9IGdyb3VwLmNvdW50O1xyXG5cclxuXHRcdFx0XHRcdGZvciAoIGxldCBpID0gZ3JvdXBTdGFydCwgbCA9ICggZ3JvdXBTdGFydCArIGdyb3VwQ291bnQgKTsgaSA8IGw7IGkgKz0gMyApIHtcclxuXHJcblx0XHRcdFx0XHRcdGZvciAoIGxldCBqID0gMDsgaiA8IDM7IGogKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGluZGV4MSA9IGluZGljZXMuZ2V0WCggaSArIGogKTtcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBpbmRleDIgPSBpbmRpY2VzLmdldFgoIGkgKyAoIGogKyAxICkgJSAzICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdHN0YXJ0LmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBpbmRleDEgKTtcclxuXHRcdFx0XHRcdFx0XHRlbmQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIGluZGV4MiApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoIGlzVW5pcXVlRWRnZSggc3RhcnQsIGVuZCwgZWRnZXMgKSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCBzdGFydC54LCBzdGFydC55LCBzdGFydC56ICk7XHJcblx0XHRcdFx0XHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCBlbmQueCwgZW5kLnksIGVuZC56ICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdC8vIG5vbi1pbmRleGVkIEJ1ZmZlckdlb21ldHJ5XHJcblxyXG5cdFx0XHRcdGNvbnN0IHBvc2l0aW9uID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gKCBwb3NpdGlvbi5jb3VudCAvIDMgKTsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0Zm9yICggbGV0IGogPSAwOyBqIDwgMzsgaiArKyApIHtcclxuXHJcblx0XHRcdFx0XHRcdC8vIHRocmVlIGVkZ2VzIHBlciB0cmlhbmdsZSwgYW4gZWRnZSBpcyByZXByZXNlbnRlZCBhcyAoaW5kZXgxLCBpbmRleDIpXHJcblx0XHRcdFx0XHRcdC8vIGUuZy4gdGhlIGZpcnN0IHRyaWFuZ2xlIGhhcyB0aGUgZm9sbG93aW5nIGVkZ2VzOiAoMCwxKSwoMSwyKSwoMiwwKVxyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgaW5kZXgxID0gMyAqIGkgKyBqO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBpbmRleDIgPSAzICogaSArICggKCBqICsgMSApICUgMyApO1xyXG5cclxuXHRcdFx0XHRcdFx0c3RhcnQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIGluZGV4MSApO1xyXG5cdFx0XHRcdFx0XHRlbmQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIGluZGV4MiApO1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCBpc1VuaXF1ZUVkZ2UoIHN0YXJ0LCBlbmQsIGVkZ2VzICkgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdHZlcnRpY2VzLnB1c2goIHN0YXJ0LngsIHN0YXJ0LnksIHN0YXJ0LnogKTtcclxuXHRcdFx0XHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCBlbmQueCwgZW5kLnksIGVuZC56ICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBidWlsZCBnZW9tZXRyeVxyXG5cclxuXHRcdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLnBhcmFtZXRlcnMgPSBPYmplY3QuYXNzaWduKCB7fSwgc291cmNlLnBhcmFtZXRlcnMgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gaXNVbmlxdWVFZGdlKCBzdGFydCwgZW5kLCBlZGdlcyApIHtcclxuXHJcblx0Y29uc3QgaGFzaDEgPSBgJHtzdGFydC54fSwke3N0YXJ0Lnl9LCR7c3RhcnQuen0tJHtlbmQueH0sJHtlbmQueX0sJHtlbmQuen1gO1xyXG5cdGNvbnN0IGhhc2gyID0gYCR7ZW5kLnh9LCR7ZW5kLnl9LCR7ZW5kLnp9LSR7c3RhcnQueH0sJHtzdGFydC55fSwke3N0YXJ0Lnp9YDsgLy8gY29pbmNpZGVudCBlZGdlXHJcblxyXG5cdGlmICggZWRnZXMuaGFzKCBoYXNoMSApID09PSB0cnVlIHx8IGVkZ2VzLmhhcyggaGFzaDIgKSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRyZXR1cm4gZmFsc2U7XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0ZWRnZXMuYWRkKCBoYXNoMSApO1xyXG5cdFx0ZWRnZXMuYWRkKCBoYXNoMiApO1xyXG5cdFx0cmV0dXJuIHRydWU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBXaXJlZnJhbWVHZW9tZXRyeSB9O1xyXG4iLCJpbXBvcnQgeyBNYXRlcmlhbCB9IGZyb20gJy4vTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uL21hdGgvQ29sb3IuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgbWF0ZXJpYWwgY2FuIHJlY2VpdmUgc2hhZG93cywgYnV0IG90aGVyd2lzZSBpcyBjb21wbGV0ZWx5IHRyYW5zcGFyZW50LlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBnZW9tZXRyeSA9IG5ldyBUSFJFRS5QbGFuZUdlb21ldHJ5KCAyMDAwLCAyMDAwICk7XHJcbiAqIGdlb21ldHJ5LnJvdGF0ZVgoIC0gTWF0aC5QSSAvIDIgKTtcclxuICpcclxuICogY29uc3QgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuU2hhZG93TWF0ZXJpYWwoKTtcclxuICogbWF0ZXJpYWwub3BhY2l0eSA9IDAuMjtcclxuICpcclxuICogY29uc3QgcGxhbmUgPSBuZXcgVEhSRUUuTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcbiAqIHBsYW5lLnBvc2l0aW9uLnkgPSAtMjAwO1xyXG4gKiBwbGFuZS5yZWNlaXZlU2hhZG93ID0gdHJ1ZTtcclxuICogc2NlbmUuYWRkKCBwbGFuZSApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIE1hdGVyaWFsXHJcbiAqL1xyXG5jbGFzcyBTaGFkb3dNYXRlcmlhbCBleHRlbmRzIE1hdGVyaWFsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBzaGFkb3cgbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtZXRlcnNdIC0gQW4gb2JqZWN0IHdpdGggb25lIG9yIG1vcmUgcHJvcGVydGllc1xyXG5cdCAqIGRlZmluaW5nIHRoZSBtYXRlcmlhbCdzIGFwcGVhcmFuY2UuIEFueSBwcm9wZXJ0eSBvZiB0aGUgbWF0ZXJpYWxcclxuXHQgKiAoaW5jbHVkaW5nIGFueSBwcm9wZXJ0eSBmcm9tIGluaGVyaXRlZCBtYXRlcmlhbHMpIGNhbiBiZSBwYXNzZWRcclxuXHQgKiBpbiBoZXJlLiBDb2xvciB2YWx1ZXMgY2FuIGJlIHBhc3NlZCBhbnkgdHlwZSBvZiB2YWx1ZSBhY2NlcHRlZFxyXG5cdCAqIGJ5IHtAbGluayBDb2xvciNzZXR9LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwYXJhbWV0ZXJzICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzU2hhZG93TWF0ZXJpYWwgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdTaGFkb3dNYXRlcmlhbCc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDb2xvciBvZiB0aGUgbWF0ZXJpYWwuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0NvbG9yfVxyXG5cdFx0ICogQGRlZmF1bHQgKDAsMCwwKVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCAweDAwMDAwMCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogT3ZlcndyaXR0ZW4gc2luY2Ugc2hhZG93IG1hdGVyaWFscyBhcmUgdHJhbnNwYXJlbnRcclxuXHRcdCAqIGJ5IGRlZmF1bHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudHJhbnNwYXJlbnQgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgbWF0ZXJpYWwgaXMgYWZmZWN0ZWQgYnkgZm9nIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5mb2cgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XHJcblxyXG5cdFx0dGhpcy5mb2cgPSBzb3VyY2UuZm9nO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBTaGFkb3dNYXRlcmlhbCB9O1xyXG4iLCJpbXBvcnQgeyBTaGFkZXJNYXRlcmlhbCB9IGZyb20gJy4vU2hhZGVyTWF0ZXJpYWwuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgY2xhc3Mgd29ya3MganVzdCBsaWtlIHtAbGluayBTaGFkZXJNYXRlcmlhbH0sIGV4Y2VwdCB0aGF0IGRlZmluaXRpb25zXHJcbiAqIG9mIGJ1aWx0LWluIHVuaWZvcm1zIGFuZCBhdHRyaWJ1dGVzIGFyZSBub3QgYXV0b21hdGljYWxseSBwcmVwZW5kZWQgdG8gdGhlXHJcbiAqIEdMU0wgc2hhZGVyIGNvZGUuXHJcbiAqXHJcbiAqIGBSYXdTaGFkZXJNYXRlcmlhbGAgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIHtAbGluayBXZWJHTFJlbmRlcmVyfS5cclxuICpcclxuICogQGF1Z21lbnRzIFNoYWRlck1hdGVyaWFsXHJcbiAqL1xyXG5jbGFzcyBSYXdTaGFkZXJNYXRlcmlhbCBleHRlbmRzIFNoYWRlck1hdGVyaWFsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyByYXcgc2hhZGVyIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbWV0ZXJzXSAtIEFuIG9iamVjdCB3aXRoIG9uZSBvciBtb3JlIHByb3BlcnRpZXNcclxuXHQgKiBkZWZpbmluZyB0aGUgbWF0ZXJpYWwncyBhcHBlYXJhbmNlLiBBbnkgcHJvcGVydHkgb2YgdGhlIG1hdGVyaWFsXHJcblx0ICogKGluY2x1ZGluZyBhbnkgcHJvcGVydHkgZnJvbSBpbmhlcml0ZWQgbWF0ZXJpYWxzKSBjYW4gYmUgcGFzc2VkXHJcblx0ICogaW4gaGVyZS4gQ29sb3IgdmFsdWVzIGNhbiBiZSBwYXNzZWQgYW55IHR5cGUgb2YgdmFsdWUgYWNjZXB0ZWRcclxuXHQgKiBieSB7QGxpbmsgQ29sb3Ijc2V0fS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVycyApIHtcclxuXHJcblx0XHRzdXBlciggcGFyYW1ldGVycyApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1Jhd1NoYWRlck1hdGVyaWFsID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnUmF3U2hhZGVyTWF0ZXJpYWwnO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBSYXdTaGFkZXJNYXRlcmlhbCB9O1xyXG4iLCJpbXBvcnQgeyBUYW5nZW50U3BhY2VOb3JtYWxNYXAgfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBNYXRlcmlhbCB9IGZyb20gJy4vTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IyLmpzJztcclxuaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi9tYXRoL0NvbG9yLmpzJztcclxuaW1wb3J0IHsgRXVsZXIgfSBmcm9tICcuLi9tYXRoL0V1bGVyLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIHN0YW5kYXJkIHBoeXNpY2FsbHkgYmFzZWQgbWF0ZXJpYWwsIHVzaW5nIE1ldGFsbGljLVJvdWdobmVzcyB3b3JrZmxvdy5cclxuICpcclxuICogUGh5c2ljYWxseSBiYXNlZCByZW5kZXJpbmcgKFBCUikgaGFzIHJlY2VudGx5IGJlY29tZSB0aGUgc3RhbmRhcmQgaW4gbWFueVxyXG4gKiAzRCBhcHBsaWNhdGlvbnMsIHN1Y2ggYXMgW1VuaXR5XXtAbGluayBodHRwczovL2Jsb2dzLnVuaXR5M2QuY29tLzIwMTQvMTAvMjkvcGh5c2ljYWxseS1iYXNlZC1zaGFkaW5nLWluLXVuaXR5LTUtYS1wcmltZXIvfSxcclxuICogW1VucmVhbF17QGxpbmsgaHR0cHM6Ly9kb2NzLnVucmVhbGVuZ2luZS5jb20vbGF0ZXN0L0lOVC9FbmdpbmUvUmVuZGVyaW5nL01hdGVyaWFscy9QaHlzaWNhbGx5QmFzZWQvfSBhbmRcclxuICogWzNEIFN0dWRpbyBNYXhde0BsaW5rIGh0dHA6Ly9hcmVhLmF1dG9kZXNrLmNvbS9ibG9ncy90aGUtM2RzLW1heC1ibG9nL3doYXQwMzlzLW5ldy1mb3ItcmVuZGVyaW5nLWluLTNkcy1tYXgtMjAxN30uXHJcbiAqXHJcbiAqIFRoaXMgYXBwcm9hY2ggZGlmZmVycyBmcm9tIG9sZGVyIGFwcHJvYWNoZXMgaW4gdGhhdCBpbnN0ZWFkIG9mIHVzaW5nXHJcbiAqIGFwcHJveGltYXRpb25zIGZvciB0aGUgd2F5IGluIHdoaWNoIGxpZ2h0IGludGVyYWN0cyB3aXRoIGEgc3VyZmFjZSwgYVxyXG4gKiBwaHlzaWNhbGx5IGNvcnJlY3QgbW9kZWwgaXMgdXNlZC4gVGhlIGlkZWEgaXMgdGhhdCwgaW5zdGVhZCBvZiB0d2Vha2luZ1xyXG4gKiBtYXRlcmlhbHMgdG8gbG9vayBnb29kIHVuZGVyIHNwZWNpZmljIGxpZ2h0aW5nLCBhIG1hdGVyaWFsIGNhbiBiZSBjcmVhdGVkXHJcbiAqIHRoYXQgd2lsbCByZWFjdCAnY29ycmVjdGx5JyB1bmRlciBhbGwgbGlnaHRpbmcgc2NlbmFyaW9zLlxyXG4gKlxyXG4gKiBJbiBwcmFjdGljZSB0aGlzIGdpdmVzIGEgbW9yZSBhY2N1cmF0ZSBhbmQgcmVhbGlzdGljIGxvb2tpbmcgcmVzdWx0IHRoYW5cclxuICogdGhlIHtAbGluayBNZXNoTGFtYmVydE1hdGVyaWFsfSBvciB7QGxpbmsgTWVzaFBob25nTWF0ZXJpYWx9LCBhdCB0aGUgY29zdCBvZlxyXG4gKiBiZWluZyBzb21ld2hhdCBtb3JlIGNvbXB1dGF0aW9uYWxseSBleHBlbnNpdmUuIGBNZXNoU3RhbmRhcmRNYXRlcmlhbGAgdXNlcyBwZXItZnJhZ21lbnRcclxuICogc2hhZGluZy5cclxuICpcclxuICogTm90ZSB0aGF0IGZvciBiZXN0IHJlc3VsdHMgeW91IHNob3VsZCBhbHdheXMgc3BlY2lmeSBhbiBlbnZpcm9ubWVudCBtYXAgd2hlbiB1c2luZyB0aGlzIG1hdGVyaWFsLlxyXG4gKlxyXG4gKiBGb3IgYSBub24tdGVjaG5pY2FsIGludHJvZHVjdGlvbiB0byB0aGUgY29uY2VwdCBvZiBQQlIgYW5kIGhvdyB0byBzZXQgdXAgYVxyXG4gKiBQQlIgbWF0ZXJpYWwsIGNoZWNrIG91dCB0aGVzZSBhcnRpY2xlcyBieSB0aGUgcGVvcGxlIGF0IFttYXJtb3NldF17QGxpbmsgaHR0cHM6Ly93d3cubWFybW9zZXQuY299OlxyXG4gKlxyXG4gKiAtIFtCYXNpYyBUaGVvcnkgb2YgUGh5c2ljYWxseSBCYXNlZCBSZW5kZXJpbmdde0BsaW5rIGh0dHBzOi8vd3d3Lm1hcm1vc2V0LmNvL3Bvc3RzL2Jhc2ljLXRoZW9yeS1vZi1waHlzaWNhbGx5LWJhc2VkLXJlbmRlcmluZy99XHJcbiAqIC0gW1BoeXNpY2FsbHkgQmFzZWQgUmVuZGVyaW5nIGFuZCBZb3UgQ2FuIFRvb117QGxpbmsgaHR0cHM6Ly93d3cubWFybW9zZXQuY28vcG9zdHMvcGh5c2ljYWxseS1iYXNlZC1yZW5kZXJpbmctYW5kLXlvdS1jYW4tdG9vL31cclxuICpcclxuICogVGVjaG5pY2FsIGRldGFpbHMgb2YgdGhlIGFwcHJvYWNoIHVzZWQgaW4gdGhyZWUuanMgKGFuZCBtb3N0IG90aGVyIFBCUiBzeXN0ZW1zKSBjYW4gYmUgZm91bmQgaXMgdGhpc1xyXG4gKiBbcGFwZXIgZnJvbSBEaXNuZXlde0BsaW5rIGh0dHBzOi8vbWVkaWEuZGlzbmV5YW5pbWF0aW9uLmNvbS91cGxvYWRzL3Byb2R1Y3Rpb24vcHVibGljYXRpb25fYXNzZXQvNDgvYXNzZXQvczIwMTJfcGJzX2Rpc25leV9icmRmX25vdGVzX3YzLnBkZn1cclxuICogKHBkZiksIGJ5IEJyZW50IEJ1cmxleS5cclxuICpcclxuICogQGF1Z21lbnRzIE1hdGVyaWFsXHJcbiAqL1xyXG5jbGFzcyBNZXNoU3RhbmRhcmRNYXRlcmlhbCBleHRlbmRzIE1hdGVyaWFsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBtZXNoIHN0YW5kYXJkIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbWV0ZXJzXSAtIEFuIG9iamVjdCB3aXRoIG9uZSBvciBtb3JlIHByb3BlcnRpZXNcclxuXHQgKiBkZWZpbmluZyB0aGUgbWF0ZXJpYWwncyBhcHBlYXJhbmNlLiBBbnkgcHJvcGVydHkgb2YgdGhlIG1hdGVyaWFsXHJcblx0ICogKGluY2x1ZGluZyBhbnkgcHJvcGVydHkgZnJvbSBpbmhlcml0ZWQgbWF0ZXJpYWxzKSBjYW4gYmUgcGFzc2VkXHJcblx0ICogaW4gaGVyZS4gQ29sb3IgdmFsdWVzIGNhbiBiZSBwYXNzZWQgYW55IHR5cGUgb2YgdmFsdWUgYWNjZXB0ZWRcclxuXHQgKiBieSB7QGxpbmsgQ29sb3Ijc2V0fS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVycyApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc01lc2hTdGFuZGFyZE1hdGVyaWFsID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnTWVzaFN0YW5kYXJkTWF0ZXJpYWwnO1xyXG5cclxuXHRcdHRoaXMuZGVmaW5lcyA9IHsgJ1NUQU5EQVJEJzogJycgfTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENvbG9yIG9mIHRoZSBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Q29sb3J9XHJcblx0XHQgKiBAZGVmYXVsdCAoMSwxLDEpXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7IC8vIGRpZmZ1c2VcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvdyByb3VnaCB0aGUgbWF0ZXJpYWwgYXBwZWFycy4gYDAuMGAgbWVhbnMgYSBzbW9vdGggbWlycm9yIHJlZmxlY3Rpb24sIGAxLjBgXHJcblx0XHQgKiBtZWFucyBmdWxseSBkaWZmdXNlLiBJZiBgcm91Z2huZXNzTWFwYCBpcyBhbHNvIHByb3ZpZGVkLFxyXG5cdFx0ICogYm90aCB2YWx1ZXMgYXJlIG11bHRpcGxpZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yb3VnaG5lc3MgPSAxLjA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3cgbXVjaCB0aGUgbWF0ZXJpYWwgaXMgbGlrZSBhIG1ldGFsLiBOb24tbWV0YWxsaWMgbWF0ZXJpYWxzIHN1Y2ggYXMgd29vZFxyXG5cdFx0ICogb3Igc3RvbmUgdXNlIGAwLjBgLCBtZXRhbGxpYyB1c2UgYDEuMGAsIHdpdGggbm90aGluZyAodXN1YWxseSkgaW4gYmV0d2Vlbi5cclxuXHRcdCAqIEEgdmFsdWUgYmV0d2VlbiBgMC4wYCBhbmQgYDEuMGAgY291bGQgYmUgdXNlZCBmb3IgYSBydXN0eSBtZXRhbCBsb29rLlxyXG5cdFx0ICogSWYgYG1ldGFsbmVzc01hcGAgaXMgYWxzbyBwcm92aWRlZCwgYm90aCB2YWx1ZXMgYXJlIG11bHRpcGxpZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tZXRhbG5lc3MgPSAwLjA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY29sb3IgbWFwLiBNYXkgb3B0aW9uYWxseSBpbmNsdWRlIGFuIGFscGhhIGNoYW5uZWwsIHR5cGljYWxseSBjb21iaW5lZFxyXG5cdFx0ICogd2l0aCB7QGxpbmsgTWF0ZXJpYWwjdHJhbnNwYXJlbnR9IG9yIHtAbGluayBNYXRlcmlhbCNhbHBoYVRlc3R9LiBUaGUgdGV4dHVyZSBtYXBcclxuXHRcdCAqIGNvbG9yIGlzIG1vZHVsYXRlZCBieSB0aGUgZGlmZnVzZSBgY29sb3JgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGxpZ2h0IG1hcC4gUmVxdWlyZXMgYSBzZWNvbmQgc2V0IG9mIFVWcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGlnaHRNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSW50ZW5zaXR5IG9mIHRoZSBiYWtlZCBsaWdodC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gMS4wO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJlZCBjaGFubmVsIG9mIHRoaXMgdGV4dHVyZSBpcyB1c2VkIGFzIHRoZSBhbWJpZW50IG9jY2x1c2lvbiBtYXAuXHJcblx0XHQgKiBSZXF1aXJlcyBhIHNlY29uZCBzZXQgb2YgVVZzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hb01hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBJbnRlbnNpdHkgb2YgdGhlIGFtYmllbnQgb2NjbHVzaW9uIGVmZmVjdC4gUmFuZ2UgaXMgYFswLDFdYCwgd2hlcmUgYDBgXHJcblx0XHQgKiBkaXNhYmxlcyBhbWJpZW50IG9jY2x1c2lvbi4gV2hlcmUgaW50ZW5zaXR5IGlzIGAxYCBhbmQgdGhlIEFPIG1hcCdzXHJcblx0XHQgKiByZWQgY2hhbm5lbCBpcyBhbHNvIGAxYCwgYW1iaWVudCBsaWdodCBpcyBmdWxseSBvY2NsdWRlZCBvbiBhIHN1cmZhY2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hb01hcEludGVuc2l0eSA9IDEuMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEVtaXNzaXZlIChsaWdodCkgY29sb3Igb2YgdGhlIG1hdGVyaWFsLCBlc3NlbnRpYWxseSBhIHNvbGlkIGNvbG9yXHJcblx0XHQgKiB1bmFmZmVjdGVkIGJ5IG90aGVyIGxpZ2h0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtDb2xvcn1cclxuXHRcdCAqIEBkZWZhdWx0ICgwLDAsMClcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5lbWlzc2l2ZSA9IG5ldyBDb2xvciggMHgwMDAwMDAgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEludGVuc2l0eSBvZiB0aGUgZW1pc3NpdmUgbGlnaHQuIE1vZHVsYXRlcyB0aGUgZW1pc3NpdmUgY29sb3IuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IDEuMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNldCBlbWlzc2l2ZSAoZ2xvdykgbWFwLiBUaGUgZW1pc3NpdmUgbWFwIGNvbG9yIGlzIG1vZHVsYXRlZCBieSB0aGVcclxuXHRcdCAqIGVtaXNzaXZlIGNvbG9yIGFuZCB0aGUgZW1pc3NpdmUgaW50ZW5zaXR5LiBJZiB5b3UgaGF2ZSBhbiBlbWlzc2l2ZSBtYXAsXHJcblx0XHQgKiBiZSBzdXJlIHRvIHNldCB0aGUgZW1pc3NpdmUgY29sb3IgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gYmxhY2suXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmVtaXNzaXZlTWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB0ZXh0dXJlIHRvIGNyZWF0ZSBhIGJ1bXAgbWFwLiBUaGUgYmxhY2sgYW5kIHdoaXRlIHZhbHVlcyBtYXAgdG8gdGhlXHJcblx0XHQgKiBwZXJjZWl2ZWQgZGVwdGggaW4gcmVsYXRpb24gdG8gdGhlIGxpZ2h0cy4gQnVtcCBkb2Vzbid0IGFjdHVhbGx5IGFmZmVjdFxyXG5cdFx0ICogdGhlIGdlb21ldHJ5IG9mIHRoZSBvYmplY3QsIG9ubHkgdGhlIGxpZ2h0aW5nLiBJZiBhIG5vcm1hbCBtYXAgaXMgZGVmaW5lZFxyXG5cdFx0ICogdGhpcyB3aWxsIGJlIGlnbm9yZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJ1bXBNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG93IG11Y2ggdGhlIGJ1bXAgbWFwIGFmZmVjdHMgdGhlIG1hdGVyaWFsLiBUeXBpY2FsIHJhbmdlIGlzIGBbMCwxXWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5idW1wU2NhbGUgPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHRleHR1cmUgdG8gY3JlYXRlIGEgbm9ybWFsIG1hcC4gVGhlIFJHQiB2YWx1ZXMgYWZmZWN0IHRoZSBzdXJmYWNlXHJcblx0XHQgKiBub3JtYWwgZm9yIGVhY2ggcGl4ZWwgZnJhZ21lbnQgYW5kIGNoYW5nZSB0aGUgd2F5IHRoZSBjb2xvciBpcyBsaXQuIE5vcm1hbFxyXG5cdFx0ICogbWFwcyBkbyBub3QgY2hhbmdlIHRoZSBhY3R1YWwgc2hhcGUgb2YgdGhlIHN1cmZhY2UsIG9ubHkgdGhlIGxpZ2h0aW5nLiBJblxyXG5cdFx0ICogY2FzZSB0aGUgbWF0ZXJpYWwgaGFzIGEgbm9ybWFsIG1hcCBhdXRob3JlZCB1c2luZyB0aGUgbGVmdCBoYW5kZWRcclxuXHRcdCAqIGNvbnZlbnRpb24sIHRoZSBgeWAgY29tcG9uZW50IG9mIGBub3JtYWxTY2FsZWAgc2hvdWxkIGJlIG5lZ2F0ZWQgdG8gY29tcGVuc2F0ZVxyXG5cdFx0ICogZm9yIHRoZSBkaWZmZXJlbnQgaGFuZGVkbmVzcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9ybWFsTWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB0eXBlIG9mIG5vcm1hbCBtYXAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeyhUYW5nZW50U3BhY2VOb3JtYWxNYXB8T2JqZWN0U3BhY2VOb3JtYWxNYXApfVxyXG5cdFx0ICogQGRlZmF1bHQgVGFuZ2VudFNwYWNlTm9ybWFsTWFwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9ybWFsTWFwVHlwZSA9IFRhbmdlbnRTcGFjZU5vcm1hbE1hcDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvdyBtdWNoIHRoZSBub3JtYWwgbWFwIGFmZmVjdHMgdGhlIG1hdGVyaWFsLiBUeXBpY2FsIHZhbHVlIHJhbmdlIGlzIGBbMCwxXWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjJ9XHJcblx0XHQgKiBAZGVmYXVsdCAoMSwxKVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vcm1hbFNjYWxlID0gbmV3IFZlY3RvcjIoIDEsIDEgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBkaXNwbGFjZW1lbnQgbWFwIGFmZmVjdHMgdGhlIHBvc2l0aW9uIG9mIHRoZSBtZXNoJ3MgdmVydGljZXMuIFVubGlrZVxyXG5cdFx0ICogb3RoZXIgbWFwcyB3aGljaCBvbmx5IGFmZmVjdCB0aGUgbGlnaHQgYW5kIHNoYWRlIG9mIHRoZSBtYXRlcmlhbCB0aGVcclxuXHRcdCAqIGRpc3BsYWNlZCB2ZXJ0aWNlcyBjYW4gY2FzdCBzaGFkb3dzLCBibG9jayBvdGhlciBvYmplY3RzLCBhbmQgb3RoZXJ3aXNlXHJcblx0XHQgKiBhY3QgYXMgcmVhbCBnZW9tZXRyeS4gVGhlIGRpc3BsYWNlbWVudCB0ZXh0dXJlIGlzIGFuIGltYWdlIHdoZXJlIHRoZSB2YWx1ZVxyXG5cdFx0ICogb2YgZWFjaCBwaXhlbCAod2hpdGUgYmVpbmcgdGhlIGhpZ2hlc3QpIGlzIG1hcHBlZCBhZ2FpbnN0LCBhbmRcclxuXHRcdCAqIHJlcG9zaXRpb25zLCB0aGUgdmVydGljZXMgb2YgdGhlIG1lc2guXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3cgbXVjaCB0aGUgZGlzcGxhY2VtZW50IG1hcCBhZmZlY3RzIHRoZSBtZXNoICh3aGVyZSBibGFjayBpcyBub1xyXG5cdFx0ICogZGlzcGxhY2VtZW50LCBhbmQgd2hpdGUgaXMgbWF4aW11bSBkaXNwbGFjZW1lbnQpLiBXaXRob3V0IGEgZGlzcGxhY2VtZW50XHJcblx0XHQgKiBtYXAgc2V0LCB0aGlzIHZhbHVlIGlzIG5vdCBhcHBsaWVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG9mZnNldCBvZiB0aGUgZGlzcGxhY2VtZW50IG1hcCdzIHZhbHVlcyBvbiB0aGUgbWVzaCdzIHZlcnRpY2VzLlxyXG5cdFx0ICogVGhlIGJpYXMgaXMgYWRkZWQgdG8gdGhlIHNjYWxlZCBzYW1wbGUgb2YgdGhlIGRpc3BsYWNlbWVudCBtYXAuXHJcblx0XHQgKiBXaXRob3V0IGEgZGlzcGxhY2VtZW50IG1hcCBzZXQsIHRoaXMgdmFsdWUgaXMgbm90IGFwcGxpZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBncmVlbiBjaGFubmVsIG9mIHRoaXMgdGV4dHVyZSBpcyB1c2VkIHRvIGFsdGVyIHRoZSByb3VnaG5lc3Mgb2YgdGhlXHJcblx0XHQgKiBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucm91Z2huZXNzTWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBibHVlIGNoYW5uZWwgb2YgdGhpcyB0ZXh0dXJlIGlzIHVzZWQgdG8gYWx0ZXIgdGhlIG1ldGFsbmVzcyBvZiB0aGVcclxuXHRcdCAqIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tZXRhbG5lc3NNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGFscGhhIG1hcCBpcyBhIGdyYXlzY2FsZSB0ZXh0dXJlIHRoYXQgY29udHJvbHMgdGhlIG9wYWNpdHkgYWNyb3NzIHRoZVxyXG5cdFx0ICogc3VyZmFjZSAoYmxhY2s6IGZ1bGx5IHRyYW5zcGFyZW50OyB3aGl0ZTogZnVsbHkgb3BhcXVlKS5cclxuXHRcdCAqXHJcblx0XHQgKiBPbmx5IHRoZSBjb2xvciBvZiB0aGUgdGV4dHVyZSBpcyB1c2VkLCBpZ25vcmluZyB0aGUgYWxwaGEgY2hhbm5lbCBpZiBvbmVcclxuXHRcdCAqIGV4aXN0cy4gRm9yIFJHQiBhbmQgUkdCQSB0ZXh0dXJlcywgdGhlIHJlbmRlcmVyIHdpbGwgdXNlIHRoZSBncmVlbiBjaGFubmVsXHJcblx0XHQgKiB3aGVuIHNhbXBsaW5nIHRoaXMgdGV4dHVyZSBkdWUgdG8gdGhlIGV4dHJhIGJpdCBvZiBwcmVjaXNpb24gcHJvdmlkZWQgZm9yXHJcblx0XHQgKiBncmVlbiBpbiBEWFQtY29tcHJlc3NlZCBhbmQgdW5jb21wcmVzc2VkIFJHQiA1NjUgZm9ybWF0cy4gTHVtaW5hbmNlLW9ubHkgYW5kXHJcblx0XHQgKiBsdW1pbmFuY2UvYWxwaGEgdGV4dHVyZXMgd2lsbCBhbHNvIHN0aWxsIHdvcmsgYXMgZXhwZWN0ZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFscGhhTWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBlbnZpcm9ubWVudCBtYXAuIFRvIGVuc3VyZSBhIHBoeXNpY2FsbHkgY29ycmVjdCByZW5kZXJpbmcsIGVudmlyb25tZW50IG1hcHNcclxuXHRcdCAqIGFyZSBpbnRlcm5hbGx5IHByZS1wcm9jZXNzZWQgd2l0aCB7QGxpbmsgUE1SRU1HZW5lcmF0b3J9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5lbnZNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJvdGF0aW9uIG9mIHRoZSBlbnZpcm9ubWVudCBtYXAgaW4gcmFkaWFucy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7RXVsZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAoMCwwLDApXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZW52TWFwUm90YXRpb24gPSBuZXcgRXVsZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNjYWxlcyB0aGUgZWZmZWN0IG9mIHRoZSBlbnZpcm9ubWVudCBtYXAgYnkgbXVsdGlwbHlpbmcgaXRzIGNvbG9yLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZW52TWFwSW50ZW5zaXR5ID0gMS4wO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVuZGVycyB0aGUgZ2VvbWV0cnkgYXMgYSB3aXJlZnJhbWUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLndpcmVmcmFtZSA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQ29udHJvbHMgdGhlIHRoaWNrbmVzcyBvZiB0aGUgd2lyZWZyYW1lLlxyXG5cdFx0ICpcclxuXHRcdCAqIENhbiBvbmx5IGJlIHVzZWQgd2l0aCB7QGxpbmsgU1ZHUmVuZGVyZXJ9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgYXBwZWFyYW5jZSBvZiB3aXJlZnJhbWUgZW5kcy5cclxuXHRcdCAqXHJcblx0XHQgKiBDYW4gb25seSBiZSB1c2VkIHdpdGgge0BsaW5rIFNWR1JlbmRlcmVyfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KCdyb3VuZCd8J2JldmVsJ3wnbWl0ZXInKX1cclxuXHRcdCAqIEBkZWZhdWx0ICdyb3VuZCdcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy53aXJlZnJhbWVMaW5lY2FwID0gJ3JvdW5kJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgYXBwZWFyYW5jZSBvZiB3aXJlZnJhbWUgam9pbnRzLlxyXG5cdFx0ICpcclxuXHRcdCAqIENhbiBvbmx5IGJlIHVzZWQgd2l0aCB7QGxpbmsgU1ZHUmVuZGVyZXJ9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoJ3JvdW5kJ3wnYmV2ZWwnfCdtaXRlcicpfVxyXG5cdFx0ICogQGRlZmF1bHQgJ3JvdW5kJ1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gJ3JvdW5kJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIG1hdGVyaWFsIGlzIHJlbmRlcmVkIHdpdGggZmxhdCBzaGFkaW5nIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZmxhdFNoYWRpbmcgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIG1hdGVyaWFsIGlzIGFmZmVjdGVkIGJ5IGZvZyBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZm9nID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLmRlZmluZXMgPSB7ICdTVEFOREFSRCc6ICcnIH07XHJcblxyXG5cdFx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcclxuXHRcdHRoaXMucm91Z2huZXNzID0gc291cmNlLnJvdWdobmVzcztcclxuXHRcdHRoaXMubWV0YWxuZXNzID0gc291cmNlLm1ldGFsbmVzcztcclxuXHJcblx0XHR0aGlzLm1hcCA9IHNvdXJjZS5tYXA7XHJcblxyXG5cdFx0dGhpcy5saWdodE1hcCA9IHNvdXJjZS5saWdodE1hcDtcclxuXHRcdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSBzb3VyY2UubGlnaHRNYXBJbnRlbnNpdHk7XHJcblxyXG5cdFx0dGhpcy5hb01hcCA9IHNvdXJjZS5hb01hcDtcclxuXHRcdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSBzb3VyY2UuYW9NYXBJbnRlbnNpdHk7XHJcblxyXG5cdFx0dGhpcy5lbWlzc2l2ZS5jb3B5KCBzb3VyY2UuZW1pc3NpdmUgKTtcclxuXHRcdHRoaXMuZW1pc3NpdmVNYXAgPSBzb3VyY2UuZW1pc3NpdmVNYXA7XHJcblx0XHR0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ID0gc291cmNlLmVtaXNzaXZlSW50ZW5zaXR5O1xyXG5cclxuXHRcdHRoaXMuYnVtcE1hcCA9IHNvdXJjZS5idW1wTWFwO1xyXG5cdFx0dGhpcy5idW1wU2NhbGUgPSBzb3VyY2UuYnVtcFNjYWxlO1xyXG5cclxuXHRcdHRoaXMubm9ybWFsTWFwID0gc291cmNlLm5vcm1hbE1hcDtcclxuXHRcdHRoaXMubm9ybWFsTWFwVHlwZSA9IHNvdXJjZS5ub3JtYWxNYXBUeXBlO1xyXG5cdFx0dGhpcy5ub3JtYWxTY2FsZS5jb3B5KCBzb3VyY2Uubm9ybWFsU2NhbGUgKTtcclxuXHJcblx0XHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IHNvdXJjZS5kaXNwbGFjZW1lbnRNYXA7XHJcblx0XHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gc291cmNlLmRpc3BsYWNlbWVudFNjYWxlO1xyXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gc291cmNlLmRpc3BsYWNlbWVudEJpYXM7XHJcblxyXG5cdFx0dGhpcy5yb3VnaG5lc3NNYXAgPSBzb3VyY2Uucm91Z2huZXNzTWFwO1xyXG5cclxuXHRcdHRoaXMubWV0YWxuZXNzTWFwID0gc291cmNlLm1ldGFsbmVzc01hcDtcclxuXHJcblx0XHR0aGlzLmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwO1xyXG5cclxuXHRcdHRoaXMuZW52TWFwID0gc291cmNlLmVudk1hcDtcclxuXHRcdHRoaXMuZW52TWFwUm90YXRpb24uY29weSggc291cmNlLmVudk1hcFJvdGF0aW9uICk7XHJcblx0XHR0aGlzLmVudk1hcEludGVuc2l0eSA9IHNvdXJjZS5lbnZNYXBJbnRlbnNpdHk7XHJcblxyXG5cdFx0dGhpcy53aXJlZnJhbWUgPSBzb3VyY2Uud2lyZWZyYW1lO1xyXG5cdFx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoO1xyXG5cdFx0dGhpcy53aXJlZnJhbWVMaW5lY2FwID0gc291cmNlLndpcmVmcmFtZUxpbmVjYXA7XHJcblx0XHR0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gc291cmNlLndpcmVmcmFtZUxpbmVqb2luO1xyXG5cclxuXHRcdHRoaXMuZmxhdFNoYWRpbmcgPSBzb3VyY2UuZmxhdFNoYWRpbmc7XHJcblxyXG5cdFx0dGhpcy5mb2cgPSBzb3VyY2UuZm9nO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBNZXNoU3RhbmRhcmRNYXRlcmlhbCB9O1xyXG4iLCJpbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IyLmpzJztcclxuaW1wb3J0IHsgTWVzaFN0YW5kYXJkTWF0ZXJpYWwgfSBmcm9tICcuL01lc2hTdGFuZGFyZE1hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi9tYXRoL0NvbG9yLmpzJztcclxuaW1wb3J0IHsgY2xhbXAgfSBmcm9tICcuLi9tYXRoL01hdGhVdGlscy5qcyc7XHJcblxyXG4vKipcclxuICogQW4gZXh0ZW5zaW9uIG9mIHRoZSB7QGxpbmsgTWVzaFN0YW5kYXJkTWF0ZXJpYWx9LCBwcm92aWRpbmcgbW9yZSBhZHZhbmNlZFxyXG4gKiBwaHlzaWNhbGx5LWJhc2VkIHJlbmRlcmluZyBwcm9wZXJ0aWVzOlxyXG4gKlxyXG4gKiAtIEFuaXNvdHJvcHk6IEFiaWxpdHkgdG8gcmVwcmVzZW50IHRoZSBhbmlzb3Ryb3BpYyBwcm9wZXJ0eSBvZiBtYXRlcmlhbHNcclxuICogYXMgb2JzZXJ2YWJsZSB3aXRoIGJydXNoZWQgbWV0YWxzLlxyXG4gKiAtIENsZWFyY29hdDogU29tZSBtYXRlcmlhbHMg4oCUIGxpa2UgY2FyIHBhaW50cywgY2FyYm9uIGZpYmVyLCBhbmQgd2V0IHN1cmZhY2VzIOKAlCByZXF1aXJlXHJcbiAqIGEgY2xlYXIsIHJlZmxlY3RpdmUgbGF5ZXIgb24gdG9wIG9mIGFub3RoZXIgbGF5ZXIgdGhhdCBtYXkgYmUgaXJyZWd1bGFyIG9yIHJvdWdoLlxyXG4gKiBDbGVhcmNvYXQgYXBwcm94aW1hdGVzIHRoaXMgZWZmZWN0LCB3aXRob3V0IHRoZSBuZWVkIGZvciBhIHNlcGFyYXRlIHRyYW5zcGFyZW50IHN1cmZhY2UuXHJcbiAqIC0gSXJpZGVzY2VuY2U6IEFsbG93cyB0byByZW5kZXIgdGhlIGVmZmVjdCB3aGVyZSBodWUgdmFyaWVzICBkZXBlbmRpbmcgb24gdGhlIHZpZXdpbmdcclxuICogYW5nbGUgYW5kIGlsbHVtaW5hdGlvbiBhbmdsZS4gVGhpcyBjYW4gYmUgc2VlbiBvbiBzb2FwIGJ1YmJsZXMsIG9pbCBmaWxtcywgb3Igb24gdGhlXHJcbiAqIHdpbmdzIG9mIG1hbnkgaW5zZWN0cy5cclxuICogLSBQaHlzaWNhbGx5LWJhc2VkIHRyYW5zcGFyZW5jeTogT25lIGxpbWl0YXRpb24gb2Yge0BsaW5rIE1hdGVyaWFsI29wYWNpdHl9IGlzIHRoYXQgaGlnaGx5XHJcbiAqIHRyYW5zcGFyZW50IG1hdGVyaWFscyBhcmUgbGVzcyByZWZsZWN0aXZlLiBQaHlzaWNhbGx5LWJhc2VkIHRyYW5zbWlzc2lvbiBwcm92aWRlcyBhIG1vcmVcclxuICogcmVhbGlzdGljIG9wdGlvbiBmb3IgdGhpbiwgdHJhbnNwYXJlbnQgc3VyZmFjZXMgbGlrZSBnbGFzcy5cclxuICogLSBBZHZhbmNlZCByZWZsZWN0aXZpdHk6IE1vcmUgZmxleGlibGUgcmVmbGVjdGl2aXR5IGZvciBub24tbWV0YWxsaWMgbWF0ZXJpYWxzLlxyXG4gKiAtIFNoZWVuOiBDYW4gYmUgdXNlZCBmb3IgcmVwcmVzZW50aW5nIGNsb3RoIGFuZCBmYWJyaWMgbWF0ZXJpYWxzLlxyXG4gKlxyXG4gKiBBcyBhIHJlc3VsdCBvZiB0aGVzZSBjb21wbGV4IHNoYWRpbmcgZmVhdHVyZXMsIGBNZXNoUGh5c2ljYWxNYXRlcmlhbGAgaGFzIGFcclxuICogaGlnaGVyIHBlcmZvcm1hbmNlIGNvc3QsIHBlciBwaXhlbCwgdGhhbiBvdGhlciB0aHJlZS5qcyBtYXRlcmlhbHMuIE1vc3RcclxuICogZWZmZWN0cyBhcmUgZGlzYWJsZWQgYnkgZGVmYXVsdCwgYW5kIGFkZCBjb3N0IGFzIHRoZXkgYXJlIGVuYWJsZWQuIEZvclxyXG4gKiBiZXN0IHJlc3VsdHMsIGFsd2F5cyBzcGVjaWZ5IGFuIGVudmlyb25tZW50IG1hcCB3aGVuIHVzaW5nIHRoaXMgbWF0ZXJpYWwuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBNZXNoU3RhbmRhcmRNYXRlcmlhbFxyXG4gKi9cclxuY2xhc3MgTWVzaFBoeXNpY2FsTWF0ZXJpYWwgZXh0ZW5kcyBNZXNoU3RhbmRhcmRNYXRlcmlhbCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbWVzaCBwaHlzaWNhbCBtYXRlcmlhbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1ldGVyc10gLSBBbiBvYmplY3Qgd2l0aCBvbmUgb3IgbW9yZSBwcm9wZXJ0aWVzXHJcblx0ICogZGVmaW5pbmcgdGhlIG1hdGVyaWFsJ3MgYXBwZWFyYW5jZS4gQW55IHByb3BlcnR5IG9mIHRoZSBtYXRlcmlhbFxyXG5cdCAqIChpbmNsdWRpbmcgYW55IHByb3BlcnR5IGZyb20gaW5oZXJpdGVkIG1hdGVyaWFscykgY2FuIGJlIHBhc3NlZFxyXG5cdCAqIGluIGhlcmUuIENvbG9yIHZhbHVlcyBjYW4gYmUgcGFzc2VkIGFueSB0eXBlIG9mIHZhbHVlIGFjY2VwdGVkXHJcblx0ICogYnkge0BsaW5rIENvbG9yI3NldH0uXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHBhcmFtZXRlcnMgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNNZXNoUGh5c2ljYWxNYXRlcmlhbCA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy5kZWZpbmVzID0ge1xyXG5cclxuXHRcdFx0J1NUQU5EQVJEJzogJycsXHJcblx0XHRcdCdQSFlTSUNBTCc6ICcnXHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnTWVzaFBoeXNpY2FsTWF0ZXJpYWwnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJvdGF0aW9uIG9mIHRoZSBhbmlzb3Ryb3B5IGluIHRhbmdlbnQsIGJpdGFuZ2VudCBzcGFjZSwgbWVhc3VyZWQgaW4gcmFkaWFuc1xyXG5cdFx0ICogY291bnRlci1jbG9ja3dpc2UgZnJvbSB0aGUgdGFuZ2VudC4gV2hlbiBgYW5pc290cm9weU1hcGAgaXMgcHJlc2VudCwgdGhpc1xyXG5cdFx0ICogcHJvcGVydHkgcHJvdmlkZXMgYWRkaXRpb25hbCByb3RhdGlvbiB0byB0aGUgdmVjdG9ycyBpbiB0aGUgdGV4dHVyZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFuaXNvdHJvcHlSb3RhdGlvbiA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZWQgYW5kIGdyZWVuIGNoYW5uZWxzIHJlcHJlc2VudCB0aGUgYW5pc290cm9weSBkaXJlY3Rpb24gaW4gYFstMSwgMV1gIHRhbmdlbnQsXHJcblx0XHQgKiBiaXRhbmdlbnQgc3BhY2UsIHRvIGJlIHJvdGF0ZWQgYnkgYGFuaXNvdHJvcHlSb3RhdGlvbmAuIFRoZSBibHVlIGNoYW5uZWxcclxuXHRcdCAqIGNvbnRhaW5zIHN0cmVuZ3RoIGFzIGBbMCwgMV1gIHRvIGJlIG11bHRpcGxpZWQgYnkgYGFuaXNvdHJvcHlgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hbmlzb3Ryb3B5TWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByZWQgY2hhbm5lbCBvZiB0aGlzIHRleHR1cmUgaXMgbXVsdGlwbGllZCBhZ2FpbnN0IGBjbGVhcmNvYXRgLFxyXG5cdFx0ICogZm9yIHBlci1waXhlbCBjb250cm9sIG92ZXIgYSBjb2F0aW5nJ3MgaW50ZW5zaXR5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jbGVhcmNvYXRNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUm91Z2huZXNzIG9mIHRoZSBjbGVhciBjb2F0IGxheWVyLCBmcm9tIGAwLjBgIHRvIGAxLjBgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2xlYXJjb2F0Um91Z2huZXNzID0gMC4wO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGdyZWVuIGNoYW5uZWwgb2YgdGhpcyB0ZXh0dXJlIGlzIG11bHRpcGxpZWQgYWdhaW5zdFxyXG5cdFx0ICogYGNsZWFyY29hdFJvdWdobmVzc2AsIGZvciBwZXItcGl4ZWwgY29udHJvbCBvdmVyIGEgY29hdGluZydzIHJvdWdobmVzcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2xlYXJjb2F0Um91Z2huZXNzTWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvdyBtdWNoIGBjbGVhcmNvYXROb3JtYWxNYXBgIGFmZmVjdHMgdGhlIGNsZWFyIGNvYXQgbGF5ZXIsIGZyb21cclxuXHRcdCAqIGAoMCwwKWAgdG8gYCgxLDEpYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yMn1cclxuXHRcdCAqIEBkZWZhdWx0ICgxLDEpXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2xlYXJjb2F0Tm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMiggMSwgMSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQ2FuIGJlIHVzZWQgdG8gZW5hYmxlIGluZGVwZW5kZW50IG5vcm1hbHMgZm9yIHRoZSBjbGVhciBjb2F0IGxheWVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jbGVhcmNvYXROb3JtYWxNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSW5kZXgtb2YtcmVmcmFjdGlvbiBmb3Igbm9uLW1ldGFsbGljIG1hdGVyaWFscywgZnJvbSBgMS4wYCB0byBgMi4zMzNgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxLjVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pb3IgPSAxLjU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWdyZWUgb2YgcmVmbGVjdGl2aXR5LCBmcm9tIGAwLjBgIHRvIGAxLjBgLiBEZWZhdWx0IGlzIGAwLjVgLCB3aGljaFxyXG5cdFx0ICogY29ycmVzcG9uZHMgdG8gYW4gaW5kZXgtb2YtcmVmcmFjdGlvbiBvZiBgMS41YC5cclxuXHRcdCAqXHJcblx0XHQgKiBUaGlzIG1vZGVscyB0aGUgcmVmbGVjdGl2aXR5IG9mIG5vbi1tZXRhbGxpYyBtYXRlcmlhbHMuIEl0IGhhcyBubyBlZmZlY3RcclxuXHRcdCAqIHdoZW4gYG1ldGFsbmVzc2AgaXMgYDEuMGBcclxuXHRcdCAqXHJcblx0XHQgKiBAbmFtZSBNZXNoUGh5c2ljYWxNYXRlcmlhbCNyZWZsZWN0aXZpdHlcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwLjVcclxuXHRcdCAqL1xyXG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCAncmVmbGVjdGl2aXR5Jywge1xyXG5cdFx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcclxuXHJcblx0XHRcdFx0cmV0dXJuICggY2xhbXAoIDIuNSAqICggdGhpcy5pb3IgLSAxICkgLyAoIHRoaXMuaW9yICsgMSApLCAwLCAxICkgKTtcclxuXHJcblx0XHRcdH0sXHJcblx0XHRcdHNldDogZnVuY3Rpb24gKCByZWZsZWN0aXZpdHkgKSB7XHJcblxyXG5cdFx0XHRcdHRoaXMuaW9yID0gKCAxICsgMC40ICogcmVmbGVjdGl2aXR5ICkgLyAoIDEgLSAwLjQgKiByZWZsZWN0aXZpdHkgKTtcclxuXHJcblx0XHRcdH1cclxuXHRcdH0gKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByZWQgY2hhbm5lbCBvZiB0aGlzIHRleHR1cmUgaXMgbXVsdGlwbGllZCBhZ2FpbnN0IGBpcmlkZXNjZW5jZWAsIGZvciBwZXItcGl4ZWxcclxuXHRcdCAqIGNvbnRyb2wgb3ZlciBpcmlkZXNjZW5jZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXJpZGVzY2VuY2VNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU3RyZW5ndGggb2YgdGhlIGlyaWRlc2NlbmNlIFJHQiBjb2xvciBzaGlmdCBlZmZlY3QsIHJlcHJlc2VudGVkIGJ5IGFuIGluZGV4LW9mLXJlZnJhY3Rpb24uXHJcblx0XHQgKiBCZXR3ZWVuIGAxLjBgIHRvIGAyLjMzM2AuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDEuM1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlyaWRlc2NlbmNlSU9SID0gMS4zO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICpBcnJheSBvZiBleGFjdGx5IDIgZWxlbWVudHMsIHNwZWNpZnlpbmcgbWluaW11bSBhbmQgbWF4aW11bSB0aGlja25lc3Mgb2YgdGhlIGlyaWRlc2NlbmNlIGxheWVyLlxyXG5cdFx0IFRoaWNrbmVzcyBvZiBpcmlkZXNjZW5jZSBsYXllciBoYXMgYW4gZXF1aXZhbGVudCBlZmZlY3Qgb2YgdGhlIG9uZSBgdGhpY2tuZXNzYCBoYXMgb24gYGlvcmAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PG51bWJlcixudW1iZXI+fVxyXG5cdFx0ICogQGRlZmF1bHQgWzEwMCw0MDBdXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZSA9IFsgMTAwLCA0MDAgXTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgdGV4dHVyZSB0aGF0IGRlZmluZXMgdGhlIHRoaWNrbmVzcyBvZiB0aGUgaXJpZGVzY2VuY2UgbGF5ZXIsIHN0b3JlZCBpbiB0aGUgZ3JlZW4gY2hhbm5lbC5cclxuXHRcdCAqIE1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzIG9mIHRoaWNrbmVzcyBhcmUgZGVmaW5lZCBieSBgaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZWAgYXJyYXk6XHJcblx0XHQgKiAtIGAwLjBgIGluIHRoZSBncmVlbiBjaGFubmVsIHdpbGwgcmVzdWx0IGluIHRoaWNrbmVzcyBlcXVhbCB0byBmaXJzdCBlbGVtZW50IG9mIHRoZSBhcnJheS5cclxuXHRcdCAqIC0gYDEuMGAgaW4gdGhlIGdyZWVuIGNoYW5uZWwgd2lsbCByZXN1bHQgaW4gdGhpY2tuZXNzIGVxdWFsIHRvIHNlY29uZCBlbGVtZW50IG9mIHRoZSBhcnJheS5cclxuXHRcdCAqIC0gVmFsdWVzIGluLWJldHdlZW4gd2lsbCBsaW5lYXJseSBpbnRlcnBvbGF0ZSBiZXR3ZWVuIHRoZSBlbGVtZW50cyBvZiB0aGUgYXJyYXkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBzaGVlbiB0aW50LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtDb2xvcn1cclxuXHRcdCAqIEBkZWZhdWx0ICgwLDAsMClcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zaGVlbkNvbG9yID0gbmV3IENvbG9yKCAweDAwMDAwMCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIFJHQiBjaGFubmVscyBvZiB0aGlzIHRleHR1cmUgYXJlIG11bHRpcGxpZWQgYWdhaW5zdCAgYHNoZWVuQ29sb3JgLCBmb3IgcGVyLXBpeGVsIGNvbnRyb2xcclxuXHRcdCAqIG92ZXIgc2hlZW4gdGludC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2hlZW5Db2xvck1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSb3VnaG5lc3Mgb2YgdGhlIHNoZWVuIGxheWVyLCBmcm9tIGAwLjBgIHRvIGAxLjBgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2hlZW5Sb3VnaG5lc3MgPSAxLjA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYWxwaGEgY2hhbm5lbCBvZiB0aGlzIHRleHR1cmUgaXMgbXVsdGlwbGllZCBhZ2FpbnN0IGBzaGVlblJvdWdobmVzc2AsIGZvciBwZXItcGl4ZWwgY29udHJvbFxyXG5cdFx0ICogb3ZlciBzaGVlbiByb3VnaG5lc3MuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNoZWVuUm91Z2huZXNzTWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByZWQgY2hhbm5lbCBvZiB0aGlzIHRleHR1cmUgaXMgbXVsdGlwbGllZCBhZ2FpbnN0IGB0cmFuc21pc3Npb25gLCBmb3IgcGVyLXBpeGVsIGNvbnRyb2wgb3ZlclxyXG5cdFx0ICogb3B0aWNhbCB0cmFuc3BhcmVuY3kuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRyYW5zbWlzc2lvbk1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdGhpY2tuZXNzIG9mIHRoZSB2b2x1bWUgYmVuZWF0aCB0aGUgc3VyZmFjZS4gVGhlIHZhbHVlIGlzIGdpdmVuIGluIHRoZVxyXG5cdFx0ICogY29vcmRpbmF0ZSBzcGFjZSBvZiB0aGUgbWVzaC4gSWYgdGhlIHZhbHVlIGlzIGAwYCB0aGUgbWF0ZXJpYWwgaXNcclxuXHRcdCAqIHRoaW4td2FsbGVkLiBPdGhlcndpc2UgdGhlIG1hdGVyaWFsIGlzIGEgdm9sdW1lIGJvdW5kYXJ5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudGhpY2tuZXNzID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgdGV4dHVyZSB0aGF0IGRlZmluZXMgdGhlIHRoaWNrbmVzcywgc3RvcmVkIGluIHRoZSBncmVlbiBjaGFubmVsLiBUaGlzIHdpbGxcclxuXHRcdCAqIGJlIG11bHRpcGxpZWQgYnkgYHRoaWNrbmVzc2AuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRoaWNrbmVzc01hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZW5zaXR5IG9mIHRoZSBtZWRpdW0gZ2l2ZW4gYXMgdGhlIGF2ZXJhZ2UgZGlzdGFuY2UgdGhhdCBsaWdodCB0cmF2ZWxzIGluXHJcblx0XHQgKiB0aGUgbWVkaXVtIGJlZm9yZSBpbnRlcmFjdGluZyB3aXRoIGEgcGFydGljbGUuIFRoZSB2YWx1ZSBpcyBnaXZlbiBpbiB3b3JsZFxyXG5cdFx0ICogc3BhY2UgdW5pdHMsIGFuZCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCBJbmZpbml0eVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmF0dGVudWF0aW9uRGlzdGFuY2UgPSBJbmZpbml0eTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjb2xvciB0aGF0IHdoaXRlIGxpZ2h0IHR1cm5zIGludG8gZHVlIHRvIGFic29ycHRpb24gd2hlbiByZWFjaGluZyB0aGVcclxuXHRcdCAqIGF0dGVudWF0aW9uIGRpc3RhbmNlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtDb2xvcn1cclxuXHRcdCAqIEBkZWZhdWx0ICgxLDEsMSlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hdHRlbnVhdGlvbkNvbG9yID0gbmV3IENvbG9yKCAxLCAxLCAxICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGZsb2F0IHRoYXQgc2NhbGVzIHRoZSBhbW91bnQgb2Ygc3BlY3VsYXIgcmVmbGVjdGlvbiBmb3Igbm9uLW1ldGFscyBvbmx5LlxyXG5cdFx0ICogV2hlbiBzZXQgdG8gemVybywgdGhlIG1vZGVsIGlzIGVmZmVjdGl2ZWx5IExhbWJlcnRpYW4uIEZyb20gYDAuMGAgdG8gYDEuMGAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zcGVjdWxhckludGVuc2l0eSA9IDEuMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBhbHBoYSBjaGFubmVsIG9mIHRoaXMgdGV4dHVyZSBpcyBtdWx0aXBsaWVkIGFnYWluc3QgYHNwZWN1bGFySW50ZW5zaXR5YCxcclxuXHRcdCAqIGZvciBwZXItcGl4ZWwgY29udHJvbCBvdmVyIHNwZWN1bGFyIGludGVuc2l0eS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc3BlY3VsYXJJbnRlbnNpdHlNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGludHMgdGhlIHNwZWN1bGFyIHJlZmxlY3Rpb24gYXQgbm9ybWFsIGluY2lkZW5jZSBmb3Igbm9uLW1ldGFscyBvbmx5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtDb2xvcn1cclxuXHRcdCAqIEBkZWZhdWx0ICgxLDEsMSlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zcGVjdWxhckNvbG9yID0gbmV3IENvbG9yKCAxLCAxLCAxICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgUkdCIGNoYW5uZWxzIG9mIHRoaXMgdGV4dHVyZSBhcmUgbXVsdGlwbGllZCBhZ2FpbnN0IGBzcGVjdWxhckNvbG9yYCxcclxuXHRcdCAqIGZvciBwZXItcGl4ZWwgY29udHJvbCBvdmVyIHNwZWN1bGFyIGNvbG9yLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zcGVjdWxhckNvbG9yTWFwID0gbnVsbDtcclxuXHJcblx0XHR0aGlzLl9hbmlzb3Ryb3B5ID0gMDtcclxuXHRcdHRoaXMuX2NsZWFyY29hdCA9IDA7XHJcblx0XHR0aGlzLl9kaXNwZXJzaW9uID0gMDtcclxuXHRcdHRoaXMuX2lyaWRlc2NlbmNlID0gMDtcclxuXHRcdHRoaXMuX3NoZWVuID0gMC4wO1xyXG5cdFx0dGhpcy5fdHJhbnNtaXNzaW9uID0gMDtcclxuXHJcblx0XHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBhbmlzb3Ryb3B5IHN0cmVuZ3RoLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge251bWJlcn1cclxuXHQgKiBAZGVmYXVsdCAwXHJcblx0ICovXHJcblx0Z2V0IGFuaXNvdHJvcHkoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX2FuaXNvdHJvcHk7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0IGFuaXNvdHJvcHkoIHZhbHVlICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5fYW5pc290cm9weSA+IDAgIT09IHZhbHVlID4gMCApIHtcclxuXHJcblx0XHRcdHRoaXMudmVyc2lvbiArKztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5fYW5pc290cm9weSA9IHZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlcHJlc2VudHMgdGhlIGludGVuc2l0eSBvZiB0aGUgY2xlYXIgY29hdCBsYXllciwgZnJvbSBgMC4wYCB0byBgMS4wYC4gVXNlXHJcblx0ICogY2xlYXIgY29hdCByZWxhdGVkIHByb3BlcnRpZXMgdG8gZW5hYmxlIG11bHRpbGF5ZXIgbWF0ZXJpYWxzIHRoYXQgaGF2ZSBhXHJcblx0ICogdGhpbiB0cmFuc2x1Y2VudCBsYXllciBvdmVyIHRoZSBiYXNlIGxheWVyLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge251bWJlcn1cclxuXHQgKiBAZGVmYXVsdCAwXHJcblx0ICovXHJcblx0Z2V0IGNsZWFyY29hdCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fY2xlYXJjb2F0O1xyXG5cclxuXHR9XHJcblxyXG5cdHNldCBjbGVhcmNvYXQoIHZhbHVlICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5fY2xlYXJjb2F0ID4gMCAhPT0gdmFsdWUgPiAwICkge1xyXG5cclxuXHRcdFx0dGhpcy52ZXJzaW9uICsrO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLl9jbGVhcmNvYXQgPSB2YWx1ZTtcclxuXHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIFRoZSBpbnRlbnNpdHkgb2YgdGhlIGlyaWRlc2NlbmNlIGxheWVyLCBzaW11bGF0aW5nIFJHQiBjb2xvciBzaGlmdCBiYXNlZCBvbiB0aGUgYW5nbGUgYmV0d2VlblxyXG5cdCAqIHRoZSBzdXJmYWNlIGFuZCB0aGUgdmlld2VyLCBmcm9tIGAwLjBgIHRvIGAxLjBgLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge251bWJlcn1cclxuXHQgKiBAZGVmYXVsdCAwXHJcblx0ICovXHJcblx0Z2V0IGlyaWRlc2NlbmNlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9pcmlkZXNjZW5jZTtcclxuXHJcblx0fVxyXG5cclxuXHRzZXQgaXJpZGVzY2VuY2UoIHZhbHVlICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5faXJpZGVzY2VuY2UgPiAwICE9PSB2YWx1ZSA+IDAgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnZlcnNpb24gKys7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuX2lyaWRlc2NlbmNlID0gdmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVmaW5lcyB0aGUgc3RyZW5ndGggb2YgdGhlIGFuZ3VsYXIgc2VwYXJhdGlvbiBvZiBjb2xvcnMgKGNocm9tYXRpYyBhYmVycmF0aW9uKSB0cmFuc21pdHRpbmdcclxuXHQgKiB0aHJvdWdoIGEgcmVsYXRpdmVseSBjbGVhciB2b2x1bWUuIEFueSB2YWx1ZSB6ZXJvIG9yIGxhcmdlciBpcyB2YWxpZCwgdGhlIHR5cGljYWwgcmFuZ2Ugb2ZcclxuXHQgKiByZWFsaXN0aWMgdmFsdWVzIGlzIGBbMCwgMV1gLiBUaGlzIHByb3BlcnR5IGNhbiBiZSBvbmx5IGJlIHVzZWQgd2l0aCB0cmFuc21pc3NpdmUgb2JqZWN0cy5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0ICogQGRlZmF1bHQgMFxyXG5cdCAqL1xyXG5cdGdldCBkaXNwZXJzaW9uKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9kaXNwZXJzaW9uO1xyXG5cclxuXHR9XHJcblxyXG5cdHNldCBkaXNwZXJzaW9uKCB2YWx1ZSApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuX2Rpc3BlcnNpb24gPiAwICE9PSB2YWx1ZSA+IDAgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnZlcnNpb24gKys7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuX2Rpc3BlcnNpb24gPSB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgaW50ZW5zaXR5IG9mIHRoZSBzaGVlbiBsYXllciwgZnJvbSBgMC4wYCB0byBgMS4wYC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0ICogQGRlZmF1bHQgMFxyXG5cdCAqL1xyXG5cdGdldCBzaGVlbigpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fc2hlZW47XHJcblxyXG5cdH1cclxuXHJcblx0c2V0IHNoZWVuKCB2YWx1ZSApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuX3NoZWVuID4gMCAhPT0gdmFsdWUgPiAwICkge1xyXG5cclxuXHRcdFx0dGhpcy52ZXJzaW9uICsrO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLl9zaGVlbiA9IHZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZ3JlZSBvZiB0cmFuc21pc3Npb24gKG9yIG9wdGljYWwgdHJhbnNwYXJlbmN5KSwgZnJvbSBgMC4wYCB0byBgMS4wYC5cclxuXHQgKlxyXG5cdCAqIFRoaW4sIHRyYW5zcGFyZW50IG9yIHNlbWl0cmFuc3BhcmVudCwgcGxhc3RpYyBvciBnbGFzcyBtYXRlcmlhbHMgcmVtYWluXHJcblx0ICogbGFyZ2VseSByZWZsZWN0aXZlIGV2ZW4gaWYgdGhleSBhcmUgZnVsbHkgdHJhbnNtaXNzaXZlLiBUaGUgdHJhbnNtaXNzaW9uXHJcblx0ICogcHJvcGVydHkgY2FuIGJlIHVzZWQgdG8gbW9kZWwgdGhlc2UgbWF0ZXJpYWxzLlxyXG5cdCAqXHJcblx0ICogV2hlbiB0cmFuc21pc3Npb24gaXMgbm9uLXplcm8sIGBvcGFjaXR5YCBzaG91bGQgYmUgIHNldCB0byBgMWAuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdCAqIEBkZWZhdWx0IDBcclxuXHQgKi9cclxuXHRnZXQgdHJhbnNtaXNzaW9uKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl90cmFuc21pc3Npb247XHJcblxyXG5cdH1cclxuXHJcblx0c2V0IHRyYW5zbWlzc2lvbiggdmFsdWUgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl90cmFuc21pc3Npb24gPiAwICE9PSB2YWx1ZSA+IDAgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnZlcnNpb24gKys7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuX3RyYW5zbWlzc2lvbiA9IHZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLmRlZmluZXMgPSB7XHJcblxyXG5cdFx0XHQnU1RBTkRBUkQnOiAnJyxcclxuXHRcdFx0J1BIWVNJQ0FMJzogJydcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdHRoaXMuYW5pc290cm9weSA9IHNvdXJjZS5hbmlzb3Ryb3B5O1xyXG5cdFx0dGhpcy5hbmlzb3Ryb3B5Um90YXRpb24gPSBzb3VyY2UuYW5pc290cm9weVJvdGF0aW9uO1xyXG5cdFx0dGhpcy5hbmlzb3Ryb3B5TWFwID0gc291cmNlLmFuaXNvdHJvcHlNYXA7XHJcblxyXG5cdFx0dGhpcy5jbGVhcmNvYXQgPSBzb3VyY2UuY2xlYXJjb2F0O1xyXG5cdFx0dGhpcy5jbGVhcmNvYXRNYXAgPSBzb3VyY2UuY2xlYXJjb2F0TWFwO1xyXG5cdFx0dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3MgPSBzb3VyY2UuY2xlYXJjb2F0Um91Z2huZXNzO1xyXG5cdFx0dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3NNYXAgPSBzb3VyY2UuY2xlYXJjb2F0Um91Z2huZXNzTWFwO1xyXG5cdFx0dGhpcy5jbGVhcmNvYXROb3JtYWxNYXAgPSBzb3VyY2UuY2xlYXJjb2F0Tm9ybWFsTWFwO1xyXG5cdFx0dGhpcy5jbGVhcmNvYXROb3JtYWxTY2FsZS5jb3B5KCBzb3VyY2UuY2xlYXJjb2F0Tm9ybWFsU2NhbGUgKTtcclxuXHJcblx0XHR0aGlzLmRpc3BlcnNpb24gPSBzb3VyY2UuZGlzcGVyc2lvbjtcclxuXHRcdHRoaXMuaW9yID0gc291cmNlLmlvcjtcclxuXHJcblx0XHR0aGlzLmlyaWRlc2NlbmNlID0gc291cmNlLmlyaWRlc2NlbmNlO1xyXG5cdFx0dGhpcy5pcmlkZXNjZW5jZU1hcCA9IHNvdXJjZS5pcmlkZXNjZW5jZU1hcDtcclxuXHRcdHRoaXMuaXJpZGVzY2VuY2VJT1IgPSBzb3VyY2UuaXJpZGVzY2VuY2VJT1I7XHJcblx0XHR0aGlzLmlyaWRlc2NlbmNlVGhpY2tuZXNzUmFuZ2UgPSBbIC4uLnNvdXJjZS5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlIF07XHJcblx0XHR0aGlzLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwID0gc291cmNlLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwO1xyXG5cclxuXHRcdHRoaXMuc2hlZW4gPSBzb3VyY2Uuc2hlZW47XHJcblx0XHR0aGlzLnNoZWVuQ29sb3IuY29weSggc291cmNlLnNoZWVuQ29sb3IgKTtcclxuXHRcdHRoaXMuc2hlZW5Db2xvck1hcCA9IHNvdXJjZS5zaGVlbkNvbG9yTWFwO1xyXG5cdFx0dGhpcy5zaGVlblJvdWdobmVzcyA9IHNvdXJjZS5zaGVlblJvdWdobmVzcztcclxuXHRcdHRoaXMuc2hlZW5Sb3VnaG5lc3NNYXAgPSBzb3VyY2Uuc2hlZW5Sb3VnaG5lc3NNYXA7XHJcblxyXG5cdFx0dGhpcy50cmFuc21pc3Npb24gPSBzb3VyY2UudHJhbnNtaXNzaW9uO1xyXG5cdFx0dGhpcy50cmFuc21pc3Npb25NYXAgPSBzb3VyY2UudHJhbnNtaXNzaW9uTWFwO1xyXG5cclxuXHRcdHRoaXMudGhpY2tuZXNzID0gc291cmNlLnRoaWNrbmVzcztcclxuXHRcdHRoaXMudGhpY2tuZXNzTWFwID0gc291cmNlLnRoaWNrbmVzc01hcDtcclxuXHRcdHRoaXMuYXR0ZW51YXRpb25EaXN0YW5jZSA9IHNvdXJjZS5hdHRlbnVhdGlvbkRpc3RhbmNlO1xyXG5cdFx0dGhpcy5hdHRlbnVhdGlvbkNvbG9yLmNvcHkoIHNvdXJjZS5hdHRlbnVhdGlvbkNvbG9yICk7XHJcblxyXG5cdFx0dGhpcy5zcGVjdWxhckludGVuc2l0eSA9IHNvdXJjZS5zcGVjdWxhckludGVuc2l0eTtcclxuXHRcdHRoaXMuc3BlY3VsYXJJbnRlbnNpdHlNYXAgPSBzb3VyY2Uuc3BlY3VsYXJJbnRlbnNpdHlNYXA7XHJcblx0XHR0aGlzLnNwZWN1bGFyQ29sb3IuY29weSggc291cmNlLnNwZWN1bGFyQ29sb3IgKTtcclxuXHRcdHRoaXMuc3BlY3VsYXJDb2xvck1hcCA9IHNvdXJjZS5zcGVjdWxhckNvbG9yTWFwO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBNZXNoUGh5c2ljYWxNYXRlcmlhbCB9O1xyXG4iLCJpbXBvcnQgeyBNdWx0aXBseU9wZXJhdGlvbiwgVGFuZ2VudFNwYWNlTm9ybWFsTWFwIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgTWF0ZXJpYWwgfSBmcm9tICcuL01hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uL21hdGgvVmVjdG9yMi5qcyc7XHJcbmltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vbWF0aC9Db2xvci5qcyc7XHJcbmltcG9ydCB7IEV1bGVyIH0gZnJvbSAnLi4vbWF0aC9FdWxlci5qcyc7XHJcblxyXG4vKipcclxuICogQSBtYXRlcmlhbCBmb3Igc2hpbnkgc3VyZmFjZXMgd2l0aCBzcGVjdWxhciBoaWdobGlnaHRzLlxyXG4gKlxyXG4gKiBUaGUgbWF0ZXJpYWwgdXNlcyBhIG5vbi1waHlzaWNhbGx5IGJhc2VkIFtCbGlubi1QaG9uZ117QGxpbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmxpbm4tUGhvbmdfc2hhZGluZ19tb2RlbH1cclxuICogbW9kZWwgZm9yIGNhbGN1bGF0aW5nIHJlZmxlY3RhbmNlLiBVbmxpa2UgdGhlIExhbWJlcnRpYW4gbW9kZWwgdXNlZCBpbiB0aGVcclxuICoge0BsaW5rIE1lc2hMYW1iZXJ0TWF0ZXJpYWx9IHRoaXMgY2FuIHNpbXVsYXRlIHNoaW55IHN1cmZhY2VzIHdpdGggc3BlY3VsYXJcclxuICogaGlnaGxpZ2h0cyAoc3VjaCBhcyB2YXJuaXNoZWQgd29vZCkuIGBNZXNoUGhvbmdNYXRlcmlhbGAgdXNlcyBwZXItZnJhZ21lbnQgc2hhZGluZy5cclxuICpcclxuICogUGVyZm9ybWFuY2Ugd2lsbCBnZW5lcmFsbHkgYmUgZ3JlYXRlciB3aGVuIHVzaW5nIHRoaXMgbWF0ZXJpYWwgb3ZlciB0aGVcclxuICoge0BsaW5rIE1lc2hTdGFuZGFyZE1hdGVyaWFsfSBvciB7QGxpbmsgTWVzaFBoeXNpY2FsTWF0ZXJpYWx9LCBhdCB0aGUgY29zdCBvZlxyXG4gKiBzb21lIGdyYXBoaWNhbCBhY2N1cmFjeS5cclxuICpcclxuICogQGF1Z21lbnRzIE1hdGVyaWFsXHJcbiAqL1xyXG5jbGFzcyBNZXNoUGhvbmdNYXRlcmlhbCBleHRlbmRzIE1hdGVyaWFsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBtZXNoIHBob25nIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbWV0ZXJzXSAtIEFuIG9iamVjdCB3aXRoIG9uZSBvciBtb3JlIHByb3BlcnRpZXNcclxuXHQgKiBkZWZpbmluZyB0aGUgbWF0ZXJpYWwncyBhcHBlYXJhbmNlLiBBbnkgcHJvcGVydHkgb2YgdGhlIG1hdGVyaWFsXHJcblx0ICogKGluY2x1ZGluZyBhbnkgcHJvcGVydHkgZnJvbSBpbmhlcml0ZWQgbWF0ZXJpYWxzKSBjYW4gYmUgcGFzc2VkXHJcblx0ICogaW4gaGVyZS4gQ29sb3IgdmFsdWVzIGNhbiBiZSBwYXNzZWQgYW55IHR5cGUgb2YgdmFsdWUgYWNjZXB0ZWRcclxuXHQgKiBieSB7QGxpbmsgQ29sb3Ijc2V0fS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVycyApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc01lc2hQaG9uZ01hdGVyaWFsID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnTWVzaFBob25nTWF0ZXJpYWwnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQ29sb3Igb2YgdGhlIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtDb2xvcn1cclxuXHRcdCAqIEBkZWZhdWx0ICgxLDEsMSlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTsgLy8gZGlmZnVzZVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU3BlY3VsYXIgY29sb3Igb2YgdGhlIG1hdGVyaWFsLiBUaGUgZGVmYXVsdCBjb2xvciBpcyBzZXQgdG8gYDB4MTExMTExYCAodmVyeSBkYXJrIGdyZXkpXHJcblx0XHQgKlxyXG5cdFx0ICogVGhpcyBkZWZpbmVzIGhvdyBzaGlueSB0aGUgbWF0ZXJpYWwgaXMgYW5kIHRoZSBjb2xvciBvZiBpdHMgc2hpbmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0NvbG9yfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNwZWN1bGFyID0gbmV3IENvbG9yKCAweDExMTExMSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG93IHNoaW55IHRoZSBzcGVjdWxhciBoaWdobGlnaHQgaXM7IGEgaGlnaGVyIHZhbHVlIGdpdmVzIGEgc2hhcnBlciBoaWdobGlnaHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDMwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2hpbmluZXNzID0gMzA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY29sb3IgbWFwLiBNYXkgb3B0aW9uYWxseSBpbmNsdWRlIGFuIGFscGhhIGNoYW5uZWwsIHR5cGljYWxseSBjb21iaW5lZFxyXG5cdFx0ICogd2l0aCB7QGxpbmsgTWF0ZXJpYWwjdHJhbnNwYXJlbnR9IG9yIHtAbGluayBNYXRlcmlhbCNhbHBoYVRlc3R9LiBUaGUgdGV4dHVyZSBtYXBcclxuXHRcdCAqIGNvbG9yIGlzIG1vZHVsYXRlZCBieSB0aGUgZGlmZnVzZSBgY29sb3JgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGxpZ2h0IG1hcC4gUmVxdWlyZXMgYSBzZWNvbmQgc2V0IG9mIFVWcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGlnaHRNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSW50ZW5zaXR5IG9mIHRoZSBiYWtlZCBsaWdodC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gMS4wO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJlZCBjaGFubmVsIG9mIHRoaXMgdGV4dHVyZSBpcyB1c2VkIGFzIHRoZSBhbWJpZW50IG9jY2x1c2lvbiBtYXAuXHJcblx0XHQgKiBSZXF1aXJlcyBhIHNlY29uZCBzZXQgb2YgVVZzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hb01hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBJbnRlbnNpdHkgb2YgdGhlIGFtYmllbnQgb2NjbHVzaW9uIGVmZmVjdC4gUmFuZ2UgaXMgYFswLDFdYCwgd2hlcmUgYDBgXHJcblx0XHQgKiBkaXNhYmxlcyBhbWJpZW50IG9jY2x1c2lvbi4gV2hlcmUgaW50ZW5zaXR5IGlzIGAxYCBhbmQgdGhlIEFPIG1hcCdzXHJcblx0XHQgKiByZWQgY2hhbm5lbCBpcyBhbHNvIGAxYCwgYW1iaWVudCBsaWdodCBpcyBmdWxseSBvY2NsdWRlZCBvbiBhIHN1cmZhY2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hb01hcEludGVuc2l0eSA9IDEuMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEVtaXNzaXZlIChsaWdodCkgY29sb3Igb2YgdGhlIG1hdGVyaWFsLCBlc3NlbnRpYWxseSBhIHNvbGlkIGNvbG9yXHJcblx0XHQgKiB1bmFmZmVjdGVkIGJ5IG90aGVyIGxpZ2h0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtDb2xvcn1cclxuXHRcdCAqIEBkZWZhdWx0ICgwLDAsMClcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5lbWlzc2l2ZSA9IG5ldyBDb2xvciggMHgwMDAwMDAgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEludGVuc2l0eSBvZiB0aGUgZW1pc3NpdmUgbGlnaHQuIE1vZHVsYXRlcyB0aGUgZW1pc3NpdmUgY29sb3IuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IDEuMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNldCBlbWlzc2l2ZSAoZ2xvdykgbWFwLiBUaGUgZW1pc3NpdmUgbWFwIGNvbG9yIGlzIG1vZHVsYXRlZCBieSB0aGVcclxuXHRcdCAqIGVtaXNzaXZlIGNvbG9yIGFuZCB0aGUgZW1pc3NpdmUgaW50ZW5zaXR5LiBJZiB5b3UgaGF2ZSBhbiBlbWlzc2l2ZSBtYXAsXHJcblx0XHQgKiBiZSBzdXJlIHRvIHNldCB0aGUgZW1pc3NpdmUgY29sb3IgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gYmxhY2suXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmVtaXNzaXZlTWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB0ZXh0dXJlIHRvIGNyZWF0ZSBhIGJ1bXAgbWFwLiBUaGUgYmxhY2sgYW5kIHdoaXRlIHZhbHVlcyBtYXAgdG8gdGhlXHJcblx0XHQgKiBwZXJjZWl2ZWQgZGVwdGggaW4gcmVsYXRpb24gdG8gdGhlIGxpZ2h0cy4gQnVtcCBkb2Vzbid0IGFjdHVhbGx5IGFmZmVjdFxyXG5cdFx0ICogdGhlIGdlb21ldHJ5IG9mIHRoZSBvYmplY3QsIG9ubHkgdGhlIGxpZ2h0aW5nLiBJZiBhIG5vcm1hbCBtYXAgaXMgZGVmaW5lZFxyXG5cdFx0ICogdGhpcyB3aWxsIGJlIGlnbm9yZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJ1bXBNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG93IG11Y2ggdGhlIGJ1bXAgbWFwIGFmZmVjdHMgdGhlIG1hdGVyaWFsLiBUeXBpY2FsIHJhbmdlIGlzIGBbMCwxXWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5idW1wU2NhbGUgPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHRleHR1cmUgdG8gY3JlYXRlIGEgbm9ybWFsIG1hcC4gVGhlIFJHQiB2YWx1ZXMgYWZmZWN0IHRoZSBzdXJmYWNlXHJcblx0XHQgKiBub3JtYWwgZm9yIGVhY2ggcGl4ZWwgZnJhZ21lbnQgYW5kIGNoYW5nZSB0aGUgd2F5IHRoZSBjb2xvciBpcyBsaXQuIE5vcm1hbFxyXG5cdFx0ICogbWFwcyBkbyBub3QgY2hhbmdlIHRoZSBhY3R1YWwgc2hhcGUgb2YgdGhlIHN1cmZhY2UsIG9ubHkgdGhlIGxpZ2h0aW5nLiBJblxyXG5cdFx0ICogY2FzZSB0aGUgbWF0ZXJpYWwgaGFzIGEgbm9ybWFsIG1hcCBhdXRob3JlZCB1c2luZyB0aGUgbGVmdCBoYW5kZWRcclxuXHRcdCAqIGNvbnZlbnRpb24sIHRoZSBgeWAgY29tcG9uZW50IG9mIGBub3JtYWxTY2FsZWAgc2hvdWxkIGJlIG5lZ2F0ZWQgdG8gY29tcGVuc2F0ZVxyXG5cdFx0ICogZm9yIHRoZSBkaWZmZXJlbnQgaGFuZGVkbmVzcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9ybWFsTWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB0eXBlIG9mIG5vcm1hbCBtYXAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeyhUYW5nZW50U3BhY2VOb3JtYWxNYXB8T2JqZWN0U3BhY2VOb3JtYWxNYXApfVxyXG5cdFx0ICogQGRlZmF1bHQgVGFuZ2VudFNwYWNlTm9ybWFsTWFwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9ybWFsTWFwVHlwZSA9IFRhbmdlbnRTcGFjZU5vcm1hbE1hcDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvdyBtdWNoIHRoZSBub3JtYWwgbWFwIGFmZmVjdHMgdGhlIG1hdGVyaWFsLiBUeXBpY2FsIHZhbHVlIHJhbmdlIGlzIGBbMCwxXWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjJ9XHJcblx0XHQgKiBAZGVmYXVsdCAoMSwxKVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vcm1hbFNjYWxlID0gbmV3IFZlY3RvcjIoIDEsIDEgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBkaXNwbGFjZW1lbnQgbWFwIGFmZmVjdHMgdGhlIHBvc2l0aW9uIG9mIHRoZSBtZXNoJ3MgdmVydGljZXMuIFVubGlrZVxyXG5cdFx0ICogb3RoZXIgbWFwcyB3aGljaCBvbmx5IGFmZmVjdCB0aGUgbGlnaHQgYW5kIHNoYWRlIG9mIHRoZSBtYXRlcmlhbCB0aGVcclxuXHRcdCAqIGRpc3BsYWNlZCB2ZXJ0aWNlcyBjYW4gY2FzdCBzaGFkb3dzLCBibG9jayBvdGhlciBvYmplY3RzLCBhbmQgb3RoZXJ3aXNlXHJcblx0XHQgKiBhY3QgYXMgcmVhbCBnZW9tZXRyeS4gVGhlIGRpc3BsYWNlbWVudCB0ZXh0dXJlIGlzIGFuIGltYWdlIHdoZXJlIHRoZSB2YWx1ZVxyXG5cdFx0ICogb2YgZWFjaCBwaXhlbCAod2hpdGUgYmVpbmcgdGhlIGhpZ2hlc3QpIGlzIG1hcHBlZCBhZ2FpbnN0LCBhbmRcclxuXHRcdCAqIHJlcG9zaXRpb25zLCB0aGUgdmVydGljZXMgb2YgdGhlIG1lc2guXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3cgbXVjaCB0aGUgZGlzcGxhY2VtZW50IG1hcCBhZmZlY3RzIHRoZSBtZXNoICh3aGVyZSBibGFjayBpcyBub1xyXG5cdFx0ICogZGlzcGxhY2VtZW50LCBhbmQgd2hpdGUgaXMgbWF4aW11bSBkaXNwbGFjZW1lbnQpLiBXaXRob3V0IGEgZGlzcGxhY2VtZW50XHJcblx0XHQgKiBtYXAgc2V0LCB0aGlzIHZhbHVlIGlzIG5vdCBhcHBsaWVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG9mZnNldCBvZiB0aGUgZGlzcGxhY2VtZW50IG1hcCdzIHZhbHVlcyBvbiB0aGUgbWVzaCdzIHZlcnRpY2VzLlxyXG5cdFx0ICogVGhlIGJpYXMgaXMgYWRkZWQgdG8gdGhlIHNjYWxlZCBzYW1wbGUgb2YgdGhlIGRpc3BsYWNlbWVudCBtYXAuXHJcblx0XHQgKiBXaXRob3V0IGEgZGlzcGxhY2VtZW50IG1hcCBzZXQsIHRoaXMgdmFsdWUgaXMgbm90IGFwcGxpZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBzcGVjdWxhciBtYXAgdmFsdWUgYWZmZWN0cyBib3RoIGhvdyBtdWNoIHRoZSBzcGVjdWxhciBzdXJmYWNlXHJcblx0XHQgKiBoaWdobGlnaHQgY29udHJpYnV0ZXMgYW5kIGhvdyBtdWNoIG9mIHRoZSBlbnZpcm9ubWVudCBtYXAgYWZmZWN0cyB0aGVcclxuXHRcdCAqIHN1cmZhY2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNwZWN1bGFyTWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBhbHBoYSBtYXAgaXMgYSBncmF5c2NhbGUgdGV4dHVyZSB0aGF0IGNvbnRyb2xzIHRoZSBvcGFjaXR5IGFjcm9zcyB0aGVcclxuXHRcdCAqIHN1cmZhY2UgKGJsYWNrOiBmdWxseSB0cmFuc3BhcmVudDsgd2hpdGU6IGZ1bGx5IG9wYXF1ZSkuXHJcblx0XHQgKlxyXG5cdFx0ICogT25seSB0aGUgY29sb3Igb2YgdGhlIHRleHR1cmUgaXMgdXNlZCwgaWdub3JpbmcgdGhlIGFscGhhIGNoYW5uZWwgaWYgb25lXHJcblx0XHQgKiBleGlzdHMuIEZvciBSR0IgYW5kIFJHQkEgdGV4dHVyZXMsIHRoZSByZW5kZXJlciB3aWxsIHVzZSB0aGUgZ3JlZW4gY2hhbm5lbFxyXG5cdFx0ICogd2hlbiBzYW1wbGluZyB0aGlzIHRleHR1cmUgZHVlIHRvIHRoZSBleHRyYSBiaXQgb2YgcHJlY2lzaW9uIHByb3ZpZGVkIGZvclxyXG5cdFx0ICogZ3JlZW4gaW4gRFhULWNvbXByZXNzZWQgYW5kIHVuY29tcHJlc3NlZCBSR0IgNTY1IGZvcm1hdHMuIEx1bWluYW5jZS1vbmx5IGFuZFxyXG5cdFx0ICogbHVtaW5hbmNlL2FscGhhIHRleHR1cmVzIHdpbGwgYWxzbyBzdGlsbCB3b3JrIGFzIGV4cGVjdGVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hbHBoYU1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZW52aXJvbm1lbnQgbWFwLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5lbnZNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJvdGF0aW9uIG9mIHRoZSBlbnZpcm9ubWVudCBtYXAgaW4gcmFkaWFucy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7RXVsZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAoMCwwLDApXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZW52TWFwUm90YXRpb24gPSBuZXcgRXVsZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvdyB0byBjb21iaW5lIHRoZSByZXN1bHQgb2YgdGhlIHN1cmZhY2UncyBjb2xvciB3aXRoIHRoZSBlbnZpcm9ubWVudCBtYXAsIGlmIGFueS5cclxuXHRcdCAqXHJcblx0XHQgKiBXaGVuIHNldCB0byBgTWl4T3BlcmF0aW9uYCwgdGhlIHtAbGluayBNZXNoQmFzaWNNYXRlcmlhbCNyZWZsZWN0aXZpdHl9IGlzIHVzZWQgdG9cclxuXHRcdCAqIGJsZW5kIGJldHdlZW4gdGhlIHR3byBjb2xvcnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeyhNdWx0aXBseU9wZXJhdGlvbnxNaXhPcGVyYXRpb258QWRkT3BlcmF0aW9uKX1cclxuXHRcdCAqIEBkZWZhdWx0IE11bHRpcGx5T3BlcmF0aW9uXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29tYmluZSA9IE11bHRpcGx5T3BlcmF0aW9uO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG93IG11Y2ggdGhlIGVudmlyb25tZW50IG1hcCBhZmZlY3RzIHRoZSBzdXJmYWNlLlxyXG5cdFx0ICogVGhlIHZhbGlkIHJhbmdlIGlzIGJldHdlZW4gYDBgIChubyByZWZsZWN0aW9ucykgYW5kIGAxYCAoZnVsbCByZWZsZWN0aW9ucykuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yZWZsZWN0aXZpdHkgPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGluZGV4IG9mIHJlZnJhY3Rpb24gKElPUikgb2YgYWlyIChhcHByb3hpbWF0ZWx5IDEpIGRpdmlkZWQgYnkgdGhlXHJcblx0XHQgKiBpbmRleCBvZiByZWZyYWN0aW9uIG9mIHRoZSBtYXRlcmlhbC4gSXQgaXMgdXNlZCB3aXRoIGVudmlyb25tZW50IG1hcHBpbmdcclxuXHRcdCAqIG1vZGVzIHtAbGluayBDdWJlUmVmcmFjdGlvbk1hcHBpbmd9IGFuZCB7QGxpbmsgRXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmd9LlxyXG5cdFx0ICogVGhlIHJlZnJhY3Rpb24gcmF0aW8gc2hvdWxkIG5vdCBleGNlZWQgYDFgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwLjk4XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVmcmFjdGlvblJhdGlvID0gMC45ODtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlbmRlcnMgdGhlIGdlb21ldHJ5IGFzIGEgd2lyZWZyYW1lLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy53aXJlZnJhbWUgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENvbnRyb2xzIHRoZSB0aGlja25lc3Mgb2YgdGhlIHdpcmVmcmFtZS5cclxuXHRcdCAqXHJcblx0XHQgKiBDYW4gb25seSBiZSB1c2VkIHdpdGgge0BsaW5rIFNWR1JlbmRlcmVyfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIGFwcGVhcmFuY2Ugb2Ygd2lyZWZyYW1lIGVuZHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQ2FuIG9ubHkgYmUgdXNlZCB3aXRoIHtAbGluayBTVkdSZW5kZXJlcn0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeygncm91bmQnfCdiZXZlbCd8J21pdGVyJyl9XHJcblx0XHQgKiBAZGVmYXVsdCAncm91bmQnXHJcblx0XHQgKi9cclxuXHRcdHRoaXMud2lyZWZyYW1lTGluZWNhcCA9ICdyb3VuZCc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIGFwcGVhcmFuY2Ugb2Ygd2lyZWZyYW1lIGpvaW50cy5cclxuXHRcdCAqXHJcblx0XHQgKiBDYW4gb25seSBiZSB1c2VkIHdpdGgge0BsaW5rIFNWR1JlbmRlcmVyfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KCdyb3VuZCd8J2JldmVsJ3wnbWl0ZXInKX1cclxuXHRcdCAqIEBkZWZhdWx0ICdyb3VuZCdcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy53aXJlZnJhbWVMaW5lam9pbiA9ICdyb3VuZCc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSBtYXRlcmlhbCBpcyByZW5kZXJlZCB3aXRoIGZsYXQgc2hhZGluZyBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZsYXRTaGFkaW5nID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSBtYXRlcmlhbCBpcyBhZmZlY3RlZCBieSBmb2cgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZvZyA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcclxuXHRcdHRoaXMuc3BlY3VsYXIuY29weSggc291cmNlLnNwZWN1bGFyICk7XHJcblx0XHR0aGlzLnNoaW5pbmVzcyA9IHNvdXJjZS5zaGluaW5lc3M7XHJcblxyXG5cdFx0dGhpcy5tYXAgPSBzb3VyY2UubWFwO1xyXG5cclxuXHRcdHRoaXMubGlnaHRNYXAgPSBzb3VyY2UubGlnaHRNYXA7XHJcblx0XHR0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gc291cmNlLmxpZ2h0TWFwSW50ZW5zaXR5O1xyXG5cclxuXHRcdHRoaXMuYW9NYXAgPSBzb3VyY2UuYW9NYXA7XHJcblx0XHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gc291cmNlLmFvTWFwSW50ZW5zaXR5O1xyXG5cclxuXHRcdHRoaXMuZW1pc3NpdmUuY29weSggc291cmNlLmVtaXNzaXZlICk7XHJcblx0XHR0aGlzLmVtaXNzaXZlTWFwID0gc291cmNlLmVtaXNzaXZlTWFwO1xyXG5cdFx0dGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IHNvdXJjZS5lbWlzc2l2ZUludGVuc2l0eTtcclxuXHJcblx0XHR0aGlzLmJ1bXBNYXAgPSBzb3VyY2UuYnVtcE1hcDtcclxuXHRcdHRoaXMuYnVtcFNjYWxlID0gc291cmNlLmJ1bXBTY2FsZTtcclxuXHJcblx0XHR0aGlzLm5vcm1hbE1hcCA9IHNvdXJjZS5ub3JtYWxNYXA7XHJcblx0XHR0aGlzLm5vcm1hbE1hcFR5cGUgPSBzb3VyY2Uubm9ybWFsTWFwVHlwZTtcclxuXHRcdHRoaXMubm9ybWFsU2NhbGUuY29weSggc291cmNlLm5vcm1hbFNjYWxlICk7XHJcblxyXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBzb3VyY2UuZGlzcGxhY2VtZW50TWFwO1xyXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHNvdXJjZS5kaXNwbGFjZW1lbnRTY2FsZTtcclxuXHRcdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IHNvdXJjZS5kaXNwbGFjZW1lbnRCaWFzO1xyXG5cclxuXHRcdHRoaXMuc3BlY3VsYXJNYXAgPSBzb3VyY2Uuc3BlY3VsYXJNYXA7XHJcblxyXG5cdFx0dGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDtcclxuXHJcblx0XHR0aGlzLmVudk1hcCA9IHNvdXJjZS5lbnZNYXA7XHJcblx0XHR0aGlzLmVudk1hcFJvdGF0aW9uLmNvcHkoIHNvdXJjZS5lbnZNYXBSb3RhdGlvbiApO1xyXG5cdFx0dGhpcy5jb21iaW5lID0gc291cmNlLmNvbWJpbmU7XHJcblx0XHR0aGlzLnJlZmxlY3Rpdml0eSA9IHNvdXJjZS5yZWZsZWN0aXZpdHk7XHJcblx0XHR0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IHNvdXJjZS5yZWZyYWN0aW9uUmF0aW87XHJcblxyXG5cdFx0dGhpcy53aXJlZnJhbWUgPSBzb3VyY2Uud2lyZWZyYW1lO1xyXG5cdFx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoO1xyXG5cdFx0dGhpcy53aXJlZnJhbWVMaW5lY2FwID0gc291cmNlLndpcmVmcmFtZUxpbmVjYXA7XHJcblx0XHR0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gc291cmNlLndpcmVmcmFtZUxpbmVqb2luO1xyXG5cclxuXHRcdHRoaXMuZmxhdFNoYWRpbmcgPSBzb3VyY2UuZmxhdFNoYWRpbmc7XHJcblxyXG5cdFx0dGhpcy5mb2cgPSBzb3VyY2UuZm9nO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBNZXNoUGhvbmdNYXRlcmlhbCB9O1xyXG4iLCJpbXBvcnQgeyBUYW5nZW50U3BhY2VOb3JtYWxNYXAgfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBNYXRlcmlhbCB9IGZyb20gJy4vTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IyLmpzJztcclxuaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi9tYXRoL0NvbG9yLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIG1hdGVyaWFsIGltcGxlbWVudGluZyB0b29uIHNoYWRpbmcuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBNYXRlcmlhbFxyXG4gKi9cclxuY2xhc3MgTWVzaFRvb25NYXRlcmlhbCBleHRlbmRzIE1hdGVyaWFsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBtZXNoIHRvb24gbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtZXRlcnNdIC0gQW4gb2JqZWN0IHdpdGggb25lIG9yIG1vcmUgcHJvcGVydGllc1xyXG5cdCAqIGRlZmluaW5nIHRoZSBtYXRlcmlhbCdzIGFwcGVhcmFuY2UuIEFueSBwcm9wZXJ0eSBvZiB0aGUgbWF0ZXJpYWxcclxuXHQgKiAoaW5jbHVkaW5nIGFueSBwcm9wZXJ0eSBmcm9tIGluaGVyaXRlZCBtYXRlcmlhbHMpIGNhbiBiZSBwYXNzZWRcclxuXHQgKiBpbiBoZXJlLiBDb2xvciB2YWx1ZXMgY2FuIGJlIHBhc3NlZCBhbnkgdHlwZSBvZiB2YWx1ZSBhY2NlcHRlZFxyXG5cdCAqIGJ5IHtAbGluayBDb2xvciNzZXR9LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwYXJhbWV0ZXJzICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzTWVzaFRvb25NYXRlcmlhbCA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy5kZWZpbmVzID0geyAnVE9PTic6ICcnIH07XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ01lc2hUb29uTWF0ZXJpYWwnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQ29sb3Igb2YgdGhlIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtDb2xvcn1cclxuXHRcdCAqIEBkZWZhdWx0ICgxLDEsMSlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjb2xvciBtYXAuIE1heSBvcHRpb25hbGx5IGluY2x1ZGUgYW4gYWxwaGEgY2hhbm5lbCwgdHlwaWNhbGx5IGNvbWJpbmVkXHJcblx0XHQgKiB3aXRoIHtAbGluayBNYXRlcmlhbCN0cmFuc3BhcmVudH0gb3Ige0BsaW5rIE1hdGVyaWFsI2FscGhhVGVzdH0uIFRoZSB0ZXh0dXJlIG1hcFxyXG5cdFx0ICogY29sb3IgaXMgbW9kdWxhdGVkIGJ5IHRoZSBkaWZmdXNlIGBjb2xvcmAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBHcmFkaWVudCBtYXAgZm9yIHRvb24gc2hhZGluZy4gSXQncyByZXF1aXJlZCB0byBzZXRcclxuXHRcdCAqIHtAbGluayBUZXh0dXJlI21pbkZpbHRlcn0gYW5kIHtAbGluayBUZXh0dXJlI21hZ0ZpbHRlcn0gdG8ge0BsaW5rTmVhcmVzdEZpbHRlcn1cclxuXHRcdCAqIHdoZW4gdXNpbmcgdGhpcyB0eXBlIG9mIHRleHR1cmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdyYWRpZW50TWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBsaWdodCBtYXAuIFJlcXVpcmVzIGEgc2Vjb25kIHNldCBvZiBVVnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxpZ2h0TWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEludGVuc2l0eSBvZiB0aGUgYmFrZWQgbGlnaHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5saWdodE1hcEludGVuc2l0eSA9IDEuMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByZWQgY2hhbm5lbCBvZiB0aGlzIHRleHR1cmUgaXMgdXNlZCBhcyB0aGUgYW1iaWVudCBvY2NsdXNpb24gbWFwLlxyXG5cdFx0ICogUmVxdWlyZXMgYSBzZWNvbmQgc2V0IG9mIFVWcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYW9NYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSW50ZW5zaXR5IG9mIHRoZSBhbWJpZW50IG9jY2x1c2lvbiBlZmZlY3QuIFJhbmdlIGlzIGBbMCwxXWAsIHdoZXJlIGAwYFxyXG5cdFx0ICogZGlzYWJsZXMgYW1iaWVudCBvY2NsdXNpb24uIFdoZXJlIGludGVuc2l0eSBpcyBgMWAgYW5kIHRoZSBBTyBtYXAnc1xyXG5cdFx0ICogcmVkIGNoYW5uZWwgaXMgYWxzbyBgMWAsIGFtYmllbnQgbGlnaHQgaXMgZnVsbHkgb2NjbHVkZWQgb24gYSBzdXJmYWNlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSAxLjA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBFbWlzc2l2ZSAobGlnaHQpIGNvbG9yIG9mIHRoZSBtYXRlcmlhbCwgZXNzZW50aWFsbHkgYSBzb2xpZCBjb2xvclxyXG5cdFx0ICogdW5hZmZlY3RlZCBieSBvdGhlciBsaWdodGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Q29sb3J9XHJcblx0XHQgKiBAZGVmYXVsdCAoMCwwLDApXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZW1pc3NpdmUgPSBuZXcgQ29sb3IoIDB4MDAwMDAwICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBJbnRlbnNpdHkgb2YgdGhlIGVtaXNzaXZlIGxpZ2h0LiBNb2R1bGF0ZXMgdGhlIGVtaXNzaXZlIGNvbG9yLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgPSAxLjA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTZXQgZW1pc3NpdmUgKGdsb3cpIG1hcC4gVGhlIGVtaXNzaXZlIG1hcCBjb2xvciBpcyBtb2R1bGF0ZWQgYnkgdGhlXHJcblx0XHQgKiBlbWlzc2l2ZSBjb2xvciBhbmQgdGhlIGVtaXNzaXZlIGludGVuc2l0eS4gSWYgeW91IGhhdmUgYW4gZW1pc3NpdmUgbWFwLFxyXG5cdFx0ICogYmUgc3VyZSB0byBzZXQgdGhlIGVtaXNzaXZlIGNvbG9yIHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIGJsYWNrLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5lbWlzc2l2ZU1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdGV4dHVyZSB0byBjcmVhdGUgYSBidW1wIG1hcC4gVGhlIGJsYWNrIGFuZCB3aGl0ZSB2YWx1ZXMgbWFwIHRvIHRoZVxyXG5cdFx0ICogcGVyY2VpdmVkIGRlcHRoIGluIHJlbGF0aW9uIHRvIHRoZSBsaWdodHMuIEJ1bXAgZG9lc24ndCBhY3R1YWxseSBhZmZlY3RcclxuXHRcdCAqIHRoZSBnZW9tZXRyeSBvZiB0aGUgb2JqZWN0LCBvbmx5IHRoZSBsaWdodGluZy4gSWYgYSBub3JtYWwgbWFwIGlzIGRlZmluZWRcclxuXHRcdCAqIHRoaXMgd2lsbCBiZSBpZ25vcmVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5idW1wTWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvdyBtdWNoIHRoZSBidW1wIG1hcCBhZmZlY3RzIHRoZSBtYXRlcmlhbC4gVHlwaWNhbCByYW5nZSBpcyBgWzAsMV1gLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYnVtcFNjYWxlID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB0ZXh0dXJlIHRvIGNyZWF0ZSBhIG5vcm1hbCBtYXAuIFRoZSBSR0IgdmFsdWVzIGFmZmVjdCB0aGUgc3VyZmFjZVxyXG5cdFx0ICogbm9ybWFsIGZvciBlYWNoIHBpeGVsIGZyYWdtZW50IGFuZCBjaGFuZ2UgdGhlIHdheSB0aGUgY29sb3IgaXMgbGl0LiBOb3JtYWxcclxuXHRcdCAqIG1hcHMgZG8gbm90IGNoYW5nZSB0aGUgYWN0dWFsIHNoYXBlIG9mIHRoZSBzdXJmYWNlLCBvbmx5IHRoZSBsaWdodGluZy4gSW5cclxuXHRcdCAqIGNhc2UgdGhlIG1hdGVyaWFsIGhhcyBhIG5vcm1hbCBtYXAgYXV0aG9yZWQgdXNpbmcgdGhlIGxlZnQgaGFuZGVkXHJcblx0XHQgKiBjb252ZW50aW9uLCB0aGUgYHlgIGNvbXBvbmVudCBvZiBgbm9ybWFsU2NhbGVgIHNob3VsZCBiZSBuZWdhdGVkIHRvIGNvbXBlbnNhdGVcclxuXHRcdCAqIGZvciB0aGUgZGlmZmVyZW50IGhhbmRlZG5lc3MuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vcm1hbE1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdHlwZSBvZiBub3JtYWwgbWFwLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoVGFuZ2VudFNwYWNlTm9ybWFsTWFwfE9iamVjdFNwYWNlTm9ybWFsTWFwKX1cclxuXHRcdCAqIEBkZWZhdWx0IFRhbmdlbnRTcGFjZU5vcm1hbE1hcFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vcm1hbE1hcFR5cGUgPSBUYW5nZW50U3BhY2VOb3JtYWxNYXA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3cgbXVjaCB0aGUgbm9ybWFsIG1hcCBhZmZlY3RzIHRoZSBtYXRlcmlhbC4gVHlwaWNhbCB2YWx1ZSByYW5nZSBpcyBgWzAsMV1gLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3IyfVxyXG5cdFx0ICogQGRlZmF1bHQgKDEsMSlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub3JtYWxTY2FsZSA9IG5ldyBWZWN0b3IyKCAxLCAxICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZGlzcGxhY2VtZW50IG1hcCBhZmZlY3RzIHRoZSBwb3NpdGlvbiBvZiB0aGUgbWVzaCdzIHZlcnRpY2VzLiBVbmxpa2VcclxuXHRcdCAqIG90aGVyIG1hcHMgd2hpY2ggb25seSBhZmZlY3QgdGhlIGxpZ2h0IGFuZCBzaGFkZSBvZiB0aGUgbWF0ZXJpYWwgdGhlXHJcblx0XHQgKiBkaXNwbGFjZWQgdmVydGljZXMgY2FuIGNhc3Qgc2hhZG93cywgYmxvY2sgb3RoZXIgb2JqZWN0cywgYW5kIG90aGVyd2lzZVxyXG5cdFx0ICogYWN0IGFzIHJlYWwgZ2VvbWV0cnkuIFRoZSBkaXNwbGFjZW1lbnQgdGV4dHVyZSBpcyBhbiBpbWFnZSB3aGVyZSB0aGUgdmFsdWVcclxuXHRcdCAqIG9mIGVhY2ggcGl4ZWwgKHdoaXRlIGJlaW5nIHRoZSBoaWdoZXN0KSBpcyBtYXBwZWQgYWdhaW5zdCwgYW5kXHJcblx0XHQgKiByZXBvc2l0aW9ucywgdGhlIHZlcnRpY2VzIG9mIHRoZSBtZXNoLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG93IG11Y2ggdGhlIGRpc3BsYWNlbWVudCBtYXAgYWZmZWN0cyB0aGUgbWVzaCAod2hlcmUgYmxhY2sgaXMgbm9cclxuXHRcdCAqIGRpc3BsYWNlbWVudCwgYW5kIHdoaXRlIGlzIG1heGltdW0gZGlzcGxhY2VtZW50KS4gV2l0aG91dCBhIGRpc3BsYWNlbWVudFxyXG5cdFx0ICogbWFwIHNldCwgdGhpcyB2YWx1ZSBpcyBub3QgYXBwbGllZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBvZmZzZXQgb2YgdGhlIGRpc3BsYWNlbWVudCBtYXAncyB2YWx1ZXMgb24gdGhlIG1lc2gncyB2ZXJ0aWNlcy5cclxuXHRcdCAqIFRoZSBiaWFzIGlzIGFkZGVkIHRvIHRoZSBzY2FsZWQgc2FtcGxlIG9mIHRoZSBkaXNwbGFjZW1lbnQgbWFwLlxyXG5cdFx0ICogV2l0aG91dCBhIGRpc3BsYWNlbWVudCBtYXAgc2V0LCB0aGlzIHZhbHVlIGlzIG5vdCBhcHBsaWVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYWxwaGEgbWFwIGlzIGEgZ3JheXNjYWxlIHRleHR1cmUgdGhhdCBjb250cm9scyB0aGUgb3BhY2l0eSBhY3Jvc3MgdGhlXHJcblx0XHQgKiBzdXJmYWNlIChibGFjazogZnVsbHkgdHJhbnNwYXJlbnQ7IHdoaXRlOiBmdWxseSBvcGFxdWUpLlxyXG5cdFx0ICpcclxuXHRcdCAqIE9ubHkgdGhlIGNvbG9yIG9mIHRoZSB0ZXh0dXJlIGlzIHVzZWQsIGlnbm9yaW5nIHRoZSBhbHBoYSBjaGFubmVsIGlmIG9uZVxyXG5cdFx0ICogZXhpc3RzLiBGb3IgUkdCIGFuZCBSR0JBIHRleHR1cmVzLCB0aGUgcmVuZGVyZXIgd2lsbCB1c2UgdGhlIGdyZWVuIGNoYW5uZWxcclxuXHRcdCAqIHdoZW4gc2FtcGxpbmcgdGhpcyB0ZXh0dXJlIGR1ZSB0byB0aGUgZXh0cmEgYml0IG9mIHByZWNpc2lvbiBwcm92aWRlZCBmb3JcclxuXHRcdCAqIGdyZWVuIGluIERYVC1jb21wcmVzc2VkIGFuZCB1bmNvbXByZXNzZWQgUkdCIDU2NSBmb3JtYXRzLiBMdW1pbmFuY2Utb25seSBhbmRcclxuXHRcdCAqIGx1bWluYW5jZS9hbHBoYSB0ZXh0dXJlcyB3aWxsIGFsc28gc3RpbGwgd29yayBhcyBleHBlY3RlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYWxwaGFNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVuZGVycyB0aGUgZ2VvbWV0cnkgYXMgYSB3aXJlZnJhbWUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLndpcmVmcmFtZSA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQ29udHJvbHMgdGhlIHRoaWNrbmVzcyBvZiB0aGUgd2lyZWZyYW1lLlxyXG5cdFx0ICpcclxuXHRcdCAqIENhbiBvbmx5IGJlIHVzZWQgd2l0aCB7QGxpbmsgU1ZHUmVuZGVyZXJ9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgYXBwZWFyYW5jZSBvZiB3aXJlZnJhbWUgZW5kcy5cclxuXHRcdCAqXHJcblx0XHQgKiBDYW4gb25seSBiZSB1c2VkIHdpdGgge0BsaW5rIFNWR1JlbmRlcmVyfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KCdyb3VuZCd8J2JldmVsJ3wnbWl0ZXInKX1cclxuXHRcdCAqIEBkZWZhdWx0ICdyb3VuZCdcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy53aXJlZnJhbWVMaW5lY2FwID0gJ3JvdW5kJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgYXBwZWFyYW5jZSBvZiB3aXJlZnJhbWUgam9pbnRzLlxyXG5cdFx0ICpcclxuXHRcdCAqIENhbiBvbmx5IGJlIHVzZWQgd2l0aCB7QGxpbmsgU1ZHUmVuZGVyZXJ9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoJ3JvdW5kJ3wnYmV2ZWwnfCdtaXRlcicpfVxyXG5cdFx0ICogQGRlZmF1bHQgJ3JvdW5kJ1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gJ3JvdW5kJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIG1hdGVyaWFsIGlzIGFmZmVjdGVkIGJ5IGZvZyBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZm9nID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xyXG5cclxuXHRcdHRoaXMubWFwID0gc291cmNlLm1hcDtcclxuXHRcdHRoaXMuZ3JhZGllbnRNYXAgPSBzb3VyY2UuZ3JhZGllbnRNYXA7XHJcblxyXG5cdFx0dGhpcy5saWdodE1hcCA9IHNvdXJjZS5saWdodE1hcDtcclxuXHRcdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSBzb3VyY2UubGlnaHRNYXBJbnRlbnNpdHk7XHJcblxyXG5cdFx0dGhpcy5hb01hcCA9IHNvdXJjZS5hb01hcDtcclxuXHRcdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSBzb3VyY2UuYW9NYXBJbnRlbnNpdHk7XHJcblxyXG5cdFx0dGhpcy5lbWlzc2l2ZS5jb3B5KCBzb3VyY2UuZW1pc3NpdmUgKTtcclxuXHRcdHRoaXMuZW1pc3NpdmVNYXAgPSBzb3VyY2UuZW1pc3NpdmVNYXA7XHJcblx0XHR0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ID0gc291cmNlLmVtaXNzaXZlSW50ZW5zaXR5O1xyXG5cclxuXHRcdHRoaXMuYnVtcE1hcCA9IHNvdXJjZS5idW1wTWFwO1xyXG5cdFx0dGhpcy5idW1wU2NhbGUgPSBzb3VyY2UuYnVtcFNjYWxlO1xyXG5cclxuXHRcdHRoaXMubm9ybWFsTWFwID0gc291cmNlLm5vcm1hbE1hcDtcclxuXHRcdHRoaXMubm9ybWFsTWFwVHlwZSA9IHNvdXJjZS5ub3JtYWxNYXBUeXBlO1xyXG5cdFx0dGhpcy5ub3JtYWxTY2FsZS5jb3B5KCBzb3VyY2Uubm9ybWFsU2NhbGUgKTtcclxuXHJcblx0XHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IHNvdXJjZS5kaXNwbGFjZW1lbnRNYXA7XHJcblx0XHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gc291cmNlLmRpc3BsYWNlbWVudFNjYWxlO1xyXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gc291cmNlLmRpc3BsYWNlbWVudEJpYXM7XHJcblxyXG5cdFx0dGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDtcclxuXHJcblx0XHR0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7XHJcblx0XHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7XHJcblx0XHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSBzb3VyY2Uud2lyZWZyYW1lTGluZWNhcDtcclxuXHRcdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSBzb3VyY2Uud2lyZWZyYW1lTGluZWpvaW47XHJcblxyXG5cdFx0dGhpcy5mb2cgPSBzb3VyY2UuZm9nO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBNZXNoVG9vbk1hdGVyaWFsIH07XHJcbiIsImltcG9ydCB7IFRhbmdlbnRTcGFjZU5vcm1hbE1hcCB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IE1hdGVyaWFsIH0gZnJvbSAnLi9NYXRlcmlhbC5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjIuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgbWF0ZXJpYWwgdGhhdCBtYXBzIHRoZSBub3JtYWwgdmVjdG9ycyB0byBSR0IgY29sb3JzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTWF0ZXJpYWxcclxuICovXHJcbmNsYXNzIE1lc2hOb3JtYWxNYXRlcmlhbCBleHRlbmRzIE1hdGVyaWFsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBtZXNoIG5vcm1hbCBtYXRlcmlhbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1ldGVyc10gLSBBbiBvYmplY3Qgd2l0aCBvbmUgb3IgbW9yZSBwcm9wZXJ0aWVzXHJcblx0ICogZGVmaW5pbmcgdGhlIG1hdGVyaWFsJ3MgYXBwZWFyYW5jZS4gQW55IHByb3BlcnR5IG9mIHRoZSBtYXRlcmlhbFxyXG5cdCAqIChpbmNsdWRpbmcgYW55IHByb3BlcnR5IGZyb20gaW5oZXJpdGVkIG1hdGVyaWFscykgY2FuIGJlIHBhc3NlZFxyXG5cdCAqIGluIGhlcmUuIENvbG9yIHZhbHVlcyBjYW4gYmUgcGFzc2VkIGFueSB0eXBlIG9mIHZhbHVlIGFjY2VwdGVkXHJcblx0ICogYnkge0BsaW5rIENvbG9yI3NldH0uXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHBhcmFtZXRlcnMgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNNZXNoTm9ybWFsTWF0ZXJpYWwgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdNZXNoTm9ybWFsTWF0ZXJpYWwnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHRleHR1cmUgdG8gY3JlYXRlIGEgYnVtcCBtYXAuIFRoZSBibGFjayBhbmQgd2hpdGUgdmFsdWVzIG1hcCB0byB0aGVcclxuXHRcdCAqIHBlcmNlaXZlZCBkZXB0aCBpbiByZWxhdGlvbiB0byB0aGUgbGlnaHRzLiBCdW1wIGRvZXNuJ3QgYWN0dWFsbHkgYWZmZWN0XHJcblx0XHQgKiB0aGUgZ2VvbWV0cnkgb2YgdGhlIG9iamVjdCwgb25seSB0aGUgbGlnaHRpbmcuIElmIGEgbm9ybWFsIG1hcCBpcyBkZWZpbmVkXHJcblx0XHQgKiB0aGlzIHdpbGwgYmUgaWdub3JlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYnVtcE1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3cgbXVjaCB0aGUgYnVtcCBtYXAgYWZmZWN0cyB0aGUgbWF0ZXJpYWwuIFR5cGljYWwgcmFuZ2UgaXMgYFswLDFdYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJ1bXBTY2FsZSA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdGV4dHVyZSB0byBjcmVhdGUgYSBub3JtYWwgbWFwLiBUaGUgUkdCIHZhbHVlcyBhZmZlY3QgdGhlIHN1cmZhY2VcclxuXHRcdCAqIG5vcm1hbCBmb3IgZWFjaCBwaXhlbCBmcmFnbWVudCBhbmQgY2hhbmdlIHRoZSB3YXkgdGhlIGNvbG9yIGlzIGxpdC4gTm9ybWFsXHJcblx0XHQgKiBtYXBzIGRvIG5vdCBjaGFuZ2UgdGhlIGFjdHVhbCBzaGFwZSBvZiB0aGUgc3VyZmFjZSwgb25seSB0aGUgbGlnaHRpbmcuIEluXHJcblx0XHQgKiBjYXNlIHRoZSBtYXRlcmlhbCBoYXMgYSBub3JtYWwgbWFwIGF1dGhvcmVkIHVzaW5nIHRoZSBsZWZ0IGhhbmRlZFxyXG5cdFx0ICogY29udmVudGlvbiwgdGhlIGB5YCBjb21wb25lbnQgb2YgYG5vcm1hbFNjYWxlYCBzaG91bGQgYmUgbmVnYXRlZCB0byBjb21wZW5zYXRlXHJcblx0XHQgKiBmb3IgdGhlIGRpZmZlcmVudCBoYW5kZWRuZXNzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub3JtYWxNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHR5cGUgb2Ygbm9ybWFsIG1hcC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KFRhbmdlbnRTcGFjZU5vcm1hbE1hcHxPYmplY3RTcGFjZU5vcm1hbE1hcCl9XHJcblx0XHQgKiBAZGVmYXVsdCBUYW5nZW50U3BhY2VOb3JtYWxNYXBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub3JtYWxNYXBUeXBlID0gVGFuZ2VudFNwYWNlTm9ybWFsTWFwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG93IG11Y2ggdGhlIG5vcm1hbCBtYXAgYWZmZWN0cyB0aGUgbWF0ZXJpYWwuIFR5cGljYWwgdmFsdWUgcmFuZ2UgaXMgYFswLDFdYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yMn1cclxuXHRcdCAqIEBkZWZhdWx0ICgxLDEpXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMiggMSwgMSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGRpc3BsYWNlbWVudCBtYXAgYWZmZWN0cyB0aGUgcG9zaXRpb24gb2YgdGhlIG1lc2gncyB2ZXJ0aWNlcy4gVW5saWtlXHJcblx0XHQgKiBvdGhlciBtYXBzIHdoaWNoIG9ubHkgYWZmZWN0IHRoZSBsaWdodCBhbmQgc2hhZGUgb2YgdGhlIG1hdGVyaWFsIHRoZVxyXG5cdFx0ICogZGlzcGxhY2VkIHZlcnRpY2VzIGNhbiBjYXN0IHNoYWRvd3MsIGJsb2NrIG90aGVyIG9iamVjdHMsIGFuZCBvdGhlcndpc2VcclxuXHRcdCAqIGFjdCBhcyByZWFsIGdlb21ldHJ5LiBUaGUgZGlzcGxhY2VtZW50IHRleHR1cmUgaXMgYW4gaW1hZ2Ugd2hlcmUgdGhlIHZhbHVlXHJcblx0XHQgKiBvZiBlYWNoIHBpeGVsICh3aGl0ZSBiZWluZyB0aGUgaGlnaGVzdCkgaXMgbWFwcGVkIGFnYWluc3QsIGFuZFxyXG5cdFx0ICogcmVwb3NpdGlvbnMsIHRoZSB2ZXJ0aWNlcyBvZiB0aGUgbWVzaC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvdyBtdWNoIHRoZSBkaXNwbGFjZW1lbnQgbWFwIGFmZmVjdHMgdGhlIG1lc2ggKHdoZXJlIGJsYWNrIGlzIG5vXHJcblx0XHQgKiBkaXNwbGFjZW1lbnQsIGFuZCB3aGl0ZSBpcyBtYXhpbXVtIGRpc3BsYWNlbWVudCkuIFdpdGhvdXQgYSBkaXNwbGFjZW1lbnRcclxuXHRcdCAqIG1hcCBzZXQsIHRoaXMgdmFsdWUgaXMgbm90IGFwcGxpZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgb2Zmc2V0IG9mIHRoZSBkaXNwbGFjZW1lbnQgbWFwJ3MgdmFsdWVzIG9uIHRoZSBtZXNoJ3MgdmVydGljZXMuXHJcblx0XHQgKiBUaGUgYmlhcyBpcyBhZGRlZCB0byB0aGUgc2NhbGVkIHNhbXBsZSBvZiB0aGUgZGlzcGxhY2VtZW50IG1hcC5cclxuXHRcdCAqIFdpdGhvdXQgYSBkaXNwbGFjZW1lbnQgbWFwIHNldCwgdGhpcyB2YWx1ZSBpcyBub3QgYXBwbGllZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVuZGVycyB0aGUgZ2VvbWV0cnkgYXMgYSB3aXJlZnJhbWUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLndpcmVmcmFtZSA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQ29udHJvbHMgdGhlIHRoaWNrbmVzcyBvZiB0aGUgd2lyZWZyYW1lLlxyXG5cdFx0ICpcclxuXHRcdCAqIFdlYkdMIGFuZCBXZWJHUFUgaWdub3JlIHRoaXMgcHJvcGVydHkgYW5kIGFsd2F5cyByZW5kZXJcclxuXHRcdCAqIDEgcGl4ZWwgd2lkZSBsaW5lcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSBtYXRlcmlhbCBpcyByZW5kZXJlZCB3aXRoIGZsYXQgc2hhZGluZyBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZsYXRTaGFkaW5nID0gZmFsc2U7XHJcblxyXG5cdFx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy5idW1wTWFwID0gc291cmNlLmJ1bXBNYXA7XHJcblx0XHR0aGlzLmJ1bXBTY2FsZSA9IHNvdXJjZS5idW1wU2NhbGU7XHJcblxyXG5cdFx0dGhpcy5ub3JtYWxNYXAgPSBzb3VyY2Uubm9ybWFsTWFwO1xyXG5cdFx0dGhpcy5ub3JtYWxNYXBUeXBlID0gc291cmNlLm5vcm1hbE1hcFR5cGU7XHJcblx0XHR0aGlzLm5vcm1hbFNjYWxlLmNvcHkoIHNvdXJjZS5ub3JtYWxTY2FsZSApO1xyXG5cclxuXHRcdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gc291cmNlLmRpc3BsYWNlbWVudE1hcDtcclxuXHRcdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSBzb3VyY2UuZGlzcGxhY2VtZW50U2NhbGU7XHJcblx0XHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSBzb3VyY2UuZGlzcGxhY2VtZW50QmlhcztcclxuXHJcblx0XHR0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7XHJcblx0XHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7XHJcblxyXG5cdFx0dGhpcy5mbGF0U2hhZGluZyA9IHNvdXJjZS5mbGF0U2hhZGluZztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgTWVzaE5vcm1hbE1hdGVyaWFsIH07XHJcbiIsImltcG9ydCB7IE11bHRpcGx5T3BlcmF0aW9uLCBUYW5nZW50U3BhY2VOb3JtYWxNYXAgfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBNYXRlcmlhbCB9IGZyb20gJy4vTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IyLmpzJztcclxuaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi9tYXRoL0NvbG9yLmpzJztcclxuaW1wb3J0IHsgRXVsZXIgfSBmcm9tICcuLi9tYXRoL0V1bGVyLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIG1hdGVyaWFsIGZvciBub24tc2hpbnkgc3VyZmFjZXMsIHdpdGhvdXQgc3BlY3VsYXIgaGlnaGxpZ2h0cy5cclxuICpcclxuICogVGhlIG1hdGVyaWFsIHVzZXMgYSBub24tcGh5c2ljYWxseSBiYXNlZCBbTGFtYmVydGlhbl17QGxpbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGFtYmVydGlhbl9yZWZsZWN0YW5jZX1cclxuICogbW9kZWwgZm9yIGNhbGN1bGF0aW5nIHJlZmxlY3RhbmNlLiBUaGlzIGNhbiBzaW11bGF0ZSBzb21lIHN1cmZhY2VzIChzdWNoXHJcbiAqIGFzIHVudHJlYXRlZCB3b29kIG9yIHN0b25lKSB3ZWxsLCBidXQgY2Fubm90IHNpbXVsYXRlIHNoaW55IHN1cmZhY2VzIHdpdGhcclxuICogc3BlY3VsYXIgaGlnaGxpZ2h0cyAoc3VjaCBhcyB2YXJuaXNoZWQgd29vZCkuIGBNZXNoTGFtYmVydE1hdGVyaWFsYCB1c2VzIHBlci1mcmFnbWVudFxyXG4gKiBzaGFkaW5nLlxyXG4gKlxyXG4gKiBEdWUgdG8gdGhlIHNpbXBsaWNpdHkgb2YgdGhlIHJlZmxlY3RhbmNlIGFuZCBpbGx1bWluYXRpb24gbW9kZWxzLFxyXG4gKiBwZXJmb3JtYW5jZSB3aWxsIGJlIGdyZWF0ZXIgd2hlbiB1c2luZyB0aGlzIG1hdGVyaWFsIG92ZXIgdGhlXHJcbiAqIHtAbGluayBNZXNoUGhvbmdNYXRlcmlhbH0sIHtAbGluayBNZXNoU3RhbmRhcmRNYXRlcmlhbH0gb3JcclxuICoge0BsaW5rIE1lc2hQaHlzaWNhbE1hdGVyaWFsfSwgYXQgdGhlIGNvc3Qgb2Ygc29tZSBncmFwaGljYWwgYWNjdXJhY3kuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBNYXRlcmlhbFxyXG4gKi9cclxuY2xhc3MgTWVzaExhbWJlcnRNYXRlcmlhbCBleHRlbmRzIE1hdGVyaWFsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBtZXNoIGxhbWJlcnQgbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtZXRlcnNdIC0gQW4gb2JqZWN0IHdpdGggb25lIG9yIG1vcmUgcHJvcGVydGllc1xyXG5cdCAqIGRlZmluaW5nIHRoZSBtYXRlcmlhbCdzIGFwcGVhcmFuY2UuIEFueSBwcm9wZXJ0eSBvZiB0aGUgbWF0ZXJpYWxcclxuXHQgKiAoaW5jbHVkaW5nIGFueSBwcm9wZXJ0eSBmcm9tIGluaGVyaXRlZCBtYXRlcmlhbHMpIGNhbiBiZSBwYXNzZWRcclxuXHQgKiBpbiBoZXJlLiBDb2xvciB2YWx1ZXMgY2FuIGJlIHBhc3NlZCBhbnkgdHlwZSBvZiB2YWx1ZSBhY2NlcHRlZFxyXG5cdCAqIGJ5IHtAbGluayBDb2xvciNzZXR9LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwYXJhbWV0ZXJzICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzTWVzaExhbWJlcnRNYXRlcmlhbCA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ01lc2hMYW1iZXJ0TWF0ZXJpYWwnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQ29sb3Igb2YgdGhlIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtDb2xvcn1cclxuXHRcdCAqIEBkZWZhdWx0ICgxLDEsMSlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTsgLy8gZGlmZnVzZVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNvbG9yIG1hcC4gTWF5IG9wdGlvbmFsbHkgaW5jbHVkZSBhbiBhbHBoYSBjaGFubmVsLCB0eXBpY2FsbHkgY29tYmluZWRcclxuXHRcdCAqIHdpdGgge0BsaW5rIE1hdGVyaWFsI3RyYW5zcGFyZW50fSBvciB7QGxpbmsgTWF0ZXJpYWwjYWxwaGFUZXN0fS4gVGhlIHRleHR1cmUgbWFwXHJcblx0XHQgKiBjb2xvciBpcyBtb2R1bGF0ZWQgYnkgdGhlIGRpZmZ1c2UgYGNvbG9yYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBsaWdodCBtYXAuIFJlcXVpcmVzIGEgc2Vjb25kIHNldCBvZiBVVnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxpZ2h0TWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEludGVuc2l0eSBvZiB0aGUgYmFrZWQgbGlnaHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5saWdodE1hcEludGVuc2l0eSA9IDEuMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByZWQgY2hhbm5lbCBvZiB0aGlzIHRleHR1cmUgaXMgdXNlZCBhcyB0aGUgYW1iaWVudCBvY2NsdXNpb24gbWFwLlxyXG5cdFx0ICogUmVxdWlyZXMgYSBzZWNvbmQgc2V0IG9mIFVWcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYW9NYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSW50ZW5zaXR5IG9mIHRoZSBhbWJpZW50IG9jY2x1c2lvbiBlZmZlY3QuIFJhbmdlIGlzIGBbMCwxXWAsIHdoZXJlIGAwYFxyXG5cdFx0ICogZGlzYWJsZXMgYW1iaWVudCBvY2NsdXNpb24uIFdoZXJlIGludGVuc2l0eSBpcyBgMWAgYW5kIHRoZSBBTyBtYXAnc1xyXG5cdFx0ICogcmVkIGNoYW5uZWwgaXMgYWxzbyBgMWAsIGFtYmllbnQgbGlnaHQgaXMgZnVsbHkgb2NjbHVkZWQgb24gYSBzdXJmYWNlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSAxLjA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBFbWlzc2l2ZSAobGlnaHQpIGNvbG9yIG9mIHRoZSBtYXRlcmlhbCwgZXNzZW50aWFsbHkgYSBzb2xpZCBjb2xvclxyXG5cdFx0ICogdW5hZmZlY3RlZCBieSBvdGhlciBsaWdodGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Q29sb3J9XHJcblx0XHQgKiBAZGVmYXVsdCAoMCwwLDApXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZW1pc3NpdmUgPSBuZXcgQ29sb3IoIDB4MDAwMDAwICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBJbnRlbnNpdHkgb2YgdGhlIGVtaXNzaXZlIGxpZ2h0LiBNb2R1bGF0ZXMgdGhlIGVtaXNzaXZlIGNvbG9yLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgPSAxLjA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTZXQgZW1pc3NpdmUgKGdsb3cpIG1hcC4gVGhlIGVtaXNzaXZlIG1hcCBjb2xvciBpcyBtb2R1bGF0ZWQgYnkgdGhlXHJcblx0XHQgKiBlbWlzc2l2ZSBjb2xvciBhbmQgdGhlIGVtaXNzaXZlIGludGVuc2l0eS4gSWYgeW91IGhhdmUgYW4gZW1pc3NpdmUgbWFwLFxyXG5cdFx0ICogYmUgc3VyZSB0byBzZXQgdGhlIGVtaXNzaXZlIGNvbG9yIHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIGJsYWNrLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5lbWlzc2l2ZU1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdGV4dHVyZSB0byBjcmVhdGUgYSBidW1wIG1hcC4gVGhlIGJsYWNrIGFuZCB3aGl0ZSB2YWx1ZXMgbWFwIHRvIHRoZVxyXG5cdFx0ICogcGVyY2VpdmVkIGRlcHRoIGluIHJlbGF0aW9uIHRvIHRoZSBsaWdodHMuIEJ1bXAgZG9lc24ndCBhY3R1YWxseSBhZmZlY3RcclxuXHRcdCAqIHRoZSBnZW9tZXRyeSBvZiB0aGUgb2JqZWN0LCBvbmx5IHRoZSBsaWdodGluZy4gSWYgYSBub3JtYWwgbWFwIGlzIGRlZmluZWRcclxuXHRcdCAqIHRoaXMgd2lsbCBiZSBpZ25vcmVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5idW1wTWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvdyBtdWNoIHRoZSBidW1wIG1hcCBhZmZlY3RzIHRoZSBtYXRlcmlhbC4gVHlwaWNhbCByYW5nZSBpcyBgWzAsMV1gLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYnVtcFNjYWxlID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB0ZXh0dXJlIHRvIGNyZWF0ZSBhIG5vcm1hbCBtYXAuIFRoZSBSR0IgdmFsdWVzIGFmZmVjdCB0aGUgc3VyZmFjZVxyXG5cdFx0ICogbm9ybWFsIGZvciBlYWNoIHBpeGVsIGZyYWdtZW50IGFuZCBjaGFuZ2UgdGhlIHdheSB0aGUgY29sb3IgaXMgbGl0LiBOb3JtYWxcclxuXHRcdCAqIG1hcHMgZG8gbm90IGNoYW5nZSB0aGUgYWN0dWFsIHNoYXBlIG9mIHRoZSBzdXJmYWNlLCBvbmx5IHRoZSBsaWdodGluZy4gSW5cclxuXHRcdCAqIGNhc2UgdGhlIG1hdGVyaWFsIGhhcyBhIG5vcm1hbCBtYXAgYXV0aG9yZWQgdXNpbmcgdGhlIGxlZnQgaGFuZGVkXHJcblx0XHQgKiBjb252ZW50aW9uLCB0aGUgYHlgIGNvbXBvbmVudCBvZiBgbm9ybWFsU2NhbGVgIHNob3VsZCBiZSBuZWdhdGVkIHRvIGNvbXBlbnNhdGVcclxuXHRcdCAqIGZvciB0aGUgZGlmZmVyZW50IGhhbmRlZG5lc3MuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vcm1hbE1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdHlwZSBvZiBub3JtYWwgbWFwLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoVGFuZ2VudFNwYWNlTm9ybWFsTWFwfE9iamVjdFNwYWNlTm9ybWFsTWFwKX1cclxuXHRcdCAqIEBkZWZhdWx0IFRhbmdlbnRTcGFjZU5vcm1hbE1hcFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vcm1hbE1hcFR5cGUgPSBUYW5nZW50U3BhY2VOb3JtYWxNYXA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3cgbXVjaCB0aGUgbm9ybWFsIG1hcCBhZmZlY3RzIHRoZSBtYXRlcmlhbC4gVHlwaWNhbCB2YWx1ZSByYW5nZSBpcyBgWzAsMV1gLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3IyfVxyXG5cdFx0ICogQGRlZmF1bHQgKDEsMSlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub3JtYWxTY2FsZSA9IG5ldyBWZWN0b3IyKCAxLCAxICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZGlzcGxhY2VtZW50IG1hcCBhZmZlY3RzIHRoZSBwb3NpdGlvbiBvZiB0aGUgbWVzaCdzIHZlcnRpY2VzLiBVbmxpa2VcclxuXHRcdCAqIG90aGVyIG1hcHMgd2hpY2ggb25seSBhZmZlY3QgdGhlIGxpZ2h0IGFuZCBzaGFkZSBvZiB0aGUgbWF0ZXJpYWwgdGhlXHJcblx0XHQgKiBkaXNwbGFjZWQgdmVydGljZXMgY2FuIGNhc3Qgc2hhZG93cywgYmxvY2sgb3RoZXIgb2JqZWN0cywgYW5kIG90aGVyd2lzZVxyXG5cdFx0ICogYWN0IGFzIHJlYWwgZ2VvbWV0cnkuIFRoZSBkaXNwbGFjZW1lbnQgdGV4dHVyZSBpcyBhbiBpbWFnZSB3aGVyZSB0aGUgdmFsdWVcclxuXHRcdCAqIG9mIGVhY2ggcGl4ZWwgKHdoaXRlIGJlaW5nIHRoZSBoaWdoZXN0KSBpcyBtYXBwZWQgYWdhaW5zdCwgYW5kXHJcblx0XHQgKiByZXBvc2l0aW9ucywgdGhlIHZlcnRpY2VzIG9mIHRoZSBtZXNoLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG93IG11Y2ggdGhlIGRpc3BsYWNlbWVudCBtYXAgYWZmZWN0cyB0aGUgbWVzaCAod2hlcmUgYmxhY2sgaXMgbm9cclxuXHRcdCAqIGRpc3BsYWNlbWVudCwgYW5kIHdoaXRlIGlzIG1heGltdW0gZGlzcGxhY2VtZW50KS4gV2l0aG91dCBhIGRpc3BsYWNlbWVudFxyXG5cdFx0ICogbWFwIHNldCwgdGhpcyB2YWx1ZSBpcyBub3QgYXBwbGllZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBvZmZzZXQgb2YgdGhlIGRpc3BsYWNlbWVudCBtYXAncyB2YWx1ZXMgb24gdGhlIG1lc2gncyB2ZXJ0aWNlcy5cclxuXHRcdCAqIFRoZSBiaWFzIGlzIGFkZGVkIHRvIHRoZSBzY2FsZWQgc2FtcGxlIG9mIHRoZSBkaXNwbGFjZW1lbnQgbWFwLlxyXG5cdFx0ICogV2l0aG91dCBhIGRpc3BsYWNlbWVudCBtYXAgc2V0LCB0aGlzIHZhbHVlIGlzIG5vdCBhcHBsaWVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTcGVjdWxhciBtYXAgdXNlZCBieSB0aGUgbWF0ZXJpYWwuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNwZWN1bGFyTWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBhbHBoYSBtYXAgaXMgYSBncmF5c2NhbGUgdGV4dHVyZSB0aGF0IGNvbnRyb2xzIHRoZSBvcGFjaXR5IGFjcm9zcyB0aGVcclxuXHRcdCAqIHN1cmZhY2UgKGJsYWNrOiBmdWxseSB0cmFuc3BhcmVudDsgd2hpdGU6IGZ1bGx5IG9wYXF1ZSkuXHJcblx0XHQgKlxyXG5cdFx0ICogT25seSB0aGUgY29sb3Igb2YgdGhlIHRleHR1cmUgaXMgdXNlZCwgaWdub3JpbmcgdGhlIGFscGhhIGNoYW5uZWwgaWYgb25lXHJcblx0XHQgKiBleGlzdHMuIEZvciBSR0IgYW5kIFJHQkEgdGV4dHVyZXMsIHRoZSByZW5kZXJlciB3aWxsIHVzZSB0aGUgZ3JlZW4gY2hhbm5lbFxyXG5cdFx0ICogd2hlbiBzYW1wbGluZyB0aGlzIHRleHR1cmUgZHVlIHRvIHRoZSBleHRyYSBiaXQgb2YgcHJlY2lzaW9uIHByb3ZpZGVkIGZvclxyXG5cdFx0ICogZ3JlZW4gaW4gRFhULWNvbXByZXNzZWQgYW5kIHVuY29tcHJlc3NlZCBSR0IgNTY1IGZvcm1hdHMuIEx1bWluYW5jZS1vbmx5IGFuZFxyXG5cdFx0ICogbHVtaW5hbmNlL2FscGhhIHRleHR1cmVzIHdpbGwgYWxzbyBzdGlsbCB3b3JrIGFzIGV4cGVjdGVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hbHBoYU1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZW52aXJvbm1lbnQgbWFwLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5lbnZNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJvdGF0aW9uIG9mIHRoZSBlbnZpcm9ubWVudCBtYXAgaW4gcmFkaWFucy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7RXVsZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAoMCwwLDApXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZW52TWFwUm90YXRpb24gPSBuZXcgRXVsZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvdyB0byBjb21iaW5lIHRoZSByZXN1bHQgb2YgdGhlIHN1cmZhY2UncyBjb2xvciB3aXRoIHRoZSBlbnZpcm9ubWVudCBtYXAsIGlmIGFueS5cclxuXHRcdCAqXHJcblx0XHQgKiBXaGVuIHNldCB0byBgTWl4T3BlcmF0aW9uYCwgdGhlIHtAbGluayBNZXNoQmFzaWNNYXRlcmlhbCNyZWZsZWN0aXZpdHl9IGlzIHVzZWQgdG9cclxuXHRcdCAqIGJsZW5kIGJldHdlZW4gdGhlIHR3byBjb2xvcnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeyhNdWx0aXBseU9wZXJhdGlvbnxNaXhPcGVyYXRpb258QWRkT3BlcmF0aW9uKX1cclxuXHRcdCAqIEBkZWZhdWx0IE11bHRpcGx5T3BlcmF0aW9uXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29tYmluZSA9IE11bHRpcGx5T3BlcmF0aW9uO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG93IG11Y2ggdGhlIGVudmlyb25tZW50IG1hcCBhZmZlY3RzIHRoZSBzdXJmYWNlLlxyXG5cdFx0ICogVGhlIHZhbGlkIHJhbmdlIGlzIGJldHdlZW4gYDBgIChubyByZWZsZWN0aW9ucykgYW5kIGAxYCAoZnVsbCByZWZsZWN0aW9ucykuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yZWZsZWN0aXZpdHkgPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGluZGV4IG9mIHJlZnJhY3Rpb24gKElPUikgb2YgYWlyIChhcHByb3hpbWF0ZWx5IDEpIGRpdmlkZWQgYnkgdGhlXHJcblx0XHQgKiBpbmRleCBvZiByZWZyYWN0aW9uIG9mIHRoZSBtYXRlcmlhbC4gSXQgaXMgdXNlZCB3aXRoIGVudmlyb25tZW50IG1hcHBpbmdcclxuXHRcdCAqIG1vZGVzIHtAbGluayBDdWJlUmVmcmFjdGlvbk1hcHBpbmd9IGFuZCB7QGxpbmsgRXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmd9LlxyXG5cdFx0ICogVGhlIHJlZnJhY3Rpb24gcmF0aW8gc2hvdWxkIG5vdCBleGNlZWQgYDFgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwLjk4XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVmcmFjdGlvblJhdGlvID0gMC45ODtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlbmRlcnMgdGhlIGdlb21ldHJ5IGFzIGEgd2lyZWZyYW1lLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy53aXJlZnJhbWUgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENvbnRyb2xzIHRoZSB0aGlja25lc3Mgb2YgdGhlIHdpcmVmcmFtZS5cclxuXHRcdCAqXHJcblx0XHQgKiBDYW4gb25seSBiZSB1c2VkIHdpdGgge0BsaW5rIFNWR1JlbmRlcmVyfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIGFwcGVhcmFuY2Ugb2Ygd2lyZWZyYW1lIGVuZHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQ2FuIG9ubHkgYmUgdXNlZCB3aXRoIHtAbGluayBTVkdSZW5kZXJlcn0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeygncm91bmQnfCdiZXZlbCd8J21pdGVyJyl9XHJcblx0XHQgKiBAZGVmYXVsdCAncm91bmQnXHJcblx0XHQgKi9cclxuXHRcdHRoaXMud2lyZWZyYW1lTGluZWNhcCA9ICdyb3VuZCc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIGFwcGVhcmFuY2Ugb2Ygd2lyZWZyYW1lIGpvaW50cy5cclxuXHRcdCAqXHJcblx0XHQgKiBDYW4gb25seSBiZSB1c2VkIHdpdGgge0BsaW5rIFNWR1JlbmRlcmVyfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KCdyb3VuZCd8J2JldmVsJ3wnbWl0ZXInKX1cclxuXHRcdCAqIEBkZWZhdWx0ICdyb3VuZCdcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy53aXJlZnJhbWVMaW5lam9pbiA9ICdyb3VuZCc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSBtYXRlcmlhbCBpcyByZW5kZXJlZCB3aXRoIGZsYXQgc2hhZGluZyBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZsYXRTaGFkaW5nID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSBtYXRlcmlhbCBpcyBhZmZlY3RlZCBieSBmb2cgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZvZyA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcclxuXHJcblx0XHR0aGlzLm1hcCA9IHNvdXJjZS5tYXA7XHJcblxyXG5cdFx0dGhpcy5saWdodE1hcCA9IHNvdXJjZS5saWdodE1hcDtcclxuXHRcdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSBzb3VyY2UubGlnaHRNYXBJbnRlbnNpdHk7XHJcblxyXG5cdFx0dGhpcy5hb01hcCA9IHNvdXJjZS5hb01hcDtcclxuXHRcdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSBzb3VyY2UuYW9NYXBJbnRlbnNpdHk7XHJcblxyXG5cdFx0dGhpcy5lbWlzc2l2ZS5jb3B5KCBzb3VyY2UuZW1pc3NpdmUgKTtcclxuXHRcdHRoaXMuZW1pc3NpdmVNYXAgPSBzb3VyY2UuZW1pc3NpdmVNYXA7XHJcblx0XHR0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ID0gc291cmNlLmVtaXNzaXZlSW50ZW5zaXR5O1xyXG5cclxuXHRcdHRoaXMuYnVtcE1hcCA9IHNvdXJjZS5idW1wTWFwO1xyXG5cdFx0dGhpcy5idW1wU2NhbGUgPSBzb3VyY2UuYnVtcFNjYWxlO1xyXG5cclxuXHRcdHRoaXMubm9ybWFsTWFwID0gc291cmNlLm5vcm1hbE1hcDtcclxuXHRcdHRoaXMubm9ybWFsTWFwVHlwZSA9IHNvdXJjZS5ub3JtYWxNYXBUeXBlO1xyXG5cdFx0dGhpcy5ub3JtYWxTY2FsZS5jb3B5KCBzb3VyY2Uubm9ybWFsU2NhbGUgKTtcclxuXHJcblx0XHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IHNvdXJjZS5kaXNwbGFjZW1lbnRNYXA7XHJcblx0XHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gc291cmNlLmRpc3BsYWNlbWVudFNjYWxlO1xyXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gc291cmNlLmRpc3BsYWNlbWVudEJpYXM7XHJcblxyXG5cdFx0dGhpcy5zcGVjdWxhck1hcCA9IHNvdXJjZS5zcGVjdWxhck1hcDtcclxuXHJcblx0XHR0aGlzLmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwO1xyXG5cclxuXHRcdHRoaXMuZW52TWFwID0gc291cmNlLmVudk1hcDtcclxuXHRcdHRoaXMuZW52TWFwUm90YXRpb24uY29weSggc291cmNlLmVudk1hcFJvdGF0aW9uICk7XHJcblx0XHR0aGlzLmNvbWJpbmUgPSBzb3VyY2UuY29tYmluZTtcclxuXHRcdHRoaXMucmVmbGVjdGl2aXR5ID0gc291cmNlLnJlZmxlY3Rpdml0eTtcclxuXHRcdHRoaXMucmVmcmFjdGlvblJhdGlvID0gc291cmNlLnJlZnJhY3Rpb25SYXRpbztcclxuXHJcblx0XHR0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7XHJcblx0XHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7XHJcblx0XHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSBzb3VyY2Uud2lyZWZyYW1lTGluZWNhcDtcclxuXHRcdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSBzb3VyY2Uud2lyZWZyYW1lTGluZWpvaW47XHJcblxyXG5cdFx0dGhpcy5mbGF0U2hhZGluZyA9IHNvdXJjZS5mbGF0U2hhZGluZztcclxuXHJcblx0XHR0aGlzLmZvZyA9IHNvdXJjZS5mb2c7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IE1lc2hMYW1iZXJ0TWF0ZXJpYWwgfTtcclxuIiwiaW1wb3J0IHsgTWF0ZXJpYWwgfSBmcm9tICcuL01hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgQmFzaWNEZXB0aFBhY2tpbmcgfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgbWF0ZXJpYWwgZm9yIGRyYXdpbmcgZ2VvbWV0cnkgYnkgZGVwdGguIERlcHRoIGlzIGJhc2VkIG9mZiBvZiB0aGUgY2FtZXJhXHJcbiAqIG5lYXIgYW5kIGZhciBwbGFuZS4gV2hpdGUgaXMgbmVhcmVzdCwgYmxhY2sgaXMgZmFydGhlc3QuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBNYXRlcmlhbFxyXG4gKi9cclxuY2xhc3MgTWVzaERlcHRoTWF0ZXJpYWwgZXh0ZW5kcyBNYXRlcmlhbCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbWVzaCBkZXB0aCBtYXRlcmlhbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1ldGVyc10gLSBBbiBvYmplY3Qgd2l0aCBvbmUgb3IgbW9yZSBwcm9wZXJ0aWVzXHJcblx0ICogZGVmaW5pbmcgdGhlIG1hdGVyaWFsJ3MgYXBwZWFyYW5jZS4gQW55IHByb3BlcnR5IG9mIHRoZSBtYXRlcmlhbFxyXG5cdCAqIChpbmNsdWRpbmcgYW55IHByb3BlcnR5IGZyb20gaW5oZXJpdGVkIG1hdGVyaWFscykgY2FuIGJlIHBhc3NlZFxyXG5cdCAqIGluIGhlcmUuIENvbG9yIHZhbHVlcyBjYW4gYmUgcGFzc2VkIGFueSB0eXBlIG9mIHZhbHVlIGFjY2VwdGVkXHJcblx0ICogYnkge0BsaW5rIENvbG9yI3NldH0uXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHBhcmFtZXRlcnMgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNNZXNoRGVwdGhNYXRlcmlhbCA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ01lc2hEZXB0aE1hdGVyaWFsJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFR5cGUgZm9yIGRlcHRoIHBhY2tpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeyhCYXNpY0RlcHRoUGFja2luZ3xSR0JBRGVwdGhQYWNraW5nfFJHQkRlcHRoUGFja2luZ3xSR0RlcHRoUGFja2luZyl9XHJcblx0XHQgKiBAZGVmYXVsdCBCYXNpY0RlcHRoUGFja2luZ1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRlcHRoUGFja2luZyA9IEJhc2ljRGVwdGhQYWNraW5nO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNvbG9yIG1hcC4gTWF5IG9wdGlvbmFsbHkgaW5jbHVkZSBhbiBhbHBoYSBjaGFubmVsLCB0eXBpY2FsbHkgY29tYmluZWRcclxuXHRcdCAqIHdpdGgge0BsaW5rIE1hdGVyaWFsI3RyYW5zcGFyZW50fSBvciB7QGxpbmsgTWF0ZXJpYWwjYWxwaGFUZXN0fS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBhbHBoYSBtYXAgaXMgYSBncmF5c2NhbGUgdGV4dHVyZSB0aGF0IGNvbnRyb2xzIHRoZSBvcGFjaXR5IGFjcm9zcyB0aGVcclxuXHRcdCAqIHN1cmZhY2UgKGJsYWNrOiBmdWxseSB0cmFuc3BhcmVudDsgd2hpdGU6IGZ1bGx5IG9wYXF1ZSkuXHJcblx0XHQgKlxyXG5cdFx0ICogT25seSB0aGUgY29sb3Igb2YgdGhlIHRleHR1cmUgaXMgdXNlZCwgaWdub3JpbmcgdGhlIGFscGhhIGNoYW5uZWwgaWYgb25lXHJcblx0XHQgKiBleGlzdHMuIEZvciBSR0IgYW5kIFJHQkEgdGV4dHVyZXMsIHRoZSByZW5kZXJlciB3aWxsIHVzZSB0aGUgZ3JlZW4gY2hhbm5lbFxyXG5cdFx0ICogd2hlbiBzYW1wbGluZyB0aGlzIHRleHR1cmUgZHVlIHRvIHRoZSBleHRyYSBiaXQgb2YgcHJlY2lzaW9uIHByb3ZpZGVkIGZvclxyXG5cdFx0ICogZ3JlZW4gaW4gRFhULWNvbXByZXNzZWQgYW5kIHVuY29tcHJlc3NlZCBSR0IgNTY1IGZvcm1hdHMuIEx1bWluYW5jZS1vbmx5IGFuZFxyXG5cdFx0ICogbHVtaW5hbmNlL2FscGhhIHRleHR1cmVzIHdpbGwgYWxzbyBzdGlsbCB3b3JrIGFzIGV4cGVjdGVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hbHBoYU1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZGlzcGxhY2VtZW50IG1hcCBhZmZlY3RzIHRoZSBwb3NpdGlvbiBvZiB0aGUgbWVzaCdzIHZlcnRpY2VzLiBVbmxpa2VcclxuXHRcdCAqIG90aGVyIG1hcHMgd2hpY2ggb25seSBhZmZlY3QgdGhlIGxpZ2h0IGFuZCBzaGFkZSBvZiB0aGUgbWF0ZXJpYWwgdGhlXHJcblx0XHQgKiBkaXNwbGFjZWQgdmVydGljZXMgY2FuIGNhc3Qgc2hhZG93cywgYmxvY2sgb3RoZXIgb2JqZWN0cywgYW5kIG90aGVyd2lzZVxyXG5cdFx0ICogYWN0IGFzIHJlYWwgZ2VvbWV0cnkuIFRoZSBkaXNwbGFjZW1lbnQgdGV4dHVyZSBpcyBhbiBpbWFnZSB3aGVyZSB0aGUgdmFsdWVcclxuXHRcdCAqIG9mIGVhY2ggcGl4ZWwgKHdoaXRlIGJlaW5nIHRoZSBoaWdoZXN0KSBpcyBtYXBwZWQgYWdhaW5zdCwgYW5kXHJcblx0XHQgKiByZXBvc2l0aW9ucywgdGhlIHZlcnRpY2VzIG9mIHRoZSBtZXNoLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG93IG11Y2ggdGhlIGRpc3BsYWNlbWVudCBtYXAgYWZmZWN0cyB0aGUgbWVzaCAod2hlcmUgYmxhY2sgaXMgbm9cclxuXHRcdCAqIGRpc3BsYWNlbWVudCwgYW5kIHdoaXRlIGlzIG1heGltdW0gZGlzcGxhY2VtZW50KS4gV2l0aG91dCBhIGRpc3BsYWNlbWVudFxyXG5cdFx0ICogbWFwIHNldCwgdGhpcyB2YWx1ZSBpcyBub3QgYXBwbGllZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBvZmZzZXQgb2YgdGhlIGRpc3BsYWNlbWVudCBtYXAncyB2YWx1ZXMgb24gdGhlIG1lc2gncyB2ZXJ0aWNlcy5cclxuXHRcdCAqIFRoZSBiaWFzIGlzIGFkZGVkIHRvIHRoZSBzY2FsZWQgc2FtcGxlIG9mIHRoZSBkaXNwbGFjZW1lbnQgbWFwLlxyXG5cdFx0ICogV2l0aG91dCBhIGRpc3BsYWNlbWVudCBtYXAgc2V0LCB0aGlzIHZhbHVlIGlzIG5vdCBhcHBsaWVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZW5kZXJzIHRoZSBnZW9tZXRyeSBhcyBhIHdpcmVmcmFtZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMud2lyZWZyYW1lID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDb250cm9scyB0aGUgdGhpY2tuZXNzIG9mIHRoZSB3aXJlZnJhbWUuXHJcblx0XHQgKlxyXG5cdFx0ICogV2ViR0wgYW5kIFdlYkdQVSBpZ25vcmUgdGhpcyBwcm9wZXJ0eSBhbmQgYWx3YXlzIHJlbmRlclxyXG5cdFx0ICogMSBwaXhlbCB3aWRlIGxpbmVzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gMTtcclxuXHJcblx0XHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLmRlcHRoUGFja2luZyA9IHNvdXJjZS5kZXB0aFBhY2tpbmc7XHJcblxyXG5cdFx0dGhpcy5tYXAgPSBzb3VyY2UubWFwO1xyXG5cclxuXHRcdHRoaXMuYWxwaGFNYXAgPSBzb3VyY2UuYWxwaGFNYXA7XHJcblxyXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBzb3VyY2UuZGlzcGxhY2VtZW50TWFwO1xyXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHNvdXJjZS5kaXNwbGFjZW1lbnRTY2FsZTtcclxuXHRcdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IHNvdXJjZS5kaXNwbGFjZW1lbnRCaWFzO1xyXG5cclxuXHRcdHRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTtcclxuXHRcdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFtZUxpbmV3aWR0aDtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgTWVzaERlcHRoTWF0ZXJpYWwgfTtcclxuIiwiaW1wb3J0IHsgTWF0ZXJpYWwgfSBmcm9tICcuL01hdGVyaWFsLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIG1hdGVyaWFsIHVzZWQgaW50ZXJuYWxseSBmb3IgaW1wbGVtZW50aW5nIHNoYWRvdyBtYXBwaW5nIHdpdGhcclxuICogcG9pbnQgbGlnaHRzLlxyXG4gKlxyXG4gKiBDYW4gYWxzbyBiZSB1c2VkIHRvIGN1c3RvbWl6ZSB0aGUgc2hhZG93IGNhc3Rpbmcgb2YgYW4gb2JqZWN0IGJ5IGFzc2lnbmluZ1xyXG4gKiBhbiBpbnN0YW5jZSBvZiBgTWVzaERpc3RhbmNlTWF0ZXJpYWxgIHRvIHtAbGluayBPYmplY3QzRCNjdXN0b21EaXN0YW5jZU1hdGVyaWFsfS5cclxuICogVGhlIGZvbGxvd2luZyBleGFtcGxlcyBkZW1vbnN0cmF0ZXMgdGhpcyBhcHByb2FjaCBpbiBvcmRlciB0byBlbnN1cmVcclxuICogdHJhbnNwYXJlbnQgcGFydHMgb2Ygb2JqZWN0cyBkbyBubyBjYXN0IHNoYWRvd3MuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBNYXRlcmlhbFxyXG4gKi9cclxuY2xhc3MgTWVzaERpc3RhbmNlTWF0ZXJpYWwgZXh0ZW5kcyBNYXRlcmlhbCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbWVzaCBkaXN0YW5jZSBtYXRlcmlhbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1ldGVyc10gLSBBbiBvYmplY3Qgd2l0aCBvbmUgb3IgbW9yZSBwcm9wZXJ0aWVzXHJcblx0ICogZGVmaW5pbmcgdGhlIG1hdGVyaWFsJ3MgYXBwZWFyYW5jZS4gQW55IHByb3BlcnR5IG9mIHRoZSBtYXRlcmlhbFxyXG5cdCAqIChpbmNsdWRpbmcgYW55IHByb3BlcnR5IGZyb20gaW5oZXJpdGVkIG1hdGVyaWFscykgY2FuIGJlIHBhc3NlZFxyXG5cdCAqIGluIGhlcmUuIENvbG9yIHZhbHVlcyBjYW4gYmUgcGFzc2VkIGFueSB0eXBlIG9mIHZhbHVlIGFjY2VwdGVkXHJcblx0ICogYnkge0BsaW5rIENvbG9yI3NldH0uXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHBhcmFtZXRlcnMgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNNZXNoRGlzdGFuY2VNYXRlcmlhbCA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ01lc2hEaXN0YW5jZU1hdGVyaWFsJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjb2xvciBtYXAuIE1heSBvcHRpb25hbGx5IGluY2x1ZGUgYW4gYWxwaGEgY2hhbm5lbCwgdHlwaWNhbGx5IGNvbWJpbmVkXHJcblx0XHQgKiB3aXRoIHtAbGluayBNYXRlcmlhbCN0cmFuc3BhcmVudH0gb3Ige0BsaW5rIE1hdGVyaWFsI2FscGhhVGVzdH0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYWxwaGEgbWFwIGlzIGEgZ3JheXNjYWxlIHRleHR1cmUgdGhhdCBjb250cm9scyB0aGUgb3BhY2l0eSBhY3Jvc3MgdGhlXHJcblx0XHQgKiBzdXJmYWNlIChibGFjazogZnVsbHkgdHJhbnNwYXJlbnQ7IHdoaXRlOiBmdWxseSBvcGFxdWUpLlxyXG5cdFx0ICpcclxuXHRcdCAqIE9ubHkgdGhlIGNvbG9yIG9mIHRoZSB0ZXh0dXJlIGlzIHVzZWQsIGlnbm9yaW5nIHRoZSBhbHBoYSBjaGFubmVsIGlmIG9uZVxyXG5cdFx0ICogZXhpc3RzLiBGb3IgUkdCIGFuZCBSR0JBIHRleHR1cmVzLCB0aGUgcmVuZGVyZXIgd2lsbCB1c2UgdGhlIGdyZWVuIGNoYW5uZWxcclxuXHRcdCAqIHdoZW4gc2FtcGxpbmcgdGhpcyB0ZXh0dXJlIGR1ZSB0byB0aGUgZXh0cmEgYml0IG9mIHByZWNpc2lvbiBwcm92aWRlZCBmb3JcclxuXHRcdCAqIGdyZWVuIGluIERYVC1jb21wcmVzc2VkIGFuZCB1bmNvbXByZXNzZWQgUkdCIDU2NSBmb3JtYXRzLiBMdW1pbmFuY2Utb25seSBhbmRcclxuXHRcdCAqIGx1bWluYW5jZS9hbHBoYSB0ZXh0dXJlcyB3aWxsIGFsc28gc3RpbGwgd29yayBhcyBleHBlY3RlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYWxwaGFNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGRpc3BsYWNlbWVudCBtYXAgYWZmZWN0cyB0aGUgcG9zaXRpb24gb2YgdGhlIG1lc2gncyB2ZXJ0aWNlcy4gVW5saWtlXHJcblx0XHQgKiBvdGhlciBtYXBzIHdoaWNoIG9ubHkgYWZmZWN0IHRoZSBsaWdodCBhbmQgc2hhZGUgb2YgdGhlIG1hdGVyaWFsIHRoZVxyXG5cdFx0ICogZGlzcGxhY2VkIHZlcnRpY2VzIGNhbiBjYXN0IHNoYWRvd3MsIGJsb2NrIG90aGVyIG9iamVjdHMsIGFuZCBvdGhlcndpc2VcclxuXHRcdCAqIGFjdCBhcyByZWFsIGdlb21ldHJ5LiBUaGUgZGlzcGxhY2VtZW50IHRleHR1cmUgaXMgYW4gaW1hZ2Ugd2hlcmUgdGhlIHZhbHVlXHJcblx0XHQgKiBvZiBlYWNoIHBpeGVsICh3aGl0ZSBiZWluZyB0aGUgaGlnaGVzdCkgaXMgbWFwcGVkIGFnYWluc3QsIGFuZFxyXG5cdFx0ICogcmVwb3NpdGlvbnMsIHRoZSB2ZXJ0aWNlcyBvZiB0aGUgbWVzaC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvdyBtdWNoIHRoZSBkaXNwbGFjZW1lbnQgbWFwIGFmZmVjdHMgdGhlIG1lc2ggKHdoZXJlIGJsYWNrIGlzIG5vXHJcblx0XHQgKiBkaXNwbGFjZW1lbnQsIGFuZCB3aGl0ZSBpcyBtYXhpbXVtIGRpc3BsYWNlbWVudCkuIFdpdGhvdXQgYSBkaXNwbGFjZW1lbnRcclxuXHRcdCAqIG1hcCBzZXQsIHRoaXMgdmFsdWUgaXMgbm90IGFwcGxpZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgb2Zmc2V0IG9mIHRoZSBkaXNwbGFjZW1lbnQgbWFwJ3MgdmFsdWVzIG9uIHRoZSBtZXNoJ3MgdmVydGljZXMuXHJcblx0XHQgKiBUaGUgYmlhcyBpcyBhZGRlZCB0byB0aGUgc2NhbGVkIHNhbXBsZSBvZiB0aGUgZGlzcGxhY2VtZW50IG1hcC5cclxuXHRcdCAqIFdpdGhvdXQgYSBkaXNwbGFjZW1lbnQgbWFwIHNldCwgdGhpcyB2YWx1ZSBpcyBub3QgYXBwbGllZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSAwO1xyXG5cclxuXHRcdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMubWFwID0gc291cmNlLm1hcDtcclxuXHJcblx0XHR0aGlzLmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwO1xyXG5cclxuXHRcdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gc291cmNlLmRpc3BsYWNlbWVudE1hcDtcclxuXHRcdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSBzb3VyY2UuZGlzcGxhY2VtZW50U2NhbGU7XHJcblx0XHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSBzb3VyY2UuZGlzcGxhY2VtZW50QmlhcztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgTWVzaERpc3RhbmNlTWF0ZXJpYWwgfTtcclxuIiwiaW1wb3J0IHsgVGFuZ2VudFNwYWNlTm9ybWFsTWFwIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgTWF0ZXJpYWwgfSBmcm9tICcuL01hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uL21hdGgvVmVjdG9yMi5qcyc7XHJcbmltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vbWF0aC9Db2xvci5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBtYXRlcmlhbCBpcyBkZWZpbmVkIGJ5IGEgTWF0Q2FwIChvciBMaXQgU3BoZXJlKSB0ZXh0dXJlLCB3aGljaCBlbmNvZGVzIHRoZVxyXG4gKiBtYXRlcmlhbCBjb2xvciBhbmQgc2hhZGluZy5cclxuICpcclxuICogYE1lc2hNYXRjYXBNYXRlcmlhbGAgZG9lcyBub3QgcmVzcG9uZCB0byBsaWdodHMgc2luY2UgdGhlIG1hdGNhcCBpbWFnZSBmaWxlIGVuY29kZXNcclxuICogYmFrZWQgbGlnaHRpbmcuIEl0IHdpbGwgY2FzdCBhIHNoYWRvdyBvbnRvIGFuIG9iamVjdCB0aGF0IHJlY2VpdmVzIHNoYWRvd3NcclxuICogKGFuZCBzaGFkb3cgY2xpcHBpbmcgd29ya3MpLCBidXQgaXQgd2lsbCBub3Qgc2VsZi1zaGFkb3cgb3IgcmVjZWl2ZVxyXG4gKiBzaGFkb3dzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTWF0ZXJpYWxcclxuICovXHJcbmNsYXNzIE1lc2hNYXRjYXBNYXRlcmlhbCBleHRlbmRzIE1hdGVyaWFsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBtZXNoIG1hdGNhcCBtYXRlcmlhbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1ldGVyc10gLSBBbiBvYmplY3Qgd2l0aCBvbmUgb3IgbW9yZSBwcm9wZXJ0aWVzXHJcblx0ICogZGVmaW5pbmcgdGhlIG1hdGVyaWFsJ3MgYXBwZWFyYW5jZS4gQW55IHByb3BlcnR5IG9mIHRoZSBtYXRlcmlhbFxyXG5cdCAqIChpbmNsdWRpbmcgYW55IHByb3BlcnR5IGZyb20gaW5oZXJpdGVkIG1hdGVyaWFscykgY2FuIGJlIHBhc3NlZFxyXG5cdCAqIGluIGhlcmUuIENvbG9yIHZhbHVlcyBjYW4gYmUgcGFzc2VkIGFueSB0eXBlIG9mIHZhbHVlIGFjY2VwdGVkXHJcblx0ICogYnkge0BsaW5rIENvbG9yI3NldH0uXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHBhcmFtZXRlcnMgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNNZXNoTWF0Y2FwTWF0ZXJpYWwgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMuZGVmaW5lcyA9IHsgJ01BVENBUCc6ICcnIH07XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ01lc2hNYXRjYXBNYXRlcmlhbCc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDb2xvciBvZiB0aGUgbWF0ZXJpYWwuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0NvbG9yfVxyXG5cdFx0ICogQGRlZmF1bHQgKDEsMSwxKVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCAweGZmZmZmZiApOyAvLyBkaWZmdXNlXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbWF0Y2FwIG1hcC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWF0Y2FwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjb2xvciBtYXAuIE1heSBvcHRpb25hbGx5IGluY2x1ZGUgYW4gYWxwaGEgY2hhbm5lbCwgdHlwaWNhbGx5IGNvbWJpbmVkXHJcblx0XHQgKiB3aXRoIHtAbGluayBNYXRlcmlhbCN0cmFuc3BhcmVudH0gb3Ige0BsaW5rIE1hdGVyaWFsI2FscGhhVGVzdH0uIFRoZSB0ZXh0dXJlIG1hcFxyXG5cdFx0ICogY29sb3IgaXMgbW9kdWxhdGVkIGJ5IHRoZSBkaWZmdXNlIGBjb2xvcmAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdGV4dHVyZSB0byBjcmVhdGUgYSBidW1wIG1hcC4gVGhlIGJsYWNrIGFuZCB3aGl0ZSB2YWx1ZXMgbWFwIHRvIHRoZVxyXG5cdFx0ICogcGVyY2VpdmVkIGRlcHRoIGluIHJlbGF0aW9uIHRvIHRoZSBsaWdodHMuIEJ1bXAgZG9lc24ndCBhY3R1YWxseSBhZmZlY3RcclxuXHRcdCAqIHRoZSBnZW9tZXRyeSBvZiB0aGUgb2JqZWN0LCBvbmx5IHRoZSBsaWdodGluZy4gSWYgYSBub3JtYWwgbWFwIGlzIGRlZmluZWRcclxuXHRcdCAqIHRoaXMgd2lsbCBiZSBpZ25vcmVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5idW1wTWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvdyBtdWNoIHRoZSBidW1wIG1hcCBhZmZlY3RzIHRoZSBtYXRlcmlhbC4gVHlwaWNhbCByYW5nZSBpcyBgWzAsMV1gLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYnVtcFNjYWxlID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB0ZXh0dXJlIHRvIGNyZWF0ZSBhIG5vcm1hbCBtYXAuIFRoZSBSR0IgdmFsdWVzIGFmZmVjdCB0aGUgc3VyZmFjZVxyXG5cdFx0ICogbm9ybWFsIGZvciBlYWNoIHBpeGVsIGZyYWdtZW50IGFuZCBjaGFuZ2UgdGhlIHdheSB0aGUgY29sb3IgaXMgbGl0LiBOb3JtYWxcclxuXHRcdCAqIG1hcHMgZG8gbm90IGNoYW5nZSB0aGUgYWN0dWFsIHNoYXBlIG9mIHRoZSBzdXJmYWNlLCBvbmx5IHRoZSBsaWdodGluZy4gSW5cclxuXHRcdCAqIGNhc2UgdGhlIG1hdGVyaWFsIGhhcyBhIG5vcm1hbCBtYXAgYXV0aG9yZWQgdXNpbmcgdGhlIGxlZnQgaGFuZGVkXHJcblx0XHQgKiBjb252ZW50aW9uLCB0aGUgYHlgIGNvbXBvbmVudCBvZiBgbm9ybWFsU2NhbGVgIHNob3VsZCBiZSBuZWdhdGVkIHRvIGNvbXBlbnNhdGVcclxuXHRcdCAqIGZvciB0aGUgZGlmZmVyZW50IGhhbmRlZG5lc3MuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vcm1hbE1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdHlwZSBvZiBub3JtYWwgbWFwLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoVGFuZ2VudFNwYWNlTm9ybWFsTWFwfE9iamVjdFNwYWNlTm9ybWFsTWFwKX1cclxuXHRcdCAqIEBkZWZhdWx0IFRhbmdlbnRTcGFjZU5vcm1hbE1hcFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vcm1hbE1hcFR5cGUgPSBUYW5nZW50U3BhY2VOb3JtYWxNYXA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3cgbXVjaCB0aGUgbm9ybWFsIG1hcCBhZmZlY3RzIHRoZSBtYXRlcmlhbC4gVHlwaWNhbCB2YWx1ZSByYW5nZSBpcyBgWzAsMV1gLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3IyfVxyXG5cdFx0ICogQGRlZmF1bHQgKDEsMSlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub3JtYWxTY2FsZSA9IG5ldyBWZWN0b3IyKCAxLCAxICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZGlzcGxhY2VtZW50IG1hcCBhZmZlY3RzIHRoZSBwb3NpdGlvbiBvZiB0aGUgbWVzaCdzIHZlcnRpY2VzLiBVbmxpa2VcclxuXHRcdCAqIG90aGVyIG1hcHMgd2hpY2ggb25seSBhZmZlY3QgdGhlIGxpZ2h0IGFuZCBzaGFkZSBvZiB0aGUgbWF0ZXJpYWwgdGhlXHJcblx0XHQgKiBkaXNwbGFjZWQgdmVydGljZXMgY2FuIGNhc3Qgc2hhZG93cywgYmxvY2sgb3RoZXIgb2JqZWN0cywgYW5kIG90aGVyd2lzZVxyXG5cdFx0ICogYWN0IGFzIHJlYWwgZ2VvbWV0cnkuIFRoZSBkaXNwbGFjZW1lbnQgdGV4dHVyZSBpcyBhbiBpbWFnZSB3aGVyZSB0aGUgdmFsdWVcclxuXHRcdCAqIG9mIGVhY2ggcGl4ZWwgKHdoaXRlIGJlaW5nIHRoZSBoaWdoZXN0KSBpcyBtYXBwZWQgYWdhaW5zdCwgYW5kXHJcblx0XHQgKiByZXBvc2l0aW9ucywgdGhlIHZlcnRpY2VzIG9mIHRoZSBtZXNoLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG93IG11Y2ggdGhlIGRpc3BsYWNlbWVudCBtYXAgYWZmZWN0cyB0aGUgbWVzaCAod2hlcmUgYmxhY2sgaXMgbm9cclxuXHRcdCAqIGRpc3BsYWNlbWVudCwgYW5kIHdoaXRlIGlzIG1heGltdW0gZGlzcGxhY2VtZW50KS4gV2l0aG91dCBhIGRpc3BsYWNlbWVudFxyXG5cdFx0ICogbWFwIHNldCwgdGhpcyB2YWx1ZSBpcyBub3QgYXBwbGllZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBvZmZzZXQgb2YgdGhlIGRpc3BsYWNlbWVudCBtYXAncyB2YWx1ZXMgb24gdGhlIG1lc2gncyB2ZXJ0aWNlcy5cclxuXHRcdCAqIFRoZSBiaWFzIGlzIGFkZGVkIHRvIHRoZSBzY2FsZWQgc2FtcGxlIG9mIHRoZSBkaXNwbGFjZW1lbnQgbWFwLlxyXG5cdFx0ICogV2l0aG91dCBhIGRpc3BsYWNlbWVudCBtYXAgc2V0LCB0aGlzIHZhbHVlIGlzIG5vdCBhcHBsaWVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYWxwaGEgbWFwIGlzIGEgZ3JheXNjYWxlIHRleHR1cmUgdGhhdCBjb250cm9scyB0aGUgb3BhY2l0eSBhY3Jvc3MgdGhlXHJcblx0XHQgKiBzdXJmYWNlIChibGFjazogZnVsbHkgdHJhbnNwYXJlbnQ7IHdoaXRlOiBmdWxseSBvcGFxdWUpLlxyXG5cdFx0ICpcclxuXHRcdCAqIE9ubHkgdGhlIGNvbG9yIG9mIHRoZSB0ZXh0dXJlIGlzIHVzZWQsIGlnbm9yaW5nIHRoZSBhbHBoYSBjaGFubmVsIGlmIG9uZVxyXG5cdFx0ICogZXhpc3RzLiBGb3IgUkdCIGFuZCBSR0JBIHRleHR1cmVzLCB0aGUgcmVuZGVyZXIgd2lsbCB1c2UgdGhlIGdyZWVuIGNoYW5uZWxcclxuXHRcdCAqIHdoZW4gc2FtcGxpbmcgdGhpcyB0ZXh0dXJlIGR1ZSB0byB0aGUgZXh0cmEgYml0IG9mIHByZWNpc2lvbiBwcm92aWRlZCBmb3JcclxuXHRcdCAqIGdyZWVuIGluIERYVC1jb21wcmVzc2VkIGFuZCB1bmNvbXByZXNzZWQgUkdCIDU2NSBmb3JtYXRzLiBMdW1pbmFuY2Utb25seSBhbmRcclxuXHRcdCAqIGx1bWluYW5jZS9hbHBoYSB0ZXh0dXJlcyB3aWxsIGFsc28gc3RpbGwgd29yayBhcyBleHBlY3RlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYWxwaGFNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgbWF0ZXJpYWwgaXMgcmVuZGVyZWQgd2l0aCBmbGF0IHNoYWRpbmcgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5mbGF0U2hhZGluZyA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgbWF0ZXJpYWwgaXMgYWZmZWN0ZWQgYnkgZm9nIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5mb2cgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XHJcblxyXG5cdH1cclxuXHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLmRlZmluZXMgPSB7ICdNQVRDQVAnOiAnJyB9O1xyXG5cclxuXHRcdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XHJcblxyXG5cdFx0dGhpcy5tYXRjYXAgPSBzb3VyY2UubWF0Y2FwO1xyXG5cclxuXHRcdHRoaXMubWFwID0gc291cmNlLm1hcDtcclxuXHJcblx0XHR0aGlzLmJ1bXBNYXAgPSBzb3VyY2UuYnVtcE1hcDtcclxuXHRcdHRoaXMuYnVtcFNjYWxlID0gc291cmNlLmJ1bXBTY2FsZTtcclxuXHJcblx0XHR0aGlzLm5vcm1hbE1hcCA9IHNvdXJjZS5ub3JtYWxNYXA7XHJcblx0XHR0aGlzLm5vcm1hbE1hcFR5cGUgPSBzb3VyY2Uubm9ybWFsTWFwVHlwZTtcclxuXHRcdHRoaXMubm9ybWFsU2NhbGUuY29weSggc291cmNlLm5vcm1hbFNjYWxlICk7XHJcblxyXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBzb3VyY2UuZGlzcGxhY2VtZW50TWFwO1xyXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHNvdXJjZS5kaXNwbGFjZW1lbnRTY2FsZTtcclxuXHRcdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IHNvdXJjZS5kaXNwbGFjZW1lbnRCaWFzO1xyXG5cclxuXHRcdHRoaXMuYWxwaGFNYXAgPSBzb3VyY2UuYWxwaGFNYXA7XHJcblxyXG5cdFx0dGhpcy5mbGF0U2hhZGluZyA9IHNvdXJjZS5mbGF0U2hhZGluZztcclxuXHJcblx0XHR0aGlzLmZvZyA9IHNvdXJjZS5mb2c7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IE1lc2hNYXRjYXBNYXRlcmlhbCB9O1xyXG4iLCJpbXBvcnQgeyBMaW5lQmFzaWNNYXRlcmlhbCB9IGZyb20gJy4vTGluZUJhc2ljTWF0ZXJpYWwuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgbWF0ZXJpYWwgZm9yIHJlbmRlcmluZyBsaW5lIHByaW1pdGl2ZXMuXHJcbiAqXHJcbiAqIE1hdGVyaWFscyBkZWZpbmUgdGhlIGFwcGVhcmFuY2Ugb2YgcmVuZGVyYWJsZSAzRCBvYmplY3RzLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBtYXRlcmlhbCA9IG5ldyBUSFJFRS5MaW5lRGFzaGVkTWF0ZXJpYWwoIHtcclxuICogXHRjb2xvcjogMHhmZmZmZmYsXHJcbiAqIFx0c2NhbGU6IDEsXHJcbiAqIFx0ZGFzaFNpemU6IDMsXHJcbiAqIFx0Z2FwU2l6ZTogMSxcclxuICogfSApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIExpbmVCYXNpY01hdGVyaWFsXHJcbiAqL1xyXG5jbGFzcyBMaW5lRGFzaGVkTWF0ZXJpYWwgZXh0ZW5kcyBMaW5lQmFzaWNNYXRlcmlhbCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbGluZSBkYXNoZWQgbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtZXRlcnNdIC0gQW4gb2JqZWN0IHdpdGggb25lIG9yIG1vcmUgcHJvcGVydGllc1xyXG5cdCAqIGRlZmluaW5nIHRoZSBtYXRlcmlhbCdzIGFwcGVhcmFuY2UuIEFueSBwcm9wZXJ0eSBvZiB0aGUgbWF0ZXJpYWxcclxuXHQgKiAoaW5jbHVkaW5nIGFueSBwcm9wZXJ0eSBmcm9tIGluaGVyaXRlZCBtYXRlcmlhbHMpIGNhbiBiZSBwYXNzZWRcclxuXHQgKiBpbiBoZXJlLiBDb2xvciB2YWx1ZXMgY2FuIGJlIHBhc3NlZCBhbnkgdHlwZSBvZiB2YWx1ZSBhY2NlcHRlZFxyXG5cdCAqIGJ5IHtAbGluayBDb2xvciNzZXR9LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwYXJhbWV0ZXJzICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzTGluZURhc2hlZE1hdGVyaWFsID0gdHJ1ZTtcclxuXHRcdHRoaXMudHlwZSA9ICdMaW5lRGFzaGVkTWF0ZXJpYWwnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHNjYWxlIG9mIHRoZSBkYXNoZWQgcGFydCBvZiBhIGxpbmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zY2FsZSA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc2l6ZSBvZiB0aGUgZGFzaC4gVGhpcyBpcyBib3RoIHRoZSBnYXAgd2l0aCB0aGUgc3Ryb2tlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAzXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGFzaFNpemUgPSAzO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHNpemUgb2YgdGhlIGdhcC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdhcFNpemUgPSAxO1xyXG5cclxuXHRcdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMuc2NhbGUgPSBzb3VyY2Uuc2NhbGU7XHJcblx0XHR0aGlzLmRhc2hTaXplID0gc291cmNlLmRhc2hTaXplO1xyXG5cdFx0dGhpcy5nYXBTaXplID0gc291cmNlLmdhcFNpemU7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IExpbmVEYXNoZWRNYXRlcmlhbCB9O1xyXG4iLCJpbXBvcnQgeyBRdWF0ZXJuaW9uIH0gZnJvbSAnLi4vbWF0aC9RdWF0ZXJuaW9uLmpzJztcclxuaW1wb3J0IHsgQWRkaXRpdmVBbmltYXRpb25CbGVuZE1vZGUgfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xyXG5cclxuLyoqXHJcbiAqIENvbnZlcnRzIGFuIGFycmF5IHRvIGEgc3BlY2lmaWMgdHlwZS5cclxuICpcclxuICogQHBhcmFtIHtUeXBlZEFycmF5fEFycmF5fSBhcnJheSAtIFRoZSBhcnJheSB0byBjb252ZXJ0LlxyXG4gKiBAcGFyYW0ge1R5cGVkQXJyYXkuY29uc3RydWN0b3J9IHR5cGUgLSBUaGUgY29uc3RydWN0b3Igb2YgYSB0eXBlZCBhcnJheSB0aGF0IGRlZmluZXMgdGhlIG5ldyB0eXBlLlxyXG4gKiBAcmV0dXJuIHtUeXBlZEFycmF5fSBUaGUgY29udmVydGVkIGFycmF5LlxyXG4gKi9cclxuZnVuY3Rpb24gY29udmVydEFycmF5KCBhcnJheSwgdHlwZSApIHtcclxuXHJcblx0aWYgKCAhIGFycmF5IHx8IGFycmF5LmNvbnN0cnVjdG9yID09PSB0eXBlICkgcmV0dXJuIGFycmF5O1xyXG5cclxuXHRpZiAoIHR5cGVvZiB0eXBlLkJZVEVTX1BFUl9FTEVNRU5UID09PSAnbnVtYmVyJyApIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IHR5cGUoIGFycmF5ICk7IC8vIGNyZWF0ZSB0eXBlZCBhcnJheVxyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggYXJyYXkgKTsgLy8gY3JlYXRlIEFycmF5XHJcblxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIG9iamVjdCBpcyBhIHR5cGVkIGFycmF5LlxyXG4gKlxyXG4gKiBAcGFyYW0ge2FueX0gb2JqZWN0IC0gVGhlIG9iamVjdCB0byBjaGVjay5cclxuICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGEgdHlwZWQgYXJyYXkuXHJcbiAqL1xyXG5mdW5jdGlvbiBpc1R5cGVkQXJyYXkoIG9iamVjdCApIHtcclxuXHJcblx0cmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyggb2JqZWN0ICkgJiYgISAoIG9iamVjdCBpbnN0YW5jZW9mIERhdGFWaWV3ICk7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhbiBhcnJheSBieSB3aGljaCB0aW1lcyBhbmQgdmFsdWVzIGNhbiBiZSBzb3J0ZWQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gdGltZXMgLSBUaGUga2V5ZnJhbWUgdGltZSB2YWx1ZXMuXHJcbiAqIEByZXR1cm4ge0FycmF5PG51bWJlcj59IFRoZSBhcnJheS5cclxuICovXHJcbmZ1bmN0aW9uIGdldEtleWZyYW1lT3JkZXIoIHRpbWVzICkge1xyXG5cclxuXHRmdW5jdGlvbiBjb21wYXJlVGltZSggaSwgaiApIHtcclxuXHJcblx0XHRyZXR1cm4gdGltZXNbIGkgXSAtIHRpbWVzWyBqIF07XHJcblxyXG5cdH1cclxuXHJcblx0Y29uc3QgbiA9IHRpbWVzLmxlbmd0aDtcclxuXHRjb25zdCByZXN1bHQgPSBuZXcgQXJyYXkoIG4gKTtcclxuXHRmb3IgKCBsZXQgaSA9IDA7IGkgIT09IG47ICsrIGkgKSByZXN1bHRbIGkgXSA9IGk7XHJcblxyXG5cdHJlc3VsdC5zb3J0KCBjb21wYXJlVGltZSApO1xyXG5cclxuXHRyZXR1cm4gcmVzdWx0O1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFNvcnRzIHRoZSBnaXZlbiBhcnJheSBieSB0aGUgcHJldmlvdXNseSBjb21wdXRlZCBvcmRlciB2aWEgYGdldEtleWZyYW1lT3JkZXIoKWAuXHJcbiAqXHJcbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gdmFsdWVzIC0gVGhlIHZhbHVlcyB0byBzb3J0LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gc3RyaWRlIC0gVGhlIHN0cmlkZS5cclxuICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBvcmRlciAtIFRoZSBzb3J0IG9yZGVyLlxyXG4gKiBAcmV0dXJuIHtBcnJheTxudW1iZXI+fSBUaGUgc29ydGVkIHZhbHVlcy5cclxuICovXHJcbmZ1bmN0aW9uIHNvcnRlZEFycmF5KCB2YWx1ZXMsIHN0cmlkZSwgb3JkZXIgKSB7XHJcblxyXG5cdGNvbnN0IG5WYWx1ZXMgPSB2YWx1ZXMubGVuZ3RoO1xyXG5cdGNvbnN0IHJlc3VsdCA9IG5ldyB2YWx1ZXMuY29uc3RydWN0b3IoIG5WYWx1ZXMgKTtcclxuXHJcblx0Zm9yICggbGV0IGkgPSAwLCBkc3RPZmZzZXQgPSAwOyBkc3RPZmZzZXQgIT09IG5WYWx1ZXM7ICsrIGkgKSB7XHJcblxyXG5cdFx0Y29uc3Qgc3JjT2Zmc2V0ID0gb3JkZXJbIGkgXSAqIHN0cmlkZTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaiA9IDA7IGogIT09IHN0cmlkZTsgKysgaiApIHtcclxuXHJcblx0XHRcdHJlc3VsdFsgZHN0T2Zmc2V0ICsrIF0gPSB2YWx1ZXNbIHNyY09mZnNldCArIGogXTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIHJlc3VsdDtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBVc2VkIGZvciBwYXJzaW5nIEFPUyBrZXlmcmFtZSBmb3JtYXRzLlxyXG4gKlxyXG4gKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IGpzb25LZXlzIC0gQSBsaXN0IG9mIEpTT04ga2V5ZnJhbWVzLlxyXG4gKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IHRpbWVzIC0gVGhpcyBhcnJheSB3aWxsIGJlIGZpbGxlZCB3aXRoIGtleWZyYW1lIHRpbWVzIGJ5IHRoaXMgZnVuY3Rpb24uXHJcbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gdmFsdWVzIC0gVGhpcyBhcnJheSB3aWxsIGJlIGZpbGxlZCB3aXRoIGtleWZyYW1lIHZhbHVlcyBieSB0aGlzIGZ1bmN0aW9uLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVQcm9wZXJ0eU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gdXNlLlxyXG4gKi9cclxuZnVuY3Rpb24gZmxhdHRlbkpTT04oIGpzb25LZXlzLCB0aW1lcywgdmFsdWVzLCB2YWx1ZVByb3BlcnR5TmFtZSApIHtcclxuXHJcblx0bGV0IGkgPSAxLCBrZXkgPSBqc29uS2V5c1sgMCBdO1xyXG5cclxuXHR3aGlsZSAoIGtleSAhPT0gdW5kZWZpbmVkICYmIGtleVsgdmFsdWVQcm9wZXJ0eU5hbWUgXSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdGtleSA9IGpzb25LZXlzWyBpICsrIF07XHJcblxyXG5cdH1cclxuXHJcblx0aWYgKCBrZXkgPT09IHVuZGVmaW5lZCApIHJldHVybjsgLy8gbm8gZGF0YVxyXG5cclxuXHRsZXQgdmFsdWUgPSBrZXlbIHZhbHVlUHJvcGVydHlOYW1lIF07XHJcblx0aWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgcmV0dXJuOyAvLyBubyBkYXRhXHJcblxyXG5cdGlmICggQXJyYXkuaXNBcnJheSggdmFsdWUgKSApIHtcclxuXHJcblx0XHRkbyB7XHJcblxyXG5cdFx0XHR2YWx1ZSA9IGtleVsgdmFsdWVQcm9wZXJ0eU5hbWUgXTtcclxuXHJcblx0XHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0dGltZXMucHVzaCgga2V5LnRpbWUgKTtcclxuXHRcdFx0XHR2YWx1ZXMucHVzaCggLi4udmFsdWUgKTsgLy8gcHVzaCBhbGwgZWxlbWVudHNcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGtleSA9IGpzb25LZXlzWyBpICsrIF07XHJcblxyXG5cdFx0fSB3aGlsZSAoIGtleSAhPT0gdW5kZWZpbmVkICk7XHJcblxyXG5cdH0gZWxzZSBpZiAoIHZhbHVlLnRvQXJyYXkgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHQvLyAuLi5hc3N1bWUgVEhSRUUuTWF0aC1pc2hcclxuXHJcblx0XHRkbyB7XHJcblxyXG5cdFx0XHR2YWx1ZSA9IGtleVsgdmFsdWVQcm9wZXJ0eU5hbWUgXTtcclxuXHJcblx0XHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0dGltZXMucHVzaCgga2V5LnRpbWUgKTtcclxuXHRcdFx0XHR2YWx1ZS50b0FycmF5KCB2YWx1ZXMsIHZhbHVlcy5sZW5ndGggKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGtleSA9IGpzb25LZXlzWyBpICsrIF07XHJcblxyXG5cdFx0fSB3aGlsZSAoIGtleSAhPT0gdW5kZWZpbmVkICk7XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0Ly8gb3RoZXJ3aXNlIHB1c2ggYXMtaXNcclxuXHJcblx0XHRkbyB7XHJcblxyXG5cdFx0XHR2YWx1ZSA9IGtleVsgdmFsdWVQcm9wZXJ0eU5hbWUgXTtcclxuXHJcblx0XHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0dGltZXMucHVzaCgga2V5LnRpbWUgKTtcclxuXHRcdFx0XHR2YWx1ZXMucHVzaCggdmFsdWUgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGtleSA9IGpzb25LZXlzWyBpICsrIF07XHJcblxyXG5cdFx0fSB3aGlsZSAoIGtleSAhPT0gdW5kZWZpbmVkICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IGNsaXAsIGNvbnRhaW5pbmcgb25seSB0aGUgc2VnbWVudCBvZiB0aGUgb3JpZ2luYWwgY2xpcCBiZXR3ZWVuIHRoZSBnaXZlbiBmcmFtZXMuXHJcbiAqXHJcbiAqIEBwYXJhbSB7QW5pbWF0aW9uQ2xpcH0gc291cmNlQ2xpcCAtIFRoZSB2YWx1ZXMgdG8gc29ydC5cclxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgY2xpcC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0RnJhbWUgLSBUaGUgc3RhcnQgZnJhbWUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBlbmRGcmFtZSAtIFRoZSBlbmQgZnJhbWUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbZnBzPTMwXSAtIFRoZSBGUFMuXHJcbiAqIEByZXR1cm4ge0FuaW1hdGlvbkNsaXB9IFRoZSBuZXcgc3ViIGNsaXAuXHJcbiAqL1xyXG5mdW5jdGlvbiBzdWJjbGlwKCBzb3VyY2VDbGlwLCBuYW1lLCBzdGFydEZyYW1lLCBlbmRGcmFtZSwgZnBzID0gMzAgKSB7XHJcblxyXG5cdGNvbnN0IGNsaXAgPSBzb3VyY2VDbGlwLmNsb25lKCk7XHJcblxyXG5cdGNsaXAubmFtZSA9IG5hbWU7XHJcblxyXG5cdGNvbnN0IHRyYWNrcyA9IFtdO1xyXG5cclxuXHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBjbGlwLnRyYWNrcy5sZW5ndGg7ICsrIGkgKSB7XHJcblxyXG5cdFx0Y29uc3QgdHJhY2sgPSBjbGlwLnRyYWNrc1sgaSBdO1xyXG5cdFx0Y29uc3QgdmFsdWVTaXplID0gdHJhY2suZ2V0VmFsdWVTaXplKCk7XHJcblxyXG5cdFx0Y29uc3QgdGltZXMgPSBbXTtcclxuXHRcdGNvbnN0IHZhbHVlcyA9IFtdO1xyXG5cclxuXHRcdGZvciAoIGxldCBqID0gMDsgaiA8IHRyYWNrLnRpbWVzLmxlbmd0aDsgKysgaiApIHtcclxuXHJcblx0XHRcdGNvbnN0IGZyYW1lID0gdHJhY2sudGltZXNbIGogXSAqIGZwcztcclxuXHJcblx0XHRcdGlmICggZnJhbWUgPCBzdGFydEZyYW1lIHx8IGZyYW1lID49IGVuZEZyYW1lICkgY29udGludWU7XHJcblxyXG5cdFx0XHR0aW1lcy5wdXNoKCB0cmFjay50aW1lc1sgaiBdICk7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgayA9IDA7IGsgPCB2YWx1ZVNpemU7ICsrIGsgKSB7XHJcblxyXG5cdFx0XHRcdHZhbHVlcy5wdXNoKCB0cmFjay52YWx1ZXNbIGogKiB2YWx1ZVNpemUgKyBrIF0gKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aW1lcy5sZW5ndGggPT09IDAgKSBjb250aW51ZTtcclxuXHJcblx0XHR0cmFjay50aW1lcyA9IGNvbnZlcnRBcnJheSggdGltZXMsIHRyYWNrLnRpbWVzLmNvbnN0cnVjdG9yICk7XHJcblx0XHR0cmFjay52YWx1ZXMgPSBjb252ZXJ0QXJyYXkoIHZhbHVlcywgdHJhY2sudmFsdWVzLmNvbnN0cnVjdG9yICk7XHJcblxyXG5cdFx0dHJhY2tzLnB1c2goIHRyYWNrICk7XHJcblxyXG5cdH1cclxuXHJcblx0Y2xpcC50cmFja3MgPSB0cmFja3M7XHJcblxyXG5cdC8vIGZpbmQgbWluaW11bSAudGltZXMgdmFsdWUgYWNyb3NzIGFsbCB0cmFja3MgaW4gdGhlIHRyaW1tZWQgY2xpcFxyXG5cclxuXHRsZXQgbWluU3RhcnRUaW1lID0gSW5maW5pdHk7XHJcblxyXG5cdGZvciAoIGxldCBpID0gMDsgaSA8IGNsaXAudHJhY2tzLmxlbmd0aDsgKysgaSApIHtcclxuXHJcblx0XHRpZiAoIG1pblN0YXJ0VGltZSA+IGNsaXAudHJhY2tzWyBpIF0udGltZXNbIDAgXSApIHtcclxuXHJcblx0XHRcdG1pblN0YXJ0VGltZSA9IGNsaXAudHJhY2tzWyBpIF0udGltZXNbIDAgXTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gc2hpZnQgYWxsIHRyYWNrcyBzdWNoIHRoYXQgY2xpcCBiZWdpbnMgYXQgdD0wXHJcblxyXG5cdGZvciAoIGxldCBpID0gMDsgaSA8IGNsaXAudHJhY2tzLmxlbmd0aDsgKysgaSApIHtcclxuXHJcblx0XHRjbGlwLnRyYWNrc1sgaSBdLnNoaWZ0KCAtIDEgKiBtaW5TdGFydFRpbWUgKTtcclxuXHJcblx0fVxyXG5cclxuXHRjbGlwLnJlc2V0RHVyYXRpb24oKTtcclxuXHJcblx0cmV0dXJuIGNsaXA7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQ29udmVydHMgdGhlIGtleWZyYW1lcyBvZiB0aGUgZ2l2ZW4gYW5pbWF0aW9uIGNsaXAgdG8gYW4gYWRkaXRpdmUgZm9ybWF0LlxyXG4gKlxyXG4gKiBAcGFyYW0ge0FuaW1hdGlvbkNsaXB9IHRhcmdldENsaXAgLSBUaGUgY2xpcCB0byBtYWtlIGFkZGl0aXZlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3JlZmVyZW5jZUZyYW1lPTBdIC0gVGhlIHJlZmVyZW5jZSBmcmFtZS5cclxuICogQHBhcmFtIHtBbmltYXRpb25DbGlwfSBbcmVmZXJlbmNlQ2xpcD10YXJnZXRDbGlwXSAtIFRoZSByZWZlcmVuY2UgY2xpcC5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtmcHM9MzBdIC0gVGhlIEZQUy5cclxuICogQHJldHVybiB7QW5pbWF0aW9uQ2xpcH0gVGhlIHVwZGF0ZWQgY2xpcCB3aGljaCBpcyBub3cgYWRkaXRpdmUuXHJcbiAqL1xyXG5mdW5jdGlvbiBtYWtlQ2xpcEFkZGl0aXZlKCB0YXJnZXRDbGlwLCByZWZlcmVuY2VGcmFtZSA9IDAsIHJlZmVyZW5jZUNsaXAgPSB0YXJnZXRDbGlwLCBmcHMgPSAzMCApIHtcclxuXHJcblx0aWYgKCBmcHMgPD0gMCApIGZwcyA9IDMwO1xyXG5cclxuXHRjb25zdCBudW1UcmFja3MgPSByZWZlcmVuY2VDbGlwLnRyYWNrcy5sZW5ndGg7XHJcblx0Y29uc3QgcmVmZXJlbmNlVGltZSA9IHJlZmVyZW5jZUZyYW1lIC8gZnBzO1xyXG5cclxuXHQvLyBNYWtlIGVhY2ggdHJhY2sncyB2YWx1ZXMgcmVsYXRpdmUgdG8gdGhlIHZhbHVlcyBhdCB0aGUgcmVmZXJlbmNlIGZyYW1lXHJcblx0Zm9yICggbGV0IGkgPSAwOyBpIDwgbnVtVHJhY2tzOyArKyBpICkge1xyXG5cclxuXHRcdGNvbnN0IHJlZmVyZW5jZVRyYWNrID0gcmVmZXJlbmNlQ2xpcC50cmFja3NbIGkgXTtcclxuXHRcdGNvbnN0IHJlZmVyZW5jZVRyYWNrVHlwZSA9IHJlZmVyZW5jZVRyYWNrLlZhbHVlVHlwZU5hbWU7XHJcblxyXG5cdFx0Ly8gU2tpcCB0aGlzIHRyYWNrIGlmIGl0J3Mgbm9uLW51bWVyaWNcclxuXHRcdGlmICggcmVmZXJlbmNlVHJhY2tUeXBlID09PSAnYm9vbCcgfHwgcmVmZXJlbmNlVHJhY2tUeXBlID09PSAnc3RyaW5nJyApIGNvbnRpbnVlO1xyXG5cclxuXHRcdC8vIEZpbmQgdGhlIHRyYWNrIGluIHRoZSB0YXJnZXQgY2xpcCB3aG9zZSBuYW1lIGFuZCB0eXBlIG1hdGNoZXMgdGhlIHJlZmVyZW5jZSB0cmFja1xyXG5cdFx0Y29uc3QgdGFyZ2V0VHJhY2sgPSB0YXJnZXRDbGlwLnRyYWNrcy5maW5kKCBmdW5jdGlvbiAoIHRyYWNrICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIHRyYWNrLm5hbWUgPT09IHJlZmVyZW5jZVRyYWNrLm5hbWVcclxuXHRcdFx0XHQmJiB0cmFjay5WYWx1ZVR5cGVOYW1lID09PSByZWZlcmVuY2VUcmFja1R5cGU7XHJcblxyXG5cdFx0fSApO1xyXG5cclxuXHRcdGlmICggdGFyZ2V0VHJhY2sgPT09IHVuZGVmaW5lZCApIGNvbnRpbnVlO1xyXG5cclxuXHRcdGxldCByZWZlcmVuY2VPZmZzZXQgPSAwO1xyXG5cdFx0Y29uc3QgcmVmZXJlbmNlVmFsdWVTaXplID0gcmVmZXJlbmNlVHJhY2suZ2V0VmFsdWVTaXplKCk7XHJcblxyXG5cdFx0aWYgKCByZWZlcmVuY2VUcmFjay5jcmVhdGVJbnRlcnBvbGFudC5pc0ludGVycG9sYW50RmFjdG9yeU1ldGhvZEdMVEZDdWJpY1NwbGluZSApIHtcclxuXHJcblx0XHRcdHJlZmVyZW5jZU9mZnNldCA9IHJlZmVyZW5jZVZhbHVlU2l6ZSAvIDM7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGxldCB0YXJnZXRPZmZzZXQgPSAwO1xyXG5cdFx0Y29uc3QgdGFyZ2V0VmFsdWVTaXplID0gdGFyZ2V0VHJhY2suZ2V0VmFsdWVTaXplKCk7XHJcblxyXG5cdFx0aWYgKCB0YXJnZXRUcmFjay5jcmVhdGVJbnRlcnBvbGFudC5pc0ludGVycG9sYW50RmFjdG9yeU1ldGhvZEdMVEZDdWJpY1NwbGluZSApIHtcclxuXHJcblx0XHRcdHRhcmdldE9mZnNldCA9IHRhcmdldFZhbHVlU2l6ZSAvIDM7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGxhc3RJbmRleCA9IHJlZmVyZW5jZVRyYWNrLnRpbWVzLmxlbmd0aCAtIDE7XHJcblx0XHRsZXQgcmVmZXJlbmNlVmFsdWU7XHJcblxyXG5cdFx0Ly8gRmluZCB0aGUgdmFsdWUgdG8gc3VidHJhY3Qgb3V0IG9mIHRoZSB0cmFja1xyXG5cdFx0aWYgKCByZWZlcmVuY2VUaW1lIDw9IHJlZmVyZW5jZVRyYWNrLnRpbWVzWyAwIF0gKSB7XHJcblxyXG5cdFx0XHQvLyBSZWZlcmVuY2UgZnJhbWUgaXMgZWFybGllciB0aGFuIHRoZSBmaXJzdCBrZXlmcmFtZSwgc28ganVzdCB1c2UgdGhlIGZpcnN0IGtleWZyYW1lXHJcblx0XHRcdGNvbnN0IHN0YXJ0SW5kZXggPSByZWZlcmVuY2VPZmZzZXQ7XHJcblx0XHRcdGNvbnN0IGVuZEluZGV4ID0gcmVmZXJlbmNlVmFsdWVTaXplIC0gcmVmZXJlbmNlT2Zmc2V0O1xyXG5cdFx0XHRyZWZlcmVuY2VWYWx1ZSA9IHJlZmVyZW5jZVRyYWNrLnZhbHVlcy5zbGljZSggc3RhcnRJbmRleCwgZW5kSW5kZXggKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCByZWZlcmVuY2VUaW1lID49IHJlZmVyZW5jZVRyYWNrLnRpbWVzWyBsYXN0SW5kZXggXSApIHtcclxuXHJcblx0XHRcdC8vIFJlZmVyZW5jZSBmcmFtZSBpcyBhZnRlciB0aGUgbGFzdCBrZXlmcmFtZSwgc28ganVzdCB1c2UgdGhlIGxhc3Qga2V5ZnJhbWVcclxuXHRcdFx0Y29uc3Qgc3RhcnRJbmRleCA9IGxhc3RJbmRleCAqIHJlZmVyZW5jZVZhbHVlU2l6ZSArIHJlZmVyZW5jZU9mZnNldDtcclxuXHRcdFx0Y29uc3QgZW5kSW5kZXggPSBzdGFydEluZGV4ICsgcmVmZXJlbmNlVmFsdWVTaXplIC0gcmVmZXJlbmNlT2Zmc2V0O1xyXG5cdFx0XHRyZWZlcmVuY2VWYWx1ZSA9IHJlZmVyZW5jZVRyYWNrLnZhbHVlcy5zbGljZSggc3RhcnRJbmRleCwgZW5kSW5kZXggKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Ly8gSW50ZXJwb2xhdGUgdG8gdGhlIHJlZmVyZW5jZSB2YWx1ZVxyXG5cdFx0XHRjb25zdCBpbnRlcnBvbGFudCA9IHJlZmVyZW5jZVRyYWNrLmNyZWF0ZUludGVycG9sYW50KCk7XHJcblx0XHRcdGNvbnN0IHN0YXJ0SW5kZXggPSByZWZlcmVuY2VPZmZzZXQ7XHJcblx0XHRcdGNvbnN0IGVuZEluZGV4ID0gcmVmZXJlbmNlVmFsdWVTaXplIC0gcmVmZXJlbmNlT2Zmc2V0O1xyXG5cdFx0XHRpbnRlcnBvbGFudC5ldmFsdWF0ZSggcmVmZXJlbmNlVGltZSApO1xyXG5cdFx0XHRyZWZlcmVuY2VWYWx1ZSA9IGludGVycG9sYW50LnJlc3VsdEJ1ZmZlci5zbGljZSggc3RhcnRJbmRleCwgZW5kSW5kZXggKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQ29uanVnYXRlIHRoZSBxdWF0ZXJuaW9uXHJcblx0XHRpZiAoIHJlZmVyZW5jZVRyYWNrVHlwZSA9PT0gJ3F1YXRlcm5pb24nICkge1xyXG5cclxuXHRcdFx0Y29uc3QgcmVmZXJlbmNlUXVhdCA9IG5ldyBRdWF0ZXJuaW9uKCkuZnJvbUFycmF5KCByZWZlcmVuY2VWYWx1ZSApLm5vcm1hbGl6ZSgpLmNvbmp1Z2F0ZSgpO1xyXG5cdFx0XHRyZWZlcmVuY2VRdWF0LnRvQXJyYXkoIHJlZmVyZW5jZVZhbHVlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFN1YnRyYWN0IHRoZSByZWZlcmVuY2UgdmFsdWUgZnJvbSBhbGwgb2YgdGhlIHRyYWNrIHZhbHVlc1xyXG5cclxuXHRcdGNvbnN0IG51bVRpbWVzID0gdGFyZ2V0VHJhY2sudGltZXMubGVuZ3RoO1xyXG5cdFx0Zm9yICggbGV0IGogPSAwOyBqIDwgbnVtVGltZXM7ICsrIGogKSB7XHJcblxyXG5cdFx0XHRjb25zdCB2YWx1ZVN0YXJ0ID0gaiAqIHRhcmdldFZhbHVlU2l6ZSArIHRhcmdldE9mZnNldDtcclxuXHJcblx0XHRcdGlmICggcmVmZXJlbmNlVHJhY2tUeXBlID09PSAncXVhdGVybmlvbicgKSB7XHJcblxyXG5cdFx0XHRcdC8vIE11bHRpcGx5IHRoZSBjb25qdWdhdGUgZm9yIHF1YXRlcm5pb24gdHJhY2sgdHlwZXNcclxuXHRcdFx0XHRRdWF0ZXJuaW9uLm11bHRpcGx5UXVhdGVybmlvbnNGbGF0KFxyXG5cdFx0XHRcdFx0dGFyZ2V0VHJhY2sudmFsdWVzLFxyXG5cdFx0XHRcdFx0dmFsdWVTdGFydCxcclxuXHRcdFx0XHRcdHJlZmVyZW5jZVZhbHVlLFxyXG5cdFx0XHRcdFx0MCxcclxuXHRcdFx0XHRcdHRhcmdldFRyYWNrLnZhbHVlcyxcclxuXHRcdFx0XHRcdHZhbHVlU3RhcnRcclxuXHRcdFx0XHQpO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgdmFsdWVFbmQgPSB0YXJnZXRWYWx1ZVNpemUgLSB0YXJnZXRPZmZzZXQgKiAyO1xyXG5cclxuXHRcdFx0XHQvLyBTdWJ0cmFjdCBlYWNoIHZhbHVlIGZvciBhbGwgb3RoZXIgbnVtZXJpYyB0cmFjayB0eXBlc1xyXG5cdFx0XHRcdGZvciAoIGxldCBrID0gMDsgayA8IHZhbHVlRW5kOyArKyBrICkge1xyXG5cclxuXHRcdFx0XHRcdHRhcmdldFRyYWNrLnZhbHVlc1sgdmFsdWVTdGFydCArIGsgXSAtPSByZWZlcmVuY2VWYWx1ZVsgayBdO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdHRhcmdldENsaXAuYmxlbmRNb2RlID0gQWRkaXRpdmVBbmltYXRpb25CbGVuZE1vZGU7XHJcblxyXG5cdHJldHVybiB0YXJnZXRDbGlwO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIEEgY2xhc3Mgd2l0aCB2YXJpb3VzIG1ldGhvZHMgdG8gYXNzaXN0IHdpdGggYW5pbWF0aW9ucy5cclxuICpcclxuICogQGhpZGVjb25zdHJ1Y3RvclxyXG4gKi9cclxuY2xhc3MgQW5pbWF0aW9uVXRpbHMge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb252ZXJ0cyBhbiBhcnJheSB0byBhIHNwZWNpZmljIHR5cGVcclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAcGFyYW0ge1R5cGVkQXJyYXl8QXJyYXl9IGFycmF5IC0gVGhlIGFycmF5IHRvIGNvbnZlcnQuXHJcblx0ICogQHBhcmFtIHtUeXBlZEFycmF5LmNvbnN0cnVjdG9yfSB0eXBlIC0gVGhlIGNvbnN0cnVjdG9yIG9mIGEgdHlwZSBhcnJheS5cclxuXHQgKiBAcmV0dXJuIHtUeXBlZEFycmF5fSBUaGUgY29udmVydGVkIGFycmF5XHJcblx0ICovXHJcblx0c3RhdGljIGNvbnZlcnRBcnJheSggYXJyYXksIHR5cGUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIGNvbnZlcnRBcnJheSggYXJyYXksIHR5cGUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGEgdHlwZWQgYXJyYXkuXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQHBhcmFtIHthbnl9IG9iamVjdCAtIFRoZSBvYmplY3QgdG8gY2hlY2suXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGEgdHlwZWQgYXJyYXkuXHJcblx0ICovXHJcblx0c3RhdGljIGlzVHlwZWRBcnJheSggb2JqZWN0ICkge1xyXG5cclxuXHRcdHJldHVybiBpc1R5cGVkQXJyYXkoIG9iamVjdCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYW4gYXJyYXkgYnkgd2hpY2ggdGltZXMgYW5kIHZhbHVlcyBjYW4gYmUgc29ydGVkLlxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gdGltZXMgLSBUaGUga2V5ZnJhbWUgdGltZSB2YWx1ZXMuXHJcblx0ICogQHJldHVybiB7QXJyYXk8bnVtYmVyPn0gVGhlIGFycmF5LlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBnZXRLZXlmcmFtZU9yZGVyKCB0aW1lcyApIHtcclxuXHJcblx0XHRyZXR1cm4gZ2V0S2V5ZnJhbWVPcmRlciggdGltZXMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTb3J0cyB0aGUgZ2l2ZW4gYXJyYXkgYnkgdGhlIHByZXZpb3VzbHkgY29tcHV0ZWQgb3JkZXIgdmlhIGBnZXRLZXlmcmFtZU9yZGVyKClgLlxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gdmFsdWVzIC0gVGhlIHZhbHVlcyB0byBzb3J0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzdHJpZGUgLSBUaGUgc3RyaWRlLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gb3JkZXIgLSBUaGUgc29ydCBvcmRlci5cclxuXHQgKiBAcmV0dXJuIHtBcnJheTxudW1iZXI+fSBUaGUgc29ydGVkIHZhbHVlcy5cclxuXHQgKi9cclxuXHRzdGF0aWMgc29ydGVkQXJyYXkoIHZhbHVlcywgc3RyaWRlLCBvcmRlciApIHtcclxuXHJcblx0XHRyZXR1cm4gc29ydGVkQXJyYXkoIHZhbHVlcywgc3RyaWRlLCBvcmRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVzZWQgZm9yIHBhcnNpbmcgQU9TIGtleWZyYW1lIGZvcm1hdHMuXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBqc29uS2V5cyAtIEEgbGlzdCBvZiBKU09OIGtleWZyYW1lcy5cclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IHRpbWVzIC0gVGhpcyBhcnJheSB3aWxsIGJlIGZpbGxlZCB3aXRoIGtleWZyYW1lIHRpbWVzIGJ5IHRoaXMgbWV0aG9kLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gdmFsdWVzIC0gVGhpcyBhcnJheSB3aWxsIGJlIGZpbGxlZCB3aXRoIGtleWZyYW1lIHZhbHVlcyBieSB0aGlzIG1ldGhvZC5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVQcm9wZXJ0eU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gdXNlLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBmbGF0dGVuSlNPTigganNvbktleXMsIHRpbWVzLCB2YWx1ZXMsIHZhbHVlUHJvcGVydHlOYW1lICkge1xyXG5cclxuXHRcdGZsYXR0ZW5KU09OKCBqc29uS2V5cywgdGltZXMsIHZhbHVlcywgdmFsdWVQcm9wZXJ0eU5hbWUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGEgbmV3IGNsaXAsIGNvbnRhaW5pbmcgb25seSB0aGUgc2VnbWVudCBvZiB0aGUgb3JpZ2luYWwgY2xpcCBiZXR3ZWVuIHRoZSBnaXZlbiBmcmFtZXMuXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQHBhcmFtIHtBbmltYXRpb25DbGlwfSBzb3VyY2VDbGlwIC0gVGhlIHZhbHVlcyB0byBzb3J0LlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGNsaXAuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0RnJhbWUgLSBUaGUgc3RhcnQgZnJhbWUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGVuZEZyYW1lIC0gVGhlIGVuZCBmcmFtZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2Zwcz0zMF0gLSBUaGUgRlBTLlxyXG5cdCAqIEByZXR1cm4ge0FuaW1hdGlvbkNsaXB9IFRoZSBuZXcgc3ViIGNsaXAuXHJcblx0ICovXHJcblx0c3RhdGljIHN1YmNsaXAoIHNvdXJjZUNsaXAsIG5hbWUsIHN0YXJ0RnJhbWUsIGVuZEZyYW1lLCBmcHMgPSAzMCApIHtcclxuXHJcblx0XHRyZXR1cm4gc3ViY2xpcCggc291cmNlQ2xpcCwgbmFtZSwgc3RhcnRGcmFtZSwgZW5kRnJhbWUsIGZwcyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnZlcnRzIHRoZSBrZXlmcmFtZXMgb2YgdGhlIGdpdmVuIGFuaW1hdGlvbiBjbGlwIHRvIGFuIGFkZGl0aXZlIGZvcm1hdC5cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAcGFyYW0ge0FuaW1hdGlvbkNsaXB9IHRhcmdldENsaXAgLSBUaGUgY2xpcCB0byBtYWtlIGFkZGl0aXZlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbcmVmZXJlbmNlRnJhbWU9MF0gLSBUaGUgcmVmZXJlbmNlIGZyYW1lLlxyXG5cdCAqIEBwYXJhbSB7QW5pbWF0aW9uQ2xpcH0gW3JlZmVyZW5jZUNsaXA9dGFyZ2V0Q2xpcF0gLSBUaGUgcmVmZXJlbmNlIGNsaXAuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtmcHM9MzBdIC0gVGhlIEZQUy5cclxuXHQgKiBAcmV0dXJuIHtBbmltYXRpb25DbGlwfSBUaGUgdXBkYXRlZCBjbGlwIHdoaWNoIGlzIG5vdyBhZGRpdGl2ZS5cclxuXHQgKi9cclxuXHRzdGF0aWMgbWFrZUNsaXBBZGRpdGl2ZSggdGFyZ2V0Q2xpcCwgcmVmZXJlbmNlRnJhbWUgPSAwLCByZWZlcmVuY2VDbGlwID0gdGFyZ2V0Q2xpcCwgZnBzID0gMzAgKSB7XHJcblxyXG5cdFx0cmV0dXJuIG1ha2VDbGlwQWRkaXRpdmUoIHRhcmdldENsaXAsIHJlZmVyZW5jZUZyYW1lLCByZWZlcmVuY2VDbGlwLCBmcHMgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHtcclxuXHRjb252ZXJ0QXJyYXksXHJcblx0aXNUeXBlZEFycmF5LFxyXG5cdGdldEtleWZyYW1lT3JkZXIsXHJcblx0c29ydGVkQXJyYXksXHJcblx0ZmxhdHRlbkpTT04sXHJcblx0c3ViY2xpcCxcclxuXHRtYWtlQ2xpcEFkZGl0aXZlLFxyXG5cdEFuaW1hdGlvblV0aWxzXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIG9mIGludGVycG9sYW50cyBvdmVyIHBhcmFtZXRyaWMgc2FtcGxlcy5cclxuICpcclxuICogVGhlIHBhcmFtZXRlciBkb21haW4gaXMgb25lIGRpbWVuc2lvbmFsLCB0eXBpY2FsbHkgdGhlIHRpbWUgb3IgYSBwYXRoXHJcbiAqIGFsb25nIGEgY3VydmUgZGVmaW5lZCBieSB0aGUgZGF0YS5cclxuICpcclxuICogVGhlIHNhbXBsZSB2YWx1ZXMgY2FuIGhhdmUgYW55IGRpbWVuc2lvbmFsaXR5IGFuZCBkZXJpdmVkIGNsYXNzZXMgbWF5XHJcbiAqIGFwcGx5IHNwZWNpYWwgaW50ZXJwcmV0YXRpb25zIHRvIHRoZSBkYXRhLlxyXG4gKlxyXG4gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSBpbnRlcnZhbCBzZWVrIGluIGEgVGVtcGxhdGUgTWV0aG9kLCBkZWZlcnJpbmdcclxuICogdGhlIGFjdHVhbCBpbnRlcnBvbGF0aW9uIHRvIGRlcml2ZWQgY2xhc3Nlcy5cclxuICpcclxuICogVGltZSBjb21wbGV4aXR5IGlzIE8oMSkgZm9yIGxpbmVhciBhY2Nlc3MgY3Jvc3NpbmcgYXQgbW9zdCB0d28gcG9pbnRzXHJcbiAqIGFuZCBPKGxvZyBOKSBmb3IgcmFuZG9tIGFjY2Vzcywgd2hlcmUgTiBpcyB0aGUgbnVtYmVyIG9mIHBvc2l0aW9ucy5cclxuICpcclxuICogUmVmZXJlbmNlczoge0BsaW5rIGh0dHA6Ly93d3cub29kZXNpZ24uY29tL3RlbXBsYXRlLW1ldGhvZC1wYXR0ZXJuLmh0bWx9XHJcbiAqXHJcbiAqIEBhYnN0cmFjdFxyXG4gKi9cclxuY2xhc3MgSW50ZXJwb2xhbnQge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGludGVycG9sYW50LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUeXBlZEFycmF5fSBwYXJhbWV0ZXJQb3NpdGlvbnMgLSBUaGUgcGFyYW1ldGVyIHBvc2l0aW9ucyBob2xkIHRoZSBpbnRlcnBvbGF0aW9uIGZhY3RvcnMuXHJcblx0ICogQHBhcmFtIHtUeXBlZEFycmF5fSBzYW1wbGVWYWx1ZXMgLSBUaGUgc2FtcGxlIHZhbHVlcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc2FtcGxlU2l6ZSAtIFRoZSBzYW1wbGUgc2l6ZVxyXG5cdCAqIEBwYXJhbSB7VHlwZWRBcnJheX0gW3Jlc3VsdEJ1ZmZlcl0gLSBUaGUgcmVzdWx0IGJ1ZmZlci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBwYXJhbWV0ZXIgcG9zaXRpb25zLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtUeXBlZEFycmF5fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBhcmFtZXRlclBvc2l0aW9ucyA9IHBhcmFtZXRlclBvc2l0aW9ucztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgY2FjaGUgaW5kZXguXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX2NhY2hlZEluZGV4ID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByZXN1bHQgYnVmZmVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtUeXBlZEFycmF5fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJlc3VsdEJ1ZmZlciA9IHJlc3VsdEJ1ZmZlciAhPT0gdW5kZWZpbmVkID8gcmVzdWx0QnVmZmVyIDogbmV3IHNhbXBsZVZhbHVlcy5jb25zdHJ1Y3Rvciggc2FtcGxlU2l6ZSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHNhbXBsZSB2YWx1ZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1R5cGVkQXJyYXl9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2FtcGxlVmFsdWVzID0gc2FtcGxlVmFsdWVzO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHZhbHVlIHNpemUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1R5cGVkQXJyYXl9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudmFsdWVTaXplID0gc2FtcGxlU2l6ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBpbnRlcnBvbGF0aW9uIHNldHRpbmdzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/T2JqZWN0fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNldHRpbmdzID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBkZWZhdWx0IHNldHRpbmdzIG9iamVjdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLkRlZmF1bHRTZXR0aW5nc18gPSB7fTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFdmFsdWF0ZSB0aGUgaW50ZXJwb2xhbnQgYXQgcG9zaXRpb24gYHRgLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHQgLSBUaGUgaW50ZXJwb2xhdGlvbiBmYWN0b3IuXHJcblx0ICogQHJldHVybiB7VHlwZWRBcnJheX0gVGhlIHJlc3VsdCBidWZmZXIuXHJcblx0ICovXHJcblx0ZXZhbHVhdGUoIHQgKSB7XHJcblxyXG5cdFx0Y29uc3QgcHAgPSB0aGlzLnBhcmFtZXRlclBvc2l0aW9ucztcclxuXHRcdGxldCBpMSA9IHRoaXMuX2NhY2hlZEluZGV4LFxyXG5cdFx0XHR0MSA9IHBwWyBpMSBdLFxyXG5cdFx0XHR0MCA9IHBwWyBpMSAtIDEgXTtcclxuXHJcblx0XHR2YWxpZGF0ZV9pbnRlcnZhbDoge1xyXG5cclxuXHRcdFx0c2Vlazoge1xyXG5cclxuXHRcdFx0XHRsZXQgcmlnaHQ7XHJcblxyXG5cdFx0XHRcdGxpbmVhcl9zY2FuOiB7XHJcblxyXG5cdFx0XHRcdFx0Ly8tIFNlZSBodHRwOi8vanNwZXJmLmNvbS9jb21wYXJpc29uLXRvLXVuZGVmaW5lZC8zXHJcblx0XHRcdFx0XHQvLy0gc2xvd2VyIGNvZGU6XHJcblx0XHRcdFx0XHQvLy1cclxuXHRcdFx0XHRcdC8vLSBcdFx0XHRcdGlmICggdCA+PSB0MSB8fCB0MSA9PT0gdW5kZWZpbmVkICkge1xyXG5cdFx0XHRcdFx0Zm9yd2FyZF9zY2FuOiBpZiAoICEgKCB0IDwgdDEgKSApIHtcclxuXHJcblx0XHRcdFx0XHRcdGZvciAoIGxldCBnaXZlVXBBdCA9IGkxICsgMjsgOyApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKCB0MSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGlmICggdCA8IHQwICkgYnJlYWsgZm9yd2FyZF9zY2FuO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8vIGFmdGVyIGVuZFxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGkxID0gcHAubGVuZ3RoO1xyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5fY2FjaGVkSW5kZXggPSBpMTtcclxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB0aGlzLmNvcHlTYW1wbGVWYWx1ZV8oIGkxIC0gMSApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmICggaTEgPT09IGdpdmVVcEF0ICkgYnJlYWs7IC8vIHRoaXMgbG9vcFxyXG5cclxuXHRcdFx0XHRcdFx0XHR0MCA9IHQxO1xyXG5cdFx0XHRcdFx0XHRcdHQxID0gcHBbICsrIGkxIF07XHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmICggdCA8IHQxICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8vIHdlIGhhdmUgYXJyaXZlZCBhdCB0aGUgc291Z2h0IGludGVydmFsXHJcblx0XHRcdFx0XHRcdFx0XHRicmVhayBzZWVrO1xyXG5cclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBwcmVwYXJlIGJpbmFyeSBzZWFyY2ggb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGluZGV4XHJcblx0XHRcdFx0XHRcdHJpZ2h0ID0gcHAubGVuZ3RoO1xyXG5cdFx0XHRcdFx0XHRicmVhayBsaW5lYXJfc2NhbjtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Ly8tIHNsb3dlciBjb2RlOlxyXG5cdFx0XHRcdFx0Ly8tXHRcdFx0XHRcdGlmICggdCA8IHQwIHx8IHQwID09PSB1bmRlZmluZWQgKSB7XHJcblx0XHRcdFx0XHRpZiAoICEgKCB0ID49IHQwICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBsb29waW5nP1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgdDFnbG9iYWwgPSBwcFsgMSBdO1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCB0IDwgdDFnbG9iYWwgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGkxID0gMjsgLy8gKyAxLCB1c2luZyB0aGUgc2NhbiBmb3IgdGhlIGRldGFpbHNcclxuXHRcdFx0XHRcdFx0XHR0MCA9IHQxZ2xvYmFsO1xyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0Ly8gbGluZWFyIHJldmVyc2Ugc2NhblxyXG5cclxuXHRcdFx0XHRcdFx0Zm9yICggbGV0IGdpdmVVcEF0ID0gaTEgLSAyOyA7ICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoIHQwID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0Ly8gYmVmb3JlIHN0YXJ0XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5fY2FjaGVkSW5kZXggPSAwO1xyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuY29weVNhbXBsZVZhbHVlXyggMCApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmICggaTEgPT09IGdpdmVVcEF0ICkgYnJlYWs7IC8vIHRoaXMgbG9vcFxyXG5cclxuXHRcdFx0XHRcdFx0XHR0MSA9IHQwO1xyXG5cdFx0XHRcdFx0XHRcdHQwID0gcHBbIC0tIGkxIC0gMSBdO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoIHQgPj0gdDAgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0Ly8gd2UgaGF2ZSBhcnJpdmVkIGF0IHRoZSBzb3VnaHQgaW50ZXJ2YWxcclxuXHRcdFx0XHRcdFx0XHRcdGJyZWFrIHNlZWs7XHJcblxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdC8vIHByZXBhcmUgYmluYXJ5IHNlYXJjaCBvbiB0aGUgbGVmdCBzaWRlIG9mIHRoZSBpbmRleFxyXG5cdFx0XHRcdFx0XHRyaWdodCA9IGkxO1xyXG5cdFx0XHRcdFx0XHRpMSA9IDA7XHJcblx0XHRcdFx0XHRcdGJyZWFrIGxpbmVhcl9zY2FuO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvLyB0aGUgaW50ZXJ2YWwgaXMgdmFsaWRcclxuXHJcblx0XHRcdFx0XHRicmVhayB2YWxpZGF0ZV9pbnRlcnZhbDtcclxuXHJcblx0XHRcdFx0fSAvLyBsaW5lYXIgc2NhblxyXG5cclxuXHRcdFx0XHQvLyBiaW5hcnkgc2VhcmNoXHJcblxyXG5cdFx0XHRcdHdoaWxlICggaTEgPCByaWdodCApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBtaWQgPSAoIGkxICsgcmlnaHQgKSA+Pj4gMTtcclxuXHJcblx0XHRcdFx0XHRpZiAoIHQgPCBwcFsgbWlkIF0gKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRyaWdodCA9IG1pZDtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0aTEgPSBtaWQgKyAxO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR0MSA9IHBwWyBpMSBdO1xyXG5cdFx0XHRcdHQwID0gcHBbIGkxIC0gMSBdO1xyXG5cclxuXHRcdFx0XHQvLyBjaGVjayBib3VuZGFyeSBjYXNlcywgYWdhaW5cclxuXHJcblx0XHRcdFx0aWYgKCB0MCA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdHRoaXMuX2NhY2hlZEluZGV4ID0gMDtcclxuXHRcdFx0XHRcdHJldHVybiB0aGlzLmNvcHlTYW1wbGVWYWx1ZV8oIDAgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoIHQxID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0aTEgPSBwcC5sZW5ndGg7XHJcblx0XHRcdFx0XHR0aGlzLl9jYWNoZWRJbmRleCA9IGkxO1xyXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuY29weVNhbXBsZVZhbHVlXyggaTEgLSAxICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gLy8gc2Vla1xyXG5cclxuXHRcdFx0dGhpcy5fY2FjaGVkSW5kZXggPSBpMTtcclxuXHJcblx0XHRcdHRoaXMuaW50ZXJ2YWxDaGFuZ2VkXyggaTEsIHQwLCB0MSApO1xyXG5cclxuXHRcdH0gLy8gdmFsaWRhdGVfaW50ZXJ2YWxcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5pbnRlcnBvbGF0ZV8oIGkxLCB0MCwgdCwgdDEgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBpbnRlcnBvbGF0aW9uIHNldHRpbmdzLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7T2JqZWN0fSBUaGUgaW50ZXJwb2xhdGlvbiBzZXR0aW5ncy5cclxuXHQgKi9cclxuXHRnZXRTZXR0aW5nc18oKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuc2V0dGluZ3MgfHwgdGhpcy5EZWZhdWx0U2V0dGluZ3NfO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvcGllcyBhIHNhbXBsZSB2YWx1ZSB0byB0aGUgcmVzdWx0IGJ1ZmZlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIEFuIGluZGV4IGludG8gdGhlIHNhbXBsZSB2YWx1ZSBidWZmZXIuXHJcblx0ICogQHJldHVybiB7VHlwZWRBcnJheX0gVGhlIHJlc3VsdCBidWZmZXIuXHJcblx0ICovXHJcblx0Y29weVNhbXBsZVZhbHVlXyggaW5kZXggKSB7XHJcblxyXG5cdFx0Ly8gY29waWVzIGEgc2FtcGxlIHZhbHVlIHRvIHRoZSByZXN1bHQgYnVmZmVyXHJcblxyXG5cdFx0Y29uc3QgcmVzdWx0ID0gdGhpcy5yZXN1bHRCdWZmZXIsXHJcblx0XHRcdHZhbHVlcyA9IHRoaXMuc2FtcGxlVmFsdWVzLFxyXG5cdFx0XHRzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSxcclxuXHRcdFx0b2Zmc2V0ID0gaW5kZXggKiBzdHJpZGU7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpICE9PSBzdHJpZGU7ICsrIGkgKSB7XHJcblxyXG5cdFx0XHRyZXN1bHRbIGkgXSA9IHZhbHVlc1sgb2Zmc2V0ICsgaSBdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvcGllcyBhIHNhbXBsZSB2YWx1ZSB0byB0aGUgcmVzdWx0IGJ1ZmZlci5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpMSAtIEFuIGluZGV4IGludG8gdGhlIHNhbXBsZSB2YWx1ZSBidWZmZXIuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHQwIC0gVGhlIHByZXZpb3VzIGludGVycG9sYXRpb24gZmFjdG9yLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0IC0gVGhlIGN1cnJlbnQgaW50ZXJwb2xhdGlvbiBmYWN0b3IuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHQxIC0gVGhlIG5leHQgaW50ZXJwb2xhdGlvbiBmYWN0b3IuXHJcblx0ICogQHJldHVybiB7VHlwZWRBcnJheX0gVGhlIHJlc3VsdCBidWZmZXIuXHJcblx0ICovXHJcblx0aW50ZXJwb2xhdGVfKCAvKiBpMSwgdDAsIHQsIHQxICovICkge1xyXG5cclxuXHRcdHRocm93IG5ldyBFcnJvciggJ2NhbGwgdG8gYWJzdHJhY3QgbWV0aG9kJyApO1xyXG5cdFx0Ly8gaW1wbGVtZW50YXRpb25zIHNoYWxsIHJldHVybiB0aGlzLnJlc3VsdEJ1ZmZlclxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE9wdGlvbmFsIG1ldGhvZCB0aGF0IGlzIGV4ZWN1dGVkIHdoZW4gdGhlIGludGVydmFsIGhhcyBjaGFuZ2VkLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGkxIC0gQW4gaW5kZXggaW50byB0aGUgc2FtcGxlIHZhbHVlIGJ1ZmZlci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdDAgLSBUaGUgcHJldmlvdXMgaW50ZXJwb2xhdGlvbiBmYWN0b3IuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHQgLSBUaGUgY3VycmVudCBpbnRlcnBvbGF0aW9uIGZhY3Rvci5cclxuXHQgKi9cclxuXHRpbnRlcnZhbENoYW5nZWRfKCAvKiBpMSwgdDAsIHQxICovICkge1xyXG5cclxuXHRcdC8vIGVtcHR5XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IEludGVycG9sYW50IH07XHJcbiIsImltcG9ydCB7IFplcm9DdXJ2YXR1cmVFbmRpbmcsIFdyYXBBcm91bmRFbmRpbmcsIFplcm9TbG9wZUVuZGluZyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IEludGVycG9sYW50IH0gZnJvbSAnLi4vSW50ZXJwb2xhbnQuanMnO1xyXG5cclxuLyoqXHJcbiAqIEZhc3QgYW5kIHNpbXBsZSBjdWJpYyBzcGxpbmUgaW50ZXJwb2xhbnQuXHJcbiAqXHJcbiAqIEl0IHdhcyBkZXJpdmVkIGZyb20gYSBIZXJtaXRpYW4gY29uc3RydWN0aW9uIHNldHRpbmcgdGhlIGZpcnN0IGRlcml2YXRpdmVcclxuICogYXQgZWFjaCBzYW1wbGUgcG9zaXRpb24gdG8gdGhlIGxpbmVhciBzbG9wZSBiZXR3ZWVuIG5laWdoYm9yaW5nIHBvc2l0aW9uc1xyXG4gKiBvdmVyIHRoZWlyIHBhcmFtZXRlciBpbnRlcnZhbC5cclxuICpcclxuICogQGF1Z21lbnRzIEludGVycG9sYW50XHJcbiAqL1xyXG5jbGFzcyBDdWJpY0ludGVycG9sYW50IGV4dGVuZHMgSW50ZXJwb2xhbnQge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGN1YmljIGludGVycG9sYW50LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUeXBlZEFycmF5fSBwYXJhbWV0ZXJQb3NpdGlvbnMgLSBUaGUgcGFyYW1ldGVyIHBvc2l0aW9ucyBob2xkIHRoZSBpbnRlcnBvbGF0aW9uIGZhY3RvcnMuXHJcblx0ICogQHBhcmFtIHtUeXBlZEFycmF5fSBzYW1wbGVWYWx1ZXMgLSBUaGUgc2FtcGxlIHZhbHVlcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc2FtcGxlU2l6ZSAtIFRoZSBzYW1wbGUgc2l6ZVxyXG5cdCAqIEBwYXJhbSB7VHlwZWRBcnJheX0gW3Jlc3VsdEJ1ZmZlcl0gLSBUaGUgcmVzdWx0IGJ1ZmZlci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApIHtcclxuXHJcblx0XHRzdXBlciggcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApO1xyXG5cclxuXHRcdHRoaXMuX3dlaWdodFByZXYgPSAtIDA7XHJcblx0XHR0aGlzLl9vZmZzZXRQcmV2ID0gLSAwO1xyXG5cdFx0dGhpcy5fd2VpZ2h0TmV4dCA9IC0gMDtcclxuXHRcdHRoaXMuX29mZnNldE5leHQgPSAtIDA7XHJcblxyXG5cdFx0dGhpcy5EZWZhdWx0U2V0dGluZ3NfID0ge1xyXG5cclxuXHRcdFx0ZW5kaW5nU3RhcnQ6IFplcm9DdXJ2YXR1cmVFbmRpbmcsXHJcblx0XHRcdGVuZGluZ0VuZDogWmVyb0N1cnZhdHVyZUVuZGluZ1xyXG5cclxuXHRcdH07XHJcblxyXG5cdH1cclxuXHJcblx0aW50ZXJ2YWxDaGFuZ2VkXyggaTEsIHQwLCB0MSApIHtcclxuXHJcblx0XHRjb25zdCBwcCA9IHRoaXMucGFyYW1ldGVyUG9zaXRpb25zO1xyXG5cdFx0bGV0IGlQcmV2ID0gaTEgLSAyLFxyXG5cdFx0XHRpTmV4dCA9IGkxICsgMSxcclxuXHJcblx0XHRcdHRQcmV2ID0gcHBbIGlQcmV2IF0sXHJcblx0XHRcdHROZXh0ID0gcHBbIGlOZXh0IF07XHJcblxyXG5cdFx0aWYgKCB0UHJldiA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0c3dpdGNoICggdGhpcy5nZXRTZXR0aW5nc18oKS5lbmRpbmdTdGFydCApIHtcclxuXHJcblx0XHRcdFx0Y2FzZSBaZXJvU2xvcGVFbmRpbmc6XHJcblxyXG5cdFx0XHRcdFx0Ly8gZicodDApID0gMFxyXG5cdFx0XHRcdFx0aVByZXYgPSBpMTtcclxuXHRcdFx0XHRcdHRQcmV2ID0gMiAqIHQwIC0gdDE7XHJcblxyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdGNhc2UgV3JhcEFyb3VuZEVuZGluZzpcclxuXHJcblx0XHRcdFx0XHQvLyB1c2UgdGhlIG90aGVyIGVuZCBvZiB0aGUgY3VydmVcclxuXHRcdFx0XHRcdGlQcmV2ID0gcHAubGVuZ3RoIC0gMjtcclxuXHRcdFx0XHRcdHRQcmV2ID0gdDAgKyBwcFsgaVByZXYgXSAtIHBwWyBpUHJldiArIDEgXTtcclxuXHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0ZGVmYXVsdDogLy8gWmVyb0N1cnZhdHVyZUVuZGluZ1xyXG5cclxuXHRcdFx0XHRcdC8vIGYnJyh0MCkgPSAwIGEuay5hLiBOYXR1cmFsIFNwbGluZVxyXG5cdFx0XHRcdFx0aVByZXYgPSBpMTtcclxuXHRcdFx0XHRcdHRQcmV2ID0gdDE7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdE5leHQgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHN3aXRjaCAoIHRoaXMuZ2V0U2V0dGluZ3NfKCkuZW5kaW5nRW5kICkge1xyXG5cclxuXHRcdFx0XHRjYXNlIFplcm9TbG9wZUVuZGluZzpcclxuXHJcblx0XHRcdFx0XHQvLyBmJyh0TikgPSAwXHJcblx0XHRcdFx0XHRpTmV4dCA9IGkxO1xyXG5cdFx0XHRcdFx0dE5leHQgPSAyICogdDEgLSB0MDtcclxuXHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0Y2FzZSBXcmFwQXJvdW5kRW5kaW5nOlxyXG5cclxuXHRcdFx0XHRcdC8vIHVzZSB0aGUgb3RoZXIgZW5kIG9mIHRoZSBjdXJ2ZVxyXG5cdFx0XHRcdFx0aU5leHQgPSAxO1xyXG5cdFx0XHRcdFx0dE5leHQgPSB0MSArIHBwWyAxIF0gLSBwcFsgMCBdO1xyXG5cclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRkZWZhdWx0OiAvLyBaZXJvQ3VydmF0dXJlRW5kaW5nXHJcblxyXG5cdFx0XHRcdFx0Ly8gZicnKHROKSA9IDAsIGEuay5hLiBOYXR1cmFsIFNwbGluZVxyXG5cdFx0XHRcdFx0aU5leHQgPSBpMSAtIDE7XHJcblx0XHRcdFx0XHR0TmV4dCA9IHQwO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBoYWxmRHQgPSAoIHQxIC0gdDAgKSAqIDAuNSxcclxuXHRcdFx0c3RyaWRlID0gdGhpcy52YWx1ZVNpemU7XHJcblxyXG5cdFx0dGhpcy5fd2VpZ2h0UHJldiA9IGhhbGZEdCAvICggdDAgLSB0UHJldiApO1xyXG5cdFx0dGhpcy5fd2VpZ2h0TmV4dCA9IGhhbGZEdCAvICggdE5leHQgLSB0MSApO1xyXG5cdFx0dGhpcy5fb2Zmc2V0UHJldiA9IGlQcmV2ICogc3RyaWRlO1xyXG5cdFx0dGhpcy5fb2Zmc2V0TmV4dCA9IGlOZXh0ICogc3RyaWRlO1xyXG5cclxuXHR9XHJcblxyXG5cdGludGVycG9sYXRlXyggaTEsIHQwLCB0LCB0MSApIHtcclxuXHJcblx0XHRjb25zdCByZXN1bHQgPSB0aGlzLnJlc3VsdEJ1ZmZlcixcclxuXHRcdFx0dmFsdWVzID0gdGhpcy5zYW1wbGVWYWx1ZXMsXHJcblx0XHRcdHN0cmlkZSA9IHRoaXMudmFsdWVTaXplLFxyXG5cclxuXHRcdFx0bzEgPSBpMSAqIHN0cmlkZSxcdFx0bzAgPSBvMSAtIHN0cmlkZSxcclxuXHRcdFx0b1AgPSB0aGlzLl9vZmZzZXRQcmV2LCBcdG9OID0gdGhpcy5fb2Zmc2V0TmV4dCxcclxuXHRcdFx0d1AgPSB0aGlzLl93ZWlnaHRQcmV2LFx0d04gPSB0aGlzLl93ZWlnaHROZXh0LFxyXG5cclxuXHRcdFx0cCA9ICggdCAtIHQwICkgLyAoIHQxIC0gdDAgKSxcclxuXHRcdFx0cHAgPSBwICogcCxcclxuXHRcdFx0cHBwID0gcHAgKiBwO1xyXG5cclxuXHRcdC8vIGV2YWx1YXRlIHBvbHlub21pYWxzXHJcblxyXG5cdFx0Y29uc3Qgc1AgPSAtIHdQICogcHBwICsgMiAqIHdQICogcHAgLSB3UCAqIHA7XHJcblx0XHRjb25zdCBzMCA9ICggMSArIHdQICkgKiBwcHAgKyAoIC0gMS41IC0gMiAqIHdQICkgKiBwcCArICggLSAwLjUgKyB3UCApICogcCArIDE7XHJcblx0XHRjb25zdCBzMSA9ICggLSAxIC0gd04gKSAqIHBwcCArICggMS41ICsgd04gKSAqIHBwICsgMC41ICogcDtcclxuXHRcdGNvbnN0IHNOID0gd04gKiBwcHAgLSB3TiAqIHBwO1xyXG5cclxuXHRcdC8vIGNvbWJpbmUgZGF0YSBsaW5lYXJseVxyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSAhPT0gc3RyaWRlOyArKyBpICkge1xyXG5cclxuXHRcdFx0cmVzdWx0WyBpIF0gPVxyXG5cdFx0XHRcdFx0c1AgKiB2YWx1ZXNbIG9QICsgaSBdICtcclxuXHRcdFx0XHRcdHMwICogdmFsdWVzWyBvMCArIGkgXSArXHJcblx0XHRcdFx0XHRzMSAqIHZhbHVlc1sgbzEgKyBpIF0gK1xyXG5cdFx0XHRcdFx0c04gKiB2YWx1ZXNbIG9OICsgaSBdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBDdWJpY0ludGVycG9sYW50IH07XHJcbiIsImltcG9ydCB7IEludGVycG9sYW50IH0gZnJvbSAnLi4vSW50ZXJwb2xhbnQuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgYmFzaWMgbGluZWFyIGludGVycG9sYW50LlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgSW50ZXJwb2xhbnRcclxuICovXHJcbmNsYXNzIExpbmVhckludGVycG9sYW50IGV4dGVuZHMgSW50ZXJwb2xhbnQge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGxpbmVhciBpbnRlcnBvbGFudC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VHlwZWRBcnJheX0gcGFyYW1ldGVyUG9zaXRpb25zIC0gVGhlIHBhcmFtZXRlciBwb3NpdGlvbnMgaG9sZCB0aGUgaW50ZXJwb2xhdGlvbiBmYWN0b3JzLlxyXG5cdCAqIEBwYXJhbSB7VHlwZWRBcnJheX0gc2FtcGxlVmFsdWVzIC0gVGhlIHNhbXBsZSB2YWx1ZXMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHNhbXBsZVNpemUgLSBUaGUgc2FtcGxlIHNpemVcclxuXHQgKiBAcGFyYW0ge1R5cGVkQXJyYXl9IFtyZXN1bHRCdWZmZXJdIC0gVGhlIHJlc3VsdCBidWZmZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKSB7XHJcblxyXG5cdFx0c3VwZXIoIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHRpbnRlcnBvbGF0ZV8oIGkxLCB0MCwgdCwgdDEgKSB7XHJcblxyXG5cdFx0Y29uc3QgcmVzdWx0ID0gdGhpcy5yZXN1bHRCdWZmZXIsXHJcblx0XHRcdHZhbHVlcyA9IHRoaXMuc2FtcGxlVmFsdWVzLFxyXG5cdFx0XHRzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSxcclxuXHJcblx0XHRcdG9mZnNldDEgPSBpMSAqIHN0cmlkZSxcclxuXHRcdFx0b2Zmc2V0MCA9IG9mZnNldDEgLSBzdHJpZGUsXHJcblxyXG5cdFx0XHR3ZWlnaHQxID0gKCB0IC0gdDAgKSAvICggdDEgLSB0MCApLFxyXG5cdFx0XHR3ZWlnaHQwID0gMSAtIHdlaWdodDE7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpICE9PSBzdHJpZGU7ICsrIGkgKSB7XHJcblxyXG5cdFx0XHRyZXN1bHRbIGkgXSA9XHJcblx0XHRcdFx0XHR2YWx1ZXNbIG9mZnNldDAgKyBpIF0gKiB3ZWlnaHQwICtcclxuXHRcdFx0XHRcdHZhbHVlc1sgb2Zmc2V0MSArIGkgXSAqIHdlaWdodDE7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBMaW5lYXJJbnRlcnBvbGFudCB9O1xyXG4iLCJpbXBvcnQgeyBJbnRlcnBvbGFudCB9IGZyb20gJy4uL0ludGVycG9sYW50LmpzJztcclxuXHJcbi8qKlxyXG4gKiBJbnRlcnBvbGFudCB0aGF0IGV2YWx1YXRlcyB0byB0aGUgc2FtcGxlIHZhbHVlIGF0IHRoZSBwb3NpdGlvbiBwcmVjZWRpbmdcclxuICogdGhlIHBhcmFtZXRlci5cclxuICpcclxuICogQGF1Z21lbnRzIEludGVycG9sYW50XHJcbiAqL1xyXG5jbGFzcyBEaXNjcmV0ZUludGVycG9sYW50IGV4dGVuZHMgSW50ZXJwb2xhbnQge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGRpc2NyZXRlIGludGVycG9sYW50LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUeXBlZEFycmF5fSBwYXJhbWV0ZXJQb3NpdGlvbnMgLSBUaGUgcGFyYW1ldGVyIHBvc2l0aW9ucyBob2xkIHRoZSBpbnRlcnBvbGF0aW9uIGZhY3RvcnMuXHJcblx0ICogQHBhcmFtIHtUeXBlZEFycmF5fSBzYW1wbGVWYWx1ZXMgLSBUaGUgc2FtcGxlIHZhbHVlcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc2FtcGxlU2l6ZSAtIFRoZSBzYW1wbGUgc2l6ZVxyXG5cdCAqIEBwYXJhbSB7VHlwZWRBcnJheX0gW3Jlc3VsdEJ1ZmZlcl0gLSBUaGUgcmVzdWx0IGJ1ZmZlci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApIHtcclxuXHJcblx0XHRzdXBlciggcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdGludGVycG9sYXRlXyggaTEgLyosIHQwLCB0LCB0MSAqLyApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5jb3B5U2FtcGxlVmFsdWVfKCBpMSAtIDEgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCB7IERpc2NyZXRlSW50ZXJwb2xhbnQgfTtcclxuIiwiaW1wb3J0IHtcclxuXHRJbnRlcnBvbGF0ZUxpbmVhcixcclxuXHRJbnRlcnBvbGF0ZVNtb290aCxcclxuXHRJbnRlcnBvbGF0ZURpc2NyZXRlXHJcbn0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgQ3ViaWNJbnRlcnBvbGFudCB9IGZyb20gJy4uL21hdGgvaW50ZXJwb2xhbnRzL0N1YmljSW50ZXJwb2xhbnQuanMnO1xyXG5pbXBvcnQgeyBMaW5lYXJJbnRlcnBvbGFudCB9IGZyb20gJy4uL21hdGgvaW50ZXJwb2xhbnRzL0xpbmVhckludGVycG9sYW50LmpzJztcclxuaW1wb3J0IHsgRGlzY3JldGVJbnRlcnBvbGFudCB9IGZyb20gJy4uL21hdGgvaW50ZXJwb2xhbnRzL0Rpc2NyZXRlSW50ZXJwb2xhbnQuanMnO1xyXG5pbXBvcnQgKiBhcyBBbmltYXRpb25VdGlscyBmcm9tICcuL0FuaW1hdGlvblV0aWxzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIHMgYSB0aW1lZCBzZXF1ZW5jZSBvZiBrZXlmcmFtZXMsIHdoaWNoIGFyZSBjb21wb3NlZCBvZiBsaXN0cyBvZlxyXG4gKiB0aW1lcyBhbmQgcmVsYXRlZCB2YWx1ZXMsIGFuZCB3aGljaCBhcmUgdXNlZCB0byBhbmltYXRlIGEgc3BlY2lmaWMgcHJvcGVydHlcclxuICogb2YgYW4gb2JqZWN0LlxyXG4gKi9cclxuY2xhc3MgS2V5ZnJhbWVUcmFjayB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcga2V5ZnJhbWUgdHJhY2suXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBrZXlmcmFtZSB0cmFjaydzIG5hbWUuXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSB0aW1lcyAtIEEgbGlzdCBvZiBrZXlmcmFtZSB0aW1lcy5cclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IHZhbHVlcyAtIEEgbGlzdCBvZiBrZXlmcmFtZSB2YWx1ZXMuXHJcblx0ICogQHBhcmFtIHsoSW50ZXJwb2xhdGVMaW5lYXJ8SW50ZXJwb2xhdGVEaXNjcmV0ZXxJbnRlcnBvbGF0ZVNtb290aCl9IFtpbnRlcnBvbGF0aW9uXSAtIFRoZSBpbnRlcnBvbGF0aW9uIHR5cGUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKSB7XHJcblxyXG5cdFx0aWYgKCBuYW1lID09PSB1bmRlZmluZWQgKSB0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5LZXlmcmFtZVRyYWNrOiB0cmFjayBuYW1lIGlzIHVuZGVmaW5lZCcgKTtcclxuXHRcdGlmICggdGltZXMgPT09IHVuZGVmaW5lZCB8fCB0aW1lcy5sZW5ndGggPT09IDAgKSB0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5LZXlmcmFtZVRyYWNrOiBubyBrZXlmcmFtZXMgaW4gdHJhY2sgbmFtZWQgJyArIG5hbWUgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB0cmFjaydzIG5hbWUgY2FuIHJlZmVyIHRvIG1vcnBoIHRhcmdldHMgb3IgYm9uZXMgb3JcclxuXHRcdCAqIHBvc3NpYmx5IG90aGVyIHZhbHVlcyB3aXRoaW4gYW4gYW5pbWF0ZWQgb2JqZWN0LiBTZWUge0BsaW5rIFByb3BlcnR5QmluZGluZyNwYXJzZVRyYWNrTmFtZX1cclxuXHRcdCAqIGZvciB0aGUgZm9ybXMgb2Ygc3RyaW5ncyB0aGF0IGNhbiBiZSBwYXJzZWQgZm9yIHByb3BlcnR5IGJpbmRpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5uYW1lID0gbmFtZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBrZXlmcmFtZSB0aW1lcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7RmxvYXQzMkFycmF5fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRpbWVzID0gQW5pbWF0aW9uVXRpbHMuY29udmVydEFycmF5KCB0aW1lcywgdGhpcy5UaW1lQnVmZmVyVHlwZSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGtleWZyYW1lIHZhbHVlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7RmxvYXQzMkFycmF5fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnZhbHVlcyA9IEFuaW1hdGlvblV0aWxzLmNvbnZlcnRBcnJheSggdmFsdWVzLCB0aGlzLlZhbHVlQnVmZmVyVHlwZSApO1xyXG5cclxuXHRcdHRoaXMuc2V0SW50ZXJwb2xhdGlvbiggaW50ZXJwb2xhdGlvbiB8fCB0aGlzLkRlZmF1bHRJbnRlcnBvbGF0aW9uICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29udmVydHMgdGhlIGtleWZyYW1lIHRyYWNrIHRvIEpTT04uXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQHBhcmFtIHtLZXlmcmFtZVRyYWNrfSB0cmFjayAtIFRoZSBrZXlmcmFtZSB0cmFjayB0byBzZXJpYWxpemUuXHJcblx0ICogQHJldHVybiB7T2JqZWN0fSBUaGUgc2VyaWFsaXplZCBrZXlmcmFtZSB0cmFjayBhcyBKU09OLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyB0b0pTT04oIHRyYWNrICkge1xyXG5cclxuXHRcdGNvbnN0IHRyYWNrVHlwZSA9IHRyYWNrLmNvbnN0cnVjdG9yO1xyXG5cclxuXHRcdGxldCBqc29uO1xyXG5cclxuXHRcdC8vIGRlcml2ZWQgY2xhc3NlcyBjYW4gZGVmaW5lIGEgc3RhdGljIHRvSlNPTiBtZXRob2RcclxuXHRcdGlmICggdHJhY2tUeXBlLnRvSlNPTiAhPT0gdGhpcy50b0pTT04gKSB7XHJcblxyXG5cdFx0XHRqc29uID0gdHJhY2tUeXBlLnRvSlNPTiggdHJhY2sgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Ly8gYnkgZGVmYXVsdCwgd2UgYXNzdW1lIHRoZSBkYXRhIGNhbiBiZSBzZXJpYWxpemVkIGFzLWlzXHJcblx0XHRcdGpzb24gPSB7XHJcblxyXG5cdFx0XHRcdCduYW1lJzogdHJhY2submFtZSxcclxuXHRcdFx0XHQndGltZXMnOiBBbmltYXRpb25VdGlscy5jb252ZXJ0QXJyYXkoIHRyYWNrLnRpbWVzLCBBcnJheSApLFxyXG5cdFx0XHRcdCd2YWx1ZXMnOiBBbmltYXRpb25VdGlscy5jb252ZXJ0QXJyYXkoIHRyYWNrLnZhbHVlcywgQXJyYXkgKVxyXG5cclxuXHRcdFx0fTtcclxuXHJcblx0XHRcdGNvbnN0IGludGVycG9sYXRpb24gPSB0cmFjay5nZXRJbnRlcnBvbGF0aW9uKCk7XHJcblxyXG5cdFx0XHRpZiAoIGludGVycG9sYXRpb24gIT09IHRyYWNrLkRlZmF1bHRJbnRlcnBvbGF0aW9uICkge1xyXG5cclxuXHRcdFx0XHRqc29uLmludGVycG9sYXRpb24gPSBpbnRlcnBvbGF0aW9uO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRqc29uLnR5cGUgPSB0cmFjay5WYWx1ZVR5cGVOYW1lOyAvLyBtYW5kYXRvcnlcclxuXHJcblx0XHRyZXR1cm4ganNvbjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGYWN0b3J5IG1ldGhvZCBmb3IgY3JlYXRpbmcgYSBuZXcgZGlzY3JldGUgaW50ZXJwb2xhbnQuXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQHBhcmFtIHtUeXBlZEFycmF5fSBbcmVzdWx0XSAtIFRoZSByZXN1bHQgYnVmZmVyLlxyXG5cdCAqIEByZXR1cm4ge0Rpc2NyZXRlSW50ZXJwb2xhbnR9IFRoZSBuZXcgaW50ZXJwb2xhbnQuXHJcblx0ICovXHJcblx0SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kRGlzY3JldGUoIHJlc3VsdCApIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IERpc2NyZXRlSW50ZXJwb2xhbnQoIHRoaXMudGltZXMsIHRoaXMudmFsdWVzLCB0aGlzLmdldFZhbHVlU2l6ZSgpLCByZXN1bHQgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGYWN0b3J5IG1ldGhvZCBmb3IgY3JlYXRpbmcgYSBuZXcgbGluZWFyIGludGVycG9sYW50LlxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEBwYXJhbSB7VHlwZWRBcnJheX0gW3Jlc3VsdF0gLSBUaGUgcmVzdWx0IGJ1ZmZlci5cclxuXHQgKiBAcmV0dXJuIHtMaW5lYXJJbnRlcnBvbGFudH0gVGhlIG5ldyBpbnRlcnBvbGFudC5cclxuXHQgKi9cclxuXHRJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXIoIHJlc3VsdCApIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IExpbmVhckludGVycG9sYW50KCB0aGlzLnRpbWVzLCB0aGlzLnZhbHVlcywgdGhpcy5nZXRWYWx1ZVNpemUoKSwgcmVzdWx0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRmFjdG9yeSBtZXRob2QgZm9yIGNyZWF0aW5nIGEgbmV3IHNtb290aCBpbnRlcnBvbGFudC5cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAcGFyYW0ge1R5cGVkQXJyYXl9IFtyZXN1bHRdIC0gVGhlIHJlc3VsdCBidWZmZXIuXHJcblx0ICogQHJldHVybiB7Q3ViaWNJbnRlcnBvbGFudH0gVGhlIG5ldyBpbnRlcnBvbGFudC5cclxuXHQgKi9cclxuXHRJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGgoIHJlc3VsdCApIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IEN1YmljSW50ZXJwb2xhbnQoIHRoaXMudGltZXMsIHRoaXMudmFsdWVzLCB0aGlzLmdldFZhbHVlU2l6ZSgpLCByZXN1bHQgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWZpbmVzIHRoZSBpbnRlcnBvbGF0aW9uIGZhY3RvciBtZXRob2QgZm9yIHRoaXMga2V5ZnJhbWUgdHJhY2suXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geyhJbnRlcnBvbGF0ZUxpbmVhcnxJbnRlcnBvbGF0ZURpc2NyZXRlfEludGVycG9sYXRlU21vb3RoKX0gaW50ZXJwb2xhdGlvbiAtIFRoZSBpbnRlcnBvbGF0aW9uIHR5cGUuXHJcblx0ICogQHJldHVybiB7S2V5ZnJhbWVUcmFja30gQSByZWZlcmVuY2UgdG8gdGhpcyBrZXlmcmFtZSB0cmFjay5cclxuXHQgKi9cclxuXHRzZXRJbnRlcnBvbGF0aW9uKCBpbnRlcnBvbGF0aW9uICkge1xyXG5cclxuXHRcdGxldCBmYWN0b3J5TWV0aG9kO1xyXG5cclxuXHRcdHN3aXRjaCAoIGludGVycG9sYXRpb24gKSB7XHJcblxyXG5cdFx0XHRjYXNlIEludGVycG9sYXRlRGlzY3JldGU6XHJcblxyXG5cdFx0XHRcdGZhY3RvcnlNZXRob2QgPSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZERpc2NyZXRlO1xyXG5cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgSW50ZXJwb2xhdGVMaW5lYXI6XHJcblxyXG5cdFx0XHRcdGZhY3RvcnlNZXRob2QgPSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjtcclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIEludGVycG9sYXRlU21vb3RoOlxyXG5cclxuXHRcdFx0XHRmYWN0b3J5TWV0aG9kID0gdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg7XHJcblxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGZhY3RvcnlNZXRob2QgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGNvbnN0IG1lc3NhZ2UgPSAndW5zdXBwb3J0ZWQgaW50ZXJwb2xhdGlvbiBmb3IgJyArXHJcblx0XHRcdFx0dGhpcy5WYWx1ZVR5cGVOYW1lICsgJyBrZXlmcmFtZSB0cmFjayBuYW1lZCAnICsgdGhpcy5uYW1lO1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLmNyZWF0ZUludGVycG9sYW50ID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdC8vIGZhbGwgYmFjayB0byBkZWZhdWx0LCB1bmxlc3MgdGhlIGRlZmF1bHQgaXRzZWxmIGlzIG1lc3NlZCB1cFxyXG5cdFx0XHRcdGlmICggaW50ZXJwb2xhdGlvbiAhPT0gdGhpcy5EZWZhdWx0SW50ZXJwb2xhdGlvbiApIHtcclxuXHJcblx0XHRcdFx0XHR0aGlzLnNldEludGVycG9sYXRpb24oIHRoaXMuRGVmYXVsdEludGVycG9sYXRpb24gKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoIG1lc3NhZ2UgKTsgLy8gZmF0YWwsIGluIHRoaXMgY2FzZVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5LZXlmcmFtZVRyYWNrOicsIG1lc3NhZ2UgKTtcclxuXHRcdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuY3JlYXRlSW50ZXJwb2xhbnQgPSBmYWN0b3J5TWV0aG9kO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGN1cnJlbnQgaW50ZXJwb2xhdGlvbiB0eXBlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7KEludGVycG9sYXRlTGluZWFyfEludGVycG9sYXRlRGlzY3JldGV8SW50ZXJwb2xhdGVTbW9vdGgpfSBUaGUgaW50ZXJwb2xhdGlvbiB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldEludGVycG9sYXRpb24oKSB7XHJcblxyXG5cdFx0c3dpdGNoICggdGhpcy5jcmVhdGVJbnRlcnBvbGFudCApIHtcclxuXHJcblx0XHRcdGNhc2UgdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZTpcclxuXHJcblx0XHRcdFx0cmV0dXJuIEludGVycG9sYXRlRGlzY3JldGU7XHJcblxyXG5cdFx0XHRjYXNlIHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyOlxyXG5cclxuXHRcdFx0XHRyZXR1cm4gSW50ZXJwb2xhdGVMaW5lYXI7XHJcblxyXG5cdFx0XHRjYXNlIHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOlxyXG5cclxuXHRcdFx0XHRyZXR1cm4gSW50ZXJwb2xhdGVTbW9vdGg7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHZhbHVlIHNpemUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB2YWx1ZSBzaXplLlxyXG5cdCAqL1xyXG5cdGdldFZhbHVlU2l6ZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy52YWx1ZXMubGVuZ3RoIC8gdGhpcy50aW1lcy5sZW5ndGg7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTW92ZXMgYWxsIGtleWZyYW1lcyBlaXRoZXIgZm9yd2FyZCBvciBiYWNrd2FyZCBpbiB0aW1lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHRpbWVPZmZzZXQgLSBUaGUgb2Zmc2V0IHRvIG1vdmUgdGhlIHRpbWUgdmFsdWVzLlxyXG5cdCAqIEByZXR1cm4ge0tleWZyYW1lVHJhY2t9IEEgcmVmZXJlbmNlIHRvIHRoaXMga2V5ZnJhbWUgdHJhY2suXHJcblx0ICovXHJcblx0c2hpZnQoIHRpbWVPZmZzZXQgKSB7XHJcblxyXG5cdFx0aWYgKCB0aW1lT2Zmc2V0ICE9PSAwLjAgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB0aW1lcyA9IHRoaXMudGltZXM7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIG4gPSB0aW1lcy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XHJcblxyXG5cdFx0XHRcdHRpbWVzWyBpIF0gKz0gdGltZU9mZnNldDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2NhbGUgYWxsIGtleWZyYW1lIHRpbWVzIGJ5IGEgZmFjdG9yICh1c2VmdWwgZm9yIGZyYW1lIC0gc2Vjb25kcyBjb252ZXJzaW9ucykuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdGltZVNjYWxlIC0gVGhlIHRpbWUgc2NhbGUuXHJcblx0ICogQHJldHVybiB7S2V5ZnJhbWVUcmFja30gQSByZWZlcmVuY2UgdG8gdGhpcyBrZXlmcmFtZSB0cmFjay5cclxuXHQgKi9cclxuXHRzY2FsZSggdGltZVNjYWxlICkge1xyXG5cclxuXHRcdGlmICggdGltZVNjYWxlICE9PSAxLjAgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB0aW1lcyA9IHRoaXMudGltZXM7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIG4gPSB0aW1lcy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XHJcblxyXG5cdFx0XHRcdHRpbWVzWyBpIF0gKj0gdGltZVNjYWxlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW1vdmVzIGtleWZyYW1lcyBiZWZvcmUgYW5kIGFmdGVyIGFuaW1hdGlvbiB3aXRob3V0IGNoYW5naW5nIGFueSB2YWx1ZXMgd2l0aGluIHRoZSBkZWZpbmVkIHRpbWUgcmFuZ2UuXHJcblx0ICpcclxuXHQgKiBOb3RlOiBUaGUgbWV0aG9kIGRvZXMgbm90IHNoaWZ0IGFyb3VuZCBrZXlzIHRvIHRoZSBzdGFydCBvZiB0aGUgdHJhY2sgdGltZSwgYmVjYXVzZSBmb3IgaW50ZXJwb2xhdGVkXHJcblx0ICoga2V5cyB0aGlzIHdpbGwgY2hhbmdlIHRoZWlyIHZhbHVlc1xyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0VGltZSAtIFRoZSBzdGFydCB0aW1lLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBlbmRUaW1lIC0gVGhlIGVuZCB0aW1lLlxyXG5cdCAqIEByZXR1cm4ge0tleWZyYW1lVHJhY2t9IEEgcmVmZXJlbmNlIHRvIHRoaXMga2V5ZnJhbWUgdHJhY2suXHJcblx0ICovXHJcblx0dHJpbSggc3RhcnRUaW1lLCBlbmRUaW1lICkge1xyXG5cclxuXHRcdGNvbnN0IHRpbWVzID0gdGhpcy50aW1lcyxcclxuXHRcdFx0bktleXMgPSB0aW1lcy5sZW5ndGg7XHJcblxyXG5cdFx0bGV0IGZyb20gPSAwLFxyXG5cdFx0XHR0byA9IG5LZXlzIC0gMTtcclxuXHJcblx0XHR3aGlsZSAoIGZyb20gIT09IG5LZXlzICYmIHRpbWVzWyBmcm9tIF0gPCBzdGFydFRpbWUgKSB7XHJcblxyXG5cdFx0XHQrKyBmcm9tO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR3aGlsZSAoIHRvICE9PSAtIDEgJiYgdGltZXNbIHRvIF0gPiBlbmRUaW1lICkge1xyXG5cclxuXHRcdFx0LS0gdG87XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdCsrIHRvOyAvLyBpbmNsdXNpdmUgLT4gZXhjbHVzaXZlIGJvdW5kXHJcblxyXG5cdFx0aWYgKCBmcm9tICE9PSAwIHx8IHRvICE9PSBuS2V5cyApIHtcclxuXHJcblx0XHRcdC8vIGVtcHR5IHRyYWNrcyBhcmUgZm9yYmlkZGVuLCBzbyBrZWVwIGF0IGxlYXN0IG9uZSBrZXlmcmFtZVxyXG5cdFx0XHRpZiAoIGZyb20gPj0gdG8gKSB7XHJcblxyXG5cdFx0XHRcdHRvID0gTWF0aC5tYXgoIHRvLCAxICk7XHJcblx0XHRcdFx0ZnJvbSA9IHRvIC0gMTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IHN0cmlkZSA9IHRoaXMuZ2V0VmFsdWVTaXplKCk7XHJcblx0XHRcdHRoaXMudGltZXMgPSB0aW1lcy5zbGljZSggZnJvbSwgdG8gKTtcclxuXHRcdFx0dGhpcy52YWx1ZXMgPSB0aGlzLnZhbHVlcy5zbGljZSggZnJvbSAqIHN0cmlkZSwgdG8gKiBzdHJpZGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUGVyZm9ybXMgbWluaW1hbCB2YWxpZGF0aW9uIG9uIHRoZSBrZXlmcmFtZSB0cmFjay4gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlc1xyXG5cdCAqIGFyZSB2YWxpZC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGtleWZyYW1lcyBhcmUgdmFsaWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdHZhbGlkYXRlKCkge1xyXG5cclxuXHRcdGxldCB2YWxpZCA9IHRydWU7XHJcblxyXG5cdFx0Y29uc3QgdmFsdWVTaXplID0gdGhpcy5nZXRWYWx1ZVNpemUoKTtcclxuXHRcdGlmICggdmFsdWVTaXplIC0gTWF0aC5mbG9vciggdmFsdWVTaXplICkgIT09IDAgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogSW52YWxpZCB2YWx1ZSBzaXplIGluIHRyYWNrLicsIHRoaXMgKTtcclxuXHRcdFx0dmFsaWQgPSBmYWxzZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgdGltZXMgPSB0aGlzLnRpbWVzLFxyXG5cdFx0XHR2YWx1ZXMgPSB0aGlzLnZhbHVlcyxcclxuXHJcblx0XHRcdG5LZXlzID0gdGltZXMubGVuZ3RoO1xyXG5cclxuXHRcdGlmICggbktleXMgPT09IDAgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogVHJhY2sgaXMgZW1wdHkuJywgdGhpcyApO1xyXG5cdFx0XHR2YWxpZCA9IGZhbHNlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRsZXQgcHJldlRpbWUgPSBudWxsO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSAhPT0gbktleXM7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBjdXJyVGltZSA9IHRpbWVzWyBpIF07XHJcblxyXG5cdFx0XHRpZiAoIHR5cGVvZiBjdXJyVGltZSA9PT0gJ251bWJlcicgJiYgaXNOYU4oIGN1cnJUaW1lICkgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5LZXlmcmFtZVRyYWNrOiBUaW1lIGlzIG5vdCBhIHZhbGlkIG51bWJlci4nLCB0aGlzLCBpLCBjdXJyVGltZSApO1xyXG5cdFx0XHRcdHZhbGlkID0gZmFsc2U7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHByZXZUaW1lICE9PSBudWxsICYmIHByZXZUaW1lID4gY3VyclRpbWUgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5LZXlmcmFtZVRyYWNrOiBPdXQgb2Ygb3JkZXIga2V5cy4nLCB0aGlzLCBpLCBjdXJyVGltZSwgcHJldlRpbWUgKTtcclxuXHRcdFx0XHR2YWxpZCA9IGZhbHNlO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cHJldlRpbWUgPSBjdXJyVGltZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB2YWx1ZXMgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGlmICggQW5pbWF0aW9uVXRpbHMuaXNUeXBlZEFycmF5KCB2YWx1ZXMgKSApIHtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBuID0gdmFsdWVzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCB2YWx1ZSA9IHZhbHVlc1sgaSBdO1xyXG5cclxuXHRcdFx0XHRcdGlmICggaXNOYU4oIHZhbHVlICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogVmFsdWUgaXMgbm90IGEgdmFsaWQgbnVtYmVyLicsIHRoaXMsIGksIHZhbHVlICk7XHJcblx0XHRcdFx0XHRcdHZhbGlkID0gZmFsc2U7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdmFsaWQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogT3B0aW1pemVzIHRoaXMga2V5ZnJhbWUgdHJhY2sgYnkgcmVtb3ZpbmcgZXF1aXZhbGVudCBzZXF1ZW50aWFsIGtleXMgKHdoaWNoIGFyZVxyXG5cdCAqIGNvbW1vbiBpbiBtb3JwaCB0YXJnZXQgc2VxdWVuY2VzKS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0FuaW1hdGlvbkNsaXB9IEEgcmVmZXJlbmNlIHRvIHRoaXMgYW5pbWF0aW9uIGNsaXAuXHJcblx0ICovXHJcblx0b3B0aW1pemUoKSB7XHJcblxyXG5cdFx0Ly8gKDAsMCwwLDAsMSwxLDEsMCwwLDAsMCwwLDAsMCkgLS0+ICgwLDAsMSwxLDAsMClcclxuXHJcblx0XHQvLyB0aW1lcyBvciB2YWx1ZXMgbWF5IGJlIHNoYXJlZCB3aXRoIG90aGVyIHRyYWNrcywgc28gb3ZlcndyaXRpbmcgaXMgdW5zYWZlXHJcblx0XHRjb25zdCB0aW1lcyA9IHRoaXMudGltZXMuc2xpY2UoKSxcclxuXHRcdFx0dmFsdWVzID0gdGhpcy52YWx1ZXMuc2xpY2UoKSxcclxuXHRcdFx0c3RyaWRlID0gdGhpcy5nZXRWYWx1ZVNpemUoKSxcclxuXHJcblx0XHRcdHNtb290aEludGVycG9sYXRpb24gPSB0aGlzLmdldEludGVycG9sYXRpb24oKSA9PT0gSW50ZXJwb2xhdGVTbW9vdGgsXHJcblxyXG5cdFx0XHRsYXN0SW5kZXggPSB0aW1lcy5sZW5ndGggLSAxO1xyXG5cclxuXHRcdGxldCB3cml0ZUluZGV4ID0gMTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDE7IGkgPCBsYXN0SW5kZXg7ICsrIGkgKSB7XHJcblxyXG5cdFx0XHRsZXQga2VlcCA9IGZhbHNlO1xyXG5cclxuXHRcdFx0Y29uc3QgdGltZSA9IHRpbWVzWyBpIF07XHJcblx0XHRcdGNvbnN0IHRpbWVOZXh0ID0gdGltZXNbIGkgKyAxIF07XHJcblxyXG5cdFx0XHQvLyByZW1vdmUgYWRqYWNlbnQga2V5ZnJhbWVzIHNjaGVkdWxlZCBhdCB0aGUgc2FtZSB0aW1lXHJcblxyXG5cdFx0XHRpZiAoIHRpbWUgIT09IHRpbWVOZXh0ICYmICggaSAhPT0gMSB8fCB0aW1lICE9PSB0aW1lc1sgMCBdICkgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggISBzbW9vdGhJbnRlcnBvbGF0aW9uICkge1xyXG5cclxuXHRcdFx0XHRcdC8vIHJlbW92ZSB1bm5lY2Vzc2FyeSBrZXlmcmFtZXMgc2FtZSBhcyB0aGVpciBuZWlnaGJvcnNcclxuXHJcblx0XHRcdFx0XHRjb25zdCBvZmZzZXQgPSBpICogc3RyaWRlLFxyXG5cdFx0XHRcdFx0XHRvZmZzZXRQID0gb2Zmc2V0IC0gc3RyaWRlLFxyXG5cdFx0XHRcdFx0XHRvZmZzZXROID0gb2Zmc2V0ICsgc3RyaWRlO1xyXG5cclxuXHRcdFx0XHRcdGZvciAoIGxldCBqID0gMDsgaiAhPT0gc3RyaWRlOyArKyBqICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgdmFsdWUgPSB2YWx1ZXNbIG9mZnNldCArIGogXTtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggdmFsdWUgIT09IHZhbHVlc1sgb2Zmc2V0UCArIGogXSB8fFxyXG5cdFx0XHRcdFx0XHRcdHZhbHVlICE9PSB2YWx1ZXNbIG9mZnNldE4gKyBqIF0gKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGtlZXAgPSB0cnVlO1xyXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRrZWVwID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gaW4tcGxhY2UgY29tcGFjdGlvblxyXG5cclxuXHRcdFx0aWYgKCBrZWVwICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIGkgIT09IHdyaXRlSW5kZXggKSB7XHJcblxyXG5cdFx0XHRcdFx0dGltZXNbIHdyaXRlSW5kZXggXSA9IHRpbWVzWyBpIF07XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgcmVhZE9mZnNldCA9IGkgKiBzdHJpZGUsXHJcblx0XHRcdFx0XHRcdHdyaXRlT2Zmc2V0ID0gd3JpdGVJbmRleCAqIHN0cmlkZTtcclxuXHJcblx0XHRcdFx0XHRmb3IgKCBsZXQgaiA9IDA7IGogIT09IHN0cmlkZTsgKysgaiApIHtcclxuXHJcblx0XHRcdFx0XHRcdHZhbHVlc1sgd3JpdGVPZmZzZXQgKyBqIF0gPSB2YWx1ZXNbIHJlYWRPZmZzZXQgKyBqIF07XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdCsrIHdyaXRlSW5kZXg7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGZsdXNoIGxhc3Qga2V5ZnJhbWUgKGNvbXBhY3Rpb24gbG9va3MgYWhlYWQpXHJcblxyXG5cdFx0aWYgKCBsYXN0SW5kZXggPiAwICkge1xyXG5cclxuXHRcdFx0dGltZXNbIHdyaXRlSW5kZXggXSA9IHRpbWVzWyBsYXN0SW5kZXggXTtcclxuXHJcblx0XHRcdGZvciAoIGxldCByZWFkT2Zmc2V0ID0gbGFzdEluZGV4ICogc3RyaWRlLCB3cml0ZU9mZnNldCA9IHdyaXRlSW5kZXggKiBzdHJpZGUsIGogPSAwOyBqICE9PSBzdHJpZGU7ICsrIGogKSB7XHJcblxyXG5cdFx0XHRcdHZhbHVlc1sgd3JpdGVPZmZzZXQgKyBqIF0gPSB2YWx1ZXNbIHJlYWRPZmZzZXQgKyBqIF07XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQrKyB3cml0ZUluZGV4O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHdyaXRlSW5kZXggIT09IHRpbWVzLmxlbmd0aCApIHtcclxuXHJcblx0XHRcdHRoaXMudGltZXMgPSB0aW1lcy5zbGljZSggMCwgd3JpdGVJbmRleCApO1xyXG5cdFx0XHR0aGlzLnZhbHVlcyA9IHZhbHVlcy5zbGljZSggMCwgd3JpdGVJbmRleCAqIHN0cmlkZSApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR0aGlzLnRpbWVzID0gdGltZXM7XHJcblx0XHRcdHRoaXMudmFsdWVzID0gdmFsdWVzO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbmV3IGtleWZyYW1lIHRyYWNrIHdpdGggY29waWVkIHZhbHVlcyBmcm9tIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtLZXlmcmFtZVRyYWNrfSBBIGNsb25lIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y2xvbmUoKSB7XHJcblxyXG5cdFx0Y29uc3QgdGltZXMgPSB0aGlzLnRpbWVzLnNsaWNlKCk7XHJcblx0XHRjb25zdCB2YWx1ZXMgPSB0aGlzLnZhbHVlcy5zbGljZSgpO1xyXG5cclxuXHRcdGNvbnN0IFR5cGVkS2V5ZnJhbWVUcmFjayA9IHRoaXMuY29uc3RydWN0b3I7XHJcblx0XHRjb25zdCB0cmFjayA9IG5ldyBUeXBlZEtleWZyYW1lVHJhY2soIHRoaXMubmFtZSwgdGltZXMsIHZhbHVlcyApO1xyXG5cclxuXHRcdC8vIEludGVycG9sYW50IGFyZ3VtZW50IHRvIGNvbnN0cnVjdG9yIGlzIG5vdCBzYXZlZCwgc28gY29weSB0aGUgZmFjdG9yeSBtZXRob2QgZGlyZWN0bHkuXHJcblx0XHR0cmFjay5jcmVhdGVJbnRlcnBvbGFudCA9IHRoaXMuY3JlYXRlSW50ZXJwb2xhbnQ7XHJcblxyXG5cdFx0cmV0dXJuIHRyYWNrO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogVGhlIHZhbHVlIHR5cGUgbmFtZS5cclxuICpcclxuICogQHR5cGUge1N0cmluZ31cclxuICogQGRlZmF1bHQgJydcclxuICovXHJcbktleWZyYW1lVHJhY2sucHJvdG90eXBlLlZhbHVlVHlwZU5hbWUgPSAnJztcclxuXHJcbi8qKlxyXG4gKiBUaGUgdGltZSBidWZmZXIgdHlwZSBvZiB0aGlzIGtleWZyYW1lIHRyYWNrLlxyXG4gKlxyXG4gKiBAdHlwZSB7VHlwZWRBcnJheXxBcnJheX1cclxuICogQGRlZmF1bHQgRmxvYXQzMkFycmF5LmNvbnN0cnVjdG9yXHJcbiAqL1xyXG5LZXlmcmFtZVRyYWNrLnByb3RvdHlwZS5UaW1lQnVmZmVyVHlwZSA9IEZsb2F0MzJBcnJheTtcclxuXHJcbi8qKlxyXG4gKiBUaGUgdmFsdWUgYnVmZmVyIHR5cGUgb2YgdGhpcyBrZXlmcmFtZSB0cmFjay5cclxuICpcclxuICogQHR5cGUge1R5cGVkQXJyYXl8QXJyYXl9XHJcbiAqIEBkZWZhdWx0IEZsb2F0MzJBcnJheS5jb25zdHJ1Y3RvclxyXG4gKi9cclxuS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUuVmFsdWVCdWZmZXJUeXBlID0gRmxvYXQzMkFycmF5O1xyXG5cclxuLyoqXHJcbiAqIFRoZSBkZWZhdWx0IGludGVycG9sYXRpb24gdHlwZSBvZiB0aGlzIGtleWZyYW1lIHRyYWNrLlxyXG4gKlxyXG4gKiBAdHlwZSB7KEludGVycG9sYXRlTGluZWFyfEludGVycG9sYXRlRGlzY3JldGV8SW50ZXJwb2xhdGVTbW9vdGgpfVxyXG4gKiBAZGVmYXVsdCBJbnRlcnBvbGF0ZUxpbmVhclxyXG4gKi9cclxuS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUuRGVmYXVsdEludGVycG9sYXRpb24gPSBJbnRlcnBvbGF0ZUxpbmVhcjtcclxuXHJcbmV4cG9ydCB7IEtleWZyYW1lVHJhY2sgfTtcclxuIiwiaW1wb3J0IHsgSW50ZXJwb2xhdGVEaXNjcmV0ZSB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IEtleWZyYW1lVHJhY2sgfSBmcm9tICcuLi9LZXlmcmFtZVRyYWNrLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIHRyYWNrIGZvciBib29sZWFuIGtleWZyYW1lIHZhbHVlcy5cclxuICpcclxuICogQGF1Z21lbnRzIEtleWZyYW1lVHJhY2tcclxuICovXHJcbmNsYXNzIEJvb2xlYW5LZXlmcmFtZVRyYWNrIGV4dGVuZHMgS2V5ZnJhbWVUcmFjayB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYm9vbGVhbiBrZXlmcmFtZSB0cmFjay5cclxuXHQgKlxyXG5cdCAqIFRoaXMga2V5ZnJhbWUgdHJhY2sgdHlwZSBoYXMgbm8gYGludGVycG9sYXRpb25gIHBhcmFtZXRlciBiZWNhdXNlIHRoZVxyXG5cdCAqIGludGVycG9sYXRpb24gaXMgYWx3YXlzIGRpc2NyZXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUga2V5ZnJhbWUgdHJhY2sncyBuYW1lLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gdGltZXMgLSBBIGxpc3Qgb2Yga2V5ZnJhbWUgdGltZXMuXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSB2YWx1ZXMgLSBBIGxpc3Qgb2Yga2V5ZnJhbWUgdmFsdWVzLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBuYW1lLCB0aW1lcywgdmFsdWVzICkge1xyXG5cclxuXHRcdHN1cGVyKCBuYW1lLCB0aW1lcywgdmFsdWVzICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUaGUgdmFsdWUgdHlwZSBuYW1lLlxyXG4gKlxyXG4gKiBAdHlwZSB7U3RyaW5nfVxyXG4gKiBAZGVmYXVsdCAnYm9vbCdcclxuICovXHJcbkJvb2xlYW5LZXlmcmFtZVRyYWNrLnByb3RvdHlwZS5WYWx1ZVR5cGVOYW1lID0gJ2Jvb2wnO1xyXG5cclxuLyoqXHJcbiAqIFRoZSB2YWx1ZSBidWZmZXIgdHlwZSBvZiB0aGlzIGtleWZyYW1lIHRyYWNrLlxyXG4gKlxyXG4gKiBAdHlwZSB7VHlwZWRBcnJheXxBcnJheX1cclxuICogQGRlZmF1bHQgQXJyYXkuY29uc3RydWN0b3JcclxuICovXHJcbkJvb2xlYW5LZXlmcmFtZVRyYWNrLnByb3RvdHlwZS5WYWx1ZUJ1ZmZlclR5cGUgPSBBcnJheTtcclxuXHJcbi8qKlxyXG4gKiBUaGUgZGVmYXVsdCBpbnRlcnBvbGF0aW9uIHR5cGUgb2YgdGhpcyBrZXlmcmFtZSB0cmFjay5cclxuICpcclxuICogQHR5cGUgeyhJbnRlcnBvbGF0ZUxpbmVhcnxJbnRlcnBvbGF0ZURpc2NyZXRlfEludGVycG9sYXRlU21vb3RoKX1cclxuICogQGRlZmF1bHQgSW50ZXJwb2xhdGVEaXNjcmV0ZVxyXG4gKi9cclxuQm9vbGVhbktleWZyYW1lVHJhY2sucHJvdG90eXBlLkRlZmF1bHRJbnRlcnBvbGF0aW9uID0gSW50ZXJwb2xhdGVEaXNjcmV0ZTtcclxuQm9vbGVhbktleWZyYW1lVHJhY2sucHJvdG90eXBlLkludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhciA9IHVuZGVmaW5lZDtcclxuQm9vbGVhbktleWZyYW1lVHJhY2sucHJvdG90eXBlLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aCA9IHVuZGVmaW5lZDtcclxuXHJcbmV4cG9ydCB7IEJvb2xlYW5LZXlmcmFtZVRyYWNrIH07XHJcbiIsImltcG9ydCB7IEtleWZyYW1lVHJhY2sgfSBmcm9tICcuLi9LZXlmcmFtZVRyYWNrLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIHRyYWNrIGZvciBjb2xvciBrZXlmcmFtZSB2YWx1ZXMuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBLZXlmcmFtZVRyYWNrXHJcbiAqL1xyXG5jbGFzcyBDb2xvcktleWZyYW1lVHJhY2sgZXh0ZW5kcyBLZXlmcmFtZVRyYWNrIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBjb2xvciBrZXlmcmFtZSB0cmFjay5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIGtleWZyYW1lIHRyYWNrJ3MgbmFtZS5cclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IHRpbWVzIC0gQSBsaXN0IG9mIGtleWZyYW1lIHRpbWVzLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gdmFsdWVzIC0gQSBsaXN0IG9mIGtleWZyYW1lIHZhbHVlcy5cclxuXHQgKiBAcGFyYW0geyhJbnRlcnBvbGF0ZUxpbmVhcnxJbnRlcnBvbGF0ZURpc2NyZXRlfEludGVycG9sYXRlU21vb3RoKX0gW2ludGVycG9sYXRpb25dIC0gVGhlIGludGVycG9sYXRpb24gdHlwZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApIHtcclxuXHJcblx0XHRzdXBlciggbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogVGhlIHZhbHVlIHR5cGUgbmFtZS5cclxuICpcclxuICogQHR5cGUge1N0cmluZ31cclxuICogQGRlZmF1bHQgJ2NvbG9yJ1xyXG4gKi9cclxuQ29sb3JLZXlmcmFtZVRyYWNrLnByb3RvdHlwZS5WYWx1ZVR5cGVOYW1lID0gJ2NvbG9yJztcclxuLy8gVmFsdWVCdWZmZXJUeXBlIGlzIGluaGVyaXRlZFxyXG4vLyBEZWZhdWx0SW50ZXJwb2xhdGlvbiBpcyBpbmhlcml0ZWRcclxuXHJcbmV4cG9ydCB7IENvbG9yS2V5ZnJhbWVUcmFjayB9O1xyXG4iLCJpbXBvcnQgeyBLZXlmcmFtZVRyYWNrIH0gZnJvbSAnLi4vS2V5ZnJhbWVUcmFjay5qcyc7XHJcblxyXG4vKipcclxuICogQSB0cmFjayBmb3IgbnVtZXJpYyBrZXlmcmFtZSB2YWx1ZXMuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBLZXlmcmFtZVRyYWNrXHJcbiAqL1xyXG5jbGFzcyBOdW1iZXJLZXlmcmFtZVRyYWNrIGV4dGVuZHMgS2V5ZnJhbWVUcmFjayB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbnVtYmVyIGtleWZyYW1lIHRyYWNrLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUga2V5ZnJhbWUgdHJhY2sncyBuYW1lLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gdGltZXMgLSBBIGxpc3Qgb2Yga2V5ZnJhbWUgdGltZXMuXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSB2YWx1ZXMgLSBBIGxpc3Qgb2Yga2V5ZnJhbWUgdmFsdWVzLlxyXG5cdCAqIEBwYXJhbSB7KEludGVycG9sYXRlTGluZWFyfEludGVycG9sYXRlRGlzY3JldGV8SW50ZXJwb2xhdGVTbW9vdGgpfSBbaW50ZXJwb2xhdGlvbl0gLSBUaGUgaW50ZXJwb2xhdGlvbiB0eXBlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICkge1xyXG5cclxuXHRcdHN1cGVyKCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUaGUgdmFsdWUgdHlwZSBuYW1lLlxyXG4gKlxyXG4gKiBAdHlwZSB7U3RyaW5nfVxyXG4gKiBAZGVmYXVsdCAnbnVtYmVyJ1xyXG4gKi9cclxuTnVtYmVyS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUuVmFsdWVUeXBlTmFtZSA9ICdudW1iZXInO1xyXG4vLyBWYWx1ZUJ1ZmZlclR5cGUgaXMgaW5oZXJpdGVkXHJcbi8vIERlZmF1bHRJbnRlcnBvbGF0aW9uIGlzIGluaGVyaXRlZFxyXG5cclxuZXhwb3J0IHsgTnVtYmVyS2V5ZnJhbWVUcmFjayB9O1xyXG4iLCJpbXBvcnQgeyBJbnRlcnBvbGFudCB9IGZyb20gJy4uL0ludGVycG9sYW50LmpzJztcclxuaW1wb3J0IHsgUXVhdGVybmlvbiB9IGZyb20gJy4uL1F1YXRlcm5pb24uanMnO1xyXG5cclxuLyoqXHJcbiAqIFNwaGVyaWNhbCBsaW5lYXIgdW5pdCBxdWF0ZXJuaW9uIGludGVycG9sYW50LlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgSW50ZXJwb2xhbnRcclxuICovXHJcbmNsYXNzIFF1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudCBleHRlbmRzIEludGVycG9sYW50IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBTTEVSUCBpbnRlcnBvbGFudC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VHlwZWRBcnJheX0gcGFyYW1ldGVyUG9zaXRpb25zIC0gVGhlIHBhcmFtZXRlciBwb3NpdGlvbnMgaG9sZCB0aGUgaW50ZXJwb2xhdGlvbiBmYWN0b3JzLlxyXG5cdCAqIEBwYXJhbSB7VHlwZWRBcnJheX0gc2FtcGxlVmFsdWVzIC0gVGhlIHNhbXBsZSB2YWx1ZXMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHNhbXBsZVNpemUgLSBUaGUgc2FtcGxlIHNpemVcclxuXHQgKiBAcGFyYW0ge1R5cGVkQXJyYXl9IFtyZXN1bHRCdWZmZXJdIC0gVGhlIHJlc3VsdCBidWZmZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKSB7XHJcblxyXG5cdFx0c3VwZXIoIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHRpbnRlcnBvbGF0ZV8oIGkxLCB0MCwgdCwgdDEgKSB7XHJcblxyXG5cdFx0Y29uc3QgcmVzdWx0ID0gdGhpcy5yZXN1bHRCdWZmZXIsXHJcblx0XHRcdHZhbHVlcyA9IHRoaXMuc2FtcGxlVmFsdWVzLFxyXG5cdFx0XHRzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSxcclxuXHJcblx0XHRcdGFscGhhID0gKCB0IC0gdDAgKSAvICggdDEgLSB0MCApO1xyXG5cclxuXHRcdGxldCBvZmZzZXQgPSBpMSAqIHN0cmlkZTtcclxuXHJcblx0XHRmb3IgKCBsZXQgZW5kID0gb2Zmc2V0ICsgc3RyaWRlOyBvZmZzZXQgIT09IGVuZDsgb2Zmc2V0ICs9IDQgKSB7XHJcblxyXG5cdFx0XHRRdWF0ZXJuaW9uLnNsZXJwRmxhdCggcmVzdWx0LCAwLCB2YWx1ZXMsIG9mZnNldCAtIHN0cmlkZSwgdmFsdWVzLCBvZmZzZXQsIGFscGhhICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBRdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQgfTtcclxuIiwiaW1wb3J0IHsgS2V5ZnJhbWVUcmFjayB9IGZyb20gJy4uL0tleWZyYW1lVHJhY2suanMnO1xyXG5pbXBvcnQgeyBRdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQgfSBmcm9tICcuLi8uLi9tYXRoL2ludGVycG9sYW50cy9RdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgdHJhY2sgZm9yIFF1YXRlcm5pb24ga2V5ZnJhbWUgdmFsdWVzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgS2V5ZnJhbWVUcmFja1xyXG4gKi9cclxuY2xhc3MgUXVhdGVybmlvbktleWZyYW1lVHJhY2sgZXh0ZW5kcyBLZXlmcmFtZVRyYWNrIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBRdWF0ZXJuaW9uIGtleWZyYW1lIHRyYWNrLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUga2V5ZnJhbWUgdHJhY2sncyBuYW1lLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gdGltZXMgLSBBIGxpc3Qgb2Yga2V5ZnJhbWUgdGltZXMuXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSB2YWx1ZXMgLSBBIGxpc3Qgb2Yga2V5ZnJhbWUgdmFsdWVzLlxyXG5cdCAqIEBwYXJhbSB7KEludGVycG9sYXRlTGluZWFyfEludGVycG9sYXRlRGlzY3JldGV8SW50ZXJwb2xhdGVTbW9vdGgpfSBbaW50ZXJwb2xhdGlvbl0gLSBUaGUgaW50ZXJwb2xhdGlvbiB0eXBlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICkge1xyXG5cclxuXHRcdHN1cGVyKCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogT3ZlcndyaXR0ZW4gc28gdGhlIG1ldGhvZCByZXR1cm5zIFF1YXRlcm5pb24gYmFzZWQgaW50ZXJwb2xhbnQuXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQHBhcmFtIHtUeXBlZEFycmF5fSBbcmVzdWx0XSAtIFRoZSByZXN1bHQgYnVmZmVyLlxyXG5cdCAqIEByZXR1cm4ge1F1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudH0gVGhlIG5ldyBpbnRlcnBvbGFudC5cclxuXHQgKi9cclxuXHRJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXIoIHJlc3VsdCApIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IFF1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudCggdGhpcy50aW1lcywgdGhpcy52YWx1ZXMsIHRoaXMuZ2V0VmFsdWVTaXplKCksIHJlc3VsdCApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogVGhlIHZhbHVlIHR5cGUgbmFtZS5cclxuICpcclxuICogQHR5cGUge1N0cmluZ31cclxuICogQGRlZmF1bHQgJ3F1YXRlcm5pb24nXHJcbiAqL1xyXG5RdWF0ZXJuaW9uS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUuVmFsdWVUeXBlTmFtZSA9ICdxdWF0ZXJuaW9uJztcclxuLy8gVmFsdWVCdWZmZXJUeXBlIGlzIGluaGVyaXRlZFxyXG4vLyBEZWZhdWx0SW50ZXJwb2xhdGlvbiBpcyBpbmhlcml0ZWQ7XHJcblF1YXRlcm5pb25LZXlmcmFtZVRyYWNrLnByb3RvdHlwZS5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGggPSB1bmRlZmluZWQ7XHJcblxyXG5leHBvcnQgeyBRdWF0ZXJuaW9uS2V5ZnJhbWVUcmFjayB9O1xyXG4iLCJpbXBvcnQgeyBJbnRlcnBvbGF0ZURpc2NyZXRlIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgS2V5ZnJhbWVUcmFjayB9IGZyb20gJy4uL0tleWZyYW1lVHJhY2suanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgdHJhY2sgZm9yIHN0cmluZyBrZXlmcmFtZSB2YWx1ZXMuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBLZXlmcmFtZVRyYWNrXHJcbiAqL1xyXG5jbGFzcyBTdHJpbmdLZXlmcmFtZVRyYWNrIGV4dGVuZHMgS2V5ZnJhbWVUcmFjayB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc3RyaW5nIGtleWZyYW1lIHRyYWNrLlxyXG5cdCAqXHJcblx0ICogVGhpcyBrZXlmcmFtZSB0cmFjayB0eXBlIGhhcyBubyBgaW50ZXJwb2xhdGlvbmAgcGFyYW1ldGVyIGJlY2F1c2UgdGhlXHJcblx0ICogaW50ZXJwb2xhdGlvbiBpcyBhbHdheXMgZGlzY3JldGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBrZXlmcmFtZSB0cmFjaydzIG5hbWUuXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSB0aW1lcyAtIEEgbGlzdCBvZiBrZXlmcmFtZSB0aW1lcy5cclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IHZhbHVlcyAtIEEgbGlzdCBvZiBrZXlmcmFtZSB2YWx1ZXMuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5hbWUsIHRpbWVzLCB2YWx1ZXMgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5hbWUsIHRpbWVzLCB2YWx1ZXMgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFRoZSB2YWx1ZSB0eXBlIG5hbWUuXHJcbiAqXHJcbiAqIEB0eXBlIHtTdHJpbmd9XHJcbiAqIEBkZWZhdWx0ICdzdHJpbmcnXHJcbiAqL1xyXG5TdHJpbmdLZXlmcmFtZVRyYWNrLnByb3RvdHlwZS5WYWx1ZVR5cGVOYW1lID0gJ3N0cmluZyc7XHJcblxyXG4vKipcclxuICogVGhlIHZhbHVlIGJ1ZmZlciB0eXBlIG9mIHRoaXMga2V5ZnJhbWUgdHJhY2suXHJcbiAqXHJcbiAqIEB0eXBlIHtUeXBlZEFycmF5fEFycmF5fVxyXG4gKiBAZGVmYXVsdCBBcnJheS5jb25zdHJ1Y3RvclxyXG4gKi9cclxuU3RyaW5nS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUuVmFsdWVCdWZmZXJUeXBlID0gQXJyYXk7XHJcblxyXG4vKipcclxuICogVGhlIGRlZmF1bHQgaW50ZXJwb2xhdGlvbiB0eXBlIG9mIHRoaXMga2V5ZnJhbWUgdHJhY2suXHJcbiAqXHJcbiAqIEB0eXBlIHsoSW50ZXJwb2xhdGVMaW5lYXJ8SW50ZXJwb2xhdGVEaXNjcmV0ZXxJbnRlcnBvbGF0ZVNtb290aCl9XHJcbiAqIEBkZWZhdWx0IEludGVycG9sYXRlRGlzY3JldGVcclxuICovXHJcblN0cmluZ0tleWZyYW1lVHJhY2sucHJvdG90eXBlLkRlZmF1bHRJbnRlcnBvbGF0aW9uID0gSW50ZXJwb2xhdGVEaXNjcmV0ZTtcclxuU3RyaW5nS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyID0gdW5kZWZpbmVkO1xyXG5TdHJpbmdLZXlmcmFtZVRyYWNrLnByb3RvdHlwZS5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGggPSB1bmRlZmluZWQ7XHJcblxyXG5leHBvcnQgeyBTdHJpbmdLZXlmcmFtZVRyYWNrIH07XHJcbiIsImltcG9ydCB7IEtleWZyYW1lVHJhY2sgfSBmcm9tICcuLi9LZXlmcmFtZVRyYWNrLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIHRyYWNrIGZvciB2ZWN0b3Iga2V5ZnJhbWUgdmFsdWVzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgS2V5ZnJhbWVUcmFja1xyXG4gKi9cclxuY2xhc3MgVmVjdG9yS2V5ZnJhbWVUcmFjayBleHRlbmRzIEtleWZyYW1lVHJhY2sge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHZlY3RvciBrZXlmcmFtZSB0cmFjay5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIGtleWZyYW1lIHRyYWNrJ3MgbmFtZS5cclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IHRpbWVzIC0gQSBsaXN0IG9mIGtleWZyYW1lIHRpbWVzLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gdmFsdWVzIC0gQSBsaXN0IG9mIGtleWZyYW1lIHZhbHVlcy5cclxuXHQgKiBAcGFyYW0geyhJbnRlcnBvbGF0ZUxpbmVhcnxJbnRlcnBvbGF0ZURpc2NyZXRlfEludGVycG9sYXRlU21vb3RoKX0gW2ludGVycG9sYXRpb25dIC0gVGhlIGludGVycG9sYXRpb24gdHlwZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApIHtcclxuXHJcblx0XHRzdXBlciggbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogVGhlIHZhbHVlIHR5cGUgbmFtZS5cclxuICpcclxuICogQHR5cGUge1N0cmluZ31cclxuICogQGRlZmF1bHQgJ3ZlY3RvcidcclxuICovXHJcblZlY3RvcktleWZyYW1lVHJhY2sucHJvdG90eXBlLlZhbHVlVHlwZU5hbWUgPSAndmVjdG9yJztcclxuLy8gVmFsdWVCdWZmZXJUeXBlIGlzIGluaGVyaXRlZFxyXG4vLyBEZWZhdWx0SW50ZXJwb2xhdGlvbiBpcyBpbmhlcml0ZWRcclxuXHJcbmV4cG9ydCB7IFZlY3RvcktleWZyYW1lVHJhY2sgfTtcclxuIiwiaW1wb3J0ICogYXMgQW5pbWF0aW9uVXRpbHMgZnJvbSAnLi9BbmltYXRpb25VdGlscy5qcyc7XHJcbmltcG9ydCB7IEtleWZyYW1lVHJhY2sgfSBmcm9tICcuL0tleWZyYW1lVHJhY2suanMnO1xyXG5pbXBvcnQgeyBCb29sZWFuS2V5ZnJhbWVUcmFjayB9IGZyb20gJy4vdHJhY2tzL0Jvb2xlYW5LZXlmcmFtZVRyYWNrLmpzJztcclxuaW1wb3J0IHsgQ29sb3JLZXlmcmFtZVRyYWNrIH0gZnJvbSAnLi90cmFja3MvQ29sb3JLZXlmcmFtZVRyYWNrLmpzJztcclxuaW1wb3J0IHsgTnVtYmVyS2V5ZnJhbWVUcmFjayB9IGZyb20gJy4vdHJhY2tzL051bWJlcktleWZyYW1lVHJhY2suanMnO1xyXG5pbXBvcnQgeyBRdWF0ZXJuaW9uS2V5ZnJhbWVUcmFjayB9IGZyb20gJy4vdHJhY2tzL1F1YXRlcm5pb25LZXlmcmFtZVRyYWNrLmpzJztcclxuaW1wb3J0IHsgU3RyaW5nS2V5ZnJhbWVUcmFjayB9IGZyb20gJy4vdHJhY2tzL1N0cmluZ0tleWZyYW1lVHJhY2suanMnO1xyXG5pbXBvcnQgeyBWZWN0b3JLZXlmcmFtZVRyYWNrIH0gZnJvbSAnLi90cmFja3MvVmVjdG9yS2V5ZnJhbWVUcmFjay5qcyc7XHJcbmltcG9ydCB7IGdlbmVyYXRlVVVJRCB9IGZyb20gJy4uL21hdGgvTWF0aFV0aWxzLmpzJztcclxuaW1wb3J0IHsgTm9ybWFsQW5pbWF0aW9uQmxlbmRNb2RlIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIHJldXNhYmxlIHNldCBvZiBrZXlmcmFtZSB0cmFja3Mgd2hpY2ggcmVwcmVzZW50IGFuIGFuaW1hdGlvbi5cclxuICovXHJcbmNsYXNzIEFuaW1hdGlvbkNsaXAge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGFuaW1hdGlvbiBjbGlwLlxyXG5cdCAqXHJcblx0ICogTm90ZTogSW5zdGVhZCBvZiBpbnN0YW50aWF0aW5nIGFuIEFuaW1hdGlvbkNsaXAgZGlyZWN0bHkgd2l0aCB0aGUgY29uc3RydWN0b3IsIHlvdSBjYW5cclxuXHQgKiB1c2UgdGhlIHN0YXRpYyBpbnRlcmZhY2Ugb2YgdGhpcyBjbGFzcyBmb3IgY3JlYXRpbmcgY2xpcHMuIEluIG1vc3QgY2FzZXMgdGhvdWdoLCBhbmltYXRpb24gY2xpcHNcclxuXHQgKiB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgY3JlYXRlZCBieSBsb2FkZXJzIHdoZW4gaW1wb3J0aW5nIGFuaW1hdGVkIDNEIGFzc2V0cy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZT0nJ10gLSBUaGUgY2xpcCdzIG5hbWUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtkdXJhdGlvbj0tMV0gLSBUaGUgY2xpcCdzIGR1cmF0aW9uIGluIHNlY29uZHMuIElmIGEgbmVnYXRpdmUgdmFsdWUgaXMgcGFzc2VkLFxyXG5cdCAqIHRoZSBkdXJhdGlvbiB3aWxsIGJlIGNhbGN1bGF0ZWQgZnJvbSB0aGUgcGFzc2VkIGtleWZyYW1lcy5cclxuXHQgKiBAcGFyYW0ge0FycmF5PEtleWZyYW1lVHJhY2s+fSB0cmFja3MgLSBBbiBhcnJheSBvZiBrZXlmcmFtZSB0cmFja3MuXHJcblx0ICogQHBhcmFtIHsoTm9ybWFsQW5pbWF0aW9uQmxlbmRNb2RlfEFkZGl0aXZlQW5pbWF0aW9uQmxlbmRNb2RlKX0gW2JsZW5kTW9kZT1Ob3JtYWxBbmltYXRpb25CbGVuZE1vZGVdIC0gRGVmaW5lcyBob3cgdGhlIGFuaW1hdGlvblxyXG5cdCAqIGlzIGJsZW5kZWQvY29tYmluZWQgd2hlbiB0d28gb3IgbW9yZSBhbmltYXRpb25zIGFyZSBzaW11bHRhbmVvdXNseSBwbGF5ZWQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5hbWUgPSAnJywgZHVyYXRpb24gPSAtIDEsIHRyYWNrcyA9IFtdLCBibGVuZE1vZGUgPSBOb3JtYWxBbmltYXRpb25CbGVuZE1vZGUgKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY2xpcCdzIG5hbWUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5uYW1lID0gbmFtZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqICBBbiBhcnJheSBvZiBrZXlmcmFtZSB0cmFja3MuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PEtleWZyYW1lVHJhY2s+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRyYWNrcyA9IHRyYWNrcztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjbGlwJ3MgZHVyYXRpb24gaW4gc2Vjb25kcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmR1cmF0aW9uID0gZHVyYXRpb247XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIGhvdyB0aGUgYW5pbWF0aW9uIGlzIGJsZW5kZWQvY29tYmluZWQgd2hlbiB0d28gb3IgbW9yZSBhbmltYXRpb25zXHJcblx0XHQgKiBhcmUgc2ltdWx0YW5lb3VzbHkgcGxheWVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoTm9ybWFsQW5pbWF0aW9uQmxlbmRNb2RlfEFkZGl0aXZlQW5pbWF0aW9uQmxlbmRNb2RlKX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ibGVuZE1vZGUgPSBibGVuZE1vZGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgVVVJRCBvZiB0aGUgYW5pbWF0aW9uIGNsaXAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnV1aWQgPSBnZW5lcmF0ZVVVSUQoKTtcclxuXHJcblx0XHQvLyB0aGlzIG1lYW5zIGl0IHNob3VsZCBmaWd1cmUgb3V0IGl0cyBkdXJhdGlvbiBieSBzY2FubmluZyB0aGUgdHJhY2tzXHJcblx0XHRpZiAoIHRoaXMuZHVyYXRpb24gPCAwICkge1xyXG5cclxuXHRcdFx0dGhpcy5yZXNldER1cmF0aW9uKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyBhbiBhbmltYXRpb24gY2xpcCBmcm9tIHRoZSBnaXZlbiBKU09OLlxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBqc29uIC0gVGhlIHNlcmlhbGl6ZWQgYW5pbWF0aW9uIGNsaXAuXHJcblx0ICogQHJldHVybiB7QW5pbWF0aW9uQ2xpcH0gVGhlIG5ldyBhbmltYXRpb24gY2xpcC5cclxuXHQgKi9cclxuXHRzdGF0aWMgcGFyc2UoIGpzb24gKSB7XHJcblxyXG5cdFx0Y29uc3QgdHJhY2tzID0gW10sXHJcblx0XHRcdGpzb25UcmFja3MgPSBqc29uLnRyYWNrcyxcclxuXHRcdFx0ZnJhbWVUaW1lID0gMS4wIC8gKCBqc29uLmZwcyB8fCAxLjAgKTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIG4gPSBqc29uVHJhY2tzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcclxuXHJcblx0XHRcdHRyYWNrcy5wdXNoKCBwYXJzZUtleWZyYW1lVHJhY2soIGpzb25UcmFja3NbIGkgXSApLnNjYWxlKCBmcmFtZVRpbWUgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBjbGlwID0gbmV3IHRoaXMoIGpzb24ubmFtZSwganNvbi5kdXJhdGlvbiwgdHJhY2tzLCBqc29uLmJsZW5kTW9kZSApO1xyXG5cdFx0Y2xpcC51dWlkID0ganNvbi51dWlkO1xyXG5cclxuXHRcdHJldHVybiBjbGlwO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNlcmlhbGl6ZXMgdGhlIGdpdmVuIGFuaW1hdGlvbiBjbGlwIGludG8gSlNPTi5cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAcGFyYW0ge0FuaW1hdGlvbkNsaXB9IGNsaXAgLSBUaGUgYW5pbWF0aW9uIGNsaXAgdG8gc2VyaWFsaXplLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdH0gVGhlIEpTT04gb2JqZWN0LlxyXG5cdCAqL1xyXG5cdHN0YXRpYyB0b0pTT04oIGNsaXAgKSB7XHJcblxyXG5cdFx0Y29uc3QgdHJhY2tzID0gW10sXHJcblx0XHRcdGNsaXBUcmFja3MgPSBjbGlwLnRyYWNrcztcclxuXHJcblx0XHRjb25zdCBqc29uID0ge1xyXG5cclxuXHRcdFx0J25hbWUnOiBjbGlwLm5hbWUsXHJcblx0XHRcdCdkdXJhdGlvbic6IGNsaXAuZHVyYXRpb24sXHJcblx0XHRcdCd0cmFja3MnOiB0cmFja3MsXHJcblx0XHRcdCd1dWlkJzogY2xpcC51dWlkLFxyXG5cdFx0XHQnYmxlbmRNb2RlJzogY2xpcC5ibGVuZE1vZGVcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbiA9IGNsaXBUcmFja3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xyXG5cclxuXHRcdFx0dHJhY2tzLnB1c2goIEtleWZyYW1lVHJhY2sudG9KU09OKCBjbGlwVHJhY2tzWyBpIF0gKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4ganNvbjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbmV3IGFuaW1hdGlvbiBjbGlwIGZyb20gdGhlIHBhc3NlZCBtb3JwaCB0YXJnZXRzIGFycmF5IG9mIGFcclxuXHQgKiBnZW9tZXRyeSwgdGFraW5nIGEgbmFtZSBhbmQgdGhlIG51bWJlciBvZiBmcmFtZXMgcGVyIHNlY29uZC5cclxuXHQgKlxyXG5cdCAqIE5vdGU6IFRoZSBmcHMgcGFyYW1ldGVyIGlzIHJlcXVpcmVkLCBidXQgdGhlIGFuaW1hdGlvbiBzcGVlZCBjYW4gYmVcclxuXHQgKiBvdmVycmlkZGVuIHZpYSB7QGxpbmsgQW5pbWF0aW9uQWN0aW9uI3NldER1cmF0aW9ufS5cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBhbmltYXRpb24gY2xpcC5cclxuXHQgKiBAcGFyYW0ge0FycmF5PE9iamVjdD59IG1vcnBoVGFyZ2V0U2VxdWVuY2UgLSBBIHNlcXVlbmNlIG9mIG1vcnBoIHRhcmdldHMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGZwcyAtIFRoZSBGcmFtZXMtUGVyLVNlY29uZCB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IG5vTG9vcCAtIFdoZXRoZXIgdGhlIGNsaXAgc2hvdWxkIGJlIG5vIGxvb3Agb3Igbm90LlxyXG5cdCAqIEByZXR1cm4ge0FuaW1hdGlvbkNsaXB9IFRoZSBuZXcgYW5pbWF0aW9uIGNsaXAuXHJcblx0ICovXHJcblx0c3RhdGljIENyZWF0ZUZyb21Nb3JwaFRhcmdldFNlcXVlbmNlKCBuYW1lLCBtb3JwaFRhcmdldFNlcXVlbmNlLCBmcHMsIG5vTG9vcCApIHtcclxuXHJcblx0XHRjb25zdCBudW1Nb3JwaFRhcmdldHMgPSBtb3JwaFRhcmdldFNlcXVlbmNlLmxlbmd0aDtcclxuXHRcdGNvbnN0IHRyYWNrcyA9IFtdO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IG51bU1vcnBoVGFyZ2V0czsgaSArKyApIHtcclxuXHJcblx0XHRcdGxldCB0aW1lcyA9IFtdO1xyXG5cdFx0XHRsZXQgdmFsdWVzID0gW107XHJcblxyXG5cdFx0XHR0aW1lcy5wdXNoKFxyXG5cdFx0XHRcdCggaSArIG51bU1vcnBoVGFyZ2V0cyAtIDEgKSAlIG51bU1vcnBoVGFyZ2V0cyxcclxuXHRcdFx0XHRpLFxyXG5cdFx0XHRcdCggaSArIDEgKSAlIG51bU1vcnBoVGFyZ2V0cyApO1xyXG5cclxuXHRcdFx0dmFsdWVzLnB1c2goIDAsIDEsIDAgKTtcclxuXHJcblx0XHRcdGNvbnN0IG9yZGVyID0gQW5pbWF0aW9uVXRpbHMuZ2V0S2V5ZnJhbWVPcmRlciggdGltZXMgKTtcclxuXHRcdFx0dGltZXMgPSBBbmltYXRpb25VdGlscy5zb3J0ZWRBcnJheSggdGltZXMsIDEsIG9yZGVyICk7XHJcblx0XHRcdHZhbHVlcyA9IEFuaW1hdGlvblV0aWxzLnNvcnRlZEFycmF5KCB2YWx1ZXMsIDEsIG9yZGVyICk7XHJcblxyXG5cdFx0XHQvLyBpZiB0aGVyZSBpcyBhIGtleSBhdCB0aGUgZmlyc3QgZnJhbWUsIGR1cGxpY2F0ZSBpdCBhcyB0aGVcclxuXHRcdFx0Ly8gbGFzdCBmcmFtZSBhcyB3ZWxsIGZvciBwZXJmZWN0IGxvb3AuXHJcblx0XHRcdGlmICggISBub0xvb3AgJiYgdGltZXNbIDAgXSA9PT0gMCApIHtcclxuXHJcblx0XHRcdFx0dGltZXMucHVzaCggbnVtTW9ycGhUYXJnZXRzICk7XHJcblx0XHRcdFx0dmFsdWVzLnB1c2goIHZhbHVlc1sgMCBdICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0cmFja3MucHVzaChcclxuXHRcdFx0XHRuZXcgTnVtYmVyS2V5ZnJhbWVUcmFjayhcclxuXHRcdFx0XHRcdCcubW9ycGhUYXJnZXRJbmZsdWVuY2VzWycgKyBtb3JwaFRhcmdldFNlcXVlbmNlWyBpIF0ubmFtZSArICddJyxcclxuXHRcdFx0XHRcdHRpbWVzLCB2YWx1ZXNcclxuXHRcdFx0XHQpLnNjYWxlKCAxLjAgLyBmcHMgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbmV3IHRoaXMoIG5hbWUsIC0gMSwgdHJhY2tzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2VhcmNoZXMgZm9yIGFuIGFuaW1hdGlvbiBjbGlwIGJ5IG5hbWUsIHRha2luZyBhcyBpdHMgZmlyc3QgcGFyYW1ldGVyXHJcblx0ICogZWl0aGVyIGFuIGFycmF5IG9mIGNsaXBzLCBvciBhIG1lc2ggb3IgZ2VvbWV0cnkgdGhhdCBjb250YWlucyBhblxyXG5cdCAqIGFycmF5IG5hbWVkIFwiYW5pbWF0aW9uc1wiIHByb3BlcnR5LlxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEBwYXJhbSB7KEFycmF5PEFuaW1hdGlvbkNsaXA+fE9iamVjdDNEKX0gb2JqZWN0T3JDbGlwQXJyYXkgLSBUaGUgYXJyYXkgb3Igb2JqZWN0IHRvIHNlYXJjaCB0aHJvdWdoLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgdG8gc2VhcmNoIGZvci5cclxuXHQgKiBAcmV0dXJuIHs/QW5pbWF0aW9uQ2xpcH0gVGhlIGZvdW5kIGFuaW1hdGlvbiBjbGlwLiBSZXR1cm5zIGBudWxsYCBpZiBubyBjbGlwIGhhcyBiZWVuIGZvdW5kLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBmaW5kQnlOYW1lKCBvYmplY3RPckNsaXBBcnJheSwgbmFtZSApIHtcclxuXHJcblx0XHRsZXQgY2xpcEFycmF5ID0gb2JqZWN0T3JDbGlwQXJyYXk7XHJcblxyXG5cdFx0aWYgKCAhIEFycmF5LmlzQXJyYXkoIG9iamVjdE9yQ2xpcEFycmF5ICkgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBvID0gb2JqZWN0T3JDbGlwQXJyYXk7XHJcblx0XHRcdGNsaXBBcnJheSA9IG8uZ2VvbWV0cnkgJiYgby5nZW9tZXRyeS5hbmltYXRpb25zIHx8IG8uYW5pbWF0aW9ucztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgY2xpcEFycmF5Lmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdGlmICggY2xpcEFycmF5WyBpIF0ubmFtZSA9PT0gbmFtZSApIHtcclxuXHJcblx0XHRcdFx0cmV0dXJuIGNsaXBBcnJheVsgaSBdO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGFuIGFycmF5IG9mIG5ldyBBbmltYXRpb25DbGlwcyBjcmVhdGVkIGZyb20gdGhlIG1vcnBoIHRhcmdldFxyXG5cdCAqIHNlcXVlbmNlcyBvZiBhIGdlb21ldHJ5LCB0cnlpbmcgdG8gc29ydCBtb3JwaCB0YXJnZXQgbmFtZXMgaW50b1xyXG5cdCAqIGFuaW1hdGlvbi1ncm91cC1iYXNlZCBwYXR0ZXJucyBsaWtlIFwiV2Fsa18wMDEsIFdhbGtfMDAyLCBSdW5fMDAxLCBSdW5fMDAyLi4uXCIuXHJcblx0ICpcclxuXHQgKiBTZWUge0BsaW5rIE1EMkxvYWRlciNwYXJzZX0gYXMgYW4gZXhhbXBsZSBmb3IgaG93IHRoZSBtZXRob2Qgc2hvdWxkIGJlIHVzZWQuXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQHBhcmFtIHtBcnJheTxPYmplY3Q+fSBtb3JwaFRhcmdldHMgLSBBIHNlcXVlbmNlIG9mIG1vcnBoIHRhcmdldHMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGZwcyAtIFRoZSBGcmFtZXMtUGVyLVNlY29uZCB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IG5vTG9vcCAtIFdoZXRoZXIgdGhlIGNsaXAgc2hvdWxkIGJlIG5vIGxvb3Agb3Igbm90LlxyXG5cdCAqIEByZXR1cm4ge0FycmF5PEFuaW1hdGlvbkNsaXA+fSBBbiBhcnJheSBvZiBuZXcgYW5pbWF0aW9uIGNsaXBzLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBDcmVhdGVDbGlwc0Zyb21Nb3JwaFRhcmdldFNlcXVlbmNlcyggbW9ycGhUYXJnZXRzLCBmcHMsIG5vTG9vcCApIHtcclxuXHJcblx0XHRjb25zdCBhbmltYXRpb25Ub01vcnBoVGFyZ2V0cyA9IHt9O1xyXG5cclxuXHRcdC8vIHRlc3RlZCB3aXRoIGh0dHBzOi8vcmVnZXgxMDEuY29tLyBvbiB0cmljayBzZXF1ZW5jZXNcclxuXHRcdC8vIHN1Y2ggZmxhbWluZ29fZmx5QV8wMDMsIGZsYW1pbmdvX3J1bjFfMDAzLCBjcmRlYXRoMDA1OVxyXG5cdFx0Y29uc3QgcGF0dGVybiA9IC9eKFtcXHctXSo/KShbXFxkXSspJC87XHJcblxyXG5cdFx0Ly8gc29ydCBtb3JwaCB0YXJnZXQgbmFtZXMgaW50byBhbmltYXRpb24gZ3JvdXBzIGJhc2VkXHJcblx0XHQvLyBwYXR0ZXJucyBsaWtlIFdhbGtfMDAxLCBXYWxrXzAwMiwgUnVuXzAwMSwgUnVuXzAwMlxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IG1vcnBoVGFyZ2V0cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IG1vcnBoVGFyZ2V0ID0gbW9ycGhUYXJnZXRzWyBpIF07XHJcblx0XHRcdGNvbnN0IHBhcnRzID0gbW9ycGhUYXJnZXQubmFtZS5tYXRjaCggcGF0dGVybiApO1xyXG5cclxuXHRcdFx0aWYgKCBwYXJ0cyAmJiBwYXJ0cy5sZW5ndGggPiAxICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBuYW1lID0gcGFydHNbIDEgXTtcclxuXHJcblx0XHRcdFx0bGV0IGFuaW1hdGlvbk1vcnBoVGFyZ2V0cyA9IGFuaW1hdGlvblRvTW9ycGhUYXJnZXRzWyBuYW1lIF07XHJcblxyXG5cdFx0XHRcdGlmICggISBhbmltYXRpb25Nb3JwaFRhcmdldHMgKSB7XHJcblxyXG5cdFx0XHRcdFx0YW5pbWF0aW9uVG9Nb3JwaFRhcmdldHNbIG5hbWUgXSA9IGFuaW1hdGlvbk1vcnBoVGFyZ2V0cyA9IFtdO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGFuaW1hdGlvbk1vcnBoVGFyZ2V0cy5wdXNoKCBtb3JwaFRhcmdldCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBjbGlwcyA9IFtdO1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IG5hbWUgaW4gYW5pbWF0aW9uVG9Nb3JwaFRhcmdldHMgKSB7XHJcblxyXG5cdFx0XHRjbGlwcy5wdXNoKCB0aGlzLkNyZWF0ZUZyb21Nb3JwaFRhcmdldFNlcXVlbmNlKCBuYW1lLCBhbmltYXRpb25Ub01vcnBoVGFyZ2V0c1sgbmFtZSBdLCBmcHMsIG5vTG9vcCApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBjbGlwcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQYXJzZXMgdGhlIGBhbmltYXRpb24uaGllcmFyY2h5YCBmb3JtYXQgYW5kIHJldHVybnMgYSBuZXcgYW5pbWF0aW9uIGNsaXAuXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQGRlcHJlY2F0ZWQgc2luY2UgcjE3NS5cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gYW5pbWF0aW9uIC0gQSBzZXJpYWxpemVkIGFuaW1hdGlvbiBjbGlwIGFzIEpTT04uXHJcblx0ICogQHBhcmFtIHtBcnJheTxCb25lcz59IGJvbmVzIC0gQW4gYXJyYXkgb2YgYm9uZXMuXHJcblx0ICogQHJldHVybiB7P0FuaW1hdGlvbkNsaXB9IFRoZSBuZXcgYW5pbWF0aW9uIGNsaXAuXHJcblx0ICovXHJcblx0c3RhdGljIHBhcnNlQW5pbWF0aW9uKCBhbmltYXRpb24sIGJvbmVzICkge1xyXG5cclxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkFuaW1hdGlvbkNsaXA6IHBhcnNlQW5pbWF0aW9uKCkgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIHdpdGggcjE4NScgKTtcclxuXHJcblx0XHRpZiAoICEgYW5pbWF0aW9uICkge1xyXG5cclxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkFuaW1hdGlvbkNsaXA6IE5vIGFuaW1hdGlvbiBpbiBKU09OTG9hZGVyIGRhdGEuJyApO1xyXG5cdFx0XHRyZXR1cm4gbnVsbDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgYWRkTm9uZW1wdHlUcmFjayA9IGZ1bmN0aW9uICggdHJhY2tUeXBlLCB0cmFja05hbWUsIGFuaW1hdGlvbktleXMsIHByb3BlcnR5TmFtZSwgZGVzdFRyYWNrcyApIHtcclxuXHJcblx0XHRcdC8vIG9ubHkgcmV0dXJuIHRyYWNrIGlmIHRoZXJlIGFyZSBhY3R1YWxseSBrZXlzLlxyXG5cdFx0XHRpZiAoIGFuaW1hdGlvbktleXMubGVuZ3RoICE9PSAwICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB0aW1lcyA9IFtdO1xyXG5cdFx0XHRcdGNvbnN0IHZhbHVlcyA9IFtdO1xyXG5cclxuXHRcdFx0XHRBbmltYXRpb25VdGlscy5mbGF0dGVuSlNPTiggYW5pbWF0aW9uS2V5cywgdGltZXMsIHZhbHVlcywgcHJvcGVydHlOYW1lICk7XHJcblxyXG5cdFx0XHRcdC8vIGVtcHR5IGtleXMgYXJlIGZpbHRlcmVkIG91dCwgc28gY2hlY2sgYWdhaW5cclxuXHRcdFx0XHRpZiAoIHRpbWVzLmxlbmd0aCAhPT0gMCApIHtcclxuXHJcblx0XHRcdFx0XHRkZXN0VHJhY2tzLnB1c2goIG5ldyB0cmFja1R5cGUoIHRyYWNrTmFtZSwgdGltZXMsIHZhbHVlcyApICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdGNvbnN0IHRyYWNrcyA9IFtdO1xyXG5cclxuXHRcdGNvbnN0IGNsaXBOYW1lID0gYW5pbWF0aW9uLm5hbWUgfHwgJ2RlZmF1bHQnO1xyXG5cdFx0Y29uc3QgZnBzID0gYW5pbWF0aW9uLmZwcyB8fCAzMDtcclxuXHRcdGNvbnN0IGJsZW5kTW9kZSA9IGFuaW1hdGlvbi5ibGVuZE1vZGU7XHJcblxyXG5cdFx0Ly8gYXV0b21hdGljIGxlbmd0aCBkZXRlcm1pbmF0aW9uIGluIEFuaW1hdGlvbkNsaXAuXHJcblx0XHRsZXQgZHVyYXRpb24gPSBhbmltYXRpb24ubGVuZ3RoIHx8IC0gMTtcclxuXHJcblx0XHRjb25zdCBoaWVyYXJjaHlUcmFja3MgPSBhbmltYXRpb24uaGllcmFyY2h5IHx8IFtdO1xyXG5cclxuXHRcdGZvciAoIGxldCBoID0gMDsgaCA8IGhpZXJhcmNoeVRyYWNrcy5sZW5ndGg7IGggKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBhbmltYXRpb25LZXlzID0gaGllcmFyY2h5VHJhY2tzWyBoIF0ua2V5cztcclxuXHJcblx0XHRcdC8vIHNraXAgZW1wdHkgdHJhY2tzXHJcblx0XHRcdGlmICggISBhbmltYXRpb25LZXlzIHx8IGFuaW1hdGlvbktleXMubGVuZ3RoID09PSAwICkgY29udGludWU7XHJcblxyXG5cdFx0XHQvLyBwcm9jZXNzIG1vcnBoIHRhcmdldHNcclxuXHRcdFx0aWYgKCBhbmltYXRpb25LZXlzWyAwIF0ubW9ycGhUYXJnZXRzICkge1xyXG5cclxuXHRcdFx0XHQvLyBmaWd1cmUgb3V0IGFsbCBtb3JwaCB0YXJnZXRzIHVzZWQgaW4gdGhpcyB0cmFja1xyXG5cdFx0XHRcdGNvbnN0IG1vcnBoVGFyZ2V0TmFtZXMgPSB7fTtcclxuXHJcblx0XHRcdFx0bGV0IGs7XHJcblxyXG5cdFx0XHRcdGZvciAoIGsgPSAwOyBrIDwgYW5pbWF0aW9uS2V5cy5sZW5ndGg7IGsgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBhbmltYXRpb25LZXlzWyBrIF0ubW9ycGhUYXJnZXRzICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Zm9yICggbGV0IG0gPSAwOyBtIDwgYW5pbWF0aW9uS2V5c1sgayBdLm1vcnBoVGFyZ2V0cy5sZW5ndGg7IG0gKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdG1vcnBoVGFyZ2V0TmFtZXNbIGFuaW1hdGlvbktleXNbIGsgXS5tb3JwaFRhcmdldHNbIG0gXSBdID0gLSAxO1xyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyBjcmVhdGUgYSB0cmFjayBmb3IgZWFjaCBtb3JwaCB0YXJnZXQgd2l0aCBhbGwgemVyb1xyXG5cdFx0XHRcdC8vIG1vcnBoVGFyZ2V0SW5mbHVlbmNlcyBleGNlcHQgZm9yIHRoZSBrZXlzIGluIHdoaWNoXHJcblx0XHRcdFx0Ly8gdGhlIG1vcnBoVGFyZ2V0IGlzIG5hbWVkLlxyXG5cdFx0XHRcdGZvciAoIGNvbnN0IG1vcnBoVGFyZ2V0TmFtZSBpbiBtb3JwaFRhcmdldE5hbWVzICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHRpbWVzID0gW107XHJcblx0XHRcdFx0XHRjb25zdCB2YWx1ZXMgPSBbXTtcclxuXHJcblx0XHRcdFx0XHRmb3IgKCBsZXQgbSA9IDA7IG0gIT09IGFuaW1hdGlvbktleXNbIGsgXS5tb3JwaFRhcmdldHMubGVuZ3RoOyArKyBtICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgYW5pbWF0aW9uS2V5ID0gYW5pbWF0aW9uS2V5c1sgayBdO1xyXG5cclxuXHRcdFx0XHRcdFx0dGltZXMucHVzaCggYW5pbWF0aW9uS2V5LnRpbWUgKTtcclxuXHRcdFx0XHRcdFx0dmFsdWVzLnB1c2goICggYW5pbWF0aW9uS2V5Lm1vcnBoVGFyZ2V0ID09PSBtb3JwaFRhcmdldE5hbWUgKSA/IDEgOiAwICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHRyYWNrcy5wdXNoKCBuZXcgTnVtYmVyS2V5ZnJhbWVUcmFjayggJy5tb3JwaFRhcmdldEluZmx1ZW5jZVsnICsgbW9ycGhUYXJnZXROYW1lICsgJ10nLCB0aW1lcywgdmFsdWVzICkgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRkdXJhdGlvbiA9IG1vcnBoVGFyZ2V0TmFtZXMubGVuZ3RoICogZnBzO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0Ly8gLi4uYXNzdW1lIHNrZWxldGFsIGFuaW1hdGlvblxyXG5cclxuXHRcdFx0XHRjb25zdCBib25lTmFtZSA9ICcuYm9uZXNbJyArIGJvbmVzWyBoIF0ubmFtZSArICddJztcclxuXHJcblx0XHRcdFx0YWRkTm9uZW1wdHlUcmFjayhcclxuXHRcdFx0XHRcdFZlY3RvcktleWZyYW1lVHJhY2ssIGJvbmVOYW1lICsgJy5wb3NpdGlvbicsXHJcblx0XHRcdFx0XHRhbmltYXRpb25LZXlzLCAncG9zJywgdHJhY2tzICk7XHJcblxyXG5cdFx0XHRcdGFkZE5vbmVtcHR5VHJhY2soXHJcblx0XHRcdFx0XHRRdWF0ZXJuaW9uS2V5ZnJhbWVUcmFjaywgYm9uZU5hbWUgKyAnLnF1YXRlcm5pb24nLFxyXG5cdFx0XHRcdFx0YW5pbWF0aW9uS2V5cywgJ3JvdCcsIHRyYWNrcyApO1xyXG5cclxuXHRcdFx0XHRhZGROb25lbXB0eVRyYWNrKFxyXG5cdFx0XHRcdFx0VmVjdG9yS2V5ZnJhbWVUcmFjaywgYm9uZU5hbWUgKyAnLnNjYWxlJyxcclxuXHRcdFx0XHRcdGFuaW1hdGlvbktleXMsICdzY2wnLCB0cmFja3MgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0cmFja3MubGVuZ3RoID09PSAwICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGNsaXAgPSBuZXcgdGhpcyggY2xpcE5hbWUsIGR1cmF0aW9uLCB0cmFja3MsIGJsZW5kTW9kZSApO1xyXG5cclxuXHRcdHJldHVybiBjbGlwO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGR1cmF0aW9uIG9mIHRoaXMgY2xpcCB0byB0aGUgZHVyYXRpb24gb2YgaXRzIGxvbmdlc3Qga2V5ZnJhbWUgdHJhY2suXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtBbmltYXRpb25DbGlwfSBBIHJlZmVyZW5jZSB0byB0aGlzIGFuaW1hdGlvbiBjbGlwLlxyXG5cdCAqL1xyXG5cdHJlc2V0RHVyYXRpb24oKSB7XHJcblxyXG5cdFx0Y29uc3QgdHJhY2tzID0gdGhpcy50cmFja3M7XHJcblx0XHRsZXQgZHVyYXRpb24gPSAwO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbiA9IHRyYWNrcy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB0cmFjayA9IHRoaXMudHJhY2tzWyBpIF07XHJcblxyXG5cdFx0XHRkdXJhdGlvbiA9IE1hdGgubWF4KCBkdXJhdGlvbiwgdHJhY2sudGltZXNbIHRyYWNrLnRpbWVzLmxlbmd0aCAtIDEgXSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmR1cmF0aW9uID0gZHVyYXRpb247XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVHJpbXMgYWxsIHRyYWNrcyB0byB0aGUgY2xpcCdzIGR1cmF0aW9uLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7QW5pbWF0aW9uQ2xpcH0gQSByZWZlcmVuY2UgdG8gdGhpcyBhbmltYXRpb24gY2xpcC5cclxuXHQgKi9cclxuXHR0cmltKCkge1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHRoaXMudHJhY2tzLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdHRoaXMudHJhY2tzWyBpIF0udHJpbSggMCwgdGhpcy5kdXJhdGlvbiApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQZXJmb3JtcyBtaW5pbWFsIHZhbGlkYXRpb24gb24gZWFjaCB0cmFjayBpbiB0aGUgY2xpcC4gUmV0dXJucyBgdHJ1ZWAgaWYgYWxsXHJcblx0ICogdHJhY2tzIGFyZSB2YWxpZC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGNsaXAncyBrZXlmcmFtZXMgYXJlIHZhbGlkIG9yIG5vdC5cclxuXHQgKi9cclxuXHR2YWxpZGF0ZSgpIHtcclxuXHJcblx0XHRsZXQgdmFsaWQgPSB0cnVlO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHRoaXMudHJhY2tzLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdHZhbGlkID0gdmFsaWQgJiYgdGhpcy50cmFja3NbIGkgXS52YWxpZGF0ZSgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdmFsaWQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogT3B0aW1pemVzIGVhY2ggdHJhY2sgYnkgcmVtb3ZpbmcgZXF1aXZhbGVudCBzZXF1ZW50aWFsIGtleXMgKHdoaWNoIGFyZVxyXG5cdCAqIGNvbW1vbiBpbiBtb3JwaCB0YXJnZXQgc2VxdWVuY2VzKS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0FuaW1hdGlvbkNsaXB9IEEgcmVmZXJlbmNlIHRvIHRoaXMgYW5pbWF0aW9uIGNsaXAuXHJcblx0ICovXHJcblx0b3B0aW1pemUoKSB7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdGhpcy50cmFja3MubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0dGhpcy50cmFja3NbIGkgXS5vcHRpbWl6ZSgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbmV3IGFuaW1hdGlvbiBjbGlwIHdpdGggY29waWVkIHZhbHVlcyBmcm9tIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtBbmltYXRpb25DbGlwfSBBIGNsb25lIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y2xvbmUoKSB7XHJcblxyXG5cdFx0Y29uc3QgdHJhY2tzID0gW107XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdGhpcy50cmFja3MubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0dHJhY2tzLnB1c2goIHRoaXMudHJhY2tzWyBpIF0uY2xvbmUoKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMubmFtZSwgdGhpcy5kdXJhdGlvbiwgdHJhY2tzLCB0aGlzLmJsZW5kTW9kZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNlcmlhbGl6ZXMgdGhpcyBhbmltYXRpb24gY2xpcCBpbnRvIEpTT04uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBKU09OIG9iamVjdC5cclxuXHQgKi9cclxuXHR0b0pTT04oKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9KU09OKCB0aGlzICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldFRyYWNrVHlwZUZvclZhbHVlVHlwZU5hbWUoIHR5cGVOYW1lICkge1xyXG5cclxuXHRzd2l0Y2ggKCB0eXBlTmFtZS50b0xvd2VyQ2FzZSgpICkge1xyXG5cclxuXHRcdGNhc2UgJ3NjYWxhcic6XHJcblx0XHRjYXNlICdkb3VibGUnOlxyXG5cdFx0Y2FzZSAnZmxvYXQnOlxyXG5cdFx0Y2FzZSAnbnVtYmVyJzpcclxuXHRcdGNhc2UgJ2ludGVnZXInOlxyXG5cclxuXHRcdFx0cmV0dXJuIE51bWJlcktleWZyYW1lVHJhY2s7XHJcblxyXG5cdFx0Y2FzZSAndmVjdG9yJzpcclxuXHRcdGNhc2UgJ3ZlY3RvcjInOlxyXG5cdFx0Y2FzZSAndmVjdG9yMyc6XHJcblx0XHRjYXNlICd2ZWN0b3I0JzpcclxuXHJcblx0XHRcdHJldHVybiBWZWN0b3JLZXlmcmFtZVRyYWNrO1xyXG5cclxuXHRcdGNhc2UgJ2NvbG9yJzpcclxuXHJcblx0XHRcdHJldHVybiBDb2xvcktleWZyYW1lVHJhY2s7XHJcblxyXG5cdFx0Y2FzZSAncXVhdGVybmlvbic6XHJcblxyXG5cdFx0XHRyZXR1cm4gUXVhdGVybmlvbktleWZyYW1lVHJhY2s7XHJcblxyXG5cdFx0Y2FzZSAnYm9vbCc6XHJcblx0XHRjYXNlICdib29sZWFuJzpcclxuXHJcblx0XHRcdHJldHVybiBCb29sZWFuS2V5ZnJhbWVUcmFjaztcclxuXHJcblx0XHRjYXNlICdzdHJpbmcnOlxyXG5cclxuXHRcdFx0cmV0dXJuIFN0cmluZ0tleWZyYW1lVHJhY2s7XHJcblxyXG5cdH1cclxuXHJcblx0dGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogVW5zdXBwb3J0ZWQgdHlwZU5hbWU6ICcgKyB0eXBlTmFtZSApO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gcGFyc2VLZXlmcmFtZVRyYWNrKCBqc29uICkge1xyXG5cclxuXHRpZiAoIGpzb24udHlwZSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdHRocm93IG5ldyBFcnJvciggJ1RIUkVFLktleWZyYW1lVHJhY2s6IHRyYWNrIHR5cGUgdW5kZWZpbmVkLCBjYW4gbm90IHBhcnNlJyApO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvbnN0IHRyYWNrVHlwZSA9IGdldFRyYWNrVHlwZUZvclZhbHVlVHlwZU5hbWUoIGpzb24udHlwZSApO1xyXG5cclxuXHRpZiAoIGpzb24udGltZXMgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRjb25zdCB0aW1lcyA9IFtdLCB2YWx1ZXMgPSBbXTtcclxuXHJcblx0XHRBbmltYXRpb25VdGlscy5mbGF0dGVuSlNPTigganNvbi5rZXlzLCB0aW1lcywgdmFsdWVzLCAndmFsdWUnICk7XHJcblxyXG5cdFx0anNvbi50aW1lcyA9IHRpbWVzO1xyXG5cdFx0anNvbi52YWx1ZXMgPSB2YWx1ZXM7XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gZGVyaXZlZCBjbGFzc2VzIGNhbiBkZWZpbmUgYSBzdGF0aWMgcGFyc2UgbWV0aG9kXHJcblx0aWYgKCB0cmFja1R5cGUucGFyc2UgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRyZXR1cm4gdHJhY2tUeXBlLnBhcnNlKCBqc29uICk7XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0Ly8gYnkgZGVmYXVsdCwgd2UgYXNzdW1lIGEgY29uc3RydWN0b3IgY29tcGF0aWJsZSB3aXRoIHRoZSBiYXNlXHJcblx0XHRyZXR1cm4gbmV3IHRyYWNrVHlwZSgganNvbi5uYW1lLCBqc29uLnRpbWVzLCBqc29uLnZhbHVlcywganNvbi5pbnRlcnBvbGF0aW9uICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IEFuaW1hdGlvbkNsaXAgfTtcclxuIiwiLyoqXHJcbiAqIEBjbGFzc1xyXG4gKiBAY2xhc3NkZXNjIEEgc2ltcGxlIGNhY2hpbmcgc3lzdGVtLCB1c2VkIGludGVybmFsbHkgYnkge0BsaW5rIEZpbGVMb2FkZXJ9LlxyXG4gKiBUbyBlbmFibGUgY2FjaGluZyBhY3Jvc3MgYWxsIGxvYWRlcnMgdGhhdCB1c2Uge0BsaW5rIEZpbGVMb2FkZXJ9LCBhZGQgYFRIUkVFLkNhY2hlLmVuYWJsZWQgPSB0cnVlLmAgb25jZSBpbiB5b3VyIGFwcC5cclxuICogQGhpZGVjb25zdHJ1Y3RvclxyXG4gKi9cclxuY29uc3QgQ2FjaGUgPSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdoZXRoZXIgY2FjaGluZyBpcyBlbmFibGVkIG9yIG5vdC5cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdCAqL1xyXG5cdGVuYWJsZWQ6IGZhbHNlLFxyXG5cclxuXHQvKipcclxuXHQgKiBBIGRpY3Rpb25hcnkgdGhhdCBob2xkcyBjYWNoZWQgZmlsZXMuXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQHR5cGUge09iamVjdDxzdHJpbmcsT2JqZWN0Pn1cclxuXHQgKi9cclxuXHRmaWxlczoge30sXHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgYSBjYWNoZSBlbnRyeSB3aXRoIGEga2V5IHRvIHJlZmVyZW5jZSB0aGUgZmlsZS4gSWYgdGhpcyBrZXkgYWxyZWFkeVxyXG5cdCAqIGhvbGRzIGEgZmlsZSwgaXQgaXMgb3ZlcndyaXR0ZW4uXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgdG8gcmVmZXJlbmNlIHRoZSBjYWNoZWQgZmlsZS5cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gZmlsZSAtICBUaGUgZmlsZSB0byBiZSBjYWNoZWQuXHJcblx0ICovXHJcblx0YWRkOiBmdW5jdGlvbiAoIGtleSwgZmlsZSApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuZW5hYmxlZCA9PT0gZmFsc2UgKSByZXR1cm47XHJcblxyXG5cdFx0Ly8gY29uc29sZS5sb2coICdUSFJFRS5DYWNoZScsICdBZGRpbmcga2V5OicsIGtleSApO1xyXG5cclxuXHRcdHRoaXMuZmlsZXNbIGtleSBdID0gZmlsZTtcclxuXHJcblx0fSxcclxuXHJcblx0LyoqXHJcblx0ICogR2V0cyB0aGUgY2FjaGVkIHZhbHVlIGZvciB0aGUgZ2l2ZW4ga2V5LlxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IHRvIHJlZmVyZW5jZSB0aGUgY2FjaGVkIGZpbGUuXHJcblx0ICogQHJldHVybiB7T2JqZWN0fHVuZGVmaW5lZH0gVGhlIGNhY2hlZCBmaWxlLiBJZiB0aGUga2V5IGRvZXMgbm90IGV4aXN0IGB1bmRlZmluZWRgIGlzIHJldHVybmVkLlxyXG5cdCAqL1xyXG5cdGdldDogZnVuY3Rpb24gKCBrZXkgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmVuYWJsZWQgPT09IGZhbHNlICkgcmV0dXJuO1xyXG5cclxuXHRcdC8vIGNvbnNvbGUubG9nKCAnVEhSRUUuQ2FjaGUnLCAnQ2hlY2tpbmcga2V5OicsIGtleSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmZpbGVzWyBrZXkgXTtcclxuXHJcblx0fSxcclxuXHJcblx0LyoqXHJcblx0ICogUmVtb3ZlcyB0aGUgY2FjaGVkIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBrZXkuXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgdG8gcmVmZXJlbmNlIHRoZSBjYWNoZWQgZmlsZS5cclxuXHQgKi9cclxuXHRyZW1vdmU6IGZ1bmN0aW9uICgga2V5ICkge1xyXG5cclxuXHRcdGRlbGV0ZSB0aGlzLmZpbGVzWyBrZXkgXTtcclxuXHJcblx0fSxcclxuXHJcblx0LyoqXHJcblx0ICogUmVtb3ZlIGFsbCB2YWx1ZXMgZnJvbSB0aGUgY2FjaGUuXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICovXHJcblx0Y2xlYXI6IGZ1bmN0aW9uICgpIHtcclxuXHJcblx0XHR0aGlzLmZpbGVzID0ge307XHJcblxyXG5cdH1cclxuXHJcbn07XHJcblxyXG5cclxuZXhwb3J0IHsgQ2FjaGUgfTtcclxuIiwiLyoqXHJcbiAqIEhhbmRsZXMgYW5kIGtlZXBzIHRyYWNrIG9mIGxvYWRlZCBhbmQgcGVuZGluZyBkYXRhLiBBIGRlZmF1bHQgZ2xvYmFsXHJcbiAqIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgY3JlYXRlZCBhbmQgdXNlZCBieSBsb2FkZXJzIGlmIG5vdCBzdXBwbGllZFxyXG4gKiBtYW51YWxseS5cclxuICpcclxuICogSW4gZ2VuZXJhbCB0aGF0IHNob3VsZCBiZSBzdWZmaWNpZW50LCBob3dldmVyIHRoZXJlIGFyZSB0aW1lcyB3aGVuIGl0IGNhblxyXG4gKiBiZSB1c2VmdWwgdG8gaGF2ZSBzZXBhcmF0ZSBsb2FkZXJzIC0gZm9yIGV4YW1wbGUgaWYgeW91IHdhbnQgdG8gc2hvd1xyXG4gKiBzZXBhcmF0ZSBsb2FkaW5nIGJhcnMgZm9yIG9iamVjdHMgYW5kIHRleHR1cmVzLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBtYW5hZ2VyID0gbmV3IFRIUkVFLkxvYWRpbmdNYW5hZ2VyKCk7XHJcbiAqIG1hbmFnZXIub25Mb2FkID0gKCkgPT4gY29uc29sZS5sb2coICdMb2FkaW5nIGNvbXBsZXRlIScgKTtcclxuICpcclxuICogY29uc3QgbG9hZGVyMSA9IG5ldyBPQkpMb2FkZXIoIG1hbmFnZXIgKTtcclxuICogY29uc3QgbG9hZGVyMiA9IG5ldyBDb2xsYWRhTG9hZGVyKCBtYW5hZ2VyICk7XHJcbiAqIGBgYFxyXG4gKi9cclxuY2xhc3MgTG9hZGluZ01hbmFnZXIge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGxvYWRpbmcgbWFuYWdlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkxvYWRdIC0gRXhlY3V0ZXMgd2hlbiBhbGwgaXRlbXMgaGF2ZSBiZWVuIGxvYWRlZC5cclxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25Qcm9ncmVzc10gLSBFeGVjdXRlcyB3aGVuIHNpbmdsZSBpdGVtcyBoYXZlIGJlZW4gbG9hZGVkLlxyXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkVycm9yXSAtIEV4ZWN1dGVzIHdoZW4gYW4gZXJyb3Igb2NjdXJzLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XHJcblxyXG5cdFx0Y29uc3Qgc2NvcGUgPSB0aGlzO1xyXG5cclxuXHRcdGxldCBpc0xvYWRpbmcgPSBmYWxzZTtcclxuXHRcdGxldCBpdGVtc0xvYWRlZCA9IDA7XHJcblx0XHRsZXQgaXRlbXNUb3RhbCA9IDA7XHJcblx0XHRsZXQgdXJsTW9kaWZpZXIgPSB1bmRlZmluZWQ7XHJcblx0XHRjb25zdCBoYW5kbGVycyA9IFtdO1xyXG5cclxuXHRcdC8vIFJlZmVyIHRvICM1Njg5IGZvciB0aGUgcmVhc29uIHdoeSB3ZSBkb24ndCBzZXQgLm9uU3RhcnRcclxuXHRcdC8vIGluIHRoZSBjb25zdHJ1Y3RvclxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRXhlY3V0ZXMgd2hlbiBhbiBpdGVtIHN0YXJ0cyBsb2FkaW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtGdW5jdGlvbnx1bmRlZmluZWR9XHJcblx0XHQgKiBAZGVmYXVsdCB1bmRlZmluZWRcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5vblN0YXJ0ID0gdW5kZWZpbmVkO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRXhlY3V0ZXMgd2hlbiBhbGwgaXRlbXMgaGF2ZSBiZWVuIGxvYWRlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7RnVuY3Rpb258dW5kZWZpbmVkfVxyXG5cdFx0ICogQGRlZmF1bHQgdW5kZWZpbmVkXHJcblx0XHQgKi9cclxuXHRcdHRoaXMub25Mb2FkID0gb25Mb2FkO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRXhlY3V0ZXMgd2hlbiBzaW5nbGUgaXRlbXMgaGF2ZSBiZWVuIGxvYWRlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7RnVuY3Rpb258dW5kZWZpbmVkfVxyXG5cdFx0ICogQGRlZmF1bHQgdW5kZWZpbmVkXHJcblx0XHQgKi9cclxuXHRcdHRoaXMub25Qcm9ncmVzcyA9IG9uUHJvZ3Jlc3M7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBFeGVjdXRlcyB3aGVuIGFuIGVycm9yIG9jY3Vycy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7RnVuY3Rpb258dW5kZWZpbmVkfVxyXG5cdFx0ICogQGRlZmF1bHQgdW5kZWZpbmVkXHJcblx0XHQgKi9cclxuXHRcdHRoaXMub25FcnJvciA9IG9uRXJyb3I7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYnkgYW55IGxvYWRlciB1c2luZyB0aGUgbWFuYWdlciB3aGVuIHRoZSBsb2FkZXJcclxuXHRcdCAqIHN0YXJ0cyBsb2FkaW5nIGFuIGl0ZW0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIFRoZSBVUkwgdG8gbG9hZC5cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pdGVtU3RhcnQgPSBmdW5jdGlvbiAoIHVybCApIHtcclxuXHJcblx0XHRcdGl0ZW1zVG90YWwgKys7XHJcblxyXG5cdFx0XHRpZiAoIGlzTG9hZGluZyA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggc2NvcGUub25TdGFydCAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdHNjb3BlLm9uU3RhcnQoIHVybCwgaXRlbXNMb2FkZWQsIGl0ZW1zVG90YWwgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aXNMb2FkaW5nID0gdHJ1ZTtcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIGJ5IGFueSBsb2FkZXIgdXNpbmcgdGhlIG1hbmFnZXIgd2hlbiB0aGUgbG9hZGVyXHJcblx0XHQgKiBlbmRlZCBsb2FkaW5nIGFuIGl0ZW0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIFRoZSBVUkwgb2YgdGhlIGxvYWRlZCBpdGVtLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLml0ZW1FbmQgPSBmdW5jdGlvbiAoIHVybCApIHtcclxuXHJcblx0XHRcdGl0ZW1zTG9hZGVkICsrO1xyXG5cclxuXHRcdFx0aWYgKCBzY29wZS5vblByb2dyZXNzICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdHNjb3BlLm9uUHJvZ3Jlc3MoIHVybCwgaXRlbXNMb2FkZWQsIGl0ZW1zVG90YWwgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggaXRlbXNMb2FkZWQgPT09IGl0ZW1zVG90YWwgKSB7XHJcblxyXG5cdFx0XHRcdGlzTG9hZGluZyA9IGZhbHNlO1xyXG5cclxuXHRcdFx0XHRpZiAoIHNjb3BlLm9uTG9hZCAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdHNjb3BlLm9uTG9hZCgpO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBieSBhbnkgbG9hZGVyIHVzaW5nIHRoZSBtYW5hZ2VyIHdoZW4gdGhlIGxvYWRlclxyXG5cdFx0ICogZW5jb3VudGVycyBhbiBlcnJvciB3aGVuIGxvYWRpbmcgYW4gaXRlbS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gVGhlIFVSTCBvZiB0aGUgaXRlbSB0aGF0IHByb2R1Y2VzIGFuIGVycm9yLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLml0ZW1FcnJvciA9IGZ1bmN0aW9uICggdXJsICkge1xyXG5cclxuXHRcdFx0aWYgKCBzY29wZS5vbkVycm9yICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdHNjb3BlLm9uRXJyb3IoIHVybCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBHaXZlbiBhIFVSTCwgdXNlcyB0aGUgVVJMIG1vZGlmaWVyIGNhbGxiYWNrIChpZiBhbnkpIGFuZCByZXR1cm5zIGFcclxuXHRcdCAqIHJlc29sdmVkIFVSTC4gSWYgbm8gVVJMIG1vZGlmaWVyIGlzIHNldCwgcmV0dXJucyB0aGUgb3JpZ2luYWwgVVJMLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSBUaGUgVVJMIHRvIGxvYWQuXHJcblx0XHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSByZXNvbHZlZCBVUkwuXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVzb2x2ZVVSTCA9IGZ1bmN0aW9uICggdXJsICkge1xyXG5cclxuXHRcdFx0aWYgKCB1cmxNb2RpZmllciApIHtcclxuXHJcblx0XHRcdFx0cmV0dXJuIHVybE1vZGlmaWVyKCB1cmwgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiB1cmw7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIElmIHByb3ZpZGVkLCB0aGUgY2FsbGJhY2sgd2lsbCBiZSBwYXNzZWQgZWFjaCByZXNvdXJjZSBVUkwgYmVmb3JlIGFcclxuXHRcdCAqIHJlcXVlc3QgaXMgc2VudC4gVGhlIGNhbGxiYWNrIG1heSByZXR1cm4gdGhlIG9yaWdpbmFsIFVSTCwgb3IgYSBuZXcgVVJMIHRvXHJcblx0XHQgKiBvdmVycmlkZSBsb2FkaW5nIGJlaGF2aW9yLiBUaGlzIGJlaGF2aW9yIGNhbiBiZSB1c2VkIHRvIGxvYWQgYXNzZXRzIGZyb21cclxuXHRcdCAqIC5aSVAgZmlsZXMsIGRyYWctYW5kLWRyb3AgQVBJcywgYW5kIERhdGEgVVJJcy5cclxuXHRcdCAqXHJcblx0XHQgKiBgYGBqc1xyXG5cdFx0ICogY29uc3QgYmxvYnMgPSB7J2Zpc2guZ2x0Zic6IGJsb2IxLCAnZGlmZnVzZS5wbmcnOiBibG9iMiwgJ25vcm1hbC5wbmcnOiBibG9iM307XHJcblx0XHQgKlxyXG5cdFx0ICogY29uc3QgbWFuYWdlciA9IG5ldyBUSFJFRS5Mb2FkaW5nTWFuYWdlcigpO1xyXG5cdFx0ICpcclxuXHRcdCAqIC8vIEluaXRpYWxpemUgbG9hZGluZyBtYW5hZ2VyIHdpdGggVVJMIGNhbGxiYWNrLlxyXG5cdFx0ICogY29uc3Qgb2JqZWN0VVJMcyA9IFtdO1xyXG5cdFx0ICogbWFuYWdlci5zZXRVUkxNb2RpZmllciggKCB1cmwgKSA9PiB7XHJcblx0XHQgKlxyXG5cdFx0ICogXHR1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKCBibG9ic1sgdXJsIF0gKTtcclxuXHRcdCAqIFx0b2JqZWN0VVJMcy5wdXNoKCB1cmwgKTtcclxuXHRcdCAqIFx0cmV0dXJuIHVybDtcclxuXHRcdCAqXHJcblx0XHQgKiB9ICk7XHJcblx0XHQgKlxyXG5cdFx0ICogLy8gTG9hZCBhcyB1c3VhbCwgdGhlbiByZXZva2UgdGhlIGJsb2IgVVJMcy5cclxuXHRcdCAqIGNvbnN0IGxvYWRlciA9IG5ldyBHTFRGTG9hZGVyKCBtYW5hZ2VyICk7XHJcblx0XHQgKiBsb2FkZXIubG9hZCggJ2Zpc2guZ2x0ZicsIChnbHRmKSA9PiB7XHJcblx0XHQgKlxyXG5cdFx0ICogXHRzY2VuZS5hZGQoIGdsdGYuc2NlbmUgKTtcclxuXHRcdCAqIFx0b2JqZWN0VVJMcy5mb3JFYWNoKCAoIHVybCApID0+IFVSTC5yZXZva2VPYmplY3RVUkwoIHVybCApICk7XHJcblx0XHQgKlxyXG5cdFx0ICogfSApO1xyXG5cdFx0ICogYGBgXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtmdW5jdGlvbihzdHJpbmcpOnN0cmluZ30gdHJhbnNmb3JtIC0gVVJMIG1vZGlmaWVyIGNhbGxiYWNrLiBDYWxsZWQgd2l0aCBhbiBVUkwgYW5kIG11c3QgcmV0dXJuIGEgcmVzb2x2ZWQgVVJMLlxyXG5cdFx0ICogQHJldHVybiB7TG9hZGluZ01hbmFnZXJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbG9hZGluZyBtYW5hZ2VyLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNldFVSTE1vZGlmaWVyID0gZnVuY3Rpb24gKCB0cmFuc2Zvcm0gKSB7XHJcblxyXG5cdFx0XHR1cmxNb2RpZmllciA9IHRyYW5zZm9ybTtcclxuXHJcblx0XHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZWdpc3RlcnMgYSBsb2FkZXIgd2l0aCB0aGUgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uLiBDYW4gYmUgdXNlZCB0b1xyXG5cdFx0ICogZGVmaW5lIHdoYXQgbG9hZGVyIHNob3VsZCBiZSB1c2VkIGluIG9yZGVyIHRvIGxvYWQgc3BlY2lmaWMgZmlsZXMuIEFcclxuXHRcdCAqIHR5cGljYWwgdXNlIGNhc2UgaXMgdG8gb3ZlcndyaXRlIHRoZSBkZWZhdWx0IGxvYWRlciBmb3IgdGV4dHVyZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogYGBganNcclxuXHRcdCAqIC8vIGFkZCBoYW5kbGVyIGZvciBUR0EgdGV4dHVyZXNcclxuXHRcdCAqIG1hbmFnZXIuYWRkSGFuZGxlciggL1xcLnRnYSQvaSwgbmV3IFRHQUxvYWRlcigpICk7XHJcblx0XHQgKiBgYGBcclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gcmVnZXggLSBBIHJlZ3VsYXIgZXhwcmVzc2lvbi5cclxuXHRcdCAqIEBwYXJhbSB7TG9hZGVyfSBsb2FkZXIgLSBBIGxvYWRlciB0aGF0IHNob3VsZCBoYW5kbGUgbWF0Y2hlZCBjYXNlcy5cclxuXHRcdCAqIEByZXR1cm4ge0xvYWRpbmdNYW5hZ2VyfSBBIHJlZmVyZW5jZSB0byB0aGlzIGxvYWRpbmcgbWFuYWdlci5cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hZGRIYW5kbGVyID0gZnVuY3Rpb24gKCByZWdleCwgbG9hZGVyICkge1xyXG5cclxuXHRcdFx0aGFuZGxlcnMucHVzaCggcmVnZXgsIGxvYWRlciApO1xyXG5cclxuXHRcdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlbW92ZXMgdGhlIGxvYWRlciBmb3IgdGhlIGdpdmVuIHJlZ3VsYXIgZXhwcmVzc2lvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gcmVnZXggLSBBIHJlZ3VsYXIgZXhwcmVzc2lvbi5cclxuXHRcdCAqIEByZXR1cm4ge0xvYWRpbmdNYW5hZ2VyfSBBIHJlZmVyZW5jZSB0byB0aGlzIGxvYWRpbmcgbWFuYWdlci5cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yZW1vdmVIYW5kbGVyID0gZnVuY3Rpb24gKCByZWdleCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGluZGV4ID0gaGFuZGxlcnMuaW5kZXhPZiggcmVnZXggKTtcclxuXHJcblx0XHRcdGlmICggaW5kZXggIT09IC0gMSApIHtcclxuXHJcblx0XHRcdFx0aGFuZGxlcnMuc3BsaWNlKCBpbmRleCwgMiApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENhbiBiZSB1c2VkIHRvIHJldHJpZXZlIHRoZSByZWdpc3RlcmVkIGxvYWRlciBmb3IgdGhlIGdpdmVuIGZpbGUgcGF0aC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gZmlsZSAtIFRoZSBmaWxlIHBhdGguXHJcblx0XHQgKiBAcmV0dXJuIHs/TG9hZGVyfSBUaGUgcmVnaXN0ZXJlZCBsb2FkZXIuIFJldHVybnMgYG51bGxgIGlmIG5vIGxvYWRlciB3YXMgZm91bmQuXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ2V0SGFuZGxlciA9IGZ1bmN0aW9uICggZmlsZSApIHtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGhhbmRsZXJzLmxlbmd0aDsgaSA8IGw7IGkgKz0gMiApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgcmVnZXggPSBoYW5kbGVyc1sgaSBdO1xyXG5cdFx0XHRcdGNvbnN0IGxvYWRlciA9IGhhbmRsZXJzWyBpICsgMSBdO1xyXG5cclxuXHRcdFx0XHRpZiAoIHJlZ2V4Lmdsb2JhbCApIHJlZ2V4Lmxhc3RJbmRleCA9IDA7IC8vIHNlZSAjMTc5MjBcclxuXHJcblx0XHRcdFx0aWYgKCByZWdleC50ZXN0KCBmaWxlICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIGxvYWRlcjtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFRoZSBnbG9iYWwgZGVmYXVsdCBsb2FkaW5nIG1hbmFnZXIuXHJcbiAqXHJcbiAqIEBjb25zdGFudFxyXG4gKiBAdHlwZSB7TG9hZGluZ01hbmFnZXJ9XHJcbiAqL1xyXG5jb25zdCBEZWZhdWx0TG9hZGluZ01hbmFnZXIgPSAvKkBfX1BVUkVfXyovIG5ldyBMb2FkaW5nTWFuYWdlcigpO1xyXG5cclxuZXhwb3J0IHsgRGVmYXVsdExvYWRpbmdNYW5hZ2VyLCBMb2FkaW5nTWFuYWdlciB9O1xyXG4iLCJpbXBvcnQgeyBEZWZhdWx0TG9hZGluZ01hbmFnZXIgfSBmcm9tICcuL0xvYWRpbmdNYW5hZ2VyLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBsb2FkZXJzLlxyXG4gKlxyXG4gKiBAYWJzdHJhY3RcclxuICovXHJcbmNsYXNzIExvYWRlciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbG9hZGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtMb2FkaW5nTWFuYWdlcn0gW21hbmFnZXJdIC0gVGhlIGxvYWRpbmcgbWFuYWdlci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbWFuYWdlciApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBsb2FkaW5nIG1hbmFnZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0xvYWRpbmdNYW5hZ2VyfVxyXG5cdFx0ICogQGRlZmF1bHQgRGVmYXVsdExvYWRpbmdNYW5hZ2VyXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWFuYWdlciA9ICggbWFuYWdlciAhPT0gdW5kZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2VyO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNyb3NzT3JpZ2luIHN0cmluZyB0byBpbXBsZW1lbnQgQ09SUyBmb3IgbG9hZGluZyB0aGUgdXJsIGZyb20gYVxyXG5cdFx0ICogZGlmZmVyZW50IGRvbWFpbiB0aGF0IGFsbG93cyBDT1JTLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKiBAZGVmYXVsdCAnYW5vbnltb3VzJ1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNyb3NzT3JpZ2luID0gJ2Fub255bW91cyc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSBYTUxIdHRwUmVxdWVzdCB1c2VzIGNyZWRlbnRpYWxzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy53aXRoQ3JlZGVudGlhbHMgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBiYXNlIHBhdGggZnJvbSB3aGljaCB0aGUgYXNzZXQgd2lsbCBiZSBsb2FkZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wYXRoID0gJyc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYmFzZSBwYXRoIGZyb20gd2hpY2ggYWRkaXRpb25hbCByZXNvdXJjZXMgbGlrZSB0ZXh0dXJlcyB3aWxsIGJlIGxvYWRlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJlc291cmNlUGF0aCA9ICcnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIFtyZXF1ZXN0IGhlYWRlcl17QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9HbG9zc2FyeS9SZXF1ZXN0X2hlYWRlcn1cclxuXHRcdCAqIHVzZWQgaW4gSFRUUCByZXF1ZXN0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLCBhbnk+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJlcXVlc3RIZWFkZXIgPSB7fTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBuZWVkcyB0byBiZSBpbXBsZW1lbnRlZCBieSBhbGwgY29uY3JldGUgbG9hZGVycy4gSXQgaG9sZHMgdGhlXHJcblx0ICogbG9naWMgZm9yIGxvYWRpbmcgYXNzZXRzIGZyb20gdGhlIGJhY2tlbmQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gVGhlIHBhdGgvVVJMIG9mIHRoZSBmaWxlIHRvIGJlIGxvYWRlZC5cclxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkxvYWQgLSBFeGVjdXRlZCB3aGVuIHRoZSBsb2FkaW5nIHByb2Nlc3MgaGFzIGJlZW4gZmluaXNoZWQuXHJcblx0ICogQHBhcmFtIHtvblByb2dyZXNzQ2FsbGJhY2t9IFtvblByb2dyZXNzXSAtIEV4ZWN1dGVkIHdoaWxlIHRoZSBsb2FkaW5nIGlzIGluIHByb2dyZXNzLlxyXG5cdCAqIEBwYXJhbSB7b25FcnJvckNhbGxiYWNrfSBbb25FcnJvcl0gLSBFeGVjdXRlZCB3aGVuIGVycm9ycyBvY2N1ci5cclxuXHQgKi9cclxuXHRsb2FkKCAvKiB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciAqLyApIHt9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEEgYXN5bmMgdmVyc2lvbiBvZiB7QGxpbmsgTG9hZGVyI2xvYWR9LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIFRoZSBwYXRoL1VSTCBvZiB0aGUgZmlsZSB0byBiZSBsb2FkZWQuXHJcblx0ICogQHBhcmFtIHtvblByb2dyZXNzQ2FsbGJhY2t9IFtvblByb2dyZXNzXSAtIEV4ZWN1dGVkIHdoaWxlIHRoZSBsb2FkaW5nIGlzIGluIHByb2dyZXNzLlxyXG5cdCAqIEByZXR1cm4ge1Byb21pc2V9IEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGFzc2V0IGhhcyBiZWVuIGxvYWRlZC5cclxuXHQgKi9cclxuXHRsb2FkQXN5bmMoIHVybCwgb25Qcm9ncmVzcyApIHtcclxuXHJcblx0XHRjb25zdCBzY29wZSA9IHRoaXM7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKCBmdW5jdGlvbiAoIHJlc29sdmUsIHJlamVjdCApIHtcclxuXHJcblx0XHRcdHNjb3BlLmxvYWQoIHVybCwgcmVzb2x2ZSwgb25Qcm9ncmVzcywgcmVqZWN0ICk7XHJcblxyXG5cdFx0fSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIG5lZWRzIHRvIGJlIGltcGxlbWVudGVkIGJ5IGFsbCBjb25jcmV0ZSBsb2FkZXJzLiBJdCBob2xkcyB0aGVcclxuXHQgKiBsb2dpYyBmb3IgcGFyc2luZyB0aGUgYXNzZXQgaW50byB0aHJlZS5qcyBlbnRpdGllcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7YW55fSBkYXRhIC0gVGhlIGRhdGEgdG8gcGFyc2UuXHJcblx0ICovXHJcblx0cGFyc2UoIC8qIGRhdGEgKi8gKSB7fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBgY3Jvc3NPcmlnaW5gIFN0cmluZyB0byBpbXBsZW1lbnQgQ09SUyBmb3IgbG9hZGluZyB0aGUgVVJMXHJcblx0ICogZnJvbSBhIGRpZmZlcmVudCBkb21haW4gdGhhdCBhbGxvd3MgQ09SUy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBjcm9zc09yaWdpbiAtIFRoZSBgY3Jvc3NPcmlnaW5gIHZhbHVlLlxyXG5cdCAqIEByZXR1cm4ge0xvYWRlcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXRDcm9zc09yaWdpbiggY3Jvc3NPcmlnaW4gKSB7XHJcblxyXG5cdFx0dGhpcy5jcm9zc09yaWdpbiA9IGNyb3NzT3JpZ2luO1xyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogV2hldGhlciB0aGUgWE1MSHR0cFJlcXVlc3QgdXNlcyBjcmVkZW50aWFscyBzdWNoIGFzIGNvb2tpZXMsIGF1dGhvcml6YXRpb25cclxuXHQgKiBoZWFkZXJzIG9yIFRMUyBjbGllbnQgY2VydGlmaWNhdGVzLCBzZWUgW1hNTEh0dHBSZXF1ZXN0LndpdGhDcmVkZW50aWFsc117QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1hNTEh0dHBSZXF1ZXN0L3dpdGhDcmVkZW50aWFsc30uXHJcblx0ICpcclxuXHQgKiBOb3RlOiBUaGlzIHNldHRpbmcgaGFzIG5vIGVmZmVjdCBpZiB5b3UgYXJlIGxvYWRpbmcgZmlsZXMgbG9jYWxseSBvciBmcm9tIHRoZSBzYW1lIGRvbWFpbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsdWUgLSBUaGUgYHdpdGhDcmVkZW50aWFsc2AgdmFsdWUuXHJcblx0ICogQHJldHVybiB7TG9hZGVyfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldFdpdGhDcmVkZW50aWFscyggdmFsdWUgKSB7XHJcblxyXG5cdFx0dGhpcy53aXRoQ3JlZGVudGlhbHMgPSB2YWx1ZTtcclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGJhc2UgcGF0aCBmb3IgdGhlIGFzc2V0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBUaGUgYmFzZSBwYXRoLlxyXG5cdCAqIEByZXR1cm4ge0xvYWRlcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXRQYXRoKCBwYXRoICkge1xyXG5cclxuXHRcdHRoaXMucGF0aCA9IHBhdGg7XHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBiYXNlIHBhdGggZm9yIGRlcGVuZGVudCByZXNvdXJjZXMgbGlrZSB0ZXh0dXJlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSByZXNvdXJjZVBhdGggLSBUaGUgcmVzb3VyY2UgcGF0aC5cclxuXHQgKiBAcmV0dXJuIHtMb2FkZXJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0UmVzb3VyY2VQYXRoKCByZXNvdXJjZVBhdGggKSB7XHJcblxyXG5cdFx0dGhpcy5yZXNvdXJjZVBhdGggPSByZXNvdXJjZVBhdGg7XHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBnaXZlbiByZXF1ZXN0IGhlYWRlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSByZXF1ZXN0SGVhZGVyIC0gQSBbcmVxdWVzdCBoZWFkZXJde0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvR2xvc3NhcnkvUmVxdWVzdF9oZWFkZXJ9XHJcblx0ICogZm9yIGNvbmZpZ3VyaW5nIHRoZSBIVFRQIHJlcXVlc3QuXHJcblx0ICogQHJldHVybiB7TG9hZGVyfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldFJlcXVlc3RIZWFkZXIoIHJlcXVlc3RIZWFkZXIgKSB7XHJcblxyXG5cdFx0dGhpcy5yZXF1ZXN0SGVhZGVyID0gcmVxdWVzdEhlYWRlcjtcclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQ2FsbGJhY2sgZm9yIG9uUHJvZ3Jlc3MgaW4gbG9hZGVycy5cclxuICpcclxuICogQGNhbGxiYWNrIG9uUHJvZ3Jlc3NDYWxsYmFja1xyXG4gKiBAcGFyYW0ge1Byb2dyZXNzRXZlbnR9IGV2ZW50IC0gQW4gaW5zdGFuY2Ugb2YgYFByb2dyZXNzRXZlbnRgIHRoYXQgcmVwcmVzZW50cyB0aGUgY3VycmVudCBsb2FkaW5nIHN0YXR1cy5cclxuICovXHJcblxyXG4vKipcclxuICogQ2FsbGJhY2sgZm9yIG9uRXJyb3IgaW4gbG9hZGVycy5cclxuICpcclxuICogQGNhbGxiYWNrIG9uRXJyb3JDYWxsYmFja1xyXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJvciAtIFRoZSBlcnJvciB3aGljaCBvY2N1cnJlZCBkdXJpbmcgdGhlIGxvYWRpbmcgcHJvY2Vzcy5cclxuICovXHJcblxyXG4vKipcclxuICogVGhlIGRlZmF1bHQgbWF0ZXJpYWwgbmFtZSB0aGF0IGlzIHVzZWQgYnkgbG9hZGVyc1xyXG4gKiB3aGVuIGNyZWF0aW5nIG1hdGVyaWFscyBmb3IgbG9hZGVkIDNEIG9iamVjdHMuXHJcbiAqXHJcbiAqIE5vdGU6IE5vdCBhbGwgbG9hZGVycyBtaWdodCBob25vciB0aGlzIHNldHRpbmcuXHJcbiAqXHJcbiAqIEBzdGF0aWNcclxuICogQHR5cGUge3N0cmluZ31cclxuICogQGRlZmF1bHQgJ19fREVGQVVMVCdcclxuICovXHJcbkxvYWRlci5ERUZBVUxUX01BVEVSSUFMX05BTUUgPSAnX19ERUZBVUxUJztcclxuXHJcbmV4cG9ydCB7IExvYWRlciB9O1xyXG4iLCJpbXBvcnQgeyBDYWNoZSB9IGZyb20gJy4vQ2FjaGUuanMnO1xyXG5pbXBvcnQgeyBMb2FkZXIgfSBmcm9tICcuL0xvYWRlci5qcyc7XHJcblxyXG5jb25zdCBsb2FkaW5nID0ge307XHJcblxyXG5jbGFzcyBIdHRwRXJyb3IgZXh0ZW5kcyBFcnJvciB7XHJcblxyXG5cdGNvbnN0cnVjdG9yKCBtZXNzYWdlLCByZXNwb25zZSApIHtcclxuXHJcblx0XHRzdXBlciggbWVzc2FnZSApO1xyXG5cdFx0dGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQSBsb3cgbGV2ZWwgY2xhc3MgZm9yIGxvYWRpbmcgcmVzb3VyY2VzIHdpdGggdGhlIEZldGNoIEFQSSwgdXNlZCBpbnRlcm5hbGx5IGJ5XHJcbiAqIG1vc3QgbG9hZGVycy4gSXQgY2FuIGFsc28gYmUgdXNlZCBkaXJlY3RseSB0byBsb2FkIGFueSBmaWxlIHR5cGUgdGhhdCBkb2VzXHJcbiAqIG5vdCBoYXZlIGEgbG9hZGVyLlxyXG4gKlxyXG4gKiBUaGlzIGxvYWRlciBzdXBwb3J0cyBjYWNoaW5nLiBJZiB5b3Ugd2FudCB0byB1c2UgaXQsIGFkZCBgVEhSRUUuQ2FjaGUuZW5hYmxlZCA9IHRydWU7YFxyXG4gKiBvbmNlIHRvIHlvdXIgYXBwbGljYXRpb24uXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGxvYWRlciA9IG5ldyBUSFJFRS5GaWxlTG9hZGVyKCk7XHJcbiAqIGNvbnN0IGRhdGEgPSBhd2FpdCBsb2FkZXIubG9hZEFzeW5jKCAnZXhhbXBsZS50eHQnICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTG9hZGVyXHJcbiAqL1xyXG5jbGFzcyBGaWxlTG9hZGVyIGV4dGVuZHMgTG9hZGVyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBmaWxlIGxvYWRlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TG9hZGluZ01hbmFnZXJ9IFttYW5hZ2VyXSAtIFRoZSBsb2FkaW5nIG1hbmFnZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG1hbmFnZXIgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG1hbmFnZXIgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBleHBlY3RlZCBtaW1lIHR5cGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5taW1lVHlwZSA9ICcnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGV4cGVjdGVkIHJlc3BvbnNlIHR5cGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeygnYXJyYXlidWZmZXInfCdibG9iJ3wnZG9jdW1lbnQnfCdqc29uJ3wnJyl9XHJcblx0XHQgKiBAZGVmYXVsdCAnJ1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJlc3BvbnNlVHlwZSA9ICcnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFN0YXJ0cyBsb2FkaW5nIGZyb20gdGhlIGdpdmVuIFVSTCBhbmQgcGFzcyB0aGUgbG9hZGVkIHJlc3BvbnNlIHRvIHRoZSBgb25Mb2FkKClgIGNhbGxiYWNrLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIFRoZSBwYXRoL1VSTCBvZiB0aGUgZmlsZSB0byBiZSBsb2FkZWQuIFRoaXMgY2FuIGFsc28gYmUgYSBkYXRhIFVSSS5cclxuXHQgKiBAcGFyYW0ge2Z1bmN0aW9uKGFueSl9IG9uTG9hZCAtIEV4ZWN1dGVkIHdoZW4gdGhlIGxvYWRpbmcgcHJvY2VzcyBoYXMgYmVlbiBmaW5pc2hlZC5cclxuXHQgKiBAcGFyYW0ge29uUHJvZ3Jlc3NDYWxsYmFja30gW29uUHJvZ3Jlc3NdIC0gRXhlY3V0ZWQgd2hpbGUgdGhlIGxvYWRpbmcgaXMgaW4gcHJvZ3Jlc3MuXHJcblx0ICogQHBhcmFtIHtvbkVycm9yQ2FsbGJhY2t9IFtvbkVycm9yXSAtIEV4ZWN1dGVkIHdoZW4gZXJyb3JzIG9jY3VyLlxyXG5cdCAqIEByZXR1cm4ge2FueXx1bmRlZmluZWR9IFRoZSBjYWNoZWQgcmVzb3VyY2UgaWYgYXZhaWxhYmxlLlxyXG5cdCAqL1xyXG5cdGxvYWQoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xyXG5cclxuXHRcdGlmICggdXJsID09PSB1bmRlZmluZWQgKSB1cmwgPSAnJztcclxuXHJcblx0XHRpZiAoIHRoaXMucGF0aCAhPT0gdW5kZWZpbmVkICkgdXJsID0gdGhpcy5wYXRoICsgdXJsO1xyXG5cclxuXHRcdHVybCA9IHRoaXMubWFuYWdlci5yZXNvbHZlVVJMKCB1cmwgKTtcclxuXHJcblx0XHRjb25zdCBjYWNoZWQgPSBDYWNoZS5nZXQoIHVybCApO1xyXG5cclxuXHRcdGlmICggY2FjaGVkICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHR0aGlzLm1hbmFnZXIuaXRlbVN0YXJ0KCB1cmwgKTtcclxuXHJcblx0XHRcdHNldFRpbWVvdXQoICgpID0+IHtcclxuXHJcblx0XHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIGNhY2hlZCApO1xyXG5cclxuXHRcdFx0XHR0aGlzLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XHJcblxyXG5cdFx0XHR9LCAwICk7XHJcblxyXG5cdFx0XHRyZXR1cm4gY2FjaGVkO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBDaGVjayBpZiByZXF1ZXN0IGlzIGR1cGxpY2F0ZVxyXG5cclxuXHRcdGlmICggbG9hZGluZ1sgdXJsIF0gIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGxvYWRpbmdbIHVybCBdLnB1c2goIHtcclxuXHJcblx0XHRcdFx0b25Mb2FkOiBvbkxvYWQsXHJcblx0XHRcdFx0b25Qcm9ncmVzczogb25Qcm9ncmVzcyxcclxuXHRcdFx0XHRvbkVycm9yOiBvbkVycm9yXHJcblxyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEluaXRpYWxpc2UgYXJyYXkgZm9yIGR1cGxpY2F0ZSByZXF1ZXN0c1xyXG5cdFx0bG9hZGluZ1sgdXJsIF0gPSBbXTtcclxuXHJcblx0XHRsb2FkaW5nWyB1cmwgXS5wdXNoKCB7XHJcblx0XHRcdG9uTG9hZDogb25Mb2FkLFxyXG5cdFx0XHRvblByb2dyZXNzOiBvblByb2dyZXNzLFxyXG5cdFx0XHRvbkVycm9yOiBvbkVycm9yLFxyXG5cdFx0fSApO1xyXG5cclxuXHRcdC8vIGNyZWF0ZSByZXF1ZXN0XHJcblx0XHRjb25zdCByZXEgPSBuZXcgUmVxdWVzdCggdXJsLCB7XHJcblx0XHRcdGhlYWRlcnM6IG5ldyBIZWFkZXJzKCB0aGlzLnJlcXVlc3RIZWFkZXIgKSxcclxuXHRcdFx0Y3JlZGVudGlhbHM6IHRoaXMud2l0aENyZWRlbnRpYWxzID8gJ2luY2x1ZGUnIDogJ3NhbWUtb3JpZ2luJyxcclxuXHRcdFx0Ly8gQW4gYWJvcnQgY29udHJvbGxlciBjb3VsZCBiZSBhZGRlZCB3aXRoaW4gYSBmdXR1cmUgUFJcclxuXHRcdH0gKTtcclxuXHJcblx0XHQvLyByZWNvcmQgc3RhdGVzICggYXZvaWQgZGF0YSByYWNlIClcclxuXHRcdGNvbnN0IG1pbWVUeXBlID0gdGhpcy5taW1lVHlwZTtcclxuXHRcdGNvbnN0IHJlc3BvbnNlVHlwZSA9IHRoaXMucmVzcG9uc2VUeXBlO1xyXG5cclxuXHRcdC8vIHN0YXJ0IHRoZSBmZXRjaFxyXG5cdFx0ZmV0Y2goIHJlcSApXHJcblx0XHRcdC50aGVuKCByZXNwb25zZSA9PiB7XHJcblxyXG5cdFx0XHRcdGlmICggcmVzcG9uc2Uuc3RhdHVzID09PSAyMDAgfHwgcmVzcG9uc2Uuc3RhdHVzID09PSAwICkge1xyXG5cclxuXHRcdFx0XHRcdC8vIFNvbWUgYnJvd3NlcnMgcmV0dXJuIEhUVFAgU3RhdHVzIDAgd2hlbiB1c2luZyBub24taHR0cCBwcm90b2NvbFxyXG5cdFx0XHRcdFx0Ly8gZS5nLiAnZmlsZTovLycgb3IgJ2RhdGE6Ly8nLiBIYW5kbGUgYXMgc3VjY2Vzcy5cclxuXHJcblx0XHRcdFx0XHRpZiAoIHJlc3BvbnNlLnN0YXR1cyA9PT0gMCApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkZpbGVMb2FkZXI6IEhUVFAgU3RhdHVzIDAgcmVjZWl2ZWQuJyApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvLyBXb3JrYXJvdW5kOiBDaGVja2luZyBpZiByZXNwb25zZS5ib2R5ID09PSB1bmRlZmluZWQgZm9yIEFsaXBheSBicm93c2VyICMyMzU0OFxyXG5cclxuXHRcdFx0XHRcdGlmICggdHlwZW9mIFJlYWRhYmxlU3RyZWFtID09PSAndW5kZWZpbmVkJyB8fCByZXNwb25zZS5ib2R5ID09PSB1bmRlZmluZWQgfHwgcmVzcG9uc2UuYm9keS5nZXRSZWFkZXIgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRcdHJldHVybiByZXNwb25zZTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgY2FsbGJhY2tzID0gbG9hZGluZ1sgdXJsIF07XHJcblx0XHRcdFx0XHRjb25zdCByZWFkZXIgPSByZXNwb25zZS5ib2R5LmdldFJlYWRlcigpO1xyXG5cclxuXHRcdFx0XHRcdC8vIE5naW54IG5lZWRzIFgtRmlsZS1TaXplIGNoZWNrXHJcblx0XHRcdFx0XHQvLyBodHRwczovL3NlcnZlcmZhdWx0LmNvbS9xdWVzdGlvbnMvNDgyODc1L3doeS1kb2VzLW5naW54LXJlbW92ZS1jb250ZW50LWxlbmd0aC1oZWFkZXItZm9yLWNodW5rZWQtY29udGVudFxyXG5cdFx0XHRcdFx0Y29uc3QgY29udGVudExlbmd0aCA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCAnWC1GaWxlLVNpemUnICkgfHwgcmVzcG9uc2UuaGVhZGVycy5nZXQoICdDb250ZW50LUxlbmd0aCcgKTtcclxuXHRcdFx0XHRcdGNvbnN0IHRvdGFsID0gY29udGVudExlbmd0aCA/IHBhcnNlSW50KCBjb250ZW50TGVuZ3RoICkgOiAwO1xyXG5cdFx0XHRcdFx0Y29uc3QgbGVuZ3RoQ29tcHV0YWJsZSA9IHRvdGFsICE9PSAwO1xyXG5cdFx0XHRcdFx0bGV0IGxvYWRlZCA9IDA7XHJcblxyXG5cdFx0XHRcdFx0Ly8gcGVyaW9kaWNhbGx5IHJlYWQgZGF0YSBpbnRvIHRoZSBuZXcgc3RyZWFtIHRyYWNraW5nIHdoaWxlIGRvd25sb2FkIHByb2dyZXNzXHJcblx0XHRcdFx0XHRjb25zdCBzdHJlYW0gPSBuZXcgUmVhZGFibGVTdHJlYW0oIHtcclxuXHRcdFx0XHRcdFx0c3RhcnQoIGNvbnRyb2xsZXIgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdHJlYWREYXRhKCk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGZ1bmN0aW9uIHJlYWREYXRhKCkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdHJlYWRlci5yZWFkKCkudGhlbiggKCB7IGRvbmUsIHZhbHVlIH0gKSA9PiB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGRvbmUgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnRyb2xsZXIuY2xvc2UoKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxvYWRlZCArPSB2YWx1ZS5ieXRlTGVuZ3RoO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBldmVudCA9IG5ldyBQcm9ncmVzc0V2ZW50KCAncHJvZ3Jlc3MnLCB7IGxlbmd0aENvbXB1dGFibGUsIGxvYWRlZCwgdG90YWwgfSApO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBjYWxsYmFja3MubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgY2FsbGJhY2sgPSBjYWxsYmFja3NbIGkgXTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmICggY2FsbGJhY2sub25Qcm9ncmVzcyApIGNhbGxiYWNrLm9uUHJvZ3Jlc3MoIGV2ZW50ICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29udHJvbGxlci5lbnF1ZXVlKCB2YWx1ZSApO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJlYWREYXRhKCk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0fSwgKCBlICkgPT4ge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0Y29udHJvbGxlci5lcnJvciggZSApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdH0gKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdH0gKTtcclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gbmV3IFJlc3BvbnNlKCBzdHJlYW0gKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHR0aHJvdyBuZXcgSHR0cEVycm9yKCBgZmV0Y2ggZm9yIFwiJHtyZXNwb25zZS51cmx9XCIgcmVzcG9uZGVkIHdpdGggJHtyZXNwb25zZS5zdGF0dXN9OiAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCwgcmVzcG9uc2UgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSApXHJcblx0XHRcdC50aGVuKCByZXNwb25zZSA9PiB7XHJcblxyXG5cdFx0XHRcdHN3aXRjaCAoIHJlc3BvbnNlVHlwZSApIHtcclxuXHJcblx0XHRcdFx0XHRjYXNlICdhcnJheWJ1ZmZlcic6XHJcblxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gcmVzcG9uc2UuYXJyYXlCdWZmZXIoKTtcclxuXHJcblx0XHRcdFx0XHRjYXNlICdibG9iJzpcclxuXHJcblx0XHRcdFx0XHRcdHJldHVybiByZXNwb25zZS5ibG9iKCk7XHJcblxyXG5cdFx0XHRcdFx0Y2FzZSAnZG9jdW1lbnQnOlxyXG5cclxuXHRcdFx0XHRcdFx0cmV0dXJuIHJlc3BvbnNlLnRleHQoKVxyXG5cdFx0XHRcdFx0XHRcdC50aGVuKCB0ZXh0ID0+IHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XHJcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyggdGV4dCwgbWltZVR5cGUgKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0fSApO1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgJ2pzb24nOlxyXG5cclxuXHRcdFx0XHRcdFx0cmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcclxuXHJcblx0XHRcdFx0XHRkZWZhdWx0OlxyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCBtaW1lVHlwZSA9PT0gJycgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdHJldHVybiByZXNwb25zZS50ZXh0KCk7XHJcblxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0XHQvLyBzbmlmZiBlbmNvZGluZ1xyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IHJlID0gL2NoYXJzZXQ9XCI/KFteO1wiXFxzXSopXCI/L2k7XHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgZXhlYyA9IHJlLmV4ZWMoIG1pbWVUeXBlICk7XHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgbGFiZWwgPSBleGVjICYmIGV4ZWNbIDEgXSA/IGV4ZWNbIDEgXS50b0xvd2VyQ2FzZSgpIDogdW5kZWZpbmVkO1xyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoIGxhYmVsICk7XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3BvbnNlLmFycmF5QnVmZmVyKCkudGhlbiggYWIgPT4gZGVjb2Rlci5kZWNvZGUoIGFiICkgKTtcclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSApXHJcblx0XHRcdC50aGVuKCBkYXRhID0+IHtcclxuXHJcblx0XHRcdFx0Ly8gQWRkIHRvIGNhY2hlIG9ubHkgb24gSFRUUCBzdWNjZXNzLCBzbyB0aGF0IHdlIGRvIG5vdCBjYWNoZVxyXG5cdFx0XHRcdC8vIGVycm9yIHJlc3BvbnNlIGJvZGllcyBhcyBwcm9wZXIgcmVzcG9uc2VzIHRvIHJlcXVlc3RzLlxyXG5cdFx0XHRcdENhY2hlLmFkZCggdXJsLCBkYXRhICk7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGNhbGxiYWNrcyA9IGxvYWRpbmdbIHVybCBdO1xyXG5cdFx0XHRcdGRlbGV0ZSBsb2FkaW5nWyB1cmwgXTtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBjYWxsYmFjayA9IGNhbGxiYWNrc1sgaSBdO1xyXG5cdFx0XHRcdFx0aWYgKCBjYWxsYmFjay5vbkxvYWQgKSBjYWxsYmFjay5vbkxvYWQoIGRhdGEgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSApXHJcblx0XHRcdC5jYXRjaCggZXJyID0+IHtcclxuXHJcblx0XHRcdFx0Ly8gQWJvcnQgZXJyb3JzIGFuZCBvdGhlciBlcnJvcnMgYXJlIGhhbmRsZWQgdGhlIHNhbWVcclxuXHJcblx0XHRcdFx0Y29uc3QgY2FsbGJhY2tzID0gbG9hZGluZ1sgdXJsIF07XHJcblxyXG5cdFx0XHRcdGlmICggY2FsbGJhY2tzID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gV2hlbiBvbkxvYWQgd2FzIGNhbGxlZCBhbmQgdXJsIHdhcyBkZWxldGVkIGluIGBsb2FkaW5nYFxyXG5cdFx0XHRcdFx0dGhpcy5tYW5hZ2VyLml0ZW1FcnJvciggdXJsICk7XHJcblx0XHRcdFx0XHR0aHJvdyBlcnI7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0ZGVsZXRlIGxvYWRpbmdbIHVybCBdO1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gY2FsbGJhY2tzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGNhbGxiYWNrID0gY2FsbGJhY2tzWyBpIF07XHJcblx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrLm9uRXJyb3IgKSBjYWxsYmFjay5vbkVycm9yKCBlcnIgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR0aGlzLm1hbmFnZXIuaXRlbUVycm9yKCB1cmwgKTtcclxuXHJcblx0XHRcdH0gKVxyXG5cdFx0XHQuZmluYWxseSggKCkgPT4ge1xyXG5cclxuXHRcdFx0XHR0aGlzLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XHJcblxyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0dGhpcy5tYW5hZ2VyLml0ZW1TdGFydCggdXJsICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZXhwZWN0ZWQgcmVzcG9uc2UgdHlwZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7KCdhcnJheWJ1ZmZlcid8J2Jsb2InfCdkb2N1bWVudCd8J2pzb24nfCcnKX0gdmFsdWUgLSBUaGUgcmVzcG9uc2UgdHlwZS5cclxuXHQgKiBAcmV0dXJuIHtGaWxlTG9hZGVyfSBBIHJlZmVyZW5jZSB0byB0aGlzIGZpbGUgbG9hZGVyLlxyXG5cdCAqL1xyXG5cdHNldFJlc3BvbnNlVHlwZSggdmFsdWUgKSB7XHJcblxyXG5cdFx0dGhpcy5yZXNwb25zZVR5cGUgPSB2YWx1ZTtcclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGV4cGVjdGVkIG1pbWUgdHlwZSBvZiB0aGUgbG9hZGVkIGZpbGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBUaGUgbWltZSB0eXBlLlxyXG5cdCAqIEByZXR1cm4ge0ZpbGVMb2FkZXJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgZmlsZSBsb2FkZXIuXHJcblx0ICovXHJcblx0c2V0TWltZVR5cGUoIHZhbHVlICkge1xyXG5cclxuXHRcdHRoaXMubWltZVR5cGUgPSB2YWx1ZTtcclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgRmlsZUxvYWRlciB9O1xyXG4iLCJpbXBvcnQgeyBBbmltYXRpb25DbGlwIH0gZnJvbSAnLi4vYW5pbWF0aW9uL0FuaW1hdGlvbkNsaXAuanMnO1xyXG5pbXBvcnQgeyBGaWxlTG9hZGVyIH0gZnJvbSAnLi9GaWxlTG9hZGVyLmpzJztcclxuaW1wb3J0IHsgTG9hZGVyIH0gZnJvbSAnLi9Mb2FkZXIuanMnO1xyXG5cclxuLyoqXHJcbiAqIENsYXNzIGZvciBsb2FkaW5nIGFuaW1hdGlvbiBjbGlwcyBpbiB0aGUgSlNPTiBmb3JtYXQuIFRoZSBmaWxlcyBhcmUgaW50ZXJuYWxseVxyXG4gKiBsb2FkZWQgdmlhIHtAbGluayBGaWxlTG9hZGVyfS5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgbG9hZGVyID0gbmV3IFRIUkVFLkFuaW1hdGlvbkxvYWRlcigpO1xyXG4gKiBjb25zdCBhbmltYXRpb25zID0gYXdhaXQgbG9hZGVyLmxvYWRBc3luYyggJ2FuaW1hdGlvbnMvYW5pbWF0aW9uLmpzJyApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIExvYWRlclxyXG4gKi9cclxuY2xhc3MgQW5pbWF0aW9uTG9hZGVyIGV4dGVuZHMgTG9hZGVyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBhbmltYXRpb24gbG9hZGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtMb2FkaW5nTWFuYWdlcn0gW21hbmFnZXJdIC0gVGhlIGxvYWRpbmcgbWFuYWdlci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbWFuYWdlciApIHtcclxuXHJcblx0XHRzdXBlciggbWFuYWdlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFN0YXJ0cyBsb2FkaW5nIGZyb20gdGhlIGdpdmVuIFVSTCBhbmQgcGFzcyB0aGUgbG9hZGVkIGFuaW1hdGlvbnMgYXMgYW4gYXJyYXlcclxuXHQgKiBob2xkaW5nIGluc3RhbmNlcyBvZiB7QGxpbmsgQW5pbWF0aW9uQ2xpcH0gdG8gdGhlIGBvbkxvYWQoKWAgY2FsbGJhY2suXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gVGhlIHBhdGgvVVJMIG9mIHRoZSBmaWxlIHRvIGJlIGxvYWRlZC4gVGhpcyBjYW4gYWxzbyBiZSBhIGRhdGEgVVJJLlxyXG5cdCAqIEBwYXJhbSB7ZnVuY3Rpb24oQXJyYXk8QW5pbWF0aW9uQ2xpcD4pfSBvbkxvYWQgLSBFeGVjdXRlZCB3aGVuIHRoZSBsb2FkaW5nIHByb2Nlc3MgaGFzIGJlZW4gZmluaXNoZWQuXHJcblx0ICogQHBhcmFtIHtvblByb2dyZXNzQ2FsbGJhY2t9IG9uUHJvZ3Jlc3MgLSBFeGVjdXRlZCB3aGlsZSB0aGUgbG9hZGluZyBpcyBpbiBwcm9ncmVzcy5cclxuXHQgKiBAcGFyYW0ge29uRXJyb3JDYWxsYmFja30gb25FcnJvciAtIEV4ZWN1dGVkIHdoZW4gZXJyb3JzIG9jY3VyLlxyXG5cdCAqL1xyXG5cdGxvYWQoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xyXG5cclxuXHRcdGNvbnN0IHNjb3BlID0gdGhpcztcclxuXHJcblx0XHRjb25zdCBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XHJcblx0XHRsb2FkZXIuc2V0UGF0aCggdGhpcy5wYXRoICk7XHJcblx0XHRsb2FkZXIuc2V0UmVxdWVzdEhlYWRlciggdGhpcy5yZXF1ZXN0SGVhZGVyICk7XHJcblx0XHRsb2FkZXIuc2V0V2l0aENyZWRlbnRpYWxzKCB0aGlzLndpdGhDcmVkZW50aWFscyApO1xyXG5cdFx0bG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCB0ZXh0ICkge1xyXG5cclxuXHRcdFx0dHJ5IHtcclxuXHJcblx0XHRcdFx0b25Mb2FkKCBzY29wZS5wYXJzZSggSlNPTi5wYXJzZSggdGV4dCApICkgKTtcclxuXHJcblx0XHRcdH0gY2F0Y2ggKCBlICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIG9uRXJyb3IgKSB7XHJcblxyXG5cdFx0XHRcdFx0b25FcnJvciggZSApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoIGUgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FcnJvciggdXJsICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBhcnNlcyB0aGUgZ2l2ZW4gSlNPTiBvYmplY3QgYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgYW5pbWF0aW9uIGNsaXBzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGpzb24gLSBUaGUgc2VyaWFsaXplZCBhbmltYXRpb24gY2xpcHMuXHJcblx0ICogQHJldHVybiB7QXJyYXk8QW5pbWF0aW9uQ2xpcD59IFRoZSBwYXJzZWQgYW5pbWF0aW9uIGNsaXBzLlxyXG5cdCAqL1xyXG5cdHBhcnNlKCBqc29uICkge1xyXG5cclxuXHRcdGNvbnN0IGFuaW1hdGlvbnMgPSBbXTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBqc29uLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGNsaXAgPSBBbmltYXRpb25DbGlwLnBhcnNlKCBqc29uWyBpIF0gKTtcclxuXHJcblx0XHRcdGFuaW1hdGlvbnMucHVzaCggY2xpcCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gYW5pbWF0aW9ucztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCB7IEFuaW1hdGlvbkxvYWRlciB9O1xyXG4iLCJpbXBvcnQgeyBMaW5lYXJGaWx0ZXIgfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBGaWxlTG9hZGVyIH0gZnJvbSAnLi9GaWxlTG9hZGVyLmpzJztcclxuaW1wb3J0IHsgQ29tcHJlc3NlZFRleHR1cmUgfSBmcm9tICcuLi90ZXh0dXJlcy9Db21wcmVzc2VkVGV4dHVyZS5qcyc7XHJcbmltcG9ydCB7IExvYWRlciB9IGZyb20gJy4vTG9hZGVyLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBsb2FkaW5nIGNvbXByZXNzZWQgdGV4dHVyZSBmb3JtYXRzIFMzVEMsIEFTVEMgb3IgRVRDLlxyXG4gKiBUZXh0dXJlcyBhcmUgaW50ZXJuYWxseSBsb2FkZWQgdmlhIHtAbGluayBGaWxlTG9hZGVyfS5cclxuICpcclxuICogRGVyaXZlZCBjbGFzc2VzIGhhdmUgdG8gaW1wbGVtZW50IHRoZSBgcGFyc2UoKWAgbWV0aG9kIHdoaWNoIGhvbGRzIHRoZSBwYXJzaW5nXHJcbiAqIGZvciB0aGUgcmVzcGVjdGl2ZSBmb3JtYXQuXHJcbiAqXHJcbiAqIEBhYnN0cmFjdFxyXG4gKiBAYXVnbWVudHMgTG9hZGVyXHJcbiAqL1xyXG5jbGFzcyBDb21wcmVzc2VkVGV4dHVyZUxvYWRlciBleHRlbmRzIExvYWRlciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgY29tcHJlc3NlZCB0ZXh0dXJlIGxvYWRlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TG9hZGluZ01hbmFnZXJ9IFttYW5hZ2VyXSAtIFRoZSBsb2FkaW5nIG1hbmFnZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG1hbmFnZXIgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG1hbmFnZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTdGFydHMgbG9hZGluZyBmcm9tIHRoZSBnaXZlbiBVUkwgYW5kIHBhc3NlcyB0aGUgbG9hZGVkIGNvbXByZXNzZWQgdGV4dHVyZVxyXG5cdCAqIHRvIHRoZSBgb25Mb2FkKClgIGNhbGxiYWNrLiBUaGUgbWV0aG9kIGFsc28gcmV0dXJucyBhIG5ldyB0ZXh0dXJlIG9iamVjdCB3aGljaCBjYW5cclxuXHQgKiBkaXJlY3RseSBiZSB1c2VkIGZvciBtYXRlcmlhbCBjcmVhdGlvbi4gSWYgeW91IGRvIGl0IHRoaXMgd2F5LCB0aGUgdGV4dHVyZVxyXG5cdCAqIG1heSBwb3AgdXAgaW4geW91ciBzY2VuZSBvbmNlIHRoZSByZXNwZWN0aXZlIGxvYWRpbmcgcHJvY2VzcyBpcyBmaW5pc2hlZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSBUaGUgcGF0aC9VUkwgb2YgdGhlIGZpbGUgdG8gYmUgbG9hZGVkLiBUaGlzIGNhbiBhbHNvIGJlIGEgZGF0YSBVUkkuXHJcblx0ICogQHBhcmFtIHtmdW5jdGlvbihDb21wcmVzc2VkVGV4dHVyZSl9IG9uTG9hZCAtIEV4ZWN1dGVkIHdoZW4gdGhlIGxvYWRpbmcgcHJvY2VzcyBoYXMgYmVlbiBmaW5pc2hlZC5cclxuXHQgKiBAcGFyYW0ge29uUHJvZ3Jlc3NDYWxsYmFja30gb25Qcm9ncmVzcyAtIEV4ZWN1dGVkIHdoaWxlIHRoZSBsb2FkaW5nIGlzIGluIHByb2dyZXNzLlxyXG5cdCAqIEBwYXJhbSB7b25FcnJvckNhbGxiYWNrfSBvbkVycm9yIC0gRXhlY3V0ZWQgd2hlbiBlcnJvcnMgb2NjdXIuXHJcblx0ICogQHJldHVybiB7Q29tcHJlc3NlZFRleHR1cmV9IFRoZSBjb21wcmVzc2VkIHRleHR1cmUuXHJcblx0ICovXHJcblx0bG9hZCggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XHJcblxyXG5cdFx0Y29uc3Qgc2NvcGUgPSB0aGlzO1xyXG5cclxuXHRcdGNvbnN0IGltYWdlcyA9IFtdO1xyXG5cclxuXHRcdGNvbnN0IHRleHR1cmUgPSBuZXcgQ29tcHJlc3NlZFRleHR1cmUoKTtcclxuXHJcblx0XHRjb25zdCBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XHJcblx0XHRsb2FkZXIuc2V0UGF0aCggdGhpcy5wYXRoICk7XHJcblx0XHRsb2FkZXIuc2V0UmVzcG9uc2VUeXBlKCAnYXJyYXlidWZmZXInICk7XHJcblx0XHRsb2FkZXIuc2V0UmVxdWVzdEhlYWRlciggdGhpcy5yZXF1ZXN0SGVhZGVyICk7XHJcblx0XHRsb2FkZXIuc2V0V2l0aENyZWRlbnRpYWxzKCBzY29wZS53aXRoQ3JlZGVudGlhbHMgKTtcclxuXHJcblx0XHRsZXQgbG9hZGVkID0gMDtcclxuXHJcblx0XHRmdW5jdGlvbiBsb2FkVGV4dHVyZSggaSApIHtcclxuXHJcblx0XHRcdGxvYWRlci5sb2FkKCB1cmxbIGkgXSwgZnVuY3Rpb24gKCBidWZmZXIgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHRleERhdGFzID0gc2NvcGUucGFyc2UoIGJ1ZmZlciwgdHJ1ZSApO1xyXG5cclxuXHRcdFx0XHRpbWFnZXNbIGkgXSA9IHtcclxuXHRcdFx0XHRcdHdpZHRoOiB0ZXhEYXRhcy53aWR0aCxcclxuXHRcdFx0XHRcdGhlaWdodDogdGV4RGF0YXMuaGVpZ2h0LFxyXG5cdFx0XHRcdFx0Zm9ybWF0OiB0ZXhEYXRhcy5mb3JtYXQsXHJcblx0XHRcdFx0XHRtaXBtYXBzOiB0ZXhEYXRhcy5taXBtYXBzXHJcblx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0bG9hZGVkICs9IDE7XHJcblxyXG5cdFx0XHRcdGlmICggbG9hZGVkID09PSA2ICkge1xyXG5cclxuXHRcdFx0XHRcdGlmICggdGV4RGF0YXMubWlwbWFwQ291bnQgPT09IDEgKSB0ZXh0dXJlLm1pbkZpbHRlciA9IExpbmVhckZpbHRlcjtcclxuXHJcblx0XHRcdFx0XHR0ZXh0dXJlLmltYWdlID0gaW1hZ2VzO1xyXG5cdFx0XHRcdFx0dGV4dHVyZS5mb3JtYXQgPSB0ZXhEYXRhcy5mb3JtYXQ7XHJcblx0XHRcdFx0XHR0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggdGV4dHVyZSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9LCBvblByb2dyZXNzLCBvbkVycm9yICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggQXJyYXkuaXNBcnJheSggdXJsICkgKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gdXJsLmxlbmd0aDsgaSA8IGlsOyArKyBpICkge1xyXG5cclxuXHRcdFx0XHRsb2FkVGV4dHVyZSggaSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHQvLyBjb21wcmVzc2VkIGN1YmVtYXAgdGV4dHVyZSBzdG9yZWQgaW4gYSBzaW5nbGUgRERTIGZpbGVcclxuXHJcblx0XHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggYnVmZmVyICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB0ZXhEYXRhcyA9IHNjb3BlLnBhcnNlKCBidWZmZXIsIHRydWUgKTtcclxuXHJcblx0XHRcdFx0aWYgKCB0ZXhEYXRhcy5pc0N1YmVtYXAgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgZmFjZXMgPSB0ZXhEYXRhcy5taXBtYXBzLmxlbmd0aCAvIHRleERhdGFzLm1pcG1hcENvdW50O1xyXG5cclxuXHRcdFx0XHRcdGZvciAoIGxldCBmID0gMDsgZiA8IGZhY2VzOyBmICsrICkge1xyXG5cclxuXHRcdFx0XHRcdFx0aW1hZ2VzWyBmIF0gPSB7IG1pcG1hcHM6IFtdIH07XHJcblxyXG5cdFx0XHRcdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB0ZXhEYXRhcy5taXBtYXBDb3VudDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0aW1hZ2VzWyBmIF0ubWlwbWFwcy5wdXNoKCB0ZXhEYXRhcy5taXBtYXBzWyBmICogdGV4RGF0YXMubWlwbWFwQ291bnQgKyBpIF0gKTtcclxuXHRcdFx0XHRcdFx0XHRpbWFnZXNbIGYgXS5mb3JtYXQgPSB0ZXhEYXRhcy5mb3JtYXQ7XHJcblx0XHRcdFx0XHRcdFx0aW1hZ2VzWyBmIF0ud2lkdGggPSB0ZXhEYXRhcy53aWR0aDtcclxuXHRcdFx0XHRcdFx0XHRpbWFnZXNbIGYgXS5oZWlnaHQgPSB0ZXhEYXRhcy5oZWlnaHQ7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHRleHR1cmUuaW1hZ2UgPSBpbWFnZXM7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0dGV4dHVyZS5pbWFnZS53aWR0aCA9IHRleERhdGFzLndpZHRoO1xyXG5cdFx0XHRcdFx0dGV4dHVyZS5pbWFnZS5oZWlnaHQgPSB0ZXhEYXRhcy5oZWlnaHQ7XHJcblx0XHRcdFx0XHR0ZXh0dXJlLm1pcG1hcHMgPSB0ZXhEYXRhcy5taXBtYXBzO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICggdGV4RGF0YXMubWlwbWFwQ291bnQgPT09IDEgKSB7XHJcblxyXG5cdFx0XHRcdFx0dGV4dHVyZS5taW5GaWx0ZXIgPSBMaW5lYXJGaWx0ZXI7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0dGV4dHVyZS5mb3JtYXQgPSB0ZXhEYXRhcy5mb3JtYXQ7XHJcblx0XHRcdFx0dGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0XHR9LCBvblByb2dyZXNzLCBvbkVycm9yICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0ZXh0dXJlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyB0aGUgcmVzdWx0IG9iamVjdCB0eXBlIG9mIHRoZSBgcGFyc2UoKWAgbWV0aG9kLlxyXG4gKlxyXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDb21wcmVzc2VkVGV4dHVyZUxvYWRlcn5UZXhEYXRhXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgYmFzZSBtaXAuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgd2lkdGggb2YgdGhlIGJhc2UgbWlwLlxyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGlzQ3ViZW1hcCAtIFdoZXRoZXIgdGhlIGRhdGEgcmVwcmVzZW50IGEgY3ViZW1hcCBvciBub3QuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBtaXBtYXBDb3VudCAtIFRoZSBtaXBtYXAgY291bnQuXHJcbiAqIEBwcm9wZXJ0eSB7QXJyYXk8e2RhdGE6VHlwZWRBcnJheSx3aWR0aDpudW1iZXIsaGVpZ2h0Om51bWJlcn0+fSBtaXBtYXBzIC0gQW4gYXJyYXkgaG9sZGluZyB0aGUgbWlwbWFwcy5cclxuICogRWFjaCBlbnRyeSBob2xkcyB0aGUgZGF0YSBhbmQgdGhlIGRpbWVuc2lvbnMgZm9yIGVhY2ggbGV2ZWwuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBmb3JtYXQgLSBUaGUgdGV4dHVyZSBmb3JtYXQuXHJcbiAqKi9cclxuXHJcbmV4cG9ydCB7IENvbXByZXNzZWRUZXh0dXJlTG9hZGVyIH07XHJcbiIsImltcG9ydCB7IENhY2hlIH0gZnJvbSAnLi9DYWNoZS5qcyc7XHJcbmltcG9ydCB7IExvYWRlciB9IGZyb20gJy4vTG9hZGVyLmpzJztcclxuaW1wb3J0IHsgY3JlYXRlRWxlbWVudE5TIH0gZnJvbSAnLi4vdXRpbHMuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgbG9hZGVyIGZvciBsb2FkaW5nIGltYWdlcy4gVGhlIGNsYXNzIGxvYWRzIGltYWdlcyB3aXRoIHRoZSBIVE1MIGBJbWFnZWAgQVBJLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBsb2FkZXIgPSBuZXcgVEhSRUUuSW1hZ2VMb2FkZXIoKTtcclxuICogY29uc3QgaW1hZ2UgPSBhd2FpdCBsb2FkZXIubG9hZEFzeW5jKCAnaW1hZ2UucG5nJyApO1xyXG4gKiBgYGBcclxuICogUGxlYXNlIG5vdGUgdGhhdCBgSW1hZ2VMb2FkZXJgIGhhcyBkcm9wcGVkIHN1cHBvcnQgZm9yIHByb2dyZXNzXHJcbiAqIGV2ZW50cyBpbiBgcjg0YC4gRm9yIGFuIGBJbWFnZUxvYWRlcmAgdGhhdCBzdXBwb3J0cyBwcm9ncmVzcyBldmVudHMsIHNlZVxyXG4gKiBbdGhpcyB0aHJlYWRde0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9tcmRvb2IvdGhyZWUuanMvaXNzdWVzLzEwNDM5I2lzc3VlY29tbWVudC0yNzU3ODU2Mzl9LlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTG9hZGVyXHJcbiAqL1xyXG5jbGFzcyBJbWFnZUxvYWRlciBleHRlbmRzIExvYWRlciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgaW1hZ2UgbG9hZGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtMb2FkaW5nTWFuYWdlcn0gW21hbmFnZXJdIC0gVGhlIGxvYWRpbmcgbWFuYWdlci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbWFuYWdlciApIHtcclxuXHJcblx0XHRzdXBlciggbWFuYWdlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFN0YXJ0cyBsb2FkaW5nIGZyb20gdGhlIGdpdmVuIFVSTCBhbmQgcGFzc2VzIHRoZSBsb2FkZWQgaW1hZ2VcclxuXHQgKiB0byB0aGUgYG9uTG9hZCgpYCBjYWxsYmFjay4gVGhlIG1ldGhvZCBhbHNvIHJldHVybnMgYSBuZXcgYEltYWdlYCBvYmplY3Qgd2hpY2ggY2FuXHJcblx0ICogZGlyZWN0bHkgYmUgdXNlZCBmb3IgdGV4dHVyZSBjcmVhdGlvbi4gSWYgeW91IGRvIGl0IHRoaXMgd2F5LCB0aGUgdGV4dHVyZVxyXG5cdCAqIG1heSBwb3AgdXAgaW4geW91ciBzY2VuZSBvbmNlIHRoZSByZXNwZWN0aXZlIGxvYWRpbmcgcHJvY2VzcyBpcyBmaW5pc2hlZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSBUaGUgcGF0aC9VUkwgb2YgdGhlIGZpbGUgdG8gYmUgbG9hZGVkLiBUaGlzIGNhbiBhbHNvIGJlIGEgZGF0YSBVUkkuXHJcblx0ICogQHBhcmFtIHtmdW5jdGlvbihJbWFnZSl9IG9uTG9hZCAtIEV4ZWN1dGVkIHdoZW4gdGhlIGxvYWRpbmcgcHJvY2VzcyBoYXMgYmVlbiBmaW5pc2hlZC5cclxuXHQgKiBAcGFyYW0ge29uUHJvZ3Jlc3NDYWxsYmFja30gb25Qcm9ncmVzcyAtIFVuc3VwcG9ydGVkIGluIHRoaXMgbG9hZGVyLlxyXG5cdCAqIEBwYXJhbSB7b25FcnJvckNhbGxiYWNrfSBvbkVycm9yIC0gRXhlY3V0ZWQgd2hlbiBlcnJvcnMgb2NjdXIuXHJcblx0ICogQHJldHVybiB7SW1hZ2V9IFRoZSBpbWFnZS5cclxuXHQgKi9cclxuXHRsb2FkKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMucGF0aCAhPT0gdW5kZWZpbmVkICkgdXJsID0gdGhpcy5wYXRoICsgdXJsO1xyXG5cclxuXHRcdHVybCA9IHRoaXMubWFuYWdlci5yZXNvbHZlVVJMKCB1cmwgKTtcclxuXHJcblx0XHRjb25zdCBzY29wZSA9IHRoaXM7XHJcblxyXG5cdFx0Y29uc3QgY2FjaGVkID0gQ2FjaGUuZ2V0KCB1cmwgKTtcclxuXHJcblx0XHRpZiAoIGNhY2hlZCAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtU3RhcnQoIHVybCApO1xyXG5cclxuXHRcdFx0c2V0VGltZW91dCggZnVuY3Rpb24gKCkge1xyXG5cclxuXHRcdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggY2FjaGVkICk7XHJcblxyXG5cdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XHJcblxyXG5cdFx0XHR9LCAwICk7XHJcblxyXG5cdFx0XHRyZXR1cm4gY2FjaGVkO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBpbWFnZSA9IGNyZWF0ZUVsZW1lbnROUyggJ2ltZycgKTtcclxuXHJcblx0XHRmdW5jdGlvbiBvbkltYWdlTG9hZCgpIHtcclxuXHJcblx0XHRcdHJlbW92ZUV2ZW50TGlzdGVuZXJzKCk7XHJcblxyXG5cdFx0XHRDYWNoZS5hZGQoIHVybCwgdGhpcyApO1xyXG5cclxuXHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIHRoaXMgKTtcclxuXHJcblx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIG9uSW1hZ2VFcnJvciggZXZlbnQgKSB7XHJcblxyXG5cdFx0XHRyZW1vdmVFdmVudExpc3RlbmVycygpO1xyXG5cclxuXHRcdFx0aWYgKCBvbkVycm9yICkgb25FcnJvciggZXZlbnQgKTtcclxuXHJcblx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVycm9yKCB1cmwgKTtcclxuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0ZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKSB7XHJcblxyXG5cdFx0XHRpbWFnZS5yZW1vdmVFdmVudExpc3RlbmVyKCAnbG9hZCcsIG9uSW1hZ2VMb2FkLCBmYWxzZSApO1xyXG5cdFx0XHRpbWFnZS5yZW1vdmVFdmVudExpc3RlbmVyKCAnZXJyb3InLCBvbkltYWdlRXJyb3IsIGZhbHNlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGltYWdlLmFkZEV2ZW50TGlzdGVuZXIoICdsb2FkJywgb25JbWFnZUxvYWQsIGZhbHNlICk7XHJcblx0XHRpbWFnZS5hZGRFdmVudExpc3RlbmVyKCAnZXJyb3InLCBvbkltYWdlRXJyb3IsIGZhbHNlICk7XHJcblxyXG5cdFx0aWYgKCB1cmwuc2xpY2UoIDAsIDUgKSAhPT0gJ2RhdGE6JyApIHtcclxuXHJcblx0XHRcdGlmICggdGhpcy5jcm9zc09yaWdpbiAhPT0gdW5kZWZpbmVkICkgaW1hZ2UuY3Jvc3NPcmlnaW4gPSB0aGlzLmNyb3NzT3JpZ2luO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRzY29wZS5tYW5hZ2VyLml0ZW1TdGFydCggdXJsICk7XHJcblxyXG5cdFx0aW1hZ2Uuc3JjID0gdXJsO1xyXG5cclxuXHRcdHJldHVybiBpbWFnZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCB7IEltYWdlTG9hZGVyIH07XHJcbiIsImltcG9ydCB7IEltYWdlTG9hZGVyIH0gZnJvbSAnLi9JbWFnZUxvYWRlci5qcyc7XHJcbmltcG9ydCB7IEN1YmVUZXh0dXJlIH0gZnJvbSAnLi4vdGV4dHVyZXMvQ3ViZVRleHR1cmUuanMnO1xyXG5pbXBvcnQgeyBMb2FkZXIgfSBmcm9tICcuL0xvYWRlci5qcyc7XHJcbmltcG9ydCB7IFNSR0JDb2xvclNwYWNlIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBDbGFzcyBmb3IgbG9hZGluZyBjdWJlIHRleHR1cmVzLiBJbWFnZXMgYXJlIGludGVybmFsbHkgbG9hZGVkIHZpYSB7QGxpbmsgSW1hZ2VMb2FkZXJ9LlxyXG4gKlxyXG4gKiBUaGUgbG9hZGVyIHJldHVybnMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEN1YmVUZXh0dXJlfSBhbmQgZXhwZWN0cyB0aGUgY3ViZSBtYXAgdG9cclxuICogYmUgZGVmaW5lZCBhcyBzaXggc2VwYXJhdGUgaW1hZ2VzIHJlcHJlc2VudGluZyB0aGUgc2lkZXMgb2YgYSBjdWJlLiBPdGhlciBjdWJlIG1hcCBkZWZpbml0aW9uc1xyXG4gKiBsaWtlIHZlcnRpY2FsIGFuZCBob3Jpem9udGFsIGNyb3NzLCBjb2x1bW4gYW5kIHJvdyBsYXlvdXRzIGFyZSBub3Qgc3VwcG9ydGVkLlxyXG4gKlxyXG4gKiBOb3RlIHRoYXQsIGJ5IGNvbnZlbnRpb24sIGN1YmUgbWFwcyBhcmUgc3BlY2lmaWVkIGluIGEgY29vcmRpbmF0ZSBzeXN0ZW1cclxuICogaW4gd2hpY2ggcG9zaXRpdmUteCBpcyB0byB0aGUgcmlnaHQgd2hlbiBsb29raW5nIHVwIHRoZSBwb3NpdGl2ZS16IGF4aXMgLS1cclxuICogaW4gb3RoZXIgd29yZHMsIHVzaW5nIGEgbGVmdC1oYW5kZWQgY29vcmRpbmF0ZSBzeXN0ZW0uIFNpbmNlIHRocmVlLmpzIHVzZXNcclxuICogYSByaWdodC1oYW5kZWQgY29vcmRpbmF0ZSBzeXN0ZW0sIGVudmlyb25tZW50IG1hcHMgdXNlZCBpbiB0aHJlZS5qcyB3aWxsXHJcbiAqIGhhdmUgcG9zLXggYW5kIG5lZy14IHN3YXBwZWQuXHJcbiAqXHJcbiAqIFRoZSBsb2FkZWQgY3ViZSB0ZXh0dXJlIGlzIGluIHNSR0IgY29sb3Igc3BhY2UuIE1lYW5pbmcge0BsaW5rIFRleHR1cmUjY29sb3JTcGFjZX1cclxuICogaXMgc2V0IHRvIGBTUkdCQ29sb3JTcGFjZWAgYnkgZGVmYXVsdC5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgbG9hZGVyID0gbmV3IFRIUkVFLkN1YmVUZXh0dXJlTG9hZGVyKCkuc2V0UGF0aCggJ3RleHR1cmVzL2N1YmVNYXBzLycgKTtcclxuICogY29uc3QgY3ViZVRleHR1cmUgPSBhd2FpdCBsb2FkZXIubG9hZEFzeW5jKCBbXHJcbiAqIFx0J3B4LnBuZycsICdueC5wbmcnLCAncHkucG5nJywgJ255LnBuZycsICdwei5wbmcnLCAnbnoucG5nJ1xyXG4gKiBdICk7XHJcbiAqIHNjZW5lLmJhY2tncm91bmQgPSBjdWJlVGV4dHVyZTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBMb2FkZXJcclxuICovXHJcbmNsYXNzIEN1YmVUZXh0dXJlTG9hZGVyIGV4dGVuZHMgTG9hZGVyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBjdWJlIHRleHR1cmUgbG9hZGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtMb2FkaW5nTWFuYWdlcn0gW21hbmFnZXJdIC0gVGhlIGxvYWRpbmcgbWFuYWdlci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbWFuYWdlciApIHtcclxuXHJcblx0XHRzdXBlciggbWFuYWdlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFN0YXJ0cyBsb2FkaW5nIGZyb20gdGhlIGdpdmVuIFVSTCBhbmQgcGFzcyB0aGUgZnVsbHkgbG9hZGVkIGN1YmUgdGV4dHVyZVxyXG5cdCAqIHRvIHRoZSBgb25Mb2FkKClgIGNhbGxiYWNrLiBUaGUgbWV0aG9kIGFsc28gcmV0dXJucyBhIG5ldyBjdWJlIHRleHR1cmUgb2JqZWN0IHdoaWNoIGNhblxyXG5cdCAqIGRpcmVjdGx5IGJlIHVzZWQgZm9yIG1hdGVyaWFsIGNyZWF0aW9uLiBJZiB5b3UgZG8gaXQgdGhpcyB3YXksIHRoZSBjdWJlIHRleHR1cmVcclxuXHQgKiBtYXkgcG9wIHVwIGluIHlvdXIgc2NlbmUgb25jZSB0aGUgcmVzcGVjdGl2ZSBsb2FkaW5nIHByb2Nlc3MgaXMgZmluaXNoZWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IHVybHMgLSBBcnJheSBvZiA2IFVSTHMgdG8gaW1hZ2VzLCBvbmUgZm9yIGVhY2ggc2lkZSBvZiB0aGVcclxuXHQgKiBjdWJlIHRleHR1cmUuIFRoZSB1cmxzIHNob3VsZCBiZSBzcGVjaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjogcG9zLXgsXHJcblx0ICogbmVnLXgsIHBvcy15LCBuZWcteSwgcG9zLXosIG5lZy16LiBBbiBhcnJheSBvZiBkYXRhIFVSSXMgYXJlIGFsbG93ZWQgYXMgd2VsbC5cclxuXHQgKiBAcGFyYW0ge2Z1bmN0aW9uKEN1YmVUZXh0dXJlKX0gb25Mb2FkIC0gRXhlY3V0ZWQgd2hlbiB0aGUgbG9hZGluZyBwcm9jZXNzIGhhcyBiZWVuIGZpbmlzaGVkLlxyXG5cdCAqIEBwYXJhbSB7b25Qcm9ncmVzc0NhbGxiYWNrfSBvblByb2dyZXNzIC0gVW5zdXBwb3J0ZWQgaW4gdGhpcyBsb2FkZXIuXHJcblx0ICogQHBhcmFtIHtvbkVycm9yQ2FsbGJhY2t9IG9uRXJyb3IgLSBFeGVjdXRlZCB3aGVuIGVycm9ycyBvY2N1ci5cclxuXHQgKiBAcmV0dXJuIHtDdWJlVGV4dHVyZX0gVGhlIGN1YmUgdGV4dHVyZS5cclxuXHQgKi9cclxuXHRsb2FkKCB1cmxzLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZSA9IG5ldyBDdWJlVGV4dHVyZSgpO1xyXG5cdFx0dGV4dHVyZS5jb2xvclNwYWNlID0gU1JHQkNvbG9yU3BhY2U7XHJcblxyXG5cdFx0Y29uc3QgbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCB0aGlzLm1hbmFnZXIgKTtcclxuXHRcdGxvYWRlci5zZXRDcm9zc09yaWdpbiggdGhpcy5jcm9zc09yaWdpbiApO1xyXG5cdFx0bG9hZGVyLnNldFBhdGgoIHRoaXMucGF0aCApO1xyXG5cclxuXHRcdGxldCBsb2FkZWQgPSAwO1xyXG5cclxuXHRcdGZ1bmN0aW9uIGxvYWRUZXh0dXJlKCBpICkge1xyXG5cclxuXHRcdFx0bG9hZGVyLmxvYWQoIHVybHNbIGkgXSwgZnVuY3Rpb24gKCBpbWFnZSApIHtcclxuXHJcblx0XHRcdFx0dGV4dHVyZS5pbWFnZXNbIGkgXSA9IGltYWdlO1xyXG5cclxuXHRcdFx0XHRsb2FkZWQgKys7XHJcblxyXG5cdFx0XHRcdGlmICggbG9hZGVkID09PSA2ICkge1xyXG5cclxuXHRcdFx0XHRcdHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0sIHVuZGVmaW5lZCwgb25FcnJvciApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB1cmxzLmxlbmd0aDsgKysgaSApIHtcclxuXHJcblx0XHRcdGxvYWRUZXh0dXJlKCBpICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0ZXh0dXJlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgQ3ViZVRleHR1cmVMb2FkZXIgfTtcclxuIiwiaW1wb3J0IHsgTGluZWFyRmlsdGVyLCBMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXIsIENsYW1wVG9FZGdlV3JhcHBpbmcgfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBGaWxlTG9hZGVyIH0gZnJvbSAnLi9GaWxlTG9hZGVyLmpzJztcclxuaW1wb3J0IHsgRGF0YVRleHR1cmUgfSBmcm9tICcuLi90ZXh0dXJlcy9EYXRhVGV4dHVyZS5qcyc7XHJcbmltcG9ydCB7IExvYWRlciB9IGZyb20gJy4vTG9hZGVyLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBsb2FkaW5nIGJpbmFyeSB0ZXh0dXJlIGZvcm1hdHMgUkdCRSwgRVhSIG9yIFRHQS5cclxuICogVGV4dHVyZXMgYXJlIGludGVybmFsbHkgbG9hZGVkIHZpYSB7QGxpbmsgRmlsZUxvYWRlcn0uXHJcbiAqXHJcbiAqIERlcml2ZWQgY2xhc3NlcyBoYXZlIHRvIGltcGxlbWVudCB0aGUgYHBhcnNlKClgIG1ldGhvZCB3aGljaCBob2xkcyB0aGUgcGFyc2luZ1xyXG4gKiBmb3IgdGhlIHJlc3BlY3RpdmUgZm9ybWF0LlxyXG4gKlxyXG4gKiBAYWJzdHJhY3RcclxuICogQGF1Z21lbnRzIExvYWRlclxyXG4gKi9cclxuY2xhc3MgRGF0YVRleHR1cmVMb2FkZXIgZXh0ZW5kcyBMb2FkZXIge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGRhdGEgdGV4dHVyZSBsb2FkZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0xvYWRpbmdNYW5hZ2VyfSBbbWFuYWdlcl0gLSBUaGUgbG9hZGluZyBtYW5hZ2VyLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBtYW5hZ2VyICkge1xyXG5cclxuXHRcdHN1cGVyKCBtYW5hZ2VyICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3RhcnRzIGxvYWRpbmcgZnJvbSB0aGUgZ2l2ZW4gVVJMIGFuZCBwYXNzZXMgdGhlIGxvYWRlZCBkYXRhIHRleHR1cmVcclxuXHQgKiB0byB0aGUgYG9uTG9hZCgpYCBjYWxsYmFjay4gVGhlIG1ldGhvZCBhbHNvIHJldHVybnMgYSBuZXcgdGV4dHVyZSBvYmplY3Qgd2hpY2ggY2FuXHJcblx0ICogZGlyZWN0bHkgYmUgdXNlZCBmb3IgbWF0ZXJpYWwgY3JlYXRpb24uIElmIHlvdSBkbyBpdCB0aGlzIHdheSwgdGhlIHRleHR1cmVcclxuXHQgKiBtYXkgcG9wIHVwIGluIHlvdXIgc2NlbmUgb25jZSB0aGUgcmVzcGVjdGl2ZSBsb2FkaW5nIHByb2Nlc3MgaXMgZmluaXNoZWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gVGhlIHBhdGgvVVJMIG9mIHRoZSBmaWxlIHRvIGJlIGxvYWRlZC4gVGhpcyBjYW4gYWxzbyBiZSBhIGRhdGEgVVJJLlxyXG5cdCAqIEBwYXJhbSB7ZnVuY3Rpb24oRGF0YVRleHR1cmUpfSBvbkxvYWQgLSBFeGVjdXRlZCB3aGVuIHRoZSBsb2FkaW5nIHByb2Nlc3MgaGFzIGJlZW4gZmluaXNoZWQuXHJcblx0ICogQHBhcmFtIHtvblByb2dyZXNzQ2FsbGJhY2t9IG9uUHJvZ3Jlc3MgLSBFeGVjdXRlZCB3aGlsZSB0aGUgbG9hZGluZyBpcyBpbiBwcm9ncmVzcy5cclxuXHQgKiBAcGFyYW0ge29uRXJyb3JDYWxsYmFja30gb25FcnJvciAtIEV4ZWN1dGVkIHdoZW4gZXJyb3JzIG9jY3VyLlxyXG5cdCAqIEByZXR1cm4ge0RhdGFUZXh0dXJlfSBUaGUgZGF0YSB0ZXh0dXJlLlxyXG5cdCAqL1xyXG5cdGxvYWQoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xyXG5cclxuXHRcdGNvbnN0IHNjb3BlID0gdGhpcztcclxuXHJcblx0XHRjb25zdCB0ZXh0dXJlID0gbmV3IERhdGFUZXh0dXJlKCk7XHJcblxyXG5cdFx0Y29uc3QgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIoIHRoaXMubWFuYWdlciApO1xyXG5cdFx0bG9hZGVyLnNldFJlc3BvbnNlVHlwZSggJ2FycmF5YnVmZmVyJyApO1xyXG5cdFx0bG9hZGVyLnNldFJlcXVlc3RIZWFkZXIoIHRoaXMucmVxdWVzdEhlYWRlciApO1xyXG5cdFx0bG9hZGVyLnNldFBhdGgoIHRoaXMucGF0aCApO1xyXG5cdFx0bG9hZGVyLnNldFdpdGhDcmVkZW50aWFscyggc2NvcGUud2l0aENyZWRlbnRpYWxzICk7XHJcblx0XHRsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoIGJ1ZmZlciApIHtcclxuXHJcblx0XHRcdGxldCB0ZXhEYXRhO1xyXG5cclxuXHRcdFx0dHJ5IHtcclxuXHJcblx0XHRcdFx0dGV4RGF0YSA9IHNjb3BlLnBhcnNlKCBidWZmZXIgKTtcclxuXHJcblx0XHRcdH0gY2F0Y2ggKCBlcnJvciApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBvbkVycm9yICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0b25FcnJvciggZXJyb3IgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCBlcnJvciApO1xyXG5cdFx0XHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHRleERhdGEuaW1hZ2UgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0dGV4dHVyZS5pbWFnZSA9IHRleERhdGEuaW1hZ2U7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCB0ZXhEYXRhLmRhdGEgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0dGV4dHVyZS5pbWFnZS53aWR0aCA9IHRleERhdGEud2lkdGg7XHJcblx0XHRcdFx0dGV4dHVyZS5pbWFnZS5oZWlnaHQgPSB0ZXhEYXRhLmhlaWdodDtcclxuXHRcdFx0XHR0ZXh0dXJlLmltYWdlLmRhdGEgPSB0ZXhEYXRhLmRhdGE7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0ZXh0dXJlLndyYXBTID0gdGV4RGF0YS53cmFwUyAhPT0gdW5kZWZpbmVkID8gdGV4RGF0YS53cmFwUyA6IENsYW1wVG9FZGdlV3JhcHBpbmc7XHJcblx0XHRcdHRleHR1cmUud3JhcFQgPSB0ZXhEYXRhLndyYXBUICE9PSB1bmRlZmluZWQgPyB0ZXhEYXRhLndyYXBUIDogQ2xhbXBUb0VkZ2VXcmFwcGluZztcclxuXHJcblx0XHRcdHRleHR1cmUubWFnRmlsdGVyID0gdGV4RGF0YS5tYWdGaWx0ZXIgIT09IHVuZGVmaW5lZCA/IHRleERhdGEubWFnRmlsdGVyIDogTGluZWFyRmlsdGVyO1xyXG5cdFx0XHR0ZXh0dXJlLm1pbkZpbHRlciA9IHRleERhdGEubWluRmlsdGVyICE9PSB1bmRlZmluZWQgPyB0ZXhEYXRhLm1pbkZpbHRlciA6IExpbmVhckZpbHRlcjtcclxuXHJcblx0XHRcdHRleHR1cmUuYW5pc290cm9weSA9IHRleERhdGEuYW5pc290cm9weSAhPT0gdW5kZWZpbmVkID8gdGV4RGF0YS5hbmlzb3Ryb3B5IDogMTtcclxuXHJcblx0XHRcdGlmICggdGV4RGF0YS5jb2xvclNwYWNlICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdHRleHR1cmUuY29sb3JTcGFjZSA9IHRleERhdGEuY29sb3JTcGFjZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggdGV4RGF0YS5mbGlwWSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHR0ZXh0dXJlLmZsaXBZID0gdGV4RGF0YS5mbGlwWTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggdGV4RGF0YS5mb3JtYXQgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0dGV4dHVyZS5mb3JtYXQgPSB0ZXhEYXRhLmZvcm1hdDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggdGV4RGF0YS50eXBlICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdHRleHR1cmUudHlwZSA9IHRleERhdGEudHlwZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggdGV4RGF0YS5taXBtYXBzICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdHRleHR1cmUubWlwbWFwcyA9IHRleERhdGEubWlwbWFwcztcclxuXHRcdFx0XHR0ZXh0dXJlLm1pbkZpbHRlciA9IExpbmVhck1pcG1hcExpbmVhckZpbHRlcjsgLy8gcHJlc3VtYWJseS4uLlxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCB0ZXhEYXRhLm1pcG1hcENvdW50ID09PSAxICkge1xyXG5cclxuXHRcdFx0XHR0ZXh0dXJlLm1pbkZpbHRlciA9IExpbmVhckZpbHRlcjtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggdGV4RGF0YS5nZW5lcmF0ZU1pcG1hcHMgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0dGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSB0ZXhEYXRhLmdlbmVyYXRlTWlwbWFwcztcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIHRleHR1cmUsIHRleERhdGEgKTtcclxuXHJcblx0XHR9LCBvblByb2dyZXNzLCBvbkVycm9yICk7XHJcblxyXG5cclxuXHRcdHJldHVybiB0ZXh0dXJlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyB0aGUgcmVzdWx0IG9iamVjdCB0eXBlIG9mIHRoZSBgcGFyc2UoKWAgbWV0aG9kLlxyXG4gKlxyXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBEYXRhVGV4dHVyZUxvYWRlcn5UZXhEYXRhXHJcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBbaW1hZ2VdIC0gQW4gb2JqZWN0IGhvbGRpbmcgd2lkdGgsIGhlaWdodCBhbmQgdGhlIHRleHR1cmUgZGF0YS5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt3aWR0aF0gLSBUaGUgd2lkdGggb2YgdGhlIGJhc2UgbWlwLlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2hlaWdodF0gLSBUaGUgd2lkdGggb2YgdGhlIGJhc2UgbWlwLlxyXG4gKiBAcHJvcGVydHkge1R5cGVkQXJyYXl9IFtkYXRhXSAtIFRoZSB0ZXh0dXJlIGRhdGEuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZm9ybWF0XSAtIFRoZSB0ZXh0dXJlIGZvcm1hdC5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0eXBlXSAtIFRoZSB0ZXh0dXJlIHR5cGUuXHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2ZsaXBZXSAtIElmIHNldCB0byBgdHJ1ZWAsIHRoZSB0ZXh0dXJlIGlzIGZsaXBwZWQgYWxvbmcgdGhlIHZlcnRpY2FsIGF4aXMgd2hlbiB1cGxvYWRlZCB0byB0aGUgR1BVLlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3dyYXBTPUNsYW1wVG9FZGdlV3JhcHBpbmddIC0gVGhlIHdyYXBTIHZhbHVlLlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3dyYXBUPUNsYW1wVG9FZGdlV3JhcHBpbmddIC0gVGhlIHdyYXBUIHZhbHVlLlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2FuaXNvdHJvcHk9MV0gLSBUaGUgYW5pc290cm9weSB2YWx1ZS5cclxuICogQHByb3BlcnR5IHtib29sZWFufSBbZ2VuZXJhdGVNaXBtYXBzXSAtIFdoZXRoZXIgdG8gZ2VuZXJhdGUgbWlwbWFwcyBvciBub3QuXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY29sb3JTcGFjZV0gLSBUaGUgY29sb3Igc3BhY2UuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbbWFnRmlsdGVyXSAtIFRoZSBtYWcgZmlsdGVyLlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW21pbkZpbHRlcl0gLSBUaGUgbWluIGZpbHRlci5cclxuICogQHByb3BlcnR5IHtBcnJheTxPYmplY3Q+fSBbbWlwbWFwc10gLSBUaGUgbWlwbWFwcy5cclxuICoqL1xyXG5cclxuZXhwb3J0IHsgRGF0YVRleHR1cmVMb2FkZXIgfTtcclxuIiwiaW1wb3J0IHsgSW1hZ2VMb2FkZXIgfSBmcm9tICcuL0ltYWdlTG9hZGVyLmpzJztcclxuaW1wb3J0IHsgVGV4dHVyZSB9IGZyb20gJy4uL3RleHR1cmVzL1RleHR1cmUuanMnO1xyXG5pbXBvcnQgeyBMb2FkZXIgfSBmcm9tICcuL0xvYWRlci5qcyc7XHJcblxyXG4vKipcclxuICogQ2xhc3MgZm9yIGxvYWRpbmcgdGV4dHVyZXMuIEltYWdlcyBhcmUgaW50ZXJuYWxseVxyXG4gKiBsb2FkZWQgdmlhIHtAbGluayBJbWFnZUxvYWRlcn0uXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGxvYWRlciA9IG5ldyBUSFJFRS5UZXh0dXJlTG9hZGVyKCk7XHJcbiAqIGNvbnN0IHRleHR1cmUgPSBhd2FpdCBsb2FkZXIubG9hZEFzeW5jKCAndGV4dHVyZXMvbGFuZF9vY2Vhbl9pY2VfY2xvdWRfMjA0OC5qcGcnICk7XHJcbiAqXHJcbiAqIGNvbnN0IG1hdGVyaWFsID0gbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKCB7IG1hcDp0ZXh0dXJlIH0gKTtcclxuICogYGBgXHJcbiAqIFBsZWFzZSBub3RlIHRoYXQgYFRleHR1cmVMb2FkZXJgIGhhcyBkcm9wcGVkIHN1cHBvcnQgZm9yIHByb2dyZXNzXHJcbiAqIGV2ZW50cyBpbiBgcjg0YC4gRm9yIGEgYFRleHR1cmVMb2FkZXJgIHRoYXQgc3VwcG9ydHMgcHJvZ3Jlc3MgZXZlbnRzLCBzZWVcclxuICogW3RoaXMgdGhyZWFkXXtAbGluayBodHRwczovL2dpdGh1Yi5jb20vbXJkb29iL3RocmVlLmpzL2lzc3Vlcy8xMDQzOSNpc3N1ZWNvbW1lbnQtMjkzMjYwMTQ1fS5cclxuICpcclxuICogQGF1Z21lbnRzIExvYWRlclxyXG4gKi9cclxuY2xhc3MgVGV4dHVyZUxvYWRlciBleHRlbmRzIExvYWRlciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgdGV4dHVyZSBsb2FkZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0xvYWRpbmdNYW5hZ2VyfSBbbWFuYWdlcl0gLSBUaGUgbG9hZGluZyBtYW5hZ2VyLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBtYW5hZ2VyICkge1xyXG5cclxuXHRcdHN1cGVyKCBtYW5hZ2VyICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3RhcnRzIGxvYWRpbmcgZnJvbSB0aGUgZ2l2ZW4gVVJMIGFuZCBwYXNzIHRoZSBmdWxseSBsb2FkZWQgdGV4dHVyZVxyXG5cdCAqIHRvIHRoZSBgb25Mb2FkKClgIGNhbGxiYWNrLiBUaGUgbWV0aG9kIGFsc28gcmV0dXJucyBhIG5ldyB0ZXh0dXJlIG9iamVjdCB3aGljaCBjYW5cclxuXHQgKiBkaXJlY3RseSBiZSB1c2VkIGZvciBtYXRlcmlhbCBjcmVhdGlvbi4gSWYgeW91IGRvIGl0IHRoaXMgd2F5LCB0aGUgdGV4dHVyZVxyXG5cdCAqIG1heSBwb3AgdXAgaW4geW91ciBzY2VuZSBvbmNlIHRoZSByZXNwZWN0aXZlIGxvYWRpbmcgcHJvY2VzcyBpcyBmaW5pc2hlZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSBUaGUgcGF0aC9VUkwgb2YgdGhlIGZpbGUgdG8gYmUgbG9hZGVkLiBUaGlzIGNhbiBhbHNvIGJlIGEgZGF0YSBVUkkuXHJcblx0ICogQHBhcmFtIHtmdW5jdGlvbihUZXh0dXJlKX0gb25Mb2FkIC0gRXhlY3V0ZWQgd2hlbiB0aGUgbG9hZGluZyBwcm9jZXNzIGhhcyBiZWVuIGZpbmlzaGVkLlxyXG5cdCAqIEBwYXJhbSB7b25Qcm9ncmVzc0NhbGxiYWNrfSBvblByb2dyZXNzIC0gVW5zdXBwb3J0ZWQgaW4gdGhpcyBsb2FkZXIuXHJcblx0ICogQHBhcmFtIHtvbkVycm9yQ2FsbGJhY2t9IG9uRXJyb3IgLSBFeGVjdXRlZCB3aGVuIGVycm9ycyBvY2N1ci5cclxuXHQgKiBAcmV0dXJuIHtUZXh0dXJlfSBUaGUgdGV4dHVyZS5cclxuXHQgKi9cclxuXHRsb2FkKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcclxuXHJcblx0XHRjb25zdCB0ZXh0dXJlID0gbmV3IFRleHR1cmUoKTtcclxuXHJcblx0XHRjb25zdCBsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoIHRoaXMubWFuYWdlciApO1xyXG5cdFx0bG9hZGVyLnNldENyb3NzT3JpZ2luKCB0aGlzLmNyb3NzT3JpZ2luICk7XHJcblx0XHRsb2FkZXIuc2V0UGF0aCggdGhpcy5wYXRoICk7XHJcblxyXG5cdFx0bG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCBpbWFnZSApIHtcclxuXHJcblx0XHRcdHRleHR1cmUuaW1hZ2UgPSBpbWFnZTtcclxuXHRcdFx0dGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0XHRpZiAoIG9uTG9hZCAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRvbkxvYWQoIHRleHR1cmUgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9LCBvblByb2dyZXNzLCBvbkVycm9yICk7XHJcblxyXG5cdFx0cmV0dXJuIHRleHR1cmU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBUZXh0dXJlTG9hZGVyIH07XHJcbiIsImltcG9ydCB7IE9iamVjdDNEIH0gZnJvbSAnLi4vY29yZS9PYmplY3QzRC5qcyc7XHJcbmltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vbWF0aC9Db2xvci5qcyc7XHJcblxyXG4vKipcclxuICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgbGlnaHRzIC0gYWxsIG90aGVyIGxpZ2h0IHR5cGVzIGluaGVyaXQgdGhlXHJcbiAqIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMgZGVzY3JpYmVkIGhlcmUuXHJcbiAqXHJcbiAqIEBhYnN0cmFjdFxyXG4gKiBAYXVnbWVudHMgT2JqZWN0M0RcclxuICovXHJcbmNsYXNzIExpZ2h0IGV4dGVuZHMgT2JqZWN0M0Qge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGxpZ2h0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHsobnVtYmVyfENvbG9yfHN0cmluZyl9IFtjb2xvcj0weGZmZmZmZl0gLSBUaGUgbGlnaHQncyBjb2xvci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2ludGVuc2l0eT0xXSAtIFRoZSBsaWdodCdzIHN0cmVuZ3RoL2ludGVuc2l0eS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggY29sb3IsIGludGVuc2l0eSA9IDEgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNMaWdodCA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ0xpZ2h0JztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBsaWdodCdzIGNvbG9yLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtDb2xvcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggY29sb3IgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBsaWdodCdzIGludGVuc2l0eS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmludGVuc2l0eSA9IGludGVuc2l0eTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGcmVlcyB0aGUgR1BVLXJlbGF0ZWQgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGlzIGluc3RhbmNlLiBDYWxsIHRoaXNcclxuXHQgKiBtZXRob2Qgd2hlbmV2ZXIgdGhpcyBpbnN0YW5jZSBpcyBubyBsb25nZXIgdXNlZCBpbiB5b3VyIGFwcC5cclxuXHQgKi9cclxuXHRkaXNwb3NlKCkge1xyXG5cclxuXHRcdC8vIEVtcHR5IGhlcmUgaW4gYmFzZSBjbGFzczsgc29tZSBzdWJjbGFzc2VzIG92ZXJyaWRlLlxyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSwgcmVjdXJzaXZlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSwgcmVjdXJzaXZlICk7XHJcblxyXG5cdFx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcclxuXHRcdHRoaXMuaW50ZW5zaXR5ID0gc291cmNlLmludGVuc2l0eTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHR0b0pTT04oIG1ldGEgKSB7XHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IHN1cGVyLnRvSlNPTiggbWV0YSApO1xyXG5cclxuXHRcdGRhdGEub2JqZWN0LmNvbG9yID0gdGhpcy5jb2xvci5nZXRIZXgoKTtcclxuXHRcdGRhdGEub2JqZWN0LmludGVuc2l0eSA9IHRoaXMuaW50ZW5zaXR5O1xyXG5cclxuXHRcdGlmICggdGhpcy5ncm91bmRDb2xvciAhPT0gdW5kZWZpbmVkICkgZGF0YS5vYmplY3QuZ3JvdW5kQ29sb3IgPSB0aGlzLmdyb3VuZENvbG9yLmdldEhleCgpO1xyXG5cclxuXHRcdGlmICggdGhpcy5kaXN0YW5jZSAhPT0gdW5kZWZpbmVkICkgZGF0YS5vYmplY3QuZGlzdGFuY2UgPSB0aGlzLmRpc3RhbmNlO1xyXG5cdFx0aWYgKCB0aGlzLmFuZ2xlICE9PSB1bmRlZmluZWQgKSBkYXRhLm9iamVjdC5hbmdsZSA9IHRoaXMuYW5nbGU7XHJcblx0XHRpZiAoIHRoaXMuZGVjYXkgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LmRlY2F5ID0gdGhpcy5kZWNheTtcclxuXHRcdGlmICggdGhpcy5wZW51bWJyYSAhPT0gdW5kZWZpbmVkICkgZGF0YS5vYmplY3QucGVudW1icmEgPSB0aGlzLnBlbnVtYnJhO1xyXG5cclxuXHRcdGlmICggdGhpcy5zaGFkb3cgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LnNoYWRvdyA9IHRoaXMuc2hhZG93LnRvSlNPTigpO1xyXG5cdFx0aWYgKCB0aGlzLnRhcmdldCAhPT0gdW5kZWZpbmVkICkgZGF0YS5vYmplY3QudGFyZ2V0ID0gdGhpcy50YXJnZXQudXVpZDtcclxuXHJcblx0XHRyZXR1cm4gZGF0YTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgTGlnaHQgfTtcclxuIiwiaW1wb3J0IHsgTGlnaHQgfSBmcm9tICcuL0xpZ2h0LmpzJztcclxuaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi9tYXRoL0NvbG9yLmpzJztcclxuaW1wb3J0IHsgT2JqZWN0M0QgfSBmcm9tICcuLi9jb3JlL09iamVjdDNELmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIGxpZ2h0IHNvdXJjZSBwb3NpdGlvbmVkIGRpcmVjdGx5IGFib3ZlIHRoZSBzY2VuZSwgd2l0aCBjb2xvciBmYWRpbmcgZnJvbVxyXG4gKiB0aGUgc2t5IGNvbG9yIHRvIHRoZSBncm91bmQgY29sb3IuXHJcbiAqXHJcbiAqIFRoaXMgbGlnaHQgY2Fubm90IGJlIHVzZWQgdG8gY2FzdCBzaGFkb3dzLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBsaWdodCA9IG5ldyBUSFJFRS5IZW1pc3BoZXJlTGlnaHQoIDB4ZmZmZmJiLCAweDA4MDgyMCwgMSApO1xyXG4gKiBzY2VuZS5hZGQoIGxpZ2h0ICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTGlnaHRcclxuICovXHJcbmNsYXNzIEhlbWlzcGhlcmVMaWdodCBleHRlbmRzIExpZ2h0IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBoZW1pc3BoZXJlIGxpZ2h0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHsobnVtYmVyfENvbG9yfHN0cmluZyl9IFtza3lDb2xvcj0weGZmZmZmZl0gLSBUaGUgbGlnaHQncyBza3kgY29sb3IuXHJcblx0ICogQHBhcmFtIHsobnVtYmVyfENvbG9yfHN0cmluZyl9IFtncm91bmRDb2xvcj0weGZmZmZmZl0gLSBUaGUgbGlnaHQncyBncm91bmQgY29sb3IuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtpbnRlbnNpdHk9MV0gLSBUaGUgbGlnaHQncyBzdHJlbmd0aC9pbnRlbnNpdHkuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHNreUNvbG9yLCBncm91bmRDb2xvciwgaW50ZW5zaXR5ICkge1xyXG5cclxuXHRcdHN1cGVyKCBza3lDb2xvciwgaW50ZW5zaXR5ICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzSGVtaXNwaGVyZUxpZ2h0ID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnSGVtaXNwaGVyZUxpZ2h0JztcclxuXHJcblx0XHR0aGlzLnBvc2l0aW9uLmNvcHkoIE9iamVjdDNELkRFRkFVTFRfVVAgKTtcclxuXHRcdHRoaXMudXBkYXRlTWF0cml4KCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbGlnaHQncyBncm91bmQgY29sb3IuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0NvbG9yfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdyb3VuZENvbG9yID0gbmV3IENvbG9yKCBncm91bmRDb2xvciApO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSwgcmVjdXJzaXZlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSwgcmVjdXJzaXZlICk7XHJcblxyXG5cdFx0dGhpcy5ncm91bmRDb2xvci5jb3B5KCBzb3VyY2UuZ3JvdW5kQ29sb3IgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgSGVtaXNwaGVyZUxpZ2h0IH07XHJcbiIsImltcG9ydCB7IE1hdHJpeDQgfSBmcm9tICcuLi9tYXRoL01hdHJpeDQuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IyLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjQgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjQuanMnO1xyXG5pbXBvcnQgeyBGcnVzdHVtIH0gZnJvbSAnLi4vbWF0aC9GcnVzdHVtLmpzJztcclxuXHJcbmNvbnN0IF9wcm9qU2NyZWVuTWF0cml4ID0gLypAX19QVVJFX18qLyBuZXcgTWF0cml4NCgpO1xyXG5jb25zdCBfbGlnaHRQb3NpdGlvbldvcmxkID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfbG9va1RhcmdldCA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuXHJcbi8qKlxyXG4gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBsaWdodCBzaGFkb3cgY2xhc3Nlcy4gVGhlc2UgY2xhc3Nlc1xyXG4gKiByZXByZXNlbnQgdGhlIHNoYWRvdyBjb25maWd1cmF0aW9uIGZvciBkaWZmZXJlbnQgbGlnaHQgdHlwZXMuXHJcbiAqXHJcbiAqIEBhYnN0cmFjdFxyXG4gKi9cclxuY2xhc3MgTGlnaHRTaGFkb3cge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGxpZ2h0IHNoYWRvdy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Q2FtZXJhfSBjYW1lcmEgLSBUaGUgbGlnaHQncyB2aWV3IG9mIHRoZSB3b3JsZC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggY2FtZXJhICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGxpZ2h0J3MgdmlldyBvZiB0aGUgd29ybGQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0NhbWVyYX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jYW1lcmEgPSBjYW1lcmE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgaW50ZW5zaXR5IG9mIHRoZSBzaGFkb3cuIFRoZSBkZWZhdWx0IGlzIGAxYC5cclxuXHRcdCAqIFZhbGlkIHZhbHVlcyBhcmUgaW4gdGhlIHJhbmdlIGBbMCwgMV1gLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaW50ZW5zaXR5ID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNoYWRvdyBtYXAgYmlhcywgaG93IG11Y2ggdG8gYWRkIG9yIHN1YnRyYWN0IGZyb20gdGhlIG5vcm1hbGl6ZWQgZGVwdGhcclxuXHRcdCAqIHdoZW4gZGVjaWRpbmcgd2hldGhlciBhIHN1cmZhY2UgaXMgaW4gc2hhZG93LlxyXG5cdFx0ICpcclxuXHRcdCAqIFRoZSBkZWZhdWx0IGlzIGAwYC4gVmVyeSB0aW55IGFkanVzdG1lbnRzIGhlcmUgKGluIHRoZSBvcmRlciBvZiBgMC4wMDAxYClcclxuXHRcdCAqIG1heSBoZWxwIHJlZHVjZSBhcnRpZmFjdHMgaW4gc2hhZG93cy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJpYXMgPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyBob3cgbXVjaCB0aGUgcG9zaXRpb24gdXNlZCB0byBxdWVyeSB0aGUgc2hhZG93IG1hcCBpcyBvZmZzZXQgYWxvbmdcclxuXHRcdCAqIHRoZSBvYmplY3Qgbm9ybWFsLiBUaGUgZGVmYXVsdCBpcyBgMGAuIEluY3JlYXNpbmcgdGhpcyB2YWx1ZSBjYW4gYmUgdXNlZCB0b1xyXG5cdFx0ICogcmVkdWNlIHNoYWRvdyBhY25lIGVzcGVjaWFsbHkgaW4gbGFyZ2Ugc2NlbmVzIHdoZXJlIGxpZ2h0IHNoaW5lcyBvbnRvXHJcblx0XHQgKiBnZW9tZXRyeSBhdCBhIHNoYWxsb3cgYW5nbGUuIFRoZSBjb3N0IGlzIHRoYXQgc2hhZG93cyBtYXkgYXBwZWFyIGRpc3RvcnRlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vcm1hbEJpYXMgPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU2V0dGluZyB0aGlzIHRvIHZhbHVlcyBncmVhdGVyIHRoYW4gMSB3aWxsIGJsdXIgdGhlIGVkZ2VzIG9mIHRoZSBzaGFkb3cuXHJcblx0XHQgKiBIaWdoIHZhbHVlcyB3aWxsIGNhdXNlIHVud2FudGVkIGJhbmRpbmcgZWZmZWN0cyBpbiB0aGUgc2hhZG93cyAtIGEgZ3JlYXRlclxyXG5cdFx0ICogbWFwIHNpemUgd2lsbCBhbGxvdyBmb3IgYSBoaWdoZXIgdmFsdWUgdG8gYmUgdXNlZCBoZXJlIGJlZm9yZSB0aGVzZSBlZmZlY3RzXHJcblx0XHQgKiBiZWNvbWUgdmlzaWJsZS5cclxuXHRcdCAqXHJcblx0XHQgKiBUaGUgcHJvcGVydHkgaGFzIG5vIGVmZmVjdCB3aGVuIHRoZSBzaGFkb3cgbWFwIHR5cGUgaXMgYFBDRlNvZnRTaGFkb3dNYXBgIGFuZFxyXG5cdFx0ICogYW5kIGl0IGlzIHJlY29tbWVuZGVkIHRvIGluY3JlYXNlIHNvZnRuZXNzIGJ5IGRlY3JlYXNpbmcgdGhlIHNoYWRvdyBtYXAgc2l6ZSBpbnN0ZWFkLlxyXG5cdFx0ICpcclxuXHRcdCAqIFRoZSBwcm9wZXJ0eSBoYXMgbm8gZWZmZWN0IHdoZW4gdGhlIHNoYWRvdyBtYXAgdHlwZSBpcyBgQmFzaWNTaGFkb3dNYXBgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmFkaXVzID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBhbW91bnQgb2Ygc2FtcGxlcyB0byB1c2Ugd2hlbiBibHVycmluZyBhIFZTTSBzaGFkb3cgbWFwLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCA4XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYmx1clNhbXBsZXMgPSA4O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgc2hhZG93IG1hcC4gSGlnaGVyIHZhbHVlcyBnaXZlIGJldHRlciBxdWFsaXR5XHJcblx0XHQgKiBzaGFkb3dzIGF0IHRoZSBjb3N0IG9mIGNvbXB1dGF0aW9uIHRpbWUuIFZhbHVlcyBtdXN0IGJlIHBvd2VycyBvZiB0d28uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjJ9XHJcblx0XHQgKiBAZGVmYXVsdCAoNTEyLDUxMilcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tYXBTaXplID0gbmV3IFZlY3RvcjIoIDUxMiwgNTEyICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZGVwdGggbWFwIGdlbmVyYXRlZCB1c2luZyB0aGUgaW50ZXJuYWwgY2FtZXJhOyBhIGxvY2F0aW9uIGJleW9uZCBhXHJcblx0XHQgKiBwaXhlbCdzIGRlcHRoIGlzIGluIHNoYWRvdy4gQ29tcHV0ZWQgaW50ZXJuYWxseSBkdXJpbmcgcmVuZGVyaW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/UmVuZGVyVGFyZ2V0fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZGlzdHJpYnV0aW9uIG1hcCBnZW5lcmF0ZWQgdXNpbmcgdGhlIGludGVybmFsIGNhbWVyYTsgYW4gb2NjbHVzaW9uIGlzXHJcblx0XHQgKiBjYWxjdWxhdGVkIGJhc2VkIG9uIHRoZSBkaXN0cmlidXRpb24gb2YgZGVwdGhzLiBDb21wdXRlZCBpbnRlcm5hbGx5IGR1cmluZ1xyXG5cdFx0ICogcmVuZGVyaW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/UmVuZGVyVGFyZ2V0fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1hcFBhc3MgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogTW9kZWwgdG8gc2hhZG93IGNhbWVyYSBzcGFjZSwgdG8gY29tcHV0ZSBsb2NhdGlvbiBhbmQgZGVwdGggaW4gc2hhZG93IG1hcC5cclxuXHRcdCAqIFRoaXMgaXMgY29tcHV0ZWQgaW50ZXJuYWxseSBkdXJpbmcgcmVuZGVyaW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtNYXRyaXg0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBFbmFibGVzIGF1dG9tYXRpYyB1cGRhdGVzIG9mIHRoZSBsaWdodCdzIHNoYWRvdy4gSWYgeW91IGRvIG5vdCByZXF1aXJlIGR5bmFtaWNcclxuXHRcdCAqIGxpZ2h0aW5nIC8gc2hhZG93cywgeW91IG1heSBzZXQgdGhpcyB0byBgZmFsc2VgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmF1dG9VcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hlbiBzZXQgdG8gYHRydWVgLCBzaGFkb3cgbWFwcyB3aWxsIGJlIHVwZGF0ZWQgaW4gdGhlIG5leHQgYHJlbmRlcmAgY2FsbC5cclxuXHRcdCAqIElmIHlvdSBoYXZlIHNldCB7QGxpbmsgTGlnaHRTaGFkb3cjYXV0b1VwZGF0ZX0gdG8gYGZhbHNlYCwgeW91IHdpbGwgbmVlZCB0b1xyXG5cdFx0ICogc2V0IHRoaXMgcHJvcGVydHkgdG8gYHRydWVgIGFuZCB0aGVuIG1ha2UgYSByZW5kZXIgY2FsbCB0byB1cGRhdGUgdGhlIGxpZ2h0J3Mgc2hhZG93LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IGZhbHNlO1xyXG5cclxuXHRcdHRoaXMuX2ZydXN0dW0gPSBuZXcgRnJ1c3R1bSgpO1xyXG5cdFx0dGhpcy5fZnJhbWVFeHRlbnRzID0gbmV3IFZlY3RvcjIoIDEsIDEgKTtcclxuXHJcblx0XHR0aGlzLl92aWV3cG9ydENvdW50ID0gMTtcclxuXHJcblx0XHR0aGlzLl92aWV3cG9ydHMgPSBbXHJcblxyXG5cdFx0XHRuZXcgVmVjdG9yNCggMCwgMCwgMSwgMSApXHJcblxyXG5cdFx0XTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVc2VkIGludGVybmFsbHkgYnkgdGhlIHJlbmRlcmVyIHRvIGdldCB0aGUgbnVtYmVyIG9mIHZpZXdwb3J0cyB0aGF0IG5lZWRcclxuXHQgKiB0byBiZSByZW5kZXJlZCBmb3IgdGhpcyBzaGFkb3cuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB2aWV3cG9ydCBjb3VudC5cclxuXHQgKi9cclxuXHRnZXRWaWV3cG9ydENvdW50KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl92aWV3cG9ydENvdW50O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdldHMgdGhlIHNoYWRvdyBjYW1lcmFzIGZydXN0dW0uIFVzZWQgaW50ZXJuYWxseSBieSB0aGUgcmVuZGVyZXIgdG8gY3VsbCBvYmplY3RzLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7RnJ1c3R1bX0gVGhlIHNoYWRvdyBjYW1lcmEgZnJ1c3R1bS5cclxuXHQgKi9cclxuXHRnZXRGcnVzdHVtKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9mcnVzdHVtO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZSB0aGUgbWF0cmljZXMgZm9yIHRoZSBjYW1lcmEgYW5kIHNoYWRvdywgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSByZW5kZXJlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TGlnaHR9IGxpZ2h0IC0gVGhlIGxpZ2h0IGZvciB3aGljaCB0aGUgc2hhZG93IGlzIGJlaW5nIHJlbmRlcmVkLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZU1hdHJpY2VzKCBsaWdodCApIHtcclxuXHJcblx0XHRjb25zdCBzaGFkb3dDYW1lcmEgPSB0aGlzLmNhbWVyYTtcclxuXHRcdGNvbnN0IHNoYWRvd01hdHJpeCA9IHRoaXMubWF0cml4O1xyXG5cclxuXHRcdF9saWdodFBvc2l0aW9uV29ybGQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC5tYXRyaXhXb3JsZCApO1xyXG5cdFx0c2hhZG93Q2FtZXJhLnBvc2l0aW9uLmNvcHkoIF9saWdodFBvc2l0aW9uV29ybGQgKTtcclxuXHJcblx0XHRfbG9va1RhcmdldC5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCApO1xyXG5cdFx0c2hhZG93Q2FtZXJhLmxvb2tBdCggX2xvb2tUYXJnZXQgKTtcclxuXHRcdHNoYWRvd0NhbWVyYS51cGRhdGVNYXRyaXhXb3JsZCgpO1xyXG5cclxuXHRcdF9wcm9qU2NyZWVuTWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIHNoYWRvd0NhbWVyYS5wcm9qZWN0aW9uTWF0cml4LCBzaGFkb3dDYW1lcmEubWF0cml4V29ybGRJbnZlcnNlICk7XHJcblx0XHR0aGlzLl9mcnVzdHVtLnNldEZyb21Qcm9qZWN0aW9uTWF0cml4KCBfcHJvalNjcmVlbk1hdHJpeCApO1xyXG5cclxuXHRcdHNoYWRvd01hdHJpeC5zZXQoXHJcblx0XHRcdDAuNSwgMC4wLCAwLjAsIDAuNSxcclxuXHRcdFx0MC4wLCAwLjUsIDAuMCwgMC41LFxyXG5cdFx0XHQwLjAsIDAuMCwgMC41LCAwLjUsXHJcblx0XHRcdDAuMCwgMC4wLCAwLjAsIDEuMFxyXG5cdFx0KTtcclxuXHJcblx0XHRzaGFkb3dNYXRyaXgubXVsdGlwbHkoIF9wcm9qU2NyZWVuTWF0cml4ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIHZpZXdwb3J0IGRlZmluaXRpb24gZm9yIHRoZSBnaXZlbiB2aWV3cG9ydCBpbmRleC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB2aWV3cG9ydEluZGV4IC0gVGhlIHZpZXdwb3J0IGluZGV4LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjR9IFRoZSB2aWV3cG9ydC5cclxuXHQgKi9cclxuXHRnZXRWaWV3cG9ydCggdmlld3BvcnRJbmRleCApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fdmlld3BvcnRzWyB2aWV3cG9ydEluZGV4IF07XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgZnJhbWUgZXh0ZW5kcy5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IFRoZSBmcmFtZSBleHRlbmRzLlxyXG5cdCAqL1xyXG5cdGdldEZyYW1lRXh0ZW50cygpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fZnJhbWVFeHRlbnRzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZyZWVzIHRoZSBHUFUtcmVsYXRlZCByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHRoaXMgaW5zdGFuY2UuIENhbGwgdGhpc1xyXG5cdCAqIG1ldGhvZCB3aGVuZXZlciB0aGlzIGluc3RhbmNlIGlzIG5vIGxvbmdlciB1c2VkIGluIHlvdXIgYXBwLlxyXG5cdCAqL1xyXG5cdGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm1hcCApIHtcclxuXHJcblx0XHRcdHRoaXMubWFwLmRpc3Bvc2UoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aGlzLm1hcFBhc3MgKSB7XHJcblxyXG5cdFx0XHR0aGlzLm1hcFBhc3MuZGlzcG9zZSgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gbGlnaHQgc2hhZG93IGluc3RhbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0xpZ2h0U2hhZG93fSBzb3VyY2UgLSBUaGUgbGlnaHQgc2hhZG93IHRvIGNvcHkuXHJcblx0ICogQHJldHVybiB7TGlnaHRTaGFkb3d9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbGlnaHQgc2hhZG93IGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHR0aGlzLmNhbWVyYSA9IHNvdXJjZS5jYW1lcmEuY2xvbmUoKTtcclxuXHJcblx0XHR0aGlzLmludGVuc2l0eSA9IHNvdXJjZS5pbnRlbnNpdHk7XHJcblxyXG5cdFx0dGhpcy5iaWFzID0gc291cmNlLmJpYXM7XHJcblx0XHR0aGlzLnJhZGl1cyA9IHNvdXJjZS5yYWRpdXM7XHJcblxyXG5cdFx0dGhpcy5tYXBTaXplLmNvcHkoIHNvdXJjZS5tYXBTaXplICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIG5ldyBsaWdodCBzaGFkb3cgaW5zdGFuY2Ugd2l0aCBjb3BpZWQgdmFsdWVzIGZyb20gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0xpZ2h0U2hhZG93fSBBIGNsb25lIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y2xvbmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNlcmlhbGl6ZXMgdGhlIGxpZ2h0IHNoYWRvdyBpbnRvIEpTT04uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtPYmplY3R9IEEgSlNPTiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzZXJpYWxpemVkIGxpZ2h0IHNoYWRvdy5cclxuXHQgKiBAc2VlIHtAbGluayBPYmplY3RMb2FkZXIjcGFyc2V9XHJcblx0ICovXHJcblx0dG9KU09OKCkge1xyXG5cclxuXHRcdGNvbnN0IG9iamVjdCA9IHt9O1xyXG5cclxuXHRcdGlmICggdGhpcy5pbnRlbnNpdHkgIT09IDEgKSBvYmplY3QuaW50ZW5zaXR5ID0gdGhpcy5pbnRlbnNpdHk7XHJcblx0XHRpZiAoIHRoaXMuYmlhcyAhPT0gMCApIG9iamVjdC5iaWFzID0gdGhpcy5iaWFzO1xyXG5cdFx0aWYgKCB0aGlzLm5vcm1hbEJpYXMgIT09IDAgKSBvYmplY3Qubm9ybWFsQmlhcyA9IHRoaXMubm9ybWFsQmlhcztcclxuXHRcdGlmICggdGhpcy5yYWRpdXMgIT09IDEgKSBvYmplY3QucmFkaXVzID0gdGhpcy5yYWRpdXM7XHJcblx0XHRpZiAoIHRoaXMubWFwU2l6ZS54ICE9PSA1MTIgfHwgdGhpcy5tYXBTaXplLnkgIT09IDUxMiApIG9iamVjdC5tYXBTaXplID0gdGhpcy5tYXBTaXplLnRvQXJyYXkoKTtcclxuXHJcblx0XHRvYmplY3QuY2FtZXJhID0gdGhpcy5jYW1lcmEudG9KU09OKCBmYWxzZSApLm9iamVjdDtcclxuXHRcdGRlbGV0ZSBvYmplY3QuY2FtZXJhLm1hdHJpeDtcclxuXHJcblx0XHRyZXR1cm4gb2JqZWN0O1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBMaWdodFNoYWRvdyB9O1xyXG4iLCJpbXBvcnQgeyBMaWdodFNoYWRvdyB9IGZyb20gJy4vTGlnaHRTaGFkb3cuanMnO1xyXG5pbXBvcnQgeyBSQUQyREVHIH0gZnJvbSAnLi4vbWF0aC9NYXRoVXRpbHMuanMnO1xyXG5pbXBvcnQgeyBQZXJzcGVjdGl2ZUNhbWVyYSB9IGZyb20gJy4uL2NhbWVyYXMvUGVyc3BlY3RpdmVDYW1lcmEuanMnO1xyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgdGhlIHNoYWRvdyBjb25maWd1cmF0aW9uIG9mIGRpcmVjdGlvbmFsIGxpZ2h0cy5cclxuICpcclxuICogQGF1Z21lbnRzIExpZ2h0U2hhZG93XHJcbiAqL1xyXG5jbGFzcyBTcG90TGlnaHRTaGFkb3cgZXh0ZW5kcyBMaWdodFNoYWRvdyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc3BvdCBsaWdodCBzaGFkb3cuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggNTAsIDEsIDAuNSwgNTAwICkgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNTcG90TGlnaHRTaGFkb3cgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVXNlZCB0byBmb2N1cyB0aGUgc2hhZG93IGNhbWVyYS4gVGhlIGNhbWVyYSdzIGZpZWxkIG9mIHZpZXcgaXMgc2V0IGFzIGFcclxuXHRcdCAqIHBlcmNlbnRhZ2Ugb2YgdGhlIHNwb3RsaWdodCdzIGZpZWxkLW9mLXZpZXcuIFJhbmdlIGlzIGBbMCwgMV1gLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZm9jdXMgPSAxO1xyXG5cclxuXHR9XHJcblxyXG5cdHVwZGF0ZU1hdHJpY2VzKCBsaWdodCApIHtcclxuXHJcblx0XHRjb25zdCBjYW1lcmEgPSB0aGlzLmNhbWVyYTtcclxuXHJcblx0XHRjb25zdCBmb3YgPSBSQUQyREVHICogMiAqIGxpZ2h0LmFuZ2xlICogdGhpcy5mb2N1cztcclxuXHRcdGNvbnN0IGFzcGVjdCA9IHRoaXMubWFwU2l6ZS53aWR0aCAvIHRoaXMubWFwU2l6ZS5oZWlnaHQ7XHJcblx0XHRjb25zdCBmYXIgPSBsaWdodC5kaXN0YW5jZSB8fCBjYW1lcmEuZmFyO1xyXG5cclxuXHRcdGlmICggZm92ICE9PSBjYW1lcmEuZm92IHx8IGFzcGVjdCAhPT0gY2FtZXJhLmFzcGVjdCB8fCBmYXIgIT09IGNhbWVyYS5mYXIgKSB7XHJcblxyXG5cdFx0XHRjYW1lcmEuZm92ID0gZm92O1xyXG5cdFx0XHRjYW1lcmEuYXNwZWN0ID0gYXNwZWN0O1xyXG5cdFx0XHRjYW1lcmEuZmFyID0gZmFyO1xyXG5cdFx0XHRjYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRzdXBlci51cGRhdGVNYXRyaWNlcyggbGlnaHQgKTtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy5mb2N1cyA9IHNvdXJjZS5mb2N1cztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgU3BvdExpZ2h0U2hhZG93IH07XHJcbiIsImltcG9ydCB7IExpZ2h0IH0gZnJvbSAnLi9MaWdodC5qcyc7XHJcbmltcG9ydCB7IFNwb3RMaWdodFNoYWRvdyB9IGZyb20gJy4vU3BvdExpZ2h0U2hhZG93LmpzJztcclxuaW1wb3J0IHsgT2JqZWN0M0QgfSBmcm9tICcuLi9jb3JlL09iamVjdDNELmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGxpZ2h0IGdldHMgZW1pdHRlZCBmcm9tIGEgc2luZ2xlIHBvaW50IGluIG9uZSBkaXJlY3Rpb24sIGFsb25nIGEgY29uZVxyXG4gKiB0aGF0IGluY3JlYXNlcyBpbiBzaXplIHRoZSBmdXJ0aGVyIGZyb20gdGhlIGxpZ2h0IGl0IGdldHMuXHJcbiAqXHJcbiAqIFRoaXMgbGlnaHQgY2FuIGNhc3Qgc2hhZG93cyAtIHNlZSB0aGUge0BsaW5rIFNwb3RMaWdodFNoYWRvd30gZm9yIGRldGFpbHMuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIC8vIHdoaXRlIHNwb3RsaWdodCBzaGluaW5nIGZyb20gdGhlIHNpZGUsIG1vZHVsYXRlZCBieSBhIHRleHR1cmVcclxuICogY29uc3Qgc3BvdExpZ2h0ID0gbmV3IFRIUkVFLlNwb3RMaWdodCggMHhmZmZmZmYgKTtcclxuICogc3BvdExpZ2h0LnBvc2l0aW9uLnNldCggMTAwLCAxMDAwLCAxMDAgKTtcclxuICogc3BvdExpZ2h0Lm1hcCA9IG5ldyBUSFJFRS5UZXh0dXJlTG9hZGVyKCkubG9hZCggdXJsICk7XHJcbiAqXHJcbiAqIHNwb3RMaWdodC5jYXN0U2hhZG93ID0gdHJ1ZTtcclxuICogc3BvdExpZ2h0LnNoYWRvdy5tYXBTaXplLndpZHRoID0gMTAyNDtcclxuICogc3BvdExpZ2h0LnNoYWRvdy5tYXBTaXplLmhlaWdodCA9IDEwMjQ7XHJcbiAqIHNwb3RMaWdodC5zaGFkb3cuY2FtZXJhLm5lYXIgPSA1MDA7XHJcbiAqIHNwb3RMaWdodC5zaGFkb3cuY2FtZXJhLmZhciA9IDQwMDA7XHJcbiAqIHNwb3RMaWdodC5zaGFkb3cuY2FtZXJhLmZvdiA9IDMwO3NcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBMaWdodFxyXG4gKi9cclxuY2xhc3MgU3BvdExpZ2h0IGV4dGVuZHMgTGlnaHQge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHNwb3QgbGlnaHQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geyhudW1iZXJ8Q29sb3J8c3RyaW5nKX0gW2NvbG9yPTB4ZmZmZmZmXSAtIFRoZSBsaWdodCdzIGNvbG9yLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbaW50ZW5zaXR5PTFdIC0gVGhlIGxpZ2h0J3Mgc3RyZW5ndGgvaW50ZW5zaXR5IG1lYXN1cmVkIGluIGNhbmRlbGEgKGNkKS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2Rpc3RhbmNlPTBdIC0gTWF4aW11bSByYW5nZSBvZiB0aGUgbGlnaHQuIGAwYCBtZWFucyBubyBsaW1pdC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2FuZ2xlPU1hdGguUEkvM10gLSBNYXhpbXVtIGFuZ2xlIG9mIGxpZ2h0IGRpc3BlcnNpb24gZnJvbSBpdHMgZGlyZWN0aW9uIHdob3NlIHVwcGVyIGJvdW5kIGlzIGBNYXRoLlBJLzJgLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbcGVudW1icmE9MF0gLSBQZXJjZW50IG9mIHRoZSBzcG90bGlnaHQgY29uZSB0aGF0IGlzIGF0dGVudWF0ZWQgZHVlIHRvIHBlbnVtYnJhLiBWYWx1ZSByYW5nZSBpcyBgWzAsMV1gLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZGVjYXk9Ml0gLSBUaGUgYW1vdW50IHRoZSBsaWdodCBkaW1zIGFsb25nIHRoZSBkaXN0YW5jZSBvZiB0aGUgbGlnaHQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGNvbG9yLCBpbnRlbnNpdHksIGRpc3RhbmNlID0gMCwgYW5nbGUgPSBNYXRoLlBJIC8gMywgcGVudW1icmEgPSAwLCBkZWNheSA9IDIgKSB7XHJcblxyXG5cdFx0c3VwZXIoIGNvbG9yLCBpbnRlbnNpdHkgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNTcG90TGlnaHQgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdTcG90TGlnaHQnO1xyXG5cclxuXHRcdHRoaXMucG9zaXRpb24uY29weSggT2JqZWN0M0QuREVGQVVMVF9VUCApO1xyXG5cdFx0dGhpcy51cGRhdGVNYXRyaXgoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBzcG90IGxpZ2h0IHBvaW50cyBmcm9tIGl0cyBwb3NpdGlvbiB0byB0aGVcclxuXHRcdCAqIHRhcmdldCdzIHBvc2l0aW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEZvciB0aGUgdGFyZ2V0J3MgcG9zaXRpb24gdG8gYmUgY2hhbmdlZCB0byBhbnl0aGluZyBvdGhlclxyXG5cdFx0ICogdGhhbiB0aGUgZGVmYXVsdCwgaXQgbXVzdCBiZSBhZGRlZCB0byB0aGUgc2NlbmUuXHJcblx0XHQgKlxyXG5cdFx0ICogSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBzZXQgdGhlIHRhcmdldCB0byBiZSBhbm90aGVyIDNEIG9iamVjdFxyXG5cdFx0ICogaW4gdGhlIHNjZW5lLiBUaGUgbGlnaHQgd2lsbCBub3cgdHJhY2sgdGhlIHRhcmdldCBvYmplY3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdDNEfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRhcmdldCA9IG5ldyBPYmplY3QzRCgpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogTWF4aW11bSByYW5nZSBvZiB0aGUgbGlnaHQuIGAwYCBtZWFucyBubyBsaW1pdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRpc3RhbmNlID0gZGlzdGFuY2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBNYXhpbXVtIGFuZ2xlIG9mIGxpZ2h0IGRpc3BlcnNpb24gZnJvbSBpdHMgZGlyZWN0aW9uIHdob3NlIHVwcGVyIGJvdW5kIGlzIGBNYXRoLlBJLzJgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCBNYXRoLlBJLzNcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hbmdsZSA9IGFuZ2xlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUGVyY2VudCBvZiB0aGUgc3BvdGxpZ2h0IGNvbmUgdGhhdCBpcyBhdHRlbnVhdGVkIGR1ZSB0byBwZW51bWJyYS5cclxuXHRcdCAqIFZhbHVlIHJhbmdlIGlzIGBbMCwxXWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wZW51bWJyYSA9IHBlbnVtYnJhO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGFtb3VudCB0aGUgbGlnaHQgZGltcyBhbG9uZyB0aGUgZGlzdGFuY2Ugb2YgdGhlIGxpZ2h0LiBJbiBjb250ZXh0IG9mXHJcblx0XHQgKiBwaHlzaWNhbGx5LWNvcnJlY3QgcmVuZGVyaW5nIHRoZSBkZWZhdWx0IHZhbHVlIHNob3VsZCBub3QgYmUgY2hhbmdlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRlY2F5ID0gZGVjYXk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHRleHR1cmUgdXNlZCB0byBtb2R1bGF0ZSB0aGUgY29sb3Igb2YgdGhlIGxpZ2h0LiBUaGUgc3BvdCBsaWdodFxyXG5cdFx0ICogY29sb3IgaXMgbWl4ZWQgd2l0aCB0aGUgUkdCIHZhbHVlIG9mIHRoaXMgdGV4dHVyZSwgd2l0aCBhIHJhdGlvXHJcblx0XHQgKiBjb3JyZXNwb25kaW5nIHRvIGl0cyBhbHBoYSB2YWx1ZS4gVGhlIGNvb2tpZS1saWtlIG1hc2tpbmcgZWZmZWN0IGlzXHJcblx0XHQgKiByZXByb2R1Y2VkIHVzaW5nIHBpeGVsIHZhbHVlcyAoMCwgMCwgMCwgMS1jb29raWVfdmFsdWUpLlxyXG5cdFx0ICpcclxuXHRcdCAqICpXYXJuaW5nKjogVGhpcyBwcm9wZXJ0eSBpcyBkaXNhYmxlZCBpZiB7QGxpbmsgT2JqZWN0M0QjY2FzdFNoYWRvd30gaXMgc2V0IHRvIGBmYWxzZWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIHByb3BlcnR5IGhvbGRzIHRoZSBsaWdodCdzIHNoYWRvdyBjb25maWd1cmF0aW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtTcG90TGlnaHRTaGFkb3d9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2hhZG93ID0gbmV3IFNwb3RMaWdodFNoYWRvdygpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBsaWdodCdzIHBvd2VyLiBQb3dlciBpcyB0aGUgbHVtaW5vdXMgcG93ZXIgb2YgdGhlIGxpZ2h0IG1lYXN1cmVkIGluIGx1bWVucyAobG0pLlxyXG5cdCAqICBDaGFuZ2luZyB0aGUgcG93ZXIgd2lsbCBhbHNvIGNoYW5nZSB0aGUgbGlnaHQncyBpbnRlbnNpdHkuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdCAqL1xyXG5cdGdldCBwb3dlcigpIHtcclxuXHJcblx0XHQvLyBjb21wdXRlIHRoZSBsaWdodCdzIGx1bWlub3VzIHBvd2VyIChpbiBsdW1lbnMpIGZyb20gaXRzIGludGVuc2l0eSAoaW4gY2FuZGVsYSlcclxuXHRcdC8vIGJ5IGNvbnZlbnRpb24gZm9yIGEgc3BvdGxpZ2h0LCBsdW1pbm91cyBwb3dlciAobG0pID0gz4AgKiBsdW1pbm91cyBpbnRlbnNpdHkgKGNkKVxyXG5cdFx0cmV0dXJuIHRoaXMuaW50ZW5zaXR5ICogTWF0aC5QSTtcclxuXHJcblx0fVxyXG5cclxuXHRzZXQgcG93ZXIoIHBvd2VyICkge1xyXG5cclxuXHRcdC8vIHNldCB0aGUgbGlnaHQncyBpbnRlbnNpdHkgKGluIGNhbmRlbGEpIGZyb20gdGhlIGRlc2lyZWQgbHVtaW5vdXMgcG93ZXIgKGluIGx1bWVucylcclxuXHRcdHRoaXMuaW50ZW5zaXR5ID0gcG93ZXIgLyBNYXRoLlBJO1xyXG5cclxuXHR9XHJcblxyXG5cdGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0dGhpcy5zaGFkb3cuZGlzcG9zZSgpO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSwgcmVjdXJzaXZlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSwgcmVjdXJzaXZlICk7XHJcblxyXG5cdFx0dGhpcy5kaXN0YW5jZSA9IHNvdXJjZS5kaXN0YW5jZTtcclxuXHRcdHRoaXMuYW5nbGUgPSBzb3VyY2UuYW5nbGU7XHJcblx0XHR0aGlzLnBlbnVtYnJhID0gc291cmNlLnBlbnVtYnJhO1xyXG5cdFx0dGhpcy5kZWNheSA9IHNvdXJjZS5kZWNheTtcclxuXHJcblx0XHR0aGlzLnRhcmdldCA9IHNvdXJjZS50YXJnZXQuY2xvbmUoKTtcclxuXHJcblx0XHR0aGlzLnNoYWRvdyA9IHNvdXJjZS5zaGFkb3cuY2xvbmUoKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgU3BvdExpZ2h0IH07XHJcbiIsImltcG9ydCB7IExpZ2h0U2hhZG93IH0gZnJvbSAnLi9MaWdodFNoYWRvdy5qcyc7XHJcbmltcG9ydCB7IFBlcnNwZWN0aXZlQ2FtZXJhIH0gZnJvbSAnLi4vY2FtZXJhcy9QZXJzcGVjdGl2ZUNhbWVyYS5qcyc7XHJcbmltcG9ydCB7IE1hdHJpeDQgfSBmcm9tICcuLi9tYXRoL01hdHJpeDQuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IyLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjQgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjQuanMnO1xyXG5cclxuY29uc3QgX3Byb2pTY3JlZW5NYXRyaXggPSAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXg0KCk7XHJcbmNvbnN0IF9saWdodFBvc2l0aW9uV29ybGQgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF9sb29rVGFyZ2V0ID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgdGhlIHNoYWRvdyBjb25maWd1cmF0aW9uIG9mIHBvaW50IGxpZ2h0cy5cclxuICpcclxuICogQGF1Z21lbnRzIExpZ2h0U2hhZG93XHJcbiAqL1xyXG5jbGFzcyBQb2ludExpZ2h0U2hhZG93IGV4dGVuZHMgTGlnaHRTaGFkb3cge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHBvaW50IGxpZ2h0IHNoYWRvdy5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHJcblx0XHRzdXBlciggbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCA5MCwgMSwgMC41LCA1MDAgKSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1BvaW50TGlnaHRTaGFkb3cgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMuX2ZyYW1lRXh0ZW50cyA9IG5ldyBWZWN0b3IyKCA0LCAyICk7XHJcblxyXG5cdFx0dGhpcy5fdmlld3BvcnRDb3VudCA9IDY7XHJcblxyXG5cdFx0dGhpcy5fdmlld3BvcnRzID0gW1xyXG5cdFx0XHQvLyBUaGVzZSB2aWV3cG9ydHMgbWFwIGEgY3ViZS1tYXAgb250byBhIDJEIHRleHR1cmUgd2l0aCB0aGVcclxuXHRcdFx0Ly8gZm9sbG93aW5nIG9yaWVudGF0aW9uOlxyXG5cdFx0XHQvL1xyXG5cdFx0XHQvLyAgeHpYWlxyXG5cdFx0XHQvLyAgIHkgWVxyXG5cdFx0XHQvL1xyXG5cdFx0XHQvLyBYIC0gUG9zaXRpdmUgeCBkaXJlY3Rpb25cclxuXHRcdFx0Ly8geCAtIE5lZ2F0aXZlIHggZGlyZWN0aW9uXHJcblx0XHRcdC8vIFkgLSBQb3NpdGl2ZSB5IGRpcmVjdGlvblxyXG5cdFx0XHQvLyB5IC0gTmVnYXRpdmUgeSBkaXJlY3Rpb25cclxuXHRcdFx0Ly8gWiAtIFBvc2l0aXZlIHogZGlyZWN0aW9uXHJcblx0XHRcdC8vIHogLSBOZWdhdGl2ZSB6IGRpcmVjdGlvblxyXG5cclxuXHRcdFx0Ly8gcG9zaXRpdmUgWFxyXG5cdFx0XHRuZXcgVmVjdG9yNCggMiwgMSwgMSwgMSApLFxyXG5cdFx0XHQvLyBuZWdhdGl2ZSBYXHJcblx0XHRcdG5ldyBWZWN0b3I0KCAwLCAxLCAxLCAxICksXHJcblx0XHRcdC8vIHBvc2l0aXZlIFpcclxuXHRcdFx0bmV3IFZlY3RvcjQoIDMsIDEsIDEsIDEgKSxcclxuXHRcdFx0Ly8gbmVnYXRpdmUgWlxyXG5cdFx0XHRuZXcgVmVjdG9yNCggMSwgMSwgMSwgMSApLFxyXG5cdFx0XHQvLyBwb3NpdGl2ZSBZXHJcblx0XHRcdG5ldyBWZWN0b3I0KCAzLCAwLCAxLCAxICksXHJcblx0XHRcdC8vIG5lZ2F0aXZlIFlcclxuXHRcdFx0bmV3IFZlY3RvcjQoIDEsIDAsIDEsIDEgKVxyXG5cdFx0XTtcclxuXHJcblx0XHR0aGlzLl9jdWJlRGlyZWN0aW9ucyA9IFtcclxuXHRcdFx0bmV3IFZlY3RvcjMoIDEsIDAsIDAgKSwgbmV3IFZlY3RvcjMoIC0gMSwgMCwgMCApLCBuZXcgVmVjdG9yMyggMCwgMCwgMSApLFxyXG5cdFx0XHRuZXcgVmVjdG9yMyggMCwgMCwgLSAxICksIG5ldyBWZWN0b3IzKCAwLCAxLCAwICksIG5ldyBWZWN0b3IzKCAwLCAtIDEsIDAgKVxyXG5cdFx0XTtcclxuXHJcblx0XHR0aGlzLl9jdWJlVXBzID0gW1xyXG5cdFx0XHRuZXcgVmVjdG9yMyggMCwgMSwgMCApLCBuZXcgVmVjdG9yMyggMCwgMSwgMCApLCBuZXcgVmVjdG9yMyggMCwgMSwgMCApLFxyXG5cdFx0XHRuZXcgVmVjdG9yMyggMCwgMSwgMCApLCBuZXcgVmVjdG9yMyggMCwgMCwgMSApLFx0bmV3IFZlY3RvcjMoIDAsIDAsIC0gMSApXHJcblx0XHRdO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZSB0aGUgbWF0cmljZXMgZm9yIHRoZSBjYW1lcmEgYW5kIHNoYWRvdywgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSByZW5kZXJlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TGlnaHR9IGxpZ2h0IC0gVGhlIGxpZ2h0IGZvciB3aGljaCB0aGUgc2hhZG93IGlzIGJlaW5nIHJlbmRlcmVkLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbdmlld3BvcnRJbmRleD0wXSAtIFRoZSB2aWV3cG9ydCBpbmRleC5cclxuXHQgKi9cclxuXHR1cGRhdGVNYXRyaWNlcyggbGlnaHQsIHZpZXdwb3J0SW5kZXggPSAwICkge1xyXG5cclxuXHRcdGNvbnN0IGNhbWVyYSA9IHRoaXMuY2FtZXJhO1xyXG5cdFx0Y29uc3Qgc2hhZG93TWF0cml4ID0gdGhpcy5tYXRyaXg7XHJcblxyXG5cdFx0Y29uc3QgZmFyID0gbGlnaHQuZGlzdGFuY2UgfHwgY2FtZXJhLmZhcjtcclxuXHJcblx0XHRpZiAoIGZhciAhPT0gY2FtZXJhLmZhciApIHtcclxuXHJcblx0XHRcdGNhbWVyYS5mYXIgPSBmYXI7XHJcblx0XHRcdGNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdF9saWdodFBvc2l0aW9uV29ybGQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC5tYXRyaXhXb3JsZCApO1xyXG5cdFx0Y2FtZXJhLnBvc2l0aW9uLmNvcHkoIF9saWdodFBvc2l0aW9uV29ybGQgKTtcclxuXHJcblx0XHRfbG9va1RhcmdldC5jb3B5KCBjYW1lcmEucG9zaXRpb24gKTtcclxuXHRcdF9sb29rVGFyZ2V0LmFkZCggdGhpcy5fY3ViZURpcmVjdGlvbnNbIHZpZXdwb3J0SW5kZXggXSApO1xyXG5cdFx0Y2FtZXJhLnVwLmNvcHkoIHRoaXMuX2N1YmVVcHNbIHZpZXdwb3J0SW5kZXggXSApO1xyXG5cdFx0Y2FtZXJhLmxvb2tBdCggX2xvb2tUYXJnZXQgKTtcclxuXHRcdGNhbWVyYS51cGRhdGVNYXRyaXhXb3JsZCgpO1xyXG5cclxuXHRcdHNoYWRvd01hdHJpeC5tYWtlVHJhbnNsYXRpb24oIC0gX2xpZ2h0UG9zaXRpb25Xb3JsZC54LCAtIF9saWdodFBvc2l0aW9uV29ybGQueSwgLSBfbGlnaHRQb3NpdGlvbldvcmxkLnogKTtcclxuXHJcblx0XHRfcHJvalNjcmVlbk1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeCwgY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSApO1xyXG5cdFx0dGhpcy5fZnJ1c3R1bS5zZXRGcm9tUHJvamVjdGlvbk1hdHJpeCggX3Byb2pTY3JlZW5NYXRyaXggKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgUG9pbnRMaWdodFNoYWRvdyB9O1xyXG4iLCJpbXBvcnQgeyBMaWdodCB9IGZyb20gJy4vTGlnaHQuanMnO1xyXG5pbXBvcnQgeyBQb2ludExpZ2h0U2hhZG93IH0gZnJvbSAnLi9Qb2ludExpZ2h0U2hhZG93LmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIGxpZ2h0IHRoYXQgZ2V0cyBlbWl0dGVkIGZyb20gYSBzaW5nbGUgcG9pbnQgaW4gYWxsIGRpcmVjdGlvbnMuIEEgY29tbW9uXHJcbiAqIHVzZSBjYXNlIGZvciB0aGlzIGlzIHRvIHJlcGxpY2F0ZSB0aGUgbGlnaHQgZW1pdHRlZCBmcm9tIGEgYmFyZVxyXG4gKiBsaWdodGJ1bGIuXHJcbiAqXHJcbiAqIFRoaXMgbGlnaHQgY2FuIGNhc3Qgc2hhZG93cyAtIHNlZSB0aGUge0BsaW5rIFBvaW50TGlnaHRTaGFkb3d9IGZvciBkZXRhaWxzLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBsaWdodCA9IG5ldyBUSFJFRS5Qb2ludExpZ2h0KCAweGZmMDAwMCwgMSwgMTAwICk7XHJcbiAqIGxpZ2h0LnBvc2l0aW9uLnNldCggNTAsIDUwLCA1MCApO1xyXG4gKiBzY2VuZS5hZGQoIGxpZ2h0ICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTGlnaHRcclxuICovXHJcbmNsYXNzIFBvaW50TGlnaHQgZXh0ZW5kcyBMaWdodCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcG9pbnQgbGlnaHQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geyhudW1iZXJ8Q29sb3J8c3RyaW5nKX0gW2NvbG9yPTB4ZmZmZmZmXSAtIFRoZSBsaWdodCdzIGNvbG9yLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbaW50ZW5zaXR5PTFdIC0gVGhlIGxpZ2h0J3Mgc3RyZW5ndGgvaW50ZW5zaXR5IG1lYXN1cmVkIGluIGNhbmRlbGEgKGNkKS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2Rpc3RhbmNlPTBdIC0gTWF4aW11bSByYW5nZSBvZiB0aGUgbGlnaHQuIGAwYCBtZWFucyBubyBsaW1pdC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2RlY2F5PTJdIC0gVGhlIGFtb3VudCB0aGUgbGlnaHQgZGltcyBhbG9uZyB0aGUgZGlzdGFuY2Ugb2YgdGhlIGxpZ2h0LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBjb2xvciwgaW50ZW5zaXR5LCBkaXN0YW5jZSA9IDAsIGRlY2F5ID0gMiApIHtcclxuXHJcblx0XHRzdXBlciggY29sb3IsIGludGVuc2l0eSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1BvaW50TGlnaHQgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdQb2ludExpZ2h0JztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZW4gZGlzdGFuY2UgaXMgemVybywgbGlnaHQgd2lsbCBhdHRlbnVhdGUgYWNjb3JkaW5nIHRvIGludmVyc2Utc3F1YXJlXHJcblx0XHQgKiBsYXcgdG8gaW5maW5pdGUgZGlzdGFuY2UuIFdoZW4gZGlzdGFuY2UgaXMgbm9uLXplcm8sIGxpZ2h0IHdpbGwgYXR0ZW51YXRlXHJcblx0XHQgKiBhY2NvcmRpbmcgdG8gaW52ZXJzZS1zcXVhcmUgbGF3IHVudGlsIG5lYXIgdGhlIGRpc3RhbmNlIGN1dG9mZiwgd2hlcmUgaXRcclxuXHRcdCAqIHdpbGwgdGhlbiBhdHRlbnVhdGUgcXVpY2tseSBhbmQgc21vb3RobHkgdG8gMC4gSW5oZXJlbnRseSwgY3V0b2ZmcyBhcmUgbm90XHJcblx0XHQgKiBwaHlzaWNhbGx5IGNvcnJlY3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kaXN0YW5jZSA9IGRpc3RhbmNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGFtb3VudCB0aGUgbGlnaHQgZGltcyBhbG9uZyB0aGUgZGlzdGFuY2Ugb2YgdGhlIGxpZ2h0LiBJbiBjb250ZXh0IG9mXHJcblx0XHQgKiBwaHlzaWNhbGx5LWNvcnJlY3QgcmVuZGVyaW5nIHRoZSBkZWZhdWx0IHZhbHVlIHNob3VsZCBub3QgYmUgY2hhbmdlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRlY2F5ID0gZGVjYXk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIHByb3BlcnR5IGhvbGRzIHRoZSBsaWdodCdzIHNoYWRvdyBjb25maWd1cmF0aW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtQb2ludExpZ2h0U2hhZG93fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNoYWRvdyA9IG5ldyBQb2ludExpZ2h0U2hhZG93KCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGxpZ2h0J3MgcG93ZXIuIFBvd2VyIGlzIHRoZSBsdW1pbm91cyBwb3dlciBvZiB0aGUgbGlnaHQgbWVhc3VyZWQgaW4gbHVtZW5zIChsbSkuXHJcblx0ICogQ2hhbmdpbmcgdGhlIHBvd2VyIHdpbGwgYWxzbyBjaGFuZ2UgdGhlIGxpZ2h0J3MgaW50ZW5zaXR5LlxyXG5cdCAqXHJcblx0ICogQHR5cGUge251bWJlcn1cclxuXHQgKi9cclxuXHRnZXQgcG93ZXIoKSB7XHJcblxyXG5cdFx0Ly8gY29tcHV0ZSB0aGUgbGlnaHQncyBsdW1pbm91cyBwb3dlciAoaW4gbHVtZW5zKSBmcm9tIGl0cyBpbnRlbnNpdHkgKGluIGNhbmRlbGEpXHJcblx0XHQvLyBmb3IgYW4gaXNvdHJvcGljIGxpZ2h0IHNvdXJjZSwgbHVtaW5vdXMgcG93ZXIgKGxtKSA9IDQgz4AgbHVtaW5vdXMgaW50ZW5zaXR5IChjZClcclxuXHRcdHJldHVybiB0aGlzLmludGVuc2l0eSAqIDQgKiBNYXRoLlBJO1xyXG5cclxuXHR9XHJcblxyXG5cdHNldCBwb3dlciggcG93ZXIgKSB7XHJcblxyXG5cdFx0Ly8gc2V0IHRoZSBsaWdodCdzIGludGVuc2l0eSAoaW4gY2FuZGVsYSkgZnJvbSB0aGUgZGVzaXJlZCBsdW1pbm91cyBwb3dlciAoaW4gbHVtZW5zKVxyXG5cdFx0dGhpcy5pbnRlbnNpdHkgPSBwb3dlciAvICggNCAqIE1hdGguUEkgKTtcclxuXHJcblx0fVxyXG5cclxuXHRkaXNwb3NlKCkge1xyXG5cclxuXHRcdHRoaXMuc2hhZG93LmRpc3Bvc2UoKTtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UsIHJlY3Vyc2l2ZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UsIHJlY3Vyc2l2ZSApO1xyXG5cclxuXHRcdHRoaXMuZGlzdGFuY2UgPSBzb3VyY2UuZGlzdGFuY2U7XHJcblx0XHR0aGlzLmRlY2F5ID0gc291cmNlLmRlY2F5O1xyXG5cclxuXHRcdHRoaXMuc2hhZG93ID0gc291cmNlLnNoYWRvdy5jbG9uZSgpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBQb2ludExpZ2h0IH07XHJcbiIsImltcG9ydCB7IENhbWVyYSB9IGZyb20gJy4vQ2FtZXJhLmpzJztcclxuXHJcbi8qKlxyXG4gKiBDYW1lcmEgdGhhdCB1c2VzIFtvcnRob2dyYXBoaWMgcHJvamVjdGlvbl17QGxpbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvT3J0aG9ncmFwaGljX3Byb2plY3Rpb259LlxyXG4gKlxyXG4gKiBJbiB0aGlzIHByb2plY3Rpb24gbW9kZSwgYW4gb2JqZWN0J3Mgc2l6ZSBpbiB0aGUgcmVuZGVyZWQgaW1hZ2Ugc3RheXNcclxuICogY29uc3RhbnQgcmVnYXJkbGVzcyBvZiBpdHMgZGlzdGFuY2UgZnJvbSB0aGUgY2FtZXJhLiBUaGlzIGNhbiBiZSB1c2VmdWxcclxuICogZm9yIHJlbmRlcmluZyAyRCBzY2VuZXMgYW5kIFVJIGVsZW1lbnRzLCBhbW9uZ3N0IG90aGVyIHRoaW5ncy5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgY2FtZXJhID0gbmV3IFRIUkVFLk9ydGhvZ3JhcGhpY0NhbWVyYSggd2lkdGggLyAtIDIsIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMiwgaGVpZ2h0IC8gLSAyLCAxLCAxMDAwICk7XHJcbiAqIHNjZW5lLmFkZCggY2FtZXJhICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQ2FtZXJhXHJcbiAqL1xyXG5jbGFzcyBPcnRob2dyYXBoaWNDYW1lcmEgZXh0ZW5kcyBDYW1lcmEge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG9ydGhvZ3JhcGhpYyBjYW1lcmEuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2xlZnQ9LTFdIC0gVGhlIGxlZnQgcGxhbmUgb2YgdGhlIGNhbWVyYSdzIGZydXN0dW0uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtyaWdodD0xXSAtIFRoZSByaWdodCBwbGFuZSBvZiB0aGUgY2FtZXJhJ3MgZnJ1c3R1bS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3RvcD0xXSAtIFRoZSB0b3AgcGxhbmUgb2YgdGhlIGNhbWVyYSdzIGZydXN0dW0uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtib3R0b209LTFdIC0gVGhlIGJvdHRvbSBwbGFuZSBvZiB0aGUgY2FtZXJhJ3MgZnJ1c3R1bS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW25lYXI9MC4xXSAtIFRoZSBjYW1lcmEncyBuZWFyIHBsYW5lLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZmFyPTIwMDBdIC0gVGhlIGNhbWVyYSdzIGZhciBwbGFuZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbGVmdCA9IC0gMSwgcmlnaHQgPSAxLCB0b3AgPSAxLCBib3R0b20gPSAtIDEsIG5lYXIgPSAwLjEsIGZhciA9IDIwMDAgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNPcnRob2dyYXBoaWNDYW1lcmEgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdPcnRob2dyYXBoaWNDYW1lcmEnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHpvb20gZmFjdG9yIG9mIHRoZSBjYW1lcmEuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy56b29tID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlcHJlc2VudHMgdGhlIGZydXN0dW0gd2luZG93IHNwZWNpZmljYXRpb24uIFRoaXMgcHJvcGVydHkgc2hvdWxkIG5vdCBiZSBlZGl0ZWRcclxuXHRcdCAqIGRpcmVjdGx5IGJ1dCB2aWEge0BsaW5rIFBlcnNwZWN0aXZlQ2FtZXJhI3NldFZpZXdPZmZzZXR9IGFuZCB7QGxpbmsgUGVyc3BlY3RpdmVDYW1lcmEjY2xlYXJWaWV3T2Zmc2V0fS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P09iamVjdH1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52aWV3ID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBsZWZ0IHBsYW5lIG9mIHRoZSBjYW1lcmEncyBmcnVzdHVtLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAtMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxlZnQgPSBsZWZ0O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJpZ2h0IHBsYW5lIG9mIHRoZSBjYW1lcmEncyBmcnVzdHVtLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmlnaHQgPSByaWdodDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB0b3AgcGxhbmUgb2YgdGhlIGNhbWVyYSdzIGZydXN0dW0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50b3AgPSB0b3A7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYm90dG9tIHBsYW5lIG9mIHRoZSBjYW1lcmEncyBmcnVzdHVtLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAtMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJvdHRvbSA9IGJvdHRvbTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjYW1lcmEncyBuZWFyIHBsYW5lLiBUaGUgdmFsaWQgcmFuZ2UgaXMgZ3JlYXRlciB0aGFuIGAwYFxyXG5cdFx0ICogYW5kIGxlc3MgdGhhbiB0aGUgY3VycmVudCB2YWx1ZSBvZiB7QGxpbmsgT3J0aG9ncmFwaGljQ2FtZXJhI2Zhcn0uXHJcblx0XHQgKlxyXG5cdFx0ICogTm90ZSB0aGF0LCB1bmxpa2UgZm9yIHRoZSB7QGxpbmsgUGVyc3BlY3RpdmVDYW1lcmF9LCBgMGAgaXMgYVxyXG5cdFx0ICogdmFsaWQgdmFsdWUgZm9yIGFuIG9ydGhvZ3JhcGhpYyBjYW1lcmEncyBuZWFyIHBsYW5lLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwLjFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5uZWFyID0gbmVhcjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjYW1lcmEncyBmYXIgcGxhbmUuIE11c3QgYmUgZ3JlYXRlciB0aGFuIHRoZVxyXG5cdFx0ICogY3VycmVudCB2YWx1ZSBvZiB7QGxpbmsgT3J0aG9ncmFwaGljQ2FtZXJhI25lYXJ9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAyMDAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZmFyID0gZmFyO1xyXG5cclxuXHRcdHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSwgcmVjdXJzaXZlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSwgcmVjdXJzaXZlICk7XHJcblxyXG5cdFx0dGhpcy5sZWZ0ID0gc291cmNlLmxlZnQ7XHJcblx0XHR0aGlzLnJpZ2h0ID0gc291cmNlLnJpZ2h0O1xyXG5cdFx0dGhpcy50b3AgPSBzb3VyY2UudG9wO1xyXG5cdFx0dGhpcy5ib3R0b20gPSBzb3VyY2UuYm90dG9tO1xyXG5cdFx0dGhpcy5uZWFyID0gc291cmNlLm5lYXI7XHJcblx0XHR0aGlzLmZhciA9IHNvdXJjZS5mYXI7XHJcblxyXG5cdFx0dGhpcy56b29tID0gc291cmNlLnpvb207XHJcblx0XHR0aGlzLnZpZXcgPSBzb3VyY2UudmlldyA9PT0gbnVsbCA/IG51bGwgOiBPYmplY3QuYXNzaWduKCB7fSwgc291cmNlLnZpZXcgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIGFuIG9mZnNldCBpbiBhIGxhcmdlciBmcnVzdHVtLiBUaGlzIGlzIHVzZWZ1bCBmb3IgbXVsdGktd2luZG93IG9yXHJcblx0ICogbXVsdGktbW9uaXRvci9tdWx0aS1tYWNoaW5lIHNldHVwcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBmdWxsV2lkdGggLSBUaGUgZnVsbCB3aWR0aCBvZiBtdWx0aXZpZXcgc2V0dXAuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGZ1bGxIZWlnaHQgLSBUaGUgZnVsbCBoZWlnaHQgb2YgbXVsdGl2aWV3IHNldHVwLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGhvcml6b250YWwgb2Zmc2V0IG9mIHRoZSBzdWJjYW1lcmEuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmVydGljYWwgb2Zmc2V0IG9mIHRoZSBzdWJjYW1lcmEuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHN1YmNhbWVyYS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiBzdWJjYW1lcmEuXHJcblx0ICogQHNlZSB7QGxpbmsgUGVyc3BlY3RpdmVDYW1lcmEjc2V0Vmlld09mZnNldH1cclxuXHQgKi9cclxuXHRzZXRWaWV3T2Zmc2V0KCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHgsIHksIHdpZHRoLCBoZWlnaHQgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLnZpZXcgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnZpZXcgPSB7XHJcblx0XHRcdFx0ZW5hYmxlZDogdHJ1ZSxcclxuXHRcdFx0XHRmdWxsV2lkdGg6IDEsXHJcblx0XHRcdFx0ZnVsbEhlaWdodDogMSxcclxuXHRcdFx0XHRvZmZzZXRYOiAwLFxyXG5cdFx0XHRcdG9mZnNldFk6IDAsXHJcblx0XHRcdFx0d2lkdGg6IDEsXHJcblx0XHRcdFx0aGVpZ2h0OiAxXHJcblx0XHRcdH07XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMudmlldy5lbmFibGVkID0gdHJ1ZTtcclxuXHRcdHRoaXMudmlldy5mdWxsV2lkdGggPSBmdWxsV2lkdGg7XHJcblx0XHR0aGlzLnZpZXcuZnVsbEhlaWdodCA9IGZ1bGxIZWlnaHQ7XHJcblx0XHR0aGlzLnZpZXcub2Zmc2V0WCA9IHg7XHJcblx0XHR0aGlzLnZpZXcub2Zmc2V0WSA9IHk7XHJcblx0XHR0aGlzLnZpZXcud2lkdGggPSB3aWR0aDtcclxuXHRcdHRoaXMudmlldy5oZWlnaHQgPSBoZWlnaHQ7XHJcblxyXG5cdFx0dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVtb3ZlcyB0aGUgdmlldyBvZmZzZXQgZnJvbSB0aGUgcHJvamVjdGlvbiBtYXRyaXguXHJcblx0ICovXHJcblx0Y2xlYXJWaWV3T2Zmc2V0KCkge1xyXG5cclxuXHRcdGlmICggdGhpcy52aWV3ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy52aWV3LmVuYWJsZWQgPSBmYWxzZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgY2FtZXJhJ3MgcHJvamVjdGlvbiBtYXRyaXguIE11c3QgYmUgY2FsbGVkIGFmdGVyIGFueSBjaGFuZ2Ugb2ZcclxuXHQgKiBjYW1lcmEgcHJvcGVydGllcy5cclxuXHQgKi9cclxuXHR1cGRhdGVQcm9qZWN0aW9uTWF0cml4KCkge1xyXG5cclxuXHRcdGNvbnN0IGR4ID0gKCB0aGlzLnJpZ2h0IC0gdGhpcy5sZWZ0ICkgLyAoIDIgKiB0aGlzLnpvb20gKTtcclxuXHRcdGNvbnN0IGR5ID0gKCB0aGlzLnRvcCAtIHRoaXMuYm90dG9tICkgLyAoIDIgKiB0aGlzLnpvb20gKTtcclxuXHRcdGNvbnN0IGN4ID0gKCB0aGlzLnJpZ2h0ICsgdGhpcy5sZWZ0ICkgLyAyO1xyXG5cdFx0Y29uc3QgY3kgPSAoIHRoaXMudG9wICsgdGhpcy5ib3R0b20gKSAvIDI7XHJcblxyXG5cdFx0bGV0IGxlZnQgPSBjeCAtIGR4O1xyXG5cdFx0bGV0IHJpZ2h0ID0gY3ggKyBkeDtcclxuXHRcdGxldCB0b3AgPSBjeSArIGR5O1xyXG5cdFx0bGV0IGJvdHRvbSA9IGN5IC0gZHk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLnZpZXcgIT09IG51bGwgJiYgdGhpcy52aWV3LmVuYWJsZWQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBzY2FsZVcgPSAoIHRoaXMucmlnaHQgLSB0aGlzLmxlZnQgKSAvIHRoaXMudmlldy5mdWxsV2lkdGggLyB0aGlzLnpvb207XHJcblx0XHRcdGNvbnN0IHNjYWxlSCA9ICggdGhpcy50b3AgLSB0aGlzLmJvdHRvbSApIC8gdGhpcy52aWV3LmZ1bGxIZWlnaHQgLyB0aGlzLnpvb207XHJcblxyXG5cdFx0XHRsZWZ0ICs9IHNjYWxlVyAqIHRoaXMudmlldy5vZmZzZXRYO1xyXG5cdFx0XHRyaWdodCA9IGxlZnQgKyBzY2FsZVcgKiB0aGlzLnZpZXcud2lkdGg7XHJcblx0XHRcdHRvcCAtPSBzY2FsZUggKiB0aGlzLnZpZXcub2Zmc2V0WTtcclxuXHRcdFx0Ym90dG9tID0gdG9wIC0gc2NhbGVIICogdGhpcy52aWV3LmhlaWdodDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5wcm9qZWN0aW9uTWF0cml4Lm1ha2VPcnRob2dyYXBoaWMoIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSwgdGhpcy5uZWFyLCB0aGlzLmZhciwgdGhpcy5jb29yZGluYXRlU3lzdGVtICk7XHJcblxyXG5cdFx0dGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5jb3B5KCB0aGlzLnByb2plY3Rpb25NYXRyaXggKS5pbnZlcnQoKTtcclxuXHJcblx0fVxyXG5cclxuXHR0b0pTT04oIG1ldGEgKSB7XHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IHN1cGVyLnRvSlNPTiggbWV0YSApO1xyXG5cclxuXHRcdGRhdGEub2JqZWN0Lnpvb20gPSB0aGlzLnpvb207XHJcblx0XHRkYXRhLm9iamVjdC5sZWZ0ID0gdGhpcy5sZWZ0O1xyXG5cdFx0ZGF0YS5vYmplY3QucmlnaHQgPSB0aGlzLnJpZ2h0O1xyXG5cdFx0ZGF0YS5vYmplY3QudG9wID0gdGhpcy50b3A7XHJcblx0XHRkYXRhLm9iamVjdC5ib3R0b20gPSB0aGlzLmJvdHRvbTtcclxuXHRcdGRhdGEub2JqZWN0Lm5lYXIgPSB0aGlzLm5lYXI7XHJcblx0XHRkYXRhLm9iamVjdC5mYXIgPSB0aGlzLmZhcjtcclxuXHJcblx0XHRpZiAoIHRoaXMudmlldyAhPT0gbnVsbCApIGRhdGEub2JqZWN0LnZpZXcgPSBPYmplY3QuYXNzaWduKCB7fSwgdGhpcy52aWV3ICk7XHJcblxyXG5cdFx0cmV0dXJuIGRhdGE7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IE9ydGhvZ3JhcGhpY0NhbWVyYSB9O1xyXG4iLCJpbXBvcnQgeyBMaWdodFNoYWRvdyB9IGZyb20gJy4vTGlnaHRTaGFkb3cuanMnO1xyXG5pbXBvcnQgeyBPcnRob2dyYXBoaWNDYW1lcmEgfSBmcm9tICcuLi9jYW1lcmFzL09ydGhvZ3JhcGhpY0NhbWVyYS5qcyc7XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyB0aGUgc2hhZG93IGNvbmZpZ3VyYXRpb24gb2YgZGlyZWN0aW9uYWwgbGlnaHRzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTGlnaHRTaGFkb3dcclxuICovXHJcbmNsYXNzIERpcmVjdGlvbmFsTGlnaHRTaGFkb3cgZXh0ZW5kcyBMaWdodFNoYWRvdyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgZGlyZWN0aW9uYWwgbGlnaHQgc2hhZG93LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cclxuXHRcdHN1cGVyKCBuZXcgT3J0aG9ncmFwaGljQ2FtZXJhKCAtIDUsIDUsIDUsIC0gNSwgMC41LCA1MDAgKSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0RpcmVjdGlvbmFsTGlnaHRTaGFkb3cgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBEaXJlY3Rpb25hbExpZ2h0U2hhZG93IH07XHJcbiIsImltcG9ydCB7IExpZ2h0IH0gZnJvbSAnLi9MaWdodC5qcyc7XHJcbmltcG9ydCB7IERpcmVjdGlvbmFsTGlnaHRTaGFkb3cgfSBmcm9tICcuL0RpcmVjdGlvbmFsTGlnaHRTaGFkb3cuanMnO1xyXG5pbXBvcnQgeyBPYmplY3QzRCB9IGZyb20gJy4uL2NvcmUvT2JqZWN0M0QuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgbGlnaHQgdGhhdCBnZXRzIGVtaXR0ZWQgaW4gYSBzcGVjaWZpYyBkaXJlY3Rpb24uIFRoaXMgbGlnaHQgd2lsbCBiZWhhdmVcclxuICogYXMgdGhvdWdoIGl0IGlzIGluZmluaXRlbHkgZmFyIGF3YXkgYW5kIHRoZSByYXlzIHByb2R1Y2VkIGZyb20gaXQgYXJlIGFsbFxyXG4gKiBwYXJhbGxlbC4gVGhlIGNvbW1vbiB1c2UgY2FzZSBmb3IgdGhpcyBpcyB0byBzaW11bGF0ZSBkYXlsaWdodDsgdGhlIHN1biBpc1xyXG4gKiBmYXIgZW5vdWdoIGF3YXkgdGhhdCBpdHMgcG9zaXRpb24gY2FuIGJlIGNvbnNpZGVyZWQgdG8gYmUgaW5maW5pdGUsIGFuZFxyXG4gKiBhbGwgbGlnaHQgcmF5cyBjb21pbmcgZnJvbSBpdCBhcmUgcGFyYWxsZWwuXHJcbiAqXHJcbiAqIEEgY29tbW9uIHBvaW50IG9mIGNvbmZ1c2lvbiBmb3IgZGlyZWN0aW9uYWwgbGlnaHRzIGlzIHRoYXQgc2V0dGluZyB0aGVcclxuICogcm90YXRpb24gaGFzIG5vIGVmZmVjdC4gVGhpcyBpcyBiZWNhdXNlIHRocmVlLmpzJ3MgRGlyZWN0aW9uYWxMaWdodCBpcyB0aGVcclxuICogZXF1aXZhbGVudCB0byB3aGF0IGlzIG9mdGVuIGNhbGxlZCBhICdUYXJnZXQgRGlyZWN0IExpZ2h0JyBpbiBvdGhlclxyXG4gKiBhcHBsaWNhdGlvbnMuXHJcbiAqXHJcbiAqIFRoaXMgbWVhbnMgdGhhdCBpdHMgZGlyZWN0aW9uIGlzIGNhbGN1bGF0ZWQgYXMgcG9pbnRpbmcgZnJvbSB0aGUgbGlnaHQnc1xyXG4gKiB7QGxpbmsgT2JqZWN0M0QjcG9zaXRpb259IHRvIHRoZSB7QGxpbmsgRGlyZWN0aW9uYWxMaWdodCN0YXJnZXR9IHBvc2l0aW9uXHJcbiAqIChhcyBvcHBvc2VkIHRvIGEgJ0ZyZWUgRGlyZWN0IExpZ2h0JyB0aGF0IGp1c3QgaGFzIGEgcm90YXRpb25cclxuICogY29tcG9uZW50KS5cclxuICpcclxuICogVGhpcyBsaWdodCBjYW4gY2FzdCBzaGFkb3dzIC0gc2VlIHRoZSB7QGxpbmsgRGlyZWN0aW9uYWxMaWdodFNoYWRvd30gZm9yIGRldGFpbHMuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIC8vIFdoaXRlIGRpcmVjdGlvbmFsIGxpZ2h0IGF0IGhhbGYgaW50ZW5zaXR5IHNoaW5pbmcgZnJvbSB0aGUgdG9wLlxyXG4gKiBjb25zdCBkaXJlY3Rpb25hbExpZ2h0ID0gbmV3IFRIUkVFLkRpcmVjdGlvbmFsTGlnaHQoIDB4ZmZmZmZmLCAwLjUgKTtcclxuICogc2NlbmUuYWRkKCBkaXJlY3Rpb25hbExpZ2h0ICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTGlnaHRcclxuICovXHJcbmNsYXNzIERpcmVjdGlvbmFsTGlnaHQgZXh0ZW5kcyBMaWdodCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgZGlyZWN0aW9uYWwgbGlnaHQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geyhudW1iZXJ8Q29sb3J8c3RyaW5nKX0gW2NvbG9yPTB4ZmZmZmZmXSAtIFRoZSBsaWdodCdzIGNvbG9yLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbaW50ZW5zaXR5PTFdIC0gVGhlIGxpZ2h0J3Mgc3RyZW5ndGgvaW50ZW5zaXR5LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBjb2xvciwgaW50ZW5zaXR5ICkge1xyXG5cclxuXHRcdHN1cGVyKCBjb2xvciwgaW50ZW5zaXR5ICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzRGlyZWN0aW9uYWxMaWdodCA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ0RpcmVjdGlvbmFsTGlnaHQnO1xyXG5cclxuXHRcdHRoaXMucG9zaXRpb24uY29weSggT2JqZWN0M0QuREVGQVVMVF9VUCApO1xyXG5cdFx0dGhpcy51cGRhdGVNYXRyaXgoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBkaXJlY3Rpb25hbCBsaWdodCBwb2ludHMgZnJvbSBpdHMgcG9zaXRpb24gdG8gdGhlXHJcblx0XHQgKiB0YXJnZXQncyBwb3NpdGlvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBGb3IgdGhlIHRhcmdldCdzIHBvc2l0aW9uIHRvIGJlIGNoYW5nZWQgdG8gYW55dGhpbmcgb3RoZXJcclxuXHRcdCAqIHRoYW4gdGhlIGRlZmF1bHQsIGl0IG11c3QgYmUgYWRkZWQgdG8gdGhlIHNjZW5lLlxyXG5cdFx0ICpcclxuXHRcdCAqIEl0IGlzIGFsc28gcG9zc2libGUgdG8gc2V0IHRoZSB0YXJnZXQgdG8gYmUgYW5vdGhlciAzRCBvYmplY3RcclxuXHRcdCAqIGluIHRoZSBzY2VuZS4gVGhlIGxpZ2h0IHdpbGwgbm93IHRyYWNrIHRoZSB0YXJnZXQgb2JqZWN0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3QzRH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50YXJnZXQgPSBuZXcgT2JqZWN0M0QoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgcHJvcGVydHkgaG9sZHMgdGhlIGxpZ2h0J3Mgc2hhZG93IGNvbmZpZ3VyYXRpb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0RpcmVjdGlvbmFsTGlnaHRTaGFkb3d9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2hhZG93ID0gbmV3IERpcmVjdGlvbmFsTGlnaHRTaGFkb3coKTtcclxuXHJcblx0fVxyXG5cclxuXHRkaXNwb3NlKCkge1xyXG5cclxuXHRcdHRoaXMuc2hhZG93LmRpc3Bvc2UoKTtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy50YXJnZXQgPSBzb3VyY2UudGFyZ2V0LmNsb25lKCk7XHJcblx0XHR0aGlzLnNoYWRvdyA9IHNvdXJjZS5zaGFkb3cuY2xvbmUoKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgRGlyZWN0aW9uYWxMaWdodCB9O1xyXG4iLCJpbXBvcnQgeyBMaWdodCB9IGZyb20gJy4vTGlnaHQuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgbGlnaHQgZ2xvYmFsbHkgaWxsdW1pbmF0ZXMgYWxsIG9iamVjdHMgaW4gdGhlIHNjZW5lIGVxdWFsbHkuXHJcbiAqXHJcbiAqIEl0IGNhbm5vdCBiZSB1c2VkIHRvIGNhc3Qgc2hhZG93cyBhcyBpdCBkb2VzIG5vdCBoYXZlIGEgZGlyZWN0aW9uLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBsaWdodCA9IG5ldyBUSFJFRS5BbWJpZW50TGlnaHQoIDB4NDA0MDQwICk7IC8vIHNvZnQgd2hpdGUgbGlnaHRcclxuICogc2NlbmUuYWRkKCBsaWdodCApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIExpZ2h0XHJcbiAqL1xyXG5jbGFzcyBBbWJpZW50TGlnaHQgZXh0ZW5kcyBMaWdodCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYW1iaWVudCBsaWdodC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7KG51bWJlcnxDb2xvcnxzdHJpbmcpfSBbY29sb3I9MHhmZmZmZmZdIC0gVGhlIGxpZ2h0J3MgY29sb3IuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtpbnRlbnNpdHk9MV0gLSBUaGUgbGlnaHQncyBzdHJlbmd0aC9pbnRlbnNpdHkuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGNvbG9yLCBpbnRlbnNpdHkgKSB7XHJcblxyXG5cdFx0c3VwZXIoIGNvbG9yLCBpbnRlbnNpdHkgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNBbWJpZW50TGlnaHQgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdBbWJpZW50TGlnaHQnO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBBbWJpZW50TGlnaHQgfTtcclxuIiwiaW1wb3J0IHsgTGlnaHQgfSBmcm9tICcuL0xpZ2h0LmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGNsYXNzIGVtaXRzIGxpZ2h0IHVuaWZvcm1seSBhY3Jvc3MgdGhlIGZhY2UgYSByZWN0YW5ndWxhciBwbGFuZS5cclxuICogVGhpcyBsaWdodCB0eXBlIGNhbiBiZSB1c2VkIHRvIHNpbXVsYXRlIGxpZ2h0IHNvdXJjZXMgc3VjaCBhcyBicmlnaHRcclxuICogd2luZG93cyBvciBzdHJpcCBsaWdodGluZy5cclxuICpcclxuICogSW1wb3J0YW50IE5vdGVzOlxyXG4gKlxyXG4gKiAtIFRoZXJlIGlzIG5vIHNoYWRvdyBzdXBwb3J0LlxyXG4gKiAtIE9ubHkgUEJSIG1hdGVyaWFscyBhcmUgc3VwcG9ydGVkLlxyXG4gKiAtIFlvdSBoYXZlIHRvIGluY2x1ZGUgYFJlY3RBcmVhTGlnaHRVbmlmb3Jtc0xpYmAgKGBXZWJHTFJlbmRlcmVyYCkgb3IgYFJlY3RBcmVhTGlnaHRUZXh0dXJlc0xpYmAgKGBXZWJHUFVSZW5kZXJlcmApXHJcbiAqIGludG8geW91ciBhcHAgYW5kIGluaXQgdGhlIHVuaWZvcm1zL3RleHR1cmVzLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBSZWN0QXJlYUxpZ2h0VW5pZm9ybXNMaWIuaW5pdCgpOyAvLyBvbmx5IHJlbGV2YW50IGZvciBXZWJHTFJlbmRlcmVyXHJcbiAqIFRIUkVFLlJlY3RBcmVhTGlnaHROb2RlLnNldExUQyggUmVjdEFyZWFMaWdodFRleHR1cmVzTGliLmluaXQoKSApOyAvLyAgb25seSByZWxldmFudCBmb3IgV2ViR1BVUmVuZGVyZXJcclxuICpcclxuICogY29uc3QgaW50ZW5zaXR5ID0gMTsgY29uc3Qgd2lkdGggPSAxMDsgY29uc3QgaGVpZ2h0ID0gMTA7XHJcbiAqIGNvbnN0IHJlY3RMaWdodCA9IG5ldyBUSFJFRS5SZWN0QXJlYUxpZ2h0KCAweGZmZmZmZiwgaW50ZW5zaXR5LCB3aWR0aCwgaGVpZ2h0ICk7XHJcbiAqIHJlY3RMaWdodC5wb3NpdGlvbi5zZXQoIDUsIDUsIDAgKTtcclxuICogcmVjdExpZ2h0Lmxvb2tBdCggMCwgMCwgMCApO1xyXG4gKiBzY2VuZS5hZGQoIHJlY3RMaWdodCApXHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTGlnaHRcclxuICovXHJcbmNsYXNzIFJlY3RBcmVhTGlnaHQgZXh0ZW5kcyBMaWdodCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYXJlYSBsaWdodC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7KG51bWJlcnxDb2xvcnxzdHJpbmcpfSBbY29sb3I9MHhmZmZmZmZdIC0gVGhlIGxpZ2h0J3MgY29sb3IuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtpbnRlbnNpdHk9MV0gLSBUaGUgbGlnaHQncyBzdHJlbmd0aC9pbnRlbnNpdHkuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt3aWR0aD0xMF0gLSBUaGUgd2lkdGggb2YgdGhlIGxpZ2h0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbaGVpZ2h0PTEwXSAtIFRoZSBoZWlnaHQgb2YgdGhlIGxpZ2h0LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBjb2xvciwgaW50ZW5zaXR5LCB3aWR0aCA9IDEwLCBoZWlnaHQgPSAxMCApIHtcclxuXHJcblx0XHRzdXBlciggY29sb3IsIGludGVuc2l0eSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1JlY3RBcmVhTGlnaHQgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdSZWN0QXJlYUxpZ2h0JztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB3aWR0aCBvZiB0aGUgbGlnaHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDEwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMud2lkdGggPSB3aWR0aDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBoZWlnaHQgb2YgdGhlIGxpZ2h0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmhlaWdodCA9IGhlaWdodDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgbGlnaHQncyBwb3dlci4gUG93ZXIgaXMgdGhlIGx1bWlub3VzIHBvd2VyIG9mIHRoZSBsaWdodCBtZWFzdXJlZCBpbiBsdW1lbnMgKGxtKS5cclxuXHQgKiBDaGFuZ2luZyB0aGUgcG93ZXIgd2lsbCBhbHNvIGNoYW5nZSB0aGUgbGlnaHQncyBpbnRlbnNpdHkuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdCAqL1xyXG5cdGdldCBwb3dlcigpIHtcclxuXHJcblx0XHQvLyBjb21wdXRlIHRoZSBsaWdodCdzIGx1bWlub3VzIHBvd2VyIChpbiBsdW1lbnMpIGZyb20gaXRzIGludGVuc2l0eSAoaW4gbml0cylcclxuXHRcdHJldHVybiB0aGlzLmludGVuc2l0eSAqIHRoaXMud2lkdGggKiB0aGlzLmhlaWdodCAqIE1hdGguUEk7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0IHBvd2VyKCBwb3dlciApIHtcclxuXHJcblx0XHQvLyBzZXQgdGhlIGxpZ2h0J3MgaW50ZW5zaXR5IChpbiBuaXRzKSBmcm9tIHRoZSBkZXNpcmVkIGx1bWlub3VzIHBvd2VyIChpbiBsdW1lbnMpXHJcblx0XHR0aGlzLmludGVuc2l0eSA9IHBvd2VyIC8gKCB0aGlzLndpZHRoICogdGhpcy5oZWlnaHQgKiBNYXRoLlBJICk7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMud2lkdGggPSBzb3VyY2Uud2lkdGg7XHJcblx0XHR0aGlzLmhlaWdodCA9IHNvdXJjZS5oZWlnaHQ7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0dG9KU09OKCBtZXRhICkge1xyXG5cclxuXHRcdGNvbnN0IGRhdGEgPSBzdXBlci50b0pTT04oIG1ldGEgKTtcclxuXHJcblx0XHRkYXRhLm9iamVjdC53aWR0aCA9IHRoaXMud2lkdGg7XHJcblx0XHRkYXRhLm9iamVjdC5oZWlnaHQgPSB0aGlzLmhlaWdodDtcclxuXHJcblx0XHRyZXR1cm4gZGF0YTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgUmVjdEFyZWFMaWdodCB9O1xyXG4iLCJpbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi9WZWN0b3IzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIGEgdGhpcmQtb3JkZXIgc3BoZXJpY2FsIGhhcm1vbmljcyAoU0gpLiBMaWdodCBwcm9iZXMgdXNlIHRoaXMgY2xhc3NcclxuICogdG8gZW5jb2RlIGxpZ2h0aW5nIGluZm9ybWF0aW9uLlxyXG4gKlxyXG4gKiAtIFByaW1hcnkgcmVmZXJlbmNlOiB7QGxpbmsgaHR0cHM6Ly9ncmFwaGljcy5zdGFuZm9yZC5lZHUvcGFwZXJzL2Vudm1hcC9lbnZtYXAucGRmfVxyXG4gKiAtIFNlY29uZGFyeSByZWZlcmVuY2U6IHtAbGluayBodHRwczovL3d3dy5wcHNsb2FuLm9yZy9wdWJsaWNhdGlvbnMvU3R1cGlkU0gzNi5wZGZ9XHJcbiAqL1xyXG5jbGFzcyBTcGhlcmljYWxIYXJtb25pY3MzIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBzcGhlcmljYWwgaGFybW9uaWNzLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1NwaGVyaWNhbEhhcm1vbmljczMgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQW4gYXJyYXkgaG9sZGluZyB0aGUgKDkpIFNIIGNvZWZmaWNpZW50cy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8VmVjdG9yMz59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29lZmZpY2llbnRzID0gW107XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgOTsgaSArKyApIHtcclxuXHJcblx0XHRcdHRoaXMuY29lZmZpY2llbnRzLnB1c2goIG5ldyBWZWN0b3IzKCkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZ2l2ZW4gU0ggY29lZmZpY2llbnRzIHRvIHRoaXMgaW5zdGFuY2UgYnkgY29weWluZ1xyXG5cdCAqIHRoZSB2YWx1ZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PFZlY3RvcjM+fSBjb2VmZmljaWVudHMgLSBUaGUgU0ggY29lZmZpY2llbnRzLlxyXG5cdCAqIEByZXR1cm4ge1NwaGVyaWNhbEhhcm1vbmljczN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgc3BoZXJpY2FsIGhhcm1vbmljcy5cclxuXHQgKi9cclxuXHRzZXQoIGNvZWZmaWNpZW50cyApIHtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCA5OyBpICsrICkge1xyXG5cclxuXHRcdFx0dGhpcy5jb2VmZmljaWVudHNbIGkgXS5jb3B5KCBjb2VmZmljaWVudHNbIGkgXSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIGFsbCBTSCBjb2VmZmljaWVudHMgdG8gYDBgLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7U3BoZXJpY2FsSGFybW9uaWNzM30gQSByZWZlcmVuY2UgdG8gdGhpcyBzcGhlcmljYWwgaGFybW9uaWNzLlxyXG5cdCAqL1xyXG5cdHplcm8oKSB7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgOTsgaSArKyApIHtcclxuXHJcblx0XHRcdHRoaXMuY29lZmZpY2llbnRzWyBpIF0uc2V0KCAwLCAwLCAwICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHJhZGlhbmNlIGluIHRoZSBkaXJlY3Rpb24gb2YgdGhlIGdpdmVuIG5vcm1hbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gbm9ybWFsIC0gVGhlIG5vcm1hbCB2ZWN0b3IgKGFzc3VtZWQgdG8gYmUgdW5pdCBsZW5ndGgpXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IHZlY3RvciB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGhvZCdzIHJlc3VsdC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBUaGUgcmFkaWFuY2UuXHJcblx0ICovXHJcblx0Z2V0QXQoIG5vcm1hbCwgdGFyZ2V0ICkge1xyXG5cclxuXHRcdC8vIG5vcm1hbCBpcyBhc3N1bWVkIHRvIGJlIHVuaXQgbGVuZ3RoXHJcblxyXG5cdFx0Y29uc3QgeCA9IG5vcm1hbC54LCB5ID0gbm9ybWFsLnksIHogPSBub3JtYWwuejtcclxuXHJcblx0XHRjb25zdCBjb2VmZiA9IHRoaXMuY29lZmZpY2llbnRzO1xyXG5cclxuXHRcdC8vIGJhbmQgMFxyXG5cdFx0dGFyZ2V0LmNvcHkoIGNvZWZmWyAwIF0gKS5tdWx0aXBseVNjYWxhciggMC4yODIwOTUgKTtcclxuXHJcblx0XHQvLyBiYW5kIDFcclxuXHRcdHRhcmdldC5hZGRTY2FsZWRWZWN0b3IoIGNvZWZmWyAxIF0sIDAuNDg4NjAzICogeSApO1xyXG5cdFx0dGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggY29lZmZbIDIgXSwgMC40ODg2MDMgKiB6ICk7XHJcblx0XHR0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKCBjb2VmZlsgMyBdLCAwLjQ4ODYwMyAqIHggKTtcclxuXHJcblx0XHQvLyBiYW5kIDJcclxuXHRcdHRhcmdldC5hZGRTY2FsZWRWZWN0b3IoIGNvZWZmWyA0IF0sIDEuMDkyNTQ4ICogKCB4ICogeSApICk7XHJcblx0XHR0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKCBjb2VmZlsgNSBdLCAxLjA5MjU0OCAqICggeSAqIHogKSApO1xyXG5cdFx0dGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggY29lZmZbIDYgXSwgMC4zMTUzOTIgKiAoIDMuMCAqIHogKiB6IC0gMS4wICkgKTtcclxuXHRcdHRhcmdldC5hZGRTY2FsZWRWZWN0b3IoIGNvZWZmWyA3IF0sIDEuMDkyNTQ4ICogKCB4ICogeiApICk7XHJcblx0XHR0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKCBjb2VmZlsgOCBdLCAwLjU0NjI3NCAqICggeCAqIHggLSB5ICogeSApICk7XHJcblxyXG5cdFx0cmV0dXJuIHRhcmdldDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBpcnJhZGlhbmNlIChyYWRpYW5jZSBjb252b2x2ZWQgd2l0aCBjb3NpbmUgbG9iZSkgaW4gdGhlXHJcblx0ICogZGlyZWN0aW9uIG9mIHRoZSBnaXZlbiBub3JtYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IG5vcm1hbCAtIFRoZSBub3JtYWwgdmVjdG9yIChhc3N1bWVkIHRvIGJlIHVuaXQgbGVuZ3RoKVxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdGFyZ2V0IC0gVGhlIHRhcmdldCB2ZWN0b3IgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBtZXRob2QncyByZXN1bHQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gVGhlIGlycmFkaWFuY2UuXHJcblx0ICovXHJcblx0Z2V0SXJyYWRpYW5jZUF0KCBub3JtYWwsIHRhcmdldCApIHtcclxuXHJcblx0XHQvLyBub3JtYWwgaXMgYXNzdW1lZCB0byBiZSB1bml0IGxlbmd0aFxyXG5cclxuXHRcdGNvbnN0IHggPSBub3JtYWwueCwgeSA9IG5vcm1hbC55LCB6ID0gbm9ybWFsLno7XHJcblxyXG5cdFx0Y29uc3QgY29lZmYgPSB0aGlzLmNvZWZmaWNpZW50cztcclxuXHJcblx0XHQvLyBiYW5kIDBcclxuXHRcdHRhcmdldC5jb3B5KCBjb2VmZlsgMCBdICkubXVsdGlwbHlTY2FsYXIoIDAuODg2MjI3ICk7IC8vIM+AICogMC4yODIwOTVcclxuXHJcblx0XHQvLyBiYW5kIDFcclxuXHRcdHRhcmdldC5hZGRTY2FsZWRWZWN0b3IoIGNvZWZmWyAxIF0sIDIuMCAqIDAuNTExNjY0ICogeSApOyAvLyAoIDIgKiDPgCAvIDMgKSAqIDAuNDg4NjAzXHJcblx0XHR0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKCBjb2VmZlsgMiBdLCAyLjAgKiAwLjUxMTY2NCAqIHogKTtcclxuXHRcdHRhcmdldC5hZGRTY2FsZWRWZWN0b3IoIGNvZWZmWyAzIF0sIDIuMCAqIDAuNTExNjY0ICogeCApO1xyXG5cclxuXHRcdC8vIGJhbmQgMlxyXG5cdFx0dGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggY29lZmZbIDQgXSwgMi4wICogMC40MjkwNDMgKiB4ICogeSApOyAvLyAoIM+AIC8gNCApICogMS4wOTI1NDhcclxuXHRcdHRhcmdldC5hZGRTY2FsZWRWZWN0b3IoIGNvZWZmWyA1IF0sIDIuMCAqIDAuNDI5MDQzICogeSAqIHogKTtcclxuXHRcdHRhcmdldC5hZGRTY2FsZWRWZWN0b3IoIGNvZWZmWyA2IF0sIDAuNzQzMTI1ICogeiAqIHogLSAwLjI0NzcwOCApOyAvLyAoIM+AIC8gNCApICogMC4zMTUzOTIgKiAzXHJcblx0XHR0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKCBjb2VmZlsgNyBdLCAyLjAgKiAwLjQyOTA0MyAqIHggKiB6ICk7XHJcblx0XHR0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKCBjb2VmZlsgOCBdLCAwLjQyOTA0MyAqICggeCAqIHggLSB5ICogeSApICk7IC8vICggz4AgLyA0ICkgKiAwLjU0NjI3NFxyXG5cclxuXHRcdHJldHVybiB0YXJnZXQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyB0aGUgZ2l2ZW4gU0ggdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7U3BoZXJpY2FsSGFybW9uaWNzM30gc2ggLSBUaGUgU0ggdG8gYWRkLlxyXG5cdCAqIEByZXR1cm4ge1NwaGVyaWNhbEhhcm1vbmljczN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgc3BoZXJpY2FsIGhhcm1vbmljcy5cclxuXHQgKi9cclxuXHRhZGQoIHNoICkge1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDk7IGkgKysgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmNvZWZmaWNpZW50c1sgaSBdLmFkZCggc2guY29lZmZpY2llbnRzWyBpIF0gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQSBjb252ZW5pZW5jZSBtZXRob2QgZm9yIHBlcmZvcm1pbmcge0BsaW5rIFNwaGVyaWNhbEhhcm1vbmljczMjYWRkfSBhbmRcclxuXHQgKiB7QGxpbmsgU3BoZXJpY2FsSGFybW9uaWNzMyNzY2FsZX0gYXQgb25jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7U3BoZXJpY2FsSGFybW9uaWNzM30gc2ggLSBUaGUgU0ggdG8gYWRkLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzIC0gVGhlIHNjYWxlIGZhY3Rvci5cclxuXHQgKiBAcmV0dXJuIHtTcGhlcmljYWxIYXJtb25pY3MzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHNwaGVyaWNhbCBoYXJtb25pY3MuXHJcblx0ICovXHJcblx0YWRkU2NhbGVkU0goIHNoLCBzICkge1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDk7IGkgKysgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmNvZWZmaWNpZW50c1sgaSBdLmFkZFNjYWxlZFZlY3Rvciggc2guY29lZmZpY2llbnRzWyBpIF0sIHMgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2NhbGVzIHRoaXMgU0ggYnkgdGhlIGdpdmVuIHNjYWxlIGZhY3Rvci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzIC0gVGhlIHNjYWxlIGZhY3Rvci5cclxuXHQgKiBAcmV0dXJuIHtTcGhlcmljYWxIYXJtb25pY3MzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHNwaGVyaWNhbCBoYXJtb25pY3MuXHJcblx0ICovXHJcblx0c2NhbGUoIHMgKSB7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgOTsgaSArKyApIHtcclxuXHJcblx0XHRcdHRoaXMuY29lZmZpY2llbnRzWyBpIF0ubXVsdGlwbHlTY2FsYXIoIHMgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTGluZWFyIGludGVycG9sYXRlcyBiZXR3ZWVuIHRoZSBnaXZlbiBTSCBhbmQgdGhpcyBpbnN0YW5jZSBieSB0aGUgZ2l2ZW5cclxuXHQgKiBhbHBoYSBmYWN0b3IuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1NwaGVyaWNhbEhhcm1vbmljczN9IHNoIC0gVGhlIFNIIHRvIGludGVycG9sYXRlIHdpdGguXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFscGhhIC0gVGhlIGFscGhhIGZhY3Rvci5cclxuXHQgKiBAcmV0dXJuIHtTcGhlcmljYWxIYXJtb25pY3MzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHNwaGVyaWNhbCBoYXJtb25pY3MuXHJcblx0ICovXHJcblx0bGVycCggc2gsIGFscGhhICkge1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDk7IGkgKysgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmNvZWZmaWNpZW50c1sgaSBdLmxlcnAoIHNoLmNvZWZmaWNpZW50c1sgaSBdLCBhbHBoYSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIHNwaGVyaWNhbCBoYXJtb25pY3MgaXMgZXF1YWwgd2l0aCB0aGUgZ2l2ZW4gb25lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTcGhlcmljYWxIYXJtb25pY3MzfSBzaCAtIFRoZSBzcGhlcmljYWwgaGFybW9uaWNzIHRvIHRlc3QgZm9yIGVxdWFsaXR5LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyBzcGhlcmljYWwgaGFybW9uaWNzIGlzIGVxdWFsIHdpdGggdGhlIGdpdmVuIG9uZS5cclxuXHQgKi9cclxuXHRlcXVhbHMoIHNoICkge1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDk7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRpZiAoICEgdGhpcy5jb2VmZmljaWVudHNbIGkgXS5lcXVhbHMoIHNoLmNvZWZmaWNpZW50c1sgaSBdICkgKSB7XHJcblxyXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29waWVzIHRoZSB2YWx1ZXMgb2YgdGhlIGdpdmVuIHNwaGVyaWNhbCBoYXJtb25pY3MgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7U3BoZXJpY2FsSGFybW9uaWNzM30gc2ggLSBUaGUgc3BoZXJpY2FsIGhhcm1vbmljcyB0byBjb3B5LlxyXG5cdCAqIEByZXR1cm4ge1NwaGVyaWNhbEhhcm1vbmljczN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgc3BoZXJpY2FsIGhhcm1vbmljcy5cclxuXHQgKi9cclxuXHRjb3B5KCBzaCApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5zZXQoIHNoLmNvZWZmaWNpZW50cyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBuZXcgc3BoZXJpY2FsIGhhcm1vbmljcyB3aXRoIGNvcGllZCB2YWx1ZXMgZnJvbSB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7U3BoZXJpY2FsSGFybW9uaWNzM30gQSBjbG9uZSBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNsb25lKCkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBTSCBjb2VmZmljaWVudHMgb2YgdGhpcyBpbnN0YW5jZSBmcm9tIHRoZSBnaXZlbiBhcnJheS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gYXJyYXkgLSBBbiBhcnJheSBob2xkaW5nIHRoZSBTSCBjb2VmZmljaWVudHMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXQ9MF0gLSBUaGUgYXJyYXkgb2Zmc2V0IHdoZXJlIHRvIHN0YXJ0IGNvcHlpbmcuXHJcblx0ICogQHJldHVybiB7U3BoZXJpY2FsSGFybW9uaWNzM30gQSBjbG9uZSBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGZyb21BcnJheSggYXJyYXksIG9mZnNldCA9IDAgKSB7XHJcblxyXG5cdFx0Y29uc3QgY29lZmZpY2llbnRzID0gdGhpcy5jb2VmZmljaWVudHM7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgOTsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvZWZmaWNpZW50c1sgaSBdLmZyb21BcnJheSggYXJyYXksIG9mZnNldCArICggaSAqIDMgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGFuIGFycmF5IHdpdGggdGhlIFNIIGNvZWZmaWNpZW50cywgb3IgY29waWVzIHRoZW0gaW50byB0aGUgcHJvdmlkZWRcclxuXHQgKiBhcnJheS4gVGhlIGNvZWZmaWNpZW50cyBhcmUgcmVwcmVzZW50ZWQgYXMgbnVtYmVycy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gW2FycmF5PVtdXSAtIFRoZSB0YXJnZXQgYXJyYXkuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXQ9MF0gLSBUaGUgYXJyYXkgb2Zmc2V0IHdoZXJlIHRvIHN0YXJ0IGNvcHlpbmcuXHJcblx0ICogQHJldHVybiB7QXJyYXk8bnVtYmVyPn0gQW4gYXJyYXkgd2l0aCBmbGF0IFNIIGNvZWZmaWNpZW50cy5cclxuXHQgKi9cclxuXHR0b0FycmF5KCBhcnJheSA9IFtdLCBvZmZzZXQgPSAwICkge1xyXG5cclxuXHRcdGNvbnN0IGNvZWZmaWNpZW50cyA9IHRoaXMuY29lZmZpY2llbnRzO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDk7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb2VmZmljaWVudHNbIGkgXS50b0FycmF5KCBhcnJheSwgb2Zmc2V0ICsgKCBpICogMyApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBhcnJheTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB0aGUgU0ggYmFzaXMgZm9yIHRoZSBnaXZlbiBub3JtYWwgdmVjdG9yLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBub3JtYWwgLSBUaGUgbm9ybWFsLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gc2hCYXNpcyAtIFRoZSB0YXJnZXQgYXJyYXkgaG9sZGluZyB0aGUgU0ggYmFzaXMuXHJcblx0ICovXHJcblx0c3RhdGljIGdldEJhc2lzQXQoIG5vcm1hbCwgc2hCYXNpcyApIHtcclxuXHJcblx0XHQvLyBub3JtYWwgaXMgYXNzdW1lZCB0byBiZSB1bml0IGxlbmd0aFxyXG5cclxuXHRcdGNvbnN0IHggPSBub3JtYWwueCwgeSA9IG5vcm1hbC55LCB6ID0gbm9ybWFsLno7XHJcblxyXG5cdFx0Ly8gYmFuZCAwXHJcblx0XHRzaEJhc2lzWyAwIF0gPSAwLjI4MjA5NTtcclxuXHJcblx0XHQvLyBiYW5kIDFcclxuXHRcdHNoQmFzaXNbIDEgXSA9IDAuNDg4NjAzICogeTtcclxuXHRcdHNoQmFzaXNbIDIgXSA9IDAuNDg4NjAzICogejtcclxuXHRcdHNoQmFzaXNbIDMgXSA9IDAuNDg4NjAzICogeDtcclxuXHJcblx0XHQvLyBiYW5kIDJcclxuXHRcdHNoQmFzaXNbIDQgXSA9IDEuMDkyNTQ4ICogeCAqIHk7XHJcblx0XHRzaEJhc2lzWyA1IF0gPSAxLjA5MjU0OCAqIHkgKiB6O1xyXG5cdFx0c2hCYXNpc1sgNiBdID0gMC4zMTUzOTIgKiAoIDMgKiB6ICogeiAtIDEgKTtcclxuXHRcdHNoQmFzaXNbIDcgXSA9IDEuMDkyNTQ4ICogeCAqIHo7XHJcblx0XHRzaEJhc2lzWyA4IF0gPSAwLjU0NjI3NCAqICggeCAqIHggLSB5ICogeSApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBTcGhlcmljYWxIYXJtb25pY3MzIH07XHJcbiIsImltcG9ydCB7IFNwaGVyaWNhbEhhcm1vbmljczMgfSBmcm9tICcuLi9tYXRoL1NwaGVyaWNhbEhhcm1vbmljczMuanMnO1xyXG5pbXBvcnQgeyBMaWdodCB9IGZyb20gJy4vTGlnaHQuanMnO1xyXG5cclxuLyoqXHJcbiAqIExpZ2h0IHByb2JlcyBhcmUgYW4gYWx0ZXJuYXRpdmUgd2F5IG9mIGFkZGluZyBsaWdodCB0byBhIDNEIHNjZW5lLiBVbmxpa2VcclxuICogY2xhc3NpY2FsIGxpZ2h0IHNvdXJjZXMgKGUuZy4gZGlyZWN0aW9uYWwsIHBvaW50IG9yIHNwb3QgbGlnaHRzKSwgbGlnaHRcclxuICogcHJvYmVzIGRvIG5vdCBlbWl0IGxpZ2h0LiBJbnN0ZWFkIHRoZXkgc3RvcmUgaW5mb3JtYXRpb24gYWJvdXQgbGlnaHRcclxuICogcGFzc2luZyB0aHJvdWdoIDNEIHNwYWNlLiBEdXJpbmcgcmVuZGVyaW5nLCB0aGUgbGlnaHQgdGhhdCBoaXRzIGEgM0RcclxuICogb2JqZWN0IGlzIGFwcHJveGltYXRlZCBieSB1c2luZyB0aGUgZGF0YSBmcm9tIHRoZSBsaWdodCBwcm9iZS5cclxuICpcclxuICogTGlnaHQgcHJvYmVzIGFyZSB1c3VhbGx5IGNyZWF0ZWQgZnJvbSAocmFkaWFuY2UpIGVudmlyb25tZW50IG1hcHMuIFRoZVxyXG4gKiBjbGFzcyB7QGxpbmsgTGlnaHRQcm9iZUdlbmVyYXRvcn0gY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGxpZ2h0IHByb2JlcyBmcm9tXHJcbiAqIGN1YmUgdGV4dHVyZXMgb3IgcmVuZGVyIHRhcmdldHMuIEhvd2V2ZXIsIGxpZ2h0IGVzdGltYXRpb24gZGF0YSBjb3VsZCBhbHNvXHJcbiAqIGJlIHByb3ZpZGVkIGluIG90aGVyIGZvcm1zIGUuZy4gYnkgV2ViWFIuIFRoaXMgZW5hYmxlcyB0aGUgcmVuZGVyaW5nIG9mXHJcbiAqIGF1Z21lbnRlZCByZWFsaXR5IGNvbnRlbnQgdGhhdCByZWFjdHMgdG8gcmVhbCB3b3JsZCBsaWdodGluZy5cclxuICpcclxuICogVGhlIGN1cnJlbnQgcHJvYmUgaW1wbGVtZW50YXRpb24gaW4gdGhyZWUuanMgc3VwcG9ydHMgc28tY2FsbGVkIGRpZmZ1c2VcclxuICogbGlnaHQgcHJvYmVzLiBUaGlzIHR5cGUgb2YgbGlnaHQgcHJvYmUgaXMgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gYW5cclxuICogaXJyYWRpYW5jZSBlbnZpcm9ubWVudCBtYXAuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBMaWdodFxyXG4gKi9cclxuY2xhc3MgTGlnaHRQcm9iZSBleHRlbmRzIExpZ2h0IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBsaWdodCBwcm9iZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7U3BoZXJpY2FsSGFybW9uaWNzM30gc2ggLSBUaGUgc3BoZXJpY2FsIGhhcm1vbmljcyB3aGljaCByZXByZXNlbnRzIGVuY29kZWQgbGlnaHRpbmcgaW5mb3JtYXRpb24uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtpbnRlbnNpdHk9MV0gLSBUaGUgbGlnaHQncyBzdHJlbmd0aC9pbnRlbnNpdHkuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHNoID0gbmV3IFNwaGVyaWNhbEhhcm1vbmljczMoKSwgaW50ZW5zaXR5ID0gMSApIHtcclxuXHJcblx0XHRzdXBlciggdW5kZWZpbmVkLCBpbnRlbnNpdHkgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNMaWdodFByb2JlID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgbGlnaHQgcHJvYmUgdXNlcyBzcGhlcmljYWwgaGFybW9uaWNzIHRvIGVuY29kZSBsaWdodGluZyBpbmZvcm1hdGlvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7U3BoZXJpY2FsSGFybW9uaWNzM31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zaCA9IHNoO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLnNoLmNvcHkoIHNvdXJjZS5zaCApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlc2VyaWFsaXplcyB0aGUgbGlnaHQgcHJvdmUgZnJvbSB0aGUgZ2l2ZW4gSlNPTi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBqc29uIC0gVGhlIEpTT04gaG9sZGluZyB0aGUgc2VyaWFsaXplZCBsaWdodCBwcm9iZS5cclxuXHQgKiBAcmV0dXJuIHtMaWdodFByb2JlfSBBIHJlZmVyZW5jZSB0byB0aGlzIGxpZ2h0IHByb2JlLlxyXG5cdCAqL1xyXG5cdGZyb21KU09OKCBqc29uICkge1xyXG5cclxuXHRcdHRoaXMuaW50ZW5zaXR5ID0ganNvbi5pbnRlbnNpdHk7IC8vIFRPRE86IE1vdmUgdGhpcyBiaXQgdG8gTGlnaHQuZnJvbUpTT04oKTtcclxuXHRcdHRoaXMuc2guZnJvbUFycmF5KCBqc29uLnNoICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0dG9KU09OKCBtZXRhICkge1xyXG5cclxuXHRcdGNvbnN0IGRhdGEgPSBzdXBlci50b0pTT04oIG1ldGEgKTtcclxuXHJcblx0XHRkYXRhLm9iamVjdC5zaCA9IHRoaXMuc2gudG9BcnJheSgpO1xyXG5cclxuXHRcdHJldHVybiBkYXRhO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBMaWdodFByb2JlIH07XHJcbiIsImltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vbWF0aC9Db2xvci5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjIuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yNCB9IGZyb20gJy4uL21hdGgvVmVjdG9yNC5qcyc7XHJcbmltcG9ydCB7IE1hdHJpeDMgfSBmcm9tICcuLi9tYXRoL01hdHJpeDMuanMnO1xyXG5pbXBvcnQgeyBNYXRyaXg0IH0gZnJvbSAnLi4vbWF0aC9NYXRyaXg0LmpzJztcclxuaW1wb3J0IHsgRmlsZUxvYWRlciB9IGZyb20gJy4vRmlsZUxvYWRlci5qcyc7XHJcbmltcG9ydCB7IExvYWRlciB9IGZyb20gJy4vTG9hZGVyLmpzJztcclxuaW1wb3J0IHtcclxuXHRTaGFkb3dNYXRlcmlhbCxcclxuXHRTcHJpdGVNYXRlcmlhbCxcclxuXHRSYXdTaGFkZXJNYXRlcmlhbCxcclxuXHRTaGFkZXJNYXRlcmlhbCxcclxuXHRQb2ludHNNYXRlcmlhbCxcclxuXHRNZXNoUGh5c2ljYWxNYXRlcmlhbCxcclxuXHRNZXNoU3RhbmRhcmRNYXRlcmlhbCxcclxuXHRNZXNoUGhvbmdNYXRlcmlhbCxcclxuXHRNZXNoVG9vbk1hdGVyaWFsLFxyXG5cdE1lc2hOb3JtYWxNYXRlcmlhbCxcclxuXHRNZXNoTGFtYmVydE1hdGVyaWFsLFxyXG5cdE1lc2hEZXB0aE1hdGVyaWFsLFxyXG5cdE1lc2hEaXN0YW5jZU1hdGVyaWFsLFxyXG5cdE1lc2hCYXNpY01hdGVyaWFsLFxyXG5cdE1lc2hNYXRjYXBNYXRlcmlhbCxcclxuXHRMaW5lRGFzaGVkTWF0ZXJpYWwsXHJcblx0TGluZUJhc2ljTWF0ZXJpYWwsXHJcblx0TWF0ZXJpYWwsXHJcbn0gZnJvbSAnLi4vbWF0ZXJpYWxzL01hdGVyaWFscy5qcyc7XHJcblxyXG4vKipcclxuICogQ2xhc3MgZm9yIGxvYWRpbmcgZ2VvbWV0cmllcy4gVGhlIGZpbGVzIGFyZSBpbnRlcm5hbGx5XHJcbiAqIGxvYWRlZCB2aWEge0BsaW5rIEZpbGVMb2FkZXJ9LlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBsb2FkZXIgPSBuZXcgVEhSRUUuTWF0ZXJpYWxMb2FkZXIoKTtcclxuICogY29uc3QgbWF0ZXJpYWwgPSBhd2FpdCBsb2FkZXIubG9hZEFzeW5jKCAnbWF0ZXJpYWwuanNvbicgKTtcclxuICogYGBgXHJcbiAqIFRoaXMgbG9hZGVyIGRvZXMgbm90IHN1cHBvcnQgbm9kZSBtYXRlcmlhbHMuIFVzZSB7QGxpbmsgTm9kZU1hdGVyaWFsTG9hZGVyfSBpbnN0ZWFkLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTG9hZGVyXHJcbiAqL1xyXG5jbGFzcyBNYXRlcmlhbExvYWRlciBleHRlbmRzIExvYWRlciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbWF0ZXJpYWwgbG9hZGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtMb2FkaW5nTWFuYWdlcn0gW21hbmFnZXJdIC0gVGhlIGxvYWRpbmcgbWFuYWdlci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbWFuYWdlciApIHtcclxuXHJcblx0XHRzdXBlciggbWFuYWdlciApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBkaWN0aW9uYXJ5IGhvbGRpbmcgdGV4dHVyZXMgdXNlZCBieSB0aGUgbWF0ZXJpYWwuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdDxzdHJpbmcsVGV4dHVyZT59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudGV4dHVyZXMgPSB7fTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTdGFydHMgbG9hZGluZyBmcm9tIHRoZSBnaXZlbiBVUkwgYW5kIHBhc3MgdGhlIGxvYWRlZCBtYXRlcmlhbCB0byB0aGUgYG9uTG9hZCgpYCBjYWxsYmFjay5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSBUaGUgcGF0aC9VUkwgb2YgdGhlIGZpbGUgdG8gYmUgbG9hZGVkLiBUaGlzIGNhbiBhbHNvIGJlIGEgZGF0YSBVUkkuXHJcblx0ICogQHBhcmFtIHtmdW5jdGlvbihNYXRlcmlhbCl9IG9uTG9hZCAtIEV4ZWN1dGVkIHdoZW4gdGhlIGxvYWRpbmcgcHJvY2VzcyBoYXMgYmVlbiBmaW5pc2hlZC5cclxuXHQgKiBAcGFyYW0ge29uUHJvZ3Jlc3NDYWxsYmFja30gb25Qcm9ncmVzcyAtIEV4ZWN1dGVkIHdoaWxlIHRoZSBsb2FkaW5nIGlzIGluIHByb2dyZXNzLlxyXG5cdCAqIEBwYXJhbSB7b25FcnJvckNhbGxiYWNrfSBvbkVycm9yIC0gRXhlY3V0ZWQgd2hlbiBlcnJvcnMgb2NjdXIuXHJcblx0ICovXHJcblx0bG9hZCggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XHJcblxyXG5cdFx0Y29uc3Qgc2NvcGUgPSB0aGlzO1xyXG5cclxuXHRcdGNvbnN0IGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCBzY29wZS5tYW5hZ2VyICk7XHJcblx0XHRsb2FkZXIuc2V0UGF0aCggc2NvcGUucGF0aCApO1xyXG5cdFx0bG9hZGVyLnNldFJlcXVlc3RIZWFkZXIoIHNjb3BlLnJlcXVlc3RIZWFkZXIgKTtcclxuXHRcdGxvYWRlci5zZXRXaXRoQ3JlZGVudGlhbHMoIHNjb3BlLndpdGhDcmVkZW50aWFscyApO1xyXG5cdFx0bG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCB0ZXh0ICkge1xyXG5cclxuXHRcdFx0dHJ5IHtcclxuXHJcblx0XHRcdFx0b25Mb2FkKCBzY29wZS5wYXJzZSggSlNPTi5wYXJzZSggdGV4dCApICkgKTtcclxuXHJcblx0XHRcdH0gY2F0Y2ggKCBlICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIG9uRXJyb3IgKSB7XHJcblxyXG5cdFx0XHRcdFx0b25FcnJvciggZSApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoIGUgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FcnJvciggdXJsICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBhcnNlcyB0aGUgZ2l2ZW4gSlNPTiBvYmplY3QgYW5kIHJldHVybnMgYSBtYXRlcmlhbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBqc29uIC0gVGhlIHNlcmlhbGl6ZWQgbWF0ZXJpYWwuXHJcblx0ICogQHJldHVybiB7TWF0ZXJpYWx9IFRoZSBwYXJzZWQgbWF0ZXJpYWwuXHJcblx0ICovXHJcblx0cGFyc2UoIGpzb24gKSB7XHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZXMgPSB0aGlzLnRleHR1cmVzO1xyXG5cclxuXHRcdGZ1bmN0aW9uIGdldFRleHR1cmUoIG5hbWUgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHRleHR1cmVzWyBuYW1lIF0gPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0ZXJpYWxMb2FkZXI6IFVuZGVmaW5lZCB0ZXh0dXJlJywgbmFtZSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIHRleHR1cmVzWyBuYW1lIF07XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IG1hdGVyaWFsID0gdGhpcy5jcmVhdGVNYXRlcmlhbEZyb21UeXBlKCBqc29uLnR5cGUgKTtcclxuXHJcblx0XHRpZiAoIGpzb24udXVpZCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwudXVpZCA9IGpzb24udXVpZDtcclxuXHRcdGlmICgganNvbi5uYW1lICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5uYW1lID0ganNvbi5uYW1lO1xyXG5cdFx0aWYgKCBqc29uLmNvbG9yICE9PSB1bmRlZmluZWQgJiYgbWF0ZXJpYWwuY29sb3IgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmNvbG9yLnNldEhleCgganNvbi5jb2xvciApO1xyXG5cdFx0aWYgKCBqc29uLnJvdWdobmVzcyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwucm91Z2huZXNzID0ganNvbi5yb3VnaG5lc3M7XHJcblx0XHRpZiAoIGpzb24ubWV0YWxuZXNzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5tZXRhbG5lc3MgPSBqc29uLm1ldGFsbmVzcztcclxuXHRcdGlmICgganNvbi5zaGVlbiAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc2hlZW4gPSBqc29uLnNoZWVuO1xyXG5cdFx0aWYgKCBqc29uLnNoZWVuQ29sb3IgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNoZWVuQ29sb3IgPSBuZXcgQ29sb3IoKS5zZXRIZXgoIGpzb24uc2hlZW5Db2xvciApO1xyXG5cdFx0aWYgKCBqc29uLnNoZWVuUm91Z2huZXNzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zaGVlblJvdWdobmVzcyA9IGpzb24uc2hlZW5Sb3VnaG5lc3M7XHJcblx0XHRpZiAoIGpzb24uZW1pc3NpdmUgIT09IHVuZGVmaW5lZCAmJiBtYXRlcmlhbC5lbWlzc2l2ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZW1pc3NpdmUuc2V0SGV4KCBqc29uLmVtaXNzaXZlICk7XHJcblx0XHRpZiAoIGpzb24uc3BlY3VsYXIgIT09IHVuZGVmaW5lZCAmJiBtYXRlcmlhbC5zcGVjdWxhciAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc3BlY3VsYXIuc2V0SGV4KCBqc29uLnNwZWN1bGFyICk7XHJcblx0XHRpZiAoIGpzb24uc3BlY3VsYXJJbnRlbnNpdHkgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNwZWN1bGFySW50ZW5zaXR5ID0ganNvbi5zcGVjdWxhckludGVuc2l0eTtcclxuXHRcdGlmICgganNvbi5zcGVjdWxhckNvbG9yICE9PSB1bmRlZmluZWQgJiYgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvci5zZXRIZXgoIGpzb24uc3BlY3VsYXJDb2xvciApO1xyXG5cdFx0aWYgKCBqc29uLnNoaW5pbmVzcyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc2hpbmluZXNzID0ganNvbi5zaGluaW5lc3M7XHJcblx0XHRpZiAoIGpzb24uY2xlYXJjb2F0ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5jbGVhcmNvYXQgPSBqc29uLmNsZWFyY29hdDtcclxuXHRcdGlmICgganNvbi5jbGVhcmNvYXRSb3VnaG5lc3MgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcyA9IGpzb24uY2xlYXJjb2F0Um91Z2huZXNzO1xyXG5cdFx0aWYgKCBqc29uLmRpc3BlcnNpb24gIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmRpc3BlcnNpb24gPSBqc29uLmRpc3BlcnNpb247XHJcblx0XHRpZiAoIGpzb24uaXJpZGVzY2VuY2UgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmlyaWRlc2NlbmNlID0ganNvbi5pcmlkZXNjZW5jZTtcclxuXHRcdGlmICgganNvbi5pcmlkZXNjZW5jZUlPUiAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuaXJpZGVzY2VuY2VJT1IgPSBqc29uLmlyaWRlc2NlbmNlSU9SO1xyXG5cdFx0aWYgKCBqc29uLmlyaWRlc2NlbmNlVGhpY2tuZXNzUmFuZ2UgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmlyaWRlc2NlbmNlVGhpY2tuZXNzUmFuZ2UgPSBqc29uLmlyaWRlc2NlbmNlVGhpY2tuZXNzUmFuZ2U7XHJcblx0XHRpZiAoIGpzb24udHJhbnNtaXNzaW9uICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC50cmFuc21pc3Npb24gPSBqc29uLnRyYW5zbWlzc2lvbjtcclxuXHRcdGlmICgganNvbi50aGlja25lc3MgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnRoaWNrbmVzcyA9IGpzb24udGhpY2tuZXNzO1xyXG5cdFx0aWYgKCBqc29uLmF0dGVudWF0aW9uRGlzdGFuY2UgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmF0dGVudWF0aW9uRGlzdGFuY2UgPSBqc29uLmF0dGVudWF0aW9uRGlzdGFuY2U7XHJcblx0XHRpZiAoIGpzb24uYXR0ZW51YXRpb25Db2xvciAhPT0gdW5kZWZpbmVkICYmIG1hdGVyaWFsLmF0dGVudWF0aW9uQ29sb3IgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmF0dGVudWF0aW9uQ29sb3Iuc2V0SGV4KCBqc29uLmF0dGVudWF0aW9uQ29sb3IgKTtcclxuXHRcdGlmICgganNvbi5hbmlzb3Ryb3B5ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5hbmlzb3Ryb3B5ID0ganNvbi5hbmlzb3Ryb3B5O1xyXG5cdFx0aWYgKCBqc29uLmFuaXNvdHJvcHlSb3RhdGlvbiAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYW5pc290cm9weVJvdGF0aW9uID0ganNvbi5hbmlzb3Ryb3B5Um90YXRpb247XHJcblx0XHRpZiAoIGpzb24uZm9nICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5mb2cgPSBqc29uLmZvZztcclxuXHRcdGlmICgganNvbi5mbGF0U2hhZGluZyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZmxhdFNoYWRpbmcgPSBqc29uLmZsYXRTaGFkaW5nO1xyXG5cdFx0aWYgKCBqc29uLmJsZW5kaW5nICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5ibGVuZGluZyA9IGpzb24uYmxlbmRpbmc7XHJcblx0XHRpZiAoIGpzb24uY29tYmluZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuY29tYmluZSA9IGpzb24uY29tYmluZTtcclxuXHRcdGlmICgganNvbi5zaWRlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zaWRlID0ganNvbi5zaWRlO1xyXG5cdFx0aWYgKCBqc29uLnNoYWRvd1NpZGUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNoYWRvd1NpZGUgPSBqc29uLnNoYWRvd1NpZGU7XHJcblx0XHRpZiAoIGpzb24ub3BhY2l0eSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwub3BhY2l0eSA9IGpzb24ub3BhY2l0eTtcclxuXHRcdGlmICgganNvbi50cmFuc3BhcmVudCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwudHJhbnNwYXJlbnQgPSBqc29uLnRyYW5zcGFyZW50O1xyXG5cdFx0aWYgKCBqc29uLmFscGhhVGVzdCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYWxwaGFUZXN0ID0ganNvbi5hbHBoYVRlc3Q7XHJcblx0XHRpZiAoIGpzb24uYWxwaGFIYXNoICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5hbHBoYUhhc2ggPSBqc29uLmFscGhhSGFzaDtcclxuXHRcdGlmICgganNvbi5kZXB0aEZ1bmMgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmRlcHRoRnVuYyA9IGpzb24uZGVwdGhGdW5jO1xyXG5cdFx0aWYgKCBqc29uLmRlcHRoVGVzdCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGVwdGhUZXN0ID0ganNvbi5kZXB0aFRlc3Q7XHJcblx0XHRpZiAoIGpzb24uZGVwdGhXcml0ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGVwdGhXcml0ZSA9IGpzb24uZGVwdGhXcml0ZTtcclxuXHRcdGlmICgganNvbi5jb2xvcldyaXRlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5jb2xvcldyaXRlID0ganNvbi5jb2xvcldyaXRlO1xyXG5cdFx0aWYgKCBqc29uLmJsZW5kU3JjICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5ibGVuZFNyYyA9IGpzb24uYmxlbmRTcmM7XHJcblx0XHRpZiAoIGpzb24uYmxlbmREc3QgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmJsZW5kRHN0ID0ganNvbi5ibGVuZERzdDtcclxuXHRcdGlmICgganNvbi5ibGVuZEVxdWF0aW9uICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5ibGVuZEVxdWF0aW9uID0ganNvbi5ibGVuZEVxdWF0aW9uO1xyXG5cdFx0aWYgKCBqc29uLmJsZW5kU3JjQWxwaGEgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmJsZW5kU3JjQWxwaGEgPSBqc29uLmJsZW5kU3JjQWxwaGE7XHJcblx0XHRpZiAoIGpzb24uYmxlbmREc3RBbHBoYSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYmxlbmREc3RBbHBoYSA9IGpzb24uYmxlbmREc3RBbHBoYTtcclxuXHRcdGlmICgganNvbi5ibGVuZEVxdWF0aW9uQWxwaGEgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmJsZW5kRXF1YXRpb25BbHBoYSA9IGpzb24uYmxlbmRFcXVhdGlvbkFscGhhO1xyXG5cdFx0aWYgKCBqc29uLmJsZW5kQ29sb3IgIT09IHVuZGVmaW5lZCAmJiBtYXRlcmlhbC5ibGVuZENvbG9yICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5ibGVuZENvbG9yLnNldEhleCgganNvbi5ibGVuZENvbG9yICk7XHJcblx0XHRpZiAoIGpzb24uYmxlbmRBbHBoYSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYmxlbmRBbHBoYSA9IGpzb24uYmxlbmRBbHBoYTtcclxuXHRcdGlmICgganNvbi5zdGVuY2lsV3JpdGVNYXNrICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zdGVuY2lsV3JpdGVNYXNrID0ganNvbi5zdGVuY2lsV3JpdGVNYXNrO1xyXG5cdFx0aWYgKCBqc29uLnN0ZW5jaWxGdW5jICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zdGVuY2lsRnVuYyA9IGpzb24uc3RlbmNpbEZ1bmM7XHJcblx0XHRpZiAoIGpzb24uc3RlbmNpbFJlZiAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc3RlbmNpbFJlZiA9IGpzb24uc3RlbmNpbFJlZjtcclxuXHRcdGlmICgganNvbi5zdGVuY2lsRnVuY01hc2sgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnN0ZW5jaWxGdW5jTWFzayA9IGpzb24uc3RlbmNpbEZ1bmNNYXNrO1xyXG5cdFx0aWYgKCBqc29uLnN0ZW5jaWxGYWlsICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zdGVuY2lsRmFpbCA9IGpzb24uc3RlbmNpbEZhaWw7XHJcblx0XHRpZiAoIGpzb24uc3RlbmNpbFpGYWlsICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zdGVuY2lsWkZhaWwgPSBqc29uLnN0ZW5jaWxaRmFpbDtcclxuXHRcdGlmICgganNvbi5zdGVuY2lsWlBhc3MgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnN0ZW5jaWxaUGFzcyA9IGpzb24uc3RlbmNpbFpQYXNzO1xyXG5cdFx0aWYgKCBqc29uLnN0ZW5jaWxXcml0ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc3RlbmNpbFdyaXRlID0ganNvbi5zdGVuY2lsV3JpdGU7XHJcblxyXG5cdFx0aWYgKCBqc29uLndpcmVmcmFtZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwud2lyZWZyYW1lID0ganNvbi53aXJlZnJhbWU7XHJcblx0XHRpZiAoIGpzb24ud2lyZWZyYW1lTGluZXdpZHRoICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC53aXJlZnJhbWVMaW5ld2lkdGggPSBqc29uLndpcmVmcmFtZUxpbmV3aWR0aDtcclxuXHRcdGlmICgganNvbi53aXJlZnJhbWVMaW5lY2FwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC53aXJlZnJhbWVMaW5lY2FwID0ganNvbi53aXJlZnJhbWVMaW5lY2FwO1xyXG5cdFx0aWYgKCBqc29uLndpcmVmcmFtZUxpbmVqb2luICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC53aXJlZnJhbWVMaW5lam9pbiA9IGpzb24ud2lyZWZyYW1lTGluZWpvaW47XHJcblxyXG5cdFx0aWYgKCBqc29uLnJvdGF0aW9uICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5yb3RhdGlvbiA9IGpzb24ucm90YXRpb247XHJcblxyXG5cdFx0aWYgKCBqc29uLmxpbmV3aWR0aCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubGluZXdpZHRoID0ganNvbi5saW5ld2lkdGg7XHJcblx0XHRpZiAoIGpzb24uZGFzaFNpemUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmRhc2hTaXplID0ganNvbi5kYXNoU2l6ZTtcclxuXHRcdGlmICgganNvbi5nYXBTaXplICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5nYXBTaXplID0ganNvbi5nYXBTaXplO1xyXG5cdFx0aWYgKCBqc29uLnNjYWxlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zY2FsZSA9IGpzb24uc2NhbGU7XHJcblxyXG5cdFx0aWYgKCBqc29uLnBvbHlnb25PZmZzZXQgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnBvbHlnb25PZmZzZXQgPSBqc29uLnBvbHlnb25PZmZzZXQ7XHJcblx0XHRpZiAoIGpzb24ucG9seWdvbk9mZnNldEZhY3RvciAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwucG9seWdvbk9mZnNldEZhY3RvciA9IGpzb24ucG9seWdvbk9mZnNldEZhY3RvcjtcclxuXHRcdGlmICgganNvbi5wb2x5Z29uT2Zmc2V0VW5pdHMgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnBvbHlnb25PZmZzZXRVbml0cyA9IGpzb24ucG9seWdvbk9mZnNldFVuaXRzO1xyXG5cclxuXHRcdGlmICgganNvbi5kaXRoZXJpbmcgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmRpdGhlcmluZyA9IGpzb24uZGl0aGVyaW5nO1xyXG5cclxuXHRcdGlmICgganNvbi5hbHBoYVRvQ292ZXJhZ2UgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmFscGhhVG9Db3ZlcmFnZSA9IGpzb24uYWxwaGFUb0NvdmVyYWdlO1xyXG5cdFx0aWYgKCBqc29uLnByZW11bHRpcGxpZWRBbHBoYSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwucHJlbXVsdGlwbGllZEFscGhhID0ganNvbi5wcmVtdWx0aXBsaWVkQWxwaGE7XHJcblx0XHRpZiAoIGpzb24uZm9yY2VTaW5nbGVQYXNzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5mb3JjZVNpbmdsZVBhc3MgPSBqc29uLmZvcmNlU2luZ2xlUGFzcztcclxuXHJcblx0XHRpZiAoIGpzb24udmlzaWJsZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwudmlzaWJsZSA9IGpzb24udmlzaWJsZTtcclxuXHJcblx0XHRpZiAoIGpzb24udG9uZU1hcHBlZCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwudG9uZU1hcHBlZCA9IGpzb24udG9uZU1hcHBlZDtcclxuXHJcblx0XHRpZiAoIGpzb24udXNlckRhdGEgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnVzZXJEYXRhID0ganNvbi51c2VyRGF0YTtcclxuXHJcblx0XHRpZiAoIGpzb24udmVydGV4Q29sb3JzICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHR5cGVvZiBqc29uLnZlcnRleENvbG9ycyA9PT0gJ251bWJlcicgKSB7XHJcblxyXG5cdFx0XHRcdG1hdGVyaWFsLnZlcnRleENvbG9ycyA9ICgganNvbi52ZXJ0ZXhDb2xvcnMgPiAwICkgPyB0cnVlIDogZmFsc2U7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRtYXRlcmlhbC52ZXJ0ZXhDb2xvcnMgPSBqc29uLnZlcnRleENvbG9ycztcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gU2hhZGVyIE1hdGVyaWFsXHJcblxyXG5cdFx0aWYgKCBqc29uLnVuaWZvcm1zICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBjb25zdCBuYW1lIGluIGpzb24udW5pZm9ybXMgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHVuaWZvcm0gPSBqc29uLnVuaWZvcm1zWyBuYW1lIF07XHJcblxyXG5cdFx0XHRcdG1hdGVyaWFsLnVuaWZvcm1zWyBuYW1lIF0gPSB7fTtcclxuXHJcblx0XHRcdFx0c3dpdGNoICggdW5pZm9ybS50eXBlICkge1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgJ3QnOlxyXG5cdFx0XHRcdFx0XHRtYXRlcmlhbC51bmlmb3Jtc1sgbmFtZSBdLnZhbHVlID0gZ2V0VGV4dHVyZSggdW5pZm9ybS52YWx1ZSApO1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRjYXNlICdjJzpcclxuXHRcdFx0XHRcdFx0bWF0ZXJpYWwudW5pZm9ybXNbIG5hbWUgXS52YWx1ZSA9IG5ldyBDb2xvcigpLnNldEhleCggdW5pZm9ybS52YWx1ZSApO1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRjYXNlICd2Mic6XHJcblx0XHRcdFx0XHRcdG1hdGVyaWFsLnVuaWZvcm1zWyBuYW1lIF0udmFsdWUgPSBuZXcgVmVjdG9yMigpLmZyb21BcnJheSggdW5pZm9ybS52YWx1ZSApO1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRjYXNlICd2Myc6XHJcblx0XHRcdFx0XHRcdG1hdGVyaWFsLnVuaWZvcm1zWyBuYW1lIF0udmFsdWUgPSBuZXcgVmVjdG9yMygpLmZyb21BcnJheSggdW5pZm9ybS52YWx1ZSApO1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRjYXNlICd2NCc6XHJcblx0XHRcdFx0XHRcdG1hdGVyaWFsLnVuaWZvcm1zWyBuYW1lIF0udmFsdWUgPSBuZXcgVmVjdG9yNCgpLmZyb21BcnJheSggdW5pZm9ybS52YWx1ZSApO1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRjYXNlICdtMyc6XHJcblx0XHRcdFx0XHRcdG1hdGVyaWFsLnVuaWZvcm1zWyBuYW1lIF0udmFsdWUgPSBuZXcgTWF0cml4MygpLmZyb21BcnJheSggdW5pZm9ybS52YWx1ZSApO1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRjYXNlICdtNCc6XHJcblx0XHRcdFx0XHRcdG1hdGVyaWFsLnVuaWZvcm1zWyBuYW1lIF0udmFsdWUgPSBuZXcgTWF0cml4NCgpLmZyb21BcnJheSggdW5pZm9ybS52YWx1ZSApO1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdFx0XHRtYXRlcmlhbC51bmlmb3Jtc1sgbmFtZSBdLnZhbHVlID0gdW5pZm9ybS52YWx1ZTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGpzb24uZGVmaW5lcyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGVmaW5lcyA9IGpzb24uZGVmaW5lcztcclxuXHRcdGlmICgganNvbi52ZXJ0ZXhTaGFkZXIgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnZlcnRleFNoYWRlciA9IGpzb24udmVydGV4U2hhZGVyO1xyXG5cdFx0aWYgKCBqc29uLmZyYWdtZW50U2hhZGVyICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5mcmFnbWVudFNoYWRlciA9IGpzb24uZnJhZ21lbnRTaGFkZXI7XHJcblx0XHRpZiAoIGpzb24uZ2xzbFZlcnNpb24gIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmdsc2xWZXJzaW9uID0ganNvbi5nbHNsVmVyc2lvbjtcclxuXHJcblx0XHRpZiAoIGpzb24uZXh0ZW5zaW9ucyAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Zm9yICggY29uc3Qga2V5IGluIGpzb24uZXh0ZW5zaW9ucyApIHtcclxuXHJcblx0XHRcdFx0bWF0ZXJpYWwuZXh0ZW5zaW9uc1sga2V5IF0gPSBqc29uLmV4dGVuc2lvbnNbIGtleSBdO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGpzb24ubGlnaHRzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5saWdodHMgPSBqc29uLmxpZ2h0cztcclxuXHRcdGlmICgganNvbi5jbGlwcGluZyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuY2xpcHBpbmcgPSBqc29uLmNsaXBwaW5nO1xyXG5cclxuXHRcdC8vIGZvciBQb2ludHNNYXRlcmlhbFxyXG5cclxuXHRcdGlmICgganNvbi5zaXplICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zaXplID0ganNvbi5zaXplO1xyXG5cdFx0aWYgKCBqc29uLnNpemVBdHRlbnVhdGlvbiAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc2l6ZUF0dGVudWF0aW9uID0ganNvbi5zaXplQXR0ZW51YXRpb247XHJcblxyXG5cdFx0Ly8gbWFwc1xyXG5cclxuXHRcdGlmICgganNvbi5tYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm1hcCA9IGdldFRleHR1cmUoIGpzb24ubWFwICk7XHJcblx0XHRpZiAoIGpzb24ubWF0Y2FwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5tYXRjYXAgPSBnZXRUZXh0dXJlKCBqc29uLm1hdGNhcCApO1xyXG5cclxuXHRcdGlmICgganNvbi5hbHBoYU1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYWxwaGFNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmFscGhhTWFwICk7XHJcblxyXG5cdFx0aWYgKCBqc29uLmJ1bXBNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmJ1bXBNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmJ1bXBNYXAgKTtcclxuXHRcdGlmICgganNvbi5idW1wU2NhbGUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmJ1bXBTY2FsZSA9IGpzb24uYnVtcFNjYWxlO1xyXG5cclxuXHRcdGlmICgganNvbi5ub3JtYWxNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm5vcm1hbE1hcCA9IGdldFRleHR1cmUoIGpzb24ubm9ybWFsTWFwICk7XHJcblx0XHRpZiAoIGpzb24ubm9ybWFsTWFwVHlwZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubm9ybWFsTWFwVHlwZSA9IGpzb24ubm9ybWFsTWFwVHlwZTtcclxuXHRcdGlmICgganNvbi5ub3JtYWxTY2FsZSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0bGV0IG5vcm1hbFNjYWxlID0ganNvbi5ub3JtYWxTY2FsZTtcclxuXHJcblx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggbm9ybWFsU2NhbGUgKSA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRcdC8vIEJsZW5kZXIgZXhwb3J0ZXIgdXNlZCB0byBleHBvcnQgYSBzY2FsYXIuIFNlZSAjNzQ1OVxyXG5cclxuXHRcdFx0XHRub3JtYWxTY2FsZSA9IFsgbm9ybWFsU2NhbGUsIG5vcm1hbFNjYWxlIF07XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRtYXRlcmlhbC5ub3JtYWxTY2FsZSA9IG5ldyBWZWN0b3IyKCkuZnJvbUFycmF5KCBub3JtYWxTY2FsZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGpzb24uZGlzcGxhY2VtZW50TWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmRpc3BsYWNlbWVudE1hcCApO1xyXG5cdFx0aWYgKCBqc29uLmRpc3BsYWNlbWVudFNjYWxlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRTY2FsZSA9IGpzb24uZGlzcGxhY2VtZW50U2NhbGU7XHJcblx0XHRpZiAoIGpzb24uZGlzcGxhY2VtZW50QmlhcyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGlzcGxhY2VtZW50QmlhcyA9IGpzb24uZGlzcGxhY2VtZW50QmlhcztcclxuXHJcblx0XHRpZiAoIGpzb24ucm91Z2huZXNzTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5yb3VnaG5lc3NNYXAgPSBnZXRUZXh0dXJlKCBqc29uLnJvdWdobmVzc01hcCApO1xyXG5cdFx0aWYgKCBqc29uLm1ldGFsbmVzc01hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubWV0YWxuZXNzTWFwID0gZ2V0VGV4dHVyZSgganNvbi5tZXRhbG5lc3NNYXAgKTtcclxuXHJcblx0XHRpZiAoIGpzb24uZW1pc3NpdmVNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmVtaXNzaXZlTWFwID0gZ2V0VGV4dHVyZSgganNvbi5lbWlzc2l2ZU1hcCApO1xyXG5cdFx0aWYgKCBqc29uLmVtaXNzaXZlSW50ZW5zaXR5ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5lbWlzc2l2ZUludGVuc2l0eSA9IGpzb24uZW1pc3NpdmVJbnRlbnNpdHk7XHJcblxyXG5cdFx0aWYgKCBqc29uLnNwZWN1bGFyTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zcGVjdWxhck1hcCA9IGdldFRleHR1cmUoIGpzb24uc3BlY3VsYXJNYXAgKTtcclxuXHRcdGlmICgganNvbi5zcGVjdWxhckludGVuc2l0eU1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc3BlY3VsYXJJbnRlbnNpdHlNYXAgPSBnZXRUZXh0dXJlKCBqc29uLnNwZWN1bGFySW50ZW5zaXR5TWFwICk7XHJcblx0XHRpZiAoIGpzb24uc3BlY3VsYXJDb2xvck1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvck1hcCA9IGdldFRleHR1cmUoIGpzb24uc3BlY3VsYXJDb2xvck1hcCApO1xyXG5cclxuXHRcdGlmICgganNvbi5lbnZNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmVudk1hcCA9IGdldFRleHR1cmUoIGpzb24uZW52TWFwICk7XHJcblx0XHRpZiAoIGpzb24uZW52TWFwUm90YXRpb24gIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmVudk1hcFJvdGF0aW9uLmZyb21BcnJheSgganNvbi5lbnZNYXBSb3RhdGlvbiApO1xyXG5cdFx0aWYgKCBqc29uLmVudk1hcEludGVuc2l0eSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZW52TWFwSW50ZW5zaXR5ID0ganNvbi5lbnZNYXBJbnRlbnNpdHk7XHJcblxyXG5cdFx0aWYgKCBqc29uLnJlZmxlY3Rpdml0eSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwucmVmbGVjdGl2aXR5ID0ganNvbi5yZWZsZWN0aXZpdHk7XHJcblx0XHRpZiAoIGpzb24ucmVmcmFjdGlvblJhdGlvICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5yZWZyYWN0aW9uUmF0aW8gPSBqc29uLnJlZnJhY3Rpb25SYXRpbztcclxuXHJcblx0XHRpZiAoIGpzb24ubGlnaHRNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmxpZ2h0TWFwID0gZ2V0VGV4dHVyZSgganNvbi5saWdodE1hcCApO1xyXG5cdFx0aWYgKCBqc29uLmxpZ2h0TWFwSW50ZW5zaXR5ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5saWdodE1hcEludGVuc2l0eSA9IGpzb24ubGlnaHRNYXBJbnRlbnNpdHk7XHJcblxyXG5cdFx0aWYgKCBqc29uLmFvTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5hb01hcCA9IGdldFRleHR1cmUoIGpzb24uYW9NYXAgKTtcclxuXHRcdGlmICgganNvbi5hb01hcEludGVuc2l0eSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYW9NYXBJbnRlbnNpdHkgPSBqc29uLmFvTWFwSW50ZW5zaXR5O1xyXG5cclxuXHRcdGlmICgganNvbi5ncmFkaWVudE1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZ3JhZGllbnRNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmdyYWRpZW50TWFwICk7XHJcblxyXG5cdFx0aWYgKCBqc29uLmNsZWFyY29hdE1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuY2xlYXJjb2F0TWFwID0gZ2V0VGV4dHVyZSgganNvbi5jbGVhcmNvYXRNYXAgKTtcclxuXHRcdGlmICgganNvbi5jbGVhcmNvYXRSb3VnaG5lc3NNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzc01hcCA9IGdldFRleHR1cmUoIGpzb24uY2xlYXJjb2F0Um91Z2huZXNzTWFwICk7XHJcblx0XHRpZiAoIGpzb24uY2xlYXJjb2F0Tm9ybWFsTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5jbGVhcmNvYXROb3JtYWxNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmNsZWFyY29hdE5vcm1hbE1hcCApO1xyXG5cdFx0aWYgKCBqc29uLmNsZWFyY29hdE5vcm1hbFNjYWxlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5jbGVhcmNvYXROb3JtYWxTY2FsZSA9IG5ldyBWZWN0b3IyKCkuZnJvbUFycmF5KCBqc29uLmNsZWFyY29hdE5vcm1hbFNjYWxlICk7XHJcblxyXG5cdFx0aWYgKCBqc29uLmlyaWRlc2NlbmNlTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5pcmlkZXNjZW5jZU1hcCA9IGdldFRleHR1cmUoIGpzb24uaXJpZGVzY2VuY2VNYXAgKTtcclxuXHRcdGlmICgganNvbi5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwICk7XHJcblxyXG5cdFx0aWYgKCBqc29uLnRyYW5zbWlzc2lvbk1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwudHJhbnNtaXNzaW9uTWFwID0gZ2V0VGV4dHVyZSgganNvbi50cmFuc21pc3Npb25NYXAgKTtcclxuXHRcdGlmICgganNvbi50aGlja25lc3NNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnRoaWNrbmVzc01hcCA9IGdldFRleHR1cmUoIGpzb24udGhpY2tuZXNzTWFwICk7XHJcblxyXG5cdFx0aWYgKCBqc29uLmFuaXNvdHJvcHlNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmFuaXNvdHJvcHlNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmFuaXNvdHJvcHlNYXAgKTtcclxuXHJcblx0XHRpZiAoIGpzb24uc2hlZW5Db2xvck1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc2hlZW5Db2xvck1hcCA9IGdldFRleHR1cmUoIGpzb24uc2hlZW5Db2xvck1hcCApO1xyXG5cdFx0aWYgKCBqc29uLnNoZWVuUm91Z2huZXNzTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zaGVlblJvdWdobmVzc01hcCA9IGdldFRleHR1cmUoIGpzb24uc2hlZW5Sb3VnaG5lc3NNYXAgKTtcclxuXHJcblx0XHRyZXR1cm4gbWF0ZXJpYWw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGV4dHVyZXMgYXJlIG5vdCBlbWJlZGRlZCBpbiB0aGUgbWF0ZXJpYWwgSlNPTiBzbyB0aGV5IGhhdmVcclxuXHQgKiB0byBiZSBpbmplY3RlZCBiZWZvcmUgdGhlIGxvYWRpbmcgcHJvY2VzcyBzdGFydHMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gdmFsdWUgLSBBIGRpY3Rpb25hcnkgaG9sZGluZyB0ZXh0dXJlcyBmb3IgbWF0ZXJpYWwgcHJvcGVydGllcy5cclxuXHQgKiBAcmV0dXJuIHtNYXRlcmlhbExvYWRlcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRlcmlhbCBsb2FkZXIuXHJcblx0ICovXHJcblx0c2V0VGV4dHVyZXMoIHZhbHVlICkge1xyXG5cclxuXHRcdHRoaXMudGV4dHVyZXMgPSB2YWx1ZTtcclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgYSBtYXRlcmlhbCBmb3IgdGhlIGdpdmVuIHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSBtYXRlcmlhbCB0eXBlLlxyXG5cdCAqIEByZXR1cm4ge01hdGVyaWFsfSBUaGUgbmV3IG1hdGVyaWFsLlxyXG5cdCAqL1xyXG5cdGNyZWF0ZU1hdGVyaWFsRnJvbVR5cGUoIHR5cGUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIE1hdGVyaWFsTG9hZGVyLmNyZWF0ZU1hdGVyaWFsRnJvbVR5cGUoIHR5cGUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGEgbWF0ZXJpYWwgZm9yIHRoZSBnaXZlbiB0eXBlLlxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIG1hdGVyaWFsIHR5cGUuXHJcblx0ICogQHJldHVybiB7TWF0ZXJpYWx9IFRoZSBuZXcgbWF0ZXJpYWwuXHJcblx0ICovXHJcblx0c3RhdGljIGNyZWF0ZU1hdGVyaWFsRnJvbVR5cGUoIHR5cGUgKSB7XHJcblxyXG5cdFx0Y29uc3QgbWF0ZXJpYWxMaWIgPSB7XHJcblx0XHRcdFNoYWRvd01hdGVyaWFsLFxyXG5cdFx0XHRTcHJpdGVNYXRlcmlhbCxcclxuXHRcdFx0UmF3U2hhZGVyTWF0ZXJpYWwsXHJcblx0XHRcdFNoYWRlck1hdGVyaWFsLFxyXG5cdFx0XHRQb2ludHNNYXRlcmlhbCxcclxuXHRcdFx0TWVzaFBoeXNpY2FsTWF0ZXJpYWwsXHJcblx0XHRcdE1lc2hTdGFuZGFyZE1hdGVyaWFsLFxyXG5cdFx0XHRNZXNoUGhvbmdNYXRlcmlhbCxcclxuXHRcdFx0TWVzaFRvb25NYXRlcmlhbCxcclxuXHRcdFx0TWVzaE5vcm1hbE1hdGVyaWFsLFxyXG5cdFx0XHRNZXNoTGFtYmVydE1hdGVyaWFsLFxyXG5cdFx0XHRNZXNoRGVwdGhNYXRlcmlhbCxcclxuXHRcdFx0TWVzaERpc3RhbmNlTWF0ZXJpYWwsXHJcblx0XHRcdE1lc2hCYXNpY01hdGVyaWFsLFxyXG5cdFx0XHRNZXNoTWF0Y2FwTWF0ZXJpYWwsXHJcblx0XHRcdExpbmVEYXNoZWRNYXRlcmlhbCxcclxuXHRcdFx0TGluZUJhc2ljTWF0ZXJpYWwsXHJcblx0XHRcdE1hdGVyaWFsXHJcblx0XHR9O1xyXG5cclxuXHRcdHJldHVybiBuZXcgbWF0ZXJpYWxMaWJbIHR5cGUgXSgpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBNYXRlcmlhbExvYWRlciB9O1xyXG4iLCIvKipcclxuICogQSBjbGFzcyB3aXRoIGxvYWRlciB1dGlsaXR5IGZ1bmN0aW9ucy5cclxuICovXHJcbmNsYXNzIExvYWRlclV0aWxzIHtcclxuXHJcblx0LyoqXHJcblx0ICogRXh0cmFjdHMgdGhlIGJhc2UgVVJMIGZyb20gdGhlIGdpdmVuIFVSTC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLVRoZSBVUkwgdG8gZXh0cmFjdCB0aGUgYmFzZSBVUkwgZnJvbS5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBleHRyYWN0ZWQgYmFzZSBVUkwuXHJcblx0ICovXHJcblx0c3RhdGljIGV4dHJhY3RVcmxCYXNlKCB1cmwgKSB7XHJcblxyXG5cdFx0Y29uc3QgaW5kZXggPSB1cmwubGFzdEluZGV4T2YoICcvJyApO1xyXG5cclxuXHRcdGlmICggaW5kZXggPT09IC0gMSApIHJldHVybiAnLi8nO1xyXG5cclxuXHRcdHJldHVybiB1cmwuc2xpY2UoIDAsIGluZGV4ICsgMSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlc29sdmVzIHJlbGF0aXZlIFVSTHMgYWdhaW5zdCB0aGUgZ2l2ZW4gcGF0aC4gQWJzb2x1dGUgcGF0aHMsIGRhdGEgdXJscyxcclxuXHQgKiBhbmQgYmxvYiBVUkxzIHdpbGwgYmUgcmV0dXJuZWQgYXMgaXMuIEludmFsaWQgVVJMcyB3aWxsIHJldHVybiBhbiBlbXB0eVxyXG5cdCAqIHN0cmluZy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLVRoZSBVUkwgdG8gcmVzb2x2ZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFRoZSBiYXNlIHBhdGggZm9yIHJlbGF0aXZlIFVSTHMgdG8gYmUgcmVzb2x2ZWQgYWdhaW5zdC5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSByZXNvbHZlZCBVUkwuXHJcblx0ICovXHJcblx0c3RhdGljIHJlc29sdmVVUkwoIHVybCwgcGF0aCApIHtcclxuXHJcblx0XHQvLyBJbnZhbGlkIFVSTFxyXG5cdFx0aWYgKCB0eXBlb2YgdXJsICE9PSAnc3RyaW5nJyB8fCB1cmwgPT09ICcnICkgcmV0dXJuICcnO1xyXG5cclxuXHRcdC8vIEhvc3QgUmVsYXRpdmUgVVJMXHJcblx0XHRpZiAoIC9eaHR0cHM/OlxcL1xcLy9pLnRlc3QoIHBhdGggKSAmJiAvXlxcLy8udGVzdCggdXJsICkgKSB7XHJcblxyXG5cdFx0XHRwYXRoID0gcGF0aC5yZXBsYWNlKCAvKF5odHRwcz86XFwvXFwvW15cXC9dKykuKi9pLCAnJDEnICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEFic29sdXRlIFVSTCBodHRwOi8vLGh0dHBzOi8vLC8vXHJcblx0XHRpZiAoIC9eKGh0dHBzPzopP1xcL1xcLy9pLnRlc3QoIHVybCApICkgcmV0dXJuIHVybDtcclxuXHJcblx0XHQvLyBEYXRhIFVSSVxyXG5cdFx0aWYgKCAvXmRhdGE6LiosLiokL2kudGVzdCggdXJsICkgKSByZXR1cm4gdXJsO1xyXG5cclxuXHRcdC8vIEJsb2IgVVJMXHJcblx0XHRpZiAoIC9eYmxvYjouKiQvaS50ZXN0KCB1cmwgKSApIHJldHVybiB1cmw7XHJcblxyXG5cdFx0Ly8gUmVsYXRpdmUgVVJMXHJcblx0XHRyZXR1cm4gcGF0aCArIHVybDtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgTG9hZGVyVXRpbHMgfTtcclxuIiwiaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuL0J1ZmZlckdlb21ldHJ5LmpzJztcclxuXHJcbi8qKlxyXG4gKiBBbiBpbnN0YW5jZWQgdmVyc2lvbiBvZiBhIGdlb21ldHJ5LlxyXG4gKi9cclxuY2xhc3MgSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgZXh0ZW5kcyBCdWZmZXJHZW9tZXRyeSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2VkIGJ1ZmZlciBnZW9tZXRyeS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5ID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnknO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGluc3RhbmNlIGNvdW50LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCBJbmZpbml0eVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmluc3RhbmNlQ291bnQgPSBJbmZpbml0eTtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy5pbnN0YW5jZUNvdW50ID0gc291cmNlLmluc3RhbmNlQ291bnQ7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0dG9KU09OKCkge1xyXG5cclxuXHRcdGNvbnN0IGRhdGEgPSBzdXBlci50b0pTT04oKTtcclxuXHJcblx0XHRkYXRhLmluc3RhbmNlQ291bnQgPSB0aGlzLmluc3RhbmNlQ291bnQ7XHJcblxyXG5cdFx0ZGF0YS5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5ID0gdHJ1ZTtcclxuXHJcblx0XHRyZXR1cm4gZGF0YTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgfTtcclxuIiwiaW1wb3J0IHsgU3BoZXJlIH0gZnJvbSAnLi4vbWF0aC9TcGhlcmUuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuaW1wb3J0IHsgQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5pbXBvcnQgeyBCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyR2VvbWV0cnkuanMnO1xyXG5pbXBvcnQgeyBGaWxlTG9hZGVyIH0gZnJvbSAnLi9GaWxlTG9hZGVyLmpzJztcclxuaW1wb3J0IHsgTG9hZGVyIH0gZnJvbSAnLi9Mb2FkZXIuanMnO1xyXG5pbXBvcnQgeyBJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkuanMnO1xyXG5pbXBvcnQgeyBJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcbmltcG9ydCB7IEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9JbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcbmltcG9ydCB7IEludGVybGVhdmVkQnVmZmVyIH0gZnJvbSAnLi4vY29yZS9JbnRlcmxlYXZlZEJ1ZmZlci5qcyc7XHJcbmltcG9ydCB7IGdldFR5cGVkQXJyYXkgfSBmcm9tICcuLi91dGlscy5qcyc7XHJcblxyXG4vKipcclxuICogQ2xhc3MgZm9yIGxvYWRpbmcgZ2VvbWV0cmllcy4gVGhlIGZpbGVzIGFyZSBpbnRlcm5hbGx5XHJcbiAqIGxvYWRlZCB2aWEge0BsaW5rIEZpbGVMb2FkZXJ9LlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBsb2FkZXIgPSBuZXcgVEhSRUUuQnVmZmVyR2VvbWV0cnlMb2FkZXIoKTtcclxuICogY29uc3QgZ2VvbWV0cnkgPSBhd2FpdCBsb2FkZXIubG9hZEFzeW5jKCAnbW9kZWxzL2pzb24vcHJlc3N1cmUuanNvbicgKTtcclxuICpcclxuICogY29uc3QgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IDB4RjVGNUY1IH0gKTtcclxuICogY29uc3Qgb2JqZWN0ID0gbmV3IFRIUkVFLk1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG4gKiBzY2VuZS5hZGQoIG9iamVjdCApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIExvYWRlclxyXG4gKi9cclxuY2xhc3MgQnVmZmVyR2VvbWV0cnlMb2FkZXIgZXh0ZW5kcyBMb2FkZXIge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGdlb21ldHJ5IGxvYWRlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TG9hZGluZ01hbmFnZXJ9IFttYW5hZ2VyXSAtIFRoZSBsb2FkaW5nIG1hbmFnZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG1hbmFnZXIgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG1hbmFnZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTdGFydHMgbG9hZGluZyBmcm9tIHRoZSBnaXZlbiBVUkwgYW5kIHBhc3MgdGhlIGxvYWRlZCBnZW9tZXRyeSB0byB0aGUgYG9uTG9hZCgpYCBjYWxsYmFjay5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSBUaGUgcGF0aC9VUkwgb2YgdGhlIGZpbGUgdG8gYmUgbG9hZGVkLiBUaGlzIGNhbiBhbHNvIGJlIGEgZGF0YSBVUkkuXHJcblx0ICogQHBhcmFtIHtmdW5jdGlvbihCdWZmZXJHZW9tZXRyeSl9IG9uTG9hZCAtIEV4ZWN1dGVkIHdoZW4gdGhlIGxvYWRpbmcgcHJvY2VzcyBoYXMgYmVlbiBmaW5pc2hlZC5cclxuXHQgKiBAcGFyYW0ge29uUHJvZ3Jlc3NDYWxsYmFja30gb25Qcm9ncmVzcyAtIEV4ZWN1dGVkIHdoaWxlIHRoZSBsb2FkaW5nIGlzIGluIHByb2dyZXNzLlxyXG5cdCAqIEBwYXJhbSB7b25FcnJvckNhbGxiYWNrfSBvbkVycm9yIC0gRXhlY3V0ZWQgd2hlbiBlcnJvcnMgb2NjdXIuXHJcblx0ICovXHJcblx0bG9hZCggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XHJcblxyXG5cdFx0Y29uc3Qgc2NvcGUgPSB0aGlzO1xyXG5cclxuXHRcdGNvbnN0IGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCBzY29wZS5tYW5hZ2VyICk7XHJcblx0XHRsb2FkZXIuc2V0UGF0aCggc2NvcGUucGF0aCApO1xyXG5cdFx0bG9hZGVyLnNldFJlcXVlc3RIZWFkZXIoIHNjb3BlLnJlcXVlc3RIZWFkZXIgKTtcclxuXHRcdGxvYWRlci5zZXRXaXRoQ3JlZGVudGlhbHMoIHNjb3BlLndpdGhDcmVkZW50aWFscyApO1xyXG5cdFx0bG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCB0ZXh0ICkge1xyXG5cclxuXHRcdFx0dHJ5IHtcclxuXHJcblx0XHRcdFx0b25Mb2FkKCBzY29wZS5wYXJzZSggSlNPTi5wYXJzZSggdGV4dCApICkgKTtcclxuXHJcblx0XHRcdH0gY2F0Y2ggKCBlICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIG9uRXJyb3IgKSB7XHJcblxyXG5cdFx0XHRcdFx0b25FcnJvciggZSApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoIGUgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FcnJvciggdXJsICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBhcnNlcyB0aGUgZ2l2ZW4gSlNPTiBvYmplY3QgYW5kIHJldHVybnMgYSBnZW9tZXRyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBqc29uIC0gVGhlIHNlcmlhbGl6ZWQgZ2VvbWV0cnkuXHJcblx0ICogQHJldHVybiB7QnVmZmVyR2VvbWV0cnl9IFRoZSBwYXJzZWQgZ2VvbWV0cnkuXHJcblx0ICovXHJcblx0cGFyc2UoIGpzb24gKSB7XHJcblxyXG5cdFx0Y29uc3QgaW50ZXJsZWF2ZWRCdWZmZXJNYXAgPSB7fTtcclxuXHRcdGNvbnN0IGFycmF5QnVmZmVyTWFwID0ge307XHJcblxyXG5cdFx0ZnVuY3Rpb24gZ2V0SW50ZXJsZWF2ZWRCdWZmZXIoIGpzb24sIHV1aWQgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGludGVybGVhdmVkQnVmZmVyTWFwWyB1dWlkIF0gIT09IHVuZGVmaW5lZCApIHJldHVybiBpbnRlcmxlYXZlZEJ1ZmZlck1hcFsgdXVpZCBdO1xyXG5cclxuXHRcdFx0Y29uc3QgaW50ZXJsZWF2ZWRCdWZmZXJzID0ganNvbi5pbnRlcmxlYXZlZEJ1ZmZlcnM7XHJcblx0XHRcdGNvbnN0IGludGVybGVhdmVkQnVmZmVyID0gaW50ZXJsZWF2ZWRCdWZmZXJzWyB1dWlkIF07XHJcblxyXG5cdFx0XHRjb25zdCBidWZmZXIgPSBnZXRBcnJheUJ1ZmZlcigganNvbiwgaW50ZXJsZWF2ZWRCdWZmZXIuYnVmZmVyICk7XHJcblxyXG5cdFx0XHRjb25zdCBhcnJheSA9IGdldFR5cGVkQXJyYXkoIGludGVybGVhdmVkQnVmZmVyLnR5cGUsIGJ1ZmZlciApO1xyXG5cdFx0XHRjb25zdCBpYiA9IG5ldyBJbnRlcmxlYXZlZEJ1ZmZlciggYXJyYXksIGludGVybGVhdmVkQnVmZmVyLnN0cmlkZSApO1xyXG5cdFx0XHRpYi51dWlkID0gaW50ZXJsZWF2ZWRCdWZmZXIudXVpZDtcclxuXHJcblx0XHRcdGludGVybGVhdmVkQnVmZmVyTWFwWyB1dWlkIF0gPSBpYjtcclxuXHJcblx0XHRcdHJldHVybiBpYjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0ZnVuY3Rpb24gZ2V0QXJyYXlCdWZmZXIoIGpzb24sIHV1aWQgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGFycmF5QnVmZmVyTWFwWyB1dWlkIF0gIT09IHVuZGVmaW5lZCApIHJldHVybiBhcnJheUJ1ZmZlck1hcFsgdXVpZCBdO1xyXG5cclxuXHRcdFx0Y29uc3QgYXJyYXlCdWZmZXJzID0ganNvbi5hcnJheUJ1ZmZlcnM7XHJcblx0XHRcdGNvbnN0IGFycmF5QnVmZmVyID0gYXJyYXlCdWZmZXJzWyB1dWlkIF07XHJcblxyXG5cdFx0XHRjb25zdCBhYiA9IG5ldyBVaW50MzJBcnJheSggYXJyYXlCdWZmZXIgKS5idWZmZXI7XHJcblxyXG5cdFx0XHRhcnJheUJ1ZmZlck1hcFsgdXVpZCBdID0gYWI7XHJcblxyXG5cdFx0XHRyZXR1cm4gYWI7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGdlb21ldHJ5ID0ganNvbi5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5ID8gbmV3IEluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5KCkgOiBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcclxuXHJcblx0XHRjb25zdCBpbmRleCA9IGpzb24uZGF0YS5pbmRleDtcclxuXHJcblx0XHRpZiAoIGluZGV4ICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB0eXBlZEFycmF5ID0gZ2V0VHlwZWRBcnJheSggaW5kZXgudHlwZSwgaW5kZXguYXJyYXkgKTtcclxuXHRcdFx0Z2VvbWV0cnkuc2V0SW5kZXgoIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIHR5cGVkQXJyYXksIDEgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBhdHRyaWJ1dGVzID0ganNvbi5kYXRhLmF0dHJpYnV0ZXM7XHJcblxyXG5cdFx0Zm9yICggY29uc3Qga2V5IGluIGF0dHJpYnV0ZXMgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzWyBrZXkgXTtcclxuXHRcdFx0bGV0IGJ1ZmZlckF0dHJpYnV0ZTtcclxuXHJcblx0XHRcdGlmICggYXR0cmlidXRlLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGludGVybGVhdmVkQnVmZmVyID0gZ2V0SW50ZXJsZWF2ZWRCdWZmZXIoIGpzb24uZGF0YSwgYXR0cmlidXRlLmRhdGEgKTtcclxuXHRcdFx0XHRidWZmZXJBdHRyaWJ1dGUgPSBuZXcgSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUoIGludGVybGVhdmVkQnVmZmVyLCBhdHRyaWJ1dGUuaXRlbVNpemUsIGF0dHJpYnV0ZS5vZmZzZXQsIGF0dHJpYnV0ZS5ub3JtYWxpemVkICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRjb25zdCB0eXBlZEFycmF5ID0gZ2V0VHlwZWRBcnJheSggYXR0cmlidXRlLnR5cGUsIGF0dHJpYnV0ZS5hcnJheSApO1xyXG5cdFx0XHRcdGNvbnN0IGJ1ZmZlckF0dHJpYnV0ZUNvbnN0ciA9IGF0dHJpYnV0ZS5pc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSA/IEluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSA6IEJ1ZmZlckF0dHJpYnV0ZTtcclxuXHRcdFx0XHRidWZmZXJBdHRyaWJ1dGUgPSBuZXcgYnVmZmVyQXR0cmlidXRlQ29uc3RyKCB0eXBlZEFycmF5LCBhdHRyaWJ1dGUuaXRlbVNpemUsIGF0dHJpYnV0ZS5ub3JtYWxpemVkICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIGF0dHJpYnV0ZS5uYW1lICE9PSB1bmRlZmluZWQgKSBidWZmZXJBdHRyaWJ1dGUubmFtZSA9IGF0dHJpYnV0ZS5uYW1lO1xyXG5cdFx0XHRpZiAoIGF0dHJpYnV0ZS51c2FnZSAhPT0gdW5kZWZpbmVkICkgYnVmZmVyQXR0cmlidXRlLnNldFVzYWdlKCBhdHRyaWJ1dGUudXNhZ2UgKTtcclxuXHJcblx0XHRcdGdlb21ldHJ5LnNldEF0dHJpYnV0ZSgga2V5LCBidWZmZXJBdHRyaWJ1dGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgbW9ycGhBdHRyaWJ1dGVzID0ganNvbi5kYXRhLm1vcnBoQXR0cmlidXRlcztcclxuXHJcblx0XHRpZiAoIG1vcnBoQXR0cmlidXRlcyApIHtcclxuXHJcblx0XHRcdGZvciAoIGNvbnN0IGtleSBpbiBtb3JwaEF0dHJpYnV0ZXMgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGF0dHJpYnV0ZUFycmF5ID0gbW9ycGhBdHRyaWJ1dGVzWyBrZXkgXTtcclxuXHJcblx0XHRcdFx0Y29uc3QgYXJyYXkgPSBbXTtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IGF0dHJpYnV0ZUFycmF5Lmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZUFycmF5WyBpIF07XHJcblx0XHRcdFx0XHRsZXQgYnVmZmVyQXR0cmlidXRlO1xyXG5cclxuXHRcdFx0XHRcdGlmICggYXR0cmlidXRlLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCBpbnRlcmxlYXZlZEJ1ZmZlciA9IGdldEludGVybGVhdmVkQnVmZmVyKCBqc29uLmRhdGEsIGF0dHJpYnV0ZS5kYXRhICk7XHJcblx0XHRcdFx0XHRcdGJ1ZmZlckF0dHJpYnV0ZSA9IG5ldyBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSggaW50ZXJsZWF2ZWRCdWZmZXIsIGF0dHJpYnV0ZS5pdGVtU2l6ZSwgYXR0cmlidXRlLm9mZnNldCwgYXR0cmlidXRlLm5vcm1hbGl6ZWQgKTtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgdHlwZWRBcnJheSA9IGdldFR5cGVkQXJyYXkoIGF0dHJpYnV0ZS50eXBlLCBhdHRyaWJ1dGUuYXJyYXkgKTtcclxuXHRcdFx0XHRcdFx0YnVmZmVyQXR0cmlidXRlID0gbmV3IEJ1ZmZlckF0dHJpYnV0ZSggdHlwZWRBcnJheSwgYXR0cmlidXRlLml0ZW1TaXplLCBhdHRyaWJ1dGUubm9ybWFsaXplZCApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRpZiAoIGF0dHJpYnV0ZS5uYW1lICE9PSB1bmRlZmluZWQgKSBidWZmZXJBdHRyaWJ1dGUubmFtZSA9IGF0dHJpYnV0ZS5uYW1lO1xyXG5cdFx0XHRcdFx0YXJyYXkucHVzaCggYnVmZmVyQXR0cmlidXRlICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Z2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzWyBrZXkgXSA9IGFycmF5O1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBtb3JwaFRhcmdldHNSZWxhdGl2ZSA9IGpzb24uZGF0YS5tb3JwaFRhcmdldHNSZWxhdGl2ZTtcclxuXHJcblx0XHRpZiAoIG1vcnBoVGFyZ2V0c1JlbGF0aXZlICkge1xyXG5cclxuXHRcdFx0Z2VvbWV0cnkubW9ycGhUYXJnZXRzUmVsYXRpdmUgPSB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBncm91cHMgPSBqc29uLmRhdGEuZ3JvdXBzIHx8IGpzb24uZGF0YS5kcmF3Y2FsbHMgfHwganNvbi5kYXRhLm9mZnNldHM7XHJcblxyXG5cdFx0aWYgKCBncm91cHMgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMCwgbiA9IGdyb3Vwcy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGdyb3VwID0gZ3JvdXBzWyBpIF07XHJcblxyXG5cdFx0XHRcdGdlb21ldHJ5LmFkZEdyb3VwKCBncm91cC5zdGFydCwgZ3JvdXAuY291bnQsIGdyb3VwLm1hdGVyaWFsSW5kZXggKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgYm91bmRpbmdTcGhlcmUgPSBqc29uLmRhdGEuYm91bmRpbmdTcGhlcmU7XHJcblxyXG5cdFx0aWYgKCBib3VuZGluZ1NwaGVyZSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Y29uc3QgY2VudGVyID0gbmV3IFZlY3RvcjMoKTtcclxuXHJcblx0XHRcdGlmICggYm91bmRpbmdTcGhlcmUuY2VudGVyICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGNlbnRlci5mcm9tQXJyYXkoIGJvdW5kaW5nU3BoZXJlLmNlbnRlciApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Z2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgPSBuZXcgU3BoZXJlKCBjZW50ZXIsIGJvdW5kaW5nU3BoZXJlLnJhZGl1cyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGpzb24ubmFtZSApIGdlb21ldHJ5Lm5hbWUgPSBqc29uLm5hbWU7XHJcblx0XHRpZiAoIGpzb24udXNlckRhdGEgKSBnZW9tZXRyeS51c2VyRGF0YSA9IGpzb24udXNlckRhdGE7XHJcblxyXG5cdFx0cmV0dXJuIGdlb21ldHJ5O1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBCdWZmZXJHZW9tZXRyeUxvYWRlciB9O1xyXG4iLCJpbXBvcnQge1xyXG5cdFVWTWFwcGluZyxcclxuXHRDdWJlUmVmbGVjdGlvbk1hcHBpbmcsXHJcblx0Q3ViZVJlZnJhY3Rpb25NYXBwaW5nLFxyXG5cdEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nLFxyXG5cdEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nLFxyXG5cdEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nLFxyXG5cclxuXHRSZXBlYXRXcmFwcGluZyxcclxuXHRDbGFtcFRvRWRnZVdyYXBwaW5nLFxyXG5cdE1pcnJvcmVkUmVwZWF0V3JhcHBpbmcsXHJcblxyXG5cdE5lYXJlc3RGaWx0ZXIsXHJcblx0TmVhcmVzdE1pcG1hcE5lYXJlc3RGaWx0ZXIsXHJcblx0TmVhcmVzdE1pcG1hcExpbmVhckZpbHRlcixcclxuXHRMaW5lYXJGaWx0ZXIsXHJcblx0TGluZWFyTWlwbWFwTmVhcmVzdEZpbHRlcixcclxuXHRMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXJcclxufSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcbmltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vbWF0aC9Db2xvci5qcyc7XHJcbmltcG9ydCB7IE9iamVjdDNEIH0gZnJvbSAnLi4vY29yZS9PYmplY3QzRC5qcyc7XHJcbmltcG9ydCB7IEdyb3VwIH0gZnJvbSAnLi4vb2JqZWN0cy9Hcm91cC5qcyc7XHJcbmltcG9ydCB7IEluc3RhbmNlZE1lc2ggfSBmcm9tICcuLi9vYmplY3RzL0luc3RhbmNlZE1lc2guanMnO1xyXG5pbXBvcnQgeyBCYXRjaGVkTWVzaCB9IGZyb20gJy4uL29iamVjdHMvQmF0Y2hlZE1lc2guanMnO1xyXG5pbXBvcnQgeyBTcHJpdGUgfSBmcm9tICcuLi9vYmplY3RzL1Nwcml0ZS5qcyc7XHJcbmltcG9ydCB7IFBvaW50cyB9IGZyb20gJy4uL29iamVjdHMvUG9pbnRzLmpzJztcclxuaW1wb3J0IHsgTGluZSB9IGZyb20gJy4uL29iamVjdHMvTGluZS5qcyc7XHJcbmltcG9ydCB7IExpbmVMb29wIH0gZnJvbSAnLi4vb2JqZWN0cy9MaW5lTG9vcC5qcyc7XHJcbmltcG9ydCB7IExpbmVTZWdtZW50cyB9IGZyb20gJy4uL29iamVjdHMvTGluZVNlZ21lbnRzLmpzJztcclxuaW1wb3J0IHsgTE9EIH0gZnJvbSAnLi4vb2JqZWN0cy9MT0QuanMnO1xyXG5pbXBvcnQgeyBNZXNoIH0gZnJvbSAnLi4vb2JqZWN0cy9NZXNoLmpzJztcclxuaW1wb3J0IHsgU2tpbm5lZE1lc2ggfSBmcm9tICcuLi9vYmplY3RzL1NraW5uZWRNZXNoLmpzJztcclxuaW1wb3J0IHsgQm9uZSB9IGZyb20gJy4uL29iamVjdHMvQm9uZS5qcyc7XHJcbmltcG9ydCB7IFNrZWxldG9uIH0gZnJvbSAnLi4vb2JqZWN0cy9Ta2VsZXRvbi5qcyc7XHJcbmltcG9ydCB7IFNoYXBlIH0gZnJvbSAnLi4vZXh0cmFzL2NvcmUvU2hhcGUuanMnO1xyXG5pbXBvcnQgeyBGb2cgfSBmcm9tICcuLi9zY2VuZXMvRm9nLmpzJztcclxuaW1wb3J0IHsgRm9nRXhwMiB9IGZyb20gJy4uL3NjZW5lcy9Gb2dFeHAyLmpzJztcclxuaW1wb3J0IHsgSGVtaXNwaGVyZUxpZ2h0IH0gZnJvbSAnLi4vbGlnaHRzL0hlbWlzcGhlcmVMaWdodC5qcyc7XHJcbmltcG9ydCB7IFNwb3RMaWdodCB9IGZyb20gJy4uL2xpZ2h0cy9TcG90TGlnaHQuanMnO1xyXG5pbXBvcnQgeyBQb2ludExpZ2h0IH0gZnJvbSAnLi4vbGlnaHRzL1BvaW50TGlnaHQuanMnO1xyXG5pbXBvcnQgeyBEaXJlY3Rpb25hbExpZ2h0IH0gZnJvbSAnLi4vbGlnaHRzL0RpcmVjdGlvbmFsTGlnaHQuanMnO1xyXG5pbXBvcnQgeyBBbWJpZW50TGlnaHQgfSBmcm9tICcuLi9saWdodHMvQW1iaWVudExpZ2h0LmpzJztcclxuaW1wb3J0IHsgUmVjdEFyZWFMaWdodCB9IGZyb20gJy4uL2xpZ2h0cy9SZWN0QXJlYUxpZ2h0LmpzJztcclxuaW1wb3J0IHsgTGlnaHRQcm9iZSB9IGZyb20gJy4uL2xpZ2h0cy9MaWdodFByb2JlLmpzJztcclxuaW1wb3J0IHsgT3J0aG9ncmFwaGljQ2FtZXJhIH0gZnJvbSAnLi4vY2FtZXJhcy9PcnRob2dyYXBoaWNDYW1lcmEuanMnO1xyXG5pbXBvcnQgeyBQZXJzcGVjdGl2ZUNhbWVyYSB9IGZyb20gJy4uL2NhbWVyYXMvUGVyc3BlY3RpdmVDYW1lcmEuanMnO1xyXG5pbXBvcnQgeyBTY2VuZSB9IGZyb20gJy4uL3NjZW5lcy9TY2VuZS5qcyc7XHJcbmltcG9ydCB7IEN1YmVUZXh0dXJlIH0gZnJvbSAnLi4vdGV4dHVyZXMvQ3ViZVRleHR1cmUuanMnO1xyXG5pbXBvcnQgeyBUZXh0dXJlIH0gZnJvbSAnLi4vdGV4dHVyZXMvVGV4dHVyZS5qcyc7XHJcbmltcG9ydCB7IFNvdXJjZSB9IGZyb20gJy4uL3RleHR1cmVzL1NvdXJjZS5qcyc7XHJcbmltcG9ydCB7IERhdGFUZXh0dXJlIH0gZnJvbSAnLi4vdGV4dHVyZXMvRGF0YVRleHR1cmUuanMnO1xyXG5pbXBvcnQgeyBJbWFnZUxvYWRlciB9IGZyb20gJy4vSW1hZ2VMb2FkZXIuanMnO1xyXG5pbXBvcnQgeyBMb2FkaW5nTWFuYWdlciB9IGZyb20gJy4vTG9hZGluZ01hbmFnZXIuanMnO1xyXG5pbXBvcnQgeyBBbmltYXRpb25DbGlwIH0gZnJvbSAnLi4vYW5pbWF0aW9uL0FuaW1hdGlvbkNsaXAuanMnO1xyXG5pbXBvcnQgeyBNYXRlcmlhbExvYWRlciB9IGZyb20gJy4vTWF0ZXJpYWxMb2FkZXIuanMnO1xyXG5pbXBvcnQgeyBMb2FkZXJVdGlscyB9IGZyb20gJy4vTG9hZGVyVXRpbHMuanMnO1xyXG5pbXBvcnQgeyBCdWZmZXJHZW9tZXRyeUxvYWRlciB9IGZyb20gJy4vQnVmZmVyR2VvbWV0cnlMb2FkZXIuanMnO1xyXG5pbXBvcnQgeyBMb2FkZXIgfSBmcm9tICcuL0xvYWRlci5qcyc7XHJcbmltcG9ydCB7IEZpbGVMb2FkZXIgfSBmcm9tICcuL0ZpbGVMb2FkZXIuanMnO1xyXG5pbXBvcnQgKiBhcyBHZW9tZXRyaWVzIGZyb20gJy4uL2dlb21ldHJpZXMvR2VvbWV0cmllcy5qcyc7XHJcbmltcG9ydCB7IGdldFR5cGVkQXJyYXkgfSBmcm9tICcuLi91dGlscy5qcyc7XHJcbmltcG9ydCB7IEJveDMgfSBmcm9tICcuLi9tYXRoL0JveDMuanMnO1xyXG5pbXBvcnQgeyBTcGhlcmUgfSBmcm9tICcuLi9tYXRoL1NwaGVyZS5qcyc7XHJcblxyXG4vKipcclxuICogQSBsb2FkZXIgZm9yIGxvYWRpbmcgYSBKU09OIHJlc291cmNlIGluIHRoZSBbSlNPTiBPYmplY3QvU2NlbmUgZm9ybWF0XXtAbGluayBodHRwczovL2dpdGh1Yi5jb20vbXJkb29iL3RocmVlLmpzL3dpa2kvSlNPTi1PYmplY3QtU2NlbmUtZm9ybWF0LTR9LlxyXG4gKiBUaGUgZmlsZXMgYXJlIGludGVybmFsbHkgbG9hZGVkIHZpYSB7QGxpbmsgRmlsZUxvYWRlcn0uXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGxvYWRlciA9IG5ldyBUSFJFRS5PYmplY3RMb2FkZXIoKTtcclxuICogY29uc3Qgb2JqID0gYXdhaXQgbG9hZGVyLmxvYWRBc3luYyggJ21vZGVscy9qc29uL2V4YW1wbGUuanNvbicgKTtcclxuICogc2NlbmUuYWRkKCBvYmogKTtcclxuICpcclxuICogLy8gQWx0ZXJuYXRpdmVseSwgdG8gcGFyc2UgYSBwcmV2aW91c2x5IGxvYWRlZCBKU09OIHN0cnVjdHVyZVxyXG4gKiBjb25zdCBvYmplY3QgPSBhd2FpdCBsb2FkZXIucGFyc2VBc3luYyggYV9qc29uX29iamVjdCApO1xyXG4gKiBzY2VuZS5hZGQoIG9iamVjdCApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIExvYWRlclxyXG4gKi9cclxuY2xhc3MgT2JqZWN0TG9hZGVyIGV4dGVuZHMgTG9hZGVyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBvYmplY3QgbG9hZGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtMb2FkaW5nTWFuYWdlcn0gW21hbmFnZXJdIC0gVGhlIGxvYWRpbmcgbWFuYWdlci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbWFuYWdlciApIHtcclxuXHJcblx0XHRzdXBlciggbWFuYWdlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFN0YXJ0cyBsb2FkaW5nIGZyb20gdGhlIGdpdmVuIFVSTCBhbmQgcGFzcyB0aGUgbG9hZGVkIDNEIG9iamVjdCB0byB0aGUgYG9uTG9hZCgpYCBjYWxsYmFjay5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSBUaGUgcGF0aC9VUkwgb2YgdGhlIGZpbGUgdG8gYmUgbG9hZGVkLiBUaGlzIGNhbiBhbHNvIGJlIGEgZGF0YSBVUkkuXHJcblx0ICogQHBhcmFtIHtmdW5jdGlvbihPYmplY3QzRCl9IG9uTG9hZCAtIEV4ZWN1dGVkIHdoZW4gdGhlIGxvYWRpbmcgcHJvY2VzcyBoYXMgYmVlbiBmaW5pc2hlZC5cclxuXHQgKiBAcGFyYW0ge29uUHJvZ3Jlc3NDYWxsYmFja30gb25Qcm9ncmVzcyAtIEV4ZWN1dGVkIHdoaWxlIHRoZSBsb2FkaW5nIGlzIGluIHByb2dyZXNzLlxyXG5cdCAqIEBwYXJhbSB7b25FcnJvckNhbGxiYWNrfSBvbkVycm9yIC0gRXhlY3V0ZWQgd2hlbiBlcnJvcnMgb2NjdXIuXHJcblx0ICovXHJcblx0bG9hZCggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XHJcblxyXG5cdFx0Y29uc3Qgc2NvcGUgPSB0aGlzO1xyXG5cclxuXHRcdGNvbnN0IHBhdGggPSAoIHRoaXMucGF0aCA9PT0gJycgKSA/IExvYWRlclV0aWxzLmV4dHJhY3RVcmxCYXNlKCB1cmwgKSA6IHRoaXMucGF0aDtcclxuXHRcdHRoaXMucmVzb3VyY2VQYXRoID0gdGhpcy5yZXNvdXJjZVBhdGggfHwgcGF0aDtcclxuXHJcblx0XHRjb25zdCBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XHJcblx0XHRsb2FkZXIuc2V0UGF0aCggdGhpcy5wYXRoICk7XHJcblx0XHRsb2FkZXIuc2V0UmVxdWVzdEhlYWRlciggdGhpcy5yZXF1ZXN0SGVhZGVyICk7XHJcblx0XHRsb2FkZXIuc2V0V2l0aENyZWRlbnRpYWxzKCB0aGlzLndpdGhDcmVkZW50aWFscyApO1xyXG5cdFx0bG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCB0ZXh0ICkge1xyXG5cclxuXHRcdFx0bGV0IGpzb24gPSBudWxsO1xyXG5cclxuXHRcdFx0dHJ5IHtcclxuXHJcblx0XHRcdFx0anNvbiA9IEpTT04ucGFyc2UoIHRleHQgKTtcclxuXHJcblx0XHRcdH0gY2F0Y2ggKCBlcnJvciApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBvbkVycm9yICE9PSB1bmRlZmluZWQgKSBvbkVycm9yKCBlcnJvciApO1xyXG5cclxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUU6T2JqZWN0TG9hZGVyOiBDYW5cXCd0IHBhcnNlICcgKyB1cmwgKyAnLicsIGVycm9yLm1lc3NhZ2UgKTtcclxuXHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgbWV0YWRhdGEgPSBqc29uLm1ldGFkYXRhO1xyXG5cclxuXHRcdFx0aWYgKCBtZXRhZGF0YSA9PT0gdW5kZWZpbmVkIHx8IG1ldGFkYXRhLnR5cGUgPT09IHVuZGVmaW5lZCB8fCBtZXRhZGF0YS50eXBlLnRvTG93ZXJDYXNlKCkgPT09ICdnZW9tZXRyeScgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggb25FcnJvciAhPT0gdW5kZWZpbmVkICkgb25FcnJvciggbmV3IEVycm9yKCAnVEhSRUUuT2JqZWN0TG9hZGVyOiBDYW5cXCd0IGxvYWQgJyArIHVybCApICk7XHJcblxyXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5PYmplY3RMb2FkZXI6IENhblxcJ3QgbG9hZCAnICsgdXJsICk7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0c2NvcGUucGFyc2UoIGpzb24sIG9uTG9hZCApO1xyXG5cclxuXHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBc3luYyB2ZXJzaW9uIG9mIHtAbGluayBPYmplY3RMb2FkZXIjbG9hZH0uXHJcblx0ICpcclxuXHQgKiBAYXN5bmNcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gVGhlIHBhdGgvVVJMIG9mIHRoZSBmaWxlIHRvIGJlIGxvYWRlZC4gVGhpcyBjYW4gYWxzbyBiZSBhIGRhdGEgVVJJLlxyXG5cdCAqIEBwYXJhbSB7b25Qcm9ncmVzc0NhbGxiYWNrfSBvblByb2dyZXNzIC0gRXhlY3V0ZWQgd2hpbGUgdGhlIGxvYWRpbmcgaXMgaW4gcHJvZ3Jlc3MuXHJcblx0ICogQHJldHVybiB7UHJvbWlzZTxPYmplY3QzRD59IEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGxvYWRlZCAzRCBvYmplY3QuXHJcblx0ICovXHJcblx0YXN5bmMgbG9hZEFzeW5jKCB1cmwsIG9uUHJvZ3Jlc3MgKSB7XHJcblxyXG5cdFx0Y29uc3Qgc2NvcGUgPSB0aGlzO1xyXG5cclxuXHRcdGNvbnN0IHBhdGggPSAoIHRoaXMucGF0aCA9PT0gJycgKSA/IExvYWRlclV0aWxzLmV4dHJhY3RVcmxCYXNlKCB1cmwgKSA6IHRoaXMucGF0aDtcclxuXHRcdHRoaXMucmVzb3VyY2VQYXRoID0gdGhpcy5yZXNvdXJjZVBhdGggfHwgcGF0aDtcclxuXHJcblx0XHRjb25zdCBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XHJcblx0XHRsb2FkZXIuc2V0UGF0aCggdGhpcy5wYXRoICk7XHJcblx0XHRsb2FkZXIuc2V0UmVxdWVzdEhlYWRlciggdGhpcy5yZXF1ZXN0SGVhZGVyICk7XHJcblx0XHRsb2FkZXIuc2V0V2l0aENyZWRlbnRpYWxzKCB0aGlzLndpdGhDcmVkZW50aWFscyApO1xyXG5cclxuXHRcdGNvbnN0IHRleHQgPSBhd2FpdCBsb2FkZXIubG9hZEFzeW5jKCB1cmwsIG9uUHJvZ3Jlc3MgKTtcclxuXHJcblx0XHRjb25zdCBqc29uID0gSlNPTi5wYXJzZSggdGV4dCApO1xyXG5cclxuXHRcdGNvbnN0IG1ldGFkYXRhID0ganNvbi5tZXRhZGF0YTtcclxuXHJcblx0XHRpZiAoIG1ldGFkYXRhID09PSB1bmRlZmluZWQgfHwgbWV0YWRhdGEudHlwZSA9PT0gdW5kZWZpbmVkIHx8IG1ldGFkYXRhLnR5cGUudG9Mb3dlckNhc2UoKSA9PT0gJ2dlb21ldHJ5JyApIHtcclxuXHJcblx0XHRcdHRocm93IG5ldyBFcnJvciggJ1RIUkVFLk9iamVjdExvYWRlcjogQ2FuXFwndCBsb2FkICcgKyB1cmwgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGF3YWl0IHNjb3BlLnBhcnNlQXN5bmMoIGpzb24gKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQYXJzZXMgdGhlIGdpdmVuIEpTT04uIFRoaXMgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHtAbGluayBPYmplY3RMb2FkZXIjbG9hZH1cclxuXHQgKiBidXQgY2FuIGFsc28gYmUgdXNlZCBkaXJlY3RseSB0byBwYXJzZSBhIHByZXZpb3VzbHkgbG9hZGVkIEpTT04gc3RydWN0dXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGpzb24gLSBUaGUgc2VyaWFsaXplZCAzRCBvYmplY3QuXHJcblx0ICogQHBhcmFtIHtvbkxvYWR9IG9uTG9hZCAtIEV4ZWN1dGVkIHdoZW4gYWxsIHJlc291cmNlcyAoZS5nLiB0ZXh0dXJlcykgaGF2ZSBiZWVuIGZ1bGx5IGxvYWRlZC5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3QzRH0gVGhlIHBhcnNlZCAzRCBvYmplY3QuXHJcblx0ICovXHJcblx0cGFyc2UoIGpzb24sIG9uTG9hZCApIHtcclxuXHJcblx0XHRjb25zdCBhbmltYXRpb25zID0gdGhpcy5wYXJzZUFuaW1hdGlvbnMoIGpzb24uYW5pbWF0aW9ucyApO1xyXG5cdFx0Y29uc3Qgc2hhcGVzID0gdGhpcy5wYXJzZVNoYXBlcygganNvbi5zaGFwZXMgKTtcclxuXHRcdGNvbnN0IGdlb21ldHJpZXMgPSB0aGlzLnBhcnNlR2VvbWV0cmllcygganNvbi5nZW9tZXRyaWVzLCBzaGFwZXMgKTtcclxuXHJcblx0XHRjb25zdCBpbWFnZXMgPSB0aGlzLnBhcnNlSW1hZ2VzKCBqc29uLmltYWdlcywgZnVuY3Rpb24gKCkge1xyXG5cclxuXHRcdFx0aWYgKCBvbkxvYWQgIT09IHVuZGVmaW5lZCApIG9uTG9hZCggb2JqZWN0ICk7XHJcblxyXG5cdFx0fSApO1xyXG5cclxuXHRcdGNvbnN0IHRleHR1cmVzID0gdGhpcy5wYXJzZVRleHR1cmVzKCBqc29uLnRleHR1cmVzLCBpbWFnZXMgKTtcclxuXHRcdGNvbnN0IG1hdGVyaWFscyA9IHRoaXMucGFyc2VNYXRlcmlhbHMoIGpzb24ubWF0ZXJpYWxzLCB0ZXh0dXJlcyApO1xyXG5cclxuXHRcdGNvbnN0IG9iamVjdCA9IHRoaXMucGFyc2VPYmplY3QoIGpzb24ub2JqZWN0LCBnZW9tZXRyaWVzLCBtYXRlcmlhbHMsIHRleHR1cmVzLCBhbmltYXRpb25zICk7XHJcblx0XHRjb25zdCBza2VsZXRvbnMgPSB0aGlzLnBhcnNlU2tlbGV0b25zKCBqc29uLnNrZWxldG9ucywgb2JqZWN0ICk7XHJcblxyXG5cdFx0dGhpcy5iaW5kU2tlbGV0b25zKCBvYmplY3QsIHNrZWxldG9ucyApO1xyXG5cdFx0dGhpcy5iaW5kTGlnaHRUYXJnZXRzKCBvYmplY3QgKTtcclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGlmICggb25Mb2FkICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRsZXQgaGFzSW1hZ2VzID0gZmFsc2U7XHJcblxyXG5cdFx0XHRmb3IgKCBjb25zdCB1dWlkIGluIGltYWdlcyApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBpbWFnZXNbIHV1aWQgXS5kYXRhIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCApIHtcclxuXHJcblx0XHRcdFx0XHRoYXNJbWFnZXMgPSB0cnVlO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggaGFzSW1hZ2VzID09PSBmYWxzZSApIG9uTG9hZCggb2JqZWN0ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBvYmplY3Q7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQXN5bmMgdmVyc2lvbiBvZiB7QGxpbmsgT2JqZWN0TG9hZGVyI3BhcnNlfS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBqc29uIC0gVGhlIHNlcmlhbGl6ZWQgM0Qgb2JqZWN0LlxyXG5cdCAqIEByZXR1cm4ge1Byb21pc2U8T2JqZWN0M0Q+fSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBwYXJzZWQgM0Qgb2JqZWN0LlxyXG5cdCAqL1xyXG5cdGFzeW5jIHBhcnNlQXN5bmMoIGpzb24gKSB7XHJcblxyXG5cdFx0Y29uc3QgYW5pbWF0aW9ucyA9IHRoaXMucGFyc2VBbmltYXRpb25zKCBqc29uLmFuaW1hdGlvbnMgKTtcclxuXHRcdGNvbnN0IHNoYXBlcyA9IHRoaXMucGFyc2VTaGFwZXMoIGpzb24uc2hhcGVzICk7XHJcblx0XHRjb25zdCBnZW9tZXRyaWVzID0gdGhpcy5wYXJzZUdlb21ldHJpZXMoIGpzb24uZ2VvbWV0cmllcywgc2hhcGVzICk7XHJcblxyXG5cdFx0Y29uc3QgaW1hZ2VzID0gYXdhaXQgdGhpcy5wYXJzZUltYWdlc0FzeW5jKCBqc29uLmltYWdlcyApO1xyXG5cclxuXHRcdGNvbnN0IHRleHR1cmVzID0gdGhpcy5wYXJzZVRleHR1cmVzKCBqc29uLnRleHR1cmVzLCBpbWFnZXMgKTtcclxuXHRcdGNvbnN0IG1hdGVyaWFscyA9IHRoaXMucGFyc2VNYXRlcmlhbHMoIGpzb24ubWF0ZXJpYWxzLCB0ZXh0dXJlcyApO1xyXG5cclxuXHRcdGNvbnN0IG9iamVjdCA9IHRoaXMucGFyc2VPYmplY3QoIGpzb24ub2JqZWN0LCBnZW9tZXRyaWVzLCBtYXRlcmlhbHMsIHRleHR1cmVzLCBhbmltYXRpb25zICk7XHJcblx0XHRjb25zdCBza2VsZXRvbnMgPSB0aGlzLnBhcnNlU2tlbGV0b25zKCBqc29uLnNrZWxldG9ucywgb2JqZWN0ICk7XHJcblxyXG5cdFx0dGhpcy5iaW5kU2tlbGV0b25zKCBvYmplY3QsIHNrZWxldG9ucyApO1xyXG5cdFx0dGhpcy5iaW5kTGlnaHRUYXJnZXRzKCBvYmplY3QgKTtcclxuXHJcblx0XHRyZXR1cm4gb2JqZWN0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8vIGludGVybmFsc1xyXG5cclxuXHRwYXJzZVNoYXBlcygganNvbiApIHtcclxuXHJcblx0XHRjb25zdCBzaGFwZXMgPSB7fTtcclxuXHJcblx0XHRpZiAoIGpzb24gIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGpzb24ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3Qgc2hhcGUgPSBuZXcgU2hhcGUoKS5mcm9tSlNPTigganNvblsgaSBdICk7XHJcblxyXG5cdFx0XHRcdHNoYXBlc1sgc2hhcGUudXVpZCBdID0gc2hhcGU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBzaGFwZXM7XHJcblxyXG5cdH1cclxuXHJcblx0cGFyc2VTa2VsZXRvbnMoIGpzb24sIG9iamVjdCApIHtcclxuXHJcblx0XHRjb25zdCBza2VsZXRvbnMgPSB7fTtcclxuXHRcdGNvbnN0IGJvbmVzID0ge307XHJcblxyXG5cdFx0Ly8gZ2VuZXJhdGUgYm9uZSBsb29rdXAgdGFibGVcclxuXHJcblx0XHRvYmplY3QudHJhdmVyc2UoIGZ1bmN0aW9uICggY2hpbGQgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGNoaWxkLmlzQm9uZSApIGJvbmVzWyBjaGlsZC51dWlkIF0gPSBjaGlsZDtcclxuXHJcblx0XHR9ICk7XHJcblxyXG5cdFx0Ly8gY3JlYXRlIHNrZWxldG9uc1xyXG5cclxuXHRcdGlmICgganNvbiAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0ganNvbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBza2VsZXRvbiA9IG5ldyBTa2VsZXRvbigpLmZyb21KU09OKCBqc29uWyBpIF0sIGJvbmVzICk7XHJcblxyXG5cdFx0XHRcdHNrZWxldG9uc1sgc2tlbGV0b24udXVpZCBdID0gc2tlbGV0b247XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBza2VsZXRvbnM7XHJcblxyXG5cdH1cclxuXHJcblx0cGFyc2VHZW9tZXRyaWVzKCBqc29uLCBzaGFwZXMgKSB7XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cmllcyA9IHt9O1xyXG5cclxuXHRcdGlmICgganNvbiAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYnVmZmVyR2VvbWV0cnlMb2FkZXIgPSBuZXcgQnVmZmVyR2VvbWV0cnlMb2FkZXIoKTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGpzb24ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0bGV0IGdlb21ldHJ5O1xyXG5cdFx0XHRcdGNvbnN0IGRhdGEgPSBqc29uWyBpIF07XHJcblxyXG5cdFx0XHRcdHN3aXRjaCAoIGRhdGEudHlwZSApIHtcclxuXHJcblx0XHRcdFx0XHRjYXNlICdCdWZmZXJHZW9tZXRyeSc6XHJcblx0XHRcdFx0XHRjYXNlICdJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSc6XHJcblxyXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IGJ1ZmZlckdlb21ldHJ5TG9hZGVyLnBhcnNlKCBkYXRhICk7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdGRlZmF1bHQ6XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIGRhdGEudHlwZSBpbiBHZW9tZXRyaWVzICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRnZW9tZXRyeSA9IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdLmZyb21KU09OKCBkYXRhLCBzaGFwZXMgKTtcclxuXHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGNvbnNvbGUud2FybiggYFRIUkVFLk9iamVjdExvYWRlcjogVW5zdXBwb3J0ZWQgZ2VvbWV0cnkgdHlwZSBcIiR7IGRhdGEudHlwZSB9XCJgICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Z2VvbWV0cnkudXVpZCA9IGRhdGEudXVpZDtcclxuXHJcblx0XHRcdFx0aWYgKCBkYXRhLm5hbWUgIT09IHVuZGVmaW5lZCApIGdlb21ldHJ5Lm5hbWUgPSBkYXRhLm5hbWU7XHJcblx0XHRcdFx0aWYgKCBkYXRhLnVzZXJEYXRhICE9PSB1bmRlZmluZWQgKSBnZW9tZXRyeS51c2VyRGF0YSA9IGRhdGEudXNlckRhdGE7XHJcblxyXG5cdFx0XHRcdGdlb21ldHJpZXNbIGRhdGEudXVpZCBdID0gZ2VvbWV0cnk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBnZW9tZXRyaWVzO1xyXG5cclxuXHR9XHJcblxyXG5cdHBhcnNlTWF0ZXJpYWxzKCBqc29uLCB0ZXh0dXJlcyApIHtcclxuXHJcblx0XHRjb25zdCBjYWNoZSA9IHt9OyAvLyBNdWx0aU1hdGVyaWFsXHJcblx0XHRjb25zdCBtYXRlcmlhbHMgPSB7fTtcclxuXHJcblx0XHRpZiAoIGpzb24gIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGxvYWRlciA9IG5ldyBNYXRlcmlhbExvYWRlcigpO1xyXG5cdFx0XHRsb2FkZXIuc2V0VGV4dHVyZXMoIHRleHR1cmVzICk7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBqc29uLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGRhdGEgPSBqc29uWyBpIF07XHJcblxyXG5cdFx0XHRcdGlmICggY2FjaGVbIGRhdGEudXVpZCBdID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y2FjaGVbIGRhdGEudXVpZCBdID0gbG9hZGVyLnBhcnNlKCBkYXRhICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0bWF0ZXJpYWxzWyBkYXRhLnV1aWQgXSA9IGNhY2hlWyBkYXRhLnV1aWQgXTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG1hdGVyaWFscztcclxuXHJcblx0fVxyXG5cclxuXHRwYXJzZUFuaW1hdGlvbnMoIGpzb24gKSB7XHJcblxyXG5cdFx0Y29uc3QgYW5pbWF0aW9ucyA9IHt9O1xyXG5cclxuXHRcdGlmICgganNvbiAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwganNvbi5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGRhdGEgPSBqc29uWyBpIF07XHJcblxyXG5cdFx0XHRcdGNvbnN0IGNsaXAgPSBBbmltYXRpb25DbGlwLnBhcnNlKCBkYXRhICk7XHJcblxyXG5cdFx0XHRcdGFuaW1hdGlvbnNbIGNsaXAudXVpZCBdID0gY2xpcDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGFuaW1hdGlvbnM7XHJcblxyXG5cdH1cclxuXHJcblx0cGFyc2VJbWFnZXMoIGpzb24sIG9uTG9hZCApIHtcclxuXHJcblx0XHRjb25zdCBzY29wZSA9IHRoaXM7XHJcblx0XHRjb25zdCBpbWFnZXMgPSB7fTtcclxuXHJcblx0XHRsZXQgbG9hZGVyO1xyXG5cclxuXHRcdGZ1bmN0aW9uIGxvYWRJbWFnZSggdXJsICkge1xyXG5cclxuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtU3RhcnQoIHVybCApO1xyXG5cclxuXHRcdFx0cmV0dXJuIGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICgpIHtcclxuXHJcblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcclxuXHJcblx0XHRcdH0sIHVuZGVmaW5lZCwgZnVuY3Rpb24gKCkge1xyXG5cclxuXHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FcnJvciggdXJsICk7XHJcblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcclxuXHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0ZnVuY3Rpb24gZGVzZXJpYWxpemVJbWFnZSggaW1hZ2UgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHR5cGVvZiBpbWFnZSA9PT0gJ3N0cmluZycgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHVybCA9IGltYWdlO1xyXG5cclxuXHRcdFx0XHRjb25zdCBwYXRoID0gL14oXFwvXFwvKXwoW2Etel0rOihcXC9cXC8pPykvaS50ZXN0KCB1cmwgKSA/IHVybCA6IHNjb3BlLnJlc291cmNlUGF0aCArIHVybDtcclxuXHJcblx0XHRcdFx0cmV0dXJuIGxvYWRJbWFnZSggcGF0aCApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0aWYgKCBpbWFnZS5kYXRhICkge1xyXG5cclxuXHRcdFx0XHRcdHJldHVybiB7XHJcblx0XHRcdFx0XHRcdGRhdGE6IGdldFR5cGVkQXJyYXkoIGltYWdlLnR5cGUsIGltYWdlLmRhdGEgKSxcclxuXHRcdFx0XHRcdFx0d2lkdGg6IGltYWdlLndpZHRoLFxyXG5cdFx0XHRcdFx0XHRoZWlnaHQ6IGltYWdlLmhlaWdodFxyXG5cdFx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGpzb24gIT09IHVuZGVmaW5lZCAmJiBqc29uLmxlbmd0aCA+IDAgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBtYW5hZ2VyID0gbmV3IExvYWRpbmdNYW5hZ2VyKCBvbkxvYWQgKTtcclxuXHJcblx0XHRcdGxvYWRlciA9IG5ldyBJbWFnZUxvYWRlciggbWFuYWdlciApO1xyXG5cdFx0XHRsb2FkZXIuc2V0Q3Jvc3NPcmlnaW4oIHRoaXMuY3Jvc3NPcmlnaW4gKTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBqc29uLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBpbWFnZSA9IGpzb25bIGkgXTtcclxuXHRcdFx0XHRjb25zdCB1cmwgPSBpbWFnZS51cmw7XHJcblxyXG5cdFx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggdXJsICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gbG9hZCBhcnJheSBvZiBpbWFnZXMgZS5nIEN1YmVUZXh0dXJlXHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgaW1hZ2VBcnJheSA9IFtdO1xyXG5cclxuXHRcdFx0XHRcdGZvciAoIGxldCBqID0gMCwgamwgPSB1cmwubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCBjdXJyZW50VXJsID0gdXJsWyBqIF07XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCBkZXNlcmlhbGl6ZWRJbWFnZSA9IGRlc2VyaWFsaXplSW1hZ2UoIGN1cnJlbnRVcmwgKTtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggZGVzZXJpYWxpemVkSW1hZ2UgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmICggZGVzZXJpYWxpemVkSW1hZ2UgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50ICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGltYWdlQXJyYXkucHVzaCggZGVzZXJpYWxpemVkSW1hZ2UgKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHQvLyBzcGVjaWFsIGNhc2U6IGhhbmRsZSBhcnJheSBvZiBkYXRhIHRleHR1cmVzIGZvciBjdWJlIHRleHR1cmVzXHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0aW1hZ2VBcnJheS5wdXNoKCBuZXcgRGF0YVRleHR1cmUoIGRlc2VyaWFsaXplZEltYWdlLmRhdGEsIGRlc2VyaWFsaXplZEltYWdlLndpZHRoLCBkZXNlcmlhbGl6ZWRJbWFnZS5oZWlnaHQgKSApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGltYWdlc1sgaW1hZ2UudXVpZCBdID0gbmV3IFNvdXJjZSggaW1hZ2VBcnJheSApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdC8vIGxvYWQgc2luZ2xlIGltYWdlXHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgZGVzZXJpYWxpemVkSW1hZ2UgPSBkZXNlcmlhbGl6ZUltYWdlKCBpbWFnZS51cmwgKTtcclxuXHRcdFx0XHRcdGltYWdlc1sgaW1hZ2UudXVpZCBdID0gbmV3IFNvdXJjZSggZGVzZXJpYWxpemVkSW1hZ2UgKTtcclxuXHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGltYWdlcztcclxuXHJcblx0fVxyXG5cclxuXHRhc3luYyBwYXJzZUltYWdlc0FzeW5jKCBqc29uICkge1xyXG5cclxuXHRcdGNvbnN0IHNjb3BlID0gdGhpcztcclxuXHRcdGNvbnN0IGltYWdlcyA9IHt9O1xyXG5cclxuXHRcdGxldCBsb2FkZXI7XHJcblxyXG5cdFx0YXN5bmMgZnVuY3Rpb24gZGVzZXJpYWxpemVJbWFnZSggaW1hZ2UgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHR5cGVvZiBpbWFnZSA9PT0gJ3N0cmluZycgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHVybCA9IGltYWdlO1xyXG5cclxuXHRcdFx0XHRjb25zdCBwYXRoID0gL14oXFwvXFwvKXwoW2Etel0rOihcXC9cXC8pPykvaS50ZXN0KCB1cmwgKSA/IHVybCA6IHNjb3BlLnJlc291cmNlUGF0aCArIHVybDtcclxuXHJcblx0XHRcdFx0cmV0dXJuIGF3YWl0IGxvYWRlci5sb2FkQXN5bmMoIHBhdGggKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGlmICggaW1hZ2UuZGF0YSApIHtcclxuXHJcblx0XHRcdFx0XHRyZXR1cm4ge1xyXG5cdFx0XHRcdFx0XHRkYXRhOiBnZXRUeXBlZEFycmF5KCBpbWFnZS50eXBlLCBpbWFnZS5kYXRhICksXHJcblx0XHRcdFx0XHRcdHdpZHRoOiBpbWFnZS53aWR0aCxcclxuXHRcdFx0XHRcdFx0aGVpZ2h0OiBpbWFnZS5oZWlnaHRcclxuXHRcdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIG51bGw7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBqc29uICE9PSB1bmRlZmluZWQgJiYganNvbi5sZW5ndGggPiAwICkge1xyXG5cclxuXHRcdFx0bG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCB0aGlzLm1hbmFnZXIgKTtcclxuXHRcdFx0bG9hZGVyLnNldENyb3NzT3JpZ2luKCB0aGlzLmNyb3NzT3JpZ2luICk7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0ganNvbi5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgaW1hZ2UgPSBqc29uWyBpIF07XHJcblx0XHRcdFx0Y29uc3QgdXJsID0gaW1hZ2UudXJsO1xyXG5cclxuXHRcdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHVybCApICkge1xyXG5cclxuXHRcdFx0XHRcdC8vIGxvYWQgYXJyYXkgb2YgaW1hZ2VzIGUuZyBDdWJlVGV4dHVyZVxyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGltYWdlQXJyYXkgPSBbXTtcclxuXHJcblx0XHRcdFx0XHRmb3IgKCBsZXQgaiA9IDAsIGpsID0gdXJsLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgY3VycmVudFVybCA9IHVybFsgaiBdO1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgZGVzZXJpYWxpemVkSW1hZ2UgPSBhd2FpdCBkZXNlcmlhbGl6ZUltYWdlKCBjdXJyZW50VXJsICk7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIGRlc2VyaWFsaXplZEltYWdlICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoIGRlc2VyaWFsaXplZEltYWdlIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRpbWFnZUFycmF5LnB1c2goIGRlc2VyaWFsaXplZEltYWdlICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0Ly8gc3BlY2lhbCBjYXNlOiBoYW5kbGUgYXJyYXkgb2YgZGF0YSB0ZXh0dXJlcyBmb3IgY3ViZSB0ZXh0dXJlc1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGltYWdlQXJyYXkucHVzaCggbmV3IERhdGFUZXh0dXJlKCBkZXNlcmlhbGl6ZWRJbWFnZS5kYXRhLCBkZXNlcmlhbGl6ZWRJbWFnZS53aWR0aCwgZGVzZXJpYWxpemVkSW1hZ2UuaGVpZ2h0ICkgKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRpbWFnZXNbIGltYWdlLnV1aWQgXSA9IG5ldyBTb3VyY2UoIGltYWdlQXJyYXkgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHQvLyBsb2FkIHNpbmdsZSBpbWFnZVxyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGRlc2VyaWFsaXplZEltYWdlID0gYXdhaXQgZGVzZXJpYWxpemVJbWFnZSggaW1hZ2UudXJsICk7XHJcblx0XHRcdFx0XHRpbWFnZXNbIGltYWdlLnV1aWQgXSA9IG5ldyBTb3VyY2UoIGRlc2VyaWFsaXplZEltYWdlICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGltYWdlcztcclxuXHJcblx0fVxyXG5cclxuXHRwYXJzZVRleHR1cmVzKCBqc29uLCBpbWFnZXMgKSB7XHJcblxyXG5cdFx0ZnVuY3Rpb24gcGFyc2VDb25zdGFudCggdmFsdWUsIHR5cGUgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgKSByZXR1cm4gdmFsdWU7XHJcblxyXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXIucGFyc2VUZXh0dXJlOiBDb25zdGFudCBzaG91bGQgYmUgaW4gbnVtZXJpYyBmb3JtLicsIHZhbHVlICk7XHJcblxyXG5cdFx0XHRyZXR1cm4gdHlwZVsgdmFsdWUgXTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZXMgPSB7fTtcclxuXHJcblx0XHRpZiAoIGpzb24gIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGpzb24ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgZGF0YSA9IGpzb25bIGkgXTtcclxuXHJcblx0XHRcdFx0aWYgKCBkYXRhLmltYWdlID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0TG9hZGVyOiBObyBcImltYWdlXCIgc3BlY2lmaWVkIGZvcicsIGRhdGEudXVpZCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICggaW1hZ2VzWyBkYXRhLmltYWdlIF0gPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCBpbWFnZScsIGRhdGEuaW1hZ2UgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRjb25zdCBzb3VyY2UgPSBpbWFnZXNbIGRhdGEuaW1hZ2UgXTtcclxuXHRcdFx0XHRjb25zdCBpbWFnZSA9IHNvdXJjZS5kYXRhO1xyXG5cclxuXHRcdFx0XHRsZXQgdGV4dHVyZTtcclxuXHJcblx0XHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBpbWFnZSApICkge1xyXG5cclxuXHRcdFx0XHRcdHRleHR1cmUgPSBuZXcgQ3ViZVRleHR1cmUoKTtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGltYWdlLmxlbmd0aCA9PT0gNiApIHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdGlmICggaW1hZ2UgJiYgaW1hZ2UuZGF0YSApIHtcclxuXHJcblx0XHRcdFx0XHRcdHRleHR1cmUgPSBuZXcgRGF0YVRleHR1cmUoKTtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0dGV4dHVyZSA9IG5ldyBUZXh0dXJlKCk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGlmICggaW1hZ2UgKSB0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTsgLy8gdGV4dHVyZXMgY2FuIGhhdmUgdW5kZWZpbmVkIGltYWdlIGRhdGFcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR0ZXh0dXJlLnNvdXJjZSA9IHNvdXJjZTtcclxuXHJcblx0XHRcdFx0dGV4dHVyZS51dWlkID0gZGF0YS51dWlkO1xyXG5cclxuXHRcdFx0XHRpZiAoIGRhdGEubmFtZSAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5uYW1lID0gZGF0YS5uYW1lO1xyXG5cclxuXHRcdFx0XHRpZiAoIGRhdGEubWFwcGluZyAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5tYXBwaW5nID0gcGFyc2VDb25zdGFudCggZGF0YS5tYXBwaW5nLCBURVhUVVJFX01BUFBJTkcgKTtcclxuXHRcdFx0XHRpZiAoIGRhdGEuY2hhbm5lbCAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5jaGFubmVsID0gZGF0YS5jaGFubmVsO1xyXG5cclxuXHRcdFx0XHRpZiAoIGRhdGEub2Zmc2V0ICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLm9mZnNldC5mcm9tQXJyYXkoIGRhdGEub2Zmc2V0ICk7XHJcblx0XHRcdFx0aWYgKCBkYXRhLnJlcGVhdCAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5yZXBlYXQuZnJvbUFycmF5KCBkYXRhLnJlcGVhdCApO1xyXG5cdFx0XHRcdGlmICggZGF0YS5jZW50ZXIgIT09IHVuZGVmaW5lZCApIHRleHR1cmUuY2VudGVyLmZyb21BcnJheSggZGF0YS5jZW50ZXIgKTtcclxuXHRcdFx0XHRpZiAoIGRhdGEucm90YXRpb24gIT09IHVuZGVmaW5lZCApIHRleHR1cmUucm90YXRpb24gPSBkYXRhLnJvdGF0aW9uO1xyXG5cclxuXHRcdFx0XHRpZiAoIGRhdGEud3JhcCAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdHRleHR1cmUud3JhcFMgPSBwYXJzZUNvbnN0YW50KCBkYXRhLndyYXBbIDAgXSwgVEVYVFVSRV9XUkFQUElORyApO1xyXG5cdFx0XHRcdFx0dGV4dHVyZS53cmFwVCA9IHBhcnNlQ29uc3RhbnQoIGRhdGEud3JhcFsgMSBdLCBURVhUVVJFX1dSQVBQSU5HICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKCBkYXRhLmZvcm1hdCAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5mb3JtYXQgPSBkYXRhLmZvcm1hdDtcclxuXHRcdFx0XHRpZiAoIGRhdGEuaW50ZXJuYWxGb3JtYXQgIT09IHVuZGVmaW5lZCApIHRleHR1cmUuaW50ZXJuYWxGb3JtYXQgPSBkYXRhLmludGVybmFsRm9ybWF0O1xyXG5cdFx0XHRcdGlmICggZGF0YS50eXBlICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLnR5cGUgPSBkYXRhLnR5cGU7XHJcblx0XHRcdFx0aWYgKCBkYXRhLmNvbG9yU3BhY2UgIT09IHVuZGVmaW5lZCApIHRleHR1cmUuY29sb3JTcGFjZSA9IGRhdGEuY29sb3JTcGFjZTtcclxuXHJcblx0XHRcdFx0aWYgKCBkYXRhLm1pbkZpbHRlciAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5taW5GaWx0ZXIgPSBwYXJzZUNvbnN0YW50KCBkYXRhLm1pbkZpbHRlciwgVEVYVFVSRV9GSUxURVIgKTtcclxuXHRcdFx0XHRpZiAoIGRhdGEubWFnRmlsdGVyICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLm1hZ0ZpbHRlciA9IHBhcnNlQ29uc3RhbnQoIGRhdGEubWFnRmlsdGVyLCBURVhUVVJFX0ZJTFRFUiApO1xyXG5cdFx0XHRcdGlmICggZGF0YS5hbmlzb3Ryb3B5ICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLmFuaXNvdHJvcHkgPSBkYXRhLmFuaXNvdHJvcHk7XHJcblxyXG5cdFx0XHRcdGlmICggZGF0YS5mbGlwWSAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5mbGlwWSA9IGRhdGEuZmxpcFk7XHJcblxyXG5cdFx0XHRcdGlmICggZGF0YS5nZW5lcmF0ZU1pcG1hcHMgIT09IHVuZGVmaW5lZCApIHRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZGF0YS5nZW5lcmF0ZU1pcG1hcHM7XHJcblx0XHRcdFx0aWYgKCBkYXRhLnByZW11bHRpcGx5QWxwaGEgIT09IHVuZGVmaW5lZCApIHRleHR1cmUucHJlbXVsdGlwbHlBbHBoYSA9IGRhdGEucHJlbXVsdGlwbHlBbHBoYTtcclxuXHRcdFx0XHRpZiAoIGRhdGEudW5wYWNrQWxpZ25tZW50ICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLnVucGFja0FsaWdubWVudCA9IGRhdGEudW5wYWNrQWxpZ25tZW50O1xyXG5cdFx0XHRcdGlmICggZGF0YS5jb21wYXJlRnVuY3Rpb24gIT09IHVuZGVmaW5lZCApIHRleHR1cmUuY29tcGFyZUZ1bmN0aW9uID0gZGF0YS5jb21wYXJlRnVuY3Rpb247XHJcblxyXG5cdFx0XHRcdGlmICggZGF0YS51c2VyRGF0YSAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS51c2VyRGF0YSA9IGRhdGEudXNlckRhdGE7XHJcblxyXG5cdFx0XHRcdHRleHR1cmVzWyBkYXRhLnV1aWQgXSA9IHRleHR1cmU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0ZXh0dXJlcztcclxuXHJcblx0fVxyXG5cclxuXHRwYXJzZU9iamVjdCggZGF0YSwgZ2VvbWV0cmllcywgbWF0ZXJpYWxzLCB0ZXh0dXJlcywgYW5pbWF0aW9ucyApIHtcclxuXHJcblx0XHRsZXQgb2JqZWN0O1xyXG5cclxuXHRcdGZ1bmN0aW9uIGdldEdlb21ldHJ5KCBuYW1lICkge1xyXG5cclxuXHRcdFx0aWYgKCBnZW9tZXRyaWVzWyBuYW1lIF0gPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgZ2VvbWV0cnknLCBuYW1lICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gZ2VvbWV0cmllc1sgbmFtZSBdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiBnZXRNYXRlcmlhbCggbmFtZSApIHtcclxuXHJcblx0XHRcdGlmICggbmFtZSA9PT0gdW5kZWZpbmVkICkgcmV0dXJuIHVuZGVmaW5lZDtcclxuXHJcblx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggbmFtZSApICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBhcnJheSA9IFtdO1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBuYW1lLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgdXVpZCA9IG5hbWVbIGkgXTtcclxuXHJcblx0XHRcdFx0XHRpZiAoIG1hdGVyaWFsc1sgdXVpZCBdID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCBtYXRlcmlhbCcsIHV1aWQgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0YXJyYXkucHVzaCggbWF0ZXJpYWxzWyB1dWlkIF0gKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRyZXR1cm4gYXJyYXk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIG1hdGVyaWFsc1sgbmFtZSBdID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIG1hdGVyaWFsJywgbmFtZSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIG1hdGVyaWFsc1sgbmFtZSBdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiBnZXRUZXh0dXJlKCB1dWlkICkge1xyXG5cclxuXHRcdFx0aWYgKCB0ZXh0dXJlc1sgdXVpZCBdID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIHRleHR1cmUnLCB1dWlkICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gdGV4dHVyZXNbIHV1aWQgXTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0bGV0IGdlb21ldHJ5LCBtYXRlcmlhbDtcclxuXHJcblx0XHRzd2l0Y2ggKCBkYXRhLnR5cGUgKSB7XHJcblxyXG5cdFx0XHRjYXNlICdTY2VuZSc6XHJcblxyXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBTY2VuZSgpO1xyXG5cclxuXHRcdFx0XHRpZiAoIGRhdGEuYmFja2dyb3VuZCAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdGlmICggTnVtYmVyLmlzSW50ZWdlciggZGF0YS5iYWNrZ3JvdW5kICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRvYmplY3QuYmFja2dyb3VuZCA9IG5ldyBDb2xvciggZGF0YS5iYWNrZ3JvdW5kICk7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdG9iamVjdC5iYWNrZ3JvdW5kID0gZ2V0VGV4dHVyZSggZGF0YS5iYWNrZ3JvdW5kICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICggZGF0YS5lbnZpcm9ubWVudCAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdG9iamVjdC5lbnZpcm9ubWVudCA9IGdldFRleHR1cmUoIGRhdGEuZW52aXJvbm1lbnQgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoIGRhdGEuZm9nICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBkYXRhLmZvZy50eXBlID09PSAnRm9nJyApIHtcclxuXHJcblx0XHRcdFx0XHRcdG9iamVjdC5mb2cgPSBuZXcgRm9nKCBkYXRhLmZvZy5jb2xvciwgZGF0YS5mb2cubmVhciwgZGF0YS5mb2cuZmFyICk7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIGlmICggZGF0YS5mb2cudHlwZSA9PT0gJ0ZvZ0V4cDInICkge1xyXG5cclxuXHRcdFx0XHRcdFx0b2JqZWN0LmZvZyA9IG5ldyBGb2dFeHAyKCBkYXRhLmZvZy5jb2xvciwgZGF0YS5mb2cuZGVuc2l0eSApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRpZiAoIGRhdGEuZm9nLm5hbWUgIT09ICcnICkge1xyXG5cclxuXHRcdFx0XHRcdFx0b2JqZWN0LmZvZy5uYW1lID0gZGF0YS5mb2cubmFtZTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKCBkYXRhLmJhY2tncm91bmRCbHVycmluZXNzICE9PSB1bmRlZmluZWQgKSBvYmplY3QuYmFja2dyb3VuZEJsdXJyaW5lc3MgPSBkYXRhLmJhY2tncm91bmRCbHVycmluZXNzO1xyXG5cdFx0XHRcdGlmICggZGF0YS5iYWNrZ3JvdW5kSW50ZW5zaXR5ICE9PSB1bmRlZmluZWQgKSBvYmplY3QuYmFja2dyb3VuZEludGVuc2l0eSA9IGRhdGEuYmFja2dyb3VuZEludGVuc2l0eTtcclxuXHRcdFx0XHRpZiAoIGRhdGEuYmFja2dyb3VuZFJvdGF0aW9uICE9PSB1bmRlZmluZWQgKSBvYmplY3QuYmFja2dyb3VuZFJvdGF0aW9uLmZyb21BcnJheSggZGF0YS5iYWNrZ3JvdW5kUm90YXRpb24gKTtcclxuXHJcblx0XHRcdFx0aWYgKCBkYXRhLmVudmlyb25tZW50SW50ZW5zaXR5ICE9PSB1bmRlZmluZWQgKSBvYmplY3QuZW52aXJvbm1lbnRJbnRlbnNpdHkgPSBkYXRhLmVudmlyb25tZW50SW50ZW5zaXR5O1xyXG5cdFx0XHRcdGlmICggZGF0YS5lbnZpcm9ubWVudFJvdGF0aW9uICE9PSB1bmRlZmluZWQgKSBvYmplY3QuZW52aXJvbm1lbnRSb3RhdGlvbi5mcm9tQXJyYXkoIGRhdGEuZW52aXJvbm1lbnRSb3RhdGlvbiApO1xyXG5cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgJ1BlcnNwZWN0aXZlQ2FtZXJhJzpcclxuXHJcblx0XHRcdFx0b2JqZWN0ID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBkYXRhLmZvdiwgZGF0YS5hc3BlY3QsIGRhdGEubmVhciwgZGF0YS5mYXIgKTtcclxuXHJcblx0XHRcdFx0aWYgKCBkYXRhLmZvY3VzICE9PSB1bmRlZmluZWQgKSBvYmplY3QuZm9jdXMgPSBkYXRhLmZvY3VzO1xyXG5cdFx0XHRcdGlmICggZGF0YS56b29tICE9PSB1bmRlZmluZWQgKSBvYmplY3Quem9vbSA9IGRhdGEuem9vbTtcclxuXHRcdFx0XHRpZiAoIGRhdGEuZmlsbUdhdWdlICE9PSB1bmRlZmluZWQgKSBvYmplY3QuZmlsbUdhdWdlID0gZGF0YS5maWxtR2F1Z2U7XHJcblx0XHRcdFx0aWYgKCBkYXRhLmZpbG1PZmZzZXQgIT09IHVuZGVmaW5lZCApIG9iamVjdC5maWxtT2Zmc2V0ID0gZGF0YS5maWxtT2Zmc2V0O1xyXG5cdFx0XHRcdGlmICggZGF0YS52aWV3ICE9PSB1bmRlZmluZWQgKSBvYmplY3QudmlldyA9IE9iamVjdC5hc3NpZ24oIHt9LCBkYXRhLnZpZXcgKTtcclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlICdPcnRob2dyYXBoaWNDYW1lcmEnOlxyXG5cclxuXHRcdFx0XHRvYmplY3QgPSBuZXcgT3J0aG9ncmFwaGljQ2FtZXJhKCBkYXRhLmxlZnQsIGRhdGEucmlnaHQsIGRhdGEudG9wLCBkYXRhLmJvdHRvbSwgZGF0YS5uZWFyLCBkYXRhLmZhciApO1xyXG5cclxuXHRcdFx0XHRpZiAoIGRhdGEuem9vbSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0Lnpvb20gPSBkYXRhLnpvb207XHJcblx0XHRcdFx0aWYgKCBkYXRhLnZpZXcgIT09IHVuZGVmaW5lZCApIG9iamVjdC52aWV3ID0gT2JqZWN0LmFzc2lnbigge30sIGRhdGEudmlldyApO1xyXG5cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgJ0FtYmllbnRMaWdodCc6XHJcblxyXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBBbWJpZW50TGlnaHQoIGRhdGEuY29sb3IsIGRhdGEuaW50ZW5zaXR5ICk7XHJcblxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSAnRGlyZWN0aW9uYWxMaWdodCc6XHJcblxyXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBEaXJlY3Rpb25hbExpZ2h0KCBkYXRhLmNvbG9yLCBkYXRhLmludGVuc2l0eSApO1xyXG5cdFx0XHRcdG9iamVjdC50YXJnZXQgPSBkYXRhLnRhcmdldCB8fCAnJztcclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlICdQb2ludExpZ2h0JzpcclxuXHJcblx0XHRcdFx0b2JqZWN0ID0gbmV3IFBvaW50TGlnaHQoIGRhdGEuY29sb3IsIGRhdGEuaW50ZW5zaXR5LCBkYXRhLmRpc3RhbmNlLCBkYXRhLmRlY2F5ICk7XHJcblxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSAnUmVjdEFyZWFMaWdodCc6XHJcblxyXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBSZWN0QXJlYUxpZ2h0KCBkYXRhLmNvbG9yLCBkYXRhLmludGVuc2l0eSwgZGF0YS53aWR0aCwgZGF0YS5oZWlnaHQgKTtcclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlICdTcG90TGlnaHQnOlxyXG5cclxuXHRcdFx0XHRvYmplY3QgPSBuZXcgU3BvdExpZ2h0KCBkYXRhLmNvbG9yLCBkYXRhLmludGVuc2l0eSwgZGF0YS5kaXN0YW5jZSwgZGF0YS5hbmdsZSwgZGF0YS5wZW51bWJyYSwgZGF0YS5kZWNheSApO1xyXG5cdFx0XHRcdG9iamVjdC50YXJnZXQgPSBkYXRhLnRhcmdldCB8fCAnJztcclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlICdIZW1pc3BoZXJlTGlnaHQnOlxyXG5cclxuXHRcdFx0XHRvYmplY3QgPSBuZXcgSGVtaXNwaGVyZUxpZ2h0KCBkYXRhLmNvbG9yLCBkYXRhLmdyb3VuZENvbG9yLCBkYXRhLmludGVuc2l0eSApO1xyXG5cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgJ0xpZ2h0UHJvYmUnOlxyXG5cclxuXHRcdFx0XHRvYmplY3QgPSBuZXcgTGlnaHRQcm9iZSgpLmZyb21KU09OKCBkYXRhICk7XHJcblxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSAnU2tpbm5lZE1lc2gnOlxyXG5cclxuXHRcdFx0XHRnZW9tZXRyeSA9IGdldEdlb21ldHJ5KCBkYXRhLmdlb21ldHJ5ICk7XHJcblx0XHRcdCBcdG1hdGVyaWFsID0gZ2V0TWF0ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKTtcclxuXHJcblx0XHRcdFx0b2JqZWN0ID0gbmV3IFNraW5uZWRNZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuXHJcblx0XHRcdFx0aWYgKCBkYXRhLmJpbmRNb2RlICE9PSB1bmRlZmluZWQgKSBvYmplY3QuYmluZE1vZGUgPSBkYXRhLmJpbmRNb2RlO1xyXG5cdFx0XHRcdGlmICggZGF0YS5iaW5kTWF0cml4ICE9PSB1bmRlZmluZWQgKSBvYmplY3QuYmluZE1hdHJpeC5mcm9tQXJyYXkoIGRhdGEuYmluZE1hdHJpeCApO1xyXG5cdFx0XHRcdGlmICggZGF0YS5za2VsZXRvbiAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnNrZWxldG9uID0gZGF0YS5za2VsZXRvbjtcclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlICdNZXNoJzpcclxuXHJcblx0XHRcdFx0Z2VvbWV0cnkgPSBnZXRHZW9tZXRyeSggZGF0YS5nZW9tZXRyeSApO1xyXG5cdFx0XHRcdG1hdGVyaWFsID0gZ2V0TWF0ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKTtcclxuXHJcblx0XHRcdFx0b2JqZWN0ID0gbmV3IE1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG5cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgJ0luc3RhbmNlZE1lc2gnOlxyXG5cclxuXHRcdFx0XHRnZW9tZXRyeSA9IGdldEdlb21ldHJ5KCBkYXRhLmdlb21ldHJ5ICk7XHJcblx0XHRcdFx0bWF0ZXJpYWwgPSBnZXRNYXRlcmlhbCggZGF0YS5tYXRlcmlhbCApO1xyXG5cdFx0XHRcdGNvbnN0IGNvdW50ID0gZGF0YS5jb3VudDtcclxuXHRcdFx0XHRjb25zdCBpbnN0YW5jZU1hdHJpeCA9IGRhdGEuaW5zdGFuY2VNYXRyaXg7XHJcblx0XHRcdFx0Y29uc3QgaW5zdGFuY2VDb2xvciA9IGRhdGEuaW5zdGFuY2VDb2xvcjtcclxuXHJcblx0XHRcdFx0b2JqZWN0ID0gbmV3IEluc3RhbmNlZE1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCwgY291bnQgKTtcclxuXHRcdFx0XHRvYmplY3QuaW5zdGFuY2VNYXRyaXggPSBuZXcgSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlKCBuZXcgRmxvYXQzMkFycmF5KCBpbnN0YW5jZU1hdHJpeC5hcnJheSApLCAxNiApO1xyXG5cdFx0XHRcdGlmICggaW5zdGFuY2VDb2xvciAhPT0gdW5kZWZpbmVkICkgb2JqZWN0Lmluc3RhbmNlQ29sb3IgPSBuZXcgSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlKCBuZXcgRmxvYXQzMkFycmF5KCBpbnN0YW5jZUNvbG9yLmFycmF5ICksIGluc3RhbmNlQ29sb3IuaXRlbVNpemUgKTtcclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlICdCYXRjaGVkTWVzaCc6XHJcblxyXG5cdFx0XHRcdGdlb21ldHJ5ID0gZ2V0R2VvbWV0cnkoIGRhdGEuZ2VvbWV0cnkgKTtcclxuXHRcdFx0XHRtYXRlcmlhbCA9IGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICk7XHJcblxyXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBCYXRjaGVkTWVzaCggZGF0YS5tYXhJbnN0YW5jZUNvdW50LCBkYXRhLm1heFZlcnRleENvdW50LCBkYXRhLm1heEluZGV4Q291bnQsIG1hdGVyaWFsICk7XHJcblx0XHRcdFx0b2JqZWN0Lmdlb21ldHJ5ID0gZ2VvbWV0cnk7XHJcblx0XHRcdFx0b2JqZWN0LnBlck9iamVjdEZydXN0dW1DdWxsZWQgPSBkYXRhLnBlck9iamVjdEZydXN0dW1DdWxsZWQ7XHJcblx0XHRcdFx0b2JqZWN0LnNvcnRPYmplY3RzID0gZGF0YS5zb3J0T2JqZWN0cztcclxuXHJcblx0XHRcdFx0b2JqZWN0Ll9kcmF3UmFuZ2VzID0gZGF0YS5kcmF3UmFuZ2VzO1xyXG5cdFx0XHRcdG9iamVjdC5fcmVzZXJ2ZWRSYW5nZXMgPSBkYXRhLnJlc2VydmVkUmFuZ2VzO1xyXG5cclxuXHRcdFx0XHRvYmplY3QuX3Zpc2liaWxpdHkgPSBkYXRhLnZpc2liaWxpdHk7XHJcblx0XHRcdFx0b2JqZWN0Ll9hY3RpdmUgPSBkYXRhLmFjdGl2ZTtcclxuXHRcdFx0XHRvYmplY3QuX2JvdW5kcyA9IGRhdGEuYm91bmRzLm1hcCggYm91bmQgPT4ge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGJveCA9IG5ldyBCb3gzKCk7XHJcblx0XHRcdFx0XHRib3gubWluLmZyb21BcnJheSggYm91bmQuYm94TWluICk7XHJcblx0XHRcdFx0XHRib3gubWF4LmZyb21BcnJheSggYm91bmQuYm94TWF4ICk7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3Qgc3BoZXJlID0gbmV3IFNwaGVyZSgpO1xyXG5cdFx0XHRcdFx0c3BoZXJlLnJhZGl1cyA9IGJvdW5kLnNwaGVyZVJhZGl1cztcclxuXHRcdFx0XHRcdHNwaGVyZS5jZW50ZXIuZnJvbUFycmF5KCBib3VuZC5zcGhlcmVDZW50ZXIgKTtcclxuXHJcblx0XHRcdFx0XHRyZXR1cm4ge1xyXG5cdFx0XHRcdFx0XHRib3hJbml0aWFsaXplZDogYm91bmQuYm94SW5pdGlhbGl6ZWQsXHJcblx0XHRcdFx0XHRcdGJveDogYm94LFxyXG5cclxuXHRcdFx0XHRcdFx0c3BoZXJlSW5pdGlhbGl6ZWQ6IGJvdW5kLnNwaGVyZUluaXRpYWxpemVkLFxyXG5cdFx0XHRcdFx0XHRzcGhlcmU6IHNwaGVyZVxyXG5cdFx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0fSApO1xyXG5cclxuXHRcdFx0XHRvYmplY3QuX21heEluc3RhbmNlQ291bnQgPSBkYXRhLm1heEluc3RhbmNlQ291bnQ7XHJcblx0XHRcdFx0b2JqZWN0Ll9tYXhWZXJ0ZXhDb3VudCA9IGRhdGEubWF4VmVydGV4Q291bnQ7XHJcblx0XHRcdFx0b2JqZWN0Ll9tYXhJbmRleENvdW50ID0gZGF0YS5tYXhJbmRleENvdW50O1xyXG5cclxuXHRcdFx0XHRvYmplY3QuX2dlb21ldHJ5SW5pdGlhbGl6ZWQgPSBkYXRhLmdlb21ldHJ5SW5pdGlhbGl6ZWQ7XHJcblx0XHRcdFx0b2JqZWN0Ll9nZW9tZXRyeUNvdW50ID0gZGF0YS5nZW9tZXRyeUNvdW50O1xyXG5cclxuXHRcdFx0XHRvYmplY3QuX21hdHJpY2VzVGV4dHVyZSA9IGdldFRleHR1cmUoIGRhdGEubWF0cmljZXNUZXh0dXJlLnV1aWQgKTtcclxuXHRcdFx0XHRpZiAoIGRhdGEuY29sb3JzVGV4dHVyZSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0Ll9jb2xvcnNUZXh0dXJlID0gZ2V0VGV4dHVyZSggZGF0YS5jb2xvcnNUZXh0dXJlLnV1aWQgKTtcclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlICdMT0QnOlxyXG5cclxuXHRcdFx0XHRvYmplY3QgPSBuZXcgTE9EKCk7XHJcblxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSAnTGluZSc6XHJcblxyXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBMaW5lKCBnZXRHZW9tZXRyeSggZGF0YS5nZW9tZXRyeSApLCBnZXRNYXRlcmlhbCggZGF0YS5tYXRlcmlhbCApICk7XHJcblxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSAnTGluZUxvb3AnOlxyXG5cclxuXHRcdFx0XHRvYmplY3QgPSBuZXcgTGluZUxvb3AoIGdldEdlb21ldHJ5KCBkYXRhLmdlb21ldHJ5ICksIGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICkgKTtcclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlICdMaW5lU2VnbWVudHMnOlxyXG5cclxuXHRcdFx0XHRvYmplY3QgPSBuZXcgTGluZVNlZ21lbnRzKCBnZXRHZW9tZXRyeSggZGF0YS5nZW9tZXRyeSApLCBnZXRNYXRlcmlhbCggZGF0YS5tYXRlcmlhbCApICk7XHJcblxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSAnUG9pbnRDbG91ZCc6XHJcblx0XHRcdGNhc2UgJ1BvaW50cyc6XHJcblxyXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBQb2ludHMoIGdldEdlb21ldHJ5KCBkYXRhLmdlb21ldHJ5ICksIGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICkgKTtcclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlICdTcHJpdGUnOlxyXG5cclxuXHRcdFx0XHRvYmplY3QgPSBuZXcgU3ByaXRlKCBnZXRNYXRlcmlhbCggZGF0YS5tYXRlcmlhbCApICk7XHJcblxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSAnR3JvdXAnOlxyXG5cclxuXHRcdFx0XHRvYmplY3QgPSBuZXcgR3JvdXAoKTtcclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlICdCb25lJzpcclxuXHJcblx0XHRcdFx0b2JqZWN0ID0gbmV3IEJvbmUoKTtcclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRkZWZhdWx0OlxyXG5cclxuXHRcdFx0XHRvYmplY3QgPSBuZXcgT2JqZWN0M0QoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0b2JqZWN0LnV1aWQgPSBkYXRhLnV1aWQ7XHJcblxyXG5cdFx0aWYgKCBkYXRhLm5hbWUgIT09IHVuZGVmaW5lZCApIG9iamVjdC5uYW1lID0gZGF0YS5uYW1lO1xyXG5cclxuXHRcdGlmICggZGF0YS5tYXRyaXggIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdG9iamVjdC5tYXRyaXguZnJvbUFycmF5KCBkYXRhLm1hdHJpeCApO1xyXG5cclxuXHRcdFx0aWYgKCBkYXRhLm1hdHJpeEF1dG9VcGRhdGUgIT09IHVuZGVmaW5lZCApIG9iamVjdC5tYXRyaXhBdXRvVXBkYXRlID0gZGF0YS5tYXRyaXhBdXRvVXBkYXRlO1xyXG5cdFx0XHRpZiAoIG9iamVjdC5tYXRyaXhBdXRvVXBkYXRlICkgb2JqZWN0Lm1hdHJpeC5kZWNvbXBvc2UoIG9iamVjdC5wb3NpdGlvbiwgb2JqZWN0LnF1YXRlcm5pb24sIG9iamVjdC5zY2FsZSApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRpZiAoIGRhdGEucG9zaXRpb24gIT09IHVuZGVmaW5lZCApIG9iamVjdC5wb3NpdGlvbi5mcm9tQXJyYXkoIGRhdGEucG9zaXRpb24gKTtcclxuXHRcdFx0aWYgKCBkYXRhLnJvdGF0aW9uICE9PSB1bmRlZmluZWQgKSBvYmplY3Qucm90YXRpb24uZnJvbUFycmF5KCBkYXRhLnJvdGF0aW9uICk7XHJcblx0XHRcdGlmICggZGF0YS5xdWF0ZXJuaW9uICE9PSB1bmRlZmluZWQgKSBvYmplY3QucXVhdGVybmlvbi5mcm9tQXJyYXkoIGRhdGEucXVhdGVybmlvbiApO1xyXG5cdFx0XHRpZiAoIGRhdGEuc2NhbGUgIT09IHVuZGVmaW5lZCApIG9iamVjdC5zY2FsZS5mcm9tQXJyYXkoIGRhdGEuc2NhbGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBkYXRhLnVwICE9PSB1bmRlZmluZWQgKSBvYmplY3QudXAuZnJvbUFycmF5KCBkYXRhLnVwICk7XHJcblxyXG5cdFx0aWYgKCBkYXRhLmNhc3RTaGFkb3cgIT09IHVuZGVmaW5lZCApIG9iamVjdC5jYXN0U2hhZG93ID0gZGF0YS5jYXN0U2hhZG93O1xyXG5cdFx0aWYgKCBkYXRhLnJlY2VpdmVTaGFkb3cgIT09IHVuZGVmaW5lZCApIG9iamVjdC5yZWNlaXZlU2hhZG93ID0gZGF0YS5yZWNlaXZlU2hhZG93O1xyXG5cclxuXHRcdGlmICggZGF0YS5zaGFkb3cgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGRhdGEuc2hhZG93LmludGVuc2l0eSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnNoYWRvdy5pbnRlbnNpdHkgPSBkYXRhLnNoYWRvdy5pbnRlbnNpdHk7XHJcblx0XHRcdGlmICggZGF0YS5zaGFkb3cuYmlhcyAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnNoYWRvdy5iaWFzID0gZGF0YS5zaGFkb3cuYmlhcztcclxuXHRcdFx0aWYgKCBkYXRhLnNoYWRvdy5ub3JtYWxCaWFzICE9PSB1bmRlZmluZWQgKSBvYmplY3Quc2hhZG93Lm5vcm1hbEJpYXMgPSBkYXRhLnNoYWRvdy5ub3JtYWxCaWFzO1xyXG5cdFx0XHRpZiAoIGRhdGEuc2hhZG93LnJhZGl1cyAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnNoYWRvdy5yYWRpdXMgPSBkYXRhLnNoYWRvdy5yYWRpdXM7XHJcblx0XHRcdGlmICggZGF0YS5zaGFkb3cubWFwU2l6ZSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnNoYWRvdy5tYXBTaXplLmZyb21BcnJheSggZGF0YS5zaGFkb3cubWFwU2l6ZSApO1xyXG5cdFx0XHRpZiAoIGRhdGEuc2hhZG93LmNhbWVyYSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnNoYWRvdy5jYW1lcmEgPSB0aGlzLnBhcnNlT2JqZWN0KCBkYXRhLnNoYWRvdy5jYW1lcmEgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBkYXRhLnZpc2libGUgIT09IHVuZGVmaW5lZCApIG9iamVjdC52aXNpYmxlID0gZGF0YS52aXNpYmxlO1xyXG5cdFx0aWYgKCBkYXRhLmZydXN0dW1DdWxsZWQgIT09IHVuZGVmaW5lZCApIG9iamVjdC5mcnVzdHVtQ3VsbGVkID0gZGF0YS5mcnVzdHVtQ3VsbGVkO1xyXG5cdFx0aWYgKCBkYXRhLnJlbmRlck9yZGVyICE9PSB1bmRlZmluZWQgKSBvYmplY3QucmVuZGVyT3JkZXIgPSBkYXRhLnJlbmRlck9yZGVyO1xyXG5cdFx0aWYgKCBkYXRhLnVzZXJEYXRhICE9PSB1bmRlZmluZWQgKSBvYmplY3QudXNlckRhdGEgPSBkYXRhLnVzZXJEYXRhO1xyXG5cdFx0aWYgKCBkYXRhLmxheWVycyAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmxheWVycy5tYXNrID0gZGF0YS5sYXllcnM7XHJcblxyXG5cdFx0aWYgKCBkYXRhLmNoaWxkcmVuICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBjaGlsZHJlbiA9IGRhdGEuY2hpbGRyZW47XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdG9iamVjdC5hZGQoIHRoaXMucGFyc2VPYmplY3QoIGNoaWxkcmVuWyBpIF0sIGdlb21ldHJpZXMsIG1hdGVyaWFscywgdGV4dHVyZXMsIGFuaW1hdGlvbnMgKSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGRhdGEuYW5pbWF0aW9ucyAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgb2JqZWN0QW5pbWF0aW9ucyA9IGRhdGEuYW5pbWF0aW9ucztcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IG9iamVjdEFuaW1hdGlvbnMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB1dWlkID0gb2JqZWN0QW5pbWF0aW9uc1sgaSBdO1xyXG5cclxuXHRcdFx0XHRvYmplY3QuYW5pbWF0aW9ucy5wdXNoKCBhbmltYXRpb25zWyB1dWlkIF0gKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBkYXRhLnR5cGUgPT09ICdMT0QnICkge1xyXG5cclxuXHRcdFx0aWYgKCBkYXRhLmF1dG9VcGRhdGUgIT09IHVuZGVmaW5lZCApIG9iamVjdC5hdXRvVXBkYXRlID0gZGF0YS5hdXRvVXBkYXRlO1xyXG5cclxuXHRcdFx0Y29uc3QgbGV2ZWxzID0gZGF0YS5sZXZlbHM7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgbCA9IDA7IGwgPCBsZXZlbHMubGVuZ3RoOyBsICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBsZXZlbCA9IGxldmVsc1sgbCBdO1xyXG5cdFx0XHRcdGNvbnN0IGNoaWxkID0gb2JqZWN0LmdldE9iamVjdEJ5UHJvcGVydHkoICd1dWlkJywgbGV2ZWwub2JqZWN0ICk7XHJcblxyXG5cdFx0XHRcdGlmICggY2hpbGQgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRvYmplY3QuYWRkTGV2ZWwoIGNoaWxkLCBsZXZlbC5kaXN0YW5jZSwgbGV2ZWwuaHlzdGVyZXNpcyApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBvYmplY3Q7XHJcblxyXG5cdH1cclxuXHJcblx0YmluZFNrZWxldG9ucyggb2JqZWN0LCBza2VsZXRvbnMgKSB7XHJcblxyXG5cdFx0aWYgKCBPYmplY3Qua2V5cyggc2tlbGV0b25zICkubGVuZ3RoID09PSAwICkgcmV0dXJuO1xyXG5cclxuXHRcdG9iamVjdC50cmF2ZXJzZSggZnVuY3Rpb24gKCBjaGlsZCApIHtcclxuXHJcblx0XHRcdGlmICggY2hpbGQuaXNTa2lubmVkTWVzaCA9PT0gdHJ1ZSAmJiBjaGlsZC5za2VsZXRvbiAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBza2VsZXRvbiA9IHNrZWxldG9uc1sgY2hpbGQuc2tlbGV0b24gXTtcclxuXHJcblx0XHRcdFx0aWYgKCBza2VsZXRvbiA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlcjogTm8gc2tlbGV0b24gZm91bmQgd2l0aCBVVUlEOicsIGNoaWxkLnNrZWxldG9uICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0Y2hpbGQuYmluZCggc2tlbGV0b24sIGNoaWxkLmJpbmRNYXRyaXggKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gKTtcclxuXHJcblx0fVxyXG5cclxuXHRiaW5kTGlnaHRUYXJnZXRzKCBvYmplY3QgKSB7XHJcblxyXG5cdFx0b2JqZWN0LnRyYXZlcnNlKCBmdW5jdGlvbiAoIGNoaWxkICkge1xyXG5cclxuXHRcdFx0aWYgKCBjaGlsZC5pc0RpcmVjdGlvbmFsTGlnaHQgfHwgY2hpbGQuaXNTcG90TGlnaHQgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHV1aWQgPSBjaGlsZC50YXJnZXQ7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHRhcmdldCA9IG9iamVjdC5nZXRPYmplY3RCeVByb3BlcnR5KCAndXVpZCcsIHV1aWQgKTtcclxuXHJcblx0XHRcdFx0aWYgKCB0YXJnZXQgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRjaGlsZC50YXJnZXQgPSB0YXJnZXQ7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0Y2hpbGQudGFyZ2V0ID0gbmV3IE9iamVjdDNEKCk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9ICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmNvbnN0IFRFWFRVUkVfTUFQUElORyA9IHtcclxuXHRVVk1hcHBpbmc6IFVWTWFwcGluZyxcclxuXHRDdWJlUmVmbGVjdGlvbk1hcHBpbmc6IEN1YmVSZWZsZWN0aW9uTWFwcGluZyxcclxuXHRDdWJlUmVmcmFjdGlvbk1hcHBpbmc6IEN1YmVSZWZyYWN0aW9uTWFwcGluZyxcclxuXHRFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZzogRXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmcsXHJcblx0RXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmc6IEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nLFxyXG5cdEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nOiBDdWJlVVZSZWZsZWN0aW9uTWFwcGluZ1xyXG59O1xyXG5cclxuY29uc3QgVEVYVFVSRV9XUkFQUElORyA9IHtcclxuXHRSZXBlYXRXcmFwcGluZzogUmVwZWF0V3JhcHBpbmcsXHJcblx0Q2xhbXBUb0VkZ2VXcmFwcGluZzogQ2xhbXBUb0VkZ2VXcmFwcGluZyxcclxuXHRNaXJyb3JlZFJlcGVhdFdyYXBwaW5nOiBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nXHJcbn07XHJcblxyXG5jb25zdCBURVhUVVJFX0ZJTFRFUiA9IHtcclxuXHROZWFyZXN0RmlsdGVyOiBOZWFyZXN0RmlsdGVyLFxyXG5cdE5lYXJlc3RNaXBtYXBOZWFyZXN0RmlsdGVyOiBOZWFyZXN0TWlwbWFwTmVhcmVzdEZpbHRlcixcclxuXHROZWFyZXN0TWlwbWFwTGluZWFyRmlsdGVyOiBOZWFyZXN0TWlwbWFwTGluZWFyRmlsdGVyLFxyXG5cdExpbmVhckZpbHRlcjogTGluZWFyRmlsdGVyLFxyXG5cdExpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXI6IExpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXIsXHJcblx0TGluZWFyTWlwbWFwTGluZWFyRmlsdGVyOiBMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXJcclxufTtcclxuXHJcbmV4cG9ydCB7IE9iamVjdExvYWRlciB9O1xyXG4iLCJpbXBvcnQgeyBDYWNoZSB9IGZyb20gJy4vQ2FjaGUuanMnO1xyXG5pbXBvcnQgeyBMb2FkZXIgfSBmcm9tICcuL0xvYWRlci5qcyc7XHJcblxyXG4vKipcclxuICogQSBsb2FkZXIgZm9yIGxvYWRpbmcgaW1hZ2VzIGFzIGFuIFtJbWFnZUJpdG1hcF17QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0ltYWdlQml0bWFwfS5cclxuICogQW4gYEltYWdlQml0bWFwYCBwcm92aWRlcyBhbiBhc3luY2hyb25vdXMgYW5kIHJlc291cmNlIGVmZmljaWVudCBwYXRod2F5IHRvIHByZXBhcmVcclxuICogdGV4dHVyZXMgZm9yIHJlbmRlcmluZy5cclxuICpcclxuICogTm90ZSB0aGF0IHtAbGluayBUZXh0dXJlI2ZsaXBZfSBhbmQge0BsaW5rIFRleHR1cmUjcHJlbXVsdGlwbHlBbHBoYX0gYXJlIGlnbm9yZWQgd2l0aCBpbWFnZSBiaXRtYXBzLlxyXG4gKiBUaGV5IG5lZWRzIHRoZXNlIGNvbmZpZ3VyYXRpb24gb24gYml0bWFwIGNyZWF0aW9uIHVubGlrZSByZWd1bGFyIGltYWdlcyBuZWVkIHRoZW0gb24gdXBsb2FkaW5nIHRvIEdQVS5cclxuICpcclxuICogWW91IG5lZWQgdG8gc2V0IHRoZSBlcXVpdmFsZW50IG9wdGlvbnMgdmlhIHtAbGluayBJbWFnZUJpdG1hcExvYWRlciNzZXRPcHRpb25zfSBpbnN0ZWFkLlxyXG4gKlxyXG4gKiBBbHNvIG5vdGUgdGhhdCB1bmxpa2Uge0BsaW5rIEZpbGVMb2FkZXJ9LCB0aGlzIGxvYWRlciBkb2VzIG5vdCBhdm9pZCBtdWx0aXBsZSBjb25jdXJyZW50IHJlcXVlc3RzIHRvIHRoZSBzYW1lIFVSTC5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgbG9hZGVyID0gbmV3IFRIUkVFLkltYWdlQml0bWFwTG9hZGVyKCk7XHJcbiAqIGxvYWRlci5zZXRPcHRpb25zKCB7IGltYWdlT3JpZW50YXRpb246ICdmbGlwWScgfSApOyAvLyBzZXQgb3B0aW9ucyBpZiBuZWVkZWRcclxuICogY29uc3QgaW1hZ2VCaXRtYXAgPSBhd2FpdCBsb2FkZXIubG9hZEFzeW5jKCAnaW1hZ2UucG5nJyApO1xyXG4gKlxyXG4gKiBjb25zdCB0ZXh0dXJlID0gbmV3IFRIUkVFLlRleHR1cmUoIGltYWdlQml0bWFwICk7XHJcbiAqIHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIExvYWRlclxyXG4gKi9cclxuY2xhc3MgSW1hZ2VCaXRtYXBMb2FkZXIgZXh0ZW5kcyBMb2FkZXIge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGltYWdlIGJpdG1hcCBsb2FkZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0xvYWRpbmdNYW5hZ2VyfSBbbWFuYWdlcl0gLSBUaGUgbG9hZGluZyBtYW5hZ2VyLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBtYW5hZ2VyICkge1xyXG5cclxuXHRcdHN1cGVyKCBtYW5hZ2VyICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzSW1hZ2VCaXRtYXBMb2FkZXIgPSB0cnVlO1xyXG5cclxuXHRcdGlmICggdHlwZW9mIGNyZWF0ZUltYWdlQml0bWFwID09PSAndW5kZWZpbmVkJyApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkltYWdlQml0bWFwTG9hZGVyOiBjcmVhdGVJbWFnZUJpdG1hcCgpIG5vdCBzdXBwb3J0ZWQuJyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHR5cGVvZiBmZXRjaCA9PT0gJ3VuZGVmaW5lZCcgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5JbWFnZUJpdG1hcExvYWRlcjogZmV0Y2goKSBub3Qgc3VwcG9ydGVkLicgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXByZXNlbnRzIHRoZSBsb2FkZXIgb3B0aW9ucy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICogQGRlZmF1bHQge3ByZW11bHRpcGx5QWxwaGE6J25vbmUnfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm9wdGlvbnMgPSB7IHByZW11bHRpcGx5QWxwaGE6ICdub25lJyB9O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGdpdmVuIGxvYWRlciBvcHRpb25zLiBUaGUgc3RydWN0dXJlIG9mIHRoZSBvYmplY3QgbXVzdCBtYXRjaCB0aGUgYG9wdGlvbnNgIHBhcmFtZXRlciBvZlxyXG5cdCAqIFtjcmVhdGVJbWFnZUJpdG1hcF17QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dpbmRvdy9jcmVhdGVJbWFnZUJpdG1hcH0uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIFRoZSBsb2FkZXIgb3B0aW9ucyB0byBzZXQuXHJcblx0ICogQHJldHVybiB7SW1hZ2VCaXRtYXBMb2FkZXJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW1hZ2UgYml0bWFwIGxvYWRlci5cclxuXHQgKi9cclxuXHRzZXRPcHRpb25zKCBvcHRpb25zICkge1xyXG5cclxuXHRcdHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3RhcnRzIGxvYWRpbmcgZnJvbSB0aGUgZ2l2ZW4gVVJMIGFuZCBwYXNzIHRoZSBsb2FkZWQgaW1hZ2UgYml0bWFwIHRvIHRoZSBgb25Mb2FkKClgIGNhbGxiYWNrLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIFRoZSBwYXRoL1VSTCBvZiB0aGUgZmlsZSB0byBiZSBsb2FkZWQuIFRoaXMgY2FuIGFsc28gYmUgYSBkYXRhIFVSSS5cclxuXHQgKiBAcGFyYW0ge2Z1bmN0aW9uKEltYWdlQml0bWFwKX0gb25Mb2FkIC0gRXhlY3V0ZWQgd2hlbiB0aGUgbG9hZGluZyBwcm9jZXNzIGhhcyBiZWVuIGZpbmlzaGVkLlxyXG5cdCAqIEBwYXJhbSB7b25Qcm9ncmVzc0NhbGxiYWNrfSBvblByb2dyZXNzIC0gVW5zdXBwb3J0ZWQgaW4gdGhpcyBsb2FkZXIuXHJcblx0ICogQHBhcmFtIHtvbkVycm9yQ2FsbGJhY2t9IG9uRXJyb3IgLSBFeGVjdXRlZCB3aGVuIGVycm9ycyBvY2N1ci5cclxuXHQgKiBAcmV0dXJuIHtJbWFnZUJpdG1hcHx1bmRlZmluZWR9IFRoZSBpbWFnZSBiaXRtYXAuXHJcblx0ICovXHJcblx0bG9hZCggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XHJcblxyXG5cdFx0aWYgKCB1cmwgPT09IHVuZGVmaW5lZCApIHVybCA9ICcnO1xyXG5cclxuXHRcdGlmICggdGhpcy5wYXRoICE9PSB1bmRlZmluZWQgKSB1cmwgPSB0aGlzLnBhdGggKyB1cmw7XHJcblxyXG5cdFx0dXJsID0gdGhpcy5tYW5hZ2VyLnJlc29sdmVVUkwoIHVybCApO1xyXG5cclxuXHRcdGNvbnN0IHNjb3BlID0gdGhpcztcclxuXHJcblx0XHRjb25zdCBjYWNoZWQgPSBDYWNoZS5nZXQoIHVybCApO1xyXG5cclxuXHRcdGlmICggY2FjaGVkICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1TdGFydCggdXJsICk7XHJcblxyXG5cdFx0XHQvLyBJZiBjYWNoZWQgaXMgYSBwcm9taXNlLCB3YWl0IGZvciBpdCB0byByZXNvbHZlXHJcblx0XHRcdGlmICggY2FjaGVkLnRoZW4gKSB7XHJcblxyXG5cdFx0XHRcdGNhY2hlZC50aGVuKCBpbWFnZUJpdG1hcCA9PiB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIGltYWdlQml0bWFwICk7XHJcblxyXG5cdFx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcclxuXHJcblx0XHRcdFx0fSApLmNhdGNoKCBlID0+IHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIG9uRXJyb3IgKSBvbkVycm9yKCBlICk7XHJcblxyXG5cdFx0XHRcdH0gKTtcclxuXHRcdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBJZiBjYWNoZWQgaXMgbm90IGEgcHJvbWlzZSAoaS5lLiwgaXQncyBhbHJlYWR5IGFuIGltYWdlQml0bWFwKVxyXG5cdFx0XHRzZXRUaW1lb3V0KCBmdW5jdGlvbiAoKSB7XHJcblxyXG5cdFx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCBjYWNoZWQgKTtcclxuXHJcblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcclxuXHJcblx0XHRcdH0sIDAgKTtcclxuXHJcblx0XHRcdHJldHVybiBjYWNoZWQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGZldGNoT3B0aW9ucyA9IHt9O1xyXG5cdFx0ZmV0Y2hPcHRpb25zLmNyZWRlbnRpYWxzID0gKCB0aGlzLmNyb3NzT3JpZ2luID09PSAnYW5vbnltb3VzJyApID8gJ3NhbWUtb3JpZ2luJyA6ICdpbmNsdWRlJztcclxuXHRcdGZldGNoT3B0aW9ucy5oZWFkZXJzID0gdGhpcy5yZXF1ZXN0SGVhZGVyO1xyXG5cclxuXHRcdGNvbnN0IHByb21pc2UgPSBmZXRjaCggdXJsLCBmZXRjaE9wdGlvbnMgKS50aGVuKCBmdW5jdGlvbiAoIHJlcyApIHtcclxuXHJcblx0XHRcdHJldHVybiByZXMuYmxvYigpO1xyXG5cclxuXHRcdH0gKS50aGVuKCBmdW5jdGlvbiAoIGJsb2IgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gY3JlYXRlSW1hZ2VCaXRtYXAoIGJsb2IsIE9iamVjdC5hc3NpZ24oIHNjb3BlLm9wdGlvbnMsIHsgY29sb3JTcGFjZUNvbnZlcnNpb246ICdub25lJyB9ICkgKTtcclxuXHJcblx0XHR9ICkudGhlbiggZnVuY3Rpb24gKCBpbWFnZUJpdG1hcCApIHtcclxuXHJcblx0XHRcdENhY2hlLmFkZCggdXJsLCBpbWFnZUJpdG1hcCApO1xyXG5cclxuXHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIGltYWdlQml0bWFwICk7XHJcblxyXG5cdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xyXG5cclxuXHRcdFx0cmV0dXJuIGltYWdlQml0bWFwO1xyXG5cclxuXHRcdH0gKS5jYXRjaCggZnVuY3Rpb24gKCBlICkge1xyXG5cclxuXHRcdFx0aWYgKCBvbkVycm9yICkgb25FcnJvciggZSApO1xyXG5cclxuXHRcdFx0Q2FjaGUucmVtb3ZlKCB1cmwgKTtcclxuXHJcblx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVycm9yKCB1cmwgKTtcclxuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcclxuXHJcblx0XHR9ICk7XHJcblxyXG5cdFx0Q2FjaGUuYWRkKCB1cmwsIHByb21pc2UgKTtcclxuXHRcdHNjb3BlLm1hbmFnZXIuaXRlbVN0YXJ0KCB1cmwgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgSW1hZ2VCaXRtYXBMb2FkZXIgfTtcclxuIiwibGV0IF9jb250ZXh0O1xyXG5cclxuLyoqXHJcbiAqIE1hbmFnZXMgdGhlIGdsb2JhbCBhdWRpbyBjb250ZXh0IGluIHRoZSBlbmdpbmUuXHJcbiAqXHJcbiAqIEBoaWRlY29uc3RydWN0b3JcclxuICovXHJcbmNsYXNzIEF1ZGlvQ29udGV4dCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGdsb2JhbCBuYXRpdmUgYXVkaW8gY29udGV4dC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0F1ZGlvQ29udGV4dH0gVGhlIG5hdGl2ZSBhdWRpbyBjb250ZXh0LlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBnZXRDb250ZXh0KCkge1xyXG5cclxuXHRcdGlmICggX2NvbnRleHQgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdF9jb250ZXh0ID0gbmV3ICggd2luZG93LkF1ZGlvQ29udGV4dCB8fCB3aW5kb3cud2Via2l0QXVkaW9Db250ZXh0ICkoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIF9jb250ZXh0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFsbG93cyB0byBzZXQgdGhlIGdsb2JhbCBuYXRpdmUgYXVkaW8gY29udGV4dCBmcm9tIG91dHNpZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0F1ZGlvQ29udGV4dH0gdmFsdWUgLSBUaGUgbmF0aXZlIGNvbnRleHQgdG8gc2V0LlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBzZXRDb250ZXh0KCB2YWx1ZSApIHtcclxuXHJcblx0XHRfY29udGV4dCA9IHZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBBdWRpb0NvbnRleHQgfTtcclxuIiwiaW1wb3J0IHsgQXVkaW9Db250ZXh0IH0gZnJvbSAnLi4vYXVkaW8vQXVkaW9Db250ZXh0LmpzJztcclxuaW1wb3J0IHsgRmlsZUxvYWRlciB9IGZyb20gJy4vRmlsZUxvYWRlci5qcyc7XHJcbmltcG9ydCB7IExvYWRlciB9IGZyb20gJy4vTG9hZGVyLmpzJztcclxuXHJcbi8qKlxyXG4gKiBDbGFzcyBmb3IgbG9hZGluZyBhdWRpbyBidWZmZXJzLiBBdWRpb3MgYXJlIGludGVybmFsbHlcclxuICogbG9hZGVkIHZpYSB7QGxpbmsgRmlsZUxvYWRlcn0uXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGF1ZGlvTGlzdGVuZXIgPSBuZXcgVEhSRUUuQXVkaW9MaXN0ZW5lcigpO1xyXG4gKiBjb25zdCBhbWJpZW50U291bmQgPSBuZXcgVEhSRUUuQXVkaW8oIGF1ZGlvTGlzdGVuZXIgKTtcclxuICpcclxuICogY29uc3QgbG9hZGVyID0gbmV3IFRIUkVFLkF1ZGlvTG9hZGVyKCk7XHJcbiAqIGNvbnN0IGF1ZGlvQnVmZmVyID0gYXdhaXQgbG9hZGVyLmxvYWRBc3luYyggJ2F1ZGlvL2FtYmllbnRfb2NlYW4ub2dnJyApO1xyXG4gKlxyXG4gKiBhbWJpZW50U291bmQuc2V0QnVmZmVyKCBhdWRpb0J1ZmZlciApO1xyXG4gKiBhbWJpZW50U291bmQucGxheSgpO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIExvYWRlclxyXG4gKi9cclxuY2xhc3MgQXVkaW9Mb2FkZXIgZXh0ZW5kcyBMb2FkZXIge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGF1ZGlvIGxvYWRlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TG9hZGluZ01hbmFnZXJ9IFttYW5hZ2VyXSAtIFRoZSBsb2FkaW5nIG1hbmFnZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG1hbmFnZXIgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG1hbmFnZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTdGFydHMgbG9hZGluZyBmcm9tIHRoZSBnaXZlbiBVUkwgYW5kIHBhc3NlcyB0aGUgbG9hZGVkIGF1ZGlvIGJ1ZmZlclxyXG5cdCAqIHRvIHRoZSBgb25Mb2FkKClgIGNhbGxiYWNrLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIFRoZSBwYXRoL1VSTCBvZiB0aGUgZmlsZSB0byBiZSBsb2FkZWQuIFRoaXMgY2FuIGFsc28gYmUgYSBkYXRhIFVSSS5cclxuXHQgKiBAcGFyYW0ge2Z1bmN0aW9uKEF1ZGlvQnVmZmVyKX0gb25Mb2FkIC0gRXhlY3V0ZWQgd2hlbiB0aGUgbG9hZGluZyBwcm9jZXNzIGhhcyBiZWVuIGZpbmlzaGVkLlxyXG5cdCAqIEBwYXJhbSB7b25Qcm9ncmVzc0NhbGxiYWNrfSBvblByb2dyZXNzIC0gRXhlY3V0ZWQgd2hpbGUgdGhlIGxvYWRpbmcgaXMgaW4gcHJvZ3Jlc3MuXHJcblx0ICogQHBhcmFtIHtvbkVycm9yQ2FsbGJhY2t9IG9uRXJyb3IgLSBFeGVjdXRlZCB3aGVuIGVycm9ycyBvY2N1ci5cclxuXHQgKi9cclxuXHRsb2FkKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcclxuXHJcblx0XHRjb25zdCBzY29wZSA9IHRoaXM7XHJcblxyXG5cdFx0Y29uc3QgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIoIHRoaXMubWFuYWdlciApO1xyXG5cdFx0bG9hZGVyLnNldFJlc3BvbnNlVHlwZSggJ2FycmF5YnVmZmVyJyApO1xyXG5cdFx0bG9hZGVyLnNldFBhdGgoIHRoaXMucGF0aCApO1xyXG5cdFx0bG9hZGVyLnNldFJlcXVlc3RIZWFkZXIoIHRoaXMucmVxdWVzdEhlYWRlciApO1xyXG5cdFx0bG9hZGVyLnNldFdpdGhDcmVkZW50aWFscyggdGhpcy53aXRoQ3JlZGVudGlhbHMgKTtcclxuXHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggYnVmZmVyICkge1xyXG5cclxuXHRcdFx0dHJ5IHtcclxuXHJcblx0XHRcdFx0Ly8gQ3JlYXRlIGEgY29weSBvZiB0aGUgYnVmZmVyLiBUaGUgYGRlY29kZUF1ZGlvRGF0YWAgbWV0aG9kXHJcblx0XHRcdFx0Ly8gZGV0YWNoZXMgdGhlIGJ1ZmZlciB3aGVuIGNvbXBsZXRlLCBwcmV2ZW50aW5nIHJldXNlLlxyXG5cdFx0XHRcdGNvbnN0IGJ1ZmZlckNvcHkgPSBidWZmZXIuc2xpY2UoIDAgKTtcclxuXHJcblx0XHRcdFx0Y29uc3QgY29udGV4dCA9IEF1ZGlvQ29udGV4dC5nZXRDb250ZXh0KCk7XHJcblx0XHRcdFx0Y29udGV4dC5kZWNvZGVBdWRpb0RhdGEoIGJ1ZmZlckNvcHksIGZ1bmN0aW9uICggYXVkaW9CdWZmZXIgKSB7XHJcblxyXG5cdFx0XHRcdFx0b25Mb2FkKCBhdWRpb0J1ZmZlciApO1xyXG5cclxuXHRcdFx0XHR9ICkuY2F0Y2goIGhhbmRsZUVycm9yICk7XHJcblxyXG5cdFx0XHR9IGNhdGNoICggZSApIHtcclxuXHJcblx0XHRcdFx0aGFuZGxlRXJyb3IoIGUgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9LCBvblByb2dyZXNzLCBvbkVycm9yICk7XHJcblxyXG5cdFx0ZnVuY3Rpb24gaGFuZGxlRXJyb3IoIGUgKSB7XHJcblxyXG5cdFx0XHRpZiAoIG9uRXJyb3IgKSB7XHJcblxyXG5cdFx0XHRcdG9uRXJyb3IoIGUgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoIGUgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVycm9yKCB1cmwgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBBdWRpb0xvYWRlciB9O1xyXG4iLCJpbXBvcnQgeyBNYXRyaXg0IH0gZnJvbSAnLi4vbWF0aC9NYXRyaXg0LmpzJztcclxuaW1wb3J0IHsgREVHMlJBRCB9IGZyb20gJy4uL21hdGgvTWF0aFV0aWxzLmpzJztcclxuaW1wb3J0IHsgUGVyc3BlY3RpdmVDYW1lcmEgfSBmcm9tICcuL1BlcnNwZWN0aXZlQ2FtZXJhLmpzJztcclxuXHJcbmNvbnN0IF9leWVSaWdodCA9IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDQoKTtcclxuY29uc3QgX2V5ZUxlZnQgPSAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXg0KCk7XHJcbmNvbnN0IF9wcm9qZWN0aW9uTWF0cml4ID0gLypAX19QVVJFX18qLyBuZXcgTWF0cml4NCgpO1xyXG5cclxuLyoqXHJcbiAqIEEgc3BlY2lhbCB0eXBlIG9mIGNhbWVyYSB0aGF0IHVzZXMgdHdvIHBlcnNwZWN0aXZlIGNhbWVyYXMgd2l0aFxyXG4gKiBzdGVyZW9zY29waWMgcHJvamVjdGlvbi4gQ2FuIGJlIHVzZWQgZm9yIHJlbmRlcmluZyBzdGVyZW8gZWZmZWN0c1xyXG4gKiBsaWtlIFszRCBBbmFnbHlwaF17QGxpbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQW5hZ2x5cGhfM0R9IG9yXHJcbiAqIFtQYXJhbGxheCBCYXJyaWVyXXtAbGluayBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9wYXJhbGxheF9iYXJyaWVyfS5cclxuICovXHJcbmNsYXNzIFN0ZXJlb0NhbWVyYSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc3RlcmVvIGNhbWVyYS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB0eXBlIHByb3BlcnR5IGlzIHVzZWQgZm9yIGRldGVjdGluZyB0aGUgb2JqZWN0IHR5cGVcclxuXHRcdCAqIGluIGNvbnRleHQgb2Ygc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnR5cGUgPSAnU3RlcmVvQ2FtZXJhJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBhc3BlY3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hc3BlY3QgPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGV5ZSBzZXBhcmF0aW9uIHdoaWNoIHJlcHJlc2VudHMgdGhlIGRpc3RhbmNlXHJcblx0XHQgKiBiZXR3ZWVuIHRoZSBsZWZ0IGFuZCByaWdodCBjYW1lcmEuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDAuMDY0XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZXllU2VwID0gMC4wNjQ7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY2FtZXJhIHJlcHJlc2VudGluZyB0aGUgbGVmdCBleWUuIFRoaXMgaXMgYWRkZWQgdG8gbGF5ZXIgYDFgIHNvIG9iamVjdHMgdG8gYmVcclxuXHRcdCAqIHJlbmRlcmVkIGJ5IHRoZSBsZWZ0IGNhbWVyYSBtdXN0IGFsc28gYmUgYWRkZWQgdG8gdGhpcyBsYXllci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7UGVyc3BlY3RpdmVDYW1lcmF9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2FtZXJhTCA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSgpO1xyXG5cdFx0dGhpcy5jYW1lcmFMLmxheWVycy5lbmFibGUoIDEgKTtcclxuXHRcdHRoaXMuY2FtZXJhTC5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY2FtZXJhIHJlcHJlc2VudGluZyB0aGUgcmlnaHQgZXllLiBUaGlzIGlzIGFkZGVkIHRvIGxheWVyIGAyYCBzbyBvYmplY3RzIHRvIGJlXHJcblx0XHQgKiByZW5kZXJlZCBieSB0aGUgcmlnaHQgY2FtZXJhIG11c3QgYWxzbyBiZSBhZGRlZCB0byB0aGlzIGxheWVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtQZXJzcGVjdGl2ZUNhbWVyYX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jYW1lcmFSID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCk7XHJcblx0XHR0aGlzLmNhbWVyYVIubGF5ZXJzLmVuYWJsZSggMiApO1xyXG5cdFx0dGhpcy5jYW1lcmFSLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcclxuXHJcblx0XHR0aGlzLl9jYWNoZSA9IHtcclxuXHRcdFx0Zm9jdXM6IG51bGwsXHJcblx0XHRcdGZvdjogbnVsbCxcclxuXHRcdFx0YXNwZWN0OiBudWxsLFxyXG5cdFx0XHRuZWFyOiBudWxsLFxyXG5cdFx0XHRmYXI6IG51bGwsXHJcblx0XHRcdHpvb206IG51bGwsXHJcblx0XHRcdGV5ZVNlcDogbnVsbFxyXG5cdFx0fTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoZSBzdGVyZW8gY2FtZXJhIGJhc2VkIG9uIHRoZSBnaXZlbiBwZXJzcGVjdGl2ZSBjYW1lcmEuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1BlcnNwZWN0aXZlQ2FtZXJhfSBjYW1lcmEgLSBUaGUgcGVyc3BlY3RpdmUgY2FtZXJhLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZSggY2FtZXJhICkge1xyXG5cclxuXHRcdGNvbnN0IGNhY2hlID0gdGhpcy5fY2FjaGU7XHJcblxyXG5cdFx0Y29uc3QgbmVlZHNVcGRhdGUgPSBjYWNoZS5mb2N1cyAhPT0gY2FtZXJhLmZvY3VzIHx8IGNhY2hlLmZvdiAhPT0gY2FtZXJhLmZvdiB8fFxyXG5cdFx0XHRjYWNoZS5hc3BlY3QgIT09IGNhbWVyYS5hc3BlY3QgKiB0aGlzLmFzcGVjdCB8fCBjYWNoZS5uZWFyICE9PSBjYW1lcmEubmVhciB8fFxyXG5cdFx0XHRjYWNoZS5mYXIgIT09IGNhbWVyYS5mYXIgfHwgY2FjaGUuem9vbSAhPT0gY2FtZXJhLnpvb20gfHwgY2FjaGUuZXllU2VwICE9PSB0aGlzLmV5ZVNlcDtcclxuXHJcblx0XHRpZiAoIG5lZWRzVXBkYXRlICkge1xyXG5cclxuXHRcdFx0Y2FjaGUuZm9jdXMgPSBjYW1lcmEuZm9jdXM7XHJcblx0XHRcdGNhY2hlLmZvdiA9IGNhbWVyYS5mb3Y7XHJcblx0XHRcdGNhY2hlLmFzcGVjdCA9IGNhbWVyYS5hc3BlY3QgKiB0aGlzLmFzcGVjdDtcclxuXHRcdFx0Y2FjaGUubmVhciA9IGNhbWVyYS5uZWFyO1xyXG5cdFx0XHRjYWNoZS5mYXIgPSBjYW1lcmEuZmFyO1xyXG5cdFx0XHRjYWNoZS56b29tID0gY2FtZXJhLnpvb207XHJcblx0XHRcdGNhY2hlLmV5ZVNlcCA9IHRoaXMuZXllU2VwO1xyXG5cclxuXHRcdFx0Ly8gT2ZmLWF4aXMgc3RlcmVvc2NvcGljIGVmZmVjdCBiYXNlZCBvblxyXG5cdFx0XHQvLyBodHRwOi8vcGF1bGJvdXJrZS5uZXQvc3RlcmVvZ3JhcGhpY3Mvc3RlcmVvcmVuZGVyL1xyXG5cclxuXHRcdFx0X3Byb2plY3Rpb25NYXRyaXguY29weSggY2FtZXJhLnByb2plY3Rpb25NYXRyaXggKTtcclxuXHRcdFx0Y29uc3QgZXllU2VwSGFsZiA9IGNhY2hlLmV5ZVNlcCAvIDI7XHJcblx0XHRcdGNvbnN0IGV5ZVNlcE9uUHJvamVjdGlvbiA9IGV5ZVNlcEhhbGYgKiBjYWNoZS5uZWFyIC8gY2FjaGUuZm9jdXM7XHJcblx0XHRcdGNvbnN0IHltYXggPSAoIGNhY2hlLm5lYXIgKiBNYXRoLnRhbiggREVHMlJBRCAqIGNhY2hlLmZvdiAqIDAuNSApICkgLyBjYWNoZS56b29tO1xyXG5cdFx0XHRsZXQgeG1pbiwgeG1heDtcclxuXHJcblx0XHRcdC8vIHRyYW5zbGF0ZSB4T2Zmc2V0XHJcblxyXG5cdFx0XHRfZXllTGVmdC5lbGVtZW50c1sgMTIgXSA9IC0gZXllU2VwSGFsZjtcclxuXHRcdFx0X2V5ZVJpZ2h0LmVsZW1lbnRzWyAxMiBdID0gZXllU2VwSGFsZjtcclxuXHJcblx0XHRcdC8vIGZvciBsZWZ0IGV5ZVxyXG5cclxuXHRcdFx0eG1pbiA9IC0geW1heCAqIGNhY2hlLmFzcGVjdCArIGV5ZVNlcE9uUHJvamVjdGlvbjtcclxuXHRcdFx0eG1heCA9IHltYXggKiBjYWNoZS5hc3BlY3QgKyBleWVTZXBPblByb2plY3Rpb247XHJcblxyXG5cdFx0XHRfcHJvamVjdGlvbk1hdHJpeC5lbGVtZW50c1sgMCBdID0gMiAqIGNhY2hlLm5lYXIgLyAoIHhtYXggLSB4bWluICk7XHJcblx0XHRcdF9wcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWyA4IF0gPSAoIHhtYXggKyB4bWluICkgLyAoIHhtYXggLSB4bWluICk7XHJcblxyXG5cdFx0XHR0aGlzLmNhbWVyYUwucHJvamVjdGlvbk1hdHJpeC5jb3B5KCBfcHJvamVjdGlvbk1hdHJpeCApO1xyXG5cclxuXHRcdFx0Ly8gZm9yIHJpZ2h0IGV5ZVxyXG5cclxuXHRcdFx0eG1pbiA9IC0geW1heCAqIGNhY2hlLmFzcGVjdCAtIGV5ZVNlcE9uUHJvamVjdGlvbjtcclxuXHRcdFx0eG1heCA9IHltYXggKiBjYWNoZS5hc3BlY3QgLSBleWVTZXBPblByb2plY3Rpb247XHJcblxyXG5cdFx0XHRfcHJvamVjdGlvbk1hdHJpeC5lbGVtZW50c1sgMCBdID0gMiAqIGNhY2hlLm5lYXIgLyAoIHhtYXggLSB4bWluICk7XHJcblx0XHRcdF9wcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWyA4IF0gPSAoIHhtYXggKyB4bWluICkgLyAoIHhtYXggLSB4bWluICk7XHJcblxyXG5cdFx0XHR0aGlzLmNhbWVyYVIucHJvamVjdGlvbk1hdHJpeC5jb3B5KCBfcHJvamVjdGlvbk1hdHJpeCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmNhbWVyYUwubWF0cml4V29ybGQuY29weSggY2FtZXJhLm1hdHJpeFdvcmxkICkubXVsdGlwbHkoIF9leWVMZWZ0ICk7XHJcblx0XHR0aGlzLmNhbWVyYVIubWF0cml4V29ybGQuY29weSggY2FtZXJhLm1hdHJpeFdvcmxkICkubXVsdGlwbHkoIF9leWVSaWdodCApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBTdGVyZW9DYW1lcmEgfTtcclxuIiwiaW1wb3J0IHsgUGVyc3BlY3RpdmVDYW1lcmEgfSBmcm9tICcuL1BlcnNwZWN0aXZlQ2FtZXJhLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIHR5cGUgb2YgY2FtZXJhIGNhbiBiZSB1c2VkIGluIG9yZGVyIHRvIGVmZmljaWVudGx5IHJlbmRlciBhIHNjZW5lIHdpdGggYVxyXG4gKiBwcmVkZWZpbmVkIHNldCBvZiBjYW1lcmFzLiBUaGlzIGlzIGFuIGltcG9ydGFudCBwZXJmb3JtYW5jZSBhc3BlY3QgZm9yXHJcbiAqIHJlbmRlcmluZyBWUiBzY2VuZXMuXHJcbiAqXHJcbiAqIEFuIGluc3RhbmNlIG9mIGBBcnJheUNhbWVyYWAgYWx3YXlzIGhhcyBhbiBhcnJheSBvZiBzdWIgY2FtZXJhcy4gSXQncyBtYW5kYXRvcnlcclxuICogdG8gZGVmaW5lIGZvciBlYWNoIHN1YiBjYW1lcmEgdGhlIGB2aWV3cG9ydGAgcHJvcGVydHkgd2hpY2ggZGV0ZXJtaW5lcyB0aGVcclxuICogcGFydCBvZiB0aGUgdmlld3BvcnQgdGhhdCBpcyByZW5kZXJlZCB3aXRoIHRoaXMgY2FtZXJhLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgUGVyc3BlY3RpdmVDYW1lcmFcclxuICovXHJcbmNsYXNzIEFycmF5Q2FtZXJhIGV4dGVuZHMgUGVyc3BlY3RpdmVDYW1lcmEge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGFycmF5IGNhbWVyYS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8UGVyc3BlY3RpdmVDYW1lcmE+fSBbYXJyYXk9W11dIC0gQW4gYXJyYXkgb2YgcGVyc3BlY3RpdmUgc3ViIGNhbWVyYXMuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGFycmF5ID0gW10gKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNBcnJheUNhbWVyYSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBhcnJheSBvZiBwZXJzcGVjdGl2ZSBzdWIgY2FtZXJhcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8UGVyc3BlY3RpdmVDYW1lcmE+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNhbWVyYXMgPSBhcnJheTtcclxuXHRcdHRoaXMuaW5kZXggPSAwO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBBcnJheUNhbWVyYSB9O1xyXG4iLCIvKipcclxuICogQ2xhc3MgZm9yIGtlZXBpbmcgdHJhY2sgb2YgdGltZS5cclxuICovXHJcbmNsYXNzIENsb2NrIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBjbG9jay5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW2F1dG9TdGFydD10cnVlXSAtIFdoZXRoZXIgdG8gYXV0b21hdGljYWxseSBzdGFydCB0aGUgY2xvY2sgd2hlblxyXG5cdCAqIGBnZXREZWx0YSgpYCBpcyBjYWxsZWQgZm9yIHRoZSBmaXJzdCB0aW1lLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBhdXRvU3RhcnQgPSB0cnVlICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSWYgc2V0IHRvIGB0cnVlYCwgdGhlIGNsb2NrIHN0YXJ0cyBhdXRvbWF0aWNhbGx5IHdoZW4gYGdldERlbHRhKClgIGlzIGNhbGxlZFxyXG5cdFx0ICogZm9yIHRoZSBmaXJzdCB0aW1lLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmF1dG9TdGFydCA9IGF1dG9TdGFydDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvbGRzIHRoZSB0aW1lIGF0IHdoaWNoIHRoZSBjbG9jaydzIGBzdGFydCgpYCBtZXRob2Qgd2FzIGxhc3QgY2FsbGVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc3RhcnRUaW1lID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvbGRzIHRoZSB0aW1lIGF0IHdoaWNoIHRoZSBjbG9jaydzIGBzdGFydCgpYCwgYGdldEVsYXBzZWRUaW1lKClgIG9yXHJcblx0XHQgKiBgZ2V0RGVsdGEoKWAgbWV0aG9kcyB3ZXJlIGxhc3QgY2FsbGVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMub2xkVGltZSA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBLZWVwcyB0cmFjayBvZiB0aGUgdG90YWwgdGltZSB0aGF0IHRoZSBjbG9jayBoYXMgYmVlbiBydW5uaW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZWxhcHNlZFRpbWUgPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgY2xvY2sgaXMgcnVubmluZyBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucnVubmluZyA9IGZhbHNlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFN0YXJ0cyB0aGUgY2xvY2suIFdoZW4gYGF1dG9TdGFydGAgaXMgc2V0IHRvIGB0cnVlYCwgdGhlIG1ldGhvZCBpcyBhdXRvbWF0aWNhbGx5XHJcblx0ICogY2FsbGVkIGJ5IHRoZSBjbGFzcy5cclxuXHQgKi9cclxuXHRzdGFydCgpIHtcclxuXHJcblx0XHR0aGlzLnN0YXJ0VGltZSA9IG5vdygpO1xyXG5cclxuXHRcdHRoaXMub2xkVGltZSA9IHRoaXMuc3RhcnRUaW1lO1xyXG5cdFx0dGhpcy5lbGFwc2VkVGltZSA9IDA7XHJcblx0XHR0aGlzLnJ1bm5pbmcgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFN0b3BzIHRoZSBjbG9jay5cclxuXHQgKi9cclxuXHRzdG9wKCkge1xyXG5cclxuXHRcdHRoaXMuZ2V0RWxhcHNlZFRpbWUoKTtcclxuXHRcdHRoaXMucnVubmluZyA9IGZhbHNlO1xyXG5cdFx0dGhpcy5hdXRvU3RhcnQgPSBmYWxzZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBlbGFwc2VkIHRpbWUgaW4gc2Vjb25kcy5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGVsYXBzZWQgdGltZS5cclxuXHQgKi9cclxuXHRnZXRFbGFwc2VkVGltZSgpIHtcclxuXHJcblx0XHR0aGlzLmdldERlbHRhKCk7XHJcblx0XHRyZXR1cm4gdGhpcy5lbGFwc2VkVGltZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBkZWx0YSB0aW1lIGluIHNlY29uZHMuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBkZWx0YSB0aW1lLlxyXG5cdCAqL1xyXG5cdGdldERlbHRhKCkge1xyXG5cclxuXHRcdGxldCBkaWZmID0gMDtcclxuXHJcblx0XHRpZiAoIHRoaXMuYXV0b1N0YXJ0ICYmICEgdGhpcy5ydW5uaW5nICkge1xyXG5cclxuXHRcdFx0dGhpcy5zdGFydCgpO1xyXG5cdFx0XHRyZXR1cm4gMDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aGlzLnJ1bm5pbmcgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBuZXdUaW1lID0gbm93KCk7XHJcblxyXG5cdFx0XHRkaWZmID0gKCBuZXdUaW1lIC0gdGhpcy5vbGRUaW1lICkgLyAxMDAwO1xyXG5cdFx0XHR0aGlzLm9sZFRpbWUgPSBuZXdUaW1lO1xyXG5cclxuXHRcdFx0dGhpcy5lbGFwc2VkVGltZSArPSBkaWZmO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZGlmZjtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gbm93KCkge1xyXG5cclxuXHRyZXR1cm4gcGVyZm9ybWFuY2Uubm93KCk7XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBDbG9jayB9O1xyXG4iLCJpbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuaW1wb3J0IHsgUXVhdGVybmlvbiB9IGZyb20gJy4uL21hdGgvUXVhdGVybmlvbi5qcyc7XHJcbmltcG9ydCB7IENsb2NrIH0gZnJvbSAnLi4vY29yZS9DbG9jay5qcyc7XHJcbmltcG9ydCB7IE9iamVjdDNEIH0gZnJvbSAnLi4vY29yZS9PYmplY3QzRC5qcyc7XHJcbmltcG9ydCB7IEF1ZGlvQ29udGV4dCB9IGZyb20gJy4vQXVkaW9Db250ZXh0LmpzJztcclxuXHJcbmNvbnN0IF9wb3NpdGlvbiA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX3F1YXRlcm5pb24gPSAvKkBfX1BVUkVfXyovIG5ldyBRdWF0ZXJuaW9uKCk7XHJcbmNvbnN0IF9zY2FsZSA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX29yaWVudGF0aW9uID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5cclxuLyoqXHJcbiAqIFRoZSBjbGFzcyByZXByZXNlbnRzIGEgdmlydHVhbCBsaXN0ZW5lciBvZiB0aGUgYWxsIHBvc2l0aW9uYWwgYW5kIG5vbi1wb3NpdGlvbmFsIGF1ZGlvIGVmZmVjdHNcclxuICogaW4gdGhlIHNjZW5lLiBBIHRocmVlLmpzIGFwcGxpY2F0aW9uIHVzdWFsbHkgY3JlYXRlcyBhIHNpbmdsZSBsaXN0ZW5lci4gSXQgaXMgYSBtYW5kYXRvcnlcclxuICogY29uc3RydWN0b3IgcGFyYW1ldGVyIGZvciBhdWRpb3MgZW50aXRpZXMgbGlrZSB7QGxpbmsgQXVkaW99IGFuZCB7QGxpbmsgUG9zaXRpb25hbEF1ZGlvfS5cclxuICpcclxuICogSW4gbW9zdCBjYXNlcywgdGhlIGxpc3RlbmVyIG9iamVjdCBpcyBhIGNoaWxkIG9mIHRoZSBjYW1lcmEuIFNvIHRoZSAzRCB0cmFuc2Zvcm1hdGlvbiBvZiB0aGVcclxuICogY2FtZXJhIHJlcHJlc2VudHMgdGhlIDNEIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBsaXN0ZW5lci5cclxuICpcclxuICogQGF1Z21lbnRzIE9iamVjdDNEXHJcbiAqL1xyXG5jbGFzcyBBdWRpb0xpc3RlbmVyIGV4dGVuZHMgT2JqZWN0M0Qge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGF1ZGlvIGxpc3RlbmVyLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ0F1ZGlvTGlzdGVuZXInO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG5hdGl2ZSBhdWRpbyBjb250ZXh0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBdWRpb0NvbnRleHR9XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb250ZXh0ID0gQXVkaW9Db250ZXh0LmdldENvbnRleHQoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBnYWluIG5vZGUgdXNlZCBmb3Igdm9sdW1lIGNvbnRyb2wuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0dhaW5Ob2RlfVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ2FpbiA9IHRoaXMuY29udGV4dC5jcmVhdGVHYWluKCk7XHJcblx0XHR0aGlzLmdhaW4uY29ubmVjdCggdGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBvcHRpb25hbCBmaWx0ZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogRGVmaW5lZCB2aWEge0BsaW5rIEF1ZGlvTGlzdGVuZXIjc2V0RmlsdGVyfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P0F1ZGlvTm9kZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZpbHRlciA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaW1lIGRlbHRhIHZhbHVlcyByZXF1aXJlZCBmb3IgYGxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKClgIHVzYWdlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50aW1lRGVsdGEgPSAwO1xyXG5cclxuXHRcdC8vIHByaXZhdGVcclxuXHJcblx0XHR0aGlzLl9jbG9jayA9IG5ldyBDbG9jaygpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGxpc3RlbmVyJ3MgaW5wdXQgbm9kZS5cclxuXHQgKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgb3RoZXIgYXVkaW8gbm9kZXMgdG8gY29ubmVjdCB0byB0aGlzIGxpc3RlbmVyLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7R2Fpbk5vZGV9IFRoZSBpbnB1dCBub2RlLlxyXG5cdCAqL1xyXG5cdGdldElucHV0KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmdhaW47XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVtb3ZlcyB0aGUgY3VycmVudCBmaWx0ZXIgZnJvbSB0aGlzIGxpc3RlbmVyLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7QXVkaW9MaXN0ZW5lcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBsaXN0ZW5lci5cclxuXHQgKi9cclxuXHRyZW1vdmVGaWx0ZXIoKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmZpbHRlciAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuZ2Fpbi5kaXNjb25uZWN0KCB0aGlzLmZpbHRlciApO1xyXG5cdFx0XHR0aGlzLmZpbHRlci5kaXNjb25uZWN0KCB0aGlzLmNvbnRleHQuZGVzdGluYXRpb24gKTtcclxuXHRcdFx0dGhpcy5nYWluLmNvbm5lY3QoIHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiApO1xyXG5cdFx0XHR0aGlzLmZpbHRlciA9IG51bGw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGN1cnJlbnQgc2V0IGZpbHRlci5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4gez9BdWRpb05vZGV9IFRoZSBmaWx0ZXIuXHJcblx0ICovXHJcblx0Z2V0RmlsdGVyKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmZpbHRlcjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBnaXZlbiBmaWx0ZXIgdG8gdGhpcyBsaXN0ZW5lci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXVkaW9Ob2RlfSB2YWx1ZSAtIFRoZSBmaWx0ZXIgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge0F1ZGlvTGlzdGVuZXJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbGlzdGVuZXIuXHJcblx0ICovXHJcblx0c2V0RmlsdGVyKCB2YWx1ZSApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuZmlsdGVyICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5nYWluLmRpc2Nvbm5lY3QoIHRoaXMuZmlsdGVyICk7XHJcblx0XHRcdHRoaXMuZmlsdGVyLmRpc2Nvbm5lY3QoIHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR0aGlzLmdhaW4uZGlzY29ubmVjdCggdGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuZmlsdGVyID0gdmFsdWU7XHJcblx0XHR0aGlzLmdhaW4uY29ubmVjdCggdGhpcy5maWx0ZXIgKTtcclxuXHRcdHRoaXMuZmlsdGVyLmNvbm5lY3QoIHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGFwcGxpY2F0aW9ucyBtYXN0ZXIgdm9sdW1lLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgbWFzdGVyIHZvbHVtZS5cclxuXHQgKi9cclxuXHRnZXRNYXN0ZXJWb2x1bWUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZ2Fpbi5nYWluLnZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGFwcGxpY2F0aW9ucyBtYXN0ZXIgdm9sdW1lLiBUaGlzIHZvbHVtZSBzZXR0aW5nIGFmZmVjdHNcclxuXHQgKiBhbGwgYXVkaW8gbm9kZXMgaW4gdGhlIHNjZW5lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIG1hc3RlciB2b2x1bWUgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge0F1ZGlvTGlzdGVuZXJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbGlzdGVuZXIuXHJcblx0ICovXHJcblx0c2V0TWFzdGVyVm9sdW1lKCB2YWx1ZSApIHtcclxuXHJcblx0XHR0aGlzLmdhaW4uZ2Fpbi5zZXRUYXJnZXRBdFRpbWUoIHZhbHVlLCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUsIDAuMDEgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHR1cGRhdGVNYXRyaXhXb3JsZCggZm9yY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIudXBkYXRlTWF0cml4V29ybGQoIGZvcmNlICk7XHJcblxyXG5cdFx0Y29uc3QgbGlzdGVuZXIgPSB0aGlzLmNvbnRleHQubGlzdGVuZXI7XHJcblx0XHRjb25zdCB1cCA9IHRoaXMudXA7XHJcblxyXG5cdFx0dGhpcy50aW1lRGVsdGEgPSB0aGlzLl9jbG9jay5nZXREZWx0YSgpO1xyXG5cclxuXHRcdHRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKCBfcG9zaXRpb24sIF9xdWF0ZXJuaW9uLCBfc2NhbGUgKTtcclxuXHJcblx0XHRfb3JpZW50YXRpb24uc2V0KCAwLCAwLCAtIDEgKS5hcHBseVF1YXRlcm5pb24oIF9xdWF0ZXJuaW9uICk7XHJcblxyXG5cdFx0aWYgKCBsaXN0ZW5lci5wb3NpdGlvblggKSB7XHJcblxyXG5cdFx0XHQvLyBjb2RlIHBhdGggZm9yIENocm9tZSAoc2VlICMxNDM5MylcclxuXHJcblx0XHRcdGNvbnN0IGVuZFRpbWUgPSB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKyB0aGlzLnRpbWVEZWx0YTtcclxuXHJcblx0XHRcdGxpc3RlbmVyLnBvc2l0aW9uWC5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSggX3Bvc2l0aW9uLngsIGVuZFRpbWUgKTtcclxuXHRcdFx0bGlzdGVuZXIucG9zaXRpb25ZLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKCBfcG9zaXRpb24ueSwgZW5kVGltZSApO1xyXG5cdFx0XHRsaXN0ZW5lci5wb3NpdGlvbloubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoIF9wb3NpdGlvbi56LCBlbmRUaW1lICk7XHJcblx0XHRcdGxpc3RlbmVyLmZvcndhcmRYLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKCBfb3JpZW50YXRpb24ueCwgZW5kVGltZSApO1xyXG5cdFx0XHRsaXN0ZW5lci5mb3J3YXJkWS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSggX29yaWVudGF0aW9uLnksIGVuZFRpbWUgKTtcclxuXHRcdFx0bGlzdGVuZXIuZm9yd2FyZFoubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoIF9vcmllbnRhdGlvbi56LCBlbmRUaW1lICk7XHJcblx0XHRcdGxpc3RlbmVyLnVwWC5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSggdXAueCwgZW5kVGltZSApO1xyXG5cdFx0XHRsaXN0ZW5lci51cFkubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoIHVwLnksIGVuZFRpbWUgKTtcclxuXHRcdFx0bGlzdGVuZXIudXBaLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKCB1cC56LCBlbmRUaW1lICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGxpc3RlbmVyLnNldFBvc2l0aW9uKCBfcG9zaXRpb24ueCwgX3Bvc2l0aW9uLnksIF9wb3NpdGlvbi56ICk7XHJcblx0XHRcdGxpc3RlbmVyLnNldE9yaWVudGF0aW9uKCBfb3JpZW50YXRpb24ueCwgX29yaWVudGF0aW9uLnksIF9vcmllbnRhdGlvbi56LCB1cC54LCB1cC55LCB1cC56ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBBdWRpb0xpc3RlbmVyIH07XHJcbiIsImltcG9ydCB7IE9iamVjdDNEIH0gZnJvbSAnLi4vY29yZS9PYmplY3QzRC5qcyc7XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyBhIG5vbi1wb3NpdGlvbmFsICggZ2xvYmFsICkgYXVkaW8gb2JqZWN0LlxyXG4gKlxyXG4gKiBUaGlzIGFuZCByZWxhdGVkIGF1ZGlvIG1vZHVsZXMgbWFrZSB1c2Ugb2YgdGhlIFtXZWIgQXVkaW8gQVBJXXtAbGluayBodHRwczovL3d3dy53My5vcmcvVFIvd2ViYXVkaW8tMS4xL30uXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIC8vIGNyZWF0ZSBhbiBBdWRpb0xpc3RlbmVyIGFuZCBhZGQgaXQgdG8gdGhlIGNhbWVyYVxyXG4gKiBjb25zdCBsaXN0ZW5lciA9IG5ldyBUSFJFRS5BdWRpb0xpc3RlbmVyKCk7XHJcbiAqIGNhbWVyYS5hZGQoIGxpc3RlbmVyICk7XHJcbiAqXHJcbiAqIC8vIGNyZWF0ZSBhIGdsb2JhbCBhdWRpbyBzb3VyY2VcclxuICogY29uc3Qgc291bmQgPSBuZXcgVEhSRUUuQXVkaW8oIGxpc3RlbmVyICk7XHJcbiAqXHJcbiAqIC8vIGxvYWQgYSBzb3VuZCBhbmQgc2V0IGl0IGFzIHRoZSBBdWRpbyBvYmplY3QncyBidWZmZXJcclxuICogY29uc3QgYXVkaW9Mb2FkZXIgPSBuZXcgVEhSRUUuQXVkaW9Mb2FkZXIoKTtcclxuICogYXVkaW9Mb2FkZXIubG9hZCggJ3NvdW5kcy9hbWJpZW50Lm9nZycsIGZ1bmN0aW9uKCBidWZmZXIgKSB7XHJcbiAqIFx0c291bmQuc2V0QnVmZmVyKCBidWZmZXIgKTtcclxuICogXHRzb3VuZC5zZXRMb29wKCB0cnVlICk7XHJcbiAqIFx0c291bmQuc2V0Vm9sdW1lKCAwLjUgKTtcclxuICogXHRzb3VuZC5wbGF5KCk7XHJcbiAqIH0pO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIE9iamVjdDNEXHJcbiAqL1xyXG5jbGFzcyBBdWRpbyBleHRlbmRzIE9iamVjdDNEIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBhdWRpby5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXVkaW9MaXN0ZW5lcn0gbGlzdGVuZXIgLSBUaGUgZ2xvYmFsIGF1ZGlvIGxpc3RlbmVyLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBsaXN0ZW5lciApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdBdWRpbyc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZ2xvYmFsIGF1ZGlvIGxpc3RlbmVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBdWRpb0xpc3RlbmVyfVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBhdWRpbyBjb250ZXh0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBdWRpb0NvbnRleHR9XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb250ZXh0ID0gbGlzdGVuZXIuY29udGV4dDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBnYWluIG5vZGUgdXNlZCBmb3Igdm9sdW1lIGNvbnRyb2wuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0dhaW5Ob2RlfVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ2FpbiA9IHRoaXMuY29udGV4dC5jcmVhdGVHYWluKCk7XHJcblx0XHR0aGlzLmdhaW4uY29ubmVjdCggbGlzdGVuZXIuZ2V0SW5wdXQoKSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0byBzdGFydCBwbGF5YmFjayBhdXRvbWF0aWNhbGx5IG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYXV0b3BsYXkgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIGFuIGF1ZGlvIGJ1ZmZlci5cclxuXHRcdCAqXHJcblx0XHQgKiBEZWZpbmVkIHZpYSB7QGxpbmsgQXVkaW8jc2V0QnVmZmVyfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P0F1ZGlvQnVmZmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYnVmZmVyID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIE1vZGlmeSBwaXRjaCwgbWVhc3VyZWQgaW4gY2VudHMuICsvLSAxMDAgaXMgYSBzZW1pdG9uZS5cclxuXHRcdCAqICsvLSAxMjAwIGlzIGFuIG9jdGF2ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBEZWZpbmVkIHZpYSB7QGxpbmsgQXVkaW8jc2V0RGV0dW5lfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGV0dW5lID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIGF1ZGlvIHNob3VsZCBsb29wIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBEZWZpbmVkIHZpYSB7QGxpbmsgQXVkaW8jc2V0TG9vcH0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubG9vcCA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyB3aGVyZSBpbiB0aGUgYXVkaW8gYnVmZmVyIHRoZSByZXBsYXkgc2hvdWxkXHJcblx0XHQgKiBzdGFydCwgaW4gc2Vjb25kcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxvb3BTdGFydCA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIHdoZXJlIGluIHRoZSBhdWRpbyBidWZmZXIgdGhlIHJlcGxheSBzaG91bGRcclxuXHRcdCAqIHN0b3AsIGluIHNlY29uZHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5sb29wRW5kID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIG9mZnNldCB0byB0aGUgdGltZSB3aXRoaW4gdGhlIGF1ZGlvIGJ1ZmZlciB0aGUgcGxheWJhY2tcclxuXHRcdCAqIHNob3VsZCBiZWdpbiwgaW4gc2Vjb25kcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm9mZnNldCA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBPdmVycmlkZXMgdGhlIGRlZmF1bHQgZHVyYXRpb24gb2YgdGhlIGF1ZGlvLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHt1bmRlZmluZWR8bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgdW5kZWZpbmVkXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZHVyYXRpb24gPSB1bmRlZmluZWQ7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcGxheWJhY2sgc3BlZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogRGVmaW5lZCB2aWEge0BsaW5rIEF1ZGlvI3NldFBsYXliYWNrUmF0ZX0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBsYXliYWNrUmF0ZSA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYXVkaW8gaXMgcGxheWluZyBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogVGhpcyBmbGFnIHdpbGwgYmUgYXV0b21hdGljYWxseSBzZXQgd2hlbiB1c2luZyB7QGxpbmsgQXVkaW8jcGxheX0sXHJcblx0XHQgKiB7QGxpbmsgQXVkaW8jcGF1c2V9LCB7QGxpbmsgQXVkaW8jc3RvcH0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYXVkaW8gcGxheWJhY2sgY2FuIGJlIGNvbnRyb2xsZWRcclxuXHRcdCAqIHdpdGggbWV0aG9kIGxpa2Uge0BsaW5rIEF1ZGlvI3BsYXl9IG9yIHtAbGluayBBdWRpbyNwYXVzZX0uXHJcblx0XHQgKlxyXG5cdFx0ICogVGhpcyBmbGFnIHdpbGwgYmUgYXV0b21hdGljYWxseSBzZXQgd2hlbiBhdWRpbyBzb3VyY2VzIGFyZVxyXG5cdFx0ICogZGVmaW5lZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb2xkcyBhIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBhdWRpbyBzb3VyY2UuXHJcblx0XHQgKlxyXG5cdFx0ICogVGhlIHByb3BlcnR5IGlzIGF1dG9tYXRpY2FsbHkgYnkgb25lIG9mIHRoZSBgc2V0KigpYCBtZXRob2RzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/QXVkaW9Ob2RlfVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc291cmNlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgdGhlIHNvdXJjZSB0eXBlLlxyXG5cdFx0ICpcclxuXHRcdCAqIFRoZSBwcm9wZXJ0eSBpcyBhdXRvbWF0aWNhbGx5IGJ5IG9uZSBvZiB0aGUgYHNldCooKWAgbWV0aG9kcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KCdlbXB0eSd8J2F1ZGlvTm9kZSd8J21lZGlhTm9kZSd8J21lZGlhU3RyZWFtTm9kZSd8J2J1ZmZlcicpfVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCAnZW1wdHknXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc291cmNlVHlwZSA9ICdlbXB0eSc7XHJcblxyXG5cdFx0dGhpcy5fc3RhcnRlZEF0ID0gMDtcclxuXHRcdHRoaXMuX3Byb2dyZXNzID0gMDtcclxuXHRcdHRoaXMuX2Nvbm5lY3RlZCA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQ2FuIGJlIHVzZWQgdG8gYXBwbHkgYSB2YXJpZXR5IG9mIGxvdy1vcmRlciBmaWx0ZXJzIHRvIGNyZWF0ZVxyXG5cdFx0ICogbW9yZSBjb21wbGV4IHNvdW5kIGVmZmVjdHMgZS5nLiB2aWEgYEJpcXVhZEZpbHRlck5vZGVgLlxyXG5cdFx0ICpcclxuXHRcdCAqIFRoZSBwcm9wZXJ0eSBpcyBhdXRvbWF0aWNhbGx5IHNldCBieSB7QGxpbmsgQXVkaW8jc2V0RmlsdGVyc30uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PEF1ZGlvTm9kZT59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5maWx0ZXJzID0gW107XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgb3V0cHV0IGF1ZGlvIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtHYWluTm9kZX0gVGhlIG91dHB1dCBub2RlLlxyXG5cdCAqL1xyXG5cdGdldE91dHB1dCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5nYWluO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGdpdmVuIGF1ZGlvIG5vZGUgYXMgdGhlIHNvdXJjZSBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICoge0BsaW5rIEF1ZGlvI3NvdXJjZVR5cGV9IGlzIHNldCB0byBgYXVkaW9Ob2RlYCBhbmQge0BsaW5rIEF1ZGlvI2hhc1BsYXliYWNrQ29udHJvbH0gdG8gYGZhbHNlYC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXVkaW9Ob2RlfSBhdWRpb05vZGUgLSBUaGUgYXVkaW8gbm9kZSBsaWtlIGFuIGluc3RhbmNlIG9mIGBPc2NpbGxhdG9yTm9kZWAuXHJcblx0ICogQHJldHVybiB7QXVkaW99IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0Tm9kZVNvdXJjZSggYXVkaW9Ob2RlICkge1xyXG5cclxuXHRcdHRoaXMuaGFzUGxheWJhY2tDb250cm9sID0gZmFsc2U7XHJcblx0XHR0aGlzLnNvdXJjZVR5cGUgPSAnYXVkaW9Ob2RlJztcclxuXHRcdHRoaXMuc291cmNlID0gYXVkaW9Ob2RlO1xyXG5cdFx0dGhpcy5jb25uZWN0KCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZ2l2ZW4gbWVkaWEgZWxlbWVudCBhcyB0aGUgc291cmNlIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiB7QGxpbmsgQXVkaW8jc291cmNlVHlwZX0gaXMgc2V0IHRvIGBtZWRpYU5vZGVgIGFuZCB7QGxpbmsgQXVkaW8jaGFzUGxheWJhY2tDb250cm9sfSB0byBgZmFsc2VgLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtIVE1MTWVkaWFFbGVtZW50fSBtZWRpYUVsZW1lbnQgLSBUaGUgbWVkaWEgZWxlbWVudC5cclxuXHQgKiBAcmV0dXJuIHtBdWRpb30gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXRNZWRpYUVsZW1lbnRTb3VyY2UoIG1lZGlhRWxlbWVudCApIHtcclxuXHJcblx0XHR0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9IGZhbHNlO1xyXG5cdFx0dGhpcy5zb3VyY2VUeXBlID0gJ21lZGlhTm9kZSc7XHJcblx0XHR0aGlzLnNvdXJjZSA9IHRoaXMuY29udGV4dC5jcmVhdGVNZWRpYUVsZW1lbnRTb3VyY2UoIG1lZGlhRWxlbWVudCApO1xyXG5cdFx0dGhpcy5jb25uZWN0KCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZ2l2ZW4gbWVkaWEgc3RyZWFtIGFzIHRoZSBzb3VyY2Ugb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIHtAbGluayBBdWRpbyNzb3VyY2VUeXBlfSBpcyBzZXQgdG8gYG1lZGlhU3RyZWFtTm9kZWAgYW5kIHtAbGluayBBdWRpbyNoYXNQbGF5YmFja0NvbnRyb2x9IHRvIGBmYWxzZWAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01lZGlhU3RyZWFtfSBtZWRpYVN0cmVhbSAtIFRoZSBtZWRpYSBzdHJlYW0uXHJcblx0ICogQHJldHVybiB7QXVkaW99IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0TWVkaWFTdHJlYW1Tb3VyY2UoIG1lZGlhU3RyZWFtICkge1xyXG5cclxuXHRcdHRoaXMuaGFzUGxheWJhY2tDb250cm9sID0gZmFsc2U7XHJcblx0XHR0aGlzLnNvdXJjZVR5cGUgPSAnbWVkaWFTdHJlYW1Ob2RlJztcclxuXHRcdHRoaXMuc291cmNlID0gdGhpcy5jb250ZXh0LmNyZWF0ZU1lZGlhU3RyZWFtU291cmNlKCBtZWRpYVN0cmVhbSApO1xyXG5cdFx0dGhpcy5jb25uZWN0KCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZ2l2ZW4gYXVkaW8gYnVmZmVyIGFzIHRoZSBzb3VyY2Ugb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIHtAbGluayBBdWRpbyNzb3VyY2VUeXBlfSBpcyBzZXQgdG8gYGJ1ZmZlcmAgYW5kIHtAbGluayBBdWRpbyNoYXNQbGF5YmFja0NvbnRyb2x9IHRvIGB0cnVlYC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXVkaW9CdWZmZXJ9IGF1ZGlvQnVmZmVyIC0gVGhlIGF1ZGlvIGJ1ZmZlci5cclxuXHQgKiBAcmV0dXJuIHtBdWRpb30gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXRCdWZmZXIoIGF1ZGlvQnVmZmVyICkge1xyXG5cclxuXHRcdHRoaXMuYnVmZmVyID0gYXVkaW9CdWZmZXI7XHJcblx0XHR0aGlzLnNvdXJjZVR5cGUgPSAnYnVmZmVyJztcclxuXHJcblx0XHRpZiAoIHRoaXMuYXV0b3BsYXkgKSB0aGlzLnBsYXkoKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTdGFydHMgdGhlIHBsYXliYWNrIG9mIHRoZSBhdWRpby5cclxuXHQgKlxyXG5cdCAqIENhbiBvbmx5IGJlIHVzZWQgd2l0aCBjb21wYXRpYmxlIGF1ZGlvIHNvdXJjZXMgdGhhdCBhbGxvdyBwbGF5YmFjayBjb250cm9sLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtkZWxheT0wXSAtIFRoZSBkZWxheSwgaW4gc2Vjb25kcywgYXQgd2hpY2ggdGhlIGF1ZGlvIHNob3VsZCBzdGFydCBwbGF5aW5nLlxyXG5cdCAqIEByZXR1cm4ge0F1ZGlvfHVuZGVmaW5lZH0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRwbGF5KCBkZWxheSA9IDAgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmlzUGxheWluZyA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiBBdWRpbyBpcyBhbHJlYWR5IHBsYXlpbmcuJyApO1xyXG5cdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuJyApO1xyXG5cdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuX3N0YXJ0ZWRBdCA9IHRoaXMuY29udGV4dC5jdXJyZW50VGltZSArIGRlbGF5O1xyXG5cclxuXHRcdGNvbnN0IHNvdXJjZSA9IHRoaXMuY29udGV4dC5jcmVhdGVCdWZmZXJTb3VyY2UoKTtcclxuXHRcdHNvdXJjZS5idWZmZXIgPSB0aGlzLmJ1ZmZlcjtcclxuXHRcdHNvdXJjZS5sb29wID0gdGhpcy5sb29wO1xyXG5cdFx0c291cmNlLmxvb3BTdGFydCA9IHRoaXMubG9vcFN0YXJ0O1xyXG5cdFx0c291cmNlLmxvb3BFbmQgPSB0aGlzLmxvb3BFbmQ7XHJcblx0XHRzb3VyY2Uub25lbmRlZCA9IHRoaXMub25FbmRlZC5iaW5kKCB0aGlzICk7XHJcblx0XHRzb3VyY2Uuc3RhcnQoIHRoaXMuX3N0YXJ0ZWRBdCwgdGhpcy5fcHJvZ3Jlc3MgKyB0aGlzLm9mZnNldCwgdGhpcy5kdXJhdGlvbiApO1xyXG5cclxuXHRcdHRoaXMuaXNQbGF5aW5nID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnNvdXJjZSA9IHNvdXJjZTtcclxuXHJcblx0XHR0aGlzLnNldERldHVuZSggdGhpcy5kZXR1bmUgKTtcclxuXHRcdHRoaXMuc2V0UGxheWJhY2tSYXRlKCB0aGlzLnBsYXliYWNrUmF0ZSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmNvbm5lY3QoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQYXVzZXMgdGhlIHBsYXliYWNrIG9mIHRoZSBhdWRpby5cclxuXHQgKlxyXG5cdCAqIENhbiBvbmx5IGJlIHVzZWQgd2l0aCBjb21wYXRpYmxlIGF1ZGlvIHNvdXJjZXMgdGhhdCBhbGxvdyBwbGF5YmFjayBjb250cm9sLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7QXVkaW98dW5kZWZpbmVkfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHBhdXNlKCkge1xyXG5cclxuXHRcdGlmICggdGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuJyApO1xyXG5cdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy5pc1BsYXlpbmcgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHQvLyB1cGRhdGUgY3VycmVudCBwcm9ncmVzc1xyXG5cclxuXHRcdFx0dGhpcy5fcHJvZ3Jlc3MgKz0gTWF0aC5tYXgoIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSAtIHRoaXMuX3N0YXJ0ZWRBdCwgMCApICogdGhpcy5wbGF5YmFja1JhdGU7XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMubG9vcCA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0Ly8gZW5zdXJlIF9wcm9ncmVzcyBkb2VzIG5vdCBleGNlZWQgZHVyYXRpb24gd2l0aCBsb29wZWQgYXVkaW9zXHJcblxyXG5cdFx0XHRcdHRoaXMuX3Byb2dyZXNzID0gdGhpcy5fcHJvZ3Jlc3MgJSAoIHRoaXMuZHVyYXRpb24gfHwgdGhpcy5idWZmZXIuZHVyYXRpb24gKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuc291cmNlLnN0b3AoKTtcclxuXHRcdFx0dGhpcy5zb3VyY2Uub25lbmRlZCA9IG51bGw7XHJcblxyXG5cdFx0XHR0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTdG9wcyB0aGUgcGxheWJhY2sgb2YgdGhlIGF1ZGlvLlxyXG5cdCAqXHJcblx0ICogQ2FuIG9ubHkgYmUgdXNlZCB3aXRoIGNvbXBhdGlibGUgYXVkaW8gc291cmNlcyB0aGF0IGFsbG93IHBsYXliYWNrIGNvbnRyb2wuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2RlbGF5PTBdIC0gVGhlIGRlbGF5LCBpbiBzZWNvbmRzLCBhdCB3aGljaCB0aGUgYXVkaW8gc2hvdWxkIHN0b3AgcGxheWluZy5cclxuXHQgKiBAcmV0dXJuIHtBdWRpb3x1bmRlZmluZWR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c3RvcCggZGVsYXkgPSAwICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuJyApO1xyXG5cdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuX3Byb2dyZXNzID0gMDtcclxuXHJcblx0XHRpZiAoIHRoaXMuc291cmNlICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5zb3VyY2Uuc3RvcCggdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lICsgZGVsYXkgKTtcclxuXHRcdFx0dGhpcy5zb3VyY2Uub25lbmRlZCA9IG51bGw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29ubmVjdHMgdG8gdGhlIGF1ZGlvIHNvdXJjZS4gVGhpcyBpcyB1c2VkIGludGVybmFsbHkgb25cclxuXHQgKiBpbml0aWFsaXNhdGlvbiBhbmQgd2hlbiBzZXR0aW5nIC8gcmVtb3ZpbmcgZmlsdGVycy5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0F1ZGlvfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNvbm5lY3QoKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmZpbHRlcnMubGVuZ3RoID4gMCApIHtcclxuXHJcblx0XHRcdHRoaXMuc291cmNlLmNvbm5lY3QoIHRoaXMuZmlsdGVyc1sgMCBdICk7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDEsIGwgPSB0aGlzLmZpbHRlcnMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5maWx0ZXJzWyBpIC0gMSBdLmNvbm5lY3QoIHRoaXMuZmlsdGVyc1sgaSBdICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0aGlzLmZpbHRlcnNbIHRoaXMuZmlsdGVycy5sZW5ndGggLSAxIF0uY29ubmVjdCggdGhpcy5nZXRPdXRwdXQoKSApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR0aGlzLnNvdXJjZS5jb25uZWN0KCB0aGlzLmdldE91dHB1dCgpICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuX2Nvbm5lY3RlZCA9IHRydWU7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGlzY29ubmVjdHMgdG8gdGhlIGF1ZGlvIHNvdXJjZS4gVGhpcyBpcyB1c2VkIGludGVybmFsbHkgb25cclxuXHQgKiBpbml0aWFsaXNhdGlvbiBhbmQgd2hlbiBzZXR0aW5nIC8gcmVtb3ZpbmcgZmlsdGVycy5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0F1ZGlvfHVuZGVmaW5lZH0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRkaXNjb25uZWN0KCkge1xyXG5cclxuXHRcdGlmICggdGhpcy5fY29ubmVjdGVkID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aGlzLmZpbHRlcnMubGVuZ3RoID4gMCApIHtcclxuXHJcblx0XHRcdHRoaXMuc291cmNlLmRpc2Nvbm5lY3QoIHRoaXMuZmlsdGVyc1sgMCBdICk7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDEsIGwgPSB0aGlzLmZpbHRlcnMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5maWx0ZXJzWyBpIC0gMSBdLmRpc2Nvbm5lY3QoIHRoaXMuZmlsdGVyc1sgaSBdICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0aGlzLmZpbHRlcnNbIHRoaXMuZmlsdGVycy5sZW5ndGggLSAxIF0uZGlzY29ubmVjdCggdGhpcy5nZXRPdXRwdXQoKSApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR0aGlzLnNvdXJjZS5kaXNjb25uZWN0KCB0aGlzLmdldE91dHB1dCgpICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuX2Nvbm5lY3RlZCA9IGZhbHNlO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGN1cnJlbnQgc2V0IGZpbHRlcnMuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtBcnJheTxBdWRpb05vZGU+fSBUaGUgbGlzdCBvZiBmaWx0ZXJzLlxyXG5cdCAqL1xyXG5cdGdldEZpbHRlcnMoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZmlsdGVycztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIGFuIGFycmF5IG9mIGZpbHRlcnMgYW5kIGNvbm5lY3RzIHRoZW0gd2l0aCB0aGUgYXVkaW8gc291cmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxBdWRpb05vZGU+fSBbdmFsdWVdIC0gQSBsaXN0IG9mIGZpbHRlcnMuXHJcblx0ICogQHJldHVybiB7QXVkaW99IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0RmlsdGVycyggdmFsdWUgKSB7XHJcblxyXG5cdFx0aWYgKCAhIHZhbHVlICkgdmFsdWUgPSBbXTtcclxuXHJcblx0XHRpZiAoIHRoaXMuX2Nvbm5lY3RlZCA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdHRoaXMuZGlzY29ubmVjdCgpO1xyXG5cdFx0XHR0aGlzLmZpbHRlcnMgPSB2YWx1ZS5zbGljZSgpO1xyXG5cdFx0XHR0aGlzLmNvbm5lY3QoKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGhpcy5maWx0ZXJzID0gdmFsdWUuc2xpY2UoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVmaW5lcyB0aGUgZGV0dW5pbmcgb2Ygb3NjaWxsYXRpb24gaW4gY2VudHMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgZGV0dW5pbmcgb2Ygb3NjaWxsYXRpb24gaW4gY2VudHMuXHJcblx0ICogQHJldHVybiB7QXVkaW99IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0RGV0dW5lKCB2YWx1ZSApIHtcclxuXHJcblx0XHR0aGlzLmRldHVuZSA9IHZhbHVlO1xyXG5cclxuXHRcdGlmICggdGhpcy5pc1BsYXlpbmcgPT09IHRydWUgJiYgdGhpcy5zb3VyY2UuZGV0dW5lICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnNvdXJjZS5kZXR1bmUuc2V0VGFyZ2V0QXRUaW1lKCB0aGlzLmRldHVuZSwgdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lLCAwLjAxICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGRldHVuaW5nIG9mIG9zY2lsbGF0aW9uIGluIGNlbnRzLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgZGV0dW5pbmcgb2Ygb3NjaWxsYXRpb24gaW4gY2VudHMuXHJcblx0ICovXHJcblx0Z2V0RGV0dW5lKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmRldHVuZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBmaXJzdCBmaWx0ZXIgaW4gdGhlIGxpc3Qgb2YgZmlsdGVycy5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0F1ZGlvTm9kZXx1bmRlZmluZWR9IFRoZSBmaXJzdCBmaWx0ZXIgaW4gdGhlIGxpc3Qgb2YgZmlsdGVycy5cclxuXHQgKi9cclxuXHRnZXRGaWx0ZXIoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZ2V0RmlsdGVycygpWyAwIF07XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQXBwbGllcyBhIHNpbmdsZSBmaWx0ZXIgbm9kZSB0byB0aGUgYXVkaW8uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0F1ZGlvTm9kZX0gW2ZpbHRlcl0gLSBUaGUgZmlsdGVyIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtBdWRpb30gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXRGaWx0ZXIoIGZpbHRlciApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5zZXRGaWx0ZXJzKCBmaWx0ZXIgPyBbIGZpbHRlciBdIDogW10gKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBwbGF5YmFjayByYXRlLlxyXG5cdCAqXHJcblx0ICogQ2FuIG9ubHkgYmUgdXNlZCB3aXRoIGNvbXBhdGlibGUgYXVkaW8gc291cmNlcyB0aGF0IGFsbG93IHBsYXliYWNrIGNvbnRyb2wuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3ZhbHVlXSAtIFRoZSBwbGF5YmFjayByYXRlIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtBdWRpb3x1bmRlZmluZWR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0UGxheWJhY2tSYXRlKCB2YWx1ZSApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuaGFzUGxheWJhY2tDb250cm9sID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLicgKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnBsYXliYWNrUmF0ZSA9IHZhbHVlO1xyXG5cclxuXHRcdGlmICggdGhpcy5pc1BsYXlpbmcgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnNvdXJjZS5wbGF5YmFja1JhdGUuc2V0VGFyZ2V0QXRUaW1lKCB0aGlzLnBsYXliYWNrUmF0ZSwgdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lLCAwLjAxICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGN1cnJlbnQgcGxheWJhY2sgcmF0ZS5cclxuXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgcGxheWJhY2sgcmF0ZS5cclxuXHQgKi9cclxuXHRnZXRQbGF5YmFja1JhdGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMucGxheWJhY2tSYXRlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEF1dG9tYXRpY2FsbHkgY2FsbGVkIHdoZW4gcGxheWJhY2sgZmluaXNoZWQuXHJcblx0ICovXHJcblx0b25FbmRlZCgpIHtcclxuXHJcblx0XHR0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xyXG5cdFx0dGhpcy5fcHJvZ3Jlc3MgPSAwO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGxvb3AgZmxhZy5cclxuXHQgKlxyXG5cdCAqIENhbiBvbmx5IGJlIHVzZWQgd2l0aCBjb21wYXRpYmxlIGF1ZGlvIHNvdXJjZXMgdGhhdCBhbGxvdyBwbGF5YmFjayBjb250cm9sLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgYXVkaW8gc2hvdWxkIGxvb3Agb3Igbm90LlxyXG5cdCAqL1xyXG5cdGdldExvb3AoKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4nICk7XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubG9vcDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBsb29wIGZsYWcuXHJcblx0ICpcclxuXHQgKiBDYW4gb25seSBiZSB1c2VkIHdpdGggY29tcGF0aWJsZSBhdWRpbyBzb3VyY2VzIHRoYXQgYWxsb3cgcGxheWJhY2sgY29udHJvbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsdWUgLSBXaGV0aGVyIHRoZSBhdWRpbyBzaG91bGQgbG9vcCBvciBub3QuXHJcblx0ICogQHJldHVybiB7QXVkaW98dW5kZWZpbmVkfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldExvb3AoIHZhbHVlICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuJyApO1xyXG5cdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMubG9vcCA9IHZhbHVlO1xyXG5cclxuXHRcdGlmICggdGhpcy5pc1BsYXlpbmcgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnNvdXJjZS5sb29wID0gdGhpcy5sb29wO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBsb29wIHN0YXJ0IHZhbHVlIHdoaWNoIGRlZmluZXMgd2hlcmUgaW4gdGhlIGF1ZGlvIGJ1ZmZlciB0aGUgcmVwbGF5IHNob3VsZFxyXG5cdCAqIHN0YXJ0LCBpbiBzZWNvbmRzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIGxvb3Agc3RhcnQgdmFsdWUuXHJcblx0ICogQHJldHVybiB7QXVkaW99IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0TG9vcFN0YXJ0KCB2YWx1ZSApIHtcclxuXHJcblx0XHR0aGlzLmxvb3BTdGFydCA9IHZhbHVlO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGxvb3AgZW5kIHZhbHVlIHdoaWNoIGRlZmluZXMgd2hlcmUgaW4gdGhlIGF1ZGlvIGJ1ZmZlciB0aGUgcmVwbGF5IHNob3VsZFxyXG5cdCAqIHN0b3AsIGluIHNlY29uZHMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgbG9vcCBlbmQgdmFsdWUuXHJcblx0ICogQHJldHVybiB7QXVkaW99IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0TG9vcEVuZCggdmFsdWUgKSB7XHJcblxyXG5cdFx0dGhpcy5sb29wRW5kID0gdmFsdWU7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgdm9sdW1lLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgdm9sdW1lLlxyXG5cdCAqL1xyXG5cdGdldFZvbHVtZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5nYWluLmdhaW4udmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdm9sdW1lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIHZvbHVtZSB0byBzZXQuXHJcblx0ICogQHJldHVybiB7QXVkaW99IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0Vm9sdW1lKCB2YWx1ZSApIHtcclxuXHJcblx0XHR0aGlzLmdhaW4uZ2Fpbi5zZXRUYXJnZXRBdFRpbWUoIHZhbHVlLCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUsIDAuMDEgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UsIHJlY3Vyc2l2ZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UsIHJlY3Vyc2l2ZSApO1xyXG5cclxuXHRcdGlmICggc291cmNlLnNvdXJjZVR5cGUgIT09ICdidWZmZXInICkge1xyXG5cclxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IEF1ZGlvIHNvdXJjZSB0eXBlIGNhbm5vdCBiZSBjb3BpZWQuJyApO1xyXG5cclxuXHRcdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuYXV0b3BsYXkgPSBzb3VyY2UuYXV0b3BsYXk7XHJcblxyXG5cdFx0dGhpcy5idWZmZXIgPSBzb3VyY2UuYnVmZmVyO1xyXG5cdFx0dGhpcy5kZXR1bmUgPSBzb3VyY2UuZGV0dW5lO1xyXG5cdFx0dGhpcy5sb29wID0gc291cmNlLmxvb3A7XHJcblx0XHR0aGlzLmxvb3BTdGFydCA9IHNvdXJjZS5sb29wU3RhcnQ7XHJcblx0XHR0aGlzLmxvb3BFbmQgPSBzb3VyY2UubG9vcEVuZDtcclxuXHRcdHRoaXMub2Zmc2V0ID0gc291cmNlLm9mZnNldDtcclxuXHRcdHRoaXMuZHVyYXRpb24gPSBzb3VyY2UuZHVyYXRpb247XHJcblx0XHR0aGlzLnBsYXliYWNrUmF0ZSA9IHNvdXJjZS5wbGF5YmFja1JhdGU7XHJcblx0XHR0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9IHNvdXJjZS5oYXNQbGF5YmFja0NvbnRyb2w7XHJcblx0XHR0aGlzLnNvdXJjZVR5cGUgPSBzb3VyY2Uuc291cmNlVHlwZTtcclxuXHJcblx0XHR0aGlzLmZpbHRlcnMgPSBzb3VyY2UuZmlsdGVycy5zbGljZSgpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdGNsb25lKCByZWN1cnNpdmUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLmxpc3RlbmVyICkuY29weSggdGhpcywgcmVjdXJzaXZlICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IEF1ZGlvIH07XHJcbiIsImltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBRdWF0ZXJuaW9uIH0gZnJvbSAnLi4vbWF0aC9RdWF0ZXJuaW9uLmpzJztcclxuaW1wb3J0IHsgQXVkaW8gfSBmcm9tICcuL0F1ZGlvLmpzJztcclxuXHJcbmNvbnN0IF9wb3NpdGlvbiA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX3F1YXRlcm5pb24gPSAvKkBfX1BVUkVfXyovIG5ldyBRdWF0ZXJuaW9uKCk7XHJcbmNvbnN0IF9zY2FsZSA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX29yaWVudGF0aW9uID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgYSBwb3NpdGlvbmFsIGF1ZGlvIG9iamVjdC5cclxuICpcclxuICogYGBganNcclxuICogLy8gY3JlYXRlIGFuIEF1ZGlvTGlzdGVuZXIgYW5kIGFkZCBpdCB0byB0aGUgY2FtZXJhXHJcbiAqIGNvbnN0IGxpc3RlbmVyID0gbmV3IFRIUkVFLkF1ZGlvTGlzdGVuZXIoKTtcclxuICogY2FtZXJhLmFkZCggbGlzdGVuZXIgKTtcclxuICpcclxuICogLy8gY3JlYXRlIHRoZSBQb3NpdGlvbmFsQXVkaW8gb2JqZWN0IChwYXNzaW5nIGluIHRoZSBsaXN0ZW5lcilcclxuICogY29uc3Qgc291bmQgPSBuZXcgVEhSRUUuUG9zaXRpb25hbEF1ZGlvKCBsaXN0ZW5lciApO1xyXG4gKlxyXG4gKiAvLyBsb2FkIGEgc291bmQgYW5kIHNldCBpdCBhcyB0aGUgUG9zaXRpb25hbEF1ZGlvIG9iamVjdCdzIGJ1ZmZlclxyXG4gKiBjb25zdCBhdWRpb0xvYWRlciA9IG5ldyBUSFJFRS5BdWRpb0xvYWRlcigpO1xyXG4gKiBhdWRpb0xvYWRlci5sb2FkKCAnc291bmRzL3Nvbmcub2dnJywgZnVuY3Rpb24oIGJ1ZmZlciApIHtcclxuICogXHRzb3VuZC5zZXRCdWZmZXIoIGJ1ZmZlciApO1xyXG4gKiBcdHNvdW5kLnNldFJlZkRpc3RhbmNlKCAyMCApO1xyXG4gKiBcdHNvdW5kLnBsYXkoKTtcclxuICogfSk7XHJcbiAqXHJcbiAqIC8vIGNyZWF0ZSBhbiBvYmplY3QgZm9yIHRoZSBzb3VuZCB0byBwbGF5IGZyb21cclxuICogY29uc3Qgc3BoZXJlID0gbmV3IFRIUkVFLlNwaGVyZUdlb21ldHJ5KCAyMCwgMzIsIDE2ICk7XHJcbiAqIGNvbnN0IG1hdGVyaWFsID0gbmV3IFRIUkVFLk1lc2hQaG9uZ01hdGVyaWFsKCB7IGNvbG9yOiAweGZmMjIwMCB9ICk7XHJcbiAqIGNvbnN0IG1lc2ggPSBuZXcgVEhSRUUuTWVzaCggc3BoZXJlLCBtYXRlcmlhbCApO1xyXG4gKiBzY2VuZS5hZGQoIG1lc2ggKTtcclxuICpcclxuICogLy8gZmluYWxseSBhZGQgdGhlIHNvdW5kIHRvIHRoZSBtZXNoXHJcbiAqIG1lc2guYWRkKCBzb3VuZCApO1xyXG4gKlxyXG4gKiBAYXVnbWVudHMgQXVkaW9cclxuICovXHJcbmNsYXNzIFBvc2l0aW9uYWxBdWRpbyBleHRlbmRzIEF1ZGlvIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIHBvc2l0aW9uYWwgYXVkaW8uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0F1ZGlvTGlzdGVuZXJ9IGxpc3RlbmVyIC0gVGhlIGdsb2JhbCBhdWRpbyBsaXN0ZW5lci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbGlzdGVuZXIgKSB7XHJcblxyXG5cdFx0c3VwZXIoIGxpc3RlbmVyICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcGFubmVyIG5vZGUgcmVwcmVzZW50cyB0aGUgbG9jYXRpb24sIGRpcmVjdGlvbiwgYW5kIGJlaGF2aW9yIG9mIGFuIGF1ZGlvXHJcblx0XHQgKiBzb3VyY2UgaW4gM0Qgc3BhY2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1Bhbm5lck5vZGV9XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wYW5uZXIgPSB0aGlzLmNvbnRleHQuY3JlYXRlUGFubmVyKCk7XHJcblx0XHR0aGlzLnBhbm5lci5wYW5uaW5nTW9kZWwgPSAnSFJURic7XHJcblx0XHR0aGlzLnBhbm5lci5jb25uZWN0KCB0aGlzLmdhaW4gKTtcclxuXHJcblx0fVxyXG5cclxuXHRjb25uZWN0KCkge1xyXG5cclxuXHRcdHN1cGVyLmNvbm5lY3QoKTtcclxuXHJcblx0XHR0aGlzLnBhbm5lci5jb25uZWN0KCB0aGlzLmdhaW4gKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHRkaXNjb25uZWN0KCkge1xyXG5cclxuXHRcdHN1cGVyLmRpc2Nvbm5lY3QoKTtcclxuXHJcblx0XHR0aGlzLnBhbm5lci5kaXNjb25uZWN0KCB0aGlzLmdhaW4gKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHRnZXRPdXRwdXQoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMucGFubmVyO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGN1cnJlbnQgcmVmZXJlbmNlIGRpc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgcmVmZXJlbmNlIGRpc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGdldFJlZkRpc3RhbmNlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnBhbm5lci5yZWZEaXN0YW5jZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWZpbmVzIHRoZSByZWZlcmVuY2UgZGlzdGFuY2UgZm9yIHJlZHVjaW5nIHZvbHVtZSBhcyB0aGUgYXVkaW8gc291cmNlIG1vdmVzXHJcblx0ICogZnVydGhlciBmcm9tIHRoZSBsaXN0ZW5lciDigJMgaS5lLiB0aGUgZGlzdGFuY2UgYXQgd2hpY2ggdGhlIHZvbHVtZSByZWR1Y3Rpb25cclxuXHQgKiBzdGFydHMgdGFraW5nIGVmZmVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSByZWZlcmVuY2UgZGlzdGFuY2UgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge1Bvc2l0aW9uYWxBdWRpb30gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXRSZWZEaXN0YW5jZSggdmFsdWUgKSB7XHJcblxyXG5cdFx0dGhpcy5wYW5uZXIucmVmRGlzdGFuY2UgPSB2YWx1ZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHJvbGxvZmYgZmFjdG9yLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgcm9sbG9mZiBmYWN0b3IuXHJcblx0ICovXHJcblx0Z2V0Um9sbG9mZkZhY3RvcigpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5wYW5uZXIucm9sbG9mZkZhY3RvcjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWZpbmVzIGhvdyBxdWlja2x5IHRoZSB2b2x1bWUgaXMgcmVkdWNlZCBhcyB0aGUgc291cmNlIG1vdmVzIGF3YXkgZnJvbSB0aGUgbGlzdGVuZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgcm9sbG9mZiBmYWN0b3IuXHJcblx0ICogQHJldHVybiB7UG9zaXRpb25hbEF1ZGlvfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldFJvbGxvZmZGYWN0b3IoIHZhbHVlICkge1xyXG5cclxuXHRcdHRoaXMucGFubmVyLnJvbGxvZmZGYWN0b3IgPSB2YWx1ZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGRpc3RhbmNlIG1vZGVsLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7KCdsaW5lYXInfCdpbnZlcnNlJ3wnZXhwb25lbnRpYWwnKX0gVGhlIGRpc3RhbmNlIG1vZGVsLlxyXG5cdCAqL1xyXG5cdGdldERpc3RhbmNlTW9kZWwoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMucGFubmVyLmRpc3RhbmNlTW9kZWw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVmaW5lcyB3aGljaCBhbGdvcml0aG0gdG8gdXNlIHRvIHJlZHVjZSB0aGUgdm9sdW1lIG9mIHRoZSBhdWRpbyBzb3VyY2VcclxuXHQgKiBhcyBpdCBtb3ZlcyBhd2F5IGZyb20gdGhlIGxpc3RlbmVyLlxyXG5cdCAqXHJcblx0ICogUmVhZCBbdGhlIHNwZWNde0BsaW5rIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJhdWRpby0xLjEvI2VudW1kZWYtZGlzdGFuY2Vtb2RlbHR5cGV9XHJcblx0ICogZm9yIG1vcmUgZGV0YWlscy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7KCdsaW5lYXInfCdpbnZlcnNlJ3wnZXhwb25lbnRpYWwnKX0gdmFsdWUgLSBUaGUgZGlzdGFuY2UgbW9kZWwgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge1Bvc2l0aW9uYWxBdWRpb30gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXREaXN0YW5jZU1vZGVsKCB2YWx1ZSApIHtcclxuXHJcblx0XHR0aGlzLnBhbm5lci5kaXN0YW5jZU1vZGVsID0gdmFsdWU7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgY3VycmVudCBtYXggZGlzdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBtYXggZGlzdGFuY2UuXHJcblx0ICovXHJcblx0Z2V0TWF4RGlzdGFuY2UoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMucGFubmVyLm1heERpc3RhbmNlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgdGhlIG1heGltdW0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgYXVkaW8gc291cmNlIGFuZCB0aGUgbGlzdGVuZXIsXHJcblx0ICogYWZ0ZXIgd2hpY2ggdGhlIHZvbHVtZSBpcyBub3QgcmVkdWNlZCBhbnkgZnVydGhlci5cclxuXHQgKlxyXG5cdCAqIFRoaXMgdmFsdWUgaXMgdXNlZCBvbmx5IGJ5IHRoZSBgbGluZWFyYCBkaXN0YW5jZSBtb2RlbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBtYXggZGlzdGFuY2UuXHJcblx0ICogQHJldHVybiB7UG9zaXRpb25hbEF1ZGlvfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldE1heERpc3RhbmNlKCB2YWx1ZSApIHtcclxuXHJcblx0XHR0aGlzLnBhbm5lci5tYXhEaXN0YW5jZSA9IHZhbHVlO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGRpcmVjdGlvbmFsIGNvbmUgaW4gd2hpY2ggdGhlIGF1ZGlvIGNhbiBiZSBsaXN0ZW5lZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBjb25lSW5uZXJBbmdsZSAtIEFuIGFuZ2xlLCBpbiBkZWdyZWVzLCBvZiBhIGNvbmUgaW5zaWRlIG9mIHdoaWNoIHRoZXJlIHdpbGwgYmUgbm8gdm9sdW1lIHJlZHVjdGlvbi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gY29uZU91dGVyQW5nbGUgLSBBbiBhbmdsZSwgaW4gZGVncmVlcywgb2YgYSBjb25lIG91dHNpZGUgb2Ygd2hpY2ggdGhlIHZvbHVtZSB3aWxsIGJlIHJlZHVjZWQgYnkgYSBjb25zdGFudCB2YWx1ZSwgZGVmaW5lZCBieSB0aGUgYGNvbmVPdXRlckdhaW5gIHBhcmFtZXRlci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gY29uZU91dGVyR2FpbiAtIFRoZSBhbW91bnQgb2Ygdm9sdW1lIHJlZHVjdGlvbiBvdXRzaWRlIHRoZSBjb25lIGRlZmluZWQgYnkgdGhlIGBjb25lT3V0ZXJBbmdsZWAuIFdoZW4gc2V0IHRvIGAwYCwgbm8gc291bmQgY2FuIGJlIGhlYXJkLlxyXG5cdCAqIEByZXR1cm4ge1Bvc2l0aW9uYWxBdWRpb30gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXREaXJlY3Rpb25hbENvbmUoIGNvbmVJbm5lckFuZ2xlLCBjb25lT3V0ZXJBbmdsZSwgY29uZU91dGVyR2FpbiApIHtcclxuXHJcblx0XHR0aGlzLnBhbm5lci5jb25lSW5uZXJBbmdsZSA9IGNvbmVJbm5lckFuZ2xlO1xyXG5cdFx0dGhpcy5wYW5uZXIuY29uZU91dGVyQW5nbGUgPSBjb25lT3V0ZXJBbmdsZTtcclxuXHRcdHRoaXMucGFubmVyLmNvbmVPdXRlckdhaW4gPSBjb25lT3V0ZXJHYWluO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdHVwZGF0ZU1hdHJpeFdvcmxkKCBmb3JjZSApIHtcclxuXHJcblx0XHRzdXBlci51cGRhdGVNYXRyaXhXb3JsZCggZm9yY2UgKTtcclxuXHJcblx0XHRpZiAoIHRoaXMuaGFzUGxheWJhY2tDb250cm9sID09PSB0cnVlICYmIHRoaXMuaXNQbGF5aW5nID09PSBmYWxzZSApIHJldHVybjtcclxuXHJcblx0XHR0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZSggX3Bvc2l0aW9uLCBfcXVhdGVybmlvbiwgX3NjYWxlICk7XHJcblxyXG5cdFx0X29yaWVudGF0aW9uLnNldCggMCwgMCwgMSApLmFwcGx5UXVhdGVybmlvbiggX3F1YXRlcm5pb24gKTtcclxuXHJcblx0XHRjb25zdCBwYW5uZXIgPSB0aGlzLnBhbm5lcjtcclxuXHJcblx0XHRpZiAoIHBhbm5lci5wb3NpdGlvblggKSB7XHJcblxyXG5cdFx0XHQvLyBjb2RlIHBhdGggZm9yIENocm9tZSBhbmQgRmlyZWZveCAoc2VlICMxNDM5MylcclxuXHJcblx0XHRcdGNvbnN0IGVuZFRpbWUgPSB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKyB0aGlzLmxpc3RlbmVyLnRpbWVEZWx0YTtcclxuXHJcblx0XHRcdHBhbm5lci5wb3NpdGlvblgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoIF9wb3NpdGlvbi54LCBlbmRUaW1lICk7XHJcblx0XHRcdHBhbm5lci5wb3NpdGlvblkubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoIF9wb3NpdGlvbi55LCBlbmRUaW1lICk7XHJcblx0XHRcdHBhbm5lci5wb3NpdGlvbloubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoIF9wb3NpdGlvbi56LCBlbmRUaW1lICk7XHJcblx0XHRcdHBhbm5lci5vcmllbnRhdGlvblgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoIF9vcmllbnRhdGlvbi54LCBlbmRUaW1lICk7XHJcblx0XHRcdHBhbm5lci5vcmllbnRhdGlvblkubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoIF9vcmllbnRhdGlvbi55LCBlbmRUaW1lICk7XHJcblx0XHRcdHBhbm5lci5vcmllbnRhdGlvbloubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoIF9vcmllbnRhdGlvbi56LCBlbmRUaW1lICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHBhbm5lci5zZXRQb3NpdGlvbiggX3Bvc2l0aW9uLngsIF9wb3NpdGlvbi55LCBfcG9zaXRpb24ueiApO1xyXG5cdFx0XHRwYW5uZXIuc2V0T3JpZW50YXRpb24oIF9vcmllbnRhdGlvbi54LCBfb3JpZW50YXRpb24ueSwgX29yaWVudGF0aW9uLnogKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFBvc2l0aW9uYWxBdWRpbyB9O1xyXG4iLCIvKipcclxuICogVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byBhbmFseXNlIGF1ZGlvIGRhdGEuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIC8vIGNyZWF0ZSBhbiBBdWRpb0xpc3RlbmVyIGFuZCBhZGQgaXQgdG8gdGhlIGNhbWVyYVxyXG4gKiBjb25zdCBsaXN0ZW5lciA9IG5ldyBUSFJFRS5BdWRpb0xpc3RlbmVyKCk7XHJcbiAqIGNhbWVyYS5hZGQoIGxpc3RlbmVyICk7XHJcbiAqXHJcbiAqIC8vIGNyZWF0ZSBhbiBBdWRpbyBzb3VyY2VcclxuICogY29uc3Qgc291bmQgPSBuZXcgVEhSRUUuQXVkaW8oIGxpc3RlbmVyICk7XHJcbiAqXHJcbiAqIC8vIGxvYWQgYSBzb3VuZCBhbmQgc2V0IGl0IGFzIHRoZSBBdWRpbyBvYmplY3QncyBidWZmZXJcclxuICogY29uc3QgYXVkaW9Mb2FkZXIgPSBuZXcgVEhSRUUuQXVkaW9Mb2FkZXIoKTtcclxuICogYXVkaW9Mb2FkZXIubG9hZCggJ3NvdW5kcy9hbWJpZW50Lm9nZycsIGZ1bmN0aW9uKCBidWZmZXIgKSB7XHJcbiAqIFx0c291bmQuc2V0QnVmZmVyKCBidWZmZXIgKTtcclxuICogXHRzb3VuZC5zZXRMb29wKHRydWUpO1xyXG4gKiBcdHNvdW5kLnNldFZvbHVtZSgwLjUpO1xyXG4gKiBcdHNvdW5kLnBsYXkoKTtcclxuICogfSk7XHJcbiAqXHJcbiAqIC8vIGNyZWF0ZSBhbiBBdWRpb0FuYWx5c2VyLCBwYXNzaW5nIGluIHRoZSBzb3VuZCBhbmQgZGVzaXJlZCBmZnRTaXplXHJcbiAqIGNvbnN0IGFuYWx5c2VyID0gbmV3IFRIUkVFLkF1ZGlvQW5hbHlzZXIoIHNvdW5kLCAzMiApO1xyXG4gKlxyXG4gKiAvLyBnZXQgdGhlIGF2ZXJhZ2UgZnJlcXVlbmN5IG9mIHRoZSBzb3VuZFxyXG4gKiBjb25zdCBkYXRhID0gYW5hbHlzZXIuZ2V0QXZlcmFnZUZyZXF1ZW5jeSgpO1xyXG4gKiBgYGBcclxuICovXHJcbmNsYXNzIEF1ZGlvQW5hbHlzZXIge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGF1ZGlvIGFuYWx5emVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBdWRpb30gYXVkaW8gLSBUaGUgYXVkaW8gdG8gYW5hbHl6ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2ZmdFNpemU9MjA0OF0gLSBUaGUgd2luZG93IHNpemUgaW4gc2FtcGxlcyB0aGF0IGlzIHVzZWQgd2hlbiBwZXJmb3JtaW5nIGEgRmFzdCBGb3VyaWVyIFRyYW5zZm9ybSAoRkZUKSB0byBnZXQgZnJlcXVlbmN5IGRvbWFpbiBkYXRhLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBhdWRpbywgZmZ0U2l6ZSA9IDIwNDggKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZ2xvYmFsIGF1ZGlvIGxpc3RlbmVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBbmFseXNlck5vZGV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYW5hbHlzZXIgPSBhdWRpby5jb250ZXh0LmNyZWF0ZUFuYWx5c2VyKCk7XHJcblx0XHR0aGlzLmFuYWx5c2VyLmZmdFNpemUgPSBmZnRTaXplO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG9sZHMgdGhlIGFuYWx5emVkIGRhdGEuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1VpbnQ4QXJyYXl9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGF0YSA9IG5ldyBVaW50OEFycmF5KCB0aGlzLmFuYWx5c2VyLmZyZXF1ZW5jeUJpbkNvdW50ICk7XHJcblxyXG5cdFx0YXVkaW8uZ2V0T3V0cHV0KCkuY29ubmVjdCggdGhpcy5hbmFseXNlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYW4gYXJyYXkgd2l0aCBmcmVxdWVuY3kgZGF0YSBvZiB0aGUgYXVkaW8uXHJcblx0ICpcclxuXHQgKiBFYWNoIGl0ZW0gaW4gdGhlIGFycmF5IHJlcHJlc2VudHMgdGhlIGRlY2liZWwgdmFsdWUgZm9yIGEgc3BlY2lmaWMgZnJlcXVlbmN5LlxyXG5cdCAqIFRoZSBmcmVxdWVuY2llcyBhcmUgc3ByZWFkIGxpbmVhcmx5IGZyb20gMCB0byAxLzIgb2YgdGhlIHNhbXBsZSByYXRlLlxyXG5cdCAqIEZvciBleGFtcGxlLCBmb3IgNDgwMDAgc2FtcGxlIHJhdGUsIHRoZSBsYXN0IGl0ZW0gb2YgdGhlIGFycmF5IHdpbGwgcmVwcmVzZW50XHJcblx0ICogdGhlIGRlY2liZWwgdmFsdWUgZm9yIDI0MDAwIEh6LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7VWludDhBcnJheX0gVGhlIGZyZXF1ZW5jeSBkYXRhLlxyXG5cdCAqL1xyXG5cdGdldEZyZXF1ZW5jeURhdGEoKSB7XHJcblxyXG5cdFx0dGhpcy5hbmFseXNlci5nZXRCeXRlRnJlcXVlbmN5RGF0YSggdGhpcy5kYXRhICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZGF0YTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBhdmVyYWdlIG9mIHRoZSBmcmVxdWVuY2llcyByZXR1cm5lZCBieSB7QGxpbmsgQXVkaW9BbmFseXNlciNnZXRGcmVxdWVuY3lEYXRhfS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGF2ZXJhZ2UgZnJlcXVlbmN5LlxyXG5cdCAqL1xyXG5cdGdldEF2ZXJhZ2VGcmVxdWVuY3koKSB7XHJcblxyXG5cdFx0bGV0IHZhbHVlID0gMDtcclxuXHRcdGNvbnN0IGRhdGEgPSB0aGlzLmdldEZyZXF1ZW5jeURhdGEoKTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdHZhbHVlICs9IGRhdGFbIGkgXTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHZhbHVlIC8gZGF0YS5sZW5ndGg7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IEF1ZGlvQW5hbHlzZXIgfTtcclxuIiwiaW1wb3J0IHsgUXVhdGVybmlvbiB9IGZyb20gJy4uL21hdGgvUXVhdGVybmlvbi5qcyc7XHJcblxyXG4vKipcclxuICogQnVmZmVyZWQgc2NlbmUgZ3JhcGggcHJvcGVydHkgdGhhdCBhbGxvd3Mgd2VpZ2h0ZWQgYWNjdW11bGF0aW9uOyB1c2VkIGludGVybmFsbHkuXHJcbiAqL1xyXG5jbGFzcyBQcm9wZXJ0eU1peGVyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBwcm9wZXJ0eSBtaXhlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UHJvcGVydHlCaW5kaW5nfSBiaW5kaW5nIC0gVGhlIHByb3BlcnR5IGJpbmRpbmcuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHR5cGVOYW1lIC0gVGhlIGtleWZyYW1lIHRyYWNrIHR5cGUgbmFtZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdmFsdWVTaXplIC0gVGhlIGtleWZyYW1lIHRyYWNrIHZhbHVlIHNpemUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGJpbmRpbmcsIHR5cGVOYW1lLCB2YWx1ZVNpemUgKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcHJvcGVydHkgYmluZGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7UHJvcGVydHlCaW5kaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJpbmRpbmcgPSBiaW5kaW5nO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGtleWZyYW1lIHRyYWNrIHZhbHVlIHNpemUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52YWx1ZVNpemUgPSB2YWx1ZVNpemU7XHJcblxyXG5cdFx0bGV0IG1peEZ1bmN0aW9uLFxyXG5cdFx0XHRtaXhGdW5jdGlvbkFkZGl0aXZlLFxyXG5cdFx0XHRzZXRJZGVudGl0eTtcclxuXHJcblx0XHQvLyBidWZmZXIgbGF5b3V0OiBbIGluY29taW5nIHwgYWNjdTAgfCBhY2N1MSB8IG9yaWcgfCBhZGRBY2N1IHwgKG9wdGlvbmFsIHdvcmspIF1cclxuXHRcdC8vXHJcblx0XHQvLyBpbnRlcnBvbGF0b3JzIGNhbiB1c2UgLmJ1ZmZlciBhcyB0aGVpciAucmVzdWx0XHJcblx0XHQvLyB0aGUgZGF0YSB0aGVuIGdvZXMgdG8gJ2luY29taW5nJ1xyXG5cdFx0Ly9cclxuXHRcdC8vICdhY2N1MCcgYW5kICdhY2N1MScgYXJlIHVzZWQgZnJhbWUtaW50ZXJsZWF2ZWQgZm9yXHJcblx0XHQvLyB0aGUgY3VtdWxhdGl2ZSByZXN1bHQgYW5kIGFyZSBjb21wYXJlZCB0byBkZXRlY3RcclxuXHRcdC8vIGNoYW5nZXNcclxuXHRcdC8vXHJcblx0XHQvLyAnb3JpZycgc3RvcmVzIHRoZSBvcmlnaW5hbCBzdGF0ZSBvZiB0aGUgcHJvcGVydHlcclxuXHRcdC8vXHJcblx0XHQvLyAnYWRkJyBpcyB1c2VkIGZvciBhZGRpdGl2ZSBjdW11bGF0aXZlIHJlc3VsdHNcclxuXHRcdC8vXHJcblx0XHQvLyAnd29yaycgaXMgb3B0aW9uYWwgYW5kIGlzIG9ubHkgcHJlc2VudCBmb3IgcXVhdGVybmlvbiB0eXBlcy4gSXQgaXMgdXNlZFxyXG5cdFx0Ly8gdG8gc3RvcmUgaW50ZXJtZWRpYXRlIHF1YXRlcm5pb24gbXVsdGlwbGljYXRpb24gcmVzdWx0c1xyXG5cclxuXHRcdHN3aXRjaCAoIHR5cGVOYW1lICkge1xyXG5cclxuXHRcdFx0Y2FzZSAncXVhdGVybmlvbic6XHJcblx0XHRcdFx0bWl4RnVuY3Rpb24gPSB0aGlzLl9zbGVycDtcclxuXHRcdFx0XHRtaXhGdW5jdGlvbkFkZGl0aXZlID0gdGhpcy5fc2xlcnBBZGRpdGl2ZTtcclxuXHRcdFx0XHRzZXRJZGVudGl0eSA9IHRoaXMuX3NldEFkZGl0aXZlSWRlbnRpdHlRdWF0ZXJuaW9uO1xyXG5cclxuXHRcdFx0XHR0aGlzLmJ1ZmZlciA9IG5ldyBGbG9hdDY0QXJyYXkoIHZhbHVlU2l6ZSAqIDYgKTtcclxuXHRcdFx0XHR0aGlzLl93b3JrSW5kZXggPSA1O1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSAnc3RyaW5nJzpcclxuXHRcdFx0Y2FzZSAnYm9vbCc6XHJcblx0XHRcdFx0bWl4RnVuY3Rpb24gPSB0aGlzLl9zZWxlY3Q7XHJcblxyXG5cdFx0XHRcdC8vIFVzZSB0aGUgcmVndWxhciBtaXggZnVuY3Rpb24gYW5kIGZvciBhZGRpdGl2ZSBvbiB0aGVzZSB0eXBlcyxcclxuXHRcdFx0XHQvLyBhZGRpdGl2ZSBpcyBub3QgcmVsZXZhbnQgZm9yIG5vbi1udW1lcmljIHR5cGVzXHJcblx0XHRcdFx0bWl4RnVuY3Rpb25BZGRpdGl2ZSA9IHRoaXMuX3NlbGVjdDtcclxuXHJcblx0XHRcdFx0c2V0SWRlbnRpdHkgPSB0aGlzLl9zZXRBZGRpdGl2ZUlkZW50aXR5T3RoZXI7XHJcblxyXG5cdFx0XHRcdHRoaXMuYnVmZmVyID0gbmV3IEFycmF5KCB2YWx1ZVNpemUgKiA1ICk7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdG1peEZ1bmN0aW9uID0gdGhpcy5fbGVycDtcclxuXHRcdFx0XHRtaXhGdW5jdGlvbkFkZGl0aXZlID0gdGhpcy5fbGVycEFkZGl0aXZlO1xyXG5cdFx0XHRcdHNldElkZW50aXR5ID0gdGhpcy5fc2V0QWRkaXRpdmVJZGVudGl0eU51bWVyaWM7XHJcblxyXG5cdFx0XHRcdHRoaXMuYnVmZmVyID0gbmV3IEZsb2F0NjRBcnJheSggdmFsdWVTaXplICogNSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLl9taXhCdWZmZXJSZWdpb24gPSBtaXhGdW5jdGlvbjtcclxuXHRcdHRoaXMuX21peEJ1ZmZlclJlZ2lvbkFkZGl0aXZlID0gbWl4RnVuY3Rpb25BZGRpdGl2ZTtcclxuXHRcdHRoaXMuX3NldElkZW50aXR5ID0gc2V0SWRlbnRpdHk7XHJcblx0XHR0aGlzLl9vcmlnSW5kZXggPSAzO1xyXG5cdFx0dGhpcy5fYWRkSW5kZXggPSA0O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVE9ET1xyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY3VtdWxhdGl2ZVdlaWdodCA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUT0RPXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jdW11bGF0aXZlV2VpZ2h0QWRkaXRpdmUgPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVE9ET1xyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXNlQ291bnQgPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVE9ET1xyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVmZXJlbmNlQ291bnQgPSAwO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFjY3VtdWxhdGVzIGRhdGEgaW4gdGhlIGBpbmNvbWluZ2AgcmVnaW9uIGludG8gYGFjY3U8aT5gLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFjY3VJbmRleCAtIFRoZSBhY2N1bXVsYXRpb24gaW5kZXguXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHdlaWdodCAtIFRoZSB3ZWlnaHQuXHJcblx0ICovXHJcblx0YWNjdW11bGF0ZSggYWNjdUluZGV4LCB3ZWlnaHQgKSB7XHJcblxyXG5cdFx0Ly8gbm90ZTogaGFwcGlseSBhY2N1bXVsYXRpbmcgbm90aGluZyB3aGVuIHdlaWdodCA9IDAsIHRoZSBjYWxsZXIga25vd3NcclxuXHRcdC8vIHRoZSB3ZWlnaHQgYW5kIHNob3VsZG4ndCBoYXZlIG1hZGUgdGhlIGNhbGwgaW4gdGhlIGZpcnN0IHBsYWNlXHJcblxyXG5cdFx0Y29uc3QgYnVmZmVyID0gdGhpcy5idWZmZXIsXHJcblx0XHRcdHN0cmlkZSA9IHRoaXMudmFsdWVTaXplLFxyXG5cdFx0XHRvZmZzZXQgPSBhY2N1SW5kZXggKiBzdHJpZGUgKyBzdHJpZGU7XHJcblxyXG5cdFx0bGV0IGN1cnJlbnRXZWlnaHQgPSB0aGlzLmN1bXVsYXRpdmVXZWlnaHQ7XHJcblxyXG5cdFx0aWYgKCBjdXJyZW50V2VpZ2h0ID09PSAwICkge1xyXG5cclxuXHRcdFx0Ly8gYWNjdU4gOj0gaW5jb21pbmcgKiB3ZWlnaHRcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSAhPT0gc3RyaWRlOyArKyBpICkge1xyXG5cclxuXHRcdFx0XHRidWZmZXJbIG9mZnNldCArIGkgXSA9IGJ1ZmZlclsgaSBdO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y3VycmVudFdlaWdodCA9IHdlaWdodDtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Ly8gYWNjdU4gOj0gYWNjdU4gKyBpbmNvbWluZyAqIHdlaWdodFxyXG5cclxuXHRcdFx0Y3VycmVudFdlaWdodCArPSB3ZWlnaHQ7XHJcblx0XHRcdGNvbnN0IG1peCA9IHdlaWdodCAvIGN1cnJlbnRXZWlnaHQ7XHJcblx0XHRcdHRoaXMuX21peEJ1ZmZlclJlZ2lvbiggYnVmZmVyLCBvZmZzZXQsIDAsIG1peCwgc3RyaWRlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuY3VtdWxhdGl2ZVdlaWdodCA9IGN1cnJlbnRXZWlnaHQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWNjdW11bGF0ZXMgZGF0YSBpbiB0aGUgYGluY29taW5nYCByZWdpb24gaW50byBgYWRkYC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB3ZWlnaHQgLSBUaGUgd2VpZ2h0LlxyXG5cdCAqL1xyXG5cdGFjY3VtdWxhdGVBZGRpdGl2ZSggd2VpZ2h0ICkge1xyXG5cclxuXHRcdGNvbnN0IGJ1ZmZlciA9IHRoaXMuYnVmZmVyLFxyXG5cdFx0XHRzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSxcclxuXHRcdFx0b2Zmc2V0ID0gc3RyaWRlICogdGhpcy5fYWRkSW5kZXg7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmN1bXVsYXRpdmVXZWlnaHRBZGRpdGl2ZSA9PT0gMCApIHtcclxuXHJcblx0XHRcdC8vIGFkZCA9IGlkZW50aXR5XHJcblxyXG5cdFx0XHR0aGlzLl9zZXRJZGVudGl0eSgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBhZGQgOj0gYWRkICsgaW5jb21pbmcgKiB3ZWlnaHRcclxuXHJcblx0XHR0aGlzLl9taXhCdWZmZXJSZWdpb25BZGRpdGl2ZSggYnVmZmVyLCBvZmZzZXQsIDAsIHdlaWdodCwgc3RyaWRlICk7XHJcblx0XHR0aGlzLmN1bXVsYXRpdmVXZWlnaHRBZGRpdGl2ZSArPSB3ZWlnaHQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQXBwbGllcyB0aGUgc3RhdGUgb2YgYGFjY3U8aT5gIHRvIHRoZSBiaW5kaW5nIHdoZW4gYWNjdXMgZGlmZmVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFjY3VJbmRleCAtIFRoZSBhY2N1bXVsYXRpb24gaW5kZXguXHJcblx0ICovXHJcblx0YXBwbHkoIGFjY3VJbmRleCApIHtcclxuXHJcblx0XHRjb25zdCBzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSxcclxuXHRcdFx0YnVmZmVyID0gdGhpcy5idWZmZXIsXHJcblx0XHRcdG9mZnNldCA9IGFjY3VJbmRleCAqIHN0cmlkZSArIHN0cmlkZSxcclxuXHJcblx0XHRcdHdlaWdodCA9IHRoaXMuY3VtdWxhdGl2ZVdlaWdodCxcclxuXHRcdFx0d2VpZ2h0QWRkaXRpdmUgPSB0aGlzLmN1bXVsYXRpdmVXZWlnaHRBZGRpdGl2ZSxcclxuXHJcblx0XHRcdGJpbmRpbmcgPSB0aGlzLmJpbmRpbmc7XHJcblxyXG5cdFx0dGhpcy5jdW11bGF0aXZlV2VpZ2h0ID0gMDtcclxuXHRcdHRoaXMuY3VtdWxhdGl2ZVdlaWdodEFkZGl0aXZlID0gMDtcclxuXHJcblx0XHRpZiAoIHdlaWdodCA8IDEgKSB7XHJcblxyXG5cdFx0XHQvLyBhY2N1TiA6PSBhY2N1TiArIG9yaWdpbmFsICogKCAxIC0gY3VtdWxhdGl2ZVdlaWdodCApXHJcblxyXG5cdFx0XHRjb25zdCBvcmlnaW5hbFZhbHVlT2Zmc2V0ID0gc3RyaWRlICogdGhpcy5fb3JpZ0luZGV4O1xyXG5cclxuXHRcdFx0dGhpcy5fbWl4QnVmZmVyUmVnaW9uKFxyXG5cdFx0XHRcdGJ1ZmZlciwgb2Zmc2V0LCBvcmlnaW5hbFZhbHVlT2Zmc2V0LCAxIC0gd2VpZ2h0LCBzdHJpZGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB3ZWlnaHRBZGRpdGl2ZSA+IDAgKSB7XHJcblxyXG5cdFx0XHQvLyBhY2N1TiA6PSBhY2N1TiArIGFkZGl0aXZlIGFjY3VOXHJcblxyXG5cdFx0XHR0aGlzLl9taXhCdWZmZXJSZWdpb25BZGRpdGl2ZSggYnVmZmVyLCBvZmZzZXQsIHRoaXMuX2FkZEluZGV4ICogc3RyaWRlLCAxLCBzdHJpZGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSBzdHJpZGUsIGUgPSBzdHJpZGUgKyBzdHJpZGU7IGkgIT09IGU7ICsrIGkgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGJ1ZmZlclsgaSBdICE9PSBidWZmZXJbIGkgKyBzdHJpZGUgXSApIHtcclxuXHJcblx0XHRcdFx0Ly8gdmFsdWUgaGFzIGNoYW5nZWQgLT4gdXBkYXRlIHNjZW5lIGdyYXBoXHJcblxyXG5cdFx0XHRcdGJpbmRpbmcuc2V0VmFsdWUoIGJ1ZmZlciwgb2Zmc2V0ICk7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBSZW1lbWJlcnMgdGhlIHN0YXRlIG9mIHRoZSBib3VuZCBwcm9wZXJ0eSBhbmQgY29weSBpdCB0byBib3RoIGFjY3VzLlxyXG5cdCAqL1xyXG5cdHNhdmVPcmlnaW5hbFN0YXRlKCkge1xyXG5cclxuXHRcdGNvbnN0IGJpbmRpbmcgPSB0aGlzLmJpbmRpbmc7XHJcblxyXG5cdFx0Y29uc3QgYnVmZmVyID0gdGhpcy5idWZmZXIsXHJcblx0XHRcdHN0cmlkZSA9IHRoaXMudmFsdWVTaXplLFxyXG5cclxuXHRcdFx0b3JpZ2luYWxWYWx1ZU9mZnNldCA9IHN0cmlkZSAqIHRoaXMuX29yaWdJbmRleDtcclxuXHJcblx0XHRiaW5kaW5nLmdldFZhbHVlKCBidWZmZXIsIG9yaWdpbmFsVmFsdWVPZmZzZXQgKTtcclxuXHJcblx0XHQvLyBhY2N1WzAuLjFdIDo9IG9yaWcgLS0gaW5pdGlhbGx5IGRldGVjdCBjaGFuZ2VzIGFnYWluc3QgdGhlIG9yaWdpbmFsXHJcblx0XHRmb3IgKCBsZXQgaSA9IHN0cmlkZSwgZSA9IG9yaWdpbmFsVmFsdWVPZmZzZXQ7IGkgIT09IGU7ICsrIGkgKSB7XHJcblxyXG5cdFx0XHRidWZmZXJbIGkgXSA9IGJ1ZmZlclsgb3JpZ2luYWxWYWx1ZU9mZnNldCArICggaSAlIHN0cmlkZSApIF07XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEFkZCB0byBpZGVudGl0eSBmb3IgYWRkaXRpdmVcclxuXHRcdHRoaXMuX3NldElkZW50aXR5KCk7XHJcblxyXG5cdFx0dGhpcy5jdW11bGF0aXZlV2VpZ2h0ID0gMDtcclxuXHRcdHRoaXMuY3VtdWxhdGl2ZVdlaWdodEFkZGl0aXZlID0gMDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBcHBsaWVzIHRoZSBzdGF0ZSBwcmV2aW91c2x5IHRha2VuIHZpYSB7QGxpbmsgUHJvcGVydHlNaXhlciNzYXZlT3JpZ2luYWxTdGF0ZX0gdG8gdGhlIGJpbmRpbmcuXHJcblx0ICovXHJcblx0cmVzdG9yZU9yaWdpbmFsU3RhdGUoKSB7XHJcblxyXG5cdFx0Y29uc3Qgb3JpZ2luYWxWYWx1ZU9mZnNldCA9IHRoaXMudmFsdWVTaXplICogMztcclxuXHRcdHRoaXMuYmluZGluZy5zZXRWYWx1ZSggdGhpcy5idWZmZXIsIG9yaWdpbmFsVmFsdWVPZmZzZXQgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvLyBpbnRlcm5hbHNcclxuXHJcblx0X3NldEFkZGl0aXZlSWRlbnRpdHlOdW1lcmljKCkge1xyXG5cclxuXHRcdGNvbnN0IHN0YXJ0SW5kZXggPSB0aGlzLl9hZGRJbmRleCAqIHRoaXMudmFsdWVTaXplO1xyXG5cdFx0Y29uc3QgZW5kSW5kZXggPSBzdGFydEluZGV4ICsgdGhpcy52YWx1ZVNpemU7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSBzdGFydEluZGV4OyBpIDwgZW5kSW5kZXg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmJ1ZmZlclsgaSBdID0gMDtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0X3NldEFkZGl0aXZlSWRlbnRpdHlRdWF0ZXJuaW9uKCkge1xyXG5cclxuXHRcdHRoaXMuX3NldEFkZGl0aXZlSWRlbnRpdHlOdW1lcmljKCk7XHJcblx0XHR0aGlzLmJ1ZmZlclsgdGhpcy5fYWRkSW5kZXggKiB0aGlzLnZhbHVlU2l6ZSArIDMgXSA9IDE7XHJcblxyXG5cdH1cclxuXHJcblx0X3NldEFkZGl0aXZlSWRlbnRpdHlPdGhlcigpIHtcclxuXHJcblx0XHRjb25zdCBzdGFydEluZGV4ID0gdGhpcy5fb3JpZ0luZGV4ICogdGhpcy52YWx1ZVNpemU7XHJcblx0XHRjb25zdCB0YXJnZXRJbmRleCA9IHRoaXMuX2FkZEluZGV4ICogdGhpcy52YWx1ZVNpemU7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdGhpcy52YWx1ZVNpemU7IGkgKysgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmJ1ZmZlclsgdGFyZ2V0SW5kZXggKyBpIF0gPSB0aGlzLmJ1ZmZlclsgc3RhcnRJbmRleCArIGkgXTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblxyXG5cdC8vIG1peCBmdW5jdGlvbnNcclxuXHJcblx0X3NlbGVjdCggYnVmZmVyLCBkc3RPZmZzZXQsIHNyY09mZnNldCwgdCwgc3RyaWRlICkge1xyXG5cclxuXHRcdGlmICggdCA+PSAwLjUgKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgIT09IHN0cmlkZTsgKysgaSApIHtcclxuXHJcblx0XHRcdFx0YnVmZmVyWyBkc3RPZmZzZXQgKyBpIF0gPSBidWZmZXJbIHNyY09mZnNldCArIGkgXTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0X3NsZXJwKCBidWZmZXIsIGRzdE9mZnNldCwgc3JjT2Zmc2V0LCB0ICkge1xyXG5cclxuXHRcdFF1YXRlcm5pb24uc2xlcnBGbGF0KCBidWZmZXIsIGRzdE9mZnNldCwgYnVmZmVyLCBkc3RPZmZzZXQsIGJ1ZmZlciwgc3JjT2Zmc2V0LCB0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0X3NsZXJwQWRkaXRpdmUoIGJ1ZmZlciwgZHN0T2Zmc2V0LCBzcmNPZmZzZXQsIHQsIHN0cmlkZSApIHtcclxuXHJcblx0XHRjb25zdCB3b3JrT2Zmc2V0ID0gdGhpcy5fd29ya0luZGV4ICogc3RyaWRlO1xyXG5cclxuXHRcdC8vIFN0b3JlIHJlc3VsdCBpbiBpbnRlcm1lZGlhdGUgYnVmZmVyIG9mZnNldFxyXG5cdFx0UXVhdGVybmlvbi5tdWx0aXBseVF1YXRlcm5pb25zRmxhdCggYnVmZmVyLCB3b3JrT2Zmc2V0LCBidWZmZXIsIGRzdE9mZnNldCwgYnVmZmVyLCBzcmNPZmZzZXQgKTtcclxuXHJcblx0XHQvLyBTbGVycCB0byB0aGUgaW50ZXJtZWRpYXRlIHJlc3VsdFxyXG5cdFx0UXVhdGVybmlvbi5zbGVycEZsYXQoIGJ1ZmZlciwgZHN0T2Zmc2V0LCBidWZmZXIsIGRzdE9mZnNldCwgYnVmZmVyLCB3b3JrT2Zmc2V0LCB0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0X2xlcnAoIGJ1ZmZlciwgZHN0T2Zmc2V0LCBzcmNPZmZzZXQsIHQsIHN0cmlkZSApIHtcclxuXHJcblx0XHRjb25zdCBzID0gMSAtIHQ7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpICE9PSBzdHJpZGU7ICsrIGkgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBqID0gZHN0T2Zmc2V0ICsgaTtcclxuXHJcblx0XHRcdGJ1ZmZlclsgaiBdID0gYnVmZmVyWyBqIF0gKiBzICsgYnVmZmVyWyBzcmNPZmZzZXQgKyBpIF0gKiB0O1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRfbGVycEFkZGl0aXZlKCBidWZmZXIsIGRzdE9mZnNldCwgc3JjT2Zmc2V0LCB0LCBzdHJpZGUgKSB7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpICE9PSBzdHJpZGU7ICsrIGkgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBqID0gZHN0T2Zmc2V0ICsgaTtcclxuXHJcblx0XHRcdGJ1ZmZlclsgaiBdID0gYnVmZmVyWyBqIF0gKyBidWZmZXJbIHNyY09mZnNldCArIGkgXSAqIHQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgUHJvcGVydHlNaXhlciB9O1xyXG4iLCIvLyBDaGFyYWN0ZXJzIFtdLjovIGFyZSByZXNlcnZlZCBmb3IgdHJhY2sgYmluZGluZyBzeW50YXguXHJcbmNvbnN0IF9SRVNFUlZFRF9DSEFSU19SRSA9ICdcXFxcW1xcXFxdXFxcXC46XFxcXC8nO1xyXG5jb25zdCBfcmVzZXJ2ZWRSZSA9IG5ldyBSZWdFeHAoICdbJyArIF9SRVNFUlZFRF9DSEFSU19SRSArICddJywgJ2cnICk7XHJcblxyXG4vLyBBdHRlbXB0cyB0byBhbGxvdyBub2RlIG5hbWVzIGZyb20gYW55IGxhbmd1YWdlLiBFUzUncyBgXFx3YCByZWdleHAgbWF0Y2hlc1xyXG4vLyBvbmx5IGxhdGluIGNoYXJhY3RlcnMsIGFuZCB0aGUgdW5pY29kZSBcXHB7TH0gaXMgbm90IHlldCBzdXBwb3J0ZWQuIFNvXHJcbi8vIGluc3RlYWQsIHdlIGV4Y2x1ZGUgcmVzZXJ2ZWQgY2hhcmFjdGVycyBhbmQgbWF0Y2ggZXZlcnl0aGluZyBlbHNlLlxyXG5jb25zdCBfd29yZENoYXIgPSAnW14nICsgX1JFU0VSVkVEX0NIQVJTX1JFICsgJ10nO1xyXG5jb25zdCBfd29yZENoYXJPckRvdCA9ICdbXicgKyBfUkVTRVJWRURfQ0hBUlNfUkUucmVwbGFjZSggJ1xcXFwuJywgJycgKSArICddJztcclxuXHJcbi8vIFBhcmVudCBkaXJlY3RvcmllcywgZGVsaW1pdGVkIGJ5ICcvJyBvciAnOicuIEN1cnJlbnRseSB1bnVzZWQsIGJ1dCBtdXN0XHJcbi8vIGJlIG1hdGNoZWQgdG8gcGFyc2UgdGhlIHJlc3Qgb2YgdGhlIHRyYWNrIG5hbWUuXHJcbmNvbnN0IF9kaXJlY3RvcnlSZSA9IC8qQF9fUFVSRV9fKi8gLygoPzpXQytbXFwvOl0pKikvLnNvdXJjZS5yZXBsYWNlKCAnV0MnLCBfd29yZENoYXIgKTtcclxuXHJcbi8vIFRhcmdldCBub2RlLiBNYXkgY29udGFpbiB3b3JkIGNoYXJhY3RlcnMgKGEtekEtWjAtOV8pIGFuZCAnLicgb3IgJy0nLlxyXG5jb25zdCBfbm9kZVJlID0gLypAX19QVVJFX18qLyAvKFdDT0QrKT8vLnNvdXJjZS5yZXBsYWNlKCAnV0NPRCcsIF93b3JkQ2hhck9yRG90ICk7XHJcblxyXG4vLyBPYmplY3Qgb24gdGFyZ2V0IG5vZGUsIGFuZCBhY2Nlc3Nvci4gTWF5IG5vdCBjb250YWluIHJlc2VydmVkXHJcbi8vIGNoYXJhY3RlcnMuIEFjY2Vzc29yIG1heSBjb250YWluIGFueSBjaGFyYWN0ZXIgZXhjZXB0IGNsb3NpbmcgYnJhY2tldC5cclxuY29uc3QgX29iamVjdFJlID0gLypAX19QVVJFX18qLyAvKD86XFwuKFdDKykoPzpcXFsoLispXFxdKT8pPy8uc291cmNlLnJlcGxhY2UoICdXQycsIF93b3JkQ2hhciApO1xyXG5cclxuLy8gUHJvcGVydHkgYW5kIGFjY2Vzc29yLiBNYXkgbm90IGNvbnRhaW4gcmVzZXJ2ZWQgY2hhcmFjdGVycy4gQWNjZXNzb3IgbWF5XHJcbi8vIGNvbnRhaW4gYW55IG5vbi1icmFja2V0IGNoYXJhY3RlcnMuXHJcbmNvbnN0IF9wcm9wZXJ0eVJlID0gLypAX19QVVJFX18qLyAvXFwuKFdDKykoPzpcXFsoLispXFxdKT8vLnNvdXJjZS5yZXBsYWNlKCAnV0MnLCBfd29yZENoYXIgKTtcclxuXHJcbmNvbnN0IF90cmFja1JlID0gbmV3IFJlZ0V4cCggJydcclxuXHQrICdeJ1xyXG5cdCsgX2RpcmVjdG9yeVJlXHJcblx0KyBfbm9kZVJlXHJcblx0KyBfb2JqZWN0UmVcclxuXHQrIF9wcm9wZXJ0eVJlXHJcblx0KyAnJCdcclxuKTtcclxuXHJcbmNvbnN0IF9zdXBwb3J0ZWRPYmplY3ROYW1lcyA9IFsgJ21hdGVyaWFsJywgJ21hdGVyaWFscycsICdib25lcycsICdtYXAnIF07XHJcblxyXG5jbGFzcyBDb21wb3NpdGUge1xyXG5cclxuXHRjb25zdHJ1Y3RvciggdGFyZ2V0R3JvdXAsIHBhdGgsIG9wdGlvbmFsUGFyc2VkUGF0aCApIHtcclxuXHJcblx0XHRjb25zdCBwYXJzZWRQYXRoID0gb3B0aW9uYWxQYXJzZWRQYXRoIHx8IFByb3BlcnR5QmluZGluZy5wYXJzZVRyYWNrTmFtZSggcGF0aCApO1xyXG5cclxuXHRcdHRoaXMuX3RhcmdldEdyb3VwID0gdGFyZ2V0R3JvdXA7XHJcblx0XHR0aGlzLl9iaW5kaW5ncyA9IHRhcmdldEdyb3VwLnN1YnNjcmliZV8oIHBhdGgsIHBhcnNlZFBhdGggKTtcclxuXHJcblx0fVxyXG5cclxuXHRnZXRWYWx1ZSggYXJyYXksIG9mZnNldCApIHtcclxuXHJcblx0XHR0aGlzLmJpbmQoKTsgLy8gYmluZCBhbGwgYmluZGluZ1xyXG5cclxuXHRcdGNvbnN0IGZpcnN0VmFsaWRJbmRleCA9IHRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXyxcclxuXHRcdFx0YmluZGluZyA9IHRoaXMuX2JpbmRpbmdzWyBmaXJzdFZhbGlkSW5kZXggXTtcclxuXHJcblx0XHQvLyBhbmQgb25seSBjYWxsIC5nZXRWYWx1ZSBvbiB0aGUgZmlyc3RcclxuXHRcdGlmICggYmluZGluZyAhPT0gdW5kZWZpbmVkICkgYmluZGluZy5nZXRWYWx1ZSggYXJyYXksIG9mZnNldCApO1xyXG5cclxuXHR9XHJcblxyXG5cdHNldFZhbHVlKCBhcnJheSwgb2Zmc2V0ICkge1xyXG5cclxuXHRcdGNvbnN0IGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3M7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSB0aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c18sIG4gPSBiaW5kaW5ncy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XHJcblxyXG5cdFx0XHRiaW5kaW5nc1sgaSBdLnNldFZhbHVlKCBhcnJheSwgb2Zmc2V0ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGJpbmQoKSB7XHJcblxyXG5cdFx0Y29uc3QgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncztcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IHRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXywgbiA9IGJpbmRpbmdzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcclxuXHJcblx0XHRcdGJpbmRpbmdzWyBpIF0uYmluZCgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHR1bmJpbmQoKSB7XHJcblxyXG5cdFx0Y29uc3QgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncztcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IHRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXywgbiA9IGJpbmRpbmdzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcclxuXHJcblx0XHRcdGJpbmRpbmdzWyBpIF0udW5iaW5kKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vLyBOb3RlOiBUaGlzIGNsYXNzIHVzZXMgYSBTdGF0ZSBwYXR0ZXJuIG9uIGEgcGVyLW1ldGhvZCBiYXNpczpcclxuLy8gJ2JpbmQnIHNldHMgJ3RoaXMuZ2V0VmFsdWUnIC8gJ3NldFZhbHVlJyBhbmQgc2hhZG93cyB0aGVcclxuLy8gcHJvdG90eXBlIHZlcnNpb24gb2YgdGhlc2UgbWV0aG9kcyB3aXRoIG9uZSB0aGF0IHJlcHJlc2VudHNcclxuLy8gdGhlIGJvdW5kIHN0YXRlLiBXaGVuIHRoZSBwcm9wZXJ0eSBpcyBub3QgZm91bmQsIHRoZSBtZXRob2RzXHJcbi8vIGJlY29tZSBuby1vcHMuXHJcblxyXG5cclxuLyoqXHJcbiAqIFRoaXMgaG9sZHMgYSByZWZlcmVuY2UgdG8gYSByZWFsIHByb3BlcnR5IGluIHRoZSBzY2VuZSBncmFwaDsgdXNlZCBpbnRlcm5hbGx5LlxyXG4gKi9cclxuY2xhc3MgUHJvcGVydHlCaW5kaW5nIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBwcm9wZXJ0eSBiaW5kaW5nLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IHJvb3ROb2RlIC0gVGhlIHJvb3Qgbm9kZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFRoZSBwYXRoLlxyXG5cdCAqIEBwYXJhbSB7P09iamVjdH0gW3BhcnNlZFBhdGhdIC0gVGhlIHBhcnNlZCBwYXRoLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCByb290Tm9kZSwgcGF0aCwgcGFyc2VkUGF0aCApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBvYmplY3QgcGF0aCB0byB0aGUgYW5pbWF0ZWQgcHJvcGVydHkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wYXRoID0gcGF0aDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIG9iamVjdCBob2xkaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwYXRoLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucGFyc2VkUGF0aCA9IHBhcnNlZFBhdGggfHwgUHJvcGVydHlCaW5kaW5nLnBhcnNlVHJhY2tOYW1lKCBwYXRoICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgb2JqZWN0IG93bnMgdGhlIGFuaW1hdGVkIHByb3BlcnR5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vZGUgPSBQcm9wZXJ0eUJpbmRpbmcuZmluZE5vZGUoIHJvb3ROb2RlLCB0aGlzLnBhcnNlZFBhdGgubm9kZU5hbWUgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByb290IG5vZGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdDNEfFNrZWxldG9ufVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJvb3ROb2RlID0gcm9vdE5vZGU7XHJcblxyXG5cdFx0Ly8gaW5pdGlhbCBzdGF0ZSBvZiB0aGVzZSBtZXRob2RzIHRoYXQgY2FsbHMgJ2JpbmQnXHJcblx0XHR0aGlzLmdldFZhbHVlID0gdGhpcy5fZ2V0VmFsdWVfdW5ib3VuZDtcclxuXHRcdHRoaXMuc2V0VmFsdWUgPSB0aGlzLl9zZXRWYWx1ZV91bmJvdW5kO1xyXG5cclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBGYWN0b3J5IG1ldGhvZCBmb3IgY3JlYXRpbmcgYSBwcm9wZXJ0eSBiaW5kaW5nIGZyb20gdGhlIGdpdmVuIHBhcmFtZXRlcnMuXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IHJvb3QgLSBUaGUgcm9vdCBub2RlLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gVGhlIHBhdGguXHJcblx0ICogQHBhcmFtIHs/T2JqZWN0fSBbcGFyc2VkUGF0aF0gLSBUaGUgcGFyc2VkIHBhdGguXHJcblx0ICogQHJldHVybiB7UHJvcGVydHlCaW5kaW5nfENvbXBvc2l0ZX0gVGhlIGNyZWF0ZWQgcHJvcGVydHkgYmluZGluZyBvciBjb21wb3NpdGUuXHJcblx0ICovXHJcblx0c3RhdGljIGNyZWF0ZSggcm9vdCwgcGF0aCwgcGFyc2VkUGF0aCApIHtcclxuXHJcblx0XHRpZiAoICEgKCByb290ICYmIHJvb3QuaXNBbmltYXRpb25PYmplY3RHcm91cCApICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIG5ldyBQcm9wZXJ0eUJpbmRpbmcoIHJvb3QsIHBhdGgsIHBhcnNlZFBhdGggKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0cmV0dXJuIG5ldyBQcm9wZXJ0eUJpbmRpbmcuQ29tcG9zaXRlKCByb290LCBwYXRoLCBwYXJzZWRQYXRoICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlcGxhY2VzIHNwYWNlcyB3aXRoIHVuZGVyc2NvcmVzIGFuZCByZW1vdmVzIHVuc3VwcG9ydGVkIGNoYXJhY3RlcnMgZnJvbVxyXG5cdCAqIG5vZGUgbmFtZXMsIHRvIGVuc3VyZSBjb21wYXRpYmlsaXR5IHdpdGggcGFyc2VUcmFja05hbWUoKS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gTm9kZSBuYW1lIHRvIGJlIHNhbml0aXplZC5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBzYW5pdGl6ZWQgbm9kZSBuYW1lLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBzYW5pdGl6ZU5vZGVOYW1lKCBuYW1lICkge1xyXG5cclxuXHRcdHJldHVybiBuYW1lLnJlcGxhY2UoIC9cXHMvZywgJ18nICkucmVwbGFjZSggX3Jlc2VydmVkUmUsICcnICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUGFyc2VzIHRoZSBnaXZlbiB0cmFjayBuYW1lIChhbiBvYmplY3QgcGF0aCB0byBhbiBhbmltYXRlZCBwcm9wZXJ0eSkgYW5kXHJcblx0ICogcmV0dXJucyBhbiBvYmplY3Qgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGF0aC4gTWF0Y2hlcyBzdHJpbmdzIGluIHRoZSBmb2xsb3dpbmcgZm9ybXM6XHJcblx0ICpcclxuXHQgKiAtIG5vZGVOYW1lLnByb3BlcnR5XHJcblx0ICogLSBub2RlTmFtZS5wcm9wZXJ0eVthY2Nlc3Nvcl1cclxuXHQgKiAtIG5vZGVOYW1lLm1hdGVyaWFsLnByb3BlcnR5W2FjY2Vzc29yXVxyXG5cdCAqIC0gdXVpZC5wcm9wZXJ0eVthY2Nlc3Nvcl1cclxuXHQgKiAtIHV1aWQub2JqZWN0TmFtZVtvYmplY3RJbmRleF0ucHJvcGVydHlOYW1lW3Byb3BlcnR5SW5kZXhdXHJcblx0ICogLSBwYXJlbnROYW1lL25vZGVOYW1lLnByb3BlcnR5XHJcblx0ICogLSBwYXJlbnROYW1lL3BhcmVudE5hbWUvbm9kZU5hbWUucHJvcGVydHlbaW5kZXhdXHJcblx0ICogLSAuYm9uZVtBcm1hdHVyZS5ERUZfY29nXS5wb3NpdGlvblxyXG5cdCAqIC0gc2NlbmU6aGVsaXVtX2JhbGxvb25fbW9kZWw6aGVsaXVtX2JhbGxvb25fbW9kZWwucG9zaXRpb25cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdHJhY2tOYW1lIC0gVGhlIHRyYWNrIG5hbWUgdG8gcGFyc2UuXHJcblx0ICogQHJldHVybiB7T2JqZWN0fSBUaGUgcGFyc2VkIHRyYWNrIG5hbWUgYXMgYW4gb2JqZWN0LlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBwYXJzZVRyYWNrTmFtZSggdHJhY2tOYW1lICkge1xyXG5cclxuXHRcdGNvbnN0IG1hdGNoZXMgPSBfdHJhY2tSZS5leGVjKCB0cmFja05hbWUgKTtcclxuXHJcblx0XHRpZiAoIG1hdGNoZXMgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdQcm9wZXJ0eUJpbmRpbmc6IENhbm5vdCBwYXJzZSB0cmFja05hbWU6ICcgKyB0cmFja05hbWUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgcmVzdWx0cyA9IHtcclxuXHRcdFx0Ly8gZGlyZWN0b3J5TmFtZTogbWF0Y2hlc1sgMSBdLCAvLyAodHNjaHcpIGN1cnJlbnRseSB1bnVzZWRcclxuXHRcdFx0bm9kZU5hbWU6IG1hdGNoZXNbIDIgXSxcclxuXHRcdFx0b2JqZWN0TmFtZTogbWF0Y2hlc1sgMyBdLFxyXG5cdFx0XHRvYmplY3RJbmRleDogbWF0Y2hlc1sgNCBdLFxyXG5cdFx0XHRwcm9wZXJ0eU5hbWU6IG1hdGNoZXNbIDUgXSwgLy8gcmVxdWlyZWRcclxuXHRcdFx0cHJvcGVydHlJbmRleDogbWF0Y2hlc1sgNiBdXHJcblx0XHR9O1xyXG5cclxuXHRcdGNvbnN0IGxhc3REb3QgPSByZXN1bHRzLm5vZGVOYW1lICYmIHJlc3VsdHMubm9kZU5hbWUubGFzdEluZGV4T2YoICcuJyApO1xyXG5cclxuXHRcdGlmICggbGFzdERvdCAhPT0gdW5kZWZpbmVkICYmIGxhc3REb3QgIT09IC0gMSApIHtcclxuXHJcblx0XHRcdGNvbnN0IG9iamVjdE5hbWUgPSByZXN1bHRzLm5vZGVOYW1lLnN1YnN0cmluZyggbGFzdERvdCArIDEgKTtcclxuXHJcblx0XHRcdC8vIE9iamVjdCBuYW1lcyBtdXN0IGJlIGNoZWNrZWQgYWdhaW5zdCBhbiBhbGxvd2xpc3QuIE90aGVyd2lzZSwgdGhlcmVcclxuXHRcdFx0Ly8gaXMgbm8gd2F5IHRvIHBhcnNlICdmb28uYmFyLmJheic6ICdiYXonIG11c3QgYmUgYSBwcm9wZXJ0eSwgYnV0XHJcblx0XHRcdC8vICdiYXInIGNvdWxkIGJlIHRoZSBvYmplY3ROYW1lLCBvciBwYXJ0IG9mIGEgbm9kZU5hbWUgKHdoaWNoIGNhblxyXG5cdFx0XHQvLyBpbmNsdWRlICcuJyBjaGFyYWN0ZXJzKS5cclxuXHRcdFx0aWYgKCBfc3VwcG9ydGVkT2JqZWN0TmFtZXMuaW5kZXhPZiggb2JqZWN0TmFtZSApICE9PSAtIDEgKSB7XHJcblxyXG5cdFx0XHRcdHJlc3VsdHMubm9kZU5hbWUgPSByZXN1bHRzLm5vZGVOYW1lLnN1YnN0cmluZyggMCwgbGFzdERvdCApO1xyXG5cdFx0XHRcdHJlc3VsdHMub2JqZWN0TmFtZSA9IG9iamVjdE5hbWU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggcmVzdWx0cy5wcm9wZXJ0eU5hbWUgPT09IG51bGwgfHwgcmVzdWx0cy5wcm9wZXJ0eU5hbWUubGVuZ3RoID09PSAwICkge1xyXG5cclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnUHJvcGVydHlCaW5kaW5nOiBjYW4gbm90IHBhcnNlIHByb3BlcnR5TmFtZSBmcm9tIHRyYWNrTmFtZTogJyArIHRyYWNrTmFtZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcmVzdWx0cztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZWFyY2hlcyBmb3IgYSBub2RlIGluIHRoZSBoaWVyYXJjaHkgb2YgdGhlIGdpdmVuIHJvb3Qgb2JqZWN0IGJ5IHRoZSBnaXZlblxyXG5cdCAqIG5vZGUgbmFtZS5cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gcm9vdCAtIFRoZSByb290IG9iamVjdC5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IG5vZGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIG5vZGUuXHJcblx0ICogQHJldHVybiB7P09iamVjdH0gVGhlIGZvdW5kIG5vZGUuIFJldHVybnMgYG51bGxgIGlmIG5vIG9iamVjdCB3YXMgZm91bmQuXHJcblx0ICovXHJcblx0c3RhdGljIGZpbmROb2RlKCByb290LCBub2RlTmFtZSApIHtcclxuXHJcblx0XHRpZiAoIG5vZGVOYW1lID09PSB1bmRlZmluZWQgfHwgbm9kZU5hbWUgPT09ICcnIHx8IG5vZGVOYW1lID09PSAnLicgfHwgbm9kZU5hbWUgPT09IC0gMSB8fCBub2RlTmFtZSA9PT0gcm9vdC5uYW1lIHx8IG5vZGVOYW1lID09PSByb290LnV1aWQgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gcm9vdDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gc2VhcmNoIGludG8gc2tlbGV0b24gYm9uZXMuXHJcblx0XHRpZiAoIHJvb3Quc2tlbGV0b24gKSB7XHJcblxyXG5cdFx0XHRjb25zdCBib25lID0gcm9vdC5za2VsZXRvbi5nZXRCb25lQnlOYW1lKCBub2RlTmFtZSApO1xyXG5cclxuXHRcdFx0aWYgKCBib25lICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdHJldHVybiBib25lO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBzZWFyY2ggaW50byBub2RlIHN1YnRyZWUuXHJcblx0XHRpZiAoIHJvb3QuY2hpbGRyZW4gKSB7XHJcblxyXG5cdFx0XHRjb25zdCBzZWFyY2hOb2RlU3VidHJlZSA9IGZ1bmN0aW9uICggY2hpbGRyZW4gKSB7XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBjaGlsZE5vZGUgPSBjaGlsZHJlblsgaSBdO1xyXG5cclxuXHRcdFx0XHRcdGlmICggY2hpbGROb2RlLm5hbWUgPT09IG5vZGVOYW1lIHx8IGNoaWxkTm9kZS51dWlkID09PSBub2RlTmFtZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdHJldHVybiBjaGlsZE5vZGU7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHJlc3VsdCA9IHNlYXJjaE5vZGVTdWJ0cmVlKCBjaGlsZE5vZGUuY2hpbGRyZW4gKTtcclxuXHJcblx0XHRcdFx0XHRpZiAoIHJlc3VsdCApIHJldHVybiByZXN1bHQ7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0cmV0dXJuIG51bGw7XHJcblxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0Y29uc3Qgc3ViVHJlZU5vZGUgPSBzZWFyY2hOb2RlU3VidHJlZSggcm9vdC5jaGlsZHJlbiApO1xyXG5cclxuXHRcdFx0aWYgKCBzdWJUcmVlTm9kZSApIHtcclxuXHJcblx0XHRcdFx0cmV0dXJuIHN1YlRyZWVOb2RlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHJcblx0fVxyXG5cclxuXHQvLyB0aGVzZSBhcmUgdXNlZCB0byBcImJpbmRcIiBhIG5vbmV4aXN0ZW50IHByb3BlcnR5XHJcblx0X2dldFZhbHVlX3VuYXZhaWxhYmxlKCkge31cclxuXHRfc2V0VmFsdWVfdW5hdmFpbGFibGUoKSB7fVxyXG5cclxuXHQvLyBHZXR0ZXJzXHJcblxyXG5cdF9nZXRWYWx1ZV9kaXJlY3QoIGJ1ZmZlciwgb2Zmc2V0ICkge1xyXG5cclxuXHRcdGJ1ZmZlclsgb2Zmc2V0IF0gPSB0aGlzLnRhcmdldE9iamVjdFsgdGhpcy5wcm9wZXJ0eU5hbWUgXTtcclxuXHJcblx0fVxyXG5cclxuXHRfZ2V0VmFsdWVfYXJyYXkoIGJ1ZmZlciwgb2Zmc2V0ICkge1xyXG5cclxuXHRcdGNvbnN0IHNvdXJjZSA9IHRoaXMucmVzb2x2ZWRQcm9wZXJ0eTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIG4gPSBzb3VyY2UubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xyXG5cclxuXHRcdFx0YnVmZmVyWyBvZmZzZXQgKysgXSA9IHNvdXJjZVsgaSBdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRfZ2V0VmFsdWVfYXJyYXlFbGVtZW50KCBidWZmZXIsIG9mZnNldCApIHtcclxuXHJcblx0XHRidWZmZXJbIG9mZnNldCBdID0gdGhpcy5yZXNvbHZlZFByb3BlcnR5WyB0aGlzLnByb3BlcnR5SW5kZXggXTtcclxuXHJcblx0fVxyXG5cclxuXHRfZ2V0VmFsdWVfdG9BcnJheSggYnVmZmVyLCBvZmZzZXQgKSB7XHJcblxyXG5cdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5LnRvQXJyYXkoIGJ1ZmZlciwgb2Zmc2V0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gRGlyZWN0XHJcblxyXG5cdF9zZXRWYWx1ZV9kaXJlY3QoIGJ1ZmZlciwgb2Zmc2V0ICkge1xyXG5cclxuXHRcdHRoaXMudGFyZ2V0T2JqZWN0WyB0aGlzLnByb3BlcnR5TmFtZSBdID0gYnVmZmVyWyBvZmZzZXQgXTtcclxuXHJcblx0fVxyXG5cclxuXHRfc2V0VmFsdWVfZGlyZWN0X3NldE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHtcclxuXHJcblx0XHR0aGlzLnRhcmdldE9iamVjdFsgdGhpcy5wcm9wZXJ0eU5hbWUgXSA9IGJ1ZmZlclsgb2Zmc2V0IF07XHJcblx0XHR0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0X3NldFZhbHVlX2RpcmVjdF9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHtcclxuXHJcblx0XHR0aGlzLnRhcmdldE9iamVjdFsgdGhpcy5wcm9wZXJ0eU5hbWUgXSA9IGJ1ZmZlclsgb2Zmc2V0IF07XHJcblx0XHR0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvLyBFbnRpcmVBcnJheVxyXG5cclxuXHRfc2V0VmFsdWVfYXJyYXkoIGJ1ZmZlciwgb2Zmc2V0ICkge1xyXG5cclxuXHRcdGNvbnN0IGRlc3QgPSB0aGlzLnJlc29sdmVkUHJvcGVydHk7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBuID0gZGVzdC5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XHJcblxyXG5cdFx0XHRkZXN0WyBpIF0gPSBidWZmZXJbIG9mZnNldCArKyBdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRfc2V0VmFsdWVfYXJyYXlfc2V0TmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkge1xyXG5cclxuXHRcdGNvbnN0IGRlc3QgPSB0aGlzLnJlc29sdmVkUHJvcGVydHk7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBuID0gZGVzdC5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XHJcblxyXG5cdFx0XHRkZXN0WyBpIF0gPSBidWZmZXJbIG9mZnNldCArKyBdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0X3NldFZhbHVlX2FycmF5X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkge1xyXG5cclxuXHRcdGNvbnN0IGRlc3QgPSB0aGlzLnJlc29sdmVkUHJvcGVydHk7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBuID0gZGVzdC5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XHJcblxyXG5cdFx0XHRkZXN0WyBpIF0gPSBidWZmZXJbIG9mZnNldCArKyBdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvLyBBcnJheUVsZW1lbnRcclxuXHJcblx0X3NldFZhbHVlX2FycmF5RWxlbWVudCggYnVmZmVyLCBvZmZzZXQgKSB7XHJcblxyXG5cdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5WyB0aGlzLnByb3BlcnR5SW5kZXggXSA9IGJ1ZmZlclsgb2Zmc2V0IF07XHJcblxyXG5cdH1cclxuXHJcblx0X3NldFZhbHVlX2FycmF5RWxlbWVudF9zZXROZWVkc1VwZGF0ZSggYnVmZmVyLCBvZmZzZXQgKSB7XHJcblxyXG5cdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5WyB0aGlzLnByb3BlcnR5SW5kZXggXSA9IGJ1ZmZlclsgb2Zmc2V0IF07XHJcblx0XHR0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0X3NldFZhbHVlX2FycmF5RWxlbWVudF9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHtcclxuXHJcblx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHlbIHRoaXMucHJvcGVydHlJbmRleCBdID0gYnVmZmVyWyBvZmZzZXQgXTtcclxuXHRcdHRoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vIEhhc1RvRnJvbUFycmF5XHJcblxyXG5cdF9zZXRWYWx1ZV9mcm9tQXJyYXkoIGJ1ZmZlciwgb2Zmc2V0ICkge1xyXG5cclxuXHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eS5mcm9tQXJyYXkoIGJ1ZmZlciwgb2Zmc2V0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0X3NldFZhbHVlX2Zyb21BcnJheV9zZXROZWVkc1VwZGF0ZSggYnVmZmVyLCBvZmZzZXQgKSB7XHJcblxyXG5cdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5LmZyb21BcnJheSggYnVmZmVyLCBvZmZzZXQgKTtcclxuXHRcdHRoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHRfc2V0VmFsdWVfZnJvbUFycmF5X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkge1xyXG5cclxuXHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eS5mcm9tQXJyYXkoIGJ1ZmZlciwgb2Zmc2V0ICk7XHJcblx0XHR0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHRfZ2V0VmFsdWVfdW5ib3VuZCggdGFyZ2V0QXJyYXksIG9mZnNldCApIHtcclxuXHJcblx0XHR0aGlzLmJpbmQoKTtcclxuXHRcdHRoaXMuZ2V0VmFsdWUoIHRhcmdldEFycmF5LCBvZmZzZXQgKTtcclxuXHJcblx0fVxyXG5cclxuXHRfc2V0VmFsdWVfdW5ib3VuZCggc291cmNlQXJyYXksIG9mZnNldCApIHtcclxuXHJcblx0XHR0aGlzLmJpbmQoKTtcclxuXHRcdHRoaXMuc2V0VmFsdWUoIHNvdXJjZUFycmF5LCBvZmZzZXQgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGEgZ2V0dGVyIC8gc2V0dGVyIHBhaXIgZm9yIHRoZSBwcm9wZXJ0eSB0cmFja2VkIGJ5IHRoaXMgYmluZGluZy5cclxuXHQgKi9cclxuXHRiaW5kKCkge1xyXG5cclxuXHRcdGxldCB0YXJnZXRPYmplY3QgPSB0aGlzLm5vZGU7XHJcblx0XHRjb25zdCBwYXJzZWRQYXRoID0gdGhpcy5wYXJzZWRQYXRoO1xyXG5cclxuXHRcdGNvbnN0IG9iamVjdE5hbWUgPSBwYXJzZWRQYXRoLm9iamVjdE5hbWU7XHJcblx0XHRjb25zdCBwcm9wZXJ0eU5hbWUgPSBwYXJzZWRQYXRoLnByb3BlcnR5TmFtZTtcclxuXHRcdGxldCBwcm9wZXJ0eUluZGV4ID0gcGFyc2VkUGF0aC5wcm9wZXJ0eUluZGV4O1xyXG5cclxuXHRcdGlmICggISB0YXJnZXRPYmplY3QgKSB7XHJcblxyXG5cdFx0XHR0YXJnZXRPYmplY3QgPSBQcm9wZXJ0eUJpbmRpbmcuZmluZE5vZGUoIHRoaXMucm9vdE5vZGUsIHBhcnNlZFBhdGgubm9kZU5hbWUgKTtcclxuXHJcblx0XHRcdHRoaXMubm9kZSA9IHRhcmdldE9iamVjdDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gc2V0IGZhaWwgc3RhdGUgc28gd2UgY2FuIGp1c3QgJ3JldHVybicgb24gZXJyb3JcclxuXHRcdHRoaXMuZ2V0VmFsdWUgPSB0aGlzLl9nZXRWYWx1ZV91bmF2YWlsYWJsZTtcclxuXHRcdHRoaXMuc2V0VmFsdWUgPSB0aGlzLl9zZXRWYWx1ZV91bmF2YWlsYWJsZTtcclxuXHJcblx0XHQvLyBlbnN1cmUgdGhlcmUgaXMgYSB2YWx1ZSBub2RlXHJcblx0XHRpZiAoICEgdGFyZ2V0T2JqZWN0ICkge1xyXG5cclxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBObyB0YXJnZXQgbm9kZSBmb3VuZCBmb3IgdHJhY2s6ICcgKyB0aGlzLnBhdGggKyAnLicgKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIG9iamVjdE5hbWUgKSB7XHJcblxyXG5cdFx0XHRsZXQgb2JqZWN0SW5kZXggPSBwYXJzZWRQYXRoLm9iamVjdEluZGV4O1xyXG5cclxuXHRcdFx0Ly8gc3BlY2lhbCBjYXNlcyB3ZXJlIHdlIG5lZWQgdG8gcmVhY2ggZGVlcGVyIGludG8gdGhlIGhpZXJhcmNoeSB0byBnZXQgdGhlIGZhY2UgbWF0ZXJpYWxzLi4uLlxyXG5cdFx0XHRzd2l0Y2ggKCBvYmplY3ROYW1lICkge1xyXG5cclxuXHRcdFx0XHRjYXNlICdtYXRlcmlhbHMnOlxyXG5cclxuXHRcdFx0XHRcdGlmICggISB0YXJnZXRPYmplY3QubWF0ZXJpYWwgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbWF0ZXJpYWwgYXMgbm9kZSBkb2VzIG5vdCBoYXZlIGEgbWF0ZXJpYWwuJywgdGhpcyApO1xyXG5cdFx0XHRcdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGlmICggISB0YXJnZXRPYmplY3QubWF0ZXJpYWwubWF0ZXJpYWxzICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1hdGVyaWFsLm1hdGVyaWFscyBhcyBub2RlLm1hdGVyaWFsIGRvZXMgbm90IGhhdmUgYSBtYXRlcmlhbHMgYXJyYXkuJywgdGhpcyApO1xyXG5cdFx0XHRcdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHRhcmdldE9iamVjdCA9IHRhcmdldE9iamVjdC5tYXRlcmlhbC5tYXRlcmlhbHM7XHJcblxyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdGNhc2UgJ2JvbmVzJzpcclxuXHJcblx0XHRcdFx0XHRpZiAoICEgdGFyZ2V0T2JqZWN0LnNrZWxldG9uICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIGJvbmVzIGFzIG5vZGUgZG9lcyBub3QgaGF2ZSBhIHNrZWxldG9uLicsIHRoaXMgKTtcclxuXHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvLyBwb3RlbnRpYWwgZnV0dXJlIG9wdGltaXphdGlvbjogc2tpcCB0aGlzIGlmIHByb3BlcnR5SW5kZXggaXMgYWxyZWFkeSBhbiBpbnRlZ2VyXHJcblx0XHRcdFx0XHQvLyBhbmQgY29udmVydCB0aGUgaW50ZWdlciBzdHJpbmcgdG8gYSB0cnVlIGludGVnZXIuXHJcblxyXG5cdFx0XHRcdFx0dGFyZ2V0T2JqZWN0ID0gdGFyZ2V0T2JqZWN0LnNrZWxldG9uLmJvbmVzO1xyXG5cclxuXHRcdFx0XHRcdC8vIHN1cHBvcnQgcmVzb2x2aW5nIG1vcnBoVGFyZ2V0IG5hbWVzIGludG8gaW5kaWNlcy5cclxuXHRcdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHRhcmdldE9iamVjdC5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIHRhcmdldE9iamVjdFsgaSBdLm5hbWUgPT09IG9iamVjdEluZGV4ICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRvYmplY3RJbmRleCA9IGk7XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRjYXNlICdtYXAnOlxyXG5cclxuXHRcdFx0XHRcdGlmICggJ21hcCcgaW4gdGFyZ2V0T2JqZWN0ICkge1xyXG5cclxuXHRcdFx0XHRcdFx0dGFyZ2V0T2JqZWN0ID0gdGFyZ2V0T2JqZWN0Lm1hcDtcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGlmICggISB0YXJnZXRPYmplY3QubWF0ZXJpYWwgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbWF0ZXJpYWwgYXMgbm9kZSBkb2VzIG5vdCBoYXZlIGEgbWF0ZXJpYWwuJywgdGhpcyApO1xyXG5cdFx0XHRcdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGlmICggISB0YXJnZXRPYmplY3QubWF0ZXJpYWwubWFwICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1hdGVyaWFsLm1hcCBhcyBub2RlLm1hdGVyaWFsIGRvZXMgbm90IGhhdmUgYSBtYXAuJywgdGhpcyApO1xyXG5cdFx0XHRcdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHRhcmdldE9iamVjdCA9IHRhcmdldE9iamVjdC5tYXRlcmlhbC5tYXA7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0ZGVmYXVsdDpcclxuXHJcblx0XHRcdFx0XHRpZiAoIHRhcmdldE9iamVjdFsgb2JqZWN0TmFtZSBdID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gb2JqZWN0TmFtZSBvZiBub2RlIHVuZGVmaW5lZC4nLCB0aGlzICk7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0dGFyZ2V0T2JqZWN0ID0gdGFyZ2V0T2JqZWN0WyBvYmplY3ROYW1lIF07XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cclxuXHRcdFx0aWYgKCBvYmplY3RJbmRleCAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIHRhcmdldE9iamVjdFsgb2JqZWN0SW5kZXggXSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IFRyeWluZyB0byBiaW5kIHRvIG9iamVjdEluZGV4IG9mIG9iamVjdE5hbWUsIGJ1dCBpcyB1bmRlZmluZWQuJywgdGhpcywgdGFyZ2V0T2JqZWN0ICk7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0dGFyZ2V0T2JqZWN0ID0gdGFyZ2V0T2JqZWN0WyBvYmplY3RJbmRleCBdO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyByZXNvbHZlIHByb3BlcnR5XHJcblx0XHRjb25zdCBub2RlUHJvcGVydHkgPSB0YXJnZXRPYmplY3RbIHByb3BlcnR5TmFtZSBdO1xyXG5cclxuXHRcdGlmICggbm9kZVByb3BlcnR5ID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBub2RlTmFtZSA9IHBhcnNlZFBhdGgubm9kZU5hbWU7XHJcblxyXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBUcnlpbmcgdG8gdXBkYXRlIHByb3BlcnR5IGZvciB0cmFjazogJyArIG5vZGVOYW1lICtcclxuXHRcdFx0XHQnLicgKyBwcm9wZXJ0eU5hbWUgKyAnIGJ1dCBpdCB3YXNuXFwndCBmb3VuZC4nLCB0YXJnZXRPYmplY3QgKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBkZXRlcm1pbmUgdmVyc2lvbmluZyBzY2hlbWVcclxuXHRcdGxldCB2ZXJzaW9uaW5nID0gdGhpcy5WZXJzaW9uaW5nLk5vbmU7XHJcblxyXG5cdFx0dGhpcy50YXJnZXRPYmplY3QgPSB0YXJnZXRPYmplY3Q7XHJcblxyXG5cdFx0aWYgKCB0YXJnZXRPYmplY3QuaXNNYXRlcmlhbCA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdHZlcnNpb25pbmcgPSB0aGlzLlZlcnNpb25pbmcuTmVlZHNVcGRhdGU7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggdGFyZ2V0T2JqZWN0LmlzT2JqZWN0M0QgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHR2ZXJzaW9uaW5nID0gdGhpcy5WZXJzaW9uaW5nLk1hdHJpeFdvcmxkTmVlZHNVcGRhdGU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGRldGVybWluZSBob3cgdGhlIHByb3BlcnR5IGdldHMgYm91bmRcclxuXHRcdGxldCBiaW5kaW5nVHlwZSA9IHRoaXMuQmluZGluZ1R5cGUuRGlyZWN0O1xyXG5cclxuXHRcdGlmICggcHJvcGVydHlJbmRleCAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Ly8gYWNjZXNzIGEgc3ViIGVsZW1lbnQgb2YgdGhlIHByb3BlcnR5IGFycmF5IChvbmx5IHByaW1pdGl2ZXMgYXJlIHN1cHBvcnRlZCByaWdodCBub3cpXHJcblxyXG5cdFx0XHRpZiAoIHByb3BlcnR5TmFtZSA9PT0gJ21vcnBoVGFyZ2V0SW5mbHVlbmNlcycgKSB7XHJcblxyXG5cdFx0XHRcdC8vIHBvdGVudGlhbCBvcHRpbWl6YXRpb24sIHNraXAgdGhpcyBpZiBwcm9wZXJ0eUluZGV4IGlzIGFscmVhZHkgYW4gaW50ZWdlciwgYW5kIGNvbnZlcnQgdGhlIGludGVnZXIgc3RyaW5nIHRvIGEgdHJ1ZSBpbnRlZ2VyLlxyXG5cclxuXHRcdFx0XHQvLyBzdXBwb3J0IHJlc29sdmluZyBtb3JwaFRhcmdldCBuYW1lcyBpbnRvIGluZGljZXMuXHJcblx0XHRcdFx0aWYgKCAhIHRhcmdldE9iamVjdC5nZW9tZXRyeSApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbW9ycGhUYXJnZXRJbmZsdWVuY2VzIGJlY2F1c2Ugbm9kZSBkb2VzIG5vdCBoYXZlIGEgZ2VvbWV0cnkuJywgdGhpcyApO1xyXG5cdFx0XHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICggISB0YXJnZXRPYmplY3QuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtb3JwaFRhcmdldEluZmx1ZW5jZXMgYmVjYXVzZSBub2RlIGRvZXMgbm90IGhhdmUgYSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMuJywgdGhpcyApO1xyXG5cdFx0XHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICggdGFyZ2V0T2JqZWN0Lm1vcnBoVGFyZ2V0RGljdGlvbmFyeVsgcHJvcGVydHlJbmRleCBdICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0cHJvcGVydHlJbmRleCA9IHRhcmdldE9iamVjdC5tb3JwaFRhcmdldERpY3Rpb25hcnlbIHByb3BlcnR5SW5kZXggXTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0YmluZGluZ1R5cGUgPSB0aGlzLkJpbmRpbmdUeXBlLkFycmF5RWxlbWVudDtcclxuXHJcblx0XHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eSA9IG5vZGVQcm9wZXJ0eTtcclxuXHRcdFx0dGhpcy5wcm9wZXJ0eUluZGV4ID0gcHJvcGVydHlJbmRleDtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBub2RlUHJvcGVydHkuZnJvbUFycmF5ICE9PSB1bmRlZmluZWQgJiYgbm9kZVByb3BlcnR5LnRvQXJyYXkgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdC8vIG11c3QgdXNlIGNvcHkgZm9yIE9iamVjdDNELkV1bGVyL1F1YXRlcm5pb25cclxuXHJcblx0XHRcdGJpbmRpbmdUeXBlID0gdGhpcy5CaW5kaW5nVHlwZS5IYXNGcm9tVG9BcnJheTtcclxuXHJcblx0XHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eSA9IG5vZGVQcm9wZXJ0eTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBBcnJheS5pc0FycmF5KCBub2RlUHJvcGVydHkgKSApIHtcclxuXHJcblx0XHRcdGJpbmRpbmdUeXBlID0gdGhpcy5CaW5kaW5nVHlwZS5FbnRpcmVBcnJheTtcclxuXHJcblx0XHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eSA9IG5vZGVQcm9wZXJ0eTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGhpcy5wcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIHNlbGVjdCBnZXR0ZXIgLyBzZXR0ZXJcclxuXHRcdHRoaXMuZ2V0VmFsdWUgPSB0aGlzLkdldHRlckJ5QmluZGluZ1R5cGVbIGJpbmRpbmdUeXBlIF07XHJcblx0XHR0aGlzLnNldFZhbHVlID0gdGhpcy5TZXR0ZXJCeUJpbmRpbmdUeXBlQW5kVmVyc2lvbmluZ1sgYmluZGluZ1R5cGUgXVsgdmVyc2lvbmluZyBdO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVuYmluZHMgdGhlIHByb3BlcnR5LlxyXG5cdCAqL1xyXG5cdHVuYmluZCgpIHtcclxuXHJcblx0XHR0aGlzLm5vZGUgPSBudWxsO1xyXG5cclxuXHRcdC8vIGJhY2sgdG8gdGhlIHByb3RvdHlwZSB2ZXJzaW9uIG9mIGdldFZhbHVlIC8gc2V0VmFsdWVcclxuXHRcdC8vIG5vdGU6IGF2b2lkaW5nIHRvIG11dGF0ZSB0aGUgc2hhcGUgb2YgJ3RoaXMnIHZpYSAnZGVsZXRlJ1xyXG5cdFx0dGhpcy5nZXRWYWx1ZSA9IHRoaXMuX2dldFZhbHVlX3VuYm91bmQ7XHJcblx0XHR0aGlzLnNldFZhbHVlID0gdGhpcy5fc2V0VmFsdWVfdW5ib3VuZDtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuUHJvcGVydHlCaW5kaW5nLkNvbXBvc2l0ZSA9IENvbXBvc2l0ZTtcclxuXHJcblByb3BlcnR5QmluZGluZy5wcm90b3R5cGUuQmluZGluZ1R5cGUgPSB7XHJcblx0RGlyZWN0OiAwLFxyXG5cdEVudGlyZUFycmF5OiAxLFxyXG5cdEFycmF5RWxlbWVudDogMixcclxuXHRIYXNGcm9tVG9BcnJheTogM1xyXG59O1xyXG5cclxuUHJvcGVydHlCaW5kaW5nLnByb3RvdHlwZS5WZXJzaW9uaW5nID0ge1xyXG5cdE5vbmU6IDAsXHJcblx0TmVlZHNVcGRhdGU6IDEsXHJcblx0TWF0cml4V29ybGROZWVkc1VwZGF0ZTogMlxyXG59O1xyXG5cclxuUHJvcGVydHlCaW5kaW5nLnByb3RvdHlwZS5HZXR0ZXJCeUJpbmRpbmdUeXBlID0gW1xyXG5cclxuXHRQcm9wZXJ0eUJpbmRpbmcucHJvdG90eXBlLl9nZXRWYWx1ZV9kaXJlY3QsXHJcblx0UHJvcGVydHlCaW5kaW5nLnByb3RvdHlwZS5fZ2V0VmFsdWVfYXJyYXksXHJcblx0UHJvcGVydHlCaW5kaW5nLnByb3RvdHlwZS5fZ2V0VmFsdWVfYXJyYXlFbGVtZW50LFxyXG5cdFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUuX2dldFZhbHVlX3RvQXJyYXksXHJcblxyXG5dO1xyXG5cclxuUHJvcGVydHlCaW5kaW5nLnByb3RvdHlwZS5TZXR0ZXJCeUJpbmRpbmdUeXBlQW5kVmVyc2lvbmluZyA9IFtcclxuXHJcblx0W1xyXG5cdFx0Ly8gRGlyZWN0XHJcblx0XHRQcm9wZXJ0eUJpbmRpbmcucHJvdG90eXBlLl9zZXRWYWx1ZV9kaXJlY3QsXHJcblx0XHRQcm9wZXJ0eUJpbmRpbmcucHJvdG90eXBlLl9zZXRWYWx1ZV9kaXJlY3Rfc2V0TmVlZHNVcGRhdGUsXHJcblx0XHRQcm9wZXJ0eUJpbmRpbmcucHJvdG90eXBlLl9zZXRWYWx1ZV9kaXJlY3Rfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSxcclxuXHJcblx0XSwgW1xyXG5cclxuXHRcdC8vIEVudGlyZUFycmF5XHJcblxyXG5cdFx0UHJvcGVydHlCaW5kaW5nLnByb3RvdHlwZS5fc2V0VmFsdWVfYXJyYXksXHJcblx0XHRQcm9wZXJ0eUJpbmRpbmcucHJvdG90eXBlLl9zZXRWYWx1ZV9hcnJheV9zZXROZWVkc1VwZGF0ZSxcclxuXHRcdFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUuX3NldFZhbHVlX2FycmF5X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGUsXHJcblxyXG5cdF0sIFtcclxuXHJcblx0XHQvLyBBcnJheUVsZW1lbnRcclxuXHRcdFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUuX3NldFZhbHVlX2FycmF5RWxlbWVudCxcclxuXHRcdFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUuX3NldFZhbHVlX2FycmF5RWxlbWVudF9zZXROZWVkc1VwZGF0ZSxcclxuXHRcdFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUuX3NldFZhbHVlX2FycmF5RWxlbWVudF9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlLFxyXG5cclxuXHRdLCBbXHJcblxyXG5cdFx0Ly8gSGFzVG9Gcm9tQXJyYXlcclxuXHRcdFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUuX3NldFZhbHVlX2Zyb21BcnJheSxcclxuXHRcdFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUuX3NldFZhbHVlX2Zyb21BcnJheV9zZXROZWVkc1VwZGF0ZSxcclxuXHRcdFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUuX3NldFZhbHVlX2Zyb21BcnJheV9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlLFxyXG5cclxuXHRdXHJcblxyXG5dO1xyXG5cclxuXHJcbmV4cG9ydCB7IFByb3BlcnR5QmluZGluZyB9O1xyXG4iLCJpbXBvcnQgeyBQcm9wZXJ0eUJpbmRpbmcgfSBmcm9tICcuL1Byb3BlcnR5QmluZGluZy5qcyc7XHJcbmltcG9ydCB7IGdlbmVyYXRlVVVJRCB9IGZyb20gJy4uL21hdGgvTWF0aFV0aWxzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIGdyb3VwIG9mIG9iamVjdHMgdGhhdCByZWNlaXZlcyBhIHNoYXJlZCBhbmltYXRpb24gc3RhdGUuXHJcbiAqXHJcbiAqIFVzYWdlOlxyXG4gKlxyXG4gKiAtIEFkZCBvYmplY3RzIHlvdSB3b3VsZCBvdGhlcndpc2UgcGFzcyBhcyAncm9vdCcgdG8gdGhlXHJcbiAqIGNvbnN0cnVjdG9yIG9yIHRoZSAuY2xpcEFjdGlvbiBtZXRob2Qgb2YgQW5pbWF0aW9uTWl4ZXIuXHJcbiAqIC0gSW5zdGVhZCBwYXNzIHRoaXMgb2JqZWN0IGFzICdyb290Jy5cclxuICogLSBZb3UgY2FuIGFsc28gYWRkIGFuZCByZW1vdmUgb2JqZWN0cyBsYXRlciB3aGVuIHRoZSBtaXhlciBpcyBydW5uaW5nLlxyXG4gKlxyXG4gKiBOb3RlOlxyXG4gKlxyXG4gKiAtIE9iamVjdHMgb2YgdGhpcyBjbGFzcyBhcHBlYXIgYXMgb25lIG9iamVjdCB0byB0aGUgbWl4ZXIsXHJcbiAqIHNvIGNhY2hlIGNvbnRyb2wgb2YgdGhlIGluZGl2aWR1YWwgb2JqZWN0cyBtdXN0IGJlIGRvbmUgb24gdGhlIGdyb3VwLlxyXG4gKlxyXG4gKiBMaW1pdGF0aW9uOlxyXG4gKlxyXG4gKiAtIFRoZSBhbmltYXRlZCBwcm9wZXJ0aWVzIG11c3QgYmUgY29tcGF0aWJsZSBhbW9uZyB0aGUgYWxsIG9iamVjdHMgaW4gdGhlIGdyb3VwLlxyXG4gKiAtIEEgc2luZ2xlIHByb3BlcnR5IGNhbiBlaXRoZXIgYmUgY29udHJvbGxlZCB0aHJvdWdoIGEgdGFyZ2V0IGdyb3VwIG9yIGRpcmVjdGx5LCBidXQgbm90IGJvdGguXHJcbiAqL1xyXG5jbGFzcyBBbmltYXRpb25PYmplY3RHcm91cCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYW5pbWF0aW9uIGdyb3VwLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHsuLi5PYmplY3QzRH0gYXJndW1lbnRzIC0gQW4gYXJiaXRyYXJ5IG51bWJlciBvZiAzRCBvYmplY3RzIHRoYXQgc2hhcmUgdGhlIHNhbWUgYW5pbWF0aW9uIHN0YXRlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0FuaW1hdGlvbk9iamVjdEdyb3VwID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBVVUlEIG9mIHRoZSAzRCBvYmplY3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnV1aWQgPSBnZW5lcmF0ZVVVSUQoKTtcclxuXHJcblx0XHQvLyBjYWNoZWQgb2JqZWN0cyBmb2xsb3dlZCBieSB0aGUgYWN0aXZlIG9uZXNcclxuXHRcdHRoaXMuX29iamVjdHMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggYXJndW1lbnRzICk7XHJcblxyXG5cdFx0dGhpcy5uQ2FjaGVkT2JqZWN0c18gPSAwOyAvLyB0aHJlc2hvbGRcclxuXHRcdC8vIG5vdGU6IHJlYWQgYnkgUHJvcGVydHlCaW5kaW5nLkNvbXBvc2l0ZVxyXG5cclxuXHRcdGNvbnN0IGluZGljZXMgPSB7fTtcclxuXHRcdHRoaXMuX2luZGljZXNCeVVVSUQgPSBpbmRpY2VzOyAvLyBmb3IgYm9va2tlZXBpbmdcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xyXG5cclxuXHRcdFx0aW5kaWNlc1sgYXJndW1lbnRzWyBpIF0udXVpZCBdID0gaTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5fcGF0aHMgPSBbXTsgLy8gaW5zaWRlOiBzdHJpbmdcclxuXHRcdHRoaXMuX3BhcnNlZFBhdGhzID0gW107IC8vIGluc2lkZTogeyB3ZSBkb24ndCBjYXJlLCBoZXJlIH1cclxuXHRcdHRoaXMuX2JpbmRpbmdzID0gW107IC8vIGluc2lkZTogQXJyYXk8IFByb3BlcnR5QmluZGluZyA+XHJcblx0XHR0aGlzLl9iaW5kaW5nc0luZGljZXNCeVBhdGggPSB7fTsgLy8gaW5zaWRlOiBpbmRpY2VzIGluIHRoZXNlIGFycmF5c1xyXG5cclxuXHRcdGNvbnN0IHNjb3BlID0gdGhpcztcclxuXHJcblx0XHR0aGlzLnN0YXRzID0ge1xyXG5cclxuXHRcdFx0b2JqZWN0czoge1xyXG5cdFx0XHRcdGdldCB0b3RhbCgpIHtcclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gc2NvcGUuX29iamVjdHMubGVuZ3RoO1xyXG5cclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdGdldCBpblVzZSgpIHtcclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy50b3RhbCAtIHNjb3BlLm5DYWNoZWRPYmplY3RzXztcclxuXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9LFxyXG5cdFx0XHRnZXQgYmluZGluZ3NQZXJPYmplY3QoKSB7XHJcblxyXG5cdFx0XHRcdHJldHVybiBzY29wZS5fYmluZGluZ3MubGVuZ3RoO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH07XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIG9iamVjdHMgdG8gdGhpcyBhbmltYXRpb24gZ3JvdXAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gey4uLk9iamVjdDNEfSBhcmd1bWVudHMgLSBUaGUgM0Qgb2JqZWN0cyB0byBhZGQuXHJcblx0ICovXHJcblx0YWRkKCkge1xyXG5cclxuXHRcdGNvbnN0IG9iamVjdHMgPSB0aGlzLl9vYmplY3RzLFxyXG5cdFx0XHRpbmRpY2VzQnlVVUlEID0gdGhpcy5faW5kaWNlc0J5VVVJRCxcclxuXHRcdFx0cGF0aHMgPSB0aGlzLl9wYXRocyxcclxuXHRcdFx0cGFyc2VkUGF0aHMgPSB0aGlzLl9wYXJzZWRQYXRocyxcclxuXHRcdFx0YmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncyxcclxuXHRcdFx0bkJpbmRpbmdzID0gYmluZGluZ3MubGVuZ3RoO1xyXG5cclxuXHRcdGxldCBrbm93bk9iamVjdCA9IHVuZGVmaW5lZCxcclxuXHRcdFx0bk9iamVjdHMgPSBvYmplY3RzLmxlbmd0aCxcclxuXHRcdFx0bkNhY2hlZE9iamVjdHMgPSB0aGlzLm5DYWNoZWRPYmplY3RzXztcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgb2JqZWN0ID0gYXJndW1lbnRzWyBpIF0sXHJcblx0XHRcdFx0dXVpZCA9IG9iamVjdC51dWlkO1xyXG5cdFx0XHRsZXQgaW5kZXggPSBpbmRpY2VzQnlVVUlEWyB1dWlkIF07XHJcblxyXG5cdFx0XHRpZiAoIGluZGV4ID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdC8vIHVua25vd24gb2JqZWN0IC0+IGFkZCBpdCB0byB0aGUgQUNUSVZFIHJlZ2lvblxyXG5cclxuXHRcdFx0XHRpbmRleCA9IG5PYmplY3RzICsrO1xyXG5cdFx0XHRcdGluZGljZXNCeVVVSURbIHV1aWQgXSA9IGluZGV4O1xyXG5cdFx0XHRcdG9iamVjdHMucHVzaCggb2JqZWN0ICk7XHJcblxyXG5cdFx0XHRcdC8vIGFjY291bnRpbmcgaXMgZG9uZSwgbm93IGRvIHRoZSBzYW1lIGZvciBhbGwgYmluZGluZ3NcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGogPSAwLCBtID0gbkJpbmRpbmdzOyBqICE9PSBtOyArKyBqICkge1xyXG5cclxuXHRcdFx0XHRcdGJpbmRpbmdzWyBqIF0ucHVzaCggbmV3IFByb3BlcnR5QmluZGluZyggb2JqZWN0LCBwYXRoc1sgaiBdLCBwYXJzZWRQYXRoc1sgaiBdICkgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggaW5kZXggPCBuQ2FjaGVkT2JqZWN0cyApIHtcclxuXHJcblx0XHRcdFx0a25vd25PYmplY3QgPSBvYmplY3RzWyBpbmRleCBdO1xyXG5cclxuXHRcdFx0XHQvLyBtb3ZlIGV4aXN0aW5nIG9iamVjdCB0byB0aGUgQUNUSVZFIHJlZ2lvblxyXG5cclxuXHRcdFx0XHRjb25zdCBmaXJzdEFjdGl2ZUluZGV4ID0gLS0gbkNhY2hlZE9iamVjdHMsXHJcblx0XHRcdFx0XHRsYXN0Q2FjaGVkT2JqZWN0ID0gb2JqZWN0c1sgZmlyc3RBY3RpdmVJbmRleCBdO1xyXG5cclxuXHRcdFx0XHRpbmRpY2VzQnlVVUlEWyBsYXN0Q2FjaGVkT2JqZWN0LnV1aWQgXSA9IGluZGV4O1xyXG5cdFx0XHRcdG9iamVjdHNbIGluZGV4IF0gPSBsYXN0Q2FjaGVkT2JqZWN0O1xyXG5cclxuXHRcdFx0XHRpbmRpY2VzQnlVVUlEWyB1dWlkIF0gPSBmaXJzdEFjdGl2ZUluZGV4O1xyXG5cdFx0XHRcdG9iamVjdHNbIGZpcnN0QWN0aXZlSW5kZXggXSA9IG9iamVjdDtcclxuXHJcblx0XHRcdFx0Ly8gYWNjb3VudGluZyBpcyBkb25lLCBub3cgZG8gdGhlIHNhbWUgZm9yIGFsbCBiaW5kaW5nc1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaiA9IDAsIG0gPSBuQmluZGluZ3M7IGogIT09IG07ICsrIGogKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgYmluZGluZ3NGb3JQYXRoID0gYmluZGluZ3NbIGogXSxcclxuXHRcdFx0XHRcdFx0bGFzdENhY2hlZCA9IGJpbmRpbmdzRm9yUGF0aFsgZmlyc3RBY3RpdmVJbmRleCBdO1xyXG5cclxuXHRcdFx0XHRcdGxldCBiaW5kaW5nID0gYmluZGluZ3NGb3JQYXRoWyBpbmRleCBdO1xyXG5cclxuXHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXSA9IGxhc3RDYWNoZWQ7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBiaW5kaW5nID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBzaW5jZSB3ZSBkbyBub3QgYm90aGVyIHRvIGNyZWF0ZSBuZXcgYmluZGluZ3NcclxuXHRcdFx0XHRcdFx0Ly8gZm9yIG9iamVjdHMgdGhhdCBhcmUgY2FjaGVkLCB0aGUgYmluZGluZyBtYXlcclxuXHRcdFx0XHRcdFx0Ly8gb3IgbWF5IG5vdCBleGlzdFxyXG5cclxuXHRcdFx0XHRcdFx0YmluZGluZyA9IG5ldyBQcm9wZXJ0eUJpbmRpbmcoIG9iamVjdCwgcGF0aHNbIGogXSwgcGFyc2VkUGF0aHNbIGogXSApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGhbIGZpcnN0QWN0aXZlSW5kZXggXSA9IGJpbmRpbmc7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdHNbIGluZGV4IF0gIT09IGtub3duT2JqZWN0ICkge1xyXG5cclxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuQW5pbWF0aW9uT2JqZWN0R3JvdXA6IERpZmZlcmVudCBvYmplY3RzIHdpdGggdGhlIHNhbWUgVVVJRCAnICtcclxuXHRcdFx0XHRcdCdkZXRlY3RlZC4gQ2xlYW4gdGhlIGNhY2hlcyBvciByZWNyZWF0ZSB5b3VyIGluZnJhc3RydWN0dXJlIHdoZW4gcmVsb2FkaW5nIHNjZW5lcy4nICk7XHJcblxyXG5cdFx0XHR9IC8vIGVsc2UgdGhlIG9iamVjdCBpcyBhbHJlYWR5IHdoZXJlIHdlIHdhbnQgaXQgdG8gYmVcclxuXHJcblx0XHR9IC8vIGZvciBhcmd1bWVudHNcclxuXHJcblx0XHR0aGlzLm5DYWNoZWRPYmplY3RzXyA9IG5DYWNoZWRPYmplY3RzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbW92ZXMgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBvYmplY3RzIHRvIHRoaXMgYW5pbWF0aW9uIGdyb3VwXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gey4uLk9iamVjdDNEfSBhcmd1bWVudHMgLSBUaGUgM0Qgb2JqZWN0cyB0byByZW1vdmUuXHJcblx0ICovXHJcblx0cmVtb3ZlKCkge1xyXG5cclxuXHRcdGNvbnN0IG9iamVjdHMgPSB0aGlzLl9vYmplY3RzLFxyXG5cdFx0XHRpbmRpY2VzQnlVVUlEID0gdGhpcy5faW5kaWNlc0J5VVVJRCxcclxuXHRcdFx0YmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncyxcclxuXHRcdFx0bkJpbmRpbmdzID0gYmluZGluZ3MubGVuZ3RoO1xyXG5cclxuXHRcdGxldCBuQ2FjaGVkT2JqZWN0cyA9IHRoaXMubkNhY2hlZE9iamVjdHNfO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBvYmplY3QgPSBhcmd1bWVudHNbIGkgXSxcclxuXHRcdFx0XHR1dWlkID0gb2JqZWN0LnV1aWQsXHJcblx0XHRcdFx0aW5kZXggPSBpbmRpY2VzQnlVVUlEWyB1dWlkIF07XHJcblxyXG5cdFx0XHRpZiAoIGluZGV4ICE9PSB1bmRlZmluZWQgJiYgaW5kZXggPj0gbkNhY2hlZE9iamVjdHMgKSB7XHJcblxyXG5cdFx0XHRcdC8vIG1vdmUgZXhpc3Rpbmcgb2JqZWN0IGludG8gdGhlIENBQ0hFRCByZWdpb25cclxuXHJcblx0XHRcdFx0Y29uc3QgbGFzdENhY2hlZEluZGV4ID0gbkNhY2hlZE9iamVjdHMgKyssXHJcblx0XHRcdFx0XHRmaXJzdEFjdGl2ZU9iamVjdCA9IG9iamVjdHNbIGxhc3RDYWNoZWRJbmRleCBdO1xyXG5cclxuXHRcdFx0XHRpbmRpY2VzQnlVVUlEWyBmaXJzdEFjdGl2ZU9iamVjdC51dWlkIF0gPSBpbmRleDtcclxuXHRcdFx0XHRvYmplY3RzWyBpbmRleCBdID0gZmlyc3RBY3RpdmVPYmplY3Q7XHJcblxyXG5cdFx0XHRcdGluZGljZXNCeVVVSURbIHV1aWQgXSA9IGxhc3RDYWNoZWRJbmRleDtcclxuXHRcdFx0XHRvYmplY3RzWyBsYXN0Q2FjaGVkSW5kZXggXSA9IG9iamVjdDtcclxuXHJcblx0XHRcdFx0Ly8gYWNjb3VudGluZyBpcyBkb25lLCBub3cgZG8gdGhlIHNhbWUgZm9yIGFsbCBiaW5kaW5nc1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaiA9IDAsIG0gPSBuQmluZGluZ3M7IGogIT09IG07ICsrIGogKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgYmluZGluZ3NGb3JQYXRoID0gYmluZGluZ3NbIGogXSxcclxuXHRcdFx0XHRcdFx0Zmlyc3RBY3RpdmUgPSBiaW5kaW5nc0ZvclBhdGhbIGxhc3RDYWNoZWRJbmRleCBdLFxyXG5cdFx0XHRcdFx0XHRiaW5kaW5nID0gYmluZGluZ3NGb3JQYXRoWyBpbmRleCBdO1xyXG5cclxuXHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXSA9IGZpcnN0QWN0aXZlO1xyXG5cdFx0XHRcdFx0YmluZGluZ3NGb3JQYXRoWyBsYXN0Q2FjaGVkSW5kZXggXSA9IGJpbmRpbmc7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IC8vIGZvciBhcmd1bWVudHNcclxuXHJcblx0XHR0aGlzLm5DYWNoZWRPYmplY3RzXyA9IG5DYWNoZWRPYmplY3RzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlYWxsb2NhdGVzIGFsbCBtZW1vcnkgcmVzb3VyY2VzIGZvciB0aGUgcGFzc2VkIDNEIG9iamVjdHMgb2YgdGhpcyBhbmltYXRpb24gZ3JvdXAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gey4uLk9iamVjdDNEfSBhcmd1bWVudHMgLSBUaGUgM0Qgb2JqZWN0cyB0byB1bmNhY2hlLlxyXG5cdCAqL1xyXG5cdHVuY2FjaGUoKSB7XHJcblxyXG5cdFx0Y29uc3Qgb2JqZWN0cyA9IHRoaXMuX29iamVjdHMsXHJcblx0XHRcdGluZGljZXNCeVVVSUQgPSB0aGlzLl9pbmRpY2VzQnlVVUlELFxyXG5cdFx0XHRiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxyXG5cdFx0XHRuQmluZGluZ3MgPSBiaW5kaW5ncy5sZW5ndGg7XHJcblxyXG5cdFx0bGV0IG5DYWNoZWRPYmplY3RzID0gdGhpcy5uQ2FjaGVkT2JqZWN0c18sXHJcblx0XHRcdG5PYmplY3RzID0gb2JqZWN0cy5sZW5ndGg7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcclxuXHJcblx0XHRcdGNvbnN0IG9iamVjdCA9IGFyZ3VtZW50c1sgaSBdLFxyXG5cdFx0XHRcdHV1aWQgPSBvYmplY3QudXVpZCxcclxuXHRcdFx0XHRpbmRleCA9IGluZGljZXNCeVVVSURbIHV1aWQgXTtcclxuXHJcblx0XHRcdGlmICggaW5kZXggIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0ZGVsZXRlIGluZGljZXNCeVVVSURbIHV1aWQgXTtcclxuXHJcblx0XHRcdFx0aWYgKCBpbmRleCA8IG5DYWNoZWRPYmplY3RzICkge1xyXG5cclxuXHRcdFx0XHRcdC8vIG9iamVjdCBpcyBjYWNoZWQsIHNocmluayB0aGUgQ0FDSEVEIHJlZ2lvblxyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGZpcnN0QWN0aXZlSW5kZXggPSAtLSBuQ2FjaGVkT2JqZWN0cyxcclxuXHRcdFx0XHRcdFx0bGFzdENhY2hlZE9iamVjdCA9IG9iamVjdHNbIGZpcnN0QWN0aXZlSW5kZXggXSxcclxuXHRcdFx0XHRcdFx0bGFzdEluZGV4ID0gLS0gbk9iamVjdHMsXHJcblx0XHRcdFx0XHRcdGxhc3RPYmplY3QgPSBvYmplY3RzWyBsYXN0SW5kZXggXTtcclxuXHJcblx0XHRcdFx0XHQvLyBsYXN0IGNhY2hlZCBvYmplY3QgdGFrZXMgdGhpcyBvYmplY3QncyBwbGFjZVxyXG5cdFx0XHRcdFx0aW5kaWNlc0J5VVVJRFsgbGFzdENhY2hlZE9iamVjdC51dWlkIF0gPSBpbmRleDtcclxuXHRcdFx0XHRcdG9iamVjdHNbIGluZGV4IF0gPSBsYXN0Q2FjaGVkT2JqZWN0O1xyXG5cclxuXHRcdFx0XHRcdC8vIGxhc3Qgb2JqZWN0IGdvZXMgdG8gdGhlIGFjdGl2YXRlZCBzbG90IGFuZCBwb3BcclxuXHRcdFx0XHRcdGluZGljZXNCeVVVSURbIGxhc3RPYmplY3QudXVpZCBdID0gZmlyc3RBY3RpdmVJbmRleDtcclxuXHRcdFx0XHRcdG9iamVjdHNbIGZpcnN0QWN0aXZlSW5kZXggXSA9IGxhc3RPYmplY3Q7XHJcblx0XHRcdFx0XHRvYmplY3RzLnBvcCgpO1xyXG5cclxuXHRcdFx0XHRcdC8vIGFjY291bnRpbmcgaXMgZG9uZSwgbm93IGRvIHRoZSBzYW1lIGZvciBhbGwgYmluZGluZ3NcclxuXHJcblx0XHRcdFx0XHRmb3IgKCBsZXQgaiA9IDAsIG0gPSBuQmluZGluZ3M7IGogIT09IG07ICsrIGogKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCBiaW5kaW5nc0ZvclBhdGggPSBiaW5kaW5nc1sgaiBdLFxyXG5cdFx0XHRcdFx0XHRcdGxhc3RDYWNoZWQgPSBiaW5kaW5nc0ZvclBhdGhbIGZpcnN0QWN0aXZlSW5kZXggXSxcclxuXHRcdFx0XHRcdFx0XHRsYXN0ID0gYmluZGluZ3NGb3JQYXRoWyBsYXN0SW5kZXggXTtcclxuXHJcblx0XHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXSA9IGxhc3RDYWNoZWQ7XHJcblx0XHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgZmlyc3RBY3RpdmVJbmRleCBdID0gbGFzdDtcclxuXHRcdFx0XHRcdFx0YmluZGluZ3NGb3JQYXRoLnBvcCgpO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHQvLyBvYmplY3QgaXMgYWN0aXZlLCBqdXN0IHN3YXAgd2l0aCB0aGUgbGFzdCBhbmQgcG9wXHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgbGFzdEluZGV4ID0gLS0gbk9iamVjdHMsXHJcblx0XHRcdFx0XHRcdGxhc3RPYmplY3QgPSBvYmplY3RzWyBsYXN0SW5kZXggXTtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGxhc3RJbmRleCA+IDAgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRpbmRpY2VzQnlVVUlEWyBsYXN0T2JqZWN0LnV1aWQgXSA9IGluZGV4O1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRvYmplY3RzWyBpbmRleCBdID0gbGFzdE9iamVjdDtcclxuXHRcdFx0XHRcdG9iamVjdHMucG9wKCk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gYWNjb3VudGluZyBpcyBkb25lLCBub3cgZG8gdGhlIHNhbWUgZm9yIGFsbCBiaW5kaW5nc1xyXG5cclxuXHRcdFx0XHRcdGZvciAoIGxldCBqID0gMCwgbSA9IG5CaW5kaW5nczsgaiAhPT0gbTsgKysgaiApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnN0IGJpbmRpbmdzRm9yUGF0aCA9IGJpbmRpbmdzWyBqIF07XHJcblxyXG5cdFx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGhbIGluZGV4IF0gPSBiaW5kaW5nc0ZvclBhdGhbIGxhc3RJbmRleCBdO1xyXG5cdFx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGgucG9wKCk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9IC8vIGNhY2hlZCBvciBhY3RpdmVcclxuXHJcblx0XHRcdH0gLy8gaWYgb2JqZWN0IGlzIGtub3duXHJcblxyXG5cdFx0fSAvLyBmb3IgYXJndW1lbnRzXHJcblxyXG5cdFx0dGhpcy5uQ2FjaGVkT2JqZWN0c18gPSBuQ2FjaGVkT2JqZWN0cztcclxuXHJcblx0fVxyXG5cclxuXHQvLyBJbnRlcm5hbCBpbnRlcmZhY2UgdXNlZCBieSBiZWZyaWVuZGVkIFByb3BlcnR5QmluZGluZy5Db21wb3NpdGU6XHJcblxyXG5cdHN1YnNjcmliZV8oIHBhdGgsIHBhcnNlZFBhdGggKSB7XHJcblxyXG5cdFx0Ly8gcmV0dXJucyBhbiBhcnJheSBvZiBiaW5kaW5ncyBmb3IgdGhlIGdpdmVuIHBhdGggdGhhdCBpcyBjaGFuZ2VkXHJcblx0XHQvLyBhY2NvcmRpbmcgdG8gdGhlIGNvbnRhaW5lZCBvYmplY3RzIGluIHRoZSBncm91cFxyXG5cclxuXHRcdGNvbnN0IGluZGljZXNCeVBhdGggPSB0aGlzLl9iaW5kaW5nc0luZGljZXNCeVBhdGg7XHJcblx0XHRsZXQgaW5kZXggPSBpbmRpY2VzQnlQYXRoWyBwYXRoIF07XHJcblx0XHRjb25zdCBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzO1xyXG5cclxuXHRcdGlmICggaW5kZXggIT09IHVuZGVmaW5lZCApIHJldHVybiBiaW5kaW5nc1sgaW5kZXggXTtcclxuXHJcblx0XHRjb25zdCBwYXRocyA9IHRoaXMuX3BhdGhzLFxyXG5cdFx0XHRwYXJzZWRQYXRocyA9IHRoaXMuX3BhcnNlZFBhdGhzLFxyXG5cdFx0XHRvYmplY3RzID0gdGhpcy5fb2JqZWN0cyxcclxuXHRcdFx0bk9iamVjdHMgPSBvYmplY3RzLmxlbmd0aCxcclxuXHRcdFx0bkNhY2hlZE9iamVjdHMgPSB0aGlzLm5DYWNoZWRPYmplY3RzXyxcclxuXHRcdFx0YmluZGluZ3NGb3JQYXRoID0gbmV3IEFycmF5KCBuT2JqZWN0cyApO1xyXG5cclxuXHRcdGluZGV4ID0gYmluZGluZ3MubGVuZ3RoO1xyXG5cclxuXHRcdGluZGljZXNCeVBhdGhbIHBhdGggXSA9IGluZGV4O1xyXG5cclxuXHRcdHBhdGhzLnB1c2goIHBhdGggKTtcclxuXHRcdHBhcnNlZFBhdGhzLnB1c2goIHBhcnNlZFBhdGggKTtcclxuXHRcdGJpbmRpbmdzLnB1c2goIGJpbmRpbmdzRm9yUGF0aCApO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gbkNhY2hlZE9iamVjdHMsIG4gPSBvYmplY3RzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcclxuXHJcblx0XHRcdGNvbnN0IG9iamVjdCA9IG9iamVjdHNbIGkgXTtcclxuXHRcdFx0YmluZGluZ3NGb3JQYXRoWyBpIF0gPSBuZXcgUHJvcGVydHlCaW5kaW5nKCBvYmplY3QsIHBhdGgsIHBhcnNlZFBhdGggKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGJpbmRpbmdzRm9yUGF0aDtcclxuXHJcblx0fVxyXG5cclxuXHR1bnN1YnNjcmliZV8oIHBhdGggKSB7XHJcblxyXG5cdFx0Ly8gdGVsbHMgdGhlIGdyb3VwIHRvIGZvcmdldCBhYm91dCBhIHByb3BlcnR5IHBhdGggYW5kIG5vIGxvbmdlclxyXG5cdFx0Ly8gdXBkYXRlIHRoZSBhcnJheSBwcmV2aW91c2x5IG9idGFpbmVkIHdpdGggJ3N1YnNjcmliZV8nXHJcblxyXG5cdFx0Y29uc3QgaW5kaWNlc0J5UGF0aCA9IHRoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aCxcclxuXHRcdFx0aW5kZXggPSBpbmRpY2VzQnlQYXRoWyBwYXRoIF07XHJcblxyXG5cdFx0aWYgKCBpbmRleCAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Y29uc3QgcGF0aHMgPSB0aGlzLl9wYXRocyxcclxuXHRcdFx0XHRwYXJzZWRQYXRocyA9IHRoaXMuX3BhcnNlZFBhdGhzLFxyXG5cdFx0XHRcdGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsXHJcblx0XHRcdFx0bGFzdEJpbmRpbmdzSW5kZXggPSBiaW5kaW5ncy5sZW5ndGggLSAxLFxyXG5cdFx0XHRcdGxhc3RCaW5kaW5ncyA9IGJpbmRpbmdzWyBsYXN0QmluZGluZ3NJbmRleCBdLFxyXG5cdFx0XHRcdGxhc3RCaW5kaW5nc1BhdGggPSBwYXRoWyBsYXN0QmluZGluZ3NJbmRleCBdO1xyXG5cclxuXHRcdFx0aW5kaWNlc0J5UGF0aFsgbGFzdEJpbmRpbmdzUGF0aCBdID0gaW5kZXg7XHJcblxyXG5cdFx0XHRiaW5kaW5nc1sgaW5kZXggXSA9IGxhc3RCaW5kaW5ncztcclxuXHRcdFx0YmluZGluZ3MucG9wKCk7XHJcblxyXG5cdFx0XHRwYXJzZWRQYXRoc1sgaW5kZXggXSA9IHBhcnNlZFBhdGhzWyBsYXN0QmluZGluZ3NJbmRleCBdO1xyXG5cdFx0XHRwYXJzZWRQYXRocy5wb3AoKTtcclxuXHJcblx0XHRcdHBhdGhzWyBpbmRleCBdID0gcGF0aHNbIGxhc3RCaW5kaW5nc0luZGV4IF07XHJcblx0XHRcdHBhdGhzLnBvcCgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgQW5pbWF0aW9uT2JqZWN0R3JvdXAgfTtcclxuIiwiaW1wb3J0IHsgV3JhcEFyb3VuZEVuZGluZywgWmVyb0N1cnZhdHVyZUVuZGluZywgWmVyb1Nsb3BlRW5kaW5nLCBMb29wUGluZ1BvbmcsIExvb3BPbmNlLCBMb29wUmVwZWF0LCBOb3JtYWxBbmltYXRpb25CbGVuZE1vZGUsIEFkZGl0aXZlQW5pbWF0aW9uQmxlbmRNb2RlIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBbiBpbnN0YW5jZSBvZiBgQW5pbWF0aW9uQWN0aW9uYCBzY2hlZHVsZXMgdGhlIHBsYXliYWNrIG9mIGFuIGFuaW1hdGlvbiB3aGljaCBpc1xyXG4gKiBzdG9yZWQgaW4ge0BsaW5rIEFuaW1hdGlvbkNsaXB9LlxyXG4gKi9cclxuY2xhc3MgQW5pbWF0aW9uQWN0aW9uIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBhbmltYXRpb24gYWN0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBbmltYXRpb25NaXhlcn0gbWl4ZXIgLSBUaGUgbWl4ZXIgdGhhdCBpcyBjb250cm9sbGVkIGJ5IHRoaXMgYWN0aW9uLlxyXG5cdCAqIEBwYXJhbSB7QW5pbWF0aW9uQ2xpcH0gY2xpcCAtIFRoZSBhbmltYXRpb24gY2xpcCB0aGF0IGhvbGRzIHRoZSBhY3R1YWwga2V5ZnJhbWVzLlxyXG5cdCAqIEBwYXJhbSB7P09iamVjdDNEfSBbbG9jYWxSb290PW51bGxdIC0gVGhlIHJvb3Qgb2JqZWN0IG9uIHdoaWNoIHRoaXMgYWN0aW9uIGlzIHBlcmZvcm1lZC5cclxuXHQgKiBAcGFyYW0geyhOb3JtYWxBbmltYXRpb25CbGVuZE1vZGV8QWRkaXRpdmVBbmltYXRpb25CbGVuZE1vZGUpfSBbYmxlbmRNb2RlXSAtIFRoZSBibGVuZCBtb2RlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBtaXhlciwgY2xpcCwgbG9jYWxSb290ID0gbnVsbCwgYmxlbmRNb2RlID0gY2xpcC5ibGVuZE1vZGUgKSB7XHJcblxyXG5cdFx0dGhpcy5fbWl4ZXIgPSBtaXhlcjtcclxuXHRcdHRoaXMuX2NsaXAgPSBjbGlwO1xyXG5cdFx0dGhpcy5fbG9jYWxSb290ID0gbG9jYWxSb290O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyBob3cgdGhlIGFuaW1hdGlvbiBpcyBibGVuZGVkL2NvbWJpbmVkIHdoZW4gdHdvIG9yIG1vcmUgYW5pbWF0aW9uc1xyXG5cdFx0ICogYXJlIHNpbXVsdGFuZW91c2x5IHBsYXllZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KE5vcm1hbEFuaW1hdGlvbkJsZW5kTW9kZXxBZGRpdGl2ZUFuaW1hdGlvbkJsZW5kTW9kZSl9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYmxlbmRNb2RlID0gYmxlbmRNb2RlO1xyXG5cclxuXHRcdGNvbnN0IHRyYWNrcyA9IGNsaXAudHJhY2tzLFxyXG5cdFx0XHRuVHJhY2tzID0gdHJhY2tzLmxlbmd0aCxcclxuXHRcdFx0aW50ZXJwb2xhbnRzID0gbmV3IEFycmF5KCBuVHJhY2tzICk7XHJcblxyXG5cdFx0Y29uc3QgaW50ZXJwb2xhbnRTZXR0aW5ncyA9IHtcclxuXHRcdFx0ZW5kaW5nU3RhcnQ6IFplcm9DdXJ2YXR1cmVFbmRpbmcsXHJcblx0XHRcdGVuZGluZ0VuZDogWmVyb0N1cnZhdHVyZUVuZGluZ1xyXG5cdFx0fTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgIT09IG5UcmFja3M7ICsrIGkgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBpbnRlcnBvbGFudCA9IHRyYWNrc1sgaSBdLmNyZWF0ZUludGVycG9sYW50KCBudWxsICk7XHJcblx0XHRcdGludGVycG9sYW50c1sgaSBdID0gaW50ZXJwb2xhbnQ7XHJcblx0XHRcdGludGVycG9sYW50LnNldHRpbmdzID0gaW50ZXJwb2xhbnRTZXR0aW5ncztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5faW50ZXJwb2xhbnRTZXR0aW5ncyA9IGludGVycG9sYW50U2V0dGluZ3M7XHJcblxyXG5cdFx0dGhpcy5faW50ZXJwb2xhbnRzID0gaW50ZXJwb2xhbnRzOyAvLyBib3VuZCBieSB0aGUgbWl4ZXJcclxuXHJcblx0XHQvLyBpbnNpZGU6IFByb3BlcnR5TWl4ZXIgKG1hbmFnZWQgYnkgdGhlIG1peGVyKVxyXG5cdFx0dGhpcy5fcHJvcGVydHlCaW5kaW5ncyA9IG5ldyBBcnJheSggblRyYWNrcyApO1xyXG5cclxuXHRcdHRoaXMuX2NhY2hlSW5kZXggPSBudWxsOyAvLyBmb3IgdGhlIG1lbW9yeSBtYW5hZ2VyXHJcblx0XHR0aGlzLl9ieUNsaXBDYWNoZUluZGV4ID0gbnVsbDsgLy8gZm9yIHRoZSBtZW1vcnkgbWFuYWdlclxyXG5cclxuXHRcdHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50ID0gbnVsbDtcclxuXHRcdHRoaXMuX3dlaWdodEludGVycG9sYW50ID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBsb29wIG1vZGUsIHNldCB2aWEge0BsaW5rIEFuaW1hdGlvbkFjdGlvbiNzZXRMb29wfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KExvb3BSZXBlYXR8TG9vcE9uY2V8TG9vcFBpbmdQb25nKX1cclxuXHRcdCAqIEBkZWZhdWx0IExvb3BSZXBlYXRcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5sb29wID0gTG9vcFJlcGVhdDtcclxuXHRcdHRoaXMuX2xvb3BDb3VudCA9IC0gMTtcclxuXHJcblx0XHQvLyBnbG9iYWwgbWl4ZXIgdGltZSB3aGVuIHRoZSBhY3Rpb24gaXMgdG8gYmUgc3RhcnRlZFxyXG5cdFx0Ly8gaXQncyBzZXQgYmFjayB0byAnbnVsbCcgdXBvbiBzdGFydCBvZiB0aGUgYWN0aW9uXHJcblx0XHR0aGlzLl9zdGFydFRpbWUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGxvY2FsIHRpbWUgb2YgdGhpcyBhY3Rpb24gKGluIHNlY29uZHMsIHN0YXJ0aW5nIHdpdGggYDBgKS5cclxuXHRcdCAqXHJcblx0XHQgKiBUaGUgdmFsdWUgZ2V0cyBjbGFtcGVkIG9yIHdyYXBwZWQgdG8gYFswLGNsaXAuZHVyYXRpb25dYCAoYWNjb3JkaW5nIHRvIHRoZVxyXG5cdFx0ICogbG9vcCBzdGF0ZSkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IEluZmluaXR5XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudGltZSA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTY2FsaW5nIGZhY3RvciBmb3IgdGhlIHtAbGluayBBbmltYXRpb25BY3Rpb24jdGltZX0uIEEgdmFsdWUgb2YgYDBgIGNhdXNlcyB0aGVcclxuXHRcdCAqIGFuaW1hdGlvbiB0byBwYXVzZS4gTmVnYXRpdmUgdmFsdWVzIGNhdXNlIHRoZSBhbmltYXRpb24gdG8gcGxheSBiYWNrd2FyZHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50aW1lU2NhbGUgPSAxO1xyXG5cdFx0dGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBkZWdyZWUgb2YgaW5mbHVlbmNlIG9mIHRoaXMgYWN0aW9uIChpbiB0aGUgaW50ZXJ2YWwgYFswLCAxXWApLiBWYWx1ZXNcclxuXHRcdCAqIGJldHdlZW4gYDBgIChubyBpbXBhY3QpIGFuZCBgMWAgKGZ1bGwgaW1wYWN0KSBjYW4gYmUgdXNlZCB0byBibGVuZCBiZXR3ZWVuXHJcblx0XHQgKiBzZXZlcmFsIGFjdGlvbnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy53ZWlnaHQgPSAxO1xyXG5cdFx0dGhpcy5fZWZmZWN0aXZlV2VpZ2h0ID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBudW1iZXIgb2YgcmVwZXRpdGlvbnMgb2YgdGhlIHBlcmZvcm1lZCBjbGlwIG92ZXIgdGhlIGNvdXJzZSBvZiB0aGlzIGFjdGlvbi5cclxuXHRcdCAqIENhbiBiZSBzZXQgdmlhIHtAbGluayBBbmltYXRpb25BY3Rpb24jc2V0TG9vcH0uXHJcblx0XHQgKlxyXG5cdFx0ICogU2V0dGluZyB0aGlzIG51bWJlciBoYXMgbm8gZWZmZWN0IGlmIHtAbGluayBBbmltYXRpb25BY3Rpb24jbG9vcH0gaXMgc2V0IHRvXHJcblx0XHQgKiBgVEhSRUU6TG9vcE9uY2VgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCBJbmZpbml0eVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJlcGV0aXRpb25zID0gSW5maW5pdHk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBJZiBzZXQgdG8gYHRydWVgLCB0aGUgcGxheWJhY2sgb2YgdGhlIGFjdGlvbiBpcyBwYXVzZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBhdXNlZCA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSWYgc2V0IHRvIGBmYWxzZWAsIHRoZSBhY3Rpb24gaXMgZGlzYWJsZWQgc28gaXQgaGFzIG5vIGltcGFjdC5cclxuXHRcdCAqXHJcblx0XHQgKiBXaGVuIHRoZSBhY3Rpb24gaXMgcmUtZW5hYmxlZCwgdGhlIGFuaW1hdGlvbiBjb250aW51ZXMgZnJvbSBpdHMgY3VycmVudFxyXG5cdFx0ICogdGltZSAoc2V0dGluZyBgZW5hYmxlZGAgdG8gYGZhbHNlYCBkb2Vzbid0IHJlc2V0IHRoZSBhY3Rpb24pLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmVuYWJsZWQgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSWYgc2V0IHRvIHRydWUgdGhlIGFuaW1hdGlvbiB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgcGF1c2VkIG9uIGl0cyBsYXN0IGZyYW1lLlxyXG5cdFx0ICpcclxuXHRcdCAqIElmIHNldCB0byBmYWxzZSwge0BsaW5rIEFuaW1hdGlvbkFjdGlvbiNlbmFibGVkfSB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgc3dpdGNoZWRcclxuXHRcdCAqIHRvIGBmYWxzZWAgd2hlbiB0aGUgbGFzdCBsb29wIG9mIHRoZSBhY3Rpb24gaGFzIGZpbmlzaGVkLCBzbyB0aGF0IHRoaXMgYWN0aW9uIGhhc1xyXG5cdFx0ICogbm8gZnVydGhlciBpbXBhY3QuXHJcblx0XHQgKlxyXG5cdFx0ICogTm90ZTogVGhpcyBtZW1iZXIgaGFzIG5vIGltcGFjdCBpZiB0aGUgYWN0aW9uIGlzIGludGVycnVwdGVkIChpdFxyXG5cdFx0ICogaGFzIG9ubHkgYW4gZWZmZWN0IGlmIGl0cyBsYXN0IGxvb3AgaGFzIHJlYWxseSBmaW5pc2hlZCkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNsYW1wV2hlbkZpbmlzaGVkID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBFbmFibGVzIHNtb290aCBpbnRlcnBvbGF0aW9uIHdpdGhvdXQgc2VwYXJhdGUgY2xpcHMgZm9yIHN0YXJ0LCBsb29wIGFuZCBlbmQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuemVyb1Nsb3BlQXRTdGFydCA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBFbmFibGVzIHNtb290aCBpbnRlcnBvbGF0aW9uIHdpdGhvdXQgc2VwYXJhdGUgY2xpcHMgZm9yIHN0YXJ0LCBsb29wIGFuZCBlbmQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuemVyb1Nsb3BlQXRFbmQgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFN0YXJ0cyB0aGUgcGxheWJhY2sgb2YgdGhlIGFuaW1hdGlvbi5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0FuaW1hdGlvbkFjdGlvbn0gQSByZWZlcmVuY2UgdG8gdGhpcyBhbmltYXRpb24gYWN0aW9uLlxyXG5cdCAqL1xyXG5cdHBsYXkoKSB7XHJcblxyXG5cdFx0dGhpcy5fbWl4ZXIuX2FjdGl2YXRlQWN0aW9uKCB0aGlzICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3RvcHMgdGhlIHBsYXliYWNrIG9mIHRoZSBhbmltYXRpb24uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtBbmltYXRpb25BY3Rpb259IEEgcmVmZXJlbmNlIHRvIHRoaXMgYW5pbWF0aW9uIGFjdGlvbi5cclxuXHQgKi9cclxuXHRzdG9wKCkge1xyXG5cclxuXHRcdHRoaXMuX21peGVyLl9kZWFjdGl2YXRlQWN0aW9uKCB0aGlzICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMucmVzZXQoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXNldHMgdGhlIHBsYXliYWNrIG9mIHRoZSBhbmltYXRpb24uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtBbmltYXRpb25BY3Rpb259IEEgcmVmZXJlbmNlIHRvIHRoaXMgYW5pbWF0aW9uIGFjdGlvbi5cclxuXHQgKi9cclxuXHRyZXNldCgpIHtcclxuXHJcblx0XHR0aGlzLnBhdXNlZCA9IGZhbHNlO1xyXG5cdFx0dGhpcy5lbmFibGVkID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnRpbWUgPSAwOyAvLyByZXN0YXJ0IGNsaXBcclxuXHRcdHRoaXMuX2xvb3BDb3VudCA9IC0gMTsvLyBmb3JnZXQgcHJldmlvdXMgbG9vcHNcclxuXHRcdHRoaXMuX3N0YXJ0VGltZSA9IG51bGw7Ly8gZm9yZ2V0IHNjaGVkdWxpbmdcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5zdG9wRmFkaW5nKCkuc3RvcFdhcnBpbmcoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYW5pbWF0aW9uIGlzIHJ1bm5pbmcuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBhbmltYXRpb24gaXMgcnVubmluZyBvciBub3QuXHJcblx0ICovXHJcblx0aXNSdW5uaW5nKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmVuYWJsZWQgJiYgISB0aGlzLnBhdXNlZCAmJiB0aGlzLnRpbWVTY2FsZSAhPT0gMCAmJlxyXG5cdFx0XHR0aGlzLl9zdGFydFRpbWUgPT09IG51bGwgJiYgdGhpcy5fbWl4ZXIuX2lzQWN0aXZlQWN0aW9uKCB0aGlzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgd2hlbiB7QGxpbmsgQW5pbWF0aW9uQWN0aW9uI3BsYXl9IGhhcyBiZWVuIGNhbGxlZC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGFuaW1hdGlvbiBpcyBzY2hlZHVsZWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGlzU2NoZWR1bGVkKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9taXhlci5faXNBY3RpdmVBY3Rpb24oIHRoaXMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWZpbmVzIHRoZSB0aW1lIHdoZW4gdGhlIGFuaW1hdGlvbiBzaG91bGQgc3RhcnQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdGltZSAtIFRoZSBzdGFydCB0aW1lIGluIHNlY29uZHMuXHJcblx0ICogQHJldHVybiB7QW5pbWF0aW9uQWN0aW9ufSBBIHJlZmVyZW5jZSB0byB0aGlzIGFuaW1hdGlvbiBhY3Rpb24uXHJcblx0ICovXHJcblx0c3RhcnRBdCggdGltZSApIHtcclxuXHJcblx0XHR0aGlzLl9zdGFydFRpbWUgPSB0aW1lO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbmZpZ3VyZXMgdGhlIGxvb3Agc2V0dGluZ3MgZm9yIHRoaXMgYWN0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHsoTG9vcFJlcGVhdHxMb29wT25jZXxMb29wUGluZ1BvbmcpfSBtb2RlIC0gVGhlIGxvb3AgbW9kZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gcmVwZXRpdGlvbnMgLSBUaGUgbnVtYmVyIG9mIHJlcGV0aXRpb25zLlxyXG5cdCAqIEByZXR1cm4ge0FuaW1hdGlvbkFjdGlvbn0gQSByZWZlcmVuY2UgdG8gdGhpcyBhbmltYXRpb24gYWN0aW9uLlxyXG5cdCAqL1xyXG5cdHNldExvb3AoIG1vZGUsIHJlcGV0aXRpb25zICkge1xyXG5cclxuXHRcdHRoaXMubG9vcCA9IG1vZGU7XHJcblx0XHR0aGlzLnJlcGV0aXRpb25zID0gcmVwZXRpdGlvbnM7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZWZmZWN0aXZlIHdlaWdodCBvZiB0aGlzIGFjdGlvbi5cclxuXHQgKlxyXG5cdCAqIEFuIGFjdGlvbiBoYXMgbm8gZWZmZWN0IGFuZCB0aHVzIGFuIGVmZmVjdGl2ZSB3ZWlnaHQgb2YgemVybyB3aGVuIHRoZVxyXG5cdCAqIGFjdGlvbiBpcyBkaXNhYmxlZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB3ZWlnaHQgLSBUaGUgd2VpZ2h0IHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtBbmltYXRpb25BY3Rpb259IEEgcmVmZXJlbmNlIHRvIHRoaXMgYW5pbWF0aW9uIGFjdGlvbi5cclxuXHQgKi9cclxuXHRzZXRFZmZlY3RpdmVXZWlnaHQoIHdlaWdodCApIHtcclxuXHJcblx0XHR0aGlzLndlaWdodCA9IHdlaWdodDtcclxuXHJcblx0XHQvLyBub3RlOiBzYW1lIGxvZ2ljIGFzIHdoZW4gdXBkYXRlZCBhdCBydW50aW1lXHJcblx0XHR0aGlzLl9lZmZlY3RpdmVXZWlnaHQgPSB0aGlzLmVuYWJsZWQgPyB3ZWlnaHQgOiAwO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnN0b3BGYWRpbmcoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBlZmZlY3RpdmUgd2VpZ2h0IG9mIHRoaXMgYWN0aW9uLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgZWZmZWN0aXZlIHdlaWdodC5cclxuXHQgKi9cclxuXHRnZXRFZmZlY3RpdmVXZWlnaHQoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX2VmZmVjdGl2ZVdlaWdodDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGYWRlcyB0aGUgYW5pbWF0aW9uIGluIGJ5IGluY3JlYXNpbmcgaXRzIHdlaWdodCBncmFkdWFsbHkgZnJvbSBgMGAgdG8gYDFgLFxyXG5cdCAqIHdpdGhpbiB0aGUgcGFzc2VkIHRpbWUgaW50ZXJ2YWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZHVyYXRpb24gLSBUaGUgZHVyYXRpb24gb2YgdGhlIGZhZGUuXHJcblx0ICogQHJldHVybiB7QW5pbWF0aW9uQWN0aW9ufSBBIHJlZmVyZW5jZSB0byB0aGlzIGFuaW1hdGlvbiBhY3Rpb24uXHJcblx0ICovXHJcblx0ZmFkZUluKCBkdXJhdGlvbiApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fc2NoZWR1bGVGYWRpbmcoIGR1cmF0aW9uLCAwLCAxICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRmFkZXMgdGhlIGFuaW1hdGlvbiBvdXQgYnkgZGVjcmVhc2luZyBpdHMgd2VpZ2h0IGdyYWR1YWxseSBmcm9tIGAxYCB0byBgMGAsXHJcblx0ICogd2l0aGluIHRoZSBwYXNzZWQgdGltZSBpbnRlcnZhbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBkdXJhdGlvbiAtIFRoZSBkdXJhdGlvbiBvZiB0aGUgZmFkZS5cclxuXHQgKiBAcmV0dXJuIHtBbmltYXRpb25BY3Rpb259IEEgcmVmZXJlbmNlIHRvIHRoaXMgYW5pbWF0aW9uIGFjdGlvbi5cclxuXHQgKi9cclxuXHRmYWRlT3V0KCBkdXJhdGlvbiApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fc2NoZWR1bGVGYWRpbmcoIGR1cmF0aW9uLCAxLCAwICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2F1c2VzIHRoaXMgYWN0aW9uIHRvIGZhZGUgaW4gYW5kIHRoZSBnaXZlbiBhY3Rpb24gdG8gZmFkZSBvdXQsXHJcblx0ICogd2l0aGluIHRoZSBwYXNzZWQgdGltZSBpbnRlcnZhbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QW5pbWF0aW9uQWN0aW9ufSBmYWRlT3V0QWN0aW9uIC0gVGhlIGFuaW1hdGlvbiBhY3Rpb24gdG8gZmFkZSBvdXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGR1cmF0aW9uIC0gVGhlIGR1cmF0aW9uIG9mIHRoZSBmYWRlLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW3dhcnA9ZmFsc2VdIC0gV2hldGhlciB3YXJwaW5nIHNob3VsZCBiZSB1c2VkIG9yIG5vdC5cclxuXHQgKiBAcmV0dXJuIHtBbmltYXRpb25BY3Rpb259IEEgcmVmZXJlbmNlIHRvIHRoaXMgYW5pbWF0aW9uIGFjdGlvbi5cclxuXHQgKi9cclxuXHRjcm9zc0ZhZGVGcm9tKCBmYWRlT3V0QWN0aW9uLCBkdXJhdGlvbiwgd2FycCA9IGZhbHNlICkge1xyXG5cclxuXHRcdGZhZGVPdXRBY3Rpb24uZmFkZU91dCggZHVyYXRpb24gKTtcclxuXHRcdHRoaXMuZmFkZUluKCBkdXJhdGlvbiApO1xyXG5cclxuXHRcdGlmICggd2FycCA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdGNvbnN0IGZhZGVJbkR1cmF0aW9uID0gdGhpcy5fY2xpcC5kdXJhdGlvbixcclxuXHRcdFx0XHRmYWRlT3V0RHVyYXRpb24gPSBmYWRlT3V0QWN0aW9uLl9jbGlwLmR1cmF0aW9uLFxyXG5cclxuXHRcdFx0XHRzdGFydEVuZFJhdGlvID0gZmFkZU91dER1cmF0aW9uIC8gZmFkZUluRHVyYXRpb24sXHJcblx0XHRcdFx0ZW5kU3RhcnRSYXRpbyA9IGZhZGVJbkR1cmF0aW9uIC8gZmFkZU91dER1cmF0aW9uO1xyXG5cclxuXHRcdFx0ZmFkZU91dEFjdGlvbi53YXJwKCAxLjAsIHN0YXJ0RW5kUmF0aW8sIGR1cmF0aW9uICk7XHJcblx0XHRcdHRoaXMud2FycCggZW5kU3RhcnRSYXRpbywgMS4wLCBkdXJhdGlvbiApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDYXVzZXMgdGhpcyBhY3Rpb24gdG8gZmFkZSBvdXQgYW5kIHRoZSBnaXZlbiBhY3Rpb24gdG8gZmFkZSBpbixcclxuXHQgKiB3aXRoaW4gdGhlIHBhc3NlZCB0aW1lIGludGVydmFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBbmltYXRpb25BY3Rpb259IGZhZGVJbkFjdGlvbiAtIFRoZSBhbmltYXRpb24gYWN0aW9uIHRvIGZhZGUgaW4uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGR1cmF0aW9uIC0gVGhlIGR1cmF0aW9uIG9mIHRoZSBmYWRlLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW3dhcnA9ZmFsc2VdIC0gV2hldGhlciB3YXJwaW5nIHNob3VsZCBiZSB1c2VkIG9yIG5vdC5cclxuXHQgKiBAcmV0dXJuIHtBbmltYXRpb25BY3Rpb259IEEgcmVmZXJlbmNlIHRvIHRoaXMgYW5pbWF0aW9uIGFjdGlvbi5cclxuXHQgKi9cclxuXHRjcm9zc0ZhZGVUbyggZmFkZUluQWN0aW9uLCBkdXJhdGlvbiwgd2FycCA9IGZhbHNlICkge1xyXG5cclxuXHRcdHJldHVybiBmYWRlSW5BY3Rpb24uY3Jvc3NGYWRlRnJvbSggdGhpcywgZHVyYXRpb24sIHdhcnAgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTdG9wcyBhbnkgZmFkaW5nIHdoaWNoIGlzIGFwcGxpZWQgdG8gdGhpcyBhY3Rpb24uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtBbmltYXRpb25BY3Rpb259IEEgcmVmZXJlbmNlIHRvIHRoaXMgYW5pbWF0aW9uIGFjdGlvbi5cclxuXHQgKi9cclxuXHRzdG9wRmFkaW5nKCkge1xyXG5cclxuXHRcdGNvbnN0IHdlaWdodEludGVycG9sYW50ID0gdGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ7XHJcblxyXG5cdFx0aWYgKCB3ZWlnaHRJbnRlcnBvbGFudCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuX3dlaWdodEludGVycG9sYW50ID0gbnVsbDtcclxuXHRcdFx0dGhpcy5fbWl4ZXIuX3Rha2VCYWNrQ29udHJvbEludGVycG9sYW50KCB3ZWlnaHRJbnRlcnBvbGFudCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBlZmZlY3RpdmUgdGltZSBzY2FsZSBvZiB0aGlzIGFjdGlvbi5cclxuXHQgKlxyXG5cdCAqIEFuIGFjdGlvbiBoYXMgbm8gZWZmZWN0IGFuZCB0aHVzIGFuIGVmZmVjdGl2ZSB0aW1lIHNjYWxlIG9mIHplcm8gd2hlbiB0aGVcclxuXHQgKiBhY3Rpb24gaXMgcGF1c2VkLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHRpbWVTY2FsZSAtIFRoZSB0aW1lIHNjYWxlIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtBbmltYXRpb25BY3Rpb259IEEgcmVmZXJlbmNlIHRvIHRoaXMgYW5pbWF0aW9uIGFjdGlvbi5cclxuXHQgKi9cclxuXHRzZXRFZmZlY3RpdmVUaW1lU2NhbGUoIHRpbWVTY2FsZSApIHtcclxuXHJcblx0XHR0aGlzLnRpbWVTY2FsZSA9IHRpbWVTY2FsZTtcclxuXHRcdHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZSA9IHRoaXMucGF1c2VkID8gMCA6IHRpbWVTY2FsZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5zdG9wV2FycGluZygpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGVmZmVjdGl2ZSB0aW1lIHNjYWxlIG9mIHRoaXMgYWN0aW9uLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgZWZmZWN0aXZlIHRpbWUgc2NhbGUuXHJcblx0ICovXHJcblx0Z2V0RWZmZWN0aXZlVGltZVNjYWxlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZHVyYXRpb24gZm9yIGEgc2luZ2xlIGxvb3Agb2YgdGhpcyBhY3Rpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZHVyYXRpb24gLSBUaGUgZHVyYXRpb24gdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge0FuaW1hdGlvbkFjdGlvbn0gQSByZWZlcmVuY2UgdG8gdGhpcyBhbmltYXRpb24gYWN0aW9uLlxyXG5cdCAqL1xyXG5cdHNldER1cmF0aW9uKCBkdXJhdGlvbiApIHtcclxuXHJcblx0XHR0aGlzLnRpbWVTY2FsZSA9IHRoaXMuX2NsaXAuZHVyYXRpb24gLyBkdXJhdGlvbjtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5zdG9wV2FycGluZygpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFN5bmNocm9uaXplcyB0aGlzIGFjdGlvbiB3aXRoIHRoZSBwYXNzZWQgb3RoZXIgYWN0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBbmltYXRpb25BY3Rpb259IGFjdGlvbiAtIFRoZSBhY3Rpb24gdG8gc3luYyB3aXRoLlxyXG5cdCAqIEByZXR1cm4ge0FuaW1hdGlvbkFjdGlvbn0gQSByZWZlcmVuY2UgdG8gdGhpcyBhbmltYXRpb24gYWN0aW9uLlxyXG5cdCAqL1xyXG5cdHN5bmNXaXRoKCBhY3Rpb24gKSB7XHJcblxyXG5cdFx0dGhpcy50aW1lID0gYWN0aW9uLnRpbWU7XHJcblx0XHR0aGlzLnRpbWVTY2FsZSA9IGFjdGlvbi50aW1lU2NhbGU7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuc3RvcFdhcnBpbmcoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWNlbGVyYXRlcyB0aGlzIGFuaW1hdGlvbidzIHNwZWVkIHRvIGAwYCB3aXRoaW4gdGhlIHBhc3NlZCB0aW1lIGludGVydmFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGR1cmF0aW9uIC0gVGhlIGR1cmF0aW9uLlxyXG5cdCAqIEByZXR1cm4ge0FuaW1hdGlvbkFjdGlvbn0gQSByZWZlcmVuY2UgdG8gdGhpcyBhbmltYXRpb24gYWN0aW9uLlxyXG5cdCAqL1xyXG5cdGhhbHQoIGR1cmF0aW9uICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLndhcnAoIHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZSwgMCwgZHVyYXRpb24gKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDaGFuZ2VzIHRoZSBwbGF5YmFjayBzcGVlZCwgd2l0aGluIHRoZSBwYXNzZWQgdGltZSBpbnRlcnZhbCwgYnkgbW9kaWZ5aW5nXHJcblx0ICoge0BsaW5rIEFuaW1hdGlvbkFjdGlvbiN0aW1lU2NhbGV9IGdyYWR1YWxseSBmcm9tIGBzdGFydFRpbWVTY2FsZWAgdG9cclxuXHQgKiBgZW5kVGltZVNjYWxlYC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydFRpbWVTY2FsZSAtIFRoZSBzdGFydCB0aW1lIHNjYWxlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBlbmRUaW1lU2NhbGUgLSBUaGUgZW5kIHRpbWUgc2NhbGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGR1cmF0aW9uIC0gVGhlIGR1cmF0aW9uLlxyXG5cdCAqIEByZXR1cm4ge0FuaW1hdGlvbkFjdGlvbn0gQSByZWZlcmVuY2UgdG8gdGhpcyBhbmltYXRpb24gYWN0aW9uLlxyXG5cdCAqL1xyXG5cdHdhcnAoIHN0YXJ0VGltZVNjYWxlLCBlbmRUaW1lU2NhbGUsIGR1cmF0aW9uICkge1xyXG5cclxuXHRcdGNvbnN0IG1peGVyID0gdGhpcy5fbWl4ZXIsXHJcblx0XHRcdG5vdyA9IG1peGVyLnRpbWUsXHJcblx0XHRcdHRpbWVTY2FsZSA9IHRoaXMudGltZVNjYWxlO1xyXG5cclxuXHRcdGxldCBpbnRlcnBvbGFudCA9IHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50O1xyXG5cclxuXHRcdGlmICggaW50ZXJwb2xhbnQgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRpbnRlcnBvbGFudCA9IG1peGVyLl9sZW5kQ29udHJvbEludGVycG9sYW50KCk7XHJcblx0XHRcdHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50ID0gaW50ZXJwb2xhbnQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHRpbWVzID0gaW50ZXJwb2xhbnQucGFyYW1ldGVyUG9zaXRpb25zLFxyXG5cdFx0XHR2YWx1ZXMgPSBpbnRlcnBvbGFudC5zYW1wbGVWYWx1ZXM7XHJcblxyXG5cdFx0dGltZXNbIDAgXSA9IG5vdztcclxuXHRcdHRpbWVzWyAxIF0gPSBub3cgKyBkdXJhdGlvbjtcclxuXHJcblx0XHR2YWx1ZXNbIDAgXSA9IHN0YXJ0VGltZVNjYWxlIC8gdGltZVNjYWxlO1xyXG5cdFx0dmFsdWVzWyAxIF0gPSBlbmRUaW1lU2NhbGUgLyB0aW1lU2NhbGU7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3RvcHMgYW55IHNjaGVkdWxlZCB3YXJwaW5nIHdoaWNoIGlzIGFwcGxpZWQgdG8gdGhpcyBhY3Rpb24uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtBbmltYXRpb25BY3Rpb259IEEgcmVmZXJlbmNlIHRvIHRoaXMgYW5pbWF0aW9uIGFjdGlvbi5cclxuXHQgKi9cclxuXHRzdG9wV2FycGluZygpIHtcclxuXHJcblx0XHRjb25zdCB0aW1lU2NhbGVJbnRlcnBvbGFudCA9IHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50O1xyXG5cclxuXHRcdGlmICggdGltZVNjYWxlSW50ZXJwb2xhbnQgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudCA9IG51bGw7XHJcblx0XHRcdHRoaXMuX21peGVyLl90YWtlQmFja0NvbnRyb2xJbnRlcnBvbGFudCggdGltZVNjYWxlSW50ZXJwb2xhbnQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgYW5pbWF0aW9uIG1peGVyIG9mIHRoaXMgYW5pbWF0aW9uIGFjdGlvbi5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0FuaW1hdGlvbk1peGVyfSBUaGUgYW5pbWF0aW9uIG1peGVyLlxyXG5cdCAqL1xyXG5cdGdldE1peGVyKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9taXhlcjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBhbmltYXRpb24gY2xpcCBvZiB0aGlzIGFuaW1hdGlvbiBhY3Rpb24uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtBbmltYXRpb25DbGlwfSBUaGUgYW5pbWF0aW9uIGNsaXAuXHJcblx0ICovXHJcblx0Z2V0Q2xpcCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fY2xpcDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSByb290IG9iamVjdCBvZiB0aGlzIGFuaW1hdGlvbiBhY3Rpb24uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtPYmplY3QzRH0gVGhlIHJvb3Qgb2JqZWN0LlxyXG5cdCAqL1xyXG5cdGdldFJvb3QoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX2xvY2FsUm9vdCB8fCB0aGlzLl9taXhlci5fcm9vdDtcclxuXHJcblx0fVxyXG5cclxuXHQvLyBJbnRlcm5hXHJcblxyXG5cdF91cGRhdGUoIHRpbWUsIGRlbHRhVGltZSwgdGltZURpcmVjdGlvbiwgYWNjdUluZGV4ICkge1xyXG5cclxuXHRcdC8vIGNhbGxlZCBieSB0aGUgbWl4ZXJcclxuXHJcblx0XHRpZiAoICEgdGhpcy5lbmFibGVkICkge1xyXG5cclxuXHRcdFx0Ly8gY2FsbCAuX3VwZGF0ZVdlaWdodCgpIHRvIHVwZGF0ZSAuX2VmZmVjdGl2ZVdlaWdodFxyXG5cclxuXHRcdFx0dGhpcy5fdXBkYXRlV2VpZ2h0KCB0aW1lICk7XHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3Qgc3RhcnRUaW1lID0gdGhpcy5fc3RhcnRUaW1lO1xyXG5cclxuXHRcdGlmICggc3RhcnRUaW1lICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0Ly8gY2hlY2sgZm9yIHNjaGVkdWxlZCBzdGFydCBvZiBhY3Rpb25cclxuXHJcblx0XHRcdGNvbnN0IHRpbWVSdW5uaW5nID0gKCB0aW1lIC0gc3RhcnRUaW1lICkgKiB0aW1lRGlyZWN0aW9uO1xyXG5cdFx0XHRpZiAoIHRpbWVSdW5uaW5nIDwgMCB8fCB0aW1lRGlyZWN0aW9uID09PSAwICkge1xyXG5cclxuXHRcdFx0XHRkZWx0YVRpbWUgPSAwO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblxyXG5cdFx0XHRcdHRoaXMuX3N0YXJ0VGltZSA9IG51bGw7IC8vIHVuc2NoZWR1bGVcclxuXHRcdFx0XHRkZWx0YVRpbWUgPSB0aW1lRGlyZWN0aW9uICogdGltZVJ1bm5pbmc7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGFwcGx5IHRpbWUgc2NhbGUgYW5kIGFkdmFuY2UgdGltZVxyXG5cclxuXHRcdGRlbHRhVGltZSAqPSB0aGlzLl91cGRhdGVUaW1lU2NhbGUoIHRpbWUgKTtcclxuXHRcdGNvbnN0IGNsaXBUaW1lID0gdGhpcy5fdXBkYXRlVGltZSggZGVsdGFUaW1lICk7XHJcblxyXG5cdFx0Ly8gbm90ZTogX3VwZGF0ZVRpbWUgbWF5IGRpc2FibGUgdGhlIGFjdGlvbiByZXN1bHRpbmcgaW5cclxuXHRcdC8vIGFuIGVmZmVjdGl2ZSB3ZWlnaHQgb2YgMFxyXG5cclxuXHRcdGNvbnN0IHdlaWdodCA9IHRoaXMuX3VwZGF0ZVdlaWdodCggdGltZSApO1xyXG5cclxuXHRcdGlmICggd2VpZ2h0ID4gMCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGludGVycG9sYW50cyA9IHRoaXMuX2ludGVycG9sYW50cztcclxuXHRcdFx0Y29uc3QgcHJvcGVydHlNaXhlcnMgPSB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzO1xyXG5cclxuXHRcdFx0c3dpdGNoICggdGhpcy5ibGVuZE1vZGUgKSB7XHJcblxyXG5cdFx0XHRcdGNhc2UgQWRkaXRpdmVBbmltYXRpb25CbGVuZE1vZGU6XHJcblxyXG5cdFx0XHRcdFx0Zm9yICggbGV0IGogPSAwLCBtID0gaW50ZXJwb2xhbnRzLmxlbmd0aDsgaiAhPT0gbTsgKysgaiApIHtcclxuXHJcblx0XHRcdFx0XHRcdGludGVycG9sYW50c1sgaiBdLmV2YWx1YXRlKCBjbGlwVGltZSApO1xyXG5cdFx0XHRcdFx0XHRwcm9wZXJ0eU1peGVyc1sgaiBdLmFjY3VtdWxhdGVBZGRpdGl2ZSggd2VpZ2h0ICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRjYXNlIE5vcm1hbEFuaW1hdGlvbkJsZW5kTW9kZTpcclxuXHRcdFx0XHRkZWZhdWx0OlxyXG5cclxuXHRcdFx0XHRcdGZvciAoIGxldCBqID0gMCwgbSA9IGludGVycG9sYW50cy5sZW5ndGg7IGogIT09IG07ICsrIGogKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRpbnRlcnBvbGFudHNbIGogXS5ldmFsdWF0ZSggY2xpcFRpbWUgKTtcclxuXHRcdFx0XHRcdFx0cHJvcGVydHlNaXhlcnNbIGogXS5hY2N1bXVsYXRlKCBhY2N1SW5kZXgsIHdlaWdodCApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0X3VwZGF0ZVdlaWdodCggdGltZSApIHtcclxuXHJcblx0XHRsZXQgd2VpZ2h0ID0gMDtcclxuXHJcblx0XHRpZiAoIHRoaXMuZW5hYmxlZCApIHtcclxuXHJcblx0XHRcdHdlaWdodCA9IHRoaXMud2VpZ2h0O1xyXG5cdFx0XHRjb25zdCBpbnRlcnBvbGFudCA9IHRoaXMuX3dlaWdodEludGVycG9sYW50O1xyXG5cclxuXHRcdFx0aWYgKCBpbnRlcnBvbGFudCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgaW50ZXJwb2xhbnRWYWx1ZSA9IGludGVycG9sYW50LmV2YWx1YXRlKCB0aW1lIClbIDAgXTtcclxuXHJcblx0XHRcdFx0d2VpZ2h0ICo9IGludGVycG9sYW50VmFsdWU7XHJcblxyXG5cdFx0XHRcdGlmICggdGltZSA+IGludGVycG9sYW50LnBhcmFtZXRlclBvc2l0aW9uc1sgMSBdICkge1xyXG5cclxuXHRcdFx0XHRcdHRoaXMuc3RvcEZhZGluZygpO1xyXG5cclxuXHRcdFx0XHRcdGlmICggaW50ZXJwb2xhbnRWYWx1ZSA9PT0gMCApIHtcclxuXHJcblx0XHRcdFx0XHRcdC8vIGZhZGVkIG91dCwgZGlzYWJsZVxyXG5cdFx0XHRcdFx0XHR0aGlzLmVuYWJsZWQgPSBmYWxzZTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5fZWZmZWN0aXZlV2VpZ2h0ID0gd2VpZ2h0O1xyXG5cdFx0cmV0dXJuIHdlaWdodDtcclxuXHJcblx0fVxyXG5cclxuXHRfdXBkYXRlVGltZVNjYWxlKCB0aW1lICkge1xyXG5cclxuXHRcdGxldCB0aW1lU2NhbGUgPSAwO1xyXG5cclxuXHRcdGlmICggISB0aGlzLnBhdXNlZCApIHtcclxuXHJcblx0XHRcdHRpbWVTY2FsZSA9IHRoaXMudGltZVNjYWxlO1xyXG5cclxuXHRcdFx0Y29uc3QgaW50ZXJwb2xhbnQgPSB0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudDtcclxuXHJcblx0XHRcdGlmICggaW50ZXJwb2xhbnQgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGludGVycG9sYW50VmFsdWUgPSBpbnRlcnBvbGFudC5ldmFsdWF0ZSggdGltZSApWyAwIF07XHJcblxyXG5cdFx0XHRcdHRpbWVTY2FsZSAqPSBpbnRlcnBvbGFudFZhbHVlO1xyXG5cclxuXHRcdFx0XHRpZiAoIHRpbWUgPiBpbnRlcnBvbGFudC5wYXJhbWV0ZXJQb3NpdGlvbnNbIDEgXSApIHtcclxuXHJcblx0XHRcdFx0XHR0aGlzLnN0b3BXYXJwaW5nKCk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCB0aW1lU2NhbGUgPT09IDAgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBtb3Rpb24gaGFzIGhhbHRlZCwgcGF1c2VcclxuXHRcdFx0XHRcdFx0dGhpcy5wYXVzZWQgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHQvLyB3YXJwIGRvbmUgLSBhcHBseSBmaW5hbCB0aW1lIHNjYWxlXHJcblx0XHRcdFx0XHRcdHRoaXMudGltZVNjYWxlID0gdGltZVNjYWxlO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGUgPSB0aW1lU2NhbGU7XHJcblx0XHRyZXR1cm4gdGltZVNjYWxlO1xyXG5cclxuXHR9XHJcblxyXG5cdF91cGRhdGVUaW1lKCBkZWx0YVRpbWUgKSB7XHJcblxyXG5cdFx0Y29uc3QgZHVyYXRpb24gPSB0aGlzLl9jbGlwLmR1cmF0aW9uO1xyXG5cdFx0Y29uc3QgbG9vcCA9IHRoaXMubG9vcDtcclxuXHJcblx0XHRsZXQgdGltZSA9IHRoaXMudGltZSArIGRlbHRhVGltZTtcclxuXHRcdGxldCBsb29wQ291bnQgPSB0aGlzLl9sb29wQ291bnQ7XHJcblxyXG5cdFx0Y29uc3QgcGluZ1BvbmcgPSAoIGxvb3AgPT09IExvb3BQaW5nUG9uZyApO1xyXG5cclxuXHRcdGlmICggZGVsdGFUaW1lID09PSAwICkge1xyXG5cclxuXHRcdFx0aWYgKCBsb29wQ291bnQgPT09IC0gMSApIHJldHVybiB0aW1lO1xyXG5cclxuXHRcdFx0cmV0dXJuICggcGluZ1BvbmcgJiYgKCBsb29wQ291bnQgJiAxICkgPT09IDEgKSA/IGR1cmF0aW9uIC0gdGltZSA6IHRpbWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggbG9vcCA9PT0gTG9vcE9uY2UgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGxvb3BDb3VudCA9PT0gLSAxICkge1xyXG5cclxuXHRcdFx0XHQvLyBqdXN0IHN0YXJ0ZWRcclxuXHJcblx0XHRcdFx0dGhpcy5fbG9vcENvdW50ID0gMDtcclxuXHRcdFx0XHR0aGlzLl9zZXRFbmRpbmdzKCB0cnVlLCB0cnVlLCBmYWxzZSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aGFuZGxlX3N0b3A6IHtcclxuXHJcblx0XHRcdFx0aWYgKCB0aW1lID49IGR1cmF0aW9uICkge1xyXG5cclxuXHRcdFx0XHRcdHRpbWUgPSBkdXJhdGlvbjtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggdGltZSA8IDAgKSB7XHJcblxyXG5cdFx0XHRcdFx0dGltZSA9IDA7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0dGhpcy50aW1lID0gdGltZTtcclxuXHJcblx0XHRcdFx0XHRicmVhayBoYW5kbGVfc3RvcDtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoIHRoaXMuY2xhbXBXaGVuRmluaXNoZWQgKSB0aGlzLnBhdXNlZCA9IHRydWU7XHJcblx0XHRcdFx0ZWxzZSB0aGlzLmVuYWJsZWQgPSBmYWxzZTtcclxuXHJcblx0XHRcdFx0dGhpcy50aW1lID0gdGltZTtcclxuXHJcblx0XHRcdFx0dGhpcy5fbWl4ZXIuZGlzcGF0Y2hFdmVudCgge1xyXG5cdFx0XHRcdFx0dHlwZTogJ2ZpbmlzaGVkJywgYWN0aW9uOiB0aGlzLFxyXG5cdFx0XHRcdFx0ZGlyZWN0aW9uOiBkZWx0YVRpbWUgPCAwID8gLSAxIDogMVxyXG5cdFx0XHRcdH0gKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2UgeyAvLyByZXBldGl0aXZlIFJlcGVhdCBvciBQaW5nUG9uZ1xyXG5cclxuXHRcdFx0aWYgKCBsb29wQ291bnQgPT09IC0gMSApIHtcclxuXHJcblx0XHRcdFx0Ly8ganVzdCBzdGFydGVkXHJcblxyXG5cdFx0XHRcdGlmICggZGVsdGFUaW1lID49IDAgKSB7XHJcblxyXG5cdFx0XHRcdFx0bG9vcENvdW50ID0gMDtcclxuXHJcblx0XHRcdFx0XHR0aGlzLl9zZXRFbmRpbmdzKCB0cnVlLCB0aGlzLnJlcGV0aXRpb25zID09PSAwLCBwaW5nUG9uZyApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdC8vIHdoZW4gbG9vcGluZyBpbiByZXZlcnNlIGRpcmVjdGlvbiwgdGhlIGluaXRpYWxcclxuXHRcdFx0XHRcdC8vIHRyYW5zaXRpb24gdGhyb3VnaCB6ZXJvIGNvdW50cyBhcyBhIHJlcGV0aXRpb24sXHJcblx0XHRcdFx0XHQvLyBzbyBsZWF2ZSBsb29wQ291bnQgYXQgLTFcclxuXHJcblx0XHRcdFx0XHR0aGlzLl9zZXRFbmRpbmdzKCB0aGlzLnJlcGV0aXRpb25zID09PSAwLCB0cnVlLCBwaW5nUG9uZyApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHRpbWUgPj0gZHVyYXRpb24gfHwgdGltZSA8IDAgKSB7XHJcblxyXG5cdFx0XHRcdC8vIHdyYXAgYXJvdW5kXHJcblxyXG5cdFx0XHRcdGNvbnN0IGxvb3BEZWx0YSA9IE1hdGguZmxvb3IoIHRpbWUgLyBkdXJhdGlvbiApOyAvLyBzaWduZWRcclxuXHRcdFx0XHR0aW1lIC09IGR1cmF0aW9uICogbG9vcERlbHRhO1xyXG5cclxuXHRcdFx0XHRsb29wQ291bnQgKz0gTWF0aC5hYnMoIGxvb3BEZWx0YSApO1xyXG5cclxuXHRcdFx0XHRjb25zdCBwZW5kaW5nID0gdGhpcy5yZXBldGl0aW9ucyAtIGxvb3BDb3VudDtcclxuXHJcblx0XHRcdFx0aWYgKCBwZW5kaW5nIDw9IDAgKSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gaGF2ZSB0byBzdG9wIChzd2l0Y2ggc3RhdGUsIGNsYW1wIHRpbWUsIGZpcmUgZXZlbnQpXHJcblxyXG5cdFx0XHRcdFx0aWYgKCB0aGlzLmNsYW1wV2hlbkZpbmlzaGVkICkgdGhpcy5wYXVzZWQgPSB0cnVlO1xyXG5cdFx0XHRcdFx0ZWxzZSB0aGlzLmVuYWJsZWQgPSBmYWxzZTtcclxuXHJcblx0XHRcdFx0XHR0aW1lID0gZGVsdGFUaW1lID4gMCA/IGR1cmF0aW9uIDogMDtcclxuXHJcblx0XHRcdFx0XHR0aGlzLnRpbWUgPSB0aW1lO1xyXG5cclxuXHRcdFx0XHRcdHRoaXMuX21peGVyLmRpc3BhdGNoRXZlbnQoIHtcclxuXHRcdFx0XHRcdFx0dHlwZTogJ2ZpbmlzaGVkJywgYWN0aW9uOiB0aGlzLFxyXG5cdFx0XHRcdFx0XHRkaXJlY3Rpb246IGRlbHRhVGltZSA+IDAgPyAxIDogLSAxXHJcblx0XHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8ga2VlcCBydW5uaW5nXHJcblxyXG5cdFx0XHRcdFx0aWYgKCBwZW5kaW5nID09PSAxICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Ly8gZW50ZXJpbmcgdGhlIGxhc3Qgcm91bmRcclxuXHJcblx0XHRcdFx0XHRcdGNvbnN0IGF0U3RhcnQgPSBkZWx0YVRpbWUgPCAwO1xyXG5cdFx0XHRcdFx0XHR0aGlzLl9zZXRFbmRpbmdzKCBhdFN0YXJ0LCAhIGF0U3RhcnQsIHBpbmdQb25nICk7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdHRoaXMuX3NldEVuZGluZ3MoIGZhbHNlLCBmYWxzZSwgcGluZ1BvbmcgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0dGhpcy5fbG9vcENvdW50ID0gbG9vcENvdW50O1xyXG5cclxuXHRcdFx0XHRcdHRoaXMudGltZSA9IHRpbWU7XHJcblxyXG5cdFx0XHRcdFx0dGhpcy5fbWl4ZXIuZGlzcGF0Y2hFdmVudCgge1xyXG5cdFx0XHRcdFx0XHR0eXBlOiAnbG9vcCcsIGFjdGlvbjogdGhpcywgbG9vcERlbHRhOiBsb29wRGVsdGFcclxuXHRcdFx0XHRcdH0gKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0dGhpcy50aW1lID0gdGltZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggcGluZ1BvbmcgJiYgKCBsb29wQ291bnQgJiAxICkgPT09IDEgKSB7XHJcblxyXG5cdFx0XHRcdC8vIGludmVydCB0aW1lIGZvciB0aGUgXCJwb25nIHJvdW5kXCJcclxuXHJcblx0XHRcdFx0cmV0dXJuIGR1cmF0aW9uIC0gdGltZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRpbWU7XHJcblxyXG5cdH1cclxuXHJcblx0X3NldEVuZGluZ3MoIGF0U3RhcnQsIGF0RW5kLCBwaW5nUG9uZyApIHtcclxuXHJcblx0XHRjb25zdCBzZXR0aW5ncyA9IHRoaXMuX2ludGVycG9sYW50U2V0dGluZ3M7XHJcblxyXG5cdFx0aWYgKCBwaW5nUG9uZyApIHtcclxuXHJcblx0XHRcdHNldHRpbmdzLmVuZGluZ1N0YXJ0ID0gWmVyb1Nsb3BlRW5kaW5nO1xyXG5cdFx0XHRzZXR0aW5ncy5lbmRpbmdFbmQgPSBaZXJvU2xvcGVFbmRpbmc7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdC8vIGFzc3VtaW5nIGZvciBMb29wT25jZSBhdFN0YXJ0ID09IGF0RW5kID09IHRydWVcclxuXHJcblx0XHRcdGlmICggYXRTdGFydCApIHtcclxuXHJcblx0XHRcdFx0c2V0dGluZ3MuZW5kaW5nU3RhcnQgPSB0aGlzLnplcm9TbG9wZUF0U3RhcnQgPyBaZXJvU2xvcGVFbmRpbmcgOiBaZXJvQ3VydmF0dXJlRW5kaW5nO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0c2V0dGluZ3MuZW5kaW5nU3RhcnQgPSBXcmFwQXJvdW5kRW5kaW5nO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBhdEVuZCApIHtcclxuXHJcblx0XHRcdFx0c2V0dGluZ3MuZW5kaW5nRW5kID0gdGhpcy56ZXJvU2xvcGVBdEVuZCA/IFplcm9TbG9wZUVuZGluZyA6IFplcm9DdXJ2YXR1cmVFbmRpbmc7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRzZXR0aW5ncy5lbmRpbmdFbmQgXHQgPSBXcmFwQXJvdW5kRW5kaW5nO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRfc2NoZWR1bGVGYWRpbmcoIGR1cmF0aW9uLCB3ZWlnaHROb3csIHdlaWdodFRoZW4gKSB7XHJcblxyXG5cdFx0Y29uc3QgbWl4ZXIgPSB0aGlzLl9taXhlciwgbm93ID0gbWl4ZXIudGltZTtcclxuXHRcdGxldCBpbnRlcnBvbGFudCA9IHRoaXMuX3dlaWdodEludGVycG9sYW50O1xyXG5cclxuXHRcdGlmICggaW50ZXJwb2xhbnQgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRpbnRlcnBvbGFudCA9IG1peGVyLl9sZW5kQ29udHJvbEludGVycG9sYW50KCk7XHJcblx0XHRcdHRoaXMuX3dlaWdodEludGVycG9sYW50ID0gaW50ZXJwb2xhbnQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHRpbWVzID0gaW50ZXJwb2xhbnQucGFyYW1ldGVyUG9zaXRpb25zLFxyXG5cdFx0XHR2YWx1ZXMgPSBpbnRlcnBvbGFudC5zYW1wbGVWYWx1ZXM7XHJcblxyXG5cdFx0dGltZXNbIDAgXSA9IG5vdztcclxuXHRcdHZhbHVlc1sgMCBdID0gd2VpZ2h0Tm93O1xyXG5cdFx0dGltZXNbIDEgXSA9IG5vdyArIGR1cmF0aW9uO1xyXG5cdFx0dmFsdWVzWyAxIF0gPSB3ZWlnaHRUaGVuO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgQW5pbWF0aW9uQWN0aW9uIH07XHJcbiIsImltcG9ydCB7IEFuaW1hdGlvbkFjdGlvbiB9IGZyb20gJy4vQW5pbWF0aW9uQWN0aW9uLmpzJztcclxuaW1wb3J0IHsgRXZlbnREaXNwYXRjaGVyIH0gZnJvbSAnLi4vY29yZS9FdmVudERpc3BhdGNoZXIuanMnO1xyXG5pbXBvcnQgeyBMaW5lYXJJbnRlcnBvbGFudCB9IGZyb20gJy4uL21hdGgvaW50ZXJwb2xhbnRzL0xpbmVhckludGVycG9sYW50LmpzJztcclxuaW1wb3J0IHsgUHJvcGVydHlCaW5kaW5nIH0gZnJvbSAnLi9Qcm9wZXJ0eUJpbmRpbmcuanMnO1xyXG5pbXBvcnQgeyBQcm9wZXJ0eU1peGVyIH0gZnJvbSAnLi9Qcm9wZXJ0eU1peGVyLmpzJztcclxuaW1wb3J0IHsgQW5pbWF0aW9uQ2xpcCB9IGZyb20gJy4vQW5pbWF0aW9uQ2xpcC5qcyc7XHJcbmltcG9ydCB7IE5vcm1hbEFuaW1hdGlvbkJsZW5kTW9kZSB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XHJcblxyXG5jb25zdCBfY29udHJvbEludGVycG9sYW50c1Jlc3VsdEJ1ZmZlciA9IG5ldyBGbG9hdDMyQXJyYXkoIDEgKTtcclxuXHJcbi8qKlxyXG4gKiBgQW5pbWF0aW9uTWl4ZXJgIGlzIGEgcGxheWVyIGZvciBhbmltYXRpb25zIG9uIGEgcGFydGljdWxhciBvYmplY3QgaW5cclxuICogdGhlIHNjZW5lLiBXaGVuIG11bHRpcGxlIG9iamVjdHMgaW4gdGhlIHNjZW5lIGFyZSBhbmltYXRlZCBpbmRlcGVuZGVudGx5LFxyXG4gKiBvbmUgYEFuaW1hdGlvbk1peGVyYCBtYXkgYmUgdXNlZCBmb3IgZWFjaCBvYmplY3QuXHJcbiAqL1xyXG5jbGFzcyBBbmltYXRpb25NaXhlciBleHRlbmRzIEV2ZW50RGlzcGF0Y2hlciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYW5pbWF0aW9uIG1peGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3QzRH0gcm9vdCAtIFRoZSBvYmplY3Qgd2hvc2UgYW5pbWF0aW9ucyBzaGFsbCBiZSBwbGF5ZWQgYnkgdGhpcyBtaXhlci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggcm9vdCApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdHRoaXMuX3Jvb3QgPSByb290O1xyXG5cdFx0dGhpcy5faW5pdE1lbW9yeU1hbmFnZXIoKTtcclxuXHRcdHRoaXMuX2FjY3VJbmRleCA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZ2xvYmFsIG1peGVyIHRpbWUgKGluIHNlY29uZHM7IHN0YXJ0aW5nIHdpdGggYDBgIG9uIHRoZSBtaXhlcidzIGNyZWF0aW9uKS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRpbWUgPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBzY2FsaW5nIGZhY3RvciBmb3IgdGhlIGdsb2JhbCB0aW1lLlxyXG5cdFx0ICpcclxuXHRcdCAqIE5vdGU6IFNldHRpbmcgdGhpcyBtZW1iZXIgdG8gYDBgIGFuZCBsYXRlciBiYWNrIHRvIGAxYCBpcyBhXHJcblx0XHQgKiBwb3NzaWJpbGl0eSB0byBwYXVzZS91bnBhdXNlIGFsbCBhY3Rpb25zIHRoYXQgYXJlIGNvbnRyb2xsZWQgYnkgdGhpc1xyXG5cdFx0ICogbWl4ZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50aW1lU2NhbGUgPSAxLjA7XHJcblxyXG5cdH1cclxuXHJcblx0X2JpbmRBY3Rpb24oIGFjdGlvbiwgcHJvdG90eXBlQWN0aW9uICkge1xyXG5cclxuXHRcdGNvbnN0IHJvb3QgPSBhY3Rpb24uX2xvY2FsUm9vdCB8fCB0aGlzLl9yb290LFxyXG5cdFx0XHR0cmFja3MgPSBhY3Rpb24uX2NsaXAudHJhY2tzLFxyXG5cdFx0XHRuVHJhY2tzID0gdHJhY2tzLmxlbmd0aCxcclxuXHRcdFx0YmluZGluZ3MgPSBhY3Rpb24uX3Byb3BlcnR5QmluZGluZ3MsXHJcblx0XHRcdGludGVycG9sYW50cyA9IGFjdGlvbi5faW50ZXJwb2xhbnRzLFxyXG5cdFx0XHRyb290VXVpZCA9IHJvb3QudXVpZCxcclxuXHRcdFx0YmluZGluZ3NCeVJvb3QgPSB0aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWU7XHJcblxyXG5cdFx0bGV0IGJpbmRpbmdzQnlOYW1lID0gYmluZGluZ3NCeVJvb3RbIHJvb3RVdWlkIF07XHJcblxyXG5cdFx0aWYgKCBiaW5kaW5nc0J5TmFtZSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0YmluZGluZ3NCeU5hbWUgPSB7fTtcclxuXHRcdFx0YmluZGluZ3NCeVJvb3RbIHJvb3RVdWlkIF0gPSBiaW5kaW5nc0J5TmFtZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpICE9PSBuVHJhY2tzOyArKyBpICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdHJhY2sgPSB0cmFja3NbIGkgXSxcclxuXHRcdFx0XHR0cmFja05hbWUgPSB0cmFjay5uYW1lO1xyXG5cclxuXHRcdFx0bGV0IGJpbmRpbmcgPSBiaW5kaW5nc0J5TmFtZVsgdHJhY2tOYW1lIF07XHJcblxyXG5cdFx0XHRpZiAoIGJpbmRpbmcgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0KysgYmluZGluZy5yZWZlcmVuY2VDb3VudDtcclxuXHRcdFx0XHRiaW5kaW5nc1sgaSBdID0gYmluZGluZztcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGJpbmRpbmcgPSBiaW5kaW5nc1sgaSBdO1xyXG5cclxuXHRcdFx0XHRpZiAoIGJpbmRpbmcgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHQvLyBleGlzdGluZyBiaW5kaW5nLCBtYWtlIHN1cmUgdGhlIGNhY2hlIGtub3dzXHJcblxyXG5cdFx0XHRcdFx0aWYgKCBiaW5kaW5nLl9jYWNoZUluZGV4ID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRcdFx0KysgYmluZGluZy5yZWZlcmVuY2VDb3VudDtcclxuXHRcdFx0XHRcdFx0dGhpcy5fYWRkSW5hY3RpdmVCaW5kaW5nKCBiaW5kaW5nLCByb290VXVpZCwgdHJhY2tOYW1lICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGNvbnRpbnVlO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGNvbnN0IHBhdGggPSBwcm90b3R5cGVBY3Rpb24gJiYgcHJvdG90eXBlQWN0aW9uLlxyXG5cdFx0XHRcdFx0X3Byb3BlcnR5QmluZGluZ3NbIGkgXS5iaW5kaW5nLnBhcnNlZFBhdGg7XHJcblxyXG5cdFx0XHRcdGJpbmRpbmcgPSBuZXcgUHJvcGVydHlNaXhlcihcclxuXHRcdFx0XHRcdFByb3BlcnR5QmluZGluZy5jcmVhdGUoIHJvb3QsIHRyYWNrTmFtZSwgcGF0aCApLFxyXG5cdFx0XHRcdFx0dHJhY2suVmFsdWVUeXBlTmFtZSwgdHJhY2suZ2V0VmFsdWVTaXplKCkgKTtcclxuXHJcblx0XHRcdFx0KysgYmluZGluZy5yZWZlcmVuY2VDb3VudDtcclxuXHRcdFx0XHR0aGlzLl9hZGRJbmFjdGl2ZUJpbmRpbmcoIGJpbmRpbmcsIHJvb3RVdWlkLCB0cmFja05hbWUgKTtcclxuXHJcblx0XHRcdFx0YmluZGluZ3NbIGkgXSA9IGJpbmRpbmc7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpbnRlcnBvbGFudHNbIGkgXS5yZXN1bHRCdWZmZXIgPSBiaW5kaW5nLmJ1ZmZlcjtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0X2FjdGl2YXRlQWN0aW9uKCBhY3Rpb24gKSB7XHJcblxyXG5cdFx0aWYgKCAhIHRoaXMuX2lzQWN0aXZlQWN0aW9uKCBhY3Rpb24gKSApIHtcclxuXHJcblx0XHRcdGlmICggYWN0aW9uLl9jYWNoZUluZGV4ID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHQvLyB0aGlzIGFjdGlvbiBoYXMgYmVlbiBmb3Jnb3R0ZW4gYnkgdGhlIGNhY2hlLCBidXQgdGhlIHVzZXJcclxuXHRcdFx0XHQvLyBhcHBlYXJzIHRvIGJlIHN0aWxsIHVzaW5nIGl0IC0+IHJlYmluZFxyXG5cclxuXHRcdFx0XHRjb25zdCByb290VXVpZCA9ICggYWN0aW9uLl9sb2NhbFJvb3QgfHwgdGhpcy5fcm9vdCApLnV1aWQsXHJcblx0XHRcdFx0XHRjbGlwVXVpZCA9IGFjdGlvbi5fY2xpcC51dWlkLFxyXG5cdFx0XHRcdFx0YWN0aW9uc0ZvckNsaXAgPSB0aGlzLl9hY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdO1xyXG5cclxuXHRcdFx0XHR0aGlzLl9iaW5kQWN0aW9uKCBhY3Rpb24sXHJcblx0XHRcdFx0XHRhY3Rpb25zRm9yQ2xpcCAmJiBhY3Rpb25zRm9yQ2xpcC5rbm93bkFjdGlvbnNbIDAgXSApO1xyXG5cclxuXHRcdFx0XHR0aGlzLl9hZGRJbmFjdGl2ZUFjdGlvbiggYWN0aW9uLCBjbGlwVXVpZCwgcm9vdFV1aWQgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IGJpbmRpbmdzID0gYWN0aW9uLl9wcm9wZXJ0eUJpbmRpbmdzO1xyXG5cclxuXHRcdFx0Ly8gaW5jcmVtZW50IHJlZmVyZW5jZSBjb3VudHMgLyBzb3J0IG91dCBzdGF0ZVxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIG4gPSBiaW5kaW5ncy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGJpbmRpbmcgPSBiaW5kaW5nc1sgaSBdO1xyXG5cclxuXHRcdFx0XHRpZiAoIGJpbmRpbmcudXNlQ291bnQgKysgPT09IDAgKSB7XHJcblxyXG5cdFx0XHRcdFx0dGhpcy5fbGVuZEJpbmRpbmcoIGJpbmRpbmcgKTtcclxuXHRcdFx0XHRcdGJpbmRpbmcuc2F2ZU9yaWdpbmFsU3RhdGUoKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5fbGVuZEFjdGlvbiggYWN0aW9uICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdF9kZWFjdGl2YXRlQWN0aW9uKCBhY3Rpb24gKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9pc0FjdGl2ZUFjdGlvbiggYWN0aW9uICkgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBiaW5kaW5ncyA9IGFjdGlvbi5fcHJvcGVydHlCaW5kaW5ncztcclxuXHJcblx0XHRcdC8vIGRlY3JlbWVudCByZWZlcmVuY2UgY291bnRzIC8gc29ydCBvdXQgc3RhdGVcclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBuID0gYmluZGluZ3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBiaW5kaW5nID0gYmluZGluZ3NbIGkgXTtcclxuXHJcblx0XHRcdFx0aWYgKCAtLSBiaW5kaW5nLnVzZUNvdW50ID09PSAwICkge1xyXG5cclxuXHRcdFx0XHRcdGJpbmRpbmcucmVzdG9yZU9yaWdpbmFsU3RhdGUoKTtcclxuXHRcdFx0XHRcdHRoaXMuX3Rha2VCYWNrQmluZGluZyggYmluZGluZyApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0aGlzLl90YWtlQmFja0FjdGlvbiggYWN0aW9uICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8vIE1lbW9yeSBtYW5hZ2VyXHJcblxyXG5cdF9pbml0TWVtb3J5TWFuYWdlcigpIHtcclxuXHJcblx0XHR0aGlzLl9hY3Rpb25zID0gW107IC8vICduQWN0aXZlQWN0aW9ucycgZm9sbG93ZWQgYnkgaW5hY3RpdmUgb25lc1xyXG5cdFx0dGhpcy5fbkFjdGl2ZUFjdGlvbnMgPSAwO1xyXG5cclxuXHRcdHRoaXMuX2FjdGlvbnNCeUNsaXAgPSB7fTtcclxuXHRcdC8vIGluc2lkZTpcclxuXHRcdC8vIHtcclxuXHRcdC8vIFx0a25vd25BY3Rpb25zOiBBcnJheTwgQW5pbWF0aW9uQWN0aW9uID4gLSB1c2VkIGFzIHByb3RvdHlwZXNcclxuXHRcdC8vIFx0YWN0aW9uQnlSb290OiBBbmltYXRpb25BY3Rpb24gLSBsb29rdXBcclxuXHRcdC8vIH1cclxuXHJcblxyXG5cdFx0dGhpcy5fYmluZGluZ3MgPSBbXTsgLy8gJ25BY3RpdmVCaW5kaW5ncycgZm9sbG93ZWQgYnkgaW5hY3RpdmUgb25lc1xyXG5cdFx0dGhpcy5fbkFjdGl2ZUJpbmRpbmdzID0gMDtcclxuXHJcblx0XHR0aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUgPSB7fTsgLy8gaW5zaWRlOiBNYXA8IG5hbWUsIFByb3BlcnR5TWl4ZXIgPlxyXG5cclxuXHJcblx0XHR0aGlzLl9jb250cm9sSW50ZXJwb2xhbnRzID0gW107IC8vIHNhbWUgZ2FtZSBhcyBhYm92ZVxyXG5cdFx0dGhpcy5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHMgPSAwO1xyXG5cclxuXHRcdGNvbnN0IHNjb3BlID0gdGhpcztcclxuXHJcblx0XHR0aGlzLnN0YXRzID0ge1xyXG5cclxuXHRcdFx0YWN0aW9uczoge1xyXG5cdFx0XHRcdGdldCB0b3RhbCgpIHtcclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gc2NvcGUuX2FjdGlvbnMubGVuZ3RoO1xyXG5cclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdGdldCBpblVzZSgpIHtcclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gc2NvcGUuX25BY3RpdmVBY3Rpb25zO1xyXG5cclxuXHRcdFx0XHR9XHJcblx0XHRcdH0sXHJcblx0XHRcdGJpbmRpbmdzOiB7XHJcblx0XHRcdFx0Z2V0IHRvdGFsKCkge1xyXG5cclxuXHRcdFx0XHRcdHJldHVybiBzY29wZS5fYmluZGluZ3MubGVuZ3RoO1xyXG5cclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdGdldCBpblVzZSgpIHtcclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gc2NvcGUuX25BY3RpdmVCaW5kaW5ncztcclxuXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9LFxyXG5cdFx0XHRjb250cm9sSW50ZXJwb2xhbnRzOiB7XHJcblx0XHRcdFx0Z2V0IHRvdGFsKCkge1xyXG5cclxuXHRcdFx0XHRcdHJldHVybiBzY29wZS5fY29udHJvbEludGVycG9sYW50cy5sZW5ndGg7XHJcblxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0Z2V0IGluVXNlKCkge1xyXG5cclxuXHRcdFx0XHRcdHJldHVybiBzY29wZS5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHM7XHJcblxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdH07XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gTWVtb3J5IG1hbmFnZW1lbnQgZm9yIEFuaW1hdGlvbkFjdGlvbiBvYmplY3RzXHJcblxyXG5cdF9pc0FjdGl2ZUFjdGlvbiggYWN0aW9uICkge1xyXG5cclxuXHRcdGNvbnN0IGluZGV4ID0gYWN0aW9uLl9jYWNoZUluZGV4O1xyXG5cdFx0cmV0dXJuIGluZGV4ICE9PSBudWxsICYmIGluZGV4IDwgdGhpcy5fbkFjdGl2ZUFjdGlvbnM7XHJcblxyXG5cdH1cclxuXHJcblx0X2FkZEluYWN0aXZlQWN0aW9uKCBhY3Rpb24sIGNsaXBVdWlkLCByb290VXVpZCApIHtcclxuXHJcblx0XHRjb25zdCBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucyxcclxuXHRcdFx0YWN0aW9uc0J5Q2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXA7XHJcblxyXG5cdFx0bGV0IGFjdGlvbnNGb3JDbGlwID0gYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXTtcclxuXHJcblx0XHRpZiAoIGFjdGlvbnNGb3JDbGlwID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRhY3Rpb25zRm9yQ2xpcCA9IHtcclxuXHJcblx0XHRcdFx0a25vd25BY3Rpb25zOiBbIGFjdGlvbiBdLFxyXG5cdFx0XHRcdGFjdGlvbkJ5Um9vdDoge31cclxuXHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHRhY3Rpb24uX2J5Q2xpcENhY2hlSW5kZXggPSAwO1xyXG5cclxuXHRcdFx0YWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXSA9IGFjdGlvbnNGb3JDbGlwO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRjb25zdCBrbm93bkFjdGlvbnMgPSBhY3Rpb25zRm9yQ2xpcC5rbm93bkFjdGlvbnM7XHJcblxyXG5cdFx0XHRhY3Rpb24uX2J5Q2xpcENhY2hlSW5kZXggPSBrbm93bkFjdGlvbnMubGVuZ3RoO1xyXG5cdFx0XHRrbm93bkFjdGlvbnMucHVzaCggYWN0aW9uICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGFjdGlvbi5fY2FjaGVJbmRleCA9IGFjdGlvbnMubGVuZ3RoO1xyXG5cdFx0YWN0aW9ucy5wdXNoKCBhY3Rpb24gKTtcclxuXHJcblx0XHRhY3Rpb25zRm9yQ2xpcC5hY3Rpb25CeVJvb3RbIHJvb3RVdWlkIF0gPSBhY3Rpb247XHJcblxyXG5cdH1cclxuXHJcblx0X3JlbW92ZUluYWN0aXZlQWN0aW9uKCBhY3Rpb24gKSB7XHJcblxyXG5cdFx0Y29uc3QgYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnMsXHJcblx0XHRcdGxhc3RJbmFjdGl2ZUFjdGlvbiA9IGFjdGlvbnNbIGFjdGlvbnMubGVuZ3RoIC0gMSBdLFxyXG5cdFx0XHRjYWNoZUluZGV4ID0gYWN0aW9uLl9jYWNoZUluZGV4O1xyXG5cclxuXHRcdGxhc3RJbmFjdGl2ZUFjdGlvbi5fY2FjaGVJbmRleCA9IGNhY2hlSW5kZXg7XHJcblx0XHRhY3Rpb25zWyBjYWNoZUluZGV4IF0gPSBsYXN0SW5hY3RpdmVBY3Rpb247XHJcblx0XHRhY3Rpb25zLnBvcCgpO1xyXG5cclxuXHRcdGFjdGlvbi5fY2FjaGVJbmRleCA9IG51bGw7XHJcblxyXG5cclxuXHRcdGNvbnN0IGNsaXBVdWlkID0gYWN0aW9uLl9jbGlwLnV1aWQsXHJcblx0XHRcdGFjdGlvbnNCeUNsaXAgPSB0aGlzLl9hY3Rpb25zQnlDbGlwLFxyXG5cdFx0XHRhY3Rpb25zRm9yQ2xpcCA9IGFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF0sXHJcblx0XHRcdGtub3duQWN0aW9uc0ZvckNsaXAgPSBhY3Rpb25zRm9yQ2xpcC5rbm93bkFjdGlvbnMsXHJcblxyXG5cdFx0XHRsYXN0S25vd25BY3Rpb24gPVxyXG5cdFx0XHRcdGtub3duQWN0aW9uc0ZvckNsaXBbIGtub3duQWN0aW9uc0ZvckNsaXAubGVuZ3RoIC0gMSBdLFxyXG5cclxuXHRcdFx0YnlDbGlwQ2FjaGVJbmRleCA9IGFjdGlvbi5fYnlDbGlwQ2FjaGVJbmRleDtcclxuXHJcblx0XHRsYXN0S25vd25BY3Rpb24uX2J5Q2xpcENhY2hlSW5kZXggPSBieUNsaXBDYWNoZUluZGV4O1xyXG5cdFx0a25vd25BY3Rpb25zRm9yQ2xpcFsgYnlDbGlwQ2FjaGVJbmRleCBdID0gbGFzdEtub3duQWN0aW9uO1xyXG5cdFx0a25vd25BY3Rpb25zRm9yQ2xpcC5wb3AoKTtcclxuXHJcblx0XHRhY3Rpb24uX2J5Q2xpcENhY2hlSW5kZXggPSBudWxsO1xyXG5cclxuXHJcblx0XHRjb25zdCBhY3Rpb25CeVJvb3QgPSBhY3Rpb25zRm9yQ2xpcC5hY3Rpb25CeVJvb3QsXHJcblx0XHRcdHJvb3RVdWlkID0gKCBhY3Rpb24uX2xvY2FsUm9vdCB8fCB0aGlzLl9yb290ICkudXVpZDtcclxuXHJcblx0XHRkZWxldGUgYWN0aW9uQnlSb290WyByb290VXVpZCBdO1xyXG5cclxuXHRcdGlmICgga25vd25BY3Rpb25zRm9yQ2xpcC5sZW5ndGggPT09IDAgKSB7XHJcblxyXG5cdFx0XHRkZWxldGUgYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nc0ZvckFjdGlvbiggYWN0aW9uICk7XHJcblxyXG5cdH1cclxuXHJcblx0X3JlbW92ZUluYWN0aXZlQmluZGluZ3NGb3JBY3Rpb24oIGFjdGlvbiApIHtcclxuXHJcblx0XHRjb25zdCBiaW5kaW5ncyA9IGFjdGlvbi5fcHJvcGVydHlCaW5kaW5ncztcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIG4gPSBiaW5kaW5ncy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBiaW5kaW5nID0gYmluZGluZ3NbIGkgXTtcclxuXHJcblx0XHRcdGlmICggLS0gYmluZGluZy5yZWZlcmVuY2VDb3VudCA9PT0gMCApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nKCBiaW5kaW5nICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdF9sZW5kQWN0aW9uKCBhY3Rpb24gKSB7XHJcblxyXG5cdFx0Ly8gWyBhY3RpdmUgYWN0aW9ucyB8ICBpbmFjdGl2ZSBhY3Rpb25zICBdXHJcblx0XHQvLyBbICBhY3RpdmUgYWN0aW9ucyA+fCBpbmFjdGl2ZSBhY3Rpb25zIF1cclxuXHRcdC8vICAgICAgICAgICAgICAgICBzICAgICAgICBhXHJcblx0XHQvLyAgICAgICAgICAgICAgICAgIDwtc3dhcC0+XHJcblx0XHQvLyAgICAgICAgICAgICAgICAgYSAgICAgICAgc1xyXG5cclxuXHRcdGNvbnN0IGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLFxyXG5cdFx0XHRwcmV2SW5kZXggPSBhY3Rpb24uX2NhY2hlSW5kZXgsXHJcblxyXG5cdFx0XHRsYXN0QWN0aXZlSW5kZXggPSB0aGlzLl9uQWN0aXZlQWN0aW9ucyArKyxcclxuXHJcblx0XHRcdGZpcnN0SW5hY3RpdmVBY3Rpb24gPSBhY3Rpb25zWyBsYXN0QWN0aXZlSW5kZXggXTtcclxuXHJcblx0XHRhY3Rpb24uX2NhY2hlSW5kZXggPSBsYXN0QWN0aXZlSW5kZXg7XHJcblx0XHRhY3Rpb25zWyBsYXN0QWN0aXZlSW5kZXggXSA9IGFjdGlvbjtcclxuXHJcblx0XHRmaXJzdEluYWN0aXZlQWN0aW9uLl9jYWNoZUluZGV4ID0gcHJldkluZGV4O1xyXG5cdFx0YWN0aW9uc1sgcHJldkluZGV4IF0gPSBmaXJzdEluYWN0aXZlQWN0aW9uO1xyXG5cclxuXHR9XHJcblxyXG5cdF90YWtlQmFja0FjdGlvbiggYWN0aW9uICkge1xyXG5cclxuXHRcdC8vIFsgIGFjdGl2ZSBhY3Rpb25zICB8IGluYWN0aXZlIGFjdGlvbnMgXVxyXG5cdFx0Ly8gWyBhY3RpdmUgYWN0aW9ucyB8PCBpbmFjdGl2ZSBhY3Rpb25zICBdXHJcblx0XHQvLyAgICAgICAgYSAgICAgICAgc1xyXG5cdFx0Ly8gICAgICAgICA8LXN3YXAtPlxyXG5cdFx0Ly8gICAgICAgIHMgICAgICAgIGFcclxuXHJcblx0XHRjb25zdCBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucyxcclxuXHRcdFx0cHJldkluZGV4ID0gYWN0aW9uLl9jYWNoZUluZGV4LFxyXG5cclxuXHRcdFx0Zmlyc3RJbmFjdGl2ZUluZGV4ID0gLS0gdGhpcy5fbkFjdGl2ZUFjdGlvbnMsXHJcblxyXG5cdFx0XHRsYXN0QWN0aXZlQWN0aW9uID0gYWN0aW9uc1sgZmlyc3RJbmFjdGl2ZUluZGV4IF07XHJcblxyXG5cdFx0YWN0aW9uLl9jYWNoZUluZGV4ID0gZmlyc3RJbmFjdGl2ZUluZGV4O1xyXG5cdFx0YWN0aW9uc1sgZmlyc3RJbmFjdGl2ZUluZGV4IF0gPSBhY3Rpb247XHJcblxyXG5cdFx0bGFzdEFjdGl2ZUFjdGlvbi5fY2FjaGVJbmRleCA9IHByZXZJbmRleDtcclxuXHRcdGFjdGlvbnNbIHByZXZJbmRleCBdID0gbGFzdEFjdGl2ZUFjdGlvbjtcclxuXHJcblx0fVxyXG5cclxuXHQvLyBNZW1vcnkgbWFuYWdlbWVudCBmb3IgUHJvcGVydHlNaXhlciBvYmplY3RzXHJcblxyXG5cdF9hZGRJbmFjdGl2ZUJpbmRpbmcoIGJpbmRpbmcsIHJvb3RVdWlkLCB0cmFja05hbWUgKSB7XHJcblxyXG5cdFx0Y29uc3QgYmluZGluZ3NCeVJvb3QgPSB0aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUsXHJcblx0XHRcdGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3M7XHJcblxyXG5cdFx0bGV0IGJpbmRpbmdCeU5hbWUgPSBiaW5kaW5nc0J5Um9vdFsgcm9vdFV1aWQgXTtcclxuXHJcblx0XHRpZiAoIGJpbmRpbmdCeU5hbWUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGJpbmRpbmdCeU5hbWUgPSB7fTtcclxuXHRcdFx0YmluZGluZ3NCeVJvb3RbIHJvb3RVdWlkIF0gPSBiaW5kaW5nQnlOYW1lO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRiaW5kaW5nQnlOYW1lWyB0cmFja05hbWUgXSA9IGJpbmRpbmc7XHJcblxyXG5cdFx0YmluZGluZy5fY2FjaGVJbmRleCA9IGJpbmRpbmdzLmxlbmd0aDtcclxuXHRcdGJpbmRpbmdzLnB1c2goIGJpbmRpbmcgKTtcclxuXHJcblx0fVxyXG5cclxuXHRfcmVtb3ZlSW5hY3RpdmVCaW5kaW5nKCBiaW5kaW5nICkge1xyXG5cclxuXHRcdGNvbnN0IGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsXHJcblx0XHRcdHByb3BCaW5kaW5nID0gYmluZGluZy5iaW5kaW5nLFxyXG5cdFx0XHRyb290VXVpZCA9IHByb3BCaW5kaW5nLnJvb3ROb2RlLnV1aWQsXHJcblx0XHRcdHRyYWNrTmFtZSA9IHByb3BCaW5kaW5nLnBhdGgsXHJcblx0XHRcdGJpbmRpbmdzQnlSb290ID0gdGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lLFxyXG5cdFx0XHRiaW5kaW5nQnlOYW1lID0gYmluZGluZ3NCeVJvb3RbIHJvb3RVdWlkIF0sXHJcblxyXG5cdFx0XHRsYXN0SW5hY3RpdmVCaW5kaW5nID0gYmluZGluZ3NbIGJpbmRpbmdzLmxlbmd0aCAtIDEgXSxcclxuXHRcdFx0Y2FjaGVJbmRleCA9IGJpbmRpbmcuX2NhY2hlSW5kZXg7XHJcblxyXG5cdFx0bGFzdEluYWN0aXZlQmluZGluZy5fY2FjaGVJbmRleCA9IGNhY2hlSW5kZXg7XHJcblx0XHRiaW5kaW5nc1sgY2FjaGVJbmRleCBdID0gbGFzdEluYWN0aXZlQmluZGluZztcclxuXHRcdGJpbmRpbmdzLnBvcCgpO1xyXG5cclxuXHRcdGRlbGV0ZSBiaW5kaW5nQnlOYW1lWyB0cmFja05hbWUgXTtcclxuXHJcblx0XHRpZiAoIE9iamVjdC5rZXlzKCBiaW5kaW5nQnlOYW1lICkubGVuZ3RoID09PSAwICkge1xyXG5cclxuXHRcdFx0ZGVsZXRlIGJpbmRpbmdzQnlSb290WyByb290VXVpZCBdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRfbGVuZEJpbmRpbmcoIGJpbmRpbmcgKSB7XHJcblxyXG5cdFx0Y29uc3QgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncyxcclxuXHRcdFx0cHJldkluZGV4ID0gYmluZGluZy5fY2FjaGVJbmRleCxcclxuXHJcblx0XHRcdGxhc3RBY3RpdmVJbmRleCA9IHRoaXMuX25BY3RpdmVCaW5kaW5ncyArKyxcclxuXHJcblx0XHRcdGZpcnN0SW5hY3RpdmVCaW5kaW5nID0gYmluZGluZ3NbIGxhc3RBY3RpdmVJbmRleCBdO1xyXG5cclxuXHRcdGJpbmRpbmcuX2NhY2hlSW5kZXggPSBsYXN0QWN0aXZlSW5kZXg7XHJcblx0XHRiaW5kaW5nc1sgbGFzdEFjdGl2ZUluZGV4IF0gPSBiaW5kaW5nO1xyXG5cclxuXHRcdGZpcnN0SW5hY3RpdmVCaW5kaW5nLl9jYWNoZUluZGV4ID0gcHJldkluZGV4O1xyXG5cdFx0YmluZGluZ3NbIHByZXZJbmRleCBdID0gZmlyc3RJbmFjdGl2ZUJpbmRpbmc7XHJcblxyXG5cdH1cclxuXHJcblx0X3Rha2VCYWNrQmluZGluZyggYmluZGluZyApIHtcclxuXHJcblx0XHRjb25zdCBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxyXG5cdFx0XHRwcmV2SW5kZXggPSBiaW5kaW5nLl9jYWNoZUluZGV4LFxyXG5cclxuXHRcdFx0Zmlyc3RJbmFjdGl2ZUluZGV4ID0gLS0gdGhpcy5fbkFjdGl2ZUJpbmRpbmdzLFxyXG5cclxuXHRcdFx0bGFzdEFjdGl2ZUJpbmRpbmcgPSBiaW5kaW5nc1sgZmlyc3RJbmFjdGl2ZUluZGV4IF07XHJcblxyXG5cdFx0YmluZGluZy5fY2FjaGVJbmRleCA9IGZpcnN0SW5hY3RpdmVJbmRleDtcclxuXHRcdGJpbmRpbmdzWyBmaXJzdEluYWN0aXZlSW5kZXggXSA9IGJpbmRpbmc7XHJcblxyXG5cdFx0bGFzdEFjdGl2ZUJpbmRpbmcuX2NhY2hlSW5kZXggPSBwcmV2SW5kZXg7XHJcblx0XHRiaW5kaW5nc1sgcHJldkluZGV4IF0gPSBsYXN0QWN0aXZlQmluZGluZztcclxuXHJcblx0fVxyXG5cclxuXHJcblx0Ly8gTWVtb3J5IG1hbmFnZW1lbnQgb2YgSW50ZXJwb2xhbnRzIGZvciB3ZWlnaHQgYW5kIHRpbWUgc2NhbGVcclxuXHJcblx0X2xlbmRDb250cm9sSW50ZXJwb2xhbnQoKSB7XHJcblxyXG5cdFx0Y29uc3QgaW50ZXJwb2xhbnRzID0gdGhpcy5fY29udHJvbEludGVycG9sYW50cyxcclxuXHRcdFx0bGFzdEFjdGl2ZUluZGV4ID0gdGhpcy5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHMgKys7XHJcblxyXG5cdFx0bGV0IGludGVycG9sYW50ID0gaW50ZXJwb2xhbnRzWyBsYXN0QWN0aXZlSW5kZXggXTtcclxuXHJcblx0XHRpZiAoIGludGVycG9sYW50ID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRpbnRlcnBvbGFudCA9IG5ldyBMaW5lYXJJbnRlcnBvbGFudChcclxuXHRcdFx0XHRuZXcgRmxvYXQzMkFycmF5KCAyICksIG5ldyBGbG9hdDMyQXJyYXkoIDIgKSxcclxuXHRcdFx0XHQxLCBfY29udHJvbEludGVycG9sYW50c1Jlc3VsdEJ1ZmZlciApO1xyXG5cclxuXHRcdFx0aW50ZXJwb2xhbnQuX19jYWNoZUluZGV4ID0gbGFzdEFjdGl2ZUluZGV4O1xyXG5cdFx0XHRpbnRlcnBvbGFudHNbIGxhc3RBY3RpdmVJbmRleCBdID0gaW50ZXJwb2xhbnQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBpbnRlcnBvbGFudDtcclxuXHJcblx0fVxyXG5cclxuXHRfdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQoIGludGVycG9sYW50ICkge1xyXG5cclxuXHRcdGNvbnN0IGludGVycG9sYW50cyA9IHRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHMsXHJcblx0XHRcdHByZXZJbmRleCA9IGludGVycG9sYW50Ll9fY2FjaGVJbmRleCxcclxuXHJcblx0XHRcdGZpcnN0SW5hY3RpdmVJbmRleCA9IC0tIHRoaXMuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzLFxyXG5cclxuXHRcdFx0bGFzdEFjdGl2ZUludGVycG9sYW50ID0gaW50ZXJwb2xhbnRzWyBmaXJzdEluYWN0aXZlSW5kZXggXTtcclxuXHJcblx0XHRpbnRlcnBvbGFudC5fX2NhY2hlSW5kZXggPSBmaXJzdEluYWN0aXZlSW5kZXg7XHJcblx0XHRpbnRlcnBvbGFudHNbIGZpcnN0SW5hY3RpdmVJbmRleCBdID0gaW50ZXJwb2xhbnQ7XHJcblxyXG5cdFx0bGFzdEFjdGl2ZUludGVycG9sYW50Ll9fY2FjaGVJbmRleCA9IHByZXZJbmRleDtcclxuXHRcdGludGVycG9sYW50c1sgcHJldkluZGV4IF0gPSBsYXN0QWN0aXZlSW50ZXJwb2xhbnQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgQW5pbWF0aW9uQWN0aW9ufSBmb3IgdGhlIHBhc3NlZCBjbGlwLlxyXG5cdCAqXHJcblx0ICogSWYgYW4gYWN0aW9uIGZpdHRpbmcgdGhlIGNsaXAgYW5kIHJvb3QgcGFyYW1ldGVycyBkb2Vzbid0IHlldCBleGlzdCwgaXRcclxuXHQgKiB3aWxsIGJlIGNyZWF0ZWQgYnkgdGhpcyBtZXRob2QuIENhbGxpbmcgdGhpcyBtZXRob2Qgc2V2ZXJhbCB0aW1lcyB3aXRoIHRoZVxyXG5cdCAqIHNhbWUgY2xpcCBhbmQgcm9vdCBwYXJhbWV0ZXJzIGFsd2F5cyByZXR1cm5zIHRoZSBzYW1lIGFjdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QW5pbWF0aW9uQ2xpcHxzdHJpbmd9IGNsaXAgLSBBbiBhbmltYXRpb24gY2xpcCBvciBhbHRlcm5hdGl2ZWx5IHRoZSBuYW1lIG9mIHRoZSBhbmltYXRpb24gY2xpcC5cclxuXHQgKiBAcGFyYW0ge09iamVjdDNEfSBbb3B0aW9uYWxSb290XSAtIEFuIGFsdGVybmF0aXZlIHJvb3Qgb2JqZWN0LlxyXG5cdCAqIEBwYXJhbSB7KE5vcm1hbEFuaW1hdGlvbkJsZW5kTW9kZXxBZGRpdGl2ZUFuaW1hdGlvbkJsZW5kTW9kZSl9IFtibGVuZE1vZGVdIC0gVGhlIGJsZW5kIG1vZGUuXHJcblx0ICogQHJldHVybiB7P0FuaW1hdGlvbkFjdGlvbn0gVGhlIGFuaW1hdGlvbiBhY3Rpb24uXHJcblx0ICovXHJcblx0Y2xpcEFjdGlvbiggY2xpcCwgb3B0aW9uYWxSb290LCBibGVuZE1vZGUgKSB7XHJcblxyXG5cdFx0Y29uc3Qgcm9vdCA9IG9wdGlvbmFsUm9vdCB8fCB0aGlzLl9yb290LFxyXG5cdFx0XHRyb290VXVpZCA9IHJvb3QudXVpZDtcclxuXHJcblx0XHRsZXQgY2xpcE9iamVjdCA9IHR5cGVvZiBjbGlwID09PSAnc3RyaW5nJyA/IEFuaW1hdGlvbkNsaXAuZmluZEJ5TmFtZSggcm9vdCwgY2xpcCApIDogY2xpcDtcclxuXHJcblx0XHRjb25zdCBjbGlwVXVpZCA9IGNsaXBPYmplY3QgIT09IG51bGwgPyBjbGlwT2JqZWN0LnV1aWQgOiBjbGlwO1xyXG5cclxuXHRcdGNvbnN0IGFjdGlvbnNGb3JDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXTtcclxuXHRcdGxldCBwcm90b3R5cGVBY3Rpb24gPSBudWxsO1xyXG5cclxuXHRcdGlmICggYmxlbmRNb2RlID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGNsaXBPYmplY3QgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdGJsZW5kTW9kZSA9IGNsaXBPYmplY3QuYmxlbmRNb2RlO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0YmxlbmRNb2RlID0gTm9ybWFsQW5pbWF0aW9uQmxlbmRNb2RlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGFjdGlvbnNGb3JDbGlwICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBleGlzdGluZ0FjdGlvbiA9IGFjdGlvbnNGb3JDbGlwLmFjdGlvbkJ5Um9vdFsgcm9vdFV1aWQgXTtcclxuXHJcblx0XHRcdGlmICggZXhpc3RpbmdBY3Rpb24gIT09IHVuZGVmaW5lZCAmJiBleGlzdGluZ0FjdGlvbi5ibGVuZE1vZGUgPT09IGJsZW5kTW9kZSApIHtcclxuXHJcblx0XHRcdFx0cmV0dXJuIGV4aXN0aW5nQWN0aW9uO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gd2Uga25vdyB0aGUgY2xpcCwgc28gd2UgZG9uJ3QgaGF2ZSB0byBwYXJzZSBhbGxcclxuXHRcdFx0Ly8gdGhlIGJpbmRpbmdzIGFnYWluIGJ1dCBjYW4ganVzdCBjb3B5XHJcblx0XHRcdHByb3RvdHlwZUFjdGlvbiA9IGFjdGlvbnNGb3JDbGlwLmtub3duQWN0aW9uc1sgMCBdO1xyXG5cclxuXHRcdFx0Ly8gYWxzbywgdGFrZSB0aGUgY2xpcCBmcm9tIHRoZSBwcm90b3R5cGUgYWN0aW9uXHJcblx0XHRcdGlmICggY2xpcE9iamVjdCA9PT0gbnVsbCApXHJcblx0XHRcdFx0Y2xpcE9iamVjdCA9IHByb3RvdHlwZUFjdGlvbi5fY2xpcDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gY2xpcCBtdXN0IGJlIGtub3duIHdoZW4gc3BlY2lmaWVkIHZpYSBzdHJpbmdcclxuXHRcdGlmICggY2xpcE9iamVjdCA9PT0gbnVsbCApIHJldHVybiBudWxsO1xyXG5cclxuXHRcdC8vIGFsbG9jYXRlIGFsbCByZXNvdXJjZXMgcmVxdWlyZWQgdG8gcnVuIGl0XHJcblx0XHRjb25zdCBuZXdBY3Rpb24gPSBuZXcgQW5pbWF0aW9uQWN0aW9uKCB0aGlzLCBjbGlwT2JqZWN0LCBvcHRpb25hbFJvb3QsIGJsZW5kTW9kZSApO1xyXG5cclxuXHRcdHRoaXMuX2JpbmRBY3Rpb24oIG5ld0FjdGlvbiwgcHJvdG90eXBlQWN0aW9uICk7XHJcblxyXG5cdFx0Ly8gYW5kIG1ha2UgdGhlIGFjdGlvbiBrbm93biB0byB0aGUgbWVtb3J5IG1hbmFnZXJcclxuXHRcdHRoaXMuX2FkZEluYWN0aXZlQWN0aW9uKCBuZXdBY3Rpb24sIGNsaXBVdWlkLCByb290VXVpZCApO1xyXG5cclxuXHRcdHJldHVybiBuZXdBY3Rpb247XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhbiBleGlzdGluZyBhbmltYXRpb24gYWN0aW9uIGZvciB0aGUgcGFzc2VkIGNsaXAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FuaW1hdGlvbkNsaXB8c3RyaW5nfSBjbGlwIC0gQW4gYW5pbWF0aW9uIGNsaXAgb3IgYWx0ZXJuYXRpdmVseSB0aGUgbmFtZSBvZiB0aGUgYW5pbWF0aW9uIGNsaXAuXHJcblx0ICogQHBhcmFtIHtPYmplY3QzRH0gW29wdGlvbmFsUm9vdF0gLSBBbiBhbHRlcm5hdGl2ZSByb290IG9iamVjdC5cclxuXHQgKiBAcmV0dXJuIHs/QW5pbWF0aW9uQWN0aW9ufSBUaGUgYW5pbWF0aW9uIGFjdGlvbi4gUmV0dXJucyBgbnVsbGAgaWYgbm8gYWN0aW9uIHdhcyBmb3VuZC5cclxuXHQgKi9cclxuXHRleGlzdGluZ0FjdGlvbiggY2xpcCwgb3B0aW9uYWxSb290ICkge1xyXG5cclxuXHRcdGNvbnN0IHJvb3QgPSBvcHRpb25hbFJvb3QgfHwgdGhpcy5fcm9vdCxcclxuXHRcdFx0cm9vdFV1aWQgPSByb290LnV1aWQsXHJcblxyXG5cdFx0XHRjbGlwT2JqZWN0ID0gdHlwZW9mIGNsaXAgPT09ICdzdHJpbmcnID9cclxuXHRcdFx0XHRBbmltYXRpb25DbGlwLmZpbmRCeU5hbWUoIHJvb3QsIGNsaXAgKSA6IGNsaXAsXHJcblxyXG5cdFx0XHRjbGlwVXVpZCA9IGNsaXBPYmplY3QgPyBjbGlwT2JqZWN0LnV1aWQgOiBjbGlwLFxyXG5cclxuXHRcdFx0YWN0aW9uc0ZvckNsaXAgPSB0aGlzLl9hY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdO1xyXG5cclxuXHRcdGlmICggYWN0aW9uc0ZvckNsaXAgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHJldHVybiBhY3Rpb25zRm9yQ2xpcC5hY3Rpb25CeVJvb3RbIHJvb3RVdWlkIF0gfHwgbnVsbDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVhY3RpdmF0ZXMgYWxsIHByZXZpb3VzbHkgc2NoZWR1bGVkIGFjdGlvbnMgb24gdGhpcyBtaXhlci5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0FuaW1hdGlvbk1peGVyfSBBIHJlZmVyZW5jZSB0byB0aGkgYW5pbWF0aW9uIG1peGVyLlxyXG5cdCAqL1xyXG5cdHN0b3BBbGxBY3Rpb24oKSB7XHJcblxyXG5cdFx0Y29uc3QgYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnMsXHJcblx0XHRcdG5BY3Rpb25zID0gdGhpcy5fbkFjdGl2ZUFjdGlvbnM7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSBuQWN0aW9ucyAtIDE7IGkgPj0gMDsgLS0gaSApIHtcclxuXHJcblx0XHRcdGFjdGlvbnNbIGkgXS5zdG9wKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkdmFuY2VzIHRoZSBnbG9iYWwgbWl4ZXIgdGltZSBhbmQgdXBkYXRlcyB0aGUgYW5pbWF0aW9uLlxyXG5cdCAqXHJcblx0ICogVGhpcyBpcyB1c3VhbGx5IGRvbmUgaW4gdGhlIHJlbmRlciBsb29wIGJ5IHBhc3NpbmcgdGhlIGRlbHRhXHJcblx0ICogdGltZSBmcm9tIHtAbGluayBDbG9ja30gb3Ige0BsaW5rIFRpbWVyfS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBkZWx0YVRpbWUgLSBUaGUgZGVsdGEgdGltZSBpbiBzZWNvbmRzLlxyXG5cdCAqIEByZXR1cm4ge0FuaW1hdGlvbk1peGVyfSBBIHJlZmVyZW5jZSB0byB0aGkgYW5pbWF0aW9uIG1peGVyLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZSggZGVsdGFUaW1lICkge1xyXG5cclxuXHRcdGRlbHRhVGltZSAqPSB0aGlzLnRpbWVTY2FsZTtcclxuXHJcblx0XHRjb25zdCBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucyxcclxuXHRcdFx0bkFjdGlvbnMgPSB0aGlzLl9uQWN0aXZlQWN0aW9ucyxcclxuXHJcblx0XHRcdHRpbWUgPSB0aGlzLnRpbWUgKz0gZGVsdGFUaW1lLFxyXG5cdFx0XHR0aW1lRGlyZWN0aW9uID0gTWF0aC5zaWduKCBkZWx0YVRpbWUgKSxcclxuXHJcblx0XHRcdGFjY3VJbmRleCA9IHRoaXMuX2FjY3VJbmRleCBePSAxO1xyXG5cclxuXHRcdC8vIHJ1biBhY3RpdmUgYWN0aW9uc1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSAhPT0gbkFjdGlvbnM7ICsrIGkgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBhY3Rpb24gPSBhY3Rpb25zWyBpIF07XHJcblxyXG5cdFx0XHRhY3Rpb24uX3VwZGF0ZSggdGltZSwgZGVsdGFUaW1lLCB0aW1lRGlyZWN0aW9uLCBhY2N1SW5kZXggKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gdXBkYXRlIHNjZW5lIGdyYXBoXHJcblxyXG5cdFx0Y29uc3QgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncyxcclxuXHRcdFx0bkJpbmRpbmdzID0gdGhpcy5fbkFjdGl2ZUJpbmRpbmdzO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSAhPT0gbkJpbmRpbmdzOyArKyBpICkge1xyXG5cclxuXHRcdFx0YmluZGluZ3NbIGkgXS5hcHBseSggYWNjdUluZGV4ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGdsb2JhbCBtaXhlciB0byBhIHNwZWNpZmljIHRpbWUgYW5kIHVwZGF0ZXMgdGhlIGFuaW1hdGlvbiBhY2NvcmRpbmdseS5cclxuXHQgKlxyXG5cdCAqIFRoaXMgaXMgdXNlZnVsIHdoZW4geW91IG5lZWQgdG8ganVtcCB0byBhbiBleGFjdCB0aW1lIGluIGFuIGFuaW1hdGlvbi4gVGhlXHJcblx0ICogaW5wdXQgcGFyYW1ldGVyIHdpbGwgYmUgc2NhbGVkIGJ5IHtAbGluayBBbmltYXRpb25NaXhlciN0aW1lU2NhbGV9XHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdGltZSAtIFRoZSB0aW1lIHRvIHNldCBpbiBzZWNvbmRzLlxyXG5cdCAqIEByZXR1cm4ge0FuaW1hdGlvbk1peGVyfSBBIHJlZmVyZW5jZSB0byB0aGkgYW5pbWF0aW9uIG1peGVyLlxyXG5cdCAqL1xyXG5cdHNldFRpbWUoIHRpbWUgKSB7XHJcblxyXG5cdFx0dGhpcy50aW1lID0gMDsgLy8gWmVybyBvdXQgdGltZSBhdHRyaWJ1dGUgZm9yIEFuaW1hdGlvbk1peGVyIG9iamVjdDtcclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHRoaXMuX2FjdGlvbnMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0dGhpcy5fYWN0aW9uc1sgaSBdLnRpbWUgPSAwOyAvLyBaZXJvIG91dCB0aW1lIGF0dHJpYnV0ZSBmb3IgYWxsIGFzc29jaWF0ZWQgQW5pbWF0aW9uQWN0aW9uIG9iamVjdHMuXHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzLnVwZGF0ZSggdGltZSApOyAvLyBVcGRhdGUgdXNlZCB0byBzZXQgZXhhY3QgdGltZS4gUmV0dXJucyBcInRoaXNcIiBBbmltYXRpb25NaXhlciBvYmplY3QuXHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGlzIG1peGVyJ3Mgcm9vdCBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtPYmplY3QzRH0gVGhlIG1peGVyJ3Mgcm9vdCBvYmplY3QuXHJcblx0ICovXHJcblx0Z2V0Um9vdCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fcm9vdDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWFsbG9jYXRlcyBhbGwgbWVtb3J5IHJlc291cmNlcyBmb3IgYSBjbGlwLiBCZWZvcmUgdXNpbmcgdGhpcyBtZXRob2QgbWFrZVxyXG5cdCAqIHN1cmUgdG8gY2FsbCB7QGxpbmsgQW5pbWF0aW9uQWN0aW9uI3N0b3B9IGZvciBhbGwgcmVsYXRlZCBhY3Rpb25zLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBbmltYXRpb25DbGlwfSBjbGlwIC0gVGhlIGNsaXAgdG8gdW5jYWNoZS5cclxuXHQgKi9cclxuXHR1bmNhY2hlQ2xpcCggY2xpcCApIHtcclxuXHJcblx0XHRjb25zdCBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucyxcclxuXHRcdFx0Y2xpcFV1aWQgPSBjbGlwLnV1aWQsXHJcblx0XHRcdGFjdGlvbnNCeUNsaXAgPSB0aGlzLl9hY3Rpb25zQnlDbGlwLFxyXG5cdFx0XHRhY3Rpb25zRm9yQ2xpcCA9IGFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07XHJcblxyXG5cdFx0aWYgKCBhY3Rpb25zRm9yQ2xpcCAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Ly8gbm90ZToganVzdCBjYWxsaW5nIF9yZW1vdmVJbmFjdGl2ZUFjdGlvbiB3b3VsZCBtZXNzIHVwIHRoZVxyXG5cdFx0XHQvLyBpdGVyYXRpb24gc3RhdGUgYW5kIGFsc28gcmVxdWlyZSB1cGRhdGluZyB0aGUgc3RhdGUgd2UgY2FuXHJcblx0XHRcdC8vIGp1c3QgdGhyb3cgYXdheVxyXG5cclxuXHRcdFx0Y29uc3QgYWN0aW9uc1RvUmVtb3ZlID0gYWN0aW9uc0ZvckNsaXAua25vd25BY3Rpb25zO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBuID0gYWN0aW9uc1RvUmVtb3ZlLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgYWN0aW9uID0gYWN0aW9uc1RvUmVtb3ZlWyBpIF07XHJcblxyXG5cdFx0XHRcdHRoaXMuX2RlYWN0aXZhdGVBY3Rpb24oIGFjdGlvbiApO1xyXG5cclxuXHRcdFx0XHRjb25zdCBjYWNoZUluZGV4ID0gYWN0aW9uLl9jYWNoZUluZGV4LFxyXG5cdFx0XHRcdFx0bGFzdEluYWN0aXZlQWN0aW9uID0gYWN0aW9uc1sgYWN0aW9ucy5sZW5ndGggLSAxIF07XHJcblxyXG5cdFx0XHRcdGFjdGlvbi5fY2FjaGVJbmRleCA9IG51bGw7XHJcblx0XHRcdFx0YWN0aW9uLl9ieUNsaXBDYWNoZUluZGV4ID0gbnVsbDtcclxuXHJcblx0XHRcdFx0bGFzdEluYWN0aXZlQWN0aW9uLl9jYWNoZUluZGV4ID0gY2FjaGVJbmRleDtcclxuXHRcdFx0XHRhY3Rpb25zWyBjYWNoZUluZGV4IF0gPSBsYXN0SW5hY3RpdmVBY3Rpb247XHJcblx0XHRcdFx0YWN0aW9ucy5wb3AoKTtcclxuXHJcblx0XHRcdFx0dGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nc0ZvckFjdGlvbiggYWN0aW9uICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRkZWxldGUgYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVhbGxvY2F0ZXMgYWxsIG1lbW9yeSByZXNvdXJjZXMgZm9yIGEgcm9vdCBvYmplY3QuIEJlZm9yZSB1c2luZyB0aGlzXHJcblx0ICogbWV0aG9kIG1ha2Ugc3VyZSB0byBjYWxsIHtAbGluayBBbmltYXRpb25BY3Rpb24jc3RvcH0gZm9yIGFsbCByZWxhdGVkXHJcblx0ICogYWN0aW9ucyBvciBhbHRlcm5hdGl2ZWx5IHtAbGluayBBbmltYXRpb25NaXhlciNzdG9wQWxsQWN0aW9ufSB3aGVuIHRoZVxyXG5cdCAqIG1peGVyIG9wZXJhdGVzIG9uIGEgc2luZ2xlIHJvb3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdDNEfSByb290IC0gVGhlIHJvb3Qgb2JqZWN0IHRvIHVuY2FjaGUuXHJcblx0ICovXHJcblx0dW5jYWNoZVJvb3QoIHJvb3QgKSB7XHJcblxyXG5cdFx0Y29uc3Qgcm9vdFV1aWQgPSByb290LnV1aWQsXHJcblx0XHRcdGFjdGlvbnNCeUNsaXAgPSB0aGlzLl9hY3Rpb25zQnlDbGlwO1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IGNsaXBVdWlkIGluIGFjdGlvbnNCeUNsaXAgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBhY3Rpb25CeVJvb3QgPSBhY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdLmFjdGlvbkJ5Um9vdCxcclxuXHRcdFx0XHRhY3Rpb24gPSBhY3Rpb25CeVJvb3RbIHJvb3RVdWlkIF07XHJcblxyXG5cdFx0XHRpZiAoIGFjdGlvbiAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKCBhY3Rpb24gKTtcclxuXHRcdFx0XHR0aGlzLl9yZW1vdmVJbmFjdGl2ZUFjdGlvbiggYWN0aW9uICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGJpbmRpbmdzQnlSb290ID0gdGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lLFxyXG5cdFx0XHRiaW5kaW5nQnlOYW1lID0gYmluZGluZ3NCeVJvb3RbIHJvb3RVdWlkIF07XHJcblxyXG5cdFx0aWYgKCBiaW5kaW5nQnlOYW1lICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBjb25zdCB0cmFja05hbWUgaW4gYmluZGluZ0J5TmFtZSApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgYmluZGluZyA9IGJpbmRpbmdCeU5hbWVbIHRyYWNrTmFtZSBdO1xyXG5cdFx0XHRcdGJpbmRpbmcucmVzdG9yZU9yaWdpbmFsU3RhdGUoKTtcclxuXHRcdFx0XHR0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmcoIGJpbmRpbmcgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVhbGxvY2F0ZXMgYWxsIG1lbW9yeSByZXNvdXJjZXMgZm9yIGFuIGFjdGlvbi4gVGhlIGFjdGlvbiBpcyBpZGVudGlmaWVkIGJ5IHRoZVxyXG5cdCAqIGdpdmVuIGNsaXAgYW5kIGFuIG9wdGlvbmFsIHJvb3Qgb2JqZWN0LiBCZWZvcmUgdXNpbmcgdGhpcyBtZXRob2QgbWFrZVxyXG5cdCAqIHN1cmUgdG8gY2FsbCB7QGxpbmsgQW5pbWF0aW9uQWN0aW9uI3N0b3B9IHRvIGRlYWN0aXZhdGUgdGhlIGFjdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QW5pbWF0aW9uQ2xpcHxzdHJpbmd9IGNsaXAgLSBBbiBhbmltYXRpb24gY2xpcCBvciBhbHRlcm5hdGl2ZWx5IHRoZSBuYW1lIG9mIHRoZSBhbmltYXRpb24gY2xpcC5cclxuXHQgKiBAcGFyYW0ge09iamVjdDNEfSBbb3B0aW9uYWxSb290XSAtIEFuIGFsdGVybmF0aXZlIHJvb3Qgb2JqZWN0LlxyXG5cdCAqL1xyXG5cdHVuY2FjaGVBY3Rpb24oIGNsaXAsIG9wdGlvbmFsUm9vdCApIHtcclxuXHJcblx0XHRjb25zdCBhY3Rpb24gPSB0aGlzLmV4aXN0aW5nQWN0aW9uKCBjbGlwLCBvcHRpb25hbFJvb3QgKTtcclxuXHJcblx0XHRpZiAoIGFjdGlvbiAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuX2RlYWN0aXZhdGVBY3Rpb24oIGFjdGlvbiApO1xyXG5cdFx0XHR0aGlzLl9yZW1vdmVJbmFjdGl2ZUFjdGlvbiggYWN0aW9uICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBBbmltYXRpb25NaXhlciB9O1xyXG4iLCJpbXBvcnQgeyBSZW5kZXJUYXJnZXQgfSBmcm9tICcuL1JlbmRlclRhcmdldC5qcyc7XHJcbmltcG9ydCB7IERhdGEzRFRleHR1cmUgfSBmcm9tICcuLi90ZXh0dXJlcy9EYXRhM0RUZXh0dXJlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIGEgM0QgcmVuZGVyIHRhcmdldC5cclxuICpcclxuICogQGF1Z21lbnRzIFJlbmRlclRhcmdldFxyXG4gKi9cclxuY2xhc3MgUmVuZGVyVGFyZ2V0M0QgZXh0ZW5kcyBSZW5kZXJUYXJnZXQge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IDNEIHJlbmRlciB0YXJnZXQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3dpZHRoPTFdIC0gVGhlIHdpZHRoIG9mIHRoZSByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbaGVpZ2h0PTFdIC0gVGhlIGhlaWdodCBvZiB0aGUgcmVuZGVyIHRhcmdldC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2RlcHRoPTFdIC0gVGhlIGhlaWdodCBvZiB0aGUgcmVuZGVyIHRhcmdldC5cclxuXHQgKiBAcGFyYW0ge1JlbmRlclRhcmdldH5PcHRpb25zfSBbb3B0aW9uc10gLSBUaGUgY29uZmlndXJhdGlvbiBvYmplY3QuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHdpZHRoID0gMSwgaGVpZ2h0ID0gMSwgZGVwdGggPSAxLCBvcHRpb25zID0ge30gKSB7XHJcblxyXG5cdFx0c3VwZXIoIHdpZHRoLCBoZWlnaHQsIG9wdGlvbnMgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNSZW5kZXJUYXJnZXQzRCA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy5kZXB0aCA9IGRlcHRoO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogT3ZlcndyaXR0ZW4gd2l0aCBhIGRpZmZlcmVudCB0ZXh0dXJlIHR5cGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0RhdGEzRFRleHR1cmV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudGV4dHVyZSA9IG5ldyBEYXRhM0RUZXh0dXJlKCBudWxsLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCApO1xyXG5cclxuXHRcdHRoaXMudGV4dHVyZS5pc1JlbmRlclRhcmdldFRleHR1cmUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBSZW5kZXJUYXJnZXQzRCB9O1xyXG4iLCJpbXBvcnQgeyBSZW5kZXJUYXJnZXQgfSBmcm9tICcuL1JlbmRlclRhcmdldC5qcyc7XHJcbmltcG9ydCB7IERhdGFBcnJheVRleHR1cmUgfSBmcm9tICcuLi90ZXh0dXJlcy9EYXRhQXJyYXlUZXh0dXJlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIGFuIGFycmF5IHJlbmRlciB0YXJnZXQuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBSZW5kZXJUYXJnZXRcclxuICovXHJcbmNsYXNzIFJlbmRlclRhcmdldEFycmF5IGV4dGVuZHMgUmVuZGVyVGFyZ2V0IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyAzRCByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt3aWR0aD0xXSAtIFRoZSB3aWR0aCBvZiB0aGUgcmVuZGVyIHRhcmdldC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2hlaWdodD0xXSAtIFRoZSBoZWlnaHQgb2YgdGhlIHJlbmRlciB0YXJnZXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtkZXB0aD0xXSAtIFRoZSBoZWlnaHQgb2YgdGhlIHJlbmRlciB0YXJnZXQuXHJcblx0ICogQHBhcmFtIHtSZW5kZXJUYXJnZXR+T3B0aW9uc30gW29wdGlvbnNdIC0gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCB3aWR0aCA9IDEsIGhlaWdodCA9IDEsIGRlcHRoID0gMSwgb3B0aW9ucyA9IHt9ICkge1xyXG5cclxuXHRcdHN1cGVyKCB3aWR0aCwgaGVpZ2h0LCBvcHRpb25zICk7XHJcblxyXG5cdFx0dGhpcy5pc1JlbmRlclRhcmdldEFycmF5ID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLmRlcHRoID0gZGVwdGg7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBPdmVyd3JpdHRlbiB3aXRoIGEgZGlmZmVyZW50IHRleHR1cmUgdHlwZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7RGF0YUFycmF5VGV4dHVyZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50ZXh0dXJlID0gbmV3IERhdGFBcnJheVRleHR1cmUoIG51bGwsIHdpZHRoLCBoZWlnaHQsIGRlcHRoICk7XHJcblxyXG5cdFx0dGhpcy50ZXh0dXJlLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFJlbmRlclRhcmdldEFycmF5IH07XHJcbiIsIi8qKlxyXG4gKiBSZXByZXNlbnRzIGEgdW5pZm9ybSB3aGljaCBpcyBhIGdsb2JhbCBzaGFkZXIgdmFyaWFibGUuIFRoZXkgYXJlIHBhc3NlZCB0byBzaGFkZXIgcHJvZ3JhbXMuXHJcbiAqXHJcbiAqIFdoZW4gZGVjbGFyaW5nIGEgdW5pZm9ybSBvZiBhIHtAbGluayBTaGFkZXJNYXRlcmlhbH0sIGl0IGlzIGRlY2xhcmVkIGJ5IHZhbHVlIG9yIGJ5IG9iamVjdC5cclxuICogYGBganNcclxuICogdW5pZm9ybXM6IHtcclxuICogXHR0aW1lOiB7IHZhbHVlOiAxLjAgfSxcclxuICogXHRyZXNvbHV0aW9uOiBuZXcgVW5pZm9ybSggbmV3IFZlY3RvcjIoKSApXHJcbiAqIH07XHJcbiAqIGBgYFxyXG4gKiBTaW5jZSB0aGlzIGNsYXNzIGNhbiBvbmx5IGJlIHVzZWQgaW4gY29udGV4dCBvZiB7QGxpbmsgU2hhZGVyTWF0ZXJpYWx9LCBpdCBpcyBvbmx5IHN1cHBvcnRlZFxyXG4gKiBpbiB7QGxpbmsgV2ViR0xSZW5kZXJlcn0uXHJcbiAqL1xyXG5jbGFzcyBVbmlmb3JtIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB1bmlmb3JtLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHthbnl9IHZhbHVlIC0gVGhlIHVuaWZvcm0gdmFsdWUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHZhbHVlICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHVuaWZvcm0gdmFsdWUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2FueX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52YWx1ZSA9IHZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBuZXcgdW5pZm9ybSB3aXRoIGNvcGllZCB2YWx1ZXMgZnJvbSB0aGlzIGluc3RhbmNlLlxyXG5cdCAqIElmIHRoZSB2YWx1ZSBoYXMgYSBgY2xvbmUoKWAgbWV0aG9kLCB0aGUgdmFsdWUgaXMgY2xvbmVkIGFzIHdlbGwuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtVbmlmb3JtfSBBIGNsb25lIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y2xvbmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBVbmlmb3JtKCB0aGlzLnZhbHVlLmNsb25lID09PSB1bmRlZmluZWQgPyB0aGlzLnZhbHVlIDogdGhpcy52YWx1ZS5jbG9uZSgpICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFVuaWZvcm0gfTtcclxuIiwiaW1wb3J0IHsgRXZlbnREaXNwYXRjaGVyIH0gZnJvbSAnLi9FdmVudERpc3BhdGNoZXIuanMnO1xyXG5pbXBvcnQgeyBTdGF0aWNEcmF3VXNhZ2UgfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xyXG5cclxubGV0IF9pZCA9IDA7XHJcblxyXG4vKipcclxuICogQSBjbGFzcyBmb3IgbWFuYWdpbmcgbXVsdGlwbGUgdW5pZm9ybXMgaW4gYSBzaW5nbGUgZ3JvdXAuIFRoZSByZW5kZXJlciB3aWxsIHByb2Nlc3NcclxuICogc3VjaCBhIGRlZmluaXRpb24gYXMgYSBzaW5nbGUgVUJPLlxyXG4gKlxyXG4gKiBTaW5jZSB0aGlzIGNsYXNzIGNhbiBvbmx5IGJlIHVzZWQgaW4gY29udGV4dCBvZiB7QGxpbmsgU2hhZGVyTWF0ZXJpYWx9LCBpdCBpcyBvbmx5IHN1cHBvcnRlZFxyXG4gKiBpbiB7QGxpbmsgV2ViR0xSZW5kZXJlcn0uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBFdmVudERpc3BhdGNoZXJcclxuICovXHJcbmNsYXNzIFVuaWZvcm1zR3JvdXAgZXh0ZW5kcyBFdmVudERpc3BhdGNoZXIge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHVuaWZvcm1zIGdyb3VwLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzVW5pZm9ybXNHcm91cCA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgSUQgb2YgdGhlIDNEIG9iamVjdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAbmFtZSBVbmlmb3Jtc0dyb3VwI2lkXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKi9cclxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ2lkJywgeyB2YWx1ZTogX2lkICsrIH0gKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBuYW1lIG9mIHRoZSB1bmlmb3JtcyBncm91cC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5hbWUgPSAnJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBidWZmZXIgdXNhZ2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeyhTdGF0aWNEcmF3VXNhZ2V8RHluYW1pY0RyYXdVc2FnZXxTdHJlYW1EcmF3VXNhZ2V8U3RhdGljUmVhZFVzYWdlfER5bmFtaWNSZWFkVXNhZ2V8U3RyZWFtUmVhZFVzYWdlfFN0YXRpY0NvcHlVc2FnZXxEeW5hbWljQ29weVVzYWdlfFN0cmVhbUNvcHlVc2FnZSl9XHJcblx0XHQgKiBAZGVmYXVsdCBTdGF0aWNEcmF3VXNhZ2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51c2FnZSA9IFN0YXRpY0RyYXdVc2FnZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIGFycmF5IGhvbGRpbmcgdGhlIHVuaWZvcm1zLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxVbmlmb3JtPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51bmlmb3JtcyA9IFtdO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgdGhlIGdpdmVuIHVuaWZvcm0gdG8gdGhpcyB1bmlmb3JtcyBncm91cC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VW5pZm9ybX0gdW5pZm9ybSAtIFRoZSB1bmlmb3JtIHRvIGFkZC5cclxuXHQgKiBAcmV0dXJuIHtVbmlmb3Jtc0dyb3VwfSBBIHJlZmVyZW5jZSB0byB0aGlzIHVuaWZvcm1zIGdyb3VwLlxyXG5cdCAqL1xyXG5cdGFkZCggdW5pZm9ybSApIHtcclxuXHJcblx0XHR0aGlzLnVuaWZvcm1zLnB1c2goIHVuaWZvcm0gKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW1vdmVzIHRoZSBnaXZlbiB1bmlmb3JtIGZyb20gdGhpcyB1bmlmb3JtcyBncm91cC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VW5pZm9ybX0gdW5pZm9ybSAtIFRoZSB1bmlmb3JtIHRvIHJlbW92ZS5cclxuXHQgKiBAcmV0dXJuIHtVbmlmb3Jtc0dyb3VwfSBBIHJlZmVyZW5jZSB0byB0aGlzIHVuaWZvcm1zIGdyb3VwLlxyXG5cdCAqL1xyXG5cdHJlbW92ZSggdW5pZm9ybSApIHtcclxuXHJcblx0XHRjb25zdCBpbmRleCA9IHRoaXMudW5pZm9ybXMuaW5kZXhPZiggdW5pZm9ybSApO1xyXG5cclxuXHRcdGlmICggaW5kZXggIT09IC0gMSApIHRoaXMudW5pZm9ybXMuc3BsaWNlKCBpbmRleCwgMSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIG5hbWUgb2YgdGhpcyB1bmlmb3JtcyBncm91cC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge1VuaWZvcm1zR3JvdXB9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdW5pZm9ybXMgZ3JvdXAuXHJcblx0ICovXHJcblx0c2V0TmFtZSggbmFtZSApIHtcclxuXHJcblx0XHR0aGlzLm5hbWUgPSBuYW1lO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHVzYWdlIG9mIHRoaXMgdW5pZm9ybXMgZ3JvdXAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geyhTdGF0aWNEcmF3VXNhZ2V8RHluYW1pY0RyYXdVc2FnZXxTdHJlYW1EcmF3VXNhZ2V8U3RhdGljUmVhZFVzYWdlfER5bmFtaWNSZWFkVXNhZ2V8U3RyZWFtUmVhZFVzYWdlfFN0YXRpY0NvcHlVc2FnZXxEeW5hbWljQ29weVVzYWdlfFN0cmVhbUNvcHlVc2FnZSl9IHZhbHVlIC0gVGhlIHVzYWdlIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtVbmlmb3Jtc0dyb3VwfSBBIHJlZmVyZW5jZSB0byB0aGlzIHVuaWZvcm1zIGdyb3VwLlxyXG5cdCAqL1xyXG5cdHNldFVzYWdlKCB2YWx1ZSApIHtcclxuXHJcblx0XHR0aGlzLnVzYWdlID0gdmFsdWU7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRnJlZXMgdGhlIEdQVS1yZWxhdGVkIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhpcyBpbnN0YW5jZS4gQ2FsbCB0aGlzXHJcblx0ICogbWV0aG9kIHdoZW5ldmVyIHRoaXMgaW5zdGFuY2UgaXMgbm8gbG9uZ2VyIHVzZWQgaW4geW91ciBhcHAuXHJcblx0ICpcclxuXHQgKiBAZmlyZXMgVGV4dHVyZSNkaXNwb3NlXHJcblx0ICovXHJcblx0ZGlzcG9zZSgpIHtcclxuXHJcblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2Rpc3Bvc2UnIH0gKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gdW5pZm9ybXMgZ3JvdXAgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VW5pZm9ybXNHcm91cH0gc291cmNlIC0gVGhlIHVuaWZvcm1zIGdyb3VwIHRvIGNvcHkuXHJcblx0ICogQHJldHVybiB7VW5pZm9ybXNHcm91cH0gQSByZWZlcmVuY2UgdG8gdGhpcyB1bmlmb3JtcyBncm91cC5cclxuXHQgKi9cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0dGhpcy5uYW1lID0gc291cmNlLm5hbWU7XHJcblx0XHR0aGlzLnVzYWdlID0gc291cmNlLnVzYWdlO1xyXG5cclxuXHRcdGNvbnN0IHVuaWZvcm1zU291cmNlID0gc291cmNlLnVuaWZvcm1zO1xyXG5cclxuXHRcdHRoaXMudW5pZm9ybXMubGVuZ3RoID0gMDtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSB1bmlmb3Jtc1NvdXJjZS5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdW5pZm9ybXMgPSBBcnJheS5pc0FycmF5KCB1bmlmb3Jtc1NvdXJjZVsgaSBdICkgPyB1bmlmb3Jtc1NvdXJjZVsgaSBdIDogWyB1bmlmb3Jtc1NvdXJjZVsgaSBdIF07XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaiA9IDA7IGogPCB1bmlmb3Jtcy5sZW5ndGg7IGogKysgKSB7XHJcblxyXG5cdFx0XHRcdHRoaXMudW5pZm9ybXMucHVzaCggdW5pZm9ybXNbIGogXS5jbG9uZSgpICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBuZXcgdW5pZm9ybXMgZ3JvdXAgd2l0aCBjb3BpZWQgdmFsdWVzIGZyb20gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1VuaWZvcm1zR3JvdXB9IEEgY2xvbmUgb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjbG9uZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFVuaWZvcm1zR3JvdXAgfTtcclxuIiwiaW1wb3J0IHsgSW50ZXJsZWF2ZWRCdWZmZXIgfSBmcm9tICcuL0ludGVybGVhdmVkQnVmZmVyLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBbiBpbnN0YW5jZWQgdmVyc2lvbiBvZiBhbiBpbnRlcmxlYXZlZCBidWZmZXIuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBJbnRlcmxlYXZlZEJ1ZmZlclxyXG4gKi9cclxuY2xhc3MgSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIgZXh0ZW5kcyBJbnRlcmxlYXZlZEJ1ZmZlciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2VkIGludGVybGVhdmVkIGJ1ZmZlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VHlwZWRBcnJheX0gYXJyYXkgLSBBIHR5cGVkIGFycmF5IHdpdGggYSBzaGFyZWQgYnVmZmVyIHN0b3JpbmcgYXR0cmlidXRlIGRhdGEuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHN0cmlkZSAtIFRoZSBudW1iZXIgb2YgdHlwZWQtYXJyYXkgZWxlbWVudHMgcGVyIHZlcnRleC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW21lc2hQZXJBdHRyaWJ1dGU9MV0gLSBEZWZpbmVzIGhvdyBvZnRlbiBhIHZhbHVlIG9mIHRoaXMgaW50ZXJsZWF2ZWQgYnVmZmVyIHNob3VsZCBiZSByZXBlYXRlZC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggYXJyYXksIHN0cmlkZSwgbWVzaFBlckF0dHJpYnV0ZSA9IDEgKSB7XHJcblxyXG5cdFx0c3VwZXIoIGFycmF5LCBzdHJpZGUgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlciA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIGhvdyBvZnRlbiBhIHZhbHVlIG9mIHRoaXMgYnVmZmVyIGF0dHJpYnV0ZSBzaG91bGQgYmUgcmVwZWF0ZWQsXHJcblx0XHQgKiBzZWUge0BsaW5rIEluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSNtZXNoUGVyQXR0cmlidXRlfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1lc2hQZXJBdHRyaWJ1dGUgPSBtZXNoUGVyQXR0cmlidXRlO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLm1lc2hQZXJBdHRyaWJ1dGUgPSBzb3VyY2UubWVzaFBlckF0dHJpYnV0ZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHRjbG9uZSggZGF0YSApIHtcclxuXHJcblx0XHRjb25zdCBpYiA9IHN1cGVyLmNsb25lKCBkYXRhICk7XHJcblxyXG5cdFx0aWIubWVzaFBlckF0dHJpYnV0ZSA9IHRoaXMubWVzaFBlckF0dHJpYnV0ZTtcclxuXHJcblx0XHRyZXR1cm4gaWI7XHJcblxyXG5cdH1cclxuXHJcblx0dG9KU09OKCBkYXRhICkge1xyXG5cclxuXHRcdGNvbnN0IGpzb24gPSBzdXBlci50b0pTT04oIGRhdGEgKTtcclxuXHJcblx0XHRqc29uLmlzSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIgPSB0cnVlO1xyXG5cdFx0anNvbi5tZXNoUGVyQXR0cmlidXRlID0gdGhpcy5tZXNoUGVyQXR0cmlidXRlO1xyXG5cclxuXHRcdHJldHVybiBqc29uO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlciB9O1xyXG4iLCIvKipcclxuICogQW4gYWx0ZXJuYXRpdmUgdmVyc2lvbiBvZiBhIGJ1ZmZlciBhdHRyaWJ1dGUgd2l0aCBtb3JlIGNvbnRyb2wgb3ZlciB0aGUgVkJPLlxyXG4gKlxyXG4gKiBUaGUgcmVuZGVyZXIgZG9lcyBub3QgY29uc3RydWN0IGEgVkJPIGZvciB0aGlzIGtpbmQgb2YgYXR0cmlidXRlLiBJbnN0ZWFkLCBpdCB1c2VzXHJcbiAqIHdoYXRldmVyIFZCTyBpcyBwYXNzZWQgaW4gY29uc3RydWN0b3IgYW5kIGNhbiBsYXRlciBiZSBhbHRlcmVkIHZpYSB0aGUgYGJ1ZmZlcmAgcHJvcGVydHkuXHJcbiAqXHJcbiAqIFRoZSBtb3N0IGNvbW1vbiB1c2UgY2FzZSBmb3IgdGhpcyBjbGFzcyBpcyB3aGVuIHNvbWUga2luZCBvZiBHUEdQVSBjYWxjdWxhdGlvbiBpbnRlcmZlcmVzXHJcbiAqIG9yIGV2ZW4gcHJvZHVjZXMgdGhlIFZCT3MgaW4gcXVlc3Rpb24uXHJcbiAqXHJcbiAqIE5vdGljZSB0aGF0IHRoaXMgY2xhc3MgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIHtAbGluayBXZWJHTFJlbmRlcmVyfS5cclxuICovXHJcbmNsYXNzIEdMQnVmZmVyQXR0cmlidXRlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBHTCBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHTEJ1ZmZlcn0gYnVmZmVyIC0gVGhlIG5hdGl2ZSBXZWJHTCBidWZmZXIuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHR5cGUgLSBUaGUgbmF0aXZlIGRhdGEgdHlwZSAoZS5nLiBgZ2wuRkxPQVRgKS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaXRlbVNpemUgLSBUaGUgaXRlbSBzaXplLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBlbGVtZW50U2l6ZSAtIFRoZSBjb3JyZXNwb25kaW5nIHNpemUgKGluIGJ5dGVzKSBmb3IgdGhlIGdpdmVuIGB0eXBlYCBwYXJhbWV0ZXIuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGNvdW50IC0gVGhlIGV4cGVjdGVkIG51bWJlciBvZiB2ZXJ0aWNlcyBpbiBWQk8uXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGJ1ZmZlciwgdHlwZSwgaXRlbVNpemUsIGVsZW1lbnRTaXplLCBjb3VudCApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNHTEJ1ZmZlckF0dHJpYnV0ZSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbmFtZSBvZiB0aGUgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5hbWUgPSAnJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBuYXRpdmUgV2ViR0wgYnVmZmVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtXZWJHTEJ1ZmZlcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5idWZmZXIgPSBidWZmZXI7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbmF0aXZlIGRhdGEgdHlwZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnR5cGUgPSB0eXBlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGl0ZW0gc2l6ZSwgc2VlIHtAbGluayBCdWZmZXJBdHRyaWJ1dGUjaXRlbVNpemV9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXRlbVNpemUgPSBpdGVtU2l6ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjb3JyZXNwb25kaW5nIHNpemUgKGluIGJ5dGVzKSBmb3IgdGhlIGdpdmVuIGB0eXBlYCBwYXJhbWV0ZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5lbGVtZW50U2l6ZSA9IGVsZW1lbnRTaXplO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGV4cGVjdGVkIG51bWJlciBvZiB2ZXJ0aWNlcyBpbiBWQk8uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb3VudCA9IGNvdW50O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSB2ZXJzaW9uIG51bWJlciwgaW5jcmVtZW50ZWQgZXZlcnkgdGltZSB0aGUgYG5lZWRzVXBkYXRlYCBpcyBzZXQgdG8gYHRydWVgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudmVyc2lvbiA9IDA7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRmxhZyB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgYXR0cmlidXRlIGhhcyBjaGFuZ2VkIGFuZCBzaG91bGQgYmUgcmUtc2VudCB0b1xyXG5cdCAqIHRoZSBHUFUuIFNldCB0aGlzIHRvIGB0cnVlYCB3aGVuIHlvdSBtb2RpZnkgdGhlIHZhbHVlIG9mIHRoZSBhcnJheS5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbHVlXHJcblx0ICovXHJcblx0c2V0IG5lZWRzVXBkYXRlKCB2YWx1ZSApIHtcclxuXHJcblx0XHRpZiAoIHZhbHVlID09PSB0cnVlICkgdGhpcy52ZXJzaW9uICsrO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGdpdmVuIG5hdGl2ZSBXZWJHTCBidWZmZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMQnVmZmVyfSBidWZmZXIgLSBUaGUgYnVmZmVyIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtCdWZmZXJBdHRyaWJ1dGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0QnVmZmVyKCBidWZmZXIgKSB7XHJcblxyXG5cdFx0dGhpcy5idWZmZXIgPSBidWZmZXI7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZ2l2ZW4gbmF0aXZlIGRhdGEgdHlwZSBhbmQgZWxlbWVudCBzaXplLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHR5cGUgLSBUaGUgbmF0aXZlIGRhdGEgdHlwZSAoZS5nLiBgZ2wuRkxPQVRgKS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZWxlbWVudFNpemUgLSBUaGUgY29ycmVzcG9uZGluZyBzaXplIChpbiBieXRlcykgZm9yIHRoZSBnaXZlbiBgdHlwZWAgcGFyYW1ldGVyLlxyXG5cdCAqIEByZXR1cm4ge0J1ZmZlckF0dHJpYnV0ZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXRUeXBlKCB0eXBlLCBlbGVtZW50U2l6ZSApIHtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSB0eXBlO1xyXG5cdFx0dGhpcy5lbGVtZW50U2l6ZSA9IGVsZW1lbnRTaXplO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGl0ZW0gc2l6ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpdGVtU2l6ZSAtIFRoZSBpdGVtIHNpemUuXHJcblx0ICogQHJldHVybiB7QnVmZmVyQXR0cmlidXRlfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldEl0ZW1TaXplKCBpdGVtU2l6ZSApIHtcclxuXHJcblx0XHR0aGlzLml0ZW1TaXplID0gaXRlbVNpemU7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgY291bnQgKHRoZSBleHBlY3RlZCBudW1iZXIgb2YgdmVydGljZXMgaW4gVkJPKS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudCAtIFRoZSBjb3VudC5cclxuXHQgKiBAcmV0dXJuIHtCdWZmZXJBdHRyaWJ1dGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0Q291bnQoIGNvdW50ICkge1xyXG5cclxuXHRcdHRoaXMuY291bnQgPSBjb3VudDtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgR0xCdWZmZXJBdHRyaWJ1dGUgfTtcclxuIiwiaW1wb3J0IHsgTWF0cml4NCB9IGZyb20gJy4uL21hdGgvTWF0cml4NC5qcyc7XHJcbmltcG9ydCB7IFJheSB9IGZyb20gJy4uL21hdGgvUmF5LmpzJztcclxuaW1wb3J0IHsgTGF5ZXJzIH0gZnJvbSAnLi9MYXllcnMuanMnO1xyXG5cclxuY29uc3QgX21hdHJpeCA9IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDQoKTtcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGNsYXNzIGlzIGRlc2lnbmVkIHRvIGFzc2lzdCB3aXRoIHJheWNhc3RpbmcuIFJheWNhc3RpbmcgaXMgdXNlZCBmb3JcclxuICogbW91c2UgcGlja2luZyAod29ya2luZyBvdXQgd2hhdCBvYmplY3RzIGluIHRoZSAzZCBzcGFjZSB0aGUgbW91c2UgaXMgb3ZlcilcclxuICogYW1vbmdzdCBvdGhlciB0aGluZ3MuXHJcbiAqL1xyXG5jbGFzcyBSYXljYXN0ZXIge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHJheWNhc3Rlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gb3JpZ2luIC0gVGhlIG9yaWdpbiB2ZWN0b3Igd2hlcmUgdGhlIHJheSBjYXN0cyBmcm9tLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gZGlyZWN0aW9uIC0gVGhlIChub3JtYWxpemVkKSBkaXJlY3Rpb24gdmVjdG9yIHRoYXQgZ2l2ZXMgZGlyZWN0aW9uIHRvIHRoZSByYXkuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuZWFyPTBdIC0gQWxsIHJlc3VsdHMgcmV0dXJuZWQgYXJlIGZ1cnRoZXIgYXdheSB0aGFuIG5lYXIuIE5lYXIgY2FuJ3QgYmUgbmVnYXRpdmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtmYXI9SW5maW5pdHldIC0gQWxsIHJlc3VsdHMgcmV0dXJuZWQgYXJlIGNsb3NlciB0aGFuIGZhci4gRmFyIGNhbid0IGJlIGxvd2VyIHRoYW4gbmVhci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggb3JpZ2luLCBkaXJlY3Rpb24sIG5lYXIgPSAwLCBmYXIgPSBJbmZpbml0eSApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByYXkgdXNlZCBmb3IgcmF5Y2FzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7UmF5fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJheSA9IG5ldyBSYXkoIG9yaWdpbiwgZGlyZWN0aW9uICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbGwgcmVzdWx0cyByZXR1cm5lZCBhcmUgZnVydGhlciBhd2F5IHRoYW4gbmVhci4gTmVhciBjYW4ndCBiZSBuZWdhdGl2ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5lYXIgPSBuZWFyO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQWxsIHJlc3VsdHMgcmV0dXJuZWQgYXJlIGZ1cnRoZXIgYXdheSB0aGFuIG5lYXIuIE5lYXIgY2FuJ3QgYmUgbmVnYXRpdmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IEluZmluaXR5XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZmFyID0gZmFyO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNhbWVyYSB0byB1c2Ugd2hlbiByYXljYXN0aW5nIGFnYWluc3Qgdmlldy1kZXBlbmRlbnQgb2JqZWN0cyBzdWNoIGFzXHJcblx0XHQgKiBiaWxsYm9hcmRlZCBvYmplY3RzIGxpa2Ugc3ByaXRlcy4gVGhpcyBmaWVsZCBjYW4gYmUgc2V0IG1hbnVhbGx5IG9yXHJcblx0XHQgKiBpcyBzZXQgd2hlbiBjYWxsaW5nIGBzZXRGcm9tQ2FtZXJhKClgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Q2FtZXJhfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNhbWVyYSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbGxvd3MgdG8gc2VsZWN0aXZlbHkgaWdub3JlIDNEIG9iamVjdHMgd2hlbiBwZXJmb3JtaW5nIGludGVyc2VjdGlvbiB0ZXN0cy5cclxuXHRcdCAqIFRoZSBmb2xsb3dpbmcgY29kZSBleGFtcGxlIGVuc3VyZXMgdGhhdCBvbmx5IDNEIG9iamVjdHMgb24gbGF5ZXIgYDFgIHdpbGwgYmVcclxuXHRcdCAqIGhvbm9yZWQgYnkgcmF5Y2FzdGVyLlxyXG5cdFx0ICogYGBganNcclxuXHRcdCAqIHJheWNhc3Rlci5sYXllcnMuc2V0KCAxICk7XHJcblx0XHQgKiBvYmplY3QubGF5ZXJzLmVuYWJsZSggMSApO1xyXG5cdFx0ICogYGBgXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0xheWVyc31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5sYXllcnMgPSBuZXcgTGF5ZXJzKCk7XHJcblxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBwYXJhbWV0ZXIgb2JqZWN0IHRoYXQgY29uZmlndXJlcyB0aGUgcmF5Y2FzdGluZy4gSXQgaGFzIHRoZSBzdHJ1Y3R1cmU6XHJcblx0XHQgKlxyXG5cdFx0ICogYGBgXHJcblx0XHQgKiB7XHJcblx0XHQgKiBcdE1lc2g6IHt9LFxyXG5cdFx0ICogXHRMaW5lOiB7IHRocmVzaG9sZDogMSB9LFxyXG5cdFx0ICogXHRMT0Q6IHt9LFxyXG5cdFx0ICogXHRQb2ludHM6IHsgdGhyZXNob2xkOiAxIH0sXHJcblx0XHQgKiBcdFNwcml0ZToge31cclxuXHRcdCAqIH1cclxuXHRcdCAqIGBgYFxyXG5cdFx0ICogV2hlcmUgYHRocmVzaG9sZGAgaXMgdGhlIHByZWNpc2lvbiBvZiB0aGUgcmF5Y2FzdGVyIHdoZW4gaW50ZXJzZWN0aW5nIG9iamVjdHMsIGluIHdvcmxkIHVuaXRzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucGFyYW1zID0ge1xyXG5cdFx0XHRNZXNoOiB7fSxcclxuXHRcdFx0TGluZTogeyB0aHJlc2hvbGQ6IDEgfSxcclxuXHRcdFx0TE9EOiB7fSxcclxuXHRcdFx0UG9pbnRzOiB7IHRocmVzaG9sZDogMSB9LFxyXG5cdFx0XHRTcHJpdGU6IHt9XHJcblx0XHR9O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIHJheSB3aXRoIGEgbmV3IG9yaWdpbiBhbmQgZGlyZWN0aW9uIGJ5IGNvcHlpbmcgdGhlIHZhbHVlcyBmcm9tIHRoZSBhcmd1bWVudHMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IG9yaWdpbiAtIFRoZSBvcmlnaW4gdmVjdG9yIHdoZXJlIHRoZSByYXkgY2FzdHMgZnJvbS5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IGRpcmVjdGlvbiAtIFRoZSAobm9ybWFsaXplZCkgZGlyZWN0aW9uIHZlY3RvciB0aGF0IGdpdmVzIGRpcmVjdGlvbiB0byB0aGUgcmF5LlxyXG5cdCAqL1xyXG5cdHNldCggb3JpZ2luLCBkaXJlY3Rpb24gKSB7XHJcblxyXG5cdFx0Ly8gZGlyZWN0aW9uIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZCAoZm9yIGFjY3VyYXRlIGRpc3RhbmNlIGNhbGN1bGF0aW9ucylcclxuXHJcblx0XHR0aGlzLnJheS5zZXQoIG9yaWdpbiwgZGlyZWN0aW9uICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXNlcyB0aGUgZ2l2ZW4gY29vcmRpbmF0ZXMgYW5kIGNhbWVyYSB0byBjb21wdXRlIGEgbmV3IG9yaWdpbiBhbmQgZGlyZWN0aW9uIGZvciB0aGUgaW50ZXJuYWwgcmF5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSBjb29yZHMgLSAyRCBjb29yZGluYXRlcyBvZiB0aGUgbW91c2UsIGluIG5vcm1hbGl6ZWQgZGV2aWNlIGNvb3JkaW5hdGVzIChOREMpLlxyXG5cdCAqIFggYW5kIFkgY29tcG9uZW50cyBzaG91bGQgYmUgYmV0d2VlbiBgLTFgIGFuZCBgMWAuXHJcblx0ICogQHBhcmFtIHtDYW1lcmF9IGNhbWVyYSAtIFRoZSBjYW1lcmEgZnJvbSB3aGljaCB0aGUgcmF5IHNob3VsZCBvcmlnaW5hdGUuXHJcblx0ICovXHJcblx0c2V0RnJvbUNhbWVyYSggY29vcmRzLCBjYW1lcmEgKSB7XHJcblxyXG5cdFx0aWYgKCBjYW1lcmEuaXNQZXJzcGVjdGl2ZUNhbWVyYSApIHtcclxuXHJcblx0XHRcdHRoaXMucmF5Lm9yaWdpbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGNhbWVyYS5tYXRyaXhXb3JsZCApO1xyXG5cdFx0XHR0aGlzLnJheS5kaXJlY3Rpb24uc2V0KCBjb29yZHMueCwgY29vcmRzLnksIDAuNSApLnVucHJvamVjdCggY2FtZXJhICkuc3ViKCB0aGlzLnJheS5vcmlnaW4gKS5ub3JtYWxpemUoKTtcclxuXHRcdFx0dGhpcy5jYW1lcmEgPSBjYW1lcmE7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggY2FtZXJhLmlzT3J0aG9ncmFwaGljQ2FtZXJhICkge1xyXG5cclxuXHRcdFx0dGhpcy5yYXkub3JpZ2luLnNldCggY29vcmRzLngsIGNvb3Jkcy55LCAoIGNhbWVyYS5uZWFyICsgY2FtZXJhLmZhciApIC8gKCBjYW1lcmEubmVhciAtIGNhbWVyYS5mYXIgKSApLnVucHJvamVjdCggY2FtZXJhICk7IC8vIHNldCBvcmlnaW4gaW4gcGxhbmUgb2YgY2FtZXJhXHJcblx0XHRcdHRoaXMucmF5LmRpcmVjdGlvbi5zZXQoIDAsIDAsIC0gMSApLnRyYW5zZm9ybURpcmVjdGlvbiggY2FtZXJhLm1hdHJpeFdvcmxkICk7XHJcblx0XHRcdHRoaXMuY2FtZXJhID0gY2FtZXJhO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUmF5Y2FzdGVyOiBVbnN1cHBvcnRlZCBjYW1lcmEgdHlwZTogJyArIGNhbWVyYS50eXBlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVzZXMgdGhlIGdpdmVuIFdlYlhSIGNvbnRyb2xsZXIgdG8gY29tcHV0ZSBhIG5ldyBvcmlnaW4gYW5kIGRpcmVjdGlvbiBmb3IgdGhlIGludGVybmFsIHJheS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7V2ViWFJDb250cm9sbGVyfSBjb250cm9sbGVyIC0gVGhlIGNvbnRyb2xsZXIgdG8gY29weSB0aGUgcG9zaXRpb24gYW5kIGRpcmVjdGlvbiBmcm9tLlxyXG5cdCAqIEByZXR1cm4ge1JheWNhc3Rlcn0gQSByZWZlcmVuY2UgdG8gdGhpcyByYXljYXN0ZXIuXHJcblx0ICovXHJcblx0c2V0RnJvbVhSQ29udHJvbGxlciggY29udHJvbGxlciApIHtcclxuXHJcblx0XHRfbWF0cml4LmlkZW50aXR5KCkuZXh0cmFjdFJvdGF0aW9uKCBjb250cm9sbGVyLm1hdHJpeFdvcmxkICk7XHJcblxyXG5cdFx0dGhpcy5yYXkub3JpZ2luLnNldEZyb21NYXRyaXhQb3NpdGlvbiggY29udHJvbGxlci5tYXRyaXhXb3JsZCApO1xyXG5cdFx0dGhpcy5yYXkuZGlyZWN0aW9uLnNldCggMCwgMCwgLSAxICkuYXBwbHlNYXRyaXg0KCBfbWF0cml4ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGludGVyc2VjdGlvbiBwb2ludCBvZiBhIHJheWNhc3RlciBpbnRlcnNlY3Rpb24gdGVzdC5cclxuXHQgKiBAdHlwZWRlZiB7T2JqZWN0fSBSYXljYXN0ZXJ+SW50ZXJzZWN0aW9uXHJcblx0ICogQHByb3BlcnR5IHtudW1iZXJ9IGRpc3RhbmNlIC0gVGhlIGRpc3RhbmNlIGZyb20gdGhlIHJheSdzIG9yaWdpbiB0byB0aGUgaW50ZXJzZWN0aW9uIHBvaW50LlxyXG5cdCAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBkaXN0YW5jZVRvUmF5IC0gIFNvbWUgM0Qgb2JqZWN0cyBlLmcuIHtAbGluayBQb2ludHN9IHByb3ZpZGUgdGhlIGRpc3RhbmNlIG9mIHRoZVxyXG5cdCAqIGludGVyc2VjdGlvbiB0byB0aGUgbmVhcmVzdCBwb2ludCBvbiB0aGUgcmF5LiBGb3Igb3RoZXIgb2JqZWN0cyBpdCB3aWxsIGJlIGB1bmRlZmluZWRgLlxyXG5cdCAqIEBwcm9wZXJ0eSB7VmVjdG9yM30gcG9pbnQgLSBUaGUgaW50ZXJzZWN0aW9uIHBvaW50LCBpbiB3b3JsZCBjb29yZGluYXRlcy5cclxuXHQgKiBAcHJvcGVydHkge09iamVjdH0gZmFjZSAtIFRoZSBmYWNlIHRoYXQgaGFzIGJlZW4gaW50ZXJzZWN0ZWQuXHJcblx0ICogQHByb3BlcnR5IHtudW1iZXJ9IGZhY2VJbmRleCAtIFRoZSBmYWNlIGluZGV4LlxyXG5cdCAqIEBwcm9wZXJ0eSB7T2JqZWN0M0R9IG9iamVjdCAtIFRoZSAzRCBvYmplY3QgdGhhdCBoYXMgYmVlbiBpbnRlcnNlY3RlZC5cclxuXHQgKiBAcHJvcGVydHkge1ZlY3RvcjJ9IHV2IC0gVSxWIGNvb3JkaW5hdGVzIGF0IHBvaW50IG9mIGludGVyc2VjdGlvbi5cclxuXHQgKiBAcHJvcGVydHkge1ZlY3RvcjJ9IHV2MSAtIFNlY29uZCBzZXQgb2YgVSxWIGNvb3JkaW5hdGVzIGF0IHBvaW50IG9mIGludGVyc2VjdGlvbi5cclxuXHQgKiBAcHJvcGVydHkge1ZlY3RvcjN9IHV2MSAtIEludGVycG9sYXRlZCBub3JtYWwgdmVjdG9yIGF0IHBvaW50IG9mIGludGVyc2VjdGlvbi5cclxuXHQgKiBAcHJvcGVydHkge251bWJlcn0gaW5zdGFuY2VJZCAtIFRoZSBpbmRleCBudW1iZXIgb2YgdGhlIGluc3RhbmNlIHdoZXJlIHRoZSByYXlcclxuXHQgKiBpbnRlcnNlY3RzIHRoZSB7QGxpbmsgSW5zdGFuY2VkTWVzaH0uXHJcblx0ICovXHJcblxyXG5cdC8qKlxyXG5cdCAqIENoZWNrcyBhbGwgaW50ZXJzZWN0aW9uIGJldHdlZW4gdGhlIHJheSBhbmQgdGhlIG9iamVjdCB3aXRoIG9yIHdpdGhvdXQgdGhlXHJcblx0ICogZGVzY2VuZGFudHMuIEludGVyc2VjdGlvbnMgYXJlIHJldHVybmVkIHNvcnRlZCBieSBkaXN0YW5jZSwgY2xvc2VzdCBmaXJzdC5cclxuXHQgKlxyXG5cdCAqIGBSYXljYXN0ZXJgIGRlbGVnYXRlcyB0byB0aGUgYHJheWNhc3QoKWAgbWV0aG9kIG9mIHRoZSBwYXNzZWQgM0Qgb2JqZWN0LCB3aGVuXHJcblx0ICogZXZhbHVhdGluZyB3aGV0aGVyIHRoZSByYXkgaW50ZXJzZWN0cyB0aGUgb2JqZWN0IG9yIG5vdC4gVGhpcyBhbGxvd3MgbWVzaGVzIHRvIHJlc3BvbmRcclxuXHQgKiBkaWZmZXJlbnRseSB0byByYXkgY2FzdGluZyB0aGFuIGxpbmVzIG9yIHBvaW50cy5cclxuXHQgKlxyXG5cdCAqIE5vdGUgdGhhdCBmb3IgbWVzaGVzLCBmYWNlcyBtdXN0IGJlIHBvaW50ZWQgdG93YXJkcyB0aGUgb3JpZ2luIG9mIHRoZSByYXkgaW4gb3JkZXJcclxuXHQgKiB0byBiZSBkZXRlY3RlZDsgaW50ZXJzZWN0aW9ucyBvZiB0aGUgcmF5IHBhc3NpbmcgdGhyb3VnaCB0aGUgYmFjayBvZiBhIGZhY2Ugd2lsbCBub3RcclxuXHQgKiBiZSBkZXRlY3RlZC4gVG8gcmF5Y2FzdCBhZ2FpbnN0IGJvdGggZmFjZXMgb2YgYW4gb2JqZWN0LCB5b3UnbGwgd2FudCB0byBzZXQgIHtAbGluayBNYXRlcmlhbCNzaWRlfVxyXG5cdCAqIHRvIGBUSFJFRS5Eb3VibGVTaWRlYC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0M0R9IG9iamVjdCAtIFRoZSAzRCBvYmplY3QgdG8gY2hlY2sgZm9yIGludGVyc2VjdGlvbiB3aXRoIHRoZSByYXkuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbcmVjdXJzaXZlPXRydWVdIC0gSWYgc2V0IHRvIGB0cnVlYCwgaXQgYWxzbyBjaGVja3MgYWxsIGRlc2NlbmRhbnRzLlxyXG5cdCAqIE90aGVyd2lzZSBpdCBvbmx5IGNoZWNrcyBpbnRlcnNlY3Rpb24gd2l0aCB0aGUgb2JqZWN0LlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8UmF5Y2FzdGVyfkludGVyc2VjdGlvbj59IFtpbnRlcnNlY3RzPVtdXSBUaGUgdGFyZ2V0IGFycmF5IHRoYXQgaG9sZHMgdGhlIHJlc3VsdCBvZiB0aGUgbWV0aG9kLlxyXG5cdCAqIEByZXR1cm4ge0FycmF5PFJheWNhc3Rlcn5JbnRlcnNlY3Rpb24+fSBBbiBhcnJheSBob2xkaW5nIHRoZSBpbnRlcnNlY3Rpb24gcG9pbnRzLlxyXG5cdCAqL1xyXG5cdGludGVyc2VjdE9iamVjdCggb2JqZWN0LCByZWN1cnNpdmUgPSB0cnVlLCBpbnRlcnNlY3RzID0gW10gKSB7XHJcblxyXG5cdFx0aW50ZXJzZWN0KCBvYmplY3QsIHRoaXMsIGludGVyc2VjdHMsIHJlY3Vyc2l2ZSApO1xyXG5cclxuXHRcdGludGVyc2VjdHMuc29ydCggYXNjU29ydCApO1xyXG5cclxuXHRcdHJldHVybiBpbnRlcnNlY3RzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENoZWNrcyBhbGwgaW50ZXJzZWN0aW9uIGJldHdlZW4gdGhlIHJheSBhbmQgdGhlIG9iamVjdHMgd2l0aCBvciB3aXRob3V0XHJcblx0ICogdGhlIGRlc2NlbmRhbnRzLiBJbnRlcnNlY3Rpb25zIGFyZSByZXR1cm5lZCBzb3J0ZWQgYnkgZGlzdGFuY2UsIGNsb3Nlc3QgZmlyc3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PE9iamVjdDNEPn0gb2JqZWN0cyAtIFRoZSAzRCBvYmplY3RzIHRvIGNoZWNrIGZvciBpbnRlcnNlY3Rpb24gd2l0aCB0aGUgcmF5LlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JlY3Vyc2l2ZT10cnVlXSAtIElmIHNldCB0byBgdHJ1ZWAsIGl0IGFsc28gY2hlY2tzIGFsbCBkZXNjZW5kYW50cy5cclxuXHQgKiBPdGhlcndpc2UgaXQgb25seSBjaGVja3MgaW50ZXJzZWN0aW9uIHdpdGggdGhlIG9iamVjdC5cclxuXHQgKiBAcGFyYW0ge0FycmF5PFJheWNhc3Rlcn5JbnRlcnNlY3Rpb24+fSBbaW50ZXJzZWN0cz1bXV0gVGhlIHRhcmdldCBhcnJheSB0aGF0IGhvbGRzIHRoZSByZXN1bHQgb2YgdGhlIG1ldGhvZC5cclxuXHQgKiBAcmV0dXJuIHtBcnJheTxSYXljYXN0ZXJ+SW50ZXJzZWN0aW9uPn0gQW4gYXJyYXkgaG9sZGluZyB0aGUgaW50ZXJzZWN0aW9uIHBvaW50cy5cclxuXHQgKi9cclxuXHRpbnRlcnNlY3RPYmplY3RzKCBvYmplY3RzLCByZWN1cnNpdmUgPSB0cnVlLCBpbnRlcnNlY3RzID0gW10gKSB7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gb2JqZWN0cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0aW50ZXJzZWN0KCBvYmplY3RzWyBpIF0sIHRoaXMsIGludGVyc2VjdHMsIHJlY3Vyc2l2ZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpbnRlcnNlY3RzLnNvcnQoIGFzY1NvcnQgKTtcclxuXHJcblx0XHRyZXR1cm4gaW50ZXJzZWN0cztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gYXNjU29ydCggYSwgYiApIHtcclxuXHJcblx0cmV0dXJuIGEuZGlzdGFuY2UgLSBiLmRpc3RhbmNlO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gaW50ZXJzZWN0KCBvYmplY3QsIHJheWNhc3RlciwgaW50ZXJzZWN0cywgcmVjdXJzaXZlICkge1xyXG5cclxuXHRsZXQgcHJvcGFnYXRlID0gdHJ1ZTtcclxuXHJcblx0aWYgKCBvYmplY3QubGF5ZXJzLnRlc3QoIHJheWNhc3Rlci5sYXllcnMgKSApIHtcclxuXHJcblx0XHRjb25zdCByZXN1bHQgPSBvYmplY3QucmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICk7XHJcblxyXG5cdFx0aWYgKCByZXN1bHQgPT09IGZhbHNlICkgcHJvcGFnYXRlID0gZmFsc2U7XHJcblxyXG5cdH1cclxuXHJcblx0aWYgKCBwcm9wYWdhdGUgPT09IHRydWUgJiYgcmVjdXJzaXZlID09PSB0cnVlICkge1xyXG5cclxuXHRcdGNvbnN0IGNoaWxkcmVuID0gb2JqZWN0LmNoaWxkcmVuO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRpbnRlcnNlY3QoIGNoaWxkcmVuWyBpIF0sIHJheWNhc3RlciwgaW50ZXJzZWN0cywgdHJ1ZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgUmF5Y2FzdGVyIH07XHJcbiIsImltcG9ydCB7IGNsYW1wIH0gZnJvbSAnLi9NYXRoVXRpbHMuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgdG8gcmVwcmVzZW50IHBvaW50cyBpbiAzRCBzcGFjZSBhc1xyXG4gKiBbU3BoZXJpY2FsIGNvb3JkaW5hdGVzXXtAbGluayBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TcGhlcmljYWxfY29vcmRpbmF0ZV9zeXN0ZW19LlxyXG4gKi9cclxuY2xhc3MgU3BoZXJpY2FsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBzcGhlcmljYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3JhZGl1cz0xXSAtIFRoZSByYWRpdXMsIG9yIHRoZSBFdWNsaWRlYW4gZGlzdGFuY2UgKHN0cmFpZ2h0LWxpbmUgZGlzdGFuY2UpIGZyb20gdGhlIHBvaW50IHRvIHRoZSBvcmlnaW4uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtwaGk9MF0gLSBUaGUgcG9sYXIgYW5nbGUgaW4gcmFkaWFucyBmcm9tIHRoZSB5ICh1cCkgYXhpcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3RoZXRhPTBdIC0gVGhlIGVxdWF0b3IvYXppbXV0aGFsIGFuZ2xlIGluIHJhZGlhbnMgYXJvdW5kIHRoZSB5ICh1cCkgYXhpcy5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcmFkaXVzID0gMSwgcGhpID0gMCwgdGhldGEgPSAwICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJhZGl1cywgb3IgdGhlIEV1Y2xpZGVhbiBkaXN0YW5jZSAoc3RyYWlnaHQtbGluZSBkaXN0YW5jZSkgZnJvbSB0aGUgcG9pbnQgdG8gdGhlIG9yaWdpbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJhZGl1cyA9IHJhZGl1cztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBwb2xhciBhbmdsZSBpbiByYWRpYW5zIGZyb20gdGhlIHkgKHVwKSBheGlzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucGhpID0gcGhpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGVxdWF0b3IvYXppbXV0aGFsIGFuZ2xlIGluIHJhZGlhbnMgYXJvdW5kIHRoZSB5ICh1cCkgYXhpcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRoZXRhID0gdGhldGE7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgc3BoZXJpY2FsIGNvbXBvbmVudHMgYnkgY29weWluZyB0aGUgZ2l2ZW4gdmFsdWVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHJhZGl1cyAtIFRoZSByYWRpdXMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHBoaSAtIFRoZSBwb2xhciBhbmdsZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdGhldGEgLSBUaGUgYXppbXV0aGFsIGFuZ2xlLlxyXG5cdCAqIEByZXR1cm4ge1NwaGVyaWNhbH0gQSByZWZlcmVuY2UgdG8gdGhpcyBzcGhlcmljYWwuXHJcblx0ICovXHJcblx0c2V0KCByYWRpdXMsIHBoaSwgdGhldGEgKSB7XHJcblxyXG5cdFx0dGhpcy5yYWRpdXMgPSByYWRpdXM7XHJcblx0XHR0aGlzLnBoaSA9IHBoaTtcclxuXHRcdHRoaXMudGhldGEgPSB0aGV0YTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gc3BoZXJpY2FsIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1NwaGVyaWNhbH0gb3RoZXIgLSBUaGUgc3BoZXJpY2FsIHRvIGNvcHkuXHJcblx0ICogQHJldHVybiB7U3BoZXJpY2FsfSBBIHJlZmVyZW5jZSB0byB0aGlzIHNwaGVyaWNhbC5cclxuXHQgKi9cclxuXHRjb3B5KCBvdGhlciApIHtcclxuXHJcblx0XHR0aGlzLnJhZGl1cyA9IG90aGVyLnJhZGl1cztcclxuXHRcdHRoaXMucGhpID0gb3RoZXIucGhpO1xyXG5cdFx0dGhpcy50aGV0YSA9IG90aGVyLnRoZXRhO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlc3RyaWN0cyB0aGUgcG9sYXIgYW5nbGUgW3BhZ2U6LnBoaSBwaGldIHRvIGJlIGJldHdlZW4gYDAuMDAwMDAxYCBhbmQgcGkgLVxyXG5cdCAqIGAwLjAwMDAwMWAuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtTcGhlcmljYWx9IEEgcmVmZXJlbmNlIHRvIHRoaXMgc3BoZXJpY2FsLlxyXG5cdCAqL1xyXG5cdG1ha2VTYWZlKCkge1xyXG5cclxuXHRcdGNvbnN0IEVQUyA9IDAuMDAwMDAxO1xyXG5cdFx0dGhpcy5waGkgPSBjbGFtcCggdGhpcy5waGksIEVQUywgTWF0aC5QSSAtIEVQUyApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHNwaGVyaWNhbCBjb21wb25lbnRzIGZyb20gdGhlIGdpdmVuIHZlY3RvciB3aGljaCBpcyBhc3N1bWVkIHRvIGhvbGRcclxuXHQgKiBDYXJ0ZXNpYW4gY29vcmRpbmF0ZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHYgLSBUaGUgdmVjdG9yIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtTcGhlcmljYWx9IEEgcmVmZXJlbmNlIHRvIHRoaXMgc3BoZXJpY2FsLlxyXG5cdCAqL1xyXG5cdHNldEZyb21WZWN0b3IzKCB2ICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnNldEZyb21DYXJ0ZXNpYW5Db29yZHMoIHYueCwgdi55LCB2LnogKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBzcGhlcmljYWwgY29tcG9uZW50cyBmcm9tIHRoZSBnaXZlbiBDYXJ0ZXNpYW4gY29vcmRpbmF0ZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB4IHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHggdmFsdWUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHogLSBUaGUgeCB2YWx1ZS5cclxuXHQgKiBAcmV0dXJuIHtTcGhlcmljYWx9IEEgcmVmZXJlbmNlIHRvIHRoaXMgc3BoZXJpY2FsLlxyXG5cdCAqL1xyXG5cdHNldEZyb21DYXJ0ZXNpYW5Db29yZHMoIHgsIHksIHogKSB7XHJcblxyXG5cdFx0dGhpcy5yYWRpdXMgPSBNYXRoLnNxcnQoIHggKiB4ICsgeSAqIHkgKyB6ICogeiApO1xyXG5cclxuXHRcdGlmICggdGhpcy5yYWRpdXMgPT09IDAgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnRoZXRhID0gMDtcclxuXHRcdFx0dGhpcy5waGkgPSAwO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR0aGlzLnRoZXRhID0gTWF0aC5hdGFuMiggeCwgeiApO1xyXG5cdFx0XHR0aGlzLnBoaSA9IE1hdGguYWNvcyggY2xhbXAoIHkgLyB0aGlzLnJhZGl1cywgLSAxLCAxICkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIG5ldyBzcGhlcmljYWwgd2l0aCBjb3BpZWQgdmFsdWVzIGZyb20gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1NwaGVyaWNhbH0gQSBjbG9uZSBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNsb25lKCkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgU3BoZXJpY2FsIH07XHJcbiIsIi8qKlxyXG4gKiBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIHRvIHJlcHJlc2VudCBwb2ludHMgaW4gM0Qgc3BhY2UgYXNcclxuICogW0N5bGluZHJpY2FsIGNvb3JkaW5hdGVzXXtAbGluayBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DeWxpbmRyaWNhbF9jb29yZGluYXRlX3N5c3RlbX0uXHJcbiAqL1xyXG5jbGFzcyBDeWxpbmRyaWNhbCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgY3lsaW5kcmljYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3JhZGl1cz0xXSAtIFRoZSBkaXN0YW5jZSBmcm9tIHRoZSBvcmlnaW4gdG8gYSBwb2ludCBpbiB0aGUgeC16IHBsYW5lLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbdGhldGE9MF0gLSBBIGNvdW50ZXJjbG9ja3dpc2UgYW5nbGUgaW4gdGhlIHgteiBwbGFuZSBtZWFzdXJlZCBpbiByYWRpYW5zIGZyb20gdGhlIHBvc2l0aXZlIHotYXhpcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3k9MF0gLSBUaGUgaGVpZ2h0IGFib3ZlIHRoZSB4LXogcGxhbmUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHJhZGl1cyA9IDEsIHRoZXRhID0gMCwgeSA9IDAgKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZGlzdGFuY2UgZnJvbSB0aGUgb3JpZ2luIHRvIGEgcG9pbnQgaW4gdGhlIHgteiBwbGFuZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJhZGl1cyA9IHJhZGl1cztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgY291bnRlcmNsb2Nrd2lzZSBhbmdsZSBpbiB0aGUgeC16IHBsYW5lIG1lYXN1cmVkIGluIHJhZGlhbnMgZnJvbSB0aGUgcG9zaXRpdmUgei1heGlzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudGhldGEgPSB0aGV0YTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBoZWlnaHQgYWJvdmUgdGhlIHgteiBwbGFuZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnkgPSB5O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGN5bGluZHJpY2FsIGNvbXBvbmVudHMgYnkgY29weWluZyB0aGUgZ2l2ZW4gdmFsdWVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHJhZGl1cyAtIFRoZSByYWRpdXMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHRoZXRhIC0gVGhlIHRoZXRhIGFuZ2xlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIGhlaWdodCB2YWx1ZS5cclxuXHQgKiBAcmV0dXJuIHtDeWxpbmRyaWNhbH0gQSByZWZlcmVuY2UgdG8gdGhpcyBjeWxpbmRyaWNhbC5cclxuXHQgKi9cclxuXHRzZXQoIHJhZGl1cywgdGhldGEsIHkgKSB7XHJcblxyXG5cdFx0dGhpcy5yYWRpdXMgPSByYWRpdXM7XHJcblx0XHR0aGlzLnRoZXRhID0gdGhldGE7XHJcblx0XHR0aGlzLnkgPSB5O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvcGllcyB0aGUgdmFsdWVzIG9mIHRoZSBnaXZlbiBjeWxpbmRyaWNhbCB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtDeWxpbmRyaWNhbH0gb3RoZXIgLSBUaGUgY3lsaW5kcmljYWwgdG8gY29weS5cclxuXHQgKiBAcmV0dXJuIHtDeWxpbmRyaWNhbH0gQSByZWZlcmVuY2UgdG8gdGhpcyBjeWxpbmRyaWNhbC5cclxuXHQgKi9cclxuXHRjb3B5KCBvdGhlciApIHtcclxuXHJcblx0XHR0aGlzLnJhZGl1cyA9IG90aGVyLnJhZGl1cztcclxuXHRcdHRoaXMudGhldGEgPSBvdGhlci50aGV0YTtcclxuXHRcdHRoaXMueSA9IG90aGVyLnk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgY3lsaW5kcmljYWwgY29tcG9uZW50cyBmcm9tIHRoZSBnaXZlbiB2ZWN0b3Igd2hpY2ggaXMgYXNzdW1lZCB0byBob2xkXHJcblx0ICogQ2FydGVzaWFuIGNvb3JkaW5hdGVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB2IC0gVGhlIHZlY3RvciB0byBzZXQuXHJcblx0ICogQHJldHVybiB7Q3lsaW5kcmljYWx9IEEgcmVmZXJlbmNlIHRvIHRoaXMgY3lsaW5kcmljYWwuXHJcblx0ICovXHJcblx0c2V0RnJvbVZlY3RvcjMoIHYgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuc2V0RnJvbUNhcnRlc2lhbkNvb3Jkcyggdi54LCB2LnksIHYueiApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGN5bGluZHJpY2FsIGNvbXBvbmVudHMgZnJvbSB0aGUgZ2l2ZW4gQ2FydGVzaWFuIGNvb3JkaW5hdGVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeCB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB4IHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB6IC0gVGhlIHggdmFsdWUuXHJcblx0ICogQHJldHVybiB7Q3lsaW5kcmljYWx9IEEgcmVmZXJlbmNlIHRvIHRoaXMgY3lsaW5kcmljYWwuXHJcblx0ICovXHJcblx0c2V0RnJvbUNhcnRlc2lhbkNvb3JkcyggeCwgeSwgeiApIHtcclxuXHJcblx0XHR0aGlzLnJhZGl1cyA9IE1hdGguc3FydCggeCAqIHggKyB6ICogeiApO1xyXG5cdFx0dGhpcy50aGV0YSA9IE1hdGguYXRhbjIoIHgsIHogKTtcclxuXHRcdHRoaXMueSA9IHk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIG5ldyBjeWxpbmRyaWNhbCB3aXRoIGNvcGllZCB2YWx1ZXMgZnJvbSB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Q3lsaW5kcmljYWx9IEEgY2xvbmUgb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjbG9uZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IEN5bGluZHJpY2FsIH07XHJcbiIsIi8qKlxyXG4gKiBSZXByZXNlbnRzIGEgMngyIG1hdHJpeC5cclxuICpcclxuICogQSBOb3RlIG9uIFJvdy1NYWpvciBhbmQgQ29sdW1uLU1ham9yIE9yZGVyaW5nOlxyXG4gKlxyXG4gKiBUaGUgY29uc3RydWN0b3IgYW5kIHtAbGluayBNYXRyaXgyI3NldH0gbWV0aG9kIHRha2UgYXJndW1lbnRzIGluXHJcbiAqIFtyb3ctbWFqb3Jde0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1Jvdy1fYW5kX2NvbHVtbi1tYWpvcl9vcmRlciNDb2x1bW4tbWFqb3Jfb3JkZXJ9XHJcbiAqIG9yZGVyLCB3aGlsZSBpbnRlcm5hbGx5IHRoZXkgYXJlIHN0b3JlZCBpbiB0aGUge0BsaW5rIE1hdHJpeDIjZWxlbWVudHN9IGFycmF5IGluIGNvbHVtbi1tYWpvciBvcmRlci5cclxuICogVGhpcyBtZWFucyB0aGF0IGNhbGxpbmc6XHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IG0gPSBuZXcgVEhSRUUuTWF0cml4MigpO1xyXG4gKiBtLnNldCggMTEsIDEyLFxyXG4gKiAgICAgICAgMjEsIDIyICk7XHJcbiAqIGBgYFxyXG4gKiB3aWxsIHJlc3VsdCBpbiB0aGUgZWxlbWVudHMgYXJyYXkgY29udGFpbmluZzpcclxuICogYGBganNcclxuICogbS5lbGVtZW50cyA9IFsgMTEsIDIxLFxyXG4gKiAgICAgICAgICAgICAgICAxMiwgMjIgXTtcclxuICogYGBgXHJcbiAqIGFuZCBpbnRlcm5hbGx5IGFsbCBjYWxjdWxhdGlvbnMgYXJlIHBlcmZvcm1lZCB1c2luZyBjb2x1bW4tbWFqb3Igb3JkZXJpbmcuXHJcbiAqIEhvd2V2ZXIsIGFzIHRoZSBhY3R1YWwgb3JkZXJpbmcgbWFrZXMgbm8gZGlmZmVyZW5jZSBtYXRoZW1hdGljYWxseSBhbmRcclxuICogbW9zdCBwZW9wbGUgYXJlIHVzZWQgdG8gdGhpbmtpbmcgYWJvdXQgbWF0cmljZXMgaW4gcm93LW1ham9yIG9yZGVyLCB0aGVcclxuICogdGhyZWUuanMgZG9jdW1lbnRhdGlvbiBzaG93cyBtYXRyaWNlcyBpbiByb3ctbWFqb3Igb3JkZXIuIEp1c3QgYmVhciBpblxyXG4gKiBtaW5kIHRoYXQgaWYgeW91IGFyZSByZWFkaW5nIHRoZSBzb3VyY2UgY29kZSwgeW91J2xsIGhhdmUgdG8gdGFrZSB0aGVcclxuICogdHJhbnNwb3NlIG9mIGFueSBtYXRyaWNlcyBvdXRsaW5lZCBoZXJlIHRvIG1ha2Ugc2Vuc2Ugb2YgdGhlIGNhbGN1bGF0aW9ucy5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBNYXRyaXgyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyAyeDIgbWF0cml4LiBUaGUgYXJndW1lbnRzIGFyZSBzdXBwb3NlZCB0byBiZVxyXG5cdCAqIGluIHJvdy1tYWpvciBvcmRlci4gSWYgbm8gYXJndW1lbnRzIGFyZSBwcm92aWRlZCwgdGhlIGNvbnN0cnVjdG9yXHJcblx0ICogaW5pdGlhbGl6ZXMgdGhlIG1hdHJpeCBhcyBhbiBpZGVudGl0eSBtYXRyaXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW24xMV0gLSAxLTEgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuMTJdIC0gMS0yIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjIxXSAtIDItMSBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW24yMl0gLSAyLTIgbWF0cml4IGVsZW1lbnQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG4xMSwgbjEyLCBuMjEsIG4yMiApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdE1hdHJpeDIucHJvdG90eXBlLmlzTWF0cml4MiA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGNvbHVtbi1tYWpvciBsaXN0IG9mIG1hdHJpeCB2YWx1ZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PG51bWJlcj59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZWxlbWVudHMgPSBbXHJcblx0XHRcdDEsIDAsXHJcblx0XHRcdDAsIDEsXHJcblx0XHRdO1xyXG5cclxuXHRcdGlmICggbjExICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnNldCggbjExLCBuMTIsIG4yMSwgbjIyICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhpcyBtYXRyaXggdG8gdGhlIDJ4MiBpZGVudGl0eSBtYXRyaXguXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtNYXRyaXgyfSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRpZGVudGl0eSgpIHtcclxuXHJcblx0XHR0aGlzLnNldChcclxuXHRcdFx0MSwgMCxcclxuXHRcdFx0MCwgMSxcclxuXHRcdCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZWxlbWVudHMgb2YgdGhlIG1hdHJpeCBmcm9tIHRoZSBnaXZlbiBhcnJheS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gYXJyYXkgLSBUaGUgbWF0cml4IGVsZW1lbnRzIGluIGNvbHVtbi1tYWpvciBvcmRlci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW29mZnNldD0wXSAtIEluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBhcnJheS5cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXgyfSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRmcm9tQXJyYXkoIGFycmF5LCBvZmZzZXQgPSAwICkge1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDQ7IGkgKysgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmVsZW1lbnRzWyBpIF0gPSBhcnJheVsgaSArIG9mZnNldCBdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBlbGVtZW50cyBvZiB0aGUgbWF0cml4LlRoZSBhcmd1bWVudHMgYXJlIHN1cHBvc2VkIHRvIGJlXHJcblx0ICogaW4gcm93LW1ham9yIG9yZGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IG4xMSAtIDEtMSBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbjEyIC0gMS0yIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBuMjEgLSAyLTEgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IG4yMiAtIDItMiBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXgyfSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRzZXQoIG4xMSwgbjEyLCBuMjEsIG4yMiApIHtcclxuXHJcblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XHJcblxyXG5cdFx0dGVbIDAgXSA9IG4xMTsgdGVbIDIgXSA9IG4xMjtcclxuXHRcdHRlWyAxIF0gPSBuMjE7IHRlWyAzIF0gPSBuMjI7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4vVmVjdG9yMi5qcyc7XHJcblxyXG5jb25zdCBfdmVjdG9yID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMigpO1xyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgYW4gYXhpcy1hbGlnbmVkIGJvdW5kaW5nIGJveCAoQUFCQikgaW4gMkQgc3BhY2UuXHJcbiAqL1xyXG5jbGFzcyBCb3gyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBib3VuZGluZyBib3guXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IFttaW49KEluZmluaXR5LEluZmluaXR5KV0gLSBBIHZlY3RvciByZXByZXNlbnRpbmcgdGhlIGxvd2VyIGJvdW5kYXJ5IG9mIHRoZSBib3guXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSBbbWF4PSgtSW5maW5pdHksLUluZmluaXR5KV0gLSBBIHZlY3RvciByZXByZXNlbnRpbmcgdGhlIHVwcGVyIGJvdW5kYXJ5IG9mIHRoZSBib3guXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG1pbiA9IG5ldyBWZWN0b3IyKCArIEluZmluaXR5LCArIEluZmluaXR5ICksIG1heCA9IG5ldyBWZWN0b3IyKCAtIEluZmluaXR5LCAtIEluZmluaXR5ICkgKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzQm94MiA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbG93ZXIgYm91bmRhcnkgb2YgdGhlIGJveC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yMn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5taW4gPSBtaW47XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdXBwZXIgYm91bmRhcnkgb2YgdGhlIGJveC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yMn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tYXggPSBtYXg7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgbG93ZXIgYW5kIHVwcGVyIGJvdW5kYXJpZXMgb2YgdGhpcyBib3guXHJcblx0ICogUGxlYXNlIG5vdGUgdGhhdCB0aGlzIG1ldGhvZCBvbmx5IGNvcGllcyB0aGUgdmFsdWVzIGZyb20gdGhlIGdpdmVuIG9iamVjdHMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IG1pbiAtIFRoZSBsb3dlciBib3VuZGFyeSBvZiB0aGUgYm94LlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gbWF4IC0gVGhlIHVwcGVyIGJvdW5kYXJ5IG9mIHRoZSBib3guXHJcblx0ICogQHJldHVybiB7Qm94Mn0gQSByZWZlcmVuY2UgdG8gdGhpcyBib3VuZGluZyBib3guXHJcblx0ICovXHJcblx0c2V0KCBtaW4sIG1heCApIHtcclxuXHJcblx0XHR0aGlzLm1pbi5jb3B5KCBtaW4gKTtcclxuXHRcdHRoaXMubWF4LmNvcHkoIG1heCApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHVwcGVyIGFuZCBsb3dlciBib3VuZHMgb2YgdGhpcyBib3ggc28gaXQgZW5jbG9zZXMgdGhlIHBvc2l0aW9uIGRhdGFcclxuXHQgKiBpbiB0aGUgZ2l2ZW4gYXJyYXkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PFZlY3RvcjI+fSBwb2ludHMgLSBBbiBhcnJheSBob2xkaW5nIDJEIHBvc2l0aW9uIGRhdGEgYXMgaW5zdGFuY2VzIG9mIHtAbGluayBWZWN0b3IyfS5cclxuXHQgKiBAcmV0dXJuIHtCb3gyfSBBIHJlZmVyZW5jZSB0byB0aGlzIGJvdW5kaW5nIGJveC5cclxuXHQgKi9cclxuXHRzZXRGcm9tUG9pbnRzKCBwb2ludHMgKSB7XHJcblxyXG5cdFx0dGhpcy5tYWtlRW1wdHkoKTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gcG9pbnRzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdFx0dGhpcy5leHBhbmRCeVBvaW50KCBwb2ludHNbIGkgXSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDZW50ZXJzIHRoaXMgYm94IG9uIHRoZSBnaXZlbiBjZW50ZXIgdmVjdG9yIGFuZCBzZXRzIHRoaXMgYm94J3Mgd2lkdGgsIGhlaWdodCBhbmRcclxuXHQgKiBkZXB0aCB0byB0aGUgZ2l2ZW4gc2l6ZSB2YWx1ZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IGNlbnRlciAtIFRoZSBjZW50ZXIgb2YgdGhlIGJveC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IHNpemUgLSBUaGUgeCBhbmQgeSBkaW1lbnNpb25zIG9mIHRoZSBib3guXHJcblx0ICogQHJldHVybiB7Qm94Mn0gQSByZWZlcmVuY2UgdG8gdGhpcyBib3VuZGluZyBib3guXHJcblx0ICovXHJcblx0c2V0RnJvbUNlbnRlckFuZFNpemUoIGNlbnRlciwgc2l6ZSApIHtcclxuXHJcblx0XHRjb25zdCBoYWxmU2l6ZSA9IF92ZWN0b3IuY29weSggc2l6ZSApLm11bHRpcGx5U2NhbGFyKCAwLjUgKTtcclxuXHRcdHRoaXMubWluLmNvcHkoIGNlbnRlciApLnN1YiggaGFsZlNpemUgKTtcclxuXHRcdHRoaXMubWF4LmNvcHkoIGNlbnRlciApLmFkZCggaGFsZlNpemUgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbmV3IGJveCB3aXRoIGNvcGllZCB2YWx1ZXMgZnJvbSB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Qm94Mn0gQSBjbG9uZSBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNsb25lKCkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gYm94IHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0JveDJ9IGJveCAtIFRoZSBib3ggdG8gY29weS5cclxuXHQgKiBAcmV0dXJuIHtCb3gyfSBBIHJlZmVyZW5jZSB0byB0aGlzIGJvdW5kaW5nIGJveC5cclxuXHQgKi9cclxuXHRjb3B5KCBib3ggKSB7XHJcblxyXG5cdFx0dGhpcy5taW4uY29weSggYm94Lm1pbiApO1xyXG5cdFx0dGhpcy5tYXguY29weSggYm94Lm1heCApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE1ha2VzIHRoaXMgYm94IGVtcHR5IHdoaWNoIG1lYW5zIGluIGVuY2xvc2VzIGEgemVybyBzcGFjZSBpbiAyRC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0JveDJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgYm91bmRpbmcgYm94LlxyXG5cdCAqL1xyXG5cdG1ha2VFbXB0eSgpIHtcclxuXHJcblx0XHR0aGlzLm1pbi54ID0gdGhpcy5taW4ueSA9ICsgSW5maW5pdHk7XHJcblx0XHR0aGlzLm1heC54ID0gdGhpcy5tYXgueSA9IC0gSW5maW5pdHk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0cnVlIGlmIHRoaXMgYm94IGluY2x1ZGVzIHplcm8gcG9pbnRzIHdpdGhpbiBpdHMgYm91bmRzLlxyXG5cdCAqIE5vdGUgdGhhdCBhIGJveCB3aXRoIGVxdWFsIGxvd2VyIGFuZCB1cHBlciBib3VuZHMgc3RpbGwgaW5jbHVkZXMgb25lXHJcblx0ICogcG9pbnQsIHRoZSBvbmUgYm90aCBib3VuZHMgc2hhcmUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoaXMgYm94IGlzIGVtcHR5IG9yIG5vdC5cclxuXHQgKi9cclxuXHRpc0VtcHR5KCkge1xyXG5cclxuXHRcdC8vIHRoaXMgaXMgYSBtb3JlIHJvYnVzdCBjaGVjayBmb3IgZW1wdHkgdGhhbiAoIHZvbHVtZSA8PSAwICkgYmVjYXVzZSB2b2x1bWUgY2FuIGdldCBwb3NpdGl2ZSB3aXRoIHR3byBuZWdhdGl2ZSBheGVzXHJcblxyXG5cdFx0cmV0dXJuICggdGhpcy5tYXgueCA8IHRoaXMubWluLnggKSB8fCAoIHRoaXMubWF4LnkgPCB0aGlzLm1pbi55ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgY2VudGVyIHBvaW50IG9mIHRoaXMgYm94LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IHZlY3RvciB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGhvZCdzIHJlc3VsdC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBUaGUgY2VudGVyIHBvaW50LlxyXG5cdCAqL1xyXG5cdGdldENlbnRlciggdGFyZ2V0ICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmlzRW1wdHkoKSA/IHRhcmdldC5zZXQoIDAsIDAgKSA6IHRhcmdldC5hZGRWZWN0b3JzKCB0aGlzLm1pbiwgdGhpcy5tYXggKS5tdWx0aXBseVNjYWxhciggMC41ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgZGltZW5zaW9ucyBvZiB0aGlzIGJveC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gdGFyZ2V0IC0gVGhlIHRhcmdldCB2ZWN0b3IgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBtZXRob2QncyByZXN1bHQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gVGhlIHNpemUuXHJcblx0ICovXHJcblx0Z2V0U2l6ZSggdGFyZ2V0ICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmlzRW1wdHkoKSA/IHRhcmdldC5zZXQoIDAsIDAgKSA6IHRhcmdldC5zdWJWZWN0b3JzKCB0aGlzLm1heCwgdGhpcy5taW4gKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFeHBhbmRzIHRoZSBib3VuZGFyaWVzIG9mIHRoaXMgYm94IHRvIGluY2x1ZGUgdGhlIGdpdmVuIHBvaW50LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSBwb2ludCAtIFRoZSBwb2ludCB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBieSB0aGUgYm91bmRpbmcgYm94LlxyXG5cdCAqIEByZXR1cm4ge0JveDJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgYm91bmRpbmcgYm94LlxyXG5cdCAqL1xyXG5cdGV4cGFuZEJ5UG9pbnQoIHBvaW50ICkge1xyXG5cclxuXHRcdHRoaXMubWluLm1pbiggcG9pbnQgKTtcclxuXHRcdHRoaXMubWF4Lm1heCggcG9pbnQgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFeHBhbmRzIHRoaXMgYm94IGVxdWlsYXRlcmFsbHkgYnkgdGhlIGdpdmVuIHZlY3Rvci4gVGhlIHdpZHRoIG9mIHRoaXNcclxuXHQgKiBib3ggd2lsbCBiZSBleHBhbmRlZCBieSB0aGUgeCBjb21wb25lbnQgb2YgdGhlIHZlY3RvciBpbiBib3RoXHJcblx0ICogZGlyZWN0aW9ucy4gVGhlIGhlaWdodCBvZiB0aGlzIGJveCB3aWxsIGJlIGV4cGFuZGVkIGJ5IHRoZSB5IGNvbXBvbmVudCBvZlxyXG5cdCAqIHRoZSB2ZWN0b3IgaW4gYm90aCBkaXJlY3Rpb25zLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSB2ZWN0b3IgLSBUaGUgdmVjdG9yIHRoYXQgc2hvdWxkIGV4cGFuZCB0aGUgYm91bmRpbmcgYm94LlxyXG5cdCAqIEByZXR1cm4ge0JveDJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgYm91bmRpbmcgYm94LlxyXG5cdCAqL1xyXG5cdGV4cGFuZEJ5VmVjdG9yKCB2ZWN0b3IgKSB7XHJcblxyXG5cdFx0dGhpcy5taW4uc3ViKCB2ZWN0b3IgKTtcclxuXHRcdHRoaXMubWF4LmFkZCggdmVjdG9yICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRXhwYW5kcyBlYWNoIGRpbWVuc2lvbiBvZiB0aGUgYm94IGJ5IHRoZSBnaXZlbiBzY2FsYXIuIElmIG5lZ2F0aXZlLCB0aGVcclxuXHQgKiBkaW1lbnNpb25zIG9mIHRoZSBib3ggd2lsbCBiZSBjb250cmFjdGVkLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHNjYWxhciAtIFRoZSBzY2FsYXIgdmFsdWUgdGhhdCBzaG91bGQgZXhwYW5kIHRoZSBib3VuZGluZyBib3guXHJcblx0ICogQHJldHVybiB7Qm94Mn0gQSByZWZlcmVuY2UgdG8gdGhpcyBib3VuZGluZyBib3guXHJcblx0ICovXHJcblx0ZXhwYW5kQnlTY2FsYXIoIHNjYWxhciApIHtcclxuXHJcblx0XHR0aGlzLm1pbi5hZGRTY2FsYXIoIC0gc2NhbGFyICk7XHJcblx0XHR0aGlzLm1heC5hZGRTY2FsYXIoIHNjYWxhciApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBnaXZlbiBwb2ludCBsaWVzIHdpdGhpbiBvciBvbiB0aGUgYm91bmRhcmllcyBvZiB0aGlzIGJveC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gcG9pbnQgLSBUaGUgcG9pbnQgdG8gdGVzdC5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBib3VuZGluZyBib3ggY29udGFpbnMgdGhlIGdpdmVuIHBvaW50IG9yIG5vdC5cclxuXHQgKi9cclxuXHRjb250YWluc1BvaW50KCBwb2ludCApIHtcclxuXHJcblx0XHRyZXR1cm4gcG9pbnQueCA+PSB0aGlzLm1pbi54ICYmIHBvaW50LnggPD0gdGhpcy5tYXgueCAmJlxyXG5cdFx0XHRwb2ludC55ID49IHRoaXMubWluLnkgJiYgcG9pbnQueSA8PSB0aGlzLm1heC55O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgYm91bmRpbmcgYm94IGluY2x1ZGVzIHRoZSBlbnRpcmV0eSBvZiB0aGUgZ2l2ZW4gYm91bmRpbmcgYm94LlxyXG5cdCAqIElmIHRoaXMgYm94IGFuZCB0aGUgZ2l2ZW4gb25lIGFyZSBpZGVudGljYWwsIHRoaXMgZnVuY3Rpb24gYWxzbyByZXR1cm5zIGB0cnVlYC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Qm94Mn0gYm94IC0gVGhlIGJvdW5kaW5nIGJveCB0byB0ZXN0LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGJvdW5kaW5nIGJveCBjb250YWlucyB0aGUgZ2l2ZW4gYm91bmRpbmcgYm94IG9yIG5vdC5cclxuXHQgKi9cclxuXHRjb250YWluc0JveCggYm94ICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm1pbi54IDw9IGJveC5taW4ueCAmJiBib3gubWF4LnggPD0gdGhpcy5tYXgueCAmJlxyXG5cdFx0XHR0aGlzLm1pbi55IDw9IGJveC5taW4ueSAmJiBib3gubWF4LnkgPD0gdGhpcy5tYXgueTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgcG9pbnQgYXMgYSBwcm9wb3J0aW9uIG9mIHRoaXMgYm94J3Mgd2lkdGggYW5kIGhlaWdodC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gcG9pbnQgLSBBIHBvaW50IGluIDJEIHNwYWNlLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gdGFyZ2V0IC0gVGhlIHRhcmdldCB2ZWN0b3IgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBtZXRob2QncyByZXN1bHQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gQSBwb2ludCBhcyBhIHByb3BvcnRpb24gb2YgdGhpcyBib3gncyB3aWR0aCBhbmQgaGVpZ2h0LlxyXG5cdCAqL1xyXG5cdGdldFBhcmFtZXRlciggcG9pbnQsIHRhcmdldCApIHtcclxuXHJcblx0XHQvLyBUaGlzIGNhbiBwb3RlbnRpYWxseSBoYXZlIGEgZGl2aWRlIGJ5IHplcm8gaWYgdGhlIGJveFxyXG5cdFx0Ly8gaGFzIGEgc2l6ZSBkaW1lbnNpb24gb2YgMC5cclxuXHJcblx0XHRyZXR1cm4gdGFyZ2V0LnNldChcclxuXHRcdFx0KCBwb2ludC54IC0gdGhpcy5taW4ueCApIC8gKCB0aGlzLm1heC54IC0gdGhpcy5taW4ueCApLFxyXG5cdFx0XHQoIHBvaW50LnkgLSB0aGlzLm1pbi55ICkgLyAoIHRoaXMubWF4LnkgLSB0aGlzLm1pbi55IClcclxuXHRcdCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIGJvdW5kaW5nIGJveCBpbnRlcnNlY3RzIHdpdGggdGhpcyBib3VuZGluZyBib3guXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0JveDJ9IGJveCAtIFRoZSBib3VuZGluZyBib3ggdG8gdGVzdC5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBnaXZlbiBib3VuZGluZyBib3ggaW50ZXJzZWN0cyB3aXRoIHRoaXMgYm91bmRpbmcgYm94LlxyXG5cdCAqL1xyXG5cdGludGVyc2VjdHNCb3goIGJveCApIHtcclxuXHJcblx0XHQvLyB1c2luZyA0IHNwbGl0dGluZyBwbGFuZXMgdG8gcnVsZSBvdXQgaW50ZXJzZWN0aW9uc1xyXG5cclxuXHRcdHJldHVybiBib3gubWF4LnggPj0gdGhpcy5taW4ueCAmJiBib3gubWluLnggPD0gdGhpcy5tYXgueCAmJlxyXG5cdFx0XHRib3gubWF4LnkgPj0gdGhpcy5taW4ueSAmJiBib3gubWluLnkgPD0gdGhpcy5tYXgueTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDbGFtcHMgdGhlIGdpdmVuIHBvaW50IHdpdGhpbiB0aGUgYm91bmRzIG9mIHRoaXMgYm94LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSBwb2ludCAtIFRoZSBwb2ludCB0byBjbGFtcC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IHRhcmdldCAtIFRoZSB0YXJnZXQgdmVjdG9yIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbWV0aG9kJ3MgcmVzdWx0LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IFRoZSBjbGFtcGVkIHBvaW50LlxyXG5cdCAqL1xyXG5cdGNsYW1wUG9pbnQoIHBvaW50LCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRhcmdldC5jb3B5KCBwb2ludCApLmNsYW1wKCB0aGlzLm1pbiwgdGhpcy5tYXggKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBldWNsaWRlYW4gZGlzdGFuY2UgZnJvbSBhbnkgZWRnZSBvZiB0aGlzIGJveCB0byB0aGUgc3BlY2lmaWVkIHBvaW50LiBJZlxyXG5cdCAqIHRoZSBnaXZlbiBwb2ludCBsaWVzIGluc2lkZSBvZiB0aGlzIGJveCwgdGhlIGRpc3RhbmNlIHdpbGwgYmUgYDBgLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSBwb2ludCAtIFRoZSBwb2ludCB0byBjb21wdXRlIHRoZSBkaXN0YW5jZSB0by5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBldWNsaWRlYW4gZGlzdGFuY2UuXHJcblx0ICovXHJcblx0ZGlzdGFuY2VUb1BvaW50KCBwb2ludCApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5jbGFtcFBvaW50KCBwb2ludCwgX3ZlY3RvciApLmRpc3RhbmNlVG8oIHBvaW50ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgdGhlIGludGVyc2VjdGlvbiBvZiB0aGlzIGJvdW5kaW5nIGJveCBhbmQgdGhlIGdpdmVuIG9uZSwgc2V0dGluZyB0aGUgdXBwZXJcclxuXHQgKiBib3VuZCBvZiB0aGlzIGJveCB0byB0aGUgbGVzc2VyIG9mIHRoZSB0d28gYm94ZXMnIHVwcGVyIGJvdW5kcyBhbmQgdGhlXHJcblx0ICogbG93ZXIgYm91bmQgb2YgdGhpcyBib3ggdG8gdGhlIGdyZWF0ZXIgb2YgdGhlIHR3byBib3hlcycgbG93ZXIgYm91bmRzLiBJZlxyXG5cdCAqIHRoZXJlJ3Mgbm8gb3ZlcmxhcCwgbWFrZXMgdGhpcyBib3ggZW1wdHkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0JveDJ9IGJveCAtIFRoZSBib3VuZGluZyBib3ggdG8gaW50ZXJzZWN0IHdpdGguXHJcblx0ICogQHJldHVybiB7Qm94Mn0gQSByZWZlcmVuY2UgdG8gdGhpcyBib3VuZGluZyBib3guXHJcblx0ICovXHJcblx0aW50ZXJzZWN0KCBib3ggKSB7XHJcblxyXG5cdFx0dGhpcy5taW4ubWF4KCBib3gubWluICk7XHJcblx0XHR0aGlzLm1heC5taW4oIGJveC5tYXggKTtcclxuXHJcblx0XHRpZiAoIHRoaXMuaXNFbXB0eSgpICkgdGhpcy5tYWtlRW1wdHkoKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB0aGUgdW5pb24gb2YgdGhpcyBib3ggYW5kIGFub3RoZXIgYW5kIHRoZSBnaXZlbiBvbmUsIHNldHRpbmcgdGhlIHVwcGVyXHJcblx0ICogYm91bmQgb2YgdGhpcyBib3ggdG8gdGhlIGdyZWF0ZXIgb2YgdGhlIHR3byBib3hlcycgdXBwZXIgYm91bmRzIGFuZCB0aGVcclxuXHQgKiBsb3dlciBib3VuZCBvZiB0aGlzIGJveCB0byB0aGUgbGVzc2VyIG9mIHRoZSB0d28gYm94ZXMnIGxvd2VyIGJvdW5kcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Qm94Mn0gYm94IC0gVGhlIGJvdW5kaW5nIGJveCB0aGF0IHdpbGwgYmUgdW5pb25lZCB3aXRoIHRoaXMgaW5zdGFuY2UuXHJcblx0ICogQHJldHVybiB7Qm94Mn0gQSByZWZlcmVuY2UgdG8gdGhpcyBib3VuZGluZyBib3guXHJcblx0ICovXHJcblx0dW5pb24oIGJveCApIHtcclxuXHJcblx0XHR0aGlzLm1pbi5taW4oIGJveC5taW4gKTtcclxuXHRcdHRoaXMubWF4Lm1heCggYm94Lm1heCApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgdGhlIGdpdmVuIG9mZnNldCB0byBib3RoIHRoZSB1cHBlciBhbmQgbG93ZXIgYm91bmRzIG9mIHRoaXMgYm91bmRpbmcgYm94LFxyXG5cdCAqIGVmZmVjdGl2ZWx5IG1vdmluZyBpdCBpbiAyRCBzcGFjZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gb2Zmc2V0IC0gVGhlIG9mZnNldCB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIHRyYW5zbGF0ZSB0aGUgYm91bmRpbmcgYm94LlxyXG5cdCAqIEByZXR1cm4ge0JveDJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgYm91bmRpbmcgYm94LlxyXG5cdCAqL1xyXG5cdHRyYW5zbGF0ZSggb2Zmc2V0ICkge1xyXG5cclxuXHRcdHRoaXMubWluLmFkZCggb2Zmc2V0ICk7XHJcblx0XHR0aGlzLm1heC5hZGQoIG9mZnNldCApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgYm91bmRpbmcgYm94IGlzIGVxdWFsIHdpdGggdGhlIGdpdmVuIG9uZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Qm94Mn0gYm94IC0gVGhlIGJveCB0byB0ZXN0IGZvciBlcXVhbGl0eS5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoaXMgYm91bmRpbmcgYm94IGlzIGVxdWFsIHdpdGggdGhlIGdpdmVuIG9uZS5cclxuXHQgKi9cclxuXHRlcXVhbHMoIGJveCApIHtcclxuXHJcblx0XHRyZXR1cm4gYm94Lm1pbi5lcXVhbHMoIHRoaXMubWluICkgJiYgYm94Lm1heC5lcXVhbHMoIHRoaXMubWF4ICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IEJveDIgfTtcclxuIiwiaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4vVmVjdG9yMy5qcyc7XHJcbmltcG9ydCB7IGNsYW1wIH0gZnJvbSAnLi9NYXRoVXRpbHMuanMnO1xyXG5cclxuY29uc3QgX3N0YXJ0UCA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX3N0YXJ0RW5kID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5cclxuLyoqXHJcbiAqIEFuIGFuYWx5dGljYWwgbGluZSBzZWdtZW50IGluIDNEIHNwYWNlIHJlcHJlc2VudGVkIGJ5IGEgc3RhcnQgYW5kIGVuZCBwb2ludC5cclxuICovXHJcbmNsYXNzIExpbmUzIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBsaW5lIHNlZ21lbnQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IFtzdGFydD0oMCwwLDApXSAtIFN0YXJ0IG9mIHRoZSBsaW5lIHNlZ21lbnQuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBbZW5kPSgwLDAsMCldIC0gRW5kIG9mIHRoZSBsaW5lIHNlZ21lbnQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHN0YXJ0ID0gbmV3IFZlY3RvcjMoKSwgZW5kID0gbmV3IFZlY3RvcjMoKSApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFN0YXJ0IG9mIHRoZSBsaW5lIHNlZ21lbnQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjN9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc3RhcnQgPSBzdGFydDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEVuZCBvZiB0aGUgbGluZSBzZWdtZW50LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3IzfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmVuZCA9IGVuZDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBzdGFydCBhbmQgZW5kIHZhbHVlcyBieSBjb3B5aW5nIHRoZSBnaXZlbiB2ZWN0b3JzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBzdGFydCAtIFRoZSBzdGFydCBwb2ludC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IGVuZCAtIFRoZSBlbmQgcG9pbnQuXHJcblx0ICogQHJldHVybiB7TGluZTN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbGluZSBzZWdtZW50LlxyXG5cdCAqL1xyXG5cdHNldCggc3RhcnQsIGVuZCApIHtcclxuXHJcblx0XHR0aGlzLnN0YXJ0LmNvcHkoIHN0YXJ0ICk7XHJcblx0XHR0aGlzLmVuZC5jb3B5KCBlbmQgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gbGluZSBzZWdtZW50IHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0xpbmUzfSBsaW5lIC0gVGhlIGxpbmUgc2VnbWVudCB0byBjb3B5LlxyXG5cdCAqIEByZXR1cm4ge0xpbmUzfSBBIHJlZmVyZW5jZSB0byB0aGlzIGxpbmUgc2VnbWVudC5cclxuXHQgKi9cclxuXHRjb3B5KCBsaW5lICkge1xyXG5cclxuXHRcdHRoaXMuc3RhcnQuY29weSggbGluZS5zdGFydCApO1xyXG5cdFx0dGhpcy5lbmQuY29weSggbGluZS5lbmQgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBjZW50ZXIgb2YgdGhlIGxpbmUgc2VnbWVudC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdGFyZ2V0IC0gVGhlIHRhcmdldCB2ZWN0b3IgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBtZXRob2QncyByZXN1bHQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gVGhlIGNlbnRlciBwb2ludC5cclxuXHQgKi9cclxuXHRnZXRDZW50ZXIoIHRhcmdldCApIHtcclxuXHJcblx0XHRyZXR1cm4gdGFyZ2V0LmFkZFZlY3RvcnMoIHRoaXMuc3RhcnQsIHRoaXMuZW5kICkubXVsdGlwbHlTY2FsYXIoIDAuNSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGRlbHRhIHZlY3RvciBvZiB0aGUgbGluZSBzZWdtZW50J3Mgc3RhcnQgYW5kIGVuZCBwb2ludC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdGFyZ2V0IC0gVGhlIHRhcmdldCB2ZWN0b3IgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBtZXRob2QncyByZXN1bHQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gVGhlIGRlbHRhIHZlY3Rvci5cclxuXHQgKi9cclxuXHRkZWx0YSggdGFyZ2V0ICkge1xyXG5cclxuXHRcdHJldHVybiB0YXJnZXQuc3ViVmVjdG9ycyggdGhpcy5lbmQsIHRoaXMuc3RhcnQgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBzcXVhcmVkIEV1Y2xpZGVhbiBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBsaW5lJyBzdGFydCBhbmQgZW5kIHBvaW50LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgc3F1YXJlZCBFdWNsaWRlYW4gZGlzdGFuY2UuXHJcblx0ICovXHJcblx0ZGlzdGFuY2VTcSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5zdGFydC5kaXN0YW5jZVRvU3F1YXJlZCggdGhpcy5lbmQgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBFdWNsaWRlYW4gZGlzdGFuY2UgYmV0d2VlbiB0aGUgbGluZScgc3RhcnQgYW5kIGVuZCBwb2ludC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIEV1Y2xpZGVhbiBkaXN0YW5jZS5cclxuXHQgKi9cclxuXHRkaXN0YW5jZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5zdGFydC5kaXN0YW5jZVRvKCB0aGlzLmVuZCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSB2ZWN0b3IgYXQgYSBjZXJ0YWluIHBvc2l0aW9uIGFsb25nIHRoZSBsaW5lIHNlZ21lbnQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdCAtIEEgdmFsdWUgYmV0d2VlbiBgWzAsMV1gIHRvIHJlcHJlc2VudCBhIHBvc2l0aW9uIGFsb25nIHRoZSBsaW5lIHNlZ21lbnQuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IHZlY3RvciB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGhvZCdzIHJlc3VsdC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBUaGUgZGVsdGEgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGF0KCB0LCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZGVsdGEoIHRhcmdldCApLm11bHRpcGx5U2NhbGFyKCB0ICkuYWRkKCB0aGlzLnN0YXJ0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIHBvaW50IHBhcmFtZXRlciBiYXNlZCBvbiB0aGUgY2xvc2VzdCBwb2ludCBhcyBwcm9qZWN0ZWQgb24gdGhlIGxpbmUgc2VnbWVudC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gcG9pbnQgLSBUaGUgcG9pbnQgZm9yIHdoaWNoIHRvIHJldHVybiBhIHBvaW50IHBhcmFtZXRlci5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IGNsYW1wVG9MaW5lIC0gV2hldGhlciB0byBjbGFtcCB0aGUgcmVzdWx0IHRvIHRoZSByYW5nZSBgWzAsMV1gIG9yIG5vdC5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBwb2ludCBwYXJhbWV0ZXIuXHJcblx0ICovXHJcblx0Y2xvc2VzdFBvaW50VG9Qb2ludFBhcmFtZXRlciggcG9pbnQsIGNsYW1wVG9MaW5lICkge1xyXG5cclxuXHRcdF9zdGFydFAuc3ViVmVjdG9ycyggcG9pbnQsIHRoaXMuc3RhcnQgKTtcclxuXHRcdF9zdGFydEVuZC5zdWJWZWN0b3JzKCB0aGlzLmVuZCwgdGhpcy5zdGFydCApO1xyXG5cclxuXHRcdGNvbnN0IHN0YXJ0RW5kMiA9IF9zdGFydEVuZC5kb3QoIF9zdGFydEVuZCApO1xyXG5cdFx0Y29uc3Qgc3RhcnRFbmRfc3RhcnRQID0gX3N0YXJ0RW5kLmRvdCggX3N0YXJ0UCApO1xyXG5cclxuXHRcdGxldCB0ID0gc3RhcnRFbmRfc3RhcnRQIC8gc3RhcnRFbmQyO1xyXG5cclxuXHRcdGlmICggY2xhbXBUb0xpbmUgKSB7XHJcblxyXG5cdFx0XHR0ID0gY2xhbXAoIHQsIDAsIDEgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgY2xvc2V0cyBwb2ludCBvbiB0aGUgbGluZSBmb3IgYSBnaXZlbiBwb2ludC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gcG9pbnQgLSBUaGUgcG9pbnQgdG8gY29tcHV0ZSB0aGUgY2xvc2VzdCBwb2ludCBvbiB0aGUgbGluZSBmb3IuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBjbGFtcFRvTGluZSAtIFdoZXRoZXIgdG8gY2xhbXAgdGhlIHJlc3VsdCB0byB0aGUgcmFuZ2UgYFswLDFdYCBvciBub3QuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB0YXJnZXQgLSAgVGhlIHRhcmdldCB2ZWN0b3IgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBtZXRob2QncyByZXN1bHQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gVGhlIGNsb3Nlc3QgcG9pbnQgb24gdGhlIGxpbmUuXHJcblx0ICovXHJcblx0Y2xvc2VzdFBvaW50VG9Qb2ludCggcG9pbnQsIGNsYW1wVG9MaW5lLCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0Y29uc3QgdCA9IHRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludFBhcmFtZXRlciggcG9pbnQsIGNsYW1wVG9MaW5lICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZGVsdGEoIHRhcmdldCApLm11bHRpcGx5U2NhbGFyKCB0ICkuYWRkKCB0aGlzLnN0YXJ0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQXBwbGllcyBhIDR4NCB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggdG8gdGhpcyBsaW5lIHNlZ21lbnQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDR9IG1hdHJpeCAtIFRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguXHJcblx0ICogQHJldHVybiB7TGluZTN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbGluZSBzZWdtZW50LlxyXG5cdCAqL1xyXG5cdGFwcGx5TWF0cml4NCggbWF0cml4ICkge1xyXG5cclxuXHRcdHRoaXMuc3RhcnQuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTtcclxuXHRcdHRoaXMuZW5kLmFwcGx5TWF0cml4NCggbWF0cml4ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBsaW5lIHNlZ21lbnQgaXMgZXF1YWwgd2l0aCB0aGUgZ2l2ZW4gb25lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtMaW5lM30gbGluZSAtIFRoZSBsaW5lIHNlZ21lbnQgdG8gdGVzdCBmb3IgZXF1YWxpdHkuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGlzIGxpbmUgc2VnbWVudCBpcyBlcXVhbCB3aXRoIHRoZSBnaXZlbiBvbmUuXHJcblx0ICovXHJcblx0ZXF1YWxzKCBsaW5lICkge1xyXG5cclxuXHRcdHJldHVybiBsaW5lLnN0YXJ0LmVxdWFscyggdGhpcy5zdGFydCApICYmIGxpbmUuZW5kLmVxdWFscyggdGhpcy5lbmQgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbmV3IGxpbmUgc2VnbWVudCB3aXRoIGNvcGllZCB2YWx1ZXMgZnJvbSB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7TGluZTN9IEEgY2xvbmUgb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjbG9uZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IExpbmUzIH07XHJcbiIsImltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBPYmplY3QzRCB9IGZyb20gJy4uL2NvcmUvT2JqZWN0M0QuanMnO1xyXG5pbXBvcnQgeyBMaW5lU2VnbWVudHMgfSBmcm9tICcuLi9vYmplY3RzL0xpbmVTZWdtZW50cy5qcyc7XHJcbmltcG9ydCB7IExpbmVCYXNpY01hdGVyaWFsIH0gZnJvbSAnLi4vbWF0ZXJpYWxzL0xpbmVCYXNpY01hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyQXR0cmlidXRlLmpzJztcclxuaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcclxuXHJcbmNvbnN0IF92ZWN0b3IgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcblxyXG4vKipcclxuICogVGhpcyBkaXNwbGF5cyBhIGNvbmUgc2hhcGVkIGhlbHBlciBvYmplY3QgZm9yIGEge0BsaW5rIFNwb3RMaWdodH0uXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IHNwb3RMaWdodCA9IG5ldyBUSFJFRS5TcG90TGlnaHQoIDB4ZmZmZmZmICk7XHJcbiAqIHNwb3RMaWdodC5wb3NpdGlvbi5zZXQoIDEwLCAxMCwgMTAgKTtcclxuICogc2NlbmUuYWRkKCBzcG90TGlnaHQgKTtcclxuICpcclxuICogY29uc3Qgc3BvdExpZ2h0SGVscGVyID0gbmV3IFRIUkVFLlNwb3RMaWdodEhlbHBlciggc3BvdExpZ2h0ICk7XHJcbiAqIHNjZW5lLmFkZCggc3BvdExpZ2h0SGVscGVyICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgT2JqZWN0M0RcclxuICovXHJcbmNsYXNzIFNwb3RMaWdodEhlbHBlciBleHRlbmRzIE9iamVjdDNEIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBzcG90IGxpZ2h0IGhlbHBlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7SGVtaXNwaGVyZUxpZ2h0fSBsaWdodCAtIFRoZSBsaWdodCB0byBiZSB2aXN1YWxpemVkLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfENvbG9yfHN0cmluZ30gW2NvbG9yXSAtIFRoZSBoZWxwZXIncyBjb2xvci4gSWYgbm90IHNldCwgdGhlIGhlbHBlciB3aWxsIHRha2VcclxuXHQgKiB0aGUgY29sb3Igb2YgdGhlIGxpZ2h0LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBsaWdodCwgY29sb3IgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBsaWdodCBiZWluZyB2aXN1YWxpemVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtTcG90TGlnaHR9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGlnaHQgPSBsaWdodDtcclxuXHJcblx0XHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjb2xvciBwYXJhbWV0ZXIgcGFzc2VkIGluIHRoZSBjb25zdHJ1Y3Rvci5cclxuXHRcdCAqIElmIG5vdCBzZXQsIHRoZSBoZWxwZXIgd2lsbCB0YWtlIHRoZSBjb2xvciBvZiB0aGUgbGlnaHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcnxDb2xvcnxzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29sb3IgPSBjb2xvcjtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnU3BvdExpZ2h0SGVscGVyJztcclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xyXG5cclxuXHRcdGNvbnN0IHBvc2l0aW9ucyA9IFtcclxuXHRcdFx0MCwgMCwgMCwgXHQwLCAwLCAxLFxyXG5cdFx0XHQwLCAwLCAwLCBcdDEsIDAsIDEsXHJcblx0XHRcdDAsIDAsIDAsXHQtIDEsIDAsIDEsXHJcblx0XHRcdDAsIDAsIDAsIFx0MCwgMSwgMSxcclxuXHRcdFx0MCwgMCwgMCwgXHQwLCAtIDEsIDFcclxuXHRcdF07XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBqID0gMSwgbCA9IDMyOyBpIDwgbDsgaSArKywgaiArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHAxID0gKCBpIC8gbCApICogTWF0aC5QSSAqIDI7XHJcblx0XHRcdGNvbnN0IHAyID0gKCBqIC8gbCApICogTWF0aC5QSSAqIDI7XHJcblxyXG5cdFx0XHRwb3NpdGlvbnMucHVzaChcclxuXHRcdFx0XHRNYXRoLmNvcyggcDEgKSwgTWF0aC5zaW4oIHAxICksIDEsXHJcblx0XHRcdFx0TWF0aC5jb3MoIHAyICksIE1hdGguc2luKCBwMiApLCAxXHJcblx0XHRcdCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGdlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9ucywgMyApICk7XHJcblxyXG5cdFx0Y29uc3QgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgZm9nOiBmYWxzZSwgdG9uZU1hcHBlZDogZmFsc2UgfSApO1xyXG5cclxuXHRcdHRoaXMuY29uZSA9IG5ldyBMaW5lU2VnbWVudHMoIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG5cdFx0dGhpcy5hZGQoIHRoaXMuY29uZSApO1xyXG5cclxuXHRcdHRoaXMudXBkYXRlKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRnJlZXMgdGhlIEdQVS1yZWxhdGVkIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhpcyBpbnN0YW5jZS4gQ2FsbCB0aGlzXHJcblx0ICogbWV0aG9kIHdoZW5ldmVyIHRoaXMgaW5zdGFuY2UgaXMgbm8gbG9uZ2VyIHVzZWQgaW4geW91ciBhcHAuXHJcblx0ICovXHJcblx0ZGlzcG9zZSgpIHtcclxuXHJcblx0XHR0aGlzLmNvbmUuZ2VvbWV0cnkuZGlzcG9zZSgpO1xyXG5cdFx0dGhpcy5jb25lLm1hdGVyaWFsLmRpc3Bvc2UoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoZSBoZWxwZXIgdG8gbWF0Y2ggdGhlIHBvc2l0aW9uIGFuZCBkaXJlY3Rpb24gb2YgdGhlXHJcblx0ICogbGlnaHQgYmVpbmcgdmlzdWFsaXplZC5cclxuXHQgKi9cclxuXHR1cGRhdGUoKSB7XHJcblxyXG5cdFx0dGhpcy5saWdodC51cGRhdGVXb3JsZE1hdHJpeCggdHJ1ZSwgZmFsc2UgKTtcclxuXHRcdHRoaXMubGlnaHQudGFyZ2V0LnVwZGF0ZVdvcmxkTWF0cml4KCB0cnVlLCBmYWxzZSApO1xyXG5cclxuXHRcdC8vIHVwZGF0ZSB0aGUgbG9jYWwgbWF0cml4IGJhc2VkIG9uIHRoZSBwYXJlbnQgYW5kIGxpZ2h0IHRhcmdldCB0cmFuc2Zvcm1zXHJcblx0XHRpZiAoIHRoaXMucGFyZW50ICkge1xyXG5cclxuXHRcdFx0dGhpcy5wYXJlbnQudXBkYXRlV29ybGRNYXRyaXgoIHRydWUgKTtcclxuXHJcblx0XHRcdHRoaXMubWF0cml4XHJcblx0XHRcdFx0LmNvcHkoIHRoaXMucGFyZW50Lm1hdHJpeFdvcmxkIClcclxuXHRcdFx0XHQuaW52ZXJ0KClcclxuXHRcdFx0XHQubXVsdGlwbHkoIHRoaXMubGlnaHQubWF0cml4V29ybGQgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGhpcy5tYXRyaXguY29weSggdGhpcy5saWdodC5tYXRyaXhXb3JsZCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLm1hdHJpeFdvcmxkLmNvcHkoIHRoaXMubGlnaHQubWF0cml4V29ybGQgKTtcclxuXHJcblx0XHRjb25zdCBjb25lTGVuZ3RoID0gdGhpcy5saWdodC5kaXN0YW5jZSA/IHRoaXMubGlnaHQuZGlzdGFuY2UgOiAxMDAwO1xyXG5cdFx0Y29uc3QgY29uZVdpZHRoID0gY29uZUxlbmd0aCAqIE1hdGgudGFuKCB0aGlzLmxpZ2h0LmFuZ2xlICk7XHJcblxyXG5cdFx0dGhpcy5jb25lLnNjYWxlLnNldCggY29uZVdpZHRoLCBjb25lV2lkdGgsIGNvbmVMZW5ndGggKTtcclxuXHJcblx0XHRfdmVjdG9yLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5saWdodC50YXJnZXQubWF0cml4V29ybGQgKTtcclxuXHJcblx0XHR0aGlzLmNvbmUubG9va0F0KCBfdmVjdG9yICk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmNvbG9yICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmNvbmUubWF0ZXJpYWwuY29sb3Iuc2V0KCB0aGlzLmNvbG9yICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHRoaXMuY29uZS5tYXRlcmlhbC5jb2xvci5jb3B5KCB0aGlzLmxpZ2h0LmNvbG9yICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgU3BvdExpZ2h0SGVscGVyIH07XHJcbiIsImltcG9ydCB7IExpbmVTZWdtZW50cyB9IGZyb20gJy4uL29iamVjdHMvTGluZVNlZ21lbnRzLmpzJztcclxuaW1wb3J0IHsgTWF0cml4NCB9IGZyb20gJy4uL21hdGgvTWF0cml4NC5qcyc7XHJcbmltcG9ydCB7IExpbmVCYXNpY01hdGVyaWFsIH0gZnJvbSAnLi4vbWF0ZXJpYWxzL0xpbmVCYXNpY01hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi9tYXRoL0NvbG9yLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcbmltcG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9CdWZmZXJHZW9tZXRyeS5qcyc7XHJcbmltcG9ydCB7IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcblxyXG5jb25zdCBfdmVjdG9yID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfYm9uZU1hdHJpeCA9IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDQoKTtcclxuY29uc3QgX21hdHJpeFdvcmxkSW52ID0gLypAX19QVVJFX18qLyBuZXcgTWF0cml4NCgpO1xyXG5cclxuLyoqXHJcbiAqIEEgaGVscGVyIG9iamVjdCB0byBhc3Npc3Qgd2l0aCB2aXN1YWxpemluZyBhIHtAbGluayBTa2VsZXRvbn0uXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGhlbHBlciA9IG5ldyBUSFJFRS5Ta2VsZXRvbkhlbHBlciggc2tpbm5lZE1lc2ggKTtcclxuICogc2NlbmUuYWRkKCBoZWxwZXIgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBMaW5lU2VnbWVudHNcclxuICovXHJcbmNsYXNzIFNrZWxldG9uSGVscGVyIGV4dGVuZHMgTGluZVNlZ21lbnRzIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBoZW1pc3BoZXJlIGxpZ2h0IGhlbHBlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0M0R9IG9iamVjdCAtICBVc3VhbGx5IGFuIGluc3RhbmNlIG9mIHtAbGluayBTa2lubmVkTWVzaH0uIEhvd2V2ZXIsIGFueSAzRCBvYmplY3RcclxuXHQgKiBjYW4gYmUgdXNlZCBpZiBpdCByZXByZXNlbnRzIGEgaGllcmFyY2h5IG9mIGJvbmVzIChzZWUge0BsaW5rIEJvbmV9KS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggb2JqZWN0ICkge1xyXG5cclxuXHRcdGNvbnN0IGJvbmVzID0gZ2V0Qm9uZUxpc3QoIG9iamVjdCApO1xyXG5cclxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XHJcblxyXG5cdFx0Y29uc3QgdmVydGljZXMgPSBbXTtcclxuXHRcdGNvbnN0IGNvbG9ycyA9IFtdO1xyXG5cclxuXHRcdGNvbnN0IGNvbG9yMSA9IG5ldyBDb2xvciggMCwgMCwgMSApO1xyXG5cdFx0Y29uc3QgY29sb3IyID0gbmV3IENvbG9yKCAwLCAxLCAwICk7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgYm9uZXMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYm9uZSA9IGJvbmVzWyBpIF07XHJcblxyXG5cdFx0XHRpZiAoIGJvbmUucGFyZW50ICYmIGJvbmUucGFyZW50LmlzQm9uZSApIHtcclxuXHJcblx0XHRcdFx0dmVydGljZXMucHVzaCggMCwgMCwgMCApO1xyXG5cdFx0XHRcdHZlcnRpY2VzLnB1c2goIDAsIDAsIDAgKTtcclxuXHRcdFx0XHRjb2xvcnMucHVzaCggY29sb3IxLnIsIGNvbG9yMS5nLCBjb2xvcjEuYiApO1xyXG5cdFx0XHRcdGNvbG9ycy5wdXNoKCBjb2xvcjIuciwgY29sb3IyLmcsIGNvbG9yMi5iICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGdlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcclxuXHRcdGdlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGNvbG9ycywgMyApICk7XHJcblxyXG5cdFx0Y29uc3QgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgdmVydGV4Q29sb3JzOiB0cnVlLCBkZXB0aFRlc3Q6IGZhbHNlLCBkZXB0aFdyaXRlOiBmYWxzZSwgdG9uZU1hcHBlZDogZmFsc2UsIHRyYW5zcGFyZW50OiB0cnVlIH0gKTtcclxuXHJcblx0XHRzdXBlciggZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzU2tlbGV0b25IZWxwZXIgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdTa2VsZXRvbkhlbHBlcic7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgb2JqZWN0IGJlaW5nIHZpc3VhbGl6ZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdDNEfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJvb3QgPSBvYmplY3Q7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBoZSBsaXN0IG9mIGJvbmVzIHRoYXQgdGhlIGhlbHBlciB2aXN1YWxpemVzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxCb25lPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ib25lcyA9IGJvbmVzO1xyXG5cclxuXHRcdHRoaXMubWF0cml4ID0gb2JqZWN0Lm1hdHJpeFdvcmxkO1xyXG5cdFx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XHJcblxyXG5cdH1cclxuXHJcblx0dXBkYXRlTWF0cml4V29ybGQoIGZvcmNlICkge1xyXG5cclxuXHRcdGNvbnN0IGJvbmVzID0gdGhpcy5ib25lcztcclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XHJcblx0XHRjb25zdCBwb3NpdGlvbiA9IGdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJyApO1xyXG5cclxuXHRcdF9tYXRyaXhXb3JsZEludi5jb3B5KCB0aGlzLnJvb3QubWF0cml4V29ybGQgKS5pbnZlcnQoKTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGogPSAwOyBpIDwgYm9uZXMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYm9uZSA9IGJvbmVzWyBpIF07XHJcblxyXG5cdFx0XHRpZiAoIGJvbmUucGFyZW50ICYmIGJvbmUucGFyZW50LmlzQm9uZSApIHtcclxuXHJcblx0XHRcdFx0X2JvbmVNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggX21hdHJpeFdvcmxkSW52LCBib25lLm1hdHJpeFdvcmxkICk7XHJcblx0XHRcdFx0X3ZlY3Rvci5zZXRGcm9tTWF0cml4UG9zaXRpb24oIF9ib25lTWF0cml4ICk7XHJcblx0XHRcdFx0cG9zaXRpb24uc2V0WFlaKCBqLCBfdmVjdG9yLngsIF92ZWN0b3IueSwgX3ZlY3Rvci56ICk7XHJcblxyXG5cdFx0XHRcdF9ib25lTWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIF9tYXRyaXhXb3JsZEludiwgYm9uZS5wYXJlbnQubWF0cml4V29ybGQgKTtcclxuXHRcdFx0XHRfdmVjdG9yLnNldEZyb21NYXRyaXhQb3NpdGlvbiggX2JvbmVNYXRyaXggKTtcclxuXHRcdFx0XHRwb3NpdGlvbi5zZXRYWVooIGogKyAxLCBfdmVjdG9yLngsIF92ZWN0b3IueSwgX3ZlY3Rvci56ICk7XHJcblxyXG5cdFx0XHRcdGogKz0gMjtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Z2VvbWV0cnkuZ2V0QXR0cmlidXRlKCAncG9zaXRpb24nICkubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdHN1cGVyLnVwZGF0ZU1hdHJpeFdvcmxkKCBmb3JjZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZyZWVzIHRoZSBHUFUtcmVsYXRlZCByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHRoaXMgaW5zdGFuY2UuIENhbGwgdGhpc1xyXG5cdCAqIG1ldGhvZCB3aGVuZXZlciB0aGlzIGluc3RhbmNlIGlzIG5vIGxvbmdlciB1c2VkIGluIHlvdXIgYXBwLlxyXG5cdCAqL1xyXG5cdGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0dGhpcy5nZW9tZXRyeS5kaXNwb3NlKCk7XHJcblx0XHR0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbmZ1bmN0aW9uIGdldEJvbmVMaXN0KCBvYmplY3QgKSB7XHJcblxyXG5cdGNvbnN0IGJvbmVMaXN0ID0gW107XHJcblxyXG5cdGlmICggb2JqZWN0LmlzQm9uZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRib25lTGlzdC5wdXNoKCBvYmplY3QgKTtcclxuXHJcblx0fVxyXG5cclxuXHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBvYmplY3QuY2hpbGRyZW4ubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdGJvbmVMaXN0LnB1c2goIC4uLmdldEJvbmVMaXN0KCBvYmplY3QuY2hpbGRyZW5bIGkgXSApICk7XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIGJvbmVMaXN0O1xyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCB7IFNrZWxldG9uSGVscGVyIH07XHJcbiIsImltcG9ydCB7IE1lc2ggfSBmcm9tICcuLi9vYmplY3RzL01lc2guanMnO1xyXG5pbXBvcnQgeyBNZXNoQmFzaWNNYXRlcmlhbCB9IGZyb20gJy4uL21hdGVyaWFscy9NZXNoQmFzaWNNYXRlcmlhbC5qcyc7XHJcbmltcG9ydCB7IFNwaGVyZUdlb21ldHJ5IH0gZnJvbSAnLi4vZ2VvbWV0cmllcy9TcGhlcmVHZW9tZXRyeS5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBkaXNwbGF5cyBhIGhlbHBlciBvYmplY3QgY29uc2lzdGluZyBvZiBhIHNwaGVyaWNhbCBtZXNoIGZvclxyXG4gKiB2aXN1YWxpemluZyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgUG9pbnRMaWdodH0uXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IHBvaW50TGlnaHQgPSBuZXcgVEhSRUUuUG9pbnRMaWdodCggMHhmZjAwMDAsIDEsIDEwMCApO1xyXG4gKiBwb2ludExpZ2h0LnBvc2l0aW9uLnNldCggMTAsIDEwLCAxMCApO1xyXG4gKiBzY2VuZS5hZGQoIHBvaW50TGlnaHQgKTtcclxuICpcclxuICogY29uc3Qgc3BoZXJlU2l6ZSA9IDE7XHJcbiAqIGNvbnN0IHBvaW50TGlnaHRIZWxwZXIgPSBuZXcgVEhSRUUuUG9pbnRMaWdodEhlbHBlciggcG9pbnRMaWdodCwgc3BoZXJlU2l6ZSApO1xyXG4gKiBzY2VuZS5hZGQoIHBvaW50TGlnaHRIZWxwZXIgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBNZXNoXHJcbiAqL1xyXG5jbGFzcyBQb2ludExpZ2h0SGVscGVyIGV4dGVuZHMgTWVzaCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcG9pbnQgbGlnaHQgaGVscGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtQb2ludExpZ2h0fSBsaWdodCAtIFRoZSBsaWdodCB0byBiZSB2aXN1YWxpemVkLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbc3BoZXJlU2l6ZT0xXSAtIFRoZSBzaXplIG9mIHRoZSBzcGhlcmUgaGVscGVyLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfENvbG9yfHN0cmluZ30gW2NvbG9yXSAtIFRoZSBoZWxwZXIncyBjb2xvci4gSWYgbm90IHNldCwgdGhlIGhlbHBlciB3aWxsIHRha2VcclxuXHQgKiB0aGUgY29sb3Igb2YgdGhlIGxpZ2h0LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBsaWdodCwgc3BoZXJlU2l6ZSwgY29sb3IgKSB7XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSBuZXcgU3BoZXJlR2VvbWV0cnkoIHNwaGVyZVNpemUsIDQsIDIgKTtcclxuXHRcdGNvbnN0IG1hdGVyaWFsID0gbmV3IE1lc2hCYXNpY01hdGVyaWFsKCB7IHdpcmVmcmFtZTogdHJ1ZSwgZm9nOiBmYWxzZSwgdG9uZU1hcHBlZDogZmFsc2UgfSApO1xyXG5cclxuXHRcdHN1cGVyKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBsaWdodCBiZWluZyB2aXN1YWxpemVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtIZW1pc3BoZXJlTGlnaHR9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGlnaHQgPSBsaWdodDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjb2xvciBwYXJhbWV0ZXIgcGFzc2VkIGluIHRoZSBjb25zdHJ1Y3Rvci5cclxuXHRcdCAqIElmIG5vdCBzZXQsIHRoZSBoZWxwZXIgd2lsbCB0YWtlIHRoZSBjb2xvciBvZiB0aGUgbGlnaHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcnxDb2xvcnxzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29sb3IgPSBjb2xvcjtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnUG9pbnRMaWdodEhlbHBlcic7XHJcblxyXG5cdFx0dGhpcy5tYXRyaXggPSB0aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkO1xyXG5cdFx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XHJcblxyXG5cdFx0dGhpcy51cGRhdGUoKTtcclxuXHJcblxyXG5cdFx0LypcclxuXHQvLyBUT0RPOiBkZWxldGUgdGhpcyBjb21tZW50P1xyXG5cdGNvbnN0IGRpc3RhbmNlR2VvbWV0cnkgPSBuZXcgVEhSRUUuSWNvc2FoZWRyb25HZW9tZXRyeSggMSwgMiApO1xyXG5cdGNvbnN0IGRpc3RhbmNlTWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGhleENvbG9yLCBmb2c6IGZhbHNlLCB3aXJlZnJhbWU6IHRydWUsIG9wYWNpdHk6IDAuMSwgdHJhbnNwYXJlbnQ6IHRydWUgfSApO1xyXG5cclxuXHR0aGlzLmxpZ2h0U3BoZXJlID0gbmV3IFRIUkVFLk1lc2goIGJ1bGJHZW9tZXRyeSwgYnVsYk1hdGVyaWFsICk7XHJcblx0dGhpcy5saWdodERpc3RhbmNlID0gbmV3IFRIUkVFLk1lc2goIGRpc3RhbmNlR2VvbWV0cnksIGRpc3RhbmNlTWF0ZXJpYWwgKTtcclxuXHJcblx0Y29uc3QgZCA9IGxpZ2h0LmRpc3RhbmNlO1xyXG5cclxuXHRpZiAoIGQgPT09IDAuMCApIHtcclxuXHJcblx0XHR0aGlzLmxpZ2h0RGlzdGFuY2UudmlzaWJsZSA9IGZhbHNlO1xyXG5cclxuXHR9IGVsc2Uge1xyXG5cclxuXHRcdHRoaXMubGlnaHREaXN0YW5jZS5zY2FsZS5zZXQoIGQsIGQsIGQgKTtcclxuXHJcblx0fVxyXG5cclxuXHR0aGlzLmFkZCggdGhpcy5saWdodERpc3RhbmNlICk7XHJcblx0Ki9cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGcmVlcyB0aGUgR1BVLXJlbGF0ZWQgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGlzIGluc3RhbmNlLiBDYWxsIHRoaXNcclxuXHQgKiBtZXRob2Qgd2hlbmV2ZXIgdGhpcyBpbnN0YW5jZSBpcyBubyBsb25nZXIgdXNlZCBpbiB5b3VyIGFwcC5cclxuXHQgKi9cclxuXHRkaXNwb3NlKCkge1xyXG5cclxuXHRcdHRoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpO1xyXG5cdFx0dGhpcy5tYXRlcmlhbC5kaXNwb3NlKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgaGVscGVyIHRvIG1hdGNoIHRoZSBwb3NpdGlvbiBvZiB0aGVcclxuXHQgKiBsaWdodCBiZWluZyB2aXN1YWxpemVkLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZSgpIHtcclxuXHJcblx0XHR0aGlzLmxpZ2h0LnVwZGF0ZVdvcmxkTWF0cml4KCB0cnVlLCBmYWxzZSApO1xyXG5cclxuXHRcdGlmICggdGhpcy5jb2xvciAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0dGhpcy5tYXRlcmlhbC5jb2xvci5zZXQoIHRoaXMuY29sb3IgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGhpcy5tYXRlcmlhbC5jb2xvci5jb3B5KCB0aGlzLmxpZ2h0LmNvbG9yICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8qXHJcblx0XHRjb25zdCBkID0gdGhpcy5saWdodC5kaXN0YW5jZTtcclxuXHJcblx0XHRpZiAoIGQgPT09IDAuMCApIHtcclxuXHJcblx0XHRcdHRoaXMubGlnaHREaXN0YW5jZS52aXNpYmxlID0gZmFsc2U7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHRoaXMubGlnaHREaXN0YW5jZS52aXNpYmxlID0gdHJ1ZTtcclxuXHRcdFx0dGhpcy5saWdodERpc3RhbmNlLnNjYWxlLnNldCggZCwgZCwgZCApO1xyXG5cclxuXHRcdH1cclxuXHRcdCovXHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBQb2ludExpZ2h0SGVscGVyIH07XHJcbiIsImltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uL21hdGgvQ29sb3IuanMnO1xyXG5pbXBvcnQgeyBPYmplY3QzRCB9IGZyb20gJy4uL2NvcmUvT2JqZWN0M0QuanMnO1xyXG5pbXBvcnQgeyBNZXNoIH0gZnJvbSAnLi4vb2JqZWN0cy9NZXNoLmpzJztcclxuaW1wb3J0IHsgTWVzaEJhc2ljTWF0ZXJpYWwgfSBmcm9tICcuLi9tYXRlcmlhbHMvTWVzaEJhc2ljTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyBPY3RhaGVkcm9uR2VvbWV0cnkgfSBmcm9tICcuLi9nZW9tZXRyaWVzL09jdGFoZWRyb25HZW9tZXRyeS5qcyc7XHJcbmltcG9ydCB7IEJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyQXR0cmlidXRlLmpzJztcclxuXHJcbmNvbnN0IF92ZWN0b3IgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF9jb2xvcjEgPSAvKkBfX1BVUkVfXyovIG5ldyBDb2xvcigpO1xyXG5jb25zdCBfY29sb3IyID0gLypAX19QVVJFX18qLyBuZXcgQ29sb3IoKTtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgdmlzdWFsIGFpZCBjb25zaXN0aW5nIG9mIGEgc3BoZXJpY2FsIG1lc2ggZm9yIGFcclxuICogZ2l2ZW4ge0BsaW5rIEhlbWlzcGhlcmVMaWdodH0uXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGxpZ2h0ID0gbmV3IFRIUkVFLkhlbWlzcGhlcmVMaWdodCggMHhmZmZmYmIsIDB4MDgwODIwLCAxICk7XHJcbiAqIGNvbnN0IGhlbHBlciA9IG5ldyBUSFJFRS5IZW1pc3BoZXJlTGlnaHRIZWxwZXIoIGxpZ2h0LCA1ICk7XHJcbiAqIHNjZW5lLmFkZCggaGVscGVyICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgT2JqZWN0M0RcclxuICovXHJcbmNsYXNzIEhlbWlzcGhlcmVMaWdodEhlbHBlciBleHRlbmRzIE9iamVjdDNEIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBoZW1pc3BoZXJlIGxpZ2h0IGhlbHBlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7SGVtaXNwaGVyZUxpZ2h0fSBsaWdodCAtIFRoZSBsaWdodCB0byBiZSB2aXN1YWxpemVkLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbc2l6ZT0xXSAtIFRoZSBzaXplIG9mIHRoZSBtZXNoIHVzZWQgdG8gdmlzdWFsaXplIHRoZSBsaWdodC5cclxuXHQgKiBAcGFyYW0ge251bWJlcnxDb2xvcnxzdHJpbmd9IFtjb2xvcl0gLSBUaGUgaGVscGVyJ3MgY29sb3IuIElmIG5vdCBzZXQsIHRoZSBoZWxwZXIgd2lsbCB0YWtlXHJcblx0ICogdGhlIGNvbG9yIG9mIHRoZSBsaWdodC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbGlnaHQsIHNpemUsIGNvbG9yICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbGlnaHQgYmVpbmcgdmlzdWFsaXplZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7SGVtaXNwaGVyZUxpZ2h0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxpZ2h0ID0gbGlnaHQ7XHJcblxyXG5cdFx0dGhpcy5tYXRyaXggPSBsaWdodC5tYXRyaXhXb3JsZDtcclxuXHRcdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNvbG9yIHBhcmFtZXRlciBwYXNzZWQgaW4gdGhlIGNvbnN0cnVjdG9yLlxyXG5cdFx0ICogSWYgbm90IHNldCwgdGhlIGhlbHBlciB3aWxsIHRha2UgdGhlIGNvbG9yIG9mIHRoZSBsaWdodC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfENvbG9yfHN0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb2xvciA9IGNvbG9yO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdIZW1pc3BoZXJlTGlnaHRIZWxwZXInO1xyXG5cclxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gbmV3IE9jdGFoZWRyb25HZW9tZXRyeSggc2l6ZSApO1xyXG5cdFx0Z2VvbWV0cnkucm90YXRlWSggTWF0aC5QSSAqIDAuNSApO1xyXG5cclxuXHRcdHRoaXMubWF0ZXJpYWwgPSBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoIHsgd2lyZWZyYW1lOiB0cnVlLCBmb2c6IGZhbHNlLCB0b25lTWFwcGVkOiBmYWxzZSB9ICk7XHJcblx0XHRpZiAoIHRoaXMuY29sb3IgPT09IHVuZGVmaW5lZCApIHRoaXMubWF0ZXJpYWwudmVydGV4Q29sb3JzID0gdHJ1ZTtcclxuXHJcblx0XHRjb25zdCBwb3NpdGlvbiA9IGdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJyApO1xyXG5cdFx0Y29uc3QgY29sb3JzID0gbmV3IEZsb2F0MzJBcnJheSggcG9zaXRpb24uY291bnQgKiAzICk7XHJcblxyXG5cdFx0Z2VvbWV0cnkuc2V0QXR0cmlidXRlKCAnY29sb3InLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBjb2xvcnMsIDMgKSApO1xyXG5cclxuXHRcdHRoaXMuYWRkKCBuZXcgTWVzaCggZ2VvbWV0cnksIHRoaXMubWF0ZXJpYWwgKSApO1xyXG5cclxuXHRcdHRoaXMudXBkYXRlKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRnJlZXMgdGhlIEdQVS1yZWxhdGVkIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhpcyBpbnN0YW5jZS4gQ2FsbCB0aGlzXHJcblx0ICogbWV0aG9kIHdoZW5ldmVyIHRoaXMgaW5zdGFuY2UgaXMgbm8gbG9uZ2VyIHVzZWQgaW4geW91ciBhcHAuXHJcblx0ICovXHJcblx0ZGlzcG9zZSgpIHtcclxuXHJcblx0XHR0aGlzLmNoaWxkcmVuWyAwIF0uZ2VvbWV0cnkuZGlzcG9zZSgpO1xyXG5cdFx0dGhpcy5jaGlsZHJlblsgMCBdLm1hdGVyaWFsLmRpc3Bvc2UoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoZSBoZWxwZXIgdG8gbWF0Y2ggdGhlIHBvc2l0aW9uIGFuZCBkaXJlY3Rpb24gb2YgdGhlXHJcblx0ICogbGlnaHQgYmVpbmcgdmlzdWFsaXplZC5cclxuXHQgKi9cclxuXHR1cGRhdGUoKSB7XHJcblxyXG5cdFx0Y29uc3QgbWVzaCA9IHRoaXMuY2hpbGRyZW5bIDAgXTtcclxuXHJcblx0XHRpZiAoIHRoaXMuY29sb3IgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHRoaXMubWF0ZXJpYWwuY29sb3Iuc2V0KCB0aGlzLmNvbG9yICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGNvbnN0IGNvbG9ycyA9IG1lc2guZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCAnY29sb3InICk7XHJcblxyXG5cdFx0XHRfY29sb3IxLmNvcHkoIHRoaXMubGlnaHQuY29sb3IgKTtcclxuXHRcdFx0X2NvbG9yMi5jb3B5KCB0aGlzLmxpZ2h0Lmdyb3VuZENvbG9yICk7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBjb2xvcnMuY291bnQ7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBjb2xvciA9ICggaSA8ICggbCAvIDIgKSApID8gX2NvbG9yMSA6IF9jb2xvcjI7XHJcblxyXG5cdFx0XHRcdGNvbG9ycy5zZXRYWVooIGksIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbG9ycy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMubGlnaHQudXBkYXRlV29ybGRNYXRyaXgoIHRydWUsIGZhbHNlICk7XHJcblxyXG5cdFx0bWVzaC5sb29rQXQoIF92ZWN0b3Iuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkICkubmVnYXRlKCkgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCB7IEhlbWlzcGhlcmVMaWdodEhlbHBlciB9O1xyXG4iLCJpbXBvcnQgeyBMaW5lU2VnbWVudHMgfSBmcm9tICcuLi9vYmplY3RzL0xpbmVTZWdtZW50cy5qcyc7XHJcbmltcG9ydCB7IExpbmVCYXNpY01hdGVyaWFsIH0gZnJvbSAnLi4vbWF0ZXJpYWxzL0xpbmVCYXNpY01hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyQXR0cmlidXRlLmpzJztcclxuaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcclxuaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi9tYXRoL0NvbG9yLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGUgaGVscGVyIGlzIGFuIG9iamVjdCB0byBkZWZpbmUgZ3JpZHMuIEdyaWRzIGFyZSB0d28tZGltZW5zaW9uYWxcclxuICogYXJyYXlzIG9mIGxpbmVzLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBzaXplID0gMTA7XHJcbiAqIGNvbnN0IGRpdmlzaW9ucyA9IDEwO1xyXG4gKlxyXG4gKiBjb25zdCBncmlkSGVscGVyID0gbmV3IFRIUkVFLkdyaWRIZWxwZXIoIHNpemUsIGRpdmlzaW9ucyApO1xyXG4gKiBzY2VuZS5hZGQoIGdyaWRIZWxwZXIgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBMaW5lU2VnbWVudHNcclxuICovXHJcbmNsYXNzIEdyaWRIZWxwZXIgZXh0ZW5kcyBMaW5lU2VnbWVudHMge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGdyaWQgaGVscGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtzaXplPTEwXSAtIFRoZSBzaXplIG9mIHRoZSBncmlkLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZGl2aXNpb25zPTEwXSAtIFRoZSBudW1iZXIgb2YgZGl2aXNpb25zIGFjcm9zcyB0aGUgZ3JpZC5cclxuXHQgKiBAcGFyYW0ge251bWJlcnxDb2xvcnxzdHJpbmd9IFtjb2xvcjE9MHg0NDQ0NDRdIC0gVGhlIGNvbG9yIG9mIHRoZSBjZW50ZXIgbGluZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcnxDb2xvcnxzdHJpbmd9IFtjb2xvcjI9MHg4ODg4ODhdIC0gVGhlIGNvbG9yIG9mIHRoZSBsaW5lcyBvZiB0aGUgZ3JpZC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggc2l6ZSA9IDEwLCBkaXZpc2lvbnMgPSAxMCwgY29sb3IxID0gMHg0NDQ0NDQsIGNvbG9yMiA9IDB4ODg4ODg4ICkge1xyXG5cclxuXHRcdGNvbG9yMSA9IG5ldyBDb2xvciggY29sb3IxICk7XHJcblx0XHRjb2xvcjIgPSBuZXcgQ29sb3IoIGNvbG9yMiApO1xyXG5cclxuXHRcdGNvbnN0IGNlbnRlciA9IGRpdmlzaW9ucyAvIDI7XHJcblx0XHRjb25zdCBzdGVwID0gc2l6ZSAvIGRpdmlzaW9ucztcclxuXHRcdGNvbnN0IGhhbGZTaXplID0gc2l6ZSAvIDI7XHJcblxyXG5cdFx0Y29uc3QgdmVydGljZXMgPSBbXSwgY29sb3JzID0gW107XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBqID0gMCwgayA9IC0gaGFsZlNpemU7IGkgPD0gZGl2aXNpb25zOyBpICsrLCBrICs9IHN0ZXAgKSB7XHJcblxyXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCAtIGhhbGZTaXplLCAwLCBrLCBoYWxmU2l6ZSwgMCwgayApO1xyXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCBrLCAwLCAtIGhhbGZTaXplLCBrLCAwLCBoYWxmU2l6ZSApO1xyXG5cclxuXHRcdFx0Y29uc3QgY29sb3IgPSBpID09PSBjZW50ZXIgPyBjb2xvcjEgOiBjb2xvcjI7XHJcblxyXG5cdFx0XHRjb2xvci50b0FycmF5KCBjb2xvcnMsIGogKTsgaiArPSAzO1xyXG5cdFx0XHRjb2xvci50b0FycmF5KCBjb2xvcnMsIGogKTsgaiArPSAzO1xyXG5cdFx0XHRjb2xvci50b0FycmF5KCBjb2xvcnMsIGogKTsgaiArPSAzO1xyXG5cdFx0XHRjb2xvci50b0FycmF5KCBjb2xvcnMsIGogKTsgaiArPSAzO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xyXG5cdFx0Z2VvbWV0cnkuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xyXG5cdFx0Z2VvbWV0cnkuc2V0QXR0cmlidXRlKCAnY29sb3InLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAzICkgKTtcclxuXHJcblx0XHRjb25zdCBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyB2ZXJ0ZXhDb2xvcnM6IHRydWUsIHRvbmVNYXBwZWQ6IGZhbHNlIH0gKTtcclxuXHJcblx0XHRzdXBlciggZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ0dyaWRIZWxwZXInO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZyZWVzIHRoZSBHUFUtcmVsYXRlZCByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHRoaXMgaW5zdGFuY2UuIENhbGwgdGhpc1xyXG5cdCAqIG1ldGhvZCB3aGVuZXZlciB0aGlzIGluc3RhbmNlIGlzIG5vIGxvbmdlciB1c2VkIGluIHlvdXIgYXBwLlxyXG5cdCAqL1xyXG5cdGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0dGhpcy5nZW9tZXRyeS5kaXNwb3NlKCk7XHJcblx0XHR0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCB7IEdyaWRIZWxwZXIgfTtcclxuIiwiaW1wb3J0IHsgTGluZVNlZ21lbnRzIH0gZnJvbSAnLi4vb2JqZWN0cy9MaW5lU2VnbWVudHMuanMnO1xyXG5pbXBvcnQgeyBMaW5lQmFzaWNNYXRlcmlhbCB9IGZyb20gJy4uL21hdGVyaWFscy9MaW5lQmFzaWNNYXRlcmlhbC5qcyc7XHJcbmltcG9ydCB7IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcbmltcG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9CdWZmZXJHZW9tZXRyeS5qcyc7XHJcbmltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vbWF0aC9Db2xvci5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBoZWxwZXIgaXMgYW4gb2JqZWN0IHRvIGRlZmluZSBwb2xhciBncmlkcy4gR3JpZHMgYXJlXHJcbiAqIHR3by1kaW1lbnNpb25hbCBhcnJheXMgb2YgbGluZXMuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IHJhZGl1cyA9IDEwO1xyXG4gKiBjb25zdCBzZWN0b3JzID0gMTY7XHJcbiAqIGNvbnN0IHJpbmdzID0gODtcclxuICogY29uc3QgZGl2aXNpb25zID0gNjQ7XHJcbiAqXHJcbiAqIGNvbnN0IGhlbHBlciA9IG5ldyBUSFJFRS5Qb2xhckdyaWRIZWxwZXIoIHJhZGl1cywgc2VjdG9ycywgcmluZ3MsIGRpdmlzaW9ucyApO1xyXG4gKiBzY2VuZS5hZGQoIGhlbHBlciApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIExpbmVTZWdtZW50c1xyXG4gKi9cclxuY2xhc3MgUG9sYXJHcmlkSGVscGVyIGV4dGVuZHMgTGluZVNlZ21lbnRzIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBwb2xhciBncmlkIGhlbHBlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbcmFkaXVzPTEwXSAtIFRoZSByYWRpdXMgb2YgdGhlIHBvbGFyIGdyaWQuIFRoaXMgY2FuIGJlIGFueSBwb3NpdGl2ZSBudW1iZXIuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtzZWN0b3JzPTE2XSAtIFRoZSBudW1iZXIgb2Ygc2VjdG9ycyB0aGUgZ3JpZCB3aWxsIGJlIGRpdmlkZWQgaW50by4gVGhpcyBjYW4gYmUgYW55IHBvc2l0aXZlIGludGVnZXIuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtyaW5ncz0xNl0gLSBUaGUgbnVtYmVyIG9mIHJpbmdzLiBUaGlzIGNhbiBiZSBhbnkgcG9zaXRpdmUgaW50ZWdlci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2RpdmlzaW9ucz02NF0gLSBUaGUgbnVtYmVyIG9mIGxpbmUgc2VnbWVudHMgdXNlZCBmb3IgZWFjaCBjaXJjbGUuIFRoaXMgY2FuIGJlIGFueSBwb3NpdGl2ZSBpbnRlZ2VyLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfENvbG9yfHN0cmluZ30gW2NvbG9yMT0weDQ0NDQ0NF0gLSBUaGUgZmlyc3QgY29sb3IgdXNlZCBmb3IgZ3JpZCBlbGVtZW50cy5cclxuXHQgKiBAcGFyYW0ge251bWJlcnxDb2xvcnxzdHJpbmd9IFtjb2xvcjI9MHg4ODg4ODhdIC0gIFRoZSBzZWNvbmQgY29sb3IgdXNlZCBmb3IgZ3JpZCBlbGVtZW50cy5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcmFkaXVzID0gMTAsIHNlY3RvcnMgPSAxNiwgcmluZ3MgPSA4LCBkaXZpc2lvbnMgPSA2NCwgY29sb3IxID0gMHg0NDQ0NDQsIGNvbG9yMiA9IDB4ODg4ODg4ICkge1xyXG5cclxuXHRcdGNvbG9yMSA9IG5ldyBDb2xvciggY29sb3IxICk7XHJcblx0XHRjb2xvcjIgPSBuZXcgQ29sb3IoIGNvbG9yMiApO1xyXG5cclxuXHRcdGNvbnN0IHZlcnRpY2VzID0gW107XHJcblx0XHRjb25zdCBjb2xvcnMgPSBbXTtcclxuXHJcblx0XHQvLyBjcmVhdGUgdGhlIHNlY3RvcnNcclxuXHJcblx0XHRpZiAoIHNlY3RvcnMgPiAxICkge1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgc2VjdG9yczsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgdiA9ICggaSAvIHNlY3RvcnMgKSAqICggTWF0aC5QSSAqIDIgKTtcclxuXHJcblx0XHRcdFx0Y29uc3QgeCA9IE1hdGguc2luKCB2ICkgKiByYWRpdXM7XHJcblx0XHRcdFx0Y29uc3QgeiA9IE1hdGguY29zKCB2ICkgKiByYWRpdXM7XHJcblxyXG5cdFx0XHRcdHZlcnRpY2VzLnB1c2goIDAsIDAsIDAgKTtcclxuXHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCB4LCAwLCB6ICk7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGNvbG9yID0gKCBpICYgMSApID8gY29sb3IxIDogY29sb3IyO1xyXG5cclxuXHRcdFx0XHRjb2xvcnMucHVzaCggY29sb3IuciwgY29sb3IuZywgY29sb3IuYiApO1xyXG5cdFx0XHRcdGNvbG9ycy5wdXNoKCBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGNyZWF0ZSB0aGUgcmluZ3NcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCByaW5nczsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGNvbG9yID0gKCBpICYgMSApID8gY29sb3IxIDogY29sb3IyO1xyXG5cclxuXHRcdFx0Y29uc3QgciA9IHJhZGl1cyAtICggcmFkaXVzIC8gcmluZ3MgKiBpICk7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaiA9IDA7IGogPCBkaXZpc2lvbnM7IGogKysgKSB7XHJcblxyXG5cdFx0XHRcdC8vIGZpcnN0IHZlcnRleFxyXG5cclxuXHRcdFx0XHRsZXQgdiA9ICggaiAvIGRpdmlzaW9ucyApICogKCBNYXRoLlBJICogMiApO1xyXG5cclxuXHRcdFx0XHRsZXQgeCA9IE1hdGguc2luKCB2ICkgKiByO1xyXG5cdFx0XHRcdGxldCB6ID0gTWF0aC5jb3MoIHYgKSAqIHI7XHJcblxyXG5cdFx0XHRcdHZlcnRpY2VzLnB1c2goIHgsIDAsIHogKTtcclxuXHRcdFx0XHRjb2xvcnMucHVzaCggY29sb3IuciwgY29sb3IuZywgY29sb3IuYiApO1xyXG5cclxuXHRcdFx0XHQvLyBzZWNvbmQgdmVydGV4XHJcblxyXG5cdFx0XHRcdHYgPSAoICggaiArIDEgKSAvIGRpdmlzaW9ucyApICogKCBNYXRoLlBJICogMiApO1xyXG5cclxuXHRcdFx0XHR4ID0gTWF0aC5zaW4oIHYgKSAqIHI7XHJcblx0XHRcdFx0eiA9IE1hdGguY29zKCB2ICkgKiByO1xyXG5cclxuXHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCB4LCAwLCB6ICk7XHJcblx0XHRcdFx0Y29sb3JzLnB1c2goIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcclxuXHRcdGdlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcclxuXHRcdGdlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGNvbG9ycywgMyApICk7XHJcblxyXG5cdFx0Y29uc3QgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgdmVydGV4Q29sb3JzOiB0cnVlLCB0b25lTWFwcGVkOiBmYWxzZSB9ICk7XHJcblxyXG5cdFx0c3VwZXIoIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdQb2xhckdyaWRIZWxwZXInO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZyZWVzIHRoZSBHUFUtcmVsYXRlZCByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHRoaXMgaW5zdGFuY2UuIENhbGwgdGhpc1xyXG5cdCAqIG1ldGhvZCB3aGVuZXZlciB0aGlzIGluc3RhbmNlIGlzIG5vIGxvbmdlciB1c2VkIGluIHlvdXIgYXBwLlxyXG5cdCAqL1xyXG5cdGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0dGhpcy5nZW9tZXRyeS5kaXNwb3NlKCk7XHJcblx0XHR0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCB7IFBvbGFyR3JpZEhlbHBlciB9O1xyXG4iLCJpbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuaW1wb3J0IHsgT2JqZWN0M0QgfSBmcm9tICcuLi9jb3JlL09iamVjdDNELmpzJztcclxuaW1wb3J0IHsgTGluZSB9IGZyb20gJy4uL29iamVjdHMvTGluZS5qcyc7XHJcbmltcG9ydCB7IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcbmltcG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9CdWZmZXJHZW9tZXRyeS5qcyc7XHJcbmltcG9ydCB7IExpbmVCYXNpY01hdGVyaWFsIH0gZnJvbSAnLi4vbWF0ZXJpYWxzL0xpbmVCYXNpY01hdGVyaWFsLmpzJztcclxuXHJcbmNvbnN0IF92MSA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX3YyID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfdjMgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcblxyXG4vKipcclxuICogSGVscGVyIG9iamVjdCB0byBhc3Npc3Qgd2l0aCB2aXN1YWxpemluZyBhIHtAbGluayBEaXJlY3Rpb25hbExpZ2h0fSdzXHJcbiAqIGVmZmVjdCBvbiB0aGUgc2NlbmUuIFRoaXMgY29uc2lzdHMgb2YgcGxhbmUgYW5kIGEgbGluZSByZXByZXNlbnRpbmcgdGhlXHJcbiAqIGxpZ2h0J3MgcG9zaXRpb24gYW5kIGRpcmVjdGlvbi5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgbGlnaHQgPSBuZXcgVEhSRUUuRGlyZWN0aW9uYWxMaWdodCggMHhGRkZGRkYgKTtcclxuICogc2NlbmUuYWRkKCBsaWdodCApO1xyXG4gKlxyXG4gKiBjb25zdCBoZWxwZXIgPSBuZXcgVEhSRUUuRGlyZWN0aW9uYWxMaWdodEhlbHBlciggbGlnaHQsIDUgKTtcclxuICogc2NlbmUuYWRkKCBoZWxwZXIgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBPYmplY3QzRFxyXG4gKi9cclxuY2xhc3MgRGlyZWN0aW9uYWxMaWdodEhlbHBlciBleHRlbmRzIE9iamVjdDNEIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBkaXJlY3Rpb25hbCBsaWdodCBoZWxwZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0RpcmVjdGlvbmFsTGlnaHR9IGxpZ2h0IC0gVGhlIGxpZ2h0IHRvIGJlIHZpc3VhbGl6ZWQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtzaXplPTFdIC0gVGhlIGRpbWVuc2lvbnMgb2YgdGhlIHBsYW5lLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfENvbG9yfHN0cmluZ30gW2NvbG9yXSAtIFRoZSBoZWxwZXIncyBjb2xvci4gSWYgbm90IHNldCwgdGhlIGhlbHBlciB3aWxsIHRha2VcclxuXHQgKiB0aGUgY29sb3Igb2YgdGhlIGxpZ2h0LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBsaWdodCwgc2l6ZSwgY29sb3IgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBsaWdodCBiZWluZyB2aXN1YWxpemVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtEaXJlY3Rpb25hbExpZ2h0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxpZ2h0ID0gbGlnaHQ7XHJcblxyXG5cdFx0dGhpcy5tYXRyaXggPSBsaWdodC5tYXRyaXhXb3JsZDtcclxuXHRcdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNvbG9yIHBhcmFtZXRlciBwYXNzZWQgaW4gdGhlIGNvbnN0cnVjdG9yLlxyXG5cdFx0ICogSWYgbm90IHNldCwgdGhlIGhlbHBlciB3aWxsIHRha2UgdGhlIGNvbG9yIG9mIHRoZSBsaWdodC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfENvbG9yfHN0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb2xvciA9IGNvbG9yO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdEaXJlY3Rpb25hbExpZ2h0SGVscGVyJztcclxuXHJcblx0XHRpZiAoIHNpemUgPT09IHVuZGVmaW5lZCApIHNpemUgPSAxO1xyXG5cclxuXHRcdGxldCBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xyXG5cdFx0Z2VvbWV0cnkuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggW1xyXG5cdFx0XHQtIHNpemUsIHNpemUsIDAsXHJcblx0XHRcdHNpemUsIHNpemUsIDAsXHJcblx0XHRcdHNpemUsIC0gc2l6ZSwgMCxcclxuXHRcdFx0LSBzaXplLCAtIHNpemUsIDAsXHJcblx0XHRcdC0gc2l6ZSwgc2l6ZSwgMFxyXG5cdFx0XSwgMyApICk7XHJcblxyXG5cdFx0Y29uc3QgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgZm9nOiBmYWxzZSwgdG9uZU1hcHBlZDogZmFsc2UgfSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQ29udGFpbnMgdGhlIGxpbmUgc2hvd2luZyB0aGUgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGlvbmFsIGxpZ2h0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtMaW5lfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxpZ2h0UGxhbmUgPSBuZXcgTGluZSggZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcblx0XHR0aGlzLmFkZCggdGhpcy5saWdodFBsYW5lICk7XHJcblxyXG5cdFx0Z2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcclxuXHRcdGdlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIFsgMCwgMCwgMCwgMCwgMCwgMSBdLCAzICkgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlcHJlc2VudHMgdGhlIHRhcmdldCBsaW5lIG9mIHRoZSBkaXJlY3Rpb25hbCBsaWdodC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7TGluZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50YXJnZXRMaW5lID0gbmV3IExpbmUoIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG5cdFx0dGhpcy5hZGQoIHRoaXMudGFyZ2V0TGluZSApO1xyXG5cclxuXHRcdHRoaXMudXBkYXRlKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRnJlZXMgdGhlIEdQVS1yZWxhdGVkIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhpcyBpbnN0YW5jZS4gQ2FsbCB0aGlzXHJcblx0ICogbWV0aG9kIHdoZW5ldmVyIHRoaXMgaW5zdGFuY2UgaXMgbm8gbG9uZ2VyIHVzZWQgaW4geW91ciBhcHAuXHJcblx0ICovXHJcblx0ZGlzcG9zZSgpIHtcclxuXHJcblx0XHR0aGlzLmxpZ2h0UGxhbmUuZ2VvbWV0cnkuZGlzcG9zZSgpO1xyXG5cdFx0dGhpcy5saWdodFBsYW5lLm1hdGVyaWFsLmRpc3Bvc2UoKTtcclxuXHRcdHRoaXMudGFyZ2V0TGluZS5nZW9tZXRyeS5kaXNwb3NlKCk7XHJcblx0XHR0aGlzLnRhcmdldExpbmUubWF0ZXJpYWwuZGlzcG9zZSgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIGhlbHBlciB0byBtYXRjaCB0aGUgcG9zaXRpb24gYW5kIGRpcmVjdGlvbiBvZiB0aGVcclxuXHQgKiBsaWdodCBiZWluZyB2aXN1YWxpemVkLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZSgpIHtcclxuXHJcblx0XHR0aGlzLmxpZ2h0LnVwZGF0ZVdvcmxkTWF0cml4KCB0cnVlLCBmYWxzZSApO1xyXG5cdFx0dGhpcy5saWdodC50YXJnZXQudXBkYXRlV29ybGRNYXRyaXgoIHRydWUsIGZhbHNlICk7XHJcblxyXG5cdFx0X3YxLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5saWdodC5tYXRyaXhXb3JsZCApO1xyXG5cdFx0X3YyLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5saWdodC50YXJnZXQubWF0cml4V29ybGQgKTtcclxuXHRcdF92My5zdWJWZWN0b3JzKCBfdjIsIF92MSApO1xyXG5cclxuXHRcdHRoaXMubGlnaHRQbGFuZS5sb29rQXQoIF92MiApO1xyXG5cclxuXHRcdGlmICggdGhpcy5jb2xvciAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0dGhpcy5saWdodFBsYW5lLm1hdGVyaWFsLmNvbG9yLnNldCggdGhpcy5jb2xvciApO1xyXG5cdFx0XHR0aGlzLnRhcmdldExpbmUubWF0ZXJpYWwuY29sb3Iuc2V0KCB0aGlzLmNvbG9yICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHRoaXMubGlnaHRQbGFuZS5tYXRlcmlhbC5jb2xvci5jb3B5KCB0aGlzLmxpZ2h0LmNvbG9yICk7XHJcblx0XHRcdHRoaXMudGFyZ2V0TGluZS5tYXRlcmlhbC5jb2xvci5jb3B5KCB0aGlzLmxpZ2h0LmNvbG9yICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMudGFyZ2V0TGluZS5sb29rQXQoIF92MiApO1xyXG5cdFx0dGhpcy50YXJnZXRMaW5lLnNjYWxlLnogPSBfdjMubGVuZ3RoKCk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBEaXJlY3Rpb25hbExpZ2h0SGVscGVyIH07XHJcbiIsImltcG9ydCB7IENhbWVyYSB9IGZyb20gJy4uL2NhbWVyYXMvQ2FtZXJhLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcbmltcG9ydCB7IExpbmVTZWdtZW50cyB9IGZyb20gJy4uL29iamVjdHMvTGluZVNlZ21lbnRzLmpzJztcclxuaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi9tYXRoL0NvbG9yLmpzJztcclxuaW1wb3J0IHsgTGluZUJhc2ljTWF0ZXJpYWwgfSBmcm9tICcuLi9tYXRlcmlhbHMvTGluZUJhc2ljTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyBCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyR2VvbWV0cnkuanMnO1xyXG5pbXBvcnQgeyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5pbXBvcnQgeyBXZWJHTENvb3JkaW5hdGVTeXN0ZW0gfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xyXG5cclxuY29uc3QgX3ZlY3RvciA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX2NhbWVyYSA9IC8qQF9fUFVSRV9fKi8gbmV3IENhbWVyYSgpO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgaGVscHMgd2l0aCB2aXN1YWxpemluZyB3aGF0IGEgY2FtZXJhIGNvbnRhaW5zIGluIGl0cyBmcnVzdHVtLiBJdFxyXG4gKiB2aXN1YWxpemVzIHRoZSBmcnVzdHVtIG9mIGEgY2FtZXJhIHVzaW5nIGEgbGluZSBzZWdtZW50cy5cclxuICpcclxuICogQmFzZWQgb24gZnJ1c3R1bSB2aXN1YWxpemF0aW9uIGluIFtsaWdodGdsLmpzIHNoYWRvd21hcCBleGFtcGxlXXtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZXZhbncvbGlnaHRnbC5qcy9ibG9iL21hc3Rlci90ZXN0cy9zaGFkb3dtYXAuaHRtbH0uXHJcbiAqXHJcbiAqIGBDYW1lcmFIZWxwZXJgIG11c3QgYmUgYSBjaGlsZCBvZiB0aGUgc2NlbmUuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGNhbWVyYSA9IG5ldyBUSFJFRS5QZXJzcGVjdGl2ZUNhbWVyYSggNzUsIHdpbmRvdy5pbm5lcldpZHRoIC8gd2luZG93LmlubmVySGVpZ2h0LCAwLjEsIDEwMDAgKTtcclxuICogY29uc3QgaGVscGVyID0gbmV3IFRIUkVFLkNhbWVyYUhlbHBlciggY2FtZXJhICk7XHJcbiAqIHNjZW5lLmFkZCggaGVscGVyICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTGluZVNlZ21lbnRzXHJcbiAqL1xyXG5jbGFzcyBDYW1lcmFIZWxwZXIgZXh0ZW5kcyBMaW5lU2VnbWVudHMge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGFycm93IGhlbHBlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Q2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIHRvIHZpc3VhbGl6ZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggY2FtZXJhICkge1xyXG5cclxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XHJcblx0XHRjb25zdCBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogMHhmZmZmZmYsIHZlcnRleENvbG9yczogdHJ1ZSwgdG9uZU1hcHBlZDogZmFsc2UgfSApO1xyXG5cclxuXHRcdGNvbnN0IHZlcnRpY2VzID0gW107XHJcblx0XHRjb25zdCBjb2xvcnMgPSBbXTtcclxuXHJcblx0XHRjb25zdCBwb2ludE1hcCA9IHt9O1xyXG5cclxuXHRcdC8vIG5lYXJcclxuXHJcblx0XHRhZGRMaW5lKCAnbjEnLCAnbjInICk7XHJcblx0XHRhZGRMaW5lKCAnbjInLCAnbjQnICk7XHJcblx0XHRhZGRMaW5lKCAnbjQnLCAnbjMnICk7XHJcblx0XHRhZGRMaW5lKCAnbjMnLCAnbjEnICk7XHJcblxyXG5cdFx0Ly8gZmFyXHJcblxyXG5cdFx0YWRkTGluZSggJ2YxJywgJ2YyJyApO1xyXG5cdFx0YWRkTGluZSggJ2YyJywgJ2Y0JyApO1xyXG5cdFx0YWRkTGluZSggJ2Y0JywgJ2YzJyApO1xyXG5cdFx0YWRkTGluZSggJ2YzJywgJ2YxJyApO1xyXG5cclxuXHRcdC8vIHNpZGVzXHJcblxyXG5cdFx0YWRkTGluZSggJ24xJywgJ2YxJyApO1xyXG5cdFx0YWRkTGluZSggJ24yJywgJ2YyJyApO1xyXG5cdFx0YWRkTGluZSggJ24zJywgJ2YzJyApO1xyXG5cdFx0YWRkTGluZSggJ240JywgJ2Y0JyApO1xyXG5cclxuXHRcdC8vIGNvbmVcclxuXHJcblx0XHRhZGRMaW5lKCAncCcsICduMScgKTtcclxuXHRcdGFkZExpbmUoICdwJywgJ24yJyApO1xyXG5cdFx0YWRkTGluZSggJ3AnLCAnbjMnICk7XHJcblx0XHRhZGRMaW5lKCAncCcsICduNCcgKTtcclxuXHJcblx0XHQvLyB1cFxyXG5cclxuXHRcdGFkZExpbmUoICd1MScsICd1MicgKTtcclxuXHRcdGFkZExpbmUoICd1MicsICd1MycgKTtcclxuXHRcdGFkZExpbmUoICd1MycsICd1MScgKTtcclxuXHJcblx0XHQvLyB0YXJnZXRcclxuXHJcblx0XHRhZGRMaW5lKCAnYycsICd0JyApO1xyXG5cdFx0YWRkTGluZSggJ3AnLCAnYycgKTtcclxuXHJcblx0XHQvLyBjcm9zc1xyXG5cclxuXHRcdGFkZExpbmUoICdjbjEnLCAnY24yJyApO1xyXG5cdFx0YWRkTGluZSggJ2NuMycsICdjbjQnICk7XHJcblxyXG5cdFx0YWRkTGluZSggJ2NmMScsICdjZjInICk7XHJcblx0XHRhZGRMaW5lKCAnY2YzJywgJ2NmNCcgKTtcclxuXHJcblx0XHRmdW5jdGlvbiBhZGRMaW5lKCBhLCBiICkge1xyXG5cclxuXHRcdFx0YWRkUG9pbnQoIGEgKTtcclxuXHRcdFx0YWRkUG9pbnQoIGIgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0ZnVuY3Rpb24gYWRkUG9pbnQoIGlkICkge1xyXG5cclxuXHRcdFx0dmVydGljZXMucHVzaCggMCwgMCwgMCApO1xyXG5cdFx0XHRjb2xvcnMucHVzaCggMCwgMCwgMCApO1xyXG5cclxuXHRcdFx0aWYgKCBwb2ludE1hcFsgaWQgXSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRwb2ludE1hcFsgaWQgXSA9IFtdO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cG9pbnRNYXBbIGlkIF0ucHVzaCggKCB2ZXJ0aWNlcy5sZW5ndGggLyAzICkgLSAxICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGdlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcclxuXHRcdGdlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGNvbG9ycywgMyApICk7XHJcblxyXG5cdFx0c3VwZXIoIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdDYW1lcmFIZWxwZXInO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNhbWVyYSBiZWluZyB2aXN1YWxpemVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtDYW1lcmF9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2FtZXJhID0gY2FtZXJhO1xyXG5cdFx0aWYgKCB0aGlzLmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4ICkgdGhpcy5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xyXG5cclxuXHRcdHRoaXMubWF0cml4ID0gY2FtZXJhLm1hdHJpeFdvcmxkO1xyXG5cdFx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGNvbnRhaW5zIHRoZSBwb2ludHMgdXNlZCB0byB2aXN1YWxpemUgdGhlIGNhbWVyYS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0PHN0cmluZyxBcnJheTxudW1iZXI+Pn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wb2ludE1hcCA9IHBvaW50TWFwO1xyXG5cclxuXHRcdHRoaXMudXBkYXRlKCk7XHJcblxyXG5cdFx0Ly8gY29sb3JzXHJcblxyXG5cdFx0Y29uc3QgY29sb3JGcnVzdHVtID0gbmV3IENvbG9yKCAweGZmYWEwMCApO1xyXG5cdFx0Y29uc3QgY29sb3JDb25lID0gbmV3IENvbG9yKCAweGZmMDAwMCApO1xyXG5cdFx0Y29uc3QgY29sb3JVcCA9IG5ldyBDb2xvciggMHgwMGFhZmYgKTtcclxuXHRcdGNvbnN0IGNvbG9yVGFyZ2V0ID0gbmV3IENvbG9yKCAweGZmZmZmZiApO1xyXG5cdFx0Y29uc3QgY29sb3JDcm9zcyA9IG5ldyBDb2xvciggMHgzMzMzMzMgKTtcclxuXHJcblx0XHR0aGlzLnNldENvbG9ycyggY29sb3JGcnVzdHVtLCBjb2xvckNvbmUsIGNvbG9yVXAsIGNvbG9yVGFyZ2V0LCBjb2xvckNyb3NzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVmaW5lcyB0aGUgY29sb3JzIG9mIHRoZSBoZWxwZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0NvbG9yfSBmcnVzdHVtIC0gVGhlIGZydXN0dW0gbGluZSBjb2xvci5cclxuXHQgKiBAcGFyYW0ge0NvbG9yfSBjb25lIC0gVGhlIGNvbmUgbGluZSBjb2xvci5cclxuXHQgKiBAcGFyYW0ge0NvbG9yfSB1cCAtIFRoZSB1cCBsaW5lIGNvbG9yLlxyXG5cdCAqIEBwYXJhbSB7Q29sb3J9IHRhcmdldCAtIFRoZSB0YXJnZXQgbGluZSBjb2xvci5cclxuXHQgKiBAcGFyYW0ge0NvbG9yfSBjcm9zcyAtIFRoZSBjcm9zcyBsaW5lIGNvbG9yLlxyXG5cdCAqL1xyXG5cdHNldENvbG9ycyggZnJ1c3R1bSwgY29uZSwgdXAsIHRhcmdldCwgY3Jvc3MgKSB7XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xyXG5cclxuXHRcdGNvbnN0IGNvbG9yQXR0cmlidXRlID0gZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCAnY29sb3InICk7XHJcblxyXG5cdFx0Ly8gbmVhclxyXG5cclxuXHRcdGNvbG9yQXR0cmlidXRlLnNldFhZWiggMCwgZnJ1c3R1bS5yLCBmcnVzdHVtLmcsIGZydXN0dW0uYiApOyBjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDEsIGZydXN0dW0uciwgZnJ1c3R1bS5nLCBmcnVzdHVtLmIgKTsgLy8gbjEsIG4yXHJcblx0XHRjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDIsIGZydXN0dW0uciwgZnJ1c3R1bS5nLCBmcnVzdHVtLmIgKTsgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKCAzLCBmcnVzdHVtLnIsIGZydXN0dW0uZywgZnJ1c3R1bS5iICk7IC8vIG4yLCBuNFxyXG5cdFx0Y29sb3JBdHRyaWJ1dGUuc2V0WFlaKCA0LCBmcnVzdHVtLnIsIGZydXN0dW0uZywgZnJ1c3R1bS5iICk7IGNvbG9yQXR0cmlidXRlLnNldFhZWiggNSwgZnJ1c3R1bS5yLCBmcnVzdHVtLmcsIGZydXN0dW0uYiApOyAvLyBuNCwgbjNcclxuXHRcdGNvbG9yQXR0cmlidXRlLnNldFhZWiggNiwgZnJ1c3R1bS5yLCBmcnVzdHVtLmcsIGZydXN0dW0uYiApOyBjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDcsIGZydXN0dW0uciwgZnJ1c3R1bS5nLCBmcnVzdHVtLmIgKTsgLy8gbjMsIG4xXHJcblxyXG5cdFx0Ly8gZmFyXHJcblxyXG5cdFx0Y29sb3JBdHRyaWJ1dGUuc2V0WFlaKCA4LCBmcnVzdHVtLnIsIGZydXN0dW0uZywgZnJ1c3R1bS5iICk7IGNvbG9yQXR0cmlidXRlLnNldFhZWiggOSwgZnJ1c3R1bS5yLCBmcnVzdHVtLmcsIGZydXN0dW0uYiApOyAvLyBmMSwgZjJcclxuXHRcdGNvbG9yQXR0cmlidXRlLnNldFhZWiggMTAsIGZydXN0dW0uciwgZnJ1c3R1bS5nLCBmcnVzdHVtLmIgKTsgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKCAxMSwgZnJ1c3R1bS5yLCBmcnVzdHVtLmcsIGZydXN0dW0uYiApOyAvLyBmMiwgZjRcclxuXHRcdGNvbG9yQXR0cmlidXRlLnNldFhZWiggMTIsIGZydXN0dW0uciwgZnJ1c3R1bS5nLCBmcnVzdHVtLmIgKTsgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKCAxMywgZnJ1c3R1bS5yLCBmcnVzdHVtLmcsIGZydXN0dW0uYiApOyAvLyBmNCwgZjNcclxuXHRcdGNvbG9yQXR0cmlidXRlLnNldFhZWiggMTQsIGZydXN0dW0uciwgZnJ1c3R1bS5nLCBmcnVzdHVtLmIgKTsgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKCAxNSwgZnJ1c3R1bS5yLCBmcnVzdHVtLmcsIGZydXN0dW0uYiApOyAvLyBmMywgZjFcclxuXHJcblx0XHQvLyBzaWRlc1xyXG5cclxuXHRcdGNvbG9yQXR0cmlidXRlLnNldFhZWiggMTYsIGZydXN0dW0uciwgZnJ1c3R1bS5nLCBmcnVzdHVtLmIgKTsgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKCAxNywgZnJ1c3R1bS5yLCBmcnVzdHVtLmcsIGZydXN0dW0uYiApOyAvLyBuMSwgZjFcclxuXHRcdGNvbG9yQXR0cmlidXRlLnNldFhZWiggMTgsIGZydXN0dW0uciwgZnJ1c3R1bS5nLCBmcnVzdHVtLmIgKTsgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKCAxOSwgZnJ1c3R1bS5yLCBmcnVzdHVtLmcsIGZydXN0dW0uYiApOyAvLyBuMiwgZjJcclxuXHRcdGNvbG9yQXR0cmlidXRlLnNldFhZWiggMjAsIGZydXN0dW0uciwgZnJ1c3R1bS5nLCBmcnVzdHVtLmIgKTsgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKCAyMSwgZnJ1c3R1bS5yLCBmcnVzdHVtLmcsIGZydXN0dW0uYiApOyAvLyBuMywgZjNcclxuXHRcdGNvbG9yQXR0cmlidXRlLnNldFhZWiggMjIsIGZydXN0dW0uciwgZnJ1c3R1bS5nLCBmcnVzdHVtLmIgKTsgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKCAyMywgZnJ1c3R1bS5yLCBmcnVzdHVtLmcsIGZydXN0dW0uYiApOyAvLyBuNCwgZjRcclxuXHJcblx0XHQvLyBjb25lXHJcblxyXG5cdFx0Y29sb3JBdHRyaWJ1dGUuc2V0WFlaKCAyNCwgY29uZS5yLCBjb25lLmcsIGNvbmUuYiApOyBjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDI1LCBjb25lLnIsIGNvbmUuZywgY29uZS5iICk7IC8vIHAsIG4xXHJcblx0XHRjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDI2LCBjb25lLnIsIGNvbmUuZywgY29uZS5iICk7IGNvbG9yQXR0cmlidXRlLnNldFhZWiggMjcsIGNvbmUuciwgY29uZS5nLCBjb25lLmIgKTsgLy8gcCwgbjJcclxuXHRcdGNvbG9yQXR0cmlidXRlLnNldFhZWiggMjgsIGNvbmUuciwgY29uZS5nLCBjb25lLmIgKTsgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKCAyOSwgY29uZS5yLCBjb25lLmcsIGNvbmUuYiApOyAvLyBwLCBuM1xyXG5cdFx0Y29sb3JBdHRyaWJ1dGUuc2V0WFlaKCAzMCwgY29uZS5yLCBjb25lLmcsIGNvbmUuYiApOyBjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDMxLCBjb25lLnIsIGNvbmUuZywgY29uZS5iICk7IC8vIHAsIG40XHJcblxyXG5cdFx0Ly8gdXBcclxuXHJcblx0XHRjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDMyLCB1cC5yLCB1cC5nLCB1cC5iICk7IGNvbG9yQXR0cmlidXRlLnNldFhZWiggMzMsIHVwLnIsIHVwLmcsIHVwLmIgKTsgLy8gdTEsIHUyXHJcblx0XHRjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDM0LCB1cC5yLCB1cC5nLCB1cC5iICk7IGNvbG9yQXR0cmlidXRlLnNldFhZWiggMzUsIHVwLnIsIHVwLmcsIHVwLmIgKTsgLy8gdTIsIHUzXHJcblx0XHRjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDM2LCB1cC5yLCB1cC5nLCB1cC5iICk7IGNvbG9yQXR0cmlidXRlLnNldFhZWiggMzcsIHVwLnIsIHVwLmcsIHVwLmIgKTsgLy8gdTMsIHUxXHJcblxyXG5cdFx0Ly8gdGFyZ2V0XHJcblxyXG5cdFx0Y29sb3JBdHRyaWJ1dGUuc2V0WFlaKCAzOCwgdGFyZ2V0LnIsIHRhcmdldC5nLCB0YXJnZXQuYiApOyBjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDM5LCB0YXJnZXQuciwgdGFyZ2V0LmcsIHRhcmdldC5iICk7IC8vIGMsIHRcclxuXHRcdGNvbG9yQXR0cmlidXRlLnNldFhZWiggNDAsIGNyb3NzLnIsIGNyb3NzLmcsIGNyb3NzLmIgKTsgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKCA0MSwgY3Jvc3MuciwgY3Jvc3MuZywgY3Jvc3MuYiApOyAvLyBwLCBjXHJcblxyXG5cdFx0Ly8gY3Jvc3NcclxuXHJcblx0XHRjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDQyLCBjcm9zcy5yLCBjcm9zcy5nLCBjcm9zcy5iICk7IGNvbG9yQXR0cmlidXRlLnNldFhZWiggNDMsIGNyb3NzLnIsIGNyb3NzLmcsIGNyb3NzLmIgKTsgLy8gY24xLCBjbjJcclxuXHRcdGNvbG9yQXR0cmlidXRlLnNldFhZWiggNDQsIGNyb3NzLnIsIGNyb3NzLmcsIGNyb3NzLmIgKTsgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKCA0NSwgY3Jvc3MuciwgY3Jvc3MuZywgY3Jvc3MuYiApOyAvLyBjbjMsIGNuNFxyXG5cclxuXHRcdGNvbG9yQXR0cmlidXRlLnNldFhZWiggNDYsIGNyb3NzLnIsIGNyb3NzLmcsIGNyb3NzLmIgKTsgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKCA0NywgY3Jvc3MuciwgY3Jvc3MuZywgY3Jvc3MuYiApOyAvLyBjZjEsIGNmMlxyXG5cdFx0Y29sb3JBdHRyaWJ1dGUuc2V0WFlaKCA0OCwgY3Jvc3MuciwgY3Jvc3MuZywgY3Jvc3MuYiApOyBjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDQ5LCBjcm9zcy5yLCBjcm9zcy5nLCBjcm9zcy5iICk7IC8vIGNmMywgY2Y0XHJcblxyXG5cdFx0Y29sb3JBdHRyaWJ1dGUubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIGhlbHBlciBiYXNlZCBvbiB0aGUgcHJvamVjdGlvbiBtYXRyaXggb2YgdGhlIGNhbWVyYS5cclxuXHQgKi9cclxuXHR1cGRhdGUoKSB7XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xyXG5cdFx0Y29uc3QgcG9pbnRNYXAgPSB0aGlzLnBvaW50TWFwO1xyXG5cclxuXHRcdGNvbnN0IHcgPSAxLCBoID0gMTtcclxuXHJcblx0XHQvLyB3ZSBuZWVkIGp1c3QgY2FtZXJhIHByb2plY3Rpb24gbWF0cml4IGludmVyc2VcclxuXHRcdC8vIHdvcmxkIG1hdHJpeCBtdXN0IGJlIGlkZW50aXR5XHJcblxyXG5cdFx0X2NhbWVyYS5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5jb3B5KCB0aGlzLmNhbWVyYS5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSApO1xyXG5cclxuXHRcdC8vIEFkanVzdCB6IHZhbHVlcyBiYXNlZCBvbiBjb29yZGluYXRlIHN5c3RlbVxyXG5cdFx0Y29uc3QgbmVhclogPSB0aGlzLmNhbWVyYS5jb29yZGluYXRlU3lzdGVtID09PSBXZWJHTENvb3JkaW5hdGVTeXN0ZW0gPyAtIDEgOiAwO1xyXG5cclxuXHRcdC8vIGNlbnRlciAvIHRhcmdldFxyXG5cdFx0c2V0UG9pbnQoICdjJywgcG9pbnRNYXAsIGdlb21ldHJ5LCBfY2FtZXJhLCAwLCAwLCBuZWFyWiApO1xyXG5cdFx0c2V0UG9pbnQoICd0JywgcG9pbnRNYXAsIGdlb21ldHJ5LCBfY2FtZXJhLCAwLCAwLCAxICk7XHJcblxyXG5cdFx0Ly8gbmVhclxyXG5cclxuXHRcdHNldFBvaW50KCAnbjEnLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIC0gdywgLSBoLCBuZWFyWiApO1xyXG5cdFx0c2V0UG9pbnQoICduMicsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgdywgLSBoLCBuZWFyWiApO1xyXG5cdFx0c2V0UG9pbnQoICduMycsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgLSB3LCBoLCBuZWFyWiApO1xyXG5cdFx0c2V0UG9pbnQoICduNCcsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgdywgaCwgbmVhclogKTtcclxuXHJcblx0XHQvLyBmYXJcclxuXHJcblx0XHRzZXRQb2ludCggJ2YxJywgcG9pbnRNYXAsIGdlb21ldHJ5LCBfY2FtZXJhLCAtIHcsIC0gaCwgMSApO1xyXG5cdFx0c2V0UG9pbnQoICdmMicsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgdywgLSBoLCAxICk7XHJcblx0XHRzZXRQb2ludCggJ2YzJywgcG9pbnRNYXAsIGdlb21ldHJ5LCBfY2FtZXJhLCAtIHcsIGgsIDEgKTtcclxuXHRcdHNldFBvaW50KCAnZjQnLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIHcsIGgsIDEgKTtcclxuXHJcblx0XHQvLyB1cFxyXG5cclxuXHRcdHNldFBvaW50KCAndTEnLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIHcgKiAwLjcsIGggKiAxLjEsIG5lYXJaICk7XHJcblx0XHRzZXRQb2ludCggJ3UyJywgcG9pbnRNYXAsIGdlb21ldHJ5LCBfY2FtZXJhLCAtIHcgKiAwLjcsIGggKiAxLjEsIG5lYXJaICk7XHJcblx0XHRzZXRQb2ludCggJ3UzJywgcG9pbnRNYXAsIGdlb21ldHJ5LCBfY2FtZXJhLCAwLCBoICogMiwgbmVhclogKTtcclxuXHJcblx0XHQvLyBjcm9zc1xyXG5cclxuXHRcdHNldFBvaW50KCAnY2YxJywgcG9pbnRNYXAsIGdlb21ldHJ5LCBfY2FtZXJhLCAtIHcsIDAsIDEgKTtcclxuXHRcdHNldFBvaW50KCAnY2YyJywgcG9pbnRNYXAsIGdlb21ldHJ5LCBfY2FtZXJhLCB3LCAwLCAxICk7XHJcblx0XHRzZXRQb2ludCggJ2NmMycsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgMCwgLSBoLCAxICk7XHJcblx0XHRzZXRQb2ludCggJ2NmNCcsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgMCwgaCwgMSApO1xyXG5cclxuXHRcdHNldFBvaW50KCAnY24xJywgcG9pbnRNYXAsIGdlb21ldHJ5LCBfY2FtZXJhLCAtIHcsIDAsIG5lYXJaICk7XHJcblx0XHRzZXRQb2ludCggJ2NuMicsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgdywgMCwgbmVhclogKTtcclxuXHRcdHNldFBvaW50KCAnY24zJywgcG9pbnRNYXAsIGdlb21ldHJ5LCBfY2FtZXJhLCAwLCAtIGgsIG5lYXJaICk7XHJcblx0XHRzZXRQb2ludCggJ2NuNCcsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgMCwgaCwgbmVhclogKTtcclxuXHJcblx0XHRnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKS5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRnJlZXMgdGhlIEdQVS1yZWxhdGVkIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhpcyBpbnN0YW5jZS4gQ2FsbCB0aGlzXHJcblx0ICogbWV0aG9kIHdoZW5ldmVyIHRoaXMgaW5zdGFuY2UgaXMgbm8gbG9uZ2VyIHVzZWQgaW4geW91ciBhcHAuXHJcblx0ICovXHJcblx0ZGlzcG9zZSgpIHtcclxuXHJcblx0XHR0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKTtcclxuXHRcdHRoaXMubWF0ZXJpYWwuZGlzcG9zZSgpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5cclxuZnVuY3Rpb24gc2V0UG9pbnQoIHBvaW50LCBwb2ludE1hcCwgZ2VvbWV0cnksIGNhbWVyYSwgeCwgeSwgeiApIHtcclxuXHJcblx0X3ZlY3Rvci5zZXQoIHgsIHksIHogKS51bnByb2plY3QoIGNhbWVyYSApO1xyXG5cclxuXHRjb25zdCBwb2ludHMgPSBwb2ludE1hcFsgcG9pbnQgXTtcclxuXHJcblx0aWYgKCBwb2ludHMgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRjb25zdCBwb3NpdGlvbiA9IGdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJyApO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0cG9zaXRpb24uc2V0WFlaKCBwb2ludHNbIGkgXSwgX3ZlY3Rvci54LCBfdmVjdG9yLnksIF92ZWN0b3IueiApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgQ2FtZXJhSGVscGVyIH07XHJcbiIsImltcG9ydCB7IEJveDMgfSBmcm9tICcuLi9tYXRoL0JveDMuanMnO1xyXG5pbXBvcnQgeyBMaW5lU2VnbWVudHMgfSBmcm9tICcuLi9vYmplY3RzL0xpbmVTZWdtZW50cy5qcyc7XHJcbmltcG9ydCB7IExpbmVCYXNpY01hdGVyaWFsIH0gZnJvbSAnLi4vbWF0ZXJpYWxzL0xpbmVCYXNpY01hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5pbXBvcnQgeyBCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyR2VvbWV0cnkuanMnO1xyXG5cclxuY29uc3QgX2JveCA9IC8qQF9fUFVSRV9fKi8gbmV3IEJveDMoKTtcclxuXHJcbi8qKlxyXG4gKiBIZWxwZXIgb2JqZWN0IHRvIGdyYXBoaWNhbGx5IHNob3cgdGhlIHdvcmxkLWF4aXMtYWxpZ25lZCBib3VuZGluZyBib3hcclxuICogYXJvdW5kIGFuIG9iamVjdC4gVGhlIGFjdHVhbCBib3VuZGluZyBib3ggaXMgaGFuZGxlZCB3aXRoIHtAbGluayBCb3gzfSxcclxuICogdGhpcyBpcyBqdXN0IGEgdmlzdWFsIGhlbHBlciBmb3IgZGVidWdnaW5nLiBJdCBjYW4gYmUgYXV0b21hdGljYWxseVxyXG4gKiByZXNpemVkIHdpdGgge0BsaW5rIEJveEhlbHBlciN1cGRhdGV9IHdoZW4gdGhlIG9iamVjdCBpdCdzIGNyZWF0ZWQgZnJvbVxyXG4gKiBpcyB0cmFuc2Zvcm1lZC4gTm90ZSB0aGF0IHRoZSBvYmplY3QgbXVzdCBoYXZlIGEgZ2VvbWV0cnkgZm9yIHRoaXMgdG8gd29yayxcclxuICogc28gaXQgd29uJ3Qgd29yayB3aXRoIHNwcml0ZXMuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IHNwaGVyZSA9IG5ldyBUSFJFRS5TcGhlcmVHZW9tZXRyeSgpO1xyXG4gKiBjb25zdCBvYmplY3QgPSBuZXcgVEhSRUUuTWVzaCggc3BoZXJlLCBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoIDB4ZmYwMDAwICkgKTtcclxuICogY29uc3QgYm94ID0gbmV3IFRIUkVFLkJveEhlbHBlciggb2JqZWN0LCAweGZmZmYwMCApO1xyXG4gKiBzY2VuZS5hZGQoIGJveCApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIExpbmVTZWdtZW50c1xyXG4gKi9cclxuY2xhc3MgQm94SGVscGVyIGV4dGVuZHMgTGluZVNlZ21lbnRzIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBib3ggaGVscGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3QzRH0gW29iamVjdF0gLSBUaGUgM0Qgb2JqZWN0IHRvIHNob3cgdGhlIHdvcmxkLWF4aXMtYWxpZ25lZCBib3VuZGluZyBib3guXHJcblx0ICogQHBhcmFtIHtudW1iZXJ8Q29sb3J8c3RyaW5nfSBbY29sb3I9MHhmZmZmMDBdIC0gVGhlIGJveCdzIGNvbG9yLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBvYmplY3QsIGNvbG9yID0gMHhmZmZmMDAgKSB7XHJcblxyXG5cdFx0Y29uc3QgaW5kaWNlcyA9IG5ldyBVaW50MTZBcnJheSggWyAwLCAxLCAxLCAyLCAyLCAzLCAzLCAwLCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA0LCAwLCA0LCAxLCA1LCAyLCA2LCAzLCA3IF0gKTtcclxuXHRcdGNvbnN0IHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQXJyYXkoIDggKiAzICk7XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcclxuXHRcdGdlb21ldHJ5LnNldEluZGV4KCBuZXcgQnVmZmVyQXR0cmlidXRlKCBpbmRpY2VzLCAxICkgKTtcclxuXHRcdGdlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25zLCAzICkgKTtcclxuXHJcblx0XHRzdXBlciggZ2VvbWV0cnksIG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IsIHRvbmVNYXBwZWQ6IGZhbHNlIH0gKSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIDNEIG9iamVjdCBiZWluZyB2aXN1YWxpemVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3QzRH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5vYmplY3QgPSBvYmplY3Q7XHJcblx0XHR0aGlzLnR5cGUgPSAnQm94SGVscGVyJztcclxuXHJcblx0XHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcclxuXHJcblx0XHR0aGlzLnVwZGF0ZSgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIGhlbHBlcidzIGdlb21ldHJ5IHRvIG1hdGNoIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBvYmplY3QsXHJcblx0ICogaW5jbHVkaW5nIGFueSBjaGlsZHJlbi5cclxuXHQgKi9cclxuXHR1cGRhdGUoKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm9iamVjdCAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0X2JveC5zZXRGcm9tT2JqZWN0KCB0aGlzLm9iamVjdCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIF9ib3guaXNFbXB0eSgpICkgcmV0dXJuO1xyXG5cclxuXHRcdGNvbnN0IG1pbiA9IF9ib3gubWluO1xyXG5cdFx0Y29uc3QgbWF4ID0gX2JveC5tYXg7XHJcblxyXG5cdFx0LypcclxuXHRcdFx0NV9fX180XHJcblx0XHQxL19fXzAvfFxyXG5cdFx0fCA2X198XzdcclxuXHRcdDIvX19fMy9cclxuXHJcblx0XHQwOiBtYXgueCwgbWF4LnksIG1heC56XHJcblx0XHQxOiBtaW4ueCwgbWF4LnksIG1heC56XHJcblx0XHQyOiBtaW4ueCwgbWluLnksIG1heC56XHJcblx0XHQzOiBtYXgueCwgbWluLnksIG1heC56XHJcblx0XHQ0OiBtYXgueCwgbWF4LnksIG1pbi56XHJcblx0XHQ1OiBtaW4ueCwgbWF4LnksIG1pbi56XHJcblx0XHQ2OiBtaW4ueCwgbWluLnksIG1pbi56XHJcblx0XHQ3OiBtYXgueCwgbWluLnksIG1pbi56XHJcblx0XHQqL1xyXG5cclxuXHRcdGNvbnN0IHBvc2l0aW9uID0gdGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xyXG5cdFx0Y29uc3QgYXJyYXkgPSBwb3NpdGlvbi5hcnJheTtcclxuXHJcblx0XHRhcnJheVsgMCBdID0gbWF4Lng7IGFycmF5WyAxIF0gPSBtYXgueTsgYXJyYXlbIDIgXSA9IG1heC56O1xyXG5cdFx0YXJyYXlbIDMgXSA9IG1pbi54OyBhcnJheVsgNCBdID0gbWF4Lnk7IGFycmF5WyA1IF0gPSBtYXguejtcclxuXHRcdGFycmF5WyA2IF0gPSBtaW4ueDsgYXJyYXlbIDcgXSA9IG1pbi55OyBhcnJheVsgOCBdID0gbWF4Lno7XHJcblx0XHRhcnJheVsgOSBdID0gbWF4Lng7IGFycmF5WyAxMCBdID0gbWluLnk7IGFycmF5WyAxMSBdID0gbWF4Lno7XHJcblx0XHRhcnJheVsgMTIgXSA9IG1heC54OyBhcnJheVsgMTMgXSA9IG1heC55OyBhcnJheVsgMTQgXSA9IG1pbi56O1xyXG5cdFx0YXJyYXlbIDE1IF0gPSBtaW4ueDsgYXJyYXlbIDE2IF0gPSBtYXgueTsgYXJyYXlbIDE3IF0gPSBtaW4uejtcclxuXHRcdGFycmF5WyAxOCBdID0gbWluLng7IGFycmF5WyAxOSBdID0gbWluLnk7IGFycmF5WyAyMCBdID0gbWluLno7XHJcblx0XHRhcnJheVsgMjEgXSA9IG1heC54OyBhcnJheVsgMjIgXSA9IG1pbi55OyBhcnJheVsgMjMgXSA9IG1pbi56O1xyXG5cclxuXHRcdHBvc2l0aW9uLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLmdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIHdpcmVmcmFtZSBib3ggZm9yIHRoZSBwYXNzZWQgb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3QzRH0gb2JqZWN0IC0gVGhlIDNEIG9iamVjdCB0byBjcmVhdGUgdGhlIGhlbHBlciBmb3IuXHJcblx0ICogQHJldHVybiB7Qm94SGVscGVyfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldEZyb21PYmplY3QoIG9iamVjdCApIHtcclxuXHJcblx0XHR0aGlzLm9iamVjdCA9IG9iamVjdDtcclxuXHRcdHRoaXMudXBkYXRlKCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlLCByZWN1cnNpdmUgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlLCByZWN1cnNpdmUgKTtcclxuXHJcblx0XHR0aGlzLm9iamVjdCA9IHNvdXJjZS5vYmplY3Q7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRnJlZXMgdGhlIEdQVS1yZWxhdGVkIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhpcyBpbnN0YW5jZS4gQ2FsbCB0aGlzXHJcblx0ICogbWV0aG9kIHdoZW5ldmVyIHRoaXMgaW5zdGFuY2UgaXMgbm8gbG9uZ2VyIHVzZWQgaW4geW91ciBhcHAuXHJcblx0ICovXHJcblx0ZGlzcG9zZSgpIHtcclxuXHJcblx0XHR0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKTtcclxuXHRcdHRoaXMubWF0ZXJpYWwuZGlzcG9zZSgpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgQm94SGVscGVyIH07XHJcbiIsImltcG9ydCB7IExpbmVTZWdtZW50cyB9IGZyb20gJy4uL29iamVjdHMvTGluZVNlZ21lbnRzLmpzJztcclxuaW1wb3J0IHsgTGluZUJhc2ljTWF0ZXJpYWwgfSBmcm9tICcuLi9tYXRlcmlhbHMvTGluZUJhc2ljTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyBCdWZmZXJBdHRyaWJ1dGUsIEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcbmltcG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9CdWZmZXJHZW9tZXRyeS5qcyc7XHJcblxyXG4vKipcclxuICogQSBoZWxwZXIgb2JqZWN0IHRvIHZpc3VhbGl6ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgQm94M30uXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGJveCA9IG5ldyBUSFJFRS5Cb3gzKCk7XHJcbiAqIGJveC5zZXRGcm9tQ2VudGVyQW5kU2l6ZSggbmV3IFRIUkVFLlZlY3RvcjMoIDEsIDEsIDEgKSwgbmV3IFRIUkVFLlZlY3RvcjMoIDIsIDEsIDMgKSApO1xyXG4gKlxyXG4gKiBjb25zdCBoZWxwZXIgPSBuZXcgVEhSRUUuQm94M0hlbHBlciggYm94LCAweGZmZmYwMCApO1xyXG4gKiBzY2VuZS5hZGQoIGhlbHBlciApXHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTGluZVNlZ21lbnRzXHJcbiAqL1xyXG5jbGFzcyBCb3gzSGVscGVyIGV4dGVuZHMgTGluZVNlZ21lbnRzIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBib3gzIGhlbHBlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Qm94M30gYm94IC0gVGhlIGJveCB0byB2aXN1YWxpemUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ8Q29sb3J8c3RyaW5nfSBbY29sb3I9MHhmZmZmMDBdIC0gVGhlIGJveCdzIGNvbG9yLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBib3gsIGNvbG9yID0gMHhmZmZmMDAgKSB7XHJcblxyXG5cdFx0Y29uc3QgaW5kaWNlcyA9IG5ldyBVaW50MTZBcnJheSggWyAwLCAxLCAxLCAyLCAyLCAzLCAzLCAwLCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA0LCAwLCA0LCAxLCA1LCAyLCA2LCAzLCA3IF0gKTtcclxuXHJcblx0XHRjb25zdCBwb3NpdGlvbnMgPSBbIDEsIDEsIDEsIC0gMSwgMSwgMSwgLSAxLCAtIDEsIDEsIDEsIC0gMSwgMSwgMSwgMSwgLSAxLCAtIDEsIDEsIC0gMSwgLSAxLCAtIDEsIC0gMSwgMSwgLSAxLCAtIDEgXTtcclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xyXG5cclxuXHRcdGdlb21ldHJ5LnNldEluZGV4KCBuZXcgQnVmZmVyQXR0cmlidXRlKCBpbmRpY2VzLCAxICkgKTtcclxuXHJcblx0XHRnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbnMsIDMgKSApO1xyXG5cclxuXHRcdHN1cGVyKCBnZW9tZXRyeSwgbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciwgdG9uZU1hcHBlZDogZmFsc2UgfSApICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYm94IGJlaW5nIHZpc3VhbGl6ZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0JveDN9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYm94ID0gYm94O1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdCb3gzSGVscGVyJztcclxuXHJcblx0XHR0aGlzLmdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xyXG5cclxuXHR9XHJcblxyXG5cdHVwZGF0ZU1hdHJpeFdvcmxkKCBmb3JjZSApIHtcclxuXHJcblx0XHRjb25zdCBib3ggPSB0aGlzLmJveDtcclxuXHJcblx0XHRpZiAoIGJveC5pc0VtcHR5KCkgKSByZXR1cm47XHJcblxyXG5cdFx0Ym94LmdldENlbnRlciggdGhpcy5wb3NpdGlvbiApO1xyXG5cclxuXHRcdGJveC5nZXRTaXplKCB0aGlzLnNjYWxlICk7XHJcblxyXG5cdFx0dGhpcy5zY2FsZS5tdWx0aXBseVNjYWxhciggMC41ICk7XHJcblxyXG5cdFx0c3VwZXIudXBkYXRlTWF0cml4V29ybGQoIGZvcmNlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRnJlZXMgdGhlIEdQVS1yZWxhdGVkIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhpcyBpbnN0YW5jZS4gQ2FsbCB0aGlzXHJcblx0ICogbWV0aG9kIHdoZW5ldmVyIHRoaXMgaW5zdGFuY2UgaXMgbm8gbG9uZ2VyIHVzZWQgaW4geW91ciBhcHAuXHJcblx0ICovXHJcblx0ZGlzcG9zZSgpIHtcclxuXHJcblx0XHR0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKTtcclxuXHRcdHRoaXMubWF0ZXJpYWwuZGlzcG9zZSgpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBCb3gzSGVscGVyIH07XHJcbiIsImltcG9ydCB7IExpbmUgfSBmcm9tICcuLi9vYmplY3RzL0xpbmUuanMnO1xyXG5pbXBvcnQgeyBNZXNoIH0gZnJvbSAnLi4vb2JqZWN0cy9NZXNoLmpzJztcclxuaW1wb3J0IHsgTGluZUJhc2ljTWF0ZXJpYWwgfSBmcm9tICcuLi9tYXRlcmlhbHMvTGluZUJhc2ljTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyBNZXNoQmFzaWNNYXRlcmlhbCB9IGZyb20gJy4uL21hdGVyaWFscy9NZXNoQmFzaWNNYXRlcmlhbC5qcyc7XHJcbmltcG9ydCB7IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcbmltcG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9CdWZmZXJHZW9tZXRyeS5qcyc7XHJcblxyXG4vKipcclxuICogQSBoZWxwZXIgb2JqZWN0IHRvIHZpc3VhbGl6ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgUGxhbmV9LlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBwbGFuZSA9IG5ldyBUSFJFRS5QbGFuZSggbmV3IFRIUkVFLlZlY3RvcjMoIDEsIDEsIDAuMiApLCAzICk7XHJcbiAqIGNvbnN0IGhlbHBlciA9IG5ldyBUSFJFRS5QbGFuZUhlbHBlciggcGxhbmUsIDEsIDB4ZmZmZjAwICk7XHJcbiAqIHNjZW5lLmFkZCggaGVscGVyICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTGluZVxyXG4gKi9cclxuY2xhc3MgUGxhbmVIZWxwZXIgZXh0ZW5kcyBMaW5lIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBwbGFuZSBoZWxwZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1BsYW5lfSBwbGFuZSAtIFRoZSBwbGFuZSB0byBiZSB2aXN1YWxpemVkLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbc2l6ZT0xXSAtIFRoZSBzaWRlIGxlbmd0aCBvZiBwbGFuZSBoZWxwZXIuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ8Q29sb3J8c3RyaW5nfSBbaGV4PTB4ZmZmZjAwXSAtIFRoZSBoZWxwZXIncyBjb2xvci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcGxhbmUsIHNpemUgPSAxLCBoZXggPSAweGZmZmYwMCApIHtcclxuXHJcblx0XHRjb25zdCBjb2xvciA9IGhleDtcclxuXHJcblx0XHRjb25zdCBwb3NpdGlvbnMgPSBbIDEsIC0gMSwgMCwgLSAxLCAxLCAwLCAtIDEsIC0gMSwgMCwgMSwgMSwgMCwgLSAxLCAxLCAwLCAtIDEsIC0gMSwgMCwgMSwgLSAxLCAwLCAxLCAxLCAwIF07XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcclxuXHRcdGdlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9ucywgMyApICk7XHJcblx0XHRnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcclxuXHJcblx0XHRzdXBlciggZ2VvbWV0cnksIG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IsIHRvbmVNYXBwZWQ6IGZhbHNlIH0gKSApO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdQbGFuZUhlbHBlcic7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcGxhbmUgYmVpbmcgdmlzdWFsaXplZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7UGxhbmV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucGxhbmUgPSBwbGFuZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBzaWRlIGxlbmd0aCBvZiBwbGFuZSBoZWxwZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zaXplID0gc2l6ZTtcclxuXHJcblx0XHRjb25zdCBwb3NpdGlvbnMyID0gWyAxLCAxLCAwLCAtIDEsIDEsIDAsIC0gMSwgLSAxLCAwLCAxLCAxLCAwLCAtIDEsIC0gMSwgMCwgMSwgLSAxLCAwIF07XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnkyID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XHJcblx0XHRnZW9tZXRyeTIuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25zMiwgMyApICk7XHJcblx0XHRnZW9tZXRyeTIuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XHJcblxyXG5cdFx0dGhpcy5hZGQoIG5ldyBNZXNoKCBnZW9tZXRyeTIsIG5ldyBNZXNoQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IsIG9wYWNpdHk6IDAuMiwgdHJhbnNwYXJlbnQ6IHRydWUsIGRlcHRoV3JpdGU6IGZhbHNlLCB0b25lTWFwcGVkOiBmYWxzZSB9ICkgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdHVwZGF0ZU1hdHJpeFdvcmxkKCBmb3JjZSApIHtcclxuXHJcblx0XHR0aGlzLnBvc2l0aW9uLnNldCggMCwgMCwgMCApO1xyXG5cclxuXHRcdHRoaXMuc2NhbGUuc2V0KCAwLjUgKiB0aGlzLnNpemUsIDAuNSAqIHRoaXMuc2l6ZSwgMSApO1xyXG5cclxuXHRcdHRoaXMubG9va0F0KCB0aGlzLnBsYW5lLm5vcm1hbCApO1xyXG5cclxuXHRcdHRoaXMudHJhbnNsYXRlWiggLSB0aGlzLnBsYW5lLmNvbnN0YW50ICk7XHJcblxyXG5cdFx0c3VwZXIudXBkYXRlTWF0cml4V29ybGQoIGZvcmNlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgaGVscGVyIHRvIG1hdGNoIHRoZSBwb3NpdGlvbiBhbmQgZGlyZWN0aW9uIG9mIHRoZVxyXG5cdCAqIGxpZ2h0IGJlaW5nIHZpc3VhbGl6ZWQuXHJcblx0ICovXHJcblx0ZGlzcG9zZSgpIHtcclxuXHJcblx0XHR0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKTtcclxuXHRcdHRoaXMubWF0ZXJpYWwuZGlzcG9zZSgpO1xyXG5cdFx0dGhpcy5jaGlsZHJlblsgMCBdLmdlb21ldHJ5LmRpc3Bvc2UoKTtcclxuXHRcdHRoaXMuY2hpbGRyZW5bIDAgXS5tYXRlcmlhbC5kaXNwb3NlKCk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFBsYW5lSGVscGVyIH07XHJcbiIsImltcG9ydCB7IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcbmltcG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9CdWZmZXJHZW9tZXRyeS5qcyc7XHJcbmltcG9ydCB7IE9iamVjdDNEIH0gZnJvbSAnLi4vY29yZS9PYmplY3QzRC5qcyc7XHJcbmltcG9ydCB7IEN5bGluZGVyR2VvbWV0cnkgfSBmcm9tICcuLi9nZW9tZXRyaWVzL0N5bGluZGVyR2VvbWV0cnkuanMnO1xyXG5pbXBvcnQgeyBNZXNoQmFzaWNNYXRlcmlhbCB9IGZyb20gJy4uL21hdGVyaWFscy9NZXNoQmFzaWNNYXRlcmlhbC5qcyc7XHJcbmltcG9ydCB7IExpbmVCYXNpY01hdGVyaWFsIH0gZnJvbSAnLi4vbWF0ZXJpYWxzL0xpbmVCYXNpY01hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgTWVzaCB9IGZyb20gJy4uL29iamVjdHMvTWVzaC5qcyc7XHJcbmltcG9ydCB7IExpbmUgfSBmcm9tICcuLi9vYmplY3RzL0xpbmUuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuXHJcbmNvbnN0IF9heGlzID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5sZXQgX2xpbmVHZW9tZXRyeSwgX2NvbmVHZW9tZXRyeTtcclxuXHJcbi8qKlxyXG4gKiBBbiAzRCBhcnJvdyBvYmplY3QgZm9yIHZpc3VhbGl6aW5nIGRpcmVjdGlvbnMuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGRpciA9IG5ldyBUSFJFRS5WZWN0b3IzKCAxLCAyLCAwICk7XHJcbiAqXHJcbiAqIC8vbm9ybWFsaXplIHRoZSBkaXJlY3Rpb24gdmVjdG9yIChjb252ZXJ0IHRvIHZlY3RvciBvZiBsZW5ndGggMSlcclxuICogZGlyLm5vcm1hbGl6ZSgpO1xyXG4gKlxyXG4gKiBjb25zdCBvcmlnaW4gPSBuZXcgVEhSRUUuVmVjdG9yMyggMCwgMCwgMCApO1xyXG4gKiBjb25zdCBsZW5ndGggPSAxO1xyXG4gKiBjb25zdCBoZXggPSAweGZmZmYwMDtcclxuICpcclxuICogY29uc3QgYXJyb3dIZWxwZXIgPSBuZXcgVEhSRUUuQXJyb3dIZWxwZXIoIGRpciwgb3JpZ2luLCBsZW5ndGgsIGhleCApO1xyXG4gKiBzY2VuZS5hZGQoIGFycm93SGVscGVyICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgT2JqZWN0M0RcclxuICovXHJcbmNsYXNzIEFycm93SGVscGVyIGV4dGVuZHMgT2JqZWN0M0Qge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGFycm93IGhlbHBlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gW2Rpcj0oMCwgMCwgMSldIC0gVGhlIChub3JtYWxpemVkKSBkaXJlY3Rpb24gdmVjdG9yLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gW29yaWdpbj0oMCwgMCwgMCldIC0gUG9pbnQgYXQgd2hpY2ggdGhlIGFycm93IHN0YXJ0cy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD0xXSAtIExlbmd0aCBvZiB0aGUgYXJyb3cgaW4gd29ybGQgdW5pdHMuXHJcblx0ICogQHBhcmFtIHsobnVtYmVyfENvbG9yfHN0cmluZyl9IFtjb2xvcj0weGZmZmYwMF0gLSBDb2xvciBvZiB0aGUgYXJyb3cuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtoZWFkTGVuZ3RoPWxlbmd0aCowLjJdIC0gVGhlIGxlbmd0aCBvZiB0aGUgaGVhZCBvZiB0aGUgYXJyb3cuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtoZWFkV2lkdGg9aGVhZExlbmd0aCowLjJdIC0gVGhlIHdpZHRoIG9mIHRoZSBoZWFkIG9mIHRoZSBhcnJvdy5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggZGlyID0gbmV3IFZlY3RvcjMoIDAsIDAsIDEgKSwgb3JpZ2luID0gbmV3IFZlY3RvcjMoIDAsIDAsIDAgKSwgbGVuZ3RoID0gMSwgY29sb3IgPSAweGZmZmYwMCwgaGVhZExlbmd0aCA9IGxlbmd0aCAqIDAuMiwgaGVhZFdpZHRoID0gaGVhZExlbmd0aCAqIDAuMiApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdBcnJvd0hlbHBlcic7XHJcblxyXG5cdFx0aWYgKCBfbGluZUdlb21ldHJ5ID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRfbGluZUdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XHJcblx0XHRcdF9saW5lR2VvbWV0cnkuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggWyAwLCAwLCAwLCAwLCAxLCAwIF0sIDMgKSApO1xyXG5cclxuXHRcdFx0X2NvbmVHZW9tZXRyeSA9IG5ldyBDeWxpbmRlckdlb21ldHJ5KCAwLCAwLjUsIDEsIDUsIDEgKTtcclxuXHRcdFx0X2NvbmVHZW9tZXRyeS50cmFuc2xhdGUoIDAsIC0gMC41LCAwICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMucG9zaXRpb24uY29weSggb3JpZ2luICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbGluZSBwYXJ0IG9mIHRoZSBhcnJvdyBoZWxwZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0xpbmV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGluZSA9IG5ldyBMaW5lKCBfbGluZUdlb21ldHJ5LCBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGNvbG9yLCB0b25lTWFwcGVkOiBmYWxzZSB9ICkgKTtcclxuXHRcdHRoaXMubGluZS5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XHJcblx0XHR0aGlzLmFkZCggdGhpcy5saW5lICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY29uZSBwYXJ0IG9mIHRoZSBhcnJvdyBoZWxwZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge01lc2h9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29uZSA9IG5ldyBNZXNoKCBfY29uZUdlb21ldHJ5LCBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGNvbG9yLCB0b25lTWFwcGVkOiBmYWxzZSB9ICkgKTtcclxuXHRcdHRoaXMuY29uZS5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XHJcblx0XHR0aGlzLmFkZCggdGhpcy5jb25lICk7XHJcblxyXG5cdFx0dGhpcy5zZXREaXJlY3Rpb24oIGRpciApO1xyXG5cdFx0dGhpcy5zZXRMZW5ndGgoIGxlbmd0aCwgaGVhZExlbmd0aCwgaGVhZFdpZHRoICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZGlyZWN0aW9uIG9mIHRoZSBoZWxwZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IGRpciAtIFRoZSBub3JtYWxpemVkIGRpcmVjdGlvbiB2ZWN0b3IuXHJcblx0ICovXHJcblx0c2V0RGlyZWN0aW9uKCBkaXIgKSB7XHJcblxyXG5cdFx0Ly8gZGlyIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZFxyXG5cclxuXHRcdGlmICggZGlyLnkgPiAwLjk5OTk5ICkge1xyXG5cclxuXHRcdFx0dGhpcy5xdWF0ZXJuaW9uLnNldCggMCwgMCwgMCwgMSApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGRpci55IDwgLSAwLjk5OTk5ICkge1xyXG5cclxuXHRcdFx0dGhpcy5xdWF0ZXJuaW9uLnNldCggMSwgMCwgMCwgMCApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRfYXhpcy5zZXQoIGRpci56LCAwLCAtIGRpci54ICkubm9ybWFsaXplKCk7XHJcblxyXG5cdFx0XHRjb25zdCByYWRpYW5zID0gTWF0aC5hY29zKCBkaXIueSApO1xyXG5cclxuXHRcdFx0dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21BeGlzQW5nbGUoIF9heGlzLCByYWRpYW5zICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGxlbmd0aCBvZiB0aGUgaGVscGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCAtIExlbmd0aCBvZiB0aGUgYXJyb3cgaW4gd29ybGQgdW5pdHMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtoZWFkTGVuZ3RoPWxlbmd0aCowLjJdIC0gVGhlIGxlbmd0aCBvZiB0aGUgaGVhZCBvZiB0aGUgYXJyb3cuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtoZWFkV2lkdGg9aGVhZExlbmd0aCowLjJdIC0gVGhlIHdpZHRoIG9mIHRoZSBoZWFkIG9mIHRoZSBhcnJvdy5cclxuXHQgKi9cclxuXHRzZXRMZW5ndGgoIGxlbmd0aCwgaGVhZExlbmd0aCA9IGxlbmd0aCAqIDAuMiwgaGVhZFdpZHRoID0gaGVhZExlbmd0aCAqIDAuMiApIHtcclxuXHJcblx0XHR0aGlzLmxpbmUuc2NhbGUuc2V0KCAxLCBNYXRoLm1heCggMC4wMDAxLCBsZW5ndGggLSBoZWFkTGVuZ3RoICksIDEgKTsgLy8gc2VlICMxNzQ1OFxyXG5cdFx0dGhpcy5saW5lLnVwZGF0ZU1hdHJpeCgpO1xyXG5cclxuXHRcdHRoaXMuY29uZS5zY2FsZS5zZXQoIGhlYWRXaWR0aCwgaGVhZExlbmd0aCwgaGVhZFdpZHRoICk7XHJcblx0XHR0aGlzLmNvbmUucG9zaXRpb24ueSA9IGxlbmd0aDtcclxuXHRcdHRoaXMuY29uZS51cGRhdGVNYXRyaXgoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBjb2xvciBvZiB0aGUgaGVscGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ8Q29sb3J8c3RyaW5nfSBjb2xvciAtIFRoZSBjb2xvciB0byBzZXQuXHJcblx0ICovXHJcblx0c2V0Q29sb3IoIGNvbG9yICkge1xyXG5cclxuXHRcdHRoaXMubGluZS5tYXRlcmlhbC5jb2xvci5zZXQoIGNvbG9yICk7XHJcblx0XHR0aGlzLmNvbmUubWF0ZXJpYWwuY29sb3Iuc2V0KCBjb2xvciApO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UsIGZhbHNlICk7XHJcblxyXG5cdFx0dGhpcy5saW5lLmNvcHkoIHNvdXJjZS5saW5lICk7XHJcblx0XHR0aGlzLmNvbmUuY29weSggc291cmNlLmNvbmUgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGcmVlcyB0aGUgR1BVLXJlbGF0ZWQgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGlzIGluc3RhbmNlLiBDYWxsIHRoaXNcclxuXHQgKiBtZXRob2Qgd2hlbmV2ZXIgdGhpcyBpbnN0YW5jZSBpcyBubyBsb25nZXIgdXNlZCBpbiB5b3VyIGFwcC5cclxuXHQgKi9cclxuXHRkaXNwb3NlKCkge1xyXG5cclxuXHRcdHRoaXMubGluZS5nZW9tZXRyeS5kaXNwb3NlKCk7XHJcblx0XHR0aGlzLmxpbmUubWF0ZXJpYWwuZGlzcG9zZSgpO1xyXG5cdFx0dGhpcy5jb25lLmdlb21ldHJ5LmRpc3Bvc2UoKTtcclxuXHRcdHRoaXMuY29uZS5tYXRlcmlhbC5kaXNwb3NlKCk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IEFycm93SGVscGVyIH07XHJcbiIsImltcG9ydCB7IExpbmVTZWdtZW50cyB9IGZyb20gJy4uL29iamVjdHMvTGluZVNlZ21lbnRzLmpzJztcclxuaW1wb3J0IHsgTGluZUJhc2ljTWF0ZXJpYWwgfSBmcm9tICcuLi9tYXRlcmlhbHMvTGluZUJhc2ljTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5pbXBvcnQgeyBCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyR2VvbWV0cnkuanMnO1xyXG5pbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uL21hdGgvQ29sb3IuanMnO1xyXG5cclxuLyoqXHJcbiAqIEFuIGF4aXMgb2JqZWN0IHRvIHZpc3VhbGl6ZSB0aGUgMyBheGVzIGluIGEgc2ltcGxlIHdheS5cclxuICogVGhlIFggYXhpcyBpcyByZWQuIFRoZSBZIGF4aXMgaXMgZ3JlZW4uIFRoZSBaIGF4aXMgaXMgYmx1ZS5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgYXhlc0hlbHBlciA9IG5ldyBUSFJFRS5BeGVzSGVscGVyKCA1ICk7XHJcbiAqIHNjZW5lLmFkZCggYXhlc0hlbHBlciApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIExpbmVTZWdtZW50c1xyXG4gKi9cclxuY2xhc3MgQXhlc0hlbHBlciBleHRlbmRzIExpbmVTZWdtZW50cyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYXhlcyBoZWxwZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3NpemU9MV0gLSBTaXplIG9mIHRoZSBsaW5lcyByZXByZXNlbnRpbmcgdGhlIGF4ZXMuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHNpemUgPSAxICkge1xyXG5cclxuXHRcdGNvbnN0IHZlcnRpY2VzID0gW1xyXG5cdFx0XHQwLCAwLCAwLFx0c2l6ZSwgMCwgMCxcclxuXHRcdFx0MCwgMCwgMCxcdDAsIHNpemUsIDAsXHJcblx0XHRcdDAsIDAsIDAsXHQwLCAwLCBzaXplXHJcblx0XHRdO1xyXG5cclxuXHRcdGNvbnN0IGNvbG9ycyA9IFtcclxuXHRcdFx0MSwgMCwgMCxcdDEsIDAuNiwgMCxcclxuXHRcdFx0MCwgMSwgMCxcdDAuNiwgMSwgMCxcclxuXHRcdFx0MCwgMCwgMSxcdDAsIDAuNiwgMVxyXG5cdFx0XTtcclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xyXG5cdFx0Z2VvbWV0cnkuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xyXG5cdFx0Z2VvbWV0cnkuc2V0QXR0cmlidXRlKCAnY29sb3InLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAzICkgKTtcclxuXHJcblx0XHRjb25zdCBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyB2ZXJ0ZXhDb2xvcnM6IHRydWUsIHRvbmVNYXBwZWQ6IGZhbHNlIH0gKTtcclxuXHJcblx0XHRzdXBlciggZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ0F4ZXNIZWxwZXInO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgdGhlIGNvbG9ycyBvZiB0aGUgYXhlcyBoZWxwZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcnxDb2xvcnxzdHJpbmd9IHhBeGlzQ29sb3IgLSBUaGUgY29sb3IgZm9yIHRoZSB4IGF4aXMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ8Q29sb3J8c3RyaW5nfSB5QXhpc0NvbG9yIC0gVGhlIGNvbG9yIGZvciB0aGUgeSBheGlzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfENvbG9yfHN0cmluZ30gekF4aXNDb2xvciAtIFRoZSBjb2xvciBmb3IgdGhlIHogYXhpcy5cclxuXHQgKiBAcmV0dXJuIHtBeGVzSGVscGVyfSBBIHJlZmVyZW5jZSB0byB0aGlzIGF4ZXMgaGVscGVyLlxyXG5cdCAqL1xyXG5cdHNldENvbG9ycyggeEF4aXNDb2xvciwgeUF4aXNDb2xvciwgekF4aXNDb2xvciApIHtcclxuXHJcblx0XHRjb25zdCBjb2xvciA9IG5ldyBDb2xvcigpO1xyXG5cdFx0Y29uc3QgYXJyYXkgPSB0aGlzLmdlb21ldHJ5LmF0dHJpYnV0ZXMuY29sb3IuYXJyYXk7XHJcblxyXG5cdFx0Y29sb3Iuc2V0KCB4QXhpc0NvbG9yICk7XHJcblx0XHRjb2xvci50b0FycmF5KCBhcnJheSwgMCApO1xyXG5cdFx0Y29sb3IudG9BcnJheSggYXJyYXksIDMgKTtcclxuXHJcblx0XHRjb2xvci5zZXQoIHlBeGlzQ29sb3IgKTtcclxuXHRcdGNvbG9yLnRvQXJyYXkoIGFycmF5LCA2ICk7XHJcblx0XHRjb2xvci50b0FycmF5KCBhcnJheSwgOSApO1xyXG5cclxuXHRcdGNvbG9yLnNldCggekF4aXNDb2xvciApO1xyXG5cdFx0Y29sb3IudG9BcnJheSggYXJyYXksIDEyICk7XHJcblx0XHRjb2xvci50b0FycmF5KCBhcnJheSwgMTUgKTtcclxuXHJcblx0XHR0aGlzLmdlb21ldHJ5LmF0dHJpYnV0ZXMuY29sb3IubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZyZWVzIHRoZSBHUFUtcmVsYXRlZCByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHRoaXMgaW5zdGFuY2UuIENhbGwgdGhpc1xyXG5cdCAqIG1ldGhvZCB3aGVuZXZlciB0aGlzIGluc3RhbmNlIGlzIG5vIGxvbmdlciB1c2VkIGluIHlvdXIgYXBwLlxyXG5cdCAqL1xyXG5cdGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0dGhpcy5nZW9tZXRyeS5kaXNwb3NlKCk7XHJcblx0XHR0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCB7IEF4ZXNIZWxwZXIgfTtcclxuIiwiaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi8uLi9tYXRoL0NvbG9yLmpzJztcclxuaW1wb3J0IHsgUGF0aCB9IGZyb20gJy4vUGF0aC5qcyc7XHJcbmltcG9ydCB7IFNoYXBlIH0gZnJvbSAnLi9TaGFwZS5qcyc7XHJcbmltcG9ydCB7IFNoYXBlVXRpbHMgfSBmcm9tICcuLi9TaGFwZVV0aWxzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gY29udmVydCBhIHNlcmllcyBvZiBwYXRocyB0byBhbiBhcnJheSBvZlxyXG4gKiBzaGFwZXMuIEl0IGlzIHNwZWNpZmljYWxseSB1c2VkIGluIGNvbnRleHQgb2YgZm9udHMgYW5kIFNWRy5cclxuICovXHJcbmNsYXNzIFNoYXBlUGF0aCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc2hhcGUgcGF0aC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnU2hhcGVQYXRoJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjb2xvciBvZiB0aGUgc2hhcGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0NvbG9yfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcGF0aHMgdGhhdCBoYXZlIGJlZW4gZ2VuZXJhdGVkIGZvciB0aGlzIHNoYXBlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxQYXRoPn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zdWJQYXRocyA9IFtdO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGN1cnJlbnQgcGF0aCB0aGF0IGlzIGJlaW5nIGdlbmVyYXRlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1BhdGh9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY3VycmVudFBhdGggPSBudWxsO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgYSBuZXcgcGF0aCBhbmQgbW92ZXMgaXQgY3VycmVudCBwb2ludCB0byB0aGUgZ2l2ZW4gb25lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeCBjb29yZGluYXRlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHkgY29vcmRpbmF0ZS5cclxuXHQgKiBAcmV0dXJuIHtTaGFwZVBhdGh9IEEgcmVmZXJlbmNlIHRvIHRoaXMgc2hhcGUgcGF0aC5cclxuXHQgKi9cclxuXHRtb3ZlVG8oIHgsIHkgKSB7XHJcblxyXG5cdFx0dGhpcy5jdXJyZW50UGF0aCA9IG5ldyBQYXRoKCk7XHJcblx0XHR0aGlzLnN1YlBhdGhzLnB1c2goIHRoaXMuY3VycmVudFBhdGggKTtcclxuXHRcdHRoaXMuY3VycmVudFBhdGgubW92ZVRvKCB4LCB5ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgTGluZUN1cnZlfSB0byB0aGUgcGF0aCBieSBjb25uZWN0aW5nXHJcblx0ICogdGhlIGN1cnJlbnQgcG9pbnQgd2l0aCB0aGUgZ2l2ZW4gb25lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuXHJcblx0ICogQHJldHVybiB7U2hhcGVQYXRofSBBIHJlZmVyZW5jZSB0byB0aGlzIHNoYXBlIHBhdGguXHJcblx0ICovXHJcblx0bGluZVRvKCB4LCB5ICkge1xyXG5cclxuXHRcdHRoaXMuY3VycmVudFBhdGgubGluZVRvKCB4LCB5ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgUXVhZHJhdGljQmV6aWVyQ3VydmV9IHRvIHRoZSBwYXRoIGJ5IGNvbm5lY3RpbmdcclxuXHQgKiB0aGUgY3VycmVudCBwb2ludCB3aXRoIHRoZSBnaXZlbiBvbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYUNQeCAtIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGNvbnRyb2wgcG9pbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFDUHkgLSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBjb250cm9sIHBvaW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhWCAtIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYVkgLSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuXHJcblx0ICogQHJldHVybiB7U2hhcGVQYXRofSBBIHJlZmVyZW5jZSB0byB0aGlzIHNoYXBlIHBhdGguXHJcblx0ICovXHJcblx0cXVhZHJhdGljQ3VydmVUbyggYUNQeCwgYUNQeSwgYVgsIGFZICkge1xyXG5cclxuXHRcdHRoaXMuY3VycmVudFBhdGgucXVhZHJhdGljQ3VydmVUbyggYUNQeCwgYUNQeSwgYVgsIGFZICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgQ3ViaWNCZXppZXJDdXJ2ZX0gdG8gdGhlIHBhdGggYnkgY29ubmVjdGluZ1xyXG5cdCAqIHRoZSBjdXJyZW50IHBvaW50IHdpdGggdGhlIGdpdmVuIG9uZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhQ1AxeCAtIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFDUDF5IC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYUNQMnggLSBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYUNQMnkgLSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYVggLSBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFZIC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50LlxyXG5cdCAqIEByZXR1cm4ge1NoYXBlUGF0aH0gQSByZWZlcmVuY2UgdG8gdGhpcyBzaGFwZSBwYXRoLlxyXG5cdCAqL1xyXG5cdGJlemllckN1cnZlVG8oIGFDUDF4LCBhQ1AxeSwgYUNQMngsIGFDUDJ5LCBhWCwgYVkgKSB7XHJcblxyXG5cdFx0dGhpcy5jdXJyZW50UGF0aC5iZXppZXJDdXJ2ZVRvKCBhQ1AxeCwgYUNQMXksIGFDUDJ4LCBhQ1AyeSwgYVgsIGFZICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgU3BsaW5lQ3VydmV9IHRvIHRoZSBwYXRoIGJ5IGNvbm5lY3RpbmdcclxuXHQgKiB0aGUgY3VycmVudCBwb2ludCB3aXRoIHRoZSBnaXZlbiBsaXN0IG9mIHBvaW50cy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8VmVjdG9yMj59IHB0cyAtIEFuIGFycmF5IG9mIHBvaW50cyBpbiAyRCBzcGFjZS5cclxuXHQgKiBAcmV0dXJuIHtTaGFwZVBhdGh9IEEgcmVmZXJlbmNlIHRvIHRoaXMgc2hhcGUgcGF0aC5cclxuXHQgKi9cclxuXHRzcGxpbmVUaHJ1KCBwdHMgKSB7XHJcblxyXG5cdFx0dGhpcy5jdXJyZW50UGF0aC5zcGxpbmVUaHJ1KCBwdHMgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb252ZXJ0cyB0aGUgcGF0aHMgaW50byBhbiBhcnJheSBvZiBzaGFwZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IGlzQ0NXIC0gQnkgZGVmYXVsdCBzb2xpZCBzaGFwZXMgYXJlICBkZWZpbmVkIGNsb2Nrd2lzZSAoQ1cpIGFuZCBob2xlcyBhcmUgZGVmaW5lZCBjb3VudGVyY2xvY2t3aXNlIChDQ1cpLlxyXG5cdCAqIElmIHRoaXMgZmxhZyBpcyBzZXQgdG8gYHRydWVgLCB0aGVuIHRob3NlIGFyZSBmbGlwcGVkLlxyXG5cdCAqIEByZXR1cm4ge0FycmF5PFNoYXBlPn0gQW4gYXJyYXkgb2Ygc2hhcGVzLlxyXG5cdCAqL1xyXG5cdHRvU2hhcGVzKCBpc0NDVyApIHtcclxuXHJcblx0XHRmdW5jdGlvbiB0b1NoYXBlc05vSG9sZXMoIGluU3VicGF0aHMgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBzaGFwZXMgPSBbXTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGluU3VicGF0aHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgdG1wUGF0aCA9IGluU3VicGF0aHNbIGkgXTtcclxuXHJcblx0XHRcdFx0Y29uc3QgdG1wU2hhcGUgPSBuZXcgU2hhcGUoKTtcclxuXHRcdFx0XHR0bXBTaGFwZS5jdXJ2ZXMgPSB0bXBQYXRoLmN1cnZlcztcclxuXHJcblx0XHRcdFx0c2hhcGVzLnB1c2goIHRtcFNoYXBlICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gc2hhcGVzO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiBpc1BvaW50SW5zaWRlUG9seWdvbiggaW5QdCwgaW5Qb2x5Z29uICkge1xyXG5cclxuXHRcdFx0Y29uc3QgcG9seUxlbiA9IGluUG9seWdvbi5sZW5ndGg7XHJcblxyXG5cdFx0XHQvLyBpblB0IG9uIHBvbHlnb24gY29udG91ciA9PiBpbW1lZGlhdGUgc3VjY2VzcyAgICBvclxyXG5cdFx0XHQvLyB0b2dnbGluZyBvZiBpbnNpZGUvb3V0c2lkZSBhdCBldmVyeSBzaW5nbGUhIGludGVyc2VjdGlvbiBwb2ludCBvZiBhbiBlZGdlXHJcblx0XHRcdC8vICB3aXRoIHRoZSBob3Jpem9udGFsIGxpbmUgdGhyb3VnaCBpblB0LCBsZWZ0IG9mIGluUHRcclxuXHRcdFx0Ly8gIG5vdCBjb3VudGluZyBsb3dlclkgZW5kcG9pbnRzIG9mIGVkZ2VzIGFuZCB3aG9sZSBlZGdlcyBvbiB0aGF0IGxpbmVcclxuXHRcdFx0bGV0IGluc2lkZSA9IGZhbHNlO1xyXG5cdFx0XHRmb3IgKCBsZXQgcCA9IHBvbHlMZW4gLSAxLCBxID0gMDsgcSA8IHBvbHlMZW47IHAgPSBxICsrICkge1xyXG5cclxuXHRcdFx0XHRsZXQgZWRnZUxvd1B0ID0gaW5Qb2x5Z29uWyBwIF07XHJcblx0XHRcdFx0bGV0IGVkZ2VIaWdoUHQgPSBpblBvbHlnb25bIHEgXTtcclxuXHJcblx0XHRcdFx0bGV0IGVkZ2VEeCA9IGVkZ2VIaWdoUHQueCAtIGVkZ2VMb3dQdC54O1xyXG5cdFx0XHRcdGxldCBlZGdlRHkgPSBlZGdlSGlnaFB0LnkgLSBlZGdlTG93UHQueTtcclxuXHJcblx0XHRcdFx0aWYgKCBNYXRoLmFicyggZWRnZUR5ICkgPiBOdW1iZXIuRVBTSUxPTiApIHtcclxuXHJcblx0XHRcdFx0XHQvLyBub3QgcGFyYWxsZWxcclxuXHRcdFx0XHRcdGlmICggZWRnZUR5IDwgMCApIHtcclxuXHJcblx0XHRcdFx0XHRcdGVkZ2VMb3dQdCA9IGluUG9seWdvblsgcSBdOyBlZGdlRHggPSAtIGVkZ2VEeDtcclxuXHRcdFx0XHRcdFx0ZWRnZUhpZ2hQdCA9IGluUG9seWdvblsgcCBdOyBlZGdlRHkgPSAtIGVkZ2VEeTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aWYgKCAoIGluUHQueSA8IGVkZ2VMb3dQdC55ICkgfHwgKCBpblB0LnkgPiBlZGdlSGlnaFB0LnkgKSApIFx0XHRjb250aW51ZTtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGluUHQueSA9PT0gZWRnZUxvd1B0LnkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIGluUHQueCA9PT0gZWRnZUxvd1B0LnggKVx0XHRyZXR1cm5cdHRydWU7XHRcdC8vIGluUHQgaXMgb24gY29udG91ciA/XHJcblx0XHRcdFx0XHRcdC8vIGNvbnRpbnVlO1x0XHRcdFx0Ly8gbm8gaW50ZXJzZWN0aW9uIG9yIGVkZ2VMb3dQdCA9PiBkb2Vzbid0IGNvdW50ICEhIVxyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCBwZXJwRWRnZSA9IGVkZ2VEeSAqICggaW5QdC54IC0gZWRnZUxvd1B0LnggKSAtIGVkZ2VEeCAqICggaW5QdC55IC0gZWRnZUxvd1B0LnkgKTtcclxuXHRcdFx0XHRcdFx0aWYgKCBwZXJwRWRnZSA9PT0gMCApXHRcdFx0XHRyZXR1cm5cdHRydWU7XHRcdC8vIGluUHQgaXMgb24gY29udG91ciA/XHJcblx0XHRcdFx0XHRcdGlmICggcGVycEVkZ2UgPCAwICkgXHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0XHRcdFx0aW5zaWRlID0gISBpbnNpZGU7XHRcdC8vIHRydWUgaW50ZXJzZWN0aW9uIGxlZnQgb2YgaW5QdFxyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHQvLyBwYXJhbGxlbCBvciBjb2xsaW5lYXJcclxuXHRcdFx0XHRcdGlmICggaW5QdC55ICE9PSBlZGdlTG93UHQueSApIFx0XHRjb250aW51ZTtcdFx0XHQvLyBwYXJhbGxlbFxyXG5cdFx0XHRcdFx0Ly8gZWRnZSBsaWVzIG9uIHRoZSBzYW1lIGhvcml6b250YWwgbGluZSBhcyBpblB0XHJcblx0XHRcdFx0XHRpZiAoICggKCBlZGdlSGlnaFB0LnggPD0gaW5QdC54ICkgJiYgKCBpblB0LnggPD0gZWRnZUxvd1B0LnggKSApIHx8XHJcblx0XHRcdFx0XHRcdCAoICggZWRnZUxvd1B0LnggPD0gaW5QdC54ICkgJiYgKCBpblB0LnggPD0gZWRnZUhpZ2hQdC54ICkgKSApXHRcdHJldHVyblx0dHJ1ZTtcdC8vIGluUHQ6IFBvaW50IG9uIGNvbnRvdXIgIVxyXG5cdFx0XHRcdFx0Ly8gY29udGludWU7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVyblx0aW5zaWRlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBpc0Nsb2NrV2lzZSA9IFNoYXBlVXRpbHMuaXNDbG9ja1dpc2U7XHJcblxyXG5cdFx0Y29uc3Qgc3ViUGF0aHMgPSB0aGlzLnN1YlBhdGhzO1xyXG5cdFx0aWYgKCBzdWJQYXRocy5sZW5ndGggPT09IDAgKSByZXR1cm4gW107XHJcblxyXG5cdFx0bGV0IHNvbGlkLCB0bXBQYXRoLCB0bXBTaGFwZTtcclxuXHRcdGNvbnN0IHNoYXBlcyA9IFtdO1xyXG5cclxuXHRcdGlmICggc3ViUGF0aHMubGVuZ3RoID09PSAxICkge1xyXG5cclxuXHRcdFx0dG1wUGF0aCA9IHN1YlBhdGhzWyAwIF07XHJcblx0XHRcdHRtcFNoYXBlID0gbmV3IFNoYXBlKCk7XHJcblx0XHRcdHRtcFNoYXBlLmN1cnZlcyA9IHRtcFBhdGguY3VydmVzO1xyXG5cdFx0XHRzaGFwZXMucHVzaCggdG1wU2hhcGUgKTtcclxuXHRcdFx0cmV0dXJuIHNoYXBlcztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0bGV0IGhvbGVzRmlyc3QgPSAhIGlzQ2xvY2tXaXNlKCBzdWJQYXRoc1sgMCBdLmdldFBvaW50cygpICk7XHJcblx0XHRob2xlc0ZpcnN0ID0gaXNDQ1cgPyAhIGhvbGVzRmlyc3QgOiBob2xlc0ZpcnN0O1xyXG5cclxuXHRcdC8vIGNvbnNvbGUubG9nKFwiSG9sZXMgZmlyc3RcIiwgaG9sZXNGaXJzdCk7XHJcblxyXG5cdFx0Y29uc3QgYmV0dGVyU2hhcGVIb2xlcyA9IFtdO1xyXG5cdFx0Y29uc3QgbmV3U2hhcGVzID0gW107XHJcblx0XHRsZXQgbmV3U2hhcGVIb2xlcyA9IFtdO1xyXG5cdFx0bGV0IG1haW5JZHggPSAwO1xyXG5cdFx0bGV0IHRtcFBvaW50cztcclxuXHJcblx0XHRuZXdTaGFwZXNbIG1haW5JZHggXSA9IHVuZGVmaW5lZDtcclxuXHRcdG5ld1NoYXBlSG9sZXNbIG1haW5JZHggXSA9IFtdO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHN1YlBhdGhzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHR0bXBQYXRoID0gc3ViUGF0aHNbIGkgXTtcclxuXHRcdFx0dG1wUG9pbnRzID0gdG1wUGF0aC5nZXRQb2ludHMoKTtcclxuXHRcdFx0c29saWQgPSBpc0Nsb2NrV2lzZSggdG1wUG9pbnRzICk7XHJcblx0XHRcdHNvbGlkID0gaXNDQ1cgPyAhIHNvbGlkIDogc29saWQ7XHJcblxyXG5cdFx0XHRpZiAoIHNvbGlkICkge1xyXG5cclxuXHRcdFx0XHRpZiAoICggISBob2xlc0ZpcnN0ICkgJiYgKCBuZXdTaGFwZXNbIG1haW5JZHggXSApIClcdG1haW5JZHggKys7XHJcblxyXG5cdFx0XHRcdG5ld1NoYXBlc1sgbWFpbklkeCBdID0geyBzOiBuZXcgU2hhcGUoKSwgcDogdG1wUG9pbnRzIH07XHJcblx0XHRcdFx0bmV3U2hhcGVzWyBtYWluSWR4IF0ucy5jdXJ2ZXMgPSB0bXBQYXRoLmN1cnZlcztcclxuXHJcblx0XHRcdFx0aWYgKCBob2xlc0ZpcnN0IClcdG1haW5JZHggKys7XHJcblx0XHRcdFx0bmV3U2hhcGVIb2xlc1sgbWFpbklkeCBdID0gW107XHJcblxyXG5cdFx0XHRcdC8vY29uc29sZS5sb2coJ2N3JywgaSk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRuZXdTaGFwZUhvbGVzWyBtYWluSWR4IF0ucHVzaCggeyBoOiB0bXBQYXRoLCBwOiB0bXBQb2ludHNbIDAgXSB9ICk7XHJcblxyXG5cdFx0XHRcdC8vY29uc29sZS5sb2coJ2NjdycsIGkpO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBvbmx5IEhvbGVzPyAtPiBwcm9iYWJseSBhbGwgU2hhcGVzIHdpdGggd3Jvbmcgb3JpZW50YXRpb25cclxuXHRcdGlmICggISBuZXdTaGFwZXNbIDAgXSApXHRyZXR1cm5cdHRvU2hhcGVzTm9Ib2xlcyggc3ViUGF0aHMgKTtcclxuXHJcblxyXG5cdFx0aWYgKCBuZXdTaGFwZXMubGVuZ3RoID4gMSApIHtcclxuXHJcblx0XHRcdGxldCBhbWJpZ3VvdXMgPSBmYWxzZTtcclxuXHRcdFx0bGV0IHRvQ2hhbmdlID0gMDtcclxuXHJcblx0XHRcdGZvciAoIGxldCBzSWR4ID0gMCwgc0xlbiA9IG5ld1NoYXBlcy5sZW5ndGg7IHNJZHggPCBzTGVuOyBzSWR4ICsrICkge1xyXG5cclxuXHRcdFx0XHRiZXR0ZXJTaGFwZUhvbGVzWyBzSWR4IF0gPSBbXTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGZvciAoIGxldCBzSWR4ID0gMCwgc0xlbiA9IG5ld1NoYXBlcy5sZW5ndGg7IHNJZHggPCBzTGVuOyBzSWR4ICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBzaG8gPSBuZXdTaGFwZUhvbGVzWyBzSWR4IF07XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBoSWR4ID0gMDsgaElkeCA8IHNoby5sZW5ndGg7IGhJZHggKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgaG8gPSBzaG9bIGhJZHggXTtcclxuXHRcdFx0XHRcdGxldCBob2xlX3VuYXNzaWduZWQgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHRcdGZvciAoIGxldCBzMklkeCA9IDA7IHMySWR4IDwgbmV3U2hhcGVzLmxlbmd0aDsgczJJZHggKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIGlzUG9pbnRJbnNpZGVQb2x5Z29uKCBoby5wLCBuZXdTaGFwZXNbIHMySWR4IF0ucCApICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoIHNJZHggIT09IHMySWR4IClcdHRvQ2hhbmdlICsrO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoIGhvbGVfdW5hc3NpZ25lZCApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRob2xlX3VuYXNzaWduZWQgPSBmYWxzZTtcclxuXHRcdFx0XHRcdFx0XHRcdGJldHRlclNoYXBlSG9sZXNbIHMySWR4IF0ucHVzaCggaG8gKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRhbWJpZ3VvdXMgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGlmICggaG9sZV91bmFzc2lnbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdFx0YmV0dGVyU2hhcGVIb2xlc1sgc0lkeCBdLnB1c2goIGhvICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHRvQ2hhbmdlID4gMCAmJiBhbWJpZ3VvdXMgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0XHRuZXdTaGFwZUhvbGVzID0gYmV0dGVyU2hhcGVIb2xlcztcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0bGV0IHRtcEhvbGVzO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBuZXdTaGFwZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHR0bXBTaGFwZSA9IG5ld1NoYXBlc1sgaSBdLnM7XHJcblx0XHRcdHNoYXBlcy5wdXNoKCB0bXBTaGFwZSApO1xyXG5cdFx0XHR0bXBIb2xlcyA9IG5ld1NoYXBlSG9sZXNbIGkgXTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBqID0gMCwgamwgPSB0bXBIb2xlcy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcclxuXHJcblx0XHRcdFx0dG1wU2hhcGUuaG9sZXMucHVzaCggdG1wSG9sZXNbIGogXS5oICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vY29uc29sZS5sb2coXCJzaGFwZVwiLCBzaGFwZXMpO1xyXG5cclxuXHRcdHJldHVybiBzaGFwZXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBTaGFwZVBhdGggfTtcclxuIiwiaW1wb3J0IHsgRXZlbnREaXNwYXRjaGVyIH0gZnJvbSAnLi4vY29yZS9FdmVudERpc3BhdGNoZXIuanMnO1xyXG5cclxuLyoqXHJcbiAqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGNvbnRyb2xzLlxyXG4gKlxyXG4gKiBAYWJzdHJhY3RcclxuICogQGF1Z21lbnRzIEV2ZW50RGlzcGF0Y2hlclxyXG4gKi9cclxuY2xhc3MgQ29udHJvbHMgZXh0ZW5kcyBFdmVudERpc3BhdGNoZXIge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGNvbnRyb2xzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3QzRH0gb2JqZWN0IC0gVGhlIG9iamVjdCB0aGF0IGlzIG1hbmFnZWQgYnkgdGhlIGNvbnRyb2xzLlxyXG5cdCAqIEBwYXJhbSB7P0hUTUxET01FbGVtZW50fSBkb21FbGVtZW50IC0gVGhlIEhUTUwgZWxlbWVudCB1c2VkIGZvciBldmVudCBsaXN0ZW5lcnMuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG9iamVjdCwgZG9tRWxlbWVudCA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBvYmplY3QgdGhhdCBpcyBtYW5hZ2VkIGJ5IHRoZSBjb250cm9scy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0M0R9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMub2JqZWN0ID0gb2JqZWN0O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIEhUTUwgZWxlbWVudCB1c2VkIGZvciBldmVudCBsaXN0ZW5lcnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9IVE1MRE9NRWxlbWVudH1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kb21FbGVtZW50ID0gZG9tRWxlbWVudDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIGNvbnRyb2xzIHJlc3BvbmRzIHRvIHVzZXIgaW5wdXQgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmVuYWJsZWQgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGludGVybmFsIHN0YXRlIG9mIHRoZSBjb250cm9scy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgLTFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zdGF0ZSA9IC0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgb2JqZWN0IGRlZmluZXMgdGhlIGtleWJvYXJkIGlucHV0IG9mIHRoZSBjb250cm9scy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmtleXMgPSB7fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgb2JqZWN0IGRlZmluZXMgd2hhdCB0eXBlIG9mIGFjdGlvbnMgYXJlIGFzc2lnbmVkIHRvIHRoZSBhdmFpbGFibGUgbW91c2UgYnV0dG9ucy5cclxuXHRcdCAqIEl0IGRlcGVuZHMgb24gdGhlIGNvbnRyb2wgaW1wbGVtZW50YXRpb24gd2hhdCBraW5kIG9mIG1vdXNlIGJ1dHRvbnMgYW5kIGFjdGlvbnMgYXJlIHN1cHBvcnRlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7e0xFRlQ6ID9udW1iZXIsIE1JRERMRTogP251bWJlciwgUklHSFQ6ID9udW1iZXJ9fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1vdXNlQnV0dG9ucyA9IHsgTEVGVDogbnVsbCwgTUlERExFOiBudWxsLCBSSUdIVDogbnVsbCB9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBvYmplY3QgZGVmaW5lcyB3aGF0IHR5cGUgb2YgYWN0aW9ucyBhcmUgYXNzaWduZWQgdG8gd2hhdCBraW5kIG9mIHRvdWNoIGludGVyYWN0aW9uLlxyXG5cdFx0ICogSXQgZGVwZW5kcyBvbiB0aGUgY29udHJvbCBpbXBsZW1lbnRhdGlvbiB3aGF0IGtpbmQgb2YgdG91Y2ggaW50ZXJhY3Rpb24gYW5kIGFjdGlvbnMgYXJlIHN1cHBvcnRlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7e09ORTogP251bWJlciwgVFdPOiA/bnVtYmVyfX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50b3VjaGVzID0geyBPTkU6IG51bGwsIFRXTzogbnVsbCB9O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbm5lY3RzIHRoZSBjb250cm9scyB0byB0aGUgRE9NLiBUaGlzIG1ldGhvZCBoYXMgc28gY2FsbGVkIFwic2lkZSBlZmZlY3RzXCIgc2luY2VcclxuXHQgKiBpdCBhZGRzIHRoZSBtb2R1bGUncyBldmVudCBsaXN0ZW5lcnMgdG8gdGhlIERPTS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7SFRNTERPTUVsZW1lbnR9IGVsZW1lbnQgLSBUaGUgRE9NIGVsZW1lbnQgdG8gY29ubmVjdCB0by5cclxuXHQgKi9cclxuXHRjb25uZWN0KCBlbGVtZW50ICkge1xyXG5cclxuXHRcdGlmICggZWxlbWVudCA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ29udHJvbHM6IGNvbm5lY3QoKSBub3cgcmVxdWlyZXMgYW4gZWxlbWVudC4nICk7IC8vIEBkZXByZWNhdGVkLCB0aGUgd2FybmluZyBjYW4gYmUgcmVtb3ZlZCB3aXRoIHIxODVcclxuXHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMuZG9tRWxlbWVudCAhPT0gbnVsbCApIHRoaXMuZGlzY29ubmVjdCgpO1xyXG5cclxuXHRcdHRoaXMuZG9tRWxlbWVudCA9IGVsZW1lbnQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGlzY29ubmVjdHMgdGhlIGNvbnRyb2xzIGZyb20gdGhlIERPTS5cclxuXHQgKi9cclxuXHRkaXNjb25uZWN0KCkge31cclxuXHJcblx0LyoqXHJcblx0ICogQ2FsbCB0aGlzIG1ldGhvZCBpZiB5b3Ugbm8gbG9uZ2VyIHdhbnQgdXNlIHRvIHRoZSBjb250cm9scy4gSXQgZnJlZXMgYWxsIGludGVybmFsXHJcblx0ICogcmVzb3VyY2VzIGFuZCByZW1vdmVzIGFsbCBldmVudCBsaXN0ZW5lcnMuXHJcblx0ICovXHJcblx0ZGlzcG9zZSgpIHt9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnRyb2xzIHNob3VsZCBpbXBsZW1lbnQgdGhpcyBtZXRob2QgaWYgdGhleSBoYXZlIHRvIHVwZGF0ZSB0aGVpciBpbnRlcm5hbCBzdGF0ZVxyXG5cdCAqIHBlciBzaW11bGF0aW9uIHN0ZXAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2RlbHRhXSAtIFRoZSB0aW1lIGRlbHRhIGluIHNlY29uZHMuXHJcblx0ICovXHJcblx0dXBkYXRlKCAvKiBkZWx0YSAqLyApIHt9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBDb250cm9scyB9O1xyXG4iLCJpbXBvcnQgeyBBbHBoYUZvcm1hdCwgTHVtaW5hbmNlRm9ybWF0LCBMdW1pbmFuY2VBbHBoYUZvcm1hdCwgUmVkRm9ybWF0LCBSZWRJbnRlZ2VyRm9ybWF0LCBSR0Zvcm1hdCwgUkdJbnRlZ2VyRm9ybWF0LCBSR0JGb3JtYXQsIFJHQkFGb3JtYXQsIFJHQkFJbnRlZ2VyRm9ybWF0LCBSR0JfUzNUQ19EWFQxX0Zvcm1hdCwgUkdCQV9TM1RDX0RYVDFfRm9ybWF0LCBSR0JBX1MzVENfRFhUM19Gb3JtYXQsIFJHQkFfUzNUQ19EWFQ1X0Zvcm1hdCwgUkdCX1BWUlRDXzJCUFBWMV9Gb3JtYXQsIFJHQkFfUFZSVENfMkJQUFYxX0Zvcm1hdCwgUkdCX1BWUlRDXzRCUFBWMV9Gb3JtYXQsIFJHQkFfUFZSVENfNEJQUFYxX0Zvcm1hdCwgUkdCX0VUQzFfRm9ybWF0LCBSR0JfRVRDMl9Gb3JtYXQsIFJHQkFfRVRDMl9FQUNfRm9ybWF0LCBSR0JBX0FTVENfNHg0X0Zvcm1hdCwgUkdCQV9BU1RDXzV4NF9Gb3JtYXQsIFJHQkFfQVNUQ181eDVfRm9ybWF0LCBSR0JBX0FTVENfNng1X0Zvcm1hdCwgUkdCQV9BU1RDXzZ4Nl9Gb3JtYXQsIFJHQkFfQVNUQ184eDVfRm9ybWF0LCBSR0JBX0FTVENfOHg2X0Zvcm1hdCwgUkdCQV9BU1RDXzh4OF9Gb3JtYXQsIFJHQkFfQVNUQ18xMHg1X0Zvcm1hdCwgUkdCQV9BU1RDXzEweDZfRm9ybWF0LCBSR0JBX0FTVENfMTB4OF9Gb3JtYXQsIFJHQkFfQVNUQ18xMHgxMF9Gb3JtYXQsIFJHQkFfQVNUQ18xMngxMF9Gb3JtYXQsIFJHQkFfQVNUQ18xMngxMl9Gb3JtYXQsIFJHQkFfQlBUQ19Gb3JtYXQsIFJHQl9CUFRDX1NJR05FRF9Gb3JtYXQsIFJHQl9CUFRDX1VOU0lHTkVEX0Zvcm1hdCwgUkVEX1JHVEMxX0Zvcm1hdCwgU0lHTkVEX1JFRF9SR1RDMV9Gb3JtYXQsIFJFRF9HUkVFTl9SR1RDMl9Gb3JtYXQsIFNJR05FRF9SRURfR1JFRU5fUkdUQzJfRm9ybWF0LCBVbnNpZ25lZEJ5dGVUeXBlLCBCeXRlVHlwZSwgVW5zaWduZWRTaG9ydFR5cGUsIFNob3J0VHlwZSwgSGFsZkZsb2F0VHlwZSwgVW5zaWduZWRTaG9ydDQ0NDRUeXBlLCBVbnNpZ25lZFNob3J0NTU1MVR5cGUsIFVuc2lnbmVkSW50VHlwZSwgSW50VHlwZSwgRmxvYXRUeXBlLCBVbnNpZ25lZEludDU5OTlUeXBlIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBTY2FsZXMgdGhlIHRleHR1cmUgYXMgbGFyZ2UgYXMgcG9zc2libGUgd2l0aGluIGl0cyBzdXJmYWNlIHdpdGhvdXQgY3JvcHBpbmdcclxuICogb3Igc3RyZXRjaGluZyB0aGUgdGV4dHVyZS4gVGhlIG1ldGhvZCBwcmVzZXJ2ZXMgdGhlIG9yaWdpbmFsIGFzcGVjdCByYXRpbyBvZlxyXG4gKiB0aGUgdGV4dHVyZS4gQWtpbiB0byBDU1MgYG9iamVjdC1maXQ6IGNvbnRhaW5gXHJcbiAqXHJcbiAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gYXNwZWN0IC0gVGhlIHRleHR1cmUncyBhc3BlY3QgcmF0aW8uXHJcbiAqIEByZXR1cm4ge1RleHR1cmV9IFRoZSB1cGRhdGVkIHRleHR1cmUuXHJcbiAqL1xyXG5mdW5jdGlvbiBjb250YWluKCB0ZXh0dXJlLCBhc3BlY3QgKSB7XHJcblxyXG5cdGNvbnN0IGltYWdlQXNwZWN0ID0gKCB0ZXh0dXJlLmltYWdlICYmIHRleHR1cmUuaW1hZ2Uud2lkdGggKSA/IHRleHR1cmUuaW1hZ2Uud2lkdGggLyB0ZXh0dXJlLmltYWdlLmhlaWdodCA6IDE7XHJcblxyXG5cdGlmICggaW1hZ2VBc3BlY3QgPiBhc3BlY3QgKSB7XHJcblxyXG5cdFx0dGV4dHVyZS5yZXBlYXQueCA9IDE7XHJcblx0XHR0ZXh0dXJlLnJlcGVhdC55ID0gaW1hZ2VBc3BlY3QgLyBhc3BlY3Q7XHJcblxyXG5cdFx0dGV4dHVyZS5vZmZzZXQueCA9IDA7XHJcblx0XHR0ZXh0dXJlLm9mZnNldC55ID0gKCAxIC0gdGV4dHVyZS5yZXBlYXQueSApIC8gMjtcclxuXHJcblx0fSBlbHNlIHtcclxuXHJcblx0XHR0ZXh0dXJlLnJlcGVhdC54ID0gYXNwZWN0IC8gaW1hZ2VBc3BlY3Q7XHJcblx0XHR0ZXh0dXJlLnJlcGVhdC55ID0gMTtcclxuXHJcblx0XHR0ZXh0dXJlLm9mZnNldC54ID0gKCAxIC0gdGV4dHVyZS5yZXBlYXQueCApIC8gMjtcclxuXHRcdHRleHR1cmUub2Zmc2V0LnkgPSAwO1xyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiB0ZXh0dXJlO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFNjYWxlcyB0aGUgdGV4dHVyZSB0byB0aGUgc21hbGxlc3QgcG9zc2libGUgc2l6ZSB0byBmaWxsIHRoZSBzdXJmYWNlLCBsZWF2aW5nXHJcbiAqIG5vIGVtcHR5IHNwYWNlLiBUaGUgbWV0aG9kIHByZXNlcnZlcyB0aGUgb3JpZ2luYWwgYXNwZWN0IHJhdGlvIG9mIHRoZSB0ZXh0dXJlLlxyXG4gKiBBa2luIHRvIENTUyBgb2JqZWN0LWZpdDogY292ZXJgLlxyXG4gKlxyXG4gKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IGFzcGVjdCAtIFRoZSB0ZXh0dXJlJ3MgYXNwZWN0IHJhdGlvLlxyXG4gKiBAcmV0dXJuIHtUZXh0dXJlfSBUaGUgdXBkYXRlZCB0ZXh0dXJlLlxyXG4gKi9cclxuZnVuY3Rpb24gY292ZXIoIHRleHR1cmUsIGFzcGVjdCApIHtcclxuXHJcblx0Y29uc3QgaW1hZ2VBc3BlY3QgPSAoIHRleHR1cmUuaW1hZ2UgJiYgdGV4dHVyZS5pbWFnZS53aWR0aCApID8gdGV4dHVyZS5pbWFnZS53aWR0aCAvIHRleHR1cmUuaW1hZ2UuaGVpZ2h0IDogMTtcclxuXHJcblx0aWYgKCBpbWFnZUFzcGVjdCA+IGFzcGVjdCApIHtcclxuXHJcblx0XHR0ZXh0dXJlLnJlcGVhdC54ID0gYXNwZWN0IC8gaW1hZ2VBc3BlY3Q7XHJcblx0XHR0ZXh0dXJlLnJlcGVhdC55ID0gMTtcclxuXHJcblx0XHR0ZXh0dXJlLm9mZnNldC54ID0gKCAxIC0gdGV4dHVyZS5yZXBlYXQueCApIC8gMjtcclxuXHRcdHRleHR1cmUub2Zmc2V0LnkgPSAwO1xyXG5cclxuXHR9IGVsc2Uge1xyXG5cclxuXHRcdHRleHR1cmUucmVwZWF0LnggPSAxO1xyXG5cdFx0dGV4dHVyZS5yZXBlYXQueSA9IGltYWdlQXNwZWN0IC8gYXNwZWN0O1xyXG5cclxuXHRcdHRleHR1cmUub2Zmc2V0LnggPSAwO1xyXG5cdFx0dGV4dHVyZS5vZmZzZXQueSA9ICggMSAtIHRleHR1cmUucmVwZWF0LnkgKSAvIDI7XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIHRleHR1cmU7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQ29uZmlndXJlcyB0aGUgdGV4dHVyZSB0byB0aGUgZGVmYXVsdCB0cmFuc2Zvcm1hdGlvbi4gQWtpbiB0byBDU1MgYG9iamVjdC1maXQ6IGZpbGxgLlxyXG4gKlxyXG4gKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZS5cclxuICogQHJldHVybiB7VGV4dHVyZX0gVGhlIHVwZGF0ZWQgdGV4dHVyZS5cclxuICovXHJcbmZ1bmN0aW9uIGZpbGwoIHRleHR1cmUgKSB7XHJcblxyXG5cdHRleHR1cmUucmVwZWF0LnggPSAxO1xyXG5cdHRleHR1cmUucmVwZWF0LnkgPSAxO1xyXG5cclxuXHR0ZXh0dXJlLm9mZnNldC54ID0gMDtcclxuXHR0ZXh0dXJlLm9mZnNldC55ID0gMDtcclxuXHJcblx0cmV0dXJuIHRleHR1cmU7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogRGV0ZXJtaW5lcyBob3cgbWFueSBieXRlcyBtdXN0IGJlIHVzZWQgdG8gcmVwcmVzZW50IHRoZSB0ZXh0dXJlLlxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIHRleHR1cmUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSB0ZXh0dXJlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gZm9ybWF0IC0gVGhlIHRleHR1cmUncyBmb3JtYXQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB0eXBlIC0gVGhlIHRleHR1cmUncyB0eXBlLlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBieXRlIGxlbmd0aC5cclxuICovXHJcbmZ1bmN0aW9uIGdldEJ5dGVMZW5ndGgoIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSApIHtcclxuXHJcblx0Y29uc3QgdHlwZUJ5dGVMZW5ndGggPSBnZXRUZXh0dXJlVHlwZUJ5dGVMZW5ndGgoIHR5cGUgKTtcclxuXHJcblx0c3dpdGNoICggZm9ybWF0ICkge1xyXG5cclxuXHRcdC8vIGh0dHBzOi8vcmVnaXN0cnkua2hyb25vcy5vcmcvT3BlbkdMLVJlZnBhZ2VzL2VzMy4wL2h0bWwvZ2xUZXhJbWFnZTJELnhodG1sXHJcblx0XHRjYXNlIEFscGhhRm9ybWF0OlxyXG5cdFx0XHRyZXR1cm4gd2lkdGggKiBoZWlnaHQ7XHJcblx0XHRjYXNlIEx1bWluYW5jZUZvcm1hdDpcclxuXHRcdFx0cmV0dXJuIHdpZHRoICogaGVpZ2h0O1xyXG5cdFx0Y2FzZSBMdW1pbmFuY2VBbHBoYUZvcm1hdDpcclxuXHRcdFx0cmV0dXJuIHdpZHRoICogaGVpZ2h0ICogMjtcclxuXHRcdGNhc2UgUmVkRm9ybWF0OlxyXG5cdFx0XHRyZXR1cm4gKCAoIHdpZHRoICogaGVpZ2h0ICkgLyB0eXBlQnl0ZUxlbmd0aC5jb21wb25lbnRzICkgKiB0eXBlQnl0ZUxlbmd0aC5ieXRlTGVuZ3RoO1xyXG5cdFx0Y2FzZSBSZWRJbnRlZ2VyRm9ybWF0OlxyXG5cdFx0XHRyZXR1cm4gKCAoIHdpZHRoICogaGVpZ2h0ICkgLyB0eXBlQnl0ZUxlbmd0aC5jb21wb25lbnRzICkgKiB0eXBlQnl0ZUxlbmd0aC5ieXRlTGVuZ3RoO1xyXG5cdFx0Y2FzZSBSR0Zvcm1hdDpcclxuXHRcdFx0cmV0dXJuICggKCB3aWR0aCAqIGhlaWdodCAqIDIgKSAvIHR5cGVCeXRlTGVuZ3RoLmNvbXBvbmVudHMgKSAqIHR5cGVCeXRlTGVuZ3RoLmJ5dGVMZW5ndGg7XHJcblx0XHRjYXNlIFJHSW50ZWdlckZvcm1hdDpcclxuXHRcdFx0cmV0dXJuICggKCB3aWR0aCAqIGhlaWdodCAqIDIgKSAvIHR5cGVCeXRlTGVuZ3RoLmNvbXBvbmVudHMgKSAqIHR5cGVCeXRlTGVuZ3RoLmJ5dGVMZW5ndGg7XHJcblx0XHRjYXNlIFJHQkZvcm1hdDpcclxuXHRcdFx0cmV0dXJuICggKCB3aWR0aCAqIGhlaWdodCAqIDMgKSAvIHR5cGVCeXRlTGVuZ3RoLmNvbXBvbmVudHMgKSAqIHR5cGVCeXRlTGVuZ3RoLmJ5dGVMZW5ndGg7XHJcblx0XHRjYXNlIFJHQkFGb3JtYXQ6XHJcblx0XHRcdHJldHVybiAoICggd2lkdGggKiBoZWlnaHQgKiA0ICkgLyB0eXBlQnl0ZUxlbmd0aC5jb21wb25lbnRzICkgKiB0eXBlQnl0ZUxlbmd0aC5ieXRlTGVuZ3RoO1xyXG5cdFx0Y2FzZSBSR0JBSW50ZWdlckZvcm1hdDpcclxuXHRcdFx0cmV0dXJuICggKCB3aWR0aCAqIGhlaWdodCAqIDQgKSAvIHR5cGVCeXRlTGVuZ3RoLmNvbXBvbmVudHMgKSAqIHR5cGVCeXRlTGVuZ3RoLmJ5dGVMZW5ndGg7XHJcblxyXG5cdFx0Ly8gaHR0cHM6Ly9yZWdpc3RyeS5raHJvbm9zLm9yZy93ZWJnbC9leHRlbnNpb25zL1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjX3NyZ2IvXHJcblx0XHRjYXNlIFJHQl9TM1RDX0RYVDFfRm9ybWF0OlxyXG5cdFx0Y2FzZSBSR0JBX1MzVENfRFhUMV9Gb3JtYXQ6XHJcblx0XHRcdHJldHVybiBNYXRoLmZsb29yKCAoIHdpZHRoICsgMyApIC8gNCApICogTWF0aC5mbG9vciggKCBoZWlnaHQgKyAzICkgLyA0ICkgKiA4O1xyXG5cdFx0Y2FzZSBSR0JBX1MzVENfRFhUM19Gb3JtYXQ6XHJcblx0XHRjYXNlIFJHQkFfUzNUQ19EWFQ1X0Zvcm1hdDpcclxuXHRcdFx0cmV0dXJuIE1hdGguZmxvb3IoICggd2lkdGggKyAzICkgLyA0ICkgKiBNYXRoLmZsb29yKCAoIGhlaWdodCArIDMgKSAvIDQgKSAqIDE2O1xyXG5cclxuXHRcdC8vIGh0dHBzOi8vcmVnaXN0cnkua2hyb25vcy5vcmcvd2ViZ2wvZXh0ZW5zaW9ucy9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMvXHJcblx0XHRjYXNlIFJHQl9QVlJUQ18yQlBQVjFfRm9ybWF0OlxyXG5cdFx0Y2FzZSBSR0JBX1BWUlRDXzJCUFBWMV9Gb3JtYXQ6XHJcblx0XHRcdHJldHVybiAoIE1hdGgubWF4KCB3aWR0aCwgMTYgKSAqIE1hdGgubWF4KCBoZWlnaHQsIDggKSApIC8gNDtcclxuXHRcdGNhc2UgUkdCX1BWUlRDXzRCUFBWMV9Gb3JtYXQ6XHJcblx0XHRjYXNlIFJHQkFfUFZSVENfNEJQUFYxX0Zvcm1hdDpcclxuXHRcdFx0cmV0dXJuICggTWF0aC5tYXgoIHdpZHRoLCA4ICkgKiBNYXRoLm1heCggaGVpZ2h0LCA4ICkgKSAvIDI7XHJcblxyXG5cdFx0Ly8gaHR0cHM6Ly9yZWdpc3RyeS5raHJvbm9zLm9yZy93ZWJnbC9leHRlbnNpb25zL1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9ldGMvXHJcblx0XHRjYXNlIFJHQl9FVEMxX0Zvcm1hdDpcclxuXHRcdGNhc2UgUkdCX0VUQzJfRm9ybWF0OlxyXG5cdFx0XHRyZXR1cm4gTWF0aC5mbG9vciggKCB3aWR0aCArIDMgKSAvIDQgKSAqIE1hdGguZmxvb3IoICggaGVpZ2h0ICsgMyApIC8gNCApICogODtcclxuXHRcdGNhc2UgUkdCQV9FVEMyX0VBQ19Gb3JtYXQ6XHJcblx0XHRcdHJldHVybiBNYXRoLmZsb29yKCAoIHdpZHRoICsgMyApIC8gNCApICogTWF0aC5mbG9vciggKCBoZWlnaHQgKyAzICkgLyA0ICkgKiAxNjtcclxuXHJcblx0XHQvLyBodHRwczovL3JlZ2lzdHJ5Lmtocm9ub3Mub3JnL3dlYmdsL2V4dGVuc2lvbnMvV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2FzdGMvXHJcblx0XHRjYXNlIFJHQkFfQVNUQ180eDRfRm9ybWF0OlxyXG5cdFx0XHRyZXR1cm4gTWF0aC5mbG9vciggKCB3aWR0aCArIDMgKSAvIDQgKSAqIE1hdGguZmxvb3IoICggaGVpZ2h0ICsgMyApIC8gNCApICogMTY7XHJcblx0XHRjYXNlIFJHQkFfQVNUQ181eDRfRm9ybWF0OlxyXG5cdFx0XHRyZXR1cm4gTWF0aC5mbG9vciggKCB3aWR0aCArIDQgKSAvIDUgKSAqIE1hdGguZmxvb3IoICggaGVpZ2h0ICsgMyApIC8gNCApICogMTY7XHJcblx0XHRjYXNlIFJHQkFfQVNUQ181eDVfRm9ybWF0OlxyXG5cdFx0XHRyZXR1cm4gTWF0aC5mbG9vciggKCB3aWR0aCArIDQgKSAvIDUgKSAqIE1hdGguZmxvb3IoICggaGVpZ2h0ICsgNCApIC8gNSApICogMTY7XHJcblx0XHRjYXNlIFJHQkFfQVNUQ182eDVfRm9ybWF0OlxyXG5cdFx0XHRyZXR1cm4gTWF0aC5mbG9vciggKCB3aWR0aCArIDUgKSAvIDYgKSAqIE1hdGguZmxvb3IoICggaGVpZ2h0ICsgNCApIC8gNSApICogMTY7XHJcblx0XHRjYXNlIFJHQkFfQVNUQ182eDZfRm9ybWF0OlxyXG5cdFx0XHRyZXR1cm4gTWF0aC5mbG9vciggKCB3aWR0aCArIDUgKSAvIDYgKSAqIE1hdGguZmxvb3IoICggaGVpZ2h0ICsgNSApIC8gNiApICogMTY7XHJcblx0XHRjYXNlIFJHQkFfQVNUQ184eDVfRm9ybWF0OlxyXG5cdFx0XHRyZXR1cm4gTWF0aC5mbG9vciggKCB3aWR0aCArIDcgKSAvIDggKSAqIE1hdGguZmxvb3IoICggaGVpZ2h0ICsgNCApIC8gNSApICogMTY7XHJcblx0XHRjYXNlIFJHQkFfQVNUQ184eDZfRm9ybWF0OlxyXG5cdFx0XHRyZXR1cm4gTWF0aC5mbG9vciggKCB3aWR0aCArIDcgKSAvIDggKSAqIE1hdGguZmxvb3IoICggaGVpZ2h0ICsgNSApIC8gNiApICogMTY7XHJcblx0XHRjYXNlIFJHQkFfQVNUQ184eDhfRm9ybWF0OlxyXG5cdFx0XHRyZXR1cm4gTWF0aC5mbG9vciggKCB3aWR0aCArIDcgKSAvIDggKSAqIE1hdGguZmxvb3IoICggaGVpZ2h0ICsgNyApIC8gOCApICogMTY7XHJcblx0XHRjYXNlIFJHQkFfQVNUQ18xMHg1X0Zvcm1hdDpcclxuXHRcdFx0cmV0dXJuIE1hdGguZmxvb3IoICggd2lkdGggKyA5ICkgLyAxMCApICogTWF0aC5mbG9vciggKCBoZWlnaHQgKyA0ICkgLyA1ICkgKiAxNjtcclxuXHRcdGNhc2UgUkdCQV9BU1RDXzEweDZfRm9ybWF0OlxyXG5cdFx0XHRyZXR1cm4gTWF0aC5mbG9vciggKCB3aWR0aCArIDkgKSAvIDEwICkgKiBNYXRoLmZsb29yKCAoIGhlaWdodCArIDUgKSAvIDYgKSAqIDE2O1xyXG5cdFx0Y2FzZSBSR0JBX0FTVENfMTB4OF9Gb3JtYXQ6XHJcblx0XHRcdHJldHVybiBNYXRoLmZsb29yKCAoIHdpZHRoICsgOSApIC8gMTAgKSAqIE1hdGguZmxvb3IoICggaGVpZ2h0ICsgNyApIC8gOCApICogMTY7XHJcblx0XHRjYXNlIFJHQkFfQVNUQ18xMHgxMF9Gb3JtYXQ6XHJcblx0XHRcdHJldHVybiBNYXRoLmZsb29yKCAoIHdpZHRoICsgOSApIC8gMTAgKSAqIE1hdGguZmxvb3IoICggaGVpZ2h0ICsgOSApIC8gMTAgKSAqIDE2O1xyXG5cdFx0Y2FzZSBSR0JBX0FTVENfMTJ4MTBfRm9ybWF0OlxyXG5cdFx0XHRyZXR1cm4gTWF0aC5mbG9vciggKCB3aWR0aCArIDExICkgLyAxMiApICogTWF0aC5mbG9vciggKCBoZWlnaHQgKyA5ICkgLyAxMCApICogMTY7XHJcblx0XHRjYXNlIFJHQkFfQVNUQ18xMngxMl9Gb3JtYXQ6XHJcblx0XHRcdHJldHVybiBNYXRoLmZsb29yKCAoIHdpZHRoICsgMTEgKSAvIDEyICkgKiBNYXRoLmZsb29yKCAoIGhlaWdodCArIDExICkgLyAxMiApICogMTY7XHJcblxyXG5cdFx0Ly8gaHR0cHM6Ly9yZWdpc3RyeS5raHJvbm9zLm9yZy93ZWJnbC9leHRlbnNpb25zL0VYVF90ZXh0dXJlX2NvbXByZXNzaW9uX2JwdGMvXHJcblx0XHRjYXNlIFJHQkFfQlBUQ19Gb3JtYXQ6XHJcblx0XHRjYXNlIFJHQl9CUFRDX1NJR05FRF9Gb3JtYXQ6XHJcblx0XHRjYXNlIFJHQl9CUFRDX1VOU0lHTkVEX0Zvcm1hdDpcclxuXHRcdFx0cmV0dXJuIE1hdGguY2VpbCggd2lkdGggLyA0ICkgKiBNYXRoLmNlaWwoIGhlaWdodCAvIDQgKSAqIDE2O1xyXG5cclxuXHRcdC8vIGh0dHBzOi8vcmVnaXN0cnkua2hyb25vcy5vcmcvd2ViZ2wvZXh0ZW5zaW9ucy9FWFRfdGV4dHVyZV9jb21wcmVzc2lvbl9yZ3RjL1xyXG5cdFx0Y2FzZSBSRURfUkdUQzFfRm9ybWF0OlxyXG5cdFx0Y2FzZSBTSUdORURfUkVEX1JHVEMxX0Zvcm1hdDpcclxuXHRcdFx0cmV0dXJuIE1hdGguY2VpbCggd2lkdGggLyA0ICkgKiBNYXRoLmNlaWwoIGhlaWdodCAvIDQgKSAqIDg7XHJcblx0XHRjYXNlIFJFRF9HUkVFTl9SR1RDMl9Gb3JtYXQ6XHJcblx0XHRjYXNlIFNJR05FRF9SRURfR1JFRU5fUkdUQzJfRm9ybWF0OlxyXG5cdFx0XHRyZXR1cm4gTWF0aC5jZWlsKCB3aWR0aCAvIDQgKSAqIE1hdGguY2VpbCggaGVpZ2h0IC8gNCApICogMTY7XHJcblxyXG5cdH1cclxuXHJcblx0dGhyb3cgbmV3IEVycm9yKFxyXG5cdFx0YFVuYWJsZSB0byBkZXRlcm1pbmUgdGV4dHVyZSBieXRlIGxlbmd0aCBmb3IgJHtmb3JtYXR9IGZvcm1hdC5gLFxyXG5cdCk7XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRUZXh0dXJlVHlwZUJ5dGVMZW5ndGgoIHR5cGUgKSB7XHJcblxyXG5cdHN3aXRjaCAoIHR5cGUgKSB7XHJcblxyXG5cdFx0Y2FzZSBVbnNpZ25lZEJ5dGVUeXBlOlxyXG5cdFx0Y2FzZSBCeXRlVHlwZTpcclxuXHRcdFx0cmV0dXJuIHsgYnl0ZUxlbmd0aDogMSwgY29tcG9uZW50czogMSB9O1xyXG5cdFx0Y2FzZSBVbnNpZ25lZFNob3J0VHlwZTpcclxuXHRcdGNhc2UgU2hvcnRUeXBlOlxyXG5cdFx0Y2FzZSBIYWxmRmxvYXRUeXBlOlxyXG5cdFx0XHRyZXR1cm4geyBieXRlTGVuZ3RoOiAyLCBjb21wb25lbnRzOiAxIH07XHJcblx0XHRjYXNlIFVuc2lnbmVkU2hvcnQ0NDQ0VHlwZTpcclxuXHRcdGNhc2UgVW5zaWduZWRTaG9ydDU1NTFUeXBlOlxyXG5cdFx0XHRyZXR1cm4geyBieXRlTGVuZ3RoOiAyLCBjb21wb25lbnRzOiA0IH07XHJcblx0XHRjYXNlIFVuc2lnbmVkSW50VHlwZTpcclxuXHRcdGNhc2UgSW50VHlwZTpcclxuXHRcdGNhc2UgRmxvYXRUeXBlOlxyXG5cdFx0XHRyZXR1cm4geyBieXRlTGVuZ3RoOiA0LCBjb21wb25lbnRzOiAxIH07XHJcblx0XHRjYXNlIFVuc2lnbmVkSW50NTk5OVR5cGU6XHJcblx0XHRcdHJldHVybiB7IGJ5dGVMZW5ndGg6IDQsIGNvbXBvbmVudHM6IDMgfTtcclxuXHJcblx0fVxyXG5cclxuXHR0aHJvdyBuZXcgRXJyb3IoIGBVbmtub3duIHRleHR1cmUgdHlwZSAke3R5cGV9LmAgKTtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBIGNsYXNzIGNvbnRhaW5pbmcgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHRleHR1cmVzLlxyXG4gKlxyXG4gKiBAaGlkZWNvbnN0cnVjdG9yXHJcbiAqL1xyXG5jbGFzcyBUZXh0dXJlVXRpbHMge1xyXG5cclxuXHQvKipcclxuXHQgKiBTY2FsZXMgdGhlIHRleHR1cmUgYXMgbGFyZ2UgYXMgcG9zc2libGUgd2l0aGluIGl0cyBzdXJmYWNlIHdpdGhvdXQgY3JvcHBpbmdcclxuXHQgKiBvciBzdHJldGNoaW5nIHRoZSB0ZXh0dXJlLiBUaGUgbWV0aG9kIHByZXNlcnZlcyB0aGUgb3JpZ2luYWwgYXNwZWN0IHJhdGlvIG9mXHJcblx0ICogdGhlIHRleHR1cmUuIEFraW4gdG8gQ1NTIGBvYmplY3QtZml0OiBjb250YWluYFxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFzcGVjdCAtIFRoZSB0ZXh0dXJlJ3MgYXNwZWN0IHJhdGlvLlxyXG5cdCAqIEByZXR1cm4ge1RleHR1cmV9IFRoZSB1cGRhdGVkIHRleHR1cmUuXHJcblx0ICovXHJcblx0c3RhdGljIGNvbnRhaW4oIHRleHR1cmUsIGFzcGVjdCApIHtcclxuXHJcblx0XHRyZXR1cm4gY29udGFpbiggdGV4dHVyZSwgYXNwZWN0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2NhbGVzIHRoZSB0ZXh0dXJlIHRvIHRoZSBzbWFsbGVzdCBwb3NzaWJsZSBzaXplIHRvIGZpbGwgdGhlIHN1cmZhY2UsIGxlYXZpbmdcclxuXHQgKiBubyBlbXB0eSBzcGFjZS4gVGhlIG1ldGhvZCBwcmVzZXJ2ZXMgdGhlIG9yaWdpbmFsIGFzcGVjdCByYXRpbyBvZiB0aGUgdGV4dHVyZS5cclxuXHQgKiBBa2luIHRvIENTUyBgb2JqZWN0LWZpdDogY292ZXJgLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFzcGVjdCAtIFRoZSB0ZXh0dXJlJ3MgYXNwZWN0IHJhdGlvLlxyXG5cdCAqIEByZXR1cm4ge1RleHR1cmV9IFRoZSB1cGRhdGVkIHRleHR1cmUuXHJcblx0ICovXHJcblx0c3RhdGljIGNvdmVyKCB0ZXh0dXJlLCBhc3BlY3QgKSB7XHJcblxyXG5cdFx0cmV0dXJuIGNvdmVyKCB0ZXh0dXJlLCBhc3BlY3QgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25maWd1cmVzIHRoZSB0ZXh0dXJlIHRvIHRoZSBkZWZhdWx0IHRyYW5zZm9ybWF0aW9uLiBBa2luIHRvIENTUyBgb2JqZWN0LWZpdDogZmlsbGAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZS5cclxuXHQgKiBAcmV0dXJuIHtUZXh0dXJlfSBUaGUgdXBkYXRlZCB0ZXh0dXJlLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBmaWxsKCB0ZXh0dXJlICkge1xyXG5cclxuXHRcdHJldHVybiBmaWxsKCB0ZXh0dXJlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGV0ZXJtaW5lcyBob3cgbWFueSBieXRlcyBtdXN0IGJlIHVzZWQgdG8gcmVwcmVzZW50IHRoZSB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSB0ZXh0dXJlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSB0ZXh0dXJlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBmb3JtYXQgLSBUaGUgdGV4dHVyZSdzIGZvcm1hdC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdHlwZSAtIFRoZSB0ZXh0dXJlJ3MgdHlwZS5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBieXRlIGxlbmd0aC5cclxuXHQgKi9cclxuXHRzdGF0aWMgZ2V0Qnl0ZUxlbmd0aCggd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0eXBlICkge1xyXG5cclxuXHRcdHJldHVybiBnZXRCeXRlTGVuZ3RoKCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgY29udGFpbiwgY292ZXIsIGZpbGwsIGdldEJ5dGVMZW5ndGgsIFRleHR1cmVVdGlscyB9O1xyXG4iLCJpbXBvcnQgeyBSRVZJU0lPTiB9IGZyb20gJy4vY29uc3RhbnRzLmpzJztcclxuXHJcbmV4cG9ydCB7IFdlYkdMQXJyYXlSZW5kZXJUYXJnZXQgfSBmcm9tICcuL3JlbmRlcmVycy9XZWJHTEFycmF5UmVuZGVyVGFyZ2V0LmpzJztcclxuZXhwb3J0IHsgV2ViR0wzRFJlbmRlclRhcmdldCB9IGZyb20gJy4vcmVuZGVyZXJzL1dlYkdMM0RSZW5kZXJUYXJnZXQuanMnO1xyXG5leHBvcnQgeyBXZWJHTEN1YmVSZW5kZXJUYXJnZXQgfSBmcm9tICcuL3JlbmRlcmVycy9XZWJHTEN1YmVSZW5kZXJUYXJnZXQuanMnO1xyXG5leHBvcnQgeyBXZWJHTFJlbmRlclRhcmdldCB9IGZyb20gJy4vcmVuZGVyZXJzL1dlYkdMUmVuZGVyVGFyZ2V0LmpzJztcclxuZXhwb3J0IHsgV2ViWFJDb250cm9sbGVyIH0gZnJvbSAnLi9yZW5kZXJlcnMvd2VieHIvV2ViWFJDb250cm9sbGVyLmpzJztcclxuZXhwb3J0IHsgRm9nRXhwMiB9IGZyb20gJy4vc2NlbmVzL0ZvZ0V4cDIuanMnO1xyXG5leHBvcnQgeyBGb2cgfSBmcm9tICcuL3NjZW5lcy9Gb2cuanMnO1xyXG5leHBvcnQgeyBTY2VuZSB9IGZyb20gJy4vc2NlbmVzL1NjZW5lLmpzJztcclxuZXhwb3J0IHsgU3ByaXRlIH0gZnJvbSAnLi9vYmplY3RzL1Nwcml0ZS5qcyc7XHJcbmV4cG9ydCB7IExPRCB9IGZyb20gJy4vb2JqZWN0cy9MT0QuanMnO1xyXG5leHBvcnQgeyBTa2lubmVkTWVzaCB9IGZyb20gJy4vb2JqZWN0cy9Ta2lubmVkTWVzaC5qcyc7XHJcbmV4cG9ydCB7IFNrZWxldG9uIH0gZnJvbSAnLi9vYmplY3RzL1NrZWxldG9uLmpzJztcclxuZXhwb3J0IHsgQm9uZSB9IGZyb20gJy4vb2JqZWN0cy9Cb25lLmpzJztcclxuZXhwb3J0IHsgTWVzaCB9IGZyb20gJy4vb2JqZWN0cy9NZXNoLmpzJztcclxuZXhwb3J0IHsgSW5zdGFuY2VkTWVzaCB9IGZyb20gJy4vb2JqZWN0cy9JbnN0YW5jZWRNZXNoLmpzJztcclxuZXhwb3J0IHsgQmF0Y2hlZE1lc2ggfSBmcm9tICcuL29iamVjdHMvQmF0Y2hlZE1lc2guanMnO1xyXG5leHBvcnQgeyBMaW5lU2VnbWVudHMgfSBmcm9tICcuL29iamVjdHMvTGluZVNlZ21lbnRzLmpzJztcclxuZXhwb3J0IHsgTGluZUxvb3AgfSBmcm9tICcuL29iamVjdHMvTGluZUxvb3AuanMnO1xyXG5leHBvcnQgeyBMaW5lIH0gZnJvbSAnLi9vYmplY3RzL0xpbmUuanMnO1xyXG5leHBvcnQgeyBQb2ludHMgfSBmcm9tICcuL29iamVjdHMvUG9pbnRzLmpzJztcclxuZXhwb3J0IHsgR3JvdXAgfSBmcm9tICcuL29iamVjdHMvR3JvdXAuanMnO1xyXG5leHBvcnQgeyBWaWRlb1RleHR1cmUgfSBmcm9tICcuL3RleHR1cmVzL1ZpZGVvVGV4dHVyZS5qcyc7XHJcbmV4cG9ydCB7IFZpZGVvRnJhbWVUZXh0dXJlIH0gZnJvbSAnLi90ZXh0dXJlcy9WaWRlb0ZyYW1lVGV4dHVyZS5qcyc7XHJcbmV4cG9ydCB7IEZyYW1lYnVmZmVyVGV4dHVyZSB9IGZyb20gJy4vdGV4dHVyZXMvRnJhbWVidWZmZXJUZXh0dXJlLmpzJztcclxuZXhwb3J0IHsgU291cmNlIH0gZnJvbSAnLi90ZXh0dXJlcy9Tb3VyY2UuanMnO1xyXG5leHBvcnQgeyBEYXRhVGV4dHVyZSB9IGZyb20gJy4vdGV4dHVyZXMvRGF0YVRleHR1cmUuanMnO1xyXG5leHBvcnQgeyBEYXRhQXJyYXlUZXh0dXJlIH0gZnJvbSAnLi90ZXh0dXJlcy9EYXRhQXJyYXlUZXh0dXJlLmpzJztcclxuZXhwb3J0IHsgRGF0YTNEVGV4dHVyZSB9IGZyb20gJy4vdGV4dHVyZXMvRGF0YTNEVGV4dHVyZS5qcyc7XHJcbmV4cG9ydCB7IENvbXByZXNzZWRUZXh0dXJlIH0gZnJvbSAnLi90ZXh0dXJlcy9Db21wcmVzc2VkVGV4dHVyZS5qcyc7XHJcbmV4cG9ydCB7IENvbXByZXNzZWRBcnJheVRleHR1cmUgfSBmcm9tICcuL3RleHR1cmVzL0NvbXByZXNzZWRBcnJheVRleHR1cmUuanMnO1xyXG5leHBvcnQgeyBDb21wcmVzc2VkQ3ViZVRleHR1cmUgfSBmcm9tICcuL3RleHR1cmVzL0NvbXByZXNzZWRDdWJlVGV4dHVyZS5qcyc7XHJcbmV4cG9ydCB7IEN1YmVUZXh0dXJlIH0gZnJvbSAnLi90ZXh0dXJlcy9DdWJlVGV4dHVyZS5qcyc7XHJcbmV4cG9ydCB7IENhbnZhc1RleHR1cmUgfSBmcm9tICcuL3RleHR1cmVzL0NhbnZhc1RleHR1cmUuanMnO1xyXG5leHBvcnQgeyBEZXB0aFRleHR1cmUgfSBmcm9tICcuL3RleHR1cmVzL0RlcHRoVGV4dHVyZS5qcyc7XHJcbmV4cG9ydCB7IFRleHR1cmUgfSBmcm9tICcuL3RleHR1cmVzL1RleHR1cmUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2dlb21ldHJpZXMvR2VvbWV0cmllcy5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbWF0ZXJpYWxzL01hdGVyaWFscy5qcyc7XHJcbmV4cG9ydCB7IEFuaW1hdGlvbkxvYWRlciB9IGZyb20gJy4vbG9hZGVycy9BbmltYXRpb25Mb2FkZXIuanMnO1xyXG5leHBvcnQgeyBDb21wcmVzc2VkVGV4dHVyZUxvYWRlciB9IGZyb20gJy4vbG9hZGVycy9Db21wcmVzc2VkVGV4dHVyZUxvYWRlci5qcyc7XHJcbmV4cG9ydCB7IEN1YmVUZXh0dXJlTG9hZGVyIH0gZnJvbSAnLi9sb2FkZXJzL0N1YmVUZXh0dXJlTG9hZGVyLmpzJztcclxuZXhwb3J0IHsgRGF0YVRleHR1cmVMb2FkZXIgfSBmcm9tICcuL2xvYWRlcnMvRGF0YVRleHR1cmVMb2FkZXIuanMnO1xyXG5leHBvcnQgeyBUZXh0dXJlTG9hZGVyIH0gZnJvbSAnLi9sb2FkZXJzL1RleHR1cmVMb2FkZXIuanMnO1xyXG5leHBvcnQgeyBPYmplY3RMb2FkZXIgfSBmcm9tICcuL2xvYWRlcnMvT2JqZWN0TG9hZGVyLmpzJztcclxuZXhwb3J0IHsgTWF0ZXJpYWxMb2FkZXIgfSBmcm9tICcuL2xvYWRlcnMvTWF0ZXJpYWxMb2FkZXIuanMnO1xyXG5leHBvcnQgeyBCdWZmZXJHZW9tZXRyeUxvYWRlciB9IGZyb20gJy4vbG9hZGVycy9CdWZmZXJHZW9tZXRyeUxvYWRlci5qcyc7XHJcbmV4cG9ydCB7IERlZmF1bHRMb2FkaW5nTWFuYWdlciwgTG9hZGluZ01hbmFnZXIgfSBmcm9tICcuL2xvYWRlcnMvTG9hZGluZ01hbmFnZXIuanMnO1xyXG5leHBvcnQgeyBJbWFnZUxvYWRlciB9IGZyb20gJy4vbG9hZGVycy9JbWFnZUxvYWRlci5qcyc7XHJcbmV4cG9ydCB7IEltYWdlQml0bWFwTG9hZGVyIH0gZnJvbSAnLi9sb2FkZXJzL0ltYWdlQml0bWFwTG9hZGVyLmpzJztcclxuZXhwb3J0IHsgRmlsZUxvYWRlciB9IGZyb20gJy4vbG9hZGVycy9GaWxlTG9hZGVyLmpzJztcclxuZXhwb3J0IHsgTG9hZGVyIH0gZnJvbSAnLi9sb2FkZXJzL0xvYWRlci5qcyc7XHJcbmV4cG9ydCB7IExvYWRlclV0aWxzIH0gZnJvbSAnLi9sb2FkZXJzL0xvYWRlclV0aWxzLmpzJztcclxuZXhwb3J0IHsgQ2FjaGUgfSBmcm9tICcuL2xvYWRlcnMvQ2FjaGUuanMnO1xyXG5leHBvcnQgeyBBdWRpb0xvYWRlciB9IGZyb20gJy4vbG9hZGVycy9BdWRpb0xvYWRlci5qcyc7XHJcbmV4cG9ydCB7IFNwb3RMaWdodCB9IGZyb20gJy4vbGlnaHRzL1Nwb3RMaWdodC5qcyc7XHJcbmV4cG9ydCB7IFBvaW50TGlnaHQgfSBmcm9tICcuL2xpZ2h0cy9Qb2ludExpZ2h0LmpzJztcclxuZXhwb3J0IHsgUmVjdEFyZWFMaWdodCB9IGZyb20gJy4vbGlnaHRzL1JlY3RBcmVhTGlnaHQuanMnO1xyXG5leHBvcnQgeyBIZW1pc3BoZXJlTGlnaHQgfSBmcm9tICcuL2xpZ2h0cy9IZW1pc3BoZXJlTGlnaHQuanMnO1xyXG5leHBvcnQgeyBEaXJlY3Rpb25hbExpZ2h0IH0gZnJvbSAnLi9saWdodHMvRGlyZWN0aW9uYWxMaWdodC5qcyc7XHJcbmV4cG9ydCB7IEFtYmllbnRMaWdodCB9IGZyb20gJy4vbGlnaHRzL0FtYmllbnRMaWdodC5qcyc7XHJcbmV4cG9ydCB7IExpZ2h0IH0gZnJvbSAnLi9saWdodHMvTGlnaHQuanMnO1xyXG5leHBvcnQgeyBMaWdodFByb2JlIH0gZnJvbSAnLi9saWdodHMvTGlnaHRQcm9iZS5qcyc7XHJcbmV4cG9ydCB7IFN0ZXJlb0NhbWVyYSB9IGZyb20gJy4vY2FtZXJhcy9TdGVyZW9DYW1lcmEuanMnO1xyXG5leHBvcnQgeyBQZXJzcGVjdGl2ZUNhbWVyYSB9IGZyb20gJy4vY2FtZXJhcy9QZXJzcGVjdGl2ZUNhbWVyYS5qcyc7XHJcbmV4cG9ydCB7IE9ydGhvZ3JhcGhpY0NhbWVyYSB9IGZyb20gJy4vY2FtZXJhcy9PcnRob2dyYXBoaWNDYW1lcmEuanMnO1xyXG5leHBvcnQgeyBDdWJlQ2FtZXJhIH0gZnJvbSAnLi9jYW1lcmFzL0N1YmVDYW1lcmEuanMnO1xyXG5leHBvcnQgeyBBcnJheUNhbWVyYSB9IGZyb20gJy4vY2FtZXJhcy9BcnJheUNhbWVyYS5qcyc7XHJcbmV4cG9ydCB7IENhbWVyYSB9IGZyb20gJy4vY2FtZXJhcy9DYW1lcmEuanMnO1xyXG5leHBvcnQgeyBBdWRpb0xpc3RlbmVyIH0gZnJvbSAnLi9hdWRpby9BdWRpb0xpc3RlbmVyLmpzJztcclxuZXhwb3J0IHsgUG9zaXRpb25hbEF1ZGlvIH0gZnJvbSAnLi9hdWRpby9Qb3NpdGlvbmFsQXVkaW8uanMnO1xyXG5leHBvcnQgeyBBdWRpb0NvbnRleHQgfSBmcm9tICcuL2F1ZGlvL0F1ZGlvQ29udGV4dC5qcyc7XHJcbmV4cG9ydCB7IEF1ZGlvQW5hbHlzZXIgfSBmcm9tICcuL2F1ZGlvL0F1ZGlvQW5hbHlzZXIuanMnO1xyXG5leHBvcnQgeyBBdWRpbyB9IGZyb20gJy4vYXVkaW8vQXVkaW8uanMnO1xyXG5leHBvcnQgeyBWZWN0b3JLZXlmcmFtZVRyYWNrIH0gZnJvbSAnLi9hbmltYXRpb24vdHJhY2tzL1ZlY3RvcktleWZyYW1lVHJhY2suanMnO1xyXG5leHBvcnQgeyBTdHJpbmdLZXlmcmFtZVRyYWNrIH0gZnJvbSAnLi9hbmltYXRpb24vdHJhY2tzL1N0cmluZ0tleWZyYW1lVHJhY2suanMnO1xyXG5leHBvcnQgeyBRdWF0ZXJuaW9uS2V5ZnJhbWVUcmFjayB9IGZyb20gJy4vYW5pbWF0aW9uL3RyYWNrcy9RdWF0ZXJuaW9uS2V5ZnJhbWVUcmFjay5qcyc7XHJcbmV4cG9ydCB7IE51bWJlcktleWZyYW1lVHJhY2sgfSBmcm9tICcuL2FuaW1hdGlvbi90cmFja3MvTnVtYmVyS2V5ZnJhbWVUcmFjay5qcyc7XHJcbmV4cG9ydCB7IENvbG9yS2V5ZnJhbWVUcmFjayB9IGZyb20gJy4vYW5pbWF0aW9uL3RyYWNrcy9Db2xvcktleWZyYW1lVHJhY2suanMnO1xyXG5leHBvcnQgeyBCb29sZWFuS2V5ZnJhbWVUcmFjayB9IGZyb20gJy4vYW5pbWF0aW9uL3RyYWNrcy9Cb29sZWFuS2V5ZnJhbWVUcmFjay5qcyc7XHJcbmV4cG9ydCB7IFByb3BlcnR5TWl4ZXIgfSBmcm9tICcuL2FuaW1hdGlvbi9Qcm9wZXJ0eU1peGVyLmpzJztcclxuZXhwb3J0IHsgUHJvcGVydHlCaW5kaW5nIH0gZnJvbSAnLi9hbmltYXRpb24vUHJvcGVydHlCaW5kaW5nLmpzJztcclxuZXhwb3J0IHsgS2V5ZnJhbWVUcmFjayB9IGZyb20gJy4vYW5pbWF0aW9uL0tleWZyYW1lVHJhY2suanMnO1xyXG5leHBvcnQgeyBBbmltYXRpb25VdGlscyB9IGZyb20gJy4vYW5pbWF0aW9uL0FuaW1hdGlvblV0aWxzLmpzJztcclxuZXhwb3J0IHsgQW5pbWF0aW9uT2JqZWN0R3JvdXAgfSBmcm9tICcuL2FuaW1hdGlvbi9BbmltYXRpb25PYmplY3RHcm91cC5qcyc7XHJcbmV4cG9ydCB7IEFuaW1hdGlvbk1peGVyIH0gZnJvbSAnLi9hbmltYXRpb24vQW5pbWF0aW9uTWl4ZXIuanMnO1xyXG5leHBvcnQgeyBBbmltYXRpb25DbGlwIH0gZnJvbSAnLi9hbmltYXRpb24vQW5pbWF0aW9uQ2xpcC5qcyc7XHJcbmV4cG9ydCB7IEFuaW1hdGlvbkFjdGlvbiB9IGZyb20gJy4vYW5pbWF0aW9uL0FuaW1hdGlvbkFjdGlvbi5qcyc7XHJcbmV4cG9ydCB7IFJlbmRlclRhcmdldCB9IGZyb20gJy4vY29yZS9SZW5kZXJUYXJnZXQuanMnO1xyXG5leHBvcnQgeyBSZW5kZXJUYXJnZXQzRCB9IGZyb20gJy4vY29yZS9SZW5kZXJUYXJnZXQzRC5qcyc7XHJcbmV4cG9ydCB7IFJlbmRlclRhcmdldEFycmF5IH0gZnJvbSAnLi9jb3JlL1JlbmRlclRhcmdldEFycmF5LmpzJztcclxuZXhwb3J0IHsgVW5pZm9ybSB9IGZyb20gJy4vY29yZS9Vbmlmb3JtLmpzJztcclxuZXhwb3J0IHsgVW5pZm9ybXNHcm91cCB9IGZyb20gJy4vY29yZS9Vbmlmb3Jtc0dyb3VwLmpzJztcclxuZXhwb3J0IHsgSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuL2NvcmUvSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkuanMnO1xyXG5leHBvcnQgeyBCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4vY29yZS9CdWZmZXJHZW9tZXRyeS5qcyc7XHJcbmV4cG9ydCB7IEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi9jb3JlL0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlLmpzJztcclxuZXhwb3J0IHsgSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIgfSBmcm9tICcuL2NvcmUvSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIuanMnO1xyXG5leHBvcnQgeyBJbnRlcmxlYXZlZEJ1ZmZlciB9IGZyb20gJy4vY29yZS9JbnRlcmxlYXZlZEJ1ZmZlci5qcyc7XHJcbmV4cG9ydCB7IEluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4vY29yZS9JbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5leHBvcnQgeyBHTEJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4vY29yZS9HTEJ1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5leHBvcnQgeyBPYmplY3QzRCB9IGZyb20gJy4vY29yZS9PYmplY3QzRC5qcyc7XHJcbmV4cG9ydCB7IFJheWNhc3RlciB9IGZyb20gJy4vY29yZS9SYXljYXN0ZXIuanMnO1xyXG5leHBvcnQgeyBMYXllcnMgfSBmcm9tICcuL2NvcmUvTGF5ZXJzLmpzJztcclxuZXhwb3J0IHsgRXZlbnREaXNwYXRjaGVyIH0gZnJvbSAnLi9jb3JlL0V2ZW50RGlzcGF0Y2hlci5qcyc7XHJcbmV4cG9ydCB7IENsb2NrIH0gZnJvbSAnLi9jb3JlL0Nsb2NrLmpzJztcclxuZXhwb3J0IHsgUXVhdGVybmlvbkxpbmVhckludGVycG9sYW50IH0gZnJvbSAnLi9tYXRoL2ludGVycG9sYW50cy9RdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQuanMnO1xyXG5leHBvcnQgeyBMaW5lYXJJbnRlcnBvbGFudCB9IGZyb20gJy4vbWF0aC9pbnRlcnBvbGFudHMvTGluZWFySW50ZXJwb2xhbnQuanMnO1xyXG5leHBvcnQgeyBEaXNjcmV0ZUludGVycG9sYW50IH0gZnJvbSAnLi9tYXRoL2ludGVycG9sYW50cy9EaXNjcmV0ZUludGVycG9sYW50LmpzJztcclxuZXhwb3J0IHsgQ3ViaWNJbnRlcnBvbGFudCB9IGZyb20gJy4vbWF0aC9pbnRlcnBvbGFudHMvQ3ViaWNJbnRlcnBvbGFudC5qcyc7XHJcbmV4cG9ydCB7IEludGVycG9sYW50IH0gZnJvbSAnLi9tYXRoL0ludGVycG9sYW50LmpzJztcclxuZXhwb3J0IHsgVHJpYW5nbGUgfSBmcm9tICcuL21hdGgvVHJpYW5nbGUuanMnO1xyXG5leHBvcnQgeyBNYXRoVXRpbHMgfSBmcm9tICcuL21hdGgvTWF0aFV0aWxzLmpzJztcclxuZXhwb3J0IHsgU3BoZXJpY2FsIH0gZnJvbSAnLi9tYXRoL1NwaGVyaWNhbC5qcyc7XHJcbmV4cG9ydCB7IEN5bGluZHJpY2FsIH0gZnJvbSAnLi9tYXRoL0N5bGluZHJpY2FsLmpzJztcclxuZXhwb3J0IHsgUGxhbmUgfSBmcm9tICcuL21hdGgvUGxhbmUuanMnO1xyXG5leHBvcnQgeyBGcnVzdHVtIH0gZnJvbSAnLi9tYXRoL0ZydXN0dW0uanMnO1xyXG5leHBvcnQgeyBTcGhlcmUgfSBmcm9tICcuL21hdGgvU3BoZXJlLmpzJztcclxuZXhwb3J0IHsgUmF5IH0gZnJvbSAnLi9tYXRoL1JheS5qcyc7XHJcbmV4cG9ydCB7IE1hdHJpeDQgfSBmcm9tICcuL21hdGgvTWF0cml4NC5qcyc7XHJcbmV4cG9ydCB7IE1hdHJpeDMgfSBmcm9tICcuL21hdGgvTWF0cml4My5qcyc7XHJcbmV4cG9ydCB7IE1hdHJpeDIgfSBmcm9tICcuL21hdGgvTWF0cml4Mi5qcyc7XHJcbmV4cG9ydCB7IEJveDMgfSBmcm9tICcuL21hdGgvQm94My5qcyc7XHJcbmV4cG9ydCB7IEJveDIgfSBmcm9tICcuL21hdGgvQm94Mi5qcyc7XHJcbmV4cG9ydCB7IExpbmUzIH0gZnJvbSAnLi9tYXRoL0xpbmUzLmpzJztcclxuZXhwb3J0IHsgRXVsZXIgfSBmcm9tICcuL21hdGgvRXVsZXIuanMnO1xyXG5leHBvcnQgeyBWZWN0b3I0IH0gZnJvbSAnLi9tYXRoL1ZlY3RvcjQuanMnO1xyXG5leHBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5leHBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi9tYXRoL1ZlY3RvcjIuanMnO1xyXG5leHBvcnQgeyBRdWF0ZXJuaW9uIH0gZnJvbSAnLi9tYXRoL1F1YXRlcm5pb24uanMnO1xyXG5leHBvcnQgeyBDb2xvciB9IGZyb20gJy4vbWF0aC9Db2xvci5qcyc7XHJcbmV4cG9ydCB7IENvbG9yTWFuYWdlbWVudCB9IGZyb20gJy4vbWF0aC9Db2xvck1hbmFnZW1lbnQuanMnO1xyXG5leHBvcnQgeyBTcGhlcmljYWxIYXJtb25pY3MzIH0gZnJvbSAnLi9tYXRoL1NwaGVyaWNhbEhhcm1vbmljczMuanMnO1xyXG5leHBvcnQgeyBTcG90TGlnaHRIZWxwZXIgfSBmcm9tICcuL2hlbHBlcnMvU3BvdExpZ2h0SGVscGVyLmpzJztcclxuZXhwb3J0IHsgU2tlbGV0b25IZWxwZXIgfSBmcm9tICcuL2hlbHBlcnMvU2tlbGV0b25IZWxwZXIuanMnO1xyXG5leHBvcnQgeyBQb2ludExpZ2h0SGVscGVyIH0gZnJvbSAnLi9oZWxwZXJzL1BvaW50TGlnaHRIZWxwZXIuanMnO1xyXG5leHBvcnQgeyBIZW1pc3BoZXJlTGlnaHRIZWxwZXIgfSBmcm9tICcuL2hlbHBlcnMvSGVtaXNwaGVyZUxpZ2h0SGVscGVyLmpzJztcclxuZXhwb3J0IHsgR3JpZEhlbHBlciB9IGZyb20gJy4vaGVscGVycy9HcmlkSGVscGVyLmpzJztcclxuZXhwb3J0IHsgUG9sYXJHcmlkSGVscGVyIH0gZnJvbSAnLi9oZWxwZXJzL1BvbGFyR3JpZEhlbHBlci5qcyc7XHJcbmV4cG9ydCB7IERpcmVjdGlvbmFsTGlnaHRIZWxwZXIgfSBmcm9tICcuL2hlbHBlcnMvRGlyZWN0aW9uYWxMaWdodEhlbHBlci5qcyc7XHJcbmV4cG9ydCB7IENhbWVyYUhlbHBlciB9IGZyb20gJy4vaGVscGVycy9DYW1lcmFIZWxwZXIuanMnO1xyXG5leHBvcnQgeyBCb3hIZWxwZXIgfSBmcm9tICcuL2hlbHBlcnMvQm94SGVscGVyLmpzJztcclxuZXhwb3J0IHsgQm94M0hlbHBlciB9IGZyb20gJy4vaGVscGVycy9Cb3gzSGVscGVyLmpzJztcclxuZXhwb3J0IHsgUGxhbmVIZWxwZXIgfSBmcm9tICcuL2hlbHBlcnMvUGxhbmVIZWxwZXIuanMnO1xyXG5leHBvcnQgeyBBcnJvd0hlbHBlciB9IGZyb20gJy4vaGVscGVycy9BcnJvd0hlbHBlci5qcyc7XHJcbmV4cG9ydCB7IEF4ZXNIZWxwZXIgfSBmcm9tICcuL2hlbHBlcnMvQXhlc0hlbHBlci5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vZXh0cmFzL2N1cnZlcy9DdXJ2ZXMuanMnO1xyXG5leHBvcnQgeyBTaGFwZSB9IGZyb20gJy4vZXh0cmFzL2NvcmUvU2hhcGUuanMnO1xyXG5leHBvcnQgeyBQYXRoIH0gZnJvbSAnLi9leHRyYXMvY29yZS9QYXRoLmpzJztcclxuZXhwb3J0IHsgU2hhcGVQYXRoIH0gZnJvbSAnLi9leHRyYXMvY29yZS9TaGFwZVBhdGguanMnO1xyXG5leHBvcnQgeyBDdXJ2ZVBhdGggfSBmcm9tICcuL2V4dHJhcy9jb3JlL0N1cnZlUGF0aC5qcyc7XHJcbmV4cG9ydCB7IEN1cnZlIH0gZnJvbSAnLi9leHRyYXMvY29yZS9DdXJ2ZS5qcyc7XHJcbmV4cG9ydCB7IENvbnRyb2xzIH0gZnJvbSAnLi9leHRyYXMvQ29udHJvbHMuanMnO1xyXG5leHBvcnQgeyBEYXRhVXRpbHMgfSBmcm9tICcuL2V4dHJhcy9EYXRhVXRpbHMuanMnO1xyXG5leHBvcnQgeyBJbWFnZVV0aWxzIH0gZnJvbSAnLi9leHRyYXMvSW1hZ2VVdGlscy5qcyc7XHJcbmV4cG9ydCB7IFNoYXBlVXRpbHMgfSBmcm9tICcuL2V4dHJhcy9TaGFwZVV0aWxzLmpzJztcclxuZXhwb3J0IHsgVGV4dHVyZVV0aWxzIH0gZnJvbSAnLi9leHRyYXMvVGV4dHVyZVV0aWxzLmpzJztcclxuZXhwb3J0IHsgY3JlYXRlQ2FudmFzRWxlbWVudCB9IGZyb20gJy4vdXRpbHMuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2NvbnN0YW50cy5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vVGhyZWUuTGVnYWN5LmpzJztcclxuXHJcbmlmICggdHlwZW9mIF9fVEhSRUVfREVWVE9PTFNfXyAhPT0gJ3VuZGVmaW5lZCcgKSB7XHJcblxyXG5cdF9fVEhSRUVfREVWVE9PTFNfXy5kaXNwYXRjaEV2ZW50KCBuZXcgQ3VzdG9tRXZlbnQoICdyZWdpc3RlcicsIHsgZGV0YWlsOiB7XHJcblx0XHRyZXZpc2lvbjogUkVWSVNJT04sXHJcblx0fSB9ICkgKTtcclxuXHJcbn1cclxuXHJcbmlmICggdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgKSB7XHJcblxyXG5cdGlmICggd2luZG93Ll9fVEhSRUVfXyApIHtcclxuXHJcblx0XHRjb25zb2xlLndhcm4oICdXQVJOSU5HOiBNdWx0aXBsZSBpbnN0YW5jZXMgb2YgVGhyZWUuanMgYmVpbmcgaW1wb3J0ZWQuJyApO1xyXG5cclxuXHR9IGVsc2Uge1xyXG5cclxuXHRcdHdpbmRvdy5fX1RIUkVFX18gPSBSRVZJU0lPTjtcclxuXHJcblx0fVxyXG5cclxufVxyXG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDQTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ0E7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ0E7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNBO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZtREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0s7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0s7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOXNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbGtCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FDMUxBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0cUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5aENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeDZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3h1Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNud0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuWUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdm9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDenZDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3YkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNrREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzk3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4K0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcFBBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeC9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzNUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoZUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyTkE7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDSzs7QUM1R0w7O0FDQUE7O0FDTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6T0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkxBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RhQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9KQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1UkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1VEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMVZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6WEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JZQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNVBBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbG1EQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDalVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOU5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3UEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25VQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUMzSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1UkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9UQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5TkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0VUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2VkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pLQTtBQUNBO0FBQ0E7QUFDQTtBQUNlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBOEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNycEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3MkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDNUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaGFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5Z0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25aQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6VEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbFlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzllQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMVRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5a0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDam1CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDSzs7QUN2Ukw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25FQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbktBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9HQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL1VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3REQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkxBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOXNDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaE5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbHdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3WEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbHhCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDclpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4NUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2gxQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaFFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2WEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0lBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25IQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9TQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25GQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6V0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OyJ9 diff --git a/build/three.core.min.js b/build/three.core.min.js index c019a169a3b6ad..ec7969d10effc9 100644 --- a/build/three.core.min.js +++ b/build/three.core.min.js @@ -3,4 +3,5 @@ * Copyright 2010-2025 Three.js Authors * SPDX-License-Identifier: MIT */ -const t="175",e={LEFT:0,MIDDLE:1,RIGHT:2,ROTATE:0,DOLLY:1,PAN:2},i={ROTATE:0,PAN:1,DOLLY_PAN:2,DOLLY_ROTATE:3},s=0,r=1,n=2,a=3,o=0,h=1,l=2,c=3,u=0,d=1,p=2,m=0,y=1,g=2,f=3,x=4,b=5,v=100,w=101,M=102,S=103,_=104,A=200,T=201,z=202,C=203,I=204,B=205,k=206,R=207,E=208,P=209,O=210,N=211,F=212,L=213,V=214,j=0,W=1,U=2,D=3,H=4,q=5,J=6,X=7,Y=0,Z=1,G=2,$=0,Q=1,K=2,tt=3,et=4,it=5,st=6,rt=7,nt="attached",at="detached",ot=300,ht=301,lt=302,ct=303,ut=304,dt=306,pt=1e3,mt=1001,yt=1002,gt=1003,ft=1004,xt=1004,bt=1005,vt=1005,wt=1006,Mt=1007,St=1007,_t=1008,At=1008,Tt=1009,zt=1010,Ct=1011,It=1012,Bt=1013,kt=1014,Rt=1015,Et=1016,Pt=1017,Ot=1018,Nt=1020,Ft=35902,Lt=1021,Vt=1022,jt=1023,Wt=1024,Ut=1025,Dt=1026,Ht=1027,qt=1028,Jt=1029,Xt=1030,Yt=1031,Zt=1032,Gt=1033,$t=33776,Qt=33777,Kt=33778,te=33779,ee=35840,ie=35841,se=35842,re=35843,ne=36196,ae=37492,oe=37496,he=37808,le=37809,ce=37810,ue=37811,de=37812,pe=37813,me=37814,ye=37815,ge=37816,fe=37817,xe=37818,be=37819,ve=37820,we=37821,Me=36492,Se=36494,_e=36495,Ae=36283,Te=36284,ze=36285,Ce=36286,Ie=2200,Be=2201,ke=2202,Re=2300,Ee=2301,Pe=2302,Oe=2400,Ne=2401,Fe=2402,Le=2500,Ve=2501,je=0,We=1,Ue=2,De=3200,He=3201,qe=3202,Je=3203,Xe=0,Ye=1,Ze="",Ge="srgb",$e="srgb-linear",Qe="linear",Ke="srgb",ti=0,ei=7680,ii=7681,si=7682,ri=7683,ni=34055,ai=34056,oi=5386,hi=512,li=513,ci=514,ui=515,di=516,pi=517,mi=518,yi=519,gi=512,fi=513,xi=514,bi=515,vi=516,wi=517,Mi=518,Si=519,_i=35044,Ai=35048,Ti=35040,zi=35045,Ci=35049,Ii=35041,Bi=35046,ki=35050,Ri=35042,Ei="100",Pi="300 es",Oi=2e3,Ni=2001,Fi={COMPUTE:"compute",RENDER:"render"};class Li{addEventListener(t,e){void 0===this._listeners&&(this._listeners={});const i=this._listeners;void 0===i[t]&&(i[t]=[]),-1===i[t].indexOf(e)&&i[t].push(e)}hasEventListener(t,e){const i=this._listeners;return void 0!==i&&(void 0!==i[t]&&-1!==i[t].indexOf(e))}removeEventListener(t,e){const i=this._listeners;if(void 0===i)return;const s=i[t];if(void 0!==s){const t=s.indexOf(e);-1!==t&&s.splice(t,1)}}dispatchEvent(t){const e=this._listeners;if(void 0===e)return;const i=e[t.type];if(void 0!==i){t.target=this;const e=i.slice(0);for(let i=0,s=e.length;i>8&255]+Vi[t>>16&255]+Vi[t>>24&255]+"-"+Vi[255&e]+Vi[e>>8&255]+"-"+Vi[e>>16&15|64]+Vi[e>>24&255]+"-"+Vi[63&i|128]+Vi[i>>8&255]+"-"+Vi[i>>16&255]+Vi[i>>24&255]+Vi[255&s]+Vi[s>>8&255]+Vi[s>>16&255]+Vi[s>>24&255]).toLowerCase()}function Hi(t,e,i){return Math.max(e,Math.min(i,t))}function qi(t,e){return(t%e+e)%e}function Ji(t,e,i){return(1-i)*t+i*e}function Xi(t,e){switch(e.constructor){case Float32Array:return t;case Uint32Array:return t/4294967295;case Uint16Array:return t/65535;case Uint8Array:return t/255;case Int32Array:return Math.max(t/2147483647,-1);case Int16Array:return Math.max(t/32767,-1);case Int8Array:return Math.max(t/127,-1);default:throw new Error("Invalid component type.")}}function Yi(t,e){switch(e.constructor){case Float32Array:return t;case Uint32Array:return Math.round(4294967295*t);case Uint16Array:return Math.round(65535*t);case Uint8Array:return Math.round(255*t);case Int32Array:return Math.round(2147483647*t);case Int16Array:return Math.round(32767*t);case Int8Array:return Math.round(127*t);default:throw new Error("Invalid component type.")}}const Zi={DEG2RAD:Wi,RAD2DEG:Ui,generateUUID:Di,clamp:Hi,euclideanModulo:qi,mapLinear:function(t,e,i,s,r){return s+(t-e)*(r-s)/(i-e)},inverseLerp:function(t,e,i){return t!==e?(i-t)/(e-t):0},lerp:Ji,damp:function(t,e,i,s){return Ji(t,e,1-Math.exp(-i*s))},pingpong:function(t,e=1){return e-Math.abs(qi(t,2*e)-e)},smoothstep:function(t,e,i){return t<=e?0:t>=i?1:(t=(t-e)/(i-e))*t*(3-2*t)},smootherstep:function(t,e,i){return t<=e?0:t>=i?1:(t=(t-e)/(i-e))*t*t*(t*(6*t-15)+10)},randInt:function(t,e){return t+Math.floor(Math.random()*(e-t+1))},randFloat:function(t,e){return t+Math.random()*(e-t)},randFloatSpread:function(t){return t*(.5-Math.random())},seededRandom:function(t){void 0!==t&&(ji=t);let e=ji+=1831565813;return e=Math.imul(e^e>>>15,1|e),e^=e+Math.imul(e^e>>>7,61|e),((e^e>>>14)>>>0)/4294967296},degToRad:function(t){return t*Wi},radToDeg:function(t){return t*Ui},isPowerOfTwo:function(t){return!(t&t-1)&&0!==t},ceilPowerOfTwo:function(t){return Math.pow(2,Math.ceil(Math.log(t)/Math.LN2))},floorPowerOfTwo:function(t){return Math.pow(2,Math.floor(Math.log(t)/Math.LN2))},setQuaternionFromProperEuler:function(t,e,i,s,r){const n=Math.cos,a=Math.sin,o=n(i/2),h=a(i/2),l=n((e+s)/2),c=a((e+s)/2),u=n((e-s)/2),d=a((e-s)/2),p=n((s-e)/2),m=a((s-e)/2);switch(r){case"XYX":t.set(o*c,h*u,h*d,o*l);break;case"YZY":t.set(h*d,o*c,h*u,o*l);break;case"ZXZ":t.set(h*u,h*d,o*c,o*l);break;case"XZX":t.set(o*c,h*m,h*p,o*l);break;case"YXY":t.set(h*p,o*c,h*m,o*l);break;case"ZYZ":t.set(h*m,h*p,o*c,o*l);break;default:console.warn("THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: "+r)}},normalize:Yi,denormalize:Xi};class Gi{constructor(t=0,e=0){Gi.prototype.isVector2=!0,this.x=t,this.y=e}get width(){return this.x}set width(t){this.x=t}get height(){return this.y}set height(t){this.y=t}set(t,e){return this.x=t,this.y=e,this}setScalar(t){return this.x=t,this.y=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y)}copy(t){return this.x=t.x,this.y=t.y,this}add(t){return this.x+=t.x,this.y+=t.y,this}addScalar(t){return this.x+=t,this.y+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this}subScalar(t){return this.x-=t,this.y-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this}multiply(t){return this.x*=t.x,this.y*=t.y,this}multiplyScalar(t){return this.x*=t,this.y*=t,this}divide(t){return this.x/=t.x,this.y/=t.y,this}divideScalar(t){return this.multiplyScalar(1/t)}applyMatrix3(t){const e=this.x,i=this.y,s=t.elements;return this.x=s[0]*e+s[3]*i+s[6],this.y=s[1]*e+s[4]*i+s[7],this}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this}clamp(t,e){return this.x=Hi(this.x,t.x,e.x),this.y=Hi(this.y,t.y,e.y),this}clampScalar(t,e){return this.x=Hi(this.x,t,e),this.y=Hi(this.y,t,e),this}clampLength(t,e){const i=this.length();return this.divideScalar(i||1).multiplyScalar(Hi(i,t,e))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(t){return this.x*t.x+this.y*t.y}cross(t){return this.x*t.y-this.y*t.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(0===e)return Math.PI/2;const i=this.dot(t)/e;return Math.acos(Hi(i,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,i=this.y-t.y;return e*e+i*i}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this}lerpVectors(t,e,i){return this.x=t.x+(e.x-t.x)*i,this.y=t.y+(e.y-t.y)*i,this}equals(t){return t.x===this.x&&t.y===this.y}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this}rotateAround(t,e){const i=Math.cos(e),s=Math.sin(e),r=this.x-t.x,n=this.y-t.y;return this.x=r*i-n*s+t.x,this.y=r*s+n*i+t.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}}class $i{constructor(t,e,i,s,r,n,a,o,h){$i.prototype.isMatrix3=!0,this.elements=[1,0,0,0,1,0,0,0,1],void 0!==t&&this.set(t,e,i,s,r,n,a,o,h)}set(t,e,i,s,r,n,a,o,h){const l=this.elements;return l[0]=t,l[1]=s,l[2]=a,l[3]=e,l[4]=r,l[5]=o,l[6]=i,l[7]=n,l[8]=h,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(t){const e=this.elements,i=t.elements;return e[0]=i[0],e[1]=i[1],e[2]=i[2],e[3]=i[3],e[4]=i[4],e[5]=i[5],e[6]=i[6],e[7]=i[7],e[8]=i[8],this}extractBasis(t,e,i){return t.setFromMatrix3Column(this,0),e.setFromMatrix3Column(this,1),i.setFromMatrix3Column(this,2),this}setFromMatrix4(t){const e=t.elements;return this.set(e[0],e[4],e[8],e[1],e[5],e[9],e[2],e[6],e[10]),this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const i=t.elements,s=e.elements,r=this.elements,n=i[0],a=i[3],o=i[6],h=i[1],l=i[4],c=i[7],u=i[2],d=i[5],p=i[8],m=s[0],y=s[3],g=s[6],f=s[1],x=s[4],b=s[7],v=s[2],w=s[5],M=s[8];return r[0]=n*m+a*f+o*v,r[3]=n*y+a*x+o*w,r[6]=n*g+a*b+o*M,r[1]=h*m+l*f+c*v,r[4]=h*y+l*x+c*w,r[7]=h*g+l*b+c*M,r[2]=u*m+d*f+p*v,r[5]=u*y+d*x+p*w,r[8]=u*g+d*b+p*M,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[3]*=t,e[6]*=t,e[1]*=t,e[4]*=t,e[7]*=t,e[2]*=t,e[5]*=t,e[8]*=t,this}determinant(){const t=this.elements,e=t[0],i=t[1],s=t[2],r=t[3],n=t[4],a=t[5],o=t[6],h=t[7],l=t[8];return e*n*l-e*a*h-i*r*l+i*a*o+s*r*h-s*n*o}invert(){const t=this.elements,e=t[0],i=t[1],s=t[2],r=t[3],n=t[4],a=t[5],o=t[6],h=t[7],l=t[8],c=l*n-a*h,u=a*o-l*r,d=h*r-n*o,p=e*c+i*u+s*d;if(0===p)return this.set(0,0,0,0,0,0,0,0,0);const m=1/p;return t[0]=c*m,t[1]=(s*h-l*i)*m,t[2]=(a*i-s*n)*m,t[3]=u*m,t[4]=(l*e-s*o)*m,t[5]=(s*r-a*e)*m,t[6]=d*m,t[7]=(i*o-h*e)*m,t[8]=(n*e-i*r)*m,this}transpose(){let t;const e=this.elements;return t=e[1],e[1]=e[3],e[3]=t,t=e[2],e[2]=e[6],e[6]=t,t=e[5],e[5]=e[7],e[7]=t,this}getNormalMatrix(t){return this.setFromMatrix4(t).invert().transpose()}transposeIntoArray(t){const e=this.elements;return t[0]=e[0],t[1]=e[3],t[2]=e[6],t[3]=e[1],t[4]=e[4],t[5]=e[7],t[6]=e[2],t[7]=e[5],t[8]=e[8],this}setUvTransform(t,e,i,s,r,n,a){const o=Math.cos(r),h=Math.sin(r);return this.set(i*o,i*h,-i*(o*n+h*a)+n+t,-s*h,s*o,-s*(-h*n+o*a)+a+e,0,0,1),this}scale(t,e){return this.premultiply(Qi.makeScale(t,e)),this}rotate(t){return this.premultiply(Qi.makeRotation(-t)),this}translate(t,e){return this.premultiply(Qi.makeTranslation(t,e)),this}makeTranslation(t,e){return t.isVector2?this.set(1,0,t.x,0,1,t.y,0,0,1):this.set(1,0,t,0,1,e,0,0,1),this}makeRotation(t){const e=Math.cos(t),i=Math.sin(t);return this.set(e,-i,0,i,e,0,0,0,1),this}makeScale(t,e){return this.set(t,0,0,0,e,0,0,0,1),this}equals(t){const e=this.elements,i=t.elements;for(let t=0;t<9;t++)if(e[t]!==i[t])return!1;return!0}fromArray(t,e=0){for(let i=0;i<9;i++)this.elements[i]=t[i+e];return this}toArray(t=[],e=0){const i=this.elements;return t[e]=i[0],t[e+1]=i[1],t[e+2]=i[2],t[e+3]=i[3],t[e+4]=i[4],t[e+5]=i[5],t[e+6]=i[6],t[e+7]=i[7],t[e+8]=i[8],t}clone(){return(new this.constructor).fromArray(this.elements)}}const Qi=new $i;function Ki(t){for(let e=t.length-1;e>=0;--e)if(t[e]>=65535)return!0;return!1}const ts={Int8Array:Int8Array,Uint8Array:Uint8Array,Uint8ClampedArray:Uint8ClampedArray,Int16Array:Int16Array,Uint16Array:Uint16Array,Int32Array:Int32Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array};function es(t,e){return new ts[t](e)}function is(t){return document.createElementNS("http://www.w3.org/1999/xhtml",t)}function ss(){const t=is("canvas");return t.style.display="block",t}const rs={};function ns(t){t in rs||(rs[t]=!0,console.warn(t))}function as(t,e,i){return new Promise((function(s,r){setTimeout((function n(){switch(t.clientWaitSync(e,t.SYNC_FLUSH_COMMANDS_BIT,0)){case t.WAIT_FAILED:r();break;case t.TIMEOUT_EXPIRED:setTimeout(n,i);break;default:s()}}),i)}))}function os(t){const e=t.elements;e[2]=.5*e[2]+.5*e[3],e[6]=.5*e[6]+.5*e[7],e[10]=.5*e[10]+.5*e[11],e[14]=.5*e[14]+.5*e[15]}function hs(t){const e=t.elements;-1===e[11]?(e[10]=-e[10]-1,e[14]=-e[14]):(e[10]=-e[10],e[14]=1-e[14])}const ls=(new $i).set(.4123908,.3575843,.1804808,.212639,.7151687,.0721923,.0193308,.1191948,.9505322),cs=(new $i).set(3.2409699,-1.5373832,-.4986108,-.9692436,1.8759675,.0415551,.0556301,-.203977,1.0569715);function us(){const t={enabled:!0,workingColorSpace:$e,spaces:{},convert:function(t,e,i){return!1!==this.enabled&&e!==i&&e&&i?(this.spaces[e].transfer===Ke&&(t.r=ps(t.r),t.g=ps(t.g),t.b=ps(t.b)),this.spaces[e].primaries!==this.spaces[i].primaries&&(t.applyMatrix3(this.spaces[e].toXYZ),t.applyMatrix3(this.spaces[i].fromXYZ)),this.spaces[i].transfer===Ke&&(t.r=ms(t.r),t.g=ms(t.g),t.b=ms(t.b)),t):t},fromWorkingColorSpace:function(t,e){return this.convert(t,this.workingColorSpace,e)},toWorkingColorSpace:function(t,e){return this.convert(t,e,this.workingColorSpace)},getPrimaries:function(t){return this.spaces[t].primaries},getTransfer:function(t){return""===t?Qe:this.spaces[t].transfer},getLuminanceCoefficients:function(t,e=this.workingColorSpace){return t.fromArray(this.spaces[e].luminanceCoefficients)},define:function(t){Object.assign(this.spaces,t)},_getMatrix:function(t,e,i){return t.copy(this.spaces[e].toXYZ).multiply(this.spaces[i].fromXYZ)},_getDrawingBufferColorSpace:function(t){return this.spaces[t].outputColorSpaceConfig.drawingBufferColorSpace},_getUnpackColorSpace:function(t=this.workingColorSpace){return this.spaces[t].workingColorSpaceConfig.unpackColorSpace}},e=[.64,.33,.3,.6,.15,.06],i=[.2126,.7152,.0722],s=[.3127,.329];return t.define({[$e]:{primaries:e,whitePoint:s,transfer:Qe,toXYZ:ls,fromXYZ:cs,luminanceCoefficients:i,workingColorSpaceConfig:{unpackColorSpace:Ge},outputColorSpaceConfig:{drawingBufferColorSpace:Ge}},[Ge]:{primaries:e,whitePoint:s,transfer:Ke,toXYZ:ls,fromXYZ:cs,luminanceCoefficients:i,outputColorSpaceConfig:{drawingBufferColorSpace:Ge}}}),t}const ds=us();function ps(t){return t<.04045?.0773993808*t:Math.pow(.9478672986*t+.0521327014,2.4)}function ms(t){return t<.0031308?12.92*t:1.055*Math.pow(t,.41666)-.055}let ys;class gs{static getDataURL(t,e="image/png"){if(/^data:/i.test(t.src))return t.src;if("undefined"==typeof HTMLCanvasElement)return t.src;let i;if(t instanceof HTMLCanvasElement)i=t;else{void 0===ys&&(ys=is("canvas")),ys.width=t.width,ys.height=t.height;const e=ys.getContext("2d");t instanceof ImageData?e.putImageData(t,0,0):e.drawImage(t,0,0,t.width,t.height),i=ys}return i.toDataURL(e)}static sRGBToLinear(t){if("undefined"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&t instanceof ImageBitmap){const e=is("canvas");e.width=t.width,e.height=t.height;const i=e.getContext("2d");i.drawImage(t,0,0,t.width,t.height);const s=i.getImageData(0,0,t.width,t.height),r=s.data;for(let t=0;t0&&(i.userData=this.userData),e||(t.textures[this.uuid]=i),i}dispose(){this.dispatchEvent({type:"dispose"})}transformUv(t){if(this.mapping!==ot)return t;if(t.applyMatrix3(this.matrix),t.x<0||t.x>1)switch(this.wrapS){case pt:t.x=t.x-Math.floor(t.x);break;case mt:t.x=t.x<0?0:1;break;case yt:1===Math.abs(Math.floor(t.x)%2)?t.x=Math.ceil(t.x)-t.x:t.x=t.x-Math.floor(t.x)}if(t.y<0||t.y>1)switch(this.wrapT){case pt:t.y=t.y-Math.floor(t.y);break;case mt:t.y=t.y<0?0:1;break;case yt:1===Math.abs(Math.floor(t.y)%2)?t.y=Math.ceil(t.y)-t.y:t.y=t.y-Math.floor(t.y)}return this.flipY&&(t.y=1-t.y),t}set needsUpdate(t){!0===t&&(this.version++,this.source.needsUpdate=!0)}set needsPMREMUpdate(t){!0===t&&this.pmremVersion++}}ws.DEFAULT_IMAGE=null,ws.DEFAULT_MAPPING=ot,ws.DEFAULT_ANISOTROPY=1;class Ms{constructor(t=0,e=0,i=0,s=1){Ms.prototype.isVector4=!0,this.x=t,this.y=e,this.z=i,this.w=s}get width(){return this.z}set width(t){this.z=t}get height(){return this.w}set height(t){this.w=t}set(t,e,i,s){return this.x=t,this.y=e,this.z=i,this.w=s,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this.w=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setW(t){return this.w=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;case 3:this.w=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this.w=void 0!==t.w?t.w:1,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this.w+=t.w,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this.w+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this.w=t.w+e.w,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this.w+=t.w*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this.w-=t.w,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this.w-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this.w=t.w-e.w,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this.w*=t.w,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this.w*=t,this}applyMatrix4(t){const e=this.x,i=this.y,s=this.z,r=this.w,n=t.elements;return this.x=n[0]*e+n[4]*i+n[8]*s+n[12]*r,this.y=n[1]*e+n[5]*i+n[9]*s+n[13]*r,this.z=n[2]*e+n[6]*i+n[10]*s+n[14]*r,this.w=n[3]*e+n[7]*i+n[11]*s+n[15]*r,this}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this.w/=t.w,this}divideScalar(t){return this.multiplyScalar(1/t)}setAxisAngleFromQuaternion(t){this.w=2*Math.acos(t.w);const e=Math.sqrt(1-t.w*t.w);return e<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=t.x/e,this.y=t.y/e,this.z=t.z/e),this}setAxisAngleFromRotationMatrix(t){let e,i,s,r;const n=.01,a=.1,o=t.elements,h=o[0],l=o[4],c=o[8],u=o[1],d=o[5],p=o[9],m=o[2],y=o[6],g=o[10];if(Math.abs(l-u)o&&t>f?tf?o=0?1:-1,s=1-e*e;if(s>Number.EPSILON){const r=Math.sqrt(s),n=Math.atan2(r,e*i);t=Math.sin(t*n)/r,a=Math.sin(a*n)/r}const r=a*i;if(o=o*t+u*r,h=h*t+d*r,l=l*t+p*r,c=c*t+m*r,t===1-a){const t=1/Math.sqrt(o*o+h*h+l*l+c*c);o*=t,h*=t,l*=t,c*=t}}t[e]=o,t[e+1]=h,t[e+2]=l,t[e+3]=c}static multiplyQuaternionsFlat(t,e,i,s,r,n){const a=i[s],o=i[s+1],h=i[s+2],l=i[s+3],c=r[n],u=r[n+1],d=r[n+2],p=r[n+3];return t[e]=a*p+l*c+o*d-h*u,t[e+1]=o*p+l*u+h*c-a*d,t[e+2]=h*p+l*d+a*u-o*c,t[e+3]=l*p-a*c-o*u-h*d,t}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get w(){return this._w}set w(t){this._w=t,this._onChangeCallback()}set(t,e,i,s){return this._x=t,this._y=e,this._z=i,this._w=s,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(t){return this._x=t.x,this._y=t.y,this._z=t.z,this._w=t.w,this._onChangeCallback(),this}setFromEuler(t,e=!0){const i=t._x,s=t._y,r=t._z,n=t._order,a=Math.cos,o=Math.sin,h=a(i/2),l=a(s/2),c=a(r/2),u=o(i/2),d=o(s/2),p=o(r/2);switch(n){case"XYZ":this._x=u*l*c+h*d*p,this._y=h*d*c-u*l*p,this._z=h*l*p+u*d*c,this._w=h*l*c-u*d*p;break;case"YXZ":this._x=u*l*c+h*d*p,this._y=h*d*c-u*l*p,this._z=h*l*p-u*d*c,this._w=h*l*c+u*d*p;break;case"ZXY":this._x=u*l*c-h*d*p,this._y=h*d*c+u*l*p,this._z=h*l*p+u*d*c,this._w=h*l*c-u*d*p;break;case"ZYX":this._x=u*l*c-h*d*p,this._y=h*d*c+u*l*p,this._z=h*l*p-u*d*c,this._w=h*l*c+u*d*p;break;case"YZX":this._x=u*l*c+h*d*p,this._y=h*d*c+u*l*p,this._z=h*l*p-u*d*c,this._w=h*l*c-u*d*p;break;case"XZY":this._x=u*l*c-h*d*p,this._y=h*d*c-u*l*p,this._z=h*l*p+u*d*c,this._w=h*l*c+u*d*p;break;default:console.warn("THREE.Quaternion: .setFromEuler() encountered an unknown order: "+n)}return!0===e&&this._onChangeCallback(),this}setFromAxisAngle(t,e){const i=e/2,s=Math.sin(i);return this._x=t.x*s,this._y=t.y*s,this._z=t.z*s,this._w=Math.cos(i),this._onChangeCallback(),this}setFromRotationMatrix(t){const e=t.elements,i=e[0],s=e[4],r=e[8],n=e[1],a=e[5],o=e[9],h=e[2],l=e[6],c=e[10],u=i+a+c;if(u>0){const t=.5/Math.sqrt(u+1);this._w=.25/t,this._x=(l-o)*t,this._y=(r-h)*t,this._z=(n-s)*t}else if(i>a&&i>c){const t=2*Math.sqrt(1+i-a-c);this._w=(l-o)/t,this._x=.25*t,this._y=(s+n)/t,this._z=(r+h)/t}else if(a>c){const t=2*Math.sqrt(1+a-i-c);this._w=(r-h)/t,this._x=(s+n)/t,this._y=.25*t,this._z=(o+l)/t}else{const t=2*Math.sqrt(1+c-i-a);this._w=(n-s)/t,this._x=(r+h)/t,this._y=(o+l)/t,this._z=.25*t}return this._onChangeCallback(),this}setFromUnitVectors(t,e){let i=t.dot(e)+1;return iMath.abs(t.z)?(this._x=-t.y,this._y=t.x,this._z=0,this._w=i):(this._x=0,this._y=-t.z,this._z=t.y,this._w=i)):(this._x=t.y*e.z-t.z*e.y,this._y=t.z*e.x-t.x*e.z,this._z=t.x*e.y-t.y*e.x,this._w=i),this.normalize()}angleTo(t){return 2*Math.acos(Math.abs(Hi(this.dot(t),-1,1)))}rotateTowards(t,e){const i=this.angleTo(t);if(0===i)return this;const s=Math.min(1,e/i);return this.slerp(t,s),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(t){return this._x*t._x+this._y*t._y+this._z*t._z+this._w*t._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let t=this.length();return 0===t?(this._x=0,this._y=0,this._z=0,this._w=1):(t=1/t,this._x=this._x*t,this._y=this._y*t,this._z=this._z*t,this._w=this._w*t),this._onChangeCallback(),this}multiply(t){return this.multiplyQuaternions(this,t)}premultiply(t){return this.multiplyQuaternions(t,this)}multiplyQuaternions(t,e){const i=t._x,s=t._y,r=t._z,n=t._w,a=e._x,o=e._y,h=e._z,l=e._w;return this._x=i*l+n*a+s*h-r*o,this._y=s*l+n*o+r*a-i*h,this._z=r*l+n*h+i*o-s*a,this._w=n*l-i*a-s*o-r*h,this._onChangeCallback(),this}slerp(t,e){if(0===e)return this;if(1===e)return this.copy(t);const i=this._x,s=this._y,r=this._z,n=this._w;let a=n*t._w+i*t._x+s*t._y+r*t._z;if(a<0?(this._w=-t._w,this._x=-t._x,this._y=-t._y,this._z=-t._z,a=-a):this.copy(t),a>=1)return this._w=n,this._x=i,this._y=s,this._z=r,this;const o=1-a*a;if(o<=Number.EPSILON){const t=1-e;return this._w=t*n+e*this._w,this._x=t*i+e*this._x,this._y=t*s+e*this._y,this._z=t*r+e*this._z,this.normalize(),this}const h=Math.sqrt(o),l=Math.atan2(h,a),c=Math.sin((1-e)*l)/h,u=Math.sin(e*l)/h;return this._w=n*c+this._w*u,this._x=i*c+this._x*u,this._y=s*c+this._y*u,this._z=r*c+this._z*u,this._onChangeCallback(),this}slerpQuaternions(t,e,i){return this.copy(t).slerp(e,i)}random(){const t=2*Math.PI*Math.random(),e=2*Math.PI*Math.random(),i=Math.random(),s=Math.sqrt(1-i),r=Math.sqrt(i);return this.set(s*Math.sin(t),s*Math.cos(t),r*Math.sin(e),r*Math.cos(e))}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._w===this._w}fromArray(t,e=0){return this._x=t[e],this._y=t[e+1],this._z=t[e+2],this._w=t[e+3],this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._w,t}fromBufferAttribute(t,e){return this._x=t.getX(e),this._y=t.getY(e),this._z=t.getZ(e),this._w=t.getW(e),this._onChangeCallback(),this}toJSON(){return this.toArray()}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}}class Bs{constructor(t=0,e=0,i=0){Bs.prototype.isVector3=!0,this.x=t,this.y=e,this.z=i}set(t,e,i){return void 0===i&&(i=this.z),this.x=t,this.y=e,this.z=i,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this}multiplyVectors(t,e){return this.x=t.x*e.x,this.y=t.y*e.y,this.z=t.z*e.z,this}applyEuler(t){return this.applyQuaternion(Rs.setFromEuler(t))}applyAxisAngle(t,e){return this.applyQuaternion(Rs.setFromAxisAngle(t,e))}applyMatrix3(t){const e=this.x,i=this.y,s=this.z,r=t.elements;return this.x=r[0]*e+r[3]*i+r[6]*s,this.y=r[1]*e+r[4]*i+r[7]*s,this.z=r[2]*e+r[5]*i+r[8]*s,this}applyNormalMatrix(t){return this.applyMatrix3(t).normalize()}applyMatrix4(t){const e=this.x,i=this.y,s=this.z,r=t.elements,n=1/(r[3]*e+r[7]*i+r[11]*s+r[15]);return this.x=(r[0]*e+r[4]*i+r[8]*s+r[12])*n,this.y=(r[1]*e+r[5]*i+r[9]*s+r[13])*n,this.z=(r[2]*e+r[6]*i+r[10]*s+r[14])*n,this}applyQuaternion(t){const e=this.x,i=this.y,s=this.z,r=t.x,n=t.y,a=t.z,o=t.w,h=2*(n*s-a*i),l=2*(a*e-r*s),c=2*(r*i-n*e);return this.x=e+o*h+n*c-a*l,this.y=i+o*l+a*h-r*c,this.z=s+o*c+r*l-n*h,this}project(t){return this.applyMatrix4(t.matrixWorldInverse).applyMatrix4(t.projectionMatrix)}unproject(t){return this.applyMatrix4(t.projectionMatrixInverse).applyMatrix4(t.matrixWorld)}transformDirection(t){const e=this.x,i=this.y,s=this.z,r=t.elements;return this.x=r[0]*e+r[4]*i+r[8]*s,this.y=r[1]*e+r[5]*i+r[9]*s,this.z=r[2]*e+r[6]*i+r[10]*s,this.normalize()}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this}divideScalar(t){return this.multiplyScalar(1/t)}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this}clamp(t,e){return this.x=Hi(this.x,t.x,e.x),this.y=Hi(this.y,t.y,e.y),this.z=Hi(this.z,t.z,e.z),this}clampScalar(t,e){return this.x=Hi(this.x,t,e),this.y=Hi(this.y,t,e),this.z=Hi(this.z,t,e),this}clampLength(t,e){const i=this.length();return this.divideScalar(i||1).multiplyScalar(Hi(i,t,e))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this}lerpVectors(t,e,i){return this.x=t.x+(e.x-t.x)*i,this.y=t.y+(e.y-t.y)*i,this.z=t.z+(e.z-t.z)*i,this}cross(t){return this.crossVectors(this,t)}crossVectors(t,e){const i=t.x,s=t.y,r=t.z,n=e.x,a=e.y,o=e.z;return this.x=s*o-r*a,this.y=r*n-i*o,this.z=i*a-s*n,this}projectOnVector(t){const e=t.lengthSq();if(0===e)return this.set(0,0,0);const i=t.dot(this)/e;return this.copy(t).multiplyScalar(i)}projectOnPlane(t){return ks.copy(this).projectOnVector(t),this.sub(ks)}reflect(t){return this.sub(ks.copy(t).multiplyScalar(2*this.dot(t)))}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(0===e)return Math.PI/2;const i=this.dot(t)/e;return Math.acos(Hi(i,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,i=this.y-t.y,s=this.z-t.z;return e*e+i*i+s*s}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)+Math.abs(this.z-t.z)}setFromSpherical(t){return this.setFromSphericalCoords(t.radius,t.phi,t.theta)}setFromSphericalCoords(t,e,i){const s=Math.sin(e)*t;return this.x=s*Math.sin(i),this.y=Math.cos(e)*t,this.z=s*Math.cos(i),this}setFromCylindrical(t){return this.setFromCylindricalCoords(t.radius,t.theta,t.y)}setFromCylindricalCoords(t,e,i){return this.x=t*Math.sin(e),this.y=i,this.z=t*Math.cos(e),this}setFromMatrixPosition(t){const e=t.elements;return this.x=e[12],this.y=e[13],this.z=e[14],this}setFromMatrixScale(t){const e=this.setFromMatrixColumn(t,0).length(),i=this.setFromMatrixColumn(t,1).length(),s=this.setFromMatrixColumn(t,2).length();return this.x=e,this.y=i,this.z=s,this}setFromMatrixColumn(t,e){return this.fromArray(t.elements,4*e)}setFromMatrix3Column(t,e){return this.fromArray(t.elements,3*e)}setFromEuler(t){return this.x=t._x,this.y=t._y,this.z=t._z,this}setFromColor(t){return this.x=t.r,this.y=t.g,this.z=t.b,this}equals(t){return t.x===this.x&&t.y===this.y&&t.z===this.z}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this.z=t[e+2],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){const t=Math.random()*Math.PI*2,e=2*Math.random()-1,i=Math.sqrt(1-e*e);return this.x=i*Math.cos(t),this.y=e,this.z=i*Math.sin(t),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}}const ks=new Bs,Rs=new Is;class Es{constructor(t=new Bs(1/0,1/0,1/0),e=new Bs(-1/0,-1/0,-1/0)){this.isBox3=!0,this.min=t,this.max=e}set(t,e){return this.min.copy(t),this.max.copy(e),this}setFromArray(t){this.makeEmpty();for(let e=0,i=t.length;e=this.min.x&&t.x<=this.max.x&&t.y>=this.min.y&&t.y<=this.max.y&&t.z>=this.min.z&&t.z<=this.max.z}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y&&this.min.z<=t.min.z&&t.max.z<=this.max.z}getParameter(t,e){return e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y),(t.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(t){return t.max.x>=this.min.x&&t.min.x<=this.max.x&&t.max.y>=this.min.y&&t.min.y<=this.max.y&&t.max.z>=this.min.z&&t.min.z<=this.max.z}intersectsSphere(t){return this.clampPoint(t.center,Os),Os.distanceToSquared(t.center)<=t.radius*t.radius}intersectsPlane(t){let e,i;return t.normal.x>0?(e=t.normal.x*this.min.x,i=t.normal.x*this.max.x):(e=t.normal.x*this.max.x,i=t.normal.x*this.min.x),t.normal.y>0?(e+=t.normal.y*this.min.y,i+=t.normal.y*this.max.y):(e+=t.normal.y*this.max.y,i+=t.normal.y*this.min.y),t.normal.z>0?(e+=t.normal.z*this.min.z,i+=t.normal.z*this.max.z):(e+=t.normal.z*this.max.z,i+=t.normal.z*this.min.z),e<=-t.constant&&i>=-t.constant}intersectsTriangle(t){if(this.isEmpty())return!1;this.getCenter(Ds),Hs.subVectors(this.max,Ds),Fs.subVectors(t.a,Ds),Ls.subVectors(t.b,Ds),Vs.subVectors(t.c,Ds),js.subVectors(Ls,Fs),Ws.subVectors(Vs,Ls),Us.subVectors(Fs,Vs);let e=[0,-js.z,js.y,0,-Ws.z,Ws.y,0,-Us.z,Us.y,js.z,0,-js.x,Ws.z,0,-Ws.x,Us.z,0,-Us.x,-js.y,js.x,0,-Ws.y,Ws.x,0,-Us.y,Us.x,0];return!!Xs(e,Fs,Ls,Vs,Hs)&&(e=[1,0,0,0,1,0,0,0,1],!!Xs(e,Fs,Ls,Vs,Hs)&&(qs.crossVectors(js,Ws),e=[qs.x,qs.y,qs.z],Xs(e,Fs,Ls,Vs,Hs)))}clampPoint(t,e){return e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return this.clampPoint(t,Os).distanceTo(t)}getBoundingSphere(t){return this.isEmpty()?t.makeEmpty():(this.getCenter(t.center),t.radius=.5*this.getSize(Os).length()),t}intersect(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}applyMatrix4(t){return this.isEmpty()||(Ps[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(t),Ps[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(t),Ps[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(t),Ps[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(t),Ps[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(t),Ps[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(t),Ps[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(t),Ps[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(t),this.setFromPoints(Ps)),this}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}}const Ps=[new Bs,new Bs,new Bs,new Bs,new Bs,new Bs,new Bs,new Bs],Os=new Bs,Ns=new Es,Fs=new Bs,Ls=new Bs,Vs=new Bs,js=new Bs,Ws=new Bs,Us=new Bs,Ds=new Bs,Hs=new Bs,qs=new Bs,Js=new Bs;function Xs(t,e,i,s,r){for(let n=0,a=t.length-3;n<=a;n+=3){Js.fromArray(t,n);const a=r.x*Math.abs(Js.x)+r.y*Math.abs(Js.y)+r.z*Math.abs(Js.z),o=e.dot(Js),h=i.dot(Js),l=s.dot(Js);if(Math.max(-Math.max(o,h,l),Math.min(o,h,l))>a)return!1}return!0}const Ys=new Es,Zs=new Bs,Gs=new Bs;class $s{constructor(t=new Bs,e=-1){this.isSphere=!0,this.center=t,this.radius=e}set(t,e){return this.center.copy(t),this.radius=e,this}setFromPoints(t,e){const i=this.center;void 0!==e?i.copy(e):Ys.setFromPoints(t).getCenter(i);let s=0;for(let e=0,r=t.length;ethis.radius*this.radius&&(e.sub(this.center).normalize(),e.multiplyScalar(this.radius).add(this.center)),e}getBoundingBox(t){return this.isEmpty()?(t.makeEmpty(),t):(t.set(this.center,this.center),t.expandByScalar(this.radius),t)}applyMatrix4(t){return this.center.applyMatrix4(t),this.radius=this.radius*t.getMaxScaleOnAxis(),this}translate(t){return this.center.add(t),this}expandByPoint(t){if(this.isEmpty())return this.center.copy(t),this.radius=0,this;Zs.subVectors(t,this.center);const e=Zs.lengthSq();if(e>this.radius*this.radius){const t=Math.sqrt(e),i=.5*(t-this.radius);this.center.addScaledVector(Zs,i/t),this.radius+=i}return this}union(t){return t.isEmpty()?this:this.isEmpty()?(this.copy(t),this):(!0===this.center.equals(t.center)?this.radius=Math.max(this.radius,t.radius):(Gs.subVectors(t.center,this.center).setLength(t.radius),this.expandByPoint(Zs.copy(t.center).add(Gs)),this.expandByPoint(Zs.copy(t.center).sub(Gs))),this)}equals(t){return t.center.equals(this.center)&&t.radius===this.radius}clone(){return(new this.constructor).copy(this)}}const Qs=new Bs,Ks=new Bs,tr=new Bs,er=new Bs,ir=new Bs,sr=new Bs,rr=new Bs;class nr{constructor(t=new Bs,e=new Bs(0,0,-1)){this.origin=t,this.direction=e}set(t,e){return this.origin.copy(t),this.direction.copy(e),this}copy(t){return this.origin.copy(t.origin),this.direction.copy(t.direction),this}at(t,e){return e.copy(this.origin).addScaledVector(this.direction,t)}lookAt(t){return this.direction.copy(t).sub(this.origin).normalize(),this}recast(t){return this.origin.copy(this.at(t,Qs)),this}closestPointToPoint(t,e){e.subVectors(t,this.origin);const i=e.dot(this.direction);return i<0?e.copy(this.origin):e.copy(this.origin).addScaledVector(this.direction,i)}distanceToPoint(t){return Math.sqrt(this.distanceSqToPoint(t))}distanceSqToPoint(t){const e=Qs.subVectors(t,this.origin).dot(this.direction);return e<0?this.origin.distanceToSquared(t):(Qs.copy(this.origin).addScaledVector(this.direction,e),Qs.distanceToSquared(t))}distanceSqToSegment(t,e,i,s){Ks.copy(t).add(e).multiplyScalar(.5),tr.copy(e).sub(t).normalize(),er.copy(this.origin).sub(Ks);const r=.5*t.distanceTo(e),n=-this.direction.dot(tr),a=er.dot(this.direction),o=-er.dot(tr),h=er.lengthSq(),l=Math.abs(1-n*n);let c,u,d,p;if(l>0)if(c=n*o-a,u=n*a-o,p=r*l,c>=0)if(u>=-p)if(u<=p){const t=1/l;c*=t,u*=t,d=c*(c+n*u+2*a)+u*(n*c+u+2*o)+h}else u=r,c=Math.max(0,-(n*u+a)),d=-c*c+u*(u+2*o)+h;else u=-r,c=Math.max(0,-(n*u+a)),d=-c*c+u*(u+2*o)+h;else u<=-p?(c=Math.max(0,-(-n*r+a)),u=c>0?-r:Math.min(Math.max(-r,-o),r),d=-c*c+u*(u+2*o)+h):u<=p?(c=0,u=Math.min(Math.max(-r,-o),r),d=u*(u+2*o)+h):(c=Math.max(0,-(n*r+a)),u=c>0?r:Math.min(Math.max(-r,-o),r),d=-c*c+u*(u+2*o)+h);else u=n>0?-r:r,c=Math.max(0,-(n*u+a)),d=-c*c+u*(u+2*o)+h;return i&&i.copy(this.origin).addScaledVector(this.direction,c),s&&s.copy(Ks).addScaledVector(tr,u),d}intersectSphere(t,e){Qs.subVectors(t.center,this.origin);const i=Qs.dot(this.direction),s=Qs.dot(Qs)-i*i,r=t.radius*t.radius;if(s>r)return null;const n=Math.sqrt(r-s),a=i-n,o=i+n;return o<0?null:a<0?this.at(o,e):this.at(a,e)}intersectsSphere(t){return this.distanceSqToPoint(t.center)<=t.radius*t.radius}distanceToPlane(t){const e=t.normal.dot(this.direction);if(0===e)return 0===t.distanceToPoint(this.origin)?0:null;const i=-(this.origin.dot(t.normal)+t.constant)/e;return i>=0?i:null}intersectPlane(t,e){const i=this.distanceToPlane(t);return null===i?null:this.at(i,e)}intersectsPlane(t){const e=t.distanceToPoint(this.origin);if(0===e)return!0;return t.normal.dot(this.direction)*e<0}intersectBox(t,e){let i,s,r,n,a,o;const h=1/this.direction.x,l=1/this.direction.y,c=1/this.direction.z,u=this.origin;return h>=0?(i=(t.min.x-u.x)*h,s=(t.max.x-u.x)*h):(i=(t.max.x-u.x)*h,s=(t.min.x-u.x)*h),l>=0?(r=(t.min.y-u.y)*l,n=(t.max.y-u.y)*l):(r=(t.max.y-u.y)*l,n=(t.min.y-u.y)*l),i>n||r>s?null:((r>i||isNaN(i))&&(i=r),(n=0?(a=(t.min.z-u.z)*c,o=(t.max.z-u.z)*c):(a=(t.max.z-u.z)*c,o=(t.min.z-u.z)*c),i>o||a>s?null:((a>i||i!=i)&&(i=a),(o=0?i:s,e)))}intersectsBox(t){return null!==this.intersectBox(t,Qs)}intersectTriangle(t,e,i,s,r){ir.subVectors(e,t),sr.subVectors(i,t),rr.crossVectors(ir,sr);let n,a=this.direction.dot(rr);if(a>0){if(s)return null;n=1}else{if(!(a<0))return null;n=-1,a=-a}er.subVectors(this.origin,t);const o=n*this.direction.dot(sr.crossVectors(er,sr));if(o<0)return null;const h=n*this.direction.dot(ir.cross(er));if(h<0)return null;if(o+h>a)return null;const l=-n*er.dot(rr);return l<0?null:this.at(l/a,r)}applyMatrix4(t){return this.origin.applyMatrix4(t),this.direction.transformDirection(t),this}equals(t){return t.origin.equals(this.origin)&&t.direction.equals(this.direction)}clone(){return(new this.constructor).copy(this)}}class ar{constructor(t,e,i,s,r,n,a,o,h,l,c,u,d,p,m,y){ar.prototype.isMatrix4=!0,this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],void 0!==t&&this.set(t,e,i,s,r,n,a,o,h,l,c,u,d,p,m,y)}set(t,e,i,s,r,n,a,o,h,l,c,u,d,p,m,y){const g=this.elements;return g[0]=t,g[4]=e,g[8]=i,g[12]=s,g[1]=r,g[5]=n,g[9]=a,g[13]=o,g[2]=h,g[6]=l,g[10]=c,g[14]=u,g[3]=d,g[7]=p,g[11]=m,g[15]=y,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return(new ar).fromArray(this.elements)}copy(t){const e=this.elements,i=t.elements;return e[0]=i[0],e[1]=i[1],e[2]=i[2],e[3]=i[3],e[4]=i[4],e[5]=i[5],e[6]=i[6],e[7]=i[7],e[8]=i[8],e[9]=i[9],e[10]=i[10],e[11]=i[11],e[12]=i[12],e[13]=i[13],e[14]=i[14],e[15]=i[15],this}copyPosition(t){const e=this.elements,i=t.elements;return e[12]=i[12],e[13]=i[13],e[14]=i[14],this}setFromMatrix3(t){const e=t.elements;return this.set(e[0],e[3],e[6],0,e[1],e[4],e[7],0,e[2],e[5],e[8],0,0,0,0,1),this}extractBasis(t,e,i){return t.setFromMatrixColumn(this,0),e.setFromMatrixColumn(this,1),i.setFromMatrixColumn(this,2),this}makeBasis(t,e,i){return this.set(t.x,e.x,i.x,0,t.y,e.y,i.y,0,t.z,e.z,i.z,0,0,0,0,1),this}extractRotation(t){const e=this.elements,i=t.elements,s=1/or.setFromMatrixColumn(t,0).length(),r=1/or.setFromMatrixColumn(t,1).length(),n=1/or.setFromMatrixColumn(t,2).length();return e[0]=i[0]*s,e[1]=i[1]*s,e[2]=i[2]*s,e[3]=0,e[4]=i[4]*r,e[5]=i[5]*r,e[6]=i[6]*r,e[7]=0,e[8]=i[8]*n,e[9]=i[9]*n,e[10]=i[10]*n,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromEuler(t){const e=this.elements,i=t.x,s=t.y,r=t.z,n=Math.cos(i),a=Math.sin(i),o=Math.cos(s),h=Math.sin(s),l=Math.cos(r),c=Math.sin(r);if("XYZ"===t.order){const t=n*l,i=n*c,s=a*l,r=a*c;e[0]=o*l,e[4]=-o*c,e[8]=h,e[1]=i+s*h,e[5]=t-r*h,e[9]=-a*o,e[2]=r-t*h,e[6]=s+i*h,e[10]=n*o}else if("YXZ"===t.order){const t=o*l,i=o*c,s=h*l,r=h*c;e[0]=t+r*a,e[4]=s*a-i,e[8]=n*h,e[1]=n*c,e[5]=n*l,e[9]=-a,e[2]=i*a-s,e[6]=r+t*a,e[10]=n*o}else if("ZXY"===t.order){const t=o*l,i=o*c,s=h*l,r=h*c;e[0]=t-r*a,e[4]=-n*c,e[8]=s+i*a,e[1]=i+s*a,e[5]=n*l,e[9]=r-t*a,e[2]=-n*h,e[6]=a,e[10]=n*o}else if("ZYX"===t.order){const t=n*l,i=n*c,s=a*l,r=a*c;e[0]=o*l,e[4]=s*h-i,e[8]=t*h+r,e[1]=o*c,e[5]=r*h+t,e[9]=i*h-s,e[2]=-h,e[6]=a*o,e[10]=n*o}else if("YZX"===t.order){const t=n*o,i=n*h,s=a*o,r=a*h;e[0]=o*l,e[4]=r-t*c,e[8]=s*c+i,e[1]=c,e[5]=n*l,e[9]=-a*l,e[2]=-h*l,e[6]=i*c+s,e[10]=t-r*c}else if("XZY"===t.order){const t=n*o,i=n*h,s=a*o,r=a*h;e[0]=o*l,e[4]=-c,e[8]=h*l,e[1]=t*c+r,e[5]=n*l,e[9]=i*c-s,e[2]=s*c-i,e[6]=a*l,e[10]=r*c+t}return e[3]=0,e[7]=0,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromQuaternion(t){return this.compose(lr,t,cr)}lookAt(t,e,i){const s=this.elements;return pr.subVectors(t,e),0===pr.lengthSq()&&(pr.z=1),pr.normalize(),ur.crossVectors(i,pr),0===ur.lengthSq()&&(1===Math.abs(i.z)?pr.x+=1e-4:pr.z+=1e-4,pr.normalize(),ur.crossVectors(i,pr)),ur.normalize(),dr.crossVectors(pr,ur),s[0]=ur.x,s[4]=dr.x,s[8]=pr.x,s[1]=ur.y,s[5]=dr.y,s[9]=pr.y,s[2]=ur.z,s[6]=dr.z,s[10]=pr.z,this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const i=t.elements,s=e.elements,r=this.elements,n=i[0],a=i[4],o=i[8],h=i[12],l=i[1],c=i[5],u=i[9],d=i[13],p=i[2],m=i[6],y=i[10],g=i[14],f=i[3],x=i[7],b=i[11],v=i[15],w=s[0],M=s[4],S=s[8],_=s[12],A=s[1],T=s[5],z=s[9],C=s[13],I=s[2],B=s[6],k=s[10],R=s[14],E=s[3],P=s[7],O=s[11],N=s[15];return r[0]=n*w+a*A+o*I+h*E,r[4]=n*M+a*T+o*B+h*P,r[8]=n*S+a*z+o*k+h*O,r[12]=n*_+a*C+o*R+h*N,r[1]=l*w+c*A+u*I+d*E,r[5]=l*M+c*T+u*B+d*P,r[9]=l*S+c*z+u*k+d*O,r[13]=l*_+c*C+u*R+d*N,r[2]=p*w+m*A+y*I+g*E,r[6]=p*M+m*T+y*B+g*P,r[10]=p*S+m*z+y*k+g*O,r[14]=p*_+m*C+y*R+g*N,r[3]=f*w+x*A+b*I+v*E,r[7]=f*M+x*T+b*B+v*P,r[11]=f*S+x*z+b*k+v*O,r[15]=f*_+x*C+b*R+v*N,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[4]*=t,e[8]*=t,e[12]*=t,e[1]*=t,e[5]*=t,e[9]*=t,e[13]*=t,e[2]*=t,e[6]*=t,e[10]*=t,e[14]*=t,e[3]*=t,e[7]*=t,e[11]*=t,e[15]*=t,this}determinant(){const t=this.elements,e=t[0],i=t[4],s=t[8],r=t[12],n=t[1],a=t[5],o=t[9],h=t[13],l=t[2],c=t[6],u=t[10],d=t[14];return t[3]*(+r*o*c-s*h*c-r*a*u+i*h*u+s*a*d-i*o*d)+t[7]*(+e*o*d-e*h*u+r*n*u-s*n*d+s*h*l-r*o*l)+t[11]*(+e*h*c-e*a*d-r*n*c+i*n*d+r*a*l-i*h*l)+t[15]*(-s*a*l-e*o*c+e*a*u+s*n*c-i*n*u+i*o*l)}transpose(){const t=this.elements;let e;return e=t[1],t[1]=t[4],t[4]=e,e=t[2],t[2]=t[8],t[8]=e,e=t[6],t[6]=t[9],t[9]=e,e=t[3],t[3]=t[12],t[12]=e,e=t[7],t[7]=t[13],t[13]=e,e=t[11],t[11]=t[14],t[14]=e,this}setPosition(t,e,i){const s=this.elements;return t.isVector3?(s[12]=t.x,s[13]=t.y,s[14]=t.z):(s[12]=t,s[13]=e,s[14]=i),this}invert(){const t=this.elements,e=t[0],i=t[1],s=t[2],r=t[3],n=t[4],a=t[5],o=t[6],h=t[7],l=t[8],c=t[9],u=t[10],d=t[11],p=t[12],m=t[13],y=t[14],g=t[15],f=c*y*h-m*u*h+m*o*d-a*y*d-c*o*g+a*u*g,x=p*u*h-l*y*h-p*o*d+n*y*d+l*o*g-n*u*g,b=l*m*h-p*c*h+p*a*d-n*m*d-l*a*g+n*c*g,v=p*c*o-l*m*o-p*a*u+n*m*u+l*a*y-n*c*y,w=e*f+i*x+s*b+r*v;if(0===w)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const M=1/w;return t[0]=f*M,t[1]=(m*u*r-c*y*r-m*s*d+i*y*d+c*s*g-i*u*g)*M,t[2]=(a*y*r-m*o*r+m*s*h-i*y*h-a*s*g+i*o*g)*M,t[3]=(c*o*r-a*u*r-c*s*h+i*u*h+a*s*d-i*o*d)*M,t[4]=x*M,t[5]=(l*y*r-p*u*r+p*s*d-e*y*d-l*s*g+e*u*g)*M,t[6]=(p*o*r-n*y*r-p*s*h+e*y*h+n*s*g-e*o*g)*M,t[7]=(n*u*r-l*o*r+l*s*h-e*u*h-n*s*d+e*o*d)*M,t[8]=b*M,t[9]=(p*c*r-l*m*r-p*i*d+e*m*d+l*i*g-e*c*g)*M,t[10]=(n*m*r-p*a*r+p*i*h-e*m*h-n*i*g+e*a*g)*M,t[11]=(l*a*r-n*c*r-l*i*h+e*c*h+n*i*d-e*a*d)*M,t[12]=v*M,t[13]=(l*m*s-p*c*s+p*i*u-e*m*u-l*i*y+e*c*y)*M,t[14]=(p*a*s-n*m*s-p*i*o+e*m*o+n*i*y-e*a*y)*M,t[15]=(n*c*s-l*a*s+l*i*o-e*c*o-n*i*u+e*a*u)*M,this}scale(t){const e=this.elements,i=t.x,s=t.y,r=t.z;return e[0]*=i,e[4]*=s,e[8]*=r,e[1]*=i,e[5]*=s,e[9]*=r,e[2]*=i,e[6]*=s,e[10]*=r,e[3]*=i,e[7]*=s,e[11]*=r,this}getMaxScaleOnAxis(){const t=this.elements,e=t[0]*t[0]+t[1]*t[1]+t[2]*t[2],i=t[4]*t[4]+t[5]*t[5]+t[6]*t[6],s=t[8]*t[8]+t[9]*t[9]+t[10]*t[10];return Math.sqrt(Math.max(e,i,s))}makeTranslation(t,e,i){return t.isVector3?this.set(1,0,0,t.x,0,1,0,t.y,0,0,1,t.z,0,0,0,1):this.set(1,0,0,t,0,1,0,e,0,0,1,i,0,0,0,1),this}makeRotationX(t){const e=Math.cos(t),i=Math.sin(t);return this.set(1,0,0,0,0,e,-i,0,0,i,e,0,0,0,0,1),this}makeRotationY(t){const e=Math.cos(t),i=Math.sin(t);return this.set(e,0,i,0,0,1,0,0,-i,0,e,0,0,0,0,1),this}makeRotationZ(t){const e=Math.cos(t),i=Math.sin(t);return this.set(e,-i,0,0,i,e,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(t,e){const i=Math.cos(e),s=Math.sin(e),r=1-i,n=t.x,a=t.y,o=t.z,h=r*n,l=r*a;return this.set(h*n+i,h*a-s*o,h*o+s*a,0,h*a+s*o,l*a+i,l*o-s*n,0,h*o-s*a,l*o+s*n,r*o*o+i,0,0,0,0,1),this}makeScale(t,e,i){return this.set(t,0,0,0,0,e,0,0,0,0,i,0,0,0,0,1),this}makeShear(t,e,i,s,r,n){return this.set(1,i,r,0,t,1,n,0,e,s,1,0,0,0,0,1),this}compose(t,e,i){const s=this.elements,r=e._x,n=e._y,a=e._z,o=e._w,h=r+r,l=n+n,c=a+a,u=r*h,d=r*l,p=r*c,m=n*l,y=n*c,g=a*c,f=o*h,x=o*l,b=o*c,v=i.x,w=i.y,M=i.z;return s[0]=(1-(m+g))*v,s[1]=(d+b)*v,s[2]=(p-x)*v,s[3]=0,s[4]=(d-b)*w,s[5]=(1-(u+g))*w,s[6]=(y+f)*w,s[7]=0,s[8]=(p+x)*M,s[9]=(y-f)*M,s[10]=(1-(u+m))*M,s[11]=0,s[12]=t.x,s[13]=t.y,s[14]=t.z,s[15]=1,this}decompose(t,e,i){const s=this.elements;let r=or.set(s[0],s[1],s[2]).length();const n=or.set(s[4],s[5],s[6]).length(),a=or.set(s[8],s[9],s[10]).length();this.determinant()<0&&(r=-r),t.x=s[12],t.y=s[13],t.z=s[14],hr.copy(this);const o=1/r,h=1/n,l=1/a;return hr.elements[0]*=o,hr.elements[1]*=o,hr.elements[2]*=o,hr.elements[4]*=h,hr.elements[5]*=h,hr.elements[6]*=h,hr.elements[8]*=l,hr.elements[9]*=l,hr.elements[10]*=l,e.setFromRotationMatrix(hr),i.x=r,i.y=n,i.z=a,this}makePerspective(t,e,i,s,r,n,a=2e3){const o=this.elements,h=2*r/(e-t),l=2*r/(i-s),c=(e+t)/(e-t),u=(i+s)/(i-s);let d,p;if(a===Oi)d=-(n+r)/(n-r),p=-2*n*r/(n-r);else{if(a!==Ni)throw new Error("THREE.Matrix4.makePerspective(): Invalid coordinate system: "+a);d=-n/(n-r),p=-n*r/(n-r)}return o[0]=h,o[4]=0,o[8]=c,o[12]=0,o[1]=0,o[5]=l,o[9]=u,o[13]=0,o[2]=0,o[6]=0,o[10]=d,o[14]=p,o[3]=0,o[7]=0,o[11]=-1,o[15]=0,this}makeOrthographic(t,e,i,s,r,n,a=2e3){const o=this.elements,h=1/(e-t),l=1/(i-s),c=1/(n-r),u=(e+t)*h,d=(i+s)*l;let p,m;if(a===Oi)p=(n+r)*c,m=-2*c;else{if(a!==Ni)throw new Error("THREE.Matrix4.makeOrthographic(): Invalid coordinate system: "+a);p=r*c,m=-1*c}return o[0]=2*h,o[4]=0,o[8]=0,o[12]=-u,o[1]=0,o[5]=2*l,o[9]=0,o[13]=-d,o[2]=0,o[6]=0,o[10]=m,o[14]=-p,o[3]=0,o[7]=0,o[11]=0,o[15]=1,this}equals(t){const e=this.elements,i=t.elements;for(let t=0;t<16;t++)if(e[t]!==i[t])return!1;return!0}fromArray(t,e=0){for(let i=0;i<16;i++)this.elements[i]=t[i+e];return this}toArray(t=[],e=0){const i=this.elements;return t[e]=i[0],t[e+1]=i[1],t[e+2]=i[2],t[e+3]=i[3],t[e+4]=i[4],t[e+5]=i[5],t[e+6]=i[6],t[e+7]=i[7],t[e+8]=i[8],t[e+9]=i[9],t[e+10]=i[10],t[e+11]=i[11],t[e+12]=i[12],t[e+13]=i[13],t[e+14]=i[14],t[e+15]=i[15],t}}const or=new Bs,hr=new ar,lr=new Bs(0,0,0),cr=new Bs(1,1,1),ur=new Bs,dr=new Bs,pr=new Bs,mr=new ar,yr=new Is;class gr{constructor(t=0,e=0,i=0,s=gr.DEFAULT_ORDER){this.isEuler=!0,this._x=t,this._y=e,this._z=i,this._order=s}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get order(){return this._order}set order(t){this._order=t,this._onChangeCallback()}set(t,e,i,s=this._order){return this._x=t,this._y=e,this._z=i,this._order=s,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._order)}copy(t){return this._x=t._x,this._y=t._y,this._z=t._z,this._order=t._order,this._onChangeCallback(),this}setFromRotationMatrix(t,e=this._order,i=!0){const s=t.elements,r=s[0],n=s[4],a=s[8],o=s[1],h=s[5],l=s[9],c=s[2],u=s[6],d=s[10];switch(e){case"XYZ":this._y=Math.asin(Hi(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(-l,d),this._z=Math.atan2(-n,r)):(this._x=Math.atan2(u,h),this._z=0);break;case"YXZ":this._x=Math.asin(-Hi(l,-1,1)),Math.abs(l)<.9999999?(this._y=Math.atan2(a,d),this._z=Math.atan2(o,h)):(this._y=Math.atan2(-c,r),this._z=0);break;case"ZXY":this._x=Math.asin(Hi(u,-1,1)),Math.abs(u)<.9999999?(this._y=Math.atan2(-c,d),this._z=Math.atan2(-n,h)):(this._y=0,this._z=Math.atan2(o,r));break;case"ZYX":this._y=Math.asin(-Hi(c,-1,1)),Math.abs(c)<.9999999?(this._x=Math.atan2(u,d),this._z=Math.atan2(o,r)):(this._x=0,this._z=Math.atan2(-n,h));break;case"YZX":this._z=Math.asin(Hi(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(-l,h),this._y=Math.atan2(-c,r)):(this._x=0,this._y=Math.atan2(a,d));break;case"XZY":this._z=Math.asin(-Hi(n,-1,1)),Math.abs(n)<.9999999?(this._x=Math.atan2(u,h),this._y=Math.atan2(a,r)):(this._x=Math.atan2(-l,d),this._y=0);break;default:console.warn("THREE.Euler: .setFromRotationMatrix() encountered an unknown order: "+e)}return this._order=e,!0===i&&this._onChangeCallback(),this}setFromQuaternion(t,e,i){return mr.makeRotationFromQuaternion(t),this.setFromRotationMatrix(mr,e,i)}setFromVector3(t,e=this._order){return this.set(t.x,t.y,t.z,e)}reorder(t){return yr.setFromEuler(this),this.setFromQuaternion(yr,t)}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._order===this._order}fromArray(t){return this._x=t[0],this._y=t[1],this._z=t[2],void 0!==t[3]&&(this._order=t[3]),this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._order,t}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._order}}gr.DEFAULT_ORDER="XYZ";class fr{constructor(){this.mask=1}set(t){this.mask=1<>>0}enable(t){this.mask|=1<1){for(let t=0;t1){for(let t=0;t0&&(s.userData=this.userData),s.layers=this.layers.mask,s.matrix=this.matrix.toArray(),s.up=this.up.toArray(),!1===this.matrixAutoUpdate&&(s.matrixAutoUpdate=!1),this.isInstancedMesh&&(s.type="InstancedMesh",s.count=this.count,s.instanceMatrix=this.instanceMatrix.toJSON(),null!==this.instanceColor&&(s.instanceColor=this.instanceColor.toJSON())),this.isBatchedMesh&&(s.type="BatchedMesh",s.perObjectFrustumCulled=this.perObjectFrustumCulled,s.sortObjects=this.sortObjects,s.drawRanges=this._drawRanges,s.reservedRanges=this._reservedRanges,s.visibility=this._visibility,s.active=this._active,s.bounds=this._bounds.map((t=>({boxInitialized:t.boxInitialized,boxMin:t.box.min.toArray(),boxMax:t.box.max.toArray(),sphereInitialized:t.sphereInitialized,sphereRadius:t.sphere.radius,sphereCenter:t.sphere.center.toArray()}))),s.maxInstanceCount=this._maxInstanceCount,s.maxVertexCount=this._maxVertexCount,s.maxIndexCount=this._maxIndexCount,s.geometryInitialized=this._geometryInitialized,s.geometryCount=this._geometryCount,s.matricesTexture=this._matricesTexture.toJSON(t),null!==this._colorsTexture&&(s.colorsTexture=this._colorsTexture.toJSON(t)),null!==this.boundingSphere&&(s.boundingSphere={center:s.boundingSphere.center.toArray(),radius:s.boundingSphere.radius}),null!==this.boundingBox&&(s.boundingBox={min:s.boundingBox.min.toArray(),max:s.boundingBox.max.toArray()})),this.isScene)this.background&&(this.background.isColor?s.background=this.background.toJSON():this.background.isTexture&&(s.background=this.background.toJSON(t).uuid)),this.environment&&this.environment.isTexture&&!0!==this.environment.isRenderTargetTexture&&(s.environment=this.environment.toJSON(t).uuid);else if(this.isMesh||this.isLine||this.isPoints){s.geometry=r(t.geometries,this.geometry);const e=this.geometry.parameters;if(void 0!==e&&void 0!==e.shapes){const i=e.shapes;if(Array.isArray(i))for(let e=0,s=i.length;e0){s.children=[];for(let e=0;e0){s.animations=[];for(let e=0;e0&&(i.geometries=e),s.length>0&&(i.materials=s),r.length>0&&(i.textures=r),a.length>0&&(i.images=a),o.length>0&&(i.shapes=o),h.length>0&&(i.skeletons=h),l.length>0&&(i.animations=l),c.length>0&&(i.nodes=c)}return i.object=s,i;function n(t){const e=[];for(const i in t){const s=t[i];delete s.metadata,e.push(s)}return e}}clone(t){return(new this.constructor).copy(this,t)}copy(t,e=!0){if(this.name=t.name,this.up.copy(t.up),this.position.copy(t.position),this.rotation.order=t.rotation.order,this.quaternion.copy(t.quaternion),this.scale.copy(t.scale),this.matrix.copy(t.matrix),this.matrixWorld.copy(t.matrixWorld),this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrixWorldAutoUpdate=t.matrixWorldAutoUpdate,this.matrixWorldNeedsUpdate=t.matrixWorldNeedsUpdate,this.layers.mask=t.layers.mask,this.visible=t.visible,this.castShadow=t.castShadow,this.receiveShadow=t.receiveShadow,this.frustumCulled=t.frustumCulled,this.renderOrder=t.renderOrder,this.animations=t.animations.slice(),this.userData=JSON.parse(JSON.stringify(t.userData)),!0===e)for(let e=0;e0?s.multiplyScalar(1/Math.sqrt(r)):s.set(0,0,0)}static getBarycoord(t,e,i,s,r){Pr.subVectors(s,e),Or.subVectors(i,e),Nr.subVectors(t,e);const n=Pr.dot(Pr),a=Pr.dot(Or),o=Pr.dot(Nr),h=Or.dot(Or),l=Or.dot(Nr),c=n*h-a*a;if(0===c)return r.set(0,0,0),null;const u=1/c,d=(h*o-a*l)*u,p=(n*l-a*o)*u;return r.set(1-d-p,p,d)}static containsPoint(t,e,i,s){return null!==this.getBarycoord(t,e,i,s,Fr)&&(Fr.x>=0&&Fr.y>=0&&Fr.x+Fr.y<=1)}static getInterpolation(t,e,i,s,r,n,a,o){return null===this.getBarycoord(t,e,i,s,Fr)?(o.x=0,o.y=0,"z"in o&&(o.z=0),"w"in o&&(o.w=0),null):(o.setScalar(0),o.addScaledVector(r,Fr.x),o.addScaledVector(n,Fr.y),o.addScaledVector(a,Fr.z),o)}static getInterpolatedAttribute(t,e,i,s,r,n){return Hr.setScalar(0),qr.setScalar(0),Jr.setScalar(0),Hr.fromBufferAttribute(t,e),qr.fromBufferAttribute(t,i),Jr.fromBufferAttribute(t,s),n.setScalar(0),n.addScaledVector(Hr,r.x),n.addScaledVector(qr,r.y),n.addScaledVector(Jr,r.z),n}static isFrontFacing(t,e,i,s){return Pr.subVectors(i,e),Or.subVectors(t,e),Pr.cross(Or).dot(s)<0}set(t,e,i){return this.a.copy(t),this.b.copy(e),this.c.copy(i),this}setFromPointsAndIndices(t,e,i,s){return this.a.copy(t[e]),this.b.copy(t[i]),this.c.copy(t[s]),this}setFromAttributeAndIndices(t,e,i,s){return this.a.fromBufferAttribute(t,e),this.b.fromBufferAttribute(t,i),this.c.fromBufferAttribute(t,s),this}clone(){return(new this.constructor).copy(this)}copy(t){return this.a.copy(t.a),this.b.copy(t.b),this.c.copy(t.c),this}getArea(){return Pr.subVectors(this.c,this.b),Or.subVectors(this.a,this.b),.5*Pr.cross(Or).length()}getMidpoint(t){return t.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(t){return Xr.getNormal(this.a,this.b,this.c,t)}getPlane(t){return t.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(t,e){return Xr.getBarycoord(t,this.a,this.b,this.c,e)}getInterpolation(t,e,i,s,r){return Xr.getInterpolation(t,this.a,this.b,this.c,e,i,s,r)}containsPoint(t){return Xr.containsPoint(t,this.a,this.b,this.c)}isFrontFacing(t){return Xr.isFrontFacing(this.a,this.b,this.c,t)}intersectsBox(t){return t.intersectsTriangle(this)}closestPointToPoint(t,e){const i=this.a,s=this.b,r=this.c;let n,a;Lr.subVectors(s,i),Vr.subVectors(r,i),Wr.subVectors(t,i);const o=Lr.dot(Wr),h=Vr.dot(Wr);if(o<=0&&h<=0)return e.copy(i);Ur.subVectors(t,s);const l=Lr.dot(Ur),c=Vr.dot(Ur);if(l>=0&&c<=l)return e.copy(s);const u=o*c-l*h;if(u<=0&&o>=0&&l<=0)return n=o/(o-l),e.copy(i).addScaledVector(Lr,n);Dr.subVectors(t,r);const d=Lr.dot(Dr),p=Vr.dot(Dr);if(p>=0&&d<=p)return e.copy(r);const m=d*h-o*p;if(m<=0&&h>=0&&p<=0)return a=h/(h-p),e.copy(i).addScaledVector(Vr,a);const y=l*p-d*c;if(y<=0&&c-l>=0&&d-p>=0)return jr.subVectors(r,s),a=(c-l)/(c-l+(d-p)),e.copy(s).addScaledVector(jr,a);const g=1/(y+m+u);return n=m*g,a=u*g,e.copy(i).addScaledVector(Lr,n).addScaledVector(Vr,a)}equals(t){return t.a.equals(this.a)&&t.b.equals(this.b)&&t.c.equals(this.c)}}const Yr={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},Zr={h:0,s:0,l:0},Gr={h:0,s:0,l:0};function $r(t,e,i){return i<0&&(i+=1),i>1&&(i-=1),i<1/6?t+6*(e-t)*i:i<.5?e:i<2/3?t+6*(e-t)*(2/3-i):t}class Qr{constructor(t,e,i){return this.isColor=!0,this.r=1,this.g=1,this.b=1,this.set(t,e,i)}set(t,e,i){if(void 0===e&&void 0===i){const e=t;e&&e.isColor?this.copy(e):"number"==typeof e?this.setHex(e):"string"==typeof e&&this.setStyle(e)}else this.setRGB(t,e,i);return this}setScalar(t){return this.r=t,this.g=t,this.b=t,this}setHex(t,e=Ge){return t=Math.floor(t),this.r=(t>>16&255)/255,this.g=(t>>8&255)/255,this.b=(255&t)/255,ds.toWorkingColorSpace(this,e),this}setRGB(t,e,i,s=ds.workingColorSpace){return this.r=t,this.g=e,this.b=i,ds.toWorkingColorSpace(this,s),this}setHSL(t,e,i,s=ds.workingColorSpace){if(t=qi(t,1),e=Hi(e,0,1),i=Hi(i,0,1),0===e)this.r=this.g=this.b=i;else{const s=i<=.5?i*(1+e):i+e-i*e,r=2*i-s;this.r=$r(r,s,t+1/3),this.g=$r(r,s,t),this.b=$r(r,s,t-1/3)}return ds.toWorkingColorSpace(this,s),this}setStyle(t,e=Ge){function i(e){void 0!==e&&parseFloat(e)<1&&console.warn("THREE.Color: Alpha component of "+t+" will be ignored.")}let s;if(s=/^(\w+)\(([^\)]*)\)/.exec(t)){let r;const n=s[1],a=s[2];switch(n){case"rgb":case"rgba":if(r=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return i(r[4]),this.setRGB(Math.min(255,parseInt(r[1],10))/255,Math.min(255,parseInt(r[2],10))/255,Math.min(255,parseInt(r[3],10))/255,e);if(r=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return i(r[4]),this.setRGB(Math.min(100,parseInt(r[1],10))/100,Math.min(100,parseInt(r[2],10))/100,Math.min(100,parseInt(r[3],10))/100,e);break;case"hsl":case"hsla":if(r=/^\s*(\d*\.?\d+)\s*,\s*(\d*\.?\d+)\%\s*,\s*(\d*\.?\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return i(r[4]),this.setHSL(parseFloat(r[1])/360,parseFloat(r[2])/100,parseFloat(r[3])/100,e);break;default:console.warn("THREE.Color: Unknown color model "+t)}}else if(s=/^\#([A-Fa-f\d]+)$/.exec(t)){const i=s[1],r=i.length;if(3===r)return this.setRGB(parseInt(i.charAt(0),16)/15,parseInt(i.charAt(1),16)/15,parseInt(i.charAt(2),16)/15,e);if(6===r)return this.setHex(parseInt(i,16),e);console.warn("THREE.Color: Invalid hex color "+t)}else if(t&&t.length>0)return this.setColorName(t,e);return this}setColorName(t,e=Ge){const i=Yr[t.toLowerCase()];return void 0!==i?this.setHex(i,e):console.warn("THREE.Color: Unknown color "+t),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(t){return this.r=t.r,this.g=t.g,this.b=t.b,this}copySRGBToLinear(t){return this.r=ps(t.r),this.g=ps(t.g),this.b=ps(t.b),this}copyLinearToSRGB(t){return this.r=ms(t.r),this.g=ms(t.g),this.b=ms(t.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(t=Ge){return ds.fromWorkingColorSpace(Kr.copy(this),t),65536*Math.round(Hi(255*Kr.r,0,255))+256*Math.round(Hi(255*Kr.g,0,255))+Math.round(Hi(255*Kr.b,0,255))}getHexString(t=Ge){return("000000"+this.getHex(t).toString(16)).slice(-6)}getHSL(t,e=ds.workingColorSpace){ds.fromWorkingColorSpace(Kr.copy(this),e);const i=Kr.r,s=Kr.g,r=Kr.b,n=Math.max(i,s,r),a=Math.min(i,s,r);let o,h;const l=(a+n)/2;if(a===n)o=0,h=0;else{const t=n-a;switch(h=l<=.5?t/(n+a):t/(2-n-a),n){case i:o=(s-r)/t+(s0!=t>0&&this.version++,this._alphaTest=t}onBeforeRender(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(t){if(void 0!==t)for(const e in t){const i=t[e];if(void 0===i){console.warn(`THREE.Material: parameter '${e}' has value of undefined.`);continue}const s=this[e];void 0!==s?s&&s.isColor?s.set(i):s&&s.isVector3&&i&&i.isVector3?s.copy(i):this[e]=i:console.warn(`THREE.Material: '${e}' is not a property of THREE.${this.type}.`)}}toJSON(t){const e=void 0===t||"string"==typeof t;e&&(t={textures:{},images:{}});const i={metadata:{version:4.6,type:"Material",generator:"Material.toJSON"}};function s(t){const e=[];for(const i in t){const s=t[i];delete s.metadata,e.push(s)}return e}if(i.uuid=this.uuid,i.type=this.type,""!==this.name&&(i.name=this.name),this.color&&this.color.isColor&&(i.color=this.color.getHex()),void 0!==this.roughness&&(i.roughness=this.roughness),void 0!==this.metalness&&(i.metalness=this.metalness),void 0!==this.sheen&&(i.sheen=this.sheen),this.sheenColor&&this.sheenColor.isColor&&(i.sheenColor=this.sheenColor.getHex()),void 0!==this.sheenRoughness&&(i.sheenRoughness=this.sheenRoughness),this.emissive&&this.emissive.isColor&&(i.emissive=this.emissive.getHex()),void 0!==this.emissiveIntensity&&1!==this.emissiveIntensity&&(i.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(i.specular=this.specular.getHex()),void 0!==this.specularIntensity&&(i.specularIntensity=this.specularIntensity),this.specularColor&&this.specularColor.isColor&&(i.specularColor=this.specularColor.getHex()),void 0!==this.shininess&&(i.shininess=this.shininess),void 0!==this.clearcoat&&(i.clearcoat=this.clearcoat),void 0!==this.clearcoatRoughness&&(i.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(i.clearcoatMap=this.clearcoatMap.toJSON(t).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(i.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(t).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(i.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(t).uuid,i.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),void 0!==this.dispersion&&(i.dispersion=this.dispersion),void 0!==this.iridescence&&(i.iridescence=this.iridescence),void 0!==this.iridescenceIOR&&(i.iridescenceIOR=this.iridescenceIOR),void 0!==this.iridescenceThicknessRange&&(i.iridescenceThicknessRange=this.iridescenceThicknessRange),this.iridescenceMap&&this.iridescenceMap.isTexture&&(i.iridescenceMap=this.iridescenceMap.toJSON(t).uuid),this.iridescenceThicknessMap&&this.iridescenceThicknessMap.isTexture&&(i.iridescenceThicknessMap=this.iridescenceThicknessMap.toJSON(t).uuid),void 0!==this.anisotropy&&(i.anisotropy=this.anisotropy),void 0!==this.anisotropyRotation&&(i.anisotropyRotation=this.anisotropyRotation),this.anisotropyMap&&this.anisotropyMap.isTexture&&(i.anisotropyMap=this.anisotropyMap.toJSON(t).uuid),this.map&&this.map.isTexture&&(i.map=this.map.toJSON(t).uuid),this.matcap&&this.matcap.isTexture&&(i.matcap=this.matcap.toJSON(t).uuid),this.alphaMap&&this.alphaMap.isTexture&&(i.alphaMap=this.alphaMap.toJSON(t).uuid),this.lightMap&&this.lightMap.isTexture&&(i.lightMap=this.lightMap.toJSON(t).uuid,i.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(i.aoMap=this.aoMap.toJSON(t).uuid,i.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(i.bumpMap=this.bumpMap.toJSON(t).uuid,i.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(i.normalMap=this.normalMap.toJSON(t).uuid,i.normalMapType=this.normalMapType,i.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(i.displacementMap=this.displacementMap.toJSON(t).uuid,i.displacementScale=this.displacementScale,i.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(i.roughnessMap=this.roughnessMap.toJSON(t).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(i.metalnessMap=this.metalnessMap.toJSON(t).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(i.emissiveMap=this.emissiveMap.toJSON(t).uuid),this.specularMap&&this.specularMap.isTexture&&(i.specularMap=this.specularMap.toJSON(t).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(i.specularIntensityMap=this.specularIntensityMap.toJSON(t).uuid),this.specularColorMap&&this.specularColorMap.isTexture&&(i.specularColorMap=this.specularColorMap.toJSON(t).uuid),this.envMap&&this.envMap.isTexture&&(i.envMap=this.envMap.toJSON(t).uuid,void 0!==this.combine&&(i.combine=this.combine)),void 0!==this.envMapRotation&&(i.envMapRotation=this.envMapRotation.toArray()),void 0!==this.envMapIntensity&&(i.envMapIntensity=this.envMapIntensity),void 0!==this.reflectivity&&(i.reflectivity=this.reflectivity),void 0!==this.refractionRatio&&(i.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(i.gradientMap=this.gradientMap.toJSON(t).uuid),void 0!==this.transmission&&(i.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(i.transmissionMap=this.transmissionMap.toJSON(t).uuid),void 0!==this.thickness&&(i.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(i.thicknessMap=this.thicknessMap.toJSON(t).uuid),void 0!==this.attenuationDistance&&this.attenuationDistance!==1/0&&(i.attenuationDistance=this.attenuationDistance),void 0!==this.attenuationColor&&(i.attenuationColor=this.attenuationColor.getHex()),void 0!==this.size&&(i.size=this.size),null!==this.shadowSide&&(i.shadowSide=this.shadowSide),void 0!==this.sizeAttenuation&&(i.sizeAttenuation=this.sizeAttenuation),1!==this.blending&&(i.blending=this.blending),0!==this.side&&(i.side=this.side),!0===this.vertexColors&&(i.vertexColors=!0),this.opacity<1&&(i.opacity=this.opacity),!0===this.transparent&&(i.transparent=!0),204!==this.blendSrc&&(i.blendSrc=this.blendSrc),205!==this.blendDst&&(i.blendDst=this.blendDst),100!==this.blendEquation&&(i.blendEquation=this.blendEquation),null!==this.blendSrcAlpha&&(i.blendSrcAlpha=this.blendSrcAlpha),null!==this.blendDstAlpha&&(i.blendDstAlpha=this.blendDstAlpha),null!==this.blendEquationAlpha&&(i.blendEquationAlpha=this.blendEquationAlpha),this.blendColor&&this.blendColor.isColor&&(i.blendColor=this.blendColor.getHex()),0!==this.blendAlpha&&(i.blendAlpha=this.blendAlpha),3!==this.depthFunc&&(i.depthFunc=this.depthFunc),!1===this.depthTest&&(i.depthTest=this.depthTest),!1===this.depthWrite&&(i.depthWrite=this.depthWrite),!1===this.colorWrite&&(i.colorWrite=this.colorWrite),255!==this.stencilWriteMask&&(i.stencilWriteMask=this.stencilWriteMask),519!==this.stencilFunc&&(i.stencilFunc=this.stencilFunc),0!==this.stencilRef&&(i.stencilRef=this.stencilRef),255!==this.stencilFuncMask&&(i.stencilFuncMask=this.stencilFuncMask),this.stencilFail!==ei&&(i.stencilFail=this.stencilFail),this.stencilZFail!==ei&&(i.stencilZFail=this.stencilZFail),this.stencilZPass!==ei&&(i.stencilZPass=this.stencilZPass),!0===this.stencilWrite&&(i.stencilWrite=this.stencilWrite),void 0!==this.rotation&&0!==this.rotation&&(i.rotation=this.rotation),!0===this.polygonOffset&&(i.polygonOffset=!0),0!==this.polygonOffsetFactor&&(i.polygonOffsetFactor=this.polygonOffsetFactor),0!==this.polygonOffsetUnits&&(i.polygonOffsetUnits=this.polygonOffsetUnits),void 0!==this.linewidth&&1!==this.linewidth&&(i.linewidth=this.linewidth),void 0!==this.dashSize&&(i.dashSize=this.dashSize),void 0!==this.gapSize&&(i.gapSize=this.gapSize),void 0!==this.scale&&(i.scale=this.scale),!0===this.dithering&&(i.dithering=!0),this.alphaTest>0&&(i.alphaTest=this.alphaTest),!0===this.alphaHash&&(i.alphaHash=!0),!0===this.alphaToCoverage&&(i.alphaToCoverage=!0),!0===this.premultipliedAlpha&&(i.premultipliedAlpha=!0),!0===this.forceSinglePass&&(i.forceSinglePass=!0),!0===this.wireframe&&(i.wireframe=!0),this.wireframeLinewidth>1&&(i.wireframeLinewidth=this.wireframeLinewidth),"round"!==this.wireframeLinecap&&(i.wireframeLinecap=this.wireframeLinecap),"round"!==this.wireframeLinejoin&&(i.wireframeLinejoin=this.wireframeLinejoin),!0===this.flatShading&&(i.flatShading=!0),!1===this.visible&&(i.visible=!1),!1===this.toneMapped&&(i.toneMapped=!1),!1===this.fog&&(i.fog=!1),Object.keys(this.userData).length>0&&(i.userData=this.userData),e){const e=s(t.textures),r=s(t.images);e.length>0&&(i.textures=e),r.length>0&&(i.images=r)}return i}clone(){return(new this.constructor).copy(this)}copy(t){this.name=t.name,this.blending=t.blending,this.side=t.side,this.vertexColors=t.vertexColors,this.opacity=t.opacity,this.transparent=t.transparent,this.blendSrc=t.blendSrc,this.blendDst=t.blendDst,this.blendEquation=t.blendEquation,this.blendSrcAlpha=t.blendSrcAlpha,this.blendDstAlpha=t.blendDstAlpha,this.blendEquationAlpha=t.blendEquationAlpha,this.blendColor.copy(t.blendColor),this.blendAlpha=t.blendAlpha,this.depthFunc=t.depthFunc,this.depthTest=t.depthTest,this.depthWrite=t.depthWrite,this.stencilWriteMask=t.stencilWriteMask,this.stencilFunc=t.stencilFunc,this.stencilRef=t.stencilRef,this.stencilFuncMask=t.stencilFuncMask,this.stencilFail=t.stencilFail,this.stencilZFail=t.stencilZFail,this.stencilZPass=t.stencilZPass,this.stencilWrite=t.stencilWrite;const e=t.clippingPlanes;let i=null;if(null!==e){const t=e.length;i=new Array(t);for(let s=0;s!==t;++s)i[s]=e[s].clone()}return this.clippingPlanes=i,this.clipIntersection=t.clipIntersection,this.clipShadows=t.clipShadows,this.shadowSide=t.shadowSide,this.colorWrite=t.colorWrite,this.precision=t.precision,this.polygonOffset=t.polygonOffset,this.polygonOffsetFactor=t.polygonOffsetFactor,this.polygonOffsetUnits=t.polygonOffsetUnits,this.dithering=t.dithering,this.alphaTest=t.alphaTest,this.alphaHash=t.alphaHash,this.alphaToCoverage=t.alphaToCoverage,this.premultipliedAlpha=t.premultipliedAlpha,this.forceSinglePass=t.forceSinglePass,this.visible=t.visible,this.toneMapped=t.toneMapped,this.userData=JSON.parse(JSON.stringify(t.userData)),this}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(t){!0===t&&this.version++}onBuild(){console.warn("Material: onBuild() has been removed.")}}class sn extends en{constructor(t){super(),this.isMeshBasicMaterial=!0,this.type="MeshBasicMaterial",this.color=new Qr(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new gr,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapRotation.copy(t.envMapRotation),this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.fog=t.fog,this}}const rn=nn();function nn(){const t=new ArrayBuffer(4),e=new Float32Array(t),i=new Uint32Array(t),s=new Uint32Array(512),r=new Uint32Array(512);for(let t=0;t<256;++t){const e=t-127;e<-27?(s[t]=0,s[256|t]=32768,r[t]=24,r[256|t]=24):e<-14?(s[t]=1024>>-e-14,s[256|t]=1024>>-e-14|32768,r[t]=-e-1,r[256|t]=-e-1):e<=15?(s[t]=e+15<<10,s[256|t]=e+15<<10|32768,r[t]=13,r[256|t]=13):e<128?(s[t]=31744,s[256|t]=64512,r[t]=24,r[256|t]=24):(s[t]=31744,s[256|t]=64512,r[t]=13,r[256|t]=13)}const n=new Uint32Array(2048),a=new Uint32Array(64),o=new Uint32Array(64);for(let t=1;t<1024;++t){let e=t<<13,i=0;for(;!(8388608&e);)e<<=1,i-=8388608;e&=-8388609,i+=947912704,n[t]=e|i}for(let t=1024;t<2048;++t)n[t]=939524096+(t-1024<<13);for(let t=1;t<31;++t)a[t]=t<<23;a[31]=1199570944,a[32]=2147483648;for(let t=33;t<63;++t)a[t]=2147483648+(t-32<<23);a[63]=3347054592;for(let t=1;t<64;++t)32!==t&&(o[t]=1024);return{floatView:e,uint32View:i,baseTable:s,shiftTable:r,mantissaTable:n,exponentTable:a,offsetTable:o}}function an(t){Math.abs(t)>65504&&console.warn("THREE.DataUtils.toHalfFloat(): Value out of range."),t=Hi(t,-65504,65504),rn.floatView[0]=t;const e=rn.uint32View[0],i=e>>23&511;return rn.baseTable[i]+((8388607&e)>>rn.shiftTable[i])}function on(t){const e=t>>10;return rn.uint32View[0]=rn.mantissaTable[rn.offsetTable[e]+(1023&t)]+rn.exponentTable[e],rn.floatView[0]}class hn{static toHalfFloat(t){return an(t)}static fromHalfFloat(t){return on(t)}}const ln=new Bs,cn=new Gi;let un=0;class dn{constructor(t,e,i=!1){if(Array.isArray(t))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.isBufferAttribute=!0,Object.defineProperty(this,"id",{value:un++}),this.name="",this.array=t,this.itemSize=e,this.count=void 0!==t?t.length/e:0,this.normalized=i,this.usage=_i,this.updateRanges=[],this.gpuType=Rt,this.version=0}onUploadCallback(){}set needsUpdate(t){!0===t&&this.version++}setUsage(t){return this.usage=t,this}addUpdateRange(t,e){this.updateRanges.push({start:t,count:e})}clearUpdateRanges(){this.updateRanges.length=0}copy(t){return this.name=t.name,this.array=new t.array.constructor(t.array),this.itemSize=t.itemSize,this.count=t.count,this.normalized=t.normalized,this.usage=t.usage,this.gpuType=t.gpuType,this}copyAt(t,e,i){t*=this.itemSize,i*=e.itemSize;for(let s=0,r=this.itemSize;se.count&&console.warn("THREE.BufferGeometry: Buffer size too small for points data. Use .dispose() and create a new geometry."),e.needsUpdate=!0}return this}computeBoundingBox(){null===this.boundingBox&&(this.boundingBox=new Es);const t=this.attributes.position,e=this.morphAttributes.position;if(t&&t.isGLBufferAttribute)return console.error("THREE.BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box.",this),void this.boundingBox.set(new Bs(-1/0,-1/0,-1/0),new Bs(1/0,1/0,1/0));if(void 0!==t){if(this.boundingBox.setFromBufferAttribute(t),e)for(let t=0,i=e.length;t0&&(t.userData=this.userData),void 0!==this.parameters){const e=this.parameters;for(const i in e)void 0!==e[i]&&(t[i]=e[i]);return t}t.data={attributes:{}};const e=this.index;null!==e&&(t.data.index={type:e.array.constructor.name,array:Array.prototype.slice.call(e.array)});const i=this.attributes;for(const e in i){const s=i[e];t.data.attributes[e]=s.toJSON(t.data)}const s={};let r=!1;for(const e in this.morphAttributes){const i=this.morphAttributes[e],n=[];for(let e=0,s=i.length;e0&&(s[e]=n,r=!0)}r&&(t.data.morphAttributes=s,t.data.morphTargetsRelative=this.morphTargetsRelative);const n=this.groups;n.length>0&&(t.data.groups=JSON.parse(JSON.stringify(n)));const a=this.boundingSphere;return null!==a&&(t.data.boundingSphere={center:a.center.toArray(),radius:a.radius}),t}clone(){return(new this.constructor).copy(this)}copy(t){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;const e={};this.name=t.name;const i=t.index;null!==i&&this.setIndex(i.clone());const s=t.attributes;for(const t in s){const i=s[t];this.setAttribute(t,i.clone(e))}const r=t.morphAttributes;for(const t in r){const i=[],s=r[t];for(let t=0,r=s.length;t0){const i=t[e[0]];if(void 0!==i){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,e=i.length;t(t.far-t.near)**2)return}Bn.copy(r).invert(),kn.copy(t.ray).applyMatrix4(Bn),null!==i.boundingBox&&!1===kn.intersectsBox(i.boundingBox)||this._computeIntersections(t,e,kn)}}_computeIntersections(t,e,i){let s;const r=this.geometry,n=this.material,a=r.index,o=r.attributes.position,h=r.attributes.uv,l=r.attributes.uv1,c=r.attributes.normal,u=r.groups,d=r.drawRange;if(null!==a)if(Array.isArray(n))for(let r=0,o=u.length;ri.far?null:{distance:l,point:jn.clone(),object:t}}(t,e,i,s,Pn,On,Nn,Vn);if(c){const t=new Bs;Xr.getBarycoord(Vn,Pn,On,Nn,t),r&&(c.uv=Xr.getInterpolatedAttribute(r,o,h,l,t,new Gi)),n&&(c.uv1=Xr.getInterpolatedAttribute(n,o,h,l,t,new Gi)),a&&(c.normal=Xr.getInterpolatedAttribute(a,o,h,l,t,new Bs),c.normal.dot(s.direction)>0&&c.normal.multiplyScalar(-1));const e={a:o,b:h,c:l,normal:new Bs,materialIndex:0};Xr.getNormal(Pn,On,Nn,e.normal),c.face=e,c.barycoord=t}return c}class Dn extends In{constructor(t=1,e=1,i=1,s=1,r=1,n=1){super(),this.type="BoxGeometry",this.parameters={width:t,height:e,depth:i,widthSegments:s,heightSegments:r,depthSegments:n};const a=this;s=Math.floor(s),r=Math.floor(r),n=Math.floor(n);const o=[],h=[],l=[],c=[];let u=0,d=0;function p(t,e,i,s,r,n,p,m,y,g,f){const x=n/y,b=p/g,v=n/2,w=p/2,M=m/2,S=y+1,_=g+1;let A=0,T=0;const z=new Bs;for(let n=0;n<_;n++){const a=n*b-w;for(let o=0;o0?1:-1,l.push(z.x,z.y,z.z),c.push(o/y),c.push(1-n/g),A+=1}}for(let t=0;t0&&(e.defines=this.defines),e.vertexShader=this.vertexShader,e.fragmentShader=this.fragmentShader,e.lights=this.lights,e.clipping=this.clipping;const i={};for(const t in this.extensions)!0===this.extensions[t]&&(i[t]=!0);return Object.keys(i).length>0&&(e.extensions=i),e}}class Zn extends Er{constructor(){super(),this.isCamera=!0,this.type="Camera",this.matrixWorldInverse=new ar,this.projectionMatrix=new ar,this.projectionMatrixInverse=new ar,this.coordinateSystem=Oi}copy(t,e){return super.copy(t,e),this.matrixWorldInverse.copy(t.matrixWorldInverse),this.projectionMatrix.copy(t.projectionMatrix),this.projectionMatrixInverse.copy(t.projectionMatrixInverse),this.coordinateSystem=t.coordinateSystem,this}getWorldDirection(t){return super.getWorldDirection(t).negate()}updateMatrixWorld(t){super.updateMatrixWorld(t),this.matrixWorldInverse.copy(this.matrixWorld).invert()}updateWorldMatrix(t,e){super.updateWorldMatrix(t,e),this.matrixWorldInverse.copy(this.matrixWorld).invert()}clone(){return(new this.constructor).copy(this)}}const Gn=new Bs,$n=new Gi,Qn=new Gi;class Kn extends Zn{constructor(t=50,e=1,i=.1,s=2e3){super(),this.isPerspectiveCamera=!0,this.type="PerspectiveCamera",this.fov=t,this.zoom=1,this.near=i,this.far=s,this.focus=10,this.aspect=e,this.view=null,this.filmGauge=35,this.filmOffset=0,this.updateProjectionMatrix()}copy(t,e){return super.copy(t,e),this.fov=t.fov,this.zoom=t.zoom,this.near=t.near,this.far=t.far,this.focus=t.focus,this.aspect=t.aspect,this.view=null===t.view?null:Object.assign({},t.view),this.filmGauge=t.filmGauge,this.filmOffset=t.filmOffset,this}setFocalLength(t){const e=.5*this.getFilmHeight()/t;this.fov=2*Ui*Math.atan(e),this.updateProjectionMatrix()}getFocalLength(){const t=Math.tan(.5*Wi*this.fov);return.5*this.getFilmHeight()/t}getEffectiveFOV(){return 2*Ui*Math.atan(Math.tan(.5*Wi*this.fov)/this.zoom)}getFilmWidth(){return this.filmGauge*Math.min(this.aspect,1)}getFilmHeight(){return this.filmGauge/Math.max(this.aspect,1)}getViewBounds(t,e,i){Gn.set(-1,-1,.5).applyMatrix4(this.projectionMatrixInverse),e.set(Gn.x,Gn.y).multiplyScalar(-t/Gn.z),Gn.set(1,1,.5).applyMatrix4(this.projectionMatrixInverse),i.set(Gn.x,Gn.y).multiplyScalar(-t/Gn.z)}getViewSize(t,e){return this.getViewBounds(t,$n,Qn),e.subVectors(Qn,$n)}setViewOffset(t,e,i,s,r,n){this.aspect=t/e,null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=t,this.view.fullHeight=e,this.view.offsetX=i,this.view.offsetY=s,this.view.width=r,this.view.height=n,this.updateProjectionMatrix()}clearViewOffset(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const t=this.near;let e=t*Math.tan(.5*Wi*this.fov)/this.zoom,i=2*e,s=this.aspect*i,r=-.5*s;const n=this.view;if(null!==this.view&&this.view.enabled){const t=n.fullWidth,a=n.fullHeight;r+=n.offsetX*s/t,e-=n.offsetY*i/a,s*=n.width/t,i*=n.height/a}const a=this.filmOffset;0!==a&&(r+=t*a/this.getFilmWidth()),this.projectionMatrix.makePerspective(r,r+s,e,e-i,t,this.far,this.coordinateSystem),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(t){const e=super.toJSON(t);return e.object.fov=this.fov,e.object.zoom=this.zoom,e.object.near=this.near,e.object.far=this.far,e.object.focus=this.focus,e.object.aspect=this.aspect,null!==this.view&&(e.object.view=Object.assign({},this.view)),e.object.filmGauge=this.filmGauge,e.object.filmOffset=this.filmOffset,e}}const ta=-90;class ea extends Er{constructor(t,e,i){super(),this.type="CubeCamera",this.renderTarget=i,this.coordinateSystem=null,this.activeMipmapLevel=0;const s=new Kn(ta,1,t,e);s.layers=this.layers,this.add(s);const r=new Kn(ta,1,t,e);r.layers=this.layers,this.add(r);const n=new Kn(ta,1,t,e);n.layers=this.layers,this.add(n);const a=new Kn(ta,1,t,e);a.layers=this.layers,this.add(a);const o=new Kn(ta,1,t,e);o.layers=this.layers,this.add(o);const h=new Kn(ta,1,t,e);h.layers=this.layers,this.add(h)}updateCoordinateSystem(){const t=this.coordinateSystem,e=this.children.concat(),[i,s,r,n,a,o]=e;for(const t of e)this.remove(t);if(t===Oi)i.up.set(0,1,0),i.lookAt(1,0,0),s.up.set(0,1,0),s.lookAt(-1,0,0),r.up.set(0,0,-1),r.lookAt(0,1,0),n.up.set(0,0,1),n.lookAt(0,-1,0),a.up.set(0,1,0),a.lookAt(0,0,1),o.up.set(0,1,0),o.lookAt(0,0,-1);else{if(t!==Ni)throw new Error("THREE.CubeCamera.updateCoordinateSystem(): Invalid coordinate system: "+t);i.up.set(0,-1,0),i.lookAt(-1,0,0),s.up.set(0,-1,0),s.lookAt(1,0,0),r.up.set(0,0,1),r.lookAt(0,1,0),n.up.set(0,0,-1),n.lookAt(0,-1,0),a.up.set(0,-1,0),a.lookAt(0,0,1),o.up.set(0,-1,0),o.lookAt(0,0,-1)}for(const t of e)this.add(t),t.updateMatrixWorld()}update(t,e){null===this.parent&&this.updateMatrixWorld();const{renderTarget:i,activeMipmapLevel:s}=this;this.coordinateSystem!==t.coordinateSystem&&(this.coordinateSystem=t.coordinateSystem,this.updateCoordinateSystem());const[r,n,a,o,h,l]=this.children,c=t.getRenderTarget(),u=t.getActiveCubeFace(),d=t.getActiveMipmapLevel(),p=t.xr.enabled;t.xr.enabled=!1;const m=i.texture.generateMipmaps;i.texture.generateMipmaps=!1,t.setRenderTarget(i,0,s),t.render(e,r),t.setRenderTarget(i,1,s),t.render(e,n),t.setRenderTarget(i,2,s),t.render(e,a),t.setRenderTarget(i,3,s),t.render(e,o),t.setRenderTarget(i,4,s),t.render(e,h),i.texture.generateMipmaps=m,t.setRenderTarget(i,5,s),t.render(e,l),t.setRenderTarget(c,u,d),t.xr.enabled=p,i.texture.needsPMREMUpdate=!0}}class ia extends ws{constructor(t=[],e=301,i,s,r,n,a,o,h,l){super(t,e,i,s,r,n,a,o,h,l),this.isCubeTexture=!0,this.flipY=!1}get images(){return this.image}set images(t){this.image=t}}class sa extends _s{constructor(t=1,e={}){super(t,t,e),this.isWebGLCubeRenderTarget=!0;const i={width:t,height:t,depth:1},s=[i,i,i,i,i,i];this.texture=new ia(s,e.mapping,e.wrapS,e.wrapT,e.magFilter,e.minFilter,e.format,e.type,e.anisotropy,e.colorSpace),this.texture.isRenderTargetTexture=!0,this.texture.generateMipmaps=void 0!==e.generateMipmaps&&e.generateMipmaps,this.texture.minFilter=void 0!==e.minFilter?e.minFilter:wt}fromEquirectangularTexture(t,e){this.texture.type=e.type,this.texture.colorSpace=e.colorSpace,this.texture.generateMipmaps=e.generateMipmaps,this.texture.minFilter=e.minFilter,this.texture.magFilter=e.magFilter;const i={uniforms:{tEquirect:{value:null}},vertexShader:"\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include \n\t\t\t\t\t#include \n\n\t\t\t\t}\n\t\t\t",fragmentShader:"\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include \n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t"},s=new Dn(5,5,5),r=new Yn({name:"CubemapFromEquirect",uniforms:Hn(i.uniforms),vertexShader:i.vertexShader,fragmentShader:i.fragmentShader,side:1,blending:0});r.uniforms.tEquirect.value=e;const n=new Wn(s,r),a=e.minFilter;e.minFilter===_t&&(e.minFilter=wt);return new ea(1,10,this).update(t,n),e.minFilter=a,n.geometry.dispose(),n.material.dispose(),this}clear(t,e=!0,i=!0,s=!0){const r=t.getRenderTarget();for(let r=0;r<6;r++)t.setRenderTarget(this,r),t.clear(e,i,s);t.setRenderTarget(r)}}class ra extends Er{constructor(){super(),this.isGroup=!0,this.type="Group"}}const na={type:"move"};class aa{constructor(){this._targetRay=null,this._grip=null,this._hand=null}getHandSpace(){return null===this._hand&&(this._hand=new ra,this._hand.matrixAutoUpdate=!1,this._hand.visible=!1,this._hand.joints={},this._hand.inputState={pinching:!1}),this._hand}getTargetRaySpace(){return null===this._targetRay&&(this._targetRay=new ra,this._targetRay.matrixAutoUpdate=!1,this._targetRay.visible=!1,this._targetRay.hasLinearVelocity=!1,this._targetRay.linearVelocity=new Bs,this._targetRay.hasAngularVelocity=!1,this._targetRay.angularVelocity=new Bs),this._targetRay}getGripSpace(){return null===this._grip&&(this._grip=new ra,this._grip.matrixAutoUpdate=!1,this._grip.visible=!1,this._grip.hasLinearVelocity=!1,this._grip.linearVelocity=new Bs,this._grip.hasAngularVelocity=!1,this._grip.angularVelocity=new Bs),this._grip}dispatchEvent(t){return null!==this._targetRay&&this._targetRay.dispatchEvent(t),null!==this._grip&&this._grip.dispatchEvent(t),null!==this._hand&&this._hand.dispatchEvent(t),this}connect(t){if(t&&t.hand){const e=this._hand;if(e)for(const i of t.hand.values())this._getHandJoint(e,i)}return this.dispatchEvent({type:"connected",data:t}),this}disconnect(t){return this.dispatchEvent({type:"disconnected",data:t}),null!==this._targetRay&&(this._targetRay.visible=!1),null!==this._grip&&(this._grip.visible=!1),null!==this._hand&&(this._hand.visible=!1),this}update(t,e,i){let s=null,r=null,n=null;const a=this._targetRay,o=this._grip,h=this._hand;if(t&&"visible-blurred"!==e.session.visibilityState){if(h&&t.hand){n=!0;for(const s of t.hand.values()){const t=e.getJointPose(s,i),r=this._getHandJoint(h,s);null!==t&&(r.matrix.fromArray(t.transform.matrix),r.matrix.decompose(r.position,r.rotation,r.scale),r.matrixWorldNeedsUpdate=!0,r.jointRadius=t.radius),r.visible=null!==t}const s=h.joints["index-finger-tip"],r=h.joints["thumb-tip"],a=s.position.distanceTo(r.position),o=.02,l=.005;h.inputState.pinching&&a>o+l?(h.inputState.pinching=!1,this.dispatchEvent({type:"pinchend",handedness:t.handedness,target:this})):!h.inputState.pinching&&a<=o-l&&(h.inputState.pinching=!0,this.dispatchEvent({type:"pinchstart",handedness:t.handedness,target:this}))}else null!==o&&t.gripSpace&&(r=e.getPose(t.gripSpace,i),null!==r&&(o.matrix.fromArray(r.transform.matrix),o.matrix.decompose(o.position,o.rotation,o.scale),o.matrixWorldNeedsUpdate=!0,r.linearVelocity?(o.hasLinearVelocity=!0,o.linearVelocity.copy(r.linearVelocity)):o.hasLinearVelocity=!1,r.angularVelocity?(o.hasAngularVelocity=!0,o.angularVelocity.copy(r.angularVelocity)):o.hasAngularVelocity=!1));null!==a&&(s=e.getPose(t.targetRaySpace,i),null===s&&null!==r&&(s=r),null!==s&&(a.matrix.fromArray(s.transform.matrix),a.matrix.decompose(a.position,a.rotation,a.scale),a.matrixWorldNeedsUpdate=!0,s.linearVelocity?(a.hasLinearVelocity=!0,a.linearVelocity.copy(s.linearVelocity)):a.hasLinearVelocity=!1,s.angularVelocity?(a.hasAngularVelocity=!0,a.angularVelocity.copy(s.angularVelocity)):a.hasAngularVelocity=!1,this.dispatchEvent(na)))}return null!==a&&(a.visible=null!==s),null!==o&&(o.visible=null!==r),null!==h&&(h.visible=null!==n),this}_getHandJoint(t,e){if(void 0===t.joints[e.jointName]){const i=new ra;i.matrixAutoUpdate=!1,i.visible=!1,t.joints[e.jointName]=i,t.add(i)}return t.joints[e.jointName]}}class oa{constructor(t,e=25e-5){this.isFogExp2=!0,this.name="",this.color=new Qr(t),this.density=e}clone(){return new oa(this.color,this.density)}toJSON(){return{type:"FogExp2",name:this.name,color:this.color.getHex(),density:this.density}}}class ha{constructor(t,e=1,i=1e3){this.isFog=!0,this.name="",this.color=new Qr(t),this.near=e,this.far=i}clone(){return new ha(this.color,this.near,this.far)}toJSON(){return{type:"Fog",name:this.name,color:this.color.getHex(),near:this.near,far:this.far}}}class la extends Er{constructor(){super(),this.isScene=!0,this.type="Scene",this.background=null,this.environment=null,this.fog=null,this.backgroundBlurriness=0,this.backgroundIntensity=1,this.backgroundRotation=new gr,this.environmentIntensity=1,this.environmentRotation=new gr,this.overrideMaterial=null,"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}copy(t,e){return super.copy(t,e),null!==t.background&&(this.background=t.background.clone()),null!==t.environment&&(this.environment=t.environment.clone()),null!==t.fog&&(this.fog=t.fog.clone()),this.backgroundBlurriness=t.backgroundBlurriness,this.backgroundIntensity=t.backgroundIntensity,this.backgroundRotation.copy(t.backgroundRotation),this.environmentIntensity=t.environmentIntensity,this.environmentRotation.copy(t.environmentRotation),null!==t.overrideMaterial&&(this.overrideMaterial=t.overrideMaterial.clone()),this.matrixAutoUpdate=t.matrixAutoUpdate,this}toJSON(t){const e=super.toJSON(t);return null!==this.fog&&(e.object.fog=this.fog.toJSON()),this.backgroundBlurriness>0&&(e.object.backgroundBlurriness=this.backgroundBlurriness),1!==this.backgroundIntensity&&(e.object.backgroundIntensity=this.backgroundIntensity),e.object.backgroundRotation=this.backgroundRotation.toArray(),1!==this.environmentIntensity&&(e.object.environmentIntensity=this.environmentIntensity),e.object.environmentRotation=this.environmentRotation.toArray(),e}}class ca{constructor(t,e){this.isInterleavedBuffer=!0,this.array=t,this.stride=e,this.count=void 0!==t?t.length/e:0,this.usage=_i,this.updateRanges=[],this.version=0,this.uuid=Di()}onUploadCallback(){}set needsUpdate(t){!0===t&&this.version++}setUsage(t){return this.usage=t,this}addUpdateRange(t,e){this.updateRanges.push({start:t,count:e})}clearUpdateRanges(){this.updateRanges.length=0}copy(t){return this.array=new t.array.constructor(t.array),this.count=t.count,this.stride=t.stride,this.usage=t.usage,this}copyAt(t,e,i){t*=this.stride,i*=e.stride;for(let s=0,r=this.stride;st.far||e.push({distance:o,point:ya.clone(),uv:Xr.getInterpolation(ya,wa,Ma,Sa,_a,Aa,Ta,new Gi),face:null,object:this})}copy(t,e){return super.copy(t,e),void 0!==t.center&&this.center.copy(t.center),this.material=t.material,this}}function Ca(t,e,i,s,r,n){xa.subVectors(t,i).addScalar(.5).multiply(s),void 0!==r?(ba.x=n*xa.x-r*xa.y,ba.y=r*xa.x+n*xa.y):ba.copy(xa),t.copy(e),t.x+=ba.x,t.y+=ba.y,t.applyMatrix4(va)}const Ia=new Bs,Ba=new Bs;class ka extends Er{constructor(){super(),this.isLOD=!0,this._currentLevel=0,this.type="LOD",Object.defineProperties(this,{levels:{enumerable:!0,value:[]}}),this.autoUpdate=!0}copy(t){super.copy(t,!1);const e=t.levels;for(let t=0,i=e.length;t0){let i,s;for(i=1,s=e.length;i0){Ia.setFromMatrixPosition(this.matrixWorld);const i=t.ray.origin.distanceTo(Ia);this.getObjectForDistance(i).raycast(t,e)}}update(t){const e=this.levels;if(e.length>1){Ia.setFromMatrixPosition(t.matrixWorld),Ba.setFromMatrixPosition(this.matrixWorld);const i=Ia.distanceTo(Ba)/t.zoom;let s,r;for(e[0].object.visible=!0,s=1,r=e.length;s=t))break;e[s-1].object.visible=!1,e[s].object.visible=!0}for(this._currentLevel=s-1;s1?null:e.copy(t.start).addScaledVector(i,r)}intersectsLine(t){const e=this.distanceToPoint(t.start),i=this.distanceToPoint(t.end);return e<0&&i>0||i<0&&e>0}intersectsBox(t){return t.intersectsPlane(this)}intersectsSphere(t){return t.intersectsPlane(this)}coplanarPoint(t){return t.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(t,e){const i=e||ro.getNormalMatrix(t),s=this.coplanarPoint(io).applyMatrix4(t),r=this.normal.applyMatrix3(i).normalize();return this.constant=-s.dot(r),this}translate(t){return this.constant-=t.dot(this.normal),this}equals(t){return t.normal.equals(this.normal)&&t.constant===this.constant}clone(){return(new this.constructor).copy(this)}}const ao=new $s,oo=new Bs;class ho{constructor(t=new no,e=new no,i=new no,s=new no,r=new no,n=new no){this.planes=[t,e,i,s,r,n]}set(t,e,i,s,r,n){const a=this.planes;return a[0].copy(t),a[1].copy(e),a[2].copy(i),a[3].copy(s),a[4].copy(r),a[5].copy(n),this}copy(t){const e=this.planes;for(let i=0;i<6;i++)e[i].copy(t.planes[i]);return this}setFromProjectionMatrix(t,e=2e3){const i=this.planes,s=t.elements,r=s[0],n=s[1],a=s[2],o=s[3],h=s[4],l=s[5],c=s[6],u=s[7],d=s[8],p=s[9],m=s[10],y=s[11],g=s[12],f=s[13],x=s[14],b=s[15];if(i[0].setComponents(o-r,u-h,y-d,b-g).normalize(),i[1].setComponents(o+r,u+h,y+d,b+g).normalize(),i[2].setComponents(o+n,u+l,y+p,b+f).normalize(),i[3].setComponents(o-n,u-l,y-p,b-f).normalize(),i[4].setComponents(o-a,u-c,y-m,b-x).normalize(),e===Oi)i[5].setComponents(o+a,u+c,y+m,b+x).normalize();else{if(e!==Ni)throw new Error("THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: "+e);i[5].setComponents(a,c,m,x).normalize()}return this}intersectsObject(t){if(void 0!==t.boundingSphere)null===t.boundingSphere&&t.computeBoundingSphere(),ao.copy(t.boundingSphere).applyMatrix4(t.matrixWorld);else{const e=t.geometry;null===e.boundingSphere&&e.computeBoundingSphere(),ao.copy(e.boundingSphere).applyMatrix4(t.matrixWorld)}return this.intersectsSphere(ao)}intersectsSprite(t){return ao.center.set(0,0,0),ao.radius=.7071067811865476,ao.applyMatrix4(t.matrixWorld),this.intersectsSphere(ao)}intersectsSphere(t){const e=this.planes,i=t.center,s=-t.radius;for(let t=0;t<6;t++){if(e[t].distanceToPoint(i)0?t.max.x:t.min.x,oo.y=s.normal.y>0?t.max.y:t.min.y,oo.z=s.normal.z>0?t.max.z:t.min.z,s.distanceToPoint(oo)<0)return!1}return!0}containsPoint(t){const e=this.planes;for(let i=0;i<6;i++)if(e[i].distanceToPoint(t)<0)return!1;return!0}clone(){return(new this.constructor).copy(this)}}function lo(t,e){return t-e}function co(t,e){return t.z-e.z}function uo(t,e){return e.z-t.z}class po{constructor(){this.index=0,this.pool=[],this.list=[]}push(t,e,i,s){const r=this.pool,n=this.list;this.index>=r.length&&r.push({start:-1,count:-1,z:-1,index:-1});const a=r[this.index];n.push(a),this.index++,a.start=t,a.count=e,a.z=i,a.index=s}reset(){this.list.length=0,this.index=0}}const mo=new ar,yo=new Qr(1,1,1),go=new ho,fo=new Es,xo=new $s,bo=new Bs,vo=new Bs,wo=new Bs,Mo=new po,So=new Wn,_o=[];function Ao(t,e,i=0){const s=e.itemSize;if(t.isInterleavedBufferAttribute||t.array.constructor!==e.array.constructor){const r=t.count;for(let n=0;n65535?new Uint32Array(s):new Uint16Array(s);e.setIndex(new dn(t,1))}this._geometryInitialized=!0}}_validateGeometry(t){const e=this.geometry;if(Boolean(t.getIndex())!==Boolean(e.getIndex()))throw new Error('THREE.BatchedMesh: All geometries must consistently have "index".');for(const i in e.attributes){if(!t.hasAttribute(i))throw new Error(`THREE.BatchedMesh: Added geometry missing "${i}". All geometries must have consistent attributes.`);const s=t.getAttribute(i),r=e.getAttribute(i);if(s.itemSize!==r.itemSize||s.normalized!==r.normalized)throw new Error("THREE.BatchedMesh: All attributes must have a consistent itemSize and normalized value.")}}validateInstanceId(t){const e=this._instanceInfo;if(t<0||t>=e.length||!1===e[t].active)throw new Error(`THREE.BatchedMesh: Invalid instanceId ${t}. Instance is either out of range or has been deleted.`)}validateGeometryId(t){const e=this._geometryInfo;if(t<0||t>=e.length||!1===e[t].active)throw new Error(`THREE.BatchedMesh: Invalid geometryId ${t}. Geometry is either out of range or has been deleted.`)}setCustomSort(t){return this.customSort=t,this}computeBoundingBox(){null===this.boundingBox&&(this.boundingBox=new Es);const t=this.boundingBox,e=this._instanceInfo;t.makeEmpty();for(let i=0,s=e.length;i=this.maxInstanceCount&&0===this._availableInstanceIds.length)throw new Error("THREE.BatchedMesh: Maximum item count reached.");const e={visible:!0,active:!0,geometryIndex:t};let i=null;this._availableInstanceIds.length>0?(this._availableInstanceIds.sort(lo),i=this._availableInstanceIds.shift(),this._instanceInfo[i]=e):(i=this._instanceInfo.length,this._instanceInfo.push(e));const s=this._matricesTexture;mo.identity().toArray(s.image.data,16*i),s.needsUpdate=!0;const r=this._colorsTexture;return r&&(yo.toArray(r.image.data,4*i),r.needsUpdate=!0),this._visibilityChanged=!0,i}addGeometry(t,e=-1,i=-1){this._initializeGeometry(t),this._validateGeometry(t);const s={vertexStart:-1,vertexCount:-1,reservedVertexCount:-1,indexStart:-1,indexCount:-1,reservedIndexCount:-1,start:-1,count:-1,boundingBox:null,boundingSphere:null,active:!0},r=this._geometryInfo;s.vertexStart=this._nextVertexStart,s.reservedVertexCount=-1===e?t.getAttribute("position").count:e;const n=t.getIndex();if(null!==n&&(s.indexStart=this._nextIndexStart,s.reservedIndexCount=-1===i?n.count:i),-1!==s.indexStart&&s.indexStart+s.reservedIndexCount>this._maxIndexCount||s.vertexStart+s.reservedVertexCount>this._maxVertexCount)throw new Error("THREE.BatchedMesh: Reserved space request exceeds the maximum buffer size.");let a;return this._availableGeometryIds.length>0?(this._availableGeometryIds.sort(lo),a=this._availableGeometryIds.shift(),r[a]=s):(a=this._geometryCount,this._geometryCount++,r.push(s)),this.setGeometryAt(a,t),this._nextIndexStart=s.indexStart+s.reservedIndexCount,this._nextVertexStart=s.vertexStart+s.reservedVertexCount,a}setGeometryAt(t,e){if(t>=this._geometryCount)throw new Error("THREE.BatchedMesh: Maximum geometry count reached.");this._validateGeometry(e);const i=this.geometry,s=null!==i.getIndex(),r=i.getIndex(),n=e.getIndex(),a=this._geometryInfo[t];if(s&&n.count>a.reservedIndexCount||e.attributes.position.count>a.reservedVertexCount)throw new Error("THREE.BatchedMesh: Reserved space not large enough for provided geometry.");const o=a.vertexStart,h=a.reservedVertexCount;a.vertexCount=e.getAttribute("position").count;for(const t in i.attributes){const s=e.getAttribute(t),r=i.getAttribute(t);Ao(s,r,o);const n=s.itemSize;for(let t=s.count,e=h;t=e.length||!1===e[t].active)return this;const i=this._instanceInfo;for(let e=0,s=i.length;ee)).sort(((t,e)=>i[t].vertexStart-i[e].vertexStart)),r=this.geometry;for(let n=0,a=i.length;n=this._geometryCount)return null;const i=this.geometry,s=this._geometryInfo[t];if(null===s.boundingBox){const t=new Es,e=i.index,r=i.attributes.position;for(let i=s.start,n=s.start+s.count;i=this._geometryCount)return null;const i=this.geometry,s=this._geometryInfo[t];if(null===s.boundingSphere){const e=new $s;this.getBoundingBoxAt(t,fo),fo.getCenter(e.center);const r=i.index,n=i.attributes.position;let a=0;for(let t=s.start,i=s.start+s.count;tt.active));if(Math.max(...i.map((t=>t.vertexStart+t.reservedVertexCount)))>t)throw new Error(`BatchedMesh: Geometry vertex values are being used outside the range ${e}. Cannot shrink further.`);if(this.geometry.index){if(Math.max(...i.map((t=>t.indexStart+t.reservedIndexCount)))>e)throw new Error(`BatchedMesh: Geometry index values are being used outside the range ${e}. Cannot shrink further.`)}const s=this.geometry;s.dispose(),this._maxVertexCount=t,this._maxIndexCount=e,this._geometryInitialized&&(this._geometryInitialized=!1,this.geometry=new In,this._initializeGeometry(s));const r=this.geometry;s.index&&To(s.index.array,r.index.array);for(const t in s.attributes)To(s.attributes[t].array,r.attributes[t].array)}raycast(t,e){const i=this._instanceInfo,s=this._geometryInfo,r=this.matrixWorld,n=this.geometry;So.material=this.material,So.geometry.index=n.index,So.geometry.attributes=n.attributes,null===So.geometry.boundingBox&&(So.geometry.boundingBox=new Es),null===So.geometry.boundingSphere&&(So.geometry.boundingSphere=new $s);for(let n=0,a=i.length;n({...t,boundingBox:null!==t.boundingBox?t.boundingBox.clone():null,boundingSphere:null!==t.boundingSphere?t.boundingSphere.clone():null}))),this._instanceInfo=t._instanceInfo.map((t=>({...t}))),this._maxInstanceCount=t._maxInstanceCount,this._maxVertexCount=t._maxVertexCount,this._maxIndexCount=t._maxIndexCount,this._geometryInitialized=t._geometryInitialized,this._geometryCount=t._geometryCount,this._multiDrawCounts=t._multiDrawCounts.slice(),this._multiDrawStarts=t._multiDrawStarts.slice(),this._matricesTexture=t._matricesTexture.clone(),this._matricesTexture.image.data=this._matricesTexture.image.data.slice(),null!==this._colorsTexture&&(this._colorsTexture=t._colorsTexture.clone(),this._colorsTexture.image.data=this._colorsTexture.image.data.slice()),this}dispose(){this.geometry.dispose(),this._matricesTexture.dispose(),this._matricesTexture=null,this._indirectTexture.dispose(),this._indirectTexture=null,null!==this._colorsTexture&&(this._colorsTexture.dispose(),this._colorsTexture=null)}onBeforeRender(t,e,i,s,r){if(!this._visibilityChanged&&!this.perObjectFrustumCulled&&!this.sortObjects)return;const n=s.getIndex(),a=null===n?1:n.array.BYTES_PER_ELEMENT,o=this._instanceInfo,h=this._multiDrawStarts,l=this._multiDrawCounts,c=this._geometryInfo,u=this.perObjectFrustumCulled,d=this._indirectTexture,p=d.image.data;u&&(mo.multiplyMatrices(i.projectionMatrix,i.matrixWorldInverse).multiply(this.matrixWorld),go.setFromProjectionMatrix(mo,t.coordinateSystem));let m=0;if(this.sortObjects){mo.copy(this.matrixWorld).invert(),bo.setFromMatrixPosition(i.matrixWorld).applyMatrix4(mo),vo.set(0,0,-1).transformDirection(i.matrixWorld).transformDirection(mo);for(let t=0,e=o.length;t0){const i=t[e[0]];if(void 0!==i){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,e=i.length;ts)return;Po.applyMatrix4(t.matrixWorld);const h=e.ray.origin.distanceTo(Po);return he.far?void 0:{distance:h,point:Oo.clone().applyMatrix4(t.matrixWorld),index:a,face:null,faceIndex:null,barycoord:null,object:t}}const Lo=new Bs,Vo=new Bs;class jo extends No{constructor(t,e){super(t,e),this.isLineSegments=!0,this.type="LineSegments"}computeLineDistances(){const t=this.geometry;if(null===t.index){const e=t.attributes.position,i=[];for(let t=0,s=e.count;t0){const i=t[e[0]];if(void 0!==i){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,e=i.length;tr.far)return;n.push({distance:h,distanceToRay:Math.sqrt(o),point:i,index:e,face:null,faceIndex:null,barycoord:null,object:a})}}class Zo extends ws{constructor(t,e,i,s,r=1006,n=1006,a,o,h){super(t,e,i,s,r,n,a,o,h),this.isVideoTexture=!0,this.generateMipmaps=!1;const l=this;"requestVideoFrameCallback"in t&&t.requestVideoFrameCallback((function e(){l.needsUpdate=!0,t.requestVideoFrameCallback(e)}))}clone(){return new this.constructor(this.image).copy(this)}update(){const t=this.image;!1==="requestVideoFrameCallback"in t&&t.readyState>=t.HAVE_CURRENT_DATA&&(this.needsUpdate=!0)}}class Go extends Zo{constructor(t,e,i,s,r,n,a,o){super({},t,e,i,s,r,n,a,o),this.isVideoFrameTexture=!0}update(){}clone(){return(new this.constructor).copy(this)}setFrame(t){this.image=t,this.needsUpdate=!0}}class $o extends ws{constructor(t,e){super({width:t,height:e}),this.isFramebufferTexture=!0,this.magFilter=gt,this.minFilter=gt,this.generateMipmaps=!1,this.needsUpdate=!0}}class Qo extends ws{constructor(t,e,i,s,r,n,a,o,h,l,c,u){super(null,n,a,o,h,l,s,r,c,u),this.isCompressedTexture=!0,this.image={width:e,height:i},this.mipmaps=t,this.flipY=!1,this.generateMipmaps=!1}}class Ko extends Qo{constructor(t,e,i,s,r,n){super(t,e,i,r,n),this.isCompressedArrayTexture=!0,this.image.depth=s,this.wrapR=mt,this.layerUpdates=new Set}addLayerUpdate(t){this.layerUpdates.add(t)}clearLayerUpdates(){this.layerUpdates.clear()}}class th extends Qo{constructor(t,e,i){super(void 0,t[0].width,t[0].height,e,i,ht),this.isCompressedCubeTexture=!0,this.isCubeTexture=!0,this.image=t}}class eh extends ws{constructor(t,e,i,s,r,n,a,o,h){super(t,e,i,s,r,n,a,o,h),this.isCanvasTexture=!0,this.needsUpdate=!0}}class ih extends ws{constructor(t,e,i=1014,s,r,n,a=1003,o=1003,h,l=1026){if(l!==Dt&&1027!==l)throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");super(null,s,r,n,a,o,l,i,h),this.isDepthTexture=!0,this.image={width:t,height:e},this.flipY=!1,this.generateMipmaps=!1,this.compareFunction=null}copy(t){return super.copy(t),this.source=new xs(Object.assign({},t.image)),this.compareFunction=t.compareFunction,this}toJSON(t){const e=super.toJSON(t);return null!==this.compareFunction&&(e.compareFunction=this.compareFunction),e}}class sh{constructor(){this.type="Curve",this.arcLengthDivisions=200,this.needsUpdate=!1,this.cacheArcLengths=null}getPoint(){console.warn("THREE.Curve: .getPoint() not implemented.")}getPointAt(t,e){const i=this.getUtoTmapping(t);return this.getPoint(i,e)}getPoints(t=5){const e=[];for(let i=0;i<=t;i++)e.push(this.getPoint(i/t));return e}getSpacedPoints(t=5){const e=[];for(let i=0;i<=t;i++)e.push(this.getPointAt(i/t));return e}getLength(){const t=this.getLengths();return t[t.length-1]}getLengths(t=this.arcLengthDivisions){if(this.cacheArcLengths&&this.cacheArcLengths.length===t+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;const e=[];let i,s=this.getPoint(0),r=0;e.push(0);for(let n=1;n<=t;n++)i=this.getPoint(n/t),r+=i.distanceTo(s),e.push(r),s=i;return this.cacheArcLengths=e,e}updateArcLengths(){this.needsUpdate=!0,this.getLengths()}getUtoTmapping(t,e=null){const i=this.getLengths();let s=0;const r=i.length;let n;n=e||t*i[r-1];let a,o=0,h=r-1;for(;o<=h;)if(s=Math.floor(o+(h-o)/2),a=i[s]-n,a<0)o=s+1;else{if(!(a>0)){h=s;break}h=s-1}if(s=h,i[s]===n)return s/(r-1);const l=i[s];return(s+(n-l)/(i[s+1]-l))/(r-1)}getTangent(t,e){const i=1e-4;let s=t-i,r=t+i;s<0&&(s=0),r>1&&(r=1);const n=this.getPoint(s),a=this.getPoint(r),o=e||(n.isVector2?new Gi:new Bs);return o.copy(a).sub(n).normalize(),o}getTangentAt(t,e){const i=this.getUtoTmapping(t);return this.getTangent(i,e)}computeFrenetFrames(t,e=!1){const i=new Bs,s=[],r=[],n=[],a=new Bs,o=new ar;for(let e=0;e<=t;e++){const i=e/t;s[e]=this.getTangentAt(i,new Bs)}r[0]=new Bs,n[0]=new Bs;let h=Number.MAX_VALUE;const l=Math.abs(s[0].x),c=Math.abs(s[0].y),u=Math.abs(s[0].z);l<=h&&(h=l,i.set(1,0,0)),c<=h&&(h=c,i.set(0,1,0)),u<=h&&i.set(0,0,1),a.crossVectors(s[0],i).normalize(),r[0].crossVectors(s[0],a),n[0].crossVectors(s[0],r[0]);for(let e=1;e<=t;e++){if(r[e]=r[e-1].clone(),n[e]=n[e-1].clone(),a.crossVectors(s[e-1],s[e]),a.length()>Number.EPSILON){a.normalize();const t=Math.acos(Hi(s[e-1].dot(s[e]),-1,1));r[e].applyMatrix4(o.makeRotationAxis(a,t))}n[e].crossVectors(s[e],r[e])}if(!0===e){let e=Math.acos(Hi(r[0].dot(r[t]),-1,1));e/=t,s[0].dot(a.crossVectors(r[0],r[t]))>0&&(e=-e);for(let i=1;i<=t;i++)r[i].applyMatrix4(o.makeRotationAxis(s[i],e*i)),n[i].crossVectors(s[i],r[i])}return{tangents:s,normals:r,binormals:n}}clone(){return(new this.constructor).copy(this)}copy(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}toJSON(){const t={metadata:{version:4.6,type:"Curve",generator:"Curve.toJSON"}};return t.arcLengthDivisions=this.arcLengthDivisions,t.type=this.type,t}fromJSON(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}}class rh extends sh{constructor(t=0,e=0,i=1,s=1,r=0,n=2*Math.PI,a=!1,o=0){super(),this.isEllipseCurve=!0,this.type="EllipseCurve",this.aX=t,this.aY=e,this.xRadius=i,this.yRadius=s,this.aStartAngle=r,this.aEndAngle=n,this.aClockwise=a,this.aRotation=o}getPoint(t,e=new Gi){const i=e,s=2*Math.PI;let r=this.aEndAngle-this.aStartAngle;const n=Math.abs(r)s;)r-=s;r0?0:(Math.floor(Math.abs(h)/r)+1)*r:0===l&&h===r-1&&(h=r-2,l=1),this.closed||h>0?a=s[(h-1)%r]:(oh.subVectors(s[0],s[1]).add(s[0]),a=oh);const c=s[h%r],u=s[(h+1)%r];if(this.closed||h+2s.length-2?s.length-1:n+1],c=s[n>s.length-3?s.length-1:n+2];return i.set(dh(a,o.x,h.x,l.x,c.x),dh(a,o.y,h.y,l.y,c.y)),i}copy(t){super.copy(t),this.points=[];for(let e=0,i=t.points.length;e=i){const t=s[r]-i,n=this.curves[r],a=n.getLength(),o=0===a?0:1-t/a;return n.getPointAt(o,e)}r++}return null}getLength(){const t=this.getCurveLengths();return t[t.length-1]}updateArcLengths(){this.needsUpdate=!0,this.cacheLengths=null,this.getCurveLengths()}getCurveLengths(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;const t=[];let e=0;for(let i=0,s=this.curves.length;i1&&!e[e.length-1].equals(e[0])&&e.push(e[0]),e}copy(t){super.copy(t),this.curves=[];for(let e=0,i=t.curves.length;e0){const t=h.getPoint(0);t.equals(this.currentPoint)||this.lineTo(t.x,t.y)}this.curves.push(h);const l=h.getPoint(1);return this.currentPoint.copy(l),this}copy(t){return super.copy(t),this.currentPoint.copy(t.currentPoint),this}toJSON(){const t=super.toJSON();return t.currentPoint=this.currentPoint.toArray(),t}fromJSON(t){return super.fromJSON(t),this.currentPoint.fromArray(t.currentPoint),this}}class Ah extends In{constructor(t=[new Gi(0,-.5),new Gi(.5,0),new Gi(0,.5)],e=12,i=0,s=2*Math.PI){super(),this.type="LatheGeometry",this.parameters={points:t,segments:e,phiStart:i,phiLength:s},e=Math.floor(e),s=Hi(s,0,2*Math.PI);const r=[],n=[],a=[],o=[],h=[],l=1/e,c=new Bs,u=new Gi,d=new Bs,p=new Bs,m=new Bs;let y=0,g=0;for(let e=0;e<=t.length-1;e++)switch(e){case 0:y=t[e+1].x-t[e].x,g=t[e+1].y-t[e].y,d.x=1*g,d.y=-y,d.z=0*g,m.copy(d),d.normalize(),o.push(d.x,d.y,d.z);break;case t.length-1:o.push(m.x,m.y,m.z);break;default:y=t[e+1].x-t[e].x,g=t[e+1].y-t[e].y,d.x=1*g,d.y=-y,d.z=0*g,p.copy(d),d.x+=m.x,d.y+=m.y,d.z+=m.z,d.normalize(),o.push(d.x,d.y,d.z),m.copy(p)}for(let r=0;r<=e;r++){const d=i+r*l*s,p=Math.sin(d),m=Math.cos(d);for(let i=0;i<=t.length-1;i++){c.x=t[i].x*p,c.y=t[i].y,c.z=t[i].x*m,n.push(c.x,c.y,c.z),u.x=r/e,u.y=i/(t.length-1),a.push(u.x,u.y);const s=o[3*i+0]*p,l=o[3*i+1],d=o[3*i+0]*m;h.push(s,l,d)}}for(let i=0;i0||0!==s)&&(l.push(n,a,h),x+=3),(e>0||s!==r-1)&&(l.push(a,o,h),x+=3)}h.addGroup(g,x,0),g+=x}(),!1===n&&(t>0&&f(!0),e>0&&f(!1)),this.setIndex(l),this.setAttribute("position",new wn(c,3)),this.setAttribute("normal",new wn(u,3)),this.setAttribute("uv",new wn(d,2))}copy(t){return super.copy(t),this.parameters=Object.assign({},t.parameters),this}static fromJSON(t){return new Ch(t.radiusTop,t.radiusBottom,t.height,t.radialSegments,t.heightSegments,t.openEnded,t.thetaStart,t.thetaLength)}}class Ih extends Ch{constructor(t=1,e=1,i=32,s=1,r=!1,n=0,a=2*Math.PI){super(0,t,e,i,s,r,n,a),this.type="ConeGeometry",this.parameters={radius:t,height:e,radialSegments:i,heightSegments:s,openEnded:r,thetaStart:n,thetaLength:a}}static fromJSON(t){return new Ih(t.radius,t.height,t.radialSegments,t.heightSegments,t.openEnded,t.thetaStart,t.thetaLength)}}class Bh extends In{constructor(t=[],e=[],i=1,s=0){super(),this.type="PolyhedronGeometry",this.parameters={vertices:t,indices:e,radius:i,detail:s};const r=[],n=[];function a(t,e,i,s){const r=s+1,n=[];for(let s=0;s<=r;s++){n[s]=[];const a=t.clone().lerp(i,s/r),o=e.clone().lerp(i,s/r),h=r-s;for(let t=0;t<=h;t++)n[s][t]=0===t&&s===r?a:a.clone().lerp(o,t/h)}for(let t=0;t.9&&a<.1&&(e<.2&&(n[t+0]+=1),i<.2&&(n[t+2]+=1),s<.2&&(n[t+4]+=1))}}()}(),this.setAttribute("position",new wn(r,3)),this.setAttribute("normal",new wn(r.slice(),3)),this.setAttribute("uv",new wn(n,2)),0===s?this.computeVertexNormals():this.normalizeNormals()}copy(t){return super.copy(t),this.parameters=Object.assign({},t.parameters),this}static fromJSON(t){return new Bh(t.vertices,t.indices,t.radius,t.details)}}class kh extends Bh{constructor(t=1,e=0){const i=(1+Math.sqrt(5))/2,s=1/i;super([-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,0,-s,-i,0,-s,i,0,s,-i,0,s,i,-s,-i,0,-s,i,0,s,-i,0,s,i,0,-i,0,-s,i,0,-s,-i,0,s,i,0,s],[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9],t,e),this.type="DodecahedronGeometry",this.parameters={radius:t,detail:e}}static fromJSON(t){return new kh(t.radius,t.detail)}}const Rh=new Bs,Eh=new Bs,Ph=new Bs,Oh=new Xr;class Nh extends In{constructor(t=null,e=1){if(super(),this.type="EdgesGeometry",this.parameters={geometry:t,thresholdAngle:e},null!==t){const i=4,s=Math.pow(10,i),r=Math.cos(Wi*e),n=t.getIndex(),a=t.getAttribute("position"),o=n?n.count:a.count,h=[0,0,0],l=["a","b","c"],c=new Array(3),u={},d=[];for(let t=0;t80*i){o=1/0,h=1/0;let e=-1/0,s=-1/0;for(let n=i;ne&&(e=i),r>s&&(s=r)}l=Math.max(e-o,s-h),l=0!==l?32767/l:0}return Wh(n,a,i,o,h,l,0),a}function Vh(t,e,i,s,r){let n;if(r===function(t,e,i,s){let r=0;for(let n=e,a=i-s;n0)for(let r=e;r=e;r-=s)n=ol(r/s|0,t[r],t[r+1],n);return n&&el(n,n.next)&&(hl(n),n=n.next),n}function jh(t,e){if(!t)return t;e||(e=t);let i,s=t;do{if(i=!1,s.steiner||!el(s,s.next)&&0!==tl(s.prev,s,s.next))s=s.next;else{if(hl(s),s=e=s.prev,s===s.next)break;i=!0}}while(i||s!==e);return e}function Wh(t,e,i,s,r,n,a){if(!t)return;!a&&n&&function(t,e,i,s){let r=t;do{0===r.z&&(r.z=Zh(r.x,r.y,e,i,s)),r.prevZ=r.prev,r.nextZ=r.next,r=r.next}while(r!==t);r.prevZ.nextZ=null,r.prevZ=null,function(t){let e,i=1;do{let s,r=t;t=null;let n=null;for(e=0;r;){e++;let a=r,o=0;for(let t=0;t0||h>0&&a;)0!==o&&(0===h||!a||r.z<=a.z)?(s=r,r=r.nextZ,o--):(s=a,a=a.nextZ,h--),n?n.nextZ=s:t=s,s.prevZ=n,n=s;r=a}n.nextZ=null,i*=2}while(e>1)}(r)}(t,s,r,n);let o=t;for(;t.prev!==t.next;){const h=t.prev,l=t.next;if(n?Dh(t,s,r,n):Uh(t))e.push(h.i,t.i,l.i),hl(t),t=l.next,o=l.next;else if((t=l)===o){a?1===a?Wh(t=Hh(jh(t),e),e,i,s,r,n,2):2===a&&qh(t,e,i,s,r,n):Wh(jh(t),e,i,s,r,n,1);break}}}function Uh(t){const e=t.prev,i=t,s=t.next;if(tl(e,i,s)>=0)return!1;const r=e.x,n=i.x,a=s.x,o=e.y,h=i.y,l=s.y,c=Math.min(r,n,a),u=Math.min(o,h,l),d=Math.max(r,n,a),p=Math.max(o,h,l);let m=s.next;for(;m!==e;){if(m.x>=c&&m.x<=d&&m.y>=u&&m.y<=p&&Qh(r,o,n,h,a,l,m.x,m.y)&&tl(m.prev,m,m.next)>=0)return!1;m=m.next}return!0}function Dh(t,e,i,s){const r=t.prev,n=t,a=t.next;if(tl(r,n,a)>=0)return!1;const o=r.x,h=n.x,l=a.x,c=r.y,u=n.y,d=a.y,p=Math.min(o,h,l),m=Math.min(c,u,d),y=Math.max(o,h,l),g=Math.max(c,u,d),f=Zh(p,m,e,i,s),x=Zh(y,g,e,i,s);let b=t.prevZ,v=t.nextZ;for(;b&&b.z>=f&&v&&v.z<=x;){if(b.x>=p&&b.x<=y&&b.y>=m&&b.y<=g&&b!==r&&b!==a&&Qh(o,c,h,u,l,d,b.x,b.y)&&tl(b.prev,b,b.next)>=0)return!1;if(b=b.prevZ,v.x>=p&&v.x<=y&&v.y>=m&&v.y<=g&&v!==r&&v!==a&&Qh(o,c,h,u,l,d,v.x,v.y)&&tl(v.prev,v,v.next)>=0)return!1;v=v.nextZ}for(;b&&b.z>=f;){if(b.x>=p&&b.x<=y&&b.y>=m&&b.y<=g&&b!==r&&b!==a&&Qh(o,c,h,u,l,d,b.x,b.y)&&tl(b.prev,b,b.next)>=0)return!1;b=b.prevZ}for(;v&&v.z<=x;){if(v.x>=p&&v.x<=y&&v.y>=m&&v.y<=g&&v!==r&&v!==a&&Qh(o,c,h,u,l,d,v.x,v.y)&&tl(v.prev,v,v.next)>=0)return!1;v=v.nextZ}return!0}function Hh(t,e){let i=t;do{const s=i.prev,r=i.next.next;!el(s,r)&&il(s,i,i.next,r)&&nl(s,r)&&nl(r,s)&&(e.push(s.i,i.i,r.i),hl(i),hl(i.next),i=t=r),i=i.next}while(i!==t);return jh(i)}function qh(t,e,i,s,r,n){let a=t;do{let t=a.next.next;for(;t!==a.prev;){if(a.i!==t.i&&Kh(a,t)){let o=al(a,t);return a=jh(a,a.next),o=jh(o,o.next),Wh(a,e,i,s,r,n,0),void Wh(o,e,i,s,r,n,0)}t=t.next}a=a.next}while(a!==t)}function Jh(t,e){let i=t.x-e.x;if(0===i&&(i=t.y-e.y,0===i)){i=(t.next.y-t.y)/(t.next.x-t.x)-(e.next.y-e.y)/(e.next.x-e.x)}return i}function Xh(t,e){const i=function(t,e){let i=e;const s=t.x,r=t.y;let n,a=-1/0;if(el(t,i))return i;do{if(el(t,i.next))return i.next;if(r<=i.y&&r>=i.next.y&&i.next.y!==i.y){const t=i.x+(r-i.y)*(i.next.x-i.x)/(i.next.y-i.y);if(t<=s&&t>a&&(a=t,n=i.x=i.x&&i.x>=h&&s!==i.x&&$h(rn.x||i.x===n.x&&Yh(n,i)))&&(n=i,c=e)}i=i.next}while(i!==o);return n}(t,e);if(!i)return e;const s=al(i,t);return jh(s,s.next),jh(i,i.next)}function Yh(t,e){return tl(t.prev,t,e.prev)<0&&tl(e.next,t,t.next)<0}function Zh(t,e,i,s,r){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=(t-i)*r|0)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=(e-s)*r|0)|e<<8))|e<<4))|e<<2))|e<<1))<<1}function Gh(t){let e=t,i=t;do{(e.x=(t-a)*(n-o)&&(t-a)*(s-o)>=(i-a)*(e-o)&&(i-a)*(n-o)>=(r-a)*(s-o)}function Qh(t,e,i,s,r,n,a,o){return!(t===a&&e===o)&&$h(t,e,i,s,r,n,a,o)}function Kh(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!function(t,e){let i=t;do{if(i.i!==t.i&&i.next.i!==t.i&&i.i!==e.i&&i.next.i!==e.i&&il(i,i.next,t,e))return!0;i=i.next}while(i!==t);return!1}(t,e)&&(nl(t,e)&&nl(e,t)&&function(t,e){let i=t,s=!1;const r=(t.x+e.x)/2,n=(t.y+e.y)/2;do{i.y>n!=i.next.y>n&&i.next.y!==i.y&&r<(i.next.x-i.x)*(n-i.y)/(i.next.y-i.y)+i.x&&(s=!s),i=i.next}while(i!==t);return s}(t,e)&&(tl(t.prev,t,e.prev)||tl(t,e.prev,e))||el(t,e)&&tl(t.prev,t,t.next)>0&&tl(e.prev,e,e.next)>0)}function tl(t,e,i){return(e.y-t.y)*(i.x-e.x)-(e.x-t.x)*(i.y-e.y)}function el(t,e){return t.x===e.x&&t.y===e.y}function il(t,e,i,s){const r=rl(tl(t,e,i)),n=rl(tl(t,e,s)),a=rl(tl(i,s,t)),o=rl(tl(i,s,e));return r!==n&&a!==o||(!(0!==r||!sl(t,i,e))||(!(0!==n||!sl(t,s,e))||(!(0!==a||!sl(i,t,s))||!(0!==o||!sl(i,e,s)))))}function sl(t,e,i){return e.x<=Math.max(t.x,i.x)&&e.x>=Math.min(t.x,i.x)&&e.y<=Math.max(t.y,i.y)&&e.y>=Math.min(t.y,i.y)}function rl(t){return t>0?1:t<0?-1:0}function nl(t,e){return tl(t.prev,t,t.next)<0?tl(t,e,t.next)>=0&&tl(t,t.prev,e)>=0:tl(t,e,t.prev)<0||tl(t,t.next,e)<0}function al(t,e){const i=ll(t.i,t.x,t.y),s=ll(e.i,e.x,e.y),r=t.next,n=e.prev;return t.next=e,e.prev=t,i.next=r,r.prev=i,s.next=i,i.prev=s,n.next=s,s.prev=n,s}function ol(t,e,i,s){const r=ll(t,e,i);return s?(r.next=s.next,r.prev=s,s.next.prev=r,s.next=r):(r.prev=r,r.next=r),r}function hl(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function ll(t,e,i){return{i:t,x:e,y:i,prev:null,next:null,z:0,prevZ:null,nextZ:null,steiner:!1}}class cl{static triangulate(t,e,i=2){return Lh(t,e,i)}}class ul{static area(t){const e=t.length;let i=0;for(let s=e-1,r=0;r2&&t[e-1].equals(t[0])&&t.pop()}function pl(t,e){for(let i=0;iNumber.EPSILON){const u=Math.sqrt(c),d=Math.sqrt(h*h+l*l),p=e.x-o/u,m=e.y+a/u,y=((i.x-l/d-p)*l-(i.y+h/d-m)*h)/(a*l-o*h);s=p+a*y-t.x,r=m+o*y-t.y;const g=s*s+r*r;if(g<=2)return new Gi(s,r);n=Math.sqrt(g/2)}else{let t=!1;a>Number.EPSILON?h>Number.EPSILON&&(t=!0):a<-Number.EPSILON?h<-Number.EPSILON&&(t=!0):Math.sign(o)===Math.sign(l)&&(t=!0),t?(s=-o,r=a,n=Math.sqrt(c)):(s=a,r=o,n=Math.sqrt(c/2))}return new Gi(s/n,r/n)}const k=[];for(let t=0,e=z.length,i=e-1,s=t+1;t=0;t--){const e=t/p,i=c*Math.cos(e*Math.PI/2),s=u*Math.sin(e*Math.PI/2)+d;for(let t=0,e=z.length;t=0;){const s=i;let r=i-1;r<0&&(r=t.length-1);for(let t=0,i=o+2*p;t0)&&d.push(e,r,h),(t!==i-1||o0!=t>0&&this.version++,this._anisotropy=t}get clearcoat(){return this._clearcoat}set clearcoat(t){this._clearcoat>0!=t>0&&this.version++,this._clearcoat=t}get iridescence(){return this._iridescence}set iridescence(t){this._iridescence>0!=t>0&&this.version++,this._iridescence=t}get dispersion(){return this._dispersion}set dispersion(t){this._dispersion>0!=t>0&&this.version++,this._dispersion=t}get sheen(){return this._sheen}set sheen(t){this._sheen>0!=t>0&&this.version++,this._sheen=t}get transmission(){return this._transmission}set transmission(t){this._transmission>0!=t>0&&this.version++,this._transmission=t}copy(t){return super.copy(t),this.defines={STANDARD:"",PHYSICAL:""},this.anisotropy=t.anisotropy,this.anisotropyRotation=t.anisotropyRotation,this.anisotropyMap=t.anisotropyMap,this.clearcoat=t.clearcoat,this.clearcoatMap=t.clearcoatMap,this.clearcoatRoughness=t.clearcoatRoughness,this.clearcoatRoughnessMap=t.clearcoatRoughnessMap,this.clearcoatNormalMap=t.clearcoatNormalMap,this.clearcoatNormalScale.copy(t.clearcoatNormalScale),this.dispersion=t.dispersion,this.ior=t.ior,this.iridescence=t.iridescence,this.iridescenceMap=t.iridescenceMap,this.iridescenceIOR=t.iridescenceIOR,this.iridescenceThicknessRange=[...t.iridescenceThicknessRange],this.iridescenceThicknessMap=t.iridescenceThicknessMap,this.sheen=t.sheen,this.sheenColor.copy(t.sheenColor),this.sheenColorMap=t.sheenColorMap,this.sheenRoughness=t.sheenRoughness,this.sheenRoughnessMap=t.sheenRoughnessMap,this.transmission=t.transmission,this.transmissionMap=t.transmissionMap,this.thickness=t.thickness,this.thicknessMap=t.thicknessMap,this.attenuationDistance=t.attenuationDistance,this.attenuationColor.copy(t.attenuationColor),this.specularIntensity=t.specularIntensity,this.specularIntensityMap=t.specularIntensityMap,this.specularColor.copy(t.specularColor),this.specularColorMap=t.specularColorMap,this}}class El extends en{constructor(t){super(),this.isMeshPhongMaterial=!0,this.type="MeshPhongMaterial",this.color=new Qr(16777215),this.specular=new Qr(1118481),this.shininess=30,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new Qr(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new Gi(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new gr,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.specular.copy(t.specular),this.shininess=t.shininess,this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapRotation.copy(t.envMapRotation),this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.flatShading=t.flatShading,this.fog=t.fog,this}}class Pl extends en{constructor(t){super(),this.isMeshToonMaterial=!0,this.defines={TOON:""},this.type="MeshToonMaterial",this.color=new Qr(16777215),this.map=null,this.gradientMap=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new Qr(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new Gi(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.gradientMap=t.gradientMap,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.alphaMap=t.alphaMap,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.fog=t.fog,this}}class Ol extends en{constructor(t){super(),this.isMeshNormalMaterial=!0,this.type="MeshNormalMaterial",this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new Gi(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.flatShading=!1,this.setValues(t)}copy(t){return super.copy(t),this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.flatShading=t.flatShading,this}}class Nl extends en{constructor(t){super(),this.isMeshLambertMaterial=!0,this.type="MeshLambertMaterial",this.color=new Qr(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new Qr(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new Gi(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new gr,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapRotation.copy(t.envMapRotation),this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.flatShading=t.flatShading,this.fog=t.fog,this}}class Fl extends en{constructor(t){super(),this.isMeshDepthMaterial=!0,this.type="MeshDepthMaterial",this.depthPacking=3200,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.setValues(t)}copy(t){return super.copy(t),this.depthPacking=t.depthPacking,this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this}}class Ll extends en{constructor(t){super(),this.isMeshDistanceMaterial=!0,this.type="MeshDistanceMaterial",this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.setValues(t)}copy(t){return super.copy(t),this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this}}class Vl extends en{constructor(t){super(),this.isMeshMatcapMaterial=!0,this.defines={MATCAP:""},this.type="MeshMatcapMaterial",this.color=new Qr(16777215),this.matcap=null,this.map=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new Gi(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.defines={MATCAP:""},this.color.copy(t.color),this.matcap=t.matcap,this.map=t.map,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.alphaMap=t.alphaMap,this.flatShading=t.flatShading,this.fog=t.fog,this}}class jl extends Co{constructor(t){super(),this.isLineDashedMaterial=!0,this.type="LineDashedMaterial",this.scale=1,this.dashSize=3,this.gapSize=1,this.setValues(t)}copy(t){return super.copy(t),this.scale=t.scale,this.dashSize=t.dashSize,this.gapSize=t.gapSize,this}}function Wl(t,e){return t&&t.constructor!==e?"number"==typeof e.BYTES_PER_ELEMENT?new e(t):Array.prototype.slice.call(t):t}function Ul(t){return ArrayBuffer.isView(t)&&!(t instanceof DataView)}function Dl(t){const e=t.length,i=new Array(e);for(let t=0;t!==e;++t)i[t]=t;return i.sort((function(e,i){return t[e]-t[i]})),i}function Hl(t,e,i){const s=t.length,r=new t.constructor(s);for(let n=0,a=0;a!==s;++n){const s=i[n]*e;for(let i=0;i!==e;++i)r[a++]=t[s+i]}return r}function ql(t,e,i,s){let r=1,n=t[0];for(;void 0!==n&&void 0===n[s];)n=t[r++];if(void 0===n)return;let a=n[s];if(void 0!==a)if(Array.isArray(a))do{a=n[s],void 0!==a&&(e.push(n.time),i.push(...a)),n=t[r++]}while(void 0!==n);else if(void 0!==a.toArray)do{a=n[s],void 0!==a&&(e.push(n.time),a.toArray(i,i.length)),n=t[r++]}while(void 0!==n);else do{a=n[s],void 0!==a&&(e.push(n.time),i.push(a)),n=t[r++]}while(void 0!==n)}class Jl{static convertArray(t,e){return Wl(t,e)}static isTypedArray(t){return Ul(t)}static getKeyframeOrder(t){return Dl(t)}static sortedArray(t,e,i){return Hl(t,e,i)}static flattenJSON(t,e,i,s){ql(t,e,i,s)}static subclip(t,e,i,s,r=30){return function(t,e,i,s,r=30){const n=t.clone();n.name=e;const a=[];for(let t=0;t=s)){h.push(e.times[t]);for(let i=0;in.tracks[t].times[0]&&(o=n.tracks[t].times[0]);for(let t=0;t=s.times[u]){const t=u*h+o,e=t+h-o;d=s.values.slice(t,e)}else{const t=s.createInterpolant(),e=o,i=h-o;t.evaluate(n),d=t.resultBuffer.slice(e,i)}"quaternion"===r&&(new Is).fromArray(d).normalize().conjugate().toArray(d);const p=a.times.length;for(let t=0;t=r)break t;{const a=e[1];t=r)break e}n=i,i=0}}for(;i>>1;te;)--n;if(++n,0!==r||n!==s){r>=n&&(n=Math.max(n,1),r=n-1);const t=this.getValueSize();this.times=i.slice(r,n),this.values=this.values.slice(r*t,n*t)}return this}validate(){let t=!0;const e=this.getValueSize();e-Math.floor(e)!=0&&(console.error("THREE.KeyframeTrack: Invalid value size in track.",this),t=!1);const i=this.times,s=this.values,r=i.length;0===r&&(console.error("THREE.KeyframeTrack: Track is empty.",this),t=!1);let n=null;for(let e=0;e!==r;e++){const s=i[e];if("number"==typeof s&&isNaN(s)){console.error("THREE.KeyframeTrack: Time is not a valid number.",this,e,s),t=!1;break}if(null!==n&&n>s){console.error("THREE.KeyframeTrack: Out of order keys.",this,e,s,n),t=!1;break}n=s}if(void 0!==s&&Ul(s))for(let e=0,i=s.length;e!==i;++e){const i=s[e];if(isNaN(i)){console.error("THREE.KeyframeTrack: Value is not a valid number.",this,e,i),t=!1;break}}return t}optimize(){const t=this.times.slice(),e=this.values.slice(),i=this.getValueSize(),s=this.getInterpolation()===Pe,r=t.length-1;let n=1;for(let a=1;a0){t[n]=t[r];for(let t=r*i,s=n*i,a=0;a!==i;++a)e[s+a]=e[t+a];++n}return n!==t.length?(this.times=t.slice(0,n),this.values=e.slice(0,n*i)):(this.times=t,this.values=e),this}clone(){const t=this.times.slice(),e=this.values.slice(),i=new(0,this.constructor)(this.name,t,e);return i.createInterpolant=this.createInterpolant,i}}$l.prototype.ValueTypeName="",$l.prototype.TimeBufferType=Float32Array,$l.prototype.ValueBufferType=Float32Array,$l.prototype.DefaultInterpolation=Ee;class Ql extends $l{constructor(t,e,i){super(t,e,i)}}Ql.prototype.ValueTypeName="bool",Ql.prototype.ValueBufferType=Array,Ql.prototype.DefaultInterpolation=Re,Ql.prototype.InterpolantFactoryMethodLinear=void 0,Ql.prototype.InterpolantFactoryMethodSmooth=void 0;class Kl extends $l{constructor(t,e,i,s){super(t,e,i,s)}}Kl.prototype.ValueTypeName="color";class tc extends $l{constructor(t,e,i,s){super(t,e,i,s)}}tc.prototype.ValueTypeName="number";class ec extends Xl{constructor(t,e,i,s){super(t,e,i,s)}interpolate_(t,e,i,s){const r=this.resultBuffer,n=this.sampleValues,a=this.valueSize,o=(i-e)/(s-e);let h=t*a;for(let t=h+a;h!==t;h+=4)Is.slerpFlat(r,0,n,h-a,n,h,o);return r}}class ic extends $l{constructor(t,e,i,s){super(t,e,i,s)}InterpolantFactoryMethodLinear(t){return new ec(this.times,this.values,this.getValueSize(),t)}}ic.prototype.ValueTypeName="quaternion",ic.prototype.InterpolantFactoryMethodSmooth=void 0;class sc extends $l{constructor(t,e,i){super(t,e,i)}}sc.prototype.ValueTypeName="string",sc.prototype.ValueBufferType=Array,sc.prototype.DefaultInterpolation=Re,sc.prototype.InterpolantFactoryMethodLinear=void 0,sc.prototype.InterpolantFactoryMethodSmooth=void 0;class rc extends $l{constructor(t,e,i,s){super(t,e,i,s)}}rc.prototype.ValueTypeName="vector";class nc{constructor(t="",e=-1,i=[],s=2500){this.name=t,this.tracks=i,this.duration=e,this.blendMode=s,this.uuid=Di(),this.duration<0&&this.resetDuration()}static parse(t){const e=[],i=t.tracks,s=1/(t.fps||1);for(let t=0,r=i.length;t!==r;++t)e.push(ac(i[t]).scale(s));const r=new this(t.name,t.duration,e,t.blendMode);return r.uuid=t.uuid,r}static toJSON(t){const e=[],i=t.tracks,s={name:t.name,duration:t.duration,tracks:e,uuid:t.uuid,blendMode:t.blendMode};for(let t=0,s=i.length;t!==s;++t)e.push($l.toJSON(i[t]));return s}static CreateFromMorphTargetSequence(t,e,i,s){const r=e.length,n=[];for(let t=0;t1){const t=n[1];let e=s[t];e||(s[t]=e=[]),e.push(i)}}const n=[];for(const t in s)n.push(this.CreateFromMorphTargetSequence(t,s[t],e,i));return n}static parseAnimation(t,e){if(console.warn("THREE.AnimationClip: parseAnimation() is deprecated and will be removed with r185"),!t)return console.error("THREE.AnimationClip: No animation in JSONLoader data."),null;const i=function(t,e,i,s,r){if(0!==i.length){const n=[],a=[];ql(i,n,a,s),0!==n.length&&r.push(new t(e,n,a))}},s=[],r=t.name||"default",n=t.fps||30,a=t.blendMode;let o=t.length||-1;const h=t.hierarchy||[];for(let t=0;t{e&&e(r),this.manager.itemEnd(t)}),0),r;if(void 0!==uc[t])return void uc[t].push({onLoad:e,onProgress:i,onError:s});uc[t]=[],uc[t].push({onLoad:e,onProgress:i,onError:s});const n=new Request(t,{headers:new Headers(this.requestHeader),credentials:this.withCredentials?"include":"same-origin"}),a=this.mimeType,o=this.responseType;fetch(n).then((e=>{if(200===e.status||0===e.status){if(0===e.status&&console.warn("THREE.FileLoader: HTTP Status 0 received."),"undefined"==typeof ReadableStream||void 0===e.body||void 0===e.body.getReader)return e;const i=uc[t],s=e.body.getReader(),r=e.headers.get("X-File-Size")||e.headers.get("Content-Length"),n=r?parseInt(r):0,a=0!==n;let o=0;const h=new ReadableStream({start(t){!function e(){s.read().then((({done:s,value:r})=>{if(s)t.close();else{o+=r.byteLength;const s=new ProgressEvent("progress",{lengthComputable:a,loaded:o,total:n});for(let t=0,e=i.length;t{t.error(e)}))}()}});return new Response(h)}throw new dc(`fetch for "${e.url}" responded with ${e.status}: ${e.statusText}`,e)})).then((t=>{switch(o){case"arraybuffer":return t.arrayBuffer();case"blob":return t.blob();case"document":return t.text().then((t=>(new DOMParser).parseFromString(t,a)));case"json":return t.json();default:if(""===a)return t.text();{const e=/charset="?([^;"\s]*)"?/i.exec(a),i=e&&e[1]?e[1].toLowerCase():void 0,s=new TextDecoder(i);return t.arrayBuffer().then((t=>s.decode(t)))}}})).then((e=>{oc.add(t,e);const i=uc[t];delete uc[t];for(let t=0,s=i.length;t{const i=uc[t];if(void 0===i)throw this.manager.itemError(t),e;delete uc[t];for(let t=0,s=i.length;t{this.manager.itemEnd(t)})),this.manager.itemStart(t)}setResponseType(t){return this.responseType=t,this}setMimeType(t){return this.mimeType=t,this}}class mc extends cc{constructor(t){super(t)}load(t,e,i,s){const r=this,n=new pc(this.manager);n.setPath(this.path),n.setRequestHeader(this.requestHeader),n.setWithCredentials(this.withCredentials),n.load(t,(function(i){try{e(r.parse(JSON.parse(i)))}catch(e){s?s(e):console.error(e),r.manager.itemError(t)}}),i,s)}parse(t){const e=[];for(let i=0;i0:s.vertexColors=t.vertexColors),void 0!==t.uniforms)for(const e in t.uniforms){const r=t.uniforms[e];switch(s.uniforms[e]={},r.type){case"t":s.uniforms[e].value=i(r.value);break;case"c":s.uniforms[e].value=(new Qr).setHex(r.value);break;case"v2":s.uniforms[e].value=(new Gi).fromArray(r.value);break;case"v3":s.uniforms[e].value=(new Bs).fromArray(r.value);break;case"v4":s.uniforms[e].value=(new Ms).fromArray(r.value);break;case"m3":s.uniforms[e].value=(new $i).fromArray(r.value);break;case"m4":s.uniforms[e].value=(new ar).fromArray(r.value);break;default:s.uniforms[e].value=r.value}}if(void 0!==t.defines&&(s.defines=t.defines),void 0!==t.vertexShader&&(s.vertexShader=t.vertexShader),void 0!==t.fragmentShader&&(s.fragmentShader=t.fragmentShader),void 0!==t.glslVersion&&(s.glslVersion=t.glslVersion),void 0!==t.extensions)for(const e in t.extensions)s.extensions[e]=t.extensions[e];if(void 0!==t.lights&&(s.lights=t.lights),void 0!==t.clipping&&(s.clipping=t.clipping),void 0!==t.size&&(s.size=t.size),void 0!==t.sizeAttenuation&&(s.sizeAttenuation=t.sizeAttenuation),void 0!==t.map&&(s.map=i(t.map)),void 0!==t.matcap&&(s.matcap=i(t.matcap)),void 0!==t.alphaMap&&(s.alphaMap=i(t.alphaMap)),void 0!==t.bumpMap&&(s.bumpMap=i(t.bumpMap)),void 0!==t.bumpScale&&(s.bumpScale=t.bumpScale),void 0!==t.normalMap&&(s.normalMap=i(t.normalMap)),void 0!==t.normalMapType&&(s.normalMapType=t.normalMapType),void 0!==t.normalScale){let e=t.normalScale;!1===Array.isArray(e)&&(e=[e,e]),s.normalScale=(new Gi).fromArray(e)}return void 0!==t.displacementMap&&(s.displacementMap=i(t.displacementMap)),void 0!==t.displacementScale&&(s.displacementScale=t.displacementScale),void 0!==t.displacementBias&&(s.displacementBias=t.displacementBias),void 0!==t.roughnessMap&&(s.roughnessMap=i(t.roughnessMap)),void 0!==t.metalnessMap&&(s.metalnessMap=i(t.metalnessMap)),void 0!==t.emissiveMap&&(s.emissiveMap=i(t.emissiveMap)),void 0!==t.emissiveIntensity&&(s.emissiveIntensity=t.emissiveIntensity),void 0!==t.specularMap&&(s.specularMap=i(t.specularMap)),void 0!==t.specularIntensityMap&&(s.specularIntensityMap=i(t.specularIntensityMap)),void 0!==t.specularColorMap&&(s.specularColorMap=i(t.specularColorMap)),void 0!==t.envMap&&(s.envMap=i(t.envMap)),void 0!==t.envMapRotation&&s.envMapRotation.fromArray(t.envMapRotation),void 0!==t.envMapIntensity&&(s.envMapIntensity=t.envMapIntensity),void 0!==t.reflectivity&&(s.reflectivity=t.reflectivity),void 0!==t.refractionRatio&&(s.refractionRatio=t.refractionRatio),void 0!==t.lightMap&&(s.lightMap=i(t.lightMap)),void 0!==t.lightMapIntensity&&(s.lightMapIntensity=t.lightMapIntensity),void 0!==t.aoMap&&(s.aoMap=i(t.aoMap)),void 0!==t.aoMapIntensity&&(s.aoMapIntensity=t.aoMapIntensity),void 0!==t.gradientMap&&(s.gradientMap=i(t.gradientMap)),void 0!==t.clearcoatMap&&(s.clearcoatMap=i(t.clearcoatMap)),void 0!==t.clearcoatRoughnessMap&&(s.clearcoatRoughnessMap=i(t.clearcoatRoughnessMap)),void 0!==t.clearcoatNormalMap&&(s.clearcoatNormalMap=i(t.clearcoatNormalMap)),void 0!==t.clearcoatNormalScale&&(s.clearcoatNormalScale=(new Gi).fromArray(t.clearcoatNormalScale)),void 0!==t.iridescenceMap&&(s.iridescenceMap=i(t.iridescenceMap)),void 0!==t.iridescenceThicknessMap&&(s.iridescenceThicknessMap=i(t.iridescenceThicknessMap)),void 0!==t.transmissionMap&&(s.transmissionMap=i(t.transmissionMap)),void 0!==t.thicknessMap&&(s.thicknessMap=i(t.thicknessMap)),void 0!==t.anisotropyMap&&(s.anisotropyMap=i(t.anisotropyMap)),void 0!==t.sheenColorMap&&(s.sheenColorMap=i(t.sheenColorMap)),void 0!==t.sheenRoughnessMap&&(s.sheenRoughnessMap=i(t.sheenRoughnessMap)),s}setTextures(t){return this.textures=t,this}createMaterialFromType(t){return jc.createMaterialFromType(t)}static createMaterialFromType(t){return new{ShadowMaterial:Il,SpriteMaterial:pa,RawShaderMaterial:Bl,ShaderMaterial:Yn,PointsMaterial:Uo,MeshPhysicalMaterial:Rl,MeshStandardMaterial:kl,MeshPhongMaterial:El,MeshToonMaterial:Pl,MeshNormalMaterial:Ol,MeshLambertMaterial:Nl,MeshDepthMaterial:Fl,MeshDistanceMaterial:Ll,MeshBasicMaterial:sn,MeshMatcapMaterial:Vl,LineDashedMaterial:jl,LineBasicMaterial:Co,Material:en}[t]}}class Wc{static extractUrlBase(t){const e=t.lastIndexOf("/");return-1===e?"./":t.slice(0,e+1)}static resolveURL(t,e){return"string"!=typeof t||""===t?"":(/^https?:\/\//i.test(e)&&/^\//.test(t)&&(e=e.replace(/(^https?:\/\/[^\/]+).*/i,"$1")),/^(https?:)?\/\//i.test(t)||/^data:.*,.*$/i.test(t)||/^blob:.*$/i.test(t)?t:e+t)}}class Uc extends In{constructor(){super(),this.isInstancedBufferGeometry=!0,this.type="InstancedBufferGeometry",this.instanceCount=1/0}copy(t){return super.copy(t),this.instanceCount=t.instanceCount,this}toJSON(){const t=super.toJSON();return t.instanceCount=this.instanceCount,t.isInstancedBufferGeometry=!0,t}}class Dc extends cc{constructor(t){super(t)}load(t,e,i,s){const r=this,n=new pc(r.manager);n.setPath(r.path),n.setRequestHeader(r.requestHeader),n.setWithCredentials(r.withCredentials),n.load(t,(function(i){try{e(r.parse(JSON.parse(i)))}catch(e){s?s(e):console.error(e),r.manager.itemError(t)}}),i,s)}parse(t){const e={},i={};function s(t,s){if(void 0!==e[s])return e[s];const r=t.interleavedBuffers[s],n=function(t,e){if(void 0!==i[e])return i[e];const s=t.arrayBuffers,r=s[e],n=new Uint32Array(r).buffer;return i[e]=n,n}(t,r.buffer),a=es(r.type,n),o=new ca(a,r.stride);return o.uuid=r.uuid,e[s]=o,o}const r=t.isInstancedBufferGeometry?new Uc:new In,n=t.data.index;if(void 0!==n){const t=es(n.type,n.array);r.setIndex(new dn(t,1))}const a=t.data.attributes;for(const e in a){const i=a[e];let n;if(i.isInterleavedBufferAttribute){const e=s(t.data,i.data);n=new da(e,i.itemSize,i.offset,i.normalized)}else{const t=es(i.type,i.array);n=new(i.isInstancedBufferAttribute?Xa:dn)(t,i.itemSize,i.normalized)}void 0!==i.name&&(n.name=i.name),void 0!==i.usage&&n.setUsage(i.usage),r.setAttribute(e,n)}const o=t.data.morphAttributes;if(o)for(const e in o){const i=o[e],n=[];for(let e=0,r=i.length;e0){const i=new hc(e);r=new gc(i),r.setCrossOrigin(this.crossOrigin);for(let e=0,i=t.length;e0){s=new gc(this.manager),s.setCrossOrigin(this.crossOrigin);for(let e=0,s=t.length;e{const e=new Es;e.min.fromArray(t.boxMin),e.max.fromArray(t.boxMax);const i=new $s;return i.radius=t.sphereRadius,i.center.fromArray(t.sphereCenter),{boxInitialized:t.boxInitialized,box:e,sphereInitialized:t.sphereInitialized,sphere:i}})),n._maxInstanceCount=t.maxInstanceCount,n._maxVertexCount=t.maxVertexCount,n._maxIndexCount=t.maxIndexCount,n._geometryInitialized=t.geometryInitialized,n._geometryCount=t.geometryCount,n._matricesTexture=c(t.matricesTexture.uuid),void 0!==t.colorsTexture&&(n._colorsTexture=c(t.colorsTexture.uuid));break;case"LOD":n=new ka;break;case"Line":n=new No(h(t.geometry),l(t.material));break;case"LineLoop":n=new Wo(h(t.geometry),l(t.material));break;case"LineSegments":n=new jo(h(t.geometry),l(t.material));break;case"PointCloud":case"Points":n=new Xo(h(t.geometry),l(t.material));break;case"Sprite":n=new za(l(t.material));break;case"Group":n=new ra;break;case"Bone":n=new Ua;break;default:n=new Er}if(n.uuid=t.uuid,void 0!==t.name&&(n.name=t.name),void 0!==t.matrix?(n.matrix.fromArray(t.matrix),void 0!==t.matrixAutoUpdate&&(n.matrixAutoUpdate=t.matrixAutoUpdate),n.matrixAutoUpdate&&n.matrix.decompose(n.position,n.quaternion,n.scale)):(void 0!==t.position&&n.position.fromArray(t.position),void 0!==t.rotation&&n.rotation.fromArray(t.rotation),void 0!==t.quaternion&&n.quaternion.fromArray(t.quaternion),void 0!==t.scale&&n.scale.fromArray(t.scale)),void 0!==t.up&&n.up.fromArray(t.up),void 0!==t.castShadow&&(n.castShadow=t.castShadow),void 0!==t.receiveShadow&&(n.receiveShadow=t.receiveShadow),t.shadow&&(void 0!==t.shadow.intensity&&(n.shadow.intensity=t.shadow.intensity),void 0!==t.shadow.bias&&(n.shadow.bias=t.shadow.bias),void 0!==t.shadow.normalBias&&(n.shadow.normalBias=t.shadow.normalBias),void 0!==t.shadow.radius&&(n.shadow.radius=t.shadow.radius),void 0!==t.shadow.mapSize&&n.shadow.mapSize.fromArray(t.shadow.mapSize),void 0!==t.shadow.camera&&(n.shadow.camera=this.parseObject(t.shadow.camera))),void 0!==t.visible&&(n.visible=t.visible),void 0!==t.frustumCulled&&(n.frustumCulled=t.frustumCulled),void 0!==t.renderOrder&&(n.renderOrder=t.renderOrder),void 0!==t.userData&&(n.userData=t.userData),void 0!==t.layers&&(n.layers.mask=t.layers),void 0!==t.children){const a=t.children;for(let t=0;t{e&&e(i),r.manager.itemEnd(t)})).catch((t=>{s&&s(t)})):(setTimeout((function(){e&&e(n),r.manager.itemEnd(t)}),0),n);const a={};a.credentials="anonymous"===this.crossOrigin?"same-origin":"include",a.headers=this.requestHeader;const o=fetch(t,a).then((function(t){return t.blob()})).then((function(t){return createImageBitmap(t,Object.assign(r.options,{colorSpaceConversion:"none"}))})).then((function(i){return oc.add(t,i),e&&e(i),r.manager.itemEnd(t),i})).catch((function(e){s&&s(e),oc.remove(t),r.manager.itemError(t),r.manager.itemEnd(t)}));oc.add(t,o),r.manager.itemStart(t)}}let Zc;class Gc{static getContext(){return void 0===Zc&&(Zc=new(window.AudioContext||window.webkitAudioContext)),Zc}static setContext(t){Zc=t}}class $c extends cc{constructor(t){super(t)}load(t,e,i,s){const r=this,n=new pc(this.manager);function a(e){s?s(e):console.error(e),r.manager.itemError(t)}n.setResponseType("arraybuffer"),n.setPath(this.path),n.setRequestHeader(this.requestHeader),n.setWithCredentials(this.withCredentials),n.load(t,(function(t){try{const i=t.slice(0);Gc.getContext().decodeAudioData(i,(function(t){e(t)})).catch(a)}catch(t){a(t)}}),i,s)}}const Qc=new ar,Kc=new ar,tu=new ar;class eu{constructor(){this.type="StereoCamera",this.aspect=1,this.eyeSep=.064,this.cameraL=new Kn,this.cameraL.layers.enable(1),this.cameraL.matrixAutoUpdate=!1,this.cameraR=new Kn,this.cameraR.layers.enable(2),this.cameraR.matrixAutoUpdate=!1,this._cache={focus:null,fov:null,aspect:null,near:null,far:null,zoom:null,eyeSep:null}}update(t){const e=this._cache;if(e.focus!==t.focus||e.fov!==t.fov||e.aspect!==t.aspect*this.aspect||e.near!==t.near||e.far!==t.far||e.zoom!==t.zoom||e.eyeSep!==this.eyeSep){e.focus=t.focus,e.fov=t.fov,e.aspect=t.aspect*this.aspect,e.near=t.near,e.far=t.far,e.zoom=t.zoom,e.eyeSep=this.eyeSep,tu.copy(t.projectionMatrix);const i=e.eyeSep/2,s=i*e.near/e.focus,r=e.near*Math.tan(Wi*e.fov*.5)/e.zoom;let n,a;Kc.elements[12]=-i,Qc.elements[12]=i,n=-r*e.aspect+s,a=r*e.aspect+s,tu.elements[0]=2*e.near/(a-n),tu.elements[8]=(a+n)/(a-n),this.cameraL.projectionMatrix.copy(tu),n=-r*e.aspect-s,a=r*e.aspect-s,tu.elements[0]=2*e.near/(a-n),tu.elements[8]=(a+n)/(a-n),this.cameraR.projectionMatrix.copy(tu)}this.cameraL.matrixWorld.copy(t.matrixWorld).multiply(Kc),this.cameraR.matrixWorld.copy(t.matrixWorld).multiply(Qc)}}class iu extends Kn{constructor(t=[]){super(),this.isArrayCamera=!0,this.cameras=t,this.index=0}}class su{constructor(t=!0){this.autoStart=t,this.startTime=0,this.oldTime=0,this.elapsedTime=0,this.running=!1}start(){this.startTime=ru(),this.oldTime=this.startTime,this.elapsedTime=0,this.running=!0}stop(){this.getElapsedTime(),this.running=!1,this.autoStart=!1}getElapsedTime(){return this.getDelta(),this.elapsedTime}getDelta(){let t=0;if(this.autoStart&&!this.running)return this.start(),0;if(this.running){const e=ru();t=(e-this.oldTime)/1e3,this.oldTime=e,this.elapsedTime+=t}return t}}function ru(){return performance.now()}const nu=new Bs,au=new Is,ou=new Bs,hu=new Bs;class lu extends Er{constructor(){super(),this.type="AudioListener",this.context=Gc.getContext(),this.gain=this.context.createGain(),this.gain.connect(this.context.destination),this.filter=null,this.timeDelta=0,this._clock=new su}getInput(){return this.gain}removeFilter(){return null!==this.filter&&(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination),this.gain.connect(this.context.destination),this.filter=null),this}getFilter(){return this.filter}setFilter(t){return null!==this.filter?(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination)):this.gain.disconnect(this.context.destination),this.filter=t,this.gain.connect(this.filter),this.filter.connect(this.context.destination),this}getMasterVolume(){return this.gain.gain.value}setMasterVolume(t){return this.gain.gain.setTargetAtTime(t,this.context.currentTime,.01),this}updateMatrixWorld(t){super.updateMatrixWorld(t);const e=this.context.listener,i=this.up;if(this.timeDelta=this._clock.getDelta(),this.matrixWorld.decompose(nu,au,ou),hu.set(0,0,-1).applyQuaternion(au),e.positionX){const t=this.context.currentTime+this.timeDelta;e.positionX.linearRampToValueAtTime(nu.x,t),e.positionY.linearRampToValueAtTime(nu.y,t),e.positionZ.linearRampToValueAtTime(nu.z,t),e.forwardX.linearRampToValueAtTime(hu.x,t),e.forwardY.linearRampToValueAtTime(hu.y,t),e.forwardZ.linearRampToValueAtTime(hu.z,t),e.upX.linearRampToValueAtTime(i.x,t),e.upY.linearRampToValueAtTime(i.y,t),e.upZ.linearRampToValueAtTime(i.z,t)}else e.setPosition(nu.x,nu.y,nu.z),e.setOrientation(hu.x,hu.y,hu.z,i.x,i.y,i.z)}}class cu extends Er{constructor(t){super(),this.type="Audio",this.listener=t,this.context=t.context,this.gain=this.context.createGain(),this.gain.connect(t.getInput()),this.autoplay=!1,this.buffer=null,this.detune=0,this.loop=!1,this.loopStart=0,this.loopEnd=0,this.offset=0,this.duration=void 0,this.playbackRate=1,this.isPlaying=!1,this.hasPlaybackControl=!0,this.source=null,this.sourceType="empty",this._startedAt=0,this._progress=0,this._connected=!1,this.filters=[]}getOutput(){return this.gain}setNodeSource(t){return this.hasPlaybackControl=!1,this.sourceType="audioNode",this.source=t,this.connect(),this}setMediaElementSource(t){return this.hasPlaybackControl=!1,this.sourceType="mediaNode",this.source=this.context.createMediaElementSource(t),this.connect(),this}setMediaStreamSource(t){return this.hasPlaybackControl=!1,this.sourceType="mediaStreamNode",this.source=this.context.createMediaStreamSource(t),this.connect(),this}setBuffer(t){return this.buffer=t,this.sourceType="buffer",this.autoplay&&this.play(),this}play(t=0){if(!0===this.isPlaying)return void console.warn("THREE.Audio: Audio is already playing.");if(!1===this.hasPlaybackControl)return void console.warn("THREE.Audio: this Audio has no playback control.");this._startedAt=this.context.currentTime+t;const e=this.context.createBufferSource();return e.buffer=this.buffer,e.loop=this.loop,e.loopStart=this.loopStart,e.loopEnd=this.loopEnd,e.onended=this.onEnded.bind(this),e.start(this._startedAt,this._progress+this.offset,this.duration),this.isPlaying=!0,this.source=e,this.setDetune(this.detune),this.setPlaybackRate(this.playbackRate),this.connect()}pause(){if(!1!==this.hasPlaybackControl)return!0===this.isPlaying&&(this._progress+=Math.max(this.context.currentTime-this._startedAt,0)*this.playbackRate,!0===this.loop&&(this._progress=this._progress%(this.duration||this.buffer.duration)),this.source.stop(),this.source.onended=null,this.isPlaying=!1),this;console.warn("THREE.Audio: this Audio has no playback control.")}stop(t=0){if(!1!==this.hasPlaybackControl)return this._progress=0,null!==this.source&&(this.source.stop(this.context.currentTime+t),this.source.onended=null),this.isPlaying=!1,this;console.warn("THREE.Audio: this Audio has no playback control.")}connect(){if(this.filters.length>0){this.source.connect(this.filters[0]);for(let t=1,e=this.filters.length;t0){this.source.disconnect(this.filters[0]);for(let t=1,e=this.filters.length;t0&&this._mixBufferRegionAdditive(i,s,this._addIndex*e,1,e);for(let t=e,r=e+e;t!==r;++t)if(i[t]!==i[t+e]){a.setValue(i,s);break}}saveOriginalState(){const t=this.binding,e=this.buffer,i=this.valueSize,s=i*this._origIndex;t.getValue(e,s);for(let t=i,r=s;t!==r;++t)e[t]=e[s+t%i];this._setIdentity(),this.cumulativeWeight=0,this.cumulativeWeightAdditive=0}restoreOriginalState(){const t=3*this.valueSize;this.binding.setValue(this.buffer,t)}_setAdditiveIdentityNumeric(){const t=this._addIndex*this.valueSize,e=t+this.valueSize;for(let i=t;i=.5)for(let s=0;s!==r;++s)t[e+s]=t[i+s]}_slerp(t,e,i,s){Is.slerpFlat(t,e,t,e,t,i,s)}_slerpAdditive(t,e,i,s,r){const n=this._workIndex*r;Is.multiplyQuaternionsFlat(t,n,t,e,t,i),Is.slerpFlat(t,e,t,e,t,n,s)}_lerp(t,e,i,s,r){const n=1-s;for(let a=0;a!==r;++a){const r=e+a;t[r]=t[r]*n+t[i+a]*s}}_lerpAdditive(t,e,i,s,r){for(let n=0;n!==r;++n){const r=e+n;t[r]=t[r]+t[i+n]*s}}}const xu="\\[\\]\\.:\\/",bu=new RegExp("["+xu+"]","g"),vu="[^"+xu+"]",wu="[^"+xu.replace("\\.","")+"]",Mu=new RegExp("^"+/((?:WC+[\/:])*)/.source.replace("WC",vu)+/(WCOD+)?/.source.replace("WCOD",wu)+/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC",vu)+/\.(WC+)(?:\[(.+)\])?/.source.replace("WC",vu)+"$"),Su=["material","materials","bones","map"];class _u{constructor(t,e,i){this.path=e,this.parsedPath=i||_u.parseTrackName(e),this.node=_u.findNode(t,this.parsedPath.nodeName),this.rootNode=t,this.getValue=this._getValue_unbound,this.setValue=this._setValue_unbound}static create(t,e,i){return t&&t.isAnimationObjectGroup?new _u.Composite(t,e,i):new _u(t,e,i)}static sanitizeNodeName(t){return t.replace(/\s/g,"_").replace(bu,"")}static parseTrackName(t){const e=Mu.exec(t);if(null===e)throw new Error("PropertyBinding: Cannot parse trackName: "+t);const i={nodeName:e[2],objectName:e[3],objectIndex:e[4],propertyName:e[5],propertyIndex:e[6]},s=i.nodeName&&i.nodeName.lastIndexOf(".");if(void 0!==s&&-1!==s){const t=i.nodeName.substring(s+1);-1!==Su.indexOf(t)&&(i.nodeName=i.nodeName.substring(0,s),i.objectName=t)}if(null===i.propertyName||0===i.propertyName.length)throw new Error("PropertyBinding: can not parse propertyName from trackName: "+t);return i}static findNode(t,e){if(void 0===e||""===e||"."===e||-1===e||e===t.name||e===t.uuid)return t;if(t.skeleton){const i=t.skeleton.getBoneByName(e);if(void 0!==i)return i}if(t.children){const i=function(t){for(let s=0;s=r){const n=r++,l=t[n];e[l.uuid]=h,t[h]=l,e[o]=n,t[n]=a;for(let t=0,e=s;t!==e;++t){const e=i[t],s=e[n],r=e[h];e[h]=s,e[n]=r}}}this.nCachedObjects_=r}uncache(){const t=this._objects,e=this._indicesByUUID,i=this._bindings,s=i.length;let r=this.nCachedObjects_,n=t.length;for(let a=0,o=arguments.length;a!==o;++a){const o=arguments[a].uuid,h=e[o];if(void 0!==h)if(delete e[o],h0&&(e[a.uuid]=h),t[h]=a,t.pop();for(let t=0,e=s;t!==e;++t){const e=i[t];e[h]=e[r],e.pop()}}}this.nCachedObjects_=r}subscribe_(t,e){const i=this._bindingsIndicesByPath;let s=i[t];const r=this._bindings;if(void 0!==s)return r[s];const n=this._paths,a=this._parsedPaths,o=this._objects,h=o.length,l=this.nCachedObjects_,c=new Array(h);s=r.length,i[t]=s,n.push(t),a.push(e),r.push(c);for(let i=l,s=o.length;i!==s;++i){const s=o[i];c[i]=new _u(s,t,e)}return c}unsubscribe_(t){const e=this._bindingsIndicesByPath,i=e[t];if(void 0!==i){const s=this._paths,r=this._parsedPaths,n=this._bindings,a=n.length-1,o=n[a];e[t[a]]=i,n[i]=o,n.pop(),r[i]=r[a],r.pop(),s[i]=s[a],s.pop()}}}class Tu{constructor(t,e,i=null,s=e.blendMode){this._mixer=t,this._clip=e,this._localRoot=i,this.blendMode=s;const r=e.tracks,n=r.length,a=new Array(n),o={endingStart:Oe,endingEnd:Oe};for(let t=0;t!==n;++t){const e=r[t].createInterpolant(null);a[t]=e,e.settings=o}this._interpolantSettings=o,this._interpolants=a,this._propertyBindings=new Array(n),this._cacheIndex=null,this._byClipCacheIndex=null,this._timeScaleInterpolant=null,this._weightInterpolant=null,this.loop=2201,this._loopCount=-1,this._startTime=null,this.time=0,this.timeScale=1,this._effectiveTimeScale=1,this.weight=1,this._effectiveWeight=1,this.repetitions=1/0,this.paused=!1,this.enabled=!0,this.clampWhenFinished=!1,this.zeroSlopeAtStart=!0,this.zeroSlopeAtEnd=!0}play(){return this._mixer._activateAction(this),this}stop(){return this._mixer._deactivateAction(this),this.reset()}reset(){return this.paused=!1,this.enabled=!0,this.time=0,this._loopCount=-1,this._startTime=null,this.stopFading().stopWarping()}isRunning(){return this.enabled&&!this.paused&&0!==this.timeScale&&null===this._startTime&&this._mixer._isActiveAction(this)}isScheduled(){return this._mixer._isActiveAction(this)}startAt(t){return this._startTime=t,this}setLoop(t,e){return this.loop=t,this.repetitions=e,this}setEffectiveWeight(t){return this.weight=t,this._effectiveWeight=this.enabled?t:0,this.stopFading()}getEffectiveWeight(){return this._effectiveWeight}fadeIn(t){return this._scheduleFading(t,0,1)}fadeOut(t){return this._scheduleFading(t,1,0)}crossFadeFrom(t,e,i=!1){if(t.fadeOut(e),this.fadeIn(e),!0===i){const i=this._clip.duration,s=t._clip.duration,r=s/i,n=i/s;t.warp(1,r,e),this.warp(n,1,e)}return this}crossFadeTo(t,e,i=!1){return t.crossFadeFrom(this,e,i)}stopFading(){const t=this._weightInterpolant;return null!==t&&(this._weightInterpolant=null,this._mixer._takeBackControlInterpolant(t)),this}setEffectiveTimeScale(t){return this.timeScale=t,this._effectiveTimeScale=this.paused?0:t,this.stopWarping()}getEffectiveTimeScale(){return this._effectiveTimeScale}setDuration(t){return this.timeScale=this._clip.duration/t,this.stopWarping()}syncWith(t){return this.time=t.time,this.timeScale=t.timeScale,this.stopWarping()}halt(t){return this.warp(this._effectiveTimeScale,0,t)}warp(t,e,i){const s=this._mixer,r=s.time,n=this.timeScale;let a=this._timeScaleInterpolant;null===a&&(a=s._lendControlInterpolant(),this._timeScaleInterpolant=a);const o=a.parameterPositions,h=a.sampleValues;return o[0]=r,o[1]=r+i,h[0]=t/n,h[1]=e/n,this}stopWarping(){const t=this._timeScaleInterpolant;return null!==t&&(this._timeScaleInterpolant=null,this._mixer._takeBackControlInterpolant(t)),this}getMixer(){return this._mixer}getClip(){return this._clip}getRoot(){return this._localRoot||this._mixer._root}_update(t,e,i,s){if(!this.enabled)return void this._updateWeight(t);const r=this._startTime;if(null!==r){const s=(t-r)*i;s<0||0===i?e=0:(this._startTime=null,e=i*s)}e*=this._updateTimeScale(t);const n=this._updateTime(e),a=this._updateWeight(t);if(a>0){const t=this._interpolants,e=this._propertyBindings;if(this.blendMode===Ve)for(let i=0,s=t.length;i!==s;++i)t[i].evaluate(n),e[i].accumulateAdditive(a);else for(let i=0,r=t.length;i!==r;++i)t[i].evaluate(n),e[i].accumulate(s,a)}}_updateWeight(t){let e=0;if(this.enabled){e=this.weight;const i=this._weightInterpolant;if(null!==i){const s=i.evaluate(t)[0];e*=s,t>i.parameterPositions[1]&&(this.stopFading(),0===s&&(this.enabled=!1))}}return this._effectiveWeight=e,e}_updateTimeScale(t){let e=0;if(!this.paused){e=this.timeScale;const i=this._timeScaleInterpolant;if(null!==i){e*=i.evaluate(t)[0],t>i.parameterPositions[1]&&(this.stopWarping(),0===e?this.paused=!0:this.timeScale=e)}}return this._effectiveTimeScale=e,e}_updateTime(t){const e=this._clip.duration,i=this.loop;let s=this.time+t,r=this._loopCount;const n=2202===i;if(0===t)return-1===r||!n||1&~r?s:e-s;if(2200===i){-1===r&&(this._loopCount=0,this._setEndings(!0,!0,!1));t:{if(s>=e)s=e;else{if(!(s<0)){this.time=s;break t}s=0}this.clampWhenFinished?this.paused=!0:this.enabled=!1,this.time=s,this._mixer.dispatchEvent({type:"finished",action:this,direction:t<0?-1:1})}}else{if(-1===r&&(t>=0?(r=0,this._setEndings(!0,0===this.repetitions,n)):this._setEndings(0===this.repetitions,!0,n)),s>=e||s<0){const i=Math.floor(s/e);s-=e*i,r+=Math.abs(i);const a=this.repetitions-r;if(a<=0)this.clampWhenFinished?this.paused=!0:this.enabled=!1,s=t>0?e:0,this.time=s,this._mixer.dispatchEvent({type:"finished",action:this,direction:t>0?1:-1});else{if(1===a){const e=t<0;this._setEndings(e,!e,n)}else this._setEndings(!1,!1,n);this._loopCount=r,this.time=s,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:i})}}else this.time=s;if(n&&!(1&~r))return e-s}return s}_setEndings(t,e,i){const s=this._interpolantSettings;i?(s.endingStart=Ne,s.endingEnd=Ne):(s.endingStart=t?this.zeroSlopeAtStart?Ne:Oe:Fe,s.endingEnd=e?this.zeroSlopeAtEnd?Ne:Oe:Fe)}_scheduleFading(t,e,i){const s=this._mixer,r=s.time;let n=this._weightInterpolant;null===n&&(n=s._lendControlInterpolant(),this._weightInterpolant=n);const a=n.parameterPositions,o=n.sampleValues;return a[0]=r,o[0]=e,a[1]=r+t,o[1]=i,this}}const zu=new Float32Array(1);class Cu extends Li{constructor(t){super(),this._root=t,this._initMemoryManager(),this._accuIndex=0,this.time=0,this.timeScale=1}_bindAction(t,e){const i=t._localRoot||this._root,s=t._clip.tracks,r=s.length,n=t._propertyBindings,a=t._interpolants,o=i.uuid,h=this._bindingsByRootAndName;let l=h[o];void 0===l&&(l={},h[o]=l);for(let t=0;t!==r;++t){const r=s[t],h=r.name;let c=l[h];if(void 0!==c)++c.referenceCount,n[t]=c;else{if(c=n[t],void 0!==c){null===c._cacheIndex&&(++c.referenceCount,this._addInactiveBinding(c,o,h));continue}const s=e&&e._propertyBindings[t].binding.parsedPath;c=new fu(_u.create(i,h,s),r.ValueTypeName,r.getValueSize()),++c.referenceCount,this._addInactiveBinding(c,o,h),n[t]=c}a[t].resultBuffer=c.buffer}}_activateAction(t){if(!this._isActiveAction(t)){if(null===t._cacheIndex){const e=(t._localRoot||this._root).uuid,i=t._clip.uuid,s=this._actionsByClip[i];this._bindAction(t,s&&s.knownActions[0]),this._addInactiveAction(t,i,e)}const e=t._propertyBindings;for(let t=0,i=e.length;t!==i;++t){const i=e[t];0==i.useCount++&&(this._lendBinding(i),i.saveOriginalState())}this._lendAction(t)}}_deactivateAction(t){if(this._isActiveAction(t)){const e=t._propertyBindings;for(let t=0,i=e.length;t!==i;++t){const i=e[t];0==--i.useCount&&(i.restoreOriginalState(),this._takeBackBinding(i))}this._takeBackAction(t)}}_initMemoryManager(){this._actions=[],this._nActiveActions=0,this._actionsByClip={},this._bindings=[],this._nActiveBindings=0,this._bindingsByRootAndName={},this._controlInterpolants=[],this._nActiveControlInterpolants=0;const t=this;this.stats={actions:{get total(){return t._actions.length},get inUse(){return t._nActiveActions}},bindings:{get total(){return t._bindings.length},get inUse(){return t._nActiveBindings}},controlInterpolants:{get total(){return t._controlInterpolants.length},get inUse(){return t._nActiveControlInterpolants}}}}_isActiveAction(t){const e=t._cacheIndex;return null!==e&&e=0;--e)t[e].stop();return this}update(t){t*=this.timeScale;const e=this._actions,i=this._nActiveActions,s=this.time+=t,r=Math.sign(t),n=this._accuIndex^=1;for(let a=0;a!==i;++a){e[a]._update(s,t,r,n)}const a=this._bindings,o=this._nActiveBindings;for(let t=0;t!==o;++t)a[t].apply(n);return this}setTime(t){this.time=0;for(let t=0;t=this.min.x&&t.x<=this.max.x&&t.y>=this.min.y&&t.y<=this.max.y}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y}getParameter(t,e){return e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y))}intersectsBox(t){return t.max.x>=this.min.x&&t.min.x<=this.max.x&&t.max.y>=this.min.y&&t.min.y<=this.max.y}clampPoint(t,e){return e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return this.clampPoint(t,Du).distanceTo(t)}intersect(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}}const qu=new Bs,Ju=new Bs;class Xu{constructor(t=new Bs,e=new Bs){this.start=t,this.end=e}set(t,e){return this.start.copy(t),this.end.copy(e),this}copy(t){return this.start.copy(t.start),this.end.copy(t.end),this}getCenter(t){return t.addVectors(this.start,this.end).multiplyScalar(.5)}delta(t){return t.subVectors(this.end,this.start)}distanceSq(){return this.start.distanceToSquared(this.end)}distance(){return this.start.distanceTo(this.end)}at(t,e){return this.delta(e).multiplyScalar(t).add(this.start)}closestPointToPointParameter(t,e){qu.subVectors(t,this.start),Ju.subVectors(this.end,this.start);const i=Ju.dot(Ju);let s=Ju.dot(qu)/i;return e&&(s=Hi(s,0,1)),s}closestPointToPoint(t,e,i){const s=this.closestPointToPointParameter(t,e);return this.delta(i).multiplyScalar(s).add(this.start)}applyMatrix4(t){return this.start.applyMatrix4(t),this.end.applyMatrix4(t),this}equals(t){return t.start.equals(this.start)&&t.end.equals(this.end)}clone(){return(new this.constructor).copy(this)}}const Yu=new Bs;class Zu extends Er{constructor(t,e){super(),this.light=t,this.matrixAutoUpdate=!1,this.color=e,this.type="SpotLightHelper";const i=new In,s=[0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,-1,0,1,0,0,0,0,1,1,0,0,0,0,-1,1];for(let t=0,e=1,i=32;t1)for(let i=0;i.99999)this.quaternion.set(0,0,0,1);else if(t.y<-.99999)this.quaternion.set(1,0,0,0);else{vd.set(t.z,0,-t.x).normalize();const e=Math.acos(t.y);this.quaternion.setFromAxisAngle(vd,e)}}setLength(t,e=.2*t,i=.2*e){this.line.scale.set(1,Math.max(1e-4,t-e),1),this.line.updateMatrix(),this.cone.scale.set(i,e,i),this.cone.position.y=t,this.cone.updateMatrix()}setColor(t){this.line.material.color.set(t),this.cone.material.color.set(t)}copy(t){return super.copy(t,!1),this.line.copy(t.line),this.cone.copy(t.cone),this}dispose(){this.line.geometry.dispose(),this.line.material.dispose(),this.cone.geometry.dispose(),this.cone.material.dispose()}}class _d extends jo{constructor(t=1){const e=[0,0,0,t,0,0,0,0,0,0,t,0,0,0,0,0,0,t],i=new In;i.setAttribute("position",new wn(e,3)),i.setAttribute("color",new wn([1,0,0,1,.6,0,0,1,0,.6,1,0,0,0,1,0,.6,1],3));super(i,new Co({vertexColors:!0,toneMapped:!1})),this.type="AxesHelper"}setColors(t,e,i){const s=new Qr,r=this.geometry.attributes.color.array;return s.set(t),s.toArray(r,0),s.toArray(r,3),s.set(e),s.toArray(r,6),s.toArray(r,9),s.set(i),s.toArray(r,12),s.toArray(r,15),this.geometry.attributes.color.needsUpdate=!0,this}dispose(){this.geometry.dispose(),this.material.dispose()}}class Ad{constructor(){this.type="ShapePath",this.color=new Qr,this.subPaths=[],this.currentPath=null}moveTo(t,e){return this.currentPath=new _h,this.subPaths.push(this.currentPath),this.currentPath.moveTo(t,e),this}lineTo(t,e){return this.currentPath.lineTo(t,e),this}quadraticCurveTo(t,e,i,s){return this.currentPath.quadraticCurveTo(t,e,i,s),this}bezierCurveTo(t,e,i,s,r,n){return this.currentPath.bezierCurveTo(t,e,i,s,r,n),this}splineThru(t){return this.currentPath.splineThru(t),this}toShapes(t){function e(t,e){const i=e.length;let s=!1;for(let r=i-1,n=0;nNumber.EPSILON){if(h<0&&(i=e[n],o=-o,a=e[r],h=-h),t.ya.y)continue;if(t.y===i.y){if(t.x===i.x)return!0}else{const e=h*(t.x-i.x)-o*(t.y-i.y);if(0===e)return!0;if(e<0)continue;s=!s}}else{if(t.y!==i.y)continue;if(a.x<=t.x&&t.x<=i.x||i.x<=t.x&&t.x<=a.x)return!0}}return s}const i=ul.isClockWise,s=this.subPaths;if(0===s.length)return[];let r,n,a;const o=[];if(1===s.length)return n=s[0],a=new Fh,a.curves=n.curves,o.push(a),o;let h=!i(s[0].getPoints());h=t?!h:h;const l=[],c=[];let u,d,p=[],m=0;c[m]=void 0,p[m]=[];for(let e=0,a=s.length;e1){let t=!1,i=0;for(let t=0,e=c.length;t0&&!1===t&&(p=l)}for(let t=0,e=c.length;te?(t.repeat.x=1,t.repeat.y=i/e,t.offset.x=0,t.offset.y=(1-t.repeat.y)/2):(t.repeat.x=e/i,t.repeat.y=1,t.offset.x=(1-t.repeat.x)/2,t.offset.y=0),t}(t,e)}static cover(t,e){return function(t,e){const i=t.image&&t.image.width?t.image.width/t.image.height:1;return i>e?(t.repeat.x=e/i,t.repeat.y=1,t.offset.x=(1-t.repeat.x)/2,t.offset.y=0):(t.repeat.x=1,t.repeat.y=i/e,t.offset.x=0,t.offset.y=(1-t.repeat.y)/2),t}(t,e)}static fill(t){return function(t){return t.repeat.x=1,t.repeat.y=1,t.offset.x=0,t.offset.y=0,t}(t)}static getByteLength(t,e,i,s){return zd(t,e,i,s)}}"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("register",{detail:{revision:t}})),"undefined"!=typeof window&&(window.__THREE__?console.warn("WARNING: Multiple instances of Three.js being imported."):window.__THREE__=t);export{et as ACESFilmicToneMapping,v as AddEquation,G as AddOperation,Ve as AdditiveAnimationBlendMode,g as AdditiveBlending,st as AgXToneMapping,Lt as AlphaFormat,Si as AlwaysCompare,W as AlwaysDepth,yi as AlwaysStencilFunc,Nc as AmbientLight,Tu as AnimationAction,nc as AnimationClip,mc as AnimationLoader,Cu as AnimationMixer,Au as AnimationObjectGroup,Jl as AnimationUtils,nh as ArcCurve,iu as ArrayCamera,Sd as ArrowHelper,nt as AttachedBindMode,cu as Audio,gu as AudioAnalyser,Gc as AudioContext,lu as AudioListener,$c as AudioLoader,_d as AxesHelper,d as BackSide,De as BasicDepthPacking,o as BasicShadowMap,zo as BatchedMesh,Ua as Bone,Ql as BooleanKeyframeTrack,Hu as Box2,Es as Box3,xd as Box3Helper,Dn as BoxGeometry,fd as BoxHelper,dn as BufferAttribute,In as BufferGeometry,Dc as BufferGeometryLoader,zt as ByteType,oc as Cache,Zn as Camera,md as CameraHelper,eh as CanvasTexture,Th as CapsuleGeometry,uh as CatmullRomCurve3,tt as CineonToneMapping,zh as CircleGeometry,mt as ClampToEdgeWrapping,su as Clock,Qr as Color,Kl as ColorKeyframeTrack,ds as ColorManagement,Ko as CompressedArrayTexture,th as CompressedCubeTexture,Qo as CompressedTexture,yc as CompressedTextureLoader,Ih as ConeGeometry,L as ConstantAlphaFactor,N as ConstantColorFactor,Td as Controls,ea as CubeCamera,ht as CubeReflectionMapping,lt as CubeRefractionMapping,ia as CubeTexture,fc as CubeTextureLoader,dt as CubeUVReflectionMapping,yh as CubicBezierCurve,gh as CubicBezierCurve3,Yl as CubicInterpolant,r as CullFaceBack,n as CullFaceFront,a as CullFaceFrontBack,s as CullFaceNone,sh as Curve,Sh as CurvePath,b as CustomBlending,it as CustomToneMapping,Ch as CylinderGeometry,Wu as Cylindrical,zs as Data3DTexture,As as DataArrayTexture,Da as DataTexture,xc as DataTextureLoader,hn as DataUtils,ri as DecrementStencilOp,ai as DecrementWrapStencilOp,lc as DefaultLoadingManager,Dt as DepthFormat,Ht as DepthStencilFormat,ih as DepthTexture,at as DetachedBindMode,Oc as DirectionalLight,ud as DirectionalLightHelper,Gl as DiscreteInterpolant,kh as DodecahedronGeometry,p as DoubleSide,k as DstAlphaFactor,E as DstColorFactor,ki as DynamicCopyUsage,Ai as DynamicDrawUsage,Ci as DynamicReadUsage,Nh as EdgesGeometry,rh as EllipseCurve,xi as EqualCompare,H as EqualDepth,ci as EqualStencilFunc,ct as EquirectangularReflectionMapping,ut as EquirectangularRefractionMapping,gr as Euler,Li as EventDispatcher,ml as ExtrudeGeometry,pc as FileLoader,vn as Float16BufferAttribute,wn as Float32BufferAttribute,Rt as FloatType,ha as Fog,oa as FogExp2,$o as FramebufferTexture,u as FrontSide,ho as Frustum,Ou as GLBufferAttribute,Ei as GLSL1,Pi as GLSL3,vi as GreaterCompare,J as GreaterDepth,Mi as GreaterEqualCompare,q as GreaterEqualDepth,mi as GreaterEqualStencilFunc,di as GreaterStencilFunc,ad as GridHelper,ra as Group,Et as HalfFloatType,wc as HemisphereLight,nd as HemisphereLightHelper,gl as IcosahedronGeometry,Yc as ImageBitmapLoader,gc as ImageLoader,gs as ImageUtils,si as IncrementStencilOp,ni as IncrementWrapStencilOp,Xa as InstancedBufferAttribute,Uc as InstancedBufferGeometry,Pu as InstancedInterleavedBuffer,eo as InstancedMesh,gn as Int16BufferAttribute,xn as Int32BufferAttribute,pn as Int8BufferAttribute,Bt as IntType,ca as InterleavedBuffer,da as InterleavedBufferAttribute,Xl as Interpolant,Re as InterpolateDiscrete,Ee as InterpolateLinear,Pe as InterpolateSmooth,oi as InvertStencilOp,ei as KeepStencilOp,$l as KeyframeTrack,ka as LOD,Ah as LatheGeometry,fr as Layers,fi as LessCompare,U as LessDepth,bi as LessEqualCompare,D as LessEqualDepth,ui as LessEqualStencilFunc,li as LessStencilFunc,vc as Light,Vc as LightProbe,No as Line,Xu as Line3,Co as LineBasicMaterial,fh as LineCurve,xh as LineCurve3,jl as LineDashedMaterial,Wo as LineLoop,jo as LineSegments,wt as LinearFilter,Zl as LinearInterpolant,At as LinearMipMapLinearFilter,St as LinearMipMapNearestFilter,_t as LinearMipmapLinearFilter,Mt as LinearMipmapNearestFilter,$e as LinearSRGBColorSpace,Q as LinearToneMapping,Qe as LinearTransfer,cc as Loader,Wc as LoaderUtils,hc as LoadingManager,Ie as LoopOnce,ke as LoopPingPong,Be as LoopRepeat,Ut as LuminanceAlphaFormat,Wt as LuminanceFormat,e as MOUSE,en as Material,jc as MaterialLoader,Zi as MathUtils,Uu as Matrix2,$i as Matrix3,ar as Matrix4,_ as MaxEquation,Wn as Mesh,sn as MeshBasicMaterial,Fl as MeshDepthMaterial,Ll as MeshDistanceMaterial,Nl as MeshLambertMaterial,Vl as MeshMatcapMaterial,Ol as MeshNormalMaterial,El as MeshPhongMaterial,Rl as MeshPhysicalMaterial,kl as MeshStandardMaterial,Pl as MeshToonMaterial,S as MinEquation,yt as MirroredRepeatWrapping,Z as MixOperation,x as MultiplyBlending,Y as MultiplyOperation,gt as NearestFilter,vt as NearestMipMapLinearFilter,xt as NearestMipMapNearestFilter,bt as NearestMipmapLinearFilter,ft as NearestMipmapNearestFilter,rt as NeutralToneMapping,gi as NeverCompare,j as NeverDepth,hi as NeverStencilFunc,m as NoBlending,Ze as NoColorSpace,$ as NoToneMapping,Le as NormalAnimationBlendMode,y as NormalBlending,wi as NotEqualCompare,X as NotEqualDepth,pi as NotEqualStencilFunc,tc as NumberKeyframeTrack,Er as Object3D,Hc as ObjectLoader,Ye as ObjectSpaceNormalMap,fl as OctahedronGeometry,T as OneFactor,V as OneMinusConstantAlphaFactor,F as OneMinusConstantColorFactor,R as OneMinusDstAlphaFactor,P as OneMinusDstColorFactor,B as OneMinusSrcAlphaFactor,C as OneMinusSrcColorFactor,Ec as OrthographicCamera,h as PCFShadowMap,l as PCFSoftShadowMap,_h as Path,Kn as PerspectiveCamera,no as Plane,xl as PlaneGeometry,bd as PlaneHelper,Rc as PointLight,ed as PointLightHelper,Xo as Points,Uo as PointsMaterial,od as PolarGridHelper,Bh as PolyhedronGeometry,yu as PositionalAudio,_u as PropertyBinding,fu as PropertyMixer,bh as QuadraticBezierCurve,vh as QuadraticBezierCurve3,Is as Quaternion,ic as QuaternionKeyframeTrack,ec as QuaternionLinearInterpolant,Ui as RAD2DEG,ze as RED_GREEN_RGTC2_Format,Ae as RED_RGTC1_Format,t as REVISION,He as RGBADepthPacking,jt as RGBAFormat,Gt as RGBAIntegerFormat,be as RGBA_ASTC_10x10_Format,ge as RGBA_ASTC_10x5_Format,fe as RGBA_ASTC_10x6_Format,xe as RGBA_ASTC_10x8_Format,ve as RGBA_ASTC_12x10_Format,we as RGBA_ASTC_12x12_Format,he as RGBA_ASTC_4x4_Format,le as RGBA_ASTC_5x4_Format,ce as RGBA_ASTC_5x5_Format,ue as RGBA_ASTC_6x5_Format,de as RGBA_ASTC_6x6_Format,pe as RGBA_ASTC_8x5_Format,me as RGBA_ASTC_8x6_Format,ye as RGBA_ASTC_8x8_Format,Me as RGBA_BPTC_Format,oe as RGBA_ETC2_EAC_Format,re as RGBA_PVRTC_2BPPV1_Format,se as RGBA_PVRTC_4BPPV1_Format,Qt as RGBA_S3TC_DXT1_Format,Kt as RGBA_S3TC_DXT3_Format,te as RGBA_S3TC_DXT5_Format,qe as RGBDepthPacking,Vt as RGBFormat,Zt as RGBIntegerFormat,Se as RGB_BPTC_SIGNED_Format,_e as RGB_BPTC_UNSIGNED_Format,ne as RGB_ETC1_Format,ae as RGB_ETC2_Format,ie as RGB_PVRTC_2BPPV1_Format,ee as RGB_PVRTC_4BPPV1_Format,$t as RGB_S3TC_DXT1_Format,Je as RGDepthPacking,Xt as RGFormat,Yt as RGIntegerFormat,Bl as RawShaderMaterial,nr as Ray,Fu as Raycaster,Fc as RectAreaLight,qt as RedFormat,Jt as RedIntegerFormat,K as ReinhardToneMapping,Ss as RenderTarget,Iu as RenderTarget3D,Bu as RenderTargetArray,pt as RepeatWrapping,ii as ReplaceStencilOp,M as ReverseSubtractEquation,bl as RingGeometry,Ce as SIGNED_RED_GREEN_RGTC2_Format,Te as SIGNED_RED_RGTC1_Format,Ge as SRGBColorSpace,Ke as SRGBTransfer,la as Scene,Yn as ShaderMaterial,Il as ShadowMaterial,Fh as Shape,vl as ShapeGeometry,Ad as ShapePath,ul as ShapeUtils,Ct as ShortType,Ja as Skeleton,Ku as SkeletonHelper,Wa as SkinnedMesh,xs as Source,$s as Sphere,wl as SphereGeometry,ju as Spherical,Lc as SphericalHarmonics3,wh as SplineCurve,zc as SpotLight,Zu as SpotLightHelper,za as Sprite,pa as SpriteMaterial,I as SrcAlphaFactor,O as SrcAlphaSaturateFactor,z as SrcColorFactor,Bi as StaticCopyUsage,_i as StaticDrawUsage,zi as StaticReadUsage,eu as StereoCamera,Ri as StreamCopyUsage,Ti as StreamDrawUsage,Ii as StreamReadUsage,sc as StringKeyframeTrack,w as SubtractEquation,f as SubtractiveBlending,i as TOUCH,Xe as TangentSpaceNormalMap,Ml as TetrahedronGeometry,ws as Texture,bc as TextureLoader,Cd as TextureUtils,Fi as TimestampQuery,Sl as TorusGeometry,_l as TorusKnotGeometry,Xr as Triangle,Ue as TriangleFanDrawMode,We as TriangleStripDrawMode,je as TrianglesDrawMode,Al as TubeGeometry,ot as UVMapping,fn as Uint16BufferAttribute,bn as Uint32BufferAttribute,mn as Uint8BufferAttribute,yn as Uint8ClampedBufferAttribute,ku as Uniform,Eu as UniformsGroup,Xn as UniformsUtils,Tt as UnsignedByteType,Nt as UnsignedInt248Type,Ft as UnsignedInt5999Type,kt as UnsignedIntType,Pt as UnsignedShort4444Type,Ot as UnsignedShort5551Type,It as UnsignedShortType,c as VSMShadowMap,Gi as Vector2,Bs as Vector3,Ms as Vector4,rc as VectorKeyframeTrack,Go as VideoFrameTexture,Zo as VideoTexture,Cs as WebGL3DRenderTarget,Ts as WebGLArrayRenderTarget,Oi as WebGLCoordinateSystem,sa as WebGLCubeRenderTarget,_s as WebGLRenderTarget,Ni as WebGPUCoordinateSystem,aa as WebXRController,Tl as WireframeGeometry,Fe as WrapAroundEnding,Oe as ZeroCurvatureEnding,A as ZeroFactor,Ne as ZeroSlopeEnding,ti as ZeroStencilOp,Ki as arrayNeedsUint32,Hn as cloneUniforms,ss as createCanvasElement,is as createElementNS,zd as getByteLength,Jn as getUnlitUniformColorSpace,qn as mergeUniforms,as as probeAsync,os as toNormalizedProjectionMatrix,hs as toReversedProjectionMatrix,ns as warnOnce}; +const t="176dev",e={LEFT:0,MIDDLE:1,RIGHT:2,ROTATE:0,DOLLY:1,PAN:2},i={ROTATE:0,PAN:1,DOLLY_PAN:2,DOLLY_ROTATE:3},s=0,r=1,n=2,a=3,o=0,h=1,l=2,c=3,u=0,d=1,p=2,m=0,y=1,g=2,f=3,x=4,b=5,v=100,w=101,M=102,S=103,_=104,A=200,T=201,z=202,C=203,I=204,B=205,k=206,R=207,E=208,P=209,O=210,N=211,F=212,L=213,V=214,j=0,W=1,U=2,D=3,H=4,q=5,J=6,X=7,Y=0,Z=1,G=2,$=0,Q=1,K=2,tt=3,et=4,it=5,st=6,rt=7,nt="attached",at="detached",ot=300,ht=301,lt=302,ct=303,ut=304,dt=306,pt=1e3,mt=1001,yt=1002,gt=1003,ft=1004,xt=1004,bt=1005,vt=1005,wt=1006,Mt=1007,St=1007,_t=1008,At=1008,Tt=1009,zt=1010,Ct=1011,It=1012,Bt=1013,kt=1014,Rt=1015,Et=1016,Pt=1017,Ot=1018,Nt=1020,Ft=35902,Lt=1021,Vt=1022,jt=1023,Wt=1024,Ut=1025,Dt=1026,Ht=1027,qt=1028,Jt=1029,Xt=1030,Yt=1031,Zt=1032,Gt=1033,$t=33776,Qt=33777,Kt=33778,te=33779,ee=35840,ie=35841,se=35842,re=35843,ne=36196,ae=37492,oe=37496,he=37808,le=37809,ce=37810,ue=37811,de=37812,pe=37813,me=37814,ye=37815,ge=37816,fe=37817,xe=37818,be=37819,ve=37820,we=37821,Me=36492,Se=36494,_e=36495,Ae=36283,Te=36284,ze=36285,Ce=36286,Ie=2200,Be=2201,ke=2202,Re=2300,Ee=2301,Pe=2302,Oe=2400,Ne=2401,Fe=2402,Le=2500,Ve=2501,je=0,We=1,Ue=2,De=3200,He=3201,qe=3202,Je=3203,Xe=0,Ye=1,Ze="",Ge="srgb",$e="srgb-linear",Qe="linear",Ke="srgb",ti=0,ei=7680,ii=7681,si=7682,ri=7683,ni=34055,ai=34056,oi=5386,hi=512,li=513,ci=514,ui=515,di=516,pi=517,mi=518,yi=519,gi=512,fi=513,xi=514,bi=515,vi=516,wi=517,Mi=518,Si=519,_i=35044,Ai=35048,Ti=35040,zi=35045,Ci=35049,Ii=35041,Bi=35046,ki=35050,Ri=35042,Ei="100",Pi="300 es",Oi=2e3,Ni=2001,Fi={COMPUTE:"compute",RENDER:"render"};class Li{addEventListener(t,e){void 0===this._listeners&&(this._listeners={});const i=this._listeners;void 0===i[t]&&(i[t]=[]),-1===i[t].indexOf(e)&&i[t].push(e)}hasEventListener(t,e){const i=this._listeners;return void 0!==i&&(void 0!==i[t]&&-1!==i[t].indexOf(e))}removeEventListener(t,e){const i=this._listeners;if(void 0===i)return;const s=i[t];if(void 0!==s){const t=s.indexOf(e);-1!==t&&s.splice(t,1)}}dispatchEvent(t){const e=this._listeners;if(void 0===e)return;const i=e[t.type];if(void 0!==i){t.target=this;const e=i.slice(0);for(let i=0,s=e.length;i>8&255]+Vi[t>>16&255]+Vi[t>>24&255]+"-"+Vi[255&e]+Vi[e>>8&255]+"-"+Vi[e>>16&15|64]+Vi[e>>24&255]+"-"+Vi[63&i|128]+Vi[i>>8&255]+"-"+Vi[i>>16&255]+Vi[i>>24&255]+Vi[255&s]+Vi[s>>8&255]+Vi[s>>16&255]+Vi[s>>24&255]).toLowerCase()}function Hi(t,e,i){return Math.max(e,Math.min(i,t))}function qi(t,e){return(t%e+e)%e}function Ji(t,e,i){return(1-i)*t+i*e}function Xi(t,e){switch(e.constructor){case Float32Array:return t;case Uint32Array:return t/4294967295;case Uint16Array:return t/65535;case Uint8Array:return t/255;case Int32Array:return Math.max(t/2147483647,-1);case Int16Array:return Math.max(t/32767,-1);case Int8Array:return Math.max(t/127,-1);default:throw new Error("Invalid component type.")}}function Yi(t,e){switch(e.constructor){case Float32Array:return t;case Uint32Array:return Math.round(4294967295*t);case Uint16Array:return Math.round(65535*t);case Uint8Array:return Math.round(255*t);case Int32Array:return Math.round(2147483647*t);case Int16Array:return Math.round(32767*t);case Int8Array:return Math.round(127*t);default:throw new Error("Invalid component type.")}}const Zi={DEG2RAD:Wi,RAD2DEG:Ui,generateUUID:Di,clamp:Hi,euclideanModulo:qi,mapLinear:function(t,e,i,s,r){return s+(t-e)*(r-s)/(i-e)},inverseLerp:function(t,e,i){return t!==e?(i-t)/(e-t):0},lerp:Ji,damp:function(t,e,i,s){return Ji(t,e,1-Math.exp(-i*s))},pingpong:function(t,e=1){return e-Math.abs(qi(t,2*e)-e)},smoothstep:function(t,e,i){return t<=e?0:t>=i?1:(t=(t-e)/(i-e))*t*(3-2*t)},smootherstep:function(t,e,i){return t<=e?0:t>=i?1:(t=(t-e)/(i-e))*t*t*(t*(6*t-15)+10)},randInt:function(t,e){return t+Math.floor(Math.random()*(e-t+1))},randFloat:function(t,e){return t+Math.random()*(e-t)},randFloatSpread:function(t){return t*(.5-Math.random())},seededRandom:function(t){void 0!==t&&(ji=t);let e=ji+=1831565813;return e=Math.imul(e^e>>>15,1|e),e^=e+Math.imul(e^e>>>7,61|e),((e^e>>>14)>>>0)/4294967296},degToRad:function(t){return t*Wi},radToDeg:function(t){return t*Ui},isPowerOfTwo:function(t){return!(t&t-1)&&0!==t},ceilPowerOfTwo:function(t){return Math.pow(2,Math.ceil(Math.log(t)/Math.LN2))},floorPowerOfTwo:function(t){return Math.pow(2,Math.floor(Math.log(t)/Math.LN2))},setQuaternionFromProperEuler:function(t,e,i,s,r){const n=Math.cos,a=Math.sin,o=n(i/2),h=a(i/2),l=n((e+s)/2),c=a((e+s)/2),u=n((e-s)/2),d=a((e-s)/2),p=n((s-e)/2),m=a((s-e)/2);switch(r){case"XYX":t.set(o*c,h*u,h*d,o*l);break;case"YZY":t.set(h*d,o*c,h*u,o*l);break;case"ZXZ":t.set(h*u,h*d,o*c,o*l);break;case"XZX":t.set(o*c,h*m,h*p,o*l);break;case"YXY":t.set(h*p,o*c,h*m,o*l);break;case"ZYZ":t.set(h*m,h*p,o*c,o*l);break;default:console.warn("THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: "+r)}},normalize:Yi,denormalize:Xi};class Gi{constructor(t=0,e=0){Gi.prototype.isVector2=!0,this.x=t,this.y=e}get width(){return this.x}set width(t){this.x=t}get height(){return this.y}set height(t){this.y=t}set(t,e){return this.x=t,this.y=e,this}setScalar(t){return this.x=t,this.y=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y)}copy(t){return this.x=t.x,this.y=t.y,this}add(t){return this.x+=t.x,this.y+=t.y,this}addScalar(t){return this.x+=t,this.y+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this}subScalar(t){return this.x-=t,this.y-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this}multiply(t){return this.x*=t.x,this.y*=t.y,this}multiplyScalar(t){return this.x*=t,this.y*=t,this}divide(t){return this.x/=t.x,this.y/=t.y,this}divideScalar(t){return this.multiplyScalar(1/t)}applyMatrix3(t){const e=this.x,i=this.y,s=t.elements;return this.x=s[0]*e+s[3]*i+s[6],this.y=s[1]*e+s[4]*i+s[7],this}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this}clamp(t,e){return this.x=Hi(this.x,t.x,e.x),this.y=Hi(this.y,t.y,e.y),this}clampScalar(t,e){return this.x=Hi(this.x,t,e),this.y=Hi(this.y,t,e),this}clampLength(t,e){const i=this.length();return this.divideScalar(i||1).multiplyScalar(Hi(i,t,e))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(t){return this.x*t.x+this.y*t.y}cross(t){return this.x*t.y-this.y*t.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(0===e)return Math.PI/2;const i=this.dot(t)/e;return Math.acos(Hi(i,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,i=this.y-t.y;return e*e+i*i}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this}lerpVectors(t,e,i){return this.x=t.x+(e.x-t.x)*i,this.y=t.y+(e.y-t.y)*i,this}equals(t){return t.x===this.x&&t.y===this.y}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this}rotateAround(t,e){const i=Math.cos(e),s=Math.sin(e),r=this.x-t.x,n=this.y-t.y;return this.x=r*i-n*s+t.x,this.y=r*s+n*i+t.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}}class $i{constructor(t,e,i,s,r,n,a,o,h){$i.prototype.isMatrix3=!0,this.elements=[1,0,0,0,1,0,0,0,1],void 0!==t&&this.set(t,e,i,s,r,n,a,o,h)}set(t,e,i,s,r,n,a,o,h){const l=this.elements;return l[0]=t,l[1]=s,l[2]=a,l[3]=e,l[4]=r,l[5]=o,l[6]=i,l[7]=n,l[8]=h,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(t){const e=this.elements,i=t.elements;return e[0]=i[0],e[1]=i[1],e[2]=i[2],e[3]=i[3],e[4]=i[4],e[5]=i[5],e[6]=i[6],e[7]=i[7],e[8]=i[8],this}extractBasis(t,e,i){return t.setFromMatrix3Column(this,0),e.setFromMatrix3Column(this,1),i.setFromMatrix3Column(this,2),this}setFromMatrix4(t){const e=t.elements;return this.set(e[0],e[4],e[8],e[1],e[5],e[9],e[2],e[6],e[10]),this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const i=t.elements,s=e.elements,r=this.elements,n=i[0],a=i[3],o=i[6],h=i[1],l=i[4],c=i[7],u=i[2],d=i[5],p=i[8],m=s[0],y=s[3],g=s[6],f=s[1],x=s[4],b=s[7],v=s[2],w=s[5],M=s[8];return r[0]=n*m+a*f+o*v,r[3]=n*y+a*x+o*w,r[6]=n*g+a*b+o*M,r[1]=h*m+l*f+c*v,r[4]=h*y+l*x+c*w,r[7]=h*g+l*b+c*M,r[2]=u*m+d*f+p*v,r[5]=u*y+d*x+p*w,r[8]=u*g+d*b+p*M,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[3]*=t,e[6]*=t,e[1]*=t,e[4]*=t,e[7]*=t,e[2]*=t,e[5]*=t,e[8]*=t,this}determinant(){const t=this.elements,e=t[0],i=t[1],s=t[2],r=t[3],n=t[4],a=t[5],o=t[6],h=t[7],l=t[8];return e*n*l-e*a*h-i*r*l+i*a*o+s*r*h-s*n*o}invert(){const t=this.elements,e=t[0],i=t[1],s=t[2],r=t[3],n=t[4],a=t[5],o=t[6],h=t[7],l=t[8],c=l*n-a*h,u=a*o-l*r,d=h*r-n*o,p=e*c+i*u+s*d;if(0===p)return this.set(0,0,0,0,0,0,0,0,0);const m=1/p;return t[0]=c*m,t[1]=(s*h-l*i)*m,t[2]=(a*i-s*n)*m,t[3]=u*m,t[4]=(l*e-s*o)*m,t[5]=(s*r-a*e)*m,t[6]=d*m,t[7]=(i*o-h*e)*m,t[8]=(n*e-i*r)*m,this}transpose(){let t;const e=this.elements;return t=e[1],e[1]=e[3],e[3]=t,t=e[2],e[2]=e[6],e[6]=t,t=e[5],e[5]=e[7],e[7]=t,this}getNormalMatrix(t){return this.setFromMatrix4(t).invert().transpose()}transposeIntoArray(t){const e=this.elements;return t[0]=e[0],t[1]=e[3],t[2]=e[6],t[3]=e[1],t[4]=e[4],t[5]=e[7],t[6]=e[2],t[7]=e[5],t[8]=e[8],this}setUvTransform(t,e,i,s,r,n,a){const o=Math.cos(r),h=Math.sin(r);return this.set(i*o,i*h,-i*(o*n+h*a)+n+t,-s*h,s*o,-s*(-h*n+o*a)+a+e,0,0,1),this}scale(t,e){return this.premultiply(Qi.makeScale(t,e)),this}rotate(t){return this.premultiply(Qi.makeRotation(-t)),this}translate(t,e){return this.premultiply(Qi.makeTranslation(t,e)),this}makeTranslation(t,e){return t.isVector2?this.set(1,0,t.x,0,1,t.y,0,0,1):this.set(1,0,t,0,1,e,0,0,1),this}makeRotation(t){const e=Math.cos(t),i=Math.sin(t);return this.set(e,-i,0,i,e,0,0,0,1),this}makeScale(t,e){return this.set(t,0,0,0,e,0,0,0,1),this}equals(t){const e=this.elements,i=t.elements;for(let t=0;t<9;t++)if(e[t]!==i[t])return!1;return!0}fromArray(t,e=0){for(let i=0;i<9;i++)this.elements[i]=t[i+e];return this}toArray(t=[],e=0){const i=this.elements;return t[e]=i[0],t[e+1]=i[1],t[e+2]=i[2],t[e+3]=i[3],t[e+4]=i[4],t[e+5]=i[5],t[e+6]=i[6],t[e+7]=i[7],t[e+8]=i[8],t}clone(){return(new this.constructor).fromArray(this.elements)}}const Qi=new $i;function Ki(t){for(let e=t.length-1;e>=0;--e)if(t[e]>=65535)return!0;return!1}const ts={Int8Array:Int8Array,Uint8Array:Uint8Array,Uint8ClampedArray:Uint8ClampedArray,Int16Array:Int16Array,Uint16Array:Uint16Array,Int32Array:Int32Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array};function es(t,e){return new ts[t](e)}function is(t){return document.createElementNS("http://www.w3.org/1999/xhtml",t)}function ss(){const t=is("canvas");return t.style.display="block",t}const rs={};function ns(t){t in rs||(rs[t]=!0,console.warn(t))}function as(t,e,i){return new Promise((function(s,r){setTimeout((function n(){switch(t.clientWaitSync(e,t.SYNC_FLUSH_COMMANDS_BIT,0)){case t.WAIT_FAILED:r();break;case t.TIMEOUT_EXPIRED:setTimeout(n,i);break;default:s()}}),i)}))}function os(t){const e=t.elements;e[2]=.5*e[2]+.5*e[3],e[6]=.5*e[6]+.5*e[7],e[10]=.5*e[10]+.5*e[11],e[14]=.5*e[14]+.5*e[15]}function hs(t){const e=t.elements;-1===e[11]?(e[10]=-e[10]-1,e[14]=-e[14]):(e[10]=-e[10],e[14]=1-e[14])}const ls=(new $i).set(.4123908,.3575843,.1804808,.212639,.7151687,.0721923,.0193308,.1191948,.9505322),cs=(new $i).set(3.2409699,-1.5373832,-.4986108,-.9692436,1.8759675,.0415551,.0556301,-.203977,1.0569715);function us(){const t={enabled:!0,workingColorSpace:$e,spaces:{},convert:function(t,e,i){return!1!==this.enabled&&e!==i&&e&&i?(this.spaces[e].transfer===Ke&&(t.r=ps(t.r),t.g=ps(t.g),t.b=ps(t.b)),this.spaces[e].primaries!==this.spaces[i].primaries&&(t.applyMatrix3(this.spaces[e].toXYZ),t.applyMatrix3(this.spaces[i].fromXYZ)),this.spaces[i].transfer===Ke&&(t.r=ms(t.r),t.g=ms(t.g),t.b=ms(t.b)),t):t},fromWorkingColorSpace:function(t,e){return this.convert(t,this.workingColorSpace,e)},toWorkingColorSpace:function(t,e){return this.convert(t,e,this.workingColorSpace)},getPrimaries:function(t){return this.spaces[t].primaries},getTransfer:function(t){return""===t?Qe:this.spaces[t].transfer},getLuminanceCoefficients:function(t,e=this.workingColorSpace){return t.fromArray(this.spaces[e].luminanceCoefficients)},define:function(t){Object.assign(this.spaces,t)},_getMatrix:function(t,e,i){return t.copy(this.spaces[e].toXYZ).multiply(this.spaces[i].fromXYZ)},_getDrawingBufferColorSpace:function(t){return this.spaces[t].outputColorSpaceConfig.drawingBufferColorSpace},_getUnpackColorSpace:function(t=this.workingColorSpace){return this.spaces[t].workingColorSpaceConfig.unpackColorSpace}},e=[.64,.33,.3,.6,.15,.06],i=[.2126,.7152,.0722],s=[.3127,.329];return t.define({[$e]:{primaries:e,whitePoint:s,transfer:Qe,toXYZ:ls,fromXYZ:cs,luminanceCoefficients:i,workingColorSpaceConfig:{unpackColorSpace:Ge},outputColorSpaceConfig:{drawingBufferColorSpace:Ge}},[Ge]:{primaries:e,whitePoint:s,transfer:Ke,toXYZ:ls,fromXYZ:cs,luminanceCoefficients:i,outputColorSpaceConfig:{drawingBufferColorSpace:Ge}}}),t}const ds=us();function ps(t){return t<.04045?.0773993808*t:Math.pow(.9478672986*t+.0521327014,2.4)}function ms(t){return t<.0031308?12.92*t:1.055*Math.pow(t,.41666)-.055}let ys;class gs{static getDataURL(t,e="image/png"){if(/^data:/i.test(t.src))return t.src;if("undefined"==typeof HTMLCanvasElement)return t.src;let i;if(t instanceof HTMLCanvasElement)i=t;else{void 0===ys&&(ys=is("canvas")),ys.width=t.width,ys.height=t.height;const e=ys.getContext("2d");t instanceof ImageData?e.putImageData(t,0,0):e.drawImage(t,0,0,t.width,t.height),i=ys}return i.toDataURL(e)}static sRGBToLinear(t){if("undefined"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&t instanceof ImageBitmap){const e=is("canvas");e.width=t.width,e.height=t.height;const i=e.getContext("2d");i.drawImage(t,0,0,t.width,t.height);const s=i.getImageData(0,0,t.width,t.height),r=s.data;for(let t=0;t0&&(i.userData=this.userData),e||(t.textures[this.uuid]=i),i}dispose(){this.dispatchEvent({type:"dispose"})}transformUv(t){if(this.mapping!==ot)return t;if(t.applyMatrix3(this.matrix),t.x<0||t.x>1)switch(this.wrapS){case pt:t.x=t.x-Math.floor(t.x);break;case mt:t.x=t.x<0?0:1;break;case yt:1===Math.abs(Math.floor(t.x)%2)?t.x=Math.ceil(t.x)-t.x:t.x=t.x-Math.floor(t.x)}if(t.y<0||t.y>1)switch(this.wrapT){case pt:t.y=t.y-Math.floor(t.y);break;case mt:t.y=t.y<0?0:1;break;case yt:1===Math.abs(Math.floor(t.y)%2)?t.y=Math.ceil(t.y)-t.y:t.y=t.y-Math.floor(t.y)}return this.flipY&&(t.y=1-t.y),t}set needsUpdate(t){!0===t&&(this.version++,this.source.needsUpdate=!0)}set needsPMREMUpdate(t){!0===t&&this.pmremVersion++}}ws.DEFAULT_IMAGE=null,ws.DEFAULT_MAPPING=ot,ws.DEFAULT_ANISOTROPY=1;class Ms{constructor(t=0,e=0,i=0,s=1){Ms.prototype.isVector4=!0,this.x=t,this.y=e,this.z=i,this.w=s}get width(){return this.z}set width(t){this.z=t}get height(){return this.w}set height(t){this.w=t}set(t,e,i,s){return this.x=t,this.y=e,this.z=i,this.w=s,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this.w=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setW(t){return this.w=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;case 3:this.w=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this.w=void 0!==t.w?t.w:1,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this.w+=t.w,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this.w+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this.w=t.w+e.w,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this.w+=t.w*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this.w-=t.w,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this.w-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this.w=t.w-e.w,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this.w*=t.w,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this.w*=t,this}applyMatrix4(t){const e=this.x,i=this.y,s=this.z,r=this.w,n=t.elements;return this.x=n[0]*e+n[4]*i+n[8]*s+n[12]*r,this.y=n[1]*e+n[5]*i+n[9]*s+n[13]*r,this.z=n[2]*e+n[6]*i+n[10]*s+n[14]*r,this.w=n[3]*e+n[7]*i+n[11]*s+n[15]*r,this}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this.w/=t.w,this}divideScalar(t){return this.multiplyScalar(1/t)}setAxisAngleFromQuaternion(t){this.w=2*Math.acos(t.w);const e=Math.sqrt(1-t.w*t.w);return e<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=t.x/e,this.y=t.y/e,this.z=t.z/e),this}setAxisAngleFromRotationMatrix(t){let e,i,s,r;const n=.01,a=.1,o=t.elements,h=o[0],l=o[4],c=o[8],u=o[1],d=o[5],p=o[9],m=o[2],y=o[6],g=o[10];if(Math.abs(l-u)o&&t>f?tf?o=0?1:-1,s=1-e*e;if(s>Number.EPSILON){const r=Math.sqrt(s),n=Math.atan2(r,e*i);t=Math.sin(t*n)/r,a=Math.sin(a*n)/r}const r=a*i;if(o=o*t+u*r,h=h*t+d*r,l=l*t+p*r,c=c*t+m*r,t===1-a){const t=1/Math.sqrt(o*o+h*h+l*l+c*c);o*=t,h*=t,l*=t,c*=t}}t[e]=o,t[e+1]=h,t[e+2]=l,t[e+3]=c}static multiplyQuaternionsFlat(t,e,i,s,r,n){const a=i[s],o=i[s+1],h=i[s+2],l=i[s+3],c=r[n],u=r[n+1],d=r[n+2],p=r[n+3];return t[e]=a*p+l*c+o*d-h*u,t[e+1]=o*p+l*u+h*c-a*d,t[e+2]=h*p+l*d+a*u-o*c,t[e+3]=l*p-a*c-o*u-h*d,t}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get w(){return this._w}set w(t){this._w=t,this._onChangeCallback()}set(t,e,i,s){return this._x=t,this._y=e,this._z=i,this._w=s,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(t){return this._x=t.x,this._y=t.y,this._z=t.z,this._w=t.w,this._onChangeCallback(),this}setFromEuler(t,e=!0){const i=t._x,s=t._y,r=t._z,n=t._order,a=Math.cos,o=Math.sin,h=a(i/2),l=a(s/2),c=a(r/2),u=o(i/2),d=o(s/2),p=o(r/2);switch(n){case"XYZ":this._x=u*l*c+h*d*p,this._y=h*d*c-u*l*p,this._z=h*l*p+u*d*c,this._w=h*l*c-u*d*p;break;case"YXZ":this._x=u*l*c+h*d*p,this._y=h*d*c-u*l*p,this._z=h*l*p-u*d*c,this._w=h*l*c+u*d*p;break;case"ZXY":this._x=u*l*c-h*d*p,this._y=h*d*c+u*l*p,this._z=h*l*p+u*d*c,this._w=h*l*c-u*d*p;break;case"ZYX":this._x=u*l*c-h*d*p,this._y=h*d*c+u*l*p,this._z=h*l*p-u*d*c,this._w=h*l*c+u*d*p;break;case"YZX":this._x=u*l*c+h*d*p,this._y=h*d*c+u*l*p,this._z=h*l*p-u*d*c,this._w=h*l*c-u*d*p;break;case"XZY":this._x=u*l*c-h*d*p,this._y=h*d*c-u*l*p,this._z=h*l*p+u*d*c,this._w=h*l*c+u*d*p;break;default:console.warn("THREE.Quaternion: .setFromEuler() encountered an unknown order: "+n)}return!0===e&&this._onChangeCallback(),this}setFromAxisAngle(t,e){const i=e/2,s=Math.sin(i);return this._x=t.x*s,this._y=t.y*s,this._z=t.z*s,this._w=Math.cos(i),this._onChangeCallback(),this}setFromRotationMatrix(t){const e=t.elements,i=e[0],s=e[4],r=e[8],n=e[1],a=e[5],o=e[9],h=e[2],l=e[6],c=e[10],u=i+a+c;if(u>0){const t=.5/Math.sqrt(u+1);this._w=.25/t,this._x=(l-o)*t,this._y=(r-h)*t,this._z=(n-s)*t}else if(i>a&&i>c){const t=2*Math.sqrt(1+i-a-c);this._w=(l-o)/t,this._x=.25*t,this._y=(s+n)/t,this._z=(r+h)/t}else if(a>c){const t=2*Math.sqrt(1+a-i-c);this._w=(r-h)/t,this._x=(s+n)/t,this._y=.25*t,this._z=(o+l)/t}else{const t=2*Math.sqrt(1+c-i-a);this._w=(n-s)/t,this._x=(r+h)/t,this._y=(o+l)/t,this._z=.25*t}return this._onChangeCallback(),this}setFromUnitVectors(t,e){let i=t.dot(e)+1;return iMath.abs(t.z)?(this._x=-t.y,this._y=t.x,this._z=0,this._w=i):(this._x=0,this._y=-t.z,this._z=t.y,this._w=i)):(this._x=t.y*e.z-t.z*e.y,this._y=t.z*e.x-t.x*e.z,this._z=t.x*e.y-t.y*e.x,this._w=i),this.normalize()}angleTo(t){return 2*Math.acos(Math.abs(Hi(this.dot(t),-1,1)))}rotateTowards(t,e){const i=this.angleTo(t);if(0===i)return this;const s=Math.min(1,e/i);return this.slerp(t,s),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(t){return this._x*t._x+this._y*t._y+this._z*t._z+this._w*t._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let t=this.length();return 0===t?(this._x=0,this._y=0,this._z=0,this._w=1):(t=1/t,this._x=this._x*t,this._y=this._y*t,this._z=this._z*t,this._w=this._w*t),this._onChangeCallback(),this}multiply(t){return this.multiplyQuaternions(this,t)}premultiply(t){return this.multiplyQuaternions(t,this)}multiplyQuaternions(t,e){const i=t._x,s=t._y,r=t._z,n=t._w,a=e._x,o=e._y,h=e._z,l=e._w;return this._x=i*l+n*a+s*h-r*o,this._y=s*l+n*o+r*a-i*h,this._z=r*l+n*h+i*o-s*a,this._w=n*l-i*a-s*o-r*h,this._onChangeCallback(),this}slerp(t,e){if(0===e)return this;if(1===e)return this.copy(t);const i=this._x,s=this._y,r=this._z,n=this._w;let a=n*t._w+i*t._x+s*t._y+r*t._z;if(a<0?(this._w=-t._w,this._x=-t._x,this._y=-t._y,this._z=-t._z,a=-a):this.copy(t),a>=1)return this._w=n,this._x=i,this._y=s,this._z=r,this;const o=1-a*a;if(o<=Number.EPSILON){const t=1-e;return this._w=t*n+e*this._w,this._x=t*i+e*this._x,this._y=t*s+e*this._y,this._z=t*r+e*this._z,this.normalize(),this}const h=Math.sqrt(o),l=Math.atan2(h,a),c=Math.sin((1-e)*l)/h,u=Math.sin(e*l)/h;return this._w=n*c+this._w*u,this._x=i*c+this._x*u,this._y=s*c+this._y*u,this._z=r*c+this._z*u,this._onChangeCallback(),this}slerpQuaternions(t,e,i){return this.copy(t).slerp(e,i)}random(){const t=2*Math.PI*Math.random(),e=2*Math.PI*Math.random(),i=Math.random(),s=Math.sqrt(1-i),r=Math.sqrt(i);return this.set(s*Math.sin(t),s*Math.cos(t),r*Math.sin(e),r*Math.cos(e))}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._w===this._w}fromArray(t,e=0){return this._x=t[e],this._y=t[e+1],this._z=t[e+2],this._w=t[e+3],this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._w,t}fromBufferAttribute(t,e){return this._x=t.getX(e),this._y=t.getY(e),this._z=t.getZ(e),this._w=t.getW(e),this._onChangeCallback(),this}toJSON(){return this.toArray()}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}}class Bs{constructor(t=0,e=0,i=0){Bs.prototype.isVector3=!0,this.x=t,this.y=e,this.z=i}set(t,e,i){return void 0===i&&(i=this.z),this.x=t,this.y=e,this.z=i,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this}multiplyVectors(t,e){return this.x=t.x*e.x,this.y=t.y*e.y,this.z=t.z*e.z,this}applyEuler(t){return this.applyQuaternion(Rs.setFromEuler(t))}applyAxisAngle(t,e){return this.applyQuaternion(Rs.setFromAxisAngle(t,e))}applyMatrix3(t){const e=this.x,i=this.y,s=this.z,r=t.elements;return this.x=r[0]*e+r[3]*i+r[6]*s,this.y=r[1]*e+r[4]*i+r[7]*s,this.z=r[2]*e+r[5]*i+r[8]*s,this}applyNormalMatrix(t){return this.applyMatrix3(t).normalize()}applyMatrix4(t){const e=this.x,i=this.y,s=this.z,r=t.elements,n=1/(r[3]*e+r[7]*i+r[11]*s+r[15]);return this.x=(r[0]*e+r[4]*i+r[8]*s+r[12])*n,this.y=(r[1]*e+r[5]*i+r[9]*s+r[13])*n,this.z=(r[2]*e+r[6]*i+r[10]*s+r[14])*n,this}applyQuaternion(t){const e=this.x,i=this.y,s=this.z,r=t.x,n=t.y,a=t.z,o=t.w,h=2*(n*s-a*i),l=2*(a*e-r*s),c=2*(r*i-n*e);return this.x=e+o*h+n*c-a*l,this.y=i+o*l+a*h-r*c,this.z=s+o*c+r*l-n*h,this}project(t){return this.applyMatrix4(t.matrixWorldInverse).applyMatrix4(t.projectionMatrix)}unproject(t){return this.applyMatrix4(t.projectionMatrixInverse).applyMatrix4(t.matrixWorld)}transformDirection(t){const e=this.x,i=this.y,s=this.z,r=t.elements;return this.x=r[0]*e+r[4]*i+r[8]*s,this.y=r[1]*e+r[5]*i+r[9]*s,this.z=r[2]*e+r[6]*i+r[10]*s,this.normalize()}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this}divideScalar(t){return this.multiplyScalar(1/t)}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this}clamp(t,e){return this.x=Hi(this.x,t.x,e.x),this.y=Hi(this.y,t.y,e.y),this.z=Hi(this.z,t.z,e.z),this}clampScalar(t,e){return this.x=Hi(this.x,t,e),this.y=Hi(this.y,t,e),this.z=Hi(this.z,t,e),this}clampLength(t,e){const i=this.length();return this.divideScalar(i||1).multiplyScalar(Hi(i,t,e))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this}lerpVectors(t,e,i){return this.x=t.x+(e.x-t.x)*i,this.y=t.y+(e.y-t.y)*i,this.z=t.z+(e.z-t.z)*i,this}cross(t){return this.crossVectors(this,t)}crossVectors(t,e){const i=t.x,s=t.y,r=t.z,n=e.x,a=e.y,o=e.z;return this.x=s*o-r*a,this.y=r*n-i*o,this.z=i*a-s*n,this}projectOnVector(t){const e=t.lengthSq();if(0===e)return this.set(0,0,0);const i=t.dot(this)/e;return this.copy(t).multiplyScalar(i)}projectOnPlane(t){return ks.copy(this).projectOnVector(t),this.sub(ks)}reflect(t){return this.sub(ks.copy(t).multiplyScalar(2*this.dot(t)))}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(0===e)return Math.PI/2;const i=this.dot(t)/e;return Math.acos(Hi(i,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,i=this.y-t.y,s=this.z-t.z;return e*e+i*i+s*s}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)+Math.abs(this.z-t.z)}setFromSpherical(t){return this.setFromSphericalCoords(t.radius,t.phi,t.theta)}setFromSphericalCoords(t,e,i){const s=Math.sin(e)*t;return this.x=s*Math.sin(i),this.y=Math.cos(e)*t,this.z=s*Math.cos(i),this}setFromCylindrical(t){return this.setFromCylindricalCoords(t.radius,t.theta,t.y)}setFromCylindricalCoords(t,e,i){return this.x=t*Math.sin(e),this.y=i,this.z=t*Math.cos(e),this}setFromMatrixPosition(t){const e=t.elements;return this.x=e[12],this.y=e[13],this.z=e[14],this}setFromMatrixScale(t){const e=this.setFromMatrixColumn(t,0).length(),i=this.setFromMatrixColumn(t,1).length(),s=this.setFromMatrixColumn(t,2).length();return this.x=e,this.y=i,this.z=s,this}setFromMatrixColumn(t,e){return this.fromArray(t.elements,4*e)}setFromMatrix3Column(t,e){return this.fromArray(t.elements,3*e)}setFromEuler(t){return this.x=t._x,this.y=t._y,this.z=t._z,this}setFromColor(t){return this.x=t.r,this.y=t.g,this.z=t.b,this}equals(t){return t.x===this.x&&t.y===this.y&&t.z===this.z}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this.z=t[e+2],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){const t=Math.random()*Math.PI*2,e=2*Math.random()-1,i=Math.sqrt(1-e*e);return this.x=i*Math.cos(t),this.y=e,this.z=i*Math.sin(t),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}}const ks=new Bs,Rs=new Is;class Es{constructor(t=new Bs(1/0,1/0,1/0),e=new Bs(-1/0,-1/0,-1/0)){this.isBox3=!0,this.min=t,this.max=e}set(t,e){return this.min.copy(t),this.max.copy(e),this}setFromArray(t){this.makeEmpty();for(let e=0,i=t.length;e=this.min.x&&t.x<=this.max.x&&t.y>=this.min.y&&t.y<=this.max.y&&t.z>=this.min.z&&t.z<=this.max.z}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y&&this.min.z<=t.min.z&&t.max.z<=this.max.z}getParameter(t,e){return e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y),(t.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(t){return t.max.x>=this.min.x&&t.min.x<=this.max.x&&t.max.y>=this.min.y&&t.min.y<=this.max.y&&t.max.z>=this.min.z&&t.min.z<=this.max.z}intersectsSphere(t){return this.clampPoint(t.center,Os),Os.distanceToSquared(t.center)<=t.radius*t.radius}intersectsPlane(t){let e,i;return t.normal.x>0?(e=t.normal.x*this.min.x,i=t.normal.x*this.max.x):(e=t.normal.x*this.max.x,i=t.normal.x*this.min.x),t.normal.y>0?(e+=t.normal.y*this.min.y,i+=t.normal.y*this.max.y):(e+=t.normal.y*this.max.y,i+=t.normal.y*this.min.y),t.normal.z>0?(e+=t.normal.z*this.min.z,i+=t.normal.z*this.max.z):(e+=t.normal.z*this.max.z,i+=t.normal.z*this.min.z),e<=-t.constant&&i>=-t.constant}intersectsTriangle(t){if(this.isEmpty())return!1;this.getCenter(Ds),Hs.subVectors(this.max,Ds),Fs.subVectors(t.a,Ds),Ls.subVectors(t.b,Ds),Vs.subVectors(t.c,Ds),js.subVectors(Ls,Fs),Ws.subVectors(Vs,Ls),Us.subVectors(Fs,Vs);let e=[0,-js.z,js.y,0,-Ws.z,Ws.y,0,-Us.z,Us.y,js.z,0,-js.x,Ws.z,0,-Ws.x,Us.z,0,-Us.x,-js.y,js.x,0,-Ws.y,Ws.x,0,-Us.y,Us.x,0];return!!Xs(e,Fs,Ls,Vs,Hs)&&(e=[1,0,0,0,1,0,0,0,1],!!Xs(e,Fs,Ls,Vs,Hs)&&(qs.crossVectors(js,Ws),e=[qs.x,qs.y,qs.z],Xs(e,Fs,Ls,Vs,Hs)))}clampPoint(t,e){return e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return this.clampPoint(t,Os).distanceTo(t)}getBoundingSphere(t){return this.isEmpty()?t.makeEmpty():(this.getCenter(t.center),t.radius=.5*this.getSize(Os).length()),t}intersect(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}applyMatrix4(t){return this.isEmpty()||(Ps[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(t),Ps[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(t),Ps[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(t),Ps[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(t),Ps[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(t),Ps[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(t),Ps[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(t),Ps[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(t),this.setFromPoints(Ps)),this}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}}const Ps=[new Bs,new Bs,new Bs,new Bs,new Bs,new Bs,new Bs,new Bs],Os=new Bs,Ns=new Es,Fs=new Bs,Ls=new Bs,Vs=new Bs,js=new Bs,Ws=new Bs,Us=new Bs,Ds=new Bs,Hs=new Bs,qs=new Bs,Js=new Bs;function Xs(t,e,i,s,r){for(let n=0,a=t.length-3;n<=a;n+=3){Js.fromArray(t,n);const a=r.x*Math.abs(Js.x)+r.y*Math.abs(Js.y)+r.z*Math.abs(Js.z),o=e.dot(Js),h=i.dot(Js),l=s.dot(Js);if(Math.max(-Math.max(o,h,l),Math.min(o,h,l))>a)return!1}return!0}const Ys=new Es,Zs=new Bs,Gs=new Bs;class $s{constructor(t=new Bs,e=-1){this.isSphere=!0,this.center=t,this.radius=e}set(t,e){return this.center.copy(t),this.radius=e,this}setFromPoints(t,e){const i=this.center;void 0!==e?i.copy(e):Ys.setFromPoints(t).getCenter(i);let s=0;for(let e=0,r=t.length;ethis.radius*this.radius&&(e.sub(this.center).normalize(),e.multiplyScalar(this.radius).add(this.center)),e}getBoundingBox(t){return this.isEmpty()?(t.makeEmpty(),t):(t.set(this.center,this.center),t.expandByScalar(this.radius),t)}applyMatrix4(t){return this.center.applyMatrix4(t),this.radius=this.radius*t.getMaxScaleOnAxis(),this}translate(t){return this.center.add(t),this}expandByPoint(t){if(this.isEmpty())return this.center.copy(t),this.radius=0,this;Zs.subVectors(t,this.center);const e=Zs.lengthSq();if(e>this.radius*this.radius){const t=Math.sqrt(e),i=.5*(t-this.radius);this.center.addScaledVector(Zs,i/t),this.radius+=i}return this}union(t){return t.isEmpty()?this:this.isEmpty()?(this.copy(t),this):(!0===this.center.equals(t.center)?this.radius=Math.max(this.radius,t.radius):(Gs.subVectors(t.center,this.center).setLength(t.radius),this.expandByPoint(Zs.copy(t.center).add(Gs)),this.expandByPoint(Zs.copy(t.center).sub(Gs))),this)}equals(t){return t.center.equals(this.center)&&t.radius===this.radius}clone(){return(new this.constructor).copy(this)}}const Qs=new Bs,Ks=new Bs,tr=new Bs,er=new Bs,ir=new Bs,sr=new Bs,rr=new Bs;class nr{constructor(t=new Bs,e=new Bs(0,0,-1)){this.origin=t,this.direction=e}set(t,e){return this.origin.copy(t),this.direction.copy(e),this}copy(t){return this.origin.copy(t.origin),this.direction.copy(t.direction),this}at(t,e){return e.copy(this.origin).addScaledVector(this.direction,t)}lookAt(t){return this.direction.copy(t).sub(this.origin).normalize(),this}recast(t){return this.origin.copy(this.at(t,Qs)),this}closestPointToPoint(t,e){e.subVectors(t,this.origin);const i=e.dot(this.direction);return i<0?e.copy(this.origin):e.copy(this.origin).addScaledVector(this.direction,i)}distanceToPoint(t){return Math.sqrt(this.distanceSqToPoint(t))}distanceSqToPoint(t){const e=Qs.subVectors(t,this.origin).dot(this.direction);return e<0?this.origin.distanceToSquared(t):(Qs.copy(this.origin).addScaledVector(this.direction,e),Qs.distanceToSquared(t))}distanceSqToSegment(t,e,i,s){Ks.copy(t).add(e).multiplyScalar(.5),tr.copy(e).sub(t).normalize(),er.copy(this.origin).sub(Ks);const r=.5*t.distanceTo(e),n=-this.direction.dot(tr),a=er.dot(this.direction),o=-er.dot(tr),h=er.lengthSq(),l=Math.abs(1-n*n);let c,u,d,p;if(l>0)if(c=n*o-a,u=n*a-o,p=r*l,c>=0)if(u>=-p)if(u<=p){const t=1/l;c*=t,u*=t,d=c*(c+n*u+2*a)+u*(n*c+u+2*o)+h}else u=r,c=Math.max(0,-(n*u+a)),d=-c*c+u*(u+2*o)+h;else u=-r,c=Math.max(0,-(n*u+a)),d=-c*c+u*(u+2*o)+h;else u<=-p?(c=Math.max(0,-(-n*r+a)),u=c>0?-r:Math.min(Math.max(-r,-o),r),d=-c*c+u*(u+2*o)+h):u<=p?(c=0,u=Math.min(Math.max(-r,-o),r),d=u*(u+2*o)+h):(c=Math.max(0,-(n*r+a)),u=c>0?r:Math.min(Math.max(-r,-o),r),d=-c*c+u*(u+2*o)+h);else u=n>0?-r:r,c=Math.max(0,-(n*u+a)),d=-c*c+u*(u+2*o)+h;return i&&i.copy(this.origin).addScaledVector(this.direction,c),s&&s.copy(Ks).addScaledVector(tr,u),d}intersectSphere(t,e){Qs.subVectors(t.center,this.origin);const i=Qs.dot(this.direction),s=Qs.dot(Qs)-i*i,r=t.radius*t.radius;if(s>r)return null;const n=Math.sqrt(r-s),a=i-n,o=i+n;return o<0?null:a<0?this.at(o,e):this.at(a,e)}intersectsSphere(t){return this.distanceSqToPoint(t.center)<=t.radius*t.radius}distanceToPlane(t){const e=t.normal.dot(this.direction);if(0===e)return 0===t.distanceToPoint(this.origin)?0:null;const i=-(this.origin.dot(t.normal)+t.constant)/e;return i>=0?i:null}intersectPlane(t,e){const i=this.distanceToPlane(t);return null===i?null:this.at(i,e)}intersectsPlane(t){const e=t.distanceToPoint(this.origin);if(0===e)return!0;return t.normal.dot(this.direction)*e<0}intersectBox(t,e){let i,s,r,n,a,o;const h=1/this.direction.x,l=1/this.direction.y,c=1/this.direction.z,u=this.origin;return h>=0?(i=(t.min.x-u.x)*h,s=(t.max.x-u.x)*h):(i=(t.max.x-u.x)*h,s=(t.min.x-u.x)*h),l>=0?(r=(t.min.y-u.y)*l,n=(t.max.y-u.y)*l):(r=(t.max.y-u.y)*l,n=(t.min.y-u.y)*l),i>n||r>s?null:((r>i||isNaN(i))&&(i=r),(n=0?(a=(t.min.z-u.z)*c,o=(t.max.z-u.z)*c):(a=(t.max.z-u.z)*c,o=(t.min.z-u.z)*c),i>o||a>s?null:((a>i||i!=i)&&(i=a),(o=0?i:s,e)))}intersectsBox(t){return null!==this.intersectBox(t,Qs)}intersectTriangle(t,e,i,s,r){ir.subVectors(e,t),sr.subVectors(i,t),rr.crossVectors(ir,sr);let n,a=this.direction.dot(rr);if(a>0){if(s)return null;n=1}else{if(!(a<0))return null;n=-1,a=-a}er.subVectors(this.origin,t);const o=n*this.direction.dot(sr.crossVectors(er,sr));if(o<0)return null;const h=n*this.direction.dot(ir.cross(er));if(h<0)return null;if(o+h>a)return null;const l=-n*er.dot(rr);return l<0?null:this.at(l/a,r)}applyMatrix4(t){return this.origin.applyMatrix4(t),this.direction.transformDirection(t),this}equals(t){return t.origin.equals(this.origin)&&t.direction.equals(this.direction)}clone(){return(new this.constructor).copy(this)}}class ar{constructor(t,e,i,s,r,n,a,o,h,l,c,u,d,p,m,y){ar.prototype.isMatrix4=!0,this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],void 0!==t&&this.set(t,e,i,s,r,n,a,o,h,l,c,u,d,p,m,y)}set(t,e,i,s,r,n,a,o,h,l,c,u,d,p,m,y){const g=this.elements;return g[0]=t,g[4]=e,g[8]=i,g[12]=s,g[1]=r,g[5]=n,g[9]=a,g[13]=o,g[2]=h,g[6]=l,g[10]=c,g[14]=u,g[3]=d,g[7]=p,g[11]=m,g[15]=y,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return(new ar).fromArray(this.elements)}copy(t){const e=this.elements,i=t.elements;return e[0]=i[0],e[1]=i[1],e[2]=i[2],e[3]=i[3],e[4]=i[4],e[5]=i[5],e[6]=i[6],e[7]=i[7],e[8]=i[8],e[9]=i[9],e[10]=i[10],e[11]=i[11],e[12]=i[12],e[13]=i[13],e[14]=i[14],e[15]=i[15],this}copyPosition(t){const e=this.elements,i=t.elements;return e[12]=i[12],e[13]=i[13],e[14]=i[14],this}setFromMatrix3(t){const e=t.elements;return this.set(e[0],e[3],e[6],0,e[1],e[4],e[7],0,e[2],e[5],e[8],0,0,0,0,1),this}extractBasis(t,e,i){return t.setFromMatrixColumn(this,0),e.setFromMatrixColumn(this,1),i.setFromMatrixColumn(this,2),this}makeBasis(t,e,i){return this.set(t.x,e.x,i.x,0,t.y,e.y,i.y,0,t.z,e.z,i.z,0,0,0,0,1),this}extractRotation(t){const e=this.elements,i=t.elements,s=1/or.setFromMatrixColumn(t,0).length(),r=1/or.setFromMatrixColumn(t,1).length(),n=1/or.setFromMatrixColumn(t,2).length();return e[0]=i[0]*s,e[1]=i[1]*s,e[2]=i[2]*s,e[3]=0,e[4]=i[4]*r,e[5]=i[5]*r,e[6]=i[6]*r,e[7]=0,e[8]=i[8]*n,e[9]=i[9]*n,e[10]=i[10]*n,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromEuler(t){const e=this.elements,i=t.x,s=t.y,r=t.z,n=Math.cos(i),a=Math.sin(i),o=Math.cos(s),h=Math.sin(s),l=Math.cos(r),c=Math.sin(r);if("XYZ"===t.order){const t=n*l,i=n*c,s=a*l,r=a*c;e[0]=o*l,e[4]=-o*c,e[8]=h,e[1]=i+s*h,e[5]=t-r*h,e[9]=-a*o,e[2]=r-t*h,e[6]=s+i*h,e[10]=n*o}else if("YXZ"===t.order){const t=o*l,i=o*c,s=h*l,r=h*c;e[0]=t+r*a,e[4]=s*a-i,e[8]=n*h,e[1]=n*c,e[5]=n*l,e[9]=-a,e[2]=i*a-s,e[6]=r+t*a,e[10]=n*o}else if("ZXY"===t.order){const t=o*l,i=o*c,s=h*l,r=h*c;e[0]=t-r*a,e[4]=-n*c,e[8]=s+i*a,e[1]=i+s*a,e[5]=n*l,e[9]=r-t*a,e[2]=-n*h,e[6]=a,e[10]=n*o}else if("ZYX"===t.order){const t=n*l,i=n*c,s=a*l,r=a*c;e[0]=o*l,e[4]=s*h-i,e[8]=t*h+r,e[1]=o*c,e[5]=r*h+t,e[9]=i*h-s,e[2]=-h,e[6]=a*o,e[10]=n*o}else if("YZX"===t.order){const t=n*o,i=n*h,s=a*o,r=a*h;e[0]=o*l,e[4]=r-t*c,e[8]=s*c+i,e[1]=c,e[5]=n*l,e[9]=-a*l,e[2]=-h*l,e[6]=i*c+s,e[10]=t-r*c}else if("XZY"===t.order){const t=n*o,i=n*h,s=a*o,r=a*h;e[0]=o*l,e[4]=-c,e[8]=h*l,e[1]=t*c+r,e[5]=n*l,e[9]=i*c-s,e[2]=s*c-i,e[6]=a*l,e[10]=r*c+t}return e[3]=0,e[7]=0,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromQuaternion(t){return this.compose(lr,t,cr)}lookAt(t,e,i){const s=this.elements;return pr.subVectors(t,e),0===pr.lengthSq()&&(pr.z=1),pr.normalize(),ur.crossVectors(i,pr),0===ur.lengthSq()&&(1===Math.abs(i.z)?pr.x+=1e-4:pr.z+=1e-4,pr.normalize(),ur.crossVectors(i,pr)),ur.normalize(),dr.crossVectors(pr,ur),s[0]=ur.x,s[4]=dr.x,s[8]=pr.x,s[1]=ur.y,s[5]=dr.y,s[9]=pr.y,s[2]=ur.z,s[6]=dr.z,s[10]=pr.z,this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const i=t.elements,s=e.elements,r=this.elements,n=i[0],a=i[4],o=i[8],h=i[12],l=i[1],c=i[5],u=i[9],d=i[13],p=i[2],m=i[6],y=i[10],g=i[14],f=i[3],x=i[7],b=i[11],v=i[15],w=s[0],M=s[4],S=s[8],_=s[12],A=s[1],T=s[5],z=s[9],C=s[13],I=s[2],B=s[6],k=s[10],R=s[14],E=s[3],P=s[7],O=s[11],N=s[15];return r[0]=n*w+a*A+o*I+h*E,r[4]=n*M+a*T+o*B+h*P,r[8]=n*S+a*z+o*k+h*O,r[12]=n*_+a*C+o*R+h*N,r[1]=l*w+c*A+u*I+d*E,r[5]=l*M+c*T+u*B+d*P,r[9]=l*S+c*z+u*k+d*O,r[13]=l*_+c*C+u*R+d*N,r[2]=p*w+m*A+y*I+g*E,r[6]=p*M+m*T+y*B+g*P,r[10]=p*S+m*z+y*k+g*O,r[14]=p*_+m*C+y*R+g*N,r[3]=f*w+x*A+b*I+v*E,r[7]=f*M+x*T+b*B+v*P,r[11]=f*S+x*z+b*k+v*O,r[15]=f*_+x*C+b*R+v*N,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[4]*=t,e[8]*=t,e[12]*=t,e[1]*=t,e[5]*=t,e[9]*=t,e[13]*=t,e[2]*=t,e[6]*=t,e[10]*=t,e[14]*=t,e[3]*=t,e[7]*=t,e[11]*=t,e[15]*=t,this}determinant(){const t=this.elements,e=t[0],i=t[4],s=t[8],r=t[12],n=t[1],a=t[5],o=t[9],h=t[13],l=t[2],c=t[6],u=t[10],d=t[14];return t[3]*(+r*o*c-s*h*c-r*a*u+i*h*u+s*a*d-i*o*d)+t[7]*(+e*o*d-e*h*u+r*n*u-s*n*d+s*h*l-r*o*l)+t[11]*(+e*h*c-e*a*d-r*n*c+i*n*d+r*a*l-i*h*l)+t[15]*(-s*a*l-e*o*c+e*a*u+s*n*c-i*n*u+i*o*l)}transpose(){const t=this.elements;let e;return e=t[1],t[1]=t[4],t[4]=e,e=t[2],t[2]=t[8],t[8]=e,e=t[6],t[6]=t[9],t[9]=e,e=t[3],t[3]=t[12],t[12]=e,e=t[7],t[7]=t[13],t[13]=e,e=t[11],t[11]=t[14],t[14]=e,this}setPosition(t,e,i){const s=this.elements;return t.isVector3?(s[12]=t.x,s[13]=t.y,s[14]=t.z):(s[12]=t,s[13]=e,s[14]=i),this}invert(){const t=this.elements,e=t[0],i=t[1],s=t[2],r=t[3],n=t[4],a=t[5],o=t[6],h=t[7],l=t[8],c=t[9],u=t[10],d=t[11],p=t[12],m=t[13],y=t[14],g=t[15],f=c*y*h-m*u*h+m*o*d-a*y*d-c*o*g+a*u*g,x=p*u*h-l*y*h-p*o*d+n*y*d+l*o*g-n*u*g,b=l*m*h-p*c*h+p*a*d-n*m*d-l*a*g+n*c*g,v=p*c*o-l*m*o-p*a*u+n*m*u+l*a*y-n*c*y,w=e*f+i*x+s*b+r*v;if(0===w)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const M=1/w;return t[0]=f*M,t[1]=(m*u*r-c*y*r-m*s*d+i*y*d+c*s*g-i*u*g)*M,t[2]=(a*y*r-m*o*r+m*s*h-i*y*h-a*s*g+i*o*g)*M,t[3]=(c*o*r-a*u*r-c*s*h+i*u*h+a*s*d-i*o*d)*M,t[4]=x*M,t[5]=(l*y*r-p*u*r+p*s*d-e*y*d-l*s*g+e*u*g)*M,t[6]=(p*o*r-n*y*r-p*s*h+e*y*h+n*s*g-e*o*g)*M,t[7]=(n*u*r-l*o*r+l*s*h-e*u*h-n*s*d+e*o*d)*M,t[8]=b*M,t[9]=(p*c*r-l*m*r-p*i*d+e*m*d+l*i*g-e*c*g)*M,t[10]=(n*m*r-p*a*r+p*i*h-e*m*h-n*i*g+e*a*g)*M,t[11]=(l*a*r-n*c*r-l*i*h+e*c*h+n*i*d-e*a*d)*M,t[12]=v*M,t[13]=(l*m*s-p*c*s+p*i*u-e*m*u-l*i*y+e*c*y)*M,t[14]=(p*a*s-n*m*s-p*i*o+e*m*o+n*i*y-e*a*y)*M,t[15]=(n*c*s-l*a*s+l*i*o-e*c*o-n*i*u+e*a*u)*M,this}scale(t){const e=this.elements,i=t.x,s=t.y,r=t.z;return e[0]*=i,e[4]*=s,e[8]*=r,e[1]*=i,e[5]*=s,e[9]*=r,e[2]*=i,e[6]*=s,e[10]*=r,e[3]*=i,e[7]*=s,e[11]*=r,this}getMaxScaleOnAxis(){const t=this.elements,e=t[0]*t[0]+t[1]*t[1]+t[2]*t[2],i=t[4]*t[4]+t[5]*t[5]+t[6]*t[6],s=t[8]*t[8]+t[9]*t[9]+t[10]*t[10];return Math.sqrt(Math.max(e,i,s))}makeTranslation(t,e,i){return t.isVector3?this.set(1,0,0,t.x,0,1,0,t.y,0,0,1,t.z,0,0,0,1):this.set(1,0,0,t,0,1,0,e,0,0,1,i,0,0,0,1),this}makeRotationX(t){const e=Math.cos(t),i=Math.sin(t);return this.set(1,0,0,0,0,e,-i,0,0,i,e,0,0,0,0,1),this}makeRotationY(t){const e=Math.cos(t),i=Math.sin(t);return this.set(e,0,i,0,0,1,0,0,-i,0,e,0,0,0,0,1),this}makeRotationZ(t){const e=Math.cos(t),i=Math.sin(t);return this.set(e,-i,0,0,i,e,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(t,e){const i=Math.cos(e),s=Math.sin(e),r=1-i,n=t.x,a=t.y,o=t.z,h=r*n,l=r*a;return this.set(h*n+i,h*a-s*o,h*o+s*a,0,h*a+s*o,l*a+i,l*o-s*n,0,h*o-s*a,l*o+s*n,r*o*o+i,0,0,0,0,1),this}makeScale(t,e,i){return this.set(t,0,0,0,0,e,0,0,0,0,i,0,0,0,0,1),this}makeShear(t,e,i,s,r,n){return this.set(1,i,r,0,t,1,n,0,e,s,1,0,0,0,0,1),this}compose(t,e,i){const s=this.elements,r=e._x,n=e._y,a=e._z,o=e._w,h=r+r,l=n+n,c=a+a,u=r*h,d=r*l,p=r*c,m=n*l,y=n*c,g=a*c,f=o*h,x=o*l,b=o*c,v=i.x,w=i.y,M=i.z;return s[0]=(1-(m+g))*v,s[1]=(d+b)*v,s[2]=(p-x)*v,s[3]=0,s[4]=(d-b)*w,s[5]=(1-(u+g))*w,s[6]=(y+f)*w,s[7]=0,s[8]=(p+x)*M,s[9]=(y-f)*M,s[10]=(1-(u+m))*M,s[11]=0,s[12]=t.x,s[13]=t.y,s[14]=t.z,s[15]=1,this}decompose(t,e,i){const s=this.elements;let r=or.set(s[0],s[1],s[2]).length();const n=or.set(s[4],s[5],s[6]).length(),a=or.set(s[8],s[9],s[10]).length();this.determinant()<0&&(r=-r),t.x=s[12],t.y=s[13],t.z=s[14],hr.copy(this);const o=1/r,h=1/n,l=1/a;return hr.elements[0]*=o,hr.elements[1]*=o,hr.elements[2]*=o,hr.elements[4]*=h,hr.elements[5]*=h,hr.elements[6]*=h,hr.elements[8]*=l,hr.elements[9]*=l,hr.elements[10]*=l,e.setFromRotationMatrix(hr),i.x=r,i.y=n,i.z=a,this}makePerspective(t,e,i,s,r,n,a=2e3){const o=this.elements,h=2*r/(e-t),l=2*r/(i-s),c=(e+t)/(e-t),u=(i+s)/(i-s);let d,p;if(a===Oi)d=-(n+r)/(n-r),p=-2*n*r/(n-r);else{if(a!==Ni)throw new Error("THREE.Matrix4.makePerspective(): Invalid coordinate system: "+a);d=-n/(n-r),p=-n*r/(n-r)}return o[0]=h,o[4]=0,o[8]=c,o[12]=0,o[1]=0,o[5]=l,o[9]=u,o[13]=0,o[2]=0,o[6]=0,o[10]=d,o[14]=p,o[3]=0,o[7]=0,o[11]=-1,o[15]=0,this}makeOrthographic(t,e,i,s,r,n,a=2e3){const o=this.elements,h=1/(e-t),l=1/(i-s),c=1/(n-r),u=(e+t)*h,d=(i+s)*l;let p,m;if(a===Oi)p=(n+r)*c,m=-2*c;else{if(a!==Ni)throw new Error("THREE.Matrix4.makeOrthographic(): Invalid coordinate system: "+a);p=r*c,m=-1*c}return o[0]=2*h,o[4]=0,o[8]=0,o[12]=-u,o[1]=0,o[5]=2*l,o[9]=0,o[13]=-d,o[2]=0,o[6]=0,o[10]=m,o[14]=-p,o[3]=0,o[7]=0,o[11]=0,o[15]=1,this}equals(t){const e=this.elements,i=t.elements;for(let t=0;t<16;t++)if(e[t]!==i[t])return!1;return!0}fromArray(t,e=0){for(let i=0;i<16;i++)this.elements[i]=t[i+e];return this}toArray(t=[],e=0){const i=this.elements;return t[e]=i[0],t[e+1]=i[1],t[e+2]=i[2],t[e+3]=i[3],t[e+4]=i[4],t[e+5]=i[5],t[e+6]=i[6],t[e+7]=i[7],t[e+8]=i[8],t[e+9]=i[9],t[e+10]=i[10],t[e+11]=i[11],t[e+12]=i[12],t[e+13]=i[13],t[e+14]=i[14],t[e+15]=i[15],t}}const or=new Bs,hr=new ar,lr=new Bs(0,0,0),cr=new Bs(1,1,1),ur=new Bs,dr=new Bs,pr=new Bs,mr=new ar,yr=new Is;class gr{constructor(t=0,e=0,i=0,s=gr.DEFAULT_ORDER){this.isEuler=!0,this._x=t,this._y=e,this._z=i,this._order=s}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get order(){return this._order}set order(t){this._order=t,this._onChangeCallback()}set(t,e,i,s=this._order){return this._x=t,this._y=e,this._z=i,this._order=s,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._order)}copy(t){return this._x=t._x,this._y=t._y,this._z=t._z,this._order=t._order,this._onChangeCallback(),this}setFromRotationMatrix(t,e=this._order,i=!0){const s=t.elements,r=s[0],n=s[4],a=s[8],o=s[1],h=s[5],l=s[9],c=s[2],u=s[6],d=s[10];switch(e){case"XYZ":this._y=Math.asin(Hi(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(-l,d),this._z=Math.atan2(-n,r)):(this._x=Math.atan2(u,h),this._z=0);break;case"YXZ":this._x=Math.asin(-Hi(l,-1,1)),Math.abs(l)<.9999999?(this._y=Math.atan2(a,d),this._z=Math.atan2(o,h)):(this._y=Math.atan2(-c,r),this._z=0);break;case"ZXY":this._x=Math.asin(Hi(u,-1,1)),Math.abs(u)<.9999999?(this._y=Math.atan2(-c,d),this._z=Math.atan2(-n,h)):(this._y=0,this._z=Math.atan2(o,r));break;case"ZYX":this._y=Math.asin(-Hi(c,-1,1)),Math.abs(c)<.9999999?(this._x=Math.atan2(u,d),this._z=Math.atan2(o,r)):(this._x=0,this._z=Math.atan2(-n,h));break;case"YZX":this._z=Math.asin(Hi(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(-l,h),this._y=Math.atan2(-c,r)):(this._x=0,this._y=Math.atan2(a,d));break;case"XZY":this._z=Math.asin(-Hi(n,-1,1)),Math.abs(n)<.9999999?(this._x=Math.atan2(u,h),this._y=Math.atan2(a,r)):(this._x=Math.atan2(-l,d),this._y=0);break;default:console.warn("THREE.Euler: .setFromRotationMatrix() encountered an unknown order: "+e)}return this._order=e,!0===i&&this._onChangeCallback(),this}setFromQuaternion(t,e,i){return mr.makeRotationFromQuaternion(t),this.setFromRotationMatrix(mr,e,i)}setFromVector3(t,e=this._order){return this.set(t.x,t.y,t.z,e)}reorder(t){return yr.setFromEuler(this),this.setFromQuaternion(yr,t)}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._order===this._order}fromArray(t){return this._x=t[0],this._y=t[1],this._z=t[2],void 0!==t[3]&&(this._order=t[3]),this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._order,t}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._order}}gr.DEFAULT_ORDER="XYZ";class fr{constructor(){this.mask=1}set(t){this.mask=1<>>0}enable(t){this.mask|=1<1){for(let t=0;t1){for(let t=0;t0&&(s.userData=this.userData),s.layers=this.layers.mask,s.matrix=this.matrix.toArray(),s.up=this.up.toArray(),!1===this.matrixAutoUpdate&&(s.matrixAutoUpdate=!1),this.isInstancedMesh&&(s.type="InstancedMesh",s.count=this.count,s.instanceMatrix=this.instanceMatrix.toJSON(),null!==this.instanceColor&&(s.instanceColor=this.instanceColor.toJSON())),this.isBatchedMesh&&(s.type="BatchedMesh",s.perObjectFrustumCulled=this.perObjectFrustumCulled,s.sortObjects=this.sortObjects,s.drawRanges=this._drawRanges,s.reservedRanges=this._reservedRanges,s.visibility=this._visibility,s.active=this._active,s.bounds=this._bounds.map((t=>({boxInitialized:t.boxInitialized,boxMin:t.box.min.toArray(),boxMax:t.box.max.toArray(),sphereInitialized:t.sphereInitialized,sphereRadius:t.sphere.radius,sphereCenter:t.sphere.center.toArray()}))),s.maxInstanceCount=this._maxInstanceCount,s.maxVertexCount=this._maxVertexCount,s.maxIndexCount=this._maxIndexCount,s.geometryInitialized=this._geometryInitialized,s.geometryCount=this._geometryCount,s.matricesTexture=this._matricesTexture.toJSON(t),null!==this._colorsTexture&&(s.colorsTexture=this._colorsTexture.toJSON(t)),null!==this.boundingSphere&&(s.boundingSphere={center:s.boundingSphere.center.toArray(),radius:s.boundingSphere.radius}),null!==this.boundingBox&&(s.boundingBox={min:s.boundingBox.min.toArray(),max:s.boundingBox.max.toArray()})),this.isScene)this.background&&(this.background.isColor?s.background=this.background.toJSON():this.background.isTexture&&(s.background=this.background.toJSON(t).uuid)),this.environment&&this.environment.isTexture&&!0!==this.environment.isRenderTargetTexture&&(s.environment=this.environment.toJSON(t).uuid);else if(this.isMesh||this.isLine||this.isPoints){s.geometry=r(t.geometries,this.geometry);const e=this.geometry.parameters;if(void 0!==e&&void 0!==e.shapes){const i=e.shapes;if(Array.isArray(i))for(let e=0,s=i.length;e0){s.children=[];for(let e=0;e0){s.animations=[];for(let e=0;e0&&(i.geometries=e),s.length>0&&(i.materials=s),r.length>0&&(i.textures=r),a.length>0&&(i.images=a),o.length>0&&(i.shapes=o),h.length>0&&(i.skeletons=h),l.length>0&&(i.animations=l),c.length>0&&(i.nodes=c)}return i.object=s,i;function n(t){const e=[];for(const i in t){const s=t[i];delete s.metadata,e.push(s)}return e}}clone(t){return(new this.constructor).copy(this,t)}copy(t,e=!0){if(this.name=t.name,this.up.copy(t.up),this.position.copy(t.position),this.rotation.order=t.rotation.order,this.quaternion.copy(t.quaternion),this.scale.copy(t.scale),this.matrix.copy(t.matrix),this.matrixWorld.copy(t.matrixWorld),this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrixWorldAutoUpdate=t.matrixWorldAutoUpdate,this.matrixWorldNeedsUpdate=t.matrixWorldNeedsUpdate,this.layers.mask=t.layers.mask,this.visible=t.visible,this.castShadow=t.castShadow,this.receiveShadow=t.receiveShadow,this.frustumCulled=t.frustumCulled,this.renderOrder=t.renderOrder,this.animations=t.animations.slice(),this.userData=JSON.parse(JSON.stringify(t.userData)),!0===e)for(let e=0;e0?s.multiplyScalar(1/Math.sqrt(r)):s.set(0,0,0)}static getBarycoord(t,e,i,s,r){Pr.subVectors(s,e),Or.subVectors(i,e),Nr.subVectors(t,e);const n=Pr.dot(Pr),a=Pr.dot(Or),o=Pr.dot(Nr),h=Or.dot(Or),l=Or.dot(Nr),c=n*h-a*a;if(0===c)return r.set(0,0,0),null;const u=1/c,d=(h*o-a*l)*u,p=(n*l-a*o)*u;return r.set(1-d-p,p,d)}static containsPoint(t,e,i,s){return null!==this.getBarycoord(t,e,i,s,Fr)&&(Fr.x>=0&&Fr.y>=0&&Fr.x+Fr.y<=1)}static getInterpolation(t,e,i,s,r,n,a,o){return null===this.getBarycoord(t,e,i,s,Fr)?(o.x=0,o.y=0,"z"in o&&(o.z=0),"w"in o&&(o.w=0),null):(o.setScalar(0),o.addScaledVector(r,Fr.x),o.addScaledVector(n,Fr.y),o.addScaledVector(a,Fr.z),o)}static getInterpolatedAttribute(t,e,i,s,r,n){return Hr.setScalar(0),qr.setScalar(0),Jr.setScalar(0),Hr.fromBufferAttribute(t,e),qr.fromBufferAttribute(t,i),Jr.fromBufferAttribute(t,s),n.setScalar(0),n.addScaledVector(Hr,r.x),n.addScaledVector(qr,r.y),n.addScaledVector(Jr,r.z),n}static isFrontFacing(t,e,i,s){return Pr.subVectors(i,e),Or.subVectors(t,e),Pr.cross(Or).dot(s)<0}set(t,e,i){return this.a.copy(t),this.b.copy(e),this.c.copy(i),this}setFromPointsAndIndices(t,e,i,s){return this.a.copy(t[e]),this.b.copy(t[i]),this.c.copy(t[s]),this}setFromAttributeAndIndices(t,e,i,s){return this.a.fromBufferAttribute(t,e),this.b.fromBufferAttribute(t,i),this.c.fromBufferAttribute(t,s),this}clone(){return(new this.constructor).copy(this)}copy(t){return this.a.copy(t.a),this.b.copy(t.b),this.c.copy(t.c),this}getArea(){return Pr.subVectors(this.c,this.b),Or.subVectors(this.a,this.b),.5*Pr.cross(Or).length()}getMidpoint(t){return t.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(t){return Xr.getNormal(this.a,this.b,this.c,t)}getPlane(t){return t.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(t,e){return Xr.getBarycoord(t,this.a,this.b,this.c,e)}getInterpolation(t,e,i,s,r){return Xr.getInterpolation(t,this.a,this.b,this.c,e,i,s,r)}containsPoint(t){return Xr.containsPoint(t,this.a,this.b,this.c)}isFrontFacing(t){return Xr.isFrontFacing(this.a,this.b,this.c,t)}intersectsBox(t){return t.intersectsTriangle(this)}closestPointToPoint(t,e){const i=this.a,s=this.b,r=this.c;let n,a;Lr.subVectors(s,i),Vr.subVectors(r,i),Wr.subVectors(t,i);const o=Lr.dot(Wr),h=Vr.dot(Wr);if(o<=0&&h<=0)return e.copy(i);Ur.subVectors(t,s);const l=Lr.dot(Ur),c=Vr.dot(Ur);if(l>=0&&c<=l)return e.copy(s);const u=o*c-l*h;if(u<=0&&o>=0&&l<=0)return n=o/(o-l),e.copy(i).addScaledVector(Lr,n);Dr.subVectors(t,r);const d=Lr.dot(Dr),p=Vr.dot(Dr);if(p>=0&&d<=p)return e.copy(r);const m=d*h-o*p;if(m<=0&&h>=0&&p<=0)return a=h/(h-p),e.copy(i).addScaledVector(Vr,a);const y=l*p-d*c;if(y<=0&&c-l>=0&&d-p>=0)return jr.subVectors(r,s),a=(c-l)/(c-l+(d-p)),e.copy(s).addScaledVector(jr,a);const g=1/(y+m+u);return n=m*g,a=u*g,e.copy(i).addScaledVector(Lr,n).addScaledVector(Vr,a)}equals(t){return t.a.equals(this.a)&&t.b.equals(this.b)&&t.c.equals(this.c)}}const Yr={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},Zr={h:0,s:0,l:0},Gr={h:0,s:0,l:0};function $r(t,e,i){return i<0&&(i+=1),i>1&&(i-=1),i<1/6?t+6*(e-t)*i:i<.5?e:i<2/3?t+6*(e-t)*(2/3-i):t}class Qr{constructor(t,e,i){return this.isColor=!0,this.r=1,this.g=1,this.b=1,this.set(t,e,i)}set(t,e,i){if(void 0===e&&void 0===i){const e=t;e&&e.isColor?this.copy(e):"number"==typeof e?this.setHex(e):"string"==typeof e&&this.setStyle(e)}else this.setRGB(t,e,i);return this}setScalar(t){return this.r=t,this.g=t,this.b=t,this}setHex(t,e=Ge){return t=Math.floor(t),this.r=(t>>16&255)/255,this.g=(t>>8&255)/255,this.b=(255&t)/255,ds.toWorkingColorSpace(this,e),this}setRGB(t,e,i,s=ds.workingColorSpace){return this.r=t,this.g=e,this.b=i,ds.toWorkingColorSpace(this,s),this}setHSL(t,e,i,s=ds.workingColorSpace){if(t=qi(t,1),e=Hi(e,0,1),i=Hi(i,0,1),0===e)this.r=this.g=this.b=i;else{const s=i<=.5?i*(1+e):i+e-i*e,r=2*i-s;this.r=$r(r,s,t+1/3),this.g=$r(r,s,t),this.b=$r(r,s,t-1/3)}return ds.toWorkingColorSpace(this,s),this}setStyle(t,e=Ge){function i(e){void 0!==e&&parseFloat(e)<1&&console.warn("THREE.Color: Alpha component of "+t+" will be ignored.")}let s;if(s=/^(\w+)\(([^\)]*)\)/.exec(t)){let r;const n=s[1],a=s[2];switch(n){case"rgb":case"rgba":if(r=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return i(r[4]),this.setRGB(Math.min(255,parseInt(r[1],10))/255,Math.min(255,parseInt(r[2],10))/255,Math.min(255,parseInt(r[3],10))/255,e);if(r=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return i(r[4]),this.setRGB(Math.min(100,parseInt(r[1],10))/100,Math.min(100,parseInt(r[2],10))/100,Math.min(100,parseInt(r[3],10))/100,e);break;case"hsl":case"hsla":if(r=/^\s*(\d*\.?\d+)\s*,\s*(\d*\.?\d+)\%\s*,\s*(\d*\.?\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return i(r[4]),this.setHSL(parseFloat(r[1])/360,parseFloat(r[2])/100,parseFloat(r[3])/100,e);break;default:console.warn("THREE.Color: Unknown color model "+t)}}else if(s=/^\#([A-Fa-f\d]+)$/.exec(t)){const i=s[1],r=i.length;if(3===r)return this.setRGB(parseInt(i.charAt(0),16)/15,parseInt(i.charAt(1),16)/15,parseInt(i.charAt(2),16)/15,e);if(6===r)return this.setHex(parseInt(i,16),e);console.warn("THREE.Color: Invalid hex color "+t)}else if(t&&t.length>0)return this.setColorName(t,e);return this}setColorName(t,e=Ge){const i=Yr[t.toLowerCase()];return void 0!==i?this.setHex(i,e):console.warn("THREE.Color: Unknown color "+t),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(t){return this.r=t.r,this.g=t.g,this.b=t.b,this}copySRGBToLinear(t){return this.r=ps(t.r),this.g=ps(t.g),this.b=ps(t.b),this}copyLinearToSRGB(t){return this.r=ms(t.r),this.g=ms(t.g),this.b=ms(t.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(t=Ge){return ds.fromWorkingColorSpace(Kr.copy(this),t),65536*Math.round(Hi(255*Kr.r,0,255))+256*Math.round(Hi(255*Kr.g,0,255))+Math.round(Hi(255*Kr.b,0,255))}getHexString(t=Ge){return("000000"+this.getHex(t).toString(16)).slice(-6)}getHSL(t,e=ds.workingColorSpace){ds.fromWorkingColorSpace(Kr.copy(this),e);const i=Kr.r,s=Kr.g,r=Kr.b,n=Math.max(i,s,r),a=Math.min(i,s,r);let o,h;const l=(a+n)/2;if(a===n)o=0,h=0;else{const t=n-a;switch(h=l<=.5?t/(n+a):t/(2-n-a),n){case i:o=(s-r)/t+(s0!=t>0&&this.version++,this._alphaTest=t}onBeforeRender(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(t){if(void 0!==t)for(const e in t){const i=t[e];if(void 0===i){console.warn(`THREE.Material: parameter '${e}' has value of undefined.`);continue}const s=this[e];void 0!==s?s&&s.isColor?s.set(i):s&&s.isVector3&&i&&i.isVector3?s.copy(i):this[e]=i:console.warn(`THREE.Material: '${e}' is not a property of THREE.${this.type}.`)}}toJSON(t){const e=void 0===t||"string"==typeof t;e&&(t={textures:{},images:{}});const i={metadata:{version:4.6,type:"Material",generator:"Material.toJSON"}};function s(t){const e=[];for(const i in t){const s=t[i];delete s.metadata,e.push(s)}return e}if(i.uuid=this.uuid,i.type=this.type,""!==this.name&&(i.name=this.name),this.color&&this.color.isColor&&(i.color=this.color.getHex()),void 0!==this.roughness&&(i.roughness=this.roughness),void 0!==this.metalness&&(i.metalness=this.metalness),void 0!==this.sheen&&(i.sheen=this.sheen),this.sheenColor&&this.sheenColor.isColor&&(i.sheenColor=this.sheenColor.getHex()),void 0!==this.sheenRoughness&&(i.sheenRoughness=this.sheenRoughness),this.emissive&&this.emissive.isColor&&(i.emissive=this.emissive.getHex()),void 0!==this.emissiveIntensity&&1!==this.emissiveIntensity&&(i.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(i.specular=this.specular.getHex()),void 0!==this.specularIntensity&&(i.specularIntensity=this.specularIntensity),this.specularColor&&this.specularColor.isColor&&(i.specularColor=this.specularColor.getHex()),void 0!==this.shininess&&(i.shininess=this.shininess),void 0!==this.clearcoat&&(i.clearcoat=this.clearcoat),void 0!==this.clearcoatRoughness&&(i.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(i.clearcoatMap=this.clearcoatMap.toJSON(t).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(i.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(t).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(i.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(t).uuid,i.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),void 0!==this.dispersion&&(i.dispersion=this.dispersion),void 0!==this.iridescence&&(i.iridescence=this.iridescence),void 0!==this.iridescenceIOR&&(i.iridescenceIOR=this.iridescenceIOR),void 0!==this.iridescenceThicknessRange&&(i.iridescenceThicknessRange=this.iridescenceThicknessRange),this.iridescenceMap&&this.iridescenceMap.isTexture&&(i.iridescenceMap=this.iridescenceMap.toJSON(t).uuid),this.iridescenceThicknessMap&&this.iridescenceThicknessMap.isTexture&&(i.iridescenceThicknessMap=this.iridescenceThicknessMap.toJSON(t).uuid),void 0!==this.anisotropy&&(i.anisotropy=this.anisotropy),void 0!==this.anisotropyRotation&&(i.anisotropyRotation=this.anisotropyRotation),this.anisotropyMap&&this.anisotropyMap.isTexture&&(i.anisotropyMap=this.anisotropyMap.toJSON(t).uuid),this.map&&this.map.isTexture&&(i.map=this.map.toJSON(t).uuid),this.matcap&&this.matcap.isTexture&&(i.matcap=this.matcap.toJSON(t).uuid),this.alphaMap&&this.alphaMap.isTexture&&(i.alphaMap=this.alphaMap.toJSON(t).uuid),this.lightMap&&this.lightMap.isTexture&&(i.lightMap=this.lightMap.toJSON(t).uuid,i.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(i.aoMap=this.aoMap.toJSON(t).uuid,i.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(i.bumpMap=this.bumpMap.toJSON(t).uuid,i.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(i.normalMap=this.normalMap.toJSON(t).uuid,i.normalMapType=this.normalMapType,i.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(i.displacementMap=this.displacementMap.toJSON(t).uuid,i.displacementScale=this.displacementScale,i.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(i.roughnessMap=this.roughnessMap.toJSON(t).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(i.metalnessMap=this.metalnessMap.toJSON(t).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(i.emissiveMap=this.emissiveMap.toJSON(t).uuid),this.specularMap&&this.specularMap.isTexture&&(i.specularMap=this.specularMap.toJSON(t).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(i.specularIntensityMap=this.specularIntensityMap.toJSON(t).uuid),this.specularColorMap&&this.specularColorMap.isTexture&&(i.specularColorMap=this.specularColorMap.toJSON(t).uuid),this.envMap&&this.envMap.isTexture&&(i.envMap=this.envMap.toJSON(t).uuid,void 0!==this.combine&&(i.combine=this.combine)),void 0!==this.envMapRotation&&(i.envMapRotation=this.envMapRotation.toArray()),void 0!==this.envMapIntensity&&(i.envMapIntensity=this.envMapIntensity),void 0!==this.reflectivity&&(i.reflectivity=this.reflectivity),void 0!==this.refractionRatio&&(i.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(i.gradientMap=this.gradientMap.toJSON(t).uuid),void 0!==this.transmission&&(i.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(i.transmissionMap=this.transmissionMap.toJSON(t).uuid),void 0!==this.thickness&&(i.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(i.thicknessMap=this.thicknessMap.toJSON(t).uuid),void 0!==this.attenuationDistance&&this.attenuationDistance!==1/0&&(i.attenuationDistance=this.attenuationDistance),void 0!==this.attenuationColor&&(i.attenuationColor=this.attenuationColor.getHex()),void 0!==this.size&&(i.size=this.size),null!==this.shadowSide&&(i.shadowSide=this.shadowSide),void 0!==this.sizeAttenuation&&(i.sizeAttenuation=this.sizeAttenuation),1!==this.blending&&(i.blending=this.blending),0!==this.side&&(i.side=this.side),!0===this.vertexColors&&(i.vertexColors=!0),this.opacity<1&&(i.opacity=this.opacity),!0===this.transparent&&(i.transparent=!0),204!==this.blendSrc&&(i.blendSrc=this.blendSrc),205!==this.blendDst&&(i.blendDst=this.blendDst),100!==this.blendEquation&&(i.blendEquation=this.blendEquation),null!==this.blendSrcAlpha&&(i.blendSrcAlpha=this.blendSrcAlpha),null!==this.blendDstAlpha&&(i.blendDstAlpha=this.blendDstAlpha),null!==this.blendEquationAlpha&&(i.blendEquationAlpha=this.blendEquationAlpha),this.blendColor&&this.blendColor.isColor&&(i.blendColor=this.blendColor.getHex()),0!==this.blendAlpha&&(i.blendAlpha=this.blendAlpha),3!==this.depthFunc&&(i.depthFunc=this.depthFunc),!1===this.depthTest&&(i.depthTest=this.depthTest),!1===this.depthWrite&&(i.depthWrite=this.depthWrite),!1===this.colorWrite&&(i.colorWrite=this.colorWrite),255!==this.stencilWriteMask&&(i.stencilWriteMask=this.stencilWriteMask),519!==this.stencilFunc&&(i.stencilFunc=this.stencilFunc),0!==this.stencilRef&&(i.stencilRef=this.stencilRef),255!==this.stencilFuncMask&&(i.stencilFuncMask=this.stencilFuncMask),this.stencilFail!==ei&&(i.stencilFail=this.stencilFail),this.stencilZFail!==ei&&(i.stencilZFail=this.stencilZFail),this.stencilZPass!==ei&&(i.stencilZPass=this.stencilZPass),!0===this.stencilWrite&&(i.stencilWrite=this.stencilWrite),void 0!==this.rotation&&0!==this.rotation&&(i.rotation=this.rotation),!0===this.polygonOffset&&(i.polygonOffset=!0),0!==this.polygonOffsetFactor&&(i.polygonOffsetFactor=this.polygonOffsetFactor),0!==this.polygonOffsetUnits&&(i.polygonOffsetUnits=this.polygonOffsetUnits),void 0!==this.linewidth&&1!==this.linewidth&&(i.linewidth=this.linewidth),void 0!==this.dashSize&&(i.dashSize=this.dashSize),void 0!==this.gapSize&&(i.gapSize=this.gapSize),void 0!==this.scale&&(i.scale=this.scale),!0===this.dithering&&(i.dithering=!0),this.alphaTest>0&&(i.alphaTest=this.alphaTest),!0===this.alphaHash&&(i.alphaHash=!0),!0===this.alphaToCoverage&&(i.alphaToCoverage=!0),!0===this.premultipliedAlpha&&(i.premultipliedAlpha=!0),!0===this.forceSinglePass&&(i.forceSinglePass=!0),!0===this.wireframe&&(i.wireframe=!0),this.wireframeLinewidth>1&&(i.wireframeLinewidth=this.wireframeLinewidth),"round"!==this.wireframeLinecap&&(i.wireframeLinecap=this.wireframeLinecap),"round"!==this.wireframeLinejoin&&(i.wireframeLinejoin=this.wireframeLinejoin),!0===this.flatShading&&(i.flatShading=!0),!1===this.visible&&(i.visible=!1),!1===this.toneMapped&&(i.toneMapped=!1),!1===this.fog&&(i.fog=!1),Object.keys(this.userData).length>0&&(i.userData=this.userData),e){const e=s(t.textures),r=s(t.images);e.length>0&&(i.textures=e),r.length>0&&(i.images=r)}return i}clone(){return(new this.constructor).copy(this)}copy(t){this.name=t.name,this.blending=t.blending,this.side=t.side,this.vertexColors=t.vertexColors,this.opacity=t.opacity,this.transparent=t.transparent,this.blendSrc=t.blendSrc,this.blendDst=t.blendDst,this.blendEquation=t.blendEquation,this.blendSrcAlpha=t.blendSrcAlpha,this.blendDstAlpha=t.blendDstAlpha,this.blendEquationAlpha=t.blendEquationAlpha,this.blendColor.copy(t.blendColor),this.blendAlpha=t.blendAlpha,this.depthFunc=t.depthFunc,this.depthTest=t.depthTest,this.depthWrite=t.depthWrite,this.stencilWriteMask=t.stencilWriteMask,this.stencilFunc=t.stencilFunc,this.stencilRef=t.stencilRef,this.stencilFuncMask=t.stencilFuncMask,this.stencilFail=t.stencilFail,this.stencilZFail=t.stencilZFail,this.stencilZPass=t.stencilZPass,this.stencilWrite=t.stencilWrite;const e=t.clippingPlanes;let i=null;if(null!==e){const t=e.length;i=new Array(t);for(let s=0;s!==t;++s)i[s]=e[s].clone()}return this.clippingPlanes=i,this.clipIntersection=t.clipIntersection,this.clipShadows=t.clipShadows,this.shadowSide=t.shadowSide,this.colorWrite=t.colorWrite,this.precision=t.precision,this.polygonOffset=t.polygonOffset,this.polygonOffsetFactor=t.polygonOffsetFactor,this.polygonOffsetUnits=t.polygonOffsetUnits,this.dithering=t.dithering,this.alphaTest=t.alphaTest,this.alphaHash=t.alphaHash,this.alphaToCoverage=t.alphaToCoverage,this.premultipliedAlpha=t.premultipliedAlpha,this.forceSinglePass=t.forceSinglePass,this.visible=t.visible,this.toneMapped=t.toneMapped,this.userData=JSON.parse(JSON.stringify(t.userData)),this}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(t){!0===t&&this.version++}onBuild(){console.warn("Material: onBuild() has been removed.")}}class sn extends en{constructor(t){super(),this.isMeshBasicMaterial=!0,this.type="MeshBasicMaterial",this.color=new Qr(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new gr,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapRotation.copy(t.envMapRotation),this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.fog=t.fog,this}}const rn=nn();function nn(){const t=new ArrayBuffer(4),e=new Float32Array(t),i=new Uint32Array(t),s=new Uint32Array(512),r=new Uint32Array(512);for(let t=0;t<256;++t){const e=t-127;e<-27?(s[t]=0,s[256|t]=32768,r[t]=24,r[256|t]=24):e<-14?(s[t]=1024>>-e-14,s[256|t]=1024>>-e-14|32768,r[t]=-e-1,r[256|t]=-e-1):e<=15?(s[t]=e+15<<10,s[256|t]=e+15<<10|32768,r[t]=13,r[256|t]=13):e<128?(s[t]=31744,s[256|t]=64512,r[t]=24,r[256|t]=24):(s[t]=31744,s[256|t]=64512,r[t]=13,r[256|t]=13)}const n=new Uint32Array(2048),a=new Uint32Array(64),o=new Uint32Array(64);for(let t=1;t<1024;++t){let e=t<<13,i=0;for(;!(8388608&e);)e<<=1,i-=8388608;e&=-8388609,i+=947912704,n[t]=e|i}for(let t=1024;t<2048;++t)n[t]=939524096+(t-1024<<13);for(let t=1;t<31;++t)a[t]=t<<23;a[31]=1199570944,a[32]=2147483648;for(let t=33;t<63;++t)a[t]=2147483648+(t-32<<23);a[63]=3347054592;for(let t=1;t<64;++t)32!==t&&(o[t]=1024);return{floatView:e,uint32View:i,baseTable:s,shiftTable:r,mantissaTable:n,exponentTable:a,offsetTable:o}}function an(t){Math.abs(t)>65504&&console.warn("THREE.DataUtils.toHalfFloat(): Value out of range."),t=Hi(t,-65504,65504),rn.floatView[0]=t;const e=rn.uint32View[0],i=e>>23&511;return rn.baseTable[i]+((8388607&e)>>rn.shiftTable[i])}function on(t){const e=t>>10;return rn.uint32View[0]=rn.mantissaTable[rn.offsetTable[e]+(1023&t)]+rn.exponentTable[e],rn.floatView[0]}class hn{static toHalfFloat(t){return an(t)}static fromHalfFloat(t){return on(t)}}const ln=new Bs,cn=new Gi;let un=0;class dn{constructor(t,e,i=!1){if(Array.isArray(t))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.isBufferAttribute=!0,Object.defineProperty(this,"id",{value:un++}),this.name="",this.array=t,this.itemSize=e,this.count=void 0!==t?t.length/e:0,this.normalized=i,this.usage=_i,this.updateRanges=[],this.gpuType=Rt,this.version=0}onUploadCallback(){}set needsUpdate(t){!0===t&&this.version++}setUsage(t){return this.usage=t,this}addUpdateRange(t,e){this.updateRanges.push({start:t,count:e})}clearUpdateRanges(){this.updateRanges.length=0}copy(t){return this.name=t.name,this.array=new t.array.constructor(t.array),this.itemSize=t.itemSize,this.count=t.count,this.normalized=t.normalized,this.usage=t.usage,this.gpuType=t.gpuType,this}copyAt(t,e,i){t*=this.itemSize,i*=e.itemSize;for(let s=0,r=this.itemSize;se.count&&console.warn("THREE.BufferGeometry: Buffer size too small for points data. Use .dispose() and create a new geometry."),e.needsUpdate=!0}return this}computeBoundingBox(){null===this.boundingBox&&(this.boundingBox=new Es);const t=this.attributes.position,e=this.morphAttributes.position;if(t&&t.isGLBufferAttribute)return console.error("THREE.BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box.",this),void this.boundingBox.set(new Bs(-1/0,-1/0,-1/0),new Bs(1/0,1/0,1/0));if(void 0!==t){if(this.boundingBox.setFromBufferAttribute(t),e)for(let t=0,i=e.length;t0&&(t.userData=this.userData),void 0!==this.parameters){const e=this.parameters;for(const i in e)void 0!==e[i]&&(t[i]=e[i]);return t}t.data={attributes:{}};const e=this.index;null!==e&&(t.data.index={type:e.array.constructor.name,array:Array.prototype.slice.call(e.array)});const i=this.attributes;for(const e in i){const s=i[e];t.data.attributes[e]=s.toJSON(t.data)}const s={};let r=!1;for(const e in this.morphAttributes){const i=this.morphAttributes[e],n=[];for(let e=0,s=i.length;e0&&(s[e]=n,r=!0)}r&&(t.data.morphAttributes=s,t.data.morphTargetsRelative=this.morphTargetsRelative);const n=this.groups;n.length>0&&(t.data.groups=JSON.parse(JSON.stringify(n)));const a=this.boundingSphere;return null!==a&&(t.data.boundingSphere={center:a.center.toArray(),radius:a.radius}),t}clone(){return(new this.constructor).copy(this)}copy(t){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;const e={};this.name=t.name;const i=t.index;null!==i&&this.setIndex(i.clone());const s=t.attributes;for(const t in s){const i=s[t];this.setAttribute(t,i.clone(e))}const r=t.morphAttributes;for(const t in r){const i=[],s=r[t];for(let t=0,r=s.length;t0){const i=t[e[0]];if(void 0!==i){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,e=i.length;t(t.far-t.near)**2)return}Bn.copy(r).invert(),kn.copy(t.ray).applyMatrix4(Bn),null!==i.boundingBox&&!1===kn.intersectsBox(i.boundingBox)||this._computeIntersections(t,e,kn)}}_computeIntersections(t,e,i){let s;const r=this.geometry,n=this.material,a=r.index,o=r.attributes.position,h=r.attributes.uv,l=r.attributes.uv1,c=r.attributes.normal,u=r.groups,d=r.drawRange;if(null!==a)if(Array.isArray(n))for(let r=0,o=u.length;ri.far?null:{distance:l,point:jn.clone(),object:t}}(t,e,i,s,Pn,On,Nn,Vn);if(c){const t=new Bs;Xr.getBarycoord(Vn,Pn,On,Nn,t),r&&(c.uv=Xr.getInterpolatedAttribute(r,o,h,l,t,new Gi)),n&&(c.uv1=Xr.getInterpolatedAttribute(n,o,h,l,t,new Gi)),a&&(c.normal=Xr.getInterpolatedAttribute(a,o,h,l,t,new Bs),c.normal.dot(s.direction)>0&&c.normal.multiplyScalar(-1));const e={a:o,b:h,c:l,normal:new Bs,materialIndex:0};Xr.getNormal(Pn,On,Nn,e.normal),c.face=e,c.barycoord=t}return c}class Dn extends In{constructor(t=1,e=1,i=1,s=1,r=1,n=1){super(),this.type="BoxGeometry",this.parameters={width:t,height:e,depth:i,widthSegments:s,heightSegments:r,depthSegments:n};const a=this;s=Math.floor(s),r=Math.floor(r),n=Math.floor(n);const o=[],h=[],l=[],c=[];let u=0,d=0;function p(t,e,i,s,r,n,p,m,y,g,f){const x=n/y,b=p/g,v=n/2,w=p/2,M=m/2,S=y+1,_=g+1;let A=0,T=0;const z=new Bs;for(let n=0;n<_;n++){const a=n*b-w;for(let o=0;o0?1:-1,l.push(z.x,z.y,z.z),c.push(o/y),c.push(1-n/g),A+=1}}for(let t=0;t0&&(e.defines=this.defines),e.vertexShader=this.vertexShader,e.fragmentShader=this.fragmentShader,e.lights=this.lights,e.clipping=this.clipping;const i={};for(const t in this.extensions)!0===this.extensions[t]&&(i[t]=!0);return Object.keys(i).length>0&&(e.extensions=i),e}}class Zn extends Er{constructor(){super(),this.isCamera=!0,this.type="Camera",this.matrixWorldInverse=new ar,this.projectionMatrix=new ar,this.projectionMatrixInverse=new ar,this.coordinateSystem=Oi}copy(t,e){return super.copy(t,e),this.matrixWorldInverse.copy(t.matrixWorldInverse),this.projectionMatrix.copy(t.projectionMatrix),this.projectionMatrixInverse.copy(t.projectionMatrixInverse),this.coordinateSystem=t.coordinateSystem,this}getWorldDirection(t){return super.getWorldDirection(t).negate()}updateMatrixWorld(t){super.updateMatrixWorld(t),this.matrixWorldInverse.copy(this.matrixWorld).invert()}updateWorldMatrix(t,e){super.updateWorldMatrix(t,e),this.matrixWorldInverse.copy(this.matrixWorld).invert()}clone(){return(new this.constructor).copy(this)}}const Gn=new Bs,$n=new Gi,Qn=new Gi;class Kn extends Zn{constructor(t=50,e=1,i=.1,s=2e3){super(),this.isPerspectiveCamera=!0,this.type="PerspectiveCamera",this.fov=t,this.zoom=1,this.near=i,this.far=s,this.focus=10,this.aspect=e,this.view=null,this.filmGauge=35,this.filmOffset=0,this.updateProjectionMatrix()}copy(t,e){return super.copy(t,e),this.fov=t.fov,this.zoom=t.zoom,this.near=t.near,this.far=t.far,this.focus=t.focus,this.aspect=t.aspect,this.view=null===t.view?null:Object.assign({},t.view),this.filmGauge=t.filmGauge,this.filmOffset=t.filmOffset,this}setFocalLength(t){const e=.5*this.getFilmHeight()/t;this.fov=2*Ui*Math.atan(e),this.updateProjectionMatrix()}getFocalLength(){const t=Math.tan(.5*Wi*this.fov);return.5*this.getFilmHeight()/t}getEffectiveFOV(){return 2*Ui*Math.atan(Math.tan(.5*Wi*this.fov)/this.zoom)}getFilmWidth(){return this.filmGauge*Math.min(this.aspect,1)}getFilmHeight(){return this.filmGauge/Math.max(this.aspect,1)}getViewBounds(t,e,i){Gn.set(-1,-1,.5).applyMatrix4(this.projectionMatrixInverse),e.set(Gn.x,Gn.y).multiplyScalar(-t/Gn.z),Gn.set(1,1,.5).applyMatrix4(this.projectionMatrixInverse),i.set(Gn.x,Gn.y).multiplyScalar(-t/Gn.z)}getViewSize(t,e){return this.getViewBounds(t,$n,Qn),e.subVectors(Qn,$n)}setViewOffset(t,e,i,s,r,n){this.aspect=t/e,null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=t,this.view.fullHeight=e,this.view.offsetX=i,this.view.offsetY=s,this.view.width=r,this.view.height=n,this.updateProjectionMatrix()}clearViewOffset(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const t=this.near;let e=t*Math.tan(.5*Wi*this.fov)/this.zoom,i=2*e,s=this.aspect*i,r=-.5*s;const n=this.view;if(null!==this.view&&this.view.enabled){const t=n.fullWidth,a=n.fullHeight;r+=n.offsetX*s/t,e-=n.offsetY*i/a,s*=n.width/t,i*=n.height/a}const a=this.filmOffset;0!==a&&(r+=t*a/this.getFilmWidth()),this.projectionMatrix.makePerspective(r,r+s,e,e-i,t,this.far,this.coordinateSystem),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(t){const e=super.toJSON(t);return e.object.fov=this.fov,e.object.zoom=this.zoom,e.object.near=this.near,e.object.far=this.far,e.object.focus=this.focus,e.object.aspect=this.aspect,null!==this.view&&(e.object.view=Object.assign({},this.view)),e.object.filmGauge=this.filmGauge,e.object.filmOffset=this.filmOffset,e}}const ta=-90;class ea extends Er{constructor(t,e,i){super(),this.type="CubeCamera",this.renderTarget=i,this.coordinateSystem=null,this.activeMipmapLevel=0;const s=new Kn(ta,1,t,e);s.layers=this.layers,this.add(s);const r=new Kn(ta,1,t,e);r.layers=this.layers,this.add(r);const n=new Kn(ta,1,t,e);n.layers=this.layers,this.add(n);const a=new Kn(ta,1,t,e);a.layers=this.layers,this.add(a);const o=new Kn(ta,1,t,e);o.layers=this.layers,this.add(o);const h=new Kn(ta,1,t,e);h.layers=this.layers,this.add(h)}updateCoordinateSystem(){const t=this.coordinateSystem,e=this.children.concat(),[i,s,r,n,a,o]=e;for(const t of e)this.remove(t);if(t===Oi)i.up.set(0,1,0),i.lookAt(1,0,0),s.up.set(0,1,0),s.lookAt(-1,0,0),r.up.set(0,0,-1),r.lookAt(0,1,0),n.up.set(0,0,1),n.lookAt(0,-1,0),a.up.set(0,1,0),a.lookAt(0,0,1),o.up.set(0,1,0),o.lookAt(0,0,-1);else{if(t!==Ni)throw new Error("THREE.CubeCamera.updateCoordinateSystem(): Invalid coordinate system: "+t);i.up.set(0,-1,0),i.lookAt(-1,0,0),s.up.set(0,-1,0),s.lookAt(1,0,0),r.up.set(0,0,1),r.lookAt(0,1,0),n.up.set(0,0,-1),n.lookAt(0,-1,0),a.up.set(0,-1,0),a.lookAt(0,0,1),o.up.set(0,-1,0),o.lookAt(0,0,-1)}for(const t of e)this.add(t),t.updateMatrixWorld()}update(t,e){null===this.parent&&this.updateMatrixWorld();const{renderTarget:i,activeMipmapLevel:s}=this;this.coordinateSystem!==t.coordinateSystem&&(this.coordinateSystem=t.coordinateSystem,this.updateCoordinateSystem());const[r,n,a,o,h,l]=this.children,c=t.getRenderTarget(),u=t.getActiveCubeFace(),d=t.getActiveMipmapLevel(),p=t.xr.enabled;t.xr.enabled=!1;const m=i.texture.generateMipmaps;i.texture.generateMipmaps=!1,t.setRenderTarget(i,0,s),t.render(e,r),t.setRenderTarget(i,1,s),t.render(e,n),t.setRenderTarget(i,2,s),t.render(e,a),t.setRenderTarget(i,3,s),t.render(e,o),t.setRenderTarget(i,4,s),t.render(e,h),i.texture.generateMipmaps=m,t.setRenderTarget(i,5,s),t.render(e,l),t.setRenderTarget(c,u,d),t.xr.enabled=p,i.texture.needsPMREMUpdate=!0}}class ia extends ws{constructor(t=[],e=301,i,s,r,n,a,o,h,l){super(t,e,i,s,r,n,a,o,h,l),this.isCubeTexture=!0,this.flipY=!1}get images(){return this.image}set images(t){this.image=t}}class sa extends _s{constructor(t=1,e={}){super(t,t,e),this.isWebGLCubeRenderTarget=!0;const i={width:t,height:t,depth:1},s=[i,i,i,i,i,i];this.texture=new ia(s,e.mapping,e.wrapS,e.wrapT,e.magFilter,e.minFilter,e.format,e.type,e.anisotropy,e.colorSpace),this.texture.isRenderTargetTexture=!0,this.texture.generateMipmaps=void 0!==e.generateMipmaps&&e.generateMipmaps,this.texture.minFilter=void 0!==e.minFilter?e.minFilter:wt}fromEquirectangularTexture(t,e){this.texture.type=e.type,this.texture.colorSpace=e.colorSpace,this.texture.generateMipmaps=e.generateMipmaps,this.texture.minFilter=e.minFilter,this.texture.magFilter=e.magFilter;const i={uniforms:{tEquirect:{value:null}},vertexShader:"\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include \n\t\t\t\t\t#include \n\n\t\t\t\t}\n\t\t\t",fragmentShader:"\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include \n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t"},s=new Dn(5,5,5),r=new Yn({name:"CubemapFromEquirect",uniforms:Hn(i.uniforms),vertexShader:i.vertexShader,fragmentShader:i.fragmentShader,side:1,blending:0});r.uniforms.tEquirect.value=e;const n=new Wn(s,r),a=e.minFilter;e.minFilter===_t&&(e.minFilter=wt);return new ea(1,10,this).update(t,n),e.minFilter=a,n.geometry.dispose(),n.material.dispose(),this}clear(t,e=!0,i=!0,s=!0){const r=t.getRenderTarget();for(let r=0;r<6;r++)t.setRenderTarget(this,r),t.clear(e,i,s);t.setRenderTarget(r)}}class ra extends Er{constructor(){super(),this.isGroup=!0,this.type="Group"}}const na={type:"move"};class aa{constructor(){this._targetRay=null,this._grip=null,this._hand=null}getHandSpace(){return null===this._hand&&(this._hand=new ra,this._hand.matrixAutoUpdate=!1,this._hand.visible=!1,this._hand.joints={},this._hand.inputState={pinching:!1}),this._hand}getTargetRaySpace(){return null===this._targetRay&&(this._targetRay=new ra,this._targetRay.matrixAutoUpdate=!1,this._targetRay.visible=!1,this._targetRay.hasLinearVelocity=!1,this._targetRay.linearVelocity=new Bs,this._targetRay.hasAngularVelocity=!1,this._targetRay.angularVelocity=new Bs),this._targetRay}getGripSpace(){return null===this._grip&&(this._grip=new ra,this._grip.matrixAutoUpdate=!1,this._grip.visible=!1,this._grip.hasLinearVelocity=!1,this._grip.linearVelocity=new Bs,this._grip.hasAngularVelocity=!1,this._grip.angularVelocity=new Bs),this._grip}dispatchEvent(t){return null!==this._targetRay&&this._targetRay.dispatchEvent(t),null!==this._grip&&this._grip.dispatchEvent(t),null!==this._hand&&this._hand.dispatchEvent(t),this}connect(t){if(t&&t.hand){const e=this._hand;if(e)for(const i of t.hand.values())this._getHandJoint(e,i)}return this.dispatchEvent({type:"connected",data:t}),this}disconnect(t){return this.dispatchEvent({type:"disconnected",data:t}),null!==this._targetRay&&(this._targetRay.visible=!1),null!==this._grip&&(this._grip.visible=!1),null!==this._hand&&(this._hand.visible=!1),this}update(t,e,i){let s=null,r=null,n=null;const a=this._targetRay,o=this._grip,h=this._hand;if(t&&"visible-blurred"!==e.session.visibilityState){if(h&&t.hand){n=!0;for(const s of t.hand.values()){const t=e.getJointPose(s,i),r=this._getHandJoint(h,s);null!==t&&(r.matrix.fromArray(t.transform.matrix),r.matrix.decompose(r.position,r.rotation,r.scale),r.matrixWorldNeedsUpdate=!0,r.jointRadius=t.radius),r.visible=null!==t}const s=h.joints["index-finger-tip"],r=h.joints["thumb-tip"],a=s.position.distanceTo(r.position),o=.02,l=.005;h.inputState.pinching&&a>o+l?(h.inputState.pinching=!1,this.dispatchEvent({type:"pinchend",handedness:t.handedness,target:this})):!h.inputState.pinching&&a<=o-l&&(h.inputState.pinching=!0,this.dispatchEvent({type:"pinchstart",handedness:t.handedness,target:this}))}else null!==o&&t.gripSpace&&(r=e.getPose(t.gripSpace,i),null!==r&&(o.matrix.fromArray(r.transform.matrix),o.matrix.decompose(o.position,o.rotation,o.scale),o.matrixWorldNeedsUpdate=!0,r.linearVelocity?(o.hasLinearVelocity=!0,o.linearVelocity.copy(r.linearVelocity)):o.hasLinearVelocity=!1,r.angularVelocity?(o.hasAngularVelocity=!0,o.angularVelocity.copy(r.angularVelocity)):o.hasAngularVelocity=!1));null!==a&&(s=e.getPose(t.targetRaySpace,i),null===s&&null!==r&&(s=r),null!==s&&(a.matrix.fromArray(s.transform.matrix),a.matrix.decompose(a.position,a.rotation,a.scale),a.matrixWorldNeedsUpdate=!0,s.linearVelocity?(a.hasLinearVelocity=!0,a.linearVelocity.copy(s.linearVelocity)):a.hasLinearVelocity=!1,s.angularVelocity?(a.hasAngularVelocity=!0,a.angularVelocity.copy(s.angularVelocity)):a.hasAngularVelocity=!1,this.dispatchEvent(na)))}return null!==a&&(a.visible=null!==s),null!==o&&(o.visible=null!==r),null!==h&&(h.visible=null!==n),this}_getHandJoint(t,e){if(void 0===t.joints[e.jointName]){const i=new ra;i.matrixAutoUpdate=!1,i.visible=!1,t.joints[e.jointName]=i,t.add(i)}return t.joints[e.jointName]}}class oa{constructor(t,e=25e-5){this.isFogExp2=!0,this.name="",this.color=new Qr(t),this.density=e}clone(){return new oa(this.color,this.density)}toJSON(){return{type:"FogExp2",name:this.name,color:this.color.getHex(),density:this.density}}}class ha{constructor(t,e=1,i=1e3){this.isFog=!0,this.name="",this.color=new Qr(t),this.near=e,this.far=i}clone(){return new ha(this.color,this.near,this.far)}toJSON(){return{type:"Fog",name:this.name,color:this.color.getHex(),near:this.near,far:this.far}}}class la extends Er{constructor(){super(),this.isScene=!0,this.type="Scene",this.background=null,this.environment=null,this.fog=null,this.backgroundBlurriness=0,this.backgroundIntensity=1,this.backgroundRotation=new gr,this.environmentIntensity=1,this.environmentRotation=new gr,this.overrideMaterial=null,"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}copy(t,e){return super.copy(t,e),null!==t.background&&(this.background=t.background.clone()),null!==t.environment&&(this.environment=t.environment.clone()),null!==t.fog&&(this.fog=t.fog.clone()),this.backgroundBlurriness=t.backgroundBlurriness,this.backgroundIntensity=t.backgroundIntensity,this.backgroundRotation.copy(t.backgroundRotation),this.environmentIntensity=t.environmentIntensity,this.environmentRotation.copy(t.environmentRotation),null!==t.overrideMaterial&&(this.overrideMaterial=t.overrideMaterial.clone()),this.matrixAutoUpdate=t.matrixAutoUpdate,this}toJSON(t){const e=super.toJSON(t);return null!==this.fog&&(e.object.fog=this.fog.toJSON()),this.backgroundBlurriness>0&&(e.object.backgroundBlurriness=this.backgroundBlurriness),1!==this.backgroundIntensity&&(e.object.backgroundIntensity=this.backgroundIntensity),e.object.backgroundRotation=this.backgroundRotation.toArray(),1!==this.environmentIntensity&&(e.object.environmentIntensity=this.environmentIntensity),e.object.environmentRotation=this.environmentRotation.toArray(),e}}class ca{constructor(t,e){this.isInterleavedBuffer=!0,this.array=t,this.stride=e,this.count=void 0!==t?t.length/e:0,this.usage=_i,this.updateRanges=[],this.version=0,this.uuid=Di()}onUploadCallback(){}set needsUpdate(t){!0===t&&this.version++}setUsage(t){return this.usage=t,this}addUpdateRange(t,e){this.updateRanges.push({start:t,count:e})}clearUpdateRanges(){this.updateRanges.length=0}copy(t){return this.array=new t.array.constructor(t.array),this.count=t.count,this.stride=t.stride,this.usage=t.usage,this}copyAt(t,e,i){t*=this.stride,i*=e.stride;for(let s=0,r=this.stride;st.far||e.push({distance:o,point:ya.clone(),uv:Xr.getInterpolation(ya,wa,Ma,Sa,_a,Aa,Ta,new Gi),face:null,object:this})}copy(t,e){return super.copy(t,e),void 0!==t.center&&this.center.copy(t.center),this.material=t.material,this}}function Ca(t,e,i,s,r,n){xa.subVectors(t,i).addScalar(.5).multiply(s),void 0!==r?(ba.x=n*xa.x-r*xa.y,ba.y=r*xa.x+n*xa.y):ba.copy(xa),t.copy(e),t.x+=ba.x,t.y+=ba.y,t.applyMatrix4(va)}const Ia=new Bs,Ba=new Bs;class ka extends Er{constructor(){super(),this.isLOD=!0,this._currentLevel=0,this.type="LOD",Object.defineProperties(this,{levels:{enumerable:!0,value:[]}}),this.autoUpdate=!0}copy(t){super.copy(t,!1);const e=t.levels;for(let t=0,i=e.length;t0){let i,s;for(i=1,s=e.length;i0){Ia.setFromMatrixPosition(this.matrixWorld);const i=t.ray.origin.distanceTo(Ia);this.getObjectForDistance(i).raycast(t,e)}}update(t){const e=this.levels;if(e.length>1){Ia.setFromMatrixPosition(t.matrixWorld),Ba.setFromMatrixPosition(this.matrixWorld);const i=Ia.distanceTo(Ba)/t.zoom;let s,r;for(e[0].object.visible=!0,s=1,r=e.length;s=t))break;e[s-1].object.visible=!1,e[s].object.visible=!0}for(this._currentLevel=s-1;s1?null:e.copy(t.start).addScaledVector(i,r)}intersectsLine(t){const e=this.distanceToPoint(t.start),i=this.distanceToPoint(t.end);return e<0&&i>0||i<0&&e>0}intersectsBox(t){return t.intersectsPlane(this)}intersectsSphere(t){return t.intersectsPlane(this)}coplanarPoint(t){return t.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(t,e){const i=e||ro.getNormalMatrix(t),s=this.coplanarPoint(io).applyMatrix4(t),r=this.normal.applyMatrix3(i).normalize();return this.constant=-s.dot(r),this}translate(t){return this.constant-=t.dot(this.normal),this}equals(t){return t.normal.equals(this.normal)&&t.constant===this.constant}clone(){return(new this.constructor).copy(this)}}const ao=new $s,oo=new Bs;class ho{constructor(t=new no,e=new no,i=new no,s=new no,r=new no,n=new no){this.planes=[t,e,i,s,r,n]}set(t,e,i,s,r,n){const a=this.planes;return a[0].copy(t),a[1].copy(e),a[2].copy(i),a[3].copy(s),a[4].copy(r),a[5].copy(n),this}copy(t){const e=this.planes;for(let i=0;i<6;i++)e[i].copy(t.planes[i]);return this}setFromProjectionMatrix(t,e=2e3){const i=this.planes,s=t.elements,r=s[0],n=s[1],a=s[2],o=s[3],h=s[4],l=s[5],c=s[6],u=s[7],d=s[8],p=s[9],m=s[10],y=s[11],g=s[12],f=s[13],x=s[14],b=s[15];if(i[0].setComponents(o-r,u-h,y-d,b-g).normalize(),i[1].setComponents(o+r,u+h,y+d,b+g).normalize(),i[2].setComponents(o+n,u+l,y+p,b+f).normalize(),i[3].setComponents(o-n,u-l,y-p,b-f).normalize(),i[4].setComponents(o-a,u-c,y-m,b-x).normalize(),e===Oi)i[5].setComponents(o+a,u+c,y+m,b+x).normalize();else{if(e!==Ni)throw new Error("THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: "+e);i[5].setComponents(a,c,m,x).normalize()}return this}intersectsObject(t){if(void 0!==t.boundingSphere)null===t.boundingSphere&&t.computeBoundingSphere(),ao.copy(t.boundingSphere).applyMatrix4(t.matrixWorld);else{const e=t.geometry;null===e.boundingSphere&&e.computeBoundingSphere(),ao.copy(e.boundingSphere).applyMatrix4(t.matrixWorld)}return this.intersectsSphere(ao)}intersectsSprite(t){return ao.center.set(0,0,0),ao.radius=.7071067811865476,ao.applyMatrix4(t.matrixWorld),this.intersectsSphere(ao)}intersectsSphere(t){const e=this.planes,i=t.center,s=-t.radius;for(let t=0;t<6;t++){if(e[t].distanceToPoint(i)0?t.max.x:t.min.x,oo.y=s.normal.y>0?t.max.y:t.min.y,oo.z=s.normal.z>0?t.max.z:t.min.z,s.distanceToPoint(oo)<0)return!1}return!0}containsPoint(t){const e=this.planes;for(let i=0;i<6;i++)if(e[i].distanceToPoint(t)<0)return!1;return!0}clone(){return(new this.constructor).copy(this)}}function lo(t,e){return t-e}function co(t,e){return t.z-e.z}function uo(t,e){return e.z-t.z}class po{constructor(){this.index=0,this.pool=[],this.list=[]}push(t,e,i,s){const r=this.pool,n=this.list;this.index>=r.length&&r.push({start:-1,count:-1,z:-1,index:-1});const a=r[this.index];n.push(a),this.index++,a.start=t,a.count=e,a.z=i,a.index=s}reset(){this.list.length=0,this.index=0}}const mo=new ar,yo=new Qr(1,1,1),go=new ho,fo=new Es,xo=new $s,bo=new Bs,vo=new Bs,wo=new Bs,Mo=new po,So=new Wn,_o=[];function Ao(t,e,i=0){const s=e.itemSize;if(t.isInterleavedBufferAttribute||t.array.constructor!==e.array.constructor){const r=t.count;for(let n=0;n65535?new Uint32Array(s):new Uint16Array(s);e.setIndex(new dn(t,1))}this._geometryInitialized=!0}}_validateGeometry(t){const e=this.geometry;if(Boolean(t.getIndex())!==Boolean(e.getIndex()))throw new Error('THREE.BatchedMesh: All geometries must consistently have "index".');for(const i in e.attributes){if(!t.hasAttribute(i))throw new Error(`THREE.BatchedMesh: Added geometry missing "${i}". All geometries must have consistent attributes.`);const s=t.getAttribute(i),r=e.getAttribute(i);if(s.itemSize!==r.itemSize||s.normalized!==r.normalized)throw new Error("THREE.BatchedMesh: All attributes must have a consistent itemSize and normalized value.")}}validateInstanceId(t){const e=this._instanceInfo;if(t<0||t>=e.length||!1===e[t].active)throw new Error(`THREE.BatchedMesh: Invalid instanceId ${t}. Instance is either out of range or has been deleted.`)}validateGeometryId(t){const e=this._geometryInfo;if(t<0||t>=e.length||!1===e[t].active)throw new Error(`THREE.BatchedMesh: Invalid geometryId ${t}. Geometry is either out of range or has been deleted.`)}setCustomSort(t){return this.customSort=t,this}computeBoundingBox(){null===this.boundingBox&&(this.boundingBox=new Es);const t=this.boundingBox,e=this._instanceInfo;t.makeEmpty();for(let i=0,s=e.length;i=this.maxInstanceCount&&0===this._availableInstanceIds.length)throw new Error("THREE.BatchedMesh: Maximum item count reached.");const e={visible:!0,active:!0,geometryIndex:t};let i=null;this._availableInstanceIds.length>0?(this._availableInstanceIds.sort(lo),i=this._availableInstanceIds.shift(),this._instanceInfo[i]=e):(i=this._instanceInfo.length,this._instanceInfo.push(e));const s=this._matricesTexture;mo.identity().toArray(s.image.data,16*i),s.needsUpdate=!0;const r=this._colorsTexture;return r&&(yo.toArray(r.image.data,4*i),r.needsUpdate=!0),this._visibilityChanged=!0,i}addGeometry(t,e=-1,i=-1){this._initializeGeometry(t),this._validateGeometry(t);const s={vertexStart:-1,vertexCount:-1,reservedVertexCount:-1,indexStart:-1,indexCount:-1,reservedIndexCount:-1,start:-1,count:-1,boundingBox:null,boundingSphere:null,active:!0},r=this._geometryInfo;s.vertexStart=this._nextVertexStart,s.reservedVertexCount=-1===e?t.getAttribute("position").count:e;const n=t.getIndex();if(null!==n&&(s.indexStart=this._nextIndexStart,s.reservedIndexCount=-1===i?n.count:i),-1!==s.indexStart&&s.indexStart+s.reservedIndexCount>this._maxIndexCount||s.vertexStart+s.reservedVertexCount>this._maxVertexCount)throw new Error("THREE.BatchedMesh: Reserved space request exceeds the maximum buffer size.");let a;return this._availableGeometryIds.length>0?(this._availableGeometryIds.sort(lo),a=this._availableGeometryIds.shift(),r[a]=s):(a=this._geometryCount,this._geometryCount++,r.push(s)),this.setGeometryAt(a,t),this._nextIndexStart=s.indexStart+s.reservedIndexCount,this._nextVertexStart=s.vertexStart+s.reservedVertexCount,a}setGeometryAt(t,e){if(t>=this._geometryCount)throw new Error("THREE.BatchedMesh: Maximum geometry count reached.");this._validateGeometry(e);const i=this.geometry,s=null!==i.getIndex(),r=i.getIndex(),n=e.getIndex(),a=this._geometryInfo[t];if(s&&n.count>a.reservedIndexCount||e.attributes.position.count>a.reservedVertexCount)throw new Error("THREE.BatchedMesh: Reserved space not large enough for provided geometry.");const o=a.vertexStart,h=a.reservedVertexCount;a.vertexCount=e.getAttribute("position").count;for(const t in i.attributes){const s=e.getAttribute(t),r=i.getAttribute(t);Ao(s,r,o);const n=s.itemSize;for(let t=s.count,e=h;t=e.length||!1===e[t].active)return this;const i=this._instanceInfo;for(let e=0,s=i.length;ee)).sort(((t,e)=>i[t].vertexStart-i[e].vertexStart)),r=this.geometry;for(let n=0,a=i.length;n=this._geometryCount)return null;const i=this.geometry,s=this._geometryInfo[t];if(null===s.boundingBox){const t=new Es,e=i.index,r=i.attributes.position;for(let i=s.start,n=s.start+s.count;i=this._geometryCount)return null;const i=this.geometry,s=this._geometryInfo[t];if(null===s.boundingSphere){const e=new $s;this.getBoundingBoxAt(t,fo),fo.getCenter(e.center);const r=i.index,n=i.attributes.position;let a=0;for(let t=s.start,i=s.start+s.count;tt.active));if(Math.max(...i.map((t=>t.vertexStart+t.reservedVertexCount)))>t)throw new Error(`BatchedMesh: Geometry vertex values are being used outside the range ${e}. Cannot shrink further.`);if(this.geometry.index){if(Math.max(...i.map((t=>t.indexStart+t.reservedIndexCount)))>e)throw new Error(`BatchedMesh: Geometry index values are being used outside the range ${e}. Cannot shrink further.`)}const s=this.geometry;s.dispose(),this._maxVertexCount=t,this._maxIndexCount=e,this._geometryInitialized&&(this._geometryInitialized=!1,this.geometry=new In,this._initializeGeometry(s));const r=this.geometry;s.index&&To(s.index.array,r.index.array);for(const t in s.attributes)To(s.attributes[t].array,r.attributes[t].array)}raycast(t,e){const i=this._instanceInfo,s=this._geometryInfo,r=this.matrixWorld,n=this.geometry;So.material=this.material,So.geometry.index=n.index,So.geometry.attributes=n.attributes,null===So.geometry.boundingBox&&(So.geometry.boundingBox=new Es),null===So.geometry.boundingSphere&&(So.geometry.boundingSphere=new $s);for(let n=0,a=i.length;n({...t,boundingBox:null!==t.boundingBox?t.boundingBox.clone():null,boundingSphere:null!==t.boundingSphere?t.boundingSphere.clone():null}))),this._instanceInfo=t._instanceInfo.map((t=>({...t}))),this._maxInstanceCount=t._maxInstanceCount,this._maxVertexCount=t._maxVertexCount,this._maxIndexCount=t._maxIndexCount,this._geometryInitialized=t._geometryInitialized,this._geometryCount=t._geometryCount,this._multiDrawCounts=t._multiDrawCounts.slice(),this._multiDrawStarts=t._multiDrawStarts.slice(),this._matricesTexture=t._matricesTexture.clone(),this._matricesTexture.image.data=this._matricesTexture.image.data.slice(),null!==this._colorsTexture&&(this._colorsTexture=t._colorsTexture.clone(),this._colorsTexture.image.data=this._colorsTexture.image.data.slice()),this}dispose(){this.geometry.dispose(),this._matricesTexture.dispose(),this._matricesTexture=null,this._indirectTexture.dispose(),this._indirectTexture=null,null!==this._colorsTexture&&(this._colorsTexture.dispose(),this._colorsTexture=null)}onBeforeRender(t,e,i,s,r){if(!this._visibilityChanged&&!this.perObjectFrustumCulled&&!this.sortObjects)return;const n=s.getIndex(),a=null===n?1:n.array.BYTES_PER_ELEMENT,o=this._instanceInfo,h=this._multiDrawStarts,l=this._multiDrawCounts,c=this._geometryInfo,u=this.perObjectFrustumCulled,d=this._indirectTexture,p=d.image.data;u&&(mo.multiplyMatrices(i.projectionMatrix,i.matrixWorldInverse).multiply(this.matrixWorld),go.setFromProjectionMatrix(mo,t.coordinateSystem));let m=0;if(this.sortObjects){mo.copy(this.matrixWorld).invert(),bo.setFromMatrixPosition(i.matrixWorld).applyMatrix4(mo),vo.set(0,0,-1).transformDirection(i.matrixWorld).transformDirection(mo);for(let t=0,e=o.length;t0){const i=t[e[0]];if(void 0!==i){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,e=i.length;ts)return;Po.applyMatrix4(t.matrixWorld);const h=e.ray.origin.distanceTo(Po);return he.far?void 0:{distance:h,point:Oo.clone().applyMatrix4(t.matrixWorld),index:a,face:null,faceIndex:null,barycoord:null,object:t}}const Lo=new Bs,Vo=new Bs;class jo extends No{constructor(t,e){super(t,e),this.isLineSegments=!0,this.type="LineSegments"}computeLineDistances(){const t=this.geometry;if(null===t.index){const e=t.attributes.position,i=[];for(let t=0,s=e.count;t0){const i=t[e[0]];if(void 0!==i){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,e=i.length;tr.far)return;n.push({distance:h,distanceToRay:Math.sqrt(o),point:i,index:e,face:null,faceIndex:null,barycoord:null,object:a})}}class Zo extends ws{constructor(t,e,i,s,r=1006,n=1006,a,o,h){super(t,e,i,s,r,n,a,o,h),this.isVideoTexture=!0,this.generateMipmaps=!1;const l=this;"requestVideoFrameCallback"in t&&t.requestVideoFrameCallback((function e(){l.needsUpdate=!0,t.requestVideoFrameCallback(e)}))}clone(){return new this.constructor(this.image).copy(this)}update(){const t=this.image;!1==="requestVideoFrameCallback"in t&&t.readyState>=t.HAVE_CURRENT_DATA&&(this.needsUpdate=!0)}}class Go extends Zo{constructor(t,e,i,s,r,n,a,o){super({},t,e,i,s,r,n,a,o),this.isVideoFrameTexture=!0}update(){}clone(){return(new this.constructor).copy(this)}setFrame(t){this.image=t,this.needsUpdate=!0}}class $o extends ws{constructor(t,e){super({width:t,height:e}),this.isFramebufferTexture=!0,this.magFilter=gt,this.minFilter=gt,this.generateMipmaps=!1,this.needsUpdate=!0}}class Qo extends ws{constructor(t,e,i,s,r,n,a,o,h,l,c,u){super(null,n,a,o,h,l,s,r,c,u),this.isCompressedTexture=!0,this.image={width:e,height:i},this.mipmaps=t,this.flipY=!1,this.generateMipmaps=!1}}class Ko extends Qo{constructor(t,e,i,s,r,n){super(t,e,i,r,n),this.isCompressedArrayTexture=!0,this.image.depth=s,this.wrapR=mt,this.layerUpdates=new Set}addLayerUpdate(t){this.layerUpdates.add(t)}clearLayerUpdates(){this.layerUpdates.clear()}}class th extends Qo{constructor(t,e,i){super(void 0,t[0].width,t[0].height,e,i,ht),this.isCompressedCubeTexture=!0,this.isCubeTexture=!0,this.image=t}}class eh extends ws{constructor(t,e,i,s,r,n,a,o,h){super(t,e,i,s,r,n,a,o,h),this.isCanvasTexture=!0,this.needsUpdate=!0}}class ih extends ws{constructor(t,e,i=1014,s,r,n,a=1003,o=1003,h,l=1026){if(l!==Dt&&1027!==l)throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");super(null,s,r,n,a,o,l,i,h),this.isDepthTexture=!0,this.image={width:t,height:e},this.flipY=!1,this.generateMipmaps=!1,this.compareFunction=null}copy(t){return super.copy(t),this.source=new xs(Object.assign({},t.image)),this.compareFunction=t.compareFunction,this}toJSON(t){const e=super.toJSON(t);return null!==this.compareFunction&&(e.compareFunction=this.compareFunction),e}}class sh{constructor(){this.type="Curve",this.arcLengthDivisions=200,this.needsUpdate=!1,this.cacheArcLengths=null}getPoint(){console.warn("THREE.Curve: .getPoint() not implemented.")}getPointAt(t,e){const i=this.getUtoTmapping(t);return this.getPoint(i,e)}getPoints(t=5){const e=[];for(let i=0;i<=t;i++)e.push(this.getPoint(i/t));return e}getSpacedPoints(t=5){const e=[];for(let i=0;i<=t;i++)e.push(this.getPointAt(i/t));return e}getLength(){const t=this.getLengths();return t[t.length-1]}getLengths(t=this.arcLengthDivisions){if(this.cacheArcLengths&&this.cacheArcLengths.length===t+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;const e=[];let i,s=this.getPoint(0),r=0;e.push(0);for(let n=1;n<=t;n++)i=this.getPoint(n/t),r+=i.distanceTo(s),e.push(r),s=i;return this.cacheArcLengths=e,e}updateArcLengths(){this.needsUpdate=!0,this.getLengths()}getUtoTmapping(t,e=null){const i=this.getLengths();let s=0;const r=i.length;let n;n=e||t*i[r-1];let a,o=0,h=r-1;for(;o<=h;)if(s=Math.floor(o+(h-o)/2),a=i[s]-n,a<0)o=s+1;else{if(!(a>0)){h=s;break}h=s-1}if(s=h,i[s]===n)return s/(r-1);const l=i[s];return(s+(n-l)/(i[s+1]-l))/(r-1)}getTangent(t,e){const i=1e-4;let s=t-i,r=t+i;s<0&&(s=0),r>1&&(r=1);const n=this.getPoint(s),a=this.getPoint(r),o=e||(n.isVector2?new Gi:new Bs);return o.copy(a).sub(n).normalize(),o}getTangentAt(t,e){const i=this.getUtoTmapping(t);return this.getTangent(i,e)}computeFrenetFrames(t,e=!1){const i=new Bs,s=[],r=[],n=[],a=new Bs,o=new ar;for(let e=0;e<=t;e++){const i=e/t;s[e]=this.getTangentAt(i,new Bs)}r[0]=new Bs,n[0]=new Bs;let h=Number.MAX_VALUE;const l=Math.abs(s[0].x),c=Math.abs(s[0].y),u=Math.abs(s[0].z);l<=h&&(h=l,i.set(1,0,0)),c<=h&&(h=c,i.set(0,1,0)),u<=h&&i.set(0,0,1),a.crossVectors(s[0],i).normalize(),r[0].crossVectors(s[0],a),n[0].crossVectors(s[0],r[0]);for(let e=1;e<=t;e++){if(r[e]=r[e-1].clone(),n[e]=n[e-1].clone(),a.crossVectors(s[e-1],s[e]),a.length()>Number.EPSILON){a.normalize();const t=Math.acos(Hi(s[e-1].dot(s[e]),-1,1));r[e].applyMatrix4(o.makeRotationAxis(a,t))}n[e].crossVectors(s[e],r[e])}if(!0===e){let e=Math.acos(Hi(r[0].dot(r[t]),-1,1));e/=t,s[0].dot(a.crossVectors(r[0],r[t]))>0&&(e=-e);for(let i=1;i<=t;i++)r[i].applyMatrix4(o.makeRotationAxis(s[i],e*i)),n[i].crossVectors(s[i],r[i])}return{tangents:s,normals:r,binormals:n}}clone(){return(new this.constructor).copy(this)}copy(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}toJSON(){const t={metadata:{version:4.6,type:"Curve",generator:"Curve.toJSON"}};return t.arcLengthDivisions=this.arcLengthDivisions,t.type=this.type,t}fromJSON(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}}class rh extends sh{constructor(t=0,e=0,i=1,s=1,r=0,n=2*Math.PI,a=!1,o=0){super(),this.isEllipseCurve=!0,this.type="EllipseCurve",this.aX=t,this.aY=e,this.xRadius=i,this.yRadius=s,this.aStartAngle=r,this.aEndAngle=n,this.aClockwise=a,this.aRotation=o}getPoint(t,e=new Gi){const i=e,s=2*Math.PI;let r=this.aEndAngle-this.aStartAngle;const n=Math.abs(r)s;)r-=s;r0?0:(Math.floor(Math.abs(h)/r)+1)*r:0===l&&h===r-1&&(h=r-2,l=1),this.closed||h>0?a=s[(h-1)%r]:(oh.subVectors(s[0],s[1]).add(s[0]),a=oh);const c=s[h%r],u=s[(h+1)%r];if(this.closed||h+2s.length-2?s.length-1:n+1],c=s[n>s.length-3?s.length-1:n+2];return i.set(dh(a,o.x,h.x,l.x,c.x),dh(a,o.y,h.y,l.y,c.y)),i}copy(t){super.copy(t),this.points=[];for(let e=0,i=t.points.length;e=i){const t=s[r]-i,n=this.curves[r],a=n.getLength(),o=0===a?0:1-t/a;return n.getPointAt(o,e)}r++}return null}getLength(){const t=this.getCurveLengths();return t[t.length-1]}updateArcLengths(){this.needsUpdate=!0,this.cacheLengths=null,this.getCurveLengths()}getCurveLengths(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;const t=[];let e=0;for(let i=0,s=this.curves.length;i1&&!e[e.length-1].equals(e[0])&&e.push(e[0]),e}copy(t){super.copy(t),this.curves=[];for(let e=0,i=t.curves.length;e0){const t=h.getPoint(0);t.equals(this.currentPoint)||this.lineTo(t.x,t.y)}this.curves.push(h);const l=h.getPoint(1);return this.currentPoint.copy(l),this}copy(t){return super.copy(t),this.currentPoint.copy(t.currentPoint),this}toJSON(){const t=super.toJSON();return t.currentPoint=this.currentPoint.toArray(),t}fromJSON(t){return super.fromJSON(t),this.currentPoint.fromArray(t.currentPoint),this}}class Ah extends In{constructor(t=[new Gi(0,-.5),new Gi(.5,0),new Gi(0,.5)],e=12,i=0,s=2*Math.PI){super(),this.type="LatheGeometry",this.parameters={points:t,segments:e,phiStart:i,phiLength:s},e=Math.floor(e),s=Hi(s,0,2*Math.PI);const r=[],n=[],a=[],o=[],h=[],l=1/e,c=new Bs,u=new Gi,d=new Bs,p=new Bs,m=new Bs;let y=0,g=0;for(let e=0;e<=t.length-1;e++)switch(e){case 0:y=t[e+1].x-t[e].x,g=t[e+1].y-t[e].y,d.x=1*g,d.y=-y,d.z=0*g,m.copy(d),d.normalize(),o.push(d.x,d.y,d.z);break;case t.length-1:o.push(m.x,m.y,m.z);break;default:y=t[e+1].x-t[e].x,g=t[e+1].y-t[e].y,d.x=1*g,d.y=-y,d.z=0*g,p.copy(d),d.x+=m.x,d.y+=m.y,d.z+=m.z,d.normalize(),o.push(d.x,d.y,d.z),m.copy(p)}for(let r=0;r<=e;r++){const d=i+r*l*s,p=Math.sin(d),m=Math.cos(d);for(let i=0;i<=t.length-1;i++){c.x=t[i].x*p,c.y=t[i].y,c.z=t[i].x*m,n.push(c.x,c.y,c.z),u.x=r/e,u.y=i/(t.length-1),a.push(u.x,u.y);const s=o[3*i+0]*p,l=o[3*i+1],d=o[3*i+0]*m;h.push(s,l,d)}}for(let i=0;i0||0!==s)&&(l.push(n,a,h),x+=3),(e>0||s!==r-1)&&(l.push(a,o,h),x+=3)}h.addGroup(g,x,0),g+=x}(),!1===n&&(t>0&&f(!0),e>0&&f(!1)),this.setIndex(l),this.setAttribute("position",new wn(c,3)),this.setAttribute("normal",new wn(u,3)),this.setAttribute("uv",new wn(d,2))}copy(t){return super.copy(t),this.parameters=Object.assign({},t.parameters),this}static fromJSON(t){return new Ch(t.radiusTop,t.radiusBottom,t.height,t.radialSegments,t.heightSegments,t.openEnded,t.thetaStart,t.thetaLength)}}class Ih extends Ch{constructor(t=1,e=1,i=32,s=1,r=!1,n=0,a=2*Math.PI){super(0,t,e,i,s,r,n,a),this.type="ConeGeometry",this.parameters={radius:t,height:e,radialSegments:i,heightSegments:s,openEnded:r,thetaStart:n,thetaLength:a}}static fromJSON(t){return new Ih(t.radius,t.height,t.radialSegments,t.heightSegments,t.openEnded,t.thetaStart,t.thetaLength)}}class Bh extends In{constructor(t=[],e=[],i=1,s=0){super(),this.type="PolyhedronGeometry",this.parameters={vertices:t,indices:e,radius:i,detail:s};const r=[],n=[];function a(t,e,i,s){const r=s+1,n=[];for(let s=0;s<=r;s++){n[s]=[];const a=t.clone().lerp(i,s/r),o=e.clone().lerp(i,s/r),h=r-s;for(let t=0;t<=h;t++)n[s][t]=0===t&&s===r?a:a.clone().lerp(o,t/h)}for(let t=0;t.9&&a<.1&&(e<.2&&(n[t+0]+=1),i<.2&&(n[t+2]+=1),s<.2&&(n[t+4]+=1))}}()}(),this.setAttribute("position",new wn(r,3)),this.setAttribute("normal",new wn(r.slice(),3)),this.setAttribute("uv",new wn(n,2)),0===s?this.computeVertexNormals():this.normalizeNormals()}copy(t){return super.copy(t),this.parameters=Object.assign({},t.parameters),this}static fromJSON(t){return new Bh(t.vertices,t.indices,t.radius,t.details)}}class kh extends Bh{constructor(t=1,e=0){const i=(1+Math.sqrt(5))/2,s=1/i;super([-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,0,-s,-i,0,-s,i,0,s,-i,0,s,i,-s,-i,0,-s,i,0,s,-i,0,s,i,0,-i,0,-s,i,0,-s,-i,0,s,i,0,s],[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9],t,e),this.type="DodecahedronGeometry",this.parameters={radius:t,detail:e}}static fromJSON(t){return new kh(t.radius,t.detail)}}const Rh=new Bs,Eh=new Bs,Ph=new Bs,Oh=new Xr;class Nh extends In{constructor(t=null,e=1){if(super(),this.type="EdgesGeometry",this.parameters={geometry:t,thresholdAngle:e},null!==t){const i=4,s=Math.pow(10,i),r=Math.cos(Wi*e),n=t.getIndex(),a=t.getAttribute("position"),o=n?n.count:a.count,h=[0,0,0],l=["a","b","c"],c=new Array(3),u={},d=[];for(let t=0;t80*i){o=1/0,h=1/0;let e=-1/0,s=-1/0;for(let n=i;ne&&(e=i),r>s&&(s=r)}l=Math.max(e-o,s-h),l=0!==l?32767/l:0}return Wh(n,a,i,o,h,l,0),a}function Vh(t,e,i,s,r){let n;if(r===function(t,e,i,s){let r=0;for(let n=e,a=i-s;n0)for(let r=e;r=e;r-=s)n=ol(r/s|0,t[r],t[r+1],n);return n&&el(n,n.next)&&(hl(n),n=n.next),n}function jh(t,e){if(!t)return t;e||(e=t);let i,s=t;do{if(i=!1,s.steiner||!el(s,s.next)&&0!==tl(s.prev,s,s.next))s=s.next;else{if(hl(s),s=e=s.prev,s===s.next)break;i=!0}}while(i||s!==e);return e}function Wh(t,e,i,s,r,n,a){if(!t)return;!a&&n&&function(t,e,i,s){let r=t;do{0===r.z&&(r.z=Zh(r.x,r.y,e,i,s)),r.prevZ=r.prev,r.nextZ=r.next,r=r.next}while(r!==t);r.prevZ.nextZ=null,r.prevZ=null,function(t){let e,i=1;do{let s,r=t;t=null;let n=null;for(e=0;r;){e++;let a=r,o=0;for(let t=0;t0||h>0&&a;)0!==o&&(0===h||!a||r.z<=a.z)?(s=r,r=r.nextZ,o--):(s=a,a=a.nextZ,h--),n?n.nextZ=s:t=s,s.prevZ=n,n=s;r=a}n.nextZ=null,i*=2}while(e>1)}(r)}(t,s,r,n);let o=t;for(;t.prev!==t.next;){const h=t.prev,l=t.next;if(n?Dh(t,s,r,n):Uh(t))e.push(h.i,t.i,l.i),hl(t),t=l.next,o=l.next;else if((t=l)===o){a?1===a?Wh(t=Hh(jh(t),e),e,i,s,r,n,2):2===a&&qh(t,e,i,s,r,n):Wh(jh(t),e,i,s,r,n,1);break}}}function Uh(t){const e=t.prev,i=t,s=t.next;if(tl(e,i,s)>=0)return!1;const r=e.x,n=i.x,a=s.x,o=e.y,h=i.y,l=s.y,c=Math.min(r,n,a),u=Math.min(o,h,l),d=Math.max(r,n,a),p=Math.max(o,h,l);let m=s.next;for(;m!==e;){if(m.x>=c&&m.x<=d&&m.y>=u&&m.y<=p&&Qh(r,o,n,h,a,l,m.x,m.y)&&tl(m.prev,m,m.next)>=0)return!1;m=m.next}return!0}function Dh(t,e,i,s){const r=t.prev,n=t,a=t.next;if(tl(r,n,a)>=0)return!1;const o=r.x,h=n.x,l=a.x,c=r.y,u=n.y,d=a.y,p=Math.min(o,h,l),m=Math.min(c,u,d),y=Math.max(o,h,l),g=Math.max(c,u,d),f=Zh(p,m,e,i,s),x=Zh(y,g,e,i,s);let b=t.prevZ,v=t.nextZ;for(;b&&b.z>=f&&v&&v.z<=x;){if(b.x>=p&&b.x<=y&&b.y>=m&&b.y<=g&&b!==r&&b!==a&&Qh(o,c,h,u,l,d,b.x,b.y)&&tl(b.prev,b,b.next)>=0)return!1;if(b=b.prevZ,v.x>=p&&v.x<=y&&v.y>=m&&v.y<=g&&v!==r&&v!==a&&Qh(o,c,h,u,l,d,v.x,v.y)&&tl(v.prev,v,v.next)>=0)return!1;v=v.nextZ}for(;b&&b.z>=f;){if(b.x>=p&&b.x<=y&&b.y>=m&&b.y<=g&&b!==r&&b!==a&&Qh(o,c,h,u,l,d,b.x,b.y)&&tl(b.prev,b,b.next)>=0)return!1;b=b.prevZ}for(;v&&v.z<=x;){if(v.x>=p&&v.x<=y&&v.y>=m&&v.y<=g&&v!==r&&v!==a&&Qh(o,c,h,u,l,d,v.x,v.y)&&tl(v.prev,v,v.next)>=0)return!1;v=v.nextZ}return!0}function Hh(t,e){let i=t;do{const s=i.prev,r=i.next.next;!el(s,r)&&il(s,i,i.next,r)&&nl(s,r)&&nl(r,s)&&(e.push(s.i,i.i,r.i),hl(i),hl(i.next),i=t=r),i=i.next}while(i!==t);return jh(i)}function qh(t,e,i,s,r,n){let a=t;do{let t=a.next.next;for(;t!==a.prev;){if(a.i!==t.i&&Kh(a,t)){let o=al(a,t);return a=jh(a,a.next),o=jh(o,o.next),Wh(a,e,i,s,r,n,0),void Wh(o,e,i,s,r,n,0)}t=t.next}a=a.next}while(a!==t)}function Jh(t,e){let i=t.x-e.x;if(0===i&&(i=t.y-e.y,0===i)){i=(t.next.y-t.y)/(t.next.x-t.x)-(e.next.y-e.y)/(e.next.x-e.x)}return i}function Xh(t,e){const i=function(t,e){let i=e;const s=t.x,r=t.y;let n,a=-1/0;if(el(t,i))return i;do{if(el(t,i.next))return i.next;if(r<=i.y&&r>=i.next.y&&i.next.y!==i.y){const t=i.x+(r-i.y)*(i.next.x-i.x)/(i.next.y-i.y);if(t<=s&&t>a&&(a=t,n=i.x=i.x&&i.x>=h&&s!==i.x&&$h(rn.x||i.x===n.x&&Yh(n,i)))&&(n=i,c=e)}i=i.next}while(i!==o);return n}(t,e);if(!i)return e;const s=al(i,t);return jh(s,s.next),jh(i,i.next)}function Yh(t,e){return tl(t.prev,t,e.prev)<0&&tl(e.next,t,t.next)<0}function Zh(t,e,i,s,r){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=(t-i)*r|0)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=(e-s)*r|0)|e<<8))|e<<4))|e<<2))|e<<1))<<1}function Gh(t){let e=t,i=t;do{(e.x=(t-a)*(n-o)&&(t-a)*(s-o)>=(i-a)*(e-o)&&(i-a)*(n-o)>=(r-a)*(s-o)}function Qh(t,e,i,s,r,n,a,o){return!(t===a&&e===o)&&$h(t,e,i,s,r,n,a,o)}function Kh(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!function(t,e){let i=t;do{if(i.i!==t.i&&i.next.i!==t.i&&i.i!==e.i&&i.next.i!==e.i&&il(i,i.next,t,e))return!0;i=i.next}while(i!==t);return!1}(t,e)&&(nl(t,e)&&nl(e,t)&&function(t,e){let i=t,s=!1;const r=(t.x+e.x)/2,n=(t.y+e.y)/2;do{i.y>n!=i.next.y>n&&i.next.y!==i.y&&r<(i.next.x-i.x)*(n-i.y)/(i.next.y-i.y)+i.x&&(s=!s),i=i.next}while(i!==t);return s}(t,e)&&(tl(t.prev,t,e.prev)||tl(t,e.prev,e))||el(t,e)&&tl(t.prev,t,t.next)>0&&tl(e.prev,e,e.next)>0)}function tl(t,e,i){return(e.y-t.y)*(i.x-e.x)-(e.x-t.x)*(i.y-e.y)}function el(t,e){return t.x===e.x&&t.y===e.y}function il(t,e,i,s){const r=rl(tl(t,e,i)),n=rl(tl(t,e,s)),a=rl(tl(i,s,t)),o=rl(tl(i,s,e));return r!==n&&a!==o||(!(0!==r||!sl(t,i,e))||(!(0!==n||!sl(t,s,e))||(!(0!==a||!sl(i,t,s))||!(0!==o||!sl(i,e,s)))))}function sl(t,e,i){return e.x<=Math.max(t.x,i.x)&&e.x>=Math.min(t.x,i.x)&&e.y<=Math.max(t.y,i.y)&&e.y>=Math.min(t.y,i.y)}function rl(t){return t>0?1:t<0?-1:0}function nl(t,e){return tl(t.prev,t,t.next)<0?tl(t,e,t.next)>=0&&tl(t,t.prev,e)>=0:tl(t,e,t.prev)<0||tl(t,t.next,e)<0}function al(t,e){const i=ll(t.i,t.x,t.y),s=ll(e.i,e.x,e.y),r=t.next,n=e.prev;return t.next=e,e.prev=t,i.next=r,r.prev=i,s.next=i,i.prev=s,n.next=s,s.prev=n,s}function ol(t,e,i,s){const r=ll(t,e,i);return s?(r.next=s.next,r.prev=s,s.next.prev=r,s.next=r):(r.prev=r,r.next=r),r}function hl(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function ll(t,e,i){return{i:t,x:e,y:i,prev:null,next:null,z:0,prevZ:null,nextZ:null,steiner:!1}}class cl{static triangulate(t,e,i=2){return Lh(t,e,i)}}class ul{static area(t){const e=t.length;let i=0;for(let s=e-1,r=0;r2&&t[e-1].equals(t[0])&&t.pop()}function pl(t,e){for(let i=0;iNumber.EPSILON){const u=Math.sqrt(c),d=Math.sqrt(h*h+l*l),p=e.x-o/u,m=e.y+a/u,y=((i.x-l/d-p)*l-(i.y+h/d-m)*h)/(a*l-o*h);s=p+a*y-t.x,r=m+o*y-t.y;const g=s*s+r*r;if(g<=2)return new Gi(s,r);n=Math.sqrt(g/2)}else{let t=!1;a>Number.EPSILON?h>Number.EPSILON&&(t=!0):a<-Number.EPSILON?h<-Number.EPSILON&&(t=!0):Math.sign(o)===Math.sign(l)&&(t=!0),t?(s=-o,r=a,n=Math.sqrt(c)):(s=a,r=o,n=Math.sqrt(c/2))}return new Gi(s/n,r/n)}const k=[];for(let t=0,e=z.length,i=e-1,s=t+1;t=0;t--){const e=t/p,i=c*Math.cos(e*Math.PI/2),s=u*Math.sin(e*Math.PI/2)+d;for(let t=0,e=z.length;t=0;){const s=i;let r=i-1;r<0&&(r=t.length-1);for(let t=0,i=o+2*p;t0)&&d.push(e,r,h),(t!==i-1||o0!=t>0&&this.version++,this._anisotropy=t}get clearcoat(){return this._clearcoat}set clearcoat(t){this._clearcoat>0!=t>0&&this.version++,this._clearcoat=t}get iridescence(){return this._iridescence}set iridescence(t){this._iridescence>0!=t>0&&this.version++,this._iridescence=t}get dispersion(){return this._dispersion}set dispersion(t){this._dispersion>0!=t>0&&this.version++,this._dispersion=t}get sheen(){return this._sheen}set sheen(t){this._sheen>0!=t>0&&this.version++,this._sheen=t}get transmission(){return this._transmission}set transmission(t){this._transmission>0!=t>0&&this.version++,this._transmission=t}copy(t){return super.copy(t),this.defines={STANDARD:"",PHYSICAL:""},this.anisotropy=t.anisotropy,this.anisotropyRotation=t.anisotropyRotation,this.anisotropyMap=t.anisotropyMap,this.clearcoat=t.clearcoat,this.clearcoatMap=t.clearcoatMap,this.clearcoatRoughness=t.clearcoatRoughness,this.clearcoatRoughnessMap=t.clearcoatRoughnessMap,this.clearcoatNormalMap=t.clearcoatNormalMap,this.clearcoatNormalScale.copy(t.clearcoatNormalScale),this.dispersion=t.dispersion,this.ior=t.ior,this.iridescence=t.iridescence,this.iridescenceMap=t.iridescenceMap,this.iridescenceIOR=t.iridescenceIOR,this.iridescenceThicknessRange=[...t.iridescenceThicknessRange],this.iridescenceThicknessMap=t.iridescenceThicknessMap,this.sheen=t.sheen,this.sheenColor.copy(t.sheenColor),this.sheenColorMap=t.sheenColorMap,this.sheenRoughness=t.sheenRoughness,this.sheenRoughnessMap=t.sheenRoughnessMap,this.transmission=t.transmission,this.transmissionMap=t.transmissionMap,this.thickness=t.thickness,this.thicknessMap=t.thicknessMap,this.attenuationDistance=t.attenuationDistance,this.attenuationColor.copy(t.attenuationColor),this.specularIntensity=t.specularIntensity,this.specularIntensityMap=t.specularIntensityMap,this.specularColor.copy(t.specularColor),this.specularColorMap=t.specularColorMap,this}}class El extends en{constructor(t){super(),this.isMeshPhongMaterial=!0,this.type="MeshPhongMaterial",this.color=new Qr(16777215),this.specular=new Qr(1118481),this.shininess=30,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new Qr(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new Gi(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new gr,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.specular.copy(t.specular),this.shininess=t.shininess,this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapRotation.copy(t.envMapRotation),this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.flatShading=t.flatShading,this.fog=t.fog,this}}class Pl extends en{constructor(t){super(),this.isMeshToonMaterial=!0,this.defines={TOON:""},this.type="MeshToonMaterial",this.color=new Qr(16777215),this.map=null,this.gradientMap=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new Qr(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new Gi(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.gradientMap=t.gradientMap,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.alphaMap=t.alphaMap,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.fog=t.fog,this}}class Ol extends en{constructor(t){super(),this.isMeshNormalMaterial=!0,this.type="MeshNormalMaterial",this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new Gi(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.flatShading=!1,this.setValues(t)}copy(t){return super.copy(t),this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.flatShading=t.flatShading,this}}class Nl extends en{constructor(t){super(),this.isMeshLambertMaterial=!0,this.type="MeshLambertMaterial",this.color=new Qr(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new Qr(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new Gi(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new gr,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapRotation.copy(t.envMapRotation),this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.flatShading=t.flatShading,this.fog=t.fog,this}}class Fl extends en{constructor(t){super(),this.isMeshDepthMaterial=!0,this.type="MeshDepthMaterial",this.depthPacking=3200,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.setValues(t)}copy(t){return super.copy(t),this.depthPacking=t.depthPacking,this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this}}class Ll extends en{constructor(t){super(),this.isMeshDistanceMaterial=!0,this.type="MeshDistanceMaterial",this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.setValues(t)}copy(t){return super.copy(t),this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this}}class Vl extends en{constructor(t){super(),this.isMeshMatcapMaterial=!0,this.defines={MATCAP:""},this.type="MeshMatcapMaterial",this.color=new Qr(16777215),this.matcap=null,this.map=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new Gi(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.defines={MATCAP:""},this.color.copy(t.color),this.matcap=t.matcap,this.map=t.map,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.alphaMap=t.alphaMap,this.flatShading=t.flatShading,this.fog=t.fog,this}}class jl extends Co{constructor(t){super(),this.isLineDashedMaterial=!0,this.type="LineDashedMaterial",this.scale=1,this.dashSize=3,this.gapSize=1,this.setValues(t)}copy(t){return super.copy(t),this.scale=t.scale,this.dashSize=t.dashSize,this.gapSize=t.gapSize,this}}function Wl(t,e){return t&&t.constructor!==e?"number"==typeof e.BYTES_PER_ELEMENT?new e(t):Array.prototype.slice.call(t):t}function Ul(t){return ArrayBuffer.isView(t)&&!(t instanceof DataView)}function Dl(t){const e=t.length,i=new Array(e);for(let t=0;t!==e;++t)i[t]=t;return i.sort((function(e,i){return t[e]-t[i]})),i}function Hl(t,e,i){const s=t.length,r=new t.constructor(s);for(let n=0,a=0;a!==s;++n){const s=i[n]*e;for(let i=0;i!==e;++i)r[a++]=t[s+i]}return r}function ql(t,e,i,s){let r=1,n=t[0];for(;void 0!==n&&void 0===n[s];)n=t[r++];if(void 0===n)return;let a=n[s];if(void 0!==a)if(Array.isArray(a))do{a=n[s],void 0!==a&&(e.push(n.time),i.push(...a)),n=t[r++]}while(void 0!==n);else if(void 0!==a.toArray)do{a=n[s],void 0!==a&&(e.push(n.time),a.toArray(i,i.length)),n=t[r++]}while(void 0!==n);else do{a=n[s],void 0!==a&&(e.push(n.time),i.push(a)),n=t[r++]}while(void 0!==n)}class Jl{static convertArray(t,e){return Wl(t,e)}static isTypedArray(t){return Ul(t)}static getKeyframeOrder(t){return Dl(t)}static sortedArray(t,e,i){return Hl(t,e,i)}static flattenJSON(t,e,i,s){ql(t,e,i,s)}static subclip(t,e,i,s,r=30){return function(t,e,i,s,r=30){const n=t.clone();n.name=e;const a=[];for(let t=0;t=s)){h.push(e.times[t]);for(let i=0;in.tracks[t].times[0]&&(o=n.tracks[t].times[0]);for(let t=0;t=s.times[u]){const t=u*h+o,e=t+h-o;d=s.values.slice(t,e)}else{const t=s.createInterpolant(),e=o,i=h-o;t.evaluate(n),d=t.resultBuffer.slice(e,i)}"quaternion"===r&&(new Is).fromArray(d).normalize().conjugate().toArray(d);const p=a.times.length;for(let t=0;t=r)break t;{const a=e[1];t=r)break e}n=i,i=0}}for(;i>>1;te;)--n;if(++n,0!==r||n!==s){r>=n&&(n=Math.max(n,1),r=n-1);const t=this.getValueSize();this.times=i.slice(r,n),this.values=this.values.slice(r*t,n*t)}return this}validate(){let t=!0;const e=this.getValueSize();e-Math.floor(e)!=0&&(console.error("THREE.KeyframeTrack: Invalid value size in track.",this),t=!1);const i=this.times,s=this.values,r=i.length;0===r&&(console.error("THREE.KeyframeTrack: Track is empty.",this),t=!1);let n=null;for(let e=0;e!==r;e++){const s=i[e];if("number"==typeof s&&isNaN(s)){console.error("THREE.KeyframeTrack: Time is not a valid number.",this,e,s),t=!1;break}if(null!==n&&n>s){console.error("THREE.KeyframeTrack: Out of order keys.",this,e,s,n),t=!1;break}n=s}if(void 0!==s&&Ul(s))for(let e=0,i=s.length;e!==i;++e){const i=s[e];if(isNaN(i)){console.error("THREE.KeyframeTrack: Value is not a valid number.",this,e,i),t=!1;break}}return t}optimize(){const t=this.times.slice(),e=this.values.slice(),i=this.getValueSize(),s=this.getInterpolation()===Pe,r=t.length-1;let n=1;for(let a=1;a0){t[n]=t[r];for(let t=r*i,s=n*i,a=0;a!==i;++a)e[s+a]=e[t+a];++n}return n!==t.length?(this.times=t.slice(0,n),this.values=e.slice(0,n*i)):(this.times=t,this.values=e),this}clone(){const t=this.times.slice(),e=this.values.slice(),i=new(0,this.constructor)(this.name,t,e);return i.createInterpolant=this.createInterpolant,i}}$l.prototype.ValueTypeName="",$l.prototype.TimeBufferType=Float32Array,$l.prototype.ValueBufferType=Float32Array,$l.prototype.DefaultInterpolation=Ee;class Ql extends $l{constructor(t,e,i){super(t,e,i)}}Ql.prototype.ValueTypeName="bool",Ql.prototype.ValueBufferType=Array,Ql.prototype.DefaultInterpolation=Re,Ql.prototype.InterpolantFactoryMethodLinear=void 0,Ql.prototype.InterpolantFactoryMethodSmooth=void 0;class Kl extends $l{constructor(t,e,i,s){super(t,e,i,s)}}Kl.prototype.ValueTypeName="color";class tc extends $l{constructor(t,e,i,s){super(t,e,i,s)}}tc.prototype.ValueTypeName="number";class ec extends Xl{constructor(t,e,i,s){super(t,e,i,s)}interpolate_(t,e,i,s){const r=this.resultBuffer,n=this.sampleValues,a=this.valueSize,o=(i-e)/(s-e);let h=t*a;for(let t=h+a;h!==t;h+=4)Is.slerpFlat(r,0,n,h-a,n,h,o);return r}}class ic extends $l{constructor(t,e,i,s){super(t,e,i,s)}InterpolantFactoryMethodLinear(t){return new ec(this.times,this.values,this.getValueSize(),t)}}ic.prototype.ValueTypeName="quaternion",ic.prototype.InterpolantFactoryMethodSmooth=void 0;class sc extends $l{constructor(t,e,i){super(t,e,i)}}sc.prototype.ValueTypeName="string",sc.prototype.ValueBufferType=Array,sc.prototype.DefaultInterpolation=Re,sc.prototype.InterpolantFactoryMethodLinear=void 0,sc.prototype.InterpolantFactoryMethodSmooth=void 0;class rc extends $l{constructor(t,e,i,s){super(t,e,i,s)}}rc.prototype.ValueTypeName="vector";class nc{constructor(t="",e=-1,i=[],s=2500){this.name=t,this.tracks=i,this.duration=e,this.blendMode=s,this.uuid=Di(),this.duration<0&&this.resetDuration()}static parse(t){const e=[],i=t.tracks,s=1/(t.fps||1);for(let t=0,r=i.length;t!==r;++t)e.push(ac(i[t]).scale(s));const r=new this(t.name,t.duration,e,t.blendMode);return r.uuid=t.uuid,r}static toJSON(t){const e=[],i=t.tracks,s={name:t.name,duration:t.duration,tracks:e,uuid:t.uuid,blendMode:t.blendMode};for(let t=0,s=i.length;t!==s;++t)e.push($l.toJSON(i[t]));return s}static CreateFromMorphTargetSequence(t,e,i,s){const r=e.length,n=[];for(let t=0;t1){const t=n[1];let e=s[t];e||(s[t]=e=[]),e.push(i)}}const n=[];for(const t in s)n.push(this.CreateFromMorphTargetSequence(t,s[t],e,i));return n}static parseAnimation(t,e){if(console.warn("THREE.AnimationClip: parseAnimation() is deprecated and will be removed with r185"),!t)return console.error("THREE.AnimationClip: No animation in JSONLoader data."),null;const i=function(t,e,i,s,r){if(0!==i.length){const n=[],a=[];ql(i,n,a,s),0!==n.length&&r.push(new t(e,n,a))}},s=[],r=t.name||"default",n=t.fps||30,a=t.blendMode;let o=t.length||-1;const h=t.hierarchy||[];for(let t=0;t{e&&e(r),this.manager.itemEnd(t)}),0),r;if(void 0!==uc[t])return void uc[t].push({onLoad:e,onProgress:i,onError:s});uc[t]=[],uc[t].push({onLoad:e,onProgress:i,onError:s});const n=new Request(t,{headers:new Headers(this.requestHeader),credentials:this.withCredentials?"include":"same-origin"}),a=this.mimeType,o=this.responseType;fetch(n).then((e=>{if(200===e.status||0===e.status){if(0===e.status&&console.warn("THREE.FileLoader: HTTP Status 0 received."),"undefined"==typeof ReadableStream||void 0===e.body||void 0===e.body.getReader)return e;const i=uc[t],s=e.body.getReader(),r=e.headers.get("X-File-Size")||e.headers.get("Content-Length"),n=r?parseInt(r):0,a=0!==n;let o=0;const h=new ReadableStream({start(t){!function e(){s.read().then((({done:s,value:r})=>{if(s)t.close();else{o+=r.byteLength;const s=new ProgressEvent("progress",{lengthComputable:a,loaded:o,total:n});for(let t=0,e=i.length;t{t.error(e)}))}()}});return new Response(h)}throw new dc(`fetch for "${e.url}" responded with ${e.status}: ${e.statusText}`,e)})).then((t=>{switch(o){case"arraybuffer":return t.arrayBuffer();case"blob":return t.blob();case"document":return t.text().then((t=>(new DOMParser).parseFromString(t,a)));case"json":return t.json();default:if(""===a)return t.text();{const e=/charset="?([^;"\s]*)"?/i.exec(a),i=e&&e[1]?e[1].toLowerCase():void 0,s=new TextDecoder(i);return t.arrayBuffer().then((t=>s.decode(t)))}}})).then((e=>{oc.add(t,e);const i=uc[t];delete uc[t];for(let t=0,s=i.length;t{const i=uc[t];if(void 0===i)throw this.manager.itemError(t),e;delete uc[t];for(let t=0,s=i.length;t{this.manager.itemEnd(t)})),this.manager.itemStart(t)}setResponseType(t){return this.responseType=t,this}setMimeType(t){return this.mimeType=t,this}}class mc extends cc{constructor(t){super(t)}load(t,e,i,s){const r=this,n=new pc(this.manager);n.setPath(this.path),n.setRequestHeader(this.requestHeader),n.setWithCredentials(this.withCredentials),n.load(t,(function(i){try{e(r.parse(JSON.parse(i)))}catch(e){s?s(e):console.error(e),r.manager.itemError(t)}}),i,s)}parse(t){const e=[];for(let i=0;i0:s.vertexColors=t.vertexColors),void 0!==t.uniforms)for(const e in t.uniforms){const r=t.uniforms[e];switch(s.uniforms[e]={},r.type){case"t":s.uniforms[e].value=i(r.value);break;case"c":s.uniforms[e].value=(new Qr).setHex(r.value);break;case"v2":s.uniforms[e].value=(new Gi).fromArray(r.value);break;case"v3":s.uniforms[e].value=(new Bs).fromArray(r.value);break;case"v4":s.uniforms[e].value=(new Ms).fromArray(r.value);break;case"m3":s.uniforms[e].value=(new $i).fromArray(r.value);break;case"m4":s.uniforms[e].value=(new ar).fromArray(r.value);break;default:s.uniforms[e].value=r.value}}if(void 0!==t.defines&&(s.defines=t.defines),void 0!==t.vertexShader&&(s.vertexShader=t.vertexShader),void 0!==t.fragmentShader&&(s.fragmentShader=t.fragmentShader),void 0!==t.glslVersion&&(s.glslVersion=t.glslVersion),void 0!==t.extensions)for(const e in t.extensions)s.extensions[e]=t.extensions[e];if(void 0!==t.lights&&(s.lights=t.lights),void 0!==t.clipping&&(s.clipping=t.clipping),void 0!==t.size&&(s.size=t.size),void 0!==t.sizeAttenuation&&(s.sizeAttenuation=t.sizeAttenuation),void 0!==t.map&&(s.map=i(t.map)),void 0!==t.matcap&&(s.matcap=i(t.matcap)),void 0!==t.alphaMap&&(s.alphaMap=i(t.alphaMap)),void 0!==t.bumpMap&&(s.bumpMap=i(t.bumpMap)),void 0!==t.bumpScale&&(s.bumpScale=t.bumpScale),void 0!==t.normalMap&&(s.normalMap=i(t.normalMap)),void 0!==t.normalMapType&&(s.normalMapType=t.normalMapType),void 0!==t.normalScale){let e=t.normalScale;!1===Array.isArray(e)&&(e=[e,e]),s.normalScale=(new Gi).fromArray(e)}return void 0!==t.displacementMap&&(s.displacementMap=i(t.displacementMap)),void 0!==t.displacementScale&&(s.displacementScale=t.displacementScale),void 0!==t.displacementBias&&(s.displacementBias=t.displacementBias),void 0!==t.roughnessMap&&(s.roughnessMap=i(t.roughnessMap)),void 0!==t.metalnessMap&&(s.metalnessMap=i(t.metalnessMap)),void 0!==t.emissiveMap&&(s.emissiveMap=i(t.emissiveMap)),void 0!==t.emissiveIntensity&&(s.emissiveIntensity=t.emissiveIntensity),void 0!==t.specularMap&&(s.specularMap=i(t.specularMap)),void 0!==t.specularIntensityMap&&(s.specularIntensityMap=i(t.specularIntensityMap)),void 0!==t.specularColorMap&&(s.specularColorMap=i(t.specularColorMap)),void 0!==t.envMap&&(s.envMap=i(t.envMap)),void 0!==t.envMapRotation&&s.envMapRotation.fromArray(t.envMapRotation),void 0!==t.envMapIntensity&&(s.envMapIntensity=t.envMapIntensity),void 0!==t.reflectivity&&(s.reflectivity=t.reflectivity),void 0!==t.refractionRatio&&(s.refractionRatio=t.refractionRatio),void 0!==t.lightMap&&(s.lightMap=i(t.lightMap)),void 0!==t.lightMapIntensity&&(s.lightMapIntensity=t.lightMapIntensity),void 0!==t.aoMap&&(s.aoMap=i(t.aoMap)),void 0!==t.aoMapIntensity&&(s.aoMapIntensity=t.aoMapIntensity),void 0!==t.gradientMap&&(s.gradientMap=i(t.gradientMap)),void 0!==t.clearcoatMap&&(s.clearcoatMap=i(t.clearcoatMap)),void 0!==t.clearcoatRoughnessMap&&(s.clearcoatRoughnessMap=i(t.clearcoatRoughnessMap)),void 0!==t.clearcoatNormalMap&&(s.clearcoatNormalMap=i(t.clearcoatNormalMap)),void 0!==t.clearcoatNormalScale&&(s.clearcoatNormalScale=(new Gi).fromArray(t.clearcoatNormalScale)),void 0!==t.iridescenceMap&&(s.iridescenceMap=i(t.iridescenceMap)),void 0!==t.iridescenceThicknessMap&&(s.iridescenceThicknessMap=i(t.iridescenceThicknessMap)),void 0!==t.transmissionMap&&(s.transmissionMap=i(t.transmissionMap)),void 0!==t.thicknessMap&&(s.thicknessMap=i(t.thicknessMap)),void 0!==t.anisotropyMap&&(s.anisotropyMap=i(t.anisotropyMap)),void 0!==t.sheenColorMap&&(s.sheenColorMap=i(t.sheenColorMap)),void 0!==t.sheenRoughnessMap&&(s.sheenRoughnessMap=i(t.sheenRoughnessMap)),s}setTextures(t){return this.textures=t,this}createMaterialFromType(t){return jc.createMaterialFromType(t)}static createMaterialFromType(t){return new{ShadowMaterial:Il,SpriteMaterial:pa,RawShaderMaterial:Bl,ShaderMaterial:Yn,PointsMaterial:Uo,MeshPhysicalMaterial:Rl,MeshStandardMaterial:kl,MeshPhongMaterial:El,MeshToonMaterial:Pl,MeshNormalMaterial:Ol,MeshLambertMaterial:Nl,MeshDepthMaterial:Fl,MeshDistanceMaterial:Ll,MeshBasicMaterial:sn,MeshMatcapMaterial:Vl,LineDashedMaterial:jl,LineBasicMaterial:Co,Material:en}[t]}}class Wc{static extractUrlBase(t){const e=t.lastIndexOf("/");return-1===e?"./":t.slice(0,e+1)}static resolveURL(t,e){return"string"!=typeof t||""===t?"":(/^https?:\/\//i.test(e)&&/^\//.test(t)&&(e=e.replace(/(^https?:\/\/[^\/]+).*/i,"$1")),/^(https?:)?\/\//i.test(t)||/^data:.*,.*$/i.test(t)||/^blob:.*$/i.test(t)?t:e+t)}}class Uc extends In{constructor(){super(),this.isInstancedBufferGeometry=!0,this.type="InstancedBufferGeometry",this.instanceCount=1/0}copy(t){return super.copy(t),this.instanceCount=t.instanceCount,this}toJSON(){const t=super.toJSON();return t.instanceCount=this.instanceCount,t.isInstancedBufferGeometry=!0,t}}class Dc extends cc{constructor(t){super(t)}load(t,e,i,s){const r=this,n=new pc(r.manager);n.setPath(r.path),n.setRequestHeader(r.requestHeader),n.setWithCredentials(r.withCredentials),n.load(t,(function(i){try{e(r.parse(JSON.parse(i)))}catch(e){s?s(e):console.error(e),r.manager.itemError(t)}}),i,s)}parse(t){const e={},i={};function s(t,s){if(void 0!==e[s])return e[s];const r=t.interleavedBuffers[s],n=function(t,e){if(void 0!==i[e])return i[e];const s=t.arrayBuffers,r=s[e],n=new Uint32Array(r).buffer;return i[e]=n,n}(t,r.buffer),a=es(r.type,n),o=new ca(a,r.stride);return o.uuid=r.uuid,e[s]=o,o}const r=t.isInstancedBufferGeometry?new Uc:new In,n=t.data.index;if(void 0!==n){const t=es(n.type,n.array);r.setIndex(new dn(t,1))}const a=t.data.attributes;for(const e in a){const i=a[e];let n;if(i.isInterleavedBufferAttribute){const e=s(t.data,i.data);n=new da(e,i.itemSize,i.offset,i.normalized)}else{const t=es(i.type,i.array);n=new(i.isInstancedBufferAttribute?Xa:dn)(t,i.itemSize,i.normalized)}void 0!==i.name&&(n.name=i.name),void 0!==i.usage&&n.setUsage(i.usage),r.setAttribute(e,n)}const o=t.data.morphAttributes;if(o)for(const e in o){const i=o[e],n=[];for(let e=0,r=i.length;e0){const i=new hc(e);r=new gc(i),r.setCrossOrigin(this.crossOrigin);for(let e=0,i=t.length;e0){s=new gc(this.manager),s.setCrossOrigin(this.crossOrigin);for(let e=0,s=t.length;e{const e=new Es;e.min.fromArray(t.boxMin),e.max.fromArray(t.boxMax);const i=new $s;return i.radius=t.sphereRadius,i.center.fromArray(t.sphereCenter),{boxInitialized:t.boxInitialized,box:e,sphereInitialized:t.sphereInitialized,sphere:i}})),n._maxInstanceCount=t.maxInstanceCount,n._maxVertexCount=t.maxVertexCount,n._maxIndexCount=t.maxIndexCount,n._geometryInitialized=t.geometryInitialized,n._geometryCount=t.geometryCount,n._matricesTexture=c(t.matricesTexture.uuid),void 0!==t.colorsTexture&&(n._colorsTexture=c(t.colorsTexture.uuid));break;case"LOD":n=new ka;break;case"Line":n=new No(h(t.geometry),l(t.material));break;case"LineLoop":n=new Wo(h(t.geometry),l(t.material));break;case"LineSegments":n=new jo(h(t.geometry),l(t.material));break;case"PointCloud":case"Points":n=new Xo(h(t.geometry),l(t.material));break;case"Sprite":n=new za(l(t.material));break;case"Group":n=new ra;break;case"Bone":n=new Ua;break;default:n=new Er}if(n.uuid=t.uuid,void 0!==t.name&&(n.name=t.name),void 0!==t.matrix?(n.matrix.fromArray(t.matrix),void 0!==t.matrixAutoUpdate&&(n.matrixAutoUpdate=t.matrixAutoUpdate),n.matrixAutoUpdate&&n.matrix.decompose(n.position,n.quaternion,n.scale)):(void 0!==t.position&&n.position.fromArray(t.position),void 0!==t.rotation&&n.rotation.fromArray(t.rotation),void 0!==t.quaternion&&n.quaternion.fromArray(t.quaternion),void 0!==t.scale&&n.scale.fromArray(t.scale)),void 0!==t.up&&n.up.fromArray(t.up),void 0!==t.castShadow&&(n.castShadow=t.castShadow),void 0!==t.receiveShadow&&(n.receiveShadow=t.receiveShadow),t.shadow&&(void 0!==t.shadow.intensity&&(n.shadow.intensity=t.shadow.intensity),void 0!==t.shadow.bias&&(n.shadow.bias=t.shadow.bias),void 0!==t.shadow.normalBias&&(n.shadow.normalBias=t.shadow.normalBias),void 0!==t.shadow.radius&&(n.shadow.radius=t.shadow.radius),void 0!==t.shadow.mapSize&&n.shadow.mapSize.fromArray(t.shadow.mapSize),void 0!==t.shadow.camera&&(n.shadow.camera=this.parseObject(t.shadow.camera))),void 0!==t.visible&&(n.visible=t.visible),void 0!==t.frustumCulled&&(n.frustumCulled=t.frustumCulled),void 0!==t.renderOrder&&(n.renderOrder=t.renderOrder),void 0!==t.userData&&(n.userData=t.userData),void 0!==t.layers&&(n.layers.mask=t.layers),void 0!==t.children){const a=t.children;for(let t=0;t{e&&e(i),r.manager.itemEnd(t)})).catch((t=>{s&&s(t)})):(setTimeout((function(){e&&e(n),r.manager.itemEnd(t)}),0),n);const a={};a.credentials="anonymous"===this.crossOrigin?"same-origin":"include",a.headers=this.requestHeader;const o=fetch(t,a).then((function(t){return t.blob()})).then((function(t){return createImageBitmap(t,Object.assign(r.options,{colorSpaceConversion:"none"}))})).then((function(i){return oc.add(t,i),e&&e(i),r.manager.itemEnd(t),i})).catch((function(e){s&&s(e),oc.remove(t),r.manager.itemError(t),r.manager.itemEnd(t)}));oc.add(t,o),r.manager.itemStart(t)}}let Zc;class Gc{static getContext(){return void 0===Zc&&(Zc=new(window.AudioContext||window.webkitAudioContext)),Zc}static setContext(t){Zc=t}}class $c extends cc{constructor(t){super(t)}load(t,e,i,s){const r=this,n=new pc(this.manager);function a(e){s?s(e):console.error(e),r.manager.itemError(t)}n.setResponseType("arraybuffer"),n.setPath(this.path),n.setRequestHeader(this.requestHeader),n.setWithCredentials(this.withCredentials),n.load(t,(function(t){try{const i=t.slice(0);Gc.getContext().decodeAudioData(i,(function(t){e(t)})).catch(a)}catch(t){a(t)}}),i,s)}}const Qc=new ar,Kc=new ar,tu=new ar;class eu{constructor(){this.type="StereoCamera",this.aspect=1,this.eyeSep=.064,this.cameraL=new Kn,this.cameraL.layers.enable(1),this.cameraL.matrixAutoUpdate=!1,this.cameraR=new Kn,this.cameraR.layers.enable(2),this.cameraR.matrixAutoUpdate=!1,this._cache={focus:null,fov:null,aspect:null,near:null,far:null,zoom:null,eyeSep:null}}update(t){const e=this._cache;if(e.focus!==t.focus||e.fov!==t.fov||e.aspect!==t.aspect*this.aspect||e.near!==t.near||e.far!==t.far||e.zoom!==t.zoom||e.eyeSep!==this.eyeSep){e.focus=t.focus,e.fov=t.fov,e.aspect=t.aspect*this.aspect,e.near=t.near,e.far=t.far,e.zoom=t.zoom,e.eyeSep=this.eyeSep,tu.copy(t.projectionMatrix);const i=e.eyeSep/2,s=i*e.near/e.focus,r=e.near*Math.tan(Wi*e.fov*.5)/e.zoom;let n,a;Kc.elements[12]=-i,Qc.elements[12]=i,n=-r*e.aspect+s,a=r*e.aspect+s,tu.elements[0]=2*e.near/(a-n),tu.elements[8]=(a+n)/(a-n),this.cameraL.projectionMatrix.copy(tu),n=-r*e.aspect-s,a=r*e.aspect-s,tu.elements[0]=2*e.near/(a-n),tu.elements[8]=(a+n)/(a-n),this.cameraR.projectionMatrix.copy(tu)}this.cameraL.matrixWorld.copy(t.matrixWorld).multiply(Kc),this.cameraR.matrixWorld.copy(t.matrixWorld).multiply(Qc)}}class iu extends Kn{constructor(t=[]){super(),this.isArrayCamera=!0,this.cameras=t,this.index=0}}class su{constructor(t=!0){this.autoStart=t,this.startTime=0,this.oldTime=0,this.elapsedTime=0,this.running=!1}start(){this.startTime=ru(),this.oldTime=this.startTime,this.elapsedTime=0,this.running=!0}stop(){this.getElapsedTime(),this.running=!1,this.autoStart=!1}getElapsedTime(){return this.getDelta(),this.elapsedTime}getDelta(){let t=0;if(this.autoStart&&!this.running)return this.start(),0;if(this.running){const e=ru();t=(e-this.oldTime)/1e3,this.oldTime=e,this.elapsedTime+=t}return t}}function ru(){return performance.now()}const nu=new Bs,au=new Is,ou=new Bs,hu=new Bs;class lu extends Er{constructor(){super(),this.type="AudioListener",this.context=Gc.getContext(),this.gain=this.context.createGain(),this.gain.connect(this.context.destination),this.filter=null,this.timeDelta=0,this._clock=new su}getInput(){return this.gain}removeFilter(){return null!==this.filter&&(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination),this.gain.connect(this.context.destination),this.filter=null),this}getFilter(){return this.filter}setFilter(t){return null!==this.filter?(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination)):this.gain.disconnect(this.context.destination),this.filter=t,this.gain.connect(this.filter),this.filter.connect(this.context.destination),this}getMasterVolume(){return this.gain.gain.value}setMasterVolume(t){return this.gain.gain.setTargetAtTime(t,this.context.currentTime,.01),this}updateMatrixWorld(t){super.updateMatrixWorld(t);const e=this.context.listener,i=this.up;if(this.timeDelta=this._clock.getDelta(),this.matrixWorld.decompose(nu,au,ou),hu.set(0,0,-1).applyQuaternion(au),e.positionX){const t=this.context.currentTime+this.timeDelta;e.positionX.linearRampToValueAtTime(nu.x,t),e.positionY.linearRampToValueAtTime(nu.y,t),e.positionZ.linearRampToValueAtTime(nu.z,t),e.forwardX.linearRampToValueAtTime(hu.x,t),e.forwardY.linearRampToValueAtTime(hu.y,t),e.forwardZ.linearRampToValueAtTime(hu.z,t),e.upX.linearRampToValueAtTime(i.x,t),e.upY.linearRampToValueAtTime(i.y,t),e.upZ.linearRampToValueAtTime(i.z,t)}else e.setPosition(nu.x,nu.y,nu.z),e.setOrientation(hu.x,hu.y,hu.z,i.x,i.y,i.z)}}class cu extends Er{constructor(t){super(),this.type="Audio",this.listener=t,this.context=t.context,this.gain=this.context.createGain(),this.gain.connect(t.getInput()),this.autoplay=!1,this.buffer=null,this.detune=0,this.loop=!1,this.loopStart=0,this.loopEnd=0,this.offset=0,this.duration=void 0,this.playbackRate=1,this.isPlaying=!1,this.hasPlaybackControl=!0,this.source=null,this.sourceType="empty",this._startedAt=0,this._progress=0,this._connected=!1,this.filters=[]}getOutput(){return this.gain}setNodeSource(t){return this.hasPlaybackControl=!1,this.sourceType="audioNode",this.source=t,this.connect(),this}setMediaElementSource(t){return this.hasPlaybackControl=!1,this.sourceType="mediaNode",this.source=this.context.createMediaElementSource(t),this.connect(),this}setMediaStreamSource(t){return this.hasPlaybackControl=!1,this.sourceType="mediaStreamNode",this.source=this.context.createMediaStreamSource(t),this.connect(),this}setBuffer(t){return this.buffer=t,this.sourceType="buffer",this.autoplay&&this.play(),this}play(t=0){if(!0===this.isPlaying)return void console.warn("THREE.Audio: Audio is already playing.");if(!1===this.hasPlaybackControl)return void console.warn("THREE.Audio: this Audio has no playback control.");this._startedAt=this.context.currentTime+t;const e=this.context.createBufferSource();return e.buffer=this.buffer,e.loop=this.loop,e.loopStart=this.loopStart,e.loopEnd=this.loopEnd,e.onended=this.onEnded.bind(this),e.start(this._startedAt,this._progress+this.offset,this.duration),this.isPlaying=!0,this.source=e,this.setDetune(this.detune),this.setPlaybackRate(this.playbackRate),this.connect()}pause(){if(!1!==this.hasPlaybackControl)return!0===this.isPlaying&&(this._progress+=Math.max(this.context.currentTime-this._startedAt,0)*this.playbackRate,!0===this.loop&&(this._progress=this._progress%(this.duration||this.buffer.duration)),this.source.stop(),this.source.onended=null,this.isPlaying=!1),this;console.warn("THREE.Audio: this Audio has no playback control.")}stop(t=0){if(!1!==this.hasPlaybackControl)return this._progress=0,null!==this.source&&(this.source.stop(this.context.currentTime+t),this.source.onended=null),this.isPlaying=!1,this;console.warn("THREE.Audio: this Audio has no playback control.")}connect(){if(this.filters.length>0){this.source.connect(this.filters[0]);for(let t=1,e=this.filters.length;t0){this.source.disconnect(this.filters[0]);for(let t=1,e=this.filters.length;t0&&this._mixBufferRegionAdditive(i,s,this._addIndex*e,1,e);for(let t=e,r=e+e;t!==r;++t)if(i[t]!==i[t+e]){a.setValue(i,s);break}}saveOriginalState(){const t=this.binding,e=this.buffer,i=this.valueSize,s=i*this._origIndex;t.getValue(e,s);for(let t=i,r=s;t!==r;++t)e[t]=e[s+t%i];this._setIdentity(),this.cumulativeWeight=0,this.cumulativeWeightAdditive=0}restoreOriginalState(){const t=3*this.valueSize;this.binding.setValue(this.buffer,t)}_setAdditiveIdentityNumeric(){const t=this._addIndex*this.valueSize,e=t+this.valueSize;for(let i=t;i=.5)for(let s=0;s!==r;++s)t[e+s]=t[i+s]}_slerp(t,e,i,s){Is.slerpFlat(t,e,t,e,t,i,s)}_slerpAdditive(t,e,i,s,r){const n=this._workIndex*r;Is.multiplyQuaternionsFlat(t,n,t,e,t,i),Is.slerpFlat(t,e,t,e,t,n,s)}_lerp(t,e,i,s,r){const n=1-s;for(let a=0;a!==r;++a){const r=e+a;t[r]=t[r]*n+t[i+a]*s}}_lerpAdditive(t,e,i,s,r){for(let n=0;n!==r;++n){const r=e+n;t[r]=t[r]+t[i+n]*s}}}const xu="\\[\\]\\.:\\/",bu=new RegExp("["+xu+"]","g"),vu="[^"+xu+"]",wu="[^"+xu.replace("\\.","")+"]",Mu=new RegExp("^"+/((?:WC+[\/:])*)/.source.replace("WC",vu)+/(WCOD+)?/.source.replace("WCOD",wu)+/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC",vu)+/\.(WC+)(?:\[(.+)\])?/.source.replace("WC",vu)+"$"),Su=["material","materials","bones","map"];class _u{constructor(t,e,i){this.path=e,this.parsedPath=i||_u.parseTrackName(e),this.node=_u.findNode(t,this.parsedPath.nodeName),this.rootNode=t,this.getValue=this._getValue_unbound,this.setValue=this._setValue_unbound}static create(t,e,i){return t&&t.isAnimationObjectGroup?new _u.Composite(t,e,i):new _u(t,e,i)}static sanitizeNodeName(t){return t.replace(/\s/g,"_").replace(bu,"")}static parseTrackName(t){const e=Mu.exec(t);if(null===e)throw new Error("PropertyBinding: Cannot parse trackName: "+t);const i={nodeName:e[2],objectName:e[3],objectIndex:e[4],propertyName:e[5],propertyIndex:e[6]},s=i.nodeName&&i.nodeName.lastIndexOf(".");if(void 0!==s&&-1!==s){const t=i.nodeName.substring(s+1);-1!==Su.indexOf(t)&&(i.nodeName=i.nodeName.substring(0,s),i.objectName=t)}if(null===i.propertyName||0===i.propertyName.length)throw new Error("PropertyBinding: can not parse propertyName from trackName: "+t);return i}static findNode(t,e){if(void 0===e||""===e||"."===e||-1===e||e===t.name||e===t.uuid)return t;if(t.skeleton){const i=t.skeleton.getBoneByName(e);if(void 0!==i)return i}if(t.children){const i=function(t){for(let s=0;s=r){const n=r++,l=t[n];e[l.uuid]=h,t[h]=l,e[o]=n,t[n]=a;for(let t=0,e=s;t!==e;++t){const e=i[t],s=e[n],r=e[h];e[h]=s,e[n]=r}}}this.nCachedObjects_=r}uncache(){const t=this._objects,e=this._indicesByUUID,i=this._bindings,s=i.length;let r=this.nCachedObjects_,n=t.length;for(let a=0,o=arguments.length;a!==o;++a){const o=arguments[a].uuid,h=e[o];if(void 0!==h)if(delete e[o],h0&&(e[a.uuid]=h),t[h]=a,t.pop();for(let t=0,e=s;t!==e;++t){const e=i[t];e[h]=e[r],e.pop()}}}this.nCachedObjects_=r}subscribe_(t,e){const i=this._bindingsIndicesByPath;let s=i[t];const r=this._bindings;if(void 0!==s)return r[s];const n=this._paths,a=this._parsedPaths,o=this._objects,h=o.length,l=this.nCachedObjects_,c=new Array(h);s=r.length,i[t]=s,n.push(t),a.push(e),r.push(c);for(let i=l,s=o.length;i!==s;++i){const s=o[i];c[i]=new _u(s,t,e)}return c}unsubscribe_(t){const e=this._bindingsIndicesByPath,i=e[t];if(void 0!==i){const s=this._paths,r=this._parsedPaths,n=this._bindings,a=n.length-1,o=n[a];e[t[a]]=i,n[i]=o,n.pop(),r[i]=r[a],r.pop(),s[i]=s[a],s.pop()}}}class Tu{constructor(t,e,i=null,s=e.blendMode){this._mixer=t,this._clip=e,this._localRoot=i,this.blendMode=s;const r=e.tracks,n=r.length,a=new Array(n),o={endingStart:Oe,endingEnd:Oe};for(let t=0;t!==n;++t){const e=r[t].createInterpolant(null);a[t]=e,e.settings=o}this._interpolantSettings=o,this._interpolants=a,this._propertyBindings=new Array(n),this._cacheIndex=null,this._byClipCacheIndex=null,this._timeScaleInterpolant=null,this._weightInterpolant=null,this.loop=2201,this._loopCount=-1,this._startTime=null,this.time=0,this.timeScale=1,this._effectiveTimeScale=1,this.weight=1,this._effectiveWeight=1,this.repetitions=1/0,this.paused=!1,this.enabled=!0,this.clampWhenFinished=!1,this.zeroSlopeAtStart=!0,this.zeroSlopeAtEnd=!0}play(){return this._mixer._activateAction(this),this}stop(){return this._mixer._deactivateAction(this),this.reset()}reset(){return this.paused=!1,this.enabled=!0,this.time=0,this._loopCount=-1,this._startTime=null,this.stopFading().stopWarping()}isRunning(){return this.enabled&&!this.paused&&0!==this.timeScale&&null===this._startTime&&this._mixer._isActiveAction(this)}isScheduled(){return this._mixer._isActiveAction(this)}startAt(t){return this._startTime=t,this}setLoop(t,e){return this.loop=t,this.repetitions=e,this}setEffectiveWeight(t){return this.weight=t,this._effectiveWeight=this.enabled?t:0,this.stopFading()}getEffectiveWeight(){return this._effectiveWeight}fadeIn(t){return this._scheduleFading(t,0,1)}fadeOut(t){return this._scheduleFading(t,1,0)}crossFadeFrom(t,e,i=!1){if(t.fadeOut(e),this.fadeIn(e),!0===i){const i=this._clip.duration,s=t._clip.duration,r=s/i,n=i/s;t.warp(1,r,e),this.warp(n,1,e)}return this}crossFadeTo(t,e,i=!1){return t.crossFadeFrom(this,e,i)}stopFading(){const t=this._weightInterpolant;return null!==t&&(this._weightInterpolant=null,this._mixer._takeBackControlInterpolant(t)),this}setEffectiveTimeScale(t){return this.timeScale=t,this._effectiveTimeScale=this.paused?0:t,this.stopWarping()}getEffectiveTimeScale(){return this._effectiveTimeScale}setDuration(t){return this.timeScale=this._clip.duration/t,this.stopWarping()}syncWith(t){return this.time=t.time,this.timeScale=t.timeScale,this.stopWarping()}halt(t){return this.warp(this._effectiveTimeScale,0,t)}warp(t,e,i){const s=this._mixer,r=s.time,n=this.timeScale;let a=this._timeScaleInterpolant;null===a&&(a=s._lendControlInterpolant(),this._timeScaleInterpolant=a);const o=a.parameterPositions,h=a.sampleValues;return o[0]=r,o[1]=r+i,h[0]=t/n,h[1]=e/n,this}stopWarping(){const t=this._timeScaleInterpolant;return null!==t&&(this._timeScaleInterpolant=null,this._mixer._takeBackControlInterpolant(t)),this}getMixer(){return this._mixer}getClip(){return this._clip}getRoot(){return this._localRoot||this._mixer._root}_update(t,e,i,s){if(!this.enabled)return void this._updateWeight(t);const r=this._startTime;if(null!==r){const s=(t-r)*i;s<0||0===i?e=0:(this._startTime=null,e=i*s)}e*=this._updateTimeScale(t);const n=this._updateTime(e),a=this._updateWeight(t);if(a>0){const t=this._interpolants,e=this._propertyBindings;if(this.blendMode===Ve)for(let i=0,s=t.length;i!==s;++i)t[i].evaluate(n),e[i].accumulateAdditive(a);else for(let i=0,r=t.length;i!==r;++i)t[i].evaluate(n),e[i].accumulate(s,a)}}_updateWeight(t){let e=0;if(this.enabled){e=this.weight;const i=this._weightInterpolant;if(null!==i){const s=i.evaluate(t)[0];e*=s,t>i.parameterPositions[1]&&(this.stopFading(),0===s&&(this.enabled=!1))}}return this._effectiveWeight=e,e}_updateTimeScale(t){let e=0;if(!this.paused){e=this.timeScale;const i=this._timeScaleInterpolant;if(null!==i){e*=i.evaluate(t)[0],t>i.parameterPositions[1]&&(this.stopWarping(),0===e?this.paused=!0:this.timeScale=e)}}return this._effectiveTimeScale=e,e}_updateTime(t){const e=this._clip.duration,i=this.loop;let s=this.time+t,r=this._loopCount;const n=2202===i;if(0===t)return-1===r||!n||1&~r?s:e-s;if(2200===i){-1===r&&(this._loopCount=0,this._setEndings(!0,!0,!1));t:{if(s>=e)s=e;else{if(!(s<0)){this.time=s;break t}s=0}this.clampWhenFinished?this.paused=!0:this.enabled=!1,this.time=s,this._mixer.dispatchEvent({type:"finished",action:this,direction:t<0?-1:1})}}else{if(-1===r&&(t>=0?(r=0,this._setEndings(!0,0===this.repetitions,n)):this._setEndings(0===this.repetitions,!0,n)),s>=e||s<0){const i=Math.floor(s/e);s-=e*i,r+=Math.abs(i);const a=this.repetitions-r;if(a<=0)this.clampWhenFinished?this.paused=!0:this.enabled=!1,s=t>0?e:0,this.time=s,this._mixer.dispatchEvent({type:"finished",action:this,direction:t>0?1:-1});else{if(1===a){const e=t<0;this._setEndings(e,!e,n)}else this._setEndings(!1,!1,n);this._loopCount=r,this.time=s,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:i})}}else this.time=s;if(n&&!(1&~r))return e-s}return s}_setEndings(t,e,i){const s=this._interpolantSettings;i?(s.endingStart=Ne,s.endingEnd=Ne):(s.endingStart=t?this.zeroSlopeAtStart?Ne:Oe:Fe,s.endingEnd=e?this.zeroSlopeAtEnd?Ne:Oe:Fe)}_scheduleFading(t,e,i){const s=this._mixer,r=s.time;let n=this._weightInterpolant;null===n&&(n=s._lendControlInterpolant(),this._weightInterpolant=n);const a=n.parameterPositions,o=n.sampleValues;return a[0]=r,o[0]=e,a[1]=r+t,o[1]=i,this}}const zu=new Float32Array(1);class Cu extends Li{constructor(t){super(),this._root=t,this._initMemoryManager(),this._accuIndex=0,this.time=0,this.timeScale=1}_bindAction(t,e){const i=t._localRoot||this._root,s=t._clip.tracks,r=s.length,n=t._propertyBindings,a=t._interpolants,o=i.uuid,h=this._bindingsByRootAndName;let l=h[o];void 0===l&&(l={},h[o]=l);for(let t=0;t!==r;++t){const r=s[t],h=r.name;let c=l[h];if(void 0!==c)++c.referenceCount,n[t]=c;else{if(c=n[t],void 0!==c){null===c._cacheIndex&&(++c.referenceCount,this._addInactiveBinding(c,o,h));continue}const s=e&&e._propertyBindings[t].binding.parsedPath;c=new fu(_u.create(i,h,s),r.ValueTypeName,r.getValueSize()),++c.referenceCount,this._addInactiveBinding(c,o,h),n[t]=c}a[t].resultBuffer=c.buffer}}_activateAction(t){if(!this._isActiveAction(t)){if(null===t._cacheIndex){const e=(t._localRoot||this._root).uuid,i=t._clip.uuid,s=this._actionsByClip[i];this._bindAction(t,s&&s.knownActions[0]),this._addInactiveAction(t,i,e)}const e=t._propertyBindings;for(let t=0,i=e.length;t!==i;++t){const i=e[t];0==i.useCount++&&(this._lendBinding(i),i.saveOriginalState())}this._lendAction(t)}}_deactivateAction(t){if(this._isActiveAction(t)){const e=t._propertyBindings;for(let t=0,i=e.length;t!==i;++t){const i=e[t];0==--i.useCount&&(i.restoreOriginalState(),this._takeBackBinding(i))}this._takeBackAction(t)}}_initMemoryManager(){this._actions=[],this._nActiveActions=0,this._actionsByClip={},this._bindings=[],this._nActiveBindings=0,this._bindingsByRootAndName={},this._controlInterpolants=[],this._nActiveControlInterpolants=0;const t=this;this.stats={actions:{get total(){return t._actions.length},get inUse(){return t._nActiveActions}},bindings:{get total(){return t._bindings.length},get inUse(){return t._nActiveBindings}},controlInterpolants:{get total(){return t._controlInterpolants.length},get inUse(){return t._nActiveControlInterpolants}}}}_isActiveAction(t){const e=t._cacheIndex;return null!==e&&e=0;--e)t[e].stop();return this}update(t){t*=this.timeScale;const e=this._actions,i=this._nActiveActions,s=this.time+=t,r=Math.sign(t),n=this._accuIndex^=1;for(let a=0;a!==i;++a){e[a]._update(s,t,r,n)}const a=this._bindings,o=this._nActiveBindings;for(let t=0;t!==o;++t)a[t].apply(n);return this}setTime(t){this.time=0;for(let t=0;t=this.min.x&&t.x<=this.max.x&&t.y>=this.min.y&&t.y<=this.max.y}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y}getParameter(t,e){return e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y))}intersectsBox(t){return t.max.x>=this.min.x&&t.min.x<=this.max.x&&t.max.y>=this.min.y&&t.min.y<=this.max.y}clampPoint(t,e){return e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return this.clampPoint(t,Du).distanceTo(t)}intersect(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}}const qu=new Bs,Ju=new Bs;class Xu{constructor(t=new Bs,e=new Bs){this.start=t,this.end=e}set(t,e){return this.start.copy(t),this.end.copy(e),this}copy(t){return this.start.copy(t.start),this.end.copy(t.end),this}getCenter(t){return t.addVectors(this.start,this.end).multiplyScalar(.5)}delta(t){return t.subVectors(this.end,this.start)}distanceSq(){return this.start.distanceToSquared(this.end)}distance(){return this.start.distanceTo(this.end)}at(t,e){return this.delta(e).multiplyScalar(t).add(this.start)}closestPointToPointParameter(t,e){qu.subVectors(t,this.start),Ju.subVectors(this.end,this.start);const i=Ju.dot(Ju);let s=Ju.dot(qu)/i;return e&&(s=Hi(s,0,1)),s}closestPointToPoint(t,e,i){const s=this.closestPointToPointParameter(t,e);return this.delta(i).multiplyScalar(s).add(this.start)}applyMatrix4(t){return this.start.applyMatrix4(t),this.end.applyMatrix4(t),this}equals(t){return t.start.equals(this.start)&&t.end.equals(this.end)}clone(){return(new this.constructor).copy(this)}}const Yu=new Bs;class Zu extends Er{constructor(t,e){super(),this.light=t,this.matrixAutoUpdate=!1,this.color=e,this.type="SpotLightHelper";const i=new In,s=[0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,-1,0,1,0,0,0,0,1,1,0,0,0,0,-1,1];for(let t=0,e=1,i=32;t1)for(let i=0;i.99999)this.quaternion.set(0,0,0,1);else if(t.y<-.99999)this.quaternion.set(1,0,0,0);else{vd.set(t.z,0,-t.x).normalize();const e=Math.acos(t.y);this.quaternion.setFromAxisAngle(vd,e)}}setLength(t,e=.2*t,i=.2*e){this.line.scale.set(1,Math.max(1e-4,t-e),1),this.line.updateMatrix(),this.cone.scale.set(i,e,i),this.cone.position.y=t,this.cone.updateMatrix()}setColor(t){this.line.material.color.set(t),this.cone.material.color.set(t)}copy(t){return super.copy(t,!1),this.line.copy(t.line),this.cone.copy(t.cone),this}dispose(){this.line.geometry.dispose(),this.line.material.dispose(),this.cone.geometry.dispose(),this.cone.material.dispose()}}class _d extends jo{constructor(t=1){const e=[0,0,0,t,0,0,0,0,0,0,t,0,0,0,0,0,0,t],i=new In;i.setAttribute("position",new wn(e,3)),i.setAttribute("color",new wn([1,0,0,1,.6,0,0,1,0,.6,1,0,0,0,1,0,.6,1],3));super(i,new Co({vertexColors:!0,toneMapped:!1})),this.type="AxesHelper"}setColors(t,e,i){const s=new Qr,r=this.geometry.attributes.color.array;return s.set(t),s.toArray(r,0),s.toArray(r,3),s.set(e),s.toArray(r,6),s.toArray(r,9),s.set(i),s.toArray(r,12),s.toArray(r,15),this.geometry.attributes.color.needsUpdate=!0,this}dispose(){this.geometry.dispose(),this.material.dispose()}}class Ad{constructor(){this.type="ShapePath",this.color=new Qr,this.subPaths=[],this.currentPath=null}moveTo(t,e){return this.currentPath=new _h,this.subPaths.push(this.currentPath),this.currentPath.moveTo(t,e),this}lineTo(t,e){return this.currentPath.lineTo(t,e),this}quadraticCurveTo(t,e,i,s){return this.currentPath.quadraticCurveTo(t,e,i,s),this}bezierCurveTo(t,e,i,s,r,n){return this.currentPath.bezierCurveTo(t,e,i,s,r,n),this}splineThru(t){return this.currentPath.splineThru(t),this}toShapes(t){function e(t,e){const i=e.length;let s=!1;for(let r=i-1,n=0;nNumber.EPSILON){if(h<0&&(i=e[n],o=-o,a=e[r],h=-h),t.ya.y)continue;if(t.y===i.y){if(t.x===i.x)return!0}else{const e=h*(t.x-i.x)-o*(t.y-i.y);if(0===e)return!0;if(e<0)continue;s=!s}}else{if(t.y!==i.y)continue;if(a.x<=t.x&&t.x<=i.x||i.x<=t.x&&t.x<=a.x)return!0}}return s}const i=ul.isClockWise,s=this.subPaths;if(0===s.length)return[];let r,n,a;const o=[];if(1===s.length)return n=s[0],a=new Fh,a.curves=n.curves,o.push(a),o;let h=!i(s[0].getPoints());h=t?!h:h;const l=[],c=[];let u,d,p=[],m=0;c[m]=void 0,p[m]=[];for(let e=0,a=s.length;e1){let t=!1,i=0;for(let t=0,e=c.length;t0&&!1===t&&(p=l)}for(let t=0,e=c.length;te?(t.repeat.x=1,t.repeat.y=i/e,t.offset.x=0,t.offset.y=(1-t.repeat.y)/2):(t.repeat.x=e/i,t.repeat.y=1,t.offset.x=(1-t.repeat.x)/2,t.offset.y=0),t}(t,e)}static cover(t,e){return function(t,e){const i=t.image&&t.image.width?t.image.width/t.image.height:1;return i>e?(t.repeat.x=e/i,t.repeat.y=1,t.offset.x=(1-t.repeat.x)/2,t.offset.y=0):(t.repeat.x=1,t.repeat.y=i/e,t.offset.x=0,t.offset.y=(1-t.repeat.y)/2),t}(t,e)}static fill(t){return function(t){return t.repeat.x=1,t.repeat.y=1,t.offset.x=0,t.offset.y=0,t}(t)}static getByteLength(t,e,i,s){return zd(t,e,i,s)}}"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("register",{detail:{revision:t}})),"undefined"!=typeof window&&(window.__THREE__?console.warn("WARNING: Multiple instances of Three.js being imported."):window.__THREE__=t);export{et as ACESFilmicToneMapping,v as AddEquation,G as AddOperation,Ve as AdditiveAnimationBlendMode,g as AdditiveBlending,st as AgXToneMapping,Lt as AlphaFormat,Si as AlwaysCompare,W as AlwaysDepth,yi as AlwaysStencilFunc,Nc as AmbientLight,Tu as AnimationAction,nc as AnimationClip,mc as AnimationLoader,Cu as AnimationMixer,Au as AnimationObjectGroup,Jl as AnimationUtils,nh as ArcCurve,iu as ArrayCamera,Sd as ArrowHelper,nt as AttachedBindMode,cu as Audio,gu as AudioAnalyser,Gc as AudioContext,lu as AudioListener,$c as AudioLoader,_d as AxesHelper,d as BackSide,De as BasicDepthPacking,o as BasicShadowMap,zo as BatchedMesh,Ua as Bone,Ql as BooleanKeyframeTrack,Hu as Box2,Es as Box3,xd as Box3Helper,Dn as BoxGeometry,fd as BoxHelper,dn as BufferAttribute,In as BufferGeometry,Dc as BufferGeometryLoader,zt as ByteType,oc as Cache,Zn as Camera,md as CameraHelper,eh as CanvasTexture,Th as CapsuleGeometry,uh as CatmullRomCurve3,tt as CineonToneMapping,zh as CircleGeometry,mt as ClampToEdgeWrapping,su as Clock,Qr as Color,Kl as ColorKeyframeTrack,ds as ColorManagement,Ko as CompressedArrayTexture,th as CompressedCubeTexture,Qo as CompressedTexture,yc as CompressedTextureLoader,Ih as ConeGeometry,L as ConstantAlphaFactor,N as ConstantColorFactor,Td as Controls,ea as CubeCamera,ht as CubeReflectionMapping,lt as CubeRefractionMapping,ia as CubeTexture,fc as CubeTextureLoader,dt as CubeUVReflectionMapping,yh as CubicBezierCurve,gh as CubicBezierCurve3,Yl as CubicInterpolant,r as CullFaceBack,n as CullFaceFront,a as CullFaceFrontBack,s as CullFaceNone,sh as Curve,Sh as CurvePath,b as CustomBlending,it as CustomToneMapping,Ch as CylinderGeometry,Wu as Cylindrical,zs as Data3DTexture,As as DataArrayTexture,Da as DataTexture,xc as DataTextureLoader,hn as DataUtils,ri as DecrementStencilOp,ai as DecrementWrapStencilOp,lc as DefaultLoadingManager,Dt as DepthFormat,Ht as DepthStencilFormat,ih as DepthTexture,at as DetachedBindMode,Oc as DirectionalLight,ud as DirectionalLightHelper,Gl as DiscreteInterpolant,kh as DodecahedronGeometry,p as DoubleSide,k as DstAlphaFactor,E as DstColorFactor,ki as DynamicCopyUsage,Ai as DynamicDrawUsage,Ci as DynamicReadUsage,Nh as EdgesGeometry,rh as EllipseCurve,xi as EqualCompare,H as EqualDepth,ci as EqualStencilFunc,ct as EquirectangularReflectionMapping,ut as EquirectangularRefractionMapping,gr as Euler,Li as EventDispatcher,ml as ExtrudeGeometry,pc as FileLoader,vn as Float16BufferAttribute,wn as Float32BufferAttribute,Rt as FloatType,ha as Fog,oa as FogExp2,$o as FramebufferTexture,u as FrontSide,ho as Frustum,Ou as GLBufferAttribute,Ei as GLSL1,Pi as GLSL3,vi as GreaterCompare,J as GreaterDepth,Mi as GreaterEqualCompare,q as GreaterEqualDepth,mi as GreaterEqualStencilFunc,di as GreaterStencilFunc,ad as GridHelper,ra as Group,Et as HalfFloatType,wc as HemisphereLight,nd as HemisphereLightHelper,gl as IcosahedronGeometry,Yc as ImageBitmapLoader,gc as ImageLoader,gs as ImageUtils,si as IncrementStencilOp,ni as IncrementWrapStencilOp,Xa as InstancedBufferAttribute,Uc as InstancedBufferGeometry,Pu as InstancedInterleavedBuffer,eo as InstancedMesh,gn as Int16BufferAttribute,xn as Int32BufferAttribute,pn as Int8BufferAttribute,Bt as IntType,ca as InterleavedBuffer,da as InterleavedBufferAttribute,Xl as Interpolant,Re as InterpolateDiscrete,Ee as InterpolateLinear,Pe as InterpolateSmooth,oi as InvertStencilOp,ei as KeepStencilOp,$l as KeyframeTrack,ka as LOD,Ah as LatheGeometry,fr as Layers,fi as LessCompare,U as LessDepth,bi as LessEqualCompare,D as LessEqualDepth,ui as LessEqualStencilFunc,li as LessStencilFunc,vc as Light,Vc as LightProbe,No as Line,Xu as Line3,Co as LineBasicMaterial,fh as LineCurve,xh as LineCurve3,jl as LineDashedMaterial,Wo as LineLoop,jo as LineSegments,wt as LinearFilter,Zl as LinearInterpolant,At as LinearMipMapLinearFilter,St as LinearMipMapNearestFilter,_t as LinearMipmapLinearFilter,Mt as LinearMipmapNearestFilter,$e as LinearSRGBColorSpace,Q as LinearToneMapping,Qe as LinearTransfer,cc as Loader,Wc as LoaderUtils,hc as LoadingManager,Ie as LoopOnce,ke as LoopPingPong,Be as LoopRepeat,Ut as LuminanceAlphaFormat,Wt as LuminanceFormat,e as MOUSE,en as Material,jc as MaterialLoader,Zi as MathUtils,Uu as Matrix2,$i as Matrix3,ar as Matrix4,_ as MaxEquation,Wn as Mesh,sn as MeshBasicMaterial,Fl as MeshDepthMaterial,Ll as MeshDistanceMaterial,Nl as MeshLambertMaterial,Vl as MeshMatcapMaterial,Ol as MeshNormalMaterial,El as MeshPhongMaterial,Rl as MeshPhysicalMaterial,kl as MeshStandardMaterial,Pl as MeshToonMaterial,S as MinEquation,yt as MirroredRepeatWrapping,Z as MixOperation,x as MultiplyBlending,Y as MultiplyOperation,gt as NearestFilter,vt as NearestMipMapLinearFilter,xt as NearestMipMapNearestFilter,bt as NearestMipmapLinearFilter,ft as NearestMipmapNearestFilter,rt as NeutralToneMapping,gi as NeverCompare,j as NeverDepth,hi as NeverStencilFunc,m as NoBlending,Ze as NoColorSpace,$ as NoToneMapping,Le as NormalAnimationBlendMode,y as NormalBlending,wi as NotEqualCompare,X as NotEqualDepth,pi as NotEqualStencilFunc,tc as NumberKeyframeTrack,Er as Object3D,Hc as ObjectLoader,Ye as ObjectSpaceNormalMap,fl as OctahedronGeometry,T as OneFactor,V as OneMinusConstantAlphaFactor,F as OneMinusConstantColorFactor,R as OneMinusDstAlphaFactor,P as OneMinusDstColorFactor,B as OneMinusSrcAlphaFactor,C as OneMinusSrcColorFactor,Ec as OrthographicCamera,h as PCFShadowMap,l as PCFSoftShadowMap,_h as Path,Kn as PerspectiveCamera,no as Plane,xl as PlaneGeometry,bd as PlaneHelper,Rc as PointLight,ed as PointLightHelper,Xo as Points,Uo as PointsMaterial,od as PolarGridHelper,Bh as PolyhedronGeometry,yu as PositionalAudio,_u as PropertyBinding,fu as PropertyMixer,bh as QuadraticBezierCurve,vh as QuadraticBezierCurve3,Is as Quaternion,ic as QuaternionKeyframeTrack,ec as QuaternionLinearInterpolant,Ui as RAD2DEG,ze as RED_GREEN_RGTC2_Format,Ae as RED_RGTC1_Format,t as REVISION,He as RGBADepthPacking,jt as RGBAFormat,Gt as RGBAIntegerFormat,be as RGBA_ASTC_10x10_Format,ge as RGBA_ASTC_10x5_Format,fe as RGBA_ASTC_10x6_Format,xe as RGBA_ASTC_10x8_Format,ve as RGBA_ASTC_12x10_Format,we as RGBA_ASTC_12x12_Format,he as RGBA_ASTC_4x4_Format,le as RGBA_ASTC_5x4_Format,ce as RGBA_ASTC_5x5_Format,ue as RGBA_ASTC_6x5_Format,de as RGBA_ASTC_6x6_Format,pe as RGBA_ASTC_8x5_Format,me as RGBA_ASTC_8x6_Format,ye as RGBA_ASTC_8x8_Format,Me as RGBA_BPTC_Format,oe as RGBA_ETC2_EAC_Format,re as RGBA_PVRTC_2BPPV1_Format,se as RGBA_PVRTC_4BPPV1_Format,Qt as RGBA_S3TC_DXT1_Format,Kt as RGBA_S3TC_DXT3_Format,te as RGBA_S3TC_DXT5_Format,qe as RGBDepthPacking,Vt as RGBFormat,Zt as RGBIntegerFormat,Se as RGB_BPTC_SIGNED_Format,_e as RGB_BPTC_UNSIGNED_Format,ne as RGB_ETC1_Format,ae as RGB_ETC2_Format,ie as RGB_PVRTC_2BPPV1_Format,ee as RGB_PVRTC_4BPPV1_Format,$t as RGB_S3TC_DXT1_Format,Je as RGDepthPacking,Xt as RGFormat,Yt as RGIntegerFormat,Bl as RawShaderMaterial,nr as Ray,Fu as Raycaster,Fc as RectAreaLight,qt as RedFormat,Jt as RedIntegerFormat,K as ReinhardToneMapping,Ss as RenderTarget,Iu as RenderTarget3D,Bu as RenderTargetArray,pt as RepeatWrapping,ii as ReplaceStencilOp,M as ReverseSubtractEquation,bl as RingGeometry,Ce as SIGNED_RED_GREEN_RGTC2_Format,Te as SIGNED_RED_RGTC1_Format,Ge as SRGBColorSpace,Ke as SRGBTransfer,la as Scene,Yn as ShaderMaterial,Il as ShadowMaterial,Fh as Shape,vl as ShapeGeometry,Ad as ShapePath,ul as ShapeUtils,Ct as ShortType,Ja as Skeleton,Ku as SkeletonHelper,Wa as SkinnedMesh,xs as Source,$s as Sphere,wl as SphereGeometry,ju as Spherical,Lc as SphericalHarmonics3,wh as SplineCurve,zc as SpotLight,Zu as SpotLightHelper,za as Sprite,pa as SpriteMaterial,I as SrcAlphaFactor,O as SrcAlphaSaturateFactor,z as SrcColorFactor,Bi as StaticCopyUsage,_i as StaticDrawUsage,zi as StaticReadUsage,eu as StereoCamera,Ri as StreamCopyUsage,Ti as StreamDrawUsage,Ii as StreamReadUsage,sc as StringKeyframeTrack,w as SubtractEquation,f as SubtractiveBlending,i as TOUCH,Xe as TangentSpaceNormalMap,Ml as TetrahedronGeometry,ws as Texture,bc as TextureLoader,Cd as TextureUtils,Fi as TimestampQuery,Sl as TorusGeometry,_l as TorusKnotGeometry,Xr as Triangle,Ue as TriangleFanDrawMode,We as TriangleStripDrawMode,je as TrianglesDrawMode,Al as TubeGeometry,ot as UVMapping,fn as Uint16BufferAttribute,bn as Uint32BufferAttribute,mn as Uint8BufferAttribute,yn as Uint8ClampedBufferAttribute,ku as Uniform,Eu as UniformsGroup,Xn as UniformsUtils,Tt as UnsignedByteType,Nt as UnsignedInt248Type,Ft as UnsignedInt5999Type,kt as UnsignedIntType,Pt as UnsignedShort4444Type,Ot as UnsignedShort5551Type,It as UnsignedShortType,c as VSMShadowMap,Gi as Vector2,Bs as Vector3,Ms as Vector4,rc as VectorKeyframeTrack,Go as VideoFrameTexture,Zo as VideoTexture,Cs as WebGL3DRenderTarget,Ts as WebGLArrayRenderTarget,Oi as WebGLCoordinateSystem,sa as WebGLCubeRenderTarget,_s as WebGLRenderTarget,Ni as WebGPUCoordinateSystem,aa as WebXRController,Tl as WireframeGeometry,Fe as WrapAroundEnding,Oe as ZeroCurvatureEnding,A as ZeroFactor,Ne as ZeroSlopeEnding,ti as ZeroStencilOp,Ki as arrayNeedsUint32,Hn as cloneUniforms,ss as createCanvasElement,is as createElementNS,zd as getByteLength,Jn as getUnlitUniformColorSpace,qn as mergeUniforms,as as probeAsync,os as toNormalizedProjectionMatrix,hs as toReversedProjectionMatrix,ns as warnOnce}; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhyZWUuY29yZS5taW4uanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb25zdGFudHMuanMiLCIuLi9zcmMvY29yZS9FdmVudERpc3BhdGNoZXIuanMiLCIuLi9zcmMvbWF0aC9NYXRoVXRpbHMuanMiLCIuLi9zcmMvbWF0aC9WZWN0b3IyLmpzIiwiLi4vc3JjL21hdGgvTWF0cml4My5qcyIsIi4uL3NyYy91dGlscy5qcyIsIi4uL3NyYy9tYXRoL0NvbG9yTWFuYWdlbWVudC5qcyIsIi4uL3NyYy9leHRyYXMvSW1hZ2VVdGlscy5qcyIsIi4uL3NyYy90ZXh0dXJlcy9Tb3VyY2UuanMiLCIuLi9zcmMvdGV4dHVyZXMvVGV4dHVyZS5qcyIsIi4uL3NyYy9tYXRoL1ZlY3RvcjQuanMiLCIuLi9zcmMvY29yZS9SZW5kZXJUYXJnZXQuanMiLCIuLi9zcmMvcmVuZGVyZXJzL1dlYkdMUmVuZGVyVGFyZ2V0LmpzIiwiLi4vc3JjL3RleHR1cmVzL0RhdGFBcnJheVRleHR1cmUuanMiLCIuLi9zcmMvcmVuZGVyZXJzL1dlYkdMQXJyYXlSZW5kZXJUYXJnZXQuanMiLCIuLi9zcmMvdGV4dHVyZXMvRGF0YTNEVGV4dHVyZS5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvV2ViR0wzRFJlbmRlclRhcmdldC5qcyIsIi4uL3NyYy9tYXRoL1F1YXRlcm5pb24uanMiLCIuLi9zcmMvbWF0aC9WZWN0b3IzLmpzIiwiLi4vc3JjL21hdGgvQm94My5qcyIsIi4uL3NyYy9tYXRoL1NwaGVyZS5qcyIsIi4uL3NyYy9tYXRoL1JheS5qcyIsIi4uL3NyYy9tYXRoL01hdHJpeDQuanMiLCIuLi9zcmMvbWF0aC9FdWxlci5qcyIsIi4uL3NyYy9jb3JlL0xheWVycy5qcyIsIi4uL3NyYy9jb3JlL09iamVjdDNELmpzIiwiLi4vc3JjL21hdGgvVHJpYW5nbGUuanMiLCIuLi9zcmMvbWF0aC9Db2xvci5qcyIsIi4uL3NyYy9tYXRlcmlhbHMvTWF0ZXJpYWwuanMiLCIuLi9zcmMvbWF0ZXJpYWxzL01lc2hCYXNpY01hdGVyaWFsLmpzIiwiLi4vc3JjL2V4dHJhcy9EYXRhVXRpbHMuanMiLCIuLi9zcmMvY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMiLCIuLi9zcmMvY29yZS9CdWZmZXJHZW9tZXRyeS5qcyIsIi4uL3NyYy9vYmplY3RzL01lc2guanMiLCIuLi9zcmMvZ2VvbWV0cmllcy9Cb3hHZW9tZXRyeS5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9Vbmlmb3Jtc1V0aWxzLmpzIiwiLi4vc3JjL21hdGVyaWFscy9TaGFkZXJNYXRlcmlhbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9kZWZhdWx0X3ZlcnRleC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL2RlZmF1bHRfZnJhZ21lbnQuZ2xzbC5qcyIsIi4uL3NyYy9jYW1lcmFzL0NhbWVyYS5qcyIsIi4uL3NyYy9jYW1lcmFzL1BlcnNwZWN0aXZlQ2FtZXJhLmpzIiwiLi4vc3JjL2NhbWVyYXMvQ3ViZUNhbWVyYS5qcyIsIi4uL3NyYy90ZXh0dXJlcy9DdWJlVGV4dHVyZS5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvV2ViR0xDdWJlUmVuZGVyVGFyZ2V0LmpzIiwiLi4vc3JjL29iamVjdHMvR3JvdXAuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYnhyL1dlYlhSQ29udHJvbGxlci5qcyIsIi4uL3NyYy9zY2VuZXMvRm9nRXhwMi5qcyIsIi4uL3NyYy9zY2VuZXMvRm9nLmpzIiwiLi4vc3JjL3NjZW5lcy9TY2VuZS5qcyIsIi4uL3NyYy9jb3JlL0ludGVybGVhdmVkQnVmZmVyLmpzIiwiLi4vc3JjL2NvcmUvSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUuanMiLCIuLi9zcmMvbWF0ZXJpYWxzL1Nwcml0ZU1hdGVyaWFsLmpzIiwiLi4vc3JjL29iamVjdHMvU3ByaXRlLmpzIiwiLi4vc3JjL29iamVjdHMvTE9ELmpzIiwiLi4vc3JjL29iamVjdHMvU2tpbm5lZE1lc2guanMiLCIuLi9zcmMvb2JqZWN0cy9Cb25lLmpzIiwiLi4vc3JjL3RleHR1cmVzL0RhdGFUZXh0dXJlLmpzIiwiLi4vc3JjL29iamVjdHMvU2tlbGV0b24uanMiLCIuLi9zcmMvY29yZS9JbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUuanMiLCIuLi9zcmMvb2JqZWN0cy9JbnN0YW5jZWRNZXNoLmpzIiwiLi4vc3JjL21hdGgvUGxhbmUuanMiLCIuLi9zcmMvbWF0aC9GcnVzdHVtLmpzIiwiLi4vc3JjL29iamVjdHMvQmF0Y2hlZE1lc2guanMiLCIuLi9zcmMvbWF0ZXJpYWxzL0xpbmVCYXNpY01hdGVyaWFsLmpzIiwiLi4vc3JjL29iamVjdHMvTGluZS5qcyIsIi4uL3NyYy9vYmplY3RzL0xpbmVTZWdtZW50cy5qcyIsIi4uL3NyYy9vYmplY3RzL0xpbmVMb29wLmpzIiwiLi4vc3JjL21hdGVyaWFscy9Qb2ludHNNYXRlcmlhbC5qcyIsIi4uL3NyYy9vYmplY3RzL1BvaW50cy5qcyIsIi4uL3NyYy90ZXh0dXJlcy9WaWRlb1RleHR1cmUuanMiLCIuLi9zcmMvdGV4dHVyZXMvVmlkZW9GcmFtZVRleHR1cmUuanMiLCIuLi9zcmMvdGV4dHVyZXMvRnJhbWVidWZmZXJUZXh0dXJlLmpzIiwiLi4vc3JjL3RleHR1cmVzL0NvbXByZXNzZWRUZXh0dXJlLmpzIiwiLi4vc3JjL3RleHR1cmVzL0NvbXByZXNzZWRBcnJheVRleHR1cmUuanMiLCIuLi9zcmMvdGV4dHVyZXMvQ29tcHJlc3NlZEN1YmVUZXh0dXJlLmpzIiwiLi4vc3JjL3RleHR1cmVzL0NhbnZhc1RleHR1cmUuanMiLCIuLi9zcmMvdGV4dHVyZXMvRGVwdGhUZXh0dXJlLmpzIiwiLi4vc3JjL2V4dHJhcy9jb3JlL0N1cnZlLmpzIiwiLi4vc3JjL2V4dHJhcy9jdXJ2ZXMvRWxsaXBzZUN1cnZlLmpzIiwiLi4vc3JjL2V4dHJhcy9jdXJ2ZXMvQXJjQ3VydmUuanMiLCIuLi9zcmMvZXh0cmFzL2N1cnZlcy9DYXRtdWxsUm9tQ3VydmUzLmpzIiwiLi4vc3JjL2V4dHJhcy9jb3JlL0ludGVycG9sYXRpb25zLmpzIiwiLi4vc3JjL2V4dHJhcy9jdXJ2ZXMvQ3ViaWNCZXppZXJDdXJ2ZS5qcyIsIi4uL3NyYy9leHRyYXMvY3VydmVzL0N1YmljQmV6aWVyQ3VydmUzLmpzIiwiLi4vc3JjL2V4dHJhcy9jdXJ2ZXMvTGluZUN1cnZlLmpzIiwiLi4vc3JjL2V4dHJhcy9jdXJ2ZXMvTGluZUN1cnZlMy5qcyIsIi4uL3NyYy9leHRyYXMvY3VydmVzL1F1YWRyYXRpY0JlemllckN1cnZlLmpzIiwiLi4vc3JjL2V4dHJhcy9jdXJ2ZXMvUXVhZHJhdGljQmV6aWVyQ3VydmUzLmpzIiwiLi4vc3JjL2V4dHJhcy9jdXJ2ZXMvU3BsaW5lQ3VydmUuanMiLCIuLi9zcmMvZXh0cmFzL2NvcmUvQ3VydmVQYXRoLmpzIiwiLi4vc3JjL2V4dHJhcy9jb3JlL1BhdGguanMiLCIuLi9zcmMvZ2VvbWV0cmllcy9MYXRoZUdlb21ldHJ5LmpzIiwiLi4vc3JjL2dlb21ldHJpZXMvQ2Fwc3VsZUdlb21ldHJ5LmpzIiwiLi4vc3JjL2dlb21ldHJpZXMvQ2lyY2xlR2VvbWV0cnkuanMiLCIuLi9zcmMvZ2VvbWV0cmllcy9DeWxpbmRlckdlb21ldHJ5LmpzIiwiLi4vc3JjL2dlb21ldHJpZXMvQ29uZUdlb21ldHJ5LmpzIiwiLi4vc3JjL2dlb21ldHJpZXMvUG9seWhlZHJvbkdlb21ldHJ5LmpzIiwiLi4vc3JjL2dlb21ldHJpZXMvRG9kZWNhaGVkcm9uR2VvbWV0cnkuanMiLCIuLi9zcmMvZ2VvbWV0cmllcy9FZGdlc0dlb21ldHJ5LmpzIiwiLi4vc3JjL2V4dHJhcy9jb3JlL1NoYXBlLmpzIiwiLi4vc3JjL2V4dHJhcy9saWIvZWFyY3V0LmpzIiwiLi4vc3JjL2V4dHJhcy9FYXJjdXQuanMiLCIuLi9zcmMvZXh0cmFzL1NoYXBlVXRpbHMuanMiLCIuLi9zcmMvZ2VvbWV0cmllcy9FeHRydWRlR2VvbWV0cnkuanMiLCIuLi9zcmMvZ2VvbWV0cmllcy9JY29zYWhlZHJvbkdlb21ldHJ5LmpzIiwiLi4vc3JjL2dlb21ldHJpZXMvT2N0YWhlZHJvbkdlb21ldHJ5LmpzIiwiLi4vc3JjL2dlb21ldHJpZXMvUGxhbmVHZW9tZXRyeS5qcyIsIi4uL3NyYy9nZW9tZXRyaWVzL1JpbmdHZW9tZXRyeS5qcyIsIi4uL3NyYy9nZW9tZXRyaWVzL1NoYXBlR2VvbWV0cnkuanMiLCIuLi9zcmMvZ2VvbWV0cmllcy9TcGhlcmVHZW9tZXRyeS5qcyIsIi4uL3NyYy9nZW9tZXRyaWVzL1RldHJhaGVkcm9uR2VvbWV0cnkuanMiLCIuLi9zcmMvZ2VvbWV0cmllcy9Ub3J1c0dlb21ldHJ5LmpzIiwiLi4vc3JjL2dlb21ldHJpZXMvVG9ydXNLbm90R2VvbWV0cnkuanMiLCIuLi9zcmMvZ2VvbWV0cmllcy9UdWJlR2VvbWV0cnkuanMiLCIuLi9zcmMvZ2VvbWV0cmllcy9XaXJlZnJhbWVHZW9tZXRyeS5qcyIsIi4uL3NyYy9tYXRlcmlhbHMvU2hhZG93TWF0ZXJpYWwuanMiLCIuLi9zcmMvbWF0ZXJpYWxzL1Jhd1NoYWRlck1hdGVyaWFsLmpzIiwiLi4vc3JjL21hdGVyaWFscy9NZXNoU3RhbmRhcmRNYXRlcmlhbC5qcyIsIi4uL3NyYy9tYXRlcmlhbHMvTWVzaFBoeXNpY2FsTWF0ZXJpYWwuanMiLCIuLi9zcmMvbWF0ZXJpYWxzL01lc2hQaG9uZ01hdGVyaWFsLmpzIiwiLi4vc3JjL21hdGVyaWFscy9NZXNoVG9vbk1hdGVyaWFsLmpzIiwiLi4vc3JjL21hdGVyaWFscy9NZXNoTm9ybWFsTWF0ZXJpYWwuanMiLCIuLi9zcmMvbWF0ZXJpYWxzL01lc2hMYW1iZXJ0TWF0ZXJpYWwuanMiLCIuLi9zcmMvbWF0ZXJpYWxzL01lc2hEZXB0aE1hdGVyaWFsLmpzIiwiLi4vc3JjL21hdGVyaWFscy9NZXNoRGlzdGFuY2VNYXRlcmlhbC5qcyIsIi4uL3NyYy9tYXRlcmlhbHMvTWVzaE1hdGNhcE1hdGVyaWFsLmpzIiwiLi4vc3JjL21hdGVyaWFscy9MaW5lRGFzaGVkTWF0ZXJpYWwuanMiLCIuLi9zcmMvYW5pbWF0aW9uL0FuaW1hdGlvblV0aWxzLmpzIiwiLi4vc3JjL21hdGgvSW50ZXJwb2xhbnQuanMiLCIuLi9zcmMvbWF0aC9pbnRlcnBvbGFudHMvQ3ViaWNJbnRlcnBvbGFudC5qcyIsIi4uL3NyYy9tYXRoL2ludGVycG9sYW50cy9MaW5lYXJJbnRlcnBvbGFudC5qcyIsIi4uL3NyYy9tYXRoL2ludGVycG9sYW50cy9EaXNjcmV0ZUludGVycG9sYW50LmpzIiwiLi4vc3JjL2FuaW1hdGlvbi9LZXlmcmFtZVRyYWNrLmpzIiwiLi4vc3JjL2FuaW1hdGlvbi90cmFja3MvQm9vbGVhbktleWZyYW1lVHJhY2suanMiLCIuLi9zcmMvYW5pbWF0aW9uL3RyYWNrcy9Db2xvcktleWZyYW1lVHJhY2suanMiLCIuLi9zcmMvYW5pbWF0aW9uL3RyYWNrcy9OdW1iZXJLZXlmcmFtZVRyYWNrLmpzIiwiLi4vc3JjL21hdGgvaW50ZXJwb2xhbnRzL1F1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudC5qcyIsIi4uL3NyYy9hbmltYXRpb24vdHJhY2tzL1F1YXRlcm5pb25LZXlmcmFtZVRyYWNrLmpzIiwiLi4vc3JjL2FuaW1hdGlvbi90cmFja3MvU3RyaW5nS2V5ZnJhbWVUcmFjay5qcyIsIi4uL3NyYy9hbmltYXRpb24vdHJhY2tzL1ZlY3RvcktleWZyYW1lVHJhY2suanMiLCIuLi9zcmMvYW5pbWF0aW9uL0FuaW1hdGlvbkNsaXAuanMiLCIuLi9zcmMvbG9hZGVycy9DYWNoZS5qcyIsIi4uL3NyYy9sb2FkZXJzL0xvYWRpbmdNYW5hZ2VyLmpzIiwiLi4vc3JjL2xvYWRlcnMvTG9hZGVyLmpzIiwiLi4vc3JjL2xvYWRlcnMvRmlsZUxvYWRlci5qcyIsIi4uL3NyYy9sb2FkZXJzL0FuaW1hdGlvbkxvYWRlci5qcyIsIi4uL3NyYy9sb2FkZXJzL0NvbXByZXNzZWRUZXh0dXJlTG9hZGVyLmpzIiwiLi4vc3JjL2xvYWRlcnMvSW1hZ2VMb2FkZXIuanMiLCIuLi9zcmMvbG9hZGVycy9DdWJlVGV4dHVyZUxvYWRlci5qcyIsIi4uL3NyYy9sb2FkZXJzL0RhdGFUZXh0dXJlTG9hZGVyLmpzIiwiLi4vc3JjL2xvYWRlcnMvVGV4dHVyZUxvYWRlci5qcyIsIi4uL3NyYy9saWdodHMvTGlnaHQuanMiLCIuLi9zcmMvbGlnaHRzL0hlbWlzcGhlcmVMaWdodC5qcyIsIi4uL3NyYy9saWdodHMvTGlnaHRTaGFkb3cuanMiLCIuLi9zcmMvbGlnaHRzL1Nwb3RMaWdodFNoYWRvdy5qcyIsIi4uL3NyYy9saWdodHMvU3BvdExpZ2h0LmpzIiwiLi4vc3JjL2xpZ2h0cy9Qb2ludExpZ2h0U2hhZG93LmpzIiwiLi4vc3JjL2xpZ2h0cy9Qb2ludExpZ2h0LmpzIiwiLi4vc3JjL2NhbWVyYXMvT3J0aG9ncmFwaGljQ2FtZXJhLmpzIiwiLi4vc3JjL2xpZ2h0cy9EaXJlY3Rpb25hbExpZ2h0U2hhZG93LmpzIiwiLi4vc3JjL2xpZ2h0cy9EaXJlY3Rpb25hbExpZ2h0LmpzIiwiLi4vc3JjL2xpZ2h0cy9BbWJpZW50TGlnaHQuanMiLCIuLi9zcmMvbGlnaHRzL1JlY3RBcmVhTGlnaHQuanMiLCIuLi9zcmMvbWF0aC9TcGhlcmljYWxIYXJtb25pY3MzLmpzIiwiLi4vc3JjL2xpZ2h0cy9MaWdodFByb2JlLmpzIiwiLi4vc3JjL2xvYWRlcnMvTWF0ZXJpYWxMb2FkZXIuanMiLCIuLi9zcmMvbG9hZGVycy9Mb2FkZXJVdGlscy5qcyIsIi4uL3NyYy9jb3JlL0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5LmpzIiwiLi4vc3JjL2xvYWRlcnMvQnVmZmVyR2VvbWV0cnlMb2FkZXIuanMiLCIuLi9zcmMvbG9hZGVycy9PYmplY3RMb2FkZXIuanMiLCIuLi9zcmMvbG9hZGVycy9JbWFnZUJpdG1hcExvYWRlci5qcyIsIi4uL3NyYy9hdWRpby9BdWRpb0NvbnRleHQuanMiLCIuLi9zcmMvbG9hZGVycy9BdWRpb0xvYWRlci5qcyIsIi4uL3NyYy9jYW1lcmFzL1N0ZXJlb0NhbWVyYS5qcyIsIi4uL3NyYy9jYW1lcmFzL0FycmF5Q2FtZXJhLmpzIiwiLi4vc3JjL2NvcmUvQ2xvY2suanMiLCIuLi9zcmMvYXVkaW8vQXVkaW9MaXN0ZW5lci5qcyIsIi4uL3NyYy9hdWRpby9BdWRpby5qcyIsIi4uL3NyYy9hdWRpby9Qb3NpdGlvbmFsQXVkaW8uanMiLCIuLi9zcmMvYXVkaW8vQXVkaW9BbmFseXNlci5qcyIsIi4uL3NyYy9hbmltYXRpb24vUHJvcGVydHlNaXhlci5qcyIsIi4uL3NyYy9hbmltYXRpb24vUHJvcGVydHlCaW5kaW5nLmpzIiwiLi4vc3JjL2FuaW1hdGlvbi9BbmltYXRpb25PYmplY3RHcm91cC5qcyIsIi4uL3NyYy9hbmltYXRpb24vQW5pbWF0aW9uQWN0aW9uLmpzIiwiLi4vc3JjL2FuaW1hdGlvbi9BbmltYXRpb25NaXhlci5qcyIsIi4uL3NyYy9jb3JlL1JlbmRlclRhcmdldDNELmpzIiwiLi4vc3JjL2NvcmUvUmVuZGVyVGFyZ2V0QXJyYXkuanMiLCIuLi9zcmMvY29yZS9Vbmlmb3JtLmpzIiwiLi4vc3JjL2NvcmUvVW5pZm9ybXNHcm91cC5qcyIsIi4uL3NyYy9jb3JlL0luc3RhbmNlZEludGVybGVhdmVkQnVmZmVyLmpzIiwiLi4vc3JjL2NvcmUvR0xCdWZmZXJBdHRyaWJ1dGUuanMiLCIuLi9zcmMvY29yZS9SYXljYXN0ZXIuanMiLCIuLi9zcmMvbWF0aC9TcGhlcmljYWwuanMiLCIuLi9zcmMvbWF0aC9DeWxpbmRyaWNhbC5qcyIsIi4uL3NyYy9tYXRoL01hdHJpeDIuanMiLCIuLi9zcmMvbWF0aC9Cb3gyLmpzIiwiLi4vc3JjL21hdGgvTGluZTMuanMiLCIuLi9zcmMvaGVscGVycy9TcG90TGlnaHRIZWxwZXIuanMiLCIuLi9zcmMvaGVscGVycy9Ta2VsZXRvbkhlbHBlci5qcyIsIi4uL3NyYy9oZWxwZXJzL1BvaW50TGlnaHRIZWxwZXIuanMiLCIuLi9zcmMvaGVscGVycy9IZW1pc3BoZXJlTGlnaHRIZWxwZXIuanMiLCIuLi9zcmMvaGVscGVycy9HcmlkSGVscGVyLmpzIiwiLi4vc3JjL2hlbHBlcnMvUG9sYXJHcmlkSGVscGVyLmpzIiwiLi4vc3JjL2hlbHBlcnMvRGlyZWN0aW9uYWxMaWdodEhlbHBlci5qcyIsIi4uL3NyYy9oZWxwZXJzL0NhbWVyYUhlbHBlci5qcyIsIi4uL3NyYy9oZWxwZXJzL0JveEhlbHBlci5qcyIsIi4uL3NyYy9oZWxwZXJzL0JveDNIZWxwZXIuanMiLCIuLi9zcmMvaGVscGVycy9QbGFuZUhlbHBlci5qcyIsIi4uL3NyYy9oZWxwZXJzL0Fycm93SGVscGVyLmpzIiwiLi4vc3JjL2hlbHBlcnMvQXhlc0hlbHBlci5qcyIsIi4uL3NyYy9leHRyYXMvY29yZS9TaGFwZVBhdGguanMiLCIuLi9zcmMvZXh0cmFzL0NvbnRyb2xzLmpzIiwiLi4vc3JjL2V4dHJhcy9UZXh0dXJlVXRpbHMuanMiLCIuLi9zcmMvVGhyZWUuQ29yZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgUkVWSVNJT04gPSAnMTc2ZGV2JztcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIG1vdXNlIGJ1dHRvbnMgYW5kIGludGVyYWN0aW9uIHR5cGVzIGluIGNvbnRleHQgb2YgY29udHJvbHMuXHJcbiAqXHJcbiAqIEB0eXBlIHtDb25zdGFudHNNb3VzZX1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTU9VU0UgPSB7IExFRlQ6IDAsIE1JRERMRTogMSwgUklHSFQ6IDIsIFJPVEFURTogMCwgRE9MTFk6IDEsIFBBTjogMiB9O1xyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgdG91Y2ggaW50ZXJhY3Rpb24gdHlwZXMgaW4gY29udGV4dCBvZiBjb250cm9scy5cclxuICpcclxuICogQHR5cGUge0NvbnN0YW50c1RvdWNofVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBUT1VDSCA9IHsgUk9UQVRFOiAwLCBQQU46IDEsIERPTExZX1BBTjogMiwgRE9MTFlfUk9UQVRFOiAzIH07XHJcblxyXG4vKipcclxuICogRGlzYWJsZXMgZmFjZSBjdWxsaW5nLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBDdWxsRmFjZU5vbmUgPSAwO1xyXG5cclxuLyoqXHJcbiAqIEN1bGxzIGJhY2sgZmFjZXMuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEN1bGxGYWNlQmFjayA9IDE7XHJcblxyXG4vKipcclxuICogQ3VsbHMgZnJvbnQgZmFjZXMuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEN1bGxGYWNlRnJvbnQgPSAyO1xyXG5cclxuLyoqXHJcbiAqIEN1bGxzIGJvdGggZnJvbnQgYW5kIGJhY2sgZmFjZXMuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEN1bGxGYWNlRnJvbnRCYWNrID0gMztcclxuXHJcbi8qKlxyXG4gKiBHaXZlcyB1bmZpbHRlcmVkIHNoYWRvdyBtYXBzIC0gZmFzdGVzdCwgYnV0IGxvd2VzdCBxdWFsaXR5LlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBCYXNpY1NoYWRvd01hcCA9IDA7XHJcblxyXG4vKipcclxuICogRmlsdGVycyBzaGFkb3cgbWFwcyB1c2luZyB0aGUgUGVyY2VudGFnZS1DbG9zZXIgRmlsdGVyaW5nIChQQ0YpIGFsZ29yaXRobS5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUENGU2hhZG93TWFwID0gMTtcclxuXHJcbi8qKlxyXG4gKiBGaWx0ZXJzIHNoYWRvdyBtYXBzIHVzaW5nIHRoZSBQZXJjZW50YWdlLUNsb3NlciBGaWx0ZXJpbmcgKFBDRikgYWxnb3JpdGhtIHdpdGhcclxuICogYmV0dGVyIHNvZnQgc2hhZG93cyBlc3BlY2lhbGx5IHdoZW4gdXNpbmcgbG93LXJlc29sdXRpb24gc2hhZG93IG1hcHMuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFBDRlNvZnRTaGFkb3dNYXAgPSAyO1xyXG5cclxuLyoqXHJcbiAqIEZpbHRlcnMgc2hhZG93IG1hcHMgdXNpbmcgdGhlIFZhcmlhbmNlIFNoYWRvdyBNYXAgKFZTTSkgYWxnb3JpdGhtLlxyXG4gKiBXaGVuIHVzaW5nIFZTTVNoYWRvd01hcCBhbGwgc2hhZG93IHJlY2VpdmVycyB3aWxsIGFsc28gY2FzdCBzaGFkb3dzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBWU01TaGFkb3dNYXAgPSAzO1xyXG5cclxuLyoqXHJcbiAqIE9ubHkgZnJvbnQgZmFjZXMgYXJlIHJlbmRlcmVkLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBGcm9udFNpZGUgPSAwO1xyXG5cclxuLyoqXHJcbiAqIE9ubHkgYmFjayBmYWNlcyBhcmUgcmVuZGVyZWQuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEJhY2tTaWRlID0gMTtcclxuXHJcbi8qKlxyXG4gKiBCb3RoIGZyb250IGFuZCBiYWNrIGZhY2VzIGFyZSByZW5kZXJlZC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgRG91YmxlU2lkZSA9IDI7XHJcblxyXG4vKipcclxuICogTm8gYmxlbmRpbmcgaXMgcGVyZm9ybWVkIHdoaWNoIGVmZmVjdGl2ZWx5IGRpc2FibGVzXHJcbiAqIGFscGhhIHRyYW5zcGFyZW5jeS5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTm9CbGVuZGluZyA9IDA7XHJcblxyXG4vKipcclxuICogVGhlIGRlZmF1bHQgYmxlbmRpbmcuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IE5vcm1hbEJsZW5kaW5nID0gMTtcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIGFkZGl0aXZlIGJsZW5kaW5nLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBBZGRpdGl2ZUJsZW5kaW5nID0gMjtcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIHN1YnRyYWN0aXZlIGJsZW5kaW5nLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBTdWJ0cmFjdGl2ZUJsZW5kaW5nID0gMztcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIG11bHRpcGx5IGJsZW5kaW5nLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBNdWx0aXBseUJsZW5kaW5nID0gNDtcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIGN1c3RvbSBibGVuZGluZy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgQ3VzdG9tQmxlbmRpbmcgPSA1O1xyXG5cclxuLyoqXHJcbiAqIEEgYHNvdXJjZSArIGRlc3RpbmF0aW9uYCBibGVuZGluZyBlcXVhdGlvbi5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgQWRkRXF1YXRpb24gPSAxMDA7XHJcblxyXG4vKipcclxuICogQSBgc291cmNlIC0gZGVzdGluYXRpb25gIGJsZW5kaW5nIGVxdWF0aW9uLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBTdWJ0cmFjdEVxdWF0aW9uID0gMTAxO1xyXG5cclxuLyoqXHJcbiAqIEEgYGRlc3RpbmF0aW9uIC0gc291cmNlYCBibGVuZGluZyBlcXVhdGlvbi5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUmV2ZXJzZVN1YnRyYWN0RXF1YXRpb24gPSAxMDI7XHJcblxyXG4vKipcclxuICogQSBibGVuZCBlcXVhdGlvbiB0aGF0IHVzZXMgdGhlIG1pbmltdW0gb2Ygc291cmNlIGFuZCBkZXN0aW5hdGlvbi5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTWluRXF1YXRpb24gPSAxMDM7XHJcblxyXG4vKipcclxuICogQSBibGVuZCBlcXVhdGlvbiB0aGF0IHVzZXMgdGhlIG1heGltdW0gb2Ygc291cmNlIGFuZCBkZXN0aW5hdGlvbi5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTWF4RXF1YXRpb24gPSAxMDQ7XHJcblxyXG4vKipcclxuICogTXVsdGlwbGllcyBhbGwgY29sb3JzIGJ5IGAwYC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgWmVyb0ZhY3RvciA9IDIwMDtcclxuXHJcbi8qKlxyXG4gKiBNdWx0aXBsaWVzIGFsbCBjb2xvcnMgYnkgYDFgLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBPbmVGYWN0b3IgPSAyMDE7XHJcblxyXG4vKipcclxuICogTXVsdGlwbGllcyBhbGwgY29sb3JzIGJ5IHRoZSBzb3VyY2UgY29sb3JzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBTcmNDb2xvckZhY3RvciA9IDIwMjtcclxuXHJcbi8qKlxyXG4gKiBNdWx0aXBsaWVzIGFsbCBjb2xvcnMgYnkgYDFgIG1pbnVzIGVhY2ggc291cmNlIGNvbG9yLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBPbmVNaW51c1NyY0NvbG9yRmFjdG9yID0gMjAzO1xyXG5cclxuLyoqXHJcbiAqIE11bHRpcGxpZXMgYWxsIGNvbG9ycyBieSB0aGUgc291cmNlIGFscGhhIHZhbHVlLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBTcmNBbHBoYUZhY3RvciA9IDIwNDtcclxuXHJcbi8qKlxyXG4gKiBNdWx0aXBsaWVzIGFsbCBjb2xvcnMgYnkgMSBtaW51cyB0aGUgc291cmNlIGFscGhhIHZhbHVlLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBPbmVNaW51c1NyY0FscGhhRmFjdG9yID0gMjA1O1xyXG5cclxuLyoqXHJcbiAqIE11bHRpcGxpZXMgYWxsIGNvbG9ycyBieSB0aGUgZGVzdGluYXRpb24gYWxwaGEgdmFsdWUuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IERzdEFscGhhRmFjdG9yID0gMjA2O1xyXG5cclxuLyoqXHJcbiAqIE11bHRpcGxpZXMgYWxsIGNvbG9ycyBieSBgMWAgbWludXMgdGhlIGRlc3RpbmF0aW9uIGFscGhhIHZhbHVlLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBPbmVNaW51c0RzdEFscGhhRmFjdG9yID0gMjA3O1xyXG5cclxuLyoqXHJcbiAqIE11bHRpcGxpZXMgYWxsIGNvbG9ycyBieSB0aGUgZGVzdGluYXRpb24gY29sb3IuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IERzdENvbG9yRmFjdG9yID0gMjA4O1xyXG5cclxuLyoqXHJcbiAqIE11bHRpcGxpZXMgYWxsIGNvbG9ycyBieSBgMWAgbWludXMgZWFjaCBkZXN0aW5hdGlvbiBjb2xvci5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgT25lTWludXNEc3RDb2xvckZhY3RvciA9IDIwOTtcclxuXHJcbi8qKlxyXG4gKiBNdWx0aXBsaWVzIHRoZSBSR0IgY29sb3JzIGJ5IHRoZSBzbWFsbGVyIG9mIGVpdGhlciB0aGUgc291cmNlIGFscGhhXHJcbiAqIHZhbHVlIG9yIHRoZSB2YWx1ZSBvZiBgMWAgbWludXMgdGhlIGRlc3RpbmF0aW9uIGFscGhhIHZhbHVlLiBUaGUgYWxwaGFcclxuICogdmFsdWUgaXMgbXVsdGlwbGllZCBieSBgMWAuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFNyY0FscGhhU2F0dXJhdGVGYWN0b3IgPSAyMTA7XHJcblxyXG4vKipcclxuICogTXVsdGlwbGllcyBhbGwgY29sb3JzIGJ5IGEgY29uc3RhbnQgY29sb3IuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IENvbnN0YW50Q29sb3JGYWN0b3IgPSAyMTE7XHJcblxyXG4vKipcclxuICogTXVsdGlwbGllcyBhbGwgY29sb3JzIGJ5IGAxYCBtaW51cyBhIGNvbnN0YW50IGNvbG9yLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBPbmVNaW51c0NvbnN0YW50Q29sb3JGYWN0b3IgPSAyMTI7XHJcblxyXG4vKipcclxuICogTXVsdGlwbGllcyBhbGwgY29sb3JzIGJ5IGEgY29uc3RhbnQgYWxwaGEgdmFsdWUuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IENvbnN0YW50QWxwaGFGYWN0b3IgPSAyMTM7XHJcblxyXG4vKipcclxuICogTXVsdGlwbGllcyBhbGwgY29sb3JzIGJ5IDEgbWludXMgYSBjb25zdGFudCBhbHBoYSB2YWx1ZS5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgT25lTWludXNDb25zdGFudEFscGhhRmFjdG9yID0gMjE0O1xyXG5cclxuLyoqXHJcbiAqIE5ldmVyIHBhc3MuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IE5ldmVyRGVwdGggPSAwO1xyXG5cclxuLyoqXHJcbiAqIEFsd2F5cyBwYXNzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBBbHdheXNEZXB0aCA9IDE7XHJcblxyXG4vKipcclxuICogUGFzcyBpZiB0aGUgaW5jb21pbmcgdmFsdWUgaXMgbGVzcyB0aGFuIHRoZSBkZXB0aCBidWZmZXIgdmFsdWUuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IExlc3NEZXB0aCA9IDI7XHJcblxyXG4vKipcclxuICogUGFzcyBpZiB0aGUgaW5jb21pbmcgdmFsdWUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBkZXB0aCBidWZmZXIgdmFsdWUuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IExlc3NFcXVhbERlcHRoID0gMztcclxuXHJcbi8qKlxyXG4gKiBQYXNzIGlmIHRoZSBpbmNvbWluZyB2YWx1ZSBlcXVhbHMgdGhlIGRlcHRoIGJ1ZmZlciB2YWx1ZS5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgRXF1YWxEZXB0aCA9IDQ7XHJcblxyXG4vKipcclxuICogUGFzcyBpZiB0aGUgaW5jb21pbmcgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBkZXB0aCBidWZmZXIgdmFsdWUuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEdyZWF0ZXJFcXVhbERlcHRoID0gNTtcclxuXHJcbi8qKlxyXG4gKiBQYXNzIGlmIHRoZSBpbmNvbWluZyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIGRlcHRoIGJ1ZmZlciB2YWx1ZS5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgR3JlYXRlckRlcHRoID0gNjtcclxuXHJcbi8qKlxyXG4gKiBQYXNzIGlmIHRoZSBpbmNvbWluZyB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gdGhlIGRlcHRoIGJ1ZmZlciB2YWx1ZS5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTm90RXF1YWxEZXB0aCA9IDc7XHJcblxyXG4vKipcclxuICogTXVsdGlwbGllcyB0aGUgZW52aXJvbm1lbnQgbWFwIGNvbG9yIHdpdGggdGhlIHN1cmZhY2UgY29sb3IuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IE11bHRpcGx5T3BlcmF0aW9uID0gMDtcclxuXHJcbi8qKlxyXG4gKiBVc2VzIHJlZmxlY3Rpdml0eSB0byBibGVuZCBiZXR3ZWVuIHRoZSB0d28gY29sb3JzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBNaXhPcGVyYXRpb24gPSAxO1xyXG5cclxuLyoqXHJcbiAqIEFkZHMgdGhlIHR3byBjb2xvcnMuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEFkZE9wZXJhdGlvbiA9IDI7XHJcblxyXG4vKipcclxuICogTm8gdG9uZSBtYXBwaW5nIGlzIGFwcGxpZWQuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IE5vVG9uZU1hcHBpbmcgPSAwO1xyXG5cclxuLyoqXHJcbiAqIExpbmVhciB0b25lIG1hcHBpbmcuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IExpbmVhclRvbmVNYXBwaW5nID0gMTtcclxuXHJcbi8qKlxyXG4gKiBSZWluaGFyZCB0b25lIG1hcHBpbmcuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFJlaW5oYXJkVG9uZU1hcHBpbmcgPSAyO1xyXG5cclxuLyoqXHJcbiAqIENpbmVvbiB0b25lIG1hcHBpbmcuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IENpbmVvblRvbmVNYXBwaW5nID0gMztcclxuXHJcbi8qKlxyXG4gKiBBQ0VTIEZpbG1pYyB0b25lIG1hcHBpbmcuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEFDRVNGaWxtaWNUb25lTWFwcGluZyA9IDQ7XHJcblxyXG4vKipcclxuICogQ3VzdG9tIHRvbmUgbWFwcGluZy5cclxuICpcclxuICogRXhwZWN0cyBhIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBieSBtb2RpZnlpbmcgc2hhZGVyIGNvZGUgb2YgdGhlIG1hdGVyaWFsJ3MgZnJhZ21lbnQgc2hhZGVyLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBDdXN0b21Ub25lTWFwcGluZyA9IDU7XHJcblxyXG4vKipcclxuICogQWdYIHRvbmUgbWFwcGluZy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgQWdYVG9uZU1hcHBpbmcgPSA2O1xyXG5cclxuLyoqXHJcbiAqIE5ldXRyYWwgdG9uZSBtYXBwaW5nLlxyXG4gKlxyXG4gKiBJbXBsZW1lbnRhdGlvbiBiYXNlZCBvbiB0aGUgS2hyb25vcyAzRCBDb21tZXJjZSBHcm91cCBzdGFuZGFyZCB0b25lIG1hcHBpbmcuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IE5ldXRyYWxUb25lTWFwcGluZyA9IDc7XHJcblxyXG4vKipcclxuICogVGhlIHNraW5uZWQgbWVzaCBzaGFyZXMgdGhlIHNhbWUgd29ybGQgc3BhY2UgYXMgdGhlIHNrZWxldG9uLlxyXG4gKlxyXG4gKiBAdHlwZSB7c3RyaW5nfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBBdHRhY2hlZEJpbmRNb2RlID0gJ2F0dGFjaGVkJztcclxuXHJcbi8qKlxyXG4gKiBUaGUgc2tpbm5lZCBtZXNoIGRvZXMgbm90IHNoYXJlIHRoZSBzYW1lIHdvcmxkIHNwYWNlIGFzIHRoZSBza2VsZXRvbi5cclxuICogVGhpcyBpcyB1c2VmdWwgd2hlbiBhIHNrZWxldG9uIGlzIHNoYXJlZCBhY3Jvc3MgbXVsdGlwbGUgc2tpbm5lZCBtZXNoZXMuXHJcbiAqXHJcbiAqIEB0eXBlIHtzdHJpbmd9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IERldGFjaGVkQmluZE1vZGUgPSAnZGV0YWNoZWQnO1xyXG5cclxuLyoqXHJcbiAqIE1hcHMgdGV4dHVyZXMgdXNpbmcgdGhlIGdlb21ldHJ5J3MgVVYgY29vcmRpbmF0ZXMuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFVWTWFwcGluZyA9IDMwMDtcclxuXHJcbi8qKlxyXG4gKiBSZWZsZWN0aW9uIG1hcHBpbmcgZm9yIGN1YmUgdGV4dHVyZXMuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEN1YmVSZWZsZWN0aW9uTWFwcGluZyA9IDMwMTtcclxuXHJcbi8qKlxyXG4gKiBSZWZyYWN0aW9uIG1hcHBpbmcgZm9yIGN1YmUgdGV4dHVyZXMuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEN1YmVSZWZyYWN0aW9uTWFwcGluZyA9IDMwMjtcclxuXHJcbi8qKlxyXG4gKiBSZWZsZWN0aW9uIG1hcHBpbmcgZm9yIGVxdWlyZWN0YW5ndWxhciB0ZXh0dXJlcy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgRXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmcgPSAzMDM7XHJcblxyXG4vKipcclxuICogUmVmcmFjdGlvbiBtYXBwaW5nIGZvciBlcXVpcmVjdGFuZ3VsYXIgdGV4dHVyZXMuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nID0gMzA0O1xyXG5cclxuLyoqXHJcbiAqIFJlZmxlY3Rpb24gbWFwcGluZyBmb3IgUE1SRU0gdGV4dHVyZXMuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nID0gMzA2O1xyXG5cclxuLyoqXHJcbiAqIFRoZSB0ZXh0dXJlIHdpbGwgc2ltcGx5IHJlcGVhdCB0byBpbmZpbml0eS5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUmVwZWF0V3JhcHBpbmcgPSAxMDAwO1xyXG5cclxuLyoqXHJcbiAqIFRoZSBsYXN0IHBpeGVsIG9mIHRoZSB0ZXh0dXJlIHN0cmV0Y2hlcyB0byB0aGUgZWRnZSBvZiB0aGUgbWVzaC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgQ2xhbXBUb0VkZ2VXcmFwcGluZyA9IDEwMDE7XHJcblxyXG4vKipcclxuICogVGhlIHRleHR1cmUgd2lsbCByZXBlYXRzIHRvIGluZmluaXR5LCBtaXJyb3Jpbmcgb24gZWFjaCByZXBlYXQuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IE1pcnJvcmVkUmVwZWF0V3JhcHBpbmcgPSAxMDAyO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSB0ZXh0dXJlIGVsZW1lbnQgdGhhdCBpcyBuZWFyZXN0IChpbiBNYW5oYXR0YW4gZGlzdGFuY2UpXHJcbiAqIHRvIHRoZSBzcGVjaWZpZWQgdGV4dHVyZSBjb29yZGluYXRlcy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTmVhcmVzdEZpbHRlciA9IDEwMDM7XHJcblxyXG4vKipcclxuICogQ2hvb3NlcyB0aGUgbWlwbWFwIHRoYXQgbW9zdCBjbG9zZWx5IG1hdGNoZXMgdGhlIHNpemUgb2YgdGhlIHBpeGVsIGJlaW5nIHRleHR1cmVkXHJcbiAqIGFuZCB1c2VzIHRoZSBgTmVhcmVzdEZpbHRlcmAgY3JpdGVyaW9uICh0aGUgdGV4ZWwgbmVhcmVzdCB0byB0aGUgY2VudGVyIG9mIHRoZSBwaXhlbClcclxuICogdG8gcHJvZHVjZSBhIHRleHR1cmUgdmFsdWUuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IE5lYXJlc3RNaXBtYXBOZWFyZXN0RmlsdGVyID0gMTAwNDtcclxuZXhwb3J0IGNvbnN0IE5lYXJlc3RNaXBNYXBOZWFyZXN0RmlsdGVyID0gMTAwNDsgLy8gbGVnYWN5XHJcblxyXG4vKipcclxuICogQ2hvb3NlcyB0aGUgdHdvIG1pcG1hcHMgdGhhdCBtb3N0IGNsb3NlbHkgbWF0Y2ggdGhlIHNpemUgb2YgdGhlIHBpeGVsIGJlaW5nIHRleHR1cmVkIGFuZFxyXG4gKiB1c2VzIHRoZSBgTmVhcmVzdEZpbHRlcmAgY3JpdGVyaW9uIHRvIHByb2R1Y2UgYSB0ZXh0dXJlIHZhbHVlIGZyb20gZWFjaCBtaXBtYXAuXHJcbiAqIFRoZSBmaW5hbCB0ZXh0dXJlIHZhbHVlIGlzIGEgd2VpZ2h0ZWQgYXZlcmFnZSBvZiB0aG9zZSB0d28gdmFsdWVzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBOZWFyZXN0TWlwbWFwTGluZWFyRmlsdGVyID0gMTAwNTtcclxuZXhwb3J0IGNvbnN0IE5lYXJlc3RNaXBNYXBMaW5lYXJGaWx0ZXIgPSAxMDA1OyAvLyBsZWdhY3lcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSB3ZWlnaHRlZCBhdmVyYWdlIG9mIHRoZSBmb3VyIHRleHR1cmUgZWxlbWVudHMgdGhhdCBhcmUgY2xvc2VzdCB0byB0aGUgc3BlY2lmaWVkXHJcbiAqIHRleHR1cmUgY29vcmRpbmF0ZXMsIGFuZCBjYW4gaW5jbHVkZSBpdGVtcyB3cmFwcGVkIG9yIHJlcGVhdGVkIGZyb20gb3RoZXIgcGFydHMgb2YgYSB0ZXh0dXJlLFxyXG4gKiBkZXBlbmRpbmcgb24gdGhlIHZhbHVlcyBvZiBgd3JhcFNgIGFuZCBgd3JhcFRgLCBhbmQgb24gdGhlIGV4YWN0IG1hcHBpbmcuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IExpbmVhckZpbHRlciA9IDEwMDY7XHJcblxyXG4vKipcclxuICogQ2hvb3NlcyB0aGUgbWlwbWFwIHRoYXQgbW9zdCBjbG9zZWx5IG1hdGNoZXMgdGhlIHNpemUgb2YgdGhlIHBpeGVsIGJlaW5nIHRleHR1cmVkIGFuZCB1c2VzXHJcbiAqIHRoZSBgTGluZWFyRmlsdGVyYCBjcml0ZXJpb24gKGEgd2VpZ2h0ZWQgYXZlcmFnZSBvZiB0aGUgZm91ciB0ZXhlbHMgdGhhdCBhcmUgY2xvc2VzdCB0byB0aGVcclxuICogY2VudGVyIG9mIHRoZSBwaXhlbCkgdG8gcHJvZHVjZSBhIHRleHR1cmUgdmFsdWUuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IExpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXIgPSAxMDA3O1xyXG5leHBvcnQgY29uc3QgTGluZWFyTWlwTWFwTmVhcmVzdEZpbHRlciA9IDEwMDc7IC8vIGxlZ2FjeVxyXG5cclxuLyoqXHJcbiAqIENob29zZXMgdGhlIHR3byBtaXBtYXBzIHRoYXQgbW9zdCBjbG9zZWx5IG1hdGNoIHRoZSBzaXplIG9mIHRoZSBwaXhlbCBiZWluZyB0ZXh0dXJlZCBhbmQgdXNlc1xyXG4gKiB0aGUgYExpbmVhckZpbHRlcmAgY3JpdGVyaW9uIHRvIHByb2R1Y2UgYSB0ZXh0dXJlIHZhbHVlIGZyb20gZWFjaCBtaXBtYXAuIFRoZSBmaW5hbCB0ZXh0dXJlIHZhbHVlXHJcbiAqIGlzIGEgd2VpZ2h0ZWQgYXZlcmFnZSBvZiB0aG9zZSB0d28gdmFsdWVzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXIgPSAxMDA4O1xyXG5leHBvcnQgY29uc3QgTGluZWFyTWlwTWFwTGluZWFyRmlsdGVyID0gMTAwODsgLy8gbGVnYWN5XHJcblxyXG4vKipcclxuICogQW4gdW5zaWduZWQgYnl0ZSBkYXRhIHR5cGUgZm9yIHRleHR1cmVzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBVbnNpZ25lZEJ5dGVUeXBlID0gMTAwOTtcclxuXHJcbi8qKlxyXG4gKiBBIGJ5dGUgZGF0YSB0eXBlIGZvciB0ZXh0dXJlcy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgQnl0ZVR5cGUgPSAxMDEwO1xyXG5cclxuLyoqXHJcbiAqIEEgc2hvcnQgZGF0YSB0eXBlIGZvciB0ZXh0dXJlcy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgU2hvcnRUeXBlID0gMTAxMTtcclxuXHJcbi8qKlxyXG4gKiBBbiB1bnNpZ25lZCBzaG9ydCBkYXRhIHR5cGUgZm9yIHRleHR1cmVzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBVbnNpZ25lZFNob3J0VHlwZSA9IDEwMTI7XHJcblxyXG4vKipcclxuICogQW4gaW50IGRhdGEgdHlwZSBmb3IgdGV4dHVyZXMuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEludFR5cGUgPSAxMDEzO1xyXG5cclxuLyoqXHJcbiAqIEFuIHVuc2lnbmVkIGludCBkYXRhIHR5cGUgZm9yIHRleHR1cmVzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBVbnNpZ25lZEludFR5cGUgPSAxMDE0O1xyXG5cclxuLyoqXHJcbiAqIEEgZmxvYXQgZGF0YSB0eXBlIGZvciB0ZXh0dXJlcy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgRmxvYXRUeXBlID0gMTAxNTtcclxuXHJcbi8qKlxyXG4gKiBBIGhhbGYgZmxvYXQgZGF0YSB0eXBlIGZvciB0ZXh0dXJlcy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgSGFsZkZsb2F0VHlwZSA9IDEwMTY7XHJcblxyXG4vKipcclxuICogQW4gdW5zaWduZWQgc2hvcnQgNF80XzRfNCAocGFja2VkKSBkYXRhIHR5cGUgZm9yIHRleHR1cmVzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBVbnNpZ25lZFNob3J0NDQ0NFR5cGUgPSAxMDE3O1xyXG5cclxuLyoqXHJcbiAqIEFuIHVuc2lnbmVkIHNob3J0IDVfNV81XzEgKHBhY2tlZCkgZGF0YSB0eXBlIGZvciB0ZXh0dXJlcy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgVW5zaWduZWRTaG9ydDU1NTFUeXBlID0gMTAxODtcclxuXHJcbi8qKlxyXG4gKiBBbiB1bnNpZ25lZCBpbnQgMjRfOCBkYXRhIHR5cGUgZm9yIHRleHR1cmVzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBVbnNpZ25lZEludDI0OFR5cGUgPSAxMDIwO1xyXG5cclxuLyoqXHJcbiAqIEFuIHVuc2lnbmVkIGludCA1XzlfOV85IChwYWNrZWQpIGRhdGEgdHlwZSBmb3IgdGV4dHVyZXMuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFVuc2lnbmVkSW50NTk5OVR5cGUgPSAzNTkwMjtcclxuXHJcbi8qKlxyXG4gKiBEaXNjYXJkcyB0aGUgcmVkLCBncmVlbiBhbmQgYmx1ZSBjb21wb25lbnRzIGFuZCByZWFkcyBqdXN0IHRoZSBhbHBoYSBjb21wb25lbnQuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEFscGhhRm9ybWF0ID0gMTAyMTtcclxuXHJcbi8qKlxyXG4gKiBEaXNjYXJkcyB0aGUgYWxwaGEgY29tcG9uZW50IGFuZCByZWFkcyB0aGUgcmVkLCBncmVlbiBhbmQgYmx1ZSBjb21wb25lbnQuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFJHQkZvcm1hdCA9IDEwMjI7XHJcblxyXG4vKipcclxuICogUmVhZHMgdGhlIHJlZCwgZ3JlZW4sIGJsdWUgYW5kIGFscGhhIGNvbXBvbmVudHMuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFJHQkFGb3JtYXQgPSAxMDIzO1xyXG5cclxuLyoqXHJcbiAqIHJlYWRzIGVhY2ggZWxlbWVudCBhcyBhIHNpbmdsZSBsdW1pbmFuY2UgY29tcG9uZW50LiBUaGlzIGlzIHRoZW4gY29udmVydGVkIHRvIGEgZmxvYXRpbmcgcG9pbnQsXHJcbiAqIGNsYW1wZWQgdG8gdGhlIHJhbmdlIGBbMCwxXWAsIGFuZCB0aGVuIGFzc2VtYmxlZCBpbnRvIGFuIFJHQkEgZWxlbWVudCBieSBwbGFjaW5nIHRoZSBsdW1pbmFuY2UgdmFsdWVcclxuICogaW4gdGhlIHJlZCwgZ3JlZW4gYW5kIGJsdWUgY2hhbm5lbHMsIGFuZCBhdHRhY2hpbmcgMS4wIHRvIHRoZSBhbHBoYSBjaGFubmVsLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBMdW1pbmFuY2VGb3JtYXQgPSAxMDI0O1xyXG5cclxuLyoqXHJcbiAqIFJlYWRzIGVhY2ggZWxlbWVudCBhcyBhIGx1bWluYW5jZS9hbHBoYSBkb3VibGUuIFRoZSBzYW1lIHByb2Nlc3Mgb2NjdXJzIGFzIGZvciB0aGUgYEx1bWluYW5jZUZvcm1hdGAsXHJcbiAqIGV4Y2VwdCB0aGF0IHRoZSBhbHBoYSBjaGFubmVsIG1heSBoYXZlIHZhbHVlcyBvdGhlciB0aGFuIGAxLjBgLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBMdW1pbmFuY2VBbHBoYUZvcm1hdCA9IDEwMjU7XHJcblxyXG4vKipcclxuICogUmVhZHMgZWFjaCBlbGVtZW50IGFzIGEgc2luZ2xlIGRlcHRoIHZhbHVlLCBjb252ZXJ0cyBpdCB0byBmbG9hdGluZyBwb2ludCwgYW5kIGNsYW1wcyB0byB0aGUgcmFuZ2UgYFswLDFdYC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgRGVwdGhGb3JtYXQgPSAxMDI2O1xyXG5cclxuLyoqXHJcbiAqIFJlYWRzIGVhY2ggZWxlbWVudCBpcyBhIHBhaXIgb2YgZGVwdGggYW5kIHN0ZW5jaWwgdmFsdWVzLiBUaGUgZGVwdGggY29tcG9uZW50IG9mIHRoZSBwYWlyIGlzIGludGVycHJldGVkIGFzXHJcbiAqIGluIGBEZXB0aEZvcm1hdGAuIFRoZSBzdGVuY2lsIGNvbXBvbmVudCBpcyBpbnRlcnByZXRlZCBiYXNlZCBvbiB0aGUgZGVwdGggKyBzdGVuY2lsIGludGVybmFsIGZvcm1hdC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgRGVwdGhTdGVuY2lsRm9ybWF0ID0gMTAyNztcclxuXHJcbi8qKlxyXG4gKiBEaXNjYXJkcyB0aGUgZ3JlZW4sIGJsdWUgYW5kIGFscGhhIGNvbXBvbmVudHMgYW5kIHJlYWRzIGp1c3QgdGhlIHJlZCBjb21wb25lbnQuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFJlZEZvcm1hdCA9IDEwMjg7XHJcblxyXG4vKipcclxuICogRGlzY2FyZHMgdGhlIGdyZWVuLCBibHVlIGFuZCBhbHBoYSBjb21wb25lbnRzIGFuZCByZWFkcyBqdXN0IHRoZSByZWQgY29tcG9uZW50LiBUaGUgdGV4ZWxzIGFyZSByZWFkIGFzIGludGVnZXJzIGluc3RlYWQgb2YgZmxvYXRpbmcgcG9pbnQuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFJlZEludGVnZXJGb3JtYXQgPSAxMDI5O1xyXG5cclxuLyoqXHJcbiAqIERpc2NhcmRzIHRoZSBhbHBoYSwgYW5kIGJsdWUgY29tcG9uZW50cyBhbmQgcmVhZHMgdGhlIHJlZCwgYW5kIGdyZWVuIGNvbXBvbmVudHMuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFJHRm9ybWF0ID0gMTAzMDtcclxuXHJcbi8qKlxyXG4gKiBEaXNjYXJkcyB0aGUgYWxwaGEsIGFuZCBibHVlIGNvbXBvbmVudHMgYW5kIHJlYWRzIHRoZSByZWQsIGFuZCBncmVlbiBjb21wb25lbnRzLiBUaGUgdGV4ZWxzIGFyZSByZWFkIGFzIGludGVnZXJzIGluc3RlYWQgb2YgZmxvYXRpbmcgcG9pbnQuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFJHSW50ZWdlckZvcm1hdCA9IDEwMzE7XHJcblxyXG4vKipcclxuICogRGlzY2FyZHMgdGhlIGFscGhhIGNvbXBvbmVudCBhbmQgcmVhZHMgdGhlIHJlZCwgZ3JlZW4gYW5kIGJsdWUgY29tcG9uZW50LiBUaGUgdGV4ZWxzIGFyZSByZWFkIGFzIGludGVnZXJzIGluc3RlYWQgb2YgZmxvYXRpbmcgcG9pbnQuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFJHQkludGVnZXJGb3JtYXQgPSAxMDMyO1xyXG5cclxuLyoqXHJcbiAqIFJlYWRzIHRoZSByZWQsIGdyZWVuLCBibHVlIGFuZCBhbHBoYSBjb21wb25lbnRzLiBUaGUgdGV4ZWxzIGFyZSByZWFkIGFzIGludGVnZXJzIGluc3RlYWQgb2YgZmxvYXRpbmcgcG9pbnQuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFJHQkFJbnRlZ2VyRm9ybWF0ID0gMTAzMztcclxuXHJcbi8qKlxyXG4gKiBBIERYVDEtY29tcHJlc3NlZCBpbWFnZSBpbiBhbiBSR0IgaW1hZ2UgZm9ybWF0LlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBSR0JfUzNUQ19EWFQxX0Zvcm1hdCA9IDMzNzc2O1xyXG5cclxuLyoqXHJcbiAqIEEgRFhUMS1jb21wcmVzc2VkIGltYWdlIGluIGFuIFJHQiBpbWFnZSBmb3JtYXQgd2l0aCBhIHNpbXBsZSBvbi9vZmYgYWxwaGEgdmFsdWUuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFJHQkFfUzNUQ19EWFQxX0Zvcm1hdCA9IDMzNzc3O1xyXG5cclxuLyoqXHJcbiAqIEEgRFhUMy1jb21wcmVzc2VkIGltYWdlIGluIGFuIFJHQkEgaW1hZ2UgZm9ybWF0LiBDb21wYXJlZCB0byBhIDMyLWJpdCBSR0JBIHRleHR1cmUsIGl0IG9mZmVycyA0OjEgY29tcHJlc3Npb24uXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFJHQkFfUzNUQ19EWFQzX0Zvcm1hdCA9IDMzNzc4O1xyXG5cclxuLyoqXHJcbiAqIEEgRFhUNS1jb21wcmVzc2VkIGltYWdlIGluIGFuIFJHQkEgaW1hZ2UgZm9ybWF0LiBJdCBhbHNvIHByb3ZpZGVzIGEgNDoxIGNvbXByZXNzaW9uLCBidXQgZGlmZmVycyB0byB0aGUgRFhUM1xyXG4gKiBjb21wcmVzc2lvbiBpbiBob3cgdGhlIGFscGhhIGNvbXByZXNzaW9uIGlzIGRvbmUuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFJHQkFfUzNUQ19EWFQ1X0Zvcm1hdCA9IDMzNzc5O1xyXG5cclxuLyoqXHJcbiAqIFBWUlRDIFJHQiBjb21wcmVzc2lvbiBpbiA0LWJpdCBtb2RlLiBPbmUgYmxvY2sgZm9yIGVhY2ggNMOXNCBwaXhlbHMuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFJHQl9QVlJUQ180QlBQVjFfRm9ybWF0ID0gMzU4NDA7XHJcblxyXG4vKipcclxuICogUFZSVEMgUkdCIGNvbXByZXNzaW9uIGluIDItYml0IG1vZGUuIE9uZSBibG9jayBmb3IgZWFjaCA4w5c0IHBpeGVscy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUkdCX1BWUlRDXzJCUFBWMV9Gb3JtYXQgPSAzNTg0MTtcclxuXHJcbi8qKlxyXG4gKiBQVlJUQyBSR0JBIGNvbXByZXNzaW9uIGluIDQtYml0IG1vZGUuIE9uZSBibG9jayBmb3IgZWFjaCA0w5c0IHBpeGVscy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUkdCQV9QVlJUQ180QlBQVjFfRm9ybWF0ID0gMzU4NDI7XHJcblxyXG4vKipcclxuICogUFZSVEMgUkdCQSBjb21wcmVzc2lvbiBpbiAyLWJpdCBtb2RlLiBPbmUgYmxvY2sgZm9yIGVhY2ggOMOXNCBwaXhlbHMuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFJHQkFfUFZSVENfMkJQUFYxX0Zvcm1hdCA9IDM1ODQzO1xyXG5cclxuLyoqXHJcbiAqIEVUQzEgUkdCIGZvcm1hdC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUkdCX0VUQzFfRm9ybWF0ID0gMzYxOTY7XHJcblxyXG4vKipcclxuICogRVRDMiBSR0IgZm9ybWF0LlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBSR0JfRVRDMl9Gb3JtYXQgPSAzNzQ5MjtcclxuXHJcbi8qKlxyXG4gKiBFVEMyIFJHQkEgZm9ybWF0LlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBSR0JBX0VUQzJfRUFDX0Zvcm1hdCA9IDM3NDk2O1xyXG5cclxuLyoqXHJcbiAqIEFTVEMgUkdCQSA0eDQgZm9ybWF0LlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBSR0JBX0FTVENfNHg0X0Zvcm1hdCA9IDM3ODA4O1xyXG5cclxuLyoqXHJcbiAqIEFTVEMgUkdCQSA1eDQgZm9ybWF0LlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBSR0JBX0FTVENfNXg0X0Zvcm1hdCA9IDM3ODA5O1xyXG5cclxuLyoqXHJcbiAqIEFTVEMgUkdCQSA1eDUgZm9ybWF0LlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBSR0JBX0FTVENfNXg1X0Zvcm1hdCA9IDM3ODEwO1xyXG5cclxuLyoqXHJcbiAqIEFTVEMgUkdCQSA2eDUgZm9ybWF0LlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBSR0JBX0FTVENfNng1X0Zvcm1hdCA9IDM3ODExO1xyXG5cclxuLyoqXHJcbiAqIEFTVEMgUkdCQSA2eDYgZm9ybWF0LlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBSR0JBX0FTVENfNng2X0Zvcm1hdCA9IDM3ODEyO1xyXG5cclxuLyoqXHJcbiAqIEFTVEMgUkdCQSA4eDUgZm9ybWF0LlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBSR0JBX0FTVENfOHg1X0Zvcm1hdCA9IDM3ODEzO1xyXG5cclxuLyoqXHJcbiAqIEFTVEMgUkdCQSA4eDYgZm9ybWF0LlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBSR0JBX0FTVENfOHg2X0Zvcm1hdCA9IDM3ODE0O1xyXG5cclxuLyoqXHJcbiAqIEFTVEMgUkdCQSA4eDggZm9ybWF0LlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBSR0JBX0FTVENfOHg4X0Zvcm1hdCA9IDM3ODE1O1xyXG5cclxuLyoqXHJcbiAqIEFTVEMgUkdCQSAxMHg1IGZvcm1hdC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUkdCQV9BU1RDXzEweDVfRm9ybWF0ID0gMzc4MTY7XHJcblxyXG4vKipcclxuICogQVNUQyBSR0JBIDEweDYgZm9ybWF0LlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBSR0JBX0FTVENfMTB4Nl9Gb3JtYXQgPSAzNzgxNztcclxuXHJcbi8qKlxyXG4gKiBBU1RDIFJHQkEgMTB4OCBmb3JtYXQuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFJHQkFfQVNUQ18xMHg4X0Zvcm1hdCA9IDM3ODE4O1xyXG5cclxuLyoqXHJcbiAqIEFTVEMgUkdCQSAxMHgxMCBmb3JtYXQuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFJHQkFfQVNUQ18xMHgxMF9Gb3JtYXQgPSAzNzgxOTtcclxuXHJcbi8qKlxyXG4gKiBBU1RDIFJHQkEgMTJ4MTAgZm9ybWF0LlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBSR0JBX0FTVENfMTJ4MTBfRm9ybWF0ID0gMzc4MjA7XHJcblxyXG4vKipcclxuICogQVNUQyBSR0JBIDEyeDEyIGZvcm1hdC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUkdCQV9BU1RDXzEyeDEyX0Zvcm1hdCA9IDM3ODIxO1xyXG5cclxuLyoqXHJcbiAqIEJQVEMgUkdCQSBmb3JtYXQuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFJHQkFfQlBUQ19Gb3JtYXQgPSAzNjQ5MjtcclxuXHJcbi8qKlxyXG4gKiBCUFRDIFNpZ25lZCBSR0IgZm9ybWF0LlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBSR0JfQlBUQ19TSUdORURfRm9ybWF0ID0gMzY0OTQ7XHJcblxyXG4vKipcclxuICogQlBUQyBVbnNpZ25lZCBSR0IgZm9ybWF0LlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBSR0JfQlBUQ19VTlNJR05FRF9Gb3JtYXQgPSAzNjQ5NTtcclxuXHJcbi8qKlxyXG4gKiBSR1RDMSBSZWQgZm9ybWF0LlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBSRURfUkdUQzFfRm9ybWF0ID0gMzYyODM7XHJcblxyXG4vKipcclxuICogUkdUQzEgU2lnbmVkIFJlZCBmb3JtYXQuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFNJR05FRF9SRURfUkdUQzFfRm9ybWF0ID0gMzYyODQ7XHJcblxyXG4vKipcclxuICogUkdUQzIgUmVkIEdyZWVuIGZvcm1hdC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUkVEX0dSRUVOX1JHVEMyX0Zvcm1hdCA9IDM2Mjg1O1xyXG5cclxuLyoqXHJcbiAqIFJHVEMyIFNpZ25lZCBSZWQgR3JlZW4gZm9ybWF0LlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBTSUdORURfUkVEX0dSRUVOX1JHVEMyX0Zvcm1hdCA9IDM2Mjg2O1xyXG5cclxuLyoqXHJcbiAqIEFuaW1hdGlvbnMgYXJlIHBsYXllZCBvbmNlLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBMb29wT25jZSA9IDIyMDA7XHJcblxyXG4vKipcclxuICogQW5pbWF0aW9ucyBhcmUgcGxheWVkIHdpdGggYSBjaG9zZW4gbnVtYmVyIG9mIHJlcGV0aXRpb25zLCBlYWNoIHRpbWUganVtcGluZyBmcm9tXHJcbiAqIHRoZSBlbmQgb2YgdGhlIGNsaXAgZGlyZWN0bHkgdG8gaXRzIGJlZ2lubmluZy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTG9vcFJlcGVhdCA9IDIyMDE7XHJcblxyXG4vKipcclxuICogQW5pbWF0aW9ucyBhcmUgcGxheWVkIHdpdGggYSBjaG9zZW4gbnVtYmVyIG9mIHJlcGV0aXRpb25zLCBhbHRlcm5hdGVseSBwbGF5aW5nIGZvcndhcmRcclxuICogYW5kIGJhY2t3YXJkLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBMb29wUGluZ1BvbmcgPSAyMjAyO1xyXG5cclxuLyoqXHJcbiAqIERpc2NyZXRlIGludGVycG9sYXRpb24gbW9kZSBmb3Iga2V5ZnJhbWUgdHJhY2tzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBJbnRlcnBvbGF0ZURpc2NyZXRlID0gMjMwMDtcclxuXHJcbi8qKlxyXG4gKiBMaW5lYXIgaW50ZXJwb2xhdGlvbiBtb2RlIGZvciBrZXlmcmFtZSB0cmFja3MuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEludGVycG9sYXRlTGluZWFyID0gMjMwMTtcclxuXHJcbi8qKlxyXG4gKiBTbW9vdGggaW50ZXJwb2xhdGlvbiBtb2RlIGZvciBrZXlmcmFtZSB0cmFja3MuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEludGVycG9sYXRlU21vb3RoID0gMjMwMjtcclxuXHJcbi8qKlxyXG4gKiBaZXJvIGN1cnZhdHVyZSBlbmRpbmcgZm9yIGFuaW1hdGlvbnMuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFplcm9DdXJ2YXR1cmVFbmRpbmcgPSAyNDAwO1xyXG5cclxuLyoqXHJcbiAqIFplcm8gc2xvcGUgZW5kaW5nIGZvciBhbmltYXRpb25zLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBaZXJvU2xvcGVFbmRpbmcgPSAyNDAxO1xyXG5cclxuLyoqXHJcbiAqIFdyYXAgYXJvdW5kIGVuZGluZyBmb3IgYW5pbWF0aW9ucy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgV3JhcEFyb3VuZEVuZGluZyA9IDI0MDI7XHJcblxyXG4vKipcclxuICogRGVmYXVsdCBhbmltYXRpb24gYmxlbmQgbW9kZS5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTm9ybWFsQW5pbWF0aW9uQmxlbmRNb2RlID0gMjUwMDtcclxuXHJcbi8qKlxyXG4gKiBBZGRpdGl2ZSBhbmltYXRpb24gYmxlbmQgbW9kZS4gQ2FuIGJlIHVzZWQgdG8gbGF5ZXIgbW90aW9ucyBvbiB0b3Agb2ZcclxuICogZWFjaCBvdGhlciB0byBidWlsZCBjb21wbGV4IHBlcmZvcm1hbmNlcyBmcm9tIHNtYWxsZXIgcmUtdXNhYmxlIGFzc2V0cy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgQWRkaXRpdmVBbmltYXRpb25CbGVuZE1vZGUgPSAyNTAxO1xyXG5cclxuLyoqXHJcbiAqIEZvciBldmVyeSB0aHJlZSB2ZXJ0aWNlcyBkcmF3IGEgc2luZ2xlIHRyaWFuZ2xlLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBUcmlhbmdsZXNEcmF3TW9kZSA9IDA7XHJcblxyXG4vKipcclxuICogRm9yIGVhY2ggdmVydGV4IGRyYXcgYSB0cmlhbmdsZSBmcm9tIHRoZSBsYXN0IHRocmVlIHZlcnRpY2VzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBUcmlhbmdsZVN0cmlwRHJhd01vZGUgPSAxO1xyXG5cclxuLyoqXHJcbiAqIEZvciBlYWNoIHZlcnRleCBkcmF3IGEgdHJpYW5nbGUgZnJvbSB0aGUgZmlyc3QgdmVydGV4IGFuZCB0aGUgbGFzdCB0d28gdmVydGljZXMuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFRyaWFuZ2xlRmFuRHJhd01vZGUgPSAyO1xyXG5cclxuLyoqXHJcbiAqIEJhc2ljIGRlcHRoIHBhY2tpbmcuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEJhc2ljRGVwdGhQYWNraW5nID0gMzIwMDtcclxuXHJcbi8qKlxyXG4gKiBBIGRlcHRoIHZhbHVlIGlzIHBhY2tlZCBpbnRvIDMyIGJpdCBSR0JBLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBSR0JBRGVwdGhQYWNraW5nID0gMzIwMTtcclxuXHJcbi8qKlxyXG4gKiBBIGRlcHRoIHZhbHVlIGlzIHBhY2tlZCBpbnRvIDI0IGJpdCBSR0IuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFJHQkRlcHRoUGFja2luZyA9IDMyMDI7XHJcblxyXG4vKipcclxuICogQSBkZXB0aCB2YWx1ZSBpcyBwYWNrZWQgaW50byAxNiBiaXQgUkcuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFJHRGVwdGhQYWNraW5nID0gMzIwMztcclxuXHJcbi8qKlxyXG4gKiBOb3JtYWwgaW5mb3JtYXRpb24gaXMgcmVsYXRpdmUgdG8gdGhlIHVuZGVybHlpbmcgc3VyZmFjZS5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgVGFuZ2VudFNwYWNlTm9ybWFsTWFwID0gMDtcclxuXHJcbi8qKlxyXG4gKiBOb3JtYWwgaW5mb3JtYXRpb24gaXMgcmVsYXRpdmUgdG8gdGhlIG9iamVjdCBvcmllbnRhdGlvbi5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgT2JqZWN0U3BhY2VOb3JtYWxNYXAgPSAxO1xyXG5cclxuLy8gQ29sb3Igc3BhY2Ugc3RyaW5nIGlkZW50aWZpZXJzLCBtYXRjaGluZyBDU1MgQ29sb3IgTW9kdWxlIExldmVsIDQgYW5kIFdlYkdQVSBuYW1lcyB3aGVyZSBhdmFpbGFibGUuXHJcblxyXG4vKipcclxuICogTm8gY29sb3Igc3BhY2UuXHJcbiAqXHJcbiAqIEB0eXBlIHtzdHJpbmd9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IE5vQ29sb3JTcGFjZSA9ICcnO1xyXG5cclxuLyoqXHJcbiAqIHNSR0IgY29sb3Igc3BhY2UuXHJcbiAqXHJcbiAqIEB0eXBlIHtzdHJpbmd9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFNSR0JDb2xvclNwYWNlID0gJ3NyZ2InO1xyXG5cclxuLyoqXHJcbiAqIHNSR0ItbGluZWFyIGNvbG9yIHNwYWNlLlxyXG4gKlxyXG4gKiBAdHlwZSB7c3RyaW5nfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBMaW5lYXJTUkdCQ29sb3JTcGFjZSA9ICdzcmdiLWxpbmVhcic7XHJcblxyXG4vKipcclxuICogTGluZWFyIHRyYW5zZmVyIGZ1bmN0aW9uLlxyXG4gKlxyXG4gKiBAdHlwZSB7c3RyaW5nfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBMaW5lYXJUcmFuc2ZlciA9ICdsaW5lYXInO1xyXG5cclxuLyoqXHJcbiAqIHNSR0IgdHJhbnNmZXIgZnVuY3Rpb24uXHJcbiAqXHJcbiAqIEB0eXBlIHtzdHJpbmd9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFNSR0JUcmFuc2ZlciA9ICdzcmdiJztcclxuXHJcbi8qKlxyXG4gKiBTZXRzIHRoZSBzdGVuY2lsIGJ1ZmZlciB2YWx1ZSB0byBgMGAuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFplcm9TdGVuY2lsT3AgPSAwO1xyXG5cclxuLyoqXHJcbiAqIEtlZXBzIHRoZSBjdXJyZW50IHZhbHVlLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBLZWVwU3RlbmNpbE9wID0gNzY4MDtcclxuXHJcbi8qKlxyXG4gKiBTZXRzIHRoZSBzdGVuY2lsIGJ1ZmZlciB2YWx1ZSB0byB0aGUgc3BlY2lmaWVkIHJlZmVyZW5jZSB2YWx1ZS5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUmVwbGFjZVN0ZW5jaWxPcCA9IDc2ODE7XHJcblxyXG4vKipcclxuICogSW5jcmVtZW50cyB0aGUgY3VycmVudCBzdGVuY2lsIGJ1ZmZlciB2YWx1ZS4gQ2xhbXBzIHRvIHRoZSBtYXhpbXVtIHJlcHJlc2VudGFibGUgdW5zaWduZWQgdmFsdWUuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEluY3JlbWVudFN0ZW5jaWxPcCA9IDc2ODI7XHJcblxyXG4vKipcclxuICogRGVjcmVtZW50cyB0aGUgY3VycmVudCBzdGVuY2lsIGJ1ZmZlciB2YWx1ZS4gQ2xhbXBzIHRvIGAwYC5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgRGVjcmVtZW50U3RlbmNpbE9wID0gNzY4MztcclxuXHJcbi8qKlxyXG4gKiBJbmNyZW1lbnRzIHRoZSBjdXJyZW50IHN0ZW5jaWwgYnVmZmVyIHZhbHVlLiBXcmFwcyBzdGVuY2lsIGJ1ZmZlciB2YWx1ZSB0byB6ZXJvIHdoZW4gaW5jcmVtZW50aW5nXHJcbiAqIHRoZSBtYXhpbXVtIHJlcHJlc2VudGFibGUgdW5zaWduZWQgdmFsdWUuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEluY3JlbWVudFdyYXBTdGVuY2lsT3AgPSAzNDA1NTtcclxuXHJcbi8qKlxyXG4gKiBEZWNyZW1lbnRzIHRoZSBjdXJyZW50IHN0ZW5jaWwgYnVmZmVyIHZhbHVlLiBXcmFwcyBzdGVuY2lsIGJ1ZmZlciB2YWx1ZSB0byB0aGUgbWF4aW11bSByZXByZXNlbnRhYmxlXHJcbiAqIHVuc2lnbmVkIHZhbHVlIHdoZW4gZGVjcmVtZW50aW5nIGEgc3RlbmNpbCBidWZmZXIgdmFsdWUgb2YgYDBgLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBEZWNyZW1lbnRXcmFwU3RlbmNpbE9wID0gMzQwNTY7XHJcblxyXG4vKipcclxuICogSW52ZXJ0cyB0aGUgY3VycmVudCBzdGVuY2lsIGJ1ZmZlciB2YWx1ZSBiaXR3aXNlLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBJbnZlcnRTdGVuY2lsT3AgPSA1Mzg2O1xyXG5cclxuLyoqXHJcbiAqIFdpbGwgbmV2ZXIgcmV0dXJuIHRydWUuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IE5ldmVyU3RlbmNpbEZ1bmMgPSA1MTI7XHJcblxyXG4vKipcclxuICogV2lsbCByZXR1cm4gdHJ1ZSBpZiB0aGUgc3RlbmNpbCByZWZlcmVuY2UgdmFsdWUgaXMgbGVzcyB0aGFuIHRoZSBjdXJyZW50IHN0ZW5jaWwgdmFsdWUuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IExlc3NTdGVuY2lsRnVuYyA9IDUxMztcclxuXHJcbi8qKlxyXG4gKiBXaWxsIHJldHVybiB0cnVlIGlmIHRoZSBzdGVuY2lsIHJlZmVyZW5jZSB2YWx1ZSBpcyBlcXVhbCB0byB0aGUgY3VycmVudCBzdGVuY2lsIHZhbHVlLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBFcXVhbFN0ZW5jaWxGdW5jID0gNTE0O1xyXG5cclxuLyoqXHJcbiAqIFdpbGwgcmV0dXJuIHRydWUgaWYgdGhlIHN0ZW5jaWwgcmVmZXJlbmNlIHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgY3VycmVudCBzdGVuY2lsIHZhbHVlLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBMZXNzRXF1YWxTdGVuY2lsRnVuYyA9IDUxNTtcclxuXHJcbi8qKlxyXG4gKiBXaWxsIHJldHVybiB0cnVlIGlmIHRoZSBzdGVuY2lsIHJlZmVyZW5jZSB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgc3RlbmNpbCB2YWx1ZS5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgR3JlYXRlclN0ZW5jaWxGdW5jID0gNTE2O1xyXG5cclxuLyoqXHJcbiAqIFdpbGwgcmV0dXJuIHRydWUgaWYgdGhlIHN0ZW5jaWwgcmVmZXJlbmNlIHZhbHVlIGlzIG5vdCBlcXVhbCB0byB0aGUgY3VycmVudCBzdGVuY2lsIHZhbHVlLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBOb3RFcXVhbFN0ZW5jaWxGdW5jID0gNTE3O1xyXG5cclxuLyoqXHJcbiAqIFdpbGwgcmV0dXJuIHRydWUgaWYgdGhlIHN0ZW5jaWwgcmVmZXJlbmNlIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgY3VycmVudCBzdGVuY2lsIHZhbHVlLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBHcmVhdGVyRXF1YWxTdGVuY2lsRnVuYyA9IDUxODtcclxuXHJcbi8qKlxyXG4gKiBXaWxsIGFsd2F5cyByZXR1cm4gdHJ1ZS5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgQWx3YXlzU3RlbmNpbEZ1bmMgPSA1MTk7XHJcblxyXG4vKipcclxuICogTmV2ZXIgcGFzcy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTmV2ZXJDb21wYXJlID0gNTEyO1xyXG5cclxuLyoqXHJcbiAqIFBhc3MgaWYgdGhlIGluY29taW5nIHZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgdGV4dHVyZSB2YWx1ZS5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTGVzc0NvbXBhcmUgPSA1MTM7XHJcblxyXG4vKipcclxuICogUGFzcyBpZiB0aGUgaW5jb21pbmcgdmFsdWUgZXF1YWxzIHRoZSB0ZXh0dXJlIHZhbHVlLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBFcXVhbENvbXBhcmUgPSA1MTQ7XHJcblxyXG4vKipcclxuICogUGFzcyBpZiB0aGUgaW5jb21pbmcgdmFsdWUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSB0ZXh0dXJlIHZhbHVlLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBMZXNzRXF1YWxDb21wYXJlID0gNTE1O1xyXG5cclxuLyoqXHJcbiAqIFBhc3MgaWYgdGhlIGluY29taW5nIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgdGV4dHVyZSB2YWx1ZS5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgR3JlYXRlckNvbXBhcmUgPSA1MTY7XHJcblxyXG4vKipcclxuICogUGFzcyBpZiB0aGUgaW5jb21pbmcgdmFsdWUgaXMgbm90IGVxdWFsIHRvIHRoZSB0ZXh0dXJlIHZhbHVlLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBOb3RFcXVhbENvbXBhcmUgPSA1MTc7XHJcblxyXG4vKipcclxuICogUGFzcyBpZiB0aGUgaW5jb21pbmcgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSB0ZXh0dXJlIHZhbHVlLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBHcmVhdGVyRXF1YWxDb21wYXJlID0gNTE4O1xyXG5cclxuLyoqXHJcbiAqIEFsd2F5cyBwYXNzLlxyXG4gKlxyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBBbHdheXNDb21wYXJlID0gNTE5O1xyXG5cclxuLyoqXHJcbiAqIFRoZSBjb250ZW50cyBhcmUgaW50ZW5kZWQgdG8gYmUgc3BlY2lmaWVkIG9uY2UgYnkgdGhlIGFwcGxpY2F0aW9uLCBhbmQgdXNlZCBtYW55XHJcbiAqIHRpbWVzIGFzIHRoZSBzb3VyY2UgZm9yIGRyYXdpbmcgYW5kIGltYWdlIHNwZWNpZmljYXRpb24gY29tbWFuZHMuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFN0YXRpY0RyYXdVc2FnZSA9IDM1MDQ0O1xyXG5cclxuLyoqXHJcbiAqIFRoZSBjb250ZW50cyBhcmUgaW50ZW5kZWQgdG8gYmUgcmVzcGVjaWZpZWQgcmVwZWF0ZWRseSBieSB0aGUgYXBwbGljYXRpb24sIGFuZFxyXG4gKiB1c2VkIG1hbnkgdGltZXMgYXMgdGhlIHNvdXJjZSBmb3IgZHJhd2luZyBhbmQgaW1hZ2Ugc3BlY2lmaWNhdGlvbiBjb21tYW5kcy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgRHluYW1pY0RyYXdVc2FnZSA9IDM1MDQ4O1xyXG5cclxuLyoqXHJcbiAqIFRoZSBjb250ZW50cyBhcmUgaW50ZW5kZWQgdG8gYmUgc3BlY2lmaWVkIG9uY2UgYnkgdGhlIGFwcGxpY2F0aW9uLCBhbmQgdXNlZCBhdCBtb3N0XHJcbiAqIGEgZmV3IHRpbWVzIGFzIHRoZSBzb3VyY2UgZm9yIGRyYXdpbmcgYW5kIGltYWdlIHNwZWNpZmljYXRpb24gY29tbWFuZHMuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFN0cmVhbURyYXdVc2FnZSA9IDM1MDQwO1xyXG5cclxuLyoqXHJcbiAqIFRoZSBjb250ZW50cyBhcmUgaW50ZW5kZWQgdG8gYmUgc3BlY2lmaWVkIG9uY2UgYnkgcmVhZGluZyBkYXRhIGZyb20gdGhlIDNEIEFQSSwgYW5kIHF1ZXJpZWRcclxuICogbWFueSB0aW1lcyBieSB0aGUgYXBwbGljYXRpb24uXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFN0YXRpY1JlYWRVc2FnZSA9IDM1MDQ1O1xyXG5cclxuLyoqXHJcbiAqIFRoZSBjb250ZW50cyBhcmUgaW50ZW5kZWQgdG8gYmUgcmVzcGVjaWZpZWQgcmVwZWF0ZWRseSBieSByZWFkaW5nIGRhdGEgZnJvbSB0aGUgM0QgQVBJLCBhbmQgcXVlcmllZFxyXG4gKiBtYW55IHRpbWVzIGJ5IHRoZSBhcHBsaWNhdGlvbi5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgRHluYW1pY1JlYWRVc2FnZSA9IDM1MDQ5O1xyXG5cclxuLyoqXHJcbiAqIFRoZSBjb250ZW50cyBhcmUgaW50ZW5kZWQgdG8gYmUgc3BlY2lmaWVkIG9uY2UgYnkgcmVhZGluZyBkYXRhIGZyb20gdGhlIDNEIEFQSSwgYW5kIHF1ZXJpZWQgYXQgbW9zdFxyXG4gKiBhIGZldyB0aW1lcyBieSB0aGUgYXBwbGljYXRpb25cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgU3RyZWFtUmVhZFVzYWdlID0gMzUwNDE7XHJcblxyXG4vKipcclxuICogVGhlIGNvbnRlbnRzIGFyZSBpbnRlbmRlZCB0byBiZSBzcGVjaWZpZWQgb25jZSBieSByZWFkaW5nIGRhdGEgZnJvbSB0aGUgM0QgQVBJLCBhbmQgdXNlZCBtYW55IHRpbWVzIGFzXHJcbiAqIHRoZSBzb3VyY2UgZm9yIFdlYkdMIGRyYXdpbmcgYW5kIGltYWdlIHNwZWNpZmljYXRpb24gY29tbWFuZHMuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFN0YXRpY0NvcHlVc2FnZSA9IDM1MDQ2O1xyXG5cclxuLyoqXHJcbiAqIFRoZSBjb250ZW50cyBhcmUgaW50ZW5kZWQgdG8gYmUgcmVzcGVjaWZpZWQgcmVwZWF0ZWRseSBieSByZWFkaW5nIGRhdGEgZnJvbSB0aGUgM0QgQVBJLCBhbmQgdXNlZCBtYW55IHRpbWVzXHJcbiAqIGFzIHRoZSBzb3VyY2UgZm9yIFdlYkdMIGRyYXdpbmcgYW5kIGltYWdlIHNwZWNpZmljYXRpb24gY29tbWFuZHMuXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IER5bmFtaWNDb3B5VXNhZ2UgPSAzNTA1MDtcclxuXHJcbi8qKlxyXG4gKiBUaGUgY29udGVudHMgYXJlIGludGVuZGVkIHRvIGJlIHNwZWNpZmllZCBvbmNlIGJ5IHJlYWRpbmcgZGF0YSBmcm9tIHRoZSAzRCBBUEksIGFuZCB1c2VkIGF0IG1vc3QgYSBmZXcgdGltZXNcclxuICogYXMgdGhlIHNvdXJjZSBmb3IgV2ViR0wgZHJhd2luZyBhbmQgaW1hZ2Ugc3BlY2lmaWNhdGlvbiBjb21tYW5kcy5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgU3RyZWFtQ29weVVzYWdlID0gMzUwNDI7XHJcblxyXG4vKipcclxuICogR0xTTCAxIHNoYWRlciBjb2RlLlxyXG4gKlxyXG4gKiBAdHlwZSB7c3RyaW5nfVxyXG4gKiBAY29uc3RhbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBHTFNMMSA9ICcxMDAnO1xyXG5cclxuLyoqXHJcbiAqIEdMU0wgMyBzaGFkZXIgY29kZS5cclxuICpcclxuICogQHR5cGUge3N0cmluZ31cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgR0xTTDMgPSAnMzAwIGVzJztcclxuXHJcbi8qKlxyXG4gKiBXZWJHTCBjb29yZGluYXRlIHN5c3RlbS5cclxuICpcclxuICogQHR5cGUge251bWJlcn1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgV2ViR0xDb29yZGluYXRlU3lzdGVtID0gMjAwMDtcclxuXHJcbi8qKlxyXG4gKiBXZWJHUFUgY29vcmRpbmF0ZSBzeXN0ZW0uXHJcbiAqXHJcbiAqIEB0eXBlIHtudW1iZXJ9XHJcbiAqIEBjb25zdGFudFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFdlYkdQVUNvb3JkaW5hdGVTeXN0ZW0gPSAyMDAxO1xyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgdGhlIGRpZmZlcmVudCB0aW1lc3RhbXAgcXVlcnkgdHlwZXMuXHJcbiAqXHJcbiAqIEB0eXBlIHtDb25zdGFudHNUaW1lc3RhbXBRdWVyeX1cclxuICogQGNvbnN0YW50XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgVGltZXN0YW1wUXVlcnkgPSB7XHJcblx0Q09NUFVURTogJ2NvbXB1dGUnLFxyXG5cdFJFTkRFUjogJ3JlbmRlcidcclxufTtcclxuXHJcbi8qKlxyXG4gKiBUaGlzIHR5cGUgcmVwcmVzZW50cyBtb3VzZSBidXR0b25zIGFuZCBpbnRlcmFjdGlvbiB0eXBlcyBpbiBjb250ZXh0IG9mIGNvbnRyb2xzLlxyXG4gKlxyXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDb25zdGFudHNNb3VzZVxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gTUlERExFIC0gVGhlIGxlZnQgbW91c2UgYnV0dG9uLlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gTEVGVCAtIFRoZSBtaWRkbGUgbW91c2UgYnV0dG9uLlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gUklHSFQgLSBUaGUgcmlnaHQgbW91c2UgYnV0dG9uLlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gUk9UQVRFIC0gQSByb3RhdGUgaW50ZXJhY3Rpb24uXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBET0xMWSAtIEEgZG9sbHkgaW50ZXJhY3Rpb24uXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBQQU4gLSBBIHBhbiBpbnRlcmFjdGlvbi5cclxuICoqL1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgdHlwZSByZXByZXNlbnRzIHRvdWNoIGludGVyYWN0aW9uIHR5cGVzIGluIGNvbnRleHQgb2YgY29udHJvbHMuXHJcbiAqXHJcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENvbnN0YW50c1RvdWNoXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBST1RBVEUgLSBBIHJvdGF0ZSBpbnRlcmFjdGlvbi5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFBBTiAtIEEgcGFuIGludGVyYWN0aW9uLlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gRE9MTFlfUEFOIC0gVGhlIGRvbGx5LXBhbiBpbnRlcmFjdGlvbi5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IERPTExZX1JPVEFURSAtIEEgZG9sbHktcm90YXRlIGludGVyYWN0aW9uLlxyXG4gKiovXHJcblxyXG4vKipcclxuICogVGhpcyB0eXBlIHJlcHJlc2VudHMgdGhlIGRpZmZlcmVudCB0aW1lc3RhbXAgcXVlcnkgdHlwZXMuXHJcbiAqXHJcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENvbnN0YW50c1RpbWVzdGFtcFF1ZXJ5XHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBDT01QVVRFIC0gQSBgY29tcHV0ZWAgdGltZXN0YW1wIHF1ZXJ5LlxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUkVOREVSIC0gQSBgcmVuZGVyYCB0aW1lc3RhbXAgcXVlcnkuXHJcbiAqKi9cclxuIiwiLyoqXHJcbiAqIFRoaXMgbW9kdWxlcyBhbGxvd3MgdG8gZGlzcGF0Y2ggZXZlbnQgb2JqZWN0cyBvbiBjdXN0b20gSmF2YVNjcmlwdCBvYmplY3RzLlxyXG4gKlxyXG4gKiBNYWluIHJlcG9zaXRvcnk6IFtldmVudGRpc3BhdGNoZXIuanNde0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9tcmRvb2IvZXZlbnRkaXNwYXRjaGVyLmpzL31cclxuICpcclxuICogQ29kZSBFeGFtcGxlOlxyXG4gKiBgYGBqc1xyXG4gKiBjbGFzcyBDYXIgZXh0ZW5kcyBFdmVudERpc3BhdGNoZXIge1xyXG4gKiBcdHN0YXJ0KCkge1xyXG4gKlx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ3N0YXJ0JywgbWVzc2FnZTogJ3Zyb29tIHZyb29tIScgfSApO1xyXG4gKlx0fVxyXG4gKn07XHJcbiAqXHJcbiAqIC8vIFVzaW5nIGV2ZW50cyB3aXRoIHRoZSBjdXN0b20gb2JqZWN0XHJcbiAqIGNvbnN0IGNhciA9IG5ldyBDYXIoKTtcclxuICogY2FyLmFkZEV2ZW50TGlzdGVuZXIoICdzdGFydCcsIGZ1bmN0aW9uICggZXZlbnQgKSB7XHJcbiAqIFx0YWxlcnQoIGV2ZW50Lm1lc3NhZ2UgKTtcclxuICogfSApO1xyXG4gKlxyXG4gKiBjYXIuc3RhcnQoKTtcclxuICogYGBgXHJcbiAqL1xyXG5jbGFzcyBFdmVudERpc3BhdGNoZXIge1xyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIHRoZSBnaXZlbiBldmVudCBsaXN0ZW5lciB0byB0aGUgZ2l2ZW4gZXZlbnQgdHlwZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIHR5cGUgb2YgZXZlbnQgdG8gbGlzdGVuIHRvLlxyXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIC0gVGhlIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgd2hlbiB0aGUgZXZlbnQgaXMgZmlyZWQuXHJcblx0ICovXHJcblx0YWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgbGlzdGVuZXIgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9saXN0ZW5lcnMgPT09IHVuZGVmaW5lZCApIHRoaXMuX2xpc3RlbmVycyA9IHt9O1xyXG5cclxuXHRcdGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycztcclxuXHJcblx0XHRpZiAoIGxpc3RlbmVyc1sgdHlwZSBdID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRsaXN0ZW5lcnNbIHR5cGUgXSA9IFtdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGxpc3RlbmVyc1sgdHlwZSBdLmluZGV4T2YoIGxpc3RlbmVyICkgPT09IC0gMSApIHtcclxuXHJcblx0XHRcdGxpc3RlbmVyc1sgdHlwZSBdLnB1c2goIGxpc3RlbmVyICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBnaXZlbiBldmVudCBsaXN0ZW5lciBoYXMgYmVlbiBhZGRlZCB0byB0aGUgZ2l2ZW4gZXZlbnQgdHlwZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIHR5cGUgb2YgZXZlbnQuXHJcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgLSBUaGUgbGlzdGVuZXIgdG8gY2hlY2suXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZ2l2ZW4gZXZlbnQgbGlzdGVuZXIgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIGdpdmVuIGV2ZW50IHR5cGUuXHJcblx0ICovXHJcblx0aGFzRXZlbnRMaXN0ZW5lciggdHlwZSwgbGlzdGVuZXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzO1xyXG5cclxuXHRcdGlmICggbGlzdGVuZXJzID09PSB1bmRlZmluZWQgKSByZXR1cm4gZmFsc2U7XHJcblxyXG5cdFx0cmV0dXJuIGxpc3RlbmVyc1sgdHlwZSBdICE9PSB1bmRlZmluZWQgJiYgbGlzdGVuZXJzWyB0eXBlIF0uaW5kZXhPZiggbGlzdGVuZXIgKSAhPT0gLSAxO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbW92ZXMgdGhlIGdpdmVuIGV2ZW50IGxpc3RlbmVyIGZyb20gdGhlIGdpdmVuIGV2ZW50IHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSB0eXBlIG9mIGV2ZW50LlxyXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIC0gVGhlIGxpc3RlbmVyIHRvIHJlbW92ZS5cclxuXHQgKi9cclxuXHRyZW1vdmVFdmVudExpc3RlbmVyKCB0eXBlLCBsaXN0ZW5lciApIHtcclxuXHJcblx0XHRjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnM7XHJcblxyXG5cdFx0aWYgKCBsaXN0ZW5lcnMgPT09IHVuZGVmaW5lZCApIHJldHVybjtcclxuXHJcblx0XHRjb25zdCBsaXN0ZW5lckFycmF5ID0gbGlzdGVuZXJzWyB0eXBlIF07XHJcblxyXG5cdFx0aWYgKCBsaXN0ZW5lckFycmF5ICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBpbmRleCA9IGxpc3RlbmVyQXJyYXkuaW5kZXhPZiggbGlzdGVuZXIgKTtcclxuXHJcblx0XHRcdGlmICggaW5kZXggIT09IC0gMSApIHtcclxuXHJcblx0XHRcdFx0bGlzdGVuZXJBcnJheS5zcGxpY2UoIGluZGV4LCAxICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERpc3BhdGNoZXMgYW4gZXZlbnQgb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IC0gVGhlIGV2ZW50IHRoYXQgZ2V0cyBmaXJlZC5cclxuXHQgKi9cclxuXHRkaXNwYXRjaEV2ZW50KCBldmVudCApIHtcclxuXHJcblx0XHRjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnM7XHJcblxyXG5cdFx0aWYgKCBsaXN0ZW5lcnMgPT09IHVuZGVmaW5lZCApIHJldHVybjtcclxuXHJcblx0XHRjb25zdCBsaXN0ZW5lckFycmF5ID0gbGlzdGVuZXJzWyBldmVudC50eXBlIF07XHJcblxyXG5cdFx0aWYgKCBsaXN0ZW5lckFycmF5ICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRldmVudC50YXJnZXQgPSB0aGlzO1xyXG5cclxuXHRcdFx0Ly8gTWFrZSBhIGNvcHksIGluIGNhc2UgbGlzdGVuZXJzIGFyZSByZW1vdmVkIHdoaWxlIGl0ZXJhdGluZy5cclxuXHRcdFx0Y29uc3QgYXJyYXkgPSBsaXN0ZW5lckFycmF5LnNsaWNlKCAwICk7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRhcnJheVsgaSBdLmNhbGwoIHRoaXMsIGV2ZW50ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRldmVudC50YXJnZXQgPSBudWxsO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCB7IEV2ZW50RGlzcGF0Y2hlciB9O1xyXG4iLCJjb25zdCBfbHV0ID0gWyAnMDAnLCAnMDEnLCAnMDInLCAnMDMnLCAnMDQnLCAnMDUnLCAnMDYnLCAnMDcnLCAnMDgnLCAnMDknLCAnMGEnLCAnMGInLCAnMGMnLCAnMGQnLCAnMGUnLCAnMGYnLCAnMTAnLCAnMTEnLCAnMTInLCAnMTMnLCAnMTQnLCAnMTUnLCAnMTYnLCAnMTcnLCAnMTgnLCAnMTknLCAnMWEnLCAnMWInLCAnMWMnLCAnMWQnLCAnMWUnLCAnMWYnLCAnMjAnLCAnMjEnLCAnMjInLCAnMjMnLCAnMjQnLCAnMjUnLCAnMjYnLCAnMjcnLCAnMjgnLCAnMjknLCAnMmEnLCAnMmInLCAnMmMnLCAnMmQnLCAnMmUnLCAnMmYnLCAnMzAnLCAnMzEnLCAnMzInLCAnMzMnLCAnMzQnLCAnMzUnLCAnMzYnLCAnMzcnLCAnMzgnLCAnMzknLCAnM2EnLCAnM2InLCAnM2MnLCAnM2QnLCAnM2UnLCAnM2YnLCAnNDAnLCAnNDEnLCAnNDInLCAnNDMnLCAnNDQnLCAnNDUnLCAnNDYnLCAnNDcnLCAnNDgnLCAnNDknLCAnNGEnLCAnNGInLCAnNGMnLCAnNGQnLCAnNGUnLCAnNGYnLCAnNTAnLCAnNTEnLCAnNTInLCAnNTMnLCAnNTQnLCAnNTUnLCAnNTYnLCAnNTcnLCAnNTgnLCAnNTknLCAnNWEnLCAnNWInLCAnNWMnLCAnNWQnLCAnNWUnLCAnNWYnLCAnNjAnLCAnNjEnLCAnNjInLCAnNjMnLCAnNjQnLCAnNjUnLCAnNjYnLCAnNjcnLCAnNjgnLCAnNjknLCAnNmEnLCAnNmInLCAnNmMnLCAnNmQnLCAnNmUnLCAnNmYnLCAnNzAnLCAnNzEnLCAnNzInLCAnNzMnLCAnNzQnLCAnNzUnLCAnNzYnLCAnNzcnLCAnNzgnLCAnNzknLCAnN2EnLCAnN2InLCAnN2MnLCAnN2QnLCAnN2UnLCAnN2YnLCAnODAnLCAnODEnLCAnODInLCAnODMnLCAnODQnLCAnODUnLCAnODYnLCAnODcnLCAnODgnLCAnODknLCAnOGEnLCAnOGInLCAnOGMnLCAnOGQnLCAnOGUnLCAnOGYnLCAnOTAnLCAnOTEnLCAnOTInLCAnOTMnLCAnOTQnLCAnOTUnLCAnOTYnLCAnOTcnLCAnOTgnLCAnOTknLCAnOWEnLCAnOWInLCAnOWMnLCAnOWQnLCAnOWUnLCAnOWYnLCAnYTAnLCAnYTEnLCAnYTInLCAnYTMnLCAnYTQnLCAnYTUnLCAnYTYnLCAnYTcnLCAnYTgnLCAnYTknLCAnYWEnLCAnYWInLCAnYWMnLCAnYWQnLCAnYWUnLCAnYWYnLCAnYjAnLCAnYjEnLCAnYjInLCAnYjMnLCAnYjQnLCAnYjUnLCAnYjYnLCAnYjcnLCAnYjgnLCAnYjknLCAnYmEnLCAnYmInLCAnYmMnLCAnYmQnLCAnYmUnLCAnYmYnLCAnYzAnLCAnYzEnLCAnYzInLCAnYzMnLCAnYzQnLCAnYzUnLCAnYzYnLCAnYzcnLCAnYzgnLCAnYzknLCAnY2EnLCAnY2InLCAnY2MnLCAnY2QnLCAnY2UnLCAnY2YnLCAnZDAnLCAnZDEnLCAnZDInLCAnZDMnLCAnZDQnLCAnZDUnLCAnZDYnLCAnZDcnLCAnZDgnLCAnZDknLCAnZGEnLCAnZGInLCAnZGMnLCAnZGQnLCAnZGUnLCAnZGYnLCAnZTAnLCAnZTEnLCAnZTInLCAnZTMnLCAnZTQnLCAnZTUnLCAnZTYnLCAnZTcnLCAnZTgnLCAnZTknLCAnZWEnLCAnZWInLCAnZWMnLCAnZWQnLCAnZWUnLCAnZWYnLCAnZjAnLCAnZjEnLCAnZjInLCAnZjMnLCAnZjQnLCAnZjUnLCAnZjYnLCAnZjcnLCAnZjgnLCAnZjknLCAnZmEnLCAnZmInLCAnZmMnLCAnZmQnLCAnZmUnLCAnZmYnIF07XHJcblxyXG5sZXQgX3NlZWQgPSAxMjM0NTY3O1xyXG5cclxuXHJcbmNvbnN0IERFRzJSQUQgPSBNYXRoLlBJIC8gMTgwO1xyXG5jb25zdCBSQUQyREVHID0gMTgwIC8gTWF0aC5QSTtcclxuXHJcbi8qKlxyXG4gKiBHZW5lcmF0ZSBhIFtVVUlEXXtAbGluayBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Vbml2ZXJzYWxseV91bmlxdWVfaWRlbnRpZmllcn1cclxuICogKHVuaXZlcnNhbGx5IHVuaXF1ZSBpZGVudGlmaWVyKS5cclxuICpcclxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgVVVJRC5cclxuICovXHJcbmZ1bmN0aW9uIGdlbmVyYXRlVVVJRCgpIHtcclxuXHJcblx0Ly8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMDUwMzQvaG93LXRvLWNyZWF0ZS1hLWd1aWQtdXVpZC1pbi1qYXZhc2NyaXB0LzIxOTYzMTM2IzIxOTYzMTM2XHJcblxyXG5cdGNvbnN0IGQwID0gTWF0aC5yYW5kb20oKSAqIDB4ZmZmZmZmZmYgfCAwO1xyXG5cdGNvbnN0IGQxID0gTWF0aC5yYW5kb20oKSAqIDB4ZmZmZmZmZmYgfCAwO1xyXG5cdGNvbnN0IGQyID0gTWF0aC5yYW5kb20oKSAqIDB4ZmZmZmZmZmYgfCAwO1xyXG5cdGNvbnN0IGQzID0gTWF0aC5yYW5kb20oKSAqIDB4ZmZmZmZmZmYgfCAwO1xyXG5cdGNvbnN0IHV1aWQgPSBfbHV0WyBkMCAmIDB4ZmYgXSArIF9sdXRbIGQwID4+IDggJiAweGZmIF0gKyBfbHV0WyBkMCA+PiAxNiAmIDB4ZmYgXSArIF9sdXRbIGQwID4+IDI0ICYgMHhmZiBdICsgJy0nICtcclxuXHRcdFx0X2x1dFsgZDEgJiAweGZmIF0gKyBfbHV0WyBkMSA+PiA4ICYgMHhmZiBdICsgJy0nICsgX2x1dFsgZDEgPj4gMTYgJiAweDBmIHwgMHg0MCBdICsgX2x1dFsgZDEgPj4gMjQgJiAweGZmIF0gKyAnLScgK1xyXG5cdFx0XHRfbHV0WyBkMiAmIDB4M2YgfCAweDgwIF0gKyBfbHV0WyBkMiA+PiA4ICYgMHhmZiBdICsgJy0nICsgX2x1dFsgZDIgPj4gMTYgJiAweGZmIF0gKyBfbHV0WyBkMiA+PiAyNCAmIDB4ZmYgXSArXHJcblx0XHRcdF9sdXRbIGQzICYgMHhmZiBdICsgX2x1dFsgZDMgPj4gOCAmIDB4ZmYgXSArIF9sdXRbIGQzID4+IDE2ICYgMHhmZiBdICsgX2x1dFsgZDMgPj4gMjQgJiAweGZmIF07XHJcblxyXG5cdC8vIC50b0xvd2VyQ2FzZSgpIGhlcmUgZmxhdHRlbnMgY29uY2F0ZW5hdGVkIHN0cmluZ3MgdG8gc2F2ZSBoZWFwIG1lbW9yeSBzcGFjZS5cclxuXHRyZXR1cm4gdXVpZC50b0xvd2VyQ2FzZSgpO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIENsYW1wcyB0aGUgZ2l2ZW4gdmFsdWUgYmV0d2VlbiBtaW4gYW5kIG1heC5cclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNsYW1wLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gbWluIC0gVGhlIG1pbiB2YWx1ZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IG1heCAtIFRoZSBtYXggdmFsdWUuXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGNsYW1wZWQgdmFsdWUuXHJcbiAqL1xyXG5mdW5jdGlvbiBjbGFtcCggdmFsdWUsIG1pbiwgbWF4ICkge1xyXG5cclxuXHRyZXR1cm4gTWF0aC5tYXgoIG1pbiwgTWF0aC5taW4oIG1heCwgdmFsdWUgKSApO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIENvbXB1dGVzIHRoZSBFdWNsaWRlYW4gbW9kdWxvIG9mIHRoZSBnaXZlbiBwYXJhbWV0ZXJzIHRoYXRcclxuICogaXMgYCggKCBuICUgbSApICsgbSApICUgbWAuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBuIC0gVGhlIGZpcnN0IHBhcmFtZXRlci5cclxuICogQHBhcmFtIHtudW1iZXJ9IG0gLSBUaGUgc2Vjb25kIHBhcmFtZXRlci5cclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgRXVjbGlkZWFuIG1vZHVsby5cclxuICovXHJcbmZ1bmN0aW9uIGV1Y2xpZGVhbk1vZHVsbyggbiwgbSApIHtcclxuXHJcblx0Ly8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTW9kdWxvX29wZXJhdGlvblxyXG5cclxuXHRyZXR1cm4gKCAoIG4gJSBtICkgKyBtICkgJSBtO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFBlcmZvcm1zIGEgbGluZWFyIG1hcHBpbmcgZnJvbSByYW5nZSBgPGExLCBhMj5gIHRvIHJhbmdlIGA8YjEsIGIyPmBcclxuICogZm9yIHRoZSBnaXZlbiB2YWx1ZS5cclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgdmFsdWUgdG8gYmUgbWFwcGVkLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gYTEgLSBNaW5pbXVtIHZhbHVlIGZvciByYW5nZSBBLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gYTIgLSBNYXhpbXVtIHZhbHVlIGZvciByYW5nZSBBLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gYjEgLSBNaW5pbXVtIHZhbHVlIGZvciByYW5nZSBCLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gYjIgLSBNYXhpbXVtIHZhbHVlIGZvciByYW5nZSBCLlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBtYXBwZWQgdmFsdWUuXHJcbiAqL1xyXG5mdW5jdGlvbiBtYXBMaW5lYXIoIHgsIGExLCBhMiwgYjEsIGIyICkge1xyXG5cclxuXHRyZXR1cm4gYjEgKyAoIHggLSBhMSApICogKCBiMiAtIGIxICkgLyAoIGEyIC0gYTEgKTtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBwZXJjZW50YWdlIGluIHRoZSBjbG9zZWQgaW50ZXJ2YWwgYFswLCAxXWAgb2YgdGhlIGdpdmVuIHZhbHVlXHJcbiAqIGJldHdlZW4gdGhlIHN0YXJ0IGFuZCBlbmQgcG9pbnQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHN0YXJ0IHBvaW50XHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIGVuZCBwb2ludC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gQSB2YWx1ZSBiZXR3ZWVuIHN0YXJ0IGFuZCBlbmQuXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGludGVycG9sYXRpb24gZmFjdG9yLlxyXG4gKi9cclxuZnVuY3Rpb24gaW52ZXJzZUxlcnAoIHgsIHksIHZhbHVlICkge1xyXG5cclxuXHQvLyBodHRwczovL3d3dy5nYW1lZGV2Lm5ldC90dXRvcmlhbHMvcHJvZ3JhbW1pbmcvZ2VuZXJhbC1hbmQtZ2FtZXBsYXktcHJvZ3JhbW1pbmcvaW52ZXJzZS1sZXJwLWEtc3VwZXItdXNlZnVsLXlldC1vZnRlbi1vdmVybG9va2VkLWZ1bmN0aW9uLXI1MjMwL1xyXG5cclxuXHRpZiAoIHggIT09IHkgKSB7XHJcblxyXG5cdFx0cmV0dXJuICggdmFsdWUgLSB4ICkgLyAoIHkgLSB4ICk7XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0cmV0dXJuIDA7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgdmFsdWUgbGluZWFybHkgaW50ZXJwb2xhdGVkIGZyb20gdHdvIGtub3duIHBvaW50cyBiYXNlZCBvbiB0aGUgZ2l2ZW4gaW50ZXJ2YWwgLVxyXG4gKiBgdCA9IDBgIHdpbGwgcmV0dXJuIGB4YCBhbmQgYHQgPSAxYCB3aWxsIHJldHVybiBgeWAuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHN0YXJ0IHBvaW50XHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIGVuZCBwb2ludC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHQgLSBUaGUgaW50ZXJwb2xhdGlvbiBmYWN0b3IgaW4gdGhlIGNsb3NlZCBpbnRlcnZhbCBgWzAsIDFdYC5cclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgaW50ZXJwb2xhdGVkIHZhbHVlLlxyXG4gKi9cclxuZnVuY3Rpb24gbGVycCggeCwgeSwgdCApIHtcclxuXHJcblx0cmV0dXJuICggMSAtIHQgKSAqIHggKyB0ICogeTtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTbW9vdGhseSBpbnRlcnBvbGF0ZSBhIG51bWJlciBmcm9tIGB4YCB0byBgeWAgaW4gIGEgc3ByaW5nLWxpa2UgbWFubmVyIHVzaW5nIGEgZGVsdGFcclxuICogdGltZSB0byBtYWludGFpbiBmcmFtZSByYXRlIGluZGVwZW5kZW50IG1vdmVtZW50LiBGb3IgZGV0YWlscywgc2VlXHJcbiAqIFtGcmFtZSByYXRlIGluZGVwZW5kZW50IGRhbXBpbmcgdXNpbmcgbGVycF17QGxpbmsgaHR0cDovL3d3dy5yb3J5ZHJpc2NvbGwuY29tLzIwMTYvMDMvMDcvZnJhbWUtcmF0ZS1pbmRlcGVuZGVudC1kYW1waW5nLXVzaW5nLWxlcnAvfS5cclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgY3VycmVudCBwb2ludC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdGFyZ2V0IHBvaW50LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gbGFtYmRhIC0gQSBoaWdoZXIgbGFtYmRhIHZhbHVlIHdpbGwgbWFrZSB0aGUgbW92ZW1lbnQgbW9yZSBzdWRkZW4sXHJcbiAqIGFuZCBhIGxvd2VyIHZhbHVlIHdpbGwgbWFrZSB0aGUgbW92ZW1lbnQgbW9yZSBncmFkdWFsLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gZHQgLSBEZWx0YSB0aW1lIGluIHNlY29uZHMuXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGludGVycG9sYXRlZCB2YWx1ZS5cclxuICovXHJcbmZ1bmN0aW9uIGRhbXAoIHgsIHksIGxhbWJkYSwgZHQgKSB7XHJcblxyXG5cdHJldHVybiBsZXJwKCB4LCB5LCAxIC0gTWF0aC5leHAoIC0gbGFtYmRhICogZHQgKSApO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSB2YWx1ZSB0aGF0IGFsdGVybmF0ZXMgYmV0d2VlbiBgMGAgYW5kIHRoZSBnaXZlbiBgbGVuZ3RoYCBwYXJhbWV0ZXIuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHZhbHVlIHRvIHBpbmdwb25nLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD0xXSAtIFRoZSBwb3NpdGl2ZSB2YWx1ZSB0aGUgZnVuY3Rpb24gd2lsbCBwaW5ncG9uZyB0by5cclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgYWx0ZXJuYXRlZCB2YWx1ZS5cclxuICovXHJcbmZ1bmN0aW9uIHBpbmdwb25nKCB4LCBsZW5ndGggPSAxICkge1xyXG5cclxuXHQvLyBodHRwczovL3d3dy5kZXNtb3MuY29tL2NhbGN1bGF0b3IvdmNzam55ejd4NFxyXG5cclxuXHRyZXR1cm4gbGVuZ3RoIC0gTWF0aC5hYnMoIGV1Y2xpZGVhbk1vZHVsbyggeCwgbGVuZ3RoICogMiApIC0gbGVuZ3RoICk7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIHZhbHVlIGluIHRoZSByYW5nZSBgWzAsMV1gIHRoYXQgcmVwcmVzZW50cyB0aGUgcGVyY2VudGFnZSB0aGF0IGB4YCBoYXNcclxuICogbW92ZWQgYmV0d2VlbiBgbWluYCBhbmQgYG1heGAsIGJ1dCBzbW9vdGhlZCBvciBzbG93ZWQgZG93biB0aGUgY2xvc2VyIGB4YCBpcyB0b1xyXG4gKiB0aGUgYG1pbmAgYW5kIGBtYXhgLlxyXG4gKlxyXG4gKiBTZWUgW1Ntb290aHN0ZXBde0BsaW5rIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU21vb3Roc3RlcH0gZm9yIG1vcmUgZGV0YWlscy5cclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUgYmFzZWQgb24gaXRzIHBvc2l0aW9uIGJldHdlZW4gbWluIGFuZCBtYXguXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBtaW4gLSBUaGUgbWluIHZhbHVlLiBBbnkgeCB2YWx1ZSBiZWxvdyBtaW4gd2lsbCBiZSBgMGAuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBtYXggLSBUaGUgbWF4IHZhbHVlLiBBbnkgeCB2YWx1ZSBhYm92ZSBtYXggd2lsbCBiZSBgMWAuXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGFsdGVybmF0ZWQgdmFsdWUuXHJcbiAqL1xyXG5mdW5jdGlvbiBzbW9vdGhzdGVwKCB4LCBtaW4sIG1heCApIHtcclxuXHJcblx0aWYgKCB4IDw9IG1pbiApIHJldHVybiAwO1xyXG5cdGlmICggeCA+PSBtYXggKSByZXR1cm4gMTtcclxuXHJcblx0eCA9ICggeCAtIG1pbiApIC8gKCBtYXggLSBtaW4gKTtcclxuXHJcblx0cmV0dXJuIHggKiB4ICogKCAzIC0gMiAqIHggKTtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBIFt2YXJpYXRpb24gb24gc21vb3Roc3RlcF17QGxpbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU21vb3Roc3RlcCNWYXJpYXRpb25zfVxyXG4gKiB0aGF0IGhhcyB6ZXJvIDFzdCBhbmQgMm5kIG9yZGVyIGRlcml2YXRpdmVzIGF0IHg9MCBhbmQgeD0xLlxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB2YWx1ZSB0byBldmFsdWF0ZSBiYXNlZCBvbiBpdHMgcG9zaXRpb24gYmV0d2VlbiBtaW4gYW5kIG1heC5cclxuICogQHBhcmFtIHtudW1iZXJ9IG1pbiAtIFRoZSBtaW4gdmFsdWUuIEFueSB4IHZhbHVlIGJlbG93IG1pbiB3aWxsIGJlIGAwYC5cclxuICogQHBhcmFtIHtudW1iZXJ9IG1heCAtIFRoZSBtYXggdmFsdWUuIEFueSB4IHZhbHVlIGFib3ZlIG1heCB3aWxsIGJlIGAxYC5cclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgYWx0ZXJuYXRlZCB2YWx1ZS5cclxuICovXHJcbmZ1bmN0aW9uIHNtb290aGVyc3RlcCggeCwgbWluLCBtYXggKSB7XHJcblxyXG5cdGlmICggeCA8PSBtaW4gKSByZXR1cm4gMDtcclxuXHRpZiAoIHggPj0gbWF4ICkgcmV0dXJuIDE7XHJcblxyXG5cdHggPSAoIHggLSBtaW4gKSAvICggbWF4IC0gbWluICk7XHJcblxyXG5cdHJldHVybiB4ICogeCAqIHggKiAoIHggKiAoIHggKiA2IC0gMTUgKSArIDEwICk7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIHJhbmRvbSBpbnRlZ2VyIGZyb20gYDxsb3csIGhpZ2g+YCBpbnRlcnZhbC5cclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IGxvdyAtIFRoZSBsb3dlciB2YWx1ZSBib3VuZGFyeS5cclxuICogQHBhcmFtIHtudW1iZXJ9IGhpZ2ggLSBUaGUgdXBwZXIgdmFsdWUgYm91bmRhcnlcclxuICogQHJldHVybiB7bnVtYmVyfSBBIHJhbmRvbSBpbnRlZ2VyLlxyXG4gKi9cclxuZnVuY3Rpb24gcmFuZEludCggbG93LCBoaWdoICkge1xyXG5cclxuXHRyZXR1cm4gbG93ICsgTWF0aC5mbG9vciggTWF0aC5yYW5kb20oKSAqICggaGlnaCAtIGxvdyArIDEgKSApO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSByYW5kb20gZmxvYXQgZnJvbSBgPGxvdywgaGlnaD5gIGludGVydmFsLlxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gbG93IC0gVGhlIGxvd2VyIHZhbHVlIGJvdW5kYXJ5LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gaGlnaCAtIFRoZSB1cHBlciB2YWx1ZSBib3VuZGFyeVxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IEEgcmFuZG9tIGZsb2F0LlxyXG4gKi9cclxuZnVuY3Rpb24gcmFuZEZsb2F0KCBsb3csIGhpZ2ggKSB7XHJcblxyXG5cdHJldHVybiBsb3cgKyBNYXRoLnJhbmRvbSgpICogKCBoaWdoIC0gbG93ICk7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIHJhbmRvbSBpbnRlZ2VyIGZyb20gYDwtcmFuZ2UvMiwgcmFuZ2UvMj5gIGludGVydmFsLlxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gcmFuZ2UgLSBEZWZpbmVzIHRoZSB2YWx1ZSByYW5nZS5cclxuICogQHJldHVybiB7bnVtYmVyfSBBIHJhbmRvbSBmbG9hdC5cclxuICovXHJcbmZ1bmN0aW9uIHJhbmRGbG9hdFNwcmVhZCggcmFuZ2UgKSB7XHJcblxyXG5cdHJldHVybiByYW5nZSAqICggMC41IC0gTWF0aC5yYW5kb20oKSApO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSBkZXRlcm1pbmlzdGljIHBzZXVkby1yYW5kb20gZmxvYXQgaW4gdGhlIGludGVydmFsIGBbMCwgMV1gLlxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3NdIC0gVGhlIGludGVnZXIgc2VlZC5cclxuICogQHJldHVybiB7bnVtYmVyfSBBIHJhbmRvbSBmbG9hdC5cclxuICovXHJcbmZ1bmN0aW9uIHNlZWRlZFJhbmRvbSggcyApIHtcclxuXHJcblx0aWYgKCBzICE9PSB1bmRlZmluZWQgKSBfc2VlZCA9IHM7XHJcblxyXG5cdC8vIE11bGJlcnJ5MzIgZ2VuZXJhdG9yXHJcblxyXG5cdGxldCB0ID0gX3NlZWQgKz0gMHg2RDJCNzlGNTtcclxuXHJcblx0dCA9IE1hdGguaW11bCggdCBeIHQgPj4+IDE1LCB0IHwgMSApO1xyXG5cclxuXHR0IF49IHQgKyBNYXRoLmltdWwoIHQgXiB0ID4+PiA3LCB0IHwgNjEgKTtcclxuXHJcblx0cmV0dXJuICggKCB0IF4gdCA+Pj4gMTQgKSA+Pj4gMCApIC8gNDI5NDk2NzI5NjtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyBkZWdyZWVzIHRvIHJhZGlhbnMuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBkZWdyZWVzIC0gQSB2YWx1ZSBpbiBkZWdyZWVzLlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBjb252ZXJ0ZWQgdmFsdWUgaW4gcmFkaWFucy5cclxuICovXHJcbmZ1bmN0aW9uIGRlZ1RvUmFkKCBkZWdyZWVzICkge1xyXG5cclxuXHRyZXR1cm4gZGVncmVlcyAqIERFRzJSQUQ7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQ29udmVydHMgcmFkaWFucyB0byBkZWdyZWVzLlxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gcmFkaWFucyAtIEEgdmFsdWUgaW4gcmFkaWFucy5cclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgY29udmVydGVkIHZhbHVlIGluIGRlZ3JlZXMuXHJcbiAqL1xyXG5mdW5jdGlvbiByYWRUb0RlZyggcmFkaWFucyApIHtcclxuXHJcblx0cmV0dXJuIHJhZGlhbnMgKiBSQUQyREVHO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBnaXZlbiBudW1iZXIgaXMgYSBwb3dlciBvZiB0d28uXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVjay5cclxuICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZ2l2ZW4gbnVtYmVyIGlzIGEgcG93ZXIgb2YgdHdvIG9yIG5vdC5cclxuICovXHJcbmZ1bmN0aW9uIGlzUG93ZXJPZlR3byggdmFsdWUgKSB7XHJcblxyXG5cdHJldHVybiAoIHZhbHVlICYgKCB2YWx1ZSAtIDEgKSApID09PSAwICYmIHZhbHVlICE9PSAwO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIHNtYWxsZXN0IHBvd2VyIG9mIHR3byB0aGF0IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgZ2l2ZW4gbnVtYmVyLlxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gZmluZCBhIFBPVCBmb3IuXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIHNtYWxsZXN0IHBvd2VyIG9mIHR3byB0aGF0IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgZ2l2ZW4gbnVtYmVyLlxyXG4gKi9cclxuZnVuY3Rpb24gY2VpbFBvd2VyT2ZUd28oIHZhbHVlICkge1xyXG5cclxuXHRyZXR1cm4gTWF0aC5wb3coIDIsIE1hdGguY2VpbCggTWF0aC5sb2coIHZhbHVlICkgLyBNYXRoLkxOMiApICk7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgbGFyZ2VzdCBwb3dlciBvZiB0d28gdGhhdCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGdpdmVuIG51bWJlci5cclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIGZpbmQgYSBQT1QgZm9yLlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBsYXJnZXN0IHBvd2VyIG9mIHR3byB0aGF0IGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgZ2l2ZW4gbnVtYmVyLlxyXG4gKi9cclxuZnVuY3Rpb24gZmxvb3JQb3dlck9mVHdvKCB2YWx1ZSApIHtcclxuXHJcblx0cmV0dXJuIE1hdGgucG93KCAyLCBNYXRoLmZsb29yKCBNYXRoLmxvZyggdmFsdWUgKSAvIE1hdGguTE4yICkgKTtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTZXRzIHRoZSBnaXZlbiBxdWF0ZXJuaW9uIGZyb20gdGhlIFtJbnRyaW5zaWMgUHJvcGVyIEV1bGVyIEFuZ2xlc117QGxpbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRXVsZXJfYW5nbGVzfVxyXG4gKiBkZWZpbmVkIGJ5IHRoZSBnaXZlbiBhbmdsZXMgYW5kIG9yZGVyLlxyXG4gKlxyXG4gKiBSb3RhdGlvbnMgYXJlIGFwcGxpZWQgdG8gdGhlIGF4ZXMgaW4gdGhlIG9yZGVyIHNwZWNpZmllZCBieSBvcmRlcjpcclxuICogcm90YXRpb24gYnkgYW5nbGUgYGFgIGlzIGFwcGxpZWQgZmlyc3QsIHRoZW4gYnkgYW5nbGUgYGJgLCB0aGVuIGJ5IGFuZ2xlIGBjYC5cclxuICpcclxuICogQHBhcmFtIHtRdWF0ZXJuaW9ufSBxIC0gVGhlIHF1YXRlcm5pb24gdG8gc2V0LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gYSAtIFRoZSByb3RhdGlvbiBhcHBsaWVkIHRvIHRoZSBmaXJzdCBheGlzLCBpbiByYWRpYW5zLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gYiAtIFRoZSByb3RhdGlvbiBhcHBsaWVkIHRvIHRoZSBzZWNvbmQgYXhpcywgaW4gcmFkaWFucy5cclxuICogQHBhcmFtIHtudW1iZXJ9IGMgLSBUaGUgcm90YXRpb24gYXBwbGllZCB0byB0aGUgdGhpcmQgYXhpcywgaW4gcmFkaWFucy5cclxuICogQHBhcmFtIHsoJ1hZWCd8J1haWCd8J1lYWSd8J1laWSd8J1pYWid8J1pZWicpfSBvcmRlciAtIEEgc3RyaW5nIHNwZWNpZnlpbmcgdGhlIGF4ZXMgb3JkZXIuXHJcbiAqL1xyXG5mdW5jdGlvbiBzZXRRdWF0ZXJuaW9uRnJvbVByb3BlckV1bGVyKCBxLCBhLCBiLCBjLCBvcmRlciApIHtcclxuXHJcblx0Y29uc3QgY29zID0gTWF0aC5jb3M7XHJcblx0Y29uc3Qgc2luID0gTWF0aC5zaW47XHJcblxyXG5cdGNvbnN0IGMyID0gY29zKCBiIC8gMiApO1xyXG5cdGNvbnN0IHMyID0gc2luKCBiIC8gMiApO1xyXG5cclxuXHRjb25zdCBjMTMgPSBjb3MoICggYSArIGMgKSAvIDIgKTtcclxuXHRjb25zdCBzMTMgPSBzaW4oICggYSArIGMgKSAvIDIgKTtcclxuXHJcblx0Y29uc3QgYzFfMyA9IGNvcyggKCBhIC0gYyApIC8gMiApO1xyXG5cdGNvbnN0IHMxXzMgPSBzaW4oICggYSAtIGMgKSAvIDIgKTtcclxuXHJcblx0Y29uc3QgYzNfMSA9IGNvcyggKCBjIC0gYSApIC8gMiApO1xyXG5cdGNvbnN0IHMzXzEgPSBzaW4oICggYyAtIGEgKSAvIDIgKTtcclxuXHJcblx0c3dpdGNoICggb3JkZXIgKSB7XHJcblxyXG5cdFx0Y2FzZSAnWFlYJzpcclxuXHRcdFx0cS5zZXQoIGMyICogczEzLCBzMiAqIGMxXzMsIHMyICogczFfMywgYzIgKiBjMTMgKTtcclxuXHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0Y2FzZSAnWVpZJzpcclxuXHRcdFx0cS5zZXQoIHMyICogczFfMywgYzIgKiBzMTMsIHMyICogYzFfMywgYzIgKiBjMTMgKTtcclxuXHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0Y2FzZSAnWlhaJzpcclxuXHRcdFx0cS5zZXQoIHMyICogYzFfMywgczIgKiBzMV8zLCBjMiAqIHMxMywgYzIgKiBjMTMgKTtcclxuXHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0Y2FzZSAnWFpYJzpcclxuXHRcdFx0cS5zZXQoIGMyICogczEzLCBzMiAqIHMzXzEsIHMyICogYzNfMSwgYzIgKiBjMTMgKTtcclxuXHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0Y2FzZSAnWVhZJzpcclxuXHRcdFx0cS5zZXQoIHMyICogYzNfMSwgYzIgKiBzMTMsIHMyICogczNfMSwgYzIgKiBjMTMgKTtcclxuXHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0Y2FzZSAnWllaJzpcclxuXHRcdFx0cS5zZXQoIHMyICogczNfMSwgczIgKiBjM18xLCBjMiAqIHMxMywgYzIgKiBjMTMgKTtcclxuXHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0ZGVmYXVsdDpcclxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0aFV0aWxzOiAuc2V0UXVhdGVybmlvbkZyb21Qcm9wZXJFdWxlcigpIGVuY291bnRlcmVkIGFuIHVua25vd24gb3JkZXI6ICcgKyBvcmRlciApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogRGVub3JtYWxpemVzIHRoZSBnaXZlbiB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHR5cGVkIGFycmF5LlxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gZGVub3JtYWxpemUuXHJcbiAqIEBwYXJhbSB7VHlwZWRBcnJheX0gYXJyYXkgLSBUaGUgdHlwZWQgYXJyYXkgdGhhdCBkZWZpbmVzIHRoZSBkYXRhIHR5cGUgb2YgdGhlIHZhbHVlLlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBkZW5vcm1hbGl6ZSAoZmxvYXQpIHZhbHVlIGluIHRoZSByYW5nZSBgWzAsMV1gLlxyXG4gKi9cclxuZnVuY3Rpb24gZGVub3JtYWxpemUoIHZhbHVlLCBhcnJheSApIHtcclxuXHJcblx0c3dpdGNoICggYXJyYXkuY29uc3RydWN0b3IgKSB7XHJcblxyXG5cdFx0Y2FzZSBGbG9hdDMyQXJyYXk6XHJcblxyXG5cdFx0XHRyZXR1cm4gdmFsdWU7XHJcblxyXG5cdFx0Y2FzZSBVaW50MzJBcnJheTpcclxuXHJcblx0XHRcdHJldHVybiB2YWx1ZSAvIDQyOTQ5NjcyOTUuMDtcclxuXHJcblx0XHRjYXNlIFVpbnQxNkFycmF5OlxyXG5cclxuXHRcdFx0cmV0dXJuIHZhbHVlIC8gNjU1MzUuMDtcclxuXHJcblx0XHRjYXNlIFVpbnQ4QXJyYXk6XHJcblxyXG5cdFx0XHRyZXR1cm4gdmFsdWUgLyAyNTUuMDtcclxuXHJcblx0XHRjYXNlIEludDMyQXJyYXk6XHJcblxyXG5cdFx0XHRyZXR1cm4gTWF0aC5tYXgoIHZhbHVlIC8gMjE0NzQ4MzY0Ny4wLCAtIDEuMCApO1xyXG5cclxuXHRcdGNhc2UgSW50MTZBcnJheTpcclxuXHJcblx0XHRcdHJldHVybiBNYXRoLm1heCggdmFsdWUgLyAzMjc2Ny4wLCAtIDEuMCApO1xyXG5cclxuXHRcdGNhc2UgSW50OEFycmF5OlxyXG5cclxuXHRcdFx0cmV0dXJuIE1hdGgubWF4KCB2YWx1ZSAvIDEyNy4wLCAtIDEuMCApO1xyXG5cclxuXHRcdGRlZmF1bHQ6XHJcblxyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdJbnZhbGlkIGNvbXBvbmVudCB0eXBlLicgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIE5vcm1hbGl6ZXMgdGhlIGdpdmVuIHZhbHVlIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gdHlwZWQgYXJyYXkuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBmbG9hdCB2YWx1ZSBpbiB0aGUgcmFuZ2UgYFswLDFdYCB0byBub3JtYWxpemUuXHJcbiAqIEBwYXJhbSB7VHlwZWRBcnJheX0gYXJyYXkgLSBUaGUgdHlwZWQgYXJyYXkgdGhhdCBkZWZpbmVzIHRoZSBkYXRhIHR5cGUgb2YgdGhlIHZhbHVlLlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBub3JtYWxpemUgdmFsdWUuXHJcbiAqL1xyXG5mdW5jdGlvbiBub3JtYWxpemUoIHZhbHVlLCBhcnJheSApIHtcclxuXHJcblx0c3dpdGNoICggYXJyYXkuY29uc3RydWN0b3IgKSB7XHJcblxyXG5cdFx0Y2FzZSBGbG9hdDMyQXJyYXk6XHJcblxyXG5cdFx0XHRyZXR1cm4gdmFsdWU7XHJcblxyXG5cdFx0Y2FzZSBVaW50MzJBcnJheTpcclxuXHJcblx0XHRcdHJldHVybiBNYXRoLnJvdW5kKCB2YWx1ZSAqIDQyOTQ5NjcyOTUuMCApO1xyXG5cclxuXHRcdGNhc2UgVWludDE2QXJyYXk6XHJcblxyXG5cdFx0XHRyZXR1cm4gTWF0aC5yb3VuZCggdmFsdWUgKiA2NTUzNS4wICk7XHJcblxyXG5cdFx0Y2FzZSBVaW50OEFycmF5OlxyXG5cclxuXHRcdFx0cmV0dXJuIE1hdGgucm91bmQoIHZhbHVlICogMjU1LjAgKTtcclxuXHJcblx0XHRjYXNlIEludDMyQXJyYXk6XHJcblxyXG5cdFx0XHRyZXR1cm4gTWF0aC5yb3VuZCggdmFsdWUgKiAyMTQ3NDgzNjQ3LjAgKTtcclxuXHJcblx0XHRjYXNlIEludDE2QXJyYXk6XHJcblxyXG5cdFx0XHRyZXR1cm4gTWF0aC5yb3VuZCggdmFsdWUgKiAzMjc2Ny4wICk7XHJcblxyXG5cdFx0Y2FzZSBJbnQ4QXJyYXk6XHJcblxyXG5cdFx0XHRyZXR1cm4gTWF0aC5yb3VuZCggdmFsdWUgKiAxMjcuMCApO1xyXG5cclxuXHRcdGRlZmF1bHQ6XHJcblxyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdJbnZhbGlkIGNvbXBvbmVudCB0eXBlLicgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIEBjbGFzc1xyXG4gKiBAY2xhc3NkZXNjIEEgY29sbGVjdGlvbiBvZiBtYXRoIHV0aWxpdHkgZnVuY3Rpb25zLlxyXG4gKiBAaGlkZWNvbnN0cnVjdG9yXHJcbiAqL1xyXG5jb25zdCBNYXRoVXRpbHMgPSB7XHJcblx0REVHMlJBRDogREVHMlJBRCxcclxuXHRSQUQyREVHOiBSQUQyREVHLFxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlIGEgW1VVSURde0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VuaXZlcnNhbGx5X3VuaXF1ZV9pZGVudGlmaWVyfVxyXG5cdCAqICh1bml2ZXJzYWxseSB1bmlxdWUgaWRlbnRpZmllcikuXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQG1ldGhvZFxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIFVVSUQuXHJcblx0ICovXHJcblx0Z2VuZXJhdGVVVUlEOiBnZW5lcmF0ZVVVSUQsXHJcblx0LyoqXHJcblx0ICogQ2xhbXBzIHRoZSBnaXZlbiB2YWx1ZSBiZXR3ZWVuIG1pbiBhbmQgbWF4LlxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEBtZXRob2RcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2xhbXAuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IG1pbiAtIFRoZSBtaW4gdmFsdWUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IG1heCAtIFRoZSBtYXggdmFsdWUuXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgY2xhbXBlZCB2YWx1ZS5cclxuXHQgKi9cclxuXHRjbGFtcDogY2xhbXAsXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgdGhlIEV1Y2xpZGVhbiBtb2R1bG8gb2YgdGhlIGdpdmVuIHBhcmFtZXRlcnMgdGhhdFxyXG5cdCAqIGlzIGAoICggbiAlIG0gKSArIG0gKSAlIG1gLlxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEBtZXRob2RcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbiAtIFRoZSBmaXJzdCBwYXJhbWV0ZXIuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IG0gLSBUaGUgc2Vjb25kIHBhcmFtZXRlci5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBFdWNsaWRlYW4gbW9kdWxvLlxyXG5cdCAqL1xyXG5cdGV1Y2xpZGVhbk1vZHVsbzogZXVjbGlkZWFuTW9kdWxvLFxyXG5cdC8qKlxyXG5cdCAqIFBlcmZvcm1zIGEgbGluZWFyIG1hcHBpbmcgZnJvbSByYW5nZSBgPGExLCBhMj5gIHRvIHJhbmdlIGA8YjEsIGIyPmBcclxuXHQgKiBmb3IgdGhlIGdpdmVuIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEBtZXRob2RcclxuXHQgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB2YWx1ZSB0byBiZSBtYXBwZWQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGExIC0gTWluaW11bSB2YWx1ZSBmb3IgcmFuZ2UgQS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYTIgLSBNYXhpbXVtIHZhbHVlIGZvciByYW5nZSBBLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBiMSAtIE1pbmltdW0gdmFsdWUgZm9yIHJhbmdlIEIuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGIyIC0gTWF4aW11bSB2YWx1ZSBmb3IgcmFuZ2UgQi5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBtYXBwZWQgdmFsdWUuXHJcblx0ICovXHJcblx0bWFwTGluZWFyOiBtYXBMaW5lYXIsXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgcGVyY2VudGFnZSBpbiB0aGUgY2xvc2VkIGludGVydmFsIGBbMCwgMV1gIG9mIHRoZSBnaXZlbiB2YWx1ZVxyXG5cdCAqIGJldHdlZW4gdGhlIHN0YXJ0IGFuZCBlbmQgcG9pbnQuXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQG1ldGhvZFxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHN0YXJ0IHBvaW50XHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgZW5kIHBvaW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIEEgdmFsdWUgYmV0d2VlbiBzdGFydCBhbmQgZW5kLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGludGVycG9sYXRpb24gZmFjdG9yLlxyXG5cdCAqL1xyXG5cdGludmVyc2VMZXJwOiBpbnZlcnNlTGVycCxcclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgdmFsdWUgbGluZWFybHkgaW50ZXJwb2xhdGVkIGZyb20gdHdvIGtub3duIHBvaW50cyBiYXNlZCBvbiB0aGUgZ2l2ZW4gaW50ZXJ2YWwgLVxyXG5cdCAqIGB0ID0gMGAgd2lsbCByZXR1cm4gYHhgIGFuZCBgdCA9IDFgIHdpbGwgcmV0dXJuIGB5YC5cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAbWV0aG9kXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgc3RhcnQgcG9pbnRcclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSBlbmQgcG9pbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHQgLSBUaGUgaW50ZXJwb2xhdGlvbiBmYWN0b3IgaW4gdGhlIGNsb3NlZCBpbnRlcnZhbCBgWzAsIDFdYC5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBpbnRlcnBvbGF0ZWQgdmFsdWUuXHJcblx0ICovXHJcblx0bGVycDogbGVycCxcclxuXHQvKipcclxuXHQgKiBTbW9vdGhseSBpbnRlcnBvbGF0ZSBhIG51bWJlciBmcm9tIGB4YCB0byBgeWAgaW4gIGEgc3ByaW5nLWxpa2UgbWFubmVyIHVzaW5nIGEgZGVsdGFcclxuXHQgKiB0aW1lIHRvIG1haW50YWluIGZyYW1lIHJhdGUgaW5kZXBlbmRlbnQgbW92ZW1lbnQuIEZvciBkZXRhaWxzLCBzZWVcclxuXHQgKiBbRnJhbWUgcmF0ZSBpbmRlcGVuZGVudCBkYW1waW5nIHVzaW5nIGxlcnBde0BsaW5rIGh0dHA6Ly93d3cucm9yeWRyaXNjb2xsLmNvbS8yMDE2LzAzLzA3L2ZyYW1lLXJhdGUtaW5kZXBlbmRlbnQtZGFtcGluZy11c2luZy1sZXJwL30uXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQG1ldGhvZFxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGN1cnJlbnQgcG9pbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdGFyZ2V0IHBvaW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBsYW1iZGEgLSBBIGhpZ2hlciBsYW1iZGEgdmFsdWUgd2lsbCBtYWtlIHRoZSBtb3ZlbWVudCBtb3JlIHN1ZGRlbixcclxuXHQgKiBhbmQgYSBsb3dlciB2YWx1ZSB3aWxsIG1ha2UgdGhlIG1vdmVtZW50IG1vcmUgZ3JhZHVhbC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZHQgLSBEZWx0YSB0aW1lIGluIHNlY29uZHMuXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgaW50ZXJwb2xhdGVkIHZhbHVlLlxyXG5cdCAqL1xyXG5cdGRhbXA6IGRhbXAsXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIHZhbHVlIHRoYXQgYWx0ZXJuYXRlcyBiZXR3ZWVuIGAwYCBhbmQgdGhlIGdpdmVuIGBsZW5ndGhgIHBhcmFtZXRlci5cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAbWV0aG9kXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgdmFsdWUgdG8gcGluZ3BvbmcuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9MV0gLSBUaGUgcG9zaXRpdmUgdmFsdWUgdGhlIGZ1bmN0aW9uIHdpbGwgcGluZ3BvbmcgdG8uXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgYWx0ZXJuYXRlZCB2YWx1ZS5cclxuXHQgKi9cclxuXHRwaW5ncG9uZzogcGluZ3BvbmcsXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIHZhbHVlIGluIHRoZSByYW5nZSBgWzAsMV1gIHRoYXQgcmVwcmVzZW50cyB0aGUgcGVyY2VudGFnZSB0aGF0IGB4YCBoYXNcclxuXHQgKiBtb3ZlZCBiZXR3ZWVuIGBtaW5gIGFuZCBgbWF4YCwgYnV0IHNtb290aGVkIG9yIHNsb3dlZCBkb3duIHRoZSBjbG9zZXIgYHhgIGlzIHRvXHJcblx0ICogdGhlIGBtaW5gIGFuZCBgbWF4YC5cclxuXHQgKlxyXG5cdCAqIFNlZSBbU21vb3Roc3RlcF17QGxpbmsgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TbW9vdGhzdGVwfSBmb3IgbW9yZSBkZXRhaWxzLlxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEBtZXRob2RcclxuXHQgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB2YWx1ZSB0byBldmFsdWF0ZSBiYXNlZCBvbiBpdHMgcG9zaXRpb24gYmV0d2VlbiBtaW4gYW5kIG1heC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbWluIC0gVGhlIG1pbiB2YWx1ZS4gQW55IHggdmFsdWUgYmVsb3cgbWluIHdpbGwgYmUgYDBgLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBtYXggLSBUaGUgbWF4IHZhbHVlLiBBbnkgeCB2YWx1ZSBhYm92ZSBtYXggd2lsbCBiZSBgMWAuXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgYWx0ZXJuYXRlZCB2YWx1ZS5cclxuXHQgKi9cclxuXHRzbW9vdGhzdGVwOiBzbW9vdGhzdGVwLFxyXG5cdC8qKlxyXG5cdCAqIEEgW3ZhcmlhdGlvbiBvbiBzbW9vdGhzdGVwXXtAbGluayBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TbW9vdGhzdGVwI1ZhcmlhdGlvbnN9XHJcblx0ICogdGhhdCBoYXMgemVybyAxc3QgYW5kIDJuZCBvcmRlciBkZXJpdmF0aXZlcyBhdCB4PTAgYW5kIHg9MS5cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAbWV0aG9kXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUgYmFzZWQgb24gaXRzIHBvc2l0aW9uIGJldHdlZW4gbWluIGFuZCBtYXguXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IG1pbiAtIFRoZSBtaW4gdmFsdWUuIEFueSB4IHZhbHVlIGJlbG93IG1pbiB3aWxsIGJlIGAwYC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbWF4IC0gVGhlIG1heCB2YWx1ZS4gQW55IHggdmFsdWUgYWJvdmUgbWF4IHdpbGwgYmUgYDFgLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGFsdGVybmF0ZWQgdmFsdWUuXHJcblx0ICovXHJcblx0c21vb3RoZXJzdGVwOiBzbW9vdGhlcnN0ZXAsXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIHJhbmRvbSBpbnRlZ2VyIGZyb20gYDxsb3csIGhpZ2g+YCBpbnRlcnZhbC5cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAbWV0aG9kXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGxvdyAtIFRoZSBsb3dlciB2YWx1ZSBib3VuZGFyeS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaGlnaCAtIFRoZSB1cHBlciB2YWx1ZSBib3VuZGFyeVxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gQSByYW5kb20gaW50ZWdlci5cclxuXHQgKi9cclxuXHRyYW5kSW50OiByYW5kSW50LFxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSByYW5kb20gZmxvYXQgZnJvbSBgPGxvdywgaGlnaD5gIGludGVydmFsLlxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEBtZXRob2RcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbG93IC0gVGhlIGxvd2VyIHZhbHVlIGJvdW5kYXJ5LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBoaWdoIC0gVGhlIHVwcGVyIHZhbHVlIGJvdW5kYXJ5XHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBBIHJhbmRvbSBmbG9hdC5cclxuXHQgKi9cclxuXHRyYW5kRmxvYXQ6IHJhbmRGbG9hdCxcclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgcmFuZG9tIGludGVnZXIgZnJvbSBgPC1yYW5nZS8yLCByYW5nZS8yPmAgaW50ZXJ2YWwuXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQG1ldGhvZFxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSByYW5nZSAtIERlZmluZXMgdGhlIHZhbHVlIHJhbmdlLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gQSByYW5kb20gZmxvYXQuXHJcblx0ICovXHJcblx0cmFuZEZsb2F0U3ByZWFkOiByYW5kRmxvYXRTcHJlYWQsXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIGRldGVybWluaXN0aWMgcHNldWRvLXJhbmRvbSBmbG9hdCBpbiB0aGUgaW50ZXJ2YWwgYFswLCAxXWAuXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQG1ldGhvZFxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbc10gLSBUaGUgaW50ZWdlciBzZWVkLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gQSByYW5kb20gZmxvYXQuXHJcblx0ICovXHJcblx0c2VlZGVkUmFuZG9tOiBzZWVkZWRSYW5kb20sXHJcblx0LyoqXHJcblx0ICogQ29udmVydHMgZGVncmVlcyB0byByYWRpYW5zLlxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEBtZXRob2RcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZGVncmVlcyAtIEEgdmFsdWUgaW4gZGVncmVlcy5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBjb252ZXJ0ZWQgdmFsdWUgaW4gcmFkaWFucy5cclxuXHQgKi9cclxuXHRkZWdUb1JhZDogZGVnVG9SYWQsXHJcblx0LyoqXHJcblx0ICogQ29udmVydHMgcmFkaWFucyB0byBkZWdyZWVzLlxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEBtZXRob2RcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gcmFkaWFucyAtIEEgdmFsdWUgaW4gcmFkaWFucy5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBjb252ZXJ0ZWQgdmFsdWUgaW4gZGVncmVlcy5cclxuXHQgKi9cclxuXHRyYWRUb0RlZzogcmFkVG9EZWcsXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIG51bWJlciBpcyBhIHBvd2VyIG9mIHR3by5cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAbWV0aG9kXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrLlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGdpdmVuIG51bWJlciBpcyBhIHBvd2VyIG9mIHR3byBvciBub3QuXHJcblx0ICovXHJcblx0aXNQb3dlck9mVHdvOiBpc1Bvd2VyT2ZUd28sXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgc21hbGxlc3QgcG93ZXIgb2YgdHdvIHRoYXQgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBnaXZlbiBudW1iZXIuXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQG1ldGhvZFxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBmaW5kIGEgUE9UIGZvci5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBzbWFsbGVzdCBwb3dlciBvZiB0d28gdGhhdCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGdpdmVuIG51bWJlci5cclxuXHQgKi9cclxuXHRjZWlsUG93ZXJPZlR3bzogY2VpbFBvd2VyT2ZUd28sXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgbGFyZ2VzdCBwb3dlciBvZiB0d28gdGhhdCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGdpdmVuIG51bWJlci5cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAbWV0aG9kXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIGZpbmQgYSBQT1QgZm9yLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGxhcmdlc3QgcG93ZXIgb2YgdHdvIHRoYXQgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBnaXZlbiBudW1iZXIuXHJcblx0ICovXHJcblx0Zmxvb3JQb3dlck9mVHdvOiBmbG9vclBvd2VyT2ZUd28sXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZ2l2ZW4gcXVhdGVybmlvbiBmcm9tIHRoZSBbSW50cmluc2ljIFByb3BlciBFdWxlciBBbmdsZXNde0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0V1bGVyX2FuZ2xlc31cclxuXHQgKiBkZWZpbmVkIGJ5IHRoZSBnaXZlbiBhbmdsZXMgYW5kIG9yZGVyLlxyXG5cdCAqXHJcblx0ICogUm90YXRpb25zIGFyZSBhcHBsaWVkIHRvIHRoZSBheGVzIGluIHRoZSBvcmRlciBzcGVjaWZpZWQgYnkgb3JkZXI6XHJcblx0ICogcm90YXRpb24gYnkgYW5nbGUgYGFgIGlzIGFwcGxpZWQgZmlyc3QsIHRoZW4gYnkgYW5nbGUgYGJgLCB0aGVuIGJ5IGFuZ2xlIGBjYC5cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAbWV0aG9kXHJcblx0ICogQHBhcmFtIHtRdWF0ZXJuaW9ufSBxIC0gVGhlIHF1YXRlcm5pb24gdG8gc2V0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhIC0gVGhlIHJvdGF0aW9uIGFwcGxpZWQgdG8gdGhlIGZpcnN0IGF4aXMsIGluIHJhZGlhbnMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGIgLSBUaGUgcm90YXRpb24gYXBwbGllZCB0byB0aGUgc2Vjb25kIGF4aXMsIGluIHJhZGlhbnMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGMgLSBUaGUgcm90YXRpb24gYXBwbGllZCB0byB0aGUgdGhpcmQgYXhpcywgaW4gcmFkaWFucy5cclxuXHQgKiBAcGFyYW0geygnWFlYJ3wnWFpYJ3wnWVhZJ3wnWVpZJ3wnWlhaJ3wnWllaJyl9IG9yZGVyIC0gQSBzdHJpbmcgc3BlY2lmeWluZyB0aGUgYXhlcyBvcmRlci5cclxuXHQgKi9cclxuXHRzZXRRdWF0ZXJuaW9uRnJvbVByb3BlckV1bGVyOiBzZXRRdWF0ZXJuaW9uRnJvbVByb3BlckV1bGVyLFxyXG5cdC8qKlxyXG5cdCAqIE5vcm1hbGl6ZXMgdGhlIGdpdmVuIHZhbHVlIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gdHlwZWQgYXJyYXkuXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQG1ldGhvZFxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBmbG9hdCB2YWx1ZSBpbiB0aGUgcmFuZ2UgYFswLDFdYCB0byBub3JtYWxpemUuXHJcblx0ICogQHBhcmFtIHtUeXBlZEFycmF5fSBhcnJheSAtIFRoZSB0eXBlZCBhcnJheSB0aGF0IGRlZmluZXMgdGhlIGRhdGEgdHlwZSBvZiB0aGUgdmFsdWUuXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgbm9ybWFsaXplIHZhbHVlLlxyXG5cdCAqL1xyXG5cdG5vcm1hbGl6ZTogbm9ybWFsaXplLFxyXG5cdC8qKlxyXG5cdCAqIERlbm9ybWFsaXplcyB0aGUgZ2l2ZW4gdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiB0eXBlZCBhcnJheS5cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAbWV0aG9kXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIGRlbm9ybWFsaXplLlxyXG5cdCAqIEBwYXJhbSB7VHlwZWRBcnJheX0gYXJyYXkgLSBUaGUgdHlwZWQgYXJyYXkgdGhhdCBkZWZpbmVzIHRoZSBkYXRhIHR5cGUgb2YgdGhlIHZhbHVlLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGRlbm9ybWFsaXplIChmbG9hdCkgdmFsdWUgaW4gdGhlIHJhbmdlIGBbMCwxXWAuXHJcblx0ICovXHJcblx0ZGVub3JtYWxpemU6IGRlbm9ybWFsaXplXHJcbn07XHJcblxyXG5leHBvcnQge1xyXG5cdERFRzJSQUQsXHJcblx0UkFEMkRFRyxcclxuXHRnZW5lcmF0ZVVVSUQsXHJcblx0Y2xhbXAsXHJcblx0ZXVjbGlkZWFuTW9kdWxvLFxyXG5cdG1hcExpbmVhcixcclxuXHRpbnZlcnNlTGVycCxcclxuXHRsZXJwLFxyXG5cdGRhbXAsXHJcblx0cGluZ3BvbmcsXHJcblx0c21vb3Roc3RlcCxcclxuXHRzbW9vdGhlcnN0ZXAsXHJcblx0cmFuZEludCxcclxuXHRyYW5kRmxvYXQsXHJcblx0cmFuZEZsb2F0U3ByZWFkLFxyXG5cdHNlZWRlZFJhbmRvbSxcclxuXHRkZWdUb1JhZCxcclxuXHRyYWRUb0RlZyxcclxuXHRpc1Bvd2VyT2ZUd28sXHJcblx0Y2VpbFBvd2VyT2ZUd28sXHJcblx0Zmxvb3JQb3dlck9mVHdvLFxyXG5cdHNldFF1YXRlcm5pb25Gcm9tUHJvcGVyRXVsZXIsXHJcblx0bm9ybWFsaXplLFxyXG5cdGRlbm9ybWFsaXplLFxyXG5cdE1hdGhVdGlsc1xyXG59O1xyXG4iLCJpbXBvcnQgeyBjbGFtcCB9IGZyb20gJy4vTWF0aFV0aWxzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgYSAyRCB2ZWN0b3IuIEEgMkQgdmVjdG9yIGlzIGFuIG9yZGVyZWQgcGFpciBvZiBudW1iZXJzXHJcbiAqIChsYWJlbGVkIHggYW5kIHkpLCB3aGljaCBjYW4gYmUgdXNlZCB0byByZXByZXNlbnQgYSBudW1iZXIgb2YgdGhpbmdzLCBzdWNoIGFzOlxyXG4gKlxyXG4gKiAtIEEgcG9pbnQgaW4gMkQgc3BhY2UgKGkuZS4gYSBwb3NpdGlvbiBvbiBhIHBsYW5lKS5cclxuICogLSBBIGRpcmVjdGlvbiBhbmQgbGVuZ3RoIGFjcm9zcyBhIHBsYW5lLiBJbiB0aHJlZS5qcyB0aGUgbGVuZ3RoIHdpbGxcclxuICogYWx3YXlzIGJlIHRoZSBFdWNsaWRlYW4gZGlzdGFuY2Uoc3RyYWlnaHQtbGluZSBkaXN0YW5jZSkgZnJvbSBgKDAsIDApYCB0byBgKHgsIHkpYFxyXG4gKiBhbmQgdGhlIGRpcmVjdGlvbiBpcyBhbHNvIG1lYXN1cmVkIGZyb20gYCgwLCAwKWAgdG93YXJkcyBgKHgsIHkpYC5cclxuICogLSBBbnkgYXJiaXRyYXJ5IG9yZGVyZWQgcGFpciBvZiBudW1iZXJzLlxyXG4gKlxyXG4gKiBUaGVyZSBhcmUgb3RoZXIgdGhpbmdzIGEgMkQgdmVjdG9yIGNhbiBiZSB1c2VkIHRvIHJlcHJlc2VudCwgc3VjaCBhc1xyXG4gKiBtb21lbnR1bSB2ZWN0b3JzLCBjb21wbGV4IG51bWJlcnMgYW5kIHNvIG9uLCBob3dldmVyIHRoZXNlIGFyZSB0aGUgbW9zdFxyXG4gKiBjb21tb24gdXNlcyBpbiB0aHJlZS5qcy5cclxuICpcclxuICogSXRlcmF0aW5nIHRocm91Z2ggYSB2ZWN0b3IgaW5zdGFuY2Ugd2lsbCB5aWVsZCBpdHMgY29tcG9uZW50cyBgKHgsIHkpYCBpblxyXG4gKiB0aGUgY29ycmVzcG9uZGluZyBvcmRlci5cclxuICogYGBganNcclxuICogY29uc3QgYSA9IG5ldyBUSFJFRS5WZWN0b3IyKCAwLCAxICk7XHJcbiAqXHJcbiAqIC8vbm8gYXJndW1lbnRzOyB3aWxsIGJlIGluaXRpYWxpc2VkIHRvICgwLCAwKVxyXG4gKiBjb25zdCBiID0gbmV3IFRIUkVFLlZlY3RvcjIoICk7XHJcbiAqXHJcbiAqIGNvbnN0IGQgPSBhLmRpc3RhbmNlVG8oIGIgKTtcclxuICogYGBgXHJcbiAqL1xyXG5jbGFzcyBWZWN0b3IyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyAyRCB2ZWN0b3IuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3g9MF0gLSBUaGUgeCB2YWx1ZSBvZiB0aGlzIHZlY3Rvci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3k9MF0gLSBUaGUgeSB2YWx1ZSBvZiB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggeCA9IDAsIHkgPSAwICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0VmVjdG9yMi5wcm90b3R5cGUuaXNWZWN0b3IyID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB4IHZhbHVlIG9mIHRoaXMgdmVjdG9yLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMueCA9IHg7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgeSB2YWx1ZSBvZiB0aGlzIHZlY3Rvci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnkgPSB5O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFsaWFzIGZvciB7QGxpbmsgVmVjdG9yMiN4fS5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0ICovXHJcblx0Z2V0IHdpZHRoKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLng7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0IHdpZHRoKCB2YWx1ZSApIHtcclxuXHJcblx0XHR0aGlzLnggPSB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBbGlhcyBmb3Ige0BsaW5rIFZlY3RvcjIjeX0uXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdCAqL1xyXG5cdGdldCBoZWlnaHQoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMueTtcclxuXHJcblx0fVxyXG5cclxuXHRzZXQgaGVpZ2h0KCB2YWx1ZSApIHtcclxuXHJcblx0XHR0aGlzLnkgPSB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB2ZWN0b3IgY29tcG9uZW50cy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHZhbHVlIG9mIHRoZSB4IGNvbXBvbmVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB2YWx1ZSBvZiB0aGUgeSBjb21wb25lbnQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0c2V0KCB4LCB5ICkge1xyXG5cclxuXHRcdHRoaXMueCA9IHg7XHJcblx0XHR0aGlzLnkgPSB5O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHZlY3RvciBjb21wb25lbnRzIHRvIHRoZSBzYW1lIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHNjYWxhciAtIFRoZSB2YWx1ZSB0byBzZXQgZm9yIGFsbCB2ZWN0b3IgY29tcG9uZW50cy5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRzZXRTY2FsYXIoIHNjYWxhciApIHtcclxuXHJcblx0XHR0aGlzLnggPSBzY2FsYXI7XHJcblx0XHR0aGlzLnkgPSBzY2FsYXI7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdmVjdG9yJ3MgeCBjb21wb25lbnQgdG8gdGhlIGdpdmVuIHZhbHVlXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB2YWx1ZSB0byBzZXQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0c2V0WCggeCApIHtcclxuXHJcblx0XHR0aGlzLnggPSB4O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHZlY3RvcidzIHkgY29tcG9uZW50IHRvIHRoZSBnaXZlbiB2YWx1ZVxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmFsdWUgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHNldFkoIHkgKSB7XHJcblxyXG5cdFx0dGhpcy55ID0geTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBbGxvd3MgdG8gc2V0IGEgdmVjdG9yIGNvbXBvbmVudCB3aXRoIGFuIGluZGV4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGNvbXBvbmVudCBpbmRleC4gYDBgIGVxdWFscyB0byB4LCBgMWAgZXF1YWxzIHRvIHkuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRzZXRDb21wb25lbnQoIGluZGV4LCB2YWx1ZSApIHtcclxuXHJcblx0XHRzd2l0Y2ggKCBpbmRleCApIHtcclxuXHJcblx0XHRcdGNhc2UgMDogdGhpcy54ID0gdmFsdWU7IGJyZWFrO1xyXG5cdFx0XHRjYXNlIDE6IHRoaXMueSA9IHZhbHVlOyBicmVhaztcclxuXHRcdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCAnaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAnICsgaW5kZXggKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHZlY3RvciBjb21wb25lbnQgd2hpY2ggbWF0Y2hlcyB0aGUgZ2l2ZW4gaW5kZXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgY29tcG9uZW50IGluZGV4LiBgMGAgZXF1YWxzIHRvIHgsIGAxYCBlcXVhbHMgdG8geS5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IEEgdmVjdG9yIGNvbXBvbmVudCB2YWx1ZS5cclxuXHQgKi9cclxuXHRnZXRDb21wb25lbnQoIGluZGV4ICkge1xyXG5cclxuXHRcdHN3aXRjaCAoIGluZGV4ICkge1xyXG5cclxuXHRcdFx0Y2FzZSAwOiByZXR1cm4gdGhpcy54O1xyXG5cdFx0XHRjYXNlIDE6IHJldHVybiB0aGlzLnk7XHJcblx0XHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvciggJ2luZGV4IGlzIG91dCBvZiByYW5nZTogJyArIGluZGV4ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBuZXcgdmVjdG9yIHdpdGggY29waWVkIHZhbHVlcyBmcm9tIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBBIGNsb25lIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y2xvbmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLngsIHRoaXMueSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvcGllcyB0aGUgdmFsdWVzIG9mIHRoZSBnaXZlbiB2ZWN0b3IgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gdiAtIFRoZSB2ZWN0b3IgdG8gY29weS5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRjb3B5KCB2ICkge1xyXG5cclxuXHRcdHRoaXMueCA9IHYueDtcclxuXHRcdHRoaXMueSA9IHYueTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIHRoZSBnaXZlbiB2ZWN0b3IgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gdiAtIFRoZSB2ZWN0b3IgdG8gYWRkLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGFkZCggdiApIHtcclxuXHJcblx0XHR0aGlzLnggKz0gdi54O1xyXG5cdFx0dGhpcy55ICs9IHYueTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIHRoZSBnaXZlbiBzY2FsYXIgdmFsdWUgdG8gYWxsIGNvbXBvbmVudHMgb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzIC0gVGhlIHNjYWxhciB0byBhZGQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0YWRkU2NhbGFyKCBzICkge1xyXG5cclxuXHRcdHRoaXMueCArPSBzO1xyXG5cdFx0dGhpcy55ICs9IHM7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyB0aGUgZ2l2ZW4gdmVjdG9ycyBhbmQgc3RvcmVzIHRoZSByZXN1bHQgaW4gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gYSAtIFRoZSBmaXJzdCB2ZWN0b3IuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSBiIC0gVGhlIHNlY29uZCB2ZWN0b3IuXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0YWRkVmVjdG9ycyggYSwgYiApIHtcclxuXHJcblx0XHR0aGlzLnggPSBhLnggKyBiLng7XHJcblx0XHR0aGlzLnkgPSBhLnkgKyBiLnk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyB0aGUgZ2l2ZW4gdmVjdG9yIHNjYWxlZCBieSB0aGUgZ2l2ZW4gZmFjdG9yIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IHYgLSBUaGUgdmVjdG9yLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzIC0gVGhlIGZhY3RvciB0aGF0IHNjYWxlcyBgdmAuXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0YWRkU2NhbGVkVmVjdG9yKCB2LCBzICkge1xyXG5cclxuXHRcdHRoaXMueCArPSB2LnggKiBzO1xyXG5cdFx0dGhpcy55ICs9IHYueSAqIHM7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3VidHJhY3RzIHRoZSBnaXZlbiB2ZWN0b3IgZnJvbSB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSB2IC0gVGhlIHZlY3RvciB0byBzdWJ0cmFjdC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRzdWIoIHYgKSB7XHJcblxyXG5cdFx0dGhpcy54IC09IHYueDtcclxuXHRcdHRoaXMueSAtPSB2Lnk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3VidHJhY3RzIHRoZSBnaXZlbiBzY2FsYXIgdmFsdWUgZnJvbSBhbGwgY29tcG9uZW50cyBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHMgLSBUaGUgc2NhbGFyIHRvIHN1YnRyYWN0LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHN1YlNjYWxhciggcyApIHtcclxuXHJcblx0XHR0aGlzLnggLT0gcztcclxuXHRcdHRoaXMueSAtPSBzO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFN1YnRyYWN0cyB0aGUgZ2l2ZW4gdmVjdG9ycyBhbmQgc3RvcmVzIHRoZSByZXN1bHQgaW4gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gYSAtIFRoZSBmaXJzdCB2ZWN0b3IuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSBiIC0gVGhlIHNlY29uZCB2ZWN0b3IuXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0c3ViVmVjdG9ycyggYSwgYiApIHtcclxuXHJcblx0XHR0aGlzLnggPSBhLnggLSBiLng7XHJcblx0XHR0aGlzLnkgPSBhLnkgLSBiLnk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTXVsdGlwbGllcyB0aGUgZ2l2ZW4gdmVjdG9yIHdpdGggdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gdiAtIFRoZSB2ZWN0b3IgdG8gbXVsdGlwbHkuXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0bXVsdGlwbHkoIHYgKSB7XHJcblxyXG5cdFx0dGhpcy54ICo9IHYueDtcclxuXHRcdHRoaXMueSAqPSB2Lnk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTXVsdGlwbGllcyB0aGUgZ2l2ZW4gc2NhbGFyIHZhbHVlIHdpdGggYWxsIGNvbXBvbmVudHMgb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzY2FsYXIgLSBUaGUgc2NhbGFyIHRvIG11bHRpcGx5LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdG11bHRpcGx5U2NhbGFyKCBzY2FsYXIgKSB7XHJcblxyXG5cdFx0dGhpcy54ICo9IHNjYWxhcjtcclxuXHRcdHRoaXMueSAqPSBzY2FsYXI7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGl2aWRlcyB0aGlzIGluc3RhbmNlIGJ5IHRoZSBnaXZlbiB2ZWN0b3IuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IHYgLSBUaGUgdmVjdG9yIHRvIGRpdmlkZS5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRkaXZpZGUoIHYgKSB7XHJcblxyXG5cdFx0dGhpcy54IC89IHYueDtcclxuXHRcdHRoaXMueSAvPSB2Lnk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGl2aWRlcyB0aGlzIHZlY3RvciBieSB0aGUgZ2l2ZW4gc2NhbGFyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHNjYWxhciAtIFRoZSBzY2FsYXIgdG8gZGl2aWRlLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGRpdmlkZVNjYWxhciggc2NhbGFyICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKCAxIC8gc2NhbGFyICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTXVsdGlwbGllcyB0aGlzIHZlY3RvciAod2l0aCBhbiBpbXBsaWNpdCAxIGFzIHRoZSAzcmQgY29tcG9uZW50KSBieVxyXG5cdCAqIHRoZSBnaXZlbiAzeDMgbWF0cml4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRyaXgzfSBtIC0gVGhlIG1hdHJpeCB0byBhcHBseS5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRhcHBseU1hdHJpeDMoIG0gKSB7XHJcblxyXG5cdFx0Y29uc3QgeCA9IHRoaXMueCwgeSA9IHRoaXMueTtcclxuXHRcdGNvbnN0IGUgPSBtLmVsZW1lbnRzO1xyXG5cclxuXHRcdHRoaXMueCA9IGVbIDAgXSAqIHggKyBlWyAzIF0gKiB5ICsgZVsgNiBdO1xyXG5cdFx0dGhpcy55ID0gZVsgMSBdICogeCArIGVbIDQgXSAqIHkgKyBlWyA3IF07XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSWYgdGhpcyB2ZWN0b3IncyB4IG9yIHkgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSBnaXZlbiB2ZWN0b3IncyB4IG9yIHlcclxuXHQgKiB2YWx1ZSwgcmVwbGFjZSB0aGF0IHZhbHVlIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgbWluIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSB2IC0gVGhlIHZlY3Rvci5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRtaW4oIHYgKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gTWF0aC5taW4oIHRoaXMueCwgdi54ICk7XHJcblx0XHR0aGlzLnkgPSBNYXRoLm1pbiggdGhpcy55LCB2LnkgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJZiB0aGlzIHZlY3RvcidzIHggb3IgeSB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIGdpdmVuIHZlY3RvcidzIHggb3IgeVxyXG5cdCAqIHZhbHVlLCByZXBsYWNlIHRoYXQgdmFsdWUgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBtYXggdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IHYgLSBUaGUgdmVjdG9yLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdG1heCggdiApIHtcclxuXHJcblx0XHR0aGlzLnggPSBNYXRoLm1heCggdGhpcy54LCB2LnggKTtcclxuXHRcdHRoaXMueSA9IE1hdGgubWF4KCB0aGlzLnksIHYueSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIElmIHRoaXMgdmVjdG9yJ3MgeCBvciB5IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4IHZlY3RvcidzIHggb3IgeVxyXG5cdCAqIHZhbHVlLCBpdCBpcyByZXBsYWNlZCBieSB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZS5cclxuXHQgKiBJZiB0aGlzIHZlY3RvcidzIHggb3IgeSB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIG1pbiB2ZWN0b3IncyB4IG9yIHkgdmFsdWUsXHJcblx0ICogaXQgaXMgcmVwbGFjZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IG1pbiAtIFRoZSBtaW5pbXVtIHggYW5kIHkgdmFsdWVzLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gbWF4IC0gVGhlIG1heGltdW0geCBhbmQgeSB2YWx1ZXMgaW4gdGhlIGRlc2lyZWQgcmFuZ2UuXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0Y2xhbXAoIG1pbiwgbWF4ICkge1xyXG5cclxuXHRcdC8vIGFzc3VtZXMgbWluIDwgbWF4LCBjb21wb25lbnR3aXNlXHJcblxyXG5cdFx0dGhpcy54ID0gY2xhbXAoIHRoaXMueCwgbWluLngsIG1heC54ICk7XHJcblx0XHR0aGlzLnkgPSBjbGFtcCggdGhpcy55LCBtaW4ueSwgbWF4LnkgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJZiB0aGlzIHZlY3RvcidzIHggb3IgeSB2YWx1ZXMgYXJlIGdyZWF0ZXIgdGhhbiB0aGUgbWF4IHZhbHVlLCB0aGV5IGFyZVxyXG5cdCAqIHJlcGxhY2VkIGJ5IHRoZSBtYXggdmFsdWUuXHJcblx0ICogSWYgdGhpcyB2ZWN0b3IncyB4IG9yIHkgdmFsdWVzIGFyZSBsZXNzIHRoYW4gdGhlIG1pbiB2YWx1ZSwgdGhleSBhcmVcclxuXHQgKiByZXBsYWNlZCBieSB0aGUgbWluIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IG1pblZhbCAtIFRoZSBtaW5pbXVtIHZhbHVlIHRoZSBjb21wb25lbnRzIHdpbGwgYmUgY2xhbXBlZCB0by5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbWF4VmFsIC0gVGhlIG1heGltdW0gdmFsdWUgdGhlIGNvbXBvbmVudHMgd2lsbCBiZSBjbGFtcGVkIHRvLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGNsYW1wU2NhbGFyKCBtaW5WYWwsIG1heFZhbCApIHtcclxuXHJcblx0XHR0aGlzLnggPSBjbGFtcCggdGhpcy54LCBtaW5WYWwsIG1heFZhbCApO1xyXG5cdFx0dGhpcy55ID0gY2xhbXAoIHRoaXMueSwgbWluVmFsLCBtYXhWYWwgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJZiB0aGlzIHZlY3RvcidzIGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gdGhlIG1heCB2YWx1ZSwgaXQgaXMgcmVwbGFjZWQgYnlcclxuXHQgKiB0aGUgbWF4IHZhbHVlLlxyXG5cdCAqIElmIHRoaXMgdmVjdG9yJ3MgbGVuZ3RoIGlzIGxlc3MgdGhhbiB0aGUgbWluIHZhbHVlLCBpdCBpcyByZXBsYWNlZCBieSB0aGVcclxuXHQgKiBtaW4gdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbWluIC0gVGhlIG1pbmltdW0gdmFsdWUgdGhlIHZlY3RvciBsZW5ndGggd2lsbCBiZSBjbGFtcGVkIHRvLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBtYXggLSBUaGUgbWF4aW11bSB2YWx1ZSB0aGUgdmVjdG9yIGxlbmd0aCB3aWxsIGJlIGNsYW1wZWQgdG8uXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0Y2xhbXBMZW5ndGgoIG1pbiwgbWF4ICkge1xyXG5cclxuXHRcdGNvbnN0IGxlbmd0aCA9IHRoaXMubGVuZ3RoKCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKCBsZW5ndGggfHwgMSApLm11bHRpcGx5U2NhbGFyKCBjbGFtcCggbGVuZ3RoLCBtaW4sIG1heCApICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGNvbXBvbmVudHMgb2YgdGhpcyB2ZWN0b3IgYXJlIHJvdW5kZWQgZG93biB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0Zmxvb3IoKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gTWF0aC5mbG9vciggdGhpcy54ICk7XHJcblx0XHR0aGlzLnkgPSBNYXRoLmZsb29yKCB0aGlzLnkgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgY29tcG9uZW50cyBvZiB0aGlzIHZlY3RvciBhcmUgcm91bmRlZCB1cCB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0Y2VpbCgpIHtcclxuXHJcblx0XHR0aGlzLnggPSBNYXRoLmNlaWwoIHRoaXMueCApO1xyXG5cdFx0dGhpcy55ID0gTWF0aC5jZWlsKCB0aGlzLnkgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgY29tcG9uZW50cyBvZiB0aGlzIHZlY3RvciBhcmUgcm91bmRlZCB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyIHZhbHVlXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRyb3VuZCgpIHtcclxuXHJcblx0XHR0aGlzLnggPSBNYXRoLnJvdW5kKCB0aGlzLnggKTtcclxuXHRcdHRoaXMueSA9IE1hdGgucm91bmQoIHRoaXMueSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBjb21wb25lbnRzIG9mIHRoaXMgdmVjdG9yIGFyZSByb3VuZGVkIHRvd2FyZHMgemVybyAodXAgaWYgbmVnYXRpdmUsXHJcblx0ICogZG93biBpZiBwb3NpdGl2ZSkgdG8gYW4gaW50ZWdlciB2YWx1ZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHJvdW5kVG9aZXJvKCkge1xyXG5cclxuXHRcdHRoaXMueCA9IE1hdGgudHJ1bmMoIHRoaXMueCApO1xyXG5cdFx0dGhpcy55ID0gTWF0aC50cnVuYyggdGhpcy55ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW52ZXJ0cyB0aGlzIHZlY3RvciAtIGkuZS4gc2V0cyB4ID0gLXggYW5kIHkgPSAteS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdG5lZ2F0ZSgpIHtcclxuXHJcblx0XHR0aGlzLnggPSAtIHRoaXMueDtcclxuXHRcdHRoaXMueSA9IC0gdGhpcy55O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENhbGN1bGF0ZXMgdGhlIGRvdCBwcm9kdWN0IG9mIHRoZSBnaXZlbiB2ZWN0b3Igd2l0aCB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSB2IC0gVGhlIHZlY3RvciB0byBjb21wdXRlIHRoZSBkb3QgcHJvZHVjdCB3aXRoLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIHJlc3VsdCBvZiB0aGUgZG90IHByb2R1Y3QuXHJcblx0ICovXHJcblx0ZG90KCB2ICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnggKiB2LnggKyB0aGlzLnkgKiB2Lnk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2FsY3VsYXRlcyB0aGUgY3Jvc3MgcHJvZHVjdCBvZiB0aGUgZ2l2ZW4gdmVjdG9yIHdpdGggdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gdiAtIFRoZSB2ZWN0b3IgdG8gY29tcHV0ZSB0aGUgY3Jvc3MgcHJvZHVjdCB3aXRoLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIHJlc3VsdCBvZiB0aGUgY3Jvc3MgcHJvZHVjdC5cclxuXHQgKi9cclxuXHRjcm9zcyggdiApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy54ICogdi55IC0gdGhpcy55ICogdi54O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSBzcXVhcmUgb2YgdGhlIEV1Y2xpZGVhbiBsZW5ndGggKHN0cmFpZ2h0LWxpbmUgbGVuZ3RoKSBmcm9tXHJcblx0ICogKDAsIDApIHRvICh4LCB5KS4gSWYgeW91IGFyZSBjb21wYXJpbmcgdGhlIGxlbmd0aHMgb2YgdmVjdG9ycywgeW91IHNob3VsZFxyXG5cdCAqIGNvbXBhcmUgdGhlIGxlbmd0aCBzcXVhcmVkIGluc3RlYWQgYXMgaXQgaXMgc2xpZ2h0bHkgbW9yZSBlZmZpY2llbnQgdG8gY2FsY3VsYXRlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgc3F1YXJlIGxlbmd0aCBvZiB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRsZW5ndGhTcSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSAgRXVjbGlkZWFuIGxlbmd0aCAoc3RyYWlnaHQtbGluZSBsZW5ndGgpIGZyb20gKDAsIDApIHRvICh4LCB5KS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGxlbmd0aCBvZiB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRsZW5ndGgoKSB7XHJcblxyXG5cdFx0cmV0dXJuIE1hdGguc3FydCggdGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgdGhlIE1hbmhhdHRhbiBsZW5ndGggb2YgdGhpcyB2ZWN0b3IuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBsZW5ndGggb2YgdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0bWFuaGF0dGFuTGVuZ3RoKCkge1xyXG5cclxuXHRcdHJldHVybiBNYXRoLmFicyggdGhpcy54ICkgKyBNYXRoLmFicyggdGhpcy55ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29udmVydHMgdGhpcyB2ZWN0b3IgdG8gYSB1bml0IHZlY3RvciAtIHRoYXQgaXMsIHNldHMgaXQgZXF1YWwgdG8gYSB2ZWN0b3JcclxuXHQgKiB3aXRoIHRoZSBzYW1lIGRpcmVjdGlvbiBhcyB0aGlzIG9uZSwgYnV0IHdpdGggYSB2ZWN0b3IgbGVuZ3RoIG9mIGAxYC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdG5vcm1hbGl6ZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoIHRoaXMubGVuZ3RoKCkgfHwgMSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSBhbmdsZSBpbiByYWRpYW5zIG9mIHRoaXMgdmVjdG9yIHdpdGggcmVzcGVjdCB0byB0aGUgcG9zaXRpdmUgeC1heGlzLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgYW5nbGUgaW4gcmFkaWFucy5cclxuXHQgKi9cclxuXHRhbmdsZSgpIHtcclxuXHJcblx0XHRjb25zdCBhbmdsZSA9IE1hdGguYXRhbjIoIC0gdGhpcy55LCAtIHRoaXMueCApICsgTWF0aC5QSTtcclxuXHJcblx0XHRyZXR1cm4gYW5nbGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgYW5nbGUgYmV0d2VlbiB0aGUgZ2l2ZW4gdmVjdG9yIGFuZCB0aGlzIGluc3RhbmNlIGluIHJhZGlhbnMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IHYgLSBUaGUgdmVjdG9yIHRvIGNvbXB1dGUgdGhlIGFuZ2xlIHdpdGguXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgYW5nbGUgaW4gcmFkaWFucy5cclxuXHQgKi9cclxuXHRhbmdsZVRvKCB2ICkge1xyXG5cclxuXHRcdGNvbnN0IGRlbm9taW5hdG9yID0gTWF0aC5zcXJ0KCB0aGlzLmxlbmd0aFNxKCkgKiB2Lmxlbmd0aFNxKCkgKTtcclxuXHJcblx0XHRpZiAoIGRlbm9taW5hdG9yID09PSAwICkgcmV0dXJuIE1hdGguUEkgLyAyO1xyXG5cclxuXHRcdGNvbnN0IHRoZXRhID0gdGhpcy5kb3QoIHYgKSAvIGRlbm9taW5hdG9yO1xyXG5cclxuXHRcdC8vIGNsYW1wLCB0byBoYW5kbGUgbnVtZXJpY2FsIHByb2JsZW1zXHJcblxyXG5cdFx0cmV0dXJuIE1hdGguYWNvcyggY2xhbXAoIHRoZXRhLCAtIDEsIDEgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBnaXZlbiB2ZWN0b3IgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gdiAtIFRoZSB2ZWN0b3IgdG8gY29tcHV0ZSB0aGUgZGlzdGFuY2UgdG8uXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgZGlzdGFuY2UuXHJcblx0ICovXHJcblx0ZGlzdGFuY2VUbyggdiApIHtcclxuXHJcblx0XHRyZXR1cm4gTWF0aC5zcXJ0KCB0aGlzLmRpc3RhbmNlVG9TcXVhcmVkKCB2ICkgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB0aGUgc3F1YXJlZCBkaXN0YW5jZSBmcm9tIHRoZSBnaXZlbiB2ZWN0b3IgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKiBJZiB5b3UgYXJlIGp1c3QgY29tcGFyaW5nIHRoZSBkaXN0YW5jZSB3aXRoIGFub3RoZXIgZGlzdGFuY2UsIHlvdSBzaG91bGQgY29tcGFyZVxyXG5cdCAqIHRoZSBkaXN0YW5jZSBzcXVhcmVkIGluc3RlYWQgYXMgaXQgaXMgc2xpZ2h0bHkgbW9yZSBlZmZpY2llbnQgdG8gY2FsY3VsYXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSB2IC0gVGhlIHZlY3RvciB0byBjb21wdXRlIHRoZSBzcXVhcmVkIGRpc3RhbmNlIHRvLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIHNxdWFyZWQgZGlzdGFuY2UuXHJcblx0ICovXHJcblx0ZGlzdGFuY2VUb1NxdWFyZWQoIHYgKSB7XHJcblxyXG5cdFx0Y29uc3QgZHggPSB0aGlzLnggLSB2LngsIGR5ID0gdGhpcy55IC0gdi55O1xyXG5cdFx0cmV0dXJuIGR4ICogZHggKyBkeSAqIGR5O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSBNYW5oYXR0YW4gZGlzdGFuY2UgZnJvbSB0aGUgZ2l2ZW4gdmVjdG9yIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IHYgLSBUaGUgdmVjdG9yIHRvIGNvbXB1dGUgdGhlIE1hbmhhdHRhbiBkaXN0YW5jZSB0by5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBNYW5oYXR0YW4gZGlzdGFuY2UuXHJcblx0ICovXHJcblx0bWFuaGF0dGFuRGlzdGFuY2VUbyggdiApIHtcclxuXHJcblx0XHRyZXR1cm4gTWF0aC5hYnMoIHRoaXMueCAtIHYueCApICsgTWF0aC5hYnMoIHRoaXMueSAtIHYueSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhpcyB2ZWN0b3IgdG8gYSB2ZWN0b3Igd2l0aCB0aGUgc2FtZSBkaXJlY3Rpb24gYXMgdGhpcyBvbmUsIGJ1dFxyXG5cdCAqIHdpdGggdGhlIHNwZWNpZmllZCBsZW5ndGguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIC0gVGhlIG5ldyBsZW5ndGggb2YgdGhpcyB2ZWN0b3IuXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0c2V0TGVuZ3RoKCBsZW5ndGggKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoIGxlbmd0aCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIExpbmVhcmx5IGludGVycG9sYXRlcyBiZXR3ZWVuIHRoZSBnaXZlbiB2ZWN0b3IgYW5kIHRoaXMgaW5zdGFuY2UsIHdoZXJlXHJcblx0ICogYWxwaGEgaXMgdGhlIHBlcmNlbnQgZGlzdGFuY2UgYWxvbmcgdGhlIGxpbmUgLSBhbHBoYSA9IDAgd2lsbCBiZSB0aGlzXHJcblx0ICogdmVjdG9yLCBhbmQgYWxwaGEgPSAxIHdpbGwgYmUgdGhlIGdpdmVuIG9uZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gdiAtIFRoZSB2ZWN0b3IgdG8gaW50ZXJwb2xhdGUgdG93YXJkcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYWxwaGEgLSBUaGUgaW50ZXJwb2xhdGlvbiBmYWN0b3IsIHR5cGljYWxseSBpbiB0aGUgY2xvc2VkIGludGVydmFsIGBbMCwgMV1gLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGxlcnAoIHYsIGFscGhhICkge1xyXG5cclxuXHRcdHRoaXMueCArPSAoIHYueCAtIHRoaXMueCApICogYWxwaGE7XHJcblx0XHR0aGlzLnkgKz0gKCB2LnkgLSB0aGlzLnkgKSAqIGFscGhhO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIExpbmVhcmx5IGludGVycG9sYXRlcyBiZXR3ZWVuIHRoZSBnaXZlbiB2ZWN0b3JzLCB3aGVyZSBhbHBoYSBpcyB0aGUgcGVyY2VudFxyXG5cdCAqIGRpc3RhbmNlIGFsb25nIHRoZSBsaW5lIC0gYWxwaGEgPSAwIHdpbGwgYmUgZmlyc3QgdmVjdG9yLCBhbmQgYWxwaGEgPSAxIHdpbGxcclxuXHQgKiBiZSB0aGUgc2Vjb25kIG9uZS4gVGhlIHJlc3VsdCBpcyBzdG9yZWQgaW4gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gdjEgLSBUaGUgZmlyc3QgdmVjdG9yLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gdjIgLSBUaGUgc2Vjb25kIHZlY3Rvci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYWxwaGEgLSBUaGUgaW50ZXJwb2xhdGlvbiBmYWN0b3IsIHR5cGljYWxseSBpbiB0aGUgY2xvc2VkIGludGVydmFsIGBbMCwgMV1gLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGxlcnBWZWN0b3JzKCB2MSwgdjIsIGFscGhhICkge1xyXG5cclxuXHRcdHRoaXMueCA9IHYxLnggKyAoIHYyLnggLSB2MS54ICkgKiBhbHBoYTtcclxuXHRcdHRoaXMueSA9IHYxLnkgKyAoIHYyLnkgLSB2MS55ICkgKiBhbHBoYTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIHZlY3RvciBpcyBlcXVhbCB3aXRoIHRoZSBnaXZlbiBvbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IHYgLSBUaGUgdmVjdG9yIHRvIHRlc3QgZm9yIGVxdWFsaXR5LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyB2ZWN0b3IgaXMgZXF1YWwgd2l0aCB0aGUgZ2l2ZW4gb25lLlxyXG5cdCAqL1xyXG5cdGVxdWFscyggdiApIHtcclxuXHJcblx0XHRyZXR1cm4gKCAoIHYueCA9PT0gdGhpcy54ICkgJiYgKCB2LnkgPT09IHRoaXMueSApICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGlzIHZlY3RvcidzIHggdmFsdWUgdG8gYmUgYGFycmF5WyBvZmZzZXQgXWAgYW5kIHlcclxuXHQgKiB2YWx1ZSB0byBiZSBgYXJyYXlbIG9mZnNldCArIDEgXWAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IGFycmF5IC0gQW4gYXJyYXkgaG9sZGluZyB0aGUgdmVjdG9yIGNvbXBvbmVudCB2YWx1ZXMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXQ9MF0gLSBUaGUgb2Zmc2V0IGludG8gdGhlIGFycmF5LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGZyb21BcnJheSggYXJyYXksIG9mZnNldCA9IDAgKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gYXJyYXlbIG9mZnNldCBdO1xyXG5cdFx0dGhpcy55ID0gYXJyYXlbIG9mZnNldCArIDEgXTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBXcml0ZXMgdGhlIGNvbXBvbmVudHMgb2YgdGhpcyB2ZWN0b3IgdG8gdGhlIGdpdmVuIGFycmF5LiBJZiBubyBhcnJheSBpcyBwcm92aWRlZCxcclxuXHQgKiB0aGUgbWV0aG9kIHJldHVybnMgYSBuZXcgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IFthcnJheT1bXV0gLSBUaGUgdGFyZ2V0IGFycmF5IGhvbGRpbmcgdGhlIHZlY3RvciBjb21wb25lbnRzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0PTBdIC0gSW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGFycmF5LlxyXG5cdCAqIEByZXR1cm4ge0FycmF5PG51bWJlcj59IFRoZSB2ZWN0b3IgY29tcG9uZW50cy5cclxuXHQgKi9cclxuXHR0b0FycmF5KCBhcnJheSA9IFtdLCBvZmZzZXQgPSAwICkge1xyXG5cclxuXHRcdGFycmF5WyBvZmZzZXQgXSA9IHRoaXMueDtcclxuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLnk7XHJcblxyXG5cdFx0cmV0dXJuIGFycmF5O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGNvbXBvbmVudHMgb2YgdGhpcyB2ZWN0b3IgZnJvbSB0aGUgZ2l2ZW4gYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyQXR0cmlidXRlfSBhdHRyaWJ1dGUgLSBUaGUgYnVmZmVyIGF0dHJpYnV0ZSBob2xkaW5nIHZlY3RvciBkYXRhLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBpbnRvIHRoZSBhdHRyaWJ1dGUuXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0ZnJvbUJ1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlLCBpbmRleCApIHtcclxuXHJcblx0XHR0aGlzLnggPSBhdHRyaWJ1dGUuZ2V0WCggaW5kZXggKTtcclxuXHRcdHRoaXMueSA9IGF0dHJpYnV0ZS5nZXRZKCBpbmRleCApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJvdGF0ZXMgdGhpcyB2ZWN0b3IgYXJvdW5kIHRoZSBnaXZlbiBjZW50ZXIgYnkgdGhlIGdpdmVuIGFuZ2xlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSBjZW50ZXIgLSBUaGUgcG9pbnQgYXJvdW5kIHdoaWNoIHRvIHJvdGF0ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYW5nbGUgLSBUaGUgYW5nbGUgdG8gcm90YXRlLCBpbiByYWRpYW5zLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHJvdGF0ZUFyb3VuZCggY2VudGVyLCBhbmdsZSApIHtcclxuXHJcblx0XHRjb25zdCBjID0gTWF0aC5jb3MoIGFuZ2xlICksIHMgPSBNYXRoLnNpbiggYW5nbGUgKTtcclxuXHJcblx0XHRjb25zdCB4ID0gdGhpcy54IC0gY2VudGVyLng7XHJcblx0XHRjb25zdCB5ID0gdGhpcy55IC0gY2VudGVyLnk7XHJcblxyXG5cdFx0dGhpcy54ID0geCAqIGMgLSB5ICogcyArIGNlbnRlci54O1xyXG5cdFx0dGhpcy55ID0geCAqIHMgKyB5ICogYyArIGNlbnRlci55O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgZWFjaCBjb21wb25lbnQgb2YgdGhpcyB2ZWN0b3IgdG8gYSBwc2V1ZG8tcmFuZG9tIHZhbHVlIGJldHdlZW4gYDBgIGFuZFxyXG5cdCAqIGAxYCwgZXhjbHVkaW5nIGAxYC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHJhbmRvbSgpIHtcclxuXHJcblx0XHR0aGlzLnggPSBNYXRoLnJhbmRvbSgpO1xyXG5cdFx0dGhpcy55ID0gTWF0aC5yYW5kb20oKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQqWyBTeW1ib2wuaXRlcmF0b3IgXSgpIHtcclxuXHJcblx0XHR5aWVsZCB0aGlzLng7XHJcblx0XHR5aWVsZCB0aGlzLnk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFZlY3RvcjIgfTtcclxuIiwiLyoqXHJcbiAqIFJlcHJlc2VudHMgYSAzeDMgbWF0cml4LlxyXG4gKlxyXG4gKiBBIE5vdGUgb24gUm93LU1ham9yIGFuZCBDb2x1bW4tTWFqb3IgT3JkZXJpbmc6XHJcbiAqXHJcbiAqIFRoZSBjb25zdHJ1Y3RvciBhbmQge0BsaW5rIE1hdHJpeDMjc2V0fSBtZXRob2QgdGFrZSBhcmd1bWVudHMgaW5cclxuICogW3Jvdy1tYWpvcl17QGxpbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUm93LV9hbmRfY29sdW1uLW1ham9yX29yZGVyI0NvbHVtbi1tYWpvcl9vcmRlcn1cclxuICogb3JkZXIsIHdoaWxlIGludGVybmFsbHkgdGhleSBhcmUgc3RvcmVkIGluIHRoZSB7QGxpbmsgTWF0cml4MyNlbGVtZW50c30gYXJyYXkgaW4gY29sdW1uLW1ham9yIG9yZGVyLlxyXG4gKiBUaGlzIG1lYW5zIHRoYXQgY2FsbGluZzpcclxuICogYGBganNcclxuICogY29uc3QgbSA9IG5ldyBUSFJFRS5NYXRyaXgoKTtcclxuICogbS5zZXQoIDExLCAxMiwgMTMsXHJcbiAqICAgICAgICAyMSwgMjIsIDIzLFxyXG4gKiAgICAgICAgMzEsIDMyLCAzMyApO1xyXG4gKiBgYGBcclxuICogd2lsbCByZXN1bHQgaW4gdGhlIGVsZW1lbnRzIGFycmF5IGNvbnRhaW5pbmc6XHJcbiAqIGBgYGpzXHJcbiAqIG0uZWxlbWVudHMgPSBbIDExLCAyMSwgMzEsXHJcbiAqICAgICAgICAgICAgICAgIDEyLCAyMiwgMzIsXHJcbiAqICAgICAgICAgICAgICAgIDEzLCAyMywgMzMgXTtcclxuICogYGBgXHJcbiAqIGFuZCBpbnRlcm5hbGx5IGFsbCBjYWxjdWxhdGlvbnMgYXJlIHBlcmZvcm1lZCB1c2luZyBjb2x1bW4tbWFqb3Igb3JkZXJpbmcuXHJcbiAqIEhvd2V2ZXIsIGFzIHRoZSBhY3R1YWwgb3JkZXJpbmcgbWFrZXMgbm8gZGlmZmVyZW5jZSBtYXRoZW1hdGljYWxseSBhbmRcclxuICogbW9zdCBwZW9wbGUgYXJlIHVzZWQgdG8gdGhpbmtpbmcgYWJvdXQgbWF0cmljZXMgaW4gcm93LW1ham9yIG9yZGVyLCB0aGVcclxuICogdGhyZWUuanMgZG9jdW1lbnRhdGlvbiBzaG93cyBtYXRyaWNlcyBpbiByb3ctbWFqb3Igb3JkZXIuIEp1c3QgYmVhciBpblxyXG4gKiBtaW5kIHRoYXQgaWYgeW91IGFyZSByZWFkaW5nIHRoZSBzb3VyY2UgY29kZSwgeW91J2xsIGhhdmUgdG8gdGFrZSB0aGVcclxuICogdHJhbnNwb3NlIG9mIGFueSBtYXRyaWNlcyBvdXRsaW5lZCBoZXJlIHRvIG1ha2Ugc2Vuc2Ugb2YgdGhlIGNhbGN1bGF0aW9ucy5cclxuICovXHJcbmNsYXNzIE1hdHJpeDMge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IDN4MyBtYXRyaXguIFRoZSBhcmd1bWVudHMgYXJlIHN1cHBvc2VkIHRvIGJlXHJcblx0ICogaW4gcm93LW1ham9yIG9yZGVyLiBJZiBubyBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLCB0aGUgY29uc3RydWN0b3JcclxuXHQgKiBpbml0aWFsaXplcyB0aGUgbWF0cml4IGFzIGFuIGlkZW50aXR5IG1hdHJpeC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjExXSAtIDEtMSBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW24xMl0gLSAxLTIgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuMTNdIC0gMS0zIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjIxXSAtIDItMSBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW24yMl0gLSAyLTIgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuMjNdIC0gMi0zIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjMxXSAtIDMtMSBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW24zMl0gLSAzLTIgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuMzNdIC0gMy0zIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBuMTEsIG4xMiwgbjEzLCBuMjEsIG4yMiwgbjIzLCBuMzEsIG4zMiwgbjMzICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0TWF0cml4My5wcm90b3R5cGUuaXNNYXRyaXgzID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgY29sdW1uLW1ham9yIGxpc3Qgb2YgbWF0cml4IHZhbHVlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8bnVtYmVyPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5lbGVtZW50cyA9IFtcclxuXHJcblx0XHRcdDEsIDAsIDAsXHJcblx0XHRcdDAsIDEsIDAsXHJcblx0XHRcdDAsIDAsIDFcclxuXHJcblx0XHRdO1xyXG5cclxuXHRcdGlmICggbjExICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnNldCggbjExLCBuMTIsIG4xMywgbjIxLCBuMjIsIG4yMywgbjMxLCBuMzIsIG4zMyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBlbGVtZW50cyBvZiB0aGUgbWF0cml4LlRoZSBhcmd1bWVudHMgYXJlIHN1cHBvc2VkIHRvIGJlXHJcblx0ICogaW4gcm93LW1ham9yIG9yZGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuMTFdIC0gMS0xIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjEyXSAtIDEtMiBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW24xM10gLSAxLTMgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuMjFdIC0gMi0xIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjIyXSAtIDItMiBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW24yM10gLSAyLTMgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuMzFdIC0gMy0xIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjMyXSAtIDMtMiBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW24zM10gLSAzLTMgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHJldHVybiB7TWF0cml4M30gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0c2V0KCBuMTEsIG4xMiwgbjEzLCBuMjEsIG4yMiwgbjIzLCBuMzEsIG4zMiwgbjMzICkge1xyXG5cclxuXHRcdGNvbnN0IHRlID0gdGhpcy5lbGVtZW50cztcclxuXHJcblx0XHR0ZVsgMCBdID0gbjExOyB0ZVsgMSBdID0gbjIxOyB0ZVsgMiBdID0gbjMxO1xyXG5cdFx0dGVbIDMgXSA9IG4xMjsgdGVbIDQgXSA9IG4yMjsgdGVbIDUgXSA9IG4zMjtcclxuXHRcdHRlWyA2IF0gPSBuMTM7IHRlWyA3IF0gPSBuMjM7IHRlWyA4IF0gPSBuMzM7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGlzIG1hdHJpeCB0byB0aGUgM3gzIGlkZW50aXR5IG1hdHJpeC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdGlkZW50aXR5KCkge1xyXG5cclxuXHRcdHRoaXMuc2V0KFxyXG5cclxuXHRcdFx0MSwgMCwgMCxcclxuXHRcdFx0MCwgMSwgMCxcclxuXHRcdFx0MCwgMCwgMVxyXG5cclxuXHRcdCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29waWVzIHRoZSB2YWx1ZXMgb2YgdGhlIGdpdmVuIG1hdHJpeCB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRyaXgzfSBtIC0gVGhlIG1hdHJpeCB0byBjb3B5LlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdGNvcHkoIG0gKSB7XHJcblxyXG5cdFx0Y29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzO1xyXG5cdFx0Y29uc3QgbWUgPSBtLmVsZW1lbnRzO1xyXG5cclxuXHRcdHRlWyAwIF0gPSBtZVsgMCBdOyB0ZVsgMSBdID0gbWVbIDEgXTsgdGVbIDIgXSA9IG1lWyAyIF07XHJcblx0XHR0ZVsgMyBdID0gbWVbIDMgXTsgdGVbIDQgXSA9IG1lWyA0IF07IHRlWyA1IF0gPSBtZVsgNSBdO1xyXG5cdFx0dGVbIDYgXSA9IG1lWyA2IF07IHRlWyA3IF0gPSBtZVsgNyBdOyB0ZVsgOCBdID0gbWVbIDggXTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFeHRyYWN0cyB0aGUgYmFzaXMgb2YgdGhpcyBtYXRyaXggaW50byB0aGUgdGhyZWUgYXhpcyB2ZWN0b3JzIHByb3ZpZGVkLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB4QXhpcyAtIFRoZSBiYXNpcydzIHggYXhpcy5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHlBeGlzIC0gVGhlIGJhc2lzJ3MgeSBheGlzLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gekF4aXMgLSBUaGUgYmFzaXMncyB6IGF4aXMuXHJcblx0ICogQHJldHVybiB7TWF0cml4M30gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0ZXh0cmFjdEJhc2lzKCB4QXhpcywgeUF4aXMsIHpBeGlzICkge1xyXG5cclxuXHRcdHhBeGlzLnNldEZyb21NYXRyaXgzQ29sdW1uKCB0aGlzLCAwICk7XHJcblx0XHR5QXhpcy5zZXRGcm9tTWF0cml4M0NvbHVtbiggdGhpcywgMSApO1xyXG5cdFx0ekF4aXMuc2V0RnJvbU1hdHJpeDNDb2x1bW4oIHRoaXMsIDIgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXQgdGhpcyBtYXRyaXggdG8gdGhlIHVwcGVyIDN4MyBtYXRyaXggb2YgdGhlIGdpdmVuIDR4NCBtYXRyaXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDR9IG0gLSBUaGUgNHg0IG1hdHJpeC5cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXgzfSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRzZXRGcm9tTWF0cml4NCggbSApIHtcclxuXHJcblx0XHRjb25zdCBtZSA9IG0uZWxlbWVudHM7XHJcblxyXG5cdFx0dGhpcy5zZXQoXHJcblxyXG5cdFx0XHRtZVsgMCBdLCBtZVsgNCBdLCBtZVsgOCBdLFxyXG5cdFx0XHRtZVsgMSBdLCBtZVsgNSBdLCBtZVsgOSBdLFxyXG5cdFx0XHRtZVsgMiBdLCBtZVsgNiBdLCBtZVsgMTAgXVxyXG5cclxuXHRcdCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUG9zdC1tdWx0aXBsaWVzIHRoaXMgbWF0cml4IGJ5IHRoZSBnaXZlbiAzeDMgbWF0cml4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRyaXgzfSBtIC0gVGhlIG1hdHJpeCB0byBtdWx0aXBseSB3aXRoLlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdG11bHRpcGx5KCBtICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXMoIHRoaXMsIG0gKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQcmUtbXVsdGlwbGllcyB0aGlzIG1hdHJpeCBieSB0aGUgZ2l2ZW4gM3gzIG1hdHJpeC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4M30gbSAtIFRoZSBtYXRyaXggdG8gbXVsdGlwbHkgd2l0aC5cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXgzfSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRwcmVtdWx0aXBseSggbSApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKCBtLCB0aGlzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTXVsdGlwbGVzIHRoZSBnaXZlbiAzeDMgbWF0cmljZXMgYW5kIHN0b3JlcyB0aGUgcmVzdWx0XHJcblx0ICogaW4gdGhpcyBtYXRyaXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDN9IGEgLSBUaGUgZmlyc3QgbWF0cml4LlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4M30gYiAtIFRoZSBzZWNvbmQgbWF0cml4LlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdG11bHRpcGx5TWF0cmljZXMoIGEsIGIgKSB7XHJcblxyXG5cdFx0Y29uc3QgYWUgPSBhLmVsZW1lbnRzO1xyXG5cdFx0Y29uc3QgYmUgPSBiLmVsZW1lbnRzO1xyXG5cdFx0Y29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzO1xyXG5cclxuXHRcdGNvbnN0IGExMSA9IGFlWyAwIF0sIGExMiA9IGFlWyAzIF0sIGExMyA9IGFlWyA2IF07XHJcblx0XHRjb25zdCBhMjEgPSBhZVsgMSBdLCBhMjIgPSBhZVsgNCBdLCBhMjMgPSBhZVsgNyBdO1xyXG5cdFx0Y29uc3QgYTMxID0gYWVbIDIgXSwgYTMyID0gYWVbIDUgXSwgYTMzID0gYWVbIDggXTtcclxuXHJcblx0XHRjb25zdCBiMTEgPSBiZVsgMCBdLCBiMTIgPSBiZVsgMyBdLCBiMTMgPSBiZVsgNiBdO1xyXG5cdFx0Y29uc3QgYjIxID0gYmVbIDEgXSwgYjIyID0gYmVbIDQgXSwgYjIzID0gYmVbIDcgXTtcclxuXHRcdGNvbnN0IGIzMSA9IGJlWyAyIF0sIGIzMiA9IGJlWyA1IF0sIGIzMyA9IGJlWyA4IF07XHJcblxyXG5cdFx0dGVbIDAgXSA9IGExMSAqIGIxMSArIGExMiAqIGIyMSArIGExMyAqIGIzMTtcclxuXHRcdHRlWyAzIF0gPSBhMTEgKiBiMTIgKyBhMTIgKiBiMjIgKyBhMTMgKiBiMzI7XHJcblx0XHR0ZVsgNiBdID0gYTExICogYjEzICsgYTEyICogYjIzICsgYTEzICogYjMzO1xyXG5cclxuXHRcdHRlWyAxIF0gPSBhMjEgKiBiMTEgKyBhMjIgKiBiMjEgKyBhMjMgKiBiMzE7XHJcblx0XHR0ZVsgNCBdID0gYTIxICogYjEyICsgYTIyICogYjIyICsgYTIzICogYjMyO1xyXG5cdFx0dGVbIDcgXSA9IGEyMSAqIGIxMyArIGEyMiAqIGIyMyArIGEyMyAqIGIzMztcclxuXHJcblx0XHR0ZVsgMiBdID0gYTMxICogYjExICsgYTMyICogYjIxICsgYTMzICogYjMxO1xyXG5cdFx0dGVbIDUgXSA9IGEzMSAqIGIxMiArIGEzMiAqIGIyMiArIGEzMyAqIGIzMjtcclxuXHRcdHRlWyA4IF0gPSBhMzEgKiBiMTMgKyBhMzIgKiBiMjMgKyBhMzMgKiBiMzM7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTXVsdGlwbGllcyBldmVyeSBjb21wb25lbnQgb2YgdGhlIG1hdHJpeCBieSB0aGUgZ2l2ZW4gc2NhbGFyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHMgLSBUaGUgc2NhbGFyLlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdG11bHRpcGx5U2NhbGFyKCBzICkge1xyXG5cclxuXHRcdGNvbnN0IHRlID0gdGhpcy5lbGVtZW50cztcclxuXHJcblx0XHR0ZVsgMCBdICo9IHM7IHRlWyAzIF0gKj0gczsgdGVbIDYgXSAqPSBzO1xyXG5cdFx0dGVbIDEgXSAqPSBzOyB0ZVsgNCBdICo9IHM7IHRlWyA3IF0gKj0gcztcclxuXHRcdHRlWyAyIF0gKj0gczsgdGVbIDUgXSAqPSBzOyB0ZVsgOCBdICo9IHM7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgYW5kIHJldHVybnMgdGhlIGRldGVybWluYW50IG9mIHRoaXMgbWF0cml4LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgZGV0ZXJtaW5hbnQuXHJcblx0ICovXHJcblx0ZGV0ZXJtaW5hbnQoKSB7XHJcblxyXG5cdFx0Y29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzO1xyXG5cclxuXHRcdGNvbnN0IGEgPSB0ZVsgMCBdLCBiID0gdGVbIDEgXSwgYyA9IHRlWyAyIF0sXHJcblx0XHRcdGQgPSB0ZVsgMyBdLCBlID0gdGVbIDQgXSwgZiA9IHRlWyA1IF0sXHJcblx0XHRcdGcgPSB0ZVsgNiBdLCBoID0gdGVbIDcgXSwgaSA9IHRlWyA4IF07XHJcblxyXG5cdFx0cmV0dXJuIGEgKiBlICogaSAtIGEgKiBmICogaCAtIGIgKiBkICogaSArIGIgKiBmICogZyArIGMgKiBkICogaCAtIGMgKiBlICogZztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJbnZlcnRzIHRoaXMgbWF0cml4LCB1c2luZyB0aGUgW2FuYWx5dGljIG1ldGhvZF17QGxpbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSW52ZXJ0aWJsZV9tYXRyaXgjQW5hbHl0aWNfc29sdXRpb259LlxyXG5cdCAqIFlvdSBjYW4gbm90IGludmVydCB3aXRoIGEgZGV0ZXJtaW5hbnQgb2YgemVyby4gSWYgeW91IGF0dGVtcHQgdGhpcywgdGhlIG1ldGhvZCBwcm9kdWNlc1xyXG5cdCAqIGEgemVybyBtYXRyaXggaW5zdGVhZC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdGludmVydCgpIHtcclxuXHJcblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHMsXHJcblxyXG5cdFx0XHRuMTEgPSB0ZVsgMCBdLCBuMjEgPSB0ZVsgMSBdLCBuMzEgPSB0ZVsgMiBdLFxyXG5cdFx0XHRuMTIgPSB0ZVsgMyBdLCBuMjIgPSB0ZVsgNCBdLCBuMzIgPSB0ZVsgNSBdLFxyXG5cdFx0XHRuMTMgPSB0ZVsgNiBdLCBuMjMgPSB0ZVsgNyBdLCBuMzMgPSB0ZVsgOCBdLFxyXG5cclxuXHRcdFx0dDExID0gbjMzICogbjIyIC0gbjMyICogbjIzLFxyXG5cdFx0XHR0MTIgPSBuMzIgKiBuMTMgLSBuMzMgKiBuMTIsXHJcblx0XHRcdHQxMyA9IG4yMyAqIG4xMiAtIG4yMiAqIG4xMyxcclxuXHJcblx0XHRcdGRldCA9IG4xMSAqIHQxMSArIG4yMSAqIHQxMiArIG4zMSAqIHQxMztcclxuXHJcblx0XHRpZiAoIGRldCA9PT0gMCApIHJldHVybiB0aGlzLnNldCggMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCApO1xyXG5cclxuXHRcdGNvbnN0IGRldEludiA9IDEgLyBkZXQ7XHJcblxyXG5cdFx0dGVbIDAgXSA9IHQxMSAqIGRldEludjtcclxuXHRcdHRlWyAxIF0gPSAoIG4zMSAqIG4yMyAtIG4zMyAqIG4yMSApICogZGV0SW52O1xyXG5cdFx0dGVbIDIgXSA9ICggbjMyICogbjIxIC0gbjMxICogbjIyICkgKiBkZXRJbnY7XHJcblxyXG5cdFx0dGVbIDMgXSA9IHQxMiAqIGRldEludjtcclxuXHRcdHRlWyA0IF0gPSAoIG4zMyAqIG4xMSAtIG4zMSAqIG4xMyApICogZGV0SW52O1xyXG5cdFx0dGVbIDUgXSA9ICggbjMxICogbjEyIC0gbjMyICogbjExICkgKiBkZXRJbnY7XHJcblxyXG5cdFx0dGVbIDYgXSA9IHQxMyAqIGRldEludjtcclxuXHRcdHRlWyA3IF0gPSAoIG4yMSAqIG4xMyAtIG4yMyAqIG4xMSApICogZGV0SW52O1xyXG5cdFx0dGVbIDggXSA9ICggbjIyICogbjExIC0gbjIxICogbjEyICkgKiBkZXRJbnY7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVHJhbnNwb3NlcyB0aGlzIG1hdHJpeCBpbiBwbGFjZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdHRyYW5zcG9zZSgpIHtcclxuXHJcblx0XHRsZXQgdG1wO1xyXG5cdFx0Y29uc3QgbSA9IHRoaXMuZWxlbWVudHM7XHJcblxyXG5cdFx0dG1wID0gbVsgMSBdOyBtWyAxIF0gPSBtWyAzIF07IG1bIDMgXSA9IHRtcDtcclxuXHRcdHRtcCA9IG1bIDIgXTsgbVsgMiBdID0gbVsgNiBdOyBtWyA2IF0gPSB0bXA7XHJcblx0XHR0bXAgPSBtWyA1IF07IG1bIDUgXSA9IG1bIDcgXTsgbVsgNyBdID0gdG1wO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSBub3JtYWwgbWF0cml4IHdoaWNoIGlzIHRoZSBpbnZlcnNlIHRyYW5zcG9zZSBvZiB0aGUgdXBwZXJcclxuXHQgKiBsZWZ0IDN4MyBwb3J0aW9uIG9mIHRoZSBnaXZlbiA0eDQgbWF0cml4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRyaXg0fSBtYXRyaXg0IC0gVGhlIDR4NCBtYXRyaXguXHJcblx0ICogQHJldHVybiB7TWF0cml4M30gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0Z2V0Tm9ybWFsTWF0cml4KCBtYXRyaXg0ICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnNldEZyb21NYXRyaXg0KCBtYXRyaXg0ICkuaW52ZXJ0KCkudHJhbnNwb3NlKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVHJhbnNwb3NlcyB0aGlzIG1hdHJpeCBpbnRvIHRoZSBzdXBwbGllZCBhcnJheSwgYW5kIHJldHVybnMgaXRzZWxmIHVuY2hhbmdlZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gciAtIEFuIGFycmF5IHRvIHN0b3JlIHRoZSB0cmFuc3Bvc2VkIG1hdHJpeCBlbGVtZW50cy5cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXgzfSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHR0cmFuc3Bvc2VJbnRvQXJyYXkoIHIgKSB7XHJcblxyXG5cdFx0Y29uc3QgbSA9IHRoaXMuZWxlbWVudHM7XHJcblxyXG5cdFx0clsgMCBdID0gbVsgMCBdO1xyXG5cdFx0clsgMSBdID0gbVsgMyBdO1xyXG5cdFx0clsgMiBdID0gbVsgNiBdO1xyXG5cdFx0clsgMyBdID0gbVsgMSBdO1xyXG5cdFx0clsgNCBdID0gbVsgNCBdO1xyXG5cdFx0clsgNSBdID0gbVsgNyBdO1xyXG5cdFx0clsgNiBdID0gbVsgMiBdO1xyXG5cdFx0clsgNyBdID0gbVsgNSBdO1xyXG5cdFx0clsgOCBdID0gbVsgOCBdO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIFVWIHRyYW5zZm9ybSBtYXRyaXggZnJvbSBvZmZzZXQsIHJlcGVhdCwgcm90YXRpb24sIGFuZCBjZW50ZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdHggLSBPZmZzZXQgeC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdHkgLSBPZmZzZXQgeS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc3ggLSBSZXBlYXQgeC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc3kgLSBSZXBlYXQgeS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gcm90YXRpb24gLSBSb3RhdGlvbiwgaW4gcmFkaWFucy4gUG9zaXRpdmUgdmFsdWVzIHJvdGF0ZSBjb3VudGVyY2xvY2t3aXNlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBjeCAtIENlbnRlciB4IG9mIHJvdGF0aW9uLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBjeSAtIENlbnRlciB5IG9mIHJvdGF0aW9uXHJcblx0ICogQHJldHVybiB7TWF0cml4M30gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0c2V0VXZUcmFuc2Zvcm0oIHR4LCB0eSwgc3gsIHN5LCByb3RhdGlvbiwgY3gsIGN5ICkge1xyXG5cclxuXHRcdGNvbnN0IGMgPSBNYXRoLmNvcyggcm90YXRpb24gKTtcclxuXHRcdGNvbnN0IHMgPSBNYXRoLnNpbiggcm90YXRpb24gKTtcclxuXHJcblx0XHR0aGlzLnNldChcclxuXHRcdFx0c3ggKiBjLCBzeCAqIHMsIC0gc3ggKiAoIGMgKiBjeCArIHMgKiBjeSApICsgY3ggKyB0eCxcclxuXHRcdFx0LSBzeSAqIHMsIHN5ICogYywgLSBzeSAqICggLSBzICogY3ggKyBjICogY3kgKSArIGN5ICsgdHksXHJcblx0XHRcdDAsIDAsIDFcclxuXHRcdCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2NhbGVzIHRoaXMgbWF0cml4IHdpdGggdGhlIGdpdmVuIHNjYWxhciB2YWx1ZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc3ggLSBUaGUgYW1vdW50IHRvIHNjYWxlIGluIHRoZSBYIGF4aXMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHN5IC0gVGhlIGFtb3VudCB0byBzY2FsZSBpbiB0aGUgWSBheGlzLlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdHNjYWxlKCBzeCwgc3kgKSB7XHJcblxyXG5cdFx0dGhpcy5wcmVtdWx0aXBseSggX20zLm1ha2VTY2FsZSggc3gsIHN5ICkgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSb3RhdGVzIHRoaXMgbWF0cml4IGJ5IHRoZSBnaXZlbiBhbmdsZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0aGV0YSAtIFRoZSByb3RhdGlvbiBpbiByYWRpYW5zLlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdHJvdGF0ZSggdGhldGEgKSB7XHJcblxyXG5cdFx0dGhpcy5wcmVtdWx0aXBseSggX20zLm1ha2VSb3RhdGlvbiggLSB0aGV0YSApICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVHJhbnNsYXRlcyB0aGlzIG1hdHJpeCBieSB0aGUgZ2l2ZW4gc2NhbGFyIHZhbHVlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0eCAtIFRoZSBhbW91bnQgdG8gdHJhbnNsYXRlIGluIHRoZSBYIGF4aXMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHR5IC0gVGhlIGFtb3VudCB0byB0cmFuc2xhdGUgaW4gdGhlIFkgYXhpcy5cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXgzfSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHR0cmFuc2xhdGUoIHR4LCB0eSApIHtcclxuXHJcblx0XHR0aGlzLnByZW11bHRpcGx5KCBfbTMubWFrZVRyYW5zbGF0aW9uKCB0eCwgdHkgKSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vIGZvciAyRCBUcmFuc2Zvcm1zXHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhpcyBtYXRyaXggYXMgYSAyRCB0cmFuc2xhdGlvbiB0cmFuc2Zvcm0uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcnxWZWN0b3IyfSB4IC0gVGhlIGFtb3VudCB0byB0cmFuc2xhdGUgaW4gdGhlIFggYXhpcyBvciBhbHRlcm5hdGl2ZWx5IGEgdHJhbnNsYXRpb24gdmVjdG9yLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIGFtb3VudCB0byB0cmFuc2xhdGUgaW4gdGhlIFkgYXhpcy5cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXgzfSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRtYWtlVHJhbnNsYXRpb24oIHgsIHkgKSB7XHJcblxyXG5cdFx0aWYgKCB4LmlzVmVjdG9yMiApIHtcclxuXHJcblx0XHRcdHRoaXMuc2V0KFxyXG5cclxuXHRcdFx0XHQxLCAwLCB4LngsXHJcblx0XHRcdFx0MCwgMSwgeC55LFxyXG5cdFx0XHRcdDAsIDAsIDFcclxuXHJcblx0XHRcdCk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHRoaXMuc2V0KFxyXG5cclxuXHRcdFx0XHQxLCAwLCB4LFxyXG5cdFx0XHRcdDAsIDEsIHksXHJcblx0XHRcdFx0MCwgMCwgMVxyXG5cclxuXHRcdFx0KTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGlzIG1hdHJpeCBhcyBhIDJEIHJvdGF0aW9uYWwgdHJhbnNmb3JtYXRpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdGhldGEgLSBUaGUgcm90YXRpb24gaW4gcmFkaWFucy5cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXgzfSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRtYWtlUm90YXRpb24oIHRoZXRhICkge1xyXG5cclxuXHRcdC8vIGNvdW50ZXJjbG9ja3dpc2VcclxuXHJcblx0XHRjb25zdCBjID0gTWF0aC5jb3MoIHRoZXRhICk7XHJcblx0XHRjb25zdCBzID0gTWF0aC5zaW4oIHRoZXRhICk7XHJcblxyXG5cdFx0dGhpcy5zZXQoXHJcblxyXG5cdFx0XHRjLCAtIHMsIDAsXHJcblx0XHRcdHMsIGMsIDAsXHJcblx0XHRcdDAsIDAsIDFcclxuXHJcblx0XHQpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhpcyBtYXRyaXggYXMgYSAyRCBzY2FsZSB0cmFuc2Zvcm0uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBhbW91bnQgdG8gc2NhbGUgaW4gdGhlIFggYXhpcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSBhbW91bnQgdG8gc2NhbGUgaW4gdGhlIFkgYXhpcy5cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXgzfSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRtYWtlU2NhbGUoIHgsIHkgKSB7XHJcblxyXG5cdFx0dGhpcy5zZXQoXHJcblxyXG5cdFx0XHR4LCAwLCAwLFxyXG5cdFx0XHQwLCB5LCAwLFxyXG5cdFx0XHQwLCAwLCAxXHJcblxyXG5cdFx0KTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIG1hdHJpeCBpcyBlcXVhbCB3aXRoIHRoZSBnaXZlbiBvbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDN9IG1hdHJpeCAtIFRoZSBtYXRyaXggdG8gdGVzdCBmb3IgZXF1YWxpdHkuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGlzIG1hdHJpeCBpcyBlcXVhbCB3aXRoIHRoZSBnaXZlbiBvbmUuXHJcblx0ICovXHJcblx0ZXF1YWxzKCBtYXRyaXggKSB7XHJcblxyXG5cdFx0Y29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzO1xyXG5cdFx0Y29uc3QgbWUgPSBtYXRyaXguZWxlbWVudHM7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgOTsgaSArKyApIHtcclxuXHJcblx0XHRcdGlmICggdGVbIGkgXSAhPT0gbWVbIGkgXSApIHJldHVybiBmYWxzZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZWxlbWVudHMgb2YgdGhlIG1hdHJpeCBmcm9tIHRoZSBnaXZlbiBhcnJheS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gYXJyYXkgLSBUaGUgbWF0cml4IGVsZW1lbnRzIGluIGNvbHVtbi1tYWpvciBvcmRlci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW29mZnNldD0wXSAtIEluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBhcnJheS5cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXgzfSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRmcm9tQXJyYXkoIGFycmF5LCBvZmZzZXQgPSAwICkge1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDk7IGkgKysgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmVsZW1lbnRzWyBpIF0gPSBhcnJheVsgaSArIG9mZnNldCBdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBXcml0ZXMgdGhlIGVsZW1lbnRzIG9mIHRoaXMgbWF0cml4IHRvIHRoZSBnaXZlbiBhcnJheS4gSWYgbm8gYXJyYXkgaXMgcHJvdmlkZWQsXHJcblx0ICogdGhlIG1ldGhvZCByZXR1cm5zIGEgbmV3IGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBbYXJyYXk9W11dIC0gVGhlIHRhcmdldCBhcnJheSBob2xkaW5nIHRoZSBtYXRyaXggZWxlbWVudHMgaW4gY29sdW1uLW1ham9yIG9yZGVyLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0PTBdIC0gSW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGFycmF5LlxyXG5cdCAqIEByZXR1cm4ge0FycmF5PG51bWJlcj59IFRoZSBtYXRyaXggZWxlbWVudHMgaW4gY29sdW1uLW1ham9yIG9yZGVyLlxyXG5cdCAqL1xyXG5cdHRvQXJyYXkoIGFycmF5ID0gW10sIG9mZnNldCA9IDAgKSB7XHJcblxyXG5cdFx0Y29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzO1xyXG5cclxuXHRcdGFycmF5WyBvZmZzZXQgXSA9IHRlWyAwIF07XHJcblx0XHRhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGVbIDEgXTtcclxuXHRcdGFycmF5WyBvZmZzZXQgKyAyIF0gPSB0ZVsgMiBdO1xyXG5cclxuXHRcdGFycmF5WyBvZmZzZXQgKyAzIF0gPSB0ZVsgMyBdO1xyXG5cdFx0YXJyYXlbIG9mZnNldCArIDQgXSA9IHRlWyA0IF07XHJcblx0XHRhcnJheVsgb2Zmc2V0ICsgNSBdID0gdGVbIDUgXTtcclxuXHJcblx0XHRhcnJheVsgb2Zmc2V0ICsgNiBdID0gdGVbIDYgXTtcclxuXHRcdGFycmF5WyBvZmZzZXQgKyA3IF0gPSB0ZVsgNyBdO1xyXG5cdFx0YXJyYXlbIG9mZnNldCArIDggXSA9IHRlWyA4IF07XHJcblxyXG5cdFx0cmV0dXJuIGFycmF5O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBtYXRyaXggd2l0aCBjb3BpZWQgdmFsdWVzIGZyb20gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDN9IEEgY2xvbmUgb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjbG9uZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5mcm9tQXJyYXkoIHRoaXMuZWxlbWVudHMgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuY29uc3QgX20zID0gLypAX19QVVJFX18qLyBuZXcgTWF0cml4MygpO1xyXG5cclxuZXhwb3J0IHsgTWF0cml4MyB9O1xyXG4iLCJmdW5jdGlvbiBhcnJheU1pbiggYXJyYXkgKSB7XHJcblxyXG5cdGlmICggYXJyYXkubGVuZ3RoID09PSAwICkgcmV0dXJuIEluZmluaXR5O1xyXG5cclxuXHRsZXQgbWluID0gYXJyYXlbIDAgXTtcclxuXHJcblx0Zm9yICggbGV0IGkgPSAxLCBsID0gYXJyYXkubGVuZ3RoOyBpIDwgbDsgKysgaSApIHtcclxuXHJcblx0XHRpZiAoIGFycmF5WyBpIF0gPCBtaW4gKSBtaW4gPSBhcnJheVsgaSBdO1xyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiBtaW47XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBhcnJheU1heCggYXJyYXkgKSB7XHJcblxyXG5cdGlmICggYXJyYXkubGVuZ3RoID09PSAwICkgcmV0dXJuIC0gSW5maW5pdHk7XHJcblxyXG5cdGxldCBtYXggPSBhcnJheVsgMCBdO1xyXG5cclxuXHRmb3IgKCBsZXQgaSA9IDEsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyArKyBpICkge1xyXG5cclxuXHRcdGlmICggYXJyYXlbIGkgXSA+IG1heCApIG1heCA9IGFycmF5WyBpIF07XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIG1heDtcclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFycmF5TmVlZHNVaW50MzIoIGFycmF5ICkge1xyXG5cclxuXHQvLyBhc3N1bWVzIGxhcmdlciB2YWx1ZXMgdXN1YWxseSBvbiBsYXN0XHJcblxyXG5cdGZvciAoIGxldCBpID0gYXJyYXkubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLSBpICkge1xyXG5cclxuXHRcdGlmICggYXJyYXlbIGkgXSA+PSA2NTUzNSApIHJldHVybiB0cnVlOyAvLyBhY2NvdW50IGZvciBQUklNSVRJVkVfUkVTVEFSVF9GSVhFRF9JTkRFWCwgIzI0NTY1XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIGZhbHNlO1xyXG5cclxufVxyXG5cclxuY29uc3QgVFlQRURfQVJSQVlTID0ge1xyXG5cdEludDhBcnJheTogSW50OEFycmF5LFxyXG5cdFVpbnQ4QXJyYXk6IFVpbnQ4QXJyYXksXHJcblx0VWludDhDbGFtcGVkQXJyYXk6IFVpbnQ4Q2xhbXBlZEFycmF5LFxyXG5cdEludDE2QXJyYXk6IEludDE2QXJyYXksXHJcblx0VWludDE2QXJyYXk6IFVpbnQxNkFycmF5LFxyXG5cdEludDMyQXJyYXk6IEludDMyQXJyYXksXHJcblx0VWludDMyQXJyYXk6IFVpbnQzMkFycmF5LFxyXG5cdEZsb2F0MzJBcnJheTogRmxvYXQzMkFycmF5LFxyXG5cdEZsb2F0NjRBcnJheTogRmxvYXQ2NEFycmF5XHJcbn07XHJcblxyXG5mdW5jdGlvbiBnZXRUeXBlZEFycmF5KCB0eXBlLCBidWZmZXIgKSB7XHJcblxyXG5cdHJldHVybiBuZXcgVFlQRURfQVJSQVlTWyB0eXBlIF0oIGJ1ZmZlciApO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlRWxlbWVudE5TKCBuYW1lICkge1xyXG5cclxuXHRyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcsIG5hbWUgKTtcclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZUNhbnZhc0VsZW1lbnQoKSB7XHJcblxyXG5cdGNvbnN0IGNhbnZhcyA9IGNyZWF0ZUVsZW1lbnROUyggJ2NhbnZhcycgKTtcclxuXHRjYW52YXMuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcblx0cmV0dXJuIGNhbnZhcztcclxuXHJcbn1cclxuXHJcbmNvbnN0IF9jYWNoZSA9IHt9O1xyXG5cclxuZnVuY3Rpb24gd2Fybk9uY2UoIG1lc3NhZ2UgKSB7XHJcblxyXG5cdGlmICggbWVzc2FnZSBpbiBfY2FjaGUgKSByZXR1cm47XHJcblxyXG5cdF9jYWNoZVsgbWVzc2FnZSBdID0gdHJ1ZTtcclxuXHJcblx0Y29uc29sZS53YXJuKCBtZXNzYWdlICk7XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBwcm9iZUFzeW5jKCBnbCwgc3luYywgaW50ZXJ2YWwgKSB7XHJcblxyXG5cdHJldHVybiBuZXcgUHJvbWlzZSggZnVuY3Rpb24gKCByZXNvbHZlLCByZWplY3QgKSB7XHJcblxyXG5cdFx0ZnVuY3Rpb24gcHJvYmUoKSB7XHJcblxyXG5cdFx0XHRzd2l0Y2ggKCBnbC5jbGllbnRXYWl0U3luYyggc3luYywgZ2wuU1lOQ19GTFVTSF9DT01NQU5EU19CSVQsIDAgKSApIHtcclxuXHJcblx0XHRcdFx0Y2FzZSBnbC5XQUlUX0ZBSUxFRDpcclxuXHRcdFx0XHRcdHJlamVjdCgpO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdGNhc2UgZ2wuVElNRU9VVF9FWFBJUkVEOlxyXG5cdFx0XHRcdFx0c2V0VGltZW91dCggcHJvYmUsIGludGVydmFsICk7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRcdHJlc29sdmUoKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0c2V0VGltZW91dCggcHJvYmUsIGludGVydmFsICk7XHJcblxyXG5cdH0gKTtcclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHRvTm9ybWFsaXplZFByb2plY3Rpb25NYXRyaXgoIHByb2plY3Rpb25NYXRyaXggKSB7XHJcblxyXG5cdGNvbnN0IG0gPSBwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzO1xyXG5cclxuXHQvLyBDb252ZXJ0IFstMSwgMV0gdG8gWzAsIDFdIHByb2plY3Rpb24gbWF0cml4XHJcblx0bVsgMiBdID0gMC41ICogbVsgMiBdICsgMC41ICogbVsgMyBdO1xyXG5cdG1bIDYgXSA9IDAuNSAqIG1bIDYgXSArIDAuNSAqIG1bIDcgXTtcclxuXHRtWyAxMCBdID0gMC41ICogbVsgMTAgXSArIDAuNSAqIG1bIDExIF07XHJcblx0bVsgMTQgXSA9IDAuNSAqIG1bIDE0IF0gKyAwLjUgKiBtWyAxNSBdO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gdG9SZXZlcnNlZFByb2plY3Rpb25NYXRyaXgoIHByb2plY3Rpb25NYXRyaXggKSB7XHJcblxyXG5cdGNvbnN0IG0gPSBwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzO1xyXG5cdGNvbnN0IGlzUGVyc3BlY3RpdmVNYXRyaXggPSBtWyAxMSBdID09PSAtIDE7XHJcblxyXG5cdC8vIFJldmVyc2UgWzAsIDFdIHByb2plY3Rpb24gbWF0cml4XHJcblx0aWYgKCBpc1BlcnNwZWN0aXZlTWF0cml4ICkge1xyXG5cclxuXHRcdG1bIDEwIF0gPSAtIG1bIDEwIF0gLSAxO1xyXG5cdFx0bVsgMTQgXSA9IC0gbVsgMTQgXTtcclxuXHJcblx0fSBlbHNlIHtcclxuXHJcblx0XHRtWyAxMCBdID0gLSBtWyAxMCBdO1xyXG5cdFx0bVsgMTQgXSA9IC0gbVsgMTQgXSArIDE7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IGFycmF5TWluLCBhcnJheU1heCwgYXJyYXlOZWVkc1VpbnQzMiwgZ2V0VHlwZWRBcnJheSwgY3JlYXRlRWxlbWVudE5TLCBjcmVhdGVDYW52YXNFbGVtZW50LCB3YXJuT25jZSwgcHJvYmVBc3luYywgdG9Ob3JtYWxpemVkUHJvamVjdGlvbk1hdHJpeCwgdG9SZXZlcnNlZFByb2plY3Rpb25NYXRyaXggfTtcclxuIiwiaW1wb3J0IHsgU1JHQkNvbG9yU3BhY2UsIExpbmVhclNSR0JDb2xvclNwYWNlLCBTUkdCVHJhbnNmZXIsIExpbmVhclRyYW5zZmVyLCBOb0NvbG9yU3BhY2UgfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBNYXRyaXgzIH0gZnJvbSAnLi9NYXRyaXgzLmpzJztcclxuXHJcbmNvbnN0IExJTkVBUl9SRUM3MDlfVE9fWFlaID0gLypAX19QVVJFX18qLyBuZXcgTWF0cml4MygpLnNldChcclxuXHQwLjQxMjM5MDgsIDAuMzU3NTg0MywgMC4xODA0ODA4LFxyXG5cdDAuMjEyNjM5MCwgMC43MTUxNjg3LCAwLjA3MjE5MjMsXHJcblx0MC4wMTkzMzA4LCAwLjExOTE5NDgsIDAuOTUwNTMyMlxyXG4pO1xyXG5cclxuY29uc3QgWFlaX1RPX0xJTkVBUl9SRUM3MDkgPSAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXgzKCkuc2V0KFxyXG5cdDMuMjQwOTY5OSwgLSAxLjUzNzM4MzIsIC0gMC40OTg2MTA4LFxyXG5cdC0gMC45NjkyNDM2LCAxLjg3NTk2NzUsIDAuMDQxNTU1MSxcclxuXHQwLjA1NTYzMDEsIC0gMC4yMDM5NzcwLCAxLjA1Njk3MTVcclxuKTtcclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZUNvbG9yTWFuYWdlbWVudCgpIHtcclxuXHJcblx0Y29uc3QgQ29sb3JNYW5hZ2VtZW50ID0ge1xyXG5cclxuXHRcdGVuYWJsZWQ6IHRydWUsXHJcblxyXG5cdFx0d29ya2luZ0NvbG9yU3BhY2U6IExpbmVhclNSR0JDb2xvclNwYWNlLFxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSW1wbGVtZW50YXRpb25zIG9mIHN1cHBvcnRlZCBjb2xvciBzcGFjZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogUmVxdWlyZWQ6XHJcblx0XHQgKlx0LSBwcmltYXJpZXM6IGNocm9tYXRpY2l0eSBjb29yZGluYXRlcyBbIHJ4IHJ5IGd4IGd5IGJ4IGJ5IF1cclxuXHRcdCAqXHQtIHdoaXRlUG9pbnQ6IHJlZmVyZW5jZSB3aGl0ZSBbIHggeSBdXHJcblx0XHQgKlx0LSB0cmFuc2ZlcjogdHJhbnNmZXIgZnVuY3Rpb24gKHByZS1kZWZpbmVkKVxyXG5cdFx0ICpcdC0gdG9YWVo6IE1hdHJpeDMgUkdCIHRvIFhZWiB0cmFuc2Zvcm1cclxuXHRcdCAqXHQtIGZyb21YWVo6IE1hdHJpeDMgWFlaIHRvIFJHQiB0cmFuc2Zvcm1cclxuXHRcdCAqXHQtIGx1bWluYW5jZUNvZWZmaWNpZW50czogUkdCIGx1bWluYW5jZSBjb2VmZmljaWVudHNcclxuXHRcdCAqXHJcblx0XHQgKiBPcHRpb25hbDpcclxuXHRcdCAqICAtIG91dHB1dENvbG9yU3BhY2VDb25maWc6IHsgZHJhd2luZ0J1ZmZlckNvbG9yU3BhY2U6IENvbG9yU3BhY2UgfVxyXG5cdFx0ICogIC0gd29ya2luZ0NvbG9yU3BhY2VDb25maWc6IHsgdW5wYWNrQ29sb3JTcGFjZTogQ29sb3JTcGFjZSB9XHJcblx0XHQgKlxyXG5cdFx0ICogUmVmZXJlbmNlOlxyXG5cdFx0ICogLSBodHRwczovL3d3dy5ydXNzZWxsY290dHJlbGwuY29tL3Bob3RvL21hdHJpeENhbGN1bGF0b3IuaHRtXHJcblx0XHQgKi9cclxuXHRcdHNwYWNlczoge30sXHJcblxyXG5cdFx0Y29udmVydDogZnVuY3Rpb24gKCBjb2xvciwgc291cmNlQ29sb3JTcGFjZSwgdGFyZ2V0Q29sb3JTcGFjZSApIHtcclxuXHJcblx0XHRcdGlmICggdGhpcy5lbmFibGVkID09PSBmYWxzZSB8fCBzb3VyY2VDb2xvclNwYWNlID09PSB0YXJnZXRDb2xvclNwYWNlIHx8ICEgc291cmNlQ29sb3JTcGFjZSB8fCAhIHRhcmdldENvbG9yU3BhY2UgKSB7XHJcblxyXG5cdFx0XHRcdHJldHVybiBjb2xvcjtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggdGhpcy5zcGFjZXNbIHNvdXJjZUNvbG9yU3BhY2UgXS50cmFuc2ZlciA9PT0gU1JHQlRyYW5zZmVyICkge1xyXG5cclxuXHRcdFx0XHRjb2xvci5yID0gU1JHQlRvTGluZWFyKCBjb2xvci5yICk7XHJcblx0XHRcdFx0Y29sb3IuZyA9IFNSR0JUb0xpbmVhciggY29sb3IuZyApO1xyXG5cdFx0XHRcdGNvbG9yLmIgPSBTUkdCVG9MaW5lYXIoIGNvbG9yLmIgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggdGhpcy5zcGFjZXNbIHNvdXJjZUNvbG9yU3BhY2UgXS5wcmltYXJpZXMgIT09IHRoaXMuc3BhY2VzWyB0YXJnZXRDb2xvclNwYWNlIF0ucHJpbWFyaWVzICkge1xyXG5cclxuXHRcdFx0XHRjb2xvci5hcHBseU1hdHJpeDMoIHRoaXMuc3BhY2VzWyBzb3VyY2VDb2xvclNwYWNlIF0udG9YWVogKTtcclxuXHRcdFx0XHRjb2xvci5hcHBseU1hdHJpeDMoIHRoaXMuc3BhY2VzWyB0YXJnZXRDb2xvclNwYWNlIF0uZnJvbVhZWiApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCB0aGlzLnNwYWNlc1sgdGFyZ2V0Q29sb3JTcGFjZSBdLnRyYW5zZmVyID09PSBTUkdCVHJhbnNmZXIgKSB7XHJcblxyXG5cdFx0XHRcdGNvbG9yLnIgPSBMaW5lYXJUb1NSR0IoIGNvbG9yLnIgKTtcclxuXHRcdFx0XHRjb2xvci5nID0gTGluZWFyVG9TUkdCKCBjb2xvci5nICk7XHJcblx0XHRcdFx0Y29sb3IuYiA9IExpbmVhclRvU1JHQiggY29sb3IuYiApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIGNvbG9yO1xyXG5cclxuXHRcdH0sXHJcblxyXG5cdFx0ZnJvbVdvcmtpbmdDb2xvclNwYWNlOiBmdW5jdGlvbiAoIGNvbG9yLCB0YXJnZXRDb2xvclNwYWNlICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIHRoaXMuY29udmVydCggY29sb3IsIHRoaXMud29ya2luZ0NvbG9yU3BhY2UsIHRhcmdldENvbG9yU3BhY2UgKTtcclxuXHJcblx0XHR9LFxyXG5cclxuXHRcdHRvV29ya2luZ0NvbG9yU3BhY2U6IGZ1bmN0aW9uICggY29sb3IsIHNvdXJjZUNvbG9yU3BhY2UgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gdGhpcy5jb252ZXJ0KCBjb2xvciwgc291cmNlQ29sb3JTcGFjZSwgdGhpcy53b3JraW5nQ29sb3JTcGFjZSApO1xyXG5cclxuXHRcdH0sXHJcblxyXG5cdFx0Z2V0UHJpbWFyaWVzOiBmdW5jdGlvbiAoIGNvbG9yU3BhY2UgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gdGhpcy5zcGFjZXNbIGNvbG9yU3BhY2UgXS5wcmltYXJpZXM7XHJcblxyXG5cdFx0fSxcclxuXHJcblx0XHRnZXRUcmFuc2ZlcjogZnVuY3Rpb24gKCBjb2xvclNwYWNlICkge1xyXG5cclxuXHRcdFx0aWYgKCBjb2xvclNwYWNlID09PSBOb0NvbG9yU3BhY2UgKSByZXR1cm4gTGluZWFyVHJhbnNmZXI7XHJcblxyXG5cdFx0XHRyZXR1cm4gdGhpcy5zcGFjZXNbIGNvbG9yU3BhY2UgXS50cmFuc2ZlcjtcclxuXHJcblx0XHR9LFxyXG5cclxuXHRcdGdldEx1bWluYW5jZUNvZWZmaWNpZW50czogZnVuY3Rpb24gKCB0YXJnZXQsIGNvbG9yU3BhY2UgPSB0aGlzLndvcmtpbmdDb2xvclNwYWNlICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIHRhcmdldC5mcm9tQXJyYXkoIHRoaXMuc3BhY2VzWyBjb2xvclNwYWNlIF0ubHVtaW5hbmNlQ29lZmZpY2llbnRzICk7XHJcblxyXG5cdFx0fSxcclxuXHJcblx0XHRkZWZpbmU6IGZ1bmN0aW9uICggY29sb3JTcGFjZXMgKSB7XHJcblxyXG5cdFx0XHRPYmplY3QuYXNzaWduKCB0aGlzLnNwYWNlcywgY29sb3JTcGFjZXMgKTtcclxuXHJcblx0XHR9LFxyXG5cclxuXHRcdC8vIEludGVybmFsIEFQSXNcclxuXHJcblx0XHRfZ2V0TWF0cml4OiBmdW5jdGlvbiAoIHRhcmdldE1hdHJpeCwgc291cmNlQ29sb3JTcGFjZSwgdGFyZ2V0Q29sb3JTcGFjZSApIHtcclxuXHJcblx0XHRcdHJldHVybiB0YXJnZXRNYXRyaXhcclxuXHRcdFx0XHQuY29weSggdGhpcy5zcGFjZXNbIHNvdXJjZUNvbG9yU3BhY2UgXS50b1hZWiApXHJcblx0XHRcdFx0Lm11bHRpcGx5KCB0aGlzLnNwYWNlc1sgdGFyZ2V0Q29sb3JTcGFjZSBdLmZyb21YWVogKTtcclxuXHJcblx0XHR9LFxyXG5cclxuXHRcdF9nZXREcmF3aW5nQnVmZmVyQ29sb3JTcGFjZTogZnVuY3Rpb24gKCBjb2xvclNwYWNlICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIHRoaXMuc3BhY2VzWyBjb2xvclNwYWNlIF0ub3V0cHV0Q29sb3JTcGFjZUNvbmZpZy5kcmF3aW5nQnVmZmVyQ29sb3JTcGFjZTtcclxuXHJcblx0XHR9LFxyXG5cclxuXHRcdF9nZXRVbnBhY2tDb2xvclNwYWNlOiBmdW5jdGlvbiAoIGNvbG9yU3BhY2UgPSB0aGlzLndvcmtpbmdDb2xvclNwYWNlICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIHRoaXMuc3BhY2VzWyBjb2xvclNwYWNlIF0ud29ya2luZ0NvbG9yU3BhY2VDb25maWcudW5wYWNrQ29sb3JTcGFjZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH07XHJcblxyXG5cdC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuXHQgKiBzUkdCIGRlZmluaXRpb25zXHJcblx0ICovXHJcblxyXG5cdGNvbnN0IFJFQzcwOV9QUklNQVJJRVMgPSBbIDAuNjQwLCAwLjMzMCwgMC4zMDAsIDAuNjAwLCAwLjE1MCwgMC4wNjAgXTtcclxuXHRjb25zdCBSRUM3MDlfTFVNSU5BTkNFX0NPRUZGSUNJRU5UUyA9IFsgMC4yMTI2LCAwLjcxNTIsIDAuMDcyMiBdO1xyXG5cdGNvbnN0IEQ2NSA9IFsgMC4zMTI3LCAwLjMyOTAgXTtcclxuXHJcblx0Q29sb3JNYW5hZ2VtZW50LmRlZmluZSgge1xyXG5cclxuXHRcdFsgTGluZWFyU1JHQkNvbG9yU3BhY2UgXToge1xyXG5cdFx0XHRwcmltYXJpZXM6IFJFQzcwOV9QUklNQVJJRVMsXHJcblx0XHRcdHdoaXRlUG9pbnQ6IEQ2NSxcclxuXHRcdFx0dHJhbnNmZXI6IExpbmVhclRyYW5zZmVyLFxyXG5cdFx0XHR0b1hZWjogTElORUFSX1JFQzcwOV9UT19YWVosXHJcblx0XHRcdGZyb21YWVo6IFhZWl9UT19MSU5FQVJfUkVDNzA5LFxyXG5cdFx0XHRsdW1pbmFuY2VDb2VmZmljaWVudHM6IFJFQzcwOV9MVU1JTkFOQ0VfQ09FRkZJQ0lFTlRTLFxyXG5cdFx0XHR3b3JraW5nQ29sb3JTcGFjZUNvbmZpZzogeyB1bnBhY2tDb2xvclNwYWNlOiBTUkdCQ29sb3JTcGFjZSB9LFxyXG5cdFx0XHRvdXRwdXRDb2xvclNwYWNlQ29uZmlnOiB7IGRyYXdpbmdCdWZmZXJDb2xvclNwYWNlOiBTUkdCQ29sb3JTcGFjZSB9XHJcblx0XHR9LFxyXG5cclxuXHRcdFsgU1JHQkNvbG9yU3BhY2UgXToge1xyXG5cdFx0XHRwcmltYXJpZXM6IFJFQzcwOV9QUklNQVJJRVMsXHJcblx0XHRcdHdoaXRlUG9pbnQ6IEQ2NSxcclxuXHRcdFx0dHJhbnNmZXI6IFNSR0JUcmFuc2ZlcixcclxuXHRcdFx0dG9YWVo6IExJTkVBUl9SRUM3MDlfVE9fWFlaLFxyXG5cdFx0XHRmcm9tWFlaOiBYWVpfVE9fTElORUFSX1JFQzcwOSxcclxuXHRcdFx0bHVtaW5hbmNlQ29lZmZpY2llbnRzOiBSRUM3MDlfTFVNSU5BTkNFX0NPRUZGSUNJRU5UUyxcclxuXHRcdFx0b3V0cHV0Q29sb3JTcGFjZUNvbmZpZzogeyBkcmF3aW5nQnVmZmVyQ29sb3JTcGFjZTogU1JHQkNvbG9yU3BhY2UgfVxyXG5cdFx0fSxcclxuXHJcblx0fSApO1xyXG5cclxuXHRyZXR1cm4gQ29sb3JNYW5hZ2VtZW50O1xyXG5cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IENvbG9yTWFuYWdlbWVudCA9IC8qQF9fUFVSRV9fKi8gY3JlYXRlQ29sb3JNYW5hZ2VtZW50KCk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gU1JHQlRvTGluZWFyKCBjICkge1xyXG5cclxuXHRyZXR1cm4gKCBjIDwgMC4wNDA0NSApID8gYyAqIDAuMDc3Mzk5MzgwOCA6IE1hdGgucG93KCBjICogMC45NDc4NjcyOTg2ICsgMC4wNTIxMzI3MDE0LCAyLjQgKTtcclxuXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBMaW5lYXJUb1NSR0IoIGMgKSB7XHJcblxyXG5cdHJldHVybiAoIGMgPCAwLjAwMzEzMDggKSA/IGMgKiAxMi45MiA6IDEuMDU1ICogKCBNYXRoLnBvdyggYywgMC40MTY2NiApICkgLSAwLjA1NTtcclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgY3JlYXRlRWxlbWVudE5TIH0gZnJvbSAnLi4vdXRpbHMuanMnO1xyXG5pbXBvcnQgeyBTUkdCVG9MaW5lYXIgfSBmcm9tICcuLi9tYXRoL0NvbG9yTWFuYWdlbWVudC5qcyc7XHJcblxyXG5sZXQgX2NhbnZhcztcclxuXHJcbi8qKlxyXG4gKiBBIGNsYXNzIGNvbnRhaW5pbmcgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGltYWdlcy5cclxuICpcclxuICogQGhpZGVjb25zdHJ1Y3RvclxyXG4gKi9cclxuY2xhc3MgSW1hZ2VVdGlscyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBkYXRhIFVSSSBjb250YWluaW5nIGEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIGltYWdlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHsoSFRNTEltYWdlRWxlbWVudHxIVE1MQ2FudmFzRWxlbWVudCl9IGltYWdlIC0gVGhlIGltYWdlIG9iamVjdC5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW3R5cGU9J2ltYWdlL3BuZyddIC0gSW5kaWNhdGVzIHRoZSBpbWFnZSBmb3JtYXQuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgZGF0YSBVUkkuXHJcblx0ICovXHJcblx0c3RhdGljIGdldERhdGFVUkwoIGltYWdlLCB0eXBlID0gJ2ltYWdlL3BuZycgKSB7XHJcblxyXG5cdFx0aWYgKCAvXmRhdGE6L2kudGVzdCggaW1hZ2Uuc3JjICkgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gaW1hZ2Uuc3JjO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudCA9PT0gJ3VuZGVmaW5lZCcgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gaW1hZ2Uuc3JjO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRsZXQgY2FudmFzO1xyXG5cclxuXHRcdGlmICggaW1hZ2UgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCApIHtcclxuXHJcblx0XHRcdGNhbnZhcyA9IGltYWdlO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRpZiAoIF9jYW52YXMgPT09IHVuZGVmaW5lZCApIF9jYW52YXMgPSBjcmVhdGVFbGVtZW50TlMoICdjYW52YXMnICk7XHJcblxyXG5cdFx0XHRfY2FudmFzLndpZHRoID0gaW1hZ2Uud2lkdGg7XHJcblx0XHRcdF9jYW52YXMuaGVpZ2h0ID0gaW1hZ2UuaGVpZ2h0O1xyXG5cclxuXHRcdFx0Y29uc3QgY29udGV4dCA9IF9jYW52YXMuZ2V0Q29udGV4dCggJzJkJyApO1xyXG5cclxuXHRcdFx0aWYgKCBpbWFnZSBpbnN0YW5jZW9mIEltYWdlRGF0YSApIHtcclxuXHJcblx0XHRcdFx0Y29udGV4dC5wdXRJbWFnZURhdGEoIGltYWdlLCAwLCAwICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRjb250ZXh0LmRyYXdJbWFnZSggaW1hZ2UsIDAsIDAsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNhbnZhcyA9IF9jYW52YXM7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBjYW52YXMudG9EYXRhVVJMKCB0eXBlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29udmVydHMgdGhlIGdpdmVuIHNSR0IgaW1hZ2UgZGF0YSB0byBsaW5lYXIgY29sb3Igc3BhY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geyhIVE1MSW1hZ2VFbGVtZW50fEhUTUxDYW52YXNFbGVtZW50fEltYWdlQml0bWFwfE9iamVjdCl9IGltYWdlIC0gVGhlIGltYWdlIG9iamVjdC5cclxuXHQgKiBAcmV0dXJuIHtIVE1MQ2FudmFzRWxlbWVudHxPYmplY3R9IFRoZSBjb252ZXJ0ZWQgaW1hZ2UuXHJcblx0ICovXHJcblx0c3RhdGljIHNSR0JUb0xpbmVhciggaW1hZ2UgKSB7XHJcblxyXG5cdFx0aWYgKCAoIHR5cGVvZiBIVE1MSW1hZ2VFbGVtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBpbWFnZSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQgKSB8fFxyXG5cdFx0XHQoIHR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgaW1hZ2UgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCApIHx8XHJcblx0XHRcdCggdHlwZW9mIEltYWdlQml0bWFwICE9PSAndW5kZWZpbmVkJyAmJiBpbWFnZSBpbnN0YW5jZW9mIEltYWdlQml0bWFwICkgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBjYW52YXMgPSBjcmVhdGVFbGVtZW50TlMoICdjYW52YXMnICk7XHJcblxyXG5cdFx0XHRjYW52YXMud2lkdGggPSBpbWFnZS53aWR0aDtcclxuXHRcdFx0Y2FudmFzLmhlaWdodCA9IGltYWdlLmhlaWdodDtcclxuXHJcblx0XHRcdGNvbnN0IGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCggJzJkJyApO1xyXG5cdFx0XHRjb250ZXh0LmRyYXdJbWFnZSggaW1hZ2UsIDAsIDAsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQgKTtcclxuXHJcblx0XHRcdGNvbnN0IGltYWdlRGF0YSA9IGNvbnRleHQuZ2V0SW1hZ2VEYXRhKCAwLCAwLCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0ICk7XHJcblx0XHRcdGNvbnN0IGRhdGEgPSBpbWFnZURhdGEuZGF0YTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRkYXRhWyBpIF0gPSBTUkdCVG9MaW5lYXIoIGRhdGFbIGkgXSAvIDI1NSApICogMjU1O1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29udGV4dC5wdXRJbWFnZURhdGEoIGltYWdlRGF0YSwgMCwgMCApO1xyXG5cclxuXHRcdFx0cmV0dXJuIGNhbnZhcztcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBpbWFnZS5kYXRhICkge1xyXG5cclxuXHRcdFx0Y29uc3QgZGF0YSA9IGltYWdlLmRhdGEuc2xpY2UoIDAgKTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5IHx8IGRhdGEgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheSApIHtcclxuXHJcblx0XHRcdFx0XHRkYXRhWyBpIF0gPSBNYXRoLmZsb29yKCBTUkdCVG9MaW5lYXIoIGRhdGFbIGkgXSAvIDI1NSApICogMjU1ICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gYXNzdW1pbmcgZmxvYXRcclxuXHJcblx0XHRcdFx0XHRkYXRhWyBpIF0gPSBTUkdCVG9MaW5lYXIoIGRhdGFbIGkgXSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4ge1xyXG5cdFx0XHRcdGRhdGE6IGRhdGEsXHJcblx0XHRcdFx0d2lkdGg6IGltYWdlLndpZHRoLFxyXG5cdFx0XHRcdGhlaWdodDogaW1hZ2UuaGVpZ2h0XHJcblx0XHRcdH07XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkltYWdlVXRpbHMuc1JHQlRvTGluZWFyKCk6IFVuc3VwcG9ydGVkIGltYWdlIHR5cGUuIE5vIGNvbG9yIHNwYWNlIGNvbnZlcnNpb24gYXBwbGllZC4nICk7XHJcblx0XHRcdHJldHVybiBpbWFnZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IEltYWdlVXRpbHMgfTtcclxuIiwiaW1wb3J0IHsgSW1hZ2VVdGlscyB9IGZyb20gJy4uL2V4dHJhcy9JbWFnZVV0aWxzLmpzJztcclxuaW1wb3J0IHsgZ2VuZXJhdGVVVUlEIH0gZnJvbSAnLi4vbWF0aC9NYXRoVXRpbHMuanMnO1xyXG5cclxubGV0IF9zb3VyY2VJZCA9IDA7XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyB0aGUgZGF0YSBzb3VyY2Ugb2YgYSB0ZXh0dXJlLlxyXG4gKlxyXG4gKiBUaGUgbWFpbiBwdXJwb3NlIG9mIHRoaXMgY2xhc3MgaXMgdG8gZGVjb3VwbGUgdGhlIGRhdGEgZGVmaW5pdGlvbiBmcm9tIHRoZSB0ZXh0dXJlXHJcbiAqIGRlZmluaXRpb24gc28gdGhlIHNhbWUgZGF0YSBjYW4gYmUgdXNlZCB3aXRoIG11bHRpcGxlIHRleHR1cmUgaW5zdGFuY2VzLlxyXG4gKi9cclxuY2xhc3MgU291cmNlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB2aWRlbyB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHthbnl9IFtkYXRhPW51bGxdIC0gVGhlIGRhdGEgZGVmaW5pdGlvbiBvZiBhIHRleHR1cmUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGRhdGEgPSBudWxsICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1NvdXJjZSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgSUQgb2YgdGhlIHNvdXJjZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAbmFtZSBTb3VyY2UjaWRcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqL1xyXG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCAnaWQnLCB7IHZhbHVlOiBfc291cmNlSWQgKysgfSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIFVVSUQgb2YgdGhlIHNvdXJjZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXVpZCA9IGdlbmVyYXRlVVVJRCgpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGRhdGEgZGVmaW5pdGlvbiBvZiBhIHRleHR1cmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2FueX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kYXRhID0gZGF0YTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgcHJvcGVydHkgaXMgb25seSByZWxldmFudCB3aGVuIHtAbGluayBTb3VyY2UjbmVlZHNVcGRhdGV9IGlzIHNldCB0byBgdHJ1ZWAgYW5kXHJcblx0XHQgKiBwcm92aWRlcyBtb3JlIGNvbnRyb2wgb24gaG93IHRleHR1cmUgZGF0YSBzaG91bGQgYmUgcHJvY2Vzc2VkLiBXaGVuIGBkYXRhUmVhZHlgIGlzIHNldFxyXG5cdFx0ICogdG8gYGZhbHNlYCwgdGhlIGVuZ2luZSBwZXJmb3JtcyB0aGUgbWVtb3J5IGFsbG9jYXRpb24gKGlmIG5lY2Vzc2FyeSkgYnV0IGRvZXMgbm90IHRyYW5zZmVyXHJcblx0XHQgKiB0aGUgZGF0YSBpbnRvIHRoZSBHUFUgbWVtb3J5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRhdGFSZWFkeSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIHN0YXJ0cyBhdCBgMGAgYW5kIGNvdW50cyBob3cgbWFueSB0aW1lcyB7QGxpbmsgU291cmNlI25lZWRzVXBkYXRlfSBpcyBzZXQgdG8gYHRydWVgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52ZXJzaW9uID0gMDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBXaGVuIHRoZSBwcm9wZXJ0eSBpcyBzZXQgdG8gYHRydWVgLCB0aGUgZW5naW5lIGFsbG9jYXRlcyB0aGUgbWVtb3J5XHJcblx0ICogZm9yIHRoZSB0ZXh0dXJlIChpZiBuZWNlc3NhcnkpIGFuZCB0cmlnZ2VycyB0aGUgYWN0dWFsIHRleHR1cmUgdXBsb2FkXHJcblx0ICogdG8gdGhlIEdQVSBuZXh0IHRpbWUgdGhlIHNvdXJjZSBpcyB1c2VkLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbHVlXHJcblx0ICovXHJcblx0c2V0IG5lZWRzVXBkYXRlKCB2YWx1ZSApIHtcclxuXHJcblx0XHRpZiAoIHZhbHVlID09PSB0cnVlICkgdGhpcy52ZXJzaW9uICsrO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNlcmlhbGl6ZXMgdGhlIHNvdXJjZSBpbnRvIEpTT04uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gez8oT2JqZWN0fHN0cmluZyl9IG1ldGEgLSBBbiBvcHRpb25hbCB2YWx1ZSBob2xkaW5nIG1ldGEgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlcmlhbGl6YXRpb24uXHJcblx0ICogQHJldHVybiB7T2JqZWN0fSBBIEpTT04gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc2VyaWFsaXplZCBzb3VyY2UuXHJcblx0ICogQHNlZSB7QGxpbmsgT2JqZWN0TG9hZGVyI3BhcnNlfVxyXG5cdCAqL1xyXG5cdHRvSlNPTiggbWV0YSApIHtcclxuXHJcblx0XHRjb25zdCBpc1Jvb3RPYmplY3QgPSAoIG1ldGEgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgbWV0YSA9PT0gJ3N0cmluZycgKTtcclxuXHJcblx0XHRpZiAoICEgaXNSb290T2JqZWN0ICYmIG1ldGEuaW1hZ2VzWyB0aGlzLnV1aWQgXSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIG1ldGEuaW1hZ2VzWyB0aGlzLnV1aWQgXTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3Qgb3V0cHV0ID0ge1xyXG5cdFx0XHR1dWlkOiB0aGlzLnV1aWQsXHJcblx0XHRcdHVybDogJydcclxuXHRcdH07XHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IHRoaXMuZGF0YTtcclxuXHJcblx0XHRpZiAoIGRhdGEgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRsZXQgdXJsO1xyXG5cclxuXHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBkYXRhICkgKSB7XHJcblxyXG5cdFx0XHRcdC8vIGN1YmUgdGV4dHVyZVxyXG5cclxuXHRcdFx0XHR1cmwgPSBbXTtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gZGF0YS5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdGlmICggZGF0YVsgaSBdLmlzRGF0YVRleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHR1cmwucHVzaCggc2VyaWFsaXplSW1hZ2UoIGRhdGFbIGkgXS5pbWFnZSApICk7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdHVybC5wdXNoKCBzZXJpYWxpemVJbWFnZSggZGF0YVsgaSBdICkgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdC8vIHRleHR1cmVcclxuXHJcblx0XHRcdFx0dXJsID0gc2VyaWFsaXplSW1hZ2UoIGRhdGEgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdG91dHB1dC51cmwgPSB1cmw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggISBpc1Jvb3RPYmplY3QgKSB7XHJcblxyXG5cdFx0XHRtZXRhLmltYWdlc1sgdGhpcy51dWlkIF0gPSBvdXRwdXQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBvdXRwdXQ7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNlcmlhbGl6ZUltYWdlKCBpbWFnZSApIHtcclxuXHJcblx0aWYgKCAoIHR5cGVvZiBIVE1MSW1hZ2VFbGVtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBpbWFnZSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQgKSB8fFxyXG5cdFx0KCB0eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGltYWdlIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQgKSB8fFxyXG5cdFx0KCB0eXBlb2YgSW1hZ2VCaXRtYXAgIT09ICd1bmRlZmluZWQnICYmIGltYWdlIGluc3RhbmNlb2YgSW1hZ2VCaXRtYXAgKSApIHtcclxuXHJcblx0XHQvLyBkZWZhdWx0IGltYWdlc1xyXG5cclxuXHRcdHJldHVybiBJbWFnZVV0aWxzLmdldERhdGFVUkwoIGltYWdlICk7XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0aWYgKCBpbWFnZS5kYXRhICkge1xyXG5cclxuXHRcdFx0Ly8gaW1hZ2VzIG9mIERhdGFUZXh0dXJlXHJcblxyXG5cdFx0XHRyZXR1cm4ge1xyXG5cdFx0XHRcdGRhdGE6IEFycmF5LmZyb20oIGltYWdlLmRhdGEgKSxcclxuXHRcdFx0XHR3aWR0aDogaW1hZ2Uud2lkdGgsXHJcblx0XHRcdFx0aGVpZ2h0OiBpbWFnZS5oZWlnaHQsXHJcblx0XHRcdFx0dHlwZTogaW1hZ2UuZGF0YS5jb25zdHJ1Y3Rvci5uYW1lXHJcblx0XHRcdH07XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlRleHR1cmU6IFVuYWJsZSB0byBzZXJpYWxpemUgVGV4dHVyZS4nICk7XHJcblx0XHRcdHJldHVybiB7fTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFNvdXJjZSB9O1xyXG4iLCJpbXBvcnQgeyBFdmVudERpc3BhdGNoZXIgfSBmcm9tICcuLi9jb3JlL0V2ZW50RGlzcGF0Y2hlci5qcyc7XHJcbmltcG9ydCB7XHJcblx0TWlycm9yZWRSZXBlYXRXcmFwcGluZyxcclxuXHRDbGFtcFRvRWRnZVdyYXBwaW5nLFxyXG5cdFJlcGVhdFdyYXBwaW5nLFxyXG5cdFVuc2lnbmVkQnl0ZVR5cGUsXHJcblx0UkdCQUZvcm1hdCxcclxuXHRMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXIsXHJcblx0TGluZWFyRmlsdGVyLFxyXG5cdFVWTWFwcGluZyxcclxuXHROb0NvbG9yU3BhY2UsXHJcbn0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgZ2VuZXJhdGVVVUlEIH0gZnJvbSAnLi4vbWF0aC9NYXRoVXRpbHMuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IyLmpzJztcclxuaW1wb3J0IHsgTWF0cml4MyB9IGZyb20gJy4uL21hdGgvTWF0cml4My5qcyc7XHJcbmltcG9ydCB7IFNvdXJjZSB9IGZyb20gJy4vU291cmNlLmpzJztcclxuXHJcbmxldCBfdGV4dHVyZUlkID0gMDtcclxuXHJcbi8qKlxyXG4gKiBCYXNlIGNsYXNzIGZvciBhbGwgdGV4dHVyZXMuXHJcbiAqXHJcbiAqIE5vdGU6IEFmdGVyIHRoZSBpbml0aWFsIHVzZSBvZiBhIHRleHR1cmUsIGl0cyBkaW1lbnNpb25zLCBmb3JtYXQsIGFuZCB0eXBlXHJcbiAqIGNhbm5vdCBiZSBjaGFuZ2VkLiBJbnN0ZWFkLCBjYWxsIHtAbGluayBUZXh0dXJlI2Rpc3Bvc2V9IG9uIHRoZSB0ZXh0dXJlIGFuZCBpbnN0YW50aWF0ZSBhIG5ldyBvbmUuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBFdmVudERpc3BhdGNoZXJcclxuICovXHJcbmNsYXNzIFRleHR1cmUgZXh0ZW5kcyBFdmVudERpc3BhdGNoZXIge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gez9PYmplY3R9IFtpbWFnZT1UZXh0dXJlLkRFRkFVTFRfSU1BR0VdIC0gVGhlIGltYWdlIGhvbGRpbmcgdGhlIHRleHR1cmUgZGF0YS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW21hcHBpbmc9VGV4dHVyZS5ERUZBVUxUX01BUFBJTkddIC0gVGhlIHRleHR1cmUgbWFwcGluZy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3dyYXBTPUNsYW1wVG9FZGdlV3JhcHBpbmddIC0gVGhlIHdyYXBTIHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbd3JhcFQ9Q2xhbXBUb0VkZ2VXcmFwcGluZ10gLSBUaGUgd3JhcFQgdmFsdWUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFttYWdGaWx0ZXI9TGluZWFyRmlsdGVyXSAtIFRoZSBtYWcgZmlsdGVyIHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbWluRmlsdGVyPUxpbmVhck1pcG1hcExpbmVhckZpbHRlcl0gLSBUaGUgbWluIGZpbHRlciB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2Zvcm1hdD1SR0JBRm9ybWF0XSAtIFRoZSB0ZXh0dXJlIGZvcm1hdC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3R5cGU9VW5zaWduZWRCeXRlVHlwZV0gLSBUaGUgdGV4dHVyZSB0eXBlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbYW5pc290cm9weT1UZXh0dXJlLkRFRkFVTFRfQU5JU09UUk9QWV0gLSBUaGUgYW5pc290cm9weSB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW2NvbG9yU3BhY2U9Tm9Db2xvclNwYWNlXSAtIFRoZSBjb2xvciBzcGFjZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggaW1hZ2UgPSBUZXh0dXJlLkRFRkFVTFRfSU1BR0UsIG1hcHBpbmcgPSBUZXh0dXJlLkRFRkFVTFRfTUFQUElORywgd3JhcFMgPSBDbGFtcFRvRWRnZVdyYXBwaW5nLCB3cmFwVCA9IENsYW1wVG9FZGdlV3JhcHBpbmcsIG1hZ0ZpbHRlciA9IExpbmVhckZpbHRlciwgbWluRmlsdGVyID0gTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyLCBmb3JtYXQgPSBSR0JBRm9ybWF0LCB0eXBlID0gVW5zaWduZWRCeXRlVHlwZSwgYW5pc290cm9weSA9IFRleHR1cmUuREVGQVVMVF9BTklTT1RST1BZLCBjb2xvclNwYWNlID0gTm9Db2xvclNwYWNlICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzVGV4dHVyZSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgSUQgb2YgdGhlIHRleHR1cmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQG5hbWUgVGV4dHVyZSNpZFxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICovXHJcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsICdpZCcsIHsgdmFsdWU6IF90ZXh0dXJlSWQgKysgfSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIFVVSUQgb2YgdGhlIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51dWlkID0gZ2VuZXJhdGVVVUlEKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbmFtZSBvZiB0aGUgbWF0ZXJpYWwuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5uYW1lID0gJyc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZGF0YSBkZWZpbml0aW9uIG9mIGEgdGV4dHVyZS4gQSByZWZlcmVuY2UgdG8gdGhlIGRhdGEgc291cmNlIGNhbiBiZVxyXG5cdFx0ICogc2hhcmVkIGFjcm9zcyB0ZXh0dXJlcy4gVGhpcyBpcyBvZnRlbiB1c2VmdWwgaW4gY29udGV4dCBvZiBzcHJpdGVzaGVldHNcclxuXHRcdCAqIHdoZXJlIG11bHRpcGxlIHRleHR1cmVzIHJlbmRlciB0aGUgc2FtZSBkYXRhIGJ1dCB3aXRoIGRpZmZlcmVudCB0ZXh0dXJlXHJcblx0XHQgKiB0cmFuc2Zvcm1hdGlvbnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1NvdXJjZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zb3VyY2UgPSBuZXcgU291cmNlKCBpbWFnZSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQW4gYXJyYXkgaG9sZGluZyB1c2VyLWRlZmluZWQgbWlwbWFwcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8T2JqZWN0Pn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5taXBtYXBzID0gW107XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3cgdGhlIHRleHR1cmUgaXMgYXBwbGllZCB0byB0aGUgb2JqZWN0LiBUaGUgdmFsdWUgYFVWTWFwcGluZ2BcclxuXHRcdCAqIGlzIHRoZSBkZWZhdWx0LCB3aGVyZSB0ZXh0dXJlIG9yIHV2IGNvb3JkaW5hdGVzIGFyZSB1c2VkIHRvIGFwcGx5IHRoZSBtYXAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeyhVVk1hcHBpbmd8Q3ViZVJlZmxlY3Rpb25NYXBwaW5nfEN1YmVSZWZyYWN0aW9uTWFwcGluZ3xFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZ3xFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZ3xDdWJlVVZSZWZsZWN0aW9uTWFwcGluZyl9XHJcblx0XHQgKiBAZGVmYXVsdCBVVk1hcHBpbmdcclxuXHRcdCovXHJcblx0XHR0aGlzLm1hcHBpbmcgPSBtYXBwaW5nO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogTGV0cyB5b3Ugc2VsZWN0IHRoZSB1diBhdHRyaWJ1dGUgdG8gbWFwIHRoZSB0ZXh0dXJlIHRvLiBgMGAgZm9yIGB1dmAsXHJcblx0XHQgKiBgMWAgZm9yIGB1djFgLCBgMmAgZm9yIGB1djJgIGFuZCBgM2AgZm9yIGB1djNgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2hhbm5lbCA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGRlZmluZXMgaG93IHRoZSB0ZXh0dXJlIGlzIHdyYXBwZWQgaG9yaXpvbnRhbGx5IGFuZCBjb3JyZXNwb25kcyB0b1xyXG5cdFx0ICogKlUqIGluIFVWIG1hcHBpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeyhSZXBlYXRXcmFwcGluZ3xDbGFtcFRvRWRnZVdyYXBwaW5nfE1pcnJvcmVkUmVwZWF0V3JhcHBpbmcpfVxyXG5cdFx0ICogQGRlZmF1bHQgQ2xhbXBUb0VkZ2VXcmFwcGluZ1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLndyYXBTID0gd3JhcFM7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGRlZmluZXMgaG93IHRoZSB0ZXh0dXJlIGlzIHdyYXBwZWQgaG9yaXpvbnRhbGx5IGFuZCBjb3JyZXNwb25kcyB0b1xyXG5cdFx0ICogKlYqIGluIFVWIG1hcHBpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeyhSZXBlYXRXcmFwcGluZ3xDbGFtcFRvRWRnZVdyYXBwaW5nfE1pcnJvcmVkUmVwZWF0V3JhcHBpbmcpfVxyXG5cdFx0ICogQGRlZmF1bHQgQ2xhbXBUb0VkZ2VXcmFwcGluZ1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLndyYXBUID0gd3JhcFQ7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3cgdGhlIHRleHR1cmUgaXMgc2FtcGxlZCB3aGVuIGEgdGV4ZWwgY292ZXJzIG1vcmUgdGhhbiBvbmUgcGl4ZWwuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeyhOZWFyZXN0RmlsdGVyfE5lYXJlc3RNaXBtYXBOZWFyZXN0RmlsdGVyfE5lYXJlc3RNaXBtYXBMaW5lYXJGaWx0ZXJ8TGluZWFyRmlsdGVyfExpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXJ8TGluZWFyTWlwbWFwTGluZWFyRmlsdGVyKX1cclxuXHRcdCAqIEBkZWZhdWx0IExpbmVhckZpbHRlclxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1hZ0ZpbHRlciA9IG1hZ0ZpbHRlcjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvdyB0aGUgdGV4dHVyZSBpcyBzYW1wbGVkIHdoZW4gYSB0ZXhlbCBjb3ZlcnMgbGVzcyB0aGFuIG9uZSBwaXhlbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KE5lYXJlc3RGaWx0ZXJ8TmVhcmVzdE1pcG1hcE5lYXJlc3RGaWx0ZXJ8TmVhcmVzdE1pcG1hcExpbmVhckZpbHRlcnxMaW5lYXJGaWx0ZXJ8TGluZWFyTWlwbWFwTmVhcmVzdEZpbHRlcnxMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXIpfVxyXG5cdFx0ICogQGRlZmF1bHQgTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWluRmlsdGVyID0gbWluRmlsdGVyO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG51bWJlciBvZiBzYW1wbGVzIHRha2VuIGFsb25nIHRoZSBheGlzIHRocm91Z2ggdGhlIHBpeGVsIHRoYXQgaGFzIHRoZVxyXG5cdFx0ICogaGlnaGVzdCBkZW5zaXR5IG9mIHRleGVscy4gQnkgZGVmYXVsdCwgdGhpcyB2YWx1ZSBpcyBgMWAuIEEgaGlnaGVyIHZhbHVlXHJcblx0XHQgKiBnaXZlcyBhIGxlc3MgYmx1cnJ5IHJlc3VsdCB0aGFuIGEgYmFzaWMgbWlwbWFwLCBhdCB0aGUgY29zdCBvZiBtb3JlXHJcblx0XHQgKiB0ZXh0dXJlIHNhbXBsZXMgYmVpbmcgdXNlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFuaXNvdHJvcHkgPSBhbmlzb3Ryb3B5O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGZvcm1hdCBvZiB0aGUgdGV4dHVyZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgUkdCQUZvcm1hdFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZvcm1hdCA9IGZvcm1hdDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBkZWZhdWx0IGludGVybmFsIGZvcm1hdCBpcyBkZXJpdmVkIGZyb20ge0BsaW5rIFRleHR1cmUjZm9ybWF0fSBhbmQge0BsaW5rIFRleHR1cmUjdHlwZX0gYW5kXHJcblx0XHQgKiBkZWZpbmVzIGhvdyB0aGUgdGV4dHVyZSBkYXRhIGlzIGdvaW5nIHRvIGJlIHN0b3JlZCBvbiB0aGUgR1BVLlxyXG5cdFx0ICpcclxuXHRcdCAqIFRoaXMgcHJvcGVydHkgYWxsb3dzIHRvIG92ZXJ3cml0ZSB0aGUgZGVmYXVsdCBmb3JtYXQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9zdHJpbmd9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaW50ZXJuYWxGb3JtYXQgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGRhdGEgdHlwZSBvZiB0aGUgdGV4dHVyZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgVW5zaWduZWRCeXRlVHlwZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnR5cGUgPSB0eXBlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG93IG11Y2ggYSBzaW5nbGUgcmVwZXRpdGlvbiBvZiB0aGUgdGV4dHVyZSBpcyBvZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nLFxyXG5cdFx0ICogaW4gZWFjaCBkaXJlY3Rpb24gVSBhbmQgVi4gVHlwaWNhbCByYW5nZSBpcyBgMC4wYCB0byBgMS4wYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yMn1cclxuXHRcdCAqIEBkZWZhdWx0ICgwLDApXHJcblx0XHQgKi9cclxuXHRcdHRoaXMub2Zmc2V0ID0gbmV3IFZlY3RvcjIoIDAsIDAgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvdyBtYW55IHRpbWVzIHRoZSB0ZXh0dXJlIGlzIHJlcGVhdGVkIGFjcm9zcyB0aGUgc3VyZmFjZSwgaW4gZWFjaFxyXG5cdFx0ICogZGlyZWN0aW9uIFUgYW5kIFYuIElmIHJlcGVhdCBpcyBzZXQgZ3JlYXRlciB0aGFuIGAxYCBpbiBlaXRoZXIgZGlyZWN0aW9uLFxyXG5cdFx0ICogdGhlIGNvcnJlc3BvbmRpbmcgd3JhcCBwYXJhbWV0ZXIgc2hvdWxkIGFsc28gYmUgc2V0IHRvIGBSZXBlYXRXcmFwcGluZ2BcclxuXHRcdCAqIG9yIGBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nYCB0byBhY2hpZXZlIHRoZSBkZXNpcmVkIHRpbGluZyBlZmZlY3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjJ9XHJcblx0XHQgKiBAZGVmYXVsdCAoMSwxKVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJlcGVhdCA9IG5ldyBWZWN0b3IyKCAxLCAxICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcG9pbnQgYXJvdW5kIHdoaWNoIHJvdGF0aW9uIG9jY3Vycy4gQSB2YWx1ZSBvZiBgKDAuNSwgMC41KWAgY29ycmVzcG9uZHNcclxuXHRcdCAqIHRvIHRoZSBjZW50ZXIgb2YgdGhlIHRleHR1cmUuIERlZmF1bHQgaXMgYCgwLCAwKWAsIHRoZSBsb3dlciBsZWZ0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3IyfVxyXG5cdFx0ICogQGRlZmF1bHQgKDAsMClcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jZW50ZXIgPSBuZXcgVmVjdG9yMiggMCwgMCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG93IG11Y2ggdGhlIHRleHR1cmUgaXMgcm90YXRlZCBhcm91bmQgdGhlIGNlbnRlciBwb2ludCwgaW4gcmFkaWFucy5cclxuXHRcdCAqIFBvc2l0aXZlIHZhbHVlcyBhcmUgY291bnRlci1jbG9ja3dpc2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yb3RhdGlvbiA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRvIHVwZGF0ZSB0aGUgdGV4dHVyZSdzIHV2LXRyYW5zZm9ybWF0aW9uIHtAbGluayBUZXh0dXJlI21hdHJpeH1cclxuXHRcdCAqIGZyb20gdGhlIHByb3BlcnRpZXMge0BsaW5rIFRleHR1cmUjb2Zmc2V0fSwge0BsaW5rIFRleHR1cmUjcmVwZWF0fSxcclxuXHRcdCAqIHtAbGluayBUZXh0dXJlI3JvdGF0aW9ufSwgYW5kIHtAbGluayBUZXh0dXJlI2NlbnRlcn0uXHJcblx0XHQgKlxyXG5cdFx0ICogU2V0IHRoaXMgdG8gYGZhbHNlYCBpZiB5b3UgYXJlIHNwZWNpZnlpbmcgdGhlIHV2LXRyYW5zZm9ybSBtYXRyaXggZGlyZWN0bHkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdXYtdHJhbnNmb3JtYXRpb24gbWF0cml4IG9mIHRoZSB0ZXh0dXJlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtNYXRyaXgzfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1hdHJpeCA9IG5ldyBNYXRyaXgzKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRvIGdlbmVyYXRlIG1pcG1hcHMgKGlmIHBvc3NpYmxlKSBmb3IgYSB0ZXh0dXJlLlxyXG5cdFx0ICpcclxuXHRcdCAqIFNldCB0aGlzIHRvIGBmYWxzZWAgaWYgeW91IGFyZSBjcmVhdGluZyBtaXBtYXBzIG1hbnVhbGx5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdlbmVyYXRlTWlwbWFwcyA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBJZiBzZXQgdG8gYHRydWVgLCB0aGUgYWxwaGEgY2hhbm5lbCwgaWYgcHJlc2VudCwgaXMgbXVsdGlwbGllZCBpbnRvIHRoZVxyXG5cdFx0ICogY29sb3IgY2hhbm5lbHMgd2hlbiB0aGUgdGV4dHVyZSBpcyB1cGxvYWRlZCB0byB0aGUgR1BVLlxyXG5cdFx0ICpcclxuXHRcdCAqIE5vdGUgdGhhdCB0aGlzIHByb3BlcnR5IGhhcyBubyBlZmZlY3Qgd2hlbiB1c2luZyBgSW1hZ2VCaXRtYXBgLiBZb3UgbmVlZCB0b1xyXG5cdFx0ICogY29uZmlndXJlIHByZW11bHRpcGx5IGFscGhhIG9uIGJpdG1hcCBjcmVhdGlvbiBpbnN0ZWFkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wcmVtdWx0aXBseUFscGhhID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBJZiBzZXQgdG8gYHRydWVgLCB0aGUgdGV4dHVyZSBpcyBmbGlwcGVkIGFsb25nIHRoZSB2ZXJ0aWNhbCBheGlzIHdoZW5cclxuXHRcdCAqIHVwbG9hZGVkIHRvIHRoZSBHUFUuXHJcblx0XHQgKlxyXG5cdFx0ICogTm90ZSB0aGF0IHRoaXMgcHJvcGVydHkgaGFzIG5vIGVmZmVjdCB3aGVuIHVzaW5nIGBJbWFnZUJpdG1hcGAuIFlvdSBuZWVkIHRvXHJcblx0XHQgKiBjb25maWd1cmUgdGhlIGZsaXAgb24gYml0bWFwIGNyZWF0aW9uIGluc3RlYWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZmxpcFkgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU3BlY2lmaWVzIHRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzIGZvciB0aGUgc3RhcnQgb2YgZWFjaCBwaXhlbCByb3cgaW4gbWVtb3J5LlxyXG5cdFx0ICogVGhlIGFsbG93YWJsZSB2YWx1ZXMgYXJlIGAxYCAoYnl0ZS1hbGlnbm1lbnQpLCBgMmAgKHJvd3MgYWxpZ25lZCB0byBldmVuLW51bWJlcmVkIGJ5dGVzKSxcclxuXHRcdCAqIGA0YCAod29yZC1hbGlnbm1lbnQpLCBhbmQgYDhgIChyb3dzIHN0YXJ0IG9uIGRvdWJsZS13b3JkIGJvdW5kYXJpZXMpLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCA0XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudW5wYWNrQWxpZ25tZW50ID0gNDtcdC8vIHZhbGlkIHZhbHVlczogMSwgMiwgNCwgOCAoc2VlIGh0dHA6Ly93d3cua2hyb25vcy5vcmcvb3BlbmdsZXMvc2RrL2RvY3MvbWFuL3hodG1sL2dsUGl4ZWxTdG9yZWkueG1sKVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGV4dHVyZXMgY29udGFpbmluZyBjb2xvciBkYXRhIHNob3VsZCBiZSBhbm5vdGF0ZWQgd2l0aCBgU1JHQkNvbG9yU3BhY2VgIG9yIGBMaW5lYXJTUkdCQ29sb3JTcGFjZWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqIEBkZWZhdWx0IE5vQ29sb3JTcGFjZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvbG9yU3BhY2UgPSBjb2xvclNwYWNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQW4gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gc3RvcmUgY3VzdG9tIGRhdGEgYWJvdXQgdGhlIHRleHR1cmUuIEl0XHJcblx0XHQgKiBzaG91bGQgbm90IGhvbGQgcmVmZXJlbmNlcyB0byBmdW5jdGlvbnMgYXMgdGhlc2Ugd2lsbCBub3QgYmUgY2xvbmVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXNlckRhdGEgPSB7fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgc3RhcnRzIGF0IGAwYCBhbmQgY291bnRzIGhvdyBtYW55IHRpbWVzIHtAbGluayBUZXh0dXJlI25lZWRzVXBkYXRlfSBpcyBzZXQgdG8gYHRydWVgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52ZXJzaW9uID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgY2FsbGJhY2sgZnVuY3Rpb24sIGNhbGxlZCB3aGVuIHRoZSB0ZXh0dXJlIGlzIHVwZGF0ZWQgKGUuZy4sIHdoZW5cclxuXHRcdCAqIHtAbGluayBUZXh0dXJlI25lZWRzVXBkYXRlfSBoYXMgYmVlbiBzZXQgdG8gdHJ1ZSBhbmQgdGhlbiB0aGUgdGV4dHVyZSBpcyB1c2VkKS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P0Z1bmN0aW9ufVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm9uVXBkYXRlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIG9wdGlvbmFsIGJhY2sgcmVmZXJlbmNlIHRvIHRoZSB0ZXh0dXJlcyByZW5kZXIgdGFyZ2V0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/KFJlbmRlclRhcmdldHxXZWJHTFJlbmRlclRhcmdldCl9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0ID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEluZGljYXRlcyB3aGV0aGVyIGEgdGV4dHVyZSBiZWxvbmdzIHRvIGEgcmVuZGVyIHRhcmdldCBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNSZW5kZXJUYXJnZXRUZXh0dXJlID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIHRleHR1cmUgc2hvdWxkIGJlIHByb2Nlc3NlZCBieSBgUE1SRU1HZW5lcmF0b3JgIG9yIG5vdFxyXG5cdFx0ICogKG9ubHkgcmVsZXZhbnQgZm9yIHJlbmRlciB0YXJnZXQgdGV4dHVyZXMpLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wbXJlbVZlcnNpb24gPSAwO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBpbWFnZSBvYmplY3QgaG9sZGluZyB0aGUgdGV4dHVyZSBkYXRhLlxyXG5cdCAqXHJcblx0ICogQHR5cGUgez9PYmplY3R9XHJcblx0ICovXHJcblx0Z2V0IGltYWdlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnNvdXJjZS5kYXRhO1xyXG5cclxuXHR9XHJcblxyXG5cdHNldCBpbWFnZSggdmFsdWUgPSBudWxsICkge1xyXG5cclxuXHRcdHRoaXMuc291cmNlLmRhdGEgPSB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoZSB0ZXh0dXJlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBmcm9tIHRoZSBmcm9tIHRoZSBwcm9wZXJ0aWVzIHtAbGluayBUZXh0dXJlI29mZnNldH0sXHJcblx0ICoge0BsaW5rIFRleHR1cmUjcmVwZWF0fSwge0BsaW5rIFRleHR1cmUjcm90YXRpb259LCBhbmQge0BsaW5rIFRleHR1cmUjY2VudGVyfS5cclxuXHQgKi9cclxuXHR1cGRhdGVNYXRyaXgoKSB7XHJcblxyXG5cdFx0dGhpcy5tYXRyaXguc2V0VXZUcmFuc2Zvcm0oIHRoaXMub2Zmc2V0LngsIHRoaXMub2Zmc2V0LnksIHRoaXMucmVwZWF0LngsIHRoaXMucmVwZWF0LnksIHRoaXMucm90YXRpb24sIHRoaXMuY2VudGVyLngsIHRoaXMuY2VudGVyLnkgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbmV3IHRleHR1cmUgd2l0aCBjb3BpZWQgdmFsdWVzIGZyb20gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1RleHR1cmV9IEEgY2xvbmUgb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjbG9uZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29waWVzIHRoZSB2YWx1ZXMgb2YgdGhlIGdpdmVuIHRleHR1cmUgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gc291cmNlIC0gVGhlIHRleHR1cmUgdG8gY29weS5cclxuXHQgKiBAcmV0dXJuIHtUZXh0dXJlfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHR0aGlzLm5hbWUgPSBzb3VyY2UubmFtZTtcclxuXHJcblx0XHR0aGlzLnNvdXJjZSA9IHNvdXJjZS5zb3VyY2U7XHJcblx0XHR0aGlzLm1pcG1hcHMgPSBzb3VyY2UubWlwbWFwcy5zbGljZSggMCApO1xyXG5cclxuXHRcdHRoaXMubWFwcGluZyA9IHNvdXJjZS5tYXBwaW5nO1xyXG5cdFx0dGhpcy5jaGFubmVsID0gc291cmNlLmNoYW5uZWw7XHJcblxyXG5cdFx0dGhpcy53cmFwUyA9IHNvdXJjZS53cmFwUztcclxuXHRcdHRoaXMud3JhcFQgPSBzb3VyY2Uud3JhcFQ7XHJcblxyXG5cdFx0dGhpcy5tYWdGaWx0ZXIgPSBzb3VyY2UubWFnRmlsdGVyO1xyXG5cdFx0dGhpcy5taW5GaWx0ZXIgPSBzb3VyY2UubWluRmlsdGVyO1xyXG5cclxuXHRcdHRoaXMuYW5pc290cm9weSA9IHNvdXJjZS5hbmlzb3Ryb3B5O1xyXG5cclxuXHRcdHRoaXMuZm9ybWF0ID0gc291cmNlLmZvcm1hdDtcclxuXHRcdHRoaXMuaW50ZXJuYWxGb3JtYXQgPSBzb3VyY2UuaW50ZXJuYWxGb3JtYXQ7XHJcblx0XHR0aGlzLnR5cGUgPSBzb3VyY2UudHlwZTtcclxuXHJcblx0XHR0aGlzLm9mZnNldC5jb3B5KCBzb3VyY2Uub2Zmc2V0ICk7XHJcblx0XHR0aGlzLnJlcGVhdC5jb3B5KCBzb3VyY2UucmVwZWF0ICk7XHJcblx0XHR0aGlzLmNlbnRlci5jb3B5KCBzb3VyY2UuY2VudGVyICk7XHJcblx0XHR0aGlzLnJvdGF0aW9uID0gc291cmNlLnJvdGF0aW9uO1xyXG5cclxuXHRcdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IHNvdXJjZS5tYXRyaXhBdXRvVXBkYXRlO1xyXG5cdFx0dGhpcy5tYXRyaXguY29weSggc291cmNlLm1hdHJpeCApO1xyXG5cclxuXHRcdHRoaXMuZ2VuZXJhdGVNaXBtYXBzID0gc291cmNlLmdlbmVyYXRlTWlwbWFwcztcclxuXHRcdHRoaXMucHJlbXVsdGlwbHlBbHBoYSA9IHNvdXJjZS5wcmVtdWx0aXBseUFscGhhO1xyXG5cdFx0dGhpcy5mbGlwWSA9IHNvdXJjZS5mbGlwWTtcclxuXHRcdHRoaXMudW5wYWNrQWxpZ25tZW50ID0gc291cmNlLnVucGFja0FsaWdubWVudDtcclxuXHRcdHRoaXMuY29sb3JTcGFjZSA9IHNvdXJjZS5jb2xvclNwYWNlO1xyXG5cclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0ID0gc291cmNlLnJlbmRlclRhcmdldDtcclxuXHRcdHRoaXMuaXNSZW5kZXJUYXJnZXRUZXh0dXJlID0gc291cmNlLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZTtcclxuXHJcblx0XHR0aGlzLnVzZXJEYXRhID0gSlNPTi5wYXJzZSggSlNPTi5zdHJpbmdpZnkoIHNvdXJjZS51c2VyRGF0YSApICk7XHJcblxyXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2VyaWFsaXplcyB0aGUgdGV4dHVyZSBpbnRvIEpTT04uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gez8oT2JqZWN0fHN0cmluZyl9IG1ldGEgLSBBbiBvcHRpb25hbCB2YWx1ZSBob2xkaW5nIG1ldGEgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlcmlhbGl6YXRpb24uXHJcblx0ICogQHJldHVybiB7T2JqZWN0fSBBIEpTT04gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc2VyaWFsaXplZCB0ZXh0dXJlLlxyXG5cdCAqIEBzZWUge0BsaW5rIE9iamVjdExvYWRlciNwYXJzZX1cclxuXHQgKi9cclxuXHR0b0pTT04oIG1ldGEgKSB7XHJcblxyXG5cdFx0Y29uc3QgaXNSb290T2JqZWN0ID0gKCBtZXRhID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIG1ldGEgPT09ICdzdHJpbmcnICk7XHJcblxyXG5cdFx0aWYgKCAhIGlzUm9vdE9iamVjdCAmJiBtZXRhLnRleHR1cmVzWyB0aGlzLnV1aWQgXSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIG1ldGEudGV4dHVyZXNbIHRoaXMudXVpZCBdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBvdXRwdXQgPSB7XHJcblxyXG5cdFx0XHRtZXRhZGF0YToge1xyXG5cdFx0XHRcdHZlcnNpb246IDQuNixcclxuXHRcdFx0XHR0eXBlOiAnVGV4dHVyZScsXHJcblx0XHRcdFx0Z2VuZXJhdG9yOiAnVGV4dHVyZS50b0pTT04nXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHR1dWlkOiB0aGlzLnV1aWQsXHJcblx0XHRcdG5hbWU6IHRoaXMubmFtZSxcclxuXHJcblx0XHRcdGltYWdlOiB0aGlzLnNvdXJjZS50b0pTT04oIG1ldGEgKS51dWlkLFxyXG5cclxuXHRcdFx0bWFwcGluZzogdGhpcy5tYXBwaW5nLFxyXG5cdFx0XHRjaGFubmVsOiB0aGlzLmNoYW5uZWwsXHJcblxyXG5cdFx0XHRyZXBlYXQ6IFsgdGhpcy5yZXBlYXQueCwgdGhpcy5yZXBlYXQueSBdLFxyXG5cdFx0XHRvZmZzZXQ6IFsgdGhpcy5vZmZzZXQueCwgdGhpcy5vZmZzZXQueSBdLFxyXG5cdFx0XHRjZW50ZXI6IFsgdGhpcy5jZW50ZXIueCwgdGhpcy5jZW50ZXIueSBdLFxyXG5cdFx0XHRyb3RhdGlvbjogdGhpcy5yb3RhdGlvbixcclxuXHJcblx0XHRcdHdyYXA6IFsgdGhpcy53cmFwUywgdGhpcy53cmFwVCBdLFxyXG5cclxuXHRcdFx0Zm9ybWF0OiB0aGlzLmZvcm1hdCxcclxuXHRcdFx0aW50ZXJuYWxGb3JtYXQ6IHRoaXMuaW50ZXJuYWxGb3JtYXQsXHJcblx0XHRcdHR5cGU6IHRoaXMudHlwZSxcclxuXHRcdFx0Y29sb3JTcGFjZTogdGhpcy5jb2xvclNwYWNlLFxyXG5cclxuXHRcdFx0bWluRmlsdGVyOiB0aGlzLm1pbkZpbHRlcixcclxuXHRcdFx0bWFnRmlsdGVyOiB0aGlzLm1hZ0ZpbHRlcixcclxuXHRcdFx0YW5pc290cm9weTogdGhpcy5hbmlzb3Ryb3B5LFxyXG5cclxuXHRcdFx0ZmxpcFk6IHRoaXMuZmxpcFksXHJcblxyXG5cdFx0XHRnZW5lcmF0ZU1pcG1hcHM6IHRoaXMuZ2VuZXJhdGVNaXBtYXBzLFxyXG5cdFx0XHRwcmVtdWx0aXBseUFscGhhOiB0aGlzLnByZW11bHRpcGx5QWxwaGEsXHJcblx0XHRcdHVucGFja0FsaWdubWVudDogdGhpcy51bnBhY2tBbGlnbm1lbnRcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdGlmICggT2JqZWN0LmtleXMoIHRoaXMudXNlckRhdGEgKS5sZW5ndGggPiAwICkgb3V0cHV0LnVzZXJEYXRhID0gdGhpcy51c2VyRGF0YTtcclxuXHJcblx0XHRpZiAoICEgaXNSb290T2JqZWN0ICkge1xyXG5cclxuXHRcdFx0bWV0YS50ZXh0dXJlc1sgdGhpcy51dWlkIF0gPSBvdXRwdXQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBvdXRwdXQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRnJlZXMgdGhlIEdQVS1yZWxhdGVkIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhpcyBpbnN0YW5jZS4gQ2FsbCB0aGlzXHJcblx0ICogbWV0aG9kIHdoZW5ldmVyIHRoaXMgaW5zdGFuY2UgaXMgbm8gbG9uZ2VyIHVzZWQgaW4geW91ciBhcHAuXHJcblx0ICpcclxuXHQgKiBAZmlyZXMgVGV4dHVyZSNkaXNwb3NlXHJcblx0ICovXHJcblx0ZGlzcG9zZSgpIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEZpcmVzIHdoZW4gdGhlIHRleHR1cmUgaGFzIGJlZW4gZGlzcG9zZWQgb2YuXHJcblx0XHQgKlxyXG5cdFx0ICogQGV2ZW50IFRleHR1cmUjZGlzcG9zZVxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdkaXNwb3NlJyB9ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVHJhbnNmb3JtcyB0aGUgZ2l2ZW4gdXYgdmVjdG9yIHdpdGggdGhlIHRleHR1cmVzIHV2IHRyYW5zZm9ybWF0aW9uIG1hdHJpeC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gdXYgLSBUaGUgdXYgdmVjdG9yLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IFRoZSB0cmFuc2Zvcm1lZCB1diB2ZWN0b3IuXHJcblx0ICovXHJcblx0dHJhbnNmb3JtVXYoIHV2ICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5tYXBwaW5nICE9PSBVVk1hcHBpbmcgKSByZXR1cm4gdXY7XHJcblxyXG5cdFx0dXYuYXBwbHlNYXRyaXgzKCB0aGlzLm1hdHJpeCApO1xyXG5cclxuXHRcdGlmICggdXYueCA8IDAgfHwgdXYueCA+IDEgKSB7XHJcblxyXG5cdFx0XHRzd2l0Y2ggKCB0aGlzLndyYXBTICkge1xyXG5cclxuXHRcdFx0XHRjYXNlIFJlcGVhdFdyYXBwaW5nOlxyXG5cclxuXHRcdFx0XHRcdHV2LnggPSB1di54IC0gTWF0aC5mbG9vciggdXYueCApO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdGNhc2UgQ2xhbXBUb0VkZ2VXcmFwcGluZzpcclxuXHJcblx0XHRcdFx0XHR1di54ID0gdXYueCA8IDAgPyAwIDogMTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRjYXNlIE1pcnJvcmVkUmVwZWF0V3JhcHBpbmc6XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBNYXRoLmFicyggTWF0aC5mbG9vciggdXYueCApICUgMiApID09PSAxICkge1xyXG5cclxuXHRcdFx0XHRcdFx0dXYueCA9IE1hdGguY2VpbCggdXYueCApIC0gdXYueDtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0dXYueCA9IHV2LnggLSBNYXRoLmZsb29yKCB1di54ICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHV2LnkgPCAwIHx8IHV2LnkgPiAxICkge1xyXG5cclxuXHRcdFx0c3dpdGNoICggdGhpcy53cmFwVCApIHtcclxuXHJcblx0XHRcdFx0Y2FzZSBSZXBlYXRXcmFwcGluZzpcclxuXHJcblx0XHRcdFx0XHR1di55ID0gdXYueSAtIE1hdGguZmxvb3IoIHV2LnkgKTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRjYXNlIENsYW1wVG9FZGdlV3JhcHBpbmc6XHJcblxyXG5cdFx0XHRcdFx0dXYueSA9IHV2LnkgPCAwID8gMCA6IDE7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0Y2FzZSBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nOlxyXG5cclxuXHRcdFx0XHRcdGlmICggTWF0aC5hYnMoIE1hdGguZmxvb3IoIHV2LnkgKSAlIDIgKSA9PT0gMSApIHtcclxuXHJcblx0XHRcdFx0XHRcdHV2LnkgPSBNYXRoLmNlaWwoIHV2LnkgKSAtIHV2Lnk7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdHV2LnkgPSB1di55IC0gTWF0aC5mbG9vciggdXYueSApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aGlzLmZsaXBZICkge1xyXG5cclxuXHRcdFx0dXYueSA9IDEgLSB1di55O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdXY7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0dGluZyB0aGlzIHByb3BlcnR5IHRvIGB0cnVlYCBpbmRpY2F0ZXMgdGhlIGVuZ2luZSB0aGUgdGV4dHVyZVxyXG5cdCAqIG11c3QgYmUgdXBkYXRlZCBpbiB0aGUgbmV4dCByZW5kZXIuIFRoaXMgdHJpZ2dlcnMgYSB0ZXh0dXJlIHVwbG9hZFxyXG5cdCAqIHRvIHRoZSBHUFUgYW5kIGVuc3VyZXMgY29ycmVjdCB0ZXh0dXJlIHBhcmFtZXRlciBjb25maWd1cmF0aW9uLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbHVlXHJcblx0ICovXHJcblx0c2V0IG5lZWRzVXBkYXRlKCB2YWx1ZSApIHtcclxuXHJcblx0XHRpZiAoIHZhbHVlID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0dGhpcy52ZXJzaW9uICsrO1xyXG5cdFx0XHR0aGlzLnNvdXJjZS5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHRpbmcgdGhpcyBwcm9wZXJ0eSB0byBgdHJ1ZWAgaW5kaWNhdGVzIHRoZSBlbmdpbmUgdGhlIFBNUkVNXHJcblx0ICogbXVzdCBiZSByZWdlbmVyYXRlZC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0ICogQHBhcmFtIHtib29sZWFufSB2YWx1ZVxyXG5cdCAqL1xyXG5cdHNldCBuZWVkc1BNUkVNVXBkYXRlKCB2YWx1ZSApIHtcclxuXHJcblx0XHRpZiAoIHZhbHVlID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0dGhpcy5wbXJlbVZlcnNpb24gKys7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogVGhlIGRlZmF1bHQgaW1hZ2UgZm9yIGFsbCB0ZXh0dXJlcy5cclxuICpcclxuICogQHN0YXRpY1xyXG4gKiBAdHlwZSB7P0ltYWdlfVxyXG4gKiBAZGVmYXVsdCBudWxsXHJcbiAqL1xyXG5UZXh0dXJlLkRFRkFVTFRfSU1BR0UgPSBudWxsO1xyXG5cclxuLyoqXHJcbiAqIFRoZSBkZWZhdWx0IG1hcHBpbmcgZm9yIGFsbCB0ZXh0dXJlcy5cclxuICpcclxuICogQHN0YXRpY1xyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAZGVmYXVsdCBVVk1hcHBpbmdcclxuICovXHJcblRleHR1cmUuREVGQVVMVF9NQVBQSU5HID0gVVZNYXBwaW5nO1xyXG5cclxuLyoqXHJcbiAqIFRoZSBkZWZhdWx0IGFuaXNvdHJvcHkgdmFsdWUgZm9yIGFsbCB0ZXh0dXJlcy5cclxuICpcclxuICogQHN0YXRpY1xyXG4gKiBAdHlwZSB7bnVtYmVyfVxyXG4gKiBAZGVmYXVsdCAxXHJcbiAqL1xyXG5UZXh0dXJlLkRFRkFVTFRfQU5JU09UUk9QWSA9IDE7XHJcblxyXG5leHBvcnQgeyBUZXh0dXJlIH07XHJcbiIsImltcG9ydCB7IGNsYW1wIH0gZnJvbSAnLi9NYXRoVXRpbHMuanMnO1xyXG5cclxuLyoqXHJcbiAqIENsYXNzIHJlcHJlc2VudGluZyBhIDREIHZlY3Rvci4gQSA0RCB2ZWN0b3IgaXMgYW4gb3JkZXJlZCBxdWFkcnVwbGV0IG9mIG51bWJlcnNcclxuICogKGxhYmVsZWQgeCwgeSwgeiBhbmQgdyksIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlcHJlc2VudCBhIG51bWJlciBvZiB0aGluZ3MsIHN1Y2ggYXM6XHJcbiAqXHJcbiAqIC0gQSBwb2ludCBpbiA0RCBzcGFjZS5cclxuICogLSBBIGRpcmVjdGlvbiBhbmQgbGVuZ3RoIGluIDREIHNwYWNlLiBJbiB0aHJlZS5qcyB0aGUgbGVuZ3RoIHdpbGxcclxuICogYWx3YXlzIGJlIHRoZSBFdWNsaWRlYW4gZGlzdGFuY2Uoc3RyYWlnaHQtbGluZSBkaXN0YW5jZSkgZnJvbSBgKDAsIDAsIDAsIDApYCB0byBgKHgsIHksIHosIHcpYFxyXG4gKiBhbmQgdGhlIGRpcmVjdGlvbiBpcyBhbHNvIG1lYXN1cmVkIGZyb20gYCgwLCAwLCAwLCAwKWAgdG93YXJkcyBgKHgsIHksIHosIHcpYC5cclxuICogLSBBbnkgYXJiaXRyYXJ5IG9yZGVyZWQgcXVhZHJ1cGxldCBvZiBudW1iZXJzLlxyXG4gKlxyXG4gKiBUaGVyZSBhcmUgb3RoZXIgdGhpbmdzIGEgNEQgdmVjdG9yIGNhbiBiZSB1c2VkIHRvIHJlcHJlc2VudCwgaG93ZXZlciB0aGVzZVxyXG4gKiBhcmUgdGhlIG1vc3QgY29tbW9uIHVzZXMgaW4gKnRocmVlLmpzKi5cclxuICpcclxuICogSXRlcmF0aW5nIHRocm91Z2ggYSB2ZWN0b3IgaW5zdGFuY2Ugd2lsbCB5aWVsZCBpdHMgY29tcG9uZW50cyBgKHgsIHksIHosIHcpYCBpblxyXG4gKiB0aGUgY29ycmVzcG9uZGluZyBvcmRlci5cclxuICogYGBganNcclxuICogY29uc3QgYSA9IG5ldyBUSFJFRS5WZWN0b3I0KCAwLCAxLCAwLCAwICk7XHJcbiAqXHJcbiAqIC8vbm8gYXJndW1lbnRzOyB3aWxsIGJlIGluaXRpYWxpc2VkIHRvICgwLCAwLCAwLCAxKVxyXG4gKiBjb25zdCBiID0gbmV3IFRIUkVFLlZlY3RvcjQoICk7XHJcbiAqXHJcbiAqIGNvbnN0IGQgPSBhLmRvdCggYiApO1xyXG4gKiBgYGBcclxuICovXHJcbmNsYXNzIFZlY3RvcjQge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IDREIHZlY3Rvci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbeD0wXSAtIFRoZSB4IHZhbHVlIG9mIHRoaXMgdmVjdG9yLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbeT0wXSAtIFRoZSB5IHZhbHVlIG9mIHRoaXMgdmVjdG9yLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbej0wXSAtIFRoZSB6IHZhbHVlIG9mIHRoaXMgdmVjdG9yLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbdz0xXSAtIFRoZSB3IHZhbHVlIG9mIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCB4ID0gMCwgeSA9IDAsIHogPSAwLCB3ID0gMSApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdFZlY3RvcjQucHJvdG90eXBlLmlzVmVjdG9yNCA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgeCB2YWx1ZSBvZiB0aGlzIHZlY3Rvci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnggPSB4O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHkgdmFsdWUgb2YgdGhpcyB2ZWN0b3IuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy55ID0geTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB6IHZhbHVlIG9mIHRoaXMgdmVjdG9yLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMueiA9IHo7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdyB2YWx1ZSBvZiB0aGlzIHZlY3Rvci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLncgPSB3O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFsaWFzIGZvciB7QGxpbmsgVmVjdG9yNCN6fS5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0ICovXHJcblx0Z2V0IHdpZHRoKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLno7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0IHdpZHRoKCB2YWx1ZSApIHtcclxuXHJcblx0XHR0aGlzLnogPSB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBbGlhcyBmb3Ige0BsaW5rIFZlY3RvcjQjd30uXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdCAqL1xyXG5cdGdldCBoZWlnaHQoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMudztcclxuXHJcblx0fVxyXG5cclxuXHRzZXQgaGVpZ2h0KCB2YWx1ZSApIHtcclxuXHJcblx0XHR0aGlzLncgPSB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB2ZWN0b3IgY29tcG9uZW50cy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHZhbHVlIG9mIHRoZSB4IGNvbXBvbmVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB2YWx1ZSBvZiB0aGUgeSBjb21wb25lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHogLSBUaGUgdmFsdWUgb2YgdGhlIHogY29tcG9uZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB3IC0gVGhlIHZhbHVlIG9mIHRoZSB3IGNvbXBvbmVudC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3I0fSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRzZXQoIHgsIHksIHosIHcgKSB7XHJcblxyXG5cdFx0dGhpcy54ID0geDtcclxuXHRcdHRoaXMueSA9IHk7XHJcblx0XHR0aGlzLnogPSB6O1xyXG5cdFx0dGhpcy53ID0gdztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB2ZWN0b3IgY29tcG9uZW50cyB0byB0aGUgc2FtZSB2YWx1ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzY2FsYXIgLSBUaGUgdmFsdWUgdG8gc2V0IGZvciBhbGwgdmVjdG9yIGNvbXBvbmVudHMuXHJcblx0ICogQHJldHVybiB7VmVjdG9yNH0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0c2V0U2NhbGFyKCBzY2FsYXIgKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gc2NhbGFyO1xyXG5cdFx0dGhpcy55ID0gc2NhbGFyO1xyXG5cdFx0dGhpcy56ID0gc2NhbGFyO1xyXG5cdFx0dGhpcy53ID0gc2NhbGFyO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHZlY3RvcidzIHggY29tcG9uZW50IHRvIHRoZSBnaXZlbiB2YWx1ZVxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgdmFsdWUgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHNldFgoIHggKSB7XHJcblxyXG5cdFx0dGhpcy54ID0geDtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB2ZWN0b3IncyB5IGNvbXBvbmVudCB0byB0aGUgZ2l2ZW4gdmFsdWVcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHZhbHVlIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3I0fSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRzZXRZKCB5ICkge1xyXG5cclxuXHRcdHRoaXMueSA9IHk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdmVjdG9yJ3MgeiBjb21wb25lbnQgdG8gdGhlIGdpdmVuIHZhbHVlXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0geiAtIFRoZSB2YWx1ZSB0byBzZXQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yNH0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0c2V0WiggeiApIHtcclxuXHJcblx0XHR0aGlzLnogPSB6O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHZlY3RvcidzIHcgY29tcG9uZW50IHRvIHRoZSBnaXZlbiB2YWx1ZVxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHcgLSBUaGUgdmFsdWUgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHNldFcoIHcgKSB7XHJcblxyXG5cdFx0dGhpcy53ID0gdztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBbGxvd3MgdG8gc2V0IGEgdmVjdG9yIGNvbXBvbmVudCB3aXRoIGFuIGluZGV4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGNvbXBvbmVudCBpbmRleC4gYDBgIGVxdWFscyB0byB4LCBgMWAgZXF1YWxzIHRvIHksXHJcblx0ICogYDJgIGVxdWFscyB0byB6LCBgM2AgZXF1YWxzIHRvIHcuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3I0fSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRzZXRDb21wb25lbnQoIGluZGV4LCB2YWx1ZSApIHtcclxuXHJcblx0XHRzd2l0Y2ggKCBpbmRleCApIHtcclxuXHJcblx0XHRcdGNhc2UgMDogdGhpcy54ID0gdmFsdWU7IGJyZWFrO1xyXG5cdFx0XHRjYXNlIDE6IHRoaXMueSA9IHZhbHVlOyBicmVhaztcclxuXHRcdFx0Y2FzZSAyOiB0aGlzLnogPSB2YWx1ZTsgYnJlYWs7XHJcblx0XHRcdGNhc2UgMzogdGhpcy53ID0gdmFsdWU7IGJyZWFrO1xyXG5cdFx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoICdpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICcgKyBpbmRleCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgdmVjdG9yIGNvbXBvbmVudCB3aGljaCBtYXRjaGVzIHRoZSBnaXZlbiBpbmRleC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBjb21wb25lbnQgaW5kZXguIGAwYCBlcXVhbHMgdG8geCwgYDFgIGVxdWFscyB0byB5LFxyXG5cdCAqIGAyYCBlcXVhbHMgdG8geiwgYDNgIGVxdWFscyB0byB3LlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gQSB2ZWN0b3IgY29tcG9uZW50IHZhbHVlLlxyXG5cdCAqL1xyXG5cdGdldENvbXBvbmVudCggaW5kZXggKSB7XHJcblxyXG5cdFx0c3dpdGNoICggaW5kZXggKSB7XHJcblxyXG5cdFx0XHRjYXNlIDA6IHJldHVybiB0aGlzLng7XHJcblx0XHRcdGNhc2UgMTogcmV0dXJuIHRoaXMueTtcclxuXHRcdFx0Y2FzZSAyOiByZXR1cm4gdGhpcy56O1xyXG5cdFx0XHRjYXNlIDM6IHJldHVybiB0aGlzLnc7XHJcblx0XHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvciggJ2luZGV4IGlzIG91dCBvZiByYW5nZTogJyArIGluZGV4ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBuZXcgdmVjdG9yIHdpdGggY29waWVkIHZhbHVlcyBmcm9tIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtWZWN0b3I0fSBBIGNsb25lIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y2xvbmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLngsIHRoaXMueSwgdGhpcy56LCB0aGlzLncgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gdmVjdG9yIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN8VmVjdG9yNH0gdiAtIFRoZSB2ZWN0b3IgdG8gY29weS5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3I0fSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRjb3B5KCB2ICkge1xyXG5cclxuXHRcdHRoaXMueCA9IHYueDtcclxuXHRcdHRoaXMueSA9IHYueTtcclxuXHRcdHRoaXMueiA9IHYuejtcclxuXHRcdHRoaXMudyA9ICggdi53ICE9PSB1bmRlZmluZWQgKSA/IHYudyA6IDE7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyB0aGUgZ2l2ZW4gdmVjdG9yIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjR9IHYgLSBUaGUgdmVjdG9yIHRvIGFkZC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3I0fSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRhZGQoIHYgKSB7XHJcblxyXG5cdFx0dGhpcy54ICs9IHYueDtcclxuXHRcdHRoaXMueSArPSB2Lnk7XHJcblx0XHR0aGlzLnogKz0gdi56O1xyXG5cdFx0dGhpcy53ICs9IHYudztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIHRoZSBnaXZlbiBzY2FsYXIgdmFsdWUgdG8gYWxsIGNvbXBvbmVudHMgb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzIC0gVGhlIHNjYWxhciB0byBhZGQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yNH0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0YWRkU2NhbGFyKCBzICkge1xyXG5cclxuXHRcdHRoaXMueCArPSBzO1xyXG5cdFx0dGhpcy55ICs9IHM7XHJcblx0XHR0aGlzLnogKz0gcztcclxuXHRcdHRoaXMudyArPSBzO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgdGhlIGdpdmVuIHZlY3RvcnMgYW5kIHN0b3JlcyB0aGUgcmVzdWx0IGluIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjR9IGEgLSBUaGUgZmlyc3QgdmVjdG9yLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yNH0gYiAtIFRoZSBzZWNvbmQgdmVjdG9yLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGFkZFZlY3RvcnMoIGEsIGIgKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gYS54ICsgYi54O1xyXG5cdFx0dGhpcy55ID0gYS55ICsgYi55O1xyXG5cdFx0dGhpcy56ID0gYS56ICsgYi56O1xyXG5cdFx0dGhpcy53ID0gYS53ICsgYi53O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgdGhlIGdpdmVuIHZlY3RvciBzY2FsZWQgYnkgdGhlIGdpdmVuIGZhY3RvciB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3I0fSB2IC0gVGhlIHZlY3Rvci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gcyAtIFRoZSBmYWN0b3IgdGhhdCBzY2FsZXMgYHZgLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGFkZFNjYWxlZFZlY3RvciggdiwgcyApIHtcclxuXHJcblx0XHR0aGlzLnggKz0gdi54ICogcztcclxuXHRcdHRoaXMueSArPSB2LnkgKiBzO1xyXG5cdFx0dGhpcy56ICs9IHYueiAqIHM7XHJcblx0XHR0aGlzLncgKz0gdi53ICogcztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTdWJ0cmFjdHMgdGhlIGdpdmVuIHZlY3RvciBmcm9tIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjR9IHYgLSBUaGUgdmVjdG9yIHRvIHN1YnRyYWN0LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHN1YiggdiApIHtcclxuXHJcblx0XHR0aGlzLnggLT0gdi54O1xyXG5cdFx0dGhpcy55IC09IHYueTtcclxuXHRcdHRoaXMueiAtPSB2Lno7XHJcblx0XHR0aGlzLncgLT0gdi53O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFN1YnRyYWN0cyB0aGUgZ2l2ZW4gc2NhbGFyIHZhbHVlIGZyb20gYWxsIGNvbXBvbmVudHMgb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzIC0gVGhlIHNjYWxhciB0byBzdWJ0cmFjdC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3I0fSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRzdWJTY2FsYXIoIHMgKSB7XHJcblxyXG5cdFx0dGhpcy54IC09IHM7XHJcblx0XHR0aGlzLnkgLT0gcztcclxuXHRcdHRoaXMueiAtPSBzO1xyXG5cdFx0dGhpcy53IC09IHM7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3VidHJhY3RzIHRoZSBnaXZlbiB2ZWN0b3JzIGFuZCBzdG9yZXMgdGhlIHJlc3VsdCBpbiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3I0fSBhIC0gVGhlIGZpcnN0IHZlY3Rvci5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjR9IGIgLSBUaGUgc2Vjb25kIHZlY3Rvci5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3I0fSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRzdWJWZWN0b3JzKCBhLCBiICkge1xyXG5cclxuXHRcdHRoaXMueCA9IGEueCAtIGIueDtcclxuXHRcdHRoaXMueSA9IGEueSAtIGIueTtcclxuXHRcdHRoaXMueiA9IGEueiAtIGIuejtcclxuXHRcdHRoaXMudyA9IGEudyAtIGIudztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBNdWx0aXBsaWVzIHRoZSBnaXZlbiB2ZWN0b3Igd2l0aCB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3I0fSB2IC0gVGhlIHZlY3RvciB0byBtdWx0aXBseS5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3I0fSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRtdWx0aXBseSggdiApIHtcclxuXHJcblx0XHR0aGlzLnggKj0gdi54O1xyXG5cdFx0dGhpcy55ICo9IHYueTtcclxuXHRcdHRoaXMueiAqPSB2Lno7XHJcblx0XHR0aGlzLncgKj0gdi53O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE11bHRpcGxpZXMgdGhlIGdpdmVuIHNjYWxhciB2YWx1ZSB3aXRoIGFsbCBjb21wb25lbnRzIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc2NhbGFyIC0gVGhlIHNjYWxhciB0byBtdWx0aXBseS5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3I0fSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRtdWx0aXBseVNjYWxhciggc2NhbGFyICkge1xyXG5cclxuXHRcdHRoaXMueCAqPSBzY2FsYXI7XHJcblx0XHR0aGlzLnkgKj0gc2NhbGFyO1xyXG5cdFx0dGhpcy56ICo9IHNjYWxhcjtcclxuXHRcdHRoaXMudyAqPSBzY2FsYXI7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTXVsdGlwbGllcyB0aGlzIHZlY3RvciB3aXRoIHRoZSBnaXZlbiA0eDQgbWF0cml4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRyaXg0fSBtIC0gVGhlIDR4NCBtYXRyaXguXHJcblx0ICogQHJldHVybiB7VmVjdG9yNH0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0YXBwbHlNYXRyaXg0KCBtICkge1xyXG5cclxuXHRcdGNvbnN0IHggPSB0aGlzLngsIHkgPSB0aGlzLnksIHogPSB0aGlzLnosIHcgPSB0aGlzLnc7XHJcblx0XHRjb25zdCBlID0gbS5lbGVtZW50cztcclxuXHJcblx0XHR0aGlzLnggPSBlWyAwIF0gKiB4ICsgZVsgNCBdICogeSArIGVbIDggXSAqIHogKyBlWyAxMiBdICogdztcclxuXHRcdHRoaXMueSA9IGVbIDEgXSAqIHggKyBlWyA1IF0gKiB5ICsgZVsgOSBdICogeiArIGVbIDEzIF0gKiB3O1xyXG5cdFx0dGhpcy56ID0gZVsgMiBdICogeCArIGVbIDYgXSAqIHkgKyBlWyAxMCBdICogeiArIGVbIDE0IF0gKiB3O1xyXG5cdFx0dGhpcy53ID0gZVsgMyBdICogeCArIGVbIDcgXSAqIHkgKyBlWyAxMSBdICogeiArIGVbIDE1IF0gKiB3O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERpdmlkZXMgdGhpcyBpbnN0YW5jZSBieSB0aGUgZ2l2ZW4gdmVjdG9yLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3I0fSB2IC0gVGhlIHZlY3RvciB0byBkaXZpZGUuXHJcblx0ICogQHJldHVybiB7VmVjdG9yNH0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0ZGl2aWRlKCB2ICkge1xyXG5cclxuXHRcdHRoaXMueCAvPSB2Lng7XHJcblx0XHR0aGlzLnkgLz0gdi55O1xyXG5cdFx0dGhpcy56IC89IHYuejtcclxuXHRcdHRoaXMudyAvPSB2Lnc7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGl2aWRlcyB0aGlzIHZlY3RvciBieSB0aGUgZ2l2ZW4gc2NhbGFyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHNjYWxhciAtIFRoZSBzY2FsYXIgdG8gZGl2aWRlLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGRpdmlkZVNjYWxhciggc2NhbGFyICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKCAxIC8gc2NhbGFyICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgeCwgeSBhbmQgeiBjb21wb25lbnRzIG9mIHRoaXNcclxuXHQgKiB2ZWN0b3IgdG8gdGhlIHF1YXRlcm5pb24ncyBheGlzIGFuZCB3IHRvIHRoZSBhbmdsZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UXVhdGVybmlvbn0gcSAtIFRoZSBRdWF0ZXJuaW9uIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3I0fSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRzZXRBeGlzQW5nbGVGcm9tUXVhdGVybmlvbiggcSApIHtcclxuXHJcblx0XHQvLyBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9nZW9tZXRyeS9yb3RhdGlvbnMvY29udmVyc2lvbnMvcXVhdGVybmlvblRvQW5nbGUvaW5kZXguaHRtXHJcblxyXG5cdFx0Ly8gcSBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWRcclxuXHJcblx0XHR0aGlzLncgPSAyICogTWF0aC5hY29zKCBxLncgKTtcclxuXHJcblx0XHRjb25zdCBzID0gTWF0aC5zcXJ0KCAxIC0gcS53ICogcS53ICk7XHJcblxyXG5cdFx0aWYgKCBzIDwgMC4wMDAxICkge1xyXG5cclxuXHRcdFx0dGhpcy54ID0gMTtcclxuXHRcdFx0dGhpcy55ID0gMDtcclxuXHRcdFx0dGhpcy56ID0gMDtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGhpcy54ID0gcS54IC8gcztcclxuXHRcdFx0dGhpcy55ID0gcS55IC8gcztcclxuXHRcdFx0dGhpcy56ID0gcS56IC8gcztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgeCwgeSBhbmQgeiBjb21wb25lbnRzIG9mIHRoaXNcclxuXHQgKiB2ZWN0b3IgdG8gdGhlIGF4aXMgb2Ygcm90YXRpb24gYW5kIHcgdG8gdGhlIGFuZ2xlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRyaXg0fSBtIC0gQSA0eDQgbWF0cml4IG9mIHdoaWNoIHRoZSB1cHBlciBsZWZ0IDN4MyBtYXRyaXggaXMgYSBwdXJlIHJvdGF0aW9uIG1hdHJpeC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3I0fSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRzZXRBeGlzQW5nbGVGcm9tUm90YXRpb25NYXRyaXgoIG0gKSB7XHJcblxyXG5cdFx0Ly8gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvZ2VvbWV0cnkvcm90YXRpb25zL2NvbnZlcnNpb25zL21hdHJpeFRvQW5nbGUvaW5kZXguaHRtXHJcblxyXG5cdFx0Ly8gYXNzdW1lcyB0aGUgdXBwZXIgM3gzIG9mIG0gaXMgYSBwdXJlIHJvdGF0aW9uIG1hdHJpeCAoaS5lLCB1bnNjYWxlZClcclxuXHJcblx0XHRsZXQgYW5nbGUsIHgsIHksIHo7IC8vIHZhcmlhYmxlcyBmb3IgcmVzdWx0XHJcblx0XHRjb25zdCBlcHNpbG9uID0gMC4wMSxcdFx0Ly8gbWFyZ2luIHRvIGFsbG93IGZvciByb3VuZGluZyBlcnJvcnNcclxuXHRcdFx0ZXBzaWxvbjIgPSAwLjEsXHRcdC8vIG1hcmdpbiB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIDAgYW5kIDE4MCBkZWdyZWVzXHJcblxyXG5cdFx0XHR0ZSA9IG0uZWxlbWVudHMsXHJcblxyXG5cdFx0XHRtMTEgPSB0ZVsgMCBdLCBtMTIgPSB0ZVsgNCBdLCBtMTMgPSB0ZVsgOCBdLFxyXG5cdFx0XHRtMjEgPSB0ZVsgMSBdLCBtMjIgPSB0ZVsgNSBdLCBtMjMgPSB0ZVsgOSBdLFxyXG5cdFx0XHRtMzEgPSB0ZVsgMiBdLCBtMzIgPSB0ZVsgNiBdLCBtMzMgPSB0ZVsgMTAgXTtcclxuXHJcblx0XHRpZiAoICggTWF0aC5hYnMoIG0xMiAtIG0yMSApIDwgZXBzaWxvbiApICYmXHJcblx0XHQgICAgICggTWF0aC5hYnMoIG0xMyAtIG0zMSApIDwgZXBzaWxvbiApICYmXHJcblx0XHQgICAgICggTWF0aC5hYnMoIG0yMyAtIG0zMiApIDwgZXBzaWxvbiApICkge1xyXG5cclxuXHRcdFx0Ly8gc2luZ3VsYXJpdHkgZm91bmRcclxuXHRcdFx0Ly8gZmlyc3QgY2hlY2sgZm9yIGlkZW50aXR5IG1hdHJpeCB3aGljaCBtdXN0IGhhdmUgKzEgZm9yIGFsbCB0ZXJtc1xyXG5cdFx0XHQvLyBpbiBsZWFkaW5nIGRpYWdvbmFsIGFuZCB6ZXJvIGluIG90aGVyIHRlcm1zXHJcblxyXG5cdFx0XHRpZiAoICggTWF0aC5hYnMoIG0xMiArIG0yMSApIDwgZXBzaWxvbjIgKSAmJlxyXG5cdFx0XHQgICAgICggTWF0aC5hYnMoIG0xMyArIG0zMSApIDwgZXBzaWxvbjIgKSAmJlxyXG5cdFx0XHQgICAgICggTWF0aC5hYnMoIG0yMyArIG0zMiApIDwgZXBzaWxvbjIgKSAmJlxyXG5cdFx0XHQgICAgICggTWF0aC5hYnMoIG0xMSArIG0yMiArIG0zMyAtIDMgKSA8IGVwc2lsb24yICkgKSB7XHJcblxyXG5cdFx0XHRcdC8vIHRoaXMgc2luZ3VsYXJpdHkgaXMgaWRlbnRpdHkgbWF0cml4IHNvIGFuZ2xlID0gMFxyXG5cclxuXHRcdFx0XHR0aGlzLnNldCggMSwgMCwgMCwgMCApO1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gdGhpczsgLy8gemVybyBhbmdsZSwgYXJiaXRyYXJ5IGF4aXNcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIG90aGVyd2lzZSB0aGlzIHNpbmd1bGFyaXR5IGlzIGFuZ2xlID0gMTgwXHJcblxyXG5cdFx0XHRhbmdsZSA9IE1hdGguUEk7XHJcblxyXG5cdFx0XHRjb25zdCB4eCA9ICggbTExICsgMSApIC8gMjtcclxuXHRcdFx0Y29uc3QgeXkgPSAoIG0yMiArIDEgKSAvIDI7XHJcblx0XHRcdGNvbnN0IHp6ID0gKCBtMzMgKyAxICkgLyAyO1xyXG5cdFx0XHRjb25zdCB4eSA9ICggbTEyICsgbTIxICkgLyA0O1xyXG5cdFx0XHRjb25zdCB4eiA9ICggbTEzICsgbTMxICkgLyA0O1xyXG5cdFx0XHRjb25zdCB5eiA9ICggbTIzICsgbTMyICkgLyA0O1xyXG5cclxuXHRcdFx0aWYgKCAoIHh4ID4geXkgKSAmJiAoIHh4ID4genogKSApIHtcclxuXHJcblx0XHRcdFx0Ly8gbTExIGlzIHRoZSBsYXJnZXN0IGRpYWdvbmFsIHRlcm1cclxuXHJcblx0XHRcdFx0aWYgKCB4eCA8IGVwc2lsb24gKSB7XHJcblxyXG5cdFx0XHRcdFx0eCA9IDA7XHJcblx0XHRcdFx0XHR5ID0gMC43MDcxMDY3ODE7XHJcblx0XHRcdFx0XHR6ID0gMC43MDcxMDY3ODE7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0eCA9IE1hdGguc3FydCggeHggKTtcclxuXHRcdFx0XHRcdHkgPSB4eSAvIHg7XHJcblx0XHRcdFx0XHR6ID0geHogLyB4O1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCB5eSA+IHp6ICkge1xyXG5cclxuXHRcdFx0XHQvLyBtMjIgaXMgdGhlIGxhcmdlc3QgZGlhZ29uYWwgdGVybVxyXG5cclxuXHRcdFx0XHRpZiAoIHl5IDwgZXBzaWxvbiApIHtcclxuXHJcblx0XHRcdFx0XHR4ID0gMC43MDcxMDY3ODE7XHJcblx0XHRcdFx0XHR5ID0gMDtcclxuXHRcdFx0XHRcdHogPSAwLjcwNzEwNjc4MTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHR5ID0gTWF0aC5zcXJ0KCB5eSApO1xyXG5cdFx0XHRcdFx0eCA9IHh5IC8geTtcclxuXHRcdFx0XHRcdHogPSB5eiAvIHk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdC8vIG0zMyBpcyB0aGUgbGFyZ2VzdCBkaWFnb25hbCB0ZXJtIHNvIGJhc2UgcmVzdWx0IG9uIHRoaXNcclxuXHJcblx0XHRcdFx0aWYgKCB6eiA8IGVwc2lsb24gKSB7XHJcblxyXG5cdFx0XHRcdFx0eCA9IDAuNzA3MTA2NzgxO1xyXG5cdFx0XHRcdFx0eSA9IDAuNzA3MTA2NzgxO1xyXG5cdFx0XHRcdFx0eiA9IDA7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0eiA9IE1hdGguc3FydCggenogKTtcclxuXHRcdFx0XHRcdHggPSB4eiAvIHo7XHJcblx0XHRcdFx0XHR5ID0geXogLyB6O1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0aGlzLnNldCggeCwgeSwgeiwgYW5nbGUgKTtcclxuXHJcblx0XHRcdHJldHVybiB0aGlzOyAvLyByZXR1cm4gMTgwIGRlZyByb3RhdGlvblxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBhcyB3ZSBoYXZlIHJlYWNoZWQgaGVyZSB0aGVyZSBhcmUgbm8gc2luZ3VsYXJpdGllcyBzbyB3ZSBjYW4gaGFuZGxlIG5vcm1hbGx5XHJcblxyXG5cdFx0bGV0IHMgPSBNYXRoLnNxcnQoICggbTMyIC0gbTIzICkgKiAoIG0zMiAtIG0yMyApICtcclxuXHRcdFx0KCBtMTMgLSBtMzEgKSAqICggbTEzIC0gbTMxICkgK1xyXG5cdFx0XHQoIG0yMSAtIG0xMiApICogKCBtMjEgLSBtMTIgKSApOyAvLyB1c2VkIHRvIG5vcm1hbGl6ZVxyXG5cclxuXHRcdGlmICggTWF0aC5hYnMoIHMgKSA8IDAuMDAxICkgcyA9IDE7XHJcblxyXG5cdFx0Ly8gcHJldmVudCBkaXZpZGUgYnkgemVybywgc2hvdWxkIG5vdCBoYXBwZW4gaWYgbWF0cml4IGlzIG9ydGhvZ29uYWwgYW5kIHNob3VsZCBiZVxyXG5cdFx0Ly8gY2F1Z2h0IGJ5IHNpbmd1bGFyaXR5IHRlc3QgYWJvdmUsIGJ1dCBJJ3ZlIGxlZnQgaXQgaW4ganVzdCBpbiBjYXNlXHJcblxyXG5cdFx0dGhpcy54ID0gKCBtMzIgLSBtMjMgKSAvIHM7XHJcblx0XHR0aGlzLnkgPSAoIG0xMyAtIG0zMSApIC8gcztcclxuXHRcdHRoaXMueiA9ICggbTIxIC0gbTEyICkgLyBzO1xyXG5cdFx0dGhpcy53ID0gTWF0aC5hY29zKCAoIG0xMSArIG0yMiArIG0zMyAtIDEgKSAvIDIgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB2ZWN0b3IgY29tcG9uZW50cyB0byB0aGUgcG9zaXRpb24gZWxlbWVudHMgb2YgdGhlXHJcblx0ICogZ2l2ZW4gdHJhbnNmb3JtYXRpb24gbWF0cml4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRyaXg0fSBtIC0gVGhlIDR4NCBtYXRyaXguXHJcblx0ICogQHJldHVybiB7VmVjdG9yNH0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0c2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBtICkge1xyXG5cclxuXHRcdGNvbnN0IGUgPSBtLmVsZW1lbnRzO1xyXG5cclxuXHRcdHRoaXMueCA9IGVbIDEyIF07XHJcblx0XHR0aGlzLnkgPSBlWyAxMyBdO1xyXG5cdFx0dGhpcy56ID0gZVsgMTQgXTtcclxuXHRcdHRoaXMudyA9IGVbIDE1IF07XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSWYgdGhpcyB2ZWN0b3IncyB4LCB5LCB6IG9yIHcgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSBnaXZlbiB2ZWN0b3IncyB4LCB5LCB6IG9yIHdcclxuXHQgKiB2YWx1ZSwgcmVwbGFjZSB0aGF0IHZhbHVlIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgbWluIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3I0fSB2IC0gVGhlIHZlY3Rvci5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3I0fSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRtaW4oIHYgKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gTWF0aC5taW4oIHRoaXMueCwgdi54ICk7XHJcblx0XHR0aGlzLnkgPSBNYXRoLm1pbiggdGhpcy55LCB2LnkgKTtcclxuXHRcdHRoaXMueiA9IE1hdGgubWluKCB0aGlzLnosIHYueiApO1xyXG5cdFx0dGhpcy53ID0gTWF0aC5taW4oIHRoaXMudywgdi53ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSWYgdGhpcyB2ZWN0b3IncyB4LCB5LCB6IG9yIHcgdmFsdWUgaXMgbGVzcyB0aGFuIHRoZSBnaXZlbiB2ZWN0b3IncyB4LCB5LCB6IG9yIHdcclxuXHQgKiB2YWx1ZSwgcmVwbGFjZSB0aGF0IHZhbHVlIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgbWF4IHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3I0fSB2IC0gVGhlIHZlY3Rvci5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3I0fSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRtYXgoIHYgKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gTWF0aC5tYXgoIHRoaXMueCwgdi54ICk7XHJcblx0XHR0aGlzLnkgPSBNYXRoLm1heCggdGhpcy55LCB2LnkgKTtcclxuXHRcdHRoaXMueiA9IE1hdGgubWF4KCB0aGlzLnosIHYueiApO1xyXG5cdFx0dGhpcy53ID0gTWF0aC5tYXgoIHRoaXMudywgdi53ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSWYgdGhpcyB2ZWN0b3IncyB4LCB5LCB6IG9yIHcgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSBtYXggdmVjdG9yJ3MgeCwgeSwgeiBvciB3XHJcblx0ICogdmFsdWUsIGl0IGlzIHJlcGxhY2VkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlLlxyXG5cdCAqIElmIHRoaXMgdmVjdG9yJ3MgeCwgeSwgeiBvciB3IHZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgbWluIHZlY3RvcidzIHgsIHksIHogb3IgdyB2YWx1ZSxcclxuXHQgKiBpdCBpcyByZXBsYWNlZCBieSB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yNH0gbWluIC0gVGhlIG1pbmltdW0geCwgeSBhbmQgeiB2YWx1ZXMuXHJcblx0ICogQHBhcmFtIHtWZWN0b3I0fSBtYXggLSBUaGUgbWF4aW11bSB4LCB5IGFuZCB6IHZhbHVlcyBpbiB0aGUgZGVzaXJlZCByYW5nZS5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3I0fSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRjbGFtcCggbWluLCBtYXggKSB7XHJcblxyXG5cdFx0Ly8gYXNzdW1lcyBtaW4gPCBtYXgsIGNvbXBvbmVudHdpc2VcclxuXHJcblx0XHR0aGlzLnggPSBjbGFtcCggdGhpcy54LCBtaW4ueCwgbWF4LnggKTtcclxuXHRcdHRoaXMueSA9IGNsYW1wKCB0aGlzLnksIG1pbi55LCBtYXgueSApO1xyXG5cdFx0dGhpcy56ID0gY2xhbXAoIHRoaXMueiwgbWluLnosIG1heC56ICk7XHJcblx0XHR0aGlzLncgPSBjbGFtcCggdGhpcy53LCBtaW4udywgbWF4LncgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJZiB0aGlzIHZlY3RvcidzIHgsIHksIHogb3IgdyB2YWx1ZXMgYXJlIGdyZWF0ZXIgdGhhbiB0aGUgbWF4IHZhbHVlLCB0aGV5IGFyZVxyXG5cdCAqIHJlcGxhY2VkIGJ5IHRoZSBtYXggdmFsdWUuXHJcblx0ICogSWYgdGhpcyB2ZWN0b3IncyB4LCB5LCB6IG9yIHcgdmFsdWVzIGFyZSBsZXNzIHRoYW4gdGhlIG1pbiB2YWx1ZSwgdGhleSBhcmVcclxuXHQgKiByZXBsYWNlZCBieSB0aGUgbWluIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IG1pblZhbCAtIFRoZSBtaW5pbXVtIHZhbHVlIHRoZSBjb21wb25lbnRzIHdpbGwgYmUgY2xhbXBlZCB0by5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbWF4VmFsIC0gVGhlIG1heGltdW0gdmFsdWUgdGhlIGNvbXBvbmVudHMgd2lsbCBiZSBjbGFtcGVkIHRvLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGNsYW1wU2NhbGFyKCBtaW5WYWwsIG1heFZhbCApIHtcclxuXHJcblx0XHR0aGlzLnggPSBjbGFtcCggdGhpcy54LCBtaW5WYWwsIG1heFZhbCApO1xyXG5cdFx0dGhpcy55ID0gY2xhbXAoIHRoaXMueSwgbWluVmFsLCBtYXhWYWwgKTtcclxuXHRcdHRoaXMueiA9IGNsYW1wKCB0aGlzLnosIG1pblZhbCwgbWF4VmFsICk7XHJcblx0XHR0aGlzLncgPSBjbGFtcCggdGhpcy53LCBtaW5WYWwsIG1heFZhbCApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIElmIHRoaXMgdmVjdG9yJ3MgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4IHZhbHVlLCBpdCBpcyByZXBsYWNlZCBieVxyXG5cdCAqIHRoZSBtYXggdmFsdWUuXHJcblx0ICogSWYgdGhpcyB2ZWN0b3IncyBsZW5ndGggaXMgbGVzcyB0aGFuIHRoZSBtaW4gdmFsdWUsIGl0IGlzIHJlcGxhY2VkIGJ5IHRoZVxyXG5cdCAqIG1pbiB2YWx1ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBtaW4gLSBUaGUgbWluaW11bSB2YWx1ZSB0aGUgdmVjdG9yIGxlbmd0aCB3aWxsIGJlIGNsYW1wZWQgdG8uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IG1heCAtIFRoZSBtYXhpbXVtIHZhbHVlIHRoZSB2ZWN0b3IgbGVuZ3RoIHdpbGwgYmUgY2xhbXBlZCB0by5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3I0fSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRjbGFtcExlbmd0aCggbWluLCBtYXggKSB7XHJcblxyXG5cdFx0Y29uc3QgbGVuZ3RoID0gdGhpcy5sZW5ndGgoKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoIGxlbmd0aCB8fCAxICkubXVsdGlwbHlTY2FsYXIoIGNsYW1wKCBsZW5ndGgsIG1pbiwgbWF4ICkgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgY29tcG9uZW50cyBvZiB0aGlzIHZlY3RvciBhcmUgcm91bmRlZCBkb3duIHRvIHRoZSBuZWFyZXN0IGludGVnZXIgdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtWZWN0b3I0fSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRmbG9vcigpIHtcclxuXHJcblx0XHR0aGlzLnggPSBNYXRoLmZsb29yKCB0aGlzLnggKTtcclxuXHRcdHRoaXMueSA9IE1hdGguZmxvb3IoIHRoaXMueSApO1xyXG5cdFx0dGhpcy56ID0gTWF0aC5mbG9vciggdGhpcy56ICk7XHJcblx0XHR0aGlzLncgPSBNYXRoLmZsb29yKCB0aGlzLncgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgY29tcG9uZW50cyBvZiB0aGlzIHZlY3RvciBhcmUgcm91bmRlZCB1cCB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7VmVjdG9yNH0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0Y2VpbCgpIHtcclxuXHJcblx0XHR0aGlzLnggPSBNYXRoLmNlaWwoIHRoaXMueCApO1xyXG5cdFx0dGhpcy55ID0gTWF0aC5jZWlsKCB0aGlzLnkgKTtcclxuXHRcdHRoaXMueiA9IE1hdGguY2VpbCggdGhpcy56ICk7XHJcblx0XHR0aGlzLncgPSBNYXRoLmNlaWwoIHRoaXMudyApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBjb21wb25lbnRzIG9mIHRoaXMgdmVjdG9yIGFyZSByb3VuZGVkIHRvIHRoZSBuZWFyZXN0IGludGVnZXIgdmFsdWVcclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHJvdW5kKCkge1xyXG5cclxuXHRcdHRoaXMueCA9IE1hdGgucm91bmQoIHRoaXMueCApO1xyXG5cdFx0dGhpcy55ID0gTWF0aC5yb3VuZCggdGhpcy55ICk7XHJcblx0XHR0aGlzLnogPSBNYXRoLnJvdW5kKCB0aGlzLnogKTtcclxuXHRcdHRoaXMudyA9IE1hdGgucm91bmQoIHRoaXMudyApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBjb21wb25lbnRzIG9mIHRoaXMgdmVjdG9yIGFyZSByb3VuZGVkIHRvd2FyZHMgemVybyAodXAgaWYgbmVnYXRpdmUsXHJcblx0ICogZG93biBpZiBwb3NpdGl2ZSkgdG8gYW4gaW50ZWdlciB2YWx1ZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHJvdW5kVG9aZXJvKCkge1xyXG5cclxuXHRcdHRoaXMueCA9IE1hdGgudHJ1bmMoIHRoaXMueCApO1xyXG5cdFx0dGhpcy55ID0gTWF0aC50cnVuYyggdGhpcy55ICk7XHJcblx0XHR0aGlzLnogPSBNYXRoLnRydW5jKCB0aGlzLnogKTtcclxuXHRcdHRoaXMudyA9IE1hdGgudHJ1bmMoIHRoaXMudyApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEludmVydHMgdGhpcyB2ZWN0b3IgLSBpLmUuIHNldHMgeCA9IC14LCB5ID0gLXksIHogPSAteiwgdyA9IC13LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7VmVjdG9yNH0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0bmVnYXRlKCkge1xyXG5cclxuXHRcdHRoaXMueCA9IC0gdGhpcy54O1xyXG5cdFx0dGhpcy55ID0gLSB0aGlzLnk7XHJcblx0XHR0aGlzLnogPSAtIHRoaXMuejtcclxuXHRcdHRoaXMudyA9IC0gdGhpcy53O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENhbGN1bGF0ZXMgdGhlIGRvdCBwcm9kdWN0IG9mIHRoZSBnaXZlbiB2ZWN0b3Igd2l0aCB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3I0fSB2IC0gVGhlIHZlY3RvciB0byBjb21wdXRlIHRoZSBkb3QgcHJvZHVjdCB3aXRoLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIHJlc3VsdCBvZiB0aGUgZG90IHByb2R1Y3QuXHJcblx0ICovXHJcblx0ZG90KCB2ICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnggKiB2LnggKyB0aGlzLnkgKiB2LnkgKyB0aGlzLnogKiB2LnogKyB0aGlzLncgKiB2Lnc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgdGhlIHNxdWFyZSBvZiB0aGUgRXVjbGlkZWFuIGxlbmd0aCAoc3RyYWlnaHQtbGluZSBsZW5ndGgpIGZyb21cclxuXHQgKiAoMCwgMCwgMCwgMCkgdG8gKHgsIHksIHosIHcpLiBJZiB5b3UgYXJlIGNvbXBhcmluZyB0aGUgbGVuZ3RocyBvZiB2ZWN0b3JzLCB5b3Ugc2hvdWxkXHJcblx0ICogY29tcGFyZSB0aGUgbGVuZ3RoIHNxdWFyZWQgaW5zdGVhZCBhcyBpdCBpcyBzbGlnaHRseSBtb3JlIGVmZmljaWVudCB0byBjYWxjdWxhdGUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBzcXVhcmUgbGVuZ3RoIG9mIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGxlbmd0aFNxKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkgKyB0aGlzLnogKiB0aGlzLnogKyB0aGlzLncgKiB0aGlzLnc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgdGhlICBFdWNsaWRlYW4gbGVuZ3RoIChzdHJhaWdodC1saW5lIGxlbmd0aCkgZnJvbSAoMCwgMCwgMCwgMCkgdG8gKHgsIHksIHosIHcpLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgbGVuZ3RoIG9mIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGxlbmd0aCgpIHtcclxuXHJcblx0XHRyZXR1cm4gTWF0aC5zcXJ0KCB0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkgKyB0aGlzLnogKiB0aGlzLnogKyB0aGlzLncgKiB0aGlzLncgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB0aGUgTWFuaGF0dGFuIGxlbmd0aCBvZiB0aGlzIHZlY3Rvci5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGxlbmd0aCBvZiB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRtYW5oYXR0YW5MZW5ndGgoKSB7XHJcblxyXG5cdFx0cmV0dXJuIE1hdGguYWJzKCB0aGlzLnggKSArIE1hdGguYWJzKCB0aGlzLnkgKSArIE1hdGguYWJzKCB0aGlzLnogKSArIE1hdGguYWJzKCB0aGlzLncgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb252ZXJ0cyB0aGlzIHZlY3RvciB0byBhIHVuaXQgdmVjdG9yIC0gdGhhdCBpcywgc2V0cyBpdCBlcXVhbCB0byBhIHZlY3RvclxyXG5cdCAqIHdpdGggdGhlIHNhbWUgZGlyZWN0aW9uIGFzIHRoaXMgb25lLCBidXQgd2l0aCBhIHZlY3RvciBsZW5ndGggb2YgYDFgLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7VmVjdG9yNH0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0bm9ybWFsaXplKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmRpdmlkZVNjYWxhciggdGhpcy5sZW5ndGgoKSB8fCAxICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGlzIHZlY3RvciB0byBhIHZlY3RvciB3aXRoIHRoZSBzYW1lIGRpcmVjdGlvbiBhcyB0aGlzIG9uZSwgYnV0XHJcblx0ICogd2l0aCB0aGUgc3BlY2lmaWVkIGxlbmd0aC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGggLSBUaGUgbmV3IGxlbmd0aCBvZiB0aGlzIHZlY3Rvci5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3I0fSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRzZXRMZW5ndGgoIGxlbmd0aCApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhciggbGVuZ3RoICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTGluZWFybHkgaW50ZXJwb2xhdGVzIGJldHdlZW4gdGhlIGdpdmVuIHZlY3RvciBhbmQgdGhpcyBpbnN0YW5jZSwgd2hlcmVcclxuXHQgKiBhbHBoYSBpcyB0aGUgcGVyY2VudCBkaXN0YW5jZSBhbG9uZyB0aGUgbGluZSAtIGFscGhhID0gMCB3aWxsIGJlIHRoaXNcclxuXHQgKiB2ZWN0b3IsIGFuZCBhbHBoYSA9IDEgd2lsbCBiZSB0aGUgZ2l2ZW4gb25lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3I0fSB2IC0gVGhlIHZlY3RvciB0byBpbnRlcnBvbGF0ZSB0b3dhcmRzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhbHBoYSAtIFRoZSBpbnRlcnBvbGF0aW9uIGZhY3RvciwgdHlwaWNhbGx5IGluIHRoZSBjbG9zZWQgaW50ZXJ2YWwgYFswLCAxXWAuXHJcblx0ICogQHJldHVybiB7VmVjdG9yNH0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0bGVycCggdiwgYWxwaGEgKSB7XHJcblxyXG5cdFx0dGhpcy54ICs9ICggdi54IC0gdGhpcy54ICkgKiBhbHBoYTtcclxuXHRcdHRoaXMueSArPSAoIHYueSAtIHRoaXMueSApICogYWxwaGE7XHJcblx0XHR0aGlzLnogKz0gKCB2LnogLSB0aGlzLnogKSAqIGFscGhhO1xyXG5cdFx0dGhpcy53ICs9ICggdi53IC0gdGhpcy53ICkgKiBhbHBoYTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBMaW5lYXJseSBpbnRlcnBvbGF0ZXMgYmV0d2VlbiB0aGUgZ2l2ZW4gdmVjdG9ycywgd2hlcmUgYWxwaGEgaXMgdGhlIHBlcmNlbnRcclxuXHQgKiBkaXN0YW5jZSBhbG9uZyB0aGUgbGluZSAtIGFscGhhID0gMCB3aWxsIGJlIGZpcnN0IHZlY3RvciwgYW5kIGFscGhhID0gMSB3aWxsXHJcblx0ICogYmUgdGhlIHNlY29uZCBvbmUuIFRoZSByZXN1bHQgaXMgc3RvcmVkIGluIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjR9IHYxIC0gVGhlIGZpcnN0IHZlY3Rvci5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjR9IHYyIC0gVGhlIHNlY29uZCB2ZWN0b3IuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFscGhhIC0gVGhlIGludGVycG9sYXRpb24gZmFjdG9yLCB0eXBpY2FsbHkgaW4gdGhlIGNsb3NlZCBpbnRlcnZhbCBgWzAsIDFdYC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3I0fSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRsZXJwVmVjdG9ycyggdjEsIHYyLCBhbHBoYSApIHtcclxuXHJcblx0XHR0aGlzLnggPSB2MS54ICsgKCB2Mi54IC0gdjEueCApICogYWxwaGE7XHJcblx0XHR0aGlzLnkgPSB2MS55ICsgKCB2Mi55IC0gdjEueSApICogYWxwaGE7XHJcblx0XHR0aGlzLnogPSB2MS56ICsgKCB2Mi56IC0gdjEueiApICogYWxwaGE7XHJcblx0XHR0aGlzLncgPSB2MS53ICsgKCB2Mi53IC0gdjEudyApICogYWxwaGE7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyB2ZWN0b3IgaXMgZXF1YWwgd2l0aCB0aGUgZ2l2ZW4gb25lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3I0fSB2IC0gVGhlIHZlY3RvciB0byB0ZXN0IGZvciBlcXVhbGl0eS5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoaXMgdmVjdG9yIGlzIGVxdWFsIHdpdGggdGhlIGdpdmVuIG9uZS5cclxuXHQgKi9cclxuXHRlcXVhbHMoIHYgKSB7XHJcblxyXG5cdFx0cmV0dXJuICggKCB2LnggPT09IHRoaXMueCApICYmICggdi55ID09PSB0aGlzLnkgKSAmJiAoIHYueiA9PT0gdGhpcy56ICkgJiYgKCB2LncgPT09IHRoaXMudyApICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGlzIHZlY3RvcidzIHggdmFsdWUgdG8gYmUgYGFycmF5WyBvZmZzZXQgXWAsIHkgdmFsdWUgdG8gYmUgYGFycmF5WyBvZmZzZXQgKyAxIF1gLFxyXG5cdCAqIHogdmFsdWUgdG8gYmUgYGFycmF5WyBvZmZzZXQgKyAyIF1gLCB3IHZhbHVlIHRvIGJlIGBhcnJheVsgb2Zmc2V0ICsgMyBdYC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gYXJyYXkgLSBBbiBhcnJheSBob2xkaW5nIHRoZSB2ZWN0b3IgY29tcG9uZW50IHZhbHVlcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW29mZnNldD0wXSAtIFRoZSBvZmZzZXQgaW50byB0aGUgYXJyYXkuXHJcblx0ICogQHJldHVybiB7VmVjdG9yNH0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0ZnJvbUFycmF5KCBhcnJheSwgb2Zmc2V0ID0gMCApIHtcclxuXHJcblx0XHR0aGlzLnggPSBhcnJheVsgb2Zmc2V0IF07XHJcblx0XHR0aGlzLnkgPSBhcnJheVsgb2Zmc2V0ICsgMSBdO1xyXG5cdFx0dGhpcy56ID0gYXJyYXlbIG9mZnNldCArIDIgXTtcclxuXHRcdHRoaXMudyA9IGFycmF5WyBvZmZzZXQgKyAzIF07XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogV3JpdGVzIHRoZSBjb21wb25lbnRzIG9mIHRoaXMgdmVjdG9yIHRvIHRoZSBnaXZlbiBhcnJheS4gSWYgbm8gYXJyYXkgaXMgcHJvdmlkZWQsXHJcblx0ICogdGhlIG1ldGhvZCByZXR1cm5zIGEgbmV3IGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBbYXJyYXk9W11dIC0gVGhlIHRhcmdldCBhcnJheSBob2xkaW5nIHRoZSB2ZWN0b3IgY29tcG9uZW50cy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW29mZnNldD0wXSAtIEluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBhcnJheS5cclxuXHQgKiBAcmV0dXJuIHtBcnJheTxudW1iZXI+fSBUaGUgdmVjdG9yIGNvbXBvbmVudHMuXHJcblx0ICovXHJcblx0dG9BcnJheSggYXJyYXkgPSBbXSwgb2Zmc2V0ID0gMCApIHtcclxuXHJcblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0aGlzLng7XHJcblx0XHRhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGhpcy55O1xyXG5cdFx0YXJyYXlbIG9mZnNldCArIDIgXSA9IHRoaXMuejtcclxuXHRcdGFycmF5WyBvZmZzZXQgKyAzIF0gPSB0aGlzLnc7XHJcblxyXG5cdFx0cmV0dXJuIGFycmF5O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGNvbXBvbmVudHMgb2YgdGhpcyB2ZWN0b3IgZnJvbSB0aGUgZ2l2ZW4gYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyQXR0cmlidXRlfSBhdHRyaWJ1dGUgLSBUaGUgYnVmZmVyIGF0dHJpYnV0ZSBob2xkaW5nIHZlY3RvciBkYXRhLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBpbnRvIHRoZSBhdHRyaWJ1dGUuXHJcblx0ICogQHJldHVybiB7VmVjdG9yNH0gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0ZnJvbUJ1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlLCBpbmRleCApIHtcclxuXHJcblx0XHR0aGlzLnggPSBhdHRyaWJ1dGUuZ2V0WCggaW5kZXggKTtcclxuXHRcdHRoaXMueSA9IGF0dHJpYnV0ZS5nZXRZKCBpbmRleCApO1xyXG5cdFx0dGhpcy56ID0gYXR0cmlidXRlLmdldFooIGluZGV4ICk7XHJcblx0XHR0aGlzLncgPSBhdHRyaWJ1dGUuZ2V0VyggaW5kZXggKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIGVhY2ggY29tcG9uZW50IG9mIHRoaXMgdmVjdG9yIHRvIGEgcHNldWRvLXJhbmRvbSB2YWx1ZSBiZXR3ZWVuIGAwYCBhbmRcclxuXHQgKiBgMWAsIGV4Y2x1ZGluZyBgMWAuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtWZWN0b3I0fSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRyYW5kb20oKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gTWF0aC5yYW5kb20oKTtcclxuXHRcdHRoaXMueSA9IE1hdGgucmFuZG9tKCk7XHJcblx0XHR0aGlzLnogPSBNYXRoLnJhbmRvbSgpO1xyXG5cdFx0dGhpcy53ID0gTWF0aC5yYW5kb20oKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQqWyBTeW1ib2wuaXRlcmF0b3IgXSgpIHtcclxuXHJcblx0XHR5aWVsZCB0aGlzLng7XHJcblx0XHR5aWVsZCB0aGlzLnk7XHJcblx0XHR5aWVsZCB0aGlzLno7XHJcblx0XHR5aWVsZCB0aGlzLnc7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFZlY3RvcjQgfTtcclxuIiwiaW1wb3J0IHsgRXZlbnREaXNwYXRjaGVyIH0gZnJvbSAnLi9FdmVudERpc3BhdGNoZXIuanMnO1xyXG5pbXBvcnQgeyBUZXh0dXJlIH0gZnJvbSAnLi4vdGV4dHVyZXMvVGV4dHVyZS5qcyc7XHJcbmltcG9ydCB7IExpbmVhckZpbHRlciB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjQgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjQuanMnO1xyXG5pbXBvcnQgeyBTb3VyY2UgfSBmcm9tICcuLi90ZXh0dXJlcy9Tb3VyY2UuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgcmVuZGVyIHRhcmdldCBpcyBhIGJ1ZmZlciB3aGVyZSB0aGUgdmlkZW8gY2FyZCBkcmF3cyBwaXhlbHMgZm9yIGEgc2NlbmVcclxuICogdGhhdCBpcyBiZWluZyByZW5kZXJlZCBpbiB0aGUgYmFja2dyb3VuZC4gSXQgaXMgdXNlZCBpbiBkaWZmZXJlbnQgZWZmZWN0cyxcclxuICogc3VjaCBhcyBhcHBseWluZyBwb3N0cHJvY2Vzc2luZyB0byBhIHJlbmRlcmVkIGltYWdlIGJlZm9yZSBkaXNwbGF5aW5nIGl0XHJcbiAqIG9uIHRoZSBzY3JlZW4uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBFdmVudERpc3BhdGNoZXJcclxuICovXHJcbmNsYXNzIFJlbmRlclRhcmdldCBleHRlbmRzIEV2ZW50RGlzcGF0Y2hlciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbmRlciB0YXJnZXQgb3B0aW9ucy5cclxuXHQgKlxyXG5cdCAqIEB0eXBlZGVmIHtPYmplY3R9IFJlbmRlclRhcmdldH5PcHRpb25zXHJcblx0ICogQHByb3BlcnR5IHtib29sZWFufSBbZ2VuZXJhdGVNaXBtYXBzPWZhbHNlXSAtIFdoZXRoZXIgdG8gZ2VuZXJhdGUgbWlwbWFwcyBvciBub3QuXHJcblx0ICogQHByb3BlcnR5IHtudW1iZXJ9IFttYWdGaWx0ZXI9TGluZWFyRmlsdGVyXSAtIFRoZSBtYWcgZmlsdGVyLlxyXG5cdCAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbbWluRmlsdGVyPUxpbmVhckZpbHRlcl0gLSBUaGUgbWluIGZpbHRlci5cclxuXHQgKiBAcHJvcGVydHkge251bWJlcn0gW2Zvcm1hdD1SR0JBRm9ybWF0XSAtIFRoZSB0ZXh0dXJlIGZvcm1hdC5cclxuXHQgKiBAcHJvcGVydHkge251bWJlcn0gW3R5cGU9VW5zaWduZWRCeXRlVHlwZV0gLSBUaGUgdGV4dHVyZSB0eXBlLlxyXG5cdCAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gW2ludGVybmFsRm9ybWF0PW51bGxdIC0gVGhlIHRleHR1cmUncyBpbnRlcm5hbCBmb3JtYXQuXHJcblx0ICogQHByb3BlcnR5IHtudW1iZXJ9IFt3cmFwUz1DbGFtcFRvRWRnZVdyYXBwaW5nXSAtIFRoZSB0ZXh0dXJlJ3MgdXYgd3JhcHBpbmcgbW9kZS5cclxuXHQgKiBAcHJvcGVydHkge251bWJlcn0gW3dyYXBUPUNsYW1wVG9FZGdlV3JhcHBpbmddIC0gVGhlIHRleHR1cmUncyB1diB3cmFwcGluZyBtb2RlLlxyXG5cdCAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbYW5pc290cm9weT0xXSAtIFRoZSB0ZXh0dXJlJ3MgYW5pc290cm9weSB2YWx1ZS5cclxuXHQgKiBAcHJvcGVydHkge3N0cmluZ30gW2NvbG9yU3BhY2U9Tm9Db2xvclNwYWNlXSAtIFRoZSB0ZXh0dXJlJ3MgY29sb3Igc3BhY2UuXHJcblx0ICogQHByb3BlcnR5IHtib29sZWFufSBbZGVwdGhCdWZmZXI9dHJ1ZV0gLSBXaGV0aGVyIHRvIGFsbG9jYXRlIGEgZGVwdGggYnVmZmVyIG9yIG5vdC5cclxuXHQgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtzdGVuY2lsQnVmZmVyPWZhbHNlXSAtIFdoZXRoZXIgdG8gYWxsb2NhdGUgYSBzdGVuY2lsIGJ1ZmZlciBvciBub3QuXHJcblx0ICogQHByb3BlcnR5IHtib29sZWFufSBbcmVzb2x2ZURlcHRoQnVmZmVyPXRydWVdIC0gV2hldGhlciB0byByZXNvbHZlIHRoZSBkZXB0aCBidWZmZXIgb3Igbm90LlxyXG5cdCAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3Jlc29sdmVTdGVuY2lsQnVmZmVyPXRydWVdIC0gV2hldGhlciAgdG8gcmVzb2x2ZSB0aGUgc3RlbmNpbCBidWZmZXIgb3Igbm90LlxyXG5cdCAqIEBwcm9wZXJ0eSB7P1RleHR1cmV9IFtkZXB0aFRleHR1cmU9bnVsbF0gLSBSZWZlcmVuY2UgdG8gYSBkZXB0aCB0ZXh0dXJlLlxyXG5cdCAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbc2FtcGxlcz0wXSAtIFRoZSBNU0FBIHNhbXBsZXMgY291bnQuXHJcblx0ICogQHByb3BlcnR5IHtudW1iZXJ9IFtjb3VudD0xXSAtIERlZmluZXMgdGhlIG51bWJlciBvZiBjb2xvciBhdHRhY2htZW50cyAuIE11c3QgYmUgYXQgbGVhc3QgYDFgLlxyXG5cdCAqL1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHJlbmRlciB0YXJnZXQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3dpZHRoPTFdIC0gVGhlIHdpZHRoIG9mIHRoZSByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbaGVpZ2h0PTFdIC0gVGhlIGhlaWdodCBvZiB0aGUgcmVuZGVyIHRhcmdldC5cclxuXHQgKiBAcGFyYW0ge1JlbmRlclRhcmdldH5PcHRpb25zfSBbb3B0aW9uc10gLSBUaGUgY29uZmlndXJhdGlvbiBvYmplY3QuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHdpZHRoID0gMSwgaGVpZ2h0ID0gMSwgb3B0aW9ucyA9IHt9ICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzUmVuZGVyVGFyZ2V0ID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB3aWR0aCBvZiB0aGUgcmVuZGVyIHRhcmdldC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLndpZHRoID0gd2lkdGg7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgaGVpZ2h0IG9mIHRoZSByZW5kZXIgdGFyZ2V0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGRlcHRoIG9mIHRoZSByZW5kZXIgdGFyZ2V0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGVwdGggPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWN0YW5ndWxhciBhcmVhIGluc2lkZSB0aGUgcmVuZGVyIHRhcmdldCdzIHZpZXdwb3J0LiBGcmFnbWVudHMgdGhhdCBhcmVcclxuXHRcdCAqIG91dHNpZGUgdGhlIGFyZWEgd2lsbCBiZSBkaXNjYXJkZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjR9XHJcblx0XHQgKiBAZGVmYXVsdCAoMCwwLHdpZHRoLGhlaWdodClcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zY2lzc29yID0gbmV3IFZlY3RvcjQoIDAsIDAsIHdpZHRoLCBoZWlnaHQgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzY2lzc29yIHRlc3Qgc2hvdWxkIGJlIGVuYWJsZWQgd2hlbiByZW5kZXJpbmcgaW50b1xyXG5cdFx0ICogdGhpcyByZW5kZXIgdGFyZ2V0IG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2Npc3NvclRlc3QgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVjdGFuZ3VsYXIgYXJlYSByZXByZXNlbnRpbmcgdGhlIHJlbmRlciB0YXJnZXQncyB2aWV3cG9ydC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yNH1cclxuXHRcdCAqIEBkZWZhdWx0ICgwLDAsd2lkdGgsaGVpZ2h0KVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnZpZXdwb3J0ID0gbmV3IFZlY3RvcjQoIDAsIDAsIHdpZHRoLCBoZWlnaHQgKTtcclxuXHJcblx0XHRjb25zdCBpbWFnZSA9IHsgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCwgZGVwdGg6IDEgfTtcclxuXHJcblx0XHRvcHRpb25zID0gT2JqZWN0LmFzc2lnbigge1xyXG5cdFx0XHRnZW5lcmF0ZU1pcG1hcHM6IGZhbHNlLFxyXG5cdFx0XHRpbnRlcm5hbEZvcm1hdDogbnVsbCxcclxuXHRcdFx0bWluRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXHJcblx0XHRcdGRlcHRoQnVmZmVyOiB0cnVlLFxyXG5cdFx0XHRzdGVuY2lsQnVmZmVyOiBmYWxzZSxcclxuXHRcdFx0cmVzb2x2ZURlcHRoQnVmZmVyOiB0cnVlLFxyXG5cdFx0XHRyZXNvbHZlU3RlbmNpbEJ1ZmZlcjogdHJ1ZSxcclxuXHRcdFx0ZGVwdGhUZXh0dXJlOiBudWxsLFxyXG5cdFx0XHRzYW1wbGVzOiAwLFxyXG5cdFx0XHRjb3VudDogMVxyXG5cdFx0fSwgb3B0aW9ucyApO1xyXG5cclxuXHRcdGNvbnN0IHRleHR1cmUgPSBuZXcgVGV4dHVyZSggaW1hZ2UsIG9wdGlvbnMubWFwcGluZywgb3B0aW9ucy53cmFwUywgb3B0aW9ucy53cmFwVCwgb3B0aW9ucy5tYWdGaWx0ZXIsIG9wdGlvbnMubWluRmlsdGVyLCBvcHRpb25zLmZvcm1hdCwgb3B0aW9ucy50eXBlLCBvcHRpb25zLmFuaXNvdHJvcHksIG9wdGlvbnMuY29sb3JTcGFjZSApO1xyXG5cclxuXHRcdHRleHR1cmUuZmxpcFkgPSBmYWxzZTtcclxuXHRcdHRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gb3B0aW9ucy5nZW5lcmF0ZU1pcG1hcHM7XHJcblx0XHR0ZXh0dXJlLmludGVybmFsRm9ybWF0ID0gb3B0aW9ucy5pbnRlcm5hbEZvcm1hdDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIGFycmF5IG9mIHRleHR1cmVzLiBFYWNoIGNvbG9yIGF0dGFjaG1lbnQgaXMgcmVwcmVzZW50ZWQgYXMgYSBzZXBhcmF0ZSB0ZXh0dXJlLlxyXG5cdFx0ICogSGFzIGF0IGxlYXN0IGEgc2luZ2xlIGVudHJ5IGZvciB0aGUgZGVmYXVsdCBjb2xvciBhdHRhY2htZW50LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxUZXh0dXJlPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50ZXh0dXJlcyA9IFtdO1xyXG5cclxuXHRcdGNvbnN0IGNvdW50ID0gb3B0aW9ucy5jb3VudDtcclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGNvdW50OyBpICsrICkge1xyXG5cclxuXHRcdFx0dGhpcy50ZXh0dXJlc1sgaSBdID0gdGV4dHVyZS5jbG9uZSgpO1xyXG5cdFx0XHR0aGlzLnRleHR1cmVzWyBpIF0uaXNSZW5kZXJUYXJnZXRUZXh0dXJlID0gdHJ1ZTtcclxuXHRcdFx0dGhpcy50ZXh0dXJlc1sgaSBdLnJlbmRlclRhcmdldCA9IHRoaXM7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0byBhbGxvY2F0ZSBhIGRlcHRoIGJ1ZmZlciBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGVwdGhCdWZmZXIgPSBvcHRpb25zLmRlcHRoQnVmZmVyO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0byBhbGxvY2F0ZSBhIHN0ZW5jaWwgYnVmZmVyIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc3RlbmNpbEJ1ZmZlciA9IG9wdGlvbnMuc3RlbmNpbEJ1ZmZlcjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdG8gcmVzb2x2ZSB0aGUgZGVwdGggYnVmZmVyIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yZXNvbHZlRGVwdGhCdWZmZXIgPSBvcHRpb25zLnJlc29sdmVEZXB0aEJ1ZmZlcjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdG8gcmVzb2x2ZSB0aGUgc3RlbmNpbCBidWZmZXIgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJlc29sdmVTdGVuY2lsQnVmZmVyID0gb3B0aW9ucy5yZXNvbHZlU3RlbmNpbEJ1ZmZlcjtcclxuXHJcblx0XHR0aGlzLl9kZXB0aFRleHR1cmUgPSBvcHRpb25zLmRlcHRoVGV4dHVyZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBudW1iZXIgb2YgTVNBQSBzYW1wbGVzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEEgdmFsdWUgb2YgYDBgIGRpc2FibGVzIE1TQUEuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zYW1wbGVzID0gb3B0aW9ucy5zYW1wbGVzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSB0ZXh0dXJlIHJlcHJlc2VudGluZyB0aGUgZGVmYXVsdCBjb2xvciBhdHRhY2htZW50LlxyXG5cdCAqXHJcblx0ICogQHR5cGUge1RleHR1cmV9XHJcblx0ICovXHJcblx0Z2V0IHRleHR1cmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMudGV4dHVyZXNbIDAgXTtcclxuXHJcblx0fVxyXG5cclxuXHRzZXQgdGV4dHVyZSggdmFsdWUgKSB7XHJcblxyXG5cdFx0dGhpcy50ZXh0dXJlc1sgMCBdID0gdmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0IGRlcHRoVGV4dHVyZSggY3VycmVudCApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuX2RlcHRoVGV4dHVyZSAhPT0gbnVsbCApIHRoaXMuX2RlcHRoVGV4dHVyZS5yZW5kZXJUYXJnZXQgPSBudWxsO1xyXG5cdFx0aWYgKCBjdXJyZW50ICE9PSBudWxsICkgY3VycmVudC5yZW5kZXJUYXJnZXQgPSB0aGlzO1xyXG5cclxuXHRcdHRoaXMuX2RlcHRoVGV4dHVyZSA9IGN1cnJlbnQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW5zdGVhZCBvZiBzYXZpbmcgdGhlIGRlcHRoIGluIGEgcmVuZGVyYnVmZmVyLCBhIHRleHR1cmVcclxuXHQgKiBjYW4gYmUgdXNlZCBpbnN0ZWFkIHdoaWNoIGlzIHVzZWZ1bCBmb3IgZnVydGhlciBwcm9jZXNzaW5nXHJcblx0ICogZS5nLiBpbiBjb250ZXh0IG9mIHBvc3QtcHJvY2Vzc2luZy5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHs/RGVwdGhUZXh0dXJlfVxyXG5cdCAqIEBkZWZhdWx0IG51bGxcclxuXHQgKi9cclxuXHRnZXQgZGVwdGhUZXh0dXJlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9kZXB0aFRleHR1cmU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgc2l6ZSBvZiB0aGlzIHJlbmRlciB0YXJnZXQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGguXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtkZXB0aD0xXSAtIFRoZSBkZXB0aC5cclxuXHQgKi9cclxuXHRzZXRTaXplKCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCA9IDEgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLndpZHRoICE9PSB3aWR0aCB8fCB0aGlzLmhlaWdodCAhPT0gaGVpZ2h0IHx8IHRoaXMuZGVwdGggIT09IGRlcHRoICkge1xyXG5cclxuXHRcdFx0dGhpcy53aWR0aCA9IHdpZHRoO1xyXG5cdFx0XHR0aGlzLmhlaWdodCA9IGhlaWdodDtcclxuXHRcdFx0dGhpcy5kZXB0aCA9IGRlcHRoO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IHRoaXMudGV4dHVyZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdHRoaXMudGV4dHVyZXNbIGkgXS5pbWFnZS53aWR0aCA9IHdpZHRoO1xyXG5cdFx0XHRcdHRoaXMudGV4dHVyZXNbIGkgXS5pbWFnZS5oZWlnaHQgPSBoZWlnaHQ7XHJcblx0XHRcdFx0dGhpcy50ZXh0dXJlc1sgaSBdLmltYWdlLmRlcHRoID0gZGVwdGg7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0aGlzLmRpc3Bvc2UoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy52aWV3cG9ydC5zZXQoIDAsIDAsIHdpZHRoLCBoZWlnaHQgKTtcclxuXHRcdHRoaXMuc2Npc3Nvci5zZXQoIDAsIDAsIHdpZHRoLCBoZWlnaHQgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbmV3IHJlbmRlciB0YXJnZXQgd2l0aCBjb3BpZWQgdmFsdWVzIGZyb20gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1JlbmRlclRhcmdldH0gQSBjbG9uZSBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNsb25lKCkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb3BpZXMgdGhlIHNldHRpbmdzIG9mIHRoZSBnaXZlbiByZW5kZXIgdGFyZ2V0LiBUaGlzIGlzIGEgc3RydWN0dXJhbCBjb3B5IHNvXHJcblx0ICogbm8gcmVzb3VyY2VzIGFyZSBzaGFyZWQgYmV0d2VlbiByZW5kZXIgdGFyZ2V0cyBhZnRlciB0aGUgY29weS4gVGhhdCBpbmNsdWRlc1xyXG5cdCAqIGFsbCBNUlQgdGV4dHVyZXMgYW5kIHRoZSBkZXB0aCB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSZW5kZXJUYXJnZXR9IHNvdXJjZSAtIFRoZSByZW5kZXIgdGFyZ2V0IHRvIGNvcHkuXHJcblx0ICogQHJldHVybiB7UmVuZGVyVGFyZ2V0fSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHR0aGlzLndpZHRoID0gc291cmNlLndpZHRoO1xyXG5cdFx0dGhpcy5oZWlnaHQgPSBzb3VyY2UuaGVpZ2h0O1xyXG5cdFx0dGhpcy5kZXB0aCA9IHNvdXJjZS5kZXB0aDtcclxuXHJcblx0XHR0aGlzLnNjaXNzb3IuY29weSggc291cmNlLnNjaXNzb3IgKTtcclxuXHRcdHRoaXMuc2Npc3NvclRlc3QgPSBzb3VyY2Uuc2Npc3NvclRlc3Q7XHJcblxyXG5cdFx0dGhpcy52aWV3cG9ydC5jb3B5KCBzb3VyY2Uudmlld3BvcnQgKTtcclxuXHJcblx0XHR0aGlzLnRleHR1cmVzLmxlbmd0aCA9IDA7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IHNvdXJjZS50ZXh0dXJlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHRcdHRoaXMudGV4dHVyZXNbIGkgXSA9IHNvdXJjZS50ZXh0dXJlc1sgaSBdLmNsb25lKCk7XHJcblx0XHRcdHRoaXMudGV4dHVyZXNbIGkgXS5pc1JlbmRlclRhcmdldFRleHR1cmUgPSB0cnVlO1xyXG5cdFx0XHR0aGlzLnRleHR1cmVzWyBpIF0ucmVuZGVyVGFyZ2V0ID0gdGhpcztcclxuXHJcblx0XHRcdC8vIGVuc3VyZSBpbWFnZSBvYmplY3QgaXMgbm90IHNoYXJlZCwgc2VlICMyMDMyOFxyXG5cclxuXHRcdFx0Y29uc3QgaW1hZ2UgPSBPYmplY3QuYXNzaWduKCB7fSwgc291cmNlLnRleHR1cmVzWyBpIF0uaW1hZ2UgKTtcclxuXHRcdFx0dGhpcy50ZXh0dXJlc1sgaSBdLnNvdXJjZSA9IG5ldyBTb3VyY2UoIGltYWdlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuZGVwdGhCdWZmZXIgPSBzb3VyY2UuZGVwdGhCdWZmZXI7XHJcblx0XHR0aGlzLnN0ZW5jaWxCdWZmZXIgPSBzb3VyY2Uuc3RlbmNpbEJ1ZmZlcjtcclxuXHJcblx0XHR0aGlzLnJlc29sdmVEZXB0aEJ1ZmZlciA9IHNvdXJjZS5yZXNvbHZlRGVwdGhCdWZmZXI7XHJcblx0XHR0aGlzLnJlc29sdmVTdGVuY2lsQnVmZmVyID0gc291cmNlLnJlc29sdmVTdGVuY2lsQnVmZmVyO1xyXG5cclxuXHRcdGlmICggc291cmNlLmRlcHRoVGV4dHVyZSAhPT0gbnVsbCApIHRoaXMuZGVwdGhUZXh0dXJlID0gc291cmNlLmRlcHRoVGV4dHVyZS5jbG9uZSgpO1xyXG5cclxuXHRcdHRoaXMuc2FtcGxlcyA9IHNvdXJjZS5zYW1wbGVzO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZyZWVzIHRoZSBHUFUtcmVsYXRlZCByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHRoaXMgaW5zdGFuY2UuIENhbGwgdGhpc1xyXG5cdCAqIG1ldGhvZCB3aGVuZXZlciB0aGlzIGluc3RhbmNlIGlzIG5vIGxvbmdlciB1c2VkIGluIHlvdXIgYXBwLlxyXG5cdCAqXHJcblx0ICogQGZpcmVzIFJlbmRlclRhcmdldCNkaXNwb3NlXHJcblx0ICovXHJcblx0ZGlzcG9zZSgpIHtcclxuXHJcblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2Rpc3Bvc2UnIH0gKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgUmVuZGVyVGFyZ2V0IH07XHJcbiIsImltcG9ydCB7IFJlbmRlclRhcmdldCB9IGZyb20gJy4uL2NvcmUvUmVuZGVyVGFyZ2V0LmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIHJlbmRlciB0YXJnZXQgdXNlZCBpbiBjb250ZXh0IG9mIHtAbGluayBXZWJHTFJlbmRlcmVyfS5cclxuICpcclxuICogQGF1Z21lbnRzIFJlbmRlclRhcmdldFxyXG4gKi9cclxuY2xhc3MgV2ViR0xSZW5kZXJUYXJnZXQgZXh0ZW5kcyBSZW5kZXJUYXJnZXQge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IDNEIHJlbmRlciB0YXJnZXQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3dpZHRoPTFdIC0gVGhlIHdpZHRoIG9mIHRoZSByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbaGVpZ2h0PTFdIC0gVGhlIGhlaWdodCBvZiB0aGUgcmVuZGVyIHRhcmdldC5cclxuXHQgKiBAcGFyYW0ge1JlbmRlclRhcmdldH5PcHRpb25zfSBbb3B0aW9uc10gLSBUaGUgY29uZmlndXJhdGlvbiBvYmplY3QuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHdpZHRoID0gMSwgaGVpZ2h0ID0gMSwgb3B0aW9ucyA9IHt9ICkge1xyXG5cclxuXHRcdHN1cGVyKCB3aWR0aCwgaGVpZ2h0LCBvcHRpb25zICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzV2ViR0xSZW5kZXJUYXJnZXQgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBXZWJHTFJlbmRlclRhcmdldCB9O1xyXG4iLCJpbXBvcnQgeyBUZXh0dXJlIH0gZnJvbSAnLi9UZXh0dXJlLmpzJztcclxuaW1wb3J0IHsgQ2xhbXBUb0VkZ2VXcmFwcGluZywgTmVhcmVzdEZpbHRlciB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0ZXh0dXJlcyBkaXJlY3RseSBmcm9tIHJhdyBidWZmZXIgZGF0YS5cclxuICpcclxuICogQGF1Z21lbnRzIFRleHR1cmVcclxuICovXHJcbmNsYXNzIERhdGFBcnJheVRleHR1cmUgZXh0ZW5kcyBUZXh0dXJlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBkYXRhIGFycmF5IHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gez9UeXBlZEFycmF5fSBbZGF0YT1udWxsXSAtIFRoZSBidWZmZXIgZGF0YS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3dpZHRoPTFdIC0gVGhlIHdpZHRoIG9mIHRoZSB0ZXh0dXJlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbaGVpZ2h0PTFdIC0gVGhlIGhlaWdodCBvZiB0aGUgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2RlcHRoPTFdIC0gVGhlIGRlcHRoIG9mIHRoZSB0ZXh0dXJlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBkYXRhID0gbnVsbCwgd2lkdGggPSAxLCBoZWlnaHQgPSAxLCBkZXB0aCA9IDEgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG51bGwgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNEYXRhQXJyYXlUZXh0dXJlID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBpbWFnZSBkZWZpbml0aW9uIG9mIGEgZGF0YSB0ZXh0dXJlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHt7ZGF0YTpUeXBlZEFycmF5LHdpZHRoOm51bWJlcixoZWlnaHQ6bnVtYmVyLGRlcHRoOm51bWJlcn19XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaW1hZ2UgPSB7IGRhdGEsIHdpZHRoLCBoZWlnaHQsIGRlcHRoIH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3cgdGhlIHRleHR1cmUgaXMgc2FtcGxlZCB3aGVuIGEgdGV4ZWwgY292ZXJzIG1vcmUgdGhhbiBvbmUgcGl4ZWwuXHJcblx0XHQgKlxyXG5cdFx0ICogT3ZlcndyaXR0ZW4gYW5kIHNldCB0byBgTmVhcmVzdEZpbHRlcmAgYnkgZGVmYXVsdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KE5lYXJlc3RGaWx0ZXJ8TmVhcmVzdE1pcG1hcE5lYXJlc3RGaWx0ZXJ8TmVhcmVzdE1pcG1hcExpbmVhckZpbHRlcnxMaW5lYXJGaWx0ZXJ8TGluZWFyTWlwbWFwTmVhcmVzdEZpbHRlcnxMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXIpfVxyXG5cdFx0ICogQGRlZmF1bHQgTmVhcmVzdEZpbHRlclxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1hZ0ZpbHRlciA9IE5lYXJlc3RGaWx0ZXI7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3cgdGhlIHRleHR1cmUgaXMgc2FtcGxlZCB3aGVuIGEgdGV4ZWwgY292ZXJzIGxlc3MgdGhhbiBvbmUgcGl4ZWwuXHJcblx0XHQgKlxyXG5cdFx0ICogT3ZlcndyaXR0ZW4gYW5kIHNldCB0byBgTmVhcmVzdEZpbHRlcmAgYnkgZGVmYXVsdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KE5lYXJlc3RGaWx0ZXJ8TmVhcmVzdE1pcG1hcE5lYXJlc3RGaWx0ZXJ8TmVhcmVzdE1pcG1hcExpbmVhckZpbHRlcnxMaW5lYXJGaWx0ZXJ8TGluZWFyTWlwbWFwTmVhcmVzdEZpbHRlcnxMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXIpfVxyXG5cdFx0ICogQGRlZmF1bHQgTmVhcmVzdEZpbHRlclxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1pbkZpbHRlciA9IE5lYXJlc3RGaWx0ZXI7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGRlZmluZXMgaG93IHRoZSB0ZXh0dXJlIGlzIHdyYXBwZWQgaW4gdGhlIGRlcHRoIGFuZCBjb3JyZXNwb25kcyB0b1xyXG5cdFx0ICogKlcqIGluIFVWVyBtYXBwaW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoUmVwZWF0V3JhcHBpbmd8Q2xhbXBUb0VkZ2VXcmFwcGluZ3xNaXJyb3JlZFJlcGVhdFdyYXBwaW5nKX1cclxuXHRcdCAqIEBkZWZhdWx0IENsYW1wVG9FZGdlV3JhcHBpbmdcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy53cmFwUiA9IENsYW1wVG9FZGdlV3JhcHBpbmc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRvIGdlbmVyYXRlIG1pcG1hcHMgKGlmIHBvc3NpYmxlKSBmb3IgYSB0ZXh0dXJlLlxyXG5cdFx0ICpcclxuXHRcdCAqIE92ZXJ3cml0dGVuIGFuZCBzZXQgdG8gYGZhbHNlYCBieSBkZWZhdWx0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIElmIHNldCB0byBgdHJ1ZWAsIHRoZSB0ZXh0dXJlIGlzIGZsaXBwZWQgYWxvbmcgdGhlIHZlcnRpY2FsIGF4aXMgd2hlblxyXG5cdFx0ICogdXBsb2FkZWQgdG8gdGhlIEdQVS5cclxuXHRcdCAqXHJcblx0XHQgKiBPdmVyd3JpdHRlbiBhbmQgc2V0IHRvIGBmYWxzZWAgYnkgZGVmYXVsdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZmxpcFkgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNwZWNpZmllcyB0aGUgYWxpZ25tZW50IHJlcXVpcmVtZW50cyBmb3IgdGhlIHN0YXJ0IG9mIGVhY2ggcGl4ZWwgcm93IGluIG1lbW9yeS5cclxuXHRcdCAqXHJcblx0XHQgKiBPdmVyd3JpdHRlbiBhbmQgc2V0IHRvIGAxYCBieSBkZWZhdWx0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVucGFja0FsaWdubWVudCA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHNldCBvZiBhbGwgbGF5ZXJzIHdoaWNoIG5lZWQgdG8gYmUgdXBkYXRlZCBpbiB0aGUgdGV4dHVyZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7U2V0PG51bWJlcj59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGF5ZXJVcGRhdGVzID0gbmV3IFNldCgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlc2NyaWJlcyB0aGF0IGEgc3BlY2lmaWMgbGF5ZXIgb2YgdGhlIHRleHR1cmUgbmVlZHMgdG8gYmUgdXBkYXRlZC5cclxuXHQgKiBOb3JtYWxseSB3aGVuIHtAbGluayBUZXh0dXJlI25lZWRzVXBkYXRlfSBpcyBzZXQgdG8gYHRydWVgLCB0aGVcclxuXHQgKiBlbnRpcmUgZGF0YSB0ZXh0dXJlIGFycmF5IGlzIHNlbnQgdG8gdGhlIEdQVS4gTWFya2luZyBzcGVjaWZpY1xyXG5cdCAqIGxheWVycyB3aWxsIG9ubHkgdHJhbnNtaXQgc3Vic2V0cyBvZiBhbGwgbWlwbWFwcyBhc3NvY2lhdGVkIHdpdGggYVxyXG5cdCAqIHNwZWNpZmljIGRlcHRoIGluIHRoZSBhcnJheSB3aGljaCBpcyBvZnRlbiBtdWNoIG1vcmUgcGVyZm9ybWFudC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBsYXllckluZGV4IC0gVGhlIGxheWVyIGluZGV4IHRoYXQgc2hvdWxkIGJlIHVwZGF0ZWQuXHJcblx0ICovXHJcblx0YWRkTGF5ZXJVcGRhdGUoIGxheWVySW5kZXggKSB7XHJcblxyXG5cdFx0dGhpcy5sYXllclVwZGF0ZXMuYWRkKCBsYXllckluZGV4ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVzZXRzIHRoZSBsYXllciB1cGRhdGVzIHJlZ2lzdHJ5LlxyXG5cdCAqL1xyXG5cdGNsZWFyTGF5ZXJVcGRhdGVzKCkge1xyXG5cclxuXHRcdHRoaXMubGF5ZXJVcGRhdGVzLmNsZWFyKCk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IERhdGFBcnJheVRleHR1cmUgfTtcclxuIiwiaW1wb3J0IHsgV2ViR0xSZW5kZXJUYXJnZXQgfSBmcm9tICcuL1dlYkdMUmVuZGVyVGFyZ2V0LmpzJztcclxuaW1wb3J0IHsgRGF0YUFycmF5VGV4dHVyZSB9IGZyb20gJy4uL3RleHR1cmVzL0RhdGFBcnJheVRleHR1cmUuanMnO1xyXG5cclxuLyoqXHJcbiAqIEFuIGFycmF5IHJlbmRlciB0YXJnZXQgdXNlZCBpbiBjb250ZXh0IG9mIHtAbGluayBXZWJHTFJlbmRlcmVyfS5cclxuICpcclxuICogQGF1Z21lbnRzIFdlYkdMUmVuZGVyVGFyZ2V0XHJcbiAqL1xyXG5jbGFzcyBXZWJHTEFycmF5UmVuZGVyVGFyZ2V0IGV4dGVuZHMgV2ViR0xSZW5kZXJUYXJnZXQge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGFycmF5IHJlbmRlciB0YXJnZXQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3dpZHRoPTFdIC0gVGhlIHdpZHRoIG9mIHRoZSByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbaGVpZ2h0PTFdIC0gVGhlIGhlaWdodCBvZiB0aGUgcmVuZGVyIHRhcmdldC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2RlcHRoPTFdIC0gVGhlIGhlaWdodCBvZiB0aGUgcmVuZGVyIHRhcmdldC5cclxuXHQgKiBAcGFyYW0ge1JlbmRlclRhcmdldH5PcHRpb25zfSBbb3B0aW9uc10gLSBUaGUgY29uZmlndXJhdGlvbiBvYmplY3QuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHdpZHRoID0gMSwgaGVpZ2h0ID0gMSwgZGVwdGggPSAxLCBvcHRpb25zID0ge30gKSB7XHJcblxyXG5cdFx0c3VwZXIoIHdpZHRoLCBoZWlnaHQsIG9wdGlvbnMgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNXZWJHTEFycmF5UmVuZGVyVGFyZ2V0ID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLmRlcHRoID0gZGVwdGg7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBPdmVyd3JpdHRlbiB3aXRoIGEgZGlmZmVyZW50IHRleHR1cmUgdHlwZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7RGF0YUFycmF5VGV4dHVyZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50ZXh0dXJlID0gbmV3IERhdGFBcnJheVRleHR1cmUoIG51bGwsIHdpZHRoLCBoZWlnaHQsIGRlcHRoICk7XHJcblxyXG5cdFx0dGhpcy50ZXh0dXJlLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFdlYkdMQXJyYXlSZW5kZXJUYXJnZXQgfTtcclxuIiwiaW1wb3J0IHsgVGV4dHVyZSB9IGZyb20gJy4vVGV4dHVyZS5qcyc7XHJcbmltcG9ydCB7IENsYW1wVG9FZGdlV3JhcHBpbmcsIE5lYXJlc3RGaWx0ZXIgfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSB0aHJlZS1kaW1lbnNpb25hbCB0ZXh0dXJlIGZyb20gcmF3IGRhdGEsIHdpdGggcGFyYW1ldGVycyB0b1xyXG4gKiBkaXZpZGUgaXQgaW50byB3aWR0aCwgaGVpZ2h0LCBhbmQgZGVwdGguXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBUZXh0dXJlXHJcbiAqL1xyXG5jbGFzcyBEYXRhM0RUZXh0dXJlIGV4dGVuZHMgVGV4dHVyZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgZGF0YSBhcnJheSB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHs/VHlwZWRBcnJheX0gW2RhdGE9bnVsbF0gLSBUaGUgYnVmZmVyIGRhdGEuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt3aWR0aD0xXSAtIFRoZSB3aWR0aCBvZiB0aGUgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2hlaWdodD0xXSAtIFRoZSBoZWlnaHQgb2YgdGhlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtkZXB0aD0xXSAtIFRoZSBkZXB0aCBvZiB0aGUgdGV4dHVyZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggZGF0YSA9IG51bGwsIHdpZHRoID0gMSwgaGVpZ2h0ID0gMSwgZGVwdGggPSAxICkge1xyXG5cclxuXHRcdC8vIFdlJ3JlIGdvaW5nIHRvIGFkZCAuc2V0WFhYKCkgbWV0aG9kcyBmb3Igc2V0dGluZyBwcm9wZXJ0aWVzIGxhdGVyLlxyXG5cdFx0Ly8gVXNlcnMgY2FuIHN0aWxsIHNldCBpbiBEYXRhM0RUZXh0dXJlIGRpcmVjdGx5LlxyXG5cdFx0Ly9cclxuXHRcdC8vXHRjb25zdCB0ZXh0dXJlID0gbmV3IFRIUkVFLkRhdGEzRFRleHR1cmUoIGRhdGEsIHdpZHRoLCBoZWlnaHQsIGRlcHRoICk7XHJcblx0XHQvLyBcdHRleHR1cmUuYW5pc290cm9weSA9IDE2O1xyXG5cdFx0Ly9cclxuXHRcdC8vIFNlZSAjMTQ4MzlcclxuXHJcblx0XHRzdXBlciggbnVsbCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0RhdGEzRFRleHR1cmUgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGltYWdlIGRlZmluaXRpb24gb2YgYSBkYXRhIHRleHR1cmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3tkYXRhOlR5cGVkQXJyYXksd2lkdGg6bnVtYmVyLGhlaWdodDpudW1iZXIsZGVwdGg6bnVtYmVyfX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pbWFnZSA9IHsgZGF0YSwgd2lkdGgsIGhlaWdodCwgZGVwdGggfTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvdyB0aGUgdGV4dHVyZSBpcyBzYW1wbGVkIHdoZW4gYSB0ZXhlbCBjb3ZlcnMgbW9yZSB0aGFuIG9uZSBwaXhlbC5cclxuXHRcdCAqXHJcblx0XHQgKiBPdmVyd3JpdHRlbiBhbmQgc2V0IHRvIGBOZWFyZXN0RmlsdGVyYCBieSBkZWZhdWx0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoTmVhcmVzdEZpbHRlcnxOZWFyZXN0TWlwbWFwTmVhcmVzdEZpbHRlcnxOZWFyZXN0TWlwbWFwTGluZWFyRmlsdGVyfExpbmVhckZpbHRlcnxMaW5lYXJNaXBtYXBOZWFyZXN0RmlsdGVyfExpbmVhck1pcG1hcExpbmVhckZpbHRlcil9XHJcblx0XHQgKiBAZGVmYXVsdCBOZWFyZXN0RmlsdGVyXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWFnRmlsdGVyID0gTmVhcmVzdEZpbHRlcjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvdyB0aGUgdGV4dHVyZSBpcyBzYW1wbGVkIHdoZW4gYSB0ZXhlbCBjb3ZlcnMgbGVzcyB0aGFuIG9uZSBwaXhlbC5cclxuXHRcdCAqXHJcblx0XHQgKiBPdmVyd3JpdHRlbiBhbmQgc2V0IHRvIGBOZWFyZXN0RmlsdGVyYCBieSBkZWZhdWx0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoTmVhcmVzdEZpbHRlcnxOZWFyZXN0TWlwbWFwTmVhcmVzdEZpbHRlcnxOZWFyZXN0TWlwbWFwTGluZWFyRmlsdGVyfExpbmVhckZpbHRlcnxMaW5lYXJNaXBtYXBOZWFyZXN0RmlsdGVyfExpbmVhck1pcG1hcExpbmVhckZpbHRlcil9XHJcblx0XHQgKiBAZGVmYXVsdCBOZWFyZXN0RmlsdGVyXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWluRmlsdGVyID0gTmVhcmVzdEZpbHRlcjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZGVmaW5lcyBob3cgdGhlIHRleHR1cmUgaXMgd3JhcHBlZCBpbiB0aGUgZGVwdGggYW5kIGNvcnJlc3BvbmRzIHRvXHJcblx0XHQgKiAqVyogaW4gVVZXIG1hcHBpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeyhSZXBlYXRXcmFwcGluZ3xDbGFtcFRvRWRnZVdyYXBwaW5nfE1pcnJvcmVkUmVwZWF0V3JhcHBpbmcpfVxyXG5cdFx0ICogQGRlZmF1bHQgQ2xhbXBUb0VkZ2VXcmFwcGluZ1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLndyYXBSID0gQ2xhbXBUb0VkZ2VXcmFwcGluZztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdG8gZ2VuZXJhdGUgbWlwbWFwcyAoaWYgcG9zc2libGUpIGZvciBhIHRleHR1cmUuXHJcblx0XHQgKlxyXG5cdFx0ICogT3ZlcndyaXR0ZW4gYW5kIHNldCB0byBgZmFsc2VgIGJ5IGRlZmF1bHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSWYgc2V0IHRvIGB0cnVlYCwgdGhlIHRleHR1cmUgaXMgZmxpcHBlZCBhbG9uZyB0aGUgdmVydGljYWwgYXhpcyB3aGVuXHJcblx0XHQgKiB1cGxvYWRlZCB0byB0aGUgR1BVLlxyXG5cdFx0ICpcclxuXHRcdCAqIE92ZXJ3cml0dGVuIGFuZCBzZXQgdG8gYGZhbHNlYCBieSBkZWZhdWx0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5mbGlwWSA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU3BlY2lmaWVzIHRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzIGZvciB0aGUgc3RhcnQgb2YgZWFjaCBwaXhlbCByb3cgaW4gbWVtb3J5LlxyXG5cdFx0ICpcclxuXHRcdCAqIE92ZXJ3cml0dGVuIGFuZCBzZXQgdG8gYDFgIGJ5IGRlZmF1bHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudW5wYWNrQWxpZ25tZW50ID0gMTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgRGF0YTNEVGV4dHVyZSB9O1xyXG4iLCJpbXBvcnQgeyBXZWJHTFJlbmRlclRhcmdldCB9IGZyb20gJy4vV2ViR0xSZW5kZXJUYXJnZXQuanMnO1xyXG5pbXBvcnQgeyBEYXRhM0RUZXh0dXJlIH0gZnJvbSAnLi4vdGV4dHVyZXMvRGF0YTNEVGV4dHVyZS5qcyc7XHJcblxyXG4vKipcclxuICogQSAzRCByZW5kZXIgdGFyZ2V0IHVzZWQgaW4gY29udGV4dCBvZiB7QGxpbmsgV2ViR0xSZW5kZXJlcn0uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBXZWJHTFJlbmRlclRhcmdldFxyXG4gKi9cclxuY2xhc3MgV2ViR0wzRFJlbmRlclRhcmdldCBleHRlbmRzIFdlYkdMUmVuZGVyVGFyZ2V0IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyAzRCByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt3aWR0aD0xXSAtIFRoZSB3aWR0aCBvZiB0aGUgcmVuZGVyIHRhcmdldC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2hlaWdodD0xXSAtIFRoZSBoZWlnaHQgb2YgdGhlIHJlbmRlciB0YXJnZXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtkZXB0aD0xXSAtIFRoZSBoZWlnaHQgb2YgdGhlIHJlbmRlciB0YXJnZXQuXHJcblx0ICogQHBhcmFtIHtSZW5kZXJUYXJnZXR+T3B0aW9uc30gW29wdGlvbnNdIC0gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCB3aWR0aCA9IDEsIGhlaWdodCA9IDEsIGRlcHRoID0gMSwgb3B0aW9ucyA9IHt9ICkge1xyXG5cclxuXHRcdHN1cGVyKCB3aWR0aCwgaGVpZ2h0LCBvcHRpb25zICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzV2ViR0wzRFJlbmRlclRhcmdldCA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy5kZXB0aCA9IGRlcHRoO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogT3ZlcndyaXR0ZW4gd2l0aCBhIGRpZmZlcmVudCB0ZXh0dXJlIHR5cGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0RhdGEzRFRleHR1cmV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudGV4dHVyZSA9IG5ldyBEYXRhM0RUZXh0dXJlKCBudWxsLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCApO1xyXG5cclxuXHRcdHRoaXMudGV4dHVyZS5pc1JlbmRlclRhcmdldFRleHR1cmUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBXZWJHTDNEUmVuZGVyVGFyZ2V0IH07XHJcbiIsImltcG9ydCB7IGNsYW1wIH0gZnJvbSAnLi9NYXRoVXRpbHMuanMnO1xyXG5cclxuLyoqXHJcbiAqIENsYXNzIGZvciByZXByZXNlbnRpbmcgYSBRdWF0ZXJuaW9uLiBRdWF0ZXJuaW9ucyBhcmUgdXNlZCBpbiB0aHJlZS5qcyB0byByZXByZXNlbnQgcm90YXRpb25zLlxyXG4gKlxyXG4gKiBJdGVyYXRpbmcgdGhyb3VnaCBhIHZlY3RvciBpbnN0YW5jZSB3aWxsIHlpZWxkIGl0cyBjb21wb25lbnRzIGAoeCwgeSwgeiwgdylgIGluXHJcbiAqIHRoZSBjb3JyZXNwb25kaW5nIG9yZGVyLlxyXG4gKlxyXG4gKiBOb3RlIHRoYXQgdGhyZWUuanMgZXhwZWN0cyBRdWF0ZXJuaW9ucyB0byBiZSBub3JtYWxpemVkLlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBxdWF0ZXJuaW9uID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKTtcclxuICogcXVhdGVybmlvbi5zZXRGcm9tQXhpc0FuZ2xlKCBuZXcgVEhSRUUuVmVjdG9yMyggMCwgMSwgMCApLCBNYXRoLlBJIC8gMiApO1xyXG4gKlxyXG4gKiBjb25zdCB2ZWN0b3IgPSBuZXcgVEhSRUUuVmVjdG9yMyggMSwgMCwgMCApO1xyXG4gKiB2ZWN0b3IuYXBwbHlRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uICk7XHJcbiAqIGBgYFxyXG4gKi9cclxuY2xhc3MgUXVhdGVybmlvbiB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcXVhdGVybmlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbeD0wXSAtIFRoZSB4IHZhbHVlIG9mIHRoaXMgcXVhdGVybmlvbi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3k9MF0gLSBUaGUgeSB2YWx1ZSBvZiB0aGlzIHF1YXRlcm5pb24uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt6PTBdIC0gVGhlIHogdmFsdWUgb2YgdGhpcyBxdWF0ZXJuaW9uLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbdz0xXSAtIFRoZSB3IHZhbHVlIG9mIHRoaXMgcXVhdGVybmlvbi5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggeCA9IDAsIHkgPSAwLCB6ID0gMCwgdyA9IDEgKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzUXVhdGVybmlvbiA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy5feCA9IHg7XHJcblx0XHR0aGlzLl95ID0geTtcclxuXHRcdHRoaXMuX3ogPSB6O1xyXG5cdFx0dGhpcy5fdyA9IHc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW50ZXJwb2xhdGVzIGJldHdlZW4gdHdvIHF1YXRlcm5pb25zIHZpYSBTTEVSUC4gVGhpcyBpbXBsZW1lbnRhdGlvbiBhc3N1bWVzIHRoZVxyXG5cdCAqIHF1YXRlcm5pb24gZGF0YSBhcmUgbWFuYWdlZCAgaW4gZmxhdCBhcnJheXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IGRzdCAtIFRoZSBkZXN0aW5hdGlvbiBhcnJheS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZHN0T2Zmc2V0IC0gQW4gb2Zmc2V0IGludG8gdGhlIGRlc3RpbmF0aW9uIGFycmF5LlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gc3JjMCAtIFRoZSBzb3VyY2UgYXJyYXkgb2YgdGhlIGZpcnN0IHF1YXRlcm5pb24uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHNyY09mZnNldDAgLSBBbiBvZmZzZXQgaW50byB0aGUgZmlyc3Qgc291cmNlIGFycmF5LlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gc3JjMSAtICBUaGUgc291cmNlIGFycmF5IG9mIHRoZSBzZWNvbmQgcXVhdGVybmlvbi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc3JjT2Zmc2V0MSAtIEFuIG9mZnNldCBpbnRvIHRoZSBzZWNvbmQgc291cmNlIGFycmF5LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0IC0gVGhlIGludGVycG9sYXRpb24gZmFjdG9yIGluIHRoZSByYW5nZSBgWzAsMV1gLlxyXG5cdCAqIEBzZWUge0BsaW5rIFF1YXRlcm5pb24jc2xlcnB9XHJcblx0ICovXHJcblx0c3RhdGljIHNsZXJwRmxhdCggZHN0LCBkc3RPZmZzZXQsIHNyYzAsIHNyY09mZnNldDAsIHNyYzEsIHNyY09mZnNldDEsIHQgKSB7XHJcblxyXG5cdFx0Ly8gZnV6ei1mcmVlLCBhcnJheS1iYXNlZCBRdWF0ZXJuaW9uIFNMRVJQIG9wZXJhdGlvblxyXG5cclxuXHRcdGxldCB4MCA9IHNyYzBbIHNyY09mZnNldDAgKyAwIF0sXHJcblx0XHRcdHkwID0gc3JjMFsgc3JjT2Zmc2V0MCArIDEgXSxcclxuXHRcdFx0ejAgPSBzcmMwWyBzcmNPZmZzZXQwICsgMiBdLFxyXG5cdFx0XHR3MCA9IHNyYzBbIHNyY09mZnNldDAgKyAzIF07XHJcblxyXG5cdFx0Y29uc3QgeDEgPSBzcmMxWyBzcmNPZmZzZXQxICsgMCBdLFxyXG5cdFx0XHR5MSA9IHNyYzFbIHNyY09mZnNldDEgKyAxIF0sXHJcblx0XHRcdHoxID0gc3JjMVsgc3JjT2Zmc2V0MSArIDIgXSxcclxuXHRcdFx0dzEgPSBzcmMxWyBzcmNPZmZzZXQxICsgMyBdO1xyXG5cclxuXHRcdGlmICggdCA9PT0gMCApIHtcclxuXHJcblx0XHRcdGRzdFsgZHN0T2Zmc2V0ICsgMCBdID0geDA7XHJcblx0XHRcdGRzdFsgZHN0T2Zmc2V0ICsgMSBdID0geTA7XHJcblx0XHRcdGRzdFsgZHN0T2Zmc2V0ICsgMiBdID0gejA7XHJcblx0XHRcdGRzdFsgZHN0T2Zmc2V0ICsgMyBdID0gdzA7XHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0ID09PSAxICkge1xyXG5cclxuXHRcdFx0ZHN0WyBkc3RPZmZzZXQgKyAwIF0gPSB4MTtcclxuXHRcdFx0ZHN0WyBkc3RPZmZzZXQgKyAxIF0gPSB5MTtcclxuXHRcdFx0ZHN0WyBkc3RPZmZzZXQgKyAyIF0gPSB6MTtcclxuXHRcdFx0ZHN0WyBkc3RPZmZzZXQgKyAzIF0gPSB3MTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHcwICE9PSB3MSB8fCB4MCAhPT0geDEgfHwgeTAgIT09IHkxIHx8IHowICE9PSB6MSApIHtcclxuXHJcblx0XHRcdGxldCBzID0gMSAtIHQ7XHJcblx0XHRcdGNvbnN0IGNvcyA9IHgwICogeDEgKyB5MCAqIHkxICsgejAgKiB6MSArIHcwICogdzEsXHJcblx0XHRcdFx0ZGlyID0gKCBjb3MgPj0gMCA/IDEgOiAtIDEgKSxcclxuXHRcdFx0XHRzcXJTaW4gPSAxIC0gY29zICogY29zO1xyXG5cclxuXHRcdFx0Ly8gU2tpcCB0aGUgU2xlcnAgZm9yIHRpbnkgc3RlcHMgdG8gYXZvaWQgbnVtZXJpYyBwcm9ibGVtczpcclxuXHRcdFx0aWYgKCBzcXJTaW4gPiBOdW1iZXIuRVBTSUxPTiApIHtcclxuXHJcblx0XHRcdFx0Y29uc3Qgc2luID0gTWF0aC5zcXJ0KCBzcXJTaW4gKSxcclxuXHRcdFx0XHRcdGxlbiA9IE1hdGguYXRhbjIoIHNpbiwgY29zICogZGlyICk7XHJcblxyXG5cdFx0XHRcdHMgPSBNYXRoLnNpbiggcyAqIGxlbiApIC8gc2luO1xyXG5cdFx0XHRcdHQgPSBNYXRoLnNpbiggdCAqIGxlbiApIC8gc2luO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgdERpciA9IHQgKiBkaXI7XHJcblxyXG5cdFx0XHR4MCA9IHgwICogcyArIHgxICogdERpcjtcclxuXHRcdFx0eTAgPSB5MCAqIHMgKyB5MSAqIHREaXI7XHJcblx0XHRcdHowID0gejAgKiBzICsgejEgKiB0RGlyO1xyXG5cdFx0XHR3MCA9IHcwICogcyArIHcxICogdERpcjtcclxuXHJcblx0XHRcdC8vIE5vcm1hbGl6ZSBpbiBjYXNlIHdlIGp1c3QgZGlkIGEgbGVycDpcclxuXHRcdFx0aWYgKCBzID09PSAxIC0gdCApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgZiA9IDEgLyBNYXRoLnNxcnQoIHgwICogeDAgKyB5MCAqIHkwICsgejAgKiB6MCArIHcwICogdzAgKTtcclxuXHJcblx0XHRcdFx0eDAgKj0gZjtcclxuXHRcdFx0XHR5MCAqPSBmO1xyXG5cdFx0XHRcdHowICo9IGY7XHJcblx0XHRcdFx0dzAgKj0gZjtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0ZHN0WyBkc3RPZmZzZXQgXSA9IHgwO1xyXG5cdFx0ZHN0WyBkc3RPZmZzZXQgKyAxIF0gPSB5MDtcclxuXHRcdGRzdFsgZHN0T2Zmc2V0ICsgMiBdID0gejA7XHJcblx0XHRkc3RbIGRzdE9mZnNldCArIDMgXSA9IHcwO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE11bHRpcGxpZXMgdHdvIHF1YXRlcm5pb25zLiBUaGlzIGltcGxlbWVudGF0aW9uIGFzc3VtZXMgdGhlIHF1YXRlcm5pb24gZGF0YSBhcmUgbWFuYWdlZFxyXG5cdCAqIGluIGZsYXQgYXJyYXlzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBkc3QgLSBUaGUgZGVzdGluYXRpb24gYXJyYXkuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGRzdE9mZnNldCAtIEFuIG9mZnNldCBpbnRvIHRoZSBkZXN0aW5hdGlvbiBhcnJheS5cclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IHNyYzAgLSBUaGUgc291cmNlIGFycmF5IG9mIHRoZSBmaXJzdCBxdWF0ZXJuaW9uLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzcmNPZmZzZXQwIC0gQW4gb2Zmc2V0IGludG8gdGhlIGZpcnN0IHNvdXJjZSBhcnJheS5cclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IHNyYzEgLSAgVGhlIHNvdXJjZSBhcnJheSBvZiB0aGUgc2Vjb25kIHF1YXRlcm5pb24uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHNyY09mZnNldDEgLSBBbiBvZmZzZXQgaW50byB0aGUgc2Vjb25kIHNvdXJjZSBhcnJheS5cclxuXHQgKiBAcmV0dXJuIHtBcnJheTxudW1iZXI+fSBUaGUgZGVzdGluYXRpb24gYXJyYXkuXHJcblx0ICogQHNlZSB7QGxpbmsgUXVhdGVybmlvbiNtdWx0aXBseVF1YXRlcm5pb25zfS5cclxuXHQgKi9cclxuXHRzdGF0aWMgbXVsdGlwbHlRdWF0ZXJuaW9uc0ZsYXQoIGRzdCwgZHN0T2Zmc2V0LCBzcmMwLCBzcmNPZmZzZXQwLCBzcmMxLCBzcmNPZmZzZXQxICkge1xyXG5cclxuXHRcdGNvbnN0IHgwID0gc3JjMFsgc3JjT2Zmc2V0MCBdO1xyXG5cdFx0Y29uc3QgeTAgPSBzcmMwWyBzcmNPZmZzZXQwICsgMSBdO1xyXG5cdFx0Y29uc3QgejAgPSBzcmMwWyBzcmNPZmZzZXQwICsgMiBdO1xyXG5cdFx0Y29uc3QgdzAgPSBzcmMwWyBzcmNPZmZzZXQwICsgMyBdO1xyXG5cclxuXHRcdGNvbnN0IHgxID0gc3JjMVsgc3JjT2Zmc2V0MSBdO1xyXG5cdFx0Y29uc3QgeTEgPSBzcmMxWyBzcmNPZmZzZXQxICsgMSBdO1xyXG5cdFx0Y29uc3QgejEgPSBzcmMxWyBzcmNPZmZzZXQxICsgMiBdO1xyXG5cdFx0Y29uc3QgdzEgPSBzcmMxWyBzcmNPZmZzZXQxICsgMyBdO1xyXG5cclxuXHRcdGRzdFsgZHN0T2Zmc2V0IF0gPSB4MCAqIHcxICsgdzAgKiB4MSArIHkwICogejEgLSB6MCAqIHkxO1xyXG5cdFx0ZHN0WyBkc3RPZmZzZXQgKyAxIF0gPSB5MCAqIHcxICsgdzAgKiB5MSArIHowICogeDEgLSB4MCAqIHoxO1xyXG5cdFx0ZHN0WyBkc3RPZmZzZXQgKyAyIF0gPSB6MCAqIHcxICsgdzAgKiB6MSArIHgwICogeTEgLSB5MCAqIHgxO1xyXG5cdFx0ZHN0WyBkc3RPZmZzZXQgKyAzIF0gPSB3MCAqIHcxIC0geDAgKiB4MSAtIHkwICogeTEgLSB6MCAqIHoxO1xyXG5cclxuXHRcdHJldHVybiBkc3Q7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIHggdmFsdWUgb2YgdGhpcyBxdWF0ZXJuaW9uLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge251bWJlcn1cclxuXHQgKiBAZGVmYXVsdCAwXHJcblx0ICovXHJcblx0Z2V0IHgoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX3g7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0IHgoIHZhbHVlICkge1xyXG5cclxuXHRcdHRoaXMuX3ggPSB2YWx1ZTtcclxuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgeSB2YWx1ZSBvZiB0aGlzIHF1YXRlcm5pb24uXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdCAqIEBkZWZhdWx0IDBcclxuXHQgKi9cclxuXHRnZXQgeSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5feTtcclxuXHJcblx0fVxyXG5cclxuXHRzZXQgeSggdmFsdWUgKSB7XHJcblxyXG5cdFx0dGhpcy5feSA9IHZhbHVlO1xyXG5cdFx0dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSB6IHZhbHVlIG9mIHRoaXMgcXVhdGVybmlvbi5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0ICogQGRlZmF1bHQgMFxyXG5cdCAqL1xyXG5cdGdldCB6KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl96O1xyXG5cclxuXHR9XHJcblxyXG5cdHNldCB6KCB2YWx1ZSApIHtcclxuXHJcblx0XHR0aGlzLl96ID0gdmFsdWU7XHJcblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIHcgdmFsdWUgb2YgdGhpcyBxdWF0ZXJuaW9uLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge251bWJlcn1cclxuXHQgKiBAZGVmYXVsdCAxXHJcblx0ICovXHJcblx0Z2V0IHcoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX3c7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0IHcoIHZhbHVlICkge1xyXG5cclxuXHRcdHRoaXMuX3cgPSB2YWx1ZTtcclxuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBxdWF0ZXJuaW9uIGNvbXBvbmVudHMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB4IHZhbHVlIG9mIHRoaXMgcXVhdGVybmlvbi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB5IHZhbHVlIG9mIHRoaXMgcXVhdGVybmlvbi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geiAtIFRoZSB6IHZhbHVlIG9mIHRoaXMgcXVhdGVybmlvbi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdyAtIFRoZSB3IHZhbHVlIG9mIHRoaXMgcXVhdGVybmlvbi5cclxuXHQgKiBAcmV0dXJuIHtRdWF0ZXJuaW9ufSBBIHJlZmVyZW5jZSB0byB0aGlzIHF1YXRlcm5pb24uXHJcblx0ICovXHJcblx0c2V0KCB4LCB5LCB6LCB3ICkge1xyXG5cclxuXHRcdHRoaXMuX3ggPSB4O1xyXG5cdFx0dGhpcy5feSA9IHk7XHJcblx0XHR0aGlzLl96ID0gejtcclxuXHRcdHRoaXMuX3cgPSB3O1xyXG5cclxuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbmV3IHF1YXRlcm5pb24gd2l0aCBjb3BpZWQgdmFsdWVzIGZyb20gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1F1YXRlcm5pb259IEEgY2xvbmUgb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjbG9uZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuX3gsIHRoaXMuX3ksIHRoaXMuX3osIHRoaXMuX3cgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gcXVhdGVybmlvbiB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtRdWF0ZXJuaW9ufSBxdWF0ZXJuaW9uIC0gVGhlIHF1YXRlcm5pb24gdG8gY29weS5cclxuXHQgKiBAcmV0dXJuIHtRdWF0ZXJuaW9ufSBBIHJlZmVyZW5jZSB0byB0aGlzIHF1YXRlcm5pb24uXHJcblx0ICovXHJcblx0Y29weSggcXVhdGVybmlvbiApIHtcclxuXHJcblx0XHR0aGlzLl94ID0gcXVhdGVybmlvbi54O1xyXG5cdFx0dGhpcy5feSA9IHF1YXRlcm5pb24ueTtcclxuXHRcdHRoaXMuX3ogPSBxdWF0ZXJuaW9uLno7XHJcblx0XHR0aGlzLl93ID0gcXVhdGVybmlvbi53O1xyXG5cclxuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoaXMgcXVhdGVybmlvbiBmcm9tIHRoZSByb3RhdGlvbiBzcGVjaWZpZWQgYnkgdGhlIGdpdmVuXHJcblx0ICogRXVsZXIgYW5nbGVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtFdWxlcn0gZXVsZXIgLSBUaGUgRXVsZXIgYW5nbGVzLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW3VwZGF0ZT10cnVlXSAtIFdoZXRoZXIgdGhlIGludGVybmFsIGBvbkNoYW5nZWAgY2FsbGJhY2sgc2hvdWxkIGJlIGV4ZWN1dGVkIG9yIG5vdC5cclxuXHQgKiBAcmV0dXJuIHtRdWF0ZXJuaW9ufSBBIHJlZmVyZW5jZSB0byB0aGlzIHF1YXRlcm5pb24uXHJcblx0ICovXHJcblx0c2V0RnJvbUV1bGVyKCBldWxlciwgdXBkYXRlID0gdHJ1ZSApIHtcclxuXHJcblx0XHRjb25zdCB4ID0gZXVsZXIuX3gsIHkgPSBldWxlci5feSwgeiA9IGV1bGVyLl96LCBvcmRlciA9IGV1bGVyLl9vcmRlcjtcclxuXHJcblx0XHQvLyBodHRwOi8vd3d3Lm1hdGh3b3Jrcy5jb20vbWF0bGFiY2VudHJhbC9maWxlZXhjaGFuZ2UvXHJcblx0XHQvLyBcdDIwNjk2LWZ1bmN0aW9uLXRvLWNvbnZlcnQtYmV0d2Vlbi1kY20tZXVsZXItYW5nbGVzLXF1YXRlcm5pb25zLWFuZC1ldWxlci12ZWN0b3JzL1xyXG5cdFx0Ly9cdGNvbnRlbnQvU3BpbkNhbGMubVxyXG5cclxuXHRcdGNvbnN0IGNvcyA9IE1hdGguY29zO1xyXG5cdFx0Y29uc3Qgc2luID0gTWF0aC5zaW47XHJcblxyXG5cdFx0Y29uc3QgYzEgPSBjb3MoIHggLyAyICk7XHJcblx0XHRjb25zdCBjMiA9IGNvcyggeSAvIDIgKTtcclxuXHRcdGNvbnN0IGMzID0gY29zKCB6IC8gMiApO1xyXG5cclxuXHRcdGNvbnN0IHMxID0gc2luKCB4IC8gMiApO1xyXG5cdFx0Y29uc3QgczIgPSBzaW4oIHkgLyAyICk7XHJcblx0XHRjb25zdCBzMyA9IHNpbiggeiAvIDIgKTtcclxuXHJcblx0XHRzd2l0Y2ggKCBvcmRlciApIHtcclxuXHJcblx0XHRcdGNhc2UgJ1hZWic6XHJcblx0XHRcdFx0dGhpcy5feCA9IHMxICogYzIgKiBjMyArIGMxICogczIgKiBzMztcclxuXHRcdFx0XHR0aGlzLl95ID0gYzEgKiBzMiAqIGMzIC0gczEgKiBjMiAqIHMzO1xyXG5cdFx0XHRcdHRoaXMuX3ogPSBjMSAqIGMyICogczMgKyBzMSAqIHMyICogYzM7XHJcblx0XHRcdFx0dGhpcy5fdyA9IGMxICogYzIgKiBjMyAtIHMxICogczIgKiBzMztcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgJ1lYWic6XHJcblx0XHRcdFx0dGhpcy5feCA9IHMxICogYzIgKiBjMyArIGMxICogczIgKiBzMztcclxuXHRcdFx0XHR0aGlzLl95ID0gYzEgKiBzMiAqIGMzIC0gczEgKiBjMiAqIHMzO1xyXG5cdFx0XHRcdHRoaXMuX3ogPSBjMSAqIGMyICogczMgLSBzMSAqIHMyICogYzM7XHJcblx0XHRcdFx0dGhpcy5fdyA9IGMxICogYzIgKiBjMyArIHMxICogczIgKiBzMztcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgJ1pYWSc6XHJcblx0XHRcdFx0dGhpcy5feCA9IHMxICogYzIgKiBjMyAtIGMxICogczIgKiBzMztcclxuXHRcdFx0XHR0aGlzLl95ID0gYzEgKiBzMiAqIGMzICsgczEgKiBjMiAqIHMzO1xyXG5cdFx0XHRcdHRoaXMuX3ogPSBjMSAqIGMyICogczMgKyBzMSAqIHMyICogYzM7XHJcblx0XHRcdFx0dGhpcy5fdyA9IGMxICogYzIgKiBjMyAtIHMxICogczIgKiBzMztcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgJ1pZWCc6XHJcblx0XHRcdFx0dGhpcy5feCA9IHMxICogYzIgKiBjMyAtIGMxICogczIgKiBzMztcclxuXHRcdFx0XHR0aGlzLl95ID0gYzEgKiBzMiAqIGMzICsgczEgKiBjMiAqIHMzO1xyXG5cdFx0XHRcdHRoaXMuX3ogPSBjMSAqIGMyICogczMgLSBzMSAqIHMyICogYzM7XHJcblx0XHRcdFx0dGhpcy5fdyA9IGMxICogYzIgKiBjMyArIHMxICogczIgKiBzMztcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgJ1laWCc6XHJcblx0XHRcdFx0dGhpcy5feCA9IHMxICogYzIgKiBjMyArIGMxICogczIgKiBzMztcclxuXHRcdFx0XHR0aGlzLl95ID0gYzEgKiBzMiAqIGMzICsgczEgKiBjMiAqIHMzO1xyXG5cdFx0XHRcdHRoaXMuX3ogPSBjMSAqIGMyICogczMgLSBzMSAqIHMyICogYzM7XHJcblx0XHRcdFx0dGhpcy5fdyA9IGMxICogYzIgKiBjMyAtIHMxICogczIgKiBzMztcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgJ1haWSc6XHJcblx0XHRcdFx0dGhpcy5feCA9IHMxICogYzIgKiBjMyAtIGMxICogczIgKiBzMztcclxuXHRcdFx0XHR0aGlzLl95ID0gYzEgKiBzMiAqIGMzIC0gczEgKiBjMiAqIHMzO1xyXG5cdFx0XHRcdHRoaXMuX3ogPSBjMSAqIGMyICogczMgKyBzMSAqIHMyICogYzM7XHJcblx0XHRcdFx0dGhpcy5fdyA9IGMxICogYzIgKiBjMyArIHMxICogczIgKiBzMztcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUXVhdGVybmlvbjogLnNldEZyb21FdWxlcigpIGVuY291bnRlcmVkIGFuIHVua25vd24gb3JkZXI6ICcgKyBvcmRlciApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHVwZGF0ZSA9PT0gdHJ1ZSApIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoaXMgcXVhdGVybmlvbiBmcm9tIHRoZSBnaXZlbiBheGlzIGFuZCBhbmdsZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gYXhpcyAtIFRoZSBub3JtYWxpemVkIGF4aXMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFuZ2xlIC0gVGhlIGFuZ2xlIGluIHJhZGlhbnMuXHJcblx0ICogQHJldHVybiB7UXVhdGVybmlvbn0gQSByZWZlcmVuY2UgdG8gdGhpcyBxdWF0ZXJuaW9uLlxyXG5cdCAqL1xyXG5cdHNldEZyb21BeGlzQW5nbGUoIGF4aXMsIGFuZ2xlICkge1xyXG5cclxuXHRcdC8vIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2dlb21ldHJ5L3JvdGF0aW9ucy9jb252ZXJzaW9ucy9hbmdsZVRvUXVhdGVybmlvbi9pbmRleC5odG1cclxuXHJcblx0XHRjb25zdCBoYWxmQW5nbGUgPSBhbmdsZSAvIDIsIHMgPSBNYXRoLnNpbiggaGFsZkFuZ2xlICk7XHJcblxyXG5cdFx0dGhpcy5feCA9IGF4aXMueCAqIHM7XHJcblx0XHR0aGlzLl95ID0gYXhpcy55ICogcztcclxuXHRcdHRoaXMuX3ogPSBheGlzLnogKiBzO1xyXG5cdFx0dGhpcy5fdyA9IE1hdGguY29zKCBoYWxmQW5nbGUgKTtcclxuXHJcblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGlzIHF1YXRlcm5pb24gZnJvbSB0aGUgZ2l2ZW4gcm90YXRpb24gbWF0cml4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRyaXg0fSBtIC0gQSA0eDQgbWF0cml4IG9mIHdoaWNoIHRoZSB1cHBlciAzeDMgb2YgbWF0cml4IGlzIGEgcHVyZSByb3RhdGlvbiBtYXRyaXggKGkuZS4gdW5zY2FsZWQpLlxyXG5cdCAqIEByZXR1cm4ge1F1YXRlcm5pb259IEEgcmVmZXJlbmNlIHRvIHRoaXMgcXVhdGVybmlvbi5cclxuXHQgKi9cclxuXHRzZXRGcm9tUm90YXRpb25NYXRyaXgoIG0gKSB7XHJcblxyXG5cdFx0Ly8gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvZ2VvbWV0cnkvcm90YXRpb25zL2NvbnZlcnNpb25zL21hdHJpeFRvUXVhdGVybmlvbi9pbmRleC5odG1cclxuXHJcblx0XHQvLyBhc3N1bWVzIHRoZSB1cHBlciAzeDMgb2YgbSBpcyBhIHB1cmUgcm90YXRpb24gbWF0cml4IChpLmUsIHVuc2NhbGVkKVxyXG5cclxuXHRcdGNvbnN0IHRlID0gbS5lbGVtZW50cyxcclxuXHJcblx0XHRcdG0xMSA9IHRlWyAwIF0sIG0xMiA9IHRlWyA0IF0sIG0xMyA9IHRlWyA4IF0sXHJcblx0XHRcdG0yMSA9IHRlWyAxIF0sIG0yMiA9IHRlWyA1IF0sIG0yMyA9IHRlWyA5IF0sXHJcblx0XHRcdG0zMSA9IHRlWyAyIF0sIG0zMiA9IHRlWyA2IF0sIG0zMyA9IHRlWyAxMCBdLFxyXG5cclxuXHRcdFx0dHJhY2UgPSBtMTEgKyBtMjIgKyBtMzM7XHJcblxyXG5cdFx0aWYgKCB0cmFjZSA+IDAgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBzID0gMC41IC8gTWF0aC5zcXJ0KCB0cmFjZSArIDEuMCApO1xyXG5cclxuXHRcdFx0dGhpcy5fdyA9IDAuMjUgLyBzO1xyXG5cdFx0XHR0aGlzLl94ID0gKCBtMzIgLSBtMjMgKSAqIHM7XHJcblx0XHRcdHRoaXMuX3kgPSAoIG0xMyAtIG0zMSApICogcztcclxuXHRcdFx0dGhpcy5feiA9ICggbTIxIC0gbTEyICkgKiBzO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIG0xMSA+IG0yMiAmJiBtMTEgPiBtMzMgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBzID0gMi4wICogTWF0aC5zcXJ0KCAxLjAgKyBtMTEgLSBtMjIgLSBtMzMgKTtcclxuXHJcblx0XHRcdHRoaXMuX3cgPSAoIG0zMiAtIG0yMyApIC8gcztcclxuXHRcdFx0dGhpcy5feCA9IDAuMjUgKiBzO1xyXG5cdFx0XHR0aGlzLl95ID0gKCBtMTIgKyBtMjEgKSAvIHM7XHJcblx0XHRcdHRoaXMuX3ogPSAoIG0xMyArIG0zMSApIC8gcztcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBtMjIgPiBtMzMgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBzID0gMi4wICogTWF0aC5zcXJ0KCAxLjAgKyBtMjIgLSBtMTEgLSBtMzMgKTtcclxuXHJcblx0XHRcdHRoaXMuX3cgPSAoIG0xMyAtIG0zMSApIC8gcztcclxuXHRcdFx0dGhpcy5feCA9ICggbTEyICsgbTIxICkgLyBzO1xyXG5cdFx0XHR0aGlzLl95ID0gMC4yNSAqIHM7XHJcblx0XHRcdHRoaXMuX3ogPSAoIG0yMyArIG0zMiApIC8gcztcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc3QgcyA9IDIuMCAqIE1hdGguc3FydCggMS4wICsgbTMzIC0gbTExIC0gbTIyICk7XHJcblxyXG5cdFx0XHR0aGlzLl93ID0gKCBtMjEgLSBtMTIgKSAvIHM7XHJcblx0XHRcdHRoaXMuX3ggPSAoIG0xMyArIG0zMSApIC8gcztcclxuXHRcdFx0dGhpcy5feSA9ICggbTIzICsgbTMyICkgLyBzO1xyXG5cdFx0XHR0aGlzLl96ID0gMC4yNSAqIHM7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoaXMgcXVhdGVybmlvbiB0byB0aGUgcm90YXRpb24gcmVxdWlyZWQgdG8gcm90YXRlIHRoZSBkaXJlY3Rpb24gdmVjdG9yXHJcblx0ICogYHZGcm9tYCB0byB0aGUgZGlyZWN0aW9uIHZlY3RvciBgdlRvYC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdkZyb20gLSBUaGUgZmlyc3QgKG5vcm1hbGl6ZWQpIGRpcmVjdGlvbiB2ZWN0b3IuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB2VG8gLSBUaGUgc2Vjb25kIChub3JtYWxpemVkKSBkaXJlY3Rpb24gdmVjdG9yLlxyXG5cdCAqIEByZXR1cm4ge1F1YXRlcm5pb259IEEgcmVmZXJlbmNlIHRvIHRoaXMgcXVhdGVybmlvbi5cclxuXHQgKi9cclxuXHRzZXRGcm9tVW5pdFZlY3RvcnMoIHZGcm9tLCB2VG8gKSB7XHJcblxyXG5cdFx0Ly8gYXNzdW1lcyBkaXJlY3Rpb24gdmVjdG9ycyB2RnJvbSBhbmQgdlRvIGFyZSBub3JtYWxpemVkXHJcblxyXG5cdFx0bGV0IHIgPSB2RnJvbS5kb3QoIHZUbyApICsgMTtcclxuXHJcblx0XHRpZiAoIHIgPCBOdW1iZXIuRVBTSUxPTiApIHtcclxuXHJcblx0XHRcdC8vIHZGcm9tIGFuZCB2VG8gcG9pbnQgaW4gb3Bwb3NpdGUgZGlyZWN0aW9uc1xyXG5cclxuXHRcdFx0ciA9IDA7XHJcblxyXG5cdFx0XHRpZiAoIE1hdGguYWJzKCB2RnJvbS54ICkgPiBNYXRoLmFicyggdkZyb20ueiApICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLl94ID0gLSB2RnJvbS55O1xyXG5cdFx0XHRcdHRoaXMuX3kgPSB2RnJvbS54O1xyXG5cdFx0XHRcdHRoaXMuX3ogPSAwO1xyXG5cdFx0XHRcdHRoaXMuX3cgPSByO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0dGhpcy5feCA9IDA7XHJcblx0XHRcdFx0dGhpcy5feSA9IC0gdkZyb20uejtcclxuXHRcdFx0XHR0aGlzLl96ID0gdkZyb20ueTtcclxuXHRcdFx0XHR0aGlzLl93ID0gcjtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Ly8gY3Jvc3NWZWN0b3JzKCB2RnJvbSwgdlRvICk7IC8vIGlubGluZWQgdG8gYXZvaWQgY3ljbGljIGRlcGVuZGVuY3kgb24gVmVjdG9yM1xyXG5cclxuXHRcdFx0dGhpcy5feCA9IHZGcm9tLnkgKiB2VG8ueiAtIHZGcm9tLnogKiB2VG8ueTtcclxuXHRcdFx0dGhpcy5feSA9IHZGcm9tLnogKiB2VG8ueCAtIHZGcm9tLnggKiB2VG8uejtcclxuXHRcdFx0dGhpcy5feiA9IHZGcm9tLnggKiB2VG8ueSAtIHZGcm9tLnkgKiB2VG8ueDtcclxuXHRcdFx0dGhpcy5fdyA9IHI7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzLm5vcm1hbGl6ZSgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGFuZ2xlIGJldHdlZW4gdGhpcyBxdWF0ZXJuaW9uIGFuZCB0aGUgZ2l2ZW4gb25lIGluIHJhZGlhbnMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1F1YXRlcm5pb259IHEgLSBUaGUgcXVhdGVybmlvbiB0byBjb21wdXRlIHRoZSBhbmdsZSB3aXRoLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGFuZ2xlIGluIHJhZGlhbnMuXHJcblx0ICovXHJcblx0YW5nbGVUbyggcSApIHtcclxuXHJcblx0XHRyZXR1cm4gMiAqIE1hdGguYWNvcyggTWF0aC5hYnMoIGNsYW1wKCB0aGlzLmRvdCggcSApLCAtIDEsIDEgKSApICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUm90YXRlcyB0aGlzIHF1YXRlcm5pb24gYnkgYSBnaXZlbiBhbmd1bGFyIHN0ZXAgdG8gdGhlIGdpdmVuIHF1YXRlcm5pb24uXHJcblx0ICogVGhlIG1ldGhvZCBlbnN1cmVzIHRoYXQgdGhlIGZpbmFsIHF1YXRlcm5pb24gd2lsbCBub3Qgb3ZlcnNob290IGBxYC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UXVhdGVybmlvbn0gcSAtIFRoZSB0YXJnZXQgcXVhdGVybmlvbi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc3RlcCAtIFRoZSBhbmd1bGFyIHN0ZXAgaW4gcmFkaWFucy5cclxuXHQgKiBAcmV0dXJuIHtRdWF0ZXJuaW9ufSBBIHJlZmVyZW5jZSB0byB0aGlzIHF1YXRlcm5pb24uXHJcblx0ICovXHJcblx0cm90YXRlVG93YXJkcyggcSwgc3RlcCApIHtcclxuXHJcblx0XHRjb25zdCBhbmdsZSA9IHRoaXMuYW5nbGVUbyggcSApO1xyXG5cclxuXHRcdGlmICggYW5nbGUgPT09IDAgKSByZXR1cm4gdGhpcztcclxuXHJcblx0XHRjb25zdCB0ID0gTWF0aC5taW4oIDEsIHN0ZXAgLyBhbmdsZSApO1xyXG5cclxuXHRcdHRoaXMuc2xlcnAoIHEsIHQgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoaXMgcXVhdGVybmlvbiB0byB0aGUgaWRlbnRpdHkgcXVhdGVybmlvbjsgdGhhdCBpcywgdG8gdGhlXHJcblx0ICogcXVhdGVybmlvbiB0aGF0IHJlcHJlc2VudHMgXCJubyByb3RhdGlvblwiLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7UXVhdGVybmlvbn0gQSByZWZlcmVuY2UgdG8gdGhpcyBxdWF0ZXJuaW9uLlxyXG5cdCAqL1xyXG5cdGlkZW50aXR5KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnNldCggMCwgMCwgMCwgMSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEludmVydHMgdGhpcyBxdWF0ZXJuaW9uIHZpYSB7QGxpbmsgUXVhdGVybmlvbiNjb25qdWdhdGV9LiBUaGVcclxuXHQgKiBxdWF0ZXJuaW9uIGlzIGFzc3VtZWQgdG8gaGF2ZSB1bml0IGxlbmd0aC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1F1YXRlcm5pb259IEEgcmVmZXJlbmNlIHRvIHRoaXMgcXVhdGVybmlvbi5cclxuXHQgKi9cclxuXHRpbnZlcnQoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuY29uanVnYXRlKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgcm90YXRpb25hbCBjb25qdWdhdGUgb2YgdGhpcyBxdWF0ZXJuaW9uLiBUaGUgY29uanVnYXRlIG9mIGFcclxuXHQgKiBxdWF0ZXJuaW9uIHJlcHJlc2VudHMgdGhlIHNhbWUgcm90YXRpb24gaW4gdGhlIG9wcG9zaXRlIGRpcmVjdGlvbiBhYm91dFxyXG5cdCAqIHRoZSByb3RhdGlvbmFsIGF4aXMuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtRdWF0ZXJuaW9ufSBBIHJlZmVyZW5jZSB0byB0aGlzIHF1YXRlcm5pb24uXHJcblx0ICovXHJcblx0Y29uanVnYXRlKCkge1xyXG5cclxuXHRcdHRoaXMuX3ggKj0gLSAxO1xyXG5cdFx0dGhpcy5feSAqPSAtIDE7XHJcblx0XHR0aGlzLl96ICo9IC0gMTtcclxuXHJcblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2FsY3VsYXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdGhpcyBxdWF0ZXJuaW9uIGFuZCB0aGUgZ2l2ZW4gb25lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtRdWF0ZXJuaW9ufSB2IC0gVGhlIHF1YXRlcm5pb24gdG8gY29tcHV0ZSB0aGUgZG90IHByb2R1Y3Qgd2l0aC5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSByZXN1bHQgb2YgdGhlIGRvdCBwcm9kdWN0LlxyXG5cdCAqL1xyXG5cdGRvdCggdiApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5feCAqIHYuX3ggKyB0aGlzLl95ICogdi5feSArIHRoaXMuX3ogKiB2Ll96ICsgdGhpcy5fdyAqIHYuX3c7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgdGhlIHNxdWFyZWQgRXVjbGlkZWFuIGxlbmd0aCAoc3RyYWlnaHQtbGluZSBsZW5ndGgpIG9mIHRoaXMgcXVhdGVybmlvbixcclxuXHQgKiBjb25zaWRlcmVkIGFzIGEgNCBkaW1lbnNpb25hbCB2ZWN0b3IuIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3UgYXJlIGNvbXBhcmluZyB0aGVcclxuXHQgKiBsZW5ndGhzIG9mIHR3byBxdWF0ZXJuaW9ucywgYXMgdGhpcyBpcyBhIHNsaWdodGx5IG1vcmUgZWZmaWNpZW50IGNhbGN1bGF0aW9uIHRoYW5cclxuXHQgKiB7QGxpbmsgUXVhdGVybmlvbiNsZW5ndGh9LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgc3F1YXJlZCBFdWNsaWRlYW4gbGVuZ3RoLlxyXG5cdCAqL1xyXG5cdGxlbmd0aFNxKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl94ICogdGhpcy5feCArIHRoaXMuX3kgKiB0aGlzLl95ICsgdGhpcy5feiAqIHRoaXMuX3ogKyB0aGlzLl93ICogdGhpcy5fdztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB0aGUgRXVjbGlkZWFuIGxlbmd0aCAoc3RyYWlnaHQtbGluZSBsZW5ndGgpIG9mIHRoaXMgcXVhdGVybmlvbixcclxuXHQgKiBjb25zaWRlcmVkIGFzIGEgNCBkaW1lbnNpb25hbCB2ZWN0b3IuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBFdWNsaWRlYW4gbGVuZ3RoLlxyXG5cdCAqL1xyXG5cdGxlbmd0aCgpIHtcclxuXHJcblx0XHRyZXR1cm4gTWF0aC5zcXJ0KCB0aGlzLl94ICogdGhpcy5feCArIHRoaXMuX3kgKiB0aGlzLl95ICsgdGhpcy5feiAqIHRoaXMuX3ogKyB0aGlzLl93ICogdGhpcy5fdyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE5vcm1hbGl6ZXMgdGhpcyBxdWF0ZXJuaW9uIC0gdGhhdCBpcywgY2FsY3VsYXRlZCB0aGUgcXVhdGVybmlvbiB0aGF0IHBlcmZvcm1zXHJcblx0ICogdGhlIHNhbWUgcm90YXRpb24gYXMgdGhpcyBvbmUsIGJ1dCBoYXMgYSBsZW5ndGggZXF1YWwgdG8gYDFgLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7UXVhdGVybmlvbn0gQSByZWZlcmVuY2UgdG8gdGhpcyBxdWF0ZXJuaW9uLlxyXG5cdCAqL1xyXG5cdG5vcm1hbGl6ZSgpIHtcclxuXHJcblx0XHRsZXQgbCA9IHRoaXMubGVuZ3RoKCk7XHJcblxyXG5cdFx0aWYgKCBsID09PSAwICkge1xyXG5cclxuXHRcdFx0dGhpcy5feCA9IDA7XHJcblx0XHRcdHRoaXMuX3kgPSAwO1xyXG5cdFx0XHR0aGlzLl96ID0gMDtcclxuXHRcdFx0dGhpcy5fdyA9IDE7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGwgPSAxIC8gbDtcclxuXHJcblx0XHRcdHRoaXMuX3ggPSB0aGlzLl94ICogbDtcclxuXHRcdFx0dGhpcy5feSA9IHRoaXMuX3kgKiBsO1xyXG5cdFx0XHR0aGlzLl96ID0gdGhpcy5feiAqIGw7XHJcblx0XHRcdHRoaXMuX3cgPSB0aGlzLl93ICogbDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE11bHRpcGxpZXMgdGhpcyBxdWF0ZXJuaW9uIGJ5IHRoZSBnaXZlbiBvbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1F1YXRlcm5pb259IHEgLSBUaGUgcXVhdGVybmlvbi5cclxuXHQgKiBAcmV0dXJuIHtRdWF0ZXJuaW9ufSBBIHJlZmVyZW5jZSB0byB0aGlzIHF1YXRlcm5pb24uXHJcblx0ICovXHJcblx0bXVsdGlwbHkoIHEgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyggdGhpcywgcSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFByZS1tdWx0aXBsaWVzIHRoaXMgcXVhdGVybmlvbiBieSB0aGUgZ2l2ZW4gb25lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtRdWF0ZXJuaW9ufSBxIC0gVGhlIHF1YXRlcm5pb24uXHJcblx0ICogQHJldHVybiB7UXVhdGVybmlvbn0gQSByZWZlcmVuY2UgdG8gdGhpcyBxdWF0ZXJuaW9uLlxyXG5cdCAqL1xyXG5cdHByZW11bHRpcGx5KCBxICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5UXVhdGVybmlvbnMoIHEsIHRoaXMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBNdWx0aXBsaWVzIHRoZSBnaXZlbiBxdWF0ZXJuaW9ucyBhbmQgc3RvcmVzIHRoZSByZXN1bHQgaW4gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UXVhdGVybmlvbn0gYSAtIFRoZSBmaXJzdCBxdWF0ZXJuaW9uLlxyXG5cdCAqIEBwYXJhbSB7UXVhdGVybmlvbn0gYiAtIFRoZSBzZWNvbmQgcXVhdGVybmlvbi5cclxuXHQgKiBAcmV0dXJuIHtRdWF0ZXJuaW9ufSBBIHJlZmVyZW5jZSB0byB0aGlzIHF1YXRlcm5pb24uXHJcblx0ICovXHJcblx0bXVsdGlwbHlRdWF0ZXJuaW9ucyggYSwgYiApIHtcclxuXHJcblx0XHQvLyBmcm9tIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2FsZ2VicmEvcmVhbE5vcm1lZEFsZ2VicmEvcXVhdGVybmlvbnMvY29kZS9pbmRleC5odG1cclxuXHJcblx0XHRjb25zdCBxYXggPSBhLl94LCBxYXkgPSBhLl95LCBxYXogPSBhLl96LCBxYXcgPSBhLl93O1xyXG5cdFx0Y29uc3QgcWJ4ID0gYi5feCwgcWJ5ID0gYi5feSwgcWJ6ID0gYi5feiwgcWJ3ID0gYi5fdztcclxuXHJcblx0XHR0aGlzLl94ID0gcWF4ICogcWJ3ICsgcWF3ICogcWJ4ICsgcWF5ICogcWJ6IC0gcWF6ICogcWJ5O1xyXG5cdFx0dGhpcy5feSA9IHFheSAqIHFidyArIHFhdyAqIHFieSArIHFheiAqIHFieCAtIHFheCAqIHFiejtcclxuXHRcdHRoaXMuX3ogPSBxYXogKiBxYncgKyBxYXcgKiBxYnogKyBxYXggKiBxYnkgLSBxYXkgKiBxYng7XHJcblx0XHR0aGlzLl93ID0gcWF3ICogcWJ3IC0gcWF4ICogcWJ4IC0gcWF5ICogcWJ5IC0gcWF6ICogcWJ6O1xyXG5cclxuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQZXJmb3JtcyBhIHNwaGVyaWNhbCBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHF1YXRlcm5pb25zLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtRdWF0ZXJuaW9ufSBxYiAtIFRoZSB0YXJnZXQgcXVhdGVybmlvbi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdCAtIFRoZSBpbnRlcnBvbGF0aW9uIGZhY3RvciBpbiB0aGUgY2xvc2VkIGludGVydmFsIGBbMCwgMV1gLlxyXG5cdCAqIEByZXR1cm4ge1F1YXRlcm5pb259IEEgcmVmZXJlbmNlIHRvIHRoaXMgcXVhdGVybmlvbi5cclxuXHQgKi9cclxuXHRzbGVycCggcWIsIHQgKSB7XHJcblxyXG5cdFx0aWYgKCB0ID09PSAwICkgcmV0dXJuIHRoaXM7XHJcblx0XHRpZiAoIHQgPT09IDEgKSByZXR1cm4gdGhpcy5jb3B5KCBxYiApO1xyXG5cclxuXHRcdGNvbnN0IHggPSB0aGlzLl94LCB5ID0gdGhpcy5feSwgeiA9IHRoaXMuX3osIHcgPSB0aGlzLl93O1xyXG5cclxuXHRcdC8vIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2FsZ2VicmEvcmVhbE5vcm1lZEFsZ2VicmEvcXVhdGVybmlvbnMvc2xlcnAvXHJcblxyXG5cdFx0bGV0IGNvc0hhbGZUaGV0YSA9IHcgKiBxYi5fdyArIHggKiBxYi5feCArIHkgKiBxYi5feSArIHogKiBxYi5fejtcclxuXHJcblx0XHRpZiAoIGNvc0hhbGZUaGV0YSA8IDAgKSB7XHJcblxyXG5cdFx0XHR0aGlzLl93ID0gLSBxYi5fdztcclxuXHRcdFx0dGhpcy5feCA9IC0gcWIuX3g7XHJcblx0XHRcdHRoaXMuX3kgPSAtIHFiLl95O1xyXG5cdFx0XHR0aGlzLl96ID0gLSBxYi5fejtcclxuXHJcblx0XHRcdGNvc0hhbGZUaGV0YSA9IC0gY29zSGFsZlRoZXRhO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR0aGlzLmNvcHkoIHFiICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggY29zSGFsZlRoZXRhID49IDEuMCApIHtcclxuXHJcblx0XHRcdHRoaXMuX3cgPSB3O1xyXG5cdFx0XHR0aGlzLl94ID0geDtcclxuXHRcdFx0dGhpcy5feSA9IHk7XHJcblx0XHRcdHRoaXMuX3ogPSB6O1xyXG5cclxuXHRcdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHNxclNpbkhhbGZUaGV0YSA9IDEuMCAtIGNvc0hhbGZUaGV0YSAqIGNvc0hhbGZUaGV0YTtcclxuXHJcblx0XHRpZiAoIHNxclNpbkhhbGZUaGV0YSA8PSBOdW1iZXIuRVBTSUxPTiApIHtcclxuXHJcblx0XHRcdGNvbnN0IHMgPSAxIC0gdDtcclxuXHRcdFx0dGhpcy5fdyA9IHMgKiB3ICsgdCAqIHRoaXMuX3c7XHJcblx0XHRcdHRoaXMuX3ggPSBzICogeCArIHQgKiB0aGlzLl94O1xyXG5cdFx0XHR0aGlzLl95ID0gcyAqIHkgKyB0ICogdGhpcy5feTtcclxuXHRcdFx0dGhpcy5feiA9IHMgKiB6ICsgdCAqIHRoaXMuX3o7XHJcblxyXG5cdFx0XHR0aGlzLm5vcm1hbGl6ZSgpOyAvLyBub3JtYWxpemUgY2FsbHMgX29uQ2hhbmdlQ2FsbGJhY2soKVxyXG5cclxuXHRcdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHNpbkhhbGZUaGV0YSA9IE1hdGguc3FydCggc3FyU2luSGFsZlRoZXRhICk7XHJcblx0XHRjb25zdCBoYWxmVGhldGEgPSBNYXRoLmF0YW4yKCBzaW5IYWxmVGhldGEsIGNvc0hhbGZUaGV0YSApO1xyXG5cdFx0Y29uc3QgcmF0aW9BID0gTWF0aC5zaW4oICggMSAtIHQgKSAqIGhhbGZUaGV0YSApIC8gc2luSGFsZlRoZXRhLFxyXG5cdFx0XHRyYXRpb0IgPSBNYXRoLnNpbiggdCAqIGhhbGZUaGV0YSApIC8gc2luSGFsZlRoZXRhO1xyXG5cclxuXHRcdHRoaXMuX3cgPSAoIHcgKiByYXRpb0EgKyB0aGlzLl93ICogcmF0aW9CICk7XHJcblx0XHR0aGlzLl94ID0gKCB4ICogcmF0aW9BICsgdGhpcy5feCAqIHJhdGlvQiApO1xyXG5cdFx0dGhpcy5feSA9ICggeSAqIHJhdGlvQSArIHRoaXMuX3kgKiByYXRpb0IgKTtcclxuXHRcdHRoaXMuX3ogPSAoIHogKiByYXRpb0EgKyB0aGlzLl96ICogcmF0aW9CICk7XHJcblxyXG5cdFx0dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBlcmZvcm1zIGEgc3BoZXJpY2FsIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdGhlIGdpdmVuIHF1YXRlcm5pb25zXHJcblx0ICogYW5kIHN0b3JlcyB0aGUgcmVzdWx0IGluIHRoaXMgcXVhdGVybmlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UXVhdGVybmlvbn0gcWEgLSBUaGUgc291cmNlIHF1YXRlcm5pb24uXHJcblx0ICogQHBhcmFtIHtRdWF0ZXJuaW9ufSBxYiAtIFRoZSB0YXJnZXQgcXVhdGVybmlvbi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdCAtIFRoZSBpbnRlcnBvbGF0aW9uIGZhY3RvciBpbiB0aGUgY2xvc2VkIGludGVydmFsIGBbMCwgMV1gLlxyXG5cdCAqIEByZXR1cm4ge1F1YXRlcm5pb259IEEgcmVmZXJlbmNlIHRvIHRoaXMgcXVhdGVybmlvbi5cclxuXHQgKi9cclxuXHRzbGVycFF1YXRlcm5pb25zKCBxYSwgcWIsIHQgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuY29weSggcWEgKS5zbGVycCggcWIsIHQgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoaXMgcXVhdGVybmlvbiB0byBhIHVuaWZvcm1seSByYW5kb20sIG5vcm1hbGl6ZWQgcXVhdGVybmlvbi5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1F1YXRlcm5pb259IEEgcmVmZXJlbmNlIHRvIHRoaXMgcXVhdGVybmlvbi5cclxuXHQgKi9cclxuXHRyYW5kb20oKSB7XHJcblxyXG5cdFx0Ly8gS2VuIFNob2VtYWtlXHJcblx0XHQvLyBVbmlmb3JtIHJhbmRvbSByb3RhdGlvbnNcclxuXHRcdC8vIEQuIEtpcmssIGVkaXRvciwgR3JhcGhpY3MgR2VtcyBJSUksIHBhZ2VzIDEyNC0xMzIuIEFjYWRlbWljIFByZXNzLCBOZXcgWW9yaywgMTk5Mi5cclxuXHJcblx0XHRjb25zdCB0aGV0YTEgPSAyICogTWF0aC5QSSAqIE1hdGgucmFuZG9tKCk7XHJcblx0XHRjb25zdCB0aGV0YTIgPSAyICogTWF0aC5QSSAqIE1hdGgucmFuZG9tKCk7XHJcblxyXG5cdFx0Y29uc3QgeDAgPSBNYXRoLnJhbmRvbSgpO1xyXG5cdFx0Y29uc3QgcjEgPSBNYXRoLnNxcnQoIDEgLSB4MCApO1xyXG5cdFx0Y29uc3QgcjIgPSBNYXRoLnNxcnQoIHgwICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuc2V0KFxyXG5cdFx0XHRyMSAqIE1hdGguc2luKCB0aGV0YTEgKSxcclxuXHRcdFx0cjEgKiBNYXRoLmNvcyggdGhldGExICksXHJcblx0XHRcdHIyICogTWF0aC5zaW4oIHRoZXRhMiApLFxyXG5cdFx0XHRyMiAqIE1hdGguY29zKCB0aGV0YTIgKSxcclxuXHRcdCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBxdWF0ZXJuaW9uIGlzIGVxdWFsIHdpdGggdGhlIGdpdmVuIG9uZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UXVhdGVybmlvbn0gcXVhdGVybmlvbiAtIFRoZSBxdWF0ZXJuaW9uIHRvIHRlc3QgZm9yIGVxdWFsaXR5LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyBxdWF0ZXJuaW9uIGlzIGVxdWFsIHdpdGggdGhlIGdpdmVuIG9uZS5cclxuXHQgKi9cclxuXHRlcXVhbHMoIHF1YXRlcm5pb24gKSB7XHJcblxyXG5cdFx0cmV0dXJuICggcXVhdGVybmlvbi5feCA9PT0gdGhpcy5feCApICYmICggcXVhdGVybmlvbi5feSA9PT0gdGhpcy5feSApICYmICggcXVhdGVybmlvbi5feiA9PT0gdGhpcy5feiApICYmICggcXVhdGVybmlvbi5fdyA9PT0gdGhpcy5fdyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhpcyBxdWF0ZXJuaW9uJ3MgY29tcG9uZW50cyBmcm9tIHRoZSBnaXZlbiBhcnJheS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gYXJyYXkgLSBBbiBhcnJheSBob2xkaW5nIHRoZSBxdWF0ZXJuaW9uIGNvbXBvbmVudCB2YWx1ZXMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXQ9MF0gLSBUaGUgb2Zmc2V0IGludG8gdGhlIGFycmF5LlxyXG5cdCAqIEByZXR1cm4ge1F1YXRlcm5pb259IEEgcmVmZXJlbmNlIHRvIHRoaXMgcXVhdGVybmlvbi5cclxuXHQgKi9cclxuXHRmcm9tQXJyYXkoIGFycmF5LCBvZmZzZXQgPSAwICkge1xyXG5cclxuXHRcdHRoaXMuX3ggPSBhcnJheVsgb2Zmc2V0IF07XHJcblx0XHR0aGlzLl95ID0gYXJyYXlbIG9mZnNldCArIDEgXTtcclxuXHRcdHRoaXMuX3ogPSBhcnJheVsgb2Zmc2V0ICsgMiBdO1xyXG5cdFx0dGhpcy5fdyA9IGFycmF5WyBvZmZzZXQgKyAzIF07XHJcblxyXG5cdFx0dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdyaXRlcyB0aGUgY29tcG9uZW50cyBvZiB0aGlzIHF1YXRlcm5pb24gdG8gdGhlIGdpdmVuIGFycmF5LiBJZiBubyBhcnJheSBpcyBwcm92aWRlZCxcclxuXHQgKiB0aGUgbWV0aG9kIHJldHVybnMgYSBuZXcgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IFthcnJheT1bXV0gLSBUaGUgdGFyZ2V0IGFycmF5IGhvbGRpbmcgdGhlIHF1YXRlcm5pb24gY29tcG9uZW50cy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW29mZnNldD0wXSAtIEluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBhcnJheS5cclxuXHQgKiBAcmV0dXJuIHtBcnJheTxudW1iZXI+fSBUaGUgcXVhdGVybmlvbiBjb21wb25lbnRzLlxyXG5cdCAqL1xyXG5cdHRvQXJyYXkoIGFycmF5ID0gW10sIG9mZnNldCA9IDAgKSB7XHJcblxyXG5cdFx0YXJyYXlbIG9mZnNldCBdID0gdGhpcy5feDtcclxuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLl95O1xyXG5cdFx0YXJyYXlbIG9mZnNldCArIDIgXSA9IHRoaXMuX3o7XHJcblx0XHRhcnJheVsgb2Zmc2V0ICsgMyBdID0gdGhpcy5fdztcclxuXHJcblx0XHRyZXR1cm4gYXJyYXk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgY29tcG9uZW50cyBvZiB0aGlzIHF1YXRlcm5pb24gZnJvbSB0aGUgZ2l2ZW4gYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyQXR0cmlidXRlfSBhdHRyaWJ1dGUgLSBUaGUgYnVmZmVyIGF0dHJpYnV0ZSBob2xkaW5nIHF1YXRlcm5pb24gZGF0YS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggaW50byB0aGUgYXR0cmlidXRlLlxyXG5cdCAqIEByZXR1cm4ge1F1YXRlcm5pb259IEEgcmVmZXJlbmNlIHRvIHRoaXMgcXVhdGVybmlvbi5cclxuXHQgKi9cclxuXHRmcm9tQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGluZGV4ICkge1xyXG5cclxuXHRcdHRoaXMuX3ggPSBhdHRyaWJ1dGUuZ2V0WCggaW5kZXggKTtcclxuXHRcdHRoaXMuX3kgPSBhdHRyaWJ1dGUuZ2V0WSggaW5kZXggKTtcclxuXHRcdHRoaXMuX3ogPSBhdHRyaWJ1dGUuZ2V0WiggaW5kZXggKTtcclxuXHRcdHRoaXMuX3cgPSBhdHRyaWJ1dGUuZ2V0VyggaW5kZXggKTtcclxuXHJcblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2RzIGRlZmluZXMgdGhlIHNlcmlhbGl6YXRpb24gcmVzdWx0IG9mIHRoaXMgY2xhc3MuIFJldHVybnMgdGhlXHJcblx0ICogbnVtZXJpY2FsIGVsZW1lbnRzIG9mIHRoaXMgcXVhdGVybmlvbiBpbiBhbiBhcnJheSBvZiBmb3JtYXQgYFt4LCB5LCB6LCB3XWAuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtBcnJheTxudW1iZXI+fSBUaGUgc2VyaWFsaXplZCBxdWF0ZXJuaW9uLlxyXG5cdCAqL1xyXG5cdHRvSlNPTigpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy50b0FycmF5KCk7XHJcblxyXG5cdH1cclxuXHJcblx0X29uQ2hhbmdlKCBjYWxsYmFjayApIHtcclxuXHJcblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrID0gY2FsbGJhY2s7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0X29uQ2hhbmdlQ2FsbGJhY2soKSB7fVxyXG5cclxuXHQqWyBTeW1ib2wuaXRlcmF0b3IgXSgpIHtcclxuXHJcblx0XHR5aWVsZCB0aGlzLl94O1xyXG5cdFx0eWllbGQgdGhpcy5feTtcclxuXHRcdHlpZWxkIHRoaXMuX3o7XHJcblx0XHR5aWVsZCB0aGlzLl93O1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBRdWF0ZXJuaW9uIH07XHJcbiIsImltcG9ydCB7IGNsYW1wIH0gZnJvbSAnLi9NYXRoVXRpbHMuanMnO1xyXG5pbXBvcnQgeyBRdWF0ZXJuaW9uIH0gZnJvbSAnLi9RdWF0ZXJuaW9uLmpzJztcclxuXHJcbi8qKlxyXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgYSAzRCB2ZWN0b3IuIEEgM0QgdmVjdG9yIGlzIGFuIG9yZGVyZWQgdHJpcGxldCBvZiBudW1iZXJzXHJcbiAqIChsYWJlbGVkIHgsIHkgYW5kIHopLCB3aGljaCBjYW4gYmUgdXNlZCB0byByZXByZXNlbnQgYSBudW1iZXIgb2YgdGhpbmdzLCBzdWNoIGFzOlxyXG4gKlxyXG4gKiAtIEEgcG9pbnQgaW4gM0Qgc3BhY2UuXHJcbiAqIC0gQSBkaXJlY3Rpb24gYW5kIGxlbmd0aCBpbiAzRCBzcGFjZS4gSW4gdGhyZWUuanMgdGhlIGxlbmd0aCB3aWxsXHJcbiAqIGFsd2F5cyBiZSB0aGUgRXVjbGlkZWFuIGRpc3RhbmNlKHN0cmFpZ2h0LWxpbmUgZGlzdGFuY2UpIGZyb20gYCgwLCAwLCAwKWAgdG8gYCh4LCB5LCB6KWBcclxuICogYW5kIHRoZSBkaXJlY3Rpb24gaXMgYWxzbyBtZWFzdXJlZCBmcm9tIGAoMCwgMCwgMClgIHRvd2FyZHMgYCh4LCB5LCB6KWAuXHJcbiAqIC0gQW55IGFyYml0cmFyeSBvcmRlcmVkIHRyaXBsZXQgb2YgbnVtYmVycy5cclxuICpcclxuICogVGhlcmUgYXJlIG90aGVyIHRoaW5ncyBhIDNEIHZlY3RvciBjYW4gYmUgdXNlZCB0byByZXByZXNlbnQsIHN1Y2ggYXNcclxuICogbW9tZW50dW0gdmVjdG9ycyBhbmQgc28gb24sIGhvd2V2ZXIgdGhlc2UgYXJlIHRoZSBtb3N0XHJcbiAqIGNvbW1vbiB1c2VzIGluIHRocmVlLmpzLlxyXG4gKlxyXG4gKiBJdGVyYXRpbmcgdGhyb3VnaCBhIHZlY3RvciBpbnN0YW5jZSB3aWxsIHlpZWxkIGl0cyBjb21wb25lbnRzIGAoeCwgeSwgeilgIGluXHJcbiAqIHRoZSBjb3JyZXNwb25kaW5nIG9yZGVyLlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBhID0gbmV3IFRIUkVFLlZlY3RvcjMoIDAsIDEsIDAgKTtcclxuICpcclxuICogLy9ubyBhcmd1bWVudHM7IHdpbGwgYmUgaW5pdGlhbGlzZWQgdG8gKDAsIDAsIDApXHJcbiAqIGNvbnN0IGIgPSBuZXcgVEhSRUUuVmVjdG9yMyggKTtcclxuICpcclxuICogY29uc3QgZCA9IGEuZGlzdGFuY2VUbyggYiApO1xyXG4gKiBgYGBcclxuICovXHJcbmNsYXNzIFZlY3RvcjMge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IDNEIHZlY3Rvci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbeD0wXSAtIFRoZSB4IHZhbHVlIG9mIHRoaXMgdmVjdG9yLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbeT0wXSAtIFRoZSB5IHZhbHVlIG9mIHRoaXMgdmVjdG9yLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbej0wXSAtIFRoZSB6IHZhbHVlIG9mIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCB4ID0gMCwgeSA9IDAsIHogPSAwICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0VmVjdG9yMy5wcm90b3R5cGUuaXNWZWN0b3IzID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB4IHZhbHVlIG9mIHRoaXMgdmVjdG9yLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMueCA9IHg7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgeSB2YWx1ZSBvZiB0aGlzIHZlY3Rvci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnkgPSB5O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHogdmFsdWUgb2YgdGhpcyB2ZWN0b3IuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy56ID0gejtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB2ZWN0b3IgY29tcG9uZW50cy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHZhbHVlIG9mIHRoZSB4IGNvbXBvbmVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB2YWx1ZSBvZiB0aGUgeSBjb21wb25lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHogLSBUaGUgdmFsdWUgb2YgdGhlIHogY29tcG9uZW50LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHNldCggeCwgeSwgeiApIHtcclxuXHJcblx0XHRpZiAoIHogPT09IHVuZGVmaW5lZCApIHogPSB0aGlzLno7IC8vIHNwcml0ZS5zY2FsZS5zZXQoeCx5KVxyXG5cclxuXHRcdHRoaXMueCA9IHg7XHJcblx0XHR0aGlzLnkgPSB5O1xyXG5cdFx0dGhpcy56ID0gejtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB2ZWN0b3IgY29tcG9uZW50cyB0byB0aGUgc2FtZSB2YWx1ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzY2FsYXIgLSBUaGUgdmFsdWUgdG8gc2V0IGZvciBhbGwgdmVjdG9yIGNvbXBvbmVudHMuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0c2V0U2NhbGFyKCBzY2FsYXIgKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gc2NhbGFyO1xyXG5cdFx0dGhpcy55ID0gc2NhbGFyO1xyXG5cdFx0dGhpcy56ID0gc2NhbGFyO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHZlY3RvcidzIHggY29tcG9uZW50IHRvIHRoZSBnaXZlbiB2YWx1ZVxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgdmFsdWUgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHNldFgoIHggKSB7XHJcblxyXG5cdFx0dGhpcy54ID0geDtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB2ZWN0b3IncyB5IGNvbXBvbmVudCB0byB0aGUgZ2l2ZW4gdmFsdWVcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHZhbHVlIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRzZXRZKCB5ICkge1xyXG5cclxuXHRcdHRoaXMueSA9IHk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdmVjdG9yJ3MgeiBjb21wb25lbnQgdG8gdGhlIGdpdmVuIHZhbHVlXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0geiAtIFRoZSB2YWx1ZSB0byBzZXQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0c2V0WiggeiApIHtcclxuXHJcblx0XHR0aGlzLnogPSB6O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFsbG93cyB0byBzZXQgYSB2ZWN0b3IgY29tcG9uZW50IHdpdGggYW4gaW5kZXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgY29tcG9uZW50IGluZGV4LiBgMGAgZXF1YWxzIHRvIHgsIGAxYCBlcXVhbHMgdG8geSwgYDJgIGVxdWFscyB0byB6LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBzZXQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0c2V0Q29tcG9uZW50KCBpbmRleCwgdmFsdWUgKSB7XHJcblxyXG5cdFx0c3dpdGNoICggaW5kZXggKSB7XHJcblxyXG5cdFx0XHRjYXNlIDA6IHRoaXMueCA9IHZhbHVlOyBicmVhaztcclxuXHRcdFx0Y2FzZSAxOiB0aGlzLnkgPSB2YWx1ZTsgYnJlYWs7XHJcblx0XHRcdGNhc2UgMjogdGhpcy56ID0gdmFsdWU7IGJyZWFrO1xyXG5cdFx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoICdpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICcgKyBpbmRleCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgdmVjdG9yIGNvbXBvbmVudCB3aGljaCBtYXRjaGVzIHRoZSBnaXZlbiBpbmRleC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBjb21wb25lbnQgaW5kZXguIGAwYCBlcXVhbHMgdG8geCwgYDFgIGVxdWFscyB0byB5LCBgMmAgZXF1YWxzIHRvIHouXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBBIHZlY3RvciBjb21wb25lbnQgdmFsdWUuXHJcblx0ICovXHJcblx0Z2V0Q29tcG9uZW50KCBpbmRleCApIHtcclxuXHJcblx0XHRzd2l0Y2ggKCBpbmRleCApIHtcclxuXHJcblx0XHRcdGNhc2UgMDogcmV0dXJuIHRoaXMueDtcclxuXHRcdFx0Y2FzZSAxOiByZXR1cm4gdGhpcy55O1xyXG5cdFx0XHRjYXNlIDI6IHJldHVybiB0aGlzLno7XHJcblx0XHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvciggJ2luZGV4IGlzIG91dCBvZiByYW5nZTogJyArIGluZGV4ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBuZXcgdmVjdG9yIHdpdGggY29waWVkIHZhbHVlcyBmcm9tIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIGNsb25lIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y2xvbmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLngsIHRoaXMueSwgdGhpcy56ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29waWVzIHRoZSB2YWx1ZXMgb2YgdGhlIGdpdmVuIHZlY3RvciB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB2IC0gVGhlIHZlY3RvciB0byBjb3B5LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGNvcHkoIHYgKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gdi54O1xyXG5cdFx0dGhpcy55ID0gdi55O1xyXG5cdFx0dGhpcy56ID0gdi56O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgdGhlIGdpdmVuIHZlY3RvciB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB2IC0gVGhlIHZlY3RvciB0byBhZGQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0YWRkKCB2ICkge1xyXG5cclxuXHRcdHRoaXMueCArPSB2Lng7XHJcblx0XHR0aGlzLnkgKz0gdi55O1xyXG5cdFx0dGhpcy56ICs9IHYuejtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIHRoZSBnaXZlbiBzY2FsYXIgdmFsdWUgdG8gYWxsIGNvbXBvbmVudHMgb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzIC0gVGhlIHNjYWxhciB0byBhZGQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0YWRkU2NhbGFyKCBzICkge1xyXG5cclxuXHRcdHRoaXMueCArPSBzO1xyXG5cdFx0dGhpcy55ICs9IHM7XHJcblx0XHR0aGlzLnogKz0gcztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIHRoZSBnaXZlbiB2ZWN0b3JzIGFuZCBzdG9yZXMgdGhlIHJlc3VsdCBpbiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBhIC0gVGhlIGZpcnN0IHZlY3Rvci5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IGIgLSBUaGUgc2Vjb25kIHZlY3Rvci5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRhZGRWZWN0b3JzKCBhLCBiICkge1xyXG5cclxuXHRcdHRoaXMueCA9IGEueCArIGIueDtcclxuXHRcdHRoaXMueSA9IGEueSArIGIueTtcclxuXHRcdHRoaXMueiA9IGEueiArIGIuejtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIHRoZSBnaXZlbiB2ZWN0b3Igc2NhbGVkIGJ5IHRoZSBnaXZlbiBmYWN0b3IgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM3xWZWN0b3I0fSB2IC0gVGhlIHZlY3Rvci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gcyAtIFRoZSBmYWN0b3IgdGhhdCBzY2FsZXMgYHZgLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGFkZFNjYWxlZFZlY3RvciggdiwgcyApIHtcclxuXHJcblx0XHR0aGlzLnggKz0gdi54ICogcztcclxuXHRcdHRoaXMueSArPSB2LnkgKiBzO1xyXG5cdFx0dGhpcy56ICs9IHYueiAqIHM7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3VidHJhY3RzIHRoZSBnaXZlbiB2ZWN0b3IgZnJvbSB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB2IC0gVGhlIHZlY3RvciB0byBzdWJ0cmFjdC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRzdWIoIHYgKSB7XHJcblxyXG5cdFx0dGhpcy54IC09IHYueDtcclxuXHRcdHRoaXMueSAtPSB2Lnk7XHJcblx0XHR0aGlzLnogLT0gdi56O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFN1YnRyYWN0cyB0aGUgZ2l2ZW4gc2NhbGFyIHZhbHVlIGZyb20gYWxsIGNvbXBvbmVudHMgb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzIC0gVGhlIHNjYWxhciB0byBzdWJ0cmFjdC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRzdWJTY2FsYXIoIHMgKSB7XHJcblxyXG5cdFx0dGhpcy54IC09IHM7XHJcblx0XHR0aGlzLnkgLT0gcztcclxuXHRcdHRoaXMueiAtPSBzO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFN1YnRyYWN0cyB0aGUgZ2l2ZW4gdmVjdG9ycyBhbmQgc3RvcmVzIHRoZSByZXN1bHQgaW4gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gYSAtIFRoZSBmaXJzdCB2ZWN0b3IuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBiIC0gVGhlIHNlY29uZCB2ZWN0b3IuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0c3ViVmVjdG9ycyggYSwgYiApIHtcclxuXHJcblx0XHR0aGlzLnggPSBhLnggLSBiLng7XHJcblx0XHR0aGlzLnkgPSBhLnkgLSBiLnk7XHJcblx0XHR0aGlzLnogPSBhLnogLSBiLno7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTXVsdGlwbGllcyB0aGUgZ2l2ZW4gdmVjdG9yIHdpdGggdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdiAtIFRoZSB2ZWN0b3IgdG8gbXVsdGlwbHkuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0bXVsdGlwbHkoIHYgKSB7XHJcblxyXG5cdFx0dGhpcy54ICo9IHYueDtcclxuXHRcdHRoaXMueSAqPSB2Lnk7XHJcblx0XHR0aGlzLnogKj0gdi56O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE11bHRpcGxpZXMgdGhlIGdpdmVuIHNjYWxhciB2YWx1ZSB3aXRoIGFsbCBjb21wb25lbnRzIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc2NhbGFyIC0gVGhlIHNjYWxhciB0byBtdWx0aXBseS5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRtdWx0aXBseVNjYWxhciggc2NhbGFyICkge1xyXG5cclxuXHRcdHRoaXMueCAqPSBzY2FsYXI7XHJcblx0XHR0aGlzLnkgKj0gc2NhbGFyO1xyXG5cdFx0dGhpcy56ICo9IHNjYWxhcjtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBNdWx0aXBsaWVzIHRoZSBnaXZlbiB2ZWN0b3JzIGFuZCBzdG9yZXMgdGhlIHJlc3VsdCBpbiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBhIC0gVGhlIGZpcnN0IHZlY3Rvci5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IGIgLSBUaGUgc2Vjb25kIHZlY3Rvci5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRtdWx0aXBseVZlY3RvcnMoIGEsIGIgKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gYS54ICogYi54O1xyXG5cdFx0dGhpcy55ID0gYS55ICogYi55O1xyXG5cdFx0dGhpcy56ID0gYS56ICogYi56O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFwcGxpZXMgdGhlIGdpdmVuIEV1bGVyIHJvdGF0aW9uIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtFdWxlcn0gZXVsZXIgLSBUaGUgRXVsZXIgYW5nbGVzLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGFwcGx5RXVsZXIoIGV1bGVyICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmFwcGx5UXVhdGVybmlvbiggX3F1YXRlcm5pb24uc2V0RnJvbUV1bGVyKCBldWxlciApICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQXBwbGllcyBhIHJvdGF0aW9uIHNwZWNpZmllZCBieSBhbiBheGlzIGFuZCBhbiBhbmdsZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gYXhpcyAtIEEgbm9ybWFsaXplZCB2ZWN0b3IgcmVwcmVzZW50aW5nIHRoZSByb3RhdGlvbiBheGlzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhbmdsZSAtIFRoZSBhbmdsZSBpbiByYWRpYW5zLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGFwcGx5QXhpc0FuZ2xlKCBheGlzLCBhbmdsZSApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5hcHBseVF1YXRlcm5pb24oIF9xdWF0ZXJuaW9uLnNldEZyb21BeGlzQW5nbGUoIGF4aXMsIGFuZ2xlICkgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBNdWx0aXBsaWVzIHRoaXMgdmVjdG9yIHdpdGggdGhlIGdpdmVuIDN4MyBtYXRyaXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDN9IG0gLSBUaGUgM3gzIG1hdHJpeC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRhcHBseU1hdHJpeDMoIG0gKSB7XHJcblxyXG5cdFx0Y29uc3QgeCA9IHRoaXMueCwgeSA9IHRoaXMueSwgeiA9IHRoaXMuejtcclxuXHRcdGNvbnN0IGUgPSBtLmVsZW1lbnRzO1xyXG5cclxuXHRcdHRoaXMueCA9IGVbIDAgXSAqIHggKyBlWyAzIF0gKiB5ICsgZVsgNiBdICogejtcclxuXHRcdHRoaXMueSA9IGVbIDEgXSAqIHggKyBlWyA0IF0gKiB5ICsgZVsgNyBdICogejtcclxuXHRcdHRoaXMueiA9IGVbIDIgXSAqIHggKyBlWyA1IF0gKiB5ICsgZVsgOCBdICogejtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBNdWx0aXBsaWVzIHRoaXMgdmVjdG9yIGJ5IHRoZSBnaXZlbiBub3JtYWwgbWF0cml4IGFuZCBub3JtYWxpemVzXHJcblx0ICogdGhlIHJlc3VsdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4M30gbSAtIFRoZSBub3JtYWwgbWF0cml4LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGFwcGx5Tm9ybWFsTWF0cml4KCBtICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmFwcGx5TWF0cml4MyggbSApLm5vcm1hbGl6ZSgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE11bHRpcGxpZXMgdGhpcyB2ZWN0b3IgKHdpdGggYW4gaW1wbGljaXQgMSBpbiB0aGUgNHRoIGRpbWVuc2lvbikgYnkgbSwgYW5kXHJcblx0ICogZGl2aWRlcyBieSBwZXJzcGVjdGl2ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4NH0gbSAtIFRoZSBtYXRyaXggdG8gYXBwbHkuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0YXBwbHlNYXRyaXg0KCBtICkge1xyXG5cclxuXHRcdGNvbnN0IHggPSB0aGlzLngsIHkgPSB0aGlzLnksIHogPSB0aGlzLno7XHJcblx0XHRjb25zdCBlID0gbS5lbGVtZW50cztcclxuXHJcblx0XHRjb25zdCB3ID0gMSAvICggZVsgMyBdICogeCArIGVbIDcgXSAqIHkgKyBlWyAxMSBdICogeiArIGVbIDE1IF0gKTtcclxuXHJcblx0XHR0aGlzLnggPSAoIGVbIDAgXSAqIHggKyBlWyA0IF0gKiB5ICsgZVsgOCBdICogeiArIGVbIDEyIF0gKSAqIHc7XHJcblx0XHR0aGlzLnkgPSAoIGVbIDEgXSAqIHggKyBlWyA1IF0gKiB5ICsgZVsgOSBdICogeiArIGVbIDEzIF0gKSAqIHc7XHJcblx0XHR0aGlzLnogPSAoIGVbIDIgXSAqIHggKyBlWyA2IF0gKiB5ICsgZVsgMTAgXSAqIHogKyBlWyAxNCBdICkgKiB3O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFwcGxpZXMgdGhlIGdpdmVuIFF1YXRlcm5pb24gdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1F1YXRlcm5pb259IHEgLSBUaGUgUXVhdGVybmlvbi5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRhcHBseVF1YXRlcm5pb24oIHEgKSB7XHJcblxyXG5cdFx0Ly8gcXVhdGVybmlvbiBxIGlzIGFzc3VtZWQgdG8gaGF2ZSB1bml0IGxlbmd0aFxyXG5cclxuXHRcdGNvbnN0IHZ4ID0gdGhpcy54LCB2eSA9IHRoaXMueSwgdnogPSB0aGlzLno7XHJcblx0XHRjb25zdCBxeCA9IHEueCwgcXkgPSBxLnksIHF6ID0gcS56LCBxdyA9IHEudztcclxuXHJcblx0XHQvLyB0ID0gMiAqIGNyb3NzKCBxLnh5eiwgdiApO1xyXG5cdFx0Y29uc3QgdHggPSAyICogKCBxeSAqIHZ6IC0gcXogKiB2eSApO1xyXG5cdFx0Y29uc3QgdHkgPSAyICogKCBxeiAqIHZ4IC0gcXggKiB2eiApO1xyXG5cdFx0Y29uc3QgdHogPSAyICogKCBxeCAqIHZ5IC0gcXkgKiB2eCApO1xyXG5cclxuXHRcdC8vIHYgKyBxLncgKiB0ICsgY3Jvc3MoIHEueHl6LCB0ICk7XHJcblx0XHR0aGlzLnggPSB2eCArIHF3ICogdHggKyBxeSAqIHR6IC0gcXogKiB0eTtcclxuXHRcdHRoaXMueSA9IHZ5ICsgcXcgKiB0eSArIHF6ICogdHggLSBxeCAqIHR6O1xyXG5cdFx0dGhpcy56ID0gdnogKyBxdyAqIHR6ICsgcXggKiB0eSAtIHF5ICogdHg7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUHJvamVjdHMgdGhpcyB2ZWN0b3IgZnJvbSB3b3JsZCBzcGFjZSBpbnRvIHRoZSBjYW1lcmEncyBub3JtYWxpemVkXHJcblx0ICogZGV2aWNlIGNvb3JkaW5hdGUgKE5EQykgc3BhY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0NhbWVyYX0gY2FtZXJhIC0gVGhlIGNhbWVyYS5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRwcm9qZWN0KCBjYW1lcmEgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlICkuYXBwbHlNYXRyaXg0KCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVucHJvamVjdHMgdGhpcyB2ZWN0b3IgZnJvbSB0aGUgY2FtZXJhJ3Mgbm9ybWFsaXplZCBkZXZpY2UgY29vcmRpbmF0ZSAoTkRDKVxyXG5cdCAqIHNwYWNlIGludG8gd29ybGQgc3BhY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0NhbWVyYX0gY2FtZXJhIC0gVGhlIGNhbWVyYS5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHR1bnByb2plY3QoIGNhbWVyYSApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQoIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSApLmFwcGx5TWF0cml4NCggY2FtZXJhLm1hdHJpeFdvcmxkICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVHJhbnNmb3JtcyB0aGUgZGlyZWN0aW9uIG9mIHRoaXMgdmVjdG9yIGJ5IGEgbWF0cml4ICh0aGUgdXBwZXIgbGVmdCAzIHggM1xyXG5cdCAqIHN1YnNldCBvZiB0aGUgZ2l2ZW4gNHg0IG1hdHJpeCBhbmQgdGhlbiBub3JtYWxpemVzIHRoZSByZXN1bHQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDR9IG0gLSBUaGUgbWF0cml4LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHRyYW5zZm9ybURpcmVjdGlvbiggbSApIHtcclxuXHJcblx0XHQvLyBpbnB1dDogVEhSRUUuTWF0cml4NCBhZmZpbmUgbWF0cml4XHJcblx0XHQvLyB2ZWN0b3IgaW50ZXJwcmV0ZWQgYXMgYSBkaXJlY3Rpb25cclxuXHJcblx0XHRjb25zdCB4ID0gdGhpcy54LCB5ID0gdGhpcy55LCB6ID0gdGhpcy56O1xyXG5cdFx0Y29uc3QgZSA9IG0uZWxlbWVudHM7XHJcblxyXG5cdFx0dGhpcy54ID0gZVsgMCBdICogeCArIGVbIDQgXSAqIHkgKyBlWyA4IF0gKiB6O1xyXG5cdFx0dGhpcy55ID0gZVsgMSBdICogeCArIGVbIDUgXSAqIHkgKyBlWyA5IF0gKiB6O1xyXG5cdFx0dGhpcy56ID0gZVsgMiBdICogeCArIGVbIDYgXSAqIHkgKyBlWyAxMCBdICogejtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5ub3JtYWxpemUoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEaXZpZGVzIHRoaXMgaW5zdGFuY2UgYnkgdGhlIGdpdmVuIHZlY3Rvci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdiAtIFRoZSB2ZWN0b3IgdG8gZGl2aWRlLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGRpdmlkZSggdiApIHtcclxuXHJcblx0XHR0aGlzLnggLz0gdi54O1xyXG5cdFx0dGhpcy55IC89IHYueTtcclxuXHRcdHRoaXMueiAvPSB2Lno7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGl2aWRlcyB0aGlzIHZlY3RvciBieSB0aGUgZ2l2ZW4gc2NhbGFyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHNjYWxhciAtIFRoZSBzY2FsYXIgdG8gZGl2aWRlLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGRpdmlkZVNjYWxhciggc2NhbGFyICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKCAxIC8gc2NhbGFyICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSWYgdGhpcyB2ZWN0b3IncyB4LCB5IG9yIHogdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSBnaXZlbiB2ZWN0b3IncyB4LCB5IG9yIHpcclxuXHQgKiB2YWx1ZSwgcmVwbGFjZSB0aGF0IHZhbHVlIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgbWluIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB2IC0gVGhlIHZlY3Rvci5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRtaW4oIHYgKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gTWF0aC5taW4oIHRoaXMueCwgdi54ICk7XHJcblx0XHR0aGlzLnkgPSBNYXRoLm1pbiggdGhpcy55LCB2LnkgKTtcclxuXHRcdHRoaXMueiA9IE1hdGgubWluKCB0aGlzLnosIHYueiApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIElmIHRoaXMgdmVjdG9yJ3MgeCwgeSBvciB6IHZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgZ2l2ZW4gdmVjdG9yJ3MgeCwgeSBvciB6XHJcblx0ICogdmFsdWUsIHJlcGxhY2UgdGhhdCB2YWx1ZSB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIG1heCB2YWx1ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdiAtIFRoZSB2ZWN0b3IuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0bWF4KCB2ICkge1xyXG5cclxuXHRcdHRoaXMueCA9IE1hdGgubWF4KCB0aGlzLngsIHYueCApO1xyXG5cdFx0dGhpcy55ID0gTWF0aC5tYXgoIHRoaXMueSwgdi55ICk7XHJcblx0XHR0aGlzLnogPSBNYXRoLm1heCggdGhpcy56LCB2LnogKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJZiB0aGlzIHZlY3RvcidzIHgsIHkgb3IgeiB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIG1heCB2ZWN0b3IncyB4LCB5IG9yIHpcclxuXHQgKiB2YWx1ZSwgaXQgaXMgcmVwbGFjZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUuXHJcblx0ICogSWYgdGhpcyB2ZWN0b3IncyB4LCB5IG9yIHogdmFsdWUgaXMgbGVzcyB0aGFuIHRoZSBtaW4gdmVjdG9yJ3MgeCwgeSBvciB6IHZhbHVlLFxyXG5cdCAqIGl0IGlzIHJlcGxhY2VkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBtaW4gLSBUaGUgbWluaW11bSB4LCB5IGFuZCB6IHZhbHVlcy5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IG1heCAtIFRoZSBtYXhpbXVtIHgsIHkgYW5kIHogdmFsdWVzIGluIHRoZSBkZXNpcmVkIHJhbmdlLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGNsYW1wKCBtaW4sIG1heCApIHtcclxuXHJcblx0XHQvLyBhc3N1bWVzIG1pbiA8IG1heCwgY29tcG9uZW50d2lzZVxyXG5cclxuXHRcdHRoaXMueCA9IGNsYW1wKCB0aGlzLngsIG1pbi54LCBtYXgueCApO1xyXG5cdFx0dGhpcy55ID0gY2xhbXAoIHRoaXMueSwgbWluLnksIG1heC55ICk7XHJcblx0XHR0aGlzLnogPSBjbGFtcCggdGhpcy56LCBtaW4ueiwgbWF4LnogKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJZiB0aGlzIHZlY3RvcidzIHgsIHkgb3IgeiB2YWx1ZXMgYXJlIGdyZWF0ZXIgdGhhbiB0aGUgbWF4IHZhbHVlLCB0aGV5IGFyZVxyXG5cdCAqIHJlcGxhY2VkIGJ5IHRoZSBtYXggdmFsdWUuXHJcblx0ICogSWYgdGhpcyB2ZWN0b3IncyB4LCB5IG9yIHogdmFsdWVzIGFyZSBsZXNzIHRoYW4gdGhlIG1pbiB2YWx1ZSwgdGhleSBhcmVcclxuXHQgKiByZXBsYWNlZCBieSB0aGUgbWluIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IG1pblZhbCAtIFRoZSBtaW5pbXVtIHZhbHVlIHRoZSBjb21wb25lbnRzIHdpbGwgYmUgY2xhbXBlZCB0by5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbWF4VmFsIC0gVGhlIG1heGltdW0gdmFsdWUgdGhlIGNvbXBvbmVudHMgd2lsbCBiZSBjbGFtcGVkIHRvLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGNsYW1wU2NhbGFyKCBtaW5WYWwsIG1heFZhbCApIHtcclxuXHJcblx0XHR0aGlzLnggPSBjbGFtcCggdGhpcy54LCBtaW5WYWwsIG1heFZhbCApO1xyXG5cdFx0dGhpcy55ID0gY2xhbXAoIHRoaXMueSwgbWluVmFsLCBtYXhWYWwgKTtcclxuXHRcdHRoaXMueiA9IGNsYW1wKCB0aGlzLnosIG1pblZhbCwgbWF4VmFsICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSWYgdGhpcyB2ZWN0b3IncyBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIHRoZSBtYXggdmFsdWUsIGl0IGlzIHJlcGxhY2VkIGJ5XHJcblx0ICogdGhlIG1heCB2YWx1ZS5cclxuXHQgKiBJZiB0aGlzIHZlY3RvcidzIGxlbmd0aCBpcyBsZXNzIHRoYW4gdGhlIG1pbiB2YWx1ZSwgaXQgaXMgcmVwbGFjZWQgYnkgdGhlXHJcblx0ICogbWluIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IG1pbiAtIFRoZSBtaW5pbXVtIHZhbHVlIHRoZSB2ZWN0b3IgbGVuZ3RoIHdpbGwgYmUgY2xhbXBlZCB0by5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbWF4IC0gVGhlIG1heGltdW0gdmFsdWUgdGhlIHZlY3RvciBsZW5ndGggd2lsbCBiZSBjbGFtcGVkIHRvLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGNsYW1wTGVuZ3RoKCBtaW4sIG1heCApIHtcclxuXHJcblx0XHRjb25zdCBsZW5ndGggPSB0aGlzLmxlbmd0aCgpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmRpdmlkZVNjYWxhciggbGVuZ3RoIHx8IDEgKS5tdWx0aXBseVNjYWxhciggY2xhbXAoIGxlbmd0aCwgbWluLCBtYXggKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBjb21wb25lbnRzIG9mIHRoaXMgdmVjdG9yIGFyZSByb3VuZGVkIGRvd24gdG8gdGhlIG5lYXJlc3QgaW50ZWdlciB2YWx1ZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGZsb29yKCkge1xyXG5cclxuXHRcdHRoaXMueCA9IE1hdGguZmxvb3IoIHRoaXMueCApO1xyXG5cdFx0dGhpcy55ID0gTWF0aC5mbG9vciggdGhpcy55ICk7XHJcblx0XHR0aGlzLnogPSBNYXRoLmZsb29yKCB0aGlzLnogKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgY29tcG9uZW50cyBvZiB0aGlzIHZlY3RvciBhcmUgcm91bmRlZCB1cCB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0Y2VpbCgpIHtcclxuXHJcblx0XHR0aGlzLnggPSBNYXRoLmNlaWwoIHRoaXMueCApO1xyXG5cdFx0dGhpcy55ID0gTWF0aC5jZWlsKCB0aGlzLnkgKTtcclxuXHRcdHRoaXMueiA9IE1hdGguY2VpbCggdGhpcy56ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGNvbXBvbmVudHMgb2YgdGhpcyB2ZWN0b3IgYXJlIHJvdW5kZWQgdG8gdGhlIG5lYXJlc3QgaW50ZWdlciB2YWx1ZVxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0cm91bmQoKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gTWF0aC5yb3VuZCggdGhpcy54ICk7XHJcblx0XHR0aGlzLnkgPSBNYXRoLnJvdW5kKCB0aGlzLnkgKTtcclxuXHRcdHRoaXMueiA9IE1hdGgucm91bmQoIHRoaXMueiApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBjb21wb25lbnRzIG9mIHRoaXMgdmVjdG9yIGFyZSByb3VuZGVkIHRvd2FyZHMgemVybyAodXAgaWYgbmVnYXRpdmUsXHJcblx0ICogZG93biBpZiBwb3NpdGl2ZSkgdG8gYW4gaW50ZWdlciB2YWx1ZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHJvdW5kVG9aZXJvKCkge1xyXG5cclxuXHRcdHRoaXMueCA9IE1hdGgudHJ1bmMoIHRoaXMueCApO1xyXG5cdFx0dGhpcy55ID0gTWF0aC50cnVuYyggdGhpcy55ICk7XHJcblx0XHR0aGlzLnogPSBNYXRoLnRydW5jKCB0aGlzLnogKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJbnZlcnRzIHRoaXMgdmVjdG9yIC0gaS5lLiBzZXRzIHggPSAteCwgeSA9IC15IGFuZCB6ID0gLXouXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRuZWdhdGUoKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gLSB0aGlzLng7XHJcblx0XHR0aGlzLnkgPSAtIHRoaXMueTtcclxuXHRcdHRoaXMueiA9IC0gdGhpcy56O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENhbGN1bGF0ZXMgdGhlIGRvdCBwcm9kdWN0IG9mIHRoZSBnaXZlbiB2ZWN0b3Igd2l0aCB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB2IC0gVGhlIHZlY3RvciB0byBjb21wdXRlIHRoZSBkb3QgcHJvZHVjdCB3aXRoLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIHJlc3VsdCBvZiB0aGUgZG90IHByb2R1Y3QuXHJcblx0ICovXHJcblx0ZG90KCB2ICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnggKiB2LnggKyB0aGlzLnkgKiB2LnkgKyB0aGlzLnogKiB2Lno7XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gVE9ETyBsZW5ndGhTcXVhcmVkP1xyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB0aGUgc3F1YXJlIG9mIHRoZSBFdWNsaWRlYW4gbGVuZ3RoIChzdHJhaWdodC1saW5lIGxlbmd0aCkgZnJvbVxyXG5cdCAqICgwLCAwLCAwKSB0byAoeCwgeSwgeikuIElmIHlvdSBhcmUgY29tcGFyaW5nIHRoZSBsZW5ndGhzIG9mIHZlY3RvcnMsIHlvdSBzaG91bGRcclxuXHQgKiBjb21wYXJlIHRoZSBsZW5ndGggc3F1YXJlZCBpbnN0ZWFkIGFzIGl0IGlzIHNsaWdodGx5IG1vcmUgZWZmaWNpZW50IHRvIGNhbGN1bGF0ZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIHNxdWFyZSBsZW5ndGggb2YgdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0bGVuZ3RoU3EoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueSArIHRoaXMueiAqIHRoaXMuejtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB0aGUgIEV1Y2xpZGVhbiBsZW5ndGggKHN0cmFpZ2h0LWxpbmUgbGVuZ3RoKSBmcm9tICgwLCAwLCAwKSB0byAoeCwgeSwgeikuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBsZW5ndGggb2YgdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0bGVuZ3RoKCkge1xyXG5cclxuXHRcdHJldHVybiBNYXRoLnNxcnQoIHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueSArIHRoaXMueiAqIHRoaXMueiApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSBNYW5oYXR0YW4gbGVuZ3RoIG9mIHRoaXMgdmVjdG9yLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgbGVuZ3RoIG9mIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdG1hbmhhdHRhbkxlbmd0aCgpIHtcclxuXHJcblx0XHRyZXR1cm4gTWF0aC5hYnMoIHRoaXMueCApICsgTWF0aC5hYnMoIHRoaXMueSApICsgTWF0aC5hYnMoIHRoaXMueiApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnZlcnRzIHRoaXMgdmVjdG9yIHRvIGEgdW5pdCB2ZWN0b3IgLSB0aGF0IGlzLCBzZXRzIGl0IGVxdWFsIHRvIGEgdmVjdG9yXHJcblx0ICogd2l0aCB0aGUgc2FtZSBkaXJlY3Rpb24gYXMgdGhpcyBvbmUsIGJ1dCB3aXRoIGEgdmVjdG9yIGxlbmd0aCBvZiBgMWAuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRub3JtYWxpemUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKCB0aGlzLmxlbmd0aCgpIHx8IDEgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoaXMgdmVjdG9yIHRvIGEgdmVjdG9yIHdpdGggdGhlIHNhbWUgZGlyZWN0aW9uIGFzIHRoaXMgb25lLCBidXRcclxuXHQgKiB3aXRoIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCAtIFRoZSBuZXcgbGVuZ3RoIG9mIHRoaXMgdmVjdG9yLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHNldExlbmd0aCggbGVuZ3RoICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKCBsZW5ndGggKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBMaW5lYXJseSBpbnRlcnBvbGF0ZXMgYmV0d2VlbiB0aGUgZ2l2ZW4gdmVjdG9yIGFuZCB0aGlzIGluc3RhbmNlLCB3aGVyZVxyXG5cdCAqIGFscGhhIGlzIHRoZSBwZXJjZW50IGRpc3RhbmNlIGFsb25nIHRoZSBsaW5lIC0gYWxwaGEgPSAwIHdpbGwgYmUgdGhpc1xyXG5cdCAqIHZlY3RvciwgYW5kIGFscGhhID0gMSB3aWxsIGJlIHRoZSBnaXZlbiBvbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHYgLSBUaGUgdmVjdG9yIHRvIGludGVycG9sYXRlIHRvd2FyZHMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFscGhhIC0gVGhlIGludGVycG9sYXRpb24gZmFjdG9yLCB0eXBpY2FsbHkgaW4gdGhlIGNsb3NlZCBpbnRlcnZhbCBgWzAsIDFdYC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRsZXJwKCB2LCBhbHBoYSApIHtcclxuXHJcblx0XHR0aGlzLnggKz0gKCB2LnggLSB0aGlzLnggKSAqIGFscGhhO1xyXG5cdFx0dGhpcy55ICs9ICggdi55IC0gdGhpcy55ICkgKiBhbHBoYTtcclxuXHRcdHRoaXMueiArPSAoIHYueiAtIHRoaXMueiApICogYWxwaGE7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTGluZWFybHkgaW50ZXJwb2xhdGVzIGJldHdlZW4gdGhlIGdpdmVuIHZlY3RvcnMsIHdoZXJlIGFscGhhIGlzIHRoZSBwZXJjZW50XHJcblx0ICogZGlzdGFuY2UgYWxvbmcgdGhlIGxpbmUgLSBhbHBoYSA9IDAgd2lsbCBiZSBmaXJzdCB2ZWN0b3IsIGFuZCBhbHBoYSA9IDEgd2lsbFxyXG5cdCAqIGJlIHRoZSBzZWNvbmQgb25lLiBUaGUgcmVzdWx0IGlzIHN0b3JlZCBpbiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB2MSAtIFRoZSBmaXJzdCB2ZWN0b3IuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB2MiAtIFRoZSBzZWNvbmQgdmVjdG9yLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhbHBoYSAtIFRoZSBpbnRlcnBvbGF0aW9uIGZhY3RvciwgdHlwaWNhbGx5IGluIHRoZSBjbG9zZWQgaW50ZXJ2YWwgYFswLCAxXWAuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0bGVycFZlY3RvcnMoIHYxLCB2MiwgYWxwaGEgKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gdjEueCArICggdjIueCAtIHYxLnggKSAqIGFscGhhO1xyXG5cdFx0dGhpcy55ID0gdjEueSArICggdjIueSAtIHYxLnkgKSAqIGFscGhhO1xyXG5cdFx0dGhpcy56ID0gdjEueiArICggdjIueiAtIHYxLnogKSAqIGFscGhhO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENhbGN1bGF0ZXMgdGhlIGNyb3NzIHByb2R1Y3Qgb2YgdGhlIGdpdmVuIHZlY3RvciB3aXRoIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHYgLSBUaGUgdmVjdG9yIHRvIGNvbXB1dGUgdGhlIGNyb3NzIHByb2R1Y3Qgd2l0aC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBUaGUgcmVzdWx0IG9mIHRoZSBjcm9zcyBwcm9kdWN0LlxyXG5cdCAqL1xyXG5cdGNyb3NzKCB2ICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmNyb3NzVmVjdG9ycyggdGhpcywgdiApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENhbGN1bGF0ZXMgdGhlIGNyb3NzIHByb2R1Y3Qgb2YgdGhlIGdpdmVuIHZlY3RvcnMgYW5kIHN0b3JlcyB0aGUgcmVzdWx0XHJcblx0ICogaW4gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gYSAtIFRoZSBmaXJzdCB2ZWN0b3IuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBiIC0gVGhlIHNlY29uZCB2ZWN0b3IuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0Y3Jvc3NWZWN0b3JzKCBhLCBiICkge1xyXG5cclxuXHRcdGNvbnN0IGF4ID0gYS54LCBheSA9IGEueSwgYXogPSBhLno7XHJcblx0XHRjb25zdCBieCA9IGIueCwgYnkgPSBiLnksIGJ6ID0gYi56O1xyXG5cclxuXHRcdHRoaXMueCA9IGF5ICogYnogLSBheiAqIGJ5O1xyXG5cdFx0dGhpcy55ID0gYXogKiBieCAtIGF4ICogYno7XHJcblx0XHR0aGlzLnogPSBheCAqIGJ5IC0gYXkgKiBieDtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQcm9qZWN0cyB0aGlzIHZlY3RvciBvbnRvIHRoZSBnaXZlbiBvbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHYgLSBUaGUgdmVjdG9yIHRvIHByb2plY3QgdG8uXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0cHJvamVjdE9uVmVjdG9yKCB2ICkge1xyXG5cclxuXHRcdGNvbnN0IGRlbm9taW5hdG9yID0gdi5sZW5ndGhTcSgpO1xyXG5cclxuXHRcdGlmICggZGVub21pbmF0b3IgPT09IDAgKSByZXR1cm4gdGhpcy5zZXQoIDAsIDAsIDAgKTtcclxuXHJcblx0XHRjb25zdCBzY2FsYXIgPSB2LmRvdCggdGhpcyApIC8gZGVub21pbmF0b3I7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuY29weSggdiApLm11bHRpcGx5U2NhbGFyKCBzY2FsYXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQcm9qZWN0cyB0aGlzIHZlY3RvciBvbnRvIGEgcGxhbmUgYnkgc3VidHJhY3RpbmcgdGhpc1xyXG5cdCAqIHZlY3RvciBwcm9qZWN0ZWQgb250byB0aGUgcGxhbmUncyBub3JtYWwgZnJvbSB0aGlzIHZlY3Rvci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gcGxhbmVOb3JtYWwgLSBUaGUgcGxhbmUgbm9ybWFsLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHByb2plY3RPblBsYW5lKCBwbGFuZU5vcm1hbCApIHtcclxuXHJcblx0XHRfdmVjdG9yLmNvcHkoIHRoaXMgKS5wcm9qZWN0T25WZWN0b3IoIHBsYW5lTm9ybWFsICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuc3ViKCBfdmVjdG9yICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVmbGVjdHMgdGhpcyB2ZWN0b3Igb2ZmIGEgcGxhbmUgb3J0aG9nb25hbCB0byB0aGUgZ2l2ZW4gbm9ybWFsIHZlY3Rvci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gbm9ybWFsIC0gVGhlIChub3JtYWxpemVkKSBub3JtYWwgdmVjdG9yLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHJlZmxlY3QoIG5vcm1hbCApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5zdWIoIF92ZWN0b3IuY29weSggbm9ybWFsICkubXVsdGlwbHlTY2FsYXIoIDIgKiB0aGlzLmRvdCggbm9ybWFsICkgKSApO1xyXG5cclxuXHR9XHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgYW5nbGUgYmV0d2VlbiB0aGUgZ2l2ZW4gdmVjdG9yIGFuZCB0aGlzIGluc3RhbmNlIGluIHJhZGlhbnMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHYgLSBUaGUgdmVjdG9yIHRvIGNvbXB1dGUgdGhlIGFuZ2xlIHdpdGguXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgYW5nbGUgaW4gcmFkaWFucy5cclxuXHQgKi9cclxuXHRhbmdsZVRvKCB2ICkge1xyXG5cclxuXHRcdGNvbnN0IGRlbm9taW5hdG9yID0gTWF0aC5zcXJ0KCB0aGlzLmxlbmd0aFNxKCkgKiB2Lmxlbmd0aFNxKCkgKTtcclxuXHJcblx0XHRpZiAoIGRlbm9taW5hdG9yID09PSAwICkgcmV0dXJuIE1hdGguUEkgLyAyO1xyXG5cclxuXHRcdGNvbnN0IHRoZXRhID0gdGhpcy5kb3QoIHYgKSAvIGRlbm9taW5hdG9yO1xyXG5cclxuXHRcdC8vIGNsYW1wLCB0byBoYW5kbGUgbnVtZXJpY2FsIHByb2JsZW1zXHJcblxyXG5cdFx0cmV0dXJuIE1hdGguYWNvcyggY2xhbXAoIHRoZXRhLCAtIDEsIDEgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBnaXZlbiB2ZWN0b3IgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdiAtIFRoZSB2ZWN0b3IgdG8gY29tcHV0ZSB0aGUgZGlzdGFuY2UgdG8uXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgZGlzdGFuY2UuXHJcblx0ICovXHJcblx0ZGlzdGFuY2VUbyggdiApIHtcclxuXHJcblx0XHRyZXR1cm4gTWF0aC5zcXJ0KCB0aGlzLmRpc3RhbmNlVG9TcXVhcmVkKCB2ICkgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB0aGUgc3F1YXJlZCBkaXN0YW5jZSBmcm9tIHRoZSBnaXZlbiB2ZWN0b3IgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKiBJZiB5b3UgYXJlIGp1c3QgY29tcGFyaW5nIHRoZSBkaXN0YW5jZSB3aXRoIGFub3RoZXIgZGlzdGFuY2UsIHlvdSBzaG91bGQgY29tcGFyZVxyXG5cdCAqIHRoZSBkaXN0YW5jZSBzcXVhcmVkIGluc3RlYWQgYXMgaXQgaXMgc2xpZ2h0bHkgbW9yZSBlZmZpY2llbnQgdG8gY2FsY3VsYXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB2IC0gVGhlIHZlY3RvciB0byBjb21wdXRlIHRoZSBzcXVhcmVkIGRpc3RhbmNlIHRvLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIHNxdWFyZWQgZGlzdGFuY2UuXHJcblx0ICovXHJcblx0ZGlzdGFuY2VUb1NxdWFyZWQoIHYgKSB7XHJcblxyXG5cdFx0Y29uc3QgZHggPSB0aGlzLnggLSB2LngsIGR5ID0gdGhpcy55IC0gdi55LCBkeiA9IHRoaXMueiAtIHYuejtcclxuXHJcblx0XHRyZXR1cm4gZHggKiBkeCArIGR5ICogZHkgKyBkeiAqIGR6O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSBNYW5oYXR0YW4gZGlzdGFuY2UgZnJvbSB0aGUgZ2l2ZW4gdmVjdG9yIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHYgLSBUaGUgdmVjdG9yIHRvIGNvbXB1dGUgdGhlIE1hbmhhdHRhbiBkaXN0YW5jZSB0by5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBNYW5oYXR0YW4gZGlzdGFuY2UuXHJcblx0ICovXHJcblx0bWFuaGF0dGFuRGlzdGFuY2VUbyggdiApIHtcclxuXHJcblx0XHRyZXR1cm4gTWF0aC5hYnMoIHRoaXMueCAtIHYueCApICsgTWF0aC5hYnMoIHRoaXMueSAtIHYueSApICsgTWF0aC5hYnMoIHRoaXMueiAtIHYueiApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHZlY3RvciBjb21wb25lbnRzIGZyb20gdGhlIGdpdmVuIHNwaGVyaWNhbCBjb29yZGluYXRlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7U3BoZXJpY2FsfSBzIC0gVGhlIHNwaGVyaWNhbCBjb29yZGluYXRlcy5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRzZXRGcm9tU3BoZXJpY2FsKCBzICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnNldEZyb21TcGhlcmljYWxDb29yZHMoIHMucmFkaXVzLCBzLnBoaSwgcy50aGV0YSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHZlY3RvciBjb21wb25lbnRzIGZyb20gdGhlIGdpdmVuIHNwaGVyaWNhbCBjb29yZGluYXRlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSByYWRpdXMgLSBUaGUgcmFkaXVzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBwaGkgLSBUaGUgcGhpIGFuZ2xlIGluIHJhZGlhbnMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHRoZXRhIC0gVGhlIHRoZXRhIGFuZ2xlIGluIHJhZGlhbnMuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0c2V0RnJvbVNwaGVyaWNhbENvb3JkcyggcmFkaXVzLCBwaGksIHRoZXRhICkge1xyXG5cclxuXHRcdGNvbnN0IHNpblBoaVJhZGl1cyA9IE1hdGguc2luKCBwaGkgKSAqIHJhZGl1cztcclxuXHJcblx0XHR0aGlzLnggPSBzaW5QaGlSYWRpdXMgKiBNYXRoLnNpbiggdGhldGEgKTtcclxuXHRcdHRoaXMueSA9IE1hdGguY29zKCBwaGkgKSAqIHJhZGl1cztcclxuXHRcdHRoaXMueiA9IHNpblBoaVJhZGl1cyAqIE1hdGguY29zKCB0aGV0YSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHZlY3RvciBjb21wb25lbnRzIGZyb20gdGhlIGdpdmVuIGN5bGluZHJpY2FsIGNvb3JkaW5hdGVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtDeWxpbmRyaWNhbH0gYyAtIFRoZSBjeWxpbmRyaWNhbCBjb29yZGluYXRlcy5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRzZXRGcm9tQ3lsaW5kcmljYWwoIGMgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuc2V0RnJvbUN5bGluZHJpY2FsQ29vcmRzKCBjLnJhZGl1cywgYy50aGV0YSwgYy55ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdmVjdG9yIGNvbXBvbmVudHMgZnJvbSB0aGUgZ2l2ZW4gY3lsaW5kcmljYWwgY29vcmRpbmF0ZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gcmFkaXVzIC0gVGhlIHJhZGl1cy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdGhldGEgLSBUaGUgdGhldGEgYW5nbGUgaW4gcmFkaWFucy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB5IHZhbHVlLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHNldEZyb21DeWxpbmRyaWNhbENvb3JkcyggcmFkaXVzLCB0aGV0YSwgeSApIHtcclxuXHJcblx0XHR0aGlzLnggPSByYWRpdXMgKiBNYXRoLnNpbiggdGhldGEgKTtcclxuXHRcdHRoaXMueSA9IHk7XHJcblx0XHR0aGlzLnogPSByYWRpdXMgKiBNYXRoLmNvcyggdGhldGEgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB2ZWN0b3IgY29tcG9uZW50cyB0byB0aGUgcG9zaXRpb24gZWxlbWVudHMgb2YgdGhlXHJcblx0ICogZ2l2ZW4gdHJhbnNmb3JtYXRpb24gbWF0cml4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRyaXg0fSBtIC0gVGhlIDR4NCBtYXRyaXguXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0c2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBtICkge1xyXG5cclxuXHRcdGNvbnN0IGUgPSBtLmVsZW1lbnRzO1xyXG5cclxuXHRcdHRoaXMueCA9IGVbIDEyIF07XHJcblx0XHR0aGlzLnkgPSBlWyAxMyBdO1xyXG5cdFx0dGhpcy56ID0gZVsgMTQgXTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB2ZWN0b3IgY29tcG9uZW50cyB0byB0aGUgc2NhbGUgZWxlbWVudHMgb2YgdGhlXHJcblx0ICogZ2l2ZW4gdHJhbnNmb3JtYXRpb24gbWF0cml4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRyaXg0fSBtIC0gVGhlIDR4NCBtYXRyaXguXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0c2V0RnJvbU1hdHJpeFNjYWxlKCBtICkge1xyXG5cclxuXHRcdGNvbnN0IHN4ID0gdGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKCBtLCAwICkubGVuZ3RoKCk7XHJcblx0XHRjb25zdCBzeSA9IHRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbiggbSwgMSApLmxlbmd0aCgpO1xyXG5cdFx0Y29uc3Qgc3ogPSB0aGlzLnNldEZyb21NYXRyaXhDb2x1bW4oIG0sIDIgKS5sZW5ndGgoKTtcclxuXHJcblx0XHR0aGlzLnggPSBzeDtcclxuXHRcdHRoaXMueSA9IHN5O1xyXG5cdFx0dGhpcy56ID0gc3o7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdmVjdG9yIGNvbXBvbmVudHMgZnJvbSB0aGUgc3BlY2lmaWVkIG1hdHJpeCBjb2x1bW4uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDR9IG0gLSBUaGUgNHg0IG1hdHJpeC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgY29sdW1uIGluZGV4LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHNldEZyb21NYXRyaXhDb2x1bW4oIG0sIGluZGV4ICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmZyb21BcnJheSggbS5lbGVtZW50cywgaW5kZXggKiA0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdmVjdG9yIGNvbXBvbmVudHMgZnJvbSB0aGUgc3BlY2lmaWVkIG1hdHJpeCBjb2x1bW4uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDN9IG0gLSBUaGUgM3gzIG1hdHJpeC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgY29sdW1uIGluZGV4LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHNldEZyb21NYXRyaXgzQ29sdW1uKCBtLCBpbmRleCApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5mcm9tQXJyYXkoIG0uZWxlbWVudHMsIGluZGV4ICogMyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHZlY3RvciBjb21wb25lbnRzIGZyb20gdGhlIGdpdmVuIEV1bGVyIGFuZ2xlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7RXVsZXJ9IGUgLSBUaGUgRXVsZXIgYW5nbGVzIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHZlY3Rvci5cclxuXHQgKi9cclxuXHRzZXRGcm9tRXVsZXIoIGUgKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gZS5feDtcclxuXHRcdHRoaXMueSA9IGUuX3k7XHJcblx0XHR0aGlzLnogPSBlLl96O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHZlY3RvciBjb21wb25lbnRzIGZyb20gdGhlIFJHQiBjb21wb25lbnRzIG9mIHRoZVxyXG5cdCAqIGdpdmVuIGNvbG9yLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtDb2xvcn0gYyAtIFRoZSBjb2xvciB0byBzZXQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0c2V0RnJvbUNvbG9yKCBjICkge1xyXG5cclxuXHRcdHRoaXMueCA9IGMucjtcclxuXHRcdHRoaXMueSA9IGMuZztcclxuXHRcdHRoaXMueiA9IGMuYjtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIHZlY3RvciBpcyBlcXVhbCB3aXRoIHRoZSBnaXZlbiBvbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHYgLSBUaGUgdmVjdG9yIHRvIHRlc3QgZm9yIGVxdWFsaXR5LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyB2ZWN0b3IgaXMgZXF1YWwgd2l0aCB0aGUgZ2l2ZW4gb25lLlxyXG5cdCAqL1xyXG5cdGVxdWFscyggdiApIHtcclxuXHJcblx0XHRyZXR1cm4gKCAoIHYueCA9PT0gdGhpcy54ICkgJiYgKCB2LnkgPT09IHRoaXMueSApICYmICggdi56ID09PSB0aGlzLnogKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhpcyB2ZWN0b3IncyB4IHZhbHVlIHRvIGJlIGBhcnJheVsgb2Zmc2V0IF1gLCB5IHZhbHVlIHRvIGJlIGBhcnJheVsgb2Zmc2V0ICsgMSBdYFxyXG5cdCAqIGFuZCB6IHZhbHVlIHRvIGJlIGBhcnJheVsgb2Zmc2V0ICsgMiBdYC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gYXJyYXkgLSBBbiBhcnJheSBob2xkaW5nIHRoZSB2ZWN0b3IgY29tcG9uZW50IHZhbHVlcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW29mZnNldD0wXSAtIFRoZSBvZmZzZXQgaW50byB0aGUgYXJyYXkuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSByZWZlcmVuY2UgdG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0ZnJvbUFycmF5KCBhcnJheSwgb2Zmc2V0ID0gMCApIHtcclxuXHJcblx0XHR0aGlzLnggPSBhcnJheVsgb2Zmc2V0IF07XHJcblx0XHR0aGlzLnkgPSBhcnJheVsgb2Zmc2V0ICsgMSBdO1xyXG5cdFx0dGhpcy56ID0gYXJyYXlbIG9mZnNldCArIDIgXTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBXcml0ZXMgdGhlIGNvbXBvbmVudHMgb2YgdGhpcyB2ZWN0b3IgdG8gdGhlIGdpdmVuIGFycmF5LiBJZiBubyBhcnJheSBpcyBwcm92aWRlZCxcclxuXHQgKiB0aGUgbWV0aG9kIHJldHVybnMgYSBuZXcgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IFthcnJheT1bXV0gLSBUaGUgdGFyZ2V0IGFycmF5IGhvbGRpbmcgdGhlIHZlY3RvciBjb21wb25lbnRzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0PTBdIC0gSW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGFycmF5LlxyXG5cdCAqIEByZXR1cm4ge0FycmF5PG51bWJlcj59IFRoZSB2ZWN0b3IgY29tcG9uZW50cy5cclxuXHQgKi9cclxuXHR0b0FycmF5KCBhcnJheSA9IFtdLCBvZmZzZXQgPSAwICkge1xyXG5cclxuXHRcdGFycmF5WyBvZmZzZXQgXSA9IHRoaXMueDtcclxuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLnk7XHJcblx0XHRhcnJheVsgb2Zmc2V0ICsgMiBdID0gdGhpcy56O1xyXG5cclxuXHRcdHJldHVybiBhcnJheTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBjb21wb25lbnRzIG9mIHRoaXMgdmVjdG9yIGZyb20gdGhlIGdpdmVuIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0J1ZmZlckF0dHJpYnV0ZX0gYXR0cmlidXRlIC0gVGhlIGJ1ZmZlciBhdHRyaWJ1dGUgaG9sZGluZyB2ZWN0b3IgZGF0YS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggaW50byB0aGUgYXR0cmlidXRlLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdGZyb21CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgaW5kZXggKSB7XHJcblxyXG5cdFx0dGhpcy54ID0gYXR0cmlidXRlLmdldFgoIGluZGV4ICk7XHJcblx0XHR0aGlzLnkgPSBhdHRyaWJ1dGUuZ2V0WSggaW5kZXggKTtcclxuXHRcdHRoaXMueiA9IGF0dHJpYnV0ZS5nZXRaKCBpbmRleCApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgZWFjaCBjb21wb25lbnQgb2YgdGhpcyB2ZWN0b3IgdG8gYSBwc2V1ZG8tcmFuZG9tIHZhbHVlIGJldHdlZW4gYDBgIGFuZFxyXG5cdCAqIGAxYCwgZXhjbHVkaW5nIGAxYC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHJhbmRvbSgpIHtcclxuXHJcblx0XHR0aGlzLnggPSBNYXRoLnJhbmRvbSgpO1xyXG5cdFx0dGhpcy55ID0gTWF0aC5yYW5kb20oKTtcclxuXHRcdHRoaXMueiA9IE1hdGgucmFuZG9tKCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGlzIHZlY3RvciB0byBhIHVuaWZvcm1seSByYW5kb20gcG9pbnQgb24gYSB1bml0IHNwaGVyZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHJhbmRvbURpcmVjdGlvbigpIHtcclxuXHJcblx0XHQvLyBodHRwczovL21hdGh3b3JsZC53b2xmcmFtLmNvbS9TcGhlcmVQb2ludFBpY2tpbmcuaHRtbFxyXG5cclxuXHRcdGNvbnN0IHRoZXRhID0gTWF0aC5yYW5kb20oKSAqIE1hdGguUEkgKiAyO1xyXG5cdFx0Y29uc3QgdSA9IE1hdGgucmFuZG9tKCkgKiAyIC0gMTtcclxuXHRcdGNvbnN0IGMgPSBNYXRoLnNxcnQoIDEgLSB1ICogdSApO1xyXG5cclxuXHRcdHRoaXMueCA9IGMgKiBNYXRoLmNvcyggdGhldGEgKTtcclxuXHRcdHRoaXMueSA9IHU7XHJcblx0XHR0aGlzLnogPSBjICogTWF0aC5zaW4oIHRoZXRhICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0KlsgU3ltYm9sLml0ZXJhdG9yIF0oKSB7XHJcblxyXG5cdFx0eWllbGQgdGhpcy54O1xyXG5cdFx0eWllbGQgdGhpcy55O1xyXG5cdFx0eWllbGQgdGhpcy56O1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5jb25zdCBfdmVjdG9yID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfcXVhdGVybmlvbiA9IC8qQF9fUFVSRV9fKi8gbmV3IFF1YXRlcm5pb24oKTtcclxuXHJcbmV4cG9ydCB7IFZlY3RvcjMgfTtcclxuIiwiaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4vVmVjdG9yMy5qcyc7XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyBhbiBheGlzLWFsaWduZWQgYm91bmRpbmcgYm94IChBQUJCKSBpbiAzRCBzcGFjZS5cclxuICovXHJcbmNsYXNzIEJveDMge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGJvdW5kaW5nIGJveC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gW21pbj0oSW5maW5pdHksSW5maW5pdHksSW5maW5pdHkpXSAtIEEgdmVjdG9yIHJlcHJlc2VudGluZyB0aGUgbG93ZXIgYm91bmRhcnkgb2YgdGhlIGJveC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IFttYXg9KC1JbmZpbml0eSwtSW5maW5pdHksLUluZmluaXR5KV0gLSBBIHZlY3RvciByZXByZXNlbnRpbmcgdGhlIHVwcGVyIGJvdW5kYXJ5IG9mIHRoZSBib3guXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG1pbiA9IG5ldyBWZWN0b3IzKCArIEluZmluaXR5LCArIEluZmluaXR5LCArIEluZmluaXR5ICksIG1heCA9IG5ldyBWZWN0b3IzKCAtIEluZmluaXR5LCAtIEluZmluaXR5LCAtIEluZmluaXR5ICkgKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzQm94MyA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbG93ZXIgYm91bmRhcnkgb2YgdGhlIGJveC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yM31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5taW4gPSBtaW47XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdXBwZXIgYm91bmRhcnkgb2YgdGhlIGJveC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yM31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tYXggPSBtYXg7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgbG93ZXIgYW5kIHVwcGVyIGJvdW5kYXJpZXMgb2YgdGhpcyBib3guXHJcblx0ICogUGxlYXNlIG5vdGUgdGhhdCB0aGlzIG1ldGhvZCBvbmx5IGNvcGllcyB0aGUgdmFsdWVzIGZyb20gdGhlIGdpdmVuIG9iamVjdHMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IG1pbiAtIFRoZSBsb3dlciBib3VuZGFyeSBvZiB0aGUgYm94LlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gbWF4IC0gVGhlIHVwcGVyIGJvdW5kYXJ5IG9mIHRoZSBib3guXHJcblx0ICogQHJldHVybiB7Qm94M30gQSByZWZlcmVuY2UgdG8gdGhpcyBib3VuZGluZyBib3guXHJcblx0ICovXHJcblx0c2V0KCBtaW4sIG1heCApIHtcclxuXHJcblx0XHR0aGlzLm1pbi5jb3B5KCBtaW4gKTtcclxuXHRcdHRoaXMubWF4LmNvcHkoIG1heCApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHVwcGVyIGFuZCBsb3dlciBib3VuZHMgb2YgdGhpcyBib3ggc28gaXQgZW5jbG9zZXMgdGhlIHBvc2l0aW9uIGRhdGFcclxuXHQgKiBpbiB0aGUgZ2l2ZW4gYXJyYXkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IGFycmF5IC0gQW4gYXJyYXkgaG9sZGluZyAzRCBwb3NpdGlvbiBkYXRhLlxyXG5cdCAqIEByZXR1cm4ge0JveDN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgYm91bmRpbmcgYm94LlxyXG5cdCAqL1xyXG5cdHNldEZyb21BcnJheSggYXJyYXkgKSB7XHJcblxyXG5cdFx0dGhpcy5tYWtlRW1wdHkoKTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gYXJyYXkubGVuZ3RoOyBpIDwgaWw7IGkgKz0gMyApIHtcclxuXHJcblx0XHRcdHRoaXMuZXhwYW5kQnlQb2ludCggX3ZlY3Rvci5mcm9tQXJyYXkoIGFycmF5LCBpICkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdXBwZXIgYW5kIGxvd2VyIGJvdW5kcyBvZiB0aGlzIGJveCBzbyBpdCBlbmNsb3NlcyB0aGUgcG9zaXRpb24gZGF0YVxyXG5cdCAqIGluIHRoZSBnaXZlbiBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCdWZmZXJBdHRyaWJ1dGV9IGF0dHJpYnV0ZSAtIEEgYnVmZmVyIGF0dHJpYnV0ZSBob2xkaW5nIDNEIHBvc2l0aW9uIGRhdGEuXHJcblx0ICogQHJldHVybiB7Qm94M30gQSByZWZlcmVuY2UgdG8gdGhpcyBib3VuZGluZyBib3guXHJcblx0ICovXHJcblx0c2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlICkge1xyXG5cclxuXHRcdHRoaXMubWFrZUVtcHR5KCk7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IGF0dHJpYnV0ZS5jb3VudDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdFx0dGhpcy5leHBhbmRCeVBvaW50KCBfdmVjdG9yLmZyb21CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgaSApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHVwcGVyIGFuZCBsb3dlciBib3VuZHMgb2YgdGhpcyBib3ggc28gaXQgZW5jbG9zZXMgdGhlIHBvc2l0aW9uIGRhdGFcclxuXHQgKiBpbiB0aGUgZ2l2ZW4gYXJyYXkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PFZlY3RvcjM+fSBwb2ludHMgLSBBbiBhcnJheSBob2xkaW5nIDNEIHBvc2l0aW9uIGRhdGEgYXMgaW5zdGFuY2VzIG9mIHtAbGluayBWZWN0b3IzfS5cclxuXHQgKiBAcmV0dXJuIHtCb3gzfSBBIHJlZmVyZW5jZSB0byB0aGlzIGJvdW5kaW5nIGJveC5cclxuXHQgKi9cclxuXHRzZXRGcm9tUG9pbnRzKCBwb2ludHMgKSB7XHJcblxyXG5cdFx0dGhpcy5tYWtlRW1wdHkoKTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gcG9pbnRzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdFx0dGhpcy5leHBhbmRCeVBvaW50KCBwb2ludHNbIGkgXSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDZW50ZXJzIHRoaXMgYm94IG9uIHRoZSBnaXZlbiBjZW50ZXIgdmVjdG9yIGFuZCBzZXRzIHRoaXMgYm94J3Mgd2lkdGgsIGhlaWdodCBhbmRcclxuXHQgKiBkZXB0aCB0byB0aGUgZ2l2ZW4gc2l6ZSB2YWx1ZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IGNlbnRlciAtIFRoZSBjZW50ZXIgb2YgdGhlIGJveC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHNpemUgLSBUaGUgeCwgeSBhbmQgeiBkaW1lbnNpb25zIG9mIHRoZSBib3guXHJcblx0ICogQHJldHVybiB7Qm94M30gQSByZWZlcmVuY2UgdG8gdGhpcyBib3VuZGluZyBib3guXHJcblx0ICovXHJcblx0c2V0RnJvbUNlbnRlckFuZFNpemUoIGNlbnRlciwgc2l6ZSApIHtcclxuXHJcblx0XHRjb25zdCBoYWxmU2l6ZSA9IF92ZWN0b3IuY29weSggc2l6ZSApLm11bHRpcGx5U2NhbGFyKCAwLjUgKTtcclxuXHJcblx0XHR0aGlzLm1pbi5jb3B5KCBjZW50ZXIgKS5zdWIoIGhhbGZTaXplICk7XHJcblx0XHR0aGlzLm1heC5jb3B5KCBjZW50ZXIgKS5hZGQoIGhhbGZTaXplICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgdGhlIHdvcmxkLWF4aXMtYWxpZ25lZCBib3VuZGluZyBib3ggZm9yIHRoZSBnaXZlbiAzRCBvYmplY3RcclxuXHQgKiAoaW5jbHVkaW5nIGl0cyBjaGlsZHJlbiksIGFjY291bnRpbmcgZm9yIHRoZSBvYmplY3QncywgYW5kIGNoaWxkcmVuJ3MsXHJcblx0ICogd29ybGQgdHJhbnNmb3Jtcy4gVGhlIGZ1bmN0aW9uIG1heSByZXN1bHQgaW4gYSBsYXJnZXIgYm94IHRoYW4gc3RyaWN0bHkgbmVjZXNzYXJ5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3QzRH0gb2JqZWN0IC0gVGhlIDNEIG9iamVjdCB0byBjb21wdXRlIHRoZSBib3VuZGluZyBib3ggZm9yLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW3ByZWNpc2U9ZmFsc2VdIC0gSWYgc2V0IHRvIGB0cnVlYCwgdGhlIG1ldGhvZCBjb21wdXRlcyB0aGUgc21hbGxlc3RcclxuXHQgKiB3b3JsZC1heGlzLWFsaWduZWQgYm91bmRpbmcgYm94IGF0IHRoZSBleHBlbnNlIG9mIG1vcmUgY29tcHV0YXRpb24uXHJcblx0ICogQHJldHVybiB7Qm94M30gQSByZWZlcmVuY2UgdG8gdGhpcyBib3VuZGluZyBib3guXHJcblx0ICovXHJcblx0c2V0RnJvbU9iamVjdCggb2JqZWN0LCBwcmVjaXNlID0gZmFsc2UgKSB7XHJcblxyXG5cdFx0dGhpcy5tYWtlRW1wdHkoKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5leHBhbmRCeU9iamVjdCggb2JqZWN0LCBwcmVjaXNlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIG5ldyBib3ggd2l0aCBjb3BpZWQgdmFsdWVzIGZyb20gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0JveDN9IEEgY2xvbmUgb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjbG9uZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29waWVzIHRoZSB2YWx1ZXMgb2YgdGhlIGdpdmVuIGJveCB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCb3gzfSBib3ggLSBUaGUgYm94IHRvIGNvcHkuXHJcblx0ICogQHJldHVybiB7Qm94M30gQSByZWZlcmVuY2UgdG8gdGhpcyBib3VuZGluZyBib3guXHJcblx0ICovXHJcblx0Y29weSggYm94ICkge1xyXG5cclxuXHRcdHRoaXMubWluLmNvcHkoIGJveC5taW4gKTtcclxuXHRcdHRoaXMubWF4LmNvcHkoIGJveC5tYXggKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBNYWtlcyB0aGlzIGJveCBlbXB0eSB3aGljaCBtZWFucyBpbiBlbmNsb3NlcyBhIHplcm8gc3BhY2UgaW4gM0QuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtCb3gzfSBBIHJlZmVyZW5jZSB0byB0aGlzIGJvdW5kaW5nIGJveC5cclxuXHQgKi9cclxuXHRtYWtlRW1wdHkoKSB7XHJcblxyXG5cdFx0dGhpcy5taW4ueCA9IHRoaXMubWluLnkgPSB0aGlzLm1pbi56ID0gKyBJbmZpbml0eTtcclxuXHRcdHRoaXMubWF4LnggPSB0aGlzLm1heC55ID0gdGhpcy5tYXgueiA9IC0gSW5maW5pdHk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0cnVlIGlmIHRoaXMgYm94IGluY2x1ZGVzIHplcm8gcG9pbnRzIHdpdGhpbiBpdHMgYm91bmRzLlxyXG5cdCAqIE5vdGUgdGhhdCBhIGJveCB3aXRoIGVxdWFsIGxvd2VyIGFuZCB1cHBlciBib3VuZHMgc3RpbGwgaW5jbHVkZXMgb25lXHJcblx0ICogcG9pbnQsIHRoZSBvbmUgYm90aCBib3VuZHMgc2hhcmUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoaXMgYm94IGlzIGVtcHR5IG9yIG5vdC5cclxuXHQgKi9cclxuXHRpc0VtcHR5KCkge1xyXG5cclxuXHRcdC8vIHRoaXMgaXMgYSBtb3JlIHJvYnVzdCBjaGVjayBmb3IgZW1wdHkgdGhhbiAoIHZvbHVtZSA8PSAwICkgYmVjYXVzZSB2b2x1bWUgY2FuIGdldCBwb3NpdGl2ZSB3aXRoIHR3byBuZWdhdGl2ZSBheGVzXHJcblxyXG5cdFx0cmV0dXJuICggdGhpcy5tYXgueCA8IHRoaXMubWluLnggKSB8fCAoIHRoaXMubWF4LnkgPCB0aGlzLm1pbi55ICkgfHwgKCB0aGlzLm1heC56IDwgdGhpcy5taW4ueiApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGNlbnRlciBwb2ludCBvZiB0aGlzIGJveC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdGFyZ2V0IC0gVGhlIHRhcmdldCB2ZWN0b3IgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBtZXRob2QncyByZXN1bHQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gVGhlIGNlbnRlciBwb2ludC5cclxuXHQgKi9cclxuXHRnZXRDZW50ZXIoIHRhcmdldCApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5pc0VtcHR5KCkgPyB0YXJnZXQuc2V0KCAwLCAwLCAwICkgOiB0YXJnZXQuYWRkVmVjdG9ycyggdGhpcy5taW4sIHRoaXMubWF4ICkubXVsdGlwbHlTY2FsYXIoIDAuNSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGRpbWVuc2lvbnMgb2YgdGhpcyBib3guXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHRhcmdldCAtIFRoZSB0YXJnZXQgdmVjdG9yIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbWV0aG9kJ3MgcmVzdWx0LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IFRoZSBzaXplLlxyXG5cdCAqL1xyXG5cdGdldFNpemUoIHRhcmdldCApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5pc0VtcHR5KCkgPyB0YXJnZXQuc2V0KCAwLCAwLCAwICkgOiB0YXJnZXQuc3ViVmVjdG9ycyggdGhpcy5tYXgsIHRoaXMubWluICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRXhwYW5kcyB0aGUgYm91bmRhcmllcyBvZiB0aGlzIGJveCB0byBpbmNsdWRlIHRoZSBnaXZlbiBwb2ludC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gcG9pbnQgLSBUaGUgcG9pbnQgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgYnkgdGhlIGJvdW5kaW5nIGJveC5cclxuXHQgKiBAcmV0dXJuIHtCb3gzfSBBIHJlZmVyZW5jZSB0byB0aGlzIGJvdW5kaW5nIGJveC5cclxuXHQgKi9cclxuXHRleHBhbmRCeVBvaW50KCBwb2ludCApIHtcclxuXHJcblx0XHR0aGlzLm1pbi5taW4oIHBvaW50ICk7XHJcblx0XHR0aGlzLm1heC5tYXgoIHBvaW50ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRXhwYW5kcyB0aGlzIGJveCBlcXVpbGF0ZXJhbGx5IGJ5IHRoZSBnaXZlbiB2ZWN0b3IuIFRoZSB3aWR0aCBvZiB0aGlzXHJcblx0ICogYm94IHdpbGwgYmUgZXhwYW5kZWQgYnkgdGhlIHggY29tcG9uZW50IG9mIHRoZSB2ZWN0b3IgaW4gYm90aFxyXG5cdCAqIGRpcmVjdGlvbnMuIFRoZSBoZWlnaHQgb2YgdGhpcyBib3ggd2lsbCBiZSBleHBhbmRlZCBieSB0aGUgeSBjb21wb25lbnQgb2ZcclxuXHQgKiB0aGUgdmVjdG9yIGluIGJvdGggZGlyZWN0aW9ucy4gVGhlIGRlcHRoIG9mIHRoaXMgYm94IHdpbGwgYmVcclxuXHQgKiBleHBhbmRlZCBieSB0aGUgeiBjb21wb25lbnQgb2YgdGhlIHZlY3RvciBpbiBib3RoIGRpcmVjdGlvbnMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHZlY3RvciAtIFRoZSB2ZWN0b3IgdGhhdCBzaG91bGQgZXhwYW5kIHRoZSBib3VuZGluZyBib3guXHJcblx0ICogQHJldHVybiB7Qm94M30gQSByZWZlcmVuY2UgdG8gdGhpcyBib3VuZGluZyBib3guXHJcblx0ICovXHJcblx0ZXhwYW5kQnlWZWN0b3IoIHZlY3RvciApIHtcclxuXHJcblx0XHR0aGlzLm1pbi5zdWIoIHZlY3RvciApO1xyXG5cdFx0dGhpcy5tYXguYWRkKCB2ZWN0b3IgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFeHBhbmRzIGVhY2ggZGltZW5zaW9uIG9mIHRoZSBib3ggYnkgdGhlIGdpdmVuIHNjYWxhci4gSWYgbmVnYXRpdmUsIHRoZVxyXG5cdCAqIGRpbWVuc2lvbnMgb2YgdGhlIGJveCB3aWxsIGJlIGNvbnRyYWN0ZWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc2NhbGFyIC0gVGhlIHNjYWxhciB2YWx1ZSB0aGF0IHNob3VsZCBleHBhbmQgdGhlIGJvdW5kaW5nIGJveC5cclxuXHQgKiBAcmV0dXJuIHtCb3gzfSBBIHJlZmVyZW5jZSB0byB0aGlzIGJvdW5kaW5nIGJveC5cclxuXHQgKi9cclxuXHRleHBhbmRCeVNjYWxhciggc2NhbGFyICkge1xyXG5cclxuXHRcdHRoaXMubWluLmFkZFNjYWxhciggLSBzY2FsYXIgKTtcclxuXHRcdHRoaXMubWF4LmFkZFNjYWxhciggc2NhbGFyICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRXhwYW5kcyB0aGUgYm91bmRhcmllcyBvZiB0aGlzIGJveCB0byBpbmNsdWRlIHRoZSBnaXZlbiAzRCBvYmplY3QgYW5kXHJcblx0ICogaXRzIGNoaWxkcmVuLCBhY2NvdW50aW5nIGZvciB0aGUgb2JqZWN0J3MsIGFuZCBjaGlsZHJlbidzLCB3b3JsZFxyXG5cdCAqIHRyYW5zZm9ybXMuIFRoZSBmdW5jdGlvbiBtYXkgcmVzdWx0IGluIGEgbGFyZ2VyIGJveCB0aGFuIHN0cmljdGx5XHJcblx0ICogbmVjZXNzYXJ5ICh1bmxlc3MgdGhlIHByZWNpc2UgcGFyYW1ldGVyIGlzIHNldCB0byB0cnVlKS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0M0R9IG9iamVjdCAtIFRoZSAzRCBvYmplY3QgdGhhdCBzaG91bGQgZXhwYW5kIHRoZSBib3VuZGluZyBib3guXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBwcmVjaXNlIC0gSWYgc2V0IHRvIGB0cnVlYCwgdGhlIG1ldGhvZCBleHBhbmRzIHRoZSBib3VuZGluZyBib3hcclxuXHQgKiBhcyBsaXR0bGUgYXMgbmVjZXNzYXJ5IGF0IHRoZSBleHBlbnNlIG9mIG1vcmUgY29tcHV0YXRpb24uXHJcblx0ICogQHJldHVybiB7Qm94M30gQSByZWZlcmVuY2UgdG8gdGhpcyBib3VuZGluZyBib3guXHJcblx0ICovXHJcblx0ZXhwYW5kQnlPYmplY3QoIG9iamVjdCwgcHJlY2lzZSA9IGZhbHNlICkge1xyXG5cclxuXHRcdC8vIENvbXB1dGVzIHRoZSB3b3JsZC1heGlzLWFsaWduZWQgYm91bmRpbmcgYm94IG9mIGFuIG9iamVjdCAoaW5jbHVkaW5nIGl0cyBjaGlsZHJlbiksXHJcblx0XHQvLyBhY2NvdW50aW5nIGZvciBib3RoIHRoZSBvYmplY3QncywgYW5kIGNoaWxkcmVuJ3MsIHdvcmxkIHRyYW5zZm9ybXNcclxuXHJcblx0XHRvYmplY3QudXBkYXRlV29ybGRNYXRyaXgoIGZhbHNlLCBmYWxzZSApO1xyXG5cclxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gb2JqZWN0Lmdlb21ldHJ5O1xyXG5cclxuXHRcdGlmICggZ2VvbWV0cnkgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGNvbnN0IHBvc2l0aW9uQXR0cmlidXRlID0gZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCAncG9zaXRpb24nICk7XHJcblxyXG5cdFx0XHQvLyBwcmVjaXNlIEFBQkIgY29tcHV0YXRpb24gYmFzZWQgb24gdmVydGV4IGRhdGEgcmVxdWlyZXMgYXQgbGVhc3QgYSBwb3NpdGlvbiBhdHRyaWJ1dGUuXHJcblx0XHRcdC8vIGluc3RhbmNpbmcgaXNuJ3Qgc3VwcG9ydGVkIHNvIGZhciBhbmQgdXNlcyB0aGUgbm9ybWFsIChjb25zZXJ2YXRpdmUpIGNvZGUgcGF0aC5cclxuXHJcblx0XHRcdGlmICggcHJlY2lzZSA9PT0gdHJ1ZSAmJiBwb3NpdGlvbkF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICYmIG9iamVjdC5pc0luc3RhbmNlZE1lc2ggIT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHBvc2l0aW9uQXR0cmlidXRlLmNvdW50OyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIG9iamVjdC5pc01lc2ggPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRvYmplY3QuZ2V0VmVydGV4UG9zaXRpb24oIGksIF92ZWN0b3IgKTtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0X3ZlY3Rvci5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbkF0dHJpYnV0ZSwgaSApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRfdmVjdG9yLmFwcGx5TWF0cml4NCggb2JqZWN0Lm1hdHJpeFdvcmxkICk7XHJcblx0XHRcdFx0XHR0aGlzLmV4cGFuZEJ5UG9pbnQoIF92ZWN0b3IgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0aWYgKCBvYmplY3QuYm91bmRpbmdCb3ggIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHQvLyBvYmplY3QtbGV2ZWwgYm91bmRpbmcgYm94XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBvYmplY3QuYm91bmRpbmdCb3ggPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRvYmplY3QuY29tcHV0ZUJvdW5kaW5nQm94KCk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdF9ib3guY29weSggb2JqZWN0LmJvdW5kaW5nQm94ICk7XHJcblxyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdC8vIGdlb21ldHJ5LWxldmVsIGJvdW5kaW5nIGJveFxyXG5cclxuXHRcdFx0XHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdCb3ggPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdCb3goKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0X2JveC5jb3B5KCBnZW9tZXRyeS5ib3VuZGluZ0JveCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdF9ib3guYXBwbHlNYXRyaXg0KCBvYmplY3QubWF0cml4V29ybGQgKTtcclxuXHJcblx0XHRcdFx0dGhpcy51bmlvbiggX2JveCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBjaGlsZHJlbiA9IG9iamVjdC5jaGlsZHJlbjtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0dGhpcy5leHBhbmRCeU9iamVjdCggY2hpbGRyZW5bIGkgXSwgcHJlY2lzZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gcG9pbnQgbGllcyB3aXRoaW4gb3Igb24gdGhlIGJvdW5kYXJpZXMgb2YgdGhpcyBib3guXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHBvaW50IC0gVGhlIHBvaW50IHRvIHRlc3QuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgYm91bmRpbmcgYm94IGNvbnRhaW5zIHRoZSBnaXZlbiBwb2ludCBvciBub3QuXHJcblx0ICovXHJcblx0Y29udGFpbnNQb2ludCggcG9pbnQgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHBvaW50LnggPj0gdGhpcy5taW4ueCAmJiBwb2ludC54IDw9IHRoaXMubWF4LnggJiZcclxuXHRcdFx0cG9pbnQueSA+PSB0aGlzLm1pbi55ICYmIHBvaW50LnkgPD0gdGhpcy5tYXgueSAmJlxyXG5cdFx0XHRwb2ludC56ID49IHRoaXMubWluLnogJiYgcG9pbnQueiA8PSB0aGlzLm1heC56O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgYm91bmRpbmcgYm94IGluY2x1ZGVzIHRoZSBlbnRpcmV0eSBvZiB0aGUgZ2l2ZW4gYm91bmRpbmcgYm94LlxyXG5cdCAqIElmIHRoaXMgYm94IGFuZCB0aGUgZ2l2ZW4gb25lIGFyZSBpZGVudGljYWwsIHRoaXMgZnVuY3Rpb24gYWxzbyByZXR1cm5zIGB0cnVlYC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Qm94M30gYm94IC0gVGhlIGJvdW5kaW5nIGJveCB0byB0ZXN0LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGJvdW5kaW5nIGJveCBjb250YWlucyB0aGUgZ2l2ZW4gYm91bmRpbmcgYm94IG9yIG5vdC5cclxuXHQgKi9cclxuXHRjb250YWluc0JveCggYm94ICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm1pbi54IDw9IGJveC5taW4ueCAmJiBib3gubWF4LnggPD0gdGhpcy5tYXgueCAmJlxyXG5cdFx0XHR0aGlzLm1pbi55IDw9IGJveC5taW4ueSAmJiBib3gubWF4LnkgPD0gdGhpcy5tYXgueSAmJlxyXG5cdFx0XHR0aGlzLm1pbi56IDw9IGJveC5taW4ueiAmJiBib3gubWF4LnogPD0gdGhpcy5tYXguejtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgcG9pbnQgYXMgYSBwcm9wb3J0aW9uIG9mIHRoaXMgYm94J3Mgd2lkdGgsIGhlaWdodCBhbmQgZGVwdGguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHBvaW50IC0gQSBwb2ludCBpbiAzRCBzcGFjZS5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHRhcmdldCAtIFRoZSB0YXJnZXQgdmVjdG9yIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbWV0aG9kJ3MgcmVzdWx0LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IEEgcG9pbnQgYXMgYSBwcm9wb3J0aW9uIG9mIHRoaXMgYm94J3Mgd2lkdGgsIGhlaWdodCBhbmQgZGVwdGguXHJcblx0ICovXHJcblx0Z2V0UGFyYW1ldGVyKCBwb2ludCwgdGFyZ2V0ICkge1xyXG5cclxuXHRcdC8vIFRoaXMgY2FuIHBvdGVudGlhbGx5IGhhdmUgYSBkaXZpZGUgYnkgemVybyBpZiB0aGUgYm94XHJcblx0XHQvLyBoYXMgYSBzaXplIGRpbWVuc2lvbiBvZiAwLlxyXG5cclxuXHRcdHJldHVybiB0YXJnZXQuc2V0KFxyXG5cdFx0XHQoIHBvaW50LnggLSB0aGlzLm1pbi54ICkgLyAoIHRoaXMubWF4LnggLSB0aGlzLm1pbi54ICksXHJcblx0XHRcdCggcG9pbnQueSAtIHRoaXMubWluLnkgKSAvICggdGhpcy5tYXgueSAtIHRoaXMubWluLnkgKSxcclxuXHRcdFx0KCBwb2ludC56IC0gdGhpcy5taW4ueiApIC8gKCB0aGlzLm1heC56IC0gdGhpcy5taW4ueiApXHJcblx0XHQpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBnaXZlbiBib3VuZGluZyBib3ggaW50ZXJzZWN0cyB3aXRoIHRoaXMgYm91bmRpbmcgYm94LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCb3gzfSBib3ggLSBUaGUgYm91bmRpbmcgYm94IHRvIHRlc3QuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZ2l2ZW4gYm91bmRpbmcgYm94IGludGVyc2VjdHMgd2l0aCB0aGlzIGJvdW5kaW5nIGJveC5cclxuXHQgKi9cclxuXHRpbnRlcnNlY3RzQm94KCBib3ggKSB7XHJcblxyXG5cdFx0Ly8gdXNpbmcgNiBzcGxpdHRpbmcgcGxhbmVzIHRvIHJ1bGUgb3V0IGludGVyc2VjdGlvbnMuXHJcblx0XHRyZXR1cm4gYm94Lm1heC54ID49IHRoaXMubWluLnggJiYgYm94Lm1pbi54IDw9IHRoaXMubWF4LnggJiZcclxuXHRcdFx0Ym94Lm1heC55ID49IHRoaXMubWluLnkgJiYgYm94Lm1pbi55IDw9IHRoaXMubWF4LnkgJiZcclxuXHRcdFx0Ym94Lm1heC56ID49IHRoaXMubWluLnogJiYgYm94Lm1pbi56IDw9IHRoaXMubWF4Lno7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIGJvdW5kaW5nIHNwaGVyZSBpbnRlcnNlY3RzIHdpdGggdGhpcyBib3VuZGluZyBib3guXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1NwaGVyZX0gc3BoZXJlIC0gVGhlIGJvdW5kaW5nIHNwaGVyZSB0byB0ZXN0LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGdpdmVuIGJvdW5kaW5nIHNwaGVyZSBpbnRlcnNlY3RzIHdpdGggdGhpcyBib3VuZGluZyBib3guXHJcblx0ICovXHJcblx0aW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICkge1xyXG5cclxuXHRcdC8vIEZpbmQgdGhlIHBvaW50IG9uIHRoZSBBQUJCIGNsb3Nlc3QgdG8gdGhlIHNwaGVyZSBjZW50ZXIuXHJcblx0XHR0aGlzLmNsYW1wUG9pbnQoIHNwaGVyZS5jZW50ZXIsIF92ZWN0b3IgKTtcclxuXHJcblx0XHQvLyBJZiB0aGF0IHBvaW50IGlzIGluc2lkZSB0aGUgc3BoZXJlLCB0aGUgQUFCQiBhbmQgc3BoZXJlIGludGVyc2VjdC5cclxuXHRcdHJldHVybiBfdmVjdG9yLmRpc3RhbmNlVG9TcXVhcmVkKCBzcGhlcmUuY2VudGVyICkgPD0gKCBzcGhlcmUucmFkaXVzICogc3BoZXJlLnJhZGl1cyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBnaXZlbiBwbGFuZSBpbnRlcnNlY3RzIHdpdGggdGhpcyBib3VuZGluZyBib3guXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1BsYW5lfSBwbGFuZSAtIFRoZSBwbGFuZSB0byB0ZXN0LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGdpdmVuIHBsYW5lIGludGVyc2VjdHMgd2l0aCB0aGlzIGJvdW5kaW5nIGJveC5cclxuXHQgKi9cclxuXHRpbnRlcnNlY3RzUGxhbmUoIHBsYW5lICkge1xyXG5cclxuXHRcdC8vIFdlIGNvbXB1dGUgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gZG90IHByb2R1Y3QgdmFsdWVzLiBJZiB0aG9zZSB2YWx1ZXNcclxuXHRcdC8vIGFyZSBvbiB0aGUgc2FtZSBzaWRlIChiYWNrIG9yIGZyb250KSBvZiB0aGUgcGxhbmUsIHRoZW4gdGhlcmUgaXMgbm8gaW50ZXJzZWN0aW9uLlxyXG5cclxuXHRcdGxldCBtaW4sIG1heDtcclxuXHJcblx0XHRpZiAoIHBsYW5lLm5vcm1hbC54ID4gMCApIHtcclxuXHJcblx0XHRcdG1pbiA9IHBsYW5lLm5vcm1hbC54ICogdGhpcy5taW4ueDtcclxuXHRcdFx0bWF4ID0gcGxhbmUubm9ybWFsLnggKiB0aGlzLm1heC54O1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRtaW4gPSBwbGFuZS5ub3JtYWwueCAqIHRoaXMubWF4Lng7XHJcblx0XHRcdG1heCA9IHBsYW5lLm5vcm1hbC54ICogdGhpcy5taW4ueDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBwbGFuZS5ub3JtYWwueSA+IDAgKSB7XHJcblxyXG5cdFx0XHRtaW4gKz0gcGxhbmUubm9ybWFsLnkgKiB0aGlzLm1pbi55O1xyXG5cdFx0XHRtYXggKz0gcGxhbmUubm9ybWFsLnkgKiB0aGlzLm1heC55O1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRtaW4gKz0gcGxhbmUubm9ybWFsLnkgKiB0aGlzLm1heC55O1xyXG5cdFx0XHRtYXggKz0gcGxhbmUubm9ybWFsLnkgKiB0aGlzLm1pbi55O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHBsYW5lLm5vcm1hbC56ID4gMCApIHtcclxuXHJcblx0XHRcdG1pbiArPSBwbGFuZS5ub3JtYWwueiAqIHRoaXMubWluLno7XHJcblx0XHRcdG1heCArPSBwbGFuZS5ub3JtYWwueiAqIHRoaXMubWF4Lno7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdG1pbiArPSBwbGFuZS5ub3JtYWwueiAqIHRoaXMubWF4Lno7XHJcblx0XHRcdG1heCArPSBwbGFuZS5ub3JtYWwueiAqIHRoaXMubWluLno7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiAoIG1pbiA8PSAtIHBsYW5lLmNvbnN0YW50ICYmIG1heCA+PSAtIHBsYW5lLmNvbnN0YW50ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIHRyaWFuZ2xlIGludGVyc2VjdHMgd2l0aCB0aGlzIGJvdW5kaW5nIGJveC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VHJpYW5nbGV9IHRyaWFuZ2xlIC0gVGhlIHRyaWFuZ2xlIHRvIHRlc3QuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZ2l2ZW4gdHJpYW5nbGUgaW50ZXJzZWN0cyB3aXRoIHRoaXMgYm91bmRpbmcgYm94LlxyXG5cdCAqL1xyXG5cdGludGVyc2VjdHNUcmlhbmdsZSggdHJpYW5nbGUgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmlzRW1wdHkoKSApIHtcclxuXHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gY29tcHV0ZSBib3ggY2VudGVyIGFuZCBleHRlbnRzXHJcblx0XHR0aGlzLmdldENlbnRlciggX2NlbnRlciApO1xyXG5cdFx0X2V4dGVudHMuc3ViVmVjdG9ycyggdGhpcy5tYXgsIF9jZW50ZXIgKTtcclxuXHJcblx0XHQvLyB0cmFuc2xhdGUgdHJpYW5nbGUgdG8gYWFiYiBvcmlnaW5cclxuXHRcdF92MC5zdWJWZWN0b3JzKCB0cmlhbmdsZS5hLCBfY2VudGVyICk7XHJcblx0XHRfdjEuc3ViVmVjdG9ycyggdHJpYW5nbGUuYiwgX2NlbnRlciApO1xyXG5cdFx0X3YyLnN1YlZlY3RvcnMoIHRyaWFuZ2xlLmMsIF9jZW50ZXIgKTtcclxuXHJcblx0XHQvLyBjb21wdXRlIGVkZ2UgdmVjdG9ycyBmb3IgdHJpYW5nbGVcclxuXHRcdF9mMC5zdWJWZWN0b3JzKCBfdjEsIF92MCApO1xyXG5cdFx0X2YxLnN1YlZlY3RvcnMoIF92MiwgX3YxICk7XHJcblx0XHRfZjIuc3ViVmVjdG9ycyggX3YwLCBfdjIgKTtcclxuXHJcblx0XHQvLyB0ZXN0IGFnYWluc3QgYXhlcyB0aGF0IGFyZSBnaXZlbiBieSBjcm9zcyBwcm9kdWN0IGNvbWJpbmF0aW9ucyBvZiB0aGUgZWRnZXMgb2YgdGhlIHRyaWFuZ2xlIGFuZCB0aGUgZWRnZXMgb2YgdGhlIGFhYmJcclxuXHRcdC8vIG1ha2UgYW4gYXhpcyB0ZXN0aW5nIG9mIGVhY2ggb2YgdGhlIDMgc2lkZXMgb2YgdGhlIGFhYmIgYWdhaW5zdCBlYWNoIG9mIHRoZSAzIHNpZGVzIG9mIHRoZSB0cmlhbmdsZSA9IDkgYXhpcyBvZiBzZXBhcmF0aW9uXHJcblx0XHQvLyBheGlzX2lqID0gdV9pIHggZl9qICh1MCwgdTEsIHUyID0gZmFjZSBub3JtYWxzIG9mIGFhYmIgPSB4LHkseiBheGVzIHZlY3RvcnMgc2luY2UgYWFiYiBpcyBheGlzIGFsaWduZWQpXHJcblx0XHRsZXQgYXhlcyA9IFtcclxuXHRcdFx0MCwgLSBfZjAueiwgX2YwLnksIDAsIC0gX2YxLnosIF9mMS55LCAwLCAtIF9mMi56LCBfZjIueSxcclxuXHRcdFx0X2YwLnosIDAsIC0gX2YwLngsIF9mMS56LCAwLCAtIF9mMS54LCBfZjIueiwgMCwgLSBfZjIueCxcclxuXHRcdFx0LSBfZjAueSwgX2YwLngsIDAsIC0gX2YxLnksIF9mMS54LCAwLCAtIF9mMi55LCBfZjIueCwgMFxyXG5cdFx0XTtcclxuXHRcdGlmICggISBzYXRGb3JBeGVzKCBheGVzLCBfdjAsIF92MSwgX3YyLCBfZXh0ZW50cyApICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyB0ZXN0IDMgZmFjZSBub3JtYWxzIGZyb20gdGhlIGFhYmJcclxuXHRcdGF4ZXMgPSBbIDEsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDEgXTtcclxuXHRcdGlmICggISBzYXRGb3JBeGVzKCBheGVzLCBfdjAsIF92MSwgX3YyLCBfZXh0ZW50cyApICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBmaW5hbGx5IHRlc3RpbmcgdGhlIGZhY2Ugbm9ybWFsIG9mIHRoZSB0cmlhbmdsZVxyXG5cdFx0Ly8gdXNlIGFscmVhZHkgZXhpc3RpbmcgdHJpYW5nbGUgZWRnZSB2ZWN0b3JzIGhlcmVcclxuXHRcdF90cmlhbmdsZU5vcm1hbC5jcm9zc1ZlY3RvcnMoIF9mMCwgX2YxICk7XHJcblx0XHRheGVzID0gWyBfdHJpYW5nbGVOb3JtYWwueCwgX3RyaWFuZ2xlTm9ybWFsLnksIF90cmlhbmdsZU5vcm1hbC56IF07XHJcblxyXG5cdFx0cmV0dXJuIHNhdEZvckF4ZXMoIGF4ZXMsIF92MCwgX3YxLCBfdjIsIF9leHRlbnRzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2xhbXBzIHRoZSBnaXZlbiBwb2ludCB3aXRoaW4gdGhlIGJvdW5kcyBvZiB0aGlzIGJveC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gcG9pbnQgLSBUaGUgcG9pbnQgdG8gY2xhbXAuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IHZlY3RvciB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGhvZCdzIHJlc3VsdC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBUaGUgY2xhbXBlZCBwb2ludC5cclxuXHQgKi9cclxuXHRjbGFtcFBvaW50KCBwb2ludCwgdGFyZ2V0ICkge1xyXG5cclxuXHRcdHJldHVybiB0YXJnZXQuY29weSggcG9pbnQgKS5jbGFtcCggdGhpcy5taW4sIHRoaXMubWF4ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgZXVjbGlkZWFuIGRpc3RhbmNlIGZyb20gYW55IGVkZ2Ugb2YgdGhpcyBib3ggdG8gdGhlIHNwZWNpZmllZCBwb2ludC4gSWZcclxuXHQgKiB0aGUgZ2l2ZW4gcG9pbnQgbGllcyBpbnNpZGUgb2YgdGhpcyBib3gsIHRoZSBkaXN0YW5jZSB3aWxsIGJlIGAwYC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gcG9pbnQgLSBUaGUgcG9pbnQgdG8gY29tcHV0ZSB0aGUgZGlzdGFuY2UgdG8uXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgZXVjbGlkZWFuIGRpc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGRpc3RhbmNlVG9Qb2ludCggcG9pbnQgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuY2xhbXBQb2ludCggcG9pbnQsIF92ZWN0b3IgKS5kaXN0YW5jZVRvKCBwb2ludCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBib3VuZGluZyBzcGhlcmUgdGhhdCBlbmNsb3NlcyB0aGlzIGJvdW5kaW5nIGJveC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7U3BoZXJlfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IHNwaGVyZSB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGhvZCdzIHJlc3VsdC5cclxuXHQgKiBAcmV0dXJuIHtTcGhlcmV9IFRoZSBib3VuZGluZyBzcGhlcmUgdGhhdCBlbmNsb3NlcyB0aGlzIGJvdW5kaW5nIGJveC5cclxuXHQgKi9cclxuXHRnZXRCb3VuZGluZ1NwaGVyZSggdGFyZ2V0ICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5pc0VtcHR5KCkgKSB7XHJcblxyXG5cdFx0XHR0YXJnZXQubWFrZUVtcHR5KCk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHRoaXMuZ2V0Q2VudGVyKCB0YXJnZXQuY2VudGVyICk7XHJcblxyXG5cdFx0XHR0YXJnZXQucmFkaXVzID0gdGhpcy5nZXRTaXplKCBfdmVjdG9yICkubGVuZ3RoKCkgKiAwLjU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0YXJnZXQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgdGhlIGludGVyc2VjdGlvbiBvZiB0aGlzIGJvdW5kaW5nIGJveCBhbmQgdGhlIGdpdmVuIG9uZSwgc2V0dGluZyB0aGUgdXBwZXJcclxuXHQgKiBib3VuZCBvZiB0aGlzIGJveCB0byB0aGUgbGVzc2VyIG9mIHRoZSB0d28gYm94ZXMnIHVwcGVyIGJvdW5kcyBhbmQgdGhlXHJcblx0ICogbG93ZXIgYm91bmQgb2YgdGhpcyBib3ggdG8gdGhlIGdyZWF0ZXIgb2YgdGhlIHR3byBib3hlcycgbG93ZXIgYm91bmRzLiBJZlxyXG5cdCAqIHRoZXJlJ3Mgbm8gb3ZlcmxhcCwgbWFrZXMgdGhpcyBib3ggZW1wdHkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0JveDN9IGJveCAtIFRoZSBib3VuZGluZyBib3ggdG8gaW50ZXJzZWN0IHdpdGguXHJcblx0ICogQHJldHVybiB7Qm94M30gQSByZWZlcmVuY2UgdG8gdGhpcyBib3VuZGluZyBib3guXHJcblx0ICovXHJcblx0aW50ZXJzZWN0KCBib3ggKSB7XHJcblxyXG5cdFx0dGhpcy5taW4ubWF4KCBib3gubWluICk7XHJcblx0XHR0aGlzLm1heC5taW4oIGJveC5tYXggKTtcclxuXHJcblx0XHQvLyBlbnN1cmUgdGhhdCBpZiB0aGVyZSBpcyBubyBvdmVybGFwLCB0aGUgcmVzdWx0IGlzIGZ1bGx5IGVtcHR5LCBub3Qgc2xpZ2h0bHkgZW1wdHkgd2l0aCBub24taW5mLytpbmYgdmFsdWVzIHRoYXQgd2lsbCBjYXVzZSBzdWJzZXF1ZW5jZSBpbnRlcnNlY3RzIHRvIGVycm9uZW91c2x5IHJldHVybiB2YWxpZCB2YWx1ZXMuXHJcblx0XHRpZiAoIHRoaXMuaXNFbXB0eSgpICkgdGhpcy5tYWtlRW1wdHkoKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB0aGUgdW5pb24gb2YgdGhpcyBib3ggYW5kIGFub3RoZXIgYW5kIHRoZSBnaXZlbiBvbmUsIHNldHRpbmcgdGhlIHVwcGVyXHJcblx0ICogYm91bmQgb2YgdGhpcyBib3ggdG8gdGhlIGdyZWF0ZXIgb2YgdGhlIHR3byBib3hlcycgdXBwZXIgYm91bmRzIGFuZCB0aGVcclxuXHQgKiBsb3dlciBib3VuZCBvZiB0aGlzIGJveCB0byB0aGUgbGVzc2VyIG9mIHRoZSB0d28gYm94ZXMnIGxvd2VyIGJvdW5kcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Qm94M30gYm94IC0gVGhlIGJvdW5kaW5nIGJveCB0aGF0IHdpbGwgYmUgdW5pb25lZCB3aXRoIHRoaXMgaW5zdGFuY2UuXHJcblx0ICogQHJldHVybiB7Qm94M30gQSByZWZlcmVuY2UgdG8gdGhpcyBib3VuZGluZyBib3guXHJcblx0ICovXHJcblx0dW5pb24oIGJveCApIHtcclxuXHJcblx0XHR0aGlzLm1pbi5taW4oIGJveC5taW4gKTtcclxuXHRcdHRoaXMubWF4Lm1heCggYm94Lm1heCApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRyYW5zZm9ybXMgdGhpcyBib3VuZGluZyBib3ggYnkgdGhlIGdpdmVuIDR4NCB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDR9IG1hdHJpeCAtIFRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguXHJcblx0ICogQHJldHVybiB7Qm94M30gQSByZWZlcmVuY2UgdG8gdGhpcyBib3VuZGluZyBib3guXHJcblx0ICovXHJcblx0YXBwbHlNYXRyaXg0KCBtYXRyaXggKSB7XHJcblxyXG5cdFx0Ly8gdHJhbnNmb3JtIG9mIGVtcHR5IGJveCBpcyBhbiBlbXB0eSBib3guXHJcblx0XHRpZiAoIHRoaXMuaXNFbXB0eSgpICkgcmV0dXJuIHRoaXM7XHJcblxyXG5cdFx0Ly8gTk9URTogSSBhbSB1c2luZyBhIGJpbmFyeSBwYXR0ZXJuIHRvIHNwZWNpZnkgYWxsIDJeMyBjb21iaW5hdGlvbnMgYmVsb3dcclxuXHRcdF9wb2ludHNbIDAgXS5zZXQoIHRoaXMubWluLngsIHRoaXMubWluLnksIHRoaXMubWluLnogKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApOyAvLyAwMDBcclxuXHRcdF9wb2ludHNbIDEgXS5zZXQoIHRoaXMubWluLngsIHRoaXMubWluLnksIHRoaXMubWF4LnogKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApOyAvLyAwMDFcclxuXHRcdF9wb2ludHNbIDIgXS5zZXQoIHRoaXMubWluLngsIHRoaXMubWF4LnksIHRoaXMubWluLnogKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApOyAvLyAwMTBcclxuXHRcdF9wb2ludHNbIDMgXS5zZXQoIHRoaXMubWluLngsIHRoaXMubWF4LnksIHRoaXMubWF4LnogKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApOyAvLyAwMTFcclxuXHRcdF9wb2ludHNbIDQgXS5zZXQoIHRoaXMubWF4LngsIHRoaXMubWluLnksIHRoaXMubWluLnogKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApOyAvLyAxMDBcclxuXHRcdF9wb2ludHNbIDUgXS5zZXQoIHRoaXMubWF4LngsIHRoaXMubWluLnksIHRoaXMubWF4LnogKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApOyAvLyAxMDFcclxuXHRcdF9wb2ludHNbIDYgXS5zZXQoIHRoaXMubWF4LngsIHRoaXMubWF4LnksIHRoaXMubWluLnogKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApOyAvLyAxMTBcclxuXHRcdF9wb2ludHNbIDcgXS5zZXQoIHRoaXMubWF4LngsIHRoaXMubWF4LnksIHRoaXMubWF4LnogKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApOyAvLyAxMTFcclxuXHJcblx0XHR0aGlzLnNldEZyb21Qb2ludHMoIF9wb2ludHMgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIHRoZSBnaXZlbiBvZmZzZXQgdG8gYm90aCB0aGUgdXBwZXIgYW5kIGxvd2VyIGJvdW5kcyBvZiB0aGlzIGJvdW5kaW5nIGJveCxcclxuXHQgKiBlZmZlY3RpdmVseSBtb3ZpbmcgaXQgaW4gM0Qgc3BhY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IG9mZnNldCAtIFRoZSBvZmZzZXQgdGhhdCBzaG91bGQgYmUgdXNlZCB0byB0cmFuc2xhdGUgdGhlIGJvdW5kaW5nIGJveC5cclxuXHQgKiBAcmV0dXJuIHtCb3gzfSBBIHJlZmVyZW5jZSB0byB0aGlzIGJvdW5kaW5nIGJveC5cclxuXHQgKi9cclxuXHR0cmFuc2xhdGUoIG9mZnNldCApIHtcclxuXHJcblx0XHR0aGlzLm1pbi5hZGQoIG9mZnNldCApO1xyXG5cdFx0dGhpcy5tYXguYWRkKCBvZmZzZXQgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIGJvdW5kaW5nIGJveCBpcyBlcXVhbCB3aXRoIHRoZSBnaXZlbiBvbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0JveDN9IGJveCAtIFRoZSBib3ggdG8gdGVzdCBmb3IgZXF1YWxpdHkuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGlzIGJvdW5kaW5nIGJveCBpcyBlcXVhbCB3aXRoIHRoZSBnaXZlbiBvbmUuXHJcblx0ICovXHJcblx0ZXF1YWxzKCBib3ggKSB7XHJcblxyXG5cdFx0cmV0dXJuIGJveC5taW4uZXF1YWxzKCB0aGlzLm1pbiApICYmIGJveC5tYXguZXF1YWxzKCB0aGlzLm1heCApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5jb25zdCBfcG9pbnRzID0gW1xyXG5cdC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKSxcclxuXHQvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCksXHJcblx0LypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpLFxyXG5cdC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKSxcclxuXHQvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCksXHJcblx0LypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpLFxyXG5cdC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKSxcclxuXHQvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKClcclxuXTtcclxuXHJcbmNvbnN0IF92ZWN0b3IgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcblxyXG5jb25zdCBfYm94ID0gLypAX19QVVJFX18qLyBuZXcgQm94MygpO1xyXG5cclxuLy8gdHJpYW5nbGUgY2VudGVyZWQgdmVydGljZXNcclxuXHJcbmNvbnN0IF92MCA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX3YxID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfdjIgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcblxyXG4vLyB0cmlhbmdsZSBlZGdlIHZlY3RvcnNcclxuXHJcbmNvbnN0IF9mMCA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX2YxID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfZjIgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcblxyXG5jb25zdCBfY2VudGVyID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfZXh0ZW50cyA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX3RyaWFuZ2xlTm9ybWFsID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfdGVzdEF4aXMgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcblxyXG5mdW5jdGlvbiBzYXRGb3JBeGVzKCBheGVzLCB2MCwgdjEsIHYyLCBleHRlbnRzICkge1xyXG5cclxuXHRmb3IgKCBsZXQgaSA9IDAsIGogPSBheGVzLmxlbmd0aCAtIDM7IGkgPD0gajsgaSArPSAzICkge1xyXG5cclxuXHRcdF90ZXN0QXhpcy5mcm9tQXJyYXkoIGF4ZXMsIGkgKTtcclxuXHRcdC8vIHByb2plY3QgdGhlIGFhYmIgb250byB0aGUgc2VwYXJhdGluZyBheGlzXHJcblx0XHRjb25zdCByID0gZXh0ZW50cy54ICogTWF0aC5hYnMoIF90ZXN0QXhpcy54ICkgKyBleHRlbnRzLnkgKiBNYXRoLmFicyggX3Rlc3RBeGlzLnkgKSArIGV4dGVudHMueiAqIE1hdGguYWJzKCBfdGVzdEF4aXMueiApO1xyXG5cdFx0Ly8gcHJvamVjdCBhbGwgMyB2ZXJ0aWNlcyBvZiB0aGUgdHJpYW5nbGUgb250byB0aGUgc2VwYXJhdGluZyBheGlzXHJcblx0XHRjb25zdCBwMCA9IHYwLmRvdCggX3Rlc3RBeGlzICk7XHJcblx0XHRjb25zdCBwMSA9IHYxLmRvdCggX3Rlc3RBeGlzICk7XHJcblx0XHRjb25zdCBwMiA9IHYyLmRvdCggX3Rlc3RBeGlzICk7XHJcblx0XHQvLyBhY3R1YWwgdGVzdCwgYmFzaWNhbGx5IHNlZSBpZiBlaXRoZXIgb2YgdGhlIG1vc3QgZXh0cmVtZSBvZiB0aGUgdHJpYW5nbGUgcG9pbnRzIGludGVyc2VjdHMgclxyXG5cdFx0aWYgKCBNYXRoLm1heCggLSBNYXRoLm1heCggcDAsIHAxLCBwMiApLCBNYXRoLm1pbiggcDAsIHAxLCBwMiApICkgPiByICkge1xyXG5cclxuXHRcdFx0Ly8gcG9pbnRzIG9mIHRoZSBwcm9qZWN0ZWQgdHJpYW5nbGUgYXJlIG91dHNpZGUgdGhlIHByb2plY3RlZCBoYWxmLWxlbmd0aCBvZiB0aGUgYWFiYlxyXG5cdFx0XHQvLyB0aGUgYXhpcyBpcyBzZXBhcmF0aW5nIGFuZCB3ZSBjYW4gZXhpdFxyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiB0cnVlO1xyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgQm94MyB9O1xyXG4iLCJpbXBvcnQgeyBCb3gzIH0gZnJvbSAnLi9Cb3gzLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4vVmVjdG9yMy5qcyc7XHJcblxyXG5jb25zdCBfYm94ID0gLypAX19QVVJFX18qLyBuZXcgQm94MygpO1xyXG5jb25zdCBfdjEgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF92MiA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuXHJcbi8qKlxyXG4gKiBBbiBhbmFseXRpY2FsIDNEIHNwaGVyZSBkZWZpbmVkIGJ5IGEgY2VudGVyIGFuZCByYWRpdXMuIFRoaXMgY2xhc3MgaXMgbWFpbmx5XHJcbiAqIHVzZWQgYXMgYSBCb3VuZGluZyBTcGhlcmUgZm9yIDNEIG9iamVjdHMuXHJcbiAqL1xyXG5jbGFzcyBTcGhlcmUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHNwaGVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gW2NlbnRlcj0oMCwwLDApXSAtIFRoZSBjZW50ZXIgb2YgdGhlIHNwaGVyZVxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbcmFkaXVzPS0xXSAtIFRoZSByYWRpdXMgb2YgdGhlIHNwaGVyZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggY2VudGVyID0gbmV3IFZlY3RvcjMoKSwgcmFkaXVzID0gLSAxICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1NwaGVyZSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY2VudGVyIG9mIHRoZSBzcGhlcmVcclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yM31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jZW50ZXIgPSBjZW50ZXI7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcmFkaXVzIG9mIHRoZSBzcGhlcmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yYWRpdXMgPSByYWRpdXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgc3BoZXJlJ3MgY29tcG9uZW50cyBieSBjb3B5aW5nIHRoZSBnaXZlbiB2YWx1ZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IGNlbnRlciAtIFRoZSBjZW50ZXIuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHJhZGl1cyAtIFRoZSByYWRpdXMuXHJcblx0ICogQHJldHVybiB7U3BoZXJlfSBBIHJlZmVyZW5jZSB0byB0aGlzIHNwaGVyZS5cclxuXHQgKi9cclxuXHRzZXQoIGNlbnRlciwgcmFkaXVzICkge1xyXG5cclxuXHRcdHRoaXMuY2VudGVyLmNvcHkoIGNlbnRlciApO1xyXG5cdFx0dGhpcy5yYWRpdXMgPSByYWRpdXM7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgdGhlIG1pbmltdW0gYm91bmRpbmcgc3BoZXJlIGZvciBsaXN0IG9mIHBvaW50cy5cclxuXHQgKiBJZiB0aGUgb3B0aW9uYWwgY2VudGVyIHBvaW50IGlzIGdpdmVuLCBpdCBpcyB1c2VkIGFzIHRoZSBzcGhlcmUnc1xyXG5cdCAqIGNlbnRlci4gT3RoZXJ3aXNlLCB0aGUgY2VudGVyIG9mIHRoZSBheGlzLWFsaWduZWQgYm91bmRpbmcgYm94XHJcblx0ICogZW5jb21wYXNzaW5nIHRoZSBwb2ludHMgaXMgY2FsY3VsYXRlZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8VmVjdG9yMz59IHBvaW50cyAtIEEgbGlzdCBvZiBwb2ludHMgaW4gM0Qgc3BhY2UuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBbb3B0aW9uYWxDZW50ZXJdIC0gVGhlIGNlbnRlciBvZiB0aGUgc3BoZXJlLlxyXG5cdCAqIEByZXR1cm4ge1NwaGVyZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBzcGhlcmUuXHJcblx0ICovXHJcblx0c2V0RnJvbVBvaW50cyggcG9pbnRzLCBvcHRpb25hbENlbnRlciApIHtcclxuXHJcblx0XHRjb25zdCBjZW50ZXIgPSB0aGlzLmNlbnRlcjtcclxuXHJcblx0XHRpZiAoIG9wdGlvbmFsQ2VudGVyICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRjZW50ZXIuY29weSggb3B0aW9uYWxDZW50ZXIgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0X2JveC5zZXRGcm9tUG9pbnRzKCBwb2ludHMgKS5nZXRDZW50ZXIoIGNlbnRlciApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRsZXQgbWF4UmFkaXVzU3EgPSAwO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBwb2ludHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRtYXhSYWRpdXNTcSA9IE1hdGgubWF4KCBtYXhSYWRpdXNTcSwgY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKCBwb2ludHNbIGkgXSApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMucmFkaXVzID0gTWF0aC5zcXJ0KCBtYXhSYWRpdXNTcSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvcGllcyB0aGUgdmFsdWVzIG9mIHRoZSBnaXZlbiBzcGhlcmUgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7U3BoZXJlfSBzcGhlcmUgLSBUaGUgc3BoZXJlIHRvIGNvcHkuXHJcblx0ICogQHJldHVybiB7U3BoZXJlfSBBIHJlZmVyZW5jZSB0byB0aGlzIHNwaGVyZS5cclxuXHQgKi9cclxuXHRjb3B5KCBzcGhlcmUgKSB7XHJcblxyXG5cdFx0dGhpcy5jZW50ZXIuY29weSggc3BoZXJlLmNlbnRlciApO1xyXG5cdFx0dGhpcy5yYWRpdXMgPSBzcGhlcmUucmFkaXVzO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBzcGhlcmUgaXMgZW1wdHkgKHRoZSByYWRpdXMgc2V0IHRvIGEgbmVnYXRpdmUgbnVtYmVyKS5cclxuXHQgKlxyXG5cdCAqIFNwaGVyZXMgd2l0aCBhIHJhZGl1cyBvZiBgMGAgY29udGFpbiBvbmx5IHRoZWlyIGNlbnRlciBwb2ludCBhbmQgYXJlIG5vdFxyXG5cdCAqIGNvbnNpZGVyZWQgdG8gYmUgZW1wdHkuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoaXMgc3BoZXJlIGlzIGVtcHR5IG9yIG5vdC5cclxuXHQgKi9cclxuXHRpc0VtcHR5KCkge1xyXG5cclxuXHRcdHJldHVybiAoIHRoaXMucmFkaXVzIDwgMCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE1ha2VzIHRoaXMgc3BoZXJlIGVtcHR5IHdoaWNoIG1lYW5zIGluIGVuY2xvc2VzIGEgemVybyBzcGFjZSBpbiAzRC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1NwaGVyZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBzcGhlcmUuXHJcblx0ICovXHJcblx0bWFrZUVtcHR5KCkge1xyXG5cclxuXHRcdHRoaXMuY2VudGVyLnNldCggMCwgMCwgMCApO1xyXG5cdFx0dGhpcy5yYWRpdXMgPSAtIDE7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBzcGhlcmUgY29udGFpbnMgdGhlIGdpdmVuIHBvaW50IGluY2x1c2l2ZSBvZlxyXG5cdCAqIHRoZSBzdXJmYWNlIG9mIHRoZSBzcGhlcmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHBvaW50IC0gVGhlIHBvaW50IHRvIGNoZWNrLlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyBzcGhlcmUgY29udGFpbnMgdGhlIGdpdmVuIHBvaW50IG9yIG5vdC5cclxuXHQgKi9cclxuXHRjb250YWluc1BvaW50KCBwb2ludCApIHtcclxuXHJcblx0XHRyZXR1cm4gKCBwb2ludC5kaXN0YW5jZVRvU3F1YXJlZCggdGhpcy5jZW50ZXIgKSA8PSAoIHRoaXMucmFkaXVzICogdGhpcy5yYWRpdXMgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGNsb3Nlc3QgZGlzdGFuY2UgZnJvbSB0aGUgYm91bmRhcnkgb2YgdGhlIHNwaGVyZSB0byB0aGVcclxuXHQgKiBnaXZlbiBwb2ludC4gSWYgdGhlIHNwaGVyZSBjb250YWlucyB0aGUgcG9pbnQsIHRoZSBkaXN0YW5jZSB3aWxsXHJcblx0ICogYmUgbmVnYXRpdmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHBvaW50IC0gVGhlIHBvaW50IHRvIGNvbXB1dGUgdGhlIGRpc3RhbmNlIHRvLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGRpc3RhbmNlIHRvIHRoZSBwb2ludC5cclxuXHQgKi9cclxuXHRkaXN0YW5jZVRvUG9pbnQoIHBvaW50ICkge1xyXG5cclxuXHRcdHJldHVybiAoIHBvaW50LmRpc3RhbmNlVG8oIHRoaXMuY2VudGVyICkgLSB0aGlzLnJhZGl1cyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgc3BoZXJlIGludGVyc2VjdHMgd2l0aCB0aGUgZ2l2ZW4gb25lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTcGhlcmV9IHNwaGVyZSAtIFRoZSBzcGhlcmUgdG8gdGVzdC5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoaXMgc3BoZXJlIGludGVyc2VjdHMgd2l0aCB0aGUgZ2l2ZW4gb25lIG9yIG5vdC5cclxuXHQgKi9cclxuXHRpbnRlcnNlY3RzU3BoZXJlKCBzcGhlcmUgKSB7XHJcblxyXG5cdFx0Y29uc3QgcmFkaXVzU3VtID0gdGhpcy5yYWRpdXMgKyBzcGhlcmUucmFkaXVzO1xyXG5cclxuXHRcdHJldHVybiBzcGhlcmUuY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKCB0aGlzLmNlbnRlciApIDw9ICggcmFkaXVzU3VtICogcmFkaXVzU3VtICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBzcGhlcmUgaW50ZXJzZWN0cyB3aXRoIHRoZSBnaXZlbiBib3guXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0JveDN9IGJveCAtIFRoZSBib3ggdG8gdGVzdC5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoaXMgc3BoZXJlIGludGVyc2VjdHMgd2l0aCB0aGUgZ2l2ZW4gYm94IG9yIG5vdC5cclxuXHQgKi9cclxuXHRpbnRlcnNlY3RzQm94KCBib3ggKSB7XHJcblxyXG5cdFx0cmV0dXJuIGJveC5pbnRlcnNlY3RzU3BoZXJlKCB0aGlzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBzcGhlcmUgaW50ZXJzZWN0cyB3aXRoIHRoZSBnaXZlbiBwbGFuZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UGxhbmV9IHBsYW5lIC0gVGhlIHBsYW5lIHRvIHRlc3QuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGlzIHNwaGVyZSBpbnRlcnNlY3RzIHdpdGggdGhlIGdpdmVuIHBsYW5lIG9yIG5vdC5cclxuXHQgKi9cclxuXHRpbnRlcnNlY3RzUGxhbmUoIHBsYW5lICkge1xyXG5cclxuXHRcdHJldHVybiBNYXRoLmFicyggcGxhbmUuZGlzdGFuY2VUb1BvaW50KCB0aGlzLmNlbnRlciApICkgPD0gdGhpcy5yYWRpdXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2xhbXBzIGEgcG9pbnQgd2l0aGluIHRoZSBzcGhlcmUuIElmIHRoZSBwb2ludCBpcyBvdXRzaWRlIHRoZSBzcGhlcmUsIGl0XHJcblx0ICogd2lsbCBjbGFtcCBpdCB0byB0aGUgY2xvc2VzdCBwb2ludCBvbiB0aGUgZWRnZSBvZiB0aGUgc3BoZXJlLiBQb2ludHNcclxuXHQgKiBhbHJlYWR5IGluc2lkZSB0aGUgc3BoZXJlIHdpbGwgbm90IGJlIGFmZmVjdGVkLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBwb2ludCAtIFRoZSBwbGFuZSB0byBjbGFtcC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHRhcmdldCAtIFRoZSB0YXJnZXQgdmVjdG9yIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbWV0aG9kJ3MgcmVzdWx0LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IFRoZSBjbGFtcGVkIHBvaW50LlxyXG5cdCAqL1xyXG5cdGNsYW1wUG9pbnQoIHBvaW50LCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0Y29uc3QgZGVsdGFMZW5ndGhTcSA9IHRoaXMuY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKCBwb2ludCApO1xyXG5cclxuXHRcdHRhcmdldC5jb3B5KCBwb2ludCApO1xyXG5cclxuXHRcdGlmICggZGVsdGFMZW5ndGhTcSA+ICggdGhpcy5yYWRpdXMgKiB0aGlzLnJhZGl1cyApICkge1xyXG5cclxuXHRcdFx0dGFyZ2V0LnN1YiggdGhpcy5jZW50ZXIgKS5ub3JtYWxpemUoKTtcclxuXHRcdFx0dGFyZ2V0Lm11bHRpcGx5U2NhbGFyKCB0aGlzLnJhZGl1cyApLmFkZCggdGhpcy5jZW50ZXIgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRhcmdldDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgYm91bmRpbmcgYm94IHRoYXQgZW5jbG9zZXMgdGhpcyBzcGhlcmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0JveDN9IHRhcmdldCAtIFRoZSB0YXJnZXQgYm94IHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbWV0aG9kJ3MgcmVzdWx0LlxyXG5cdCAqIEByZXR1cm4ge0JveDN9IFRoZSBib3VuZGluZyBib3ggdGhhdCBlbmNsb3NlcyB0aGlzIHNwaGVyZS5cclxuXHQgKi9cclxuXHRnZXRCb3VuZGluZ0JveCggdGFyZ2V0ICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5pc0VtcHR5KCkgKSB7XHJcblxyXG5cdFx0XHQvLyBFbXB0eSBzcGhlcmUgcHJvZHVjZXMgZW1wdHkgYm91bmRpbmcgYm94XHJcblx0XHRcdHRhcmdldC5tYWtlRW1wdHkoKTtcclxuXHRcdFx0cmV0dXJuIHRhcmdldDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGFyZ2V0LnNldCggdGhpcy5jZW50ZXIsIHRoaXMuY2VudGVyICk7XHJcblx0XHR0YXJnZXQuZXhwYW5kQnlTY2FsYXIoIHRoaXMucmFkaXVzICk7XHJcblxyXG5cdFx0cmV0dXJuIHRhcmdldDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUcmFuc2Zvcm1zIHRoaXMgc3BoZXJlIHdpdGggdGhlIGdpdmVuIDR4NCB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDR9IG1hdHJpeCAtIFRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguXHJcblx0ICogQHJldHVybiB7U3BoZXJlfSBBIHJlZmVyZW5jZSB0byB0aGlzIHNwaGVyZS5cclxuXHQgKi9cclxuXHRhcHBseU1hdHJpeDQoIG1hdHJpeCApIHtcclxuXHJcblx0XHR0aGlzLmNlbnRlci5hcHBseU1hdHJpeDQoIG1hdHJpeCApO1xyXG5cdFx0dGhpcy5yYWRpdXMgPSB0aGlzLnJhZGl1cyAqIG1hdHJpeC5nZXRNYXhTY2FsZU9uQXhpcygpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRyYW5zbGF0ZXMgdGhlIHNwaGVyZSdzIGNlbnRlciBieSB0aGUgZ2l2ZW4gb2Zmc2V0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBvZmZzZXQgLSBUaGUgb2Zmc2V0LlxyXG5cdCAqIEByZXR1cm4ge1NwaGVyZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBzcGhlcmUuXHJcblx0ICovXHJcblx0dHJhbnNsYXRlKCBvZmZzZXQgKSB7XHJcblxyXG5cdFx0dGhpcy5jZW50ZXIuYWRkKCBvZmZzZXQgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFeHBhbmRzIHRoZSBib3VuZGFyaWVzIG9mIHRoaXMgc3BoZXJlIHRvIGluY2x1ZGUgdGhlIGdpdmVuIHBvaW50LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBwb2ludCAtIFRoZSBwb2ludCB0byBpbmNsdWRlLlxyXG5cdCAqIEByZXR1cm4ge1NwaGVyZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBzcGhlcmUuXHJcblx0ICovXHJcblx0ZXhwYW5kQnlQb2ludCggcG9pbnQgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmlzRW1wdHkoKSApIHtcclxuXHJcblx0XHRcdHRoaXMuY2VudGVyLmNvcHkoIHBvaW50ICk7XHJcblxyXG5cdFx0XHR0aGlzLnJhZGl1cyA9IDA7XHJcblxyXG5cdFx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0X3YxLnN1YlZlY3RvcnMoIHBvaW50LCB0aGlzLmNlbnRlciApO1xyXG5cclxuXHRcdGNvbnN0IGxlbmd0aFNxID0gX3YxLmxlbmd0aFNxKCk7XHJcblxyXG5cdFx0aWYgKCBsZW5ndGhTcSA+ICggdGhpcy5yYWRpdXMgKiB0aGlzLnJhZGl1cyApICkge1xyXG5cclxuXHRcdFx0Ly8gY2FsY3VsYXRlIHRoZSBtaW5pbWFsIHNwaGVyZVxyXG5cclxuXHRcdFx0Y29uc3QgbGVuZ3RoID0gTWF0aC5zcXJ0KCBsZW5ndGhTcSApO1xyXG5cclxuXHRcdFx0Y29uc3QgZGVsdGEgPSAoIGxlbmd0aCAtIHRoaXMucmFkaXVzICkgKiAwLjU7XHJcblxyXG5cdFx0XHR0aGlzLmNlbnRlci5hZGRTY2FsZWRWZWN0b3IoIF92MSwgZGVsdGEgLyBsZW5ndGggKTtcclxuXHJcblx0XHRcdHRoaXMucmFkaXVzICs9IGRlbHRhO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFeHBhbmRzIHRoaXMgc3BoZXJlIHRvIGVuY2xvc2UgYm90aCB0aGUgb3JpZ2luYWwgc3BoZXJlIGFuZCB0aGUgZ2l2ZW4gc3BoZXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTcGhlcmV9IHNwaGVyZSAtIFRoZSBzcGhlcmUgdG8gaW5jbHVkZS5cclxuXHQgKiBAcmV0dXJuIHtTcGhlcmV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgc3BoZXJlLlxyXG5cdCAqL1xyXG5cdHVuaW9uKCBzcGhlcmUgKSB7XHJcblxyXG5cdFx0aWYgKCBzcGhlcmUuaXNFbXB0eSgpICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy5pc0VtcHR5KCkgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmNvcHkoIHNwaGVyZSApO1xyXG5cclxuXHRcdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy5jZW50ZXIuZXF1YWxzKCBzcGhlcmUuY2VudGVyICkgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHQgdGhpcy5yYWRpdXMgPSBNYXRoLm1heCggdGhpcy5yYWRpdXMsIHNwaGVyZS5yYWRpdXMgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0X3YyLnN1YlZlY3RvcnMoIHNwaGVyZS5jZW50ZXIsIHRoaXMuY2VudGVyICkuc2V0TGVuZ3RoKCBzcGhlcmUucmFkaXVzICk7XHJcblxyXG5cdFx0XHR0aGlzLmV4cGFuZEJ5UG9pbnQoIF92MS5jb3B5KCBzcGhlcmUuY2VudGVyICkuYWRkKCBfdjIgKSApO1xyXG5cclxuXHRcdFx0dGhpcy5leHBhbmRCeVBvaW50KCBfdjEuY29weSggc3BoZXJlLmNlbnRlciApLnN1YiggX3YyICkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBzcGhlcmUgaXMgZXF1YWwgd2l0aCB0aGUgZ2l2ZW4gb25lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTcGhlcmV9IHNwaGVyZSAtIFRoZSBzcGhlcmUgdG8gdGVzdCBmb3IgZXF1YWxpdHkuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGlzIGJvdW5kaW5nIHNwaGVyZSBpcyBlcXVhbCB3aXRoIHRoZSBnaXZlbiBvbmUuXHJcblx0ICovXHJcblx0ZXF1YWxzKCBzcGhlcmUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHNwaGVyZS5jZW50ZXIuZXF1YWxzKCB0aGlzLmNlbnRlciApICYmICggc3BoZXJlLnJhZGl1cyA9PT0gdGhpcy5yYWRpdXMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbmV3IHNwaGVyZSB3aXRoIGNvcGllZCB2YWx1ZXMgZnJvbSB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7U3BoZXJlfSBBIGNsb25lIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y2xvbmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBTcGhlcmUgfTtcclxuIiwiaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4vVmVjdG9yMy5qcyc7XHJcblxyXG5jb25zdCBfdmVjdG9yID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfc2VnQ2VudGVyID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfc2VnRGlyID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfZGlmZiA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuXHJcbmNvbnN0IF9lZGdlMSA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX2VkZ2UyID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfbm9ybWFsID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5cclxuLyoqXHJcbiAqIEEgcmF5IHRoYXQgZW1pdHMgZnJvbSBhbiBvcmlnaW4gaW4gYSBjZXJ0YWluIGRpcmVjdGlvbi4gVGhlIGNsYXNzIGlzIHVzZWQgYnlcclxuICoge0BsaW5rIFJheWNhc3Rlcn0gdG8gYXNzaXN0IHdpdGggcmF5Y2FzdGluZy4gUmF5Y2FzdGluZyBpcyB1c2VkIGZvclxyXG4gKiBtb3VzZSBwaWNraW5nICh3b3JraW5nIG91dCB3aGF0IG9iamVjdHMgaW4gdGhlIDNEIHNwYWNlIHRoZSBtb3VzZSBpcyBvdmVyKVxyXG4gKiBhbW9uZ3N0IG90aGVyIHRoaW5ncy5cclxuICovXHJcbmNsYXNzIFJheSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcmF5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBbb3JpZ2luPSgwLDAsMCldIC0gVGhlIG9yaWdpbiBvZiB0aGUgcmF5LlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gW2RpcmVjdGlvbj0oMCwwLC0xKV0gLSBUaGUgKG5vcm1hbGl6ZWQpIGRpcmVjdGlvbiBvZiB0aGUgcmF5LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBvcmlnaW4gPSBuZXcgVmVjdG9yMygpLCBkaXJlY3Rpb24gPSBuZXcgVmVjdG9yMyggMCwgMCwgLSAxICkgKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgb3JpZ2luIG9mIHRoZSByYXkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjN9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMub3JpZ2luID0gb3JpZ2luO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIChub3JtYWxpemVkKSBkaXJlY3Rpb24gb2YgdGhlIHJheS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yM31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kaXJlY3Rpb24gPSBkaXJlY3Rpb247XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgcmF5J3MgY29tcG9uZW50cyBieSBjb3B5aW5nIHRoZSBnaXZlbiB2YWx1ZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IG9yaWdpbiAtIFRoZSBvcmlnaW4uXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBkaXJlY3Rpb24gLSBUaGUgZGlyZWN0aW9uLlxyXG5cdCAqIEByZXR1cm4ge1JheX0gQSByZWZlcmVuY2UgdG8gdGhpcyByYXkuXHJcblx0ICovXHJcblx0c2V0KCBvcmlnaW4sIGRpcmVjdGlvbiApIHtcclxuXHJcblx0XHR0aGlzLm9yaWdpbi5jb3B5KCBvcmlnaW4gKTtcclxuXHRcdHRoaXMuZGlyZWN0aW9uLmNvcHkoIGRpcmVjdGlvbiApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvcGllcyB0aGUgdmFsdWVzIG9mIHRoZSBnaXZlbiByYXkgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmF5fSByYXkgLSBUaGUgcmF5IHRvIGNvcHkuXHJcblx0ICogQHJldHVybiB7UmF5fSBBIHJlZmVyZW5jZSB0byB0aGlzIHJheS5cclxuXHQgKi9cclxuXHRjb3B5KCByYXkgKSB7XHJcblxyXG5cdFx0dGhpcy5vcmlnaW4uY29weSggcmF5Lm9yaWdpbiApO1xyXG5cdFx0dGhpcy5kaXJlY3Rpb24uY29weSggcmF5LmRpcmVjdGlvbiApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSB2ZWN0b3IgdGhhdCBpcyBsb2NhdGVkIGF0IGEgZ2l2ZW4gZGlzdGFuY2UgYWxvbmcgdGhpcyByYXkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdCAtIFRoZSBkaXN0YW5jZSBhbG9uZyB0aGUgcmF5IHRvIHJldHJpZXZlIGEgcG9zaXRpb24gZm9yLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdGFyZ2V0IC0gVGhlIHRhcmdldCB2ZWN0b3IgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBtZXRob2QncyByZXN1bHQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gQSBwb3NpdGlvbiBvbiB0aGUgcmF5LlxyXG5cdCAqL1xyXG5cdGF0KCB0LCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRhcmdldC5jb3B5KCB0aGlzLm9yaWdpbiApLmFkZFNjYWxlZFZlY3RvciggdGhpcy5kaXJlY3Rpb24sIHQgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGp1c3RzIHRoZSBkaXJlY3Rpb24gb2YgdGhlIHJheSB0byBwb2ludCBhdCB0aGUgZ2l2ZW4gdmVjdG9yIGluIHdvcmxkIHNwYWNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB2IC0gVGhlIHRhcmdldCBwb3NpdGlvbi5cclxuXHQgKiBAcmV0dXJuIHtSYXl9IEEgcmVmZXJlbmNlIHRvIHRoaXMgcmF5LlxyXG5cdCAqL1xyXG5cdGxvb2tBdCggdiApIHtcclxuXHJcblx0XHR0aGlzLmRpcmVjdGlvbi5jb3B5KCB2ICkuc3ViKCB0aGlzLm9yaWdpbiApLm5vcm1hbGl6ZSgpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNoaWZ0IHRoZSBvcmlnaW4gb2YgdGhpcyByYXkgYWxvbmcgaXRzIGRpcmVjdGlvbiBieSB0aGUgZ2l2ZW4gZGlzdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdCAtIFRoZSBkaXN0YW5jZSBhbG9uZyB0aGUgcmF5IHRvIGludGVycG9sYXRlLlxyXG5cdCAqIEByZXR1cm4ge1JheX0gQSByZWZlcmVuY2UgdG8gdGhpcyByYXkuXHJcblx0ICovXHJcblx0cmVjYXN0KCB0ICkge1xyXG5cclxuXHRcdHRoaXMub3JpZ2luLmNvcHkoIHRoaXMuYXQoIHQsIF92ZWN0b3IgKSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHBvaW50IGFsb25nIHRoaXMgcmF5IHRoYXQgaXMgY2xvc2VzdCB0byB0aGUgZ2l2ZW4gcG9pbnQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHBvaW50IC0gQSBwb2ludCBpbiAzRCBzcGFjZSB0byBnZXQgdGhlIGNsb3NldCBsb2NhdGlvbiBvbiB0aGUgcmF5IGZvci5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHRhcmdldCAtIFRoZSB0YXJnZXQgdmVjdG9yIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbWV0aG9kJ3MgcmVzdWx0LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IFRoZSBjbG9zZXN0IHBvaW50IG9uIHRoaXMgcmF5LlxyXG5cdCAqL1xyXG5cdGNsb3Nlc3RQb2ludFRvUG9pbnQoIHBvaW50LCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0dGFyZ2V0LnN1YlZlY3RvcnMoIHBvaW50LCB0aGlzLm9yaWdpbiApO1xyXG5cclxuXHRcdGNvbnN0IGRpcmVjdGlvbkRpc3RhbmNlID0gdGFyZ2V0LmRvdCggdGhpcy5kaXJlY3Rpb24gKTtcclxuXHJcblx0XHRpZiAoIGRpcmVjdGlvbkRpc3RhbmNlIDwgMCApIHtcclxuXHJcblx0XHRcdHJldHVybiB0YXJnZXQuY29weSggdGhpcy5vcmlnaW4gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRhcmdldC5jb3B5KCB0aGlzLm9yaWdpbiApLmFkZFNjYWxlZFZlY3RvciggdGhpcy5kaXJlY3Rpb24sIGRpcmVjdGlvbkRpc3RhbmNlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgZGlzdGFuY2Ugb2YgdGhlIGNsb3Nlc3QgYXBwcm9hY2ggYmV0d2VlbiB0aGlzIHJheSBhbmQgdGhlIGdpdmVuIHBvaW50LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBwb2ludCAtIEEgcG9pbnQgaW4gM0Qgc3BhY2UgdG8gY29tcHV0ZSB0aGUgZGlzdGFuY2UgdG8uXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgZGlzdGFuY2UuXHJcblx0ICovXHJcblx0ZGlzdGFuY2VUb1BvaW50KCBwb2ludCApIHtcclxuXHJcblx0XHRyZXR1cm4gTWF0aC5zcXJ0KCB0aGlzLmRpc3RhbmNlU3FUb1BvaW50KCBwb2ludCApICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgc3F1YXJlZCBkaXN0YW5jZSBvZiB0aGUgY2xvc2VzdCBhcHByb2FjaCBiZXR3ZWVuIHRoaXMgcmF5IGFuZCB0aGUgZ2l2ZW4gcG9pbnQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHBvaW50IC0gQSBwb2ludCBpbiAzRCBzcGFjZSB0byBjb21wdXRlIHRoZSBkaXN0YW5jZSB0by5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBzcXVhcmVkIGRpc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGRpc3RhbmNlU3FUb1BvaW50KCBwb2ludCApIHtcclxuXHJcblx0XHRjb25zdCBkaXJlY3Rpb25EaXN0YW5jZSA9IF92ZWN0b3Iuc3ViVmVjdG9ycyggcG9pbnQsIHRoaXMub3JpZ2luICkuZG90KCB0aGlzLmRpcmVjdGlvbiApO1xyXG5cclxuXHRcdC8vIHBvaW50IGJlaGluZCB0aGUgcmF5XHJcblxyXG5cdFx0aWYgKCBkaXJlY3Rpb25EaXN0YW5jZSA8IDAgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gdGhpcy5vcmlnaW4uZGlzdGFuY2VUb1NxdWFyZWQoIHBvaW50ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdF92ZWN0b3IuY29weSggdGhpcy5vcmlnaW4gKS5hZGRTY2FsZWRWZWN0b3IoIHRoaXMuZGlyZWN0aW9uLCBkaXJlY3Rpb25EaXN0YW5jZSApO1xyXG5cclxuXHRcdHJldHVybiBfdmVjdG9yLmRpc3RhbmNlVG9TcXVhcmVkKCBwb2ludCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHNxdWFyZWQgZGlzdGFuY2UgYmV0d2VlbiB0aGlzIHJheSBhbmQgdGhlIGdpdmVuIGxpbmUgc2VnbWVudC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdjAgLSBUaGUgc3RhcnQgcG9pbnQgb2YgdGhlIGxpbmUgc2VnbWVudC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHYxIC0gVGhlIGVuZCBwb2ludCBvZiB0aGUgbGluZSBzZWdtZW50LlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gW29wdGlvbmFsUG9pbnRPblJheV0gLSBXaGVuIHByb3ZpZGVkLCBpdCByZWNlaXZlcyB0aGUgcG9pbnQgb24gdGhpcyByYXkgdGhhdCBpcyBjbG9zZXN0IHRvIHRoZSBzZWdtZW50LlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gW29wdGlvbmFsUG9pbnRPblNlZ21lbnRdIC0gV2hlbiBwcm92aWRlZCwgaXQgcmVjZWl2ZXMgdGhlIHBvaW50IG9uIHRoZSBsaW5lIHNlZ21lbnQgdGhhdCBpcyBjbG9zZXN0IHRvIHRoaXMgcmF5LlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIHNxdWFyZWQgZGlzdGFuY2UuXHJcblx0ICovXHJcblx0ZGlzdGFuY2VTcVRvU2VnbWVudCggdjAsIHYxLCBvcHRpb25hbFBvaW50T25SYXksIG9wdGlvbmFsUG9pbnRPblNlZ21lbnQgKSB7XHJcblxyXG5cdFx0Ly8gZnJvbSBodHRwczovL2dpdGh1Yi5jb20vcG1qb25pYWsvR2VvbWV0cmljVG9vbHMvYmxvYi9tYXN0ZXIvR1RFbmdpbmUvSW5jbHVkZS9NYXRoZW1hdGljcy9HdGVEaXN0UmF5U2VnbWVudC5oXHJcblx0XHQvLyBJdCByZXR1cm5zIHRoZSBtaW4gZGlzdGFuY2UgYmV0d2VlbiB0aGUgcmF5IGFuZCB0aGUgc2VnbWVudFxyXG5cdFx0Ly8gZGVmaW5lZCBieSB2MCBhbmQgdjFcclxuXHRcdC8vIEl0IGNhbiBhbHNvIHNldCB0d28gb3B0aW9uYWwgdGFyZ2V0cyA6XHJcblx0XHQvLyAtIFRoZSBjbG9zZXN0IHBvaW50IG9uIHRoZSByYXlcclxuXHRcdC8vIC0gVGhlIGNsb3Nlc3QgcG9pbnQgb24gdGhlIHNlZ21lbnRcclxuXHJcblx0XHRfc2VnQ2VudGVyLmNvcHkoIHYwICkuYWRkKCB2MSApLm11bHRpcGx5U2NhbGFyKCAwLjUgKTtcclxuXHRcdF9zZWdEaXIuY29weSggdjEgKS5zdWIoIHYwICkubm9ybWFsaXplKCk7XHJcblx0XHRfZGlmZi5jb3B5KCB0aGlzLm9yaWdpbiApLnN1YiggX3NlZ0NlbnRlciApO1xyXG5cclxuXHRcdGNvbnN0IHNlZ0V4dGVudCA9IHYwLmRpc3RhbmNlVG8oIHYxICkgKiAwLjU7XHJcblx0XHRjb25zdCBhMDEgPSAtIHRoaXMuZGlyZWN0aW9uLmRvdCggX3NlZ0RpciApO1xyXG5cdFx0Y29uc3QgYjAgPSBfZGlmZi5kb3QoIHRoaXMuZGlyZWN0aW9uICk7XHJcblx0XHRjb25zdCBiMSA9IC0gX2RpZmYuZG90KCBfc2VnRGlyICk7XHJcblx0XHRjb25zdCBjID0gX2RpZmYubGVuZ3RoU3EoKTtcclxuXHRcdGNvbnN0IGRldCA9IE1hdGguYWJzKCAxIC0gYTAxICogYTAxICk7XHJcblx0XHRsZXQgczAsIHMxLCBzcXJEaXN0LCBleHREZXQ7XHJcblxyXG5cdFx0aWYgKCBkZXQgPiAwICkge1xyXG5cclxuXHRcdFx0Ly8gVGhlIHJheSBhbmQgc2VnbWVudCBhcmUgbm90IHBhcmFsbGVsLlxyXG5cclxuXHRcdFx0czAgPSBhMDEgKiBiMSAtIGIwO1xyXG5cdFx0XHRzMSA9IGEwMSAqIGIwIC0gYjE7XHJcblx0XHRcdGV4dERldCA9IHNlZ0V4dGVudCAqIGRldDtcclxuXHJcblx0XHRcdGlmICggczAgPj0gMCApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBzMSA+PSAtIGV4dERldCApIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIHMxIDw9IGV4dERldCApIHtcclxuXHJcblx0XHRcdFx0XHRcdC8vIHJlZ2lvbiAwXHJcblx0XHRcdFx0XHRcdC8vIE1pbmltdW0gYXQgaW50ZXJpb3IgcG9pbnRzIG9mIHJheSBhbmQgc2VnbWVudC5cclxuXHJcblx0XHRcdFx0XHRcdGNvbnN0IGludkRldCA9IDEgLyBkZXQ7XHJcblx0XHRcdFx0XHRcdHMwICo9IGludkRldDtcclxuXHRcdFx0XHRcdFx0czEgKj0gaW52RGV0O1xyXG5cdFx0XHRcdFx0XHRzcXJEaXN0ID0gczAgKiAoIHMwICsgYTAxICogczEgKyAyICogYjAgKSArIHMxICogKCBhMDEgKiBzMCArIHMxICsgMiAqIGIxICkgKyBjO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHQvLyByZWdpb24gMVxyXG5cclxuXHRcdFx0XHRcdFx0czEgPSBzZWdFeHRlbnQ7XHJcblx0XHRcdFx0XHRcdHMwID0gTWF0aC5tYXgoIDAsIC0gKCBhMDEgKiBzMSArIGIwICkgKTtcclxuXHRcdFx0XHRcdFx0c3FyRGlzdCA9IC0gczAgKiBzMCArIHMxICogKCBzMSArIDIgKiBiMSApICsgYztcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gcmVnaW9uIDVcclxuXHJcblx0XHRcdFx0XHRzMSA9IC0gc2VnRXh0ZW50O1xyXG5cdFx0XHRcdFx0czAgPSBNYXRoLm1heCggMCwgLSAoIGEwMSAqIHMxICsgYjAgKSApO1xyXG5cdFx0XHRcdFx0c3FyRGlzdCA9IC0gczAgKiBzMCArIHMxICogKCBzMSArIDIgKiBiMSApICsgYztcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0aWYgKCBzMSA8PSAtIGV4dERldCApIHtcclxuXHJcblx0XHRcdFx0XHQvLyByZWdpb24gNFxyXG5cclxuXHRcdFx0XHRcdHMwID0gTWF0aC5tYXgoIDAsIC0gKCAtIGEwMSAqIHNlZ0V4dGVudCArIGIwICkgKTtcclxuXHRcdFx0XHRcdHMxID0gKCBzMCA+IDAgKSA/IC0gc2VnRXh0ZW50IDogTWF0aC5taW4oIE1hdGgubWF4KCAtIHNlZ0V4dGVudCwgLSBiMSApLCBzZWdFeHRlbnQgKTtcclxuXHRcdFx0XHRcdHNxckRpc3QgPSAtIHMwICogczAgKyBzMSAqICggczEgKyAyICogYjEgKSArIGM7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIHMxIDw9IGV4dERldCApIHtcclxuXHJcblx0XHRcdFx0XHQvLyByZWdpb24gM1xyXG5cclxuXHRcdFx0XHRcdHMwID0gMDtcclxuXHRcdFx0XHRcdHMxID0gTWF0aC5taW4oIE1hdGgubWF4KCAtIHNlZ0V4dGVudCwgLSBiMSApLCBzZWdFeHRlbnQgKTtcclxuXHRcdFx0XHRcdHNxckRpc3QgPSBzMSAqICggczEgKyAyICogYjEgKSArIGM7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gcmVnaW9uIDJcclxuXHJcblx0XHRcdFx0XHRzMCA9IE1hdGgubWF4KCAwLCAtICggYTAxICogc2VnRXh0ZW50ICsgYjAgKSApO1xyXG5cdFx0XHRcdFx0czEgPSAoIHMwID4gMCApID8gc2VnRXh0ZW50IDogTWF0aC5taW4oIE1hdGgubWF4KCAtIHNlZ0V4dGVudCwgLSBiMSApLCBzZWdFeHRlbnQgKTtcclxuXHRcdFx0XHRcdHNxckRpc3QgPSAtIHMwICogczAgKyBzMSAqICggczEgKyAyICogYjEgKSArIGM7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Ly8gUmF5IGFuZCBzZWdtZW50IGFyZSBwYXJhbGxlbC5cclxuXHJcblx0XHRcdHMxID0gKCBhMDEgPiAwICkgPyAtIHNlZ0V4dGVudCA6IHNlZ0V4dGVudDtcclxuXHRcdFx0czAgPSBNYXRoLm1heCggMCwgLSAoIGEwMSAqIHMxICsgYjAgKSApO1xyXG5cdFx0XHRzcXJEaXN0ID0gLSBzMCAqIHMwICsgczEgKiAoIHMxICsgMiAqIGIxICkgKyBjO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIG9wdGlvbmFsUG9pbnRPblJheSApIHtcclxuXHJcblx0XHRcdG9wdGlvbmFsUG9pbnRPblJheS5jb3B5KCB0aGlzLm9yaWdpbiApLmFkZFNjYWxlZFZlY3RvciggdGhpcy5kaXJlY3Rpb24sIHMwICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggb3B0aW9uYWxQb2ludE9uU2VnbWVudCApIHtcclxuXHJcblx0XHRcdG9wdGlvbmFsUG9pbnRPblNlZ21lbnQuY29weSggX3NlZ0NlbnRlciApLmFkZFNjYWxlZFZlY3RvciggX3NlZ0RpciwgczEgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHNxckRpc3Q7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW50ZXJzZWN0cyB0aGlzIHJheSB3aXRoIHRoZSBnaXZlbiBzcGhlcmUsIHJldHVybmluZyB0aGUgaW50ZXJzZWN0aW9uXHJcblx0ICogcG9pbnQgb3IgYG51bGxgIGlmIHRoZXJlIGlzIG5vIGludGVyc2VjdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7U3BoZXJlfSBzcGhlcmUgLSBUaGUgc3BoZXJlIHRvIGludGVyc2VjdC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHRhcmdldCAtIFRoZSB0YXJnZXQgdmVjdG9yIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbWV0aG9kJ3MgcmVzdWx0LlxyXG5cdCAqIEByZXR1cm4gez9WZWN0b3IzfSBUaGUgaW50ZXJzZWN0aW9uIHBvaW50LlxyXG5cdCAqL1xyXG5cdGludGVyc2VjdFNwaGVyZSggc3BoZXJlLCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0X3ZlY3Rvci5zdWJWZWN0b3JzKCBzcGhlcmUuY2VudGVyLCB0aGlzLm9yaWdpbiApO1xyXG5cdFx0Y29uc3QgdGNhID0gX3ZlY3Rvci5kb3QoIHRoaXMuZGlyZWN0aW9uICk7XHJcblx0XHRjb25zdCBkMiA9IF92ZWN0b3IuZG90KCBfdmVjdG9yICkgLSB0Y2EgKiB0Y2E7XHJcblx0XHRjb25zdCByYWRpdXMyID0gc3BoZXJlLnJhZGl1cyAqIHNwaGVyZS5yYWRpdXM7XHJcblxyXG5cdFx0aWYgKCBkMiA+IHJhZGl1czIgKSByZXR1cm4gbnVsbDtcclxuXHJcblx0XHRjb25zdCB0aGMgPSBNYXRoLnNxcnQoIHJhZGl1czIgLSBkMiApO1xyXG5cclxuXHRcdC8vIHQwID0gZmlyc3QgaW50ZXJzZWN0IHBvaW50IC0gZW50cmFuY2Ugb24gZnJvbnQgb2Ygc3BoZXJlXHJcblx0XHRjb25zdCB0MCA9IHRjYSAtIHRoYztcclxuXHJcblx0XHQvLyB0MSA9IHNlY29uZCBpbnRlcnNlY3QgcG9pbnQgLSBleGl0IHBvaW50IG9uIGJhY2sgb2Ygc3BoZXJlXHJcblx0XHRjb25zdCB0MSA9IHRjYSArIHRoYztcclxuXHJcblx0XHQvLyB0ZXN0IHRvIHNlZSBpZiB0MSBpcyBiZWhpbmQgdGhlIHJheSAtIGlmIHNvLCByZXR1cm4gbnVsbFxyXG5cdFx0aWYgKCB0MSA8IDAgKSByZXR1cm4gbnVsbDtcclxuXHJcblx0XHQvLyB0ZXN0IHRvIHNlZSBpZiB0MCBpcyBiZWhpbmQgdGhlIHJheTpcclxuXHRcdC8vIGlmIGl0IGlzLCB0aGUgcmF5IGlzIGluc2lkZSB0aGUgc3BoZXJlLCBzbyByZXR1cm4gdGhlIHNlY29uZCBleGl0IHBvaW50IHNjYWxlZCBieSB0MSxcclxuXHRcdC8vIGluIG9yZGVyIHRvIGFsd2F5cyByZXR1cm4gYW4gaW50ZXJzZWN0IHBvaW50IHRoYXQgaXMgaW4gZnJvbnQgb2YgdGhlIHJheS5cclxuXHRcdGlmICggdDAgPCAwICkgcmV0dXJuIHRoaXMuYXQoIHQxLCB0YXJnZXQgKTtcclxuXHJcblx0XHQvLyBlbHNlIHQwIGlzIGluIGZyb250IG9mIHRoZSByYXksIHNvIHJldHVybiB0aGUgZmlyc3QgY29sbGlzaW9uIHBvaW50IHNjYWxlZCBieSB0MFxyXG5cdFx0cmV0dXJuIHRoaXMuYXQoIHQwLCB0YXJnZXQgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIHJheSBpbnRlcnNlY3RzIHdpdGggdGhlIGdpdmVuIHNwaGVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7U3BoZXJlfSBzcGhlcmUgLSBUaGUgc3BoZXJlIHRvIGludGVyc2VjdC5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoaXMgcmF5IGludGVyc2VjdHMgd2l0aCB0aGUgZ2l2ZW4gc3BoZXJlIG9yIG5vdC5cclxuXHQgKi9cclxuXHRpbnRlcnNlY3RzU3BoZXJlKCBzcGhlcmUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZGlzdGFuY2VTcVRvUG9pbnQoIHNwaGVyZS5jZW50ZXIgKSA8PSAoIHNwaGVyZS5yYWRpdXMgKiBzcGhlcmUucmFkaXVzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgdGhlIGRpc3RhbmNlIGZyb20gdGhlIHJheSdzIG9yaWdpbiB0byB0aGUgZ2l2ZW4gcGxhbmUuIFJldHVybnMgYG51bGxgIGlmIHRoZSByYXlcclxuXHQgKiBkb2VzIG5vdCBpbnRlcnNlY3Qgd2l0aCB0aGUgcGxhbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1BsYW5lfSBwbGFuZSAtIFRoZSBwbGFuZSB0byBjb21wdXRlIHRoZSBkaXN0YW5jZSB0by5cclxuXHQgKiBAcmV0dXJuIHs/bnVtYmVyfSBXaGV0aGVyIHRoaXMgcmF5IGludGVyc2VjdHMgd2l0aCB0aGUgZ2l2ZW4gc3BoZXJlIG9yIG5vdC5cclxuXHQgKi9cclxuXHRkaXN0YW5jZVRvUGxhbmUoIHBsYW5lICkge1xyXG5cclxuXHRcdGNvbnN0IGRlbm9taW5hdG9yID0gcGxhbmUubm9ybWFsLmRvdCggdGhpcy5kaXJlY3Rpb24gKTtcclxuXHJcblx0XHRpZiAoIGRlbm9taW5hdG9yID09PSAwICkge1xyXG5cclxuXHRcdFx0Ly8gbGluZSBpcyBjb3BsYW5hciwgcmV0dXJuIG9yaWdpblxyXG5cdFx0XHRpZiAoIHBsYW5lLmRpc3RhbmNlVG9Qb2ludCggdGhpcy5vcmlnaW4gKSA9PT0gMCApIHtcclxuXHJcblx0XHRcdFx0cmV0dXJuIDA7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBOdWxsIGlzIHByZWZlcmFibGUgdG8gdW5kZWZpbmVkIHNpbmNlIHVuZGVmaW5lZCBtZWFucy4uLi4gaXQgaXMgdW5kZWZpbmVkXHJcblxyXG5cdFx0XHRyZXR1cm4gbnVsbDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgdCA9IC0gKCB0aGlzLm9yaWdpbi5kb3QoIHBsYW5lLm5vcm1hbCApICsgcGxhbmUuY29uc3RhbnQgKSAvIGRlbm9taW5hdG9yO1xyXG5cclxuXHRcdC8vIFJldHVybiBpZiB0aGUgcmF5IG5ldmVyIGludGVyc2VjdHMgdGhlIHBsYW5lXHJcblxyXG5cdFx0cmV0dXJuIHQgPj0gMCA/IHQgOiBudWxsO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEludGVyc2VjdHMgdGhpcyByYXkgd2l0aCB0aGUgZ2l2ZW4gcGxhbmUsIHJldHVybmluZyB0aGUgaW50ZXJzZWN0aW9uXHJcblx0ICogcG9pbnQgb3IgYG51bGxgIGlmIHRoZXJlIGlzIG5vIGludGVyc2VjdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UGxhbmV9IHBsYW5lIC0gVGhlIHBsYW5lIHRvIGludGVyc2VjdC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHRhcmdldCAtIFRoZSB0YXJnZXQgdmVjdG9yIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbWV0aG9kJ3MgcmVzdWx0LlxyXG5cdCAqIEByZXR1cm4gez9WZWN0b3IzfSBUaGUgaW50ZXJzZWN0aW9uIHBvaW50LlxyXG5cdCAqL1xyXG5cdGludGVyc2VjdFBsYW5lKCBwbGFuZSwgdGFyZ2V0ICkge1xyXG5cclxuXHRcdGNvbnN0IHQgPSB0aGlzLmRpc3RhbmNlVG9QbGFuZSggcGxhbmUgKTtcclxuXHJcblx0XHRpZiAoIHQgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gbnVsbDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuYXQoIHQsIHRhcmdldCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgcmF5IGludGVyc2VjdHMgd2l0aCB0aGUgZ2l2ZW4gcGxhbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1BsYW5lfSBwbGFuZSAtIFRoZSBwbGFuZSB0byBpbnRlcnNlY3QuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGlzIHJheSBpbnRlcnNlY3RzIHdpdGggdGhlIGdpdmVuIHBsYW5lIG9yIG5vdC5cclxuXHQgKi9cclxuXHRpbnRlcnNlY3RzUGxhbmUoIHBsYW5lICkge1xyXG5cclxuXHRcdC8vIGNoZWNrIGlmIHRoZSByYXkgbGllcyBvbiB0aGUgcGxhbmUgZmlyc3RcclxuXHJcblx0XHRjb25zdCBkaXN0VG9Qb2ludCA9IHBsYW5lLmRpc3RhbmNlVG9Qb2ludCggdGhpcy5vcmlnaW4gKTtcclxuXHJcblx0XHRpZiAoIGRpc3RUb1BvaW50ID09PSAwICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGRlbm9taW5hdG9yID0gcGxhbmUubm9ybWFsLmRvdCggdGhpcy5kaXJlY3Rpb24gKTtcclxuXHJcblx0XHRpZiAoIGRlbm9taW5hdG9yICogZGlzdFRvUG9pbnQgPCAwICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIHJheSBvcmlnaW4gaXMgYmVoaW5kIHRoZSBwbGFuZSAoYW5kIGlzIHBvaW50aW5nIGJlaGluZCBpdClcclxuXHJcblx0XHRyZXR1cm4gZmFsc2U7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW50ZXJzZWN0cyB0aGlzIHJheSB3aXRoIHRoZSBnaXZlbiBib3VuZGluZyBib3gsIHJldHVybmluZyB0aGUgaW50ZXJzZWN0aW9uXHJcblx0ICogcG9pbnQgb3IgYG51bGxgIGlmIHRoZXJlIGlzIG5vIGludGVyc2VjdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Qm94M30gYm94IC0gVGhlIGJveCB0byBpbnRlcnNlY3QuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IHZlY3RvciB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGhvZCdzIHJlc3VsdC5cclxuXHQgKiBAcmV0dXJuIHs/VmVjdG9yM30gVGhlIGludGVyc2VjdGlvbiBwb2ludC5cclxuXHQgKi9cclxuXHRpbnRlcnNlY3RCb3goIGJveCwgdGFyZ2V0ICkge1xyXG5cclxuXHRcdGxldCB0bWluLCB0bWF4LCB0eW1pbiwgdHltYXgsIHR6bWluLCB0em1heDtcclxuXHJcblx0XHRjb25zdCBpbnZkaXJ4ID0gMSAvIHRoaXMuZGlyZWN0aW9uLngsXHJcblx0XHRcdGludmRpcnkgPSAxIC8gdGhpcy5kaXJlY3Rpb24ueSxcclxuXHRcdFx0aW52ZGlyeiA9IDEgLyB0aGlzLmRpcmVjdGlvbi56O1xyXG5cclxuXHRcdGNvbnN0IG9yaWdpbiA9IHRoaXMub3JpZ2luO1xyXG5cclxuXHRcdGlmICggaW52ZGlyeCA+PSAwICkge1xyXG5cclxuXHRcdFx0dG1pbiA9ICggYm94Lm1pbi54IC0gb3JpZ2luLnggKSAqIGludmRpcng7XHJcblx0XHRcdHRtYXggPSAoIGJveC5tYXgueCAtIG9yaWdpbi54ICkgKiBpbnZkaXJ4O1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR0bWluID0gKCBib3gubWF4LnggLSBvcmlnaW4ueCApICogaW52ZGlyeDtcclxuXHRcdFx0dG1heCA9ICggYm94Lm1pbi54IC0gb3JpZ2luLnggKSAqIGludmRpcng7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggaW52ZGlyeSA+PSAwICkge1xyXG5cclxuXHRcdFx0dHltaW4gPSAoIGJveC5taW4ueSAtIG9yaWdpbi55ICkgKiBpbnZkaXJ5O1xyXG5cdFx0XHR0eW1heCA9ICggYm94Lm1heC55IC0gb3JpZ2luLnkgKSAqIGludmRpcnk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHR5bWluID0gKCBib3gubWF4LnkgLSBvcmlnaW4ueSApICogaW52ZGlyeTtcclxuXHRcdFx0dHltYXggPSAoIGJveC5taW4ueSAtIG9yaWdpbi55ICkgKiBpbnZkaXJ5O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoICggdG1pbiA+IHR5bWF4ICkgfHwgKCB0eW1pbiA+IHRtYXggKSApIHJldHVybiBudWxsO1xyXG5cclxuXHRcdGlmICggdHltaW4gPiB0bWluIHx8IGlzTmFOKCB0bWluICkgKSB0bWluID0gdHltaW47XHJcblxyXG5cdFx0aWYgKCB0eW1heCA8IHRtYXggfHwgaXNOYU4oIHRtYXggKSApIHRtYXggPSB0eW1heDtcclxuXHJcblx0XHRpZiAoIGludmRpcnogPj0gMCApIHtcclxuXHJcblx0XHRcdHR6bWluID0gKCBib3gubWluLnogLSBvcmlnaW4ueiApICogaW52ZGlyejtcclxuXHRcdFx0dHptYXggPSAoIGJveC5tYXgueiAtIG9yaWdpbi56ICkgKiBpbnZkaXJ6O1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR0em1pbiA9ICggYm94Lm1heC56IC0gb3JpZ2luLnogKSAqIGludmRpcno7XHJcblx0XHRcdHR6bWF4ID0gKCBib3gubWluLnogLSBvcmlnaW4ueiApICogaW52ZGlyejtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCAoIHRtaW4gPiB0em1heCApIHx8ICggdHptaW4gPiB0bWF4ICkgKSByZXR1cm4gbnVsbDtcclxuXHJcblx0XHRpZiAoIHR6bWluID4gdG1pbiB8fCB0bWluICE9PSB0bWluICkgdG1pbiA9IHR6bWluO1xyXG5cclxuXHRcdGlmICggdHptYXggPCB0bWF4IHx8IHRtYXggIT09IHRtYXggKSB0bWF4ID0gdHptYXg7XHJcblxyXG5cdFx0Ly9yZXR1cm4gcG9pbnQgY2xvc2VzdCB0byB0aGUgcmF5IChwb3NpdGl2ZSBzaWRlKVxyXG5cclxuXHRcdGlmICggdG1heCA8IDAgKSByZXR1cm4gbnVsbDtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5hdCggdG1pbiA+PSAwID8gdG1pbiA6IHRtYXgsIHRhcmdldCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgcmF5IGludGVyc2VjdHMgd2l0aCB0aGUgZ2l2ZW4gYm94LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCb3gzfSBib3ggLSBUaGUgYm94IHRvIGludGVyc2VjdC5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoaXMgcmF5IGludGVyc2VjdHMgd2l0aCB0aGUgZ2l2ZW4gYm94IG9yIG5vdC5cclxuXHQgKi9cclxuXHRpbnRlcnNlY3RzQm94KCBib3ggKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0Qm94KCBib3gsIF92ZWN0b3IgKSAhPT0gbnVsbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJbnRlcnNlY3RzIHRoaXMgcmF5IHdpdGggdGhlIGdpdmVuIHRyaWFuZ2xlLCByZXR1cm5pbmcgdGhlIGludGVyc2VjdGlvblxyXG5cdCAqIHBvaW50IG9yIGBudWxsYCBpZiB0aGVyZSBpcyBubyBpbnRlcnNlY3Rpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IGEgLSBUaGUgZmlyc3QgdmVydGV4IG9mIHRoZSB0cmlhbmdsZS5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IGIgLSBUaGUgc2Vjb25kIHZlcnRleCBvZiB0aGUgdHJpYW5nbGUuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBjIC0gVGhlIHRoaXJkIHZlcnRleCBvZiB0aGUgdHJpYW5nbGUuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBiYWNrZmFjZUN1bGxpbmcgLSBXaGV0aGVyIHRvIHVzZSBiYWNrZmFjZSBjdWxsaW5nIG9yIG5vdC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHRhcmdldCAtIFRoZSB0YXJnZXQgdmVjdG9yIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbWV0aG9kJ3MgcmVzdWx0LlxyXG5cdCAqIEByZXR1cm4gez9WZWN0b3IzfSBUaGUgaW50ZXJzZWN0aW9uIHBvaW50LlxyXG5cdCAqL1xyXG5cdGludGVyc2VjdFRyaWFuZ2xlKCBhLCBiLCBjLCBiYWNrZmFjZUN1bGxpbmcsIHRhcmdldCApIHtcclxuXHJcblx0XHQvLyBDb21wdXRlIHRoZSBvZmZzZXQgb3JpZ2luLCBlZGdlcywgYW5kIG5vcm1hbC5cclxuXHJcblx0XHQvLyBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9wbWpvbmlhay9HZW9tZXRyaWNUb29scy9ibG9iL21hc3Rlci9HVEVuZ2luZS9JbmNsdWRlL01hdGhlbWF0aWNzL0d0ZUludHJSYXkzVHJpYW5nbGUzLmhcclxuXHJcblx0XHRfZWRnZTEuc3ViVmVjdG9ycyggYiwgYSApO1xyXG5cdFx0X2VkZ2UyLnN1YlZlY3RvcnMoIGMsIGEgKTtcclxuXHRcdF9ub3JtYWwuY3Jvc3NWZWN0b3JzKCBfZWRnZTEsIF9lZGdlMiApO1xyXG5cclxuXHRcdC8vIFNvbHZlIFEgKyB0KkQgPSBiMSpFMSArIGIyKkUyIChRID0ga0RpZmYsIEQgPSByYXkgZGlyZWN0aW9uLFxyXG5cdFx0Ly8gRTEgPSBrRWRnZTEsIEUyID0ga0VkZ2UyLCBOID0gQ3Jvc3MoRTEsRTIpKSBieVxyXG5cdFx0Ly8gICB8RG90KEQsTil8KmIxID0gc2lnbihEb3QoRCxOKSkqRG90KEQsQ3Jvc3MoUSxFMikpXHJcblx0XHQvLyAgIHxEb3QoRCxOKXwqYjIgPSBzaWduKERvdChELE4pKSpEb3QoRCxDcm9zcyhFMSxRKSlcclxuXHRcdC8vICAgfERvdChELE4pfCp0ID0gLXNpZ24oRG90KEQsTikpKkRvdChRLE4pXHJcblx0XHRsZXQgRGROID0gdGhpcy5kaXJlY3Rpb24uZG90KCBfbm9ybWFsICk7XHJcblx0XHRsZXQgc2lnbjtcclxuXHJcblx0XHRpZiAoIERkTiA+IDAgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGJhY2tmYWNlQ3VsbGluZyApIHJldHVybiBudWxsO1xyXG5cdFx0XHRzaWduID0gMTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBEZE4gPCAwICkge1xyXG5cclxuXHRcdFx0c2lnbiA9IC0gMTtcclxuXHRcdFx0RGROID0gLSBEZE47XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHJldHVybiBudWxsO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRfZGlmZi5zdWJWZWN0b3JzKCB0aGlzLm9yaWdpbiwgYSApO1xyXG5cdFx0Y29uc3QgRGRReEUyID0gc2lnbiAqIHRoaXMuZGlyZWN0aW9uLmRvdCggX2VkZ2UyLmNyb3NzVmVjdG9ycyggX2RpZmYsIF9lZGdlMiApICk7XHJcblxyXG5cdFx0Ly8gYjEgPCAwLCBubyBpbnRlcnNlY3Rpb25cclxuXHRcdGlmICggRGRReEUyIDwgMCApIHtcclxuXHJcblx0XHRcdHJldHVybiBudWxsO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBEZEUxeFEgPSBzaWduICogdGhpcy5kaXJlY3Rpb24uZG90KCBfZWRnZTEuY3Jvc3MoIF9kaWZmICkgKTtcclxuXHJcblx0XHQvLyBiMiA8IDAsIG5vIGludGVyc2VjdGlvblxyXG5cdFx0aWYgKCBEZEUxeFEgPCAwICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGIxK2IyID4gMSwgbm8gaW50ZXJzZWN0aW9uXHJcblx0XHRpZiAoIERkUXhFMiArIERkRTF4USA+IERkTiApIHtcclxuXHJcblx0XHRcdHJldHVybiBudWxsO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBMaW5lIGludGVyc2VjdHMgdHJpYW5nbGUsIGNoZWNrIGlmIHJheSBkb2VzLlxyXG5cdFx0Y29uc3QgUWROID0gLSBzaWduICogX2RpZmYuZG90KCBfbm9ybWFsICk7XHJcblxyXG5cdFx0Ly8gdCA8IDAsIG5vIGludGVyc2VjdGlvblxyXG5cdFx0aWYgKCBRZE4gPCAwICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFJheSBpbnRlcnNlY3RzIHRyaWFuZ2xlLlxyXG5cdFx0cmV0dXJuIHRoaXMuYXQoIFFkTiAvIERkTiwgdGFyZ2V0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVHJhbnNmb3JtcyB0aGlzIHJheSB3aXRoIHRoZSBnaXZlbiA0eDQgdHJhbnNmb3JtYXRpb24gbWF0cml4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRyaXg0fSBtYXRyaXg0IC0gVGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC5cclxuXHQgKiBAcmV0dXJuIHtSYXl9IEEgcmVmZXJlbmNlIHRvIHRoaXMgcmF5LlxyXG5cdCAqL1xyXG5cdGFwcGx5TWF0cml4NCggbWF0cml4NCApIHtcclxuXHJcblx0XHR0aGlzLm9yaWdpbi5hcHBseU1hdHJpeDQoIG1hdHJpeDQgKTtcclxuXHRcdHRoaXMuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbiggbWF0cml4NCApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgcmF5IGlzIGVxdWFsIHdpdGggdGhlIGdpdmVuIG9uZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmF5fSByYXkgLSBUaGUgcmF5IHRvIHRlc3QgZm9yIGVxdWFsaXR5LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyByYXkgaXMgZXF1YWwgd2l0aCB0aGUgZ2l2ZW4gb25lLlxyXG5cdCAqL1xyXG5cdGVxdWFscyggcmF5ICkge1xyXG5cclxuXHRcdHJldHVybiByYXkub3JpZ2luLmVxdWFscyggdGhpcy5vcmlnaW4gKSAmJiByYXkuZGlyZWN0aW9uLmVxdWFscyggdGhpcy5kaXJlY3Rpb24gKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbmV3IHJheSB3aXRoIGNvcGllZCB2YWx1ZXMgZnJvbSB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7UmF5fSBBIGNsb25lIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y2xvbmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBSYXkgfTtcclxuIiwiaW1wb3J0IHsgV2ViR0xDb29yZGluYXRlU3lzdGVtLCBXZWJHUFVDb29yZGluYXRlU3lzdGVtIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4vVmVjdG9yMy5qcyc7XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyBhIDR4NCBtYXRyaXguXHJcbiAqXHJcbiAqIFRoZSBtb3N0IGNvbW1vbiB1c2Ugb2YgYSA0eDQgbWF0cml4IGluIDNEIGNvbXB1dGVyIGdyYXBoaWNzIGlzIGFzIGEgdHJhbnNmb3JtYXRpb24gbWF0cml4LlxyXG4gKiBGb3IgYW4gaW50cm9kdWN0aW9uIHRvIHRyYW5zZm9ybWF0aW9uIG1hdHJpY2VzIGFzIHVzZWQgaW4gV2ViR0wsIGNoZWNrIG91dCBbdGhpcyB0dXRvcmlhbF17QGxpbmsgaHR0cHM6Ly93d3cub3BlbmdsLXR1dG9yaWFsLm9yZy9iZWdpbm5lcnMtdHV0b3JpYWxzL3R1dG9yaWFsLTMtbWF0cmljZXN9XHJcbiAqXHJcbiAqIFRoaXMgYWxsb3dzIGEgM0QgdmVjdG9yIHJlcHJlc2VudGluZyBhIHBvaW50IGluIDNEIHNwYWNlIHRvIHVuZGVyZ29cclxuICogdHJhbnNmb3JtYXRpb25zIHN1Y2ggYXMgdHJhbnNsYXRpb24sIHJvdGF0aW9uLCBzaGVhciwgc2NhbGUsIHJlZmxlY3Rpb24sXHJcbiAqIG9ydGhvZ29uYWwgb3IgcGVyc3BlY3RpdmUgcHJvamVjdGlvbiBhbmQgc28gb24sIGJ5IGJlaW5nIG11bHRpcGxpZWQgYnkgdGhlXHJcbiAqIG1hdHJpeC4gVGhpcyBpcyBrbm93biBhcyBgYXBwbHlpbmdgIHRoZSBtYXRyaXggdG8gdGhlIHZlY3Rvci5cclxuICpcclxuICogQSBOb3RlIG9uIFJvdy1NYWpvciBhbmQgQ29sdW1uLU1ham9yIE9yZGVyaW5nOlxyXG4gKlxyXG4gKiBUaGUgY29uc3RydWN0b3IgYW5kIHtAbGluayBNYXRyaXgzI3NldH0gbWV0aG9kIHRha2UgYXJndW1lbnRzIGluXHJcbiAqIFtyb3ctbWFqb3Jde0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1Jvdy1fYW5kX2NvbHVtbi1tYWpvcl9vcmRlciNDb2x1bW4tbWFqb3Jfb3JkZXJ9XHJcbiAqIG9yZGVyLCB3aGlsZSBpbnRlcm5hbGx5IHRoZXkgYXJlIHN0b3JlZCBpbiB0aGUge0BsaW5rIE1hdHJpeDMjZWxlbWVudHN9IGFycmF5IGluIGNvbHVtbi1tYWpvciBvcmRlci5cclxuICogVGhpcyBtZWFucyB0aGF0IGNhbGxpbmc6XHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IG0gPSBuZXcgVEhSRUUuTWF0cml4NCgpO1xyXG4gKiBtLnNldCggMTEsIDEyLCAxMywgMTQsXHJcbiAqICAgICAgICAyMSwgMjIsIDIzLCAyNCxcclxuICogICAgICAgIDMxLCAzMiwgMzMsIDM0LFxyXG4gKiAgICAgICAgNDEsIDQyLCA0MywgNDQgKTtcclxuICogYGBgXHJcbiAqIHdpbGwgcmVzdWx0IGluIHRoZSBlbGVtZW50cyBhcnJheSBjb250YWluaW5nOlxyXG4gKiBgYGBqc1xyXG4gKiBtLmVsZW1lbnRzID0gWyAxMSwgMjEsIDMxLCA0MSxcclxuICogICAgICAgICAgICAgICAgMTIsIDIyLCAzMiwgNDIsXHJcbiAqICAgICAgICAgICAgICAgIDEzLCAyMywgMzMsIDQzLFxyXG4gKiAgICAgICAgICAgICAgICAxNCwgMjQsIDM0LCA0NCBdO1xyXG4gKiBgYGBcclxuICogYW5kIGludGVybmFsbHkgYWxsIGNhbGN1bGF0aW9ucyBhcmUgcGVyZm9ybWVkIHVzaW5nIGNvbHVtbi1tYWpvciBvcmRlcmluZy5cclxuICogSG93ZXZlciwgYXMgdGhlIGFjdHVhbCBvcmRlcmluZyBtYWtlcyBubyBkaWZmZXJlbmNlIG1hdGhlbWF0aWNhbGx5IGFuZFxyXG4gKiBtb3N0IHBlb3BsZSBhcmUgdXNlZCB0byB0aGlua2luZyBhYm91dCBtYXRyaWNlcyBpbiByb3ctbWFqb3Igb3JkZXIsIHRoZVxyXG4gKiB0aHJlZS5qcyBkb2N1bWVudGF0aW9uIHNob3dzIG1hdHJpY2VzIGluIHJvdy1tYWpvciBvcmRlci4gSnVzdCBiZWFyIGluXHJcbiAqIG1pbmQgdGhhdCBpZiB5b3UgYXJlIHJlYWRpbmcgdGhlIHNvdXJjZSBjb2RlLCB5b3UnbGwgaGF2ZSB0byB0YWtlIHRoZVxyXG4gKiB0cmFuc3Bvc2Ugb2YgYW55IG1hdHJpY2VzIG91dGxpbmVkIGhlcmUgdG8gbWFrZSBzZW5zZSBvZiB0aGUgY2FsY3VsYXRpb25zLlxyXG4gKi9cclxuY2xhc3MgTWF0cml4NCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgNHg0IG1hdHJpeC4gVGhlIGFyZ3VtZW50cyBhcmUgc3VwcG9zZWQgdG8gYmVcclxuXHQgKiBpbiByb3ctbWFqb3Igb3JkZXIuIElmIG5vIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQsIHRoZSBjb25zdHJ1Y3RvclxyXG5cdCAqIGluaXRpYWxpemVzIHRoZSBtYXRyaXggYXMgYW4gaWRlbnRpdHkgbWF0cml4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuMTFdIC0gMS0xIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjEyXSAtIDEtMiBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW24xM10gLSAxLTMgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuMTRdIC0gMS00IG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjIxXSAtIDItMSBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW24yMl0gLSAyLTIgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuMjNdIC0gMi0zIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjI0XSAtIDItNCBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW24zMV0gLSAzLTEgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuMzJdIC0gMy0yIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjMzXSAtIDMtMyBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW24zNF0gLSAzLTQgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuNDFdIC0gNC0xIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjQyXSAtIDQtMiBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW240M10gLSA0LTMgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuNDRdIC0gNC00IG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBuMTEsIG4xMiwgbjEzLCBuMTQsIG4yMSwgbjIyLCBuMjMsIG4yNCwgbjMxLCBuMzIsIG4zMywgbjM0LCBuNDEsIG40MiwgbjQzLCBuNDQgKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHRNYXRyaXg0LnByb3RvdHlwZS5pc01hdHJpeDQgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBjb2x1bW4tbWFqb3IgbGlzdCBvZiBtYXRyaXggdmFsdWVzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxudW1iZXI+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmVsZW1lbnRzID0gW1xyXG5cclxuXHRcdFx0MSwgMCwgMCwgMCxcclxuXHRcdFx0MCwgMSwgMCwgMCxcclxuXHRcdFx0MCwgMCwgMSwgMCxcclxuXHRcdFx0MCwgMCwgMCwgMVxyXG5cclxuXHRcdF07XHJcblxyXG5cdFx0aWYgKCBuMTEgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHRoaXMuc2V0KCBuMTEsIG4xMiwgbjEzLCBuMTQsIG4yMSwgbjIyLCBuMjMsIG4yNCwgbjMxLCBuMzIsIG4zMywgbjM0LCBuNDEsIG40MiwgbjQzLCBuNDQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZWxlbWVudHMgb2YgdGhlIG1hdHJpeC5UaGUgYXJndW1lbnRzIGFyZSBzdXBwb3NlZCB0byBiZVxyXG5cdCAqIGluIHJvdy1tYWpvciBvcmRlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjExXSAtIDEtMSBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW24xMl0gLSAxLTIgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuMTNdIC0gMS0zIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjE0XSAtIDEtNCBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW24yMV0gLSAyLTEgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuMjJdIC0gMi0yIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjIzXSAtIDItMyBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW24yNF0gLSAyLTQgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuMzFdIC0gMy0xIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjMyXSAtIDMtMiBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW24zM10gLSAzLTMgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuMzRdIC0gMy00IG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjQxXSAtIDQtMSBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW240Ml0gLSA0LTIgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuNDNdIC0gNC0zIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjQ0XSAtIDQtNCBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXg0fSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRzZXQoIG4xMSwgbjEyLCBuMTMsIG4xNCwgbjIxLCBuMjIsIG4yMywgbjI0LCBuMzEsIG4zMiwgbjMzLCBuMzQsIG40MSwgbjQyLCBuNDMsIG40NCApIHtcclxuXHJcblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XHJcblxyXG5cdFx0dGVbIDAgXSA9IG4xMTsgdGVbIDQgXSA9IG4xMjsgdGVbIDggXSA9IG4xMzsgdGVbIDEyIF0gPSBuMTQ7XHJcblx0XHR0ZVsgMSBdID0gbjIxOyB0ZVsgNSBdID0gbjIyOyB0ZVsgOSBdID0gbjIzOyB0ZVsgMTMgXSA9IG4yNDtcclxuXHRcdHRlWyAyIF0gPSBuMzE7IHRlWyA2IF0gPSBuMzI7IHRlWyAxMCBdID0gbjMzOyB0ZVsgMTQgXSA9IG4zNDtcclxuXHRcdHRlWyAzIF0gPSBuNDE7IHRlWyA3IF0gPSBuNDI7IHRlWyAxMSBdID0gbjQzOyB0ZVsgMTUgXSA9IG40NDtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoaXMgbWF0cml4IHRvIHRoZSA0eDQgaWRlbnRpdHkgbWF0cml4LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7TWF0cml4NH0gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0aWRlbnRpdHkoKSB7XHJcblxyXG5cdFx0dGhpcy5zZXQoXHJcblxyXG5cdFx0XHQxLCAwLCAwLCAwLFxyXG5cdFx0XHQwLCAxLCAwLCAwLFxyXG5cdFx0XHQwLCAwLCAxLCAwLFxyXG5cdFx0XHQwLCAwLCAwLCAxXHJcblxyXG5cdFx0KTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbWF0cml4IHdpdGggY29waWVkIHZhbHVlcyBmcm9tIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtNYXRyaXg0fSBBIGNsb25lIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y2xvbmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBNYXRyaXg0KCkuZnJvbUFycmF5KCB0aGlzLmVsZW1lbnRzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29waWVzIHRoZSB2YWx1ZXMgb2YgdGhlIGdpdmVuIG1hdHJpeCB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRyaXg0fSBtIC0gVGhlIG1hdHJpeCB0byBjb3B5LlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdGNvcHkoIG0gKSB7XHJcblxyXG5cdFx0Y29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzO1xyXG5cdFx0Y29uc3QgbWUgPSBtLmVsZW1lbnRzO1xyXG5cclxuXHRcdHRlWyAwIF0gPSBtZVsgMCBdOyB0ZVsgMSBdID0gbWVbIDEgXTsgdGVbIDIgXSA9IG1lWyAyIF07IHRlWyAzIF0gPSBtZVsgMyBdO1xyXG5cdFx0dGVbIDQgXSA9IG1lWyA0IF07IHRlWyA1IF0gPSBtZVsgNSBdOyB0ZVsgNiBdID0gbWVbIDYgXTsgdGVbIDcgXSA9IG1lWyA3IF07XHJcblx0XHR0ZVsgOCBdID0gbWVbIDggXTsgdGVbIDkgXSA9IG1lWyA5IF07IHRlWyAxMCBdID0gbWVbIDEwIF07IHRlWyAxMSBdID0gbWVbIDExIF07XHJcblx0XHR0ZVsgMTIgXSA9IG1lWyAxMiBdOyB0ZVsgMTMgXSA9IG1lWyAxMyBdOyB0ZVsgMTQgXSA9IG1lWyAxNCBdOyB0ZVsgMTUgXSA9IG1lWyAxNSBdO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvcGllcyB0aGUgdHJhbnNsYXRpb24gY29tcG9uZW50IG9mIHRoZSBnaXZlbiBtYXRyaXhcclxuXHQgKiBpbnRvIHRoaXMgbWF0cml4J3MgdHJhbnNsYXRpb24gY29tcG9uZW50LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRyaXg0fSBtIC0gVGhlIG1hdHJpeCB0byBjb3B5IHRoZSB0cmFuc2xhdGlvbiBjb21wb25lbnQuXHJcblx0ICogQHJldHVybiB7TWF0cml4NH0gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0Y29weVBvc2l0aW9uKCBtICkge1xyXG5cclxuXHRcdGNvbnN0IHRlID0gdGhpcy5lbGVtZW50cywgbWUgPSBtLmVsZW1lbnRzO1xyXG5cclxuXHRcdHRlWyAxMiBdID0gbWVbIDEyIF07XHJcblx0XHR0ZVsgMTMgXSA9IG1lWyAxMyBdO1xyXG5cdFx0dGVbIDE0IF0gPSBtZVsgMTQgXTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXQgdGhlIHVwcGVyIDN4MyBlbGVtZW50cyBvZiB0aGlzIG1hdHJpeCB0byB0aGUgdmFsdWVzIG9mIGdpdmVuIDN4MyBtYXRyaXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDN9IG0gLSBUaGUgM3gzIG1hdHJpeC5cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXg0fSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRzZXRGcm9tTWF0cml4MyggbSApIHtcclxuXHJcblx0XHRjb25zdCBtZSA9IG0uZWxlbWVudHM7XHJcblxyXG5cdFx0dGhpcy5zZXQoXHJcblxyXG5cdFx0XHRtZVsgMCBdLCBtZVsgMyBdLCBtZVsgNiBdLCAwLFxyXG5cdFx0XHRtZVsgMSBdLCBtZVsgNCBdLCBtZVsgNyBdLCAwLFxyXG5cdFx0XHRtZVsgMiBdLCBtZVsgNSBdLCBtZVsgOCBdLCAwLFxyXG5cdFx0XHQwLCAwLCAwLCAxXHJcblxyXG5cdFx0KTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFeHRyYWN0cyB0aGUgYmFzaXMgb2YgdGhpcyBtYXRyaXggaW50byB0aGUgdGhyZWUgYXhpcyB2ZWN0b3JzIHByb3ZpZGVkLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB4QXhpcyAtIFRoZSBiYXNpcydzIHggYXhpcy5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHlBeGlzIC0gVGhlIGJhc2lzJ3MgeSBheGlzLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gekF4aXMgLSBUaGUgYmFzaXMncyB6IGF4aXMuXHJcblx0ICogQHJldHVybiB7TWF0cml4NH0gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0ZXh0cmFjdEJhc2lzKCB4QXhpcywgeUF4aXMsIHpBeGlzICkge1xyXG5cclxuXHRcdHhBeGlzLnNldEZyb21NYXRyaXhDb2x1bW4oIHRoaXMsIDAgKTtcclxuXHRcdHlBeGlzLnNldEZyb21NYXRyaXhDb2x1bW4oIHRoaXMsIDEgKTtcclxuXHRcdHpBeGlzLnNldEZyb21NYXRyaXhDb2x1bW4oIHRoaXMsIDIgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBnaXZlbiBiYXNpcyB2ZWN0b3JzIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB4QXhpcyAtIFRoZSBiYXNpcydzIHggYXhpcy5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHlBeGlzIC0gVGhlIGJhc2lzJ3MgeSBheGlzLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gekF4aXMgLSBUaGUgYmFzaXMncyB6IGF4aXMuXHJcblx0ICogQHJldHVybiB7TWF0cml4NH0gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0bWFrZUJhc2lzKCB4QXhpcywgeUF4aXMsIHpBeGlzICkge1xyXG5cclxuXHRcdHRoaXMuc2V0KFxyXG5cdFx0XHR4QXhpcy54LCB5QXhpcy54LCB6QXhpcy54LCAwLFxyXG5cdFx0XHR4QXhpcy55LCB5QXhpcy55LCB6QXhpcy55LCAwLFxyXG5cdFx0XHR4QXhpcy56LCB5QXhpcy56LCB6QXhpcy56LCAwLFxyXG5cdFx0XHQwLCAwLCAwLCAxXHJcblx0XHQpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEV4dHJhY3RzIHRoZSByb3RhdGlvbiBjb21wb25lbnQgb2YgdGhlIGdpdmVuIG1hdHJpeFxyXG5cdCAqIGludG8gdGhpcyBtYXRyaXgncyByb3RhdGlvbiBjb21wb25lbnQuXHJcblx0ICpcclxuXHQgKiBOb3RlOiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBzdXBwb3J0IHJlZmxlY3Rpb24gbWF0cmljZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDR9IG0gLSBUaGUgbWF0cml4LlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdGV4dHJhY3RSb3RhdGlvbiggbSApIHtcclxuXHJcblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XHJcblx0XHRjb25zdCBtZSA9IG0uZWxlbWVudHM7XHJcblxyXG5cdFx0Y29uc3Qgc2NhbGVYID0gMSAvIF92MS5zZXRGcm9tTWF0cml4Q29sdW1uKCBtLCAwICkubGVuZ3RoKCk7XHJcblx0XHRjb25zdCBzY2FsZVkgPSAxIC8gX3YxLnNldEZyb21NYXRyaXhDb2x1bW4oIG0sIDEgKS5sZW5ndGgoKTtcclxuXHRcdGNvbnN0IHNjYWxlWiA9IDEgLyBfdjEuc2V0RnJvbU1hdHJpeENvbHVtbiggbSwgMiApLmxlbmd0aCgpO1xyXG5cclxuXHRcdHRlWyAwIF0gPSBtZVsgMCBdICogc2NhbGVYO1xyXG5cdFx0dGVbIDEgXSA9IG1lWyAxIF0gKiBzY2FsZVg7XHJcblx0XHR0ZVsgMiBdID0gbWVbIDIgXSAqIHNjYWxlWDtcclxuXHRcdHRlWyAzIF0gPSAwO1xyXG5cclxuXHRcdHRlWyA0IF0gPSBtZVsgNCBdICogc2NhbGVZO1xyXG5cdFx0dGVbIDUgXSA9IG1lWyA1IF0gKiBzY2FsZVk7XHJcblx0XHR0ZVsgNiBdID0gbWVbIDYgXSAqIHNjYWxlWTtcclxuXHRcdHRlWyA3IF0gPSAwO1xyXG5cclxuXHRcdHRlWyA4IF0gPSBtZVsgOCBdICogc2NhbGVaO1xyXG5cdFx0dGVbIDkgXSA9IG1lWyA5IF0gKiBzY2FsZVo7XHJcblx0XHR0ZVsgMTAgXSA9IG1lWyAxMCBdICogc2NhbGVaO1xyXG5cdFx0dGVbIDExIF0gPSAwO1xyXG5cclxuXHRcdHRlWyAxMiBdID0gMDtcclxuXHRcdHRlWyAxMyBdID0gMDtcclxuXHRcdHRlWyAxNCBdID0gMDtcclxuXHRcdHRlWyAxNSBdID0gMTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSByb3RhdGlvbiBjb21wb25lbnQgKHRoZSB1cHBlciBsZWZ0IDN4MyBtYXRyaXgpIG9mIHRoaXMgbWF0cml4IHRvXHJcblx0ICogdGhlIHJvdGF0aW9uIHNwZWNpZmllZCBieSB0aGUgZ2l2ZW4gRXVsZXIgYW5nbGVzLiBUaGUgcmVzdCBvZlxyXG5cdCAqIHRoZSBtYXRyaXggaXMgc2V0IHRvIHRoZSBpZGVudGl0eS4gRGVwZW5kaW5nIG9uIHRoZSB7QGxpbmsgRXVsZXIjb3JkZXJ9LFxyXG5cdCAqIHRoZXJlIGFyZSBzaXggcG9zc2libGUgb3V0Y29tZXMuIFNlZSBbdGhpcyBwYWdlXXtAbGluayBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FdWxlcl9hbmdsZXMjUm90YXRpb25fbWF0cml4fVxyXG5cdCAqIGZvciBhIGNvbXBsZXRlIGxpc3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0V1bGVyfSBldWxlciAtIFRoZSBFdWxlciBhbmdsZXMuXHJcblx0ICogQHJldHVybiB7TWF0cml4NH0gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0bWFrZVJvdGF0aW9uRnJvbUV1bGVyKCBldWxlciApIHtcclxuXHJcblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XHJcblxyXG5cdFx0Y29uc3QgeCA9IGV1bGVyLngsIHkgPSBldWxlci55LCB6ID0gZXVsZXIuejtcclxuXHRcdGNvbnN0IGEgPSBNYXRoLmNvcyggeCApLCBiID0gTWF0aC5zaW4oIHggKTtcclxuXHRcdGNvbnN0IGMgPSBNYXRoLmNvcyggeSApLCBkID0gTWF0aC5zaW4oIHkgKTtcclxuXHRcdGNvbnN0IGUgPSBNYXRoLmNvcyggeiApLCBmID0gTWF0aC5zaW4oIHogKTtcclxuXHJcblx0XHRpZiAoIGV1bGVyLm9yZGVyID09PSAnWFlaJyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGFlID0gYSAqIGUsIGFmID0gYSAqIGYsIGJlID0gYiAqIGUsIGJmID0gYiAqIGY7XHJcblxyXG5cdFx0XHR0ZVsgMCBdID0gYyAqIGU7XHJcblx0XHRcdHRlWyA0IF0gPSAtIGMgKiBmO1xyXG5cdFx0XHR0ZVsgOCBdID0gZDtcclxuXHJcblx0XHRcdHRlWyAxIF0gPSBhZiArIGJlICogZDtcclxuXHRcdFx0dGVbIDUgXSA9IGFlIC0gYmYgKiBkO1xyXG5cdFx0XHR0ZVsgOSBdID0gLSBiICogYztcclxuXHJcblx0XHRcdHRlWyAyIF0gPSBiZiAtIGFlICogZDtcclxuXHRcdFx0dGVbIDYgXSA9IGJlICsgYWYgKiBkO1xyXG5cdFx0XHR0ZVsgMTAgXSA9IGEgKiBjO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGV1bGVyLm9yZGVyID09PSAnWVhaJyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGNlID0gYyAqIGUsIGNmID0gYyAqIGYsIGRlID0gZCAqIGUsIGRmID0gZCAqIGY7XHJcblxyXG5cdFx0XHR0ZVsgMCBdID0gY2UgKyBkZiAqIGI7XHJcblx0XHRcdHRlWyA0IF0gPSBkZSAqIGIgLSBjZjtcclxuXHRcdFx0dGVbIDggXSA9IGEgKiBkO1xyXG5cclxuXHRcdFx0dGVbIDEgXSA9IGEgKiBmO1xyXG5cdFx0XHR0ZVsgNSBdID0gYSAqIGU7XHJcblx0XHRcdHRlWyA5IF0gPSAtIGI7XHJcblxyXG5cdFx0XHR0ZVsgMiBdID0gY2YgKiBiIC0gZGU7XHJcblx0XHRcdHRlWyA2IF0gPSBkZiArIGNlICogYjtcclxuXHRcdFx0dGVbIDEwIF0gPSBhICogYztcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBldWxlci5vcmRlciA9PT0gJ1pYWScgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBjZSA9IGMgKiBlLCBjZiA9IGMgKiBmLCBkZSA9IGQgKiBlLCBkZiA9IGQgKiBmO1xyXG5cclxuXHRcdFx0dGVbIDAgXSA9IGNlIC0gZGYgKiBiO1xyXG5cdFx0XHR0ZVsgNCBdID0gLSBhICogZjtcclxuXHRcdFx0dGVbIDggXSA9IGRlICsgY2YgKiBiO1xyXG5cclxuXHRcdFx0dGVbIDEgXSA9IGNmICsgZGUgKiBiO1xyXG5cdFx0XHR0ZVsgNSBdID0gYSAqIGU7XHJcblx0XHRcdHRlWyA5IF0gPSBkZiAtIGNlICogYjtcclxuXHJcblx0XHRcdHRlWyAyIF0gPSAtIGEgKiBkO1xyXG5cdFx0XHR0ZVsgNiBdID0gYjtcclxuXHRcdFx0dGVbIDEwIF0gPSBhICogYztcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBldWxlci5vcmRlciA9PT0gJ1pZWCcgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBhZSA9IGEgKiBlLCBhZiA9IGEgKiBmLCBiZSA9IGIgKiBlLCBiZiA9IGIgKiBmO1xyXG5cclxuXHRcdFx0dGVbIDAgXSA9IGMgKiBlO1xyXG5cdFx0XHR0ZVsgNCBdID0gYmUgKiBkIC0gYWY7XHJcblx0XHRcdHRlWyA4IF0gPSBhZSAqIGQgKyBiZjtcclxuXHJcblx0XHRcdHRlWyAxIF0gPSBjICogZjtcclxuXHRcdFx0dGVbIDUgXSA9IGJmICogZCArIGFlO1xyXG5cdFx0XHR0ZVsgOSBdID0gYWYgKiBkIC0gYmU7XHJcblxyXG5cdFx0XHR0ZVsgMiBdID0gLSBkO1xyXG5cdFx0XHR0ZVsgNiBdID0gYiAqIGM7XHJcblx0XHRcdHRlWyAxMCBdID0gYSAqIGM7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggZXVsZXIub3JkZXIgPT09ICdZWlgnICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYWMgPSBhICogYywgYWQgPSBhICogZCwgYmMgPSBiICogYywgYmQgPSBiICogZDtcclxuXHJcblx0XHRcdHRlWyAwIF0gPSBjICogZTtcclxuXHRcdFx0dGVbIDQgXSA9IGJkIC0gYWMgKiBmO1xyXG5cdFx0XHR0ZVsgOCBdID0gYmMgKiBmICsgYWQ7XHJcblxyXG5cdFx0XHR0ZVsgMSBdID0gZjtcclxuXHRcdFx0dGVbIDUgXSA9IGEgKiBlO1xyXG5cdFx0XHR0ZVsgOSBdID0gLSBiICogZTtcclxuXHJcblx0XHRcdHRlWyAyIF0gPSAtIGQgKiBlO1xyXG5cdFx0XHR0ZVsgNiBdID0gYWQgKiBmICsgYmM7XHJcblx0XHRcdHRlWyAxMCBdID0gYWMgLSBiZCAqIGY7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggZXVsZXIub3JkZXIgPT09ICdYWlknICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYWMgPSBhICogYywgYWQgPSBhICogZCwgYmMgPSBiICogYywgYmQgPSBiICogZDtcclxuXHJcblx0XHRcdHRlWyAwIF0gPSBjICogZTtcclxuXHRcdFx0dGVbIDQgXSA9IC0gZjtcclxuXHRcdFx0dGVbIDggXSA9IGQgKiBlO1xyXG5cclxuXHRcdFx0dGVbIDEgXSA9IGFjICogZiArIGJkO1xyXG5cdFx0XHR0ZVsgNSBdID0gYSAqIGU7XHJcblx0XHRcdHRlWyA5IF0gPSBhZCAqIGYgLSBiYztcclxuXHJcblx0XHRcdHRlWyAyIF0gPSBiYyAqIGYgLSBhZDtcclxuXHRcdFx0dGVbIDYgXSA9IGIgKiBlO1xyXG5cdFx0XHR0ZVsgMTAgXSA9IGJkICogZiArIGFjO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBib3R0b20gcm93XHJcblx0XHR0ZVsgMyBdID0gMDtcclxuXHRcdHRlWyA3IF0gPSAwO1xyXG5cdFx0dGVbIDExIF0gPSAwO1xyXG5cclxuXHRcdC8vIGxhc3QgY29sdW1uXHJcblx0XHR0ZVsgMTIgXSA9IDA7XHJcblx0XHR0ZVsgMTMgXSA9IDA7XHJcblx0XHR0ZVsgMTQgXSA9IDA7XHJcblx0XHR0ZVsgMTUgXSA9IDE7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgcm90YXRpb24gY29tcG9uZW50IG9mIHRoaXMgbWF0cml4IHRvIHRoZSByb3RhdGlvbiBzcGVjaWZpZWQgYnlcclxuXHQgKiB0aGUgZ2l2ZW4gUXVhdGVybmlvbiBhcyBvdXRsaW5lZCBbaGVyZV17QGxpbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUm90YXRpb25fbWF0cml4I1F1YXRlcm5pb259XHJcblx0ICogVGhlIHJlc3Qgb2YgdGhlIG1hdHJpeCBpcyBzZXQgdG8gdGhlIGlkZW50aXR5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtRdWF0ZXJuaW9ufSBxIC0gVGhlIFF1YXRlcm5pb24uXHJcblx0ICogQHJldHVybiB7TWF0cml4NH0gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0bWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24oIHEgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuY29tcG9zZSggX3plcm8sIHEsIF9vbmUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSByb3RhdGlvbiBjb21wb25lbnQgb2YgdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCwgbG9va2luZyBmcm9tIGBleWVgIHRvd2FyZHNcclxuXHQgKiBgdGFyZ2V0YCwgYW5kIG9yaWVudGVkIGJ5IHRoZSB1cC1kaXJlY3Rpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IGV5ZSAtIFRoZSBleWUgdmVjdG9yLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdGFyZ2V0IC0gVGhlIHRhcmdldCB2ZWN0b3IuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB1cCAtIFRoZSB1cCB2ZWN0b3IuXHJcblx0ICogQHJldHVybiB7TWF0cml4NH0gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0bG9va0F0KCBleWUsIHRhcmdldCwgdXAgKSB7XHJcblxyXG5cdFx0Y29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzO1xyXG5cclxuXHRcdF96LnN1YlZlY3RvcnMoIGV5ZSwgdGFyZ2V0ICk7XHJcblxyXG5cdFx0aWYgKCBfei5sZW5ndGhTcSgpID09PSAwICkge1xyXG5cclxuXHRcdFx0Ly8gZXllIGFuZCB0YXJnZXQgYXJlIGluIHRoZSBzYW1lIHBvc2l0aW9uXHJcblxyXG5cdFx0XHRfei56ID0gMTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0X3oubm9ybWFsaXplKCk7XHJcblx0XHRfeC5jcm9zc1ZlY3RvcnMoIHVwLCBfeiApO1xyXG5cclxuXHRcdGlmICggX3gubGVuZ3RoU3EoKSA9PT0gMCApIHtcclxuXHJcblx0XHRcdC8vIHVwIGFuZCB6IGFyZSBwYXJhbGxlbFxyXG5cclxuXHRcdFx0aWYgKCBNYXRoLmFicyggdXAueiApID09PSAxICkge1xyXG5cclxuXHRcdFx0XHRfei54ICs9IDAuMDAwMTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdF96LnogKz0gMC4wMDAxO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0X3oubm9ybWFsaXplKCk7XHJcblx0XHRcdF94LmNyb3NzVmVjdG9ycyggdXAsIF96ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdF94Lm5vcm1hbGl6ZSgpO1xyXG5cdFx0X3kuY3Jvc3NWZWN0b3JzKCBfeiwgX3ggKTtcclxuXHJcblx0XHR0ZVsgMCBdID0gX3gueDsgdGVbIDQgXSA9IF95Lng7IHRlWyA4IF0gPSBfei54O1xyXG5cdFx0dGVbIDEgXSA9IF94Lnk7IHRlWyA1IF0gPSBfeS55OyB0ZVsgOSBdID0gX3oueTtcclxuXHRcdHRlWyAyIF0gPSBfeC56OyB0ZVsgNiBdID0gX3kuejsgdGVbIDEwIF0gPSBfei56O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBvc3QtbXVsdGlwbGllcyB0aGlzIG1hdHJpeCBieSB0aGUgZ2l2ZW4gNHg0IG1hdHJpeC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4NH0gbSAtIFRoZSBtYXRyaXggdG8gbXVsdGlwbHkgd2l0aC5cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXg0fSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRtdWx0aXBseSggbSApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKCB0aGlzLCBtICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUHJlLW11bHRpcGxpZXMgdGhpcyBtYXRyaXggYnkgdGhlIGdpdmVuIDR4NCBtYXRyaXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDR9IG0gLSBUaGUgbWF0cml4IHRvIG11bHRpcGx5IHdpdGguXHJcblx0ICogQHJldHVybiB7TWF0cml4NH0gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0cHJlbXVsdGlwbHkoIG0gKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyggbSwgdGhpcyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE11bHRpcGxlcyB0aGUgZ2l2ZW4gNHg0IG1hdHJpY2VzIGFuZCBzdG9yZXMgdGhlIHJlc3VsdFxyXG5cdCAqIGluIHRoaXMgbWF0cml4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRyaXg0fSBhIC0gVGhlIGZpcnN0IG1hdHJpeC5cclxuXHQgKiBAcGFyYW0ge01hdHJpeDR9IGIgLSBUaGUgc2Vjb25kIG1hdHJpeC5cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXg0fSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRtdWx0aXBseU1hdHJpY2VzKCBhLCBiICkge1xyXG5cclxuXHRcdGNvbnN0IGFlID0gYS5lbGVtZW50cztcclxuXHRcdGNvbnN0IGJlID0gYi5lbGVtZW50cztcclxuXHRcdGNvbnN0IHRlID0gdGhpcy5lbGVtZW50cztcclxuXHJcblx0XHRjb25zdCBhMTEgPSBhZVsgMCBdLCBhMTIgPSBhZVsgNCBdLCBhMTMgPSBhZVsgOCBdLCBhMTQgPSBhZVsgMTIgXTtcclxuXHRcdGNvbnN0IGEyMSA9IGFlWyAxIF0sIGEyMiA9IGFlWyA1IF0sIGEyMyA9IGFlWyA5IF0sIGEyNCA9IGFlWyAxMyBdO1xyXG5cdFx0Y29uc3QgYTMxID0gYWVbIDIgXSwgYTMyID0gYWVbIDYgXSwgYTMzID0gYWVbIDEwIF0sIGEzNCA9IGFlWyAxNCBdO1xyXG5cdFx0Y29uc3QgYTQxID0gYWVbIDMgXSwgYTQyID0gYWVbIDcgXSwgYTQzID0gYWVbIDExIF0sIGE0NCA9IGFlWyAxNSBdO1xyXG5cclxuXHRcdGNvbnN0IGIxMSA9IGJlWyAwIF0sIGIxMiA9IGJlWyA0IF0sIGIxMyA9IGJlWyA4IF0sIGIxNCA9IGJlWyAxMiBdO1xyXG5cdFx0Y29uc3QgYjIxID0gYmVbIDEgXSwgYjIyID0gYmVbIDUgXSwgYjIzID0gYmVbIDkgXSwgYjI0ID0gYmVbIDEzIF07XHJcblx0XHRjb25zdCBiMzEgPSBiZVsgMiBdLCBiMzIgPSBiZVsgNiBdLCBiMzMgPSBiZVsgMTAgXSwgYjM0ID0gYmVbIDE0IF07XHJcblx0XHRjb25zdCBiNDEgPSBiZVsgMyBdLCBiNDIgPSBiZVsgNyBdLCBiNDMgPSBiZVsgMTEgXSwgYjQ0ID0gYmVbIDE1IF07XHJcblxyXG5cdFx0dGVbIDAgXSA9IGExMSAqIGIxMSArIGExMiAqIGIyMSArIGExMyAqIGIzMSArIGExNCAqIGI0MTtcclxuXHRcdHRlWyA0IF0gPSBhMTEgKiBiMTIgKyBhMTIgKiBiMjIgKyBhMTMgKiBiMzIgKyBhMTQgKiBiNDI7XHJcblx0XHR0ZVsgOCBdID0gYTExICogYjEzICsgYTEyICogYjIzICsgYTEzICogYjMzICsgYTE0ICogYjQzO1xyXG5cdFx0dGVbIDEyIF0gPSBhMTEgKiBiMTQgKyBhMTIgKiBiMjQgKyBhMTMgKiBiMzQgKyBhMTQgKiBiNDQ7XHJcblxyXG5cdFx0dGVbIDEgXSA9IGEyMSAqIGIxMSArIGEyMiAqIGIyMSArIGEyMyAqIGIzMSArIGEyNCAqIGI0MTtcclxuXHRcdHRlWyA1IF0gPSBhMjEgKiBiMTIgKyBhMjIgKiBiMjIgKyBhMjMgKiBiMzIgKyBhMjQgKiBiNDI7XHJcblx0XHR0ZVsgOSBdID0gYTIxICogYjEzICsgYTIyICogYjIzICsgYTIzICogYjMzICsgYTI0ICogYjQzO1xyXG5cdFx0dGVbIDEzIF0gPSBhMjEgKiBiMTQgKyBhMjIgKiBiMjQgKyBhMjMgKiBiMzQgKyBhMjQgKiBiNDQ7XHJcblxyXG5cdFx0dGVbIDIgXSA9IGEzMSAqIGIxMSArIGEzMiAqIGIyMSArIGEzMyAqIGIzMSArIGEzNCAqIGI0MTtcclxuXHRcdHRlWyA2IF0gPSBhMzEgKiBiMTIgKyBhMzIgKiBiMjIgKyBhMzMgKiBiMzIgKyBhMzQgKiBiNDI7XHJcblx0XHR0ZVsgMTAgXSA9IGEzMSAqIGIxMyArIGEzMiAqIGIyMyArIGEzMyAqIGIzMyArIGEzNCAqIGI0MztcclxuXHRcdHRlWyAxNCBdID0gYTMxICogYjE0ICsgYTMyICogYjI0ICsgYTMzICogYjM0ICsgYTM0ICogYjQ0O1xyXG5cclxuXHRcdHRlWyAzIF0gPSBhNDEgKiBiMTEgKyBhNDIgKiBiMjEgKyBhNDMgKiBiMzEgKyBhNDQgKiBiNDE7XHJcblx0XHR0ZVsgNyBdID0gYTQxICogYjEyICsgYTQyICogYjIyICsgYTQzICogYjMyICsgYTQ0ICogYjQyO1xyXG5cdFx0dGVbIDExIF0gPSBhNDEgKiBiMTMgKyBhNDIgKiBiMjMgKyBhNDMgKiBiMzMgKyBhNDQgKiBiNDM7XHJcblx0XHR0ZVsgMTUgXSA9IGE0MSAqIGIxNCArIGE0MiAqIGIyNCArIGE0MyAqIGIzNCArIGE0NCAqIGI0NDtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBNdWx0aXBsaWVzIGV2ZXJ5IGNvbXBvbmVudCBvZiB0aGUgbWF0cml4IGJ5IHRoZSBnaXZlbiBzY2FsYXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gcyAtIFRoZSBzY2FsYXIuXHJcblx0ICogQHJldHVybiB7TWF0cml4NH0gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0bXVsdGlwbHlTY2FsYXIoIHMgKSB7XHJcblxyXG5cdFx0Y29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzO1xyXG5cclxuXHRcdHRlWyAwIF0gKj0gczsgdGVbIDQgXSAqPSBzOyB0ZVsgOCBdICo9IHM7IHRlWyAxMiBdICo9IHM7XHJcblx0XHR0ZVsgMSBdICo9IHM7IHRlWyA1IF0gKj0gczsgdGVbIDkgXSAqPSBzOyB0ZVsgMTMgXSAqPSBzO1xyXG5cdFx0dGVbIDIgXSAqPSBzOyB0ZVsgNiBdICo9IHM7IHRlWyAxMCBdICo9IHM7IHRlWyAxNCBdICo9IHM7XHJcblx0XHR0ZVsgMyBdICo9IHM7IHRlWyA3IF0gKj0gczsgdGVbIDExIF0gKj0gczsgdGVbIDE1IF0gKj0gcztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyBhbmQgcmV0dXJucyB0aGUgZGV0ZXJtaW5hbnQgb2YgdGhpcyBtYXRyaXguXHJcblx0ICpcclxuXHQgKiBCYXNlZCBvbiB0aGUgbWV0aG9kIG91dGxpbmVkIFtoZXJlXXtAbGluayBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9hbGdlYnJhL21hdHJpeC9mdW5jdGlvbnMvaW52ZXJzZS9mb3VyRC9pbmRleC5odG1sfS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGRldGVybWluYW50LlxyXG5cdCAqL1xyXG5cdGRldGVybWluYW50KCkge1xyXG5cclxuXHRcdGNvbnN0IHRlID0gdGhpcy5lbGVtZW50cztcclxuXHJcblx0XHRjb25zdCBuMTEgPSB0ZVsgMCBdLCBuMTIgPSB0ZVsgNCBdLCBuMTMgPSB0ZVsgOCBdLCBuMTQgPSB0ZVsgMTIgXTtcclxuXHRcdGNvbnN0IG4yMSA9IHRlWyAxIF0sIG4yMiA9IHRlWyA1IF0sIG4yMyA9IHRlWyA5IF0sIG4yNCA9IHRlWyAxMyBdO1xyXG5cdFx0Y29uc3QgbjMxID0gdGVbIDIgXSwgbjMyID0gdGVbIDYgXSwgbjMzID0gdGVbIDEwIF0sIG4zNCA9IHRlWyAxNCBdO1xyXG5cdFx0Y29uc3QgbjQxID0gdGVbIDMgXSwgbjQyID0gdGVbIDcgXSwgbjQzID0gdGVbIDExIF0sIG40NCA9IHRlWyAxNSBdO1xyXG5cclxuXHRcdC8vVE9ETzogbWFrZSB0aGlzIG1vcmUgZWZmaWNpZW50XHJcblxyXG5cdFx0cmV0dXJuIChcclxuXHRcdFx0bjQxICogKFxyXG5cdFx0XHRcdCsgbjE0ICogbjIzICogbjMyXHJcblx0XHRcdFx0IC0gbjEzICogbjI0ICogbjMyXHJcblx0XHRcdFx0IC0gbjE0ICogbjIyICogbjMzXHJcblx0XHRcdFx0ICsgbjEyICogbjI0ICogbjMzXHJcblx0XHRcdFx0ICsgbjEzICogbjIyICogbjM0XHJcblx0XHRcdFx0IC0gbjEyICogbjIzICogbjM0XHJcblx0XHRcdCkgK1xyXG5cdFx0XHRuNDIgKiAoXHJcblx0XHRcdFx0KyBuMTEgKiBuMjMgKiBuMzRcclxuXHRcdFx0XHQgLSBuMTEgKiBuMjQgKiBuMzNcclxuXHRcdFx0XHQgKyBuMTQgKiBuMjEgKiBuMzNcclxuXHRcdFx0XHQgLSBuMTMgKiBuMjEgKiBuMzRcclxuXHRcdFx0XHQgKyBuMTMgKiBuMjQgKiBuMzFcclxuXHRcdFx0XHQgLSBuMTQgKiBuMjMgKiBuMzFcclxuXHRcdFx0KSArXHJcblx0XHRcdG40MyAqIChcclxuXHRcdFx0XHQrIG4xMSAqIG4yNCAqIG4zMlxyXG5cdFx0XHRcdCAtIG4xMSAqIG4yMiAqIG4zNFxyXG5cdFx0XHRcdCAtIG4xNCAqIG4yMSAqIG4zMlxyXG5cdFx0XHRcdCArIG4xMiAqIG4yMSAqIG4zNFxyXG5cdFx0XHRcdCArIG4xNCAqIG4yMiAqIG4zMVxyXG5cdFx0XHRcdCAtIG4xMiAqIG4yNCAqIG4zMVxyXG5cdFx0XHQpICtcclxuXHRcdFx0bjQ0ICogKFxyXG5cdFx0XHRcdC0gbjEzICogbjIyICogbjMxXHJcblx0XHRcdFx0IC0gbjExICogbjIzICogbjMyXHJcblx0XHRcdFx0ICsgbjExICogbjIyICogbjMzXHJcblx0XHRcdFx0ICsgbjEzICogbjIxICogbjMyXHJcblx0XHRcdFx0IC0gbjEyICogbjIxICogbjMzXHJcblx0XHRcdFx0ICsgbjEyICogbjIzICogbjMxXHJcblx0XHRcdClcclxuXHJcblx0XHQpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRyYW5zcG9zZXMgdGhpcyBtYXRyaXggaW4gcGxhY2UuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtNYXRyaXg0fSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHR0cmFuc3Bvc2UoKSB7XHJcblxyXG5cdFx0Y29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzO1xyXG5cdFx0bGV0IHRtcDtcclxuXHJcblx0XHR0bXAgPSB0ZVsgMSBdOyB0ZVsgMSBdID0gdGVbIDQgXTsgdGVbIDQgXSA9IHRtcDtcclxuXHRcdHRtcCA9IHRlWyAyIF07IHRlWyAyIF0gPSB0ZVsgOCBdOyB0ZVsgOCBdID0gdG1wO1xyXG5cdFx0dG1wID0gdGVbIDYgXTsgdGVbIDYgXSA9IHRlWyA5IF07IHRlWyA5IF0gPSB0bXA7XHJcblxyXG5cdFx0dG1wID0gdGVbIDMgXTsgdGVbIDMgXSA9IHRlWyAxMiBdOyB0ZVsgMTIgXSA9IHRtcDtcclxuXHRcdHRtcCA9IHRlWyA3IF07IHRlWyA3IF0gPSB0ZVsgMTMgXTsgdGVbIDEzIF0gPSB0bXA7XHJcblx0XHR0bXAgPSB0ZVsgMTEgXTsgdGVbIDExIF0gPSB0ZVsgMTQgXTsgdGVbIDE0IF0gPSB0bXA7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgcG9zaXRpb24gY29tcG9uZW50IGZvciB0aGlzIG1hdHJpeCBmcm9tIHRoZSBnaXZlbiB2ZWN0b3IsXHJcblx0ICogd2l0aG91dCBhZmZlY3RpbmcgdGhlIHJlc3Qgb2YgdGhlIG1hdHJpeC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfFZlY3RvcjN9IHggLSBUaGUgeCBjb21wb25lbnQgb2YgdGhlIHZlY3RvciBvciBhbHRlcm5hdGl2ZWx5IHRoZSB2ZWN0b3Igb2JqZWN0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHkgY29tcG9uZW50IG9mIHRoZSB2ZWN0b3IuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHogLSBUaGUgeiBjb21wb25lbnQgb2YgdGhlIHZlY3Rvci5cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXg0fSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRzZXRQb3NpdGlvbiggeCwgeSwgeiApIHtcclxuXHJcblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XHJcblxyXG5cdFx0aWYgKCB4LmlzVmVjdG9yMyApIHtcclxuXHJcblx0XHRcdHRlWyAxMiBdID0geC54O1xyXG5cdFx0XHR0ZVsgMTMgXSA9IHgueTtcclxuXHRcdFx0dGVbIDE0IF0gPSB4Lno7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHRlWyAxMiBdID0geDtcclxuXHRcdFx0dGVbIDEzIF0gPSB5O1xyXG5cdFx0XHR0ZVsgMTQgXSA9IHo7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEludmVydHMgdGhpcyBtYXRyaXgsIHVzaW5nIHRoZSBbYW5hbHl0aWMgbWV0aG9kXXtAbGluayBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JbnZlcnRpYmxlX21hdHJpeCNBbmFseXRpY19zb2x1dGlvbn0uXHJcblx0ICogWW91IGNhbiBub3QgaW52ZXJ0IHdpdGggYSBkZXRlcm1pbmFudCBvZiB6ZXJvLiBJZiB5b3UgYXR0ZW1wdCB0aGlzLCB0aGUgbWV0aG9kIHByb2R1Y2VzXHJcblx0ICogYSB6ZXJvIG1hdHJpeCBpbnN0ZWFkLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7TWF0cml4NH0gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0aW52ZXJ0KCkge1xyXG5cclxuXHRcdC8vIGJhc2VkIG9uIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2FsZ2VicmEvbWF0cml4L2Z1bmN0aW9ucy9pbnZlcnNlL2ZvdXJEL2luZGV4Lmh0bVxyXG5cdFx0Y29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzLFxyXG5cclxuXHRcdFx0bjExID0gdGVbIDAgXSwgbjIxID0gdGVbIDEgXSwgbjMxID0gdGVbIDIgXSwgbjQxID0gdGVbIDMgXSxcclxuXHRcdFx0bjEyID0gdGVbIDQgXSwgbjIyID0gdGVbIDUgXSwgbjMyID0gdGVbIDYgXSwgbjQyID0gdGVbIDcgXSxcclxuXHRcdFx0bjEzID0gdGVbIDggXSwgbjIzID0gdGVbIDkgXSwgbjMzID0gdGVbIDEwIF0sIG40MyA9IHRlWyAxMSBdLFxyXG5cdFx0XHRuMTQgPSB0ZVsgMTIgXSwgbjI0ID0gdGVbIDEzIF0sIG4zNCA9IHRlWyAxNCBdLCBuNDQgPSB0ZVsgMTUgXSxcclxuXHJcblx0XHRcdHQxMSA9IG4yMyAqIG4zNCAqIG40MiAtIG4yNCAqIG4zMyAqIG40MiArIG4yNCAqIG4zMiAqIG40MyAtIG4yMiAqIG4zNCAqIG40MyAtIG4yMyAqIG4zMiAqIG40NCArIG4yMiAqIG4zMyAqIG40NCxcclxuXHRcdFx0dDEyID0gbjE0ICogbjMzICogbjQyIC0gbjEzICogbjM0ICogbjQyIC0gbjE0ICogbjMyICogbjQzICsgbjEyICogbjM0ICogbjQzICsgbjEzICogbjMyICogbjQ0IC0gbjEyICogbjMzICogbjQ0LFxyXG5cdFx0XHR0MTMgPSBuMTMgKiBuMjQgKiBuNDIgLSBuMTQgKiBuMjMgKiBuNDIgKyBuMTQgKiBuMjIgKiBuNDMgLSBuMTIgKiBuMjQgKiBuNDMgLSBuMTMgKiBuMjIgKiBuNDQgKyBuMTIgKiBuMjMgKiBuNDQsXHJcblx0XHRcdHQxNCA9IG4xNCAqIG4yMyAqIG4zMiAtIG4xMyAqIG4yNCAqIG4zMiAtIG4xNCAqIG4yMiAqIG4zMyArIG4xMiAqIG4yNCAqIG4zMyArIG4xMyAqIG4yMiAqIG4zNCAtIG4xMiAqIG4yMyAqIG4zNDtcclxuXHJcblx0XHRjb25zdCBkZXQgPSBuMTEgKiB0MTEgKyBuMjEgKiB0MTIgKyBuMzEgKiB0MTMgKyBuNDEgKiB0MTQ7XHJcblxyXG5cdFx0aWYgKCBkZXQgPT09IDAgKSByZXR1cm4gdGhpcy5zZXQoIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgKTtcclxuXHJcblx0XHRjb25zdCBkZXRJbnYgPSAxIC8gZGV0O1xyXG5cclxuXHRcdHRlWyAwIF0gPSB0MTEgKiBkZXRJbnY7XHJcblx0XHR0ZVsgMSBdID0gKCBuMjQgKiBuMzMgKiBuNDEgLSBuMjMgKiBuMzQgKiBuNDEgLSBuMjQgKiBuMzEgKiBuNDMgKyBuMjEgKiBuMzQgKiBuNDMgKyBuMjMgKiBuMzEgKiBuNDQgLSBuMjEgKiBuMzMgKiBuNDQgKSAqIGRldEludjtcclxuXHRcdHRlWyAyIF0gPSAoIG4yMiAqIG4zNCAqIG40MSAtIG4yNCAqIG4zMiAqIG40MSArIG4yNCAqIG4zMSAqIG40MiAtIG4yMSAqIG4zNCAqIG40MiAtIG4yMiAqIG4zMSAqIG40NCArIG4yMSAqIG4zMiAqIG40NCApICogZGV0SW52O1xyXG5cdFx0dGVbIDMgXSA9ICggbjIzICogbjMyICogbjQxIC0gbjIyICogbjMzICogbjQxIC0gbjIzICogbjMxICogbjQyICsgbjIxICogbjMzICogbjQyICsgbjIyICogbjMxICogbjQzIC0gbjIxICogbjMyICogbjQzICkgKiBkZXRJbnY7XHJcblxyXG5cdFx0dGVbIDQgXSA9IHQxMiAqIGRldEludjtcclxuXHRcdHRlWyA1IF0gPSAoIG4xMyAqIG4zNCAqIG40MSAtIG4xNCAqIG4zMyAqIG40MSArIG4xNCAqIG4zMSAqIG40MyAtIG4xMSAqIG4zNCAqIG40MyAtIG4xMyAqIG4zMSAqIG40NCArIG4xMSAqIG4zMyAqIG40NCApICogZGV0SW52O1xyXG5cdFx0dGVbIDYgXSA9ICggbjE0ICogbjMyICogbjQxIC0gbjEyICogbjM0ICogbjQxIC0gbjE0ICogbjMxICogbjQyICsgbjExICogbjM0ICogbjQyICsgbjEyICogbjMxICogbjQ0IC0gbjExICogbjMyICogbjQ0ICkgKiBkZXRJbnY7XHJcblx0XHR0ZVsgNyBdID0gKCBuMTIgKiBuMzMgKiBuNDEgLSBuMTMgKiBuMzIgKiBuNDEgKyBuMTMgKiBuMzEgKiBuNDIgLSBuMTEgKiBuMzMgKiBuNDIgLSBuMTIgKiBuMzEgKiBuNDMgKyBuMTEgKiBuMzIgKiBuNDMgKSAqIGRldEludjtcclxuXHJcblx0XHR0ZVsgOCBdID0gdDEzICogZGV0SW52O1xyXG5cdFx0dGVbIDkgXSA9ICggbjE0ICogbjIzICogbjQxIC0gbjEzICogbjI0ICogbjQxIC0gbjE0ICogbjIxICogbjQzICsgbjExICogbjI0ICogbjQzICsgbjEzICogbjIxICogbjQ0IC0gbjExICogbjIzICogbjQ0ICkgKiBkZXRJbnY7XHJcblx0XHR0ZVsgMTAgXSA9ICggbjEyICogbjI0ICogbjQxIC0gbjE0ICogbjIyICogbjQxICsgbjE0ICogbjIxICogbjQyIC0gbjExICogbjI0ICogbjQyIC0gbjEyICogbjIxICogbjQ0ICsgbjExICogbjIyICogbjQ0ICkgKiBkZXRJbnY7XHJcblx0XHR0ZVsgMTEgXSA9ICggbjEzICogbjIyICogbjQxIC0gbjEyICogbjIzICogbjQxIC0gbjEzICogbjIxICogbjQyICsgbjExICogbjIzICogbjQyICsgbjEyICogbjIxICogbjQzIC0gbjExICogbjIyICogbjQzICkgKiBkZXRJbnY7XHJcblxyXG5cdFx0dGVbIDEyIF0gPSB0MTQgKiBkZXRJbnY7XHJcblx0XHR0ZVsgMTMgXSA9ICggbjEzICogbjI0ICogbjMxIC0gbjE0ICogbjIzICogbjMxICsgbjE0ICogbjIxICogbjMzIC0gbjExICogbjI0ICogbjMzIC0gbjEzICogbjIxICogbjM0ICsgbjExICogbjIzICogbjM0ICkgKiBkZXRJbnY7XHJcblx0XHR0ZVsgMTQgXSA9ICggbjE0ICogbjIyICogbjMxIC0gbjEyICogbjI0ICogbjMxIC0gbjE0ICogbjIxICogbjMyICsgbjExICogbjI0ICogbjMyICsgbjEyICogbjIxICogbjM0IC0gbjExICogbjIyICogbjM0ICkgKiBkZXRJbnY7XHJcblx0XHR0ZVsgMTUgXSA9ICggbjEyICogbjIzICogbjMxIC0gbjEzICogbjIyICogbjMxICsgbjEzICogbjIxICogbjMyIC0gbjExICogbjIzICogbjMyIC0gbjEyICogbjIxICogbjMzICsgbjExICogbjIyICogbjMzICkgKiBkZXRJbnY7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTXVsdGlwbGllcyB0aGUgY29sdW1ucyBvZiB0aGlzIG1hdHJpeCBieSB0aGUgZ2l2ZW4gdmVjdG9yLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB2IC0gVGhlIHNjYWxlIHZlY3Rvci5cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXg0fSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRzY2FsZSggdiApIHtcclxuXHJcblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XHJcblx0XHRjb25zdCB4ID0gdi54LCB5ID0gdi55LCB6ID0gdi56O1xyXG5cclxuXHRcdHRlWyAwIF0gKj0geDsgdGVbIDQgXSAqPSB5OyB0ZVsgOCBdICo9IHo7XHJcblx0XHR0ZVsgMSBdICo9IHg7IHRlWyA1IF0gKj0geTsgdGVbIDkgXSAqPSB6O1xyXG5cdFx0dGVbIDIgXSAqPSB4OyB0ZVsgNiBdICo9IHk7IHRlWyAxMCBdICo9IHo7XHJcblx0XHR0ZVsgMyBdICo9IHg7IHRlWyA3IF0gKj0geTsgdGVbIDExIF0gKj0gejtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZXRzIHRoZSBtYXhpbXVtIHNjYWxlIHZhbHVlIG9mIHRoZSB0aHJlZSBheGVzLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgbWF4aW11bSBzY2FsZS5cclxuXHQgKi9cclxuXHRnZXRNYXhTY2FsZU9uQXhpcygpIHtcclxuXHJcblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XHJcblxyXG5cdFx0Y29uc3Qgc2NhbGVYU3EgPSB0ZVsgMCBdICogdGVbIDAgXSArIHRlWyAxIF0gKiB0ZVsgMSBdICsgdGVbIDIgXSAqIHRlWyAyIF07XHJcblx0XHRjb25zdCBzY2FsZVlTcSA9IHRlWyA0IF0gKiB0ZVsgNCBdICsgdGVbIDUgXSAqIHRlWyA1IF0gKyB0ZVsgNiBdICogdGVbIDYgXTtcclxuXHRcdGNvbnN0IHNjYWxlWlNxID0gdGVbIDggXSAqIHRlWyA4IF0gKyB0ZVsgOSBdICogdGVbIDkgXSArIHRlWyAxMCBdICogdGVbIDEwIF07XHJcblxyXG5cdFx0cmV0dXJuIE1hdGguc3FydCggTWF0aC5tYXgoIHNjYWxlWFNxLCBzY2FsZVlTcSwgc2NhbGVaU3EgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhpcyBtYXRyaXggYXMgYSB0cmFuc2xhdGlvbiB0cmFuc2Zvcm0gZnJvbSB0aGUgZ2l2ZW4gdmVjdG9yLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ8VmVjdG9yM30geCAtIFRoZSBhbW91bnQgdG8gdHJhbnNsYXRlIGluIHRoZSBYIGF4aXMgb3IgYWx0ZXJuYXRpdmVseSBhIHRyYW5zbGF0aW9uIHZlY3Rvci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSBhbW91bnQgdG8gdHJhbnNsYXRlIGluIHRoZSBZIGF4aXMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHogLSBUaGUgYW1vdW50IHRvIHRyYW5zbGF0ZSBpbiB0aGUgeiBheGlzLlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdG1ha2VUcmFuc2xhdGlvbiggeCwgeSwgeiApIHtcclxuXHJcblx0XHRpZiAoIHguaXNWZWN0b3IzICkge1xyXG5cclxuXHRcdFx0dGhpcy5zZXQoXHJcblxyXG5cdFx0XHRcdDEsIDAsIDAsIHgueCxcclxuXHRcdFx0XHQwLCAxLCAwLCB4LnksXHJcblx0XHRcdFx0MCwgMCwgMSwgeC56LFxyXG5cdFx0XHRcdDAsIDAsIDAsIDFcclxuXHJcblx0XHRcdCk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHRoaXMuc2V0KFxyXG5cclxuXHRcdFx0XHQxLCAwLCAwLCB4LFxyXG5cdFx0XHRcdDAsIDEsIDAsIHksXHJcblx0XHRcdFx0MCwgMCwgMSwgeixcclxuXHRcdFx0XHQwLCAwLCAwLCAxXHJcblxyXG5cdFx0XHQpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoaXMgbWF0cml4IGFzIGEgcm90YXRpb25hbCB0cmFuc2Zvcm1hdGlvbiBhcm91bmQgdGhlIFggYXhpcyBieVxyXG5cdCAqIHRoZSBnaXZlbiBhbmdsZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0aGV0YSAtIFRoZSByb3RhdGlvbiBpbiByYWRpYW5zLlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdG1ha2VSb3RhdGlvblgoIHRoZXRhICkge1xyXG5cclxuXHRcdGNvbnN0IGMgPSBNYXRoLmNvcyggdGhldGEgKSwgcyA9IE1hdGguc2luKCB0aGV0YSApO1xyXG5cclxuXHRcdHRoaXMuc2V0KFxyXG5cclxuXHRcdFx0MSwgMCwgMCwgMCxcclxuXHRcdFx0MCwgYywgLSBzLCAwLFxyXG5cdFx0XHQwLCBzLCBjLCAwLFxyXG5cdFx0XHQwLCAwLCAwLCAxXHJcblxyXG5cdFx0KTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoaXMgbWF0cml4IGFzIGEgcm90YXRpb25hbCB0cmFuc2Zvcm1hdGlvbiBhcm91bmQgdGhlIFkgYXhpcyBieVxyXG5cdCAqIHRoZSBnaXZlbiBhbmdsZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0aGV0YSAtIFRoZSByb3RhdGlvbiBpbiByYWRpYW5zLlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdG1ha2VSb3RhdGlvblkoIHRoZXRhICkge1xyXG5cclxuXHRcdGNvbnN0IGMgPSBNYXRoLmNvcyggdGhldGEgKSwgcyA9IE1hdGguc2luKCB0aGV0YSApO1xyXG5cclxuXHRcdHRoaXMuc2V0KFxyXG5cclxuXHRcdFx0IGMsIDAsIHMsIDAsXHJcblx0XHRcdCAwLCAxLCAwLCAwLFxyXG5cdFx0XHQtIHMsIDAsIGMsIDAsXHJcblx0XHRcdCAwLCAwLCAwLCAxXHJcblxyXG5cdFx0KTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoaXMgbWF0cml4IGFzIGEgcm90YXRpb25hbCB0cmFuc2Zvcm1hdGlvbiBhcm91bmQgdGhlIFogYXhpcyBieVxyXG5cdCAqIHRoZSBnaXZlbiBhbmdsZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0aGV0YSAtIFRoZSByb3RhdGlvbiBpbiByYWRpYW5zLlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdG1ha2VSb3RhdGlvblooIHRoZXRhICkge1xyXG5cclxuXHRcdGNvbnN0IGMgPSBNYXRoLmNvcyggdGhldGEgKSwgcyA9IE1hdGguc2luKCB0aGV0YSApO1xyXG5cclxuXHRcdHRoaXMuc2V0KFxyXG5cclxuXHRcdFx0YywgLSBzLCAwLCAwLFxyXG5cdFx0XHRzLCBjLCAwLCAwLFxyXG5cdFx0XHQwLCAwLCAxLCAwLFxyXG5cdFx0XHQwLCAwLCAwLCAxXHJcblxyXG5cdFx0KTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoaXMgbWF0cml4IGFzIGEgcm90YXRpb25hbCB0cmFuc2Zvcm1hdGlvbiBhcm91bmQgdGhlIGdpdmVuIGF4aXMgYnlcclxuXHQgKiB0aGUgZ2l2ZW4gYW5nbGUuXHJcblx0ICpcclxuXHQgKiBUaGlzIGlzIGEgc29tZXdoYXQgY29udHJvdmVyc2lhbCBidXQgbWF0aGVtYXRpY2FsbHkgc291bmQgYWx0ZXJuYXRpdmUgdG9cclxuXHQgKiByb3RhdGluZyB2aWEgUXVhdGVybmlvbnMuIFNlZSB0aGUgZGlzY3Vzc2lvbiBbaGVyZV17QGxpbmsgaHR0cHM6Ly93d3cuZ2FtZWRldi5uZXQvYXJ0aWNsZXMvcHJvZ3JhbW1pbmcvbWF0aC1hbmQtcGh5c2ljcy9kby13ZS1yZWFsbHktbmVlZC1xdWF0ZXJuaW9ucy1yMTE5OX0uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IGF4aXMgLSBUaGUgbm9ybWFsaXplZCByb3RhdGlvbiBheGlzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhbmdsZSAtIFRoZSByb3RhdGlvbiBpbiByYWRpYW5zLlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdG1ha2VSb3RhdGlvbkF4aXMoIGF4aXMsIGFuZ2xlICkge1xyXG5cclxuXHRcdC8vIEJhc2VkIG9uIGh0dHA6Ly93d3cuZ2FtZWRldi5uZXQvcmVmZXJlbmNlL2FydGljbGVzL2FydGljbGUxMTk5LmFzcFxyXG5cclxuXHRcdGNvbnN0IGMgPSBNYXRoLmNvcyggYW5nbGUgKTtcclxuXHRcdGNvbnN0IHMgPSBNYXRoLnNpbiggYW5nbGUgKTtcclxuXHRcdGNvbnN0IHQgPSAxIC0gYztcclxuXHRcdGNvbnN0IHggPSBheGlzLngsIHkgPSBheGlzLnksIHogPSBheGlzLno7XHJcblx0XHRjb25zdCB0eCA9IHQgKiB4LCB0eSA9IHQgKiB5O1xyXG5cclxuXHRcdHRoaXMuc2V0KFxyXG5cclxuXHRcdFx0dHggKiB4ICsgYywgdHggKiB5IC0gcyAqIHosIHR4ICogeiArIHMgKiB5LCAwLFxyXG5cdFx0XHR0eCAqIHkgKyBzICogeiwgdHkgKiB5ICsgYywgdHkgKiB6IC0gcyAqIHgsIDAsXHJcblx0XHRcdHR4ICogeiAtIHMgKiB5LCB0eSAqIHogKyBzICogeCwgdCAqIHogKiB6ICsgYywgMCxcclxuXHRcdFx0MCwgMCwgMCwgMVxyXG5cclxuXHRcdCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGlzIG1hdHJpeCBhcyBhIHNjYWxlIHRyYW5zZm9ybWF0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgYW1vdW50IHRvIHNjYWxlIGluIHRoZSBYIGF4aXMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgYW1vdW50IHRvIHNjYWxlIGluIHRoZSBZIGF4aXMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHogLSBUaGUgYW1vdW50IHRvIHNjYWxlIGluIHRoZSBaIGF4aXMuXHJcblx0ICogQHJldHVybiB7TWF0cml4NH0gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0bWFrZVNjYWxlKCB4LCB5LCB6ICkge1xyXG5cclxuXHRcdHRoaXMuc2V0KFxyXG5cclxuXHRcdFx0eCwgMCwgMCwgMCxcclxuXHRcdFx0MCwgeSwgMCwgMCxcclxuXHRcdFx0MCwgMCwgeiwgMCxcclxuXHRcdFx0MCwgMCwgMCwgMVxyXG5cclxuXHRcdCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGlzIG1hdHJpeCBhcyBhIHNoZWFyIHRyYW5zZm9ybWF0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHh5IC0gVGhlIGFtb3VudCB0byBzaGVhciBYIGJ5IFkuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHh6IC0gVGhlIGFtb3VudCB0byBzaGVhciBYIGJ5IFouXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHl4IC0gVGhlIGFtb3VudCB0byBzaGVhciBZIGJ5IFguXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHl6IC0gVGhlIGFtb3VudCB0byBzaGVhciBZIGJ5IFouXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHp4IC0gVGhlIGFtb3VudCB0byBzaGVhciBaIGJ5IFguXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHp5IC0gVGhlIGFtb3VudCB0byBzaGVhciBaIGJ5IFkuXHJcblx0ICogQHJldHVybiB7TWF0cml4NH0gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0bWFrZVNoZWFyKCB4eSwgeHosIHl4LCB5eiwgengsIHp5ICkge1xyXG5cclxuXHRcdHRoaXMuc2V0KFxyXG5cclxuXHRcdFx0MSwgeXgsIHp4LCAwLFxyXG5cdFx0XHR4eSwgMSwgenksIDAsXHJcblx0XHRcdHh6LCB5eiwgMSwgMCxcclxuXHRcdFx0MCwgMCwgMCwgMVxyXG5cclxuXHRcdCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGlzIG1hdHJpeCB0byB0aGUgdHJhbnNmb3JtYXRpb24gY29tcG9zZWQgb2YgdGhlIGdpdmVuIHBvc2l0aW9uLFxyXG5cdCAqIHJvdGF0aW9uIChRdWF0ZXJuaW9uKSBhbmQgc2NhbGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHBvc2l0aW9uIC0gVGhlIHBvc2l0aW9uIHZlY3Rvci5cclxuXHQgKiBAcGFyYW0ge1F1YXRlcm5pb259IHF1YXRlcm5pb24gLSBUaGUgcm90YXRpb24gYXMgYSBRdWF0ZXJuaW9uLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gc2NhbGUgLSBUaGUgc2NhbGUgdmVjdG9yLlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdGNvbXBvc2UoIHBvc2l0aW9uLCBxdWF0ZXJuaW9uLCBzY2FsZSApIHtcclxuXHJcblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XHJcblxyXG5cdFx0Y29uc3QgeCA9IHF1YXRlcm5pb24uX3gsIHkgPSBxdWF0ZXJuaW9uLl95LCB6ID0gcXVhdGVybmlvbi5feiwgdyA9IHF1YXRlcm5pb24uX3c7XHJcblx0XHRjb25zdCB4MiA9IHggKyB4LFx0eTIgPSB5ICsgeSwgejIgPSB6ICsgejtcclxuXHRcdGNvbnN0IHh4ID0geCAqIHgyLCB4eSA9IHggKiB5MiwgeHogPSB4ICogejI7XHJcblx0XHRjb25zdCB5eSA9IHkgKiB5MiwgeXogPSB5ICogejIsIHp6ID0geiAqIHoyO1xyXG5cdFx0Y29uc3Qgd3ggPSB3ICogeDIsIHd5ID0gdyAqIHkyLCB3eiA9IHcgKiB6MjtcclxuXHJcblx0XHRjb25zdCBzeCA9IHNjYWxlLngsIHN5ID0gc2NhbGUueSwgc3ogPSBzY2FsZS56O1xyXG5cclxuXHRcdHRlWyAwIF0gPSAoIDEgLSAoIHl5ICsgenogKSApICogc3g7XHJcblx0XHR0ZVsgMSBdID0gKCB4eSArIHd6ICkgKiBzeDtcclxuXHRcdHRlWyAyIF0gPSAoIHh6IC0gd3kgKSAqIHN4O1xyXG5cdFx0dGVbIDMgXSA9IDA7XHJcblxyXG5cdFx0dGVbIDQgXSA9ICggeHkgLSB3eiApICogc3k7XHJcblx0XHR0ZVsgNSBdID0gKCAxIC0gKCB4eCArIHp6ICkgKSAqIHN5O1xyXG5cdFx0dGVbIDYgXSA9ICggeXogKyB3eCApICogc3k7XHJcblx0XHR0ZVsgNyBdID0gMDtcclxuXHJcblx0XHR0ZVsgOCBdID0gKCB4eiArIHd5ICkgKiBzejtcclxuXHRcdHRlWyA5IF0gPSAoIHl6IC0gd3ggKSAqIHN6O1xyXG5cdFx0dGVbIDEwIF0gPSAoIDEgLSAoIHh4ICsgeXkgKSApICogc3o7XHJcblx0XHR0ZVsgMTEgXSA9IDA7XHJcblxyXG5cdFx0dGVbIDEyIF0gPSBwb3NpdGlvbi54O1xyXG5cdFx0dGVbIDEzIF0gPSBwb3NpdGlvbi55O1xyXG5cdFx0dGVbIDE0IF0gPSBwb3NpdGlvbi56O1xyXG5cdFx0dGVbIDE1IF0gPSAxO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlY29tcG9zZXMgdGhpcyBtYXRyaXggaW50byBpdHMgcG9zaXRpb24sIHJvdGF0aW9uIGFuZCBzY2FsZSBjb21wb25lbnRzXHJcblx0ICogYW5kIHByb3ZpZGVzIHRoZSByZXN1bHQgaW4gdGhlIGdpdmVuIG9iamVjdHMuXHJcblx0ICpcclxuXHQgKiBOb3RlOiBOb3QgYWxsIG1hdHJpY2VzIGFyZSBkZWNvbXBvc2FibGUgaW4gdGhpcyB3YXkuIEZvciBleGFtcGxlLCBpZiBhblxyXG5cdCAqIG9iamVjdCBoYXMgYSBub24tdW5pZm9ybWx5IHNjYWxlZCBwYXJlbnQsIHRoZW4gdGhlIG9iamVjdCdzIHdvcmxkIG1hdHJpeFxyXG5cdCAqIG1heSBub3QgYmUgZGVjb21wb3NhYmxlLCBhbmQgdGhpcyBtZXRob2QgbWF5IG5vdCBiZSBhcHByb3ByaWF0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gcG9zaXRpb24gLSBUaGUgcG9zaXRpb24gdmVjdG9yLlxyXG5cdCAqIEBwYXJhbSB7UXVhdGVybmlvbn0gcXVhdGVybmlvbiAtIFRoZSByb3RhdGlvbiBhcyBhIFF1YXRlcm5pb24uXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBzY2FsZSAtIFRoZSBzY2FsZSB2ZWN0b3IuXHJcblx0ICogQHJldHVybiB7TWF0cml4NH0gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0ZGVjb21wb3NlKCBwb3NpdGlvbiwgcXVhdGVybmlvbiwgc2NhbGUgKSB7XHJcblxyXG5cdFx0Y29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzO1xyXG5cclxuXHRcdGxldCBzeCA9IF92MS5zZXQoIHRlWyAwIF0sIHRlWyAxIF0sIHRlWyAyIF0gKS5sZW5ndGgoKTtcclxuXHRcdGNvbnN0IHN5ID0gX3YxLnNldCggdGVbIDQgXSwgdGVbIDUgXSwgdGVbIDYgXSApLmxlbmd0aCgpO1xyXG5cdFx0Y29uc3Qgc3ogPSBfdjEuc2V0KCB0ZVsgOCBdLCB0ZVsgOSBdLCB0ZVsgMTAgXSApLmxlbmd0aCgpO1xyXG5cclxuXHRcdC8vIGlmIGRldGVybWluZSBpcyBuZWdhdGl2ZSwgd2UgbmVlZCB0byBpbnZlcnQgb25lIHNjYWxlXHJcblx0XHRjb25zdCBkZXQgPSB0aGlzLmRldGVybWluYW50KCk7XHJcblx0XHRpZiAoIGRldCA8IDAgKSBzeCA9IC0gc3g7XHJcblxyXG5cdFx0cG9zaXRpb24ueCA9IHRlWyAxMiBdO1xyXG5cdFx0cG9zaXRpb24ueSA9IHRlWyAxMyBdO1xyXG5cdFx0cG9zaXRpb24ueiA9IHRlWyAxNCBdO1xyXG5cclxuXHRcdC8vIHNjYWxlIHRoZSByb3RhdGlvbiBwYXJ0XHJcblx0XHRfbTEuY29weSggdGhpcyApO1xyXG5cclxuXHRcdGNvbnN0IGludlNYID0gMSAvIHN4O1xyXG5cdFx0Y29uc3QgaW52U1kgPSAxIC8gc3k7XHJcblx0XHRjb25zdCBpbnZTWiA9IDEgLyBzejtcclxuXHJcblx0XHRfbTEuZWxlbWVudHNbIDAgXSAqPSBpbnZTWDtcclxuXHRcdF9tMS5lbGVtZW50c1sgMSBdICo9IGludlNYO1xyXG5cdFx0X20xLmVsZW1lbnRzWyAyIF0gKj0gaW52U1g7XHJcblxyXG5cdFx0X20xLmVsZW1lbnRzWyA0IF0gKj0gaW52U1k7XHJcblx0XHRfbTEuZWxlbWVudHNbIDUgXSAqPSBpbnZTWTtcclxuXHRcdF9tMS5lbGVtZW50c1sgNiBdICo9IGludlNZO1xyXG5cclxuXHRcdF9tMS5lbGVtZW50c1sgOCBdICo9IGludlNaO1xyXG5cdFx0X20xLmVsZW1lbnRzWyA5IF0gKj0gaW52U1o7XHJcblx0XHRfbTEuZWxlbWVudHNbIDEwIF0gKj0gaW52U1o7XHJcblxyXG5cdFx0cXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgoIF9tMSApO1xyXG5cclxuXHRcdHNjYWxlLnggPSBzeDtcclxuXHRcdHNjYWxlLnkgPSBzeTtcclxuXHRcdHNjYWxlLnogPSBzejtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGEgcGVyc3BlY3RpdmUgcHJvamVjdGlvbiBtYXRyaXguIFRoaXMgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5XHJcblx0ICoge0BsaW5rIFBlcnNwZWN0aXZlQ2FtZXJhI3VwZGF0ZVByb2plY3Rpb25NYXRyaXh9LlxyXG5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbGVmdCAtIExlZnQgYm91bmRhcnkgb2YgdGhlIHZpZXdpbmcgZnJ1c3R1bSBhdCB0aGUgbmVhciBwbGFuZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gcmlnaHQgLSBSaWdodCBib3VuZGFyeSBvZiB0aGUgdmlld2luZyBmcnVzdHVtIGF0IHRoZSBuZWFyIHBsYW5lLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0b3AgLSBUb3AgYm91bmRhcnkgb2YgdGhlIHZpZXdpbmcgZnJ1c3R1bSBhdCB0aGUgbmVhciBwbGFuZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYm90dG9tIC0gQm90dG9tIGJvdW5kYXJ5IG9mIHRoZSB2aWV3aW5nIGZydXN0dW0gYXQgdGhlIG5lYXIgcGxhbmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IG5lYXIgLSBUaGUgZGlzdGFuY2UgZnJvbSB0aGUgY2FtZXJhIHRvIHRoZSBuZWFyIHBsYW5lLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBmYXIgLSBUaGUgZGlzdGFuY2UgZnJvbSB0aGUgY2FtZXJhIHRvIHRoZSBmYXIgcGxhbmUuXHJcblx0ICogQHBhcmFtIHsoV2ViR0xDb29yZGluYXRlU3lzdGVtfFdlYkdQVUNvb3JkaW5hdGVTeXN0ZW0pfSBbY29vcmRpbmF0ZVN5c3RlbT1XZWJHTENvb3JkaW5hdGVTeXN0ZW1dIC0gVGhlIGNvb3JkaW5hdGUgc3lzdGVtLlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0cml4LlxyXG5cdCAqL1xyXG5cdG1ha2VQZXJzcGVjdGl2ZSggbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCBuZWFyLCBmYXIsIGNvb3JkaW5hdGVTeXN0ZW0gPSBXZWJHTENvb3JkaW5hdGVTeXN0ZW0gKSB7XHJcblxyXG5cdFx0Y29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzO1xyXG5cdFx0Y29uc3QgeCA9IDIgKiBuZWFyIC8gKCByaWdodCAtIGxlZnQgKTtcclxuXHRcdGNvbnN0IHkgPSAyICogbmVhciAvICggdG9wIC0gYm90dG9tICk7XHJcblxyXG5cdFx0Y29uc3QgYSA9ICggcmlnaHQgKyBsZWZ0ICkgLyAoIHJpZ2h0IC0gbGVmdCApO1xyXG5cdFx0Y29uc3QgYiA9ICggdG9wICsgYm90dG9tICkgLyAoIHRvcCAtIGJvdHRvbSApO1xyXG5cclxuXHRcdGxldCBjLCBkO1xyXG5cclxuXHRcdGlmICggY29vcmRpbmF0ZVN5c3RlbSA9PT0gV2ViR0xDb29yZGluYXRlU3lzdGVtICkge1xyXG5cclxuXHRcdFx0YyA9IC0gKCBmYXIgKyBuZWFyICkgLyAoIGZhciAtIG5lYXIgKTtcclxuXHRcdFx0ZCA9ICggLSAyICogZmFyICogbmVhciApIC8gKCBmYXIgLSBuZWFyICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggY29vcmRpbmF0ZVN5c3RlbSA9PT0gV2ViR1BVQ29vcmRpbmF0ZVN5c3RlbSApIHtcclxuXHJcblx0XHRcdGMgPSAtIGZhciAvICggZmFyIC0gbmVhciApO1xyXG5cdFx0XHRkID0gKCAtIGZhciAqIG5lYXIgKSAvICggZmFyIC0gbmVhciApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5NYXRyaXg0Lm1ha2VQZXJzcGVjdGl2ZSgpOiBJbnZhbGlkIGNvb3JkaW5hdGUgc3lzdGVtOiAnICsgY29vcmRpbmF0ZVN5c3RlbSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0ZVsgMCBdID0geDtcdHRlWyA0IF0gPSAwO1x0dGVbIDggXSA9IGE7IFx0dGVbIDEyIF0gPSAwO1xyXG5cdFx0dGVbIDEgXSA9IDA7XHR0ZVsgNSBdID0geTtcdHRlWyA5IF0gPSBiOyBcdHRlWyAxMyBdID0gMDtcclxuXHRcdHRlWyAyIF0gPSAwO1x0dGVbIDYgXSA9IDA7XHR0ZVsgMTAgXSA9IGM7IFx0dGVbIDE0IF0gPSBkO1xyXG5cdFx0dGVbIDMgXSA9IDA7XHR0ZVsgNyBdID0gMDtcdHRlWyAxMSBdID0gLSAxO1x0dGVbIDE1IF0gPSAwO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgYSBvcnRob2dyYXBoaWMgcHJvamVjdGlvbiBtYXRyaXguIFRoaXMgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5XHJcblx0ICoge0BsaW5rIE9ydGhvZ3JhcGhpY0NhbWVyYSN1cGRhdGVQcm9qZWN0aW9uTWF0cml4fS5cclxuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGxlZnQgLSBMZWZ0IGJvdW5kYXJ5IG9mIHRoZSB2aWV3aW5nIGZydXN0dW0gYXQgdGhlIG5lYXIgcGxhbmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHJpZ2h0IC0gUmlnaHQgYm91bmRhcnkgb2YgdGhlIHZpZXdpbmcgZnJ1c3R1bSBhdCB0aGUgbmVhciBwbGFuZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdG9wIC0gVG9wIGJvdW5kYXJ5IG9mIHRoZSB2aWV3aW5nIGZydXN0dW0gYXQgdGhlIG5lYXIgcGxhbmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGJvdHRvbSAtIEJvdHRvbSBib3VuZGFyeSBvZiB0aGUgdmlld2luZyBmcnVzdHVtIGF0IHRoZSBuZWFyIHBsYW5lLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBuZWFyIC0gVGhlIGRpc3RhbmNlIGZyb20gdGhlIGNhbWVyYSB0byB0aGUgbmVhciBwbGFuZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZmFyIC0gVGhlIGRpc3RhbmNlIGZyb20gdGhlIGNhbWVyYSB0byB0aGUgZmFyIHBsYW5lLlxyXG5cdCAqIEBwYXJhbSB7KFdlYkdMQ29vcmRpbmF0ZVN5c3RlbXxXZWJHUFVDb29yZGluYXRlU3lzdGVtKX0gW2Nvb3JkaW5hdGVTeXN0ZW09V2ViR0xDb29yZGluYXRlU3lzdGVtXSAtIFRoZSBjb29yZGluYXRlIHN5c3RlbS5cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXg0fSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRtYWtlT3J0aG9ncmFwaGljKCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIG5lYXIsIGZhciwgY29vcmRpbmF0ZVN5c3RlbSA9IFdlYkdMQ29vcmRpbmF0ZVN5c3RlbSApIHtcclxuXHJcblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XHJcblx0XHRjb25zdCB3ID0gMS4wIC8gKCByaWdodCAtIGxlZnQgKTtcclxuXHRcdGNvbnN0IGggPSAxLjAgLyAoIHRvcCAtIGJvdHRvbSApO1xyXG5cdFx0Y29uc3QgcCA9IDEuMCAvICggZmFyIC0gbmVhciApO1xyXG5cclxuXHRcdGNvbnN0IHggPSAoIHJpZ2h0ICsgbGVmdCApICogdztcclxuXHRcdGNvbnN0IHkgPSAoIHRvcCArIGJvdHRvbSApICogaDtcclxuXHJcblx0XHRsZXQgeiwgekludjtcclxuXHJcblx0XHRpZiAoIGNvb3JkaW5hdGVTeXN0ZW0gPT09IFdlYkdMQ29vcmRpbmF0ZVN5c3RlbSApIHtcclxuXHJcblx0XHRcdHogPSAoIGZhciArIG5lYXIgKSAqIHA7XHJcblx0XHRcdHpJbnYgPSAtIDIgKiBwO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGNvb3JkaW5hdGVTeXN0ZW0gPT09IFdlYkdQVUNvb3JkaW5hdGVTeXN0ZW0gKSB7XHJcblxyXG5cdFx0XHR6ID0gbmVhciAqIHA7XHJcblx0XHRcdHpJbnYgPSAtIDEgKiBwO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5NYXRyaXg0Lm1ha2VPcnRob2dyYXBoaWMoKTogSW52YWxpZCBjb29yZGluYXRlIHN5c3RlbTogJyArIGNvb3JkaW5hdGVTeXN0ZW0gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGVbIDAgXSA9IDIgKiB3O1x0dGVbIDQgXSA9IDA7XHRcdHRlWyA4IF0gPSAwOyBcdFx0dGVbIDEyIF0gPSAtIHg7XHJcblx0XHR0ZVsgMSBdID0gMDsgXHRcdHRlWyA1IF0gPSAyICogaDtcdHRlWyA5IF0gPSAwOyBcdFx0dGVbIDEzIF0gPSAtIHk7XHJcblx0XHR0ZVsgMiBdID0gMDsgXHRcdHRlWyA2IF0gPSAwO1x0XHR0ZVsgMTAgXSA9IHpJbnY7XHR0ZVsgMTQgXSA9IC0gejtcclxuXHRcdHRlWyAzIF0gPSAwOyBcdFx0dGVbIDcgXSA9IDA7XHRcdHRlWyAxMSBdID0gMDtcdFx0dGVbIDE1IF0gPSAxO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgbWF0cml4IGlzIGVxdWFsIHdpdGggdGhlIGdpdmVuIG9uZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4NH0gbWF0cml4IC0gVGhlIG1hdHJpeCB0byB0ZXN0IGZvciBlcXVhbGl0eS5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoaXMgbWF0cml4IGlzIGVxdWFsIHdpdGggdGhlIGdpdmVuIG9uZS5cclxuXHQgKi9cclxuXHRlcXVhbHMoIG1hdHJpeCApIHtcclxuXHJcblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XHJcblx0XHRjb25zdCBtZSA9IG1hdHJpeC5lbGVtZW50cztcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCAxNjsgaSArKyApIHtcclxuXHJcblx0XHRcdGlmICggdGVbIGkgXSAhPT0gbWVbIGkgXSApIHJldHVybiBmYWxzZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZWxlbWVudHMgb2YgdGhlIG1hdHJpeCBmcm9tIHRoZSBnaXZlbiBhcnJheS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gYXJyYXkgLSBUaGUgbWF0cml4IGVsZW1lbnRzIGluIGNvbHVtbi1tYWpvciBvcmRlci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW29mZnNldD0wXSAtIEluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBhcnJheS5cclxuXHQgKiBAcmV0dXJuIHtNYXRyaXg0fSBBIHJlZmVyZW5jZSB0byB0aGlzIG1hdHJpeC5cclxuXHQgKi9cclxuXHRmcm9tQXJyYXkoIGFycmF5LCBvZmZzZXQgPSAwICkge1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDE2OyBpICsrICkge1xyXG5cclxuXHRcdFx0dGhpcy5lbGVtZW50c1sgaSBdID0gYXJyYXlbIGkgKyBvZmZzZXQgXTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogV3JpdGVzIHRoZSBlbGVtZW50cyBvZiB0aGlzIG1hdHJpeCB0byB0aGUgZ2l2ZW4gYXJyYXkuIElmIG5vIGFycmF5IGlzIHByb3ZpZGVkLFxyXG5cdCAqIHRoZSBtZXRob2QgcmV0dXJucyBhIG5ldyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gW2FycmF5PVtdXSAtIFRoZSB0YXJnZXQgYXJyYXkgaG9sZGluZyB0aGUgbWF0cml4IGVsZW1lbnRzIGluIGNvbHVtbi1tYWpvciBvcmRlci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW29mZnNldD0wXSAtIEluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBhcnJheS5cclxuXHQgKiBAcmV0dXJuIHtBcnJheTxudW1iZXI+fSBUaGUgbWF0cml4IGVsZW1lbnRzIGluIGNvbHVtbi1tYWpvciBvcmRlci5cclxuXHQgKi9cclxuXHR0b0FycmF5KCBhcnJheSA9IFtdLCBvZmZzZXQgPSAwICkge1xyXG5cclxuXHRcdGNvbnN0IHRlID0gdGhpcy5lbGVtZW50cztcclxuXHJcblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0ZVsgMCBdO1xyXG5cdFx0YXJyYXlbIG9mZnNldCArIDEgXSA9IHRlWyAxIF07XHJcblx0XHRhcnJheVsgb2Zmc2V0ICsgMiBdID0gdGVbIDIgXTtcclxuXHRcdGFycmF5WyBvZmZzZXQgKyAzIF0gPSB0ZVsgMyBdO1xyXG5cclxuXHRcdGFycmF5WyBvZmZzZXQgKyA0IF0gPSB0ZVsgNCBdO1xyXG5cdFx0YXJyYXlbIG9mZnNldCArIDUgXSA9IHRlWyA1IF07XHJcblx0XHRhcnJheVsgb2Zmc2V0ICsgNiBdID0gdGVbIDYgXTtcclxuXHRcdGFycmF5WyBvZmZzZXQgKyA3IF0gPSB0ZVsgNyBdO1xyXG5cclxuXHRcdGFycmF5WyBvZmZzZXQgKyA4IF0gPSB0ZVsgOCBdO1xyXG5cdFx0YXJyYXlbIG9mZnNldCArIDkgXSA9IHRlWyA5IF07XHJcblx0XHRhcnJheVsgb2Zmc2V0ICsgMTAgXSA9IHRlWyAxMCBdO1xyXG5cdFx0YXJyYXlbIG9mZnNldCArIDExIF0gPSB0ZVsgMTEgXTtcclxuXHJcblx0XHRhcnJheVsgb2Zmc2V0ICsgMTIgXSA9IHRlWyAxMiBdO1xyXG5cdFx0YXJyYXlbIG9mZnNldCArIDEzIF0gPSB0ZVsgMTMgXTtcclxuXHRcdGFycmF5WyBvZmZzZXQgKyAxNCBdID0gdGVbIDE0IF07XHJcblx0XHRhcnJheVsgb2Zmc2V0ICsgMTUgXSA9IHRlWyAxNSBdO1xyXG5cclxuXHRcdHJldHVybiBhcnJheTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuY29uc3QgX3YxID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfbTEgPSAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXg0KCk7XHJcbmNvbnN0IF96ZXJvID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMyggMCwgMCwgMCApO1xyXG5jb25zdCBfb25lID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMyggMSwgMSwgMSApO1xyXG5jb25zdCBfeCA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX3kgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF96ID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5cclxuZXhwb3J0IHsgTWF0cml4NCB9O1xyXG4iLCJpbXBvcnQgeyBRdWF0ZXJuaW9uIH0gZnJvbSAnLi9RdWF0ZXJuaW9uLmpzJztcclxuaW1wb3J0IHsgTWF0cml4NCB9IGZyb20gJy4vTWF0cml4NC5qcyc7XHJcbmltcG9ydCB7IGNsYW1wIH0gZnJvbSAnLi9NYXRoVXRpbHMuanMnO1xyXG5cclxuY29uc3QgX21hdHJpeCA9IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDQoKTtcclxuY29uc3QgX3F1YXRlcm5pb24gPSAvKkBfX1BVUkVfXyovIG5ldyBRdWF0ZXJuaW9uKCk7XHJcblxyXG4vKipcclxuICogQSBjbGFzcyByZXByZXNlbnRpbmcgRXVsZXIgYW5nbGVzLlxyXG4gKlxyXG4gKiBFdWxlciBhbmdsZXMgZGVzY3JpYmUgYSByb3RhdGlvbmFsIHRyYW5zZm9ybWF0aW9uIGJ5IHJvdGF0aW5nIGFuIG9iamVjdCBvblxyXG4gKiBpdHMgdmFyaW91cyBheGVzIGluIHNwZWNpZmllZCBhbW91bnRzIHBlciBheGlzLCBhbmQgYSBzcGVjaWZpZWQgYXhpc1xyXG4gKiBvcmRlci5cclxuICpcclxuICogSXRlcmF0aW5nIHRocm91Z2ggYW4gaW5zdGFuY2Ugd2lsbCB5aWVsZCBpdHMgY29tcG9uZW50cyAoeCwgeSwgeixcclxuICogb3JkZXIpIGluIHRoZSBjb3JyZXNwb25kaW5nIG9yZGVyLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBhID0gbmV3IFRIUkVFLkV1bGVyKCAwLCAxLCAxLjU3LCAnWFlaJyApO1xyXG4gKiBjb25zdCBiID0gbmV3IFRIUkVFLlZlY3RvcjMoIDEsIDAsIDEgKTtcclxuICogYi5hcHBseUV1bGVyKGEpO1xyXG4gKiBgYGBcclxuICovXHJcbmNsYXNzIEV1bGVyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBldWxlciBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbeD0wXSAtIFRoZSBhbmdsZSBvZiB0aGUgeCBheGlzIGluIHJhZGlhbnMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt5PTBdIC0gVGhlIGFuZ2xlIG9mIHRoZSB5IGF4aXMgaW4gcmFkaWFucy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3o9MF0gLSBUaGUgYW5nbGUgb2YgdGhlIHogYXhpcyBpbiByYWRpYW5zLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbb3JkZXI9RXVsZXIuREVGQVVMVF9PUkRFUl0gLSBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIG9yZGVyIHRoYXQgdGhlIHJvdGF0aW9ucyBhcmUgYXBwbGllZC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggeCA9IDAsIHkgPSAwLCB6ID0gMCwgb3JkZXIgPSBFdWxlci5ERUZBVUxUX09SREVSICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0V1bGVyID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLl94ID0geDtcclxuXHRcdHRoaXMuX3kgPSB5O1xyXG5cdFx0dGhpcy5feiA9IHo7XHJcblx0XHR0aGlzLl9vcmRlciA9IG9yZGVyO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBhbmdsZSBvZiB0aGUgeCBheGlzIGluIHJhZGlhbnMuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdCAqIEBkZWZhdWx0IDBcclxuXHQgKi9cclxuXHRnZXQgeCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5feDtcclxuXHJcblx0fVxyXG5cclxuXHRzZXQgeCggdmFsdWUgKSB7XHJcblxyXG5cdFx0dGhpcy5feCA9IHZhbHVlO1xyXG5cdFx0dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBhbmdsZSBvZiB0aGUgeSBheGlzIGluIHJhZGlhbnMuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdCAqIEBkZWZhdWx0IDBcclxuXHQgKi9cclxuXHRnZXQgeSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5feTtcclxuXHJcblx0fVxyXG5cclxuXHRzZXQgeSggdmFsdWUgKSB7XHJcblxyXG5cdFx0dGhpcy5feSA9IHZhbHVlO1xyXG5cdFx0dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBhbmdsZSBvZiB0aGUgeiBheGlzIGluIHJhZGlhbnMuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdCAqIEBkZWZhdWx0IDBcclxuXHQgKi9cclxuXHRnZXQgeigpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fejtcclxuXHJcblx0fVxyXG5cclxuXHRzZXQgeiggdmFsdWUgKSB7XHJcblxyXG5cdFx0dGhpcy5feiA9IHZhbHVlO1xyXG5cdFx0dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgb3JkZXIgdGhhdCB0aGUgcm90YXRpb25zIGFyZSBhcHBsaWVkLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge3N0cmluZ31cclxuXHQgKiBAZGVmYXVsdCAnWFlaJ1xyXG5cdCAqL1xyXG5cdGdldCBvcmRlcigpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fb3JkZXI7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0IG9yZGVyKCB2YWx1ZSApIHtcclxuXHJcblx0XHR0aGlzLl9vcmRlciA9IHZhbHVlO1xyXG5cdFx0dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIEV1bGVyIGNvbXBvbmVudHMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBhbmdsZSBvZiB0aGUgeCBheGlzIGluIHJhZGlhbnMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgYW5nbGUgb2YgdGhlIHkgYXhpcyBpbiByYWRpYW5zLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB6IC0gVGhlIGFuZ2xlIG9mIHRoZSB6IGF4aXMgaW4gcmFkaWFucy5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW29yZGVyXSAtIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgb3JkZXIgdGhhdCB0aGUgcm90YXRpb25zIGFyZSBhcHBsaWVkLlxyXG5cdCAqIEByZXR1cm4ge0V1bGVyfSBBIHJlZmVyZW5jZSB0byB0aGlzIEV1bGVyIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldCggeCwgeSwgeiwgb3JkZXIgPSB0aGlzLl9vcmRlciApIHtcclxuXHJcblx0XHR0aGlzLl94ID0geDtcclxuXHRcdHRoaXMuX3kgPSB5O1xyXG5cdFx0dGhpcy5feiA9IHo7XHJcblx0XHR0aGlzLl9vcmRlciA9IG9yZGVyO1xyXG5cclxuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbmV3IEV1bGVyIGluc3RhbmNlIHdpdGggY29waWVkIHZhbHVlcyBmcm9tIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtFdWxlcn0gQSBjbG9uZSBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNsb25lKCkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5feCwgdGhpcy5feSwgdGhpcy5feiwgdGhpcy5fb3JkZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gRXVsZXIgaW5zdGFuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7RXVsZXJ9IGV1bGVyIC0gVGhlIEV1bGVyIGluc3RhbmNlIHRvIGNvcHkuXHJcblx0ICogQHJldHVybiB7RXVsZXJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgRXVsZXIgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y29weSggZXVsZXIgKSB7XHJcblxyXG5cdFx0dGhpcy5feCA9IGV1bGVyLl94O1xyXG5cdFx0dGhpcy5feSA9IGV1bGVyLl95O1xyXG5cdFx0dGhpcy5feiA9IGV1bGVyLl96O1xyXG5cdFx0dGhpcy5fb3JkZXIgPSBldWxlci5fb3JkZXI7XHJcblxyXG5cdFx0dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGFuZ2xlcyBvZiB0aGlzIEV1bGVyIGluc3RhbmNlIGZyb20gYSBwdXJlIHJvdGF0aW9uIG1hdHJpeC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4NH0gbSAtIEEgNHg0IG1hdHJpeCBvZiB3aGljaCB0aGUgdXBwZXIgM3gzIG9mIG1hdHJpeCBpcyBhIHB1cmUgcm90YXRpb24gbWF0cml4IChpLmUuIHVuc2NhbGVkKS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW29yZGVyXSAtIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgb3JkZXIgdGhhdCB0aGUgcm90YXRpb25zIGFyZSBhcHBsaWVkLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW3VwZGF0ZT10cnVlXSAtIFdoZXRoZXIgdGhlIGludGVybmFsIGBvbkNoYW5nZWAgY2FsbGJhY2sgc2hvdWxkIGJlIGV4ZWN1dGVkIG9yIG5vdC5cclxuXHQgKiBAcmV0dXJuIHtFdWxlcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBFdWxlciBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXRGcm9tUm90YXRpb25NYXRyaXgoIG0sIG9yZGVyID0gdGhpcy5fb3JkZXIsIHVwZGF0ZSA9IHRydWUgKSB7XHJcblxyXG5cdFx0Y29uc3QgdGUgPSBtLmVsZW1lbnRzO1xyXG5cdFx0Y29uc3QgbTExID0gdGVbIDAgXSwgbTEyID0gdGVbIDQgXSwgbTEzID0gdGVbIDggXTtcclxuXHRcdGNvbnN0IG0yMSA9IHRlWyAxIF0sIG0yMiA9IHRlWyA1IF0sIG0yMyA9IHRlWyA5IF07XHJcblx0XHRjb25zdCBtMzEgPSB0ZVsgMiBdLCBtMzIgPSB0ZVsgNiBdLCBtMzMgPSB0ZVsgMTAgXTtcclxuXHJcblx0XHRzd2l0Y2ggKCBvcmRlciApIHtcclxuXHJcblx0XHRcdGNhc2UgJ1hZWic6XHJcblxyXG5cdFx0XHRcdHRoaXMuX3kgPSBNYXRoLmFzaW4oIGNsYW1wKCBtMTMsIC0gMSwgMSApICk7XHJcblxyXG5cdFx0XHRcdGlmICggTWF0aC5hYnMoIG0xMyApIDwgMC45OTk5OTk5ICkge1xyXG5cclxuXHRcdFx0XHRcdHRoaXMuX3ggPSBNYXRoLmF0YW4yKCAtIG0yMywgbTMzICk7XHJcblx0XHRcdFx0XHR0aGlzLl96ID0gTWF0aC5hdGFuMiggLSBtMTIsIG0xMSApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdHRoaXMuX3ggPSBNYXRoLmF0YW4yKCBtMzIsIG0yMiApO1xyXG5cdFx0XHRcdFx0dGhpcy5feiA9IDA7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlICdZWFonOlxyXG5cclxuXHRcdFx0XHR0aGlzLl94ID0gTWF0aC5hc2luKCAtIGNsYW1wKCBtMjMsIC0gMSwgMSApICk7XHJcblxyXG5cdFx0XHRcdGlmICggTWF0aC5hYnMoIG0yMyApIDwgMC45OTk5OTk5ICkge1xyXG5cclxuXHRcdFx0XHRcdHRoaXMuX3kgPSBNYXRoLmF0YW4yKCBtMTMsIG0zMyApO1xyXG5cdFx0XHRcdFx0dGhpcy5feiA9IE1hdGguYXRhbjIoIG0yMSwgbTIyICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0dGhpcy5feSA9IE1hdGguYXRhbjIoIC0gbTMxLCBtMTEgKTtcclxuXHRcdFx0XHRcdHRoaXMuX3ogPSAwO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSAnWlhZJzpcclxuXHJcblx0XHRcdFx0dGhpcy5feCA9IE1hdGguYXNpbiggY2xhbXAoIG0zMiwgLSAxLCAxICkgKTtcclxuXHJcblx0XHRcdFx0aWYgKCBNYXRoLmFicyggbTMyICkgPCAwLjk5OTk5OTkgKSB7XHJcblxyXG5cdFx0XHRcdFx0dGhpcy5feSA9IE1hdGguYXRhbjIoIC0gbTMxLCBtMzMgKTtcclxuXHRcdFx0XHRcdHRoaXMuX3ogPSBNYXRoLmF0YW4yKCAtIG0xMiwgbTIyICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0dGhpcy5feSA9IDA7XHJcblx0XHRcdFx0XHR0aGlzLl96ID0gTWF0aC5hdGFuMiggbTIxLCBtMTEgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgJ1pZWCc6XHJcblxyXG5cdFx0XHRcdHRoaXMuX3kgPSBNYXRoLmFzaW4oIC0gY2xhbXAoIG0zMSwgLSAxLCAxICkgKTtcclxuXHJcblx0XHRcdFx0aWYgKCBNYXRoLmFicyggbTMxICkgPCAwLjk5OTk5OTkgKSB7XHJcblxyXG5cdFx0XHRcdFx0dGhpcy5feCA9IE1hdGguYXRhbjIoIG0zMiwgbTMzICk7XHJcblx0XHRcdFx0XHR0aGlzLl96ID0gTWF0aC5hdGFuMiggbTIxLCBtMTEgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHR0aGlzLl94ID0gMDtcclxuXHRcdFx0XHRcdHRoaXMuX3ogPSBNYXRoLmF0YW4yKCAtIG0xMiwgbTIyICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlICdZWlgnOlxyXG5cclxuXHRcdFx0XHR0aGlzLl96ID0gTWF0aC5hc2luKCBjbGFtcCggbTIxLCAtIDEsIDEgKSApO1xyXG5cclxuXHRcdFx0XHRpZiAoIE1hdGguYWJzKCBtMjEgKSA8IDAuOTk5OTk5OSApIHtcclxuXHJcblx0XHRcdFx0XHR0aGlzLl94ID0gTWF0aC5hdGFuMiggLSBtMjMsIG0yMiApO1xyXG5cdFx0XHRcdFx0dGhpcy5feSA9IE1hdGguYXRhbjIoIC0gbTMxLCBtMTEgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHR0aGlzLl94ID0gMDtcclxuXHRcdFx0XHRcdHRoaXMuX3kgPSBNYXRoLmF0YW4yKCBtMTMsIG0zMyApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSAnWFpZJzpcclxuXHJcblx0XHRcdFx0dGhpcy5feiA9IE1hdGguYXNpbiggLSBjbGFtcCggbTEyLCAtIDEsIDEgKSApO1xyXG5cclxuXHRcdFx0XHRpZiAoIE1hdGguYWJzKCBtMTIgKSA8IDAuOTk5OTk5OSApIHtcclxuXHJcblx0XHRcdFx0XHR0aGlzLl94ID0gTWF0aC5hdGFuMiggbTMyLCBtMjIgKTtcclxuXHRcdFx0XHRcdHRoaXMuX3kgPSBNYXRoLmF0YW4yKCBtMTMsIG0xMSApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdHRoaXMuX3ggPSBNYXRoLmF0YW4yKCAtIG0yMywgbTMzICk7XHJcblx0XHRcdFx0XHR0aGlzLl95ID0gMDtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGRlZmF1bHQ6XHJcblxyXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkV1bGVyOiAuc2V0RnJvbVJvdGF0aW9uTWF0cml4KCkgZW5jb3VudGVyZWQgYW4gdW5rbm93biBvcmRlcjogJyArIG9yZGVyICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuX29yZGVyID0gb3JkZXI7XHJcblxyXG5cdFx0aWYgKCB1cGRhdGUgPT09IHRydWUgKSB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgYW5nbGVzIG9mIHRoaXMgRXVsZXIgaW5zdGFuY2UgZnJvbSBhIG5vcm1hbGl6ZWQgcXVhdGVybmlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UXVhdGVybmlvbn0gcSAtIEEgbm9ybWFsaXplZCBRdWF0ZXJuaW9uLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbb3JkZXJdIC0gQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBvcmRlciB0aGF0IHRoZSByb3RhdGlvbnMgYXJlIGFwcGxpZWQuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbdXBkYXRlPXRydWVdIC0gV2hldGhlciB0aGUgaW50ZXJuYWwgYG9uQ2hhbmdlYCBjYWxsYmFjayBzaG91bGQgYmUgZXhlY3V0ZWQgb3Igbm90LlxyXG5cdCAqIEByZXR1cm4ge0V1bGVyfSBBIHJlZmVyZW5jZSB0byB0aGlzIEV1bGVyIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldEZyb21RdWF0ZXJuaW9uKCBxLCBvcmRlciwgdXBkYXRlICkge1xyXG5cclxuXHRcdF9tYXRyaXgubWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24oIHEgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5zZXRGcm9tUm90YXRpb25NYXRyaXgoIF9tYXRyaXgsIG9yZGVyLCB1cGRhdGUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBhbmdsZXMgb2YgdGhpcyBFdWxlciBpbnN0YW5jZSBmcm9tIHRoZSBnaXZlbiB2ZWN0b3IuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHYgLSBUaGUgdmVjdG9yLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbb3JkZXJdIC0gQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBvcmRlciB0aGF0IHRoZSByb3RhdGlvbnMgYXJlIGFwcGxpZWQuXHJcblx0ICogQHJldHVybiB7RXVsZXJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgRXVsZXIgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0RnJvbVZlY3RvcjMoIHYsIG9yZGVyID0gdGhpcy5fb3JkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuc2V0KCB2LngsIHYueSwgdi56LCBvcmRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlc2V0cyB0aGUgZXVsZXIgYW5nbGUgd2l0aCBhIG5ldyBvcmRlciBieSBjcmVhdGluZyBhIHF1YXRlcm5pb24gZnJvbSB0aGlzXHJcblx0ICogZXVsZXIgYW5nbGUgYW5kIHRoZW4gc2V0dGluZyB0aGlzIGV1bGVyIGFuZ2xlIHdpdGggdGhlIHF1YXRlcm5pb24gYW5kIHRoZVxyXG5cdCAqIG5ldyBvcmRlci5cclxuXHQgKlxyXG5cdCAqIFdhcm5pbmc6IFRoaXMgZGlzY2FyZHMgcmV2b2x1dGlvbiBpbmZvcm1hdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbbmV3T3JkZXJdIC0gQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBuZXcgb3JkZXIgdGhhdCB0aGUgcm90YXRpb25zIGFyZSBhcHBsaWVkLlxyXG5cdCAqIEByZXR1cm4ge0V1bGVyfSBBIHJlZmVyZW5jZSB0byB0aGlzIEV1bGVyIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHJlb3JkZXIoIG5ld09yZGVyICkge1xyXG5cclxuXHRcdF9xdWF0ZXJuaW9uLnNldEZyb21FdWxlciggdGhpcyApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnNldEZyb21RdWF0ZXJuaW9uKCBfcXVhdGVybmlvbiwgbmV3T3JkZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIEV1bGVyIGluc3RhbmNlIGlzIGVxdWFsIHdpdGggdGhlIGdpdmVuIG9uZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7RXVsZXJ9IGV1bGVyIC0gVGhlIEV1bGVyIGluc3RhbmNlIHRvIHRlc3QgZm9yIGVxdWFsaXR5LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyBFdWxlciBpbnN0YW5jZSBpcyBlcXVhbCB3aXRoIHRoZSBnaXZlbiBvbmUuXHJcblx0ICovXHJcblx0ZXF1YWxzKCBldWxlciApIHtcclxuXHJcblx0XHRyZXR1cm4gKCBldWxlci5feCA9PT0gdGhpcy5feCApICYmICggZXVsZXIuX3kgPT09IHRoaXMuX3kgKSAmJiAoIGV1bGVyLl96ID09PSB0aGlzLl96ICkgJiYgKCBldWxlci5fb3JkZXIgPT09IHRoaXMuX29yZGVyICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGlzIEV1bGVyIGluc3RhbmNlJ3MgY29tcG9uZW50cyB0byB2YWx1ZXMgZnJvbSB0aGUgZ2l2ZW4gYXJyYXkuIFRoZSBmaXJzdCB0aHJlZVxyXG5cdCAqIGVudHJpZXMgb2YgdGhlIGFycmF5IGFyZSBhc3NpZ24gdG8gdGhlIHgseSBhbmQgeiBjb21wb25lbnRzLiBBbiBvcHRpb25hbCBmb3VydGggZW50cnlcclxuXHQgKiBkZWZpbmVzIHRoZSBFdWxlciBvcmRlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyLG51bWJlcixudW1iZXIsP3N0cmluZz59IGFycmF5IC0gQW4gYXJyYXkgaG9sZGluZyB0aGUgRXVsZXIgY29tcG9uZW50IHZhbHVlcy5cclxuXHQgKiBAcmV0dXJuIHtFdWxlcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBFdWxlciBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRmcm9tQXJyYXkoIGFycmF5ICkge1xyXG5cclxuXHRcdHRoaXMuX3ggPSBhcnJheVsgMCBdO1xyXG5cdFx0dGhpcy5feSA9IGFycmF5WyAxIF07XHJcblx0XHR0aGlzLl96ID0gYXJyYXlbIDIgXTtcclxuXHRcdGlmICggYXJyYXlbIDMgXSAhPT0gdW5kZWZpbmVkICkgdGhpcy5fb3JkZXIgPSBhcnJheVsgMyBdO1xyXG5cclxuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBXcml0ZXMgdGhlIGNvbXBvbmVudHMgb2YgdGhpcyBFdWxlciBpbnN0YW5jZSB0byB0aGUgZ2l2ZW4gYXJyYXkuIElmIG5vIGFycmF5IGlzIHByb3ZpZGVkLFxyXG5cdCAqIHRoZSBtZXRob2QgcmV0dXJucyBhIG5ldyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyLG51bWJlcixudW1iZXIsc3RyaW5nPn0gW2FycmF5PVtdXSAtIFRoZSB0YXJnZXQgYXJyYXkgaG9sZGluZyB0aGUgRXVsZXIgY29tcG9uZW50cy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW29mZnNldD0wXSAtIEluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBhcnJheS5cclxuXHQgKiBAcmV0dXJuIHtBcnJheTxudW1iZXIsbnVtYmVyLG51bWJlcixzdHJpbmc+fSBUaGUgRXVsZXIgY29tcG9uZW50cy5cclxuXHQgKi9cclxuXHR0b0FycmF5KCBhcnJheSA9IFtdLCBvZmZzZXQgPSAwICkge1xyXG5cclxuXHRcdGFycmF5WyBvZmZzZXQgXSA9IHRoaXMuX3g7XHJcblx0XHRhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGhpcy5feTtcclxuXHRcdGFycmF5WyBvZmZzZXQgKyAyIF0gPSB0aGlzLl96O1xyXG5cdFx0YXJyYXlbIG9mZnNldCArIDMgXSA9IHRoaXMuX29yZGVyO1xyXG5cclxuXHRcdHJldHVybiBhcnJheTtcclxuXHJcblx0fVxyXG5cclxuXHRfb25DaGFuZ2UoIGNhbGxiYWNrICkge1xyXG5cclxuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2sgPSBjYWxsYmFjaztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHRfb25DaGFuZ2VDYWxsYmFjaygpIHt9XHJcblxyXG5cdCpbIFN5bWJvbC5pdGVyYXRvciBdKCkge1xyXG5cclxuXHRcdHlpZWxkIHRoaXMuX3g7XHJcblx0XHR5aWVsZCB0aGlzLl95O1xyXG5cdFx0eWllbGQgdGhpcy5fejtcclxuXHRcdHlpZWxkIHRoaXMuX29yZGVyO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogVGhlIGRlZmF1bHQgRXVsZXIgYW5nbGUgb3JkZXIuXHJcbiAqXHJcbiAqIEBzdGF0aWNcclxuICogQHR5cGUge3N0cmluZ31cclxuICogQGRlZmF1bHQgJ1hZWidcclxuICovXHJcbkV1bGVyLkRFRkFVTFRfT1JERVIgPSAnWFlaJztcclxuXHJcbmV4cG9ydCB7IEV1bGVyIH07XHJcbiIsIi8qKlxyXG4gKiBBIGxheWVycyBvYmplY3QgYXNzaWducyBhbiAzRCBvYmplY3QgdG8gMSBvciBtb3JlIG9mIDMyXHJcbiAqIGxheWVycyBudW1iZXJlZCBgMGAgdG8gYDMxYCAtIGludGVybmFsbHkgdGhlIGxheWVycyBhcmUgc3RvcmVkIGFzIGFcclxuICogYml0IG1hc2tdLCBhbmQgYnkgZGVmYXVsdCBhbGwgM0Qgb2JqZWN0cyBhcmUgYSBtZW1iZXIgb2YgbGF5ZXIgYDBgLlxyXG4gKlxyXG4gKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgdmlzaWJpbGl0eSAtIGFuIG9iamVjdCBtdXN0IHNoYXJlIGEgbGF5ZXIgd2l0aFxyXG4gKiBhIGNhbWVyYSB0byBiZSB2aXNpYmxlIHdoZW4gdGhhdCBjYW1lcmEncyB2aWV3IGlzXHJcbiAqIHJlbmRlcmVkLlxyXG4gKlxyXG4gKiBBbGwgY2xhc3NlcyB0aGF0IGluaGVyaXQgZnJvbSB7QGxpbmsgT2JqZWN0M0R9IGhhdmUgYW4gYGxheWVyc2AgcHJvcGVydHkgd2hpY2hcclxuICogaXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy5cclxuICovXHJcbmNsYXNzIExheWVycyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbGF5ZXJzIGluc3RhbmNlLCB3aXRoIG1lbWJlcnNoaXBcclxuXHQgKiBpbml0aWFsbHkgc2V0IHRvIGxheWVyIGAwYC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgYml0IG1hc2sgc3RvcmluZyB3aGljaCBvZiB0aGUgMzIgbGF5ZXJzIHRoaXMgbGF5ZXJzIG9iamVjdCBpcyBjdXJyZW50bHlcclxuXHRcdCAqIGEgbWVtYmVyIG9mLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWFzayA9IDEgfCAwO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgbWVtYmVyc2hpcCB0byB0aGUgZ2l2ZW4gbGF5ZXIsIGFuZCByZW1vdmUgbWVtYmVyc2hpcCBhbGwgb3RoZXIgbGF5ZXJzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGxheWVyIC0gVGhlIGxheWVyIHRvIHNldC5cclxuXHQgKi9cclxuXHRzZXQoIGxheWVyICkge1xyXG5cclxuXHRcdHRoaXMubWFzayA9ICggMSA8PCBsYXllciB8IDAgKSA+Pj4gMDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIG1lbWJlcnNoaXAgb2YgdGhlIGdpdmVuIGxheWVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGxheWVyIC0gVGhlIGxheWVyIHRvIGVuYWJsZS5cclxuXHQgKi9cclxuXHRlbmFibGUoIGxheWVyICkge1xyXG5cclxuXHRcdHRoaXMubWFzayB8PSAxIDw8IGxheWVyIHwgMDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIG1lbWJlcnNoaXAgdG8gYWxsIGxheWVycy5cclxuXHQgKi9cclxuXHRlbmFibGVBbGwoKSB7XHJcblxyXG5cdFx0dGhpcy5tYXNrID0gMHhmZmZmZmZmZiB8IDA7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVG9nZ2xlcyB0aGUgbWVtYmVyc2hpcCBvZiB0aGUgZ2l2ZW4gbGF5ZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbGF5ZXIgLSBUaGUgbGF5ZXIgdG8gdG9nZ2xlLlxyXG5cdCAqL1xyXG5cdHRvZ2dsZSggbGF5ZXIgKSB7XHJcblxyXG5cdFx0dGhpcy5tYXNrIF49IDEgPDwgbGF5ZXIgfCAwO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbW92ZXMgbWVtYmVyc2hpcCBvZiB0aGUgZ2l2ZW4gbGF5ZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbGF5ZXIgLSBUaGUgbGF5ZXIgdG8gZW5hYmxlLlxyXG5cdCAqL1xyXG5cdGRpc2FibGUoIGxheWVyICkge1xyXG5cclxuXHRcdHRoaXMubWFzayAmPSB+ICggMSA8PCBsYXllciB8IDAgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW1vdmVzIHRoZSBtZW1iZXJzaGlwIGZyb20gYWxsIGxheWVycy5cclxuXHQgKi9cclxuXHRkaXNhYmxlQWxsKCkge1xyXG5cclxuXHRcdHRoaXMubWFzayA9IDA7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBhbmQgdGhlIGdpdmVuIGxheWVycyBvYmplY3QgaGF2ZSBhdCBsZWFzdCBvbmVcclxuXHQgKiBsYXllciBpbiBjb21tb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0xheWVyc30gbGF5ZXJzIC0gVGhlIGxheWVycyB0byB0ZXN0LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW4gfSBXaGV0aGVyIHRoaXMgYW5kIHRoZSBnaXZlbiBsYXllcnMgb2JqZWN0IGhhdmUgYXQgbGVhc3Qgb25lIGxheWVyIGluIGNvbW1vbiBvciBub3QuXHJcblx0ICovXHJcblx0dGVzdCggbGF5ZXJzICkge1xyXG5cclxuXHRcdHJldHVybiAoIHRoaXMubWFzayAmIGxheWVycy5tYXNrICkgIT09IDA7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIGxheWVyIGlzIGVuYWJsZWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbGF5ZXIgLSBUaGUgbGF5ZXIgdG8gdGVzdC5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFuIH0gV2hldGhlciB0aGUgZ2l2ZW4gbGF5ZXIgaXMgZW5hYmxlZCBvciBub3QuXHJcblx0ICovXHJcblx0aXNFbmFibGVkKCBsYXllciApIHtcclxuXHJcblx0XHRyZXR1cm4gKCB0aGlzLm1hc2sgJiAoIDEgPDwgbGF5ZXIgfCAwICkgKSAhPT0gMDtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCB7IExheWVycyB9O1xyXG4iLCJpbXBvcnQgeyBRdWF0ZXJuaW9uIH0gZnJvbSAnLi4vbWF0aC9RdWF0ZXJuaW9uLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcbmltcG9ydCB7IE1hdHJpeDQgfSBmcm9tICcuLi9tYXRoL01hdHJpeDQuanMnO1xyXG5pbXBvcnQgeyBFdmVudERpc3BhdGNoZXIgfSBmcm9tICcuL0V2ZW50RGlzcGF0Y2hlci5qcyc7XHJcbmltcG9ydCB7IEV1bGVyIH0gZnJvbSAnLi4vbWF0aC9FdWxlci5qcyc7XHJcbmltcG9ydCB7IExheWVycyB9IGZyb20gJy4vTGF5ZXJzLmpzJztcclxuaW1wb3J0IHsgTWF0cml4MyB9IGZyb20gJy4uL21hdGgvTWF0cml4My5qcyc7XHJcbmltcG9ydCB7IGdlbmVyYXRlVVVJRCB9IGZyb20gJy4uL21hdGgvTWF0aFV0aWxzLmpzJztcclxuXHJcbmxldCBfb2JqZWN0M0RJZCA9IDA7XHJcblxyXG5jb25zdCBfdjEgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF9xMSA9IC8qQF9fUFVSRV9fKi8gbmV3IFF1YXRlcm5pb24oKTtcclxuY29uc3QgX20xID0gLypAX19QVVJFX18qLyBuZXcgTWF0cml4NCgpO1xyXG5jb25zdCBfdGFyZ2V0ID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5cclxuY29uc3QgX3Bvc2l0aW9uID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfc2NhbGUgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF9xdWF0ZXJuaW9uID0gLypAX19QVVJFX18qLyBuZXcgUXVhdGVybmlvbigpO1xyXG5cclxuY29uc3QgX3hBeGlzID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMyggMSwgMCwgMCApO1xyXG5jb25zdCBfeUF4aXMgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCAwLCAxLCAwICk7XHJcbmNvbnN0IF96QXhpcyA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoIDAsIDAsIDEgKTtcclxuXHJcbi8qKlxyXG4gKiBGaXJlcyB3aGVuIHRoZSBvYmplY3QgaGFzIGJlZW4gYWRkZWQgdG8gaXRzIHBhcmVudCBvYmplY3QuXHJcbiAqXHJcbiAqIEBldmVudCBPYmplY3QzRCNhZGRlZFxyXG4gKiBAdHlwZSB7T2JqZWN0fVxyXG4gKi9cclxuY29uc3QgX2FkZGVkRXZlbnQgPSB7IHR5cGU6ICdhZGRlZCcgfTtcclxuXHJcbi8qKlxyXG4gKiBGaXJlcyB3aGVuIHRoZSBvYmplY3QgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIGl0cyBwYXJlbnQgb2JqZWN0LlxyXG4gKlxyXG4gKiBAZXZlbnQgT2JqZWN0M0QjcmVtb3ZlZFxyXG4gKiBAdHlwZSB7T2JqZWN0fVxyXG4gKi9cclxuY29uc3QgX3JlbW92ZWRFdmVudCA9IHsgdHlwZTogJ3JlbW92ZWQnIH07XHJcblxyXG4vKipcclxuICogRmlyZXMgd2hlbiBhIG5ldyBjaGlsZCBvYmplY3QgaGFzIGJlZW4gYWRkZWQuXHJcbiAqXHJcbiAqIEBldmVudCBPYmplY3QzRCNjaGlsZGFkZGVkXHJcbiAqIEB0eXBlIHtPYmplY3R9XHJcbiAqL1xyXG5jb25zdCBfY2hpbGRhZGRlZEV2ZW50ID0geyB0eXBlOiAnY2hpbGRhZGRlZCcsIGNoaWxkOiBudWxsIH07XHJcblxyXG4vKipcclxuICogRmlyZXMgd2hlbiBhIG5ldyBjaGlsZCBvYmplY3QgaGFzIGJlZW4gYWRkZWQuXHJcbiAqXHJcbiAqIEBldmVudCBPYmplY3QzRCNjaGlsZHJlbW92ZWRcclxuICogQHR5cGUge09iamVjdH1cclxuICovXHJcbmNvbnN0IF9jaGlsZHJlbW92ZWRFdmVudCA9IHsgdHlwZTogJ2NoaWxkcmVtb3ZlZCcsIGNoaWxkOiBudWxsIH07XHJcblxyXG4vKipcclxuICogVGhpcyBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgbW9zdCBvYmplY3RzIGluIHRocmVlLmpzIGFuZCBwcm92aWRlcyBhIHNldCBvZlxyXG4gKiBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzIGZvciBtYW5pcHVsYXRpbmcgb2JqZWN0cyBpbiAzRCBzcGFjZS5cclxuICpcclxuICogQGF1Z21lbnRzIEV2ZW50RGlzcGF0Y2hlclxyXG4gKi9cclxuY2xhc3MgT2JqZWN0M0QgZXh0ZW5kcyBFdmVudERpc3BhdGNoZXIge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IDNEIG9iamVjdC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc09iamVjdDNEID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBJRCBvZiB0aGUgM0Qgb2JqZWN0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEBuYW1lIE9iamVjdDNEI2lkXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKi9cclxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ2lkJywgeyB2YWx1ZTogX29iamVjdDNESWQgKysgfSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIFVVSUQgb2YgdGhlIDNEIG9iamVjdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXVpZCA9IGdlbmVyYXRlVVVJRCgpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG5hbWUgb2YgdGhlIDNEIG9iamVjdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5hbWUgPSAnJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB0eXBlIHByb3BlcnR5IGlzIHVzZWQgZm9yIGRldGVjdGluZyB0aGUgb2JqZWN0IHR5cGVcclxuXHRcdCAqIGluIGNvbnRleHQgb2Ygc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnR5cGUgPSAnT2JqZWN0M0QnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIHBhcmVudCBvYmplY3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9PYmplY3QzRH1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wYXJlbnQgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQW4gYXJyYXkgaG9sZGluZyB0aGUgY2hpbGQgM0Qgb2JqZWN0cyBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxPYmplY3QzRD59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2hpbGRyZW4gPSBbXTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgdGhlIGB1cGAgZGlyZWN0aW9uIG9mIHRoZSAzRCBvYmplY3Qgd2hpY2ggaW5mbHVlbmNlc1xyXG5cdFx0ICogdGhlIG9yaWVudGF0aW9uIHZpYSBtZXRob2RzIGxpa2Uge0BsaW5rIE9iamVjdDNEI2xvb2tBdH0uXHJcblx0XHQgKlxyXG5cdFx0ICogVGhlIGRlZmF1bHQgdmFsdWVzIGZvciBhbGwgM0Qgb2JqZWN0cyBpcyBkZWZpbmVkIGJ5IGBPYmplY3QzRC5ERUZBVUxUX1VQYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yM31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51cCA9IE9iamVjdDNELkRFRkFVTFRfVVAuY2xvbmUoKTtcclxuXHJcblx0XHRjb25zdCBwb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7XHJcblx0XHRjb25zdCByb3RhdGlvbiA9IG5ldyBFdWxlcigpO1xyXG5cdFx0Y29uc3QgcXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJuaW9uKCk7XHJcblx0XHRjb25zdCBzY2FsZSA9IG5ldyBWZWN0b3IzKCAxLCAxLCAxICk7XHJcblxyXG5cdFx0ZnVuY3Rpb24gb25Sb3RhdGlvbkNoYW5nZSgpIHtcclxuXHJcblx0XHRcdHF1YXRlcm5pb24uc2V0RnJvbUV1bGVyKCByb3RhdGlvbiwgZmFsc2UgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0ZnVuY3Rpb24gb25RdWF0ZXJuaW9uQ2hhbmdlKCkge1xyXG5cclxuXHRcdFx0cm90YXRpb24uc2V0RnJvbVF1YXRlcm5pb24oIHF1YXRlcm5pb24sIHVuZGVmaW5lZCwgZmFsc2UgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cm90YXRpb24uX29uQ2hhbmdlKCBvblJvdGF0aW9uQ2hhbmdlICk7XHJcblx0XHRxdWF0ZXJuaW9uLl9vbkNoYW5nZSggb25RdWF0ZXJuaW9uQ2hhbmdlICk7XHJcblxyXG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIHRoaXMsIHtcclxuXHRcdFx0LyoqXHJcblx0XHRcdCAqIFJlcHJlc2VudHMgdGhlIG9iamVjdCdzIGxvY2FsIHBvc2l0aW9uLlxyXG5cdFx0XHQgKlxyXG5cdFx0XHQgKiBAbmFtZSBPYmplY3QzRCNwb3NpdGlvblxyXG5cdFx0XHQgKiBAdHlwZSB7VmVjdG9yM31cclxuXHRcdFx0ICogQGRlZmF1bHQgKDAsMCwwKVxyXG5cdFx0XHQgKi9cclxuXHRcdFx0cG9zaXRpb246IHtcclxuXHRcdFx0XHRjb25maWd1cmFibGU6IHRydWUsXHJcblx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcclxuXHRcdFx0XHR2YWx1ZTogcG9zaXRpb25cclxuXHRcdFx0fSxcclxuXHRcdFx0LyoqXHJcblx0XHRcdCAqIFJlcHJlc2VudHMgdGhlIG9iamVjdCdzIGxvY2FsIHJvdGF0aW9uIGFzIEV1bGVyIGFuZ2xlcywgaW4gcmFkaWFucy5cclxuXHRcdFx0ICpcclxuXHRcdFx0ICogQG5hbWUgT2JqZWN0M0Qjcm90YXRpb25cclxuXHRcdFx0ICogQHR5cGUge0V1bGVyfVxyXG5cdFx0XHQgKiBAZGVmYXVsdCAoMCwwLDApXHJcblx0XHRcdCAqL1xyXG5cdFx0XHRyb3RhdGlvbjoge1xyXG5cdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcclxuXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxyXG5cdFx0XHRcdHZhbHVlOiByb3RhdGlvblxyXG5cdFx0XHR9LFxyXG5cdFx0XHQvKipcclxuXHRcdFx0ICogUmVwcmVzZW50cyB0aGUgb2JqZWN0J3MgbG9jYWwgcm90YXRpb24gYXMgUXVhdGVybmlvbnMuXHJcblx0XHRcdCAqXHJcblx0XHRcdCAqIEBuYW1lIE9iamVjdDNEI3F1YXRlcm5pb25cclxuXHRcdFx0ICogQHR5cGUge1F1YXRlcm5pb259XHJcblx0XHRcdCAqL1xyXG5cdFx0XHRxdWF0ZXJuaW9uOiB7XHJcblx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxyXG5cdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXHJcblx0XHRcdFx0dmFsdWU6IHF1YXRlcm5pb25cclxuXHRcdFx0fSxcclxuXHRcdFx0LyoqXHJcblx0XHRcdCAqIFJlcHJlc2VudHMgdGhlIG9iamVjdCdzIGxvY2FsIHNjYWxlLlxyXG5cdFx0XHQgKlxyXG5cdFx0XHQgKiBAbmFtZSBPYmplY3QzRCNzY2FsZVxyXG5cdFx0XHQgKiBAdHlwZSB7VmVjdG9yM31cclxuXHRcdFx0ICogQGRlZmF1bHQgKDEsMSwxKVxyXG5cdFx0XHQgKi9cclxuXHRcdFx0c2NhbGU6IHtcclxuXHRcdFx0XHRjb25maWd1cmFibGU6IHRydWUsXHJcblx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcclxuXHRcdFx0XHR2YWx1ZTogc2NhbGVcclxuXHRcdFx0fSxcclxuXHRcdFx0LyoqXHJcblx0XHRcdCAqIFJlcHJlc2VudHMgdGhlIG9iamVjdCdzIG1vZGVsLXZpZXcgbWF0cml4LlxyXG5cdFx0XHQgKlxyXG5cdFx0XHQgKiBAbmFtZSBPYmplY3QzRCNtb2RlbFZpZXdNYXRyaXhcclxuXHRcdFx0ICogQHR5cGUge01hdHJpeDR9XHJcblx0XHRcdCAqL1xyXG5cdFx0XHRtb2RlbFZpZXdNYXRyaXg6IHtcclxuXHRcdFx0XHR2YWx1ZTogbmV3IE1hdHJpeDQoKVxyXG5cdFx0XHR9LFxyXG5cdFx0XHQvKipcclxuXHRcdFx0ICogUmVwcmVzZW50cyB0aGUgb2JqZWN0J3Mgbm9ybWFsIG1hdHJpeC5cclxuXHRcdFx0ICpcclxuXHRcdFx0ICogQG5hbWUgT2JqZWN0M0Qjbm9ybWFsTWF0cml4XHJcblx0XHRcdCAqIEB0eXBlIHtNYXRyaXgzfVxyXG5cdFx0XHQgKi9cclxuXHRcdFx0bm9ybWFsTWF0cml4OiB7XHJcblx0XHRcdFx0dmFsdWU6IG5ldyBNYXRyaXgzKClcclxuXHRcdFx0fVxyXG5cdFx0fSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVwcmVzZW50cyB0aGUgb2JqZWN0J3MgdHJhbnNmb3JtYXRpb24gbWF0cml4IGluIGxvY2FsIHNwYWNlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtNYXRyaXg0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXByZXNlbnRzIHRoZSBvYmplY3QncyB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggaW4gd29ybGQgc3BhY2UuXHJcblx0XHQgKiBJZiB0aGUgM0Qgb2JqZWN0IGhhcyBubyBwYXJlbnQsIHRoZW4gaXQncyBpZGVudGljYWwgdG8gdGhlIGxvY2FsIHRyYW5zZm9ybWF0aW9uIG1hdHJpeFxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtNYXRyaXg0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1hdHJpeFdvcmxkID0gbmV3IE1hdHJpeDQoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZW4gc2V0IHRvIGB0cnVlYCwgdGhlIGVuZ2luZSBhdXRvbWF0aWNhbGx5IGNvbXB1dGVzIHRoZSBsb2NhbCBtYXRyaXggZnJvbSBwb3NpdGlvbixcclxuXHRcdCAqIHJvdGF0aW9uIGFuZCBzY2FsZSBldmVyeSBmcmFtZS5cclxuXHRcdCAqXHJcblx0XHQgKiBUaGUgZGVmYXVsdCB2YWx1ZXMgZm9yIGFsbCAzRCBvYmplY3RzIGlzIGRlZmluZWQgYnkgYE9iamVjdDNELkRFRkFVTFRfTUFUUklYX0FVVE9fVVBEQVRFYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gT2JqZWN0M0QuREVGQVVMVF9NQVRSSVhfQVVUT19VUERBVEU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGVuIHNldCB0byBgdHJ1ZWAsIHRoZSBlbmdpbmUgYXV0b21hdGljYWxseSBjb21wdXRlcyB0aGUgd29ybGQgbWF0cml4IGZyb20gdGhlIGN1cnJlbnQgbG9jYWxcclxuXHRcdCAqIG1hdHJpeCBhbmQgdGhlIG9iamVjdCdzIHRyYW5zZm9ybWF0aW9uIGhpZXJhcmNoeS5cclxuXHRcdCAqXHJcblx0XHQgKiBUaGUgZGVmYXVsdCB2YWx1ZXMgZm9yIGFsbCAzRCBvYmplY3RzIGlzIGRlZmluZWQgYnkgYE9iamVjdDNELkRFRkFVTFRfTUFUUklYX1dPUkxEX0FVVE9fVVBEQVRFYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tYXRyaXhXb3JsZEF1dG9VcGRhdGUgPSBPYmplY3QzRC5ERUZBVUxUX01BVFJJWF9XT1JMRF9BVVRPX1VQREFURTsgLy8gY2hlY2tlZCBieSB0aGUgcmVuZGVyZXJcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZW4gc2V0IHRvIGB0cnVlYCwgaXQgY2FsY3VsYXRlcyB0aGUgd29ybGQgbWF0cml4IGluIHRoYXQgZnJhbWUgYW5kIHJlc2V0cyB0aGlzIHByb3BlcnR5XHJcblx0XHQgKiB0byBgZmFsc2VgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbGF5ZXIgbWVtYmVyc2hpcCBvZiB0aGUgM0Qgb2JqZWN0LiBUaGUgM0Qgb2JqZWN0IGlzIG9ubHkgdmlzaWJsZSBpZiBpdCBoYXNcclxuXHRcdCAqIGF0IGxlYXN0IG9uZSBsYXllciBpbiBjb21tb24gd2l0aCB0aGUgY2FtZXJhIGluIHVzZS4gVGhpcyBwcm9wZXJ0eSBjYW4gYWxzbyBiZVxyXG5cdFx0ICogdXNlZCB0byBmaWx0ZXIgb3V0IHVud2FudGVkIG9iamVjdHMgaW4gcmF5LWludGVyc2VjdGlvbiB0ZXN0cyB3aGVuIHVzaW5nIHtAbGluayBSYXljYXN0ZXJ9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtMYXllcnN9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGF5ZXJzID0gbmV3IExheWVycygpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hlbiBzZXQgdG8gYHRydWVgLCB0aGUgM0Qgb2JqZWN0IGdldHMgcmVuZGVyZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudmlzaWJsZSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGVuIHNldCB0byBgdHJ1ZWAsIHRoZSAzRCBvYmplY3QgZ2V0cyByZW5kZXJlZCBpbnRvIHNoYWRvdyBtYXBzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jYXN0U2hhZG93ID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGVuIHNldCB0byBgdHJ1ZWAsIHRoZSAzRCBvYmplY3QgaXMgYWZmZWN0ZWQgYnkgc2hhZG93cyBpbiB0aGUgc2NlbmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJlY2VpdmVTaGFkb3cgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZW4gc2V0IHRvIGB0cnVlYCwgdGhlIDNEIG9iamVjdCBpcyBob25vcmVkIGJ5IHZpZXcgZnJ1c3R1bSBjdWxsaW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZydXN0dW1DdWxsZWQgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyB2YWx1ZSBhbGxvd3MgdGhlIGRlZmF1bHQgcmVuZGVyaW5nIG9yZGVyIG9mIHNjZW5lIGdyYXBoIG9iamVjdHMgdG8gYmVcclxuXHRcdCAqIG92ZXJyaWRkZW4gYWx0aG91Z2ggb3BhcXVlIGFuZCB0cmFuc3BhcmVudCBvYmplY3RzIHJlbWFpbiBzb3J0ZWQgaW5kZXBlbmRlbnRseS5cclxuXHRcdCAqIFdoZW4gdGhpcyBwcm9wZXJ0eSBpcyBzZXQgZm9yIGFuIGluc3RhbmNlIG9mIHtAbGluayBHcm91cH0sYWxsIGRlc2NlbmRhbnRzXHJcblx0XHQgKiBvYmplY3RzIHdpbGwgYmUgc29ydGVkIGFuZCByZW5kZXJlZCB0b2dldGhlci4gU29ydGluZyBpcyBmcm9tIGxvd2VzdCB0byBoaWdoZXN0XHJcblx0XHQgKiByZW5kZXIgb3JkZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yZW5kZXJPcmRlciA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBhcnJheSBob2xkaW5nIHRoZSBhbmltYXRpb24gY2xpcHMgb2YgdGhlIDNEIG9iamVjdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8QW5pbWF0aW9uQ2xpcD59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYW5pbWF0aW9ucyA9IFtdO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQ3VzdG9tIGRlcHRoIG1hdGVyaWFsIHRvIGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgdG8gdGhlIGRlcHRoIG1hcC4gQ2FuIG9ubHkgYmUgdXNlZFxyXG5cdFx0ICogaW4gY29udGV4dCBvZiBtZXNoZXMuIFdoZW4gc2hhZG93LWNhc3Rpbmcgd2l0aCBhIHtAbGluayBEaXJlY3Rpb25hbExpZ2h0fSBvciB7QGxpbmsgU3BvdExpZ2h0fSxcclxuXHRcdCAqIGlmIHlvdSBhcmUgbW9kaWZ5aW5nIHZlcnRleCBwb3NpdGlvbnMgaW4gdGhlIHZlcnRleCBzaGFkZXIgeW91IG11c3Qgc3BlY2lmeSBhIGN1c3RvbSBkZXB0aFxyXG5cdFx0ICogbWF0ZXJpYWwgZm9yIHByb3BlciBzaGFkb3dzLlxyXG5cdFx0ICpcclxuXHRcdCAqIE9ubHkgcmVsZXZhbnQgaW4gY29udGV4dCBvZiB7QGxpbmsgV2ViR0xSZW5kZXJlcn0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeyhNYXRlcmlhbHx1bmRlZmluZWQpfVxyXG5cdFx0ICogQGRlZmF1bHQgdW5kZWZpbmVkXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY3VzdG9tRGVwdGhNYXRlcmlhbCA9IHVuZGVmaW5lZDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNhbWUgYXMge0BsaW5rIE9iamVjdDNEI2N1c3RvbURlcHRoTWF0ZXJpYWx9LCBidXQgdXNlZCB3aXRoIHtAbGluayBQb2ludExpZ2h0fS5cclxuXHRcdCAqXHJcblx0XHQgKiBPbmx5IHJlbGV2YW50IGluIGNvbnRleHQgb2Yge0BsaW5rIFdlYkdMUmVuZGVyZXJ9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoTWF0ZXJpYWx8dW5kZWZpbmVkKX1cclxuXHRcdCAqIEBkZWZhdWx0IHVuZGVmaW5lZFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmN1c3RvbURpc3RhbmNlTWF0ZXJpYWwgPSB1bmRlZmluZWQ7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byBzdG9yZSBjdXN0b20gZGF0YSBhYm91dCB0aGUgM0Qgb2JqZWN0LiBJdFxyXG5cdFx0ICogc2hvdWxkIG5vdCBob2xkIHJlZmVyZW5jZXMgdG8gZnVuY3Rpb25zIGFzIHRoZXNlIHdpbGwgbm90IGJlIGNsb25lZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVzZXJEYXRhID0ge307XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQSBjYWxsYmFjayB0aGF0IGlzIGV4ZWN1dGVkIGltbWVkaWF0ZWx5IGJlZm9yZSBhIDNEIG9iamVjdCBpcyByZW5kZXJlZCB0byBhIHNoYWRvdyBtYXAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JlbmRlcmVyfFdlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0M0R9IG9iamVjdCAtIFRoZSAzRCBvYmplY3QuXHJcblx0ICogQHBhcmFtIHtDYW1lcmF9IGNhbWVyYSAtIFRoZSBjYW1lcmEgdGhhdCBpcyB1c2VkIHRvIHJlbmRlciB0aGUgc2NlbmUuXHJcblx0ICogQHBhcmFtIHtDYW1lcmF9IHNoYWRvd0NhbWVyYSAtIFRoZSBzaGFkb3cgY2FtZXJhLlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyR2VvbWV0cnl9IGdlb21ldHJ5IC0gVGhlIDNEIG9iamVjdCdzIGdlb21ldHJ5LlxyXG5cdCAqIEBwYXJhbSB7TWF0ZXJpYWx9IGRlcHRoTWF0ZXJpYWwgLSBUaGUgZGVwdGggbWF0ZXJpYWwuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGdyb3VwIC0gVGhlIGdlb21ldHJ5IGdyb3VwIGRhdGEuXHJcblx0ICovXHJcblx0b25CZWZvcmVTaGFkb3coIC8qIHJlbmRlcmVyLCBvYmplY3QsIGNhbWVyYSwgc2hhZG93Q2FtZXJhLCBnZW9tZXRyeSwgZGVwdGhNYXRlcmlhbCwgZ3JvdXAgKi8gKSB7fVxyXG5cclxuXHQvKipcclxuXHQgKiBBIGNhbGxiYWNrIHRoYXQgaXMgZXhlY3V0ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgYSAzRCBvYmplY3QgaXMgcmVuZGVyZWQgdG8gYSBzaGFkb3cgbWFwLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSZW5kZXJlcnxXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcGFyYW0ge09iamVjdDNEfSBvYmplY3QgLSBUaGUgM0Qgb2JqZWN0LlxyXG5cdCAqIEBwYXJhbSB7Q2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIHRoYXQgaXMgdXNlZCB0byByZW5kZXIgdGhlIHNjZW5lLlxyXG5cdCAqIEBwYXJhbSB7Q2FtZXJhfSBzaGFkb3dDYW1lcmEgLSBUaGUgc2hhZG93IGNhbWVyYS5cclxuXHQgKiBAcGFyYW0ge0J1ZmZlckdlb21ldHJ5fSBnZW9tZXRyeSAtIFRoZSAzRCBvYmplY3QncyBnZW9tZXRyeS5cclxuXHQgKiBAcGFyYW0ge01hdGVyaWFsfSBkZXB0aE1hdGVyaWFsIC0gVGhlIGRlcHRoIG1hdGVyaWFsLlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBncm91cCAtIFRoZSBnZW9tZXRyeSBncm91cCBkYXRhLlxyXG5cdCAqL1xyXG5cdG9uQWZ0ZXJTaGFkb3coIC8qIHJlbmRlcmVyLCBvYmplY3QsIGNhbWVyYSwgc2hhZG93Q2FtZXJhLCBnZW9tZXRyeSwgZGVwdGhNYXRlcmlhbCwgZ3JvdXAgKi8gKSB7fVxyXG5cclxuXHQvKipcclxuXHQgKiBBIGNhbGxiYWNrIHRoYXQgaXMgZXhlY3V0ZWQgaW1tZWRpYXRlbHkgYmVmb3JlIGEgM0Qgb2JqZWN0IGlzIHJlbmRlcmVkLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSZW5kZXJlcnxXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcGFyYW0ge09iamVjdDNEfSBvYmplY3QgLSBUaGUgM0Qgb2JqZWN0LlxyXG5cdCAqIEBwYXJhbSB7Q2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIHRoYXQgaXMgdXNlZCB0byByZW5kZXIgdGhlIHNjZW5lLlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyR2VvbWV0cnl9IGdlb21ldHJ5IC0gVGhlIDNEIG9iamVjdCdzIGdlb21ldHJ5LlxyXG5cdCAqIEBwYXJhbSB7TWF0ZXJpYWx9IG1hdGVyaWFsIC0gVGhlIDNEIG9iamVjdCdzIG1hdGVyaWFsLlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBncm91cCAtIFRoZSBnZW9tZXRyeSBncm91cCBkYXRhLlxyXG5cdCAqL1xyXG5cdG9uQmVmb3JlUmVuZGVyKCAvKiByZW5kZXJlciwgc2NlbmUsIGNhbWVyYSwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cCAqLyApIHt9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEEgY2FsbGJhY2sgdGhhdCBpcyBleGVjdXRlZCBpbW1lZGlhdGVseSBhZnRlciBhIDNEIG9iamVjdCBpcyByZW5kZXJlZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyZXJ8V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcblx0ICogQHBhcmFtIHtPYmplY3QzRH0gb2JqZWN0IC0gVGhlIDNEIG9iamVjdC5cclxuXHQgKiBAcGFyYW0ge0NhbWVyYX0gY2FtZXJhIC0gVGhlIGNhbWVyYSB0aGF0IGlzIHVzZWQgdG8gcmVuZGVyIHRoZSBzY2VuZS5cclxuXHQgKiBAcGFyYW0ge0J1ZmZlckdlb21ldHJ5fSBnZW9tZXRyeSAtIFRoZSAzRCBvYmplY3QncyBnZW9tZXRyeS5cclxuXHQgKiBAcGFyYW0ge01hdGVyaWFsfSBtYXRlcmlhbCAtIFRoZSAzRCBvYmplY3QncyBtYXRlcmlhbC5cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gZ3JvdXAgLSBUaGUgZ2VvbWV0cnkgZ3JvdXAgZGF0YS5cclxuXHQgKi9cclxuXHRvbkFmdGVyUmVuZGVyKCAvKiByZW5kZXJlciwgc2NlbmUsIGNhbWVyYSwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cCAqLyApIHt9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFwcGxpZXMgdGhlIGdpdmVuIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCB0byB0aGUgb2JqZWN0IGFuZCB1cGRhdGVzIHRoZSBvYmplY3QncyBwb3NpdGlvbixcclxuXHQgKiByb3RhdGlvbiBhbmQgc2NhbGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDR9IG1hdHJpeCAtIFRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguXHJcblx0ICovXHJcblx0YXBwbHlNYXRyaXg0KCBtYXRyaXggKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm1hdHJpeEF1dG9VcGRhdGUgKSB0aGlzLnVwZGF0ZU1hdHJpeCgpO1xyXG5cclxuXHRcdHRoaXMubWF0cml4LnByZW11bHRpcGx5KCBtYXRyaXggKTtcclxuXHJcblx0XHR0aGlzLm1hdHJpeC5kZWNvbXBvc2UoIHRoaXMucG9zaXRpb24sIHRoaXMucXVhdGVybmlvbiwgdGhpcy5zY2FsZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFwcGxpZXMgYSByb3RhdGlvbiByZXByZXNlbnRlZCBieSBnaXZlbiB0aGUgcXVhdGVybmlvbiB0byB0aGUgM0Qgb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtRdWF0ZXJuaW9ufSBxIC0gVGhlIHF1YXRlcm5pb24uXHJcblx0ICogQHJldHVybiB7T2JqZWN0M0R9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0YXBwbHlRdWF0ZXJuaW9uKCBxICkge1xyXG5cclxuXHRcdHRoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseSggcSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGdpdmVuIHJvdGF0aW9uIHJlcHJlc2VudGVkIGFzIGFuIGF4aXMvYW5nbGUgY291cGxlIHRvIHRoZSAzRCBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IGF4aXMgLSBUaGUgKG5vcm1hbGl6ZWQpIGF4aXMgdmVjdG9yLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhbmdsZSAtIFRoZSBhbmdsZSBpbiByYWRpYW5zLlxyXG5cdCAqL1xyXG5cdHNldFJvdGF0aW9uRnJvbUF4aXNBbmdsZSggYXhpcywgYW5nbGUgKSB7XHJcblxyXG5cdFx0Ly8gYXNzdW1lcyBheGlzIGlzIG5vcm1hbGl6ZWRcclxuXHJcblx0XHR0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUF4aXNBbmdsZSggYXhpcywgYW5nbGUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBnaXZlbiByb3RhdGlvbiByZXByZXNlbnRlZCBhcyBFdWxlciBhbmdsZXMgdG8gdGhlIDNEIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7RXVsZXJ9IGV1bGVyIC0gVGhlIEV1bGVyIGFuZ2xlcy5cclxuXHQgKi9cclxuXHRzZXRSb3RhdGlvbkZyb21FdWxlciggZXVsZXIgKSB7XHJcblxyXG5cdFx0dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21FdWxlciggZXVsZXIsIHRydWUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBnaXZlbiByb3RhdGlvbiByZXByZXNlbnRlZCBhcyByb3RhdGlvbiBtYXRyaXggdG8gdGhlIDNEIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4NH0gbSAtIEFsdGhvdWdoIGEgNHg0IG1hdHJpeCBpcyBleHBlY3RlZCwgdGhlIHVwcGVyIDN4MyBwb3J0aW9uIG11c3QgYmVcclxuXHQgKiBhIHB1cmUgcm90YXRpb24gbWF0cml4IChpLmUsIHVuc2NhbGVkKS5cclxuXHQgKi9cclxuXHRzZXRSb3RhdGlvbkZyb21NYXRyaXgoIG0gKSB7XHJcblxyXG5cdFx0Ly8gYXNzdW1lcyB0aGUgdXBwZXIgM3gzIG9mIG0gaXMgYSBwdXJlIHJvdGF0aW9uIG1hdHJpeCAoaS5lLCB1bnNjYWxlZClcclxuXHJcblx0XHR0aGlzLnF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KCBtICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZ2l2ZW4gcm90YXRpb24gcmVwcmVzZW50ZWQgYXMgYSBRdWF0ZXJuaW9uIHRvIHRoZSAzRCBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1F1YXRlcm5pb259IHEgLSBUaGUgUXVhdGVybmlvblxyXG5cdCAqL1xyXG5cdHNldFJvdGF0aW9uRnJvbVF1YXRlcm5pb24oIHEgKSB7XHJcblxyXG5cdFx0Ly8gYXNzdW1lcyBxIGlzIG5vcm1hbGl6ZWRcclxuXHJcblx0XHR0aGlzLnF1YXRlcm5pb24uY29weSggcSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJvdGF0ZXMgdGhlIDNEIG9iamVjdCBhbG9uZyBhbiBheGlzIGluIGxvY2FsIHNwYWNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBheGlzIC0gVGhlIChub3JtYWxpemVkKSBheGlzIHZlY3Rvci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYW5nbGUgLSBUaGUgYW5nbGUgaW4gcmFkaWFucy5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3QzRH0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRyb3RhdGVPbkF4aXMoIGF4aXMsIGFuZ2xlICkge1xyXG5cclxuXHRcdC8vIHJvdGF0ZSBvYmplY3Qgb24gYXhpcyBpbiBvYmplY3Qgc3BhY2VcclxuXHRcdC8vIGF4aXMgaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkXHJcblxyXG5cdFx0X3ExLnNldEZyb21BeGlzQW5nbGUoIGF4aXMsIGFuZ2xlICk7XHJcblxyXG5cdFx0dGhpcy5xdWF0ZXJuaW9uLm11bHRpcGx5KCBfcTEgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSb3RhdGVzIHRoZSAzRCBvYmplY3QgYWxvbmcgYW4gYXhpcyBpbiB3b3JsZCBzcGFjZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gYXhpcyAtIFRoZSAobm9ybWFsaXplZCkgYXhpcyB2ZWN0b3IuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFuZ2xlIC0gVGhlIGFuZ2xlIGluIHJhZGlhbnMuXHJcblx0ICogQHJldHVybiB7T2JqZWN0M0R9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0cm90YXRlT25Xb3JsZEF4aXMoIGF4aXMsIGFuZ2xlICkge1xyXG5cclxuXHRcdC8vIHJvdGF0ZSBvYmplY3Qgb24gYXhpcyBpbiB3b3JsZCBzcGFjZVxyXG5cdFx0Ly8gYXhpcyBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWRcclxuXHRcdC8vIG1ldGhvZCBhc3N1bWVzIG5vIHJvdGF0ZWQgcGFyZW50XHJcblxyXG5cdFx0X3ExLnNldEZyb21BeGlzQW5nbGUoIGF4aXMsIGFuZ2xlICk7XHJcblxyXG5cdFx0dGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KCBfcTEgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSb3RhdGVzIHRoZSAzRCBvYmplY3QgYXJvdW5kIGl0cyBYIGF4aXMgaW4gbG9jYWwgc3BhY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYW5nbGUgLSBUaGUgYW5nbGUgaW4gcmFkaWFucy5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3QzRH0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRyb3RhdGVYKCBhbmdsZSApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMoIF94QXhpcywgYW5nbGUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSb3RhdGVzIHRoZSAzRCBvYmplY3QgYXJvdW5kIGl0cyBZIGF4aXMgaW4gbG9jYWwgc3BhY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYW5nbGUgLSBUaGUgYW5nbGUgaW4gcmFkaWFucy5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3QzRH0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRyb3RhdGVZKCBhbmdsZSApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMoIF95QXhpcywgYW5nbGUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSb3RhdGVzIHRoZSAzRCBvYmplY3QgYXJvdW5kIGl0cyBaIGF4aXMgaW4gbG9jYWwgc3BhY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYW5nbGUgLSBUaGUgYW5nbGUgaW4gcmFkaWFucy5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3QzRH0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRyb3RhdGVaKCBhbmdsZSApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMoIF96QXhpcywgYW5nbGUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUcmFuc2xhdGUgdGhlIDNEIG9iamVjdCBieSBhIGRpc3RhbmNlIGFsb25nIHRoZSBnaXZlbiBheGlzIGluIGxvY2FsIHNwYWNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBheGlzIC0gVGhlIChub3JtYWxpemVkKSBheGlzIHZlY3Rvci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZGlzdGFuY2UgLSBUaGUgZGlzdGFuY2UgaW4gd29ybGQgdW5pdHMuXHJcblx0ICogQHJldHVybiB7T2JqZWN0M0R9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0dHJhbnNsYXRlT25BeGlzKCBheGlzLCBkaXN0YW5jZSApIHtcclxuXHJcblx0XHQvLyB0cmFuc2xhdGUgb2JqZWN0IGJ5IGRpc3RhbmNlIGFsb25nIGF4aXMgaW4gb2JqZWN0IHNwYWNlXHJcblx0XHQvLyBheGlzIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZFxyXG5cclxuXHRcdF92MS5jb3B5KCBheGlzICkuYXBwbHlRdWF0ZXJuaW9uKCB0aGlzLnF1YXRlcm5pb24gKTtcclxuXHJcblx0XHR0aGlzLnBvc2l0aW9uLmFkZCggX3YxLm11bHRpcGx5U2NhbGFyKCBkaXN0YW5jZSApICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVHJhbnNsYXRlIHRoZSAzRCBvYmplY3QgYnkgYSBkaXN0YW5jZSBhbG9uZyBpdHMgWC1heGlzIGluIGxvY2FsIHNwYWNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGRpc3RhbmNlIC0gVGhlIGRpc3RhbmNlIGluIHdvcmxkIHVuaXRzLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdDNEfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHRyYW5zbGF0ZVgoIGRpc3RhbmNlICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyggX3hBeGlzLCBkaXN0YW5jZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRyYW5zbGF0ZSB0aGUgM0Qgb2JqZWN0IGJ5IGEgZGlzdGFuY2UgYWxvbmcgaXRzIFktYXhpcyBpbiBsb2NhbCBzcGFjZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBkaXN0YW5jZSAtIFRoZSBkaXN0YW5jZSBpbiB3b3JsZCB1bml0cy5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3QzRH0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHR0cmFuc2xhdGVZKCBkaXN0YW5jZSApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMoIF95QXhpcywgZGlzdGFuY2UgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUcmFuc2xhdGUgdGhlIDNEIG9iamVjdCBieSBhIGRpc3RhbmNlIGFsb25nIGl0cyBaLWF4aXMgaW4gbG9jYWwgc3BhY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZGlzdGFuY2UgLSBUaGUgZGlzdGFuY2UgaW4gd29ybGQgdW5pdHMuXHJcblx0ICogQHJldHVybiB7T2JqZWN0M0R9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0dHJhbnNsYXRlWiggZGlzdGFuY2UgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKCBfekF4aXMsIGRpc3RhbmNlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29udmVydHMgdGhlIGdpdmVuIHZlY3RvciBmcm9tIHRoaXMgM0Qgb2JqZWN0J3MgbG9jYWwgc3BhY2UgdG8gd29ybGQgc3BhY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHZlY3RvciAtIFRoZSB2ZWN0b3IgdG8gY29udmVydC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBUaGUgY29udmVydGVkIHZlY3Rvci5cclxuXHQgKi9cclxuXHRsb2NhbFRvV29ybGQoIHZlY3RvciApIHtcclxuXHJcblx0XHR0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCB0cnVlLCBmYWxzZSApO1xyXG5cclxuXHRcdHJldHVybiB2ZWN0b3IuYXBwbHlNYXRyaXg0KCB0aGlzLm1hdHJpeFdvcmxkICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29udmVydHMgdGhlIGdpdmVuIHZlY3RvciBmcm9tIHRoaXMgM0Qgb2JqZWN0J3Mgd29yZCBzcGFjZSB0byBsb2NhbCBzcGFjZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdmVjdG9yIC0gVGhlIHZlY3RvciB0byBjb252ZXJ0LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IFRoZSBjb252ZXJ0ZWQgdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHdvcmxkVG9Mb2NhbCggdmVjdG9yICkge1xyXG5cclxuXHRcdHRoaXMudXBkYXRlV29ybGRNYXRyaXgoIHRydWUsIGZhbHNlICk7XHJcblxyXG5cdFx0cmV0dXJuIHZlY3Rvci5hcHBseU1hdHJpeDQoIF9tMS5jb3B5KCB0aGlzLm1hdHJpeFdvcmxkICkuaW52ZXJ0KCkgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSb3RhdGVzIHRoZSBvYmplY3QgdG8gZmFjZSBhIHBvaW50IGluIHdvcmxkIHNwYWNlLlxyXG5cdCAqXHJcblx0ICogVGhpcyBtZXRob2QgZG9lcyBub3Qgc3VwcG9ydCBvYmplY3RzIGhhdmluZyBub24tdW5pZm9ybWx5LXNjYWxlZCBwYXJlbnQocykuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcnxWZWN0b3IzfSB4IC0gVGhlIHggY29vcmRpbmF0ZSBpbiB3b3JsZCBzcGFjZS4gQWx0ZXJuYXRpdmVseSwgYSB2ZWN0b3IgcmVwcmVzZW50aW5nIGEgcG9zaXRpb24gaW4gd29ybGQgc3BhY2VcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3ldIC0gVGhlIHkgY29vcmRpbmF0ZSBpbiB3b3JsZCBzcGFjZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3pdIC0gVGhlIHogY29vcmRpbmF0ZSBpbiB3b3JsZCBzcGFjZS5cclxuXHQgKi9cclxuXHRsb29rQXQoIHgsIHksIHogKSB7XHJcblxyXG5cdFx0Ly8gVGhpcyBtZXRob2QgZG9lcyBub3Qgc3VwcG9ydCBvYmplY3RzIGhhdmluZyBub24tdW5pZm9ybWx5LXNjYWxlZCBwYXJlbnQocylcclxuXHJcblx0XHRpZiAoIHguaXNWZWN0b3IzICkge1xyXG5cclxuXHRcdFx0X3RhcmdldC5jb3B5KCB4ICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdF90YXJnZXQuc2V0KCB4LCB5LCB6ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHBhcmVudCA9IHRoaXMucGFyZW50O1xyXG5cclxuXHRcdHRoaXMudXBkYXRlV29ybGRNYXRyaXgoIHRydWUsIGZhbHNlICk7XHJcblxyXG5cdFx0X3Bvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5tYXRyaXhXb3JsZCApO1xyXG5cclxuXHRcdGlmICggdGhpcy5pc0NhbWVyYSB8fCB0aGlzLmlzTGlnaHQgKSB7XHJcblxyXG5cdFx0XHRfbTEubG9va0F0KCBfcG9zaXRpb24sIF90YXJnZXQsIHRoaXMudXAgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0X20xLmxvb2tBdCggX3RhcmdldCwgX3Bvc2l0aW9uLCB0aGlzLnVwICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMucXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgoIF9tMSApO1xyXG5cclxuXHRcdGlmICggcGFyZW50ICkge1xyXG5cclxuXHRcdFx0X20xLmV4dHJhY3RSb3RhdGlvbiggcGFyZW50Lm1hdHJpeFdvcmxkICk7XHJcblx0XHRcdF9xMS5zZXRGcm9tUm90YXRpb25NYXRyaXgoIF9tMSApO1xyXG5cdFx0XHR0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkoIF9xMS5pbnZlcnQoKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIHRoZSBnaXZlbiAzRCBvYmplY3QgYXMgYSBjaGlsZCB0byB0aGlzIDNEIG9iamVjdC4gQW4gYXJiaXRyYXJ5IG51bWJlciBvZlxyXG5cdCAqIG9iamVjdHMgbWF5IGJlIGFkZGVkLiBBbnkgY3VycmVudCBwYXJlbnQgb24gYW4gb2JqZWN0IHBhc3NlZCBpbiBoZXJlIHdpbGwgYmVcclxuXHQgKiByZW1vdmVkLCBzaW5jZSBhbiBvYmplY3QgY2FuIGhhdmUgYXQgbW9zdCBvbmUgcGFyZW50LlxyXG5cdCAqXHJcblx0ICogQGZpcmVzIE9iamVjdDNEI2FkZGVkXHJcblx0ICogQGZpcmVzIE9iamVjdDNEI2NoaWxkYWRkZWRcclxuXHQgKiBAcGFyYW0ge09iamVjdDNEfSBvYmplY3QgLSBUaGUgM0Qgb2JqZWN0IHRvIGFkZC5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3QzRH0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRhZGQoIG9iamVjdCApIHtcclxuXHJcblx0XHRpZiAoIGFyZ3VtZW50cy5sZW5ndGggPiAxICkge1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5hZGQoIGFyZ3VtZW50c1sgaSBdICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBvYmplY3QgPT09IHRoaXMgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuT2JqZWN0M0QuYWRkOiBvYmplY3QgY2FuXFwndCBiZSBhZGRlZCBhcyBhIGNoaWxkIG9mIGl0c2VsZi4nLCBvYmplY3QgKTtcclxuXHRcdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggb2JqZWN0ICYmIG9iamVjdC5pc09iamVjdDNEICkge1xyXG5cclxuXHRcdFx0b2JqZWN0LnJlbW92ZUZyb21QYXJlbnQoKTtcclxuXHRcdFx0b2JqZWN0LnBhcmVudCA9IHRoaXM7XHJcblx0XHRcdHRoaXMuY2hpbGRyZW4ucHVzaCggb2JqZWN0ICk7XHJcblxyXG5cdFx0XHRvYmplY3QuZGlzcGF0Y2hFdmVudCggX2FkZGVkRXZlbnQgKTtcclxuXHJcblx0XHRcdF9jaGlsZGFkZGVkRXZlbnQuY2hpbGQgPSBvYmplY3Q7XHJcblx0XHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggX2NoaWxkYWRkZWRFdmVudCApO1xyXG5cdFx0XHRfY2hpbGRhZGRlZEV2ZW50LmNoaWxkID0gbnVsbDtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk9iamVjdDNELmFkZDogb2JqZWN0IG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5PYmplY3QzRC4nLCBvYmplY3QgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVtb3ZlcyB0aGUgZ2l2ZW4gM0Qgb2JqZWN0IGFzIGNoaWxkIGZyb20gdGhpcyAzRCBvYmplY3QuXHJcblx0ICogQW4gYXJiaXRyYXJ5IG51bWJlciBvZiBvYmplY3RzIG1heSBiZSByZW1vdmVkLlxyXG5cdCAqXHJcblx0ICogQGZpcmVzIE9iamVjdDNEI3JlbW92ZWRcclxuXHQgKiBAZmlyZXMgT2JqZWN0M0QjY2hpbGRyZW1vdmVkXHJcblx0ICogQHBhcmFtIHtPYmplY3QzRH0gb2JqZWN0IC0gVGhlIDNEIG9iamVjdCB0byByZW1vdmUuXHJcblx0ICogQHJldHVybiB7T2JqZWN0M0R9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0cmVtb3ZlKCBvYmplY3QgKSB7XHJcblxyXG5cdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoID4gMSApIHtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdHRoaXMucmVtb3ZlKCBhcmd1bWVudHNbIGkgXSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGluZGV4ID0gdGhpcy5jaGlsZHJlbi5pbmRleE9mKCBvYmplY3QgKTtcclxuXHJcblx0XHRpZiAoIGluZGV4ICE9PSAtIDEgKSB7XHJcblxyXG5cdFx0XHRvYmplY3QucGFyZW50ID0gbnVsbDtcclxuXHRcdFx0dGhpcy5jaGlsZHJlbi5zcGxpY2UoIGluZGV4LCAxICk7XHJcblxyXG5cdFx0XHRvYmplY3QuZGlzcGF0Y2hFdmVudCggX3JlbW92ZWRFdmVudCApO1xyXG5cclxuXHRcdFx0X2NoaWxkcmVtb3ZlZEV2ZW50LmNoaWxkID0gb2JqZWN0O1xyXG5cdFx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoIF9jaGlsZHJlbW92ZWRFdmVudCApO1xyXG5cdFx0XHRfY2hpbGRyZW1vdmVkRXZlbnQuY2hpbGQgPSBudWxsO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW1vdmVzIHRoaXMgM0Qgb2JqZWN0IGZyb20gaXRzIGN1cnJlbnQgcGFyZW50LlxyXG5cdCAqXHJcblx0ICogQGZpcmVzIE9iamVjdDNEI3JlbW92ZWRcclxuXHQgKiBAZmlyZXMgT2JqZWN0M0QjY2hpbGRyZW1vdmVkXHJcblx0ICogQHJldHVybiB7T2JqZWN0M0R9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0cmVtb3ZlRnJvbVBhcmVudCgpIHtcclxuXHJcblx0XHRjb25zdCBwYXJlbnQgPSB0aGlzLnBhcmVudDtcclxuXHJcblx0XHRpZiAoIHBhcmVudCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHBhcmVudC5yZW1vdmUoIHRoaXMgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVtb3ZlcyBhbGwgY2hpbGQgb2JqZWN0cy5cclxuXHQgKlxyXG5cdCAqIEBmaXJlcyBPYmplY3QzRCNyZW1vdmVkXHJcblx0ICogQGZpcmVzIE9iamVjdDNEI2NoaWxkcmVtb3ZlZFxyXG5cdCAqIEByZXR1cm4ge09iamVjdDNEfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNsZWFyKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnJlbW92ZSggLi4uIHRoaXMuY2hpbGRyZW4gKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIHRoZSBnaXZlbiAzRCBvYmplY3QgYXMgYSBjaGlsZCBvZiB0aGlzIDNEIG9iamVjdCwgd2hpbGUgbWFpbnRhaW5pbmcgdGhlIG9iamVjdCdzIHdvcmxkXHJcblx0ICogdHJhbnNmb3JtLiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBzdXBwb3J0IHNjZW5lIGdyYXBocyBoYXZpbmcgbm9uLXVuaWZvcm1seS1zY2FsZWQgbm9kZXMocykuXHJcblx0ICpcclxuXHQgKiBAZmlyZXMgT2JqZWN0M0QjYWRkZWRcclxuXHQgKiBAZmlyZXMgT2JqZWN0M0QjY2hpbGRhZGRlZFxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0M0R9IG9iamVjdCAtIFRoZSAzRCBvYmplY3QgdG8gYXR0YWNoLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdDNEfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGF0dGFjaCggb2JqZWN0ICkge1xyXG5cclxuXHRcdC8vIGFkZHMgb2JqZWN0IGFzIGEgY2hpbGQgb2YgdGhpcywgd2hpbGUgbWFpbnRhaW5pbmcgdGhlIG9iamVjdCdzIHdvcmxkIHRyYW5zZm9ybVxyXG5cclxuXHRcdC8vIE5vdGU6IFRoaXMgbWV0aG9kIGRvZXMgbm90IHN1cHBvcnQgc2NlbmUgZ3JhcGhzIGhhdmluZyBub24tdW5pZm9ybWx5LXNjYWxlZCBub2RlcyhzKVxyXG5cclxuXHRcdHRoaXMudXBkYXRlV29ybGRNYXRyaXgoIHRydWUsIGZhbHNlICk7XHJcblxyXG5cdFx0X20xLmNvcHkoIHRoaXMubWF0cml4V29ybGQgKS5pbnZlcnQoKTtcclxuXHJcblx0XHRpZiAoIG9iamVjdC5wYXJlbnQgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRvYmplY3QucGFyZW50LnVwZGF0ZVdvcmxkTWF0cml4KCB0cnVlLCBmYWxzZSApO1xyXG5cclxuXHRcdFx0X20xLm11bHRpcGx5KCBvYmplY3QucGFyZW50Lm1hdHJpeFdvcmxkICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdG9iamVjdC5hcHBseU1hdHJpeDQoIF9tMSApO1xyXG5cclxuXHRcdG9iamVjdC5yZW1vdmVGcm9tUGFyZW50KCk7XHJcblx0XHRvYmplY3QucGFyZW50ID0gdGhpcztcclxuXHRcdHRoaXMuY2hpbGRyZW4ucHVzaCggb2JqZWN0ICk7XHJcblxyXG5cdFx0b2JqZWN0LnVwZGF0ZVdvcmxkTWF0cml4KCBmYWxzZSwgdHJ1ZSApO1xyXG5cclxuXHRcdG9iamVjdC5kaXNwYXRjaEV2ZW50KCBfYWRkZWRFdmVudCApO1xyXG5cclxuXHRcdF9jaGlsZGFkZGVkRXZlbnQuY2hpbGQgPSBvYmplY3Q7XHJcblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoIF9jaGlsZGFkZGVkRXZlbnQgKTtcclxuXHRcdF9jaGlsZGFkZGVkRXZlbnQuY2hpbGQgPSBudWxsO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNlYXJjaGVzIHRocm91Z2ggdGhlIDNEIG9iamVjdCBhbmQgaXRzIGNoaWxkcmVuLCBzdGFydGluZyB3aXRoIHRoZSAzRCBvYmplY3RcclxuXHQgKiBpdHNlbGYsIGFuZCByZXR1cm5zIHRoZSBmaXJzdCB3aXRoIGEgbWF0Y2hpbmcgSUQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaWQgLSBUaGUgaWQuXHJcblx0ICogQHJldHVybiB7T2JqZWN0M0R8dW5kZWZpbmVkfSBUaGUgZm91bmQgM0Qgb2JqZWN0LiBSZXR1cm5zIGB1bmRlZmluZWRgIGlmIG5vIDNEIG9iamVjdCBoYXMgYmVlbiBmb3VuZC5cclxuXHQgKi9cclxuXHRnZXRPYmplY3RCeUlkKCBpZCApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5nZXRPYmplY3RCeVByb3BlcnR5KCAnaWQnLCBpZCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNlYXJjaGVzIHRocm91Z2ggdGhlIDNEIG9iamVjdCBhbmQgaXRzIGNoaWxkcmVuLCBzdGFydGluZyB3aXRoIHRoZSAzRCBvYmplY3RcclxuXHQgKiBpdHNlbGYsIGFuZCByZXR1cm5zIHRoZSBmaXJzdCB3aXRoIGEgbWF0Y2hpbmcgbmFtZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUuXHJcblx0ICogQHJldHVybiB7T2JqZWN0M0R8dW5kZWZpbmVkfSBUaGUgZm91bmQgM0Qgb2JqZWN0LiBSZXR1cm5zIGB1bmRlZmluZWRgIGlmIG5vIDNEIG9iamVjdCBoYXMgYmVlbiBmb3VuZC5cclxuXHQgKi9cclxuXHRnZXRPYmplY3RCeU5hbWUoIG5hbWUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlQcm9wZXJ0eSggJ25hbWUnLCBuYW1lICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2VhcmNoZXMgdGhyb3VnaCB0aGUgM0Qgb2JqZWN0IGFuZCBpdHMgY2hpbGRyZW4sIHN0YXJ0aW5nIHdpdGggdGhlIDNEIG9iamVjdFxyXG5cdCAqIGl0c2VsZiwgYW5kIHJldHVybnMgdGhlIGZpcnN0IHdpdGggYSBtYXRjaGluZyBwcm9wZXJ0eSB2YWx1ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LlxyXG5cdCAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIFRoZSB2YWx1ZS5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3QzRHx1bmRlZmluZWR9IFRoZSBmb3VuZCAzRCBvYmplY3QuIFJldHVybnMgYHVuZGVmaW5lZGAgaWYgbm8gM0Qgb2JqZWN0IGhhcyBiZWVuIGZvdW5kLlxyXG5cdCAqL1xyXG5cdGdldE9iamVjdEJ5UHJvcGVydHkoIG5hbWUsIHZhbHVlICkge1xyXG5cclxuXHRcdGlmICggdGhpc1sgbmFtZSBdID09PSB2YWx1ZSApIHJldHVybiB0aGlzO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGNoaWxkID0gdGhpcy5jaGlsZHJlblsgaSBdO1xyXG5cdFx0XHRjb25zdCBvYmplY3QgPSBjaGlsZC5nZXRPYmplY3RCeVByb3BlcnR5KCBuYW1lLCB2YWx1ZSApO1xyXG5cclxuXHRcdFx0aWYgKCBvYmplY3QgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0cmV0dXJuIG9iamVjdDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZWFyY2hlcyB0aHJvdWdoIHRoZSAzRCBvYmplY3QgYW5kIGl0cyBjaGlsZHJlbiwgc3RhcnRpbmcgd2l0aCB0aGUgM0Qgb2JqZWN0XHJcblx0ICogaXRzZWxmLCBhbmQgcmV0dXJucyBhbGwgM0Qgb2JqZWN0cyB3aXRoIGEgbWF0Y2hpbmcgcHJvcGVydHkgdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS5cclxuXHQgKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBUaGUgdmFsdWUuXHJcblx0ICogQHBhcmFtIHtBcnJheTxPYmplY3QzRD59IHJlc3VsdCAtIFRoZSBtZXRob2Qgc3RvcmVzIHRoZSByZXN1bHQgaW4gdGhpcyBhcnJheS5cclxuXHQgKiBAcmV0dXJuIHtBcnJheTxPYmplY3QzRD59IFRoZSBmb3VuZCAzRCBvYmplY3RzLlxyXG5cdCAqL1xyXG5cdGdldE9iamVjdHNCeVByb3BlcnR5KCBuYW1lLCB2YWx1ZSwgcmVzdWx0ID0gW10gKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzWyBuYW1lIF0gPT09IHZhbHVlICkgcmVzdWx0LnB1c2goIHRoaXMgKTtcclxuXHJcblx0XHRjb25zdCBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW47XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNoaWxkcmVuWyBpIF0uZ2V0T2JqZWN0c0J5UHJvcGVydHkoIG5hbWUsIHZhbHVlLCByZXN1bHQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgdmVjdG9yIHJlcHJlc2VudGluZyB0aGUgcG9zaXRpb24gb2YgdGhlIDNEIG9iamVjdCBpbiB3b3JsZCBzcGFjZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdGFyZ2V0IC0gVGhlIHRhcmdldCB2ZWN0b3IgdGhlIHJlc3VsdCBpcyBzdG9yZWQgdG8uXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gVGhlIDNEIG9iamVjdCdzIHBvc2l0aW9uIGluIHdvcmxkIHNwYWNlLlxyXG5cdCAqL1xyXG5cdGdldFdvcmxkUG9zaXRpb24oIHRhcmdldCApIHtcclxuXHJcblx0XHR0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCB0cnVlLCBmYWxzZSApO1xyXG5cclxuXHRcdHJldHVybiB0YXJnZXQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLm1hdHJpeFdvcmxkICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIFF1YXRlcm5pb24gcmVwcmVzZW50aW5nIHRoZSBwb3NpdGlvbiBvZiB0aGUgM0Qgb2JqZWN0IGluIHdvcmxkIHNwYWNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtRdWF0ZXJuaW9ufSB0YXJnZXQgLSBUaGUgdGFyZ2V0IFF1YXRlcm5pb24gdGhlIHJlc3VsdCBpcyBzdG9yZWQgdG8uXHJcblx0ICogQHJldHVybiB7UXVhdGVybmlvbn0gVGhlIDNEIG9iamVjdCdzIHJvdGF0aW9uIGluIHdvcmxkIHNwYWNlLlxyXG5cdCAqL1xyXG5cdGdldFdvcmxkUXVhdGVybmlvbiggdGFyZ2V0ICkge1xyXG5cclxuXHRcdHRoaXMudXBkYXRlV29ybGRNYXRyaXgoIHRydWUsIGZhbHNlICk7XHJcblxyXG5cdFx0dGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoIF9wb3NpdGlvbiwgdGFyZ2V0LCBfc2NhbGUgKTtcclxuXHJcblx0XHRyZXR1cm4gdGFyZ2V0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSB2ZWN0b3IgcmVwcmVzZW50aW5nIHRoZSBzY2FsZSBvZiB0aGUgM0Qgb2JqZWN0IGluIHdvcmxkIHNwYWNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IHZlY3RvciB0aGUgcmVzdWx0IGlzIHN0b3JlZCB0by5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBUaGUgM0Qgb2JqZWN0J3Mgc2NhbGUgaW4gd29ybGQgc3BhY2UuXHJcblx0ICovXHJcblx0Z2V0V29ybGRTY2FsZSggdGFyZ2V0ICkge1xyXG5cclxuXHRcdHRoaXMudXBkYXRlV29ybGRNYXRyaXgoIHRydWUsIGZhbHNlICk7XHJcblxyXG5cdFx0dGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoIF9wb3NpdGlvbiwgX3F1YXRlcm5pb24sIHRhcmdldCApO1xyXG5cclxuXHRcdHJldHVybiB0YXJnZXQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIHZlY3RvciByZXByZXNlbnRpbmcgdGhlIChcImxvb2tcIikgZGlyZWN0aW9uIG9mIHRoZSAzRCBvYmplY3QgaW4gd29ybGQgc3BhY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHRhcmdldCAtIFRoZSB0YXJnZXQgdmVjdG9yIHRoZSByZXN1bHQgaXMgc3RvcmVkIHRvLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IFRoZSAzRCBvYmplY3QncyBkaXJlY3Rpb24gaW4gd29ybGQgc3BhY2UuXHJcblx0ICovXHJcblx0Z2V0V29ybGREaXJlY3Rpb24oIHRhcmdldCApIHtcclxuXHJcblx0XHR0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCB0cnVlLCBmYWxzZSApO1xyXG5cclxuXHRcdGNvbnN0IGUgPSB0aGlzLm1hdHJpeFdvcmxkLmVsZW1lbnRzO1xyXG5cclxuXHRcdHJldHVybiB0YXJnZXQuc2V0KCBlWyA4IF0sIGVbIDkgXSwgZVsgMTAgXSApLm5vcm1hbGl6ZSgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFic3RyYWN0IG1ldGhvZCB0byBnZXQgaW50ZXJzZWN0aW9ucyBiZXR3ZWVuIGEgY2FzdGVkIHJheSBhbmQgdGhpc1xyXG5cdCAqIDNEIG9iamVjdC4gUmVuZGVyYWJsZSAzRCBvYmplY3RzIHN1Y2ggYXMge0BsaW5rIE1lc2h9LCB7QGxpbmsgTGluZX0gb3Ige0BsaW5rIFBvaW50c31cclxuXHQgKiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgaW4gb3JkZXIgdG8gdXNlIHJheWNhc3RpbmcuXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcGFyYW0ge1JheWNhc3Rlcn0gcmF5Y2FzdGVyIC0gVGhlIHJheWNhc3Rlci5cclxuXHQgKiBAcGFyYW0ge0FycmF5PE9iamVjdD59IGludGVyc2VjdHMgLSBBbiBhcnJheSBob2xkaW5nIHRoZSByZXN1bHQgb2YgdGhlIG1ldGhvZC5cclxuXHQgKi9cclxuXHRyYXljYXN0KCAvKiByYXljYXN0ZXIsIGludGVyc2VjdHMgKi8gKSB7fVxyXG5cclxuXHQvKipcclxuXHQgKiBFeGVjdXRlcyB0aGUgY2FsbGJhY2sgb24gdGhpcyAzRCBvYmplY3QgYW5kIGFsbCBkZXNjZW5kYW50cy5cclxuXHQgKlxyXG5cdCAqIE5vdGU6IE1vZGlmeWluZyB0aGUgc2NlbmUgZ3JhcGggaW5zaWRlIHRoZSBjYWxsYmFjayBpcyBkaXNjb3VyYWdlZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIC0gQSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGFsbG93cyB0byBwcm9jZXNzIHRoZSBjdXJyZW50IDNEIG9iamVjdC5cclxuXHQgKi9cclxuXHR0cmF2ZXJzZSggY2FsbGJhY2sgKSB7XHJcblxyXG5cdFx0Y2FsbGJhY2soIHRoaXMgKTtcclxuXHJcblx0XHRjb25zdCBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW47XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNoaWxkcmVuWyBpIF0udHJhdmVyc2UoIGNhbGxiYWNrICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIExpa2Uge0BsaW5rIE9iamVjdDNEI3RyYXZlcnNlfSwgYnV0IHRoZSBjYWxsYmFjayB3aWxsIG9ubHkgYmUgZXhlY3V0ZWQgZm9yIHZpc2libGUgM0Qgb2JqZWN0cy5cclxuXHQgKiBEZXNjZW5kYW50cyBvZiBpbnZpc2libGUgM0Qgb2JqZWN0cyBhcmUgbm90IHRyYXZlcnNlZC5cclxuXHQgKlxyXG5cdCAqIE5vdGU6IE1vZGlmeWluZyB0aGUgc2NlbmUgZ3JhcGggaW5zaWRlIHRoZSBjYWxsYmFjayBpcyBkaXNjb3VyYWdlZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIC0gQSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGFsbG93cyB0byBwcm9jZXNzIHRoZSBjdXJyZW50IDNEIG9iamVjdC5cclxuXHQgKi9cclxuXHR0cmF2ZXJzZVZpc2libGUoIGNhbGxiYWNrICkge1xyXG5cclxuXHRcdGlmICggdGhpcy52aXNpYmxlID09PSBmYWxzZSApIHJldHVybjtcclxuXHJcblx0XHRjYWxsYmFjayggdGhpcyApO1xyXG5cclxuXHRcdGNvbnN0IGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbjtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y2hpbGRyZW5bIGkgXS50cmF2ZXJzZVZpc2libGUoIGNhbGxiYWNrICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIExpa2Uge0BsaW5rIE9iamVjdDNEI3RyYXZlcnNlfSwgYnV0IHRoZSBjYWxsYmFjayB3aWxsIG9ubHkgYmUgZXhlY3V0ZWQgZm9yIGFsbCBhbmNlc3RvcnMuXHJcblx0ICpcclxuXHQgKiBOb3RlOiBNb2RpZnlpbmcgdGhlIHNjZW5lIGdyYXBoIGluc2lkZSB0aGUgY2FsbGJhY2sgaXMgZGlzY291cmFnZWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayAtIEEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBhbGxvd3MgdG8gcHJvY2VzcyB0aGUgY3VycmVudCAzRCBvYmplY3QuXHJcblx0ICovXHJcblx0dHJhdmVyc2VBbmNlc3RvcnMoIGNhbGxiYWNrICkge1xyXG5cclxuXHRcdGNvbnN0IHBhcmVudCA9IHRoaXMucGFyZW50O1xyXG5cclxuXHRcdGlmICggcGFyZW50ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0Y2FsbGJhY2soIHBhcmVudCApO1xyXG5cclxuXHRcdFx0cGFyZW50LnRyYXZlcnNlQW5jZXN0b3JzKCBjYWxsYmFjayApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggaW4gbG9jYWwgc3BhY2UgYnkgY29tcHV0aW5nIGl0IGZyb20gdGhlIGN1cnJlbnRcclxuXHQgKiBwb3NpdGlvbiwgcm90YXRpb24gYW5kIHNjYWxlIHZhbHVlcy5cclxuXHQgKi9cclxuXHR1cGRhdGVNYXRyaXgoKSB7XHJcblxyXG5cdFx0dGhpcy5tYXRyaXguY29tcG9zZSggdGhpcy5wb3NpdGlvbiwgdGhpcy5xdWF0ZXJuaW9uLCB0aGlzLnNjYWxlICk7XHJcblxyXG5cdFx0dGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggaW4gd29ybGQgc3BhY2Ugb2YgdGhpcyAzRCBvYmplY3RzIGFuZCBpdHMgZGVzY2VuZGFudHMuXHJcblx0ICpcclxuXHQgKiBUbyBlbnN1cmUgY29ycmVjdCByZXN1bHRzLCB0aGlzIG1ldGhvZCBhbHNvIHJlY29tcHV0ZXMgdGhlIDNEIG9iamVjdCdzIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBpblxyXG5cdCAqIGxvY2FsIHNwYWNlLiBUaGUgY29tcHV0YXRpb24gb2YgdGhlIGxvY2FsIGFuZCB3b3JsZCBtYXRyaXggY2FuIGJlIGNvbnRyb2xsZWQgd2l0aCB0aGVcclxuXHQgKiB7QGxpbmsgT2JqZWN0M0QjbWF0cml4QXV0b1VwZGF0ZX0gYW5kIHtAbGluayBPYmplY3QzRCNtYXRyaXhXb3JsZEF1dG9VcGRhdGV9IGZsYWdzIHdoaWNoIGFyZSBib3RoXHJcblx0ICogYHRydWVgIGJ5IGRlZmF1bHQuICBTZXQgdGhlc2UgZmxhZ3MgdG8gYGZhbHNlYCBpZiB5b3UgbmVlZCBtb3JlIGNvbnRyb2wgb3ZlciB0aGUgdXBkYXRlIG1hdHJpeCBwcm9jZXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbZm9yY2U9ZmFsc2VdIC0gV2hlbiBzZXQgdG8gYHRydWVgLCBhIHJlY29tcHV0YXRpb24gb2Ygd29ybGQgbWF0cmljZXMgaXMgZm9yY2VkIGV2ZW5cclxuXHQgKiB3aGVuIHtAbGluayBPYmplY3QzRCNtYXRyaXhXb3JsZEF1dG9VcGRhdGV9IGlzIHNldCB0byBgZmFsc2VgLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZU1hdHJpeFdvcmxkKCBmb3JjZSApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMubWF0cml4QXV0b1VwZGF0ZSApIHRoaXMudXBkYXRlTWF0cml4KCk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgfHwgZm9yY2UgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMubWF0cml4V29ybGRBdXRvVXBkYXRlID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIHRoaXMucGFyZW50ID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRcdHRoaXMubWF0cml4V29ybGQuY29weSggdGhpcy5tYXRyaXggKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHR0aGlzLm1hdHJpeFdvcmxkLm11bHRpcGx5TWF0cmljZXMoIHRoaXMucGFyZW50Lm1hdHJpeFdvcmxkLCB0aGlzLm1hdHJpeCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSBmYWxzZTtcclxuXHJcblx0XHRcdGZvcmNlID0gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gbWFrZSBzdXJlIGRlc2NlbmRhbnRzIGFyZSB1cGRhdGVkIGlmIHJlcXVpcmVkXHJcblxyXG5cdFx0Y29uc3QgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBjaGlsZCA9IGNoaWxkcmVuWyBpIF07XHJcblxyXG5cdFx0XHRjaGlsZC51cGRhdGVNYXRyaXhXb3JsZCggZm9yY2UgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQW4gYWx0ZXJuYXRpdmUgdmVyc2lvbiBvZiB7QGxpbmsgT2JqZWN0M0QjdXBkYXRlTWF0cml4V29ybGR9IHdpdGggbW9yZSBjb250cm9sIG92ZXIgdGhlXHJcblx0ICogdXBkYXRlIG9mIGFuY2VzdG9yIGFuZCBkZXNjZW5kYW50IG5vZGVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbdXBkYXRlUGFyZW50cz1mYWxzZV0gV2hldGhlciBhbmNlc3RvciBub2RlcyBzaG91bGQgYmUgdXBkYXRlZCBvciBub3QuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbdXBkYXRlQ2hpbGRyZW49ZmFsc2VdIFdoZXRoZXIgZGVzY2VuZGFudCBub2RlcyBzaG91bGQgYmUgdXBkYXRlZCBvciBub3QuXHJcblx0ICovXHJcblx0dXBkYXRlV29ybGRNYXRyaXgoIHVwZGF0ZVBhcmVudHMsIHVwZGF0ZUNoaWxkcmVuICkge1xyXG5cclxuXHRcdGNvbnN0IHBhcmVudCA9IHRoaXMucGFyZW50O1xyXG5cclxuXHRcdGlmICggdXBkYXRlUGFyZW50cyA9PT0gdHJ1ZSAmJiBwYXJlbnQgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRwYXJlbnQudXBkYXRlV29ybGRNYXRyaXgoIHRydWUsIGZhbHNlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy5tYXRyaXhBdXRvVXBkYXRlICkgdGhpcy51cGRhdGVNYXRyaXgoKTtcclxuXHJcblx0XHRpZiAoIHRoaXMubWF0cml4V29ybGRBdXRvVXBkYXRlID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLnBhcmVudCA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5tYXRyaXhXb3JsZC5jb3B5KCB0aGlzLm1hdHJpeCApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0dGhpcy5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKCB0aGlzLnBhcmVudC5tYXRyaXhXb3JsZCwgdGhpcy5tYXRyaXggKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gbWFrZSBzdXJlIGRlc2NlbmRhbnRzIGFyZSB1cGRhdGVkXHJcblxyXG5cdFx0aWYgKCB1cGRhdGVDaGlsZHJlbiA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdGNvbnN0IGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbjtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGNoaWxkID0gY2hpbGRyZW5bIGkgXTtcclxuXHJcblx0XHRcdFx0Y2hpbGQudXBkYXRlV29ybGRNYXRyaXgoIGZhbHNlLCB0cnVlICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNlcmlhbGl6ZXMgdGhlIDNEIG9iamVjdCBpbnRvIEpTT04uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gez8oT2JqZWN0fHN0cmluZyl9IG1ldGEgLSBBbiBvcHRpb25hbCB2YWx1ZSBob2xkaW5nIG1ldGEgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlcmlhbGl6YXRpb24uXHJcblx0ICogQHJldHVybiB7T2JqZWN0fSBBIEpTT04gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc2VyaWFsaXplZCAzRCBvYmplY3QuXHJcblx0ICogQHNlZSB7QGxpbmsgT2JqZWN0TG9hZGVyI3BhcnNlfVxyXG5cdCAqL1xyXG5cdHRvSlNPTiggbWV0YSApIHtcclxuXHJcblx0XHQvLyBtZXRhIGlzIGEgc3RyaW5nIHdoZW4gY2FsbGVkIGZyb20gSlNPTi5zdHJpbmdpZnlcclxuXHRcdGNvbnN0IGlzUm9vdE9iamVjdCA9ICggbWV0YSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBtZXRhID09PSAnc3RyaW5nJyApO1xyXG5cclxuXHRcdGNvbnN0IG91dHB1dCA9IHt9O1xyXG5cclxuXHRcdC8vIG1ldGEgaXMgYSBoYXNoIHVzZWQgdG8gY29sbGVjdCBnZW9tZXRyaWVzLCBtYXRlcmlhbHMuXHJcblx0XHQvLyBub3QgcHJvdmlkaW5nIGl0IGltcGxpZXMgdGhhdCB0aGlzIGlzIHRoZSByb290IG9iamVjdFxyXG5cdFx0Ly8gYmVpbmcgc2VyaWFsaXplZC5cclxuXHRcdGlmICggaXNSb290T2JqZWN0ICkge1xyXG5cclxuXHRcdFx0Ly8gaW5pdGlhbGl6ZSBtZXRhIG9ialxyXG5cdFx0XHRtZXRhID0ge1xyXG5cdFx0XHRcdGdlb21ldHJpZXM6IHt9LFxyXG5cdFx0XHRcdG1hdGVyaWFsczoge30sXHJcblx0XHRcdFx0dGV4dHVyZXM6IHt9LFxyXG5cdFx0XHRcdGltYWdlczoge30sXHJcblx0XHRcdFx0c2hhcGVzOiB7fSxcclxuXHRcdFx0XHRza2VsZXRvbnM6IHt9LFxyXG5cdFx0XHRcdGFuaW1hdGlvbnM6IHt9LFxyXG5cdFx0XHRcdG5vZGVzOiB7fVxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0b3V0cHV0Lm1ldGFkYXRhID0ge1xyXG5cdFx0XHRcdHZlcnNpb246IDQuNixcclxuXHRcdFx0XHR0eXBlOiAnT2JqZWN0JyxcclxuXHRcdFx0XHRnZW5lcmF0b3I6ICdPYmplY3QzRC50b0pTT04nXHJcblx0XHRcdH07XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIHN0YW5kYXJkIE9iamVjdDNEIHNlcmlhbGl6YXRpb25cclxuXHJcblx0XHRjb25zdCBvYmplY3QgPSB7fTtcclxuXHJcblx0XHRvYmplY3QudXVpZCA9IHRoaXMudXVpZDtcclxuXHRcdG9iamVjdC50eXBlID0gdGhpcy50eXBlO1xyXG5cclxuXHRcdGlmICggdGhpcy5uYW1lICE9PSAnJyApIG9iamVjdC5uYW1lID0gdGhpcy5uYW1lO1xyXG5cdFx0aWYgKCB0aGlzLmNhc3RTaGFkb3cgPT09IHRydWUgKSBvYmplY3QuY2FzdFNoYWRvdyA9IHRydWU7XHJcblx0XHRpZiAoIHRoaXMucmVjZWl2ZVNoYWRvdyA9PT0gdHJ1ZSApIG9iamVjdC5yZWNlaXZlU2hhZG93ID0gdHJ1ZTtcclxuXHRcdGlmICggdGhpcy52aXNpYmxlID09PSBmYWxzZSApIG9iamVjdC52aXNpYmxlID0gZmFsc2U7XHJcblx0XHRpZiAoIHRoaXMuZnJ1c3R1bUN1bGxlZCA9PT0gZmFsc2UgKSBvYmplY3QuZnJ1c3R1bUN1bGxlZCA9IGZhbHNlO1xyXG5cdFx0aWYgKCB0aGlzLnJlbmRlck9yZGVyICE9PSAwICkgb2JqZWN0LnJlbmRlck9yZGVyID0gdGhpcy5yZW5kZXJPcmRlcjtcclxuXHRcdGlmICggT2JqZWN0LmtleXMoIHRoaXMudXNlckRhdGEgKS5sZW5ndGggPiAwICkgb2JqZWN0LnVzZXJEYXRhID0gdGhpcy51c2VyRGF0YTtcclxuXHJcblx0XHRvYmplY3QubGF5ZXJzID0gdGhpcy5sYXllcnMubWFzaztcclxuXHRcdG9iamVjdC5tYXRyaXggPSB0aGlzLm1hdHJpeC50b0FycmF5KCk7XHJcblx0XHRvYmplY3QudXAgPSB0aGlzLnVwLnRvQXJyYXkoKTtcclxuXHJcblx0XHRpZiAoIHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9PT0gZmFsc2UgKSBvYmplY3QubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xyXG5cclxuXHRcdC8vIG9iamVjdCBzcGVjaWZpYyBwcm9wZXJ0aWVzXHJcblxyXG5cdFx0aWYgKCB0aGlzLmlzSW5zdGFuY2VkTWVzaCApIHtcclxuXHJcblx0XHRcdG9iamVjdC50eXBlID0gJ0luc3RhbmNlZE1lc2gnO1xyXG5cdFx0XHRvYmplY3QuY291bnQgPSB0aGlzLmNvdW50O1xyXG5cdFx0XHRvYmplY3QuaW5zdGFuY2VNYXRyaXggPSB0aGlzLmluc3RhbmNlTWF0cml4LnRvSlNPTigpO1xyXG5cdFx0XHRpZiAoIHRoaXMuaW5zdGFuY2VDb2xvciAhPT0gbnVsbCApIG9iamVjdC5pbnN0YW5jZUNvbG9yID0gdGhpcy5pbnN0YW5jZUNvbG9yLnRvSlNPTigpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMuaXNCYXRjaGVkTWVzaCApIHtcclxuXHJcblx0XHRcdG9iamVjdC50eXBlID0gJ0JhdGNoZWRNZXNoJztcclxuXHRcdFx0b2JqZWN0LnBlck9iamVjdEZydXN0dW1DdWxsZWQgPSB0aGlzLnBlck9iamVjdEZydXN0dW1DdWxsZWQ7XHJcblx0XHRcdG9iamVjdC5zb3J0T2JqZWN0cyA9IHRoaXMuc29ydE9iamVjdHM7XHJcblxyXG5cdFx0XHRvYmplY3QuZHJhd1JhbmdlcyA9IHRoaXMuX2RyYXdSYW5nZXM7XHJcblx0XHRcdG9iamVjdC5yZXNlcnZlZFJhbmdlcyA9IHRoaXMuX3Jlc2VydmVkUmFuZ2VzO1xyXG5cclxuXHRcdFx0b2JqZWN0LnZpc2liaWxpdHkgPSB0aGlzLl92aXNpYmlsaXR5O1xyXG5cdFx0XHRvYmplY3QuYWN0aXZlID0gdGhpcy5fYWN0aXZlO1xyXG5cdFx0XHRvYmplY3QuYm91bmRzID0gdGhpcy5fYm91bmRzLm1hcCggYm91bmQgPT4gKCB7XHJcblx0XHRcdFx0Ym94SW5pdGlhbGl6ZWQ6IGJvdW5kLmJveEluaXRpYWxpemVkLFxyXG5cdFx0XHRcdGJveE1pbjogYm91bmQuYm94Lm1pbi50b0FycmF5KCksXHJcblx0XHRcdFx0Ym94TWF4OiBib3VuZC5ib3gubWF4LnRvQXJyYXkoKSxcclxuXHJcblx0XHRcdFx0c3BoZXJlSW5pdGlhbGl6ZWQ6IGJvdW5kLnNwaGVyZUluaXRpYWxpemVkLFxyXG5cdFx0XHRcdHNwaGVyZVJhZGl1czogYm91bmQuc3BoZXJlLnJhZGl1cyxcclxuXHRcdFx0XHRzcGhlcmVDZW50ZXI6IGJvdW5kLnNwaGVyZS5jZW50ZXIudG9BcnJheSgpXHJcblx0XHRcdH0gKSApO1xyXG5cclxuXHRcdFx0b2JqZWN0Lm1heEluc3RhbmNlQ291bnQgPSB0aGlzLl9tYXhJbnN0YW5jZUNvdW50O1xyXG5cdFx0XHRvYmplY3QubWF4VmVydGV4Q291bnQgPSB0aGlzLl9tYXhWZXJ0ZXhDb3VudDtcclxuXHRcdFx0b2JqZWN0Lm1heEluZGV4Q291bnQgPSB0aGlzLl9tYXhJbmRleENvdW50O1xyXG5cclxuXHRcdFx0b2JqZWN0Lmdlb21ldHJ5SW5pdGlhbGl6ZWQgPSB0aGlzLl9nZW9tZXRyeUluaXRpYWxpemVkO1xyXG5cdFx0XHRvYmplY3QuZ2VvbWV0cnlDb3VudCA9IHRoaXMuX2dlb21ldHJ5Q291bnQ7XHJcblxyXG5cdFx0XHRvYmplY3QubWF0cmljZXNUZXh0dXJlID0gdGhpcy5fbWF0cmljZXNUZXh0dXJlLnRvSlNPTiggbWV0YSApO1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLl9jb2xvcnNUZXh0dXJlICE9PSBudWxsICkgb2JqZWN0LmNvbG9yc1RleHR1cmUgPSB0aGlzLl9jb2xvcnNUZXh0dXJlLnRvSlNPTiggbWV0YSApO1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLmJvdW5kaW5nU3BoZXJlICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRvYmplY3QuYm91bmRpbmdTcGhlcmUgPSB7XHJcblx0XHRcdFx0XHRjZW50ZXI6IG9iamVjdC5ib3VuZGluZ1NwaGVyZS5jZW50ZXIudG9BcnJheSgpLFxyXG5cdFx0XHRcdFx0cmFkaXVzOiBvYmplY3QuYm91bmRpbmdTcGhlcmUucmFkaXVzXHJcblx0XHRcdFx0fTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggdGhpcy5ib3VuZGluZ0JveCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0b2JqZWN0LmJvdW5kaW5nQm94ID0ge1xyXG5cdFx0XHRcdFx0bWluOiBvYmplY3QuYm91bmRpbmdCb3gubWluLnRvQXJyYXkoKSxcclxuXHRcdFx0XHRcdG1heDogb2JqZWN0LmJvdW5kaW5nQm94Lm1heC50b0FycmF5KClcclxuXHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGZ1bmN0aW9uIHNlcmlhbGl6ZSggbGlicmFyeSwgZWxlbWVudCApIHtcclxuXHJcblx0XHRcdGlmICggbGlicmFyeVsgZWxlbWVudC51dWlkIF0gPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0bGlicmFyeVsgZWxlbWVudC51dWlkIF0gPSBlbGVtZW50LnRvSlNPTiggbWV0YSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIGVsZW1lbnQudXVpZDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aGlzLmlzU2NlbmUgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMuYmFja2dyb3VuZCApIHtcclxuXHJcblx0XHRcdFx0aWYgKCB0aGlzLmJhY2tncm91bmQuaXNDb2xvciApIHtcclxuXHJcblx0XHRcdFx0XHRvYmplY3QuYmFja2dyb3VuZCA9IHRoaXMuYmFja2dyb3VuZC50b0pTT04oKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggdGhpcy5iYWNrZ3JvdW5kLmlzVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0XHRvYmplY3QuYmFja2dyb3VuZCA9IHRoaXMuYmFja2dyb3VuZC50b0pTT04oIG1ldGEgKS51dWlkO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMuZW52aXJvbm1lbnQgJiYgdGhpcy5lbnZpcm9ubWVudC5pc1RleHR1cmUgJiYgdGhpcy5lbnZpcm9ubWVudC5pc1JlbmRlclRhcmdldFRleHR1cmUgIT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdG9iamVjdC5lbnZpcm9ubWVudCA9IHRoaXMuZW52aXJvbm1lbnQudG9KU09OKCBtZXRhICkudXVpZDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2UgaWYgKCB0aGlzLmlzTWVzaCB8fCB0aGlzLmlzTGluZSB8fCB0aGlzLmlzUG9pbnRzICkge1xyXG5cclxuXHRcdFx0b2JqZWN0Lmdlb21ldHJ5ID0gc2VyaWFsaXplKCBtZXRhLmdlb21ldHJpZXMsIHRoaXMuZ2VvbWV0cnkgKTtcclxuXHJcblx0XHRcdGNvbnN0IHBhcmFtZXRlcnMgPSB0aGlzLmdlb21ldHJ5LnBhcmFtZXRlcnM7XHJcblxyXG5cdFx0XHRpZiAoIHBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCAmJiBwYXJhbWV0ZXJzLnNoYXBlcyAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBzaGFwZXMgPSBwYXJhbWV0ZXJzLnNoYXBlcztcclxuXHJcblx0XHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBzaGFwZXMgKSApIHtcclxuXHJcblx0XHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBzaGFwZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnN0IHNoYXBlID0gc2hhcGVzWyBpIF07XHJcblxyXG5cdFx0XHRcdFx0XHRzZXJpYWxpemUoIG1ldGEuc2hhcGVzLCBzaGFwZSApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRzZXJpYWxpemUoIG1ldGEuc2hhcGVzLCBzaGFwZXMgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMuaXNTa2lubmVkTWVzaCApIHtcclxuXHJcblx0XHRcdG9iamVjdC5iaW5kTW9kZSA9IHRoaXMuYmluZE1vZGU7XHJcblx0XHRcdG9iamVjdC5iaW5kTWF0cml4ID0gdGhpcy5iaW5kTWF0cml4LnRvQXJyYXkoKTtcclxuXHJcblx0XHRcdGlmICggdGhpcy5za2VsZXRvbiAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRzZXJpYWxpemUoIG1ldGEuc2tlbGV0b25zLCB0aGlzLnNrZWxldG9uICk7XHJcblxyXG5cdFx0XHRcdG9iamVjdC5za2VsZXRvbiA9IHRoaXMuc2tlbGV0b24udXVpZDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aGlzLm1hdGVyaWFsICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHRoaXMubWF0ZXJpYWwgKSApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgdXVpZHMgPSBbXTtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gdGhpcy5tYXRlcmlhbC5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdHV1aWRzLnB1c2goIHNlcmlhbGl6ZSggbWV0YS5tYXRlcmlhbHMsIHRoaXMubWF0ZXJpYWxbIGkgXSApICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0b2JqZWN0Lm1hdGVyaWFsID0gdXVpZHM7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRvYmplY3QubWF0ZXJpYWwgPSBzZXJpYWxpemUoIG1ldGEubWF0ZXJpYWxzLCB0aGlzLm1hdGVyaWFsICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0aWYgKCB0aGlzLmNoaWxkcmVuLmxlbmd0aCA+IDAgKSB7XHJcblxyXG5cdFx0XHRvYmplY3QuY2hpbGRyZW4gPSBbXTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRvYmplY3QuY2hpbGRyZW4ucHVzaCggdGhpcy5jaGlsZHJlblsgaSBdLnRvSlNPTiggbWV0YSApLm9iamVjdCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGlmICggdGhpcy5hbmltYXRpb25zLmxlbmd0aCA+IDAgKSB7XHJcblxyXG5cdFx0XHRvYmplY3QuYW5pbWF0aW9ucyA9IFtdO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdGhpcy5hbmltYXRpb25zLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgYW5pbWF0aW9uID0gdGhpcy5hbmltYXRpb25zWyBpIF07XHJcblxyXG5cdFx0XHRcdG9iamVjdC5hbmltYXRpb25zLnB1c2goIHNlcmlhbGl6ZSggbWV0YS5hbmltYXRpb25zLCBhbmltYXRpb24gKSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGlzUm9vdE9iamVjdCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGdlb21ldHJpZXMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLmdlb21ldHJpZXMgKTtcclxuXHRcdFx0Y29uc3QgbWF0ZXJpYWxzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS5tYXRlcmlhbHMgKTtcclxuXHRcdFx0Y29uc3QgdGV4dHVyZXMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLnRleHR1cmVzICk7XHJcblx0XHRcdGNvbnN0IGltYWdlcyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEuaW1hZ2VzICk7XHJcblx0XHRcdGNvbnN0IHNoYXBlcyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEuc2hhcGVzICk7XHJcblx0XHRcdGNvbnN0IHNrZWxldG9ucyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEuc2tlbGV0b25zICk7XHJcblx0XHRcdGNvbnN0IGFuaW1hdGlvbnMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLmFuaW1hdGlvbnMgKTtcclxuXHRcdFx0Y29uc3Qgbm9kZXMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLm5vZGVzICk7XHJcblxyXG5cdFx0XHRpZiAoIGdlb21ldHJpZXMubGVuZ3RoID4gMCApIG91dHB1dC5nZW9tZXRyaWVzID0gZ2VvbWV0cmllcztcclxuXHRcdFx0aWYgKCBtYXRlcmlhbHMubGVuZ3RoID4gMCApIG91dHB1dC5tYXRlcmlhbHMgPSBtYXRlcmlhbHM7XHJcblx0XHRcdGlmICggdGV4dHVyZXMubGVuZ3RoID4gMCApIG91dHB1dC50ZXh0dXJlcyA9IHRleHR1cmVzO1xyXG5cdFx0XHRpZiAoIGltYWdlcy5sZW5ndGggPiAwICkgb3V0cHV0LmltYWdlcyA9IGltYWdlcztcclxuXHRcdFx0aWYgKCBzaGFwZXMubGVuZ3RoID4gMCApIG91dHB1dC5zaGFwZXMgPSBzaGFwZXM7XHJcblx0XHRcdGlmICggc2tlbGV0b25zLmxlbmd0aCA+IDAgKSBvdXRwdXQuc2tlbGV0b25zID0gc2tlbGV0b25zO1xyXG5cdFx0XHRpZiAoIGFuaW1hdGlvbnMubGVuZ3RoID4gMCApIG91dHB1dC5hbmltYXRpb25zID0gYW5pbWF0aW9ucztcclxuXHRcdFx0aWYgKCBub2Rlcy5sZW5ndGggPiAwICkgb3V0cHV0Lm5vZGVzID0gbm9kZXM7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdG91dHB1dC5vYmplY3QgPSBvYmplY3Q7XHJcblxyXG5cdFx0cmV0dXJuIG91dHB1dDtcclxuXHJcblx0XHQvLyBleHRyYWN0IGRhdGEgZnJvbSB0aGUgY2FjaGUgaGFzaFxyXG5cdFx0Ly8gcmVtb3ZlIG1ldGFkYXRhIG9uIGVhY2ggaXRlbVxyXG5cdFx0Ly8gYW5kIHJldHVybiBhcyBhcnJheVxyXG5cdFx0ZnVuY3Rpb24gZXh0cmFjdEZyb21DYWNoZSggY2FjaGUgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB2YWx1ZXMgPSBbXTtcclxuXHRcdFx0Zm9yICggY29uc3Qga2V5IGluIGNhY2hlICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBkYXRhID0gY2FjaGVbIGtleSBdO1xyXG5cdFx0XHRcdGRlbGV0ZSBkYXRhLm1ldGFkYXRhO1xyXG5cdFx0XHRcdHZhbHVlcy5wdXNoKCBkYXRhICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gdmFsdWVzO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbmV3IDNEIG9iamVjdCB3aXRoIGNvcGllZCB2YWx1ZXMgZnJvbSB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbcmVjdXJzaXZlPXRydWVdIC0gV2hlbiBzZXQgdG8gYHRydWVgLCBkZXNjZW5kYW50cyBvZiB0aGUgM0Qgb2JqZWN0IGFyZSBhbHNvIGNsb25lZC5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3QzRH0gQSBjbG9uZSBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNsb25lKCByZWN1cnNpdmUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcywgcmVjdXJzaXZlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29waWVzIHRoZSB2YWx1ZXMgb2YgdGhlIGdpdmVuIDNEIG9iamVjdCB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3QzRH0gc291cmNlIC0gVGhlIDNEIG9iamVjdCB0byBjb3B5LlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JlY3Vyc2l2ZT10cnVlXSAtIFdoZW4gc2V0IHRvIGB0cnVlYCwgZGVzY2VuZGFudHMgb2YgdGhlIDNEIG9iamVjdCBhcmUgY2xvbmVkLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdDNEfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNvcHkoIHNvdXJjZSwgcmVjdXJzaXZlID0gdHJ1ZSApIHtcclxuXHJcblx0XHR0aGlzLm5hbWUgPSBzb3VyY2UubmFtZTtcclxuXHJcblx0XHR0aGlzLnVwLmNvcHkoIHNvdXJjZS51cCApO1xyXG5cclxuXHRcdHRoaXMucG9zaXRpb24uY29weSggc291cmNlLnBvc2l0aW9uICk7XHJcblx0XHR0aGlzLnJvdGF0aW9uLm9yZGVyID0gc291cmNlLnJvdGF0aW9uLm9yZGVyO1xyXG5cdFx0dGhpcy5xdWF0ZXJuaW9uLmNvcHkoIHNvdXJjZS5xdWF0ZXJuaW9uICk7XHJcblx0XHR0aGlzLnNjYWxlLmNvcHkoIHNvdXJjZS5zY2FsZSApO1xyXG5cclxuXHRcdHRoaXMubWF0cml4LmNvcHkoIHNvdXJjZS5tYXRyaXggKTtcclxuXHRcdHRoaXMubWF0cml4V29ybGQuY29weSggc291cmNlLm1hdHJpeFdvcmxkICk7XHJcblxyXG5cdFx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gc291cmNlLm1hdHJpeEF1dG9VcGRhdGU7XHJcblxyXG5cdFx0dGhpcy5tYXRyaXhXb3JsZEF1dG9VcGRhdGUgPSBzb3VyY2UubWF0cml4V29ybGRBdXRvVXBkYXRlO1xyXG5cdFx0dGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gc291cmNlLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU7XHJcblxyXG5cdFx0dGhpcy5sYXllcnMubWFzayA9IHNvdXJjZS5sYXllcnMubWFzaztcclxuXHRcdHRoaXMudmlzaWJsZSA9IHNvdXJjZS52aXNpYmxlO1xyXG5cclxuXHRcdHRoaXMuY2FzdFNoYWRvdyA9IHNvdXJjZS5jYXN0U2hhZG93O1xyXG5cdFx0dGhpcy5yZWNlaXZlU2hhZG93ID0gc291cmNlLnJlY2VpdmVTaGFkb3c7XHJcblxyXG5cdFx0dGhpcy5mcnVzdHVtQ3VsbGVkID0gc291cmNlLmZydXN0dW1DdWxsZWQ7XHJcblx0XHR0aGlzLnJlbmRlck9yZGVyID0gc291cmNlLnJlbmRlck9yZGVyO1xyXG5cclxuXHRcdHRoaXMuYW5pbWF0aW9ucyA9IHNvdXJjZS5hbmltYXRpb25zLnNsaWNlKCk7XHJcblxyXG5cdFx0dGhpcy51c2VyRGF0YSA9IEpTT04ucGFyc2UoIEpTT04uc3RyaW5naWZ5KCBzb3VyY2UudXNlckRhdGEgKSApO1xyXG5cclxuXHRcdGlmICggcmVjdXJzaXZlID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgc291cmNlLmNoaWxkcmVuLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgY2hpbGQgPSBzb3VyY2UuY2hpbGRyZW5bIGkgXTtcclxuXHRcdFx0XHR0aGlzLmFkZCggY2hpbGQuY2xvbmUoKSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFRoZSBkZWZhdWx0IHVwIGRpcmVjdGlvbiBmb3Igb2JqZWN0cywgYWxzbyB1c2VkIGFzIHRoZSBkZWZhdWx0XHJcbiAqIHBvc2l0aW9uIGZvciB7QGxpbmsgRGlyZWN0aW9uYWxMaWdodH0gYW5kIHtAbGluayBIZW1pc3BoZXJlTGlnaHR9LlxyXG4gKlxyXG4gKiBAc3RhdGljXHJcbiAqIEB0eXBlIHtWZWN0b3IzfVxyXG4gKiBAZGVmYXVsdCAoMCwxLDApXHJcbiAqL1xyXG5PYmplY3QzRC5ERUZBVUxUX1VQID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMyggMCwgMSwgMCApO1xyXG5cclxuLyoqXHJcbiAqIFRoZSBkZWZhdWx0IHNldHRpbmcgZm9yIHtAbGluayBPYmplY3QzRCNtYXRyaXhBdXRvVXBkYXRlfSBmb3JcclxuICogbmV3bHkgY3JlYXRlZCAzRCBvYmplY3RzLlxyXG4gKlxyXG4gKiBAc3RhdGljXHJcbiAqIEB0eXBlIHtib29sZWFufVxyXG4gKiBAZGVmYXVsdCB0cnVlXHJcbiAqL1xyXG5PYmplY3QzRC5ERUZBVUxUX01BVFJJWF9BVVRPX1VQREFURSA9IHRydWU7XHJcblxyXG4vKipcclxuICogVGhlIGRlZmF1bHQgc2V0dGluZyBmb3Ige0BsaW5rIE9iamVjdDNEI21hdHJpeFdvcmxkQXV0b1VwZGF0ZX0gZm9yXHJcbiAqIG5ld2x5IGNyZWF0ZWQgM0Qgb2JqZWN0cy5cclxuICpcclxuICogQHN0YXRpY1xyXG4gKiBAdHlwZSB7Ym9vbGVhbn1cclxuICogQGRlZmF1bHQgdHJ1ZVxyXG4gKi9cclxuT2JqZWN0M0QuREVGQVVMVF9NQVRSSVhfV09STERfQVVUT19VUERBVEUgPSB0cnVlO1xyXG5cclxuZXhwb3J0IHsgT2JqZWN0M0QgfTtcclxuIiwiaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4vVmVjdG9yMy5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjQgfSBmcm9tICcuL1ZlY3RvcjQuanMnO1xyXG5cclxuY29uc3QgX3YwID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfdjEgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF92MiA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX3YzID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5cclxuY29uc3QgX3ZhYiA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX3ZhYyA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX3ZiYyA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX3ZhcCA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX3ZicCA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX3ZjcCA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuXHJcbmNvbnN0IF92NDAgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3I0KCk7XHJcbmNvbnN0IF92NDEgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3I0KCk7XHJcbmNvbnN0IF92NDIgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3I0KCk7XHJcblxyXG4vKipcclxuICogQSBnZW9tZXRyaWMgdHJpYW5nbGUgYXMgZGVmaW5lZCBieSB0aHJlZSB2ZWN0b3JzIHJlcHJlc2VudGluZyBpdHMgdGhyZWUgY29ybmVycy5cclxuICovXHJcbmNsYXNzIFRyaWFuZ2xlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB0cmlhbmdsZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gW2E9KDAsMCwwKV0gLSBUaGUgZmlyc3QgY29ybmVyIG9mIHRoZSB0cmlhbmdsZS5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IFtiPSgwLDAsMCldIC0gVGhlIHNlY29uZCBjb3JuZXIgb2YgdGhlIHRyaWFuZ2xlLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gW2M9KDAsMCwwKV0gLSBUaGUgdGhpcmQgY29ybmVyIG9mIHRoZSB0cmlhbmdsZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggYSA9IG5ldyBWZWN0b3IzKCksIGIgPSBuZXcgVmVjdG9yMygpLCBjID0gbmV3IFZlY3RvcjMoKSApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBmaXJzdCBjb3JuZXIgb2YgdGhlIHRyaWFuZ2xlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3IzfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmEgPSBhO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHNlY29uZCBjb3JuZXIgb2YgdGhlIHRyaWFuZ2xlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3IzfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmIgPSBiO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHRoaXJkIGNvcm5lciBvZiB0aGUgdHJpYW5nbGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjN9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYyA9IGM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgdGhlIG5vcm1hbCB2ZWN0b3Igb2YgYSB0cmlhbmdsZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gYSAtIFRoZSBmaXJzdCBjb3JuZXIgb2YgdGhlIHRyaWFuZ2xlLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gYiAtIFRoZSBzZWNvbmQgY29ybmVyIG9mIHRoZSB0cmlhbmdsZS5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IGMgLSBUaGUgdGhpcmQgY29ybmVyIG9mIHRoZSB0cmlhbmdsZS5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHRhcmdldCAtIFRoZSB0YXJnZXQgdmVjdG9yIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbWV0aG9kJ3MgcmVzdWx0LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IFRoZSB0cmlhbmdsZSdzIG5vcm1hbC5cclxuXHQgKi9cclxuXHRzdGF0aWMgZ2V0Tm9ybWFsKCBhLCBiLCBjLCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0dGFyZ2V0LnN1YlZlY3RvcnMoIGMsIGIgKTtcclxuXHRcdF92MC5zdWJWZWN0b3JzKCBhLCBiICk7XHJcblx0XHR0YXJnZXQuY3Jvc3MoIF92MCApO1xyXG5cclxuXHRcdGNvbnN0IHRhcmdldExlbmd0aFNxID0gdGFyZ2V0Lmxlbmd0aFNxKCk7XHJcblx0XHRpZiAoIHRhcmdldExlbmd0aFNxID4gMCApIHtcclxuXHJcblx0XHRcdHJldHVybiB0YXJnZXQubXVsdGlwbHlTY2FsYXIoIDEgLyBNYXRoLnNxcnQoIHRhcmdldExlbmd0aFNxICkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRhcmdldC5zZXQoIDAsIDAsIDAgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyBhIGJhcnljZW50cmljIGNvb3JkaW5hdGVzIGZyb20gdGhlIGdpdmVuIHZlY3Rvci5cclxuXHQgKiBSZXR1cm5zIGBudWxsYCBpZiB0aGUgdHJpYW5nbGUgaXMgZGVnZW5lcmF0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gcG9pbnQgLSBBIHBvaW50IGluIDNEIHNwYWNlLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gYSAtIFRoZSBmaXJzdCBjb3JuZXIgb2YgdGhlIHRyaWFuZ2xlLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gYiAtIFRoZSBzZWNvbmQgY29ybmVyIG9mIHRoZSB0cmlhbmdsZS5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IGMgLSBUaGUgdGhpcmQgY29ybmVyIG9mIHRoZSB0cmlhbmdsZS5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHRhcmdldCAtIFRoZSB0YXJnZXQgdmVjdG9yIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbWV0aG9kJ3MgcmVzdWx0LlxyXG5cdCAqIEByZXR1cm4gez9WZWN0b3IzfSBUaGUgYmFyeWNlbnRyaWMgY29vcmRpbmF0ZXMgZm9yIHRoZSBnaXZlbiBwb2ludFxyXG5cdCAqL1xyXG5cdHN0YXRpYyBnZXRCYXJ5Y29vcmQoIHBvaW50LCBhLCBiLCBjLCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0Ly8gYmFzZWQgb246IGh0dHA6Ly93d3cuYmxhY2twYXduLmNvbS90ZXh0cy9wb2ludGlucG9seS9kZWZhdWx0Lmh0bWxcclxuXHJcblx0XHRfdjAuc3ViVmVjdG9ycyggYywgYSApO1xyXG5cdFx0X3YxLnN1YlZlY3RvcnMoIGIsIGEgKTtcclxuXHRcdF92Mi5zdWJWZWN0b3JzKCBwb2ludCwgYSApO1xyXG5cclxuXHRcdGNvbnN0IGRvdDAwID0gX3YwLmRvdCggX3YwICk7XHJcblx0XHRjb25zdCBkb3QwMSA9IF92MC5kb3QoIF92MSApO1xyXG5cdFx0Y29uc3QgZG90MDIgPSBfdjAuZG90KCBfdjIgKTtcclxuXHRcdGNvbnN0IGRvdDExID0gX3YxLmRvdCggX3YxICk7XHJcblx0XHRjb25zdCBkb3QxMiA9IF92MS5kb3QoIF92MiApO1xyXG5cclxuXHRcdGNvbnN0IGRlbm9tID0gKCBkb3QwMCAqIGRvdDExIC0gZG90MDEgKiBkb3QwMSApO1xyXG5cclxuXHRcdC8vIGNvbGxpbmVhciBvciBzaW5ndWxhciB0cmlhbmdsZVxyXG5cdFx0aWYgKCBkZW5vbSA9PT0gMCApIHtcclxuXHJcblx0XHRcdHRhcmdldC5zZXQoIDAsIDAsIDAgKTtcclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGludkRlbm9tID0gMSAvIGRlbm9tO1xyXG5cdFx0Y29uc3QgdSA9ICggZG90MTEgKiBkb3QwMiAtIGRvdDAxICogZG90MTIgKSAqIGludkRlbm9tO1xyXG5cdFx0Y29uc3QgdiA9ICggZG90MDAgKiBkb3QxMiAtIGRvdDAxICogZG90MDIgKSAqIGludkRlbm9tO1xyXG5cclxuXHRcdC8vIGJhcnljZW50cmljIGNvb3JkaW5hdGVzIG11c3QgYWx3YXlzIHN1bSB0byAxXHJcblx0XHRyZXR1cm4gdGFyZ2V0LnNldCggMSAtIHUgLSB2LCB2LCB1ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIHBvaW50LCB3aGVuIHByb2plY3RlZCBvbnRvIHRoZSBwbGFuZSBvZiB0aGVcclxuXHQgKiB0cmlhbmdsZSwgbGllcyB3aXRoaW4gdGhlIHRyaWFuZ2xlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBwb2ludCAtIFRoZSBwb2ludCBpbiAzRCBzcGFjZSB0byB0ZXN0LlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gYSAtIFRoZSBmaXJzdCBjb3JuZXIgb2YgdGhlIHRyaWFuZ2xlLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gYiAtIFRoZSBzZWNvbmQgY29ybmVyIG9mIHRoZSB0cmlhbmdsZS5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IGMgLSBUaGUgdGhpcmQgY29ybmVyIG9mIHRoZSB0cmlhbmdsZS5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBnaXZlbiBwb2ludCwgd2hlbiBwcm9qZWN0ZWQgb250byB0aGUgcGxhbmUgb2YgdGhlXHJcblx0ICogdHJpYW5nbGUsIGxpZXMgd2l0aGluIHRoZSB0cmlhbmdsZSBvciBub3QuXHJcblx0ICovXHJcblx0c3RhdGljIGNvbnRhaW5zUG9pbnQoIHBvaW50LCBhLCBiLCBjICkge1xyXG5cclxuXHRcdC8vIGlmIHRoZSB0cmlhbmdsZSBpcyBkZWdlbmVyYXRlIHRoZW4gd2UgY2FuJ3QgY29udGFpbiBhIHBvaW50XHJcblx0XHRpZiAoIHRoaXMuZ2V0QmFyeWNvb3JkKCBwb2ludCwgYSwgYiwgYywgX3YzICkgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiAoIF92My54ID49IDAgKSAmJiAoIF92My55ID49IDAgKSAmJiAoICggX3YzLnggKyBfdjMueSApIDw9IDEgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB0aGUgdmFsdWUgYmFyeWNlbnRyaWNhbGx5IGludGVycG9sYXRlZCBmb3IgdGhlIGdpdmVuIHBvaW50IG9uIHRoZVxyXG5cdCAqIHRyaWFuZ2xlLiBSZXR1cm5zIGBudWxsYCBpZiB0aGUgdHJpYW5nbGUgaXMgZGVnZW5lcmF0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gcG9pbnQgLSBQb3NpdGlvbiBvZiBpbnRlcnBvbGF0ZWQgcG9pbnQuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBwMSAtIFRoZSBmaXJzdCBjb3JuZXIgb2YgdGhlIHRyaWFuZ2xlLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gcDIgLSBUaGUgc2Vjb25kIGNvcm5lciBvZiB0aGUgdHJpYW5nbGUuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBwMyAtIFRoZSB0aGlyZCBjb3JuZXIgb2YgdGhlIHRyaWFuZ2xlLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdjEgLSBWYWx1ZSB0byBpbnRlcnBvbGF0ZSBvZiBmaXJzdCB2ZXJ0ZXguXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB2MiAtIFZhbHVlIHRvIGludGVycG9sYXRlIG9mIHNlY29uZCB2ZXJ0ZXguXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB2MyAtIFZhbHVlIHRvIGludGVycG9sYXRlIG9mIHRoaXJkIHZlcnRleC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHRhcmdldCAtIFRoZSB0YXJnZXQgdmVjdG9yIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbWV0aG9kJ3MgcmVzdWx0LlxyXG5cdCAqIEByZXR1cm4gez9WZWN0b3IzfSBUaGUgaW50ZXJwb2xhdGVkIHZhbHVlLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBnZXRJbnRlcnBvbGF0aW9uKCBwb2ludCwgcDEsIHAyLCBwMywgdjEsIHYyLCB2MywgdGFyZ2V0ICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5nZXRCYXJ5Y29vcmQoIHBvaW50LCBwMSwgcDIsIHAzLCBfdjMgKSA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRhcmdldC54ID0gMDtcclxuXHRcdFx0dGFyZ2V0LnkgPSAwO1xyXG5cdFx0XHRpZiAoICd6JyBpbiB0YXJnZXQgKSB0YXJnZXQueiA9IDA7XHJcblx0XHRcdGlmICggJ3cnIGluIHRhcmdldCApIHRhcmdldC53ID0gMDtcclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRhcmdldC5zZXRTY2FsYXIoIDAgKTtcclxuXHRcdHRhcmdldC5hZGRTY2FsZWRWZWN0b3IoIHYxLCBfdjMueCApO1xyXG5cdFx0dGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggdjIsIF92My55ICk7XHJcblx0XHR0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKCB2MywgX3YzLnogKTtcclxuXHJcblx0XHRyZXR1cm4gdGFyZ2V0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSB2YWx1ZSBiYXJ5Y2VudHJpY2FsbHkgaW50ZXJwb2xhdGVkIGZvciB0aGUgZ2l2ZW4gYXR0cmlidXRlIGFuZCBpbmRpY2VzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCdWZmZXJBdHRyaWJ1dGV9IGF0dHIgLSBUaGUgYXR0cmlidXRlIHRvIGludGVycG9sYXRlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpMSAtIEluZGV4IG9mIGZpcnN0IHZlcnRleC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaTIgLSBJbmRleCBvZiBzZWNvbmQgdmVydGV4LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpMyAtIEluZGV4IG9mIHRoaXJkIHZlcnRleC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IGJhcnljb29yZCAtIFRoZSBiYXJ5Y29vcmRpbmF0ZSB2YWx1ZSB0byB1c2UgdG8gaW50ZXJwb2xhdGUuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IHZlY3RvciB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGhvZCdzIHJlc3VsdC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBUaGUgaW50ZXJwb2xhdGVkIGF0dHJpYnV0ZSB2YWx1ZS5cclxuXHQgKi9cclxuXHRzdGF0aWMgZ2V0SW50ZXJwb2xhdGVkQXR0cmlidXRlKCBhdHRyLCBpMSwgaTIsIGkzLCBiYXJ5Y29vcmQsIHRhcmdldCApIHtcclxuXHJcblx0XHRfdjQwLnNldFNjYWxhciggMCApO1xyXG5cdFx0X3Y0MS5zZXRTY2FsYXIoIDAgKTtcclxuXHRcdF92NDIuc2V0U2NhbGFyKCAwICk7XHJcblxyXG5cdFx0X3Y0MC5mcm9tQnVmZmVyQXR0cmlidXRlKCBhdHRyLCBpMSApO1xyXG5cdFx0X3Y0MS5mcm9tQnVmZmVyQXR0cmlidXRlKCBhdHRyLCBpMiApO1xyXG5cdFx0X3Y0Mi5mcm9tQnVmZmVyQXR0cmlidXRlKCBhdHRyLCBpMyApO1xyXG5cclxuXHRcdHRhcmdldC5zZXRTY2FsYXIoIDAgKTtcclxuXHRcdHRhcmdldC5hZGRTY2FsZWRWZWN0b3IoIF92NDAsIGJhcnljb29yZC54ICk7XHJcblx0XHR0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKCBfdjQxLCBiYXJ5Y29vcmQueSApO1xyXG5cdFx0dGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggX3Y0MiwgYmFyeWNvb3JkLnogKTtcclxuXHJcblx0XHRyZXR1cm4gdGFyZ2V0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSB0cmlhbmdsZSBpcyBvcmllbnRlZCB0b3dhcmRzIHRoZSBnaXZlbiBkaXJlY3Rpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IGEgLSBUaGUgZmlyc3QgY29ybmVyIG9mIHRoZSB0cmlhbmdsZS5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IGIgLSBUaGUgc2Vjb25kIGNvcm5lciBvZiB0aGUgdHJpYW5nbGUuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBjIC0gVGhlIHRoaXJkIGNvcm5lciBvZiB0aGUgdHJpYW5nbGUuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBkaXJlY3Rpb24gLSBUaGUgKG5vcm1hbGl6ZWQpIGRpcmVjdGlvbiB2ZWN0b3IuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgdHJpYW5nbGUgaXMgb3JpZW50ZWQgdG93YXJkcyB0aGUgZ2l2ZW4gZGlyZWN0aW9uIG9yIG5vdC5cclxuXHQgKi9cclxuXHRzdGF0aWMgaXNGcm9udEZhY2luZyggYSwgYiwgYywgZGlyZWN0aW9uICkge1xyXG5cclxuXHRcdF92MC5zdWJWZWN0b3JzKCBjLCBiICk7XHJcblx0XHRfdjEuc3ViVmVjdG9ycyggYSwgYiApO1xyXG5cclxuXHRcdC8vIHN0cmljdGx5IGZyb250IGZhY2luZ1xyXG5cdFx0cmV0dXJuICggX3YwLmNyb3NzKCBfdjEgKS5kb3QoIGRpcmVjdGlvbiApIDwgMCApID8gdHJ1ZSA6IGZhbHNlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHRyaWFuZ2xlJ3MgdmVydGljZXMgYnkgY29weWluZyB0aGUgZ2l2ZW4gdmFsdWVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBhIC0gVGhlIGZpcnN0IGNvcm5lciBvZiB0aGUgdHJpYW5nbGUuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBiIC0gVGhlIHNlY29uZCBjb3JuZXIgb2YgdGhlIHRyaWFuZ2xlLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gYyAtIFRoZSB0aGlyZCBjb3JuZXIgb2YgdGhlIHRyaWFuZ2xlLlxyXG5cdCAqIEByZXR1cm4ge1RyaWFuZ2xlfSBBIHJlZmVyZW5jZSB0byB0aGlzIHRyaWFuZ2xlLlxyXG5cdCAqL1xyXG5cdHNldCggYSwgYiwgYyApIHtcclxuXHJcblx0XHR0aGlzLmEuY29weSggYSApO1xyXG5cdFx0dGhpcy5iLmNvcHkoIGIgKTtcclxuXHRcdHRoaXMuYy5jb3B5KCBjICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdHJpYW5nbGUncyB2ZXJ0aWNlcyBieSBjb3B5aW5nIHRoZSBnaXZlbiBhcnJheSB2YWx1ZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PFZlY3RvcjM+fSBwb2ludHMgLSBBbiBhcnJheSB3aXRoIDNEIHBvaW50cy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaTAgLSBUaGUgYXJyYXkgaW5kZXggcmVwcmVzZW50aW5nIHRoZSBmaXJzdCBjb3JuZXIgb2YgdGhlIHRyaWFuZ2xlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpMSAtIFRoZSBhcnJheSBpbmRleCByZXByZXNlbnRpbmcgdGhlIHNlY29uZCBjb3JuZXIgb2YgdGhlIHRyaWFuZ2xlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpMiAtIFRoZSBhcnJheSBpbmRleCByZXByZXNlbnRpbmcgdGhlIHRoaXJkIGNvcm5lciBvZiB0aGUgdHJpYW5nbGUuXHJcblx0ICogQHJldHVybiB7VHJpYW5nbGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdHJpYW5nbGUuXHJcblx0ICovXHJcblx0c2V0RnJvbVBvaW50c0FuZEluZGljZXMoIHBvaW50cywgaTAsIGkxLCBpMiApIHtcclxuXHJcblx0XHR0aGlzLmEuY29weSggcG9pbnRzWyBpMCBdICk7XHJcblx0XHR0aGlzLmIuY29weSggcG9pbnRzWyBpMSBdICk7XHJcblx0XHR0aGlzLmMuY29weSggcG9pbnRzWyBpMiBdICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdHJpYW5nbGUncyB2ZXJ0aWNlcyBieSBjb3B5aW5nIHRoZSBnaXZlbiBhdHRyaWJ1dGUgdmFsdWVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCdWZmZXJBdHRyaWJ1dGV9IGF0dHJpYnV0ZSAtIEEgYnVmZmVyIGF0dHJpYnV0ZSB3aXRoIDNEIHBvaW50cyBkYXRhLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpMCAtIFRoZSBhdHRyaWJ1dGUgaW5kZXggcmVwcmVzZW50aW5nIHRoZSBmaXJzdCBjb3JuZXIgb2YgdGhlIHRyaWFuZ2xlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpMSAtIFRoZSBhdHRyaWJ1dGUgaW5kZXggcmVwcmVzZW50aW5nIHRoZSBzZWNvbmQgY29ybmVyIG9mIHRoZSB0cmlhbmdsZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaTIgLSBUaGUgYXR0cmlidXRlIGluZGV4IHJlcHJlc2VudGluZyB0aGUgdGhpcmQgY29ybmVyIG9mIHRoZSB0cmlhbmdsZS5cclxuXHQgKiBAcmV0dXJuIHtUcmlhbmdsZX0gQSByZWZlcmVuY2UgdG8gdGhpcyB0cmlhbmdsZS5cclxuXHQgKi9cclxuXHRzZXRGcm9tQXR0cmlidXRlQW5kSW5kaWNlcyggYXR0cmlidXRlLCBpMCwgaTEsIGkyICkge1xyXG5cclxuXHRcdHRoaXMuYS5mcm9tQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGkwICk7XHJcblx0XHR0aGlzLmIuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlLCBpMSApO1xyXG5cdFx0dGhpcy5jLmZyb21CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgaTIgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbmV3IHRyaWFuZ2xlIHdpdGggY29waWVkIHZhbHVlcyBmcm9tIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtUcmlhbmdsZX0gQSBjbG9uZSBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNsb25lKCkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gdHJpYW5nbGUgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VHJpYW5nbGV9IHRyaWFuZ2xlIC0gVGhlIHRyaWFuZ2xlIHRvIGNvcHkuXHJcblx0ICogQHJldHVybiB7VHJpYW5nbGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdHJpYW5nbGUuXHJcblx0ICovXHJcblx0Y29weSggdHJpYW5nbGUgKSB7XHJcblxyXG5cdFx0dGhpcy5hLmNvcHkoIHRyaWFuZ2xlLmEgKTtcclxuXHRcdHRoaXMuYi5jb3B5KCB0cmlhbmdsZS5iICk7XHJcblx0XHR0aGlzLmMuY29weSggdHJpYW5nbGUuYyApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSBhcmVhIG9mIHRoZSB0cmlhbmdsZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIHRyaWFuZ2xlJ3MgYXJlYS5cclxuXHQgKi9cclxuXHRnZXRBcmVhKCkge1xyXG5cclxuXHRcdF92MC5zdWJWZWN0b3JzKCB0aGlzLmMsIHRoaXMuYiApO1xyXG5cdFx0X3YxLnN1YlZlY3RvcnMoIHRoaXMuYSwgdGhpcy5iICk7XHJcblxyXG5cdFx0cmV0dXJuIF92MC5jcm9zcyggX3YxICkubGVuZ3RoKCkgKiAwLjU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgdGhlIG1pZHBvaW50IG9mIHRoZSB0cmlhbmdsZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdGFyZ2V0IC0gVGhlIHRhcmdldCB2ZWN0b3IgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBtZXRob2QncyByZXN1bHQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gVGhlIHRyaWFuZ2xlJ3MgbWlkcG9pbnQuXHJcblx0ICovXHJcblx0Z2V0TWlkcG9pbnQoIHRhcmdldCApIHtcclxuXHJcblx0XHRyZXR1cm4gdGFyZ2V0LmFkZFZlY3RvcnMoIHRoaXMuYSwgdGhpcy5iICkuYWRkKCB0aGlzLmMgKS5tdWx0aXBseVNjYWxhciggMSAvIDMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB0aGUgbm9ybWFsIG9mIHRoZSB0cmlhbmdsZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdGFyZ2V0IC0gVGhlIHRhcmdldCB2ZWN0b3IgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBtZXRob2QncyByZXN1bHQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gVGhlIHRyaWFuZ2xlJ3Mgbm9ybWFsLlxyXG5cdCAqL1xyXG5cdGdldE5vcm1hbCggdGFyZ2V0ICkge1xyXG5cclxuXHRcdHJldHVybiBUcmlhbmdsZS5nZXROb3JtYWwoIHRoaXMuYSwgdGhpcy5iLCB0aGlzLmMsIHRhcmdldCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIGEgcGxhbmUgdGhlIHRyaWFuZ2xlIGxpZXMgd2l0aGluLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtQbGFuZX0gdGFyZ2V0IC0gVGhlIHRhcmdldCB2ZWN0b3IgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBtZXRob2QncyByZXN1bHQuXHJcblx0ICogQHJldHVybiB7UGxhbmV9IFRoZSBwbGFuZSB0aGUgdHJpYW5nbGUgbGllcyB3aXRoaW4uXHJcblx0ICovXHJcblx0Z2V0UGxhbmUoIHRhcmdldCApIHtcclxuXHJcblx0XHRyZXR1cm4gdGFyZ2V0LnNldEZyb21Db3BsYW5hclBvaW50cyggdGhpcy5hLCB0aGlzLmIsIHRoaXMuYyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIGEgYmFyeWNlbnRyaWMgY29vcmRpbmF0ZXMgZnJvbSB0aGUgZ2l2ZW4gdmVjdG9yLlxyXG5cdCAqIFJldHVybnMgYG51bGxgIGlmIHRoZSB0cmlhbmdsZSBpcyBkZWdlbmVyYXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBwb2ludCAtIEEgcG9pbnQgaW4gM0Qgc3BhY2UuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IHZlY3RvciB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGhvZCdzIHJlc3VsdC5cclxuXHQgKiBAcmV0dXJuIHs/VmVjdG9yM30gVGhlIGJhcnljZW50cmljIGNvb3JkaW5hdGVzIGZvciB0aGUgZ2l2ZW4gcG9pbnRcclxuXHQgKi9cclxuXHRnZXRCYXJ5Y29vcmQoIHBvaW50LCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0cmV0dXJuIFRyaWFuZ2xlLmdldEJhcnljb29yZCggcG9pbnQsIHRoaXMuYSwgdGhpcy5iLCB0aGlzLmMsIHRhcmdldCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSB2YWx1ZSBiYXJ5Y2VudHJpY2FsbHkgaW50ZXJwb2xhdGVkIGZvciB0aGUgZ2l2ZW4gcG9pbnQgb24gdGhlXHJcblx0ICogdHJpYW5nbGUuIFJldHVybnMgYG51bGxgIGlmIHRoZSB0cmlhbmdsZSBpcyBkZWdlbmVyYXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBwb2ludCAtIFBvc2l0aW9uIG9mIGludGVycG9sYXRlZCBwb2ludC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHYxIC0gVmFsdWUgdG8gaW50ZXJwb2xhdGUgb2YgZmlyc3QgdmVydGV4LlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdjIgLSBWYWx1ZSB0byBpbnRlcnBvbGF0ZSBvZiBzZWNvbmQgdmVydGV4LlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdjMgLSBWYWx1ZSB0byBpbnRlcnBvbGF0ZSBvZiB0aGlyZCB2ZXJ0ZXguXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IHZlY3RvciB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGhvZCdzIHJlc3VsdC5cclxuXHQgKiBAcmV0dXJuIHs/VmVjdG9yM30gVGhlIGludGVycG9sYXRlZCB2YWx1ZS5cclxuXHQgKi9cclxuXHRnZXRJbnRlcnBvbGF0aW9uKCBwb2ludCwgdjEsIHYyLCB2MywgdGFyZ2V0ICkge1xyXG5cclxuXHRcdHJldHVybiBUcmlhbmdsZS5nZXRJbnRlcnBvbGF0aW9uKCBwb2ludCwgdGhpcy5hLCB0aGlzLmIsIHRoaXMuYywgdjEsIHYyLCB2MywgdGFyZ2V0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIHBvaW50LCB3aGVuIHByb2plY3RlZCBvbnRvIHRoZSBwbGFuZSBvZiB0aGVcclxuXHQgKiB0cmlhbmdsZSwgbGllcyB3aXRoaW4gdGhlIHRyaWFuZ2xlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBwb2ludCAtIFRoZSBwb2ludCBpbiAzRCBzcGFjZSB0byB0ZXN0LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGdpdmVuIHBvaW50LCB3aGVuIHByb2plY3RlZCBvbnRvIHRoZSBwbGFuZSBvZiB0aGVcclxuXHQgKiB0cmlhbmdsZSwgbGllcyB3aXRoaW4gdGhlIHRyaWFuZ2xlIG9yIG5vdC5cclxuXHQgKi9cclxuXHRjb250YWluc1BvaW50KCBwb2ludCApIHtcclxuXHJcblx0XHRyZXR1cm4gVHJpYW5nbGUuY29udGFpbnNQb2ludCggcG9pbnQsIHRoaXMuYSwgdGhpcy5iLCB0aGlzLmMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdHJpYW5nbGUgaXMgb3JpZW50ZWQgdG93YXJkcyB0aGUgZ2l2ZW4gZGlyZWN0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBkaXJlY3Rpb24gLSBUaGUgKG5vcm1hbGl6ZWQpIGRpcmVjdGlvbiB2ZWN0b3IuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgdHJpYW5nbGUgaXMgb3JpZW50ZWQgdG93YXJkcyB0aGUgZ2l2ZW4gZGlyZWN0aW9uIG9yIG5vdC5cclxuXHQgKi9cclxuXHRpc0Zyb250RmFjaW5nKCBkaXJlY3Rpb24gKSB7XHJcblxyXG5cdFx0cmV0dXJuIFRyaWFuZ2xlLmlzRnJvbnRGYWNpbmcoIHRoaXMuYSwgdGhpcy5iLCB0aGlzLmMsIGRpcmVjdGlvbiApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgdHJpYW5nbGUgaW50ZXJzZWN0cyB3aXRoIHRoZSBnaXZlbiBib3guXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0JveDN9IGJveCAtIFRoZSBib3ggdG8gaW50ZXJzZWN0LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyB0cmlhbmdsZSBpbnRlcnNlY3RzIHdpdGggdGhlIGdpdmVuIGJveCBvciBub3QuXHJcblx0ICovXHJcblx0aW50ZXJzZWN0c0JveCggYm94ICkge1xyXG5cclxuXHRcdHJldHVybiBib3guaW50ZXJzZWN0c1RyaWFuZ2xlKCB0aGlzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgY2xvc2VzdCBwb2ludCBvbiB0aGUgdHJpYW5nbGUgdG8gdGhlIGdpdmVuIHBvaW50LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBwIC0gVGhlIHBvaW50IHRvIGNvbXB1dGUgdGhlIGNsb3Nlc3QgcG9pbnQgZm9yLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdGFyZ2V0IC0gVGhlIHRhcmdldCB2ZWN0b3IgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBtZXRob2QncyByZXN1bHQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gVGhlIGNsb3Nlc3QgcG9pbnQgb24gdGhlIHRyaWFuZ2xlLlxyXG5cdCAqL1xyXG5cdGNsb3Nlc3RQb2ludFRvUG9pbnQoIHAsIHRhcmdldCApIHtcclxuXHJcblx0XHRjb25zdCBhID0gdGhpcy5hLCBiID0gdGhpcy5iLCBjID0gdGhpcy5jO1xyXG5cdFx0bGV0IHYsIHc7XHJcblxyXG5cdFx0Ly8gYWxnb3JpdGhtIHRoYW5rcyB0byBSZWFsLVRpbWUgQ29sbGlzaW9uIERldGVjdGlvbiBieSBDaHJpc3RlciBFcmljc29uLFxyXG5cdFx0Ly8gcHVibGlzaGVkIGJ5IE1vcmdhbiBLYXVmbWFubiBQdWJsaXNoZXJzLCAoYykgMjAwNSBFbHNldmllciBJbmMuLFxyXG5cdFx0Ly8gdW5kZXIgdGhlIGFjY29tcGFueWluZyBsaWNlbnNlOyBzZWUgY2hhcHRlciA1LjEuNSBmb3IgZGV0YWlsZWQgZXhwbGFuYXRpb24uXHJcblx0XHQvLyBiYXNpY2FsbHksIHdlJ3JlIGRpc3Rpbmd1aXNoaW5nIHdoaWNoIG9mIHRoZSB2b3Jvbm9pIHJlZ2lvbnMgb2YgdGhlIHRyaWFuZ2xlXHJcblx0XHQvLyB0aGUgcG9pbnQgbGllcyBpbiB3aXRoIHRoZSBtaW5pbXVtIGFtb3VudCBvZiByZWR1bmRhbnQgY29tcHV0YXRpb24uXHJcblxyXG5cdFx0X3ZhYi5zdWJWZWN0b3JzKCBiLCBhICk7XHJcblx0XHRfdmFjLnN1YlZlY3RvcnMoIGMsIGEgKTtcclxuXHRcdF92YXAuc3ViVmVjdG9ycyggcCwgYSApO1xyXG5cdFx0Y29uc3QgZDEgPSBfdmFiLmRvdCggX3ZhcCApO1xyXG5cdFx0Y29uc3QgZDIgPSBfdmFjLmRvdCggX3ZhcCApO1xyXG5cdFx0aWYgKCBkMSA8PSAwICYmIGQyIDw9IDAgKSB7XHJcblxyXG5cdFx0XHQvLyB2ZXJ0ZXggcmVnaW9uIG9mIEE7IGJhcnljZW50cmljIGNvb3JkcyAoMSwgMCwgMClcclxuXHRcdFx0cmV0dXJuIHRhcmdldC5jb3B5KCBhICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdF92YnAuc3ViVmVjdG9ycyggcCwgYiApO1xyXG5cdFx0Y29uc3QgZDMgPSBfdmFiLmRvdCggX3ZicCApO1xyXG5cdFx0Y29uc3QgZDQgPSBfdmFjLmRvdCggX3ZicCApO1xyXG5cdFx0aWYgKCBkMyA+PSAwICYmIGQ0IDw9IGQzICkge1xyXG5cclxuXHRcdFx0Ly8gdmVydGV4IHJlZ2lvbiBvZiBCOyBiYXJ5Y2VudHJpYyBjb29yZHMgKDAsIDEsIDApXHJcblx0XHRcdHJldHVybiB0YXJnZXQuY29weSggYiApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCB2YyA9IGQxICogZDQgLSBkMyAqIGQyO1xyXG5cdFx0aWYgKCB2YyA8PSAwICYmIGQxID49IDAgJiYgZDMgPD0gMCApIHtcclxuXHJcblx0XHRcdHYgPSBkMSAvICggZDEgLSBkMyApO1xyXG5cdFx0XHQvLyBlZGdlIHJlZ2lvbiBvZiBBQjsgYmFyeWNlbnRyaWMgY29vcmRzICgxLXYsIHYsIDApXHJcblx0XHRcdHJldHVybiB0YXJnZXQuY29weSggYSApLmFkZFNjYWxlZFZlY3RvciggX3ZhYiwgdiApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRfdmNwLnN1YlZlY3RvcnMoIHAsIGMgKTtcclxuXHRcdGNvbnN0IGQ1ID0gX3ZhYi5kb3QoIF92Y3AgKTtcclxuXHRcdGNvbnN0IGQ2ID0gX3ZhYy5kb3QoIF92Y3AgKTtcclxuXHRcdGlmICggZDYgPj0gMCAmJiBkNSA8PSBkNiApIHtcclxuXHJcblx0XHRcdC8vIHZlcnRleCByZWdpb24gb2YgQzsgYmFyeWNlbnRyaWMgY29vcmRzICgwLCAwLCAxKVxyXG5cdFx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIGMgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgdmIgPSBkNSAqIGQyIC0gZDEgKiBkNjtcclxuXHRcdGlmICggdmIgPD0gMCAmJiBkMiA+PSAwICYmIGQ2IDw9IDAgKSB7XHJcblxyXG5cdFx0XHR3ID0gZDIgLyAoIGQyIC0gZDYgKTtcclxuXHRcdFx0Ly8gZWRnZSByZWdpb24gb2YgQUM7IGJhcnljZW50cmljIGNvb3JkcyAoMS13LCAwLCB3KVxyXG5cdFx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIGEgKS5hZGRTY2FsZWRWZWN0b3IoIF92YWMsIHcgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgdmEgPSBkMyAqIGQ2IC0gZDUgKiBkNDtcclxuXHRcdGlmICggdmEgPD0gMCAmJiAoIGQ0IC0gZDMgKSA+PSAwICYmICggZDUgLSBkNiApID49IDAgKSB7XHJcblxyXG5cdFx0XHRfdmJjLnN1YlZlY3RvcnMoIGMsIGIgKTtcclxuXHRcdFx0dyA9ICggZDQgLSBkMyApIC8gKCAoIGQ0IC0gZDMgKSArICggZDUgLSBkNiApICk7XHJcblx0XHRcdC8vIGVkZ2UgcmVnaW9uIG9mIEJDOyBiYXJ5Y2VudHJpYyBjb29yZHMgKDAsIDEtdywgdylcclxuXHRcdFx0cmV0dXJuIHRhcmdldC5jb3B5KCBiICkuYWRkU2NhbGVkVmVjdG9yKCBfdmJjLCB3ICk7IC8vIGVkZ2UgcmVnaW9uIG9mIEJDXHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGZhY2UgcmVnaW9uXHJcblx0XHRjb25zdCBkZW5vbSA9IDEgLyAoIHZhICsgdmIgKyB2YyApO1xyXG5cdFx0Ly8gdSA9IHZhICogZGVub21cclxuXHRcdHYgPSB2YiAqIGRlbm9tO1xyXG5cdFx0dyA9IHZjICogZGVub207XHJcblxyXG5cdFx0cmV0dXJuIHRhcmdldC5jb3B5KCBhICkuYWRkU2NhbGVkVmVjdG9yKCBfdmFiLCB2ICkuYWRkU2NhbGVkVmVjdG9yKCBfdmFjLCB3ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyB0cmlhbmdsZSBpcyBlcXVhbCB3aXRoIHRoZSBnaXZlbiBvbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RyaWFuZ2xlfSB0cmlhbmdsZSAtIFRoZSB0cmlhbmdsZSB0byB0ZXN0IGZvciBlcXVhbGl0eS5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoaXMgdHJpYW5nbGUgaXMgZXF1YWwgd2l0aCB0aGUgZ2l2ZW4gb25lLlxyXG5cdCAqL1xyXG5cdGVxdWFscyggdHJpYW5nbGUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRyaWFuZ2xlLmEuZXF1YWxzKCB0aGlzLmEgKSAmJiB0cmlhbmdsZS5iLmVxdWFscyggdGhpcy5iICkgJiYgdHJpYW5nbGUuYy5lcXVhbHMoIHRoaXMuYyApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBUcmlhbmdsZSB9O1xyXG4iLCJpbXBvcnQgeyBjbGFtcCwgZXVjbGlkZWFuTW9kdWxvLCBsZXJwIH0gZnJvbSAnLi9NYXRoVXRpbHMuanMnO1xyXG5pbXBvcnQgeyBDb2xvck1hbmFnZW1lbnQsIFNSR0JUb0xpbmVhciwgTGluZWFyVG9TUkdCIH0gZnJvbSAnLi9Db2xvck1hbmFnZW1lbnQuanMnO1xyXG5pbXBvcnQgeyBTUkdCQ29sb3JTcGFjZSB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XHJcblxyXG5jb25zdCBfY29sb3JLZXl3b3JkcyA9IHsgJ2FsaWNlYmx1ZSc6IDB4RjBGOEZGLCAnYW50aXF1ZXdoaXRlJzogMHhGQUVCRDcsICdhcXVhJzogMHgwMEZGRkYsICdhcXVhbWFyaW5lJzogMHg3RkZGRDQsICdhenVyZSc6IDB4RjBGRkZGLFxyXG5cdCdiZWlnZSc6IDB4RjVGNURDLCAnYmlzcXVlJzogMHhGRkU0QzQsICdibGFjayc6IDB4MDAwMDAwLCAnYmxhbmNoZWRhbG1vbmQnOiAweEZGRUJDRCwgJ2JsdWUnOiAweDAwMDBGRiwgJ2JsdWV2aW9sZXQnOiAweDhBMkJFMixcclxuXHQnYnJvd24nOiAweEE1MkEyQSwgJ2J1cmx5d29vZCc6IDB4REVCODg3LCAnY2FkZXRibHVlJzogMHg1RjlFQTAsICdjaGFydHJldXNlJzogMHg3RkZGMDAsICdjaG9jb2xhdGUnOiAweEQyNjkxRSwgJ2NvcmFsJzogMHhGRjdGNTAsXHJcblx0J2Nvcm5mbG93ZXJibHVlJzogMHg2NDk1RUQsICdjb3Juc2lsayc6IDB4RkZGOERDLCAnY3JpbXNvbic6IDB4REMxNDNDLCAnY3lhbic6IDB4MDBGRkZGLCAnZGFya2JsdWUnOiAweDAwMDA4QiwgJ2RhcmtjeWFuJzogMHgwMDhCOEIsXHJcblx0J2Rhcmtnb2xkZW5yb2QnOiAweEI4ODYwQiwgJ2RhcmtncmF5JzogMHhBOUE5QTksICdkYXJrZ3JlZW4nOiAweDAwNjQwMCwgJ2RhcmtncmV5JzogMHhBOUE5QTksICdkYXJra2hha2knOiAweEJEQjc2QiwgJ2RhcmttYWdlbnRhJzogMHg4QjAwOEIsXHJcblx0J2RhcmtvbGl2ZWdyZWVuJzogMHg1NTZCMkYsICdkYXJrb3JhbmdlJzogMHhGRjhDMDAsICdkYXJrb3JjaGlkJzogMHg5OTMyQ0MsICdkYXJrcmVkJzogMHg4QjAwMDAsICdkYXJrc2FsbW9uJzogMHhFOTk2N0EsICdkYXJrc2VhZ3JlZW4nOiAweDhGQkM4RixcclxuXHQnZGFya3NsYXRlYmx1ZSc6IDB4NDgzRDhCLCAnZGFya3NsYXRlZ3JheSc6IDB4MkY0RjRGLCAnZGFya3NsYXRlZ3JleSc6IDB4MkY0RjRGLCAnZGFya3R1cnF1b2lzZSc6IDB4MDBDRUQxLCAnZGFya3Zpb2xldCc6IDB4OTQwMEQzLFxyXG5cdCdkZWVwcGluayc6IDB4RkYxNDkzLCAnZGVlcHNreWJsdWUnOiAweDAwQkZGRiwgJ2RpbWdyYXknOiAweDY5Njk2OSwgJ2RpbWdyZXknOiAweDY5Njk2OSwgJ2RvZGdlcmJsdWUnOiAweDFFOTBGRiwgJ2ZpcmVicmljayc6IDB4QjIyMjIyLFxyXG5cdCdmbG9yYWx3aGl0ZSc6IDB4RkZGQUYwLCAnZm9yZXN0Z3JlZW4nOiAweDIyOEIyMiwgJ2Z1Y2hzaWEnOiAweEZGMDBGRiwgJ2dhaW5zYm9ybyc6IDB4RENEQ0RDLCAnZ2hvc3R3aGl0ZSc6IDB4RjhGOEZGLCAnZ29sZCc6IDB4RkZENzAwLFxyXG5cdCdnb2xkZW5yb2QnOiAweERBQTUyMCwgJ2dyYXknOiAweDgwODA4MCwgJ2dyZWVuJzogMHgwMDgwMDAsICdncmVlbnllbGxvdyc6IDB4QURGRjJGLCAnZ3JleSc6IDB4ODA4MDgwLCAnaG9uZXlkZXcnOiAweEYwRkZGMCwgJ2hvdHBpbmsnOiAweEZGNjlCNCxcclxuXHQnaW5kaWFucmVkJzogMHhDRDVDNUMsICdpbmRpZ28nOiAweDRCMDA4MiwgJ2l2b3J5JzogMHhGRkZGRjAsICdraGFraSc6IDB4RjBFNjhDLCAnbGF2ZW5kZXInOiAweEU2RTZGQSwgJ2xhdmVuZGVyYmx1c2gnOiAweEZGRjBGNSwgJ2xhd25ncmVlbic6IDB4N0NGQzAwLFxyXG5cdCdsZW1vbmNoaWZmb24nOiAweEZGRkFDRCwgJ2xpZ2h0Ymx1ZSc6IDB4QUREOEU2LCAnbGlnaHRjb3JhbCc6IDB4RjA4MDgwLCAnbGlnaHRjeWFuJzogMHhFMEZGRkYsICdsaWdodGdvbGRlbnJvZHllbGxvdyc6IDB4RkFGQUQyLCAnbGlnaHRncmF5JzogMHhEM0QzRDMsXHJcblx0J2xpZ2h0Z3JlZW4nOiAweDkwRUU5MCwgJ2xpZ2h0Z3JleSc6IDB4RDNEM0QzLCAnbGlnaHRwaW5rJzogMHhGRkI2QzEsICdsaWdodHNhbG1vbic6IDB4RkZBMDdBLCAnbGlnaHRzZWFncmVlbic6IDB4MjBCMkFBLCAnbGlnaHRza3libHVlJzogMHg4N0NFRkEsXHJcblx0J2xpZ2h0c2xhdGVncmF5JzogMHg3Nzg4OTksICdsaWdodHNsYXRlZ3JleSc6IDB4Nzc4ODk5LCAnbGlnaHRzdGVlbGJsdWUnOiAweEIwQzRERSwgJ2xpZ2h0eWVsbG93JzogMHhGRkZGRTAsICdsaW1lJzogMHgwMEZGMDAsICdsaW1lZ3JlZW4nOiAweDMyQ0QzMixcclxuXHQnbGluZW4nOiAweEZBRjBFNiwgJ21hZ2VudGEnOiAweEZGMDBGRiwgJ21hcm9vbic6IDB4ODAwMDAwLCAnbWVkaXVtYXF1YW1hcmluZSc6IDB4NjZDREFBLCAnbWVkaXVtYmx1ZSc6IDB4MDAwMENELCAnbWVkaXVtb3JjaGlkJzogMHhCQTU1RDMsXHJcblx0J21lZGl1bXB1cnBsZSc6IDB4OTM3MERCLCAnbWVkaXVtc2VhZ3JlZW4nOiAweDNDQjM3MSwgJ21lZGl1bXNsYXRlYmx1ZSc6IDB4N0I2OEVFLCAnbWVkaXVtc3ByaW5nZ3JlZW4nOiAweDAwRkE5QSwgJ21lZGl1bXR1cnF1b2lzZSc6IDB4NDhEMUNDLFxyXG5cdCdtZWRpdW12aW9sZXRyZWQnOiAweEM3MTU4NSwgJ21pZG5pZ2h0Ymx1ZSc6IDB4MTkxOTcwLCAnbWludGNyZWFtJzogMHhGNUZGRkEsICdtaXN0eXJvc2UnOiAweEZGRTRFMSwgJ21vY2Nhc2luJzogMHhGRkU0QjUsICduYXZham93aGl0ZSc6IDB4RkZERUFELFxyXG5cdCduYXZ5JzogMHgwMDAwODAsICdvbGRsYWNlJzogMHhGREY1RTYsICdvbGl2ZSc6IDB4ODA4MDAwLCAnb2xpdmVkcmFiJzogMHg2QjhFMjMsICdvcmFuZ2UnOiAweEZGQTUwMCwgJ29yYW5nZXJlZCc6IDB4RkY0NTAwLCAnb3JjaGlkJzogMHhEQTcwRDYsXHJcblx0J3BhbGVnb2xkZW5yb2QnOiAweEVFRThBQSwgJ3BhbGVncmVlbic6IDB4OThGQjk4LCAncGFsZXR1cnF1b2lzZSc6IDB4QUZFRUVFLCAncGFsZXZpb2xldHJlZCc6IDB4REI3MDkzLCAncGFwYXlhd2hpcCc6IDB4RkZFRkQ1LCAncGVhY2hwdWZmJzogMHhGRkRBQjksXHJcblx0J3BlcnUnOiAweENEODUzRiwgJ3BpbmsnOiAweEZGQzBDQiwgJ3BsdW0nOiAweEREQTBERCwgJ3Bvd2RlcmJsdWUnOiAweEIwRTBFNiwgJ3B1cnBsZSc6IDB4ODAwMDgwLCAncmViZWNjYXB1cnBsZSc6IDB4NjYzMzk5LCAncmVkJzogMHhGRjAwMDAsICdyb3N5YnJvd24nOiAweEJDOEY4RixcclxuXHQncm95YWxibHVlJzogMHg0MTY5RTEsICdzYWRkbGVicm93bic6IDB4OEI0NTEzLCAnc2FsbW9uJzogMHhGQTgwNzIsICdzYW5keWJyb3duJzogMHhGNEE0NjAsICdzZWFncmVlbic6IDB4MkU4QjU3LCAnc2Vhc2hlbGwnOiAweEZGRjVFRSxcclxuXHQnc2llbm5hJzogMHhBMDUyMkQsICdzaWx2ZXInOiAweEMwQzBDMCwgJ3NreWJsdWUnOiAweDg3Q0VFQiwgJ3NsYXRlYmx1ZSc6IDB4NkE1QUNELCAnc2xhdGVncmF5JzogMHg3MDgwOTAsICdzbGF0ZWdyZXknOiAweDcwODA5MCwgJ3Nub3cnOiAweEZGRkFGQSxcclxuXHQnc3ByaW5nZ3JlZW4nOiAweDAwRkY3RiwgJ3N0ZWVsYmx1ZSc6IDB4NDY4MkI0LCAndGFuJzogMHhEMkI0OEMsICd0ZWFsJzogMHgwMDgwODAsICd0aGlzdGxlJzogMHhEOEJGRDgsICd0b21hdG8nOiAweEZGNjM0NywgJ3R1cnF1b2lzZSc6IDB4NDBFMEQwLFxyXG5cdCd2aW9sZXQnOiAweEVFODJFRSwgJ3doZWF0JzogMHhGNURFQjMsICd3aGl0ZSc6IDB4RkZGRkZGLCAnd2hpdGVzbW9rZSc6IDB4RjVGNUY1LCAneWVsbG93JzogMHhGRkZGMDAsICd5ZWxsb3dncmVlbic6IDB4OUFDRDMyIH07XHJcblxyXG5jb25zdCBfaHNsQSA9IHsgaDogMCwgczogMCwgbDogMCB9O1xyXG5jb25zdCBfaHNsQiA9IHsgaDogMCwgczogMCwgbDogMCB9O1xyXG5cclxuZnVuY3Rpb24gaHVlMnJnYiggcCwgcSwgdCApIHtcclxuXHJcblx0aWYgKCB0IDwgMCApIHQgKz0gMTtcclxuXHRpZiAoIHQgPiAxICkgdCAtPSAxO1xyXG5cdGlmICggdCA8IDEgLyA2ICkgcmV0dXJuIHAgKyAoIHEgLSBwICkgKiA2ICogdDtcclxuXHRpZiAoIHQgPCAxIC8gMiApIHJldHVybiBxO1xyXG5cdGlmICggdCA8IDIgLyAzICkgcmV0dXJuIHAgKyAoIHEgLSBwICkgKiA2ICogKCAyIC8gMyAtIHQgKTtcclxuXHRyZXR1cm4gcDtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBIENvbG9yIGluc3RhbmNlIGlzIHJlcHJlc2VudGVkIGJ5IFJHQiBjb21wb25lbnRzIGluIHRoZSBsaW5lYXIgPGk+d29ya2luZ1xyXG4gKiBjb2xvciBzcGFjZTwvaT4sIHdoaWNoIGRlZmF1bHRzIHRvIGBMaW5lYXJTUkdCQ29sb3JTcGFjZWAuIElucHV0c1xyXG4gKiBjb252ZW50aW9uYWxseSB1c2luZyBgU1JHQkNvbG9yU3BhY2VgIChzdWNoIGFzIGhleGFkZWNpbWFscyBhbmQgQ1NTXHJcbiAqIHN0cmluZ3MpIGFyZSBjb252ZXJ0ZWQgdG8gdGhlIHdvcmtpbmcgY29sb3Igc3BhY2UgYXV0b21hdGljYWxseS5cclxuICpcclxuICogYGBganNcclxuICogLy8gY29udmVydGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBTUkdCQ29sb3JTcGFjZSB0byBMaW5lYXJTUkdCQ29sb3JTcGFjZVxyXG4gKiBjb25zdCBjb2xvciA9IG5ldyBUSFJFRS5Db2xvcigpLnNldEhleCggMHgxMTIyMzMgKTtcclxuICogYGBgXHJcbiAqIFNvdXJjZSBjb2xvciBzcGFjZXMgbWF5IGJlIHNwZWNpZmllZCBleHBsaWNpdGx5LCB0byBlbnN1cmUgY29ycmVjdCBjb252ZXJzaW9ucy5cclxuICogYGBganNcclxuICogLy8gYXNzdW1lZCBhbHJlYWR5IExpbmVhclNSR0JDb2xvclNwYWNlOyBubyBjb252ZXJzaW9uXHJcbiAqIGNvbnN0IGNvbG9yID0gbmV3IFRIUkVFLkNvbG9yKCkuc2V0UkdCKCAwLjUsIDAuNSwgMC41ICk7XHJcbiAqXHJcbiAqIC8vIGNvbnZlcnRlZCBleHBsaWNpdGx5IGZyb20gU1JHQkNvbG9yU3BhY2UgdG8gTGluZWFyU1JHQkNvbG9yU3BhY2VcclxuICogY29uc3QgY29sb3IgPSBuZXcgVEhSRUUuQ29sb3IoKS5zZXRSR0IoIDAuNSwgMC41LCAwLjUsIFNSR0JDb2xvclNwYWNlICk7XHJcbiAqIGBgYFxyXG4gKiBJZiBUSFJFRS5Db2xvck1hbmFnZW1lbnQgaXMgZGlzYWJsZWQsIG5vIGNvbnZlcnNpb25zIG9jY3VyLiBGb3IgZGV0YWlscyxcclxuICogc2VlIDxpPkNvbG9yIG1hbmFnZW1lbnQ8L2k+LiBJdGVyYXRpbmcgdGhyb3VnaCBhIENvbG9yIGluc3RhbmNlIHdpbGwgeWllbGRcclxuICogaXRzIGNvbXBvbmVudHMgKHIsIGcsIGIpIGluIHRoZSBjb3JyZXNwb25kaW5nIG9yZGVyLiBBIENvbG9yIGNhbiBiZSBpbml0aWFsaXNlZFxyXG4gKiBpbiBhbnkgb2YgdGhlIGZvbGxvd2luZyB3YXlzOlxyXG4gKiBgYGBqc1xyXG4gKiAvL2VtcHR5IGNvbnN0cnVjdG9yIC0gd2lsbCBkZWZhdWx0IHdoaXRlXHJcbiAqIGNvbnN0IGNvbG9yMSA9IG5ldyBUSFJFRS5Db2xvcigpO1xyXG4gKlxyXG4gKiAvL0hleGFkZWNpbWFsIGNvbG9yIChyZWNvbW1lbmRlZClcclxuICogY29uc3QgY29sb3IyID0gbmV3IFRIUkVFLkNvbG9yKCAweGZmMDAwMCApO1xyXG4gKlxyXG4gKiAvL1JHQiBzdHJpbmdcclxuICogY29uc3QgY29sb3IzID0gbmV3IFRIUkVFLkNvbG9yKFwicmdiKDI1NSwgMCwgMClcIik7XHJcbiAqIGNvbnN0IGNvbG9yNCA9IG5ldyBUSFJFRS5Db2xvcihcInJnYigxMDAlLCAwJSwgMCUpXCIpO1xyXG4gKlxyXG4gKiAvL1gxMSBjb2xvciBuYW1lIC0gYWxsIDE0MCBjb2xvciBuYW1lcyBhcmUgc3VwcG9ydGVkLlxyXG4gKiAvL05vdGUgdGhlIGxhY2sgb2YgQ2FtZWxDYXNlIGluIHRoZSBuYW1lXHJcbiAqIGNvbnN0IGNvbG9yNSA9IG5ldyBUSFJFRS5Db2xvciggJ3NreWJsdWUnICk7XHJcbiAqIC8vSFNMIHN0cmluZ1xyXG4gKiBjb25zdCBjb2xvcjYgPSBuZXcgVEhSRUUuQ29sb3IoXCJoc2woMCwgMTAwJSwgNTAlKVwiKTtcclxuICpcclxuICogLy9TZXBhcmF0ZSBSR0IgdmFsdWVzIGJldHdlZW4gMCBhbmQgMVxyXG4gKiBjb25zdCBjb2xvcjcgPSBuZXcgVEhSRUUuQ29sb3IoIDEsIDAsIDAgKTtcclxuICogYGBgXHJcbiAqL1xyXG5jbGFzcyBDb2xvciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgY29sb3IuXHJcblx0ICpcclxuXHQgKiBOb3RlIHRoYXQgc3RhbmRhcmQgbWV0aG9kIG9mIHNwZWNpZnlpbmcgY29sb3IgaW4gdGhyZWUuanMgaXMgd2l0aCBhIGhleGFkZWNpbWFsIHRyaXBsZXQsXHJcblx0ICogYW5kIHRoYXQgbWV0aG9kIGlzIHVzZWQgdGhyb3VnaG91dCB0aGUgcmVzdCBvZiB0aGUgZG9jdW1lbnRhdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7KG51bWJlcnxzdHJpbmd8Q29sb3IpfSBbcl0gLSBUaGUgcmVkIGNvbXBvbmVudCBvZiB0aGUgY29sb3IuIElmIGBnYCBhbmQgYGJgIGFyZVxyXG5cdCAqIG5vdCBwcm92aWRlZCwgaXQgY2FuIGJlIGhleGFkZWNpbWFsIHRyaXBsZXQsIGEgQ1NTLXN0eWxlIHN0cmluZyBvciBhbm90aGVyIGBDb2xvcmAgaW5zdGFuY2UuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtnXSAtIFRoZSBncmVlbiBjb21wb25lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtiXSAtIFRoZSBibHVlIGNvbXBvbmVudC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggciwgZywgYiApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNDb2xvciA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcmVkIGNvbXBvbmVudC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnIgPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGdyZWVuIGNvbXBvbmVudC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmcgPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGJsdWUgY29tcG9uZW50LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYiA9IDE7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuc2V0KCByLCBnLCBiICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgY29sb3JzJ3MgY29tcG9uZW50cyBmcm9tIHRoZSBnaXZlbiB2YWx1ZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geyhudW1iZXJ8c3RyaW5nfENvbG9yKX0gW3JdIC0gVGhlIHJlZCBjb21wb25lbnQgb2YgdGhlIGNvbG9yLiBJZiBgZ2AgYW5kIGBiYCBhcmVcclxuXHQgKiBub3QgcHJvdmlkZWQsIGl0IGNhbiBiZSBoZXhhZGVjaW1hbCB0cmlwbGV0LCBhIENTUy1zdHlsZSBzdHJpbmcgb3IgYW5vdGhlciBgQ29sb3JgIGluc3RhbmNlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZ10gLSBUaGUgZ3JlZW4gY29tcG9uZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbYl0gLSBUaGUgYmx1ZSBjb21wb25lbnQuXHJcblx0ICogQHJldHVybiB7Q29sb3J9IEEgcmVmZXJlbmNlIHRvIHRoaXMgY29sb3IuXHJcblx0ICovXHJcblx0c2V0KCByLCBnLCBiICkge1xyXG5cclxuXHRcdGlmICggZyA9PT0gdW5kZWZpbmVkICYmIGIgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdC8vIHIgaXMgVEhSRUUuQ29sb3IsIGhleCBvciBzdHJpbmdcclxuXHJcblx0XHRcdGNvbnN0IHZhbHVlID0gcjtcclxuXHJcblx0XHRcdGlmICggdmFsdWUgJiYgdmFsdWUuaXNDb2xvciApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5jb3B5KCB2YWx1ZSApO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5zZXRIZXgoIHZhbHVlICk7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLnNldFN0eWxlKCB2YWx1ZSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR0aGlzLnNldFJHQiggciwgZywgYiApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBjb2xvcnMncyBjb21wb25lbnRzIHRvIHRoZSBnaXZlbiBzY2FsYXIgdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc2NhbGFyIC0gVGhlIHNjYWxhciB2YWx1ZS5cclxuXHQgKiBAcmV0dXJuIHtDb2xvcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBjb2xvci5cclxuXHQgKi9cclxuXHRzZXRTY2FsYXIoIHNjYWxhciApIHtcclxuXHJcblx0XHR0aGlzLnIgPSBzY2FsYXI7XHJcblx0XHR0aGlzLmcgPSBzY2FsYXI7XHJcblx0XHR0aGlzLmIgPSBzY2FsYXI7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGlzIGNvbG9yIGZyb20gYSBoZXhhZGVjaW1hbCB2YWx1ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBoZXggLSBUaGUgaGV4YWRlY2ltYWwgdmFsdWUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtjb2xvclNwYWNlPVNSR0JDb2xvclNwYWNlXSAtIFRoZSBjb2xvciBzcGFjZS5cclxuXHQgKiBAcmV0dXJuIHtDb2xvcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBjb2xvci5cclxuXHQgKi9cclxuXHRzZXRIZXgoIGhleCwgY29sb3JTcGFjZSA9IFNSR0JDb2xvclNwYWNlICkge1xyXG5cclxuXHRcdGhleCA9IE1hdGguZmxvb3IoIGhleCApO1xyXG5cclxuXHRcdHRoaXMuciA9ICggaGV4ID4+IDE2ICYgMjU1ICkgLyAyNTU7XHJcblx0XHR0aGlzLmcgPSAoIGhleCA+PiA4ICYgMjU1ICkgLyAyNTU7XHJcblx0XHR0aGlzLmIgPSAoIGhleCAmIDI1NSApIC8gMjU1O1xyXG5cclxuXHRcdENvbG9yTWFuYWdlbWVudC50b1dvcmtpbmdDb2xvclNwYWNlKCB0aGlzLCBjb2xvclNwYWNlICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGlzIGNvbG9yIGZyb20gUkdCIHZhbHVlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSByIC0gUmVkIGNoYW5uZWwgdmFsdWUgYmV0d2VlbiBgMC4wYCBhbmQgYDEuMGAuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGcgLSBHcmVlbiBjaGFubmVsIHZhbHVlIGJldHdlZW4gYDAuMGAgYW5kIGAxLjBgLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBiIC0gQmx1ZSBjaGFubmVsIHZhbHVlIGJldHdlZW4gYDAuMGAgYW5kIGAxLjBgLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbY29sb3JTcGFjZT1Db2xvck1hbmFnZW1lbnQud29ya2luZ0NvbG9yU3BhY2VdIC0gVGhlIGNvbG9yIHNwYWNlLlxyXG5cdCAqIEByZXR1cm4ge0NvbG9yfSBBIHJlZmVyZW5jZSB0byB0aGlzIGNvbG9yLlxyXG5cdCAqL1xyXG5cdHNldFJHQiggciwgZywgYiwgY29sb3JTcGFjZSA9IENvbG9yTWFuYWdlbWVudC53b3JraW5nQ29sb3JTcGFjZSApIHtcclxuXHJcblx0XHR0aGlzLnIgPSByO1xyXG5cdFx0dGhpcy5nID0gZztcclxuXHRcdHRoaXMuYiA9IGI7XHJcblxyXG5cdFx0Q29sb3JNYW5hZ2VtZW50LnRvV29ya2luZ0NvbG9yU3BhY2UoIHRoaXMsIGNvbG9yU3BhY2UgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoaXMgY29sb3IgZnJvbSBSR0IgdmFsdWVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGggLSBIdWUgdmFsdWUgYmV0d2VlbiBgMC4wYCBhbmQgYDEuMGAuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHMgLSBTYXR1cmF0aW9uIHZhbHVlIGJldHdlZW4gYDAuMGAgYW5kIGAxLjBgLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBsIC0gTGlnaHRuZXNzIHZhbHVlIGJldHdlZW4gYDAuMGAgYW5kIGAxLjBgLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbY29sb3JTcGFjZT1Db2xvck1hbmFnZW1lbnQud29ya2luZ0NvbG9yU3BhY2VdIC0gVGhlIGNvbG9yIHNwYWNlLlxyXG5cdCAqIEByZXR1cm4ge0NvbG9yfSBBIHJlZmVyZW5jZSB0byB0aGlzIGNvbG9yLlxyXG5cdCAqL1xyXG5cdHNldEhTTCggaCwgcywgbCwgY29sb3JTcGFjZSA9IENvbG9yTWFuYWdlbWVudC53b3JraW5nQ29sb3JTcGFjZSApIHtcclxuXHJcblx0XHQvLyBoLHMsbCByYW5nZXMgYXJlIGluIDAuMCAtIDEuMFxyXG5cdFx0aCA9IGV1Y2xpZGVhbk1vZHVsbyggaCwgMSApO1xyXG5cdFx0cyA9IGNsYW1wKCBzLCAwLCAxICk7XHJcblx0XHRsID0gY2xhbXAoIGwsIDAsIDEgKTtcclxuXHJcblx0XHRpZiAoIHMgPT09IDAgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnIgPSB0aGlzLmcgPSB0aGlzLmIgPSBsO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRjb25zdCBwID0gbCA8PSAwLjUgPyBsICogKCAxICsgcyApIDogbCArIHMgLSAoIGwgKiBzICk7XHJcblx0XHRcdGNvbnN0IHEgPSAoIDIgKiBsICkgLSBwO1xyXG5cclxuXHRcdFx0dGhpcy5yID0gaHVlMnJnYiggcSwgcCwgaCArIDEgLyAzICk7XHJcblx0XHRcdHRoaXMuZyA9IGh1ZTJyZ2IoIHEsIHAsIGggKTtcclxuXHRcdFx0dGhpcy5iID0gaHVlMnJnYiggcSwgcCwgaCAtIDEgLyAzICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdENvbG9yTWFuYWdlbWVudC50b1dvcmtpbmdDb2xvclNwYWNlKCB0aGlzLCBjb2xvclNwYWNlICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGlzIGNvbG9yIGZyb20gYSBDU1Mtc3R5bGUgc3RyaW5nLiBGb3IgZXhhbXBsZSwgYHJnYigyNTAsIDAsMClgLFxyXG5cdCAqIGByZ2IoMTAwJSwgMCUsIDAlKWAsIGBoc2woMCwgMTAwJSwgNTAlKWAsIGAjZmYwMDAwYCwgYCNmMDBgLCBvciBgcmVkYCAoIG9yXHJcblx0ICogYW55IFtYMTEgY29sb3IgbmFtZV17QGxpbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvWDExX2NvbG9yX25hbWVzI0NvbG9yX25hbWVfY2hhcnR9IC1cclxuXHQgKiBhbGwgMTQwIGNvbG9yIG5hbWVzIGFyZSBzdXBwb3J0ZWQpLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHN0eWxlIC0gQ29sb3IgYXMgYSBDU1Mtc3R5bGUgc3RyaW5nLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbY29sb3JTcGFjZT1TUkdCQ29sb3JTcGFjZV0gLSBUaGUgY29sb3Igc3BhY2UuXHJcblx0ICogQHJldHVybiB7Q29sb3J9IEEgcmVmZXJlbmNlIHRvIHRoaXMgY29sb3IuXHJcblx0ICovXHJcblx0c2V0U3R5bGUoIHN0eWxlLCBjb2xvclNwYWNlID0gU1JHQkNvbG9yU3BhY2UgKSB7XHJcblxyXG5cdFx0ZnVuY3Rpb24gaGFuZGxlQWxwaGEoIHN0cmluZyApIHtcclxuXHJcblx0XHRcdGlmICggc3RyaW5nID09PSB1bmRlZmluZWQgKSByZXR1cm47XHJcblxyXG5cdFx0XHRpZiAoIHBhcnNlRmxvYXQoIHN0cmluZyApIDwgMSApIHtcclxuXHJcblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ29sb3I6IEFscGhhIGNvbXBvbmVudCBvZiAnICsgc3R5bGUgKyAnIHdpbGwgYmUgaWdub3JlZC4nICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHJcblx0XHRsZXQgbTtcclxuXHJcblx0XHRpZiAoIG0gPSAvXihcXHcrKVxcKChbXlxcKV0qKVxcKS8uZXhlYyggc3R5bGUgKSApIHtcclxuXHJcblx0XHRcdC8vIHJnYiAvIGhzbFxyXG5cclxuXHRcdFx0bGV0IGNvbG9yO1xyXG5cdFx0XHRjb25zdCBuYW1lID0gbVsgMSBdO1xyXG5cdFx0XHRjb25zdCBjb21wb25lbnRzID0gbVsgMiBdO1xyXG5cclxuXHRcdFx0c3dpdGNoICggbmFtZSApIHtcclxuXHJcblx0XHRcdFx0Y2FzZSAncmdiJzpcclxuXHRcdFx0XHRjYXNlICdyZ2JhJzpcclxuXHJcblx0XHRcdFx0XHRpZiAoIGNvbG9yID0gL15cXHMqKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKig/OixcXHMqKFxcZCpcXC4/XFxkKylcXHMqKT8kLy5leGVjKCBjb21wb25lbnRzICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHQvLyByZ2IoMjU1LDAsMCkgcmdiYSgyNTUsMCwwLDAuNSlcclxuXHJcblx0XHRcdFx0XHRcdGhhbmRsZUFscGhhKCBjb2xvclsgNCBdICk7XHJcblxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5zZXRSR0IoXHJcblx0XHRcdFx0XHRcdFx0TWF0aC5taW4oIDI1NSwgcGFyc2VJbnQoIGNvbG9yWyAxIF0sIDEwICkgKSAvIDI1NSxcclxuXHRcdFx0XHRcdFx0XHRNYXRoLm1pbiggMjU1LCBwYXJzZUludCggY29sb3JbIDIgXSwgMTAgKSApIC8gMjU1LFxyXG5cdFx0XHRcdFx0XHRcdE1hdGgubWluKCAyNTUsIHBhcnNlSW50KCBjb2xvclsgMyBdLCAxMCApICkgLyAyNTUsXHJcblx0XHRcdFx0XHRcdFx0Y29sb3JTcGFjZVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRpZiAoIGNvbG9yID0gL15cXHMqKFxcZCspXFwlXFxzKixcXHMqKFxcZCspXFwlXFxzKixcXHMqKFxcZCspXFwlXFxzKig/OixcXHMqKFxcZCpcXC4/XFxkKylcXHMqKT8kLy5leGVjKCBjb21wb25lbnRzICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHQvLyByZ2IoMTAwJSwwJSwwJSkgcmdiYSgxMDAlLDAlLDAlLDAuNSlcclxuXHJcblx0XHRcdFx0XHRcdGhhbmRsZUFscGhhKCBjb2xvclsgNCBdICk7XHJcblxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5zZXRSR0IoXHJcblx0XHRcdFx0XHRcdFx0TWF0aC5taW4oIDEwMCwgcGFyc2VJbnQoIGNvbG9yWyAxIF0sIDEwICkgKSAvIDEwMCxcclxuXHRcdFx0XHRcdFx0XHRNYXRoLm1pbiggMTAwLCBwYXJzZUludCggY29sb3JbIDIgXSwgMTAgKSApIC8gMTAwLFxyXG5cdFx0XHRcdFx0XHRcdE1hdGgubWluKCAxMDAsIHBhcnNlSW50KCBjb2xvclsgMyBdLCAxMCApICkgLyAxMDAsXHJcblx0XHRcdFx0XHRcdFx0Y29sb3JTcGFjZVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0Y2FzZSAnaHNsJzpcclxuXHRcdFx0XHRjYXNlICdoc2xhJzpcclxuXHJcblx0XHRcdFx0XHRpZiAoIGNvbG9yID0gL15cXHMqKFxcZCpcXC4/XFxkKylcXHMqLFxccyooXFxkKlxcLj9cXGQrKVxcJVxccyosXFxzKihcXGQqXFwuP1xcZCspXFwlXFxzKig/OixcXHMqKFxcZCpcXC4/XFxkKylcXHMqKT8kLy5leGVjKCBjb21wb25lbnRzICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBoc2woMTIwLDUwJSw1MCUpIGhzbGEoMTIwLDUwJSw1MCUsMC41KVxyXG5cclxuXHRcdFx0XHRcdFx0aGFuZGxlQWxwaGEoIGNvbG9yWyA0IF0gKTtcclxuXHJcblx0XHRcdFx0XHRcdHJldHVybiB0aGlzLnNldEhTTChcclxuXHRcdFx0XHRcdFx0XHRwYXJzZUZsb2F0KCBjb2xvclsgMSBdICkgLyAzNjAsXHJcblx0XHRcdFx0XHRcdFx0cGFyc2VGbG9hdCggY29sb3JbIDIgXSApIC8gMTAwLFxyXG5cdFx0XHRcdFx0XHRcdHBhcnNlRmxvYXQoIGNvbG9yWyAzIF0gKSAvIDEwMCxcclxuXHRcdFx0XHRcdFx0XHRjb2xvclNwYWNlXHJcblx0XHRcdFx0XHRcdCk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRkZWZhdWx0OlxyXG5cclxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkNvbG9yOiBVbmtub3duIGNvbG9yIG1vZGVsICcgKyBzdHlsZSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSBpZiAoIG0gPSAvXlxcIyhbQS1GYS1mXFxkXSspJC8uZXhlYyggc3R5bGUgKSApIHtcclxuXHJcblx0XHRcdC8vIGhleCBjb2xvclxyXG5cclxuXHRcdFx0Y29uc3QgaGV4ID0gbVsgMSBdO1xyXG5cdFx0XHRjb25zdCBzaXplID0gaGV4Lmxlbmd0aDtcclxuXHJcblx0XHRcdGlmICggc2l6ZSA9PT0gMyApIHtcclxuXHJcblx0XHRcdFx0Ly8gI2ZmMFxyXG5cdFx0XHRcdHJldHVybiB0aGlzLnNldFJHQihcclxuXHRcdFx0XHRcdHBhcnNlSW50KCBoZXguY2hhckF0KCAwICksIDE2ICkgLyAxNSxcclxuXHRcdFx0XHRcdHBhcnNlSW50KCBoZXguY2hhckF0KCAxICksIDE2ICkgLyAxNSxcclxuXHRcdFx0XHRcdHBhcnNlSW50KCBoZXguY2hhckF0KCAyICksIDE2ICkgLyAxNSxcclxuXHRcdFx0XHRcdGNvbG9yU3BhY2VcclxuXHRcdFx0XHQpO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggc2l6ZSA9PT0gNiApIHtcclxuXHJcblx0XHRcdFx0Ly8gI2ZmMDAwMFxyXG5cdFx0XHRcdHJldHVybiB0aGlzLnNldEhleCggcGFyc2VJbnQoIGhleCwgMTYgKSwgY29sb3JTcGFjZSApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ29sb3I6IEludmFsaWQgaGV4IGNvbG9yICcgKyBzdHlsZSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHN0eWxlICYmIHN0eWxlLmxlbmd0aCA+IDAgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gdGhpcy5zZXRDb2xvck5hbWUoIHN0eWxlLCBjb2xvclNwYWNlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhpcyBjb2xvciBmcm9tIGEgY29sb3IgbmFtZS4gRmFzdGVyIHRoYW4ge0BsaW5rIENvbG9yI3NldFN0eWxlfSBpZlxyXG5cdCAqIHlvdSBkb24ndCBuZWVkIHRoZSBvdGhlciBDU1Mtc3R5bGUgZm9ybWF0cy5cclxuXHQgKlxyXG5cdCAqIEZvciBjb252ZW5pZW5jZSwgdGhlIGxpc3Qgb2YgbmFtZXMgaXMgZXhwb3NlZCBpbiBgQ29sb3IuTkFNRVNgIGFzIGEgaGFzaC5cclxuXHQgKiBgYGBqc1xyXG5cdCAqIENvbG9yLk5BTUVTLmFsaWNlYmx1ZSAvLyByZXR1cm5zIDB4RjBGOEZGXHJcblx0ICogYGBgXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc3R5bGUgLSBUaGUgY29sb3IgbmFtZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW2NvbG9yU3BhY2U9U1JHQkNvbG9yU3BhY2VdIC0gVGhlIGNvbG9yIHNwYWNlLlxyXG5cdCAqIEByZXR1cm4ge0NvbG9yfSBBIHJlZmVyZW5jZSB0byB0aGlzIGNvbG9yLlxyXG5cdCAqL1xyXG5cdHNldENvbG9yTmFtZSggc3R5bGUsIGNvbG9yU3BhY2UgPSBTUkdCQ29sb3JTcGFjZSApIHtcclxuXHJcblx0XHQvLyBjb2xvciBrZXl3b3Jkc1xyXG5cdFx0Y29uc3QgaGV4ID0gX2NvbG9yS2V5d29yZHNbIHN0eWxlLnRvTG93ZXJDYXNlKCkgXTtcclxuXHJcblx0XHRpZiAoIGhleCAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Ly8gcmVkXHJcblx0XHRcdHRoaXMuc2V0SGV4KCBoZXgsIGNvbG9yU3BhY2UgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Ly8gdW5rbm93biBjb2xvclxyXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Db2xvcjogVW5rbm93biBjb2xvciAnICsgc3R5bGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIG5ldyBjb2xvciB3aXRoIGNvcGllZCB2YWx1ZXMgZnJvbSB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Q29sb3J9IEEgY2xvbmUgb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjbG9uZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuciwgdGhpcy5nLCB0aGlzLmIgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gY29sb3IgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Q29sb3J9IGNvbG9yIC0gVGhlIGNvbG9yIHRvIGNvcHkuXHJcblx0ICogQHJldHVybiB7Q29sb3J9IEEgcmVmZXJlbmNlIHRvIHRoaXMgY29sb3IuXHJcblx0ICovXHJcblx0Y29weSggY29sb3IgKSB7XHJcblxyXG5cdFx0dGhpcy5yID0gY29sb3IucjtcclxuXHRcdHRoaXMuZyA9IGNvbG9yLmc7XHJcblx0XHR0aGlzLmIgPSBjb2xvci5iO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvcGllcyB0aGUgZ2l2ZW4gY29sb3IgaW50byB0aGlzIGNvbG9yLCBhbmQgdGhlbiBjb252ZXJ0cyB0aGlzIGNvbG9yIGZyb21cclxuXHQgKiBgU1JHQkNvbG9yU3BhY2VgIHRvIGBMaW5lYXJTUkdCQ29sb3JTcGFjZWAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0NvbG9yfSBjb2xvciAtIFRoZSBjb2xvciB0byBjb3B5L2NvbnZlcnQuXHJcblx0ICogQHJldHVybiB7Q29sb3J9IEEgcmVmZXJlbmNlIHRvIHRoaXMgY29sb3IuXHJcblx0ICovXHJcblx0Y29weVNSR0JUb0xpbmVhciggY29sb3IgKSB7XHJcblxyXG5cdFx0dGhpcy5yID0gU1JHQlRvTGluZWFyKCBjb2xvci5yICk7XHJcblx0XHR0aGlzLmcgPSBTUkdCVG9MaW5lYXIoIGNvbG9yLmcgKTtcclxuXHRcdHRoaXMuYiA9IFNSR0JUb0xpbmVhciggY29sb3IuYiApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvcGllcyB0aGUgZ2l2ZW4gY29sb3IgaW50byB0aGlzIGNvbG9yLCBhbmQgdGhlbiBjb252ZXJ0cyB0aGlzIGNvbG9yIGZyb21cclxuXHQgKiBgTGluZWFyU1JHQkNvbG9yU3BhY2VgIHRvIGBTUkdCQ29sb3JTcGFjZWAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0NvbG9yfSBjb2xvciAtIFRoZSBjb2xvciB0byBjb3B5L2NvbnZlcnQuXHJcblx0ICogQHJldHVybiB7Q29sb3J9IEEgcmVmZXJlbmNlIHRvIHRoaXMgY29sb3IuXHJcblx0ICovXHJcblx0Y29weUxpbmVhclRvU1JHQiggY29sb3IgKSB7XHJcblxyXG5cdFx0dGhpcy5yID0gTGluZWFyVG9TUkdCKCBjb2xvci5yICk7XHJcblx0XHR0aGlzLmcgPSBMaW5lYXJUb1NSR0IoIGNvbG9yLmcgKTtcclxuXHRcdHRoaXMuYiA9IExpbmVhclRvU1JHQiggY29sb3IuYiApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnZlcnRzIHRoaXMgY29sb3IgZnJvbSBgU1JHQkNvbG9yU3BhY2VgIHRvIGBMaW5lYXJTUkdCQ29sb3JTcGFjZWAuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtDb2xvcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBjb2xvci5cclxuXHQgKi9cclxuXHRjb252ZXJ0U1JHQlRvTGluZWFyKCkge1xyXG5cclxuXHRcdHRoaXMuY29weVNSR0JUb0xpbmVhciggdGhpcyApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnZlcnRzIHRoaXMgY29sb3IgZnJvbSBgTGluZWFyU1JHQkNvbG9yU3BhY2VgIHRvIGBTUkdCQ29sb3JTcGFjZWAuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtDb2xvcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBjb2xvci5cclxuXHQgKi9cclxuXHRjb252ZXJ0TGluZWFyVG9TUkdCKCkge1xyXG5cclxuXHRcdHRoaXMuY29weUxpbmVhclRvU1JHQiggdGhpcyApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGhleGFkZWNpbWFsIHZhbHVlIG9mIHRoaXMgY29sb3IuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW2NvbG9yU3BhY2U9U1JHQkNvbG9yU3BhY2VdIC0gVGhlIGNvbG9yIHNwYWNlLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGhleGFkZWNpbWFsIHZhbHVlLlxyXG5cdCAqL1xyXG5cdGdldEhleCggY29sb3JTcGFjZSA9IFNSR0JDb2xvclNwYWNlICkge1xyXG5cclxuXHRcdENvbG9yTWFuYWdlbWVudC5mcm9tV29ya2luZ0NvbG9yU3BhY2UoIF9jb2xvci5jb3B5KCB0aGlzICksIGNvbG9yU3BhY2UgKTtcclxuXHJcblx0XHRyZXR1cm4gTWF0aC5yb3VuZCggY2xhbXAoIF9jb2xvci5yICogMjU1LCAwLCAyNTUgKSApICogNjU1MzYgKyBNYXRoLnJvdW5kKCBjbGFtcCggX2NvbG9yLmcgKiAyNTUsIDAsIDI1NSApICkgKiAyNTYgKyBNYXRoLnJvdW5kKCBjbGFtcCggX2NvbG9yLmIgKiAyNTUsIDAsIDI1NSApICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgaGV4YWRlY2ltYWwgdmFsdWUgb2YgdGhpcyBjb2xvciBhcyBhIHN0cmluZyAoZm9yIGV4YW1wbGUsICdGRkZGRkYnKS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbY29sb3JTcGFjZT1TUkdCQ29sb3JTcGFjZV0gLSBUaGUgY29sb3Igc3BhY2UuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgaGV4YWRlY2ltYWwgdmFsdWUgYXMgYSBzdHJpbmcuXHJcblx0ICovXHJcblx0Z2V0SGV4U3RyaW5nKCBjb2xvclNwYWNlID0gU1JHQkNvbG9yU3BhY2UgKSB7XHJcblxyXG5cdFx0cmV0dXJuICggJzAwMDAwMCcgKyB0aGlzLmdldEhleCggY29sb3JTcGFjZSApLnRvU3RyaW5nKCAxNiApICkuc2xpY2UoIC0gNiApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnZlcnRzIHRoZSBjb2xvcnMgUkdCIHZhbHVlcyBpbnRvIHRoZSBIU0wgZm9ybWF0IGFuZCBzdG9yZXMgdGhlbSBpbnRvIHRoZVxyXG5cdCAqIGdpdmVuIHRhcmdldCBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3toOm51bWJlcixzOm51bWJlcixsOm51bWJlcn19IHRhcmdldCAtIFRoZSB0YXJnZXQgb2JqZWN0IHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbWV0aG9kJ3MgcmVzdWx0LlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbY29sb3JTcGFjZT1Db2xvck1hbmFnZW1lbnQud29ya2luZ0NvbG9yU3BhY2VdIC0gVGhlIGNvbG9yIHNwYWNlLlxyXG5cdCAqIEByZXR1cm4ge3toOm51bWJlcixzOm51bWJlcixsOm51bWJlcn19IFRoZSBIU0wgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBjb2xvci5cclxuXHQgKi9cclxuXHRnZXRIU0woIHRhcmdldCwgY29sb3JTcGFjZSA9IENvbG9yTWFuYWdlbWVudC53b3JraW5nQ29sb3JTcGFjZSApIHtcclxuXHJcblx0XHQvLyBoLHMsbCByYW5nZXMgYXJlIGluIDAuMCAtIDEuMFxyXG5cclxuXHRcdENvbG9yTWFuYWdlbWVudC5mcm9tV29ya2luZ0NvbG9yU3BhY2UoIF9jb2xvci5jb3B5KCB0aGlzICksIGNvbG9yU3BhY2UgKTtcclxuXHJcblx0XHRjb25zdCByID0gX2NvbG9yLnIsIGcgPSBfY29sb3IuZywgYiA9IF9jb2xvci5iO1xyXG5cclxuXHRcdGNvbnN0IG1heCA9IE1hdGgubWF4KCByLCBnLCBiICk7XHJcblx0XHRjb25zdCBtaW4gPSBNYXRoLm1pbiggciwgZywgYiApO1xyXG5cclxuXHRcdGxldCBodWUsIHNhdHVyYXRpb247XHJcblx0XHRjb25zdCBsaWdodG5lc3MgPSAoIG1pbiArIG1heCApIC8gMi4wO1xyXG5cclxuXHRcdGlmICggbWluID09PSBtYXggKSB7XHJcblxyXG5cdFx0XHRodWUgPSAwO1xyXG5cdFx0XHRzYXR1cmF0aW9uID0gMDtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc3QgZGVsdGEgPSBtYXggLSBtaW47XHJcblxyXG5cdFx0XHRzYXR1cmF0aW9uID0gbGlnaHRuZXNzIDw9IDAuNSA/IGRlbHRhIC8gKCBtYXggKyBtaW4gKSA6IGRlbHRhIC8gKCAyIC0gbWF4IC0gbWluICk7XHJcblxyXG5cdFx0XHRzd2l0Y2ggKCBtYXggKSB7XHJcblxyXG5cdFx0XHRcdGNhc2UgcjogaHVlID0gKCBnIC0gYiApIC8gZGVsdGEgKyAoIGcgPCBiID8gNiA6IDAgKTsgYnJlYWs7XHJcblx0XHRcdFx0Y2FzZSBnOiBodWUgPSAoIGIgLSByICkgLyBkZWx0YSArIDI7IGJyZWFrO1xyXG5cdFx0XHRcdGNhc2UgYjogaHVlID0gKCByIC0gZyApIC8gZGVsdGEgKyA0OyBicmVhaztcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGh1ZSAvPSA2O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0YXJnZXQuaCA9IGh1ZTtcclxuXHRcdHRhcmdldC5zID0gc2F0dXJhdGlvbjtcclxuXHRcdHRhcmdldC5sID0gbGlnaHRuZXNzO1xyXG5cclxuXHRcdHJldHVybiB0YXJnZXQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgUkdCIHZhbHVlcyBvZiB0aGlzIGNvbG9yIGFuZCBzdG9yZXMgdGhlbSBpbnRvIHRoZSBnaXZlbiB0YXJnZXQgb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtDb2xvcn0gdGFyZ2V0IC0gVGhlIHRhcmdldCBjb2xvciB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGhvZCdzIHJlc3VsdC5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW2NvbG9yU3BhY2U9Q29sb3JNYW5hZ2VtZW50LndvcmtpbmdDb2xvclNwYWNlXSAtIFRoZSBjb2xvciBzcGFjZS5cclxuXHQgKiBAcmV0dXJuIHtDb2xvcn0gVGhlIFJHQiByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGNvbG9yLlxyXG5cdCAqL1xyXG5cdGdldFJHQiggdGFyZ2V0LCBjb2xvclNwYWNlID0gQ29sb3JNYW5hZ2VtZW50LndvcmtpbmdDb2xvclNwYWNlICkge1xyXG5cclxuXHRcdENvbG9yTWFuYWdlbWVudC5mcm9tV29ya2luZ0NvbG9yU3BhY2UoIF9jb2xvci5jb3B5KCB0aGlzICksIGNvbG9yU3BhY2UgKTtcclxuXHJcblx0XHR0YXJnZXQuciA9IF9jb2xvci5yO1xyXG5cdFx0dGFyZ2V0LmcgPSBfY29sb3IuZztcclxuXHRcdHRhcmdldC5iID0gX2NvbG9yLmI7XHJcblxyXG5cdFx0cmV0dXJuIHRhcmdldDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGlzIGNvbG9yIGFzIGEgQ1NTIHN0eWxlIHN0cmluZy4gRXhhbXBsZTogYHJnYigyNTUsMCwwKWAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW2NvbG9yU3BhY2U9U1JHQkNvbG9yU3BhY2VdIC0gVGhlIGNvbG9yIHNwYWNlLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIENTUyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGNvbG9yLlxyXG5cdCAqL1xyXG5cdGdldFN0eWxlKCBjb2xvclNwYWNlID0gU1JHQkNvbG9yU3BhY2UgKSB7XHJcblxyXG5cdFx0Q29sb3JNYW5hZ2VtZW50LmZyb21Xb3JraW5nQ29sb3JTcGFjZSggX2NvbG9yLmNvcHkoIHRoaXMgKSwgY29sb3JTcGFjZSApO1xyXG5cclxuXHRcdGNvbnN0IHIgPSBfY29sb3IuciwgZyA9IF9jb2xvci5nLCBiID0gX2NvbG9yLmI7XHJcblxyXG5cdFx0aWYgKCBjb2xvclNwYWNlICE9PSBTUkdCQ29sb3JTcGFjZSApIHtcclxuXHJcblx0XHRcdC8vIFJlcXVpcmVzIENTUyBDb2xvciBNb2R1bGUgTGV2ZWwgNCAoaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nzcy1jb2xvci00LykuXHJcblx0XHRcdHJldHVybiBgY29sb3IoJHsgY29sb3JTcGFjZSB9ICR7IHIudG9GaXhlZCggMyApIH0gJHsgZy50b0ZpeGVkKCAzICkgfSAkeyBiLnRvRml4ZWQoIDMgKSB9KWA7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBgcmdiKCR7IE1hdGgucm91bmQoIHIgKiAyNTUgKSB9LCR7IE1hdGgucm91bmQoIGcgKiAyNTUgKSB9LCR7IE1hdGgucm91bmQoIGIgKiAyNTUgKSB9KWA7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyB0aGUgZ2l2ZW4gSFNMIHZhbHVlcyB0byB0aGlzIGNvbG9yJ3MgdmFsdWVzLlxyXG5cdCAqIEludGVybmFsbHksIHRoaXMgY29udmVydHMgdGhlIGNvbG9yJ3MgUkdCIHZhbHVlcyB0byBIU0wsIGFkZHMgSFNMXHJcblx0ICogYW5kIHRoZW4gY29udmVydHMgdGhlIGNvbG9yIGJhY2sgdG8gUkdCLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGggLSBIdWUgdmFsdWUgYmV0d2VlbiBgMC4wYCBhbmQgYDEuMGAuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHMgLSBTYXR1cmF0aW9uIHZhbHVlIGJldHdlZW4gYDAuMGAgYW5kIGAxLjBgLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBsIC0gTGlnaHRuZXNzIHZhbHVlIGJldHdlZW4gYDAuMGAgYW5kIGAxLjBgLlxyXG5cdCAqIEByZXR1cm4ge0NvbG9yfSBBIHJlZmVyZW5jZSB0byB0aGlzIGNvbG9yLlxyXG5cdCAqL1xyXG5cdG9mZnNldEhTTCggaCwgcywgbCApIHtcclxuXHJcblx0XHR0aGlzLmdldEhTTCggX2hzbEEgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5zZXRIU0woIF9oc2xBLmggKyBoLCBfaHNsQS5zICsgcywgX2hzbEEubCArIGwgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIHRoZSBSR0IgdmFsdWVzIG9mIHRoZSBnaXZlbiBjb2xvciB0byB0aGUgUkdCIHZhbHVlcyBvZiB0aGlzIGNvbG9yLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtDb2xvcn0gY29sb3IgLSBUaGUgY29sb3IgdG8gYWRkLlxyXG5cdCAqIEByZXR1cm4ge0NvbG9yfSBBIHJlZmVyZW5jZSB0byB0aGlzIGNvbG9yLlxyXG5cdCAqL1xyXG5cdGFkZCggY29sb3IgKSB7XHJcblxyXG5cdFx0dGhpcy5yICs9IGNvbG9yLnI7XHJcblx0XHR0aGlzLmcgKz0gY29sb3IuZztcclxuXHRcdHRoaXMuYiArPSBjb2xvci5iO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgdGhlIFJHQiB2YWx1ZXMgb2YgdGhlIGdpdmVuIGNvbG9ycyBhbmQgc3RvcmVzIHRoZSByZXN1bHQgaW4gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Q29sb3J9IGNvbG9yMSAtIFRoZSBmaXJzdCBjb2xvci5cclxuXHQgKiBAcGFyYW0ge0NvbG9yfSBjb2xvcjIgLSBUaGUgc2Vjb25kIGNvbG9yLlxyXG5cdCAqIEByZXR1cm4ge0NvbG9yfSBBIHJlZmVyZW5jZSB0byB0aGlzIGNvbG9yLlxyXG5cdCAqL1xyXG5cdGFkZENvbG9ycyggY29sb3IxLCBjb2xvcjIgKSB7XHJcblxyXG5cdFx0dGhpcy5yID0gY29sb3IxLnIgKyBjb2xvcjIucjtcclxuXHRcdHRoaXMuZyA9IGNvbG9yMS5nICsgY29sb3IyLmc7XHJcblx0XHR0aGlzLmIgPSBjb2xvcjEuYiArIGNvbG9yMi5iO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgdGhlIGdpdmVuIHNjYWxhciB2YWx1ZSB0byB0aGUgUkdCIHZhbHVlcyBvZiB0aGlzIGNvbG9yLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHMgLSBUaGUgc2NhbGFyIHRvIGFkZC5cclxuXHQgKiBAcmV0dXJuIHtDb2xvcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBjb2xvci5cclxuXHQgKi9cclxuXHRhZGRTY2FsYXIoIHMgKSB7XHJcblxyXG5cdFx0dGhpcy5yICs9IHM7XHJcblx0XHR0aGlzLmcgKz0gcztcclxuXHRcdHRoaXMuYiArPSBzO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFN1YnRyYWN0cyB0aGUgUkdCIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gY29sb3IgZnJvbSB0aGUgUkdCIHZhbHVlcyBvZiB0aGlzIGNvbG9yLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtDb2xvcn0gY29sb3IgLSBUaGUgY29sb3IgdG8gc3VidHJhY3QuXHJcblx0ICogQHJldHVybiB7Q29sb3J9IEEgcmVmZXJlbmNlIHRvIHRoaXMgY29sb3IuXHJcblx0ICovXHJcblx0c3ViKCBjb2xvciApIHtcclxuXHJcblx0XHR0aGlzLnIgPSBNYXRoLm1heCggMCwgdGhpcy5yIC0gY29sb3IuciApO1xyXG5cdFx0dGhpcy5nID0gTWF0aC5tYXgoIDAsIHRoaXMuZyAtIGNvbG9yLmcgKTtcclxuXHRcdHRoaXMuYiA9IE1hdGgubWF4KCAwLCB0aGlzLmIgLSBjb2xvci5iICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTXVsdGlwbGllcyB0aGUgUkdCIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gY29sb3Igd2l0aCB0aGUgUkdCIHZhbHVlcyBvZiB0aGlzIGNvbG9yLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtDb2xvcn0gY29sb3IgLSBUaGUgY29sb3IgdG8gbXVsdGlwbHkuXHJcblx0ICogQHJldHVybiB7Q29sb3J9IEEgcmVmZXJlbmNlIHRvIHRoaXMgY29sb3IuXHJcblx0ICovXHJcblx0bXVsdGlwbHkoIGNvbG9yICkge1xyXG5cclxuXHRcdHRoaXMuciAqPSBjb2xvci5yO1xyXG5cdFx0dGhpcy5nICo9IGNvbG9yLmc7XHJcblx0XHR0aGlzLmIgKj0gY29sb3IuYjtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBNdWx0aXBsaWVzIHRoZSBnaXZlbiBzY2FsYXIgdmFsdWUgd2l0aCB0aGUgUkdCIHZhbHVlcyBvZiB0aGlzIGNvbG9yLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHMgLSBUaGUgc2NhbGFyIHRvIG11bHRpcGx5LlxyXG5cdCAqIEByZXR1cm4ge0NvbG9yfSBBIHJlZmVyZW5jZSB0byB0aGlzIGNvbG9yLlxyXG5cdCAqL1xyXG5cdG11bHRpcGx5U2NhbGFyKCBzICkge1xyXG5cclxuXHRcdHRoaXMuciAqPSBzO1xyXG5cdFx0dGhpcy5nICo9IHM7XHJcblx0XHR0aGlzLmIgKj0gcztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBMaW5lYXJseSBpbnRlcnBvbGF0ZXMgdGhpcyBjb2xvcidzIFJHQiB2YWx1ZXMgdG93YXJkIHRoZSBSR0IgdmFsdWVzIG9mIHRoZVxyXG5cdCAqIGdpdmVuIGNvbG9yLiBUaGUgYWxwaGEgYXJndW1lbnQgY2FuIGJlIHRob3VnaHQgb2YgYXMgdGhlIHJhdGlvIGJldHdlZW5cclxuXHQgKiB0aGUgdHdvIGNvbG9ycywgd2hlcmUgYDAuMGAgaXMgdGhpcyBjb2xvciBhbmQgYDEuMGAgaXMgdGhlIGZpcnN0IGFyZ3VtZW50LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtDb2xvcn0gY29sb3IgLSBUaGUgY29sb3IgdG8gY29udmVyZ2Ugb24uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFscGhhIC0gVGhlIGludGVycG9sYXRpb24gZmFjdG9yIGluIHRoZSBjbG9zZWQgaW50ZXJ2YWwgYFswLDFdYC5cclxuXHQgKiBAcmV0dXJuIHtDb2xvcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBjb2xvci5cclxuXHQgKi9cclxuXHRsZXJwKCBjb2xvciwgYWxwaGEgKSB7XHJcblxyXG5cdFx0dGhpcy5yICs9ICggY29sb3IuciAtIHRoaXMuciApICogYWxwaGE7XHJcblx0XHR0aGlzLmcgKz0gKCBjb2xvci5nIC0gdGhpcy5nICkgKiBhbHBoYTtcclxuXHRcdHRoaXMuYiArPSAoIGNvbG9yLmIgLSB0aGlzLmIgKSAqIGFscGhhO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIExpbmVhcmx5IGludGVycG9sYXRlcyBiZXR3ZWVuIHRoZSBnaXZlbiBjb2xvcnMgYW5kIHN0b3JlcyB0aGUgcmVzdWx0IGluIHRoaXMgaW5zdGFuY2UuXHJcblx0ICogVGhlIGFscGhhIGFyZ3VtZW50IGNhbiBiZSB0aG91Z2h0IG9mIGFzIHRoZSByYXRpbyBiZXR3ZWVuIHRoZSB0d28gY29sb3JzLCB3aGVyZSBgMC4wYFxyXG5cdCAqIGlzIHRoZSBmaXJzdCBhbmQgYDEuMGAgaXMgdGhlIHNlY29uZCBjb2xvci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Q29sb3J9IGNvbG9yMSAtIFRoZSBmaXJzdCBjb2xvci5cclxuXHQgKiBAcGFyYW0ge0NvbG9yfSBjb2xvcjIgLSBUaGUgc2Vjb25kIGNvbG9yLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhbHBoYSAtIFRoZSBpbnRlcnBvbGF0aW9uIGZhY3RvciBpbiB0aGUgY2xvc2VkIGludGVydmFsIGBbMCwxXWAuXHJcblx0ICogQHJldHVybiB7Q29sb3J9IEEgcmVmZXJlbmNlIHRvIHRoaXMgY29sb3IuXHJcblx0ICovXHJcblx0bGVycENvbG9ycyggY29sb3IxLCBjb2xvcjIsIGFscGhhICkge1xyXG5cclxuXHRcdHRoaXMuciA9IGNvbG9yMS5yICsgKCBjb2xvcjIuciAtIGNvbG9yMS5yICkgKiBhbHBoYTtcclxuXHRcdHRoaXMuZyA9IGNvbG9yMS5nICsgKCBjb2xvcjIuZyAtIGNvbG9yMS5nICkgKiBhbHBoYTtcclxuXHRcdHRoaXMuYiA9IGNvbG9yMS5iICsgKCBjb2xvcjIuYiAtIGNvbG9yMS5iICkgKiBhbHBoYTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBMaW5lYXJseSBpbnRlcnBvbGF0ZXMgdGhpcyBjb2xvcidzIEhTTCB2YWx1ZXMgdG93YXJkIHRoZSBIU0wgdmFsdWVzIG9mIHRoZVxyXG5cdCAqIGdpdmVuIGNvbG9yLiBJdCBkaWZmZXJzIGZyb20ge0BsaW5rIENvbG9yI2xlcnB9IGJ5IG5vdCBpbnRlcnBvbGF0aW5nIHN0cmFpZ2h0XHJcblx0ICogZnJvbSBvbmUgY29sb3IgdG8gdGhlIG90aGVyLCBidXQgaW5zdGVhZCBnb2luZyB0aHJvdWdoIGFsbCB0aGUgaHVlcyBpbiBiZXR3ZWVuXHJcblx0ICogdGhvc2UgdHdvIGNvbG9ycy4gVGhlIGFscGhhIGFyZ3VtZW50IGNhbiBiZSB0aG91Z2h0IG9mIGFzIHRoZSByYXRpbyBiZXR3ZWVuXHJcblx0ICogdGhlIHR3byBjb2xvcnMsIHdoZXJlIDAuMCBpcyB0aGlzIGNvbG9yIGFuZCAxLjAgaXMgdGhlIGZpcnN0IGFyZ3VtZW50LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtDb2xvcn0gY29sb3IgLSBUaGUgY29sb3IgdG8gY29udmVyZ2Ugb24uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFscGhhIC0gVGhlIGludGVycG9sYXRpb24gZmFjdG9yIGluIHRoZSBjbG9zZWQgaW50ZXJ2YWwgYFswLDFdYC5cclxuXHQgKiBAcmV0dXJuIHtDb2xvcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBjb2xvci5cclxuXHQgKi9cclxuXHRsZXJwSFNMKCBjb2xvciwgYWxwaGEgKSB7XHJcblxyXG5cdFx0dGhpcy5nZXRIU0woIF9oc2xBICk7XHJcblx0XHRjb2xvci5nZXRIU0woIF9oc2xCICk7XHJcblxyXG5cdFx0Y29uc3QgaCA9IGxlcnAoIF9oc2xBLmgsIF9oc2xCLmgsIGFscGhhICk7XHJcblx0XHRjb25zdCBzID0gbGVycCggX2hzbEEucywgX2hzbEIucywgYWxwaGEgKTtcclxuXHRcdGNvbnN0IGwgPSBsZXJwKCBfaHNsQS5sLCBfaHNsQi5sLCBhbHBoYSApO1xyXG5cclxuXHRcdHRoaXMuc2V0SFNMKCBoLCBzLCBsICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgY29sb3IncyBSR0IgY29tcG9uZW50cyBmcm9tIHRoZSBnaXZlbiAzRCB2ZWN0b3IuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHYgLSBUaGUgdmVjdG9yIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtDb2xvcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBjb2xvci5cclxuXHQgKi9cclxuXHRzZXRGcm9tVmVjdG9yMyggdiApIHtcclxuXHJcblx0XHR0aGlzLnIgPSB2Lng7XHJcblx0XHR0aGlzLmcgPSB2Lnk7XHJcblx0XHR0aGlzLmIgPSB2Lno7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVHJhbnNmb3JtcyB0aGlzIGNvbG9yIHdpdGggdGhlIGdpdmVuIDN4MyBtYXRyaXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDN9IG0gLSBUaGUgbWF0cml4LlxyXG5cdCAqIEByZXR1cm4ge0NvbG9yfSBBIHJlZmVyZW5jZSB0byB0aGlzIGNvbG9yLlxyXG5cdCAqL1xyXG5cdGFwcGx5TWF0cml4MyggbSApIHtcclxuXHJcblx0XHRjb25zdCByID0gdGhpcy5yLCBnID0gdGhpcy5nLCBiID0gdGhpcy5iO1xyXG5cdFx0Y29uc3QgZSA9IG0uZWxlbWVudHM7XHJcblxyXG5cdFx0dGhpcy5yID0gZVsgMCBdICogciArIGVbIDMgXSAqIGcgKyBlWyA2IF0gKiBiO1xyXG5cdFx0dGhpcy5nID0gZVsgMSBdICogciArIGVbIDQgXSAqIGcgKyBlWyA3IF0gKiBiO1xyXG5cdFx0dGhpcy5iID0gZVsgMiBdICogciArIGVbIDUgXSAqIGcgKyBlWyA4IF0gKiBiO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgY29sb3IgaXMgZXF1YWwgd2l0aCB0aGUgZ2l2ZW4gb25lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtDb2xvcn0gYyAtIFRoZSBjb2xvciB0byB0ZXN0IGZvciBlcXVhbGl0eS5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoaXMgYm91bmRpbmcgY29sb3IgaXMgZXF1YWwgd2l0aCB0aGUgZ2l2ZW4gb25lLlxyXG5cdCAqL1xyXG5cdGVxdWFscyggYyApIHtcclxuXHJcblx0XHRyZXR1cm4gKCBjLnIgPT09IHRoaXMuciApICYmICggYy5nID09PSB0aGlzLmcgKSAmJiAoIGMuYiA9PT0gdGhpcy5iICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGlzIGNvbG9yJ3MgUkdCIGNvbXBvbmVudHMgZnJvbSB0aGUgZ2l2ZW4gYXJyYXkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IGFycmF5IC0gQW4gYXJyYXkgaG9sZGluZyB0aGUgUkdCIHZhbHVlcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW29mZnNldD0wXSAtIFRoZSBvZmZzZXQgaW50byB0aGUgYXJyYXkuXHJcblx0ICogQHJldHVybiB7Q29sb3J9IEEgcmVmZXJlbmNlIHRvIHRoaXMgY29sb3IuXHJcblx0ICovXHJcblx0ZnJvbUFycmF5KCBhcnJheSwgb2Zmc2V0ID0gMCApIHtcclxuXHJcblx0XHR0aGlzLnIgPSBhcnJheVsgb2Zmc2V0IF07XHJcblx0XHR0aGlzLmcgPSBhcnJheVsgb2Zmc2V0ICsgMSBdO1xyXG5cdFx0dGhpcy5iID0gYXJyYXlbIG9mZnNldCArIDIgXTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBXcml0ZXMgdGhlIFJHQiBjb21wb25lbnRzIG9mIHRoaXMgY29sb3IgdG8gdGhlIGdpdmVuIGFycmF5LiBJZiBubyBhcnJheSBpcyBwcm92aWRlZCxcclxuXHQgKiB0aGUgbWV0aG9kIHJldHVybnMgYSBuZXcgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IFthcnJheT1bXV0gLSBUaGUgdGFyZ2V0IGFycmF5IGhvbGRpbmcgdGhlIGNvbG9yIGNvbXBvbmVudHMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXQ9MF0gLSBJbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgYXJyYXkuXHJcblx0ICogQHJldHVybiB7QXJyYXk8bnVtYmVyPn0gVGhlIGNvbG9yIGNvbXBvbmVudHMuXHJcblx0ICovXHJcblx0dG9BcnJheSggYXJyYXkgPSBbXSwgb2Zmc2V0ID0gMCApIHtcclxuXHJcblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0aGlzLnI7XHJcblx0XHRhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGhpcy5nO1xyXG5cdFx0YXJyYXlbIG9mZnNldCArIDIgXSA9IHRoaXMuYjtcclxuXHJcblx0XHRyZXR1cm4gYXJyYXk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgY29tcG9uZW50cyBvZiB0aGlzIGNvbG9yIGZyb20gdGhlIGdpdmVuIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0J1ZmZlckF0dHJpYnV0ZX0gYXR0cmlidXRlIC0gVGhlIGJ1ZmZlciBhdHRyaWJ1dGUgaG9sZGluZyBjb2xvciBkYXRhLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBpbnRvIHRoZSBhdHRyaWJ1dGUuXHJcblx0ICogQHJldHVybiB7Q29sb3J9IEEgcmVmZXJlbmNlIHRvIHRoaXMgY29sb3IuXHJcblx0ICovXHJcblx0ZnJvbUJ1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlLCBpbmRleCApIHtcclxuXHJcblx0XHR0aGlzLnIgPSBhdHRyaWJ1dGUuZ2V0WCggaW5kZXggKTtcclxuXHRcdHRoaXMuZyA9IGF0dHJpYnV0ZS5nZXRZKCBpbmRleCApO1xyXG5cdFx0dGhpcy5iID0gYXR0cmlidXRlLmdldFooIGluZGV4ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2RzIGRlZmluZXMgdGhlIHNlcmlhbGl6YXRpb24gcmVzdWx0IG9mIHRoaXMgY2xhc3MuIFJldHVybnMgdGhlIGNvbG9yXHJcblx0ICogYXMgYSBoZXhhZGVjaW1hbCB2YWx1ZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGhleGFkZWNpbWFsIHZhbHVlLlxyXG5cdCAqL1xyXG5cdHRvSlNPTigpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5nZXRIZXgoKTtcclxuXHJcblx0fVxyXG5cclxuXHQqWyBTeW1ib2wuaXRlcmF0b3IgXSgpIHtcclxuXHJcblx0XHR5aWVsZCB0aGlzLnI7XHJcblx0XHR5aWVsZCB0aGlzLmc7XHJcblx0XHR5aWVsZCB0aGlzLmI7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmNvbnN0IF9jb2xvciA9IC8qQF9fUFVSRV9fKi8gbmV3IENvbG9yKCk7XHJcblxyXG4vKipcclxuICogQSBkaWN0aW9uYXJ5IHdpdGggWDExIGNvbG9yIG5hbWVzLlxyXG4gKlxyXG4gKiBOb3RlIHRoYXQgbXVsdGlwbGUgd29yZHMgc3VjaCBhcyBEYXJrIE9yYW5nZSBiZWNvbWUgdGhlIHN0cmluZyAnZGFya29yYW5nZScuXHJcbiAqXHJcbiAqIEBzdGF0aWNcclxuICogQHR5cGUge09iamVjdH1cclxuICovXHJcbkNvbG9yLk5BTUVTID0gX2NvbG9yS2V5d29yZHM7XHJcblxyXG5leHBvcnQgeyBDb2xvciB9O1xyXG4iLCJpbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uL21hdGgvQ29sb3IuanMnO1xyXG5pbXBvcnQgeyBFdmVudERpc3BhdGNoZXIgfSBmcm9tICcuLi9jb3JlL0V2ZW50RGlzcGF0Y2hlci5qcyc7XHJcbmltcG9ydCB7IEZyb250U2lkZSwgTm9ybWFsQmxlbmRpbmcsIExlc3NFcXVhbERlcHRoLCBBZGRFcXVhdGlvbiwgT25lTWludXNTcmNBbHBoYUZhY3RvciwgU3JjQWxwaGFGYWN0b3IsIEFsd2F5c1N0ZW5jaWxGdW5jLCBLZWVwU3RlbmNpbE9wIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgZ2VuZXJhdGVVVUlEIH0gZnJvbSAnLi4vbWF0aC9NYXRoVXRpbHMuanMnO1xyXG5cclxubGV0IF9tYXRlcmlhbElkID0gMDtcclxuXHJcbi8qKlxyXG4gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBtYXRlcmlhbHMuXHJcbiAqXHJcbiAqIE1hdGVyaWFscyBkZWZpbmUgdGhlIGFwcGVhcmFuY2Ugb2YgcmVuZGVyYWJsZSAzRCBvYmplY3RzLlxyXG4gKlxyXG4gKiBAYWJzdHJhY3RcclxuICogQGF1Z21lbnRzIEV2ZW50RGlzcGF0Y2hlclxyXG4gKi9cclxuY2xhc3MgTWF0ZXJpYWwgZXh0ZW5kcyBFdmVudERpc3BhdGNoZXIge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG1hdGVyaWFsLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzTWF0ZXJpYWwgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIElEIG9mIHRoZSBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAbmFtZSBNYXRlcmlhbCNpZFxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICovXHJcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsICdpZCcsIHsgdmFsdWU6IF9tYXRlcmlhbElkICsrIH0gKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBVVUlEIG9mIHRoZSBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXVpZCA9IGdlbmVyYXRlVVVJRCgpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG5hbWUgb2YgdGhlIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubmFtZSA9ICcnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHR5cGUgcHJvcGVydHkgaXMgdXNlZCBmb3IgZGV0ZWN0aW5nIHRoZSBvYmplY3QgdHlwZVxyXG5cdFx0ICogaW4gY29udGV4dCBvZiBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudHlwZSA9ICdNYXRlcmlhbCc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIHRoZSBibGVuZGluZyB0eXBlIG9mIHRoZSBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBJdCBtdXN0IGJlIHNldCB0byBgQ3VzdG9tQmxlbmRpbmdgIGlmIGN1c3RvbSBibGVuZGluZyBwcm9wZXJ0aWVzIGxpa2VcclxuXHRcdCAqIHtAbGluayBNYXRlcmlhbCNibGVuZFNyY30sIHtAbGluayBNYXRlcmlhbCNibGVuZERzdH0gb3Ige0BsaW5rIE1hdGVyaWFsI2JsZW5kRXF1YXRpb259XHJcblx0XHQgKiBzaG91bGQgaGF2ZSBhbnkgZWZmZWN0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoTm9CbGVuZGluZ3xOb3JtYWxCbGVuZGluZ3xBZGRpdGl2ZUJsZW5kaW5nfFN1YnRyYWN0aXZlQmxlbmRpbmd8TXVsdGlwbHlCbGVuZGluZ3xDdXN0b21CbGVuZGluZyl9XHJcblx0XHQgKiBAZGVmYXVsdCBOb3JtYWxCbGVuZGluZ1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJsZW5kaW5nID0gTm9ybWFsQmxlbmRpbmc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIHdoaWNoIHNpZGUgb2YgZmFjZXMgd2lsbCBiZSByZW5kZXJlZCAtIGZyb250LCBiYWNrIG9yIGJvdGguXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeyhGcm9udFNpZGV8QmFja1NpZGV8RG91YmxlU2lkZSl9XHJcblx0XHQgKiBAZGVmYXVsdCBGcm9udFNpZGVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zaWRlID0gRnJvbnRTaWRlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSWYgc2V0IHRvIGB0cnVlYCwgdmVydGV4IGNvbG9ycyBzaG91bGQgYmUgdXNlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBUaGUgZW5naW5lIHN1cHBvcnRzIFJHQiBhbmQgUkdCQSB2ZXJ0ZXggY29sb3JzIGRlcGVuZGluZyBvbiB3aGV0aGVyIGEgdGhyZWUgKFJHQikgb3JcclxuXHRcdCAqIGZvdXIgKFJHQkEpIGNvbXBvbmVudCBjb2xvciBidWZmZXIgYXR0cmlidXRlIGlzIHVzZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnZlcnRleENvbG9ycyA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyBob3cgdHJhbnNwYXJlbnQgdGhlIG1hdGVyaWFsIGlzLlxyXG5cdFx0ICogQSB2YWx1ZSBvZiBgMC4wYCBpbmRpY2F0ZXMgZnVsbHkgdHJhbnNwYXJlbnQsIGAxLjBgIGlzIGZ1bGx5IG9wYXF1ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBJZiB0aGUge0BsaW5rIE1hdGVyaWFsI3RyYW5zcGFyZW50fSBpcyBub3Qgc2V0IHRvIGB0cnVlYCxcclxuXHRcdCAqIHRoZSBtYXRlcmlhbCB3aWxsIHJlbWFpbiBmdWxseSBvcGFxdWUgYW5kIHRoaXMgdmFsdWUgd2lsbCBvbmx5IGFmZmVjdCBpdHMgY29sb3IuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5vcGFjaXR5ID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgd2hldGhlciB0aGlzIG1hdGVyaWFsIGlzIHRyYW5zcGFyZW50LiBUaGlzIGhhcyBhbiBlZmZlY3Qgb25cclxuXHRcdCAqIHJlbmRlcmluZyBhcyB0cmFuc3BhcmVudCBvYmplY3RzIG5lZWQgc3BlY2lhbCB0cmVhdG1lbnQgYW5kIGFyZSByZW5kZXJlZFxyXG5cdFx0ICogYWZ0ZXIgbm9uLXRyYW5zcGFyZW50IG9iamVjdHMuXHJcblx0XHQgKlxyXG5cdFx0ICogV2hlbiBzZXQgdG8gdHJ1ZSwgdGhlIGV4dGVudCB0byB3aGljaCB0aGUgbWF0ZXJpYWwgaXMgdHJhbnNwYXJlbnQgaXNcclxuXHRcdCAqIGNvbnRyb2xsZWQgYnkge0BsaW5rIE1hdGVyaWFsI29wYWNpdHl9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50cmFuc3BhcmVudCA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRW5hYmxlcyBhbHBoYSBoYXNoZWQgdHJhbnNwYXJlbmN5LCBhbiBhbHRlcm5hdGl2ZSB0byB7QGxpbmsgTWF0ZXJpYWwjdHJhbnNwYXJlbnR9IG9yXHJcblx0XHQgKiB7QGxpbmsgTWF0ZXJpYWwjYWxwaGFUZXN0fS4gVGhlIG1hdGVyaWFsIHdpbGwgbm90IGJlIHJlbmRlcmVkIGlmIG9wYWNpdHkgaXMgbG93ZXIgdGhhblxyXG5cdFx0ICogYSByYW5kb20gdGhyZXNob2xkLiBSYW5kb21pemF0aW9uIGludHJvZHVjZXMgc29tZSBncmFpbiBvciBub2lzZSwgYnV0IGFwcHJveGltYXRlcyBhbHBoYVxyXG5cdFx0ICogYmxlbmRpbmcgd2l0aG91dCB0aGUgYXNzb2NpYXRlZCBwcm9ibGVtcyBvZiBzb3J0aW5nLiBVc2luZyBUQUEgY2FuIHJlZHVjZSB0aGUgcmVzdWx0aW5nIG5vaXNlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hbHBoYUhhc2ggPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgdGhlIGJsZW5kaW5nIHNvdXJjZSBmYWN0b3IuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeyhaZXJvRmFjdG9yfE9uZUZhY3RvcnxTcmNDb2xvckZhY3RvcnxPbmVNaW51c1NyY0NvbG9yRmFjdG9yfFNyY0FscGhhRmFjdG9yfE9uZU1pbnVzU3JjQWxwaGFGYWN0b3J8RHN0QWxwaGFGYWN0b3J8T25lTWludXNEc3RBbHBoYUZhY3RvcnxEc3RDb2xvckZhY3RvcnxPbmVNaW51c0RzdENvbG9yRmFjdG9yfFNyY0FscGhhU2F0dXJhdGVGYWN0b3J8Q29uc3RhbnRDb2xvckZhY3RvcnxPbmVNaW51c0NvbnN0YW50Q29sb3JGYWN0b3J8Q29uc3RhbnRBbHBoYUZhY3RvcnxPbmVNaW51c0NvbnN0YW50QWxwaGFGYWN0b3IpfVxyXG5cdFx0ICogQGRlZmF1bHQgU3JjQWxwaGFGYWN0b3JcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ibGVuZFNyYyA9IFNyY0FscGhhRmFjdG9yO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyB0aGUgYmxlbmRpbmcgZGVzdGluYXRpb24gZmFjdG9yLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoWmVyb0ZhY3RvcnxPbmVGYWN0b3J8U3JjQ29sb3JGYWN0b3J8T25lTWludXNTcmNDb2xvckZhY3RvcnxTcmNBbHBoYUZhY3RvcnxPbmVNaW51c1NyY0FscGhhRmFjdG9yfERzdEFscGhhRmFjdG9yfE9uZU1pbnVzRHN0QWxwaGFGYWN0b3J8RHN0Q29sb3JGYWN0b3J8T25lTWludXNEc3RDb2xvckZhY3RvcnxTcmNBbHBoYVNhdHVyYXRlRmFjdG9yfENvbnN0YW50Q29sb3JGYWN0b3J8T25lTWludXNDb25zdGFudENvbG9yRmFjdG9yfENvbnN0YW50QWxwaGFGYWN0b3J8T25lTWludXNDb25zdGFudEFscGhhRmFjdG9yKX1cclxuXHRcdCAqIEBkZWZhdWx0IE9uZU1pbnVzU3JjQWxwaGFGYWN0b3JcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ibGVuZERzdCA9IE9uZU1pbnVzU3JjQWxwaGFGYWN0b3I7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIHRoZSBibGVuZGluZyBlcXVhdGlvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KEFkZEVxdWF0aW9ufFN1YnRyYWN0RXF1YXRpb258UmV2ZXJzZVN1YnRyYWN0RXF1YXRpb258TWluRXF1YXRpb258TWF4RXF1YXRpb24pfVxyXG5cdFx0ICogQGRlZmF1bHQgQWRkRXF1YXRpb25cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ibGVuZEVxdWF0aW9uID0gQWRkRXF1YXRpb247XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIHRoZSBibGVuZGluZyBzb3VyY2UgYWxwaGEgZmFjdG9yLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/KFplcm9GYWN0b3J8T25lRmFjdG9yfFNyY0NvbG9yRmFjdG9yfE9uZU1pbnVzU3JjQ29sb3JGYWN0b3J8U3JjQWxwaGFGYWN0b3J8T25lTWludXNTcmNBbHBoYUZhY3RvcnxEc3RBbHBoYUZhY3RvcnxPbmVNaW51c0RzdEFscGhhRmFjdG9yfERzdENvbG9yRmFjdG9yfE9uZU1pbnVzRHN0Q29sb3JGYWN0b3J8U3JjQWxwaGFTYXR1cmF0ZUZhY3RvcnxDb25zdGFudENvbG9yRmFjdG9yfE9uZU1pbnVzQ29uc3RhbnRDb2xvckZhY3RvcnxDb25zdGFudEFscGhhRmFjdG9yfE9uZU1pbnVzQ29uc3RhbnRBbHBoYUZhY3Rvcil9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYmxlbmRTcmNBbHBoYSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIHRoZSBibGVuZGluZyBkZXN0aW5hdGlvbiBhbHBoYSBmYWN0b3IuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez8oWmVyb0ZhY3RvcnxPbmVGYWN0b3J8U3JjQ29sb3JGYWN0b3J8T25lTWludXNTcmNDb2xvckZhY3RvcnxTcmNBbHBoYUZhY3RvcnxPbmVNaW51c1NyY0FscGhhRmFjdG9yfERzdEFscGhhRmFjdG9yfE9uZU1pbnVzRHN0QWxwaGFGYWN0b3J8RHN0Q29sb3JGYWN0b3J8T25lTWludXNEc3RDb2xvckZhY3RvcnxTcmNBbHBoYVNhdHVyYXRlRmFjdG9yfENvbnN0YW50Q29sb3JGYWN0b3J8T25lTWludXNDb25zdGFudENvbG9yRmFjdG9yfENvbnN0YW50QWxwaGFGYWN0b3J8T25lTWludXNDb25zdGFudEFscGhhRmFjdG9yKX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ibGVuZERzdEFscGhhID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgdGhlIGJsZW5kaW5nIGVxdWF0aW9uIG9mIHRoZSBhbHBoYSBjaGFubmVsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/KEFkZEVxdWF0aW9ufFN1YnRyYWN0RXF1YXRpb258UmV2ZXJzZVN1YnRyYWN0RXF1YXRpb258TWluRXF1YXRpb258TWF4RXF1YXRpb24pfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJsZW5kRXF1YXRpb25BbHBoYSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXByZXNlbnRzIHRoZSBSR0IgdmFsdWVzIG9mIHRoZSBjb25zdGFudCBibGVuZCBjb2xvci5cclxuXHRcdCAqXHJcblx0XHQgKiBUaGlzIHByb3BlcnR5IGhhcyBvbmx5IGFuIGVmZmVjdCB3aGVuIHVzaW5nIGN1c3RvbSBibGVuZGluZyB3aXRoIGBDb25zdGFudENvbG9yYCBvciBgT25lTWludXNDb25zdGFudENvbG9yYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Q29sb3J9XHJcblx0XHQgKiBAZGVmYXVsdCAoMCwwLDApXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYmxlbmRDb2xvciA9IG5ldyBDb2xvciggMCwgMCwgMCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVwcmVzZW50cyB0aGUgYWxwaGEgdmFsdWUgb2YgdGhlIGNvbnN0YW50IGJsZW5kIGNvbG9yLlxyXG5cdFx0ICpcclxuXHRcdCAqIFRoaXMgcHJvcGVydHkgaGFzIG9ubHkgYW4gZWZmZWN0IHdoZW4gdXNpbmcgY3VzdG9tIGJsZW5kaW5nIHdpdGggYENvbnN0YW50QWxwaGFgIG9yIGBPbmVNaW51c0NvbnN0YW50QWxwaGFgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYmxlbmRBbHBoYSA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIHRoZSBkZXB0aCBmdW5jdGlvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KE5ldmVyRGVwdGh8QWx3YXlzRGVwdGh8TGVzc0RlcHRofExlc3NFcXVhbERlcHRofEVxdWFsRGVwdGh8R3JlYXRlckVxdWFsRGVwdGh8R3JlYXRlckRlcHRofE5vdEVxdWFsRGVwdGgpfVxyXG5cdFx0ICogQGRlZmF1bHQgTGVzc0VxdWFsRGVwdGhcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kZXB0aEZ1bmMgPSBMZXNzRXF1YWxEZXB0aDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdG8gaGF2ZSBkZXB0aCB0ZXN0IGVuYWJsZWQgd2hlbiByZW5kZXJpbmcgdGhpcyBtYXRlcmlhbC5cclxuXHRcdCAqIFdoZW4gdGhlIGRlcHRoIHRlc3QgaXMgZGlzYWJsZWQsIHRoZSBkZXB0aCB3cml0ZSB3aWxsIGFsc28gYmUgaW1wbGljaXRseSBkaXNhYmxlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kZXB0aFRlc3QgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciByZW5kZXJpbmcgdGhpcyBtYXRlcmlhbCBoYXMgYW55IGVmZmVjdCBvbiB0aGUgZGVwdGggYnVmZmVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIFdoZW4gZHJhd2luZyAyRCBvdmVybGF5cyBpdCBjYW4gYmUgdXNlZnVsIHRvIGRpc2FibGUgdGhlIGRlcHRoIHdyaXRpbmcgaW5cclxuXHRcdCAqIG9yZGVyIHRvIGxheWVyIHNldmVyYWwgdGhpbmdzIHRvZ2V0aGVyIHdpdGhvdXQgY3JlYXRpbmcgei1pbmRleCBhcnRpZmFjdHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGVwdGhXcml0ZSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYml0IG1hc2sgdG8gdXNlIHdoZW4gd3JpdGluZyB0byB0aGUgc3RlbmNpbCBidWZmZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDB4ZmZcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zdGVuY2lsV3JpdGVNYXNrID0gMHhmZjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBzdGVuY2lsIGNvbXBhcmlzb24gZnVuY3Rpb24gdG8gdXNlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOZXZlclN0ZW5jaWxGdW5jfExlc3NTdGVuY2lsRnVuY3xFcXVhbFN0ZW5jaWxGdW5jfExlc3NFcXVhbFN0ZW5jaWxGdW5jfEdyZWF0ZXJTdGVuY2lsRnVuY3xOb3RFcXVhbFN0ZW5jaWxGdW5jfEdyZWF0ZXJFcXVhbFN0ZW5jaWxGdW5jfEFsd2F5c1N0ZW5jaWxGdW5jfVxyXG5cdFx0ICogQGRlZmF1bHQgQWx3YXlzU3RlbmNpbEZ1bmNcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zdGVuY2lsRnVuYyA9IEFsd2F5c1N0ZW5jaWxGdW5jO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHZhbHVlIHRvIHVzZSB3aGVuIHBlcmZvcm1pbmcgc3RlbmNpbCBjb21wYXJpc29ucyBvciBzdGVuY2lsIG9wZXJhdGlvbnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zdGVuY2lsUmVmID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBiaXQgbWFzayB0byB1c2Ugd2hlbiBjb21wYXJpbmcgYWdhaW5zdCB0aGUgc3RlbmNpbCBidWZmZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDB4ZmZcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zdGVuY2lsRnVuY01hc2sgPSAweGZmO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hpY2ggc3RlbmNpbCBvcGVyYXRpb24gdG8gcGVyZm9ybSB3aGVuIHRoZSBjb21wYXJpc29uIGZ1bmN0aW9uIHJldHVybnMgYGZhbHNlYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7WmVyb1N0ZW5jaWxPcHxLZWVwU3RlbmNpbE9wfFJlcGxhY2VTdGVuY2lsT3B8SW5jcmVtZW50U3RlbmNpbE9wfERlY3JlbWVudFN0ZW5jaWxPcHxJbmNyZW1lbnRXcmFwU3RlbmNpbE9wfERlY3JlbWVudFdyYXBTdGVuY2lsT3B8SW52ZXJ0U3RlbmNpbE9wfVxyXG5cdFx0ICogQGRlZmF1bHQgS2VlcFN0ZW5jaWxPcFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnN0ZW5jaWxGYWlsID0gS2VlcFN0ZW5jaWxPcDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoaWNoIHN0ZW5jaWwgb3BlcmF0aW9uIHRvIHBlcmZvcm0gd2hlbiB0aGUgY29tcGFyaXNvbiBmdW5jdGlvbiByZXR1cm5zXHJcblx0XHQgKiBgdHJ1ZWAgYnV0IHRoZSBkZXB0aCB0ZXN0IGZhaWxzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtaZXJvU3RlbmNpbE9wfEtlZXBTdGVuY2lsT3B8UmVwbGFjZVN0ZW5jaWxPcHxJbmNyZW1lbnRTdGVuY2lsT3B8RGVjcmVtZW50U3RlbmNpbE9wfEluY3JlbWVudFdyYXBTdGVuY2lsT3B8RGVjcmVtZW50V3JhcFN0ZW5jaWxPcHxJbnZlcnRTdGVuY2lsT3B9XHJcblx0XHQgKiBAZGVmYXVsdCBLZWVwU3RlbmNpbE9wXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc3RlbmNpbFpGYWlsID0gS2VlcFN0ZW5jaWxPcDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoaWNoIHN0ZW5jaWwgb3BlcmF0aW9uIHRvIHBlcmZvcm0gd2hlbiB0aGUgY29tcGFyaXNvbiBmdW5jdGlvbiByZXR1cm5zXHJcblx0XHQgKiBgdHJ1ZWAgYW5kIHRoZSBkZXB0aCB0ZXN0IHBhc3Nlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7WmVyb1N0ZW5jaWxPcHxLZWVwU3RlbmNpbE9wfFJlcGxhY2VTdGVuY2lsT3B8SW5jcmVtZW50U3RlbmNpbE9wfERlY3JlbWVudFN0ZW5jaWxPcHxJbmNyZW1lbnRXcmFwU3RlbmNpbE9wfERlY3JlbWVudFdyYXBTdGVuY2lsT3B8SW52ZXJ0U3RlbmNpbE9wfVxyXG5cdFx0ICogQGRlZmF1bHQgS2VlcFN0ZW5jaWxPcFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnN0ZW5jaWxaUGFzcyA9IEtlZXBTdGVuY2lsT3A7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHN0ZW5jaWwgb3BlcmF0aW9ucyBhcmUgcGVyZm9ybWVkIGFnYWluc3QgdGhlIHN0ZW5jaWwgYnVmZmVyLiBJblxyXG5cdFx0ICogb3JkZXIgdG8gcGVyZm9ybSB3cml0ZXMgb3IgY29tcGFyaXNvbnMgYWdhaW5zdCB0aGUgc3RlbmNpbCBidWZmZXIgdGhpc1xyXG5cdFx0ICogdmFsdWUgbXVzdCBiZSBgdHJ1ZWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnN0ZW5jaWxXcml0ZSA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVXNlci1kZWZpbmVkIGNsaXBwaW5nIHBsYW5lcyBzcGVjaWZpZWQgYXMgVEhSRUUuUGxhbmUgb2JqZWN0cyBpbiB3b3JsZFxyXG5cdFx0ICogc3BhY2UuIFRoZXNlIHBsYW5lcyBhcHBseSB0byB0aGUgb2JqZWN0cyB0aGlzIG1hdGVyaWFsIGlzIGF0dGFjaGVkIHRvLlxyXG5cdFx0ICogUG9pbnRzIGluIHNwYWNlIHdob3NlIHNpZ25lZCBkaXN0YW5jZSB0byB0aGUgcGxhbmUgaXMgbmVnYXRpdmUgYXJlIGNsaXBwZWRcclxuXHRcdCAqIChub3QgcmVuZGVyZWQpLiBUaGlzIHJlcXVpcmVzIHtAbGluayBXZWJHTFJlbmRlcmVyI2xvY2FsQ2xpcHBpbmdFbmFibGVkfSB0b1xyXG5cdFx0ICogYmUgYHRydWVgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/QXJyYXk8UGxhbmU+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNsaXBwaW5nUGxhbmVzID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENoYW5nZXMgdGhlIGJlaGF2aW9yIG9mIGNsaXBwaW5nIHBsYW5lcyBzbyB0aGF0IG9ubHkgdGhlaXIgaW50ZXJzZWN0aW9uIGlzXHJcblx0XHQgKiBjbGlwcGVkLCByYXRoZXIgdGhhbiB0aGVpciB1bmlvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2xpcEludGVyc2VjdGlvbiA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyB3aGV0aGVyIHRvIGNsaXAgc2hhZG93cyBhY2NvcmRpbmcgdG8gdGhlIGNsaXBwaW5nIHBsYW5lcyBzcGVjaWZpZWRcclxuXHRcdCAqIG9uIHRoaXMgbWF0ZXJpYWwuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNsaXBTaGFkb3dzID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIHdoaWNoIHNpZGUgb2YgZmFjZXMgY2FzdCBzaGFkb3dzLiBJZiBgbnVsbGAsIHRoZSBzaWRlIGNhc3Rpbmcgc2hhZG93c1xyXG5cdFx0ICogaXMgZGV0ZXJtaW5lZCBhcyBmb2xsb3dzOlxyXG5cdFx0ICpcclxuXHRcdCAqIC0gV2hlbiB7QGxpbmsgTWF0ZXJpYWwjc2lkZX0gaXMgc2V0IHRvIGBGcm9udFNpZGVgLCB0aGUgYmFjayBzaWRlIGNhc3Qgc2hhZG93cy5cclxuXHRcdCAqIC0gV2hlbiB7QGxpbmsgTWF0ZXJpYWwjc2lkZX0gaXMgc2V0IHRvIGBCYWNrU2lkZWAsIHRoZSBmcm9udCBzaWRlIGNhc3Qgc2hhZG93cy5cclxuXHRcdCAqIC0gV2hlbiB7QGxpbmsgTWF0ZXJpYWwjc2lkZX0gaXMgc2V0IHRvIGBEb3VibGVTaWRlYCwgYm90aCBzaWRlcyBjYXN0IHNoYWRvd3MuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez8oRnJvbnRTaWRlfEJhY2tTaWRlfERvdWJsZVNpZGUpfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNoYWRvd1NpZGUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0byByZW5kZXIgdGhlIG1hdGVyaWFsJ3MgY29sb3IuXHJcblx0XHQgKlxyXG5cdFx0ICogVGhpcyBjYW4gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHtAbGluayBPYmplY3QzRCNyZW5kZXJPZGVyfSB0byBjcmVhdGUgaW52aXNpYmxlXHJcblx0XHQgKiBvYmplY3RzIHRoYXQgb2NjbHVkZSBvdGhlciBvYmplY3RzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvbG9yV3JpdGUgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogT3ZlcnJpZGUgdGhlIHJlbmRlcmVyJ3MgZGVmYXVsdCBwcmVjaXNpb24gZm9yIHRoaXMgbWF0ZXJpYWwuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez8oJ2hpZ2hwJ3wnbWVkaXVtcCd8J2xvd3AnKX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wcmVjaXNpb24gPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0byB1c2UgcG9seWdvbiBvZmZzZXQgb3Igbm90LiBXaGVuIGVuYWJsZWQsIGVhY2ggZnJhZ21lbnQncyBkZXB0aCB2YWx1ZSB3aWxsXHJcblx0XHQgKiBiZSBvZmZzZXQgYWZ0ZXIgaXQgaXMgaW50ZXJwb2xhdGVkIGZyb20gdGhlIGRlcHRoIHZhbHVlcyBvZiB0aGUgYXBwcm9wcmlhdGUgdmVydGljZXMuXHJcblx0XHQgKiBUaGUgb2Zmc2V0IGlzIGFkZGVkIGJlZm9yZSB0aGUgZGVwdGggdGVzdCBpcyBwZXJmb3JtZWQgYW5kIGJlZm9yZSB0aGUgdmFsdWUgaXMgd3JpdHRlblxyXG5cdFx0ICogaW50byB0aGUgZGVwdGggYnVmZmVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIENhbiBiZSB1c2VmdWwgZm9yIHJlbmRlcmluZyBoaWRkZW4tbGluZSBpbWFnZXMsIGZvciBhcHBseWluZyBkZWNhbHMgdG8gc3VyZmFjZXMsIGFuZCBmb3JcclxuXHRcdCAqIHJlbmRlcmluZyBzb2xpZHMgd2l0aCBoaWdobGlnaHRlZCBlZGdlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucG9seWdvbk9mZnNldCA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU3BlY2lmaWVzIGEgc2NhbGUgZmFjdG9yIHRoYXQgaXMgdXNlZCB0byBjcmVhdGUgYSB2YXJpYWJsZSBkZXB0aCBvZmZzZXQgZm9yIGVhY2ggcG9seWdvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBvbHlnb25PZmZzZXRGYWN0b3IgPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSXMgbXVsdGlwbGllZCBieSBhbiBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyB2YWx1ZSB0byBjcmVhdGUgYSBjb25zdGFudCBkZXB0aCBvZmZzZXQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHMgPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0byBhcHBseSBkaXRoZXJpbmcgdG8gdGhlIGNvbG9yIHRvIHJlbW92ZSB0aGUgYXBwZWFyYW5jZSBvZiBiYW5kaW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kaXRoZXJpbmcgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgYWxwaGEgdG8gY292ZXJhZ2Ugc2hvdWxkIGJlIGVuYWJsZWQgb3Igbm90LiBDYW4gb25seSBiZSB1c2VkIHdpdGggTVNBQS1lbmFibGVkIGNvbnRleHRzXHJcblx0XHQgKiAobWVhbmluZyB3aGVuIHRoZSByZW5kZXJlciB3YXMgY3JlYXRlZCB3aXRoICphbnRpYWxpYXMqIHBhcmFtZXRlciBzZXQgdG8gYHRydWVgKS4gRW5hYmxpbmcgdGhpc1xyXG5cdFx0ICogd2lsbCBzbW9vdGggYWxpYXNpbmcgb24gY2xpcCBwbGFuZSBlZGdlcyBhbmQgYWxwaGFUZXN0LWNsaXBwZWQgZWRnZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFscGhhVG9Db3ZlcmFnZSA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0byBwcmVtdWx0aXBseSB0aGUgYWxwaGEgKHRyYW5zcGFyZW5jeSkgdmFsdWUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnByZW11bHRpcGxpZWRBbHBoYSA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciBkb3VibGUtc2lkZWQsIHRyYW5zcGFyZW50IG9iamVjdHMgc2hvdWxkIGJlIHJlbmRlcmVkIHdpdGggYSBzaW5nbGUgcGFzcyBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogVGhlIGVuZ2luZSByZW5kZXJzIGRvdWJsZS1zaWRlZCwgdHJhbnNwYXJlbnQgb2JqZWN0cyB3aXRoIHR3byBkcmF3IGNhbGxzIChiYWNrIGZhY2VzIGZpcnN0LFxyXG5cdFx0ICogdGhlbiBmcm9udCBmYWNlcykgdG8gbWl0aWdhdGUgdHJhbnNwYXJlbmN5IGFydGlmYWN0cy4gVGhlcmUgYXJlIHNjZW5hcmlvcyBob3dldmVyIHdoZXJlIHRoaXNcclxuXHRcdCAqIGFwcHJvYWNoIHByb2R1Y2VzIG5vIHF1YWxpdHkgZ2FpbnMgYnV0IHN0aWxsIGRvdWJsZXMgZHJhdyBjYWxscyBlLmcuIHdoZW4gcmVuZGVyaW5nIGZsYXRcclxuXHRcdCAqIHZlZ2V0YXRpb24gbGlrZSBncmFzcyBzcHJpdGVzLiBJbiB0aGVzZSBjYXNlcywgc2V0IHRoZSBgZm9yY2VTaW5nbGVQYXNzYCBmbGFnIHRvIGB0cnVlYCB0b1xyXG5cdFx0ICogZGlzYWJsZSB0aGUgdHdvIHBhc3MgcmVuZGVyaW5nIHRvIGF2b2lkIHBlcmZvcm1hbmNlIGlzc3Vlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZm9yY2VTaW5nbGVQYXNzID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIGl0J3MgcG9zc2libGUgdG8gb3ZlcnJpZGUgdGhlIG1hdGVyaWFsIHdpdGgge0BsaW5rIFNjZW5lI292ZXJyaWRlTWF0ZXJpYWx9IG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hbGxvd092ZXJyaWRlID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgd2hldGhlciAzRCBvYmplY3RzIHVzaW5nIHRoaXMgbWF0ZXJpYWwgYXJlIHZpc2libGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudmlzaWJsZSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIHdoZXRoZXIgdGhpcyBtYXRlcmlhbCBpcyB0b25lIG1hcHBlZCBhY2NvcmRpbmcgdG8gdGhlIHJlbmRlcmVyJ3MgdG9uZSBtYXBwaW5nIHNldHRpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogSXQgaXMgaWdub3JlZCB3aGVuIHJlbmRlcmluZyB0byBhIHJlbmRlciB0YXJnZXQgb3IgdXNpbmcgcG9zdCBwcm9jZXNzaW5nIG9yIHdoZW4gdXNpbmdcclxuXHRcdCAqIGBXZWJHUFVSZW5kZXJlcmAuIEluIGFsbCB0aGVzZSBjYXNlcywgYWxsIG1hdGVyaWFscyBhcmUgaG9ub3JlZCBieSB0b25lIG1hcHBpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudG9uZU1hcHBlZCA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byBzdG9yZSBjdXN0b20gZGF0YSBhYm91dCB0aGUgTWF0ZXJpYWwuIEl0XHJcblx0XHQgKiBzaG91bGQgbm90IGhvbGQgcmVmZXJlbmNlcyB0byBmdW5jdGlvbnMgYXMgdGhlc2Ugd2lsbCBub3QgYmUgY2xvbmVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXNlckRhdGEgPSB7fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgc3RhcnRzIGF0IGAwYCBhbmQgY291bnRzIGhvdyBtYW55IHRpbWVzIHtAbGluayBNYXRlcmlhbCNuZWVkc1VwZGF0ZX0gaXMgc2V0IHRvIGB0cnVlYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudmVyc2lvbiA9IDA7XHJcblxyXG5cdFx0dGhpcy5fYWxwaGFUZXN0ID0gMDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBhbHBoYSB2YWx1ZSB0byBiZSB1c2VkIHdoZW4gcnVubmluZyBhbiBhbHBoYSB0ZXN0LiBUaGUgbWF0ZXJpYWxcclxuXHQgKiB3aWxsIG5vdCBiZSByZW5kZXJlZCBpZiB0aGUgb3BhY2l0eSBpcyBsb3dlciB0aGFuIHRoaXMgdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdCAqIEByZWFkb25seVxyXG5cdCAqIEBkZWZhdWx0IDBcclxuXHQgKi9cclxuXHRnZXQgYWxwaGFUZXN0KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9hbHBoYVRlc3Q7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0IGFscGhhVGVzdCggdmFsdWUgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9hbHBoYVRlc3QgPiAwICE9PSB2YWx1ZSA+IDAgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnZlcnNpb24gKys7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuX2FscGhhVGVzdCA9IHZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFuIG9wdGlvbmFsIGNhbGxiYWNrIHRoYXQgaXMgZXhlY3V0ZWQgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBtYXRlcmlhbCBpcyB1c2VkIHRvIHJlbmRlciBhIDNEIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGNhbiBvbmx5IGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgd2l0aCB7QGxpbmsgV2ViR0xSZW5kZXJlcn0uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7U2NlbmV9IHNjZW5lIC0gVGhlIHNjZW5lLlxyXG5cdCAqIEBwYXJhbSB7Q2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIHRoYXQgaXMgdXNlZCB0byByZW5kZXIgdGhlIHNjZW5lLlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyR2VvbWV0cnl9IGdlb21ldHJ5IC0gVGhlIDNEIG9iamVjdCdzIGdlb21ldHJ5LlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0M0R9IG9iamVjdCAtIFRoZSAzRCBvYmplY3QuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGdyb3VwIC0gVGhlIGdlb21ldHJ5IGdyb3VwIGRhdGEuXHJcblx0ICovXHJcblx0b25CZWZvcmVSZW5kZXIoIC8qIHJlbmRlcmVyLCBzY2VuZSwgY2FtZXJhLCBnZW9tZXRyeSwgb2JqZWN0LCBncm91cCAqLyApIHt9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFuIG9wdGlvbmFsIGNhbGxiYWNrIHRoYXQgaXMgZXhlY3V0ZWQgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBzaGFkZXJcclxuXHQgKiBwcm9ncmFtIGlzIGNvbXBpbGVkLiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIHRoZSBzaGFkZXIgc291cmNlIGNvZGVcclxuXHQgKiBhcyBhIHBhcmFtZXRlci4gVXNlZnVsIGZvciB0aGUgbW9kaWZpY2F0aW9uIG9mIGJ1aWx0LWluIG1hdGVyaWFscy5cclxuXHQgKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGNhbiBvbmx5IGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgd2l0aCB7QGxpbmsgV2ViR0xSZW5kZXJlcn0uIFRoZVxyXG5cdCAqIHJlY29tbWVuZGVkIGFwcHJvYWNoIHdoZW4gY3VzdG9taXppbmcgbWF0ZXJpYWxzIGlzIHRvIHVzZSBgV2ViR1BVUmVuZGVyZXJgIHdpdGggdGhlIG5ld1xyXG5cdCAqIE5vZGUgTWF0ZXJpYWwgc3lzdGVtIGFuZCBbVFNMXXtAbGluayBodHRwczovL2dpdGh1Yi5jb20vbXJkb29iL3RocmVlLmpzL3dpa2kvVGhyZWUuanMtU2hhZGluZy1MYW5ndWFnZX0uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3t2ZXJ0ZXhTaGFkZXI6c3RyaW5nLGZyYWdtZW50U2hhZGVyOnN0cmluZyx1bmlmb3JtczpPYmplY3R9fSBzaGFkZXJvYmplY3QgLSBUaGUgb2JqZWN0IGhvbGRzIHRoZSB1bmlmb3JtcyBhbmQgdGhlIHZlcnRleCBhbmQgZnJhZ21lbnQgc2hhZGVyIHNvdXJjZS5cclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIHJlbmRlcmVyLlxyXG5cdCAqL1xyXG5cdG9uQmVmb3JlQ29tcGlsZSggLyogc2hhZGVyb2JqZWN0LCByZW5kZXJlciAqLyApIHt9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEluIGNhc2Uge0BsaW5rIE1hdGVyaWFsI29uQmVmb3JlQ29tcGlsZX0gaXMgdXNlZCwgdGhpcyBjYWxsYmFjayBjYW4gYmUgdXNlZCB0byBpZGVudGlmeVxyXG5cdCAqIHZhbHVlcyBvZiBzZXR0aW5ncyB1c2VkIGluIGBvbkJlZm9yZUNvbXBpbGUoKWAsIHNvIHRocmVlLmpzIGNhbiByZXVzZSBhIGNhY2hlZFxyXG5cdCAqIHNoYWRlciBvciByZWNvbXBpbGUgdGhlIHNoYWRlciBmb3IgdGhpcyBtYXRlcmlhbCBhcyBuZWVkZWQuXHJcblx0ICpcclxuXHQgKiBUaGlzIG1ldGhvZCBjYW4gb25seSBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIHdpdGgge0BsaW5rIFdlYkdMUmVuZGVyZXJ9LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgY3VzdG9tIHByb2dyYW0gY2FjaGUga2V5LlxyXG5cdCAqL1xyXG5cdGN1c3RvbVByb2dyYW1DYWNoZUtleSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5vbkJlZm9yZUNvbXBpbGUudG9TdHJpbmcoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBzZXQgZGVmYXVsdCB2YWx1ZXMgZnJvbSBwYXJhbWV0ZXIgb2JqZWN0cy5cclxuXHQgKiBJdCBpcyBhIGdlbmVyaWMgaW1wbGVtZW50YXRpb24gc28gaXQgY2FuIGJlIHVzZWQgd2l0aCBkaWZmZXJlbnQgdHlwZXNcclxuXHQgKiBvZiBtYXRlcmlhbHMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW3ZhbHVlc10gLSBUaGUgbWF0ZXJpYWwgdmFsdWVzIHRvIHNldC5cclxuXHQgKi9cclxuXHRzZXRWYWx1ZXMoIHZhbHVlcyApIHtcclxuXHJcblx0XHRpZiAoIHZhbHVlcyA9PT0gdW5kZWZpbmVkICkgcmV0dXJuO1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IGtleSBpbiB2YWx1ZXMgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBuZXdWYWx1ZSA9IHZhbHVlc1sga2V5IF07XHJcblxyXG5cdFx0XHRpZiAoIG5ld1ZhbHVlID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnNvbGUud2FybiggYFRIUkVFLk1hdGVyaWFsOiBwYXJhbWV0ZXIgJyR7IGtleSB9JyBoYXMgdmFsdWUgb2YgdW5kZWZpbmVkLmAgKTtcclxuXHRcdFx0XHRjb250aW51ZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRoaXNbIGtleSBdO1xyXG5cclxuXHRcdFx0aWYgKCBjdXJyZW50VmFsdWUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0Y29uc29sZS53YXJuKCBgVEhSRUUuTWF0ZXJpYWw6ICckeyBrZXkgfScgaXMgbm90IGEgcHJvcGVydHkgb2YgVEhSRUUuJHsgdGhpcy50eXBlIH0uYCApO1xyXG5cdFx0XHRcdGNvbnRpbnVlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBjdXJyZW50VmFsdWUgJiYgY3VycmVudFZhbHVlLmlzQ29sb3IgKSB7XHJcblxyXG5cdFx0XHRcdGN1cnJlbnRWYWx1ZS5zZXQoIG5ld1ZhbHVlICk7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCAoIGN1cnJlbnRWYWx1ZSAmJiBjdXJyZW50VmFsdWUuaXNWZWN0b3IzICkgJiYgKCBuZXdWYWx1ZSAmJiBuZXdWYWx1ZS5pc1ZlY3RvcjMgKSApIHtcclxuXHJcblx0XHRcdFx0Y3VycmVudFZhbHVlLmNvcHkoIG5ld1ZhbHVlICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHR0aGlzWyBrZXkgXSA9IG5ld1ZhbHVlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXJpYWxpemVzIHRoZSBtYXRlcmlhbCBpbnRvIEpTT04uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gez8oT2JqZWN0fHN0cmluZyl9IG1ldGEgLSBBbiBvcHRpb25hbCB2YWx1ZSBob2xkaW5nIG1ldGEgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlcmlhbGl6YXRpb24uXHJcblx0ICogQHJldHVybiB7T2JqZWN0fSBBIEpTT04gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc2VyaWFsaXplZCBtYXRlcmlhbC5cclxuXHQgKiBAc2VlIHtAbGluayBPYmplY3RMb2FkZXIjcGFyc2V9XHJcblx0ICovXHJcblx0dG9KU09OKCBtZXRhICkge1xyXG5cclxuXHRcdGNvbnN0IGlzUm9vdE9iamVjdCA9ICggbWV0YSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBtZXRhID09PSAnc3RyaW5nJyApO1xyXG5cclxuXHRcdGlmICggaXNSb290T2JqZWN0ICkge1xyXG5cclxuXHRcdFx0bWV0YSA9IHtcclxuXHRcdFx0XHR0ZXh0dXJlczoge30sXHJcblx0XHRcdFx0aW1hZ2VzOiB7fVxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBkYXRhID0ge1xyXG5cdFx0XHRtZXRhZGF0YToge1xyXG5cdFx0XHRcdHZlcnNpb246IDQuNixcclxuXHRcdFx0XHR0eXBlOiAnTWF0ZXJpYWwnLFxyXG5cdFx0XHRcdGdlbmVyYXRvcjogJ01hdGVyaWFsLnRvSlNPTidcclxuXHRcdFx0fVxyXG5cdFx0fTtcclxuXHJcblx0XHQvLyBzdGFuZGFyZCBNYXRlcmlhbCBzZXJpYWxpemF0aW9uXHJcblx0XHRkYXRhLnV1aWQgPSB0aGlzLnV1aWQ7XHJcblx0XHRkYXRhLnR5cGUgPSB0aGlzLnR5cGU7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5hbWUgIT09ICcnICkgZGF0YS5uYW1lID0gdGhpcy5uYW1lO1xyXG5cclxuXHRcdGlmICggdGhpcy5jb2xvciAmJiB0aGlzLmNvbG9yLmlzQ29sb3IgKSBkYXRhLmNvbG9yID0gdGhpcy5jb2xvci5nZXRIZXgoKTtcclxuXHJcblx0XHRpZiAoIHRoaXMucm91Z2huZXNzICE9PSB1bmRlZmluZWQgKSBkYXRhLnJvdWdobmVzcyA9IHRoaXMucm91Z2huZXNzO1xyXG5cdFx0aWYgKCB0aGlzLm1ldGFsbmVzcyAhPT0gdW5kZWZpbmVkICkgZGF0YS5tZXRhbG5lc3MgPSB0aGlzLm1ldGFsbmVzcztcclxuXHJcblx0XHRpZiAoIHRoaXMuc2hlZW4gIT09IHVuZGVmaW5lZCApIGRhdGEuc2hlZW4gPSB0aGlzLnNoZWVuO1xyXG5cdFx0aWYgKCB0aGlzLnNoZWVuQ29sb3IgJiYgdGhpcy5zaGVlbkNvbG9yLmlzQ29sb3IgKSBkYXRhLnNoZWVuQ29sb3IgPSB0aGlzLnNoZWVuQ29sb3IuZ2V0SGV4KCk7XHJcblx0XHRpZiAoIHRoaXMuc2hlZW5Sb3VnaG5lc3MgIT09IHVuZGVmaW5lZCApIGRhdGEuc2hlZW5Sb3VnaG5lc3MgPSB0aGlzLnNoZWVuUm91Z2huZXNzO1xyXG5cdFx0aWYgKCB0aGlzLmVtaXNzaXZlICYmIHRoaXMuZW1pc3NpdmUuaXNDb2xvciApIGRhdGEuZW1pc3NpdmUgPSB0aGlzLmVtaXNzaXZlLmdldEhleCgpO1xyXG5cdFx0aWYgKCB0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5lbWlzc2l2ZUludGVuc2l0eSAhPT0gMSApIGRhdGEuZW1pc3NpdmVJbnRlbnNpdHkgPSB0aGlzLmVtaXNzaXZlSW50ZW5zaXR5O1xyXG5cclxuXHRcdGlmICggdGhpcy5zcGVjdWxhciAmJiB0aGlzLnNwZWN1bGFyLmlzQ29sb3IgKSBkYXRhLnNwZWN1bGFyID0gdGhpcy5zcGVjdWxhci5nZXRIZXgoKTtcclxuXHRcdGlmICggdGhpcy5zcGVjdWxhckludGVuc2l0eSAhPT0gdW5kZWZpbmVkICkgZGF0YS5zcGVjdWxhckludGVuc2l0eSA9IHRoaXMuc3BlY3VsYXJJbnRlbnNpdHk7XHJcblx0XHRpZiAoIHRoaXMuc3BlY3VsYXJDb2xvciAmJiB0aGlzLnNwZWN1bGFyQ29sb3IuaXNDb2xvciApIGRhdGEuc3BlY3VsYXJDb2xvciA9IHRoaXMuc3BlY3VsYXJDb2xvci5nZXRIZXgoKTtcclxuXHRcdGlmICggdGhpcy5zaGluaW5lc3MgIT09IHVuZGVmaW5lZCApIGRhdGEuc2hpbmluZXNzID0gdGhpcy5zaGluaW5lc3M7XHJcblx0XHRpZiAoIHRoaXMuY2xlYXJjb2F0ICE9PSB1bmRlZmluZWQgKSBkYXRhLmNsZWFyY29hdCA9IHRoaXMuY2xlYXJjb2F0O1xyXG5cdFx0aWYgKCB0aGlzLmNsZWFyY29hdFJvdWdobmVzcyAhPT0gdW5kZWZpbmVkICkgZGF0YS5jbGVhcmNvYXRSb3VnaG5lc3MgPSB0aGlzLmNsZWFyY29hdFJvdWdobmVzcztcclxuXHJcblx0XHRpZiAoIHRoaXMuY2xlYXJjb2F0TWFwICYmIHRoaXMuY2xlYXJjb2F0TWFwLmlzVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdGRhdGEuY2xlYXJjb2F0TWFwID0gdGhpcy5jbGVhcmNvYXRNYXAudG9KU09OKCBtZXRhICkudXVpZDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aGlzLmNsZWFyY29hdFJvdWdobmVzc01hcCAmJiB0aGlzLmNsZWFyY29hdFJvdWdobmVzc01hcC5pc1RleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRkYXRhLmNsZWFyY29hdFJvdWdobmVzc01hcCA9IHRoaXMuY2xlYXJjb2F0Um91Z2huZXNzTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy5jbGVhcmNvYXROb3JtYWxNYXAgJiYgdGhpcy5jbGVhcmNvYXROb3JtYWxNYXAuaXNUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0ZGF0YS5jbGVhcmNvYXROb3JtYWxNYXAgPSB0aGlzLmNsZWFyY29hdE5vcm1hbE1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xyXG5cdFx0XHRkYXRhLmNsZWFyY29hdE5vcm1hbFNjYWxlID0gdGhpcy5jbGVhcmNvYXROb3JtYWxTY2FsZS50b0FycmF5KCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy5kaXNwZXJzaW9uICE9PSB1bmRlZmluZWQgKSBkYXRhLmRpc3BlcnNpb24gPSB0aGlzLmRpc3BlcnNpb247XHJcblxyXG5cdFx0aWYgKCB0aGlzLmlyaWRlc2NlbmNlICE9PSB1bmRlZmluZWQgKSBkYXRhLmlyaWRlc2NlbmNlID0gdGhpcy5pcmlkZXNjZW5jZTtcclxuXHRcdGlmICggdGhpcy5pcmlkZXNjZW5jZUlPUiAhPT0gdW5kZWZpbmVkICkgZGF0YS5pcmlkZXNjZW5jZUlPUiA9IHRoaXMuaXJpZGVzY2VuY2VJT1I7XHJcblx0XHRpZiAoIHRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZSAhPT0gdW5kZWZpbmVkICkgZGF0YS5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlID0gdGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlO1xyXG5cclxuXHRcdGlmICggdGhpcy5pcmlkZXNjZW5jZU1hcCAmJiB0aGlzLmlyaWRlc2NlbmNlTWFwLmlzVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdGRhdGEuaXJpZGVzY2VuY2VNYXAgPSB0aGlzLmlyaWRlc2NlbmNlTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcCAmJiB0aGlzLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwLmlzVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdGRhdGEuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAgPSB0aGlzLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy5hbmlzb3Ryb3B5ICE9PSB1bmRlZmluZWQgKSBkYXRhLmFuaXNvdHJvcHkgPSB0aGlzLmFuaXNvdHJvcHk7XHJcblx0XHRpZiAoIHRoaXMuYW5pc290cm9weVJvdGF0aW9uICE9PSB1bmRlZmluZWQgKSBkYXRhLmFuaXNvdHJvcHlSb3RhdGlvbiA9IHRoaXMuYW5pc290cm9weVJvdGF0aW9uO1xyXG5cclxuXHRcdGlmICggdGhpcy5hbmlzb3Ryb3B5TWFwICYmIHRoaXMuYW5pc290cm9weU1hcC5pc1RleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRkYXRhLmFuaXNvdHJvcHlNYXAgPSB0aGlzLmFuaXNvdHJvcHlNYXAudG9KU09OKCBtZXRhICkudXVpZDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aGlzLm1hcCAmJiB0aGlzLm1hcC5pc1RleHR1cmUgKSBkYXRhLm1hcCA9IHRoaXMubWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XHJcblx0XHRpZiAoIHRoaXMubWF0Y2FwICYmIHRoaXMubWF0Y2FwLmlzVGV4dHVyZSApIGRhdGEubWF0Y2FwID0gdGhpcy5tYXRjYXAudG9KU09OKCBtZXRhICkudXVpZDtcclxuXHRcdGlmICggdGhpcy5hbHBoYU1hcCAmJiB0aGlzLmFscGhhTWFwLmlzVGV4dHVyZSApIGRhdGEuYWxwaGFNYXAgPSB0aGlzLmFscGhhTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmxpZ2h0TWFwICYmIHRoaXMubGlnaHRNYXAuaXNUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0ZGF0YS5saWdodE1hcCA9IHRoaXMubGlnaHRNYXAudG9KU09OKCBtZXRhICkudXVpZDtcclxuXHRcdFx0ZGF0YS5saWdodE1hcEludGVuc2l0eSA9IHRoaXMubGlnaHRNYXBJbnRlbnNpdHk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy5hb01hcCAmJiB0aGlzLmFvTWFwLmlzVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdGRhdGEuYW9NYXAgPSB0aGlzLmFvTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XHJcblx0XHRcdGRhdGEuYW9NYXBJbnRlbnNpdHkgPSB0aGlzLmFvTWFwSW50ZW5zaXR5O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMuYnVtcE1hcCAmJiB0aGlzLmJ1bXBNYXAuaXNUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0ZGF0YS5idW1wTWFwID0gdGhpcy5idW1wTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XHJcblx0XHRcdGRhdGEuYnVtcFNjYWxlID0gdGhpcy5idW1wU2NhbGU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy5ub3JtYWxNYXAgJiYgdGhpcy5ub3JtYWxNYXAuaXNUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0ZGF0YS5ub3JtYWxNYXAgPSB0aGlzLm5vcm1hbE1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xyXG5cdFx0XHRkYXRhLm5vcm1hbE1hcFR5cGUgPSB0aGlzLm5vcm1hbE1hcFR5cGU7XHJcblx0XHRcdGRhdGEubm9ybWFsU2NhbGUgPSB0aGlzLm5vcm1hbFNjYWxlLnRvQXJyYXkoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aGlzLmRpc3BsYWNlbWVudE1hcCAmJiB0aGlzLmRpc3BsYWNlbWVudE1hcC5pc1RleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRkYXRhLmRpc3BsYWNlbWVudE1hcCA9IHRoaXMuZGlzcGxhY2VtZW50TWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XHJcblx0XHRcdGRhdGEuZGlzcGxhY2VtZW50U2NhbGUgPSB0aGlzLmRpc3BsYWNlbWVudFNjYWxlO1xyXG5cdFx0XHRkYXRhLmRpc3BsYWNlbWVudEJpYXMgPSB0aGlzLmRpc3BsYWNlbWVudEJpYXM7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy5yb3VnaG5lc3NNYXAgJiYgdGhpcy5yb3VnaG5lc3NNYXAuaXNUZXh0dXJlICkgZGF0YS5yb3VnaG5lc3NNYXAgPSB0aGlzLnJvdWdobmVzc01hcC50b0pTT04oIG1ldGEgKS51dWlkO1xyXG5cdFx0aWYgKCB0aGlzLm1ldGFsbmVzc01hcCAmJiB0aGlzLm1ldGFsbmVzc01hcC5pc1RleHR1cmUgKSBkYXRhLm1ldGFsbmVzc01hcCA9IHRoaXMubWV0YWxuZXNzTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmVtaXNzaXZlTWFwICYmIHRoaXMuZW1pc3NpdmVNYXAuaXNUZXh0dXJlICkgZGF0YS5lbWlzc2l2ZU1hcCA9IHRoaXMuZW1pc3NpdmVNYXAudG9KU09OKCBtZXRhICkudXVpZDtcclxuXHRcdGlmICggdGhpcy5zcGVjdWxhck1hcCAmJiB0aGlzLnNwZWN1bGFyTWFwLmlzVGV4dHVyZSApIGRhdGEuc3BlY3VsYXJNYXAgPSB0aGlzLnNwZWN1bGFyTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XHJcblx0XHRpZiAoIHRoaXMuc3BlY3VsYXJJbnRlbnNpdHlNYXAgJiYgdGhpcy5zcGVjdWxhckludGVuc2l0eU1hcC5pc1RleHR1cmUgKSBkYXRhLnNwZWN1bGFySW50ZW5zaXR5TWFwID0gdGhpcy5zcGVjdWxhckludGVuc2l0eU1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xyXG5cdFx0aWYgKCB0aGlzLnNwZWN1bGFyQ29sb3JNYXAgJiYgdGhpcy5zcGVjdWxhckNvbG9yTWFwLmlzVGV4dHVyZSApIGRhdGEuc3BlY3VsYXJDb2xvck1hcCA9IHRoaXMuc3BlY3VsYXJDb2xvck1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xyXG5cclxuXHRcdGlmICggdGhpcy5lbnZNYXAgJiYgdGhpcy5lbnZNYXAuaXNUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0ZGF0YS5lbnZNYXAgPSB0aGlzLmVudk1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLmNvbWJpbmUgIT09IHVuZGVmaW5lZCApIGRhdGEuY29tYmluZSA9IHRoaXMuY29tYmluZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aGlzLmVudk1hcFJvdGF0aW9uICE9PSB1bmRlZmluZWQgKSBkYXRhLmVudk1hcFJvdGF0aW9uID0gdGhpcy5lbnZNYXBSb3RhdGlvbi50b0FycmF5KCk7XHJcblx0XHRpZiAoIHRoaXMuZW52TWFwSW50ZW5zaXR5ICE9PSB1bmRlZmluZWQgKSBkYXRhLmVudk1hcEludGVuc2l0eSA9IHRoaXMuZW52TWFwSW50ZW5zaXR5O1xyXG5cdFx0aWYgKCB0aGlzLnJlZmxlY3Rpdml0eSAhPT0gdW5kZWZpbmVkICkgZGF0YS5yZWZsZWN0aXZpdHkgPSB0aGlzLnJlZmxlY3Rpdml0eTtcclxuXHRcdGlmICggdGhpcy5yZWZyYWN0aW9uUmF0aW8gIT09IHVuZGVmaW5lZCApIGRhdGEucmVmcmFjdGlvblJhdGlvID0gdGhpcy5yZWZyYWN0aW9uUmF0aW87XHJcblxyXG5cdFx0aWYgKCB0aGlzLmdyYWRpZW50TWFwICYmIHRoaXMuZ3JhZGllbnRNYXAuaXNUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0ZGF0YS5ncmFkaWVudE1hcCA9IHRoaXMuZ3JhZGllbnRNYXAudG9KU09OKCBtZXRhICkudXVpZDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aGlzLnRyYW5zbWlzc2lvbiAhPT0gdW5kZWZpbmVkICkgZGF0YS50cmFuc21pc3Npb24gPSB0aGlzLnRyYW5zbWlzc2lvbjtcclxuXHRcdGlmICggdGhpcy50cmFuc21pc3Npb25NYXAgJiYgdGhpcy50cmFuc21pc3Npb25NYXAuaXNUZXh0dXJlICkgZGF0YS50cmFuc21pc3Npb25NYXAgPSB0aGlzLnRyYW5zbWlzc2lvbk1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xyXG5cdFx0aWYgKCB0aGlzLnRoaWNrbmVzcyAhPT0gdW5kZWZpbmVkICkgZGF0YS50aGlja25lc3MgPSB0aGlzLnRoaWNrbmVzcztcclxuXHRcdGlmICggdGhpcy50aGlja25lc3NNYXAgJiYgdGhpcy50aGlja25lc3NNYXAuaXNUZXh0dXJlICkgZGF0YS50aGlja25lc3NNYXAgPSB0aGlzLnRoaWNrbmVzc01hcC50b0pTT04oIG1ldGEgKS51dWlkO1xyXG5cdFx0aWYgKCB0aGlzLmF0dGVudWF0aW9uRGlzdGFuY2UgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmF0dGVudWF0aW9uRGlzdGFuY2UgIT09IEluZmluaXR5ICkgZGF0YS5hdHRlbnVhdGlvbkRpc3RhbmNlID0gdGhpcy5hdHRlbnVhdGlvbkRpc3RhbmNlO1xyXG5cdFx0aWYgKCB0aGlzLmF0dGVudWF0aW9uQ29sb3IgIT09IHVuZGVmaW5lZCApIGRhdGEuYXR0ZW51YXRpb25Db2xvciA9IHRoaXMuYXR0ZW51YXRpb25Db2xvci5nZXRIZXgoKTtcclxuXHJcblx0XHRpZiAoIHRoaXMuc2l6ZSAhPT0gdW5kZWZpbmVkICkgZGF0YS5zaXplID0gdGhpcy5zaXplO1xyXG5cdFx0aWYgKCB0aGlzLnNoYWRvd1NpZGUgIT09IG51bGwgKSBkYXRhLnNoYWRvd1NpZGUgPSB0aGlzLnNoYWRvd1NpZGU7XHJcblx0XHRpZiAoIHRoaXMuc2l6ZUF0dGVudWF0aW9uICE9PSB1bmRlZmluZWQgKSBkYXRhLnNpemVBdHRlbnVhdGlvbiA9IHRoaXMuc2l6ZUF0dGVudWF0aW9uO1xyXG5cclxuXHRcdGlmICggdGhpcy5ibGVuZGluZyAhPT0gTm9ybWFsQmxlbmRpbmcgKSBkYXRhLmJsZW5kaW5nID0gdGhpcy5ibGVuZGluZztcclxuXHRcdGlmICggdGhpcy5zaWRlICE9PSBGcm9udFNpZGUgKSBkYXRhLnNpZGUgPSB0aGlzLnNpZGU7XHJcblx0XHRpZiAoIHRoaXMudmVydGV4Q29sb3JzID09PSB0cnVlICkgZGF0YS52ZXJ0ZXhDb2xvcnMgPSB0cnVlO1xyXG5cclxuXHRcdGlmICggdGhpcy5vcGFjaXR5IDwgMSApIGRhdGEub3BhY2l0eSA9IHRoaXMub3BhY2l0eTtcclxuXHRcdGlmICggdGhpcy50cmFuc3BhcmVudCA9PT0gdHJ1ZSApIGRhdGEudHJhbnNwYXJlbnQgPSB0cnVlO1xyXG5cclxuXHRcdGlmICggdGhpcy5ibGVuZFNyYyAhPT0gU3JjQWxwaGFGYWN0b3IgKSBkYXRhLmJsZW5kU3JjID0gdGhpcy5ibGVuZFNyYztcclxuXHRcdGlmICggdGhpcy5ibGVuZERzdCAhPT0gT25lTWludXNTcmNBbHBoYUZhY3RvciApIGRhdGEuYmxlbmREc3QgPSB0aGlzLmJsZW5kRHN0O1xyXG5cdFx0aWYgKCB0aGlzLmJsZW5kRXF1YXRpb24gIT09IEFkZEVxdWF0aW9uICkgZGF0YS5ibGVuZEVxdWF0aW9uID0gdGhpcy5ibGVuZEVxdWF0aW9uO1xyXG5cdFx0aWYgKCB0aGlzLmJsZW5kU3JjQWxwaGEgIT09IG51bGwgKSBkYXRhLmJsZW5kU3JjQWxwaGEgPSB0aGlzLmJsZW5kU3JjQWxwaGE7XHJcblx0XHRpZiAoIHRoaXMuYmxlbmREc3RBbHBoYSAhPT0gbnVsbCApIGRhdGEuYmxlbmREc3RBbHBoYSA9IHRoaXMuYmxlbmREc3RBbHBoYTtcclxuXHRcdGlmICggdGhpcy5ibGVuZEVxdWF0aW9uQWxwaGEgIT09IG51bGwgKSBkYXRhLmJsZW5kRXF1YXRpb25BbHBoYSA9IHRoaXMuYmxlbmRFcXVhdGlvbkFscGhhO1xyXG5cdFx0aWYgKCB0aGlzLmJsZW5kQ29sb3IgJiYgdGhpcy5ibGVuZENvbG9yLmlzQ29sb3IgKSBkYXRhLmJsZW5kQ29sb3IgPSB0aGlzLmJsZW5kQ29sb3IuZ2V0SGV4KCk7XHJcblx0XHRpZiAoIHRoaXMuYmxlbmRBbHBoYSAhPT0gMCApIGRhdGEuYmxlbmRBbHBoYSA9IHRoaXMuYmxlbmRBbHBoYTtcclxuXHJcblx0XHRpZiAoIHRoaXMuZGVwdGhGdW5jICE9PSBMZXNzRXF1YWxEZXB0aCApIGRhdGEuZGVwdGhGdW5jID0gdGhpcy5kZXB0aEZ1bmM7XHJcblx0XHRpZiAoIHRoaXMuZGVwdGhUZXN0ID09PSBmYWxzZSApIGRhdGEuZGVwdGhUZXN0ID0gdGhpcy5kZXB0aFRlc3Q7XHJcblx0XHRpZiAoIHRoaXMuZGVwdGhXcml0ZSA9PT0gZmFsc2UgKSBkYXRhLmRlcHRoV3JpdGUgPSB0aGlzLmRlcHRoV3JpdGU7XHJcblx0XHRpZiAoIHRoaXMuY29sb3JXcml0ZSA9PT0gZmFsc2UgKSBkYXRhLmNvbG9yV3JpdGUgPSB0aGlzLmNvbG9yV3JpdGU7XHJcblxyXG5cdFx0aWYgKCB0aGlzLnN0ZW5jaWxXcml0ZU1hc2sgIT09IDB4ZmYgKSBkYXRhLnN0ZW5jaWxXcml0ZU1hc2sgPSB0aGlzLnN0ZW5jaWxXcml0ZU1hc2s7XHJcblx0XHRpZiAoIHRoaXMuc3RlbmNpbEZ1bmMgIT09IEFsd2F5c1N0ZW5jaWxGdW5jICkgZGF0YS5zdGVuY2lsRnVuYyA9IHRoaXMuc3RlbmNpbEZ1bmM7XHJcblx0XHRpZiAoIHRoaXMuc3RlbmNpbFJlZiAhPT0gMCApIGRhdGEuc3RlbmNpbFJlZiA9IHRoaXMuc3RlbmNpbFJlZjtcclxuXHRcdGlmICggdGhpcy5zdGVuY2lsRnVuY01hc2sgIT09IDB4ZmYgKSBkYXRhLnN0ZW5jaWxGdW5jTWFzayA9IHRoaXMuc3RlbmNpbEZ1bmNNYXNrO1xyXG5cdFx0aWYgKCB0aGlzLnN0ZW5jaWxGYWlsICE9PSBLZWVwU3RlbmNpbE9wICkgZGF0YS5zdGVuY2lsRmFpbCA9IHRoaXMuc3RlbmNpbEZhaWw7XHJcblx0XHRpZiAoIHRoaXMuc3RlbmNpbFpGYWlsICE9PSBLZWVwU3RlbmNpbE9wICkgZGF0YS5zdGVuY2lsWkZhaWwgPSB0aGlzLnN0ZW5jaWxaRmFpbDtcclxuXHRcdGlmICggdGhpcy5zdGVuY2lsWlBhc3MgIT09IEtlZXBTdGVuY2lsT3AgKSBkYXRhLnN0ZW5jaWxaUGFzcyA9IHRoaXMuc3RlbmNpbFpQYXNzO1xyXG5cdFx0aWYgKCB0aGlzLnN0ZW5jaWxXcml0ZSA9PT0gdHJ1ZSApIGRhdGEuc3RlbmNpbFdyaXRlID0gdGhpcy5zdGVuY2lsV3JpdGU7XHJcblxyXG5cdFx0Ly8gcm90YXRpb24gKFNwcml0ZU1hdGVyaWFsKVxyXG5cdFx0aWYgKCB0aGlzLnJvdGF0aW9uICE9PSB1bmRlZmluZWQgJiYgdGhpcy5yb3RhdGlvbiAhPT0gMCApIGRhdGEucm90YXRpb24gPSB0aGlzLnJvdGF0aW9uO1xyXG5cclxuXHRcdGlmICggdGhpcy5wb2x5Z29uT2Zmc2V0ID09PSB0cnVlICkgZGF0YS5wb2x5Z29uT2Zmc2V0ID0gdHJ1ZTtcclxuXHRcdGlmICggdGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yICE9PSAwICkgZGF0YS5wb2x5Z29uT2Zmc2V0RmFjdG9yID0gdGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yO1xyXG5cdFx0aWYgKCB0aGlzLnBvbHlnb25PZmZzZXRVbml0cyAhPT0gMCApIGRhdGEucG9seWdvbk9mZnNldFVuaXRzID0gdGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHM7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmxpbmV3aWR0aCAhPT0gdW5kZWZpbmVkICYmIHRoaXMubGluZXdpZHRoICE9PSAxICkgZGF0YS5saW5ld2lkdGggPSB0aGlzLmxpbmV3aWR0aDtcclxuXHRcdGlmICggdGhpcy5kYXNoU2l6ZSAhPT0gdW5kZWZpbmVkICkgZGF0YS5kYXNoU2l6ZSA9IHRoaXMuZGFzaFNpemU7XHJcblx0XHRpZiAoIHRoaXMuZ2FwU2l6ZSAhPT0gdW5kZWZpbmVkICkgZGF0YS5nYXBTaXplID0gdGhpcy5nYXBTaXplO1xyXG5cdFx0aWYgKCB0aGlzLnNjYWxlICE9PSB1bmRlZmluZWQgKSBkYXRhLnNjYWxlID0gdGhpcy5zY2FsZTtcclxuXHJcblx0XHRpZiAoIHRoaXMuZGl0aGVyaW5nID09PSB0cnVlICkgZGF0YS5kaXRoZXJpbmcgPSB0cnVlO1xyXG5cclxuXHRcdGlmICggdGhpcy5hbHBoYVRlc3QgPiAwICkgZGF0YS5hbHBoYVRlc3QgPSB0aGlzLmFscGhhVGVzdDtcclxuXHRcdGlmICggdGhpcy5hbHBoYUhhc2ggPT09IHRydWUgKSBkYXRhLmFscGhhSGFzaCA9IHRydWU7XHJcblx0XHRpZiAoIHRoaXMuYWxwaGFUb0NvdmVyYWdlID09PSB0cnVlICkgZGF0YS5hbHBoYVRvQ292ZXJhZ2UgPSB0cnVlO1xyXG5cdFx0aWYgKCB0aGlzLnByZW11bHRpcGxpZWRBbHBoYSA9PT0gdHJ1ZSApIGRhdGEucHJlbXVsdGlwbGllZEFscGhhID0gdHJ1ZTtcclxuXHRcdGlmICggdGhpcy5mb3JjZVNpbmdsZVBhc3MgPT09IHRydWUgKSBkYXRhLmZvcmNlU2luZ2xlUGFzcyA9IHRydWU7XHJcblxyXG5cdFx0aWYgKCB0aGlzLndpcmVmcmFtZSA9PT0gdHJ1ZSApIGRhdGEud2lyZWZyYW1lID0gdHJ1ZTtcclxuXHRcdGlmICggdGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPiAxICkgZGF0YS53aXJlZnJhbWVMaW5ld2lkdGggPSB0aGlzLndpcmVmcmFtZUxpbmV3aWR0aDtcclxuXHRcdGlmICggdGhpcy53aXJlZnJhbWVMaW5lY2FwICE9PSAncm91bmQnICkgZGF0YS53aXJlZnJhbWVMaW5lY2FwID0gdGhpcy53aXJlZnJhbWVMaW5lY2FwO1xyXG5cdFx0aWYgKCB0aGlzLndpcmVmcmFtZUxpbmVqb2luICE9PSAncm91bmQnICkgZGF0YS53aXJlZnJhbWVMaW5lam9pbiA9IHRoaXMud2lyZWZyYW1lTGluZWpvaW47XHJcblxyXG5cdFx0aWYgKCB0aGlzLmZsYXRTaGFkaW5nID09PSB0cnVlICkgZGF0YS5mbGF0U2hhZGluZyA9IHRydWU7XHJcblxyXG5cdFx0aWYgKCB0aGlzLnZpc2libGUgPT09IGZhbHNlICkgZGF0YS52aXNpYmxlID0gZmFsc2U7XHJcblxyXG5cdFx0aWYgKCB0aGlzLnRvbmVNYXBwZWQgPT09IGZhbHNlICkgZGF0YS50b25lTWFwcGVkID0gZmFsc2U7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmZvZyA9PT0gZmFsc2UgKSBkYXRhLmZvZyA9IGZhbHNlO1xyXG5cclxuXHRcdGlmICggT2JqZWN0LmtleXMoIHRoaXMudXNlckRhdGEgKS5sZW5ndGggPiAwICkgZGF0YS51c2VyRGF0YSA9IHRoaXMudXNlckRhdGE7XHJcblxyXG5cdFx0Ly8gVE9ETzogQ29waWVkIGZyb20gT2JqZWN0M0QudG9KU09OXHJcblxyXG5cdFx0ZnVuY3Rpb24gZXh0cmFjdEZyb21DYWNoZSggY2FjaGUgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB2YWx1ZXMgPSBbXTtcclxuXHJcblx0XHRcdGZvciAoIGNvbnN0IGtleSBpbiBjYWNoZSApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgZGF0YSA9IGNhY2hlWyBrZXkgXTtcclxuXHRcdFx0XHRkZWxldGUgZGF0YS5tZXRhZGF0YTtcclxuXHRcdFx0XHR2YWx1ZXMucHVzaCggZGF0YSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIHZhbHVlcztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBpc1Jvb3RPYmplY3QgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB0ZXh0dXJlcyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEudGV4dHVyZXMgKTtcclxuXHRcdFx0Y29uc3QgaW1hZ2VzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS5pbWFnZXMgKTtcclxuXHJcblx0XHRcdGlmICggdGV4dHVyZXMubGVuZ3RoID4gMCApIGRhdGEudGV4dHVyZXMgPSB0ZXh0dXJlcztcclxuXHRcdFx0aWYgKCBpbWFnZXMubGVuZ3RoID4gMCApIGRhdGEuaW1hZ2VzID0gaW1hZ2VzO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZGF0YTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbmV3IG1hdGVyaWFsIHdpdGggY29waWVkIHZhbHVlcyBmcm9tIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtNYXRlcmlhbH0gQSBjbG9uZSBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNsb25lKCkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gbWF0ZXJpYWwgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0ZXJpYWx9IHNvdXJjZSAtIFRoZSBtYXRlcmlhbCB0byBjb3B5LlxyXG5cdCAqIEByZXR1cm4ge01hdGVyaWFsfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHR0aGlzLm5hbWUgPSBzb3VyY2UubmFtZTtcclxuXHJcblx0XHR0aGlzLmJsZW5kaW5nID0gc291cmNlLmJsZW5kaW5nO1xyXG5cdFx0dGhpcy5zaWRlID0gc291cmNlLnNpZGU7XHJcblx0XHR0aGlzLnZlcnRleENvbG9ycyA9IHNvdXJjZS52ZXJ0ZXhDb2xvcnM7XHJcblxyXG5cdFx0dGhpcy5vcGFjaXR5ID0gc291cmNlLm9wYWNpdHk7XHJcblx0XHR0aGlzLnRyYW5zcGFyZW50ID0gc291cmNlLnRyYW5zcGFyZW50O1xyXG5cclxuXHRcdHRoaXMuYmxlbmRTcmMgPSBzb3VyY2UuYmxlbmRTcmM7XHJcblx0XHR0aGlzLmJsZW5kRHN0ID0gc291cmNlLmJsZW5kRHN0O1xyXG5cdFx0dGhpcy5ibGVuZEVxdWF0aW9uID0gc291cmNlLmJsZW5kRXF1YXRpb247XHJcblx0XHR0aGlzLmJsZW5kU3JjQWxwaGEgPSBzb3VyY2UuYmxlbmRTcmNBbHBoYTtcclxuXHRcdHRoaXMuYmxlbmREc3RBbHBoYSA9IHNvdXJjZS5ibGVuZERzdEFscGhhO1xyXG5cdFx0dGhpcy5ibGVuZEVxdWF0aW9uQWxwaGEgPSBzb3VyY2UuYmxlbmRFcXVhdGlvbkFscGhhO1xyXG5cdFx0dGhpcy5ibGVuZENvbG9yLmNvcHkoIHNvdXJjZS5ibGVuZENvbG9yICk7XHJcblx0XHR0aGlzLmJsZW5kQWxwaGEgPSBzb3VyY2UuYmxlbmRBbHBoYTtcclxuXHJcblx0XHR0aGlzLmRlcHRoRnVuYyA9IHNvdXJjZS5kZXB0aEZ1bmM7XHJcblx0XHR0aGlzLmRlcHRoVGVzdCA9IHNvdXJjZS5kZXB0aFRlc3Q7XHJcblx0XHR0aGlzLmRlcHRoV3JpdGUgPSBzb3VyY2UuZGVwdGhXcml0ZTtcclxuXHJcblx0XHR0aGlzLnN0ZW5jaWxXcml0ZU1hc2sgPSBzb3VyY2Uuc3RlbmNpbFdyaXRlTWFzaztcclxuXHRcdHRoaXMuc3RlbmNpbEZ1bmMgPSBzb3VyY2Uuc3RlbmNpbEZ1bmM7XHJcblx0XHR0aGlzLnN0ZW5jaWxSZWYgPSBzb3VyY2Uuc3RlbmNpbFJlZjtcclxuXHRcdHRoaXMuc3RlbmNpbEZ1bmNNYXNrID0gc291cmNlLnN0ZW5jaWxGdW5jTWFzaztcclxuXHRcdHRoaXMuc3RlbmNpbEZhaWwgPSBzb3VyY2Uuc3RlbmNpbEZhaWw7XHJcblx0XHR0aGlzLnN0ZW5jaWxaRmFpbCA9IHNvdXJjZS5zdGVuY2lsWkZhaWw7XHJcblx0XHR0aGlzLnN0ZW5jaWxaUGFzcyA9IHNvdXJjZS5zdGVuY2lsWlBhc3M7XHJcblx0XHR0aGlzLnN0ZW5jaWxXcml0ZSA9IHNvdXJjZS5zdGVuY2lsV3JpdGU7XHJcblxyXG5cdFx0Y29uc3Qgc3JjUGxhbmVzID0gc291cmNlLmNsaXBwaW5nUGxhbmVzO1xyXG5cdFx0bGV0IGRzdFBsYW5lcyA9IG51bGw7XHJcblxyXG5cdFx0aWYgKCBzcmNQbGFuZXMgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBuID0gc3JjUGxhbmVzLmxlbmd0aDtcclxuXHRcdFx0ZHN0UGxhbmVzID0gbmV3IEFycmF5KCBuICk7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgIT09IG47ICsrIGkgKSB7XHJcblxyXG5cdFx0XHRcdGRzdFBsYW5lc1sgaSBdID0gc3JjUGxhbmVzWyBpIF0uY2xvbmUoKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5jbGlwcGluZ1BsYW5lcyA9IGRzdFBsYW5lcztcclxuXHRcdHRoaXMuY2xpcEludGVyc2VjdGlvbiA9IHNvdXJjZS5jbGlwSW50ZXJzZWN0aW9uO1xyXG5cdFx0dGhpcy5jbGlwU2hhZG93cyA9IHNvdXJjZS5jbGlwU2hhZG93cztcclxuXHJcblx0XHR0aGlzLnNoYWRvd1NpZGUgPSBzb3VyY2Uuc2hhZG93U2lkZTtcclxuXHJcblx0XHR0aGlzLmNvbG9yV3JpdGUgPSBzb3VyY2UuY29sb3JXcml0ZTtcclxuXHJcblx0XHR0aGlzLnByZWNpc2lvbiA9IHNvdXJjZS5wcmVjaXNpb247XHJcblxyXG5cdFx0dGhpcy5wb2x5Z29uT2Zmc2V0ID0gc291cmNlLnBvbHlnb25PZmZzZXQ7XHJcblx0XHR0aGlzLnBvbHlnb25PZmZzZXRGYWN0b3IgPSBzb3VyY2UucG9seWdvbk9mZnNldEZhY3RvcjtcclxuXHRcdHRoaXMucG9seWdvbk9mZnNldFVuaXRzID0gc291cmNlLnBvbHlnb25PZmZzZXRVbml0cztcclxuXHJcblx0XHR0aGlzLmRpdGhlcmluZyA9IHNvdXJjZS5kaXRoZXJpbmc7XHJcblxyXG5cdFx0dGhpcy5hbHBoYVRlc3QgPSBzb3VyY2UuYWxwaGFUZXN0O1xyXG5cdFx0dGhpcy5hbHBoYUhhc2ggPSBzb3VyY2UuYWxwaGFIYXNoO1xyXG5cdFx0dGhpcy5hbHBoYVRvQ292ZXJhZ2UgPSBzb3VyY2UuYWxwaGFUb0NvdmVyYWdlO1xyXG5cdFx0dGhpcy5wcmVtdWx0aXBsaWVkQWxwaGEgPSBzb3VyY2UucHJlbXVsdGlwbGllZEFscGhhO1xyXG5cdFx0dGhpcy5mb3JjZVNpbmdsZVBhc3MgPSBzb3VyY2UuZm9yY2VTaW5nbGVQYXNzO1xyXG5cclxuXHRcdHRoaXMudmlzaWJsZSA9IHNvdXJjZS52aXNpYmxlO1xyXG5cclxuXHRcdHRoaXMudG9uZU1hcHBlZCA9IHNvdXJjZS50b25lTWFwcGVkO1xyXG5cclxuXHRcdHRoaXMudXNlckRhdGEgPSBKU09OLnBhcnNlKCBKU09OLnN0cmluZ2lmeSggc291cmNlLnVzZXJEYXRhICkgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGcmVlcyB0aGUgR1BVLXJlbGF0ZWQgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGlzIGluc3RhbmNlLiBDYWxsIHRoaXNcclxuXHQgKiBtZXRob2Qgd2hlbmV2ZXIgdGhpcyBpbnN0YW5jZSBpcyBubyBsb25nZXIgdXNlZCBpbiB5b3VyIGFwcC5cclxuXHQgKlxyXG5cdCAqIEBmaXJlcyBNYXRlcmlhbCNkaXNwb3NlXHJcblx0ICovXHJcblx0ZGlzcG9zZSgpIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEZpcmVzIHdoZW4gdGhlIG1hdGVyaWFsIGhhcyBiZWVuIGRpc3Bvc2VkIG9mLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBldmVudCBNYXRlcmlhbCNkaXNwb3NlXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2Rpc3Bvc2UnIH0gKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXR0aW5nIHRoaXMgcHJvcGVydHkgdG8gYHRydWVgIGluZGljYXRlcyB0aGUgZW5naW5lIHRoZSBtYXRlcmlhbFxyXG5cdCAqIG5lZWRzIHRvIGJlIHJlY29tcGlsZWQuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsdWVcclxuXHQgKi9cclxuXHRzZXQgbmVlZHNVcGRhdGUoIHZhbHVlICkge1xyXG5cclxuXHRcdGlmICggdmFsdWUgPT09IHRydWUgKSB0aGlzLnZlcnNpb24gKys7XHJcblxyXG5cdH1cclxuXHJcblx0b25CdWlsZCggLyogc2hhZGVyb2JqZWN0LCByZW5kZXJlciAqLyApIHtcclxuXHJcblx0XHRjb25zb2xlLndhcm4oICdNYXRlcmlhbDogb25CdWlsZCgpIGhhcyBiZWVuIHJlbW92ZWQuJyApOyAvLyBAZGVwcmVjYXRlZCwgcjE2NlxyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBNYXRlcmlhbCB9O1xyXG4iLCJpbXBvcnQgeyBNYXRlcmlhbCB9IGZyb20gJy4vTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyBNdWx0aXBseU9wZXJhdGlvbiB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vbWF0aC9Db2xvci5qcyc7XHJcbmltcG9ydCB7IEV1bGVyIH0gZnJvbSAnLi4vbWF0aC9FdWxlci5qcyc7XHJcblxyXG4vKipcclxuICogQSBtYXRlcmlhbCBmb3IgZHJhd2luZyBnZW9tZXRyaWVzIGluIGEgc2ltcGxlIHNoYWRlZCAoZmxhdCBvciB3aXJlZnJhbWUpIHdheS5cclxuICpcclxuICogVGhpcyBtYXRlcmlhbCBpcyBub3QgYWZmZWN0ZWQgYnkgbGlnaHRzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTWF0ZXJpYWxcclxuICovXHJcbmNsYXNzIE1lc2hCYXNpY01hdGVyaWFsIGV4dGVuZHMgTWF0ZXJpYWwge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG1lc2ggYmFzaWMgbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtZXRlcnNdIC0gQW4gb2JqZWN0IHdpdGggb25lIG9yIG1vcmUgcHJvcGVydGllc1xyXG5cdCAqIGRlZmluaW5nIHRoZSBtYXRlcmlhbCdzIGFwcGVhcmFuY2UuIEFueSBwcm9wZXJ0eSBvZiB0aGUgbWF0ZXJpYWxcclxuXHQgKiAoaW5jbHVkaW5nIGFueSBwcm9wZXJ0eSBmcm9tIGluaGVyaXRlZCBtYXRlcmlhbHMpIGNhbiBiZSBwYXNzZWRcclxuXHQgKiBpbiBoZXJlLiBDb2xvciB2YWx1ZXMgY2FuIGJlIHBhc3NlZCBhbnkgdHlwZSBvZiB2YWx1ZSBhY2NlcHRlZFxyXG5cdCAqIGJ5IHtAbGluayBDb2xvciNzZXR9LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwYXJhbWV0ZXJzICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzTWVzaEJhc2ljTWF0ZXJpYWwgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdNZXNoQmFzaWNNYXRlcmlhbCc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDb2xvciBvZiB0aGUgbWF0ZXJpYWwuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0NvbG9yfVxyXG5cdFx0ICogQGRlZmF1bHQgKDEsMSwxKVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCAweGZmZmZmZiApOyAvLyBlbWlzc2l2ZVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNvbG9yIG1hcC4gTWF5IG9wdGlvbmFsbHkgaW5jbHVkZSBhbiBhbHBoYSBjaGFubmVsLCB0eXBpY2FsbHkgY29tYmluZWRcclxuXHRcdCAqIHdpdGgge0BsaW5rIE1hdGVyaWFsI3RyYW5zcGFyZW50fSBvciB7QGxpbmsgTWF0ZXJpYWwjYWxwaGFUZXN0fS4gVGhlIHRleHR1cmUgbWFwXHJcblx0XHQgKiBjb2xvciBpcyBtb2R1bGF0ZWQgYnkgdGhlIGRpZmZ1c2UgYGNvbG9yYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBsaWdodCBtYXAuIFJlcXVpcmVzIGEgc2Vjb25kIHNldCBvZiBVVnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxpZ2h0TWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEludGVuc2l0eSBvZiB0aGUgYmFrZWQgbGlnaHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5saWdodE1hcEludGVuc2l0eSA9IDEuMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByZWQgY2hhbm5lbCBvZiB0aGlzIHRleHR1cmUgaXMgdXNlZCBhcyB0aGUgYW1iaWVudCBvY2NsdXNpb24gbWFwLlxyXG5cdFx0ICogUmVxdWlyZXMgYSBzZWNvbmQgc2V0IG9mIFVWcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYW9NYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSW50ZW5zaXR5IG9mIHRoZSBhbWJpZW50IG9jY2x1c2lvbiBlZmZlY3QuIFJhbmdlIGlzIGBbMCwxXWAsIHdoZXJlIGAwYFxyXG5cdFx0ICogZGlzYWJsZXMgYW1iaWVudCBvY2NsdXNpb24uIFdoZXJlIGludGVuc2l0eSBpcyBgMWAgYW5kIHRoZSBBTyBtYXAnc1xyXG5cdFx0ICogcmVkIGNoYW5uZWwgaXMgYWxzbyBgMWAsIGFtYmllbnQgbGlnaHQgaXMgZnVsbHkgb2NjbHVkZWQgb24gYSBzdXJmYWNlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSAxLjA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTcGVjdWxhciBtYXAgdXNlZCBieSB0aGUgbWF0ZXJpYWwuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNwZWN1bGFyTWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBhbHBoYSBtYXAgaXMgYSBncmF5c2NhbGUgdGV4dHVyZSB0aGF0IGNvbnRyb2xzIHRoZSBvcGFjaXR5IGFjcm9zcyB0aGVcclxuXHRcdCAqIHN1cmZhY2UgKGJsYWNrOiBmdWxseSB0cmFuc3BhcmVudDsgd2hpdGU6IGZ1bGx5IG9wYXF1ZSkuXHJcblx0XHQgKlxyXG5cdFx0ICogT25seSB0aGUgY29sb3Igb2YgdGhlIHRleHR1cmUgaXMgdXNlZCwgaWdub3JpbmcgdGhlIGFscGhhIGNoYW5uZWwgaWYgb25lXHJcblx0XHQgKiBleGlzdHMuIEZvciBSR0IgYW5kIFJHQkEgdGV4dHVyZXMsIHRoZSByZW5kZXJlciB3aWxsIHVzZSB0aGUgZ3JlZW4gY2hhbm5lbFxyXG5cdFx0ICogd2hlbiBzYW1wbGluZyB0aGlzIHRleHR1cmUgZHVlIHRvIHRoZSBleHRyYSBiaXQgb2YgcHJlY2lzaW9uIHByb3ZpZGVkIGZvclxyXG5cdFx0ICogZ3JlZW4gaW4gRFhULWNvbXByZXNzZWQgYW5kIHVuY29tcHJlc3NlZCBSR0IgNTY1IGZvcm1hdHMuIEx1bWluYW5jZS1vbmx5IGFuZFxyXG5cdFx0ICogbHVtaW5hbmNlL2FscGhhIHRleHR1cmVzIHdpbGwgYWxzbyBzdGlsbCB3b3JrIGFzIGV4cGVjdGVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hbHBoYU1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZW52aXJvbm1lbnQgbWFwLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5lbnZNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJvdGF0aW9uIG9mIHRoZSBlbnZpcm9ubWVudCBtYXAgaW4gcmFkaWFucy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7RXVsZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAoMCwwLDApXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZW52TWFwUm90YXRpb24gPSBuZXcgRXVsZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvdyB0byBjb21iaW5lIHRoZSByZXN1bHQgb2YgdGhlIHN1cmZhY2UncyBjb2xvciB3aXRoIHRoZSBlbnZpcm9ubWVudCBtYXAsIGlmIGFueS5cclxuXHRcdCAqXHJcblx0XHQgKiBXaGVuIHNldCB0byBgTWl4T3BlcmF0aW9uYCwgdGhlIHtAbGluayBNZXNoQmFzaWNNYXRlcmlhbCNyZWZsZWN0aXZpdHl9IGlzIHVzZWQgdG9cclxuXHRcdCAqIGJsZW5kIGJldHdlZW4gdGhlIHR3byBjb2xvcnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeyhNdWx0aXBseU9wZXJhdGlvbnxNaXhPcGVyYXRpb258QWRkT3BlcmF0aW9uKX1cclxuXHRcdCAqIEBkZWZhdWx0IE11bHRpcGx5T3BlcmF0aW9uXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29tYmluZSA9IE11bHRpcGx5T3BlcmF0aW9uO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG93IG11Y2ggdGhlIGVudmlyb25tZW50IG1hcCBhZmZlY3RzIHRoZSBzdXJmYWNlLlxyXG5cdFx0ICogVGhlIHZhbGlkIHJhbmdlIGlzIGJldHdlZW4gYDBgIChubyByZWZsZWN0aW9ucykgYW5kIGAxYCAoZnVsbCByZWZsZWN0aW9ucykuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yZWZsZWN0aXZpdHkgPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGluZGV4IG9mIHJlZnJhY3Rpb24gKElPUikgb2YgYWlyIChhcHByb3hpbWF0ZWx5IDEpIGRpdmlkZWQgYnkgdGhlXHJcblx0XHQgKiBpbmRleCBvZiByZWZyYWN0aW9uIG9mIHRoZSBtYXRlcmlhbC4gSXQgaXMgdXNlZCB3aXRoIGVudmlyb25tZW50IG1hcHBpbmdcclxuXHRcdCAqIG1vZGVzIHtAbGluayBDdWJlUmVmcmFjdGlvbk1hcHBpbmd9IGFuZCB7QGxpbmsgRXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmd9LlxyXG5cdFx0ICogVGhlIHJlZnJhY3Rpb24gcmF0aW8gc2hvdWxkIG5vdCBleGNlZWQgYDFgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwLjk4XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVmcmFjdGlvblJhdGlvID0gMC45ODtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlbmRlcnMgdGhlIGdlb21ldHJ5IGFzIGEgd2lyZWZyYW1lLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy53aXJlZnJhbWUgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENvbnRyb2xzIHRoZSB0aGlja25lc3Mgb2YgdGhlIHdpcmVmcmFtZS5cclxuXHRcdCAqXHJcblx0XHQgKiBDYW4gb25seSBiZSB1c2VkIHdpdGgge0BsaW5rIFNWR1JlbmRlcmVyfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIGFwcGVhcmFuY2Ugb2Ygd2lyZWZyYW1lIGVuZHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQ2FuIG9ubHkgYmUgdXNlZCB3aXRoIHtAbGluayBTVkdSZW5kZXJlcn0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeygncm91bmQnfCdiZXZlbCd8J21pdGVyJyl9XHJcblx0XHQgKiBAZGVmYXVsdCAncm91bmQnXHJcblx0XHQgKi9cclxuXHRcdHRoaXMud2lyZWZyYW1lTGluZWNhcCA9ICdyb3VuZCc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIGFwcGVhcmFuY2Ugb2Ygd2lyZWZyYW1lIGpvaW50cy5cclxuXHRcdCAqXHJcblx0XHQgKiBDYW4gb25seSBiZSB1c2VkIHdpdGgge0BsaW5rIFNWR1JlbmRlcmVyfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KCdyb3VuZCd8J2JldmVsJ3wnbWl0ZXInKX1cclxuXHRcdCAqIEBkZWZhdWx0ICdyb3VuZCdcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy53aXJlZnJhbWVMaW5lam9pbiA9ICdyb3VuZCc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSBtYXRlcmlhbCBpcyBhZmZlY3RlZCBieSBmb2cgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZvZyA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcclxuXHJcblx0XHR0aGlzLm1hcCA9IHNvdXJjZS5tYXA7XHJcblxyXG5cdFx0dGhpcy5saWdodE1hcCA9IHNvdXJjZS5saWdodE1hcDtcclxuXHRcdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSBzb3VyY2UubGlnaHRNYXBJbnRlbnNpdHk7XHJcblxyXG5cdFx0dGhpcy5hb01hcCA9IHNvdXJjZS5hb01hcDtcclxuXHRcdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSBzb3VyY2UuYW9NYXBJbnRlbnNpdHk7XHJcblxyXG5cdFx0dGhpcy5zcGVjdWxhck1hcCA9IHNvdXJjZS5zcGVjdWxhck1hcDtcclxuXHJcblx0XHR0aGlzLmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwO1xyXG5cclxuXHRcdHRoaXMuZW52TWFwID0gc291cmNlLmVudk1hcDtcclxuXHRcdHRoaXMuZW52TWFwUm90YXRpb24uY29weSggc291cmNlLmVudk1hcFJvdGF0aW9uICk7XHJcblx0XHR0aGlzLmNvbWJpbmUgPSBzb3VyY2UuY29tYmluZTtcclxuXHRcdHRoaXMucmVmbGVjdGl2aXR5ID0gc291cmNlLnJlZmxlY3Rpdml0eTtcclxuXHRcdHRoaXMucmVmcmFjdGlvblJhdGlvID0gc291cmNlLnJlZnJhY3Rpb25SYXRpbztcclxuXHJcblx0XHR0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7XHJcblx0XHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7XHJcblx0XHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSBzb3VyY2Uud2lyZWZyYW1lTGluZWNhcDtcclxuXHRcdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSBzb3VyY2Uud2lyZWZyYW1lTGluZWpvaW47XHJcblxyXG5cdFx0dGhpcy5mb2cgPSBzb3VyY2UuZm9nO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBNZXNoQmFzaWNNYXRlcmlhbCB9O1xyXG4iLCJpbXBvcnQgeyBjbGFtcCB9IGZyb20gJy4uL21hdGgvTWF0aFV0aWxzLmpzJztcclxuXHJcbi8vIEZhc3QgSGFsZiBGbG9hdCBDb252ZXJzaW9ucywgaHR0cDovL3d3dy5mb3gtdG9vbGtpdC5vcmcvZnRwL2Zhc3RoYWxmZmxvYXRjb252ZXJzaW9uLnBkZlxyXG5cclxuY29uc3QgX3RhYmxlcyA9IC8qQF9fUFVSRV9fKi8gX2dlbmVyYXRlVGFibGVzKCk7XHJcblxyXG5mdW5jdGlvbiBfZ2VuZXJhdGVUYWJsZXMoKSB7XHJcblxyXG5cdC8vIGZsb2F0MzIgdG8gZmxvYXQxNiBoZWxwZXJzXHJcblxyXG5cdGNvbnN0IGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlciggNCApO1xyXG5cdGNvbnN0IGZsb2F0VmlldyA9IG5ldyBGbG9hdDMyQXJyYXkoIGJ1ZmZlciApO1xyXG5cdGNvbnN0IHVpbnQzMlZpZXcgPSBuZXcgVWludDMyQXJyYXkoIGJ1ZmZlciApO1xyXG5cclxuXHRjb25zdCBiYXNlVGFibGUgPSBuZXcgVWludDMyQXJyYXkoIDUxMiApO1xyXG5cdGNvbnN0IHNoaWZ0VGFibGUgPSBuZXcgVWludDMyQXJyYXkoIDUxMiApO1xyXG5cclxuXHRmb3IgKCBsZXQgaSA9IDA7IGkgPCAyNTY7ICsrIGkgKSB7XHJcblxyXG5cdFx0Y29uc3QgZSA9IGkgLSAxMjc7XHJcblxyXG5cdFx0Ly8gdmVyeSBzbWFsbCBudW1iZXIgKDAsIC0wKVxyXG5cclxuXHRcdGlmICggZSA8IC0gMjcgKSB7XHJcblxyXG5cdFx0XHRiYXNlVGFibGVbIGkgXSA9IDB4MDAwMDtcclxuXHRcdFx0YmFzZVRhYmxlWyBpIHwgMHgxMDAgXSA9IDB4ODAwMDtcclxuXHRcdFx0c2hpZnRUYWJsZVsgaSBdID0gMjQ7XHJcblx0XHRcdHNoaWZ0VGFibGVbIGkgfCAweDEwMCBdID0gMjQ7XHJcblxyXG5cdFx0XHQvLyBzbWFsbCBudW1iZXIgKGRlbm9ybSlcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBlIDwgLSAxNCApIHtcclxuXHJcblx0XHRcdGJhc2VUYWJsZVsgaSBdID0gMHgwNDAwID4+ICggLSBlIC0gMTQgKTtcclxuXHRcdFx0YmFzZVRhYmxlWyBpIHwgMHgxMDAgXSA9ICggMHgwNDAwID4+ICggLSBlIC0gMTQgKSApIHwgMHg4MDAwO1xyXG5cdFx0XHRzaGlmdFRhYmxlWyBpIF0gPSAtIGUgLSAxO1xyXG5cdFx0XHRzaGlmdFRhYmxlWyBpIHwgMHgxMDAgXSA9IC0gZSAtIDE7XHJcblxyXG5cdFx0XHQvLyBub3JtYWwgbnVtYmVyXHJcblxyXG5cdFx0fSBlbHNlIGlmICggZSA8PSAxNSApIHtcclxuXHJcblx0XHRcdGJhc2VUYWJsZVsgaSBdID0gKCBlICsgMTUgKSA8PCAxMDtcclxuXHRcdFx0YmFzZVRhYmxlWyBpIHwgMHgxMDAgXSA9ICggKCBlICsgMTUgKSA8PCAxMCApIHwgMHg4MDAwO1xyXG5cdFx0XHRzaGlmdFRhYmxlWyBpIF0gPSAxMztcclxuXHRcdFx0c2hpZnRUYWJsZVsgaSB8IDB4MTAwIF0gPSAxMztcclxuXHJcblx0XHRcdC8vIGxhcmdlIG51bWJlciAoSW5maW5pdHksIC1JbmZpbml0eSlcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBlIDwgMTI4ICkge1xyXG5cclxuXHRcdFx0YmFzZVRhYmxlWyBpIF0gPSAweDdjMDA7XHJcblx0XHRcdGJhc2VUYWJsZVsgaSB8IDB4MTAwIF0gPSAweGZjMDA7XHJcblx0XHRcdHNoaWZ0VGFibGVbIGkgXSA9IDI0O1xyXG5cdFx0XHRzaGlmdFRhYmxlWyBpIHwgMHgxMDAgXSA9IDI0O1xyXG5cclxuXHRcdFx0Ly8gc3RheSAoTmFOLCBJbmZpbml0eSwgLUluZmluaXR5KVxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRiYXNlVGFibGVbIGkgXSA9IDB4N2MwMDtcclxuXHRcdFx0YmFzZVRhYmxlWyBpIHwgMHgxMDAgXSA9IDB4ZmMwMDtcclxuXHRcdFx0c2hpZnRUYWJsZVsgaSBdID0gMTM7XHJcblx0XHRcdHNoaWZ0VGFibGVbIGkgfCAweDEwMCBdID0gMTM7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8vIGZsb2F0MTYgdG8gZmxvYXQzMiBoZWxwZXJzXHJcblxyXG5cdGNvbnN0IG1hbnRpc3NhVGFibGUgPSBuZXcgVWludDMyQXJyYXkoIDIwNDggKTtcclxuXHRjb25zdCBleHBvbmVudFRhYmxlID0gbmV3IFVpbnQzMkFycmF5KCA2NCApO1xyXG5cdGNvbnN0IG9mZnNldFRhYmxlID0gbmV3IFVpbnQzMkFycmF5KCA2NCApO1xyXG5cclxuXHRmb3IgKCBsZXQgaSA9IDE7IGkgPCAxMDI0OyArKyBpICkge1xyXG5cclxuXHRcdGxldCBtID0gaSA8PCAxMzsgLy8gemVybyBwYWQgbWFudGlzc2EgYml0c1xyXG5cdFx0bGV0IGUgPSAwOyAvLyB6ZXJvIGV4cG9uZW50XHJcblxyXG5cdFx0Ly8gbm9ybWFsaXplZFxyXG5cdFx0d2hpbGUgKCAoIG0gJiAweDAwODAwMDAwICkgPT09IDAgKSB7XHJcblxyXG5cdFx0XHRtIDw8PSAxO1xyXG5cdFx0XHRlIC09IDB4MDA4MDAwMDA7IC8vIGRlY3JlbWVudCBleHBvbmVudFxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRtICY9IH4gMHgwMDgwMDAwMDsgLy8gY2xlYXIgbGVhZGluZyAxIGJpdFxyXG5cdFx0ZSArPSAweDM4ODAwMDAwOyAvLyBhZGp1c3QgYmlhc1xyXG5cclxuXHRcdG1hbnRpc3NhVGFibGVbIGkgXSA9IG0gfCBlO1xyXG5cclxuXHR9XHJcblxyXG5cdGZvciAoIGxldCBpID0gMTAyNDsgaSA8IDIwNDg7ICsrIGkgKSB7XHJcblxyXG5cdFx0bWFudGlzc2FUYWJsZVsgaSBdID0gMHgzODAwMDAwMCArICggKCBpIC0gMTAyNCApIDw8IDEzICk7XHJcblxyXG5cdH1cclxuXHJcblx0Zm9yICggbGV0IGkgPSAxOyBpIDwgMzE7ICsrIGkgKSB7XHJcblxyXG5cdFx0ZXhwb25lbnRUYWJsZVsgaSBdID0gaSA8PCAyMztcclxuXHJcblx0fVxyXG5cclxuXHRleHBvbmVudFRhYmxlWyAzMSBdID0gMHg0NzgwMDAwMDtcclxuXHRleHBvbmVudFRhYmxlWyAzMiBdID0gMHg4MDAwMDAwMDtcclxuXHJcblx0Zm9yICggbGV0IGkgPSAzMzsgaSA8IDYzOyArKyBpICkge1xyXG5cclxuXHRcdGV4cG9uZW50VGFibGVbIGkgXSA9IDB4ODAwMDAwMDAgKyAoICggaSAtIDMyICkgPDwgMjMgKTtcclxuXHJcblx0fVxyXG5cclxuXHRleHBvbmVudFRhYmxlWyA2MyBdID0gMHhjNzgwMDAwMDtcclxuXHJcblx0Zm9yICggbGV0IGkgPSAxOyBpIDwgNjQ7ICsrIGkgKSB7XHJcblxyXG5cdFx0aWYgKCBpICE9PSAzMiApIHtcclxuXHJcblx0XHRcdG9mZnNldFRhYmxlWyBpIF0gPSAxMDI0O1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4ge1xyXG5cdFx0ZmxvYXRWaWV3OiBmbG9hdFZpZXcsXHJcblx0XHR1aW50MzJWaWV3OiB1aW50MzJWaWV3LFxyXG5cdFx0YmFzZVRhYmxlOiBiYXNlVGFibGUsXHJcblx0XHRzaGlmdFRhYmxlOiBzaGlmdFRhYmxlLFxyXG5cdFx0bWFudGlzc2FUYWJsZTogbWFudGlzc2FUYWJsZSxcclxuXHRcdGV4cG9uZW50VGFibGU6IGV4cG9uZW50VGFibGUsXHJcblx0XHRvZmZzZXRUYWJsZTogb2Zmc2V0VGFibGVcclxuXHR9O1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSBoYWxmIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCB2YWx1ZSAoRlAxNikgZnJvbSB0aGUgZ2l2ZW4gc2luZ2xlXHJcbiAqIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCB2YWx1ZSAoRlAzMikuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWwgLSBBIHNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgdmFsdWUuXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIEZQMTYgdmFsdWUuXHJcbiAqL1xyXG5mdW5jdGlvbiB0b0hhbGZGbG9hdCggdmFsICkge1xyXG5cclxuXHRpZiAoIE1hdGguYWJzKCB2YWwgKSA+IDY1NTA0ICkgY29uc29sZS53YXJuKCAnVEhSRUUuRGF0YVV0aWxzLnRvSGFsZkZsb2F0KCk6IFZhbHVlIG91dCBvZiByYW5nZS4nICk7XHJcblxyXG5cdHZhbCA9IGNsYW1wKCB2YWwsIC0gNjU1MDQsIDY1NTA0ICk7XHJcblxyXG5cdF90YWJsZXMuZmxvYXRWaWV3WyAwIF0gPSB2YWw7XHJcblx0Y29uc3QgZiA9IF90YWJsZXMudWludDMyVmlld1sgMCBdO1xyXG5cdGNvbnN0IGUgPSAoIGYgPj4gMjMgKSAmIDB4MWZmO1xyXG5cdHJldHVybiBfdGFibGVzLmJhc2VUYWJsZVsgZSBdICsgKCAoIGYgJiAweDAwN2ZmZmZmICkgPj4gX3RhYmxlcy5zaGlmdFRhYmxlWyBlIF0gKTtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgc2luZ2xlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCB2YWx1ZSAoRlAzMikgZnJvbSB0aGUgZ2l2ZW4gaGFsZlxyXG4gKiBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgdmFsdWUgKEZQMTYpLlxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsIC0gQSBoYWxmIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCB2YWx1ZS5cclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgRlAzMiB2YWx1ZS5cclxuICovXHJcbmZ1bmN0aW9uIGZyb21IYWxmRmxvYXQoIHZhbCApIHtcclxuXHJcblx0Y29uc3QgbSA9IHZhbCA+PiAxMDtcclxuXHRfdGFibGVzLnVpbnQzMlZpZXdbIDAgXSA9IF90YWJsZXMubWFudGlzc2FUYWJsZVsgX3RhYmxlcy5vZmZzZXRUYWJsZVsgbSBdICsgKCB2YWwgJiAweDNmZiApIF0gKyBfdGFibGVzLmV4cG9uZW50VGFibGVbIG0gXTtcclxuXHRyZXR1cm4gX3RhYmxlcy5mbG9hdFZpZXdbIDAgXTtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBIGNsYXNzIGNvbnRhaW5pbmcgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGRhdGEuXHJcbiAqXHJcbiAqIEBoaWRlY29uc3RydWN0b3JcclxuICovXHJcbmNsYXNzIERhdGFVdGlscyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBoYWxmIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCB2YWx1ZSAoRlAxNikgZnJvbSB0aGUgZ2l2ZW4gc2luZ2xlXHJcblx0ICogcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IHZhbHVlIChGUDMyKS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB2YWwgLSBBIHNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgdmFsdWUuXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgRlAxNiB2YWx1ZS5cclxuXHQgKi9cclxuXHRzdGF0aWMgdG9IYWxmRmxvYXQoIHZhbCApIHtcclxuXHJcblx0XHRyZXR1cm4gdG9IYWxmRmxvYXQoIHZhbCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBzaW5nbGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IHZhbHVlIChGUDMyKSBmcm9tIHRoZSBnaXZlbiBoYWxmXHJcblx0ICogcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IHZhbHVlIChGUDE2KS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB2YWwgLSBBIGhhbGYgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IHZhbHVlLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIEZQMzIgdmFsdWUuXHJcblx0ICovXHJcblx0c3RhdGljIGZyb21IYWxmRmxvYXQoIHZhbCApIHtcclxuXHJcblx0XHRyZXR1cm4gZnJvbUhhbGZGbG9hdCggdmFsICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7XHJcblx0dG9IYWxmRmxvYXQsXHJcblx0ZnJvbUhhbGZGbG9hdCxcclxuXHREYXRhVXRpbHNcclxufTtcclxuIiwiaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjIuanMnO1xyXG5pbXBvcnQgeyBkZW5vcm1hbGl6ZSwgbm9ybWFsaXplIH0gZnJvbSAnLi4vbWF0aC9NYXRoVXRpbHMuanMnO1xyXG5pbXBvcnQgeyBTdGF0aWNEcmF3VXNhZ2UsIEZsb2F0VHlwZSB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IGZyb21IYWxmRmxvYXQsIHRvSGFsZkZsb2F0IH0gZnJvbSAnLi4vZXh0cmFzL0RhdGFVdGlscy5qcyc7XHJcblxyXG5jb25zdCBfdmVjdG9yID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfdmVjdG9yMiA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjIoKTtcclxuXHJcbmxldCBfaWQgPSAwO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgY2xhc3Mgc3RvcmVzIGRhdGEgZm9yIGFuIGF0dHJpYnV0ZSAoc3VjaCBhcyB2ZXJ0ZXggcG9zaXRpb25zLCBmYWNlXHJcbiAqIGluZGljZXMsIG5vcm1hbHMsIGNvbG9ycywgVVZzLCBhbmQgYW55IGN1c3RvbSBhdHRyaWJ1dGVzICkgYXNzb2NpYXRlZCB3aXRoXHJcbiAqIGEgZ2VvbWV0cnksIHdoaWNoIGFsbG93cyBmb3IgbW9yZSBlZmZpY2llbnQgcGFzc2luZyBvZiBkYXRhIHRvIHRoZSBHUFUuXHJcbiAqXHJcbiAqIFdoZW4gd29ya2luZyB3aXRoIHZlY3Rvci1saWtlIGRhdGEsIHRoZSBgZnJvbUJ1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlLCBpbmRleCApYFxyXG4gKiBoZWxwZXIgbWV0aG9kcyBvbiB2ZWN0b3IgYW5kIGNvbG9yIGNsYXNzIG1pZ2h0IGJlIGhlbHBmdWwuIEUuZy4ge0BsaW5rIFZlY3RvcjMjZnJvbUJ1ZmZlckF0dHJpYnV0ZX0uXHJcbiAqL1xyXG5jbGFzcyBCdWZmZXJBdHRyaWJ1dGUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1R5cGVkQXJyYXl9IGFycmF5IC0gVGhlIGFycmF5IGhvbGRpbmcgdGhlIGF0dHJpYnV0ZSBkYXRhLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpdGVtU2l6ZSAtIFRoZSBpdGVtIHNpemUuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbbm9ybWFsaXplZD1mYWxzZV0gLSBXaGV0aGVyIHRoZSBkYXRhIGFyZSBub3JtYWxpemVkIG9yIG5vdC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkID0gZmFsc2UgKSB7XHJcblxyXG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCBhcnJheSApICkge1xyXG5cclxuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvciggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogYXJyYXkgc2hvdWxkIGJlIGEgVHlwZWQgQXJyYXkuJyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNCdWZmZXJBdHRyaWJ1dGUgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIElEIG9mIHRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBuYW1lIEJ1ZmZlckF0dHJpYnV0ZSNpZFxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICovXHJcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsICdpZCcsIHsgdmFsdWU6IF9pZCArKyB9ICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbmFtZSBvZiB0aGUgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5hbWUgPSAnJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBhcnJheSBob2xkaW5nIHRoZSBhdHRyaWJ1dGUgZGF0YS4gSXQgc2hvdWxkIGhhdmUgYGl0ZW1TaXplICogbnVtVmVydGljZXNgXHJcblx0XHQgKiBlbGVtZW50cywgd2hlcmUgYG51bVZlcnRpY2VzYCBpcyB0aGUgbnVtYmVyIG9mIHZlcnRpY2VzIGluIHRoZSBhc3NvY2lhdGVkIGdlb21ldHJ5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtUeXBlZEFycmF5fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFycmF5ID0gYXJyYXk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbnVtYmVyIG9mIHZhbHVlcyBvZiB0aGUgYXJyYXkgdGhhdCBzaG91bGQgYmUgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciB2ZXJ0ZXguXHJcblx0XHQgKiBGb3IgaW5zdGFuY2UsIGlmIHRoaXMgYXR0cmlidXRlIGlzIHN0b3JpbmcgYSAzLWNvbXBvbmVudCB2ZWN0b3IgKHN1Y2ggYXMgYSBwb3NpdGlvbixcclxuXHRcdCAqIG5vcm1hbCwgb3IgY29sb3IpLCB0aGVuIHRoZSB2YWx1ZSBzaG91bGQgYmUgYDNgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXRlbVNpemUgPSBpdGVtU2l6ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlcHJlc2VudHMgdGhlIG51bWJlciBvZiBpdGVtcyB0aGlzIGJ1ZmZlciBhdHRyaWJ1dGUgc3RvcmVzLiBJdCBpcyBpbnRlcm5hbGx5IGNvbXB1dGVkXHJcblx0XHQgKiBieSBkaXZpZGluZyB0aGUgYGFycmF5YCBsZW5ndGggYnkgdGhlIGBpdGVtU2l6ZWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvdW50ID0gYXJyYXkgIT09IHVuZGVmaW5lZCA/IGFycmF5Lmxlbmd0aCAvIGl0ZW1TaXplIDogMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFwcGxpZXMgdG8gaW50ZWdlciBkYXRhIG9ubHkuIEluZGljYXRlcyBob3cgdGhlIHVuZGVybHlpbmcgZGF0YSBpbiB0aGUgYnVmZmVyIG1hcHMgdG9cclxuXHRcdCAqIHRoZSB2YWx1ZXMgaW4gdGhlIEdMU0wgY29kZS4gRm9yIGluc3RhbmNlLCBpZiBgYXJyYXlgIGlzIGFuIGluc3RhbmNlIG9mIGBVSW50MTZBcnJheWAsXHJcblx0XHQgKiBhbmQgYG5vcm1hbGl6ZWRgIGlzIGB0cnVlYCwgdGhlIHZhbHVlcyBgMCAtKzY1NTM1YCBpbiB0aGUgYXJyYXkgZGF0YSB3aWxsIGJlIG1hcHBlZCB0b1xyXG5cdFx0ICogYDAuMGYgLSArMS4wZmAgaW4gdGhlIEdMU0wgYXR0cmlidXRlLiBJZiBgbm9ybWFsaXplZGAgaXMgYGZhbHNlYCwgdGhlIHZhbHVlcyB3aWxsIGJlIGNvbnZlcnRlZFxyXG5cdFx0ICogdG8gZmxvYXRzIHVubW9kaWZpZWQsIGkuZS4gYDY1NTM1YCBiZWNvbWVzIGA2NTUzNS4wZmAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQ7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIHRoZSBpbnRlbmRlZCB1c2FnZSBwYXR0ZXJuIG9mIHRoZSBkYXRhIHN0b3JlIGZvciBvcHRpbWl6YXRpb24gcHVycG9zZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogTm90ZTogQWZ0ZXIgdGhlIGluaXRpYWwgdXNlIG9mIGEgYnVmZmVyLCBpdHMgdXNhZ2UgY2Fubm90IGJlIGNoYW5nZWQuIEluc3RlYWQsXHJcblx0XHQgKiBpbnN0YW50aWF0ZSBhIG5ldyBvbmUgYW5kIHNldCB0aGUgZGVzaXJlZCB1c2FnZSBiZWZvcmUgdGhlIG5leHQgcmVuZGVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoU3RhdGljRHJhd1VzYWdlfER5bmFtaWNEcmF3VXNhZ2V8U3RyZWFtRHJhd1VzYWdlfFN0YXRpY1JlYWRVc2FnZXxEeW5hbWljUmVhZFVzYWdlfFN0cmVhbVJlYWRVc2FnZXxTdGF0aWNDb3B5VXNhZ2V8RHluYW1pY0NvcHlVc2FnZXxTdHJlYW1Db3B5VXNhZ2UpfVxyXG5cdFx0ICogQGRlZmF1bHQgU3RhdGljRHJhd1VzYWdlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXNhZ2UgPSBTdGF0aWNEcmF3VXNhZ2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIG9ubHkgdXBkYXRlIHNvbWUgY29tcG9uZW50cyBvZiBzdG9yZWQgdmVjdG9ycyAoZm9yIGV4YW1wbGUsIGp1c3QgdGhlXHJcblx0XHQgKiBjb21wb25lbnQgcmVsYXRlZCB0byBjb2xvcikuIFVzZSB0aGUgYGFkZFVwZGF0ZVJhbmdlKClgIGZ1bmN0aW9uIHRvIGFkZCByYW5nZXMgdG8gdGhpcyBhcnJheS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8T2JqZWN0Pn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51cGRhdGVSYW5nZXMgPSBbXTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENvbmZpZ3VyZXMgdGhlIGJvdW5kIEdQVSB0eXBlIGZvciB1c2UgaW4gc2hhZGVycy5cclxuXHRcdCAqXHJcblx0XHQgKiBOb3RlOiB0aGlzIG9ubHkgaGFzIGFuIGVmZmVjdCBmb3IgaW50ZWdlciBhcnJheXMgYW5kIGlzIG5vdCBjb25maWd1cmFibGUgZm9yIGZsb2F0IGFycmF5cy5cclxuXHRcdCAqIEZvciBsb3dlciBwcmVjaXNpb24gZmxvYXQgdHlwZXMsIHVzZSBgRmxvYXQxNkJ1ZmZlckF0dHJpYnV0ZWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeyhGbG9hdFR5cGV8SW50VHlwZSl9XHJcblx0XHQgKiBAZGVmYXVsdCBGbG9hdFR5cGVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ncHVUeXBlID0gRmxvYXRUeXBlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSB2ZXJzaW9uIG51bWJlciwgaW5jcmVtZW50ZWQgZXZlcnkgdGltZSB0aGUgYG5lZWRzVXBkYXRlYCBpcyBzZXQgdG8gYHRydWVgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudmVyc2lvbiA9IDA7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGV4ZWN1dGVkIGFmdGVyIHRoZSByZW5kZXJlciBoYXMgdHJhbnNmZXJyZWQgdGhlIGF0dHJpYnV0ZVxyXG5cdCAqIGFycmF5IGRhdGEgdG8gdGhlIEdQVS5cclxuXHQgKi9cclxuXHRvblVwbG9hZENhbGxiYWNrKCkge31cclxuXHJcblx0LyoqXHJcblx0ICogRmxhZyB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgYXR0cmlidXRlIGhhcyBjaGFuZ2VkIGFuZCBzaG91bGQgYmUgcmUtc2VudCB0b1xyXG5cdCAqIHRoZSBHUFUuIFNldCB0aGlzIHRvIGB0cnVlYCB3aGVuIHlvdSBtb2RpZnkgdGhlIHZhbHVlIG9mIHRoZSBhcnJheS5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbHVlXHJcblx0ICovXHJcblx0c2V0IG5lZWRzVXBkYXRlKCB2YWx1ZSApIHtcclxuXHJcblx0XHRpZiAoIHZhbHVlID09PSB0cnVlICkgdGhpcy52ZXJzaW9uICsrO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHVzYWdlIG9mIHRoaXMgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7KFN0YXRpY0RyYXdVc2FnZXxEeW5hbWljRHJhd1VzYWdlfFN0cmVhbURyYXdVc2FnZXxTdGF0aWNSZWFkVXNhZ2V8RHluYW1pY1JlYWRVc2FnZXxTdHJlYW1SZWFkVXNhZ2V8U3RhdGljQ29weVVzYWdlfER5bmFtaWNDb3B5VXNhZ2V8U3RyZWFtQ29weVVzYWdlKX0gdmFsdWUgLSBUaGUgdXNhZ2UgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge0J1ZmZlckF0dHJpYnV0ZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqL1xyXG5cdHNldFVzYWdlKCB2YWx1ZSApIHtcclxuXHJcblx0XHR0aGlzLnVzYWdlID0gdmFsdWU7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyBhIHJhbmdlIG9mIGRhdGEgaW4gdGhlIGRhdGEgYXJyYXkgdG8gYmUgdXBkYXRlZCBvbiB0aGUgR1BVLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IC0gUG9zaXRpb24gYXQgd2hpY2ggdG8gc3RhcnQgdXBkYXRlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudCAtIFRoZSBudW1iZXIgb2YgY29tcG9uZW50cyB0byB1cGRhdGUuXHJcblx0ICovXHJcblx0YWRkVXBkYXRlUmFuZ2UoIHN0YXJ0LCBjb3VudCApIHtcclxuXHJcblx0XHR0aGlzLnVwZGF0ZVJhbmdlcy5wdXNoKCB7IHN0YXJ0LCBjb3VudCB9ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2xlYXJzIHRoZSB1cGRhdGUgcmFuZ2VzLlxyXG5cdCAqL1xyXG5cdGNsZWFyVXBkYXRlUmFuZ2VzKCkge1xyXG5cclxuXHRcdHRoaXMudXBkYXRlUmFuZ2VzLmxlbmd0aCA9IDA7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29waWVzIHRoZSB2YWx1ZXMgb2YgdGhlIGdpdmVuIGJ1ZmZlciBhdHRyaWJ1dGUgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyQXR0cmlidXRlfSBzb3VyY2UgLSBUaGUgYnVmZmVyIGF0dHJpYnV0ZSB0byBjb3B5LlxyXG5cdCAqIEByZXR1cm4ge0J1ZmZlckF0dHJpYnV0ZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0dGhpcy5uYW1lID0gc291cmNlLm5hbWU7XHJcblx0XHR0aGlzLmFycmF5ID0gbmV3IHNvdXJjZS5hcnJheS5jb25zdHJ1Y3Rvciggc291cmNlLmFycmF5ICk7XHJcblx0XHR0aGlzLml0ZW1TaXplID0gc291cmNlLml0ZW1TaXplO1xyXG5cdFx0dGhpcy5jb3VudCA9IHNvdXJjZS5jb3VudDtcclxuXHRcdHRoaXMubm9ybWFsaXplZCA9IHNvdXJjZS5ub3JtYWxpemVkO1xyXG5cclxuXHRcdHRoaXMudXNhZ2UgPSBzb3VyY2UudXNhZ2U7XHJcblx0XHR0aGlzLmdwdVR5cGUgPSBzb3VyY2UuZ3B1VHlwZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb3BpZXMgYSB2ZWN0b3IgZnJvbSB0aGUgZ2l2ZW4gYnVmZmVyIGF0dHJpYnV0ZSB0byB0aGlzIG9uZS4gVGhlIHN0YXJ0XHJcblx0ICogYW5kIGRlc3RpbmF0aW9uIHBvc2l0aW9uIGluIHRoZSBhdHRyaWJ1dGUgYnVmZmVycyBhcmUgcmVwcmVzZW50ZWQgYnkgdGhlXHJcblx0ICogZ2l2ZW4gaW5kaWNlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleDEgLSBUaGUgZGVzdGluYXRpb24gaW5kZXggaW50byB0aGlzIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICogQHBhcmFtIHtCdWZmZXJBdHRyaWJ1dGV9IGF0dHJpYnV0ZSAtIFRoZSBidWZmZXIgYXR0cmlidXRlIHRvIGNvcHkgZnJvbS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXgyIC0gVGhlIHNvdXJjZSBpbmRleCBpbnRvIHRoZSBnaXZlbiBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqIEByZXR1cm4ge0J1ZmZlckF0dHJpYnV0ZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjb3B5QXQoIGluZGV4MSwgYXR0cmlidXRlLCBpbmRleDIgKSB7XHJcblxyXG5cdFx0aW5kZXgxICo9IHRoaXMuaXRlbVNpemU7XHJcblx0XHRpbmRleDIgKj0gYXR0cmlidXRlLml0ZW1TaXplO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHRoaXMuaXRlbVNpemU7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0dGhpcy5hcnJheVsgaW5kZXgxICsgaSBdID0gYXR0cmlidXRlLmFycmF5WyBpbmRleDIgKyBpIF07XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvcGllcyB0aGUgZ2l2ZW4gYXJyYXkgZGF0YSBpbnRvIHRoaXMgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7KFR5cGVkQXJyYXl8QXJyYXkpfSBhcnJheSAtIFRoZSBhcnJheSB0byBjb3B5LlxyXG5cdCAqIEByZXR1cm4ge0J1ZmZlckF0dHJpYnV0ZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjb3B5QXJyYXkoIGFycmF5ICkge1xyXG5cclxuXHRcdHRoaXMuYXJyYXkuc2V0KCBhcnJheSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFwcGxpZXMgdGhlIGdpdmVuIDN4MyBtYXRyaXggdG8gdGhlIGdpdmVuIGF0dHJpYnV0ZS4gV29ya3Mgd2l0aFxyXG5cdCAqIGl0ZW0gc2l6ZSBgMmAgYW5kIGAzYC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4M30gbSAtIFRoZSBtYXRyaXggdG8gYXBwbHkuXHJcblx0ICogQHJldHVybiB7QnVmZmVyQXR0cmlidXRlfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGFwcGx5TWF0cml4MyggbSApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuaXRlbVNpemUgPT09IDIgKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSB0aGlzLmNvdW50OyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0X3ZlY3RvcjIuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggdGhpcywgaSApO1xyXG5cdFx0XHRcdF92ZWN0b3IyLmFwcGx5TWF0cml4MyggbSApO1xyXG5cclxuXHRcdFx0XHR0aGlzLnNldFhZKCBpLCBfdmVjdG9yMi54LCBfdmVjdG9yMi55ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmICggdGhpcy5pdGVtU2l6ZSA9PT0gMyApIHtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHRoaXMuY291bnQ7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRfdmVjdG9yLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHRoaXMsIGkgKTtcclxuXHRcdFx0XHRfdmVjdG9yLmFwcGx5TWF0cml4MyggbSApO1xyXG5cclxuXHRcdFx0XHR0aGlzLnNldFhZWiggaSwgX3ZlY3Rvci54LCBfdmVjdG9yLnksIF92ZWN0b3IueiApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBcHBsaWVzIHRoZSBnaXZlbiA0eDQgbWF0cml4IHRvIHRoZSBnaXZlbiBhdHRyaWJ1dGUuIE9ubHkgd29ya3Mgd2l0aFxyXG5cdCAqIGl0ZW0gc2l6ZSBgM2AuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDR9IG0gLSBUaGUgbWF0cml4IHRvIGFwcGx5LlxyXG5cdCAqIEByZXR1cm4ge0J1ZmZlckF0dHJpYnV0ZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRhcHBseU1hdHJpeDQoIG0gKSB7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gdGhpcy5jb3VudDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRfdmVjdG9yLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHRoaXMsIGkgKTtcclxuXHJcblx0XHRcdF92ZWN0b3IuYXBwbHlNYXRyaXg0KCBtICk7XHJcblxyXG5cdFx0XHR0aGlzLnNldFhZWiggaSwgX3ZlY3Rvci54LCBfdmVjdG9yLnksIF92ZWN0b3IueiApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBcHBsaWVzIHRoZSBnaXZlbiAzeDMgbm9ybWFsIG1hdHJpeCB0byB0aGUgZ2l2ZW4gYXR0cmlidXRlLiBPbmx5IHdvcmtzIHdpdGhcclxuXHQgKiBpdGVtIHNpemUgYDNgLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRyaXgzfSBtIC0gVGhlIG5vcm1hbCBtYXRyaXggdG8gYXBwbHkuXHJcblx0ICogQHJldHVybiB7QnVmZmVyQXR0cmlidXRlfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGFwcGx5Tm9ybWFsTWF0cml4KCBtICkge1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHRoaXMuY291bnQ7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0X3ZlY3Rvci5mcm9tQnVmZmVyQXR0cmlidXRlKCB0aGlzLCBpICk7XHJcblxyXG5cdFx0XHRfdmVjdG9yLmFwcGx5Tm9ybWFsTWF0cml4KCBtICk7XHJcblxyXG5cdFx0XHR0aGlzLnNldFhZWiggaSwgX3ZlY3Rvci54LCBfdmVjdG9yLnksIF92ZWN0b3IueiApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBcHBsaWVzIHRoZSBnaXZlbiA0eDQgbWF0cml4IHRvIHRoZSBnaXZlbiBhdHRyaWJ1dGUuIE9ubHkgd29ya3Mgd2l0aFxyXG5cdCAqIGl0ZW0gc2l6ZSBgM2AgYW5kIHdpdGggZGlyZWN0aW9uIHZlY3RvcnMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDR9IG0gLSBUaGUgbWF0cml4IHRvIGFwcGx5LlxyXG5cdCAqIEByZXR1cm4ge0J1ZmZlckF0dHJpYnV0ZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHR0cmFuc2Zvcm1EaXJlY3Rpb24oIG0gKSB7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gdGhpcy5jb3VudDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRfdmVjdG9yLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHRoaXMsIGkgKTtcclxuXHJcblx0XHRcdF92ZWN0b3IudHJhbnNmb3JtRGlyZWN0aW9uKCBtICk7XHJcblxyXG5cdFx0XHR0aGlzLnNldFhZWiggaSwgX3ZlY3Rvci54LCBfdmVjdG9yLnksIF92ZWN0b3IueiApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBnaXZlbiBhcnJheSBkYXRhIGluIHRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHsoVHlwZWRBcnJheXxBcnJheSl9IHZhbHVlIC0gVGhlIGFycmF5IGRhdGEgdG8gc2V0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0PTBdIC0gVGhlIG9mZnNldCBpbiB0aGlzIGJ1ZmZlciBhdHRyaWJ1dGUncyBhcnJheS5cclxuXHQgKiBAcmV0dXJuIHtCdWZmZXJBdHRyaWJ1dGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0KCB2YWx1ZSwgb2Zmc2V0ID0gMCApIHtcclxuXHJcblx0XHQvLyBNYXRjaGluZyBCdWZmZXJBdHRyaWJ1dGUgY29uc3RydWN0b3IsIGRvIG5vdCBub3JtYWxpemUgdGhlIGFycmF5LlxyXG5cdFx0dGhpcy5hcnJheS5zZXQoIHZhbHVlLCBvZmZzZXQgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBnaXZlbiBjb21wb25lbnQgb2YgdGhlIHZlY3RvciBhdCB0aGUgZ2l2ZW4gaW5kZXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggaW50byB0aGUgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gY29tcG9uZW50IC0gVGhlIGNvbXBvbmVudCBpbmRleC5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSByZXR1cm5lZCB2YWx1ZS5cclxuXHQgKi9cclxuXHRnZXRDb21wb25lbnQoIGluZGV4LCBjb21wb25lbnQgKSB7XHJcblxyXG5cdFx0bGV0IHZhbHVlID0gdGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgY29tcG9uZW50IF07XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5vcm1hbGl6ZWQgKSB2YWx1ZSA9IGRlbm9ybWFsaXplKCB2YWx1ZSwgdGhpcy5hcnJheSApO1xyXG5cclxuXHRcdHJldHVybiB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBnaXZlbiB2YWx1ZSB0byB0aGUgZ2l2ZW4gY29tcG9uZW50IG9mIHRoZSB2ZWN0b3IgYXQgdGhlIGdpdmVuIGluZGV4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluZGV4IGludG8gdGhlIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGNvbXBvbmVudCAtIFRoZSBjb21wb25lbnQgaW5kZXguXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtCdWZmZXJBdHRyaWJ1dGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0Q29tcG9uZW50KCBpbmRleCwgY29tcG9uZW50LCB2YWx1ZSApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMubm9ybWFsaXplZCApIHZhbHVlID0gbm9ybWFsaXplKCB2YWx1ZSwgdGhpcy5hcnJheSApO1xyXG5cclxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIGNvbXBvbmVudCBdID0gdmFsdWU7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgeCBjb21wb25lbnQgb2YgdGhlIHZlY3RvciBhdCB0aGUgZ2l2ZW4gaW5kZXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggaW50byB0aGUgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB4IGNvbXBvbmVudC5cclxuXHQgKi9cclxuXHRnZXRYKCBpbmRleCApIHtcclxuXHJcblx0XHRsZXQgeCA9IHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSBdO1xyXG5cclxuXHRcdGlmICggdGhpcy5ub3JtYWxpemVkICkgeCA9IGRlbm9ybWFsaXplKCB4LCB0aGlzLmFycmF5ICk7XHJcblxyXG5cdFx0cmV0dXJuIHg7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgeCBjb21wb25lbnQgb2YgdGhlIHZlY3RvciBhdCB0aGUgZ2l2ZW4gaW5kZXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggaW50byB0aGUgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB2YWx1ZSB0byBzZXQuXHJcblx0ICogQHJldHVybiB7QnVmZmVyQXR0cmlidXRlfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldFgoIGluZGV4LCB4ICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5ub3JtYWxpemVkICkgeCA9IG5vcm1hbGl6ZSggeCwgdGhpcy5hcnJheSApO1xyXG5cclxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSBdID0geDtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSB5IGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yIGF0IHRoZSBnaXZlbiBpbmRleC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBpbnRvIHRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIHkgY29tcG9uZW50LlxyXG5cdCAqL1xyXG5cdGdldFkoIGluZGV4ICkge1xyXG5cclxuXHRcdGxldCB5ID0gdGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMSBdO1xyXG5cclxuXHRcdGlmICggdGhpcy5ub3JtYWxpemVkICkgeSA9IGRlbm9ybWFsaXplKCB5LCB0aGlzLmFycmF5ICk7XHJcblxyXG5cdFx0cmV0dXJuIHk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgeSBjb21wb25lbnQgb2YgdGhlIHZlY3RvciBhdCB0aGUgZ2l2ZW4gaW5kZXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggaW50byB0aGUgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB2YWx1ZSB0byBzZXQuXHJcblx0ICogQHJldHVybiB7QnVmZmVyQXR0cmlidXRlfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldFkoIGluZGV4LCB5ICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5ub3JtYWxpemVkICkgeSA9IG5vcm1hbGl6ZSggeSwgdGhpcy5hcnJheSApO1xyXG5cclxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDEgXSA9IHk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgeiBjb21wb25lbnQgb2YgdGhlIHZlY3RvciBhdCB0aGUgZ2l2ZW4gaW5kZXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggaW50byB0aGUgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB6IGNvbXBvbmVudC5cclxuXHQgKi9cclxuXHRnZXRaKCBpbmRleCApIHtcclxuXHJcblx0XHRsZXQgeiA9IHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDIgXTtcclxuXHJcblx0XHRpZiAoIHRoaXMubm9ybWFsaXplZCApIHogPSBkZW5vcm1hbGl6ZSggeiwgdGhpcy5hcnJheSApO1xyXG5cclxuXHRcdHJldHVybiB6O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHogY29tcG9uZW50IG9mIHRoZSB2ZWN0b3IgYXQgdGhlIGdpdmVuIGluZGV4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluZGV4IGludG8gdGhlIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHogLSBUaGUgdmFsdWUgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge0J1ZmZlckF0dHJpYnV0ZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXRaKCBpbmRleCwgeiApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMubm9ybWFsaXplZCApIHogPSBub3JtYWxpemUoIHosIHRoaXMuYXJyYXkgKTtcclxuXHJcblx0XHR0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgKyAyIF0gPSB6O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHcgY29tcG9uZW50IG9mIHRoZSB2ZWN0b3IgYXQgdGhlIGdpdmVuIGluZGV4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluZGV4IGludG8gdGhlIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgdyBjb21wb25lbnQuXHJcblx0ICovXHJcblx0Z2V0VyggaW5kZXggKSB7XHJcblxyXG5cdFx0bGV0IHcgPSB0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgKyAzIF07XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5vcm1hbGl6ZWQgKSB3ID0gZGVub3JtYWxpemUoIHcsIHRoaXMuYXJyYXkgKTtcclxuXHJcblx0XHRyZXR1cm4gdztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB3IGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yIGF0IHRoZSBnaXZlbiBpbmRleC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBpbnRvIHRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB3IC0gVGhlIHZhbHVlIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtCdWZmZXJBdHRyaWJ1dGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0VyggaW5kZXgsIHcgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5vcm1hbGl6ZWQgKSB3ID0gbm9ybWFsaXplKCB3LCB0aGlzLmFycmF5ICk7XHJcblxyXG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMyBdID0gdztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB4IGFuZCB5IGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yIGF0IHRoZSBnaXZlbiBpbmRleC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBpbnRvIHRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHZhbHVlIGZvciB0aGUgeCBjb21wb25lbnQgdG8gc2V0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHZhbHVlIGZvciB0aGUgeSBjb21wb25lbnQgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge0J1ZmZlckF0dHJpYnV0ZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXRYWSggaW5kZXgsIHgsIHkgKSB7XHJcblxyXG5cdFx0aW5kZXggKj0gdGhpcy5pdGVtU2l6ZTtcclxuXHJcblx0XHRpZiAoIHRoaXMubm9ybWFsaXplZCApIHtcclxuXHJcblx0XHRcdHggPSBub3JtYWxpemUoIHgsIHRoaXMuYXJyYXkgKTtcclxuXHRcdFx0eSA9IG5vcm1hbGl6ZSggeSwgdGhpcy5hcnJheSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDAgXSA9IHg7XHJcblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDEgXSA9IHk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgeCwgeSBhbmQgeiBjb21wb25lbnQgb2YgdGhlIHZlY3RvciBhdCB0aGUgZ2l2ZW4gaW5kZXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggaW50byB0aGUgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB2YWx1ZSBmb3IgdGhlIHggY29tcG9uZW50IHRvIHNldC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB2YWx1ZSBmb3IgdGhlIHkgY29tcG9uZW50IHRvIHNldC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geiAtIFRoZSB2YWx1ZSBmb3IgdGhlIHogY29tcG9uZW50IHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtCdWZmZXJBdHRyaWJ1dGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0WFlaKCBpbmRleCwgeCwgeSwgeiApIHtcclxuXHJcblx0XHRpbmRleCAqPSB0aGlzLml0ZW1TaXplO1xyXG5cclxuXHRcdGlmICggdGhpcy5ub3JtYWxpemVkICkge1xyXG5cclxuXHRcdFx0eCA9IG5vcm1hbGl6ZSggeCwgdGhpcy5hcnJheSApO1xyXG5cdFx0XHR5ID0gbm9ybWFsaXplKCB5LCB0aGlzLmFycmF5ICk7XHJcblx0XHRcdHogPSBub3JtYWxpemUoIHosIHRoaXMuYXJyYXkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAwIF0gPSB4O1xyXG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAxIF0gPSB5O1xyXG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAyIF0gPSB6O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHgsIHksIHogYW5kIHcgY29tcG9uZW50IG9mIHRoZSB2ZWN0b3IgYXQgdGhlIGdpdmVuIGluZGV4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluZGV4IGludG8gdGhlIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgdmFsdWUgZm9yIHRoZSB4IGNvbXBvbmVudCB0byBzZXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmFsdWUgZm9yIHRoZSB5IGNvbXBvbmVudCB0byBzZXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHogLSBUaGUgdmFsdWUgZm9yIHRoZSB6IGNvbXBvbmVudCB0byBzZXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHcgLSBUaGUgdmFsdWUgZm9yIHRoZSB3IGNvbXBvbmVudCB0byBzZXQuXHJcblx0ICogQHJldHVybiB7QnVmZmVyQXR0cmlidXRlfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldFhZWlcoIGluZGV4LCB4LCB5LCB6LCB3ICkge1xyXG5cclxuXHRcdGluZGV4ICo9IHRoaXMuaXRlbVNpemU7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5vcm1hbGl6ZWQgKSB7XHJcblxyXG5cdFx0XHR4ID0gbm9ybWFsaXplKCB4LCB0aGlzLmFycmF5ICk7XHJcblx0XHRcdHkgPSBub3JtYWxpemUoIHksIHRoaXMuYXJyYXkgKTtcclxuXHRcdFx0eiA9IG5vcm1hbGl6ZSggeiwgdGhpcy5hcnJheSApO1xyXG5cdFx0XHR3ID0gbm9ybWFsaXplKCB3LCB0aGlzLmFycmF5ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMCBdID0geDtcclxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMSBdID0geTtcclxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMiBdID0gejtcclxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMyBdID0gdztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBnaXZlbiBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGV4ZWN1dGVkIGFmdGVyIHRoZSBSZW5kZXJlciBoYXMgdHJhbnNmZXJyZWRcclxuXHQgKiB0aGUgYXR0cmlidXRlIGFycmF5IGRhdGEgdG8gdGhlIEdQVS4gQ2FuIGJlIHVzZWQgdG8gcGVyZm9ybSBjbGVhbi11cCBvcGVyYXRpb25zIGFmdGVyXHJcblx0ICogdGhlIHVwbG9hZCB3aGVuIGF0dHJpYnV0ZSBkYXRhIGFyZSBub3QgbmVlZGVkIGFueW1vcmUgb24gdGhlIENQVSBzaWRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgLSBUaGUgYG9uVXBsb2FkKClgIGNhbGxiYWNrLlxyXG5cdCAqIEByZXR1cm4ge0J1ZmZlckF0dHJpYnV0ZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRvblVwbG9hZCggY2FsbGJhY2sgKSB7XHJcblxyXG5cdFx0dGhpcy5vblVwbG9hZENhbGxiYWNrID0gY2FsbGJhY2s7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIG5ldyBidWZmZXIgYXR0cmlidXRlIHdpdGggY29waWVkIHZhbHVlcyBmcm9tIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtCdWZmZXJBdHRyaWJ1dGV9IEEgY2xvbmUgb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjbG9uZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuYXJyYXksIHRoaXMuaXRlbVNpemUgKS5jb3B5KCB0aGlzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2VyaWFsaXplcyB0aGUgYnVmZmVyIGF0dHJpYnV0ZSBpbnRvIEpTT04uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtPYmplY3R9IEEgSlNPTiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzZXJpYWxpemVkIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICovXHJcblx0dG9KU09OKCkge1xyXG5cclxuXHRcdGNvbnN0IGRhdGEgPSB7XHJcblx0XHRcdGl0ZW1TaXplOiB0aGlzLml0ZW1TaXplLFxyXG5cdFx0XHR0eXBlOiB0aGlzLmFycmF5LmNvbnN0cnVjdG9yLm5hbWUsXHJcblx0XHRcdGFycmF5OiBBcnJheS5mcm9tKCB0aGlzLmFycmF5ICksXHJcblx0XHRcdG5vcm1hbGl6ZWQ6IHRoaXMubm9ybWFsaXplZFxyXG5cdFx0fTtcclxuXHJcblx0XHRpZiAoIHRoaXMubmFtZSAhPT0gJycgKSBkYXRhLm5hbWUgPSB0aGlzLm5hbWU7XHJcblx0XHRpZiAoIHRoaXMudXNhZ2UgIT09IFN0YXRpY0RyYXdVc2FnZSApIGRhdGEudXNhZ2UgPSB0aGlzLnVzYWdlO1xyXG5cclxuXHRcdHJldHVybiBkYXRhO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQ29udmVuaWVudCBjbGFzcyB0aGF0IGNhbiBiZSB1c2VkIHdoZW4gY3JlYXRpbmcgYSBgSW50OGAgYnVmZmVyIGF0dHJpYnV0ZSB3aXRoXHJcbiAqIGEgcGxhaW4gYEFycmF5YCBpbnN0YW5jZS5cclxuICpcclxuICogQGF1Z21lbnRzIEJ1ZmZlckF0dHJpYnV0ZVxyXG4gKi9cclxuY2xhc3MgSW50OEJ1ZmZlckF0dHJpYnV0ZSBleHRlbmRzIEJ1ZmZlckF0dHJpYnV0ZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7KEFycmF5PG51bWJlcj58SW50OEFycmF5KX0gYXJyYXkgLSBUaGUgYXJyYXkgaG9sZGluZyB0aGUgYXR0cmlidXRlIGRhdGEuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGl0ZW1TaXplIC0gVGhlIGl0ZW0gc2l6ZS5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtub3JtYWxpemVkPWZhbHNlXSAtIFdoZXRoZXIgdGhlIGRhdGEgYXJlIG5vcm1hbGl6ZWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5ldyBJbnQ4QXJyYXkoIGFycmF5ICksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb252ZW5pZW50IGNsYXNzIHRoYXQgY2FuIGJlIHVzZWQgd2hlbiBjcmVhdGluZyBhIGBVSW50OGAgYnVmZmVyIGF0dHJpYnV0ZSB3aXRoXHJcbiAqIGEgcGxhaW4gYEFycmF5YCBpbnN0YW5jZS5cclxuICpcclxuICogQGF1Z21lbnRzIEJ1ZmZlckF0dHJpYnV0ZVxyXG4gKi9cclxuY2xhc3MgVWludDhCdWZmZXJBdHRyaWJ1dGUgZXh0ZW5kcyBCdWZmZXJBdHRyaWJ1dGUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geyhBcnJheTxudW1iZXI+fFVpbnQ4QXJyYXkpfSBhcnJheSAtIFRoZSBhcnJheSBob2xkaW5nIHRoZSBhdHRyaWJ1dGUgZGF0YS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaXRlbVNpemUgLSBUaGUgaXRlbSBzaXplLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW25vcm1hbGl6ZWQ9ZmFsc2VdIC0gV2hldGhlciB0aGUgZGF0YSBhcmUgbm9ybWFsaXplZCBvciBub3QuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHtcclxuXHJcblx0XHRzdXBlciggbmV3IFVpbnQ4QXJyYXkoIGFycmF5ICksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb252ZW5pZW50IGNsYXNzIHRoYXQgY2FuIGJlIHVzZWQgd2hlbiBjcmVhdGluZyBhIGBVSW50OENsYW1wZWRgIGJ1ZmZlciBhdHRyaWJ1dGUgd2l0aFxyXG4gKiBhIHBsYWluIGBBcnJheWAgaW5zdGFuY2UuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBCdWZmZXJBdHRyaWJ1dGVcclxuICovXHJcbmNsYXNzIFVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZSBleHRlbmRzIEJ1ZmZlckF0dHJpYnV0ZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7KEFycmF5PG51bWJlcj58VWludDhDbGFtcGVkQXJyYXkpfSBhcnJheSAtIFRoZSBhcnJheSBob2xkaW5nIHRoZSBhdHRyaWJ1dGUgZGF0YS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaXRlbVNpemUgLSBUaGUgaXRlbSBzaXplLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW25vcm1hbGl6ZWQ9ZmFsc2VdIC0gV2hldGhlciB0aGUgZGF0YSBhcmUgbm9ybWFsaXplZCBvciBub3QuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHtcclxuXHJcblx0XHRzdXBlciggbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQ29udmVuaWVudCBjbGFzcyB0aGF0IGNhbiBiZSB1c2VkIHdoZW4gY3JlYXRpbmcgYSBgSW50MTZgIGJ1ZmZlciBhdHRyaWJ1dGUgd2l0aFxyXG4gKiBhIHBsYWluIGBBcnJheWAgaW5zdGFuY2UuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBCdWZmZXJBdHRyaWJ1dGVcclxuICovXHJcbmNsYXNzIEludDE2QnVmZmVyQXR0cmlidXRlIGV4dGVuZHMgQnVmZmVyQXR0cmlidXRlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHsoQXJyYXk8bnVtYmVyPnxJbnQxNkFycmF5KX0gYXJyYXkgLSBUaGUgYXJyYXkgaG9sZGluZyB0aGUgYXR0cmlidXRlIGRhdGEuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGl0ZW1TaXplIC0gVGhlIGl0ZW0gc2l6ZS5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtub3JtYWxpemVkPWZhbHNlXSAtIFdoZXRoZXIgdGhlIGRhdGEgYXJlIG5vcm1hbGl6ZWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5ldyBJbnQxNkFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQ29udmVuaWVudCBjbGFzcyB0aGF0IGNhbiBiZSB1c2VkIHdoZW4gY3JlYXRpbmcgYSBgVUludDE2YCBidWZmZXIgYXR0cmlidXRlIHdpdGhcclxuICogYSBwbGFpbiBgQXJyYXlgIGluc3RhbmNlLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQnVmZmVyQXR0cmlidXRlXHJcbiAqL1xyXG5jbGFzcyBVaW50MTZCdWZmZXJBdHRyaWJ1dGUgZXh0ZW5kcyBCdWZmZXJBdHRyaWJ1dGUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geyhBcnJheTxudW1iZXI+fFVpbnQxNkFycmF5KX0gYXJyYXkgLSBUaGUgYXJyYXkgaG9sZGluZyB0aGUgYXR0cmlidXRlIGRhdGEuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGl0ZW1TaXplIC0gVGhlIGl0ZW0gc2l6ZS5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtub3JtYWxpemVkPWZhbHNlXSAtIFdoZXRoZXIgdGhlIGRhdGEgYXJlIG5vcm1hbGl6ZWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5ldyBVaW50MTZBcnJheSggYXJyYXkgKSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIENvbnZlbmllbnQgY2xhc3MgdGhhdCBjYW4gYmUgdXNlZCB3aGVuIGNyZWF0aW5nIGEgYEludDMyYCBidWZmZXIgYXR0cmlidXRlIHdpdGhcclxuICogYSBwbGFpbiBgQXJyYXlgIGluc3RhbmNlLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQnVmZmVyQXR0cmlidXRlXHJcbiAqL1xyXG5jbGFzcyBJbnQzMkJ1ZmZlckF0dHJpYnV0ZSBleHRlbmRzIEJ1ZmZlckF0dHJpYnV0ZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7KEFycmF5PG51bWJlcj58SW50MzJBcnJheSl9IGFycmF5IC0gVGhlIGFycmF5IGhvbGRpbmcgdGhlIGF0dHJpYnV0ZSBkYXRhLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpdGVtU2l6ZSAtIFRoZSBpdGVtIHNpemUuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbbm9ybWFsaXplZD1mYWxzZV0gLSBXaGV0aGVyIHRoZSBkYXRhIGFyZSBub3JtYWxpemVkIG9yIG5vdC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkge1xyXG5cclxuXHRcdHN1cGVyKCBuZXcgSW50MzJBcnJheSggYXJyYXkgKSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIENvbnZlbmllbnQgY2xhc3MgdGhhdCBjYW4gYmUgdXNlZCB3aGVuIGNyZWF0aW5nIGEgYFVJbnQzMmAgYnVmZmVyIGF0dHJpYnV0ZSB3aXRoXHJcbiAqIGEgcGxhaW4gYEFycmF5YCBpbnN0YW5jZS5cclxuICpcclxuICogQGF1Z21lbnRzIEJ1ZmZlckF0dHJpYnV0ZVxyXG4gKi9cclxuY2xhc3MgVWludDMyQnVmZmVyQXR0cmlidXRlIGV4dGVuZHMgQnVmZmVyQXR0cmlidXRlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHsoQXJyYXk8bnVtYmVyPnxVaW50MzJBcnJheSl9IGFycmF5IC0gVGhlIGFycmF5IGhvbGRpbmcgdGhlIGF0dHJpYnV0ZSBkYXRhLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpdGVtU2l6ZSAtIFRoZSBpdGVtIHNpemUuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbbm9ybWFsaXplZD1mYWxzZV0gLSBXaGV0aGVyIHRoZSBkYXRhIGFyZSBub3JtYWxpemVkIG9yIG5vdC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkge1xyXG5cclxuXHRcdHN1cGVyKCBuZXcgVWludDMyQXJyYXkoIGFycmF5ICksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb252ZW5pZW50IGNsYXNzIHRoYXQgY2FuIGJlIHVzZWQgd2hlbiBjcmVhdGluZyBhIGBGbG9hdDE2YCBidWZmZXIgYXR0cmlidXRlIHdpdGhcclxuICogYSBwbGFpbiBgQXJyYXlgIGluc3RhbmNlLlxyXG4gKlxyXG4gKiBUaGlzIGNsYXNzIGF1dG9tYXRpY2FsbHkgY29udmVydHMgdG8gdG8gYW5kIGZyb20gRlAxNiBzaW5jZSBgRmxvYXQxNkFycmF5YCBpcyBub3RcclxuICogbmF0aXZlbHkgc3VwcG9ydGVkIGluIEphdmFTY3JpcHQuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBCdWZmZXJBdHRyaWJ1dGVcclxuICovXHJcbmNsYXNzIEZsb2F0MTZCdWZmZXJBdHRyaWJ1dGUgZXh0ZW5kcyBCdWZmZXJBdHRyaWJ1dGUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geyhBcnJheTxudW1iZXI+fFVpbnQxNkFycmF5KX0gYXJyYXkgLSBUaGUgYXJyYXkgaG9sZGluZyB0aGUgYXR0cmlidXRlIGRhdGEuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGl0ZW1TaXplIC0gVGhlIGl0ZW0gc2l6ZS5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtub3JtYWxpemVkPWZhbHNlXSAtIFdoZXRoZXIgdGhlIGRhdGEgYXJlIG5vcm1hbGl6ZWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5ldyBVaW50MTZBcnJheSggYXJyYXkgKSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTtcclxuXHJcblx0XHR0aGlzLmlzRmxvYXQxNkJ1ZmZlckF0dHJpYnV0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0WCggaW5kZXggKSB7XHJcblxyXG5cdFx0bGV0IHggPSBmcm9tSGFsZkZsb2F0KCB0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgXSApO1xyXG5cclxuXHRcdGlmICggdGhpcy5ub3JtYWxpemVkICkgeCA9IGRlbm9ybWFsaXplKCB4LCB0aGlzLmFycmF5ICk7XHJcblxyXG5cdFx0cmV0dXJuIHg7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0WCggaW5kZXgsIHggKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5vcm1hbGl6ZWQgKSB4ID0gbm9ybWFsaXplKCB4LCB0aGlzLmFycmF5ICk7XHJcblxyXG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplIF0gPSB0b0hhbGZGbG9hdCggeCApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdGdldFkoIGluZGV4ICkge1xyXG5cclxuXHRcdGxldCB5ID0gZnJvbUhhbGZGbG9hdCggdGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMSBdICk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5vcm1hbGl6ZWQgKSB5ID0gZGVub3JtYWxpemUoIHksIHRoaXMuYXJyYXkgKTtcclxuXHJcblx0XHRyZXR1cm4geTtcclxuXHJcblx0fVxyXG5cclxuXHRzZXRZKCBpbmRleCwgeSApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMubm9ybWFsaXplZCApIHkgPSBub3JtYWxpemUoIHksIHRoaXMuYXJyYXkgKTtcclxuXHJcblx0XHR0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgKyAxIF0gPSB0b0hhbGZGbG9hdCggeSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdGdldFooIGluZGV4ICkge1xyXG5cclxuXHRcdGxldCB6ID0gZnJvbUhhbGZGbG9hdCggdGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMiBdICk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5vcm1hbGl6ZWQgKSB6ID0gZGVub3JtYWxpemUoIHosIHRoaXMuYXJyYXkgKTtcclxuXHJcblx0XHRyZXR1cm4gejtcclxuXHJcblx0fVxyXG5cclxuXHRzZXRaKCBpbmRleCwgeiApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMubm9ybWFsaXplZCApIHogPSBub3JtYWxpemUoIHosIHRoaXMuYXJyYXkgKTtcclxuXHJcblx0XHR0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgKyAyIF0gPSB0b0hhbGZGbG9hdCggeiApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdGdldFcoIGluZGV4ICkge1xyXG5cclxuXHRcdGxldCB3ID0gZnJvbUhhbGZGbG9hdCggdGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMyBdICk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5vcm1hbGl6ZWQgKSB3ID0gZGVub3JtYWxpemUoIHcsIHRoaXMuYXJyYXkgKTtcclxuXHJcblx0XHRyZXR1cm4gdztcclxuXHJcblx0fVxyXG5cclxuXHRzZXRXKCBpbmRleCwgdyApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMubm9ybWFsaXplZCApIHcgPSBub3JtYWxpemUoIHcsIHRoaXMuYXJyYXkgKTtcclxuXHJcblx0XHR0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgKyAzIF0gPSB0b0hhbGZGbG9hdCggdyApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdHNldFhZKCBpbmRleCwgeCwgeSApIHtcclxuXHJcblx0XHRpbmRleCAqPSB0aGlzLml0ZW1TaXplO1xyXG5cclxuXHRcdGlmICggdGhpcy5ub3JtYWxpemVkICkge1xyXG5cclxuXHRcdFx0eCA9IG5vcm1hbGl6ZSggeCwgdGhpcy5hcnJheSApO1xyXG5cdFx0XHR5ID0gbm9ybWFsaXplKCB5LCB0aGlzLmFycmF5ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMCBdID0gdG9IYWxmRmxvYXQoIHggKTtcclxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMSBdID0gdG9IYWxmRmxvYXQoIHkgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHRzZXRYWVooIGluZGV4LCB4LCB5LCB6ICkge1xyXG5cclxuXHRcdGluZGV4ICo9IHRoaXMuaXRlbVNpemU7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5vcm1hbGl6ZWQgKSB7XHJcblxyXG5cdFx0XHR4ID0gbm9ybWFsaXplKCB4LCB0aGlzLmFycmF5ICk7XHJcblx0XHRcdHkgPSBub3JtYWxpemUoIHksIHRoaXMuYXJyYXkgKTtcclxuXHRcdFx0eiA9IG5vcm1hbGl6ZSggeiwgdGhpcy5hcnJheSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDAgXSA9IHRvSGFsZkZsb2F0KCB4ICk7XHJcblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDEgXSA9IHRvSGFsZkZsb2F0KCB5ICk7XHJcblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDIgXSA9IHRvSGFsZkZsb2F0KCB6ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0WFlaVyggaW5kZXgsIHgsIHksIHosIHcgKSB7XHJcblxyXG5cdFx0aW5kZXggKj0gdGhpcy5pdGVtU2l6ZTtcclxuXHJcblx0XHRpZiAoIHRoaXMubm9ybWFsaXplZCApIHtcclxuXHJcblx0XHRcdHggPSBub3JtYWxpemUoIHgsIHRoaXMuYXJyYXkgKTtcclxuXHRcdFx0eSA9IG5vcm1hbGl6ZSggeSwgdGhpcy5hcnJheSApO1xyXG5cdFx0XHR6ID0gbm9ybWFsaXplKCB6LCB0aGlzLmFycmF5ICk7XHJcblx0XHRcdHcgPSBub3JtYWxpemUoIHcsIHRoaXMuYXJyYXkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAwIF0gPSB0b0hhbGZGbG9hdCggeCApO1xyXG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAxIF0gPSB0b0hhbGZGbG9hdCggeSApO1xyXG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAyIF0gPSB0b0hhbGZGbG9hdCggeiApO1xyXG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAzIF0gPSB0b0hhbGZGbG9hdCggdyApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQ29udmVuaWVudCBjbGFzcyB0aGF0IGNhbiBiZSB1c2VkIHdoZW4gY3JlYXRpbmcgYSBgRmxvYXQzMmAgYnVmZmVyIGF0dHJpYnV0ZSB3aXRoXHJcbiAqIGEgcGxhaW4gYEFycmF5YCBpbnN0YW5jZS5cclxuICpcclxuICogQGF1Z21lbnRzIEJ1ZmZlckF0dHJpYnV0ZVxyXG4gKi9cclxuY2xhc3MgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSBleHRlbmRzIEJ1ZmZlckF0dHJpYnV0ZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7KEFycmF5PG51bWJlcj58RmxvYXQzMkFycmF5KX0gYXJyYXkgLSBUaGUgYXJyYXkgaG9sZGluZyB0aGUgYXR0cmlidXRlIGRhdGEuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGl0ZW1TaXplIC0gVGhlIGl0ZW0gc2l6ZS5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtub3JtYWxpemVkPWZhbHNlXSAtIFdoZXRoZXIgdGhlIGRhdGEgYXJlIG5vcm1hbGl6ZWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5ldyBGbG9hdDMyQXJyYXkoIGFycmF5ICksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8vXHJcblxyXG5leHBvcnQge1xyXG5cdEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUsXHJcblx0RmxvYXQxNkJ1ZmZlckF0dHJpYnV0ZSxcclxuXHRVaW50MzJCdWZmZXJBdHRyaWJ1dGUsXHJcblx0SW50MzJCdWZmZXJBdHRyaWJ1dGUsXHJcblx0VWludDE2QnVmZmVyQXR0cmlidXRlLFxyXG5cdEludDE2QnVmZmVyQXR0cmlidXRlLFxyXG5cdFVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZSxcclxuXHRVaW50OEJ1ZmZlckF0dHJpYnV0ZSxcclxuXHRJbnQ4QnVmZmVyQXR0cmlidXRlLFxyXG5cdEJ1ZmZlckF0dHJpYnV0ZVxyXG59O1xyXG4iLCJpbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uL21hdGgvVmVjdG9yMi5qcyc7XHJcbmltcG9ydCB7IEJveDMgfSBmcm9tICcuLi9tYXRoL0JveDMuanMnO1xyXG5pbXBvcnQgeyBFdmVudERpc3BhdGNoZXIgfSBmcm9tICcuL0V2ZW50RGlzcGF0Y2hlci5qcyc7XHJcbmltcG9ydCB7IEJ1ZmZlckF0dHJpYnV0ZSwgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSwgVWludDE2QnVmZmVyQXR0cmlidXRlLCBVaW50MzJCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcbmltcG9ydCB7IFNwaGVyZSB9IGZyb20gJy4uL21hdGgvU3BoZXJlLmpzJztcclxuaW1wb3J0IHsgT2JqZWN0M0QgfSBmcm9tICcuL09iamVjdDNELmpzJztcclxuaW1wb3J0IHsgTWF0cml4NCB9IGZyb20gJy4uL21hdGgvTWF0cml4NC5qcyc7XHJcbmltcG9ydCB7IE1hdHJpeDMgfSBmcm9tICcuLi9tYXRoL01hdHJpeDMuanMnO1xyXG5pbXBvcnQgeyBnZW5lcmF0ZVVVSUQgfSBmcm9tICcuLi9tYXRoL01hdGhVdGlscy5qcyc7XHJcbmltcG9ydCB7IGFycmF5TmVlZHNVaW50MzIgfSBmcm9tICcuLi91dGlscy5qcyc7XHJcblxyXG5sZXQgX2lkID0gMDtcclxuXHJcbmNvbnN0IF9tMSA9IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDQoKTtcclxuY29uc3QgX29iaiA9IC8qQF9fUFVSRV9fKi8gbmV3IE9iamVjdDNEKCk7XHJcbmNvbnN0IF9vZmZzZXQgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF9ib3ggPSAvKkBfX1BVUkVfXyovIG5ldyBCb3gzKCk7XHJcbmNvbnN0IF9ib3hNb3JwaFRhcmdldHMgPSAvKkBfX1BVUkVfXyovIG5ldyBCb3gzKCk7XHJcbmNvbnN0IF92ZWN0b3IgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcblxyXG4vKipcclxuICogQSByZXByZXNlbnRhdGlvbiBvZiBtZXNoLCBsaW5lLCBvciBwb2ludCBnZW9tZXRyeS4gSW5jbHVkZXMgdmVydGV4XHJcbiAqIHBvc2l0aW9ucywgZmFjZSBpbmRpY2VzLCBub3JtYWxzLCBjb2xvcnMsIFVWcywgYW5kIGN1c3RvbSBhdHRyaWJ1dGVzXHJcbiAqIHdpdGhpbiBidWZmZXJzLCByZWR1Y2luZyB0aGUgY29zdCBvZiBwYXNzaW5nIGFsbCB0aGlzIGRhdGEgdG8gdGhlIEdQVS5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgZ2VvbWV0cnkgPSBuZXcgVEhSRUUuQnVmZmVyR2VvbWV0cnkoKTtcclxuICogLy8gY3JlYXRlIGEgc2ltcGxlIHNxdWFyZSBzaGFwZS4gV2UgZHVwbGljYXRlIHRoZSB0b3AgbGVmdCBhbmQgYm90dG9tIHJpZ2h0XHJcbiAqIC8vIHZlcnRpY2VzIGJlY2F1c2UgZWFjaCB2ZXJ0ZXggbmVlZHMgdG8gYXBwZWFyIG9uY2UgcGVyIHRyaWFuZ2xlLlxyXG4gKiBjb25zdCB2ZXJ0aWNlcyA9IG5ldyBGbG9hdDMyQXJyYXkoIFtcclxuICogXHQtMS4wLCAtMS4wLCAgMS4wLCAvLyB2MFxyXG4gKiBcdCAxLjAsIC0xLjAsICAxLjAsIC8vIHYxXHJcbiAqIFx0IDEuMCwgIDEuMCwgIDEuMCwgLy8gdjJcclxuICpcclxuICogXHQgMS4wLCAgMS4wLCAgMS4wLCAvLyB2M1xyXG4gKiBcdC0xLjAsICAxLjAsICAxLjAsIC8vIHY0XHJcbiAqIFx0LTEuMCwgLTEuMCwgIDEuMCAgLy8gdjVcclxuICogXSApO1xyXG4gKiAvLyBpdGVtU2l6ZSA9IDMgYmVjYXVzZSB0aGVyZSBhcmUgMyB2YWx1ZXMgKGNvbXBvbmVudHMpIHBlciB2ZXJ0ZXhcclxuICogZ2VvbWV0cnkuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XHJcbiAqIGNvbnN0IG1hdGVyaWFsID0gbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiAweGZmMDAwMCB9ICk7XHJcbiAqIGNvbnN0IG1lc2ggPSBuZXcgVEhSRUUuTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgRXZlbnREaXNwYXRjaGVyXHJcbiAqL1xyXG5jbGFzcyBCdWZmZXJHZW9tZXRyeSBleHRlbmRzIEV2ZW50RGlzcGF0Y2hlciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgZ2VvbWV0cnkuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNCdWZmZXJHZW9tZXRyeSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgSUQgb2YgdGhlIGdlb21ldHJ5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEBuYW1lIEJ1ZmZlckdlb21ldHJ5I2lkXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKi9cclxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ2lkJywgeyB2YWx1ZTogX2lkICsrIH0gKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBVVUlEIG9mIHRoZSBnZW9tZXRyeS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXVpZCA9IGdlbmVyYXRlVVVJRCgpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG5hbWUgb2YgdGhlIGdlb21ldHJ5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubmFtZSA9ICcnO1xyXG5cdFx0dGhpcy50eXBlID0gJ0J1ZmZlckdlb21ldHJ5JztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFsbG93cyBmb3IgdmVydGljZXMgdG8gYmUgcmUtdXNlZCBhY3Jvc3MgbXVsdGlwbGUgdHJpYW5nbGVzOyB0aGlzIGlzXHJcblx0XHQgKiBjYWxsZWQgdXNpbmcgXCJpbmRleGVkIHRyaWFuZ2xlc1wiLiBFYWNoIHRyaWFuZ2xlIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGVcclxuXHRcdCAqIGluZGljZXMgb2YgdGhyZWUgdmVydGljZXMuIFRoaXMgYXR0cmlidXRlIHRoZXJlZm9yZSBzdG9yZXMgdGhlIGluZGV4IG9mXHJcblx0XHQgKiBlYWNoIHZlcnRleCBmb3IgZWFjaCB0cmlhbmd1bGFyIGZhY2UuIElmIHRoaXMgYXR0cmlidXRlIGlzIG5vdCBzZXQsIHRoZVxyXG5cdFx0ICogcmVuZGVyZXIgYXNzdW1lcyB0aGF0IGVhY2ggdGhyZWUgY29udGlndW91cyBwb3NpdGlvbnMgcmVwcmVzZW50IGEgc2luZ2xlIHRyaWFuZ2xlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/QnVmZmVyQXR0cmlidXRlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmluZGV4ID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgKHN0b3JhZ2UpIGJ1ZmZlciBhdHRyaWJ1dGUgd2hpY2ggd2FzIGdlbmVyYXRlZCB3aXRoIGEgY29tcHV0ZSBzaGFkZXIgYW5kXHJcblx0XHQgKiBub3cgZGVmaW5lcyBpbmRpcmVjdCBkcmF3IGNhbGxzLlxyXG5cdFx0ICpcclxuXHRcdCAqIENhbiBvbmx5IGJlIHVzZWQgd2l0aCB7QGxpbmsgV2ViR1BVUmVuZGVyZXJ9IGFuZCBhIFdlYkdQVSBiYWNrZW5kLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/QnVmZmVyQXR0cmlidXRlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmluZGlyZWN0ID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZGljdGlvbmFyeSBoYXMgYXMgaWQgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byBiZSBzZXQgYW5kIGFzIHZhbHVlXHJcblx0XHQgKiB0aGUgYnVmZmVyIGF0dHJpYnV0ZSB0byBzZXQgaXQgdG8uIFJhdGhlciB0aGFuIGFjY2Vzc2luZyB0aGlzIHByb3BlcnR5IGRpcmVjdGx5LFxyXG5cdFx0ICogdXNlIGBzZXRBdHRyaWJ1dGUoKWAgYW5kIGBnZXRBdHRyaWJ1dGUoKWAgdG8gYWNjZXNzIGF0dHJpYnV0ZXMgb2YgdGhpcyBnZW9tZXRyeS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0PHN0cmluZywoQnVmZmVyQXR0cmlidXRlfEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKT59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYXR0cmlidXRlcyA9IHt9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBkaWN0aW9uYXJ5IGhvbGRzIHRoZSBtb3JwaCB0YXJnZXRzIG9mIHRoZSBnZW9tZXRyeS5cclxuXHRcdCAqXHJcblx0XHQgKiBOb3RlOiBPbmNlIHRoZSBnZW9tZXRyeSBoYXMgYmVlbiByZW5kZXJlZCwgdGhlIG1vcnBoIGF0dHJpYnV0ZSBkYXRhIGNhbm5vdFxyXG5cdFx0ICogYmUgY2hhbmdlZC4gWW91IHdpbGwgaGF2ZSB0byBjYWxsIGBkaXNwb3NlKCk/LCBhbmQgY3JlYXRlIGEgbmV3IGdlb21ldHJ5IGluc3RhbmNlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubW9ycGhBdHRyaWJ1dGVzID0ge307XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBVc2VkIHRvIGNvbnRyb2wgdGhlIG1vcnBoIHRhcmdldCBiZWhhdmlvcjsgd2hlbiBzZXQgdG8gYHRydWVgLCB0aGUgbW9ycGhcclxuXHRcdCAqIHRhcmdldCBkYXRhIGlzIHRyZWF0ZWQgYXMgcmVsYXRpdmUgb2Zmc2V0cywgcmF0aGVyIHRoYW4gYXMgYWJzb2x1dGVcclxuXHRcdCAqIHBvc2l0aW9ucy9ub3JtYWxzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZSA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU3BsaXQgdGhlIGdlb21ldHJ5IGludG8gZ3JvdXBzLCBlYWNoIG9mIHdoaWNoIHdpbGwgYmUgcmVuZGVyZWQgaW4gYVxyXG5cdFx0ICogc2VwYXJhdGUgZHJhdyBjYWxsLiBUaGlzIGFsbG93cyBhbiBhcnJheSBvZiBtYXRlcmlhbHMgdG8gYmUgdXNlZCB3aXRoIHRoZSBnZW9tZXRyeS5cclxuXHRcdCAqXHJcblx0XHQgKiBVc2UgYGFkZEdyb3VwKClgIGFuZCBgY2xlYXJHcm91cHMoKWAgdG8gZWRpdCBncm91cHMsIHJhdGhlciB0aGFuIG1vZGlmeWluZyB0aGlzIGFycmF5IGRpcmVjdGx5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEV2ZXJ5IHZlcnRleCBhbmQgaW5kZXggbXVzdCBiZWxvbmcgdG8gZXhhY3RseSBvbmUgZ3JvdXAg4oCUIGdyb3VwcyBtdXN0IG5vdCBzaGFyZSB2ZXJ0aWNlcyBvclxyXG5cdFx0ICogaW5kaWNlcywgYW5kIG11c3Qgbm90IGxlYXZlIHZlcnRpY2VzIG9yIGluZGljZXMgdW51c2VkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxPYmplY3Q+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdyb3VwcyA9IFtdO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQm91bmRpbmcgYm94IGZvciB0aGUgZ2VvbWV0cnkgd2hpY2ggY2FuIGJlIGNhbGN1bGF0ZWQgd2l0aCBgY29tcHV0ZUJvdW5kaW5nQm94KClgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtCb3gzfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJvdW5kaW5nQm94ID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEJvdW5kaW5nIHNwaGVyZSBmb3IgdGhlIGdlb21ldHJ5IHdoaWNoIGNhbiBiZSBjYWxjdWxhdGVkIHdpdGggYGNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7U3BoZXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERldGVybWluZXMgdGhlIHBhcnQgb2YgdGhlIGdlb21ldHJ5IHRvIHJlbmRlci4gVGhpcyBzaG91bGQgbm90IGJlIHNldCBkaXJlY3RseSxcclxuXHRcdCAqIGluc3RlYWQgdXNlIGBzZXREcmF3UmFuZ2UoKWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3tzdGFydDpudW1iZXIsY291bnQ6bnVtYmVyfX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kcmF3UmFuZ2UgPSB7IHN0YXJ0OiAwLCBjb3VudDogSW5maW5pdHkgfTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIHN0b3JlIGN1c3RvbSBkYXRhIGFib3V0IHRoZSBnZW9tZXRyeS5cclxuXHRcdCAqIEl0IHNob3VsZCBub3QgaG9sZCByZWZlcmVuY2VzIHRvIGZ1bmN0aW9ucyBhcyB0aGVzZSB3aWxsIG5vdCBiZSBjbG9uZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51c2VyRGF0YSA9IHt9O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoaXMgZ2VvbWV0cnkuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHs/QnVmZmVyQXR0cmlidXRlfSBUaGUgaW5kZXguIFJldHVybnMgYG51bGxgIGlmIG5vIGluZGV4IGlzIGRlZmluZWQuXHJcblx0ICovXHJcblx0Z2V0SW5kZXgoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuaW5kZXg7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZ2l2ZW4gaW5kZXggdG8gdGhpcyBnZW9tZXRyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPnxCdWZmZXJBdHRyaWJ1dGV9IGluZGV4IC0gVGhlIGluZGV4IHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtCdWZmZXJHZW9tZXRyeX0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXRJbmRleCggaW5kZXggKSB7XHJcblxyXG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCBpbmRleCApICkge1xyXG5cclxuXHRcdFx0dGhpcy5pbmRleCA9IG5ldyAoIGFycmF5TmVlZHNVaW50MzIoIGluZGV4ICkgPyBVaW50MzJCdWZmZXJBdHRyaWJ1dGUgOiBVaW50MTZCdWZmZXJBdHRyaWJ1dGUgKSggaW5kZXgsIDEgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGhpcy5pbmRleCA9IGluZGV4O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBnaXZlbiBpbmRpcmVjdCBhdHRyaWJ1dGUgdG8gdGhpcyBnZW9tZXRyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyQXR0cmlidXRlfSBpbmRpcmVjdCAtIFRoZSBhdHRyaWJ1dGUgaG9sZGluZyBpbmRpcmVjdCBkcmF3IGNhbGxzLlxyXG5cdCAqIEByZXR1cm4ge0J1ZmZlckdlb21ldHJ5fSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldEluZGlyZWN0KCBpbmRpcmVjdCApIHtcclxuXHJcblx0XHR0aGlzLmluZGlyZWN0ID0gaW5kaXJlY3Q7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgaW5kaXJlY3QgYXR0cmlidXRlIG9mIHRoaXMgZ2VvbWV0cnkuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHs/QnVmZmVyQXR0cmlidXRlfSBUaGUgaW5kaXJlY3QgYXR0cmlidXRlLiBSZXR1cm5zIGBudWxsYCBpZiBubyBpbmRpcmVjdCBhdHRyaWJ1dGUgaXMgZGVmaW5lZC5cclxuXHQgKi9cclxuXHRnZXRJbmRpcmVjdCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5pbmRpcmVjdDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBidWZmZXIgYXR0cmlidXRlIGZvciB0aGUgZ2l2ZW4gbmFtZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIGF0dHJpYnV0ZSBuYW1lLlxyXG5cdCAqIEByZXR1cm4ge0J1ZmZlckF0dHJpYnV0ZXxJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZXx1bmRlZmluZWR9IFRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqIFJldHVybnMgYHVuZGVmaW5lZGAgaWYgbm90IGF0dHJpYnV0ZSBoYXMgYmVlbiBmb3VuZC5cclxuXHQgKi9cclxuXHRnZXRBdHRyaWJ1dGUoIG5hbWUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuYXR0cmlidXRlc1sgbmFtZSBdO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGdpdmVuIGF0dHJpYnV0ZSBmb3IgdGhlIGdpdmVuIG5hbWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBhdHRyaWJ1dGUgbmFtZS5cclxuXHQgKiBAcGFyYW0ge0J1ZmZlckF0dHJpYnV0ZXxJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZX0gYXR0cmlidXRlIC0gVGhlIGF0dHJpYnV0ZSB0byBzZXQuXHJcblx0ICogQHJldHVybiB7QnVmZmVyR2VvbWV0cnl9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0QXR0cmlidXRlKCBuYW1lLCBhdHRyaWJ1dGUgKSB7XHJcblxyXG5cdFx0dGhpcy5hdHRyaWJ1dGVzWyBuYW1lIF0gPSBhdHRyaWJ1dGU7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVsZXRlcyB0aGUgYXR0cmlidXRlIGZvciB0aGUgZ2l2ZW4gbmFtZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIGF0dHJpYnV0ZSBuYW1lIHRvIGRlbGV0ZS5cclxuXHQgKiBAcmV0dXJuIHtCdWZmZXJHZW9tZXRyeX0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRkZWxldGVBdHRyaWJ1dGUoIG5hbWUgKSB7XHJcblxyXG5cdFx0ZGVsZXRlIHRoaXMuYXR0cmlidXRlc1sgbmFtZSBdO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgZ2VvbWV0cnkgaGFzIGFuIGF0dHJpYnV0ZSBmb3IgdGhlIGdpdmVuIG5hbWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBhdHRyaWJ1dGUgbmFtZS5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoaXMgZ2VvbWV0cnkgaGFzIGFuIGF0dHJpYnV0ZSBmb3IgdGhlIGdpdmVuIG5hbWUgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGhhc0F0dHJpYnV0ZSggbmFtZSApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzWyBuYW1lIF0gIT09IHVuZGVmaW5lZDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIGEgZ3JvdXAgdG8gdGhpcyBnZW9tZXRyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCAtIFRoZSBmaXJzdCBlbGVtZW50IGluIHRoaXMgZHJhdyBjYWxsLiBUaGF0IGlzIHRoZSBmaXJzdFxyXG5cdCAqIHZlcnRleCBmb3Igbm9uLWluZGV4ZWQgZ2VvbWV0cnksIG90aGVyd2lzZSB0aGUgZmlyc3QgdHJpYW5nbGUgaW5kZXguXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGNvdW50IC0gU3BlY2lmaWVzIGhvdyBtYW55IHZlcnRpY2VzIChvciBpbmRpY2VzKSBhcmUgcGFydCBvZiB0aGlzIGdyb3VwLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbWF0ZXJpYWxJbmRleD0wXSAtIFRoZSBtYXRlcmlhbCBhcnJheSBpbmRleCB0byB1c2UuXHJcblx0ICovXHJcblx0YWRkR3JvdXAoIHN0YXJ0LCBjb3VudCwgbWF0ZXJpYWxJbmRleCA9IDAgKSB7XHJcblxyXG5cdFx0dGhpcy5ncm91cHMucHVzaCgge1xyXG5cclxuXHRcdFx0c3RhcnQ6IHN0YXJ0LFxyXG5cdFx0XHRjb3VudDogY291bnQsXHJcblx0XHRcdG1hdGVyaWFsSW5kZXg6IG1hdGVyaWFsSW5kZXhcclxuXHJcblx0XHR9ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2xlYXJzIGFsbCBncm91cHMuXHJcblx0ICovXHJcblx0Y2xlYXJHcm91cHMoKSB7XHJcblxyXG5cdFx0dGhpcy5ncm91cHMgPSBbXTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBkcmF3IHJhbmdlIGZvciB0aGlzIGdlb21ldHJ5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IC0gVGhlIGZpcnN0IHZlcnRleCBmb3Igbm9uLWluZGV4ZWQgZ2VvbWV0cnksIG90aGVyd2lzZSB0aGUgZmlyc3QgdHJpYW5nbGUgaW5kZXguXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGNvdW50IC0gRm9yIG5vbi1pbmRleGVkIEJ1ZmZlckdlb21ldHJ5LCBgY291bnRgIGlzIHRoZSBudW1iZXIgb2YgdmVydGljZXMgdG8gcmVuZGVyLlxyXG5cdCAqIEZvciBpbmRleGVkIEJ1ZmZlckdlb21ldHJ5LCBgY291bnRgIGlzIHRoZSBudW1iZXIgb2YgaW5kaWNlcyB0byByZW5kZXIuXHJcblx0ICovXHJcblx0c2V0RHJhd1JhbmdlKCBzdGFydCwgY291bnQgKSB7XHJcblxyXG5cdFx0dGhpcy5kcmF3UmFuZ2Uuc3RhcnQgPSBzdGFydDtcclxuXHRcdHRoaXMuZHJhd1JhbmdlLmNvdW50ID0gY291bnQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQXBwbGllcyB0aGUgZ2l2ZW4gNHg0IHRyYW5zZm9ybWF0aW9uIG1hdHJpeCB0byB0aGUgZ2VvbWV0cnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDR9IG1hdHJpeCAtIFRoZSBtYXRyaXggdG8gYXBwbHkuXHJcblx0ICogQHJldHVybiB7QnVmZmVyR2VvbWV0cnl9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0YXBwbHlNYXRyaXg0KCBtYXRyaXggKSB7XHJcblxyXG5cdFx0Y29uc3QgcG9zaXRpb24gPSB0aGlzLmF0dHJpYnV0ZXMucG9zaXRpb247XHJcblxyXG5cdFx0aWYgKCBwb3NpdGlvbiAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0cG9zaXRpb24uYXBwbHlNYXRyaXg0KCBtYXRyaXggKTtcclxuXHJcblx0XHRcdHBvc2l0aW9uLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3Qgbm9ybWFsID0gdGhpcy5hdHRyaWJ1dGVzLm5vcm1hbDtcclxuXHJcblx0XHRpZiAoIG5vcm1hbCAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgbm9ybWFsTWF0cml4ID0gbmV3IE1hdHJpeDMoKS5nZXROb3JtYWxNYXRyaXgoIG1hdHJpeCApO1xyXG5cclxuXHRcdFx0bm9ybWFsLmFwcGx5Tm9ybWFsTWF0cml4KCBub3JtYWxNYXRyaXggKTtcclxuXHJcblx0XHRcdG5vcm1hbC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHRhbmdlbnQgPSB0aGlzLmF0dHJpYnV0ZXMudGFuZ2VudDtcclxuXHJcblx0XHRpZiAoIHRhbmdlbnQgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHRhbmdlbnQudHJhbnNmb3JtRGlyZWN0aW9uKCBtYXRyaXggKTtcclxuXHJcblx0XHRcdHRhbmdlbnQubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMuYm91bmRpbmdCb3ggIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMuYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBcHBsaWVzIHRoZSByb3RhdGlvbiByZXByZXNlbnRlZCBieSB0aGUgUXVhdGVybmlvbiB0byB0aGUgZ2VvbWV0cnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1F1YXRlcm5pb259IHEgLSBUaGUgUXVhdGVybmlvbiB0byBhcHBseS5cclxuXHQgKiBAcmV0dXJuIHtCdWZmZXJHZW9tZXRyeX0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRhcHBseVF1YXRlcm5pb24oIHEgKSB7XHJcblxyXG5cdFx0X20xLm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKCBxICk7XHJcblxyXG5cdFx0dGhpcy5hcHBseU1hdHJpeDQoIF9tMSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJvdGF0ZXMgdGhlIGdlb21ldHJ5IGFib3V0IHRoZSBYIGF4aXMuIFRoaXMgaXMgdHlwaWNhbGx5IGRvbmUgYXMgYSBvbmUgdGltZVxyXG5cdCAqIG9wZXJhdGlvbiwgYW5kIG5vdCBkdXJpbmcgYSBsb29wLiBVc2Uge0BsaW5rIE9iamVjdDNEI3JvdGF0aW9ufSBmb3IgdHlwaWNhbFxyXG5cdCAqIHJlYWwtdGltZSBtZXNoIHJvdGF0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFuZ2xlIC0gVGhlIGFuZ2xlIGluIHJhZGlhbnMuXHJcblx0ICogQHJldHVybiB7QnVmZmVyR2VvbWV0cnl9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0cm90YXRlWCggYW5nbGUgKSB7XHJcblxyXG5cdFx0Ly8gcm90YXRlIGdlb21ldHJ5IGFyb3VuZCB3b3JsZCB4LWF4aXNcclxuXHJcblx0XHRfbTEubWFrZVJvdGF0aW9uWCggYW5nbGUgKTtcclxuXHJcblx0XHR0aGlzLmFwcGx5TWF0cml4NCggX20xICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUm90YXRlcyB0aGUgZ2VvbWV0cnkgYWJvdXQgdGhlIFkgYXhpcy4gVGhpcyBpcyB0eXBpY2FsbHkgZG9uZSBhcyBhIG9uZSB0aW1lXHJcblx0ICogb3BlcmF0aW9uLCBhbmQgbm90IGR1cmluZyBhIGxvb3AuIFVzZSB7QGxpbmsgT2JqZWN0M0Qjcm90YXRpb259IGZvciB0eXBpY2FsXHJcblx0ICogcmVhbC10aW1lIG1lc2ggcm90YXRpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYW5nbGUgLSBUaGUgYW5nbGUgaW4gcmFkaWFucy5cclxuXHQgKiBAcmV0dXJuIHtCdWZmZXJHZW9tZXRyeX0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRyb3RhdGVZKCBhbmdsZSApIHtcclxuXHJcblx0XHQvLyByb3RhdGUgZ2VvbWV0cnkgYXJvdW5kIHdvcmxkIHktYXhpc1xyXG5cclxuXHRcdF9tMS5tYWtlUm90YXRpb25ZKCBhbmdsZSApO1xyXG5cclxuXHRcdHRoaXMuYXBwbHlNYXRyaXg0KCBfbTEgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSb3RhdGVzIHRoZSBnZW9tZXRyeSBhYm91dCB0aGUgWiBheGlzLiBUaGlzIGlzIHR5cGljYWxseSBkb25lIGFzIGEgb25lIHRpbWVcclxuXHQgKiBvcGVyYXRpb24sIGFuZCBub3QgZHVyaW5nIGEgbG9vcC4gVXNlIHtAbGluayBPYmplY3QzRCNyb3RhdGlvbn0gZm9yIHR5cGljYWxcclxuXHQgKiByZWFsLXRpbWUgbWVzaCByb3RhdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhbmdsZSAtIFRoZSBhbmdsZSBpbiByYWRpYW5zLlxyXG5cdCAqIEByZXR1cm4ge0J1ZmZlckdlb21ldHJ5fSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHJvdGF0ZVooIGFuZ2xlICkge1xyXG5cclxuXHRcdC8vIHJvdGF0ZSBnZW9tZXRyeSBhcm91bmQgd29ybGQgei1heGlzXHJcblxyXG5cdFx0X20xLm1ha2VSb3RhdGlvblooIGFuZ2xlICk7XHJcblxyXG5cdFx0dGhpcy5hcHBseU1hdHJpeDQoIF9tMSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRyYW5zbGF0ZXMgdGhlIGdlb21ldHJ5LiBUaGlzIGlzIHR5cGljYWxseSBkb25lIGFzIGEgb25lIHRpbWVcclxuXHQgKiBvcGVyYXRpb24sIGFuZCBub3QgZHVyaW5nIGEgbG9vcC4gVXNlIHtAbGluayBPYmplY3QzRCNwb3NpdGlvbn0gZm9yIHR5cGljYWxcclxuXHQgKiByZWFsLXRpbWUgbWVzaCByb3RhdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHggb2Zmc2V0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHkgb2Zmc2V0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB6IC0gVGhlIHogb2Zmc2V0LlxyXG5cdCAqIEByZXR1cm4ge0J1ZmZlckdlb21ldHJ5fSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHRyYW5zbGF0ZSggeCwgeSwgeiApIHtcclxuXHJcblx0XHQvLyB0cmFuc2xhdGUgZ2VvbWV0cnlcclxuXHJcblx0XHRfbTEubWFrZVRyYW5zbGF0aW9uKCB4LCB5LCB6ICk7XHJcblxyXG5cdFx0dGhpcy5hcHBseU1hdHJpeDQoIF9tMSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNjYWxlcyB0aGUgZ2VvbWV0cnkuIFRoaXMgaXMgdHlwaWNhbGx5IGRvbmUgYXMgYSBvbmUgdGltZVxyXG5cdCAqIG9wZXJhdGlvbiwgYW5kIG5vdCBkdXJpbmcgYSBsb29wLiBVc2Uge0BsaW5rIE9iamVjdDNEI3NjYWxlfSBmb3IgdHlwaWNhbFxyXG5cdCAqIHJlYWwtdGltZSBtZXNoIHJvdGF0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeCBzY2FsZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB5IHNjYWxlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB6IC0gVGhlIHogc2NhbGUuXHJcblx0ICogQHJldHVybiB7QnVmZmVyR2VvbWV0cnl9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2NhbGUoIHgsIHksIHogKSB7XHJcblxyXG5cdFx0Ly8gc2NhbGUgZ2VvbWV0cnlcclxuXHJcblx0XHRfbTEubWFrZVNjYWxlKCB4LCB5LCB6ICk7XHJcblxyXG5cdFx0dGhpcy5hcHBseU1hdHJpeDQoIF9tMSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJvdGF0ZXMgdGhlIGdlb21ldHJ5IHRvIGZhY2UgYSBwb2ludCBpbiAzRCBzcGFjZS4gVGhpcyBpcyB0eXBpY2FsbHkgZG9uZSBhcyBhIG9uZSB0aW1lXHJcblx0ICogb3BlcmF0aW9uLCBhbmQgbm90IGR1cmluZyBhIGxvb3AuIFVzZSB7QGxpbmsgT2JqZWN0M0QjbG9va0F0fSBmb3IgdHlwaWNhbFxyXG5cdCAqIHJlYWwtdGltZSBtZXNoIHJvdGF0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB2ZWN0b3IgLSBUaGUgdGFyZ2V0IHBvaW50LlxyXG5cdCAqIEByZXR1cm4ge0J1ZmZlckdlb21ldHJ5fSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGxvb2tBdCggdmVjdG9yICkge1xyXG5cclxuXHRcdF9vYmoubG9va0F0KCB2ZWN0b3IgKTtcclxuXHJcblx0XHRfb2JqLnVwZGF0ZU1hdHJpeCgpO1xyXG5cclxuXHRcdHRoaXMuYXBwbHlNYXRyaXg0KCBfb2JqLm1hdHJpeCApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENlbnRlciB0aGUgZ2VvbWV0cnkgYmFzZWQgb24gaXRzIGJvdW5kaW5nIGJveC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0J1ZmZlckdlb21ldHJ5fSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNlbnRlcigpIHtcclxuXHJcblx0XHR0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpO1xyXG5cclxuXHRcdHRoaXMuYm91bmRpbmdCb3guZ2V0Q2VudGVyKCBfb2Zmc2V0ICkubmVnYXRlKCk7XHJcblxyXG5cdFx0dGhpcy50cmFuc2xhdGUoIF9vZmZzZXQueCwgX29mZnNldC55LCBfb2Zmc2V0LnogKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWZpbmVzIGEgZ2VvbWV0cnkgYnkgY3JlYXRpbmcgYSBgcG9zaXRpb25gIGF0dHJpYnV0ZSBiYXNlZCBvbiB0aGUgZ2l2ZW4gYXJyYXkgb2YgcG9pbnRzLiBUaGUgYXJyYXlcclxuXHQgKiBjYW4gaG9sZCAyRCBvciAzRCB2ZWN0b3JzLiBXaGVuIHVzaW5nIHR3by1kaW1lbnNpb25hbCBkYXRhLCB0aGUgYHpgIGNvb3JkaW5hdGUgZm9yIGFsbCB2ZXJ0aWNlcyBpc1xyXG5cdCAqIHNldCB0byBgMGAuXHJcblx0ICpcclxuXHQgKiBJZiB0aGUgbWV0aG9kIGlzIHVzZWQgd2l0aCBhbiBleGlzdGluZyBgcG9zaXRpb25gIGF0dHJpYnV0ZSwgdGhlIHZlcnRleCBkYXRhIGFyZSBvdmVyd3JpdHRlbiB3aXRoIHRoZVxyXG5cdCAqIGRhdGEgZnJvbSB0aGUgYXJyYXkuIFRoZSBsZW5ndGggb2YgdGhlIGFycmF5IG11c3QgbWF0Y2ggdGhlIHZlcnRleCBjb3VudC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8VmVjdG9yMj58QXJyYXk8VmVjdG9yMz59IHBvaW50cyAtIFRoZSBwb2ludHMuXHJcblx0ICogQHJldHVybiB7QnVmZmVyR2VvbWV0cnl9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0RnJvbVBvaW50cyggcG9pbnRzICkge1xyXG5cclxuXHRcdGNvbnN0IHBvc2l0aW9uQXR0cmlidXRlID0gdGhpcy5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKTtcclxuXHJcblx0XHRpZiAoIHBvc2l0aW9uQXR0cmlidXRlID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBwb3NpdGlvbiA9IFtdO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gcG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHBvaW50ID0gcG9pbnRzWyBpIF07XHJcblx0XHRcdFx0cG9zaXRpb24ucHVzaCggcG9pbnQueCwgcG9pbnQueSwgcG9pbnQueiB8fCAwICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCAzICkgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc3QgbCA9IE1hdGgubWluKCBwb2ludHMubGVuZ3RoLCBwb3NpdGlvbkF0dHJpYnV0ZS5jb3VudCApOyAvLyBtYWtlIHN1cmUgZGF0YSBkbyBub3QgZXhjZWVkIGJ1ZmZlciBzaXplXHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBwb2ludCA9IHBvaW50c1sgaSBdO1xyXG5cdFx0XHRcdHBvc2l0aW9uQXR0cmlidXRlLnNldFhZWiggaSwgcG9pbnQueCwgcG9pbnQueSwgcG9pbnQueiB8fCAwICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHBvaW50cy5sZW5ndGggPiBwb3NpdGlvbkF0dHJpYnV0ZS5jb3VudCApIHtcclxuXHJcblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IEJ1ZmZlciBzaXplIHRvbyBzbWFsbCBmb3IgcG9pbnRzIGRhdGEuIFVzZSAuZGlzcG9zZSgpIGFuZCBjcmVhdGUgYSBuZXcgZ2VvbWV0cnkuJyApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cG9zaXRpb25BdHRyaWJ1dGUubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB0aGUgYm91bmRpbmcgYm94IG9mIHRoZSBnZW9tZXRyeSwgYW5kIHVwZGF0ZXMgdGhlIGBib3VuZGluZ0JveGAgbWVtYmVyLlxyXG5cdCAqIFRoZSBib3VuZGluZyBib3ggaXMgbm90IGNvbXB1dGVkIGJ5IHRoZSBlbmdpbmU7IGl0IG11c3QgYmUgY29tcHV0ZWQgYnkgeW91ciBhcHAuXHJcblx0ICogWW91IG1heSBuZWVkIHRvIHJlY29tcHV0ZSB0aGUgYm91bmRpbmcgYm94IGlmIHRoZSBnZW9tZXRyeSB2ZXJ0aWNlcyBhcmUgbW9kaWZpZWQuXHJcblx0ICovXHJcblx0Y29tcHV0ZUJvdW5kaW5nQm94KCkge1xyXG5cclxuXHRcdGlmICggdGhpcy5ib3VuZGluZ0JveCA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuYm91bmRpbmdCb3ggPSBuZXcgQm94MygpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBwb3NpdGlvbiA9IHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjtcclxuXHRcdGNvbnN0IG1vcnBoQXR0cmlidXRlc1Bvc2l0aW9uID0gdGhpcy5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb247XHJcblxyXG5cdFx0aWYgKCBwb3NpdGlvbiAmJiBwb3NpdGlvbi5pc0dMQnVmZmVyQXR0cmlidXRlICkge1xyXG5cclxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ0JveCgpOiBHTEJ1ZmZlckF0dHJpYnV0ZSByZXF1aXJlcyBhIG1hbnVhbCBib3VuZGluZyBib3guJywgdGhpcyApO1xyXG5cclxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveC5zZXQoXHJcblx0XHRcdFx0bmV3IFZlY3RvcjMoIC0gSW5maW5pdHksIC0gSW5maW5pdHksIC0gSW5maW5pdHkgKSxcclxuXHRcdFx0XHRuZXcgVmVjdG9yMyggKyBJbmZpbml0eSwgKyBJbmZpbml0eSwgKyBJbmZpbml0eSApXHJcblx0XHRcdCk7XHJcblxyXG5cdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggcG9zaXRpb24gIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHRoaXMuYm91bmRpbmdCb3guc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24gKTtcclxuXHJcblx0XHRcdC8vIHByb2Nlc3MgbW9ycGggYXR0cmlidXRlcyBpZiBwcmVzZW50XHJcblxyXG5cdFx0XHRpZiAoIG1vcnBoQXR0cmlidXRlc1Bvc2l0aW9uICkge1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gbW9ycGhBdHRyaWJ1dGVzUG9zaXRpb24ubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgbW9ycGhBdHRyaWJ1dGUgPSBtb3JwaEF0dHJpYnV0ZXNQb3NpdGlvblsgaSBdO1xyXG5cdFx0XHRcdFx0X2JveC5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKCBtb3JwaEF0dHJpYnV0ZSApO1xyXG5cclxuXHRcdFx0XHRcdGlmICggdGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdF92ZWN0b3IuYWRkVmVjdG9ycyggdGhpcy5ib3VuZGluZ0JveC5taW4sIF9ib3gubWluICk7XHJcblx0XHRcdFx0XHRcdHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludCggX3ZlY3RvciApO1xyXG5cclxuXHRcdFx0XHRcdFx0X3ZlY3Rvci5hZGRWZWN0b3JzKCB0aGlzLmJvdW5kaW5nQm94Lm1heCwgX2JveC5tYXggKTtcclxuXHRcdFx0XHRcdFx0dGhpcy5ib3VuZGluZ0JveC5leHBhbmRCeVBvaW50KCBfdmVjdG9yICk7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludCggX2JveC5taW4gKTtcclxuXHRcdFx0XHRcdFx0dGhpcy5ib3VuZGluZ0JveC5leHBhbmRCeVBvaW50KCBfYm94Lm1heCApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR0aGlzLmJvdW5kaW5nQm94Lm1ha2VFbXB0eSgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGlzTmFOKCB0aGlzLmJvdW5kaW5nQm94Lm1pbi54ICkgfHwgaXNOYU4oIHRoaXMuYm91bmRpbmdCb3gubWluLnkgKSB8fCBpc05hTiggdGhpcy5ib3VuZGluZ0JveC5taW4ueiApICkge1xyXG5cclxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ0JveCgpOiBDb21wdXRlZCBtaW4vbWF4IGhhdmUgTmFOIHZhbHVlcy4gVGhlIFwicG9zaXRpb25cIiBhdHRyaWJ1dGUgaXMgbGlrZWx5IHRvIGhhdmUgTmFOIHZhbHVlcy4nLCB0aGlzICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSBib3VuZGluZyBzcGhlcmUgb2YgdGhlIGdlb21ldHJ5LCBhbmQgdXBkYXRlcyB0aGUgYGJvdW5kaW5nU3BoZXJlYCBtZW1iZXIuXHJcblx0ICogVGhlIGVuZ2luZSBhdXRvbWF0aWNhbGx5IGNvbXB1dGVzIHRoZSBib3VuZGluZyBzcGhlcmUgd2hlbiBpdCBpcyBuZWVkZWQsIGUuZy4sIGZvciByYXkgY2FzdGluZyBvciB2aWV3IGZydXN0dW0gY3VsbGluZy5cclxuXHQgKiBZb3UgbWF5IG5lZWQgdG8gcmVjb21wdXRlIHRoZSBib3VuZGluZyBzcGhlcmUgaWYgdGhlIGdlb21ldHJ5IHZlcnRpY2VzIGFyZSBtb2RpZmllZC5cclxuXHQgKi9cclxuXHRjb21wdXRlQm91bmRpbmdTcGhlcmUoKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmJvdW5kaW5nU3BoZXJlID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IG5ldyBTcGhlcmUoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgcG9zaXRpb24gPSB0aGlzLmF0dHJpYnV0ZXMucG9zaXRpb247XHJcblx0XHRjb25zdCBtb3JwaEF0dHJpYnV0ZXNQb3NpdGlvbiA9IHRoaXMubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uO1xyXG5cclxuXHRcdGlmICggcG9zaXRpb24gJiYgcG9zaXRpb24uaXNHTEJ1ZmZlckF0dHJpYnV0ZSApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTogR0xCdWZmZXJBdHRyaWJ1dGUgcmVxdWlyZXMgYSBtYW51YWwgYm91bmRpbmcgc3BoZXJlLicsIHRoaXMgKTtcclxuXHJcblx0XHRcdHRoaXMuYm91bmRpbmdTcGhlcmUuc2V0KCBuZXcgVmVjdG9yMygpLCBJbmZpbml0eSApO1xyXG5cclxuXHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHBvc2l0aW9uICkge1xyXG5cclxuXHRcdFx0Ly8gZmlyc3QsIGZpbmQgdGhlIGNlbnRlciBvZiB0aGUgYm91bmRpbmcgc3BoZXJlXHJcblxyXG5cdFx0XHRjb25zdCBjZW50ZXIgPSB0aGlzLmJvdW5kaW5nU3BoZXJlLmNlbnRlcjtcclxuXHJcblx0XHRcdF9ib3guc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24gKTtcclxuXHJcblx0XHRcdC8vIHByb2Nlc3MgbW9ycGggYXR0cmlidXRlcyBpZiBwcmVzZW50XHJcblxyXG5cdFx0XHRpZiAoIG1vcnBoQXR0cmlidXRlc1Bvc2l0aW9uICkge1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gbW9ycGhBdHRyaWJ1dGVzUG9zaXRpb24ubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgbW9ycGhBdHRyaWJ1dGUgPSBtb3JwaEF0dHJpYnV0ZXNQb3NpdGlvblsgaSBdO1xyXG5cdFx0XHRcdFx0X2JveE1vcnBoVGFyZ2V0cy5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKCBtb3JwaEF0dHJpYnV0ZSApO1xyXG5cclxuXHRcdFx0XHRcdGlmICggdGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdF92ZWN0b3IuYWRkVmVjdG9ycyggX2JveC5taW4sIF9ib3hNb3JwaFRhcmdldHMubWluICk7XHJcblx0XHRcdFx0XHRcdF9ib3guZXhwYW5kQnlQb2ludCggX3ZlY3RvciApO1xyXG5cclxuXHRcdFx0XHRcdFx0X3ZlY3Rvci5hZGRWZWN0b3JzKCBfYm94Lm1heCwgX2JveE1vcnBoVGFyZ2V0cy5tYXggKTtcclxuXHRcdFx0XHRcdFx0X2JveC5leHBhbmRCeVBvaW50KCBfdmVjdG9yICk7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdF9ib3guZXhwYW5kQnlQb2ludCggX2JveE1vcnBoVGFyZ2V0cy5taW4gKTtcclxuXHRcdFx0XHRcdFx0X2JveC5leHBhbmRCeVBvaW50KCBfYm94TW9ycGhUYXJnZXRzLm1heCApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0X2JveC5nZXRDZW50ZXIoIGNlbnRlciApO1xyXG5cclxuXHRcdFx0Ly8gc2Vjb25kLCB0cnkgdG8gZmluZCBhIGJvdW5kaW5nU3BoZXJlIHdpdGggYSByYWRpdXMgc21hbGxlciB0aGFuIHRoZVxyXG5cdFx0XHQvLyBib3VuZGluZ1NwaGVyZSBvZiB0aGUgYm91bmRpbmdCb3g6IHNxcnQoMykgc21hbGxlciBpbiB0aGUgYmVzdCBjYXNlXHJcblxyXG5cdFx0XHRsZXQgbWF4UmFkaXVzU3EgPSAwO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IHBvc2l0aW9uLmNvdW50OyBpIDwgaWw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdF92ZWN0b3IuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIGkgKTtcclxuXHJcblx0XHRcdFx0bWF4UmFkaXVzU3EgPSBNYXRoLm1heCggbWF4UmFkaXVzU3EsIGNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZCggX3ZlY3RvciApICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBwcm9jZXNzIG1vcnBoIGF0dHJpYnV0ZXMgaWYgcHJlc2VudFxyXG5cclxuXHRcdFx0aWYgKCBtb3JwaEF0dHJpYnV0ZXNQb3NpdGlvbiApIHtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IG1vcnBoQXR0cmlidXRlc1Bvc2l0aW9uLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IG1vcnBoQXR0cmlidXRlID0gbW9ycGhBdHRyaWJ1dGVzUG9zaXRpb25bIGkgXTtcclxuXHRcdFx0XHRcdGNvbnN0IG1vcnBoVGFyZ2V0c1JlbGF0aXZlID0gdGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZTtcclxuXHJcblx0XHRcdFx0XHRmb3IgKCBsZXQgaiA9IDAsIGpsID0gbW9ycGhBdHRyaWJ1dGUuY291bnQ7IGogPCBqbDsgaiArKyApIHtcclxuXHJcblx0XHRcdFx0XHRcdF92ZWN0b3IuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggbW9ycGhBdHRyaWJ1dGUsIGogKTtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggbW9ycGhUYXJnZXRzUmVsYXRpdmUgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdF9vZmZzZXQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIGogKTtcclxuXHRcdFx0XHRcdFx0XHRfdmVjdG9yLmFkZCggX29mZnNldCApO1xyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0bWF4UmFkaXVzU3EgPSBNYXRoLm1heCggbWF4UmFkaXVzU3EsIGNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZCggX3ZlY3RvciApICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cyA9IE1hdGguc3FydCggbWF4UmFkaXVzU3EgKTtcclxuXHJcblx0XHRcdGlmICggaXNOYU4oIHRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzICkgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTogQ29tcHV0ZWQgcmFkaXVzIGlzIE5hTi4gVGhlIFwicG9zaXRpb25cIiBhdHRyaWJ1dGUgaXMgbGlrZWx5IHRvIGhhdmUgTmFOIHZhbHVlcy4nLCB0aGlzICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENhbGN1bGF0ZXMgYW5kIGFkZHMgYSB0YW5nZW50IGF0dHJpYnV0ZSB0byB0aGlzIGdlb21ldHJ5LlxyXG5cdCAqXHJcblx0ICogVGhlIGNvbXB1dGF0aW9uIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBpbmRleGVkIGdlb21ldHJpZXMgYW5kIGlmIHBvc2l0aW9uLCBub3JtYWwsIGFuZCB1diBhdHRyaWJ1dGVzXHJcblx0ICogYXJlIGRlZmluZWQuIFdoZW4gdXNpbmcgYSB0YW5nZW50IHNwYWNlIG5vcm1hbCBtYXAsIHByZWZlciB0aGUgTWlra1RTcGFjZSBhbGdvcml0aG0gcHJvdmlkZWQgYnlcclxuXHQgKiB7QGxpbmsgQnVmZmVyR2VvbWV0cnlVdGlscyNjb21wdXRlTWlra1RTcGFjZVRhbmdlbnRzfSBpbnN0ZWFkLlxyXG5cdCAqL1xyXG5cdGNvbXB1dGVUYW5nZW50cygpIHtcclxuXHJcblx0XHRjb25zdCBpbmRleCA9IHRoaXMuaW5kZXg7XHJcblx0XHRjb25zdCBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzO1xyXG5cclxuXHRcdC8vIGJhc2VkIG9uIGh0dHA6Ly93d3cudGVyYXRob24uY29tL2NvZGUvdGFuZ2VudC5odG1sXHJcblx0XHQvLyAocGVyIHZlcnRleCB0YW5nZW50cylcclxuXHJcblx0XHRpZiAoIGluZGV4ID09PSBudWxsIHx8XHJcblx0XHRcdCBhdHRyaWJ1dGVzLnBvc2l0aW9uID09PSB1bmRlZmluZWQgfHxcclxuXHRcdFx0IGF0dHJpYnV0ZXMubm9ybWFsID09PSB1bmRlZmluZWQgfHxcclxuXHRcdFx0IGF0dHJpYnV0ZXMudXYgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmNvbXB1dGVUYW5nZW50cygpIGZhaWxlZC4gTWlzc2luZyByZXF1aXJlZCBhdHRyaWJ1dGVzIChpbmRleCwgcG9zaXRpb24sIG5vcm1hbCBvciB1diknICk7XHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgcG9zaXRpb25BdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLnBvc2l0aW9uO1xyXG5cdFx0Y29uc3Qgbm9ybWFsQXR0cmlidXRlID0gYXR0cmlidXRlcy5ub3JtYWw7XHJcblx0XHRjb25zdCB1dkF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMudXY7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmhhc0F0dHJpYnV0ZSggJ3RhbmdlbnQnICkgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICd0YW5nZW50JywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggbmV3IEZsb2F0MzJBcnJheSggNCAqIHBvc2l0aW9uQXR0cmlidXRlLmNvdW50ICksIDQgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCB0YW5nZW50QXR0cmlidXRlID0gdGhpcy5nZXRBdHRyaWJ1dGUoICd0YW5nZW50JyApO1xyXG5cclxuXHRcdGNvbnN0IHRhbjEgPSBbXSwgdGFuMiA9IFtdO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHBvc2l0aW9uQXR0cmlidXRlLmNvdW50OyBpICsrICkge1xyXG5cclxuXHRcdFx0dGFuMVsgaSBdID0gbmV3IFZlY3RvcjMoKTtcclxuXHRcdFx0dGFuMlsgaSBdID0gbmV3IFZlY3RvcjMoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgdkEgPSBuZXcgVmVjdG9yMygpLFxyXG5cdFx0XHR2QiA9IG5ldyBWZWN0b3IzKCksXHJcblx0XHRcdHZDID0gbmV3IFZlY3RvcjMoKSxcclxuXHJcblx0XHRcdHV2QSA9IG5ldyBWZWN0b3IyKCksXHJcblx0XHRcdHV2QiA9IG5ldyBWZWN0b3IyKCksXHJcblx0XHRcdHV2QyA9IG5ldyBWZWN0b3IyKCksXHJcblxyXG5cdFx0XHRzZGlyID0gbmV3IFZlY3RvcjMoKSxcclxuXHRcdFx0dGRpciA9IG5ldyBWZWN0b3IzKCk7XHJcblxyXG5cdFx0ZnVuY3Rpb24gaGFuZGxlVHJpYW5nbGUoIGEsIGIsIGMgKSB7XHJcblxyXG5cdFx0XHR2QS5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbkF0dHJpYnV0ZSwgYSApO1xyXG5cdFx0XHR2Qi5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbkF0dHJpYnV0ZSwgYiApO1xyXG5cdFx0XHR2Qy5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbkF0dHJpYnV0ZSwgYyApO1xyXG5cclxuXHRcdFx0dXZBLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHV2QXR0cmlidXRlLCBhICk7XHJcblx0XHRcdHV2Qi5mcm9tQnVmZmVyQXR0cmlidXRlKCB1dkF0dHJpYnV0ZSwgYiApO1xyXG5cdFx0XHR1dkMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggdXZBdHRyaWJ1dGUsIGMgKTtcclxuXHJcblx0XHRcdHZCLnN1YiggdkEgKTtcclxuXHRcdFx0dkMuc3ViKCB2QSApO1xyXG5cclxuXHRcdFx0dXZCLnN1YiggdXZBICk7XHJcblx0XHRcdHV2Qy5zdWIoIHV2QSApO1xyXG5cclxuXHRcdFx0Y29uc3QgciA9IDEuMCAvICggdXZCLnggKiB1dkMueSAtIHV2Qy54ICogdXZCLnkgKTtcclxuXHJcblx0XHRcdC8vIHNpbGVudGx5IGlnbm9yZSBkZWdlbmVyYXRlIHV2IHRyaWFuZ2xlcyBoYXZpbmcgY29pbmNpZGVudCBvciBjb2xpbmVhciB2ZXJ0aWNlc1xyXG5cclxuXHRcdFx0aWYgKCAhIGlzRmluaXRlKCByICkgKSByZXR1cm47XHJcblxyXG5cdFx0XHRzZGlyLmNvcHkoIHZCICkubXVsdGlwbHlTY2FsYXIoIHV2Qy55ICkuYWRkU2NhbGVkVmVjdG9yKCB2QywgLSB1dkIueSApLm11bHRpcGx5U2NhbGFyKCByICk7XHJcblx0XHRcdHRkaXIuY29weSggdkMgKS5tdWx0aXBseVNjYWxhciggdXZCLnggKS5hZGRTY2FsZWRWZWN0b3IoIHZCLCAtIHV2Qy54ICkubXVsdGlwbHlTY2FsYXIoIHIgKTtcclxuXHJcblx0XHRcdHRhbjFbIGEgXS5hZGQoIHNkaXIgKTtcclxuXHRcdFx0dGFuMVsgYiBdLmFkZCggc2RpciApO1xyXG5cdFx0XHR0YW4xWyBjIF0uYWRkKCBzZGlyICk7XHJcblxyXG5cdFx0XHR0YW4yWyBhIF0uYWRkKCB0ZGlyICk7XHJcblx0XHRcdHRhbjJbIGIgXS5hZGQoIHRkaXIgKTtcclxuXHRcdFx0dGFuMlsgYyBdLmFkZCggdGRpciApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRsZXQgZ3JvdXBzID0gdGhpcy5ncm91cHM7XHJcblxyXG5cdFx0aWYgKCBncm91cHMubGVuZ3RoID09PSAwICkge1xyXG5cclxuXHRcdFx0Z3JvdXBzID0gWyB7XHJcblx0XHRcdFx0c3RhcnQ6IDAsXHJcblx0XHRcdFx0Y291bnQ6IGluZGV4LmNvdW50XHJcblx0XHRcdH0gXTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IGdyb3Vwcy5sZW5ndGg7IGkgPCBpbDsgKysgaSApIHtcclxuXHJcblx0XHRcdGNvbnN0IGdyb3VwID0gZ3JvdXBzWyBpIF07XHJcblxyXG5cdFx0XHRjb25zdCBzdGFydCA9IGdyb3VwLnN0YXJ0O1xyXG5cdFx0XHRjb25zdCBjb3VudCA9IGdyb3VwLmNvdW50O1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGogPSBzdGFydCwgamwgPSBzdGFydCArIGNvdW50OyBqIDwgamw7IGogKz0gMyApIHtcclxuXHJcblx0XHRcdFx0aGFuZGxlVHJpYW5nbGUoXHJcblx0XHRcdFx0XHRpbmRleC5nZXRYKCBqICsgMCApLFxyXG5cdFx0XHRcdFx0aW5kZXguZ2V0WCggaiArIDEgKSxcclxuXHRcdFx0XHRcdGluZGV4LmdldFgoIGogKyAyIClcclxuXHRcdFx0XHQpO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCB0bXAgPSBuZXcgVmVjdG9yMygpLCB0bXAyID0gbmV3IFZlY3RvcjMoKTtcclxuXHRcdGNvbnN0IG4gPSBuZXcgVmVjdG9yMygpLCBuMiA9IG5ldyBWZWN0b3IzKCk7XHJcblxyXG5cdFx0ZnVuY3Rpb24gaGFuZGxlVmVydGV4KCB2ICkge1xyXG5cclxuXHRcdFx0bi5mcm9tQnVmZmVyQXR0cmlidXRlKCBub3JtYWxBdHRyaWJ1dGUsIHYgKTtcclxuXHRcdFx0bjIuY29weSggbiApO1xyXG5cclxuXHRcdFx0Y29uc3QgdCA9IHRhbjFbIHYgXTtcclxuXHJcblx0XHRcdC8vIEdyYW0tU2NobWlkdCBvcnRob2dvbmFsaXplXHJcblxyXG5cdFx0XHR0bXAuY29weSggdCApO1xyXG5cdFx0XHR0bXAuc3ViKCBuLm11bHRpcGx5U2NhbGFyKCBuLmRvdCggdCApICkgKS5ub3JtYWxpemUoKTtcclxuXHJcblx0XHRcdC8vIENhbGN1bGF0ZSBoYW5kZWRuZXNzXHJcblxyXG5cdFx0XHR0bXAyLmNyb3NzVmVjdG9ycyggbjIsIHQgKTtcclxuXHRcdFx0Y29uc3QgdGVzdCA9IHRtcDIuZG90KCB0YW4yWyB2IF0gKTtcclxuXHRcdFx0Y29uc3QgdyA9ICggdGVzdCA8IDAuMCApID8gLSAxLjAgOiAxLjA7XHJcblxyXG5cdFx0XHR0YW5nZW50QXR0cmlidXRlLnNldFhZWlcoIHYsIHRtcC54LCB0bXAueSwgdG1wLnosIHcgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IGdyb3Vwcy5sZW5ndGg7IGkgPCBpbDsgKysgaSApIHtcclxuXHJcblx0XHRcdGNvbnN0IGdyb3VwID0gZ3JvdXBzWyBpIF07XHJcblxyXG5cdFx0XHRjb25zdCBzdGFydCA9IGdyb3VwLnN0YXJ0O1xyXG5cdFx0XHRjb25zdCBjb3VudCA9IGdyb3VwLmNvdW50O1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGogPSBzdGFydCwgamwgPSBzdGFydCArIGNvdW50OyBqIDwgamw7IGogKz0gMyApIHtcclxuXHJcblx0XHRcdFx0aGFuZGxlVmVydGV4KCBpbmRleC5nZXRYKCBqICsgMCApICk7XHJcblx0XHRcdFx0aGFuZGxlVmVydGV4KCBpbmRleC5nZXRYKCBqICsgMSApICk7XHJcblx0XHRcdFx0aGFuZGxlVmVydGV4KCBpbmRleC5nZXRYKCBqICsgMiApICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHZlcnRleCBub3JtYWxzIGZvciB0aGUgZ2l2ZW4gdmVydGV4IGRhdGEuIEZvciBpbmRleGVkIGdlb21ldHJpZXMsIHRoZSBtZXRob2Qgc2V0c1xyXG5cdCAqIGVhY2ggdmVydGV4IG5vcm1hbCB0byBiZSB0aGUgYXZlcmFnZSBvZiB0aGUgZmFjZSBub3JtYWxzIG9mIHRoZSBmYWNlcyB0aGF0IHNoYXJlIHRoYXQgdmVydGV4LlxyXG5cdCAqIEZvciBub24taW5kZXhlZCBnZW9tZXRyaWVzLCB2ZXJ0aWNlcyBhcmUgbm90IHNoYXJlZCwgYW5kIHRoZSBtZXRob2Qgc2V0cyBlYWNoIHZlcnRleCBub3JtYWxcclxuXHQgKiB0byBiZSB0aGUgc2FtZSBhcyB0aGUgZmFjZSBub3JtYWwuXHJcblx0ICovXHJcblx0Y29tcHV0ZVZlcnRleE5vcm1hbHMoKSB7XHJcblxyXG5cdFx0Y29uc3QgaW5kZXggPSB0aGlzLmluZGV4O1xyXG5cdFx0Y29uc3QgcG9zaXRpb25BdHRyaWJ1dGUgPSB0aGlzLmdldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJyApO1xyXG5cclxuXHRcdGlmICggcG9zaXRpb25BdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGxldCBub3JtYWxBdHRyaWJ1dGUgPSB0aGlzLmdldEF0dHJpYnV0ZSggJ25vcm1hbCcgKTtcclxuXHJcblx0XHRcdGlmICggbm9ybWFsQXR0cmlidXRlID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdG5vcm1hbEF0dHJpYnV0ZSA9IG5ldyBCdWZmZXJBdHRyaWJ1dGUoIG5ldyBGbG9hdDMyQXJyYXkoIHBvc2l0aW9uQXR0cmlidXRlLmNvdW50ICogMyApLCAzICk7XHJcblx0XHRcdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdub3JtYWwnLCBub3JtYWxBdHRyaWJ1dGUgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdC8vIHJlc2V0IGV4aXN0aW5nIG5vcm1hbHMgdG8gemVyb1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gbm9ybWFsQXR0cmlidXRlLmNvdW50OyBpIDwgaWw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0bm9ybWFsQXR0cmlidXRlLnNldFhZWiggaSwgMCwgMCwgMCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBwQSA9IG5ldyBWZWN0b3IzKCksIHBCID0gbmV3IFZlY3RvcjMoKSwgcEMgPSBuZXcgVmVjdG9yMygpO1xyXG5cdFx0XHRjb25zdCBuQSA9IG5ldyBWZWN0b3IzKCksIG5CID0gbmV3IFZlY3RvcjMoKSwgbkMgPSBuZXcgVmVjdG9yMygpO1xyXG5cdFx0XHRjb25zdCBjYiA9IG5ldyBWZWN0b3IzKCksIGFiID0gbmV3IFZlY3RvcjMoKTtcclxuXHJcblx0XHRcdC8vIGluZGV4ZWQgZWxlbWVudHNcclxuXHJcblx0XHRcdGlmICggaW5kZXggKSB7XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBpbmRleC5jb3VudDsgaSA8IGlsOyBpICs9IDMgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgdkEgPSBpbmRleC5nZXRYKCBpICsgMCApO1xyXG5cdFx0XHRcdFx0Y29uc3QgdkIgPSBpbmRleC5nZXRYKCBpICsgMSApO1xyXG5cdFx0XHRcdFx0Y29uc3QgdkMgPSBpbmRleC5nZXRYKCBpICsgMiApO1xyXG5cclxuXHRcdFx0XHRcdHBBLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uQXR0cmlidXRlLCB2QSApO1xyXG5cdFx0XHRcdFx0cEIuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyaWJ1dGUsIHZCICk7XHJcblx0XHRcdFx0XHRwQy5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbkF0dHJpYnV0ZSwgdkMgKTtcclxuXHJcblx0XHRcdFx0XHRjYi5zdWJWZWN0b3JzKCBwQywgcEIgKTtcclxuXHRcdFx0XHRcdGFiLnN1YlZlY3RvcnMoIHBBLCBwQiApO1xyXG5cdFx0XHRcdFx0Y2IuY3Jvc3MoIGFiICk7XHJcblxyXG5cdFx0XHRcdFx0bkEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFsQXR0cmlidXRlLCB2QSApO1xyXG5cdFx0XHRcdFx0bkIuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFsQXR0cmlidXRlLCB2QiApO1xyXG5cdFx0XHRcdFx0bkMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFsQXR0cmlidXRlLCB2QyApO1xyXG5cclxuXHRcdFx0XHRcdG5BLmFkZCggY2IgKTtcclxuXHRcdFx0XHRcdG5CLmFkZCggY2IgKTtcclxuXHRcdFx0XHRcdG5DLmFkZCggY2IgKTtcclxuXHJcblx0XHRcdFx0XHRub3JtYWxBdHRyaWJ1dGUuc2V0WFlaKCB2QSwgbkEueCwgbkEueSwgbkEueiApO1xyXG5cdFx0XHRcdFx0bm9ybWFsQXR0cmlidXRlLnNldFhZWiggdkIsIG5CLngsIG5CLnksIG5CLnogKTtcclxuXHRcdFx0XHRcdG5vcm1hbEF0dHJpYnV0ZS5zZXRYWVooIHZDLCBuQy54LCBuQy55LCBuQy56ICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdC8vIG5vbi1pbmRleGVkIGVsZW1lbnRzICh1bmNvbm5lY3RlZCB0cmlhbmdsZSBzb3VwKVxyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gcG9zaXRpb25BdHRyaWJ1dGUuY291bnQ7IGkgPCBpbDsgaSArPSAzICkge1xyXG5cclxuXHRcdFx0XHRcdHBBLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uQXR0cmlidXRlLCBpICsgMCApO1xyXG5cdFx0XHRcdFx0cEIuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyaWJ1dGUsIGkgKyAxICk7XHJcblx0XHRcdFx0XHRwQy5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbkF0dHJpYnV0ZSwgaSArIDIgKTtcclxuXHJcblx0XHRcdFx0XHRjYi5zdWJWZWN0b3JzKCBwQywgcEIgKTtcclxuXHRcdFx0XHRcdGFiLnN1YlZlY3RvcnMoIHBBLCBwQiApO1xyXG5cdFx0XHRcdFx0Y2IuY3Jvc3MoIGFiICk7XHJcblxyXG5cdFx0XHRcdFx0bm9ybWFsQXR0cmlidXRlLnNldFhZWiggaSArIDAsIGNiLngsIGNiLnksIGNiLnogKTtcclxuXHRcdFx0XHRcdG5vcm1hbEF0dHJpYnV0ZS5zZXRYWVooIGkgKyAxLCBjYi54LCBjYi55LCBjYi56ICk7XHJcblx0XHRcdFx0XHRub3JtYWxBdHRyaWJ1dGUuc2V0WFlaKCBpICsgMiwgY2IueCwgY2IueSwgY2IueiApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0aGlzLm5vcm1hbGl6ZU5vcm1hbHMoKTtcclxuXHJcblx0XHRcdG5vcm1hbEF0dHJpYnV0ZS5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEVuc3VyZXMgZXZlcnkgbm9ybWFsIHZlY3RvciBpbiBhIGdlb21ldHJ5IHdpbGwgaGF2ZSBhIG1hZ25pdHVkZSBvZiBgMWAuIFRoaXMgd2lsbFxyXG5cdCAqIGNvcnJlY3QgbGlnaHRpbmcgb24gdGhlIGdlb21ldHJ5IHN1cmZhY2VzLlxyXG5cdCAqL1xyXG5cdG5vcm1hbGl6ZU5vcm1hbHMoKSB7XHJcblxyXG5cdFx0Y29uc3Qgbm9ybWFscyA9IHRoaXMuYXR0cmlidXRlcy5ub3JtYWw7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IG5vcm1hbHMuY291bnQ7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHRcdF92ZWN0b3IuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgaSApO1xyXG5cclxuXHRcdFx0X3ZlY3Rvci5ub3JtYWxpemUoKTtcclxuXHJcblx0XHRcdG5vcm1hbHMuc2V0WFlaKCBpLCBfdmVjdG9yLngsIF92ZWN0b3IueSwgX3ZlY3Rvci56ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybiBhIG5ldyBub24taW5kZXggdmVyc2lvbiBvZiB0aGlzIGluZGV4ZWQgZ2VvbWV0cnkuIElmIHRoZSBnZW9tZXRyeVxyXG5cdCAqIGlzIGFscmVhZHkgbm9uLWluZGV4ZWQsIHRoZSBtZXRob2QgaXMgYSBOT09QLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7QnVmZmVyR2VvbWV0cnl9IFRoZSBub24taW5kZXhlZCB2ZXJzaW9uIG9mIHRoaXMgaW5kZXhlZCBnZW9tZXRyeS5cclxuXHQgKi9cclxuXHR0b05vbkluZGV4ZWQoKSB7XHJcblxyXG5cdFx0ZnVuY3Rpb24gY29udmVydEJ1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlLCBpbmRpY2VzICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYXJyYXkgPSBhdHRyaWJ1dGUuYXJyYXk7XHJcblx0XHRcdGNvbnN0IGl0ZW1TaXplID0gYXR0cmlidXRlLml0ZW1TaXplO1xyXG5cdFx0XHRjb25zdCBub3JtYWxpemVkID0gYXR0cmlidXRlLm5vcm1hbGl6ZWQ7XHJcblxyXG5cdFx0XHRjb25zdCBhcnJheTIgPSBuZXcgYXJyYXkuY29uc3RydWN0b3IoIGluZGljZXMubGVuZ3RoICogaXRlbVNpemUgKTtcclxuXHJcblx0XHRcdGxldCBpbmRleCA9IDAsIGluZGV4MiA9IDA7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBpbmRpY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggYXR0cmlidXRlLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgKSB7XHJcblxyXG5cdFx0XHRcdFx0aW5kZXggPSBpbmRpY2VzWyBpIF0gKiBhdHRyaWJ1dGUuZGF0YS5zdHJpZGUgKyBhdHRyaWJ1dGUub2Zmc2V0O1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdGluZGV4ID0gaW5kaWNlc1sgaSBdICogaXRlbVNpemU7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGogPSAwOyBqIDwgaXRlbVNpemU7IGogKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0YXJyYXkyWyBpbmRleDIgKysgXSA9IGFycmF5WyBpbmRleCArKyBdO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gbmV3IEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXkyLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGlmICggdGhpcy5pbmRleCA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LnRvTm9uSW5kZXhlZCgpOiBCdWZmZXJHZW9tZXRyeSBpcyBhbHJlYWR5IG5vbi1pbmRleGVkLicgKTtcclxuXHRcdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGdlb21ldHJ5MiA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xyXG5cclxuXHRcdGNvbnN0IGluZGljZXMgPSB0aGlzLmluZGV4LmFycmF5O1xyXG5cdFx0Y29uc3QgYXR0cmlidXRlcyA9IHRoaXMuYXR0cmlidXRlcztcclxuXHJcblx0XHQvLyBhdHRyaWJ1dGVzXHJcblxyXG5cdFx0Zm9yICggY29uc3QgbmFtZSBpbiBhdHRyaWJ1dGVzICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYXR0cmlidXRlID0gYXR0cmlidXRlc1sgbmFtZSBdO1xyXG5cclxuXHRcdFx0Y29uc3QgbmV3QXR0cmlidXRlID0gY29udmVydEJ1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlLCBpbmRpY2VzICk7XHJcblxyXG5cdFx0XHRnZW9tZXRyeTIuc2V0QXR0cmlidXRlKCBuYW1lLCBuZXdBdHRyaWJ1dGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gbW9ycGggYXR0cmlidXRlc1xyXG5cclxuXHRcdGNvbnN0IG1vcnBoQXR0cmlidXRlcyA9IHRoaXMubW9ycGhBdHRyaWJ1dGVzO1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IG5hbWUgaW4gbW9ycGhBdHRyaWJ1dGVzICkge1xyXG5cclxuXHRcdFx0Y29uc3QgbW9ycGhBcnJheSA9IFtdO1xyXG5cdFx0XHRjb25zdCBtb3JwaEF0dHJpYnV0ZSA9IG1vcnBoQXR0cmlidXRlc1sgbmFtZSBdOyAvLyBtb3JwaEF0dHJpYnV0ZTogYXJyYXkgb2YgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZXNcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBtb3JwaEF0dHJpYnV0ZS5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgYXR0cmlidXRlID0gbW9ycGhBdHRyaWJ1dGVbIGkgXTtcclxuXHJcblx0XHRcdFx0Y29uc3QgbmV3QXR0cmlidXRlID0gY29udmVydEJ1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlLCBpbmRpY2VzICk7XHJcblxyXG5cdFx0XHRcdG1vcnBoQXJyYXkucHVzaCggbmV3QXR0cmlidXRlICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRnZW9tZXRyeTIubW9ycGhBdHRyaWJ1dGVzWyBuYW1lIF0gPSBtb3JwaEFycmF5O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRnZW9tZXRyeTIubW9ycGhUYXJnZXRzUmVsYXRpdmUgPSB0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlO1xyXG5cclxuXHRcdC8vIGdyb3Vwc1xyXG5cclxuXHRcdGNvbnN0IGdyb3VwcyA9IHRoaXMuZ3JvdXBzO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGdyb3Vwcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgZ3JvdXAgPSBncm91cHNbIGkgXTtcclxuXHRcdFx0Z2VvbWV0cnkyLmFkZEdyb3VwKCBncm91cC5zdGFydCwgZ3JvdXAuY291bnQsIGdyb3VwLm1hdGVyaWFsSW5kZXggKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGdlb21ldHJ5MjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXJpYWxpemVzIHRoZSBnZW9tZXRyeSBpbnRvIEpTT04uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtPYmplY3R9IEEgSlNPTiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzZXJpYWxpemVkIGdlb21ldHJ5LlxyXG5cdCAqL1xyXG5cdHRvSlNPTigpIHtcclxuXHJcblx0XHRjb25zdCBkYXRhID0ge1xyXG5cdFx0XHRtZXRhZGF0YToge1xyXG5cdFx0XHRcdHZlcnNpb246IDQuNixcclxuXHRcdFx0XHR0eXBlOiAnQnVmZmVyR2VvbWV0cnknLFxyXG5cdFx0XHRcdGdlbmVyYXRvcjogJ0J1ZmZlckdlb21ldHJ5LnRvSlNPTidcclxuXHRcdFx0fVxyXG5cdFx0fTtcclxuXHJcblx0XHQvLyBzdGFuZGFyZCBCdWZmZXJHZW9tZXRyeSBzZXJpYWxpemF0aW9uXHJcblxyXG5cdFx0ZGF0YS51dWlkID0gdGhpcy51dWlkO1xyXG5cdFx0ZGF0YS50eXBlID0gdGhpcy50eXBlO1xyXG5cdFx0aWYgKCB0aGlzLm5hbWUgIT09ICcnICkgZGF0YS5uYW1lID0gdGhpcy5uYW1lO1xyXG5cdFx0aWYgKCBPYmplY3Qua2V5cyggdGhpcy51c2VyRGF0YSApLmxlbmd0aCA+IDAgKSBkYXRhLnVzZXJEYXRhID0gdGhpcy51c2VyRGF0YTtcclxuXHJcblx0XHRpZiAoIHRoaXMucGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Y29uc3QgcGFyYW1ldGVycyA9IHRoaXMucGFyYW1ldGVycztcclxuXHJcblx0XHRcdGZvciAoIGNvbnN0IGtleSBpbiBwYXJhbWV0ZXJzICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIHBhcmFtZXRlcnNbIGtleSBdICE9PSB1bmRlZmluZWQgKSBkYXRhWyBrZXkgXSA9IHBhcmFtZXRlcnNbIGtleSBdO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIGRhdGE7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGZvciBzaW1wbGljaXR5IHRoZSBjb2RlIGFzc3VtZXMgYXR0cmlidXRlcyBhcmUgbm90IHNoYXJlZCBhY3Jvc3MgZ2VvbWV0cmllcywgc2VlICMxNTgxMVxyXG5cclxuXHRcdGRhdGEuZGF0YSA9IHsgYXR0cmlidXRlczoge30gfTtcclxuXHJcblx0XHRjb25zdCBpbmRleCA9IHRoaXMuaW5kZXg7XHJcblxyXG5cdFx0aWYgKCBpbmRleCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGRhdGEuZGF0YS5pbmRleCA9IHtcclxuXHRcdFx0XHR0eXBlOiBpbmRleC5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLFxyXG5cdFx0XHRcdGFycmF5OiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggaW5kZXguYXJyYXkgKVxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzO1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IGtleSBpbiBhdHRyaWJ1dGVzICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYXR0cmlidXRlID0gYXR0cmlidXRlc1sga2V5IF07XHJcblxyXG5cdFx0XHRkYXRhLmRhdGEuYXR0cmlidXRlc1sga2V5IF0gPSBhdHRyaWJ1dGUudG9KU09OKCBkYXRhLmRhdGEgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgbW9ycGhBdHRyaWJ1dGVzID0ge307XHJcblx0XHRsZXQgaGFzTW9ycGhBdHRyaWJ1dGVzID0gZmFsc2U7XHJcblxyXG5cdFx0Zm9yICggY29uc3Qga2V5IGluIHRoaXMubW9ycGhBdHRyaWJ1dGVzICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYXR0cmlidXRlQXJyYXkgPSB0aGlzLm1vcnBoQXR0cmlidXRlc1sga2V5IF07XHJcblxyXG5cdFx0XHRjb25zdCBhcnJheSA9IFtdO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IGF0dHJpYnV0ZUFycmF5Lmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVBcnJheVsgaSBdO1xyXG5cclxuXHRcdFx0XHRhcnJheS5wdXNoKCBhdHRyaWJ1dGUudG9KU09OKCBkYXRhLmRhdGEgKSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBhcnJheS5sZW5ndGggPiAwICkge1xyXG5cclxuXHRcdFx0XHRtb3JwaEF0dHJpYnV0ZXNbIGtleSBdID0gYXJyYXk7XHJcblxyXG5cdFx0XHRcdGhhc01vcnBoQXR0cmlidXRlcyA9IHRydWU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggaGFzTW9ycGhBdHRyaWJ1dGVzICkge1xyXG5cclxuXHRcdFx0ZGF0YS5kYXRhLm1vcnBoQXR0cmlidXRlcyA9IG1vcnBoQXR0cmlidXRlcztcclxuXHRcdFx0ZGF0YS5kYXRhLm1vcnBoVGFyZ2V0c1JlbGF0aXZlID0gdGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgZ3JvdXBzID0gdGhpcy5ncm91cHM7XHJcblxyXG5cdFx0aWYgKCBncm91cHMubGVuZ3RoID4gMCApIHtcclxuXHJcblx0XHRcdGRhdGEuZGF0YS5ncm91cHMgPSBKU09OLnBhcnNlKCBKU09OLnN0cmluZ2lmeSggZ3JvdXBzICkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgYm91bmRpbmdTcGhlcmUgPSB0aGlzLmJvdW5kaW5nU3BoZXJlO1xyXG5cclxuXHRcdGlmICggYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRkYXRhLmRhdGEuYm91bmRpbmdTcGhlcmUgPSB7XHJcblx0XHRcdFx0Y2VudGVyOiBib3VuZGluZ1NwaGVyZS5jZW50ZXIudG9BcnJheSgpLFxyXG5cdFx0XHRcdHJhZGl1czogYm91bmRpbmdTcGhlcmUucmFkaXVzXHJcblx0XHRcdH07XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBkYXRhO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBuZXcgZ2VvbWV0cnkgd2l0aCBjb3BpZWQgdmFsdWVzIGZyb20gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0J1ZmZlckdlb21ldHJ5fSBBIGNsb25lIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y2xvbmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvcGllcyB0aGUgdmFsdWVzIG9mIHRoZSBnaXZlbiBnZW9tZXRyeSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCdWZmZXJHZW9tZXRyeX0gc291cmNlIC0gVGhlIGdlb21ldHJ5IHRvIGNvcHkuXHJcblx0ICogQHJldHVybiB7QnVmZmVyR2VvbWV0cnl9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdC8vIHJlc2V0XHJcblxyXG5cdFx0dGhpcy5pbmRleCA9IG51bGw7XHJcblx0XHR0aGlzLmF0dHJpYnV0ZXMgPSB7fTtcclxuXHRcdHRoaXMubW9ycGhBdHRyaWJ1dGVzID0ge307XHJcblx0XHR0aGlzLmdyb3VwcyA9IFtdO1xyXG5cdFx0dGhpcy5ib3VuZGluZ0JveCA9IG51bGw7XHJcblx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gbnVsbDtcclxuXHJcblx0XHQvLyB1c2VkIGZvciBzdG9yaW5nIGNsb25lZCwgc2hhcmVkIGRhdGFcclxuXHJcblx0XHRjb25zdCBkYXRhID0ge307XHJcblxyXG5cdFx0Ly8gbmFtZVxyXG5cclxuXHRcdHRoaXMubmFtZSA9IHNvdXJjZS5uYW1lO1xyXG5cclxuXHRcdC8vIGluZGV4XHJcblxyXG5cdFx0Y29uc3QgaW5kZXggPSBzb3VyY2UuaW5kZXg7XHJcblxyXG5cdFx0aWYgKCBpbmRleCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuc2V0SW5kZXgoIGluZGV4LmNsb25lKCkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gYXR0cmlidXRlc1xyXG5cclxuXHRcdGNvbnN0IGF0dHJpYnV0ZXMgPSBzb3VyY2UuYXR0cmlidXRlcztcclxuXHJcblx0XHRmb3IgKCBjb25zdCBuYW1lIGluIGF0dHJpYnV0ZXMgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzWyBuYW1lIF07XHJcblx0XHRcdHRoaXMuc2V0QXR0cmlidXRlKCBuYW1lLCBhdHRyaWJ1dGUuY2xvbmUoIGRhdGEgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBtb3JwaCBhdHRyaWJ1dGVzXHJcblxyXG5cdFx0Y29uc3QgbW9ycGhBdHRyaWJ1dGVzID0gc291cmNlLm1vcnBoQXR0cmlidXRlcztcclxuXHJcblx0XHRmb3IgKCBjb25zdCBuYW1lIGluIG1vcnBoQXR0cmlidXRlcyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGFycmF5ID0gW107XHJcblx0XHRcdGNvbnN0IG1vcnBoQXR0cmlidXRlID0gbW9ycGhBdHRyaWJ1dGVzWyBuYW1lIF07IC8vIG1vcnBoQXR0cmlidXRlOiBhcnJheSBvZiBGbG9hdDMyQnVmZmVyQXR0cmlidXRlc1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gbW9ycGhBdHRyaWJ1dGUubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0YXJyYXkucHVzaCggbW9ycGhBdHRyaWJ1dGVbIGkgXS5jbG9uZSggZGF0YSApICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0aGlzLm1vcnBoQXR0cmlidXRlc1sgbmFtZSBdID0gYXJyYXk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmUgPSBzb3VyY2UubW9ycGhUYXJnZXRzUmVsYXRpdmU7XHJcblxyXG5cdFx0Ly8gZ3JvdXBzXHJcblxyXG5cdFx0Y29uc3QgZ3JvdXBzID0gc291cmNlLmdyb3VwcztcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBncm91cHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGdyb3VwID0gZ3JvdXBzWyBpIF07XHJcblx0XHRcdHRoaXMuYWRkR3JvdXAoIGdyb3VwLnN0YXJ0LCBncm91cC5jb3VudCwgZ3JvdXAubWF0ZXJpYWxJbmRleCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBib3VuZGluZyBib3hcclxuXHJcblx0XHRjb25zdCBib3VuZGluZ0JveCA9IHNvdXJjZS5ib3VuZGluZ0JveDtcclxuXHJcblx0XHRpZiAoIGJvdW5kaW5nQm94ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveCA9IGJvdW5kaW5nQm94LmNsb25lKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGJvdW5kaW5nIHNwaGVyZVxyXG5cclxuXHRcdGNvbnN0IGJvdW5kaW5nU3BoZXJlID0gc291cmNlLmJvdW5kaW5nU3BoZXJlO1xyXG5cclxuXHRcdGlmICggYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gYm91bmRpbmdTcGhlcmUuY2xvbmUoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gZHJhdyByYW5nZVxyXG5cclxuXHRcdHRoaXMuZHJhd1JhbmdlLnN0YXJ0ID0gc291cmNlLmRyYXdSYW5nZS5zdGFydDtcclxuXHRcdHRoaXMuZHJhd1JhbmdlLmNvdW50ID0gc291cmNlLmRyYXdSYW5nZS5jb3VudDtcclxuXHJcblx0XHQvLyB1c2VyIGRhdGFcclxuXHJcblx0XHR0aGlzLnVzZXJEYXRhID0gc291cmNlLnVzZXJEYXRhO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZyZWVzIHRoZSBHUFUtcmVsYXRlZCByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHRoaXMgaW5zdGFuY2UuIENhbGwgdGhpc1xyXG5cdCAqIG1ldGhvZCB3aGVuZXZlciB0aGlzIGluc3RhbmNlIGlzIG5vIGxvbmdlciB1c2VkIGluIHlvdXIgYXBwLlxyXG5cdCAqXHJcblx0ICogQGZpcmVzIEJ1ZmZlckdlb21ldHJ5I2Rpc3Bvc2VcclxuXHQgKi9cclxuXHRkaXNwb3NlKCkge1xyXG5cclxuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnZGlzcG9zZScgfSApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBCdWZmZXJHZW9tZXRyeSB9O1xyXG4iLCJpbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uL21hdGgvVmVjdG9yMi5qcyc7XHJcbmltcG9ydCB7IFNwaGVyZSB9IGZyb20gJy4uL21hdGgvU3BoZXJlLmpzJztcclxuaW1wb3J0IHsgUmF5IH0gZnJvbSAnLi4vbWF0aC9SYXkuanMnO1xyXG5pbXBvcnQgeyBNYXRyaXg0IH0gZnJvbSAnLi4vbWF0aC9NYXRyaXg0LmpzJztcclxuaW1wb3J0IHsgT2JqZWN0M0QgfSBmcm9tICcuLi9jb3JlL09iamVjdDNELmpzJztcclxuaW1wb3J0IHsgVHJpYW5nbGUgfSBmcm9tICcuLi9tYXRoL1RyaWFuZ2xlLmpzJztcclxuaW1wb3J0IHsgQmFja1NpZGUsIEZyb250U2lkZSB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IE1lc2hCYXNpY01hdGVyaWFsIH0gZnJvbSAnLi4vbWF0ZXJpYWxzL01lc2hCYXNpY01hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcclxuXHJcbmNvbnN0IF9pbnZlcnNlTWF0cml4ID0gLypAX19QVVJFX18qLyBuZXcgTWF0cml4NCgpO1xyXG5jb25zdCBfcmF5ID0gLypAX19QVVJFX18qLyBuZXcgUmF5KCk7XHJcbmNvbnN0IF9zcGhlcmUgPSAvKkBfX1BVUkVfXyovIG5ldyBTcGhlcmUoKTtcclxuY29uc3QgX3NwaGVyZUhpdEF0ID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5cclxuY29uc3QgX3ZBID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfdkIgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF92QyA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuXHJcbmNvbnN0IF90ZW1wQSA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX21vcnBoQSA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuXHJcbmNvbnN0IF9pbnRlcnNlY3Rpb25Qb2ludCA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX2ludGVyc2VjdGlvblBvaW50V29ybGQgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcblxyXG4vKipcclxuICogQ2xhc3MgcmVwcmVzZW50aW5nIHRyaWFuZ3VsYXIgcG9seWdvbiBtZXNoIGJhc2VkIG9iamVjdHMuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGdlb21ldHJ5ID0gbmV3IFRIUkVFLkJveEdlb21ldHJ5KCAxLCAxLCAxICk7XHJcbiAqIGNvbnN0IG1hdGVyaWFsID0gbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiAweGZmZmYwMCB9ICk7XHJcbiAqIGNvbnN0IG1lc2ggPSBuZXcgVEhSRUUuTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcbiAqIHNjZW5lLmFkZCggbWVzaCApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIE9iamVjdDNEXHJcbiAqL1xyXG5jbGFzcyBNZXNoIGV4dGVuZHMgT2JqZWN0M0Qge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG1lc2guXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0J1ZmZlckdlb21ldHJ5fSBbZ2VvbWV0cnldIC0gVGhlIG1lc2ggZ2VvbWV0cnkuXHJcblx0ICogQHBhcmFtIHtNYXRlcmlhbHxBcnJheTxNYXRlcmlhbD59IFttYXRlcmlhbF0gLSBUaGUgbWVzaCBtYXRlcmlhbC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKSwgbWF0ZXJpYWwgPSBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoKSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc01lc2ggPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdNZXNoJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBtZXNoIGdlb21ldHJ5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtCdWZmZXJHZW9tZXRyeX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nZW9tZXRyeSA9IGdlb21ldHJ5O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG1lc2ggbWF0ZXJpYWwuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge01hdGVyaWFsfEFycmF5PE1hdGVyaWFsPn1cclxuXHRcdCAqIEBkZWZhdWx0IE1lc2hCYXNpY01hdGVyaWFsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWF0ZXJpYWwgPSBtYXRlcmlhbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgZGljdGlvbmFyeSByZXByZXNlbnRpbmcgdGhlIG1vcnBoIHRhcmdldHMgaW4gdGhlIGdlb21ldHJ5LiBUaGUga2V5IGlzIHRoZVxyXG5cdFx0ICogbW9ycGggdGFyZ2V0cyBuYW1lLCB0aGUgdmFsdWUgaXRzIGF0dHJpYnV0ZSBpbmRleC4gVGhpcyBtZW1iZXIgaXMgYHVuZGVmaW5lZGBcclxuXHRcdCAqIGJ5IGRlZmF1bHQgYW5kIG9ubHkgc2V0IHdoZW4gbW9ycGggdGFyZ2V0cyBhcmUgZGV0ZWN0ZWQgaW4gdGhlIGdlb21ldHJ5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3Q8U3RyaW5nLG51bWJlcj58dW5kZWZpbmVkfVxyXG5cdFx0ICogQGRlZmF1bHQgdW5kZWZpbmVkXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5ID0gdW5kZWZpbmVkO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQW4gYXJyYXkgb2Ygd2VpZ2h0cyB0eXBpY2FsbHkgaW4gdGhlIHJhbmdlIGBbMCwxXWAgdGhhdCBzcGVjaWZ5IGhvdyBtdWNoIG9mIHRoZSBtb3JwaFxyXG5cdFx0ICogaXMgYXBwbGllZC4gVGhpcyBtZW1iZXIgaXMgYHVuZGVmaW5lZGAgYnkgZGVmYXVsdCBhbmQgb25seSBzZXQgd2hlbiBtb3JwaCB0YXJnZXRzIGFyZVxyXG5cdFx0ICogZGV0ZWN0ZWQgaW4gdGhlIGdlb21ldHJ5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxudW1iZXI+fHVuZGVmaW5lZH1cclxuXHRcdCAqIEBkZWZhdWx0IHVuZGVmaW5lZFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyA9IHVuZGVmaW5lZDtcclxuXHJcblx0XHR0aGlzLnVwZGF0ZU1vcnBoVGFyZ2V0cygpO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSwgcmVjdXJzaXZlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSwgcmVjdXJzaXZlICk7XHJcblxyXG5cdFx0aWYgKCBzb3VyY2UubW9ycGhUYXJnZXRJbmZsdWVuY2VzICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHR0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyA9IHNvdXJjZS5tb3JwaFRhcmdldEluZmx1ZW5jZXMuc2xpY2UoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBzb3VyY2UubW9ycGhUYXJnZXREaWN0aW9uYXJ5ICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHR0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeSA9IE9iamVjdC5hc3NpZ24oIHt9LCBzb3VyY2UubW9ycGhUYXJnZXREaWN0aW9uYXJ5ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMubWF0ZXJpYWwgPSBBcnJheS5pc0FycmF5KCBzb3VyY2UubWF0ZXJpYWwgKSA/IHNvdXJjZS5tYXRlcmlhbC5zbGljZSgpIDogc291cmNlLm1hdGVyaWFsO1xyXG5cdFx0dGhpcy5nZW9tZXRyeSA9IHNvdXJjZS5nZW9tZXRyeTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB2YWx1ZXMgb2Yge0BsaW5rIE1lc2gjbW9ycGhUYXJnZXREaWN0aW9uYXJ5fSBhbmQge0BsaW5rIE1lc2gjbW9ycGhUYXJnZXRJbmZsdWVuY2VzfVxyXG5cdCAqIHRvIG1ha2Ugc3VyZSBleGlzdGluZyBtb3JwaCB0YXJnZXRzIGNhbiBpbmZsdWVuY2UgdGhpcyAzRCBvYmplY3QuXHJcblx0ICovXHJcblx0dXBkYXRlTW9ycGhUYXJnZXRzKCkge1xyXG5cclxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcclxuXHJcblx0XHRjb25zdCBtb3JwaEF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXM7XHJcblx0XHRjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoIG1vcnBoQXR0cmlidXRlcyApO1xyXG5cclxuXHRcdGlmICgga2V5cy5sZW5ndGggPiAwICkge1xyXG5cclxuXHRcdFx0Y29uc3QgbW9ycGhBdHRyaWJ1dGUgPSBtb3JwaEF0dHJpYnV0ZXNbIGtleXNbIDAgXSBdO1xyXG5cclxuXHRcdFx0aWYgKCBtb3JwaEF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyA9IFtdO1xyXG5cdFx0XHRcdHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5ID0ge307XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBtID0gMCwgbWwgPSBtb3JwaEF0dHJpYnV0ZS5sZW5ndGg7IG0gPCBtbDsgbSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBuYW1lID0gbW9ycGhBdHRyaWJ1dGVbIG0gXS5uYW1lIHx8IFN0cmluZyggbSApO1xyXG5cclxuXHRcdFx0XHRcdHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnB1c2goIDAgKTtcclxuXHRcdFx0XHRcdHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5WyBuYW1lIF0gPSBtO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGxvY2FsLXNwYWNlIHBvc2l0aW9uIG9mIHRoZSB2ZXJ0ZXggYXQgdGhlIGdpdmVuIGluZGV4LCB0YWtpbmcgaW50b1xyXG5cdCAqIGFjY291bnQgdGhlIGN1cnJlbnQgYW5pbWF0aW9uIHN0YXRlIG9mIGJvdGggbW9ycGggdGFyZ2V0cyBhbmQgc2tpbm5pbmcuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgdmVydGV4IGluZGV4LlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdGFyZ2V0IC0gVGhlIHRhcmdldCBvYmplY3QgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBtZXRob2QncyByZXN1bHQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gVGhlIHZlcnRleCBwb3NpdGlvbiBpbiBsb2NhbCBzcGFjZS5cclxuXHQgKi9cclxuXHRnZXRWZXJ0ZXhQb3NpdGlvbiggaW5kZXgsIHRhcmdldCApIHtcclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XHJcblx0XHRjb25zdCBwb3NpdGlvbiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XHJcblx0XHRjb25zdCBtb3JwaFBvc2l0aW9uID0gZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uO1xyXG5cdFx0Y29uc3QgbW9ycGhUYXJnZXRzUmVsYXRpdmUgPSBnZW9tZXRyeS5tb3JwaFRhcmdldHNSZWxhdGl2ZTtcclxuXHJcblx0XHR0YXJnZXQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIGluZGV4ICk7XHJcblxyXG5cdFx0Y29uc3QgbW9ycGhJbmZsdWVuY2VzID0gdGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXM7XHJcblxyXG5cdFx0aWYgKCBtb3JwaFBvc2l0aW9uICYmIG1vcnBoSW5mbHVlbmNlcyApIHtcclxuXHJcblx0XHRcdF9tb3JwaEEuc2V0KCAwLCAwLCAwICk7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gbW9ycGhQb3NpdGlvbi5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgaW5mbHVlbmNlID0gbW9ycGhJbmZsdWVuY2VzWyBpIF07XHJcblx0XHRcdFx0Y29uc3QgbW9ycGhBdHRyaWJ1dGUgPSBtb3JwaFBvc2l0aW9uWyBpIF07XHJcblxyXG5cdFx0XHRcdGlmICggaW5mbHVlbmNlID09PSAwICkgY29udGludWU7XHJcblxyXG5cdFx0XHRcdF90ZW1wQS5mcm9tQnVmZmVyQXR0cmlidXRlKCBtb3JwaEF0dHJpYnV0ZSwgaW5kZXggKTtcclxuXHJcblx0XHRcdFx0aWYgKCBtb3JwaFRhcmdldHNSZWxhdGl2ZSApIHtcclxuXHJcblx0XHRcdFx0XHRfbW9ycGhBLmFkZFNjYWxlZFZlY3RvciggX3RlbXBBLCBpbmZsdWVuY2UgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRfbW9ycGhBLmFkZFNjYWxlZFZlY3RvciggX3RlbXBBLnN1YiggdGFyZ2V0ICksIGluZmx1ZW5jZSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0YXJnZXQuYWRkKCBfbW9ycGhBICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0YXJnZXQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgaW50ZXJzZWN0aW9uIHBvaW50cyBiZXR3ZWVuIGEgY2FzdGVkIHJheSBhbmQgdGhpcyBsaW5lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSYXljYXN0ZXJ9IHJheWNhc3RlciAtIFRoZSByYXljYXN0ZXIuXHJcblx0ICogQHBhcmFtIHtBcnJheTxPYmplY3Q+fSBpbnRlcnNlY3RzIC0gVGhlIHRhcmdldCBhcnJheSB0aGF0IGhvbGRzIHRoZSBpbnRlcnNlY3Rpb24gcG9pbnRzLlxyXG5cdCAqL1xyXG5cdHJheWNhc3QoIHJheWNhc3RlciwgaW50ZXJzZWN0cyApIHtcclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XHJcblx0XHRjb25zdCBtYXRlcmlhbCA9IHRoaXMubWF0ZXJpYWw7XHJcblx0XHRjb25zdCBtYXRyaXhXb3JsZCA9IHRoaXMubWF0cml4V29ybGQ7XHJcblxyXG5cdFx0aWYgKCBtYXRlcmlhbCA9PT0gdW5kZWZpbmVkICkgcmV0dXJuO1xyXG5cclxuXHRcdC8vIHRlc3Qgd2l0aCBib3VuZGluZyBzcGhlcmUgaW4gd29ybGQgc3BhY2VcclxuXHJcblx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID09PSBudWxsICkgZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XHJcblxyXG5cdFx0X3NwaGVyZS5jb3B5KCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSApO1xyXG5cdFx0X3NwaGVyZS5hcHBseU1hdHJpeDQoIG1hdHJpeFdvcmxkICk7XHJcblxyXG5cdFx0Ly8gY2hlY2sgZGlzdGFuY2UgZnJvbSByYXkgb3JpZ2luIHRvIGJvdW5kaW5nIHNwaGVyZVxyXG5cclxuXHRcdF9yYXkuY29weSggcmF5Y2FzdGVyLnJheSApLnJlY2FzdCggcmF5Y2FzdGVyLm5lYXIgKTtcclxuXHJcblx0XHRpZiAoIF9zcGhlcmUuY29udGFpbnNQb2ludCggX3JheS5vcmlnaW4gKSA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRpZiAoIF9yYXkuaW50ZXJzZWN0U3BoZXJlKCBfc3BoZXJlLCBfc3BoZXJlSGl0QXQgKSA9PT0gbnVsbCApIHJldHVybjtcclxuXHJcblx0XHRcdGlmICggX3JheS5vcmlnaW4uZGlzdGFuY2VUb1NxdWFyZWQoIF9zcGhlcmVIaXRBdCApID4gKCByYXljYXN0ZXIuZmFyIC0gcmF5Y2FzdGVyLm5lYXIgKSAqKiAyICkgcmV0dXJuO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBjb252ZXJ0IHJheSB0byBsb2NhbCBzcGFjZSBvZiBtZXNoXHJcblxyXG5cdFx0X2ludmVyc2VNYXRyaXguY29weSggbWF0cml4V29ybGQgKS5pbnZlcnQoKTtcclxuXHRcdF9yYXkuY29weSggcmF5Y2FzdGVyLnJheSApLmFwcGx5TWF0cml4NCggX2ludmVyc2VNYXRyaXggKTtcclxuXHJcblx0XHQvLyB0ZXN0IHdpdGggYm91bmRpbmcgYm94IGluIGxvY2FsIHNwYWNlXHJcblxyXG5cdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ0JveCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGlmICggX3JheS5pbnRlcnNlY3RzQm94KCBnZW9tZXRyeS5ib3VuZGluZ0JveCApID09PSBmYWxzZSApIHJldHVybjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gdGVzdCBmb3IgaW50ZXJzZWN0aW9ucyB3aXRoIGdlb21ldHJ5XHJcblxyXG5cdFx0dGhpcy5fY29tcHV0ZUludGVyc2VjdGlvbnMoIHJheWNhc3RlciwgaW50ZXJzZWN0cywgX3JheSApO1xyXG5cclxuXHR9XHJcblxyXG5cdF9jb21wdXRlSW50ZXJzZWN0aW9ucyggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzLCByYXlMb2NhbFNwYWNlICkge1xyXG5cclxuXHRcdGxldCBpbnRlcnNlY3Rpb247XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xyXG5cdFx0Y29uc3QgbWF0ZXJpYWwgPSB0aGlzLm1hdGVyaWFsO1xyXG5cclxuXHRcdGNvbnN0IGluZGV4ID0gZ2VvbWV0cnkuaW5kZXg7XHJcblx0XHRjb25zdCBwb3NpdGlvbiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XHJcblx0XHRjb25zdCB1diA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMudXY7XHJcblx0XHRjb25zdCB1djEgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnV2MTtcclxuXHRcdGNvbnN0IG5vcm1hbCA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMubm9ybWFsO1xyXG5cdFx0Y29uc3QgZ3JvdXBzID0gZ2VvbWV0cnkuZ3JvdXBzO1xyXG5cdFx0Y29uc3QgZHJhd1JhbmdlID0gZ2VvbWV0cnkuZHJhd1JhbmdlO1xyXG5cclxuXHRcdGlmICggaW5kZXggIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHQvLyBpbmRleGVkIGJ1ZmZlciBnZW9tZXRyeVxyXG5cclxuXHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBtYXRlcmlhbCApICkge1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gZ3JvdXBzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGdyb3VwID0gZ3JvdXBzWyBpIF07XHJcblx0XHRcdFx0XHRjb25zdCBncm91cE1hdGVyaWFsID0gbWF0ZXJpYWxbIGdyb3VwLm1hdGVyaWFsSW5kZXggXTtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBzdGFydCA9IE1hdGgubWF4KCBncm91cC5zdGFydCwgZHJhd1JhbmdlLnN0YXJ0ICk7XHJcblx0XHRcdFx0XHRjb25zdCBlbmQgPSBNYXRoLm1pbiggaW5kZXguY291bnQsIE1hdGgubWluKCAoIGdyb3VwLnN0YXJ0ICsgZ3JvdXAuY291bnQgKSwgKCBkcmF3UmFuZ2Uuc3RhcnQgKyBkcmF3UmFuZ2UuY291bnQgKSApICk7XHJcblxyXG5cdFx0XHRcdFx0Zm9yICggbGV0IGogPSBzdGFydCwgamwgPSBlbmQ7IGogPCBqbDsgaiArPSAzICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgYSA9IGluZGV4LmdldFgoIGogKTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgYiA9IGluZGV4LmdldFgoIGogKyAxICk7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGMgPSBpbmRleC5nZXRYKCBqICsgMiApO1xyXG5cclxuXHRcdFx0XHRcdFx0aW50ZXJzZWN0aW9uID0gY2hlY2tHZW9tZXRyeUludGVyc2VjdGlvbiggdGhpcywgZ3JvdXBNYXRlcmlhbCwgcmF5Y2FzdGVyLCByYXlMb2NhbFNwYWNlLCB1diwgdXYxLCBub3JtYWwsIGEsIGIsIGMgKTtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggaW50ZXJzZWN0aW9uICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpbnRlcnNlY3Rpb24uZmFjZUluZGV4ID0gTWF0aC5mbG9vciggaiAvIDMgKTsgLy8gdHJpYW5nbGUgbnVtYmVyIGluIGluZGV4ZWQgYnVmZmVyIHNlbWFudGljc1xyXG5cdFx0XHRcdFx0XHRcdGludGVyc2VjdGlvbi5mYWNlLm1hdGVyaWFsSW5kZXggPSBncm91cC5tYXRlcmlhbEluZGV4O1xyXG5cdFx0XHRcdFx0XHRcdGludGVyc2VjdHMucHVzaCggaW50ZXJzZWN0aW9uICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRjb25zdCBzdGFydCA9IE1hdGgubWF4KCAwLCBkcmF3UmFuZ2Uuc3RhcnQgKTtcclxuXHRcdFx0XHRjb25zdCBlbmQgPSBNYXRoLm1pbiggaW5kZXguY291bnQsICggZHJhd1JhbmdlLnN0YXJ0ICsgZHJhd1JhbmdlLmNvdW50ICkgKTtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGkgPSBzdGFydCwgaWwgPSBlbmQ7IGkgPCBpbDsgaSArPSAzICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGEgPSBpbmRleC5nZXRYKCBpICk7XHJcblx0XHRcdFx0XHRjb25zdCBiID0gaW5kZXguZ2V0WCggaSArIDEgKTtcclxuXHRcdFx0XHRcdGNvbnN0IGMgPSBpbmRleC5nZXRYKCBpICsgMiApO1xyXG5cclxuXHRcdFx0XHRcdGludGVyc2VjdGlvbiA9IGNoZWNrR2VvbWV0cnlJbnRlcnNlY3Rpb24oIHRoaXMsIG1hdGVyaWFsLCByYXljYXN0ZXIsIHJheUxvY2FsU3BhY2UsIHV2LCB1djEsIG5vcm1hbCwgYSwgYiwgYyApO1xyXG5cclxuXHRcdFx0XHRcdGlmICggaW50ZXJzZWN0aW9uICkge1xyXG5cclxuXHRcdFx0XHRcdFx0aW50ZXJzZWN0aW9uLmZhY2VJbmRleCA9IE1hdGguZmxvb3IoIGkgLyAzICk7IC8vIHRyaWFuZ2xlIG51bWJlciBpbiBpbmRleGVkIGJ1ZmZlciBzZW1hbnRpY3NcclxuXHRcdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCBpbnRlcnNlY3Rpb24gKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2UgaWYgKCBwb3NpdGlvbiAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Ly8gbm9uLWluZGV4ZWQgYnVmZmVyIGdlb21ldHJ5XHJcblxyXG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIG1hdGVyaWFsICkgKSB7XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBncm91cHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgZ3JvdXAgPSBncm91cHNbIGkgXTtcclxuXHRcdFx0XHRcdGNvbnN0IGdyb3VwTWF0ZXJpYWwgPSBtYXRlcmlhbFsgZ3JvdXAubWF0ZXJpYWxJbmRleCBdO1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHN0YXJ0ID0gTWF0aC5tYXgoIGdyb3VwLnN0YXJ0LCBkcmF3UmFuZ2Uuc3RhcnQgKTtcclxuXHRcdFx0XHRcdGNvbnN0IGVuZCA9IE1hdGgubWluKCBwb3NpdGlvbi5jb3VudCwgTWF0aC5taW4oICggZ3JvdXAuc3RhcnQgKyBncm91cC5jb3VudCApLCAoIGRyYXdSYW5nZS5zdGFydCArIGRyYXdSYW5nZS5jb3VudCApICkgKTtcclxuXHJcblx0XHRcdFx0XHRmb3IgKCBsZXQgaiA9IHN0YXJ0LCBqbCA9IGVuZDsgaiA8IGpsOyBqICs9IDMgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCBhID0gajtcclxuXHRcdFx0XHRcdFx0Y29uc3QgYiA9IGogKyAxO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBjID0gaiArIDI7XHJcblxyXG5cdFx0XHRcdFx0XHRpbnRlcnNlY3Rpb24gPSBjaGVja0dlb21ldHJ5SW50ZXJzZWN0aW9uKCB0aGlzLCBncm91cE1hdGVyaWFsLCByYXljYXN0ZXIsIHJheUxvY2FsU3BhY2UsIHV2LCB1djEsIG5vcm1hbCwgYSwgYiwgYyApO1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCBpbnRlcnNlY3Rpb24gKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGludGVyc2VjdGlvbi5mYWNlSW5kZXggPSBNYXRoLmZsb29yKCBqIC8gMyApOyAvLyB0cmlhbmdsZSBudW1iZXIgaW4gbm9uLWluZGV4ZWQgYnVmZmVyIHNlbWFudGljc1xyXG5cdFx0XHRcdFx0XHRcdGludGVyc2VjdGlvbi5mYWNlLm1hdGVyaWFsSW5kZXggPSBncm91cC5tYXRlcmlhbEluZGV4O1xyXG5cdFx0XHRcdFx0XHRcdGludGVyc2VjdHMucHVzaCggaW50ZXJzZWN0aW9uICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRjb25zdCBzdGFydCA9IE1hdGgubWF4KCAwLCBkcmF3UmFuZ2Uuc3RhcnQgKTtcclxuXHRcdFx0XHRjb25zdCBlbmQgPSBNYXRoLm1pbiggcG9zaXRpb24uY291bnQsICggZHJhd1JhbmdlLnN0YXJ0ICsgZHJhd1JhbmdlLmNvdW50ICkgKTtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGkgPSBzdGFydCwgaWwgPSBlbmQ7IGkgPCBpbDsgaSArPSAzICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGEgPSBpO1xyXG5cdFx0XHRcdFx0Y29uc3QgYiA9IGkgKyAxO1xyXG5cdFx0XHRcdFx0Y29uc3QgYyA9IGkgKyAyO1xyXG5cclxuXHRcdFx0XHRcdGludGVyc2VjdGlvbiA9IGNoZWNrR2VvbWV0cnlJbnRlcnNlY3Rpb24oIHRoaXMsIG1hdGVyaWFsLCByYXljYXN0ZXIsIHJheUxvY2FsU3BhY2UsIHV2LCB1djEsIG5vcm1hbCwgYSwgYiwgYyApO1xyXG5cclxuXHRcdFx0XHRcdGlmICggaW50ZXJzZWN0aW9uICkge1xyXG5cclxuXHRcdFx0XHRcdFx0aW50ZXJzZWN0aW9uLmZhY2VJbmRleCA9IE1hdGguZmxvb3IoIGkgLyAzICk7IC8vIHRyaWFuZ2xlIG51bWJlciBpbiBub24taW5kZXhlZCBidWZmZXIgc2VtYW50aWNzXHJcblx0XHRcdFx0XHRcdGludGVyc2VjdHMucHVzaCggaW50ZXJzZWN0aW9uICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBjaGVja0ludGVyc2VjdGlvbiggb2JqZWN0LCBtYXRlcmlhbCwgcmF5Y2FzdGVyLCByYXksIHBBLCBwQiwgcEMsIHBvaW50ICkge1xyXG5cclxuXHRsZXQgaW50ZXJzZWN0O1xyXG5cclxuXHRpZiAoIG1hdGVyaWFsLnNpZGUgPT09IEJhY2tTaWRlICkge1xyXG5cclxuXHRcdGludGVyc2VjdCA9IHJheS5pbnRlcnNlY3RUcmlhbmdsZSggcEMsIHBCLCBwQSwgdHJ1ZSwgcG9pbnQgKTtcclxuXHJcblx0fSBlbHNlIHtcclxuXHJcblx0XHRpbnRlcnNlY3QgPSByYXkuaW50ZXJzZWN0VHJpYW5nbGUoIHBBLCBwQiwgcEMsICggbWF0ZXJpYWwuc2lkZSA9PT0gRnJvbnRTaWRlICksIHBvaW50ICk7XHJcblxyXG5cdH1cclxuXHJcblx0aWYgKCBpbnRlcnNlY3QgPT09IG51bGwgKSByZXR1cm4gbnVsbDtcclxuXHJcblx0X2ludGVyc2VjdGlvblBvaW50V29ybGQuY29weSggcG9pbnQgKTtcclxuXHRfaW50ZXJzZWN0aW9uUG9pbnRXb3JsZC5hcHBseU1hdHJpeDQoIG9iamVjdC5tYXRyaXhXb3JsZCApO1xyXG5cclxuXHRjb25zdCBkaXN0YW5jZSA9IHJheWNhc3Rlci5yYXkub3JpZ2luLmRpc3RhbmNlVG8oIF9pbnRlcnNlY3Rpb25Qb2ludFdvcmxkICk7XHJcblxyXG5cdGlmICggZGlzdGFuY2UgPCByYXljYXN0ZXIubmVhciB8fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSByZXR1cm4gbnVsbDtcclxuXHJcblx0cmV0dXJuIHtcclxuXHRcdGRpc3RhbmNlOiBkaXN0YW5jZSxcclxuXHRcdHBvaW50OiBfaW50ZXJzZWN0aW9uUG9pbnRXb3JsZC5jbG9uZSgpLFxyXG5cdFx0b2JqZWN0OiBvYmplY3RcclxuXHR9O1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gY2hlY2tHZW9tZXRyeUludGVyc2VjdGlvbiggb2JqZWN0LCBtYXRlcmlhbCwgcmF5Y2FzdGVyLCByYXksIHV2LCB1djEsIG5vcm1hbCwgYSwgYiwgYyApIHtcclxuXHJcblx0b2JqZWN0LmdldFZlcnRleFBvc2l0aW9uKCBhLCBfdkEgKTtcclxuXHRvYmplY3QuZ2V0VmVydGV4UG9zaXRpb24oIGIsIF92QiApO1xyXG5cdG9iamVjdC5nZXRWZXJ0ZXhQb3NpdGlvbiggYywgX3ZDICk7XHJcblxyXG5cdGNvbnN0IGludGVyc2VjdGlvbiA9IGNoZWNrSW50ZXJzZWN0aW9uKCBvYmplY3QsIG1hdGVyaWFsLCByYXljYXN0ZXIsIHJheSwgX3ZBLCBfdkIsIF92QywgX2ludGVyc2VjdGlvblBvaW50ICk7XHJcblxyXG5cdGlmICggaW50ZXJzZWN0aW9uICkge1xyXG5cclxuXHRcdGNvbnN0IGJhcnljb29yZCA9IG5ldyBWZWN0b3IzKCk7XHJcblx0XHRUcmlhbmdsZS5nZXRCYXJ5Y29vcmQoIF9pbnRlcnNlY3Rpb25Qb2ludCwgX3ZBLCBfdkIsIF92QywgYmFyeWNvb3JkICk7XHJcblxyXG5cdFx0aWYgKCB1diApIHtcclxuXHJcblx0XHRcdGludGVyc2VjdGlvbi51diA9IFRyaWFuZ2xlLmdldEludGVycG9sYXRlZEF0dHJpYnV0ZSggdXYsIGEsIGIsIGMsIGJhcnljb29yZCwgbmV3IFZlY3RvcjIoKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHV2MSApIHtcclxuXHJcblx0XHRcdGludGVyc2VjdGlvbi51djEgPSBUcmlhbmdsZS5nZXRJbnRlcnBvbGF0ZWRBdHRyaWJ1dGUoIHV2MSwgYSwgYiwgYywgYmFyeWNvb3JkLCBuZXcgVmVjdG9yMigpICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggbm9ybWFsICkge1xyXG5cclxuXHRcdFx0aW50ZXJzZWN0aW9uLm5vcm1hbCA9IFRyaWFuZ2xlLmdldEludGVycG9sYXRlZEF0dHJpYnV0ZSggbm9ybWFsLCBhLCBiLCBjLCBiYXJ5Y29vcmQsIG5ldyBWZWN0b3IzKCkgKTtcclxuXHJcblx0XHRcdGlmICggaW50ZXJzZWN0aW9uLm5vcm1hbC5kb3QoIHJheS5kaXJlY3Rpb24gKSA+IDAgKSB7XHJcblxyXG5cdFx0XHRcdGludGVyc2VjdGlvbi5ub3JtYWwubXVsdGlwbHlTY2FsYXIoIC0gMSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBmYWNlID0ge1xyXG5cdFx0XHRhOiBhLFxyXG5cdFx0XHRiOiBiLFxyXG5cdFx0XHRjOiBjLFxyXG5cdFx0XHRub3JtYWw6IG5ldyBWZWN0b3IzKCksXHJcblx0XHRcdG1hdGVyaWFsSW5kZXg6IDBcclxuXHRcdH07XHJcblxyXG5cdFx0VHJpYW5nbGUuZ2V0Tm9ybWFsKCBfdkEsIF92QiwgX3ZDLCBmYWNlLm5vcm1hbCApO1xyXG5cclxuXHRcdGludGVyc2VjdGlvbi5mYWNlID0gZmFjZTtcclxuXHRcdGludGVyc2VjdGlvbi5iYXJ5Y29vcmQgPSBiYXJ5Y29vcmQ7XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIGludGVyc2VjdGlvbjtcclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IE1lc2ggfTtcclxuIiwiaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcclxuaW1wb3J0IHsgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyQXR0cmlidXRlLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcblxyXG4vKipcclxuICogQSBnZW9tZXRyeSBjbGFzcyBmb3IgYSByZWN0YW5ndWxhciBjdWJvaWQgd2l0aCBhIGdpdmVuIHdpZHRoLCBoZWlnaHQsIGFuZCBkZXB0aC5cclxuICogT24gY3JlYXRpb24sIHRoZSBjdWJvaWQgaXMgY2VudHJlZCBvbiB0aGUgb3JpZ2luLCB3aXRoIGVhY2ggZWRnZSBwYXJhbGxlbCB0byBvbmVcclxuICogb2YgdGhlIGF4ZXMuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGdlb21ldHJ5ID0gbmV3IFRIUkVFLkJveEdlb21ldHJ5KCAxLCAxLCAxICk7XHJcbiAqIGNvbnN0IG1hdGVyaWFsID0gbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiAweDAwZmYwMCB9ICk7XHJcbiAqIGNvbnN0IGN1YmUgPSBuZXcgVEhSRUUuTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcbiAqIHNjZW5lLmFkZCggY3ViZSApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIEJ1ZmZlckdlb21ldHJ5XHJcbiAqL1xyXG5jbGFzcyBCb3hHZW9tZXRyeSBleHRlbmRzIEJ1ZmZlckdlb21ldHJ5IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBib3ggZ2VvbWV0cnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3dpZHRoPTFdIC0gVGhlIHdpZHRoLiBUaGF0IGlzLCB0aGUgbGVuZ3RoIG9mIHRoZSBlZGdlcyBwYXJhbGxlbCB0byB0aGUgWCBheGlzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbaGVpZ2h0PTFdIC0gVGhlIGhlaWdodC4gVGhhdCBpcywgdGhlIGxlbmd0aCBvZiB0aGUgZWRnZXMgcGFyYWxsZWwgdG8gdGhlIFkgYXhpcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2RlcHRoPTFdIC0gVGhlIGRlcHRoLiBUaGF0IGlzLCB0aGUgbGVuZ3RoIG9mIHRoZSBlZGdlcyBwYXJhbGxlbCB0byB0aGUgWiBheGlzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbd2lkdGhTZWdtZW50cz0xXSAtIE51bWJlciBvZiBzZWdtZW50ZWQgcmVjdGFuZ3VsYXIgZmFjZXMgYWxvbmcgdGhlIHdpZHRoIG9mIHRoZSBzaWRlcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2hlaWdodFNlZ21lbnRzPTFdIC0gTnVtYmVyIG9mIHNlZ21lbnRlZCByZWN0YW5ndWxhciBmYWNlcyBhbG9uZyB0aGUgaGVpZ2h0IG9mIHRoZSBzaWRlcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2RlcHRoU2VnbWVudHM9MV0gLSBOdW1iZXIgb2Ygc2VnbWVudGVkIHJlY3Rhbmd1bGFyIGZhY2VzIGFsb25nIHRoZSBkZXB0aCBvZiB0aGUgc2lkZXMuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHdpZHRoID0gMSwgaGVpZ2h0ID0gMSwgZGVwdGggPSAxLCB3aWR0aFNlZ21lbnRzID0gMSwgaGVpZ2h0U2VnbWVudHMgPSAxLCBkZXB0aFNlZ21lbnRzID0gMSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdCb3hHZW9tZXRyeSc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb2xkcyB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVycyB0aGF0IGhhdmUgYmVlblxyXG5cdFx0ICogdXNlZCB0byBnZW5lcmF0ZSB0aGUgZ2VvbWV0cnkuIEFueSBtb2RpZmljYXRpb25cclxuXHRcdCAqIGFmdGVyIGluc3RhbnRpYXRpb24gZG9lcyBub3QgY2hhbmdlIHRoZSBnZW9tZXRyeS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBhcmFtZXRlcnMgPSB7XHJcblx0XHRcdHdpZHRoOiB3aWR0aCxcclxuXHRcdFx0aGVpZ2h0OiBoZWlnaHQsXHJcblx0XHRcdGRlcHRoOiBkZXB0aCxcclxuXHRcdFx0d2lkdGhTZWdtZW50czogd2lkdGhTZWdtZW50cyxcclxuXHRcdFx0aGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzLFxyXG5cdFx0XHRkZXB0aFNlZ21lbnRzOiBkZXB0aFNlZ21lbnRzXHJcblx0XHR9O1xyXG5cclxuXHRcdGNvbnN0IHNjb3BlID0gdGhpcztcclxuXHJcblx0XHQvLyBzZWdtZW50c1xyXG5cclxuXHRcdHdpZHRoU2VnbWVudHMgPSBNYXRoLmZsb29yKCB3aWR0aFNlZ21lbnRzICk7XHJcblx0XHRoZWlnaHRTZWdtZW50cyA9IE1hdGguZmxvb3IoIGhlaWdodFNlZ21lbnRzICk7XHJcblx0XHRkZXB0aFNlZ21lbnRzID0gTWF0aC5mbG9vciggZGVwdGhTZWdtZW50cyApO1xyXG5cclxuXHRcdC8vIGJ1ZmZlcnNcclxuXHJcblx0XHRjb25zdCBpbmRpY2VzID0gW107XHJcblx0XHRjb25zdCB2ZXJ0aWNlcyA9IFtdO1xyXG5cdFx0Y29uc3Qgbm9ybWFscyA9IFtdO1xyXG5cdFx0Y29uc3QgdXZzID0gW107XHJcblxyXG5cdFx0Ly8gaGVscGVyIHZhcmlhYmxlc1xyXG5cclxuXHRcdGxldCBudW1iZXJPZlZlcnRpY2VzID0gMDtcclxuXHRcdGxldCBncm91cFN0YXJ0ID0gMDtcclxuXHJcblx0XHQvLyBidWlsZCBlYWNoIHNpZGUgb2YgdGhlIGJveCBnZW9tZXRyeVxyXG5cclxuXHRcdGJ1aWxkUGxhbmUoICd6JywgJ3knLCAneCcsIC0gMSwgLSAxLCBkZXB0aCwgaGVpZ2h0LCB3aWR0aCwgZGVwdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIDAgKTsgLy8gcHhcclxuXHRcdGJ1aWxkUGxhbmUoICd6JywgJ3knLCAneCcsIDEsIC0gMSwgZGVwdGgsIGhlaWdodCwgLSB3aWR0aCwgZGVwdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIDEgKTsgLy8gbnhcclxuXHRcdGJ1aWxkUGxhbmUoICd4JywgJ3onLCAneScsIDEsIDEsIHdpZHRoLCBkZXB0aCwgaGVpZ2h0LCB3aWR0aFNlZ21lbnRzLCBkZXB0aFNlZ21lbnRzLCAyICk7IC8vIHB5XHJcblx0XHRidWlsZFBsYW5lKCAneCcsICd6JywgJ3knLCAxLCAtIDEsIHdpZHRoLCBkZXB0aCwgLSBoZWlnaHQsIHdpZHRoU2VnbWVudHMsIGRlcHRoU2VnbWVudHMsIDMgKTsgLy8gbnlcclxuXHRcdGJ1aWxkUGxhbmUoICd4JywgJ3knLCAneicsIDEsIC0gMSwgd2lkdGgsIGhlaWdodCwgZGVwdGgsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCA0ICk7IC8vIHB6XHJcblx0XHRidWlsZFBsYW5lKCAneCcsICd5JywgJ3onLCAtIDEsIC0gMSwgd2lkdGgsIGhlaWdodCwgLSBkZXB0aCwgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIDUgKTsgLy8gbnpcclxuXHJcblx0XHQvLyBidWlsZCBnZW9tZXRyeVxyXG5cclxuXHRcdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcclxuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xyXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XHJcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XHJcblxyXG5cdFx0ZnVuY3Rpb24gYnVpbGRQbGFuZSggdSwgdiwgdywgdWRpciwgdmRpciwgd2lkdGgsIGhlaWdodCwgZGVwdGgsIGdyaWRYLCBncmlkWSwgbWF0ZXJpYWxJbmRleCApIHtcclxuXHJcblx0XHRcdGNvbnN0IHNlZ21lbnRXaWR0aCA9IHdpZHRoIC8gZ3JpZFg7XHJcblx0XHRcdGNvbnN0IHNlZ21lbnRIZWlnaHQgPSBoZWlnaHQgLyBncmlkWTtcclxuXHJcblx0XHRcdGNvbnN0IHdpZHRoSGFsZiA9IHdpZHRoIC8gMjtcclxuXHRcdFx0Y29uc3QgaGVpZ2h0SGFsZiA9IGhlaWdodCAvIDI7XHJcblx0XHRcdGNvbnN0IGRlcHRoSGFsZiA9IGRlcHRoIC8gMjtcclxuXHJcblx0XHRcdGNvbnN0IGdyaWRYMSA9IGdyaWRYICsgMTtcclxuXHRcdFx0Y29uc3QgZ3JpZFkxID0gZ3JpZFkgKyAxO1xyXG5cclxuXHRcdFx0bGV0IHZlcnRleENvdW50ZXIgPSAwO1xyXG5cdFx0XHRsZXQgZ3JvdXBDb3VudCA9IDA7XHJcblxyXG5cdFx0XHRjb25zdCB2ZWN0b3IgPSBuZXcgVmVjdG9yMygpO1xyXG5cclxuXHRcdFx0Ly8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGl5ID0gMDsgaXkgPCBncmlkWTE7IGl5ICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB5ID0gaXkgKiBzZWdtZW50SGVpZ2h0IC0gaGVpZ2h0SGFsZjtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGl4ID0gMDsgaXggPCBncmlkWDE7IGl4ICsrICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHggPSBpeCAqIHNlZ21lbnRXaWR0aCAtIHdpZHRoSGFsZjtcclxuXHJcblx0XHRcdFx0XHQvLyBzZXQgdmFsdWVzIHRvIGNvcnJlY3QgdmVjdG9yIGNvbXBvbmVudFxyXG5cclxuXHRcdFx0XHRcdHZlY3RvclsgdSBdID0geCAqIHVkaXI7XHJcblx0XHRcdFx0XHR2ZWN0b3JbIHYgXSA9IHkgKiB2ZGlyO1xyXG5cdFx0XHRcdFx0dmVjdG9yWyB3IF0gPSBkZXB0aEhhbGY7XHJcblxyXG5cdFx0XHRcdFx0Ly8gbm93IGFwcGx5IHZlY3RvciB0byB2ZXJ0ZXggYnVmZmVyXHJcblxyXG5cdFx0XHRcdFx0dmVydGljZXMucHVzaCggdmVjdG9yLngsIHZlY3Rvci55LCB2ZWN0b3IueiApO1xyXG5cclxuXHRcdFx0XHRcdC8vIHNldCB2YWx1ZXMgdG8gY29ycmVjdCB2ZWN0b3IgY29tcG9uZW50XHJcblxyXG5cdFx0XHRcdFx0dmVjdG9yWyB1IF0gPSAwO1xyXG5cdFx0XHRcdFx0dmVjdG9yWyB2IF0gPSAwO1xyXG5cdFx0XHRcdFx0dmVjdG9yWyB3IF0gPSBkZXB0aCA+IDAgPyAxIDogLSAxO1xyXG5cclxuXHRcdFx0XHRcdC8vIG5vdyBhcHBseSB2ZWN0b3IgdG8gbm9ybWFsIGJ1ZmZlclxyXG5cclxuXHRcdFx0XHRcdG5vcm1hbHMucHVzaCggdmVjdG9yLngsIHZlY3Rvci55LCB2ZWN0b3IueiApO1xyXG5cclxuXHRcdFx0XHRcdC8vIHV2c1xyXG5cclxuXHRcdFx0XHRcdHV2cy5wdXNoKCBpeCAvIGdyaWRYICk7XHJcblx0XHRcdFx0XHR1dnMucHVzaCggMSAtICggaXkgLyBncmlkWSApICk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gY291bnRlcnNcclxuXHJcblx0XHRcdFx0XHR2ZXJ0ZXhDb3VudGVyICs9IDE7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIGluZGljZXNcclxuXHJcblx0XHRcdC8vIDEuIHlvdSBuZWVkIHRocmVlIGluZGljZXMgdG8gZHJhdyBhIHNpbmdsZSBmYWNlXHJcblx0XHRcdC8vIDIuIGEgc2luZ2xlIHNlZ21lbnQgY29uc2lzdHMgb2YgdHdvIGZhY2VzXHJcblx0XHRcdC8vIDMuIHNvIHdlIG5lZWQgdG8gZ2VuZXJhdGUgc2l4ICgyKjMpIGluZGljZXMgcGVyIHNlZ21lbnRcclxuXHJcblx0XHRcdGZvciAoIGxldCBpeSA9IDA7IGl5IDwgZ3JpZFk7IGl5ICsrICkge1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaXggPSAwOyBpeCA8IGdyaWRYOyBpeCArKyApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBhID0gbnVtYmVyT2ZWZXJ0aWNlcyArIGl4ICsgZ3JpZFgxICogaXk7XHJcblx0XHRcdFx0XHRjb25zdCBiID0gbnVtYmVyT2ZWZXJ0aWNlcyArIGl4ICsgZ3JpZFgxICogKCBpeSArIDEgKTtcclxuXHRcdFx0XHRcdGNvbnN0IGMgPSBudW1iZXJPZlZlcnRpY2VzICsgKCBpeCArIDEgKSArIGdyaWRYMSAqICggaXkgKyAxICk7XHJcblx0XHRcdFx0XHRjb25zdCBkID0gbnVtYmVyT2ZWZXJ0aWNlcyArICggaXggKyAxICkgKyBncmlkWDEgKiBpeTtcclxuXHJcblx0XHRcdFx0XHQvLyBmYWNlc1xyXG5cclxuXHRcdFx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgZCApO1xyXG5cdFx0XHRcdFx0aW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gaW5jcmVhc2UgY291bnRlclxyXG5cclxuXHRcdFx0XHRcdGdyb3VwQ291bnQgKz0gNjtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gYWRkIGEgZ3JvdXAgdG8gdGhlIGdlb21ldHJ5LiB0aGlzIHdpbGwgZW5zdXJlIG11bHRpIG1hdGVyaWFsIHN1cHBvcnRcclxuXHJcblx0XHRcdHNjb3BlLmFkZEdyb3VwKCBncm91cFN0YXJ0LCBncm91cENvdW50LCBtYXRlcmlhbEluZGV4ICk7XHJcblxyXG5cdFx0XHQvLyBjYWxjdWxhdGUgbmV3IHN0YXJ0IHZhbHVlIGZvciBncm91cHNcclxuXHJcblx0XHRcdGdyb3VwU3RhcnQgKz0gZ3JvdXBDb3VudDtcclxuXHJcblx0XHRcdC8vIHVwZGF0ZSB0b3RhbCBudW1iZXIgb2YgdmVydGljZXNcclxuXHJcblx0XHRcdG51bWJlck9mVmVydGljZXMgKz0gdmVydGV4Q291bnRlcjtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMucGFyYW1ldGVycyA9IE9iamVjdC5hc3NpZ24oIHt9LCBzb3VyY2UucGFyYW1ldGVycyApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGZyb20gdGhlIGdpdmVuXHJcblx0ICogSlNPTiBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIEEgSlNPTiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzZXJpYWxpemVkIGdlb21ldHJ5LlxyXG5cdCAqIEByZXR1cm4ge0JveEdlb21ldHJ5fSBBIG5ldyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzdGF0aWMgZnJvbUpTT04oIGRhdGEgKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBCb3hHZW9tZXRyeSggZGF0YS53aWR0aCwgZGF0YS5oZWlnaHQsIGRhdGEuZGVwdGgsIGRhdGEud2lkdGhTZWdtZW50cywgZGF0YS5oZWlnaHRTZWdtZW50cywgZGF0YS5kZXB0aFNlZ21lbnRzICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IEJveEdlb21ldHJ5IH07XHJcbiIsImltcG9ydCB7IENvbG9yTWFuYWdlbWVudCB9IGZyb20gJy4uLy4uL21hdGgvQ29sb3JNYW5hZ2VtZW50LmpzJztcclxuXHJcbi8vIFVuaWZvcm0gVXRpbGl0aWVzXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY2xvbmVVbmlmb3Jtcyggc3JjICkge1xyXG5cclxuXHRjb25zdCBkc3QgPSB7fTtcclxuXHJcblx0Zm9yICggY29uc3QgdSBpbiBzcmMgKSB7XHJcblxyXG5cdFx0ZHN0WyB1IF0gPSB7fTtcclxuXHJcblx0XHRmb3IgKCBjb25zdCBwIGluIHNyY1sgdSBdICkge1xyXG5cclxuXHRcdFx0Y29uc3QgcHJvcGVydHkgPSBzcmNbIHUgXVsgcCBdO1xyXG5cclxuXHRcdFx0aWYgKCBwcm9wZXJ0eSAmJiAoIHByb3BlcnR5LmlzQ29sb3IgfHxcclxuXHRcdFx0XHRwcm9wZXJ0eS5pc01hdHJpeDMgfHwgcHJvcGVydHkuaXNNYXRyaXg0IHx8XHJcblx0XHRcdFx0cHJvcGVydHkuaXNWZWN0b3IyIHx8IHByb3BlcnR5LmlzVmVjdG9yMyB8fCBwcm9wZXJ0eS5pc1ZlY3RvcjQgfHxcclxuXHRcdFx0XHRwcm9wZXJ0eS5pc1RleHR1cmUgfHwgcHJvcGVydHkuaXNRdWF0ZXJuaW9uICkgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggcHJvcGVydHkuaXNSZW5kZXJUYXJnZXRUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1VuaWZvcm1zVXRpbHM6IFRleHR1cmVzIG9mIHJlbmRlciB0YXJnZXRzIGNhbm5vdCBiZSBjbG9uZWQgdmlhIGNsb25lVW5pZm9ybXMoKSBvciBtZXJnZVVuaWZvcm1zKCkuJyApO1xyXG5cdFx0XHRcdFx0ZHN0WyB1IF1bIHAgXSA9IG51bGw7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0ZHN0WyB1IF1bIHAgXSA9IHByb3BlcnR5LmNsb25lKCk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIEFycmF5LmlzQXJyYXkoIHByb3BlcnR5ICkgKSB7XHJcblxyXG5cdFx0XHRcdGRzdFsgdSBdWyBwIF0gPSBwcm9wZXJ0eS5zbGljZSgpO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0ZHN0WyB1IF1bIHAgXSA9IHByb3BlcnR5O1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gZHN0O1xyXG5cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlVW5pZm9ybXMoIHVuaWZvcm1zICkge1xyXG5cclxuXHRjb25zdCBtZXJnZWQgPSB7fTtcclxuXHJcblx0Zm9yICggbGV0IHUgPSAwOyB1IDwgdW5pZm9ybXMubGVuZ3RoOyB1ICsrICkge1xyXG5cclxuXHRcdGNvbnN0IHRtcCA9IGNsb25lVW5pZm9ybXMoIHVuaWZvcm1zWyB1IF0gKTtcclxuXHJcblx0XHRmb3IgKCBjb25zdCBwIGluIHRtcCApIHtcclxuXHJcblx0XHRcdG1lcmdlZFsgcCBdID0gdG1wWyBwIF07XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiBtZXJnZWQ7XHJcblxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY2xvbmVVbmlmb3Jtc0dyb3Vwcyggc3JjICkge1xyXG5cclxuXHRjb25zdCBkc3QgPSBbXTtcclxuXHJcblx0Zm9yICggbGV0IHUgPSAwOyB1IDwgc3JjLmxlbmd0aDsgdSArKyApIHtcclxuXHJcblx0XHRkc3QucHVzaCggc3JjWyB1IF0uY2xvbmUoKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiBkc3Q7XHJcblxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0VW5saXRVbmlmb3JtQ29sb3JTcGFjZSggcmVuZGVyZXIgKSB7XHJcblxyXG5cdGNvbnN0IGN1cnJlbnRSZW5kZXJUYXJnZXQgPSByZW5kZXJlci5nZXRSZW5kZXJUYXJnZXQoKTtcclxuXHJcblx0aWYgKCBjdXJyZW50UmVuZGVyVGFyZ2V0ID09PSBudWxsICkge1xyXG5cclxuXHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tcmRvb2IvdGhyZWUuanMvcHVsbC8yMzkzNyNpc3N1ZWNvbW1lbnQtMTExMTA2NzM5OFxyXG5cdFx0cmV0dXJuIHJlbmRlcmVyLm91dHB1dENvbG9yU3BhY2U7XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL21yZG9vYi90aHJlZS5qcy9pc3N1ZXMvMjc4NjhcclxuXHRpZiAoIGN1cnJlbnRSZW5kZXJUYXJnZXQuaXNYUlJlbmRlclRhcmdldCA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRyZXR1cm4gY3VycmVudFJlbmRlclRhcmdldC50ZXh0dXJlLmNvbG9yU3BhY2U7XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIENvbG9yTWFuYWdlbWVudC53b3JraW5nQ29sb3JTcGFjZTtcclxuXHJcbn1cclxuXHJcbi8vIExlZ2FjeVxyXG5cclxuY29uc3QgVW5pZm9ybXNVdGlscyA9IHsgY2xvbmU6IGNsb25lVW5pZm9ybXMsIG1lcmdlOiBtZXJnZVVuaWZvcm1zIH07XHJcblxyXG5leHBvcnQgeyBVbmlmb3Jtc1V0aWxzIH07XHJcbiIsImltcG9ydCB7IE1hdGVyaWFsIH0gZnJvbSAnLi9NYXRlcmlhbC5qcyc7XHJcbmltcG9ydCB7IGNsb25lVW5pZm9ybXMsIGNsb25lVW5pZm9ybXNHcm91cHMgfSBmcm9tICcuLi9yZW5kZXJlcnMvc2hhZGVycy9Vbmlmb3Jtc1V0aWxzLmpzJztcclxuXHJcbmltcG9ydCBkZWZhdWx0X3ZlcnRleCBmcm9tICcuLi9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9kZWZhdWx0X3ZlcnRleC5nbHNsLmpzJztcclxuaW1wb3J0IGRlZmF1bHRfZnJhZ21lbnQgZnJvbSAnLi4vcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvZGVmYXVsdF9mcmFnbWVudC5nbHNsLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIG1hdGVyaWFsIHJlbmRlcmVkIHdpdGggY3VzdG9tIHNoYWRlcnMuIEEgc2hhZGVyIGlzIGEgc21hbGwgcHJvZ3JhbSB3cml0dGVuIGluIEdMU0wuXHJcbiAqIHRoYXQgcnVucyBvbiB0aGUgR1BVLiBZb3UgbWF5IHdhbnQgdG8gdXNlIGEgY3VzdG9tIHNoYWRlciBpZiB5b3UgbmVlZCB0byBpbXBsZW1lbnQgYW5cclxuICogZWZmZWN0IG5vdCBpbmNsdWRlZCB3aXRoIGFueSBvZiB0aGUgYnVpbHQtaW4gbWF0ZXJpYWxzLlxyXG4gKlxyXG4gKiBUaGVyZSBhcmUgdGhlIGZvbGxvd2luZyBub3RlcyB0byBiZWFyIGluIG1pbmQgd2hlbiB1c2luZyBhIGBTaGFkZXJNYXRlcmlhbGA6XHJcbiAqXHJcbiAqIC0gYFNoYWRlck1hdGVyaWFsYCBjYW4gb25seSBiZSB1c2VkIHdpdGgge0BsaW5rIFdlYkdMUmVuZGVyZXJ9LlxyXG4gKiAtIEJ1aWx0IGluIGF0dHJpYnV0ZXMgYW5kIHVuaWZvcm1zIGFyZSBwYXNzZWQgdG8gdGhlIHNoYWRlcnMgYWxvbmcgd2l0aCB5b3VyIGNvZGUuIElmXHJcbiAqIHlvdSBkb24ndCB3YW50IHRoYXQsIHVzZSB7QGxpbmsgUmF3U2hhZGVyTWF0ZXJpYWx9IGluc3RlYWQuXHJcbiAqIC0gWW91IGNhbiB1c2UgdGhlIGRpcmVjdGl2ZSBgI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydGAgYW5kIGAjcHJhZ21hIHVucm9sbF9sb29wX2VuZGBcclxuICogaW4gb3JkZXIgdG8gdW5yb2xsIGEgYGZvcmAgbG9vcCBpbiBHTFNMIGJ5IHRoZSBzaGFkZXIgcHJlcHJvY2Vzc29yLiBUaGUgZGlyZWN0aXZlIGhhc1xyXG4gKiB0byBiZSBwbGFjZWQgcmlnaHQgYWJvdmUgdGhlIGxvb3AuIFRoZSBsb29wIGZvcm1hdHRpbmcgaGFzIHRvIGNvcnJlc3BvbmQgdG8gYSBkZWZpbmVkIHN0YW5kYXJkLlxyXG4gKiAgIC0gVGhlIGxvb3AgaGFzIHRvIGJlIFtub3JtYWxpemVkXXtAbGluayBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Ob3JtYWxpemVkX2xvb3B9LlxyXG4gKiAgIC0gVGhlIGxvb3AgdmFyaWFibGUgaGFzIHRvIGJlICppKi5cclxuICogICAtIFRoZSB2YWx1ZSBgVU5ST0xMRURfTE9PUF9JTkRFWGAgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSBleHBsaWNpdGx5XHJcbiAqIHZhbHVlIG9mICppKiBmb3IgdGhlIGdpdmVuIGl0ZXJhdGlvbiBhbmQgY2FuIGJlIHVzZWQgaW4gcHJlcHJvY2Vzc29yXHJcbiAqIHN0YXRlbWVudHMuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IG1hdGVyaWFsID0gbmV3IFRIUkVFLlNoYWRlck1hdGVyaWFsKCB7XHJcbiAqIFx0dW5pZm9ybXM6IHtcclxuICogXHRcdHRpbWU6IHsgdmFsdWU6IDEuMCB9LFxyXG4gKiBcdFx0cmVzb2x1dGlvbjogeyB2YWx1ZTogbmV3IFRIUkVFLlZlY3RvcjIoKSB9XHJcbiAqIFx0fSxcclxuICogXHR2ZXJ0ZXhTaGFkZXI6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCAndmVydGV4U2hhZGVyJyApLnRleHRDb250ZW50LFxyXG4gKiBcdGZyYWdtZW50U2hhZGVyOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggJ2ZyYWdtZW50U2hhZGVyJyApLnRleHRDb250ZW50XHJcbiAqIH0gKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBNYXRlcmlhbFxyXG4gKi9cclxuY2xhc3MgU2hhZGVyTWF0ZXJpYWwgZXh0ZW5kcyBNYXRlcmlhbCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc2hhZGVyIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbWV0ZXJzXSAtIEFuIG9iamVjdCB3aXRoIG9uZSBvciBtb3JlIHByb3BlcnRpZXNcclxuXHQgKiBkZWZpbmluZyB0aGUgbWF0ZXJpYWwncyBhcHBlYXJhbmNlLiBBbnkgcHJvcGVydHkgb2YgdGhlIG1hdGVyaWFsXHJcblx0ICogKGluY2x1ZGluZyBhbnkgcHJvcGVydHkgZnJvbSBpbmhlcml0ZWQgbWF0ZXJpYWxzKSBjYW4gYmUgcGFzc2VkXHJcblx0ICogaW4gaGVyZS4gQ29sb3IgdmFsdWVzIGNhbiBiZSBwYXNzZWQgYW55IHR5cGUgb2YgdmFsdWUgYWNjZXB0ZWRcclxuXHQgKiBieSB7QGxpbmsgQ29sb3Ijc2V0fS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVycyApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1NoYWRlck1hdGVyaWFsID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnU2hhZGVyTWF0ZXJpYWwnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyBjdXN0b20gY29uc3RhbnRzIHVzaW5nIGAjZGVmaW5lYCBkaXJlY3RpdmVzIHdpdGhpbiB0aGUgR0xTTCBjb2RlXHJcblx0XHQgKiBmb3IgYm90aCB0aGUgdmVydGV4IHNoYWRlciBhbmQgdGhlIGZyYWdtZW50IHNoYWRlcjsgZWFjaCBrZXkvdmFsdWUgcGFpclxyXG5cdFx0ICogeWllbGRzIGFub3RoZXIgZGlyZWN0aXZlLlxyXG5cdFx0ICogYGBganNcclxuXHRcdCAqIGRlZmluZXM6IHtcclxuXHRcdCAqIFx0Rk9POiAxNSxcclxuXHRcdCAqIFx0QkFSOiB0cnVlXHJcblx0XHQgKiB9XHJcblx0XHQgKiBgYGBcclxuXHRcdCAqIFlpZWxkcyB0aGUgbGluZXM6XHJcblx0XHQgKiBgYGBcclxuXHRcdCAqICNkZWZpbmUgRk9PIDE1XHJcblx0XHQgKiAjZGVmaW5lIEJBUiB0cnVlXHJcblx0XHQgKiBgYGBcclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRlZmluZXMgPSB7fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIG9iamVjdCBvZiB0aGUgZm9ybTpcclxuXHRcdCAqIGBgYGpzXHJcblx0XHQgKiB7XHJcblx0XHQgKiBcdFwidW5pZm9ybTFcIjogeyB2YWx1ZTogMS4wIH0sXHJcblx0XHQgKiBcdFwidW5pZm9ybTJcIjogeyB2YWx1ZTogMiB9XHJcblx0XHQgKiB9XHJcblx0XHQgKiBgYGBcclxuXHRcdCAqIHNwZWNpZnlpbmcgdGhlIHVuaWZvcm1zIHRvIGJlIHBhc3NlZCB0byB0aGUgc2hhZGVyIGNvZGU7IGtleXMgYXJlIHVuaWZvcm1cclxuXHRcdCAqIG5hbWVzLCB2YWx1ZXMgYXJlIGRlZmluaXRpb25zIG9mIHRoZSBmb3JtXHJcblx0XHQgKiBgYGBcclxuXHRcdCAqIHtcclxuXHRcdCAqIFx0dmFsdWU6IDEuMFxyXG5cdFx0ICogfVxyXG5cdFx0ICogYGBgXHJcblx0XHQgKiB3aGVyZSBgdmFsdWVgIGlzIHRoZSB2YWx1ZSBvZiB0aGUgdW5pZm9ybS4gTmFtZXMgbXVzdCBtYXRjaCB0aGUgbmFtZSBvZlxyXG5cdFx0ICogdGhlIHVuaWZvcm0sIGFzIGRlZmluZWQgaW4gdGhlIEdMU0wgY29kZS4gTm90ZSB0aGF0IHVuaWZvcm1zIGFyZSByZWZyZXNoZWRcclxuXHRcdCAqIG9uIGV2ZXJ5IGZyYW1lLCBzbyB1cGRhdGluZyB0aGUgdmFsdWUgb2YgdGhlIHVuaWZvcm0gd2lsbCBpbW1lZGlhdGVseVxyXG5cdFx0ICogdXBkYXRlIHRoZSB2YWx1ZSBhdmFpbGFibGUgdG8gdGhlIEdMU0wgY29kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVuaWZvcm1zID0ge307XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBhcnJheSBob2xkaW5nIHVuaWZvcm1zIGdyb3VwcyBmb3IgY29uZmlndXJpbmcgVUJPcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8VW5pZm9ybXNHcm91cD59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudW5pZm9ybXNHcm91cHMgPSBbXTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFZlcnRleCBzaGFkZXIgR0xTTCBjb2RlLiBUaGlzIGlzIHRoZSBhY3R1YWwgY29kZSBmb3IgdGhlIHNoYWRlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnZlcnRleFNoYWRlciA9IGRlZmF1bHRfdmVydGV4O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRnJhZ21lbnQgc2hhZGVyIEdMU0wgY29kZS4gVGhpcyBpcyB0aGUgYWN0dWFsIGNvZGUgZm9yIHRoZSBzaGFkZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5mcmFnbWVudFNoYWRlciA9IGRlZmF1bHRfZnJhZ21lbnQ7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDb250cm9scyBsaW5lIHRoaWNrbmVzcyBvciBsaW5lcy5cclxuXHRcdCAqXHJcblx0XHQgKiBXZWJHTCBhbmQgV2ViR1BVIGlnbm9yZSB0aGlzIHNldHRpbmcgYW5kIGFsd2F5cyByZW5kZXIgbGluZSBwcmltaXRpdmVzIHdpdGggYVxyXG5cdFx0ICogd2lkdGggb2Ygb25lIHBpeGVsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGluZXdpZHRoID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlbmRlcnMgdGhlIGdlb21ldHJ5IGFzIGEgd2lyZWZyYW1lLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy53aXJlZnJhbWUgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENvbnRyb2xzIHRoZSB0aGlja25lc3Mgb2YgdGhlIHdpcmVmcmFtZS5cclxuXHRcdCAqXHJcblx0XHQgKiBXZWJHTCBhbmQgV2ViR1BVIGlnbm9yZSB0aGlzIHByb3BlcnR5IGFuZCBhbHdheXMgcmVuZGVyXHJcblx0XHQgKiAxIHBpeGVsIHdpZGUgbGluZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lIHdoZXRoZXIgdGhlIG1hdGVyaWFsIGNvbG9yIGlzIGFmZmVjdGVkIGJ5IGdsb2JhbCBmb2cgc2V0dGluZ3M7IGB0cnVlYFxyXG5cdFx0ICogdG8gcGFzcyBmb2cgdW5pZm9ybXMgdG8gdGhlIHNoYWRlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZm9nID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIHdoZXRoZXIgdGhpcyBtYXRlcmlhbCB1c2VzIGxpZ2h0aW5nOyBgdHJ1ZWAgdG8gcGFzcyB1bmlmb3JtIGRhdGFcclxuXHRcdCAqIHJlbGF0ZWQgdG8gbGlnaHRpbmcgdG8gdGhpcyBzaGFkZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxpZ2h0cyA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyB3aGV0aGVyIHRoaXMgbWF0ZXJpYWwgc3VwcG9ydHMgY2xpcHBpbmc7IGB0cnVlYCB0byBsZXQgdGhlIHJlbmRlcmVyXHJcblx0XHQgKiBwYXNzIHRoZSBjbGlwcGluZ1BsYW5lcyB1bmlmb3JtLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jbGlwcGluZyA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogT3ZlcndyaXR0ZW4gYW5kIHNldCB0byBgdHJ1ZWAgYnkgZGVmYXVsdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5mb3JjZVNpbmdsZVBhc3MgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBvYmplY3QgYWxsb3dzIHRvIGVuYWJsZSBjZXJ0YWluIFdlYkdMIDIgZXh0ZW5zaW9ucy5cclxuXHRcdCAqXHJcblx0XHQgKiAtIGNsaXBDdWxsRGlzdGFuY2U6IHNldCB0byBgdHJ1ZWAgdG8gdXNlIHZlcnRleCBzaGFkZXIgY2xpcHBpbmdcclxuXHRcdCAqIC0gbXVsdGlEcmF3OiBzZXQgdG8gYHRydWVgIHRvIHVzZSB2ZXJ0ZXggc2hhZGVyIG11bHRpX2RyYXcgLyBlbmFibGUgZ2xfRHJhd0lEXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3tjbGlwQ3VsbERpc3RhbmNlOmZhbHNlLG11bHRpRHJhdzpmYWxzZX19XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZXh0ZW5zaW9ucyA9IHtcclxuXHRcdFx0Y2xpcEN1bGxEaXN0YW5jZTogZmFsc2UsIC8vIHNldCB0byB1c2UgdmVydGV4IHNoYWRlciBjbGlwcGluZ1xyXG5cdFx0XHRtdWx0aURyYXc6IGZhbHNlIC8vIHNldCB0byB1c2UgdmVydGV4IHNoYWRlciBtdWx0aV9kcmF3IC8gZW5hYmxlIGdsX0RyYXdJRFxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZW4gdGhlIHJlbmRlcmVkIGdlb21ldHJ5IGRvZXNuJ3QgaW5jbHVkZSB0aGVzZSBhdHRyaWJ1dGVzIGJ1dCB0aGVcclxuXHRcdCAqIG1hdGVyaWFsIGRvZXMsIHRoZXNlIGRlZmF1bHQgdmFsdWVzIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBzaGFkZXJzLiBUaGlzXHJcblx0XHQgKiBhdm9pZHMgZXJyb3JzIHdoZW4gYnVmZmVyIGRhdGEgaXMgbWlzc2luZy5cclxuXHRcdCAqXHJcblx0XHQgKiAtIGNvbG9yOiBbIDEsIDEsIDEgXVxyXG5cdFx0ICogLSB1djogWyAwLCAwIF1cclxuXHRcdCAqIC0gdXYxOiBbIDAsIDAgXVxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGVmYXVsdEF0dHJpYnV0ZVZhbHVlcyA9IHtcclxuXHRcdFx0J2NvbG9yJzogWyAxLCAxLCAxIF0sXHJcblx0XHRcdCd1dic6IFsgMCwgMCBdLFxyXG5cdFx0XHQndXYxJzogWyAwLCAwIF1cclxuXHRcdH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBJZiBzZXQsIHRoaXMgY2FsbHMgW2dsLmJpbmRBdHRyaWJMb2NhdGlvbl17QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dlYkdMUmVuZGVyaW5nQ29udGV4dC9iaW5kQXR0cmliTG9jYXRpb259XHJcblx0XHQgKiB0byBiaW5kIGEgZ2VuZXJpYyB2ZXJ0ZXggaW5kZXggdG8gYW4gYXR0cmlidXRlIHZhcmlhYmxlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd8dW5kZWZpbmVkfVxyXG5cdFx0ICogQGRlZmF1bHQgdW5kZWZpbmVkXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaW5kZXgwQXR0cmlidXRlTmFtZSA9IHVuZGVmaW5lZDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENhbiBiZSB1c2VkIHRvIGZvcmNlIGEgdW5pZm9ybSB1cGRhdGUgd2hpbGUgY2hhbmdpbmcgdW5pZm9ybXMgaW5cclxuXHRcdCAqIHtAbGluayBPYmplY3QzRCNvbkJlZm9yZVJlbmRlcn0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVuaWZvcm1zTmVlZFVwZGF0ZSA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyB0aGUgR0xTTCB2ZXJzaW9uIG9mIGN1c3RvbSBzaGFkZXIgY29kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7PyhHTFNMMXxHTFNMMyl9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ2xzbFZlcnNpb24gPSBudWxsO1xyXG5cclxuXHRcdGlmICggcGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMuZnJhZ21lbnRTaGFkZXIgPSBzb3VyY2UuZnJhZ21lbnRTaGFkZXI7XHJcblx0XHR0aGlzLnZlcnRleFNoYWRlciA9IHNvdXJjZS52ZXJ0ZXhTaGFkZXI7XHJcblxyXG5cdFx0dGhpcy51bmlmb3JtcyA9IGNsb25lVW5pZm9ybXMoIHNvdXJjZS51bmlmb3JtcyApO1xyXG5cdFx0dGhpcy51bmlmb3Jtc0dyb3VwcyA9IGNsb25lVW5pZm9ybXNHcm91cHMoIHNvdXJjZS51bmlmb3Jtc0dyb3VwcyApO1xyXG5cclxuXHRcdHRoaXMuZGVmaW5lcyA9IE9iamVjdC5hc3NpZ24oIHt9LCBzb3VyY2UuZGVmaW5lcyApO1xyXG5cclxuXHRcdHRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTtcclxuXHRcdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFtZUxpbmV3aWR0aDtcclxuXHJcblx0XHR0aGlzLmZvZyA9IHNvdXJjZS5mb2c7XHJcblx0XHR0aGlzLmxpZ2h0cyA9IHNvdXJjZS5saWdodHM7XHJcblx0XHR0aGlzLmNsaXBwaW5nID0gc291cmNlLmNsaXBwaW5nO1xyXG5cclxuXHRcdHRoaXMuZXh0ZW5zaW9ucyA9IE9iamVjdC5hc3NpZ24oIHt9LCBzb3VyY2UuZXh0ZW5zaW9ucyApO1xyXG5cclxuXHRcdHRoaXMuZ2xzbFZlcnNpb24gPSBzb3VyY2UuZ2xzbFZlcnNpb247XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0dG9KU09OKCBtZXRhICkge1xyXG5cclxuXHRcdGNvbnN0IGRhdGEgPSBzdXBlci50b0pTT04oIG1ldGEgKTtcclxuXHJcblx0XHRkYXRhLmdsc2xWZXJzaW9uID0gdGhpcy5nbHNsVmVyc2lvbjtcclxuXHRcdGRhdGEudW5pZm9ybXMgPSB7fTtcclxuXHJcblx0XHRmb3IgKCBjb25zdCBuYW1lIGluIHRoaXMudW5pZm9ybXMgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB1bmlmb3JtID0gdGhpcy51bmlmb3Jtc1sgbmFtZSBdO1xyXG5cdFx0XHRjb25zdCB2YWx1ZSA9IHVuaWZvcm0udmFsdWU7XHJcblxyXG5cdFx0XHRpZiAoIHZhbHVlICYmIHZhbHVlLmlzVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0ZGF0YS51bmlmb3Jtc1sgbmFtZSBdID0ge1xyXG5cdFx0XHRcdFx0dHlwZTogJ3QnLFxyXG5cdFx0XHRcdFx0dmFsdWU6IHZhbHVlLnRvSlNPTiggbWV0YSApLnV1aWRcclxuXHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggdmFsdWUgJiYgdmFsdWUuaXNDb2xvciApIHtcclxuXHJcblx0XHRcdFx0ZGF0YS51bmlmb3Jtc1sgbmFtZSBdID0ge1xyXG5cdFx0XHRcdFx0dHlwZTogJ2MnLFxyXG5cdFx0XHRcdFx0dmFsdWU6IHZhbHVlLmdldEhleCgpXHJcblx0XHRcdFx0fTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIHZhbHVlICYmIHZhbHVlLmlzVmVjdG9yMiApIHtcclxuXHJcblx0XHRcdFx0ZGF0YS51bmlmb3Jtc1sgbmFtZSBdID0ge1xyXG5cdFx0XHRcdFx0dHlwZTogJ3YyJyxcclxuXHRcdFx0XHRcdHZhbHVlOiB2YWx1ZS50b0FycmF5KClcclxuXHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggdmFsdWUgJiYgdmFsdWUuaXNWZWN0b3IzICkge1xyXG5cclxuXHRcdFx0XHRkYXRhLnVuaWZvcm1zWyBuYW1lIF0gPSB7XHJcblx0XHRcdFx0XHR0eXBlOiAndjMnLFxyXG5cdFx0XHRcdFx0dmFsdWU6IHZhbHVlLnRvQXJyYXkoKVxyXG5cdFx0XHRcdH07XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCB2YWx1ZSAmJiB2YWx1ZS5pc1ZlY3RvcjQgKSB7XHJcblxyXG5cdFx0XHRcdGRhdGEudW5pZm9ybXNbIG5hbWUgXSA9IHtcclxuXHRcdFx0XHRcdHR5cGU6ICd2NCcsXHJcblx0XHRcdFx0XHR2YWx1ZTogdmFsdWUudG9BcnJheSgpXHJcblx0XHRcdFx0fTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIHZhbHVlICYmIHZhbHVlLmlzTWF0cml4MyApIHtcclxuXHJcblx0XHRcdFx0ZGF0YS51bmlmb3Jtc1sgbmFtZSBdID0ge1xyXG5cdFx0XHRcdFx0dHlwZTogJ20zJyxcclxuXHRcdFx0XHRcdHZhbHVlOiB2YWx1ZS50b0FycmF5KClcclxuXHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggdmFsdWUgJiYgdmFsdWUuaXNNYXRyaXg0ICkge1xyXG5cclxuXHRcdFx0XHRkYXRhLnVuaWZvcm1zWyBuYW1lIF0gPSB7XHJcblx0XHRcdFx0XHR0eXBlOiAnbTQnLFxyXG5cdFx0XHRcdFx0dmFsdWU6IHZhbHVlLnRvQXJyYXkoKVxyXG5cdFx0XHRcdH07XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRkYXRhLnVuaWZvcm1zWyBuYW1lIF0gPSB7XHJcblx0XHRcdFx0XHR2YWx1ZTogdmFsdWVcclxuXHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0XHQvLyBub3RlOiB0aGUgYXJyYXkgdmFyaWFudHMgdjJ2LCB2M3YsIHY0diwgbTR2IGFuZCB0diBhcmUgbm90IHN1cHBvcnRlZCBzbyBmYXJcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBPYmplY3Qua2V5cyggdGhpcy5kZWZpbmVzICkubGVuZ3RoID4gMCApIGRhdGEuZGVmaW5lcyA9IHRoaXMuZGVmaW5lcztcclxuXHJcblx0XHRkYXRhLnZlcnRleFNoYWRlciA9IHRoaXMudmVydGV4U2hhZGVyO1xyXG5cdFx0ZGF0YS5mcmFnbWVudFNoYWRlciA9IHRoaXMuZnJhZ21lbnRTaGFkZXI7XHJcblxyXG5cdFx0ZGF0YS5saWdodHMgPSB0aGlzLmxpZ2h0cztcclxuXHRcdGRhdGEuY2xpcHBpbmcgPSB0aGlzLmNsaXBwaW5nO1xyXG5cclxuXHRcdGNvbnN0IGV4dGVuc2lvbnMgPSB7fTtcclxuXHJcblx0XHRmb3IgKCBjb25zdCBrZXkgaW4gdGhpcy5leHRlbnNpb25zICkge1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLmV4dGVuc2lvbnNbIGtleSBdID09PSB0cnVlICkgZXh0ZW5zaW9uc1sga2V5IF0gPSB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIE9iamVjdC5rZXlzKCBleHRlbnNpb25zICkubGVuZ3RoID4gMCApIGRhdGEuZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnM7XHJcblxyXG5cdFx0cmV0dXJuIGRhdGE7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUaGlzIHR5cGUgcmVwcmVzZW50cyB0aGUgZmllbGRzIHJlcXVpcmVkIHRvIHN0b3JlIGFuZCBydW4gdGhlIHNoYWRlciBjb2RlLlxyXG4gKlxyXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTaGFkZXJNYXRlcmlhbH5TaGFkZXJcclxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgc2hhZGVyLlxyXG4gKiBAcHJvcGVydHkge09iamVjdDxzdHJpbmcsIFVuaWZvcm0+fSB1bmlmb3JtcyAtIFRoZSB1bmlmb3JtcyBvZiB0aGUgc2hhZGVyLlxyXG4gKiBAcHJvcGVydHkge09iamVjdDxzdHJpbmcsIGFueT59IGRlZmluZXMgLSBUaGUgZGVmaW5lcyBvZiB0aGUgc2hhZGVyLlxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdmVydGV4U2hhZGVyIC0gVGhlIHZlcnRleCBzaGFkZXIgY29kZS5cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZyYWdtZW50U2hhZGVyIC0gVGhlIGZyYWdtZW50IHNoYWRlciBjb2RlLlxyXG4gKiovXHJcblxyXG5leHBvcnQgeyBTaGFkZXJNYXRlcmlhbCB9O1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG52b2lkIG1haW4oKSB7XHJcblx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNCggcG9zaXRpb24sIDEuMCApO1xyXG59XHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbnZvaWQgbWFpbigpIHtcclxuXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCAxLjAsIDAuMCwgMC4wLCAxLjAgKTtcclxufVxyXG5gO1xyXG4iLCJpbXBvcnQgeyBXZWJHTENvb3JkaW5hdGVTeXN0ZW0gfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBNYXRyaXg0IH0gZnJvbSAnLi4vbWF0aC9NYXRyaXg0LmpzJztcclxuaW1wb3J0IHsgT2JqZWN0M0QgfSBmcm9tICcuLi9jb3JlL09iamVjdDNELmpzJztcclxuXHJcbi8qKlxyXG4gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBjYW1lcmFzLiBUaGlzIGNsYXNzIHNob3VsZCBhbHdheXMgYmUgaW5oZXJpdGVkXHJcbiAqIHdoZW4geW91IGJ1aWxkIGEgbmV3IGNhbWVyYS5cclxuICpcclxuICogQGFic3RyYWN0XHJcbiAqIEBhdWdtZW50cyBPYmplY3QzRFxyXG4gKi9cclxuY2xhc3MgQ2FtZXJhIGV4dGVuZHMgT2JqZWN0M0Qge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGNhbWVyYS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0NhbWVyYSA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ0NhbWVyYSc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgaW52ZXJzZSBvZiB0aGUgY2FtZXJhJ3Mgd29ybGQgbWF0cml4LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtNYXRyaXg0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZSA9IG5ldyBNYXRyaXg0KCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY2FtZXJhJ3MgcHJvamVjdGlvbiBtYXRyaXguXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge01hdHJpeDR9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucHJvamVjdGlvbk1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgaW52ZXJzZSBvZiB0aGUgY2FtZXJhJ3MgcHJvamVjdGlvbiBtYXRyaXguXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge01hdHJpeDR9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucHJvamVjdGlvbk1hdHJpeEludmVyc2UgPSBuZXcgTWF0cml4NCgpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNvb3JkaW5hdGUgc3lzdGVtIGluIHdoaWNoIHRoZSBjYW1lcmEgaXMgdXNlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KFdlYkdMQ29vcmRpbmF0ZVN5c3RlbXxXZWJHUFVDb29yZGluYXRlU3lzdGVtKX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb29yZGluYXRlU3lzdGVtID0gV2ViR0xDb29yZGluYXRlU3lzdGVtO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSwgcmVjdXJzaXZlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSwgcmVjdXJzaXZlICk7XHJcblxyXG5cdFx0dGhpcy5tYXRyaXhXb3JsZEludmVyc2UuY29weSggc291cmNlLm1hdHJpeFdvcmxkSW52ZXJzZSApO1xyXG5cclxuXHRcdHRoaXMucHJvamVjdGlvbk1hdHJpeC5jb3B5KCBzb3VyY2UucHJvamVjdGlvbk1hdHJpeCApO1xyXG5cdFx0dGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5jb3B5KCBzb3VyY2UucHJvamVjdGlvbk1hdHJpeEludmVyc2UgKTtcclxuXHJcblx0XHR0aGlzLmNvb3JkaW5hdGVTeXN0ZW0gPSBzb3VyY2UuY29vcmRpbmF0ZVN5c3RlbTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgdmVjdG9yIHJlcHJlc2VudGluZyB0aGUgKFwibG9va1wiKSBkaXJlY3Rpb24gb2YgdGhlIDNEIG9iamVjdCBpbiB3b3JsZCBzcGFjZS5cclxuXHQgKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGlzIG92ZXJ3cml0dGVuIHNpbmNlIGNhbWVyYXMgaGF2ZSBhIGRpZmZlcmVudCBmb3J3YXJkIHZlY3RvciBjb21wYXJlZCB0byBvdGhlclxyXG5cdCAqIDNEIG9iamVjdHMuIEEgY2FtZXJhIGxvb2tzIGRvd24gaXRzIGxvY2FsLCBuZWdhdGl2ZSB6LWF4aXMgYnkgZGVmYXVsdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdGFyZ2V0IC0gVGhlIHRhcmdldCB2ZWN0b3IgdGhlIHJlc3VsdCBpcyBzdG9yZWQgdG8uXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gVGhlIDNEIG9iamVjdCdzIGRpcmVjdGlvbiBpbiB3b3JsZCBzcGFjZS5cclxuXHQgKi9cclxuXHRnZXRXb3JsZERpcmVjdGlvbiggdGFyZ2V0ICkge1xyXG5cclxuXHRcdHJldHVybiBzdXBlci5nZXRXb3JsZERpcmVjdGlvbiggdGFyZ2V0ICkubmVnYXRlKCk7XHJcblxyXG5cdH1cclxuXHJcblx0dXBkYXRlTWF0cml4V29ybGQoIGZvcmNlICkge1xyXG5cclxuXHRcdHN1cGVyLnVwZGF0ZU1hdHJpeFdvcmxkKCBmb3JjZSApO1xyXG5cclxuXHRcdHRoaXMubWF0cml4V29ybGRJbnZlcnNlLmNvcHkoIHRoaXMubWF0cml4V29ybGQgKS5pbnZlcnQoKTtcclxuXHJcblx0fVxyXG5cclxuXHR1cGRhdGVXb3JsZE1hdHJpeCggdXBkYXRlUGFyZW50cywgdXBkYXRlQ2hpbGRyZW4gKSB7XHJcblxyXG5cdFx0c3VwZXIudXBkYXRlV29ybGRNYXRyaXgoIHVwZGF0ZVBhcmVudHMsIHVwZGF0ZUNoaWxkcmVuICk7XHJcblxyXG5cdFx0dGhpcy5tYXRyaXhXb3JsZEludmVyc2UuY29weSggdGhpcy5tYXRyaXhXb3JsZCApLmludmVydCgpO1xyXG5cclxuXHR9XHJcblxyXG5cdGNsb25lKCkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgQ2FtZXJhIH07XHJcbiIsImltcG9ydCB7IENhbWVyYSB9IGZyb20gJy4vQ2FtZXJhLmpzJztcclxuaW1wb3J0IHsgUkFEMkRFRywgREVHMlJBRCB9IGZyb20gJy4uL21hdGgvTWF0aFV0aWxzLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uL21hdGgvVmVjdG9yMi5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5cclxuY29uc3QgX3YzID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfbWluVGFyZ2V0ID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMigpO1xyXG5jb25zdCBfbWF4VGFyZ2V0ID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMigpO1xyXG5cclxuLyoqXHJcbiAqIENhbWVyYSB0aGF0IHVzZXMgW3BlcnNwZWN0aXZlIHByb2plY3Rpb25de0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1BlcnNwZWN0aXZlXyhncmFwaGljYWwpfS5cclxuICpcclxuICogVGhpcyBwcm9qZWN0aW9uIG1vZGUgaXMgZGVzaWduZWQgdG8gbWltaWMgdGhlIHdheSB0aGUgaHVtYW4gZXllIHNlZXMuIEl0XHJcbiAqIGlzIHRoZSBtb3N0IGNvbW1vbiBwcm9qZWN0aW9uIG1vZGUgdXNlZCBmb3IgcmVuZGVyaW5nIGEgM0Qgc2NlbmUuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGNhbWVyYSA9IG5ldyBUSFJFRS5QZXJzcGVjdGl2ZUNhbWVyYSggNDUsIHdpZHRoIC8gaGVpZ2h0LCAxLCAxMDAwICk7XHJcbiAqIHNjZW5lLmFkZCggY2FtZXJhICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQ2FtZXJhXHJcbiAqL1xyXG5jbGFzcyBQZXJzcGVjdGl2ZUNhbWVyYSBleHRlbmRzIENhbWVyYSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcGVyc3BlY3RpdmUgY2FtZXJhLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtmb3Y9NTBdIC0gVGhlIHZlcnRpY2FsIGZpZWxkIG9mIHZpZXcuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFthc3BlY3Q9MV0gLSBUaGUgYXNwZWN0IHJhdGlvLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbmVhcj0wLjFdIC0gVGhlIGNhbWVyYSdzIG5lYXIgcGxhbmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtmYXI9MjAwMF0gLSBUaGUgY2FtZXJhJ3MgZmFyIHBsYW5lLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBmb3YgPSA1MCwgYXNwZWN0ID0gMSwgbmVhciA9IDAuMSwgZmFyID0gMjAwMCApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1BlcnNwZWN0aXZlQ2FtZXJhID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnUGVyc3BlY3RpdmVDYW1lcmEnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHZlcnRpY2FsIGZpZWxkIG9mIHZpZXcsIGZyb20gYm90dG9tIHRvIHRvcCBvZiB2aWV3LFxyXG5cdFx0ICogaW4gZGVncmVlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgNTBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5mb3YgPSBmb3Y7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgem9vbSBmYWN0b3Igb2YgdGhlIGNhbWVyYS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnpvb20gPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNhbWVyYSdzIG5lYXIgcGxhbmUuIFRoZSB2YWxpZCByYW5nZSBpcyBncmVhdGVyIHRoYW4gYDBgXHJcblx0XHQgKiBhbmQgbGVzcyB0aGFuIHRoZSBjdXJyZW50IHZhbHVlIG9mIHtAbGluayBQZXJzcGVjdGl2ZUNhbWVyYSNmYXJ9LlxyXG5cdFx0ICpcclxuXHRcdCAqIE5vdGUgdGhhdCwgdW5saWtlIGZvciB0aGUge0BsaW5rIE9ydGhvZ3JhcGhpY0NhbWVyYX0sIGAwYCBpcyA8ZW0+bm90PC9lbT4gYVxyXG5cdFx0ICogdmFsaWQgdmFsdWUgZm9yIGEgcGVyc3BlY3RpdmUgY2FtZXJhJ3MgbmVhciBwbGFuZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMC4xXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubmVhciA9IG5lYXI7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY2FtZXJhJ3MgZmFyIHBsYW5lLiBNdXN0IGJlIGdyZWF0ZXIgdGhhbiB0aGVcclxuXHRcdCAqIGN1cnJlbnQgdmFsdWUgb2Yge0BsaW5rIFBlcnNwZWN0aXZlQ2FtZXJhI25lYXJ9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAyMDAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZmFyID0gZmFyO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogT2JqZWN0IGRpc3RhbmNlIHVzZWQgZm9yIHN0ZXJlb3Njb3B5IGFuZCBkZXB0aC1vZi1maWVsZCBlZmZlY3RzLiBUaGlzXHJcblx0XHQgKiBwYXJhbWV0ZXIgZG9lcyBub3QgaW5mbHVlbmNlIHRoZSBwcm9qZWN0aW9uIG1hdHJpeCB1bmxlc3MgYVxyXG5cdFx0ICoge0BsaW5rIFN0ZXJlb0NhbWVyYX0gaXMgYmVpbmcgdXNlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMTBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5mb2N1cyA9IDEwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGFzcGVjdCByYXRpbywgdXN1YWxseSB0aGUgY2FudmFzIHdpZHRoIC8gY2FudmFzIGhlaWdodC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFzcGVjdCA9IGFzcGVjdDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlcHJlc2VudHMgdGhlIGZydXN0dW0gd2luZG93IHNwZWNpZmljYXRpb24uIFRoaXMgcHJvcGVydHkgc2hvdWxkIG5vdCBiZSBlZGl0ZWRcclxuXHRcdCAqIGRpcmVjdGx5IGJ1dCB2aWEge0BsaW5rIFBlcnNwZWN0aXZlQ2FtZXJhI3NldFZpZXdPZmZzZXR9IGFuZCB7QGxpbmsgUGVyc3BlY3RpdmVDYW1lcmEjY2xlYXJWaWV3T2Zmc2V0fS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P09iamVjdH1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52aWV3ID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEZpbG0gc2l6ZSB1c2VkIGZvciB0aGUgbGFyZ2VyIGF4aXMuIERlZmF1bHQgaXMgYDM1YCAobWlsbGltZXRlcnMpLiBUaGlzXHJcblx0XHQgKiBwYXJhbWV0ZXIgZG9lcyBub3QgaW5mbHVlbmNlIHRoZSBwcm9qZWN0aW9uIG1hdHJpeCB1bmxlc3Mge0BsaW5rIFBlcnNwZWN0aXZlQ2FtZXJhI2ZpbG1PZmZzZXR9XHJcblx0XHQgKiBpcyBzZXQgdG8gYSBub256ZXJvIHZhbHVlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAzNVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZpbG1HYXVnZSA9IDM1O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG9yaXpvbnRhbCBvZmYtY2VudGVyIG9mZnNldCBpbiB0aGUgc2FtZSB1bml0IGFzIHtAbGluayBQZXJzcGVjdGl2ZUNhbWVyYSNmaWxtR2F1Z2V9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZmlsbU9mZnNldCA9IDA7XHJcblxyXG5cdFx0dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlLCByZWN1cnNpdmUgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlLCByZWN1cnNpdmUgKTtcclxuXHJcblx0XHR0aGlzLmZvdiA9IHNvdXJjZS5mb3Y7XHJcblx0XHR0aGlzLnpvb20gPSBzb3VyY2Uuem9vbTtcclxuXHJcblx0XHR0aGlzLm5lYXIgPSBzb3VyY2UubmVhcjtcclxuXHRcdHRoaXMuZmFyID0gc291cmNlLmZhcjtcclxuXHRcdHRoaXMuZm9jdXMgPSBzb3VyY2UuZm9jdXM7XHJcblxyXG5cdFx0dGhpcy5hc3BlY3QgPSBzb3VyY2UuYXNwZWN0O1xyXG5cdFx0dGhpcy52aWV3ID0gc291cmNlLnZpZXcgPT09IG51bGwgPyBudWxsIDogT2JqZWN0LmFzc2lnbigge30sIHNvdXJjZS52aWV3ICk7XHJcblxyXG5cdFx0dGhpcy5maWxtR2F1Z2UgPSBzb3VyY2UuZmlsbUdhdWdlO1xyXG5cdFx0dGhpcy5maWxtT2Zmc2V0ID0gc291cmNlLmZpbG1PZmZzZXQ7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgRk9WIGJ5IGZvY2FsIGxlbmd0aCBpbiByZXNwZWN0IHRvIHRoZSBjdXJyZW50IHtAbGluayBQZXJzcGVjdGl2ZUNhbWVyYSNmaWxtR2F1Z2V9LlxyXG5cdCAqXHJcblx0ICogVGhlIGRlZmF1bHQgZmlsbSBnYXVnZSBpcyAzNSwgc28gdGhhdCB0aGUgZm9jYWwgbGVuZ3RoIGNhbiBiZSBzcGVjaWZpZWQgZm9yXHJcblx0ICogYSAzNW1tIChmdWxsIGZyYW1lKSBjYW1lcmEuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZm9jYWxMZW5ndGggLSBWYWx1ZXMgZm9yIGZvY2FsIGxlbmd0aCBhbmQgZmlsbSBnYXVnZSBtdXN0IGhhdmUgdGhlIHNhbWUgdW5pdC5cclxuXHQgKi9cclxuXHRzZXRGb2NhbExlbmd0aCggZm9jYWxMZW5ndGggKSB7XHJcblxyXG5cdFx0LyoqIHNlZSB7QGxpbmsgaHR0cDovL3d3dy5ib2JhdGtpbnMuY29tL3Bob3RvZ3JhcGh5L3RlY2huaWNhbC9maWVsZF9vZl92aWV3Lmh0bWx9ICovXHJcblx0XHRjb25zdCB2RXh0ZW50U2xvcGUgPSAwLjUgKiB0aGlzLmdldEZpbG1IZWlnaHQoKSAvIGZvY2FsTGVuZ3RoO1xyXG5cclxuXHRcdHRoaXMuZm92ID0gUkFEMkRFRyAqIDIgKiBNYXRoLmF0YW4oIHZFeHRlbnRTbG9wZSApO1xyXG5cdFx0dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgZm9jYWwgbGVuZ3RoIGZyb20gdGhlIGN1cnJlbnQge0BsaW5rIFBlcnNwZWN0aXZlQ2FtZXJhI2Zvdn0gYW5kXHJcblx0ICoge0BsaW5rIFBlcnNwZWN0aXZlQ2FtZXJhI2ZpbG1HYXVnZX0uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBjb21wdXRlZCBmb2NhbCBsZW5ndGguXHJcblx0ICovXHJcblx0Z2V0Rm9jYWxMZW5ndGgoKSB7XHJcblxyXG5cdFx0Y29uc3QgdkV4dGVudFNsb3BlID0gTWF0aC50YW4oIERFRzJSQUQgKiAwLjUgKiB0aGlzLmZvdiApO1xyXG5cclxuXHRcdHJldHVybiAwLjUgKiB0aGlzLmdldEZpbG1IZWlnaHQoKSAvIHZFeHRlbnRTbG9wZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHZlcnRpY2FsIGZpZWxkIG9mIHZpZXcgYW5nbGUgaW4gZGVncmVlcyBjb25zaWRlcmluZyB7QGxpbmsgUGVyc3BlY3RpdmVDYW1lcmEjem9vbX0uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBlZmZlY3RpdmUgRk9WLlxyXG5cdCAqL1xyXG5cdGdldEVmZmVjdGl2ZUZPVigpIHtcclxuXHJcblx0XHRyZXR1cm4gUkFEMkRFRyAqIDIgKiBNYXRoLmF0YW4oXHJcblx0XHRcdE1hdGgudGFuKCBERUcyUkFEICogMC41ICogdGhpcy5mb3YgKSAvIHRoaXMuem9vbSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZSBvbiB0aGUgZmlsbS4gSWYge0BsaW5rIFBlcnNwZWN0aXZlQ2FtZXJhI2FzcGVjdH0gaXMgZ3JlYXRlciB0aGFuIG9yXHJcblx0ICogZXF1YWwgdG8gb25lIChsYW5kc2NhcGUgZm9ybWF0KSwgdGhlIHJlc3VsdCBlcXVhbHMge0BsaW5rIFBlcnNwZWN0aXZlQ2FtZXJhI2ZpbG1HYXVnZX0uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBmaWxtIHdpZHRoLlxyXG5cdCAqL1xyXG5cdGdldEZpbG1XaWR0aCgpIHtcclxuXHJcblx0XHQvLyBmaWxtIG5vdCBjb21wbGV0ZWx5IGNvdmVyZWQgaW4gcG9ydHJhaXQgZm9ybWF0IChhc3BlY3QgPCAxKVxyXG5cdFx0cmV0dXJuIHRoaXMuZmlsbUdhdWdlICogTWF0aC5taW4oIHRoaXMuYXNwZWN0LCAxICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgaGVpZ2h0IG9mIHRoZSBpbWFnZSBvbiB0aGUgZmlsbS4gSWYge0BsaW5rIFBlcnNwZWN0aXZlQ2FtZXJhI2FzcGVjdH0gaXMgZ3JlYXRlciB0aGFuIG9yXHJcblx0ICogZXF1YWwgdG8gb25lIChsYW5kc2NhcGUgZm9ybWF0KSwgdGhlIHJlc3VsdCBlcXVhbHMge0BsaW5rIFBlcnNwZWN0aXZlQ2FtZXJhI2ZpbG1HYXVnZX0uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBmaWxtIHdpZHRoLlxyXG5cdCAqL1xyXG5cdGdldEZpbG1IZWlnaHQoKSB7XHJcblxyXG5cdFx0Ly8gZmlsbSBub3QgY29tcGxldGVseSBjb3ZlcmVkIGluIGxhbmRzY2FwZSBmb3JtYXQgKGFzcGVjdCA+IDEpXHJcblx0XHRyZXR1cm4gdGhpcy5maWxtR2F1Z2UgLyBNYXRoLm1heCggdGhpcy5hc3BlY3QsIDEgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB0aGUgMkQgYm91bmRzIG9mIHRoZSBjYW1lcmEncyB2aWV3YWJsZSByZWN0YW5nbGUgYXQgYSBnaXZlbiBkaXN0YW5jZSBhbG9uZyB0aGUgdmlld2luZyBkaXJlY3Rpb24uXHJcblx0ICogU2V0cyBgbWluVGFyZ2V0YCBhbmQgYG1heFRhcmdldGAgdG8gdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBsb3dlci1sZWZ0IGFuZCB1cHBlci1yaWdodCBjb3JuZXJzIG9mIHRoZSB2aWV3IHJlY3RhbmdsZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBkaXN0YW5jZSAtIFRoZSB2aWV3aW5nIGRpc3RhbmNlLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gbWluVGFyZ2V0IC0gVGhlIGxvd2VyLWxlZnQgY29ybmVyIG9mIHRoZSB2aWV3IHJlY3RhbmdsZSBpcyB3cml0dGVuIGludG8gdGhpcyB2ZWN0b3IuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSBtYXhUYXJnZXQgLSBUaGUgdXBwZXItcmlnaHQgY29ybmVyIG9mIHRoZSB2aWV3IHJlY3RhbmdsZSBpcyB3cml0dGVuIGludG8gdGhpcyB2ZWN0b3IuXHJcblx0ICovXHJcblx0Z2V0Vmlld0JvdW5kcyggZGlzdGFuY2UsIG1pblRhcmdldCwgbWF4VGFyZ2V0ICkge1xyXG5cclxuXHRcdF92My5zZXQoIC0gMSwgLSAxLCAwLjUgKS5hcHBseU1hdHJpeDQoIHRoaXMucHJvamVjdGlvbk1hdHJpeEludmVyc2UgKTtcclxuXHJcblx0XHRtaW5UYXJnZXQuc2V0KCBfdjMueCwgX3YzLnkgKS5tdWx0aXBseVNjYWxhciggLSBkaXN0YW5jZSAvIF92My56ICk7XHJcblxyXG5cdFx0X3YzLnNldCggMSwgMSwgMC41ICkuYXBwbHlNYXRyaXg0KCB0aGlzLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlICk7XHJcblxyXG5cdFx0bWF4VGFyZ2V0LnNldCggX3YzLngsIF92My55ICkubXVsdGlwbHlTY2FsYXIoIC0gZGlzdGFuY2UgLyBfdjMueiApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBjYW1lcmEncyB2aWV3YWJsZSByZWN0YW5nbGUgYXQgYSBnaXZlbiBkaXN0YW5jZSBhbG9uZyB0aGUgdmlld2luZyBkaXJlY3Rpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZGlzdGFuY2UgLSBUaGUgdmlld2luZyBkaXN0YW5jZS5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IHRhcmdldCAtIFRoZSB0YXJnZXQgdmVjdG9yIHRoYXQgaXMgdXNlZCB0byBzdG9yZSByZXN1bHQgd2hlcmUgeCBpcyB3aWR0aCBhbmQgeSBpcyBoZWlnaHQuXHJcblx0ICogQHJldHVybnMge1ZlY3RvcjJ9IFRoZSB2aWV3IHNpemUuXHJcblx0ICovXHJcblx0Z2V0Vmlld1NpemUoIGRpc3RhbmNlLCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0dGhpcy5nZXRWaWV3Qm91bmRzKCBkaXN0YW5jZSwgX21pblRhcmdldCwgX21heFRhcmdldCApO1xyXG5cclxuXHRcdHJldHVybiB0YXJnZXQuc3ViVmVjdG9ycyggX21heFRhcmdldCwgX21pblRhcmdldCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgYW4gb2Zmc2V0IGluIGEgbGFyZ2VyIGZydXN0dW0uIFRoaXMgaXMgdXNlZnVsIGZvciBtdWx0aS13aW5kb3cgb3JcclxuXHQgKiBtdWx0aS1tb25pdG9yL211bHRpLW1hY2hpbmUgc2V0dXBzLlxyXG5cdCAqXHJcblx0ICogRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIDN4MiBtb25pdG9ycyBhbmQgZWFjaCBtb25pdG9yIGlzIDE5MjB4MTA4MCBhbmRcclxuXHQgKiB0aGUgbW9uaXRvcnMgYXJlIGluIGdyaWQgbGlrZSB0aGlzXHJcblx0ICpgYGBcclxuXHQgKiAgICstLS0rLS0tKy0tLStcclxuXHQgKiAgIHwgQSB8IEIgfCBDIHxcclxuXHQgKiAgICstLS0rLS0tKy0tLStcclxuXHQgKiAgIHwgRCB8IEUgfCBGIHxcclxuXHQgKiAgICstLS0rLS0tKy0tLStcclxuXHQgKmBgYFxyXG5cdCAqIHRoZW4gZm9yIGVhY2ggbW9uaXRvciB5b3Ugd291bGQgY2FsbCBpdCBsaWtlIHRoaXM6XHJcblx0ICpgYGBqc1xyXG5cdCAqIGNvbnN0IHcgPSAxOTIwO1xyXG5cdCAqIGNvbnN0IGggPSAxMDgwO1xyXG5cdCAqIGNvbnN0IGZ1bGxXaWR0aCA9IHcgKiAzO1xyXG5cdCAqIGNvbnN0IGZ1bGxIZWlnaHQgPSBoICogMjtcclxuXHQgKlxyXG5cdCAqIC8vIC0tQS0tXHJcblx0ICogY2FtZXJhLnNldFZpZXdPZmZzZXQoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgdyAqIDAsIGggKiAwLCB3LCBoICk7XHJcblx0ICogLy8gLS1CLS1cclxuXHQgKiBjYW1lcmEuc2V0Vmlld09mZnNldCggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB3ICogMSwgaCAqIDAsIHcsIGggKTtcclxuXHQgKiAvLyAtLUMtLVxyXG5cdCAqIGNhbWVyYS5zZXRWaWV3T2Zmc2V0KCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHcgKiAyLCBoICogMCwgdywgaCApO1xyXG5cdCAqIC8vIC0tRC0tXHJcblx0ICogY2FtZXJhLnNldFZpZXdPZmZzZXQoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgdyAqIDAsIGggKiAxLCB3LCBoICk7XHJcblx0ICogLy8gLS1FLS1cclxuXHQgKiBjYW1lcmEuc2V0Vmlld09mZnNldCggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB3ICogMSwgaCAqIDEsIHcsIGggKTtcclxuXHQgKiAvLyAtLUYtLVxyXG5cdCAqIGNhbWVyYS5zZXRWaWV3T2Zmc2V0KCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHcgKiAyLCBoICogMSwgdywgaCApO1xyXG5cdCAqIGBgYFxyXG5cdCAqXHJcblx0ICogTm90ZSB0aGVyZSBpcyBubyByZWFzb24gbW9uaXRvcnMgaGF2ZSB0byBiZSB0aGUgc2FtZSBzaXplIG9yIGluIGEgZ3JpZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBmdWxsV2lkdGggLSBUaGUgZnVsbCB3aWR0aCBvZiBtdWx0aXZpZXcgc2V0dXAuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGZ1bGxIZWlnaHQgLSBUaGUgZnVsbCBoZWlnaHQgb2YgbXVsdGl2aWV3IHNldHVwLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGhvcml6b250YWwgb2Zmc2V0IG9mIHRoZSBzdWJjYW1lcmEuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmVydGljYWwgb2Zmc2V0IG9mIHRoZSBzdWJjYW1lcmEuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHN1YmNhbWVyYS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiBzdWJjYW1lcmEuXHJcblx0ICovXHJcblx0c2V0Vmlld09mZnNldCggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICkge1xyXG5cclxuXHRcdHRoaXMuYXNwZWN0ID0gZnVsbFdpZHRoIC8gZnVsbEhlaWdodDtcclxuXHJcblx0XHRpZiAoIHRoaXMudmlldyA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMudmlldyA9IHtcclxuXHRcdFx0XHRlbmFibGVkOiB0cnVlLFxyXG5cdFx0XHRcdGZ1bGxXaWR0aDogMSxcclxuXHRcdFx0XHRmdWxsSGVpZ2h0OiAxLFxyXG5cdFx0XHRcdG9mZnNldFg6IDAsXHJcblx0XHRcdFx0b2Zmc2V0WTogMCxcclxuXHRcdFx0XHR3aWR0aDogMSxcclxuXHRcdFx0XHRoZWlnaHQ6IDFcclxuXHRcdFx0fTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy52aWV3LmVuYWJsZWQgPSB0cnVlO1xyXG5cdFx0dGhpcy52aWV3LmZ1bGxXaWR0aCA9IGZ1bGxXaWR0aDtcclxuXHRcdHRoaXMudmlldy5mdWxsSGVpZ2h0ID0gZnVsbEhlaWdodDtcclxuXHRcdHRoaXMudmlldy5vZmZzZXRYID0geDtcclxuXHRcdHRoaXMudmlldy5vZmZzZXRZID0geTtcclxuXHRcdHRoaXMudmlldy53aWR0aCA9IHdpZHRoO1xyXG5cdFx0dGhpcy52aWV3LmhlaWdodCA9IGhlaWdodDtcclxuXHJcblx0XHR0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW1vdmVzIHRoZSB2aWV3IG9mZnNldCBmcm9tIHRoZSBwcm9qZWN0aW9uIG1hdHJpeC5cclxuXHQgKi9cclxuXHRjbGVhclZpZXdPZmZzZXQoKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLnZpZXcgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnZpZXcuZW5hYmxlZCA9IGZhbHNlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoZSBjYW1lcmEncyBwcm9qZWN0aW9uIG1hdHJpeC4gTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgYW55IGNoYW5nZSBvZlxyXG5cdCAqIGNhbWVyYSBwcm9wZXJ0aWVzLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKSB7XHJcblxyXG5cdFx0Y29uc3QgbmVhciA9IHRoaXMubmVhcjtcclxuXHRcdGxldCB0b3AgPSBuZWFyICogTWF0aC50YW4oIERFRzJSQUQgKiAwLjUgKiB0aGlzLmZvdiApIC8gdGhpcy56b29tO1xyXG5cdFx0bGV0IGhlaWdodCA9IDIgKiB0b3A7XHJcblx0XHRsZXQgd2lkdGggPSB0aGlzLmFzcGVjdCAqIGhlaWdodDtcclxuXHRcdGxldCBsZWZ0ID0gLSAwLjUgKiB3aWR0aDtcclxuXHRcdGNvbnN0IHZpZXcgPSB0aGlzLnZpZXc7XHJcblxyXG5cdFx0aWYgKCB0aGlzLnZpZXcgIT09IG51bGwgJiYgdGhpcy52aWV3LmVuYWJsZWQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBmdWxsV2lkdGggPSB2aWV3LmZ1bGxXaWR0aCxcclxuXHRcdFx0XHRmdWxsSGVpZ2h0ID0gdmlldy5mdWxsSGVpZ2h0O1xyXG5cclxuXHRcdFx0bGVmdCArPSB2aWV3Lm9mZnNldFggKiB3aWR0aCAvIGZ1bGxXaWR0aDtcclxuXHRcdFx0dG9wIC09IHZpZXcub2Zmc2V0WSAqIGhlaWdodCAvIGZ1bGxIZWlnaHQ7XHJcblx0XHRcdHdpZHRoICo9IHZpZXcud2lkdGggLyBmdWxsV2lkdGg7XHJcblx0XHRcdGhlaWdodCAqPSB2aWV3LmhlaWdodCAvIGZ1bGxIZWlnaHQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHNrZXcgPSB0aGlzLmZpbG1PZmZzZXQ7XHJcblx0XHRpZiAoIHNrZXcgIT09IDAgKSBsZWZ0ICs9IG5lYXIgKiBza2V3IC8gdGhpcy5nZXRGaWxtV2lkdGgoKTtcclxuXHJcblx0XHR0aGlzLnByb2plY3Rpb25NYXRyaXgubWFrZVBlcnNwZWN0aXZlKCBsZWZ0LCBsZWZ0ICsgd2lkdGgsIHRvcCwgdG9wIC0gaGVpZ2h0LCBuZWFyLCB0aGlzLmZhciwgdGhpcy5jb29yZGluYXRlU3lzdGVtICk7XHJcblxyXG5cdFx0dGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5jb3B5KCB0aGlzLnByb2plY3Rpb25NYXRyaXggKS5pbnZlcnQoKTtcclxuXHJcblx0fVxyXG5cclxuXHR0b0pTT04oIG1ldGEgKSB7XHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IHN1cGVyLnRvSlNPTiggbWV0YSApO1xyXG5cclxuXHRcdGRhdGEub2JqZWN0LmZvdiA9IHRoaXMuZm92O1xyXG5cdFx0ZGF0YS5vYmplY3Quem9vbSA9IHRoaXMuem9vbTtcclxuXHJcblx0XHRkYXRhLm9iamVjdC5uZWFyID0gdGhpcy5uZWFyO1xyXG5cdFx0ZGF0YS5vYmplY3QuZmFyID0gdGhpcy5mYXI7XHJcblx0XHRkYXRhLm9iamVjdC5mb2N1cyA9IHRoaXMuZm9jdXM7XHJcblxyXG5cdFx0ZGF0YS5vYmplY3QuYXNwZWN0ID0gdGhpcy5hc3BlY3Q7XHJcblxyXG5cdFx0aWYgKCB0aGlzLnZpZXcgIT09IG51bGwgKSBkYXRhLm9iamVjdC52aWV3ID0gT2JqZWN0LmFzc2lnbigge30sIHRoaXMudmlldyApO1xyXG5cclxuXHRcdGRhdGEub2JqZWN0LmZpbG1HYXVnZSA9IHRoaXMuZmlsbUdhdWdlO1xyXG5cdFx0ZGF0YS5vYmplY3QuZmlsbU9mZnNldCA9IHRoaXMuZmlsbU9mZnNldDtcclxuXHJcblx0XHRyZXR1cm4gZGF0YTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgUGVyc3BlY3RpdmVDYW1lcmEgfTtcclxuIiwiaW1wb3J0IHsgV2ViR0xDb29yZGluYXRlU3lzdGVtLCBXZWJHUFVDb29yZGluYXRlU3lzdGVtIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgT2JqZWN0M0QgfSBmcm9tICcuLi9jb3JlL09iamVjdDNELmpzJztcclxuaW1wb3J0IHsgUGVyc3BlY3RpdmVDYW1lcmEgfSBmcm9tICcuL1BlcnNwZWN0aXZlQ2FtZXJhLmpzJztcclxuXHJcbmNvbnN0IGZvdiA9IC0gOTA7IC8vIG5lZ2F0aXZlIGZvdiBpcyBub3QgYW4gZXJyb3JcclxuY29uc3QgYXNwZWN0ID0gMTtcclxuXHJcbi8qKlxyXG4gKiBBIHNwZWNpYWwgdHlwZSBvZiBjYW1lcmEgdGhhdCBpcyBwb3NpdGlvbmVkIGluIDNEIHNwYWNlIHRvIHJlbmRlciBpdHMgc3Vycm91bmRpbmdzIGludG8gYVxyXG4gKiBjdWJlIHJlbmRlciB0YXJnZXQuIFRoZSByZW5kZXIgdGFyZ2V0IGNhbiB0aGVuIGJlIHVzZWQgYXMgYW4gZW52aXJvbm1lbnQgbWFwIGZvciByZW5kZXJpbmdcclxuICogcmVhbHRpbWUgcmVmbGVjdGlvbnMgaW4geW91ciBzY2VuZS5cclxuICpcclxuICogYGBganNcclxuICogLy8gQ3JlYXRlIGN1YmUgcmVuZGVyIHRhcmdldFxyXG4gKiBjb25zdCBjdWJlUmVuZGVyVGFyZ2V0ID0gbmV3IFRIUkVFLldlYkdMQ3ViZVJlbmRlclRhcmdldCggMjU2LCB7IGdlbmVyYXRlTWlwbWFwczogdHJ1ZSwgbWluRmlsdGVyOiBUSFJFRS5MaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXIgfSApO1xyXG4gKlxyXG4gKiAvLyBDcmVhdGUgY3ViZSBjYW1lcmFcclxuICogY29uc3QgY3ViZUNhbWVyYSA9IG5ldyBUSFJFRS5DdWJlQ2FtZXJhKCAxLCAxMDAwMDAsIGN1YmVSZW5kZXJUYXJnZXQgKTtcclxuICogc2NlbmUuYWRkKCBjdWJlQ2FtZXJhICk7XHJcbiAqXHJcbiAqIC8vIENyZWF0ZSBjYXJcclxuICogY29uc3QgY2hyb21lTWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaExhbWJlcnRNYXRlcmlhbCggeyBjb2xvcjogMHhmZmZmZmYsIGVudk1hcDogY3ViZVJlbmRlclRhcmdldC50ZXh0dXJlIH0gKTtcclxuICogY29uc3QgY2FyID0gbmV3IFRIUkVFLk1lc2goIGNhckdlb21ldHJ5LCBjaHJvbWVNYXRlcmlhbCApO1xyXG4gKiBzY2VuZS5hZGQoIGNhciApO1xyXG4gKlxyXG4gKiAvLyBVcGRhdGUgdGhlIHJlbmRlciB0YXJnZXQgY3ViZVxyXG4gKiBjYXIudmlzaWJsZSA9IGZhbHNlO1xyXG4gKiBjdWJlQ2FtZXJhLnBvc2l0aW9uLmNvcHkoIGNhci5wb3NpdGlvbiApO1xyXG4gKiBjdWJlQ2FtZXJhLnVwZGF0ZSggcmVuZGVyZXIsIHNjZW5lICk7XHJcbiAqXHJcbiAqIC8vIFJlbmRlciB0aGUgc2NlbmVcclxuICogY2FyLnZpc2libGUgPSB0cnVlO1xyXG4gKiByZW5kZXJlci5yZW5kZXIoIHNjZW5lLCBjYW1lcmEgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBPYmplY3QzRFxyXG4gKi9cclxuY2xhc3MgQ3ViZUNhbWVyYSBleHRlbmRzIE9iamVjdDNEIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBjdWJlIGNhbWVyYS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBuZWFyIC0gVGhlIGNhbWVyYSdzIG5lYXIgcGxhbmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGZhciAtIFRoZSBjYW1lcmEncyBmYXIgcGxhbmUuXHJcblx0ICogQHBhcmFtIHtXZWJHTEN1YmVSZW5kZXJUYXJnZXR9IHJlbmRlclRhcmdldCAtIFRoZSBjdWJlIHJlbmRlciB0YXJnZXQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5lYXIsIGZhciwgcmVuZGVyVGFyZ2V0ICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ0N1YmVDYW1lcmEnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIGN1YmUgcmVuZGVyIHRhcmdldC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2ViR0xDdWJlUmVuZGVyVGFyZ2V0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJlbmRlclRhcmdldCA9IHJlbmRlclRhcmdldDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjdXJyZW50IGFjdGl2ZSBjb29yZGluYXRlIHN5c3RlbS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7PyhXZWJHTENvb3JkaW5hdGVTeXN0ZW18V2ViR1BVQ29vcmRpbmF0ZVN5c3RlbSl9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29vcmRpbmF0ZVN5c3RlbSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY3VycmVudCBhY3RpdmUgbWlwbWFwIGxldmVsXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hY3RpdmVNaXBtYXBMZXZlbCA9IDA7XHJcblxyXG5cdFx0Y29uc3QgY2FtZXJhUFggPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIgKTtcclxuXHRcdGNhbWVyYVBYLmxheWVycyA9IHRoaXMubGF5ZXJzO1xyXG5cdFx0dGhpcy5hZGQoIGNhbWVyYVBYICk7XHJcblxyXG5cdFx0Y29uc3QgY2FtZXJhTlggPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIgKTtcclxuXHRcdGNhbWVyYU5YLmxheWVycyA9IHRoaXMubGF5ZXJzO1xyXG5cdFx0dGhpcy5hZGQoIGNhbWVyYU5YICk7XHJcblxyXG5cdFx0Y29uc3QgY2FtZXJhUFkgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIgKTtcclxuXHRcdGNhbWVyYVBZLmxheWVycyA9IHRoaXMubGF5ZXJzO1xyXG5cdFx0dGhpcy5hZGQoIGNhbWVyYVBZICk7XHJcblxyXG5cdFx0Y29uc3QgY2FtZXJhTlkgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIgKTtcclxuXHRcdGNhbWVyYU5ZLmxheWVycyA9IHRoaXMubGF5ZXJzO1xyXG5cdFx0dGhpcy5hZGQoIGNhbWVyYU5ZICk7XHJcblxyXG5cdFx0Y29uc3QgY2FtZXJhUFogPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIgKTtcclxuXHRcdGNhbWVyYVBaLmxheWVycyA9IHRoaXMubGF5ZXJzO1xyXG5cdFx0dGhpcy5hZGQoIGNhbWVyYVBaICk7XHJcblxyXG5cdFx0Y29uc3QgY2FtZXJhTlogPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIgKTtcclxuXHRcdGNhbWVyYU5aLmxheWVycyA9IHRoaXMubGF5ZXJzO1xyXG5cdFx0dGhpcy5hZGQoIGNhbWVyYU5aICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTXVzdCBiZSBjYWxsZWQgd2hlbiB0aGUgY29vcmRpbmF0ZSBzeXN0ZW0gb2YgdGhlIGN1YmUgY2FtZXJhIGlzIGNoYW5nZWQuXHJcblx0ICovXHJcblx0dXBkYXRlQ29vcmRpbmF0ZVN5c3RlbSgpIHtcclxuXHJcblx0XHRjb25zdCBjb29yZGluYXRlU3lzdGVtID0gdGhpcy5jb29yZGluYXRlU3lzdGVtO1xyXG5cclxuXHRcdGNvbnN0IGNhbWVyYXMgPSB0aGlzLmNoaWxkcmVuLmNvbmNhdCgpO1xyXG5cclxuXHRcdGNvbnN0IFsgY2FtZXJhUFgsIGNhbWVyYU5YLCBjYW1lcmFQWSwgY2FtZXJhTlksIGNhbWVyYVBaLCBjYW1lcmFOWiBdID0gY2FtZXJhcztcclxuXHJcblx0XHRmb3IgKCBjb25zdCBjYW1lcmEgb2YgY2FtZXJhcyApIHRoaXMucmVtb3ZlKCBjYW1lcmEgKTtcclxuXHJcblx0XHRpZiAoIGNvb3JkaW5hdGVTeXN0ZW0gPT09IFdlYkdMQ29vcmRpbmF0ZVN5c3RlbSApIHtcclxuXHJcblx0XHRcdGNhbWVyYVBYLnVwLnNldCggMCwgMSwgMCApO1xyXG5cdFx0XHRjYW1lcmFQWC5sb29rQXQoIDEsIDAsIDAgKTtcclxuXHJcblx0XHRcdGNhbWVyYU5YLnVwLnNldCggMCwgMSwgMCApO1xyXG5cdFx0XHRjYW1lcmFOWC5sb29rQXQoIC0gMSwgMCwgMCApO1xyXG5cclxuXHRcdFx0Y2FtZXJhUFkudXAuc2V0KCAwLCAwLCAtIDEgKTtcclxuXHRcdFx0Y2FtZXJhUFkubG9va0F0KCAwLCAxLCAwICk7XHJcblxyXG5cdFx0XHRjYW1lcmFOWS51cC5zZXQoIDAsIDAsIDEgKTtcclxuXHRcdFx0Y2FtZXJhTlkubG9va0F0KCAwLCAtIDEsIDAgKTtcclxuXHJcblx0XHRcdGNhbWVyYVBaLnVwLnNldCggMCwgMSwgMCApO1xyXG5cdFx0XHRjYW1lcmFQWi5sb29rQXQoIDAsIDAsIDEgKTtcclxuXHJcblx0XHRcdGNhbWVyYU5aLnVwLnNldCggMCwgMSwgMCApO1xyXG5cdFx0XHRjYW1lcmFOWi5sb29rQXQoIDAsIDAsIC0gMSApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGNvb3JkaW5hdGVTeXN0ZW0gPT09IFdlYkdQVUNvb3JkaW5hdGVTeXN0ZW0gKSB7XHJcblxyXG5cdFx0XHRjYW1lcmFQWC51cC5zZXQoIDAsIC0gMSwgMCApO1xyXG5cdFx0XHRjYW1lcmFQWC5sb29rQXQoIC0gMSwgMCwgMCApO1xyXG5cclxuXHRcdFx0Y2FtZXJhTlgudXAuc2V0KCAwLCAtIDEsIDAgKTtcclxuXHRcdFx0Y2FtZXJhTlgubG9va0F0KCAxLCAwLCAwICk7XHJcblxyXG5cdFx0XHRjYW1lcmFQWS51cC5zZXQoIDAsIDAsIDEgKTtcclxuXHRcdFx0Y2FtZXJhUFkubG9va0F0KCAwLCAxLCAwICk7XHJcblxyXG5cdFx0XHRjYW1lcmFOWS51cC5zZXQoIDAsIDAsIC0gMSApO1xyXG5cdFx0XHRjYW1lcmFOWS5sb29rQXQoIDAsIC0gMSwgMCApO1xyXG5cclxuXHRcdFx0Y2FtZXJhUFoudXAuc2V0KCAwLCAtIDEsIDAgKTtcclxuXHRcdFx0Y2FtZXJhUFoubG9va0F0KCAwLCAwLCAxICk7XHJcblxyXG5cdFx0XHRjYW1lcmFOWi51cC5zZXQoIDAsIC0gMSwgMCApO1xyXG5cdFx0XHRjYW1lcmFOWi5sb29rQXQoIDAsIDAsIC0gMSApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5DdWJlQ2FtZXJhLnVwZGF0ZUNvb3JkaW5hdGVTeXN0ZW0oKTogSW52YWxpZCBjb29yZGluYXRlIHN5c3RlbTogJyArIGNvb3JkaW5hdGVTeXN0ZW0gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Zm9yICggY29uc3QgY2FtZXJhIG9mIGNhbWVyYXMgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmFkZCggY2FtZXJhICk7XHJcblxyXG5cdFx0XHRjYW1lcmEudXBkYXRlTWF0cml4V29ybGQoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIHJlbmRlciB0aGUgZ2l2ZW4gc2NlbmUgd2l0aCB0aGUgZ2l2ZW4gcmVuZGVyZXJcclxuXHQgKiBpbnRvIHRoZSBjdWJlIHJlbmRlciB0YXJnZXQgb2YgdGhlIGNhbWVyYS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7KFJlbmRlcmVyfFdlYkdMUmVuZGVyZXIpfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcGFyYW0ge1NjZW5lfSBzY2VuZSAtIFRoZSBzY2VuZSB0byByZW5kZXIuXHJcblx0ICovXHJcblx0dXBkYXRlKCByZW5kZXJlciwgc2NlbmUgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLnBhcmVudCA9PT0gbnVsbCApIHRoaXMudXBkYXRlTWF0cml4V29ybGQoKTtcclxuXHJcblx0XHRjb25zdCB7IHJlbmRlclRhcmdldCwgYWN0aXZlTWlwbWFwTGV2ZWwgfSA9IHRoaXM7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmNvb3JkaW5hdGVTeXN0ZW0gIT09IHJlbmRlcmVyLmNvb3JkaW5hdGVTeXN0ZW0gKSB7XHJcblxyXG5cdFx0XHR0aGlzLmNvb3JkaW5hdGVTeXN0ZW0gPSByZW5kZXJlci5jb29yZGluYXRlU3lzdGVtO1xyXG5cclxuXHRcdFx0dGhpcy51cGRhdGVDb29yZGluYXRlU3lzdGVtKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IFsgY2FtZXJhUFgsIGNhbWVyYU5YLCBjYW1lcmFQWSwgY2FtZXJhTlksIGNhbWVyYVBaLCBjYW1lcmFOWiBdID0gdGhpcy5jaGlsZHJlbjtcclxuXHJcblx0XHRjb25zdCBjdXJyZW50UmVuZGVyVGFyZ2V0ID0gcmVuZGVyZXIuZ2V0UmVuZGVyVGFyZ2V0KCk7XHJcblx0XHRjb25zdCBjdXJyZW50QWN0aXZlQ3ViZUZhY2UgPSByZW5kZXJlci5nZXRBY3RpdmVDdWJlRmFjZSgpO1xyXG5cdFx0Y29uc3QgY3VycmVudEFjdGl2ZU1pcG1hcExldmVsID0gcmVuZGVyZXIuZ2V0QWN0aXZlTWlwbWFwTGV2ZWwoKTtcclxuXHJcblx0XHRjb25zdCBjdXJyZW50WHJFbmFibGVkID0gcmVuZGVyZXIueHIuZW5hYmxlZDtcclxuXHJcblx0XHRyZW5kZXJlci54ci5lbmFibGVkID0gZmFsc2U7XHJcblxyXG5cdFx0Y29uc3QgZ2VuZXJhdGVNaXBtYXBzID0gcmVuZGVyVGFyZ2V0LnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzO1xyXG5cclxuXHRcdHJlbmRlclRhcmdldC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xyXG5cclxuXHRcdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0LCAwLCBhY3RpdmVNaXBtYXBMZXZlbCApO1xyXG5cdFx0cmVuZGVyZXIucmVuZGVyKCBzY2VuZSwgY2FtZXJhUFggKTtcclxuXHJcblx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCwgMSwgYWN0aXZlTWlwbWFwTGV2ZWwgKTtcclxuXHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYU5YICk7XHJcblxyXG5cdFx0cmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQsIDIsIGFjdGl2ZU1pcG1hcExldmVsICk7XHJcblx0XHRyZW5kZXJlci5yZW5kZXIoIHNjZW5lLCBjYW1lcmFQWSApO1xyXG5cclxuXHRcdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0LCAzLCBhY3RpdmVNaXBtYXBMZXZlbCApO1xyXG5cdFx0cmVuZGVyZXIucmVuZGVyKCBzY2VuZSwgY2FtZXJhTlkgKTtcclxuXHJcblx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCwgNCwgYWN0aXZlTWlwbWFwTGV2ZWwgKTtcclxuXHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYVBaICk7XHJcblxyXG5cdFx0Ly8gbWlwbWFwcyBhcmUgZ2VuZXJhdGVkIGR1cmluZyB0aGUgbGFzdCBjYWxsIG9mIHJlbmRlcigpXHJcblx0XHQvLyBhdCB0aGlzIHBvaW50LCBhbGwgc2lkZXMgb2YgdGhlIGN1YmUgcmVuZGVyIHRhcmdldCBhcmUgZGVmaW5lZFxyXG5cclxuXHRcdHJlbmRlclRhcmdldC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGdlbmVyYXRlTWlwbWFwcztcclxuXHJcblx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCwgNSwgYWN0aXZlTWlwbWFwTGV2ZWwgKTtcclxuXHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYU5aICk7XHJcblxyXG5cdFx0cmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCBjdXJyZW50UmVuZGVyVGFyZ2V0LCBjdXJyZW50QWN0aXZlQ3ViZUZhY2UsIGN1cnJlbnRBY3RpdmVNaXBtYXBMZXZlbCApO1xyXG5cclxuXHRcdHJlbmRlcmVyLnhyLmVuYWJsZWQgPSBjdXJyZW50WHJFbmFibGVkO1xyXG5cclxuXHRcdHJlbmRlclRhcmdldC50ZXh0dXJlLm5lZWRzUE1SRU1VcGRhdGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBDdWJlQ2FtZXJhIH07XHJcbiIsImltcG9ydCB7IFRleHR1cmUgfSBmcm9tICcuL1RleHR1cmUuanMnO1xyXG5pbXBvcnQgeyBDdWJlUmVmbGVjdGlvbk1hcHBpbmcgfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSBjdWJlIHRleHR1cmUgbWFkZSB1cCBvZiBzaXggaW1hZ2VzLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBsb2FkZXIgPSBuZXcgVEhSRUUuQ3ViZVRleHR1cmVMb2FkZXIoKTtcclxuICogbG9hZGVyLnNldFBhdGgoICd0ZXh0dXJlcy9jdWJlL3Bpc2EvJyApO1xyXG4gKlxyXG4gKiBjb25zdCB0ZXh0dXJlQ3ViZSA9IGxvYWRlci5sb2FkKCBbXHJcbiAqIFx0J3B4LnBuZycsICdueC5wbmcnLCAncHkucG5nJywgJ255LnBuZycsICdwei5wbmcnLCAnbnoucG5nJ1xyXG4gKiBdICk7XHJcbiAqXHJcbiAqIGNvbnN0IG1hdGVyaWFsID0gbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiAweGZmZmZmZiwgZW52TWFwOiB0ZXh0dXJlQ3ViZSB9ICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgVGV4dHVyZVxyXG4gKi9cclxuY2xhc3MgQ3ViZVRleHR1cmUgZXh0ZW5kcyBUZXh0dXJlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBjdWJlIHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PEltYWdlPn0gW2ltYWdlcz1bXV0gLSBBbiBhcnJheSBob2xkaW5nIGEgaW1hZ2UgZm9yIGVhY2ggc2lkZSBvZiBhIGN1YmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFttYXBwaW5nPUN1YmVSZWZsZWN0aW9uTWFwcGluZ10gLSBUaGUgdGV4dHVyZSBtYXBwaW5nLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbd3JhcFM9Q2xhbXBUb0VkZ2VXcmFwcGluZ10gLSBUaGUgd3JhcFMgdmFsdWUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt3cmFwVD1DbGFtcFRvRWRnZVdyYXBwaW5nXSAtIFRoZSB3cmFwVCB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW21hZ0ZpbHRlcj1MaW5lYXJGaWx0ZXJdIC0gVGhlIG1hZyBmaWx0ZXIgdmFsdWUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFttaW5GaWx0ZXI9TGluZWFyTWlwbWFwTGluZWFyRmlsdGVyXSAtIFRoZSBtaW4gZmlsdGVyIHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZm9ybWF0PVJHQkFGb3JtYXRdIC0gVGhlIHRleHR1cmUgZm9ybWF0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbdHlwZT1VbnNpZ25lZEJ5dGVUeXBlXSAtIFRoZSB0ZXh0dXJlIHR5cGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFthbmlzb3Ryb3B5PVRleHR1cmUuREVGQVVMVF9BTklTT1RST1BZXSAtIFRoZSBhbmlzb3Ryb3B5IHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbY29sb3JTcGFjZT1Ob0NvbG9yU3BhY2VdIC0gVGhlIGNvbG9yIHNwYWNlIHZhbHVlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBpbWFnZXMgPSBbXSwgbWFwcGluZyA9IEN1YmVSZWZsZWN0aW9uTWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5LCBjb2xvclNwYWNlICkge1xyXG5cclxuXHRcdHN1cGVyKCBpbWFnZXMsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSwgY29sb3JTcGFjZSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0N1YmVUZXh0dXJlID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIElmIHNldCB0byBgdHJ1ZWAsIHRoZSB0ZXh0dXJlIGlzIGZsaXBwZWQgYWxvbmcgdGhlIHZlcnRpY2FsIGF4aXMgd2hlblxyXG5cdFx0ICogdXBsb2FkZWQgdG8gdGhlIEdQVS5cclxuXHRcdCAqXHJcblx0XHQgKiBPdmVyd3JpdHRlbiBhbmQgc2V0IHRvIGBmYWxzZWAgYnkgZGVmYXVsdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZmxpcFkgPSBmYWxzZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBbGlhcyBmb3Ige0BsaW5rIEN1YmVUZXh0dXJlI2ltYWdlfS5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtBcnJheTxJbWFnZT59XHJcblx0ICovXHJcblx0Z2V0IGltYWdlcygpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5pbWFnZTtcclxuXHJcblx0fVxyXG5cclxuXHRzZXQgaW1hZ2VzKCB2YWx1ZSApIHtcclxuXHJcblx0XHR0aGlzLmltYWdlID0gdmFsdWU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IEN1YmVUZXh0dXJlIH07XHJcbiIsImltcG9ydCB7IEJhY2tTaWRlLCBMaW5lYXJGaWx0ZXIsIExpbmVhck1pcG1hcExpbmVhckZpbHRlciwgTm9CbGVuZGluZyB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IE1lc2ggfSBmcm9tICcuLi9vYmplY3RzL01lc2guanMnO1xyXG5pbXBvcnQgeyBCb3hHZW9tZXRyeSB9IGZyb20gJy4uL2dlb21ldHJpZXMvQm94R2VvbWV0cnkuanMnO1xyXG5pbXBvcnQgeyBTaGFkZXJNYXRlcmlhbCB9IGZyb20gJy4uL21hdGVyaWFscy9TaGFkZXJNYXRlcmlhbC5qcyc7XHJcbmltcG9ydCB7IGNsb25lVW5pZm9ybXMgfSBmcm9tICcuL3NoYWRlcnMvVW5pZm9ybXNVdGlscy5qcyc7XHJcbmltcG9ydCB7IFdlYkdMUmVuZGVyVGFyZ2V0IH0gZnJvbSAnLi9XZWJHTFJlbmRlclRhcmdldC5qcyc7XHJcbmltcG9ydCB7IEN1YmVDYW1lcmEgfSBmcm9tICcuLi9jYW1lcmFzL0N1YmVDYW1lcmEuanMnO1xyXG5pbXBvcnQgeyBDdWJlVGV4dHVyZSB9IGZyb20gJy4uL3RleHR1cmVzL0N1YmVUZXh0dXJlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIGN1YmUgcmVuZGVyIHRhcmdldCB1c2VkIGluIGNvbnRleHQgb2Yge0BsaW5rIFdlYkdMUmVuZGVyZXJ9LlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgV2ViR0xSZW5kZXJUYXJnZXRcclxuICovXHJcbmNsYXNzIFdlYkdMQ3ViZVJlbmRlclRhcmdldCBleHRlbmRzIFdlYkdMUmVuZGVyVGFyZ2V0IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBjdWJlIHJlbmRlciB0YXJnZXQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3NpemU9MV0gLSBUaGUgc2l6ZSBvZiB0aGUgcmVuZGVyIHRhcmdldC5cclxuXHQgKiBAcGFyYW0ge1JlbmRlclRhcmdldH5PcHRpb25zfSBbb3B0aW9uc10gLSBUaGUgY29uZmlndXJhdGlvbiBvYmplY3QuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHNpemUgPSAxLCBvcHRpb25zID0ge30gKSB7XHJcblxyXG5cdFx0c3VwZXIoIHNpemUsIHNpemUsIG9wdGlvbnMgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQgPSB0cnVlO1xyXG5cclxuXHRcdGNvbnN0IGltYWdlID0geyB3aWR0aDogc2l6ZSwgaGVpZ2h0OiBzaXplLCBkZXB0aDogMSB9O1xyXG5cdFx0Y29uc3QgaW1hZ2VzID0gWyBpbWFnZSwgaW1hZ2UsIGltYWdlLCBpbWFnZSwgaW1hZ2UsIGltYWdlIF07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBPdmVyd3JpdHRlbiB3aXRoIGEgZGlmZmVyZW50IHRleHR1cmUgdHlwZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7RGF0YUFycmF5VGV4dHVyZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50ZXh0dXJlID0gbmV3IEN1YmVUZXh0dXJlKCBpbWFnZXMsIG9wdGlvbnMubWFwcGluZywgb3B0aW9ucy53cmFwUywgb3B0aW9ucy53cmFwVCwgb3B0aW9ucy5tYWdGaWx0ZXIsIG9wdGlvbnMubWluRmlsdGVyLCBvcHRpb25zLmZvcm1hdCwgb3B0aW9ucy50eXBlLCBvcHRpb25zLmFuaXNvdHJvcHksIG9wdGlvbnMuY29sb3JTcGFjZSApO1xyXG5cclxuXHRcdC8vIEJ5IGNvbnZlbnRpb24gLS0gbGlrZWx5IGJhc2VkIG9uIHRoZSBSZW5kZXJNYW4gc3BlYyBmcm9tIHRoZSAxOTkwJ3MgLS0gY3ViZSBtYXBzIGFyZSBzcGVjaWZpZWQgYnkgV2ViR0wgKGFuZCB0aHJlZS5qcylcclxuXHRcdC8vIGluIGEgY29vcmRpbmF0ZSBzeXN0ZW0gaW4gd2hpY2ggcG9zaXRpdmUteCBpcyB0byB0aGUgcmlnaHQgd2hlbiBsb29raW5nIHVwIHRoZSBwb3NpdGl2ZS16IGF4aXMgLS0gaW4gb3RoZXIgd29yZHMsXHJcblx0XHQvLyBpbiBhIGxlZnQtaGFuZGVkIGNvb3JkaW5hdGUgc3lzdGVtLiBCeSBjb250aW51aW5nIHRoaXMgY29udmVudGlvbiwgcHJlZXhpc3RpbmcgY3ViZSBtYXBzIGNvbnRpbnVlZCB0byByZW5kZXIgY29ycmVjdGx5LlxyXG5cclxuXHRcdC8vIHRocmVlLmpzIHVzZXMgYSByaWdodC1oYW5kZWQgY29vcmRpbmF0ZSBzeXN0ZW0uIFNvIGVudmlyb25tZW50IG1hcHMgdXNlZCBpbiB0aHJlZS5qcyBhcHBlYXIgdG8gaGF2ZSBweCBhbmQgbnggc3dhcHBlZFxyXG5cdFx0Ly8gYW5kIHRoZSBmbGFnIGlzUmVuZGVyVGFyZ2V0VGV4dHVyZSBjb250cm9scyB0aGlzIGNvbnZlcnNpb24uIFRoZSBmbGlwIGlzIG5vdCByZXF1aXJlZCB3aGVuIHVzaW5nIFdlYkdMQ3ViZVJlbmRlclRhcmdldC50ZXh0dXJlXHJcblx0XHQvLyBhcyBhIGN1YmUgdGV4dHVyZSAodGhpcyBpcyBkZXRlY3RlZCB3aGVuIGlzUmVuZGVyVGFyZ2V0VGV4dHVyZSBpcyBzZXQgdG8gdHJ1ZSBmb3IgY3ViZSB0ZXh0dXJlcykuXHJcblxyXG5cdFx0dGhpcy50ZXh0dXJlLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IG9wdGlvbnMuZ2VuZXJhdGVNaXBtYXBzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmdlbmVyYXRlTWlwbWFwcyA6IGZhbHNlO1xyXG5cdFx0dGhpcy50ZXh0dXJlLm1pbkZpbHRlciA9IG9wdGlvbnMubWluRmlsdGVyICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLm1pbkZpbHRlciA6IExpbmVhckZpbHRlcjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gZXF1aXJlY3Rhbmd1bGFyIHRleHR1cmUgdG8gYSBjdWJlIG1hcC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIGVxdWlyZWN0YW5ndWxhciB0ZXh0dXJlLlxyXG5cdCAqIEByZXR1cm4ge1dlYkdMQ3ViZVJlbmRlclRhcmdldH0gQSByZWZlcmVuY2UgdG8gdGhpcyBjdWJlIHJlbmRlciB0YXJnZXQuXHJcblx0ICovXHJcblx0ZnJvbUVxdWlyZWN0YW5ndWxhclRleHR1cmUoIHJlbmRlcmVyLCB0ZXh0dXJlICkge1xyXG5cclxuXHRcdHRoaXMudGV4dHVyZS50eXBlID0gdGV4dHVyZS50eXBlO1xyXG5cdFx0dGhpcy50ZXh0dXJlLmNvbG9yU3BhY2UgPSB0ZXh0dXJlLmNvbG9yU3BhY2U7XHJcblxyXG5cdFx0dGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IHRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzO1xyXG5cdFx0dGhpcy50ZXh0dXJlLm1pbkZpbHRlciA9IHRleHR1cmUubWluRmlsdGVyO1xyXG5cdFx0dGhpcy50ZXh0dXJlLm1hZ0ZpbHRlciA9IHRleHR1cmUubWFnRmlsdGVyO1xyXG5cclxuXHRcdGNvbnN0IHNoYWRlciA9IHtcclxuXHJcblx0XHRcdHVuaWZvcm1zOiB7XHJcblx0XHRcdFx0dEVxdWlyZWN0OiB7IHZhbHVlOiBudWxsIH0sXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHR2ZXJ0ZXhTaGFkZXI6IC8qIGdsc2wgKi9gXHJcblxyXG5cdFx0XHRcdHZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247XHJcblxyXG5cdFx0XHRcdHZlYzMgdHJhbnNmb3JtRGlyZWN0aW9uKCBpbiB2ZWMzIGRpciwgaW4gbWF0NCBtYXRyaXggKSB7XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIG5vcm1hbGl6ZSggKCBtYXRyaXggKiB2ZWM0KCBkaXIsIDAuMCApICkueHl6ICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0dm9pZCBtYWluKCkge1xyXG5cclxuXHRcdFx0XHRcdHZXb3JsZERpcmVjdGlvbiA9IHRyYW5zZm9ybURpcmVjdGlvbiggcG9zaXRpb24sIG1vZGVsTWF0cml4ICk7XHJcblxyXG5cdFx0XHRcdFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cclxuXHRcdFx0XHRcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cclxuXHJcblx0XHRcdFx0fVxyXG5cdFx0XHRgLFxyXG5cclxuXHRcdFx0ZnJhZ21lbnRTaGFkZXI6IC8qIGdsc2wgKi9gXHJcblxyXG5cdFx0XHRcdHVuaWZvcm0gc2FtcGxlcjJEIHRFcXVpcmVjdDtcclxuXHJcblx0XHRcdFx0dmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcclxuXHJcblx0XHRcdFx0I2luY2x1ZGUgPGNvbW1vbj5cclxuXHJcblx0XHRcdFx0dm9pZCBtYWluKCkge1xyXG5cclxuXHRcdFx0XHRcdHZlYzMgZGlyZWN0aW9uID0gbm9ybWFsaXplKCB2V29ybGREaXJlY3Rpb24gKTtcclxuXHJcblx0XHRcdFx0XHR2ZWMyIHNhbXBsZVVWID0gZXF1aXJlY3RVdiggZGlyZWN0aW9uICk7XHJcblxyXG5cdFx0XHRcdFx0Z2xfRnJhZ0NvbG9yID0gdGV4dHVyZTJEKCB0RXF1aXJlY3QsIHNhbXBsZVVWICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHRcdFx0YFxyXG5cdFx0fTtcclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeSA9IG5ldyBCb3hHZW9tZXRyeSggNSwgNSwgNSApO1xyXG5cclxuXHRcdGNvbnN0IG1hdGVyaWFsID0gbmV3IFNoYWRlck1hdGVyaWFsKCB7XHJcblxyXG5cdFx0XHRuYW1lOiAnQ3ViZW1hcEZyb21FcXVpcmVjdCcsXHJcblxyXG5cdFx0XHR1bmlmb3JtczogY2xvbmVVbmlmb3Jtcyggc2hhZGVyLnVuaWZvcm1zICksXHJcblx0XHRcdHZlcnRleFNoYWRlcjogc2hhZGVyLnZlcnRleFNoYWRlcixcclxuXHRcdFx0ZnJhZ21lbnRTaGFkZXI6IHNoYWRlci5mcmFnbWVudFNoYWRlcixcclxuXHRcdFx0c2lkZTogQmFja1NpZGUsXHJcblx0XHRcdGJsZW5kaW5nOiBOb0JsZW5kaW5nXHJcblxyXG5cdFx0fSApO1xyXG5cclxuXHRcdG1hdGVyaWFsLnVuaWZvcm1zLnRFcXVpcmVjdC52YWx1ZSA9IHRleHR1cmU7XHJcblxyXG5cdFx0Y29uc3QgbWVzaCA9IG5ldyBNZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuXHJcblx0XHRjb25zdCBjdXJyZW50TWluRmlsdGVyID0gdGV4dHVyZS5taW5GaWx0ZXI7XHJcblxyXG5cdFx0Ly8gQXZvaWQgYmx1cnJlZCBwb2xlc1xyXG5cdFx0aWYgKCB0ZXh0dXJlLm1pbkZpbHRlciA9PT0gTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyICkgdGV4dHVyZS5taW5GaWx0ZXIgPSBMaW5lYXJGaWx0ZXI7XHJcblxyXG5cdFx0Y29uc3QgY2FtZXJhID0gbmV3IEN1YmVDYW1lcmEoIDEsIDEwLCB0aGlzICk7XHJcblx0XHRjYW1lcmEudXBkYXRlKCByZW5kZXJlciwgbWVzaCApO1xyXG5cclxuXHRcdHRleHR1cmUubWluRmlsdGVyID0gY3VycmVudE1pbkZpbHRlcjtcclxuXHJcblx0XHRtZXNoLmdlb21ldHJ5LmRpc3Bvc2UoKTtcclxuXHRcdG1lc2gubWF0ZXJpYWwuZGlzcG9zZSgpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENsZWFycyB0aGlzIGN1YmUgcmVuZGVyIHRhcmdldC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbY29sb3I9dHJ1ZV0gLSBXaGV0aGVyIHRoZSBjb2xvciBidWZmZXIgc2hvdWxkIGJlIGNsZWFyZWQgb3Igbm90LlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW2RlcHRoPXRydWVdIC0gV2hldGhlciB0aGUgZGVwdGggYnVmZmVyIHNob3VsZCBiZSBjbGVhcmVkIG9yIG5vdC5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtzdGVuY2lsPXRydWVdIC0gV2hldGhlciB0aGUgc3RlbmNpbCBidWZmZXIgc2hvdWxkIGJlIGNsZWFyZWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGNsZWFyKCByZW5kZXJlciwgY29sb3IgPSB0cnVlLCBkZXB0aCA9IHRydWUsIHN0ZW5jaWwgPSB0cnVlICkge1xyXG5cclxuXHRcdGNvbnN0IGN1cnJlbnRSZW5kZXJUYXJnZXQgPSByZW5kZXJlci5nZXRSZW5kZXJUYXJnZXQoKTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCA2OyBpICsrICkge1xyXG5cclxuXHRcdFx0cmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCB0aGlzLCBpICk7XHJcblxyXG5cdFx0XHRyZW5kZXJlci5jbGVhciggY29sb3IsIGRlcHRoLCBzdGVuY2lsICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggY3VycmVudFJlbmRlclRhcmdldCApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBXZWJHTEN1YmVSZW5kZXJUYXJnZXQgfTtcclxuIiwiaW1wb3J0IHsgT2JqZWN0M0QgfSBmcm9tICcuLi9jb3JlL09iamVjdDNELmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGlzIGFsbW9zdCBpZGVudGljYWwgdG8gYW4ge0BsaW5rIE9iamVjdDNEfS4gSXRzIHB1cnBvc2UgaXMgdG9cclxuICogbWFrZSB3b3JraW5nIHdpdGggZ3JvdXBzIG9mIG9iamVjdHMgc3ludGFjdGljYWxseSBjbGVhcmVyLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiAvLyBDcmVhdGUgYSBncm91cCBhbmQgYWRkIHRoZSB0d28gY3ViZXMuXHJcbiAqIC8vIFRoZXNlIGN1YmVzIGNhbiBub3cgYmUgcm90YXRlZCAvIHNjYWxlZCBldGMgYXMgYSBncm91cC5cclxuICogY29uc3QgZ3JvdXAgPSBuZXcgVEhSRUUuR3JvdXAoKTtcclxuICpcclxuICogZ3JvdXAuYWRkKCBtZXNoQSApO1xyXG4gKiBncm91cC5hZGQoIG1lc2hCICk7XHJcbiAqXHJcbiAqIHNjZW5lLmFkZCggZ3JvdXAgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBPYmplY3QzRFxyXG4gKi9cclxuY2xhc3MgR3JvdXAgZXh0ZW5kcyBPYmplY3QzRCB7XHJcblxyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzR3JvdXAgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdHcm91cCc7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IEdyb3VwIH07XHJcbiIsImltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBHcm91cCB9IGZyb20gJy4uLy4uL29iamVjdHMvR3JvdXAuanMnO1xyXG5cclxuY29uc3QgX21vdmVFdmVudCA9IHsgdHlwZTogJ21vdmUnIH07XHJcblxyXG4vKipcclxuICogQ2xhc3MgZm9yIHJlcHJlc2VudGluZyBhIFhSIGNvbnRyb2xsZXIgd2l0aCBpdHNcclxuICogZGlmZmVyZW50IGNvb3JkaW5hdGUgc3lzdGVtcy5cclxuICpcclxuICogQHByaXZhdGVcclxuICovXHJcbmNsYXNzIFdlYlhSQ29udHJvbGxlciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgWFIgY29udHJvbGxlci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgZ3JvdXAgcmVwcmVzZW50aW5nIHRoZSB0YXJnZXQgcmF5IHNwYWNlXHJcblx0XHQgKiBvZiB0aGUgWFIgY29udHJvbGxlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUgez9Hcm91cH1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fdGFyZ2V0UmF5ID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgZ3JvdXAgcmVwcmVzZW50aW5nIHRoZSBncmlwIHNwYWNlXHJcblx0XHQgKiBvZiB0aGUgWFIgY29udHJvbGxlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUgez9Hcm91cH1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fZ3JpcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGdyb3VwIHJlcHJlc2VudGluZyB0aGUgaGFuZCBzcGFjZVxyXG5cdFx0ICogb2YgdGhlIFhSIGNvbnRyb2xsZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHs/R3JvdXB9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX2hhbmQgPSBudWxsO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBncm91cCByZXByZXNlbnRpbmcgdGhlIGhhbmQgc3BhY2Ugb2YgdGhlIFhSIGNvbnRyb2xsZXIuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtHcm91cH0gQSBncm91cCByZXByZXNlbnRpbmcgdGhlIGhhbmQgc3BhY2Ugb2YgdGhlIFhSIGNvbnRyb2xsZXIuXHJcblx0ICovXHJcblx0Z2V0SGFuZFNwYWNlKCkge1xyXG5cclxuXHRcdGlmICggdGhpcy5faGFuZCA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuX2hhbmQgPSBuZXcgR3JvdXAoKTtcclxuXHRcdFx0dGhpcy5faGFuZC5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XHJcblx0XHRcdHRoaXMuX2hhbmQudmlzaWJsZSA9IGZhbHNlO1xyXG5cclxuXHRcdFx0dGhpcy5faGFuZC5qb2ludHMgPSB7fTtcclxuXHRcdFx0dGhpcy5faGFuZC5pbnB1dFN0YXRlID0geyBwaW5jaGluZzogZmFsc2UgfTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX2hhbmQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIGdyb3VwIHJlcHJlc2VudGluZyB0aGUgdGFyZ2V0IHJheSBzcGFjZSBvZiB0aGUgWFIgY29udHJvbGxlci5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0dyb3VwfSBBIGdyb3VwIHJlcHJlc2VudGluZyB0aGUgdGFyZ2V0IHJheSBzcGFjZSBvZiB0aGUgWFIgY29udHJvbGxlci5cclxuXHQgKi9cclxuXHRnZXRUYXJnZXRSYXlTcGFjZSgpIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuX3RhcmdldFJheSA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuX3RhcmdldFJheSA9IG5ldyBHcm91cCgpO1xyXG5cdFx0XHR0aGlzLl90YXJnZXRSYXkubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xyXG5cdFx0XHR0aGlzLl90YXJnZXRSYXkudmlzaWJsZSA9IGZhbHNlO1xyXG5cdFx0XHR0aGlzLl90YXJnZXRSYXkuaGFzTGluZWFyVmVsb2NpdHkgPSBmYWxzZTtcclxuXHRcdFx0dGhpcy5fdGFyZ2V0UmF5LmxpbmVhclZlbG9jaXR5ID0gbmV3IFZlY3RvcjMoKTtcclxuXHRcdFx0dGhpcy5fdGFyZ2V0UmF5Lmhhc0FuZ3VsYXJWZWxvY2l0eSA9IGZhbHNlO1xyXG5cdFx0XHR0aGlzLl90YXJnZXRSYXkuYW5ndWxhclZlbG9jaXR5ID0gbmV3IFZlY3RvcjMoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX3RhcmdldFJheTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgZ3JvdXAgcmVwcmVzZW50aW5nIHRoZSBncmlwIHNwYWNlIG9mIHRoZSBYUiBjb250cm9sbGVyLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7R3JvdXB9IEEgZ3JvdXAgcmVwcmVzZW50aW5nIHRoZSBncmlwIHNwYWNlIG9mIHRoZSBYUiBjb250cm9sbGVyLlxyXG5cdCAqL1xyXG5cdGdldEdyaXBTcGFjZSgpIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuX2dyaXAgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLl9ncmlwID0gbmV3IEdyb3VwKCk7XHJcblx0XHRcdHRoaXMuX2dyaXAubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xyXG5cdFx0XHR0aGlzLl9ncmlwLnZpc2libGUgPSBmYWxzZTtcclxuXHRcdFx0dGhpcy5fZ3JpcC5oYXNMaW5lYXJWZWxvY2l0eSA9IGZhbHNlO1xyXG5cdFx0XHR0aGlzLl9ncmlwLmxpbmVhclZlbG9jaXR5ID0gbmV3IFZlY3RvcjMoKTtcclxuXHRcdFx0dGhpcy5fZ3JpcC5oYXNBbmd1bGFyVmVsb2NpdHkgPSBmYWxzZTtcclxuXHRcdFx0dGhpcy5fZ3JpcC5hbmd1bGFyVmVsb2NpdHkgPSBuZXcgVmVjdG9yMygpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fZ3JpcDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEaXNwYXRjaGVzIHRoZSBnaXZlbiBldmVudCB0byB0aGUgZ3JvdXBzIHJlcHJlc2VudGluZ1xyXG5cdCAqIHRoZSBkaWZmZXJlbnQgY29vcmRpbmF0ZSBzcGFjZXMgb2YgdGhlIFhSIGNvbnRyb2xsZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgLSBUaGUgZXZlbnQgdG8gZGlzcGF0Y2guXHJcblx0ICogQHJldHVybiB7V2ViWFJDb250cm9sbGVyfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGRpc3BhdGNoRXZlbnQoIGV2ZW50ICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5fdGFyZ2V0UmF5ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5fdGFyZ2V0UmF5LmRpc3BhdGNoRXZlbnQoIGV2ZW50ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy5fZ3JpcCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuX2dyaXAuZGlzcGF0Y2hFdmVudCggZXZlbnQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9oYW5kICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5faGFuZC5kaXNwYXRjaEV2ZW50KCBldmVudCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25uZWN0cyB0aGUgY29udHJvbGxlciB3aXRoIHRoZSBnaXZlbiBYUiBpbnB1dCBzb3VyY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1hSSW5wdXRTb3VyY2V9IGlucHV0U291cmNlIC0gVGhlIGlucHV0IHNvdXJjZS5cclxuXHQgKiBAcmV0dXJuIHtXZWJYUkNvbnRyb2xsZXJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y29ubmVjdCggaW5wdXRTb3VyY2UgKSB7XHJcblxyXG5cdFx0aWYgKCBpbnB1dFNvdXJjZSAmJiBpbnB1dFNvdXJjZS5oYW5kICkge1xyXG5cclxuXHRcdFx0Y29uc3QgaGFuZCA9IHRoaXMuX2hhbmQ7XHJcblxyXG5cdFx0XHRpZiAoIGhhbmQgKSB7XHJcblxyXG5cdFx0XHRcdGZvciAoIGNvbnN0IGlucHV0am9pbnQgb2YgaW5wdXRTb3VyY2UuaGFuZC52YWx1ZXMoKSApIHtcclxuXHJcblx0XHRcdFx0XHQvLyBJbml0aWFsaXplIGhhbmQgd2l0aCBqb2ludHMgd2hlbiBjb25uZWN0ZWRcclxuXHRcdFx0XHRcdHRoaXMuX2dldEhhbmRKb2ludCggaGFuZCwgaW5wdXRqb2ludCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnY29ubmVjdGVkJywgZGF0YTogaW5wdXRTb3VyY2UgfSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERpc2Nvbm5lY3RzIHRoZSBjb250cm9sbGVyIGZyb20gdGhlIGdpdmVuIFhSIGlucHV0IHNvdXJjZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7WFJJbnB1dFNvdXJjZX0gaW5wdXRTb3VyY2UgLSBUaGUgaW5wdXQgc291cmNlLlxyXG5cdCAqIEByZXR1cm4ge1dlYlhSQ29udHJvbGxlcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRkaXNjb25uZWN0KCBpbnB1dFNvdXJjZSApIHtcclxuXHJcblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2Rpc2Nvbm5lY3RlZCcsIGRhdGE6IGlucHV0U291cmNlIH0gKTtcclxuXHJcblx0XHRpZiAoIHRoaXMuX3RhcmdldFJheSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuX3RhcmdldFJheS52aXNpYmxlID0gZmFsc2U7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy5fZ3JpcCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuX2dyaXAudmlzaWJsZSA9IGZhbHNlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMuX2hhbmQgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLl9oYW5kLnZpc2libGUgPSBmYWxzZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgY29udHJvbGxlciB3aXRoIHRoZSBnaXZlbiBpbnB1dCBzb3VyY2UsIFhSIGZyYW1lIGFuZCByZWZlcmVuY2Ugc3BhY2UuXHJcblx0ICogVGhpcyB1cGRhdGVzIHRoZSB0cmFuc2Zvcm1hdGlvbnMgb2YgdGhlIGdyb3VwcyB0aGF0IHJlcHJlc2VudCB0aGUgZGlmZmVyZW50XHJcblx0ICogY29vcmRpbmF0ZSBzeXN0ZW1zIG9mIHRoZSBjb250cm9sbGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtYUklucHV0U291cmNlfSBpbnB1dFNvdXJjZSAtIFRoZSBpbnB1dCBzb3VyY2UuXHJcblx0ICogQHBhcmFtIHtYUkZyYW1lfSBmcmFtZSAtIFRoZSBYUiBmcmFtZS5cclxuXHQgKiBAcGFyYW0ge1hSUmVmZXJlbmNlU3BhY2V9IHJlZmVyZW5jZVNwYWNlIC0gVGhlIHJlZmVyZW5jZSBzcGFjZS5cclxuXHQgKiBAcmV0dXJuIHtXZWJYUkNvbnRyb2xsZXJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0dXBkYXRlKCBpbnB1dFNvdXJjZSwgZnJhbWUsIHJlZmVyZW5jZVNwYWNlICkge1xyXG5cclxuXHRcdGxldCBpbnB1dFBvc2UgPSBudWxsO1xyXG5cdFx0bGV0IGdyaXBQb3NlID0gbnVsbDtcclxuXHRcdGxldCBoYW5kUG9zZSA9IG51bGw7XHJcblxyXG5cdFx0Y29uc3QgdGFyZ2V0UmF5ID0gdGhpcy5fdGFyZ2V0UmF5O1xyXG5cdFx0Y29uc3QgZ3JpcCA9IHRoaXMuX2dyaXA7XHJcblx0XHRjb25zdCBoYW5kID0gdGhpcy5faGFuZDtcclxuXHJcblx0XHRpZiAoIGlucHV0U291cmNlICYmIGZyYW1lLnNlc3Npb24udmlzaWJpbGl0eVN0YXRlICE9PSAndmlzaWJsZS1ibHVycmVkJyApIHtcclxuXHJcblx0XHRcdGlmICggaGFuZCAmJiBpbnB1dFNvdXJjZS5oYW5kICkge1xyXG5cclxuXHRcdFx0XHRoYW5kUG9zZSA9IHRydWU7XHJcblxyXG5cdFx0XHRcdGZvciAoIGNvbnN0IGlucHV0am9pbnQgb2YgaW5wdXRTb3VyY2UuaGFuZC52YWx1ZXMoKSApIHtcclxuXHJcblx0XHRcdFx0XHQvLyBVcGRhdGUgdGhlIGpvaW50cyBncm91cHMgd2l0aCB0aGUgWFJKb2ludCBwb3Nlc1xyXG5cdFx0XHRcdFx0Y29uc3Qgam9pbnRQb3NlID0gZnJhbWUuZ2V0Sm9pbnRQb3NlKCBpbnB1dGpvaW50LCByZWZlcmVuY2VTcGFjZSApO1xyXG5cclxuXHRcdFx0XHRcdC8vIFRoZSB0cmFuc2Zvcm0gb2YgdGhpcyBqb2ludCB3aWxsIGJlIHVwZGF0ZWQgd2l0aCB0aGUgam9pbnQgcG9zZSBvbiBlYWNoIGZyYW1lXHJcblx0XHRcdFx0XHRjb25zdCBqb2ludCA9IHRoaXMuX2dldEhhbmRKb2ludCggaGFuZCwgaW5wdXRqb2ludCApO1xyXG5cclxuXHRcdFx0XHRcdGlmICggam9pbnRQb3NlICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRcdFx0am9pbnQubWF0cml4LmZyb21BcnJheSggam9pbnRQb3NlLnRyYW5zZm9ybS5tYXRyaXggKTtcclxuXHRcdFx0XHRcdFx0am9pbnQubWF0cml4LmRlY29tcG9zZSggam9pbnQucG9zaXRpb24sIGpvaW50LnJvdGF0aW9uLCBqb2ludC5zY2FsZSApO1xyXG5cdFx0XHRcdFx0XHRqb2ludC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0am9pbnQuam9pbnRSYWRpdXMgPSBqb2ludFBvc2UucmFkaXVzO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRqb2ludC52aXNpYmxlID0gam9pbnRQb3NlICE9PSBudWxsO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8vIEN1c3RvbSBldmVudHNcclxuXHJcblx0XHRcdFx0Ly8gQ2hlY2sgcGluY2h6XHJcblx0XHRcdFx0Y29uc3QgaW5kZXhUaXAgPSBoYW5kLmpvaW50c1sgJ2luZGV4LWZpbmdlci10aXAnIF07XHJcblx0XHRcdFx0Y29uc3QgdGh1bWJUaXAgPSBoYW5kLmpvaW50c1sgJ3RodW1iLXRpcCcgXTtcclxuXHRcdFx0XHRjb25zdCBkaXN0YW5jZSA9IGluZGV4VGlwLnBvc2l0aW9uLmRpc3RhbmNlVG8oIHRodW1iVGlwLnBvc2l0aW9uICk7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGRpc3RhbmNlVG9QaW5jaCA9IDAuMDI7XHJcblx0XHRcdFx0Y29uc3QgdGhyZXNob2xkID0gMC4wMDU7XHJcblxyXG5cdFx0XHRcdGlmICggaGFuZC5pbnB1dFN0YXRlLnBpbmNoaW5nICYmIGRpc3RhbmNlID4gZGlzdGFuY2VUb1BpbmNoICsgdGhyZXNob2xkICkge1xyXG5cclxuXHRcdFx0XHRcdGhhbmQuaW5wdXRTdGF0ZS5waW5jaGluZyA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCB7XHJcblx0XHRcdFx0XHRcdHR5cGU6ICdwaW5jaGVuZCcsXHJcblx0XHRcdFx0XHRcdGhhbmRlZG5lc3M6IGlucHV0U291cmNlLmhhbmRlZG5lc3MsXHJcblx0XHRcdFx0XHRcdHRhcmdldDogdGhpc1xyXG5cdFx0XHRcdFx0fSApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCAhIGhhbmQuaW5wdXRTdGF0ZS5waW5jaGluZyAmJiBkaXN0YW5jZSA8PSBkaXN0YW5jZVRvUGluY2ggLSB0aHJlc2hvbGQgKSB7XHJcblxyXG5cdFx0XHRcdFx0aGFuZC5pbnB1dFN0YXRlLnBpbmNoaW5nID0gdHJ1ZTtcclxuXHRcdFx0XHRcdHRoaXMuZGlzcGF0Y2hFdmVudCgge1xyXG5cdFx0XHRcdFx0XHR0eXBlOiAncGluY2hzdGFydCcsXHJcblx0XHRcdFx0XHRcdGhhbmRlZG5lc3M6IGlucHV0U291cmNlLmhhbmRlZG5lc3MsXHJcblx0XHRcdFx0XHRcdHRhcmdldDogdGhpc1xyXG5cdFx0XHRcdFx0fSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRpZiAoIGdyaXAgIT09IG51bGwgJiYgaW5wdXRTb3VyY2UuZ3JpcFNwYWNlICkge1xyXG5cclxuXHRcdFx0XHRcdGdyaXBQb3NlID0gZnJhbWUuZ2V0UG9zZSggaW5wdXRTb3VyY2UuZ3JpcFNwYWNlLCByZWZlcmVuY2VTcGFjZSApO1xyXG5cclxuXHRcdFx0XHRcdGlmICggZ3JpcFBvc2UgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRncmlwLm1hdHJpeC5mcm9tQXJyYXkoIGdyaXBQb3NlLnRyYW5zZm9ybS5tYXRyaXggKTtcclxuXHRcdFx0XHRcdFx0Z3JpcC5tYXRyaXguZGVjb21wb3NlKCBncmlwLnBvc2l0aW9uLCBncmlwLnJvdGF0aW9uLCBncmlwLnNjYWxlICk7XHJcblx0XHRcdFx0XHRcdGdyaXAubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIGdyaXBQb3NlLmxpbmVhclZlbG9jaXR5ICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRncmlwLmhhc0xpbmVhclZlbG9jaXR5ID0gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0XHRncmlwLmxpbmVhclZlbG9jaXR5LmNvcHkoIGdyaXBQb3NlLmxpbmVhclZlbG9jaXR5ICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRncmlwLmhhc0xpbmVhclZlbG9jaXR5ID0gZmFsc2U7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIGdyaXBQb3NlLmFuZ3VsYXJWZWxvY2l0eSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0Z3JpcC5oYXNBbmd1bGFyVmVsb2NpdHkgPSB0cnVlO1xyXG5cdFx0XHRcdFx0XHRcdGdyaXAuYW5ndWxhclZlbG9jaXR5LmNvcHkoIGdyaXBQb3NlLmFuZ3VsYXJWZWxvY2l0eSApO1xyXG5cclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0Z3JpcC5oYXNBbmd1bGFyVmVsb2NpdHkgPSBmYWxzZTtcclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggdGFyZ2V0UmF5ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRpbnB1dFBvc2UgPSBmcmFtZS5nZXRQb3NlKCBpbnB1dFNvdXJjZS50YXJnZXRSYXlTcGFjZSwgcmVmZXJlbmNlU3BhY2UgKTtcclxuXHJcblx0XHRcdFx0Ly8gU29tZSBydW50aW1lcyAobmFtZWx5IFZpdmUgQ29zbW9zIHdpdGggVml2ZSBPcGVuWFIgUnVudGltZSkgaGF2ZSBvbmx5IGdyaXAgc3BhY2UgYW5kIHJheSBzcGFjZSBpcyBlcXVhbCB0byBpdFxyXG5cdFx0XHRcdGlmICggaW5wdXRQb3NlID09PSBudWxsICYmIGdyaXBQb3NlICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRcdGlucHV0UG9zZSA9IGdyaXBQb3NlO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICggaW5wdXRQb3NlICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRcdHRhcmdldFJheS5tYXRyaXguZnJvbUFycmF5KCBpbnB1dFBvc2UudHJhbnNmb3JtLm1hdHJpeCApO1xyXG5cdFx0XHRcdFx0dGFyZ2V0UmF5Lm1hdHJpeC5kZWNvbXBvc2UoIHRhcmdldFJheS5wb3NpdGlvbiwgdGFyZ2V0UmF5LnJvdGF0aW9uLCB0YXJnZXRSYXkuc2NhbGUgKTtcclxuXHRcdFx0XHRcdHRhcmdldFJheS5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGlucHV0UG9zZS5saW5lYXJWZWxvY2l0eSApIHtcclxuXHJcblx0XHRcdFx0XHRcdHRhcmdldFJheS5oYXNMaW5lYXJWZWxvY2l0eSA9IHRydWU7XHJcblx0XHRcdFx0XHRcdHRhcmdldFJheS5saW5lYXJWZWxvY2l0eS5jb3B5KCBpbnB1dFBvc2UubGluZWFyVmVsb2NpdHkgKTtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0dGFyZ2V0UmF5Lmhhc0xpbmVhclZlbG9jaXR5ID0gZmFsc2U7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGlmICggaW5wdXRQb3NlLmFuZ3VsYXJWZWxvY2l0eSApIHtcclxuXHJcblx0XHRcdFx0XHRcdHRhcmdldFJheS5oYXNBbmd1bGFyVmVsb2NpdHkgPSB0cnVlO1xyXG5cdFx0XHRcdFx0XHR0YXJnZXRSYXkuYW5ndWxhclZlbG9jaXR5LmNvcHkoIGlucHV0UG9zZS5hbmd1bGFyVmVsb2NpdHkgKTtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0dGFyZ2V0UmF5Lmhhc0FuZ3VsYXJWZWxvY2l0eSA9IGZhbHNlO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoIF9tb3ZlRXZlbnQgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0YXJnZXRSYXkgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0YXJnZXRSYXkudmlzaWJsZSA9ICggaW5wdXRQb3NlICE9PSBudWxsICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggZ3JpcCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGdyaXAudmlzaWJsZSA9ICggZ3JpcFBvc2UgIT09IG51bGwgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBoYW5kICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0aGFuZC52aXNpYmxlID0gKCBoYW5kUG9zZSAhPT0gbnVsbCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgZ3JvdXAgcmVwcmVzZW50aW5nIHRoZSBoYW5kIGpvaW50IGZvciB0aGUgZ2l2ZW4gaW5wdXQgam9pbnQuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7R3JvdXB9IGhhbmQgLSBUaGUgZ3JvdXAgcmVwcmVzZW50aW5nIHRoZSBoYW5kIHNwYWNlLlxyXG5cdCAqIEBwYXJhbSB7WFJIYW5kSm9pbnR9IGlucHV0am9pbnQgLSBUaGUgWFIgZnJhbWUuXHJcblx0ICogQHJldHVybiB7R3JvdXB9IEEgZ3JvdXAgcmVwcmVzZW50aW5nIHRoZSBoYW5kIGpvaW50IGZvciB0aGUgZ2l2ZW4gaW5wdXQgam9pbnQuXHJcblx0ICovXHJcblx0X2dldEhhbmRKb2ludCggaGFuZCwgaW5wdXRqb2ludCApIHtcclxuXHJcblx0XHRpZiAoIGhhbmQuam9pbnRzWyBpbnB1dGpvaW50LmpvaW50TmFtZSBdID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBqb2ludCA9IG5ldyBHcm91cCgpO1xyXG5cdFx0XHRqb2ludC5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XHJcblx0XHRcdGpvaW50LnZpc2libGUgPSBmYWxzZTtcclxuXHRcdFx0aGFuZC5qb2ludHNbIGlucHV0am9pbnQuam9pbnROYW1lIF0gPSBqb2ludDtcclxuXHJcblx0XHRcdGhhbmQuYWRkKCBqb2ludCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gaGFuZC5qb2ludHNbIGlucHV0am9pbnQuam9pbnROYW1lIF07XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBXZWJYUkNvbnRyb2xsZXIgfTtcclxuIiwiaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi9tYXRoL0NvbG9yLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIHRvIGRlZmluZSBhbiBleHBvbmVudGlhbCBzcXVhcmVkIGZvZyxcclxuICogd2hpY2ggZ2l2ZXMgYSBjbGVhciB2aWV3IG5lYXIgdGhlIGNhbWVyYSBhbmQgYSBmYXN0ZXIgdGhhbiBleHBvbmVudGlhbGx5XHJcbiAqIGRlbnNlbmluZyBmb2cgZmFydGhlciBmcm9tIHRoZSBjYW1lcmEuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IHNjZW5lID0gbmV3IFRIUkVFLlNjZW5lKCk7XHJcbiAqIHNjZW5lLmZvZyA9IG5ldyBUSFJFRS5Gb2dFeHAyKCAweGNjY2NjYywgMC4wMDIgKTtcclxuICogYGBgXHJcbiAqL1xyXG5jbGFzcyBGb2dFeHAyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBmb2cuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcnxDb2xvcn0gY29sb3IgLSBUaGUgZm9nJ3MgY29sb3IuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtkZW5zaXR5PTAuMDAwMjVdIC0gRGVmaW5lcyBob3cgZmFzdCB0aGUgZm9nIHdpbGwgZ3JvdyBkZW5zZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggY29sb3IsIGRlbnNpdHkgPSAwLjAwMDI1ICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0ZvZ0V4cDIgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG5hbWUgb2YgdGhlIGZvZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5hbWUgPSAnJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBmb2cncyBjb2xvci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Q29sb3J9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIGNvbG9yICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiAgRGVmaW5lcyBob3cgZmFzdCB0aGUgZm9nIHdpbGwgZ3JvdyBkZW5zZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMC4wMDAyNVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRlbnNpdHkgPSBkZW5zaXR5O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBuZXcgZm9nIHdpdGggY29waWVkIHZhbHVlcyBmcm9tIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtGb2dFeHAyfSBBIGNsb25lIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y2xvbmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBGb2dFeHAyKCB0aGlzLmNvbG9yLCB0aGlzLmRlbnNpdHkgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXJpYWxpemVzIHRoZSBmb2cgaW50byBKU09OLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHs/KE9iamVjdHxzdHJpbmcpfSBtZXRhIC0gQW4gb3B0aW9uYWwgdmFsdWUgaG9sZGluZyBtZXRhIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZXJpYWxpemF0aW9uLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdH0gQSBKU09OIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNlcmlhbGl6ZWQgZm9nXHJcblx0ICovXHJcblx0dG9KU09OKCAvKiBtZXRhICovICkge1xyXG5cclxuXHRcdHJldHVybiB7XHJcblx0XHRcdHR5cGU6ICdGb2dFeHAyJyxcclxuXHRcdFx0bmFtZTogdGhpcy5uYW1lLFxyXG5cdFx0XHRjb2xvcjogdGhpcy5jb2xvci5nZXRIZXgoKSxcclxuXHRcdFx0ZGVuc2l0eTogdGhpcy5kZW5zaXR5XHJcblx0XHR9O1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBGb2dFeHAyIH07XHJcbiIsImltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vbWF0aC9Db2xvci5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byBkZWZpbmUgYSBsaW5lYXIgZm9nIHRoYXQgZ3Jvd3MgbGluZWFybHkgZGVuc2VyXHJcbiAqIHdpdGggdGhlIGRpc3RhbmNlLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBzY2VuZSA9IG5ldyBUSFJFRS5TY2VuZSgpO1xyXG4gKiBzY2VuZS5mb2cgPSBuZXcgVEhSRUUuRm9nKCAweGNjY2NjYywgMTAsIDE1ICk7XHJcbiAqIGBgYFxyXG4gKi9cclxuY2xhc3MgRm9nIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBmb2cuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcnxDb2xvcn0gY29sb3IgLSBUaGUgZm9nJ3MgY29sb3IuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuZWFyPTFdIC0gVGhlIG1pbmltdW0gZGlzdGFuY2UgdG8gc3RhcnQgYXBwbHlpbmcgZm9nLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZmFyPTEwMDBdIC0gVGhlIG1heGltdW0gZGlzdGFuY2UgYXQgd2hpY2ggZm9nIHN0b3BzIGJlaW5nIGNhbGN1bGF0ZWQgYW5kIGFwcGxpZWQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGNvbG9yLCBuZWFyID0gMSwgZmFyID0gMTAwMCApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNGb2cgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG5hbWUgb2YgdGhlIGZvZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5hbWUgPSAnJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBmb2cncyBjb2xvci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Q29sb3J9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIGNvbG9yICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbWluaW11bSBkaXN0YW5jZSB0byBzdGFydCBhcHBseWluZyBmb2cuIE9iamVjdHMgdGhhdCBhcmUgbGVzcyB0aGFuXHJcblx0XHQgKiBgbmVhcmAgdW5pdHMgZnJvbSB0aGUgYWN0aXZlIGNhbWVyYSB3b24ndCBiZSBhZmZlY3RlZCBieSBmb2cuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5uZWFyID0gbmVhcjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBtYXhpbXVtIGRpc3RhbmNlIGF0IHdoaWNoIGZvZyBzdG9wcyBiZWluZyBjYWxjdWxhdGVkIGFuZCBhcHBsaWVkLlxyXG5cdFx0ICogT2JqZWN0cyB0aGF0IGFyZSBtb3JlIHRoYW4gYGZhcmAgdW5pdHMgYXdheSBmcm9tIHRoZSBhY3RpdmUgY2FtZXJhIHdvbid0XHJcblx0XHQgKiBiZSBhZmZlY3RlZCBieSBmb2cuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDEwMDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5mYXIgPSBmYXI7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIG5ldyBmb2cgd2l0aCBjb3BpZWQgdmFsdWVzIGZyb20gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0ZvZ30gQSBjbG9uZSBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNsb25lKCkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgRm9nKCB0aGlzLmNvbG9yLCB0aGlzLm5lYXIsIHRoaXMuZmFyICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2VyaWFsaXplcyB0aGUgZm9nIGludG8gSlNPTi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7PyhPYmplY3R8c3RyaW5nKX0gbWV0YSAtIEFuIG9wdGlvbmFsIHZhbHVlIGhvbGRpbmcgbWV0YSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VyaWFsaXphdGlvbi5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3R9IEEgSlNPTiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzZXJpYWxpemVkIGZvZ1xyXG5cdCAqL1xyXG5cdHRvSlNPTiggLyogbWV0YSAqLyApIHtcclxuXHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHR0eXBlOiAnRm9nJyxcclxuXHRcdFx0bmFtZTogdGhpcy5uYW1lLFxyXG5cdFx0XHRjb2xvcjogdGhpcy5jb2xvci5nZXRIZXgoKSxcclxuXHRcdFx0bmVhcjogdGhpcy5uZWFyLFxyXG5cdFx0XHRmYXI6IHRoaXMuZmFyXHJcblx0XHR9O1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBGb2cgfTtcclxuIiwiaW1wb3J0IHsgT2JqZWN0M0QgfSBmcm9tICcuLi9jb3JlL09iamVjdDNELmpzJztcclxuaW1wb3J0IHsgRXVsZXIgfSBmcm9tICcuLi9tYXRoL0V1bGVyLmpzJztcclxuXHJcbi8qKlxyXG4gKiBTY2VuZXMgYWxsb3cgeW91IHRvIHNldCB1cCB3aGF0IGlzIHRvIGJlIHJlbmRlcmVkIGFuZCB3aGVyZSBieSB0aHJlZS5qcy5cclxuICogVGhpcyBpcyB3aGVyZSB5b3UgcGxhY2UgM0Qgb2JqZWN0cyBsaWtlIG1lc2hlcywgbGluZXMgb3IgbGlnaHRzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgT2JqZWN0M0RcclxuICovXHJcbmNsYXNzIFNjZW5lIGV4dGVuZHMgT2JqZWN0M0Qge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHNjZW5lLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzU2NlbmUgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdTY2VuZSc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIHRoZSBiYWNrZ3JvdW5kIG9mIHRoZSBzY2VuZS4gVmFsaWQgaW5wdXRzIGFyZTpcclxuXHRcdCAqXHJcblx0XHQgKiAtIEEgY29sb3IgZm9yIGRlZmluaW5nIGEgdW5pZm9ybSBjb2xvcmVkIGJhY2tncm91bmQuXHJcblx0XHQgKiAtIEEgdGV4dHVyZSBmb3IgZGVmaW5pbmcgYSAoZmxhdCkgdGV4dHVyZWQgYmFja2dyb3VuZC5cclxuXHRcdCAqIC0gQ3ViZSB0ZXh0dXJlcyBvciBlcXVpcmVjdGFuZ3VsYXIgdGV4dHVyZXMgZm9yIGRlZmluaW5nIGEgc2t5Ym94LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/KENvbG9yfFRleHR1cmUpfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJhY2tncm91bmQgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU2V0cyB0aGUgZW52aXJvbm1lbnQgbWFwIGZvciBhbGwgcGh5c2ljYWwgbWF0ZXJpYWxzIGluIHRoZSBzY2VuZS4gSG93ZXZlcixcclxuXHRcdCAqIGl0J3Mgbm90IHBvc3NpYmxlIHRvIG92ZXJ3cml0ZSBhbiBleGlzdGluZyB0ZXh0dXJlIGFzc2lnbmVkIHRvIHRoZSBgZW52TWFwYFxyXG5cdFx0ICogbWF0ZXJpYWwgcHJvcGVydHkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmVudmlyb25tZW50ID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgZm9nIGluc3RhbmNlIGRlZmluaW5nIHRoZSB0eXBlIG9mIGZvZyB0aGF0IGFmZmVjdHMgZXZlcnl0aGluZ1xyXG5cdFx0ICogcmVuZGVyZWQgaW4gdGhlIHNjZW5lLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/KEZvZ3xGb2dFeHAyKX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5mb2cgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU2V0cyB0aGUgYmx1cnJpbmVzcyBvZiB0aGUgYmFja2dyb3VuZC4gT25seSBpbmZsdWVuY2VzIGVudmlyb25tZW50IG1hcHNcclxuXHRcdCAqIGFzc2lnbmVkIHRvIHtAbGluayBTY2VuZSNiYWNrZ3JvdW5kfS4gVmFsaWQgaW5wdXQgaXMgYSBmbG9hdCBiZXR3ZWVuIGAwYFxyXG5cdFx0ICogYW5kIGAxYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJhY2tncm91bmRCbHVycmluZXNzID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEF0dGVudWF0ZXMgdGhlIGNvbG9yIG9mIHRoZSBiYWNrZ3JvdW5kLiBPbmx5IGFwcGxpZXMgdG8gYmFja2dyb3VuZCB0ZXh0dXJlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJhY2tncm91bmRJbnRlbnNpdHkgPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJvdGF0aW9uIG9mIHRoZSBiYWNrZ3JvdW5kIGluIHJhZGlhbnMuIE9ubHkgaW5mbHVlbmNlcyBlbnZpcm9ubWVudCBtYXBzXHJcblx0XHQgKiBhc3NpZ25lZCB0byB7QGxpbmsgU2NlbmUjYmFja2dyb3VuZH0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0V1bGVyfVxyXG5cdFx0ICogQGRlZmF1bHQgKDAsMCwwKVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJhY2tncm91bmRSb3RhdGlvbiA9IG5ldyBFdWxlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQXR0ZW51YXRlcyB0aGUgY29sb3Igb2YgdGhlIGVudmlyb25tZW50LiBPbmx5IGluZmx1ZW5jZXMgZW52aXJvbm1lbnQgbWFwc1xyXG5cdFx0ICogYXNzaWduZWQgdG8ge0BsaW5rIFNjZW5lI2Vudmlyb25tZW50fS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmVudmlyb25tZW50SW50ZW5zaXR5ID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByb3RhdGlvbiBvZiB0aGUgZW52aXJvbm1lbnQgbWFwIGluIHJhZGlhbnMuIE9ubHkgaW5mbHVlbmNlcyBwaHlzaWNhbCBtYXRlcmlhbHNcclxuXHRcdCAqIGluIHRoZSBzY2VuZSB3aGVuIHtAbGluayBTY2VuZSNlbnZpcm9ubWVudH0gaXMgdXNlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7RXVsZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAoMCwwLDApXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZW52aXJvbm1lbnRSb3RhdGlvbiA9IG5ldyBFdWxlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRm9yY2VzIGV2ZXJ5dGhpbmcgaW4gdGhlIHNjZW5lIHRvIGJlIHJlbmRlcmVkIHdpdGggdGhlIGRlZmluZWQgbWF0ZXJpYWwuIEl0IGlzIHBvc3NpYmxlXHJcblx0XHQgKiB0byBleGNsdWRlIG1hdGVyaWFscyBmcm9tIG92ZXJyaWRlIGJ5IHNldHRpbmcge0BsaW5rIE1hdGVyaWFsI2FsbG93T3ZlcnJpZGV9IHRvIGBmYWxzZWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9NYXRlcmlhbH1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5vdmVycmlkZU1hdGVyaWFsID0gbnVsbDtcclxuXHJcblx0XHRpZiAoIHR5cGVvZiBfX1RIUkVFX0RFVlRPT0xTX18gIT09ICd1bmRlZmluZWQnICkge1xyXG5cclxuXHRcdFx0X19USFJFRV9ERVZUT09MU19fLmRpc3BhdGNoRXZlbnQoIG5ldyBDdXN0b21FdmVudCggJ29ic2VydmUnLCB7IGRldGFpbDogdGhpcyB9ICkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlLCByZWN1cnNpdmUgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlLCByZWN1cnNpdmUgKTtcclxuXHJcblx0XHRpZiAoIHNvdXJjZS5iYWNrZ3JvdW5kICE9PSBudWxsICkgdGhpcy5iYWNrZ3JvdW5kID0gc291cmNlLmJhY2tncm91bmQuY2xvbmUoKTtcclxuXHRcdGlmICggc291cmNlLmVudmlyb25tZW50ICE9PSBudWxsICkgdGhpcy5lbnZpcm9ubWVudCA9IHNvdXJjZS5lbnZpcm9ubWVudC5jbG9uZSgpO1xyXG5cdFx0aWYgKCBzb3VyY2UuZm9nICE9PSBudWxsICkgdGhpcy5mb2cgPSBzb3VyY2UuZm9nLmNsb25lKCk7XHJcblxyXG5cdFx0dGhpcy5iYWNrZ3JvdW5kQmx1cnJpbmVzcyA9IHNvdXJjZS5iYWNrZ3JvdW5kQmx1cnJpbmVzcztcclxuXHRcdHRoaXMuYmFja2dyb3VuZEludGVuc2l0eSA9IHNvdXJjZS5iYWNrZ3JvdW5kSW50ZW5zaXR5O1xyXG5cdFx0dGhpcy5iYWNrZ3JvdW5kUm90YXRpb24uY29weSggc291cmNlLmJhY2tncm91bmRSb3RhdGlvbiApO1xyXG5cclxuXHRcdHRoaXMuZW52aXJvbm1lbnRJbnRlbnNpdHkgPSBzb3VyY2UuZW52aXJvbm1lbnRJbnRlbnNpdHk7XHJcblx0XHR0aGlzLmVudmlyb25tZW50Um90YXRpb24uY29weSggc291cmNlLmVudmlyb25tZW50Um90YXRpb24gKTtcclxuXHJcblx0XHRpZiAoIHNvdXJjZS5vdmVycmlkZU1hdGVyaWFsICE9PSBudWxsICkgdGhpcy5vdmVycmlkZU1hdGVyaWFsID0gc291cmNlLm92ZXJyaWRlTWF0ZXJpYWwuY2xvbmUoKTtcclxuXHJcblx0XHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBzb3VyY2UubWF0cml4QXV0b1VwZGF0ZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHR0b0pTT04oIG1ldGEgKSB7XHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IHN1cGVyLnRvSlNPTiggbWV0YSApO1xyXG5cclxuXHRcdGlmICggdGhpcy5mb2cgIT09IG51bGwgKSBkYXRhLm9iamVjdC5mb2cgPSB0aGlzLmZvZy50b0pTT04oKTtcclxuXHJcblx0XHRpZiAoIHRoaXMuYmFja2dyb3VuZEJsdXJyaW5lc3MgPiAwICkgZGF0YS5vYmplY3QuYmFja2dyb3VuZEJsdXJyaW5lc3MgPSB0aGlzLmJhY2tncm91bmRCbHVycmluZXNzO1xyXG5cdFx0aWYgKCB0aGlzLmJhY2tncm91bmRJbnRlbnNpdHkgIT09IDEgKSBkYXRhLm9iamVjdC5iYWNrZ3JvdW5kSW50ZW5zaXR5ID0gdGhpcy5iYWNrZ3JvdW5kSW50ZW5zaXR5O1xyXG5cdFx0ZGF0YS5vYmplY3QuYmFja2dyb3VuZFJvdGF0aW9uID0gdGhpcy5iYWNrZ3JvdW5kUm90YXRpb24udG9BcnJheSgpO1xyXG5cclxuXHRcdGlmICggdGhpcy5lbnZpcm9ubWVudEludGVuc2l0eSAhPT0gMSApIGRhdGEub2JqZWN0LmVudmlyb25tZW50SW50ZW5zaXR5ID0gdGhpcy5lbnZpcm9ubWVudEludGVuc2l0eTtcclxuXHRcdGRhdGEub2JqZWN0LmVudmlyb25tZW50Um90YXRpb24gPSB0aGlzLmVudmlyb25tZW50Um90YXRpb24udG9BcnJheSgpO1xyXG5cclxuXHRcdHJldHVybiBkYXRhO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBTY2VuZSB9O1xyXG4iLCJpbXBvcnQgeyBnZW5lcmF0ZVVVSUQgfSBmcm9tICcuLi9tYXRoL01hdGhVdGlscy5qcyc7XHJcbmltcG9ydCB7IFN0YXRpY0RyYXdVc2FnZSB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XHJcblxyXG4vKipcclxuICogXCJJbnRlcmxlYXZlZFwiIG1lYW5zIHRoYXQgbXVsdGlwbGUgYXR0cmlidXRlcywgcG9zc2libHkgb2YgZGlmZmVyZW50IHR5cGVzLFxyXG4gKiAoZS5nLiwgcG9zaXRpb24sIG5vcm1hbCwgdXYsIGNvbG9yKSBhcmUgcGFja2VkIGludG8gYSBzaW5nbGUgYXJyYXkgYnVmZmVyLlxyXG4gKlxyXG4gKiBBbiBpbnRyb2R1Y3Rpb24gaW50byBpbnRlcmxlYXZlZCBhcnJheXMgY2FuIGJlIGZvdW5kIGhlcmU6IFtJbnRlcmxlYXZlZCBhcnJheSBiYXNpY3Nde0BsaW5rIGh0dHBzOi8vYmxvZy50b2ppY29kZS5jb20vMjAxMS8wNS9pbnRlcmxlYXZlZC1hcnJheS1iYXNpY3MuaHRtbH1cclxuICovXHJcbmNsYXNzIEludGVybGVhdmVkQnVmZmVyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBpbnRlcmxlYXZlZCBidWZmZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1R5cGVkQXJyYXl9IGFycmF5IC0gQSB0eXBlZCBhcnJheSB3aXRoIGEgc2hhcmVkIGJ1ZmZlciBzdG9yaW5nIGF0dHJpYnV0ZSBkYXRhLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzdHJpZGUgLSBUaGUgbnVtYmVyIG9mIHR5cGVkLWFycmF5IGVsZW1lbnRzIHBlciB2ZXJ0ZXguXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGFycmF5LCBzdHJpZGUgKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzSW50ZXJsZWF2ZWRCdWZmZXIgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSB0eXBlZCBhcnJheSB3aXRoIGEgc2hhcmVkIGJ1ZmZlciBzdG9yaW5nIGF0dHJpYnV0ZSBkYXRhLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtUeXBlZEFycmF5fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFycmF5ID0gYXJyYXk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbnVtYmVyIG9mIHR5cGVkLWFycmF5IGVsZW1lbnRzIHBlciB2ZXJ0ZXguXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zdHJpZGUgPSBzdHJpZGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdG90YWwgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBhcnJheVxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb3VudCA9IGFycmF5ICE9PSB1bmRlZmluZWQgPyBhcnJheS5sZW5ndGggLyBzdHJpZGUgOiAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyB0aGUgaW50ZW5kZWQgdXNhZ2UgcGF0dGVybiBvZiB0aGUgZGF0YSBzdG9yZSBmb3Igb3B0aW1pemF0aW9uIHB1cnBvc2VzLlxyXG5cdFx0ICpcclxuXHRcdCAqIE5vdGU6IEFmdGVyIHRoZSBpbml0aWFsIHVzZSBvZiBhIGJ1ZmZlciwgaXRzIHVzYWdlIGNhbm5vdCBiZSBjaGFuZ2VkLiBJbnN0ZWFkLFxyXG5cdFx0ICogaW5zdGFudGlhdGUgYSBuZXcgb25lIGFuZCBzZXQgdGhlIGRlc2lyZWQgdXNhZ2UgYmVmb3JlIHRoZSBuZXh0IHJlbmRlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KFN0YXRpY0RyYXdVc2FnZXxEeW5hbWljRHJhd1VzYWdlfFN0cmVhbURyYXdVc2FnZXxTdGF0aWNSZWFkVXNhZ2V8RHluYW1pY1JlYWRVc2FnZXxTdHJlYW1SZWFkVXNhZ2V8U3RhdGljQ29weVVzYWdlfER5bmFtaWNDb3B5VXNhZ2V8U3RyZWFtQ29weVVzYWdlKX1cclxuXHRcdCAqIEBkZWZhdWx0IFN0YXRpY0RyYXdVc2FnZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVzYWdlID0gU3RhdGljRHJhd1VzYWdlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBjYW4gYmUgdXNlZCB0byBvbmx5IHVwZGF0ZSBzb21lIGNvbXBvbmVudHMgb2Ygc3RvcmVkIHZlY3RvcnMgKGZvciBleGFtcGxlLCBqdXN0IHRoZVxyXG5cdFx0ICogY29tcG9uZW50IHJlbGF0ZWQgdG8gY29sb3IpLiBVc2UgdGhlIGBhZGRVcGRhdGVSYW5nZSgpYCBmdW5jdGlvbiB0byBhZGQgcmFuZ2VzIHRvIHRoaXMgYXJyYXkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PE9iamVjdD59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXBkYXRlUmFuZ2VzID0gW107XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHZlcnNpb24gbnVtYmVyLCBpbmNyZW1lbnRlZCBldmVyeSB0aW1lIHRoZSBgbmVlZHNVcGRhdGVgIGlzIHNldCB0byBgdHJ1ZWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52ZXJzaW9uID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBVVUlEIG9mIHRoZSBpbnRlcmxlYXZlZCBidWZmZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnV1aWQgPSBnZW5lcmF0ZVVVSUQoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgZXhlY3V0ZWQgYWZ0ZXIgdGhlIHJlbmRlcmVyIGhhcyB0cmFuc2ZlcnJlZCB0aGUgYXR0cmlidXRlIGFycmF5XHJcblx0ICogZGF0YSB0byB0aGUgR1BVLlxyXG5cdCAqL1xyXG5cdG9uVXBsb2FkQ2FsbGJhY2soKSB7fVxyXG5cclxuXHQvKipcclxuXHQgKiBGbGFnIHRvIGluZGljYXRlIHRoYXQgdGhpcyBhdHRyaWJ1dGUgaGFzIGNoYW5nZWQgYW5kIHNob3VsZCBiZSByZS1zZW50IHRvXHJcblx0ICogdGhlIEdQVS4gU2V0IHRoaXMgdG8gYHRydWVgIHdoZW4geW91IG1vZGlmeSB0aGUgdmFsdWUgb2YgdGhlIGFycmF5LlxyXG5cdCAqXHJcblx0ICogQHR5cGUge251bWJlcn1cclxuXHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsdWVcclxuXHQgKi9cclxuXHRzZXQgbmVlZHNVcGRhdGUoIHZhbHVlICkge1xyXG5cclxuXHRcdGlmICggdmFsdWUgPT09IHRydWUgKSB0aGlzLnZlcnNpb24gKys7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdXNhZ2Ugb2YgdGhpcyBpbnRlcmxlYXZlZCBidWZmZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geyhTdGF0aWNEcmF3VXNhZ2V8RHluYW1pY0RyYXdVc2FnZXxTdHJlYW1EcmF3VXNhZ2V8U3RhdGljUmVhZFVzYWdlfER5bmFtaWNSZWFkVXNhZ2V8U3RyZWFtUmVhZFVzYWdlfFN0YXRpY0NvcHlVc2FnZXxEeW5hbWljQ29weVVzYWdlfFN0cmVhbUNvcHlVc2FnZSl9IHZhbHVlIC0gVGhlIHVzYWdlIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtJbnRlcmxlYXZlZEJ1ZmZlcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnRlcmxlYXZlZCBidWZmZXIuXHJcblx0ICovXHJcblx0c2V0VXNhZ2UoIHZhbHVlICkge1xyXG5cclxuXHRcdHRoaXMudXNhZ2UgPSB2YWx1ZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIGEgcmFuZ2Ugb2YgZGF0YSBpbiB0aGUgZGF0YSBhcnJheSB0byBiZSB1cGRhdGVkIG9uIHRoZSBHUFUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgLSBQb3NpdGlvbiBhdCB3aGljaCB0byBzdGFydCB1cGRhdGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGNvdW50IC0gVGhlIG51bWJlciBvZiBjb21wb25lbnRzIHRvIHVwZGF0ZS5cclxuXHQgKi9cclxuXHRhZGRVcGRhdGVSYW5nZSggc3RhcnQsIGNvdW50ICkge1xyXG5cclxuXHRcdHRoaXMudXBkYXRlUmFuZ2VzLnB1c2goIHsgc3RhcnQsIGNvdW50IH0gKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDbGVhcnMgdGhlIHVwZGF0ZSByYW5nZXMuXHJcblx0ICovXHJcblx0Y2xlYXJVcGRhdGVSYW5nZXMoKSB7XHJcblxyXG5cdFx0dGhpcy51cGRhdGVSYW5nZXMubGVuZ3RoID0gMDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gaW50ZXJsZWF2ZWQgYnVmZmVyIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0ludGVybGVhdmVkQnVmZmVyfSBzb3VyY2UgLSBUaGUgaW50ZXJsZWF2ZWQgYnVmZmVyIHRvIGNvcHkuXHJcblx0ICogQHJldHVybiB7SW50ZXJsZWF2ZWRCdWZmZXJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHRoaXMuYXJyYXkgPSBuZXcgc291cmNlLmFycmF5LmNvbnN0cnVjdG9yKCBzb3VyY2UuYXJyYXkgKTtcclxuXHRcdHRoaXMuY291bnQgPSBzb3VyY2UuY291bnQ7XHJcblx0XHR0aGlzLnN0cmlkZSA9IHNvdXJjZS5zdHJpZGU7XHJcblx0XHR0aGlzLnVzYWdlID0gc291cmNlLnVzYWdlO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvcGllcyBhIHZlY3RvciBmcm9tIHRoZSBnaXZlbiBpbnRlcmxlYXZlZCBidWZmZXIgdG8gdGhpcyBvbmUuIFRoZSBzdGFydFxyXG5cdCAqIGFuZCBkZXN0aW5hdGlvbiBwb3NpdGlvbiBpbiB0aGUgYXR0cmlidXRlIGJ1ZmZlcnMgYXJlIHJlcHJlc2VudGVkIGJ5IHRoZVxyXG5cdCAqIGdpdmVuIGluZGljZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXgxIC0gVGhlIGRlc3RpbmF0aW9uIGluZGV4IGludG8gdGhpcyBpbnRlcmxlYXZlZCBidWZmZXIuXHJcblx0ICogQHBhcmFtIHtJbnRlcmxlYXZlZEJ1ZmZlcn0gaW50ZXJsZWF2ZWRCdWZmZXIgLSBUaGUgaW50ZXJsZWF2ZWQgYnVmZmVyIHRvIGNvcHkgZnJvbS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXgyIC0gVGhlIHNvdXJjZSBpbmRleCBpbnRvIHRoZSBnaXZlbiBpbnRlcmxlYXZlZCBidWZmZXIuXHJcblx0ICogQHJldHVybiB7SW50ZXJsZWF2ZWRCdWZmZXJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y29weUF0KCBpbmRleDEsIGludGVybGVhdmVkQnVmZmVyLCBpbmRleDIgKSB7XHJcblxyXG5cdFx0aW5kZXgxICo9IHRoaXMuc3RyaWRlO1xyXG5cdFx0aW5kZXgyICo9IGludGVybGVhdmVkQnVmZmVyLnN0cmlkZTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSB0aGlzLnN0cmlkZTsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmFycmF5WyBpbmRleDEgKyBpIF0gPSBpbnRlcmxlYXZlZEJ1ZmZlci5hcnJheVsgaW5kZXgyICsgaSBdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBnaXZlbiBhcnJheSBkYXRhIGluIHRoZSBpbnRlcmxlYXZlZCBidWZmZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geyhUeXBlZEFycmF5fEFycmF5KX0gdmFsdWUgLSBUaGUgYXJyYXkgZGF0YSB0byBzZXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXQ9MF0gLSBUaGUgb2Zmc2V0IGluIHRoaXMgaW50ZXJsZWF2ZWQgYnVmZmVyJ3MgYXJyYXkuXHJcblx0ICogQHJldHVybiB7SW50ZXJsZWF2ZWRCdWZmZXJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0KCB2YWx1ZSwgb2Zmc2V0ID0gMCApIHtcclxuXHJcblx0XHR0aGlzLmFycmF5LnNldCggdmFsdWUsIG9mZnNldCApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBuZXcgaW50ZXJsZWF2ZWQgYnVmZmVyIHdpdGggY29waWVkIHZhbHVlcyBmcm9tIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW2RhdGFdIC0gQW4gb2JqZWN0IHdpdGggc2hhcmVkIGFycmF5IGJ1ZmZlcnMgdGhhdCBhbGxvd3MgdG8gcmV0YWluIHNoYXJlZCBzdHJ1Y3R1cmVzLlxyXG5cdCAqIEByZXR1cm4ge0ludGVybGVhdmVkQnVmZmVyfSBBIGNsb25lIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y2xvbmUoIGRhdGEgKSB7XHJcblxyXG5cdFx0aWYgKCBkYXRhLmFycmF5QnVmZmVycyA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0ZGF0YS5hcnJheUJ1ZmZlcnMgPSB7fTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZCA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0dGhpcy5hcnJheS5idWZmZXIuX3V1aWQgPSBnZW5lcmF0ZVVVSUQoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBkYXRhLmFycmF5QnVmZmVyc1sgdGhpcy5hcnJheS5idWZmZXIuX3V1aWQgXSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0ZGF0YS5hcnJheUJ1ZmZlcnNbIHRoaXMuYXJyYXkuYnVmZmVyLl91dWlkIF0gPSB0aGlzLmFycmF5LnNsaWNlKCAwICkuYnVmZmVyO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBhcnJheSA9IG5ldyB0aGlzLmFycmF5LmNvbnN0cnVjdG9yKCBkYXRhLmFycmF5QnVmZmVyc1sgdGhpcy5hcnJheS5idWZmZXIuX3V1aWQgXSApO1xyXG5cclxuXHRcdGNvbnN0IGliID0gbmV3IHRoaXMuY29uc3RydWN0b3IoIGFycmF5LCB0aGlzLnN0cmlkZSApO1xyXG5cdFx0aWIuc2V0VXNhZ2UoIHRoaXMudXNhZ2UgKTtcclxuXHJcblx0XHRyZXR1cm4gaWI7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZ2l2ZW4gY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBleGVjdXRlZCBhZnRlciB0aGUgUmVuZGVyZXIgaGFzIHRyYW5zZmVycmVkXHJcblx0ICogdGhlIGFycmF5IGRhdGEgdG8gdGhlIEdQVS4gQ2FuIGJlIHVzZWQgdG8gcGVyZm9ybSBjbGVhbi11cCBvcGVyYXRpb25zIGFmdGVyXHJcblx0ICogdGhlIHVwbG9hZCB3aGVuIGRhdGEgYXJlIG5vdCBuZWVkZWQgYW55bW9yZSBvbiB0aGUgQ1BVIHNpZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayAtIFRoZSBgb25VcGxvYWQoKWAgY2FsbGJhY2suXHJcblx0ICogQHJldHVybiB7SW50ZXJsZWF2ZWRCdWZmZXJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0b25VcGxvYWQoIGNhbGxiYWNrICkge1xyXG5cclxuXHRcdHRoaXMub25VcGxvYWRDYWxsYmFjayA9IGNhbGxiYWNrO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNlcmlhbGl6ZXMgdGhlIGludGVybGVhdmVkIGJ1ZmZlciBpbnRvIEpTT04uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW2RhdGFdIC0gQW4gb3B0aW9uYWwgdmFsdWUgaG9sZGluZyBtZXRhIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZXJpYWxpemF0aW9uLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdH0gQSBKU09OIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNlcmlhbGl6ZWQgaW50ZXJsZWF2ZWQgYnVmZmVyLlxyXG5cdCAqL1xyXG5cdHRvSlNPTiggZGF0YSApIHtcclxuXHJcblx0XHRpZiAoIGRhdGEuYXJyYXlCdWZmZXJzID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRkYXRhLmFycmF5QnVmZmVycyA9IHt9O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBnZW5lcmF0ZSBVVUlEIGZvciBhcnJheSBidWZmZXIgaWYgbmVjZXNzYXJ5XHJcblxyXG5cdFx0aWYgKCB0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZCA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0dGhpcy5hcnJheS5idWZmZXIuX3V1aWQgPSBnZW5lcmF0ZVVVSUQoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBkYXRhLmFycmF5QnVmZmVyc1sgdGhpcy5hcnJheS5idWZmZXIuX3V1aWQgXSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0ZGF0YS5hcnJheUJ1ZmZlcnNbIHRoaXMuYXJyYXkuYnVmZmVyLl91dWlkIF0gPSBBcnJheS5mcm9tKCBuZXcgVWludDMyQXJyYXkoIHRoaXMuYXJyYXkuYnVmZmVyICkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHR1dWlkOiB0aGlzLnV1aWQsXHJcblx0XHRcdGJ1ZmZlcjogdGhpcy5hcnJheS5idWZmZXIuX3V1aWQsXHJcblx0XHRcdHR5cGU6IHRoaXMuYXJyYXkuY29uc3RydWN0b3IubmFtZSxcclxuXHRcdFx0c3RyaWRlOiB0aGlzLnN0cmlkZVxyXG5cdFx0fTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgSW50ZXJsZWF2ZWRCdWZmZXIgfTtcclxuIiwiaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcbmltcG9ydCB7IEJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4vQnVmZmVyQXR0cmlidXRlLmpzJztcclxuaW1wb3J0IHsgZGVub3JtYWxpemUsIG5vcm1hbGl6ZSB9IGZyb20gJy4uL21hdGgvTWF0aFV0aWxzLmpzJztcclxuXHJcbmNvbnN0IF92ZWN0b3IgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcblxyXG4vKipcclxuICogQW4gYWx0ZXJuYXRpdmUgdmVyc2lvbiBvZiBhIGJ1ZmZlciBhdHRyaWJ1dGUgd2l0aCBpbnRlcmxlYXZlZCBkYXRhLiBJbnRlcmxlYXZlZFxyXG4gKiBhdHRyaWJ1dGVzIHNoYXJlIGEgY29tbW9uIGludGVybGVhdmVkIGRhdGEgc3RvcmFnZSAoe0BsaW5rIEludGVybGVhdmVkQnVmZmVyfSkgYW5kIHJlZmVyIHdpdGhcclxuICogZGlmZmVyZW50IG9mZnNldHMgaW50byB0aGUgYnVmZmVyLlxyXG4gKi9cclxuY2xhc3MgSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGludGVybGVhdmVkIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0ludGVybGVhdmVkQnVmZmVyfSBpbnRlcmxlYXZlZEJ1ZmZlciAtIFRoZSBidWZmZXIgaG9sZGluZyB0aGUgaW50ZXJsZWF2ZWQgZGF0YS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaXRlbVNpemUgLSBUaGUgaXRlbSBzaXplLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBvZmZzZXQgLSBUaGUgYXR0cmlidXRlIG9mZnNldCBpbnRvIHRoZSBidWZmZXIuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbbm9ybWFsaXplZD1mYWxzZV0gLSBXaGV0aGVyIHRoZSBkYXRhIGFyZSBub3JtYWxpemVkIG9yIG5vdC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggaW50ZXJsZWF2ZWRCdWZmZXIsIGl0ZW1TaXplLCBvZmZzZXQsIG5vcm1hbGl6ZWQgPSBmYWxzZSApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbmFtZSBvZiB0aGUgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5hbWUgPSAnJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBidWZmZXIgaG9sZGluZyB0aGUgaW50ZXJsZWF2ZWQgZGF0YS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7SW50ZXJsZWF2ZWRCdWZmZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGF0YSA9IGludGVybGVhdmVkQnVmZmVyO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGl0ZW0gc2l6ZSwgc2VlIHtAbGluayBCdWZmZXJBdHRyaWJ1dGUjaXRlbVNpemV9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXRlbVNpemUgPSBpdGVtU2l6ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBhdHRyaWJ1dGUgb2Zmc2V0IGludG8gdGhlIGJ1ZmZlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm9mZnNldCA9IG9mZnNldDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIGRhdGEgYXJlIG5vcm1hbGl6ZWQgb3Igbm90LCBzZWUge0BsaW5rIEJ1ZmZlckF0dHJpYnV0ZSNub3JtYWxpemVkfVxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtJbnRlcmxlYXZlZEJ1ZmZlcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub3JtYWxpemVkID0gbm9ybWFsaXplZDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgaXRlbSBjb3VudCBvZiB0aGlzIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdCAqIEByZWFkb25seVxyXG5cdCAqL1xyXG5cdGdldCBjb3VudCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5kYXRhLmNvdW50O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBhcnJheSBob2xkaW5nIHRoZSBpbnRlcmxlYXZlZCBidWZmZXIgYXR0cmlidXRlIGRhdGEuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7VHlwZWRBcnJheX1cclxuXHQgKi9cclxuXHRnZXQgYXJyYXkoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5hcnJheTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGbGFnIHRvIGluZGljYXRlIHRoYXQgdGhpcyBhdHRyaWJ1dGUgaGFzIGNoYW5nZWQgYW5kIHNob3VsZCBiZSByZS1zZW50IHRvXHJcblx0ICogdGhlIEdQVS4gU2V0IHRoaXMgdG8gYHRydWVgIHdoZW4geW91IG1vZGlmeSB0aGUgdmFsdWUgb2YgdGhlIGFycmF5LlxyXG5cdCAqXHJcblx0ICogQHR5cGUge251bWJlcn1cclxuXHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsdWVcclxuXHQgKi9cclxuXHRzZXQgbmVlZHNVcGRhdGUoIHZhbHVlICkge1xyXG5cclxuXHRcdHRoaXMuZGF0YS5uZWVkc1VwZGF0ZSA9IHZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFwcGxpZXMgdGhlIGdpdmVuIDR4NCBtYXRyaXggdG8gdGhlIGdpdmVuIGF0dHJpYnV0ZS4gT25seSB3b3JrcyB3aXRoXHJcblx0ICogaXRlbSBzaXplIGAzYC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4NH0gbSAtIFRoZSBtYXRyaXggdG8gYXBwbHkuXHJcblx0ICogQHJldHVybiB7SW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0YXBwbHlNYXRyaXg0KCBtICkge1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHRoaXMuZGF0YS5jb3VudDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRfdmVjdG9yLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHRoaXMsIGkgKTtcclxuXHJcblx0XHRcdF92ZWN0b3IuYXBwbHlNYXRyaXg0KCBtICk7XHJcblxyXG5cdFx0XHR0aGlzLnNldFhZWiggaSwgX3ZlY3Rvci54LCBfdmVjdG9yLnksIF92ZWN0b3IueiApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBcHBsaWVzIHRoZSBnaXZlbiAzeDMgbm9ybWFsIG1hdHJpeCB0byB0aGUgZ2l2ZW4gYXR0cmlidXRlLiBPbmx5IHdvcmtzIHdpdGhcclxuXHQgKiBpdGVtIHNpemUgYDNgLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRyaXgzfSBtIC0gVGhlIG5vcm1hbCBtYXRyaXggdG8gYXBwbHkuXHJcblx0ICogQHJldHVybiB7SW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0YXBwbHlOb3JtYWxNYXRyaXgoIG0gKSB7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gdGhpcy5jb3VudDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRfdmVjdG9yLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHRoaXMsIGkgKTtcclxuXHJcblx0XHRcdF92ZWN0b3IuYXBwbHlOb3JtYWxNYXRyaXgoIG0gKTtcclxuXHJcblx0XHRcdHRoaXMuc2V0WFlaKCBpLCBfdmVjdG9yLngsIF92ZWN0b3IueSwgX3ZlY3Rvci56ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFwcGxpZXMgdGhlIGdpdmVuIDR4NCBtYXRyaXggdG8gdGhlIGdpdmVuIGF0dHJpYnV0ZS4gT25seSB3b3JrcyB3aXRoXHJcblx0ICogaXRlbSBzaXplIGAzYCBhbmQgd2l0aCBkaXJlY3Rpb24gdmVjdG9ycy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4NH0gbSAtIFRoZSBtYXRyaXggdG8gYXBwbHkuXHJcblx0ICogQHJldHVybiB7SW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0dHJhbnNmb3JtRGlyZWN0aW9uKCBtICkge1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHRoaXMuY291bnQ7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0X3ZlY3Rvci5mcm9tQnVmZmVyQXR0cmlidXRlKCB0aGlzLCBpICk7XHJcblxyXG5cdFx0XHRfdmVjdG9yLnRyYW5zZm9ybURpcmVjdGlvbiggbSApO1xyXG5cclxuXHRcdFx0dGhpcy5zZXRYWVooIGksIF92ZWN0b3IueCwgX3ZlY3Rvci55LCBfdmVjdG9yLnogKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgZ2l2ZW4gY29tcG9uZW50IG9mIHRoZSB2ZWN0b3IgYXQgdGhlIGdpdmVuIGluZGV4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluZGV4IGludG8gdGhlIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGNvbXBvbmVudCAtIFRoZSBjb21wb25lbnQgaW5kZXguXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgcmV0dXJuZWQgdmFsdWUuXHJcblx0ICovXHJcblx0Z2V0Q29tcG9uZW50KCBpbmRleCwgY29tcG9uZW50ICkge1xyXG5cclxuXHRcdGxldCB2YWx1ZSA9IHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0ICsgY29tcG9uZW50IF07XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5vcm1hbGl6ZWQgKSB2YWx1ZSA9IGRlbm9ybWFsaXplKCB2YWx1ZSwgdGhpcy5hcnJheSApO1xyXG5cclxuXHRcdHJldHVybiB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBnaXZlbiB2YWx1ZSB0byB0aGUgZ2l2ZW4gY29tcG9uZW50IG9mIHRoZSB2ZWN0b3IgYXQgdGhlIGdpdmVuIGluZGV4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluZGV4IGludG8gdGhlIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGNvbXBvbmVudCAtIFRoZSBjb21wb25lbnQgaW5kZXguXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXRDb21wb25lbnQoIGluZGV4LCBjb21wb25lbnQsIHZhbHVlICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5ub3JtYWxpemVkICkgdmFsdWUgPSBub3JtYWxpemUoIHZhbHVlLCB0aGlzLmFycmF5ICk7XHJcblxyXG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIGNvbXBvbmVudCBdID0gdmFsdWU7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgeCBjb21wb25lbnQgb2YgdGhlIHZlY3RvciBhdCB0aGUgZ2l2ZW4gaW5kZXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggaW50byB0aGUgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB2YWx1ZSB0byBzZXQuXHJcblx0ICogQHJldHVybiB7SW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0WCggaW5kZXgsIHggKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5vcm1hbGl6ZWQgKSB4ID0gbm9ybWFsaXplKCB4LCB0aGlzLmFycmF5ICk7XHJcblxyXG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCBdID0geDtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB5IGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yIGF0IHRoZSBnaXZlbiBpbmRleC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBpbnRvIHRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHZhbHVlIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXRZKCBpbmRleCwgeSApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMubm9ybWFsaXplZCApIHkgPSBub3JtYWxpemUoIHksIHRoaXMuYXJyYXkgKTtcclxuXHJcblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0ICsgMSBdID0geTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB6IGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yIGF0IHRoZSBnaXZlbiBpbmRleC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBpbnRvIHRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB6IC0gVGhlIHZhbHVlIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXRaKCBpbmRleCwgeiApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMubm9ybWFsaXplZCApIHogPSBub3JtYWxpemUoIHosIHRoaXMuYXJyYXkgKTtcclxuXHJcblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0ICsgMiBdID0gejtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB3IGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yIGF0IHRoZSBnaXZlbiBpbmRleC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBpbnRvIHRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB3IC0gVGhlIHZhbHVlIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXRXKCBpbmRleCwgdyApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMubm9ybWFsaXplZCApIHcgPSBub3JtYWxpemUoIHcsIHRoaXMuYXJyYXkgKTtcclxuXHJcblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0ICsgMyBdID0gdztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSB4IGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yIGF0IHRoZSBnaXZlbiBpbmRleC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBpbnRvIHRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIHggY29tcG9uZW50LlxyXG5cdCAqL1xyXG5cdGdldFgoIGluZGV4ICkge1xyXG5cclxuXHRcdGxldCB4ID0gdGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCBdO1xyXG5cclxuXHRcdGlmICggdGhpcy5ub3JtYWxpemVkICkgeCA9IGRlbm9ybWFsaXplKCB4LCB0aGlzLmFycmF5ICk7XHJcblxyXG5cdFx0cmV0dXJuIHg7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgeSBjb21wb25lbnQgb2YgdGhlIHZlY3RvciBhdCB0aGUgZ2l2ZW4gaW5kZXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggaW50byB0aGUgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB5IGNvbXBvbmVudC5cclxuXHQgKi9cclxuXHRnZXRZKCBpbmRleCApIHtcclxuXHJcblx0XHRsZXQgeSA9IHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgKyAxIF07XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5vcm1hbGl6ZWQgKSB5ID0gZGVub3JtYWxpemUoIHksIHRoaXMuYXJyYXkgKTtcclxuXHJcblx0XHRyZXR1cm4geTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSB6IGNvbXBvbmVudCBvZiB0aGUgdmVjdG9yIGF0IHRoZSBnaXZlbiBpbmRleC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBpbnRvIHRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIHogY29tcG9uZW50LlxyXG5cdCAqL1xyXG5cdGdldFooIGluZGV4ICkge1xyXG5cclxuXHRcdGxldCB6ID0gdGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDIgXTtcclxuXHJcblx0XHRpZiAoIHRoaXMubm9ybWFsaXplZCApIHogPSBkZW5vcm1hbGl6ZSggeiwgdGhpcy5hcnJheSApO1xyXG5cclxuXHRcdHJldHVybiB6O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHcgY29tcG9uZW50IG9mIHRoZSB2ZWN0b3IgYXQgdGhlIGdpdmVuIGluZGV4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluZGV4IGludG8gdGhlIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgdyBjb21wb25lbnQuXHJcblx0ICovXHJcblx0Z2V0VyggaW5kZXggKSB7XHJcblxyXG5cdFx0bGV0IHcgPSB0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0ICsgMyBdO1xyXG5cclxuXHRcdGlmICggdGhpcy5ub3JtYWxpemVkICkgdyA9IGRlbm9ybWFsaXplKCB3LCB0aGlzLmFycmF5ICk7XHJcblxyXG5cdFx0cmV0dXJuIHc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgeCBhbmQgeSBjb21wb25lbnQgb2YgdGhlIHZlY3RvciBhdCB0aGUgZ2l2ZW4gaW5kZXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggaW50byB0aGUgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB2YWx1ZSBmb3IgdGhlIHggY29tcG9uZW50IHRvIHNldC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB2YWx1ZSBmb3IgdGhlIHkgY29tcG9uZW50IHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXRYWSggaW5kZXgsIHgsIHkgKSB7XHJcblxyXG5cdFx0aW5kZXggPSBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldDtcclxuXHJcblx0XHRpZiAoIHRoaXMubm9ybWFsaXplZCApIHtcclxuXHJcblx0XHRcdHggPSBub3JtYWxpemUoIHgsIHRoaXMuYXJyYXkgKTtcclxuXHRcdFx0eSA9IG5vcm1hbGl6ZSggeSwgdGhpcy5hcnJheSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgMCBdID0geDtcclxuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAxIF0gPSB5O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHgsIHkgYW5kIHogY29tcG9uZW50IG9mIHRoZSB2ZWN0b3IgYXQgdGhlIGdpdmVuIGluZGV4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluZGV4IGludG8gdGhlIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgdmFsdWUgZm9yIHRoZSB4IGNvbXBvbmVudCB0byBzZXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmFsdWUgZm9yIHRoZSB5IGNvbXBvbmVudCB0byBzZXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHogLSBUaGUgdmFsdWUgZm9yIHRoZSB6IGNvbXBvbmVudCB0byBzZXQuXHJcblx0ICogQHJldHVybiB7SW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0WFlaKCBpbmRleCwgeCwgeSwgeiApIHtcclxuXHJcblx0XHRpbmRleCA9IGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0O1xyXG5cclxuXHRcdGlmICggdGhpcy5ub3JtYWxpemVkICkge1xyXG5cclxuXHRcdFx0eCA9IG5vcm1hbGl6ZSggeCwgdGhpcy5hcnJheSApO1xyXG5cdFx0XHR5ID0gbm9ybWFsaXplKCB5LCB0aGlzLmFycmF5ICk7XHJcblx0XHRcdHogPSBub3JtYWxpemUoIHosIHRoaXMuYXJyYXkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDAgXSA9IHg7XHJcblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgMSBdID0geTtcclxuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAyIF0gPSB6O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHgsIHksIHogYW5kIHcgY29tcG9uZW50IG9mIHRoZSB2ZWN0b3IgYXQgdGhlIGdpdmVuIGluZGV4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluZGV4IGludG8gdGhlIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgdmFsdWUgZm9yIHRoZSB4IGNvbXBvbmVudCB0byBzZXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmFsdWUgZm9yIHRoZSB5IGNvbXBvbmVudCB0byBzZXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHogLSBUaGUgdmFsdWUgZm9yIHRoZSB6IGNvbXBvbmVudCB0byBzZXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHcgLSBUaGUgdmFsdWUgZm9yIHRoZSB3IGNvbXBvbmVudCB0byBzZXQuXHJcblx0ICogQHJldHVybiB7SW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0WFlaVyggaW5kZXgsIHgsIHksIHosIHcgKSB7XHJcblxyXG5cdFx0aW5kZXggPSBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldDtcclxuXHJcblx0XHRpZiAoIHRoaXMubm9ybWFsaXplZCApIHtcclxuXHJcblx0XHRcdHggPSBub3JtYWxpemUoIHgsIHRoaXMuYXJyYXkgKTtcclxuXHRcdFx0eSA9IG5vcm1hbGl6ZSggeSwgdGhpcy5hcnJheSApO1xyXG5cdFx0XHR6ID0gbm9ybWFsaXplKCB6LCB0aGlzLmFycmF5ICk7XHJcblx0XHRcdHcgPSBub3JtYWxpemUoIHcsIHRoaXMuYXJyYXkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDAgXSA9IHg7XHJcblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgMSBdID0geTtcclxuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAyIF0gPSB6O1xyXG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDMgXSA9IHc7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIG5ldyBidWZmZXIgYXR0cmlidXRlIHdpdGggY29waWVkIHZhbHVlcyBmcm9tIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBJZiBubyBwYXJhbWV0ZXIgaXMgcHJvdmlkZWQsIGNsb25pbmcgYW4gaW50ZXJsZWF2ZWQgYnVmZmVyIGF0dHJpYnV0ZSB3aWxsIGRlLWludGVybGVhdmUgYnVmZmVyIGRhdGEuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW2RhdGFdIC0gQW4gb2JqZWN0IHdpdGggaW50ZXJsZWF2ZWQgYnVmZmVycyB0aGF0IGFsbG93cyB0byByZXRhaW4gdGhlIGludGVybGVhdmVkIHByb3BlcnR5LlxyXG5cdCAqIEByZXR1cm4ge0J1ZmZlckF0dHJpYnV0ZXxJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZX0gQSBjbG9uZSBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNsb25lKCBkYXRhICkge1xyXG5cclxuXHRcdGlmICggZGF0YSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Y29uc29sZS5sb2coICdUSFJFRS5JbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZS5jbG9uZSgpOiBDbG9uaW5nIGFuIGludGVybGVhdmVkIGJ1ZmZlciBhdHRyaWJ1dGUgd2lsbCBkZS1pbnRlcmxlYXZlIGJ1ZmZlciBkYXRhLicgKTtcclxuXHJcblx0XHRcdGNvbnN0IGFycmF5ID0gW107XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB0aGlzLmNvdW50OyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBpbmRleCA9IGkgKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQ7XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBqID0gMDsgaiA8IHRoaXMuaXRlbVNpemU7IGogKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0YXJyYXkucHVzaCggdGhpcy5kYXRhLmFycmF5WyBpbmRleCArIGogXSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gbmV3IEJ1ZmZlckF0dHJpYnV0ZSggbmV3IHRoaXMuYXJyYXkuY29uc3RydWN0b3IoIGFycmF5ICksIHRoaXMuaXRlbVNpemUsIHRoaXMubm9ybWFsaXplZCApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRpZiAoIGRhdGEuaW50ZXJsZWF2ZWRCdWZmZXJzID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGRhdGEuaW50ZXJsZWF2ZWRCdWZmZXJzID0ge307XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIGRhdGEuaW50ZXJsZWF2ZWRCdWZmZXJzWyB0aGlzLmRhdGEudXVpZCBdID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGRhdGEuaW50ZXJsZWF2ZWRCdWZmZXJzWyB0aGlzLmRhdGEudXVpZCBdID0gdGhpcy5kYXRhLmNsb25lKCBkYXRhICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gbmV3IEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKCBkYXRhLmludGVybGVhdmVkQnVmZmVyc1sgdGhpcy5kYXRhLnV1aWQgXSwgdGhpcy5pdGVtU2l6ZSwgdGhpcy5vZmZzZXQsIHRoaXMubm9ybWFsaXplZCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXJpYWxpemVzIHRoZSBidWZmZXIgYXR0cmlidXRlIGludG8gSlNPTi5cclxuXHQgKlxyXG5cdCAqIElmIG5vIHBhcmFtZXRlciBpcyBwcm92aWRlZCwgY2xvbmluZyBhbiBpbnRlcmxlYXZlZCBidWZmZXIgYXR0cmlidXRlIHdpbGwgZGUtaW50ZXJsZWF2ZSBidWZmZXIgZGF0YS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbZGF0YV0gLSBBbiBvcHRpb25hbCB2YWx1ZSBob2xkaW5nIG1ldGEgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlcmlhbGl6YXRpb24uXHJcblx0ICogQHJldHVybiB7T2JqZWN0fSBBIEpTT04gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc2VyaWFsaXplZCBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqL1xyXG5cdHRvSlNPTiggZGF0YSApIHtcclxuXHJcblx0XHRpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUubG9nKCAnVEhSRUUuSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUudG9KU09OKCk6IFNlcmlhbGl6aW5nIGFuIGludGVybGVhdmVkIGJ1ZmZlciBhdHRyaWJ1dGUgd2lsbCBkZS1pbnRlcmxlYXZlIGJ1ZmZlciBkYXRhLicgKTtcclxuXHJcblx0XHRcdGNvbnN0IGFycmF5ID0gW107XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB0aGlzLmNvdW50OyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBpbmRleCA9IGkgKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQ7XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBqID0gMDsgaiA8IHRoaXMuaXRlbVNpemU7IGogKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0YXJyYXkucHVzaCggdGhpcy5kYXRhLmFycmF5WyBpbmRleCArIGogXSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBkZS1pbnRlcmxlYXZlIGRhdGEgYW5kIHNhdmUgaXQgYXMgYW4gb3JkaW5hcnkgYnVmZmVyIGF0dHJpYnV0ZSBmb3Igbm93XHJcblxyXG5cdFx0XHRyZXR1cm4ge1xyXG5cdFx0XHRcdGl0ZW1TaXplOiB0aGlzLml0ZW1TaXplLFxyXG5cdFx0XHRcdHR5cGU6IHRoaXMuYXJyYXkuY29uc3RydWN0b3IubmFtZSxcclxuXHRcdFx0XHRhcnJheTogYXJyYXksXHJcblx0XHRcdFx0bm9ybWFsaXplZDogdGhpcy5ub3JtYWxpemVkXHJcblx0XHRcdH07XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdC8vIHNhdmUgYXMgdHJ1ZSBpbnRlcmxlYXZlZCBhdHRyaWJ1dGVcclxuXHJcblx0XHRcdGlmICggZGF0YS5pbnRlcmxlYXZlZEJ1ZmZlcnMgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0ZGF0YS5pbnRlcmxlYXZlZEJ1ZmZlcnMgPSB7fTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggZGF0YS5pbnRlcmxlYXZlZEJ1ZmZlcnNbIHRoaXMuZGF0YS51dWlkIF0gPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0ZGF0YS5pbnRlcmxlYXZlZEJ1ZmZlcnNbIHRoaXMuZGF0YS51dWlkIF0gPSB0aGlzLmRhdGEudG9KU09OKCBkYXRhICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4ge1xyXG5cdFx0XHRcdGlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGU6IHRydWUsXHJcblx0XHRcdFx0aXRlbVNpemU6IHRoaXMuaXRlbVNpemUsXHJcblx0XHRcdFx0ZGF0YTogdGhpcy5kYXRhLnV1aWQsXHJcblx0XHRcdFx0b2Zmc2V0OiB0aGlzLm9mZnNldCxcclxuXHRcdFx0XHRub3JtYWxpemVkOiB0aGlzLm5vcm1hbGl6ZWRcclxuXHRcdFx0fTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSB9O1xyXG4iLCJpbXBvcnQgeyBNYXRlcmlhbCB9IGZyb20gJy4vTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uL21hdGgvQ29sb3IuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgbWF0ZXJpYWwgZm9yIHJlbmRlcmluZyBpbnN0YW5jZXMgb2Yge0BsaW5rIFNwcml0ZX0uXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IG1hcCA9IG5ldyBUSFJFRS5UZXh0dXJlTG9hZGVyKCkubG9hZCggJ3RleHR1cmVzL3Nwcml0ZS5wbmcnICk7XHJcbiAqIGNvbnN0IG1hdGVyaWFsID0gbmV3IFRIUkVFLlNwcml0ZU1hdGVyaWFsKCB7IG1hcDogbWFwLCBjb2xvcjogMHhmZmZmZmYgfSApO1xyXG4gKlxyXG4gKiBjb25zdCBzcHJpdGUgPSBuZXcgVEhSRUUuU3ByaXRlKCBtYXRlcmlhbCApO1xyXG4gKiBzcHJpdGUuc2NhbGUuc2V0KDIwMCwgMjAwLCAxKVxyXG4gKiBzY2VuZS5hZGQoIHNwcml0ZSApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIE1hdGVyaWFsXHJcbiAqL1xyXG5jbGFzcyBTcHJpdGVNYXRlcmlhbCBleHRlbmRzIE1hdGVyaWFsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBzcHJpdGUgbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtZXRlcnNdIC0gQW4gb2JqZWN0IHdpdGggb25lIG9yIG1vcmUgcHJvcGVydGllc1xyXG5cdCAqIGRlZmluaW5nIHRoZSBtYXRlcmlhbCdzIGFwcGVhcmFuY2UuIEFueSBwcm9wZXJ0eSBvZiB0aGUgbWF0ZXJpYWxcclxuXHQgKiAoaW5jbHVkaW5nIGFueSBwcm9wZXJ0eSBmcm9tIGluaGVyaXRlZCBtYXRlcmlhbHMpIGNhbiBiZSBwYXNzZWRcclxuXHQgKiBpbiBoZXJlLiBDb2xvciB2YWx1ZXMgY2FuIGJlIHBhc3NlZCBhbnkgdHlwZSBvZiB2YWx1ZSBhY2NlcHRlZFxyXG5cdCAqIGJ5IHtAbGluayBDb2xvciNzZXR9LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwYXJhbWV0ZXJzICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzU3ByaXRlTWF0ZXJpYWwgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdTcHJpdGVNYXRlcmlhbCc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDb2xvciBvZiB0aGUgbWF0ZXJpYWwuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0NvbG9yfVxyXG5cdFx0ICogQGRlZmF1bHQgKDEsMSwxKVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCAweGZmZmZmZiApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNvbG9yIG1hcC4gTWF5IG9wdGlvbmFsbHkgaW5jbHVkZSBhbiBhbHBoYSBjaGFubmVsLCB0eXBpY2FsbHkgY29tYmluZWRcclxuXHRcdCAqIHdpdGgge0BsaW5rIE1hdGVyaWFsI3RyYW5zcGFyZW50fSBvciB7QGxpbmsgTWF0ZXJpYWwjYWxwaGFUZXN0fS4gVGhlIHRleHR1cmUgbWFwXHJcblx0XHQgKiBjb2xvciBpcyBtb2R1bGF0ZWQgYnkgdGhlIGRpZmZ1c2UgYGNvbG9yYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBhbHBoYSBtYXAgaXMgYSBncmF5c2NhbGUgdGV4dHVyZSB0aGF0IGNvbnRyb2xzIHRoZSBvcGFjaXR5IGFjcm9zcyB0aGVcclxuXHRcdCAqIHN1cmZhY2UgKGJsYWNrOiBmdWxseSB0cmFuc3BhcmVudDsgd2hpdGU6IGZ1bGx5IG9wYXF1ZSkuXHJcblx0XHQgKlxyXG5cdFx0ICogT25seSB0aGUgY29sb3Igb2YgdGhlIHRleHR1cmUgaXMgdXNlZCwgaWdub3JpbmcgdGhlIGFscGhhIGNoYW5uZWwgaWYgb25lXHJcblx0XHQgKiBleGlzdHMuIEZvciBSR0IgYW5kIFJHQkEgdGV4dHVyZXMsIHRoZSByZW5kZXJlciB3aWxsIHVzZSB0aGUgZ3JlZW4gY2hhbm5lbFxyXG5cdFx0ICogd2hlbiBzYW1wbGluZyB0aGlzIHRleHR1cmUgZHVlIHRvIHRoZSBleHRyYSBiaXQgb2YgcHJlY2lzaW9uIHByb3ZpZGVkIGZvclxyXG5cdFx0ICogZ3JlZW4gaW4gRFhULWNvbXByZXNzZWQgYW5kIHVuY29tcHJlc3NlZCBSR0IgNTY1IGZvcm1hdHMuIEx1bWluYW5jZS1vbmx5IGFuZFxyXG5cdFx0ICogbHVtaW5hbmNlL2FscGhhIHRleHR1cmVzIHdpbGwgYWxzbyBzdGlsbCB3b3JrIGFzIGV4cGVjdGVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hbHBoYU1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcm90YXRpb24gb2YgdGhlIHNwcml0ZSBpbiByYWRpYW5zLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucm90YXRpb24gPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU3BlY2lmaWVzIHdoZXRoZXIgc2l6ZSBvZiB0aGUgc3ByaXRlIGlzIGF0dGVudWF0ZWQgYnkgdGhlIGNhbWVyYSBkZXB0aCAocGVyc3BlY3RpdmUgY2FtZXJhIG9ubHkpLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNpemVBdHRlbnVhdGlvbiA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBPdmVyd3JpdHRlbiBzaW5jZSBzcHJpdGUgbWF0ZXJpYWxzIGFyZSB0cmFuc3BhcmVudFxyXG5cdFx0ICogYnkgZGVmYXVsdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50cmFuc3BhcmVudCA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSBtYXRlcmlhbCBpcyBhZmZlY3RlZCBieSBmb2cgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZvZyA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcclxuXHJcblx0XHR0aGlzLm1hcCA9IHNvdXJjZS5tYXA7XHJcblxyXG5cdFx0dGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDtcclxuXHJcblx0XHR0aGlzLnJvdGF0aW9uID0gc291cmNlLnJvdGF0aW9uO1xyXG5cclxuXHRcdHRoaXMuc2l6ZUF0dGVudWF0aW9uID0gc291cmNlLnNpemVBdHRlbnVhdGlvbjtcclxuXHJcblx0XHR0aGlzLmZvZyA9IHNvdXJjZS5mb2c7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFNwcml0ZU1hdGVyaWFsIH07XHJcbiIsImltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjIuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuaW1wb3J0IHsgTWF0cml4NCB9IGZyb20gJy4uL21hdGgvTWF0cml4NC5qcyc7XHJcbmltcG9ydCB7IFRyaWFuZ2xlIH0gZnJvbSAnLi4vbWF0aC9UcmlhbmdsZS5qcyc7XHJcbmltcG9ydCB7IE9iamVjdDNEIH0gZnJvbSAnLi4vY29yZS9PYmplY3QzRC5qcyc7XHJcbmltcG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9CdWZmZXJHZW9tZXRyeS5qcyc7XHJcbmltcG9ydCB7IEludGVybGVhdmVkQnVmZmVyIH0gZnJvbSAnLi4vY29yZS9JbnRlcmxlYXZlZEJ1ZmZlci5qcyc7XHJcbmltcG9ydCB7IEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9JbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcbmltcG9ydCB7IFNwcml0ZU1hdGVyaWFsIH0gZnJvbSAnLi4vbWF0ZXJpYWxzL1Nwcml0ZU1hdGVyaWFsLmpzJztcclxuXHJcbmxldCBfZ2VvbWV0cnk7XHJcblxyXG5jb25zdCBfaW50ZXJzZWN0UG9pbnQgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF93b3JsZFNjYWxlID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfbXZQb3NpdGlvbiA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuXHJcbmNvbnN0IF9hbGlnbmVkUG9zaXRpb24gPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IyKCk7XHJcbmNvbnN0IF9yb3RhdGVkUG9zaXRpb24gPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IyKCk7XHJcbmNvbnN0IF92aWV3V29ybGRNYXRyaXggPSAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXg0KCk7XHJcblxyXG5jb25zdCBfdkEgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF92QiA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX3ZDID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5cclxuY29uc3QgX3V2QSA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjIoKTtcclxuY29uc3QgX3V2QiA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjIoKTtcclxuY29uc3QgX3V2QyA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjIoKTtcclxuXHJcbi8qKlxyXG4gKiBBIHNwcml0ZSBpcyBhIHBsYW5lIHRoYXQgYWx3YXlzIGZhY2VzIHRvd2FyZHMgdGhlIGNhbWVyYSwgZ2VuZXJhbGx5IHdpdGggYVxyXG4gKiBwYXJ0aWFsbHkgdHJhbnNwYXJlbnQgdGV4dHVyZSBhcHBsaWVkLlxyXG4gKlxyXG4gKiBTcHJpdGVzIGRvIG5vdCBjYXN0IHNoYWRvd3MsIHNldHRpbmcge0BsaW5rIE9iamVjdDNEI2Nhc3RTaGFkb3d9IHRvIGB0cnVlYCB3aWxsXHJcbiAqIGhhdmUgbm8gZWZmZWN0LlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBtYXAgPSBuZXcgVEhSRUUuVGV4dHVyZUxvYWRlcigpLmxvYWQoICdzcHJpdGUucG5nJyApO1xyXG4gKiBjb25zdCBtYXRlcmlhbCA9IG5ldyBUSFJFRS5TcHJpdGVNYXRlcmlhbCggeyBtYXA6IG1hcCB9ICk7XHJcbiAqXHJcbiAqIGNvbnN0IHNwcml0ZSA9IG5ldyBUSFJFRS5TcHJpdGUoIG1hdGVyaWFsICk7XHJcbiAqIHNjZW5lLmFkZCggc3ByaXRlICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgT2JqZWN0M0RcclxuICovXHJcbmNsYXNzIFNwcml0ZSBleHRlbmRzIE9iamVjdDNEIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBzcHJpdGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1Nwcml0ZU1hdGVyaWFsfSBbbWF0ZXJpYWxdIC0gVGhlIHNwcml0ZSBtYXRlcmlhbC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbWF0ZXJpYWwgPSBuZXcgU3ByaXRlTWF0ZXJpYWwoKSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1Nwcml0ZSA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ1Nwcml0ZSc7XHJcblxyXG5cdFx0aWYgKCBfZ2VvbWV0cnkgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdF9nZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xyXG5cclxuXHRcdFx0Y29uc3QgZmxvYXQzMkFycmF5ID0gbmV3IEZsb2F0MzJBcnJheSggW1xyXG5cdFx0XHRcdC0gMC41LCAtIDAuNSwgMCwgMCwgMCxcclxuXHRcdFx0XHQwLjUsIC0gMC41LCAwLCAxLCAwLFxyXG5cdFx0XHRcdDAuNSwgMC41LCAwLCAxLCAxLFxyXG5cdFx0XHRcdC0gMC41LCAwLjUsIDAsIDAsIDFcclxuXHRcdFx0XSApO1xyXG5cclxuXHRcdFx0Y29uc3QgaW50ZXJsZWF2ZWRCdWZmZXIgPSBuZXcgSW50ZXJsZWF2ZWRCdWZmZXIoIGZsb2F0MzJBcnJheSwgNSApO1xyXG5cclxuXHRcdFx0X2dlb21ldHJ5LnNldEluZGV4KCBbIDAsIDEsIDIsXHQwLCAyLCAzIF0gKTtcclxuXHRcdFx0X2dlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKCBpbnRlcmxlYXZlZEJ1ZmZlciwgMywgMCwgZmFsc2UgKSApO1xyXG5cdFx0XHRfZ2VvbWV0cnkuc2V0QXR0cmlidXRlKCAndXYnLCBuZXcgSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUoIGludGVybGVhdmVkQnVmZmVyLCAyLCAzLCBmYWxzZSApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHNwcml0ZSBnZW9tZXRyeS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QnVmZmVyR2VvbWV0cnl9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ2VvbWV0cnkgPSBfZ2VvbWV0cnk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc3ByaXRlIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtTcHJpdGVNYXRlcmlhbH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tYXRlcmlhbCA9IG1hdGVyaWFsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHNwcml0ZSdzIGFuY2hvciBwb2ludCwgYW5kIHRoZSBwb2ludCBhcm91bmQgd2hpY2ggdGhlIHNwcml0ZSByb3RhdGVzLlxyXG5cdFx0ICogQSB2YWx1ZSBvZiBgKDAuNSwgMC41KWAgY29ycmVzcG9uZHMgdG8gdGhlIG1pZHBvaW50IG9mIHRoZSBzcHJpdGUuIEEgdmFsdWVcclxuXHRcdCAqIG9mIGAoMCwgMClgIGNvcnJlc3BvbmRzIHRvIHRoZSBsb3dlciBsZWZ0IGNvcm5lciBvZiB0aGUgc3ByaXRlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3IyfVxyXG5cdFx0ICogQGRlZmF1bHQgKDAuNSwwLjUpXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2VudGVyID0gbmV3IFZlY3RvcjIoIDAuNSwgMC41ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgaW50ZXJzZWN0aW9uIHBvaW50cyBiZXR3ZWVuIGEgY2FzdGVkIHJheSBhbmQgdGhpcyBzcHJpdGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JheWNhc3Rlcn0gcmF5Y2FzdGVyIC0gVGhlIHJheWNhc3Rlci5cclxuXHQgKiBAcGFyYW0ge0FycmF5PE9iamVjdD59IGludGVyc2VjdHMgLSBUaGUgdGFyZ2V0IGFycmF5IHRoYXQgaG9sZHMgdGhlIGludGVyc2VjdGlvbiBwb2ludHMuXHJcblx0ICovXHJcblx0cmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICkge1xyXG5cclxuXHRcdGlmICggcmF5Y2FzdGVyLmNhbWVyYSA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5TcHJpdGU6IFwiUmF5Y2FzdGVyLmNhbWVyYVwiIG5lZWRzIHRvIGJlIHNldCBpbiBvcmRlciB0byByYXljYXN0IGFnYWluc3Qgc3ByaXRlcy4nICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdF93b3JsZFNjYWxlLnNldEZyb21NYXRyaXhTY2FsZSggdGhpcy5tYXRyaXhXb3JsZCApO1xyXG5cclxuXHRcdF92aWV3V29ybGRNYXRyaXguY29weSggcmF5Y2FzdGVyLmNhbWVyYS5tYXRyaXhXb3JsZCApO1xyXG5cdFx0dGhpcy5tb2RlbFZpZXdNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggcmF5Y2FzdGVyLmNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UsIHRoaXMubWF0cml4V29ybGQgKTtcclxuXHJcblx0XHRfbXZQb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubW9kZWxWaWV3TWF0cml4ICk7XHJcblxyXG5cdFx0aWYgKCByYXljYXN0ZXIuY2FtZXJhLmlzUGVyc3BlY3RpdmVDYW1lcmEgJiYgdGhpcy5tYXRlcmlhbC5zaXplQXR0ZW51YXRpb24gPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0X3dvcmxkU2NhbGUubXVsdGlwbHlTY2FsYXIoIC0gX212UG9zaXRpb24ueiApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCByb3RhdGlvbiA9IHRoaXMubWF0ZXJpYWwucm90YXRpb247XHJcblx0XHRsZXQgc2luLCBjb3M7XHJcblxyXG5cdFx0aWYgKCByb3RhdGlvbiAhPT0gMCApIHtcclxuXHJcblx0XHRcdGNvcyA9IE1hdGguY29zKCByb3RhdGlvbiApO1xyXG5cdFx0XHRzaW4gPSBNYXRoLnNpbiggcm90YXRpb24gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgY2VudGVyID0gdGhpcy5jZW50ZXI7XHJcblxyXG5cdFx0dHJhbnNmb3JtVmVydGV4KCBfdkEuc2V0KCAtIDAuNSwgLSAwLjUsIDAgKSwgX212UG9zaXRpb24sIGNlbnRlciwgX3dvcmxkU2NhbGUsIHNpbiwgY29zICk7XHJcblx0XHR0cmFuc2Zvcm1WZXJ0ZXgoIF92Qi5zZXQoIDAuNSwgLSAwLjUsIDAgKSwgX212UG9zaXRpb24sIGNlbnRlciwgX3dvcmxkU2NhbGUsIHNpbiwgY29zICk7XHJcblx0XHR0cmFuc2Zvcm1WZXJ0ZXgoIF92Qy5zZXQoIDAuNSwgMC41LCAwICksIF9tdlBvc2l0aW9uLCBjZW50ZXIsIF93b3JsZFNjYWxlLCBzaW4sIGNvcyApO1xyXG5cclxuXHRcdF91dkEuc2V0KCAwLCAwICk7XHJcblx0XHRfdXZCLnNldCggMSwgMCApO1xyXG5cdFx0X3V2Qy5zZXQoIDEsIDEgKTtcclxuXHJcblx0XHQvLyBjaGVjayBmaXJzdCB0cmlhbmdsZVxyXG5cdFx0bGV0IGludGVyc2VjdCA9IHJheWNhc3Rlci5yYXkuaW50ZXJzZWN0VHJpYW5nbGUoIF92QSwgX3ZCLCBfdkMsIGZhbHNlLCBfaW50ZXJzZWN0UG9pbnQgKTtcclxuXHJcblx0XHRpZiAoIGludGVyc2VjdCA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdC8vIGNoZWNrIHNlY29uZCB0cmlhbmdsZVxyXG5cdFx0XHR0cmFuc2Zvcm1WZXJ0ZXgoIF92Qi5zZXQoIC0gMC41LCAwLjUsIDAgKSwgX212UG9zaXRpb24sIGNlbnRlciwgX3dvcmxkU2NhbGUsIHNpbiwgY29zICk7XHJcblx0XHRcdF91dkIuc2V0KCAwLCAxICk7XHJcblxyXG5cdFx0XHRpbnRlcnNlY3QgPSByYXljYXN0ZXIucmF5LmludGVyc2VjdFRyaWFuZ2xlKCBfdkEsIF92QywgX3ZCLCBmYWxzZSwgX2ludGVyc2VjdFBvaW50ICk7XHJcblx0XHRcdGlmICggaW50ZXJzZWN0ID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGRpc3RhbmNlID0gcmF5Y2FzdGVyLnJheS5vcmlnaW4uZGlzdGFuY2VUbyggX2ludGVyc2VjdFBvaW50ICk7XHJcblxyXG5cdFx0aWYgKCBkaXN0YW5jZSA8IHJheWNhc3Rlci5uZWFyIHx8IGRpc3RhbmNlID4gcmF5Y2FzdGVyLmZhciApIHJldHVybjtcclxuXHJcblx0XHRpbnRlcnNlY3RzLnB1c2goIHtcclxuXHJcblx0XHRcdGRpc3RhbmNlOiBkaXN0YW5jZSxcclxuXHRcdFx0cG9pbnQ6IF9pbnRlcnNlY3RQb2ludC5jbG9uZSgpLFxyXG5cdFx0XHR1djogVHJpYW5nbGUuZ2V0SW50ZXJwb2xhdGlvbiggX2ludGVyc2VjdFBvaW50LCBfdkEsIF92QiwgX3ZDLCBfdXZBLCBfdXZCLCBfdXZDLCBuZXcgVmVjdG9yMigpICksXHJcblx0XHRcdGZhY2U6IG51bGwsXHJcblx0XHRcdG9iamVjdDogdGhpc1xyXG5cclxuXHRcdH0gKTtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UsIHJlY3Vyc2l2ZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UsIHJlY3Vyc2l2ZSApO1xyXG5cclxuXHRcdGlmICggc291cmNlLmNlbnRlciAhPT0gdW5kZWZpbmVkICkgdGhpcy5jZW50ZXIuY29weSggc291cmNlLmNlbnRlciApO1xyXG5cclxuXHRcdHRoaXMubWF0ZXJpYWwgPSBzb3VyY2UubWF0ZXJpYWw7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHRyYW5zZm9ybVZlcnRleCggdmVydGV4UG9zaXRpb24sIG12UG9zaXRpb24sIGNlbnRlciwgc2NhbGUsIHNpbiwgY29zICkge1xyXG5cclxuXHQvLyBjb21wdXRlIHBvc2l0aW9uIGluIGNhbWVyYSBzcGFjZVxyXG5cdF9hbGlnbmVkUG9zaXRpb24uc3ViVmVjdG9ycyggdmVydGV4UG9zaXRpb24sIGNlbnRlciApLmFkZFNjYWxhciggMC41ICkubXVsdGlwbHkoIHNjYWxlICk7XHJcblxyXG5cdC8vIHRvIGNoZWNrIGlmIHJvdGF0aW9uIGlzIG5vdCB6ZXJvXHJcblx0aWYgKCBzaW4gIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRfcm90YXRlZFBvc2l0aW9uLnggPSAoIGNvcyAqIF9hbGlnbmVkUG9zaXRpb24ueCApIC0gKCBzaW4gKiBfYWxpZ25lZFBvc2l0aW9uLnkgKTtcclxuXHRcdF9yb3RhdGVkUG9zaXRpb24ueSA9ICggc2luICogX2FsaWduZWRQb3NpdGlvbi54ICkgKyAoIGNvcyAqIF9hbGlnbmVkUG9zaXRpb24ueSApO1xyXG5cclxuXHR9IGVsc2Uge1xyXG5cclxuXHRcdF9yb3RhdGVkUG9zaXRpb24uY29weSggX2FsaWduZWRQb3NpdGlvbiApO1xyXG5cclxuXHR9XHJcblxyXG5cclxuXHR2ZXJ0ZXhQb3NpdGlvbi5jb3B5KCBtdlBvc2l0aW9uICk7XHJcblx0dmVydGV4UG9zaXRpb24ueCArPSBfcm90YXRlZFBvc2l0aW9uLng7XHJcblx0dmVydGV4UG9zaXRpb24ueSArPSBfcm90YXRlZFBvc2l0aW9uLnk7XHJcblxyXG5cdC8vIHRyYW5zZm9ybSB0byB3b3JsZCBzcGFjZVxyXG5cdHZlcnRleFBvc2l0aW9uLmFwcGx5TWF0cml4NCggX3ZpZXdXb3JsZE1hdHJpeCApO1xyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgU3ByaXRlIH07XHJcbiIsImltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBPYmplY3QzRCB9IGZyb20gJy4uL2NvcmUvT2JqZWN0M0QuanMnO1xyXG5cclxuY29uc3QgX3YxID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfdjIgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcblxyXG4vKipcclxuICogQSBjb21wb25lbnQgZm9yIHByb3ZpZGluZyBhIGJhc2ljIExldmVsIG9mIERldGFpbCAoTE9EKSBtZWNoYW5pc20uXHJcbiAqXHJcbiAqIEV2ZXJ5IExPRCBsZXZlbCBpcyBhc3NvY2lhdGVkIHdpdGggYW4gb2JqZWN0LCBhbmQgcmVuZGVyaW5nIGNhbiBiZSBzd2l0Y2hlZFxyXG4gKiBiZXR3ZWVuIHRoZW0gYXQgdGhlIGRpc3RhbmNlcyBzcGVjaWZpZWQuIFR5cGljYWxseSB5b3Ugd291bGQgY3JlYXRlLCBzYXksXHJcbiAqIHRocmVlIG1lc2hlcywgb25lIGZvciBmYXIgYXdheSAobG93IGRldGFpbCksIG9uZSBmb3IgbWlkIHJhbmdlIChtZWRpdW1cclxuICogZGV0YWlsKSBhbmQgb25lIGZvciBjbG9zZSB1cCAoaGlnaCBkZXRhaWwpLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBsb2QgPSBuZXcgVEhSRUUuTE9EKCk7XHJcbiAqIGNvbnN0IG1hdGVyaWFsID0gbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiAweGZmZmYwMCB9ICk7XHJcbiAqXHJcbiAqIC8vQ3JlYXRlIHNwaGVyZXMgd2l0aCAzIGxldmVscyBvZiBkZXRhaWwgYW5kIGNyZWF0ZSBuZXcgTE9EIGxldmVscyBmb3IgdGhlbVxyXG4gKiBmb3IoIGxldCBpID0gMDsgaSA8IDM7IGkrKyApIHtcclxuICpcclxuICogXHRjb25zdCBnZW9tZXRyeSA9IG5ldyBUSFJFRS5JY29zYWhlZHJvbkdlb21ldHJ5KCAxMCwgMyAtIGkgKTtcclxuICogXHRjb25zdCBtZXNoID0gbmV3IFRIUkVFLk1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG4gKiBcdGxvZC5hZGRMZXZlbCggbWVzaCwgaSAqIDc1ICk7XHJcbiAqXHJcbiAqIH1cclxuICpcclxuICogc2NlbmUuYWRkKCBsb2QgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBPYmplY3QzRFxyXG4gKi9cclxuY2xhc3MgTE9EIGV4dGVuZHMgT2JqZWN0M0Qge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IExPRC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0xPRCA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY3VycmVudCBMT0QgaW5kZXguXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX2N1cnJlbnRMZXZlbCA9IDA7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ0xPRCc7XHJcblxyXG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIHRoaXMsIHtcclxuXHRcdFx0LyoqXHJcblx0XHRcdCAqIFRoaXMgYXJyYXkgaG9sZHMgdGhlIExPRCBsZXZlbHMuXHJcblx0XHRcdCAqXHJcblx0XHRcdCAqIEBuYW1lIExPRCNsZXZlbHNcclxuXHRcdFx0ICogQHR5cGUge0FycmF5PHtvYmplY3Q6T2JqZWN0M0QsZGlzdGFuY2U6bnVtYmVyLGh5c3RlcmVzaXM6bnVtYmVyfT59XHJcblx0XHRcdCAqL1xyXG5cdFx0XHRsZXZlbHM6IHtcclxuXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxyXG5cdFx0XHRcdHZhbHVlOiBbXVxyXG5cdFx0XHR9XHJcblx0XHR9ICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSBMT0Qgb2JqZWN0IGlzIHVwZGF0ZWQgYXV0b21hdGljYWxseSBieSB0aGUgcmVuZGVyZXIgcGVyIGZyYW1lXHJcblx0XHQgKiBvciBub3QuIElmIHNldCB0byBgZmFsc2VgLCB5b3UgaGF2ZSB0byBjYWxsIHtAbGluayBMT0QjdXBkYXRlfSBpbiB0aGVcclxuXHRcdCAqIHJlbmRlciBsb29wIGJ5IHlvdXJzZWxmLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmF1dG9VcGRhdGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UsIGZhbHNlICk7XHJcblxyXG5cdFx0Y29uc3QgbGV2ZWxzID0gc291cmNlLmxldmVscztcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBsZXZlbHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGxldmVsID0gbGV2ZWxzWyBpIF07XHJcblxyXG5cdFx0XHR0aGlzLmFkZExldmVsKCBsZXZlbC5vYmplY3QuY2xvbmUoKSwgbGV2ZWwuZGlzdGFuY2UsIGxldmVsLmh5c3RlcmVzaXMgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5hdXRvVXBkYXRlID0gc291cmNlLmF1dG9VcGRhdGU7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyBhIG1lc2ggdGhhdCB3aWxsIGRpc3BsYXkgYXQgYSBjZXJ0YWluIGRpc3RhbmNlIGFuZCBncmVhdGVyLiBUeXBpY2FsbHlcclxuXHQgKiB0aGUgZnVydGhlciBhd2F5IHRoZSBkaXN0YW5jZSwgdGhlIGxvd2VyIHRoZSBkZXRhaWwgb24gdGhlIG1lc2guXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdDNEfSBvYmplY3QgLSBUaGUgM0Qgb2JqZWN0IHRvIGRpc3BsYXkgYXQgdGhpcyBsZXZlbC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2Rpc3RhbmNlPTBdIC0gVGhlIGRpc3RhbmNlIGF0IHdoaWNoIHRvIGRpc3BsYXkgdGhpcyBsZXZlbCBvZiBkZXRhaWwuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtoeXN0ZXJlc2lzPTBdIC0gVGhyZXNob2xkIHVzZWQgdG8gYXZvaWQgZmxpY2tlcmluZyBhdCBMT0QgYm91bmRhcmllcywgYXMgYSBmcmFjdGlvbiBvZiBkaXN0YW5jZS5cclxuXHQgKiBAcmV0dXJuIHtMT0R9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0YWRkTGV2ZWwoIG9iamVjdCwgZGlzdGFuY2UgPSAwLCBoeXN0ZXJlc2lzID0gMCApIHtcclxuXHJcblx0XHRkaXN0YW5jZSA9IE1hdGguYWJzKCBkaXN0YW5jZSApO1xyXG5cclxuXHRcdGNvbnN0IGxldmVscyA9IHRoaXMubGV2ZWxzO1xyXG5cclxuXHRcdGxldCBsO1xyXG5cclxuXHRcdGZvciAoIGwgPSAwOyBsIDwgbGV2ZWxzLmxlbmd0aDsgbCArKyApIHtcclxuXHJcblx0XHRcdGlmICggZGlzdGFuY2UgPCBsZXZlbHNbIGwgXS5kaXN0YW5jZSApIHtcclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGxldmVscy5zcGxpY2UoIGwsIDAsIHsgZGlzdGFuY2U6IGRpc3RhbmNlLCBoeXN0ZXJlc2lzOiBoeXN0ZXJlc2lzLCBvYmplY3Q6IG9iamVjdCB9ICk7XHJcblxyXG5cdFx0dGhpcy5hZGQoIG9iamVjdCApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbW92ZXMgYW4gZXhpc3RpbmcgbGV2ZWwsIGJhc2VkIG9uIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBjYW1lcmEuXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgbGV2ZWwgaGFzIGJlZW4gcmVtb3ZlZC4gT3RoZXJ3aXNlIGBmYWxzZWAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZGlzdGFuY2UgLSBEaXN0YW5jZSBvZiB0aGUgbGV2ZWwgdG8gcmVtb3ZlLlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGxldmVsIGhhcyBiZWVuIHJlbW92ZWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdHJlbW92ZUxldmVsKCBkaXN0YW5jZSApIHtcclxuXHJcblx0XHRjb25zdCBsZXZlbHMgPSB0aGlzLmxldmVscztcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBsZXZlbHMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0aWYgKCBsZXZlbHNbIGkgXS5kaXN0YW5jZSA9PT0gZGlzdGFuY2UgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHJlbW92ZWRFbGVtZW50cyA9IGxldmVscy5zcGxpY2UoIGksIDEgKTtcclxuXHRcdFx0XHR0aGlzLnJlbW92ZSggcmVtb3ZlZEVsZW1lbnRzWyAwIF0ub2JqZWN0ICk7XHJcblxyXG5cdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZmFsc2U7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgY3VycmVudGx5IGFjdGl2ZSBMT0QgbGV2ZWwgaW5kZXguXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBjdXJyZW50IGFjdGl2ZSBMT0QgbGV2ZWwgaW5kZXguXHJcblx0ICovXHJcblx0Z2V0Q3VycmVudExldmVsKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9jdXJyZW50TGV2ZWw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgZmlyc3QgM0Qgb2JqZWN0IHRoYXQgaXMgZ3JlYXRlciB0aGFuXHJcblx0ICogdGhlIGdpdmVuIGRpc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGRpc3RhbmNlIC0gVGhlIExPRCBkaXN0YW5jZS5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3QzRHxudWxsfSBUaGUgZm91bmQgM0Qgb2JqZWN0LiBgbnVsbGAgaWYgbm8gM0Qgb2JqZWN0IGhhcyBiZWVuIGZvdW5kLlxyXG5cdCAqL1xyXG5cdGdldE9iamVjdEZvckRpc3RhbmNlKCBkaXN0YW5jZSApIHtcclxuXHJcblx0XHRjb25zdCBsZXZlbHMgPSB0aGlzLmxldmVscztcclxuXHJcblx0XHRpZiAoIGxldmVscy5sZW5ndGggPiAwICkge1xyXG5cclxuXHRcdFx0bGV0IGksIGw7XHJcblxyXG5cdFx0XHRmb3IgKCBpID0gMSwgbCA9IGxldmVscy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRsZXQgbGV2ZWxEaXN0YW5jZSA9IGxldmVsc1sgaSBdLmRpc3RhbmNlO1xyXG5cclxuXHRcdFx0XHRpZiAoIGxldmVsc1sgaSBdLm9iamVjdC52aXNpYmxlICkge1xyXG5cclxuXHRcdFx0XHRcdGxldmVsRGlzdGFuY2UgLT0gbGV2ZWxEaXN0YW5jZSAqIGxldmVsc1sgaSBdLmh5c3RlcmVzaXM7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKCBkaXN0YW5jZSA8IGxldmVsRGlzdGFuY2UgKSB7XHJcblxyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBsZXZlbHNbIGkgLSAxIF0ub2JqZWN0O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyBpbnRlcnNlY3Rpb24gcG9pbnRzIGJldHdlZW4gYSBjYXN0ZWQgcmF5IGFuZCB0aGlzIExPRC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmF5Y2FzdGVyfSByYXljYXN0ZXIgLSBUaGUgcmF5Y2FzdGVyLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8T2JqZWN0Pn0gaW50ZXJzZWN0cyAtIFRoZSB0YXJnZXQgYXJyYXkgdGhhdCBob2xkcyB0aGUgaW50ZXJzZWN0aW9uIHBvaW50cy5cclxuXHQgKi9cclxuXHRyYXljYXN0KCByYXljYXN0ZXIsIGludGVyc2VjdHMgKSB7XHJcblxyXG5cdFx0Y29uc3QgbGV2ZWxzID0gdGhpcy5sZXZlbHM7XHJcblxyXG5cdFx0aWYgKCBsZXZlbHMubGVuZ3RoID4gMCApIHtcclxuXHJcblx0XHRcdF92MS5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubWF0cml4V29ybGQgKTtcclxuXHJcblx0XHRcdGNvbnN0IGRpc3RhbmNlID0gcmF5Y2FzdGVyLnJheS5vcmlnaW4uZGlzdGFuY2VUbyggX3YxICk7XHJcblxyXG5cdFx0XHR0aGlzLmdldE9iamVjdEZvckRpc3RhbmNlKCBkaXN0YW5jZSApLnJheWNhc3QoIHJheWNhc3RlciwgaW50ZXJzZWN0cyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoZSBMT0QgYnkgY29tcHV0aW5nIHdoaWNoIExPRCBsZXZlbCBzaG91bGQgYmUgdmlzaWJsZSBhY2NvcmRpbmdcclxuXHQgKiB0byB0aGUgY3VycmVudCBkaXN0YW5jZSBvZiB0aGUgZ2l2ZW4gY2FtZXJhLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtDYW1lcmF9IGNhbWVyYSAtIFRoZSBjYW1lcmEgdGhlIHNjZW5lIGlzIHJlbmRlcmVkIHdpdGguXHJcblx0ICovXHJcblx0dXBkYXRlKCBjYW1lcmEgKSB7XHJcblxyXG5cdFx0Y29uc3QgbGV2ZWxzID0gdGhpcy5sZXZlbHM7XHJcblxyXG5cdFx0aWYgKCBsZXZlbHMubGVuZ3RoID4gMSApIHtcclxuXHJcblx0XHRcdF92MS5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGNhbWVyYS5tYXRyaXhXb3JsZCApO1xyXG5cdFx0XHRfdjIuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLm1hdHJpeFdvcmxkICk7XHJcblxyXG5cdFx0XHRjb25zdCBkaXN0YW5jZSA9IF92MS5kaXN0YW5jZVRvKCBfdjIgKSAvIGNhbWVyYS56b29tO1xyXG5cclxuXHRcdFx0bGV2ZWxzWyAwIF0ub2JqZWN0LnZpc2libGUgPSB0cnVlO1xyXG5cclxuXHRcdFx0bGV0IGksIGw7XHJcblxyXG5cdFx0XHRmb3IgKCBpID0gMSwgbCA9IGxldmVscy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRsZXQgbGV2ZWxEaXN0YW5jZSA9IGxldmVsc1sgaSBdLmRpc3RhbmNlO1xyXG5cclxuXHRcdFx0XHRpZiAoIGxldmVsc1sgaSBdLm9iamVjdC52aXNpYmxlICkge1xyXG5cclxuXHRcdFx0XHRcdGxldmVsRGlzdGFuY2UgLT0gbGV2ZWxEaXN0YW5jZSAqIGxldmVsc1sgaSBdLmh5c3RlcmVzaXM7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKCBkaXN0YW5jZSA+PSBsZXZlbERpc3RhbmNlICkge1xyXG5cclxuXHRcdFx0XHRcdGxldmVsc1sgaSAtIDEgXS5vYmplY3QudmlzaWJsZSA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0bGV2ZWxzWyBpIF0ub2JqZWN0LnZpc2libGUgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0aGlzLl9jdXJyZW50TGV2ZWwgPSBpIC0gMTtcclxuXHJcblx0XHRcdGZvciAoIDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGxldmVsc1sgaSBdLm9iamVjdC52aXNpYmxlID0gZmFsc2U7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdHRvSlNPTiggbWV0YSApIHtcclxuXHJcblx0XHRjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCBtZXRhICk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmF1dG9VcGRhdGUgPT09IGZhbHNlICkgZGF0YS5vYmplY3QuYXV0b1VwZGF0ZSA9IGZhbHNlO1xyXG5cclxuXHRcdGRhdGEub2JqZWN0LmxldmVscyA9IFtdO1xyXG5cclxuXHRcdGNvbnN0IGxldmVscyA9IHRoaXMubGV2ZWxzO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGxldmVscy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgbGV2ZWwgPSBsZXZlbHNbIGkgXTtcclxuXHJcblx0XHRcdGRhdGEub2JqZWN0LmxldmVscy5wdXNoKCB7XHJcblx0XHRcdFx0b2JqZWN0OiBsZXZlbC5vYmplY3QudXVpZCxcclxuXHRcdFx0XHRkaXN0YW5jZTogbGV2ZWwuZGlzdGFuY2UsXHJcblx0XHRcdFx0aHlzdGVyZXNpczogbGV2ZWwuaHlzdGVyZXNpc1xyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBkYXRhO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgTE9EIH07XHJcbiIsImltcG9ydCB7IE1lc2ggfSBmcm9tICcuL01lc2guanMnO1xyXG5pbXBvcnQgeyBCb3gzIH0gZnJvbSAnLi4vbWF0aC9Cb3gzLmpzJztcclxuaW1wb3J0IHsgTWF0cml4NCB9IGZyb20gJy4uL21hdGgvTWF0cml4NC5qcyc7XHJcbmltcG9ydCB7IFNwaGVyZSB9IGZyb20gJy4uL21hdGgvU3BoZXJlLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjQgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjQuanMnO1xyXG5pbXBvcnQgeyBSYXkgfSBmcm9tICcuLi9tYXRoL1JheS5qcyc7XHJcbmltcG9ydCB7IEF0dGFjaGVkQmluZE1vZGUsIERldGFjaGVkQmluZE1vZGUgfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xyXG5cclxuY29uc3QgX2Jhc2VQb3NpdGlvbiA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuXHJcbmNvbnN0IF9za2luSW5kZXggPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3I0KCk7XHJcbmNvbnN0IF9za2luV2VpZ2h0ID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yNCgpO1xyXG5cclxuY29uc3QgX3ZlY3RvcjMgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF9tYXRyaXg0ID0gLypAX19QVVJFX18qLyBuZXcgTWF0cml4NCgpO1xyXG5jb25zdCBfdmVydGV4ID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5cclxuY29uc3QgX3NwaGVyZSA9IC8qQF9fUFVSRV9fKi8gbmV3IFNwaGVyZSgpO1xyXG5jb25zdCBfaW52ZXJzZU1hdHJpeCA9IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDQoKTtcclxuY29uc3QgX3JheSA9IC8qQF9fUFVSRV9fKi8gbmV3IFJheSgpO1xyXG5cclxuLyoqXHJcbiAqIEEgbWVzaCB0aGF0IGhhcyBhIHtAbGluayBTa2VsZXRvbn0gdGhhdCBjYW4gdGhlbiBiZSB1c2VkIHRvIGFuaW1hdGUgdGhlXHJcbiAqIHZlcnRpY2VzIG9mIHRoZSBnZW9tZXRyeSB3aXRoIHNraW5uaW5nL3NrZWxldG9uIGFuaW1hdGlvbi5cclxuICpcclxuICogTmV4dCB0byBhIHZhbGlkIHNrZWxldG9uLCB0aGUgc2tpbm5lZCBtZXNoIHJlcXVpcmVzIHNraW4gaW5kaWNlcyBhbmQgd2VpZ2h0c1xyXG4gKiBhcyBidWZmZXIgYXR0cmlidXRlcyBpbiBpdHMgZ2VvbWV0cnkuIFRoZXNlIGF0dHJpYnV0ZSBkZWZpbmUgd2hpY2ggYm9uZXMgYWZmZWN0IGEgc2luZ2xlXHJcbiAqIHZlcnRleCB0byBhIGNlcnRhaW4gZXh0ZW5kLlxyXG4gKlxyXG4gKiBUeXBpY2FsbHkgc2tpbm5lZCBtZXNoZXMgYXJlIG5vdCBjcmVhdGVkIG1hbnVhbGx5IGJ1dCBsb2FkZXJzIGxpa2Uge0BsaW5rIEdMVEZMb2FkZXJ9XHJcbiAqIG9yIHtAbGluayBGQlhMb2FkZXIgfSBpbXBvcnQgcmVzcGVjdGl2ZSBtb2RlbHMuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBNZXNoXHJcbiAqL1xyXG5jbGFzcyBTa2lubmVkTWVzaCBleHRlbmRzIE1lc2gge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHNraW5uZWQgbWVzaC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyR2VvbWV0cnl9IFtnZW9tZXRyeV0gLSBUaGUgbWVzaCBnZW9tZXRyeS5cclxuXHQgKiBAcGFyYW0ge01hdGVyaWFsfEFycmF5PE1hdGVyaWFsPn0gW21hdGVyaWFsXSAtIFRoZSBtZXNoIG1hdGVyaWFsLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKSB7XHJcblxyXG5cdFx0c3VwZXIoIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1NraW5uZWRNZXNoID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnU2tpbm5lZE1lc2gnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogYEF0dGFjaGVkQmluZE1vZGVgIG1lYW5zIHRoZSBza2lubmVkIG1lc2ggc2hhcmVzIHRoZSBzYW1lIHdvcmxkIHNwYWNlIGFzIHRoZSBza2VsZXRvbi5cclxuXHRcdCAqIFRoaXMgaXMgbm90IHRydWUgd2hlbiB1c2luZyBgRGV0YWNoZWRCaW5kTW9kZWAgd2hpY2ggaXMgdXNlZnVsIHdoZW4gc2hhcmluZyBhIHNrZWxldG9uXHJcblx0XHQgKiBhY3Jvc3MgbXVsdGlwbGUgc2tpbm5lZCBtZXNoZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeyhBdHRhY2hlZEJpbmRNb2RlfERldGFjaGVkQmluZE1vZGUpfVxyXG5cdFx0ICogQGRlZmF1bHQgQXR0YWNoZWRCaW5kTW9kZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJpbmRNb2RlID0gQXR0YWNoZWRCaW5kTW9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBiYXNlIG1hdHJpeCB0aGF0IGlzIHVzZWQgZm9yIHRoZSBib3VuZCBib25lIHRyYW5zZm9ybXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge01hdHJpeDR9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYmluZE1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYmFzZSBtYXRyaXggdGhhdCBpcyB1c2VkIGZvciByZXNldHRpbmcgdGhlIGJvdW5kIGJvbmUgdHJhbnNmb3Jtcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7TWF0cml4NH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5iaW5kTWF0cml4SW52ZXJzZSA9IG5ldyBNYXRyaXg0KCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYm91bmRpbmcgYm94IG9mIHRoZSBza2lubmVkIG1lc2guIENhbiBiZSBjb21wdXRlZCB2aWEge0BsaW5rIFNraW5uZWRNZXNoI2NvbXB1dGVCb3VuZGluZ0JveH0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Cb3gzfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJvdW5kaW5nQm94ID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBib3VuZGluZyBzcGhlcmUgb2YgdGhlIHNraW5uZWQgbWVzaC4gQ2FuIGJlIGNvbXB1dGVkIHZpYSB7QGxpbmsgU2tpbm5lZE1lc2gjY29tcHV0ZUJvdW5kaW5nU3BoZXJlfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1NwaGVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgc2tpbm5lZCBtZXNoLCBhbmQgdXBkYXRlcyB7QGxpbmsgU2tpbm5lZE1lc2gjYm91bmRpbmdCb3h9LlxyXG5cdCAqIFRoZSBib3VuZGluZyBib3ggaXMgbm90IGF1dG9tYXRpY2FsbHkgY29tcHV0ZWQgYnkgdGhlIGVuZ2luZTsgdGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgYnkgeW91ciBhcHAuXHJcblx0ICogSWYgdGhlIHNraW5uZWQgbWVzaCBpcyBhbmltYXRlZCwgdGhlIGJvdW5kaW5nIGJveCBzaG91bGQgYmUgcmVjb21wdXRlZCBwZXIgZnJhbWUgaW4gb3JkZXIgdG8gcmVmbGVjdFxyXG5cdCAqIHRoZSBjdXJyZW50IGFuaW1hdGlvbiBzdGF0ZS5cclxuXHQgKi9cclxuXHRjb21wdXRlQm91bmRpbmdCb3goKSB7XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xyXG5cclxuXHRcdGlmICggdGhpcy5ib3VuZGluZ0JveCA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuYm91bmRpbmdCb3ggPSBuZXcgQm94MygpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmJvdW5kaW5nQm94Lm1ha2VFbXB0eSgpO1xyXG5cclxuXHRcdGNvbnN0IHBvc2l0aW9uQXR0cmlidXRlID0gZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCAncG9zaXRpb24nICk7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgcG9zaXRpb25BdHRyaWJ1dGUuY291bnQ7IGkgKysgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmdldFZlcnRleFBvc2l0aW9uKCBpLCBfdmVydGV4ICk7XHJcblx0XHRcdHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludCggX3ZlcnRleCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB0aGUgYm91bmRpbmcgc3BoZXJlIG9mIHRoZSBza2lubmVkIG1lc2gsIGFuZCB1cGRhdGVzIHtAbGluayBTa2lubmVkTWVzaCNib3VuZGluZ1NwaGVyZX0uXHJcblx0ICogVGhlIGJvdW5kaW5nIHNwaGVyZSBpcyBhdXRvbWF0aWNhbGx5IGNvbXB1dGVkIGJ5IHRoZSBlbmdpbmUgb25jZSB3aGVuIGl0IGlzIG5lZWRlZCwgZS5nLiwgZm9yIHJheSBjYXN0aW5nXHJcblx0ICogYW5kIHZpZXcgZnJ1c3R1bSBjdWxsaW5nLiBJZiB0aGUgc2tpbm5lZCBtZXNoIGlzIGFuaW1hdGVkLCB0aGUgYm91bmRpbmcgc3BoZXJlIHNob3VsZCBiZSByZWNvbXB1dGVkXHJcblx0ICogcGVyIGZyYW1lIGluIG9yZGVyIHRvIHJlZmxlY3QgdGhlIGN1cnJlbnQgYW5pbWF0aW9uIHN0YXRlLlxyXG5cdCAqL1xyXG5cdGNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpIHtcclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmJvdW5kaW5nU3BoZXJlID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IG5ldyBTcGhlcmUoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5ib3VuZGluZ1NwaGVyZS5tYWtlRW1wdHkoKTtcclxuXHJcblx0XHRjb25zdCBwb3NpdGlvbkF0dHJpYnV0ZSA9IGdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJyApO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHBvc2l0aW9uQXR0cmlidXRlLmNvdW50OyBpICsrICkge1xyXG5cclxuXHRcdFx0dGhpcy5nZXRWZXJ0ZXhQb3NpdGlvbiggaSwgX3ZlcnRleCApO1xyXG5cdFx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlLmV4cGFuZEJ5UG9pbnQoIF92ZXJ0ZXggKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlLCByZWN1cnNpdmUgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlLCByZWN1cnNpdmUgKTtcclxuXHJcblx0XHR0aGlzLmJpbmRNb2RlID0gc291cmNlLmJpbmRNb2RlO1xyXG5cdFx0dGhpcy5iaW5kTWF0cml4LmNvcHkoIHNvdXJjZS5iaW5kTWF0cml4ICk7XHJcblx0XHR0aGlzLmJpbmRNYXRyaXhJbnZlcnNlLmNvcHkoIHNvdXJjZS5iaW5kTWF0cml4SW52ZXJzZSApO1xyXG5cclxuXHRcdHRoaXMuc2tlbGV0b24gPSBzb3VyY2Uuc2tlbGV0b247XHJcblxyXG5cdFx0aWYgKCBzb3VyY2UuYm91bmRpbmdCb3ggIT09IG51bGwgKSB0aGlzLmJvdW5kaW5nQm94ID0gc291cmNlLmJvdW5kaW5nQm94LmNsb25lKCk7XHJcblx0XHRpZiAoIHNvdXJjZS5ib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHRoaXMuYm91bmRpbmdTcGhlcmUgPSBzb3VyY2UuYm91bmRpbmdTcGhlcmUuY2xvbmUoKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHRyYXljYXN0KCByYXljYXN0ZXIsIGludGVyc2VjdHMgKSB7XHJcblxyXG5cdFx0Y29uc3QgbWF0ZXJpYWwgPSB0aGlzLm1hdGVyaWFsO1xyXG5cdFx0Y29uc3QgbWF0cml4V29ybGQgPSB0aGlzLm1hdHJpeFdvcmxkO1xyXG5cclxuXHRcdGlmICggbWF0ZXJpYWwgPT09IHVuZGVmaW5lZCApIHJldHVybjtcclxuXHJcblx0XHQvLyB0ZXN0IHdpdGggYm91bmRpbmcgc3BoZXJlIGluIHdvcmxkIHNwYWNlXHJcblxyXG5cdFx0aWYgKCB0aGlzLmJvdW5kaW5nU3BoZXJlID09PSBudWxsICkgdGhpcy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcclxuXHJcblx0XHRfc3BoZXJlLmNvcHkoIHRoaXMuYm91bmRpbmdTcGhlcmUgKTtcclxuXHRcdF9zcGhlcmUuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApO1xyXG5cclxuXHRcdGlmICggcmF5Y2FzdGVyLnJheS5pbnRlcnNlY3RzU3BoZXJlKCBfc3BoZXJlICkgPT09IGZhbHNlICkgcmV0dXJuO1xyXG5cclxuXHRcdC8vIGNvbnZlcnQgcmF5IHRvIGxvY2FsIHNwYWNlIG9mIHNraW5uZWQgbWVzaFxyXG5cclxuXHRcdF9pbnZlcnNlTWF0cml4LmNvcHkoIG1hdHJpeFdvcmxkICkuaW52ZXJ0KCk7XHJcblx0XHRfcmF5LmNvcHkoIHJheWNhc3Rlci5yYXkgKS5hcHBseU1hdHJpeDQoIF9pbnZlcnNlTWF0cml4ICk7XHJcblxyXG5cdFx0Ly8gdGVzdCB3aXRoIGJvdW5kaW5nIGJveCBpbiBsb2NhbCBzcGFjZVxyXG5cclxuXHRcdGlmICggdGhpcy5ib3VuZGluZ0JveCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGlmICggX3JheS5pbnRlcnNlY3RzQm94KCB0aGlzLmJvdW5kaW5nQm94ICkgPT09IGZhbHNlICkgcmV0dXJuO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyB0ZXN0IGZvciBpbnRlcnNlY3Rpb25zIHdpdGggZ2VvbWV0cnlcclxuXHJcblx0XHR0aGlzLl9jb21wdXRlSW50ZXJzZWN0aW9ucyggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzLCBfcmF5ICk7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0VmVydGV4UG9zaXRpb24oIGluZGV4LCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0c3VwZXIuZ2V0VmVydGV4UG9zaXRpb24oIGluZGV4LCB0YXJnZXQgKTtcclxuXHJcblx0XHR0aGlzLmFwcGx5Qm9uZVRyYW5zZm9ybSggaW5kZXgsIHRhcmdldCApO1xyXG5cclxuXHRcdHJldHVybiB0YXJnZXQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQmluZHMgdGhlIGdpdmVuIHNrZWxldG9uIHRvIHRoZSBza2lubmVkIG1lc2guXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1NrZWxldG9ufSBza2VsZXRvbiAtIFRoZSBza2VsZXRvbiB0byBiaW5kLlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4NH0gW2JpbmRNYXRyaXhdIC0gVGhlIGJpbmQgbWF0cml4LiBJZiBubyBiaW5kIG1hdHJpeCBpcyBwcm92aWRlZCxcclxuXHQgKiB0aGUgc2tpbm5lZCBtZXNoJ3Mgd29ybGQgbWF0cml4IHdpbGwgYmUgdXNlZCBpbnN0ZWFkLlxyXG5cdCAqL1xyXG5cdGJpbmQoIHNrZWxldG9uLCBiaW5kTWF0cml4ICkge1xyXG5cclxuXHRcdHRoaXMuc2tlbGV0b24gPSBza2VsZXRvbjtcclxuXHJcblx0XHRpZiAoIGJpbmRNYXRyaXggPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHRoaXMudXBkYXRlTWF0cml4V29ybGQoIHRydWUgKTtcclxuXHJcblx0XHRcdHRoaXMuc2tlbGV0b24uY2FsY3VsYXRlSW52ZXJzZXMoKTtcclxuXHJcblx0XHRcdGJpbmRNYXRyaXggPSB0aGlzLm1hdHJpeFdvcmxkO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmJpbmRNYXRyaXguY29weSggYmluZE1hdHJpeCApO1xyXG5cdFx0dGhpcy5iaW5kTWF0cml4SW52ZXJzZS5jb3B5KCBiaW5kTWF0cml4ICkuaW52ZXJ0KCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2Qgc2V0cyB0aGUgc2tpbm5lZCBtZXNoIGluIHRoZSByZXN0IHBvc2UpLlxyXG5cdCAqL1xyXG5cdHBvc2UoKSB7XHJcblxyXG5cdFx0dGhpcy5za2VsZXRvbi5wb3NlKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTm9ybWFsaXplcyB0aGUgc2tpbiB3ZWlnaHRzIHdoaWNoIGFyZSBkZWZpbmVkIGFzIGEgYnVmZmVyIGF0dHJpYnV0ZVxyXG5cdCAqIGluIHRoZSBza2lubmVkIG1lc2gncyBnZW9tZXRyeS5cclxuXHQgKi9cclxuXHRub3JtYWxpemVTa2luV2VpZ2h0cygpIHtcclxuXHJcblx0XHRjb25zdCB2ZWN0b3IgPSBuZXcgVmVjdG9yNCgpO1xyXG5cclxuXHRcdGNvbnN0IHNraW5XZWlnaHQgPSB0aGlzLmdlb21ldHJ5LmF0dHJpYnV0ZXMuc2tpbldlaWdodDtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBza2luV2VpZ2h0LmNvdW50OyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdHZlY3Rvci5mcm9tQnVmZmVyQXR0cmlidXRlKCBza2luV2VpZ2h0LCBpICk7XHJcblxyXG5cdFx0XHRjb25zdCBzY2FsZSA9IDEuMCAvIHZlY3Rvci5tYW5oYXR0YW5MZW5ndGgoKTtcclxuXHJcblx0XHRcdGlmICggc2NhbGUgIT09IEluZmluaXR5ICkge1xyXG5cclxuXHRcdFx0XHR2ZWN0b3IubXVsdGlwbHlTY2FsYXIoIHNjYWxlICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHR2ZWN0b3Iuc2V0KCAxLCAwLCAwLCAwICk7IC8vIGRvIHNvbWV0aGluZyByZWFzb25hYmxlXHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRza2luV2VpZ2h0LnNldFhZWlcoIGksIHZlY3Rvci54LCB2ZWN0b3IueSwgdmVjdG9yLnosIHZlY3Rvci53ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdHVwZGF0ZU1hdHJpeFdvcmxkKCBmb3JjZSApIHtcclxuXHJcblx0XHRzdXBlci51cGRhdGVNYXRyaXhXb3JsZCggZm9yY2UgKTtcclxuXHJcblx0XHRpZiAoIHRoaXMuYmluZE1vZGUgPT09IEF0dGFjaGVkQmluZE1vZGUgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmJpbmRNYXRyaXhJbnZlcnNlLmNvcHkoIHRoaXMubWF0cml4V29ybGQgKS5pbnZlcnQoKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCB0aGlzLmJpbmRNb2RlID09PSBEZXRhY2hlZEJpbmRNb2RlICkge1xyXG5cclxuXHRcdFx0dGhpcy5iaW5kTWF0cml4SW52ZXJzZS5jb3B5KCB0aGlzLmJpbmRNYXRyaXggKS5pbnZlcnQoKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuU2tpbm5lZE1lc2g6IFVucmVjb2duaXplZCBiaW5kTW9kZTogJyArIHRoaXMuYmluZE1vZGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQXBwbGllcyB0aGUgYm9uZSB0cmFuc2Zvcm0gYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBpbmRleCB0byB0aGUgZ2l2ZW5cclxuXHQgKiB2ZXJ0ZXggcG9zaXRpb24uIFJldHVybnMgdGhlIHVwZGF0ZWQgdmVjdG9yLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIHZlcnRleCBpbmRleC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHRhcmdldCAtIFRoZSB0YXJnZXQgb2JqZWN0IHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbWV0aG9kJ3MgcmVzdWx0LlxyXG5cdCAqIHRoZSBza2lubmVkIG1lc2gncyB3b3JsZCBtYXRyaXggd2lsbCBiZSB1c2VkIGluc3RlYWQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gVGhlIHVwZGF0ZWQgdmVydGV4IHBvc2l0aW9uLlxyXG5cdCAqL1xyXG5cdGFwcGx5Qm9uZVRyYW5zZm9ybSggaW5kZXgsIHRhcmdldCApIHtcclxuXHJcblx0XHRjb25zdCBza2VsZXRvbiA9IHRoaXMuc2tlbGV0b247XHJcblx0XHRjb25zdCBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XHJcblxyXG5cdFx0X3NraW5JbmRleC5mcm9tQnVmZmVyQXR0cmlidXRlKCBnZW9tZXRyeS5hdHRyaWJ1dGVzLnNraW5JbmRleCwgaW5kZXggKTtcclxuXHRcdF9za2luV2VpZ2h0LmZyb21CdWZmZXJBdHRyaWJ1dGUoIGdlb21ldHJ5LmF0dHJpYnV0ZXMuc2tpbldlaWdodCwgaW5kZXggKTtcclxuXHJcblx0XHRfYmFzZVBvc2l0aW9uLmNvcHkoIHRhcmdldCApLmFwcGx5TWF0cml4NCggdGhpcy5iaW5kTWF0cml4ICk7XHJcblxyXG5cdFx0dGFyZ2V0LnNldCggMCwgMCwgMCApO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDQ7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB3ZWlnaHQgPSBfc2tpbldlaWdodC5nZXRDb21wb25lbnQoIGkgKTtcclxuXHJcblx0XHRcdGlmICggd2VpZ2h0ICE9PSAwICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBib25lSW5kZXggPSBfc2tpbkluZGV4LmdldENvbXBvbmVudCggaSApO1xyXG5cclxuXHRcdFx0XHRfbWF0cml4NC5tdWx0aXBseU1hdHJpY2VzKCBza2VsZXRvbi5ib25lc1sgYm9uZUluZGV4IF0ubWF0cml4V29ybGQsIHNrZWxldG9uLmJvbmVJbnZlcnNlc1sgYm9uZUluZGV4IF0gKTtcclxuXHJcblx0XHRcdFx0dGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggX3ZlY3RvcjMuY29weSggX2Jhc2VQb3NpdGlvbiApLmFwcGx5TWF0cml4NCggX21hdHJpeDQgKSwgd2VpZ2h0ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0YXJnZXQuYXBwbHlNYXRyaXg0KCB0aGlzLmJpbmRNYXRyaXhJbnZlcnNlICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFNraW5uZWRNZXNoIH07XHJcbiIsImltcG9ydCB7IE9iamVjdDNEIH0gZnJvbSAnLi4vY29yZS9PYmplY3QzRC5qcyc7XHJcblxyXG4vKipcclxuICogQSBib25lIHdoaWNoIGlzIHBhcnQgb2YgYSB7QGxpbmsgU2tlbGV0b259LiBUaGUgc2tlbGV0b24gaW4gdHVybiBpcyB1c2VkIGJ5XHJcbiAqIHRoZSB7QGxpbmsgU2tpbm5lZE1lc2h9LlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCByb290ID0gbmV3IFRIUkVFLkJvbmUoKTtcclxuICogY29uc3QgY2hpbGQgPSBuZXcgVEhSRUUuQm9uZSgpO1xyXG4gKlxyXG4gKiByb290LmFkZCggY2hpbGQgKTtcclxuICogY2hpbGQucG9zaXRpb24ueSA9IDU7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgT2JqZWN0M0RcclxuICovXHJcbmNsYXNzIEJvbmUgZXh0ZW5kcyBPYmplY3QzRCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYm9uZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0JvbmUgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdCb25lJztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgQm9uZSB9O1xyXG4iLCJpbXBvcnQgeyBUZXh0dXJlIH0gZnJvbSAnLi9UZXh0dXJlLmpzJztcclxuaW1wb3J0IHsgTmVhcmVzdEZpbHRlciB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIHRleHR1cmUgZGlyZWN0bHkgZnJvbSByYXcgYnVmZmVyIGRhdGEuXHJcbiAqXHJcbiAqIFRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGUgZGF0YSBkZXBlbmRzIG9uIHR5cGUgYW5kIGZvcm1hdDogSWYgdGhlIHR5cGUgaXNcclxuICogYFVuc2lnbmVkQnl0ZVR5cGVgLCBhIGBVaW50OEFycmF5YCB3aWxsIGJlIHVzZWZ1bCBmb3IgYWRkcmVzc2luZyB0aGVcclxuICogdGV4ZWwgZGF0YS4gSWYgdGhlIGZvcm1hdCBpcyBgUkdCQUZvcm1hdGAsIGRhdGEgbmVlZHMgZm91ciB2YWx1ZXMgZm9yXHJcbiAqIG9uZSB0ZXhlbDsgUmVkLCBHcmVlbiwgQmx1ZSBhbmQgQWxwaGEgKHR5cGljYWxseSB0aGUgb3BhY2l0eSkuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBUZXh0dXJlXHJcbiAqL1xyXG5jbGFzcyBEYXRhVGV4dHVyZSBleHRlbmRzIFRleHR1cmUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGRhdGEgdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7P1R5cGVkQXJyYXl9IFtkYXRhPW51bGxdIC0gVGhlIGJ1ZmZlciBkYXRhLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbd2lkdGg9MV0gLSBUaGUgd2lkdGggb2YgdGhlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtoZWlnaHQ9MV0gLSBUaGUgaGVpZ2h0IG9mIHRoZSB0ZXh0dXJlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZm9ybWF0PVJHQkFGb3JtYXRdIC0gVGhlIHRleHR1cmUgZm9ybWF0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbdHlwZT1VbnNpZ25lZEJ5dGVUeXBlXSAtIFRoZSB0ZXh0dXJlIHR5cGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFttYXBwaW5nPVRleHR1cmUuREVGQVVMVF9NQVBQSU5HXSAtIFRoZSB0ZXh0dXJlIG1hcHBpbmcuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt3cmFwUz1DbGFtcFRvRWRnZVdyYXBwaW5nXSAtIFRoZSB3cmFwUyB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3dyYXBUPUNsYW1wVG9FZGdlV3JhcHBpbmddIC0gVGhlIHdyYXBUIHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbWFnRmlsdGVyPU5lYXJlc3RGaWx0ZXJdIC0gVGhlIG1hZyBmaWx0ZXIgdmFsdWUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFttaW5GaWx0ZXI9TmVhcmVzdEZpbHRlcl0gLSBUaGUgbWluIGZpbHRlciB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2FuaXNvdHJvcHk9VGV4dHVyZS5ERUZBVUxUX0FOSVNPVFJPUFldIC0gVGhlIGFuaXNvdHJvcHkgdmFsdWUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtjb2xvclNwYWNlPU5vQ29sb3JTcGFjZV0gLSBUaGUgY29sb3Igc3BhY2UuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGRhdGEgPSBudWxsLCB3aWR0aCA9IDEsIGhlaWdodCA9IDEsIGZvcm1hdCwgdHlwZSwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIgPSBOZWFyZXN0RmlsdGVyLCBtaW5GaWx0ZXIgPSBOZWFyZXN0RmlsdGVyLCBhbmlzb3Ryb3B5LCBjb2xvclNwYWNlICkge1xyXG5cclxuXHRcdHN1cGVyKCBudWxsLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHksIGNvbG9yU3BhY2UgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNEYXRhVGV4dHVyZSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgaW1hZ2UgZGVmaW5pdGlvbiBvZiBhIGRhdGEgdGV4dHVyZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7e2RhdGE6VHlwZWRBcnJheSx3aWR0aDpudW1iZXIsaGVpZ2h0Om51bWJlcn19XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaW1hZ2UgPSB7IGRhdGE6IGRhdGEsIHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQgfTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdG8gZ2VuZXJhdGUgbWlwbWFwcyAoaWYgcG9zc2libGUpIGZvciBhIHRleHR1cmUuXHJcblx0XHQgKlxyXG5cdFx0ICogT3ZlcndyaXR0ZW4gYW5kIHNldCB0byBgZmFsc2VgIGJ5IGRlZmF1bHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSWYgc2V0IHRvIGB0cnVlYCwgdGhlIHRleHR1cmUgaXMgZmxpcHBlZCBhbG9uZyB0aGUgdmVydGljYWwgYXhpcyB3aGVuXHJcblx0XHQgKiB1cGxvYWRlZCB0byB0aGUgR1BVLlxyXG5cdFx0ICpcclxuXHRcdCAqIE92ZXJ3cml0dGVuIGFuZCBzZXQgdG8gYGZhbHNlYCBieSBkZWZhdWx0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5mbGlwWSA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU3BlY2lmaWVzIHRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzIGZvciB0aGUgc3RhcnQgb2YgZWFjaCBwaXhlbCByb3cgaW4gbWVtb3J5LlxyXG5cdFx0ICpcclxuXHRcdCAqIE92ZXJ3cml0dGVuIGFuZCBzZXQgdG8gYDFgIGJ5IGRlZmF1bHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudW5wYWNrQWxpZ25tZW50ID0gMTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgRGF0YVRleHR1cmUgfTtcclxuIiwiaW1wb3J0IHtcclxuXHRSR0JBRm9ybWF0LFxyXG5cdEZsb2F0VHlwZVxyXG59IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IEJvbmUgfSBmcm9tICcuL0JvbmUuanMnO1xyXG5pbXBvcnQgeyBNYXRyaXg0IH0gZnJvbSAnLi4vbWF0aC9NYXRyaXg0LmpzJztcclxuaW1wb3J0IHsgRGF0YVRleHR1cmUgfSBmcm9tICcuLi90ZXh0dXJlcy9EYXRhVGV4dHVyZS5qcyc7XHJcbmltcG9ydCB7IGdlbmVyYXRlVVVJRCB9IGZyb20gJy4uL21hdGgvTWF0aFV0aWxzLmpzJztcclxuXHJcbmNvbnN0IF9vZmZzZXRNYXRyaXggPSAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXg0KCk7XHJcbmNvbnN0IF9pZGVudGl0eU1hdHJpeCA9IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDQoKTtcclxuXHJcbi8qKlxyXG4gKiBDbGFzcyBmb3IgcmVwcmVzZW50aW5nIHRoZSBhcm1hdHVyZXMgaW4gYHRocmVlLmpzYC4gVGhlIHNrZWxldG9uXHJcbiAqIGlzIGRlZmluZWQgYnkgYSBoaWVyYXJjaHkgb2YgYm9uZXMuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGJvbmVzID0gW107XHJcbiAqXHJcbiAqIGNvbnN0IHNob3VsZGVyID0gbmV3IFRIUkVFLkJvbmUoKTtcclxuICogY29uc3QgZWxib3cgPSBuZXcgVEhSRUUuQm9uZSgpO1xyXG4gKiBjb25zdCBoYW5kID0gbmV3IFRIUkVFLkJvbmUoKTtcclxuICpcclxuICogc2hvdWxkZXIuYWRkKCBlbGJvdyApO1xyXG4gKiBlbGJvdy5hZGQoIGhhbmQgKTtcclxuICpcclxuICogYm9uZXMucHVzaCggc2hvdWxkZXIgLCBlbGJvdywgaGFuZCk7XHJcbiAqXHJcbiAqIHNob3VsZGVyLnBvc2l0aW9uLnkgPSAtNTtcclxuICogZWxib3cucG9zaXRpb24ueSA9IDA7XHJcbiAqIGhhbmQucG9zaXRpb24ueSA9IDU7XHJcbiAqXHJcbiAqIGNvbnN0IGFybVNrZWxldG9uID0gbmV3IFRIUkVFLlNrZWxldG9uKCBib25lcyApO1xyXG4gKiBgYGBcclxuICovXHJcbmNsYXNzIFNrZWxldG9uIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBza2VsZXRvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8Qm9uZT59IFtib25lc10gLSBBbiBhcnJheSBvZiBib25lcy5cclxuXHQgKiBAcGFyYW0ge0FycmF5PE1hdHJpeDQ+fSBbYm9uZUludmVyc2VzXSAtIEFuIGFycmF5IG9mIGJvbmUgaW52ZXJzZSBtYXRyaWNlcy5cclxuXHQgKiBJZiBub3QgcHJvdmlkZWQsIHRoZXNlIG1hdHJpY2VzIHdpbGwgYmUgY29tcHV0ZWQgYXV0b21hdGljYWxseSB2aWEge0BsaW5rIFNrZWxldG9uI2NhbGN1bGF0ZUludmVyc2VzfS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggYm9uZXMgPSBbXSwgYm9uZUludmVyc2VzID0gW10gKSB7XHJcblxyXG5cdFx0dGhpcy51dWlkID0gZ2VuZXJhdGVVVUlEKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBhcnJheSBvZiBib25lcyBkZWZpbmluZyB0aGUgc2tlbGV0b24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PEJvbmU+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJvbmVzID0gYm9uZXMuc2xpY2UoIDAgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIGFycmF5IG9mIGJvbmUgaW52ZXJzZSBtYXRyaWNlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8TWF0cml4ND59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYm9uZUludmVyc2VzID0gYm9uZUludmVyc2VzO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQW4gYXJyYXkgYnVmZmVyIGhvbGRpbmcgdGhlIGJvbmUgZGF0YS5cclxuXHRcdCAqIElucHV0IGRhdGEgZm9yIHtAbGluayBTa2VsZXRvbiNib25lVGV4dHVyZX0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9GbG9hdDMyQXJyYXl9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYm9uZU1hdHJpY2VzID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgdGV4dHVyZSBob2xkaW5nIHRoZSBib25lIGRhdGEgZm9yIHVzZVxyXG5cdFx0ICogaW4gdGhlIHZlcnRleCBzaGFkZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9EYXRhVGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ib25lVGV4dHVyZSA9IG51bGw7XHJcblxyXG5cdFx0dGhpcy5pbml0KCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW5pdGlhbGl6ZXMgdGhlIHNrZWxldG9uLiBUaGlzIG1ldGhvZCBnZXRzIGF1dG9tYXRpY2FsbHkgY2FsbGVkIGJ5IHRoZSBjb25zdHJ1Y3RvclxyXG5cdCAqIGJ1dCBkZXBlbmRpbmcgb24gaG93IHRoZSBza2VsZXRvbiBpcyBjcmVhdGVkIGl0IG1pZ2h0IGJlIG5lY2Vzc2FyeSB0byBjYWxsIHRoaXMgbWV0aG9kXHJcblx0ICogbWFudWFsbHkuXHJcblx0ICovXHJcblx0aW5pdCgpIHtcclxuXHJcblx0XHRjb25zdCBib25lcyA9IHRoaXMuYm9uZXM7XHJcblx0XHRjb25zdCBib25lSW52ZXJzZXMgPSB0aGlzLmJvbmVJbnZlcnNlcztcclxuXHJcblx0XHR0aGlzLmJvbmVNYXRyaWNlcyA9IG5ldyBGbG9hdDMyQXJyYXkoIGJvbmVzLmxlbmd0aCAqIDE2ICk7XHJcblxyXG5cdFx0Ly8gY2FsY3VsYXRlIGludmVyc2UgYm9uZSBtYXRyaWNlcyBpZiBuZWNlc3NhcnlcclxuXHJcblx0XHRpZiAoIGJvbmVJbnZlcnNlcy5sZW5ndGggPT09IDAgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmNhbGN1bGF0ZUludmVyc2VzKCk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdC8vIGhhbmRsZSBzcGVjaWFsIGNhc2VcclxuXHJcblx0XHRcdGlmICggYm9uZXMubGVuZ3RoICE9PSBib25lSW52ZXJzZXMubGVuZ3RoICkge1xyXG5cclxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Ta2VsZXRvbjogTnVtYmVyIG9mIGludmVyc2UgYm9uZSBtYXRyaWNlcyBkb2VzIG5vdCBtYXRjaCBhbW91bnQgb2YgYm9uZXMuJyApO1xyXG5cclxuXHRcdFx0XHR0aGlzLmJvbmVJbnZlcnNlcyA9IFtdO1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gdGhpcy5ib25lcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHR0aGlzLmJvbmVJbnZlcnNlcy5wdXNoKCBuZXcgTWF0cml4NCgpICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgdGhlIGJvbmUgaW52ZXJzZSBtYXRyaWNlcy4gVGhpcyBtZXRob2QgcmVzZXRzIHtAbGluayBTa2VsZXRvbiNib25lSW52ZXJzZXN9XHJcblx0ICogYW5kIGZpbGxzIGl0IHdpdGggbmV3IG1hdHJpY2VzLlxyXG5cdCAqL1xyXG5cdGNhbGN1bGF0ZUludmVyc2VzKCkge1xyXG5cclxuXHRcdHRoaXMuYm9uZUludmVyc2VzLmxlbmd0aCA9IDA7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IHRoaXMuYm9uZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBpbnZlcnNlID0gbmV3IE1hdHJpeDQoKTtcclxuXHJcblx0XHRcdGlmICggdGhpcy5ib25lc1sgaSBdICkge1xyXG5cclxuXHRcdFx0XHRpbnZlcnNlLmNvcHkoIHRoaXMuYm9uZXNbIGkgXS5tYXRyaXhXb3JsZCApLmludmVydCgpO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5ib25lSW52ZXJzZXMucHVzaCggaW52ZXJzZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXNldHMgdGhlIHNrZWxldG9uIHRvIHRoZSBiYXNlIHBvc2UuXHJcblx0ICovXHJcblx0cG9zZSgpIHtcclxuXHJcblx0XHQvLyByZWNvdmVyIHRoZSBiaW5kLXRpbWUgd29ybGQgbWF0cmljZXNcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gdGhpcy5ib25lcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGJvbmUgPSB0aGlzLmJvbmVzWyBpIF07XHJcblxyXG5cdFx0XHRpZiAoIGJvbmUgKSB7XHJcblxyXG5cdFx0XHRcdGJvbmUubWF0cml4V29ybGQuY29weSggdGhpcy5ib25lSW52ZXJzZXNbIGkgXSApLmludmVydCgpO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBjb21wdXRlIHRoZSBsb2NhbCBtYXRyaWNlcywgcG9zaXRpb25zLCByb3RhdGlvbnMgYW5kIHNjYWxlc1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSB0aGlzLmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYm9uZSA9IHRoaXMuYm9uZXNbIGkgXTtcclxuXHJcblx0XHRcdGlmICggYm9uZSApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBib25lLnBhcmVudCAmJiBib25lLnBhcmVudC5pc0JvbmUgKSB7XHJcblxyXG5cdFx0XHRcdFx0Ym9uZS5tYXRyaXguY29weSggYm9uZS5wYXJlbnQubWF0cml4V29ybGQgKS5pbnZlcnQoKTtcclxuXHRcdFx0XHRcdGJvbmUubWF0cml4Lm11bHRpcGx5KCBib25lLm1hdHJpeFdvcmxkICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0Ym9uZS5tYXRyaXguY29weSggYm9uZS5tYXRyaXhXb3JsZCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGJvbmUubWF0cml4LmRlY29tcG9zZSggYm9uZS5wb3NpdGlvbiwgYm9uZS5xdWF0ZXJuaW9uLCBib25lLnNjYWxlICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlc2V0cyB0aGUgc2tlbGV0b24gdG8gdGhlIGJhc2UgcG9zZS5cclxuXHQgKi9cclxuXHR1cGRhdGUoKSB7XHJcblxyXG5cdFx0Y29uc3QgYm9uZXMgPSB0aGlzLmJvbmVzO1xyXG5cdFx0Y29uc3QgYm9uZUludmVyc2VzID0gdGhpcy5ib25lSW52ZXJzZXM7XHJcblx0XHRjb25zdCBib25lTWF0cmljZXMgPSB0aGlzLmJvbmVNYXRyaWNlcztcclxuXHRcdGNvbnN0IGJvbmVUZXh0dXJlID0gdGhpcy5ib25lVGV4dHVyZTtcclxuXHJcblx0XHQvLyBmbGF0dGVuIGJvbmUgbWF0cmljZXMgdG8gYXJyYXlcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gYm9uZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHQvLyBjb21wdXRlIHRoZSBvZmZzZXQgYmV0d2VlbiB0aGUgY3VycmVudCBhbmQgdGhlIG9yaWdpbmFsIHRyYW5zZm9ybVxyXG5cclxuXHRcdFx0Y29uc3QgbWF0cml4ID0gYm9uZXNbIGkgXSA/IGJvbmVzWyBpIF0ubWF0cml4V29ybGQgOiBfaWRlbnRpdHlNYXRyaXg7XHJcblxyXG5cdFx0XHRfb2Zmc2V0TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIG1hdHJpeCwgYm9uZUludmVyc2VzWyBpIF0gKTtcclxuXHRcdFx0X29mZnNldE1hdHJpeC50b0FycmF5KCBib25lTWF0cmljZXMsIGkgKiAxNiApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGJvbmVUZXh0dXJlICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0Ym9uZVRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbmV3IHNrZWxldG9uIHdpdGggY29waWVkIHZhbHVlcyBmcm9tIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtTa2VsZXRvbn0gQSBjbG9uZSBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNsb25lKCkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgU2tlbGV0b24oIHRoaXMuYm9uZXMsIHRoaXMuYm9uZUludmVyc2VzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgYSBkYXRhIHRleHR1cmUgZm9yIHBhc3NpbmcgYm9uZSBkYXRhIHRvIHRoZSB2ZXJ0ZXggc2hhZGVyLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7U2tlbGV0b259IEEgcmVmZXJlbmNlIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y29tcHV0ZUJvbmVUZXh0dXJlKCkge1xyXG5cclxuXHRcdC8vIGxheW91dCAoMSBtYXRyaXggPSA0IHBpeGVscylcclxuXHRcdC8vICAgICAgUkdCQSBSR0JBIFJHQkEgUkdCQSAoPT4gY29sdW1uMSwgY29sdW1uMiwgY29sdW1uMywgY29sdW1uNClcclxuXHRcdC8vICB3aXRoICA4eDggIHBpeGVsIHRleHR1cmUgbWF4ICAgMTYgYm9uZXMgKiA0IHBpeGVscyA9ICAoOCAqIDgpXHJcblx0XHQvLyAgICAgICAxNngxNiBwaXhlbCB0ZXh0dXJlIG1heCAgIDY0IGJvbmVzICogNCBwaXhlbHMgPSAoMTYgKiAxNilcclxuXHRcdC8vICAgICAgIDMyeDMyIHBpeGVsIHRleHR1cmUgbWF4ICAyNTYgYm9uZXMgKiA0IHBpeGVscyA9ICgzMiAqIDMyKVxyXG5cdFx0Ly8gICAgICAgNjR4NjQgcGl4ZWwgdGV4dHVyZSBtYXggMTAyNCBib25lcyAqIDQgcGl4ZWxzID0gKDY0ICogNjQpXHJcblxyXG5cdFx0bGV0IHNpemUgPSBNYXRoLnNxcnQoIHRoaXMuYm9uZXMubGVuZ3RoICogNCApOyAvLyA0IHBpeGVscyBuZWVkZWQgZm9yIDEgbWF0cml4XHJcblx0XHRzaXplID0gTWF0aC5jZWlsKCBzaXplIC8gNCApICogNDtcclxuXHRcdHNpemUgPSBNYXRoLm1heCggc2l6ZSwgNCApO1xyXG5cclxuXHRcdGNvbnN0IGJvbmVNYXRyaWNlcyA9IG5ldyBGbG9hdDMyQXJyYXkoIHNpemUgKiBzaXplICogNCApOyAvLyA0IGZsb2F0cyBwZXIgUkdCQSBwaXhlbFxyXG5cdFx0Ym9uZU1hdHJpY2VzLnNldCggdGhpcy5ib25lTWF0cmljZXMgKTsgLy8gY29weSBjdXJyZW50IHZhbHVlc1xyXG5cclxuXHRcdGNvbnN0IGJvbmVUZXh0dXJlID0gbmV3IERhdGFUZXh0dXJlKCBib25lTWF0cmljZXMsIHNpemUsIHNpemUsIFJHQkFGb3JtYXQsIEZsb2F0VHlwZSApO1xyXG5cdFx0Ym9uZVRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMuYm9uZU1hdHJpY2VzID0gYm9uZU1hdHJpY2VzO1xyXG5cdFx0dGhpcy5ib25lVGV4dHVyZSA9IGJvbmVUZXh0dXJlO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNlYXJjaGVzIHRocm91Z2ggdGhlIHNrZWxldG9uJ3MgYm9uZSBhcnJheSBhbmQgcmV0dXJucyB0aGUgZmlyc3Qgd2l0aCBhXHJcblx0ICogbWF0Y2hpbmcgbmFtZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGJvbmUuXHJcblx0ICogQHJldHVybiB7Qm9uZXx1bmRlZmluZWR9IFRoZSBmb3VuZCBib25lLiBgdW5kZWZpbmVkYCBpZiBubyBib25lIGhhcyBiZWVuIGZvdW5kLlxyXG5cdCAqL1xyXG5cdGdldEJvbmVCeU5hbWUoIG5hbWUgKSB7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IHRoaXMuYm9uZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBib25lID0gdGhpcy5ib25lc1sgaSBdO1xyXG5cclxuXHRcdFx0aWYgKCBib25lLm5hbWUgPT09IG5hbWUgKSB7XHJcblxyXG5cdFx0XHRcdHJldHVybiBib25lO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZyZWVzIHRoZSBHUFUtcmVsYXRlZCByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHRoaXMgaW5zdGFuY2UuIENhbGwgdGhpc1xyXG5cdCAqIG1ldGhvZCB3aGVuZXZlciB0aGlzIGluc3RhbmNlIGlzIG5vIGxvbmdlciB1c2VkIGluIHlvdXIgYXBwLlxyXG5cdCAqL1xyXG5cdGRpc3Bvc2UoICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5ib25lVGV4dHVyZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuYm9uZVRleHR1cmUuZGlzcG9zZSgpO1xyXG5cclxuXHRcdFx0dGhpcy5ib25lVGV4dHVyZSA9IG51bGw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHVwcyB0aGUgc2tlbGV0b24gYnkgdGhlIGdpdmVuIEpTT04gYW5kIGJvbmVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGpzb24gLSBUaGUgc2tlbGV0b24gYXMgc2VyaWFsaXplZCBKU09OLlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0PHN0cmluZywgQm9uZT59IGJvbmVzIC0gQW4gYXJyYXkgb2YgYm9uZXMuXHJcblx0ICogQHJldHVybiB7U2tlbGV0b259IEEgcmVmZXJlbmNlIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0ZnJvbUpTT04oIGpzb24sIGJvbmVzICkge1xyXG5cclxuXHRcdHRoaXMudXVpZCA9IGpzb24udXVpZDtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBqc29uLmJvbmVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB1dWlkID0ganNvbi5ib25lc1sgaSBdO1xyXG5cdFx0XHRsZXQgYm9uZSA9IGJvbmVzWyB1dWlkIF07XHJcblxyXG5cdFx0XHRpZiAoIGJvbmUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuU2tlbGV0b246IE5vIGJvbmUgZm91bmQgd2l0aCBVVUlEOicsIHV1aWQgKTtcclxuXHRcdFx0XHRib25lID0gbmV3IEJvbmUoKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuYm9uZXMucHVzaCggYm9uZSApO1xyXG5cdFx0XHR0aGlzLmJvbmVJbnZlcnNlcy5wdXNoKCBuZXcgTWF0cml4NCgpLmZyb21BcnJheSgganNvbi5ib25lSW52ZXJzZXNbIGkgXSApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuaW5pdCgpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNlcmlhbGl6ZXMgdGhlIHNrZWxldG9uIGludG8gSlNPTi5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge09iamVjdH0gQSBKU09OIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNlcmlhbGl6ZWQgc2tlbGV0b24uXHJcblx0ICogQHNlZSB7QGxpbmsgT2JqZWN0TG9hZGVyI3BhcnNlfVxyXG5cdCAqL1xyXG5cdHRvSlNPTigpIHtcclxuXHJcblx0XHRjb25zdCBkYXRhID0ge1xyXG5cdFx0XHRtZXRhZGF0YToge1xyXG5cdFx0XHRcdHZlcnNpb246IDQuNixcclxuXHRcdFx0XHR0eXBlOiAnU2tlbGV0b24nLFxyXG5cdFx0XHRcdGdlbmVyYXRvcjogJ1NrZWxldG9uLnRvSlNPTidcclxuXHRcdFx0fSxcclxuXHRcdFx0Ym9uZXM6IFtdLFxyXG5cdFx0XHRib25lSW52ZXJzZXM6IFtdXHJcblx0XHR9O1xyXG5cclxuXHRcdGRhdGEudXVpZCA9IHRoaXMudXVpZDtcclxuXHJcblx0XHRjb25zdCBib25lcyA9IHRoaXMuYm9uZXM7XHJcblx0XHRjb25zdCBib25lSW52ZXJzZXMgPSB0aGlzLmJvbmVJbnZlcnNlcztcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBib25lcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYm9uZSA9IGJvbmVzWyBpIF07XHJcblx0XHRcdGRhdGEuYm9uZXMucHVzaCggYm9uZS51dWlkICk7XHJcblxyXG5cdFx0XHRjb25zdCBib25lSW52ZXJzZSA9IGJvbmVJbnZlcnNlc1sgaSBdO1xyXG5cdFx0XHRkYXRhLmJvbmVJbnZlcnNlcy5wdXNoKCBib25lSW52ZXJzZS50b0FycmF5KCkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGRhdGE7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFNrZWxldG9uIH07XHJcbiIsImltcG9ydCB7IEJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4vQnVmZmVyQXR0cmlidXRlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBbiBpbnN0YW5jZWQgdmVyc2lvbiBvZiBhIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBCdWZmZXJBdHRyaWJ1dGVcclxuICovXHJcbmNsYXNzIEluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSBleHRlbmRzIEJ1ZmZlckF0dHJpYnV0ZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2VkIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1R5cGVkQXJyYXl9IGFycmF5IC0gVGhlIGFycmF5IGhvbGRpbmcgdGhlIGF0dHJpYnV0ZSBkYXRhLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpdGVtU2l6ZSAtIFRoZSBpdGVtIHNpemUuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbbm9ybWFsaXplZD1mYWxzZV0gLSBXaGV0aGVyIHRoZSBkYXRhIGFyZSBub3JtYWxpemVkIG9yIG5vdC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW21lc2hQZXJBdHRyaWJ1dGU9MV0gLSBIb3cgb2Z0ZW4gYSB2YWx1ZSBvZiB0aGlzIGJ1ZmZlciBhdHRyaWJ1dGUgc2hvdWxkIGJlIHJlcGVhdGVkLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQsIG1lc2hQZXJBdHRyaWJ1dGUgPSAxICkge1xyXG5cclxuXHRcdHN1cGVyKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyBob3cgb2Z0ZW4gYSB2YWx1ZSBvZiB0aGlzIGJ1ZmZlciBhdHRyaWJ1dGUgc2hvdWxkIGJlIHJlcGVhdGVkLiBBXHJcblx0XHQgKiB2YWx1ZSBvZiBvbmUgbWVhbnMgdGhhdCBlYWNoIHZhbHVlIG9mIHRoZSBpbnN0YW5jZWQgYXR0cmlidXRlIGlzIHVzZWQgZm9yXHJcblx0XHQgKiBhIHNpbmdsZSBpbnN0YW5jZS4gQSB2YWx1ZSBvZiB0d28gbWVhbnMgdGhhdCBlYWNoIHZhbHVlIGlzIHVzZWQgZm9yIHR3b1xyXG5cdFx0ICogY29uc2VjdXRpdmUgaW5zdGFuY2VzIChhbmQgc28gb24pLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWVzaFBlckF0dHJpYnV0ZSA9IG1lc2hQZXJBdHRyaWJ1dGU7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMubWVzaFBlckF0dHJpYnV0ZSA9IHNvdXJjZS5tZXNoUGVyQXR0cmlidXRlO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdHRvSlNPTigpIHtcclxuXHJcblx0XHRjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCk7XHJcblxyXG5cdFx0ZGF0YS5tZXNoUGVyQXR0cmlidXRlID0gdGhpcy5tZXNoUGVyQXR0cmlidXRlO1xyXG5cclxuXHRcdGRhdGEuaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUgPSB0cnVlO1xyXG5cclxuXHRcdHJldHVybiBkYXRhO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUgfTtcclxuIiwiaW1wb3J0IHsgSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9JbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5pbXBvcnQgeyBNZXNoIH0gZnJvbSAnLi9NZXNoLmpzJztcclxuaW1wb3J0IHsgQm94MyB9IGZyb20gJy4uL21hdGgvQm94My5qcyc7XHJcbmltcG9ydCB7IE1hdHJpeDQgfSBmcm9tICcuLi9tYXRoL01hdHJpeDQuanMnO1xyXG5pbXBvcnQgeyBTcGhlcmUgfSBmcm9tICcuLi9tYXRoL1NwaGVyZS5qcyc7XHJcbmltcG9ydCB7IERhdGFUZXh0dXJlIH0gZnJvbSAnLi4vdGV4dHVyZXMvRGF0YVRleHR1cmUuanMnO1xyXG5pbXBvcnQgeyBGbG9hdFR5cGUsIFJlZEZvcm1hdCB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XHJcblxyXG5jb25zdCBfaW5zdGFuY2VMb2NhbE1hdHJpeCA9IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDQoKTtcclxuY29uc3QgX2luc3RhbmNlV29ybGRNYXRyaXggPSAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXg0KCk7XHJcblxyXG5jb25zdCBfaW5zdGFuY2VJbnRlcnNlY3RzID0gW107XHJcblxyXG5jb25zdCBfYm94MyA9IC8qQF9fUFVSRV9fKi8gbmV3IEJveDMoKTtcclxuY29uc3QgX2lkZW50aXR5ID0gLypAX19QVVJFX18qLyBuZXcgTWF0cml4NCgpO1xyXG5jb25zdCBfbWVzaCA9IC8qQF9fUFVSRV9fKi8gbmV3IE1lc2goKTtcclxuY29uc3QgX3NwaGVyZSA9IC8qQF9fUFVSRV9fKi8gbmV3IFNwaGVyZSgpO1xyXG5cclxuLyoqXHJcbiAqIEEgc3BlY2lhbCB2ZXJzaW9uIG9mIGEgbWVzaCB3aXRoIGluc3RhbmNlZCByZW5kZXJpbmcgc3VwcG9ydC4gVXNlXHJcbiAqIHRoaXMgY2xhc3MgaWYgeW91IGhhdmUgdG8gcmVuZGVyIGEgbGFyZ2UgbnVtYmVyIG9mIG9iamVjdHMgd2l0aCB0aGUgc2FtZVxyXG4gKiBnZW9tZXRyeSBhbmQgbWF0ZXJpYWwocykgYnV0IHdpdGggZGlmZmVyZW50IHdvcmxkIHRyYW5zZm9ybWF0aW9ucy4gVGhlIHVzYWdlXHJcbiAqIG9mICdJbnN0YW5jZWRNZXNoJyB3aWxsIGhlbHAgeW91IHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGRyYXcgY2FsbHMgYW5kIHRodXNcclxuICogaW1wcm92ZSB0aGUgb3ZlcmFsbCByZW5kZXJpbmcgcGVyZm9ybWFuY2UgaW4geW91ciBhcHBsaWNhdGlvbi5cclxuICpcclxuICogQGF1Z21lbnRzIE1lc2hcclxuICovXHJcbmNsYXNzIEluc3RhbmNlZE1lc2ggZXh0ZW5kcyBNZXNoIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZWQgbWVzaC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyR2VvbWV0cnl9IFtnZW9tZXRyeV0gLSBUaGUgbWVzaCBnZW9tZXRyeS5cclxuXHQgKiBAcGFyYW0ge01hdGVyaWFsfEFycmF5PE1hdGVyaWFsPn0gW21hdGVyaWFsXSAtIFRoZSBtZXNoIG1hdGVyaWFsLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudCAtIFRoZSBudW1iZXIgb2YgaW5zdGFuY2VzLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGNvdW50ICkge1xyXG5cclxuXHRcdHN1cGVyKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNJbnN0YW5jZWRNZXNoID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlcHJlc2VudHMgdGhlIGxvY2FsIHRyYW5zZm9ybWF0aW9uIG9mIGFsbCBpbnN0YW5jZXMuIFlvdSBoYXZlIHRvIHNldCBpdHNcclxuXHRcdCAqIHtAbGluayBCdWZmZXJBdHRyaWJ1dGUjbmVlZHNVcGRhdGV9IGZsYWcgdG8gdHJ1ZSBpZiB5b3UgbW9kaWZ5IGluc3RhbmNlZCBkYXRhXHJcblx0XHQgKiB2aWEge0BsaW5rIEluc3RhbmNlZE1lc2gjc2V0TWF0cml4QXR9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaW5zdGFuY2VNYXRyaXggPSBuZXcgSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlKCBuZXcgRmxvYXQzMkFycmF5KCBjb3VudCAqIDE2ICksIDE2ICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXByZXNlbnRzIHRoZSBjb2xvciBvZiBhbGwgaW5zdGFuY2VzLiBZb3UgaGF2ZSB0byBzZXQgaXRzXHJcblx0XHQgKiB7QGxpbmsgQnVmZmVyQXR0cmlidXRlI25lZWRzVXBkYXRlfSBmbGFnIHRvIHRydWUgaWYgeW91IG1vZGlmeSBpbnN0YW5jZWQgZGF0YVxyXG5cdFx0ICogdmlhIHtAbGluayBJbnN0YW5jZWRNZXNoI3NldENvbG9yQXR9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/SW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmluc3RhbmNlQ29sb3IgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVwcmVzZW50cyB0aGUgbW9ycGggdGFyZ2V0IHdlaWdodHMgb2YgYWxsIGluc3RhbmNlcy4gWW91IGhhdmUgdG8gc2V0IGl0c1xyXG5cdFx0ICoge0BsaW5rIFRleHR1cmUjbmVlZHNVcGRhdGV9IGZsYWcgdG8gdHJ1ZSBpZiB5b3UgbW9kaWZ5IGluc3RhbmNlZCBkYXRhXHJcblx0XHQgKiB2aWEge0BsaW5rIEluc3RhbmNlZE1lc2gjc2V0TW9ycGhBdH0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9EYXRhVGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tb3JwaFRleHR1cmUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG51bWJlciBvZiBpbnN0YW5jZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb3VudCA9IGNvdW50O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgaW5zdGFuY2VkIG1lc2guIENhbiBiZSBjb21wdXRlZCB2aWEge0BsaW5rIEluc3RhbmNlZE1lc2gjY29tcHV0ZUJvdW5kaW5nQm94fS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P0JveDN9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYm91bmRpbmdCb3ggPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGJvdW5kaW5nIHNwaGVyZSBvZiB0aGUgaW5zdGFuY2VkIG1lc2guIENhbiBiZSBjb21wdXRlZCB2aWEge0BsaW5rIEluc3RhbmNlZE1lc2gjY29tcHV0ZUJvdW5kaW5nU3BoZXJlfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1NwaGVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IG51bGw7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgY291bnQ7IGkgKysgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnNldE1hdHJpeEF0KCBpLCBfaWRlbnRpdHkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgaW5zdGFuY2VkIG1lc2gsIGFuZCB1cGRhdGVzIHtAbGluayBJbnN0YW5jZWRNZXNoI2JvdW5kaW5nQm94fS5cclxuXHQgKiBUaGUgYm91bmRpbmcgYm94IGlzIG5vdCBhdXRvbWF0aWNhbGx5IGNvbXB1dGVkIGJ5IHRoZSBlbmdpbmU7IHRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGJ5IHlvdXIgYXBwLlxyXG5cdCAqIFlvdSBtYXkgbmVlZCB0byByZWNvbXB1dGUgdGhlIGJvdW5kaW5nIGJveCBpZiBhbiBpbnN0YW5jZSBpcyB0cmFuc2Zvcm1lZCB2aWEge0BsaW5rIEluc3RhbmNlZE1lc2gjc2V0TWF0cml4QXR9LlxyXG5cdCAqL1xyXG5cdGNvbXB1dGVCb3VuZGluZ0JveCgpIHtcclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XHJcblx0XHRjb25zdCBjb3VudCA9IHRoaXMuY291bnQ7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmJvdW5kaW5nQm94ID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveCA9IG5ldyBCb3gzKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdCb3ggPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdCb3goKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5ib3VuZGluZ0JveC5tYWtlRW1wdHkoKTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSArKyApIHtcclxuXHJcblx0XHRcdHRoaXMuZ2V0TWF0cml4QXQoIGksIF9pbnN0YW5jZUxvY2FsTWF0cml4ICk7XHJcblxyXG5cdFx0XHRfYm94My5jb3B5KCBnZW9tZXRyeS5ib3VuZGluZ0JveCApLmFwcGx5TWF0cml4NCggX2luc3RhbmNlTG9jYWxNYXRyaXggKTtcclxuXHJcblx0XHRcdHRoaXMuYm91bmRpbmdCb3gudW5pb24oIF9ib3gzICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSBib3VuZGluZyBzcGhlcmUgb2YgdGhlIGluc3RhbmNlZCBtZXNoLCBhbmQgdXBkYXRlcyB7QGxpbmsgSW5zdGFuY2VkTWVzaCNib3VuZGluZ1NwaGVyZX1cclxuXHQgKiBUaGUgZW5naW5lIGF1dG9tYXRpY2FsbHkgY29tcHV0ZXMgdGhlIGJvdW5kaW5nIHNwaGVyZSB3aGVuIGl0IGlzIG5lZWRlZCwgZS5nLiwgZm9yIHJheSBjYXN0aW5nIG9yIHZpZXcgZnJ1c3R1bSBjdWxsaW5nLlxyXG5cdCAqIFlvdSBtYXkgbmVlZCB0byByZWNvbXB1dGUgdGhlIGJvdW5kaW5nIHNwaGVyZSBpZiBhbiBpbnN0YW5jZSBpcyB0cmFuc2Zvcm1lZCB2aWEge0BsaW5rIEluc3RhbmNlZE1lc2gjc2V0TWF0cml4QXR9LlxyXG5cdCAqL1xyXG5cdGNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpIHtcclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XHJcblx0XHRjb25zdCBjb3VudCA9IHRoaXMuY291bnQ7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmJvdW5kaW5nU3BoZXJlID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IG5ldyBTcGhlcmUoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlLm1ha2VFbXB0eSgpO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGNvdW50OyBpICsrICkge1xyXG5cclxuXHRcdFx0dGhpcy5nZXRNYXRyaXhBdCggaSwgX2luc3RhbmNlTG9jYWxNYXRyaXggKTtcclxuXHJcblx0XHRcdF9zcGhlcmUuY29weSggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgKS5hcHBseU1hdHJpeDQoIF9pbnN0YW5jZUxvY2FsTWF0cml4ICk7XHJcblxyXG5cdFx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlLnVuaW9uKCBfc3BoZXJlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSwgcmVjdXJzaXZlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSwgcmVjdXJzaXZlICk7XHJcblxyXG5cdFx0dGhpcy5pbnN0YW5jZU1hdHJpeC5jb3B5KCBzb3VyY2UuaW5zdGFuY2VNYXRyaXggKTtcclxuXHJcblx0XHRpZiAoIHNvdXJjZS5tb3JwaFRleHR1cmUgIT09IG51bGwgKSB0aGlzLm1vcnBoVGV4dHVyZSA9IHNvdXJjZS5tb3JwaFRleHR1cmUuY2xvbmUoKTtcclxuXHRcdGlmICggc291cmNlLmluc3RhbmNlQ29sb3IgIT09IG51bGwgKSB0aGlzLmluc3RhbmNlQ29sb3IgPSBzb3VyY2UuaW5zdGFuY2VDb2xvci5jbG9uZSgpO1xyXG5cclxuXHRcdHRoaXMuY291bnQgPSBzb3VyY2UuY291bnQ7XHJcblxyXG5cdFx0aWYgKCBzb3VyY2UuYm91bmRpbmdCb3ggIT09IG51bGwgKSB0aGlzLmJvdW5kaW5nQm94ID0gc291cmNlLmJvdW5kaW5nQm94LmNsb25lKCk7XHJcblx0XHRpZiAoIHNvdXJjZS5ib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHRoaXMuYm91bmRpbmdTcGhlcmUgPSBzb3VyY2UuYm91bmRpbmdTcGhlcmUuY2xvbmUoKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZXRzIHRoZSBjb2xvciBvZiB0aGUgZGVmaW5lZCBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbnN0YW5jZSBpbmRleC5cclxuXHQgKiBAcGFyYW0ge0NvbG9yfSBjb2xvciAtIFRoZSB0YXJnZXQgb2JqZWN0IHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbWV0aG9kJ3MgcmVzdWx0LlxyXG5cdCAqL1xyXG5cdGdldENvbG9yQXQoIGluZGV4LCBjb2xvciApIHtcclxuXHJcblx0XHRjb2xvci5mcm9tQXJyYXkoIHRoaXMuaW5zdGFuY2VDb2xvci5hcnJheSwgaW5kZXggKiAzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2V0cyB0aGUgbG9jYWwgdHJhbnNmb3JtYXRpb24gbWF0cml4IG9mIHRoZSBkZWZpbmVkIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluc3RhbmNlIGluZGV4LlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4NH0gbWF0cml4IC0gVGhlIHRhcmdldCBvYmplY3QgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBtZXRob2QncyByZXN1bHQuXHJcblx0ICovXHJcblx0Z2V0TWF0cml4QXQoIGluZGV4LCBtYXRyaXggKSB7XHJcblxyXG5cdFx0bWF0cml4LmZyb21BcnJheSggdGhpcy5pbnN0YW5jZU1hdHJpeC5hcnJheSwgaW5kZXggKiAxNiApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdldHMgdGhlIG1vcnBoIHRhcmdldCB3ZWlnaHRzIG9mIHRoZSBkZWZpbmVkIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluc3RhbmNlIGluZGV4LlxyXG5cdCAqIEBwYXJhbSB7TWVzaH0gb2JqZWN0IC0gVGhlIHRhcmdldCBvYmplY3QgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBtZXRob2QncyByZXN1bHQuXHJcblx0ICovXHJcblx0Z2V0TW9ycGhBdCggaW5kZXgsIG9iamVjdCApIHtcclxuXHJcblx0XHRjb25zdCBvYmplY3RJbmZsdWVuY2VzID0gb2JqZWN0Lm1vcnBoVGFyZ2V0SW5mbHVlbmNlcztcclxuXHJcblx0XHRjb25zdCBhcnJheSA9IHRoaXMubW9ycGhUZXh0dXJlLnNvdXJjZS5kYXRhLmRhdGE7XHJcblxyXG5cdFx0Y29uc3QgbGVuID0gb2JqZWN0SW5mbHVlbmNlcy5sZW5ndGggKyAxOyAvLyBBbGwgaW5mbHVlbmNlcyArIHRoZSBiYXNlSW5mbHVlbmNlU3VtXHJcblxyXG5cdFx0Y29uc3QgZGF0YUluZGV4ID0gaW5kZXggKiBsZW4gKyAxOyAvLyBTa2lwIHRoZSBiYXNlSW5mbHVlbmNlU3VtIGF0IHRoZSBiZWdpbm5pbmdcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBvYmplY3RJbmZsdWVuY2VzLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdG9iamVjdEluZmx1ZW5jZXNbIGkgXSA9IGFycmF5WyBkYXRhSW5kZXggKyBpIF07XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdHJheWNhc3QoIHJheWNhc3RlciwgaW50ZXJzZWN0cyApIHtcclxuXHJcblx0XHRjb25zdCBtYXRyaXhXb3JsZCA9IHRoaXMubWF0cml4V29ybGQ7XHJcblx0XHRjb25zdCByYXljYXN0VGltZXMgPSB0aGlzLmNvdW50O1xyXG5cclxuXHRcdF9tZXNoLmdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcclxuXHRcdF9tZXNoLm1hdGVyaWFsID0gdGhpcy5tYXRlcmlhbDtcclxuXHJcblx0XHRpZiAoIF9tZXNoLm1hdGVyaWFsID09PSB1bmRlZmluZWQgKSByZXR1cm47XHJcblxyXG5cdFx0Ly8gdGVzdCB3aXRoIGJvdW5kaW5nIHNwaGVyZSBmaXJzdFxyXG5cclxuXHRcdGlmICggdGhpcy5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCApIHRoaXMuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XHJcblxyXG5cdFx0X3NwaGVyZS5jb3B5KCB0aGlzLmJvdW5kaW5nU3BoZXJlICk7XHJcblx0XHRfc3BoZXJlLmFwcGx5TWF0cml4NCggbWF0cml4V29ybGQgKTtcclxuXHJcblx0XHRpZiAoIHJheWNhc3Rlci5yYXkuaW50ZXJzZWN0c1NwaGVyZSggX3NwaGVyZSApID09PSBmYWxzZSApIHJldHVybjtcclxuXHJcblx0XHQvLyBub3cgdGVzdCBlYWNoIGluc3RhbmNlXHJcblxyXG5cdFx0Zm9yICggbGV0IGluc3RhbmNlSWQgPSAwOyBpbnN0YW5jZUlkIDwgcmF5Y2FzdFRpbWVzOyBpbnN0YW5jZUlkICsrICkge1xyXG5cclxuXHRcdFx0Ly8gY2FsY3VsYXRlIHRoZSB3b3JsZCBtYXRyaXggZm9yIGVhY2ggaW5zdGFuY2VcclxuXHJcblx0XHRcdHRoaXMuZ2V0TWF0cml4QXQoIGluc3RhbmNlSWQsIF9pbnN0YW5jZUxvY2FsTWF0cml4ICk7XHJcblxyXG5cdFx0XHRfaW5zdGFuY2VXb3JsZE1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBtYXRyaXhXb3JsZCwgX2luc3RhbmNlTG9jYWxNYXRyaXggKTtcclxuXHJcblx0XHRcdC8vIHRoZSBtZXNoIHJlcHJlc2VudHMgdGhpcyBzaW5nbGUgaW5zdGFuY2VcclxuXHJcblx0XHRcdF9tZXNoLm1hdHJpeFdvcmxkID0gX2luc3RhbmNlV29ybGRNYXRyaXg7XHJcblxyXG5cdFx0XHRfbWVzaC5yYXljYXN0KCByYXljYXN0ZXIsIF9pbnN0YW5jZUludGVyc2VjdHMgKTtcclxuXHJcblx0XHRcdC8vIHByb2Nlc3MgdGhlIHJlc3VsdCBvZiByYXljYXN0XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBfaW5zdGFuY2VJbnRlcnNlY3RzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGludGVyc2VjdCA9IF9pbnN0YW5jZUludGVyc2VjdHNbIGkgXTtcclxuXHRcdFx0XHRpbnRlcnNlY3QuaW5zdGFuY2VJZCA9IGluc3RhbmNlSWQ7XHJcblx0XHRcdFx0aW50ZXJzZWN0Lm9iamVjdCA9IHRoaXM7XHJcblx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCBpbnRlcnNlY3QgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdF9pbnN0YW5jZUludGVyc2VjdHMubGVuZ3RoID0gMDtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZ2l2ZW4gY29sb3IgdG8gdGhlIGRlZmluZWQgaW5zdGFuY2UuIE1ha2Ugc3VyZSB5b3Ugc2V0IHRoZSBgbmVlZHNVcGRhdGVgIGZsYWcgb2ZcclxuXHQgKiB7QGxpbmsgSW5zdGFuY2VkTWVzaCNpbnN0YW5jZUNvbG9yfSB0byBgdHJ1ZWAgYWZ0ZXIgdXBkYXRpbmcgYWxsIHRoZSBjb2xvcnMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5zdGFuY2UgaW5kZXguXHJcblx0ICogQHBhcmFtIHtDb2xvcn0gY29sb3IgLSBUaGUgaW5zdGFuY2UgY29sb3IuXHJcblx0ICovXHJcblx0c2V0Q29sb3JBdCggaW5kZXgsIGNvbG9yICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5pbnN0YW5jZUNvbG9yID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5pbnN0YW5jZUNvbG9yID0gbmV3IEluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSggbmV3IEZsb2F0MzJBcnJheSggdGhpcy5pbnN0YW5jZU1hdHJpeC5jb3VudCAqIDMgKS5maWxsKCAxICksIDMgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29sb3IudG9BcnJheSggdGhpcy5pbnN0YW5jZUNvbG9yLmFycmF5LCBpbmRleCAqIDMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBnaXZlbiBsb2NhbCB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggdG8gdGhlIGRlZmluZWQgaW5zdGFuY2UuIE1ha2Ugc3VyZSB5b3Ugc2V0IHRoZSBgbmVlZHNVcGRhdGVgIGZsYWcgb2ZcclxuXHQgKiB7QGxpbmsgSW5zdGFuY2VkTWVzaCNpbnN0YW5jZU1hdHJpeH0gdG8gYHRydWVgIGFmdGVyIHVwZGF0aW5nIGFsbCB0aGUgY29sb3JzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluc3RhbmNlIGluZGV4LlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4NH0gbWF0cml4IC0gVGhlIGxvY2FsIHRyYW5zZm9ybWF0aW9uLlxyXG5cdCAqL1xyXG5cdHNldE1hdHJpeEF0KCBpbmRleCwgbWF0cml4ICkge1xyXG5cclxuXHRcdG1hdHJpeC50b0FycmF5KCB0aGlzLmluc3RhbmNlTWF0cml4LmFycmF5LCBpbmRleCAqIDE2ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgbW9ycGggdGFyZ2V0IHdlaWdodHMgdG8gdGhlIGRlZmluZWQgaW5zdGFuY2UuIE1ha2Ugc3VyZSB5b3Ugc2V0IHRoZSBgbmVlZHNVcGRhdGVgIGZsYWcgb2ZcclxuXHQgKiB7QGxpbmsgSW5zdGFuY2VkTWVzaCNtb3JwaFRleHR1cmV9IHRvIGB0cnVlYCBhZnRlciB1cGRhdGluZyBhbGwgdGhlIGluZmx1ZW5jZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5zdGFuY2UgaW5kZXguXHJcblx0ICogQHBhcmFtIHtNZXNofSBvYmplY3QgLSAgQSBtZXNoIHdoaWNoIGBtb3JwaFRhcmdldEluZmx1ZW5jZXNgIHByb3BlcnR5IGNvbnRhaW5pbmcgdGhlIG1vcnBoIHRhcmdldCB3ZWlnaHRzXHJcblx0ICogb2YgYSBzaW5nbGUgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0TW9ycGhBdCggaW5kZXgsIG9iamVjdCApIHtcclxuXHJcblx0XHRjb25zdCBvYmplY3RJbmZsdWVuY2VzID0gb2JqZWN0Lm1vcnBoVGFyZ2V0SW5mbHVlbmNlcztcclxuXHJcblx0XHRjb25zdCBsZW4gPSBvYmplY3RJbmZsdWVuY2VzLmxlbmd0aCArIDE7IC8vIG1vcnBoQmFzZUluZmx1ZW5jZSArIGFsbCBpbmZsdWVuY2VzXHJcblxyXG5cdFx0aWYgKCB0aGlzLm1vcnBoVGV4dHVyZSA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMubW9ycGhUZXh0dXJlID0gbmV3IERhdGFUZXh0dXJlKCBuZXcgRmxvYXQzMkFycmF5KCBsZW4gKiB0aGlzLmNvdW50ICksIGxlbiwgdGhpcy5jb3VudCwgUmVkRm9ybWF0LCBGbG9hdFR5cGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgYXJyYXkgPSB0aGlzLm1vcnBoVGV4dHVyZS5zb3VyY2UuZGF0YS5kYXRhO1xyXG5cclxuXHRcdGxldCBtb3JwaEluZmx1ZW5jZXNTdW0gPSAwO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IG9iamVjdEluZmx1ZW5jZXMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0bW9ycGhJbmZsdWVuY2VzU3VtICs9IG9iamVjdEluZmx1ZW5jZXNbIGkgXTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgbW9ycGhCYXNlSW5mbHVlbmNlID0gdGhpcy5nZW9tZXRyeS5tb3JwaFRhcmdldHNSZWxhdGl2ZSA/IDEgOiAxIC0gbW9ycGhJbmZsdWVuY2VzU3VtO1xyXG5cclxuXHRcdGNvbnN0IGRhdGFJbmRleCA9IGxlbiAqIGluZGV4O1xyXG5cclxuXHRcdGFycmF5WyBkYXRhSW5kZXggXSA9IG1vcnBoQmFzZUluZmx1ZW5jZTtcclxuXHJcblx0XHRhcnJheS5zZXQoIG9iamVjdEluZmx1ZW5jZXMsIGRhdGFJbmRleCArIDEgKTtcclxuXHJcblx0fVxyXG5cclxuXHR1cGRhdGVNb3JwaFRhcmdldHMoKSB7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRnJlZXMgdGhlIEdQVS1yZWxhdGVkIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhpcyBpbnN0YW5jZS4gQ2FsbCB0aGlzXHJcblx0ICogbWV0aG9kIHdoZW5ldmVyIHRoaXMgaW5zdGFuY2UgaXMgbm8gbG9uZ2VyIHVzZWQgaW4geW91ciBhcHAuXHJcblx0ICovXHJcblx0ZGlzcG9zZSgpIHtcclxuXHJcblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2Rpc3Bvc2UnIH0gKTtcclxuXHJcblx0XHRpZiAoIHRoaXMubW9ycGhUZXh0dXJlICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5tb3JwaFRleHR1cmUuZGlzcG9zZSgpO1xyXG5cdFx0XHR0aGlzLm1vcnBoVGV4dHVyZSA9IG51bGw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBJbnN0YW5jZWRNZXNoIH07XHJcbiIsImltcG9ydCB7IE1hdHJpeDMgfSBmcm9tICcuL01hdHJpeDMuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi9WZWN0b3IzLmpzJztcclxuXHJcbmNvbnN0IF92ZWN0b3IxID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfdmVjdG9yMiA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX25vcm1hbE1hdHJpeCA9IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDMoKTtcclxuXHJcbi8qKlxyXG4gKiBBIHR3byBkaW1lbnNpb25hbCBzdXJmYWNlIHRoYXQgZXh0ZW5kcyBpbmZpbml0ZWx5IGluIDNEIHNwYWNlLCByZXByZXNlbnRlZFxyXG4gKiBpbiBbSGVzc2lhbiBub3JtYWwgZm9ybV17QGxpbmsgaHR0cDovL21hdGh3b3JsZC53b2xmcmFtLmNvbS9IZXNzaWFuTm9ybWFsRm9ybS5odG1sfVxyXG4gKiBieSBhIHVuaXQgbGVuZ3RoIG5vcm1hbCB2ZWN0b3IgYW5kIGEgY29uc3RhbnQuXHJcbiAqL1xyXG5jbGFzcyBQbGFuZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcGxhbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IFtub3JtYWw9KDEsMCwwKV0gLSBBIHVuaXQgbGVuZ3RoIHZlY3RvciBkZWZpbmluZyB0aGUgbm9ybWFsIG9mIHRoZSBwbGFuZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2NvbnN0YW50PTBdIC0gVGhlIHNpZ25lZCBkaXN0YW5jZSBmcm9tIHRoZSBvcmlnaW4gdG8gdGhlIHBsYW5lLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBub3JtYWwgPSBuZXcgVmVjdG9yMyggMSwgMCwgMCApLCBjb25zdGFudCA9IDAgKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzUGxhbmUgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSB1bml0IGxlbmd0aCB2ZWN0b3IgZGVmaW5pbmcgdGhlIG5vcm1hbCBvZiB0aGUgcGxhbmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjN9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9ybWFsID0gbm9ybWFsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHNpZ25lZCBkaXN0YW5jZSBmcm9tIHRoZSBvcmlnaW4gdG8gdGhlIHBsYW5lLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29uc3RhbnQgPSBjb25zdGFudDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBwbGFuZSBjb21wb25lbnRzIGJ5IGNvcHlpbmcgdGhlIGdpdmVuIHZhbHVlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gbm9ybWFsIC0gVGhlIG5vcm1hbC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gY29uc3RhbnQgLSBUaGUgY29uc3RhbnQuXHJcblx0ICogQHJldHVybiB7UGxhbmV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgcGxhbmUuXHJcblx0ICovXHJcblx0c2V0KCBub3JtYWwsIGNvbnN0YW50ICkge1xyXG5cclxuXHRcdHRoaXMubm9ybWFsLmNvcHkoIG5vcm1hbCApO1xyXG5cdFx0dGhpcy5jb25zdGFudCA9IGNvbnN0YW50O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHBsYW5lIGNvbXBvbmVudHMgYnkgZGVmaW5pbmcgYHhgLCBgeWAsIGB6YCBhcyB0aGVcclxuXHQgKiBwbGFuZSBub3JtYWwgYW5kIGB3YCBhcyB0aGUgY29uc3RhbnQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB2YWx1ZSBmb3IgdGhlIG5vcm1hbCdzIHggY29tcG9uZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHZhbHVlIGZvciB0aGUgbm9ybWFsJ3MgeSBjb21wb25lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHogLSBUaGUgdmFsdWUgZm9yIHRoZSBub3JtYWwncyB6IGNvbXBvbmVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdyAtIFRoZSBjb25zdGFudCB2YWx1ZS5cclxuXHQgKiBAcmV0dXJuIHtQbGFuZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBwbGFuZS5cclxuXHQgKi9cclxuXHRzZXRDb21wb25lbnRzKCB4LCB5LCB6LCB3ICkge1xyXG5cclxuXHRcdHRoaXMubm9ybWFsLnNldCggeCwgeSwgeiApO1xyXG5cdFx0dGhpcy5jb25zdGFudCA9IHc7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgcGxhbmUgZnJvbSB0aGUgZ2l2ZW4gbm9ybWFsIGFuZCBjb3BsYW5hciBwb2ludCAodGhhdCBpcyBhIHBvaW50XHJcblx0ICogdGhhdCBsaWVzIG9udG8gdGhlIHBsYW5lKS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gbm9ybWFsIC0gVGhlIG5vcm1hbC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHBvaW50IC0gQSBjb3BsYW5hciBwb2ludC5cclxuXHQgKiBAcmV0dXJuIHtQbGFuZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBwbGFuZS5cclxuXHQgKi9cclxuXHRzZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQb2ludCggbm9ybWFsLCBwb2ludCApIHtcclxuXHJcblx0XHR0aGlzLm5vcm1hbC5jb3B5KCBub3JtYWwgKTtcclxuXHRcdHRoaXMuY29uc3RhbnQgPSAtIHBvaW50LmRvdCggdGhpcy5ub3JtYWwgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBwbGFuZSBmcm9tIHRocmVlIGNvcGxhbmFyIHBvaW50cy4gVGhlIHdpbmRpbmcgb3JkZXIgaXNcclxuXHQgKiBhc3N1bWVkIHRvIGJlIGNvdW50ZXItY2xvY2t3aXNlLCBhbmQgZGV0ZXJtaW5lcyB0aGUgZGlyZWN0aW9uIG9mXHJcblx0ICogdGhlIHBsYW5lIG5vcm1hbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gYSAtIFRoZSBmaXJzdCBjb3BsYW5hciBwb2ludC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IGIgLSBUaGUgc2Vjb25kIGNvcGxhbmFyIHBvaW50LlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gYyAtIFRoZSB0aGlyZCBjb3BsYW5hciBwb2ludC5cclxuXHQgKiBAcmV0dXJuIHtQbGFuZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBwbGFuZS5cclxuXHQgKi9cclxuXHRzZXRGcm9tQ29wbGFuYXJQb2ludHMoIGEsIGIsIGMgKSB7XHJcblxyXG5cdFx0Y29uc3Qgbm9ybWFsID0gX3ZlY3RvcjEuc3ViVmVjdG9ycyggYywgYiApLmNyb3NzKCBfdmVjdG9yMi5zdWJWZWN0b3JzKCBhLCBiICkgKS5ub3JtYWxpemUoKTtcclxuXHJcblx0XHQvLyBROiBzaG91bGQgYW4gZXJyb3IgYmUgdGhyb3duIGlmIG5vcm1hbCBpcyB6ZXJvIChlLmcuIGRlZ2VuZXJhdGUgcGxhbmUpP1xyXG5cclxuXHRcdHRoaXMuc2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQoIG5vcm1hbCwgYSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvcGllcyB0aGUgdmFsdWVzIG9mIHRoZSBnaXZlbiBwbGFuZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtQbGFuZX0gcGxhbmUgLSBUaGUgcGxhbmUgdG8gY29weS5cclxuXHQgKiBAcmV0dXJuIHtQbGFuZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBwbGFuZS5cclxuXHQgKi9cclxuXHRjb3B5KCBwbGFuZSApIHtcclxuXHJcblx0XHR0aGlzLm5vcm1hbC5jb3B5KCBwbGFuZS5ub3JtYWwgKTtcclxuXHRcdHRoaXMuY29uc3RhbnQgPSBwbGFuZS5jb25zdGFudDtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBOb3JtYWxpemVzIHRoZSBwbGFuZSBub3JtYWwgYW5kIGFkanVzdHMgdGhlIGNvbnN0YW50IGFjY29yZGluZ2x5LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7UGxhbmV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgcGxhbmUuXHJcblx0ICovXHJcblx0bm9ybWFsaXplKCkge1xyXG5cclxuXHRcdC8vIE5vdGU6IHdpbGwgbGVhZCB0byBhIGRpdmlkZSBieSB6ZXJvIGlmIHRoZSBwbGFuZSBpcyBpbnZhbGlkLlxyXG5cclxuXHRcdGNvbnN0IGludmVyc2VOb3JtYWxMZW5ndGggPSAxLjAgLyB0aGlzLm5vcm1hbC5sZW5ndGgoKTtcclxuXHRcdHRoaXMubm9ybWFsLm11bHRpcGx5U2NhbGFyKCBpbnZlcnNlTm9ybWFsTGVuZ3RoICk7XHJcblx0XHR0aGlzLmNvbnN0YW50ICo9IGludmVyc2VOb3JtYWxMZW5ndGg7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTmVnYXRlcyBib3RoIHRoZSBwbGFuZSBub3JtYWwgYW5kIHRoZSBjb25zdGFudC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1BsYW5lfSBBIHJlZmVyZW5jZSB0byB0aGlzIHBsYW5lLlxyXG5cdCAqL1xyXG5cdG5lZ2F0ZSgpIHtcclxuXHJcblx0XHR0aGlzLmNvbnN0YW50ICo9IC0gMTtcclxuXHRcdHRoaXMubm9ybWFsLm5lZ2F0ZSgpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHNpZ25lZCBkaXN0YW5jZSBmcm9tIHRoZSBnaXZlbiBwb2ludCB0byB0aGlzIHBsYW5lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBwb2ludCAtIFRoZSBwb2ludCB0byBjb21wdXRlIHRoZSBkaXN0YW5jZSBmb3IuXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgc2lnbmVkIGRpc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGRpc3RhbmNlVG9Qb2ludCggcG9pbnQgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubm9ybWFsLmRvdCggcG9pbnQgKSArIHRoaXMuY29uc3RhbnQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgc2lnbmVkIGRpc3RhbmNlIGZyb20gdGhlIGdpdmVuIHNwaGVyZSB0byB0aGlzIHBsYW5lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTcGhlcmV9IHNwaGVyZSAtIFRoZSBzcGhlcmUgdG8gY29tcHV0ZSB0aGUgZGlzdGFuY2UgZm9yLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIHNpZ25lZCBkaXN0YW5jZS5cclxuXHQgKi9cclxuXHRkaXN0YW5jZVRvU3BoZXJlKCBzcGhlcmUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZGlzdGFuY2VUb1BvaW50KCBzcGhlcmUuY2VudGVyICkgLSBzcGhlcmUucmFkaXVzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFByb2plY3RzIGEgdGhlIGdpdmVuIHBvaW50IG9udG8gdGhlIHBsYW5lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBwb2ludCAtIFRoZSBwb2ludCB0byBwcm9qZWN0LlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdGFyZ2V0IC0gVGhlIHRhcmdldCB2ZWN0b3IgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBtZXRob2QncyByZXN1bHQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gVGhlIHByb2plY3RlZCBwb2ludCBvbiB0aGUgcGxhbmUuXHJcblx0ICovXHJcblx0cHJvamVjdFBvaW50KCBwb2ludCwgdGFyZ2V0ICkge1xyXG5cclxuXHRcdHJldHVybiB0YXJnZXQuY29weSggcG9pbnQgKS5hZGRTY2FsZWRWZWN0b3IoIHRoaXMubm9ybWFsLCAtIHRoaXMuZGlzdGFuY2VUb1BvaW50KCBwb2ludCApICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgaW50ZXJzZWN0aW9uIHBvaW50IG9mIHRoZSBwYXNzZWQgbGluZSBhbmQgdGhlIHBsYW5lLiBSZXR1cm5zXHJcblx0ICogYG51bGxgIGlmIHRoZSBsaW5lIGRvZXMgbm90IGludGVyc2VjdC4gUmV0dXJucyB0aGUgbGluZSdzIHN0YXJ0aW5nIHBvaW50IGlmXHJcblx0ICogdGhlIGxpbmUgaXMgY29wbGFuYXIgd2l0aCB0aGUgcGxhbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0xpbmUzfSBsaW5lIC0gVGhlIGxpbmUgdG8gY29tcHV0ZSB0aGUgaW50ZXJzZWN0aW9uIGZvci5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHRhcmdldCAtIFRoZSB0YXJnZXQgdmVjdG9yIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbWV0aG9kJ3MgcmVzdWx0LlxyXG5cdCAqIEByZXR1cm4gez9WZWN0b3IzfSBUaGUgaW50ZXJzZWN0aW9uIHBvaW50LlxyXG5cdCAqL1xyXG5cdGludGVyc2VjdExpbmUoIGxpbmUsIHRhcmdldCApIHtcclxuXHJcblx0XHRjb25zdCBkaXJlY3Rpb24gPSBsaW5lLmRlbHRhKCBfdmVjdG9yMSApO1xyXG5cclxuXHRcdGNvbnN0IGRlbm9taW5hdG9yID0gdGhpcy5ub3JtYWwuZG90KCBkaXJlY3Rpb24gKTtcclxuXHJcblx0XHRpZiAoIGRlbm9taW5hdG9yID09PSAwICkge1xyXG5cclxuXHRcdFx0Ly8gbGluZSBpcyBjb3BsYW5hciwgcmV0dXJuIG9yaWdpblxyXG5cdFx0XHRpZiAoIHRoaXMuZGlzdGFuY2VUb1BvaW50KCBsaW5lLnN0YXJ0ICkgPT09IDAgKSB7XHJcblxyXG5cdFx0XHRcdHJldHVybiB0YXJnZXQuY29weSggbGluZS5zdGFydCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gVW5zdXJlIGlmIHRoaXMgaXMgdGhlIGNvcnJlY3QgbWV0aG9kIHRvIGhhbmRsZSB0aGlzIGNhc2UuXHJcblx0XHRcdHJldHVybiBudWxsO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCB0ID0gLSAoIGxpbmUuc3RhcnQuZG90KCB0aGlzLm5vcm1hbCApICsgdGhpcy5jb25zdGFudCApIC8gZGVub21pbmF0b3I7XHJcblxyXG5cdFx0aWYgKCB0IDwgMCB8fCB0ID4gMSApIHtcclxuXHJcblx0XHRcdHJldHVybiBudWxsO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIGxpbmUuc3RhcnQgKS5hZGRTY2FsZWRWZWN0b3IoIGRpcmVjdGlvbiwgdCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBnaXZlbiBsaW5lIHNlZ21lbnQgaW50ZXJzZWN0cyB3aXRoIChwYXNzZXMgdGhyb3VnaCkgdGhlIHBsYW5lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtMaW5lM30gbGluZSAtIFRoZSBsaW5lIHRvIHRlc3QuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZ2l2ZW4gbGluZSBzZWdtZW50IGludGVyc2VjdHMgd2l0aCB0aGUgcGxhbmUgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGludGVyc2VjdHNMaW5lKCBsaW5lICkge1xyXG5cclxuXHRcdC8vIE5vdGU6IHRoaXMgdGVzdHMgaWYgYSBsaW5lIGludGVyc2VjdHMgdGhlIHBsYW5lLCBub3Qgd2hldGhlciBpdCAob3IgaXRzIGVuZC1wb2ludHMpIGFyZSBjb3BsYW5hciB3aXRoIGl0LlxyXG5cclxuXHRcdGNvbnN0IHN0YXJ0U2lnbiA9IHRoaXMuZGlzdGFuY2VUb1BvaW50KCBsaW5lLnN0YXJ0ICk7XHJcblx0XHRjb25zdCBlbmRTaWduID0gdGhpcy5kaXN0YW5jZVRvUG9pbnQoIGxpbmUuZW5kICk7XHJcblxyXG5cdFx0cmV0dXJuICggc3RhcnRTaWduIDwgMCAmJiBlbmRTaWduID4gMCApIHx8ICggZW5kU2lnbiA8IDAgJiYgc3RhcnRTaWduID4gMCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBnaXZlbiBib3VuZGluZyBib3ggaW50ZXJzZWN0cyB3aXRoIHRoZSBwbGFuZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Qm94M30gYm94IC0gVGhlIGJvdW5kaW5nIGJveCB0byB0ZXN0LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGdpdmVuIGJvdW5kaW5nIGJveCBpbnRlcnNlY3RzIHdpdGggdGhlIHBsYW5lIG9yIG5vdC5cclxuXHQgKi9cclxuXHRpbnRlcnNlY3RzQm94KCBib3ggKSB7XHJcblxyXG5cdFx0cmV0dXJuIGJveC5pbnRlcnNlY3RzUGxhbmUoIHRoaXMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gYm91bmRpbmcgc3BoZXJlIGludGVyc2VjdHMgd2l0aCB0aGUgcGxhbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1NwaGVyZX0gc3BoZXJlIC0gVGhlIGJvdW5kaW5nIHNwaGVyZSB0byB0ZXN0LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGdpdmVuIGJvdW5kaW5nIHNwaGVyZSBpbnRlcnNlY3RzIHdpdGggdGhlIHBsYW5lIG9yIG5vdC5cclxuXHQgKi9cclxuXHRpbnRlcnNlY3RzU3BoZXJlKCBzcGhlcmUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHNwaGVyZS5pbnRlcnNlY3RzUGxhbmUoIHRoaXMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgY29wbGFuYXIgdmVjdG9yIHRvIHRoZSBwbGFuZSwgYnkgY2FsY3VsYXRpbmcgdGhlXHJcblx0ICogcHJvamVjdGlvbiBvZiB0aGUgbm9ybWFsIGF0IHRoZSBvcmlnaW4gb250byB0aGUgcGxhbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHRhcmdldCAtIFRoZSB0YXJnZXQgdmVjdG9yIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbWV0aG9kJ3MgcmVzdWx0LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IFRoZSBjb3BsYW5hciBwb2ludC5cclxuXHQgKi9cclxuXHRjb3BsYW5hclBvaW50KCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRhcmdldC5jb3B5KCB0aGlzLm5vcm1hbCApLm11bHRpcGx5U2NhbGFyKCAtIHRoaXMuY29uc3RhbnQgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBcHBseSBhIDR4NCBtYXRyaXggdG8gdGhlIHBsYW5lLiBUaGUgbWF0cml4IG11c3QgYmUgYW4gYWZmaW5lLCBob21vZ2VuZW91cyB0cmFuc2Zvcm0uXHJcblx0ICpcclxuXHQgKiBUaGUgb3B0aW9uYWwgbm9ybWFsIG1hdHJpeCBjYW4gYmUgcHJlLWNvbXB1dGVkIGxpa2Ugc286XHJcblx0ICogYGBganNcclxuXHQgKiBjb25zdCBvcHRpb25hbE5vcm1hbE1hdHJpeCA9IG5ldyBUSFJFRS5NYXRyaXgzKCkuZ2V0Tm9ybWFsTWF0cml4KCBtYXRyaXggKTtcclxuXHQgKiBgYGBcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4NH0gbWF0cml4IC0gVGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC5cclxuXHQgKiBAcGFyYW0ge01hdHJpeDR9IFtvcHRpb25hbE5vcm1hbE1hdHJpeF0gLSBBIHByZS1jb21wdXRlZCBub3JtYWwgbWF0cml4LlxyXG5cdCAqIEByZXR1cm4ge1BsYW5lfSBBIHJlZmVyZW5jZSB0byB0aGlzIHBsYW5lLlxyXG5cdCAqL1xyXG5cdGFwcGx5TWF0cml4NCggbWF0cml4LCBvcHRpb25hbE5vcm1hbE1hdHJpeCApIHtcclxuXHJcblx0XHRjb25zdCBub3JtYWxNYXRyaXggPSBvcHRpb25hbE5vcm1hbE1hdHJpeCB8fCBfbm9ybWFsTWF0cml4LmdldE5vcm1hbE1hdHJpeCggbWF0cml4ICk7XHJcblxyXG5cdFx0Y29uc3QgcmVmZXJlbmNlUG9pbnQgPSB0aGlzLmNvcGxhbmFyUG9pbnQoIF92ZWN0b3IxICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTtcclxuXHJcblx0XHRjb25zdCBub3JtYWwgPSB0aGlzLm5vcm1hbC5hcHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpO1xyXG5cclxuXHRcdHRoaXMuY29uc3RhbnQgPSAtIHJlZmVyZW5jZVBvaW50LmRvdCggbm9ybWFsICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVHJhbnNsYXRlcyB0aGUgcGxhbmUgYnkgdGhlIGRpc3RhbmNlIGRlZmluZWQgYnkgdGhlIGdpdmVuIG9mZnNldCB2ZWN0b3IuXHJcblx0ICogTm90ZSB0aGF0IHRoaXMgb25seSBhZmZlY3RzIHRoZSBwbGFuZSBjb25zdGFudCBhbmQgd2lsbCBub3QgYWZmZWN0IHRoZSBub3JtYWwgdmVjdG9yLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBvZmZzZXQgLSBUaGUgb2Zmc2V0IHZlY3Rvci5cclxuXHQgKiBAcmV0dXJuIHtQbGFuZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBwbGFuZS5cclxuXHQgKi9cclxuXHR0cmFuc2xhdGUoIG9mZnNldCApIHtcclxuXHJcblx0XHR0aGlzLmNvbnN0YW50IC09IG9mZnNldC5kb3QoIHRoaXMubm9ybWFsICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBwbGFuZSBpcyBlcXVhbCB3aXRoIHRoZSBnaXZlbiBvbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1BsYW5lfSBwbGFuZSAtIFRoZSBwbGFuZSB0byB0ZXN0IGZvciBlcXVhbGl0eS5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoaXMgcGxhbmUgaXMgZXF1YWwgd2l0aCB0aGUgZ2l2ZW4gb25lLlxyXG5cdCAqL1xyXG5cdGVxdWFscyggcGxhbmUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHBsYW5lLm5vcm1hbC5lcXVhbHMoIHRoaXMubm9ybWFsICkgJiYgKCBwbGFuZS5jb25zdGFudCA9PT0gdGhpcy5jb25zdGFudCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBuZXcgcGxhbmUgd2l0aCBjb3BpZWQgdmFsdWVzIGZyb20gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1BsYW5lfSBBIGNsb25lIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y2xvbmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBQbGFuZSB9O1xyXG4iLCJpbXBvcnQgeyBXZWJHTENvb3JkaW5hdGVTeXN0ZW0sIFdlYkdQVUNvb3JkaW5hdGVTeXN0ZW0gfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi9WZWN0b3IzLmpzJztcclxuaW1wb3J0IHsgU3BoZXJlIH0gZnJvbSAnLi9TcGhlcmUuanMnO1xyXG5pbXBvcnQgeyBQbGFuZSB9IGZyb20gJy4vUGxhbmUuanMnO1xyXG5cclxuY29uc3QgX3NwaGVyZSA9IC8qQF9fUFVSRV9fKi8gbmV3IFNwaGVyZSgpO1xyXG5jb25zdCBfdmVjdG9yID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5cclxuLyoqXHJcbiAqIEZydXN0dW1zIGFyZSB1c2VkIHRvIGRldGVybWluZSB3aGF0IGlzIGluc2lkZSB0aGUgY2FtZXJhJ3MgZmllbGQgb2Ygdmlldy5cclxuICogVGhleSBoZWxwIHNwZWVkIHVwIHRoZSByZW5kZXJpbmcgcHJvY2VzcyAtIG9iamVjdHMgd2hpY2ggbGllIG91dHNpZGUgYSBjYW1lcmEnc1xyXG4gKiBmcnVzdHVtIGNhbiBzYWZlbHkgYmUgZXhjbHVkZWQgZnJvbSByZW5kZXJpbmcuXHJcbiAqXHJcbiAqIFRoaXMgY2xhc3MgaXMgbWFpbmx5IGludGVuZGVkIGZvciB1c2UgaW50ZXJuYWxseSBieSBhIHJlbmRlcmVyLlxyXG4gKi9cclxuY2xhc3MgRnJ1c3R1bSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgZnJ1c3R1bS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UGxhbmV9IFtwMF0gLSBUaGUgZmlyc3QgcGxhbmUgdGhhdCBlbmNsb3NlcyB0aGUgZnJ1c3R1bS5cclxuXHQgKiBAcGFyYW0ge1BsYW5lfSBbcDFdIC0gVGhlIHNlY29uZCBwbGFuZSB0aGF0IGVuY2xvc2VzIHRoZSBmcnVzdHVtLlxyXG5cdCAqIEBwYXJhbSB7UGxhbmV9IFtwMl0gLSBUaGUgdGhpcmQgcGxhbmUgdGhhdCBlbmNsb3NlcyB0aGUgZnJ1c3R1bS5cclxuXHQgKiBAcGFyYW0ge1BsYW5lfSBbcDNdIC0gVGhlIGZvdXJ0aCBwbGFuZSB0aGF0IGVuY2xvc2VzIHRoZSBmcnVzdHVtLlxyXG5cdCAqIEBwYXJhbSB7UGxhbmV9IFtwNF0gLSBUaGUgZmlmdGggcGxhbmUgdGhhdCBlbmNsb3NlcyB0aGUgZnJ1c3R1bS5cclxuXHQgKiBAcGFyYW0ge1BsYW5lfSBbcDVdIC0gVGhlIHNpeHRoIHBsYW5lIHRoYXQgZW5jbG9zZXMgdGhlIGZydXN0dW0uXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHAwID0gbmV3IFBsYW5lKCksIHAxID0gbmV3IFBsYW5lKCksIHAyID0gbmV3IFBsYW5lKCksIHAzID0gbmV3IFBsYW5lKCksIHA0ID0gbmV3IFBsYW5lKCksIHA1ID0gbmV3IFBsYW5lKCkgKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBwbGFuZXMgdGhhdCBlbmNsb3NlIHRoZSBmcnVzdHVtLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxQbGFuZT59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucGxhbmVzID0gWyBwMCwgcDEsIHAyLCBwMywgcDQsIHA1IF07XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZnJ1c3R1bSBwbGFuZXMgYnkgY29weWluZyB0aGUgZ2l2ZW4gcGxhbmVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtQbGFuZX0gW3AwXSAtIFRoZSBmaXJzdCBwbGFuZSB0aGF0IGVuY2xvc2VzIHRoZSBmcnVzdHVtLlxyXG5cdCAqIEBwYXJhbSB7UGxhbmV9IFtwMV0gLSBUaGUgc2Vjb25kIHBsYW5lIHRoYXQgZW5jbG9zZXMgdGhlIGZydXN0dW0uXHJcblx0ICogQHBhcmFtIHtQbGFuZX0gW3AyXSAtIFRoZSB0aGlyZCBwbGFuZSB0aGF0IGVuY2xvc2VzIHRoZSBmcnVzdHVtLlxyXG5cdCAqIEBwYXJhbSB7UGxhbmV9IFtwM10gLSBUaGUgZm91cnRoIHBsYW5lIHRoYXQgZW5jbG9zZXMgdGhlIGZydXN0dW0uXHJcblx0ICogQHBhcmFtIHtQbGFuZX0gW3A0XSAtIFRoZSBmaWZ0aCBwbGFuZSB0aGF0IGVuY2xvc2VzIHRoZSBmcnVzdHVtLlxyXG5cdCAqIEBwYXJhbSB7UGxhbmV9IFtwNV0gLSBUaGUgc2l4dGggcGxhbmUgdGhhdCBlbmNsb3NlcyB0aGUgZnJ1c3R1bS5cclxuXHQgKiBAcmV0dXJuIHtGcnVzdHVtfSBBIHJlZmVyZW5jZSB0byB0aGlzIGZydXN0dW0uXHJcblx0ICovXHJcblx0c2V0KCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1ICkge1xyXG5cclxuXHRcdGNvbnN0IHBsYW5lcyA9IHRoaXMucGxhbmVzO1xyXG5cclxuXHRcdHBsYW5lc1sgMCBdLmNvcHkoIHAwICk7XHJcblx0XHRwbGFuZXNbIDEgXS5jb3B5KCBwMSApO1xyXG5cdFx0cGxhbmVzWyAyIF0uY29weSggcDIgKTtcclxuXHRcdHBsYW5lc1sgMyBdLmNvcHkoIHAzICk7XHJcblx0XHRwbGFuZXNbIDQgXS5jb3B5KCBwNCApO1xyXG5cdFx0cGxhbmVzWyA1IF0uY29weSggcDUgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gZnJ1c3R1bSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtGcnVzdHVtfSBmcnVzdHVtIC0gVGhlIGZydXN0dW0gdG8gY29weS5cclxuXHQgKiBAcmV0dXJuIHtGcnVzdHVtfSBBIHJlZmVyZW5jZSB0byB0aGlzIGZydXN0dW0uXHJcblx0ICovXHJcblx0Y29weSggZnJ1c3R1bSApIHtcclxuXHJcblx0XHRjb25zdCBwbGFuZXMgPSB0aGlzLnBsYW5lcztcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCA2OyBpICsrICkge1xyXG5cclxuXHRcdFx0cGxhbmVzWyBpIF0uY29weSggZnJ1c3R1bS5wbGFuZXNbIGkgXSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBmcnVzdHVtIHBsYW5lcyBmcm9tIHRoZSBnaXZlbiBwcm9qZWN0aW9uIG1hdHJpeC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4NH0gbSAtIFRoZSBwcm9qZWN0aW9uIG1hdHJpeC5cclxuXHQgKiBAcGFyYW0geyhXZWJHTENvb3JkaW5hdGVTeXN0ZW18V2ViR1BVQ29vcmRpbmF0ZVN5c3RlbSl9IGNvb3JkaW5hdGVTeXN0ZW0gLSBUaGUgY29vcmRpbmF0ZSBzeXN0ZW0uXHJcblx0ICogQHJldHVybiB7RnJ1c3R1bX0gQSByZWZlcmVuY2UgdG8gdGhpcyBmcnVzdHVtLlxyXG5cdCAqL1xyXG5cdHNldEZyb21Qcm9qZWN0aW9uTWF0cml4KCBtLCBjb29yZGluYXRlU3lzdGVtID0gV2ViR0xDb29yZGluYXRlU3lzdGVtICkge1xyXG5cclxuXHRcdGNvbnN0IHBsYW5lcyA9IHRoaXMucGxhbmVzO1xyXG5cdFx0Y29uc3QgbWUgPSBtLmVsZW1lbnRzO1xyXG5cdFx0Y29uc3QgbWUwID0gbWVbIDAgXSwgbWUxID0gbWVbIDEgXSwgbWUyID0gbWVbIDIgXSwgbWUzID0gbWVbIDMgXTtcclxuXHRcdGNvbnN0IG1lNCA9IG1lWyA0IF0sIG1lNSA9IG1lWyA1IF0sIG1lNiA9IG1lWyA2IF0sIG1lNyA9IG1lWyA3IF07XHJcblx0XHRjb25zdCBtZTggPSBtZVsgOCBdLCBtZTkgPSBtZVsgOSBdLCBtZTEwID0gbWVbIDEwIF0sIG1lMTEgPSBtZVsgMTEgXTtcclxuXHRcdGNvbnN0IG1lMTIgPSBtZVsgMTIgXSwgbWUxMyA9IG1lWyAxMyBdLCBtZTE0ID0gbWVbIDE0IF0sIG1lMTUgPSBtZVsgMTUgXTtcclxuXHJcblx0XHRwbGFuZXNbIDAgXS5zZXRDb21wb25lbnRzKCBtZTMgLSBtZTAsIG1lNyAtIG1lNCwgbWUxMSAtIG1lOCwgbWUxNSAtIG1lMTIgKS5ub3JtYWxpemUoKTtcclxuXHRcdHBsYW5lc1sgMSBdLnNldENvbXBvbmVudHMoIG1lMyArIG1lMCwgbWU3ICsgbWU0LCBtZTExICsgbWU4LCBtZTE1ICsgbWUxMiApLm5vcm1hbGl6ZSgpO1xyXG5cdFx0cGxhbmVzWyAyIF0uc2V0Q29tcG9uZW50cyggbWUzICsgbWUxLCBtZTcgKyBtZTUsIG1lMTEgKyBtZTksIG1lMTUgKyBtZTEzICkubm9ybWFsaXplKCk7XHJcblx0XHRwbGFuZXNbIDMgXS5zZXRDb21wb25lbnRzKCBtZTMgLSBtZTEsIG1lNyAtIG1lNSwgbWUxMSAtIG1lOSwgbWUxNSAtIG1lMTMgKS5ub3JtYWxpemUoKTtcclxuXHRcdHBsYW5lc1sgNCBdLnNldENvbXBvbmVudHMoIG1lMyAtIG1lMiwgbWU3IC0gbWU2LCBtZTExIC0gbWUxMCwgbWUxNSAtIG1lMTQgKS5ub3JtYWxpemUoKTtcclxuXHJcblx0XHRpZiAoIGNvb3JkaW5hdGVTeXN0ZW0gPT09IFdlYkdMQ29vcmRpbmF0ZVN5c3RlbSApIHtcclxuXHJcblx0XHRcdHBsYW5lc1sgNSBdLnNldENvbXBvbmVudHMoIG1lMyArIG1lMiwgbWU3ICsgbWU2LCBtZTExICsgbWUxMCwgbWUxNSArIG1lMTQgKS5ub3JtYWxpemUoKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBjb29yZGluYXRlU3lzdGVtID09PSBXZWJHUFVDb29yZGluYXRlU3lzdGVtICkge1xyXG5cclxuXHRcdFx0cGxhbmVzWyA1IF0uc2V0Q29tcG9uZW50cyggbWUyLCBtZTYsIG1lMTAsIG1lMTQgKS5ub3JtYWxpemUoKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuRnJ1c3R1bS5zZXRGcm9tUHJvamVjdGlvbk1hdHJpeCgpOiBJbnZhbGlkIGNvb3JkaW5hdGUgc3lzdGVtOiAnICsgY29vcmRpbmF0ZVN5c3RlbSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgM0Qgb2JqZWN0J3MgYm91bmRpbmcgc3BoZXJlIGlzIGludGVyc2VjdGluZyB0aGlzIGZydXN0dW0uXHJcblx0ICpcclxuXHQgKiBOb3RlIHRoYXQgdGhlIDNEIG9iamVjdCBtdXN0IGhhdmUgYSBnZW9tZXRyeSBzbyB0aGF0IHRoZSBib3VuZGluZyBzcGhlcmUgY2FuIGJlIGNhbGN1bGF0ZWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdDNEfSBvYmplY3QgLSBUaGUgM0Qgb2JqZWN0IHRvIHRlc3QuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgM0Qgb2JqZWN0J3MgYm91bmRpbmcgc3BoZXJlIGlzIGludGVyc2VjdGluZyB0aGlzIGZydXN0dW0gb3Igbm90LlxyXG5cdCAqL1xyXG5cdGludGVyc2VjdHNPYmplY3QoIG9iamVjdCApIHtcclxuXHJcblx0XHRpZiAoIG9iamVjdC5ib3VuZGluZ1NwaGVyZSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0aWYgKCBvYmplY3QuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSBvYmplY3QuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XHJcblxyXG5cdFx0XHRfc3BoZXJlLmNvcHkoIG9iamVjdC5ib3VuZGluZ1NwaGVyZSApLmFwcGx5TWF0cml4NCggb2JqZWN0Lm1hdHJpeFdvcmxkICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGNvbnN0IGdlb21ldHJ5ID0gb2JqZWN0Lmdlb21ldHJ5O1xyXG5cclxuXHRcdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCApIGdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xyXG5cclxuXHRcdFx0X3NwaGVyZS5jb3B5KCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSApLmFwcGx5TWF0cml4NCggb2JqZWN0Lm1hdHJpeFdvcmxkICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzLmludGVyc2VjdHNTcGhlcmUoIF9zcGhlcmUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gc3ByaXRlIGlzIGludGVyc2VjdGluZyB0aGlzIGZydXN0dW0uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1Nwcml0ZX0gc3ByaXRlIC0gVGhlIHNwcml0ZSB0byB0ZXN0LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHNwcml0ZSBpcyBpbnRlcnNlY3RpbmcgdGhpcyBmcnVzdHVtIG9yIG5vdC5cclxuXHQgKi9cclxuXHRpbnRlcnNlY3RzU3ByaXRlKCBzcHJpdGUgKSB7XHJcblxyXG5cdFx0X3NwaGVyZS5jZW50ZXIuc2V0KCAwLCAwLCAwICk7XHJcblx0XHRfc3BoZXJlLnJhZGl1cyA9IDAuNzA3MTA2NzgxMTg2NTQ3NjtcclxuXHRcdF9zcGhlcmUuYXBwbHlNYXRyaXg0KCBzcHJpdGUubWF0cml4V29ybGQgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKCBfc3BoZXJlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIGJvdW5kaW5nIHNwaGVyZSBpcyBpbnRlcnNlY3RpbmcgdGhpcyBmcnVzdHVtLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTcGhlcmV9IHNwaGVyZSAtIFRoZSBib3VuZGluZyBzcGhlcmUgdG8gdGVzdC5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBib3VuZGluZyBzcGhlcmUgaXMgaW50ZXJzZWN0aW5nIHRoaXMgZnJ1c3R1bSBvciBub3QuXHJcblx0ICovXHJcblx0aW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICkge1xyXG5cclxuXHRcdGNvbnN0IHBsYW5lcyA9IHRoaXMucGxhbmVzO1xyXG5cdFx0Y29uc3QgY2VudGVyID0gc3BoZXJlLmNlbnRlcjtcclxuXHRcdGNvbnN0IG5lZ1JhZGl1cyA9IC0gc3BoZXJlLnJhZGl1cztcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCA2OyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgZGlzdGFuY2UgPSBwbGFuZXNbIGkgXS5kaXN0YW5jZVRvUG9pbnQoIGNlbnRlciApO1xyXG5cclxuXHRcdFx0aWYgKCBkaXN0YW5jZSA8IG5lZ1JhZGl1cyApIHtcclxuXHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gYm91bmRpbmcgYm94IGlzIGludGVyc2VjdGluZyB0aGlzIGZydXN0dW0uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0JveDN9IGJveCAtIFRoZSBib3VuZGluZyBib3ggdG8gdGVzdC5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBib3VuZGluZyBib3ggaXMgaW50ZXJzZWN0aW5nIHRoaXMgZnJ1c3R1bSBvciBub3QuXHJcblx0ICovXHJcblx0aW50ZXJzZWN0c0JveCggYm94ICkge1xyXG5cclxuXHRcdGNvbnN0IHBsYW5lcyA9IHRoaXMucGxhbmVzO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDY7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBwbGFuZSA9IHBsYW5lc1sgaSBdO1xyXG5cclxuXHRcdFx0Ly8gY29ybmVyIGF0IG1heCBkaXN0YW5jZVxyXG5cclxuXHRcdFx0X3ZlY3Rvci54ID0gcGxhbmUubm9ybWFsLnggPiAwID8gYm94Lm1heC54IDogYm94Lm1pbi54O1xyXG5cdFx0XHRfdmVjdG9yLnkgPSBwbGFuZS5ub3JtYWwueSA+IDAgPyBib3gubWF4LnkgOiBib3gubWluLnk7XHJcblx0XHRcdF92ZWN0b3IueiA9IHBsYW5lLm5vcm1hbC56ID4gMCA/IGJveC5tYXgueiA6IGJveC5taW4uejtcclxuXHJcblx0XHRcdGlmICggcGxhbmUuZGlzdGFuY2VUb1BvaW50KCBfdmVjdG9yICkgPCAwICkge1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBnaXZlbiBwb2ludCBsaWVzIHdpdGhpbiB0aGUgZnJ1c3R1bS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gcG9pbnQgLSBUaGUgcG9pbnQgdG8gdGVzdC5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBwb2ludCBsaWVzIHdpdGhpbiB0aGlzIGZydXN0dW0gb3Igbm90LlxyXG5cdCAqL1xyXG5cdGNvbnRhaW5zUG9pbnQoIHBvaW50ICkge1xyXG5cclxuXHRcdGNvbnN0IHBsYW5lcyA9IHRoaXMucGxhbmVzO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDY7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHBsYW5lc1sgaSBdLmRpc3RhbmNlVG9Qb2ludCggcG9pbnQgKSA8IDAgKSB7XHJcblxyXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIG5ldyBmcnVzdHVtIHdpdGggY29waWVkIHZhbHVlcyBmcm9tIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtGcnVzdHVtfSBBIGNsb25lIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y2xvbmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgRnJ1c3R1bSB9O1xyXG4iLCJpbXBvcnQgeyBCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcbmltcG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9CdWZmZXJHZW9tZXRyeS5qcyc7XHJcbmltcG9ydCB7IERhdGFUZXh0dXJlIH0gZnJvbSAnLi4vdGV4dHVyZXMvRGF0YVRleHR1cmUuanMnO1xyXG5pbXBvcnQgeyBGbG9hdFR5cGUsIFJlZEludGVnZXJGb3JtYXQsIFVuc2lnbmVkSW50VHlwZSwgUkdCQUZvcm1hdCB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IE1hdHJpeDQgfSBmcm9tICcuLi9tYXRoL01hdHJpeDQuanMnO1xyXG5pbXBvcnQgeyBNZXNoIH0gZnJvbSAnLi9NZXNoLmpzJztcclxuaW1wb3J0IHsgQ29sb3JNYW5hZ2VtZW50IH0gZnJvbSAnLi4vbWF0aC9Db2xvck1hbmFnZW1lbnQuanMnO1xyXG5pbXBvcnQgeyBCb3gzIH0gZnJvbSAnLi4vbWF0aC9Cb3gzLmpzJztcclxuaW1wb3J0IHsgU3BoZXJlIH0gZnJvbSAnLi4vbWF0aC9TcGhlcmUuanMnO1xyXG5pbXBvcnQgeyBGcnVzdHVtIH0gZnJvbSAnLi4vbWF0aC9GcnVzdHVtLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcbmltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vbWF0aC9Db2xvci5qcyc7XHJcblxyXG5mdW5jdGlvbiBhc2NJZFNvcnQoIGEsIGIgKSB7XHJcblxyXG5cdHJldHVybiBhIC0gYjtcclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNvcnRPcGFxdWUoIGEsIGIgKSB7XHJcblxyXG5cdHJldHVybiBhLnogLSBiLno7XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBzb3J0VHJhbnNwYXJlbnQoIGEsIGIgKSB7XHJcblxyXG5cdHJldHVybiBiLnogLSBhLno7XHJcblxyXG59XHJcblxyXG5jbGFzcyBNdWx0aURyYXdSZW5kZXJMaXN0IHtcclxuXHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblxyXG5cdFx0dGhpcy5pbmRleCA9IDA7XHJcblx0XHR0aGlzLnBvb2wgPSBbXTtcclxuXHRcdHRoaXMubGlzdCA9IFtdO1xyXG5cclxuXHR9XHJcblxyXG5cdHB1c2goIHN0YXJ0LCBjb3VudCwgeiwgaW5kZXggKSB7XHJcblxyXG5cdFx0Y29uc3QgcG9vbCA9IHRoaXMucG9vbDtcclxuXHRcdGNvbnN0IGxpc3QgPSB0aGlzLmxpc3Q7XHJcblx0XHRpZiAoIHRoaXMuaW5kZXggPj0gcG9vbC5sZW5ndGggKSB7XHJcblxyXG5cdFx0XHRwb29sLnB1c2goIHtcclxuXHJcblx0XHRcdFx0c3RhcnQ6IC0gMSxcclxuXHRcdFx0XHRjb3VudDogLSAxLFxyXG5cdFx0XHRcdHo6IC0gMSxcclxuXHRcdFx0XHRpbmRleDogLSAxLFxyXG5cclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBpdGVtID0gcG9vbFsgdGhpcy5pbmRleCBdO1xyXG5cdFx0bGlzdC5wdXNoKCBpdGVtICk7XHJcblx0XHR0aGlzLmluZGV4ICsrO1xyXG5cclxuXHRcdGl0ZW0uc3RhcnQgPSBzdGFydDtcclxuXHRcdGl0ZW0uY291bnQgPSBjb3VudDtcclxuXHRcdGl0ZW0ueiA9IHo7XHJcblx0XHRpdGVtLmluZGV4ID0gaW5kZXg7XHJcblxyXG5cdH1cclxuXHJcblx0cmVzZXQoKSB7XHJcblxyXG5cdFx0dGhpcy5saXN0Lmxlbmd0aCA9IDA7XHJcblx0XHR0aGlzLmluZGV4ID0gMDtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuY29uc3QgX21hdHJpeCA9IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDQoKTtcclxuY29uc3QgX3doaXRlQ29sb3IgPSAvKkBfX1BVUkVfXyovIG5ldyBDb2xvciggMSwgMSwgMSApO1xyXG5jb25zdCBfZnJ1c3R1bSA9IC8qQF9fUFVSRV9fKi8gbmV3IEZydXN0dW0oKTtcclxuY29uc3QgX2JveCA9IC8qQF9fUFVSRV9fKi8gbmV3IEJveDMoKTtcclxuY29uc3QgX3NwaGVyZSA9IC8qQF9fUFVSRV9fKi8gbmV3IFNwaGVyZSgpO1xyXG5jb25zdCBfdmVjdG9yID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfZm9yd2FyZCA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX3RlbXAgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF9yZW5kZXJMaXN0ID0gLypAX19QVVJFX18qLyBuZXcgTXVsdGlEcmF3UmVuZGVyTGlzdCgpO1xyXG5jb25zdCBfbWVzaCA9IC8qQF9fUFVSRV9fKi8gbmV3IE1lc2goKTtcclxuY29uc3QgX2JhdGNoSW50ZXJzZWN0cyA9IFtdO1xyXG5cclxuLy8gY29waWVzIGRhdGEgZnJvbSBhdHRyaWJ1dGUgXCJzcmNcIiBpbnRvIFwidGFyZ2V0XCIgc3RhcnRpbmcgYXQgXCJ0YXJnZXRPZmZzZXRcIlxyXG5mdW5jdGlvbiBjb3B5QXR0cmlidXRlRGF0YSggc3JjLCB0YXJnZXQsIHRhcmdldE9mZnNldCA9IDAgKSB7XHJcblxyXG5cdGNvbnN0IGl0ZW1TaXplID0gdGFyZ2V0Lml0ZW1TaXplO1xyXG5cdGlmICggc3JjLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgfHwgc3JjLmFycmF5LmNvbnN0cnVjdG9yICE9PSB0YXJnZXQuYXJyYXkuY29uc3RydWN0b3IgKSB7XHJcblxyXG5cdFx0Ly8gdXNlIHRoZSBjb21wb25lbnQgZ2V0dGVycyBhbmQgc2V0dGVycyBpZiB0aGUgYXJyYXkgZGF0YSBjYW5ub3RcclxuXHRcdC8vIGJlIGNvcGllZCBkaXJlY3RseVxyXG5cdFx0Y29uc3QgdmVydGV4Q291bnQgPSBzcmMuY291bnQ7XHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB2ZXJ0ZXhDb3VudDsgaSArKyApIHtcclxuXHJcblx0XHRcdGZvciAoIGxldCBjID0gMDsgYyA8IGl0ZW1TaXplOyBjICsrICkge1xyXG5cclxuXHRcdFx0XHR0YXJnZXQuc2V0Q29tcG9uZW50KCBpICsgdGFyZ2V0T2Zmc2V0LCBjLCBzcmMuZ2V0Q29tcG9uZW50KCBpLCBjICkgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0Ly8gZmFzdGVyIGNvcHkgYXBwcm9hY2ggdXNpbmcgdHlwZWQgYXJyYXkgc2V0IGZ1bmN0aW9uXHJcblx0XHR0YXJnZXQuYXJyYXkuc2V0KCBzcmMuYXJyYXksIHRhcmdldE9mZnNldCAqIGl0ZW1TaXplICk7XHJcblxyXG5cdH1cclxuXHJcblx0dGFyZ2V0Lm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcbn1cclxuXHJcbi8vIHNhZmVseSBjb3BpZXMgYXJyYXkgY29udGVudHMgdG8gYSBwb3RlbnRpYWxseSBzbWFsbGVyIGFycmF5XHJcbmZ1bmN0aW9uIGNvcHlBcnJheUNvbnRlbnRzKCBzcmMsIHRhcmdldCApIHtcclxuXHJcblx0aWYgKCBzcmMuY29uc3RydWN0b3IgIT09IHRhcmdldC5jb25zdHJ1Y3RvciApIHtcclxuXHJcblx0XHQvLyBpZiBhcnJheXMgYXJlIG9mIGEgZGlmZmVyZW50IHR5cGUgKGVnIGR1ZSB0byBpbmRleCBzaXplIGluY3JlYXNpbmcpIHRoZW4gZGF0YSBtdXN0IGJlIHBlci1lbGVtZW50IGNvcGllZFxyXG5cdFx0Y29uc3QgbGVuID0gTWF0aC5taW4oIHNyYy5sZW5ndGgsIHRhcmdldC5sZW5ndGggKTtcclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGxlbjsgaSArKyApIHtcclxuXHJcblx0XHRcdHRhcmdldFsgaSBdID0gc3JjWyBpIF07XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9IGVsc2Uge1xyXG5cclxuXHRcdC8vIGlmIHRoZSBhcnJheXMgdXNlIHRoZSBzYW1lIGRhdGEgbGF5b3V0IHdlIGNhbiB1c2UgYSBmYXN0IGJsb2NrIGNvcHlcclxuXHRcdGNvbnN0IGxlbiA9IE1hdGgubWluKCBzcmMubGVuZ3RoLCB0YXJnZXQubGVuZ3RoICk7XHJcblx0XHR0YXJnZXQuc2V0KCBuZXcgc3JjLmNvbnN0cnVjdG9yKCBzcmMuYnVmZmVyLCAwLCBsZW4gKSApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQSBzcGVjaWFsIHZlcnNpb24gb2YgYSBtZXNoIHdpdGggbXVsdGkgZHJhdyBiYXRjaCByZW5kZXJpbmcgc3VwcG9ydC4gVXNlXHJcbiAqIHRoaXMgY2xhc3MgaWYgeW91IGhhdmUgdG8gcmVuZGVyIGEgbGFyZ2UgbnVtYmVyIG9mIG9iamVjdHMgd2l0aCB0aGUgc2FtZVxyXG4gKiBtYXRlcmlhbCBidXQgd2l0aCBkaWZmZXJlbnQgZ2VvbWV0cmllcyBvciB3b3JsZCB0cmFuc2Zvcm1hdGlvbnMuIFRoZSB1c2FnZSBvZlxyXG4gKiBgQmF0Y2hlZE1lc2hgIHdpbGwgaGVscCB5b3UgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgZHJhdyBjYWxscyBhbmQgdGh1cyBpbXByb3ZlIHRoZSBvdmVyYWxsXHJcbiAqIHJlbmRlcmluZyBwZXJmb3JtYW5jZSBpbiB5b3VyIGFwcGxpY2F0aW9uLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBib3ggPSBuZXcgVEhSRUUuQm94R2VvbWV0cnkoIDEsIDEsIDEgKTtcclxuICogY29uc3Qgc3BoZXJlID0gbmV3IFRIUkVFLlNwaGVyZUdlb21ldHJ5KCAxLCAxMiwgMTIgKTtcclxuICogY29uc3QgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IDB4MDBmZjAwIH0gKTtcclxuICpcclxuICogLy8gaW5pdGlhbGl6ZSBhbmQgYWRkIGdlb21ldHJpZXMgaW50byB0aGUgYmF0Y2hlZCBtZXNoXHJcbiAqIGNvbnN0IGJhdGNoZWRNZXNoID0gbmV3IEJhdGNoZWRNZXNoKCAxMCwgNTAwMCwgMTAwMDAsIG1hdGVyaWFsICk7XHJcbiAqIGNvbnN0IGJveEdlb21ldHJ5SWQgPSBiYXRjaGVkTWVzaC5hZGRHZW9tZXRyeSggYm94ICk7XHJcbiAqIGNvbnN0IHNwaGVyZUdlb21ldHJ5SWQgPSBiYXRjaGVkTWVzaC5hZGRHZW9tZXRyeSggc3BoZXJlICk7XHJcbiAqXHJcbiAqIC8vIGNyZWF0ZSBpbnN0YW5jZXMgb2YgdGhvc2UgZ2VvbWV0cmllc1xyXG4gKiBjb25zdCBib3hJbnN0YW5jZWRJZDEgPSBiYXRjaGVkTWVzaC5hZGRJbnN0YW5jZSggYm94R2VvbWV0cnlJZCApO1xyXG4gKiBjb25zdCBib3hJbnN0YW5jZWRJZDIgPSBiYXRjaGVkTWVzaC5hZGRJbnN0YW5jZSggYm94R2VvbWV0cnlJZCApO1xyXG4gKlxyXG4gKiBjb25zdCBzcGhlcmVJbnN0YW5jZWRJZDEgPSBiYXRjaGVkTWVzaC5hZGRJbnN0YW5jZSggc3BoZXJlR2VvbWV0cnlJZCApO1xyXG4gKiBjb25zdCBzcGhlcmVJbnN0YW5jZWRJZDIgPSBiYXRjaGVkTWVzaC5hZGRJbnN0YW5jZSggc3BoZXJlR2VvbWV0cnlJZCApO1xyXG4gKlxyXG4gKiAvLyBwb3NpdGlvbiB0aGUgZ2VvbWV0cmllc1xyXG4gKiBiYXRjaGVkTWVzaC5zZXRNYXRyaXhBdCggYm94SW5zdGFuY2VkSWQxLCBib3hNYXRyaXgxICk7XHJcbiAqIGJhdGNoZWRNZXNoLnNldE1hdHJpeEF0KCBib3hJbnN0YW5jZWRJZDIsIGJveE1hdHJpeDIgKTtcclxuICpcclxuICogYmF0Y2hlZE1lc2guc2V0TWF0cml4QXQoIHNwaGVyZUluc3RhbmNlZElkMSwgc3BoZXJlTWF0cml4MSApO1xyXG4gKiBiYXRjaGVkTWVzaC5zZXRNYXRyaXhBdCggc3BoZXJlSW5zdGFuY2VkSWQyLCBzcGhlcmVNYXRyaXgyICk7XHJcbiAqXHJcbiAqIHNjZW5lLmFkZCggYmF0Y2hlZE1lc2ggKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBNZXNoXHJcbiAqL1xyXG5jbGFzcyBCYXRjaGVkTWVzaCBleHRlbmRzIE1lc2gge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGJhdGNoZWQgbWVzaC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBtYXhJbnN0YW5jZUNvdW50IC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIGluZGl2aWR1YWwgaW5zdGFuY2VzIHBsYW5uZWQgdG8gYmUgYWRkZWQgYW5kIHJlbmRlcmVkLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBtYXhWZXJ0ZXhDb3VudCAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiB2ZXJ0aWNlcyB0byBiZSB1c2VkIGJ5IGFsbCB1bmlxdWUgZ2VvbWV0cmllcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW21heEluZGV4Q291bnQ9bWF4VmVydGV4Q291bnQqMl0gLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgaW5kaWNlcyB0byBiZSB1c2VkIGJ5IGFsbCB1bmlxdWUgZ2VvbWV0cmllc1xyXG5cdCAqIEBwYXJhbSB7TWF0ZXJpYWx8QXJyYXk8TWF0ZXJpYWw+fSBbbWF0ZXJpYWxdIC0gVGhlIG1lc2ggbWF0ZXJpYWwuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG1heEluc3RhbmNlQ291bnQsIG1heFZlcnRleENvdW50LCBtYXhJbmRleENvdW50ID0gbWF4VmVydGV4Q291bnQgKiAyLCBtYXRlcmlhbCApIHtcclxuXHJcblx0XHRzdXBlciggbmV3IEJ1ZmZlckdlb21ldHJ5KCksIG1hdGVyaWFsICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzQmF0Y2hlZE1lc2ggPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hlbiBzZXQgb3QgYHRydWVgLCB0aGUgaW5kaXZpZHVhbCBvYmplY3RzIG9mIGEgYmF0Y2ggYXJlIGZydXN0dW0gY3VsbGVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBlck9iamVjdEZydXN0dW1DdWxsZWQgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hlbiBzZXQgdG8gYHRydWVgLCB0aGUgaW5kaXZpZHVhbCBvYmplY3RzIG9mIGEgYmF0Y2ggYXJlIHNvcnRlZCB0byBpbXByb3ZlIG92ZXJkcmF3LXJlbGF0ZWQgYXJ0aWZhY3RzLlxyXG5cdFx0ICogSWYgdGhlIG1hdGVyaWFsIGlzIG1hcmtlZCBhcyBcInRyYW5zcGFyZW50XCIgb2JqZWN0cyBhcmUgcmVuZGVyZWQgYmFjayB0byBmcm9udCBhbmQgaWYgbm90IHRoZW4gdGhleSBhcmVcclxuXHRcdCAqIHJlbmRlcmVkIGZyb250IHRvIGJhY2suXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc29ydE9iamVjdHMgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgYmF0Y2hlZCBtZXNoLiBDYW4gYmUgY29tcHV0ZWQgdmlhIHtAbGluayBCYXRjaGVkTWVzaCNjb21wdXRlQm91bmRpbmdCb3h9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Qm94M31cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ib3VuZGluZ0JveCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYm91bmRpbmcgc3BoZXJlIG9mIHRoZSBiYXRjaGVkIG1lc2guIENhbiBiZSBjb21wdXRlZCB2aWEge0BsaW5rIEJhdGNoZWRNZXNoI2NvbXB1dGVCb3VuZGluZ1NwaGVyZX0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9TcGhlcmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGFrZXMgYSBzb3J0IGEgZnVuY3Rpb24gdGhhdCBpcyBydW4gYmVmb3JlIHJlbmRlci4gVGhlIGZ1bmN0aW9uIHRha2VzIGEgbGlzdCBvZiBpbnN0YW5jZXMgdG9cclxuXHRcdCAqIHNvcnQgYW5kIGEgY2FtZXJhLiBUaGUgb2JqZWN0cyBpbiB0aGUgbGlzdCBpbmNsdWRlIGEgXCJ6XCIgZmllbGQgdG8gcGVyZm9ybSBhIGRlcHRoLW9yZGVyZWRcclxuXHRcdCAqIHNvcnQgd2l0aC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P0Z1bmN0aW9ufVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmN1c3RvbVNvcnQgPSBudWxsO1xyXG5cclxuXHRcdC8vIHN0b3JlcyB2aXNpYmxlLCBhY3RpdmUsIGFuZCBnZW9tZXRyeSBpZCBwZXIgaW5zdGFuY2UgYW5kIHJlc2VydmVkIGJ1ZmZlciByYW5nZXMgZm9yIGdlb21ldHJpZXNcclxuXHRcdHRoaXMuX2luc3RhbmNlSW5mbyA9IFtdO1xyXG5cdFx0dGhpcy5fZ2VvbWV0cnlJbmZvID0gW107XHJcblxyXG5cdFx0Ly8gaW5zdGFuY2UsIGdlb21ldHJ5IGlkcyB0aGF0IGhhdmUgYmVlbiBzZXQgYXMgaW5hY3RpdmUsIGFuZCBhcmUgYXZhaWxhYmxlIHRvIGJlIG92ZXJ3cml0dGVuXHJcblx0XHR0aGlzLl9hdmFpbGFibGVJbnN0YW5jZUlkcyA9IFtdO1xyXG5cdFx0dGhpcy5fYXZhaWxhYmxlR2VvbWV0cnlJZHMgPSBbXTtcclxuXHJcblx0XHQvLyB1c2VkIHRvIHRyYWNrIHdoZXJlIHRoZSBuZXh0IHBvaW50IGlzIHRoYXQgZ2VvbWV0cnkgc2hvdWxkIGJlIGluc2VydGVkXHJcblx0XHR0aGlzLl9uZXh0SW5kZXhTdGFydCA9IDA7XHJcblx0XHR0aGlzLl9uZXh0VmVydGV4U3RhcnQgPSAwO1xyXG5cdFx0dGhpcy5fZ2VvbWV0cnlDb3VudCA9IDA7XHJcblxyXG5cdFx0Ly8gZmxhZ3NcclxuXHRcdHRoaXMuX3Zpc2liaWxpdHlDaGFuZ2VkID0gdHJ1ZTtcclxuXHRcdHRoaXMuX2dlb21ldHJ5SW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuXHJcblx0XHQvLyBjYWNoZWQgdXNlciBvcHRpb25zXHJcblx0XHR0aGlzLl9tYXhJbnN0YW5jZUNvdW50ID0gbWF4SW5zdGFuY2VDb3VudDtcclxuXHRcdHRoaXMuX21heFZlcnRleENvdW50ID0gbWF4VmVydGV4Q291bnQ7XHJcblx0XHR0aGlzLl9tYXhJbmRleENvdW50ID0gbWF4SW5kZXhDb3VudDtcclxuXHJcblx0XHQvLyBidWZmZXJzIGZvciBtdWx0aSBkcmF3XHJcblx0XHR0aGlzLl9tdWx0aURyYXdDb3VudHMgPSBuZXcgSW50MzJBcnJheSggbWF4SW5zdGFuY2VDb3VudCApO1xyXG5cdFx0dGhpcy5fbXVsdGlEcmF3U3RhcnRzID0gbmV3IEludDMyQXJyYXkoIG1heEluc3RhbmNlQ291bnQgKTtcclxuXHRcdHRoaXMuX211bHRpRHJhd0NvdW50ID0gMDtcclxuXHRcdHRoaXMuX211bHRpRHJhd0luc3RhbmNlcyA9IG51bGw7XHJcblxyXG5cdFx0Ly8gTG9jYWwgbWF0cml4IHBlciBnZW9tZXRyeSBieSB1c2luZyBkYXRhIHRleHR1cmVcclxuXHRcdHRoaXMuX21hdHJpY2VzVGV4dHVyZSA9IG51bGw7XHJcblx0XHR0aGlzLl9pbmRpcmVjdFRleHR1cmUgPSBudWxsO1xyXG5cdFx0dGhpcy5fY29sb3JzVGV4dHVyZSA9IG51bGw7XHJcblxyXG5cdFx0dGhpcy5faW5pdE1hdHJpY2VzVGV4dHVyZSgpO1xyXG5cdFx0dGhpcy5faW5pdEluZGlyZWN0VGV4dHVyZSgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBpbmRpdmlkdWFsIGluc3RhbmNlcyB0aGF0IGNhbiBiZSBzdG9yZWQgaW4gdGhlIGJhdGNoLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge251bWJlcn1cclxuXHQgKiBAcmVhZG9ubHlcclxuXHQgKi9cclxuXHRnZXQgbWF4SW5zdGFuY2VDb3VudCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fbWF4SW5zdGFuY2VDb3VudDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgaW5zdGFuY2UgY291bnQuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdCAqIEByZWFkb25seVxyXG5cdCAqL1xyXG5cdGdldCBpbnN0YW5jZUNvdW50KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9pbnN0YW5jZUluZm8ubGVuZ3RoIC0gdGhpcy5fYXZhaWxhYmxlSW5zdGFuY2VJZHMubGVuZ3RoO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBudW1iZXIgb2YgdW51c2VkIHZlcnRpY2VzLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge251bWJlcn1cclxuXHQgKiBAcmVhZG9ubHlcclxuXHQgKi9cclxuXHRnZXQgdW51c2VkVmVydGV4Q291bnQoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX21heFZlcnRleENvdW50IC0gdGhpcy5fbmV4dFZlcnRleFN0YXJ0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBudW1iZXIgb2YgdW51c2VkIGluZGljZXMuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdCAqIEByZWFkb25seVxyXG5cdCAqL1xyXG5cdGdldCB1bnVzZWRJbmRleENvdW50KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9tYXhJbmRleENvdW50IC0gdGhpcy5fbmV4dEluZGV4U3RhcnQ7XHJcblxyXG5cdH1cclxuXHJcblx0X2luaXRNYXRyaWNlc1RleHR1cmUoKSB7XHJcblxyXG5cdFx0Ly8gbGF5b3V0ICgxIG1hdHJpeCA9IDQgcGl4ZWxzKVxyXG5cdFx0Ly8gICAgICBSR0JBIFJHQkEgUkdCQSBSR0JBICg9PiBjb2x1bW4xLCBjb2x1bW4yLCBjb2x1bW4zLCBjb2x1bW40KVxyXG5cdFx0Ly8gIHdpdGggIDh4OCAgcGl4ZWwgdGV4dHVyZSBtYXggICAxNiBtYXRyaWNlcyAqIDQgcGl4ZWxzID0gICg4ICogOClcclxuXHRcdC8vICAgICAgIDE2eDE2IHBpeGVsIHRleHR1cmUgbWF4ICAgNjQgbWF0cmljZXMgKiA0IHBpeGVscyA9ICgxNiAqIDE2KVxyXG5cdFx0Ly8gICAgICAgMzJ4MzIgcGl4ZWwgdGV4dHVyZSBtYXggIDI1NiBtYXRyaWNlcyAqIDQgcGl4ZWxzID0gKDMyICogMzIpXHJcblx0XHQvLyAgICAgICA2NHg2NCBwaXhlbCB0ZXh0dXJlIG1heCAxMDI0IG1hdHJpY2VzICogNCBwaXhlbHMgPSAoNjQgKiA2NClcclxuXHJcblx0XHRsZXQgc2l6ZSA9IE1hdGguc3FydCggdGhpcy5fbWF4SW5zdGFuY2VDb3VudCAqIDQgKTsgLy8gNCBwaXhlbHMgbmVlZGVkIGZvciAxIG1hdHJpeFxyXG5cdFx0c2l6ZSA9IE1hdGguY2VpbCggc2l6ZSAvIDQgKSAqIDQ7XHJcblx0XHRzaXplID0gTWF0aC5tYXgoIHNpemUsIDQgKTtcclxuXHJcblx0XHRjb25zdCBtYXRyaWNlc0FycmF5ID0gbmV3IEZsb2F0MzJBcnJheSggc2l6ZSAqIHNpemUgKiA0ICk7IC8vIDQgZmxvYXRzIHBlciBSR0JBIHBpeGVsXHJcblx0XHRjb25zdCBtYXRyaWNlc1RleHR1cmUgPSBuZXcgRGF0YVRleHR1cmUoIG1hdHJpY2VzQXJyYXksIHNpemUsIHNpemUsIFJHQkFGb3JtYXQsIEZsb2F0VHlwZSApO1xyXG5cclxuXHRcdHRoaXMuX21hdHJpY2VzVGV4dHVyZSA9IG1hdHJpY2VzVGV4dHVyZTtcclxuXHJcblx0fVxyXG5cclxuXHRfaW5pdEluZGlyZWN0VGV4dHVyZSgpIHtcclxuXHJcblx0XHRsZXQgc2l6ZSA9IE1hdGguc3FydCggdGhpcy5fbWF4SW5zdGFuY2VDb3VudCApO1xyXG5cdFx0c2l6ZSA9IE1hdGguY2VpbCggc2l6ZSApO1xyXG5cclxuXHRcdGNvbnN0IGluZGlyZWN0QXJyYXkgPSBuZXcgVWludDMyQXJyYXkoIHNpemUgKiBzaXplICk7XHJcblx0XHRjb25zdCBpbmRpcmVjdFRleHR1cmUgPSBuZXcgRGF0YVRleHR1cmUoIGluZGlyZWN0QXJyYXksIHNpemUsIHNpemUsIFJlZEludGVnZXJGb3JtYXQsIFVuc2lnbmVkSW50VHlwZSApO1xyXG5cclxuXHRcdHRoaXMuX2luZGlyZWN0VGV4dHVyZSA9IGluZGlyZWN0VGV4dHVyZTtcclxuXHJcblx0fVxyXG5cclxuXHRfaW5pdENvbG9yc1RleHR1cmUoKSB7XHJcblxyXG5cdFx0bGV0IHNpemUgPSBNYXRoLnNxcnQoIHRoaXMuX21heEluc3RhbmNlQ291bnQgKTtcclxuXHRcdHNpemUgPSBNYXRoLmNlaWwoIHNpemUgKTtcclxuXHJcblx0XHQvLyA0IGZsb2F0cyBwZXIgUkdCQSBwaXhlbCBpbml0aWFsaXplZCB0byB3aGl0ZVxyXG5cdFx0Y29uc3QgY29sb3JzQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KCBzaXplICogc2l6ZSAqIDQgKS5maWxsKCAxICk7XHJcblx0XHRjb25zdCBjb2xvcnNUZXh0dXJlID0gbmV3IERhdGFUZXh0dXJlKCBjb2xvcnNBcnJheSwgc2l6ZSwgc2l6ZSwgUkdCQUZvcm1hdCwgRmxvYXRUeXBlICk7XHJcblx0XHRjb2xvcnNUZXh0dXJlLmNvbG9yU3BhY2UgPSBDb2xvck1hbmFnZW1lbnQud29ya2luZ0NvbG9yU3BhY2U7XHJcblxyXG5cdFx0dGhpcy5fY29sb3JzVGV4dHVyZSA9IGNvbG9yc1RleHR1cmU7XHJcblxyXG5cdH1cclxuXHJcblx0X2luaXRpYWxpemVHZW9tZXRyeSggcmVmZXJlbmNlICkge1xyXG5cclxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcclxuXHRcdGNvbnN0IG1heFZlcnRleENvdW50ID0gdGhpcy5fbWF4VmVydGV4Q291bnQ7XHJcblx0XHRjb25zdCBtYXhJbmRleENvdW50ID0gdGhpcy5fbWF4SW5kZXhDb3VudDtcclxuXHRcdGlmICggdGhpcy5fZ2VvbWV0cnlJbml0aWFsaXplZCA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBjb25zdCBhdHRyaWJ1dGVOYW1lIGluIHJlZmVyZW5jZS5hdHRyaWJ1dGVzICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBzcmNBdHRyaWJ1dGUgPSByZWZlcmVuY2UuZ2V0QXR0cmlidXRlKCBhdHRyaWJ1dGVOYW1lICk7XHJcblx0XHRcdFx0Y29uc3QgeyBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgfSA9IHNyY0F0dHJpYnV0ZTtcclxuXHJcblx0XHRcdFx0Y29uc3QgZHN0QXJyYXkgPSBuZXcgYXJyYXkuY29uc3RydWN0b3IoIG1heFZlcnRleENvdW50ICogaXRlbVNpemUgKTtcclxuXHRcdFx0XHRjb25zdCBkc3RBdHRyaWJ1dGUgPSBuZXcgQnVmZmVyQXR0cmlidXRlKCBkc3RBcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTtcclxuXHJcblx0XHRcdFx0Z2VvbWV0cnkuc2V0QXR0cmlidXRlKCBhdHRyaWJ1dGVOYW1lLCBkc3RBdHRyaWJ1dGUgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggcmVmZXJlbmNlLmdldEluZGV4KCkgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdC8vIFJlc2VydmUgbGFzdCB1MTYgaW5kZXggZm9yIHByaW1pdGl2ZSByZXN0YXJ0LlxyXG5cdFx0XHRcdGNvbnN0IGluZGV4QXJyYXkgPSBtYXhWZXJ0ZXhDb3VudCA+IDY1NTM1XHJcblx0XHRcdFx0XHQ/IG5ldyBVaW50MzJBcnJheSggbWF4SW5kZXhDb3VudCApXHJcblx0XHRcdFx0XHQ6IG5ldyBVaW50MTZBcnJheSggbWF4SW5kZXhDb3VudCApO1xyXG5cclxuXHRcdFx0XHRnZW9tZXRyeS5zZXRJbmRleCggbmV3IEJ1ZmZlckF0dHJpYnV0ZSggaW5kZXhBcnJheSwgMSApICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0aGlzLl9nZW9tZXRyeUluaXRpYWxpemVkID0gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gTWFrZSBzdXJlIHRoZSBnZW9tZXRyeSBpcyBjb21wYXRpYmxlIHdpdGggdGhlIGV4aXN0aW5nIGNvbWJpbmVkIGdlb21ldHJ5IGF0dHJpYnV0ZXNcclxuXHRfdmFsaWRhdGVHZW9tZXRyeSggZ2VvbWV0cnkgKSB7XHJcblxyXG5cdFx0Ly8gY2hlY2sgdG8gZW5zdXJlIHRoZSBnZW9tZXRyaWVzIGFyZSB1c2luZyBjb25zaXN0ZW50IGF0dHJpYnV0ZXMgYW5kIGluZGljZXNcclxuXHRcdGNvbnN0IGJhdGNoR2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xyXG5cdFx0aWYgKCBCb29sZWFuKCBnZW9tZXRyeS5nZXRJbmRleCgpICkgIT09IEJvb2xlYW4oIGJhdGNoR2VvbWV0cnkuZ2V0SW5kZXgoKSApICkge1xyXG5cclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuQmF0Y2hlZE1lc2g6IEFsbCBnZW9tZXRyaWVzIG11c3QgY29uc2lzdGVudGx5IGhhdmUgXCJpbmRleFwiLicgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Zm9yICggY29uc3QgYXR0cmlidXRlTmFtZSBpbiBiYXRjaEdlb21ldHJ5LmF0dHJpYnV0ZXMgKSB7XHJcblxyXG5cdFx0XHRpZiAoICEgZ2VvbWV0cnkuaGFzQXR0cmlidXRlKCBhdHRyaWJ1dGVOYW1lICkgKSB7XHJcblxyXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciggYFRIUkVFLkJhdGNoZWRNZXNoOiBBZGRlZCBnZW9tZXRyeSBtaXNzaW5nIFwiJHsgYXR0cmlidXRlTmFtZSB9XCIuIEFsbCBnZW9tZXRyaWVzIG11c3QgaGF2ZSBjb25zaXN0ZW50IGF0dHJpYnV0ZXMuYCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3Qgc3JjQXR0cmlidXRlID0gZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCBhdHRyaWJ1dGVOYW1lICk7XHJcblx0XHRcdGNvbnN0IGRzdEF0dHJpYnV0ZSA9IGJhdGNoR2VvbWV0cnkuZ2V0QXR0cmlidXRlKCBhdHRyaWJ1dGVOYW1lICk7XHJcblx0XHRcdGlmICggc3JjQXR0cmlidXRlLml0ZW1TaXplICE9PSBkc3RBdHRyaWJ1dGUuaXRlbVNpemUgfHwgc3JjQXR0cmlidXRlLm5vcm1hbGl6ZWQgIT09IGRzdEF0dHJpYnV0ZS5ub3JtYWxpemVkICkge1xyXG5cclxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5CYXRjaGVkTWVzaDogQWxsIGF0dHJpYnV0ZXMgbXVzdCBoYXZlIGEgY29uc2lzdGVudCBpdGVtU2l6ZSBhbmQgbm9ybWFsaXplZCB2YWx1ZS4nICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFZhbGlkYXRlcyB0aGUgaW5zdGFuY2UgZGVmaW5lZCBieSB0aGUgZ2l2ZW4gSUQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5zdGFuY2VJZCAtIFRoZSBpbnN0YW5jZSB0byB2YWxpZGF0ZS5cclxuXHQgKi9cclxuXHR2YWxpZGF0ZUluc3RhbmNlSWQoIGluc3RhbmNlSWQgKSB7XHJcblxyXG5cdFx0Y29uc3QgaW5zdGFuY2VJbmZvID0gdGhpcy5faW5zdGFuY2VJbmZvO1xyXG5cdFx0aWYgKCBpbnN0YW5jZUlkIDwgMCB8fCBpbnN0YW5jZUlkID49IGluc3RhbmNlSW5mby5sZW5ndGggfHwgaW5zdGFuY2VJbmZvWyBpbnN0YW5jZUlkIF0uYWN0aXZlID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdHRocm93IG5ldyBFcnJvciggYFRIUkVFLkJhdGNoZWRNZXNoOiBJbnZhbGlkIGluc3RhbmNlSWQgJHtpbnN0YW5jZUlkfS4gSW5zdGFuY2UgaXMgZWl0aGVyIG91dCBvZiByYW5nZSBvciBoYXMgYmVlbiBkZWxldGVkLmAgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVmFsaWRhdGVzIHRoZSBnZW9tZXRyeSBkZWZpbmVkIGJ5IHRoZSBnaXZlbiBJRC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBnZW9tZXRyeUlkIC0gVGhlIGdlb21ldHJ5IHRvIHZhbGlkYXRlLlxyXG5cdCAqL1xyXG5cdHZhbGlkYXRlR2VvbWV0cnlJZCggZ2VvbWV0cnlJZCApIHtcclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeUluZm9MaXN0ID0gdGhpcy5fZ2VvbWV0cnlJbmZvO1xyXG5cdFx0aWYgKCBnZW9tZXRyeUlkIDwgMCB8fCBnZW9tZXRyeUlkID49IGdlb21ldHJ5SW5mb0xpc3QubGVuZ3RoIHx8IGdlb21ldHJ5SW5mb0xpc3RbIGdlb21ldHJ5SWQgXS5hY3RpdmUgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCBgVEhSRUUuQmF0Y2hlZE1lc2g6IEludmFsaWQgZ2VvbWV0cnlJZCAke2dlb21ldHJ5SWR9LiBHZW9tZXRyeSBpcyBlaXRoZXIgb3V0IG9mIHJhbmdlIG9yIGhhcyBiZWVuIGRlbGV0ZWQuYCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUYWtlcyBhIHNvcnQgYSBmdW5jdGlvbiB0aGF0IGlzIHJ1biBiZWZvcmUgcmVuZGVyLiBUaGUgZnVuY3Rpb24gdGFrZXMgYSBsaXN0IG9mIGluc3RhbmNlcyB0b1xyXG5cdCAqIHNvcnQgYW5kIGEgY2FtZXJhLiBUaGUgb2JqZWN0cyBpbiB0aGUgbGlzdCBpbmNsdWRlIGEgXCJ6XCIgZmllbGQgdG8gcGVyZm9ybSBhIGRlcHRoLW9yZGVyZWQgc29ydCB3aXRoLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyAtIFRoZSBjdXN0b20gc29ydCBmdW5jdGlvbi5cclxuXHQgKiBAcmV0dXJuIHtCYXRjaGVkTWVzaH0gQSByZWZlcmVuY2UgdG8gdGhpcyBiYXRjaGVkIG1lc2guXHJcblx0ICovXHJcblx0c2V0Q3VzdG9tU29ydCggZnVuYyApIHtcclxuXHJcblx0XHR0aGlzLmN1c3RvbVNvcnQgPSBmdW5jO1xyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgdGhlIGJvdW5kaW5nIGJveCwgdXBkYXRpbmcge0BsaW5rIEJhdGNoZWRNZXNoI2JvdW5kaW5nQm94fS5cclxuXHQgKiBCb3VuZGluZyBib3hlcyBhcmVuJ3QgY29tcHV0ZWQgYnkgZGVmYXVsdC4gVGhleSBuZWVkIHRvIGJlIGV4cGxpY2l0bHkgY29tcHV0ZWQsXHJcblx0ICogb3RoZXJ3aXNlIHRoZXkgYXJlIGBudWxsYC5cclxuXHQgKi9cclxuXHRjb21wdXRlQm91bmRpbmdCb3goKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmJvdW5kaW5nQm94ID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveCA9IG5ldyBCb3gzKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGJvdW5kaW5nQm94ID0gdGhpcy5ib3VuZGluZ0JveDtcclxuXHRcdGNvbnN0IGluc3RhbmNlSW5mbyA9IHRoaXMuX2luc3RhbmNlSW5mbztcclxuXHJcblx0XHRib3VuZGluZ0JveC5tYWtlRW1wdHkoKTtcclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGluc3RhbmNlSW5mby5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0aWYgKCBpbnN0YW5jZUluZm9bIGkgXS5hY3RpdmUgPT09IGZhbHNlICkgY29udGludWU7XHJcblxyXG5cdFx0XHRjb25zdCBnZW9tZXRyeUlkID0gaW5zdGFuY2VJbmZvWyBpIF0uZ2VvbWV0cnlJbmRleDtcclxuXHRcdFx0dGhpcy5nZXRNYXRyaXhBdCggaSwgX21hdHJpeCApO1xyXG5cdFx0XHR0aGlzLmdldEJvdW5kaW5nQm94QXQoIGdlb21ldHJ5SWQsIF9ib3ggKS5hcHBseU1hdHJpeDQoIF9tYXRyaXggKTtcclxuXHRcdFx0Ym91bmRpbmdCb3gudW5pb24oIF9ib3ggKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgdGhlIGJvdW5kaW5nIHNwaGVyZSwgdXBkYXRpbmcge0BsaW5rIEJhdGNoZWRNZXNoI2JvdW5kaW5nU3BoZXJlfS5cclxuXHQgKiBCb3VuZGluZyBzcGhlcmVzIGFyZW4ndCBjb21wdXRlZCBieSBkZWZhdWx0LiBUaGV5IG5lZWQgdG8gYmUgZXhwbGljaXRseSBjb21wdXRlZCxcclxuXHQgKiBvdGhlcndpc2UgdGhleSBhcmUgYG51bGxgLlxyXG5cdCAqL1xyXG5cdGNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gbmV3IFNwaGVyZSgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBib3VuZGluZ1NwaGVyZSA9IHRoaXMuYm91bmRpbmdTcGhlcmU7XHJcblx0XHRjb25zdCBpbnN0YW5jZUluZm8gPSB0aGlzLl9pbnN0YW5jZUluZm87XHJcblxyXG5cdFx0Ym91bmRpbmdTcGhlcmUubWFrZUVtcHR5KCk7XHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBpbnN0YW5jZUluZm8ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGlmICggaW5zdGFuY2VJbmZvWyBpIF0uYWN0aXZlID09PSBmYWxzZSApIGNvbnRpbnVlO1xyXG5cclxuXHRcdFx0Y29uc3QgZ2VvbWV0cnlJZCA9IGluc3RhbmNlSW5mb1sgaSBdLmdlb21ldHJ5SW5kZXg7XHJcblx0XHRcdHRoaXMuZ2V0TWF0cml4QXQoIGksIF9tYXRyaXggKTtcclxuXHRcdFx0dGhpcy5nZXRCb3VuZGluZ1NwaGVyZUF0KCBnZW9tZXRyeUlkLCBfc3BoZXJlICkuYXBwbHlNYXRyaXg0KCBfbWF0cml4ICk7XHJcblx0XHRcdGJvdW5kaW5nU3BoZXJlLnVuaW9uKCBfc3BoZXJlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgYSBuZXcgaW5zdGFuY2UgdG8gdGhlIGJhdGNoIHVzaW5nIHRoZSBnZW9tZXRyeSBvZiB0aGUgZ2l2ZW4gSUQgYW5kIHJldHVybnNcclxuXHQgKiBhIG5ldyBpZCByZWZlcnJpbmcgdG8gdGhlIG5ldyBpbnN0YW5jZSB0byBiZSB1c2VkIGJ5IG90aGVyIGZ1bmN0aW9ucy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBnZW9tZXRyeUlkIC0gVGhlIElEIG9mIGEgcHJldmlvdXNseSBhZGRlZCBnZW9tZXRyeSB2aWEge0BsaW5rIEJhdGNoZWRNZXNoI2FkZEdlb21ldHJ5fS5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBpbnN0YW5jZSBJRC5cclxuXHQgKi9cclxuXHRhZGRJbnN0YW5jZSggZ2VvbWV0cnlJZCApIHtcclxuXHJcblx0XHRjb25zdCBhdENhcGFjaXR5ID0gdGhpcy5faW5zdGFuY2VJbmZvLmxlbmd0aCA+PSB0aGlzLm1heEluc3RhbmNlQ291bnQ7XHJcblxyXG5cdFx0Ly8gZW5zdXJlIHdlJ3JlIG5vdCBvdmVyIGdlb21ldHJ5XHJcblx0XHRpZiAoIGF0Q2FwYWNpdHkgJiYgdGhpcy5fYXZhaWxhYmxlSW5zdGFuY2VJZHMubGVuZ3RoID09PSAwICkge1xyXG5cclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuQmF0Y2hlZE1lc2g6IE1heGltdW0gaXRlbSBjb3VudCByZWFjaGVkLicgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgaW5zdGFuY2VJbmZvID0ge1xyXG5cdFx0XHR2aXNpYmxlOiB0cnVlLFxyXG5cdFx0XHRhY3RpdmU6IHRydWUsXHJcblx0XHRcdGdlb21ldHJ5SW5kZXg6IGdlb21ldHJ5SWQsXHJcblx0XHR9O1xyXG5cclxuXHRcdGxldCBkcmF3SWQgPSBudWxsO1xyXG5cclxuXHRcdC8vIFByaW9yaXRpemUgdXNpbmcgcHJldmlvdXNseSBmcmVlZCBpbnN0YW5jZSBpZHNcclxuXHRcdGlmICggdGhpcy5fYXZhaWxhYmxlSW5zdGFuY2VJZHMubGVuZ3RoID4gMCApIHtcclxuXHJcblx0XHRcdHRoaXMuX2F2YWlsYWJsZUluc3RhbmNlSWRzLnNvcnQoIGFzY0lkU29ydCApO1xyXG5cclxuXHRcdFx0ZHJhd0lkID0gdGhpcy5fYXZhaWxhYmxlSW5zdGFuY2VJZHMuc2hpZnQoKTtcclxuXHRcdFx0dGhpcy5faW5zdGFuY2VJbmZvWyBkcmF3SWQgXSA9IGluc3RhbmNlSW5mbztcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0ZHJhd0lkID0gdGhpcy5faW5zdGFuY2VJbmZvLmxlbmd0aDtcclxuXHRcdFx0dGhpcy5faW5zdGFuY2VJbmZvLnB1c2goIGluc3RhbmNlSW5mbyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBtYXRyaWNlc1RleHR1cmUgPSB0aGlzLl9tYXRyaWNlc1RleHR1cmU7XHJcblx0XHRfbWF0cml4LmlkZW50aXR5KCkudG9BcnJheSggbWF0cmljZXNUZXh0dXJlLmltYWdlLmRhdGEsIGRyYXdJZCAqIDE2ICk7XHJcblx0XHRtYXRyaWNlc1RleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdGNvbnN0IGNvbG9yc1RleHR1cmUgPSB0aGlzLl9jb2xvcnNUZXh0dXJlO1xyXG5cdFx0aWYgKCBjb2xvcnNUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0X3doaXRlQ29sb3IudG9BcnJheSggY29sb3JzVGV4dHVyZS5pbWFnZS5kYXRhLCBkcmF3SWQgKiA0ICk7XHJcblx0XHRcdGNvbG9yc1RleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLl92aXNpYmlsaXR5Q2hhbmdlZCA9IHRydWU7XHJcblx0XHRyZXR1cm4gZHJhd0lkO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgdGhlIGdpdmVuIGdlb21ldHJ5IHRvIHRoZSBiYXRjaCBhbmQgcmV0dXJucyB0aGUgYXNzb2NpYXRlZFxyXG5cdCAqIGdlb21ldHJ5IGlkIHJlZmVycmluZyB0byBpdCB0byBiZSB1c2VkIGluIG90aGVyIGZ1bmN0aW9ucy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyR2VvbWV0cnl9IGdlb21ldHJ5IC0gVGhlIGdlb21ldHJ5IHRvIGFkZC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3Jlc2VydmVkVmVydGV4Q291bnQ9LTFdIC0gT3B0aW9uYWwgcGFyYW1ldGVyIHNwZWNpZnlpbmcgdGhlIGFtb3VudCBvZlxyXG5cdCAqIHZlcnRleCBidWZmZXIgc3BhY2UgdG8gcmVzZXJ2ZSBmb3IgdGhlIGFkZGVkIGdlb21ldHJ5LiBUaGlzIGlzIG5lY2Vzc2FyeSBpZiBpdCBpcyBwbGFubmVkXHJcblx0ICogdG8gc2V0IGEgbmV3IGdlb21ldHJ5IGF0IHRoaXMgaW5kZXggYXQgYSBsYXRlciB0aW1lIHRoYXQgaXMgbGFyZ2VyIHRoYW4gdGhlIG9yaWdpbmFsIGdlb21ldHJ5LlxyXG5cdCAqIERlZmF1bHRzIHRvIHRoZSBsZW5ndGggb2YgdGhlIGdpdmVuIGdlb21ldHJ5IHZlcnRleCBidWZmZXIuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtyZXNlcnZlZEluZGV4Q291bnQ9LTFdIC0gT3B0aW9uYWwgcGFyYW1ldGVyIHNwZWNpZnlpbmcgdGhlIGFtb3VudCBvZiBpbmRleFxyXG5cdCAqIGJ1ZmZlciBzcGFjZSB0byByZXNlcnZlIGZvciB0aGUgYWRkZWQgZ2VvbWV0cnkuIFRoaXMgaXMgbmVjZXNzYXJ5IGlmIGl0IGlzIHBsYW5uZWQgdG8gc2V0IGFcclxuXHQgKiBuZXcgZ2VvbWV0cnkgYXQgdGhpcyBpbmRleCBhdCBhIGxhdGVyIHRpbWUgdGhhdCBpcyBsYXJnZXIgdGhhbiB0aGUgb3JpZ2luYWwgZ2VvbWV0cnkuIERlZmF1bHRzIHRvXHJcblx0ICogdGhlIGxlbmd0aCBvZiB0aGUgZ2l2ZW4gZ2VvbWV0cnkgaW5kZXggYnVmZmVyLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGdlb21ldHJ5IElELlxyXG5cdCAqL1xyXG5cdGFkZEdlb21ldHJ5KCBnZW9tZXRyeSwgcmVzZXJ2ZWRWZXJ0ZXhDb3VudCA9IC0gMSwgcmVzZXJ2ZWRJbmRleENvdW50ID0gLSAxICkge1xyXG5cclxuXHRcdHRoaXMuX2luaXRpYWxpemVHZW9tZXRyeSggZ2VvbWV0cnkgKTtcclxuXHJcblx0XHR0aGlzLl92YWxpZGF0ZUdlb21ldHJ5KCBnZW9tZXRyeSApO1xyXG5cclxuXHRcdGNvbnN0IGdlb21ldHJ5SW5mbyA9IHtcclxuXHRcdFx0Ly8gZ2VvbWV0cnkgaW5mb3JtYXRpb25cclxuXHRcdFx0dmVydGV4U3RhcnQ6IC0gMSxcclxuXHRcdFx0dmVydGV4Q291bnQ6IC0gMSxcclxuXHRcdFx0cmVzZXJ2ZWRWZXJ0ZXhDb3VudDogLSAxLFxyXG5cclxuXHRcdFx0aW5kZXhTdGFydDogLSAxLFxyXG5cdFx0XHRpbmRleENvdW50OiAtIDEsXHJcblx0XHRcdHJlc2VydmVkSW5kZXhDb3VudDogLSAxLFxyXG5cclxuXHRcdFx0Ly8gZHJhdyByYW5nZSBpbmZvcm1hdGlvblxyXG5cdFx0XHRzdGFydDogLSAxLFxyXG5cdFx0XHRjb3VudDogLSAxLFxyXG5cclxuXHRcdFx0Ly8gc3RhdGVcclxuXHRcdFx0Ym91bmRpbmdCb3g6IG51bGwsXHJcblx0XHRcdGJvdW5kaW5nU3BoZXJlOiBudWxsLFxyXG5cdFx0XHRhY3RpdmU6IHRydWUsXHJcblx0XHR9O1xyXG5cclxuXHRcdGNvbnN0IGdlb21ldHJ5SW5mb0xpc3QgPSB0aGlzLl9nZW9tZXRyeUluZm87XHJcblx0XHRnZW9tZXRyeUluZm8udmVydGV4U3RhcnQgPSB0aGlzLl9uZXh0VmVydGV4U3RhcnQ7XHJcblx0XHRnZW9tZXRyeUluZm8ucmVzZXJ2ZWRWZXJ0ZXhDb3VudCA9IHJlc2VydmVkVmVydGV4Q291bnQgPT09IC0gMSA/IGdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJyApLmNvdW50IDogcmVzZXJ2ZWRWZXJ0ZXhDb3VudDtcclxuXHJcblx0XHRjb25zdCBpbmRleCA9IGdlb21ldHJ5LmdldEluZGV4KCk7XHJcblx0XHRjb25zdCBoYXNJbmRleCA9IGluZGV4ICE9PSBudWxsO1xyXG5cdFx0aWYgKCBoYXNJbmRleCApIHtcclxuXHJcblx0XHRcdGdlb21ldHJ5SW5mby5pbmRleFN0YXJ0ID0gdGhpcy5fbmV4dEluZGV4U3RhcnQ7XHJcblx0XHRcdGdlb21ldHJ5SW5mby5yZXNlcnZlZEluZGV4Q291bnQgPSByZXNlcnZlZEluZGV4Q291bnQgPT09IC0gMSA/IGluZGV4LmNvdW50IDogcmVzZXJ2ZWRJbmRleENvdW50O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoXHJcblx0XHRcdGdlb21ldHJ5SW5mby5pbmRleFN0YXJ0ICE9PSAtIDEgJiZcclxuXHRcdFx0Z2VvbWV0cnlJbmZvLmluZGV4U3RhcnQgKyBnZW9tZXRyeUluZm8ucmVzZXJ2ZWRJbmRleENvdW50ID4gdGhpcy5fbWF4SW5kZXhDb3VudCB8fFxyXG5cdFx0XHRnZW9tZXRyeUluZm8udmVydGV4U3RhcnQgKyBnZW9tZXRyeUluZm8ucmVzZXJ2ZWRWZXJ0ZXhDb3VudCA+IHRoaXMuX21heFZlcnRleENvdW50XHJcblx0XHQpIHtcclxuXHJcblx0XHRcdHRocm93IG5ldyBFcnJvciggJ1RIUkVFLkJhdGNoZWRNZXNoOiBSZXNlcnZlZCBzcGFjZSByZXF1ZXN0IGV4Y2VlZHMgdGhlIG1heGltdW0gYnVmZmVyIHNpemUuJyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyB1cGRhdGUgaWRcclxuXHRcdGxldCBnZW9tZXRyeUlkO1xyXG5cdFx0aWYgKCB0aGlzLl9hdmFpbGFibGVHZW9tZXRyeUlkcy5sZW5ndGggPiAwICkge1xyXG5cclxuXHRcdFx0dGhpcy5fYXZhaWxhYmxlR2VvbWV0cnlJZHMuc29ydCggYXNjSWRTb3J0ICk7XHJcblxyXG5cdFx0XHRnZW9tZXRyeUlkID0gdGhpcy5fYXZhaWxhYmxlR2VvbWV0cnlJZHMuc2hpZnQoKTtcclxuXHRcdFx0Z2VvbWV0cnlJbmZvTGlzdFsgZ2VvbWV0cnlJZCBdID0gZ2VvbWV0cnlJbmZvO1xyXG5cclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Z2VvbWV0cnlJZCA9IHRoaXMuX2dlb21ldHJ5Q291bnQ7XHJcblx0XHRcdHRoaXMuX2dlb21ldHJ5Q291bnQgKys7XHJcblx0XHRcdGdlb21ldHJ5SW5mb0xpc3QucHVzaCggZ2VvbWV0cnlJbmZvICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIHVwZGF0ZSB0aGUgZ2VvbWV0cnlcclxuXHRcdHRoaXMuc2V0R2VvbWV0cnlBdCggZ2VvbWV0cnlJZCwgZ2VvbWV0cnkgKTtcclxuXHJcblx0XHQvLyBpbmNyZW1lbnQgdGhlIG5leHQgZ2VvbWV0cnkgcG9zaXRpb25cclxuXHRcdHRoaXMuX25leHRJbmRleFN0YXJ0ID0gZ2VvbWV0cnlJbmZvLmluZGV4U3RhcnQgKyBnZW9tZXRyeUluZm8ucmVzZXJ2ZWRJbmRleENvdW50O1xyXG5cdFx0dGhpcy5fbmV4dFZlcnRleFN0YXJ0ID0gZ2VvbWV0cnlJbmZvLnZlcnRleFN0YXJ0ICsgZ2VvbWV0cnlJbmZvLnJlc2VydmVkVmVydGV4Q291bnQ7XHJcblxyXG5cdFx0cmV0dXJuIGdlb21ldHJ5SWQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVwbGFjZXMgdGhlIGdlb21ldHJ5IGF0IHRoZSBnaXZlbiBJRCB3aXRoIHRoZSBwcm92aWRlZCBnZW9tZXRyeS4gVGhyb3dzIGFuIGVycm9yIGlmIHRoZXJlXHJcblx0ICogaXMgbm90IGVub3VnaCBzcGFjZSByZXNlcnZlZCBmb3IgZ2VvbWV0cnkuIENhbGxpbmcgdGhpcyB3aWxsIGNoYW5nZSBhbGwgaW5zdGFuY2VzIHRoYXQgYXJlXHJcblx0ICogcmVuZGVyaW5nIHRoYXQgZ2VvbWV0cnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZ2VvbWV0cnlJZCAtIFRoZSBJRCBvZiB0aGUgZ2VvbWV0cnkgdGhhdCBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCB0aGUgZ2l2ZW4gZ2VvbWV0cnkuXHJcblx0ICogQHBhcmFtIHtCdWZmZXJHZW9tZXRyeX0gZ2VvbWV0cnkgLSBUaGUgbmV3IGdlb21ldHJ5LlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGdlb21ldHJ5IElELlxyXG5cdCAqL1xyXG5cdHNldEdlb21ldHJ5QXQoIGdlb21ldHJ5SWQsIGdlb21ldHJ5ICkge1xyXG5cclxuXHRcdGlmICggZ2VvbWV0cnlJZCA+PSB0aGlzLl9nZW9tZXRyeUNvdW50ICkge1xyXG5cclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuQmF0Y2hlZE1lc2g6IE1heGltdW0gZ2VvbWV0cnkgY291bnQgcmVhY2hlZC4nICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuX3ZhbGlkYXRlR2VvbWV0cnkoIGdlb21ldHJ5ICk7XHJcblxyXG5cdFx0Y29uc3QgYmF0Y2hHZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XHJcblx0XHRjb25zdCBoYXNJbmRleCA9IGJhdGNoR2VvbWV0cnkuZ2V0SW5kZXgoKSAhPT0gbnVsbDtcclxuXHRcdGNvbnN0IGRzdEluZGV4ID0gYmF0Y2hHZW9tZXRyeS5nZXRJbmRleCgpO1xyXG5cdFx0Y29uc3Qgc3JjSW5kZXggPSBnZW9tZXRyeS5nZXRJbmRleCgpO1xyXG5cdFx0Y29uc3QgZ2VvbWV0cnlJbmZvID0gdGhpcy5fZ2VvbWV0cnlJbmZvWyBnZW9tZXRyeUlkIF07XHJcblx0XHRpZiAoXHJcblx0XHRcdGhhc0luZGV4ICYmXHJcblx0XHRcdHNyY0luZGV4LmNvdW50ID4gZ2VvbWV0cnlJbmZvLnJlc2VydmVkSW5kZXhDb3VudCB8fFxyXG5cdFx0XHRnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50ID4gZ2VvbWV0cnlJbmZvLnJlc2VydmVkVmVydGV4Q291bnRcclxuXHRcdCkge1xyXG5cclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuQmF0Y2hlZE1lc2g6IFJlc2VydmVkIHNwYWNlIG5vdCBsYXJnZSBlbm91Z2ggZm9yIHByb3ZpZGVkIGdlb21ldHJ5LicgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gY29weSBnZW9tZXRyeSBidWZmZXIgZGF0YSBvdmVyXHJcblx0XHRjb25zdCB2ZXJ0ZXhTdGFydCA9IGdlb21ldHJ5SW5mby52ZXJ0ZXhTdGFydDtcclxuXHRcdGNvbnN0IHJlc2VydmVkVmVydGV4Q291bnQgPSBnZW9tZXRyeUluZm8ucmVzZXJ2ZWRWZXJ0ZXhDb3VudDtcclxuXHRcdGdlb21ldHJ5SW5mby52ZXJ0ZXhDb3VudCA9IGdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJyApLmNvdW50O1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IGF0dHJpYnV0ZU5hbWUgaW4gYmF0Y2hHZW9tZXRyeS5hdHRyaWJ1dGVzICkge1xyXG5cclxuXHRcdFx0Ly8gY29weSBhdHRyaWJ1dGUgZGF0YVxyXG5cdFx0XHRjb25zdCBzcmNBdHRyaWJ1dGUgPSBnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoIGF0dHJpYnV0ZU5hbWUgKTtcclxuXHRcdFx0Y29uc3QgZHN0QXR0cmlidXRlID0gYmF0Y2hHZW9tZXRyeS5nZXRBdHRyaWJ1dGUoIGF0dHJpYnV0ZU5hbWUgKTtcclxuXHRcdFx0Y29weUF0dHJpYnV0ZURhdGEoIHNyY0F0dHJpYnV0ZSwgZHN0QXR0cmlidXRlLCB2ZXJ0ZXhTdGFydCApO1xyXG5cclxuXHRcdFx0Ly8gZmlsbCB0aGUgcmVzdCBpbiB3aXRoIHplcm9lc1xyXG5cdFx0XHRjb25zdCBpdGVtU2l6ZSA9IHNyY0F0dHJpYnV0ZS5pdGVtU2l6ZTtcclxuXHRcdFx0Zm9yICggbGV0IGkgPSBzcmNBdHRyaWJ1dGUuY291bnQsIGwgPSByZXNlcnZlZFZlcnRleENvdW50OyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgaW5kZXggPSB2ZXJ0ZXhTdGFydCArIGk7XHJcblx0XHRcdFx0Zm9yICggbGV0IGMgPSAwOyBjIDwgaXRlbVNpemU7IGMgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0ZHN0QXR0cmlidXRlLnNldENvbXBvbmVudCggaW5kZXgsIGMsIDAgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZHN0QXR0cmlidXRlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHRcdFx0ZHN0QXR0cmlidXRlLmFkZFVwZGF0ZVJhbmdlKCB2ZXJ0ZXhTdGFydCAqIGl0ZW1TaXplLCByZXNlcnZlZFZlcnRleENvdW50ICogaXRlbVNpemUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gY29weSBpbmRleFxyXG5cdFx0aWYgKCBoYXNJbmRleCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGluZGV4U3RhcnQgPSBnZW9tZXRyeUluZm8uaW5kZXhTdGFydDtcclxuXHRcdFx0Y29uc3QgcmVzZXJ2ZWRJbmRleENvdW50ID0gZ2VvbWV0cnlJbmZvLnJlc2VydmVkSW5kZXhDb3VudDtcclxuXHRcdFx0Z2VvbWV0cnlJbmZvLmluZGV4Q291bnQgPSBnZW9tZXRyeS5nZXRJbmRleCgpLmNvdW50O1xyXG5cclxuXHRcdFx0Ly8gY29weSBpbmRleCBkYXRhIG92ZXJcclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgc3JjSW5kZXguY291bnQ7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGRzdEluZGV4LnNldFgoIGluZGV4U3RhcnQgKyBpLCB2ZXJ0ZXhTdGFydCArIHNyY0luZGV4LmdldFgoIGkgKSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gZmlsbCB0aGUgcmVzdCBpbiB3aXRoIHplcm9lc1xyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IHNyY0luZGV4LmNvdW50LCBsID0gcmVzZXJ2ZWRJbmRleENvdW50OyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0ZHN0SW5kZXguc2V0WCggaW5kZXhTdGFydCArIGksIHZlcnRleFN0YXJ0ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRkc3RJbmRleC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblx0XHRcdGRzdEluZGV4LmFkZFVwZGF0ZVJhbmdlKCBpbmRleFN0YXJ0LCBnZW9tZXRyeUluZm8ucmVzZXJ2ZWRJbmRleENvdW50ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIHVwZGF0ZSB0aGUgZHJhdyByYW5nZVxyXG5cdFx0Z2VvbWV0cnlJbmZvLnN0YXJ0ID0gaGFzSW5kZXggPyBnZW9tZXRyeUluZm8uaW5kZXhTdGFydCA6IGdlb21ldHJ5SW5mby52ZXJ0ZXhTdGFydDtcclxuXHRcdGdlb21ldHJ5SW5mby5jb3VudCA9IGhhc0luZGV4ID8gZ2VvbWV0cnlJbmZvLmluZGV4Q291bnQgOiBnZW9tZXRyeUluZm8udmVydGV4Q291bnQ7XHJcblxyXG5cdFx0Ly8gc3RvcmUgdGhlIGJvdW5kaW5nIGJveGVzXHJcblx0XHRnZW9tZXRyeUluZm8uYm91bmRpbmdCb3ggPSBudWxsO1xyXG5cdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ0JveCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGdlb21ldHJ5SW5mby5ib3VuZGluZ0JveCA9IGdlb21ldHJ5LmJvdW5kaW5nQm94LmNsb25lKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGdlb21ldHJ5SW5mby5ib3VuZGluZ1NwaGVyZSA9IG51bGw7XHJcblx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0Z2VvbWV0cnlJbmZvLmJvdW5kaW5nU3BoZXJlID0gZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUuY2xvbmUoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5fdmlzaWJpbGl0eUNoYW5nZWQgPSB0cnVlO1xyXG5cdFx0cmV0dXJuIGdlb21ldHJ5SWQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVsZXRlcyB0aGUgZ2VvbWV0cnkgZGVmaW5lZCBieSB0aGUgZ2l2ZW4gSUQgZnJvbSB0aGlzIGJhdGNoLiBBbnkgaW5zdGFuY2VzIHJlZmVyZW5jaW5nXHJcblx0ICogdGhpcyBnZW9tZXRyeSB3aWxsIGFsc28gYmUgcmVtb3ZlZCBhcyBhIHNpZGUgZWZmZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGdlb21ldHJ5SWQgLSBUaGUgSUQgb2YgdGhlIGdlb21ldHJ5IHRvIHJlbW92ZSBmcm9tIHRoZSBiYXRjaC5cclxuXHQgKiBAcmV0dXJuIHtCYXRjaGVkTWVzaH0gQSByZWZlcmVuY2UgdG8gdGhpcyBiYXRjaGVkIG1lc2guXHJcblx0ICovXHJcblx0ZGVsZXRlR2VvbWV0cnkoIGdlb21ldHJ5SWQgKSB7XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnlJbmZvTGlzdCA9IHRoaXMuX2dlb21ldHJ5SW5mbztcclxuXHRcdGlmICggZ2VvbWV0cnlJZCA+PSBnZW9tZXRyeUluZm9MaXN0Lmxlbmd0aCB8fCBnZW9tZXRyeUluZm9MaXN0WyBnZW9tZXRyeUlkIF0uYWN0aXZlID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBkZWxldGUgYW55IGluc3RhbmNlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBnZW9tZXRyeVxyXG5cdFx0Y29uc3QgaW5zdGFuY2VJbmZvID0gdGhpcy5faW5zdGFuY2VJbmZvO1xyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gaW5zdGFuY2VJbmZvLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGluc3RhbmNlSW5mb1sgaSBdLmFjdGl2ZSAmJiBpbnN0YW5jZUluZm9bIGkgXS5nZW9tZXRyeUluZGV4ID09PSBnZW9tZXRyeUlkICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLmRlbGV0ZUluc3RhbmNlKCBpICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGdlb21ldHJ5SW5mb0xpc3RbIGdlb21ldHJ5SWQgXS5hY3RpdmUgPSBmYWxzZTtcclxuXHRcdHRoaXMuX2F2YWlsYWJsZUdlb21ldHJ5SWRzLnB1c2goIGdlb21ldHJ5SWQgKTtcclxuXHRcdHRoaXMuX3Zpc2liaWxpdHlDaGFuZ2VkID0gdHJ1ZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWxldGVzIGFuIGV4aXN0aW5nIGluc3RhbmNlIGZyb20gdGhlIGJhdGNoIHVzaW5nIHRoZSBnaXZlbiBJRC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbnN0YW5jZUlkIC0gVGhlIElEIG9mIHRoZSBpbnN0YW5jZSB0byByZW1vdmUgZnJvbSB0aGUgYmF0Y2guXHJcblx0ICogQHJldHVybiB7QmF0Y2hlZE1lc2h9IEEgcmVmZXJlbmNlIHRvIHRoaXMgYmF0Y2hlZCBtZXNoLlxyXG5cdCAqL1xyXG5cdGRlbGV0ZUluc3RhbmNlKCBpbnN0YW5jZUlkICkge1xyXG5cclxuXHRcdHRoaXMudmFsaWRhdGVJbnN0YW5jZUlkKCBpbnN0YW5jZUlkICk7XHJcblxyXG5cdFx0dGhpcy5faW5zdGFuY2VJbmZvWyBpbnN0YW5jZUlkIF0uYWN0aXZlID0gZmFsc2U7XHJcblx0XHR0aGlzLl9hdmFpbGFibGVJbnN0YW5jZUlkcy5wdXNoKCBpbnN0YW5jZUlkICk7XHJcblx0XHR0aGlzLl92aXNpYmlsaXR5Q2hhbmdlZCA9IHRydWU7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVwYWNrcyB0aGUgc3ViIGdlb21ldHJpZXMgaW4gW25hbWVdIHRvIHJlbW92ZSBhbnkgdW51c2VkIHNwYWNlIHJlbWFpbmluZyBmcm9tXHJcblx0ICogcHJldmlvdXNseSBkZWxldGVkIGdlb21ldHJ5LCBmcmVlaW5nIHVwIHNwYWNlIHRvIGFkZCBuZXcgZ2VvbWV0cnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5zdGFuY2VJZCAtIFRoZSBJRCBvZiB0aGUgaW5zdGFuY2UgdG8gcmVtb3ZlIGZyb20gdGhlIGJhdGNoLlxyXG5cdCAqIEByZXR1cm4ge0JhdGNoZWRNZXNofSBBIHJlZmVyZW5jZSB0byB0aGlzIGJhdGNoZWQgbWVzaC5cclxuXHQgKi9cclxuXHRvcHRpbWl6ZSgpIHtcclxuXHJcblx0XHQvLyB0cmFjayB0aGUgbmV4dCBpbmRpY2VzIHRvIGNvcHkgZGF0YSB0b1xyXG5cdFx0bGV0IG5leHRWZXJ0ZXhTdGFydCA9IDA7XHJcblx0XHRsZXQgbmV4dEluZGV4U3RhcnQgPSAwO1xyXG5cclxuXHRcdC8vIEl0ZXJhdGUgb3ZlciBhbGwgZ2VvbWV0cnkgcmFuZ2VzIGluIG9yZGVyIHNvcnRlZCBmcm9tIGVhcmxpZXN0IGluIHRoZSBnZW9tZXRyeSBidWZmZXIgdG8gbGF0ZXN0XHJcblx0XHQvLyBpbiB0aGUgZ2VvbWV0cnkgYnVmZmVyLiBCZWNhdXNlIGRyYXcgcmFuZ2Ugb2JqZWN0cyBjYW4gYmUgcmV1c2VkIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSBvZiB0aGVpciBvcmRlci5cclxuXHRcdGNvbnN0IGdlb21ldHJ5SW5mb0xpc3QgPSB0aGlzLl9nZW9tZXRyeUluZm87XHJcblx0XHRjb25zdCBpbmRpY2VzID0gZ2VvbWV0cnlJbmZvTGlzdFxyXG5cdFx0XHQubWFwKCAoIGUsIGkgKSA9PiBpIClcclxuXHRcdFx0LnNvcnQoICggYSwgYiApID0+IHtcclxuXHJcblx0XHRcdFx0cmV0dXJuIGdlb21ldHJ5SW5mb0xpc3RbIGEgXS52ZXJ0ZXhTdGFydCAtIGdlb21ldHJ5SW5mb0xpc3RbIGIgXS52ZXJ0ZXhTdGFydDtcclxuXHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBnZW9tZXRyeUluZm9MaXN0Lmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHQvLyBpZiBhIGdlb21ldHJ5IHJhbmdlIGlzIGluYWN0aXZlIHRoZW4gZG9uJ3QgY29weSBhbnl0aGluZ1xyXG5cdFx0XHRjb25zdCBpbmRleCA9IGluZGljZXNbIGkgXTtcclxuXHRcdFx0Y29uc3QgZ2VvbWV0cnlJbmZvID0gZ2VvbWV0cnlJbmZvTGlzdFsgaW5kZXggXTtcclxuXHRcdFx0aWYgKCBnZW9tZXRyeUluZm8uYWN0aXZlID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdFx0Y29udGludWU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBpZiBhIGdlb21ldHJ5IGNvbnRhaW5zIGFuIGluZGV4IGJ1ZmZlciB0aGVuIHNoaWZ0IGl0LCBhcyB3ZWxsXHJcblx0XHRcdGlmICggZ2VvbWV0cnkuaW5kZXggIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggZ2VvbWV0cnlJbmZvLmluZGV4U3RhcnQgIT09IG5leHRJbmRleFN0YXJ0ICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHsgaW5kZXhTdGFydCwgdmVydGV4U3RhcnQsIHJlc2VydmVkSW5kZXhDb3VudCB9ID0gZ2VvbWV0cnlJbmZvO1xyXG5cdFx0XHRcdFx0Y29uc3QgaW5kZXggPSBnZW9tZXRyeS5pbmRleDtcclxuXHRcdFx0XHRcdGNvbnN0IGFycmF5ID0gaW5kZXguYXJyYXk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gc2hpZnQgdGhlIGluZGV4IHBvaW50ZXJzIGJhc2VkIG9uIGhvdyB0aGUgdmVydGV4IGRhdGEgd2lsbCBzaGlmdFxyXG5cdFx0XHRcdFx0Ly8gYWRqdXN0aW5nIHRoZSBpbmRleCBtdXN0IGhhcHBlbiBmaXJzdCBzbyB0aGUgb3JpZ2luYWwgdmVydGV4IHN0YXJ0IHZhbHVlIGlzIGF2YWlsYWJsZVxyXG5cdFx0XHRcdFx0Y29uc3QgZWxlbWVudERlbHRhID0gbmV4dFZlcnRleFN0YXJ0IC0gdmVydGV4U3RhcnQ7XHJcblx0XHRcdFx0XHRmb3IgKCBsZXQgaiA9IGluZGV4U3RhcnQ7IGogPCBpbmRleFN0YXJ0ICsgcmVzZXJ2ZWRJbmRleENvdW50OyBqICsrICkge1xyXG5cclxuXHRcdFx0XHRcdFx0YXJyYXlbIGogXSA9IGFycmF5WyBqIF0gKyBlbGVtZW50RGVsdGE7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGluZGV4LmFycmF5LmNvcHlXaXRoaW4oIG5leHRJbmRleFN0YXJ0LCBpbmRleFN0YXJ0LCBpbmRleFN0YXJ0ICsgcmVzZXJ2ZWRJbmRleENvdW50ICk7XHJcblx0XHRcdFx0XHRpbmRleC5hZGRVcGRhdGVSYW5nZSggbmV4dEluZGV4U3RhcnQsIHJlc2VydmVkSW5kZXhDb3VudCApO1xyXG5cclxuXHRcdFx0XHRcdGdlb21ldHJ5SW5mby5pbmRleFN0YXJ0ID0gbmV4dEluZGV4U3RhcnQ7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0bmV4dEluZGV4U3RhcnQgKz0gZ2VvbWV0cnlJbmZvLnJlc2VydmVkSW5kZXhDb3VudDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIGlmIGEgZ2VvbWV0cnkgbmVlZHMgdG8gYmUgbW92ZWQgdGhlbiBjb3B5IGF0dHJpYnV0ZSBkYXRhIHRvIG92ZXJ3cml0ZSB1bnVzZWQgc3BhY2VcclxuXHRcdFx0aWYgKCBnZW9tZXRyeUluZm8udmVydGV4U3RhcnQgIT09IG5leHRWZXJ0ZXhTdGFydCApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgeyB2ZXJ0ZXhTdGFydCwgcmVzZXJ2ZWRWZXJ0ZXhDb3VudCB9ID0gZ2VvbWV0cnlJbmZvO1xyXG5cdFx0XHRcdGNvbnN0IGF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzO1xyXG5cdFx0XHRcdGZvciAoIGNvbnN0IGtleSBpbiBhdHRyaWJ1dGVzICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbIGtleSBdO1xyXG5cdFx0XHRcdFx0Y29uc3QgeyBhcnJheSwgaXRlbVNpemUgfSA9IGF0dHJpYnV0ZTtcclxuXHRcdFx0XHRcdGFycmF5LmNvcHlXaXRoaW4oIG5leHRWZXJ0ZXhTdGFydCAqIGl0ZW1TaXplLCB2ZXJ0ZXhTdGFydCAqIGl0ZW1TaXplLCAoIHZlcnRleFN0YXJ0ICsgcmVzZXJ2ZWRWZXJ0ZXhDb3VudCApICogaXRlbVNpemUgKTtcclxuXHRcdFx0XHRcdGF0dHJpYnV0ZS5hZGRVcGRhdGVSYW5nZSggbmV4dFZlcnRleFN0YXJ0ICogaXRlbVNpemUsIHJlc2VydmVkVmVydGV4Q291bnQgKiBpdGVtU2l6ZSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGdlb21ldHJ5SW5mby52ZXJ0ZXhTdGFydCA9IG5leHRWZXJ0ZXhTdGFydDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdG5leHRWZXJ0ZXhTdGFydCArPSBnZW9tZXRyeUluZm8ucmVzZXJ2ZWRWZXJ0ZXhDb3VudDtcclxuXHRcdFx0Z2VvbWV0cnlJbmZvLnN0YXJ0ID0gZ2VvbWV0cnkuaW5kZXggPyBnZW9tZXRyeUluZm8uaW5kZXhTdGFydCA6IGdlb21ldHJ5SW5mby52ZXJ0ZXhTdGFydDtcclxuXHJcblx0XHRcdC8vIHN0ZXAgdGhlIG5leHQgZ2VvbWV0cnkgcG9pbnRzIHRvIHRoZSBzaGlmdGVkIHBvc2l0aW9uXHJcblx0XHRcdHRoaXMuX25leHRJbmRleFN0YXJ0ID0gZ2VvbWV0cnkuaW5kZXggPyBnZW9tZXRyeUluZm8uaW5kZXhTdGFydCArIGdlb21ldHJ5SW5mby5yZXNlcnZlZEluZGV4Q291bnQgOiAwO1xyXG5cdFx0XHR0aGlzLl9uZXh0VmVydGV4U3RhcnQgPSBnZW9tZXRyeUluZm8udmVydGV4U3RhcnQgKyBnZW9tZXRyeUluZm8ucmVzZXJ2ZWRWZXJ0ZXhDb3VudDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgYm91bmRpbmcgYm94IGZvciB0aGUgZ2l2ZW4gZ2VvbWV0cnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZ2VvbWV0cnlJZCAtIFRoZSBJRCBvZiB0aGUgZ2VvbWV0cnkgdG8gcmV0dXJuIHRoZSBib3VuZGluZyBib3ggZm9yLlxyXG5cdCAqIEBwYXJhbSB7Qm94M30gdGFyZ2V0IC0gVGhlIHRhcmdldCBvYmplY3QgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBtZXRob2QncyByZXN1bHQuXHJcblx0ICogQHJldHVybiB7Qm94M3xudWxsfSBUaGUgZ2VvbWV0cnkncyBib3VuZGluZyBib3guIFJldHVybnMgYG51bGxgIGlmIG5vIGdlb21ldHJ5IGhhcyBiZWVuIGZvdW5kIGZvciB0aGUgZ2l2ZW4gSUQuXHJcblx0ICovXHJcblx0Z2V0Qm91bmRpbmdCb3hBdCggZ2VvbWV0cnlJZCwgdGFyZ2V0ICkge1xyXG5cclxuXHRcdGlmICggZ2VvbWV0cnlJZCA+PSB0aGlzLl9nZW9tZXRyeUNvdW50ICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGNvbXB1dGUgYm91bmRpbmcgYm94XHJcblx0XHRjb25zdCBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XHJcblx0XHRjb25zdCBnZW9tZXRyeUluZm8gPSB0aGlzLl9nZW9tZXRyeUluZm9bIGdlb21ldHJ5SWQgXTtcclxuXHRcdGlmICggZ2VvbWV0cnlJbmZvLmJvdW5kaW5nQm94ID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYm94ID0gbmV3IEJveDMoKTtcclxuXHRcdFx0Y29uc3QgaW5kZXggPSBnZW9tZXRyeS5pbmRleDtcclxuXHRcdFx0Y29uc3QgcG9zaXRpb24gPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IGdlb21ldHJ5SW5mby5zdGFydCwgbCA9IGdlb21ldHJ5SW5mby5zdGFydCArIGdlb21ldHJ5SW5mby5jb3VudDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGxldCBpdiA9IGk7XHJcblx0XHRcdFx0aWYgKCBpbmRleCApIHtcclxuXHJcblx0XHRcdFx0XHRpdiA9IGluZGV4LmdldFgoIGl2ICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Ym94LmV4cGFuZEJ5UG9pbnQoIF92ZWN0b3IuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIGl2ICkgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGdlb21ldHJ5SW5mby5ib3VuZGluZ0JveCA9IGJveDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGFyZ2V0LmNvcHkoIGdlb21ldHJ5SW5mby5ib3VuZGluZ0JveCApO1xyXG5cdFx0cmV0dXJuIHRhcmdldDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBib3VuZGluZyBzcGhlcmUgZm9yIHRoZSBnaXZlbiBnZW9tZXRyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBnZW9tZXRyeUlkIC0gVGhlIElEIG9mIHRoZSBnZW9tZXRyeSB0byByZXR1cm4gdGhlIGJvdW5kaW5nIHNwaGVyZSBmb3IuXHJcblx0ICogQHBhcmFtIHtTcGhlcmV9IHRhcmdldCAtIFRoZSB0YXJnZXQgb2JqZWN0IHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbWV0aG9kJ3MgcmVzdWx0LlxyXG5cdCAqIEByZXR1cm4ge1NwaGVyZXxudWxsfSBUaGUgZ2VvbWV0cnkncyBib3VuZGluZyBzcGhlcmUuIFJldHVybnMgYG51bGxgIGlmIG5vIGdlb21ldHJ5IGhhcyBiZWVuIGZvdW5kIGZvciB0aGUgZ2l2ZW4gSUQuXHJcblx0ICovXHJcblx0Z2V0Qm91bmRpbmdTcGhlcmVBdCggZ2VvbWV0cnlJZCwgdGFyZ2V0ICkge1xyXG5cclxuXHRcdGlmICggZ2VvbWV0cnlJZCA+PSB0aGlzLl9nZW9tZXRyeUNvdW50ICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGNvbXB1dGUgYm91bmRpbmcgc3BoZXJlXHJcblx0XHRjb25zdCBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XHJcblx0XHRjb25zdCBnZW9tZXRyeUluZm8gPSB0aGlzLl9nZW9tZXRyeUluZm9bIGdlb21ldHJ5SWQgXTtcclxuXHRcdGlmICggZ2VvbWV0cnlJbmZvLmJvdW5kaW5nU3BoZXJlID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgc3BoZXJlID0gbmV3IFNwaGVyZSgpO1xyXG5cdFx0XHR0aGlzLmdldEJvdW5kaW5nQm94QXQoIGdlb21ldHJ5SWQsIF9ib3ggKTtcclxuXHRcdFx0X2JveC5nZXRDZW50ZXIoIHNwaGVyZS5jZW50ZXIgKTtcclxuXHJcblx0XHRcdGNvbnN0IGluZGV4ID0gZ2VvbWV0cnkuaW5kZXg7XHJcblx0XHRcdGNvbnN0IHBvc2l0aW9uID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjtcclxuXHJcblx0XHRcdGxldCBtYXhSYWRpdXNTcSA9IDA7XHJcblx0XHRcdGZvciAoIGxldCBpID0gZ2VvbWV0cnlJbmZvLnN0YXJ0LCBsID0gZ2VvbWV0cnlJbmZvLnN0YXJ0ICsgZ2VvbWV0cnlJbmZvLmNvdW50OyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0bGV0IGl2ID0gaTtcclxuXHRcdFx0XHRpZiAoIGluZGV4ICkge1xyXG5cclxuXHRcdFx0XHRcdGl2ID0gaW5kZXguZ2V0WCggaXYgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRfdmVjdG9yLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBpdiApO1xyXG5cdFx0XHRcdG1heFJhZGl1c1NxID0gTWF0aC5tYXgoIG1heFJhZGl1c1NxLCBzcGhlcmUuY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKCBfdmVjdG9yICkgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHNwaGVyZS5yYWRpdXMgPSBNYXRoLnNxcnQoIG1heFJhZGl1c1NxICk7XHJcblx0XHRcdGdlb21ldHJ5SW5mby5ib3VuZGluZ1NwaGVyZSA9IHNwaGVyZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGFyZ2V0LmNvcHkoIGdlb21ldHJ5SW5mby5ib3VuZGluZ1NwaGVyZSApO1xyXG5cdFx0cmV0dXJuIHRhcmdldDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBnaXZlbiBsb2NhbCB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggdG8gdGhlIGRlZmluZWQgaW5zdGFuY2UuXHJcblx0ICogTmVnYXRpdmVseSBzY2FsZWQgbWF0cmljZXMgYXJlIG5vdCBzdXBwb3J0ZWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5zdGFuY2VJZCAtIFRoZSBJRCBvZiBhbiBpbnN0YW5jZSB0byBzZXQgdGhlIG1hdHJpeCBvZi5cclxuXHQgKiBAcGFyYW0ge01hdHJpeDR9IG1hdHJpeCAtIEEgNHg0IG1hdHJpeCByZXByZXNlbnRpbmcgdGhlIGxvY2FsIHRyYW5zZm9ybWF0aW9uIG9mIGEgc2luZ2xlIGluc3RhbmNlLlxyXG5cdCAqIEByZXR1cm4ge0JhdGNoZWRNZXNofSBBIHJlZmVyZW5jZSB0byB0aGlzIGJhdGNoZWQgbWVzaC5cclxuXHQgKi9cclxuXHRzZXRNYXRyaXhBdCggaW5zdGFuY2VJZCwgbWF0cml4ICkge1xyXG5cclxuXHRcdHRoaXMudmFsaWRhdGVJbnN0YW5jZUlkKCBpbnN0YW5jZUlkICk7XHJcblxyXG5cdFx0Y29uc3QgbWF0cmljZXNUZXh0dXJlID0gdGhpcy5fbWF0cmljZXNUZXh0dXJlO1xyXG5cdFx0Y29uc3QgbWF0cmljZXNBcnJheSA9IHRoaXMuX21hdHJpY2VzVGV4dHVyZS5pbWFnZS5kYXRhO1xyXG5cdFx0bWF0cml4LnRvQXJyYXkoIG1hdHJpY2VzQXJyYXksIGluc3RhbmNlSWQgKiAxNiApO1xyXG5cdFx0bWF0cmljZXNUZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBsb2NhbCB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggb2YgdGhlIGRlZmluZWQgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5zdGFuY2VJZCAtIFRoZSBJRCBvZiBhbiBpbnN0YW5jZSB0byBnZXQgdGhlIG1hdHJpeCBvZi5cclxuXHQgKiBAcGFyYW0ge01hdHJpeDR9IG1hdHJpeCAtIFRoZSB0YXJnZXQgb2JqZWN0IHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbWV0aG9kJ3MgcmVzdWx0LlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDR9IFRoZSBpbnN0YW5jZSdzIGxvY2FsIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC5cclxuXHQgKi9cclxuXHRnZXRNYXRyaXhBdCggaW5zdGFuY2VJZCwgbWF0cml4ICkge1xyXG5cclxuXHRcdHRoaXMudmFsaWRhdGVJbnN0YW5jZUlkKCBpbnN0YW5jZUlkICk7XHJcblx0XHRyZXR1cm4gbWF0cml4LmZyb21BcnJheSggdGhpcy5fbWF0cmljZXNUZXh0dXJlLmltYWdlLmRhdGEsIGluc3RhbmNlSWQgKiAxNiApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGdpdmVuIGNvbG9yIHRvIHRoZSBkZWZpbmVkIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluc3RhbmNlSWQgLSBUaGUgSUQgb2YgYW4gaW5zdGFuY2UgdG8gc2V0IHRoZSBjb2xvciBvZi5cclxuXHQgKiBAcGFyYW0ge0NvbG9yfSBjb2xvciAtIFRoZSBjb2xvciB0byBzZXQgdGhlIGluc3RhbmNlIHRvLlxyXG5cdCAqIEByZXR1cm4ge0JhdGNoZWRNZXNofSBBIHJlZmVyZW5jZSB0byB0aGlzIGJhdGNoZWQgbWVzaC5cclxuXHQgKi9cclxuXHRzZXRDb2xvckF0KCBpbnN0YW5jZUlkLCBjb2xvciApIHtcclxuXHJcblx0XHR0aGlzLnZhbGlkYXRlSW5zdGFuY2VJZCggaW5zdGFuY2VJZCApO1xyXG5cclxuXHRcdGlmICggdGhpcy5fY29sb3JzVGV4dHVyZSA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuX2luaXRDb2xvcnNUZXh0dXJlKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbG9yLnRvQXJyYXkoIHRoaXMuX2NvbG9yc1RleHR1cmUuaW1hZ2UuZGF0YSwgaW5zdGFuY2VJZCAqIDQgKTtcclxuXHRcdHRoaXMuX2NvbG9yc1RleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGNvbG9yIG9mIHRoZSBkZWZpbmVkIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluc3RhbmNlSWQgLSBUaGUgSUQgb2YgYW4gaW5zdGFuY2UgdG8gZ2V0IHRoZSBjb2xvciBvZi5cclxuXHQgKiBAcGFyYW0ge0NvbG9yfSBjb2xvciAtIFRoZSB0YXJnZXQgb2JqZWN0IHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbWV0aG9kJ3MgcmVzdWx0LlxyXG5cdCAqIEByZXR1cm4ge0NvbG9yfSBUaGUgaW5zdGFuY2UncyBjb2xvci5cclxuXHQgKi9cclxuXHRnZXRDb2xvckF0KCBpbnN0YW5jZUlkLCBjb2xvciApIHtcclxuXHJcblx0XHR0aGlzLnZhbGlkYXRlSW5zdGFuY2VJZCggaW5zdGFuY2VJZCApO1xyXG5cdFx0cmV0dXJuIGNvbG9yLmZyb21BcnJheSggdGhpcy5fY29sb3JzVGV4dHVyZS5pbWFnZS5kYXRhLCBpbnN0YW5jZUlkICogNCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluc3RhbmNlSWQgLSBUaGUgaWQgb2YgdGhlIGluc3RhbmNlIHRvIHNldCB0aGUgdmlzaWJpbGl0eSBvZi5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IHZpc2libGUgLSBXaGV0aGVyIHRoZSBpbnN0YW5jZSBpcyB2aXNpYmxlIG9yIG5vdC5cclxuXHQgKiBAcmV0dXJuIHtCYXRjaGVkTWVzaH0gQSByZWZlcmVuY2UgdG8gdGhpcyBiYXRjaGVkIG1lc2guXHJcblx0ICovXHJcblx0c2V0VmlzaWJsZUF0KCBpbnN0YW5jZUlkLCB2aXNpYmxlICkge1xyXG5cclxuXHRcdHRoaXMudmFsaWRhdGVJbnN0YW5jZUlkKCBpbnN0YW5jZUlkICk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9pbnN0YW5jZUluZm9bIGluc3RhbmNlSWQgXS52aXNpYmxlID09PSB2aXNpYmxlICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuX2luc3RhbmNlSW5mb1sgaW5zdGFuY2VJZCBdLnZpc2libGUgPSB2aXNpYmxlO1xyXG5cdFx0dGhpcy5fdmlzaWJpbGl0eUNoYW5nZWQgPSB0cnVlO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHZpc2liaWxpdHkgc3RhdGUgb2YgdGhlIGRlZmluZWQgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5zdGFuY2VJZCAtIFRoZSBJRCBvZiBhbiBpbnN0YW5jZSB0byBnZXQgdGhlIHZpc2liaWxpdHkgc3RhdGUgb2YuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgaW5zdGFuY2UgaXMgdmlzaWJsZSBvciBub3QuXHJcblx0ICovXHJcblx0Z2V0VmlzaWJsZUF0KCBpbnN0YW5jZUlkICkge1xyXG5cclxuXHRcdHRoaXMudmFsaWRhdGVJbnN0YW5jZUlkKCBpbnN0YW5jZUlkICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX2luc3RhbmNlSW5mb1sgaW5zdGFuY2VJZCBdLnZpc2libGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZ2VvbWV0cnkgSUQgb2YgdGhlIGluc3RhbmNlIGF0IHRoZSBnaXZlbiBpbmRleC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbnN0YW5jZUlkIC0gVGhlIElEIG9mIHRoZSBpbnN0YW5jZSB0byBzZXQgdGhlIGdlb21ldHJ5IElEIG9mLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBnZW9tZXRyeUlkIC0gVGhlIGdlb21ldHJ5IElEIHRvIGJlIHVzZSBieSB0aGUgaW5zdGFuY2UuXHJcblx0ICogQHJldHVybiB7QmF0Y2hlZE1lc2h9IEEgcmVmZXJlbmNlIHRvIHRoaXMgYmF0Y2hlZCBtZXNoLlxyXG5cdCAqL1xyXG5cdHNldEdlb21ldHJ5SWRBdCggaW5zdGFuY2VJZCwgZ2VvbWV0cnlJZCApIHtcclxuXHJcblx0XHR0aGlzLnZhbGlkYXRlSW5zdGFuY2VJZCggaW5zdGFuY2VJZCApO1xyXG5cdFx0dGhpcy52YWxpZGF0ZUdlb21ldHJ5SWQoIGdlb21ldHJ5SWQgKTtcclxuXHJcblx0XHR0aGlzLl9pbnN0YW5jZUluZm9bIGluc3RhbmNlSWQgXS5nZW9tZXRyeUluZGV4ID0gZ2VvbWV0cnlJZDtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBnZW9tZXRyeSBJRCBvZiB0aGUgZGVmaW5lZCBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbnN0YW5jZUlkIC0gVGhlIElEIG9mIGFuIGluc3RhbmNlIHRvIGdldCB0aGUgZ2VvbWV0cnkgSUQgb2YuXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgaW5zdGFuY2UncyBnZW9tZXRyeSBJRC5cclxuXHQgKi9cclxuXHRnZXRHZW9tZXRyeUlkQXQoIGluc3RhbmNlSWQgKSB7XHJcblxyXG5cdFx0dGhpcy52YWxpZGF0ZUluc3RhbmNlSWQoIGluc3RhbmNlSWQgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5faW5zdGFuY2VJbmZvWyBpbnN0YW5jZUlkIF0uZ2VvbWV0cnlJbmRleDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZXQgdGhlIHJhbmdlIHJlcHJlc2VudGluZyB0aGUgc3Vic2V0IG9mIHRyaWFuZ2xlcyByZWxhdGVkIHRvIHRoZSBhdHRhY2hlZCBnZW9tZXRyeSxcclxuXHQgKiBpbmRpY2F0aW5nIHRoZSBzdGFydGluZyBvZmZzZXQgYW5kIGNvdW50LCBvciBgbnVsbGAgaWYgaW52YWxpZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBnZW9tZXRyeUlkIC0gVGhlIGlkIG9mIHRoZSBnZW9tZXRyeSB0byBnZXQgdGhlIHJhbmdlIG9mLlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbdGFyZ2V0XSAtIFRoZSB0YXJnZXQgb2JqZWN0IHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbWV0aG9kJ3MgcmVzdWx0LlxyXG5cdCAqIEByZXR1cm4ge3tcclxuXHQgKiBcdHZlcnRleFN0YXJ0Om51bWJlcix2ZXJ0ZXhDb3VudDpudW1iZXIscmVzZXJ2ZWRWZXJ0ZXhDb3VudDpudW1iZXIsXHJcblx0ICogXHRpbmRleFN0YXJ0Om51bWJlcixpbmRleENvdW50Om51bWJlcixyZXNlcnZlZEluZGV4Q291bnQ6bnVtYmVyLFxyXG5cdCAqIFx0c3RhcnQ6bnVtYmVyLGNvdW50Om51bWJlclxyXG5cdCAqIH19IFRoZSByZXN1bHQgb2JqZWN0IHdpdGggcmFuZ2UgZGF0YS5cclxuXHQgKi9cclxuXHRnZXRHZW9tZXRyeVJhbmdlQXQoIGdlb21ldHJ5SWQsIHRhcmdldCA9IHt9ICkge1xyXG5cclxuXHRcdHRoaXMudmFsaWRhdGVHZW9tZXRyeUlkKCBnZW9tZXRyeUlkICk7XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnlJbmZvID0gdGhpcy5fZ2VvbWV0cnlJbmZvWyBnZW9tZXRyeUlkIF07XHJcblx0XHR0YXJnZXQudmVydGV4U3RhcnQgPSBnZW9tZXRyeUluZm8udmVydGV4U3RhcnQ7XHJcblx0XHR0YXJnZXQudmVydGV4Q291bnQgPSBnZW9tZXRyeUluZm8udmVydGV4Q291bnQ7XHJcblx0XHR0YXJnZXQucmVzZXJ2ZWRWZXJ0ZXhDb3VudCA9IGdlb21ldHJ5SW5mby5yZXNlcnZlZFZlcnRleENvdW50O1xyXG5cclxuXHRcdHRhcmdldC5pbmRleFN0YXJ0ID0gZ2VvbWV0cnlJbmZvLmluZGV4U3RhcnQ7XHJcblx0XHR0YXJnZXQuaW5kZXhDb3VudCA9IGdlb21ldHJ5SW5mby5pbmRleENvdW50O1xyXG5cdFx0dGFyZ2V0LnJlc2VydmVkSW5kZXhDb3VudCA9IGdlb21ldHJ5SW5mby5yZXNlcnZlZEluZGV4Q291bnQ7XHJcblxyXG5cdFx0dGFyZ2V0LnN0YXJ0ID0gZ2VvbWV0cnlJbmZvLnN0YXJ0O1xyXG5cdFx0dGFyZ2V0LmNvdW50ID0gZ2VvbWV0cnlJbmZvLmNvdW50O1xyXG5cclxuXHRcdHJldHVybiB0YXJnZXQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVzaXplcyB0aGUgbmVjZXNzYXJ5IGJ1ZmZlcnMgdG8gc3VwcG9ydCB0aGUgcHJvdmlkZWQgbnVtYmVyIG9mIGluc3RhbmNlcy5cclxuXHQgKiBJZiB0aGUgcHJvdmlkZWQgYXJndW1lbnRzIHNocmluayB0aGUgbnVtYmVyIG9mIGluc3RhbmNlcyBidXQgdGhlcmUgYXJlIG5vdCBlbm91Z2hcclxuXHQgKiB1bnVzZWQgSWRzIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QgdGhlbiBhbiBlcnJvciBpcyB0aHJvd24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbWF4SW5zdGFuY2VDb3VudCAtIFRoZSBtYXggbnVtYmVyIG9mIGluZGl2aWR1YWwgaW5zdGFuY2VzIHRoYXQgY2FuIGJlIGFkZGVkIGFuZCByZW5kZXJlZCBieSB0aGUgYmF0Y2guXHJcblx0Ki9cclxuXHRzZXRJbnN0YW5jZUNvdW50KCBtYXhJbnN0YW5jZUNvdW50ICkge1xyXG5cclxuXHRcdC8vIHNocmluayB0aGUgYXZhaWxhYmxlIGluc3RhbmNlcyBhcyBtdWNoIGFzIHBvc3NpYmxlXHJcblx0XHRjb25zdCBhdmFpbGFibGVJbnN0YW5jZUlkcyA9IHRoaXMuX2F2YWlsYWJsZUluc3RhbmNlSWRzO1xyXG5cdFx0Y29uc3QgaW5zdGFuY2VJbmZvID0gdGhpcy5faW5zdGFuY2VJbmZvO1xyXG5cdFx0YXZhaWxhYmxlSW5zdGFuY2VJZHMuc29ydCggYXNjSWRTb3J0ICk7XHJcblx0XHR3aGlsZSAoIGF2YWlsYWJsZUluc3RhbmNlSWRzWyBhdmFpbGFibGVJbnN0YW5jZUlkcy5sZW5ndGggLSAxIF0gPT09IGluc3RhbmNlSW5mby5sZW5ndGggKSB7XHJcblxyXG5cdFx0XHRpbnN0YW5jZUluZm8ucG9wKCk7XHJcblx0XHRcdGF2YWlsYWJsZUluc3RhbmNlSWRzLnBvcCgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyB0aHJvdyBhbiBlcnJvciBpZiBpdCBjYW4ndCBiZSBzaHJ1bmsgdG8gdGhlIGRlc2lyZWQgc2l6ZVxyXG5cdFx0aWYgKCBtYXhJbnN0YW5jZUNvdW50IDwgaW5zdGFuY2VJbmZvLmxlbmd0aCApIHtcclxuXHJcblx0XHRcdHRocm93IG5ldyBFcnJvciggYEJhdGNoZWRNZXNoOiBJbnN0YW5jZSBpZHMgb3V0c2lkZSB0aGUgcmFuZ2UgJHsgbWF4SW5zdGFuY2VDb3VudCB9IGFyZSBiZWluZyB1c2VkLiBDYW5ub3Qgc2hyaW5rIGluc3RhbmNlIGNvdW50LmAgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gY29weSB0aGUgbXVsdGkgZHJhdyBjb3VudHNcclxuXHRcdGNvbnN0IG11bHRpRHJhd0NvdW50cyA9IG5ldyBJbnQzMkFycmF5KCBtYXhJbnN0YW5jZUNvdW50ICk7XHJcblx0XHRjb25zdCBtdWx0aURyYXdTdGFydHMgPSBuZXcgSW50MzJBcnJheSggbWF4SW5zdGFuY2VDb3VudCApO1xyXG5cdFx0Y29weUFycmF5Q29udGVudHMoIHRoaXMuX211bHRpRHJhd0NvdW50cywgbXVsdGlEcmF3Q291bnRzICk7XHJcblx0XHRjb3B5QXJyYXlDb250ZW50cyggdGhpcy5fbXVsdGlEcmF3U3RhcnRzLCBtdWx0aURyYXdTdGFydHMgKTtcclxuXHJcblx0XHR0aGlzLl9tdWx0aURyYXdDb3VudHMgPSBtdWx0aURyYXdDb3VudHM7XHJcblx0XHR0aGlzLl9tdWx0aURyYXdTdGFydHMgPSBtdWx0aURyYXdTdGFydHM7XHJcblx0XHR0aGlzLl9tYXhJbnN0YW5jZUNvdW50ID0gbWF4SW5zdGFuY2VDb3VudDtcclxuXHJcblx0XHQvLyB1cGRhdGUgdGV4dHVyZSBkYXRhIGZvciBpbnN0YW5jZSBzYW1wbGluZ1xyXG5cdFx0Y29uc3QgaW5kaXJlY3RUZXh0dXJlID0gdGhpcy5faW5kaXJlY3RUZXh0dXJlO1xyXG5cdFx0Y29uc3QgbWF0cmljZXNUZXh0dXJlID0gdGhpcy5fbWF0cmljZXNUZXh0dXJlO1xyXG5cdFx0Y29uc3QgY29sb3JzVGV4dHVyZSA9IHRoaXMuX2NvbG9yc1RleHR1cmU7XHJcblxyXG5cdFx0aW5kaXJlY3RUZXh0dXJlLmRpc3Bvc2UoKTtcclxuXHRcdHRoaXMuX2luaXRJbmRpcmVjdFRleHR1cmUoKTtcclxuXHRcdGNvcHlBcnJheUNvbnRlbnRzKCBpbmRpcmVjdFRleHR1cmUuaW1hZ2UuZGF0YSwgdGhpcy5faW5kaXJlY3RUZXh0dXJlLmltYWdlLmRhdGEgKTtcclxuXHJcblx0XHRtYXRyaWNlc1RleHR1cmUuZGlzcG9zZSgpO1xyXG5cdFx0dGhpcy5faW5pdE1hdHJpY2VzVGV4dHVyZSgpO1xyXG5cdFx0Y29weUFycmF5Q29udGVudHMoIG1hdHJpY2VzVGV4dHVyZS5pbWFnZS5kYXRhLCB0aGlzLl9tYXRyaWNlc1RleHR1cmUuaW1hZ2UuZGF0YSApO1xyXG5cclxuXHRcdGlmICggY29sb3JzVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdGNvbG9yc1RleHR1cmUuZGlzcG9zZSgpO1xyXG5cdFx0XHR0aGlzLl9pbml0Q29sb3JzVGV4dHVyZSgpO1xyXG5cdFx0XHRjb3B5QXJyYXlDb250ZW50cyggY29sb3JzVGV4dHVyZS5pbWFnZS5kYXRhLCB0aGlzLl9jb2xvcnNUZXh0dXJlLmltYWdlLmRhdGEgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVzaXplcyB0aGUgYXZhaWxhYmxlIHNwYWNlIGluIHRoZSBiYXRjaCdzIHZlcnRleCBhbmQgaW5kZXggYnVmZmVyIGF0dHJpYnV0ZXMgdG8gdGhlIHByb3ZpZGVkIHNpemVzLlxyXG5cdCAqIElmIHRoZSBwcm92aWRlZCBhcmd1bWVudHMgc2hyaW5rIHRoZSBnZW9tZXRyeSBidWZmZXJzIGJ1dCB0aGVyZSBpcyBub3QgZW5vdWdoIHVudXNlZCBzcGFjZSBhdCB0aGVcclxuXHQgKiBlbmQgb2YgdGhlIGdlb21ldHJ5IGF0dHJpYnV0ZXMgdGhlbiBhbiBlcnJvciBpcyB0aHJvd24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbWF4VmVydGV4Q291bnQgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgdmVydGljZXMgdG8gYmUgdXNlZCBieSBhbGwgdW5pcXVlIGdlb21ldHJpZXMgdG8gcmVzaXplIHRvLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBtYXhJbmRleENvdW50IC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIGluZGljZXMgdG8gYmUgdXNlZCBieSBhbGwgdW5pcXVlIGdlb21ldHJpZXMgdG8gcmVzaXplIHRvLlxyXG5cdCovXHJcblx0c2V0R2VvbWV0cnlTaXplKCBtYXhWZXJ0ZXhDb3VudCwgbWF4SW5kZXhDb3VudCApIHtcclxuXHJcblx0XHQvLyBDaGVjayBpZiB3ZSBjYW4gc2hyaW5rIHRvIHRoZSByZXF1ZXN0ZWQgdmVydGV4IGF0dHJpYnV0ZSBzaXplXHJcblx0XHRjb25zdCB2YWxpZFJhbmdlcyA9IFsgLi4udGhpcy5fZ2VvbWV0cnlJbmZvIF0uZmlsdGVyKCBpbmZvID0+IGluZm8uYWN0aXZlICk7XHJcblx0XHRjb25zdCByZXF1aXJlZFZlcnRleExlbmd0aCA9IE1hdGgubWF4KCAuLi52YWxpZFJhbmdlcy5tYXAoIHJhbmdlID0+IHJhbmdlLnZlcnRleFN0YXJ0ICsgcmFuZ2UucmVzZXJ2ZWRWZXJ0ZXhDb3VudCApICk7XHJcblx0XHRpZiAoIHJlcXVpcmVkVmVydGV4TGVuZ3RoID4gbWF4VmVydGV4Q291bnQgKSB7XHJcblxyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoIGBCYXRjaGVkTWVzaDogR2VvbWV0cnkgdmVydGV4IHZhbHVlcyBhcmUgYmVpbmcgdXNlZCBvdXRzaWRlIHRoZSByYW5nZSAkeyBtYXhJbmRleENvdW50IH0uIENhbm5vdCBzaHJpbmsgZnVydGhlci5gICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIENoZWNrIGlmIHdlIGNhbiBzaHJpbmsgdG8gdGhlIHJlcXVlc3RlZCBpbmRleCBhdHRyaWJ1dGUgc2l6ZVxyXG5cdFx0aWYgKCB0aGlzLmdlb21ldHJ5LmluZGV4ICkge1xyXG5cclxuXHRcdFx0Y29uc3QgcmVxdWlyZWRJbmRleExlbmd0aCA9IE1hdGgubWF4KCAuLi52YWxpZFJhbmdlcy5tYXAoIHJhbmdlID0+IHJhbmdlLmluZGV4U3RhcnQgKyByYW5nZS5yZXNlcnZlZEluZGV4Q291bnQgKSApO1xyXG5cdFx0XHRpZiAoIHJlcXVpcmVkSW5kZXhMZW5ndGggPiBtYXhJbmRleENvdW50ICkge1xyXG5cclxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoIGBCYXRjaGVkTWVzaDogR2VvbWV0cnkgaW5kZXggdmFsdWVzIGFyZSBiZWluZyB1c2VkIG91dHNpZGUgdGhlIHJhbmdlICR7IG1heEluZGV4Q291bnQgfS4gQ2Fubm90IHNocmluayBmdXJ0aGVyLmAgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHQvLyBkaXNwb3NlIG9mIHRoZSBwcmV2aW91cyBnZW9tZXRyeVxyXG5cdFx0Y29uc3Qgb2xkR2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xyXG5cdFx0b2xkR2VvbWV0cnkuZGlzcG9zZSgpO1xyXG5cclxuXHRcdC8vIHJlY3JlYXRlIHRoZSBnZW9tZXRyeSBuZWVkZWQgYmFzZWQgb24gdGhlIHByZXZpb3VzIHZhcmlhbnRcclxuXHRcdHRoaXMuX21heFZlcnRleENvdW50ID0gbWF4VmVydGV4Q291bnQ7XHJcblx0XHR0aGlzLl9tYXhJbmRleENvdW50ID0gbWF4SW5kZXhDb3VudDtcclxuXHJcblx0XHRpZiAoIHRoaXMuX2dlb21ldHJ5SW5pdGlhbGl6ZWQgKSB7XHJcblxyXG5cdFx0XHR0aGlzLl9nZW9tZXRyeUluaXRpYWxpemVkID0gZmFsc2U7XHJcblx0XHRcdHRoaXMuZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcclxuXHRcdFx0dGhpcy5faW5pdGlhbGl6ZUdlb21ldHJ5KCBvbGRHZW9tZXRyeSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBjb3B5IGRhdGEgZnJvbSB0aGUgcHJldmlvdXMgZ2VvbWV0cnlcclxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcclxuXHRcdGlmICggb2xkR2VvbWV0cnkuaW5kZXggKSB7XHJcblxyXG5cdFx0XHRjb3B5QXJyYXlDb250ZW50cyggb2xkR2VvbWV0cnkuaW5kZXguYXJyYXksIGdlb21ldHJ5LmluZGV4LmFycmF5ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZvciAoIGNvbnN0IGtleSBpbiBvbGRHZW9tZXRyeS5hdHRyaWJ1dGVzICkge1xyXG5cclxuXHRcdFx0Y29weUFycmF5Q29udGVudHMoIG9sZEdlb21ldHJ5LmF0dHJpYnV0ZXNbIGtleSBdLmFycmF5LCBnZW9tZXRyeS5hdHRyaWJ1dGVzWyBrZXkgXS5hcnJheSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRyYXljYXN0KCByYXljYXN0ZXIsIGludGVyc2VjdHMgKSB7XHJcblxyXG5cdFx0Y29uc3QgaW5zdGFuY2VJbmZvID0gdGhpcy5faW5zdGFuY2VJbmZvO1xyXG5cdFx0Y29uc3QgZ2VvbWV0cnlJbmZvTGlzdCA9IHRoaXMuX2dlb21ldHJ5SW5mbztcclxuXHRcdGNvbnN0IG1hdHJpeFdvcmxkID0gdGhpcy5tYXRyaXhXb3JsZDtcclxuXHRcdGNvbnN0IGJhdGNoR2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xyXG5cclxuXHRcdC8vIGl0ZXJhdGUgb3ZlciBlYWNoIGdlb21ldHJ5XHJcblx0XHRfbWVzaC5tYXRlcmlhbCA9IHRoaXMubWF0ZXJpYWw7XHJcblx0XHRfbWVzaC5nZW9tZXRyeS5pbmRleCA9IGJhdGNoR2VvbWV0cnkuaW5kZXg7XHJcblx0XHRfbWVzaC5nZW9tZXRyeS5hdHRyaWJ1dGVzID0gYmF0Y2hHZW9tZXRyeS5hdHRyaWJ1dGVzO1xyXG5cdFx0aWYgKCBfbWVzaC5nZW9tZXRyeS5ib3VuZGluZ0JveCA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdF9tZXNoLmdlb21ldHJ5LmJvdW5kaW5nQm94ID0gbmV3IEJveDMoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBfbWVzaC5nZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdF9tZXNoLmdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID0gbmV3IFNwaGVyZSgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBpbnN0YW5jZUluZm8ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGlmICggISBpbnN0YW5jZUluZm9bIGkgXS52aXNpYmxlIHx8ICEgaW5zdGFuY2VJbmZvWyBpIF0uYWN0aXZlICkge1xyXG5cclxuXHRcdFx0XHRjb250aW51ZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IGdlb21ldHJ5SWQgPSBpbnN0YW5jZUluZm9bIGkgXS5nZW9tZXRyeUluZGV4O1xyXG5cdFx0XHRjb25zdCBnZW9tZXRyeUluZm8gPSBnZW9tZXRyeUluZm9MaXN0WyBnZW9tZXRyeUlkIF07XHJcblx0XHRcdF9tZXNoLmdlb21ldHJ5LnNldERyYXdSYW5nZSggZ2VvbWV0cnlJbmZvLnN0YXJ0LCBnZW9tZXRyeUluZm8uY291bnQgKTtcclxuXHJcblx0XHRcdC8vIGdldCB0aGUgaW50ZXJzZWN0c1xyXG5cdFx0XHR0aGlzLmdldE1hdHJpeEF0KCBpLCBfbWVzaC5tYXRyaXhXb3JsZCApLnByZW11bHRpcGx5KCBtYXRyaXhXb3JsZCApO1xyXG5cdFx0XHR0aGlzLmdldEJvdW5kaW5nQm94QXQoIGdlb21ldHJ5SWQsIF9tZXNoLmdlb21ldHJ5LmJvdW5kaW5nQm94ICk7XHJcblx0XHRcdHRoaXMuZ2V0Qm91bmRpbmdTcGhlcmVBdCggZ2VvbWV0cnlJZCwgX21lc2guZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgKTtcclxuXHRcdFx0X21lc2gucmF5Y2FzdCggcmF5Y2FzdGVyLCBfYmF0Y2hJbnRlcnNlY3RzICk7XHJcblxyXG5cdFx0XHQvLyBhZGQgYmF0Y2ggaWQgdG8gdGhlIGludGVyc2VjdHNcclxuXHRcdFx0Zm9yICggbGV0IGogPSAwLCBsID0gX2JhdGNoSW50ZXJzZWN0cy5sZW5ndGg7IGogPCBsOyBqICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBpbnRlcnNlY3QgPSBfYmF0Y2hJbnRlcnNlY3RzWyBqIF07XHJcblx0XHRcdFx0aW50ZXJzZWN0Lm9iamVjdCA9IHRoaXM7XHJcblx0XHRcdFx0aW50ZXJzZWN0LmJhdGNoSWQgPSBpO1xyXG5cdFx0XHRcdGludGVyc2VjdHMucHVzaCggaW50ZXJzZWN0ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRfYmF0Y2hJbnRlcnNlY3RzLmxlbmd0aCA9IDA7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdF9tZXNoLm1hdGVyaWFsID0gbnVsbDtcclxuXHRcdF9tZXNoLmdlb21ldHJ5LmluZGV4ID0gbnVsbDtcclxuXHRcdF9tZXNoLmdlb21ldHJ5LmF0dHJpYnV0ZXMgPSB7fTtcclxuXHRcdF9tZXNoLmdlb21ldHJ5LnNldERyYXdSYW5nZSggMCwgSW5maW5pdHkgKTtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy5nZW9tZXRyeSA9IHNvdXJjZS5nZW9tZXRyeS5jbG9uZSgpO1xyXG5cdFx0dGhpcy5wZXJPYmplY3RGcnVzdHVtQ3VsbGVkID0gc291cmNlLnBlck9iamVjdEZydXN0dW1DdWxsZWQ7XHJcblx0XHR0aGlzLnNvcnRPYmplY3RzID0gc291cmNlLnNvcnRPYmplY3RzO1xyXG5cdFx0dGhpcy5ib3VuZGluZ0JveCA9IHNvdXJjZS5ib3VuZGluZ0JveCAhPT0gbnVsbCA/IHNvdXJjZS5ib3VuZGluZ0JveC5jbG9uZSgpIDogbnVsbDtcclxuXHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBzb3VyY2UuYm91bmRpbmdTcGhlcmUgIT09IG51bGwgPyBzb3VyY2UuYm91bmRpbmdTcGhlcmUuY2xvbmUoKSA6IG51bGw7XHJcblxyXG5cdFx0dGhpcy5fZ2VvbWV0cnlJbmZvID0gc291cmNlLl9nZW9tZXRyeUluZm8ubWFwKCBpbmZvID0+ICgge1xyXG5cdFx0XHQuLi5pbmZvLFxyXG5cclxuXHRcdFx0Ym91bmRpbmdCb3g6IGluZm8uYm91bmRpbmdCb3ggIT09IG51bGwgPyBpbmZvLmJvdW5kaW5nQm94LmNsb25lKCkgOiBudWxsLFxyXG5cdFx0XHRib3VuZGluZ1NwaGVyZTogaW5mby5ib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCA/IGluZm8uYm91bmRpbmdTcGhlcmUuY2xvbmUoKSA6IG51bGwsXHJcblx0XHR9ICkgKTtcclxuXHRcdHRoaXMuX2luc3RhbmNlSW5mbyA9IHNvdXJjZS5faW5zdGFuY2VJbmZvLm1hcCggaW5mbyA9PiAoIHsgLi4uaW5mbyB9ICkgKTtcclxuXHJcblx0XHR0aGlzLl9tYXhJbnN0YW5jZUNvdW50ID0gc291cmNlLl9tYXhJbnN0YW5jZUNvdW50O1xyXG5cdFx0dGhpcy5fbWF4VmVydGV4Q291bnQgPSBzb3VyY2UuX21heFZlcnRleENvdW50O1xyXG5cdFx0dGhpcy5fbWF4SW5kZXhDb3VudCA9IHNvdXJjZS5fbWF4SW5kZXhDb3VudDtcclxuXHJcblx0XHR0aGlzLl9nZW9tZXRyeUluaXRpYWxpemVkID0gc291cmNlLl9nZW9tZXRyeUluaXRpYWxpemVkO1xyXG5cdFx0dGhpcy5fZ2VvbWV0cnlDb3VudCA9IHNvdXJjZS5fZ2VvbWV0cnlDb3VudDtcclxuXHRcdHRoaXMuX211bHRpRHJhd0NvdW50cyA9IHNvdXJjZS5fbXVsdGlEcmF3Q291bnRzLnNsaWNlKCk7XHJcblx0XHR0aGlzLl9tdWx0aURyYXdTdGFydHMgPSBzb3VyY2UuX211bHRpRHJhd1N0YXJ0cy5zbGljZSgpO1xyXG5cclxuXHRcdHRoaXMuX21hdHJpY2VzVGV4dHVyZSA9IHNvdXJjZS5fbWF0cmljZXNUZXh0dXJlLmNsb25lKCk7XHJcblx0XHR0aGlzLl9tYXRyaWNlc1RleHR1cmUuaW1hZ2UuZGF0YSA9IHRoaXMuX21hdHJpY2VzVGV4dHVyZS5pbWFnZS5kYXRhLnNsaWNlKCk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9jb2xvcnNUZXh0dXJlICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5fY29sb3JzVGV4dHVyZSA9IHNvdXJjZS5fY29sb3JzVGV4dHVyZS5jbG9uZSgpO1xyXG5cdFx0XHR0aGlzLl9jb2xvcnNUZXh0dXJlLmltYWdlLmRhdGEgPSB0aGlzLl9jb2xvcnNUZXh0dXJlLmltYWdlLmRhdGEuc2xpY2UoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRnJlZXMgdGhlIEdQVS1yZWxhdGVkIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhpcyBpbnN0YW5jZS4gQ2FsbCB0aGlzXHJcblx0ICogbWV0aG9kIHdoZW5ldmVyIHRoaXMgaW5zdGFuY2UgaXMgbm8gbG9uZ2VyIHVzZWQgaW4geW91ciBhcHAuXHJcblx0ICovXHJcblx0ZGlzcG9zZSgpIHtcclxuXHJcblx0XHQvLyBBc3N1bWluZyB0aGUgZ2VvbWV0cnkgaXMgbm90IHNoYXJlZCB3aXRoIG90aGVyIG1lc2hlc1xyXG5cdFx0dGhpcy5nZW9tZXRyeS5kaXNwb3NlKCk7XHJcblxyXG5cdFx0dGhpcy5fbWF0cmljZXNUZXh0dXJlLmRpc3Bvc2UoKTtcclxuXHRcdHRoaXMuX21hdHJpY2VzVGV4dHVyZSA9IG51bGw7XHJcblxyXG5cdFx0dGhpcy5faW5kaXJlY3RUZXh0dXJlLmRpc3Bvc2UoKTtcclxuXHRcdHRoaXMuX2luZGlyZWN0VGV4dHVyZSA9IG51bGw7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9jb2xvcnNUZXh0dXJlICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5fY29sb3JzVGV4dHVyZS5kaXNwb3NlKCk7XHJcblx0XHRcdHRoaXMuX2NvbG9yc1RleHR1cmUgPSBudWxsO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRvbkJlZm9yZVJlbmRlciggcmVuZGVyZXIsIHNjZW5lLCBjYW1lcmEsIGdlb21ldHJ5LCBtYXRlcmlhbC8qLCBfZ3JvdXAqLyApIHtcclxuXHJcblx0XHQvLyBpZiB2aXNpYmlsaXR5IGhhcyBub3QgY2hhbmdlZCBhbmQgZnJ1c3R1bSBjdWxsaW5nIGFuZCBvYmplY3Qgc29ydGluZyBpcyBub3QgcmVxdWlyZWRcclxuXHRcdC8vIHRoZW4gc2tpcCBpdGVyYXRpbmcgb3ZlciBhbGwgaXRlbXNcclxuXHRcdGlmICggISB0aGlzLl92aXNpYmlsaXR5Q2hhbmdlZCAmJiAhIHRoaXMucGVyT2JqZWN0RnJ1c3R1bUN1bGxlZCAmJiAhIHRoaXMuc29ydE9iamVjdHMgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIHRoZSBpbmRleGVkIHZlcnNpb24gb2YgdGhlIG11bHRpIGRyYXcgZnVuY3Rpb24gcmVxdWlyZXMgc3BlY2lmeWluZyB0aGUgc3RhcnRcclxuXHRcdC8vIG9mZnNldCBpbiBieXRlcy5cclxuXHRcdGNvbnN0IGluZGV4ID0gZ2VvbWV0cnkuZ2V0SW5kZXgoKTtcclxuXHRcdGNvbnN0IGJ5dGVzUGVyRWxlbWVudCA9IGluZGV4ID09PSBudWxsID8gMSA6IGluZGV4LmFycmF5LkJZVEVTX1BFUl9FTEVNRU5UO1xyXG5cclxuXHRcdGNvbnN0IGluc3RhbmNlSW5mbyA9IHRoaXMuX2luc3RhbmNlSW5mbztcclxuXHRcdGNvbnN0IG11bHRpRHJhd1N0YXJ0cyA9IHRoaXMuX211bHRpRHJhd1N0YXJ0cztcclxuXHRcdGNvbnN0IG11bHRpRHJhd0NvdW50cyA9IHRoaXMuX211bHRpRHJhd0NvdW50cztcclxuXHRcdGNvbnN0IGdlb21ldHJ5SW5mb0xpc3QgPSB0aGlzLl9nZW9tZXRyeUluZm87XHJcblx0XHRjb25zdCBwZXJPYmplY3RGcnVzdHVtQ3VsbGVkID0gdGhpcy5wZXJPYmplY3RGcnVzdHVtQ3VsbGVkO1xyXG5cdFx0Y29uc3QgaW5kaXJlY3RUZXh0dXJlID0gdGhpcy5faW5kaXJlY3RUZXh0dXJlO1xyXG5cdFx0Y29uc3QgaW5kaXJlY3RBcnJheSA9IGluZGlyZWN0VGV4dHVyZS5pbWFnZS5kYXRhO1xyXG5cclxuXHRcdC8vIHByZXBhcmUgdGhlIGZydXN0dW0gaW4gdGhlIGxvY2FsIGZyYW1lXHJcblx0XHRpZiAoIHBlck9iamVjdEZydXN0dW1DdWxsZWQgKSB7XHJcblxyXG5cdFx0XHRfbWF0cml4XHJcblx0XHRcdFx0Lm11bHRpcGx5TWF0cmljZXMoIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlIClcclxuXHRcdFx0XHQubXVsdGlwbHkoIHRoaXMubWF0cml4V29ybGQgKTtcclxuXHRcdFx0X2ZydXN0dW0uc2V0RnJvbVByb2plY3Rpb25NYXRyaXgoXHJcblx0XHRcdFx0X21hdHJpeCxcclxuXHRcdFx0XHRyZW5kZXJlci5jb29yZGluYXRlU3lzdGVtXHJcblx0XHRcdCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGxldCBtdWx0aURyYXdDb3VudCA9IDA7XHJcblx0XHRpZiAoIHRoaXMuc29ydE9iamVjdHMgKSB7XHJcblxyXG5cdFx0XHQvLyBnZXQgdGhlIGNhbWVyYSBwb3NpdGlvbiBpbiB0aGUgbG9jYWwgZnJhbWVcclxuXHRcdFx0X21hdHJpeC5jb3B5KCB0aGlzLm1hdHJpeFdvcmxkICkuaW52ZXJ0KCk7XHJcblx0XHRcdF92ZWN0b3Iuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBjYW1lcmEubWF0cml4V29ybGQgKS5hcHBseU1hdHJpeDQoIF9tYXRyaXggKTtcclxuXHRcdFx0X2ZvcndhcmQuc2V0KCAwLCAwLCAtIDEgKS50cmFuc2Zvcm1EaXJlY3Rpb24oIGNhbWVyYS5tYXRyaXhXb3JsZCApLnRyYW5zZm9ybURpcmVjdGlvbiggX21hdHJpeCApO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gaW5zdGFuY2VJbmZvLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggaW5zdGFuY2VJbmZvWyBpIF0udmlzaWJsZSAmJiBpbnN0YW5jZUluZm9bIGkgXS5hY3RpdmUgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgZ2VvbWV0cnlJZCA9IGluc3RhbmNlSW5mb1sgaSBdLmdlb21ldHJ5SW5kZXg7XHJcblxyXG5cdFx0XHRcdFx0Ly8gZ2V0IHRoZSBib3VuZHMgaW4gd29ybGQgc3BhY2VcclxuXHRcdFx0XHRcdHRoaXMuZ2V0TWF0cml4QXQoIGksIF9tYXRyaXggKTtcclxuXHRcdFx0XHRcdHRoaXMuZ2V0Qm91bmRpbmdTcGhlcmVBdCggZ2VvbWV0cnlJZCwgX3NwaGVyZSApLmFwcGx5TWF0cml4NCggX21hdHJpeCApO1xyXG5cclxuXHRcdFx0XHRcdC8vIGRldGVybWluZSB3aGV0aGVyIHRoZSBiYXRjaGVkIGdlb21ldHJ5IGlzIHdpdGhpbiB0aGUgZnJ1c3R1bVxyXG5cdFx0XHRcdFx0bGV0IGN1bGxlZCA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0aWYgKCBwZXJPYmplY3RGcnVzdHVtQ3VsbGVkICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y3VsbGVkID0gISBfZnJ1c3R1bS5pbnRlcnNlY3RzU3BoZXJlKCBfc3BoZXJlICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGlmICggISBjdWxsZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBnZXQgdGhlIGRpc3RhbmNlIGZyb20gY2FtZXJhIHVzZWQgZm9yIHNvcnRpbmdcclxuXHRcdFx0XHRcdFx0Y29uc3QgZ2VvbWV0cnlJbmZvID0gZ2VvbWV0cnlJbmZvTGlzdFsgZ2VvbWV0cnlJZCBdO1xyXG5cdFx0XHRcdFx0XHRjb25zdCB6ID0gX3RlbXAuc3ViVmVjdG9ycyggX3NwaGVyZS5jZW50ZXIsIF92ZWN0b3IgKS5kb3QoIF9mb3J3YXJkICk7XHJcblx0XHRcdFx0XHRcdF9yZW5kZXJMaXN0LnB1c2goIGdlb21ldHJ5SW5mby5zdGFydCwgZ2VvbWV0cnlJbmZvLmNvdW50LCB6LCBpICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBTb3J0IHRoZSBkcmF3IHJhbmdlcyBhbmQgcHJlcCBmb3IgcmVuZGVyaW5nXHJcblx0XHRcdGNvbnN0IGxpc3QgPSBfcmVuZGVyTGlzdC5saXN0O1xyXG5cdFx0XHRjb25zdCBjdXN0b21Tb3J0ID0gdGhpcy5jdXN0b21Tb3J0O1xyXG5cdFx0XHRpZiAoIGN1c3RvbVNvcnQgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdGxpc3Quc29ydCggbWF0ZXJpYWwudHJhbnNwYXJlbnQgPyBzb3J0VHJhbnNwYXJlbnQgOiBzb3J0T3BhcXVlICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRjdXN0b21Tb3J0LmNhbGwoIHRoaXMsIGxpc3QsIGNhbWVyYSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gbGlzdC5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBpdGVtID0gbGlzdFsgaSBdO1xyXG5cdFx0XHRcdG11bHRpRHJhd1N0YXJ0c1sgbXVsdGlEcmF3Q291bnQgXSA9IGl0ZW0uc3RhcnQgKiBieXRlc1BlckVsZW1lbnQ7XHJcblx0XHRcdFx0bXVsdGlEcmF3Q291bnRzWyBtdWx0aURyYXdDb3VudCBdID0gaXRlbS5jb3VudDtcclxuXHRcdFx0XHRpbmRpcmVjdEFycmF5WyBtdWx0aURyYXdDb3VudCBdID0gaXRlbS5pbmRleDtcclxuXHRcdFx0XHRtdWx0aURyYXdDb3VudCArKztcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdF9yZW5kZXJMaXN0LnJlc2V0KCk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGluc3RhbmNlSW5mby5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIGluc3RhbmNlSW5mb1sgaSBdLnZpc2libGUgJiYgaW5zdGFuY2VJbmZvWyBpIF0uYWN0aXZlICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGdlb21ldHJ5SWQgPSBpbnN0YW5jZUluZm9bIGkgXS5nZW9tZXRyeUluZGV4O1xyXG5cclxuXHRcdFx0XHRcdC8vIGRldGVybWluZSB3aGV0aGVyIHRoZSBiYXRjaGVkIGdlb21ldHJ5IGlzIHdpdGhpbiB0aGUgZnJ1c3R1bVxyXG5cdFx0XHRcdFx0bGV0IGN1bGxlZCA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0aWYgKCBwZXJPYmplY3RGcnVzdHVtQ3VsbGVkICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Ly8gZ2V0IHRoZSBib3VuZHMgaW4gd29ybGQgc3BhY2VcclxuXHRcdFx0XHRcdFx0dGhpcy5nZXRNYXRyaXhBdCggaSwgX21hdHJpeCApO1xyXG5cdFx0XHRcdFx0XHR0aGlzLmdldEJvdW5kaW5nU3BoZXJlQXQoIGdlb21ldHJ5SWQsIF9zcGhlcmUgKS5hcHBseU1hdHJpeDQoIF9tYXRyaXggKTtcclxuXHRcdFx0XHRcdFx0Y3VsbGVkID0gISBfZnJ1c3R1bS5pbnRlcnNlY3RzU3BoZXJlKCBfc3BoZXJlICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGlmICggISBjdWxsZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCBnZW9tZXRyeUluZm8gPSBnZW9tZXRyeUluZm9MaXN0WyBnZW9tZXRyeUlkIF07XHJcblx0XHRcdFx0XHRcdG11bHRpRHJhd1N0YXJ0c1sgbXVsdGlEcmF3Q291bnQgXSA9IGdlb21ldHJ5SW5mby5zdGFydCAqIGJ5dGVzUGVyRWxlbWVudDtcclxuXHRcdFx0XHRcdFx0bXVsdGlEcmF3Q291bnRzWyBtdWx0aURyYXdDb3VudCBdID0gZ2VvbWV0cnlJbmZvLmNvdW50O1xyXG5cdFx0XHRcdFx0XHRpbmRpcmVjdEFycmF5WyBtdWx0aURyYXdDb3VudCBdID0gaTtcclxuXHRcdFx0XHRcdFx0bXVsdGlEcmF3Q291bnQgKys7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGluZGlyZWN0VGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblx0XHR0aGlzLl9tdWx0aURyYXdDb3VudCA9IG11bHRpRHJhd0NvdW50O1xyXG5cdFx0dGhpcy5fdmlzaWJpbGl0eUNoYW5nZWQgPSBmYWxzZTtcclxuXHJcblx0fVxyXG5cclxuXHRvbkJlZm9yZVNoYWRvdyggcmVuZGVyZXIsIG9iamVjdCwgY2FtZXJhLCBzaGFkb3dDYW1lcmEsIGdlb21ldHJ5LCBkZXB0aE1hdGVyaWFsLyogLCBncm91cCAqLyApIHtcclxuXHJcblx0XHR0aGlzLm9uQmVmb3JlUmVuZGVyKCByZW5kZXJlciwgbnVsbCwgc2hhZG93Q2FtZXJhLCBnZW9tZXRyeSwgZGVwdGhNYXRlcmlhbCApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBCYXRjaGVkTWVzaCB9O1xyXG4iLCJpbXBvcnQgeyBNYXRlcmlhbCB9IGZyb20gJy4vTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uL21hdGgvQ29sb3IuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgbWF0ZXJpYWwgZm9yIHJlbmRlcmluZyBsaW5lIHByaW1pdGl2ZXMuXHJcbiAqXHJcbiAqIE1hdGVyaWFscyBkZWZpbmUgdGhlIGFwcGVhcmFuY2Ugb2YgcmVuZGVyYWJsZSAzRCBvYmplY3RzLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBtYXRlcmlhbCA9IG5ldyBUSFJFRS5MaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogMHhmZmZmZmYgfSApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIE1hdGVyaWFsXHJcbiAqL1xyXG5jbGFzcyBMaW5lQmFzaWNNYXRlcmlhbCBleHRlbmRzIE1hdGVyaWFsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBsaW5lIGJhc2ljIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbWV0ZXJzXSAtIEFuIG9iamVjdCB3aXRoIG9uZSBvciBtb3JlIHByb3BlcnRpZXNcclxuXHQgKiBkZWZpbmluZyB0aGUgbWF0ZXJpYWwncyBhcHBlYXJhbmNlLiBBbnkgcHJvcGVydHkgb2YgdGhlIG1hdGVyaWFsXHJcblx0ICogKGluY2x1ZGluZyBhbnkgcHJvcGVydHkgZnJvbSBpbmhlcml0ZWQgbWF0ZXJpYWxzKSBjYW4gYmUgcGFzc2VkXHJcblx0ICogaW4gaGVyZS4gQ29sb3IgdmFsdWVzIGNhbiBiZSBwYXNzZWQgYW55IHR5cGUgb2YgdmFsdWUgYWNjZXB0ZWRcclxuXHQgKiBieSB7QGxpbmsgQ29sb3Ijc2V0fS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVycyApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0xpbmVCYXNpY01hdGVyaWFsID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnTGluZUJhc2ljTWF0ZXJpYWwnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQ29sb3Igb2YgdGhlIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtDb2xvcn1cclxuXHRcdCAqIEBkZWZhdWx0ICgxLDEsMSlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNldHMgdGhlIGNvbG9yIG9mIHRoZSBsaW5lcyB1c2luZyBkYXRhIGZyb20gYSB0ZXh0dXJlLiBUaGUgdGV4dHVyZSBtYXBcclxuXHRcdCAqIGNvbG9yIGlzIG1vZHVsYXRlZCBieSB0aGUgZGlmZnVzZSBgY29sb3JgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQ29udHJvbHMgbGluZSB0aGlja25lc3Mgb3IgbGluZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQ2FuIG9ubHkgYmUgdXNlZCB3aXRoIHtAbGluayBTVkdSZW5kZXJlcn0uIFdlYkdMIGFuZCBXZWJHUFVcclxuXHRcdCAqIGlnbm9yZSB0aGlzIHNldHRpbmcgYW5kIGFsd2F5cyByZW5kZXIgbGluZSBwcmltaXRpdmVzIHdpdGggYVxyXG5cdFx0ICogd2lkdGggb2Ygb25lIHBpeGVsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGluZXdpZHRoID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgYXBwZWFyYW5jZSBvZiBsaW5lIGVuZHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQ2FuIG9ubHkgYmUgdXNlZCB3aXRoIHtAbGluayBTVkdSZW5kZXJlcn0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeygnYnV0dCd8J3JvdW5kJ3wnc3F1YXJlJyl9XHJcblx0XHQgKiBAZGVmYXVsdCAncm91bmQnXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGluZWNhcCA9ICdyb3VuZCc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIGFwcGVhcmFuY2Ugb2YgbGluZSBqb2ludHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQ2FuIG9ubHkgYmUgdXNlZCB3aXRoIHtAbGluayBTVkdSZW5kZXJlcn0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeygncm91bmQnfCdiZXZlbCd8J21pdGVyJyl9XHJcblx0XHQgKiBAZGVmYXVsdCAncm91bmQnXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGluZWpvaW4gPSAncm91bmQnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgbWF0ZXJpYWwgaXMgYWZmZWN0ZWQgYnkgZm9nIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5mb2cgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XHJcblxyXG5cdFx0dGhpcy5tYXAgPSBzb3VyY2UubWFwO1xyXG5cclxuXHRcdHRoaXMubGluZXdpZHRoID0gc291cmNlLmxpbmV3aWR0aDtcclxuXHRcdHRoaXMubGluZWNhcCA9IHNvdXJjZS5saW5lY2FwO1xyXG5cdFx0dGhpcy5saW5lam9pbiA9IHNvdXJjZS5saW5lam9pbjtcclxuXHJcblx0XHR0aGlzLmZvZyA9IHNvdXJjZS5mb2c7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IExpbmVCYXNpY01hdGVyaWFsIH07XHJcbiIsImltcG9ydCB7IFNwaGVyZSB9IGZyb20gJy4uL21hdGgvU3BoZXJlLmpzJztcclxuaW1wb3J0IHsgUmF5IH0gZnJvbSAnLi4vbWF0aC9SYXkuanMnO1xyXG5pbXBvcnQgeyBNYXRyaXg0IH0gZnJvbSAnLi4vbWF0aC9NYXRyaXg0LmpzJztcclxuaW1wb3J0IHsgT2JqZWN0M0QgfSBmcm9tICcuLi9jb3JlL09iamVjdDNELmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcbmltcG9ydCB7IExpbmVCYXNpY01hdGVyaWFsIH0gZnJvbSAnLi4vbWF0ZXJpYWxzL0xpbmVCYXNpY01hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcclxuaW1wb3J0IHsgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyQXR0cmlidXRlLmpzJztcclxuXHJcbmNvbnN0IF92U3RhcnQgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF92RW5kID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5cclxuY29uc3QgX2ludmVyc2VNYXRyaXggPSAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXg0KCk7XHJcbmNvbnN0IF9yYXkgPSAvKkBfX1BVUkVfXyovIG5ldyBSYXkoKTtcclxuY29uc3QgX3NwaGVyZSA9IC8qQF9fUFVSRV9fKi8gbmV3IFNwaGVyZSgpO1xyXG5cclxuY29uc3QgX2ludGVyc2VjdFBvaW50T25SYXkgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF9pbnRlcnNlY3RQb2ludE9uU2VnbWVudCA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuXHJcbi8qKlxyXG4gKiBBIGNvbnRpbnVvdXMgbGluZS4gVGhlIGxpbmUgYXJlIHJlbmRlcmVkIGJ5IGNvbm5lY3RpbmcgY29uc2VjdXRpdmVcclxuICogdmVydGljZXMgd2l0aCBzdHJhaWdodCBsaW5lcy5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IDB4MDAwMGZmIH0gKTtcclxuICpcclxuICogY29uc3QgcG9pbnRzID0gW107XHJcbiAqIHBvaW50cy5wdXNoKCBuZXcgVEhSRUUuVmVjdG9yMyggLSAxMCwgMCwgMCApICk7XHJcbiAqIHBvaW50cy5wdXNoKCBuZXcgVEhSRUUuVmVjdG9yMyggMCwgMTAsIDAgKSApO1xyXG4gKiBwb2ludHMucHVzaCggbmV3IFRIUkVFLlZlY3RvcjMoIDEwLCAwLCAwICkgKTtcclxuICpcclxuICogY29uc3QgZ2VvbWV0cnkgPSBuZXcgVEhSRUUuQnVmZmVyR2VvbWV0cnkoKS5zZXRGcm9tUG9pbnRzKCBwb2ludHMgKTtcclxuICpcclxuICogY29uc3QgbGluZSA9IG5ldyBUSFJFRS5MaW5lKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuICogc2NlbmUuYWRkKCBsaW5lICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgT2JqZWN0M0RcclxuICovXHJcbmNsYXNzIExpbmUgZXh0ZW5kcyBPYmplY3QzRCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbGluZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyR2VvbWV0cnl9IFtnZW9tZXRyeV0gLSBUaGUgbGluZSBnZW9tZXRyeS5cclxuXHQgKiBAcGFyYW0ge01hdGVyaWFsfEFycmF5PE1hdGVyaWFsPn0gW21hdGVyaWFsXSAtIFRoZSBsaW5lIG1hdGVyaWFsLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpLCBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCgpICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzTGluZSA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ0xpbmUnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGxpbmUgZ2VvbWV0cnkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0J1ZmZlckdlb21ldHJ5fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdlb21ldHJ5ID0gZ2VvbWV0cnk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbGluZSBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7TWF0ZXJpYWx8QXJyYXk8TWF0ZXJpYWw+fVxyXG5cdFx0ICogQGRlZmF1bHQgTGluZUJhc2ljTWF0ZXJpYWxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tYXRlcmlhbCA9IG1hdGVyaWFsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBkaWN0aW9uYXJ5IHJlcHJlc2VudGluZyB0aGUgbW9ycGggdGFyZ2V0cyBpbiB0aGUgZ2VvbWV0cnkuIFRoZSBrZXkgaXMgdGhlXHJcblx0XHQgKiBtb3JwaCB0YXJnZXRzIG5hbWUsIHRoZSB2YWx1ZSBpdHMgYXR0cmlidXRlIGluZGV4LiBUaGlzIG1lbWJlciBpcyBgdW5kZWZpbmVkYFxyXG5cdFx0ICogYnkgZGVmYXVsdCBhbmQgb25seSBzZXQgd2hlbiBtb3JwaCB0YXJnZXRzIGFyZSBkZXRlY3RlZCBpbiB0aGUgZ2VvbWV0cnkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdDxTdHJpbmcsbnVtYmVyPnx1bmRlZmluZWR9XHJcblx0XHQgKiBAZGVmYXVsdCB1bmRlZmluZWRcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnkgPSB1bmRlZmluZWQ7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBhcnJheSBvZiB3ZWlnaHRzIHR5cGljYWxseSBpbiB0aGUgcmFuZ2UgYFswLDFdYCB0aGF0IHNwZWNpZnkgaG93IG11Y2ggb2YgdGhlIG1vcnBoXHJcblx0XHQgKiBpcyBhcHBsaWVkLiBUaGlzIG1lbWJlciBpcyBgdW5kZWZpbmVkYCBieSBkZWZhdWx0IGFuZCBvbmx5IHNldCB3aGVuIG1vcnBoIHRhcmdldHMgYXJlXHJcblx0XHQgKiBkZXRlY3RlZCBpbiB0aGUgZ2VvbWV0cnkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PG51bWJlcj58dW5kZWZpbmVkfVxyXG5cdFx0ICogQGRlZmF1bHQgdW5kZWZpbmVkXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzID0gdW5kZWZpbmVkO1xyXG5cclxuXHRcdHRoaXMudXBkYXRlTW9ycGhUYXJnZXRzKCk7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlLCByZWN1cnNpdmUgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlLCByZWN1cnNpdmUgKTtcclxuXHJcblx0XHR0aGlzLm1hdGVyaWFsID0gQXJyYXkuaXNBcnJheSggc291cmNlLm1hdGVyaWFsICkgPyBzb3VyY2UubWF0ZXJpYWwuc2xpY2UoKSA6IHNvdXJjZS5tYXRlcmlhbDtcclxuXHRcdHRoaXMuZ2VvbWV0cnkgPSBzb3VyY2UuZ2VvbWV0cnk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgYW4gYXJyYXkgb2YgZGlzdGFuY2UgdmFsdWVzIHdoaWNoIGFyZSBuZWNlc3NhcnkgZm9yIHJlbmRlcmluZyBkYXNoZWQgbGluZXMuXHJcblx0ICogRm9yIGVhY2ggdmVydGV4IGluIHRoZSBnZW9tZXRyeSwgdGhlIG1ldGhvZCBjYWxjdWxhdGVzIHRoZSBjdW11bGF0aXZlIGxlbmd0aCBmcm9tIHRoZVxyXG5cdCAqIGN1cnJlbnQgcG9pbnQgdG8gdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHRoZSBsaW5lLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7TGluZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBsaW5lLlxyXG5cdCAqL1xyXG5cdGNvbXB1dGVMaW5lRGlzdGFuY2VzKCkge1xyXG5cclxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcclxuXHJcblx0XHQvLyB3ZSBhc3N1bWUgbm9uLWluZGV4ZWQgZ2VvbWV0cnlcclxuXHJcblx0XHRpZiAoIGdlb21ldHJ5LmluZGV4ID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0Y29uc3QgcG9zaXRpb25BdHRyaWJ1dGUgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xyXG5cdFx0XHRjb25zdCBsaW5lRGlzdGFuY2VzID0gWyAwIF07XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDEsIGwgPSBwb3NpdGlvbkF0dHJpYnV0ZS5jb3VudDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdF92U3RhcnQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyaWJ1dGUsIGkgLSAxICk7XHJcblx0XHRcdFx0X3ZFbmQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyaWJ1dGUsIGkgKTtcclxuXHJcblx0XHRcdFx0bGluZURpc3RhbmNlc1sgaSBdID0gbGluZURpc3RhbmNlc1sgaSAtIDEgXTtcclxuXHRcdFx0XHRsaW5lRGlzdGFuY2VzWyBpIF0gKz0gX3ZTdGFydC5kaXN0YW5jZVRvKCBfdkVuZCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Z2VvbWV0cnkuc2V0QXR0cmlidXRlKCAnbGluZURpc3RhbmNlJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGxpbmVEaXN0YW5jZXMsIDEgKSApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaW5lLmNvbXB1dGVMaW5lRGlzdGFuY2VzKCk6IENvbXB1dGF0aW9uIG9ubHkgcG9zc2libGUgd2l0aCBub24taW5kZXhlZCBCdWZmZXJHZW9tZXRyeS4nICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIGludGVyc2VjdGlvbiBwb2ludHMgYmV0d2VlbiBhIGNhc3RlZCByYXkgYW5kIHRoaXMgbGluZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmF5Y2FzdGVyfSByYXljYXN0ZXIgLSBUaGUgcmF5Y2FzdGVyLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8T2JqZWN0Pn0gaW50ZXJzZWN0cyAtIFRoZSB0YXJnZXQgYXJyYXkgdGhhdCBob2xkcyB0aGUgaW50ZXJzZWN0aW9uIHBvaW50cy5cclxuXHQgKi9cclxuXHRyYXljYXN0KCByYXljYXN0ZXIsIGludGVyc2VjdHMgKSB7XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xyXG5cdFx0Y29uc3QgbWF0cml4V29ybGQgPSB0aGlzLm1hdHJpeFdvcmxkO1xyXG5cdFx0Y29uc3QgdGhyZXNob2xkID0gcmF5Y2FzdGVyLnBhcmFtcy5MaW5lLnRocmVzaG9sZDtcclxuXHRcdGNvbnN0IGRyYXdSYW5nZSA9IGdlb21ldHJ5LmRyYXdSYW5nZTtcclxuXHJcblx0XHQvLyBDaGVja2luZyBib3VuZGluZ1NwaGVyZSBkaXN0YW5jZSB0byByYXlcclxuXHJcblx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID09PSBudWxsICkgZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XHJcblxyXG5cdFx0X3NwaGVyZS5jb3B5KCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSApO1xyXG5cdFx0X3NwaGVyZS5hcHBseU1hdHJpeDQoIG1hdHJpeFdvcmxkICk7XHJcblx0XHRfc3BoZXJlLnJhZGl1cyArPSB0aHJlc2hvbGQ7XHJcblxyXG5cdFx0aWYgKCByYXljYXN0ZXIucmF5LmludGVyc2VjdHNTcGhlcmUoIF9zcGhlcmUgKSA9PT0gZmFsc2UgKSByZXR1cm47XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRfaW52ZXJzZU1hdHJpeC5jb3B5KCBtYXRyaXhXb3JsZCApLmludmVydCgpO1xyXG5cdFx0X3JheS5jb3B5KCByYXljYXN0ZXIucmF5ICkuYXBwbHlNYXRyaXg0KCBfaW52ZXJzZU1hdHJpeCApO1xyXG5cclxuXHRcdGNvbnN0IGxvY2FsVGhyZXNob2xkID0gdGhyZXNob2xkIC8gKCAoIHRoaXMuc2NhbGUueCArIHRoaXMuc2NhbGUueSArIHRoaXMuc2NhbGUueiApIC8gMyApO1xyXG5cdFx0Y29uc3QgbG9jYWxUaHJlc2hvbGRTcSA9IGxvY2FsVGhyZXNob2xkICogbG9jYWxUaHJlc2hvbGQ7XHJcblxyXG5cdFx0Y29uc3Qgc3RlcCA9IHRoaXMuaXNMaW5lU2VnbWVudHMgPyAyIDogMTtcclxuXHJcblx0XHRjb25zdCBpbmRleCA9IGdlb21ldHJ5LmluZGV4O1xyXG5cdFx0Y29uc3QgYXR0cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXM7XHJcblx0XHRjb25zdCBwb3NpdGlvbkF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMucG9zaXRpb247XHJcblxyXG5cdFx0aWYgKCBpbmRleCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGNvbnN0IHN0YXJ0ID0gTWF0aC5tYXgoIDAsIGRyYXdSYW5nZS5zdGFydCApO1xyXG5cdFx0XHRjb25zdCBlbmQgPSBNYXRoLm1pbiggaW5kZXguY291bnQsICggZHJhd1JhbmdlLnN0YXJ0ICsgZHJhd1JhbmdlLmNvdW50ICkgKTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gc3RhcnQsIGwgPSBlbmQgLSAxOyBpIDwgbDsgaSArPSBzdGVwICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBhID0gaW5kZXguZ2V0WCggaSApO1xyXG5cdFx0XHRcdGNvbnN0IGIgPSBpbmRleC5nZXRYKCBpICsgMSApO1xyXG5cclxuXHRcdFx0XHRjb25zdCBpbnRlcnNlY3QgPSBjaGVja0ludGVyc2VjdGlvbiggdGhpcywgcmF5Y2FzdGVyLCBfcmF5LCBsb2NhbFRocmVzaG9sZFNxLCBhLCBiLCBpICk7XHJcblxyXG5cdFx0XHRcdGlmICggaW50ZXJzZWN0ICkge1xyXG5cclxuXHRcdFx0XHRcdGludGVyc2VjdHMucHVzaCggaW50ZXJzZWN0ICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggdGhpcy5pc0xpbmVMb29wICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBhID0gaW5kZXguZ2V0WCggZW5kIC0gMSApO1xyXG5cdFx0XHRcdGNvbnN0IGIgPSBpbmRleC5nZXRYKCBzdGFydCApO1xyXG5cclxuXHRcdFx0XHRjb25zdCBpbnRlcnNlY3QgPSBjaGVja0ludGVyc2VjdGlvbiggdGhpcywgcmF5Y2FzdGVyLCBfcmF5LCBsb2NhbFRocmVzaG9sZFNxLCBhLCBiLCBlbmQgLSAxICk7XHJcblxyXG5cdFx0XHRcdGlmICggaW50ZXJzZWN0ICkge1xyXG5cclxuXHRcdFx0XHRcdGludGVyc2VjdHMucHVzaCggaW50ZXJzZWN0ICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc3Qgc3RhcnQgPSBNYXRoLm1heCggMCwgZHJhd1JhbmdlLnN0YXJ0ICk7XHJcblx0XHRcdGNvbnN0IGVuZCA9IE1hdGgubWluKCBwb3NpdGlvbkF0dHJpYnV0ZS5jb3VudCwgKCBkcmF3UmFuZ2Uuc3RhcnQgKyBkcmF3UmFuZ2UuY291bnQgKSApO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSBzdGFydCwgbCA9IGVuZCAtIDE7IGkgPCBsOyBpICs9IHN0ZXAgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGludGVyc2VjdCA9IGNoZWNrSW50ZXJzZWN0aW9uKCB0aGlzLCByYXljYXN0ZXIsIF9yYXksIGxvY2FsVGhyZXNob2xkU3EsIGksIGkgKyAxLCBpICk7XHJcblxyXG5cdFx0XHRcdGlmICggaW50ZXJzZWN0ICkge1xyXG5cclxuXHRcdFx0XHRcdGludGVyc2VjdHMucHVzaCggaW50ZXJzZWN0ICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggdGhpcy5pc0xpbmVMb29wICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBpbnRlcnNlY3QgPSBjaGVja0ludGVyc2VjdGlvbiggdGhpcywgcmF5Y2FzdGVyLCBfcmF5LCBsb2NhbFRocmVzaG9sZFNxLCBlbmQgLSAxLCBzdGFydCwgZW5kIC0gMSApO1xyXG5cclxuXHRcdFx0XHRpZiAoIGludGVyc2VjdCApIHtcclxuXHJcblx0XHRcdFx0XHRpbnRlcnNlY3RzLnB1c2goIGludGVyc2VjdCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHZhbHVlcyBvZiB7QGxpbmsgTGluZSNtb3JwaFRhcmdldERpY3Rpb25hcnl9IGFuZCB7QGxpbmsgTGluZSNtb3JwaFRhcmdldEluZmx1ZW5jZXN9XHJcblx0ICogdG8gbWFrZSBzdXJlIGV4aXN0aW5nIG1vcnBoIHRhcmdldHMgY2FuIGluZmx1ZW5jZSB0aGlzIDNEIG9iamVjdC5cclxuXHQgKi9cclxuXHR1cGRhdGVNb3JwaFRhcmdldHMoKSB7XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xyXG5cclxuXHRcdGNvbnN0IG1vcnBoQXR0cmlidXRlcyA9IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcztcclxuXHRcdGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyggbW9ycGhBdHRyaWJ1dGVzICk7XHJcblxyXG5cdFx0aWYgKCBrZXlzLmxlbmd0aCA+IDAgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBtb3JwaEF0dHJpYnV0ZSA9IG1vcnBoQXR0cmlidXRlc1sga2V5c1sgMCBdIF07XHJcblxyXG5cdFx0XHRpZiAoIG1vcnBoQXR0cmlidXRlICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzID0gW107XHJcblx0XHRcdFx0dGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnkgPSB7fTtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IG0gPSAwLCBtbCA9IG1vcnBoQXR0cmlidXRlLmxlbmd0aDsgbSA8IG1sOyBtICsrICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IG5hbWUgPSBtb3JwaEF0dHJpYnV0ZVsgbSBdLm5hbWUgfHwgU3RyaW5nKCBtICk7XHJcblxyXG5cdFx0XHRcdFx0dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMucHVzaCggMCApO1xyXG5cdFx0XHRcdFx0dGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnlbIG5hbWUgXSA9IG07XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNoZWNrSW50ZXJzZWN0aW9uKCBvYmplY3QsIHJheWNhc3RlciwgcmF5LCB0aHJlc2hvbGRTcSwgYSwgYiwgaSApIHtcclxuXHJcblx0Y29uc3QgcG9zaXRpb25BdHRyaWJ1dGUgPSBvYmplY3QuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjtcclxuXHJcblx0X3ZTdGFydC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbkF0dHJpYnV0ZSwgYSApO1xyXG5cdF92RW5kLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uQXR0cmlidXRlLCBiICk7XHJcblxyXG5cdGNvbnN0IGRpc3RTcSA9IHJheS5kaXN0YW5jZVNxVG9TZWdtZW50KCBfdlN0YXJ0LCBfdkVuZCwgX2ludGVyc2VjdFBvaW50T25SYXksIF9pbnRlcnNlY3RQb2ludE9uU2VnbWVudCApO1xyXG5cclxuXHRpZiAoIGRpc3RTcSA+IHRocmVzaG9sZFNxICkgcmV0dXJuO1xyXG5cclxuXHRfaW50ZXJzZWN0UG9pbnRPblJheS5hcHBseU1hdHJpeDQoIG9iamVjdC5tYXRyaXhXb3JsZCApOyAvLyBNb3ZlIGJhY2sgdG8gd29ybGQgc3BhY2UgZm9yIGRpc3RhbmNlIGNhbGN1bGF0aW9uXHJcblxyXG5cdGNvbnN0IGRpc3RhbmNlID0gcmF5Y2FzdGVyLnJheS5vcmlnaW4uZGlzdGFuY2VUbyggX2ludGVyc2VjdFBvaW50T25SYXkgKTtcclxuXHJcblx0aWYgKCBkaXN0YW5jZSA8IHJheWNhc3Rlci5uZWFyIHx8IGRpc3RhbmNlID4gcmF5Y2FzdGVyLmZhciApIHJldHVybjtcclxuXHJcblx0cmV0dXJuIHtcclxuXHJcblx0XHRkaXN0YW5jZTogZGlzdGFuY2UsXHJcblx0XHQvLyBXaGF0IGRvIHdlIHdhbnQ/IGludGVyc2VjdGlvbiBwb2ludCBvbiB0aGUgcmF5IG9yIG9uIHRoZSBzZWdtZW50Pz9cclxuXHRcdC8vIHBvaW50OiByYXljYXN0ZXIucmF5LmF0KCBkaXN0YW5jZSApLFxyXG5cdFx0cG9pbnQ6IF9pbnRlcnNlY3RQb2ludE9uU2VnbWVudC5jbG9uZSgpLmFwcGx5TWF0cml4NCggb2JqZWN0Lm1hdHJpeFdvcmxkICksXHJcblx0XHRpbmRleDogaSxcclxuXHRcdGZhY2U6IG51bGwsXHJcblx0XHRmYWNlSW5kZXg6IG51bGwsXHJcblx0XHRiYXJ5Y29vcmQ6IG51bGwsXHJcblx0XHRvYmplY3Q6IG9iamVjdFxyXG5cclxuXHR9O1xyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgTGluZSB9O1xyXG4iLCJpbXBvcnQgeyBMaW5lIH0gZnJvbSAnLi9MaW5lLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcbmltcG9ydCB7IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcblxyXG5jb25zdCBfc3RhcnQgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF9lbmQgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcblxyXG4vKipcclxuICogQSBzZXJpZXMgb2YgbGluZXMgZHJhd24gYmV0d2VlbiBwYWlycyBvZiB2ZXJ0aWNlcy5cclxuICpcclxuICogQGF1Z21lbnRzIExpbmVcclxuICovXHJcbmNsYXNzIExpbmVTZWdtZW50cyBleHRlbmRzIExpbmUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGxpbmUgc2VnbWVudHMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0J1ZmZlckdlb21ldHJ5fSBbZ2VvbWV0cnldIC0gVGhlIGxpbmUgZ2VvbWV0cnkuXHJcblx0ICogQHBhcmFtIHtNYXRlcmlhbHxBcnJheTxNYXRlcmlhbD59IFttYXRlcmlhbF0gLSBUaGUgbGluZSBtYXRlcmlhbC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggZ2VvbWV0cnksIG1hdGVyaWFsICkge1xyXG5cclxuXHRcdHN1cGVyKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNMaW5lU2VnbWVudHMgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdMaW5lU2VnbWVudHMnO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvbXB1dGVMaW5lRGlzdGFuY2VzKCkge1xyXG5cclxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcclxuXHJcblx0XHQvLyB3ZSBhc3N1bWUgbm9uLWluZGV4ZWQgZ2VvbWV0cnlcclxuXHJcblx0XHRpZiAoIGdlb21ldHJ5LmluZGV4ID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0Y29uc3QgcG9zaXRpb25BdHRyaWJ1dGUgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xyXG5cdFx0XHRjb25zdCBsaW5lRGlzdGFuY2VzID0gW107XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBwb3NpdGlvbkF0dHJpYnV0ZS5jb3VudDsgaSA8IGw7IGkgKz0gMiApIHtcclxuXHJcblx0XHRcdFx0X3N0YXJ0LmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uQXR0cmlidXRlLCBpICk7XHJcblx0XHRcdFx0X2VuZC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbkF0dHJpYnV0ZSwgaSArIDEgKTtcclxuXHJcblx0XHRcdFx0bGluZURpc3RhbmNlc1sgaSBdID0gKCBpID09PSAwICkgPyAwIDogbGluZURpc3RhbmNlc1sgaSAtIDEgXTtcclxuXHRcdFx0XHRsaW5lRGlzdGFuY2VzWyBpICsgMSBdID0gbGluZURpc3RhbmNlc1sgaSBdICsgX3N0YXJ0LmRpc3RhbmNlVG8oIF9lbmQgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGdlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ2xpbmVEaXN0YW5jZScsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBsaW5lRGlzdGFuY2VzLCAxICkgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGluZVNlZ21lbnRzLmNvbXB1dGVMaW5lRGlzdGFuY2VzKCk6IENvbXB1dGF0aW9uIG9ubHkgcG9zc2libGUgd2l0aCBub24taW5kZXhlZCBCdWZmZXJHZW9tZXRyeS4nICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBMaW5lU2VnbWVudHMgfTtcclxuIiwiaW1wb3J0IHsgTGluZSB9IGZyb20gJy4vTGluZS5qcyc7XHJcblxyXG4vKipcclxuICogQSBjb250aW51b3VzIGxpbmUuIFRoaXMgaXMgbmVhcmx5IHRoZSBzYW1lIGFzIHtAbGluayBMaW5lfSB0aGUgb25seSBkaWZmZXJlbmNlXHJcbiAqIGlzIHRoYXQgdGhlIGxhc3QgdmVydGV4IGlzIGNvbm5lY3RlZCB3aXRoIHRoZSBmaXJzdCB2ZXJ0ZXggaW4gb3JkZXIgdG8gY2xvc2VcclxuICogdGhlIGxpbmUgdG8gZm9ybSBhIGxvb3AuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBMaW5lXHJcbiAqL1xyXG5jbGFzcyBMaW5lTG9vcCBleHRlbmRzIExpbmUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGxpbmUgbG9vcC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyR2VvbWV0cnl9IFtnZW9tZXRyeV0gLSBUaGUgbGluZSBnZW9tZXRyeS5cclxuXHQgKiBAcGFyYW0ge01hdGVyaWFsfEFycmF5PE1hdGVyaWFsPn0gW21hdGVyaWFsXSAtIFRoZSBsaW5lIG1hdGVyaWFsLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKSB7XHJcblxyXG5cdFx0c3VwZXIoIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0xpbmVMb29wID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnTGluZUxvb3AnO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBMaW5lTG9vcCB9O1xyXG4iLCJpbXBvcnQgeyBNYXRlcmlhbCB9IGZyb20gJy4vTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uL21hdGgvQ29sb3IuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgbWF0ZXJpYWwgZm9yIHJlbmRlcmluZyBwb2ludCBwcmltaXRpdmVzLlxyXG4gKlxyXG4gKiBNYXRlcmlhbHMgZGVmaW5lIHRoZSBhcHBlYXJhbmNlIG9mIHJlbmRlcmFibGUgM0Qgb2JqZWN0cy5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgdmVydGljZXMgPSBbXTtcclxuICpcclxuICogZm9yICggbGV0IGkgPSAwOyBpIDwgMTAwMDA7IGkgKysgKSB7XHJcbiAqIFx0Y29uc3QgeCA9IFRIUkVFLk1hdGhVdGlscy5yYW5kRmxvYXRTcHJlYWQoIDIwMDAgKTtcclxuICogXHRjb25zdCB5ID0gVEhSRUUuTWF0aFV0aWxzLnJhbmRGbG9hdFNwcmVhZCggMjAwMCApO1xyXG4gKiBcdGNvbnN0IHogPSBUSFJFRS5NYXRoVXRpbHMucmFuZEZsb2F0U3ByZWFkKCAyMDAwICk7XHJcbiAqXHJcbiAqIFx0dmVydGljZXMucHVzaCggeCwgeSwgeiApO1xyXG4gKiB9XHJcbiAqXHJcbiAqIGNvbnN0IGdlb21ldHJ5ID0gbmV3IFRIUkVFLkJ1ZmZlckdlb21ldHJ5KCk7XHJcbiAqIGdlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IFRIUkVFLkZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcclxuICogY29uc3QgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuUG9pbnRzTWF0ZXJpYWwoIHsgY29sb3I6IDB4ODg4ODg4IH0gKTtcclxuICogY29uc3QgcG9pbnRzID0gbmV3IFRIUkVFLlBvaW50cyggZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcbiAqIHNjZW5lLmFkZCggcG9pbnRzICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTWF0ZXJpYWxcclxuICovXHJcbmNsYXNzIFBvaW50c01hdGVyaWFsIGV4dGVuZHMgTWF0ZXJpYWwge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHBvaW50cyBtYXRlcmlhbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1ldGVyc10gLSBBbiBvYmplY3Qgd2l0aCBvbmUgb3IgbW9yZSBwcm9wZXJ0aWVzXHJcblx0ICogZGVmaW5pbmcgdGhlIG1hdGVyaWFsJ3MgYXBwZWFyYW5jZS4gQW55IHByb3BlcnR5IG9mIHRoZSBtYXRlcmlhbFxyXG5cdCAqIChpbmNsdWRpbmcgYW55IHByb3BlcnR5IGZyb20gaW5oZXJpdGVkIG1hdGVyaWFscykgY2FuIGJlIHBhc3NlZFxyXG5cdCAqIGluIGhlcmUuIENvbG9yIHZhbHVlcyBjYW4gYmUgcGFzc2VkIGFueSB0eXBlIG9mIHZhbHVlIGFjY2VwdGVkXHJcblx0ICogYnkge0BsaW5rIENvbG9yI3NldH0uXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHBhcmFtZXRlcnMgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNQb2ludHNNYXRlcmlhbCA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ1BvaW50c01hdGVyaWFsJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENvbG9yIG9mIHRoZSBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Q29sb3J9XHJcblx0XHQgKiBAZGVmYXVsdCAoMSwxLDEpXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY29sb3IgbWFwLiBNYXkgb3B0aW9uYWxseSBpbmNsdWRlIGFuIGFscGhhIGNoYW5uZWwsIHR5cGljYWxseSBjb21iaW5lZFxyXG5cdFx0ICogd2l0aCB7QGxpbmsgTWF0ZXJpYWwjdHJhbnNwYXJlbnR9IG9yIHtAbGluayBNYXRlcmlhbCNhbHBoYVRlc3R9LiBUaGUgdGV4dHVyZSBtYXBcclxuXHRcdCAqIGNvbG9yIGlzIG1vZHVsYXRlZCBieSB0aGUgZGlmZnVzZSBgY29sb3JgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGFscGhhIG1hcCBpcyBhIGdyYXlzY2FsZSB0ZXh0dXJlIHRoYXQgY29udHJvbHMgdGhlIG9wYWNpdHkgYWNyb3NzIHRoZVxyXG5cdFx0ICogc3VyZmFjZSAoYmxhY2s6IGZ1bGx5IHRyYW5zcGFyZW50OyB3aGl0ZTogZnVsbHkgb3BhcXVlKS5cclxuXHRcdCAqXHJcblx0XHQgKiBPbmx5IHRoZSBjb2xvciBvZiB0aGUgdGV4dHVyZSBpcyB1c2VkLCBpZ25vcmluZyB0aGUgYWxwaGEgY2hhbm5lbCBpZiBvbmVcclxuXHRcdCAqIGV4aXN0cy4gRm9yIFJHQiBhbmQgUkdCQSB0ZXh0dXJlcywgdGhlIHJlbmRlcmVyIHdpbGwgdXNlIHRoZSBncmVlbiBjaGFubmVsXHJcblx0XHQgKiB3aGVuIHNhbXBsaW5nIHRoaXMgdGV4dHVyZSBkdWUgdG8gdGhlIGV4dHJhIGJpdCBvZiBwcmVjaXNpb24gcHJvdmlkZWQgZm9yXHJcblx0XHQgKiBncmVlbiBpbiBEWFQtY29tcHJlc3NlZCBhbmQgdW5jb21wcmVzc2VkIFJHQiA1NjUgZm9ybWF0cy4gTHVtaW5hbmNlLW9ubHkgYW5kXHJcblx0XHQgKiBsdW1pbmFuY2UvYWxwaGEgdGV4dHVyZXMgd2lsbCBhbHNvIHN0aWxsIHdvcmsgYXMgZXhwZWN0ZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFscGhhTWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgdGhlIHNpemUgb2YgdGhlIHBvaW50cyBpbiBwaXhlbHMuXHJcblx0XHQgKlxyXG5cdFx0ICogTWlnaHQgYmUgY2FwcGVkIGlmIHRoZSB2YWx1ZSBleGNlZWRzIGhhcmR3YXJlIGRlcGVuZGVudCBwYXJhbWV0ZXJzIGxpa2UgW2dsLkFMSUFTRURfUE9JTlRfU0laRV9SQU5HRV17QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dlYkdMUmVuZGVyaW5nQ29udGV4dC9nZXRQYXJhbWV0ZX0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zaXplID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNwZWNpZmllcyB3aGV0aGVyIHNpemUgb2YgaW5kaXZpZHVhbCBwb2ludHMgaXMgYXR0ZW51YXRlZCBieSB0aGUgY2FtZXJhIGRlcHRoIChwZXJzcGVjdGl2ZSBjYW1lcmEgb25seSkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2l6ZUF0dGVudWF0aW9uID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIG1hdGVyaWFsIGlzIGFmZmVjdGVkIGJ5IGZvZyBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZm9nID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xyXG5cclxuXHRcdHRoaXMubWFwID0gc291cmNlLm1hcDtcclxuXHJcblx0XHR0aGlzLmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwO1xyXG5cclxuXHRcdHRoaXMuc2l6ZSA9IHNvdXJjZS5zaXplO1xyXG5cdFx0dGhpcy5zaXplQXR0ZW51YXRpb24gPSBzb3VyY2Uuc2l6ZUF0dGVudWF0aW9uO1xyXG5cclxuXHRcdHRoaXMuZm9nID0gc291cmNlLmZvZztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgUG9pbnRzTWF0ZXJpYWwgfTtcclxuIiwiaW1wb3J0IHsgU3BoZXJlIH0gZnJvbSAnLi4vbWF0aC9TcGhlcmUuanMnO1xyXG5pbXBvcnQgeyBSYXkgfSBmcm9tICcuLi9tYXRoL1JheS5qcyc7XHJcbmltcG9ydCB7IE1hdHJpeDQgfSBmcm9tICcuLi9tYXRoL01hdHJpeDQuanMnO1xyXG5pbXBvcnQgeyBPYmplY3QzRCB9IGZyb20gJy4uL2NvcmUvT2JqZWN0M0QuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuaW1wb3J0IHsgUG9pbnRzTWF0ZXJpYWwgfSBmcm9tICcuLi9tYXRlcmlhbHMvUG9pbnRzTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyBCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyR2VvbWV0cnkuanMnO1xyXG5cclxuY29uc3QgX2ludmVyc2VNYXRyaXggPSAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXg0KCk7XHJcbmNvbnN0IF9yYXkgPSAvKkBfX1BVUkVfXyovIG5ldyBSYXkoKTtcclxuY29uc3QgX3NwaGVyZSA9IC8qQF9fUFVSRV9fKi8gbmV3IFNwaGVyZSgpO1xyXG5jb25zdCBfcG9zaXRpb24gPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcblxyXG4vKipcclxuICogQSBjbGFzcyBmb3IgZGlzcGxheWluZyBwb2ludHMgb3IgcG9pbnQgY2xvdWRzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgT2JqZWN0M0RcclxuICovXHJcbmNsYXNzIFBvaW50cyBleHRlbmRzIE9iamVjdDNEIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBwb2ludCBjbG91ZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyR2VvbWV0cnl9IFtnZW9tZXRyeV0gLSBUaGUgcG9pbnRzIGdlb21ldHJ5LlxyXG5cdCAqIEBwYXJhbSB7TWF0ZXJpYWx8QXJyYXk8TWF0ZXJpYWw+fSBbbWF0ZXJpYWxdIC0gVGhlIHBvaW50cyBtYXRlcmlhbC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKSwgbWF0ZXJpYWwgPSBuZXcgUG9pbnRzTWF0ZXJpYWwoKSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1BvaW50cyA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ1BvaW50cyc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcG9pbnRzIGdlb21ldHJ5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtCdWZmZXJHZW9tZXRyeX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nZW9tZXRyeSA9IGdlb21ldHJ5O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGxpbmUgbWF0ZXJpYWwuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge01hdGVyaWFsfEFycmF5PE1hdGVyaWFsPn1cclxuXHRcdCAqIEBkZWZhdWx0IFBvaW50c01hdGVyaWFsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWF0ZXJpYWwgPSBtYXRlcmlhbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgZGljdGlvbmFyeSByZXByZXNlbnRpbmcgdGhlIG1vcnBoIHRhcmdldHMgaW4gdGhlIGdlb21ldHJ5LiBUaGUga2V5IGlzIHRoZVxyXG5cdFx0ICogbW9ycGggdGFyZ2V0cyBuYW1lLCB0aGUgdmFsdWUgaXRzIGF0dHJpYnV0ZSBpbmRleC4gVGhpcyBtZW1iZXIgaXMgYHVuZGVmaW5lZGBcclxuXHRcdCAqIGJ5IGRlZmF1bHQgYW5kIG9ubHkgc2V0IHdoZW4gbW9ycGggdGFyZ2V0cyBhcmUgZGV0ZWN0ZWQgaW4gdGhlIGdlb21ldHJ5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3Q8U3RyaW5nLG51bWJlcj58dW5kZWZpbmVkfVxyXG5cdFx0ICogQGRlZmF1bHQgdW5kZWZpbmVkXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5ID0gdW5kZWZpbmVkO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQW4gYXJyYXkgb2Ygd2VpZ2h0cyB0eXBpY2FsbHkgaW4gdGhlIHJhbmdlIGBbMCwxXWAgdGhhdCBzcGVjaWZ5IGhvdyBtdWNoIG9mIHRoZSBtb3JwaFxyXG5cdFx0ICogaXMgYXBwbGllZC4gVGhpcyBtZW1iZXIgaXMgYHVuZGVmaW5lZGAgYnkgZGVmYXVsdCBhbmQgb25seSBzZXQgd2hlbiBtb3JwaCB0YXJnZXRzIGFyZVxyXG5cdFx0ICogZGV0ZWN0ZWQgaW4gdGhlIGdlb21ldHJ5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxudW1iZXI+fHVuZGVmaW5lZH1cclxuXHRcdCAqIEBkZWZhdWx0IHVuZGVmaW5lZFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyA9IHVuZGVmaW5lZDtcclxuXHJcblx0XHR0aGlzLnVwZGF0ZU1vcnBoVGFyZ2V0cygpO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSwgcmVjdXJzaXZlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSwgcmVjdXJzaXZlICk7XHJcblxyXG5cdFx0dGhpcy5tYXRlcmlhbCA9IEFycmF5LmlzQXJyYXkoIHNvdXJjZS5tYXRlcmlhbCApID8gc291cmNlLm1hdGVyaWFsLnNsaWNlKCkgOiBzb3VyY2UubWF0ZXJpYWw7XHJcblx0XHR0aGlzLmdlb21ldHJ5ID0gc291cmNlLmdlb21ldHJ5O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIGludGVyc2VjdGlvbiBwb2ludHMgYmV0d2VlbiBhIGNhc3RlZCByYXkgYW5kIHRoaXMgcG9pbnQgY2xvdWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JheWNhc3Rlcn0gcmF5Y2FzdGVyIC0gVGhlIHJheWNhc3Rlci5cclxuXHQgKiBAcGFyYW0ge0FycmF5PE9iamVjdD59IGludGVyc2VjdHMgLSBUaGUgdGFyZ2V0IGFycmF5IHRoYXQgaG9sZHMgdGhlIGludGVyc2VjdGlvbiBwb2ludHMuXHJcblx0ICovXHJcblx0cmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICkge1xyXG5cclxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcclxuXHRcdGNvbnN0IG1hdHJpeFdvcmxkID0gdGhpcy5tYXRyaXhXb3JsZDtcclxuXHRcdGNvbnN0IHRocmVzaG9sZCA9IHJheWNhc3Rlci5wYXJhbXMuUG9pbnRzLnRocmVzaG9sZDtcclxuXHRcdGNvbnN0IGRyYXdSYW5nZSA9IGdlb21ldHJ5LmRyYXdSYW5nZTtcclxuXHJcblx0XHQvLyBDaGVja2luZyBib3VuZGluZ1NwaGVyZSBkaXN0YW5jZSB0byByYXlcclxuXHJcblx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID09PSBudWxsICkgZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XHJcblxyXG5cdFx0X3NwaGVyZS5jb3B5KCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSApO1xyXG5cdFx0X3NwaGVyZS5hcHBseU1hdHJpeDQoIG1hdHJpeFdvcmxkICk7XHJcblx0XHRfc3BoZXJlLnJhZGl1cyArPSB0aHJlc2hvbGQ7XHJcblxyXG5cdFx0aWYgKCByYXljYXN0ZXIucmF5LmludGVyc2VjdHNTcGhlcmUoIF9zcGhlcmUgKSA9PT0gZmFsc2UgKSByZXR1cm47XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRfaW52ZXJzZU1hdHJpeC5jb3B5KCBtYXRyaXhXb3JsZCApLmludmVydCgpO1xyXG5cdFx0X3JheS5jb3B5KCByYXljYXN0ZXIucmF5ICkuYXBwbHlNYXRyaXg0KCBfaW52ZXJzZU1hdHJpeCApO1xyXG5cclxuXHRcdGNvbnN0IGxvY2FsVGhyZXNob2xkID0gdGhyZXNob2xkIC8gKCAoIHRoaXMuc2NhbGUueCArIHRoaXMuc2NhbGUueSArIHRoaXMuc2NhbGUueiApIC8gMyApO1xyXG5cdFx0Y29uc3QgbG9jYWxUaHJlc2hvbGRTcSA9IGxvY2FsVGhyZXNob2xkICogbG9jYWxUaHJlc2hvbGQ7XHJcblxyXG5cdFx0Y29uc3QgaW5kZXggPSBnZW9tZXRyeS5pbmRleDtcclxuXHRcdGNvbnN0IGF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzO1xyXG5cdFx0Y29uc3QgcG9zaXRpb25BdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLnBvc2l0aW9uO1xyXG5cclxuXHRcdGlmICggaW5kZXggIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBzdGFydCA9IE1hdGgubWF4KCAwLCBkcmF3UmFuZ2Uuc3RhcnQgKTtcclxuXHRcdFx0Y29uc3QgZW5kID0gTWF0aC5taW4oIGluZGV4LmNvdW50LCAoIGRyYXdSYW5nZS5zdGFydCArIGRyYXdSYW5nZS5jb3VudCApICk7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IHN0YXJ0LCBpbCA9IGVuZDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBhID0gaW5kZXguZ2V0WCggaSApO1xyXG5cclxuXHRcdFx0XHRfcG9zaXRpb24uZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyaWJ1dGUsIGEgKTtcclxuXHJcblx0XHRcdFx0dGVzdFBvaW50KCBfcG9zaXRpb24sIGEsIGxvY2FsVGhyZXNob2xkU3EsIG1hdHJpeFdvcmxkLCByYXljYXN0ZXIsIGludGVyc2VjdHMsIHRoaXMgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc3Qgc3RhcnQgPSBNYXRoLm1heCggMCwgZHJhd1JhbmdlLnN0YXJ0ICk7XHJcblx0XHRcdGNvbnN0IGVuZCA9IE1hdGgubWluKCBwb3NpdGlvbkF0dHJpYnV0ZS5jb3VudCwgKCBkcmF3UmFuZ2Uuc3RhcnQgKyBkcmF3UmFuZ2UuY291bnQgKSApO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSBzdGFydCwgbCA9IGVuZDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdF9wb3NpdGlvbi5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbkF0dHJpYnV0ZSwgaSApO1xyXG5cclxuXHRcdFx0XHR0ZXN0UG9pbnQoIF9wb3NpdGlvbiwgaSwgbG9jYWxUaHJlc2hvbGRTcSwgbWF0cml4V29ybGQsIHJheWNhc3RlciwgaW50ZXJzZWN0cywgdGhpcyApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB2YWx1ZXMgb2Yge0BsaW5rIFBvaW50cyNtb3JwaFRhcmdldERpY3Rpb25hcnl9IGFuZCB7QGxpbmsgUG9pbnRzI21vcnBoVGFyZ2V0SW5mbHVlbmNlc31cclxuXHQgKiB0byBtYWtlIHN1cmUgZXhpc3RpbmcgbW9ycGggdGFyZ2V0cyBjYW4gaW5mbHVlbmNlIHRoaXMgM0Qgb2JqZWN0LlxyXG5cdCAqL1xyXG5cdHVwZGF0ZU1vcnBoVGFyZ2V0cygpIHtcclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XHJcblxyXG5cdFx0Y29uc3QgbW9ycGhBdHRyaWJ1dGVzID0gZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzO1xyXG5cdFx0Y29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKCBtb3JwaEF0dHJpYnV0ZXMgKTtcclxuXHJcblx0XHRpZiAoIGtleXMubGVuZ3RoID4gMCApIHtcclxuXHJcblx0XHRcdGNvbnN0IG1vcnBoQXR0cmlidXRlID0gbW9ycGhBdHRyaWJ1dGVzWyBrZXlzWyAwIF0gXTtcclxuXHJcblx0XHRcdGlmICggbW9ycGhBdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMgPSBbXTtcclxuXHRcdFx0XHR0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeSA9IHt9O1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgbSA9IDAsIG1sID0gbW9ycGhBdHRyaWJ1dGUubGVuZ3RoOyBtIDwgbWw7IG0gKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgbmFtZSA9IG1vcnBoQXR0cmlidXRlWyBtIF0ubmFtZSB8fCBTdHJpbmcoIG0gKTtcclxuXHJcblx0XHRcdFx0XHR0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5wdXNoKCAwICk7XHJcblx0XHRcdFx0XHR0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeVsgbmFtZSBdID0gbTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gdGVzdFBvaW50KCBwb2ludCwgaW5kZXgsIGxvY2FsVGhyZXNob2xkU3EsIG1hdHJpeFdvcmxkLCByYXljYXN0ZXIsIGludGVyc2VjdHMsIG9iamVjdCApIHtcclxuXHJcblx0Y29uc3QgcmF5UG9pbnREaXN0YW5jZVNxID0gX3JheS5kaXN0YW5jZVNxVG9Qb2ludCggcG9pbnQgKTtcclxuXHJcblx0aWYgKCByYXlQb2ludERpc3RhbmNlU3EgPCBsb2NhbFRocmVzaG9sZFNxICkge1xyXG5cclxuXHRcdGNvbnN0IGludGVyc2VjdFBvaW50ID0gbmV3IFZlY3RvcjMoKTtcclxuXHJcblx0XHRfcmF5LmNsb3Nlc3RQb2ludFRvUG9pbnQoIHBvaW50LCBpbnRlcnNlY3RQb2ludCApO1xyXG5cdFx0aW50ZXJzZWN0UG9pbnQuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApO1xyXG5cclxuXHRcdGNvbnN0IGRpc3RhbmNlID0gcmF5Y2FzdGVyLnJheS5vcmlnaW4uZGlzdGFuY2VUbyggaW50ZXJzZWN0UG9pbnQgKTtcclxuXHJcblx0XHRpZiAoIGRpc3RhbmNlIDwgcmF5Y2FzdGVyLm5lYXIgfHwgZGlzdGFuY2UgPiByYXljYXN0ZXIuZmFyICkgcmV0dXJuO1xyXG5cclxuXHRcdGludGVyc2VjdHMucHVzaCgge1xyXG5cclxuXHRcdFx0ZGlzdGFuY2U6IGRpc3RhbmNlLFxyXG5cdFx0XHRkaXN0YW5jZVRvUmF5OiBNYXRoLnNxcnQoIHJheVBvaW50RGlzdGFuY2VTcSApLFxyXG5cdFx0XHRwb2ludDogaW50ZXJzZWN0UG9pbnQsXHJcblx0XHRcdGluZGV4OiBpbmRleCxcclxuXHRcdFx0ZmFjZTogbnVsbCxcclxuXHRcdFx0ZmFjZUluZGV4OiBudWxsLFxyXG5cdFx0XHRiYXJ5Y29vcmQ6IG51bGwsXHJcblx0XHRcdG9iamVjdDogb2JqZWN0XHJcblxyXG5cdFx0fSApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBQb2ludHMgfTtcclxuIiwiaW1wb3J0IHsgTGluZWFyRmlsdGVyIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgVGV4dHVyZSB9IGZyb20gJy4vVGV4dHVyZS5qcyc7XHJcblxyXG4vKipcclxuICogQSB0ZXh0dXJlIGZvciB1c2Ugd2l0aCBhIHZpZGVvLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiAvLyBhc3N1bWluZyB5b3UgaGF2ZSBjcmVhdGVkIGEgSFRNTCB2aWRlbyBlbGVtZW50IHdpdGggaWQ9XCJ2aWRlb1wiXHJcbiAqIGNvbnN0IHZpZGVvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoICd2aWRlbycgKTtcclxuICogY29uc3QgdGV4dHVyZSA9IG5ldyBUSFJFRS5WaWRlb1RleHR1cmUoIHZpZGVvICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBOb3RlOiBBZnRlciB0aGUgaW5pdGlhbCB1c2Ugb2YgYSB0ZXh0dXJlLCBpdHMgZGltZW5zaW9ucywgZm9ybWF0LCBhbmQgdHlwZVxyXG4gKiBjYW5ub3QgYmUgY2hhbmdlZC4gSW5zdGVhZCwgY2FsbCB7QGxpbmsgVGV4dHVyZSNkaXNwb3NlfSBvbiB0aGUgdGV4dHVyZSBhbmQgaW5zdGFudGlhdGUgYSBuZXcgb25lLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgVGV4dHVyZVxyXG4gKi9cclxuY2xhc3MgVmlkZW9UZXh0dXJlIGV4dGVuZHMgVGV4dHVyZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgdmlkZW8gdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmlkZW99IHZpZGVvIC0gVGhlIHZpZGVvIGVsZW1lbnQgdG8gdXNlIGFzIGEgZGF0YSBzb3VyY2UgZm9yIHRoZSB0ZXh0dXJlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbWFwcGluZz1UZXh0dXJlLkRFRkFVTFRfTUFQUElOR10gLSBUaGUgdGV4dHVyZSBtYXBwaW5nLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbd3JhcFM9Q2xhbXBUb0VkZ2VXcmFwcGluZ10gLSBUaGUgd3JhcFMgdmFsdWUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt3cmFwVD1DbGFtcFRvRWRnZVdyYXBwaW5nXSAtIFRoZSB3cmFwVCB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW21hZ0ZpbHRlcj1MaW5lYXJGaWx0ZXJdIC0gVGhlIG1hZyBmaWx0ZXIgdmFsdWUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFttaW5GaWx0ZXI9TGluZWFyRmlsdGVyXSAtIFRoZSBtaW4gZmlsdGVyIHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZm9ybWF0PVJHQkFGb3JtYXRdIC0gVGhlIHRleHR1cmUgZm9ybWF0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbdHlwZT1VbnNpZ25lZEJ5dGVUeXBlXSAtIFRoZSB0ZXh0dXJlIHR5cGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFthbmlzb3Ryb3B5PVRleHR1cmUuREVGQVVMVF9BTklTT1RST1BZXSAtIFRoZSBhbmlzb3Ryb3B5IHZhbHVlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCB2aWRlbywgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIgPSBMaW5lYXJGaWx0ZXIsIG1pbkZpbHRlciA9IExpbmVhckZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5ICkge1xyXG5cclxuXHRcdHN1cGVyKCB2aWRlbywgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5ICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzVmlkZW9UZXh0dXJlID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdG8gZ2VuZXJhdGUgbWlwbWFwcyAoaWYgcG9zc2libGUpIGZvciBhIHRleHR1cmUuXHJcblx0XHQgKlxyXG5cdFx0ICogT3ZlcndyaXR0ZW4gYW5kIHNldCB0byBgZmFsc2VgIGJ5IGRlZmF1bHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xyXG5cclxuXHRcdGNvbnN0IHNjb3BlID0gdGhpcztcclxuXHJcblx0XHRmdW5jdGlvbiB1cGRhdGVWaWRlbygpIHtcclxuXHJcblx0XHRcdHNjb3BlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHRcdFx0dmlkZW8ucmVxdWVzdFZpZGVvRnJhbWVDYWxsYmFjayggdXBkYXRlVmlkZW8gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCAncmVxdWVzdFZpZGVvRnJhbWVDYWxsYmFjaycgaW4gdmlkZW8gKSB7XHJcblxyXG5cdFx0XHR2aWRlby5yZXF1ZXN0VmlkZW9GcmFtZUNhbGxiYWNrKCB1cGRhdGVWaWRlbyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRjbG9uZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuaW1hZ2UgKS5jb3B5KCB0aGlzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIHJlbmRlcmVyIGFuZCBzZXRzIHtAbGluayBUZXh0dXJlI25lZWRzVXBkYXRlfVxyXG5cdCAqIHRvIGB0cnVlYCBldmVyeSB0aW1lIGEgbmV3IGZyYW1lIGlzIGF2YWlsYWJsZS5cclxuXHQgKlxyXG5cdCAqIE9ubHkgcmVsZXZhbnQgaWYgYHJlcXVlc3RWaWRlb0ZyYW1lQ2FsbGJhY2tgIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGJyb3dzZXIuXHJcblx0ICovXHJcblx0dXBkYXRlKCkge1xyXG5cclxuXHRcdGNvbnN0IHZpZGVvID0gdGhpcy5pbWFnZTtcclxuXHRcdGNvbnN0IGhhc1ZpZGVvRnJhbWVDYWxsYmFjayA9ICdyZXF1ZXN0VmlkZW9GcmFtZUNhbGxiYWNrJyBpbiB2aWRlbztcclxuXHJcblx0XHRpZiAoIGhhc1ZpZGVvRnJhbWVDYWxsYmFjayA9PT0gZmFsc2UgJiYgdmlkZW8ucmVhZHlTdGF0ZSA+PSB2aWRlby5IQVZFX0NVUlJFTlRfREFUQSApIHtcclxuXHJcblx0XHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgVmlkZW9UZXh0dXJlIH07XHJcbiIsImltcG9ydCB7IFZpZGVvVGV4dHVyZSB9IGZyb20gJy4vVmlkZW9UZXh0dXJlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIGFzIGFuIGFsdGVybmF0aXZlIHdheSB0byBkZWZpbmUgdmlkZW8gZGF0YS4gSW5zdGVhZCBvZiB1c2luZ1xyXG4gKiBhbiBpbnN0YW5jZSBvZiBgSFRNTFZpZGVvRWxlbWVudGAgbGlrZSB3aXRoIGBWaWRlb1RleHR1cmVgLCBgVmlkZW9GcmFtZVRleHR1cmVgIGV4cGVjdHMgZWFjaCBmcmFtZSBpc1xyXG4gKiBkZWZpbmVkIG1hbnVhbGx5IHZpYSB7QGxpbmsgVmlkZW9GcmFtZVRleHR1cmUjc2V0RnJhbWV9LiBBIHR5cGljYWwgdXNlIGNhc2UgZm9yIHRoaXMgbW9kdWxlIGlzIHdoZW5cclxuICogdmlkZW8gZnJhbWVzIGFyZSBkZWNvZGVkIHdpdGggdGhlIFdlYkNvZGVjcyBBUEkuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IHRleHR1cmUgPSBuZXcgVEhSRUUuVmlkZW9GcmFtZVRleHR1cmUoKTtcclxuICogdGV4dHVyZS5zZXRGcmFtZSggZnJhbWUgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBWaWRlb1RleHR1cmVcclxuICovXHJcbmNsYXNzIFZpZGVvRnJhbWVUZXh0dXJlIGV4dGVuZHMgVmlkZW9UZXh0dXJlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB2aWRlbyBmcmFtZSB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFttYXBwaW5nPVRleHR1cmUuREVGQVVMVF9NQVBQSU5HXSAtIFRoZSB0ZXh0dXJlIG1hcHBpbmcuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt3cmFwUz1DbGFtcFRvRWRnZVdyYXBwaW5nXSAtIFRoZSB3cmFwUyB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3dyYXBUPUNsYW1wVG9FZGdlV3JhcHBpbmddIC0gVGhlIHdyYXBUIHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbWFnRmlsdGVyPUxpbmVhckZpbHRlcl0gLSBUaGUgbWFnIGZpbHRlciB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW21pbkZpbHRlcj1MaW5lYXJGaWx0ZXJdIC0gVGhlIG1pbiBmaWx0ZXIgdmFsdWUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtmb3JtYXQ9UkdCQUZvcm1hdF0gLSBUaGUgdGV4dHVyZSBmb3JtYXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt0eXBlPVVuc2lnbmVkQnl0ZVR5cGVdIC0gVGhlIHRleHR1cmUgdHlwZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2FuaXNvdHJvcHk9VGV4dHVyZS5ERUZBVUxUX0FOSVNPVFJPUFldIC0gVGhlIGFuaXNvdHJvcHkgdmFsdWUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSApIHtcclxuXHJcblx0XHRzdXBlcigge30sIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1ZpZGVvRnJhbWVUZXh0dXJlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBvdmVyd3JpdHRlbiB3aXRoIGFuIGVtcHR5IGltcGxlbWVudGF0aW9uIHNpbmNlXHJcblx0ICogdGhpcyB0eXBlIG9mIHRleHR1cmUgaXMgdXBkYXRlZCB2aWEgYHNldEZyYW1lKClgLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZSgpIHt9XHJcblxyXG5cdGNsb25lKCkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTsgLy8gcmVzdG9yaW5nIFRleHR1cmUuY2xvbmUoKVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGN1cnJlbnQgZnJhbWUgb2YgdGhlIHZpZGVvLiBUaGlzIHdpbGwgYXV0b21hdGljYWxseSB1cGRhdGUgdGhlIHRleHR1cmVcclxuXHQgKiBzbyB0aGUgZGF0YSBjYW4gYmUgdXNlZCBmb3IgcmVuZGVyaW5nLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWaWRlb0ZyYW1lfSBmcmFtZSAtIFRoZSB2aWRlbyBmcmFtZS5cclxuXHQgKi9cclxuXHRzZXRGcmFtZSggZnJhbWUgKSB7XHJcblxyXG5cdFx0dGhpcy5pbWFnZSA9IGZyYW1lO1xyXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFZpZGVvRnJhbWVUZXh0dXJlIH07XHJcbiIsImltcG9ydCB7IFRleHR1cmUgfSBmcm9tICcuL1RleHR1cmUuanMnO1xyXG5pbXBvcnQgeyBOZWFyZXN0RmlsdGVyIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGNsYXNzIGNhbiBvbmx5IGJlIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aCBgY29weUZyYW1lYnVmZmVyVG9UZXh0dXJlKClgIG1ldGhvZHNcclxuICogb2YgcmVuZGVyZXJzLiBJdCBleHRyYWN0cyB0aGUgY29udGVudHMgb2YgdGhlIGN1cnJlbnQgYm91bmQgZnJhbWVidWZmZXIgYW5kIHByb3ZpZGVzIGl0XHJcbiAqIGFzIGEgdGV4dHVyZSBmb3IgZnVydGhlciB1c2FnZS5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgcGl4ZWxSYXRpbyA9IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO1xyXG4gKiBjb25zdCB0ZXh0dXJlU2l6ZSA9IDEyOCAqIHBpeGVsUmF0aW87XHJcbiAqXHJcbiAqIGNvbnN0IGZyYW1lVGV4dHVyZSA9IG5ldyBGcmFtZWJ1ZmZlclRleHR1cmUoIHRleHR1cmVTaXplLCB0ZXh0dXJlU2l6ZSApO1xyXG4gKlxyXG4gKiAvLyBjYWxjdWxhdGUgc3RhcnQgcG9zaXRpb24gZm9yIGNvcHlpbmcgcGFydCBvZiB0aGUgZnJhbWUgZGF0YVxyXG4gKiBjb25zdCB2ZWN0b3IgPSBuZXcgVmVjdG9yMigpO1xyXG4gKiB2ZWN0b3IueCA9ICggd2luZG93LmlubmVyV2lkdGggKiBwaXhlbFJhdGlvIC8gMiApIC0gKCB0ZXh0dXJlU2l6ZSAvIDIgKTtcclxuICogdmVjdG9yLnkgPSAoIHdpbmRvdy5pbm5lckhlaWdodCAqIHBpeGVsUmF0aW8gLyAyICkgLSAoIHRleHR1cmVTaXplIC8gMiApO1xyXG4gKlxyXG4gKiByZW5kZXJlci5yZW5kZXIoIHNjZW5lLCBjYW1lcmEgKTtcclxuICpcclxuICogLy8gY29weSBwYXJ0IG9mIHRoZSByZW5kZXJlZCBmcmFtZSBpbnRvIHRoZSBmcmFtZWJ1ZmZlciB0ZXh0dXJlXHJcbiAqIHJlbmRlcmVyLmNvcHlGcmFtZWJ1ZmZlclRvVGV4dHVyZSggZnJhbWVUZXh0dXJlLCB2ZWN0b3IgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBUZXh0dXJlXHJcbiAqL1xyXG5jbGFzcyBGcmFtZWJ1ZmZlclRleHR1cmUgZXh0ZW5kcyBUZXh0dXJlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBmcmFtZWJ1ZmZlciB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSB0ZXh0dXJlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSB0ZXh0dXJlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCB3aWR0aCwgaGVpZ2h0ICkge1xyXG5cclxuXHRcdHN1cGVyKCB7IHdpZHRoLCBoZWlnaHQgfSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0ZyYW1lYnVmZmVyVGV4dHVyZSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3cgdGhlIHRleHR1cmUgaXMgc2FtcGxlZCB3aGVuIGEgdGV4ZWwgY292ZXJzIG1vcmUgdGhhbiBvbmUgcGl4ZWwuXHJcblx0XHQgKlxyXG5cdFx0ICogT3ZlcndyaXR0ZW4gYW5kIHNldCB0byBgTmVhcmVzdEZpbHRlcmAgYnkgZGVmYXVsdCB0byBkaXNhYmxlIGZpbHRlcmluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KE5lYXJlc3RGaWx0ZXJ8TmVhcmVzdE1pcG1hcE5lYXJlc3RGaWx0ZXJ8TmVhcmVzdE1pcG1hcExpbmVhckZpbHRlcnxMaW5lYXJGaWx0ZXJ8TGluZWFyTWlwbWFwTmVhcmVzdEZpbHRlcnxMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXIpfVxyXG5cdFx0ICogQGRlZmF1bHQgTmVhcmVzdEZpbHRlclxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1hZ0ZpbHRlciA9IE5lYXJlc3RGaWx0ZXI7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3cgdGhlIHRleHR1cmUgaXMgc2FtcGxlZCB3aGVuIGEgdGV4ZWwgY292ZXJzIGxlc3MgdGhhbiBvbmUgcGl4ZWwuXHJcblx0XHQgKlxyXG5cdFx0ICogT3ZlcndyaXR0ZW4gYW5kIHNldCB0byBgTmVhcmVzdEZpbHRlcmAgYnkgZGVmYXVsdCB0byBkaXNhYmxlIGZpbHRlcmluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KE5lYXJlc3RGaWx0ZXJ8TmVhcmVzdE1pcG1hcE5lYXJlc3RGaWx0ZXJ8TmVhcmVzdE1pcG1hcExpbmVhckZpbHRlcnxMaW5lYXJGaWx0ZXJ8TGluZWFyTWlwbWFwTmVhcmVzdEZpbHRlcnxMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXIpfVxyXG5cdFx0ICogQGRlZmF1bHQgTmVhcmVzdEZpbHRlclxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1pbkZpbHRlciA9IE5lYXJlc3RGaWx0ZXI7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRvIGdlbmVyYXRlIG1pcG1hcHMgKGlmIHBvc3NpYmxlKSBmb3IgYSB0ZXh0dXJlLlxyXG5cdFx0ICpcclxuXHRcdCAqIE92ZXJ3cml0dGVuIGFuZCBzZXQgdG8gYGZhbHNlYCBieSBkZWZhdWx0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcclxuXHJcblx0XHR0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgRnJhbWVidWZmZXJUZXh0dXJlIH07XHJcbiIsImltcG9ydCB7IFRleHR1cmUgfSBmcm9tICcuL1RleHR1cmUuanMnO1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSB0ZXh0dXJlIGJhc2VkIG9uIGRhdGEgaW4gY29tcHJlc3NlZCBmb3JtLlxyXG4gKlxyXG4gKiBUaGVzZSB0ZXh0dXJlIGFyZSB1c3VhbGx5IGxvYWRlZCB3aXRoIHtAbGluayBDb21wcmVzc2VkVGV4dHVyZUxvYWRlcn0uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBUZXh0dXJlXHJcbiAqL1xyXG5jbGFzcyBDb21wcmVzc2VkVGV4dHVyZSBleHRlbmRzIFRleHR1cmUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGNvbXByZXNzZWQgdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8T2JqZWN0Pn0gbWlwbWFwcyAtIFRoaXMgYXJyYXkgaG9sZHMgZm9yIGFsbCBtaXBtYXBzIChpbmNsdWRpbmcgdGhlIGJhc2VzIG1pcClcclxuXHQgKiB0aGUgZGF0YSBhbmQgZGltZW5zaW9ucy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtmb3JtYXQ9UkdCQUZvcm1hdF0gLSBUaGUgdGV4dHVyZSBmb3JtYXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt0eXBlPVVuc2lnbmVkQnl0ZVR5cGVdIC0gVGhlIHRleHR1cmUgdHlwZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW21hcHBpbmc9VGV4dHVyZS5ERUZBVUxUX01BUFBJTkddIC0gVGhlIHRleHR1cmUgbWFwcGluZy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3dyYXBTPUNsYW1wVG9FZGdlV3JhcHBpbmddIC0gVGhlIHdyYXBTIHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbd3JhcFQ9Q2xhbXBUb0VkZ2VXcmFwcGluZ10gLSBUaGUgd3JhcFQgdmFsdWUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFttYWdGaWx0ZXI9TGluZWFyRmlsdGVyXSAtIFRoZSBtYWcgZmlsdGVyIHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbWluRmlsdGVyPUxpbmVhck1pcG1hcExpbmVhckZpbHRlcl0gLSBUaGUgbWluIGZpbHRlciB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2FuaXNvdHJvcHk9VGV4dHVyZS5ERUZBVUxUX0FOSVNPVFJPUFldIC0gVGhlIGFuaXNvdHJvcHkgdmFsdWUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtjb2xvclNwYWNlPU5vQ29sb3JTcGFjZV0gLSBUaGUgY29sb3Igc3BhY2UuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG1pcG1hcHMsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgYW5pc290cm9weSwgY29sb3JTcGFjZSApIHtcclxuXHJcblx0XHRzdXBlciggbnVsbCwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5LCBjb2xvclNwYWNlICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzQ29tcHJlc3NlZFRleHR1cmUgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGltYWdlIHByb3BlcnR5IG9mIGEgY29tcHJlc3NlZCB0ZXh0dXJlIGp1c3QgZGVmaW5lcyBpdHMgZGltZW5zaW9ucy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7e3dpZHRoOm51bWJlcixoZWlnaHQ6bnVtYmVyfX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pbWFnZSA9IHsgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCB9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBhcnJheSBob2xkcyBmb3IgYWxsIG1pcG1hcHMgKGluY2x1ZGluZyB0aGUgYmFzZXMgbWlwKSB0aGUgZGF0YSBhbmQgZGltZW5zaW9ucy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8T2JqZWN0Pn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5taXBtYXBzID0gbWlwbWFwcztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIElmIHNldCB0byBgdHJ1ZWAsIHRoZSB0ZXh0dXJlIGlzIGZsaXBwZWQgYWxvbmcgdGhlIHZlcnRpY2FsIGF4aXMgd2hlblxyXG5cdFx0ICogdXBsb2FkZWQgdG8gdGhlIEdQVS5cclxuXHRcdCAqXHJcblx0XHQgKiBPdmVyd3JpdHRlbiBhbmQgc2V0IHRvIGBmYWxzZWAgYnkgZGVmYXVsdCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG9cclxuXHRcdCAqIGZsaXAgY29tcHJlc3NlZCB0ZXh0dXJlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5mbGlwWSA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0byBnZW5lcmF0ZSBtaXBtYXBzIChpZiBwb3NzaWJsZSkgZm9yIGEgdGV4dHVyZS5cclxuXHRcdCAqXHJcblx0XHQgKiBPdmVyd3JpdHRlbiBhbmQgc2V0IHRvIGBmYWxzZWAgYnkgZGVmYXVsdCBzaW5jZSBpdCBpcyBub3RcclxuXHRcdCAqIHBvc3NpYmxlIHRvIGdlbmVyYXRlIG1pcG1hcHMgZm9yIGNvbXByZXNzZWQgZGF0YS4gTWlwbWFwc1xyXG5cdFx0ICogbXVzdCBiZSBlbWJlZGRlZCBpbiB0aGUgY29tcHJlc3NlZCB0ZXh0dXJlIGZpbGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IENvbXByZXNzZWRUZXh0dXJlIH07XHJcbiIsImltcG9ydCB7IENsYW1wVG9FZGdlV3JhcHBpbmcgfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBDb21wcmVzc2VkVGV4dHVyZSB9IGZyb20gJy4vQ29tcHJlc3NlZFRleHR1cmUuanMnO1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSB0ZXh0dXJlIDJEIGFycmF5IGJhc2VkIG9uIGRhdGEgaW4gY29tcHJlc3NlZCBmb3JtLlxyXG4gKlxyXG4gKiBUaGVzZSB0ZXh0dXJlIGFyZSB1c3VhbGx5IGxvYWRlZCB3aXRoIHtAbGluayBDb21wcmVzc2VkVGV4dHVyZUxvYWRlcn0uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBDb21wcmVzc2VkVGV4dHVyZVxyXG4gKi9cclxuY2xhc3MgQ29tcHJlc3NlZEFycmF5VGV4dHVyZSBleHRlbmRzIENvbXByZXNzZWRUZXh0dXJlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBjb21wcmVzc2VkIGFycmF5IHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PE9iamVjdD59IG1pcG1hcHMgLSBUaGlzIGFycmF5IGhvbGRzIGZvciBhbGwgbWlwbWFwcyAoaW5jbHVkaW5nIHRoZSBiYXNlcyBtaXApXHJcblx0ICogdGhlIGRhdGEgYW5kIGRpbWVuc2lvbnMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSB0ZXh0dXJlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSB0ZXh0dXJlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBkZXB0aCAtIFRoZSBkZXB0aCBvZiB0aGUgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2Zvcm1hdD1SR0JBRm9ybWF0XSAtIFRoZSBtaW4gZmlsdGVyIHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbdHlwZT1VbnNpZ25lZEJ5dGVUeXBlXSAtIFRoZSBtaW4gZmlsdGVyIHZhbHVlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBtaXBtYXBzLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgZm9ybWF0LCB0eXBlICkge1xyXG5cclxuXHRcdHN1cGVyKCBtaXBtYXBzLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNDb21wcmVzc2VkQXJyYXlUZXh0dXJlID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBpbWFnZSBwcm9wZXJ0eSBvZiBhIGNvbXByZXNzZWQgdGV4dHVyZSBqdXN0IGRlZmluZXMgaXRzIGRpbWVuc2lvbnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQG5hbWUgQ29tcHJlc3NlZEFycmF5VGV4dHVyZSNpbWFnZVxyXG5cdFx0ICogQHR5cGUge3t3aWR0aDpudW1iZXIsaGVpZ2h0Om51bWJlcixkZXB0aDpudW1iZXJ9fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmltYWdlLmRlcHRoID0gZGVwdGg7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGRlZmluZXMgaG93IHRoZSB0ZXh0dXJlIGlzIHdyYXBwZWQgaW4gdGhlIGRlcHRoIGFuZCBjb3JyZXNwb25kcyB0b1xyXG5cdFx0ICogKlcqIGluIFVWVyBtYXBwaW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoUmVwZWF0V3JhcHBpbmd8Q2xhbXBUb0VkZ2VXcmFwcGluZ3xNaXJyb3JlZFJlcGVhdFdyYXBwaW5nKX1cclxuXHRcdCAqIEBkZWZhdWx0IENsYW1wVG9FZGdlV3JhcHBpbmdcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy53cmFwUiA9IENsYW1wVG9FZGdlV3JhcHBpbmc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHNldCBvZiBhbGwgbGF5ZXJzIHdoaWNoIG5lZWQgdG8gYmUgdXBkYXRlZCBpbiB0aGUgdGV4dHVyZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7U2V0PG51bWJlcj59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGF5ZXJVcGRhdGVzID0gbmV3IFNldCgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlc2NyaWJlcyB0aGF0IGEgc3BlY2lmaWMgbGF5ZXIgb2YgdGhlIHRleHR1cmUgbmVlZHMgdG8gYmUgdXBkYXRlZC5cclxuXHQgKiBOb3JtYWxseSB3aGVuIHtAbGluayBUZXh0dXJlI25lZWRzVXBkYXRlfSBpcyBzZXQgdG8gYHRydWVgLCB0aGVcclxuXHQgKiBlbnRpcmUgY29tcHJlc3NlZCB0ZXh0dXJlIGFycmF5IGlzIHNlbnQgdG8gdGhlIEdQVS4gTWFya2luZyBzcGVjaWZpY1xyXG5cdCAqIGxheWVycyB3aWxsIG9ubHkgdHJhbnNtaXQgc3Vic2V0cyBvZiBhbGwgbWlwbWFwcyBhc3NvY2lhdGVkIHdpdGggYVxyXG5cdCAqIHNwZWNpZmljIGRlcHRoIGluIHRoZSBhcnJheSB3aGljaCBpcyBvZnRlbiBtdWNoIG1vcmUgcGVyZm9ybWFudC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBsYXllckluZGV4IC0gVGhlIGxheWVyIGluZGV4IHRoYXQgc2hvdWxkIGJlIHVwZGF0ZWQuXHJcblx0ICovXHJcblx0YWRkTGF5ZXJVcGRhdGUoIGxheWVySW5kZXggKSB7XHJcblxyXG5cdFx0dGhpcy5sYXllclVwZGF0ZXMuYWRkKCBsYXllckluZGV4ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVzZXRzIHRoZSBsYXllciB1cGRhdGVzIHJlZ2lzdHJ5LlxyXG5cdCAqL1xyXG5cdGNsZWFyTGF5ZXJVcGRhdGVzKCkge1xyXG5cclxuXHRcdHRoaXMubGF5ZXJVcGRhdGVzLmNsZWFyKCk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IENvbXByZXNzZWRBcnJheVRleHR1cmUgfTtcclxuIiwiaW1wb3J0IHsgQ3ViZVJlZmxlY3Rpb25NYXBwaW5nIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgQ29tcHJlc3NlZFRleHR1cmUgfSBmcm9tICcuL0NvbXByZXNzZWRUZXh0dXJlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgY3ViZSB0ZXh0dXJlIGJhc2VkIG9uIGRhdGEgaW4gY29tcHJlc3NlZCBmb3JtLlxyXG4gKlxyXG4gKiBUaGVzZSB0ZXh0dXJlIGFyZSB1c3VhbGx5IGxvYWRlZCB3aXRoIHtAbGluayBDb21wcmVzc2VkVGV4dHVyZUxvYWRlcn0uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBDb21wcmVzc2VkVGV4dHVyZVxyXG4gKi9cclxuY2xhc3MgQ29tcHJlc3NlZEN1YmVUZXh0dXJlIGV4dGVuZHMgQ29tcHJlc3NlZFRleHR1cmUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGNvbXByZXNzZWQgdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8Q29tcHJlc3NlZFRleHR1cmU+fSBpbWFnZXMgLSBBbiBhcnJheSBvZiBjb21wcmVzc2VkIHRleHR1cmVzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZm9ybWF0PVJHQkFGb3JtYXRdIC0gVGhlIHRleHR1cmUgZm9ybWF0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbdHlwZT1VbnNpZ25lZEJ5dGVUeXBlXSAtIFRoZSB0ZXh0dXJlIHR5cGUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGltYWdlcywgZm9ybWF0LCB0eXBlICkge1xyXG5cclxuXHRcdHN1cGVyKCB1bmRlZmluZWQsIGltYWdlc1sgMCBdLndpZHRoLCBpbWFnZXNbIDAgXS5oZWlnaHQsIGZvcm1hdCwgdHlwZSwgQ3ViZVJlZmxlY3Rpb25NYXBwaW5nICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzQ29tcHJlc3NlZEN1YmVUZXh0dXJlID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNDdWJlVGV4dHVyZSA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy5pbWFnZSA9IGltYWdlcztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgQ29tcHJlc3NlZEN1YmVUZXh0dXJlIH07XHJcbiIsImltcG9ydCB7IFRleHR1cmUgfSBmcm9tICcuL1RleHR1cmUuanMnO1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSB0ZXh0dXJlIGZyb20gYSBjYW52YXMgZWxlbWVudC5cclxuICpcclxuICogVGhpcyBpcyBhbG1vc3QgdGhlIHNhbWUgYXMgdGhlIGJhc2UgdGV4dHVyZSBjbGFzcywgZXhjZXB0IHRoYXQgaXQgc2V0cyB7QGxpbmsgVGV4dHVyZSNuZWVkc1VwZGF0ZX1cclxuICogdG8gYHRydWVgIGltbWVkaWF0ZWx5IHNpbmNlIGEgY2FudmFzIGNhbiBkaXJlY3RseSBiZSB1c2VkIGZvciByZW5kZXJpbmcuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBUZXh0dXJlXHJcbiAqL1xyXG5jbGFzcyBDYW52YXNUZXh0dXJlIGV4dGVuZHMgVGV4dHVyZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7SFRNTENhbnZhc0VsZW1lbnR9IFtjYW52YXNdIC0gVGhlIEhUTUwgY2FudmFzIGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFttYXBwaW5nPVRleHR1cmUuREVGQVVMVF9NQVBQSU5HXSAtIFRoZSB0ZXh0dXJlIG1hcHBpbmcuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt3cmFwUz1DbGFtcFRvRWRnZVdyYXBwaW5nXSAtIFRoZSB3cmFwUyB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3dyYXBUPUNsYW1wVG9FZGdlV3JhcHBpbmddIC0gVGhlIHdyYXBUIHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbWFnRmlsdGVyPUxpbmVhckZpbHRlcl0gLSBUaGUgbWFnIGZpbHRlciB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW21pbkZpbHRlcj1MaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXJdIC0gVGhlIG1pbiBmaWx0ZXIgdmFsdWUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtmb3JtYXQ9UkdCQUZvcm1hdF0gLSBUaGUgdGV4dHVyZSBmb3JtYXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt0eXBlPVVuc2lnbmVkQnl0ZVR5cGVdIC0gVGhlIHRleHR1cmUgdHlwZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2FuaXNvdHJvcHk9VGV4dHVyZS5ERUZBVUxUX0FOSVNPVFJPUFldIC0gVGhlIGFuaXNvdHJvcHkgdmFsdWUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGNhbnZhcywgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5ICkge1xyXG5cclxuXHRcdHN1cGVyKCBjYW52YXMsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0NhbnZhc1RleHR1cmUgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBDYW52YXNUZXh0dXJlIH07XHJcbiIsImltcG9ydCB7IFNvdXJjZSB9IGZyb20gJy4vU291cmNlLmpzJztcclxuaW1wb3J0IHsgVGV4dHVyZSB9IGZyb20gJy4vVGV4dHVyZS5qcyc7XHJcbmltcG9ydCB7IE5lYXJlc3RGaWx0ZXIsIFVuc2lnbmVkSW50VHlwZSwgRGVwdGhGb3JtYXQsIERlcHRoU3RlbmNpbEZvcm1hdCB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byBhdXRvbWF0aWNhbGx5IHNhdmUgdGhlIGRlcHRoIGluZm9ybWF0aW9uIG9mIGFcclxuICogcmVuZGVyaW5nIGludG8gYSB0ZXh0dXJlLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgVGV4dHVyZVxyXG4gKi9cclxuY2xhc3MgRGVwdGhUZXh0dXJlIGV4dGVuZHMgVGV4dHVyZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgZGVwdGggdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3R5cGU9VW5zaWduZWRJbnRUeXBlXSAtIFRoZSB0ZXh0dXJlIHR5cGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFttYXBwaW5nPVRleHR1cmUuREVGQVVMVF9NQVBQSU5HXSAtIFRoZSB0ZXh0dXJlIG1hcHBpbmcuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt3cmFwUz1DbGFtcFRvRWRnZVdyYXBwaW5nXSAtIFRoZSB3cmFwUyB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3dyYXBUPUNsYW1wVG9FZGdlV3JhcHBpbmddIC0gVGhlIHdyYXBUIHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbWFnRmlsdGVyPUxpbmVhckZpbHRlcl0gLSBUaGUgbWFnIGZpbHRlciB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW21pbkZpbHRlcj1MaW5lYXJGaWx0ZXJdIC0gVGhlIG1pbiBmaWx0ZXIgdmFsdWUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFthbmlzb3Ryb3B5PVRleHR1cmUuREVGQVVMVF9BTklTT1RST1BZXSAtIFRoZSBhbmlzb3Ryb3B5IHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZm9ybWF0PURlcHRoRm9ybWF0XSAtIFRoZSB0ZXh0dXJlIGZvcm1hdC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggd2lkdGgsIGhlaWdodCwgdHlwZSA9IFVuc2lnbmVkSW50VHlwZSwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIgPSBOZWFyZXN0RmlsdGVyLCBtaW5GaWx0ZXIgPSBOZWFyZXN0RmlsdGVyLCBhbmlzb3Ryb3B5LCBmb3JtYXQgPSBEZXB0aEZvcm1hdCApIHtcclxuXHJcblx0XHRpZiAoIGZvcm1hdCAhPT0gRGVwdGhGb3JtYXQgJiYgZm9ybWF0ICE9PSBEZXB0aFN0ZW5jaWxGb3JtYXQgKSB7XHJcblxyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdEZXB0aFRleHR1cmUgZm9ybWF0IG11c3QgYmUgZWl0aGVyIFRIUkVFLkRlcHRoRm9ybWF0IG9yIFRIUkVFLkRlcHRoU3RlbmNpbEZvcm1hdCcgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0c3VwZXIoIG51bGwsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0RlcHRoVGV4dHVyZSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgaW1hZ2UgcHJvcGVydHkgb2YgYSBkZXB0aCB0ZXh0dXJlIGp1c3QgZGVmaW5lcyBpdHMgZGltZW5zaW9ucy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7e3dpZHRoOm51bWJlcixoZWlnaHQ6bnVtYmVyfX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pbWFnZSA9IHsgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCB9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSWYgc2V0IHRvIGB0cnVlYCwgdGhlIHRleHR1cmUgaXMgZmxpcHBlZCBhbG9uZyB0aGUgdmVydGljYWwgYXhpcyB3aGVuXHJcblx0XHQgKiB1cGxvYWRlZCB0byB0aGUgR1BVLlxyXG5cdFx0ICpcclxuXHRcdCAqIE92ZXJ3cml0dGVuIGFuZCBzZXQgdG8gYGZhbHNlYCBieSBkZWZhdWx0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5mbGlwWSA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0byBnZW5lcmF0ZSBtaXBtYXBzIChpZiBwb3NzaWJsZSkgZm9yIGEgdGV4dHVyZS5cclxuXHRcdCAqXHJcblx0XHQgKiBPdmVyd3JpdHRlbiBhbmQgc2V0IHRvIGBmYWxzZWAgYnkgZGVmYXVsdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZGVwdGggY29tcGFyZSBmdW5jdGlvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7PyhOZXZlckNvbXBhcmV8TGVzc0NvbXBhcmV8RXF1YWxDb21wYXJlfExlc3NFcXVhbENvbXBhcmV8R3JlYXRlckNvbXBhcmV8Tm90RXF1YWxDb21wYXJlfEdyZWF0ZXJFcXVhbENvbXBhcmV8QWx3YXlzQ29tcGFyZSl9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29tcGFyZUZ1bmN0aW9uID0gbnVsbDtcclxuXHJcblx0fVxyXG5cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMuc291cmNlID0gbmV3IFNvdXJjZSggT2JqZWN0LmFzc2lnbigge30sIHNvdXJjZS5pbWFnZSApICk7IC8vIHNlZSAjMzA1NDBcclxuXHRcdHRoaXMuY29tcGFyZUZ1bmN0aW9uID0gc291cmNlLmNvbXBhcmVGdW5jdGlvbjtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHR0b0pTT04oIG1ldGEgKSB7XHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IHN1cGVyLnRvSlNPTiggbWV0YSApO1xyXG5cclxuXHRcdGlmICggdGhpcy5jb21wYXJlRnVuY3Rpb24gIT09IG51bGwgKSBkYXRhLmNvbXBhcmVGdW5jdGlvbiA9IHRoaXMuY29tcGFyZUZ1bmN0aW9uO1xyXG5cclxuXHRcdHJldHVybiBkYXRhO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBEZXB0aFRleHR1cmUgfTtcclxuIiwiaW1wb3J0IHsgY2xhbXAgfSBmcm9tICcuLi8uLi9tYXRoL01hdGhVdGlscy5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjIuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuaW1wb3J0IHsgTWF0cml4NCB9IGZyb20gJy4uLy4uL21hdGgvTWF0cml4NC5qcyc7XHJcblxyXG4vKipcclxuICogQW4gYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgY3JlYXRpbmcgYW4gYW5hbHl0aWMgY3VydmUgb2JqZWN0IHRoYXQgY29udGFpbnMgbWV0aG9kc1xyXG4gKiBmb3IgaW50ZXJwb2xhdGlvbi5cclxuICpcclxuICogQGFic3RyYWN0XHJcbiAqL1xyXG5jbGFzcyBDdXJ2ZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgY3VydmUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdHlwZSBwcm9wZXJ0eSBpcyB1c2VkIGZvciBkZXRlY3RpbmcgdGhlIG9iamVjdCB0eXBlXHJcblx0XHQgKiBpbiBjb250ZXh0IG9mIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50eXBlID0gJ0N1cnZlJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgdmFsdWUgZGV0ZXJtaW5lcyB0aGUgYW1vdW50IG9mIGRpdmlzaW9ucyB3aGVuIGNhbGN1bGF0aW5nIHRoZVxyXG5cdFx0ICogY3VtdWxhdGl2ZSBzZWdtZW50IGxlbmd0aHMgb2YgYSBjdXJ2ZSB2aWEge0BsaW5rIEN1cnZlI2dldExlbmd0aHN9LiBUbyBlbnN1cmVcclxuXHRcdCAqIHByZWNpc2lvbiB3aGVuIHVzaW5nIG1ldGhvZHMgbGlrZSB7QGxpbmsgQ3VydmUjZ2V0U3BhY2VkUG9pbnRzfSwgaXQgaXNcclxuXHRcdCAqIHJlY29tbWVuZGVkIHRvIGluY3JlYXNlIHRoZSB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5IGlmIHRoZSBjdXJ2ZSBpcyB2ZXJ5IGxhcmdlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAyMDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hcmNMZW5ndGhEaXZpc2lvbnMgPSAyMDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBNdXN0IGJlIHNldCB0byBgdHJ1ZWAgaWYgdGhlIGN1cnZlIHBhcmFtZXRlcnMgaGF2ZSBjaGFuZ2VkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQW4gaW50ZXJuYWwgY2FjaGUgdGhhdCBob2xkcyBwcmVjb21wdXRlZCBjdXJ2ZSBsZW5ndGggdmFsdWVzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7P0FycmF5PG51bWJlcj59XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2FjaGVBcmNMZW5ndGhzID0gbnVsbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgdmVjdG9yIGluIDJEIG9yIDNEIHNwYWNlIChkZXBlbmRpbmcgb24gdGhlIGN1cnZlIGRlZmluaXRpb24pXHJcblx0ICogZm9yIHRoZSBnaXZlbiBpbnRlcnBvbGF0aW9uIGZhY3Rvci5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0IC0gQSBpbnRlcnBvbGF0aW9uIGZhY3RvciByZXByZXNlbnRpbmcgYSBwb3NpdGlvbiBvbiB0aGUgY3VydmUuIE11c3QgYmUgaW4gdGhlIHJhbmdlIGBbMCwxXWAuXHJcblx0ICogQHBhcmFtIHsoVmVjdG9yMnxWZWN0b3IzKX0gW29wdGlvbmFsVGFyZ2V0XSAtIFRoZSBvcHRpb25hbCB0YXJnZXQgdmVjdG9yIHRoZSByZXN1bHQgaXMgd3JpdHRlbiB0by5cclxuXHQgKiBAcmV0dXJuIHsoVmVjdG9yMnxWZWN0b3IzKX0gVGhlIHBvc2l0aW9uIG9uIHRoZSBjdXJ2ZS4gSXQgY2FuIGJlIGEgMkQgb3IgM0QgdmVjdG9yIGRlcGVuZGluZyBvbiB0aGUgY3VydmUgZGVmaW5pdGlvbi5cclxuXHQgKi9cclxuXHRnZXRQb2ludCggLyogdCwgb3B0aW9uYWxUYXJnZXQgKi8gKSB7XHJcblxyXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ3VydmU6IC5nZXRQb2ludCgpIG5vdCBpbXBsZW1lbnRlZC4nICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgcmV0dXJucyBhIHZlY3RvciBpbiAyRCBvciAzRCBzcGFjZSAoZGVwZW5kaW5nIG9uIHRoZSBjdXJ2ZSBkZWZpbml0aW9uKVxyXG5cdCAqIGZvciB0aGUgZ2l2ZW4gaW50ZXJwb2xhdGlvbiBmYWN0b3IuIFVubGlrZSB7QGxpbmsgQ3VydmUjZ2V0UG9pbnR9LCB0aGlzIG1ldGhvZCBob25vcnMgdGhlIGxlbmd0aFxyXG5cdCAqIG9mIHRoZSBjdXJ2ZSB3aGljaCBlcXVpZGlzdGFudCBzYW1wbGVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHUgLSBBIGludGVycG9sYXRpb24gZmFjdG9yIHJlcHJlc2VudGluZyBhIHBvc2l0aW9uIG9uIHRoZSBjdXJ2ZS4gTXVzdCBiZSBpbiB0aGUgcmFuZ2UgYFswLDFdYC5cclxuXHQgKiBAcGFyYW0geyhWZWN0b3IyfFZlY3RvcjMpfSBbb3B0aW9uYWxUYXJnZXRdIC0gVGhlIG9wdGlvbmFsIHRhcmdldCB2ZWN0b3IgdGhlIHJlc3VsdCBpcyB3cml0dGVuIHRvLlxyXG5cdCAqIEByZXR1cm4geyhWZWN0b3IyfFZlY3RvcjMpfSBUaGUgcG9zaXRpb24gb24gdGhlIGN1cnZlLiBJdCBjYW4gYmUgYSAyRCBvciAzRCB2ZWN0b3IgZGVwZW5kaW5nIG9uIHRoZSBjdXJ2ZSBkZWZpbml0aW9uLlxyXG5cdCAqL1xyXG5cdGdldFBvaW50QXQoIHUsIG9wdGlvbmFsVGFyZ2V0ICkge1xyXG5cclxuXHRcdGNvbnN0IHQgPSB0aGlzLmdldFV0b1RtYXBwaW5nKCB1ICk7XHJcblx0XHRyZXR1cm4gdGhpcy5nZXRQb2ludCggdCwgb3B0aW9uYWxUYXJnZXQgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBzYW1wbGVzIHRoZSBjdXJ2ZSB2aWEge0BsaW5rIEN1cnZlI2dldFBvaW50fSBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiBwb2ludHMgcmVwcmVzZW50aW5nXHJcblx0ICogdGhlIGN1cnZlIHNoYXBlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtkaXZpc2lvbnM9NV0gLSBUaGUgbnVtYmVyIG9mIGRpdmlzaW9ucy5cclxuXHQgKiBAcmV0dXJuIHtBcnJheTwoVmVjdG9yMnxWZWN0b3IzKT59IEFuIGFycmF5IGhvbGRpbmcgdGhlIHNhbXBsZWQgY3VydmUgdmFsdWVzLiBUaGUgbnVtYmVyIG9mIHBvaW50cyBpcyBgZGl2aXNpb25zICsgMWAuXHJcblx0ICovXHJcblx0Z2V0UG9pbnRzKCBkaXZpc2lvbnMgPSA1ICkge1xyXG5cclxuXHRcdGNvbnN0IHBvaW50cyA9IFtdO1xyXG5cclxuXHRcdGZvciAoIGxldCBkID0gMDsgZCA8PSBkaXZpc2lvbnM7IGQgKysgKSB7XHJcblxyXG5cdFx0XHRwb2ludHMucHVzaCggdGhpcy5nZXRQb2ludCggZCAvIGRpdmlzaW9ucyApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBwb2ludHM7XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gR2V0IHNlcXVlbmNlIG9mIHBvaW50cyB1c2luZyBnZXRQb2ludEF0KCB1IClcclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2Qgc2FtcGxlcyB0aGUgY3VydmUgdmlhIHtAbGluayBDdXJ2ZSNnZXRQb2ludEF0fSBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiBwb2ludHMgcmVwcmVzZW50aW5nXHJcblx0ICogdGhlIGN1cnZlIHNoYXBlLiBVbmxpa2Uge0BsaW5rIEN1cnZlI2dldFBvaW50c30sIHRoaXMgbWV0aG9kIHJldHVybnMgZXF1aS1zcGFjZWQgcG9pbnRzIGFjcm9zcyB0aGUgZW50aXJlXHJcblx0ICogY3VydmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2RpdmlzaW9ucz01XSAtIFRoZSBudW1iZXIgb2YgZGl2aXNpb25zLlxyXG5cdCAqIEByZXR1cm4ge0FycmF5PChWZWN0b3IyfFZlY3RvcjMpPn0gQW4gYXJyYXkgaG9sZGluZyB0aGUgc2FtcGxlZCBjdXJ2ZSB2YWx1ZXMuIFRoZSBudW1iZXIgb2YgcG9pbnRzIGlzIGBkaXZpc2lvbnMgKyAxYC5cclxuXHQgKi9cclxuXHRnZXRTcGFjZWRQb2ludHMoIGRpdmlzaW9ucyA9IDUgKSB7XHJcblxyXG5cdFx0Y29uc3QgcG9pbnRzID0gW107XHJcblxyXG5cdFx0Zm9yICggbGV0IGQgPSAwOyBkIDw9IGRpdmlzaW9uczsgZCArKyApIHtcclxuXHJcblx0XHRcdHBvaW50cy5wdXNoKCB0aGlzLmdldFBvaW50QXQoIGQgLyBkaXZpc2lvbnMgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcG9pbnRzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHRvdGFsIGFyYyBsZW5ndGggb2YgdGhlIGN1cnZlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgbGVuZ3RoIG9mIHRoZSBjdXJ2ZS5cclxuXHQgKi9cclxuXHRnZXRMZW5ndGgoKSB7XHJcblxyXG5cdFx0Y29uc3QgbGVuZ3RocyA9IHRoaXMuZ2V0TGVuZ3RocygpO1xyXG5cdFx0cmV0dXJuIGxlbmd0aHNbIGxlbmd0aHMubGVuZ3RoIC0gMSBdO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYW4gYXJyYXkgb2YgY3VtdWxhdGl2ZSBzZWdtZW50IGxlbmd0aHMgb2YgdGhlIGN1cnZlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtkaXZpc2lvbnM9dGhpcy5hcmNMZW5ndGhEaXZpc2lvbnNdIC0gVGhlIG51bWJlciBvZiBkaXZpc2lvbnMuXHJcblx0ICogQHJldHVybiB7QXJyYXk8bnVtYmVyPn0gQW4gYXJyYXkgaG9sZGluZyB0aGUgY3VtdWxhdGl2ZSBzZWdtZW50IGxlbmd0aHMuXHJcblx0ICovXHJcblx0Z2V0TGVuZ3RocyggZGl2aXNpb25zID0gdGhpcy5hcmNMZW5ndGhEaXZpc2lvbnMgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmNhY2hlQXJjTGVuZ3RocyAmJlxyXG5cdFx0XHQoIHRoaXMuY2FjaGVBcmNMZW5ndGhzLmxlbmd0aCA9PT0gZGl2aXNpb25zICsgMSApICYmXHJcblx0XHRcdCEgdGhpcy5uZWVkc1VwZGF0ZSApIHtcclxuXHJcblx0XHRcdHJldHVybiB0aGlzLmNhY2hlQXJjTGVuZ3RocztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IGZhbHNlO1xyXG5cclxuXHRcdGNvbnN0IGNhY2hlID0gW107XHJcblx0XHRsZXQgY3VycmVudCwgbGFzdCA9IHRoaXMuZ2V0UG9pbnQoIDAgKTtcclxuXHRcdGxldCBzdW0gPSAwO1xyXG5cclxuXHRcdGNhY2hlLnB1c2goIDAgKTtcclxuXHJcblx0XHRmb3IgKCBsZXQgcCA9IDE7IHAgPD0gZGl2aXNpb25zOyBwICsrICkge1xyXG5cclxuXHRcdFx0Y3VycmVudCA9IHRoaXMuZ2V0UG9pbnQoIHAgLyBkaXZpc2lvbnMgKTtcclxuXHRcdFx0c3VtICs9IGN1cnJlbnQuZGlzdGFuY2VUbyggbGFzdCApO1xyXG5cdFx0XHRjYWNoZS5wdXNoKCBzdW0gKTtcclxuXHRcdFx0bGFzdCA9IGN1cnJlbnQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuY2FjaGVBcmNMZW5ndGhzID0gY2FjaGU7XHJcblxyXG5cdFx0cmV0dXJuIGNhY2hlOyAvLyB7IHN1bXM6IGNhY2hlLCBzdW06IHN1bSB9OyBTdW0gaXMgaW4gdGhlIGxhc3QgZWxlbWVudC5cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGUgdGhlIGN1bXVsYXRpdmUgc2VnbWVudCBkaXN0YW5jZSBjYWNoZS4gVGhlIG1ldGhvZCBtdXN0IGJlIGNhbGxlZFxyXG5cdCAqIGV2ZXJ5IHRpbWUgY3VydmUgcGFyYW1ldGVycyBhcmUgY2hhbmdlZC4gSWYgYW4gdXBkYXRlZCBjdXJ2ZSBpcyBwYXJ0IG9mIGFcclxuXHQgKiBjb21wb3NlZCBjdXJ2ZSBsaWtlIHtAbGluayBDdXJ2ZVBhdGh9LCB0aGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBvbiB0aGVcclxuXHQgKiBjb21wb3NlZCBjdXJ2ZSwgdG9vLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZUFyY0xlbmd0aHMoKSB7XHJcblxyXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblx0XHR0aGlzLmdldExlbmd0aHMoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHaXZlbiBhbiBpbnRlcnBvbGF0aW9uIGZhY3RvciBpbiB0aGUgcmFuZ2UgYFswLDFdYCwgdGhpcyBtZXRob2QgcmV0dXJucyBhbiB1cGRhdGVkXHJcblx0ICogaW50ZXJwb2xhdGlvbiBmYWN0b3IgaW4gdGhlIHNhbWUgcmFuZ2UgdGhhdCBjYW4gYmUgdWVkIHRvIHNhbXBsZSBlcXVpZGlzdGFudCBwb2ludHNcclxuXHQgKiBmcm9tIGEgY3VydmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdSAtIFRoZSBpbnRlcnBvbGF0aW9uIGZhY3Rvci5cclxuXHQgKiBAcGFyYW0gez9udW1iZXJ9IGRpc3RhbmNlIC0gQW4gb3B0aW9uYWwgZGlzdGFuY2Ugb24gdGhlIGN1cnZlLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIHVwZGF0ZWQgaW50ZXJwb2xhdGlvbiBmYWN0b3IuXHJcblx0ICovXHJcblx0Z2V0VXRvVG1hcHBpbmcoIHUsIGRpc3RhbmNlID0gbnVsbCApIHtcclxuXHJcblx0XHRjb25zdCBhcmNMZW5ndGhzID0gdGhpcy5nZXRMZW5ndGhzKCk7XHJcblxyXG5cdFx0bGV0IGkgPSAwO1xyXG5cdFx0Y29uc3QgaWwgPSBhcmNMZW5ndGhzLmxlbmd0aDtcclxuXHJcblx0XHRsZXQgdGFyZ2V0QXJjTGVuZ3RoOyAvLyBUaGUgdGFyZ2V0ZWQgdSBkaXN0YW5jZSB2YWx1ZSB0byBnZXRcclxuXHJcblx0XHRpZiAoIGRpc3RhbmNlICkge1xyXG5cclxuXHRcdFx0dGFyZ2V0QXJjTGVuZ3RoID0gZGlzdGFuY2U7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHRhcmdldEFyY0xlbmd0aCA9IHUgKiBhcmNMZW5ndGhzWyBpbCAtIDEgXTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gYmluYXJ5IHNlYXJjaCBmb3IgdGhlIGluZGV4IHdpdGggbGFyZ2VzdCB2YWx1ZSBzbWFsbGVyIHRoYW4gdGFyZ2V0IHUgZGlzdGFuY2VcclxuXHJcblx0XHRsZXQgbG93ID0gMCwgaGlnaCA9IGlsIC0gMSwgY29tcGFyaXNvbjtcclxuXHJcblx0XHR3aGlsZSAoIGxvdyA8PSBoaWdoICkge1xyXG5cclxuXHRcdFx0aSA9IE1hdGguZmxvb3IoIGxvdyArICggaGlnaCAtIGxvdyApIC8gMiApOyAvLyBsZXNzIGxpa2VseSB0byBvdmVyZmxvdywgdGhvdWdoIHByb2JhYmx5IG5vdCBpc3N1ZSBoZXJlLCBKUyBkb2Vzbid0IHJlYWxseSBoYXZlIGludGVnZXJzLCBhbGwgbnVtYmVycyBhcmUgZmxvYXRzXHJcblxyXG5cdFx0XHRjb21wYXJpc29uID0gYXJjTGVuZ3Roc1sgaSBdIC0gdGFyZ2V0QXJjTGVuZ3RoO1xyXG5cclxuXHRcdFx0aWYgKCBjb21wYXJpc29uIDwgMCApIHtcclxuXHJcblx0XHRcdFx0bG93ID0gaSArIDE7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBjb21wYXJpc29uID4gMCApIHtcclxuXHJcblx0XHRcdFx0aGlnaCA9IGkgLSAxO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0aGlnaCA9IGk7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdC8vIERPTkVcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aSA9IGhpZ2g7XHJcblxyXG5cdFx0aWYgKCBhcmNMZW5ndGhzWyBpIF0gPT09IHRhcmdldEFyY0xlbmd0aCApIHtcclxuXHJcblx0XHRcdHJldHVybiBpIC8gKCBpbCAtIDEgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gd2UgY291bGQgZ2V0IGZpbmVyIGdyYWluIGF0IGxlbmd0aHMsIG9yIHVzZSBzaW1wbGUgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byBwb2ludHNcclxuXHJcblx0XHRjb25zdCBsZW5ndGhCZWZvcmUgPSBhcmNMZW5ndGhzWyBpIF07XHJcblx0XHRjb25zdCBsZW5ndGhBZnRlciA9IGFyY0xlbmd0aHNbIGkgKyAxIF07XHJcblxyXG5cdFx0Y29uc3Qgc2VnbWVudExlbmd0aCA9IGxlbmd0aEFmdGVyIC0gbGVuZ3RoQmVmb3JlO1xyXG5cclxuXHRcdC8vIGRldGVybWluZSB3aGVyZSB3ZSBhcmUgYmV0d2VlbiB0aGUgJ2JlZm9yZScgYW5kICdhZnRlcicgcG9pbnRzXHJcblxyXG5cdFx0Y29uc3Qgc2VnbWVudEZyYWN0aW9uID0gKCB0YXJnZXRBcmNMZW5ndGggLSBsZW5ndGhCZWZvcmUgKSAvIHNlZ21lbnRMZW5ndGg7XHJcblxyXG5cdFx0Ly8gYWRkIHRoYXQgZnJhY3Rpb25hbCBhbW91bnQgdG8gdFxyXG5cclxuXHRcdGNvbnN0IHQgPSAoIGkgKyBzZWdtZW50RnJhY3Rpb24gKSAvICggaWwgLSAxICk7XHJcblxyXG5cdFx0cmV0dXJuIHQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIHVuaXQgdmVjdG9yIHRhbmdlbnQgZm9yIHRoZSBnaXZlbiBpbnRlcnBvbGF0aW9uIGZhY3Rvci5cclxuXHQgKiBJZiB0aGUgZGVyaXZlZCBjdXJ2ZSBkb2VzIG5vdCBpbXBsZW1lbnQgaXRzIHRhbmdlbnQgZGVyaXZhdGlvbixcclxuXHQgKiB0d28gcG9pbnRzIGEgc21hbGwgZGVsdGEgYXBhcnQgd2lsbCBiZSB1c2VkIHRvIGZpbmQgaXRzIGdyYWRpZW50XHJcblx0ICogd2hpY2ggc2VlbXMgdG8gZ2l2ZSBhIHJlYXNvbmFibGUgYXBwcm94aW1hdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0IC0gVGhlIGludGVycG9sYXRpb24gZmFjdG9yLlxyXG5cdCAqIEBwYXJhbSB7KFZlY3RvcjJ8VmVjdG9yMyl9IFtvcHRpb25hbFRhcmdldF0gLSBUaGUgb3B0aW9uYWwgdGFyZ2V0IHZlY3RvciB0aGUgcmVzdWx0IGlzIHdyaXR0ZW4gdG8uXHJcblx0ICogQHJldHVybiB7KFZlY3RvcjJ8VmVjdG9yMyl9IFRoZSB0YW5nZW50IHZlY3Rvci5cclxuXHQgKi9cclxuXHRnZXRUYW5nZW50KCB0LCBvcHRpb25hbFRhcmdldCApIHtcclxuXHJcblx0XHRjb25zdCBkZWx0YSA9IDAuMDAwMTtcclxuXHRcdGxldCB0MSA9IHQgLSBkZWx0YTtcclxuXHRcdGxldCB0MiA9IHQgKyBkZWx0YTtcclxuXHJcblx0XHQvLyBDYXBwaW5nIGluIGNhc2Ugb2YgZGFuZ2VyXHJcblxyXG5cdFx0aWYgKCB0MSA8IDAgKSB0MSA9IDA7XHJcblx0XHRpZiAoIHQyID4gMSApIHQyID0gMTtcclxuXHJcblx0XHRjb25zdCBwdDEgPSB0aGlzLmdldFBvaW50KCB0MSApO1xyXG5cdFx0Y29uc3QgcHQyID0gdGhpcy5nZXRQb2ludCggdDIgKTtcclxuXHJcblx0XHRjb25zdCB0YW5nZW50ID0gb3B0aW9uYWxUYXJnZXQgfHwgKCAoIHB0MS5pc1ZlY3RvcjIgKSA/IG5ldyBWZWN0b3IyKCkgOiBuZXcgVmVjdG9yMygpICk7XHJcblxyXG5cdFx0dGFuZ2VudC5jb3B5KCBwdDIgKS5zdWIoIHB0MSApLm5vcm1hbGl6ZSgpO1xyXG5cclxuXHRcdHJldHVybiB0YW5nZW50O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNhbWUgYXMge0BsaW5rIEN1cnZlI2dldFRhbmdlbnR9IGJ1dCB3aXRoIGVxdWlkaXN0YW50IHNhbXBsZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdSAtIFRoZSBpbnRlcnBvbGF0aW9uIGZhY3Rvci5cclxuXHQgKiBAcGFyYW0geyhWZWN0b3IyfFZlY3RvcjMpfSBbb3B0aW9uYWxUYXJnZXRdIC0gVGhlIG9wdGlvbmFsIHRhcmdldCB2ZWN0b3IgdGhlIHJlc3VsdCBpcyB3cml0dGVuIHRvLlxyXG5cdCAqIEByZXR1cm4geyhWZWN0b3IyfFZlY3RvcjMpfSBUaGUgdGFuZ2VudCB2ZWN0b3IuXHJcblx0ICogQHNlZSB7QGxpbmsgQ3VydmUjZ2V0UG9pbnRBdH1cclxuXHQgKi9cclxuXHRnZXRUYW5nZW50QXQoIHUsIG9wdGlvbmFsVGFyZ2V0ICkge1xyXG5cclxuXHRcdGNvbnN0IHQgPSB0aGlzLmdldFV0b1RtYXBwaW5nKCB1ICk7XHJcblx0XHRyZXR1cm4gdGhpcy5nZXRUYW5nZW50KCB0LCBvcHRpb25hbFRhcmdldCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyB0aGUgRnJlbmV0IEZyYW1lcy4gUmVxdWlyZXMgYSBjdXJ2ZSBkZWZpbml0aW9uIGluIDNEIHNwYWNlLiBVc2VkXHJcblx0ICogaW4gZ2VvbWV0cmllcyBsaWtlIHtAbGluayBUdWJlR2VvbWV0cnl9IG9yIHtAbGluayBFeHRydWRlR2VvbWV0cnl9LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHNlZ21lbnRzIC0gVGhlIG51bWJlciBvZiBzZWdtZW50cy5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtjbG9zZWQ9ZmFsc2VdIC0gV2hldGhlciB0aGUgY3VydmUgaXMgY2xvc2VkIG9yIG5vdC5cclxuXHQgKiBAcmV0dXJuIHt7dGFuZ2VudHM6IEFycmF5PFZlY3RvcjM+LCBub3JtYWxzOiBBcnJheTxWZWN0b3IzPiwgYmlub3JtYWxzOiBBcnJheTxWZWN0b3IzPn19IFRoZSBGcmVuZXQgRnJhbWVzLlxyXG5cdCAqL1xyXG5cdGNvbXB1dGVGcmVuZXRGcmFtZXMoIHNlZ21lbnRzLCBjbG9zZWQgPSBmYWxzZSApIHtcclxuXHJcblx0XHQvLyBzZWUgaHR0cDovL3d3dy5jcy5pbmRpYW5hLmVkdS9wdWIvdGVjaHJlcG9ydHMvVFI0MjUucGRmXHJcblxyXG5cdFx0Y29uc3Qgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcclxuXHJcblx0XHRjb25zdCB0YW5nZW50cyA9IFtdO1xyXG5cdFx0Y29uc3Qgbm9ybWFscyA9IFtdO1xyXG5cdFx0Y29uc3QgYmlub3JtYWxzID0gW107XHJcblxyXG5cdFx0Y29uc3QgdmVjID0gbmV3IFZlY3RvcjMoKTtcclxuXHRcdGNvbnN0IG1hdCA9IG5ldyBNYXRyaXg0KCk7XHJcblxyXG5cdFx0Ly8gY29tcHV0ZSB0aGUgdGFuZ2VudCB2ZWN0b3JzIGZvciBlYWNoIHNlZ21lbnQgb24gdGhlIGN1cnZlXHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDw9IHNlZ21lbnRzOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdSA9IGkgLyBzZWdtZW50cztcclxuXHJcblx0XHRcdHRhbmdlbnRzWyBpIF0gPSB0aGlzLmdldFRhbmdlbnRBdCggdSwgbmV3IFZlY3RvcjMoKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBzZWxlY3QgYW4gaW5pdGlhbCBub3JtYWwgdmVjdG9yIHBlcnBlbmRpY3VsYXIgdG8gdGhlIGZpcnN0IHRhbmdlbnQgdmVjdG9yLFxyXG5cdFx0Ly8gYW5kIGluIHRoZSBkaXJlY3Rpb24gb2YgdGhlIG1pbmltdW0gdGFuZ2VudCB4eXogY29tcG9uZW50XHJcblxyXG5cdFx0bm9ybWFsc1sgMCBdID0gbmV3IFZlY3RvcjMoKTtcclxuXHRcdGJpbm9ybWFsc1sgMCBdID0gbmV3IFZlY3RvcjMoKTtcclxuXHRcdGxldCBtaW4gPSBOdW1iZXIuTUFYX1ZBTFVFO1xyXG5cdFx0Y29uc3QgdHggPSBNYXRoLmFicyggdGFuZ2VudHNbIDAgXS54ICk7XHJcblx0XHRjb25zdCB0eSA9IE1hdGguYWJzKCB0YW5nZW50c1sgMCBdLnkgKTtcclxuXHRcdGNvbnN0IHR6ID0gTWF0aC5hYnMoIHRhbmdlbnRzWyAwIF0ueiApO1xyXG5cclxuXHRcdGlmICggdHggPD0gbWluICkge1xyXG5cclxuXHRcdFx0bWluID0gdHg7XHJcblx0XHRcdG5vcm1hbC5zZXQoIDEsIDAsIDAgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0eSA8PSBtaW4gKSB7XHJcblxyXG5cdFx0XHRtaW4gPSB0eTtcclxuXHRcdFx0bm9ybWFsLnNldCggMCwgMSwgMCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHR6IDw9IG1pbiApIHtcclxuXHJcblx0XHRcdG5vcm1hbC5zZXQoIDAsIDAsIDEgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dmVjLmNyb3NzVmVjdG9ycyggdGFuZ2VudHNbIDAgXSwgbm9ybWFsICkubm9ybWFsaXplKCk7XHJcblxyXG5cdFx0bm9ybWFsc1sgMCBdLmNyb3NzVmVjdG9ycyggdGFuZ2VudHNbIDAgXSwgdmVjICk7XHJcblx0XHRiaW5vcm1hbHNbIDAgXS5jcm9zc1ZlY3RvcnMoIHRhbmdlbnRzWyAwIF0sIG5vcm1hbHNbIDAgXSApO1xyXG5cclxuXHJcblx0XHQvLyBjb21wdXRlIHRoZSBzbG93bHktdmFyeWluZyBub3JtYWwgYW5kIGJpbm9ybWFsIHZlY3RvcnMgZm9yIGVhY2ggc2VnbWVudCBvbiB0aGUgY3VydmVcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDE7IGkgPD0gc2VnbWVudHM7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRub3JtYWxzWyBpIF0gPSBub3JtYWxzWyBpIC0gMSBdLmNsb25lKCk7XHJcblxyXG5cdFx0XHRiaW5vcm1hbHNbIGkgXSA9IGJpbm9ybWFsc1sgaSAtIDEgXS5jbG9uZSgpO1xyXG5cclxuXHRcdFx0dmVjLmNyb3NzVmVjdG9ycyggdGFuZ2VudHNbIGkgLSAxIF0sIHRhbmdlbnRzWyBpIF0gKTtcclxuXHJcblx0XHRcdGlmICggdmVjLmxlbmd0aCgpID4gTnVtYmVyLkVQU0lMT04gKSB7XHJcblxyXG5cdFx0XHRcdHZlYy5ub3JtYWxpemUoKTtcclxuXHJcblx0XHRcdFx0Y29uc3QgdGhldGEgPSBNYXRoLmFjb3MoIGNsYW1wKCB0YW5nZW50c1sgaSAtIDEgXS5kb3QoIHRhbmdlbnRzWyBpIF0gKSwgLSAxLCAxICkgKTsgLy8gY2xhbXAgZm9yIGZsb2F0aW5nIHB0IGVycm9yc1xyXG5cclxuXHRcdFx0XHRub3JtYWxzWyBpIF0uYXBwbHlNYXRyaXg0KCBtYXQubWFrZVJvdGF0aW9uQXhpcyggdmVjLCB0aGV0YSApICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRiaW5vcm1hbHNbIGkgXS5jcm9zc1ZlY3RvcnMoIHRhbmdlbnRzWyBpIF0sIG5vcm1hbHNbIGkgXSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBpZiB0aGUgY3VydmUgaXMgY2xvc2VkLCBwb3N0cHJvY2VzcyB0aGUgdmVjdG9ycyBzbyB0aGUgZmlyc3QgYW5kIGxhc3Qgbm9ybWFsIHZlY3RvcnMgYXJlIHRoZSBzYW1lXHJcblxyXG5cdFx0aWYgKCBjbG9zZWQgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRsZXQgdGhldGEgPSBNYXRoLmFjb3MoIGNsYW1wKCBub3JtYWxzWyAwIF0uZG90KCBub3JtYWxzWyBzZWdtZW50cyBdICksIC0gMSwgMSApICk7XHJcblx0XHRcdHRoZXRhIC89IHNlZ21lbnRzO1xyXG5cclxuXHRcdFx0aWYgKCB0YW5nZW50c1sgMCBdLmRvdCggdmVjLmNyb3NzVmVjdG9ycyggbm9ybWFsc1sgMCBdLCBub3JtYWxzWyBzZWdtZW50cyBdICkgKSA+IDAgKSB7XHJcblxyXG5cdFx0XHRcdHRoZXRhID0gLSB0aGV0YTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMTsgaSA8PSBzZWdtZW50czsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Ly8gdHdpc3QgYSBsaXR0bGUuLi5cclxuXHRcdFx0XHRub3JtYWxzWyBpIF0uYXBwbHlNYXRyaXg0KCBtYXQubWFrZVJvdGF0aW9uQXhpcyggdGFuZ2VudHNbIGkgXSwgdGhldGEgKiBpICkgKTtcclxuXHRcdFx0XHRiaW5vcm1hbHNbIGkgXS5jcm9zc1ZlY3RvcnMoIHRhbmdlbnRzWyBpIF0sIG5vcm1hbHNbIGkgXSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHR0YW5nZW50czogdGFuZ2VudHMsXHJcblx0XHRcdG5vcm1hbHM6IG5vcm1hbHMsXHJcblx0XHRcdGJpbm9ybWFsczogYmlub3JtYWxzXHJcblx0XHR9O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBuZXcgY3VydmUgd2l0aCBjb3BpZWQgdmFsdWVzIGZyb20gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0N1cnZlfSBBIGNsb25lIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y2xvbmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvcGllcyB0aGUgdmFsdWVzIG9mIHRoZSBnaXZlbiBjdXJ2ZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtDdXJ2ZX0gc291cmNlIC0gVGhlIGN1cnZlIHRvIGNvcHkuXHJcblx0ICogQHJldHVybiB7Q3VydmV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgY3VydmUuXHJcblx0ICovXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zID0gc291cmNlLmFyY0xlbmd0aERpdmlzaW9ucztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXJpYWxpemVzIHRoZSBjdXJ2ZSBpbnRvIEpTT04uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtPYmplY3R9IEEgSlNPTiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzZXJpYWxpemVkIGN1cnZlLlxyXG5cdCAqIEBzZWUge0BsaW5rIE9iamVjdExvYWRlciNwYXJzZX1cclxuXHQgKi9cclxuXHR0b0pTT04oKSB7XHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IHtcclxuXHRcdFx0bWV0YWRhdGE6IHtcclxuXHRcdFx0XHR2ZXJzaW9uOiA0LjYsXHJcblx0XHRcdFx0dHlwZTogJ0N1cnZlJyxcclxuXHRcdFx0XHRnZW5lcmF0b3I6ICdDdXJ2ZS50b0pTT04nXHJcblx0XHRcdH1cclxuXHRcdH07XHJcblxyXG5cdFx0ZGF0YS5hcmNMZW5ndGhEaXZpc2lvbnMgPSB0aGlzLmFyY0xlbmd0aERpdmlzaW9ucztcclxuXHRcdGRhdGEudHlwZSA9IHRoaXMudHlwZTtcclxuXHJcblx0XHRyZXR1cm4gZGF0YTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZXNlcmlhbGl6ZXMgdGhlIGN1cnZlIGZyb20gdGhlIGdpdmVuIEpTT04uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0ganNvbiAtIFRoZSBKU09OIGhvbGRpbmcgdGhlIHNlcmlhbGl6ZWQgY3VydmUuXHJcblx0ICogQHJldHVybiB7Q3VydmV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgY3VydmUuXHJcblx0ICovXHJcblx0ZnJvbUpTT04oIGpzb24gKSB7XHJcblxyXG5cdFx0dGhpcy5hcmNMZW5ndGhEaXZpc2lvbnMgPSBqc29uLmFyY0xlbmd0aERpdmlzaW9ucztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCB7IEN1cnZlIH07XHJcbiIsImltcG9ydCB7IEN1cnZlIH0gZnJvbSAnLi4vY29yZS9DdXJ2ZS5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjIuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgY3VydmUgcmVwcmVzZW50aW5nIGFuIGVsbGlwc2UuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGN1cnZlID0gbmV3IFRIUkVFLkVsbGlwc2VDdXJ2ZShcclxuICogXHQwLCAwLFxyXG4gKiBcdDEwLCAxMCxcclxuICogXHQwLCAyICogTWF0aC5QSSxcclxuICogXHRmYWxzZSxcclxuICogXHQwXHJcbiAqICk7XHJcbiAqXHJcbiAqIGNvbnN0IHBvaW50cyA9IGN1cnZlLmdldFBvaW50cyggNTAgKTtcclxuICogY29uc3QgZ2VvbWV0cnkgPSBuZXcgVEhSRUUuQnVmZmVyR2VvbWV0cnkoKS5zZXRGcm9tUG9pbnRzKCBwb2ludHMgKTtcclxuICpcclxuICogY29uc3QgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IDB4ZmYwMDAwIH0gKTtcclxuICpcclxuICogLy8gQ3JlYXRlIHRoZSBmaW5hbCBvYmplY3QgdG8gYWRkIHRvIHRoZSBzY2VuZVxyXG4gKiBjb25zdCBlbGxpcHNlID0gbmV3IFRIUkVFLkxpbmUoIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIEN1cnZlXHJcbiAqL1xyXG5jbGFzcyBFbGxpcHNlQ3VydmUgZXh0ZW5kcyBDdXJ2ZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgZWxsaXBzZSBjdXJ2ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbYVg9MF0gLSBUaGUgWCBjZW50ZXIgb2YgdGhlIGVsbGlwc2UuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFthWT0wXSAtIFRoZSBZIGNlbnRlciBvZiB0aGUgZWxsaXBzZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3hSYWRpdXM9MV0gLSBUaGUgcmFkaXVzIG9mIHRoZSBlbGxpcHNlIGluIHRoZSB4IGRpcmVjdGlvbi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3lSYWRpdXM9MV0gLSBUaGUgcmFkaXVzIG9mIHRoZSBlbGxpcHNlIGluIHRoZSB5IGRpcmVjdGlvbi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2FTdGFydEFuZ2xlPTBdIC0gVGhlIHN0YXJ0IGFuZ2xlIG9mIHRoZSBjdXJ2ZSBpbiByYWRpYW5zIHN0YXJ0aW5nIGZyb20gdGhlIHBvc2l0aXZlIFggYXhpcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2FFbmRBbmdsZT1NYXRoLlBJKjJdIC0gVGhlIGVuZCBhbmdsZSBvZiB0aGUgY3VydmUgaW4gcmFkaWFucyBzdGFydGluZyBmcm9tIHRoZSBwb3NpdGl2ZSBYIGF4aXMuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbYUNsb2Nrd2lzZT1mYWxzZV0gLSBXaGV0aGVyIHRoZSBlbGxpcHNlIGlzIGRyYXduIGNsb2Nrd2lzZSBvciBub3QuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFthUm90YXRpb249MF0gLSBUaGUgcm90YXRpb24gYW5nbGUgb2YgdGhlIGVsbGlwc2UgaW4gcmFkaWFucywgY291bnRlcmNsb2Nrd2lzZSBmcm9tIHRoZSBwb3NpdGl2ZSBYIGF4aXMuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGFYID0gMCwgYVkgPSAwLCB4UmFkaXVzID0gMSwgeVJhZGl1cyA9IDEsIGFTdGFydEFuZ2xlID0gMCwgYUVuZEFuZ2xlID0gTWF0aC5QSSAqIDIsIGFDbG9ja3dpc2UgPSBmYWxzZSwgYVJvdGF0aW9uID0gMCApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0VsbGlwc2VDdXJ2ZSA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ0VsbGlwc2VDdXJ2ZSc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgWCBjZW50ZXIgb2YgdGhlIGVsbGlwc2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hWCA9IGFYO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIFkgY2VudGVyIG9mIHRoZSBlbGxpcHNlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYVkgPSBhWTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByYWRpdXMgb2YgdGhlIGVsbGlwc2UgaW4gdGhlIHggZGlyZWN0aW9uLlxyXG5cdFx0ICogU2V0dGluZyB0aGUgdGhpcyB2YWx1ZSBlcXVhbCB0byB0aGUge0BsaW5rIEVsbGlwc2VDdXJ2ZSN5UmFkaXVzfSB3aWxsIHJlc3VsdCBpbiBhIGNpcmNsZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnhSYWRpdXMgPSB4UmFkaXVzO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJhZGl1cyBvZiB0aGUgZWxsaXBzZSBpbiB0aGUgeSBkaXJlY3Rpb24uXHJcblx0XHQgKiBTZXR0aW5nIHRoZSB0aGlzIHZhbHVlIGVxdWFsIHRvIHRoZSB7QGxpbmsgRWxsaXBzZUN1cnZlI3hSYWRpdXN9IHdpbGwgcmVzdWx0IGluIGEgY2lyY2xlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMueVJhZGl1cyA9IHlSYWRpdXM7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc3RhcnQgYW5nbGUgb2YgdGhlIGN1cnZlIGluIHJhZGlhbnMgc3RhcnRpbmcgZnJvbSB0aGUgcG9zaXRpdmUgWCBheGlzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYVN0YXJ0QW5nbGUgPSBhU3RhcnRBbmdsZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBlbmQgYW5nbGUgb2YgdGhlIGN1cnZlIGluIHJhZGlhbnMgc3RhcnRpbmcgZnJvbSB0aGUgcG9zaXRpdmUgWCBheGlzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCBNYXRoLlBJKjJcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hRW5kQW5nbGUgPSBhRW5kQW5nbGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSBlbGxpcHNlIGlzIGRyYXduIGNsb2Nrd2lzZSBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFDbG9ja3dpc2UgPSBhQ2xvY2t3aXNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJvdGF0aW9uIGFuZ2xlIG9mIHRoZSBlbGxpcHNlIGluIHJhZGlhbnMsIGNvdW50ZXJjbG9ja3dpc2UgZnJvbSB0aGUgcG9zaXRpdmUgWCBheGlzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYVJvdGF0aW9uID0gYVJvdGF0aW9uO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBwb2ludCBvbiB0aGUgY3VydmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdCAtIEEgaW50ZXJwb2xhdGlvbiBmYWN0b3IgcmVwcmVzZW50aW5nIGEgcG9zaXRpb24gb24gdGhlIGN1cnZlLiBNdXN0IGJlIGluIHRoZSByYW5nZSBgWzAsMV1gLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gW29wdGlvbmFsVGFyZ2V0XSAtIFRoZSBvcHRpb25hbCB0YXJnZXQgdmVjdG9yIHRoZSByZXN1bHQgaXMgd3JpdHRlbiB0by5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBUaGUgcG9zaXRpb24gb24gdGhlIGN1cnZlLlxyXG5cdCAqL1xyXG5cdGdldFBvaW50KCB0LCBvcHRpb25hbFRhcmdldCA9IG5ldyBWZWN0b3IyKCkgKSB7XHJcblxyXG5cdFx0Y29uc3QgcG9pbnQgPSBvcHRpb25hbFRhcmdldDtcclxuXHJcblx0XHRjb25zdCB0d29QaSA9IE1hdGguUEkgKiAyO1xyXG5cdFx0bGV0IGRlbHRhQW5nbGUgPSB0aGlzLmFFbmRBbmdsZSAtIHRoaXMuYVN0YXJ0QW5nbGU7XHJcblx0XHRjb25zdCBzYW1lUG9pbnRzID0gTWF0aC5hYnMoIGRlbHRhQW5nbGUgKSA8IE51bWJlci5FUFNJTE9OO1xyXG5cclxuXHRcdC8vIGVuc3VyZXMgdGhhdCBkZWx0YUFuZ2xlIGlzIDAgLi4gMiBQSVxyXG5cdFx0d2hpbGUgKCBkZWx0YUFuZ2xlIDwgMCApIGRlbHRhQW5nbGUgKz0gdHdvUGk7XHJcblx0XHR3aGlsZSAoIGRlbHRhQW5nbGUgPiB0d29QaSApIGRlbHRhQW5nbGUgLT0gdHdvUGk7XHJcblxyXG5cdFx0aWYgKCBkZWx0YUFuZ2xlIDwgTnVtYmVyLkVQU0lMT04gKSB7XHJcblxyXG5cdFx0XHRpZiAoIHNhbWVQb2ludHMgKSB7XHJcblxyXG5cdFx0XHRcdGRlbHRhQW5nbGUgPSAwO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0ZGVsdGFBbmdsZSA9IHR3b1BpO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMuYUNsb2Nrd2lzZSA9PT0gdHJ1ZSAmJiAhIHNhbWVQb2ludHMgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGRlbHRhQW5nbGUgPT09IHR3b1BpICkge1xyXG5cclxuXHRcdFx0XHRkZWx0YUFuZ2xlID0gLSB0d29QaTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGRlbHRhQW5nbGUgPSBkZWx0YUFuZ2xlIC0gdHdvUGk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGFuZ2xlID0gdGhpcy5hU3RhcnRBbmdsZSArIHQgKiBkZWx0YUFuZ2xlO1xyXG5cdFx0bGV0IHggPSB0aGlzLmFYICsgdGhpcy54UmFkaXVzICogTWF0aC5jb3MoIGFuZ2xlICk7XHJcblx0XHRsZXQgeSA9IHRoaXMuYVkgKyB0aGlzLnlSYWRpdXMgKiBNYXRoLnNpbiggYW5nbGUgKTtcclxuXHJcblx0XHRpZiAoIHRoaXMuYVJvdGF0aW9uICE9PSAwICkge1xyXG5cclxuXHRcdFx0Y29uc3QgY29zID0gTWF0aC5jb3MoIHRoaXMuYVJvdGF0aW9uICk7XHJcblx0XHRcdGNvbnN0IHNpbiA9IE1hdGguc2luKCB0aGlzLmFSb3RhdGlvbiApO1xyXG5cclxuXHRcdFx0Y29uc3QgdHggPSB4IC0gdGhpcy5hWDtcclxuXHRcdFx0Y29uc3QgdHkgPSB5IC0gdGhpcy5hWTtcclxuXHJcblx0XHRcdC8vIFJvdGF0ZSB0aGUgcG9pbnQgYWJvdXQgdGhlIGNlbnRlciBvZiB0aGUgZWxsaXBzZS5cclxuXHRcdFx0eCA9IHR4ICogY29zIC0gdHkgKiBzaW4gKyB0aGlzLmFYO1xyXG5cdFx0XHR5ID0gdHggKiBzaW4gKyB0eSAqIGNvcyArIHRoaXMuYVk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBwb2ludC5zZXQoIHgsIHkgKTtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy5hWCA9IHNvdXJjZS5hWDtcclxuXHRcdHRoaXMuYVkgPSBzb3VyY2UuYVk7XHJcblxyXG5cdFx0dGhpcy54UmFkaXVzID0gc291cmNlLnhSYWRpdXM7XHJcblx0XHR0aGlzLnlSYWRpdXMgPSBzb3VyY2UueVJhZGl1cztcclxuXHJcblx0XHR0aGlzLmFTdGFydEFuZ2xlID0gc291cmNlLmFTdGFydEFuZ2xlO1xyXG5cdFx0dGhpcy5hRW5kQW5nbGUgPSBzb3VyY2UuYUVuZEFuZ2xlO1xyXG5cclxuXHRcdHRoaXMuYUNsb2Nrd2lzZSA9IHNvdXJjZS5hQ2xvY2t3aXNlO1xyXG5cclxuXHRcdHRoaXMuYVJvdGF0aW9uID0gc291cmNlLmFSb3RhdGlvbjtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHR0b0pTT04oKSB7XHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IHN1cGVyLnRvSlNPTigpO1xyXG5cclxuXHRcdGRhdGEuYVggPSB0aGlzLmFYO1xyXG5cdFx0ZGF0YS5hWSA9IHRoaXMuYVk7XHJcblxyXG5cdFx0ZGF0YS54UmFkaXVzID0gdGhpcy54UmFkaXVzO1xyXG5cdFx0ZGF0YS55UmFkaXVzID0gdGhpcy55UmFkaXVzO1xyXG5cclxuXHRcdGRhdGEuYVN0YXJ0QW5nbGUgPSB0aGlzLmFTdGFydEFuZ2xlO1xyXG5cdFx0ZGF0YS5hRW5kQW5nbGUgPSB0aGlzLmFFbmRBbmdsZTtcclxuXHJcblx0XHRkYXRhLmFDbG9ja3dpc2UgPSB0aGlzLmFDbG9ja3dpc2U7XHJcblxyXG5cdFx0ZGF0YS5hUm90YXRpb24gPSB0aGlzLmFSb3RhdGlvbjtcclxuXHJcblx0XHRyZXR1cm4gZGF0YTtcclxuXHJcblx0fVxyXG5cclxuXHRmcm9tSlNPTigganNvbiApIHtcclxuXHJcblx0XHRzdXBlci5mcm9tSlNPTigganNvbiApO1xyXG5cclxuXHRcdHRoaXMuYVggPSBqc29uLmFYO1xyXG5cdFx0dGhpcy5hWSA9IGpzb24uYVk7XHJcblxyXG5cdFx0dGhpcy54UmFkaXVzID0ganNvbi54UmFkaXVzO1xyXG5cdFx0dGhpcy55UmFkaXVzID0ganNvbi55UmFkaXVzO1xyXG5cclxuXHRcdHRoaXMuYVN0YXJ0QW5nbGUgPSBqc29uLmFTdGFydEFuZ2xlO1xyXG5cdFx0dGhpcy5hRW5kQW5nbGUgPSBqc29uLmFFbmRBbmdsZTtcclxuXHJcblx0XHR0aGlzLmFDbG9ja3dpc2UgPSBqc29uLmFDbG9ja3dpc2U7XHJcblxyXG5cdFx0dGhpcy5hUm90YXRpb24gPSBqc29uLmFSb3RhdGlvbjtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgRWxsaXBzZUN1cnZlIH07XHJcbiIsImltcG9ydCB7IEVsbGlwc2VDdXJ2ZSB9IGZyb20gJy4vRWxsaXBzZUN1cnZlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIGN1cnZlIHJlcHJlc2VudGluZyBhbiBhcmMuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBFbGxpcHNlQ3VydmVcclxuICovXHJcbmNsYXNzIEFyY0N1cnZlIGV4dGVuZHMgRWxsaXBzZUN1cnZlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBhcmMgY3VydmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2FYPTBdIC0gVGhlIFggY2VudGVyIG9mIHRoZSBlbGxpcHNlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbYVk9MF0gLSBUaGUgWSBjZW50ZXIgb2YgdGhlIGVsbGlwc2UuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFthUmFkaXVzPTFdIC0gVGhlIHJhZGl1cyBvZiB0aGUgZWxsaXBzZSBpbiB0aGUgeCBkaXJlY3Rpb24uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFthU3RhcnRBbmdsZT0wXSAtIFRoZSBzdGFydCBhbmdsZSBvZiB0aGUgY3VydmUgaW4gcmFkaWFucyBzdGFydGluZyBmcm9tIHRoZSBwb3NpdGl2ZSBYIGF4aXMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFthRW5kQW5nbGU9TWF0aC5QSSoyXSAtIFRoZSBlbmQgYW5nbGUgb2YgdGhlIGN1cnZlIGluIHJhZGlhbnMgc3RhcnRpbmcgZnJvbSB0aGUgcG9zaXRpdmUgWCBheGlzLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FDbG9ja3dpc2U9ZmFsc2VdIC0gV2hldGhlciB0aGUgZWxsaXBzZSBpcyBkcmF3biBjbG9ja3dpc2Ugb3Igbm90LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBhWCwgYVksIGFSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UgKSB7XHJcblxyXG5cdFx0c3VwZXIoIGFYLCBhWSwgYVJhZGl1cywgYVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0FyY0N1cnZlID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnQXJjQ3VydmUnO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBBcmNDdXJ2ZSB9O1xyXG4iLCJpbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuaW1wb3J0IHsgQ3VydmUgfSBmcm9tICcuLi9jb3JlL0N1cnZlLmpzJztcclxuXHJcbmZ1bmN0aW9uIEN1YmljUG9seSgpIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ2VudHJpcGV0YWwgQ2F0bXVsbFJvbSBDdXJ2ZSAtIHdoaWNoIGlzIHVzZWZ1bCBmb3IgYXZvaWRpbmdcclxuXHQqIGN1c3BzIGFuZCBzZWxmLWludGVyc2VjdGlvbnMgaW4gbm9uLXVuaWZvcm0gY2F0bXVsbCByb20gY3VydmVzLlxyXG5cdCogaHR0cDovL3d3dy5jZW15dWtzZWwuY29tL3Jlc2VhcmNoL2NhdG11bGxyb21fcGFyYW0vY2F0bXVsbHJvbS5wZGZcclxuXHQqXHJcblx0KiBjdXJ2ZS50eXBlIGFjY2VwdHMgY2VudHJpcGV0YWwoZGVmYXVsdCksIGNob3JkYWwgYW5kIGNhdG11bGxyb21cclxuXHQqIGN1cnZlLnRlbnNpb24gaXMgdXNlZCBmb3IgY2F0bXVsbHJvbSB3aGljaCBkZWZhdWx0cyB0byAwLjVcclxuXHQqL1xyXG5cclxuXHQvKlxyXG5cdEJhc2VkIG9uIGFuIG9wdGltaXplZCBjKysgc29sdXRpb24gaW5cclxuXHQtIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvOTQ4OTczNi9jYXRtdWxsLXJvbS1jdXJ2ZS13aXRoLW5vLWN1c3BzLWFuZC1uby1zZWxmLWludGVyc2VjdGlvbnMvXHJcblx0LSBodHRwOi8vaWRlb25lLmNvbS9Ob0ViVk1cclxuXHJcblx0VGhpcyBDdWJpY1BvbHkgY2xhc3MgY291bGQgYmUgdXNlZCBmb3IgcmV1c2luZyBzb21lIHZhcmlhYmxlcyBhbmQgY2FsY3VsYXRpb25zLFxyXG5cdGJ1dCBmb3IgdGhyZWUuanMgY3VydmUgdXNlLCBpdCBjb3VsZCBiZSBwb3NzaWJsZSBpbmxpbmVkIGFuZCBmbGF0dGVuIGludG8gYSBzaW5nbGUgZnVuY3Rpb24gY2FsbFxyXG5cdHdoaWNoIGNhbiBiZSBwbGFjZWQgaW4gQ3VydmVVdGlscy5cclxuXHQqL1xyXG5cclxuXHRsZXQgYzAgPSAwLCBjMSA9IDAsIGMyID0gMCwgYzMgPSAwO1xyXG5cclxuXHQvKlxyXG5cdCAqIENvbXB1dGUgY29lZmZpY2llbnRzIGZvciBhIGN1YmljIHBvbHlub21pYWxcclxuXHQgKiAgIHAocykgPSBjMCArIGMxKnMgKyBjMipzXjIgKyBjMypzXjNcclxuXHQgKiBzdWNoIHRoYXRcclxuXHQgKiAgIHAoMCkgPSB4MCwgcCgxKSA9IHgxXHJcblx0ICogIGFuZFxyXG5cdCAqICAgcCcoMCkgPSB0MCwgcCcoMSkgPSB0MS5cclxuXHQgKi9cclxuXHRmdW5jdGlvbiBpbml0KCB4MCwgeDEsIHQwLCB0MSApIHtcclxuXHJcblx0XHRjMCA9IHgwO1xyXG5cdFx0YzEgPSB0MDtcclxuXHRcdGMyID0gLSAzICogeDAgKyAzICogeDEgLSAyICogdDAgLSB0MTtcclxuXHRcdGMzID0gMiAqIHgwIC0gMiAqIHgxICsgdDAgKyB0MTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4ge1xyXG5cclxuXHRcdGluaXRDYXRtdWxsUm9tOiBmdW5jdGlvbiAoIHgwLCB4MSwgeDIsIHgzLCB0ZW5zaW9uICkge1xyXG5cclxuXHRcdFx0aW5pdCggeDEsIHgyLCB0ZW5zaW9uICogKCB4MiAtIHgwICksIHRlbnNpb24gKiAoIHgzIC0geDEgKSApO1xyXG5cclxuXHRcdH0sXHJcblxyXG5cdFx0aW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tOiBmdW5jdGlvbiAoIHgwLCB4MSwgeDIsIHgzLCBkdDAsIGR0MSwgZHQyICkge1xyXG5cclxuXHRcdFx0Ly8gY29tcHV0ZSB0YW5nZW50cyB3aGVuIHBhcmFtZXRlcml6ZWQgaW4gW3QxLHQyXVxyXG5cdFx0XHRsZXQgdDEgPSAoIHgxIC0geDAgKSAvIGR0MCAtICggeDIgLSB4MCApIC8gKCBkdDAgKyBkdDEgKSArICggeDIgLSB4MSApIC8gZHQxO1xyXG5cdFx0XHRsZXQgdDIgPSAoIHgyIC0geDEgKSAvIGR0MSAtICggeDMgLSB4MSApIC8gKCBkdDEgKyBkdDIgKSArICggeDMgLSB4MiApIC8gZHQyO1xyXG5cclxuXHRcdFx0Ly8gcmVzY2FsZSB0YW5nZW50cyBmb3IgcGFyYW1ldHJpemF0aW9uIGluIFswLDFdXHJcblx0XHRcdHQxICo9IGR0MTtcclxuXHRcdFx0dDIgKj0gZHQxO1xyXG5cclxuXHRcdFx0aW5pdCggeDEsIHgyLCB0MSwgdDIgKTtcclxuXHJcblx0XHR9LFxyXG5cclxuXHRcdGNhbGM6IGZ1bmN0aW9uICggdCApIHtcclxuXHJcblx0XHRcdGNvbnN0IHQyID0gdCAqIHQ7XHJcblx0XHRcdGNvbnN0IHQzID0gdDIgKiB0O1xyXG5cdFx0XHRyZXR1cm4gYzAgKyBjMSAqIHQgKyBjMiAqIHQyICsgYzMgKiB0MztcclxuXHJcblx0XHR9XHJcblxyXG5cdH07XHJcblxyXG59XHJcblxyXG4vL1xyXG5cclxuY29uc3QgdG1wID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBweCA9IC8qQF9fUFVSRV9fKi8gbmV3IEN1YmljUG9seSgpO1xyXG5jb25zdCBweSA9IC8qQF9fUFVSRV9fKi8gbmV3IEN1YmljUG9seSgpO1xyXG5jb25zdCBweiA9IC8qQF9fUFVSRV9fKi8gbmV3IEN1YmljUG9seSgpO1xyXG5cclxuLyoqXHJcbiAqIEEgY3VydmUgcmVwcmVzZW50aW5nIGEgQ2F0bXVsbC1Sb20gc3BsaW5lLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiAvL0NyZWF0ZSBhIGNsb3NlZCB3YXZleSBsb29wXHJcbiAqIGNvbnN0IGN1cnZlID0gbmV3IFRIUkVFLkNhdG11bGxSb21DdXJ2ZTMoIFtcclxuICogXHRuZXcgVEhSRUUuVmVjdG9yMyggLTEwLCAwLCAxMCApLFxyXG4gKiBcdG5ldyBUSFJFRS5WZWN0b3IzKCAtNSwgNSwgNSApLFxyXG4gKiBcdG5ldyBUSFJFRS5WZWN0b3IzKCAwLCAwLCAwICksXHJcbiAqIFx0bmV3IFRIUkVFLlZlY3RvcjMoIDUsIC01LCA1ICksXHJcbiAqIFx0bmV3IFRIUkVFLlZlY3RvcjMoIDEwLCAwLCAxMCApXHJcbiAqIF0gKTtcclxuICpcclxuICogY29uc3QgcG9pbnRzID0gY3VydmUuZ2V0UG9pbnRzKCA1MCApO1xyXG4gKiBjb25zdCBnZW9tZXRyeSA9IG5ldyBUSFJFRS5CdWZmZXJHZW9tZXRyeSgpLnNldEZyb21Qb2ludHMoIHBvaW50cyApO1xyXG4gKlxyXG4gKiBjb25zdCBtYXRlcmlhbCA9IG5ldyBUSFJFRS5MaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogMHhmZjAwMDAgfSApO1xyXG4gKlxyXG4gKiAvLyBDcmVhdGUgdGhlIGZpbmFsIG9iamVjdCB0byBhZGQgdG8gdGhlIHNjZW5lXHJcbiAqIGNvbnN0IGN1cnZlT2JqZWN0ID0gbmV3IFRIUkVFLkxpbmUoIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIEN1cnZlXHJcbiAqL1xyXG5jbGFzcyBDYXRtdWxsUm9tQ3VydmUzIGV4dGVuZHMgQ3VydmUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IENhdG11bGwtUm9tIGN1cnZlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxWZWN0b3IzPn0gW3BvaW50c10gLSBBbiBhcnJheSBvZiAzRCBwb2ludHMgZGVmaW5pbmcgdGhlIGN1cnZlLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Nsb3NlZD1mYWxzZV0gLSBXaGV0aGVyIHRoZSBjdXJ2ZSBpcyBjbG9zZWQgb3Igbm90LlxyXG5cdCAqIEBwYXJhbSB7KCdjZW50cmlwZXRhbCd8J2Nob3JkYWwnfCdjYXRtdWxscm9tJyl9IFtjdXJ2ZVR5cGU9J2NlbnRyaXBldGFsJ10gLSBUaGUgY3VydmUgdHlwZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3RlbnNpb249MC41XSAtIFRlbnNpb24gb2YgdGhlIGN1cnZlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwb2ludHMgPSBbXSwgY2xvc2VkID0gZmFsc2UsIGN1cnZlVHlwZSA9ICdjZW50cmlwZXRhbCcsIHRlbnNpb24gPSAwLjUgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNDYXRtdWxsUm9tQ3VydmUzID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnQ2F0bXVsbFJvbUN1cnZlMyc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBhcnJheSBvZiAzRCBwb2ludHMgZGVmaW5pbmcgdGhlIGN1cnZlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxWZWN0b3IzPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wb2ludHMgPSBwb2ludHM7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSBjdXJ2ZSBpcyBjbG9zZWQgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jbG9zZWQgPSBjbG9zZWQ7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY3VydmUgdHlwZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KCdjZW50cmlwZXRhbCd8J2Nob3JkYWwnfCdjYXRtdWxscm9tJyl9XHJcblx0XHQgKiBAZGVmYXVsdCAnY2VudHJpcGV0YWwnXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY3VydmVUeXBlID0gY3VydmVUeXBlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGVuc2lvbiBvZiB0aGUgY3VydmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDAuNVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRlbnNpb24gPSB0ZW5zaW9uO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBwb2ludCBvbiB0aGUgY3VydmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdCAtIEEgaW50ZXJwb2xhdGlvbiBmYWN0b3IgcmVwcmVzZW50aW5nIGEgcG9zaXRpb24gb24gdGhlIGN1cnZlLiBNdXN0IGJlIGluIHRoZSByYW5nZSBgWzAsMV1gLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gW29wdGlvbmFsVGFyZ2V0XSAtIFRoZSBvcHRpb25hbCB0YXJnZXQgdmVjdG9yIHRoZSByZXN1bHQgaXMgd3JpdHRlbiB0by5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBUaGUgcG9zaXRpb24gb24gdGhlIGN1cnZlLlxyXG5cdCAqL1xyXG5cdGdldFBvaW50KCB0LCBvcHRpb25hbFRhcmdldCA9IG5ldyBWZWN0b3IzKCkgKSB7XHJcblxyXG5cdFx0Y29uc3QgcG9pbnQgPSBvcHRpb25hbFRhcmdldDtcclxuXHJcblx0XHRjb25zdCBwb2ludHMgPSB0aGlzLnBvaW50cztcclxuXHRcdGNvbnN0IGwgPSBwb2ludHMubGVuZ3RoO1xyXG5cclxuXHRcdGNvbnN0IHAgPSAoIGwgLSAoIHRoaXMuY2xvc2VkID8gMCA6IDEgKSApICogdDtcclxuXHRcdGxldCBpbnRQb2ludCA9IE1hdGguZmxvb3IoIHAgKTtcclxuXHRcdGxldCB3ZWlnaHQgPSBwIC0gaW50UG9pbnQ7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmNsb3NlZCApIHtcclxuXHJcblx0XHRcdGludFBvaW50ICs9IGludFBvaW50ID4gMCA/IDAgOiAoIE1hdGguZmxvb3IoIE1hdGguYWJzKCBpbnRQb2ludCApIC8gbCApICsgMSApICogbDtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCB3ZWlnaHQgPT09IDAgJiYgaW50UG9pbnQgPT09IGwgLSAxICkge1xyXG5cclxuXHRcdFx0aW50UG9pbnQgPSBsIC0gMjtcclxuXHRcdFx0d2VpZ2h0ID0gMTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0bGV0IHAwLCBwMzsgLy8gNCBwb2ludHMgKHAxICYgcDIgZGVmaW5lZCBiZWxvdylcclxuXHJcblx0XHRpZiAoIHRoaXMuY2xvc2VkIHx8IGludFBvaW50ID4gMCApIHtcclxuXHJcblx0XHRcdHAwID0gcG9pbnRzWyAoIGludFBvaW50IC0gMSApICUgbCBdO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHQvLyBleHRyYXBvbGF0ZSBmaXJzdCBwb2ludFxyXG5cdFx0XHR0bXAuc3ViVmVjdG9ycyggcG9pbnRzWyAwIF0sIHBvaW50c1sgMSBdICkuYWRkKCBwb2ludHNbIDAgXSApO1xyXG5cdFx0XHRwMCA9IHRtcDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgcDEgPSBwb2ludHNbIGludFBvaW50ICUgbCBdO1xyXG5cdFx0Y29uc3QgcDIgPSBwb2ludHNbICggaW50UG9pbnQgKyAxICkgJSBsIF07XHJcblxyXG5cdFx0aWYgKCB0aGlzLmNsb3NlZCB8fCBpbnRQb2ludCArIDIgPCBsICkge1xyXG5cclxuXHRcdFx0cDMgPSBwb2ludHNbICggaW50UG9pbnQgKyAyICkgJSBsIF07XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdC8vIGV4dHJhcG9sYXRlIGxhc3QgcG9pbnRcclxuXHRcdFx0dG1wLnN1YlZlY3RvcnMoIHBvaW50c1sgbCAtIDEgXSwgcG9pbnRzWyBsIC0gMiBdICkuYWRkKCBwb2ludHNbIGwgLSAxIF0gKTtcclxuXHRcdFx0cDMgPSB0bXA7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy5jdXJ2ZVR5cGUgPT09ICdjZW50cmlwZXRhbCcgfHwgdGhpcy5jdXJ2ZVR5cGUgPT09ICdjaG9yZGFsJyApIHtcclxuXHJcblx0XHRcdC8vIGluaXQgQ2VudHJpcGV0YWwgLyBDaG9yZGFsIENhdG11bGwtUm9tXHJcblx0XHRcdGNvbnN0IHBvdyA9IHRoaXMuY3VydmVUeXBlID09PSAnY2hvcmRhbCcgPyAwLjUgOiAwLjI1O1xyXG5cdFx0XHRsZXQgZHQwID0gTWF0aC5wb3coIHAwLmRpc3RhbmNlVG9TcXVhcmVkKCBwMSApLCBwb3cgKTtcclxuXHRcdFx0bGV0IGR0MSA9IE1hdGgucG93KCBwMS5kaXN0YW5jZVRvU3F1YXJlZCggcDIgKSwgcG93ICk7XHJcblx0XHRcdGxldCBkdDIgPSBNYXRoLnBvdyggcDIuZGlzdGFuY2VUb1NxdWFyZWQoIHAzICksIHBvdyApO1xyXG5cclxuXHRcdFx0Ly8gc2FmZXR5IGNoZWNrIGZvciByZXBlYXRlZCBwb2ludHNcclxuXHRcdFx0aWYgKCBkdDEgPCAxZS00ICkgZHQxID0gMS4wO1xyXG5cdFx0XHRpZiAoIGR0MCA8IDFlLTQgKSBkdDAgPSBkdDE7XHJcblx0XHRcdGlmICggZHQyIDwgMWUtNCApIGR0MiA9IGR0MTtcclxuXHJcblx0XHRcdHB4LmluaXROb251bmlmb3JtQ2F0bXVsbFJvbSggcDAueCwgcDEueCwgcDIueCwgcDMueCwgZHQwLCBkdDEsIGR0MiApO1xyXG5cdFx0XHRweS5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20oIHAwLnksIHAxLnksIHAyLnksIHAzLnksIGR0MCwgZHQxLCBkdDIgKTtcclxuXHRcdFx0cHouaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tKCBwMC56LCBwMS56LCBwMi56LCBwMy56LCBkdDAsIGR0MSwgZHQyICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggdGhpcy5jdXJ2ZVR5cGUgPT09ICdjYXRtdWxscm9tJyApIHtcclxuXHJcblx0XHRcdHB4LmluaXRDYXRtdWxsUm9tKCBwMC54LCBwMS54LCBwMi54LCBwMy54LCB0aGlzLnRlbnNpb24gKTtcclxuXHRcdFx0cHkuaW5pdENhdG11bGxSb20oIHAwLnksIHAxLnksIHAyLnksIHAzLnksIHRoaXMudGVuc2lvbiApO1xyXG5cdFx0XHRwei5pbml0Q2F0bXVsbFJvbSggcDAueiwgcDEueiwgcDIueiwgcDMueiwgdGhpcy50ZW5zaW9uICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHBvaW50LnNldChcclxuXHRcdFx0cHguY2FsYyggd2VpZ2h0ICksXHJcblx0XHRcdHB5LmNhbGMoIHdlaWdodCApLFxyXG5cdFx0XHRwei5jYWxjKCB3ZWlnaHQgKVxyXG5cdFx0KTtcclxuXHJcblx0XHRyZXR1cm4gcG9pbnQ7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMucG9pbnRzID0gW107XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gc291cmNlLnBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgcG9pbnQgPSBzb3VyY2UucG9pbnRzWyBpIF07XHJcblxyXG5cdFx0XHR0aGlzLnBvaW50cy5wdXNoKCBwb2ludC5jbG9uZSgpICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuY2xvc2VkID0gc291cmNlLmNsb3NlZDtcclxuXHRcdHRoaXMuY3VydmVUeXBlID0gc291cmNlLmN1cnZlVHlwZTtcclxuXHRcdHRoaXMudGVuc2lvbiA9IHNvdXJjZS50ZW5zaW9uO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdHRvSlNPTigpIHtcclxuXHJcblx0XHRjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCk7XHJcblxyXG5cdFx0ZGF0YS5wb2ludHMgPSBbXTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSB0aGlzLnBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgcG9pbnQgPSB0aGlzLnBvaW50c1sgaSBdO1xyXG5cdFx0XHRkYXRhLnBvaW50cy5wdXNoKCBwb2ludC50b0FycmF5KCkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0ZGF0YS5jbG9zZWQgPSB0aGlzLmNsb3NlZDtcclxuXHRcdGRhdGEuY3VydmVUeXBlID0gdGhpcy5jdXJ2ZVR5cGU7XHJcblx0XHRkYXRhLnRlbnNpb24gPSB0aGlzLnRlbnNpb247XHJcblxyXG5cdFx0cmV0dXJuIGRhdGE7XHJcblxyXG5cdH1cclxuXHJcblx0ZnJvbUpTT04oIGpzb24gKSB7XHJcblxyXG5cdFx0c3VwZXIuZnJvbUpTT04oIGpzb24gKTtcclxuXHJcblx0XHR0aGlzLnBvaW50cyA9IFtdO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGpzb24ucG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBwb2ludCA9IGpzb24ucG9pbnRzWyBpIF07XHJcblx0XHRcdHRoaXMucG9pbnRzLnB1c2goIG5ldyBWZWN0b3IzKCkuZnJvbUFycmF5KCBwb2ludCApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuY2xvc2VkID0ganNvbi5jbG9zZWQ7XHJcblx0XHR0aGlzLmN1cnZlVHlwZSA9IGpzb24uY3VydmVUeXBlO1xyXG5cdFx0dGhpcy50ZW5zaW9uID0ganNvbi50ZW5zaW9uO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBDYXRtdWxsUm9tQ3VydmUzIH07XHJcbiIsIi8vIEJlemllciBDdXJ2ZXMgZm9ybXVsYXMgb2J0YWluZWQgZnJvbTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQiVDMyVBOXppZXJfY3VydmVcclxuXHJcbi8qKlxyXG4gKiBDb21wdXRlcyBhIHBvaW50IG9uIGEgQ2F0bXVsbC1Sb20gc3BsaW5lLlxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdCAtIFRoZSBpbnRlcnBvbGF0aW9uIGZhY3Rvci5cclxuICogQHBhcmFtIHtudW1iZXJ9IHAwIC0gVGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBwMSAtIFRoZSBzZWNvbmQgY29udHJvbCBwb2ludC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHAyIC0gVGhlIHRoaXJkIGNvbnRyb2wgcG9pbnQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBwMyAtIFRoZSBmb3VydGggY29udHJvbCBwb2ludC5cclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgY2FsY3VsYXRlZCBwb2ludCBvbiBhIENhdG11bGwtUm9tIHNwbGluZS5cclxuICovXHJcbmZ1bmN0aW9uIENhdG11bGxSb20oIHQsIHAwLCBwMSwgcDIsIHAzICkge1xyXG5cclxuXHRjb25zdCB2MCA9ICggcDIgLSBwMCApICogMC41O1xyXG5cdGNvbnN0IHYxID0gKCBwMyAtIHAxICkgKiAwLjU7XHJcblx0Y29uc3QgdDIgPSB0ICogdDtcclxuXHRjb25zdCB0MyA9IHQgKiB0MjtcclxuXHRyZXR1cm4gKCAyICogcDEgLSAyICogcDIgKyB2MCArIHYxICkgKiB0MyArICggLSAzICogcDEgKyAzICogcDIgLSAyICogdjAgLSB2MSApICogdDIgKyB2MCAqIHQgKyBwMTtcclxuXHJcbn1cclxuXHJcbi8vXHJcblxyXG5mdW5jdGlvbiBRdWFkcmF0aWNCZXppZXJQMCggdCwgcCApIHtcclxuXHJcblx0Y29uc3QgayA9IDEgLSB0O1xyXG5cdHJldHVybiBrICogayAqIHA7XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBRdWFkcmF0aWNCZXppZXJQMSggdCwgcCApIHtcclxuXHJcblx0cmV0dXJuIDIgKiAoIDEgLSB0ICkgKiB0ICogcDtcclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIFF1YWRyYXRpY0JlemllclAyKCB0LCBwICkge1xyXG5cclxuXHRyZXR1cm4gdCAqIHQgKiBwO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIENvbXB1dGVzIGEgcG9pbnQgb24gYSBRdWFkcmF0aWMgQmV6aWVyIGN1cnZlLlxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdCAtIFRoZSBpbnRlcnBvbGF0aW9uIGZhY3Rvci5cclxuICogQHBhcmFtIHtudW1iZXJ9IHAwIC0gVGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBwMSAtIFRoZSBzZWNvbmQgY29udHJvbCBwb2ludC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHAyIC0gVGhlIHRoaXJkIGNvbnRyb2wgcG9pbnQuXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGNhbGN1bGF0ZWQgcG9pbnQgb24gYSBRdWFkcmF0aWMgQmV6aWVyIGN1cnZlLlxyXG4gKi9cclxuZnVuY3Rpb24gUXVhZHJhdGljQmV6aWVyKCB0LCBwMCwgcDEsIHAyICkge1xyXG5cclxuXHRyZXR1cm4gUXVhZHJhdGljQmV6aWVyUDAoIHQsIHAwICkgKyBRdWFkcmF0aWNCZXppZXJQMSggdCwgcDEgKSArXHJcblx0XHRRdWFkcmF0aWNCZXppZXJQMiggdCwgcDIgKTtcclxuXHJcbn1cclxuXHJcbi8vXHJcblxyXG5mdW5jdGlvbiBDdWJpY0JlemllclAwKCB0LCBwICkge1xyXG5cclxuXHRjb25zdCBrID0gMSAtIHQ7XHJcblx0cmV0dXJuIGsgKiBrICogayAqIHA7XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBDdWJpY0JlemllclAxKCB0LCBwICkge1xyXG5cclxuXHRjb25zdCBrID0gMSAtIHQ7XHJcblx0cmV0dXJuIDMgKiBrICogayAqIHQgKiBwO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gQ3ViaWNCZXppZXJQMiggdCwgcCApIHtcclxuXHJcblx0cmV0dXJuIDMgKiAoIDEgLSB0ICkgKiB0ICogdCAqIHA7XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBDdWJpY0JlemllclAzKCB0LCBwICkge1xyXG5cclxuXHRyZXR1cm4gdCAqIHQgKiB0ICogcDtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb21wdXRlcyBhIHBvaW50IG9uIGEgQ3ViaWMgQmV6aWVyIGN1cnZlLlxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdCAtIFRoZSBpbnRlcnBvbGF0aW9uIGZhY3Rvci5cclxuICogQHBhcmFtIHtudW1iZXJ9IHAwIC0gVGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBwMSAtIFRoZSBzZWNvbmQgY29udHJvbCBwb2ludC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHAyIC0gVGhlIHRoaXJkIGNvbnRyb2wgcG9pbnQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBwMyAtIFRoZSBmb3VydGggY29udHJvbCBwb2ludC5cclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgY2FsY3VsYXRlZCBwb2ludCBvbiBhIEN1YmljIEJlemllciBjdXJ2ZS5cclxuICovXHJcbmZ1bmN0aW9uIEN1YmljQmV6aWVyKCB0LCBwMCwgcDEsIHAyLCBwMyApIHtcclxuXHJcblx0cmV0dXJuIEN1YmljQmV6aWVyUDAoIHQsIHAwICkgKyBDdWJpY0JlemllclAxKCB0LCBwMSApICsgQ3ViaWNCZXppZXJQMiggdCwgcDIgKSArXHJcblx0XHRDdWJpY0JlemllclAzKCB0LCBwMyApO1xyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgQ2F0bXVsbFJvbSwgUXVhZHJhdGljQmV6aWVyLCBDdWJpY0JlemllciB9O1xyXG4iLCJpbXBvcnQgeyBDdXJ2ZSB9IGZyb20gJy4uL2NvcmUvQ3VydmUuanMnO1xyXG5pbXBvcnQgeyBDdWJpY0JlemllciB9IGZyb20gJy4uL2NvcmUvSW50ZXJwb2xhdGlvbnMuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IyLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIGN1cnZlIHJlcHJlc2VudGluZyBhIDJEIEN1YmljIEJlemllciBjdXJ2ZS5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgY3VydmUgPSBuZXcgVEhSRUUuQ3ViaWNCZXppZXJDdXJ2ZShcclxuICogXHRuZXcgVEhSRUUuVmVjdG9yMiggLSAwLCAwICksXHJcbiAqIFx0bmV3IFRIUkVFLlZlY3RvcjIoIC0gNSwgMTUgKSxcclxuICogXHRuZXcgVEhSRUUuVmVjdG9yMiggMjAsIDE1ICksXHJcbiAqIFx0bmV3IFRIUkVFLlZlY3RvcjIoIDEwLCAwIClcclxuICogKTtcclxuICpcclxuICogY29uc3QgcG9pbnRzID0gY3VydmUuZ2V0UG9pbnRzKCA1MCApO1xyXG4gKiBjb25zdCBnZW9tZXRyeSA9IG5ldyBUSFJFRS5CdWZmZXJHZW9tZXRyeSgpLnNldEZyb21Qb2ludHMoIHBvaW50cyApO1xyXG4gKlxyXG4gKiBjb25zdCBtYXRlcmlhbCA9IG5ldyBUSFJFRS5MaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogMHhmZjAwMDAgfSApO1xyXG4gKlxyXG4gKiAvLyBDcmVhdGUgdGhlIGZpbmFsIG9iamVjdCB0byBhZGQgdG8gdGhlIHNjZW5lXHJcbiAqIGNvbnN0IGN1cnZlT2JqZWN0ID0gbmV3IFRIUkVFLkxpbmUoIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIEN1cnZlXHJcbiAqL1xyXG5jbGFzcyBDdWJpY0JlemllckN1cnZlIGV4dGVuZHMgQ3VydmUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IEN1YmljIEJlemllciBjdXJ2ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gW3YwXSAtIFRoZSBzdGFydCBwb2ludC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IFt2MV0gLSBUaGUgZmlyc3QgY29udHJvbCBwb2ludC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IFt2Ml0gLSBUaGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSBbdjNdIC0gVGhlIGVuZCBwb2ludC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggdjAgPSBuZXcgVmVjdG9yMigpLCB2MSA9IG5ldyBWZWN0b3IyKCksIHYyID0gbmV3IFZlY3RvcjIoKSwgdjMgPSBuZXcgVmVjdG9yMigpICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzQ3ViaWNCZXppZXJDdXJ2ZSA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ0N1YmljQmV6aWVyQ3VydmUnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHN0YXJ0IHBvaW50LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3IyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnYwID0gdjA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZmlyc3QgY29udHJvbCBwb2ludC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yMn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52MSA9IHYxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHNlY29uZCBjb250cm9sIHBvaW50LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3IyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnYyID0gdjI7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZW5kIHBvaW50LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3IyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnYzID0gdjM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIHBvaW50IG9uIHRoZSBjdXJ2ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0IC0gQSBpbnRlcnBvbGF0aW9uIGZhY3RvciByZXByZXNlbnRpbmcgYSBwb3NpdGlvbiBvbiB0aGUgY3VydmUuIE11c3QgYmUgaW4gdGhlIHJhbmdlIGBbMCwxXWAuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSBbb3B0aW9uYWxUYXJnZXRdIC0gVGhlIG9wdGlvbmFsIHRhcmdldCB2ZWN0b3IgdGhlIHJlc3VsdCBpcyB3cml0dGVuIHRvLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IFRoZSBwb3NpdGlvbiBvbiB0aGUgY3VydmUuXHJcblx0ICovXHJcblx0Z2V0UG9pbnQoIHQsIG9wdGlvbmFsVGFyZ2V0ID0gbmV3IFZlY3RvcjIoKSApIHtcclxuXHJcblx0XHRjb25zdCBwb2ludCA9IG9wdGlvbmFsVGFyZ2V0O1xyXG5cclxuXHRcdGNvbnN0IHYwID0gdGhpcy52MCwgdjEgPSB0aGlzLnYxLCB2MiA9IHRoaXMudjIsIHYzID0gdGhpcy52MztcclxuXHJcblx0XHRwb2ludC5zZXQoXHJcblx0XHRcdEN1YmljQmV6aWVyKCB0LCB2MC54LCB2MS54LCB2Mi54LCB2My54ICksXHJcblx0XHRcdEN1YmljQmV6aWVyKCB0LCB2MC55LCB2MS55LCB2Mi55LCB2My55IClcclxuXHRcdCk7XHJcblxyXG5cdFx0cmV0dXJuIHBvaW50O1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLnYwLmNvcHkoIHNvdXJjZS52MCApO1xyXG5cdFx0dGhpcy52MS5jb3B5KCBzb3VyY2UudjEgKTtcclxuXHRcdHRoaXMudjIuY29weSggc291cmNlLnYyICk7XHJcblx0XHR0aGlzLnYzLmNvcHkoIHNvdXJjZS52MyApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdHRvSlNPTigpIHtcclxuXHJcblx0XHRjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCk7XHJcblxyXG5cdFx0ZGF0YS52MCA9IHRoaXMudjAudG9BcnJheSgpO1xyXG5cdFx0ZGF0YS52MSA9IHRoaXMudjEudG9BcnJheSgpO1xyXG5cdFx0ZGF0YS52MiA9IHRoaXMudjIudG9BcnJheSgpO1xyXG5cdFx0ZGF0YS52MyA9IHRoaXMudjMudG9BcnJheSgpO1xyXG5cclxuXHRcdHJldHVybiBkYXRhO1xyXG5cclxuXHR9XHJcblxyXG5cdGZyb21KU09OKCBqc29uICkge1xyXG5cclxuXHRcdHN1cGVyLmZyb21KU09OKCBqc29uICk7XHJcblxyXG5cdFx0dGhpcy52MC5mcm9tQXJyYXkoIGpzb24udjAgKTtcclxuXHRcdHRoaXMudjEuZnJvbUFycmF5KCBqc29uLnYxICk7XHJcblx0XHR0aGlzLnYyLmZyb21BcnJheSgganNvbi52MiApO1xyXG5cdFx0dGhpcy52My5mcm9tQXJyYXkoIGpzb24udjMgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgQ3ViaWNCZXppZXJDdXJ2ZSB9O1xyXG4iLCJpbXBvcnQgeyBDdXJ2ZSB9IGZyb20gJy4uL2NvcmUvQ3VydmUuanMnO1xyXG5pbXBvcnQgeyBDdWJpY0JlemllciB9IGZyb20gJy4uL2NvcmUvSW50ZXJwb2xhdGlvbnMuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIGN1cnZlIHJlcHJlc2VudGluZyBhIDNEIEN1YmljIEJlemllciBjdXJ2ZS5cclxuICpcclxuICogQGF1Z21lbnRzIEN1cnZlXHJcbiAqL1xyXG5jbGFzcyBDdWJpY0JlemllckN1cnZlMyBleHRlbmRzIEN1cnZlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBDdWJpYyBCZXppZXIgY3VydmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IFt2MF0gLSBUaGUgc3RhcnQgcG9pbnQuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBbdjFdIC0gVGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBbdjJdIC0gVGhlIHNlY29uZCBjb250cm9sIHBvaW50LlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gW3YzXSAtIFRoZSBlbmQgcG9pbnQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHYwID0gbmV3IFZlY3RvcjMoKSwgdjEgPSBuZXcgVmVjdG9yMygpLCB2MiA9IG5ldyBWZWN0b3IzKCksIHYzID0gbmV3IFZlY3RvcjMoKSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0N1YmljQmV6aWVyQ3VydmUzID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnQ3ViaWNCZXppZXJDdXJ2ZTMnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHN0YXJ0IHBvaW50LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3IzfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnYwID0gdjA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZmlyc3QgY29udHJvbCBwb2ludC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yM31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52MSA9IHYxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHNlY29uZCBjb250cm9sIHBvaW50LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3IzfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnYyID0gdjI7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZW5kIHBvaW50LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3IzfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnYzID0gdjM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIHBvaW50IG9uIHRoZSBjdXJ2ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0IC0gQSBpbnRlcnBvbGF0aW9uIGZhY3RvciByZXByZXNlbnRpbmcgYSBwb3NpdGlvbiBvbiB0aGUgY3VydmUuIE11c3QgYmUgaW4gdGhlIHJhbmdlIGBbMCwxXWAuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBbb3B0aW9uYWxUYXJnZXRdIC0gVGhlIG9wdGlvbmFsIHRhcmdldCB2ZWN0b3IgdGhlIHJlc3VsdCBpcyB3cml0dGVuIHRvLlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IFRoZSBwb3NpdGlvbiBvbiB0aGUgY3VydmUuXHJcblx0ICovXHJcblx0Z2V0UG9pbnQoIHQsIG9wdGlvbmFsVGFyZ2V0ID0gbmV3IFZlY3RvcjMoKSApIHtcclxuXHJcblx0XHRjb25zdCBwb2ludCA9IG9wdGlvbmFsVGFyZ2V0O1xyXG5cclxuXHRcdGNvbnN0IHYwID0gdGhpcy52MCwgdjEgPSB0aGlzLnYxLCB2MiA9IHRoaXMudjIsIHYzID0gdGhpcy52MztcclxuXHJcblx0XHRwb2ludC5zZXQoXHJcblx0XHRcdEN1YmljQmV6aWVyKCB0LCB2MC54LCB2MS54LCB2Mi54LCB2My54ICksXHJcblx0XHRcdEN1YmljQmV6aWVyKCB0LCB2MC55LCB2MS55LCB2Mi55LCB2My55ICksXHJcblx0XHRcdEN1YmljQmV6aWVyKCB0LCB2MC56LCB2MS56LCB2Mi56LCB2My56IClcclxuXHRcdCk7XHJcblxyXG5cdFx0cmV0dXJuIHBvaW50O1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLnYwLmNvcHkoIHNvdXJjZS52MCApO1xyXG5cdFx0dGhpcy52MS5jb3B5KCBzb3VyY2UudjEgKTtcclxuXHRcdHRoaXMudjIuY29weSggc291cmNlLnYyICk7XHJcblx0XHR0aGlzLnYzLmNvcHkoIHNvdXJjZS52MyApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdHRvSlNPTigpIHtcclxuXHJcblx0XHRjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCk7XHJcblxyXG5cdFx0ZGF0YS52MCA9IHRoaXMudjAudG9BcnJheSgpO1xyXG5cdFx0ZGF0YS52MSA9IHRoaXMudjEudG9BcnJheSgpO1xyXG5cdFx0ZGF0YS52MiA9IHRoaXMudjIudG9BcnJheSgpO1xyXG5cdFx0ZGF0YS52MyA9IHRoaXMudjMudG9BcnJheSgpO1xyXG5cclxuXHRcdHJldHVybiBkYXRhO1xyXG5cclxuXHR9XHJcblxyXG5cdGZyb21KU09OKCBqc29uICkge1xyXG5cclxuXHRcdHN1cGVyLmZyb21KU09OKCBqc29uICk7XHJcblxyXG5cdFx0dGhpcy52MC5mcm9tQXJyYXkoIGpzb24udjAgKTtcclxuXHRcdHRoaXMudjEuZnJvbUFycmF5KCBqc29uLnYxICk7XHJcblx0XHR0aGlzLnYyLmZyb21BcnJheSgganNvbi52MiApO1xyXG5cdFx0dGhpcy52My5mcm9tQXJyYXkoIGpzb24udjMgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgQ3ViaWNCZXppZXJDdXJ2ZTMgfTtcclxuIiwiaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMi5qcyc7XHJcbmltcG9ydCB7IEN1cnZlIH0gZnJvbSAnLi4vY29yZS9DdXJ2ZS5qcyc7XHJcblxyXG4vKipcclxuICogQSBjdXJ2ZSByZXByZXNlbnRpbmcgYSAyRCBsaW5lIHNlZ21lbnQuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBDdXJ2ZVxyXG4gKi9cclxuY2xhc3MgTGluZUN1cnZlIGV4dGVuZHMgQ3VydmUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGxpbmUgY3VydmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IFt2MV0gLSBUaGUgc3RhcnQgcG9pbnQuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSBbdjJdIC0gVGhlIGVuZCBwb2ludC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggdjEgPSBuZXcgVmVjdG9yMigpLCB2MiA9IG5ldyBWZWN0b3IyKCkgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNMaW5lQ3VydmUgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdMaW5lQ3VydmUnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHN0YXJ0IHBvaW50LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3IyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnYxID0gdjE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZW5kIHBvaW50LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3IyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnYyID0gdjI7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIHBvaW50IG9uIHRoZSBsaW5lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHQgLSBBIGludGVycG9sYXRpb24gZmFjdG9yIHJlcHJlc2VudGluZyBhIHBvc2l0aW9uIG9uIHRoZSBsaW5lLiBNdXN0IGJlIGluIHRoZSByYW5nZSBgWzAsMV1gLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gW29wdGlvbmFsVGFyZ2V0XSAtIFRoZSBvcHRpb25hbCB0YXJnZXQgdmVjdG9yIHRoZSByZXN1bHQgaXMgd3JpdHRlbiB0by5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBUaGUgcG9zaXRpb24gb24gdGhlIGxpbmUuXHJcblx0ICovXHJcblx0Z2V0UG9pbnQoIHQsIG9wdGlvbmFsVGFyZ2V0ID0gbmV3IFZlY3RvcjIoKSApIHtcclxuXHJcblx0XHRjb25zdCBwb2ludCA9IG9wdGlvbmFsVGFyZ2V0O1xyXG5cclxuXHRcdGlmICggdCA9PT0gMSApIHtcclxuXHJcblx0XHRcdHBvaW50LmNvcHkoIHRoaXMudjIgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0cG9pbnQuY29weSggdGhpcy52MiApLnN1YiggdGhpcy52MSApO1xyXG5cdFx0XHRwb2ludC5tdWx0aXBseVNjYWxhciggdCApLmFkZCggdGhpcy52MSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcG9pbnQ7XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gTGluZSBjdXJ2ZSBpcyBsaW5lYXIsIHNvIHdlIGNhbiBvdmVyd3JpdGUgZGVmYXVsdCBnZXRQb2ludEF0XHJcblx0Z2V0UG9pbnRBdCggdSwgb3B0aW9uYWxUYXJnZXQgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZ2V0UG9pbnQoIHUsIG9wdGlvbmFsVGFyZ2V0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0VGFuZ2VudCggdCwgb3B0aW9uYWxUYXJnZXQgPSBuZXcgVmVjdG9yMigpICkge1xyXG5cclxuXHRcdHJldHVybiBvcHRpb25hbFRhcmdldC5zdWJWZWN0b3JzKCB0aGlzLnYyLCB0aGlzLnYxICkubm9ybWFsaXplKCk7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0VGFuZ2VudEF0KCB1LCBvcHRpb25hbFRhcmdldCApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5nZXRUYW5nZW50KCB1LCBvcHRpb25hbFRhcmdldCApO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLnYxLmNvcHkoIHNvdXJjZS52MSApO1xyXG5cdFx0dGhpcy52Mi5jb3B5KCBzb3VyY2UudjIgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHR0b0pTT04oKSB7XHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IHN1cGVyLnRvSlNPTigpO1xyXG5cclxuXHRcdGRhdGEudjEgPSB0aGlzLnYxLnRvQXJyYXkoKTtcclxuXHRcdGRhdGEudjIgPSB0aGlzLnYyLnRvQXJyYXkoKTtcclxuXHJcblx0XHRyZXR1cm4gZGF0YTtcclxuXHJcblx0fVxyXG5cclxuXHRmcm9tSlNPTigganNvbiApIHtcclxuXHJcblx0XHRzdXBlci5mcm9tSlNPTigganNvbiApO1xyXG5cclxuXHRcdHRoaXMudjEuZnJvbUFycmF5KCBqc29uLnYxICk7XHJcblx0XHR0aGlzLnYyLmZyb21BcnJheSgganNvbi52MiApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBMaW5lQ3VydmUgfTtcclxuIiwiaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcbmltcG9ydCB7IEN1cnZlIH0gZnJvbSAnLi4vY29yZS9DdXJ2ZS5qcyc7XHJcblxyXG4vKipcclxuICogQSBjdXJ2ZSByZXByZXNlbnRpbmcgYSAzRCBsaW5lIHNlZ21lbnQuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBDdXJ2ZVxyXG4gKi9cclxuY2xhc3MgTGluZUN1cnZlMyBleHRlbmRzIEN1cnZlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBsaW5lIGN1cnZlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBbdjFdIC0gVGhlIHN0YXJ0IHBvaW50LlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gW3YyXSAtIFRoZSBlbmQgcG9pbnQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHYxID0gbmV3IFZlY3RvcjMoKSwgdjIgPSBuZXcgVmVjdG9yMygpICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzTGluZUN1cnZlMyA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ0xpbmVDdXJ2ZTMnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHN0YXJ0IHBvaW50LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3IzfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnYxID0gdjE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZW5kIHBvaW50LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3IyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnYyID0gdjI7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIHBvaW50IG9uIHRoZSBsaW5lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHQgLSBBIGludGVycG9sYXRpb24gZmFjdG9yIHJlcHJlc2VudGluZyBhIHBvc2l0aW9uIG9uIHRoZSBsaW5lLiBNdXN0IGJlIGluIHRoZSByYW5nZSBgWzAsMV1gLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gW29wdGlvbmFsVGFyZ2V0XSAtIFRoZSBvcHRpb25hbCB0YXJnZXQgdmVjdG9yIHRoZSByZXN1bHQgaXMgd3JpdHRlbiB0by5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IzfSBUaGUgcG9zaXRpb24gb24gdGhlIGxpbmUuXHJcblx0ICovXHJcblx0Z2V0UG9pbnQoIHQsIG9wdGlvbmFsVGFyZ2V0ID0gbmV3IFZlY3RvcjMoKSApIHtcclxuXHJcblx0XHRjb25zdCBwb2ludCA9IG9wdGlvbmFsVGFyZ2V0O1xyXG5cclxuXHRcdGlmICggdCA9PT0gMSApIHtcclxuXHJcblx0XHRcdHBvaW50LmNvcHkoIHRoaXMudjIgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0cG9pbnQuY29weSggdGhpcy52MiApLnN1YiggdGhpcy52MSApO1xyXG5cdFx0XHRwb2ludC5tdWx0aXBseVNjYWxhciggdCApLmFkZCggdGhpcy52MSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcG9pbnQ7XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gTGluZSBjdXJ2ZSBpcyBsaW5lYXIsIHNvIHdlIGNhbiBvdmVyd3JpdGUgZGVmYXVsdCBnZXRQb2ludEF0XHJcblx0Z2V0UG9pbnRBdCggdSwgb3B0aW9uYWxUYXJnZXQgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZ2V0UG9pbnQoIHUsIG9wdGlvbmFsVGFyZ2V0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0VGFuZ2VudCggdCwgb3B0aW9uYWxUYXJnZXQgPSBuZXcgVmVjdG9yMygpICkge1xyXG5cclxuXHRcdHJldHVybiBvcHRpb25hbFRhcmdldC5zdWJWZWN0b3JzKCB0aGlzLnYyLCB0aGlzLnYxICkubm9ybWFsaXplKCk7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0VGFuZ2VudEF0KCB1LCBvcHRpb25hbFRhcmdldCApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5nZXRUYW5nZW50KCB1LCBvcHRpb25hbFRhcmdldCApO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLnYxLmNvcHkoIHNvdXJjZS52MSApO1xyXG5cdFx0dGhpcy52Mi5jb3B5KCBzb3VyY2UudjIgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHR0b0pTT04oKSB7XHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IHN1cGVyLnRvSlNPTigpO1xyXG5cclxuXHRcdGRhdGEudjEgPSB0aGlzLnYxLnRvQXJyYXkoKTtcclxuXHRcdGRhdGEudjIgPSB0aGlzLnYyLnRvQXJyYXkoKTtcclxuXHJcblx0XHRyZXR1cm4gZGF0YTtcclxuXHJcblx0fVxyXG5cclxuXHRmcm9tSlNPTigganNvbiApIHtcclxuXHJcblx0XHRzdXBlci5mcm9tSlNPTigganNvbiApO1xyXG5cclxuXHRcdHRoaXMudjEuZnJvbUFycmF5KCBqc29uLnYxICk7XHJcblx0XHR0aGlzLnYyLmZyb21BcnJheSgganNvbi52MiApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBMaW5lQ3VydmUzIH07XHJcbiIsImltcG9ydCB7IEN1cnZlIH0gZnJvbSAnLi4vY29yZS9DdXJ2ZS5qcyc7XHJcbmltcG9ydCB7IFF1YWRyYXRpY0JlemllciB9IGZyb20gJy4uL2NvcmUvSW50ZXJwb2xhdGlvbnMuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IyLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIGN1cnZlIHJlcHJlc2VudGluZyBhIDJEIFF1YWRyYXRpYyBCZXppZXIgY3VydmUuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGN1cnZlID0gbmV3IFRIUkVFLlF1YWRyYXRpY0JlemllckN1cnZlKFxyXG4gKiBcdG5ldyBUSFJFRS5WZWN0b3IyKCAtIDEwLCAwICksXHJcbiAqIFx0bmV3IFRIUkVFLlZlY3RvcjIoIDIwLCAxNSApLFxyXG4gKiBcdG5ldyBUSFJFRS5WZWN0b3IyKCAxMCwgMCApXHJcbiAqIClcclxuICpcclxuICogY29uc3QgcG9pbnRzID0gY3VydmUuZ2V0UG9pbnRzKCA1MCApO1xyXG4gKiBjb25zdCBnZW9tZXRyeSA9IG5ldyBUSFJFRS5CdWZmZXJHZW9tZXRyeSgpLnNldEZyb21Qb2ludHMoIHBvaW50cyApO1xyXG4gKlxyXG4gKiBjb25zdCBtYXRlcmlhbCA9IG5ldyBUSFJFRS5MaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogMHhmZjAwMDAgfSApO1xyXG4gKlxyXG4gKiAvLyBDcmVhdGUgdGhlIGZpbmFsIG9iamVjdCB0byBhZGQgdG8gdGhlIHNjZW5lXHJcbiAqIGNvbnN0IGN1cnZlT2JqZWN0ID0gbmV3IFRIUkVFLkxpbmUoIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIEN1cnZlXHJcbiAqL1xyXG5jbGFzcyBRdWFkcmF0aWNCZXppZXJDdXJ2ZSBleHRlbmRzIEN1cnZlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBRdWFkcmF0aWMgQmV6aWVyIGN1cnZlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSBbdjBdIC0gVGhlIHN0YXJ0IHBvaW50LlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gW3YxXSAtIFRoZSBjb250cm9sIHBvaW50LlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gW3YyXSAtIFRoZSBlbmQgcG9pbnQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHYwID0gbmV3IFZlY3RvcjIoKSwgdjEgPSBuZXcgVmVjdG9yMigpLCB2MiA9IG5ldyBWZWN0b3IyKCkgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNRdWFkcmF0aWNCZXppZXJDdXJ2ZSA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ1F1YWRyYXRpY0JlemllckN1cnZlJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBzdGFydCBwb2ludC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yMn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52MCA9IHYwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNvbnRyb2wgcG9pbnQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudjEgPSB2MTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBlbmQgcG9pbnQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudjIgPSB2MjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgcG9pbnQgb24gdGhlIGN1cnZlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHQgLSBBIGludGVycG9sYXRpb24gZmFjdG9yIHJlcHJlc2VudGluZyBhIHBvc2l0aW9uIG9uIHRoZSBjdXJ2ZS4gTXVzdCBiZSBpbiB0aGUgcmFuZ2UgYFswLDFdYC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IFtvcHRpb25hbFRhcmdldF0gLSBUaGUgb3B0aW9uYWwgdGFyZ2V0IHZlY3RvciB0aGUgcmVzdWx0IGlzIHdyaXR0ZW4gdG8uXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gVGhlIHBvc2l0aW9uIG9uIHRoZSBjdXJ2ZS5cclxuXHQgKi9cclxuXHRnZXRQb2ludCggdCwgb3B0aW9uYWxUYXJnZXQgPSBuZXcgVmVjdG9yMigpICkge1xyXG5cclxuXHRcdGNvbnN0IHBvaW50ID0gb3B0aW9uYWxUYXJnZXQ7XHJcblxyXG5cdFx0Y29uc3QgdjAgPSB0aGlzLnYwLCB2MSA9IHRoaXMudjEsIHYyID0gdGhpcy52MjtcclxuXHJcblx0XHRwb2ludC5zZXQoXHJcblx0XHRcdFF1YWRyYXRpY0JlemllciggdCwgdjAueCwgdjEueCwgdjIueCApLFxyXG5cdFx0XHRRdWFkcmF0aWNCZXppZXIoIHQsIHYwLnksIHYxLnksIHYyLnkgKVxyXG5cdFx0KTtcclxuXHJcblx0XHRyZXR1cm4gcG9pbnQ7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMudjAuY29weSggc291cmNlLnYwICk7XHJcblx0XHR0aGlzLnYxLmNvcHkoIHNvdXJjZS52MSApO1xyXG5cdFx0dGhpcy52Mi5jb3B5KCBzb3VyY2UudjIgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHR0b0pTT04oKSB7XHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IHN1cGVyLnRvSlNPTigpO1xyXG5cclxuXHRcdGRhdGEudjAgPSB0aGlzLnYwLnRvQXJyYXkoKTtcclxuXHRcdGRhdGEudjEgPSB0aGlzLnYxLnRvQXJyYXkoKTtcclxuXHRcdGRhdGEudjIgPSB0aGlzLnYyLnRvQXJyYXkoKTtcclxuXHJcblx0XHRyZXR1cm4gZGF0YTtcclxuXHJcblx0fVxyXG5cclxuXHRmcm9tSlNPTigganNvbiApIHtcclxuXHJcblx0XHRzdXBlci5mcm9tSlNPTigganNvbiApO1xyXG5cclxuXHRcdHRoaXMudjAuZnJvbUFycmF5KCBqc29uLnYwICk7XHJcblx0XHR0aGlzLnYxLmZyb21BcnJheSgganNvbi52MSApO1xyXG5cdFx0dGhpcy52Mi5mcm9tQXJyYXkoIGpzb24udjIgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgUXVhZHJhdGljQmV6aWVyQ3VydmUgfTtcclxuIiwiaW1wb3J0IHsgQ3VydmUgfSBmcm9tICcuLi9jb3JlL0N1cnZlLmpzJztcclxuaW1wb3J0IHsgUXVhZHJhdGljQmV6aWVyIH0gZnJvbSAnLi4vY29yZS9JbnRlcnBvbGF0aW9ucy5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgY3VydmUgcmVwcmVzZW50aW5nIGEgM0QgUXVhZHJhdGljIEJlemllciBjdXJ2ZS5cclxuICpcclxuICogQGF1Z21lbnRzIEN1cnZlXHJcbiAqL1xyXG5jbGFzcyBRdWFkcmF0aWNCZXppZXJDdXJ2ZTMgZXh0ZW5kcyBDdXJ2ZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgUXVhZHJhdGljIEJlemllciBjdXJ2ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gW3YwXSAtIFRoZSBzdGFydCBwb2ludC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IFt2MV0gLSBUaGUgY29udHJvbCBwb2ludC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IFt2Ml0gLSBUaGUgZW5kIHBvaW50LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCB2MCA9IG5ldyBWZWN0b3IzKCksIHYxID0gbmV3IFZlY3RvcjMoKSwgdjIgPSBuZXcgVmVjdG9yMygpICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzUXVhZHJhdGljQmV6aWVyQ3VydmUzID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnUXVhZHJhdGljQmV6aWVyQ3VydmUzJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBzdGFydCBwb2ludC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yM31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52MCA9IHYwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNvbnRyb2wgcG9pbnQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjN9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudjEgPSB2MTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBlbmQgcG9pbnQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjN9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudjIgPSB2MjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgcG9pbnQgb24gdGhlIGN1cnZlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHQgLSBBIGludGVycG9sYXRpb24gZmFjdG9yIHJlcHJlc2VudGluZyBhIHBvc2l0aW9uIG9uIHRoZSBjdXJ2ZS4gTXVzdCBiZSBpbiB0aGUgcmFuZ2UgYFswLDFdYC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IFtvcHRpb25hbFRhcmdldF0gLSBUaGUgb3B0aW9uYWwgdGFyZ2V0IHZlY3RvciB0aGUgcmVzdWx0IGlzIHdyaXR0ZW4gdG8uXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gVGhlIHBvc2l0aW9uIG9uIHRoZSBjdXJ2ZS5cclxuXHQgKi9cclxuXHRnZXRQb2ludCggdCwgb3B0aW9uYWxUYXJnZXQgPSBuZXcgVmVjdG9yMygpICkge1xyXG5cclxuXHRcdGNvbnN0IHBvaW50ID0gb3B0aW9uYWxUYXJnZXQ7XHJcblxyXG5cdFx0Y29uc3QgdjAgPSB0aGlzLnYwLCB2MSA9IHRoaXMudjEsIHYyID0gdGhpcy52MjtcclxuXHJcblx0XHRwb2ludC5zZXQoXHJcblx0XHRcdFF1YWRyYXRpY0JlemllciggdCwgdjAueCwgdjEueCwgdjIueCApLFxyXG5cdFx0XHRRdWFkcmF0aWNCZXppZXIoIHQsIHYwLnksIHYxLnksIHYyLnkgKSxcclxuXHRcdFx0UXVhZHJhdGljQmV6aWVyKCB0LCB2MC56LCB2MS56LCB2Mi56IClcclxuXHRcdCk7XHJcblxyXG5cdFx0cmV0dXJuIHBvaW50O1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLnYwLmNvcHkoIHNvdXJjZS52MCApO1xyXG5cdFx0dGhpcy52MS5jb3B5KCBzb3VyY2UudjEgKTtcclxuXHRcdHRoaXMudjIuY29weSggc291cmNlLnYyICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0dG9KU09OKCkge1xyXG5cclxuXHRcdGNvbnN0IGRhdGEgPSBzdXBlci50b0pTT04oKTtcclxuXHJcblx0XHRkYXRhLnYwID0gdGhpcy52MC50b0FycmF5KCk7XHJcblx0XHRkYXRhLnYxID0gdGhpcy52MS50b0FycmF5KCk7XHJcblx0XHRkYXRhLnYyID0gdGhpcy52Mi50b0FycmF5KCk7XHJcblxyXG5cdFx0cmV0dXJuIGRhdGE7XHJcblxyXG5cdH1cclxuXHJcblx0ZnJvbUpTT04oIGpzb24gKSB7XHJcblxyXG5cdFx0c3VwZXIuZnJvbUpTT04oIGpzb24gKTtcclxuXHJcblx0XHR0aGlzLnYwLmZyb21BcnJheSgganNvbi52MCApO1xyXG5cdFx0dGhpcy52MS5mcm9tQXJyYXkoIGpzb24udjEgKTtcclxuXHRcdHRoaXMudjIuZnJvbUFycmF5KCBqc29uLnYyICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFF1YWRyYXRpY0JlemllckN1cnZlMyB9O1xyXG4iLCJpbXBvcnQgeyBDdXJ2ZSB9IGZyb20gJy4uL2NvcmUvQ3VydmUuanMnO1xyXG5pbXBvcnQgeyBDYXRtdWxsUm9tIH0gZnJvbSAnLi4vY29yZS9JbnRlcnBvbGF0aW9ucy5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjIuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgY3VydmUgcmVwcmVzZW50aW5nIGEgMkQgc3BsaW5lIGN1cnZlLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiAvLyBDcmVhdGUgYSBzaW5lLWxpa2Ugd2F2ZVxyXG4gKiBjb25zdCBjdXJ2ZSA9IG5ldyBUSFJFRS5TcGxpbmVDdXJ2ZSggW1xyXG4gKiBcdG5ldyBUSFJFRS5WZWN0b3IyKCAtMTAsIDAgKSxcclxuICogXHRuZXcgVEhSRUUuVmVjdG9yMiggLTUsIDUgKSxcclxuICogXHRuZXcgVEhSRUUuVmVjdG9yMiggMCwgMCApLFxyXG4gKiBcdG5ldyBUSFJFRS5WZWN0b3IyKCA1LCAtNSApLFxyXG4gKiBcdG5ldyBUSFJFRS5WZWN0b3IyKCAxMCwgMCApXHJcbiAqIF0gKTtcclxuICpcclxuICogY29uc3QgcG9pbnRzID0gY3VydmUuZ2V0UG9pbnRzKCA1MCApO1xyXG4gKiBjb25zdCBnZW9tZXRyeSA9IG5ldyBUSFJFRS5CdWZmZXJHZW9tZXRyeSgpLnNldEZyb21Qb2ludHMoIHBvaW50cyApO1xyXG4gKlxyXG4gKiBjb25zdCBtYXRlcmlhbCA9IG5ldyBUSFJFRS5MaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogMHhmZjAwMDAgfSApO1xyXG4gKlxyXG4gKiAvLyBDcmVhdGUgdGhlIGZpbmFsIG9iamVjdCB0byBhZGQgdG8gdGhlIHNjZW5lXHJcbiAqIGNvbnN0IHNwbGluZU9iamVjdCA9IG5ldyBUSFJFRS5MaW5lKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBDdXJ2ZVxyXG4gKi9cclxuY2xhc3MgU3BsaW5lQ3VydmUgZXh0ZW5kcyBDdXJ2ZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgMkQgc3BsaW5lIGN1cnZlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxWZWN0b3IyPn0gW3BvaW50c10gLSAgQW4gYXJyYXkgb2YgMkQgcG9pbnRzIGRlZmluaW5nIHRoZSBjdXJ2ZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcG9pbnRzID0gW10gKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNTcGxpbmVDdXJ2ZSA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ1NwbGluZUN1cnZlJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIGFycmF5IG9mIDJEIHBvaW50cyBkZWZpbmluZyB0aGUgY3VydmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PFZlY3RvcjI+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBvaW50cyA9IHBvaW50cztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgcG9pbnQgb24gdGhlIGN1cnZlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHQgLSBBIGludGVycG9sYXRpb24gZmFjdG9yIHJlcHJlc2VudGluZyBhIHBvc2l0aW9uIG9uIHRoZSBjdXJ2ZS4gTXVzdCBiZSBpbiB0aGUgcmFuZ2UgYFswLDFdYC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IFtvcHRpb25hbFRhcmdldF0gLSBUaGUgb3B0aW9uYWwgdGFyZ2V0IHZlY3RvciB0aGUgcmVzdWx0IGlzIHdyaXR0ZW4gdG8uXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gVGhlIHBvc2l0aW9uIG9uIHRoZSBjdXJ2ZS5cclxuXHQgKi9cclxuXHRnZXRQb2ludCggdCwgb3B0aW9uYWxUYXJnZXQgPSBuZXcgVmVjdG9yMigpICkge1xyXG5cclxuXHRcdGNvbnN0IHBvaW50ID0gb3B0aW9uYWxUYXJnZXQ7XHJcblxyXG5cdFx0Y29uc3QgcG9pbnRzID0gdGhpcy5wb2ludHM7XHJcblx0XHRjb25zdCBwID0gKCBwb2ludHMubGVuZ3RoIC0gMSApICogdDtcclxuXHJcblx0XHRjb25zdCBpbnRQb2ludCA9IE1hdGguZmxvb3IoIHAgKTtcclxuXHRcdGNvbnN0IHdlaWdodCA9IHAgLSBpbnRQb2ludDtcclxuXHJcblx0XHRjb25zdCBwMCA9IHBvaW50c1sgaW50UG9pbnQgPT09IDAgPyBpbnRQb2ludCA6IGludFBvaW50IC0gMSBdO1xyXG5cdFx0Y29uc3QgcDEgPSBwb2ludHNbIGludFBvaW50IF07XHJcblx0XHRjb25zdCBwMiA9IHBvaW50c1sgaW50UG9pbnQgPiBwb2ludHMubGVuZ3RoIC0gMiA/IHBvaW50cy5sZW5ndGggLSAxIDogaW50UG9pbnQgKyAxIF07XHJcblx0XHRjb25zdCBwMyA9IHBvaW50c1sgaW50UG9pbnQgPiBwb2ludHMubGVuZ3RoIC0gMyA/IHBvaW50cy5sZW5ndGggLSAxIDogaW50UG9pbnQgKyAyIF07XHJcblxyXG5cdFx0cG9pbnQuc2V0KFxyXG5cdFx0XHRDYXRtdWxsUm9tKCB3ZWlnaHQsIHAwLngsIHAxLngsIHAyLngsIHAzLnggKSxcclxuXHRcdFx0Q2F0bXVsbFJvbSggd2VpZ2h0LCBwMC55LCBwMS55LCBwMi55LCBwMy55IClcclxuXHRcdCk7XHJcblxyXG5cdFx0cmV0dXJuIHBvaW50O1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLnBvaW50cyA9IFtdO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHNvdXJjZS5wb2ludHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHBvaW50ID0gc291cmNlLnBvaW50c1sgaSBdO1xyXG5cclxuXHRcdFx0dGhpcy5wb2ludHMucHVzaCggcG9pbnQuY2xvbmUoKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHR0b0pTT04oKSB7XHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IHN1cGVyLnRvSlNPTigpO1xyXG5cclxuXHRcdGRhdGEucG9pbnRzID0gW107XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gdGhpcy5wb2ludHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHBvaW50ID0gdGhpcy5wb2ludHNbIGkgXTtcclxuXHRcdFx0ZGF0YS5wb2ludHMucHVzaCggcG9pbnQudG9BcnJheSgpICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBkYXRhO1xyXG5cclxuXHR9XHJcblxyXG5cdGZyb21KU09OKCBqc29uICkge1xyXG5cclxuXHRcdHN1cGVyLmZyb21KU09OKCBqc29uICk7XHJcblxyXG5cdFx0dGhpcy5wb2ludHMgPSBbXTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBqc29uLnBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgcG9pbnQgPSBqc29uLnBvaW50c1sgaSBdO1xyXG5cdFx0XHR0aGlzLnBvaW50cy5wdXNoKCBuZXcgVmVjdG9yMigpLmZyb21BcnJheSggcG9pbnQgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgU3BsaW5lQ3VydmUgfTtcclxuIiwiaW1wb3J0IHsgQ3VydmUgfSBmcm9tICcuL0N1cnZlLmpzJztcclxuaW1wb3J0ICogYXMgQ3VydmVzIGZyb20gJy4uL2N1cnZlcy9DdXJ2ZXMuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgYmFzZSBjbGFzcyBleHRlbmRpbmcge0BsaW5rIEN1cnZlfS4gYEN1cnZlUGF0aGAgaXMgc2ltcGx5IGFuXHJcbiAqIGFycmF5IG9mIGNvbm5lY3RlZCBjdXJ2ZXMsIGJ1dCByZXRhaW5zIHRoZSBBUEkgb2YgYSBjdXJ2ZS5cclxuICpcclxuICogQGF1Z21lbnRzIEN1cnZlXHJcbiAqL1xyXG5jbGFzcyBDdXJ2ZVBhdGggZXh0ZW5kcyBDdXJ2ZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgY3VydmUgcGF0aC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdDdXJ2ZVBhdGgnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQW4gYXJyYXkgb2YgY3VydmVzIGRlZmluaW5nIHRoZVxyXG5cdFx0ICogcGF0aC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8Q3VydmU+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmN1cnZlcyA9IFtdO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgcGF0aCBzaG91bGQgYXV0b21hdGljYWxseSBiZSBjbG9zZWRcclxuXHRcdCAqIGJ5IGEgbGluZSBjdXJ2ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYXV0b0Nsb3NlID0gZmFsc2U7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyBhIGN1cnZlIHRvIHRoaXMgY3VydmUgcGF0aC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Q3VydmV9IGN1cnZlIC0gVGhlIGN1cnZlIHRvIGFkZC5cclxuXHQgKi9cclxuXHRhZGQoIGN1cnZlICkge1xyXG5cclxuXHRcdHRoaXMuY3VydmVzLnB1c2goIGN1cnZlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyBhIGxpbmUgY3VydmUgdG8gY2xvc2UgdGhlIHBhdGguXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtDdXJ2ZVBhdGh9IEEgcmVmZXJlbmNlIHRvIHRoaXMgY3VydmUgcGF0aC5cclxuXHQgKi9cclxuXHRjbG9zZVBhdGgoKSB7XHJcblxyXG5cdFx0Ly8gQWRkIGEgbGluZSBjdXJ2ZSBpZiBzdGFydCBhbmQgZW5kIG9mIGxpbmVzIGFyZSBub3QgY29ubmVjdGVkXHJcblx0XHRjb25zdCBzdGFydFBvaW50ID0gdGhpcy5jdXJ2ZXNbIDAgXS5nZXRQb2ludCggMCApO1xyXG5cdFx0Y29uc3QgZW5kUG9pbnQgPSB0aGlzLmN1cnZlc1sgdGhpcy5jdXJ2ZXMubGVuZ3RoIC0gMSBdLmdldFBvaW50KCAxICk7XHJcblxyXG5cdFx0aWYgKCAhIHN0YXJ0UG9pbnQuZXF1YWxzKCBlbmRQb2ludCApICkge1xyXG5cclxuXHRcdFx0Y29uc3QgbGluZVR5cGUgPSAoIHN0YXJ0UG9pbnQuaXNWZWN0b3IyID09PSB0cnVlICkgPyAnTGluZUN1cnZlJyA6ICdMaW5lQ3VydmUzJztcclxuXHRcdFx0dGhpcy5jdXJ2ZXMucHVzaCggbmV3IEN1cnZlc1sgbGluZVR5cGUgXSggZW5kUG9pbnQsIHN0YXJ0UG9pbnQgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgdmVjdG9yIGluIDJEIG9yIDNEIHNwYWNlIChkZXBlbmRpbmcgb24gdGhlIGN1cnZlIGRlZmluaXRpb25zKVxyXG5cdCAqIGZvciB0aGUgZ2l2ZW4gaW50ZXJwb2xhdGlvbiBmYWN0b3IuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdCAtIEEgaW50ZXJwb2xhdGlvbiBmYWN0b3IgcmVwcmVzZW50aW5nIGEgcG9zaXRpb24gb24gdGhlIGN1cnZlLiBNdXN0IGJlIGluIHRoZSByYW5nZSBgWzAsMV1gLlxyXG5cdCAqIEBwYXJhbSB7KFZlY3RvcjJ8VmVjdG9yMyl9IFtvcHRpb25hbFRhcmdldF0gLSBUaGUgb3B0aW9uYWwgdGFyZ2V0IHZlY3RvciB0aGUgcmVzdWx0IGlzIHdyaXR0ZW4gdG8uXHJcblx0ICogQHJldHVybiB7PyhWZWN0b3IyfFZlY3RvcjMpfSBUaGUgcG9zaXRpb24gb24gdGhlIGN1cnZlLiBJdCBjYW4gYmUgYSAyRCBvciAzRCB2ZWN0b3IgZGVwZW5kaW5nIG9uIHRoZSBjdXJ2ZSBkZWZpbml0aW9uLlxyXG5cdCAqL1xyXG5cdGdldFBvaW50KCB0LCBvcHRpb25hbFRhcmdldCApIHtcclxuXHJcblx0XHQvLyBUbyBnZXQgYWNjdXJhdGUgcG9pbnQgd2l0aCByZWZlcmVuY2UgdG9cclxuXHRcdC8vIGVudGlyZSBwYXRoIGRpc3RhbmNlIGF0IHRpbWUgdCxcclxuXHRcdC8vIGZvbGxvd2luZyBoYXMgdG8gYmUgZG9uZTpcclxuXHJcblx0XHQvLyAxLiBMZW5ndGggb2YgZWFjaCBzdWIgcGF0aCBoYXZlIHRvIGJlIGtub3duXHJcblx0XHQvLyAyLiBMb2NhdGUgYW5kIGlkZW50aWZ5IHR5cGUgb2YgY3VydmVcclxuXHRcdC8vIDMuIEdldCB0IGZvciB0aGUgY3VydmVcclxuXHRcdC8vIDQuIFJldHVybiBjdXJ2ZS5nZXRQb2ludEF0KHQnKVxyXG5cclxuXHRcdGNvbnN0IGQgPSB0ICogdGhpcy5nZXRMZW5ndGgoKTtcclxuXHRcdGNvbnN0IGN1cnZlTGVuZ3RocyA9IHRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7XHJcblx0XHRsZXQgaSA9IDA7XHJcblxyXG5cdFx0Ly8gVG8gdGhpbmsgYWJvdXQgYm91bmRhcmllcyBwb2ludHMuXHJcblxyXG5cdFx0d2hpbGUgKCBpIDwgY3VydmVMZW5ndGhzLmxlbmd0aCApIHtcclxuXHJcblx0XHRcdGlmICggY3VydmVMZW5ndGhzWyBpIF0gPj0gZCApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgZGlmZiA9IGN1cnZlTGVuZ3Roc1sgaSBdIC0gZDtcclxuXHRcdFx0XHRjb25zdCBjdXJ2ZSA9IHRoaXMuY3VydmVzWyBpIF07XHJcblxyXG5cdFx0XHRcdGNvbnN0IHNlZ21lbnRMZW5ndGggPSBjdXJ2ZS5nZXRMZW5ndGgoKTtcclxuXHRcdFx0XHRjb25zdCB1ID0gc2VnbWVudExlbmd0aCA9PT0gMCA/IDAgOiAxIC0gZGlmZiAvIHNlZ21lbnRMZW5ndGg7XHJcblxyXG5cdFx0XHRcdHJldHVybiBjdXJ2ZS5nZXRQb2ludEF0KCB1LCBvcHRpb25hbFRhcmdldCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aSArKztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG51bGw7XHJcblxyXG5cdFx0Ly8gbG9vcCB3aGVyZSBzdW0gIT0gMCwgc3VtID4gZCAsIHN1bSsxIDxkXHJcblxyXG5cdH1cclxuXHJcblx0Z2V0TGVuZ3RoKCkge1xyXG5cclxuXHRcdC8vIFdlIGNhbm5vdCB1c2UgdGhlIGRlZmF1bHQgVEhSRUUuQ3VydmUgZ2V0UG9pbnQoKSB3aXRoIGdldExlbmd0aCgpIGJlY2F1c2UgaW5cclxuXHRcdC8vIFRIUkVFLkN1cnZlLCBnZXRMZW5ndGgoKSBkZXBlbmRzIG9uIGdldFBvaW50KCkgYnV0IGluIFRIUkVFLkN1cnZlUGF0aFxyXG5cdFx0Ly8gZ2V0UG9pbnQoKSBkZXBlbmRzIG9uIGdldExlbmd0aFxyXG5cclxuXHRcdGNvbnN0IGxlbnMgPSB0aGlzLmdldEN1cnZlTGVuZ3RocygpO1xyXG5cdFx0cmV0dXJuIGxlbnNbIGxlbnMubGVuZ3RoIC0gMSBdO1xyXG5cclxuXHR9XHJcblxyXG5cdHVwZGF0ZUFyY0xlbmd0aHMoKSB7XHJcblxyXG5cdFx0Ly8gY2FjaGVMZW5ndGhzIG11c3QgYmUgcmVjYWxjdWxhdGVkLlxyXG5cclxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cdFx0dGhpcy5jYWNoZUxlbmd0aHMgPSBudWxsO1xyXG5cdFx0dGhpcy5nZXRDdXJ2ZUxlbmd0aHMoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGxpc3Qgb2YgY3VtdWxhdGl2ZSBjdXJ2ZSBsZW5ndGhzIG9mIHRoZSBkZWZpbmVkIGN1cnZlcy5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0FycmF5PG51bWJlcj59IFRoZSBjdXJ2ZSBsZW5ndGhzLlxyXG5cdCAqL1xyXG5cdGdldEN1cnZlTGVuZ3RocygpIHtcclxuXHJcblx0XHQvLyBDb21wdXRlIGxlbmd0aHMgYW5kIGNhY2hlIHRoZW1cclxuXHRcdC8vIFdlIGNhbm5vdCBvdmVyd3JpdGUgZ2V0TGVuZ3RocygpIGJlY2F1c2UgVXRvVCBtYXBwaW5nIHVzZXMgaXQuXHJcblx0XHQvLyBXZSB1c2UgY2FjaGUgdmFsdWVzIGlmIGN1cnZlcyBhbmQgY2FjaGUgYXJyYXkgYXJlIHNhbWUgbGVuZ3RoXHJcblxyXG5cdFx0aWYgKCB0aGlzLmNhY2hlTGVuZ3RocyAmJiB0aGlzLmNhY2hlTGVuZ3Rocy5sZW5ndGggPT09IHRoaXMuY3VydmVzLmxlbmd0aCApIHtcclxuXHJcblx0XHRcdHJldHVybiB0aGlzLmNhY2hlTGVuZ3RocztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gR2V0IGxlbmd0aCBvZiBzdWItY3VydmVcclxuXHRcdC8vIFB1c2ggc3VtcyBpbnRvIGNhY2hlZCBhcnJheVxyXG5cclxuXHRcdGNvbnN0IGxlbmd0aHMgPSBbXTtcclxuXHRcdGxldCBzdW1zID0gMDtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSB0aGlzLmN1cnZlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0c3VtcyArPSB0aGlzLmN1cnZlc1sgaSBdLmdldExlbmd0aCgpO1xyXG5cdFx0XHRsZW5ndGhzLnB1c2goIHN1bXMgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5jYWNoZUxlbmd0aHMgPSBsZW5ndGhzO1xyXG5cclxuXHRcdHJldHVybiBsZW5ndGhzO1xyXG5cclxuXHR9XHJcblxyXG5cdGdldFNwYWNlZFBvaW50cyggZGl2aXNpb25zID0gNDAgKSB7XHJcblxyXG5cdFx0Y29uc3QgcG9pbnRzID0gW107XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDw9IGRpdmlzaW9uczsgaSArKyApIHtcclxuXHJcblx0XHRcdHBvaW50cy5wdXNoKCB0aGlzLmdldFBvaW50KCBpIC8gZGl2aXNpb25zICkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aGlzLmF1dG9DbG9zZSApIHtcclxuXHJcblx0XHRcdHBvaW50cy5wdXNoKCBwb2ludHNbIDAgXSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcG9pbnRzO1xyXG5cclxuXHR9XHJcblxyXG5cdGdldFBvaW50cyggZGl2aXNpb25zID0gMTIgKSB7XHJcblxyXG5cdFx0Y29uc3QgcG9pbnRzID0gW107XHJcblx0XHRsZXQgbGFzdDtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGN1cnZlcyA9IHRoaXMuY3VydmVzOyBpIDwgY3VydmVzLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGN1cnZlID0gY3VydmVzWyBpIF07XHJcblx0XHRcdGNvbnN0IHJlc29sdXRpb24gPSBjdXJ2ZS5pc0VsbGlwc2VDdXJ2ZSA/IGRpdmlzaW9ucyAqIDJcclxuXHRcdFx0XHQ6ICggY3VydmUuaXNMaW5lQ3VydmUgfHwgY3VydmUuaXNMaW5lQ3VydmUzICkgPyAxXHJcblx0XHRcdFx0XHQ6IGN1cnZlLmlzU3BsaW5lQ3VydmUgPyBkaXZpc2lvbnMgKiBjdXJ2ZS5wb2ludHMubGVuZ3RoXHJcblx0XHRcdFx0XHRcdDogZGl2aXNpb25zO1xyXG5cclxuXHRcdFx0Y29uc3QgcHRzID0gY3VydmUuZ2V0UG9pbnRzKCByZXNvbHV0aW9uICk7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaiA9IDA7IGogPCBwdHMubGVuZ3RoOyBqICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBwb2ludCA9IHB0c1sgaiBdO1xyXG5cclxuXHRcdFx0XHRpZiAoIGxhc3QgJiYgbGFzdC5lcXVhbHMoIHBvaW50ICkgKSBjb250aW51ZTsgLy8gZW5zdXJlcyBubyBjb25zZWN1dGl2ZSBwb2ludHMgYXJlIGR1cGxpY2F0ZXNcclxuXHJcblx0XHRcdFx0cG9pbnRzLnB1c2goIHBvaW50ICk7XHJcblx0XHRcdFx0bGFzdCA9IHBvaW50O1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMuYXV0b0Nsb3NlICYmIHBvaW50cy5sZW5ndGggPiAxICYmICEgcG9pbnRzWyBwb2ludHMubGVuZ3RoIC0gMSBdLmVxdWFscyggcG9pbnRzWyAwIF0gKSApIHtcclxuXHJcblx0XHRcdHBvaW50cy5wdXNoKCBwb2ludHNbIDAgXSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcG9pbnRzO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLmN1cnZlcyA9IFtdO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHNvdXJjZS5jdXJ2ZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGN1cnZlID0gc291cmNlLmN1cnZlc1sgaSBdO1xyXG5cclxuXHRcdFx0dGhpcy5jdXJ2ZXMucHVzaCggY3VydmUuY2xvbmUoKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmF1dG9DbG9zZSA9IHNvdXJjZS5hdXRvQ2xvc2U7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0dG9KU09OKCkge1xyXG5cclxuXHRcdGNvbnN0IGRhdGEgPSBzdXBlci50b0pTT04oKTtcclxuXHJcblx0XHRkYXRhLmF1dG9DbG9zZSA9IHRoaXMuYXV0b0Nsb3NlO1xyXG5cdFx0ZGF0YS5jdXJ2ZXMgPSBbXTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSB0aGlzLmN1cnZlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgY3VydmUgPSB0aGlzLmN1cnZlc1sgaSBdO1xyXG5cdFx0XHRkYXRhLmN1cnZlcy5wdXNoKCBjdXJ2ZS50b0pTT04oKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZGF0YTtcclxuXHJcblx0fVxyXG5cclxuXHRmcm9tSlNPTigganNvbiApIHtcclxuXHJcblx0XHRzdXBlci5mcm9tSlNPTigganNvbiApO1xyXG5cclxuXHRcdHRoaXMuYXV0b0Nsb3NlID0ganNvbi5hdXRvQ2xvc2U7XHJcblx0XHR0aGlzLmN1cnZlcyA9IFtdO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGpzb24uY3VydmVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBjdXJ2ZSA9IGpzb24uY3VydmVzWyBpIF07XHJcblx0XHRcdHRoaXMuY3VydmVzLnB1c2goIG5ldyBDdXJ2ZXNbIGN1cnZlLnR5cGUgXSgpLmZyb21KU09OKCBjdXJ2ZSApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgQ3VydmVQYXRoIH07XHJcbiIsImltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjIuanMnO1xyXG5pbXBvcnQgeyBDdXJ2ZVBhdGggfSBmcm9tICcuL0N1cnZlUGF0aC5qcyc7XHJcbmltcG9ydCB7IEVsbGlwc2VDdXJ2ZSB9IGZyb20gJy4uL2N1cnZlcy9FbGxpcHNlQ3VydmUuanMnO1xyXG5pbXBvcnQgeyBTcGxpbmVDdXJ2ZSB9IGZyb20gJy4uL2N1cnZlcy9TcGxpbmVDdXJ2ZS5qcyc7XHJcbmltcG9ydCB7IEN1YmljQmV6aWVyQ3VydmUgfSBmcm9tICcuLi9jdXJ2ZXMvQ3ViaWNCZXppZXJDdXJ2ZS5qcyc7XHJcbmltcG9ydCB7IFF1YWRyYXRpY0JlemllckN1cnZlIH0gZnJvbSAnLi4vY3VydmVzL1F1YWRyYXRpY0JlemllckN1cnZlLmpzJztcclxuaW1wb3J0IHsgTGluZUN1cnZlIH0gZnJvbSAnLi4vY3VydmVzL0xpbmVDdXJ2ZS5qcyc7XHJcblxyXG4vKipcclxuICogQSAyRCBwYXRoIHJlcHJlc2VudGF0aW9uLiBUaGUgY2xhc3MgcHJvdmlkZXMgbWV0aG9kcyBmb3IgY3JlYXRpbmcgcGF0aHNcclxuICogYW5kIGNvbnRvdXJzIG9mIDJEIHNoYXBlcyBzaW1pbGFyIHRvIHRoZSAyRCBDYW52YXMgQVBJLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBwYXRoID0gbmV3IFRIUkVFLlBhdGgoKTtcclxuICpcclxuICogcGF0aC5saW5lVG8oIDAsIDAuOCApO1xyXG4gKiBwYXRoLnF1YWRyYXRpY0N1cnZlVG8oIDAsIDEsIDAuMiwgMSApO1xyXG4gKiBwYXRoLmxpbmVUbyggMSwgMSApO1xyXG4gKlxyXG4gKiBjb25zdCBwb2ludHMgPSBwYXRoLmdldFBvaW50cygpO1xyXG4gKlxyXG4gKiBjb25zdCBnZW9tZXRyeSA9IG5ldyBUSFJFRS5CdWZmZXJHZW9tZXRyeSgpLnNldEZyb21Qb2ludHMoIHBvaW50cyApO1xyXG4gKiBjb25zdCBtYXRlcmlhbCA9IG5ldyBUSFJFRS5MaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogMHhmZmZmZmYgfSApO1xyXG4gKlxyXG4gKiBjb25zdCBsaW5lID0gbmV3IFRIUkVFLkxpbmUoIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG4gKiBzY2VuZS5hZGQoIGxpbmUgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBDdXJ2ZVBhdGhcclxuICovXHJcbmNsYXNzIFBhdGggZXh0ZW5kcyBDdXJ2ZVBhdGgge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHBhdGguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PFZlY3RvcjI+fSBbcG9pbnRzXSAtIEFuIGFycmF5IG9mIDJEIHBvaW50cyBkZWZpbmluZyB0aGUgcGF0aC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcG9pbnRzICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ1BhdGgnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGN1cnJlbnQgb2Zmc2V0IG9mIHRoZSBwYXRoLiBBbnkgbmV3IGN1cnZlIGFkZGVkIHdpbGwgc3RhcnQgaGVyZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yMn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jdXJyZW50UG9pbnQgPSBuZXcgVmVjdG9yMigpO1xyXG5cclxuXHRcdGlmICggcG9pbnRzICkge1xyXG5cclxuXHRcdFx0dGhpcy5zZXRGcm9tUG9pbnRzKCBwb2ludHMgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyBhIHBhdGggZnJvbSB0aGUgZ2l2ZW4gbGlzdCBvZiBwb2ludHMuIFRoZSBwb2ludHMgYXJlIGFkZGVkXHJcblx0ICogdG8gdGhlIHBhdGggYXMgaW5zdGFuY2VzIG9mIHtAbGluayBMaW5lQ3VydmV9LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxWZWN0b3IyPn0gcG9pbnRzIC0gQW4gYXJyYXkgb2YgMkQgcG9pbnRzLlxyXG5cdCAqIEByZXR1cm4ge1BhdGh9IEEgcmVmZXJlbmNlIHRvIHRoaXMgcGF0aC5cclxuXHQgKi9cclxuXHRzZXRGcm9tUG9pbnRzKCBwb2ludHMgKSB7XHJcblxyXG5cdFx0dGhpcy5tb3ZlVG8oIHBvaW50c1sgMCBdLngsIHBvaW50c1sgMCBdLnkgKTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDEsIGwgPSBwb2ludHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdHRoaXMubGluZVRvKCBwb2ludHNbIGkgXS54LCBwb2ludHNbIGkgXS55ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE1vdmVzIHtAbGluayBQYXRoI2N1cnJlbnRQb2ludH0gdG8gdGhlIGdpdmVuIHBvaW50LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeCBjb29yZGluYXRlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHkgY29vcmRpbmF0ZS5cclxuXHQgKiBAcmV0dXJuIHtQYXRofSBBIHJlZmVyZW5jZSB0byB0aGlzIHBhdGguXHJcblx0ICovXHJcblx0bW92ZVRvKCB4LCB5ICkge1xyXG5cclxuXHRcdHRoaXMuY3VycmVudFBvaW50LnNldCggeCwgeSApOyAvLyBUT0RPIGNvbnNpZGVyIHJlZmVyZW5jaW5nIHZlY3RvcnMgaW5zdGVhZCBvZiBjb3B5aW5nP1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIExpbmVDdXJ2ZX0gdG8gdGhlIHBhdGggYnkgY29ubmVjdGluZ1xyXG5cdCAqIHRoZSBjdXJyZW50IHBvaW50IHdpdGggdGhlIGdpdmVuIG9uZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50LlxyXG5cdCAqIEByZXR1cm4ge1BhdGh9IEEgcmVmZXJlbmNlIHRvIHRoaXMgcGF0aC5cclxuXHQgKi9cclxuXHRsaW5lVG8oIHgsIHkgKSB7XHJcblxyXG5cdFx0Y29uc3QgY3VydmUgPSBuZXcgTGluZUN1cnZlKCB0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLCBuZXcgVmVjdG9yMiggeCwgeSApICk7XHJcblx0XHR0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZSApO1xyXG5cclxuXHRcdHRoaXMuY3VycmVudFBvaW50LnNldCggeCwgeSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFF1YWRyYXRpY0JlemllckN1cnZlfSB0byB0aGUgcGF0aCBieSBjb25uZWN0aW5nXHJcblx0ICogdGhlIGN1cnJlbnQgcG9pbnQgd2l0aCB0aGUgZ2l2ZW4gb25lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFDUHggLSBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBjb250cm9sIHBvaW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhQ1B5IC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgY29udHJvbCBwb2ludC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYVggLSBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFZIC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50LlxyXG5cdCAqIEByZXR1cm4ge1BhdGh9IEEgcmVmZXJlbmNlIHRvIHRoaXMgcGF0aC5cclxuXHQgKi9cclxuXHRxdWFkcmF0aWNDdXJ2ZVRvKCBhQ1B4LCBhQ1B5LCBhWCwgYVkgKSB7XHJcblxyXG5cdFx0Y29uc3QgY3VydmUgPSBuZXcgUXVhZHJhdGljQmV6aWVyQ3VydmUoXHJcblx0XHRcdHRoaXMuY3VycmVudFBvaW50LmNsb25lKCksXHJcblx0XHRcdG5ldyBWZWN0b3IyKCBhQ1B4LCBhQ1B5ICksXHJcblx0XHRcdG5ldyBWZWN0b3IyKCBhWCwgYVkgKVxyXG5cdFx0KTtcclxuXHJcblx0XHR0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZSApO1xyXG5cclxuXHRcdHRoaXMuY3VycmVudFBvaW50LnNldCggYVgsIGFZICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgQ3ViaWNCZXppZXJDdXJ2ZX0gdG8gdGhlIHBhdGggYnkgY29ubmVjdGluZ1xyXG5cdCAqIHRoZSBjdXJyZW50IHBvaW50IHdpdGggdGhlIGdpdmVuIG9uZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhQ1AxeCAtIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFDUDF5IC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYUNQMnggLSBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYUNQMnkgLSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYVggLSBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFZIC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50LlxyXG5cdCAqIEByZXR1cm4ge1BhdGh9IEEgcmVmZXJlbmNlIHRvIHRoaXMgcGF0aC5cclxuXHQgKi9cclxuXHRiZXppZXJDdXJ2ZVRvKCBhQ1AxeCwgYUNQMXksIGFDUDJ4LCBhQ1AyeSwgYVgsIGFZICkge1xyXG5cclxuXHRcdGNvbnN0IGN1cnZlID0gbmV3IEN1YmljQmV6aWVyQ3VydmUoXHJcblx0XHRcdHRoaXMuY3VycmVudFBvaW50LmNsb25lKCksXHJcblx0XHRcdG5ldyBWZWN0b3IyKCBhQ1AxeCwgYUNQMXkgKSxcclxuXHRcdFx0bmV3IFZlY3RvcjIoIGFDUDJ4LCBhQ1AyeSApLFxyXG5cdFx0XHRuZXcgVmVjdG9yMiggYVgsIGFZIClcclxuXHRcdCk7XHJcblxyXG5cdFx0dGhpcy5jdXJ2ZXMucHVzaCggY3VydmUgKTtcclxuXHJcblx0XHR0aGlzLmN1cnJlbnRQb2ludC5zZXQoIGFYLCBhWSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFNwbGluZUN1cnZlfSB0byB0aGUgcGF0aCBieSBjb25uZWN0aW5nXHJcblx0ICogdGhlIGN1cnJlbnQgcG9pbnQgd2l0aCB0aGUgZ2l2ZW4gbGlzdCBvZiBwb2ludHMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PFZlY3RvcjI+fSBwdHMgLSBBbiBhcnJheSBvZiBwb2ludHMgaW4gMkQgc3BhY2UuXHJcblx0ICogQHJldHVybiB7UGF0aH0gQSByZWZlcmVuY2UgdG8gdGhpcyBwYXRoLlxyXG5cdCAqL1xyXG5cdHNwbGluZVRocnUoIHB0cyApIHtcclxuXHJcblx0XHRjb25zdCBucHRzID0gWyB0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpIF0uY29uY2F0KCBwdHMgKTtcclxuXHJcblx0XHRjb25zdCBjdXJ2ZSA9IG5ldyBTcGxpbmVDdXJ2ZSggbnB0cyApO1xyXG5cdFx0dGhpcy5jdXJ2ZXMucHVzaCggY3VydmUgKTtcclxuXHJcblx0XHR0aGlzLmN1cnJlbnRQb2ludC5jb3B5KCBwdHNbIHB0cy5sZW5ndGggLSAxIF0gKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIGFuIGFyYyBhcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgRWxsaXBzZUN1cnZlfSB0byB0aGUgcGF0aCwgcG9zaXRpb25lZCByZWxhdGl2ZVxyXG5cdCAqIHRvIHRoZSBjdXJyZW50IHBvaW50LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFYIC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgY2VudGVyIG9mIHRoZSBhcmMgb2Zmc2V0dGVkIGZyb20gdGhlIHByZXZpb3VzIGN1cnZlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhWSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGNlbnRlciBvZiB0aGUgYXJjIG9mZnNldHRlZCBmcm9tIHRoZSBwcmV2aW91cyBjdXJ2ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYVJhZGl1cyAtIFRoZSByYWRpdXMgb2YgdGhlIGFyYy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYVN0YXJ0QW5nbGUgLSBUaGUgc3RhcnQgYW5nbGUgaW4gcmFkaWFucy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYUVuZEFuZ2xlIC0gVGhlIGVuZCBhbmdsZSBpbiByYWRpYW5zLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FDbG9ja3dpc2U9ZmFsc2VdIC0gV2hldGhlciB0byBzd2VlcCB0aGUgYXJjIGNsb2Nrd2lzZSBvciBub3QuXHJcblx0ICogQHJldHVybiB7UGF0aH0gQSByZWZlcmVuY2UgdG8gdGhpcyBwYXRoLlxyXG5cdCAqL1xyXG5cdGFyYyggYVgsIGFZLCBhUmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlICkge1xyXG5cclxuXHRcdGNvbnN0IHgwID0gdGhpcy5jdXJyZW50UG9pbnQueDtcclxuXHRcdGNvbnN0IHkwID0gdGhpcy5jdXJyZW50UG9pbnQueTtcclxuXHJcblx0XHR0aGlzLmFic2FyYyggYVggKyB4MCwgYVkgKyB5MCwgYVJhZGl1cyxcclxuXHRcdFx0YVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgYW4gYWJzb2x1dGVseSBwb3NpdGlvbmVkIGFyYyBhcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgRWxsaXBzZUN1cnZlfSB0byB0aGUgcGF0aC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhWCAtIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGNlbnRlciBvZiB0aGUgYXJjLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhWSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGNlbnRlciBvZiB0aGUgYXJjLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhUmFkaXVzIC0gVGhlIHJhZGl1cyBvZiB0aGUgYXJjLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhU3RhcnRBbmdsZSAtIFRoZSBzdGFydCBhbmdsZSBpbiByYWRpYW5zLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhRW5kQW5nbGUgLSBUaGUgZW5kIGFuZ2xlIGluIHJhZGlhbnMuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbYUNsb2Nrd2lzZT1mYWxzZV0gLSBXaGV0aGVyIHRvIHN3ZWVwIHRoZSBhcmMgY2xvY2t3aXNlIG9yIG5vdC5cclxuXHQgKiBAcmV0dXJuIHtQYXRofSBBIHJlZmVyZW5jZSB0byB0aGlzIHBhdGguXHJcblx0ICovXHJcblx0YWJzYXJjKCBhWCwgYVksIGFSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UgKSB7XHJcblxyXG5cdFx0dGhpcy5hYnNlbGxpcHNlKCBhWCwgYVksIGFSYWRpdXMsIGFSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIGFuIGVsbGlwc2UgYXMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEVsbGlwc2VDdXJ2ZX0gdG8gdGhlIHBhdGgsIHBvc2l0aW9uZWQgcmVsYXRpdmVcclxuXHQgKiB0byB0aGUgY3VycmVudCBwb2ludFxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFYIC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgY2VudGVyIG9mIHRoZSBlbGxpcHNlIG9mZnNldHRlZCBmcm9tIHRoZSBwcmV2aW91cyBjdXJ2ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYVkgLSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBjZW50ZXIgb2YgdGhlIGVsbGlwc2Ugb2Zmc2V0dGVkIGZyb20gdGhlIHByZXZpb3VzIGN1cnZlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB4UmFkaXVzIC0gVGhlIHJhZGl1cyBvZiB0aGUgZWxsaXBzZSBpbiB0aGUgeCBheGlzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB5UmFkaXVzIC0gVGhlIHJhZGl1cyBvZiB0aGUgZWxsaXBzZSBpbiB0aGUgeSBheGlzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhU3RhcnRBbmdsZSAtIFRoZSBzdGFydCBhbmdsZSBpbiByYWRpYW5zLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhRW5kQW5nbGUgLSBUaGUgZW5kIGFuZ2xlIGluIHJhZGlhbnMuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbYUNsb2Nrd2lzZT1mYWxzZV0gLSBXaGV0aGVyIHRvIHN3ZWVwIHRoZSBlbGxpcHNlIGNsb2Nrd2lzZSBvciBub3QuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFthUm90YXRpb249MF0gLSBUaGUgcm90YXRpb24gYW5nbGUgb2YgdGhlIGVsbGlwc2UgaW4gcmFkaWFucywgY291bnRlcmNsb2Nrd2lzZSBmcm9tIHRoZSBwb3NpdGl2ZSBYIGF4aXMuXHJcblx0ICogQHJldHVybiB7UGF0aH0gQSByZWZlcmVuY2UgdG8gdGhpcyBwYXRoLlxyXG5cdCAqL1xyXG5cdGVsbGlwc2UoIGFYLCBhWSwgeFJhZGl1cywgeVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSwgYVJvdGF0aW9uICkge1xyXG5cclxuXHRcdGNvbnN0IHgwID0gdGhpcy5jdXJyZW50UG9pbnQueDtcclxuXHRcdGNvbnN0IHkwID0gdGhpcy5jdXJyZW50UG9pbnQueTtcclxuXHJcblx0XHR0aGlzLmFic2VsbGlwc2UoIGFYICsgeDAsIGFZICsgeTAsIHhSYWRpdXMsIHlSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UsIGFSb3RhdGlvbiApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgYW4gYWJzb2x1dGVseSBwb3NpdGlvbmVkIGVsbGlwc2UgYXMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEVsbGlwc2VDdXJ2ZX0gdG8gdGhlIHBhdGguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYVggLSBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBhYnNvbHV0ZSBjZW50ZXIgb2YgdGhlIGVsbGlwc2UuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFZIC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgYWJzb2x1dGUgY2VudGVyIG9mIHRoZSBlbGxpcHNlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB4UmFkaXVzIC0gVGhlIHJhZGl1cyBvZiB0aGUgZWxsaXBzZSBpbiB0aGUgeCBheGlzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB5UmFkaXVzIC0gVGhlIHJhZGl1cyBvZiB0aGUgZWxsaXBzZSBpbiB0aGUgeSBheGlzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhU3RhcnRBbmdsZSAtIFRoZSBzdGFydCBhbmdsZSBpbiByYWRpYW5zLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhRW5kQW5nbGUgLSBUaGUgZW5kIGFuZ2xlIGluIHJhZGlhbnMuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbYUNsb2Nrd2lzZT1mYWxzZV0gLSBXaGV0aGVyIHRvIHN3ZWVwIHRoZSBlbGxpcHNlIGNsb2Nrd2lzZSBvciBub3QuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFthUm90YXRpb249MF0gLSBUaGUgcm90YXRpb24gYW5nbGUgb2YgdGhlIGVsbGlwc2UgaW4gcmFkaWFucywgY291bnRlcmNsb2Nrd2lzZSBmcm9tIHRoZSBwb3NpdGl2ZSBYIGF4aXMuXHJcblx0ICogQHJldHVybiB7UGF0aH0gQSByZWZlcmVuY2UgdG8gdGhpcyBwYXRoLlxyXG5cdCAqL1xyXG5cdGFic2VsbGlwc2UoIGFYLCBhWSwgeFJhZGl1cywgeVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSwgYVJvdGF0aW9uICkge1xyXG5cclxuXHRcdGNvbnN0IGN1cnZlID0gbmV3IEVsbGlwc2VDdXJ2ZSggYVgsIGFZLCB4UmFkaXVzLCB5UmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlLCBhUm90YXRpb24gKTtcclxuXHJcblx0XHRpZiAoIHRoaXMuY3VydmVzLmxlbmd0aCA+IDAgKSB7XHJcblxyXG5cdFx0XHQvLyBpZiBhIHByZXZpb3VzIGN1cnZlIGlzIHByZXNlbnQsIGF0dGVtcHQgdG8gam9pblxyXG5cdFx0XHRjb25zdCBmaXJzdFBvaW50ID0gY3VydmUuZ2V0UG9pbnQoIDAgKTtcclxuXHJcblx0XHRcdGlmICggISBmaXJzdFBvaW50LmVxdWFscyggdGhpcy5jdXJyZW50UG9pbnQgKSApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5saW5lVG8oIGZpcnN0UG9pbnQueCwgZmlyc3RQb2ludC55ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuY3VydmVzLnB1c2goIGN1cnZlICk7XHJcblxyXG5cdFx0Y29uc3QgbGFzdFBvaW50ID0gY3VydmUuZ2V0UG9pbnQoIDEgKTtcclxuXHRcdHRoaXMuY3VycmVudFBvaW50LmNvcHkoIGxhc3RQb2ludCApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLmN1cnJlbnRQb2ludC5jb3B5KCBzb3VyY2UuY3VycmVudFBvaW50ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0dG9KU09OKCkge1xyXG5cclxuXHRcdGNvbnN0IGRhdGEgPSBzdXBlci50b0pTT04oKTtcclxuXHJcblx0XHRkYXRhLmN1cnJlbnRQb2ludCA9IHRoaXMuY3VycmVudFBvaW50LnRvQXJyYXkoKTtcclxuXHJcblx0XHRyZXR1cm4gZGF0YTtcclxuXHJcblx0fVxyXG5cclxuXHRmcm9tSlNPTigganNvbiApIHtcclxuXHJcblx0XHRzdXBlci5mcm9tSlNPTigganNvbiApO1xyXG5cclxuXHRcdHRoaXMuY3VycmVudFBvaW50LmZyb21BcnJheSgganNvbi5jdXJyZW50UG9pbnQgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCB7IFBhdGggfTtcclxuIiwiaW1wb3J0IHsgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyQXR0cmlidXRlLmpzJztcclxuaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjIuanMnO1xyXG5pbXBvcnQgeyBjbGFtcCB9IGZyb20gJy4uL21hdGgvTWF0aFV0aWxzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIG1lc2hlcyB3aXRoIGF4aWFsIHN5bW1ldHJ5IGxpa2UgdmFzZXMuIFRoZSBsYXRoZSByb3RhdGVzIGFyb3VuZCB0aGUgWSBheGlzLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBwb2ludHMgPSBbXTtcclxuICogZm9yICggbGV0IGkgPSAwOyBpIDwgMTA7IGkgKysgKSB7XHJcbiAqIFx0cG9pbnRzLnB1c2goIG5ldyBUSFJFRS5WZWN0b3IyKCBNYXRoLnNpbiggaSAqIDAuMiApICogMTAgKyA1LCAoIGkgLSA1ICkgKiAyICkgKTtcclxuICogfVxyXG4gKiBjb25zdCBnZW9tZXRyeSA9IG5ldyBUSFJFRS5MYXRoZUdlb21ldHJ5KCBwb2ludHMgKTtcclxuICogY29uc3QgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IDB4ZmZmZjAwIH0gKTtcclxuICogY29uc3QgbGF0aGUgPSBuZXcgVEhSRUUuTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcbiAqIHNjZW5lLmFkZCggbGF0aGUgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBCdWZmZXJHZW9tZXRyeVxyXG4gKi9cclxuY2xhc3MgTGF0aGVHZW9tZXRyeSBleHRlbmRzIEJ1ZmZlckdlb21ldHJ5IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBsYXRoZSBnZW9tZXRyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8VmVjdG9yMnxWZWN0b3IzPn0gW3BvaW50c10gLSBBbiBhcnJheSBvZiBwb2ludHMgaW4gMkQgc3BhY2UuIFRoZSB4LWNvb3JkaW5hdGUgb2YgZWFjaCBwb2ludFxyXG5cdCAqIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtzZWdtZW50cz0xMl0gLSBUaGUgbnVtYmVyIG9mIGNpcmN1bWZlcmVuY2Ugc2VnbWVudHMgdG8gZ2VuZXJhdGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtwaGlTdGFydD0wXSAtIFRoZSBzdGFydGluZyBhbmdsZSBpbiByYWRpYW5zLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbcGhpTGVuZ3RoPU1hdGguUEkqMl0gLSBUaGUgcmFkaWFuICgwIHRvIDJQSSkgcmFuZ2Ugb2YgdGhlIGxhdGhlZCBzZWN0aW9uIDJQSSBpcyBhXHJcblx0ICogY2xvc2VkIGxhdGhlLCBsZXNzIHRoYW4gMlBJIGlzIGEgcG9ydGlvbi5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcG9pbnRzID0gWyBuZXcgVmVjdG9yMiggMCwgLSAwLjUgKSwgbmV3IFZlY3RvcjIoIDAuNSwgMCApLCBuZXcgVmVjdG9yMiggMCwgMC41ICkgXSwgc2VnbWVudHMgPSAxMiwgcGhpU3RhcnQgPSAwLCBwaGlMZW5ndGggPSBNYXRoLlBJICogMiApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdMYXRoZUdlb21ldHJ5JztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvbGRzIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzIHRoYXQgaGF2ZSBiZWVuXHJcblx0XHQgKiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBnZW9tZXRyeS4gQW55IG1vZGlmaWNhdGlvblxyXG5cdFx0ICogYWZ0ZXIgaW5zdGFudGlhdGlvbiBkb2VzIG5vdCBjaGFuZ2UgdGhlIGdlb21ldHJ5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucGFyYW1ldGVycyA9IHtcclxuXHRcdFx0cG9pbnRzOiBwb2ludHMsXHJcblx0XHRcdHNlZ21lbnRzOiBzZWdtZW50cyxcclxuXHRcdFx0cGhpU3RhcnQ6IHBoaVN0YXJ0LFxyXG5cdFx0XHRwaGlMZW5ndGg6IHBoaUxlbmd0aFxyXG5cdFx0fTtcclxuXHJcblx0XHRzZWdtZW50cyA9IE1hdGguZmxvb3IoIHNlZ21lbnRzICk7XHJcblxyXG5cdFx0Ly8gY2xhbXAgcGhpTGVuZ3RoIHNvIGl0J3MgaW4gcmFuZ2Ugb2YgWyAwLCAyUEkgXVxyXG5cclxuXHRcdHBoaUxlbmd0aCA9IGNsYW1wKCBwaGlMZW5ndGgsIDAsIE1hdGguUEkgKiAyICk7XHJcblxyXG5cdFx0Ly8gYnVmZmVyc1xyXG5cclxuXHRcdGNvbnN0IGluZGljZXMgPSBbXTtcclxuXHRcdGNvbnN0IHZlcnRpY2VzID0gW107XHJcblx0XHRjb25zdCB1dnMgPSBbXTtcclxuXHRcdGNvbnN0IGluaXROb3JtYWxzID0gW107XHJcblx0XHRjb25zdCBub3JtYWxzID0gW107XHJcblxyXG5cdFx0Ly8gaGVscGVyIHZhcmlhYmxlc1xyXG5cclxuXHRcdGNvbnN0IGludmVyc2VTZWdtZW50cyA9IDEuMCAvIHNlZ21lbnRzO1xyXG5cdFx0Y29uc3QgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcclxuXHRcdGNvbnN0IHV2ID0gbmV3IFZlY3RvcjIoKTtcclxuXHRcdGNvbnN0IG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XHJcblx0XHRjb25zdCBjdXJOb3JtYWwgPSBuZXcgVmVjdG9yMygpO1xyXG5cdFx0Y29uc3QgcHJldk5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XHJcblx0XHRsZXQgZHggPSAwO1xyXG5cdFx0bGV0IGR5ID0gMDtcclxuXHJcblx0XHQvLyBwcmUtY29tcHV0ZSBub3JtYWxzIGZvciBpbml0aWFsIFwibWVyaWRpYW5cIlxyXG5cclxuXHRcdGZvciAoIGxldCBqID0gMDsgaiA8PSAoIHBvaW50cy5sZW5ndGggLSAxICk7IGogKysgKSB7XHJcblxyXG5cdFx0XHRzd2l0Y2ggKCBqICkge1xyXG5cclxuXHRcdFx0XHRjYXNlIDA6XHRcdFx0XHQvLyBzcGVjaWFsIGhhbmRsaW5nIGZvciAxc3QgdmVydGV4IG9uIHBhdGhcclxuXHJcblx0XHRcdFx0XHRkeCA9IHBvaW50c1sgaiArIDEgXS54IC0gcG9pbnRzWyBqIF0ueDtcclxuXHRcdFx0XHRcdGR5ID0gcG9pbnRzWyBqICsgMSBdLnkgLSBwb2ludHNbIGogXS55O1xyXG5cclxuXHRcdFx0XHRcdG5vcm1hbC54ID0gZHkgKiAxLjA7XHJcblx0XHRcdFx0XHRub3JtYWwueSA9IC0gZHg7XHJcblx0XHRcdFx0XHRub3JtYWwueiA9IGR5ICogMC4wO1xyXG5cclxuXHRcdFx0XHRcdHByZXZOb3JtYWwuY29weSggbm9ybWFsICk7XHJcblxyXG5cdFx0XHRcdFx0bm9ybWFsLm5vcm1hbGl6ZSgpO1xyXG5cclxuXHRcdFx0XHRcdGluaXROb3JtYWxzLnB1c2goIG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnogKTtcclxuXHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0Y2FzZSAoIHBvaW50cy5sZW5ndGggLSAxICk6XHQvLyBzcGVjaWFsIGhhbmRsaW5nIGZvciBsYXN0IFZlcnRleCBvbiBwYXRoXHJcblxyXG5cdFx0XHRcdFx0aW5pdE5vcm1hbHMucHVzaCggcHJldk5vcm1hbC54LCBwcmV2Tm9ybWFsLnksIHByZXZOb3JtYWwueiApO1xyXG5cclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRkZWZhdWx0Olx0XHRcdC8vIGRlZmF1bHQgaGFuZGxpbmcgZm9yIGFsbCB2ZXJ0aWNlcyBpbiBiZXR3ZWVuXHJcblxyXG5cdFx0XHRcdFx0ZHggPSBwb2ludHNbIGogKyAxIF0ueCAtIHBvaW50c1sgaiBdLng7XHJcblx0XHRcdFx0XHRkeSA9IHBvaW50c1sgaiArIDEgXS55IC0gcG9pbnRzWyBqIF0ueTtcclxuXHJcblx0XHRcdFx0XHRub3JtYWwueCA9IGR5ICogMS4wO1xyXG5cdFx0XHRcdFx0bm9ybWFsLnkgPSAtIGR4O1xyXG5cdFx0XHRcdFx0bm9ybWFsLnogPSBkeSAqIDAuMDtcclxuXHJcblx0XHRcdFx0XHRjdXJOb3JtYWwuY29weSggbm9ybWFsICk7XHJcblxyXG5cdFx0XHRcdFx0bm9ybWFsLnggKz0gcHJldk5vcm1hbC54O1xyXG5cdFx0XHRcdFx0bm9ybWFsLnkgKz0gcHJldk5vcm1hbC55O1xyXG5cdFx0XHRcdFx0bm9ybWFsLnogKz0gcHJldk5vcm1hbC56O1xyXG5cclxuXHRcdFx0XHRcdG5vcm1hbC5ub3JtYWxpemUoKTtcclxuXHJcblx0XHRcdFx0XHRpbml0Tm9ybWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7XHJcblxyXG5cdFx0XHRcdFx0cHJldk5vcm1hbC5jb3B5KCBjdXJOb3JtYWwgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gZ2VuZXJhdGUgdmVydGljZXMsIHV2cyBhbmQgbm9ybWFsc1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8PSBzZWdtZW50czsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHBoaSA9IHBoaVN0YXJ0ICsgaSAqIGludmVyc2VTZWdtZW50cyAqIHBoaUxlbmd0aDtcclxuXHJcblx0XHRcdGNvbnN0IHNpbiA9IE1hdGguc2luKCBwaGkgKTtcclxuXHRcdFx0Y29uc3QgY29zID0gTWF0aC5jb3MoIHBoaSApO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGogPSAwOyBqIDw9ICggcG9pbnRzLmxlbmd0aCAtIDEgKTsgaiArKyApIHtcclxuXHJcblx0XHRcdFx0Ly8gdmVydGV4XHJcblxyXG5cdFx0XHRcdHZlcnRleC54ID0gcG9pbnRzWyBqIF0ueCAqIHNpbjtcclxuXHRcdFx0XHR2ZXJ0ZXgueSA9IHBvaW50c1sgaiBdLnk7XHJcblx0XHRcdFx0dmVydGV4LnogPSBwb2ludHNbIGogXS54ICogY29zO1xyXG5cclxuXHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XHJcblxyXG5cdFx0XHRcdC8vIHV2XHJcblxyXG5cdFx0XHRcdHV2LnggPSBpIC8gc2VnbWVudHM7XHJcblx0XHRcdFx0dXYueSA9IGogLyAoIHBvaW50cy5sZW5ndGggLSAxICk7XHJcblxyXG5cdFx0XHRcdHV2cy5wdXNoKCB1di54LCB1di55ICk7XHJcblxyXG5cdFx0XHRcdC8vIG5vcm1hbFxyXG5cclxuXHRcdFx0XHRjb25zdCB4ID0gaW5pdE5vcm1hbHNbIDMgKiBqICsgMCBdICogc2luO1xyXG5cdFx0XHRcdGNvbnN0IHkgPSBpbml0Tm9ybWFsc1sgMyAqIGogKyAxIF07XHJcblx0XHRcdFx0Y29uc3QgeiA9IGluaXROb3JtYWxzWyAzICogaiArIDAgXSAqIGNvcztcclxuXHJcblx0XHRcdFx0bm9ybWFscy5wdXNoKCB4LCB5LCB6ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGluZGljZXNcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBzZWdtZW50czsgaSArKyApIHtcclxuXHJcblx0XHRcdGZvciAoIGxldCBqID0gMDsgaiA8ICggcG9pbnRzLmxlbmd0aCAtIDEgKTsgaiArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgYmFzZSA9IGogKyBpICogcG9pbnRzLmxlbmd0aDtcclxuXHJcblx0XHRcdFx0Y29uc3QgYSA9IGJhc2U7XHJcblx0XHRcdFx0Y29uc3QgYiA9IGJhc2UgKyBwb2ludHMubGVuZ3RoO1xyXG5cdFx0XHRcdGNvbnN0IGMgPSBiYXNlICsgcG9pbnRzLmxlbmd0aCArIDE7XHJcblx0XHRcdFx0Y29uc3QgZCA9IGJhc2UgKyAxO1xyXG5cclxuXHRcdFx0XHQvLyBmYWNlc1xyXG5cclxuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTtcclxuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGMsIGQsIGIgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gYnVpbGQgZ2VvbWV0cnlcclxuXHJcblx0XHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XHJcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcclxuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcclxuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLnBhcmFtZXRlcnMgPSBPYmplY3QuYXNzaWduKCB7fSwgc291cmNlLnBhcmFtZXRlcnMgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGYWN0b3J5IG1ldGhvZCBmb3IgY3JlYXRpbmcgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBmcm9tIHRoZSBnaXZlblxyXG5cdCAqIEpTT04gb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBBIEpTT04gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc2VyaWFsaXplZCBnZW9tZXRyeS5cclxuXHQgKiBAcmV0dXJuIHtMYXRoZUdlb21ldHJ5fSBBIG5ldyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzdGF0aWMgZnJvbUpTT04oIGRhdGEgKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBMYXRoZUdlb21ldHJ5KCBkYXRhLnBvaW50cywgZGF0YS5zZWdtZW50cywgZGF0YS5waGlTdGFydCwgZGF0YS5waGlMZW5ndGggKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCB7IExhdGhlR2VvbWV0cnkgfTtcclxuIiwiaW1wb3J0IHsgUGF0aCB9IGZyb20gJy4uL2V4dHJhcy9jb3JlL1BhdGguanMnO1xyXG5pbXBvcnQgeyBMYXRoZUdlb21ldHJ5IH0gZnJvbSAnLi9MYXRoZUdlb21ldHJ5LmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIGdlb21ldHJ5IGNsYXNzIGZvciBhIGNhcHN1bGUgd2l0aCBnaXZlbiByYWRpaSBhbmQgaGVpZ2h0LiBJdCBpcyBjb25zdHJ1Y3RlZCB1c2luZyBhIGxhdGhlLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBnZW9tZXRyeSA9IG5ldyBUSFJFRS5DYXBzdWxlR2VvbWV0cnkoIDEsIDEsIDQsIDggKTtcclxuICogY29uc3QgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IDB4MDBmZjAwIH0gKTtcclxuICogY29uc3QgY2Fwc3VsZSA9IG5ldyBUSFJFRS5NZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuICogc2NlbmUuYWRkKCBjYXBzdWxlICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTGF0aGVHZW9tZXRyeVxyXG4gKi9cclxuY2xhc3MgQ2Fwc3VsZUdlb21ldHJ5IGV4dGVuZHMgTGF0aGVHZW9tZXRyeSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgY2Fwc3VsZSBnZW9tZXRyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbcmFkaXVzPTFdIC0gUmFkaXVzIG9mIHRoZSBjYXBzdWxlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPTFdIC0gTGVuZ3RoIG9mIHRoZSBtaWRkbGUgc2VjdGlvbi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2NhcFNlZ21lbnRzPTRdIC0gTnVtYmVyIG9mIGN1cnZlIHNlZ21lbnRzIHVzZWQgdG8gYnVpbGQgdGhlIGNhcHMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpYWxTZWdtZW50cz04XSAtIE51bWJlciBvZiBzZWdtZW50ZWQgZmFjZXMgYXJvdW5kIHRoZSBjaXJjdW1mZXJlbmNlIG9mIHRoZSBjYXBzdWxlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCByYWRpdXMgPSAxLCBsZW5ndGggPSAxLCBjYXBTZWdtZW50cyA9IDQsIHJhZGlhbFNlZ21lbnRzID0gOCApIHtcclxuXHJcblx0XHRjb25zdCBwYXRoID0gbmV3IFBhdGgoKTtcclxuXHRcdHBhdGguYWJzYXJjKCAwLCAtIGxlbmd0aCAvIDIsIHJhZGl1cywgTWF0aC5QSSAqIDEuNSwgMCApO1xyXG5cdFx0cGF0aC5hYnNhcmMoIDAsIGxlbmd0aCAvIDIsIHJhZGl1cywgMCwgTWF0aC5QSSAqIDAuNSApO1xyXG5cclxuXHRcdHN1cGVyKCBwYXRoLmdldFBvaW50cyggY2FwU2VnbWVudHMgKSwgcmFkaWFsU2VnbWVudHMgKTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnQ2Fwc3VsZUdlb21ldHJ5JztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvbGRzIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzIHRoYXQgaGF2ZSBiZWVuXHJcblx0XHQgKiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBnZW9tZXRyeS4gQW55IG1vZGlmaWNhdGlvblxyXG5cdFx0ICogYWZ0ZXIgaW5zdGFudGlhdGlvbiBkb2VzIG5vdCBjaGFuZ2UgdGhlIGdlb21ldHJ5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucGFyYW1ldGVycyA9IHtcclxuXHRcdFx0cmFkaXVzOiByYWRpdXMsXHJcblx0XHRcdGxlbmd0aDogbGVuZ3RoLFxyXG5cdFx0XHRjYXBTZWdtZW50czogY2FwU2VnbWVudHMsXHJcblx0XHRcdHJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cyxcclxuXHRcdH07XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRmFjdG9yeSBtZXRob2QgZm9yIGNyZWF0aW5nIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZnJvbSB0aGUgZ2l2ZW5cclxuXHQgKiBKU09OIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gQSBKU09OIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNlcmlhbGl6ZWQgZ2VvbWV0cnkuXHJcblx0ICogQHJldHVybiB7Q2Fwc3VsZUdlb21ldHJ5fSBBIG5ldyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzdGF0aWMgZnJvbUpTT04oIGRhdGEgKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBDYXBzdWxlR2VvbWV0cnkoIGRhdGEucmFkaXVzLCBkYXRhLmxlbmd0aCwgZGF0YS5jYXBTZWdtZW50cywgZGF0YS5yYWRpYWxTZWdtZW50cyApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBDYXBzdWxlR2VvbWV0cnkgfTtcclxuIiwiaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcclxuaW1wb3J0IHsgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyQXR0cmlidXRlLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjIuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgc2ltcGxlIHNoYXBlIG9mIEV1Y2xpZGVhbiBnZW9tZXRyeS4gSXQgaXMgY29uc3RydWN0ZWQgZnJvbSBhXHJcbiAqIG51bWJlciBvZiB0cmlhbmd1bGFyIHNlZ21lbnRzIHRoYXQgYXJlIG9yaWVudGVkIGFyb3VuZCBhIGNlbnRyYWwgcG9pbnQgYW5kXHJcbiAqIGV4dGVuZCBhcyBmYXIgb3V0IGFzIGEgZ2l2ZW4gcmFkaXVzLiBJdCBpcyBidWlsdCBjb3VudGVyLWNsb2Nrd2lzZSBmcm9tIGFcclxuICogc3RhcnQgYW5nbGUgYW5kIGEgZ2l2ZW4gY2VudHJhbCBhbmdsZS4gSXQgY2FuIGFsc28gYmUgdXNlZCB0byBjcmVhdGVcclxuICogcmVndWxhciBwb2x5Z29ucywgd2hlcmUgdGhlIG51bWJlciBvZiBzZWdtZW50cyBkZXRlcm1pbmVzIHRoZSBudW1iZXIgb2ZcclxuICogc2lkZXMuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGdlb21ldHJ5ID0gbmV3IFRIUkVFLkNpcmNsZUdlb21ldHJ5KCA1LCAzMiApO1xyXG4gKiBjb25zdCBtYXRlcmlhbCA9IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogMHhmZmZmMDAgfSApO1xyXG4gKiBjb25zdCBjaXJjbGUgPSBuZXcgVEhSRUUuTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcbiAqIHNjZW5lLmFkZCggY2lyY2xlIClcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBCdWZmZXJHZW9tZXRyeVxyXG4gKi9cclxuY2xhc3MgQ2lyY2xlR2VvbWV0cnkgZXh0ZW5kcyBCdWZmZXJHZW9tZXRyeSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgY2lyY2xlIGdlb21ldHJ5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpdXM9MV0gLSBSYWRpdXMgb2YgdGhlIGNpcmNsZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3NlZ21lbnRzPTMyXSAtIE51bWJlciBvZiBzZWdtZW50cyAodHJpYW5nbGVzKSwgbWluaW11bSA9IGAzYC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3RoZXRhU3RhcnQ9MF0gLSBTdGFydCBhbmdsZSBmb3IgZmlyc3Qgc2VnbWVudCBpbiByYWRpYW5zLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbdGhldGFMZW5ndGg9TWF0aC5QSSoyXSAtIFRoZSBjZW50cmFsIGFuZ2xlLCBvZnRlbiBjYWxsZWQgdGhldGEsXHJcblx0ICogb2YgdGhlIGNpcmN1bGFyIHNlY3RvciBpbiByYWRpYW5zLiBUaGUgZGVmYXVsdCB2YWx1ZSByZXN1bHRzIGluIGEgY29tcGxldGUgY2lyY2xlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCByYWRpdXMgPSAxLCBzZWdtZW50cyA9IDMyLCB0aGV0YVN0YXJ0ID0gMCwgdGhldGFMZW5ndGggPSBNYXRoLlBJICogMiApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdDaXJjbGVHZW9tZXRyeSc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb2xkcyB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVycyB0aGF0IGhhdmUgYmVlblxyXG5cdFx0ICogdXNlZCB0byBnZW5lcmF0ZSB0aGUgZ2VvbWV0cnkuIEFueSBtb2RpZmljYXRpb25cclxuXHRcdCAqIGFmdGVyIGluc3RhbnRpYXRpb24gZG9lcyBub3QgY2hhbmdlIHRoZSBnZW9tZXRyeS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBhcmFtZXRlcnMgPSB7XHJcblx0XHRcdHJhZGl1czogcmFkaXVzLFxyXG5cdFx0XHRzZWdtZW50czogc2VnbWVudHMsXHJcblx0XHRcdHRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsXHJcblx0XHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxyXG5cdFx0fTtcclxuXHJcblx0XHRzZWdtZW50cyA9IE1hdGgubWF4KCAzLCBzZWdtZW50cyApO1xyXG5cclxuXHRcdC8vIGJ1ZmZlcnNcclxuXHJcblx0XHRjb25zdCBpbmRpY2VzID0gW107XHJcblx0XHRjb25zdCB2ZXJ0aWNlcyA9IFtdO1xyXG5cdFx0Y29uc3Qgbm9ybWFscyA9IFtdO1xyXG5cdFx0Y29uc3QgdXZzID0gW107XHJcblxyXG5cdFx0Ly8gaGVscGVyIHZhcmlhYmxlc1xyXG5cclxuXHRcdGNvbnN0IHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XHJcblx0XHRjb25zdCB1diA9IG5ldyBWZWN0b3IyKCk7XHJcblxyXG5cdFx0Ly8gY2VudGVyIHBvaW50XHJcblxyXG5cdFx0dmVydGljZXMucHVzaCggMCwgMCwgMCApO1xyXG5cdFx0bm9ybWFscy5wdXNoKCAwLCAwLCAxICk7XHJcblx0XHR1dnMucHVzaCggMC41LCAwLjUgKTtcclxuXHJcblx0XHRmb3IgKCBsZXQgcyA9IDAsIGkgPSAzOyBzIDw9IHNlZ21lbnRzOyBzICsrLCBpICs9IDMgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBzZWdtZW50ID0gdGhldGFTdGFydCArIHMgLyBzZWdtZW50cyAqIHRoZXRhTGVuZ3RoO1xyXG5cclxuXHRcdFx0Ly8gdmVydGV4XHJcblxyXG5cdFx0XHR2ZXJ0ZXgueCA9IHJhZGl1cyAqIE1hdGguY29zKCBzZWdtZW50ICk7XHJcblx0XHRcdHZlcnRleC55ID0gcmFkaXVzICogTWF0aC5zaW4oIHNlZ21lbnQgKTtcclxuXHJcblx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcclxuXHJcblx0XHRcdC8vIG5vcm1hbFxyXG5cclxuXHRcdFx0bm9ybWFscy5wdXNoKCAwLCAwLCAxICk7XHJcblxyXG5cdFx0XHQvLyB1dnNcclxuXHJcblx0XHRcdHV2LnggPSAoIHZlcnRpY2VzWyBpIF0gLyByYWRpdXMgKyAxICkgLyAyO1xyXG5cdFx0XHR1di55ID0gKCB2ZXJ0aWNlc1sgaSArIDEgXSAvIHJhZGl1cyArIDEgKSAvIDI7XHJcblxyXG5cdFx0XHR1dnMucHVzaCggdXYueCwgdXYueSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBpbmRpY2VzXHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAxOyBpIDw9IHNlZ21lbnRzOyBpICsrICkge1xyXG5cclxuXHRcdFx0aW5kaWNlcy5wdXNoKCBpLCBpICsgMSwgMCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBidWlsZCBnZW9tZXRyeVxyXG5cclxuXHRcdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcclxuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xyXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XHJcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMucGFyYW1ldGVycyA9IE9iamVjdC5hc3NpZ24oIHt9LCBzb3VyY2UucGFyYW1ldGVycyApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGZyb20gdGhlIGdpdmVuXHJcblx0ICogSlNPTiBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIEEgSlNPTiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzZXJpYWxpemVkIGdlb21ldHJ5LlxyXG5cdCAqIEByZXR1cm4ge0NpcmNsZUdlb21ldHJ5fSBBIG5ldyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzdGF0aWMgZnJvbUpTT04oIGRhdGEgKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBDaXJjbGVHZW9tZXRyeSggZGF0YS5yYWRpdXMsIGRhdGEuc2VnbWVudHMsIGRhdGEudGhldGFTdGFydCwgZGF0YS50aGV0YUxlbmd0aCApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgQ2lyY2xlR2VvbWV0cnkgfTtcclxuIiwiaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcclxuaW1wb3J0IHsgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyQXR0cmlidXRlLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjIuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgZ2VvbWV0cnkgY2xhc3MgZm9yIHJlcHJlc2VudGluZyBhIGN5bGluZGVyLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBnZW9tZXRyeSA9IG5ldyBUSFJFRS5DeWxpbmRlckdlb21ldHJ5KCA1LCA1LCAyMCwgMzIgKTtcclxuICogY29uc3QgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IDB4ZmZmZjAwIH0gKTtcclxuICogY29uc3QgY3lsaW5kZXIgPSBuZXcgVEhSRUUuTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcbiAqIHNjZW5lLmFkZCggY3lsaW5kZXIgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBCdWZmZXJHZW9tZXRyeVxyXG4gKi9cclxuY2xhc3MgQ3lsaW5kZXJHZW9tZXRyeSBleHRlbmRzIEJ1ZmZlckdlb21ldHJ5IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBjeWxpbmRlciBnZW9tZXRyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbcmFkaXVzVG9wPTFdIC0gUmFkaXVzIG9mIHRoZSBjeWxpbmRlciBhdCB0aGUgdG9wLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbcmFkaXVzQm90dG9tPTFdIC0gUmFkaXVzIG9mIHRoZSBjeWxpbmRlciBhdCB0aGUgYm90dG9tLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbaGVpZ2h0PTFdIC0gSGVpZ2h0IG9mIHRoZSBjeWxpbmRlci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3JhZGlhbFNlZ21lbnRzPTMyXSAtIE51bWJlciBvZiBzZWdtZW50ZWQgZmFjZXMgYXJvdW5kIHRoZSBjaXJjdW1mZXJlbmNlIG9mIHRoZSBjeWxpbmRlci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2hlaWdodFNlZ21lbnRzPTFdIC0gTnVtYmVyIG9mIHJvd3Mgb2YgZmFjZXMgYWxvbmcgdGhlIGhlaWdodCBvZiB0aGUgY3lsaW5kZXIuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbb3BlbkVuZGVkPWZhbHNlXSAtIFdoZXRoZXIgdGhlIGJhc2Ugb2YgdGhlIGN5bGluZGVyIGlzIG9wZW4gb3IgY2FwcGVkLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbdGhldGFTdGFydD0wXSAtIFN0YXJ0IGFuZ2xlIGZvciBmaXJzdCBzZWdtZW50LCBpbiByYWRpYW5zLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbdGhldGFMZW5ndGg9TWF0aC5QSSoyXSAtIFRoZSBjZW50cmFsIGFuZ2xlLCBvZnRlbiBjYWxsZWQgdGhldGEsIG9mIHRoZSBjaXJjdWxhciBzZWN0b3IsIGluIHJhZGlhbnMuXHJcblx0ICogVGhlIGRlZmF1bHQgdmFsdWUgcmVzdWx0cyBpbiBhIGNvbXBsZXRlIGN5bGluZGVyLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCByYWRpdXNUb3AgPSAxLCByYWRpdXNCb3R0b20gPSAxLCBoZWlnaHQgPSAxLCByYWRpYWxTZWdtZW50cyA9IDMyLCBoZWlnaHRTZWdtZW50cyA9IDEsIG9wZW5FbmRlZCA9IGZhbHNlLCB0aGV0YVN0YXJ0ID0gMCwgdGhldGFMZW5ndGggPSBNYXRoLlBJICogMiApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdDeWxpbmRlckdlb21ldHJ5JztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvbGRzIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzIHRoYXQgaGF2ZSBiZWVuXHJcblx0XHQgKiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBnZW9tZXRyeS4gQW55IG1vZGlmaWNhdGlvblxyXG5cdFx0ICogYWZ0ZXIgaW5zdGFudGlhdGlvbiBkb2VzIG5vdCBjaGFuZ2UgdGhlIGdlb21ldHJ5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucGFyYW1ldGVycyA9IHtcclxuXHRcdFx0cmFkaXVzVG9wOiByYWRpdXNUb3AsXHJcblx0XHRcdHJhZGl1c0JvdHRvbTogcmFkaXVzQm90dG9tLFxyXG5cdFx0XHRoZWlnaHQ6IGhlaWdodCxcclxuXHRcdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxyXG5cdFx0XHRoZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHMsXHJcblx0XHRcdG9wZW5FbmRlZDogb3BlbkVuZGVkLFxyXG5cdFx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxyXG5cdFx0XHR0aGV0YUxlbmd0aDogdGhldGFMZW5ndGhcclxuXHRcdH07XHJcblxyXG5cdFx0Y29uc3Qgc2NvcGUgPSB0aGlzO1xyXG5cclxuXHRcdHJhZGlhbFNlZ21lbnRzID0gTWF0aC5mbG9vciggcmFkaWFsU2VnbWVudHMgKTtcclxuXHRcdGhlaWdodFNlZ21lbnRzID0gTWF0aC5mbG9vciggaGVpZ2h0U2VnbWVudHMgKTtcclxuXHJcblx0XHQvLyBidWZmZXJzXHJcblxyXG5cdFx0Y29uc3QgaW5kaWNlcyA9IFtdO1xyXG5cdFx0Y29uc3QgdmVydGljZXMgPSBbXTtcclxuXHRcdGNvbnN0IG5vcm1hbHMgPSBbXTtcclxuXHRcdGNvbnN0IHV2cyA9IFtdO1xyXG5cclxuXHRcdC8vIGhlbHBlciB2YXJpYWJsZXNcclxuXHJcblx0XHRsZXQgaW5kZXggPSAwO1xyXG5cdFx0Y29uc3QgaW5kZXhBcnJheSA9IFtdO1xyXG5cdFx0Y29uc3QgaGFsZkhlaWdodCA9IGhlaWdodCAvIDI7XHJcblx0XHRsZXQgZ3JvdXBTdGFydCA9IDA7XHJcblxyXG5cdFx0Ly8gZ2VuZXJhdGUgZ2VvbWV0cnlcclxuXHJcblx0XHRnZW5lcmF0ZVRvcnNvKCk7XHJcblxyXG5cdFx0aWYgKCBvcGVuRW5kZWQgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0aWYgKCByYWRpdXNUb3AgPiAwICkgZ2VuZXJhdGVDYXAoIHRydWUgKTtcclxuXHRcdFx0aWYgKCByYWRpdXNCb3R0b20gPiAwICkgZ2VuZXJhdGVDYXAoIGZhbHNlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGJ1aWxkIGdlb21ldHJ5XHJcblxyXG5cdFx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xyXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XHJcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcclxuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcclxuXHJcblx0XHRmdW5jdGlvbiBnZW5lcmF0ZVRvcnNvKCkge1xyXG5cclxuXHRcdFx0Y29uc3Qgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcclxuXHRcdFx0Y29uc3QgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcclxuXHJcblx0XHRcdGxldCBncm91cENvdW50ID0gMDtcclxuXHJcblx0XHRcdC8vIHRoaXMgd2lsbCBiZSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgbm9ybWFsXHJcblx0XHRcdGNvbnN0IHNsb3BlID0gKCByYWRpdXNCb3R0b20gLSByYWRpdXNUb3AgKSAvIGhlaWdodDtcclxuXHJcblx0XHRcdC8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnNcclxuXHJcblx0XHRcdGZvciAoIGxldCB5ID0gMDsgeSA8PSBoZWlnaHRTZWdtZW50czsgeSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgaW5kZXhSb3cgPSBbXTtcclxuXHJcblx0XHRcdFx0Y29uc3QgdiA9IHkgLyBoZWlnaHRTZWdtZW50cztcclxuXHJcblx0XHRcdFx0Ly8gY2FsY3VsYXRlIHRoZSByYWRpdXMgb2YgdGhlIGN1cnJlbnQgcm93XHJcblxyXG5cdFx0XHRcdGNvbnN0IHJhZGl1cyA9IHYgKiAoIHJhZGl1c0JvdHRvbSAtIHJhZGl1c1RvcCApICsgcmFkaXVzVG9wO1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgeCA9IDA7IHggPD0gcmFkaWFsU2VnbWVudHM7IHggKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgdSA9IHggLyByYWRpYWxTZWdtZW50cztcclxuXHJcblx0XHRcdFx0XHRjb25zdCB0aGV0YSA9IHUgKiB0aGV0YUxlbmd0aCArIHRoZXRhU3RhcnQ7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3Qgc2luVGhldGEgPSBNYXRoLnNpbiggdGhldGEgKTtcclxuXHRcdFx0XHRcdGNvbnN0IGNvc1RoZXRhID0gTWF0aC5jb3MoIHRoZXRhICk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gdmVydGV4XHJcblxyXG5cdFx0XHRcdFx0dmVydGV4LnggPSByYWRpdXMgKiBzaW5UaGV0YTtcclxuXHRcdFx0XHRcdHZlcnRleC55ID0gLSB2ICogaGVpZ2h0ICsgaGFsZkhlaWdodDtcclxuXHRcdFx0XHRcdHZlcnRleC56ID0gcmFkaXVzICogY29zVGhldGE7XHJcblx0XHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gbm9ybWFsXHJcblxyXG5cdFx0XHRcdFx0bm9ybWFsLnNldCggc2luVGhldGEsIHNsb3BlLCBjb3NUaGV0YSApLm5vcm1hbGl6ZSgpO1xyXG5cdFx0XHRcdFx0bm9ybWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gdXZcclxuXHJcblx0XHRcdFx0XHR1dnMucHVzaCggdSwgMSAtIHYgKTtcclxuXHJcblx0XHRcdFx0XHQvLyBzYXZlIGluZGV4IG9mIHZlcnRleCBpbiByZXNwZWN0aXZlIHJvd1xyXG5cclxuXHRcdFx0XHRcdGluZGV4Um93LnB1c2goIGluZGV4ICsrICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Ly8gbm93IHNhdmUgdmVydGljZXMgb2YgdGhlIHJvdyBpbiBvdXIgaW5kZXggYXJyYXlcclxuXHJcblx0XHRcdFx0aW5kZXhBcnJheS5wdXNoKCBpbmRleFJvdyApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gZ2VuZXJhdGUgaW5kaWNlc1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IHggPSAwOyB4IDwgcmFkaWFsU2VnbWVudHM7IHggKysgKSB7XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCB5ID0gMDsgeSA8IGhlaWdodFNlZ21lbnRzOyB5ICsrICkge1xyXG5cclxuXHRcdFx0XHRcdC8vIHdlIHVzZSB0aGUgaW5kZXggYXJyYXkgdG8gYWNjZXNzIHRoZSBjb3JyZWN0IGluZGljZXNcclxuXHJcblx0XHRcdFx0XHRjb25zdCBhID0gaW5kZXhBcnJheVsgeSBdWyB4IF07XHJcblx0XHRcdFx0XHRjb25zdCBiID0gaW5kZXhBcnJheVsgeSArIDEgXVsgeCBdO1xyXG5cdFx0XHRcdFx0Y29uc3QgYyA9IGluZGV4QXJyYXlbIHkgKyAxIF1bIHggKyAxIF07XHJcblx0XHRcdFx0XHRjb25zdCBkID0gaW5kZXhBcnJheVsgeSBdWyB4ICsgMSBdO1xyXG5cclxuXHRcdFx0XHRcdC8vIGZhY2VzXHJcblxyXG5cdFx0XHRcdFx0aWYgKCByYWRpdXNUb3AgPiAwIHx8IHkgIT09IDAgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTtcclxuXHRcdFx0XHRcdFx0Z3JvdXBDb3VudCArPSAzO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRpZiAoIHJhZGl1c0JvdHRvbSA+IDAgfHwgeSAhPT0gaGVpZ2h0U2VnbWVudHMgLSAxICkge1xyXG5cclxuXHRcdFx0XHRcdFx0aW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XHJcblx0XHRcdFx0XHRcdGdyb3VwQ291bnQgKz0gMztcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIGFkZCBhIGdyb3VwIHRvIHRoZSBnZW9tZXRyeS4gdGhpcyB3aWxsIGVuc3VyZSBtdWx0aSBtYXRlcmlhbCBzdXBwb3J0XHJcblxyXG5cdFx0XHRzY29wZS5hZGRHcm91cCggZ3JvdXBTdGFydCwgZ3JvdXBDb3VudCwgMCApO1xyXG5cclxuXHRcdFx0Ly8gY2FsY3VsYXRlIG5ldyBzdGFydCB2YWx1ZSBmb3IgZ3JvdXBzXHJcblxyXG5cdFx0XHRncm91cFN0YXJ0ICs9IGdyb3VwQ291bnQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIGdlbmVyYXRlQ2FwKCB0b3AgKSB7XHJcblxyXG5cdFx0XHQvLyBzYXZlIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2VudGVyIHZlcnRleFxyXG5cdFx0XHRjb25zdCBjZW50ZXJJbmRleFN0YXJ0ID0gaW5kZXg7XHJcblxyXG5cdFx0XHRjb25zdCB1diA9IG5ldyBWZWN0b3IyKCk7XHJcblx0XHRcdGNvbnN0IHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XHJcblxyXG5cdFx0XHRsZXQgZ3JvdXBDb3VudCA9IDA7XHJcblxyXG5cdFx0XHRjb25zdCByYWRpdXMgPSAoIHRvcCA9PT0gdHJ1ZSApID8gcmFkaXVzVG9wIDogcmFkaXVzQm90dG9tO1xyXG5cdFx0XHRjb25zdCBzaWduID0gKCB0b3AgPT09IHRydWUgKSA/IDEgOiAtIDE7XHJcblxyXG5cdFx0XHQvLyBmaXJzdCB3ZSBnZW5lcmF0ZSB0aGUgY2VudGVyIHZlcnRleCBkYXRhIG9mIHRoZSBjYXAuXHJcblx0XHRcdC8vIGJlY2F1c2UgdGhlIGdlb21ldHJ5IG5lZWRzIG9uZSBzZXQgb2YgdXZzIHBlciBmYWNlLFxyXG5cdFx0XHQvLyB3ZSBtdXN0IGdlbmVyYXRlIGEgY2VudGVyIHZlcnRleCBwZXIgZmFjZS9zZWdtZW50XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgeCA9IDE7IHggPD0gcmFkaWFsU2VnbWVudHM7IHggKysgKSB7XHJcblxyXG5cdFx0XHRcdC8vIHZlcnRleFxyXG5cclxuXHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCAwLCBoYWxmSGVpZ2h0ICogc2lnbiwgMCApO1xyXG5cclxuXHRcdFx0XHQvLyBub3JtYWxcclxuXHJcblx0XHRcdFx0bm9ybWFscy5wdXNoKCAwLCBzaWduLCAwICk7XHJcblxyXG5cdFx0XHRcdC8vIHV2XHJcblxyXG5cdFx0XHRcdHV2cy5wdXNoKCAwLjUsIDAuNSApO1xyXG5cclxuXHRcdFx0XHQvLyBpbmNyZWFzZSBpbmRleFxyXG5cclxuXHRcdFx0XHRpbmRleCArKztcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIHNhdmUgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGNlbnRlciB2ZXJ0ZXhcclxuXHRcdFx0Y29uc3QgY2VudGVySW5kZXhFbmQgPSBpbmRleDtcclxuXHJcblx0XHRcdC8vIG5vdyB3ZSBnZW5lcmF0ZSB0aGUgc3Vycm91bmRpbmcgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IHggPSAwOyB4IDw9IHJhZGlhbFNlZ21lbnRzOyB4ICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB1ID0geCAvIHJhZGlhbFNlZ21lbnRzO1xyXG5cdFx0XHRcdGNvbnN0IHRoZXRhID0gdSAqIHRoZXRhTGVuZ3RoICsgdGhldGFTdGFydDtcclxuXHJcblx0XHRcdFx0Y29uc3QgY29zVGhldGEgPSBNYXRoLmNvcyggdGhldGEgKTtcclxuXHRcdFx0XHRjb25zdCBzaW5UaGV0YSA9IE1hdGguc2luKCB0aGV0YSApO1xyXG5cclxuXHRcdFx0XHQvLyB2ZXJ0ZXhcclxuXHJcblx0XHRcdFx0dmVydGV4LnggPSByYWRpdXMgKiBzaW5UaGV0YTtcclxuXHRcdFx0XHR2ZXJ0ZXgueSA9IGhhbGZIZWlnaHQgKiBzaWduO1xyXG5cdFx0XHRcdHZlcnRleC56ID0gcmFkaXVzICogY29zVGhldGE7XHJcblx0XHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xyXG5cclxuXHRcdFx0XHQvLyBub3JtYWxcclxuXHJcblx0XHRcdFx0bm9ybWFscy5wdXNoKCAwLCBzaWduLCAwICk7XHJcblxyXG5cdFx0XHRcdC8vIHV2XHJcblxyXG5cdFx0XHRcdHV2LnggPSAoIGNvc1RoZXRhICogMC41ICkgKyAwLjU7XHJcblx0XHRcdFx0dXYueSA9ICggc2luVGhldGEgKiAwLjUgKiBzaWduICkgKyAwLjU7XHJcblx0XHRcdFx0dXZzLnB1c2goIHV2LngsIHV2LnkgKTtcclxuXHJcblx0XHRcdFx0Ly8gaW5jcmVhc2UgaW5kZXhcclxuXHJcblx0XHRcdFx0aW5kZXggKys7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBnZW5lcmF0ZSBpbmRpY2VzXHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgeCA9IDA7IHggPCByYWRpYWxTZWdtZW50czsgeCArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgYyA9IGNlbnRlckluZGV4U3RhcnQgKyB4O1xyXG5cdFx0XHRcdGNvbnN0IGkgPSBjZW50ZXJJbmRleEVuZCArIHg7XHJcblxyXG5cdFx0XHRcdGlmICggdG9wID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRcdC8vIGZhY2UgdG9wXHJcblxyXG5cdFx0XHRcdFx0aW5kaWNlcy5wdXNoKCBpLCBpICsgMSwgYyApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdC8vIGZhY2UgYm90dG9tXHJcblxyXG5cdFx0XHRcdFx0aW5kaWNlcy5wdXNoKCBpICsgMSwgaSwgYyApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGdyb3VwQ291bnQgKz0gMztcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIGFkZCBhIGdyb3VwIHRvIHRoZSBnZW9tZXRyeS4gdGhpcyB3aWxsIGVuc3VyZSBtdWx0aSBtYXRlcmlhbCBzdXBwb3J0XHJcblxyXG5cdFx0XHRzY29wZS5hZGRHcm91cCggZ3JvdXBTdGFydCwgZ3JvdXBDb3VudCwgdG9wID09PSB0cnVlID8gMSA6IDIgKTtcclxuXHJcblx0XHRcdC8vIGNhbGN1bGF0ZSBuZXcgc3RhcnQgdmFsdWUgZm9yIGdyb3Vwc1xyXG5cclxuXHRcdFx0Z3JvdXBTdGFydCArPSBncm91cENvdW50O1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0gT2JqZWN0LmFzc2lnbigge30sIHNvdXJjZS5wYXJhbWV0ZXJzICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRmFjdG9yeSBtZXRob2QgZm9yIGNyZWF0aW5nIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZnJvbSB0aGUgZ2l2ZW5cclxuXHQgKiBKU09OIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gQSBKU09OIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNlcmlhbGl6ZWQgZ2VvbWV0cnkuXHJcblx0ICogQHJldHVybiB7Q3lsaW5kZXJHZW9tZXRyeX0gQSBuZXcgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c3RhdGljIGZyb21KU09OKCBkYXRhICkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgQ3lsaW5kZXJHZW9tZXRyeSggZGF0YS5yYWRpdXNUb3AsIGRhdGEucmFkaXVzQm90dG9tLCBkYXRhLmhlaWdodCwgZGF0YS5yYWRpYWxTZWdtZW50cywgZGF0YS5oZWlnaHRTZWdtZW50cywgZGF0YS5vcGVuRW5kZWQsIGRhdGEudGhldGFTdGFydCwgZGF0YS50aGV0YUxlbmd0aCApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgQ3lsaW5kZXJHZW9tZXRyeSB9O1xyXG4iLCJpbXBvcnQgeyBDeWxpbmRlckdlb21ldHJ5IH0gZnJvbSAnLi9DeWxpbmRlckdlb21ldHJ5LmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIGdlb21ldHJ5IGNsYXNzIGZvciByZXByZXNlbnRpbmcgYSBjb25lLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBnZW9tZXRyeSA9IG5ldyBUSFJFRS5Db25lR2VvbWV0cnkoIDUsIDIwLCAzMiApO1xyXG4gKiBjb25zdCBtYXRlcmlhbCA9IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogMHhmZmZmMDAgfSApO1xyXG4gKiBjb25zdCBjb25lID0gbmV3IFRIUkVFLk1lc2goZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcbiAqIHNjZW5lLmFkZCggY29uZSApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIEN5bGluZGVyR2VvbWV0cnlcclxuICovXHJcbmNsYXNzIENvbmVHZW9tZXRyeSBleHRlbmRzIEN5bGluZGVyR2VvbWV0cnkge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGNvbmUgZ2VvbWV0cnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3JhZGl1cz0xXSAtIFJhZGl1cyBvZiB0aGUgY29uZSBiYXNlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbaGVpZ2h0PTFdIC0gSGVpZ2h0IG9mIHRoZSBjb25lLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbcmFkaWFsU2VnbWVudHM9MzJdIC0gTnVtYmVyIG9mIHNlZ21lbnRlZCBmYWNlcyBhcm91bmQgdGhlIGNpcmN1bWZlcmVuY2Ugb2YgdGhlIGNvbmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtoZWlnaHRTZWdtZW50cz0xXSAtIE51bWJlciBvZiByb3dzIG9mIGZhY2VzIGFsb25nIHRoZSBoZWlnaHQgb2YgdGhlIGNvbmUuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbb3BlbkVuZGVkPWZhbHNlXSAtIFdoZXRoZXIgdGhlIGJhc2Ugb2YgdGhlIGNvbmUgaXMgb3BlbiBvciBjYXBwZWQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt0aGV0YVN0YXJ0PTBdIC0gU3RhcnQgYW5nbGUgZm9yIGZpcnN0IHNlZ21lbnQsIGluIHJhZGlhbnMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt0aGV0YUxlbmd0aD1NYXRoLlBJKjJdIC0gVGhlIGNlbnRyYWwgYW5nbGUsIG9mdGVuIGNhbGxlZCB0aGV0YSwgb2YgdGhlIGNpcmN1bGFyIHNlY3RvciwgaW4gcmFkaWFucy5cclxuXHQgKiBUaGUgZGVmYXVsdCB2YWx1ZSByZXN1bHRzIGluIGEgY29tcGxldGUgY29uZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcmFkaXVzID0gMSwgaGVpZ2h0ID0gMSwgcmFkaWFsU2VnbWVudHMgPSAzMiwgaGVpZ2h0U2VnbWVudHMgPSAxLCBvcGVuRW5kZWQgPSBmYWxzZSwgdGhldGFTdGFydCA9IDAsIHRoZXRhTGVuZ3RoID0gTWF0aC5QSSAqIDIgKSB7XHJcblxyXG5cdFx0c3VwZXIoIDAsIHJhZGl1cywgaGVpZ2h0LCByYWRpYWxTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIG9wZW5FbmRlZCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnQ29uZUdlb21ldHJ5JztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvbGRzIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzIHRoYXQgaGF2ZSBiZWVuXHJcblx0XHQgKiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBnZW9tZXRyeS4gQW55IG1vZGlmaWNhdGlvblxyXG5cdFx0ICogYWZ0ZXIgaW5zdGFudGlhdGlvbiBkb2VzIG5vdCBjaGFuZ2UgdGhlIGdlb21ldHJ5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucGFyYW1ldGVycyA9IHtcclxuXHRcdFx0cmFkaXVzOiByYWRpdXMsXHJcblx0XHRcdGhlaWdodDogaGVpZ2h0LFxyXG5cdFx0XHRyYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsXHJcblx0XHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cyxcclxuXHRcdFx0b3BlbkVuZGVkOiBvcGVuRW5kZWQsXHJcblx0XHRcdHRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsXHJcblx0XHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxyXG5cdFx0fTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGYWN0b3J5IG1ldGhvZCBmb3IgY3JlYXRpbmcgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBmcm9tIHRoZSBnaXZlblxyXG5cdCAqIEpTT04gb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBBIEpTT04gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc2VyaWFsaXplZCBnZW9tZXRyeS5cclxuXHQgKiBAcmV0dXJuIHtDb25lR2VvbWV0cnl9IEEgbmV3IGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBmcm9tSlNPTiggZGF0YSApIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IENvbmVHZW9tZXRyeSggZGF0YS5yYWRpdXMsIGRhdGEuaGVpZ2h0LCBkYXRhLnJhZGlhbFNlZ21lbnRzLCBkYXRhLmhlaWdodFNlZ21lbnRzLCBkYXRhLm9wZW5FbmRlZCwgZGF0YS50aGV0YVN0YXJ0LCBkYXRhLnRoZXRhTGVuZ3RoICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IENvbmVHZW9tZXRyeSB9O1xyXG4iLCJpbXBvcnQgeyBCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyR2VvbWV0cnkuanMnO1xyXG5pbXBvcnQgeyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uL21hdGgvVmVjdG9yMi5qcyc7XHJcblxyXG4vKipcclxuICogQSBwb2x5aGVkcm9uIGlzIGEgc29saWQgaW4gdGhyZWUgZGltZW5zaW9ucyB3aXRoIGZsYXQgZmFjZXMuIFRoaXMgY2xhc3NcclxuICogd2lsbCB0YWtlIGFuIGFycmF5IG9mIHZlcnRpY2VzLCBwcm9qZWN0IHRoZW0gb250byBhIHNwaGVyZSwgYW5kIHRoZW5cclxuICogZGl2aWRlIHRoZW0gdXAgdG8gdGhlIGRlc2lyZWQgbGV2ZWwgb2YgZGV0YWlsLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQnVmZmVyR2VvbWV0cnlcclxuICovXHJcbmNsYXNzIFBvbHloZWRyb25HZW9tZXRyeSBleHRlbmRzIEJ1ZmZlckdlb21ldHJ5IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBwb2x5aGVkcm9uIGdlb21ldHJ5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBbdmVydGljZXNdIC0gQSBmbGF0IGFycmF5IG9mIHZlcnRpY2VzIGRlc2NyaWJpbmcgdGhlIGJhc2Ugc2hhcGUuXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBbaW5kaWNlc10gLSBBIGZsYXQgYXJyYXkgb2YgaW5kaWNlcyBkZXNjcmliaW5nIHRoZSBiYXNlIHNoYXBlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbcmFkaXVzPTFdIC0gVGhlIHJhZGl1cyBvZiB0aGUgc2hhcGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtkZXRhaWw9MF0gLSBIb3cgbWFueSBsZXZlbHMgdG8gc3ViZGl2aWRlIHRoZSBnZW9tZXRyeS4gVGhlIG1vcmUgZGV0YWlsLCB0aGUgc21vb3RoZXIgdGhlIHNoYXBlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCB2ZXJ0aWNlcyA9IFtdLCBpbmRpY2VzID0gW10sIHJhZGl1cyA9IDEsIGRldGFpbCA9IDAgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnUG9seWhlZHJvbkdlb21ldHJ5JztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvbGRzIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzIHRoYXQgaGF2ZSBiZWVuXHJcblx0XHQgKiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBnZW9tZXRyeS4gQW55IG1vZGlmaWNhdGlvblxyXG5cdFx0ICogYWZ0ZXIgaW5zdGFudGlhdGlvbiBkb2VzIG5vdCBjaGFuZ2UgdGhlIGdlb21ldHJ5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucGFyYW1ldGVycyA9IHtcclxuXHRcdFx0dmVydGljZXM6IHZlcnRpY2VzLFxyXG5cdFx0XHRpbmRpY2VzOiBpbmRpY2VzLFxyXG5cdFx0XHRyYWRpdXM6IHJhZGl1cyxcclxuXHRcdFx0ZGV0YWlsOiBkZXRhaWxcclxuXHRcdH07XHJcblxyXG5cdFx0Ly8gZGVmYXVsdCBidWZmZXIgZGF0YVxyXG5cclxuXHRcdGNvbnN0IHZlcnRleEJ1ZmZlciA9IFtdO1xyXG5cdFx0Y29uc3QgdXZCdWZmZXIgPSBbXTtcclxuXHJcblx0XHQvLyB0aGUgc3ViZGl2aXNpb24gY3JlYXRlcyB0aGUgdmVydGV4IGJ1ZmZlciBkYXRhXHJcblxyXG5cdFx0c3ViZGl2aWRlKCBkZXRhaWwgKTtcclxuXHJcblx0XHQvLyBhbGwgdmVydGljZXMgc2hvdWxkIGxpZSBvbiBhIGNvbmNlcHR1YWwgc3BoZXJlIHdpdGggYSBnaXZlbiByYWRpdXNcclxuXHJcblx0XHRhcHBseVJhZGl1cyggcmFkaXVzICk7XHJcblxyXG5cdFx0Ly8gZmluYWxseSwgY3JlYXRlIHRoZSB1diBkYXRhXHJcblxyXG5cdFx0Z2VuZXJhdGVVVnMoKTtcclxuXHJcblx0XHQvLyBidWlsZCBub24taW5kZXhlZCBnZW9tZXRyeVxyXG5cclxuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGV4QnVmZmVyLCAzICkgKTtcclxuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRleEJ1ZmZlci5zbGljZSgpLCAzICkgKTtcclxuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZCdWZmZXIsIDIgKSApO1xyXG5cclxuXHRcdGlmICggZGV0YWlsID09PSAwICkge1xyXG5cclxuXHRcdFx0dGhpcy5jb21wdXRlVmVydGV4Tm9ybWFscygpOyAvLyBmbGF0IG5vcm1hbHNcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGhpcy5ub3JtYWxpemVOb3JtYWxzKCk7IC8vIHNtb290aCBub3JtYWxzXHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGhlbHBlciBmdW5jdGlvbnNcclxuXHJcblx0XHRmdW5jdGlvbiBzdWJkaXZpZGUoIGRldGFpbCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGEgPSBuZXcgVmVjdG9yMygpO1xyXG5cdFx0XHRjb25zdCBiID0gbmV3IFZlY3RvcjMoKTtcclxuXHRcdFx0Y29uc3QgYyA9IG5ldyBWZWN0b3IzKCk7XHJcblxyXG5cdFx0XHQvLyBpdGVyYXRlIG92ZXIgYWxsIGZhY2VzIGFuZCBhcHBseSBhIHN1YmRpdmlzaW9uIHdpdGggdGhlIGdpdmVuIGRldGFpbCB2YWx1ZVxyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgaW5kaWNlcy5sZW5ndGg7IGkgKz0gMyApIHtcclxuXHJcblx0XHRcdFx0Ly8gZ2V0IHRoZSB2ZXJ0aWNlcyBvZiB0aGUgZmFjZVxyXG5cclxuXHRcdFx0XHRnZXRWZXJ0ZXhCeUluZGV4KCBpbmRpY2VzWyBpICsgMCBdLCBhICk7XHJcblx0XHRcdFx0Z2V0VmVydGV4QnlJbmRleCggaW5kaWNlc1sgaSArIDEgXSwgYiApO1xyXG5cdFx0XHRcdGdldFZlcnRleEJ5SW5kZXgoIGluZGljZXNbIGkgKyAyIF0sIGMgKTtcclxuXHJcblx0XHRcdFx0Ly8gcGVyZm9ybSBzdWJkaXZpc2lvblxyXG5cclxuXHRcdFx0XHRzdWJkaXZpZGVGYWNlKCBhLCBiLCBjLCBkZXRhaWwgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0ZnVuY3Rpb24gc3ViZGl2aWRlRmFjZSggYSwgYiwgYywgZGV0YWlsICkge1xyXG5cclxuXHRcdFx0Y29uc3QgY29scyA9IGRldGFpbCArIDE7XHJcblxyXG5cdFx0XHQvLyB3ZSB1c2UgdGhpcyBtdWx0aWRpbWVuc2lvbmFsIGFycmF5IGFzIGEgZGF0YSBzdHJ1Y3R1cmUgZm9yIGNyZWF0aW5nIHRoZSBzdWJkaXZpc2lvblxyXG5cclxuXHRcdFx0Y29uc3QgdiA9IFtdO1xyXG5cclxuXHRcdFx0Ly8gY29uc3RydWN0IGFsbCBvZiB0aGUgdmVydGljZXMgZm9yIHRoaXMgc3ViZGl2aXNpb25cclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8PSBjb2xzOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHR2WyBpIF0gPSBbXTtcclxuXHJcblx0XHRcdFx0Y29uc3QgYWogPSBhLmNsb25lKCkubGVycCggYywgaSAvIGNvbHMgKTtcclxuXHRcdFx0XHRjb25zdCBiaiA9IGIuY2xvbmUoKS5sZXJwKCBjLCBpIC8gY29scyApO1xyXG5cclxuXHRcdFx0XHRjb25zdCByb3dzID0gY29scyAtIGk7XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBqID0gMDsgaiA8PSByb3dzOyBqICsrICkge1xyXG5cclxuXHRcdFx0XHRcdGlmICggaiA9PT0gMCAmJiBpID09PSBjb2xzICkge1xyXG5cclxuXHRcdFx0XHRcdFx0dlsgaSBdWyBqIF0gPSBhajtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0dlsgaSBdWyBqIF0gPSBhai5jbG9uZSgpLmxlcnAoIGJqLCBqIC8gcm93cyApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gY29uc3RydWN0IGFsbCBvZiB0aGUgZmFjZXNcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGNvbHM7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBqID0gMDsgaiA8IDIgKiAoIGNvbHMgLSBpICkgLSAxOyBqICsrICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGsgPSBNYXRoLmZsb29yKCBqIC8gMiApO1xyXG5cclxuXHRcdFx0XHRcdGlmICggaiAlIDIgPT09IDAgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRwdXNoVmVydGV4KCB2WyBpIF1bIGsgKyAxIF0gKTtcclxuXHRcdFx0XHRcdFx0cHVzaFZlcnRleCggdlsgaSArIDEgXVsgayBdICk7XHJcblx0XHRcdFx0XHRcdHB1c2hWZXJ0ZXgoIHZbIGkgXVsgayBdICk7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdHB1c2hWZXJ0ZXgoIHZbIGkgXVsgayArIDEgXSApO1xyXG5cdFx0XHRcdFx0XHRwdXNoVmVydGV4KCB2WyBpICsgMSBdWyBrICsgMSBdICk7XHJcblx0XHRcdFx0XHRcdHB1c2hWZXJ0ZXgoIHZbIGkgKyAxIF1bIGsgXSApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiBhcHBseVJhZGl1cyggcmFkaXVzICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcclxuXHJcblx0XHRcdC8vIGl0ZXJhdGUgb3ZlciB0aGUgZW50aXJlIGJ1ZmZlciBhbmQgYXBwbHkgdGhlIHJhZGl1cyB0byBlYWNoIHZlcnRleFxyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdmVydGV4QnVmZmVyLmxlbmd0aDsgaSArPSAzICkge1xyXG5cclxuXHRcdFx0XHR2ZXJ0ZXgueCA9IHZlcnRleEJ1ZmZlclsgaSArIDAgXTtcclxuXHRcdFx0XHR2ZXJ0ZXgueSA9IHZlcnRleEJ1ZmZlclsgaSArIDEgXTtcclxuXHRcdFx0XHR2ZXJ0ZXgueiA9IHZlcnRleEJ1ZmZlclsgaSArIDIgXTtcclxuXHJcblx0XHRcdFx0dmVydGV4Lm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKCByYWRpdXMgKTtcclxuXHJcblx0XHRcdFx0dmVydGV4QnVmZmVyWyBpICsgMCBdID0gdmVydGV4Lng7XHJcblx0XHRcdFx0dmVydGV4QnVmZmVyWyBpICsgMSBdID0gdmVydGV4Lnk7XHJcblx0XHRcdFx0dmVydGV4QnVmZmVyWyBpICsgMiBdID0gdmVydGV4Lno7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIGdlbmVyYXRlVVZzKCkge1xyXG5cclxuXHRcdFx0Y29uc3QgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHZlcnRleEJ1ZmZlci5sZW5ndGg7IGkgKz0gMyApIHtcclxuXHJcblx0XHRcdFx0dmVydGV4LnggPSB2ZXJ0ZXhCdWZmZXJbIGkgKyAwIF07XHJcblx0XHRcdFx0dmVydGV4LnkgPSB2ZXJ0ZXhCdWZmZXJbIGkgKyAxIF07XHJcblx0XHRcdFx0dmVydGV4LnogPSB2ZXJ0ZXhCdWZmZXJbIGkgKyAyIF07XHJcblxyXG5cdFx0XHRcdGNvbnN0IHUgPSBhemltdXRoKCB2ZXJ0ZXggKSAvIDIgLyBNYXRoLlBJICsgMC41O1xyXG5cdFx0XHRcdGNvbnN0IHYgPSBpbmNsaW5hdGlvbiggdmVydGV4ICkgLyBNYXRoLlBJICsgMC41O1xyXG5cdFx0XHRcdHV2QnVmZmVyLnB1c2goIHUsIDEgLSB2ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb3JyZWN0VVZzKCk7XHJcblxyXG5cdFx0XHRjb3JyZWN0U2VhbSgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiBjb3JyZWN0U2VhbSgpIHtcclxuXHJcblx0XHRcdC8vIGhhbmRsZSBjYXNlIHdoZW4gZmFjZSBzdHJhZGRsZXMgdGhlIHNlYW0sIHNlZSAjMzI2OVxyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdXZCdWZmZXIubGVuZ3RoOyBpICs9IDYgKSB7XHJcblxyXG5cdFx0XHRcdC8vIHV2IGRhdGEgb2YgYSBzaW5nbGUgZmFjZVxyXG5cclxuXHRcdFx0XHRjb25zdCB4MCA9IHV2QnVmZmVyWyBpICsgMCBdO1xyXG5cdFx0XHRcdGNvbnN0IHgxID0gdXZCdWZmZXJbIGkgKyAyIF07XHJcblx0XHRcdFx0Y29uc3QgeDIgPSB1dkJ1ZmZlclsgaSArIDQgXTtcclxuXHJcblx0XHRcdFx0Y29uc3QgbWF4ID0gTWF0aC5tYXgoIHgwLCB4MSwgeDIgKTtcclxuXHRcdFx0XHRjb25zdCBtaW4gPSBNYXRoLm1pbiggeDAsIHgxLCB4MiApO1xyXG5cclxuXHRcdFx0XHQvLyAwLjkgaXMgc29tZXdoYXQgYXJiaXRyYXJ5XHJcblxyXG5cdFx0XHRcdGlmICggbWF4ID4gMC45ICYmIG1pbiA8IDAuMSApIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIHgwIDwgMC4yICkgdXZCdWZmZXJbIGkgKyAwIF0gKz0gMTtcclxuXHRcdFx0XHRcdGlmICggeDEgPCAwLjIgKSB1dkJ1ZmZlclsgaSArIDIgXSArPSAxO1xyXG5cdFx0XHRcdFx0aWYgKCB4MiA8IDAuMiApIHV2QnVmZmVyWyBpICsgNCBdICs9IDE7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0ZnVuY3Rpb24gcHVzaFZlcnRleCggdmVydGV4ICkge1xyXG5cclxuXHRcdFx0dmVydGV4QnVmZmVyLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0ZnVuY3Rpb24gZ2V0VmVydGV4QnlJbmRleCggaW5kZXgsIHZlcnRleCApIHtcclxuXHJcblx0XHRcdGNvbnN0IHN0cmlkZSA9IGluZGV4ICogMztcclxuXHJcblx0XHRcdHZlcnRleC54ID0gdmVydGljZXNbIHN0cmlkZSArIDAgXTtcclxuXHRcdFx0dmVydGV4LnkgPSB2ZXJ0aWNlc1sgc3RyaWRlICsgMSBdO1xyXG5cdFx0XHR2ZXJ0ZXgueiA9IHZlcnRpY2VzWyBzdHJpZGUgKyAyIF07XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIGNvcnJlY3RVVnMoKSB7XHJcblxyXG5cdFx0XHRjb25zdCBhID0gbmV3IFZlY3RvcjMoKTtcclxuXHRcdFx0Y29uc3QgYiA9IG5ldyBWZWN0b3IzKCk7XHJcblx0XHRcdGNvbnN0IGMgPSBuZXcgVmVjdG9yMygpO1xyXG5cclxuXHRcdFx0Y29uc3QgY2VudHJvaWQgPSBuZXcgVmVjdG9yMygpO1xyXG5cclxuXHRcdFx0Y29uc3QgdXZBID0gbmV3IFZlY3RvcjIoKTtcclxuXHRcdFx0Y29uc3QgdXZCID0gbmV3IFZlY3RvcjIoKTtcclxuXHRcdFx0Y29uc3QgdXZDID0gbmV3IFZlY3RvcjIoKTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMCwgaiA9IDA7IGkgPCB2ZXJ0ZXhCdWZmZXIubGVuZ3RoOyBpICs9IDksIGogKz0gNiApIHtcclxuXHJcblx0XHRcdFx0YS5zZXQoIHZlcnRleEJ1ZmZlclsgaSArIDAgXSwgdmVydGV4QnVmZmVyWyBpICsgMSBdLCB2ZXJ0ZXhCdWZmZXJbIGkgKyAyIF0gKTtcclxuXHRcdFx0XHRiLnNldCggdmVydGV4QnVmZmVyWyBpICsgMyBdLCB2ZXJ0ZXhCdWZmZXJbIGkgKyA0IF0sIHZlcnRleEJ1ZmZlclsgaSArIDUgXSApO1xyXG5cdFx0XHRcdGMuc2V0KCB2ZXJ0ZXhCdWZmZXJbIGkgKyA2IF0sIHZlcnRleEJ1ZmZlclsgaSArIDcgXSwgdmVydGV4QnVmZmVyWyBpICsgOCBdICk7XHJcblxyXG5cdFx0XHRcdHV2QS5zZXQoIHV2QnVmZmVyWyBqICsgMCBdLCB1dkJ1ZmZlclsgaiArIDEgXSApO1xyXG5cdFx0XHRcdHV2Qi5zZXQoIHV2QnVmZmVyWyBqICsgMiBdLCB1dkJ1ZmZlclsgaiArIDMgXSApO1xyXG5cdFx0XHRcdHV2Qy5zZXQoIHV2QnVmZmVyWyBqICsgNCBdLCB1dkJ1ZmZlclsgaiArIDUgXSApO1xyXG5cclxuXHRcdFx0XHRjZW50cm9pZC5jb3B5KCBhICkuYWRkKCBiICkuYWRkKCBjICkuZGl2aWRlU2NhbGFyKCAzICk7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGF6aSA9IGF6aW11dGgoIGNlbnRyb2lkICk7XHJcblxyXG5cdFx0XHRcdGNvcnJlY3RVViggdXZBLCBqICsgMCwgYSwgYXppICk7XHJcblx0XHRcdFx0Y29ycmVjdFVWKCB1dkIsIGogKyAyLCBiLCBhemkgKTtcclxuXHRcdFx0XHRjb3JyZWN0VVYoIHV2QywgaiArIDQsIGMsIGF6aSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiBjb3JyZWN0VVYoIHV2LCBzdHJpZGUsIHZlY3RvciwgYXppbXV0aCApIHtcclxuXHJcblx0XHRcdGlmICggKCBhemltdXRoIDwgMCApICYmICggdXYueCA9PT0gMSApICkge1xyXG5cclxuXHRcdFx0XHR1dkJ1ZmZlclsgc3RyaWRlIF0gPSB1di54IC0gMTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggKCB2ZWN0b3IueCA9PT0gMCApICYmICggdmVjdG9yLnogPT09IDAgKSApIHtcclxuXHJcblx0XHRcdFx0dXZCdWZmZXJbIHN0cmlkZSBdID0gYXppbXV0aCAvIDIgLyBNYXRoLlBJICsgMC41O1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBBbmdsZSBhcm91bmQgdGhlIFkgYXhpcywgY291bnRlci1jbG9ja3dpc2Ugd2hlbiBsb29raW5nIGZyb20gYWJvdmUuXHJcblxyXG5cdFx0ZnVuY3Rpb24gYXppbXV0aCggdmVjdG9yICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIE1hdGguYXRhbjIoIHZlY3Rvci56LCAtIHZlY3Rvci54ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHJcblx0XHQvLyBBbmdsZSBhYm92ZSB0aGUgWFogcGxhbmUuXHJcblxyXG5cdFx0ZnVuY3Rpb24gaW5jbGluYXRpb24oIHZlY3RvciApIHtcclxuXHJcblx0XHRcdHJldHVybiBNYXRoLmF0YW4yKCAtIHZlY3Rvci55LCBNYXRoLnNxcnQoICggdmVjdG9yLnggKiB2ZWN0b3IueCApICsgKCB2ZWN0b3IueiAqIHZlY3Rvci56ICkgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0gT2JqZWN0LmFzc2lnbigge30sIHNvdXJjZS5wYXJhbWV0ZXJzICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRmFjdG9yeSBtZXRob2QgZm9yIGNyZWF0aW5nIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZnJvbSB0aGUgZ2l2ZW5cclxuXHQgKiBKU09OIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gQSBKU09OIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNlcmlhbGl6ZWQgZ2VvbWV0cnkuXHJcblx0ICogQHJldHVybiB7UG9seWhlZHJvbkdlb21ldHJ5fSBBIG5ldyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzdGF0aWMgZnJvbUpTT04oIGRhdGEgKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBQb2x5aGVkcm9uR2VvbWV0cnkoIGRhdGEudmVydGljZXMsIGRhdGEuaW5kaWNlcywgZGF0YS5yYWRpdXMsIGRhdGEuZGV0YWlscyApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBQb2x5aGVkcm9uR2VvbWV0cnkgfTtcclxuIiwiaW1wb3J0IHsgUG9seWhlZHJvbkdlb21ldHJ5IH0gZnJvbSAnLi9Qb2x5aGVkcm9uR2VvbWV0cnkuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgZ2VvbWV0cnkgY2xhc3MgZm9yIHJlcHJlc2VudGluZyBhIGRvZGVjYWhlZHJvbi5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgZ2VvbWV0cnkgPSBuZXcgVEhSRUUuRG9kZWNhaGVkcm9uR2VvbWV0cnkoKTtcclxuICogY29uc3QgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IDB4ZmZmZjAwIH0gKTtcclxuICogY29uc3QgZG9kZWNhaGVkcm9uID0gbmV3IFRIUkVFLk1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG4gKiBzY2VuZS5hZGQoIGRvZGVjYWhlZHJvbiApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIFBvbHloZWRyb25HZW9tZXRyeVxyXG4gKi9cclxuY2xhc3MgRG9kZWNhaGVkcm9uR2VvbWV0cnkgZXh0ZW5kcyBQb2x5aGVkcm9uR2VvbWV0cnkge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGRvZGVjYWhlZHJvbiBnZW9tZXRyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbcmFkaXVzPTFdIC0gUmFkaXVzIG9mIHRoZSBkb2RlY2FoZWRyb24uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtkZXRhaWw9MF0gLSBTZXR0aW5nIHRoaXMgdG8gYSB2YWx1ZSBncmVhdGVyIHRoYW4gYDBgIGFkZHMgdmVydGljZXMgbWFraW5nIGl0IG5vIGxvbmdlciBhIGRvZGVjYWhlZHJvbi5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcmFkaXVzID0gMSwgZGV0YWlsID0gMCApIHtcclxuXHJcblx0XHRjb25zdCB0ID0gKCAxICsgTWF0aC5zcXJ0KCA1ICkgKSAvIDI7XHJcblx0XHRjb25zdCByID0gMSAvIHQ7XHJcblxyXG5cdFx0Y29uc3QgdmVydGljZXMgPSBbXHJcblxyXG5cdFx0XHQvLyAowrExLCDCsTEsIMKxMSlcclxuXHRcdFx0LSAxLCAtIDEsIC0gMSxcdC0gMSwgLSAxLCAxLFxyXG5cdFx0XHQtIDEsIDEsIC0gMSwgLSAxLCAxLCAxLFxyXG5cdFx0XHQxLCAtIDEsIC0gMSwgMSwgLSAxLCAxLFxyXG5cdFx0XHQxLCAxLCAtIDEsIDEsIDEsIDEsXHJcblxyXG5cdFx0XHQvLyAoMCwgwrExL8+GLCDCsc+GKVxyXG5cdFx0XHQwLCAtIHIsIC0gdCwgMCwgLSByLCB0LFxyXG5cdFx0XHQwLCByLCAtIHQsIDAsIHIsIHQsXHJcblxyXG5cdFx0XHQvLyAowrExL8+GLCDCsc+GLCAwKVxyXG5cdFx0XHQtIHIsIC0gdCwgMCwgLSByLCB0LCAwLFxyXG5cdFx0XHRyLCAtIHQsIDAsIHIsIHQsIDAsXHJcblxyXG5cdFx0XHQvLyAowrHPhiwgMCwgwrExL8+GKVxyXG5cdFx0XHQtIHQsIDAsIC0gciwgdCwgMCwgLSByLFxyXG5cdFx0XHQtIHQsIDAsIHIsIHQsIDAsIHJcclxuXHRcdF07XHJcblxyXG5cdFx0Y29uc3QgaW5kaWNlcyA9IFtcclxuXHRcdFx0MywgMTEsIDcsIFx0MywgNywgMTUsIFx0MywgMTUsIDEzLFxyXG5cdFx0XHQ3LCAxOSwgMTcsIFx0NywgMTcsIDYsIFx0NywgNiwgMTUsXHJcblx0XHRcdDE3LCA0LCA4LCBcdDE3LCA4LCAxMCwgXHQxNywgMTAsIDYsXHJcblx0XHRcdDgsIDAsIDE2LCBcdDgsIDE2LCAyLCBcdDgsIDIsIDEwLFxyXG5cdFx0XHQwLCAxMiwgMSwgXHQwLCAxLCAxOCwgXHQwLCAxOCwgMTYsXHJcblx0XHRcdDYsIDEwLCAyLCBcdDYsIDIsIDEzLCBcdDYsIDEzLCAxNSxcclxuXHRcdFx0MiwgMTYsIDE4LCBcdDIsIDE4LCAzLCBcdDIsIDMsIDEzLFxyXG5cdFx0XHQxOCwgMSwgOSwgXHQxOCwgOSwgMTEsIFx0MTgsIDExLCAzLFxyXG5cdFx0XHQ0LCAxNCwgMTIsIFx0NCwgMTIsIDAsIFx0NCwgMCwgOCxcclxuXHRcdFx0MTEsIDksIDUsIFx0MTEsIDUsIDE5LCBcdDExLCAxOSwgNyxcclxuXHRcdFx0MTksIDUsIDE0LCBcdDE5LCAxNCwgNCwgXHQxOSwgNCwgMTcsXHJcblx0XHRcdDEsIDEyLCAxNCwgXHQxLCAxNCwgNSwgXHQxLCA1LCA5XHJcblx0XHRdO1xyXG5cclxuXHRcdHN1cGVyKCB2ZXJ0aWNlcywgaW5kaWNlcywgcmFkaXVzLCBkZXRhaWwgKTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnRG9kZWNhaGVkcm9uR2VvbWV0cnknO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG9sZHMgdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMgdGhhdCBoYXZlIGJlZW5cclxuXHRcdCAqIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGdlb21ldHJ5LiBBbnkgbW9kaWZpY2F0aW9uXHJcblx0XHQgKiBhZnRlciBpbnN0YW50aWF0aW9uIGRvZXMgbm90IGNoYW5nZSB0aGUgZ2VvbWV0cnkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0ge1xyXG5cdFx0XHRyYWRpdXM6IHJhZGl1cyxcclxuXHRcdFx0ZGV0YWlsOiBkZXRhaWxcclxuXHRcdH07XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRmFjdG9yeSBtZXRob2QgZm9yIGNyZWF0aW5nIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZnJvbSB0aGUgZ2l2ZW5cclxuXHQgKiBKU09OIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gQSBKU09OIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNlcmlhbGl6ZWQgZ2VvbWV0cnkuXHJcblx0ICogQHJldHVybiB7RG9kZWNhaGVkcm9uR2VvbWV0cnl9IEEgbmV3IGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBmcm9tSlNPTiggZGF0YSApIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IERvZGVjYWhlZHJvbkdlb21ldHJ5KCBkYXRhLnJhZGl1cywgZGF0YS5kZXRhaWwgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCB7IERvZGVjYWhlZHJvbkdlb21ldHJ5IH07XHJcbiIsImltcG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9CdWZmZXJHZW9tZXRyeS5qcyc7XHJcbmltcG9ydCB7IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcbmltcG9ydCB7IERFRzJSQUQgfSBmcm9tICcuLi9tYXRoL01hdGhVdGlscy5qcyc7XHJcbmltcG9ydCB7IFRyaWFuZ2xlIH0gZnJvbSAnLi4vbWF0aC9UcmlhbmdsZS5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5cclxuY29uc3QgX3YwID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfdjEgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF9ub3JtYWwgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF90cmlhbmdsZSA9IC8qQF9fUFVSRV9fKi8gbmV3IFRyaWFuZ2xlKCk7XHJcblxyXG4vKipcclxuICogQ2FuIGJlIHVzZWQgYXMgYSBoZWxwZXIgb2JqZWN0IHRvIHZpZXcgdGhlIGVkZ2VzIG9mIGEgZ2VvbWV0cnkuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGdlb21ldHJ5ID0gbmV3IFRIUkVFLkJveEdlb21ldHJ5KCk7XHJcbiAqIGNvbnN0IGVkZ2VzID0gbmV3IFRIUkVFLkVkZ2VzR2VvbWV0cnkoIGdlb21ldHJ5ICk7XHJcbiAqIGNvbnN0IGxpbmUgPSBuZXcgVEhSRUUuTGluZVNlZ21lbnRzKCBlZGdlcyApO1xyXG4gKiBzY2VuZS5hZGQoIGxpbmUgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIE5vdGU6IEl0IGlzIG5vdCB5ZXQgcG9zc2libGUgdG8gc2VyaWFsaXplL2Rlc2VyaWFsaXplIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQnVmZmVyR2VvbWV0cnlcclxuICovXHJcbmNsYXNzIEVkZ2VzR2VvbWV0cnkgZXh0ZW5kcyBCdWZmZXJHZW9tZXRyeSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgZWRnZXMgZ2VvbWV0cnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gez9CdWZmZXJHZW9tZXRyeX0gW2dlb21ldHJ5PW51bGxdIC0gVGhlIGdlb21ldHJ5LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbdGhyZXNob2xkQW5nbGU9MV0gLSBBbiBlZGdlIGlzIG9ubHkgcmVuZGVyZWQgaWYgdGhlIGFuZ2xlIChpbiBkZWdyZWVzKVxyXG5cdCAqIGJldHdlZW4gdGhlIGZhY2Ugbm9ybWFscyBvZiB0aGUgYWRqb2luaW5nIGZhY2VzIGV4Y2VlZHMgdGhpcyB2YWx1ZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggZ2VvbWV0cnkgPSBudWxsLCB0aHJlc2hvbGRBbmdsZSA9IDEgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnRWRnZXNHZW9tZXRyeSc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb2xkcyB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVycyB0aGF0IGhhdmUgYmVlblxyXG5cdFx0ICogdXNlZCB0byBnZW5lcmF0ZSB0aGUgZ2VvbWV0cnkuIEFueSBtb2RpZmljYXRpb25cclxuXHRcdCAqIGFmdGVyIGluc3RhbnRpYXRpb24gZG9lcyBub3QgY2hhbmdlIHRoZSBnZW9tZXRyeS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBhcmFtZXRlcnMgPSB7XHJcblx0XHRcdGdlb21ldHJ5OiBnZW9tZXRyeSxcclxuXHRcdFx0dGhyZXNob2xkQW5nbGU6IHRocmVzaG9sZEFuZ2xlXHJcblx0XHR9O1xyXG5cclxuXHRcdGlmICggZ2VvbWV0cnkgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBwcmVjaXNpb25Qb2ludHMgPSA0O1xyXG5cdFx0XHRjb25zdCBwcmVjaXNpb24gPSBNYXRoLnBvdyggMTAsIHByZWNpc2lvblBvaW50cyApO1xyXG5cdFx0XHRjb25zdCB0aHJlc2hvbGREb3QgPSBNYXRoLmNvcyggREVHMlJBRCAqIHRocmVzaG9sZEFuZ2xlICk7XHJcblxyXG5cdFx0XHRjb25zdCBpbmRleEF0dHIgPSBnZW9tZXRyeS5nZXRJbmRleCgpO1xyXG5cdFx0XHRjb25zdCBwb3NpdGlvbkF0dHIgPSBnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKTtcclxuXHRcdFx0Y29uc3QgaW5kZXhDb3VudCA9IGluZGV4QXR0ciA/IGluZGV4QXR0ci5jb3VudCA6IHBvc2l0aW9uQXR0ci5jb3VudDtcclxuXHJcblx0XHRcdGNvbnN0IGluZGV4QXJyID0gWyAwLCAwLCAwIF07XHJcblx0XHRcdGNvbnN0IHZlcnRLZXlzID0gWyAnYScsICdiJywgJ2MnIF07XHJcblx0XHRcdGNvbnN0IGhhc2hlcyA9IG5ldyBBcnJheSggMyApO1xyXG5cclxuXHRcdFx0Y29uc3QgZWRnZURhdGEgPSB7fTtcclxuXHRcdFx0Y29uc3QgdmVydGljZXMgPSBbXTtcclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgaW5kZXhDb3VudDsgaSArPSAzICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIGluZGV4QXR0ciApIHtcclxuXHJcblx0XHRcdFx0XHRpbmRleEFyclsgMCBdID0gaW5kZXhBdHRyLmdldFgoIGkgKTtcclxuXHRcdFx0XHRcdGluZGV4QXJyWyAxIF0gPSBpbmRleEF0dHIuZ2V0WCggaSArIDEgKTtcclxuXHRcdFx0XHRcdGluZGV4QXJyWyAyIF0gPSBpbmRleEF0dHIuZ2V0WCggaSArIDIgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRpbmRleEFyclsgMCBdID0gaTtcclxuXHRcdFx0XHRcdGluZGV4QXJyWyAxIF0gPSBpICsgMTtcclxuXHRcdFx0XHRcdGluZGV4QXJyWyAyIF0gPSBpICsgMjtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRjb25zdCB7IGEsIGIsIGMgfSA9IF90cmlhbmdsZTtcclxuXHRcdFx0XHRhLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uQXR0ciwgaW5kZXhBcnJbIDAgXSApO1xyXG5cdFx0XHRcdGIuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyLCBpbmRleEFyclsgMSBdICk7XHJcblx0XHRcdFx0Yy5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbkF0dHIsIGluZGV4QXJyWyAyIF0gKTtcclxuXHRcdFx0XHRfdHJpYW5nbGUuZ2V0Tm9ybWFsKCBfbm9ybWFsICk7XHJcblxyXG5cdFx0XHRcdC8vIGNyZWF0ZSBoYXNoZXMgZm9yIHRoZSBlZGdlIGZyb20gdGhlIHZlcnRpY2VzXHJcblx0XHRcdFx0aGFzaGVzWyAwIF0gPSBgJHsgTWF0aC5yb3VuZCggYS54ICogcHJlY2lzaW9uICkgfSwkeyBNYXRoLnJvdW5kKCBhLnkgKiBwcmVjaXNpb24gKSB9LCR7IE1hdGgucm91bmQoIGEueiAqIHByZWNpc2lvbiApIH1gO1xyXG5cdFx0XHRcdGhhc2hlc1sgMSBdID0gYCR7IE1hdGgucm91bmQoIGIueCAqIHByZWNpc2lvbiApIH0sJHsgTWF0aC5yb3VuZCggYi55ICogcHJlY2lzaW9uICkgfSwkeyBNYXRoLnJvdW5kKCBiLnogKiBwcmVjaXNpb24gKSB9YDtcclxuXHRcdFx0XHRoYXNoZXNbIDIgXSA9IGAkeyBNYXRoLnJvdW5kKCBjLnggKiBwcmVjaXNpb24gKSB9LCR7IE1hdGgucm91bmQoIGMueSAqIHByZWNpc2lvbiApIH0sJHsgTWF0aC5yb3VuZCggYy56ICogcHJlY2lzaW9uICkgfWA7XHJcblxyXG5cdFx0XHRcdC8vIHNraXAgZGVnZW5lcmF0ZSB0cmlhbmdsZXNcclxuXHRcdFx0XHRpZiAoIGhhc2hlc1sgMCBdID09PSBoYXNoZXNbIDEgXSB8fCBoYXNoZXNbIDEgXSA9PT0gaGFzaGVzWyAyIF0gfHwgaGFzaGVzWyAyIF0gPT09IGhhc2hlc1sgMCBdICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnRpbnVlO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8vIGl0ZXJhdGUgb3ZlciBldmVyeSBlZGdlXHJcblx0XHRcdFx0Zm9yICggbGV0IGogPSAwOyBqIDwgMzsgaiArKyApIHtcclxuXHJcblx0XHRcdFx0XHQvLyBnZXQgdGhlIGZpcnN0IGFuZCBuZXh0IHZlcnRleCBtYWtpbmcgdXAgdGhlIGVkZ2VcclxuXHRcdFx0XHRcdGNvbnN0IGpOZXh0ID0gKCBqICsgMSApICUgMztcclxuXHRcdFx0XHRcdGNvbnN0IHZlY0hhc2gwID0gaGFzaGVzWyBqIF07XHJcblx0XHRcdFx0XHRjb25zdCB2ZWNIYXNoMSA9IGhhc2hlc1sgak5leHQgXTtcclxuXHRcdFx0XHRcdGNvbnN0IHYwID0gX3RyaWFuZ2xlWyB2ZXJ0S2V5c1sgaiBdIF07XHJcblx0XHRcdFx0XHRjb25zdCB2MSA9IF90cmlhbmdsZVsgdmVydEtleXNbIGpOZXh0IF0gXTtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBoYXNoID0gYCR7IHZlY0hhc2gwIH1fJHsgdmVjSGFzaDEgfWA7XHJcblx0XHRcdFx0XHRjb25zdCByZXZlcnNlSGFzaCA9IGAkeyB2ZWNIYXNoMSB9XyR7IHZlY0hhc2gwIH1gO1xyXG5cclxuXHRcdFx0XHRcdGlmICggcmV2ZXJzZUhhc2ggaW4gZWRnZURhdGEgJiYgZWRnZURhdGFbIHJldmVyc2VIYXNoIF0gKSB7XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBpZiB3ZSBmb3VuZCBhIHNpYmxpbmcgZWRnZSBhZGQgaXQgaW50byB0aGUgdmVydGV4IGFycmF5IGlmXHJcblx0XHRcdFx0XHRcdC8vIGl0IG1lZXRzIHRoZSBhbmdsZSB0aHJlc2hvbGQgYW5kIGRlbGV0ZSB0aGUgZWRnZSBmcm9tIHRoZSBtYXAuXHJcblx0XHRcdFx0XHRcdGlmICggX25vcm1hbC5kb3QoIGVkZ2VEYXRhWyByZXZlcnNlSGFzaCBdLm5vcm1hbCApIDw9IHRocmVzaG9sZERvdCApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0dmVydGljZXMucHVzaCggdjAueCwgdjAueSwgdjAueiApO1xyXG5cdFx0XHRcdFx0XHRcdHZlcnRpY2VzLnB1c2goIHYxLngsIHYxLnksIHYxLnogKTtcclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdGVkZ2VEYXRhWyByZXZlcnNlSGFzaCBdID0gbnVsbDtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKCAhICggaGFzaCBpbiBlZGdlRGF0YSApICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Ly8gaWYgd2UndmUgYWxyZWFkeSBnb3QgYW4gZWRnZSBoZXJlIHRoZW4gc2tpcCBhZGRpbmcgYSBuZXcgb25lXHJcblx0XHRcdFx0XHRcdGVkZ2VEYXRhWyBoYXNoIF0gPSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGluZGV4MDogaW5kZXhBcnJbIGogXSxcclxuXHRcdFx0XHRcdFx0XHRpbmRleDE6IGluZGV4QXJyWyBqTmV4dCBdLFxyXG5cdFx0XHRcdFx0XHRcdG5vcm1hbDogX25vcm1hbC5jbG9uZSgpLFxyXG5cclxuXHRcdFx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIGl0ZXJhdGUgb3ZlciBhbGwgcmVtYWluaW5nLCB1bm1hdGNoZWQgZWRnZXMgYW5kIGFkZCB0aGVtIHRvIHRoZSB2ZXJ0ZXggYXJyYXlcclxuXHRcdFx0Zm9yICggY29uc3Qga2V5IGluIGVkZ2VEYXRhICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIGVkZ2VEYXRhWyBrZXkgXSApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCB7IGluZGV4MCwgaW5kZXgxIH0gPSBlZGdlRGF0YVsga2V5IF07XHJcblx0XHRcdFx0XHRfdjAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyLCBpbmRleDAgKTtcclxuXHRcdFx0XHRcdF92MS5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbkF0dHIsIGluZGV4MSApO1xyXG5cclxuXHRcdFx0XHRcdHZlcnRpY2VzLnB1c2goIF92MC54LCBfdjAueSwgX3YwLnogKTtcclxuXHRcdFx0XHRcdHZlcnRpY2VzLnB1c2goIF92MS54LCBfdjEueSwgX3YxLnogKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLnBhcmFtZXRlcnMgPSBPYmplY3QuYXNzaWduKCB7fSwgc291cmNlLnBhcmFtZXRlcnMgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgRWRnZXNHZW9tZXRyeSB9O1xyXG4iLCJpbXBvcnQgeyBQYXRoIH0gZnJvbSAnLi9QYXRoLmpzJztcclxuaW1wb3J0IHsgZ2VuZXJhdGVVVUlEIH0gZnJvbSAnLi4vLi4vbWF0aC9NYXRoVXRpbHMuanMnO1xyXG5cclxuLyoqXHJcbiAqIERlZmluZXMgYW4gYXJiaXRyYXJ5IDJkIHNoYXBlIHBsYW5lIHVzaW5nIHBhdGhzIHdpdGggb3B0aW9uYWwgaG9sZXMuIEl0XHJcbiAqIGNhbiBiZSB1c2VkIHdpdGgge0BsaW5rIEV4dHJ1ZGVHZW9tZXRyeX0sIHtAbGluayBTaGFwZUdlb21ldHJ5fSwgdG8gZ2V0XHJcbiAqIHBvaW50cywgb3IgdG8gZ2V0IHRyaWFuZ3VsYXRlZCBmYWNlcy5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgaGVhcnRTaGFwZSA9IG5ldyBUSFJFRS5TaGFwZSgpO1xyXG4gKlxyXG4gKiBoZWFydFNoYXBlLm1vdmVUbyggMjUsIDI1ICk7XHJcbiAqIGhlYXJ0U2hhcGUuYmV6aWVyQ3VydmVUbyggMjUsIDI1LCAyMCwgMCwgMCwgMCApO1xyXG4gKiBoZWFydFNoYXBlLmJlemllckN1cnZlVG8oIC0gMzAsIDAsIC0gMzAsIDM1LCAtIDMwLCAzNSApO1xyXG4gKiBoZWFydFNoYXBlLmJlemllckN1cnZlVG8oIC0gMzAsIDU1LCAtIDEwLCA3NywgMjUsIDk1ICk7XHJcbiAqIGhlYXJ0U2hhcGUuYmV6aWVyQ3VydmVUbyggNjAsIDc3LCA4MCwgNTUsIDgwLCAzNSApO1xyXG4gKiBoZWFydFNoYXBlLmJlemllckN1cnZlVG8oIDgwLCAzNSwgODAsIDAsIDUwLCAwICk7XHJcbiAqIGhlYXJ0U2hhcGUuYmV6aWVyQ3VydmVUbyggMzUsIDAsIDI1LCAyNSwgMjUsIDI1ICk7XHJcbiAqXHJcbiAqIGNvbnN0IGV4dHJ1ZGVTZXR0aW5ncyA9IHtcclxuICogXHRkZXB0aDogOCxcclxuICogXHRiZXZlbEVuYWJsZWQ6IHRydWUsXHJcbiAqIFx0YmV2ZWxTZWdtZW50czogMixcclxuICogXHRzdGVwczogMixcclxuICogXHRiZXZlbFNpemU6IDEsXHJcbiAqIFx0YmV2ZWxUaGlja25lc3M6IDFcclxuICogfTtcclxuICpcclxuICogY29uc3QgZ2VvbWV0cnkgPSBuZXcgVEhSRUUuRXh0cnVkZUdlb21ldHJ5KCBoZWFydFNoYXBlLCBleHRydWRlU2V0dGluZ3MgKTtcclxuICogY29uc3QgbWVzaCA9IG5ldyBUSFJFRS5NZXNoKCBnZW9tZXRyeSwgbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKCkgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBQYXRoXHJcbiAqL1xyXG5jbGFzcyBTaGFwZSBleHRlbmRzIFBhdGgge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHNoYXBlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxWZWN0b3IyPn0gW3BvaW50c10gLSBBbiBhcnJheSBvZiAyRCBwb2ludHMgZGVmaW5pbmcgdGhlIHNoYXBlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwb2ludHMgKSB7XHJcblxyXG5cdFx0c3VwZXIoIHBvaW50cyApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIFVVSUQgb2YgdGhlIHNoYXBlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51dWlkID0gZ2VuZXJhdGVVVUlEKCk7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ1NoYXBlJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgdGhlIGhvbGVzIGluIHRoZSBzaGFwZS4gSG9sZSBkZWZpbml0aW9ucyBtdXN0IHVzZSB0aGVcclxuXHRcdCAqIG9wcG9zaXRlIHdpbmRpbmcgb3JkZXIgKENXL0NDVykgdGhhbiB0aGUgb3V0ZXIgc2hhcGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PFBhdGg+fVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaG9sZXMgPSBbXTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGFuIGFycmF5IHJlcHJlc2VudGluZyBlYWNoIGNvbnRvdXIgb2YgdGhlIGhvbGVzXHJcblx0ICogYXMgYSBsaXN0IG9mIDJEIHBvaW50cy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBkaXZpc2lvbnMgLSBUaGUgZmluZW5lc3Mgb2YgdGhlIHJlc3VsdC5cclxuXHQgKiBAcmV0dXJuIHtBcnJheTxBcnJheTxWZWN0b3IyPj59IFRoZSBob2xlcyBhcyBhIHNlcmllcyBvZiAyRCBwb2ludHMuXHJcblx0ICovXHJcblx0Z2V0UG9pbnRzSG9sZXMoIGRpdmlzaW9ucyApIHtcclxuXHJcblx0XHRjb25zdCBob2xlc1B0cyA9IFtdO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHRoaXMuaG9sZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGhvbGVzUHRzWyBpIF0gPSB0aGlzLmhvbGVzWyBpIF0uZ2V0UG9pbnRzKCBkaXZpc2lvbnMgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGhvbGVzUHRzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vIGdldCBwb2ludHMgb2Ygc2hhcGUgYW5kIGhvbGVzIChrZXlwb2ludHMgYmFzZWQgb24gc2VnbWVudHMgcGFyYW1ldGVyKVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGFuIG9iamVjdCB0aGF0IGhvbGRzIGNvbnRvdXIgZGF0YSBmb3IgdGhlIHNoYXBlIGFuZCBpdHMgaG9sZXMgYXNcclxuXHQgKiBhcnJheXMgb2YgMkQgcG9pbnRzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGRpdmlzaW9ucyAtIFRoZSBmaW5lbmVzcyBvZiB0aGUgcmVzdWx0LlxyXG5cdCAqIEByZXR1cm4ge3tzaGFwZTpBcnJheTxWZWN0b3IyPixob2xlczpBcnJheTxBcnJheTxWZWN0b3IyPj59fSBBbiBvYmplY3Qgd2l0aCBjb250b3VyIGRhdGEuXHJcblx0ICovXHJcblx0ZXh0cmFjdFBvaW50cyggZGl2aXNpb25zICkge1xyXG5cclxuXHRcdHJldHVybiB7XHJcblxyXG5cdFx0XHRzaGFwZTogdGhpcy5nZXRQb2ludHMoIGRpdmlzaW9ucyApLFxyXG5cdFx0XHRob2xlczogdGhpcy5nZXRQb2ludHNIb2xlcyggZGl2aXNpb25zIClcclxuXHJcblx0XHR9O1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLmhvbGVzID0gW107XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gc291cmNlLmhvbGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBob2xlID0gc291cmNlLmhvbGVzWyBpIF07XHJcblxyXG5cdFx0XHR0aGlzLmhvbGVzLnB1c2goIGhvbGUuY2xvbmUoKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHR0b0pTT04oKSB7XHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IHN1cGVyLnRvSlNPTigpO1xyXG5cclxuXHRcdGRhdGEudXVpZCA9IHRoaXMudXVpZDtcclxuXHRcdGRhdGEuaG9sZXMgPSBbXTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSB0aGlzLmhvbGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBob2xlID0gdGhpcy5ob2xlc1sgaSBdO1xyXG5cdFx0XHRkYXRhLmhvbGVzLnB1c2goIGhvbGUudG9KU09OKCkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGRhdGE7XHJcblxyXG5cdH1cclxuXHJcblx0ZnJvbUpTT04oIGpzb24gKSB7XHJcblxyXG5cdFx0c3VwZXIuZnJvbUpTT04oIGpzb24gKTtcclxuXHJcblx0XHR0aGlzLnV1aWQgPSBqc29uLnV1aWQ7XHJcblx0XHR0aGlzLmhvbGVzID0gW107XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0ganNvbi5ob2xlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgaG9sZSA9IGpzb24uaG9sZXNbIGkgXTtcclxuXHRcdFx0dGhpcy5ob2xlcy5wdXNoKCBuZXcgUGF0aCgpLmZyb21KU09OKCBob2xlICkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBTaGFwZSB9O1xyXG4iLCIvKiBlc2xpbnQtZGlzYWJsZSAqL1xyXG4vLyBjb3B5IG9mIG1hcGJveC9lYXJjdXQgdmVyc2lvbiAzLjAuMVxyXG4vLyBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L2VhcmN1dC90cmVlL3YzLjAuMVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZWFyY3V0KGRhdGEsIGhvbGVJbmRpY2VzLCBkaW0gPSAyKSB7XHJcblxyXG4gICAgY29uc3QgaGFzSG9sZXMgPSBob2xlSW5kaWNlcyAmJiBob2xlSW5kaWNlcy5sZW5ndGg7XHJcbiAgICBjb25zdCBvdXRlckxlbiA9IGhhc0hvbGVzID8gaG9sZUluZGljZXNbMF0gKiBkaW0gOiBkYXRhLmxlbmd0aDtcclxuICAgIGxldCBvdXRlck5vZGUgPSBsaW5rZWRMaXN0KGRhdGEsIDAsIG91dGVyTGVuLCBkaW0sIHRydWUpO1xyXG4gICAgY29uc3QgdHJpYW5nbGVzID0gW107XHJcblxyXG4gICAgaWYgKCFvdXRlck5vZGUgfHwgb3V0ZXJOb2RlLm5leHQgPT09IG91dGVyTm9kZS5wcmV2KSByZXR1cm4gdHJpYW5nbGVzO1xyXG5cclxuICAgIGxldCBtaW5YLCBtaW5ZLCBpbnZTaXplO1xyXG5cclxuICAgIGlmIChoYXNIb2xlcykgb3V0ZXJOb2RlID0gZWxpbWluYXRlSG9sZXMoZGF0YSwgaG9sZUluZGljZXMsIG91dGVyTm9kZSwgZGltKTtcclxuXHJcbiAgICAvLyBpZiB0aGUgc2hhcGUgaXMgbm90IHRvbyBzaW1wbGUsIHdlJ2xsIHVzZSB6LW9yZGVyIGN1cnZlIGhhc2ggbGF0ZXI7IGNhbGN1bGF0ZSBwb2x5Z29uIGJib3hcclxuICAgIGlmIChkYXRhLmxlbmd0aCA+IDgwICogZGltKSB7XHJcbiAgICAgICAgbWluWCA9IEluZmluaXR5O1xyXG4gICAgICAgIG1pblkgPSBJbmZpbml0eTtcclxuICAgICAgICBsZXQgbWF4WCA9IC1JbmZpbml0eTtcclxuICAgICAgICBsZXQgbWF4WSA9IC1JbmZpbml0eTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IGRpbTsgaSA8IG91dGVyTGVuOyBpICs9IGRpbSkge1xyXG4gICAgICAgICAgICBjb25zdCB4ID0gZGF0YVtpXTtcclxuICAgICAgICAgICAgY29uc3QgeSA9IGRhdGFbaSArIDFdO1xyXG4gICAgICAgICAgICBpZiAoeCA8IG1pblgpIG1pblggPSB4O1xyXG4gICAgICAgICAgICBpZiAoeSA8IG1pblkpIG1pblkgPSB5O1xyXG4gICAgICAgICAgICBpZiAoeCA+IG1heFgpIG1heFggPSB4O1xyXG4gICAgICAgICAgICBpZiAoeSA+IG1heFkpIG1heFkgPSB5O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gbWluWCwgbWluWSBhbmQgaW52U2l6ZSBhcmUgbGF0ZXIgdXNlZCB0byB0cmFuc2Zvcm0gY29vcmRzIGludG8gaW50ZWdlcnMgZm9yIHotb3JkZXIgY2FsY3VsYXRpb25cclxuICAgICAgICBpbnZTaXplID0gTWF0aC5tYXgobWF4WCAtIG1pblgsIG1heFkgLSBtaW5ZKTtcclxuICAgICAgICBpbnZTaXplID0gaW52U2l6ZSAhPT0gMCA/IDMyNzY3IC8gaW52U2l6ZSA6IDA7XHJcbiAgICB9XHJcblxyXG4gICAgZWFyY3V0TGlua2VkKG91dGVyTm9kZSwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUsIDApO1xyXG5cclxuICAgIHJldHVybiB0cmlhbmdsZXM7XHJcbn1cclxuXHJcbi8vIGNyZWF0ZSBhIGNpcmN1bGFyIGRvdWJseSBsaW5rZWQgbGlzdCBmcm9tIHBvbHlnb24gcG9pbnRzIGluIHRoZSBzcGVjaWZpZWQgd2luZGluZyBvcmRlclxyXG5mdW5jdGlvbiBsaW5rZWRMaXN0KGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSwgY2xvY2t3aXNlKSB7XHJcbiAgICBsZXQgbGFzdDtcclxuXHJcbiAgICBpZiAoY2xvY2t3aXNlID09PSAoc2lnbmVkQXJlYShkYXRhLCBzdGFydCwgZW5kLCBkaW0pID4gMCkpIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgKz0gZGltKSBsYXN0ID0gaW5zZXJ0Tm9kZShpIC8gZGltIHwgMCwgZGF0YVtpXSwgZGF0YVtpICsgMV0sIGxhc3QpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gZW5kIC0gZGltOyBpID49IHN0YXJ0OyBpIC09IGRpbSkgbGFzdCA9IGluc2VydE5vZGUoaSAvIGRpbSB8IDAsIGRhdGFbaV0sIGRhdGFbaSArIDFdLCBsYXN0KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAobGFzdCAmJiBlcXVhbHMobGFzdCwgbGFzdC5uZXh0KSkge1xyXG4gICAgICAgIHJlbW92ZU5vZGUobGFzdCk7XHJcbiAgICAgICAgbGFzdCA9IGxhc3QubmV4dDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbGFzdDtcclxufVxyXG5cclxuLy8gZWxpbWluYXRlIGNvbGluZWFyIG9yIGR1cGxpY2F0ZSBwb2ludHNcclxuZnVuY3Rpb24gZmlsdGVyUG9pbnRzKHN0YXJ0LCBlbmQpIHtcclxuICAgIGlmICghc3RhcnQpIHJldHVybiBzdGFydDtcclxuICAgIGlmICghZW5kKSBlbmQgPSBzdGFydDtcclxuXHJcbiAgICBsZXQgcCA9IHN0YXJ0LFxyXG4gICAgICAgIGFnYWluO1xyXG4gICAgZG8ge1xyXG4gICAgICAgIGFnYWluID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmICghcC5zdGVpbmVyICYmIChlcXVhbHMocCwgcC5uZXh0KSB8fCBhcmVhKHAucHJldiwgcCwgcC5uZXh0KSA9PT0gMCkpIHtcclxuICAgICAgICAgICAgcmVtb3ZlTm9kZShwKTtcclxuICAgICAgICAgICAgcCA9IGVuZCA9IHAucHJldjtcclxuICAgICAgICAgICAgaWYgKHAgPT09IHAubmV4dCkgYnJlYWs7XHJcbiAgICAgICAgICAgIGFnYWluID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcCA9IHAubmV4dDtcclxuICAgICAgICB9XHJcbiAgICB9IHdoaWxlIChhZ2FpbiB8fCBwICE9PSBlbmQpO1xyXG5cclxuICAgIHJldHVybiBlbmQ7XHJcbn1cclxuXHJcbi8vIG1haW4gZWFyIHNsaWNpbmcgbG9vcCB3aGljaCB0cmlhbmd1bGF0ZXMgYSBwb2x5Z29uIChnaXZlbiBhcyBhIGxpbmtlZCBsaXN0KVxyXG5mdW5jdGlvbiBlYXJjdXRMaW5rZWQoZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSwgcGFzcykge1xyXG4gICAgaWYgKCFlYXIpIHJldHVybjtcclxuXHJcbiAgICAvLyBpbnRlcmxpbmsgcG9seWdvbiBub2RlcyBpbiB6LW9yZGVyXHJcbiAgICBpZiAoIXBhc3MgJiYgaW52U2l6ZSkgaW5kZXhDdXJ2ZShlYXIsIG1pblgsIG1pblksIGludlNpemUpO1xyXG5cclxuICAgIGxldCBzdG9wID0gZWFyO1xyXG5cclxuICAgIC8vIGl0ZXJhdGUgdGhyb3VnaCBlYXJzLCBzbGljaW5nIHRoZW0gb25lIGJ5IG9uZVxyXG4gICAgd2hpbGUgKGVhci5wcmV2ICE9PSBlYXIubmV4dCkge1xyXG4gICAgICAgIGNvbnN0IHByZXYgPSBlYXIucHJldjtcclxuICAgICAgICBjb25zdCBuZXh0ID0gZWFyLm5leHQ7XHJcblxyXG4gICAgICAgIGlmIChpbnZTaXplID8gaXNFYXJIYXNoZWQoZWFyLCBtaW5YLCBtaW5ZLCBpbnZTaXplKSA6IGlzRWFyKGVhcikpIHtcclxuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2gocHJldi5pLCBlYXIuaSwgbmV4dC5pKTsgLy8gY3V0IG9mZiB0aGUgdHJpYW5nbGVcclxuXHJcbiAgICAgICAgICAgIHJlbW92ZU5vZGUoZWFyKTtcclxuXHJcbiAgICAgICAgICAgIC8vIHNraXBwaW5nIHRoZSBuZXh0IHZlcnRleCBsZWFkcyB0byBsZXNzIHNsaXZlciB0cmlhbmdsZXNcclxuICAgICAgICAgICAgZWFyID0gbmV4dC5uZXh0O1xyXG4gICAgICAgICAgICBzdG9wID0gbmV4dC5uZXh0O1xyXG5cclxuICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBlYXIgPSBuZXh0O1xyXG5cclxuICAgICAgICAvLyBpZiB3ZSBsb29wZWQgdGhyb3VnaCB0aGUgd2hvbGUgcmVtYWluaW5nIHBvbHlnb24gYW5kIGNhbid0IGZpbmQgYW55IG1vcmUgZWFyc1xyXG4gICAgICAgIGlmIChlYXIgPT09IHN0b3ApIHtcclxuICAgICAgICAgICAgLy8gdHJ5IGZpbHRlcmluZyBwb2ludHMgYW5kIHNsaWNpbmcgYWdhaW5cclxuICAgICAgICAgICAgaWYgKCFwYXNzKSB7XHJcbiAgICAgICAgICAgICAgICBlYXJjdXRMaW5rZWQoZmlsdGVyUG9pbnRzKGVhciksIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplLCAxKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGlmIHRoaXMgZGlkbid0IHdvcmssIHRyeSBjdXJpbmcgYWxsIHNtYWxsIHNlbGYtaW50ZXJzZWN0aW9ucyBsb2NhbGx5XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFzcyA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgZWFyID0gY3VyZUxvY2FsSW50ZXJzZWN0aW9ucyhmaWx0ZXJQb2ludHMoZWFyKSwgdHJpYW5nbGVzKTtcclxuICAgICAgICAgICAgICAgIGVhcmN1dExpbmtlZChlYXIsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplLCAyKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGFzIGEgbGFzdCByZXNvcnQsIHRyeSBzcGxpdHRpbmcgdGhlIHJlbWFpbmluZyBwb2x5Z29uIGludG8gdHdvXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFzcyA9PT0gMikge1xyXG4gICAgICAgICAgICAgICAgc3BsaXRFYXJjdXQoZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuLy8gY2hlY2sgd2hldGhlciBhIHBvbHlnb24gbm9kZSBmb3JtcyBhIHZhbGlkIGVhciB3aXRoIGFkamFjZW50IG5vZGVzXHJcbmZ1bmN0aW9uIGlzRWFyKGVhcikge1xyXG4gICAgY29uc3QgYSA9IGVhci5wcmV2LFxyXG4gICAgICAgIGIgPSBlYXIsXHJcbiAgICAgICAgYyA9IGVhci5uZXh0O1xyXG5cclxuICAgIGlmIChhcmVhKGEsIGIsIGMpID49IDApIHJldHVybiBmYWxzZTsgLy8gcmVmbGV4LCBjYW4ndCBiZSBhbiBlYXJcclxuXHJcbiAgICAvLyBub3cgbWFrZSBzdXJlIHdlIGRvbid0IGhhdmUgb3RoZXIgcG9pbnRzIGluc2lkZSB0aGUgcG90ZW50aWFsIGVhclxyXG4gICAgY29uc3QgYXggPSBhLngsIGJ4ID0gYi54LCBjeCA9IGMueCwgYXkgPSBhLnksIGJ5ID0gYi55LCBjeSA9IGMueTtcclxuXHJcbiAgICAvLyB0cmlhbmdsZSBiYm94XHJcbiAgICBjb25zdCB4MCA9IE1hdGgubWluKGF4LCBieCwgY3gpLFxyXG4gICAgICAgIHkwID0gTWF0aC5taW4oYXksIGJ5LCBjeSksXHJcbiAgICAgICAgeDEgPSBNYXRoLm1heChheCwgYngsIGN4KSxcclxuICAgICAgICB5MSA9IE1hdGgubWF4KGF5LCBieSwgY3kpO1xyXG5cclxuICAgIGxldCBwID0gYy5uZXh0O1xyXG4gICAgd2hpbGUgKHAgIT09IGEpIHtcclxuICAgICAgICBpZiAocC54ID49IHgwICYmIHAueCA8PSB4MSAmJiBwLnkgPj0geTAgJiYgcC55IDw9IHkxICYmXHJcbiAgICAgICAgICAgIHBvaW50SW5UcmlhbmdsZUV4Y2VwdEZpcnN0KGF4LCBheSwgYngsIGJ5LCBjeCwgY3ksIHAueCwgcC55KSAmJlxyXG4gICAgICAgICAgICBhcmVhKHAucHJldiwgcCwgcC5uZXh0KSA+PSAwKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgcCA9IHAubmV4dDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxufVxyXG5cclxuZnVuY3Rpb24gaXNFYXJIYXNoZWQoZWFyLCBtaW5YLCBtaW5ZLCBpbnZTaXplKSB7XHJcbiAgICBjb25zdCBhID0gZWFyLnByZXYsXHJcbiAgICAgICAgYiA9IGVhcixcclxuICAgICAgICBjID0gZWFyLm5leHQ7XHJcblxyXG4gICAgaWYgKGFyZWEoYSwgYiwgYykgPj0gMCkgcmV0dXJuIGZhbHNlOyAvLyByZWZsZXgsIGNhbid0IGJlIGFuIGVhclxyXG5cclxuICAgIGNvbnN0IGF4ID0gYS54LCBieCA9IGIueCwgY3ggPSBjLngsIGF5ID0gYS55LCBieSA9IGIueSwgY3kgPSBjLnk7XHJcblxyXG4gICAgLy8gdHJpYW5nbGUgYmJveFxyXG4gICAgY29uc3QgeDAgPSBNYXRoLm1pbihheCwgYngsIGN4KSxcclxuICAgICAgICB5MCA9IE1hdGgubWluKGF5LCBieSwgY3kpLFxyXG4gICAgICAgIHgxID0gTWF0aC5tYXgoYXgsIGJ4LCBjeCksXHJcbiAgICAgICAgeTEgPSBNYXRoLm1heChheSwgYnksIGN5KTtcclxuXHJcbiAgICAvLyB6LW9yZGVyIHJhbmdlIGZvciB0aGUgY3VycmVudCB0cmlhbmdsZSBiYm94O1xyXG4gICAgY29uc3QgbWluWiA9IHpPcmRlcih4MCwgeTAsIG1pblgsIG1pblksIGludlNpemUpLFxyXG4gICAgICAgIG1heFogPSB6T3JkZXIoeDEsIHkxLCBtaW5YLCBtaW5ZLCBpbnZTaXplKTtcclxuXHJcbiAgICBsZXQgcCA9IGVhci5wcmV2WixcclxuICAgICAgICBuID0gZWFyLm5leHRaO1xyXG5cclxuICAgIC8vIGxvb2sgZm9yIHBvaW50cyBpbnNpZGUgdGhlIHRyaWFuZ2xlIGluIGJvdGggZGlyZWN0aW9uc1xyXG4gICAgd2hpbGUgKHAgJiYgcC56ID49IG1pblogJiYgbiAmJiBuLnogPD0gbWF4Wikge1xyXG4gICAgICAgIGlmIChwLnggPj0geDAgJiYgcC54IDw9IHgxICYmIHAueSA+PSB5MCAmJiBwLnkgPD0geTEgJiYgcCAhPT0gYSAmJiBwICE9PSBjICYmXHJcbiAgICAgICAgICAgIHBvaW50SW5UcmlhbmdsZUV4Y2VwdEZpcnN0KGF4LCBheSwgYngsIGJ5LCBjeCwgY3ksIHAueCwgcC55KSAmJiBhcmVhKHAucHJldiwgcCwgcC5uZXh0KSA+PSAwKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgcCA9IHAucHJldlo7XHJcblxyXG4gICAgICAgIGlmIChuLnggPj0geDAgJiYgbi54IDw9IHgxICYmIG4ueSA+PSB5MCAmJiBuLnkgPD0geTEgJiYgbiAhPT0gYSAmJiBuICE9PSBjICYmXHJcbiAgICAgICAgICAgIHBvaW50SW5UcmlhbmdsZUV4Y2VwdEZpcnN0KGF4LCBheSwgYngsIGJ5LCBjeCwgY3ksIG4ueCwgbi55KSAmJiBhcmVhKG4ucHJldiwgbiwgbi5uZXh0KSA+PSAwKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgbiA9IG4ubmV4dFo7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gbG9vayBmb3IgcmVtYWluaW5nIHBvaW50cyBpbiBkZWNyZWFzaW5nIHotb3JkZXJcclxuICAgIHdoaWxlIChwICYmIHAueiA+PSBtaW5aKSB7XHJcbiAgICAgICAgaWYgKHAueCA+PSB4MCAmJiBwLnggPD0geDEgJiYgcC55ID49IHkwICYmIHAueSA8PSB5MSAmJiBwICE9PSBhICYmIHAgIT09IGMgJiZcclxuICAgICAgICAgICAgcG9pbnRJblRyaWFuZ2xlRXhjZXB0Rmlyc3QoYXgsIGF5LCBieCwgYnksIGN4LCBjeSwgcC54LCBwLnkpICYmIGFyZWEocC5wcmV2LCBwLCBwLm5leHQpID49IDApIHJldHVybiBmYWxzZTtcclxuICAgICAgICBwID0gcC5wcmV2WjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBsb29rIGZvciByZW1haW5pbmcgcG9pbnRzIGluIGluY3JlYXNpbmcgei1vcmRlclxyXG4gICAgd2hpbGUgKG4gJiYgbi56IDw9IG1heFopIHtcclxuICAgICAgICBpZiAobi54ID49IHgwICYmIG4ueCA8PSB4MSAmJiBuLnkgPj0geTAgJiYgbi55IDw9IHkxICYmIG4gIT09IGEgJiYgbiAhPT0gYyAmJlxyXG4gICAgICAgICAgICBwb2ludEluVHJpYW5nbGVFeGNlcHRGaXJzdChheCwgYXksIGJ4LCBieSwgY3gsIGN5LCBuLngsIG4ueSkgJiYgYXJlYShuLnByZXYsIG4sIG4ubmV4dCkgPj0gMCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIG4gPSBuLm5leHRaO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG59XHJcblxyXG4vLyBnbyB0aHJvdWdoIGFsbCBwb2x5Z29uIG5vZGVzIGFuZCBjdXJlIHNtYWxsIGxvY2FsIHNlbGYtaW50ZXJzZWN0aW9uc1xyXG5mdW5jdGlvbiBjdXJlTG9jYWxJbnRlcnNlY3Rpb25zKHN0YXJ0LCB0cmlhbmdsZXMpIHtcclxuICAgIGxldCBwID0gc3RhcnQ7XHJcbiAgICBkbyB7XHJcbiAgICAgICAgY29uc3QgYSA9IHAucHJldixcclxuICAgICAgICAgICAgYiA9IHAubmV4dC5uZXh0O1xyXG5cclxuICAgICAgICBpZiAoIWVxdWFscyhhLCBiKSAmJiBpbnRlcnNlY3RzKGEsIHAsIHAubmV4dCwgYikgJiYgbG9jYWxseUluc2lkZShhLCBiKSAmJiBsb2NhbGx5SW5zaWRlKGIsIGEpKSB7XHJcblxyXG4gICAgICAgICAgICB0cmlhbmdsZXMucHVzaChhLmksIHAuaSwgYi5pKTtcclxuXHJcbiAgICAgICAgICAgIC8vIHJlbW92ZSB0d28gbm9kZXMgaW52b2x2ZWRcclxuICAgICAgICAgICAgcmVtb3ZlTm9kZShwKTtcclxuICAgICAgICAgICAgcmVtb3ZlTm9kZShwLm5leHQpO1xyXG5cclxuICAgICAgICAgICAgcCA9IHN0YXJ0ID0gYjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcCA9IHAubmV4dDtcclxuICAgIH0gd2hpbGUgKHAgIT09IHN0YXJ0KTtcclxuXHJcbiAgICByZXR1cm4gZmlsdGVyUG9pbnRzKHApO1xyXG59XHJcblxyXG4vLyB0cnkgc3BsaXR0aW5nIHBvbHlnb24gaW50byB0d28gYW5kIHRyaWFuZ3VsYXRlIHRoZW0gaW5kZXBlbmRlbnRseVxyXG5mdW5jdGlvbiBzcGxpdEVhcmN1dChzdGFydCwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUpIHtcclxuICAgIC8vIGxvb2sgZm9yIGEgdmFsaWQgZGlhZ29uYWwgdGhhdCBkaXZpZGVzIHRoZSBwb2x5Z29uIGludG8gdHdvXHJcbiAgICBsZXQgYSA9IHN0YXJ0O1xyXG4gICAgZG8ge1xyXG4gICAgICAgIGxldCBiID0gYS5uZXh0Lm5leHQ7XHJcbiAgICAgICAgd2hpbGUgKGIgIT09IGEucHJldikge1xyXG4gICAgICAgICAgICBpZiAoYS5pICE9PSBiLmkgJiYgaXNWYWxpZERpYWdvbmFsKGEsIGIpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBzcGxpdCB0aGUgcG9seWdvbiBpbiB0d28gYnkgdGhlIGRpYWdvbmFsXHJcbiAgICAgICAgICAgICAgICBsZXQgYyA9IHNwbGl0UG9seWdvbihhLCBiKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBmaWx0ZXIgY29saW5lYXIgcG9pbnRzIGFyb3VuZCB0aGUgY3V0c1xyXG4gICAgICAgICAgICAgICAgYSA9IGZpbHRlclBvaW50cyhhLCBhLm5leHQpO1xyXG4gICAgICAgICAgICAgICAgYyA9IGZpbHRlclBvaW50cyhjLCBjLm5leHQpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIHJ1biBlYXJjdXQgb24gZWFjaCBoYWxmXHJcbiAgICAgICAgICAgICAgICBlYXJjdXRMaW5rZWQoYSwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUsIDApO1xyXG4gICAgICAgICAgICAgICAgZWFyY3V0TGlua2VkKGMsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplLCAwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBiID0gYi5uZXh0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBhID0gYS5uZXh0O1xyXG4gICAgfSB3aGlsZSAoYSAhPT0gc3RhcnQpO1xyXG59XHJcblxyXG4vLyBsaW5rIGV2ZXJ5IGhvbGUgaW50byB0aGUgb3V0ZXIgbG9vcCwgcHJvZHVjaW5nIGEgc2luZ2xlLXJpbmcgcG9seWdvbiB3aXRob3V0IGhvbGVzXHJcbmZ1bmN0aW9uIGVsaW1pbmF0ZUhvbGVzKGRhdGEsIGhvbGVJbmRpY2VzLCBvdXRlck5vZGUsIGRpbSkge1xyXG4gICAgY29uc3QgcXVldWUgPSBbXTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gaG9sZUluZGljZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICBjb25zdCBzdGFydCA9IGhvbGVJbmRpY2VzW2ldICogZGltO1xyXG4gICAgICAgIGNvbnN0IGVuZCA9IGkgPCBsZW4gLSAxID8gaG9sZUluZGljZXNbaSArIDFdICogZGltIDogZGF0YS5sZW5ndGg7XHJcbiAgICAgICAgY29uc3QgbGlzdCA9IGxpbmtlZExpc3QoZGF0YSwgc3RhcnQsIGVuZCwgZGltLCBmYWxzZSk7XHJcbiAgICAgICAgaWYgKGxpc3QgPT09IGxpc3QubmV4dCkgbGlzdC5zdGVpbmVyID0gdHJ1ZTtcclxuICAgICAgICBxdWV1ZS5wdXNoKGdldExlZnRtb3N0KGxpc3QpKTtcclxuICAgIH1cclxuXHJcbiAgICBxdWV1ZS5zb3J0KGNvbXBhcmVYWVNsb3BlKTtcclxuXHJcbiAgICAvLyBwcm9jZXNzIGhvbGVzIGZyb20gbGVmdCB0byByaWdodFxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIG91dGVyTm9kZSA9IGVsaW1pbmF0ZUhvbGUocXVldWVbaV0sIG91dGVyTm9kZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG91dGVyTm9kZTtcclxufVxyXG5cclxuZnVuY3Rpb24gY29tcGFyZVhZU2xvcGUoYSwgYikge1xyXG4gICAgbGV0IHJlc3VsdCA9IGEueCAtIGIueDtcclxuICAgIC8vIHdoZW4gdGhlIGxlZnQtbW9zdCBwb2ludCBvZiAyIGhvbGVzIG1lZXQgYXQgYSB2ZXJ0ZXgsIHNvcnQgdGhlIGhvbGVzIGNvdW50ZXJjbG9ja3dpc2Ugc28gdGhhdCB3aGVuIHdlIGZpbmRcclxuICAgIC8vIHRoZSBicmlkZ2UgdG8gdGhlIG91dGVyIHNoZWxsIGlzIGFsd2F5cyB0aGUgcG9pbnQgdGhhdCB0aGV5IG1lZXQgYXQuXHJcbiAgICBpZiAocmVzdWx0ID09PSAwKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gYS55IC0gYi55O1xyXG4gICAgICAgIGlmIChyZXN1bHQgPT09IDApIHtcclxuICAgICAgICAgICAgY29uc3QgYVNsb3BlID0gKGEubmV4dC55IC0gYS55KSAvIChhLm5leHQueCAtIGEueCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGJTbG9wZSA9IChiLm5leHQueSAtIGIueSkgLyAoYi5uZXh0LnggLSBiLngpO1xyXG4gICAgICAgICAgICByZXN1bHQgPSBhU2xvcGUgLSBiU2xvcGU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuLy8gZmluZCBhIGJyaWRnZSBiZXR3ZWVuIHZlcnRpY2VzIHRoYXQgY29ubmVjdHMgaG9sZSB3aXRoIGFuIG91dGVyIHJpbmcgYW5kIGFuZCBsaW5rIGl0XHJcbmZ1bmN0aW9uIGVsaW1pbmF0ZUhvbGUoaG9sZSwgb3V0ZXJOb2RlKSB7XHJcbiAgICBjb25zdCBicmlkZ2UgPSBmaW5kSG9sZUJyaWRnZShob2xlLCBvdXRlck5vZGUpO1xyXG4gICAgaWYgKCFicmlkZ2UpIHtcclxuICAgICAgICByZXR1cm4gb3V0ZXJOb2RlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGJyaWRnZVJldmVyc2UgPSBzcGxpdFBvbHlnb24oYnJpZGdlLCBob2xlKTtcclxuXHJcbiAgICAvLyBmaWx0ZXIgY29sbGluZWFyIHBvaW50cyBhcm91bmQgdGhlIGN1dHNcclxuICAgIGZpbHRlclBvaW50cyhicmlkZ2VSZXZlcnNlLCBicmlkZ2VSZXZlcnNlLm5leHQpO1xyXG4gICAgcmV0dXJuIGZpbHRlclBvaW50cyhicmlkZ2UsIGJyaWRnZS5uZXh0KTtcclxufVxyXG5cclxuLy8gRGF2aWQgRWJlcmx5J3MgYWxnb3JpdGhtIGZvciBmaW5kaW5nIGEgYnJpZGdlIGJldHdlZW4gaG9sZSBhbmQgb3V0ZXIgcG9seWdvblxyXG5mdW5jdGlvbiBmaW5kSG9sZUJyaWRnZShob2xlLCBvdXRlck5vZGUpIHtcclxuICAgIGxldCBwID0gb3V0ZXJOb2RlO1xyXG4gICAgY29uc3QgaHggPSBob2xlLng7XHJcbiAgICBjb25zdCBoeSA9IGhvbGUueTtcclxuICAgIGxldCBxeCA9IC1JbmZpbml0eTtcclxuICAgIGxldCBtO1xyXG5cclxuICAgIC8vIGZpbmQgYSBzZWdtZW50IGludGVyc2VjdGVkIGJ5IGEgcmF5IGZyb20gdGhlIGhvbGUncyBsZWZ0bW9zdCBwb2ludCB0byB0aGUgbGVmdDtcclxuICAgIC8vIHNlZ21lbnQncyBlbmRwb2ludCB3aXRoIGxlc3NlciB4IHdpbGwgYmUgcG90ZW50aWFsIGNvbm5lY3Rpb24gcG9pbnRcclxuICAgIC8vIHVubGVzcyB0aGV5IGludGVyc2VjdCBhdCBhIHZlcnRleCwgdGhlbiBjaG9vc2UgdGhlIHZlcnRleFxyXG4gICAgaWYgKGVxdWFscyhob2xlLCBwKSkgcmV0dXJuIHA7XHJcbiAgICBkbyB7XHJcbiAgICAgICAgaWYgKGVxdWFscyhob2xlLCBwLm5leHQpKSByZXR1cm4gcC5uZXh0O1xyXG4gICAgICAgIGVsc2UgaWYgKGh5IDw9IHAueSAmJiBoeSA+PSBwLm5leHQueSAmJiBwLm5leHQueSAhPT0gcC55KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHggPSBwLnggKyAoaHkgLSBwLnkpICogKHAubmV4dC54IC0gcC54KSAvIChwLm5leHQueSAtIHAueSk7XHJcbiAgICAgICAgICAgIGlmICh4IDw9IGh4ICYmIHggPiBxeCkge1xyXG4gICAgICAgICAgICAgICAgcXggPSB4O1xyXG4gICAgICAgICAgICAgICAgbSA9IHAueCA8IHAubmV4dC54ID8gcCA6IHAubmV4dDtcclxuICAgICAgICAgICAgICAgIGlmICh4ID09PSBoeCkgcmV0dXJuIG07IC8vIGhvbGUgdG91Y2hlcyBvdXRlciBzZWdtZW50OyBwaWNrIGxlZnRtb3N0IGVuZHBvaW50XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcCA9IHAubmV4dDtcclxuICAgIH0gd2hpbGUgKHAgIT09IG91dGVyTm9kZSk7XHJcblxyXG4gICAgaWYgKCFtKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAvLyBsb29rIGZvciBwb2ludHMgaW5zaWRlIHRoZSB0cmlhbmdsZSBvZiBob2xlIHBvaW50LCBzZWdtZW50IGludGVyc2VjdGlvbiBhbmQgZW5kcG9pbnQ7XHJcbiAgICAvLyBpZiB0aGVyZSBhcmUgbm8gcG9pbnRzIGZvdW5kLCB3ZSBoYXZlIGEgdmFsaWQgY29ubmVjdGlvbjtcclxuICAgIC8vIG90aGVyd2lzZSBjaG9vc2UgdGhlIHBvaW50IG9mIHRoZSBtaW5pbXVtIGFuZ2xlIHdpdGggdGhlIHJheSBhcyBjb25uZWN0aW9uIHBvaW50XHJcblxyXG4gICAgY29uc3Qgc3RvcCA9IG07XHJcbiAgICBjb25zdCBteCA9IG0ueDtcclxuICAgIGNvbnN0IG15ID0gbS55O1xyXG4gICAgbGV0IHRhbk1pbiA9IEluZmluaXR5O1xyXG5cclxuICAgIHAgPSBtO1xyXG5cclxuICAgIGRvIHtcclxuICAgICAgICBpZiAoaHggPj0gcC54ICYmIHAueCA+PSBteCAmJiBoeCAhPT0gcC54ICYmXHJcbiAgICAgICAgICAgICAgICBwb2ludEluVHJpYW5nbGUoaHkgPCBteSA/IGh4IDogcXgsIGh5LCBteCwgbXksIGh5IDwgbXkgPyBxeCA6IGh4LCBoeSwgcC54LCBwLnkpKSB7XHJcblxyXG4gICAgICAgICAgICBjb25zdCB0YW4gPSBNYXRoLmFicyhoeSAtIHAueSkgLyAoaHggLSBwLngpOyAvLyB0YW5nZW50aWFsXHJcblxyXG4gICAgICAgICAgICBpZiAobG9jYWxseUluc2lkZShwLCBob2xlKSAmJlxyXG4gICAgICAgICAgICAgICAgKHRhbiA8IHRhbk1pbiB8fCAodGFuID09PSB0YW5NaW4gJiYgKHAueCA+IG0ueCB8fCAocC54ID09PSBtLnggJiYgc2VjdG9yQ29udGFpbnNTZWN0b3IobSwgcCkpKSkpKSB7XHJcbiAgICAgICAgICAgICAgICBtID0gcDtcclxuICAgICAgICAgICAgICAgIHRhbk1pbiA9IHRhbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcCA9IHAubmV4dDtcclxuICAgIH0gd2hpbGUgKHAgIT09IHN0b3ApO1xyXG5cclxuICAgIHJldHVybiBtO1xyXG59XHJcblxyXG4vLyB3aGV0aGVyIHNlY3RvciBpbiB2ZXJ0ZXggbSBjb250YWlucyBzZWN0b3IgaW4gdmVydGV4IHAgaW4gdGhlIHNhbWUgY29vcmRpbmF0ZXNcclxuZnVuY3Rpb24gc2VjdG9yQ29udGFpbnNTZWN0b3IobSwgcCkge1xyXG4gICAgcmV0dXJuIGFyZWEobS5wcmV2LCBtLCBwLnByZXYpIDwgMCAmJiBhcmVhKHAubmV4dCwgbSwgbS5uZXh0KSA8IDA7XHJcbn1cclxuXHJcbi8vIGludGVybGluayBwb2x5Z29uIG5vZGVzIGluIHotb3JkZXJcclxuZnVuY3Rpb24gaW5kZXhDdXJ2ZShzdGFydCwgbWluWCwgbWluWSwgaW52U2l6ZSkge1xyXG4gICAgbGV0IHAgPSBzdGFydDtcclxuICAgIGRvIHtcclxuICAgICAgICBpZiAocC56ID09PSAwKSBwLnogPSB6T3JkZXIocC54LCBwLnksIG1pblgsIG1pblksIGludlNpemUpO1xyXG4gICAgICAgIHAucHJldlogPSBwLnByZXY7XHJcbiAgICAgICAgcC5uZXh0WiA9IHAubmV4dDtcclxuICAgICAgICBwID0gcC5uZXh0O1xyXG4gICAgfSB3aGlsZSAocCAhPT0gc3RhcnQpO1xyXG5cclxuICAgIHAucHJldloubmV4dFogPSBudWxsO1xyXG4gICAgcC5wcmV2WiA9IG51bGw7XHJcblxyXG4gICAgc29ydExpbmtlZChwKTtcclxufVxyXG5cclxuLy8gU2ltb24gVGF0aGFtJ3MgbGlua2VkIGxpc3QgbWVyZ2Ugc29ydCBhbGdvcml0aG1cclxuLy8gaHR0cDovL3d3dy5jaGlhcmsuZ3JlZW5lbmQub3JnLnVrL35zZ3RhdGhhbS9hbGdvcml0aG1zL2xpc3Rzb3J0Lmh0bWxcclxuZnVuY3Rpb24gc29ydExpbmtlZChsaXN0KSB7XHJcbiAgICBsZXQgbnVtTWVyZ2VzO1xyXG4gICAgbGV0IGluU2l6ZSA9IDE7XHJcblxyXG4gICAgZG8ge1xyXG4gICAgICAgIGxldCBwID0gbGlzdDtcclxuICAgICAgICBsZXQgZTtcclxuICAgICAgICBsaXN0ID0gbnVsbDtcclxuICAgICAgICBsZXQgdGFpbCA9IG51bGw7XHJcbiAgICAgICAgbnVtTWVyZ2VzID0gMDtcclxuXHJcbiAgICAgICAgd2hpbGUgKHApIHtcclxuICAgICAgICAgICAgbnVtTWVyZ2VzKys7XHJcbiAgICAgICAgICAgIGxldCBxID0gcDtcclxuICAgICAgICAgICAgbGV0IHBTaXplID0gMDtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpblNpemU7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgcFNpemUrKztcclxuICAgICAgICAgICAgICAgIHEgPSBxLm5leHRaO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFxKSBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgcVNpemUgPSBpblNpemU7XHJcblxyXG4gICAgICAgICAgICB3aGlsZSAocFNpemUgPiAwIHx8IChxU2l6ZSA+IDAgJiYgcSkpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocFNpemUgIT09IDAgJiYgKHFTaXplID09PSAwIHx8ICFxIHx8IHAueiA8PSBxLnopKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZSA9IHA7XHJcbiAgICAgICAgICAgICAgICAgICAgcCA9IHAubmV4dFo7XHJcbiAgICAgICAgICAgICAgICAgICAgcFNpemUtLTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZSA9IHE7XHJcbiAgICAgICAgICAgICAgICAgICAgcSA9IHEubmV4dFo7XHJcbiAgICAgICAgICAgICAgICAgICAgcVNpemUtLTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGFpbCkgdGFpbC5uZXh0WiA9IGU7XHJcbiAgICAgICAgICAgICAgICBlbHNlIGxpc3QgPSBlO1xyXG5cclxuICAgICAgICAgICAgICAgIGUucHJldlogPSB0YWlsO1xyXG4gICAgICAgICAgICAgICAgdGFpbCA9IGU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHAgPSBxO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGFpbC5uZXh0WiA9IG51bGw7XHJcbiAgICAgICAgaW5TaXplICo9IDI7XHJcblxyXG4gICAgfSB3aGlsZSAobnVtTWVyZ2VzID4gMSk7XHJcblxyXG4gICAgcmV0dXJuIGxpc3Q7XHJcbn1cclxuXHJcbi8vIHotb3JkZXIgb2YgYSBwb2ludCBnaXZlbiBjb29yZHMgYW5kIGludmVyc2Ugb2YgdGhlIGxvbmdlciBzaWRlIG9mIGRhdGEgYmJveFxyXG5mdW5jdGlvbiB6T3JkZXIoeCwgeSwgbWluWCwgbWluWSwgaW52U2l6ZSkge1xyXG4gICAgLy8gY29vcmRzIGFyZSB0cmFuc2Zvcm1lZCBpbnRvIG5vbi1uZWdhdGl2ZSAxNS1iaXQgaW50ZWdlciByYW5nZVxyXG4gICAgeCA9ICh4IC0gbWluWCkgKiBpbnZTaXplIHwgMDtcclxuICAgIHkgPSAoeSAtIG1pblkpICogaW52U2l6ZSB8IDA7XHJcblxyXG4gICAgeCA9ICh4IHwgKHggPDwgOCkpICYgMHgwMEZGMDBGRjtcclxuICAgIHggPSAoeCB8ICh4IDw8IDQpKSAmIDB4MEYwRjBGMEY7XHJcbiAgICB4ID0gKHggfCAoeCA8PCAyKSkgJiAweDMzMzMzMzMzO1xyXG4gICAgeCA9ICh4IHwgKHggPDwgMSkpICYgMHg1NTU1NTU1NTtcclxuXHJcbiAgICB5ID0gKHkgfCAoeSA8PCA4KSkgJiAweDAwRkYwMEZGO1xyXG4gICAgeSA9ICh5IHwgKHkgPDwgNCkpICYgMHgwRjBGMEYwRjtcclxuICAgIHkgPSAoeSB8ICh5IDw8IDIpKSAmIDB4MzMzMzMzMzM7XHJcbiAgICB5ID0gKHkgfCAoeSA8PCAxKSkgJiAweDU1NTU1NTU1O1xyXG5cclxuICAgIHJldHVybiB4IHwgKHkgPDwgMSk7XHJcbn1cclxuXHJcbi8vIGZpbmQgdGhlIGxlZnRtb3N0IG5vZGUgb2YgYSBwb2x5Z29uIHJpbmdcclxuZnVuY3Rpb24gZ2V0TGVmdG1vc3Qoc3RhcnQpIHtcclxuICAgIGxldCBwID0gc3RhcnQsXHJcbiAgICAgICAgbGVmdG1vc3QgPSBzdGFydDtcclxuICAgIGRvIHtcclxuICAgICAgICBpZiAocC54IDwgbGVmdG1vc3QueCB8fCAocC54ID09PSBsZWZ0bW9zdC54ICYmIHAueSA8IGxlZnRtb3N0LnkpKSBsZWZ0bW9zdCA9IHA7XHJcbiAgICAgICAgcCA9IHAubmV4dDtcclxuICAgIH0gd2hpbGUgKHAgIT09IHN0YXJ0KTtcclxuXHJcbiAgICByZXR1cm4gbGVmdG1vc3Q7XHJcbn1cclxuXHJcbi8vIGNoZWNrIGlmIGEgcG9pbnQgbGllcyB3aXRoaW4gYSBjb252ZXggdHJpYW5nbGVcclxuZnVuY3Rpb24gcG9pbnRJblRyaWFuZ2xlKGF4LCBheSwgYngsIGJ5LCBjeCwgY3ksIHB4LCBweSkge1xyXG4gICAgcmV0dXJuIChjeCAtIHB4KSAqIChheSAtIHB5KSA+PSAoYXggLSBweCkgKiAoY3kgLSBweSkgJiZcclxuICAgICAgICAgICAoYXggLSBweCkgKiAoYnkgLSBweSkgPj0gKGJ4IC0gcHgpICogKGF5IC0gcHkpICYmXHJcbiAgICAgICAgICAgKGJ4IC0gcHgpICogKGN5IC0gcHkpID49IChjeCAtIHB4KSAqIChieSAtIHB5KTtcclxufVxyXG5cclxuLy8gY2hlY2sgaWYgYSBwb2ludCBsaWVzIHdpdGhpbiBhIGNvbnZleCB0cmlhbmdsZSBidXQgZmFsc2UgaWYgaXRzIGVxdWFsIHRvIHRoZSBmaXJzdCBwb2ludCBvZiB0aGUgdHJpYW5nbGVcclxuZnVuY3Rpb24gcG9pbnRJblRyaWFuZ2xlRXhjZXB0Rmlyc3QoYXgsIGF5LCBieCwgYnksIGN4LCBjeSwgcHgsIHB5KSB7XHJcbiAgICByZXR1cm4gIShheCA9PT0gcHggJiYgYXkgPT09IHB5KSAmJiBwb2ludEluVHJpYW5nbGUoYXgsIGF5LCBieCwgYnksIGN4LCBjeSwgcHgsIHB5KTtcclxufVxyXG5cclxuLy8gY2hlY2sgaWYgYSBkaWFnb25hbCBiZXR3ZWVuIHR3byBwb2x5Z29uIG5vZGVzIGlzIHZhbGlkIChsaWVzIGluIHBvbHlnb24gaW50ZXJpb3IpXHJcbmZ1bmN0aW9uIGlzVmFsaWREaWFnb25hbChhLCBiKSB7XHJcbiAgICByZXR1cm4gYS5uZXh0LmkgIT09IGIuaSAmJiBhLnByZXYuaSAhPT0gYi5pICYmICFpbnRlcnNlY3RzUG9seWdvbihhLCBiKSAmJiAvLyBkb25lcyd0IGludGVyc2VjdCBvdGhlciBlZGdlc1xyXG4gICAgICAgICAgIChsb2NhbGx5SW5zaWRlKGEsIGIpICYmIGxvY2FsbHlJbnNpZGUoYiwgYSkgJiYgbWlkZGxlSW5zaWRlKGEsIGIpICYmIC8vIGxvY2FsbHkgdmlzaWJsZVxyXG4gICAgICAgICAgICAoYXJlYShhLnByZXYsIGEsIGIucHJldikgfHwgYXJlYShhLCBiLnByZXYsIGIpKSB8fCAvLyBkb2VzIG5vdCBjcmVhdGUgb3Bwb3NpdGUtZmFjaW5nIHNlY3RvcnNcclxuICAgICAgICAgICAgZXF1YWxzKGEsIGIpICYmIGFyZWEoYS5wcmV2LCBhLCBhLm5leHQpID4gMCAmJiBhcmVhKGIucHJldiwgYiwgYi5uZXh0KSA+IDApOyAvLyBzcGVjaWFsIHplcm8tbGVuZ3RoIGNhc2VcclxufVxyXG5cclxuLy8gc2lnbmVkIGFyZWEgb2YgYSB0cmlhbmdsZVxyXG5mdW5jdGlvbiBhcmVhKHAsIHEsIHIpIHtcclxuICAgIHJldHVybiAocS55IC0gcC55KSAqIChyLnggLSBxLngpIC0gKHEueCAtIHAueCkgKiAoci55IC0gcS55KTtcclxufVxyXG5cclxuLy8gY2hlY2sgaWYgdHdvIHBvaW50cyBhcmUgZXF1YWxcclxuZnVuY3Rpb24gZXF1YWxzKHAxLCBwMikge1xyXG4gICAgcmV0dXJuIHAxLnggPT09IHAyLnggJiYgcDEueSA9PT0gcDIueTtcclxufVxyXG5cclxuLy8gY2hlY2sgaWYgdHdvIHNlZ21lbnRzIGludGVyc2VjdFxyXG5mdW5jdGlvbiBpbnRlcnNlY3RzKHAxLCBxMSwgcDIsIHEyKSB7XHJcbiAgICBjb25zdCBvMSA9IHNpZ24oYXJlYShwMSwgcTEsIHAyKSk7XHJcbiAgICBjb25zdCBvMiA9IHNpZ24oYXJlYShwMSwgcTEsIHEyKSk7XHJcbiAgICBjb25zdCBvMyA9IHNpZ24oYXJlYShwMiwgcTIsIHAxKSk7XHJcbiAgICBjb25zdCBvNCA9IHNpZ24oYXJlYShwMiwgcTIsIHExKSk7XHJcblxyXG4gICAgaWYgKG8xICE9PSBvMiAmJiBvMyAhPT0gbzQpIHJldHVybiB0cnVlOyAvLyBnZW5lcmFsIGNhc2VcclxuXHJcbiAgICBpZiAobzEgPT09IDAgJiYgb25TZWdtZW50KHAxLCBwMiwgcTEpKSByZXR1cm4gdHJ1ZTsgLy8gcDEsIHExIGFuZCBwMiBhcmUgY29sbGluZWFyIGFuZCBwMiBsaWVzIG9uIHAxcTFcclxuICAgIGlmIChvMiA9PT0gMCAmJiBvblNlZ21lbnQocDEsIHEyLCBxMSkpIHJldHVybiB0cnVlOyAvLyBwMSwgcTEgYW5kIHEyIGFyZSBjb2xsaW5lYXIgYW5kIHEyIGxpZXMgb24gcDFxMVxyXG4gICAgaWYgKG8zID09PSAwICYmIG9uU2VnbWVudChwMiwgcDEsIHEyKSkgcmV0dXJuIHRydWU7IC8vIHAyLCBxMiBhbmQgcDEgYXJlIGNvbGxpbmVhciBhbmQgcDEgbGllcyBvbiBwMnEyXHJcbiAgICBpZiAobzQgPT09IDAgJiYgb25TZWdtZW50KHAyLCBxMSwgcTIpKSByZXR1cm4gdHJ1ZTsgLy8gcDIsIHEyIGFuZCBxMSBhcmUgY29sbGluZWFyIGFuZCBxMSBsaWVzIG9uIHAycTJcclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbn1cclxuXHJcbi8vIGZvciBjb2xsaW5lYXIgcG9pbnRzIHAsIHEsIHIsIGNoZWNrIGlmIHBvaW50IHEgbGllcyBvbiBzZWdtZW50IHByXHJcbmZ1bmN0aW9uIG9uU2VnbWVudChwLCBxLCByKSB7XHJcbiAgICByZXR1cm4gcS54IDw9IE1hdGgubWF4KHAueCwgci54KSAmJiBxLnggPj0gTWF0aC5taW4ocC54LCByLngpICYmIHEueSA8PSBNYXRoLm1heChwLnksIHIueSkgJiYgcS55ID49IE1hdGgubWluKHAueSwgci55KTtcclxufVxyXG5cclxuZnVuY3Rpb24gc2lnbihudW0pIHtcclxuICAgIHJldHVybiBudW0gPiAwID8gMSA6IG51bSA8IDAgPyAtMSA6IDA7XHJcbn1cclxuXHJcbi8vIGNoZWNrIGlmIGEgcG9seWdvbiBkaWFnb25hbCBpbnRlcnNlY3RzIGFueSBwb2x5Z29uIHNlZ21lbnRzXHJcbmZ1bmN0aW9uIGludGVyc2VjdHNQb2x5Z29uKGEsIGIpIHtcclxuICAgIGxldCBwID0gYTtcclxuICAgIGRvIHtcclxuICAgICAgICBpZiAocC5pICE9PSBhLmkgJiYgcC5uZXh0LmkgIT09IGEuaSAmJiBwLmkgIT09IGIuaSAmJiBwLm5leHQuaSAhPT0gYi5pICYmXHJcbiAgICAgICAgICAgICAgICBpbnRlcnNlY3RzKHAsIHAubmV4dCwgYSwgYikpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIHAgPSBwLm5leHQ7XHJcbiAgICB9IHdoaWxlIChwICE9PSBhKTtcclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbn1cclxuXHJcbi8vIGNoZWNrIGlmIGEgcG9seWdvbiBkaWFnb25hbCBpcyBsb2NhbGx5IGluc2lkZSB0aGUgcG9seWdvblxyXG5mdW5jdGlvbiBsb2NhbGx5SW5zaWRlKGEsIGIpIHtcclxuICAgIHJldHVybiBhcmVhKGEucHJldiwgYSwgYS5uZXh0KSA8IDAgP1xyXG4gICAgICAgIGFyZWEoYSwgYiwgYS5uZXh0KSA+PSAwICYmIGFyZWEoYSwgYS5wcmV2LCBiKSA+PSAwIDpcclxuICAgICAgICBhcmVhKGEsIGIsIGEucHJldikgPCAwIHx8IGFyZWEoYSwgYS5uZXh0LCBiKSA8IDA7XHJcbn1cclxuXHJcbi8vIGNoZWNrIGlmIHRoZSBtaWRkbGUgcG9pbnQgb2YgYSBwb2x5Z29uIGRpYWdvbmFsIGlzIGluc2lkZSB0aGUgcG9seWdvblxyXG5mdW5jdGlvbiBtaWRkbGVJbnNpZGUoYSwgYikge1xyXG4gICAgbGV0IHAgPSBhO1xyXG4gICAgbGV0IGluc2lkZSA9IGZhbHNlO1xyXG4gICAgY29uc3QgcHggPSAoYS54ICsgYi54KSAvIDI7XHJcbiAgICBjb25zdCBweSA9IChhLnkgKyBiLnkpIC8gMjtcclxuICAgIGRvIHtcclxuICAgICAgICBpZiAoKChwLnkgPiBweSkgIT09IChwLm5leHQueSA+IHB5KSkgJiYgcC5uZXh0LnkgIT09IHAueSAmJlxyXG4gICAgICAgICAgICAgICAgKHB4IDwgKHAubmV4dC54IC0gcC54KSAqIChweSAtIHAueSkgLyAocC5uZXh0LnkgLSBwLnkpICsgcC54KSlcclxuICAgICAgICAgICAgaW5zaWRlID0gIWluc2lkZTtcclxuICAgICAgICBwID0gcC5uZXh0O1xyXG4gICAgfSB3aGlsZSAocCAhPT0gYSk7XHJcblxyXG4gICAgcmV0dXJuIGluc2lkZTtcclxufVxyXG5cclxuLy8gbGluayB0d28gcG9seWdvbiB2ZXJ0aWNlcyB3aXRoIGEgYnJpZGdlOyBpZiB0aGUgdmVydGljZXMgYmVsb25nIHRvIHRoZSBzYW1lIHJpbmcsIGl0IHNwbGl0cyBwb2x5Z29uIGludG8gdHdvO1xyXG4vLyBpZiBvbmUgYmVsb25ncyB0byB0aGUgb3V0ZXIgcmluZyBhbmQgYW5vdGhlciB0byBhIGhvbGUsIGl0IG1lcmdlcyBpdCBpbnRvIGEgc2luZ2xlIHJpbmdcclxuZnVuY3Rpb24gc3BsaXRQb2x5Z29uKGEsIGIpIHtcclxuICAgIGNvbnN0IGEyID0gY3JlYXRlTm9kZShhLmksIGEueCwgYS55KSxcclxuICAgICAgICBiMiA9IGNyZWF0ZU5vZGUoYi5pLCBiLngsIGIueSksXHJcbiAgICAgICAgYW4gPSBhLm5leHQsXHJcbiAgICAgICAgYnAgPSBiLnByZXY7XHJcblxyXG4gICAgYS5uZXh0ID0gYjtcclxuICAgIGIucHJldiA9IGE7XHJcblxyXG4gICAgYTIubmV4dCA9IGFuO1xyXG4gICAgYW4ucHJldiA9IGEyO1xyXG5cclxuICAgIGIyLm5leHQgPSBhMjtcclxuICAgIGEyLnByZXYgPSBiMjtcclxuXHJcbiAgICBicC5uZXh0ID0gYjI7XHJcbiAgICBiMi5wcmV2ID0gYnA7XHJcblxyXG4gICAgcmV0dXJuIGIyO1xyXG59XHJcblxyXG4vLyBjcmVhdGUgYSBub2RlIGFuZCBvcHRpb25hbGx5IGxpbmsgaXQgd2l0aCBwcmV2aW91cyBvbmUgKGluIGEgY2lyY3VsYXIgZG91Ymx5IGxpbmtlZCBsaXN0KVxyXG5mdW5jdGlvbiBpbnNlcnROb2RlKGksIHgsIHksIGxhc3QpIHtcclxuICAgIGNvbnN0IHAgPSBjcmVhdGVOb2RlKGksIHgsIHkpO1xyXG5cclxuICAgIGlmICghbGFzdCkge1xyXG4gICAgICAgIHAucHJldiA9IHA7XHJcbiAgICAgICAgcC5uZXh0ID0gcDtcclxuXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHAubmV4dCA9IGxhc3QubmV4dDtcclxuICAgICAgICBwLnByZXYgPSBsYXN0O1xyXG4gICAgICAgIGxhc3QubmV4dC5wcmV2ID0gcDtcclxuICAgICAgICBsYXN0Lm5leHQgPSBwO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHA7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlbW92ZU5vZGUocCkge1xyXG4gICAgcC5uZXh0LnByZXYgPSBwLnByZXY7XHJcbiAgICBwLnByZXYubmV4dCA9IHAubmV4dDtcclxuXHJcbiAgICBpZiAocC5wcmV2WikgcC5wcmV2Wi5uZXh0WiA9IHAubmV4dFo7XHJcbiAgICBpZiAocC5uZXh0WikgcC5uZXh0Wi5wcmV2WiA9IHAucHJldlo7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZU5vZGUoaSwgeCwgeSkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBpLCAvLyB2ZXJ0ZXggaW5kZXggaW4gY29vcmRpbmF0ZXMgYXJyYXlcclxuICAgICAgICB4LCB5LCAvLyB2ZXJ0ZXggY29vcmRpbmF0ZXNcclxuICAgICAgICBwcmV2OiBudWxsLCAvLyBwcmV2aW91cyBhbmQgbmV4dCB2ZXJ0ZXggbm9kZXMgaW4gYSBwb2x5Z29uIHJpbmdcclxuICAgICAgICBuZXh0OiBudWxsLFxyXG4gICAgICAgIHo6IDAsIC8vIHotb3JkZXIgY3VydmUgdmFsdWVcclxuICAgICAgICBwcmV2WjogbnVsbCwgLy8gcHJldmlvdXMgYW5kIG5leHQgbm9kZXMgaW4gei1vcmRlclxyXG4gICAgICAgIG5leHRaOiBudWxsLFxyXG4gICAgICAgIHN0ZWluZXI6IGZhbHNlIC8vIGluZGljYXRlcyB3aGV0aGVyIHRoaXMgaXMgYSBzdGVpbmVyIHBvaW50XHJcbiAgICB9O1xyXG59XHJcblxyXG4vLyByZXR1cm4gYSBwZXJjZW50YWdlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcG9seWdvbiBhcmVhIGFuZCBpdHMgdHJpYW5ndWxhdGlvbiBhcmVhO1xyXG4vLyB1c2VkIHRvIHZlcmlmeSBjb3JyZWN0bmVzcyBvZiB0cmlhbmd1bGF0aW9uXHJcbmV4cG9ydCBmdW5jdGlvbiBkZXZpYXRpb24oZGF0YSwgaG9sZUluZGljZXMsIGRpbSwgdHJpYW5nbGVzKSB7XHJcbiAgICBjb25zdCBoYXNIb2xlcyA9IGhvbGVJbmRpY2VzICYmIGhvbGVJbmRpY2VzLmxlbmd0aDtcclxuICAgIGNvbnN0IG91dGVyTGVuID0gaGFzSG9sZXMgPyBob2xlSW5kaWNlc1swXSAqIGRpbSA6IGRhdGEubGVuZ3RoO1xyXG5cclxuICAgIGxldCBwb2x5Z29uQXJlYSA9IE1hdGguYWJzKHNpZ25lZEFyZWEoZGF0YSwgMCwgb3V0ZXJMZW4sIGRpbSkpO1xyXG4gICAgaWYgKGhhc0hvbGVzKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGhvbGVJbmRpY2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gaG9sZUluZGljZXNbaV0gKiBkaW07XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IGkgPCBsZW4gLSAxID8gaG9sZUluZGljZXNbaSArIDFdICogZGltIDogZGF0YS5sZW5ndGg7XHJcbiAgICAgICAgICAgIHBvbHlnb25BcmVhIC09IE1hdGguYWJzKHNpZ25lZEFyZWEoZGF0YSwgc3RhcnQsIGVuZCwgZGltKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxldCB0cmlhbmdsZXNBcmVhID0gMDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHJpYW5nbGVzLmxlbmd0aDsgaSArPSAzKSB7XHJcbiAgICAgICAgY29uc3QgYSA9IHRyaWFuZ2xlc1tpXSAqIGRpbTtcclxuICAgICAgICBjb25zdCBiID0gdHJpYW5nbGVzW2kgKyAxXSAqIGRpbTtcclxuICAgICAgICBjb25zdCBjID0gdHJpYW5nbGVzW2kgKyAyXSAqIGRpbTtcclxuICAgICAgICB0cmlhbmdsZXNBcmVhICs9IE1hdGguYWJzKFxyXG4gICAgICAgICAgICAoZGF0YVthXSAtIGRhdGFbY10pICogKGRhdGFbYiArIDFdIC0gZGF0YVthICsgMV0pIC1cclxuICAgICAgICAgICAgKGRhdGFbYV0gLSBkYXRhW2JdKSAqIChkYXRhW2MgKyAxXSAtIGRhdGFbYSArIDFdKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHBvbHlnb25BcmVhID09PSAwICYmIHRyaWFuZ2xlc0FyZWEgPT09IDAgPyAwIDpcclxuICAgICAgICBNYXRoLmFicygodHJpYW5nbGVzQXJlYSAtIHBvbHlnb25BcmVhKSAvIHBvbHlnb25BcmVhKTtcclxufVxyXG5cclxuZnVuY3Rpb24gc2lnbmVkQXJlYShkYXRhLCBzdGFydCwgZW5kLCBkaW0pIHtcclxuICAgIGxldCBzdW0gPSAwO1xyXG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0LCBqID0gZW5kIC0gZGltOyBpIDwgZW5kOyBpICs9IGRpbSkge1xyXG4gICAgICAgIHN1bSArPSAoZGF0YVtqXSAtIGRhdGFbaV0pICogKGRhdGFbaSArIDFdICsgZGF0YVtqICsgMV0pO1xyXG4gICAgICAgIGogPSBpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN1bTtcclxufVxyXG5cclxuLy8gdHVybiBhIHBvbHlnb24gaW4gYSBtdWx0aS1kaW1lbnNpb25hbCBhcnJheSBmb3JtIChlLmcuIGFzIGluIEdlb0pTT04pIGludG8gYSBmb3JtIEVhcmN1dCBhY2NlcHRzXHJcbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuKGRhdGEpIHtcclxuICAgIGNvbnN0IHZlcnRpY2VzID0gW107XHJcbiAgICBjb25zdCBob2xlcyA9IFtdO1xyXG4gICAgY29uc3QgZGltZW5zaW9ucyA9IGRhdGFbMF1bMF0ubGVuZ3RoO1xyXG4gICAgbGV0IGhvbGVJbmRleCA9IDA7XHJcbiAgICBsZXQgcHJldkxlbiA9IDA7XHJcblxyXG4gICAgZm9yIChjb25zdCByaW5nIG9mIGRhdGEpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IHAgb2YgcmluZykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBkID0gMDsgZCA8IGRpbWVuc2lvbnM7IGQrKykgdmVydGljZXMucHVzaChwW2RdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHByZXZMZW4pIHtcclxuICAgICAgICAgICAgaG9sZUluZGV4ICs9IHByZXZMZW47XHJcbiAgICAgICAgICAgIGhvbGVzLnB1c2goaG9sZUluZGV4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcHJldkxlbiA9IHJpbmcubGVuZ3RoO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHt2ZXJ0aWNlcywgaG9sZXMsIGRpbWVuc2lvbnN9O1xyXG59XHJcbiIsImltcG9ydCBlYXJjdXQgZnJvbSAnLi9saWIvZWFyY3V0LmpzJztcclxuXHJcbmNsYXNzIEVhcmN1dCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRyaWFuZ3VsYXRlcyB0aGUgZ2l2ZW4gc2hhcGUgZGVmaW5pdGlvbiBieSByZXR1cm5pbmcgYW4gYXJyYXkgb2YgdHJpYW5nbGVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBkYXRhIC0gQW4gYXJyYXkgd2l0aCAyRCBwb2ludHMuXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBob2xlSW5kaWNlcyAtIEFuIGFycmF5IHdpdGggaW5kaWNlcyBkZWZpbmluZyBob2xlcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2RpbT0yXSAtIFRoZSBudW1iZXIgb2YgY29vcmRpbmF0ZXMgcGVyIHZlcnRleCBpbiB0aGUgaW5wdXQgYXJyYXkuXHJcblx0ICogQHJldHVybiB7QXJyYXk8bnVtYmVyPn0gQW4gYXJyYXkgcmVwcmVzZW50aW5nIHRoZSB0cmlhbmd1bGF0ZWQgZmFjZXMuIEVhY2ggZmFjZSBpcyBkZWZpbmVkIGJ5IHRocmVlIGNvbnNlY3V0aXZlIG51bWJlcnNcclxuXHQgKiByZXByZXNlbnRpbmcgdmVydGV4IGluZGljZXMuXHJcblx0ICovXHJcblx0c3RhdGljIHRyaWFuZ3VsYXRlKCBkYXRhLCBob2xlSW5kaWNlcywgZGltID0gMiApIHtcclxuXHJcblx0XHRyZXR1cm4gZWFyY3V0KCBkYXRhLCBob2xlSW5kaWNlcywgZGltICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IEVhcmN1dCB9O1xyXG4iLCJpbXBvcnQgeyBFYXJjdXQgfSBmcm9tICcuL0VhcmN1dC5qcyc7XHJcblxyXG4vKipcclxuICogQSBjbGFzcyBjb250YWluaW5nIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBzaGFwZXMuXHJcbiAqXHJcbiAqIEBoaWRlY29uc3RydWN0b3JcclxuICovXHJcbmNsYXNzIFNoYXBlVXRpbHMge1xyXG5cclxuXHQvKipcclxuXHQgKiBDYWxjdWxhdGUgYXJlYSBvZiBhICggMkQgKSBjb250b3VyIHBvbHlnb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PFZlY3RvcjI+fSBjb250b3VyIC0gQW4gYXJyYXkgb2YgMkQgcG9pbnRzLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGFyZWEuXHJcblx0ICovXHJcblx0c3RhdGljIGFyZWEoIGNvbnRvdXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgbiA9IGNvbnRvdXIubGVuZ3RoO1xyXG5cdFx0bGV0IGEgPSAwLjA7XHJcblxyXG5cdFx0Zm9yICggbGV0IHAgPSBuIC0gMSwgcSA9IDA7IHEgPCBuOyBwID0gcSArKyApIHtcclxuXHJcblx0XHRcdGEgKz0gY29udG91clsgcCBdLnggKiBjb250b3VyWyBxIF0ueSAtIGNvbnRvdXJbIHEgXS54ICogY29udG91clsgcCBdLnk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBhICogMC41O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBnaXZlbiBjb250b3VyIHVzZXMgYSBjbG9ja3dpc2Ugd2luZGluZyBvcmRlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8VmVjdG9yMj59IHB0cyAtIEFuIGFycmF5IG9mIDJEIHBvaW50cyBkZWZpbmluZyBhIHBvbHlnb24uXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZ2l2ZW4gY29udG91ciB1c2VzIGEgY2xvY2t3aXNlIHdpbmRpbmcgb3JkZXIgb3Igbm90LlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBpc0Nsb2NrV2lzZSggcHRzICkge1xyXG5cclxuXHRcdHJldHVybiBTaGFwZVV0aWxzLmFyZWEoIHB0cyApIDwgMDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUcmlhbmd1bGF0ZXMgdGhlIGdpdmVuIHNoYXBlIGRlZmluaXRpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PFZlY3RvcjI+fSBjb250b3VyIC0gQW4gYXJyYXkgb2YgMkQgcG9pbnRzIGRlZmluaW5nIHRoZSBjb250b3VyLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8QXJyYXk8VmVjdG9yMj4+fSBob2xlcyAtIEFuIGFycmF5IHRoYXQgaG9sZHMgYXJyYXlzIG9mIDJEIHBvaW50cyBkZWZpbmluZyB0aGUgaG9sZXMuXHJcblx0ICogQHJldHVybiB7QXJyYXk8QXJyYXk8bnVtYmVyPj59IEFuIGFycmF5IHRoYXQgaG9sZHMgZm9yIGVhY2ggZmFjZSBkZWZpbml0aW9uIGFuIGFycmF5IHdpdGggdGhyZWUgaW5kaWNlcy5cclxuXHQgKi9cclxuXHRzdGF0aWMgdHJpYW5ndWxhdGVTaGFwZSggY29udG91ciwgaG9sZXMgKSB7XHJcblxyXG5cdFx0Y29uc3QgdmVydGljZXMgPSBbXTsgLy8gZmxhdCBhcnJheSBvZiB2ZXJ0aWNlcyBsaWtlIFsgeDAseTAsIHgxLHkxLCB4Mix5MiwgLi4uIF1cclxuXHRcdGNvbnN0IGhvbGVJbmRpY2VzID0gW107IC8vIGFycmF5IG9mIGhvbGUgaW5kaWNlc1xyXG5cdFx0Y29uc3QgZmFjZXMgPSBbXTsgLy8gZmluYWwgYXJyYXkgb2YgdmVydGV4IGluZGljZXMgbGlrZSBbIFsgYSxiLGQgXSwgWyBiLGMsZCBdIF1cclxuXHJcblx0XHRyZW1vdmVEdXBFbmRQdHMoIGNvbnRvdXIgKTtcclxuXHRcdGFkZENvbnRvdXIoIHZlcnRpY2VzLCBjb250b3VyICk7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRsZXQgaG9sZUluZGV4ID0gY29udG91ci5sZW5ndGg7XHJcblxyXG5cdFx0aG9sZXMuZm9yRWFjaCggcmVtb3ZlRHVwRW5kUHRzICk7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgaG9sZXMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0aG9sZUluZGljZXMucHVzaCggaG9sZUluZGV4ICk7XHJcblx0XHRcdGhvbGVJbmRleCArPSBob2xlc1sgaSBdLmxlbmd0aDtcclxuXHRcdFx0YWRkQ29udG91ciggdmVydGljZXMsIGhvbGVzWyBpIF0gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCB0cmlhbmdsZXMgPSBFYXJjdXQudHJpYW5ndWxhdGUoIHZlcnRpY2VzLCBob2xlSW5kaWNlcyApO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdHJpYW5nbGVzLmxlbmd0aDsgaSArPSAzICkge1xyXG5cclxuXHRcdFx0ZmFjZXMucHVzaCggdHJpYW5nbGVzLnNsaWNlKCBpLCBpICsgMyApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBmYWNlcztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gcmVtb3ZlRHVwRW5kUHRzKCBwb2ludHMgKSB7XHJcblxyXG5cdGNvbnN0IGwgPSBwb2ludHMubGVuZ3RoO1xyXG5cclxuXHRpZiAoIGwgPiAyICYmIHBvaW50c1sgbCAtIDEgXS5lcXVhbHMoIHBvaW50c1sgMCBdICkgKSB7XHJcblxyXG5cdFx0cG9pbnRzLnBvcCgpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBhZGRDb250b3VyKCB2ZXJ0aWNlcywgY29udG91ciApIHtcclxuXHJcblx0Zm9yICggbGV0IGkgPSAwOyBpIDwgY29udG91ci5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0dmVydGljZXMucHVzaCggY29udG91clsgaSBdLnggKTtcclxuXHRcdHZlcnRpY2VzLnB1c2goIGNvbnRvdXJbIGkgXS55ICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFNoYXBlVXRpbHMgfTtcclxuIiwiaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcclxuaW1wb3J0IHsgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyQXR0cmlidXRlLmpzJztcclxuaW1wb3J0ICogYXMgQ3VydmVzIGZyb20gJy4uL2V4dHJhcy9jdXJ2ZXMvQ3VydmVzLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uL21hdGgvVmVjdG9yMi5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBTaGFwZSB9IGZyb20gJy4uL2V4dHJhcy9jb3JlL1NoYXBlLmpzJztcclxuaW1wb3J0IHsgU2hhcGVVdGlscyB9IGZyb20gJy4uL2V4dHJhcy9TaGFwZVV0aWxzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGV4dHJ1ZGVkIGdlb21ldHJ5IGZyb20gYSBwYXRoIHNoYXBlLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBsZW5ndGggPSAxMiwgd2lkdGggPSA4O1xyXG4gKlxyXG4gKiBjb25zdCBzaGFwZSA9IG5ldyBUSFJFRS5TaGFwZSgpO1xyXG4gKiBzaGFwZS5tb3ZlVG8oIDAsMCApO1xyXG4gKiBzaGFwZS5saW5lVG8oIDAsIHdpZHRoICk7XHJcbiAqIHNoYXBlLmxpbmVUbyggbGVuZ3RoLCB3aWR0aCApO1xyXG4gKiBzaGFwZS5saW5lVG8oIGxlbmd0aCwgMCApO1xyXG4gKiBzaGFwZS5saW5lVG8oIDAsIDAgKTtcclxuICpcclxuICogY29uc3QgZ2VvbWV0cnkgPSBuZXcgVEhSRUUuRXh0cnVkZUdlb21ldHJ5KCBzaGFwZSApO1xyXG4gKiBjb25zdCBtYXRlcmlhbCA9IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogMHgwMGZmMDAgfSApO1xyXG4gKiBjb25zdCBtZXNoID0gbmV3IFRIUkVFLk1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApIDtcclxuICogc2NlbmUuYWRkKCBtZXNoICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQnVmZmVyR2VvbWV0cnlcclxuICovXHJcbmNsYXNzIEV4dHJ1ZGVHZW9tZXRyeSBleHRlbmRzIEJ1ZmZlckdlb21ldHJ5IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBleHRydWRlIGdlb21ldHJ5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTaGFwZXxBcnJheTxTaGFwZT59IFtzaGFwZXNdIC0gQSBzaGFwZSBvciBhbiBhcnJheSBvZiBzaGFwZXMuXHJcblx0ICogQHBhcmFtIHtFeHRydWRlR2VvbWV0cnl+T3B0aW9uc30gW29wdGlvbnNdIC0gVGhlIGV4dHJ1ZGUgc2V0dGluZ3MuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHNoYXBlcyA9IG5ldyBTaGFwZSggWyBuZXcgVmVjdG9yMiggMC41LCAwLjUgKSwgbmV3IFZlY3RvcjIoIC0gMC41LCAwLjUgKSwgbmV3IFZlY3RvcjIoIC0gMC41LCAtIDAuNSApLCBuZXcgVmVjdG9yMiggMC41LCAtIDAuNSApIF0gKSwgb3B0aW9ucyA9IHt9ICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ0V4dHJ1ZGVHZW9tZXRyeSc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb2xkcyB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVycyB0aGF0IGhhdmUgYmVlblxyXG5cdFx0ICogdXNlZCB0byBnZW5lcmF0ZSB0aGUgZ2VvbWV0cnkuIEFueSBtb2RpZmljYXRpb25cclxuXHRcdCAqIGFmdGVyIGluc3RhbnRpYXRpb24gZG9lcyBub3QgY2hhbmdlIHRoZSBnZW9tZXRyeS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBhcmFtZXRlcnMgPSB7XHJcblx0XHRcdHNoYXBlczogc2hhcGVzLFxyXG5cdFx0XHRvcHRpb25zOiBvcHRpb25zXHJcblx0XHR9O1xyXG5cclxuXHRcdHNoYXBlcyA9IEFycmF5LmlzQXJyYXkoIHNoYXBlcyApID8gc2hhcGVzIDogWyBzaGFwZXMgXTtcclxuXHJcblx0XHRjb25zdCBzY29wZSA9IHRoaXM7XHJcblxyXG5cdFx0Y29uc3QgdmVydGljZXNBcnJheSA9IFtdO1xyXG5cdFx0Y29uc3QgdXZBcnJheSA9IFtdO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHNoYXBlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgc2hhcGUgPSBzaGFwZXNbIGkgXTtcclxuXHRcdFx0YWRkU2hhcGUoIHNoYXBlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGJ1aWxkIGdlb21ldHJ5XHJcblxyXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlc0FycmF5LCAzICkgKTtcclxuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZBcnJheSwgMiApICk7XHJcblxyXG5cdFx0dGhpcy5jb21wdXRlVmVydGV4Tm9ybWFscygpO1xyXG5cclxuXHRcdC8vIGZ1bmN0aW9uc1xyXG5cclxuXHRcdGZ1bmN0aW9uIGFkZFNoYXBlKCBzaGFwZSApIHtcclxuXHJcblx0XHRcdGNvbnN0IHBsYWNlaG9sZGVyID0gW107XHJcblxyXG5cdFx0XHQvLyBvcHRpb25zXHJcblxyXG5cdFx0XHRjb25zdCBjdXJ2ZVNlZ21lbnRzID0gb3B0aW9ucy5jdXJ2ZVNlZ21lbnRzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmN1cnZlU2VnbWVudHMgOiAxMjtcclxuXHRcdFx0Y29uc3Qgc3RlcHMgPSBvcHRpb25zLnN0ZXBzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLnN0ZXBzIDogMTtcclxuXHRcdFx0Y29uc3QgZGVwdGggPSBvcHRpb25zLmRlcHRoICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmRlcHRoIDogMTtcclxuXHJcblx0XHRcdGxldCBiZXZlbEVuYWJsZWQgPSBvcHRpb25zLmJldmVsRW5hYmxlZCAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5iZXZlbEVuYWJsZWQgOiB0cnVlO1xyXG5cdFx0XHRsZXQgYmV2ZWxUaGlja25lc3MgPSBvcHRpb25zLmJldmVsVGhpY2tuZXNzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJldmVsVGhpY2tuZXNzIDogMC4yO1xyXG5cdFx0XHRsZXQgYmV2ZWxTaXplID0gb3B0aW9ucy5iZXZlbFNpemUgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuYmV2ZWxTaXplIDogYmV2ZWxUaGlja25lc3MgLSAwLjE7XHJcblx0XHRcdGxldCBiZXZlbE9mZnNldCA9IG9wdGlvbnMuYmV2ZWxPZmZzZXQgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuYmV2ZWxPZmZzZXQgOiAwO1xyXG5cdFx0XHRsZXQgYmV2ZWxTZWdtZW50cyA9IG9wdGlvbnMuYmV2ZWxTZWdtZW50cyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5iZXZlbFNlZ21lbnRzIDogMztcclxuXHJcblx0XHRcdGNvbnN0IGV4dHJ1ZGVQYXRoID0gb3B0aW9ucy5leHRydWRlUGF0aDtcclxuXHJcblx0XHRcdGNvbnN0IHV2Z2VuID0gb3B0aW9ucy5VVkdlbmVyYXRvciAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5VVkdlbmVyYXRvciA6IFdvcmxkVVZHZW5lcmF0b3I7XHJcblxyXG5cdFx0XHQvL1xyXG5cclxuXHRcdFx0bGV0IGV4dHJ1ZGVQdHMsIGV4dHJ1ZGVCeVBhdGggPSBmYWxzZTtcclxuXHRcdFx0bGV0IHNwbGluZVR1YmUsIGJpbm9ybWFsLCBub3JtYWwsIHBvc2l0aW9uMjtcclxuXHJcblx0XHRcdGlmICggZXh0cnVkZVBhdGggKSB7XHJcblxyXG5cdFx0XHRcdGV4dHJ1ZGVQdHMgPSBleHRydWRlUGF0aC5nZXRTcGFjZWRQb2ludHMoIHN0ZXBzICk7XHJcblxyXG5cdFx0XHRcdGV4dHJ1ZGVCeVBhdGggPSB0cnVlO1xyXG5cdFx0XHRcdGJldmVsRW5hYmxlZCA9IGZhbHNlOyAvLyBiZXZlbHMgbm90IHN1cHBvcnRlZCBmb3IgcGF0aCBleHRydXNpb25cclxuXHJcblx0XHRcdFx0Ly8gU0VUVVAgVE5CIHZhcmlhYmxlc1xyXG5cclxuXHRcdFx0XHQvLyBUT0RPMSAtIGhhdmUgYSAuaXNDbG9zZWQgaW4gc3BsaW5lP1xyXG5cclxuXHRcdFx0XHRzcGxpbmVUdWJlID0gZXh0cnVkZVBhdGguY29tcHV0ZUZyZW5ldEZyYW1lcyggc3RlcHMsIGZhbHNlICk7XHJcblxyXG5cdFx0XHRcdC8vIGNvbnNvbGUubG9nKHNwbGluZVR1YmUsICdzcGxpbmVUdWJlJywgc3BsaW5lVHViZS5ub3JtYWxzLmxlbmd0aCwgJ3N0ZXBzJywgc3RlcHMsICdleHRydWRlUHRzJywgZXh0cnVkZVB0cy5sZW5ndGgpO1xyXG5cclxuXHRcdFx0XHRiaW5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XHJcblx0XHRcdFx0bm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcclxuXHRcdFx0XHRwb3NpdGlvbjIgPSBuZXcgVmVjdG9yMygpO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gU2FmZWd1YXJkcyBpZiBiZXZlbHMgYXJlIG5vdCBlbmFibGVkXHJcblxyXG5cdFx0XHRpZiAoICEgYmV2ZWxFbmFibGVkICkge1xyXG5cclxuXHRcdFx0XHRiZXZlbFNlZ21lbnRzID0gMDtcclxuXHRcdFx0XHRiZXZlbFRoaWNrbmVzcyA9IDA7XHJcblx0XHRcdFx0YmV2ZWxTaXplID0gMDtcclxuXHRcdFx0XHRiZXZlbE9mZnNldCA9IDA7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBWYXJpYWJsZXMgaW5pdGlhbGl6YXRpb25cclxuXHJcblx0XHRcdGNvbnN0IHNoYXBlUG9pbnRzID0gc2hhcGUuZXh0cmFjdFBvaW50cyggY3VydmVTZWdtZW50cyApO1xyXG5cclxuXHRcdFx0bGV0IHZlcnRpY2VzID0gc2hhcGVQb2ludHMuc2hhcGU7XHJcblx0XHRcdGNvbnN0IGhvbGVzID0gc2hhcGVQb2ludHMuaG9sZXM7XHJcblxyXG5cdFx0XHRjb25zdCByZXZlcnNlID0gISBTaGFwZVV0aWxzLmlzQ2xvY2tXaXNlKCB2ZXJ0aWNlcyApO1xyXG5cclxuXHRcdFx0aWYgKCByZXZlcnNlICkge1xyXG5cclxuXHRcdFx0XHR2ZXJ0aWNlcyA9IHZlcnRpY2VzLnJldmVyc2UoKTtcclxuXHJcblx0XHRcdFx0Ly8gTWF5YmUgd2Ugc2hvdWxkIGFsc28gY2hlY2sgaWYgaG9sZXMgYXJlIGluIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb24sIGp1c3QgdG8gYmUgc2FmZSAuLi5cclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGggPSAwLCBobCA9IGhvbGVzLmxlbmd0aDsgaCA8IGhsOyBoICsrICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGFob2xlID0gaG9sZXNbIGggXTtcclxuXHJcblx0XHRcdFx0XHRpZiAoIFNoYXBlVXRpbHMuaXNDbG9ja1dpc2UoIGFob2xlICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRob2xlc1sgaCBdID0gYWhvbGUucmV2ZXJzZSgpO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0LyoqTWVyZ2VzIGluZGV4LWFkamFjZW50IHBvaW50cyB0aGF0IGFyZSB3aXRoaW4gYSB0aHJlc2hvbGQgZGlzdGFuY2Ugb2YgZWFjaCBvdGhlci4gQXJyYXkgaXMgbW9kaWZpZWQgaW4tcGxhY2UuIFRocmVzaG9sZCBkaXN0YW5jZSBpcyBlbXBpcmljYWwsIGFuZCBzY2FsZWQgYmFzZWQgb24gdGhlIG1hZ25pdHVkZSBvZiBwb2ludCBjb29yZGluYXRlcy5cclxuXHRcdFx0ICogQHBhcmFtIHtBcnJheTxWZWN0b3IyPn0gcG9pbnRzXHJcblx0XHRcdCovXHJcblx0XHRcdGZ1bmN0aW9uIG1lcmdlT3ZlcmxhcHBpbmdQb2ludHMoIHBvaW50cyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgVEhSRVNIT0xEID0gMWUtMTA7XHJcblx0XHRcdFx0Y29uc3QgVEhSRVNIT0xEX1NRID0gVEhSRVNIT0xEICogVEhSRVNIT0xEO1xyXG5cdFx0XHRcdGxldCBwcmV2UG9zID0gcG9pbnRzWyAwIF07XHJcblx0XHRcdFx0Zm9yICggbGV0IGkgPSAxOyBpIDw9IHBvaW50cy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgY3VycmVudEluZGV4ID0gaSAlIHBvaW50cy5sZW5ndGg7XHJcblx0XHRcdFx0XHRjb25zdCBjdXJyZW50UG9zID0gcG9pbnRzWyBjdXJyZW50SW5kZXggXTtcclxuXHRcdFx0XHRcdGNvbnN0IGR4ID0gY3VycmVudFBvcy54IC0gcHJldlBvcy54O1xyXG5cdFx0XHRcdFx0Y29uc3QgZHkgPSBjdXJyZW50UG9zLnkgLSBwcmV2UG9zLnk7XHJcblx0XHRcdFx0XHRjb25zdCBkaXN0U3EgPSBkeCAqIGR4ICsgZHkgKiBkeTtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBzY2FsaW5nRmFjdG9yU3FydCA9IE1hdGgubWF4KFxyXG5cdFx0XHRcdFx0XHRNYXRoLmFicyggY3VycmVudFBvcy54ICksXHJcblx0XHRcdFx0XHRcdE1hdGguYWJzKCBjdXJyZW50UG9zLnkgKSxcclxuXHRcdFx0XHRcdFx0TWF0aC5hYnMoIHByZXZQb3MueCApLFxyXG5cdFx0XHRcdFx0XHRNYXRoLmFicyggcHJldlBvcy55IClcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRjb25zdCB0aGVzaG9sZFNxU2NhbGVkID0gVEhSRVNIT0xEX1NRICogc2NhbGluZ0ZhY3RvclNxcnQgKiBzY2FsaW5nRmFjdG9yU3FydDtcclxuXHRcdFx0XHRcdGlmICggZGlzdFNxIDw9IHRoZXNob2xkU3FTY2FsZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRwb2ludHMuc3BsaWNlKCBjdXJyZW50SW5kZXgsIDEgKTtcclxuXHRcdFx0XHRcdFx0aSAtLTtcclxuXHRcdFx0XHRcdFx0Y29udGludWU7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHByZXZQb3MgPSBjdXJyZW50UG9zO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRtZXJnZU92ZXJsYXBwaW5nUG9pbnRzKCB2ZXJ0aWNlcyApO1xyXG5cdFx0XHRob2xlcy5mb3JFYWNoKCBtZXJnZU92ZXJsYXBwaW5nUG9pbnRzICk7XHJcblxyXG5cdFx0XHRjb25zdCBudW1Ib2xlcyA9IGhvbGVzLmxlbmd0aDtcclxuXHJcblx0XHRcdC8qIFZlcnRpY2VzICovXHJcblxyXG5cdFx0XHRjb25zdCBjb250b3VyID0gdmVydGljZXM7IC8vIHZlcnRpY2VzIGhhcyBhbGwgcG9pbnRzIGJ1dCBjb250b3VyIGhhcyBvbmx5IHBvaW50cyBvZiBjaXJjdW1mZXJlbmNlXHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaCA9IDA7IGggPCBudW1Ib2xlczsgaCArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgYWhvbGUgPSBob2xlc1sgaCBdO1xyXG5cclxuXHRcdFx0XHR2ZXJ0aWNlcyA9IHZlcnRpY2VzLmNvbmNhdCggYWhvbGUgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblxyXG5cdFx0XHRmdW5jdGlvbiBzY2FsZVB0MiggcHQsIHZlYywgc2l6ZSApIHtcclxuXHJcblx0XHRcdFx0aWYgKCAhIHZlYyApIGNvbnNvbGUuZXJyb3IoICdUSFJFRS5FeHRydWRlR2VvbWV0cnk6IHZlYyBkb2VzIG5vdCBleGlzdCcgKTtcclxuXHJcblx0XHRcdFx0cmV0dXJuIHB0LmNsb25lKCkuYWRkU2NhbGVkVmVjdG9yKCB2ZWMsIHNpemUgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IHZsZW4gPSB2ZXJ0aWNlcy5sZW5ndGg7XHJcblxyXG5cclxuXHRcdFx0Ly8gRmluZCBkaXJlY3Rpb25zIGZvciBwb2ludCBtb3ZlbWVudFxyXG5cclxuXHJcblx0XHRcdGZ1bmN0aW9uIGdldEJldmVsVmVjKCBpblB0LCBpblByZXYsIGluTmV4dCApIHtcclxuXHJcblx0XHRcdFx0Ly8gY29tcHV0ZXMgZm9yIGluUHQgdGhlIGNvcnJlc3BvbmRpbmcgcG9pbnQgaW5QdCcgb24gYSBuZXcgY29udG91clxyXG5cdFx0XHRcdC8vICAgc2hpZnRlZCBieSAxIHVuaXQgKGxlbmd0aCBvZiBub3JtYWxpemVkIHZlY3RvcikgdG8gdGhlIGxlZnRcclxuXHRcdFx0XHQvLyBpZiB3ZSB3YWxrIGFsb25nIGNvbnRvdXIgY2xvY2t3aXNlLCB0aGlzIG5ldyBjb250b3VyIGlzIG91dHNpZGUgdGhlIG9sZCBvbmVcclxuXHRcdFx0XHQvL1xyXG5cdFx0XHRcdC8vIGluUHQnIGlzIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIHR3byBsaW5lcyBwYXJhbGxlbCB0byB0aGUgdHdvXHJcblx0XHRcdFx0Ly8gIGFkamFjZW50IGVkZ2VzIG9mIGluUHQgYXQgYSBkaXN0YW5jZSBvZiAxIHVuaXQgb24gdGhlIGxlZnQgc2lkZS5cclxuXHJcblx0XHRcdFx0bGV0IHZfdHJhbnNfeCwgdl90cmFuc195LCBzaHJpbmtfYnk7IC8vIHJlc3VsdGluZyB0cmFuc2xhdGlvbiB2ZWN0b3IgZm9yIGluUHRcclxuXHJcblx0XHRcdFx0Ly8gZ29vZCByZWFkaW5nIGZvciBnZW9tZXRyeSBhbGdvcml0aG1zIChoZXJlOiBsaW5lLWxpbmUgaW50ZXJzZWN0aW9uKVxyXG5cdFx0XHRcdC8vIGh0dHA6Ly9nZW9tYWxnb3JpdGhtcy5jb20vYTA1LV9pbnRlcnNlY3QtMS5odG1sXHJcblxyXG5cdFx0XHRcdGNvbnN0IHZfcHJldl94ID0gaW5QdC54IC0gaW5QcmV2LngsXHJcblx0XHRcdFx0XHR2X3ByZXZfeSA9IGluUHQueSAtIGluUHJldi55O1xyXG5cdFx0XHRcdGNvbnN0IHZfbmV4dF94ID0gaW5OZXh0LnggLSBpblB0LngsXHJcblx0XHRcdFx0XHR2X25leHRfeSA9IGluTmV4dC55IC0gaW5QdC55O1xyXG5cclxuXHRcdFx0XHRjb25zdCB2X3ByZXZfbGVuc3EgPSAoIHZfcHJldl94ICogdl9wcmV2X3ggKyB2X3ByZXZfeSAqIHZfcHJldl95ICk7XHJcblxyXG5cdFx0XHRcdC8vIGNoZWNrIGZvciBjb2xsaW5lYXIgZWRnZXNcclxuXHRcdFx0XHRjb25zdCBjb2xsaW5lYXIwID0gKCB2X3ByZXZfeCAqIHZfbmV4dF95IC0gdl9wcmV2X3kgKiB2X25leHRfeCApO1xyXG5cclxuXHRcdFx0XHRpZiAoIE1hdGguYWJzKCBjb2xsaW5lYXIwICkgPiBOdW1iZXIuRVBTSUxPTiApIHtcclxuXHJcblx0XHRcdFx0XHQvLyBub3QgY29sbGluZWFyXHJcblxyXG5cdFx0XHRcdFx0Ly8gbGVuZ3RoIG9mIHZlY3RvcnMgZm9yIG5vcm1hbGl6aW5nXHJcblxyXG5cdFx0XHRcdFx0Y29uc3Qgdl9wcmV2X2xlbiA9IE1hdGguc3FydCggdl9wcmV2X2xlbnNxICk7XHJcblx0XHRcdFx0XHRjb25zdCB2X25leHRfbGVuID0gTWF0aC5zcXJ0KCB2X25leHRfeCAqIHZfbmV4dF94ICsgdl9uZXh0X3kgKiB2X25leHRfeSApO1xyXG5cclxuXHRcdFx0XHRcdC8vIHNoaWZ0IGFkamFjZW50IHBvaW50cyBieSB1bml0IHZlY3RvcnMgdG8gdGhlIGxlZnRcclxuXHJcblx0XHRcdFx0XHRjb25zdCBwdFByZXZTaGlmdF94ID0gKCBpblByZXYueCAtIHZfcHJldl95IC8gdl9wcmV2X2xlbiApO1xyXG5cdFx0XHRcdFx0Y29uc3QgcHRQcmV2U2hpZnRfeSA9ICggaW5QcmV2LnkgKyB2X3ByZXZfeCAvIHZfcHJldl9sZW4gKTtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBwdE5leHRTaGlmdF94ID0gKCBpbk5leHQueCAtIHZfbmV4dF95IC8gdl9uZXh0X2xlbiApO1xyXG5cdFx0XHRcdFx0Y29uc3QgcHROZXh0U2hpZnRfeSA9ICggaW5OZXh0LnkgKyB2X25leHRfeCAvIHZfbmV4dF9sZW4gKTtcclxuXHJcblx0XHRcdFx0XHQvLyBzY2FsaW5nIGZhY3RvciBmb3Igdl9wcmV2IHRvIGludGVyc2VjdGlvbiBwb2ludFxyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHNmID0gKCAoIHB0TmV4dFNoaWZ0X3ggLSBwdFByZXZTaGlmdF94ICkgKiB2X25leHRfeSAtXHJcblx0XHRcdFx0XHRcdFx0KCBwdE5leHRTaGlmdF95IC0gcHRQcmV2U2hpZnRfeSApICogdl9uZXh0X3ggKSAvXHJcblx0XHRcdFx0XHRcdCggdl9wcmV2X3ggKiB2X25leHRfeSAtIHZfcHJldl95ICogdl9uZXh0X3ggKTtcclxuXHJcblx0XHRcdFx0XHQvLyB2ZWN0b3IgZnJvbSBpblB0IHRvIGludGVyc2VjdGlvbiBwb2ludFxyXG5cclxuXHRcdFx0XHRcdHZfdHJhbnNfeCA9ICggcHRQcmV2U2hpZnRfeCArIHZfcHJldl94ICogc2YgLSBpblB0LnggKTtcclxuXHRcdFx0XHRcdHZfdHJhbnNfeSA9ICggcHRQcmV2U2hpZnRfeSArIHZfcHJldl95ICogc2YgLSBpblB0LnkgKTtcclxuXHJcblx0XHRcdFx0XHQvLyBEb24ndCBub3JtYWxpemUhLCBvdGhlcndpc2Ugc2hhcnAgY29ybmVycyBiZWNvbWUgdWdseVxyXG5cdFx0XHRcdFx0Ly8gIGJ1dCBwcmV2ZW50IGNyYXp5IHNwaWtlc1xyXG5cdFx0XHRcdFx0Y29uc3Qgdl90cmFuc19sZW5zcSA9ICggdl90cmFuc194ICogdl90cmFuc194ICsgdl90cmFuc195ICogdl90cmFuc195ICk7XHJcblx0XHRcdFx0XHRpZiAoIHZfdHJhbnNfbGVuc3EgPD0gMiApIHtcclxuXHJcblx0XHRcdFx0XHRcdHJldHVybiBuZXcgVmVjdG9yMiggdl90cmFuc194LCB2X3RyYW5zX3kgKTtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0c2hyaW5rX2J5ID0gTWF0aC5zcXJ0KCB2X3RyYW5zX2xlbnNxIC8gMiApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHQvLyBoYW5kbGUgc3BlY2lhbCBjYXNlIG9mIGNvbGxpbmVhciBlZGdlc1xyXG5cclxuXHRcdFx0XHRcdGxldCBkaXJlY3Rpb25fZXEgPSBmYWxzZTsgLy8gYXNzdW1lczogb3Bwb3NpdGVcclxuXHJcblx0XHRcdFx0XHRpZiAoIHZfcHJldl94ID4gTnVtYmVyLkVQU0lMT04gKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIHZfbmV4dF94ID4gTnVtYmVyLkVQU0lMT04gKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGRpcmVjdGlvbl9lcSA9IHRydWU7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggdl9wcmV2X3ggPCAtIE51bWJlci5FUFNJTE9OICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoIHZfbmV4dF94IDwgLSBOdW1iZXIuRVBTSUxPTiApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRkaXJlY3Rpb25fZXEgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoIE1hdGguc2lnbiggdl9wcmV2X3kgKSA9PT0gTWF0aC5zaWduKCB2X25leHRfeSApICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGRpcmVjdGlvbl9lcSA9IHRydWU7XHJcblxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBkaXJlY3Rpb25fZXEgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBjb25zb2xlLmxvZyhcIldhcm5pbmc6IGxpbmVzIGFyZSBhIHN0cmFpZ2h0IHNlcXVlbmNlXCIpO1xyXG5cdFx0XHRcdFx0XHR2X3RyYW5zX3ggPSAtIHZfcHJldl95O1xyXG5cdFx0XHRcdFx0XHR2X3RyYW5zX3kgPSB2X3ByZXZfeDtcclxuXHRcdFx0XHRcdFx0c2hyaW5rX2J5ID0gTWF0aC5zcXJ0KCB2X3ByZXZfbGVuc3EgKTtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0Ly8gY29uc29sZS5sb2coXCJXYXJuaW5nOiBsaW5lcyBhcmUgYSBzdHJhaWdodCBzcGlrZVwiKTtcclxuXHRcdFx0XHRcdFx0dl90cmFuc194ID0gdl9wcmV2X3g7XHJcblx0XHRcdFx0XHRcdHZfdHJhbnNfeSA9IHZfcHJldl95O1xyXG5cdFx0XHRcdFx0XHRzaHJpbmtfYnkgPSBNYXRoLnNxcnQoIHZfcHJldl9sZW5zcSAvIDIgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0cmV0dXJuIG5ldyBWZWN0b3IyKCB2X3RyYW5zX3ggLyBzaHJpbmtfYnksIHZfdHJhbnNfeSAvIHNocmlua19ieSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHJcblx0XHRcdGNvbnN0IGNvbnRvdXJNb3ZlbWVudHMgPSBbXTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBjb250b3VyLmxlbmd0aCwgaiA9IGlsIC0gMSwgayA9IGkgKyAxOyBpIDwgaWw7IGkgKyssIGogKyssIGsgKysgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggaiA9PT0gaWwgKSBqID0gMDtcclxuXHRcdFx0XHRpZiAoIGsgPT09IGlsICkgayA9IDA7XHJcblxyXG5cdFx0XHRcdC8vICAoaiktLS0oaSktLS0oaylcclxuXHRcdFx0XHQvLyBjb25zb2xlLmxvZygnaSxqLGsnLCBpLCBqICwgaylcclxuXHJcblx0XHRcdFx0Y29udG91ck1vdmVtZW50c1sgaSBdID0gZ2V0QmV2ZWxWZWMoIGNvbnRvdXJbIGkgXSwgY29udG91clsgaiBdLCBjb250b3VyWyBrIF0gKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IGhvbGVzTW92ZW1lbnRzID0gW107XHJcblx0XHRcdGxldCBvbmVIb2xlTW92ZW1lbnRzLCB2ZXJ0aWNlc01vdmVtZW50cyA9IGNvbnRvdXJNb3ZlbWVudHMuY29uY2F0KCk7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaCA9IDAsIGhsID0gbnVtSG9sZXM7IGggPCBobDsgaCArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgYWhvbGUgPSBob2xlc1sgaCBdO1xyXG5cclxuXHRcdFx0XHRvbmVIb2xlTW92ZW1lbnRzID0gW107XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBhaG9sZS5sZW5ndGgsIGogPSBpbCAtIDEsIGsgPSBpICsgMTsgaSA8IGlsOyBpICsrLCBqICsrLCBrICsrICkge1xyXG5cclxuXHRcdFx0XHRcdGlmICggaiA9PT0gaWwgKSBqID0gMDtcclxuXHRcdFx0XHRcdGlmICggayA9PT0gaWwgKSBrID0gMDtcclxuXHJcblx0XHRcdFx0XHQvLyAgKGopLS0tKGkpLS0tKGspXHJcblx0XHRcdFx0XHRvbmVIb2xlTW92ZW1lbnRzWyBpIF0gPSBnZXRCZXZlbFZlYyggYWhvbGVbIGkgXSwgYWhvbGVbIGogXSwgYWhvbGVbIGsgXSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGhvbGVzTW92ZW1lbnRzLnB1c2goIG9uZUhvbGVNb3ZlbWVudHMgKTtcclxuXHRcdFx0XHR2ZXJ0aWNlc01vdmVtZW50cyA9IHZlcnRpY2VzTW92ZW1lbnRzLmNvbmNhdCggb25lSG9sZU1vdmVtZW50cyApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgY29udHJhY3RlZENvbnRvdXJWZXJ0aWNlcyA9IFtdO1xyXG5cdFx0XHRjb25zdCBleHBhbmRlZEhvbGVWZXJ0aWNlcyA9IFtdO1xyXG5cclxuXHRcdFx0Ly8gTG9vcCBiZXZlbFNlZ21lbnRzLCAxIGZvciB0aGUgZnJvbnQsIDEgZm9yIHRoZSBiYWNrXHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgYiA9IDA7IGIgPCBiZXZlbFNlZ21lbnRzOyBiICsrICkge1xyXG5cclxuXHRcdFx0XHQvL2ZvciAoIGIgPSBiZXZlbFNlZ21lbnRzOyBiID4gMDsgYiAtLSApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgdCA9IGIgLyBiZXZlbFNlZ21lbnRzO1xyXG5cdFx0XHRcdGNvbnN0IHogPSBiZXZlbFRoaWNrbmVzcyAqIE1hdGguY29zKCB0ICogTWF0aC5QSSAvIDIgKTtcclxuXHRcdFx0XHRjb25zdCBicyA9IGJldmVsU2l6ZSAqIE1hdGguc2luKCB0ICogTWF0aC5QSSAvIDIgKSArIGJldmVsT2Zmc2V0O1xyXG5cclxuXHRcdFx0XHQvLyBjb250cmFjdCBzaGFwZVxyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gY29udG91ci5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCB2ZXJ0ID0gc2NhbGVQdDIoIGNvbnRvdXJbIGkgXSwgY29udG91ck1vdmVtZW50c1sgaSBdLCBicyApO1xyXG5cclxuXHRcdFx0XHRcdHYoIHZlcnQueCwgdmVydC55LCAtIHogKTtcclxuXHRcdFx0XHRcdGlmICggdCA9PSAwICkgY29udHJhY3RlZENvbnRvdXJWZXJ0aWNlcy5wdXNoKCB2ZXJ0ICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Ly8gZXhwYW5kIGhvbGVzXHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBoID0gMCwgaGwgPSBudW1Ib2xlczsgaCA8IGhsOyBoICsrICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGFob2xlID0gaG9sZXNbIGggXTtcclxuXHRcdFx0XHRcdG9uZUhvbGVNb3ZlbWVudHMgPSBob2xlc01vdmVtZW50c1sgaCBdO1xyXG5cdFx0XHRcdFx0Y29uc3Qgb25lSG9sZVZlcnRpY2VzID0gW107XHJcblx0XHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gYWhvbGUubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCB2ZXJ0ID0gc2NhbGVQdDIoIGFob2xlWyBpIF0sIG9uZUhvbGVNb3ZlbWVudHNbIGkgXSwgYnMgKTtcclxuXHJcblx0XHRcdFx0XHRcdHYoIHZlcnQueCwgdmVydC55LCAtIHogKTtcclxuXHRcdFx0XHRcdFx0aWYgKCB0ID09IDAgKSBvbmVIb2xlVmVydGljZXMucHVzaCggdmVydCApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRpZiAoIHQgPT0gMCApIGV4cGFuZGVkSG9sZVZlcnRpY2VzLnB1c2goIG9uZUhvbGVWZXJ0aWNlcyApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBmYWNlcyA9IFNoYXBlVXRpbHMudHJpYW5ndWxhdGVTaGFwZSggY29udHJhY3RlZENvbnRvdXJWZXJ0aWNlcywgZXhwYW5kZWRIb2xlVmVydGljZXMgKTtcclxuXHJcblx0XHRcdGNvbnN0IGZsZW4gPSBmYWNlcy5sZW5ndGg7XHJcblxyXG5cdFx0XHRjb25zdCBicyA9IGJldmVsU2l6ZSArIGJldmVsT2Zmc2V0O1xyXG5cclxuXHRcdFx0Ly8gQmFjayBmYWNpbmcgdmVydGljZXNcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHZsZW47IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHZlcnQgPSBiZXZlbEVuYWJsZWQgPyBzY2FsZVB0MiggdmVydGljZXNbIGkgXSwgdmVydGljZXNNb3ZlbWVudHNbIGkgXSwgYnMgKSA6IHZlcnRpY2VzWyBpIF07XHJcblxyXG5cdFx0XHRcdGlmICggISBleHRydWRlQnlQYXRoICkge1xyXG5cclxuXHRcdFx0XHRcdHYoIHZlcnQueCwgdmVydC55LCAwICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gdiggdmVydC54LCB2ZXJ0LnkgKyBleHRydWRlUHRzWyAwIF0ueSwgZXh0cnVkZVB0c1sgMCBdLnggKTtcclxuXHJcblx0XHRcdFx0XHRub3JtYWwuY29weSggc3BsaW5lVHViZS5ub3JtYWxzWyAwIF0gKS5tdWx0aXBseVNjYWxhciggdmVydC54ICk7XHJcblx0XHRcdFx0XHRiaW5vcm1hbC5jb3B5KCBzcGxpbmVUdWJlLmJpbm9ybWFsc1sgMCBdICkubXVsdGlwbHlTY2FsYXIoIHZlcnQueSApO1xyXG5cclxuXHRcdFx0XHRcdHBvc2l0aW9uMi5jb3B5KCBleHRydWRlUHRzWyAwIF0gKS5hZGQoIG5vcm1hbCApLmFkZCggYmlub3JtYWwgKTtcclxuXHJcblx0XHRcdFx0XHR2KCBwb3NpdGlvbjIueCwgcG9zaXRpb24yLnksIHBvc2l0aW9uMi56ICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIEFkZCBzdGVwcGVkIHZlcnRpY2VzLi4uXHJcblx0XHRcdC8vIEluY2x1ZGluZyBmcm9udCBmYWNpbmcgdmVydGljZXNcclxuXHJcblx0XHRcdGZvciAoIGxldCBzID0gMTsgcyA8PSBzdGVwczsgcyArKyApIHtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdmxlbjsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCB2ZXJ0ID0gYmV2ZWxFbmFibGVkID8gc2NhbGVQdDIoIHZlcnRpY2VzWyBpIF0sIHZlcnRpY2VzTW92ZW1lbnRzWyBpIF0sIGJzICkgOiB2ZXJ0aWNlc1sgaSBdO1xyXG5cclxuXHRcdFx0XHRcdGlmICggISBleHRydWRlQnlQYXRoICkge1xyXG5cclxuXHRcdFx0XHRcdFx0diggdmVydC54LCB2ZXJ0LnksIGRlcHRoIC8gc3RlcHMgKiBzICk7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdC8vIHYoIHZlcnQueCwgdmVydC55ICsgZXh0cnVkZVB0c1sgcyAtIDEgXS55LCBleHRydWRlUHRzWyBzIC0gMSBdLnggKTtcclxuXHJcblx0XHRcdFx0XHRcdG5vcm1hbC5jb3B5KCBzcGxpbmVUdWJlLm5vcm1hbHNbIHMgXSApLm11bHRpcGx5U2NhbGFyKCB2ZXJ0LnggKTtcclxuXHRcdFx0XHRcdFx0Ymlub3JtYWwuY29weSggc3BsaW5lVHViZS5iaW5vcm1hbHNbIHMgXSApLm11bHRpcGx5U2NhbGFyKCB2ZXJ0LnkgKTtcclxuXHJcblx0XHRcdFx0XHRcdHBvc2l0aW9uMi5jb3B5KCBleHRydWRlUHRzWyBzIF0gKS5hZGQoIG5vcm1hbCApLmFkZCggYmlub3JtYWwgKTtcclxuXHJcblx0XHRcdFx0XHRcdHYoIHBvc2l0aW9uMi54LCBwb3NpdGlvbjIueSwgcG9zaXRpb24yLnogKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblxyXG5cdFx0XHQvLyBBZGQgYmV2ZWwgc2VnbWVudHMgcGxhbmVzXHJcblxyXG5cdFx0XHQvL2ZvciAoIGIgPSAxOyBiIDw9IGJldmVsU2VnbWVudHM7IGIgKysgKSB7XHJcblx0XHRcdGZvciAoIGxldCBiID0gYmV2ZWxTZWdtZW50cyAtIDE7IGIgPj0gMDsgYiAtLSApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgdCA9IGIgLyBiZXZlbFNlZ21lbnRzO1xyXG5cdFx0XHRcdGNvbnN0IHogPSBiZXZlbFRoaWNrbmVzcyAqIE1hdGguY29zKCB0ICogTWF0aC5QSSAvIDIgKTtcclxuXHRcdFx0XHRjb25zdCBicyA9IGJldmVsU2l6ZSAqIE1hdGguc2luKCB0ICogTWF0aC5QSSAvIDIgKSArIGJldmVsT2Zmc2V0O1xyXG5cclxuXHRcdFx0XHQvLyBjb250cmFjdCBzaGFwZVxyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gY29udG91ci5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCB2ZXJ0ID0gc2NhbGVQdDIoIGNvbnRvdXJbIGkgXSwgY29udG91ck1vdmVtZW50c1sgaSBdLCBicyApO1xyXG5cdFx0XHRcdFx0diggdmVydC54LCB2ZXJ0LnksIGRlcHRoICsgeiApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8vIGV4cGFuZCBob2xlc1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaCA9IDAsIGhsID0gaG9sZXMubGVuZ3RoOyBoIDwgaGw7IGggKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgYWhvbGUgPSBob2xlc1sgaCBdO1xyXG5cdFx0XHRcdFx0b25lSG9sZU1vdmVtZW50cyA9IGhvbGVzTW92ZW1lbnRzWyBoIF07XHJcblxyXG5cdFx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IGFob2xlLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgdmVydCA9IHNjYWxlUHQyKCBhaG9sZVsgaSBdLCBvbmVIb2xlTW92ZW1lbnRzWyBpIF0sIGJzICk7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoICEgZXh0cnVkZUJ5UGF0aCApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0diggdmVydC54LCB2ZXJ0LnksIGRlcHRoICsgeiApO1xyXG5cclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0diggdmVydC54LCB2ZXJ0LnkgKyBleHRydWRlUHRzWyBzdGVwcyAtIDEgXS55LCBleHRydWRlUHRzWyBzdGVwcyAtIDEgXS54ICsgeiApO1xyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0LyogRmFjZXMgKi9cclxuXHJcblx0XHRcdC8vIFRvcCBhbmQgYm90dG9tIGZhY2VzXHJcblxyXG5cdFx0XHRidWlsZExpZEZhY2VzKCk7XHJcblxyXG5cdFx0XHQvLyBTaWRlcyBmYWNlc1xyXG5cclxuXHRcdFx0YnVpbGRTaWRlRmFjZXMoKTtcclxuXHJcblxyXG5cdFx0XHQvLy8vLyAgSW50ZXJuYWwgZnVuY3Rpb25zXHJcblxyXG5cdFx0XHRmdW5jdGlvbiBidWlsZExpZEZhY2VzKCkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBzdGFydCA9IHZlcnRpY2VzQXJyYXkubGVuZ3RoIC8gMztcclxuXHJcblx0XHRcdFx0aWYgKCBiZXZlbEVuYWJsZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0bGV0IGxheWVyID0gMDsgLy8gc3RlcHMgKyAxXHJcblx0XHRcdFx0XHRsZXQgb2Zmc2V0ID0gdmxlbiAqIGxheWVyO1xyXG5cclxuXHRcdFx0XHRcdC8vIEJvdHRvbSBmYWNlc1xyXG5cclxuXHRcdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGZsZW47IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCBmYWNlID0gZmFjZXNbIGkgXTtcclxuXHRcdFx0XHRcdFx0ZjMoIGZhY2VbIDIgXSArIG9mZnNldCwgZmFjZVsgMSBdICsgb2Zmc2V0LCBmYWNlWyAwIF0gKyBvZmZzZXQgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0bGF5ZXIgPSBzdGVwcyArIGJldmVsU2VnbWVudHMgKiAyO1xyXG5cdFx0XHRcdFx0b2Zmc2V0ID0gdmxlbiAqIGxheWVyO1xyXG5cclxuXHRcdFx0XHRcdC8vIFRvcCBmYWNlc1xyXG5cclxuXHRcdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGZsZW47IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCBmYWNlID0gZmFjZXNbIGkgXTtcclxuXHRcdFx0XHRcdFx0ZjMoIGZhY2VbIDAgXSArIG9mZnNldCwgZmFjZVsgMSBdICsgb2Zmc2V0LCBmYWNlWyAyIF0gKyBvZmZzZXQgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gQm90dG9tIGZhY2VzXHJcblxyXG5cdFx0XHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgZmxlbjsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnN0IGZhY2UgPSBmYWNlc1sgaSBdO1xyXG5cdFx0XHRcdFx0XHRmMyggZmFjZVsgMiBdLCBmYWNlWyAxIF0sIGZhY2VbIDAgXSApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvLyBUb3AgZmFjZXNcclxuXHJcblx0XHRcdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBmbGVuOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgZmFjZSA9IGZhY2VzWyBpIF07XHJcblx0XHRcdFx0XHRcdGYzKCBmYWNlWyAwIF0gKyB2bGVuICogc3RlcHMsIGZhY2VbIDEgXSArIHZsZW4gKiBzdGVwcywgZmFjZVsgMiBdICsgdmxlbiAqIHN0ZXBzICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHNjb3BlLmFkZEdyb3VwKCBzdGFydCwgdmVydGljZXNBcnJheS5sZW5ndGggLyAzIC0gc3RhcnQsIDAgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIENyZWF0ZSBmYWNlcyBmb3IgdGhlIHotc2lkZXMgb2YgdGhlIHNoYXBlXHJcblxyXG5cdFx0XHRmdW5jdGlvbiBidWlsZFNpZGVGYWNlcygpIHtcclxuXHJcblx0XHRcdFx0Y29uc3Qgc3RhcnQgPSB2ZXJ0aWNlc0FycmF5Lmxlbmd0aCAvIDM7XHJcblx0XHRcdFx0bGV0IGxheWVyb2Zmc2V0ID0gMDtcclxuXHRcdFx0XHRzaWRld2FsbHMoIGNvbnRvdXIsIGxheWVyb2Zmc2V0ICk7XHJcblx0XHRcdFx0bGF5ZXJvZmZzZXQgKz0gY29udG91ci5sZW5ndGg7XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBoID0gMCwgaGwgPSBob2xlcy5sZW5ndGg7IGggPCBobDsgaCArKyApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBhaG9sZSA9IGhvbGVzWyBoIF07XHJcblx0XHRcdFx0XHRzaWRld2FsbHMoIGFob2xlLCBsYXllcm9mZnNldCApO1xyXG5cclxuXHRcdFx0XHRcdC8vLCB0cnVlXHJcblx0XHRcdFx0XHRsYXllcm9mZnNldCArPSBhaG9sZS5sZW5ndGg7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblxyXG5cdFx0XHRcdHNjb3BlLmFkZEdyb3VwKCBzdGFydCwgdmVydGljZXNBcnJheS5sZW5ndGggLyAzIC0gc3RhcnQsIDEgKTtcclxuXHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRmdW5jdGlvbiBzaWRld2FsbHMoIGNvbnRvdXIsIGxheWVyb2Zmc2V0ICkge1xyXG5cclxuXHRcdFx0XHRsZXQgaSA9IGNvbnRvdXIubGVuZ3RoO1xyXG5cclxuXHRcdFx0XHR3aGlsZSAoIC0tIGkgPj0gMCApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBqID0gaTtcclxuXHRcdFx0XHRcdGxldCBrID0gaSAtIDE7XHJcblx0XHRcdFx0XHRpZiAoIGsgPCAwICkgayA9IGNvbnRvdXIubGVuZ3RoIC0gMTtcclxuXHJcblx0XHRcdFx0XHQvL2NvbnNvbGUubG9nKCdiJywgaSxqLCBpLTEsIGssdmVydGljZXMubGVuZ3RoKTtcclxuXHJcblx0XHRcdFx0XHRmb3IgKCBsZXQgcyA9IDAsIHNsID0gKCBzdGVwcyArIGJldmVsU2VnbWVudHMgKiAyICk7IHMgPCBzbDsgcyArKyApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnN0IHNsZW4xID0gdmxlbiAqIHM7XHJcblx0XHRcdFx0XHRcdGNvbnN0IHNsZW4yID0gdmxlbiAqICggcyArIDEgKTtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnN0IGEgPSBsYXllcm9mZnNldCArIGogKyBzbGVuMSxcclxuXHRcdFx0XHRcdFx0XHRiID0gbGF5ZXJvZmZzZXQgKyBrICsgc2xlbjEsXHJcblx0XHRcdFx0XHRcdFx0YyA9IGxheWVyb2Zmc2V0ICsgayArIHNsZW4yLFxyXG5cdFx0XHRcdFx0XHRcdGQgPSBsYXllcm9mZnNldCArIGogKyBzbGVuMjtcclxuXHJcblx0XHRcdFx0XHRcdGY0KCBhLCBiLCBjLCBkICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRmdW5jdGlvbiB2KCB4LCB5LCB6ICkge1xyXG5cclxuXHRcdFx0XHRwbGFjZWhvbGRlci5wdXNoKCB4ICk7XHJcblx0XHRcdFx0cGxhY2Vob2xkZXIucHVzaCggeSApO1xyXG5cdFx0XHRcdHBsYWNlaG9sZGVyLnB1c2goIHogKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblxyXG5cdFx0XHRmdW5jdGlvbiBmMyggYSwgYiwgYyApIHtcclxuXHJcblx0XHRcdFx0YWRkVmVydGV4KCBhICk7XHJcblx0XHRcdFx0YWRkVmVydGV4KCBiICk7XHJcblx0XHRcdFx0YWRkVmVydGV4KCBjICk7XHJcblxyXG5cdFx0XHRcdGNvbnN0IG5leHRJbmRleCA9IHZlcnRpY2VzQXJyYXkubGVuZ3RoIC8gMztcclxuXHRcdFx0XHRjb25zdCB1dnMgPSB1dmdlbi5nZW5lcmF0ZVRvcFVWKCBzY29wZSwgdmVydGljZXNBcnJheSwgbmV4dEluZGV4IC0gMywgbmV4dEluZGV4IC0gMiwgbmV4dEluZGV4IC0gMSApO1xyXG5cclxuXHRcdFx0XHRhZGRVViggdXZzWyAwIF0gKTtcclxuXHRcdFx0XHRhZGRVViggdXZzWyAxIF0gKTtcclxuXHRcdFx0XHRhZGRVViggdXZzWyAyIF0gKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGZ1bmN0aW9uIGY0KCBhLCBiLCBjLCBkICkge1xyXG5cclxuXHRcdFx0XHRhZGRWZXJ0ZXgoIGEgKTtcclxuXHRcdFx0XHRhZGRWZXJ0ZXgoIGIgKTtcclxuXHRcdFx0XHRhZGRWZXJ0ZXgoIGQgKTtcclxuXHJcblx0XHRcdFx0YWRkVmVydGV4KCBiICk7XHJcblx0XHRcdFx0YWRkVmVydGV4KCBjICk7XHJcblx0XHRcdFx0YWRkVmVydGV4KCBkICk7XHJcblxyXG5cclxuXHRcdFx0XHRjb25zdCBuZXh0SW5kZXggPSB2ZXJ0aWNlc0FycmF5Lmxlbmd0aCAvIDM7XHJcblx0XHRcdFx0Y29uc3QgdXZzID0gdXZnZW4uZ2VuZXJhdGVTaWRlV2FsbFVWKCBzY29wZSwgdmVydGljZXNBcnJheSwgbmV4dEluZGV4IC0gNiwgbmV4dEluZGV4IC0gMywgbmV4dEluZGV4IC0gMiwgbmV4dEluZGV4IC0gMSApO1xyXG5cclxuXHRcdFx0XHRhZGRVViggdXZzWyAwIF0gKTtcclxuXHRcdFx0XHRhZGRVViggdXZzWyAxIF0gKTtcclxuXHRcdFx0XHRhZGRVViggdXZzWyAzIF0gKTtcclxuXHJcblx0XHRcdFx0YWRkVVYoIHV2c1sgMSBdICk7XHJcblx0XHRcdFx0YWRkVVYoIHV2c1sgMiBdICk7XHJcblx0XHRcdFx0YWRkVVYoIHV2c1sgMyBdICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRmdW5jdGlvbiBhZGRWZXJ0ZXgoIGluZGV4ICkge1xyXG5cclxuXHRcdFx0XHR2ZXJ0aWNlc0FycmF5LnB1c2goIHBsYWNlaG9sZGVyWyBpbmRleCAqIDMgKyAwIF0gKTtcclxuXHRcdFx0XHR2ZXJ0aWNlc0FycmF5LnB1c2goIHBsYWNlaG9sZGVyWyBpbmRleCAqIDMgKyAxIF0gKTtcclxuXHRcdFx0XHR2ZXJ0aWNlc0FycmF5LnB1c2goIHBsYWNlaG9sZGVyWyBpbmRleCAqIDMgKyAyIF0gKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblxyXG5cdFx0XHRmdW5jdGlvbiBhZGRVViggdmVjdG9yMiApIHtcclxuXHJcblx0XHRcdFx0dXZBcnJheS5wdXNoKCB2ZWN0b3IyLnggKTtcclxuXHRcdFx0XHR1dkFycmF5LnB1c2goIHZlY3RvcjIueSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0gT2JqZWN0LmFzc2lnbigge30sIHNvdXJjZS5wYXJhbWV0ZXJzICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0dG9KU09OKCkge1xyXG5cclxuXHRcdGNvbnN0IGRhdGEgPSBzdXBlci50b0pTT04oKTtcclxuXHJcblx0XHRjb25zdCBzaGFwZXMgPSB0aGlzLnBhcmFtZXRlcnMuc2hhcGVzO1xyXG5cdFx0Y29uc3Qgb3B0aW9ucyA9IHRoaXMucGFyYW1ldGVycy5vcHRpb25zO1xyXG5cclxuXHRcdHJldHVybiB0b0pTT04oIHNoYXBlcywgb3B0aW9ucywgZGF0YSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGZyb20gdGhlIGdpdmVuXHJcblx0ICogSlNPTiBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIEEgSlNPTiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzZXJpYWxpemVkIGdlb21ldHJ5LlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8U2hhcGU+fSBzaGFwZXMgLSBBbiBhcnJheSBvZiBzaGFwZXMuXHJcblx0ICogQHJldHVybiB7RXh0cnVkZUdlb21ldHJ5fSBBIG5ldyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzdGF0aWMgZnJvbUpTT04oIGRhdGEsIHNoYXBlcyApIHtcclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeVNoYXBlcyA9IFtdO1xyXG5cclxuXHRcdGZvciAoIGxldCBqID0gMCwgamwgPSBkYXRhLnNoYXBlcy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHNoYXBlID0gc2hhcGVzWyBkYXRhLnNoYXBlc1sgaiBdIF07XHJcblxyXG5cdFx0XHRnZW9tZXRyeVNoYXBlcy5wdXNoKCBzaGFwZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBleHRydWRlUGF0aCA9IGRhdGEub3B0aW9ucy5leHRydWRlUGF0aDtcclxuXHJcblx0XHRpZiAoIGV4dHJ1ZGVQYXRoICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRkYXRhLm9wdGlvbnMuZXh0cnVkZVBhdGggPSBuZXcgQ3VydmVzWyBleHRydWRlUGF0aC50eXBlIF0oKS5mcm9tSlNPTiggZXh0cnVkZVBhdGggKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBFeHRydWRlR2VvbWV0cnkoIGdlb21ldHJ5U2hhcGVzLCBkYXRhLm9wdGlvbnMgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuY29uc3QgV29ybGRVVkdlbmVyYXRvciA9IHtcclxuXHJcblx0Z2VuZXJhdGVUb3BVVjogZnVuY3Rpb24gKCBnZW9tZXRyeSwgdmVydGljZXMsIGluZGV4QSwgaW5kZXhCLCBpbmRleEMgKSB7XHJcblxyXG5cdFx0Y29uc3QgYV94ID0gdmVydGljZXNbIGluZGV4QSAqIDMgXTtcclxuXHRcdGNvbnN0IGFfeSA9IHZlcnRpY2VzWyBpbmRleEEgKiAzICsgMSBdO1xyXG5cdFx0Y29uc3QgYl94ID0gdmVydGljZXNbIGluZGV4QiAqIDMgXTtcclxuXHRcdGNvbnN0IGJfeSA9IHZlcnRpY2VzWyBpbmRleEIgKiAzICsgMSBdO1xyXG5cdFx0Y29uc3QgY194ID0gdmVydGljZXNbIGluZGV4QyAqIDMgXTtcclxuXHRcdGNvbnN0IGNfeSA9IHZlcnRpY2VzWyBpbmRleEMgKiAzICsgMSBdO1xyXG5cclxuXHRcdHJldHVybiBbXHJcblx0XHRcdG5ldyBWZWN0b3IyKCBhX3gsIGFfeSApLFxyXG5cdFx0XHRuZXcgVmVjdG9yMiggYl94LCBiX3kgKSxcclxuXHRcdFx0bmV3IFZlY3RvcjIoIGNfeCwgY195IClcclxuXHRcdF07XHJcblxyXG5cdH0sXHJcblxyXG5cdGdlbmVyYXRlU2lkZVdhbGxVVjogZnVuY3Rpb24gKCBnZW9tZXRyeSwgdmVydGljZXMsIGluZGV4QSwgaW5kZXhCLCBpbmRleEMsIGluZGV4RCApIHtcclxuXHJcblx0XHRjb25zdCBhX3ggPSB2ZXJ0aWNlc1sgaW5kZXhBICogMyBdO1xyXG5cdFx0Y29uc3QgYV95ID0gdmVydGljZXNbIGluZGV4QSAqIDMgKyAxIF07XHJcblx0XHRjb25zdCBhX3ogPSB2ZXJ0aWNlc1sgaW5kZXhBICogMyArIDIgXTtcclxuXHRcdGNvbnN0IGJfeCA9IHZlcnRpY2VzWyBpbmRleEIgKiAzIF07XHJcblx0XHRjb25zdCBiX3kgPSB2ZXJ0aWNlc1sgaW5kZXhCICogMyArIDEgXTtcclxuXHRcdGNvbnN0IGJfeiA9IHZlcnRpY2VzWyBpbmRleEIgKiAzICsgMiBdO1xyXG5cdFx0Y29uc3QgY194ID0gdmVydGljZXNbIGluZGV4QyAqIDMgXTtcclxuXHRcdGNvbnN0IGNfeSA9IHZlcnRpY2VzWyBpbmRleEMgKiAzICsgMSBdO1xyXG5cdFx0Y29uc3QgY196ID0gdmVydGljZXNbIGluZGV4QyAqIDMgKyAyIF07XHJcblx0XHRjb25zdCBkX3ggPSB2ZXJ0aWNlc1sgaW5kZXhEICogMyBdO1xyXG5cdFx0Y29uc3QgZF95ID0gdmVydGljZXNbIGluZGV4RCAqIDMgKyAxIF07XHJcblx0XHRjb25zdCBkX3ogPSB2ZXJ0aWNlc1sgaW5kZXhEICogMyArIDIgXTtcclxuXHJcblx0XHRpZiAoIE1hdGguYWJzKCBhX3kgLSBiX3kgKSA8IE1hdGguYWJzKCBhX3ggLSBiX3ggKSApIHtcclxuXHJcblx0XHRcdHJldHVybiBbXHJcblx0XHRcdFx0bmV3IFZlY3RvcjIoIGFfeCwgMSAtIGFfeiApLFxyXG5cdFx0XHRcdG5ldyBWZWN0b3IyKCBiX3gsIDEgLSBiX3ogKSxcclxuXHRcdFx0XHRuZXcgVmVjdG9yMiggY194LCAxIC0gY196ICksXHJcblx0XHRcdFx0bmV3IFZlY3RvcjIoIGRfeCwgMSAtIGRfeiApXHJcblx0XHRcdF07XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHJldHVybiBbXHJcblx0XHRcdFx0bmV3IFZlY3RvcjIoIGFfeSwgMSAtIGFfeiApLFxyXG5cdFx0XHRcdG5ldyBWZWN0b3IyKCBiX3ksIDEgLSBiX3ogKSxcclxuXHRcdFx0XHRuZXcgVmVjdG9yMiggY195LCAxIC0gY196ICksXHJcblx0XHRcdFx0bmV3IFZlY3RvcjIoIGRfeSwgMSAtIGRfeiApXHJcblx0XHRcdF07XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59O1xyXG5cclxuZnVuY3Rpb24gdG9KU09OKCBzaGFwZXMsIG9wdGlvbnMsIGRhdGEgKSB7XHJcblxyXG5cdGRhdGEuc2hhcGVzID0gW107XHJcblxyXG5cdGlmICggQXJyYXkuaXNBcnJheSggc2hhcGVzICkgKSB7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gc2hhcGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBzaGFwZSA9IHNoYXBlc1sgaSBdO1xyXG5cclxuXHRcdFx0ZGF0YS5zaGFwZXMucHVzaCggc2hhcGUudXVpZCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fSBlbHNlIHtcclxuXHJcblx0XHRkYXRhLnNoYXBlcy5wdXNoKCBzaGFwZXMudXVpZCApO1xyXG5cclxuXHR9XHJcblxyXG5cdGRhdGEub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oIHt9LCBvcHRpb25zICk7XHJcblxyXG5cdGlmICggb3B0aW9ucy5leHRydWRlUGF0aCAhPT0gdW5kZWZpbmVkICkgZGF0YS5vcHRpb25zLmV4dHJ1ZGVQYXRoID0gb3B0aW9ucy5leHRydWRlUGF0aC50b0pTT04oKTtcclxuXHJcblx0cmV0dXJuIGRhdGE7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyB0aGUgYG9wdGlvbnNgIHR5cGUgb2YgdGhlIGdlb21ldHJ5J3MgY29uc3RydWN0b3IuXHJcbiAqXHJcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEV4dHJ1ZGVHZW9tZXRyeX5PcHRpb25zXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbY3VydmVTZWdtZW50cz0xMl0gLSBOdW1iZXIgb2YgcG9pbnRzIG9uIHRoZSBjdXJ2ZXMuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbc3RlcHM9MV0gLSBOdW1iZXIgb2YgcG9pbnRzIHVzZWQgZm9yIHN1YmRpdmlkaW5nIHNlZ21lbnRzIGFsb25nIHRoZSBkZXB0aCBvZiB0aGUgZXh0cnVkZWQgc3BsaW5lLlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2RlcHRoPTFdIC0gRGVwdGggdG8gZXh0cnVkZSB0aGUgc2hhcGUuXHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2JldmVsRW5hYmxlZD10cnVlXSAtIFdoZXRoZXIgdG8gYmV2ZWxpbmcgdG8gdGhlIHNoYXBlIG9yIG5vdC5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtiZXZlbFRoaWNrbmVzcz0wLjJdIC0gSG93IGRlZXAgaW50byB0aGUgb3JpZ2luYWwgc2hhcGUgdGhlIGJldmVsIGdvZXMuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbYmV2ZWxTaXplPWJldmVsVGhpY2tuZXNzLTAuMV0gLSBEaXN0YW5jZSBmcm9tIHRoZSBzaGFwZSBvdXRsaW5lIHRoYXQgdGhlIGJldmVsIGV4dGVuZHMuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbYmV2ZWxPZmZzZXQ9MF0gLSBEaXN0YW5jZSBmcm9tIHRoZSBzaGFwZSBvdXRsaW5lIHRoYXQgdGhlIGJldmVsIHN0YXJ0cy5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtiZXZlbFNlZ21lbnRzPTNdIC0gTnVtYmVyIG9mIGJldmVsIGxheWVycy5cclxuICogQHByb3BlcnR5IHs/Q3VydmV9IFtleHRydWRlUGF0aD1udWxsXSAtIEEgM0Qgc3BsaW5lIHBhdGggYWxvbmcgd2hpY2ggdGhlIHNoYXBlIHNob3VsZCBiZSBleHRydWRlZC4gQmV2ZWxzIG5vdCBzdXBwb3J0ZWQgZm9yIHBhdGggZXh0cnVzaW9uLlxyXG4gKiBAcHJvcGVydHkge09iamVjdH0gW1VWR2VuZXJhdG9yXSAtIEFuIG9iamVjdCB0aGF0IHByb3ZpZGVzIFVWIGdlbmVyYXRvciBmdW5jdGlvbnMgZm9yIGN1c3RvbSBVViBnZW5lcmF0aW9uLlxyXG4gKiovXHJcblxyXG5leHBvcnQgeyBFeHRydWRlR2VvbWV0cnkgfTtcclxuIiwiaW1wb3J0IHsgUG9seWhlZHJvbkdlb21ldHJ5IH0gZnJvbSAnLi9Qb2x5aGVkcm9uR2VvbWV0cnkuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgZ2VvbWV0cnkgY2xhc3MgZm9yIHJlcHJlc2VudGluZyBhbiBpY29zYWhlZHJvbi5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgZ2VvbWV0cnkgPSBuZXcgVEhSRUUuSWNvc2FoZWRyb25HZW9tZXRyeSgpO1xyXG4gKiBjb25zdCBtYXRlcmlhbCA9IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogMHhmZmZmMDAgfSApO1xyXG4gKiBjb25zdCBpY29zYWhlZHJvbiA9IG5ldyBUSFJFRS5NZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuICogc2NlbmUuYWRkKCBpY29zYWhlZHJvbiApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIFBvbHloZWRyb25HZW9tZXRyeVxyXG4gKi9cclxuY2xhc3MgSWNvc2FoZWRyb25HZW9tZXRyeSBleHRlbmRzIFBvbHloZWRyb25HZW9tZXRyeSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgaWNvc2FoZWRyb24gZ2VvbWV0cnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3JhZGl1cz0xXSAtIFJhZGl1cyBvZiB0aGUgaWNvc2FoZWRyb24uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtkZXRhaWw9MF0gLSBTZXR0aW5nIHRoaXMgdG8gYSB2YWx1ZSBncmVhdGVyIHRoYW4gYDBgIGFkZHMgdmVydGljZXMgbWFraW5nIGl0IG5vIGxvbmdlciBhIGljb3NhaGVkcm9uLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCByYWRpdXMgPSAxLCBkZXRhaWwgPSAwICkge1xyXG5cclxuXHRcdGNvbnN0IHQgPSAoIDEgKyBNYXRoLnNxcnQoIDUgKSApIC8gMjtcclxuXHJcblx0XHRjb25zdCB2ZXJ0aWNlcyA9IFtcclxuXHRcdFx0LSAxLCB0LCAwLCBcdDEsIHQsIDAsIFx0LSAxLCAtIHQsIDAsIFx0MSwgLSB0LCAwLFxyXG5cdFx0XHQwLCAtIDEsIHQsIFx0MCwgMSwgdCxcdDAsIC0gMSwgLSB0LCBcdDAsIDEsIC0gdCxcclxuXHRcdFx0dCwgMCwgLSAxLCBcdHQsIDAsIDEsIFx0LSB0LCAwLCAtIDEsIFx0LSB0LCAwLCAxXHJcblx0XHRdO1xyXG5cclxuXHRcdGNvbnN0IGluZGljZXMgPSBbXHJcblx0XHRcdDAsIDExLCA1LCBcdDAsIDUsIDEsIFx0MCwgMSwgNywgXHQwLCA3LCAxMCwgXHQwLCAxMCwgMTEsXHJcblx0XHRcdDEsIDUsIDksIFx0NSwgMTEsIDQsXHQxMSwgMTAsIDIsXHQxMCwgNywgNixcdDcsIDEsIDgsXHJcblx0XHRcdDMsIDksIDQsIFx0MywgNCwgMixcdDMsIDIsIDYsXHQzLCA2LCA4LFx0MywgOCwgOSxcclxuXHRcdFx0NCwgOSwgNSwgXHQyLCA0LCAxMSxcdDYsIDIsIDEwLFx0OCwgNiwgNyxcdDksIDgsIDFcclxuXHRcdF07XHJcblxyXG5cdFx0c3VwZXIoIHZlcnRpY2VzLCBpbmRpY2VzLCByYWRpdXMsIGRldGFpbCApO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdJY29zYWhlZHJvbkdlb21ldHJ5JztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvbGRzIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzIHRoYXQgaGF2ZSBiZWVuXHJcblx0XHQgKiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBnZW9tZXRyeS4gQW55IG1vZGlmaWNhdGlvblxyXG5cdFx0ICogYWZ0ZXIgaW5zdGFudGlhdGlvbiBkb2VzIG5vdCBjaGFuZ2UgdGhlIGdlb21ldHJ5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucGFyYW1ldGVycyA9IHtcclxuXHRcdFx0cmFkaXVzOiByYWRpdXMsXHJcblx0XHRcdGRldGFpbDogZGV0YWlsXHJcblx0XHR9O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGZyb20gdGhlIGdpdmVuXHJcblx0ICogSlNPTiBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIEEgSlNPTiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzZXJpYWxpemVkIGdlb21ldHJ5LlxyXG5cdCAqIEByZXR1cm4ge0ljb3NhaGVkcm9uR2VvbWV0cnl9IEEgbmV3IGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBmcm9tSlNPTiggZGF0YSApIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IEljb3NhaGVkcm9uR2VvbWV0cnkoIGRhdGEucmFkaXVzLCBkYXRhLmRldGFpbCApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgSWNvc2FoZWRyb25HZW9tZXRyeSB9O1xyXG4iLCJpbXBvcnQgeyBQb2x5aGVkcm9uR2VvbWV0cnkgfSBmcm9tICcuL1BvbHloZWRyb25HZW9tZXRyeS5qcyc7XHJcblxyXG4vKipcclxuICogQSBnZW9tZXRyeSBjbGFzcyBmb3IgcmVwcmVzZW50aW5nIGFuIG9jdGFoZWRyb24uXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGdlb21ldHJ5ID0gbmV3IFRIUkVFLk9jdGFoZWRyb25HZW9tZXRyeSgpO1xyXG4gKiBjb25zdCBtYXRlcmlhbCA9IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogMHhmZmZmMDAgfSApO1xyXG4gKiBjb25zdCBvY3RhaGVkcm9uID0gbmV3IFRIUkVFLk1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG4gKiBzY2VuZS5hZGQoIG9jdGFoZWRyb24gKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBQb2x5aGVkcm9uR2VvbWV0cnlcclxuICovXHJcbmNsYXNzIE9jdGFoZWRyb25HZW9tZXRyeSBleHRlbmRzIFBvbHloZWRyb25HZW9tZXRyeSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgb2N0YWhlZHJvbiBnZW9tZXRyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbcmFkaXVzPTFdIC0gUmFkaXVzIG9mIHRoZSBvY3RhaGVkcm9uLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZGV0YWlsPTBdIC0gU2V0dGluZyB0aGlzIHRvIGEgdmFsdWUgZ3JlYXRlciB0aGFuIGAwYCBhZGRzIHZlcnRpY2VzIG1ha2luZyBpdCBubyBsb25nZXIgYSBvY3RhaGVkcm9uLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCByYWRpdXMgPSAxLCBkZXRhaWwgPSAwICkge1xyXG5cclxuXHRcdGNvbnN0IHZlcnRpY2VzID0gW1xyXG5cdFx0XHQxLCAwLCAwLCBcdC0gMSwgMCwgMCxcdDAsIDEsIDAsXHJcblx0XHRcdDAsIC0gMSwgMCwgXHQwLCAwLCAxLFx0MCwgMCwgLSAxXHJcblx0XHRdO1xyXG5cclxuXHRcdGNvbnN0IGluZGljZXMgPSBbXHJcblx0XHRcdDAsIDIsIDQsXHQwLCA0LCAzLFx0MCwgMywgNSxcclxuXHRcdFx0MCwgNSwgMixcdDEsIDIsIDUsXHQxLCA1LCAzLFxyXG5cdFx0XHQxLCAzLCA0LFx0MSwgNCwgMlxyXG5cdFx0XTtcclxuXHJcblx0XHRzdXBlciggdmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWlsICk7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ09jdGFoZWRyb25HZW9tZXRyeSc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb2xkcyB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVycyB0aGF0IGhhdmUgYmVlblxyXG5cdFx0ICogdXNlZCB0byBnZW5lcmF0ZSB0aGUgZ2VvbWV0cnkuIEFueSBtb2RpZmljYXRpb25cclxuXHRcdCAqIGFmdGVyIGluc3RhbnRpYXRpb24gZG9lcyBub3QgY2hhbmdlIHRoZSBnZW9tZXRyeS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBhcmFtZXRlcnMgPSB7XHJcblx0XHRcdHJhZGl1czogcmFkaXVzLFxyXG5cdFx0XHRkZXRhaWw6IGRldGFpbFxyXG5cdFx0fTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGYWN0b3J5IG1ldGhvZCBmb3IgY3JlYXRpbmcgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBmcm9tIHRoZSBnaXZlblxyXG5cdCAqIEpTT04gb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBBIEpTT04gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc2VyaWFsaXplZCBnZW9tZXRyeS5cclxuXHQgKiBAcmV0dXJuIHtPY3RhaGVkcm9uR2VvbWV0cnl9IEEgbmV3IGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBmcm9tSlNPTiggZGF0YSApIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IE9jdGFoZWRyb25HZW9tZXRyeSggZGF0YS5yYWRpdXMsIGRhdGEuZGV0YWlsICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IE9jdGFoZWRyb25HZW9tZXRyeSB9O1xyXG4iLCJpbXBvcnQgeyBCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyR2VvbWV0cnkuanMnO1xyXG5pbXBvcnQgeyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgZ2VvbWV0cnkgY2xhc3MgZm9yIHJlcHJlc2VudGluZyBhIHBsYW5lLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBnZW9tZXRyeSA9IG5ldyBUSFJFRS5QbGFuZUdlb21ldHJ5KCAxLCAxICk7XHJcbiAqIGNvbnN0IG1hdGVyaWFsID0gbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiAweGZmZmYwMCwgc2lkZTogVEhSRUUuRG91YmxlU2lkZSB9ICk7XHJcbiAqIGNvbnN0IHBsYW5lID0gbmV3IFRIUkVFLk1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG4gKiBzY2VuZS5hZGQoIHBsYW5lICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQnVmZmVyR2VvbWV0cnlcclxuICovXHJcbmNsYXNzIFBsYW5lR2VvbWV0cnkgZXh0ZW5kcyBCdWZmZXJHZW9tZXRyeSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcGxhbmUgZ2VvbWV0cnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3dpZHRoPTFdIC0gVGhlIHdpZHRoIGFsb25nIHRoZSBYIGF4aXMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtoZWlnaHQ9MV0gLSBUaGUgaGVpZ2h0IGFsb25nIHRoZSBZIGF4aXNcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3dpZHRoU2VnbWVudHM9MV0gLSBUaGUgbnVtYmVyIG9mIHNlZ21lbnRzIGFsb25nIHRoZSBYIGF4aXMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtoZWlnaHRTZWdtZW50cz0xXSAtIFRoZSBudW1iZXIgb2Ygc2VnbWVudHMgYWxvbmcgdGhlIFkgYXhpcy5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggd2lkdGggPSAxLCBoZWlnaHQgPSAxLCB3aWR0aFNlZ21lbnRzID0gMSwgaGVpZ2h0U2VnbWVudHMgPSAxICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ1BsYW5lR2VvbWV0cnknO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG9sZHMgdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMgdGhhdCBoYXZlIGJlZW5cclxuXHRcdCAqIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGdlb21ldHJ5LiBBbnkgbW9kaWZpY2F0aW9uXHJcblx0XHQgKiBhZnRlciBpbnN0YW50aWF0aW9uIGRvZXMgbm90IGNoYW5nZSB0aGUgZ2VvbWV0cnkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0ge1xyXG5cdFx0XHR3aWR0aDogd2lkdGgsXHJcblx0XHRcdGhlaWdodDogaGVpZ2h0LFxyXG5cdFx0XHR3aWR0aFNlZ21lbnRzOiB3aWR0aFNlZ21lbnRzLFxyXG5cdFx0XHRoZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHNcclxuXHRcdH07XHJcblxyXG5cdFx0Y29uc3Qgd2lkdGhfaGFsZiA9IHdpZHRoIC8gMjtcclxuXHRcdGNvbnN0IGhlaWdodF9oYWxmID0gaGVpZ2h0IC8gMjtcclxuXHJcblx0XHRjb25zdCBncmlkWCA9IE1hdGguZmxvb3IoIHdpZHRoU2VnbWVudHMgKTtcclxuXHRcdGNvbnN0IGdyaWRZID0gTWF0aC5mbG9vciggaGVpZ2h0U2VnbWVudHMgKTtcclxuXHJcblx0XHRjb25zdCBncmlkWDEgPSBncmlkWCArIDE7XHJcblx0XHRjb25zdCBncmlkWTEgPSBncmlkWSArIDE7XHJcblxyXG5cdFx0Y29uc3Qgc2VnbWVudF93aWR0aCA9IHdpZHRoIC8gZ3JpZFg7XHJcblx0XHRjb25zdCBzZWdtZW50X2hlaWdodCA9IGhlaWdodCAvIGdyaWRZO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0Y29uc3QgaW5kaWNlcyA9IFtdO1xyXG5cdFx0Y29uc3QgdmVydGljZXMgPSBbXTtcclxuXHRcdGNvbnN0IG5vcm1hbHMgPSBbXTtcclxuXHRcdGNvbnN0IHV2cyA9IFtdO1xyXG5cclxuXHRcdGZvciAoIGxldCBpeSA9IDA7IGl5IDwgZ3JpZFkxOyBpeSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHkgPSBpeSAqIHNlZ21lbnRfaGVpZ2h0IC0gaGVpZ2h0X2hhbGY7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaXggPSAwOyBpeCA8IGdyaWRYMTsgaXggKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHggPSBpeCAqIHNlZ21lbnRfd2lkdGggLSB3aWR0aF9oYWxmO1xyXG5cclxuXHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCB4LCAtIHksIDAgKTtcclxuXHJcblx0XHRcdFx0bm9ybWFscy5wdXNoKCAwLCAwLCAxICk7XHJcblxyXG5cdFx0XHRcdHV2cy5wdXNoKCBpeCAvIGdyaWRYICk7XHJcblx0XHRcdFx0dXZzLnB1c2goIDEgLSAoIGl5IC8gZ3JpZFkgKSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmb3IgKCBsZXQgaXkgPSAwOyBpeSA8IGdyaWRZOyBpeSArKyApIHtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpeCA9IDA7IGl4IDwgZ3JpZFg7IGl4ICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBhID0gaXggKyBncmlkWDEgKiBpeTtcclxuXHRcdFx0XHRjb25zdCBiID0gaXggKyBncmlkWDEgKiAoIGl5ICsgMSApO1xyXG5cdFx0XHRcdGNvbnN0IGMgPSAoIGl4ICsgMSApICsgZ3JpZFgxICogKCBpeSArIDEgKTtcclxuXHRcdFx0XHRjb25zdCBkID0gKCBpeCArIDEgKSArIGdyaWRYMSAqIGl5O1xyXG5cclxuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTtcclxuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xyXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XHJcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcclxuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0gT2JqZWN0LmFzc2lnbigge30sIHNvdXJjZS5wYXJhbWV0ZXJzICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRmFjdG9yeSBtZXRob2QgZm9yIGNyZWF0aW5nIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZnJvbSB0aGUgZ2l2ZW5cclxuXHQgKiBKU09OIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gQSBKU09OIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNlcmlhbGl6ZWQgZ2VvbWV0cnkuXHJcblx0ICogQHJldHVybiB7UGxhbmVHZW9tZXRyeX0gQSBuZXcgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c3RhdGljIGZyb21KU09OKCBkYXRhICkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgUGxhbmVHZW9tZXRyeSggZGF0YS53aWR0aCwgZGF0YS5oZWlnaHQsIGRhdGEud2lkdGhTZWdtZW50cywgZGF0YS5oZWlnaHRTZWdtZW50cyApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBQbGFuZUdlb21ldHJ5IH07XHJcbiIsImltcG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9CdWZmZXJHZW9tZXRyeS5qcyc7XHJcbmltcG9ydCB7IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjIuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIGNsYXNzIGZvciBnZW5lcmF0aW5nIGEgdHdvLWRpbWVuc2lvbmFsIHJpbmcgZ2VvbWV0cnkuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGdlb21ldHJ5ID0gbmV3IFRIUkVFLlJpbmdHZW9tZXRyeSggMSwgNSwgMzIgKTtcclxuICogY29uc3QgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IDB4ZmZmZjAwLCBzaWRlOiBUSFJFRS5Eb3VibGVTaWRlIH0gKTtcclxuICogY29uc3QgbWVzaCA9IG5ldyBUSFJFRS5NZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuICogc2NlbmUuYWRkKCBtZXNoICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQnVmZmVyR2VvbWV0cnlcclxuICovXHJcbmNsYXNzIFJpbmdHZW9tZXRyeSBleHRlbmRzIEJ1ZmZlckdlb21ldHJ5IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyByaW5nIGdlb21ldHJ5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtpbm5lclJhZGl1cz0wLjVdIC0gVGhlIGlubmVyIHJhZGl1cyBvZiB0aGUgcmluZy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW291dGVyUmFkaXVzPTFdIC0gVGhlIG91dGVyIHJhZGl1cyBvZiB0aGUgcmluZy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3RoZXRhU2VnbWVudHM9MzJdIC0gTnVtYmVyIG9mIHNlZ21lbnRzLiBBIGhpZ2hlciBudW1iZXIgbWVhbnMgdGhlIHJpbmcgd2lsbCBiZSBtb3JlIHJvdW5kLiBNaW5pbXVtIGlzIGAzYC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3BoaVNlZ21lbnRzPTFdIC0gTnVtYmVyIG9mIHNlZ21lbnRzIHBlciByaW5nIHNlZ21lbnQuIE1pbmltdW0gaXMgYDFgLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbdGhldGFTdGFydD0wXSAtIFN0YXJ0aW5nIGFuZ2xlIGluIHJhZGlhbnMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt0aGV0YUxlbmd0aD1NYXRoLlBJKjJdIC0gQ2VudHJhbCBhbmdsZSBpbiByYWRpYW5zLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBpbm5lclJhZGl1cyA9IDAuNSwgb3V0ZXJSYWRpdXMgPSAxLCB0aGV0YVNlZ21lbnRzID0gMzIsIHBoaVNlZ21lbnRzID0gMSwgdGhldGFTdGFydCA9IDAsIHRoZXRhTGVuZ3RoID0gTWF0aC5QSSAqIDIgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnUmluZ0dlb21ldHJ5JztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvbGRzIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzIHRoYXQgaGF2ZSBiZWVuXHJcblx0XHQgKiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBnZW9tZXRyeS4gQW55IG1vZGlmaWNhdGlvblxyXG5cdFx0ICogYWZ0ZXIgaW5zdGFudGlhdGlvbiBkb2VzIG5vdCBjaGFuZ2UgdGhlIGdlb21ldHJ5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucGFyYW1ldGVycyA9IHtcclxuXHRcdFx0aW5uZXJSYWRpdXM6IGlubmVyUmFkaXVzLFxyXG5cdFx0XHRvdXRlclJhZGl1czogb3V0ZXJSYWRpdXMsXHJcblx0XHRcdHRoZXRhU2VnbWVudHM6IHRoZXRhU2VnbWVudHMsXHJcblx0XHRcdHBoaVNlZ21lbnRzOiBwaGlTZWdtZW50cyxcclxuXHRcdFx0dGhldGFTdGFydDogdGhldGFTdGFydCxcclxuXHRcdFx0dGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoXHJcblx0XHR9O1xyXG5cclxuXHRcdHRoZXRhU2VnbWVudHMgPSBNYXRoLm1heCggMywgdGhldGFTZWdtZW50cyApO1xyXG5cdFx0cGhpU2VnbWVudHMgPSBNYXRoLm1heCggMSwgcGhpU2VnbWVudHMgKTtcclxuXHJcblx0XHQvLyBidWZmZXJzXHJcblxyXG5cdFx0Y29uc3QgaW5kaWNlcyA9IFtdO1xyXG5cdFx0Y29uc3QgdmVydGljZXMgPSBbXTtcclxuXHRcdGNvbnN0IG5vcm1hbHMgPSBbXTtcclxuXHRcdGNvbnN0IHV2cyA9IFtdO1xyXG5cclxuXHRcdC8vIHNvbWUgaGVscGVyIHZhcmlhYmxlc1xyXG5cclxuXHRcdGxldCByYWRpdXMgPSBpbm5lclJhZGl1cztcclxuXHRcdGNvbnN0IHJhZGl1c1N0ZXAgPSAoICggb3V0ZXJSYWRpdXMgLSBpbm5lclJhZGl1cyApIC8gcGhpU2VnbWVudHMgKTtcclxuXHRcdGNvbnN0IHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XHJcblx0XHRjb25zdCB1diA9IG5ldyBWZWN0b3IyKCk7XHJcblxyXG5cdFx0Ly8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xyXG5cclxuXHRcdGZvciAoIGxldCBqID0gMDsgaiA8PSBwaGlTZWdtZW50czsgaiArKyApIHtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8PSB0aGV0YVNlZ21lbnRzOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHQvLyB2YWx1ZXMgYXJlIGdlbmVyYXRlIGZyb20gdGhlIGluc2lkZSBvZiB0aGUgcmluZyB0byB0aGUgb3V0c2lkZVxyXG5cclxuXHRcdFx0XHRjb25zdCBzZWdtZW50ID0gdGhldGFTdGFydCArIGkgLyB0aGV0YVNlZ21lbnRzICogdGhldGFMZW5ndGg7XHJcblxyXG5cdFx0XHRcdC8vIHZlcnRleFxyXG5cclxuXHRcdFx0XHR2ZXJ0ZXgueCA9IHJhZGl1cyAqIE1hdGguY29zKCBzZWdtZW50ICk7XHJcblx0XHRcdFx0dmVydGV4LnkgPSByYWRpdXMgKiBNYXRoLnNpbiggc2VnbWVudCApO1xyXG5cclxuXHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XHJcblxyXG5cdFx0XHRcdC8vIG5vcm1hbFxyXG5cclxuXHRcdFx0XHRub3JtYWxzLnB1c2goIDAsIDAsIDEgKTtcclxuXHJcblx0XHRcdFx0Ly8gdXZcclxuXHJcblx0XHRcdFx0dXYueCA9ICggdmVydGV4LnggLyBvdXRlclJhZGl1cyArIDEgKSAvIDI7XHJcblx0XHRcdFx0dXYueSA9ICggdmVydGV4LnkgLyBvdXRlclJhZGl1cyArIDEgKSAvIDI7XHJcblxyXG5cdFx0XHRcdHV2cy5wdXNoKCB1di54LCB1di55ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBpbmNyZWFzZSB0aGUgcmFkaXVzIGZvciBuZXh0IHJvdyBvZiB2ZXJ0aWNlc1xyXG5cclxuXHRcdFx0cmFkaXVzICs9IHJhZGl1c1N0ZXA7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGluZGljZXNcclxuXHJcblx0XHRmb3IgKCBsZXQgaiA9IDA7IGogPCBwaGlTZWdtZW50czsgaiArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHRoZXRhU2VnbWVudExldmVsID0gaiAqICggdGhldGFTZWdtZW50cyArIDEgKTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHRoZXRhU2VnbWVudHM7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHNlZ21lbnQgPSBpICsgdGhldGFTZWdtZW50TGV2ZWw7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGEgPSBzZWdtZW50O1xyXG5cdFx0XHRcdGNvbnN0IGIgPSBzZWdtZW50ICsgdGhldGFTZWdtZW50cyArIDE7XHJcblx0XHRcdFx0Y29uc3QgYyA9IHNlZ21lbnQgKyB0aGV0YVNlZ21lbnRzICsgMjtcclxuXHRcdFx0XHRjb25zdCBkID0gc2VnbWVudCArIDE7XHJcblxyXG5cdFx0XHRcdC8vIGZhY2VzXHJcblxyXG5cdFx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgZCApO1xyXG5cdFx0XHRcdGluZGljZXMucHVzaCggYiwgYywgZCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBidWlsZCBnZW9tZXRyeVxyXG5cclxuXHRcdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcclxuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xyXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XHJcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMucGFyYW1ldGVycyA9IE9iamVjdC5hc3NpZ24oIHt9LCBzb3VyY2UucGFyYW1ldGVycyApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGZyb20gdGhlIGdpdmVuXHJcblx0ICogSlNPTiBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIEEgSlNPTiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzZXJpYWxpemVkIGdlb21ldHJ5LlxyXG5cdCAqIEByZXR1cm4ge1JpbmdHZW9tZXRyeX0gQSBuZXcgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c3RhdGljIGZyb21KU09OKCBkYXRhICkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgUmluZ0dlb21ldHJ5KCBkYXRhLmlubmVyUmFkaXVzLCBkYXRhLm91dGVyUmFkaXVzLCBkYXRhLnRoZXRhU2VnbWVudHMsIGRhdGEucGhpU2VnbWVudHMsIGRhdGEudGhldGFTdGFydCwgZGF0YS50aGV0YUxlbmd0aCApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgUmluZ0dlb21ldHJ5IH07XHJcbiIsImltcG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9CdWZmZXJHZW9tZXRyeS5qcyc7XHJcbmltcG9ydCB7IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcbmltcG9ydCB7IFNoYXBlIH0gZnJvbSAnLi4vZXh0cmFzL2NvcmUvU2hhcGUuanMnO1xyXG5pbXBvcnQgeyBTaGFwZVV0aWxzIH0gZnJvbSAnLi4vZXh0cmFzL1NoYXBlVXRpbHMuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IyLmpzJztcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGFuIG9uZS1zaWRlZCBwb2x5Z29uYWwgZ2VvbWV0cnkgZnJvbSBvbmUgb3IgbW9yZSBwYXRoIHNoYXBlcy5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgYXJjU2hhcGUgPSBuZXcgVEhSRUUuU2hhcGUoKVxyXG4gKlx0Lm1vdmVUbyggNSwgMSApXHJcbiAqXHQuYWJzYXJjKCAxLCAxLCA0LCAwLCBNYXRoLlBJICogMiwgZmFsc2UgKTtcclxuICpcclxuICogY29uc3QgZ2VvbWV0cnkgPSBuZXcgVEhSRUUuU2hhcGVHZW9tZXRyeSggYXJjU2hhcGUgKTtcclxuICogY29uc3QgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IDB4MDBmZjAwLCBzaWRlOiBUSFJFRS5Eb3VibGVTaWRlIH0gKTtcclxuICogY29uc3QgbWVzaCA9IG5ldyBUSFJFRS5NZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKSA7XHJcbiAqIHNjZW5lLmFkZCggbWVzaCApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIEJ1ZmZlckdlb21ldHJ5XHJcbiAqL1xyXG5jbGFzcyBTaGFwZUdlb21ldHJ5IGV4dGVuZHMgQnVmZmVyR2VvbWV0cnkge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHNoYXBlIGdlb21ldHJ5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTaGFwZXxBcnJheTxTaGFwZT59IFtzaGFwZXNdIC0gQSBzaGFwZSBvciBhbiBhcnJheSBvZiBzaGFwZXMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtjdXJ2ZVNlZ21lbnRzPTEyXSAtIE51bWJlciBvZiBzZWdtZW50cyBwZXIgc2hhcGUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHNoYXBlcyA9IG5ldyBTaGFwZSggWyBuZXcgVmVjdG9yMiggMCwgMC41ICksIG5ldyBWZWN0b3IyKCAtIDAuNSwgLSAwLjUgKSwgbmV3IFZlY3RvcjIoIDAuNSwgLSAwLjUgKSBdICksIGN1cnZlU2VnbWVudHMgPSAxMiApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdTaGFwZUdlb21ldHJ5JztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvbGRzIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzIHRoYXQgaGF2ZSBiZWVuXHJcblx0XHQgKiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBnZW9tZXRyeS4gQW55IG1vZGlmaWNhdGlvblxyXG5cdFx0ICogYWZ0ZXIgaW5zdGFudGlhdGlvbiBkb2VzIG5vdCBjaGFuZ2UgdGhlIGdlb21ldHJ5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucGFyYW1ldGVycyA9IHtcclxuXHRcdFx0c2hhcGVzOiBzaGFwZXMsXHJcblx0XHRcdGN1cnZlU2VnbWVudHM6IGN1cnZlU2VnbWVudHNcclxuXHRcdH07XHJcblxyXG5cdFx0Ly8gYnVmZmVyc1xyXG5cclxuXHRcdGNvbnN0IGluZGljZXMgPSBbXTtcclxuXHRcdGNvbnN0IHZlcnRpY2VzID0gW107XHJcblx0XHRjb25zdCBub3JtYWxzID0gW107XHJcblx0XHRjb25zdCB1dnMgPSBbXTtcclxuXHJcblx0XHQvLyBoZWxwZXIgdmFyaWFibGVzXHJcblxyXG5cdFx0bGV0IGdyb3VwU3RhcnQgPSAwO1xyXG5cdFx0bGV0IGdyb3VwQ291bnQgPSAwO1xyXG5cclxuXHRcdC8vIGFsbG93IHNpbmdsZSBhbmQgYXJyYXkgdmFsdWVzIGZvciBcInNoYXBlc1wiIHBhcmFtZXRlclxyXG5cclxuXHRcdGlmICggQXJyYXkuaXNBcnJheSggc2hhcGVzICkgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0YWRkU2hhcGUoIHNoYXBlcyApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBzaGFwZXMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRhZGRTaGFwZSggc2hhcGVzWyBpIF0gKTtcclxuXHJcblx0XHRcdFx0dGhpcy5hZGRHcm91cCggZ3JvdXBTdGFydCwgZ3JvdXBDb3VudCwgaSApOyAvLyBlbmFibGVzIE11bHRpTWF0ZXJpYWwgc3VwcG9ydFxyXG5cclxuXHRcdFx0XHRncm91cFN0YXJ0ICs9IGdyb3VwQ291bnQ7XHJcblx0XHRcdFx0Z3JvdXBDb3VudCA9IDA7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGJ1aWxkIGdlb21ldHJ5XHJcblxyXG5cdFx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xyXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XHJcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcclxuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcclxuXHJcblxyXG5cdFx0Ly8gaGVscGVyIGZ1bmN0aW9uc1xyXG5cclxuXHRcdGZ1bmN0aW9uIGFkZFNoYXBlKCBzaGFwZSApIHtcclxuXHJcblx0XHRcdGNvbnN0IGluZGV4T2Zmc2V0ID0gdmVydGljZXMubGVuZ3RoIC8gMztcclxuXHRcdFx0Y29uc3QgcG9pbnRzID0gc2hhcGUuZXh0cmFjdFBvaW50cyggY3VydmVTZWdtZW50cyApO1xyXG5cclxuXHRcdFx0bGV0IHNoYXBlVmVydGljZXMgPSBwb2ludHMuc2hhcGU7XHJcblx0XHRcdGNvbnN0IHNoYXBlSG9sZXMgPSBwb2ludHMuaG9sZXM7XHJcblxyXG5cdFx0XHQvLyBjaGVjayBkaXJlY3Rpb24gb2YgdmVydGljZXNcclxuXHJcblx0XHRcdGlmICggU2hhcGVVdGlscy5pc0Nsb2NrV2lzZSggc2hhcGVWZXJ0aWNlcyApID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdFx0c2hhcGVWZXJ0aWNlcyA9IHNoYXBlVmVydGljZXMucmV2ZXJzZSgpO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gc2hhcGVIb2xlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBzaGFwZUhvbGUgPSBzaGFwZUhvbGVzWyBpIF07XHJcblxyXG5cdFx0XHRcdGlmICggU2hhcGVVdGlscy5pc0Nsb2NrV2lzZSggc2hhcGVIb2xlICkgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0c2hhcGVIb2xlc1sgaSBdID0gc2hhcGVIb2xlLnJldmVyc2UoKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgZmFjZXMgPSBTaGFwZVV0aWxzLnRyaWFuZ3VsYXRlU2hhcGUoIHNoYXBlVmVydGljZXMsIHNoYXBlSG9sZXMgKTtcclxuXHJcblx0XHRcdC8vIGpvaW4gdmVydGljZXMgb2YgaW5uZXIgYW5kIG91dGVyIHBhdGhzIHRvIGEgc2luZ2xlIGFycmF5XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBzaGFwZUhvbGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHNoYXBlSG9sZSA9IHNoYXBlSG9sZXNbIGkgXTtcclxuXHRcdFx0XHRzaGFwZVZlcnRpY2VzID0gc2hhcGVWZXJ0aWNlcy5jb25jYXQoIHNoYXBlSG9sZSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gdmVydGljZXMsIG5vcm1hbHMsIHV2c1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gc2hhcGVWZXJ0aWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB2ZXJ0ZXggPSBzaGFwZVZlcnRpY2VzWyBpIF07XHJcblxyXG5cdFx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgMCApO1xyXG5cdFx0XHRcdG5vcm1hbHMucHVzaCggMCwgMCwgMSApO1xyXG5cdFx0XHRcdHV2cy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnkgKTsgLy8gd29ybGQgdXZzXHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBpbmRpY2VzXHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBmYWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBmYWNlID0gZmFjZXNbIGkgXTtcclxuXHJcblx0XHRcdFx0Y29uc3QgYSA9IGZhY2VbIDAgXSArIGluZGV4T2Zmc2V0O1xyXG5cdFx0XHRcdGNvbnN0IGIgPSBmYWNlWyAxIF0gKyBpbmRleE9mZnNldDtcclxuXHRcdFx0XHRjb25zdCBjID0gZmFjZVsgMiBdICsgaW5kZXhPZmZzZXQ7XHJcblxyXG5cdFx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgYyApO1xyXG5cdFx0XHRcdGdyb3VwQ291bnQgKz0gMztcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMucGFyYW1ldGVycyA9IE9iamVjdC5hc3NpZ24oIHt9LCBzb3VyY2UucGFyYW1ldGVycyApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdHRvSlNPTigpIHtcclxuXHJcblx0XHRjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCk7XHJcblxyXG5cdFx0Y29uc3Qgc2hhcGVzID0gdGhpcy5wYXJhbWV0ZXJzLnNoYXBlcztcclxuXHJcblx0XHRyZXR1cm4gdG9KU09OKCBzaGFwZXMsIGRhdGEgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGYWN0b3J5IG1ldGhvZCBmb3IgY3JlYXRpbmcgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBmcm9tIHRoZSBnaXZlblxyXG5cdCAqIEpTT04gb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBBIEpTT04gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc2VyaWFsaXplZCBnZW9tZXRyeS5cclxuXHQgKiBAcGFyYW0ge0FycmF5PFNoYXBlPn0gc2hhcGVzIC0gQW4gYXJyYXkgb2Ygc2hhcGVzLlxyXG5cdCAqIEByZXR1cm4ge1NoYXBlR2VvbWV0cnl9IEEgbmV3IGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBmcm9tSlNPTiggZGF0YSwgc2hhcGVzICkge1xyXG5cclxuXHRcdGNvbnN0IGdlb21ldHJ5U2hhcGVzID0gW107XHJcblxyXG5cdFx0Zm9yICggbGV0IGogPSAwLCBqbCA9IGRhdGEuc2hhcGVzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgc2hhcGUgPSBzaGFwZXNbIGRhdGEuc2hhcGVzWyBqIF0gXTtcclxuXHJcblx0XHRcdGdlb21ldHJ5U2hhcGVzLnB1c2goIHNoYXBlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBuZXcgU2hhcGVHZW9tZXRyeSggZ2VvbWV0cnlTaGFwZXMsIGRhdGEuY3VydmVTZWdtZW50cyApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiB0b0pTT04oIHNoYXBlcywgZGF0YSApIHtcclxuXHJcblx0ZGF0YS5zaGFwZXMgPSBbXTtcclxuXHJcblx0aWYgKCBBcnJheS5pc0FycmF5KCBzaGFwZXMgKSApIHtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBzaGFwZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHNoYXBlID0gc2hhcGVzWyBpIF07XHJcblxyXG5cdFx0XHRkYXRhLnNoYXBlcy5wdXNoKCBzaGFwZS51dWlkICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9IGVsc2Uge1xyXG5cclxuXHRcdGRhdGEuc2hhcGVzLnB1c2goIHNoYXBlcy51dWlkICk7XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIGRhdGE7XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBTaGFwZUdlb21ldHJ5IH07XHJcbiIsImltcG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9CdWZmZXJHZW9tZXRyeS5qcyc7XHJcbmltcG9ydCB7IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgY2xhc3MgZm9yIGdlbmVyYXRpbmcgYSBzcGhlcmUgZ2VvbWV0cnkuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGdlb21ldHJ5ID0gbmV3IFRIUkVFLlNwaGVyZUdlb21ldHJ5KCAxNSwgMzIsIDE2ICk7XHJcbiAqIGNvbnN0IG1hdGVyaWFsID0gbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiAweGZmZmYwMCB9ICk7XHJcbiAqIGNvbnN0IHNwaGVyZSA9IG5ldyBUSFJFRS5NZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuICogc2NlbmUuYWRkKCBzcGhlcmUgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBCdWZmZXJHZW9tZXRyeVxyXG4gKi9cclxuY2xhc3MgU3BoZXJlR2VvbWV0cnkgZXh0ZW5kcyBCdWZmZXJHZW9tZXRyeSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc3BoZXJlIGdlb21ldHJ5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpdXM9MV0gLSBUaGUgc3BoZXJlIHJhZGl1cy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3dpZHRoU2VnbWVudHM9MzJdIC0gVGhlIG51bWJlciBvZiBob3Jpem9udGFsIHNlZ21lbnRzLiBNaW5pbXVtIHZhbHVlIGlzIGAzYC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2hlaWdodFNlZ21lbnRzPTE2XSAtIFRoZSBudW1iZXIgb2YgdmVydGljYWwgc2VnbWVudHMuIE1pbmltdW0gdmFsdWUgaXMgYDJgLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbcGhpU3RhcnQ9MF0gLSBUaGUgaG9yaXpvbnRhbCBzdGFydGluZyBhbmdsZSBpbiByYWRpYW5zLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbcGhpTGVuZ3RoPU1hdGguUEkqMl0gLSBUaGUgaG9yaXpvbnRhbCBzd2VlcCBhbmdsZSBzaXplLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbdGhldGFTdGFydD0wXSAtIFRoZSB2ZXJ0aWNhbCBzdGFydGluZyBhbmdsZSBpbiByYWRpYW5zLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbdGhldGFMZW5ndGg9TWF0aC5QSV0gLSBUaGUgdmVydGljYWwgc3dlZXAgYW5nbGUgc2l6ZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcmFkaXVzID0gMSwgd2lkdGhTZWdtZW50cyA9IDMyLCBoZWlnaHRTZWdtZW50cyA9IDE2LCBwaGlTdGFydCA9IDAsIHBoaUxlbmd0aCA9IE1hdGguUEkgKiAyLCB0aGV0YVN0YXJ0ID0gMCwgdGhldGFMZW5ndGggPSBNYXRoLlBJICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ1NwaGVyZUdlb21ldHJ5JztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvbGRzIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzIHRoYXQgaGF2ZSBiZWVuXHJcblx0XHQgKiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBnZW9tZXRyeS4gQW55IG1vZGlmaWNhdGlvblxyXG5cdFx0ICogYWZ0ZXIgaW5zdGFudGlhdGlvbiBkb2VzIG5vdCBjaGFuZ2UgdGhlIGdlb21ldHJ5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucGFyYW1ldGVycyA9IHtcclxuXHRcdFx0cmFkaXVzOiByYWRpdXMsXHJcblx0XHRcdHdpZHRoU2VnbWVudHM6IHdpZHRoU2VnbWVudHMsXHJcblx0XHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cyxcclxuXHRcdFx0cGhpU3RhcnQ6IHBoaVN0YXJ0LFxyXG5cdFx0XHRwaGlMZW5ndGg6IHBoaUxlbmd0aCxcclxuXHRcdFx0dGhldGFTdGFydDogdGhldGFTdGFydCxcclxuXHRcdFx0dGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoXHJcblx0XHR9O1xyXG5cclxuXHRcdHdpZHRoU2VnbWVudHMgPSBNYXRoLm1heCggMywgTWF0aC5mbG9vciggd2lkdGhTZWdtZW50cyApICk7XHJcblx0XHRoZWlnaHRTZWdtZW50cyA9IE1hdGgubWF4KCAyLCBNYXRoLmZsb29yKCBoZWlnaHRTZWdtZW50cyApICk7XHJcblxyXG5cdFx0Y29uc3QgdGhldGFFbmQgPSBNYXRoLm1pbiggdGhldGFTdGFydCArIHRoZXRhTGVuZ3RoLCBNYXRoLlBJICk7XHJcblxyXG5cdFx0bGV0IGluZGV4ID0gMDtcclxuXHRcdGNvbnN0IGdyaWQgPSBbXTtcclxuXHJcblx0XHRjb25zdCB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xyXG5cdFx0Y29uc3Qgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcclxuXHJcblx0XHQvLyBidWZmZXJzXHJcblxyXG5cdFx0Y29uc3QgaW5kaWNlcyA9IFtdO1xyXG5cdFx0Y29uc3QgdmVydGljZXMgPSBbXTtcclxuXHRcdGNvbnN0IG5vcm1hbHMgPSBbXTtcclxuXHRcdGNvbnN0IHV2cyA9IFtdO1xyXG5cclxuXHRcdC8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnNcclxuXHJcblx0XHRmb3IgKCBsZXQgaXkgPSAwOyBpeSA8PSBoZWlnaHRTZWdtZW50czsgaXkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB2ZXJ0aWNlc1JvdyA9IFtdO1xyXG5cclxuXHRcdFx0Y29uc3QgdiA9IGl5IC8gaGVpZ2h0U2VnbWVudHM7XHJcblxyXG5cdFx0XHQvLyBzcGVjaWFsIGNhc2UgZm9yIHRoZSBwb2xlc1xyXG5cclxuXHRcdFx0bGV0IHVPZmZzZXQgPSAwO1xyXG5cclxuXHRcdFx0aWYgKCBpeSA9PT0gMCAmJiB0aGV0YVN0YXJ0ID09PSAwICkge1xyXG5cclxuXHRcdFx0XHR1T2Zmc2V0ID0gMC41IC8gd2lkdGhTZWdtZW50cztcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGl5ID09PSBoZWlnaHRTZWdtZW50cyAmJiB0aGV0YUVuZCA9PT0gTWF0aC5QSSApIHtcclxuXHJcblx0XHRcdFx0dU9mZnNldCA9IC0gMC41IC8gd2lkdGhTZWdtZW50cztcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGZvciAoIGxldCBpeCA9IDA7IGl4IDw9IHdpZHRoU2VnbWVudHM7IGl4ICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB1ID0gaXggLyB3aWR0aFNlZ21lbnRzO1xyXG5cclxuXHRcdFx0XHQvLyB2ZXJ0ZXhcclxuXHJcblx0XHRcdFx0dmVydGV4LnggPSAtIHJhZGl1cyAqIE1hdGguY29zKCBwaGlTdGFydCArIHUgKiBwaGlMZW5ndGggKSAqIE1hdGguc2luKCB0aGV0YVN0YXJ0ICsgdiAqIHRoZXRhTGVuZ3RoICk7XHJcblx0XHRcdFx0dmVydGV4LnkgPSByYWRpdXMgKiBNYXRoLmNvcyggdGhldGFTdGFydCArIHYgKiB0aGV0YUxlbmd0aCApO1xyXG5cdFx0XHRcdHZlcnRleC56ID0gcmFkaXVzICogTWF0aC5zaW4oIHBoaVN0YXJ0ICsgdSAqIHBoaUxlbmd0aCApICogTWF0aC5zaW4oIHRoZXRhU3RhcnQgKyB2ICogdGhldGFMZW5ndGggKTtcclxuXHJcblx0XHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xyXG5cclxuXHRcdFx0XHQvLyBub3JtYWxcclxuXHJcblx0XHRcdFx0bm9ybWFsLmNvcHkoIHZlcnRleCApLm5vcm1hbGl6ZSgpO1xyXG5cdFx0XHRcdG5vcm1hbHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApO1xyXG5cclxuXHRcdFx0XHQvLyB1dlxyXG5cclxuXHRcdFx0XHR1dnMucHVzaCggdSArIHVPZmZzZXQsIDEgLSB2ICk7XHJcblxyXG5cdFx0XHRcdHZlcnRpY2VzUm93LnB1c2goIGluZGV4ICsrICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRncmlkLnB1c2goIHZlcnRpY2VzUm93ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGluZGljZXNcclxuXHJcblx0XHRmb3IgKCBsZXQgaXkgPSAwOyBpeSA8IGhlaWdodFNlZ21lbnRzOyBpeSArKyApIHtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpeCA9IDA7IGl4IDwgd2lkdGhTZWdtZW50czsgaXggKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGEgPSBncmlkWyBpeSBdWyBpeCArIDEgXTtcclxuXHRcdFx0XHRjb25zdCBiID0gZ3JpZFsgaXkgXVsgaXggXTtcclxuXHRcdFx0XHRjb25zdCBjID0gZ3JpZFsgaXkgKyAxIF1bIGl4IF07XHJcblx0XHRcdFx0Y29uc3QgZCA9IGdyaWRbIGl5ICsgMSBdWyBpeCArIDEgXTtcclxuXHJcblx0XHRcdFx0aWYgKCBpeSAhPT0gMCB8fCB0aGV0YVN0YXJ0ID4gMCApIGluZGljZXMucHVzaCggYSwgYiwgZCApO1xyXG5cdFx0XHRcdGlmICggaXkgIT09IGhlaWdodFNlZ21lbnRzIC0gMSB8fCB0aGV0YUVuZCA8IE1hdGguUEkgKSBpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gYnVpbGQgZ2VvbWV0cnlcclxuXHJcblx0XHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XHJcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcclxuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xyXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLnBhcmFtZXRlcnMgPSBPYmplY3QuYXNzaWduKCB7fSwgc291cmNlLnBhcmFtZXRlcnMgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGYWN0b3J5IG1ldGhvZCBmb3IgY3JlYXRpbmcgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBmcm9tIHRoZSBnaXZlblxyXG5cdCAqIEpTT04gb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBBIEpTT04gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc2VyaWFsaXplZCBnZW9tZXRyeS5cclxuXHQgKiBAcmV0dXJuIHtTcGhlcmVHZW9tZXRyeX0gQSBuZXcgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c3RhdGljIGZyb21KU09OKCBkYXRhICkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgU3BoZXJlR2VvbWV0cnkoIGRhdGEucmFkaXVzLCBkYXRhLndpZHRoU2VnbWVudHMsIGRhdGEuaGVpZ2h0U2VnbWVudHMsIGRhdGEucGhpU3RhcnQsIGRhdGEucGhpTGVuZ3RoLCBkYXRhLnRoZXRhU3RhcnQsIGRhdGEudGhldGFMZW5ndGggKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgU3BoZXJlR2VvbWV0cnkgfTtcclxuIiwiaW1wb3J0IHsgUG9seWhlZHJvbkdlb21ldHJ5IH0gZnJvbSAnLi9Qb2x5aGVkcm9uR2VvbWV0cnkuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgZ2VvbWV0cnkgY2xhc3MgZm9yIHJlcHJlc2VudGluZyBhbiB0ZXRyYWhlZHJvbi5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgZ2VvbWV0cnkgPSBuZXcgVEhSRUUuVGV0cmFoZWRyb25HZW9tZXRyeSgpO1xyXG4gKiBjb25zdCBtYXRlcmlhbCA9IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogMHhmZmZmMDAgfSApO1xyXG4gKiBjb25zdCB0ZXRyYWhlZHJvbiA9IG5ldyBUSFJFRS5NZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuICogc2NlbmUuYWRkKCB0ZXRyYWhlZHJvbiApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIFBvbHloZWRyb25HZW9tZXRyeVxyXG4gKi9cclxuY2xhc3MgVGV0cmFoZWRyb25HZW9tZXRyeSBleHRlbmRzIFBvbHloZWRyb25HZW9tZXRyeSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgdGV0cmFoZWRyb24gZ2VvbWV0cnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3JhZGl1cz0xXSAtIFJhZGl1cyBvZiB0aGUgdGV0cmFoZWRyb24uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtkZXRhaWw9MF0gLSBTZXR0aW5nIHRoaXMgdG8gYSB2YWx1ZSBncmVhdGVyIHRoYW4gYDBgIGFkZHMgdmVydGljZXMgbWFraW5nIGl0IG5vIGxvbmdlciBhIHRldHJhaGVkcm9uLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCByYWRpdXMgPSAxLCBkZXRhaWwgPSAwICkge1xyXG5cclxuXHRcdGNvbnN0IHZlcnRpY2VzID0gW1xyXG5cdFx0XHQxLCAxLCAxLCBcdC0gMSwgLSAxLCAxLCBcdC0gMSwgMSwgLSAxLCBcdDEsIC0gMSwgLSAxXHJcblx0XHRdO1xyXG5cclxuXHRcdGNvbnN0IGluZGljZXMgPSBbXHJcblx0XHRcdDIsIDEsIDAsIFx0MCwgMywgMixcdDEsIDMsIDAsXHQyLCAzLCAxXHJcblx0XHRdO1xyXG5cclxuXHRcdHN1cGVyKCB2ZXJ0aWNlcywgaW5kaWNlcywgcmFkaXVzLCBkZXRhaWwgKTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnVGV0cmFoZWRyb25HZW9tZXRyeSc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb2xkcyB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVycyB0aGF0IGhhdmUgYmVlblxyXG5cdFx0ICogdXNlZCB0byBnZW5lcmF0ZSB0aGUgZ2VvbWV0cnkuIEFueSBtb2RpZmljYXRpb25cclxuXHRcdCAqIGFmdGVyIGluc3RhbnRpYXRpb24gZG9lcyBub3QgY2hhbmdlIHRoZSBnZW9tZXRyeS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBhcmFtZXRlcnMgPSB7XHJcblx0XHRcdHJhZGl1czogcmFkaXVzLFxyXG5cdFx0XHRkZXRhaWw6IGRldGFpbFxyXG5cdFx0fTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGYWN0b3J5IG1ldGhvZCBmb3IgY3JlYXRpbmcgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBmcm9tIHRoZSBnaXZlblxyXG5cdCAqIEpTT04gb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBBIEpTT04gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc2VyaWFsaXplZCBnZW9tZXRyeS5cclxuXHQgKiBAcmV0dXJuIHtUZXRyYWhlZHJvbkdlb21ldHJ5fSBBIG5ldyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzdGF0aWMgZnJvbUpTT04oIGRhdGEgKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBUZXRyYWhlZHJvbkdlb21ldHJ5KCBkYXRhLnJhZGl1cywgZGF0YS5kZXRhaWwgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgVGV0cmFoZWRyb25HZW9tZXRyeSB9O1xyXG4iLCJpbXBvcnQgeyBCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyR2VvbWV0cnkuanMnO1xyXG5pbXBvcnQgeyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIGdlb21ldHJ5IGNsYXNzIGZvciByZXByZXNlbnRpbmcgYW4gdG9ydXMuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGdlb21ldHJ5ID0gbmV3IFRIUkVFLlRvcnVzR2VvbWV0cnkoIDEwLCAzLCAxNiwgMTAwICk7XHJcbiAqIGNvbnN0IG1hdGVyaWFsID0gbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiAweGZmZmYwMCB9ICk7XHJcbiAqIGNvbnN0IHRvcnVzID0gbmV3IFRIUkVFLk1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG4gKiBzY2VuZS5hZGQoIHRvcnVzICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQnVmZmVyR2VvbWV0cnlcclxuICovXHJcbmNsYXNzIFRvcnVzR2VvbWV0cnkgZXh0ZW5kcyBCdWZmZXJHZW9tZXRyeSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgdG9ydXMgZ2VvbWV0cnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3JhZGl1cz0xXSAtIFJhZGl1cyBvZiB0aGUgdG9ydXMsIGZyb20gdGhlIGNlbnRlciBvZiB0aGUgdG9ydXMgdG8gdGhlIGNlbnRlciBvZiB0aGUgdHViZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3R1YmU9MC40XSAtIFJhZGl1cyBvZiB0aGUgdHViZS4gTXVzdCBiZSBzbWFsbGVyIHRoYW4gYHJhZGl1c2AuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpYWxTZWdtZW50cz0xMl0gLSBUaGUgbnVtYmVyIG9mIHJhZGlhbCBzZWdtZW50cy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3R1YnVsYXJTZWdtZW50cz00OF0gLSBUaGUgbnVtYmVyIG9mIHR1YnVsYXIgc2VnbWVudHMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFthcmM9TWF0aC5QSSoyXSAtIENlbnRyYWwgYW5nbGUgaW4gcmFkaWFucy5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcmFkaXVzID0gMSwgdHViZSA9IDAuNCwgcmFkaWFsU2VnbWVudHMgPSAxMiwgdHVidWxhclNlZ21lbnRzID0gNDgsIGFyYyA9IE1hdGguUEkgKiAyICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ1RvcnVzR2VvbWV0cnknO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG9sZHMgdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMgdGhhdCBoYXZlIGJlZW5cclxuXHRcdCAqIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGdlb21ldHJ5LiBBbnkgbW9kaWZpY2F0aW9uXHJcblx0XHQgKiBhZnRlciBpbnN0YW50aWF0aW9uIGRvZXMgbm90IGNoYW5nZSB0aGUgZ2VvbWV0cnkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0ge1xyXG5cdFx0XHRyYWRpdXM6IHJhZGl1cyxcclxuXHRcdFx0dHViZTogdHViZSxcclxuXHRcdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxyXG5cdFx0XHR0dWJ1bGFyU2VnbWVudHM6IHR1YnVsYXJTZWdtZW50cyxcclxuXHRcdFx0YXJjOiBhcmNcclxuXHRcdH07XHJcblxyXG5cdFx0cmFkaWFsU2VnbWVudHMgPSBNYXRoLmZsb29yKCByYWRpYWxTZWdtZW50cyApO1xyXG5cdFx0dHVidWxhclNlZ21lbnRzID0gTWF0aC5mbG9vciggdHVidWxhclNlZ21lbnRzICk7XHJcblxyXG5cdFx0Ly8gYnVmZmVyc1xyXG5cclxuXHRcdGNvbnN0IGluZGljZXMgPSBbXTtcclxuXHRcdGNvbnN0IHZlcnRpY2VzID0gW107XHJcblx0XHRjb25zdCBub3JtYWxzID0gW107XHJcblx0XHRjb25zdCB1dnMgPSBbXTtcclxuXHJcblx0XHQvLyBoZWxwZXIgdmFyaWFibGVzXHJcblxyXG5cdFx0Y29uc3QgY2VudGVyID0gbmV3IFZlY3RvcjMoKTtcclxuXHRcdGNvbnN0IHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XHJcblx0XHRjb25zdCBub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xyXG5cclxuXHRcdC8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnNcclxuXHJcblx0XHRmb3IgKCBsZXQgaiA9IDA7IGogPD0gcmFkaWFsU2VnbWVudHM7IGogKysgKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPD0gdHVidWxhclNlZ21lbnRzOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB1ID0gaSAvIHR1YnVsYXJTZWdtZW50cyAqIGFyYztcclxuXHRcdFx0XHRjb25zdCB2ID0gaiAvIHJhZGlhbFNlZ21lbnRzICogTWF0aC5QSSAqIDI7XHJcblxyXG5cdFx0XHRcdC8vIHZlcnRleFxyXG5cclxuXHRcdFx0XHR2ZXJ0ZXgueCA9ICggcmFkaXVzICsgdHViZSAqIE1hdGguY29zKCB2ICkgKSAqIE1hdGguY29zKCB1ICk7XHJcblx0XHRcdFx0dmVydGV4LnkgPSAoIHJhZGl1cyArIHR1YmUgKiBNYXRoLmNvcyggdiApICkgKiBNYXRoLnNpbiggdSApO1xyXG5cdFx0XHRcdHZlcnRleC56ID0gdHViZSAqIE1hdGguc2luKCB2ICk7XHJcblxyXG5cdFx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcclxuXHJcblx0XHRcdFx0Ly8gbm9ybWFsXHJcblxyXG5cdFx0XHRcdGNlbnRlci54ID0gcmFkaXVzICogTWF0aC5jb3MoIHUgKTtcclxuXHRcdFx0XHRjZW50ZXIueSA9IHJhZGl1cyAqIE1hdGguc2luKCB1ICk7XHJcblx0XHRcdFx0bm9ybWFsLnN1YlZlY3RvcnMoIHZlcnRleCwgY2VudGVyICkubm9ybWFsaXplKCk7XHJcblxyXG5cdFx0XHRcdG5vcm1hbHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApO1xyXG5cclxuXHRcdFx0XHQvLyB1dlxyXG5cclxuXHRcdFx0XHR1dnMucHVzaCggaSAvIHR1YnVsYXJTZWdtZW50cyApO1xyXG5cdFx0XHRcdHV2cy5wdXNoKCBqIC8gcmFkaWFsU2VnbWVudHMgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gZ2VuZXJhdGUgaW5kaWNlc1xyXG5cclxuXHRcdGZvciAoIGxldCBqID0gMTsgaiA8PSByYWRpYWxTZWdtZW50czsgaiArKyApIHtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMTsgaSA8PSB0dWJ1bGFyU2VnbWVudHM7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdC8vIGluZGljZXNcclxuXHJcblx0XHRcdFx0Y29uc3QgYSA9ICggdHVidWxhclNlZ21lbnRzICsgMSApICogaiArIGkgLSAxO1xyXG5cdFx0XHRcdGNvbnN0IGIgPSAoIHR1YnVsYXJTZWdtZW50cyArIDEgKSAqICggaiAtIDEgKSArIGkgLSAxO1xyXG5cdFx0XHRcdGNvbnN0IGMgPSAoIHR1YnVsYXJTZWdtZW50cyArIDEgKSAqICggaiAtIDEgKSArIGk7XHJcblx0XHRcdFx0Y29uc3QgZCA9ICggdHVidWxhclNlZ21lbnRzICsgMSApICogaiArIGk7XHJcblxyXG5cdFx0XHRcdC8vIGZhY2VzXHJcblxyXG5cdFx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgZCApO1xyXG5cdFx0XHRcdGluZGljZXMucHVzaCggYiwgYywgZCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBidWlsZCBnZW9tZXRyeVxyXG5cclxuXHRcdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcclxuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xyXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XHJcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMucGFyYW1ldGVycyA9IE9iamVjdC5hc3NpZ24oIHt9LCBzb3VyY2UucGFyYW1ldGVycyApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGZyb20gdGhlIGdpdmVuXHJcblx0ICogSlNPTiBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIEEgSlNPTiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzZXJpYWxpemVkIGdlb21ldHJ5LlxyXG5cdCAqIEByZXR1cm4ge1RvcnVzR2VvbWV0cnl9IEEgbmV3IGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBmcm9tSlNPTiggZGF0YSApIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IFRvcnVzR2VvbWV0cnkoIGRhdGEucmFkaXVzLCBkYXRhLnR1YmUsIGRhdGEucmFkaWFsU2VnbWVudHMsIGRhdGEudHVidWxhclNlZ21lbnRzLCBkYXRhLmFyYyApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBUb3J1c0dlb21ldHJ5IH07XHJcbiIsImltcG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9CdWZmZXJHZW9tZXRyeS5qcyc7XHJcbmltcG9ydCB7IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSB0b3J1cyBrbm90LCB0aGUgcGFydGljdWxhciBzaGFwZSBvZiB3aGljaCBpcyBkZWZpbmVkIGJ5IGEgcGFpclxyXG4gKiBvZiBjb3ByaW1lIGludGVnZXJzLCBwIGFuZCBxLiBJZiBwIGFuZCBxIGFyZSBub3QgY29wcmltZSwgdGhlIHJlc3VsdCB3aWxsXHJcbiAqIGJlIGEgdG9ydXMgbGluay5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgZ2VvbWV0cnkgPSBuZXcgVEhSRUUuVG9ydXNLbm90R2VvbWV0cnkoIDEwLCAzLCAxMDAsIDE2ICk7XHJcbiAqIGNvbnN0IG1hdGVyaWFsID0gbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiAweGZmZmYwMCB9ICk7XHJcbiAqIGNvbnN0IHRvcnVzS25vdCA9IG5ldyBUSFJFRS5NZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuICogc2NlbmUuYWRkKCB0b3J1c0tub3QgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBCdWZmZXJHZW9tZXRyeVxyXG4gKi9cclxuY2xhc3MgVG9ydXNLbm90R2VvbWV0cnkgZXh0ZW5kcyBCdWZmZXJHZW9tZXRyeSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgdG9ydXMga25vdCBnZW9tZXRyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbcmFkaXVzPTFdIC0gUmFkaXVzIG9mIHRoZSB0b3J1cyBrbm90LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbdHViZT0wLjRdIC0gUmFkaXVzIG9mIHRoZSB0dWJlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbdHVidWxhclNlZ21lbnRzPTY0XSAtIFRoZSBudW1iZXIgb2YgdHVidWxhciBzZWdtZW50cy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3JhZGlhbFNlZ21lbnRzPThdIC0gVGhlIG51bWJlciBvZiByYWRpYWwgc2VnbWVudHMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtwPTJdIC0gVGhpcyB2YWx1ZSBkZXRlcm1pbmVzLCBob3cgbWFueSB0aW1lcyB0aGUgZ2VvbWV0cnkgd2luZHMgYXJvdW5kIGl0cyBheGlzIG9mIHJvdGF0aW9uYWwgc3ltbWV0cnkuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtxPTNdIC0gVGhpcyB2YWx1ZSBkZXRlcm1pbmVzLCBob3cgbWFueSB0aW1lcyB0aGUgZ2VvbWV0cnkgd2luZHMgYXJvdW5kIGEgY2lyY2xlIGluIHRoZSBpbnRlcmlvciBvZiB0aGUgdG9ydXMuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHJhZGl1cyA9IDEsIHR1YmUgPSAwLjQsIHR1YnVsYXJTZWdtZW50cyA9IDY0LCByYWRpYWxTZWdtZW50cyA9IDgsIHAgPSAyLCBxID0gMyApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdUb3J1c0tub3RHZW9tZXRyeSc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb2xkcyB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVycyB0aGF0IGhhdmUgYmVlblxyXG5cdFx0ICogdXNlZCB0byBnZW5lcmF0ZSB0aGUgZ2VvbWV0cnkuIEFueSBtb2RpZmljYXRpb25cclxuXHRcdCAqIGFmdGVyIGluc3RhbnRpYXRpb24gZG9lcyBub3QgY2hhbmdlIHRoZSBnZW9tZXRyeS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBhcmFtZXRlcnMgPSB7XHJcblx0XHRcdHJhZGl1czogcmFkaXVzLFxyXG5cdFx0XHR0dWJlOiB0dWJlLFxyXG5cdFx0XHR0dWJ1bGFyU2VnbWVudHM6IHR1YnVsYXJTZWdtZW50cyxcclxuXHRcdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxyXG5cdFx0XHRwOiBwLFxyXG5cdFx0XHRxOiBxXHJcblx0XHR9O1xyXG5cclxuXHRcdHR1YnVsYXJTZWdtZW50cyA9IE1hdGguZmxvb3IoIHR1YnVsYXJTZWdtZW50cyApO1xyXG5cdFx0cmFkaWFsU2VnbWVudHMgPSBNYXRoLmZsb29yKCByYWRpYWxTZWdtZW50cyApO1xyXG5cclxuXHRcdC8vIGJ1ZmZlcnNcclxuXHJcblx0XHRjb25zdCBpbmRpY2VzID0gW107XHJcblx0XHRjb25zdCB2ZXJ0aWNlcyA9IFtdO1xyXG5cdFx0Y29uc3Qgbm9ybWFscyA9IFtdO1xyXG5cdFx0Y29uc3QgdXZzID0gW107XHJcblxyXG5cdFx0Ly8gaGVscGVyIHZhcmlhYmxlc1xyXG5cclxuXHRcdGNvbnN0IHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XHJcblx0XHRjb25zdCBub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xyXG5cclxuXHRcdGNvbnN0IFAxID0gbmV3IFZlY3RvcjMoKTtcclxuXHRcdGNvbnN0IFAyID0gbmV3IFZlY3RvcjMoKTtcclxuXHJcblx0XHRjb25zdCBCID0gbmV3IFZlY3RvcjMoKTtcclxuXHRcdGNvbnN0IFQgPSBuZXcgVmVjdG9yMygpO1xyXG5cdFx0Y29uc3QgTiA9IG5ldyBWZWN0b3IzKCk7XHJcblxyXG5cdFx0Ly8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8PSB0dWJ1bGFyU2VnbWVudHM7ICsrIGkgKSB7XHJcblxyXG5cdFx0XHQvLyB0aGUgcmFkaWFuIFwidVwiIGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBwb3NpdGlvbiBvbiB0aGUgdG9ydXMgY3VydmUgb2YgdGhlIGN1cnJlbnQgdHVidWxhciBzZWdtZW50XHJcblxyXG5cdFx0XHRjb25zdCB1ID0gaSAvIHR1YnVsYXJTZWdtZW50cyAqIHAgKiBNYXRoLlBJICogMjtcclxuXHJcblx0XHRcdC8vIG5vdyB3ZSBjYWxjdWxhdGUgdHdvIHBvaW50cy4gUDEgaXMgb3VyIGN1cnJlbnQgcG9zaXRpb24gb24gdGhlIGN1cnZlLCBQMiBpcyBhIGxpdHRsZSBmYXJ0aGVyIGFoZWFkLlxyXG5cdFx0XHQvLyB0aGVzZSBwb2ludHMgYXJlIHVzZWQgdG8gY3JlYXRlIGEgc3BlY2lhbCBcImNvb3JkaW5hdGUgc3BhY2VcIiwgd2hpY2ggaXMgbmVjZXNzYXJ5IHRvIGNhbGN1bGF0ZSB0aGUgY29ycmVjdCB2ZXJ0ZXggcG9zaXRpb25zXHJcblxyXG5cdFx0XHRjYWxjdWxhdGVQb3NpdGlvbk9uQ3VydmUoIHUsIHAsIHEsIHJhZGl1cywgUDEgKTtcclxuXHRcdFx0Y2FsY3VsYXRlUG9zaXRpb25PbkN1cnZlKCB1ICsgMC4wMSwgcCwgcSwgcmFkaXVzLCBQMiApO1xyXG5cclxuXHRcdFx0Ly8gY2FsY3VsYXRlIG9ydGhvbm9ybWFsIGJhc2lzXHJcblxyXG5cdFx0XHRULnN1YlZlY3RvcnMoIFAyLCBQMSApO1xyXG5cdFx0XHROLmFkZFZlY3RvcnMoIFAyLCBQMSApO1xyXG5cdFx0XHRCLmNyb3NzVmVjdG9ycyggVCwgTiApO1xyXG5cdFx0XHROLmNyb3NzVmVjdG9ycyggQiwgVCApO1xyXG5cclxuXHRcdFx0Ly8gbm9ybWFsaXplIEIsIE4uIFQgY2FuIGJlIGlnbm9yZWQsIHdlIGRvbid0IHVzZSBpdFxyXG5cclxuXHRcdFx0Qi5ub3JtYWxpemUoKTtcclxuXHRcdFx0Ti5ub3JtYWxpemUoKTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBqID0gMDsgaiA8PSByYWRpYWxTZWdtZW50czsgKysgaiApIHtcclxuXHJcblx0XHRcdFx0Ly8gbm93IGNhbGN1bGF0ZSB0aGUgdmVydGljZXMuIHRoZXkgYXJlIG5vdGhpbmcgbW9yZSB0aGFuIGFuIGV4dHJ1c2lvbiBvZiB0aGUgdG9ydXMgY3VydmUuXHJcblx0XHRcdFx0Ly8gYmVjYXVzZSB3ZSBleHRydWRlIGEgc2hhcGUgaW4gdGhlIHh5LXBsYW5lLCB0aGVyZSBpcyBubyBuZWVkIHRvIGNhbGN1bGF0ZSBhIHotdmFsdWUuXHJcblxyXG5cdFx0XHRcdGNvbnN0IHYgPSBqIC8gcmFkaWFsU2VnbWVudHMgKiBNYXRoLlBJICogMjtcclxuXHRcdFx0XHRjb25zdCBjeCA9IC0gdHViZSAqIE1hdGguY29zKCB2ICk7XHJcblx0XHRcdFx0Y29uc3QgY3kgPSB0dWJlICogTWF0aC5zaW4oIHYgKTtcclxuXHJcblx0XHRcdFx0Ly8gbm93IGNhbGN1bGF0ZSB0aGUgZmluYWwgdmVydGV4IHBvc2l0aW9uLlxyXG5cdFx0XHRcdC8vIGZpcnN0IHdlIG9yaWVudCB0aGUgZXh0cnVzaW9uIHdpdGggb3VyIGJhc2lzIHZlY3RvcnMsIHRoZW4gd2UgYWRkIGl0IHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9uIHRoZSBjdXJ2ZVxyXG5cclxuXHRcdFx0XHR2ZXJ0ZXgueCA9IFAxLnggKyAoIGN4ICogTi54ICsgY3kgKiBCLnggKTtcclxuXHRcdFx0XHR2ZXJ0ZXgueSA9IFAxLnkgKyAoIGN4ICogTi55ICsgY3kgKiBCLnkgKTtcclxuXHRcdFx0XHR2ZXJ0ZXgueiA9IFAxLnogKyAoIGN4ICogTi56ICsgY3kgKiBCLnogKTtcclxuXHJcblx0XHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xyXG5cclxuXHRcdFx0XHQvLyBub3JtYWwgKFAxIGlzIGFsd2F5cyB0aGUgY2VudGVyL29yaWdpbiBvZiB0aGUgZXh0cnVzaW9uLCB0aHVzIHdlIGNhbiB1c2UgaXQgdG8gY2FsY3VsYXRlIHRoZSBub3JtYWwpXHJcblxyXG5cdFx0XHRcdG5vcm1hbC5zdWJWZWN0b3JzKCB2ZXJ0ZXgsIFAxICkubm9ybWFsaXplKCk7XHJcblxyXG5cdFx0XHRcdG5vcm1hbHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApO1xyXG5cclxuXHRcdFx0XHQvLyB1dlxyXG5cclxuXHRcdFx0XHR1dnMucHVzaCggaSAvIHR1YnVsYXJTZWdtZW50cyApO1xyXG5cdFx0XHRcdHV2cy5wdXNoKCBqIC8gcmFkaWFsU2VnbWVudHMgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gZ2VuZXJhdGUgaW5kaWNlc1xyXG5cclxuXHRcdGZvciAoIGxldCBqID0gMTsgaiA8PSB0dWJ1bGFyU2VnbWVudHM7IGogKysgKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDE7IGkgPD0gcmFkaWFsU2VnbWVudHM7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdC8vIGluZGljZXNcclxuXHJcblx0XHRcdFx0Y29uc3QgYSA9ICggcmFkaWFsU2VnbWVudHMgKyAxICkgKiAoIGogLSAxICkgKyAoIGkgLSAxICk7XHJcblx0XHRcdFx0Y29uc3QgYiA9ICggcmFkaWFsU2VnbWVudHMgKyAxICkgKiBqICsgKCBpIC0gMSApO1xyXG5cdFx0XHRcdGNvbnN0IGMgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogaiArIGk7XHJcblx0XHRcdFx0Y29uc3QgZCA9ICggcmFkaWFsU2VnbWVudHMgKyAxICkgKiAoIGogLSAxICkgKyBpO1xyXG5cclxuXHRcdFx0XHQvLyBmYWNlc1xyXG5cclxuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTtcclxuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gYnVpbGQgZ2VvbWV0cnlcclxuXHJcblx0XHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XHJcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcclxuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xyXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xyXG5cclxuXHRcdC8vIHRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgY3VycmVudCBwb3NpdGlvbiBvbiB0aGUgdG9ydXMgY3VydmVcclxuXHJcblx0XHRmdW5jdGlvbiBjYWxjdWxhdGVQb3NpdGlvbk9uQ3VydmUoIHUsIHAsIHEsIHJhZGl1cywgcG9zaXRpb24gKSB7XHJcblxyXG5cdFx0XHRjb25zdCBjdSA9IE1hdGguY29zKCB1ICk7XHJcblx0XHRcdGNvbnN0IHN1ID0gTWF0aC5zaW4oIHUgKTtcclxuXHRcdFx0Y29uc3QgcXVPdmVyUCA9IHEgLyBwICogdTtcclxuXHRcdFx0Y29uc3QgY3MgPSBNYXRoLmNvcyggcXVPdmVyUCApO1xyXG5cclxuXHRcdFx0cG9zaXRpb24ueCA9IHJhZGl1cyAqICggMiArIGNzICkgKiAwLjUgKiBjdTtcclxuXHRcdFx0cG9zaXRpb24ueSA9IHJhZGl1cyAqICggMiArIGNzICkgKiBzdSAqIDAuNTtcclxuXHRcdFx0cG9zaXRpb24ueiA9IHJhZGl1cyAqIE1hdGguc2luKCBxdU92ZXJQICkgKiAwLjU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLnBhcmFtZXRlcnMgPSBPYmplY3QuYXNzaWduKCB7fSwgc291cmNlLnBhcmFtZXRlcnMgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGYWN0b3J5IG1ldGhvZCBmb3IgY3JlYXRpbmcgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBmcm9tIHRoZSBnaXZlblxyXG5cdCAqIEpTT04gb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBBIEpTT04gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc2VyaWFsaXplZCBnZW9tZXRyeS5cclxuXHQgKiBAcmV0dXJuIHtUb3J1c0tub3RHZW9tZXRyeX0gQSBuZXcgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c3RhdGljIGZyb21KU09OKCBkYXRhICkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgVG9ydXNLbm90R2VvbWV0cnkoIGRhdGEucmFkaXVzLCBkYXRhLnR1YmUsIGRhdGEudHVidWxhclNlZ21lbnRzLCBkYXRhLnJhZGlhbFNlZ21lbnRzLCBkYXRhLnAsIGRhdGEucSApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBUb3J1c0tub3RHZW9tZXRyeSB9O1xyXG4iLCJpbXBvcnQgeyBCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyR2VvbWV0cnkuanMnO1xyXG5pbXBvcnQgeyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5pbXBvcnQgKiBhcyBDdXJ2ZXMgZnJvbSAnLi4vZXh0cmFzL2N1cnZlcy9DdXJ2ZXMuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IyLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIHR1YmUgdGhhdCBleHRydWRlcyBhbG9uZyBhIDNEIGN1cnZlLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjbGFzcyBDdXN0b21TaW5DdXJ2ZSBleHRlbmRzIFRIUkVFLkN1cnZlIHtcclxuICpcclxuICogXHRnZXRQb2ludCggdCwgb3B0aW9uYWxUYXJnZXQgPSBuZXcgVEhSRUUuVmVjdG9yMygpICkge1xyXG4gKlxyXG4gKiBcdFx0Y29uc3QgdHggPSB0ICogMyAtIDEuNTtcclxuICogXHRcdGNvbnN0IHR5ID0gTWF0aC5zaW4oIDIgKiBNYXRoLlBJICogdCApO1xyXG4gKiBcdFx0Y29uc3QgdHogPSAwO1xyXG4gKlxyXG4gKiBcdFx0cmV0dXJuIG9wdGlvbmFsVGFyZ2V0LnNldCggdHgsIHR5LCB0eiApO1xyXG4gKiBcdH1cclxuICpcclxuICogfVxyXG4gKlxyXG4gKiBjb25zdCBwYXRoID0gbmV3IEN1c3RvbVNpbkN1cnZlKCAxMCApO1xyXG4gKiBjb25zdCBnZW9tZXRyeSA9IG5ldyBUSFJFRS5UdWJlR2VvbWV0cnkoIHBhdGgsIDIwLCAyLCA4LCBmYWxzZSApO1xyXG4gKiBjb25zdCBtYXRlcmlhbCA9IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogMHgwMGZmMDAgfSApO1xyXG4gKiBjb25zdCBtZXNoID0gbmV3IFRIUkVFLk1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG4gKiBzY2VuZS5hZGQoIG1lc2ggKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBCdWZmZXJHZW9tZXRyeVxyXG4gKi9cclxuY2xhc3MgVHViZUdlb21ldHJ5IGV4dGVuZHMgQnVmZmVyR2VvbWV0cnkge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHR1YmUgZ2VvbWV0cnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0N1cnZlfSBbcGF0aD1RdWFkcmF0aWNCZXppZXJDdXJ2ZTNdIC0gQSAzRCBjdXJ2ZSBkZWZpbmluZyB0aGUgcGF0aCBvZiB0aGUgdHViZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3R1YnVsYXJTZWdtZW50cz02NF0gLSBUaGUgbnVtYmVyIG9mIHNlZ21lbnRzIHRoYXQgbWFrZSB1cCB0aGUgdHViZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3JhZGl1cz0xXSAtVGhlIHJhZGl1cyBvZiB0aGUgdHViZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3JhZGlhbFNlZ21lbnRzPThdIC0gVGhlIG51bWJlciBvZiBzZWdtZW50cyB0aGF0IG1ha2UgdXAgdGhlIGNyb3NzLXNlY3Rpb24uXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbY2xvc2VkPWZhbHNlXSAtIFdoZXRoZXIgdGhlIHR1YmUgaXMgY2xvc2VkIG9yIG5vdC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcGF0aCA9IG5ldyBDdXJ2ZXNbICdRdWFkcmF0aWNCZXppZXJDdXJ2ZTMnIF0oIG5ldyBWZWN0b3IzKCAtIDEsIC0gMSwgMCApLCBuZXcgVmVjdG9yMyggLSAxLCAxLCAwICksIG5ldyBWZWN0b3IzKCAxLCAxLCAwICkgKSwgdHVidWxhclNlZ21lbnRzID0gNjQsIHJhZGl1cyA9IDEsIHJhZGlhbFNlZ21lbnRzID0gOCwgY2xvc2VkID0gZmFsc2UgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnVHViZUdlb21ldHJ5JztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvbGRzIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzIHRoYXQgaGF2ZSBiZWVuXHJcblx0XHQgKiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBnZW9tZXRyeS4gQW55IG1vZGlmaWNhdGlvblxyXG5cdFx0ICogYWZ0ZXIgaW5zdGFudGlhdGlvbiBkb2VzIG5vdCBjaGFuZ2UgdGhlIGdlb21ldHJ5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucGFyYW1ldGVycyA9IHtcclxuXHRcdFx0cGF0aDogcGF0aCxcclxuXHRcdFx0dHVidWxhclNlZ21lbnRzOiB0dWJ1bGFyU2VnbWVudHMsXHJcblx0XHRcdHJhZGl1czogcmFkaXVzLFxyXG5cdFx0XHRyYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsXHJcblx0XHRcdGNsb3NlZDogY2xvc2VkXHJcblx0XHR9O1xyXG5cclxuXHRcdGNvbnN0IGZyYW1lcyA9IHBhdGguY29tcHV0ZUZyZW5ldEZyYW1lcyggdHVidWxhclNlZ21lbnRzLCBjbG9zZWQgKTtcclxuXHJcblx0XHQvLyBleHBvc2UgaW50ZXJuYWxzXHJcblxyXG5cdFx0dGhpcy50YW5nZW50cyA9IGZyYW1lcy50YW5nZW50cztcclxuXHRcdHRoaXMubm9ybWFscyA9IGZyYW1lcy5ub3JtYWxzO1xyXG5cdFx0dGhpcy5iaW5vcm1hbHMgPSBmcmFtZXMuYmlub3JtYWxzO1xyXG5cclxuXHRcdC8vIGhlbHBlciB2YXJpYWJsZXNcclxuXHJcblx0XHRjb25zdCB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xyXG5cdFx0Y29uc3Qgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcclxuXHRcdGNvbnN0IHV2ID0gbmV3IFZlY3RvcjIoKTtcclxuXHRcdGxldCBQID0gbmV3IFZlY3RvcjMoKTtcclxuXHJcblx0XHQvLyBidWZmZXJcclxuXHJcblx0XHRjb25zdCB2ZXJ0aWNlcyA9IFtdO1xyXG5cdFx0Y29uc3Qgbm9ybWFscyA9IFtdO1xyXG5cdFx0Y29uc3QgdXZzID0gW107XHJcblx0XHRjb25zdCBpbmRpY2VzID0gW107XHJcblxyXG5cdFx0Ly8gY3JlYXRlIGJ1ZmZlciBkYXRhXHJcblxyXG5cdFx0Z2VuZXJhdGVCdWZmZXJEYXRhKCk7XHJcblxyXG5cdFx0Ly8gYnVpbGQgZ2VvbWV0cnlcclxuXHJcblx0XHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XHJcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcclxuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xyXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xyXG5cclxuXHRcdC8vIGZ1bmN0aW9uc1xyXG5cclxuXHRcdGZ1bmN0aW9uIGdlbmVyYXRlQnVmZmVyRGF0YSgpIHtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHR1YnVsYXJTZWdtZW50czsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Z2VuZXJhdGVTZWdtZW50KCBpICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBpZiB0aGUgZ2VvbWV0cnkgaXMgbm90IGNsb3NlZCwgZ2VuZXJhdGUgdGhlIGxhc3Qgcm93IG9mIHZlcnRpY2VzIGFuZCBub3JtYWxzXHJcblx0XHRcdC8vIGF0IHRoZSByZWd1bGFyIHBvc2l0aW9uIG9uIHRoZSBnaXZlbiBwYXRoXHJcblx0XHRcdC8vXHJcblx0XHRcdC8vIGlmIHRoZSBnZW9tZXRyeSBpcyBjbG9zZWQsIGR1cGxpY2F0ZSB0aGUgZmlyc3Qgcm93IG9mIHZlcnRpY2VzIGFuZCBub3JtYWxzICh1dnMgd2lsbCBkaWZmZXIpXHJcblxyXG5cdFx0XHRnZW5lcmF0ZVNlZ21lbnQoICggY2xvc2VkID09PSBmYWxzZSApID8gdHVidWxhclNlZ21lbnRzIDogMCApO1xyXG5cclxuXHRcdFx0Ly8gdXZzIGFyZSBnZW5lcmF0ZWQgaW4gYSBzZXBhcmF0ZSBmdW5jdGlvbi5cclxuXHRcdFx0Ly8gdGhpcyBtYWtlcyBpdCBlYXN5IGNvbXB1dGUgY29ycmVjdCB2YWx1ZXMgZm9yIGNsb3NlZCBnZW9tZXRyaWVzXHJcblxyXG5cdFx0XHRnZW5lcmF0ZVVWcygpO1xyXG5cclxuXHRcdFx0Ly8gZmluYWxseSBjcmVhdGUgZmFjZXNcclxuXHJcblx0XHRcdGdlbmVyYXRlSW5kaWNlcygpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiBnZW5lcmF0ZVNlZ21lbnQoIGkgKSB7XHJcblxyXG5cdFx0XHQvLyB3ZSB1c2UgZ2V0UG9pbnRBdCB0byBzYW1wbGUgZXZlbmx5IGRpc3RyaWJ1dGVkIHBvaW50cyBmcm9tIHRoZSBnaXZlbiBwYXRoXHJcblxyXG5cdFx0XHRQID0gcGF0aC5nZXRQb2ludEF0KCBpIC8gdHVidWxhclNlZ21lbnRzLCBQICk7XHJcblxyXG5cdFx0XHQvLyByZXRyaWV2ZSBjb3JyZXNwb25kaW5nIG5vcm1hbCBhbmQgYmlub3JtYWxcclxuXHJcblx0XHRcdGNvbnN0IE4gPSBmcmFtZXMubm9ybWFsc1sgaSBdO1xyXG5cdFx0XHRjb25zdCBCID0gZnJhbWVzLmJpbm9ybWFsc1sgaSBdO1xyXG5cclxuXHRcdFx0Ly8gZ2VuZXJhdGUgbm9ybWFscyBhbmQgdmVydGljZXMgZm9yIHRoZSBjdXJyZW50IHNlZ21lbnRcclxuXHJcblx0XHRcdGZvciAoIGxldCBqID0gMDsgaiA8PSByYWRpYWxTZWdtZW50czsgaiArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgdiA9IGogLyByYWRpYWxTZWdtZW50cyAqIE1hdGguUEkgKiAyO1xyXG5cclxuXHRcdFx0XHRjb25zdCBzaW4gPSBNYXRoLnNpbiggdiApO1xyXG5cdFx0XHRcdGNvbnN0IGNvcyA9IC0gTWF0aC5jb3MoIHYgKTtcclxuXHJcblx0XHRcdFx0Ly8gbm9ybWFsXHJcblxyXG5cdFx0XHRcdG5vcm1hbC54ID0gKCBjb3MgKiBOLnggKyBzaW4gKiBCLnggKTtcclxuXHRcdFx0XHRub3JtYWwueSA9ICggY29zICogTi55ICsgc2luICogQi55ICk7XHJcblx0XHRcdFx0bm9ybWFsLnogPSAoIGNvcyAqIE4ueiArIHNpbiAqIEIueiApO1xyXG5cdFx0XHRcdG5vcm1hbC5ub3JtYWxpemUoKTtcclxuXHJcblx0XHRcdFx0bm9ybWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7XHJcblxyXG5cdFx0XHRcdC8vIHZlcnRleFxyXG5cclxuXHRcdFx0XHR2ZXJ0ZXgueCA9IFAueCArIHJhZGl1cyAqIG5vcm1hbC54O1xyXG5cdFx0XHRcdHZlcnRleC55ID0gUC55ICsgcmFkaXVzICogbm9ybWFsLnk7XHJcblx0XHRcdFx0dmVydGV4LnogPSBQLnogKyByYWRpdXMgKiBub3JtYWwuejtcclxuXHJcblx0XHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiBnZW5lcmF0ZUluZGljZXMoKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaiA9IDE7IGogPD0gdHVidWxhclNlZ21lbnRzOyBqICsrICkge1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDE7IGkgPD0gcmFkaWFsU2VnbWVudHM7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgYSA9ICggcmFkaWFsU2VnbWVudHMgKyAxICkgKiAoIGogLSAxICkgKyAoIGkgLSAxICk7XHJcblx0XHRcdFx0XHRjb25zdCBiID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqIGogKyAoIGkgLSAxICk7XHJcblx0XHRcdFx0XHRjb25zdCBjID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqIGogKyBpO1xyXG5cdFx0XHRcdFx0Y29uc3QgZCA9ICggcmFkaWFsU2VnbWVudHMgKyAxICkgKiAoIGogLSAxICkgKyBpO1xyXG5cclxuXHRcdFx0XHRcdC8vIGZhY2VzXHJcblxyXG5cdFx0XHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XHJcblx0XHRcdFx0XHRpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiBnZW5lcmF0ZVVWcygpIHtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8PSB0dWJ1bGFyU2VnbWVudHM7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBqID0gMDsgaiA8PSByYWRpYWxTZWdtZW50czsgaiArKyApIHtcclxuXHJcblx0XHRcdFx0XHR1di54ID0gaSAvIHR1YnVsYXJTZWdtZW50cztcclxuXHRcdFx0XHRcdHV2LnkgPSBqIC8gcmFkaWFsU2VnbWVudHM7XHJcblxyXG5cdFx0XHRcdFx0dXZzLnB1c2goIHV2LngsIHV2LnkgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0gT2JqZWN0LmFzc2lnbigge30sIHNvdXJjZS5wYXJhbWV0ZXJzICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0dG9KU09OKCkge1xyXG5cclxuXHRcdGNvbnN0IGRhdGEgPSBzdXBlci50b0pTT04oKTtcclxuXHJcblx0XHRkYXRhLnBhdGggPSB0aGlzLnBhcmFtZXRlcnMucGF0aC50b0pTT04oKTtcclxuXHJcblx0XHRyZXR1cm4gZGF0YTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGYWN0b3J5IG1ldGhvZCBmb3IgY3JlYXRpbmcgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBmcm9tIHRoZSBnaXZlblxyXG5cdCAqIEpTT04gb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBBIEpTT04gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc2VyaWFsaXplZCBnZW9tZXRyeS5cclxuXHQgKiBAcmV0dXJuIHtUdWJlR2VvbWV0cnl9IEEgbmV3IGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBmcm9tSlNPTiggZGF0YSApIHtcclxuXHJcblx0XHQvLyBUaGlzIG9ubHkgd29ya3MgZm9yIGJ1aWx0LWluIGN1cnZlcyAoZS5nLiBDYXRtdWxsUm9tQ3VydmUzKS5cclxuXHRcdC8vIFVzZXIgZGVmaW5lZCBjdXJ2ZXMgb3IgaW5zdGFuY2VzIG9mIEN1cnZlUGF0aCB3aWxsIG5vdCBiZSBkZXNlcmlhbGl6ZWQuXHJcblx0XHRyZXR1cm4gbmV3IFR1YmVHZW9tZXRyeShcclxuXHRcdFx0bmV3IEN1cnZlc1sgZGF0YS5wYXRoLnR5cGUgXSgpLmZyb21KU09OKCBkYXRhLnBhdGggKSxcclxuXHRcdFx0ZGF0YS50dWJ1bGFyU2VnbWVudHMsXHJcblx0XHRcdGRhdGEucmFkaXVzLFxyXG5cdFx0XHRkYXRhLnJhZGlhbFNlZ21lbnRzLFxyXG5cdFx0XHRkYXRhLmNsb3NlZFxyXG5cdFx0KTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCB7IFR1YmVHZW9tZXRyeSB9O1xyXG4iLCJpbXBvcnQgeyBCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyR2VvbWV0cnkuanMnO1xyXG5pbXBvcnQgeyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBDYW4gYmUgdXNlZCBhcyBhIGhlbHBlciBvYmplY3QgdG8gdmlzdWFsaXplIGEgZ2VvbWV0cnkgYXMgYSB3aXJlZnJhbWUuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGdlb21ldHJ5ID0gbmV3IFRIUkVFLlNwaGVyZUdlb21ldHJ5KCk7XHJcbiAqXHJcbiAqIGNvbnN0IHdpcmVmcmFtZSA9IG5ldyBUSFJFRS5XaXJlZnJhbWVHZW9tZXRyeSggZ2VvbWV0cnkgKTtcclxuICpcclxuICogY29uc3QgbGluZSA9IG5ldyBUSFJFRS5MaW5lU2VnbWVudHMoIHdpcmVmcmFtZSApO1xyXG4gKiBsaW5lLm1hdGVyaWFsLmRlcHRoV3JpdGUgPSBmYWxzZTtcclxuICogbGluZS5tYXRlcmlhbC5vcGFjaXR5ID0gMC4yNTtcclxuICogbGluZS5tYXRlcmlhbC50cmFuc3BhcmVudCA9IHRydWU7XHJcbiAqXHJcbiAqIHNjZW5lLmFkZCggbGluZSApO1xyXG4gKiBgYGBcclxuICpcclxuICogTm90ZTogSXQgaXMgbm90IHlldCBwb3NzaWJsZSB0byBzZXJpYWxpemUvZGVzZXJpYWxpemUgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBCdWZmZXJHZW9tZXRyeVxyXG4gKi9cclxuY2xhc3MgV2lyZWZyYW1lR2VvbWV0cnkgZXh0ZW5kcyBCdWZmZXJHZW9tZXRyeSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgd2lyZWZyYW1lIGdlb21ldHJ5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHs/QnVmZmVyR2VvbWV0cnl9IFtnZW9tZXRyeT1udWxsXSAtIFRoZSBnZW9tZXRyeS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggZ2VvbWV0cnkgPSBudWxsICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ1dpcmVmcmFtZUdlb21ldHJ5JztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvbGRzIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzIHRoYXQgaGF2ZSBiZWVuXHJcblx0XHQgKiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBnZW9tZXRyeS4gQW55IG1vZGlmaWNhdGlvblxyXG5cdFx0ICogYWZ0ZXIgaW5zdGFudGlhdGlvbiBkb2VzIG5vdCBjaGFuZ2UgdGhlIGdlb21ldHJ5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucGFyYW1ldGVycyA9IHtcclxuXHRcdFx0Z2VvbWV0cnk6IGdlb21ldHJ5XHJcblx0XHR9O1xyXG5cclxuXHRcdGlmICggZ2VvbWV0cnkgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHQvLyBidWZmZXJcclxuXHJcblx0XHRcdGNvbnN0IHZlcnRpY2VzID0gW107XHJcblx0XHRcdGNvbnN0IGVkZ2VzID0gbmV3IFNldCgpO1xyXG5cclxuXHRcdFx0Ly8gaGVscGVyIHZhcmlhYmxlc1xyXG5cclxuXHRcdFx0Y29uc3Qgc3RhcnQgPSBuZXcgVmVjdG9yMygpO1xyXG5cdFx0XHRjb25zdCBlbmQgPSBuZXcgVmVjdG9yMygpO1xyXG5cclxuXHRcdFx0aWYgKCBnZW9tZXRyeS5pbmRleCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0Ly8gaW5kZXhlZCBCdWZmZXJHZW9tZXRyeVxyXG5cclxuXHRcdFx0XHRjb25zdCBwb3NpdGlvbiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XHJcblx0XHRcdFx0Y29uc3QgaW5kaWNlcyA9IGdlb21ldHJ5LmluZGV4O1xyXG5cdFx0XHRcdGxldCBncm91cHMgPSBnZW9tZXRyeS5ncm91cHM7XHJcblxyXG5cdFx0XHRcdGlmICggZ3JvdXBzLmxlbmd0aCA9PT0gMCApIHtcclxuXHJcblx0XHRcdFx0XHRncm91cHMgPSBbIHsgc3RhcnQ6IDAsIGNvdW50OiBpbmRpY2VzLmNvdW50LCBtYXRlcmlhbEluZGV4OiAwIH0gXTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyBjcmVhdGUgYSBkYXRhIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIGFsbCBlZGdlcyB3aXRob3V0IGR1cGxpY2F0ZXNcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IG8gPSAwLCBvbCA9IGdyb3Vwcy5sZW5ndGg7IG8gPCBvbDsgKysgbyApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBncm91cCA9IGdyb3Vwc1sgbyBdO1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGdyb3VwU3RhcnQgPSBncm91cC5zdGFydDtcclxuXHRcdFx0XHRcdGNvbnN0IGdyb3VwQ291bnQgPSBncm91cC5jb3VudDtcclxuXHJcblx0XHRcdFx0XHRmb3IgKCBsZXQgaSA9IGdyb3VwU3RhcnQsIGwgPSAoIGdyb3VwU3RhcnQgKyBncm91cENvdW50ICk7IGkgPCBsOyBpICs9IDMgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRmb3IgKCBsZXQgaiA9IDA7IGogPCAzOyBqICsrICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRjb25zdCBpbmRleDEgPSBpbmRpY2VzLmdldFgoIGkgKyBqICk7XHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgaW5kZXgyID0gaW5kaWNlcy5nZXRYKCBpICsgKCBqICsgMSApICUgMyApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRzdGFydC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgaW5kZXgxICk7XHJcblx0XHRcdFx0XHRcdFx0ZW5kLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBpbmRleDIgKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKCBpc1VuaXF1ZUVkZ2UoIHN0YXJ0LCBlbmQsIGVkZ2VzICkgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0dmVydGljZXMucHVzaCggc3RhcnQueCwgc3RhcnQueSwgc3RhcnQueiApO1xyXG5cdFx0XHRcdFx0XHRcdFx0dmVydGljZXMucHVzaCggZW5kLngsIGVuZC55LCBlbmQueiApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHQvLyBub24taW5kZXhlZCBCdWZmZXJHZW9tZXRyeVxyXG5cclxuXHRcdFx0XHRjb25zdCBwb3NpdGlvbiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9ICggcG9zaXRpb24uY291bnQgLyAzICk7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdGZvciAoIGxldCBqID0gMDsgaiA8IDM7IGogKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHQvLyB0aHJlZSBlZGdlcyBwZXIgdHJpYW5nbGUsIGFuIGVkZ2UgaXMgcmVwcmVzZW50ZWQgYXMgKGluZGV4MSwgaW5kZXgyKVxyXG5cdFx0XHRcdFx0XHQvLyBlLmcuIHRoZSBmaXJzdCB0cmlhbmdsZSBoYXMgdGhlIGZvbGxvd2luZyBlZGdlczogKDAsMSksKDEsMiksKDIsMClcclxuXHJcblx0XHRcdFx0XHRcdGNvbnN0IGluZGV4MSA9IDMgKiBpICsgajtcclxuXHRcdFx0XHRcdFx0Y29uc3QgaW5kZXgyID0gMyAqIGkgKyAoICggaiArIDEgKSAlIDMgKTtcclxuXHJcblx0XHRcdFx0XHRcdHN0YXJ0LmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBpbmRleDEgKTtcclxuXHRcdFx0XHRcdFx0ZW5kLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBpbmRleDIgKTtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggaXNVbmlxdWVFZGdlKCBzdGFydCwgZW5kLCBlZGdlcyApID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCBzdGFydC54LCBzdGFydC55LCBzdGFydC56ICk7XHJcblx0XHRcdFx0XHRcdFx0dmVydGljZXMucHVzaCggZW5kLngsIGVuZC55LCBlbmQueiApO1xyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gYnVpbGQgZ2VvbWV0cnlcclxuXHJcblx0XHRcdHRoaXMuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0gT2JqZWN0LmFzc2lnbigge30sIHNvdXJjZS5wYXJhbWV0ZXJzICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzVW5pcXVlRWRnZSggc3RhcnQsIGVuZCwgZWRnZXMgKSB7XHJcblxyXG5cdGNvbnN0IGhhc2gxID0gYCR7c3RhcnQueH0sJHtzdGFydC55fSwke3N0YXJ0Lnp9LSR7ZW5kLnh9LCR7ZW5kLnl9LCR7ZW5kLnp9YDtcclxuXHRjb25zdCBoYXNoMiA9IGAke2VuZC54fSwke2VuZC55fSwke2VuZC56fS0ke3N0YXJ0Lnh9LCR7c3RhcnQueX0sJHtzdGFydC56fWA7IC8vIGNvaW5jaWRlbnQgZWRnZVxyXG5cclxuXHRpZiAoIGVkZ2VzLmhhcyggaGFzaDEgKSA9PT0gdHJ1ZSB8fCBlZGdlcy5oYXMoIGhhc2gyICkgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIGZhbHNlO1xyXG5cclxuXHR9IGVsc2Uge1xyXG5cclxuXHRcdGVkZ2VzLmFkZCggaGFzaDEgKTtcclxuXHRcdGVkZ2VzLmFkZCggaGFzaDIgKTtcclxuXHRcdHJldHVybiB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgV2lyZWZyYW1lR2VvbWV0cnkgfTtcclxuIiwiaW1wb3J0IHsgTWF0ZXJpYWwgfSBmcm9tICcuL01hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi9tYXRoL0NvbG9yLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIG1hdGVyaWFsIGNhbiByZWNlaXZlIHNoYWRvd3MsIGJ1dCBvdGhlcndpc2UgaXMgY29tcGxldGVseSB0cmFuc3BhcmVudC5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgZ2VvbWV0cnkgPSBuZXcgVEhSRUUuUGxhbmVHZW9tZXRyeSggMjAwMCwgMjAwMCApO1xyXG4gKiBnZW9tZXRyeS5yb3RhdGVYKCAtIE1hdGguUEkgLyAyICk7XHJcbiAqXHJcbiAqIGNvbnN0IG1hdGVyaWFsID0gbmV3IFRIUkVFLlNoYWRvd01hdGVyaWFsKCk7XHJcbiAqIG1hdGVyaWFsLm9wYWNpdHkgPSAwLjI7XHJcbiAqXHJcbiAqIGNvbnN0IHBsYW5lID0gbmV3IFRIUkVFLk1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG4gKiBwbGFuZS5wb3NpdGlvbi55ID0gLTIwMDtcclxuICogcGxhbmUucmVjZWl2ZVNoYWRvdyA9IHRydWU7XHJcbiAqIHNjZW5lLmFkZCggcGxhbmUgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBNYXRlcmlhbFxyXG4gKi9cclxuY2xhc3MgU2hhZG93TWF0ZXJpYWwgZXh0ZW5kcyBNYXRlcmlhbCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc2hhZG93IG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbWV0ZXJzXSAtIEFuIG9iamVjdCB3aXRoIG9uZSBvciBtb3JlIHByb3BlcnRpZXNcclxuXHQgKiBkZWZpbmluZyB0aGUgbWF0ZXJpYWwncyBhcHBlYXJhbmNlLiBBbnkgcHJvcGVydHkgb2YgdGhlIG1hdGVyaWFsXHJcblx0ICogKGluY2x1ZGluZyBhbnkgcHJvcGVydHkgZnJvbSBpbmhlcml0ZWQgbWF0ZXJpYWxzKSBjYW4gYmUgcGFzc2VkXHJcblx0ICogaW4gaGVyZS4gQ29sb3IgdmFsdWVzIGNhbiBiZSBwYXNzZWQgYW55IHR5cGUgb2YgdmFsdWUgYWNjZXB0ZWRcclxuXHQgKiBieSB7QGxpbmsgQ29sb3Ijc2V0fS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVycyApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1NoYWRvd01hdGVyaWFsID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnU2hhZG93TWF0ZXJpYWwnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQ29sb3Igb2YgdGhlIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtDb2xvcn1cclxuXHRcdCAqIEBkZWZhdWx0ICgwLDAsMClcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHgwMDAwMDAgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIE92ZXJ3cml0dGVuIHNpbmNlIHNoYWRvdyBtYXRlcmlhbHMgYXJlIHRyYW5zcGFyZW50XHJcblx0XHQgKiBieSBkZWZhdWx0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRyYW5zcGFyZW50ID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIG1hdGVyaWFsIGlzIGFmZmVjdGVkIGJ5IGZvZyBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZm9nID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xyXG5cclxuXHRcdHRoaXMuZm9nID0gc291cmNlLmZvZztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgU2hhZG93TWF0ZXJpYWwgfTtcclxuIiwiaW1wb3J0IHsgU2hhZGVyTWF0ZXJpYWwgfSBmcm9tICcuL1NoYWRlck1hdGVyaWFsLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGNsYXNzIHdvcmtzIGp1c3QgbGlrZSB7QGxpbmsgU2hhZGVyTWF0ZXJpYWx9LCBleGNlcHQgdGhhdCBkZWZpbml0aW9uc1xyXG4gKiBvZiBidWlsdC1pbiB1bmlmb3JtcyBhbmQgYXR0cmlidXRlcyBhcmUgbm90IGF1dG9tYXRpY2FsbHkgcHJlcGVuZGVkIHRvIHRoZVxyXG4gKiBHTFNMIHNoYWRlciBjb2RlLlxyXG4gKlxyXG4gKiBgUmF3U2hhZGVyTWF0ZXJpYWxgIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCB7QGxpbmsgV2ViR0xSZW5kZXJlcn0uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBTaGFkZXJNYXRlcmlhbFxyXG4gKi9cclxuY2xhc3MgUmF3U2hhZGVyTWF0ZXJpYWwgZXh0ZW5kcyBTaGFkZXJNYXRlcmlhbCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcmF3IHNoYWRlciBtYXRlcmlhbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1ldGVyc10gLSBBbiBvYmplY3Qgd2l0aCBvbmUgb3IgbW9yZSBwcm9wZXJ0aWVzXHJcblx0ICogZGVmaW5pbmcgdGhlIG1hdGVyaWFsJ3MgYXBwZWFyYW5jZS4gQW55IHByb3BlcnR5IG9mIHRoZSBtYXRlcmlhbFxyXG5cdCAqIChpbmNsdWRpbmcgYW55IHByb3BlcnR5IGZyb20gaW5oZXJpdGVkIG1hdGVyaWFscykgY2FuIGJlIHBhc3NlZFxyXG5cdCAqIGluIGhlcmUuIENvbG9yIHZhbHVlcyBjYW4gYmUgcGFzc2VkIGFueSB0eXBlIG9mIHZhbHVlIGFjY2VwdGVkXHJcblx0ICogYnkge0BsaW5rIENvbG9yI3NldH0uXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHBhcmFtZXRlcnMgKSB7XHJcblxyXG5cdFx0c3VwZXIoIHBhcmFtZXRlcnMgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNSYXdTaGFkZXJNYXRlcmlhbCA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ1Jhd1NoYWRlck1hdGVyaWFsJztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgUmF3U2hhZGVyTWF0ZXJpYWwgfTtcclxuIiwiaW1wb3J0IHsgVGFuZ2VudFNwYWNlTm9ybWFsTWFwIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgTWF0ZXJpYWwgfSBmcm9tICcuL01hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uL21hdGgvVmVjdG9yMi5qcyc7XHJcbmltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vbWF0aC9Db2xvci5qcyc7XHJcbmltcG9ydCB7IEV1bGVyIH0gZnJvbSAnLi4vbWF0aC9FdWxlci5qcyc7XHJcblxyXG4vKipcclxuICogQSBzdGFuZGFyZCBwaHlzaWNhbGx5IGJhc2VkIG1hdGVyaWFsLCB1c2luZyBNZXRhbGxpYy1Sb3VnaG5lc3Mgd29ya2Zsb3cuXHJcbiAqXHJcbiAqIFBoeXNpY2FsbHkgYmFzZWQgcmVuZGVyaW5nIChQQlIpIGhhcyByZWNlbnRseSBiZWNvbWUgdGhlIHN0YW5kYXJkIGluIG1hbnlcclxuICogM0QgYXBwbGljYXRpb25zLCBzdWNoIGFzIFtVbml0eV17QGxpbmsgaHR0cHM6Ly9ibG9ncy51bml0eTNkLmNvbS8yMDE0LzEwLzI5L3BoeXNpY2FsbHktYmFzZWQtc2hhZGluZy1pbi11bml0eS01LWEtcHJpbWVyL30sXHJcbiAqIFtVbnJlYWxde0BsaW5rIGh0dHBzOi8vZG9jcy51bnJlYWxlbmdpbmUuY29tL2xhdGVzdC9JTlQvRW5naW5lL1JlbmRlcmluZy9NYXRlcmlhbHMvUGh5c2ljYWxseUJhc2VkL30gYW5kXHJcbiAqIFszRCBTdHVkaW8gTWF4XXtAbGluayBodHRwOi8vYXJlYS5hdXRvZGVzay5jb20vYmxvZ3MvdGhlLTNkcy1tYXgtYmxvZy93aGF0MDM5cy1uZXctZm9yLXJlbmRlcmluZy1pbi0zZHMtbWF4LTIwMTd9LlxyXG4gKlxyXG4gKiBUaGlzIGFwcHJvYWNoIGRpZmZlcnMgZnJvbSBvbGRlciBhcHByb2FjaGVzIGluIHRoYXQgaW5zdGVhZCBvZiB1c2luZ1xyXG4gKiBhcHByb3hpbWF0aW9ucyBmb3IgdGhlIHdheSBpbiB3aGljaCBsaWdodCBpbnRlcmFjdHMgd2l0aCBhIHN1cmZhY2UsIGFcclxuICogcGh5c2ljYWxseSBjb3JyZWN0IG1vZGVsIGlzIHVzZWQuIFRoZSBpZGVhIGlzIHRoYXQsIGluc3RlYWQgb2YgdHdlYWtpbmdcclxuICogbWF0ZXJpYWxzIHRvIGxvb2sgZ29vZCB1bmRlciBzcGVjaWZpYyBsaWdodGluZywgYSBtYXRlcmlhbCBjYW4gYmUgY3JlYXRlZFxyXG4gKiB0aGF0IHdpbGwgcmVhY3QgJ2NvcnJlY3RseScgdW5kZXIgYWxsIGxpZ2h0aW5nIHNjZW5hcmlvcy5cclxuICpcclxuICogSW4gcHJhY3RpY2UgdGhpcyBnaXZlcyBhIG1vcmUgYWNjdXJhdGUgYW5kIHJlYWxpc3RpYyBsb29raW5nIHJlc3VsdCB0aGFuXHJcbiAqIHRoZSB7QGxpbmsgTWVzaExhbWJlcnRNYXRlcmlhbH0gb3Ige0BsaW5rIE1lc2hQaG9uZ01hdGVyaWFsfSwgYXQgdGhlIGNvc3Qgb2ZcclxuICogYmVpbmcgc29tZXdoYXQgbW9yZSBjb21wdXRhdGlvbmFsbHkgZXhwZW5zaXZlLiBgTWVzaFN0YW5kYXJkTWF0ZXJpYWxgIHVzZXMgcGVyLWZyYWdtZW50XHJcbiAqIHNoYWRpbmcuXHJcbiAqXHJcbiAqIE5vdGUgdGhhdCBmb3IgYmVzdCByZXN1bHRzIHlvdSBzaG91bGQgYWx3YXlzIHNwZWNpZnkgYW4gZW52aXJvbm1lbnQgbWFwIHdoZW4gdXNpbmcgdGhpcyBtYXRlcmlhbC5cclxuICpcclxuICogRm9yIGEgbm9uLXRlY2huaWNhbCBpbnRyb2R1Y3Rpb24gdG8gdGhlIGNvbmNlcHQgb2YgUEJSIGFuZCBob3cgdG8gc2V0IHVwIGFcclxuICogUEJSIG1hdGVyaWFsLCBjaGVjayBvdXQgdGhlc2UgYXJ0aWNsZXMgYnkgdGhlIHBlb3BsZSBhdCBbbWFybW9zZXRde0BsaW5rIGh0dHBzOi8vd3d3Lm1hcm1vc2V0LmNvfTpcclxuICpcclxuICogLSBbQmFzaWMgVGhlb3J5IG9mIFBoeXNpY2FsbHkgQmFzZWQgUmVuZGVyaW5nXXtAbGluayBodHRwczovL3d3dy5tYXJtb3NldC5jby9wb3N0cy9iYXNpYy10aGVvcnktb2YtcGh5c2ljYWxseS1iYXNlZC1yZW5kZXJpbmcvfVxyXG4gKiAtIFtQaHlzaWNhbGx5IEJhc2VkIFJlbmRlcmluZyBhbmQgWW91IENhbiBUb29de0BsaW5rIGh0dHBzOi8vd3d3Lm1hcm1vc2V0LmNvL3Bvc3RzL3BoeXNpY2FsbHktYmFzZWQtcmVuZGVyaW5nLWFuZC15b3UtY2FuLXRvby99XHJcbiAqXHJcbiAqIFRlY2huaWNhbCBkZXRhaWxzIG9mIHRoZSBhcHByb2FjaCB1c2VkIGluIHRocmVlLmpzIChhbmQgbW9zdCBvdGhlciBQQlIgc3lzdGVtcykgY2FuIGJlIGZvdW5kIGlzIHRoaXNcclxuICogW3BhcGVyIGZyb20gRGlzbmV5XXtAbGluayBodHRwczovL21lZGlhLmRpc25leWFuaW1hdGlvbi5jb20vdXBsb2Fkcy9wcm9kdWN0aW9uL3B1YmxpY2F0aW9uX2Fzc2V0LzQ4L2Fzc2V0L3MyMDEyX3Bic19kaXNuZXlfYnJkZl9ub3Rlc192My5wZGZ9XHJcbiAqIChwZGYpLCBieSBCcmVudCBCdXJsZXkuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBNYXRlcmlhbFxyXG4gKi9cclxuY2xhc3MgTWVzaFN0YW5kYXJkTWF0ZXJpYWwgZXh0ZW5kcyBNYXRlcmlhbCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbWVzaCBzdGFuZGFyZCBtYXRlcmlhbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1ldGVyc10gLSBBbiBvYmplY3Qgd2l0aCBvbmUgb3IgbW9yZSBwcm9wZXJ0aWVzXHJcblx0ICogZGVmaW5pbmcgdGhlIG1hdGVyaWFsJ3MgYXBwZWFyYW5jZS4gQW55IHByb3BlcnR5IG9mIHRoZSBtYXRlcmlhbFxyXG5cdCAqIChpbmNsdWRpbmcgYW55IHByb3BlcnR5IGZyb20gaW5oZXJpdGVkIG1hdGVyaWFscykgY2FuIGJlIHBhc3NlZFxyXG5cdCAqIGluIGhlcmUuIENvbG9yIHZhbHVlcyBjYW4gYmUgcGFzc2VkIGFueSB0eXBlIG9mIHZhbHVlIGFjY2VwdGVkXHJcblx0ICogYnkge0BsaW5rIENvbG9yI3NldH0uXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHBhcmFtZXRlcnMgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ01lc2hTdGFuZGFyZE1hdGVyaWFsJztcclxuXHJcblx0XHR0aGlzLmRlZmluZXMgPSB7ICdTVEFOREFSRCc6ICcnIH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDb2xvciBvZiB0aGUgbWF0ZXJpYWwuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0NvbG9yfVxyXG5cdFx0ICogQGRlZmF1bHQgKDEsMSwxKVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCAweGZmZmZmZiApOyAvLyBkaWZmdXNlXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3cgcm91Z2ggdGhlIG1hdGVyaWFsIGFwcGVhcnMuIGAwLjBgIG1lYW5zIGEgc21vb3RoIG1pcnJvciByZWZsZWN0aW9uLCBgMS4wYFxyXG5cdFx0ICogbWVhbnMgZnVsbHkgZGlmZnVzZS4gSWYgYHJvdWdobmVzc01hcGAgaXMgYWxzbyBwcm92aWRlZCxcclxuXHRcdCAqIGJvdGggdmFsdWVzIGFyZSBtdWx0aXBsaWVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucm91Z2huZXNzID0gMS4wO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG93IG11Y2ggdGhlIG1hdGVyaWFsIGlzIGxpa2UgYSBtZXRhbC4gTm9uLW1ldGFsbGljIG1hdGVyaWFscyBzdWNoIGFzIHdvb2RcclxuXHRcdCAqIG9yIHN0b25lIHVzZSBgMC4wYCwgbWV0YWxsaWMgdXNlIGAxLjBgLCB3aXRoIG5vdGhpbmcgKHVzdWFsbHkpIGluIGJldHdlZW4uXHJcblx0XHQgKiBBIHZhbHVlIGJldHdlZW4gYDAuMGAgYW5kIGAxLjBgIGNvdWxkIGJlIHVzZWQgZm9yIGEgcnVzdHkgbWV0YWwgbG9vay5cclxuXHRcdCAqIElmIGBtZXRhbG5lc3NNYXBgIGlzIGFsc28gcHJvdmlkZWQsIGJvdGggdmFsdWVzIGFyZSBtdWx0aXBsaWVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWV0YWxuZXNzID0gMC4wO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNvbG9yIG1hcC4gTWF5IG9wdGlvbmFsbHkgaW5jbHVkZSBhbiBhbHBoYSBjaGFubmVsLCB0eXBpY2FsbHkgY29tYmluZWRcclxuXHRcdCAqIHdpdGgge0BsaW5rIE1hdGVyaWFsI3RyYW5zcGFyZW50fSBvciB7QGxpbmsgTWF0ZXJpYWwjYWxwaGFUZXN0fS4gVGhlIHRleHR1cmUgbWFwXHJcblx0XHQgKiBjb2xvciBpcyBtb2R1bGF0ZWQgYnkgdGhlIGRpZmZ1c2UgYGNvbG9yYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBsaWdodCBtYXAuIFJlcXVpcmVzIGEgc2Vjb25kIHNldCBvZiBVVnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxpZ2h0TWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEludGVuc2l0eSBvZiB0aGUgYmFrZWQgbGlnaHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5saWdodE1hcEludGVuc2l0eSA9IDEuMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByZWQgY2hhbm5lbCBvZiB0aGlzIHRleHR1cmUgaXMgdXNlZCBhcyB0aGUgYW1iaWVudCBvY2NsdXNpb24gbWFwLlxyXG5cdFx0ICogUmVxdWlyZXMgYSBzZWNvbmQgc2V0IG9mIFVWcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYW9NYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSW50ZW5zaXR5IG9mIHRoZSBhbWJpZW50IG9jY2x1c2lvbiBlZmZlY3QuIFJhbmdlIGlzIGBbMCwxXWAsIHdoZXJlIGAwYFxyXG5cdFx0ICogZGlzYWJsZXMgYW1iaWVudCBvY2NsdXNpb24uIFdoZXJlIGludGVuc2l0eSBpcyBgMWAgYW5kIHRoZSBBTyBtYXAnc1xyXG5cdFx0ICogcmVkIGNoYW5uZWwgaXMgYWxzbyBgMWAsIGFtYmllbnQgbGlnaHQgaXMgZnVsbHkgb2NjbHVkZWQgb24gYSBzdXJmYWNlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSAxLjA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBFbWlzc2l2ZSAobGlnaHQpIGNvbG9yIG9mIHRoZSBtYXRlcmlhbCwgZXNzZW50aWFsbHkgYSBzb2xpZCBjb2xvclxyXG5cdFx0ICogdW5hZmZlY3RlZCBieSBvdGhlciBsaWdodGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Q29sb3J9XHJcblx0XHQgKiBAZGVmYXVsdCAoMCwwLDApXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZW1pc3NpdmUgPSBuZXcgQ29sb3IoIDB4MDAwMDAwICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBJbnRlbnNpdHkgb2YgdGhlIGVtaXNzaXZlIGxpZ2h0LiBNb2R1bGF0ZXMgdGhlIGVtaXNzaXZlIGNvbG9yLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgPSAxLjA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTZXQgZW1pc3NpdmUgKGdsb3cpIG1hcC4gVGhlIGVtaXNzaXZlIG1hcCBjb2xvciBpcyBtb2R1bGF0ZWQgYnkgdGhlXHJcblx0XHQgKiBlbWlzc2l2ZSBjb2xvciBhbmQgdGhlIGVtaXNzaXZlIGludGVuc2l0eS4gSWYgeW91IGhhdmUgYW4gZW1pc3NpdmUgbWFwLFxyXG5cdFx0ICogYmUgc3VyZSB0byBzZXQgdGhlIGVtaXNzaXZlIGNvbG9yIHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIGJsYWNrLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5lbWlzc2l2ZU1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdGV4dHVyZSB0byBjcmVhdGUgYSBidW1wIG1hcC4gVGhlIGJsYWNrIGFuZCB3aGl0ZSB2YWx1ZXMgbWFwIHRvIHRoZVxyXG5cdFx0ICogcGVyY2VpdmVkIGRlcHRoIGluIHJlbGF0aW9uIHRvIHRoZSBsaWdodHMuIEJ1bXAgZG9lc24ndCBhY3R1YWxseSBhZmZlY3RcclxuXHRcdCAqIHRoZSBnZW9tZXRyeSBvZiB0aGUgb2JqZWN0LCBvbmx5IHRoZSBsaWdodGluZy4gSWYgYSBub3JtYWwgbWFwIGlzIGRlZmluZWRcclxuXHRcdCAqIHRoaXMgd2lsbCBiZSBpZ25vcmVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5idW1wTWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvdyBtdWNoIHRoZSBidW1wIG1hcCBhZmZlY3RzIHRoZSBtYXRlcmlhbC4gVHlwaWNhbCByYW5nZSBpcyBgWzAsMV1gLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYnVtcFNjYWxlID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB0ZXh0dXJlIHRvIGNyZWF0ZSBhIG5vcm1hbCBtYXAuIFRoZSBSR0IgdmFsdWVzIGFmZmVjdCB0aGUgc3VyZmFjZVxyXG5cdFx0ICogbm9ybWFsIGZvciBlYWNoIHBpeGVsIGZyYWdtZW50IGFuZCBjaGFuZ2UgdGhlIHdheSB0aGUgY29sb3IgaXMgbGl0LiBOb3JtYWxcclxuXHRcdCAqIG1hcHMgZG8gbm90IGNoYW5nZSB0aGUgYWN0dWFsIHNoYXBlIG9mIHRoZSBzdXJmYWNlLCBvbmx5IHRoZSBsaWdodGluZy4gSW5cclxuXHRcdCAqIGNhc2UgdGhlIG1hdGVyaWFsIGhhcyBhIG5vcm1hbCBtYXAgYXV0aG9yZWQgdXNpbmcgdGhlIGxlZnQgaGFuZGVkXHJcblx0XHQgKiBjb252ZW50aW9uLCB0aGUgYHlgIGNvbXBvbmVudCBvZiBgbm9ybWFsU2NhbGVgIHNob3VsZCBiZSBuZWdhdGVkIHRvIGNvbXBlbnNhdGVcclxuXHRcdCAqIGZvciB0aGUgZGlmZmVyZW50IGhhbmRlZG5lc3MuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vcm1hbE1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdHlwZSBvZiBub3JtYWwgbWFwLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoVGFuZ2VudFNwYWNlTm9ybWFsTWFwfE9iamVjdFNwYWNlTm9ybWFsTWFwKX1cclxuXHRcdCAqIEBkZWZhdWx0IFRhbmdlbnRTcGFjZU5vcm1hbE1hcFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vcm1hbE1hcFR5cGUgPSBUYW5nZW50U3BhY2VOb3JtYWxNYXA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3cgbXVjaCB0aGUgbm9ybWFsIG1hcCBhZmZlY3RzIHRoZSBtYXRlcmlhbC4gVHlwaWNhbCB2YWx1ZSByYW5nZSBpcyBgWzAsMV1gLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3IyfVxyXG5cdFx0ICogQGRlZmF1bHQgKDEsMSlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub3JtYWxTY2FsZSA9IG5ldyBWZWN0b3IyKCAxLCAxICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZGlzcGxhY2VtZW50IG1hcCBhZmZlY3RzIHRoZSBwb3NpdGlvbiBvZiB0aGUgbWVzaCdzIHZlcnRpY2VzLiBVbmxpa2VcclxuXHRcdCAqIG90aGVyIG1hcHMgd2hpY2ggb25seSBhZmZlY3QgdGhlIGxpZ2h0IGFuZCBzaGFkZSBvZiB0aGUgbWF0ZXJpYWwgdGhlXHJcblx0XHQgKiBkaXNwbGFjZWQgdmVydGljZXMgY2FuIGNhc3Qgc2hhZG93cywgYmxvY2sgb3RoZXIgb2JqZWN0cywgYW5kIG90aGVyd2lzZVxyXG5cdFx0ICogYWN0IGFzIHJlYWwgZ2VvbWV0cnkuIFRoZSBkaXNwbGFjZW1lbnQgdGV4dHVyZSBpcyBhbiBpbWFnZSB3aGVyZSB0aGUgdmFsdWVcclxuXHRcdCAqIG9mIGVhY2ggcGl4ZWwgKHdoaXRlIGJlaW5nIHRoZSBoaWdoZXN0KSBpcyBtYXBwZWQgYWdhaW5zdCwgYW5kXHJcblx0XHQgKiByZXBvc2l0aW9ucywgdGhlIHZlcnRpY2VzIG9mIHRoZSBtZXNoLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG93IG11Y2ggdGhlIGRpc3BsYWNlbWVudCBtYXAgYWZmZWN0cyB0aGUgbWVzaCAod2hlcmUgYmxhY2sgaXMgbm9cclxuXHRcdCAqIGRpc3BsYWNlbWVudCwgYW5kIHdoaXRlIGlzIG1heGltdW0gZGlzcGxhY2VtZW50KS4gV2l0aG91dCBhIGRpc3BsYWNlbWVudFxyXG5cdFx0ICogbWFwIHNldCwgdGhpcyB2YWx1ZSBpcyBub3QgYXBwbGllZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBvZmZzZXQgb2YgdGhlIGRpc3BsYWNlbWVudCBtYXAncyB2YWx1ZXMgb24gdGhlIG1lc2gncyB2ZXJ0aWNlcy5cclxuXHRcdCAqIFRoZSBiaWFzIGlzIGFkZGVkIHRvIHRoZSBzY2FsZWQgc2FtcGxlIG9mIHRoZSBkaXNwbGFjZW1lbnQgbWFwLlxyXG5cdFx0ICogV2l0aG91dCBhIGRpc3BsYWNlbWVudCBtYXAgc2V0LCB0aGlzIHZhbHVlIGlzIG5vdCBhcHBsaWVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZ3JlZW4gY2hhbm5lbCBvZiB0aGlzIHRleHR1cmUgaXMgdXNlZCB0byBhbHRlciB0aGUgcm91Z2huZXNzIG9mIHRoZVxyXG5cdFx0ICogbWF0ZXJpYWwuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJvdWdobmVzc01hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYmx1ZSBjaGFubmVsIG9mIHRoaXMgdGV4dHVyZSBpcyB1c2VkIHRvIGFsdGVyIHRoZSBtZXRhbG5lc3Mgb2YgdGhlXHJcblx0XHQgKiBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWV0YWxuZXNzTWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBhbHBoYSBtYXAgaXMgYSBncmF5c2NhbGUgdGV4dHVyZSB0aGF0IGNvbnRyb2xzIHRoZSBvcGFjaXR5IGFjcm9zcyB0aGVcclxuXHRcdCAqIHN1cmZhY2UgKGJsYWNrOiBmdWxseSB0cmFuc3BhcmVudDsgd2hpdGU6IGZ1bGx5IG9wYXF1ZSkuXHJcblx0XHQgKlxyXG5cdFx0ICogT25seSB0aGUgY29sb3Igb2YgdGhlIHRleHR1cmUgaXMgdXNlZCwgaWdub3JpbmcgdGhlIGFscGhhIGNoYW5uZWwgaWYgb25lXHJcblx0XHQgKiBleGlzdHMuIEZvciBSR0IgYW5kIFJHQkEgdGV4dHVyZXMsIHRoZSByZW5kZXJlciB3aWxsIHVzZSB0aGUgZ3JlZW4gY2hhbm5lbFxyXG5cdFx0ICogd2hlbiBzYW1wbGluZyB0aGlzIHRleHR1cmUgZHVlIHRvIHRoZSBleHRyYSBiaXQgb2YgcHJlY2lzaW9uIHByb3ZpZGVkIGZvclxyXG5cdFx0ICogZ3JlZW4gaW4gRFhULWNvbXByZXNzZWQgYW5kIHVuY29tcHJlc3NlZCBSR0IgNTY1IGZvcm1hdHMuIEx1bWluYW5jZS1vbmx5IGFuZFxyXG5cdFx0ICogbHVtaW5hbmNlL2FscGhhIHRleHR1cmVzIHdpbGwgYWxzbyBzdGlsbCB3b3JrIGFzIGV4cGVjdGVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hbHBoYU1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZW52aXJvbm1lbnQgbWFwLiBUbyBlbnN1cmUgYSBwaHlzaWNhbGx5IGNvcnJlY3QgcmVuZGVyaW5nLCBlbnZpcm9ubWVudCBtYXBzXHJcblx0XHQgKiBhcmUgaW50ZXJuYWxseSBwcmUtcHJvY2Vzc2VkIHdpdGgge0BsaW5rIFBNUkVNR2VuZXJhdG9yfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZW52TWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByb3RhdGlvbiBvZiB0aGUgZW52aXJvbm1lbnQgbWFwIGluIHJhZGlhbnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0V1bGVyfVxyXG5cdFx0ICogQGRlZmF1bHQgKDAsMCwwKVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmVudk1hcFJvdGF0aW9uID0gbmV3IEV1bGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTY2FsZXMgdGhlIGVmZmVjdCBvZiB0aGUgZW52aXJvbm1lbnQgbWFwIGJ5IG11bHRpcGx5aW5nIGl0cyBjb2xvci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmVudk1hcEludGVuc2l0eSA9IDEuMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlbmRlcnMgdGhlIGdlb21ldHJ5IGFzIGEgd2lyZWZyYW1lLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy53aXJlZnJhbWUgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENvbnRyb2xzIHRoZSB0aGlja25lc3Mgb2YgdGhlIHdpcmVmcmFtZS5cclxuXHRcdCAqXHJcblx0XHQgKiBDYW4gb25seSBiZSB1c2VkIHdpdGgge0BsaW5rIFNWR1JlbmRlcmVyfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIGFwcGVhcmFuY2Ugb2Ygd2lyZWZyYW1lIGVuZHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQ2FuIG9ubHkgYmUgdXNlZCB3aXRoIHtAbGluayBTVkdSZW5kZXJlcn0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeygncm91bmQnfCdiZXZlbCd8J21pdGVyJyl9XHJcblx0XHQgKiBAZGVmYXVsdCAncm91bmQnXHJcblx0XHQgKi9cclxuXHRcdHRoaXMud2lyZWZyYW1lTGluZWNhcCA9ICdyb3VuZCc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIGFwcGVhcmFuY2Ugb2Ygd2lyZWZyYW1lIGpvaW50cy5cclxuXHRcdCAqXHJcblx0XHQgKiBDYW4gb25seSBiZSB1c2VkIHdpdGgge0BsaW5rIFNWR1JlbmRlcmVyfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KCdyb3VuZCd8J2JldmVsJ3wnbWl0ZXInKX1cclxuXHRcdCAqIEBkZWZhdWx0ICdyb3VuZCdcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy53aXJlZnJhbWVMaW5lam9pbiA9ICdyb3VuZCc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSBtYXRlcmlhbCBpcyByZW5kZXJlZCB3aXRoIGZsYXQgc2hhZGluZyBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZsYXRTaGFkaW5nID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSBtYXRlcmlhbCBpcyBhZmZlY3RlZCBieSBmb2cgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZvZyA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy5kZWZpbmVzID0geyAnU1RBTkRBUkQnOiAnJyB9O1xyXG5cclxuXHRcdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XHJcblx0XHR0aGlzLnJvdWdobmVzcyA9IHNvdXJjZS5yb3VnaG5lc3M7XHJcblx0XHR0aGlzLm1ldGFsbmVzcyA9IHNvdXJjZS5tZXRhbG5lc3M7XHJcblxyXG5cdFx0dGhpcy5tYXAgPSBzb3VyY2UubWFwO1xyXG5cclxuXHRcdHRoaXMubGlnaHRNYXAgPSBzb3VyY2UubGlnaHRNYXA7XHJcblx0XHR0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gc291cmNlLmxpZ2h0TWFwSW50ZW5zaXR5O1xyXG5cclxuXHRcdHRoaXMuYW9NYXAgPSBzb3VyY2UuYW9NYXA7XHJcblx0XHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gc291cmNlLmFvTWFwSW50ZW5zaXR5O1xyXG5cclxuXHRcdHRoaXMuZW1pc3NpdmUuY29weSggc291cmNlLmVtaXNzaXZlICk7XHJcblx0XHR0aGlzLmVtaXNzaXZlTWFwID0gc291cmNlLmVtaXNzaXZlTWFwO1xyXG5cdFx0dGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IHNvdXJjZS5lbWlzc2l2ZUludGVuc2l0eTtcclxuXHJcblx0XHR0aGlzLmJ1bXBNYXAgPSBzb3VyY2UuYnVtcE1hcDtcclxuXHRcdHRoaXMuYnVtcFNjYWxlID0gc291cmNlLmJ1bXBTY2FsZTtcclxuXHJcblx0XHR0aGlzLm5vcm1hbE1hcCA9IHNvdXJjZS5ub3JtYWxNYXA7XHJcblx0XHR0aGlzLm5vcm1hbE1hcFR5cGUgPSBzb3VyY2Uubm9ybWFsTWFwVHlwZTtcclxuXHRcdHRoaXMubm9ybWFsU2NhbGUuY29weSggc291cmNlLm5vcm1hbFNjYWxlICk7XHJcblxyXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBzb3VyY2UuZGlzcGxhY2VtZW50TWFwO1xyXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHNvdXJjZS5kaXNwbGFjZW1lbnRTY2FsZTtcclxuXHRcdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IHNvdXJjZS5kaXNwbGFjZW1lbnRCaWFzO1xyXG5cclxuXHRcdHRoaXMucm91Z2huZXNzTWFwID0gc291cmNlLnJvdWdobmVzc01hcDtcclxuXHJcblx0XHR0aGlzLm1ldGFsbmVzc01hcCA9IHNvdXJjZS5tZXRhbG5lc3NNYXA7XHJcblxyXG5cdFx0dGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDtcclxuXHJcblx0XHR0aGlzLmVudk1hcCA9IHNvdXJjZS5lbnZNYXA7XHJcblx0XHR0aGlzLmVudk1hcFJvdGF0aW9uLmNvcHkoIHNvdXJjZS5lbnZNYXBSb3RhdGlvbiApO1xyXG5cdFx0dGhpcy5lbnZNYXBJbnRlbnNpdHkgPSBzb3VyY2UuZW52TWFwSW50ZW5zaXR5O1xyXG5cclxuXHRcdHRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTtcclxuXHRcdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFtZUxpbmV3aWR0aDtcclxuXHRcdHRoaXMud2lyZWZyYW1lTGluZWNhcCA9IHNvdXJjZS53aXJlZnJhbWVMaW5lY2FwO1xyXG5cdFx0dGhpcy53aXJlZnJhbWVMaW5lam9pbiA9IHNvdXJjZS53aXJlZnJhbWVMaW5lam9pbjtcclxuXHJcblx0XHR0aGlzLmZsYXRTaGFkaW5nID0gc291cmNlLmZsYXRTaGFkaW5nO1xyXG5cclxuXHRcdHRoaXMuZm9nID0gc291cmNlLmZvZztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgTWVzaFN0YW5kYXJkTWF0ZXJpYWwgfTtcclxuIiwiaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uL21hdGgvVmVjdG9yMi5qcyc7XHJcbmltcG9ydCB7IE1lc2hTdGFuZGFyZE1hdGVyaWFsIH0gZnJvbSAnLi9NZXNoU3RhbmRhcmRNYXRlcmlhbC5qcyc7XHJcbmltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vbWF0aC9Db2xvci5qcyc7XHJcbmltcG9ydCB7IGNsYW1wIH0gZnJvbSAnLi4vbWF0aC9NYXRoVXRpbHMuanMnO1xyXG5cclxuLyoqXHJcbiAqIEFuIGV4dGVuc2lvbiBvZiB0aGUge0BsaW5rIE1lc2hTdGFuZGFyZE1hdGVyaWFsfSwgcHJvdmlkaW5nIG1vcmUgYWR2YW5jZWRcclxuICogcGh5c2ljYWxseS1iYXNlZCByZW5kZXJpbmcgcHJvcGVydGllczpcclxuICpcclxuICogLSBBbmlzb3Ryb3B5OiBBYmlsaXR5IHRvIHJlcHJlc2VudCB0aGUgYW5pc290cm9waWMgcHJvcGVydHkgb2YgbWF0ZXJpYWxzXHJcbiAqIGFzIG9ic2VydmFibGUgd2l0aCBicnVzaGVkIG1ldGFscy5cclxuICogLSBDbGVhcmNvYXQ6IFNvbWUgbWF0ZXJpYWxzIOKAlCBsaWtlIGNhciBwYWludHMsIGNhcmJvbiBmaWJlciwgYW5kIHdldCBzdXJmYWNlcyDigJQgcmVxdWlyZVxyXG4gKiBhIGNsZWFyLCByZWZsZWN0aXZlIGxheWVyIG9uIHRvcCBvZiBhbm90aGVyIGxheWVyIHRoYXQgbWF5IGJlIGlycmVndWxhciBvciByb3VnaC5cclxuICogQ2xlYXJjb2F0IGFwcHJveGltYXRlcyB0aGlzIGVmZmVjdCwgd2l0aG91dCB0aGUgbmVlZCBmb3IgYSBzZXBhcmF0ZSB0cmFuc3BhcmVudCBzdXJmYWNlLlxyXG4gKiAtIElyaWRlc2NlbmNlOiBBbGxvd3MgdG8gcmVuZGVyIHRoZSBlZmZlY3Qgd2hlcmUgaHVlIHZhcmllcyAgZGVwZW5kaW5nIG9uIHRoZSB2aWV3aW5nXHJcbiAqIGFuZ2xlIGFuZCBpbGx1bWluYXRpb24gYW5nbGUuIFRoaXMgY2FuIGJlIHNlZW4gb24gc29hcCBidWJibGVzLCBvaWwgZmlsbXMsIG9yIG9uIHRoZVxyXG4gKiB3aW5ncyBvZiBtYW55IGluc2VjdHMuXHJcbiAqIC0gUGh5c2ljYWxseS1iYXNlZCB0cmFuc3BhcmVuY3k6IE9uZSBsaW1pdGF0aW9uIG9mIHtAbGluayBNYXRlcmlhbCNvcGFjaXR5fSBpcyB0aGF0IGhpZ2hseVxyXG4gKiB0cmFuc3BhcmVudCBtYXRlcmlhbHMgYXJlIGxlc3MgcmVmbGVjdGl2ZS4gUGh5c2ljYWxseS1iYXNlZCB0cmFuc21pc3Npb24gcHJvdmlkZXMgYSBtb3JlXHJcbiAqIHJlYWxpc3RpYyBvcHRpb24gZm9yIHRoaW4sIHRyYW5zcGFyZW50IHN1cmZhY2VzIGxpa2UgZ2xhc3MuXHJcbiAqIC0gQWR2YW5jZWQgcmVmbGVjdGl2aXR5OiBNb3JlIGZsZXhpYmxlIHJlZmxlY3Rpdml0eSBmb3Igbm9uLW1ldGFsbGljIG1hdGVyaWFscy5cclxuICogLSBTaGVlbjogQ2FuIGJlIHVzZWQgZm9yIHJlcHJlc2VudGluZyBjbG90aCBhbmQgZmFicmljIG1hdGVyaWFscy5cclxuICpcclxuICogQXMgYSByZXN1bHQgb2YgdGhlc2UgY29tcGxleCBzaGFkaW5nIGZlYXR1cmVzLCBgTWVzaFBoeXNpY2FsTWF0ZXJpYWxgIGhhcyBhXHJcbiAqIGhpZ2hlciBwZXJmb3JtYW5jZSBjb3N0LCBwZXIgcGl4ZWwsIHRoYW4gb3RoZXIgdGhyZWUuanMgbWF0ZXJpYWxzLiBNb3N0XHJcbiAqIGVmZmVjdHMgYXJlIGRpc2FibGVkIGJ5IGRlZmF1bHQsIGFuZCBhZGQgY29zdCBhcyB0aGV5IGFyZSBlbmFibGVkLiBGb3JcclxuICogYmVzdCByZXN1bHRzLCBhbHdheXMgc3BlY2lmeSBhbiBlbnZpcm9ubWVudCBtYXAgd2hlbiB1c2luZyB0aGlzIG1hdGVyaWFsLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTWVzaFN0YW5kYXJkTWF0ZXJpYWxcclxuICovXHJcbmNsYXNzIE1lc2hQaHlzaWNhbE1hdGVyaWFsIGV4dGVuZHMgTWVzaFN0YW5kYXJkTWF0ZXJpYWwge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG1lc2ggcGh5c2ljYWwgbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtZXRlcnNdIC0gQW4gb2JqZWN0IHdpdGggb25lIG9yIG1vcmUgcHJvcGVydGllc1xyXG5cdCAqIGRlZmluaW5nIHRoZSBtYXRlcmlhbCdzIGFwcGVhcmFuY2UuIEFueSBwcm9wZXJ0eSBvZiB0aGUgbWF0ZXJpYWxcclxuXHQgKiAoaW5jbHVkaW5nIGFueSBwcm9wZXJ0eSBmcm9tIGluaGVyaXRlZCBtYXRlcmlhbHMpIGNhbiBiZSBwYXNzZWRcclxuXHQgKiBpbiBoZXJlLiBDb2xvciB2YWx1ZXMgY2FuIGJlIHBhc3NlZCBhbnkgdHlwZSBvZiB2YWx1ZSBhY2NlcHRlZFxyXG5cdCAqIGJ5IHtAbGluayBDb2xvciNzZXR9LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwYXJhbWV0ZXJzICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzTWVzaFBoeXNpY2FsTWF0ZXJpYWwgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMuZGVmaW5lcyA9IHtcclxuXHJcblx0XHRcdCdTVEFOREFSRCc6ICcnLFxyXG5cdFx0XHQnUEhZU0lDQUwnOiAnJ1xyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ01lc2hQaHlzaWNhbE1hdGVyaWFsJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByb3RhdGlvbiBvZiB0aGUgYW5pc290cm9weSBpbiB0YW5nZW50LCBiaXRhbmdlbnQgc3BhY2UsIG1lYXN1cmVkIGluIHJhZGlhbnNcclxuXHRcdCAqIGNvdW50ZXItY2xvY2t3aXNlIGZyb20gdGhlIHRhbmdlbnQuIFdoZW4gYGFuaXNvdHJvcHlNYXBgIGlzIHByZXNlbnQsIHRoaXNcclxuXHRcdCAqIHByb3BlcnR5IHByb3ZpZGVzIGFkZGl0aW9uYWwgcm90YXRpb24gdG8gdGhlIHZlY3RvcnMgaW4gdGhlIHRleHR1cmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hbmlzb3Ryb3B5Um90YXRpb24gPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVkIGFuZCBncmVlbiBjaGFubmVscyByZXByZXNlbnQgdGhlIGFuaXNvdHJvcHkgZGlyZWN0aW9uIGluIGBbLTEsIDFdYCB0YW5nZW50LFxyXG5cdFx0ICogYml0YW5nZW50IHNwYWNlLCB0byBiZSByb3RhdGVkIGJ5IGBhbmlzb3Ryb3B5Um90YXRpb25gLiBUaGUgYmx1ZSBjaGFubmVsXHJcblx0XHQgKiBjb250YWlucyBzdHJlbmd0aCBhcyBgWzAsIDFdYCB0byBiZSBtdWx0aXBsaWVkIGJ5IGBhbmlzb3Ryb3B5YC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYW5pc290cm9weU1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcmVkIGNoYW5uZWwgb2YgdGhpcyB0ZXh0dXJlIGlzIG11bHRpcGxpZWQgYWdhaW5zdCBgY2xlYXJjb2F0YCxcclxuXHRcdCAqIGZvciBwZXItcGl4ZWwgY29udHJvbCBvdmVyIGEgY29hdGluZydzIGludGVuc2l0eS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2xlYXJjb2F0TWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJvdWdobmVzcyBvZiB0aGUgY2xlYXIgY29hdCBsYXllciwgZnJvbSBgMC4wYCB0byBgMS4wYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNsZWFyY29hdFJvdWdobmVzcyA9IDAuMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBncmVlbiBjaGFubmVsIG9mIHRoaXMgdGV4dHVyZSBpcyBtdWx0aXBsaWVkIGFnYWluc3RcclxuXHRcdCAqIGBjbGVhcmNvYXRSb3VnaG5lc3NgLCBmb3IgcGVyLXBpeGVsIGNvbnRyb2wgb3ZlciBhIGNvYXRpbmcncyByb3VnaG5lc3MuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNsZWFyY29hdFJvdWdobmVzc01hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3cgbXVjaCBgY2xlYXJjb2F0Tm9ybWFsTWFwYCBhZmZlY3RzIHRoZSBjbGVhciBjb2F0IGxheWVyLCBmcm9tXHJcblx0XHQgKiBgKDAsMClgIHRvIGAoMSwxKWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjJ9XHJcblx0XHQgKiBAZGVmYXVsdCAoMSwxKVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNsZWFyY29hdE5vcm1hbFNjYWxlID0gbmV3IFZlY3RvcjIoIDEsIDEgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENhbiBiZSB1c2VkIHRvIGVuYWJsZSBpbmRlcGVuZGVudCBub3JtYWxzIGZvciB0aGUgY2xlYXIgY29hdCBsYXllci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2xlYXJjb2F0Tm9ybWFsTWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEluZGV4LW9mLXJlZnJhY3Rpb24gZm9yIG5vbi1tZXRhbGxpYyBtYXRlcmlhbHMsIGZyb20gYDEuMGAgdG8gYDIuMzMzYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMS41XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaW9yID0gMS41O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVncmVlIG9mIHJlZmxlY3Rpdml0eSwgZnJvbSBgMC4wYCB0byBgMS4wYC4gRGVmYXVsdCBpcyBgMC41YCwgd2hpY2hcclxuXHRcdCAqIGNvcnJlc3BvbmRzIHRvIGFuIGluZGV4LW9mLXJlZnJhY3Rpb24gb2YgYDEuNWAuXHJcblx0XHQgKlxyXG5cdFx0ICogVGhpcyBtb2RlbHMgdGhlIHJlZmxlY3Rpdml0eSBvZiBub24tbWV0YWxsaWMgbWF0ZXJpYWxzLiBJdCBoYXMgbm8gZWZmZWN0XHJcblx0XHQgKiB3aGVuIGBtZXRhbG5lc3NgIGlzIGAxLjBgXHJcblx0XHQgKlxyXG5cdFx0ICogQG5hbWUgTWVzaFBoeXNpY2FsTWF0ZXJpYWwjcmVmbGVjdGl2aXR5XHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMC41XHJcblx0XHQgKi9cclxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ3JlZmxlY3Rpdml0eScsIHtcclxuXHRcdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XHJcblxyXG5cdFx0XHRcdHJldHVybiAoIGNsYW1wKCAyLjUgKiAoIHRoaXMuaW9yIC0gMSApIC8gKCB0aGlzLmlvciArIDEgKSwgMCwgMSApICk7XHJcblxyXG5cdFx0XHR9LFxyXG5cdFx0XHRzZXQ6IGZ1bmN0aW9uICggcmVmbGVjdGl2aXR5ICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLmlvciA9ICggMSArIDAuNCAqIHJlZmxlY3Rpdml0eSApIC8gKCAxIC0gMC40ICogcmVmbGVjdGl2aXR5ICk7XHJcblxyXG5cdFx0XHR9XHJcblx0XHR9ICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcmVkIGNoYW5uZWwgb2YgdGhpcyB0ZXh0dXJlIGlzIG11bHRpcGxpZWQgYWdhaW5zdCBgaXJpZGVzY2VuY2VgLCBmb3IgcGVyLXBpeGVsXHJcblx0XHQgKiBjb250cm9sIG92ZXIgaXJpZGVzY2VuY2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlyaWRlc2NlbmNlTWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFN0cmVuZ3RoIG9mIHRoZSBpcmlkZXNjZW5jZSBSR0IgY29sb3Igc2hpZnQgZWZmZWN0LCByZXByZXNlbnRlZCBieSBhbiBpbmRleC1vZi1yZWZyYWN0aW9uLlxyXG5cdFx0ICogQmV0d2VlbiBgMS4wYCB0byBgMi4zMzNgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxLjNcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pcmlkZXNjZW5jZUlPUiA9IDEuMztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqQXJyYXkgb2YgZXhhY3RseSAyIGVsZW1lbnRzLCBzcGVjaWZ5aW5nIG1pbmltdW0gYW5kIG1heGltdW0gdGhpY2tuZXNzIG9mIHRoZSBpcmlkZXNjZW5jZSBsYXllci5cclxuXHRcdCBUaGlja25lc3Mgb2YgaXJpZGVzY2VuY2UgbGF5ZXIgaGFzIGFuIGVxdWl2YWxlbnQgZWZmZWN0IG9mIHRoZSBvbmUgYHRoaWNrbmVzc2AgaGFzIG9uIGBpb3JgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxudW1iZXIsbnVtYmVyPn1cclxuXHRcdCAqIEBkZWZhdWx0IFsxMDAsNDAwXVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlyaWRlc2NlbmNlVGhpY2tuZXNzUmFuZ2UgPSBbIDEwMCwgNDAwIF07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHRleHR1cmUgdGhhdCBkZWZpbmVzIHRoZSB0aGlja25lc3Mgb2YgdGhlIGlyaWRlc2NlbmNlIGxheWVyLCBzdG9yZWQgaW4gdGhlIGdyZWVuIGNoYW5uZWwuXHJcblx0XHQgKiBNaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBvZiB0aGlja25lc3MgYXJlIGRlZmluZWQgYnkgYGlyaWRlc2NlbmNlVGhpY2tuZXNzUmFuZ2VgIGFycmF5OlxyXG5cdFx0ICogLSBgMC4wYCBpbiB0aGUgZ3JlZW4gY2hhbm5lbCB3aWxsIHJlc3VsdCBpbiB0aGlja25lc3MgZXF1YWwgdG8gZmlyc3QgZWxlbWVudCBvZiB0aGUgYXJyYXkuXHJcblx0XHQgKiAtIGAxLjBgIGluIHRoZSBncmVlbiBjaGFubmVsIHdpbGwgcmVzdWx0IGluIHRoaWNrbmVzcyBlcXVhbCB0byBzZWNvbmQgZWxlbWVudCBvZiB0aGUgYXJyYXkuXHJcblx0XHQgKiAtIFZhbHVlcyBpbi1iZXR3ZWVuIHdpbGwgbGluZWFybHkgaW50ZXJwb2xhdGUgYmV0d2VlbiB0aGUgZWxlbWVudHMgb2YgdGhlIGFycmF5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc2hlZW4gdGludC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Q29sb3J9XHJcblx0XHQgKiBAZGVmYXVsdCAoMCwwLDApXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2hlZW5Db2xvciA9IG5ldyBDb2xvciggMHgwMDAwMDAgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBSR0IgY2hhbm5lbHMgb2YgdGhpcyB0ZXh0dXJlIGFyZSBtdWx0aXBsaWVkIGFnYWluc3QgIGBzaGVlbkNvbG9yYCwgZm9yIHBlci1waXhlbCBjb250cm9sXHJcblx0XHQgKiBvdmVyIHNoZWVuIHRpbnQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNoZWVuQ29sb3JNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUm91Z2huZXNzIG9mIHRoZSBzaGVlbiBsYXllciwgZnJvbSBgMC4wYCB0byBgMS4wYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNoZWVuUm91Z2huZXNzID0gMS4wO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGFscGhhIGNoYW5uZWwgb2YgdGhpcyB0ZXh0dXJlIGlzIG11bHRpcGxpZWQgYWdhaW5zdCBgc2hlZW5Sb3VnaG5lc3NgLCBmb3IgcGVyLXBpeGVsIGNvbnRyb2xcclxuXHRcdCAqIG92ZXIgc2hlZW4gcm91Z2huZXNzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zaGVlblJvdWdobmVzc01hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcmVkIGNoYW5uZWwgb2YgdGhpcyB0ZXh0dXJlIGlzIG11bHRpcGxpZWQgYWdhaW5zdCBgdHJhbnNtaXNzaW9uYCwgZm9yIHBlci1waXhlbCBjb250cm9sIG92ZXJcclxuXHRcdCAqIG9wdGljYWwgdHJhbnNwYXJlbmN5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50cmFuc21pc3Npb25NYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHRoaWNrbmVzcyBvZiB0aGUgdm9sdW1lIGJlbmVhdGggdGhlIHN1cmZhY2UuIFRoZSB2YWx1ZSBpcyBnaXZlbiBpbiB0aGVcclxuXHRcdCAqIGNvb3JkaW5hdGUgc3BhY2Ugb2YgdGhlIG1lc2guIElmIHRoZSB2YWx1ZSBpcyBgMGAgdGhlIG1hdGVyaWFsIGlzXHJcblx0XHQgKiB0aGluLXdhbGxlZC4gT3RoZXJ3aXNlIHRoZSBtYXRlcmlhbCBpcyBhIHZvbHVtZSBib3VuZGFyeS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRoaWNrbmVzcyA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHRleHR1cmUgdGhhdCBkZWZpbmVzIHRoZSB0aGlja25lc3MsIHN0b3JlZCBpbiB0aGUgZ3JlZW4gY2hhbm5lbC4gVGhpcyB3aWxsXHJcblx0XHQgKiBiZSBtdWx0aXBsaWVkIGJ5IGB0aGlja25lc3NgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50aGlja25lc3NNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVuc2l0eSBvZiB0aGUgbWVkaXVtIGdpdmVuIGFzIHRoZSBhdmVyYWdlIGRpc3RhbmNlIHRoYXQgbGlnaHQgdHJhdmVscyBpblxyXG5cdFx0ICogdGhlIG1lZGl1bSBiZWZvcmUgaW50ZXJhY3Rpbmcgd2l0aCBhIHBhcnRpY2xlLiBUaGUgdmFsdWUgaXMgZ2l2ZW4gaW4gd29ybGRcclxuXHRcdCAqIHNwYWNlIHVuaXRzLCBhbmQgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgSW5maW5pdHlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hdHRlbnVhdGlvbkRpc3RhbmNlID0gSW5maW5pdHk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY29sb3IgdGhhdCB3aGl0ZSBsaWdodCB0dXJucyBpbnRvIGR1ZSB0byBhYnNvcnB0aW9uIHdoZW4gcmVhY2hpbmcgdGhlXHJcblx0XHQgKiBhdHRlbnVhdGlvbiBkaXN0YW5jZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Q29sb3J9XHJcblx0XHQgKiBAZGVmYXVsdCAoMSwxLDEpXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYXR0ZW51YXRpb25Db2xvciA9IG5ldyBDb2xvciggMSwgMSwgMSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBmbG9hdCB0aGF0IHNjYWxlcyB0aGUgYW1vdW50IG9mIHNwZWN1bGFyIHJlZmxlY3Rpb24gZm9yIG5vbi1tZXRhbHMgb25seS5cclxuXHRcdCAqIFdoZW4gc2V0IHRvIHplcm8sIHRoZSBtb2RlbCBpcyBlZmZlY3RpdmVseSBMYW1iZXJ0aWFuLiBGcm9tIGAwLjBgIHRvIGAxLjBgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc3BlY3VsYXJJbnRlbnNpdHkgPSAxLjA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYWxwaGEgY2hhbm5lbCBvZiB0aGlzIHRleHR1cmUgaXMgbXVsdGlwbGllZCBhZ2FpbnN0IGBzcGVjdWxhckludGVuc2l0eWAsXHJcblx0XHQgKiBmb3IgcGVyLXBpeGVsIGNvbnRyb2wgb3ZlciBzcGVjdWxhciBpbnRlbnNpdHkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNwZWN1bGFySW50ZW5zaXR5TWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRpbnRzIHRoZSBzcGVjdWxhciByZWZsZWN0aW9uIGF0IG5vcm1hbCBpbmNpZGVuY2UgZm9yIG5vbi1tZXRhbHMgb25seS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Q29sb3J9XHJcblx0XHQgKiBAZGVmYXVsdCAoMSwxLDEpXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc3BlY3VsYXJDb2xvciA9IG5ldyBDb2xvciggMSwgMSwgMSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIFJHQiBjaGFubmVscyBvZiB0aGlzIHRleHR1cmUgYXJlIG11bHRpcGxpZWQgYWdhaW5zdCBgc3BlY3VsYXJDb2xvcmAsXHJcblx0XHQgKiBmb3IgcGVyLXBpeGVsIGNvbnRyb2wgb3ZlciBzcGVjdWxhciBjb2xvci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc3BlY3VsYXJDb2xvck1hcCA9IG51bGw7XHJcblxyXG5cdFx0dGhpcy5fYW5pc290cm9weSA9IDA7XHJcblx0XHR0aGlzLl9jbGVhcmNvYXQgPSAwO1xyXG5cdFx0dGhpcy5fZGlzcGVyc2lvbiA9IDA7XHJcblx0XHR0aGlzLl9pcmlkZXNjZW5jZSA9IDA7XHJcblx0XHR0aGlzLl9zaGVlbiA9IDAuMDtcclxuXHRcdHRoaXMuX3RyYW5zbWlzc2lvbiA9IDA7XHJcblxyXG5cdFx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgYW5pc290cm9weSBzdHJlbmd0aC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0ICogQGRlZmF1bHQgMFxyXG5cdCAqL1xyXG5cdGdldCBhbmlzb3Ryb3B5KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9hbmlzb3Ryb3B5O1xyXG5cclxuXHR9XHJcblxyXG5cdHNldCBhbmlzb3Ryb3B5KCB2YWx1ZSApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuX2FuaXNvdHJvcHkgPiAwICE9PSB2YWx1ZSA+IDAgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnZlcnNpb24gKys7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuX2FuaXNvdHJvcHkgPSB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXByZXNlbnRzIHRoZSBpbnRlbnNpdHkgb2YgdGhlIGNsZWFyIGNvYXQgbGF5ZXIsIGZyb20gYDAuMGAgdG8gYDEuMGAuIFVzZVxyXG5cdCAqIGNsZWFyIGNvYXQgcmVsYXRlZCBwcm9wZXJ0aWVzIHRvIGVuYWJsZSBtdWx0aWxheWVyIG1hdGVyaWFscyB0aGF0IGhhdmUgYVxyXG5cdCAqIHRoaW4gdHJhbnNsdWNlbnQgbGF5ZXIgb3ZlciB0aGUgYmFzZSBsYXllci5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0ICogQGRlZmF1bHQgMFxyXG5cdCAqL1xyXG5cdGdldCBjbGVhcmNvYXQoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX2NsZWFyY29hdDtcclxuXHJcblx0fVxyXG5cclxuXHRzZXQgY2xlYXJjb2F0KCB2YWx1ZSApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuX2NsZWFyY29hdCA+IDAgIT09IHZhbHVlID4gMCApIHtcclxuXHJcblx0XHRcdHRoaXMudmVyc2lvbiArKztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5fY2xlYXJjb2F0ID0gdmFsdWU7XHJcblxyXG5cdH1cclxuXHQvKipcclxuXHQgKiBUaGUgaW50ZW5zaXR5IG9mIHRoZSBpcmlkZXNjZW5jZSBsYXllciwgc2ltdWxhdGluZyBSR0IgY29sb3Igc2hpZnQgYmFzZWQgb24gdGhlIGFuZ2xlIGJldHdlZW5cclxuXHQgKiB0aGUgc3VyZmFjZSBhbmQgdGhlIHZpZXdlciwgZnJvbSBgMC4wYCB0byBgMS4wYC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0ICogQGRlZmF1bHQgMFxyXG5cdCAqL1xyXG5cdGdldCBpcmlkZXNjZW5jZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5faXJpZGVzY2VuY2U7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0IGlyaWRlc2NlbmNlKCB2YWx1ZSApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuX2lyaWRlc2NlbmNlID4gMCAhPT0gdmFsdWUgPiAwICkge1xyXG5cclxuXHRcdFx0dGhpcy52ZXJzaW9uICsrO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLl9pcmlkZXNjZW5jZSA9IHZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgdGhlIHN0cmVuZ3RoIG9mIHRoZSBhbmd1bGFyIHNlcGFyYXRpb24gb2YgY29sb3JzIChjaHJvbWF0aWMgYWJlcnJhdGlvbikgdHJhbnNtaXR0aW5nXHJcblx0ICogdGhyb3VnaCBhIHJlbGF0aXZlbHkgY2xlYXIgdm9sdW1lLiBBbnkgdmFsdWUgemVybyBvciBsYXJnZXIgaXMgdmFsaWQsIHRoZSB0eXBpY2FsIHJhbmdlIG9mXHJcblx0ICogcmVhbGlzdGljIHZhbHVlcyBpcyBgWzAsIDFdYC4gVGhpcyBwcm9wZXJ0eSBjYW4gYmUgb25seSBiZSB1c2VkIHdpdGggdHJhbnNtaXNzaXZlIG9iamVjdHMuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdCAqIEBkZWZhdWx0IDBcclxuXHQgKi9cclxuXHRnZXQgZGlzcGVyc2lvbigpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fZGlzcGVyc2lvbjtcclxuXHJcblx0fVxyXG5cclxuXHRzZXQgZGlzcGVyc2lvbiggdmFsdWUgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9kaXNwZXJzaW9uID4gMCAhPT0gdmFsdWUgPiAwICkge1xyXG5cclxuXHRcdFx0dGhpcy52ZXJzaW9uICsrO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLl9kaXNwZXJzaW9uID0gdmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGludGVuc2l0eSBvZiB0aGUgc2hlZW4gbGF5ZXIsIGZyb20gYDAuMGAgdG8gYDEuMGAuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdCAqIEBkZWZhdWx0IDBcclxuXHQgKi9cclxuXHRnZXQgc2hlZW4oKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX3NoZWVuO1xyXG5cclxuXHR9XHJcblxyXG5cdHNldCBzaGVlbiggdmFsdWUgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9zaGVlbiA+IDAgIT09IHZhbHVlID4gMCApIHtcclxuXHJcblx0XHRcdHRoaXMudmVyc2lvbiArKztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5fc2hlZW4gPSB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWdyZWUgb2YgdHJhbnNtaXNzaW9uIChvciBvcHRpY2FsIHRyYW5zcGFyZW5jeSksIGZyb20gYDAuMGAgdG8gYDEuMGAuXHJcblx0ICpcclxuXHQgKiBUaGluLCB0cmFuc3BhcmVudCBvciBzZW1pdHJhbnNwYXJlbnQsIHBsYXN0aWMgb3IgZ2xhc3MgbWF0ZXJpYWxzIHJlbWFpblxyXG5cdCAqIGxhcmdlbHkgcmVmbGVjdGl2ZSBldmVuIGlmIHRoZXkgYXJlIGZ1bGx5IHRyYW5zbWlzc2l2ZS4gVGhlIHRyYW5zbWlzc2lvblxyXG5cdCAqIHByb3BlcnR5IGNhbiBiZSB1c2VkIHRvIG1vZGVsIHRoZXNlIG1hdGVyaWFscy5cclxuXHQgKlxyXG5cdCAqIFdoZW4gdHJhbnNtaXNzaW9uIGlzIG5vbi16ZXJvLCBgb3BhY2l0eWAgc2hvdWxkIGJlICBzZXQgdG8gYDFgLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge251bWJlcn1cclxuXHQgKiBAZGVmYXVsdCAwXHJcblx0ICovXHJcblx0Z2V0IHRyYW5zbWlzc2lvbigpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fdHJhbnNtaXNzaW9uO1xyXG5cclxuXHR9XHJcblxyXG5cdHNldCB0cmFuc21pc3Npb24oIHZhbHVlICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5fdHJhbnNtaXNzaW9uID4gMCAhPT0gdmFsdWUgPiAwICkge1xyXG5cclxuXHRcdFx0dGhpcy52ZXJzaW9uICsrO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLl90cmFuc21pc3Npb24gPSB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy5kZWZpbmVzID0ge1xyXG5cclxuXHRcdFx0J1NUQU5EQVJEJzogJycsXHJcblx0XHRcdCdQSFlTSUNBTCc6ICcnXHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHR0aGlzLmFuaXNvdHJvcHkgPSBzb3VyY2UuYW5pc290cm9weTtcclxuXHRcdHRoaXMuYW5pc290cm9weVJvdGF0aW9uID0gc291cmNlLmFuaXNvdHJvcHlSb3RhdGlvbjtcclxuXHRcdHRoaXMuYW5pc290cm9weU1hcCA9IHNvdXJjZS5hbmlzb3Ryb3B5TWFwO1xyXG5cclxuXHRcdHRoaXMuY2xlYXJjb2F0ID0gc291cmNlLmNsZWFyY29hdDtcclxuXHRcdHRoaXMuY2xlYXJjb2F0TWFwID0gc291cmNlLmNsZWFyY29hdE1hcDtcclxuXHRcdHRoaXMuY2xlYXJjb2F0Um91Z2huZXNzID0gc291cmNlLmNsZWFyY29hdFJvdWdobmVzcztcclxuXHRcdHRoaXMuY2xlYXJjb2F0Um91Z2huZXNzTWFwID0gc291cmNlLmNsZWFyY29hdFJvdWdobmVzc01hcDtcclxuXHRcdHRoaXMuY2xlYXJjb2F0Tm9ybWFsTWFwID0gc291cmNlLmNsZWFyY29hdE5vcm1hbE1hcDtcclxuXHRcdHRoaXMuY2xlYXJjb2F0Tm9ybWFsU2NhbGUuY29weSggc291cmNlLmNsZWFyY29hdE5vcm1hbFNjYWxlICk7XHJcblxyXG5cdFx0dGhpcy5kaXNwZXJzaW9uID0gc291cmNlLmRpc3BlcnNpb247XHJcblx0XHR0aGlzLmlvciA9IHNvdXJjZS5pb3I7XHJcblxyXG5cdFx0dGhpcy5pcmlkZXNjZW5jZSA9IHNvdXJjZS5pcmlkZXNjZW5jZTtcclxuXHRcdHRoaXMuaXJpZGVzY2VuY2VNYXAgPSBzb3VyY2UuaXJpZGVzY2VuY2VNYXA7XHJcblx0XHR0aGlzLmlyaWRlc2NlbmNlSU9SID0gc291cmNlLmlyaWRlc2NlbmNlSU9SO1xyXG5cdFx0dGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlID0gWyAuLi5zb3VyY2UuaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZSBdO1xyXG5cdFx0dGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcCA9IHNvdXJjZS5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcDtcclxuXHJcblx0XHR0aGlzLnNoZWVuID0gc291cmNlLnNoZWVuO1xyXG5cdFx0dGhpcy5zaGVlbkNvbG9yLmNvcHkoIHNvdXJjZS5zaGVlbkNvbG9yICk7XHJcblx0XHR0aGlzLnNoZWVuQ29sb3JNYXAgPSBzb3VyY2Uuc2hlZW5Db2xvck1hcDtcclxuXHRcdHRoaXMuc2hlZW5Sb3VnaG5lc3MgPSBzb3VyY2Uuc2hlZW5Sb3VnaG5lc3M7XHJcblx0XHR0aGlzLnNoZWVuUm91Z2huZXNzTWFwID0gc291cmNlLnNoZWVuUm91Z2huZXNzTWFwO1xyXG5cclxuXHRcdHRoaXMudHJhbnNtaXNzaW9uID0gc291cmNlLnRyYW5zbWlzc2lvbjtcclxuXHRcdHRoaXMudHJhbnNtaXNzaW9uTWFwID0gc291cmNlLnRyYW5zbWlzc2lvbk1hcDtcclxuXHJcblx0XHR0aGlzLnRoaWNrbmVzcyA9IHNvdXJjZS50aGlja25lc3M7XHJcblx0XHR0aGlzLnRoaWNrbmVzc01hcCA9IHNvdXJjZS50aGlja25lc3NNYXA7XHJcblx0XHR0aGlzLmF0dGVudWF0aW9uRGlzdGFuY2UgPSBzb3VyY2UuYXR0ZW51YXRpb25EaXN0YW5jZTtcclxuXHRcdHRoaXMuYXR0ZW51YXRpb25Db2xvci5jb3B5KCBzb3VyY2UuYXR0ZW51YXRpb25Db2xvciApO1xyXG5cclxuXHRcdHRoaXMuc3BlY3VsYXJJbnRlbnNpdHkgPSBzb3VyY2Uuc3BlY3VsYXJJbnRlbnNpdHk7XHJcblx0XHR0aGlzLnNwZWN1bGFySW50ZW5zaXR5TWFwID0gc291cmNlLnNwZWN1bGFySW50ZW5zaXR5TWFwO1xyXG5cdFx0dGhpcy5zcGVjdWxhckNvbG9yLmNvcHkoIHNvdXJjZS5zcGVjdWxhckNvbG9yICk7XHJcblx0XHR0aGlzLnNwZWN1bGFyQ29sb3JNYXAgPSBzb3VyY2Uuc3BlY3VsYXJDb2xvck1hcDtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgTWVzaFBoeXNpY2FsTWF0ZXJpYWwgfTtcclxuIiwiaW1wb3J0IHsgTXVsdGlwbHlPcGVyYXRpb24sIFRhbmdlbnRTcGFjZU5vcm1hbE1hcCB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IE1hdGVyaWFsIH0gZnJvbSAnLi9NYXRlcmlhbC5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjIuanMnO1xyXG5pbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uL21hdGgvQ29sb3IuanMnO1xyXG5pbXBvcnQgeyBFdWxlciB9IGZyb20gJy4uL21hdGgvRXVsZXIuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgbWF0ZXJpYWwgZm9yIHNoaW55IHN1cmZhY2VzIHdpdGggc3BlY3VsYXIgaGlnaGxpZ2h0cy5cclxuICpcclxuICogVGhlIG1hdGVyaWFsIHVzZXMgYSBub24tcGh5c2ljYWxseSBiYXNlZCBbQmxpbm4tUGhvbmdde0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JsaW5uLVBob25nX3NoYWRpbmdfbW9kZWx9XHJcbiAqIG1vZGVsIGZvciBjYWxjdWxhdGluZyByZWZsZWN0YW5jZS4gVW5saWtlIHRoZSBMYW1iZXJ0aWFuIG1vZGVsIHVzZWQgaW4gdGhlXHJcbiAqIHtAbGluayBNZXNoTGFtYmVydE1hdGVyaWFsfSB0aGlzIGNhbiBzaW11bGF0ZSBzaGlueSBzdXJmYWNlcyB3aXRoIHNwZWN1bGFyXHJcbiAqIGhpZ2hsaWdodHMgKHN1Y2ggYXMgdmFybmlzaGVkIHdvb2QpLiBgTWVzaFBob25nTWF0ZXJpYWxgIHVzZXMgcGVyLWZyYWdtZW50IHNoYWRpbmcuXHJcbiAqXHJcbiAqIFBlcmZvcm1hbmNlIHdpbGwgZ2VuZXJhbGx5IGJlIGdyZWF0ZXIgd2hlbiB1c2luZyB0aGlzIG1hdGVyaWFsIG92ZXIgdGhlXHJcbiAqIHtAbGluayBNZXNoU3RhbmRhcmRNYXRlcmlhbH0gb3Ige0BsaW5rIE1lc2hQaHlzaWNhbE1hdGVyaWFsfSwgYXQgdGhlIGNvc3Qgb2ZcclxuICogc29tZSBncmFwaGljYWwgYWNjdXJhY3kuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBNYXRlcmlhbFxyXG4gKi9cclxuY2xhc3MgTWVzaFBob25nTWF0ZXJpYWwgZXh0ZW5kcyBNYXRlcmlhbCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbWVzaCBwaG9uZyBtYXRlcmlhbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1ldGVyc10gLSBBbiBvYmplY3Qgd2l0aCBvbmUgb3IgbW9yZSBwcm9wZXJ0aWVzXHJcblx0ICogZGVmaW5pbmcgdGhlIG1hdGVyaWFsJ3MgYXBwZWFyYW5jZS4gQW55IHByb3BlcnR5IG9mIHRoZSBtYXRlcmlhbFxyXG5cdCAqIChpbmNsdWRpbmcgYW55IHByb3BlcnR5IGZyb20gaW5oZXJpdGVkIG1hdGVyaWFscykgY2FuIGJlIHBhc3NlZFxyXG5cdCAqIGluIGhlcmUuIENvbG9yIHZhbHVlcyBjYW4gYmUgcGFzc2VkIGFueSB0eXBlIG9mIHZhbHVlIGFjY2VwdGVkXHJcblx0ICogYnkge0BsaW5rIENvbG9yI3NldH0uXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHBhcmFtZXRlcnMgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNNZXNoUGhvbmdNYXRlcmlhbCA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ01lc2hQaG9uZ01hdGVyaWFsJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENvbG9yIG9mIHRoZSBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Q29sb3J9XHJcblx0XHQgKiBAZGVmYXVsdCAoMSwxLDEpXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7IC8vIGRpZmZ1c2VcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNwZWN1bGFyIGNvbG9yIG9mIHRoZSBtYXRlcmlhbC4gVGhlIGRlZmF1bHQgY29sb3IgaXMgc2V0IHRvIGAweDExMTExMWAgKHZlcnkgZGFyayBncmV5KVxyXG5cdFx0ICpcclxuXHRcdCAqIFRoaXMgZGVmaW5lcyBob3cgc2hpbnkgdGhlIG1hdGVyaWFsIGlzIGFuZCB0aGUgY29sb3Igb2YgaXRzIHNoaW5lLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtDb2xvcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zcGVjdWxhciA9IG5ldyBDb2xvciggMHgxMTExMTEgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvdyBzaGlueSB0aGUgc3BlY3VsYXIgaGlnaGxpZ2h0IGlzOyBhIGhpZ2hlciB2YWx1ZSBnaXZlcyBhIHNoYXJwZXIgaGlnaGxpZ2h0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAzMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNoaW5pbmVzcyA9IDMwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNvbG9yIG1hcC4gTWF5IG9wdGlvbmFsbHkgaW5jbHVkZSBhbiBhbHBoYSBjaGFubmVsLCB0eXBpY2FsbHkgY29tYmluZWRcclxuXHRcdCAqIHdpdGgge0BsaW5rIE1hdGVyaWFsI3RyYW5zcGFyZW50fSBvciB7QGxpbmsgTWF0ZXJpYWwjYWxwaGFUZXN0fS4gVGhlIHRleHR1cmUgbWFwXHJcblx0XHQgKiBjb2xvciBpcyBtb2R1bGF0ZWQgYnkgdGhlIGRpZmZ1c2UgYGNvbG9yYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBsaWdodCBtYXAuIFJlcXVpcmVzIGEgc2Vjb25kIHNldCBvZiBVVnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxpZ2h0TWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEludGVuc2l0eSBvZiB0aGUgYmFrZWQgbGlnaHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5saWdodE1hcEludGVuc2l0eSA9IDEuMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByZWQgY2hhbm5lbCBvZiB0aGlzIHRleHR1cmUgaXMgdXNlZCBhcyB0aGUgYW1iaWVudCBvY2NsdXNpb24gbWFwLlxyXG5cdFx0ICogUmVxdWlyZXMgYSBzZWNvbmQgc2V0IG9mIFVWcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYW9NYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSW50ZW5zaXR5IG9mIHRoZSBhbWJpZW50IG9jY2x1c2lvbiBlZmZlY3QuIFJhbmdlIGlzIGBbMCwxXWAsIHdoZXJlIGAwYFxyXG5cdFx0ICogZGlzYWJsZXMgYW1iaWVudCBvY2NsdXNpb24uIFdoZXJlIGludGVuc2l0eSBpcyBgMWAgYW5kIHRoZSBBTyBtYXAnc1xyXG5cdFx0ICogcmVkIGNoYW5uZWwgaXMgYWxzbyBgMWAsIGFtYmllbnQgbGlnaHQgaXMgZnVsbHkgb2NjbHVkZWQgb24gYSBzdXJmYWNlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSAxLjA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBFbWlzc2l2ZSAobGlnaHQpIGNvbG9yIG9mIHRoZSBtYXRlcmlhbCwgZXNzZW50aWFsbHkgYSBzb2xpZCBjb2xvclxyXG5cdFx0ICogdW5hZmZlY3RlZCBieSBvdGhlciBsaWdodGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Q29sb3J9XHJcblx0XHQgKiBAZGVmYXVsdCAoMCwwLDApXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZW1pc3NpdmUgPSBuZXcgQ29sb3IoIDB4MDAwMDAwICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBJbnRlbnNpdHkgb2YgdGhlIGVtaXNzaXZlIGxpZ2h0LiBNb2R1bGF0ZXMgdGhlIGVtaXNzaXZlIGNvbG9yLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgPSAxLjA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTZXQgZW1pc3NpdmUgKGdsb3cpIG1hcC4gVGhlIGVtaXNzaXZlIG1hcCBjb2xvciBpcyBtb2R1bGF0ZWQgYnkgdGhlXHJcblx0XHQgKiBlbWlzc2l2ZSBjb2xvciBhbmQgdGhlIGVtaXNzaXZlIGludGVuc2l0eS4gSWYgeW91IGhhdmUgYW4gZW1pc3NpdmUgbWFwLFxyXG5cdFx0ICogYmUgc3VyZSB0byBzZXQgdGhlIGVtaXNzaXZlIGNvbG9yIHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIGJsYWNrLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5lbWlzc2l2ZU1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdGV4dHVyZSB0byBjcmVhdGUgYSBidW1wIG1hcC4gVGhlIGJsYWNrIGFuZCB3aGl0ZSB2YWx1ZXMgbWFwIHRvIHRoZVxyXG5cdFx0ICogcGVyY2VpdmVkIGRlcHRoIGluIHJlbGF0aW9uIHRvIHRoZSBsaWdodHMuIEJ1bXAgZG9lc24ndCBhY3R1YWxseSBhZmZlY3RcclxuXHRcdCAqIHRoZSBnZW9tZXRyeSBvZiB0aGUgb2JqZWN0LCBvbmx5IHRoZSBsaWdodGluZy4gSWYgYSBub3JtYWwgbWFwIGlzIGRlZmluZWRcclxuXHRcdCAqIHRoaXMgd2lsbCBiZSBpZ25vcmVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5idW1wTWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvdyBtdWNoIHRoZSBidW1wIG1hcCBhZmZlY3RzIHRoZSBtYXRlcmlhbC4gVHlwaWNhbCByYW5nZSBpcyBgWzAsMV1gLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYnVtcFNjYWxlID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB0ZXh0dXJlIHRvIGNyZWF0ZSBhIG5vcm1hbCBtYXAuIFRoZSBSR0IgdmFsdWVzIGFmZmVjdCB0aGUgc3VyZmFjZVxyXG5cdFx0ICogbm9ybWFsIGZvciBlYWNoIHBpeGVsIGZyYWdtZW50IGFuZCBjaGFuZ2UgdGhlIHdheSB0aGUgY29sb3IgaXMgbGl0LiBOb3JtYWxcclxuXHRcdCAqIG1hcHMgZG8gbm90IGNoYW5nZSB0aGUgYWN0dWFsIHNoYXBlIG9mIHRoZSBzdXJmYWNlLCBvbmx5IHRoZSBsaWdodGluZy4gSW5cclxuXHRcdCAqIGNhc2UgdGhlIG1hdGVyaWFsIGhhcyBhIG5vcm1hbCBtYXAgYXV0aG9yZWQgdXNpbmcgdGhlIGxlZnQgaGFuZGVkXHJcblx0XHQgKiBjb252ZW50aW9uLCB0aGUgYHlgIGNvbXBvbmVudCBvZiBgbm9ybWFsU2NhbGVgIHNob3VsZCBiZSBuZWdhdGVkIHRvIGNvbXBlbnNhdGVcclxuXHRcdCAqIGZvciB0aGUgZGlmZmVyZW50IGhhbmRlZG5lc3MuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vcm1hbE1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdHlwZSBvZiBub3JtYWwgbWFwLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoVGFuZ2VudFNwYWNlTm9ybWFsTWFwfE9iamVjdFNwYWNlTm9ybWFsTWFwKX1cclxuXHRcdCAqIEBkZWZhdWx0IFRhbmdlbnRTcGFjZU5vcm1hbE1hcFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vcm1hbE1hcFR5cGUgPSBUYW5nZW50U3BhY2VOb3JtYWxNYXA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3cgbXVjaCB0aGUgbm9ybWFsIG1hcCBhZmZlY3RzIHRoZSBtYXRlcmlhbC4gVHlwaWNhbCB2YWx1ZSByYW5nZSBpcyBgWzAsMV1gLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3IyfVxyXG5cdFx0ICogQGRlZmF1bHQgKDEsMSlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub3JtYWxTY2FsZSA9IG5ldyBWZWN0b3IyKCAxLCAxICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZGlzcGxhY2VtZW50IG1hcCBhZmZlY3RzIHRoZSBwb3NpdGlvbiBvZiB0aGUgbWVzaCdzIHZlcnRpY2VzLiBVbmxpa2VcclxuXHRcdCAqIG90aGVyIG1hcHMgd2hpY2ggb25seSBhZmZlY3QgdGhlIGxpZ2h0IGFuZCBzaGFkZSBvZiB0aGUgbWF0ZXJpYWwgdGhlXHJcblx0XHQgKiBkaXNwbGFjZWQgdmVydGljZXMgY2FuIGNhc3Qgc2hhZG93cywgYmxvY2sgb3RoZXIgb2JqZWN0cywgYW5kIG90aGVyd2lzZVxyXG5cdFx0ICogYWN0IGFzIHJlYWwgZ2VvbWV0cnkuIFRoZSBkaXNwbGFjZW1lbnQgdGV4dHVyZSBpcyBhbiBpbWFnZSB3aGVyZSB0aGUgdmFsdWVcclxuXHRcdCAqIG9mIGVhY2ggcGl4ZWwgKHdoaXRlIGJlaW5nIHRoZSBoaWdoZXN0KSBpcyBtYXBwZWQgYWdhaW5zdCwgYW5kXHJcblx0XHQgKiByZXBvc2l0aW9ucywgdGhlIHZlcnRpY2VzIG9mIHRoZSBtZXNoLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG93IG11Y2ggdGhlIGRpc3BsYWNlbWVudCBtYXAgYWZmZWN0cyB0aGUgbWVzaCAod2hlcmUgYmxhY2sgaXMgbm9cclxuXHRcdCAqIGRpc3BsYWNlbWVudCwgYW5kIHdoaXRlIGlzIG1heGltdW0gZGlzcGxhY2VtZW50KS4gV2l0aG91dCBhIGRpc3BsYWNlbWVudFxyXG5cdFx0ICogbWFwIHNldCwgdGhpcyB2YWx1ZSBpcyBub3QgYXBwbGllZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBvZmZzZXQgb2YgdGhlIGRpc3BsYWNlbWVudCBtYXAncyB2YWx1ZXMgb24gdGhlIG1lc2gncyB2ZXJ0aWNlcy5cclxuXHRcdCAqIFRoZSBiaWFzIGlzIGFkZGVkIHRvIHRoZSBzY2FsZWQgc2FtcGxlIG9mIHRoZSBkaXNwbGFjZW1lbnQgbWFwLlxyXG5cdFx0ICogV2l0aG91dCBhIGRpc3BsYWNlbWVudCBtYXAgc2V0LCB0aGlzIHZhbHVlIGlzIG5vdCBhcHBsaWVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc3BlY3VsYXIgbWFwIHZhbHVlIGFmZmVjdHMgYm90aCBob3cgbXVjaCB0aGUgc3BlY3VsYXIgc3VyZmFjZVxyXG5cdFx0ICogaGlnaGxpZ2h0IGNvbnRyaWJ1dGVzIGFuZCBob3cgbXVjaCBvZiB0aGUgZW52aXJvbm1lbnQgbWFwIGFmZmVjdHMgdGhlXHJcblx0XHQgKiBzdXJmYWNlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zcGVjdWxhck1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYWxwaGEgbWFwIGlzIGEgZ3JheXNjYWxlIHRleHR1cmUgdGhhdCBjb250cm9scyB0aGUgb3BhY2l0eSBhY3Jvc3MgdGhlXHJcblx0XHQgKiBzdXJmYWNlIChibGFjazogZnVsbHkgdHJhbnNwYXJlbnQ7IHdoaXRlOiBmdWxseSBvcGFxdWUpLlxyXG5cdFx0ICpcclxuXHRcdCAqIE9ubHkgdGhlIGNvbG9yIG9mIHRoZSB0ZXh0dXJlIGlzIHVzZWQsIGlnbm9yaW5nIHRoZSBhbHBoYSBjaGFubmVsIGlmIG9uZVxyXG5cdFx0ICogZXhpc3RzLiBGb3IgUkdCIGFuZCBSR0JBIHRleHR1cmVzLCB0aGUgcmVuZGVyZXIgd2lsbCB1c2UgdGhlIGdyZWVuIGNoYW5uZWxcclxuXHRcdCAqIHdoZW4gc2FtcGxpbmcgdGhpcyB0ZXh0dXJlIGR1ZSB0byB0aGUgZXh0cmEgYml0IG9mIHByZWNpc2lvbiBwcm92aWRlZCBmb3JcclxuXHRcdCAqIGdyZWVuIGluIERYVC1jb21wcmVzc2VkIGFuZCB1bmNvbXByZXNzZWQgUkdCIDU2NSBmb3JtYXRzLiBMdW1pbmFuY2Utb25seSBhbmRcclxuXHRcdCAqIGx1bWluYW5jZS9hbHBoYSB0ZXh0dXJlcyB3aWxsIGFsc28gc3RpbGwgd29yayBhcyBleHBlY3RlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYWxwaGFNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGVudmlyb25tZW50IG1hcC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZW52TWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByb3RhdGlvbiBvZiB0aGUgZW52aXJvbm1lbnQgbWFwIGluIHJhZGlhbnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0V1bGVyfVxyXG5cdFx0ICogQGRlZmF1bHQgKDAsMCwwKVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmVudk1hcFJvdGF0aW9uID0gbmV3IEV1bGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3cgdG8gY29tYmluZSB0aGUgcmVzdWx0IG9mIHRoZSBzdXJmYWNlJ3MgY29sb3Igd2l0aCB0aGUgZW52aXJvbm1lbnQgbWFwLCBpZiBhbnkuXHJcblx0XHQgKlxyXG5cdFx0ICogV2hlbiBzZXQgdG8gYE1peE9wZXJhdGlvbmAsIHRoZSB7QGxpbmsgTWVzaEJhc2ljTWF0ZXJpYWwjcmVmbGVjdGl2aXR5fSBpcyB1c2VkIHRvXHJcblx0XHQgKiBibGVuZCBiZXR3ZWVuIHRoZSB0d28gY29sb3JzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoTXVsdGlwbHlPcGVyYXRpb258TWl4T3BlcmF0aW9ufEFkZE9wZXJhdGlvbil9XHJcblx0XHQgKiBAZGVmYXVsdCBNdWx0aXBseU9wZXJhdGlvblxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvbWJpbmUgPSBNdWx0aXBseU9wZXJhdGlvbjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvdyBtdWNoIHRoZSBlbnZpcm9ubWVudCBtYXAgYWZmZWN0cyB0aGUgc3VyZmFjZS5cclxuXHRcdCAqIFRoZSB2YWxpZCByYW5nZSBpcyBiZXR3ZWVuIGAwYCAobm8gcmVmbGVjdGlvbnMpIGFuZCBgMWAgKGZ1bGwgcmVmbGVjdGlvbnMpLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVmbGVjdGl2aXR5ID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBpbmRleCBvZiByZWZyYWN0aW9uIChJT1IpIG9mIGFpciAoYXBwcm94aW1hdGVseSAxKSBkaXZpZGVkIGJ5IHRoZVxyXG5cdFx0ICogaW5kZXggb2YgcmVmcmFjdGlvbiBvZiB0aGUgbWF0ZXJpYWwuIEl0IGlzIHVzZWQgd2l0aCBlbnZpcm9ubWVudCBtYXBwaW5nXHJcblx0XHQgKiBtb2RlcyB7QGxpbmsgQ3ViZVJlZnJhY3Rpb25NYXBwaW5nfSBhbmQge0BsaW5rIEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nfS5cclxuXHRcdCAqIFRoZSByZWZyYWN0aW9uIHJhdGlvIHNob3VsZCBub3QgZXhjZWVkIGAxYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMC45OFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IDAuOTg7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZW5kZXJzIHRoZSBnZW9tZXRyeSBhcyBhIHdpcmVmcmFtZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMud2lyZWZyYW1lID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDb250cm9scyB0aGUgdGhpY2tuZXNzIG9mIHRoZSB3aXJlZnJhbWUuXHJcblx0XHQgKlxyXG5cdFx0ICogQ2FuIG9ubHkgYmUgdXNlZCB3aXRoIHtAbGluayBTVkdSZW5kZXJlcn0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyBhcHBlYXJhbmNlIG9mIHdpcmVmcmFtZSBlbmRzLlxyXG5cdFx0ICpcclxuXHRcdCAqIENhbiBvbmx5IGJlIHVzZWQgd2l0aCB7QGxpbmsgU1ZHUmVuZGVyZXJ9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoJ3JvdW5kJ3wnYmV2ZWwnfCdtaXRlcicpfVxyXG5cdFx0ICogQGRlZmF1bHQgJ3JvdW5kJ1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSAncm91bmQnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyBhcHBlYXJhbmNlIG9mIHdpcmVmcmFtZSBqb2ludHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQ2FuIG9ubHkgYmUgdXNlZCB3aXRoIHtAbGluayBTVkdSZW5kZXJlcn0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeygncm91bmQnfCdiZXZlbCd8J21pdGVyJyl9XHJcblx0XHQgKiBAZGVmYXVsdCAncm91bmQnXHJcblx0XHQgKi9cclxuXHRcdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSAncm91bmQnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgbWF0ZXJpYWwgaXMgcmVuZGVyZWQgd2l0aCBmbGF0IHNoYWRpbmcgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5mbGF0U2hhZGluZyA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgbWF0ZXJpYWwgaXMgYWZmZWN0ZWQgYnkgZm9nIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5mb2cgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XHJcblx0XHR0aGlzLnNwZWN1bGFyLmNvcHkoIHNvdXJjZS5zcGVjdWxhciApO1xyXG5cdFx0dGhpcy5zaGluaW5lc3MgPSBzb3VyY2Uuc2hpbmluZXNzO1xyXG5cclxuXHRcdHRoaXMubWFwID0gc291cmNlLm1hcDtcclxuXHJcblx0XHR0aGlzLmxpZ2h0TWFwID0gc291cmNlLmxpZ2h0TWFwO1xyXG5cdFx0dGhpcy5saWdodE1hcEludGVuc2l0eSA9IHNvdXJjZS5saWdodE1hcEludGVuc2l0eTtcclxuXHJcblx0XHR0aGlzLmFvTWFwID0gc291cmNlLmFvTWFwO1xyXG5cdFx0dGhpcy5hb01hcEludGVuc2l0eSA9IHNvdXJjZS5hb01hcEludGVuc2l0eTtcclxuXHJcblx0XHR0aGlzLmVtaXNzaXZlLmNvcHkoIHNvdXJjZS5lbWlzc2l2ZSApO1xyXG5cdFx0dGhpcy5lbWlzc2l2ZU1hcCA9IHNvdXJjZS5lbWlzc2l2ZU1hcDtcclxuXHRcdHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgPSBzb3VyY2UuZW1pc3NpdmVJbnRlbnNpdHk7XHJcblxyXG5cdFx0dGhpcy5idW1wTWFwID0gc291cmNlLmJ1bXBNYXA7XHJcblx0XHR0aGlzLmJ1bXBTY2FsZSA9IHNvdXJjZS5idW1wU2NhbGU7XHJcblxyXG5cdFx0dGhpcy5ub3JtYWxNYXAgPSBzb3VyY2Uubm9ybWFsTWFwO1xyXG5cdFx0dGhpcy5ub3JtYWxNYXBUeXBlID0gc291cmNlLm5vcm1hbE1hcFR5cGU7XHJcblx0XHR0aGlzLm5vcm1hbFNjYWxlLmNvcHkoIHNvdXJjZS5ub3JtYWxTY2FsZSApO1xyXG5cclxuXHRcdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gc291cmNlLmRpc3BsYWNlbWVudE1hcDtcclxuXHRcdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSBzb3VyY2UuZGlzcGxhY2VtZW50U2NhbGU7XHJcblx0XHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSBzb3VyY2UuZGlzcGxhY2VtZW50QmlhcztcclxuXHJcblx0XHR0aGlzLnNwZWN1bGFyTWFwID0gc291cmNlLnNwZWN1bGFyTWFwO1xyXG5cclxuXHRcdHRoaXMuYWxwaGFNYXAgPSBzb3VyY2UuYWxwaGFNYXA7XHJcblxyXG5cdFx0dGhpcy5lbnZNYXAgPSBzb3VyY2UuZW52TWFwO1xyXG5cdFx0dGhpcy5lbnZNYXBSb3RhdGlvbi5jb3B5KCBzb3VyY2UuZW52TWFwUm90YXRpb24gKTtcclxuXHRcdHRoaXMuY29tYmluZSA9IHNvdXJjZS5jb21iaW5lO1xyXG5cdFx0dGhpcy5yZWZsZWN0aXZpdHkgPSBzb3VyY2UucmVmbGVjdGl2aXR5O1xyXG5cdFx0dGhpcy5yZWZyYWN0aW9uUmF0aW8gPSBzb3VyY2UucmVmcmFjdGlvblJhdGlvO1xyXG5cclxuXHRcdHRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTtcclxuXHRcdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFtZUxpbmV3aWR0aDtcclxuXHRcdHRoaXMud2lyZWZyYW1lTGluZWNhcCA9IHNvdXJjZS53aXJlZnJhbWVMaW5lY2FwO1xyXG5cdFx0dGhpcy53aXJlZnJhbWVMaW5lam9pbiA9IHNvdXJjZS53aXJlZnJhbWVMaW5lam9pbjtcclxuXHJcblx0XHR0aGlzLmZsYXRTaGFkaW5nID0gc291cmNlLmZsYXRTaGFkaW5nO1xyXG5cclxuXHRcdHRoaXMuZm9nID0gc291cmNlLmZvZztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgTWVzaFBob25nTWF0ZXJpYWwgfTtcclxuIiwiaW1wb3J0IHsgVGFuZ2VudFNwYWNlTm9ybWFsTWFwIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgTWF0ZXJpYWwgfSBmcm9tICcuL01hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uL21hdGgvVmVjdG9yMi5qcyc7XHJcbmltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vbWF0aC9Db2xvci5qcyc7XHJcblxyXG4vKipcclxuICogQSBtYXRlcmlhbCBpbXBsZW1lbnRpbmcgdG9vbiBzaGFkaW5nLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTWF0ZXJpYWxcclxuICovXHJcbmNsYXNzIE1lc2hUb29uTWF0ZXJpYWwgZXh0ZW5kcyBNYXRlcmlhbCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbWVzaCB0b29uIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbWV0ZXJzXSAtIEFuIG9iamVjdCB3aXRoIG9uZSBvciBtb3JlIHByb3BlcnRpZXNcclxuXHQgKiBkZWZpbmluZyB0aGUgbWF0ZXJpYWwncyBhcHBlYXJhbmNlLiBBbnkgcHJvcGVydHkgb2YgdGhlIG1hdGVyaWFsXHJcblx0ICogKGluY2x1ZGluZyBhbnkgcHJvcGVydHkgZnJvbSBpbmhlcml0ZWQgbWF0ZXJpYWxzKSBjYW4gYmUgcGFzc2VkXHJcblx0ICogaW4gaGVyZS4gQ29sb3IgdmFsdWVzIGNhbiBiZSBwYXNzZWQgYW55IHR5cGUgb2YgdmFsdWUgYWNjZXB0ZWRcclxuXHQgKiBieSB7QGxpbmsgQ29sb3Ijc2V0fS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVycyApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc01lc2hUb29uTWF0ZXJpYWwgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMuZGVmaW5lcyA9IHsgJ1RPT04nOiAnJyB9O1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdNZXNoVG9vbk1hdGVyaWFsJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENvbG9yIG9mIHRoZSBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Q29sb3J9XHJcblx0XHQgKiBAZGVmYXVsdCAoMSwxLDEpXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY29sb3IgbWFwLiBNYXkgb3B0aW9uYWxseSBpbmNsdWRlIGFuIGFscGhhIGNoYW5uZWwsIHR5cGljYWxseSBjb21iaW5lZFxyXG5cdFx0ICogd2l0aCB7QGxpbmsgTWF0ZXJpYWwjdHJhbnNwYXJlbnR9IG9yIHtAbGluayBNYXRlcmlhbCNhbHBoYVRlc3R9LiBUaGUgdGV4dHVyZSBtYXBcclxuXHRcdCAqIGNvbG9yIGlzIG1vZHVsYXRlZCBieSB0aGUgZGlmZnVzZSBgY29sb3JgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogR3JhZGllbnQgbWFwIGZvciB0b29uIHNoYWRpbmcuIEl0J3MgcmVxdWlyZWQgdG8gc2V0XHJcblx0XHQgKiB7QGxpbmsgVGV4dHVyZSNtaW5GaWx0ZXJ9IGFuZCB7QGxpbmsgVGV4dHVyZSNtYWdGaWx0ZXJ9IHRvIHtAbGlua05lYXJlc3RGaWx0ZXJ9XHJcblx0XHQgKiB3aGVuIHVzaW5nIHRoaXMgdHlwZSBvZiB0ZXh0dXJlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ncmFkaWVudE1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbGlnaHQgbWFwLiBSZXF1aXJlcyBhIHNlY29uZCBzZXQgb2YgVVZzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5saWdodE1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBJbnRlbnNpdHkgb2YgdGhlIGJha2VkIGxpZ2h0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSAxLjA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcmVkIGNoYW5uZWwgb2YgdGhpcyB0ZXh0dXJlIGlzIHVzZWQgYXMgdGhlIGFtYmllbnQgb2NjbHVzaW9uIG1hcC5cclxuXHRcdCAqIFJlcXVpcmVzIGEgc2Vjb25kIHNldCBvZiBVVnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFvTWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEludGVuc2l0eSBvZiB0aGUgYW1iaWVudCBvY2NsdXNpb24gZWZmZWN0LiBSYW5nZSBpcyBgWzAsMV1gLCB3aGVyZSBgMGBcclxuXHRcdCAqIGRpc2FibGVzIGFtYmllbnQgb2NjbHVzaW9uLiBXaGVyZSBpbnRlbnNpdHkgaXMgYDFgIGFuZCB0aGUgQU8gbWFwJ3NcclxuXHRcdCAqIHJlZCBjaGFubmVsIGlzIGFsc28gYDFgLCBhbWJpZW50IGxpZ2h0IGlzIGZ1bGx5IG9jY2x1ZGVkIG9uIGEgc3VyZmFjZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gMS4wO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRW1pc3NpdmUgKGxpZ2h0KSBjb2xvciBvZiB0aGUgbWF0ZXJpYWwsIGVzc2VudGlhbGx5IGEgc29saWQgY29sb3JcclxuXHRcdCAqIHVuYWZmZWN0ZWQgYnkgb3RoZXIgbGlnaHRpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0NvbG9yfVxyXG5cdFx0ICogQGRlZmF1bHQgKDAsMCwwKVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmVtaXNzaXZlID0gbmV3IENvbG9yKCAweDAwMDAwMCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSW50ZW5zaXR5IG9mIHRoZSBlbWlzc2l2ZSBsaWdodC4gTW9kdWxhdGVzIHRoZSBlbWlzc2l2ZSBjb2xvci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ID0gMS4wO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU2V0IGVtaXNzaXZlIChnbG93KSBtYXAuIFRoZSBlbWlzc2l2ZSBtYXAgY29sb3IgaXMgbW9kdWxhdGVkIGJ5IHRoZVxyXG5cdFx0ICogZW1pc3NpdmUgY29sb3IgYW5kIHRoZSBlbWlzc2l2ZSBpbnRlbnNpdHkuIElmIHlvdSBoYXZlIGFuIGVtaXNzaXZlIG1hcCxcclxuXHRcdCAqIGJlIHN1cmUgdG8gc2V0IHRoZSBlbWlzc2l2ZSBjb2xvciB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiBibGFjay5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZW1pc3NpdmVNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHRleHR1cmUgdG8gY3JlYXRlIGEgYnVtcCBtYXAuIFRoZSBibGFjayBhbmQgd2hpdGUgdmFsdWVzIG1hcCB0byB0aGVcclxuXHRcdCAqIHBlcmNlaXZlZCBkZXB0aCBpbiByZWxhdGlvbiB0byB0aGUgbGlnaHRzLiBCdW1wIGRvZXNuJ3QgYWN0dWFsbHkgYWZmZWN0XHJcblx0XHQgKiB0aGUgZ2VvbWV0cnkgb2YgdGhlIG9iamVjdCwgb25seSB0aGUgbGlnaHRpbmcuIElmIGEgbm9ybWFsIG1hcCBpcyBkZWZpbmVkXHJcblx0XHQgKiB0aGlzIHdpbGwgYmUgaWdub3JlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYnVtcE1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3cgbXVjaCB0aGUgYnVtcCBtYXAgYWZmZWN0cyB0aGUgbWF0ZXJpYWwuIFR5cGljYWwgcmFuZ2UgaXMgYFswLDFdYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJ1bXBTY2FsZSA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdGV4dHVyZSB0byBjcmVhdGUgYSBub3JtYWwgbWFwLiBUaGUgUkdCIHZhbHVlcyBhZmZlY3QgdGhlIHN1cmZhY2VcclxuXHRcdCAqIG5vcm1hbCBmb3IgZWFjaCBwaXhlbCBmcmFnbWVudCBhbmQgY2hhbmdlIHRoZSB3YXkgdGhlIGNvbG9yIGlzIGxpdC4gTm9ybWFsXHJcblx0XHQgKiBtYXBzIGRvIG5vdCBjaGFuZ2UgdGhlIGFjdHVhbCBzaGFwZSBvZiB0aGUgc3VyZmFjZSwgb25seSB0aGUgbGlnaHRpbmcuIEluXHJcblx0XHQgKiBjYXNlIHRoZSBtYXRlcmlhbCBoYXMgYSBub3JtYWwgbWFwIGF1dGhvcmVkIHVzaW5nIHRoZSBsZWZ0IGhhbmRlZFxyXG5cdFx0ICogY29udmVudGlvbiwgdGhlIGB5YCBjb21wb25lbnQgb2YgYG5vcm1hbFNjYWxlYCBzaG91bGQgYmUgbmVnYXRlZCB0byBjb21wZW5zYXRlXHJcblx0XHQgKiBmb3IgdGhlIGRpZmZlcmVudCBoYW5kZWRuZXNzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub3JtYWxNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHR5cGUgb2Ygbm9ybWFsIG1hcC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KFRhbmdlbnRTcGFjZU5vcm1hbE1hcHxPYmplY3RTcGFjZU5vcm1hbE1hcCl9XHJcblx0XHQgKiBAZGVmYXVsdCBUYW5nZW50U3BhY2VOb3JtYWxNYXBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub3JtYWxNYXBUeXBlID0gVGFuZ2VudFNwYWNlTm9ybWFsTWFwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG93IG11Y2ggdGhlIG5vcm1hbCBtYXAgYWZmZWN0cyB0aGUgbWF0ZXJpYWwuIFR5cGljYWwgdmFsdWUgcmFuZ2UgaXMgYFswLDFdYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yMn1cclxuXHRcdCAqIEBkZWZhdWx0ICgxLDEpXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMiggMSwgMSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGRpc3BsYWNlbWVudCBtYXAgYWZmZWN0cyB0aGUgcG9zaXRpb24gb2YgdGhlIG1lc2gncyB2ZXJ0aWNlcy4gVW5saWtlXHJcblx0XHQgKiBvdGhlciBtYXBzIHdoaWNoIG9ubHkgYWZmZWN0IHRoZSBsaWdodCBhbmQgc2hhZGUgb2YgdGhlIG1hdGVyaWFsIHRoZVxyXG5cdFx0ICogZGlzcGxhY2VkIHZlcnRpY2VzIGNhbiBjYXN0IHNoYWRvd3MsIGJsb2NrIG90aGVyIG9iamVjdHMsIGFuZCBvdGhlcndpc2VcclxuXHRcdCAqIGFjdCBhcyByZWFsIGdlb21ldHJ5LiBUaGUgZGlzcGxhY2VtZW50IHRleHR1cmUgaXMgYW4gaW1hZ2Ugd2hlcmUgdGhlIHZhbHVlXHJcblx0XHQgKiBvZiBlYWNoIHBpeGVsICh3aGl0ZSBiZWluZyB0aGUgaGlnaGVzdCkgaXMgbWFwcGVkIGFnYWluc3QsIGFuZFxyXG5cdFx0ICogcmVwb3NpdGlvbnMsIHRoZSB2ZXJ0aWNlcyBvZiB0aGUgbWVzaC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvdyBtdWNoIHRoZSBkaXNwbGFjZW1lbnQgbWFwIGFmZmVjdHMgdGhlIG1lc2ggKHdoZXJlIGJsYWNrIGlzIG5vXHJcblx0XHQgKiBkaXNwbGFjZW1lbnQsIGFuZCB3aGl0ZSBpcyBtYXhpbXVtIGRpc3BsYWNlbWVudCkuIFdpdGhvdXQgYSBkaXNwbGFjZW1lbnRcclxuXHRcdCAqIG1hcCBzZXQsIHRoaXMgdmFsdWUgaXMgbm90IGFwcGxpZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgb2Zmc2V0IG9mIHRoZSBkaXNwbGFjZW1lbnQgbWFwJ3MgdmFsdWVzIG9uIHRoZSBtZXNoJ3MgdmVydGljZXMuXHJcblx0XHQgKiBUaGUgYmlhcyBpcyBhZGRlZCB0byB0aGUgc2NhbGVkIHNhbXBsZSBvZiB0aGUgZGlzcGxhY2VtZW50IG1hcC5cclxuXHRcdCAqIFdpdGhvdXQgYSBkaXNwbGFjZW1lbnQgbWFwIHNldCwgdGhpcyB2YWx1ZSBpcyBub3QgYXBwbGllZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGFscGhhIG1hcCBpcyBhIGdyYXlzY2FsZSB0ZXh0dXJlIHRoYXQgY29udHJvbHMgdGhlIG9wYWNpdHkgYWNyb3NzIHRoZVxyXG5cdFx0ICogc3VyZmFjZSAoYmxhY2s6IGZ1bGx5IHRyYW5zcGFyZW50OyB3aGl0ZTogZnVsbHkgb3BhcXVlKS5cclxuXHRcdCAqXHJcblx0XHQgKiBPbmx5IHRoZSBjb2xvciBvZiB0aGUgdGV4dHVyZSBpcyB1c2VkLCBpZ25vcmluZyB0aGUgYWxwaGEgY2hhbm5lbCBpZiBvbmVcclxuXHRcdCAqIGV4aXN0cy4gRm9yIFJHQiBhbmQgUkdCQSB0ZXh0dXJlcywgdGhlIHJlbmRlcmVyIHdpbGwgdXNlIHRoZSBncmVlbiBjaGFubmVsXHJcblx0XHQgKiB3aGVuIHNhbXBsaW5nIHRoaXMgdGV4dHVyZSBkdWUgdG8gdGhlIGV4dHJhIGJpdCBvZiBwcmVjaXNpb24gcHJvdmlkZWQgZm9yXHJcblx0XHQgKiBncmVlbiBpbiBEWFQtY29tcHJlc3NlZCBhbmQgdW5jb21wcmVzc2VkIFJHQiA1NjUgZm9ybWF0cy4gTHVtaW5hbmNlLW9ubHkgYW5kXHJcblx0XHQgKiBsdW1pbmFuY2UvYWxwaGEgdGV4dHVyZXMgd2lsbCBhbHNvIHN0aWxsIHdvcmsgYXMgZXhwZWN0ZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFscGhhTWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlbmRlcnMgdGhlIGdlb21ldHJ5IGFzIGEgd2lyZWZyYW1lLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy53aXJlZnJhbWUgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENvbnRyb2xzIHRoZSB0aGlja25lc3Mgb2YgdGhlIHdpcmVmcmFtZS5cclxuXHRcdCAqXHJcblx0XHQgKiBDYW4gb25seSBiZSB1c2VkIHdpdGgge0BsaW5rIFNWR1JlbmRlcmVyfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIGFwcGVhcmFuY2Ugb2Ygd2lyZWZyYW1lIGVuZHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQ2FuIG9ubHkgYmUgdXNlZCB3aXRoIHtAbGluayBTVkdSZW5kZXJlcn0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeygncm91bmQnfCdiZXZlbCd8J21pdGVyJyl9XHJcblx0XHQgKiBAZGVmYXVsdCAncm91bmQnXHJcblx0XHQgKi9cclxuXHRcdHRoaXMud2lyZWZyYW1lTGluZWNhcCA9ICdyb3VuZCc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIGFwcGVhcmFuY2Ugb2Ygd2lyZWZyYW1lIGpvaW50cy5cclxuXHRcdCAqXHJcblx0XHQgKiBDYW4gb25seSBiZSB1c2VkIHdpdGgge0BsaW5rIFNWR1JlbmRlcmVyfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KCdyb3VuZCd8J2JldmVsJ3wnbWl0ZXInKX1cclxuXHRcdCAqIEBkZWZhdWx0ICdyb3VuZCdcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy53aXJlZnJhbWVMaW5lam9pbiA9ICdyb3VuZCc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSBtYXRlcmlhbCBpcyBhZmZlY3RlZCBieSBmb2cgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZvZyA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcclxuXHJcblx0XHR0aGlzLm1hcCA9IHNvdXJjZS5tYXA7XHJcblx0XHR0aGlzLmdyYWRpZW50TWFwID0gc291cmNlLmdyYWRpZW50TWFwO1xyXG5cclxuXHRcdHRoaXMubGlnaHRNYXAgPSBzb3VyY2UubGlnaHRNYXA7XHJcblx0XHR0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gc291cmNlLmxpZ2h0TWFwSW50ZW5zaXR5O1xyXG5cclxuXHRcdHRoaXMuYW9NYXAgPSBzb3VyY2UuYW9NYXA7XHJcblx0XHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gc291cmNlLmFvTWFwSW50ZW5zaXR5O1xyXG5cclxuXHRcdHRoaXMuZW1pc3NpdmUuY29weSggc291cmNlLmVtaXNzaXZlICk7XHJcblx0XHR0aGlzLmVtaXNzaXZlTWFwID0gc291cmNlLmVtaXNzaXZlTWFwO1xyXG5cdFx0dGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IHNvdXJjZS5lbWlzc2l2ZUludGVuc2l0eTtcclxuXHJcblx0XHR0aGlzLmJ1bXBNYXAgPSBzb3VyY2UuYnVtcE1hcDtcclxuXHRcdHRoaXMuYnVtcFNjYWxlID0gc291cmNlLmJ1bXBTY2FsZTtcclxuXHJcblx0XHR0aGlzLm5vcm1hbE1hcCA9IHNvdXJjZS5ub3JtYWxNYXA7XHJcblx0XHR0aGlzLm5vcm1hbE1hcFR5cGUgPSBzb3VyY2Uubm9ybWFsTWFwVHlwZTtcclxuXHRcdHRoaXMubm9ybWFsU2NhbGUuY29weSggc291cmNlLm5vcm1hbFNjYWxlICk7XHJcblxyXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBzb3VyY2UuZGlzcGxhY2VtZW50TWFwO1xyXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHNvdXJjZS5kaXNwbGFjZW1lbnRTY2FsZTtcclxuXHRcdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IHNvdXJjZS5kaXNwbGFjZW1lbnRCaWFzO1xyXG5cclxuXHRcdHRoaXMuYWxwaGFNYXAgPSBzb3VyY2UuYWxwaGFNYXA7XHJcblxyXG5cdFx0dGhpcy53aXJlZnJhbWUgPSBzb3VyY2Uud2lyZWZyYW1lO1xyXG5cdFx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoO1xyXG5cdFx0dGhpcy53aXJlZnJhbWVMaW5lY2FwID0gc291cmNlLndpcmVmcmFtZUxpbmVjYXA7XHJcblx0XHR0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gc291cmNlLndpcmVmcmFtZUxpbmVqb2luO1xyXG5cclxuXHRcdHRoaXMuZm9nID0gc291cmNlLmZvZztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgTWVzaFRvb25NYXRlcmlhbCB9O1xyXG4iLCJpbXBvcnQgeyBUYW5nZW50U3BhY2VOb3JtYWxNYXAgfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBNYXRlcmlhbCB9IGZyb20gJy4vTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IyLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIG1hdGVyaWFsIHRoYXQgbWFwcyB0aGUgbm9ybWFsIHZlY3RvcnMgdG8gUkdCIGNvbG9ycy5cclxuICpcclxuICogQGF1Z21lbnRzIE1hdGVyaWFsXHJcbiAqL1xyXG5jbGFzcyBNZXNoTm9ybWFsTWF0ZXJpYWwgZXh0ZW5kcyBNYXRlcmlhbCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbWVzaCBub3JtYWwgbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtZXRlcnNdIC0gQW4gb2JqZWN0IHdpdGggb25lIG9yIG1vcmUgcHJvcGVydGllc1xyXG5cdCAqIGRlZmluaW5nIHRoZSBtYXRlcmlhbCdzIGFwcGVhcmFuY2UuIEFueSBwcm9wZXJ0eSBvZiB0aGUgbWF0ZXJpYWxcclxuXHQgKiAoaW5jbHVkaW5nIGFueSBwcm9wZXJ0eSBmcm9tIGluaGVyaXRlZCBtYXRlcmlhbHMpIGNhbiBiZSBwYXNzZWRcclxuXHQgKiBpbiBoZXJlLiBDb2xvciB2YWx1ZXMgY2FuIGJlIHBhc3NlZCBhbnkgdHlwZSBvZiB2YWx1ZSBhY2NlcHRlZFxyXG5cdCAqIGJ5IHtAbGluayBDb2xvciNzZXR9LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwYXJhbWV0ZXJzICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzTWVzaE5vcm1hbE1hdGVyaWFsID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnTWVzaE5vcm1hbE1hdGVyaWFsJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB0ZXh0dXJlIHRvIGNyZWF0ZSBhIGJ1bXAgbWFwLiBUaGUgYmxhY2sgYW5kIHdoaXRlIHZhbHVlcyBtYXAgdG8gdGhlXHJcblx0XHQgKiBwZXJjZWl2ZWQgZGVwdGggaW4gcmVsYXRpb24gdG8gdGhlIGxpZ2h0cy4gQnVtcCBkb2Vzbid0IGFjdHVhbGx5IGFmZmVjdFxyXG5cdFx0ICogdGhlIGdlb21ldHJ5IG9mIHRoZSBvYmplY3QsIG9ubHkgdGhlIGxpZ2h0aW5nLiBJZiBhIG5vcm1hbCBtYXAgaXMgZGVmaW5lZFxyXG5cdFx0ICogdGhpcyB3aWxsIGJlIGlnbm9yZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJ1bXBNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG93IG11Y2ggdGhlIGJ1bXAgbWFwIGFmZmVjdHMgdGhlIG1hdGVyaWFsLiBUeXBpY2FsIHJhbmdlIGlzIGBbMCwxXWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5idW1wU2NhbGUgPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHRleHR1cmUgdG8gY3JlYXRlIGEgbm9ybWFsIG1hcC4gVGhlIFJHQiB2YWx1ZXMgYWZmZWN0IHRoZSBzdXJmYWNlXHJcblx0XHQgKiBub3JtYWwgZm9yIGVhY2ggcGl4ZWwgZnJhZ21lbnQgYW5kIGNoYW5nZSB0aGUgd2F5IHRoZSBjb2xvciBpcyBsaXQuIE5vcm1hbFxyXG5cdFx0ICogbWFwcyBkbyBub3QgY2hhbmdlIHRoZSBhY3R1YWwgc2hhcGUgb2YgdGhlIHN1cmZhY2UsIG9ubHkgdGhlIGxpZ2h0aW5nLiBJblxyXG5cdFx0ICogY2FzZSB0aGUgbWF0ZXJpYWwgaGFzIGEgbm9ybWFsIG1hcCBhdXRob3JlZCB1c2luZyB0aGUgbGVmdCBoYW5kZWRcclxuXHRcdCAqIGNvbnZlbnRpb24sIHRoZSBgeWAgY29tcG9uZW50IG9mIGBub3JtYWxTY2FsZWAgc2hvdWxkIGJlIG5lZ2F0ZWQgdG8gY29tcGVuc2F0ZVxyXG5cdFx0ICogZm9yIHRoZSBkaWZmZXJlbnQgaGFuZGVkbmVzcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9ybWFsTWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB0eXBlIG9mIG5vcm1hbCBtYXAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeyhUYW5nZW50U3BhY2VOb3JtYWxNYXB8T2JqZWN0U3BhY2VOb3JtYWxNYXApfVxyXG5cdFx0ICogQGRlZmF1bHQgVGFuZ2VudFNwYWNlTm9ybWFsTWFwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9ybWFsTWFwVHlwZSA9IFRhbmdlbnRTcGFjZU5vcm1hbE1hcDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvdyBtdWNoIHRoZSBub3JtYWwgbWFwIGFmZmVjdHMgdGhlIG1hdGVyaWFsLiBUeXBpY2FsIHZhbHVlIHJhbmdlIGlzIGBbMCwxXWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjJ9XHJcblx0XHQgKiBAZGVmYXVsdCAoMSwxKVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vcm1hbFNjYWxlID0gbmV3IFZlY3RvcjIoIDEsIDEgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBkaXNwbGFjZW1lbnQgbWFwIGFmZmVjdHMgdGhlIHBvc2l0aW9uIG9mIHRoZSBtZXNoJ3MgdmVydGljZXMuIFVubGlrZVxyXG5cdFx0ICogb3RoZXIgbWFwcyB3aGljaCBvbmx5IGFmZmVjdCB0aGUgbGlnaHQgYW5kIHNoYWRlIG9mIHRoZSBtYXRlcmlhbCB0aGVcclxuXHRcdCAqIGRpc3BsYWNlZCB2ZXJ0aWNlcyBjYW4gY2FzdCBzaGFkb3dzLCBibG9jayBvdGhlciBvYmplY3RzLCBhbmQgb3RoZXJ3aXNlXHJcblx0XHQgKiBhY3QgYXMgcmVhbCBnZW9tZXRyeS4gVGhlIGRpc3BsYWNlbWVudCB0ZXh0dXJlIGlzIGFuIGltYWdlIHdoZXJlIHRoZSB2YWx1ZVxyXG5cdFx0ICogb2YgZWFjaCBwaXhlbCAod2hpdGUgYmVpbmcgdGhlIGhpZ2hlc3QpIGlzIG1hcHBlZCBhZ2FpbnN0LCBhbmRcclxuXHRcdCAqIHJlcG9zaXRpb25zLCB0aGUgdmVydGljZXMgb2YgdGhlIG1lc2guXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3cgbXVjaCB0aGUgZGlzcGxhY2VtZW50IG1hcCBhZmZlY3RzIHRoZSBtZXNoICh3aGVyZSBibGFjayBpcyBub1xyXG5cdFx0ICogZGlzcGxhY2VtZW50LCBhbmQgd2hpdGUgaXMgbWF4aW11bSBkaXNwbGFjZW1lbnQpLiBXaXRob3V0IGEgZGlzcGxhY2VtZW50XHJcblx0XHQgKiBtYXAgc2V0LCB0aGlzIHZhbHVlIGlzIG5vdCBhcHBsaWVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG9mZnNldCBvZiB0aGUgZGlzcGxhY2VtZW50IG1hcCdzIHZhbHVlcyBvbiB0aGUgbWVzaCdzIHZlcnRpY2VzLlxyXG5cdFx0ICogVGhlIGJpYXMgaXMgYWRkZWQgdG8gdGhlIHNjYWxlZCBzYW1wbGUgb2YgdGhlIGRpc3BsYWNlbWVudCBtYXAuXHJcblx0XHQgKiBXaXRob3V0IGEgZGlzcGxhY2VtZW50IG1hcCBzZXQsIHRoaXMgdmFsdWUgaXMgbm90IGFwcGxpZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlbmRlcnMgdGhlIGdlb21ldHJ5IGFzIGEgd2lyZWZyYW1lLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy53aXJlZnJhbWUgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENvbnRyb2xzIHRoZSB0aGlja25lc3Mgb2YgdGhlIHdpcmVmcmFtZS5cclxuXHRcdCAqXHJcblx0XHQgKiBXZWJHTCBhbmQgV2ViR1BVIGlnbm9yZSB0aGlzIHByb3BlcnR5IGFuZCBhbHdheXMgcmVuZGVyXHJcblx0XHQgKiAxIHBpeGVsIHdpZGUgbGluZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgbWF0ZXJpYWwgaXMgcmVuZGVyZWQgd2l0aCBmbGF0IHNoYWRpbmcgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5mbGF0U2hhZGluZyA9IGZhbHNlO1xyXG5cclxuXHRcdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMuYnVtcE1hcCA9IHNvdXJjZS5idW1wTWFwO1xyXG5cdFx0dGhpcy5idW1wU2NhbGUgPSBzb3VyY2UuYnVtcFNjYWxlO1xyXG5cclxuXHRcdHRoaXMubm9ybWFsTWFwID0gc291cmNlLm5vcm1hbE1hcDtcclxuXHRcdHRoaXMubm9ybWFsTWFwVHlwZSA9IHNvdXJjZS5ub3JtYWxNYXBUeXBlO1xyXG5cdFx0dGhpcy5ub3JtYWxTY2FsZS5jb3B5KCBzb3VyY2Uubm9ybWFsU2NhbGUgKTtcclxuXHJcblx0XHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IHNvdXJjZS5kaXNwbGFjZW1lbnRNYXA7XHJcblx0XHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gc291cmNlLmRpc3BsYWNlbWVudFNjYWxlO1xyXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gc291cmNlLmRpc3BsYWNlbWVudEJpYXM7XHJcblxyXG5cdFx0dGhpcy53aXJlZnJhbWUgPSBzb3VyY2Uud2lyZWZyYW1lO1xyXG5cdFx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoO1xyXG5cclxuXHRcdHRoaXMuZmxhdFNoYWRpbmcgPSBzb3VyY2UuZmxhdFNoYWRpbmc7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IE1lc2hOb3JtYWxNYXRlcmlhbCB9O1xyXG4iLCJpbXBvcnQgeyBNdWx0aXBseU9wZXJhdGlvbiwgVGFuZ2VudFNwYWNlTm9ybWFsTWFwIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgTWF0ZXJpYWwgfSBmcm9tICcuL01hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uL21hdGgvVmVjdG9yMi5qcyc7XHJcbmltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vbWF0aC9Db2xvci5qcyc7XHJcbmltcG9ydCB7IEV1bGVyIH0gZnJvbSAnLi4vbWF0aC9FdWxlci5qcyc7XHJcblxyXG4vKipcclxuICogQSBtYXRlcmlhbCBmb3Igbm9uLXNoaW55IHN1cmZhY2VzLCB3aXRob3V0IHNwZWN1bGFyIGhpZ2hsaWdodHMuXHJcbiAqXHJcbiAqIFRoZSBtYXRlcmlhbCB1c2VzIGEgbm9uLXBoeXNpY2FsbHkgYmFzZWQgW0xhbWJlcnRpYW5de0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xhbWJlcnRpYW5fcmVmbGVjdGFuY2V9XHJcbiAqIG1vZGVsIGZvciBjYWxjdWxhdGluZyByZWZsZWN0YW5jZS4gVGhpcyBjYW4gc2ltdWxhdGUgc29tZSBzdXJmYWNlcyAoc3VjaFxyXG4gKiBhcyB1bnRyZWF0ZWQgd29vZCBvciBzdG9uZSkgd2VsbCwgYnV0IGNhbm5vdCBzaW11bGF0ZSBzaGlueSBzdXJmYWNlcyB3aXRoXHJcbiAqIHNwZWN1bGFyIGhpZ2hsaWdodHMgKHN1Y2ggYXMgdmFybmlzaGVkIHdvb2QpLiBgTWVzaExhbWJlcnRNYXRlcmlhbGAgdXNlcyBwZXItZnJhZ21lbnRcclxuICogc2hhZGluZy5cclxuICpcclxuICogRHVlIHRvIHRoZSBzaW1wbGljaXR5IG9mIHRoZSByZWZsZWN0YW5jZSBhbmQgaWxsdW1pbmF0aW9uIG1vZGVscyxcclxuICogcGVyZm9ybWFuY2Ugd2lsbCBiZSBncmVhdGVyIHdoZW4gdXNpbmcgdGhpcyBtYXRlcmlhbCBvdmVyIHRoZVxyXG4gKiB7QGxpbmsgTWVzaFBob25nTWF0ZXJpYWx9LCB7QGxpbmsgTWVzaFN0YW5kYXJkTWF0ZXJpYWx9IG9yXHJcbiAqIHtAbGluayBNZXNoUGh5c2ljYWxNYXRlcmlhbH0sIGF0IHRoZSBjb3N0IG9mIHNvbWUgZ3JhcGhpY2FsIGFjY3VyYWN5LlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTWF0ZXJpYWxcclxuICovXHJcbmNsYXNzIE1lc2hMYW1iZXJ0TWF0ZXJpYWwgZXh0ZW5kcyBNYXRlcmlhbCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbWVzaCBsYW1iZXJ0IG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbWV0ZXJzXSAtIEFuIG9iamVjdCB3aXRoIG9uZSBvciBtb3JlIHByb3BlcnRpZXNcclxuXHQgKiBkZWZpbmluZyB0aGUgbWF0ZXJpYWwncyBhcHBlYXJhbmNlLiBBbnkgcHJvcGVydHkgb2YgdGhlIG1hdGVyaWFsXHJcblx0ICogKGluY2x1ZGluZyBhbnkgcHJvcGVydHkgZnJvbSBpbmhlcml0ZWQgbWF0ZXJpYWxzKSBjYW4gYmUgcGFzc2VkXHJcblx0ICogaW4gaGVyZS4gQ29sb3IgdmFsdWVzIGNhbiBiZSBwYXNzZWQgYW55IHR5cGUgb2YgdmFsdWUgYWNjZXB0ZWRcclxuXHQgKiBieSB7QGxpbmsgQ29sb3Ijc2V0fS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVycyApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc01lc2hMYW1iZXJ0TWF0ZXJpYWwgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdNZXNoTGFtYmVydE1hdGVyaWFsJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENvbG9yIG9mIHRoZSBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Q29sb3J9XHJcblx0XHQgKiBAZGVmYXVsdCAoMSwxLDEpXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7IC8vIGRpZmZ1c2VcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjb2xvciBtYXAuIE1heSBvcHRpb25hbGx5IGluY2x1ZGUgYW4gYWxwaGEgY2hhbm5lbCwgdHlwaWNhbGx5IGNvbWJpbmVkXHJcblx0XHQgKiB3aXRoIHtAbGluayBNYXRlcmlhbCN0cmFuc3BhcmVudH0gb3Ige0BsaW5rIE1hdGVyaWFsI2FscGhhVGVzdH0uIFRoZSB0ZXh0dXJlIG1hcFxyXG5cdFx0ICogY29sb3IgaXMgbW9kdWxhdGVkIGJ5IHRoZSBkaWZmdXNlIGBjb2xvcmAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbGlnaHQgbWFwLiBSZXF1aXJlcyBhIHNlY29uZCBzZXQgb2YgVVZzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5saWdodE1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBJbnRlbnNpdHkgb2YgdGhlIGJha2VkIGxpZ2h0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSAxLjA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcmVkIGNoYW5uZWwgb2YgdGhpcyB0ZXh0dXJlIGlzIHVzZWQgYXMgdGhlIGFtYmllbnQgb2NjbHVzaW9uIG1hcC5cclxuXHRcdCAqIFJlcXVpcmVzIGEgc2Vjb25kIHNldCBvZiBVVnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFvTWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEludGVuc2l0eSBvZiB0aGUgYW1iaWVudCBvY2NsdXNpb24gZWZmZWN0LiBSYW5nZSBpcyBgWzAsMV1gLCB3aGVyZSBgMGBcclxuXHRcdCAqIGRpc2FibGVzIGFtYmllbnQgb2NjbHVzaW9uLiBXaGVyZSBpbnRlbnNpdHkgaXMgYDFgIGFuZCB0aGUgQU8gbWFwJ3NcclxuXHRcdCAqIHJlZCBjaGFubmVsIGlzIGFsc28gYDFgLCBhbWJpZW50IGxpZ2h0IGlzIGZ1bGx5IG9jY2x1ZGVkIG9uIGEgc3VyZmFjZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gMS4wO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRW1pc3NpdmUgKGxpZ2h0KSBjb2xvciBvZiB0aGUgbWF0ZXJpYWwsIGVzc2VudGlhbGx5IGEgc29saWQgY29sb3JcclxuXHRcdCAqIHVuYWZmZWN0ZWQgYnkgb3RoZXIgbGlnaHRpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0NvbG9yfVxyXG5cdFx0ICogQGRlZmF1bHQgKDAsMCwwKVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmVtaXNzaXZlID0gbmV3IENvbG9yKCAweDAwMDAwMCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSW50ZW5zaXR5IG9mIHRoZSBlbWlzc2l2ZSBsaWdodC4gTW9kdWxhdGVzIHRoZSBlbWlzc2l2ZSBjb2xvci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ID0gMS4wO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU2V0IGVtaXNzaXZlIChnbG93KSBtYXAuIFRoZSBlbWlzc2l2ZSBtYXAgY29sb3IgaXMgbW9kdWxhdGVkIGJ5IHRoZVxyXG5cdFx0ICogZW1pc3NpdmUgY29sb3IgYW5kIHRoZSBlbWlzc2l2ZSBpbnRlbnNpdHkuIElmIHlvdSBoYXZlIGFuIGVtaXNzaXZlIG1hcCxcclxuXHRcdCAqIGJlIHN1cmUgdG8gc2V0IHRoZSBlbWlzc2l2ZSBjb2xvciB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiBibGFjay5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZW1pc3NpdmVNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHRleHR1cmUgdG8gY3JlYXRlIGEgYnVtcCBtYXAuIFRoZSBibGFjayBhbmQgd2hpdGUgdmFsdWVzIG1hcCB0byB0aGVcclxuXHRcdCAqIHBlcmNlaXZlZCBkZXB0aCBpbiByZWxhdGlvbiB0byB0aGUgbGlnaHRzLiBCdW1wIGRvZXNuJ3QgYWN0dWFsbHkgYWZmZWN0XHJcblx0XHQgKiB0aGUgZ2VvbWV0cnkgb2YgdGhlIG9iamVjdCwgb25seSB0aGUgbGlnaHRpbmcuIElmIGEgbm9ybWFsIG1hcCBpcyBkZWZpbmVkXHJcblx0XHQgKiB0aGlzIHdpbGwgYmUgaWdub3JlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYnVtcE1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3cgbXVjaCB0aGUgYnVtcCBtYXAgYWZmZWN0cyB0aGUgbWF0ZXJpYWwuIFR5cGljYWwgcmFuZ2UgaXMgYFswLDFdYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJ1bXBTY2FsZSA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdGV4dHVyZSB0byBjcmVhdGUgYSBub3JtYWwgbWFwLiBUaGUgUkdCIHZhbHVlcyBhZmZlY3QgdGhlIHN1cmZhY2VcclxuXHRcdCAqIG5vcm1hbCBmb3IgZWFjaCBwaXhlbCBmcmFnbWVudCBhbmQgY2hhbmdlIHRoZSB3YXkgdGhlIGNvbG9yIGlzIGxpdC4gTm9ybWFsXHJcblx0XHQgKiBtYXBzIGRvIG5vdCBjaGFuZ2UgdGhlIGFjdHVhbCBzaGFwZSBvZiB0aGUgc3VyZmFjZSwgb25seSB0aGUgbGlnaHRpbmcuIEluXHJcblx0XHQgKiBjYXNlIHRoZSBtYXRlcmlhbCBoYXMgYSBub3JtYWwgbWFwIGF1dGhvcmVkIHVzaW5nIHRoZSBsZWZ0IGhhbmRlZFxyXG5cdFx0ICogY29udmVudGlvbiwgdGhlIGB5YCBjb21wb25lbnQgb2YgYG5vcm1hbFNjYWxlYCBzaG91bGQgYmUgbmVnYXRlZCB0byBjb21wZW5zYXRlXHJcblx0XHQgKiBmb3IgdGhlIGRpZmZlcmVudCBoYW5kZWRuZXNzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub3JtYWxNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHR5cGUgb2Ygbm9ybWFsIG1hcC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KFRhbmdlbnRTcGFjZU5vcm1hbE1hcHxPYmplY3RTcGFjZU5vcm1hbE1hcCl9XHJcblx0XHQgKiBAZGVmYXVsdCBUYW5nZW50U3BhY2VOb3JtYWxNYXBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub3JtYWxNYXBUeXBlID0gVGFuZ2VudFNwYWNlTm9ybWFsTWFwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG93IG11Y2ggdGhlIG5vcm1hbCBtYXAgYWZmZWN0cyB0aGUgbWF0ZXJpYWwuIFR5cGljYWwgdmFsdWUgcmFuZ2UgaXMgYFswLDFdYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yMn1cclxuXHRcdCAqIEBkZWZhdWx0ICgxLDEpXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMiggMSwgMSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGRpc3BsYWNlbWVudCBtYXAgYWZmZWN0cyB0aGUgcG9zaXRpb24gb2YgdGhlIG1lc2gncyB2ZXJ0aWNlcy4gVW5saWtlXHJcblx0XHQgKiBvdGhlciBtYXBzIHdoaWNoIG9ubHkgYWZmZWN0IHRoZSBsaWdodCBhbmQgc2hhZGUgb2YgdGhlIG1hdGVyaWFsIHRoZVxyXG5cdFx0ICogZGlzcGxhY2VkIHZlcnRpY2VzIGNhbiBjYXN0IHNoYWRvd3MsIGJsb2NrIG90aGVyIG9iamVjdHMsIGFuZCBvdGhlcndpc2VcclxuXHRcdCAqIGFjdCBhcyByZWFsIGdlb21ldHJ5LiBUaGUgZGlzcGxhY2VtZW50IHRleHR1cmUgaXMgYW4gaW1hZ2Ugd2hlcmUgdGhlIHZhbHVlXHJcblx0XHQgKiBvZiBlYWNoIHBpeGVsICh3aGl0ZSBiZWluZyB0aGUgaGlnaGVzdCkgaXMgbWFwcGVkIGFnYWluc3QsIGFuZFxyXG5cdFx0ICogcmVwb3NpdGlvbnMsIHRoZSB2ZXJ0aWNlcyBvZiB0aGUgbWVzaC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvdyBtdWNoIHRoZSBkaXNwbGFjZW1lbnQgbWFwIGFmZmVjdHMgdGhlIG1lc2ggKHdoZXJlIGJsYWNrIGlzIG5vXHJcblx0XHQgKiBkaXNwbGFjZW1lbnQsIGFuZCB3aGl0ZSBpcyBtYXhpbXVtIGRpc3BsYWNlbWVudCkuIFdpdGhvdXQgYSBkaXNwbGFjZW1lbnRcclxuXHRcdCAqIG1hcCBzZXQsIHRoaXMgdmFsdWUgaXMgbm90IGFwcGxpZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgb2Zmc2V0IG9mIHRoZSBkaXNwbGFjZW1lbnQgbWFwJ3MgdmFsdWVzIG9uIHRoZSBtZXNoJ3MgdmVydGljZXMuXHJcblx0XHQgKiBUaGUgYmlhcyBpcyBhZGRlZCB0byB0aGUgc2NhbGVkIHNhbXBsZSBvZiB0aGUgZGlzcGxhY2VtZW50IG1hcC5cclxuXHRcdCAqIFdpdGhvdXQgYSBkaXNwbGFjZW1lbnQgbWFwIHNldCwgdGhpcyB2YWx1ZSBpcyBub3QgYXBwbGllZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU3BlY3VsYXIgbWFwIHVzZWQgYnkgdGhlIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zcGVjdWxhck1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYWxwaGEgbWFwIGlzIGEgZ3JheXNjYWxlIHRleHR1cmUgdGhhdCBjb250cm9scyB0aGUgb3BhY2l0eSBhY3Jvc3MgdGhlXHJcblx0XHQgKiBzdXJmYWNlIChibGFjazogZnVsbHkgdHJhbnNwYXJlbnQ7IHdoaXRlOiBmdWxseSBvcGFxdWUpLlxyXG5cdFx0ICpcclxuXHRcdCAqIE9ubHkgdGhlIGNvbG9yIG9mIHRoZSB0ZXh0dXJlIGlzIHVzZWQsIGlnbm9yaW5nIHRoZSBhbHBoYSBjaGFubmVsIGlmIG9uZVxyXG5cdFx0ICogZXhpc3RzLiBGb3IgUkdCIGFuZCBSR0JBIHRleHR1cmVzLCB0aGUgcmVuZGVyZXIgd2lsbCB1c2UgdGhlIGdyZWVuIGNoYW5uZWxcclxuXHRcdCAqIHdoZW4gc2FtcGxpbmcgdGhpcyB0ZXh0dXJlIGR1ZSB0byB0aGUgZXh0cmEgYml0IG9mIHByZWNpc2lvbiBwcm92aWRlZCBmb3JcclxuXHRcdCAqIGdyZWVuIGluIERYVC1jb21wcmVzc2VkIGFuZCB1bmNvbXByZXNzZWQgUkdCIDU2NSBmb3JtYXRzLiBMdW1pbmFuY2Utb25seSBhbmRcclxuXHRcdCAqIGx1bWluYW5jZS9hbHBoYSB0ZXh0dXJlcyB3aWxsIGFsc28gc3RpbGwgd29yayBhcyBleHBlY3RlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYWxwaGFNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGVudmlyb25tZW50IG1hcC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZW52TWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByb3RhdGlvbiBvZiB0aGUgZW52aXJvbm1lbnQgbWFwIGluIHJhZGlhbnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0V1bGVyfVxyXG5cdFx0ICogQGRlZmF1bHQgKDAsMCwwKVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmVudk1hcFJvdGF0aW9uID0gbmV3IEV1bGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3cgdG8gY29tYmluZSB0aGUgcmVzdWx0IG9mIHRoZSBzdXJmYWNlJ3MgY29sb3Igd2l0aCB0aGUgZW52aXJvbm1lbnQgbWFwLCBpZiBhbnkuXHJcblx0XHQgKlxyXG5cdFx0ICogV2hlbiBzZXQgdG8gYE1peE9wZXJhdGlvbmAsIHRoZSB7QGxpbmsgTWVzaEJhc2ljTWF0ZXJpYWwjcmVmbGVjdGl2aXR5fSBpcyB1c2VkIHRvXHJcblx0XHQgKiBibGVuZCBiZXR3ZWVuIHRoZSB0d28gY29sb3JzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoTXVsdGlwbHlPcGVyYXRpb258TWl4T3BlcmF0aW9ufEFkZE9wZXJhdGlvbil9XHJcblx0XHQgKiBAZGVmYXVsdCBNdWx0aXBseU9wZXJhdGlvblxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvbWJpbmUgPSBNdWx0aXBseU9wZXJhdGlvbjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvdyBtdWNoIHRoZSBlbnZpcm9ubWVudCBtYXAgYWZmZWN0cyB0aGUgc3VyZmFjZS5cclxuXHRcdCAqIFRoZSB2YWxpZCByYW5nZSBpcyBiZXR3ZWVuIGAwYCAobm8gcmVmbGVjdGlvbnMpIGFuZCBgMWAgKGZ1bGwgcmVmbGVjdGlvbnMpLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVmbGVjdGl2aXR5ID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBpbmRleCBvZiByZWZyYWN0aW9uIChJT1IpIG9mIGFpciAoYXBwcm94aW1hdGVseSAxKSBkaXZpZGVkIGJ5IHRoZVxyXG5cdFx0ICogaW5kZXggb2YgcmVmcmFjdGlvbiBvZiB0aGUgbWF0ZXJpYWwuIEl0IGlzIHVzZWQgd2l0aCBlbnZpcm9ubWVudCBtYXBwaW5nXHJcblx0XHQgKiBtb2RlcyB7QGxpbmsgQ3ViZVJlZnJhY3Rpb25NYXBwaW5nfSBhbmQge0BsaW5rIEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nfS5cclxuXHRcdCAqIFRoZSByZWZyYWN0aW9uIHJhdGlvIHNob3VsZCBub3QgZXhjZWVkIGAxYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMC45OFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IDAuOTg7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZW5kZXJzIHRoZSBnZW9tZXRyeSBhcyBhIHdpcmVmcmFtZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMud2lyZWZyYW1lID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDb250cm9scyB0aGUgdGhpY2tuZXNzIG9mIHRoZSB3aXJlZnJhbWUuXHJcblx0XHQgKlxyXG5cdFx0ICogQ2FuIG9ubHkgYmUgdXNlZCB3aXRoIHtAbGluayBTVkdSZW5kZXJlcn0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyBhcHBlYXJhbmNlIG9mIHdpcmVmcmFtZSBlbmRzLlxyXG5cdFx0ICpcclxuXHRcdCAqIENhbiBvbmx5IGJlIHVzZWQgd2l0aCB7QGxpbmsgU1ZHUmVuZGVyZXJ9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoJ3JvdW5kJ3wnYmV2ZWwnfCdtaXRlcicpfVxyXG5cdFx0ICogQGRlZmF1bHQgJ3JvdW5kJ1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSAncm91bmQnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyBhcHBlYXJhbmNlIG9mIHdpcmVmcmFtZSBqb2ludHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQ2FuIG9ubHkgYmUgdXNlZCB3aXRoIHtAbGluayBTVkdSZW5kZXJlcn0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeygncm91bmQnfCdiZXZlbCd8J21pdGVyJyl9XHJcblx0XHQgKiBAZGVmYXVsdCAncm91bmQnXHJcblx0XHQgKi9cclxuXHRcdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSAncm91bmQnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgbWF0ZXJpYWwgaXMgcmVuZGVyZWQgd2l0aCBmbGF0IHNoYWRpbmcgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5mbGF0U2hhZGluZyA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgbWF0ZXJpYWwgaXMgYWZmZWN0ZWQgYnkgZm9nIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5mb2cgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XHJcblxyXG5cdFx0dGhpcy5tYXAgPSBzb3VyY2UubWFwO1xyXG5cclxuXHRcdHRoaXMubGlnaHRNYXAgPSBzb3VyY2UubGlnaHRNYXA7XHJcblx0XHR0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gc291cmNlLmxpZ2h0TWFwSW50ZW5zaXR5O1xyXG5cclxuXHRcdHRoaXMuYW9NYXAgPSBzb3VyY2UuYW9NYXA7XHJcblx0XHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gc291cmNlLmFvTWFwSW50ZW5zaXR5O1xyXG5cclxuXHRcdHRoaXMuZW1pc3NpdmUuY29weSggc291cmNlLmVtaXNzaXZlICk7XHJcblx0XHR0aGlzLmVtaXNzaXZlTWFwID0gc291cmNlLmVtaXNzaXZlTWFwO1xyXG5cdFx0dGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IHNvdXJjZS5lbWlzc2l2ZUludGVuc2l0eTtcclxuXHJcblx0XHR0aGlzLmJ1bXBNYXAgPSBzb3VyY2UuYnVtcE1hcDtcclxuXHRcdHRoaXMuYnVtcFNjYWxlID0gc291cmNlLmJ1bXBTY2FsZTtcclxuXHJcblx0XHR0aGlzLm5vcm1hbE1hcCA9IHNvdXJjZS5ub3JtYWxNYXA7XHJcblx0XHR0aGlzLm5vcm1hbE1hcFR5cGUgPSBzb3VyY2Uubm9ybWFsTWFwVHlwZTtcclxuXHRcdHRoaXMubm9ybWFsU2NhbGUuY29weSggc291cmNlLm5vcm1hbFNjYWxlICk7XHJcblxyXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBzb3VyY2UuZGlzcGxhY2VtZW50TWFwO1xyXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHNvdXJjZS5kaXNwbGFjZW1lbnRTY2FsZTtcclxuXHRcdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IHNvdXJjZS5kaXNwbGFjZW1lbnRCaWFzO1xyXG5cclxuXHRcdHRoaXMuc3BlY3VsYXJNYXAgPSBzb3VyY2Uuc3BlY3VsYXJNYXA7XHJcblxyXG5cdFx0dGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDtcclxuXHJcblx0XHR0aGlzLmVudk1hcCA9IHNvdXJjZS5lbnZNYXA7XHJcblx0XHR0aGlzLmVudk1hcFJvdGF0aW9uLmNvcHkoIHNvdXJjZS5lbnZNYXBSb3RhdGlvbiApO1xyXG5cdFx0dGhpcy5jb21iaW5lID0gc291cmNlLmNvbWJpbmU7XHJcblx0XHR0aGlzLnJlZmxlY3Rpdml0eSA9IHNvdXJjZS5yZWZsZWN0aXZpdHk7XHJcblx0XHR0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IHNvdXJjZS5yZWZyYWN0aW9uUmF0aW87XHJcblxyXG5cdFx0dGhpcy53aXJlZnJhbWUgPSBzb3VyY2Uud2lyZWZyYW1lO1xyXG5cdFx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoO1xyXG5cdFx0dGhpcy53aXJlZnJhbWVMaW5lY2FwID0gc291cmNlLndpcmVmcmFtZUxpbmVjYXA7XHJcblx0XHR0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gc291cmNlLndpcmVmcmFtZUxpbmVqb2luO1xyXG5cclxuXHRcdHRoaXMuZmxhdFNoYWRpbmcgPSBzb3VyY2UuZmxhdFNoYWRpbmc7XHJcblxyXG5cdFx0dGhpcy5mb2cgPSBzb3VyY2UuZm9nO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBNZXNoTGFtYmVydE1hdGVyaWFsIH07XHJcbiIsImltcG9ydCB7IE1hdGVyaWFsIH0gZnJvbSAnLi9NYXRlcmlhbC5qcyc7XHJcbmltcG9ydCB7IEJhc2ljRGVwdGhQYWNraW5nIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIG1hdGVyaWFsIGZvciBkcmF3aW5nIGdlb21ldHJ5IGJ5IGRlcHRoLiBEZXB0aCBpcyBiYXNlZCBvZmYgb2YgdGhlIGNhbWVyYVxyXG4gKiBuZWFyIGFuZCBmYXIgcGxhbmUuIFdoaXRlIGlzIG5lYXJlc3QsIGJsYWNrIGlzIGZhcnRoZXN0LlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTWF0ZXJpYWxcclxuICovXHJcbmNsYXNzIE1lc2hEZXB0aE1hdGVyaWFsIGV4dGVuZHMgTWF0ZXJpYWwge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG1lc2ggZGVwdGggbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtZXRlcnNdIC0gQW4gb2JqZWN0IHdpdGggb25lIG9yIG1vcmUgcHJvcGVydGllc1xyXG5cdCAqIGRlZmluaW5nIHRoZSBtYXRlcmlhbCdzIGFwcGVhcmFuY2UuIEFueSBwcm9wZXJ0eSBvZiB0aGUgbWF0ZXJpYWxcclxuXHQgKiAoaW5jbHVkaW5nIGFueSBwcm9wZXJ0eSBmcm9tIGluaGVyaXRlZCBtYXRlcmlhbHMpIGNhbiBiZSBwYXNzZWRcclxuXHQgKiBpbiBoZXJlLiBDb2xvciB2YWx1ZXMgY2FuIGJlIHBhc3NlZCBhbnkgdHlwZSBvZiB2YWx1ZSBhY2NlcHRlZFxyXG5cdCAqIGJ5IHtAbGluayBDb2xvciNzZXR9LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwYXJhbWV0ZXJzICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzTWVzaERlcHRoTWF0ZXJpYWwgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdNZXNoRGVwdGhNYXRlcmlhbCc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUeXBlIGZvciBkZXB0aCBwYWNraW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoQmFzaWNEZXB0aFBhY2tpbmd8UkdCQURlcHRoUGFja2luZ3xSR0JEZXB0aFBhY2tpbmd8UkdEZXB0aFBhY2tpbmcpfVxyXG5cdFx0ICogQGRlZmF1bHQgQmFzaWNEZXB0aFBhY2tpbmdcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kZXB0aFBhY2tpbmcgPSBCYXNpY0RlcHRoUGFja2luZztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjb2xvciBtYXAuIE1heSBvcHRpb25hbGx5IGluY2x1ZGUgYW4gYWxwaGEgY2hhbm5lbCwgdHlwaWNhbGx5IGNvbWJpbmVkXHJcblx0XHQgKiB3aXRoIHtAbGluayBNYXRlcmlhbCN0cmFuc3BhcmVudH0gb3Ige0BsaW5rIE1hdGVyaWFsI2FscGhhVGVzdH0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYWxwaGEgbWFwIGlzIGEgZ3JheXNjYWxlIHRleHR1cmUgdGhhdCBjb250cm9scyB0aGUgb3BhY2l0eSBhY3Jvc3MgdGhlXHJcblx0XHQgKiBzdXJmYWNlIChibGFjazogZnVsbHkgdHJhbnNwYXJlbnQ7IHdoaXRlOiBmdWxseSBvcGFxdWUpLlxyXG5cdFx0ICpcclxuXHRcdCAqIE9ubHkgdGhlIGNvbG9yIG9mIHRoZSB0ZXh0dXJlIGlzIHVzZWQsIGlnbm9yaW5nIHRoZSBhbHBoYSBjaGFubmVsIGlmIG9uZVxyXG5cdFx0ICogZXhpc3RzLiBGb3IgUkdCIGFuZCBSR0JBIHRleHR1cmVzLCB0aGUgcmVuZGVyZXIgd2lsbCB1c2UgdGhlIGdyZWVuIGNoYW5uZWxcclxuXHRcdCAqIHdoZW4gc2FtcGxpbmcgdGhpcyB0ZXh0dXJlIGR1ZSB0byB0aGUgZXh0cmEgYml0IG9mIHByZWNpc2lvbiBwcm92aWRlZCBmb3JcclxuXHRcdCAqIGdyZWVuIGluIERYVC1jb21wcmVzc2VkIGFuZCB1bmNvbXByZXNzZWQgUkdCIDU2NSBmb3JtYXRzLiBMdW1pbmFuY2Utb25seSBhbmRcclxuXHRcdCAqIGx1bWluYW5jZS9hbHBoYSB0ZXh0dXJlcyB3aWxsIGFsc28gc3RpbGwgd29yayBhcyBleHBlY3RlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYWxwaGFNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGRpc3BsYWNlbWVudCBtYXAgYWZmZWN0cyB0aGUgcG9zaXRpb24gb2YgdGhlIG1lc2gncyB2ZXJ0aWNlcy4gVW5saWtlXHJcblx0XHQgKiBvdGhlciBtYXBzIHdoaWNoIG9ubHkgYWZmZWN0IHRoZSBsaWdodCBhbmQgc2hhZGUgb2YgdGhlIG1hdGVyaWFsIHRoZVxyXG5cdFx0ICogZGlzcGxhY2VkIHZlcnRpY2VzIGNhbiBjYXN0IHNoYWRvd3MsIGJsb2NrIG90aGVyIG9iamVjdHMsIGFuZCBvdGhlcndpc2VcclxuXHRcdCAqIGFjdCBhcyByZWFsIGdlb21ldHJ5LiBUaGUgZGlzcGxhY2VtZW50IHRleHR1cmUgaXMgYW4gaW1hZ2Ugd2hlcmUgdGhlIHZhbHVlXHJcblx0XHQgKiBvZiBlYWNoIHBpeGVsICh3aGl0ZSBiZWluZyB0aGUgaGlnaGVzdCkgaXMgbWFwcGVkIGFnYWluc3QsIGFuZFxyXG5cdFx0ICogcmVwb3NpdGlvbnMsIHRoZSB2ZXJ0aWNlcyBvZiB0aGUgbWVzaC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvdyBtdWNoIHRoZSBkaXNwbGFjZW1lbnQgbWFwIGFmZmVjdHMgdGhlIG1lc2ggKHdoZXJlIGJsYWNrIGlzIG5vXHJcblx0XHQgKiBkaXNwbGFjZW1lbnQsIGFuZCB3aGl0ZSBpcyBtYXhpbXVtIGRpc3BsYWNlbWVudCkuIFdpdGhvdXQgYSBkaXNwbGFjZW1lbnRcclxuXHRcdCAqIG1hcCBzZXQsIHRoaXMgdmFsdWUgaXMgbm90IGFwcGxpZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgb2Zmc2V0IG9mIHRoZSBkaXNwbGFjZW1lbnQgbWFwJ3MgdmFsdWVzIG9uIHRoZSBtZXNoJ3MgdmVydGljZXMuXHJcblx0XHQgKiBUaGUgYmlhcyBpcyBhZGRlZCB0byB0aGUgc2NhbGVkIHNhbXBsZSBvZiB0aGUgZGlzcGxhY2VtZW50IG1hcC5cclxuXHRcdCAqIFdpdGhvdXQgYSBkaXNwbGFjZW1lbnQgbWFwIHNldCwgdGhpcyB2YWx1ZSBpcyBub3QgYXBwbGllZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVuZGVycyB0aGUgZ2VvbWV0cnkgYXMgYSB3aXJlZnJhbWUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLndpcmVmcmFtZSA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQ29udHJvbHMgdGhlIHRoaWNrbmVzcyBvZiB0aGUgd2lyZWZyYW1lLlxyXG5cdFx0ICpcclxuXHRcdCAqIFdlYkdMIGFuZCBXZWJHUFUgaWdub3JlIHRoaXMgcHJvcGVydHkgYW5kIGFsd2F5cyByZW5kZXJcclxuXHRcdCAqIDEgcGl4ZWwgd2lkZSBsaW5lcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDE7XHJcblxyXG5cdFx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy5kZXB0aFBhY2tpbmcgPSBzb3VyY2UuZGVwdGhQYWNraW5nO1xyXG5cclxuXHRcdHRoaXMubWFwID0gc291cmNlLm1hcDtcclxuXHJcblx0XHR0aGlzLmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwO1xyXG5cclxuXHRcdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gc291cmNlLmRpc3BsYWNlbWVudE1hcDtcclxuXHRcdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSBzb3VyY2UuZGlzcGxhY2VtZW50U2NhbGU7XHJcblx0XHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSBzb3VyY2UuZGlzcGxhY2VtZW50QmlhcztcclxuXHJcblx0XHR0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7XHJcblx0XHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IE1lc2hEZXB0aE1hdGVyaWFsIH07XHJcbiIsImltcG9ydCB7IE1hdGVyaWFsIH0gZnJvbSAnLi9NYXRlcmlhbC5qcyc7XHJcblxyXG4vKipcclxuICogQSBtYXRlcmlhbCB1c2VkIGludGVybmFsbHkgZm9yIGltcGxlbWVudGluZyBzaGFkb3cgbWFwcGluZyB3aXRoXHJcbiAqIHBvaW50IGxpZ2h0cy5cclxuICpcclxuICogQ2FuIGFsc28gYmUgdXNlZCB0byBjdXN0b21pemUgdGhlIHNoYWRvdyBjYXN0aW5nIG9mIGFuIG9iamVjdCBieSBhc3NpZ25pbmdcclxuICogYW4gaW5zdGFuY2Ugb2YgYE1lc2hEaXN0YW5jZU1hdGVyaWFsYCB0byB7QGxpbmsgT2JqZWN0M0QjY3VzdG9tRGlzdGFuY2VNYXRlcmlhbH0uXHJcbiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgZGVtb25zdHJhdGVzIHRoaXMgYXBwcm9hY2ggaW4gb3JkZXIgdG8gZW5zdXJlXHJcbiAqIHRyYW5zcGFyZW50IHBhcnRzIG9mIG9iamVjdHMgZG8gbm8gY2FzdCBzaGFkb3dzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTWF0ZXJpYWxcclxuICovXHJcbmNsYXNzIE1lc2hEaXN0YW5jZU1hdGVyaWFsIGV4dGVuZHMgTWF0ZXJpYWwge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG1lc2ggZGlzdGFuY2UgbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtZXRlcnNdIC0gQW4gb2JqZWN0IHdpdGggb25lIG9yIG1vcmUgcHJvcGVydGllc1xyXG5cdCAqIGRlZmluaW5nIHRoZSBtYXRlcmlhbCdzIGFwcGVhcmFuY2UuIEFueSBwcm9wZXJ0eSBvZiB0aGUgbWF0ZXJpYWxcclxuXHQgKiAoaW5jbHVkaW5nIGFueSBwcm9wZXJ0eSBmcm9tIGluaGVyaXRlZCBtYXRlcmlhbHMpIGNhbiBiZSBwYXNzZWRcclxuXHQgKiBpbiBoZXJlLiBDb2xvciB2YWx1ZXMgY2FuIGJlIHBhc3NlZCBhbnkgdHlwZSBvZiB2YWx1ZSBhY2NlcHRlZFxyXG5cdCAqIGJ5IHtAbGluayBDb2xvciNzZXR9LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwYXJhbWV0ZXJzICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzTWVzaERpc3RhbmNlTWF0ZXJpYWwgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdNZXNoRGlzdGFuY2VNYXRlcmlhbCc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY29sb3IgbWFwLiBNYXkgb3B0aW9uYWxseSBpbmNsdWRlIGFuIGFscGhhIGNoYW5uZWwsIHR5cGljYWxseSBjb21iaW5lZFxyXG5cdFx0ICogd2l0aCB7QGxpbmsgTWF0ZXJpYWwjdHJhbnNwYXJlbnR9IG9yIHtAbGluayBNYXRlcmlhbCNhbHBoYVRlc3R9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGFscGhhIG1hcCBpcyBhIGdyYXlzY2FsZSB0ZXh0dXJlIHRoYXQgY29udHJvbHMgdGhlIG9wYWNpdHkgYWNyb3NzIHRoZVxyXG5cdFx0ICogc3VyZmFjZSAoYmxhY2s6IGZ1bGx5IHRyYW5zcGFyZW50OyB3aGl0ZTogZnVsbHkgb3BhcXVlKS5cclxuXHRcdCAqXHJcblx0XHQgKiBPbmx5IHRoZSBjb2xvciBvZiB0aGUgdGV4dHVyZSBpcyB1c2VkLCBpZ25vcmluZyB0aGUgYWxwaGEgY2hhbm5lbCBpZiBvbmVcclxuXHRcdCAqIGV4aXN0cy4gRm9yIFJHQiBhbmQgUkdCQSB0ZXh0dXJlcywgdGhlIHJlbmRlcmVyIHdpbGwgdXNlIHRoZSBncmVlbiBjaGFubmVsXHJcblx0XHQgKiB3aGVuIHNhbXBsaW5nIHRoaXMgdGV4dHVyZSBkdWUgdG8gdGhlIGV4dHJhIGJpdCBvZiBwcmVjaXNpb24gcHJvdmlkZWQgZm9yXHJcblx0XHQgKiBncmVlbiBpbiBEWFQtY29tcHJlc3NlZCBhbmQgdW5jb21wcmVzc2VkIFJHQiA1NjUgZm9ybWF0cy4gTHVtaW5hbmNlLW9ubHkgYW5kXHJcblx0XHQgKiBsdW1pbmFuY2UvYWxwaGEgdGV4dHVyZXMgd2lsbCBhbHNvIHN0aWxsIHdvcmsgYXMgZXhwZWN0ZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFscGhhTWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBkaXNwbGFjZW1lbnQgbWFwIGFmZmVjdHMgdGhlIHBvc2l0aW9uIG9mIHRoZSBtZXNoJ3MgdmVydGljZXMuIFVubGlrZVxyXG5cdFx0ICogb3RoZXIgbWFwcyB3aGljaCBvbmx5IGFmZmVjdCB0aGUgbGlnaHQgYW5kIHNoYWRlIG9mIHRoZSBtYXRlcmlhbCB0aGVcclxuXHRcdCAqIGRpc3BsYWNlZCB2ZXJ0aWNlcyBjYW4gY2FzdCBzaGFkb3dzLCBibG9jayBvdGhlciBvYmplY3RzLCBhbmQgb3RoZXJ3aXNlXHJcblx0XHQgKiBhY3QgYXMgcmVhbCBnZW9tZXRyeS4gVGhlIGRpc3BsYWNlbWVudCB0ZXh0dXJlIGlzIGFuIGltYWdlIHdoZXJlIHRoZSB2YWx1ZVxyXG5cdFx0ICogb2YgZWFjaCBwaXhlbCAod2hpdGUgYmVpbmcgdGhlIGhpZ2hlc3QpIGlzIG1hcHBlZCBhZ2FpbnN0LCBhbmRcclxuXHRcdCAqIHJlcG9zaXRpb25zLCB0aGUgdmVydGljZXMgb2YgdGhlIG1lc2guXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3cgbXVjaCB0aGUgZGlzcGxhY2VtZW50IG1hcCBhZmZlY3RzIHRoZSBtZXNoICh3aGVyZSBibGFjayBpcyBub1xyXG5cdFx0ICogZGlzcGxhY2VtZW50LCBhbmQgd2hpdGUgaXMgbWF4aW11bSBkaXNwbGFjZW1lbnQpLiBXaXRob3V0IGEgZGlzcGxhY2VtZW50XHJcblx0XHQgKiBtYXAgc2V0LCB0aGlzIHZhbHVlIGlzIG5vdCBhcHBsaWVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG9mZnNldCBvZiB0aGUgZGlzcGxhY2VtZW50IG1hcCdzIHZhbHVlcyBvbiB0aGUgbWVzaCdzIHZlcnRpY2VzLlxyXG5cdFx0ICogVGhlIGJpYXMgaXMgYWRkZWQgdG8gdGhlIHNjYWxlZCBzYW1wbGUgb2YgdGhlIGRpc3BsYWNlbWVudCBtYXAuXHJcblx0XHQgKiBXaXRob3V0IGEgZGlzcGxhY2VtZW50IG1hcCBzZXQsIHRoaXMgdmFsdWUgaXMgbm90IGFwcGxpZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gMDtcclxuXHJcblx0XHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLm1hcCA9IHNvdXJjZS5tYXA7XHJcblxyXG5cdFx0dGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDtcclxuXHJcblx0XHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IHNvdXJjZS5kaXNwbGFjZW1lbnRNYXA7XHJcblx0XHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gc291cmNlLmRpc3BsYWNlbWVudFNjYWxlO1xyXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gc291cmNlLmRpc3BsYWNlbWVudEJpYXM7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IE1lc2hEaXN0YW5jZU1hdGVyaWFsIH07XHJcbiIsImltcG9ydCB7IFRhbmdlbnRTcGFjZU5vcm1hbE1hcCB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IE1hdGVyaWFsIH0gZnJvbSAnLi9NYXRlcmlhbC5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjIuanMnO1xyXG5pbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uL21hdGgvQ29sb3IuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgbWF0ZXJpYWwgaXMgZGVmaW5lZCBieSBhIE1hdENhcCAob3IgTGl0IFNwaGVyZSkgdGV4dHVyZSwgd2hpY2ggZW5jb2RlcyB0aGVcclxuICogbWF0ZXJpYWwgY29sb3IgYW5kIHNoYWRpbmcuXHJcbiAqXHJcbiAqIGBNZXNoTWF0Y2FwTWF0ZXJpYWxgIGRvZXMgbm90IHJlc3BvbmQgdG8gbGlnaHRzIHNpbmNlIHRoZSBtYXRjYXAgaW1hZ2UgZmlsZSBlbmNvZGVzXHJcbiAqIGJha2VkIGxpZ2h0aW5nLiBJdCB3aWxsIGNhc3QgYSBzaGFkb3cgb250byBhbiBvYmplY3QgdGhhdCByZWNlaXZlcyBzaGFkb3dzXHJcbiAqIChhbmQgc2hhZG93IGNsaXBwaW5nIHdvcmtzKSwgYnV0IGl0IHdpbGwgbm90IHNlbGYtc2hhZG93IG9yIHJlY2VpdmVcclxuICogc2hhZG93cy5cclxuICpcclxuICogQGF1Z21lbnRzIE1hdGVyaWFsXHJcbiAqL1xyXG5jbGFzcyBNZXNoTWF0Y2FwTWF0ZXJpYWwgZXh0ZW5kcyBNYXRlcmlhbCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbWVzaCBtYXRjYXAgbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtZXRlcnNdIC0gQW4gb2JqZWN0IHdpdGggb25lIG9yIG1vcmUgcHJvcGVydGllc1xyXG5cdCAqIGRlZmluaW5nIHRoZSBtYXRlcmlhbCdzIGFwcGVhcmFuY2UuIEFueSBwcm9wZXJ0eSBvZiB0aGUgbWF0ZXJpYWxcclxuXHQgKiAoaW5jbHVkaW5nIGFueSBwcm9wZXJ0eSBmcm9tIGluaGVyaXRlZCBtYXRlcmlhbHMpIGNhbiBiZSBwYXNzZWRcclxuXHQgKiBpbiBoZXJlLiBDb2xvciB2YWx1ZXMgY2FuIGJlIHBhc3NlZCBhbnkgdHlwZSBvZiB2YWx1ZSBhY2NlcHRlZFxyXG5cdCAqIGJ5IHtAbGluayBDb2xvciNzZXR9LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwYXJhbWV0ZXJzICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzTWVzaE1hdGNhcE1hdGVyaWFsID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLmRlZmluZXMgPSB7ICdNQVRDQVAnOiAnJyB9O1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdNZXNoTWF0Y2FwTWF0ZXJpYWwnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQ29sb3Igb2YgdGhlIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtDb2xvcn1cclxuXHRcdCAqIEBkZWZhdWx0ICgxLDEsMSlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTsgLy8gZGlmZnVzZVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG1hdGNhcCBtYXAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1hdGNhcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY29sb3IgbWFwLiBNYXkgb3B0aW9uYWxseSBpbmNsdWRlIGFuIGFscGhhIGNoYW5uZWwsIHR5cGljYWxseSBjb21iaW5lZFxyXG5cdFx0ICogd2l0aCB7QGxpbmsgTWF0ZXJpYWwjdHJhbnNwYXJlbnR9IG9yIHtAbGluayBNYXRlcmlhbCNhbHBoYVRlc3R9LiBUaGUgdGV4dHVyZSBtYXBcclxuXHRcdCAqIGNvbG9yIGlzIG1vZHVsYXRlZCBieSB0aGUgZGlmZnVzZSBgY29sb3JgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHRleHR1cmUgdG8gY3JlYXRlIGEgYnVtcCBtYXAuIFRoZSBibGFjayBhbmQgd2hpdGUgdmFsdWVzIG1hcCB0byB0aGVcclxuXHRcdCAqIHBlcmNlaXZlZCBkZXB0aCBpbiByZWxhdGlvbiB0byB0aGUgbGlnaHRzLiBCdW1wIGRvZXNuJ3QgYWN0dWFsbHkgYWZmZWN0XHJcblx0XHQgKiB0aGUgZ2VvbWV0cnkgb2YgdGhlIG9iamVjdCwgb25seSB0aGUgbGlnaHRpbmcuIElmIGEgbm9ybWFsIG1hcCBpcyBkZWZpbmVkXHJcblx0XHQgKiB0aGlzIHdpbGwgYmUgaWdub3JlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYnVtcE1hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3cgbXVjaCB0aGUgYnVtcCBtYXAgYWZmZWN0cyB0aGUgbWF0ZXJpYWwuIFR5cGljYWwgcmFuZ2UgaXMgYFswLDFdYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJ1bXBTY2FsZSA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdGV4dHVyZSB0byBjcmVhdGUgYSBub3JtYWwgbWFwLiBUaGUgUkdCIHZhbHVlcyBhZmZlY3QgdGhlIHN1cmZhY2VcclxuXHRcdCAqIG5vcm1hbCBmb3IgZWFjaCBwaXhlbCBmcmFnbWVudCBhbmQgY2hhbmdlIHRoZSB3YXkgdGhlIGNvbG9yIGlzIGxpdC4gTm9ybWFsXHJcblx0XHQgKiBtYXBzIGRvIG5vdCBjaGFuZ2UgdGhlIGFjdHVhbCBzaGFwZSBvZiB0aGUgc3VyZmFjZSwgb25seSB0aGUgbGlnaHRpbmcuIEluXHJcblx0XHQgKiBjYXNlIHRoZSBtYXRlcmlhbCBoYXMgYSBub3JtYWwgbWFwIGF1dGhvcmVkIHVzaW5nIHRoZSBsZWZ0IGhhbmRlZFxyXG5cdFx0ICogY29udmVudGlvbiwgdGhlIGB5YCBjb21wb25lbnQgb2YgYG5vcm1hbFNjYWxlYCBzaG91bGQgYmUgbmVnYXRlZCB0byBjb21wZW5zYXRlXHJcblx0XHQgKiBmb3IgdGhlIGRpZmZlcmVudCBoYW5kZWRuZXNzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub3JtYWxNYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHR5cGUgb2Ygbm9ybWFsIG1hcC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KFRhbmdlbnRTcGFjZU5vcm1hbE1hcHxPYmplY3RTcGFjZU5vcm1hbE1hcCl9XHJcblx0XHQgKiBAZGVmYXVsdCBUYW5nZW50U3BhY2VOb3JtYWxNYXBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub3JtYWxNYXBUeXBlID0gVGFuZ2VudFNwYWNlTm9ybWFsTWFwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG93IG11Y2ggdGhlIG5vcm1hbCBtYXAgYWZmZWN0cyB0aGUgbWF0ZXJpYWwuIFR5cGljYWwgdmFsdWUgcmFuZ2UgaXMgYFswLDFdYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yMn1cclxuXHRcdCAqIEBkZWZhdWx0ICgxLDEpXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMiggMSwgMSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGRpc3BsYWNlbWVudCBtYXAgYWZmZWN0cyB0aGUgcG9zaXRpb24gb2YgdGhlIG1lc2gncyB2ZXJ0aWNlcy4gVW5saWtlXHJcblx0XHQgKiBvdGhlciBtYXBzIHdoaWNoIG9ubHkgYWZmZWN0IHRoZSBsaWdodCBhbmQgc2hhZGUgb2YgdGhlIG1hdGVyaWFsIHRoZVxyXG5cdFx0ICogZGlzcGxhY2VkIHZlcnRpY2VzIGNhbiBjYXN0IHNoYWRvd3MsIGJsb2NrIG90aGVyIG9iamVjdHMsIGFuZCBvdGhlcndpc2VcclxuXHRcdCAqIGFjdCBhcyByZWFsIGdlb21ldHJ5LiBUaGUgZGlzcGxhY2VtZW50IHRleHR1cmUgaXMgYW4gaW1hZ2Ugd2hlcmUgdGhlIHZhbHVlXHJcblx0XHQgKiBvZiBlYWNoIHBpeGVsICh3aGl0ZSBiZWluZyB0aGUgaGlnaGVzdCkgaXMgbWFwcGVkIGFnYWluc3QsIGFuZFxyXG5cdFx0ICogcmVwb3NpdGlvbnMsIHRoZSB2ZXJ0aWNlcyBvZiB0aGUgbWVzaC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1RleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvdyBtdWNoIHRoZSBkaXNwbGFjZW1lbnQgbWFwIGFmZmVjdHMgdGhlIG1lc2ggKHdoZXJlIGJsYWNrIGlzIG5vXHJcblx0XHQgKiBkaXNwbGFjZW1lbnQsIGFuZCB3aGl0ZSBpcyBtYXhpbXVtIGRpc3BsYWNlbWVudCkuIFdpdGhvdXQgYSBkaXNwbGFjZW1lbnRcclxuXHRcdCAqIG1hcCBzZXQsIHRoaXMgdmFsdWUgaXMgbm90IGFwcGxpZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgb2Zmc2V0IG9mIHRoZSBkaXNwbGFjZW1lbnQgbWFwJ3MgdmFsdWVzIG9uIHRoZSBtZXNoJ3MgdmVydGljZXMuXHJcblx0XHQgKiBUaGUgYmlhcyBpcyBhZGRlZCB0byB0aGUgc2NhbGVkIHNhbXBsZSBvZiB0aGUgZGlzcGxhY2VtZW50IG1hcC5cclxuXHRcdCAqIFdpdGhvdXQgYSBkaXNwbGFjZW1lbnQgbWFwIHNldCwgdGhpcyB2YWx1ZSBpcyBub3QgYXBwbGllZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGFscGhhIG1hcCBpcyBhIGdyYXlzY2FsZSB0ZXh0dXJlIHRoYXQgY29udHJvbHMgdGhlIG9wYWNpdHkgYWNyb3NzIHRoZVxyXG5cdFx0ICogc3VyZmFjZSAoYmxhY2s6IGZ1bGx5IHRyYW5zcGFyZW50OyB3aGl0ZTogZnVsbHkgb3BhcXVlKS5cclxuXHRcdCAqXHJcblx0XHQgKiBPbmx5IHRoZSBjb2xvciBvZiB0aGUgdGV4dHVyZSBpcyB1c2VkLCBpZ25vcmluZyB0aGUgYWxwaGEgY2hhbm5lbCBpZiBvbmVcclxuXHRcdCAqIGV4aXN0cy4gRm9yIFJHQiBhbmQgUkdCQSB0ZXh0dXJlcywgdGhlIHJlbmRlcmVyIHdpbGwgdXNlIHRoZSBncmVlbiBjaGFubmVsXHJcblx0XHQgKiB3aGVuIHNhbXBsaW5nIHRoaXMgdGV4dHVyZSBkdWUgdG8gdGhlIGV4dHJhIGJpdCBvZiBwcmVjaXNpb24gcHJvdmlkZWQgZm9yXHJcblx0XHQgKiBncmVlbiBpbiBEWFQtY29tcHJlc3NlZCBhbmQgdW5jb21wcmVzc2VkIFJHQiA1NjUgZm9ybWF0cy4gTHVtaW5hbmNlLW9ubHkgYW5kXHJcblx0XHQgKiBsdW1pbmFuY2UvYWxwaGEgdGV4dHVyZXMgd2lsbCBhbHNvIHN0aWxsIHdvcmsgYXMgZXhwZWN0ZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFscGhhTWFwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIG1hdGVyaWFsIGlzIHJlbmRlcmVkIHdpdGggZmxhdCBzaGFkaW5nIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZmxhdFNoYWRpbmcgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIG1hdGVyaWFsIGlzIGFmZmVjdGVkIGJ5IGZvZyBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZm9nID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xyXG5cclxuXHR9XHJcblxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy5kZWZpbmVzID0geyAnTUFUQ0FQJzogJycgfTtcclxuXHJcblx0XHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xyXG5cclxuXHRcdHRoaXMubWF0Y2FwID0gc291cmNlLm1hdGNhcDtcclxuXHJcblx0XHR0aGlzLm1hcCA9IHNvdXJjZS5tYXA7XHJcblxyXG5cdFx0dGhpcy5idW1wTWFwID0gc291cmNlLmJ1bXBNYXA7XHJcblx0XHR0aGlzLmJ1bXBTY2FsZSA9IHNvdXJjZS5idW1wU2NhbGU7XHJcblxyXG5cdFx0dGhpcy5ub3JtYWxNYXAgPSBzb3VyY2Uubm9ybWFsTWFwO1xyXG5cdFx0dGhpcy5ub3JtYWxNYXBUeXBlID0gc291cmNlLm5vcm1hbE1hcFR5cGU7XHJcblx0XHR0aGlzLm5vcm1hbFNjYWxlLmNvcHkoIHNvdXJjZS5ub3JtYWxTY2FsZSApO1xyXG5cclxuXHRcdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gc291cmNlLmRpc3BsYWNlbWVudE1hcDtcclxuXHRcdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSBzb3VyY2UuZGlzcGxhY2VtZW50U2NhbGU7XHJcblx0XHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSBzb3VyY2UuZGlzcGxhY2VtZW50QmlhcztcclxuXHJcblx0XHR0aGlzLmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwO1xyXG5cclxuXHRcdHRoaXMuZmxhdFNoYWRpbmcgPSBzb3VyY2UuZmxhdFNoYWRpbmc7XHJcblxyXG5cdFx0dGhpcy5mb2cgPSBzb3VyY2UuZm9nO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBNZXNoTWF0Y2FwTWF0ZXJpYWwgfTtcclxuIiwiaW1wb3J0IHsgTGluZUJhc2ljTWF0ZXJpYWwgfSBmcm9tICcuL0xpbmVCYXNpY01hdGVyaWFsLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIG1hdGVyaWFsIGZvciByZW5kZXJpbmcgbGluZSBwcmltaXRpdmVzLlxyXG4gKlxyXG4gKiBNYXRlcmlhbHMgZGVmaW5lIHRoZSBhcHBlYXJhbmNlIG9mIHJlbmRlcmFibGUgM0Qgb2JqZWN0cy5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuTGluZURhc2hlZE1hdGVyaWFsKCB7XHJcbiAqIFx0Y29sb3I6IDB4ZmZmZmZmLFxyXG4gKiBcdHNjYWxlOiAxLFxyXG4gKiBcdGRhc2hTaXplOiAzLFxyXG4gKiBcdGdhcFNpemU6IDEsXHJcbiAqIH0gKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBMaW5lQmFzaWNNYXRlcmlhbFxyXG4gKi9cclxuY2xhc3MgTGluZURhc2hlZE1hdGVyaWFsIGV4dGVuZHMgTGluZUJhc2ljTWF0ZXJpYWwge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGxpbmUgZGFzaGVkIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbWV0ZXJzXSAtIEFuIG9iamVjdCB3aXRoIG9uZSBvciBtb3JlIHByb3BlcnRpZXNcclxuXHQgKiBkZWZpbmluZyB0aGUgbWF0ZXJpYWwncyBhcHBlYXJhbmNlLiBBbnkgcHJvcGVydHkgb2YgdGhlIG1hdGVyaWFsXHJcblx0ICogKGluY2x1ZGluZyBhbnkgcHJvcGVydHkgZnJvbSBpbmhlcml0ZWQgbWF0ZXJpYWxzKSBjYW4gYmUgcGFzc2VkXHJcblx0ICogaW4gaGVyZS4gQ29sb3IgdmFsdWVzIGNhbiBiZSBwYXNzZWQgYW55IHR5cGUgb2YgdmFsdWUgYWNjZXB0ZWRcclxuXHQgKiBieSB7QGxpbmsgQ29sb3Ijc2V0fS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVycyApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0xpbmVEYXNoZWRNYXRlcmlhbCA9IHRydWU7XHJcblx0XHR0aGlzLnR5cGUgPSAnTGluZURhc2hlZE1hdGVyaWFsJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBzY2FsZSBvZiB0aGUgZGFzaGVkIHBhcnQgb2YgYSBsaW5lLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2NhbGUgPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHNpemUgb2YgdGhlIGRhc2guIFRoaXMgaXMgYm90aCB0aGUgZ2FwIHdpdGggdGhlIHN0cm9rZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgM1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRhc2hTaXplID0gMztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBzaXplIG9mIHRoZSBnYXAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nYXBTaXplID0gMTtcclxuXHJcblx0XHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLnNjYWxlID0gc291cmNlLnNjYWxlO1xyXG5cdFx0dGhpcy5kYXNoU2l6ZSA9IHNvdXJjZS5kYXNoU2l6ZTtcclxuXHRcdHRoaXMuZ2FwU2l6ZSA9IHNvdXJjZS5nYXBTaXplO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBMaW5lRGFzaGVkTWF0ZXJpYWwgfTtcclxuIiwiaW1wb3J0IHsgUXVhdGVybmlvbiB9IGZyb20gJy4uL21hdGgvUXVhdGVybmlvbi5qcyc7XHJcbmltcG9ydCB7IEFkZGl0aXZlQW5pbWF0aW9uQmxlbmRNb2RlIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyBhbiBhcnJheSB0byBhIHNwZWNpZmljIHR5cGUuXHJcbiAqXHJcbiAqIEBwYXJhbSB7VHlwZWRBcnJheXxBcnJheX0gYXJyYXkgLSBUaGUgYXJyYXkgdG8gY29udmVydC5cclxuICogQHBhcmFtIHtUeXBlZEFycmF5LmNvbnN0cnVjdG9yfSB0eXBlIC0gVGhlIGNvbnN0cnVjdG9yIG9mIGEgdHlwZWQgYXJyYXkgdGhhdCBkZWZpbmVzIHRoZSBuZXcgdHlwZS5cclxuICogQHJldHVybiB7VHlwZWRBcnJheX0gVGhlIGNvbnZlcnRlZCBhcnJheS5cclxuICovXHJcbmZ1bmN0aW9uIGNvbnZlcnRBcnJheSggYXJyYXksIHR5cGUgKSB7XHJcblxyXG5cdGlmICggISBhcnJheSB8fCBhcnJheS5jb25zdHJ1Y3RvciA9PT0gdHlwZSApIHJldHVybiBhcnJheTtcclxuXHJcblx0aWYgKCB0eXBlb2YgdHlwZS5CWVRFU19QRVJfRUxFTUVOVCA9PT0gJ251bWJlcicgKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyB0eXBlKCBhcnJheSApOyAvLyBjcmVhdGUgdHlwZWQgYXJyYXlcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGFycmF5ICk7IC8vIGNyZWF0ZSBBcnJheVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBnaXZlbiBvYmplY3QgaXMgYSB0eXBlZCBhcnJheS5cclxuICpcclxuICogQHBhcmFtIHthbnl9IG9iamVjdCAtIFRoZSBvYmplY3QgdG8gY2hlY2suXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGdpdmVuIG9iamVjdCBpcyBhIHR5cGVkIGFycmF5LlxyXG4gKi9cclxuZnVuY3Rpb24gaXNUeXBlZEFycmF5KCBvYmplY3QgKSB7XHJcblxyXG5cdHJldHVybiBBcnJheUJ1ZmZlci5pc1ZpZXcoIG9iamVjdCApICYmICEgKCBvYmplY3QgaW5zdGFuY2VvZiBEYXRhVmlldyApO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYW4gYXJyYXkgYnkgd2hpY2ggdGltZXMgYW5kIHZhbHVlcyBjYW4gYmUgc29ydGVkLlxyXG4gKlxyXG4gKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IHRpbWVzIC0gVGhlIGtleWZyYW1lIHRpbWUgdmFsdWVzLlxyXG4gKiBAcmV0dXJuIHtBcnJheTxudW1iZXI+fSBUaGUgYXJyYXkuXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRLZXlmcmFtZU9yZGVyKCB0aW1lcyApIHtcclxuXHJcblx0ZnVuY3Rpb24gY29tcGFyZVRpbWUoIGksIGogKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRpbWVzWyBpIF0gLSB0aW1lc1sgaiBdO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvbnN0IG4gPSB0aW1lcy5sZW5ndGg7XHJcblx0Y29uc3QgcmVzdWx0ID0gbmV3IEFycmF5KCBuICk7XHJcblx0Zm9yICggbGV0IGkgPSAwOyBpICE9PSBuOyArKyBpICkgcmVzdWx0WyBpIF0gPSBpO1xyXG5cclxuXHRyZXN1bHQuc29ydCggY29tcGFyZVRpbWUgKTtcclxuXHJcblx0cmV0dXJuIHJlc3VsdDtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTb3J0cyB0aGUgZ2l2ZW4gYXJyYXkgYnkgdGhlIHByZXZpb3VzbHkgY29tcHV0ZWQgb3JkZXIgdmlhIGBnZXRLZXlmcmFtZU9yZGVyKClgLlxyXG4gKlxyXG4gKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IHZhbHVlcyAtIFRoZSB2YWx1ZXMgdG8gc29ydC5cclxuICogQHBhcmFtIHtudW1iZXJ9IHN0cmlkZSAtIFRoZSBzdHJpZGUuXHJcbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gb3JkZXIgLSBUaGUgc29ydCBvcmRlci5cclxuICogQHJldHVybiB7QXJyYXk8bnVtYmVyPn0gVGhlIHNvcnRlZCB2YWx1ZXMuXHJcbiAqL1xyXG5mdW5jdGlvbiBzb3J0ZWRBcnJheSggdmFsdWVzLCBzdHJpZGUsIG9yZGVyICkge1xyXG5cclxuXHRjb25zdCBuVmFsdWVzID0gdmFsdWVzLmxlbmd0aDtcclxuXHRjb25zdCByZXN1bHQgPSBuZXcgdmFsdWVzLmNvbnN0cnVjdG9yKCBuVmFsdWVzICk7XHJcblxyXG5cdGZvciAoIGxldCBpID0gMCwgZHN0T2Zmc2V0ID0gMDsgZHN0T2Zmc2V0ICE9PSBuVmFsdWVzOyArKyBpICkge1xyXG5cclxuXHRcdGNvbnN0IHNyY09mZnNldCA9IG9yZGVyWyBpIF0gKiBzdHJpZGU7XHJcblxyXG5cdFx0Zm9yICggbGV0IGogPSAwOyBqICE9PSBzdHJpZGU7ICsrIGogKSB7XHJcblxyXG5cdFx0XHRyZXN1bHRbIGRzdE9mZnNldCArKyBdID0gdmFsdWVzWyBzcmNPZmZzZXQgKyBqIF07XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiByZXN1bHQ7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogVXNlZCBmb3IgcGFyc2luZyBBT1Mga2V5ZnJhbWUgZm9ybWF0cy5cclxuICpcclxuICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBqc29uS2V5cyAtIEEgbGlzdCBvZiBKU09OIGtleWZyYW1lcy5cclxuICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSB0aW1lcyAtIFRoaXMgYXJyYXkgd2lsbCBiZSBmaWxsZWQgd2l0aCBrZXlmcmFtZSB0aW1lcyBieSB0aGlzIGZ1bmN0aW9uLlxyXG4gKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IHZhbHVlcyAtIFRoaXMgYXJyYXkgd2lsbCBiZSBmaWxsZWQgd2l0aCBrZXlmcmFtZSB2YWx1ZXMgYnkgdGhpcyBmdW5jdGlvbi5cclxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlUHJvcGVydHlOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHVzZS5cclxuICovXHJcbmZ1bmN0aW9uIGZsYXR0ZW5KU09OKCBqc29uS2V5cywgdGltZXMsIHZhbHVlcywgdmFsdWVQcm9wZXJ0eU5hbWUgKSB7XHJcblxyXG5cdGxldCBpID0gMSwga2V5ID0ganNvbktleXNbIDAgXTtcclxuXHJcblx0d2hpbGUgKCBrZXkgIT09IHVuZGVmaW5lZCAmJiBrZXlbIHZhbHVlUHJvcGVydHlOYW1lIF0gPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRrZXkgPSBqc29uS2V5c1sgaSArKyBdO1xyXG5cclxuXHR9XHJcblxyXG5cdGlmICgga2V5ID09PSB1bmRlZmluZWQgKSByZXR1cm47IC8vIG5vIGRhdGFcclxuXHJcblx0bGV0IHZhbHVlID0ga2V5WyB2YWx1ZVByb3BlcnR5TmFtZSBdO1xyXG5cdGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHJldHVybjsgLy8gbm8gZGF0YVxyXG5cclxuXHRpZiAoIEFycmF5LmlzQXJyYXkoIHZhbHVlICkgKSB7XHJcblxyXG5cdFx0ZG8ge1xyXG5cclxuXHRcdFx0dmFsdWUgPSBrZXlbIHZhbHVlUHJvcGVydHlOYW1lIF07XHJcblxyXG5cdFx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdHRpbWVzLnB1c2goIGtleS50aW1lICk7XHJcblx0XHRcdFx0dmFsdWVzLnB1c2goIC4uLnZhbHVlICk7IC8vIHB1c2ggYWxsIGVsZW1lbnRzXHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRrZXkgPSBqc29uS2V5c1sgaSArKyBdO1xyXG5cclxuXHRcdH0gd2hpbGUgKCBrZXkgIT09IHVuZGVmaW5lZCApO1xyXG5cclxuXHR9IGVsc2UgaWYgKCB2YWx1ZS50b0FycmF5ICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0Ly8gLi4uYXNzdW1lIFRIUkVFLk1hdGgtaXNoXHJcblxyXG5cdFx0ZG8ge1xyXG5cclxuXHRcdFx0dmFsdWUgPSBrZXlbIHZhbHVlUHJvcGVydHlOYW1lIF07XHJcblxyXG5cdFx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdHRpbWVzLnB1c2goIGtleS50aW1lICk7XHJcblx0XHRcdFx0dmFsdWUudG9BcnJheSggdmFsdWVzLCB2YWx1ZXMubGVuZ3RoICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRrZXkgPSBqc29uS2V5c1sgaSArKyBdO1xyXG5cclxuXHRcdH0gd2hpbGUgKCBrZXkgIT09IHVuZGVmaW5lZCApO1xyXG5cclxuXHR9IGVsc2Uge1xyXG5cclxuXHRcdC8vIG90aGVyd2lzZSBwdXNoIGFzLWlzXHJcblxyXG5cdFx0ZG8ge1xyXG5cclxuXHRcdFx0dmFsdWUgPSBrZXlbIHZhbHVlUHJvcGVydHlOYW1lIF07XHJcblxyXG5cdFx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdHRpbWVzLnB1c2goIGtleS50aW1lICk7XHJcblx0XHRcdFx0dmFsdWVzLnB1c2goIHZhbHVlICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRrZXkgPSBqc29uS2V5c1sgaSArKyBdO1xyXG5cclxuXHRcdH0gd2hpbGUgKCBrZXkgIT09IHVuZGVmaW5lZCApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBjbGlwLCBjb250YWluaW5nIG9ubHkgdGhlIHNlZ21lbnQgb2YgdGhlIG9yaWdpbmFsIGNsaXAgYmV0d2VlbiB0aGUgZ2l2ZW4gZnJhbWVzLlxyXG4gKlxyXG4gKiBAcGFyYW0ge0FuaW1hdGlvbkNsaXB9IHNvdXJjZUNsaXAgLSBUaGUgdmFsdWVzIHRvIHNvcnQuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGNsaXAuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydEZyYW1lIC0gVGhlIHN0YXJ0IGZyYW1lLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gZW5kRnJhbWUgLSBUaGUgZW5kIGZyYW1lLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW2Zwcz0zMF0gLSBUaGUgRlBTLlxyXG4gKiBAcmV0dXJuIHtBbmltYXRpb25DbGlwfSBUaGUgbmV3IHN1YiBjbGlwLlxyXG4gKi9cclxuZnVuY3Rpb24gc3ViY2xpcCggc291cmNlQ2xpcCwgbmFtZSwgc3RhcnRGcmFtZSwgZW5kRnJhbWUsIGZwcyA9IDMwICkge1xyXG5cclxuXHRjb25zdCBjbGlwID0gc291cmNlQ2xpcC5jbG9uZSgpO1xyXG5cclxuXHRjbGlwLm5hbWUgPSBuYW1lO1xyXG5cclxuXHRjb25zdCB0cmFja3MgPSBbXTtcclxuXHJcblx0Zm9yICggbGV0IGkgPSAwOyBpIDwgY2xpcC50cmFja3MubGVuZ3RoOyArKyBpICkge1xyXG5cclxuXHRcdGNvbnN0IHRyYWNrID0gY2xpcC50cmFja3NbIGkgXTtcclxuXHRcdGNvbnN0IHZhbHVlU2l6ZSA9IHRyYWNrLmdldFZhbHVlU2l6ZSgpO1xyXG5cclxuXHRcdGNvbnN0IHRpbWVzID0gW107XHJcblx0XHRjb25zdCB2YWx1ZXMgPSBbXTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaiA9IDA7IGogPCB0cmFjay50aW1lcy5sZW5ndGg7ICsrIGogKSB7XHJcblxyXG5cdFx0XHRjb25zdCBmcmFtZSA9IHRyYWNrLnRpbWVzWyBqIF0gKiBmcHM7XHJcblxyXG5cdFx0XHRpZiAoIGZyYW1lIDwgc3RhcnRGcmFtZSB8fCBmcmFtZSA+PSBlbmRGcmFtZSApIGNvbnRpbnVlO1xyXG5cclxuXHRcdFx0dGltZXMucHVzaCggdHJhY2sudGltZXNbIGogXSApO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGsgPSAwOyBrIDwgdmFsdWVTaXplOyArKyBrICkge1xyXG5cclxuXHRcdFx0XHR2YWx1ZXMucHVzaCggdHJhY2sudmFsdWVzWyBqICogdmFsdWVTaXplICsgayBdICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGltZXMubGVuZ3RoID09PSAwICkgY29udGludWU7XHJcblxyXG5cdFx0dHJhY2sudGltZXMgPSBjb252ZXJ0QXJyYXkoIHRpbWVzLCB0cmFjay50aW1lcy5jb25zdHJ1Y3RvciApO1xyXG5cdFx0dHJhY2sudmFsdWVzID0gY29udmVydEFycmF5KCB2YWx1ZXMsIHRyYWNrLnZhbHVlcy5jb25zdHJ1Y3RvciApO1xyXG5cclxuXHRcdHRyYWNrcy5wdXNoKCB0cmFjayApO1xyXG5cclxuXHR9XHJcblxyXG5cdGNsaXAudHJhY2tzID0gdHJhY2tzO1xyXG5cclxuXHQvLyBmaW5kIG1pbmltdW0gLnRpbWVzIHZhbHVlIGFjcm9zcyBhbGwgdHJhY2tzIGluIHRoZSB0cmltbWVkIGNsaXBcclxuXHJcblx0bGV0IG1pblN0YXJ0VGltZSA9IEluZmluaXR5O1xyXG5cclxuXHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBjbGlwLnRyYWNrcy5sZW5ndGg7ICsrIGkgKSB7XHJcblxyXG5cdFx0aWYgKCBtaW5TdGFydFRpbWUgPiBjbGlwLnRyYWNrc1sgaSBdLnRpbWVzWyAwIF0gKSB7XHJcblxyXG5cdFx0XHRtaW5TdGFydFRpbWUgPSBjbGlwLnRyYWNrc1sgaSBdLnRpbWVzWyAwIF07XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8vIHNoaWZ0IGFsbCB0cmFja3Mgc3VjaCB0aGF0IGNsaXAgYmVnaW5zIGF0IHQ9MFxyXG5cclxuXHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBjbGlwLnRyYWNrcy5sZW5ndGg7ICsrIGkgKSB7XHJcblxyXG5cdFx0Y2xpcC50cmFja3NbIGkgXS5zaGlmdCggLSAxICogbWluU3RhcnRUaW1lICk7XHJcblxyXG5cdH1cclxuXHJcblx0Y2xpcC5yZXNldER1cmF0aW9uKCk7XHJcblxyXG5cdHJldHVybiBjbGlwO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIENvbnZlcnRzIHRoZSBrZXlmcmFtZXMgb2YgdGhlIGdpdmVuIGFuaW1hdGlvbiBjbGlwIHRvIGFuIGFkZGl0aXZlIGZvcm1hdC5cclxuICpcclxuICogQHBhcmFtIHtBbmltYXRpb25DbGlwfSB0YXJnZXRDbGlwIC0gVGhlIGNsaXAgdG8gbWFrZSBhZGRpdGl2ZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtyZWZlcmVuY2VGcmFtZT0wXSAtIFRoZSByZWZlcmVuY2UgZnJhbWUuXHJcbiAqIEBwYXJhbSB7QW5pbWF0aW9uQ2xpcH0gW3JlZmVyZW5jZUNsaXA9dGFyZ2V0Q2xpcF0gLSBUaGUgcmVmZXJlbmNlIGNsaXAuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbZnBzPTMwXSAtIFRoZSBGUFMuXHJcbiAqIEByZXR1cm4ge0FuaW1hdGlvbkNsaXB9IFRoZSB1cGRhdGVkIGNsaXAgd2hpY2ggaXMgbm93IGFkZGl0aXZlLlxyXG4gKi9cclxuZnVuY3Rpb24gbWFrZUNsaXBBZGRpdGl2ZSggdGFyZ2V0Q2xpcCwgcmVmZXJlbmNlRnJhbWUgPSAwLCByZWZlcmVuY2VDbGlwID0gdGFyZ2V0Q2xpcCwgZnBzID0gMzAgKSB7XHJcblxyXG5cdGlmICggZnBzIDw9IDAgKSBmcHMgPSAzMDtcclxuXHJcblx0Y29uc3QgbnVtVHJhY2tzID0gcmVmZXJlbmNlQ2xpcC50cmFja3MubGVuZ3RoO1xyXG5cdGNvbnN0IHJlZmVyZW5jZVRpbWUgPSByZWZlcmVuY2VGcmFtZSAvIGZwcztcclxuXHJcblx0Ly8gTWFrZSBlYWNoIHRyYWNrJ3MgdmFsdWVzIHJlbGF0aXZlIHRvIHRoZSB2YWx1ZXMgYXQgdGhlIHJlZmVyZW5jZSBmcmFtZVxyXG5cdGZvciAoIGxldCBpID0gMDsgaSA8IG51bVRyYWNrczsgKysgaSApIHtcclxuXHJcblx0XHRjb25zdCByZWZlcmVuY2VUcmFjayA9IHJlZmVyZW5jZUNsaXAudHJhY2tzWyBpIF07XHJcblx0XHRjb25zdCByZWZlcmVuY2VUcmFja1R5cGUgPSByZWZlcmVuY2VUcmFjay5WYWx1ZVR5cGVOYW1lO1xyXG5cclxuXHRcdC8vIFNraXAgdGhpcyB0cmFjayBpZiBpdCdzIG5vbi1udW1lcmljXHJcblx0XHRpZiAoIHJlZmVyZW5jZVRyYWNrVHlwZSA9PT0gJ2Jvb2wnIHx8IHJlZmVyZW5jZVRyYWNrVHlwZSA9PT0gJ3N0cmluZycgKSBjb250aW51ZTtcclxuXHJcblx0XHQvLyBGaW5kIHRoZSB0cmFjayBpbiB0aGUgdGFyZ2V0IGNsaXAgd2hvc2UgbmFtZSBhbmQgdHlwZSBtYXRjaGVzIHRoZSByZWZlcmVuY2UgdHJhY2tcclxuXHRcdGNvbnN0IHRhcmdldFRyYWNrID0gdGFyZ2V0Q2xpcC50cmFja3MuZmluZCggZnVuY3Rpb24gKCB0cmFjayApIHtcclxuXHJcblx0XHRcdHJldHVybiB0cmFjay5uYW1lID09PSByZWZlcmVuY2VUcmFjay5uYW1lXHJcblx0XHRcdFx0JiYgdHJhY2suVmFsdWVUeXBlTmFtZSA9PT0gcmVmZXJlbmNlVHJhY2tUeXBlO1xyXG5cclxuXHRcdH0gKTtcclxuXHJcblx0XHRpZiAoIHRhcmdldFRyYWNrID09PSB1bmRlZmluZWQgKSBjb250aW51ZTtcclxuXHJcblx0XHRsZXQgcmVmZXJlbmNlT2Zmc2V0ID0gMDtcclxuXHRcdGNvbnN0IHJlZmVyZW5jZVZhbHVlU2l6ZSA9IHJlZmVyZW5jZVRyYWNrLmdldFZhbHVlU2l6ZSgpO1xyXG5cclxuXHRcdGlmICggcmVmZXJlbmNlVHJhY2suY3JlYXRlSW50ZXJwb2xhbnQuaXNJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RHTFRGQ3ViaWNTcGxpbmUgKSB7XHJcblxyXG5cdFx0XHRyZWZlcmVuY2VPZmZzZXQgPSByZWZlcmVuY2VWYWx1ZVNpemUgLyAzO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRsZXQgdGFyZ2V0T2Zmc2V0ID0gMDtcclxuXHRcdGNvbnN0IHRhcmdldFZhbHVlU2l6ZSA9IHRhcmdldFRyYWNrLmdldFZhbHVlU2l6ZSgpO1xyXG5cclxuXHRcdGlmICggdGFyZ2V0VHJhY2suY3JlYXRlSW50ZXJwb2xhbnQuaXNJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RHTFRGQ3ViaWNTcGxpbmUgKSB7XHJcblxyXG5cdFx0XHR0YXJnZXRPZmZzZXQgPSB0YXJnZXRWYWx1ZVNpemUgLyAzO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBsYXN0SW5kZXggPSByZWZlcmVuY2VUcmFjay50aW1lcy5sZW5ndGggLSAxO1xyXG5cdFx0bGV0IHJlZmVyZW5jZVZhbHVlO1xyXG5cclxuXHRcdC8vIEZpbmQgdGhlIHZhbHVlIHRvIHN1YnRyYWN0IG91dCBvZiB0aGUgdHJhY2tcclxuXHRcdGlmICggcmVmZXJlbmNlVGltZSA8PSByZWZlcmVuY2VUcmFjay50aW1lc1sgMCBdICkge1xyXG5cclxuXHRcdFx0Ly8gUmVmZXJlbmNlIGZyYW1lIGlzIGVhcmxpZXIgdGhhbiB0aGUgZmlyc3Qga2V5ZnJhbWUsIHNvIGp1c3QgdXNlIHRoZSBmaXJzdCBrZXlmcmFtZVxyXG5cdFx0XHRjb25zdCBzdGFydEluZGV4ID0gcmVmZXJlbmNlT2Zmc2V0O1xyXG5cdFx0XHRjb25zdCBlbmRJbmRleCA9IHJlZmVyZW5jZVZhbHVlU2l6ZSAtIHJlZmVyZW5jZU9mZnNldDtcclxuXHRcdFx0cmVmZXJlbmNlVmFsdWUgPSByZWZlcmVuY2VUcmFjay52YWx1ZXMuc2xpY2UoIHN0YXJ0SW5kZXgsIGVuZEluZGV4ICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggcmVmZXJlbmNlVGltZSA+PSByZWZlcmVuY2VUcmFjay50aW1lc1sgbGFzdEluZGV4IF0gKSB7XHJcblxyXG5cdFx0XHQvLyBSZWZlcmVuY2UgZnJhbWUgaXMgYWZ0ZXIgdGhlIGxhc3Qga2V5ZnJhbWUsIHNvIGp1c3QgdXNlIHRoZSBsYXN0IGtleWZyYW1lXHJcblx0XHRcdGNvbnN0IHN0YXJ0SW5kZXggPSBsYXN0SW5kZXggKiByZWZlcmVuY2VWYWx1ZVNpemUgKyByZWZlcmVuY2VPZmZzZXQ7XHJcblx0XHRcdGNvbnN0IGVuZEluZGV4ID0gc3RhcnRJbmRleCArIHJlZmVyZW5jZVZhbHVlU2l6ZSAtIHJlZmVyZW5jZU9mZnNldDtcclxuXHRcdFx0cmVmZXJlbmNlVmFsdWUgPSByZWZlcmVuY2VUcmFjay52YWx1ZXMuc2xpY2UoIHN0YXJ0SW5kZXgsIGVuZEluZGV4ICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdC8vIEludGVycG9sYXRlIHRvIHRoZSByZWZlcmVuY2UgdmFsdWVcclxuXHRcdFx0Y29uc3QgaW50ZXJwb2xhbnQgPSByZWZlcmVuY2VUcmFjay5jcmVhdGVJbnRlcnBvbGFudCgpO1xyXG5cdFx0XHRjb25zdCBzdGFydEluZGV4ID0gcmVmZXJlbmNlT2Zmc2V0O1xyXG5cdFx0XHRjb25zdCBlbmRJbmRleCA9IHJlZmVyZW5jZVZhbHVlU2l6ZSAtIHJlZmVyZW5jZU9mZnNldDtcclxuXHRcdFx0aW50ZXJwb2xhbnQuZXZhbHVhdGUoIHJlZmVyZW5jZVRpbWUgKTtcclxuXHRcdFx0cmVmZXJlbmNlVmFsdWUgPSBpbnRlcnBvbGFudC5yZXN1bHRCdWZmZXIuc2xpY2UoIHN0YXJ0SW5kZXgsIGVuZEluZGV4ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIENvbmp1Z2F0ZSB0aGUgcXVhdGVybmlvblxyXG5cdFx0aWYgKCByZWZlcmVuY2VUcmFja1R5cGUgPT09ICdxdWF0ZXJuaW9uJyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHJlZmVyZW5jZVF1YXQgPSBuZXcgUXVhdGVybmlvbigpLmZyb21BcnJheSggcmVmZXJlbmNlVmFsdWUgKS5ub3JtYWxpemUoKS5jb25qdWdhdGUoKTtcclxuXHRcdFx0cmVmZXJlbmNlUXVhdC50b0FycmF5KCByZWZlcmVuY2VWYWx1ZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBTdWJ0cmFjdCB0aGUgcmVmZXJlbmNlIHZhbHVlIGZyb20gYWxsIG9mIHRoZSB0cmFjayB2YWx1ZXNcclxuXHJcblx0XHRjb25zdCBudW1UaW1lcyA9IHRhcmdldFRyYWNrLnRpbWVzLmxlbmd0aDtcclxuXHRcdGZvciAoIGxldCBqID0gMDsgaiA8IG51bVRpbWVzOyArKyBqICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdmFsdWVTdGFydCA9IGogKiB0YXJnZXRWYWx1ZVNpemUgKyB0YXJnZXRPZmZzZXQ7XHJcblxyXG5cdFx0XHRpZiAoIHJlZmVyZW5jZVRyYWNrVHlwZSA9PT0gJ3F1YXRlcm5pb24nICkge1xyXG5cclxuXHRcdFx0XHQvLyBNdWx0aXBseSB0aGUgY29uanVnYXRlIGZvciBxdWF0ZXJuaW9uIHRyYWNrIHR5cGVzXHJcblx0XHRcdFx0UXVhdGVybmlvbi5tdWx0aXBseVF1YXRlcm5pb25zRmxhdChcclxuXHRcdFx0XHRcdHRhcmdldFRyYWNrLnZhbHVlcyxcclxuXHRcdFx0XHRcdHZhbHVlU3RhcnQsXHJcblx0XHRcdFx0XHRyZWZlcmVuY2VWYWx1ZSxcclxuXHRcdFx0XHRcdDAsXHJcblx0XHRcdFx0XHR0YXJnZXRUcmFjay52YWx1ZXMsXHJcblx0XHRcdFx0XHR2YWx1ZVN0YXJ0XHJcblx0XHRcdFx0KTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHZhbHVlRW5kID0gdGFyZ2V0VmFsdWVTaXplIC0gdGFyZ2V0T2Zmc2V0ICogMjtcclxuXHJcblx0XHRcdFx0Ly8gU3VidHJhY3QgZWFjaCB2YWx1ZSBmb3IgYWxsIG90aGVyIG51bWVyaWMgdHJhY2sgdHlwZXNcclxuXHRcdFx0XHRmb3IgKCBsZXQgayA9IDA7IGsgPCB2YWx1ZUVuZDsgKysgayApIHtcclxuXHJcblx0XHRcdFx0XHR0YXJnZXRUcmFjay52YWx1ZXNbIHZhbHVlU3RhcnQgKyBrIF0gLT0gcmVmZXJlbmNlVmFsdWVbIGsgXTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHR0YXJnZXRDbGlwLmJsZW5kTW9kZSA9IEFkZGl0aXZlQW5pbWF0aW9uQmxlbmRNb2RlO1xyXG5cclxuXHRyZXR1cm4gdGFyZ2V0Q2xpcDtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBIGNsYXNzIHdpdGggdmFyaW91cyBtZXRob2RzIHRvIGFzc2lzdCB3aXRoIGFuaW1hdGlvbnMuXHJcbiAqXHJcbiAqIEBoaWRlY29uc3RydWN0b3JcclxuICovXHJcbmNsYXNzIEFuaW1hdGlvblV0aWxzIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29udmVydHMgYW4gYXJyYXkgdG8gYSBzcGVjaWZpYyB0eXBlXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQHBhcmFtIHtUeXBlZEFycmF5fEFycmF5fSBhcnJheSAtIFRoZSBhcnJheSB0byBjb252ZXJ0LlxyXG5cdCAqIEBwYXJhbSB7VHlwZWRBcnJheS5jb25zdHJ1Y3Rvcn0gdHlwZSAtIFRoZSBjb25zdHJ1Y3RvciBvZiBhIHR5cGUgYXJyYXkuXHJcblx0ICogQHJldHVybiB7VHlwZWRBcnJheX0gVGhlIGNvbnZlcnRlZCBhcnJheVxyXG5cdCAqL1xyXG5cdHN0YXRpYyBjb252ZXJ0QXJyYXkoIGFycmF5LCB0eXBlICkge1xyXG5cclxuXHRcdHJldHVybiBjb252ZXJ0QXJyYXkoIGFycmF5LCB0eXBlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIG9iamVjdCBpcyBhIHR5cGVkIGFycmF5LlxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEBwYXJhbSB7YW55fSBvYmplY3QgLSBUaGUgb2JqZWN0IHRvIGNoZWNrLlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGdpdmVuIG9iamVjdCBpcyBhIHR5cGVkIGFycmF5LlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBpc1R5cGVkQXJyYXkoIG9iamVjdCApIHtcclxuXHJcblx0XHRyZXR1cm4gaXNUeXBlZEFycmF5KCBvYmplY3QgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGFuIGFycmF5IGJ5IHdoaWNoIHRpbWVzIGFuZCB2YWx1ZXMgY2FuIGJlIHNvcnRlZC5cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IHRpbWVzIC0gVGhlIGtleWZyYW1lIHRpbWUgdmFsdWVzLlxyXG5cdCAqIEByZXR1cm4ge0FycmF5PG51bWJlcj59IFRoZSBhcnJheS5cclxuXHQgKi9cclxuXHRzdGF0aWMgZ2V0S2V5ZnJhbWVPcmRlciggdGltZXMgKSB7XHJcblxyXG5cdFx0cmV0dXJuIGdldEtleWZyYW1lT3JkZXIoIHRpbWVzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU29ydHMgdGhlIGdpdmVuIGFycmF5IGJ5IHRoZSBwcmV2aW91c2x5IGNvbXB1dGVkIG9yZGVyIHZpYSBgZ2V0S2V5ZnJhbWVPcmRlcigpYC5cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IHZhbHVlcyAtIFRoZSB2YWx1ZXMgdG8gc29ydC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc3RyaWRlIC0gVGhlIHN0cmlkZS5cclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IG9yZGVyIC0gVGhlIHNvcnQgb3JkZXIuXHJcblx0ICogQHJldHVybiB7QXJyYXk8bnVtYmVyPn0gVGhlIHNvcnRlZCB2YWx1ZXMuXHJcblx0ICovXHJcblx0c3RhdGljIHNvcnRlZEFycmF5KCB2YWx1ZXMsIHN0cmlkZSwgb3JkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHNvcnRlZEFycmF5KCB2YWx1ZXMsIHN0cmlkZSwgb3JkZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVc2VkIGZvciBwYXJzaW5nIEFPUyBrZXlmcmFtZSBmb3JtYXRzLlxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0ganNvbktleXMgLSBBIGxpc3Qgb2YgSlNPTiBrZXlmcmFtZXMuXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSB0aW1lcyAtIFRoaXMgYXJyYXkgd2lsbCBiZSBmaWxsZWQgd2l0aCBrZXlmcmFtZSB0aW1lcyBieSB0aGlzIG1ldGhvZC5cclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IHZhbHVlcyAtIFRoaXMgYXJyYXkgd2lsbCBiZSBmaWxsZWQgd2l0aCBrZXlmcmFtZSB2YWx1ZXMgYnkgdGhpcyBtZXRob2QuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlUHJvcGVydHlOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHVzZS5cclxuXHQgKi9cclxuXHRzdGF0aWMgZmxhdHRlbkpTT04oIGpzb25LZXlzLCB0aW1lcywgdmFsdWVzLCB2YWx1ZVByb3BlcnR5TmFtZSApIHtcclxuXHJcblx0XHRmbGF0dGVuSlNPTigganNvbktleXMsIHRpbWVzLCB2YWx1ZXMsIHZhbHVlUHJvcGVydHlOYW1lICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyBhIG5ldyBjbGlwLCBjb250YWluaW5nIG9ubHkgdGhlIHNlZ21lbnQgb2YgdGhlIG9yaWdpbmFsIGNsaXAgYmV0d2VlbiB0aGUgZ2l2ZW4gZnJhbWVzLlxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEBwYXJhbSB7QW5pbWF0aW9uQ2xpcH0gc291cmNlQ2xpcCAtIFRoZSB2YWx1ZXMgdG8gc29ydC5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBjbGlwLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydEZyYW1lIC0gVGhlIHN0YXJ0IGZyYW1lLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBlbmRGcmFtZSAtIFRoZSBlbmQgZnJhbWUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtmcHM9MzBdIC0gVGhlIEZQUy5cclxuXHQgKiBAcmV0dXJuIHtBbmltYXRpb25DbGlwfSBUaGUgbmV3IHN1YiBjbGlwLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBzdWJjbGlwKCBzb3VyY2VDbGlwLCBuYW1lLCBzdGFydEZyYW1lLCBlbmRGcmFtZSwgZnBzID0gMzAgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHN1YmNsaXAoIHNvdXJjZUNsaXAsIG5hbWUsIHN0YXJ0RnJhbWUsIGVuZEZyYW1lLCBmcHMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb252ZXJ0cyB0aGUga2V5ZnJhbWVzIG9mIHRoZSBnaXZlbiBhbmltYXRpb24gY2xpcCB0byBhbiBhZGRpdGl2ZSBmb3JtYXQuXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQHBhcmFtIHtBbmltYXRpb25DbGlwfSB0YXJnZXRDbGlwIC0gVGhlIGNsaXAgdG8gbWFrZSBhZGRpdGl2ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3JlZmVyZW5jZUZyYW1lPTBdIC0gVGhlIHJlZmVyZW5jZSBmcmFtZS5cclxuXHQgKiBAcGFyYW0ge0FuaW1hdGlvbkNsaXB9IFtyZWZlcmVuY2VDbGlwPXRhcmdldENsaXBdIC0gVGhlIHJlZmVyZW5jZSBjbGlwLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZnBzPTMwXSAtIFRoZSBGUFMuXHJcblx0ICogQHJldHVybiB7QW5pbWF0aW9uQ2xpcH0gVGhlIHVwZGF0ZWQgY2xpcCB3aGljaCBpcyBub3cgYWRkaXRpdmUuXHJcblx0ICovXHJcblx0c3RhdGljIG1ha2VDbGlwQWRkaXRpdmUoIHRhcmdldENsaXAsIHJlZmVyZW5jZUZyYW1lID0gMCwgcmVmZXJlbmNlQ2xpcCA9IHRhcmdldENsaXAsIGZwcyA9IDMwICkge1xyXG5cclxuXHRcdHJldHVybiBtYWtlQ2xpcEFkZGl0aXZlKCB0YXJnZXRDbGlwLCByZWZlcmVuY2VGcmFtZSwgcmVmZXJlbmNlQ2xpcCwgZnBzICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7XHJcblx0Y29udmVydEFycmF5LFxyXG5cdGlzVHlwZWRBcnJheSxcclxuXHRnZXRLZXlmcmFtZU9yZGVyLFxyXG5cdHNvcnRlZEFycmF5LFxyXG5cdGZsYXR0ZW5KU09OLFxyXG5cdHN1YmNsaXAsXHJcblx0bWFrZUNsaXBBZGRpdGl2ZSxcclxuXHRBbmltYXRpb25VdGlsc1xyXG59O1xyXG4iLCIvKipcclxuICogQWJzdHJhY3QgYmFzZSBjbGFzcyBvZiBpbnRlcnBvbGFudHMgb3ZlciBwYXJhbWV0cmljIHNhbXBsZXMuXHJcbiAqXHJcbiAqIFRoZSBwYXJhbWV0ZXIgZG9tYWluIGlzIG9uZSBkaW1lbnNpb25hbCwgdHlwaWNhbGx5IHRoZSB0aW1lIG9yIGEgcGF0aFxyXG4gKiBhbG9uZyBhIGN1cnZlIGRlZmluZWQgYnkgdGhlIGRhdGEuXHJcbiAqXHJcbiAqIFRoZSBzYW1wbGUgdmFsdWVzIGNhbiBoYXZlIGFueSBkaW1lbnNpb25hbGl0eSBhbmQgZGVyaXZlZCBjbGFzc2VzIG1heVxyXG4gKiBhcHBseSBzcGVjaWFsIGludGVycHJldGF0aW9ucyB0byB0aGUgZGF0YS5cclxuICpcclxuICogVGhpcyBjbGFzcyBwcm92aWRlcyB0aGUgaW50ZXJ2YWwgc2VlayBpbiBhIFRlbXBsYXRlIE1ldGhvZCwgZGVmZXJyaW5nXHJcbiAqIHRoZSBhY3R1YWwgaW50ZXJwb2xhdGlvbiB0byBkZXJpdmVkIGNsYXNzZXMuXHJcbiAqXHJcbiAqIFRpbWUgY29tcGxleGl0eSBpcyBPKDEpIGZvciBsaW5lYXIgYWNjZXNzIGNyb3NzaW5nIGF0IG1vc3QgdHdvIHBvaW50c1xyXG4gKiBhbmQgTyhsb2cgTikgZm9yIHJhbmRvbSBhY2Nlc3MsIHdoZXJlIE4gaXMgdGhlIG51bWJlciBvZiBwb3NpdGlvbnMuXHJcbiAqXHJcbiAqIFJlZmVyZW5jZXM6IHtAbGluayBodHRwOi8vd3d3Lm9vZGVzaWduLmNvbS90ZW1wbGF0ZS1tZXRob2QtcGF0dGVybi5odG1sfVxyXG4gKlxyXG4gKiBAYWJzdHJhY3RcclxuICovXHJcbmNsYXNzIEludGVycG9sYW50IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBpbnRlcnBvbGFudC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VHlwZWRBcnJheX0gcGFyYW1ldGVyUG9zaXRpb25zIC0gVGhlIHBhcmFtZXRlciBwb3NpdGlvbnMgaG9sZCB0aGUgaW50ZXJwb2xhdGlvbiBmYWN0b3JzLlxyXG5cdCAqIEBwYXJhbSB7VHlwZWRBcnJheX0gc2FtcGxlVmFsdWVzIC0gVGhlIHNhbXBsZSB2YWx1ZXMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHNhbXBsZVNpemUgLSBUaGUgc2FtcGxlIHNpemVcclxuXHQgKiBAcGFyYW0ge1R5cGVkQXJyYXl9IFtyZXN1bHRCdWZmZXJdIC0gVGhlIHJlc3VsdCBidWZmZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcGFyYW1ldGVyIHBvc2l0aW9ucy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VHlwZWRBcnJheX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wYXJhbWV0ZXJQb3NpdGlvbnMgPSBwYXJhbWV0ZXJQb3NpdGlvbnM7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGNhY2hlIGluZGV4LlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9jYWNoZWRJbmRleCA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcmVzdWx0IGJ1ZmZlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VHlwZWRBcnJheX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yZXN1bHRCdWZmZXIgPSByZXN1bHRCdWZmZXIgIT09IHVuZGVmaW5lZCA/IHJlc3VsdEJ1ZmZlciA6IG5ldyBzYW1wbGVWYWx1ZXMuY29uc3RydWN0b3IoIHNhbXBsZVNpemUgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBzYW1wbGUgdmFsdWVzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtUeXBlZEFycmF5fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNhbXBsZVZhbHVlcyA9IHNhbXBsZVZhbHVlcztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB2YWx1ZSBzaXplLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtUeXBlZEFycmF5fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnZhbHVlU2l6ZSA9IHNhbXBsZVNpemU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgaW50ZXJwb2xhdGlvbiBzZXR0aW5ncy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P09iamVjdH1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zZXR0aW5ncyA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZGVmYXVsdCBzZXR0aW5ncyBvYmplY3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5EZWZhdWx0U2V0dGluZ3NfID0ge307XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRXZhbHVhdGUgdGhlIGludGVycG9sYW50IGF0IHBvc2l0aW9uIGB0YC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0IC0gVGhlIGludGVycG9sYXRpb24gZmFjdG9yLlxyXG5cdCAqIEByZXR1cm4ge1R5cGVkQXJyYXl9IFRoZSByZXN1bHQgYnVmZmVyLlxyXG5cdCAqL1xyXG5cdGV2YWx1YXRlKCB0ICkge1xyXG5cclxuXHRcdGNvbnN0IHBwID0gdGhpcy5wYXJhbWV0ZXJQb3NpdGlvbnM7XHJcblx0XHRsZXQgaTEgPSB0aGlzLl9jYWNoZWRJbmRleCxcclxuXHRcdFx0dDEgPSBwcFsgaTEgXSxcclxuXHRcdFx0dDAgPSBwcFsgaTEgLSAxIF07XHJcblxyXG5cdFx0dmFsaWRhdGVfaW50ZXJ2YWw6IHtcclxuXHJcblx0XHRcdHNlZWs6IHtcclxuXHJcblx0XHRcdFx0bGV0IHJpZ2h0O1xyXG5cclxuXHRcdFx0XHRsaW5lYXJfc2Nhbjoge1xyXG5cclxuXHRcdFx0XHRcdC8vLSBTZWUgaHR0cDovL2pzcGVyZi5jb20vY29tcGFyaXNvbi10by11bmRlZmluZWQvM1xyXG5cdFx0XHRcdFx0Ly8tIHNsb3dlciBjb2RlOlxyXG5cdFx0XHRcdFx0Ly8tXHJcblx0XHRcdFx0XHQvLy0gXHRcdFx0XHRpZiAoIHQgPj0gdDEgfHwgdDEgPT09IHVuZGVmaW5lZCApIHtcclxuXHRcdFx0XHRcdGZvcndhcmRfc2NhbjogaWYgKCAhICggdCA8IHQxICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRmb3IgKCBsZXQgZ2l2ZVVwQXQgPSBpMSArIDI7IDsgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmICggdDEgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoIHQgPCB0MCApIGJyZWFrIGZvcndhcmRfc2NhbjtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHQvLyBhZnRlciBlbmRcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRpMSA9IHBwLmxlbmd0aDtcclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuX2NhY2hlZEluZGV4ID0gaTE7XHJcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5jb3B5U2FtcGxlVmFsdWVfKCBpMSAtIDEgKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoIGkxID09PSBnaXZlVXBBdCApIGJyZWFrOyAvLyB0aGlzIGxvb3BcclxuXHJcblx0XHRcdFx0XHRcdFx0dDAgPSB0MTtcclxuXHRcdFx0XHRcdFx0XHR0MSA9IHBwWyArKyBpMSBdO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoIHQgPCB0MSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHQvLyB3ZSBoYXZlIGFycml2ZWQgYXQgdGhlIHNvdWdodCBpbnRlcnZhbFxyXG5cdFx0XHRcdFx0XHRcdFx0YnJlYWsgc2VlaztcclxuXHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0Ly8gcHJlcGFyZSBiaW5hcnkgc2VhcmNoIG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZSBpbmRleFxyXG5cdFx0XHRcdFx0XHRyaWdodCA9IHBwLmxlbmd0aDtcclxuXHRcdFx0XHRcdFx0YnJlYWsgbGluZWFyX3NjYW47XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8vLSBzbG93ZXIgY29kZTpcclxuXHRcdFx0XHRcdC8vLVx0XHRcdFx0XHRpZiAoIHQgPCB0MCB8fCB0MCA9PT0gdW5kZWZpbmVkICkge1xyXG5cdFx0XHRcdFx0aWYgKCAhICggdCA+PSB0MCApICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Ly8gbG9vcGluZz9cclxuXHJcblx0XHRcdFx0XHRcdGNvbnN0IHQxZ2xvYmFsID0gcHBbIDEgXTtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggdCA8IHQxZ2xvYmFsICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpMSA9IDI7IC8vICsgMSwgdXNpbmcgdGhlIHNjYW4gZm9yIHRoZSBkZXRhaWxzXHJcblx0XHRcdFx0XHRcdFx0dDAgPSB0MWdsb2JhbDtcclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdC8vIGxpbmVhciByZXZlcnNlIHNjYW5cclxuXHJcblx0XHRcdFx0XHRcdGZvciAoIGxldCBnaXZlVXBBdCA9IGkxIC0gMjsgOyApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKCB0MCA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8vIGJlZm9yZSBzdGFydFxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuX2NhY2hlZEluZGV4ID0gMDtcclxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB0aGlzLmNvcHlTYW1wbGVWYWx1ZV8oIDAgKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoIGkxID09PSBnaXZlVXBBdCApIGJyZWFrOyAvLyB0aGlzIGxvb3BcclxuXHJcblx0XHRcdFx0XHRcdFx0dDEgPSB0MDtcclxuXHRcdFx0XHRcdFx0XHR0MCA9IHBwWyAtLSBpMSAtIDEgXTtcclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKCB0ID49IHQwICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8vIHdlIGhhdmUgYXJyaXZlZCBhdCB0aGUgc291Z2h0IGludGVydmFsXHJcblx0XHRcdFx0XHRcdFx0XHRicmVhayBzZWVrO1xyXG5cclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBwcmVwYXJlIGJpbmFyeSBzZWFyY2ggb24gdGhlIGxlZnQgc2lkZSBvZiB0aGUgaW5kZXhcclxuXHRcdFx0XHRcdFx0cmlnaHQgPSBpMTtcclxuXHRcdFx0XHRcdFx0aTEgPSAwO1xyXG5cdFx0XHRcdFx0XHRicmVhayBsaW5lYXJfc2NhbjtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Ly8gdGhlIGludGVydmFsIGlzIHZhbGlkXHJcblxyXG5cdFx0XHRcdFx0YnJlYWsgdmFsaWRhdGVfaW50ZXJ2YWw7XHJcblxyXG5cdFx0XHRcdH0gLy8gbGluZWFyIHNjYW5cclxuXHJcblx0XHRcdFx0Ly8gYmluYXJ5IHNlYXJjaFxyXG5cclxuXHRcdFx0XHR3aGlsZSAoIGkxIDwgcmlnaHQgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgbWlkID0gKCBpMSArIHJpZ2h0ICkgPj4+IDE7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCB0IDwgcHBbIG1pZCBdICkge1xyXG5cclxuXHRcdFx0XHRcdFx0cmlnaHQgPSBtaWQ7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdGkxID0gbWlkICsgMTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0dDEgPSBwcFsgaTEgXTtcclxuXHRcdFx0XHR0MCA9IHBwWyBpMSAtIDEgXTtcclxuXHJcblx0XHRcdFx0Ly8gY2hlY2sgYm91bmRhcnkgY2FzZXMsIGFnYWluXHJcblxyXG5cdFx0XHRcdGlmICggdDAgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHR0aGlzLl9jYWNoZWRJbmRleCA9IDA7XHJcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5jb3B5U2FtcGxlVmFsdWVfKCAwICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKCB0MSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdGkxID0gcHAubGVuZ3RoO1xyXG5cdFx0XHRcdFx0dGhpcy5fY2FjaGVkSW5kZXggPSBpMTtcclxuXHRcdFx0XHRcdHJldHVybiB0aGlzLmNvcHlTYW1wbGVWYWx1ZV8oIGkxIC0gMSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IC8vIHNlZWtcclxuXHJcblx0XHRcdHRoaXMuX2NhY2hlZEluZGV4ID0gaTE7XHJcblxyXG5cdFx0XHR0aGlzLmludGVydmFsQ2hhbmdlZF8oIGkxLCB0MCwgdDEgKTtcclxuXHJcblx0XHR9IC8vIHZhbGlkYXRlX2ludGVydmFsXHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuaW50ZXJwb2xhdGVfKCBpMSwgdDAsIHQsIHQxICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgaW50ZXJwb2xhdGlvbiBzZXR0aW5ncy5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge09iamVjdH0gVGhlIGludGVycG9sYXRpb24gc2V0dGluZ3MuXHJcblx0ICovXHJcblx0Z2V0U2V0dGluZ3NfKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnNldHRpbmdzIHx8IHRoaXMuRGVmYXVsdFNldHRpbmdzXztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb3BpZXMgYSBzYW1wbGUgdmFsdWUgdG8gdGhlIHJlc3VsdCBidWZmZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBBbiBpbmRleCBpbnRvIHRoZSBzYW1wbGUgdmFsdWUgYnVmZmVyLlxyXG5cdCAqIEByZXR1cm4ge1R5cGVkQXJyYXl9IFRoZSByZXN1bHQgYnVmZmVyLlxyXG5cdCAqL1xyXG5cdGNvcHlTYW1wbGVWYWx1ZV8oIGluZGV4ICkge1xyXG5cclxuXHRcdC8vIGNvcGllcyBhIHNhbXBsZSB2YWx1ZSB0byB0aGUgcmVzdWx0IGJ1ZmZlclxyXG5cclxuXHRcdGNvbnN0IHJlc3VsdCA9IHRoaXMucmVzdWx0QnVmZmVyLFxyXG5cdFx0XHR2YWx1ZXMgPSB0aGlzLnNhbXBsZVZhbHVlcyxcclxuXHRcdFx0c3RyaWRlID0gdGhpcy52YWx1ZVNpemUsXHJcblx0XHRcdG9mZnNldCA9IGluZGV4ICogc3RyaWRlO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSAhPT0gc3RyaWRlOyArKyBpICkge1xyXG5cclxuXHRcdFx0cmVzdWx0WyBpIF0gPSB2YWx1ZXNbIG9mZnNldCArIGkgXTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb3BpZXMgYSBzYW1wbGUgdmFsdWUgdG8gdGhlIHJlc3VsdCBidWZmZXIuXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaTEgLSBBbiBpbmRleCBpbnRvIHRoZSBzYW1wbGUgdmFsdWUgYnVmZmVyLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0MCAtIFRoZSBwcmV2aW91cyBpbnRlcnBvbGF0aW9uIGZhY3Rvci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdCAtIFRoZSBjdXJyZW50IGludGVycG9sYXRpb24gZmFjdG9yLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0MSAtIFRoZSBuZXh0IGludGVycG9sYXRpb24gZmFjdG9yLlxyXG5cdCAqIEByZXR1cm4ge1R5cGVkQXJyYXl9IFRoZSByZXN1bHQgYnVmZmVyLlxyXG5cdCAqL1xyXG5cdGludGVycG9sYXRlXyggLyogaTEsIHQwLCB0LCB0MSAqLyApIHtcclxuXHJcblx0XHR0aHJvdyBuZXcgRXJyb3IoICdjYWxsIHRvIGFic3RyYWN0IG1ldGhvZCcgKTtcclxuXHRcdC8vIGltcGxlbWVudGF0aW9ucyBzaGFsbCByZXR1cm4gdGhpcy5yZXN1bHRCdWZmZXJcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBPcHRpb25hbCBtZXRob2QgdGhhdCBpcyBleGVjdXRlZCB3aGVuIHRoZSBpbnRlcnZhbCBoYXMgY2hhbmdlZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpMSAtIEFuIGluZGV4IGludG8gdGhlIHNhbXBsZSB2YWx1ZSBidWZmZXIuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHQwIC0gVGhlIHByZXZpb3VzIGludGVycG9sYXRpb24gZmFjdG9yLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0IC0gVGhlIGN1cnJlbnQgaW50ZXJwb2xhdGlvbiBmYWN0b3IuXHJcblx0ICovXHJcblx0aW50ZXJ2YWxDaGFuZ2VkXyggLyogaTEsIHQwLCB0MSAqLyApIHtcclxuXHJcblx0XHQvLyBlbXB0eVxyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBJbnRlcnBvbGFudCB9O1xyXG4iLCJpbXBvcnQgeyBaZXJvQ3VydmF0dXJlRW5kaW5nLCBXcmFwQXJvdW5kRW5kaW5nLCBaZXJvU2xvcGVFbmRpbmcgfSBmcm9tICcuLi8uLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBJbnRlcnBvbGFudCB9IGZyb20gJy4uL0ludGVycG9sYW50LmpzJztcclxuXHJcbi8qKlxyXG4gKiBGYXN0IGFuZCBzaW1wbGUgY3ViaWMgc3BsaW5lIGludGVycG9sYW50LlxyXG4gKlxyXG4gKiBJdCB3YXMgZGVyaXZlZCBmcm9tIGEgSGVybWl0aWFuIGNvbnN0cnVjdGlvbiBzZXR0aW5nIHRoZSBmaXJzdCBkZXJpdmF0aXZlXHJcbiAqIGF0IGVhY2ggc2FtcGxlIHBvc2l0aW9uIHRvIHRoZSBsaW5lYXIgc2xvcGUgYmV0d2VlbiBuZWlnaGJvcmluZyBwb3NpdGlvbnNcclxuICogb3ZlciB0aGVpciBwYXJhbWV0ZXIgaW50ZXJ2YWwuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBJbnRlcnBvbGFudFxyXG4gKi9cclxuY2xhc3MgQ3ViaWNJbnRlcnBvbGFudCBleHRlbmRzIEludGVycG9sYW50IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBjdWJpYyBpbnRlcnBvbGFudC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VHlwZWRBcnJheX0gcGFyYW1ldGVyUG9zaXRpb25zIC0gVGhlIHBhcmFtZXRlciBwb3NpdGlvbnMgaG9sZCB0aGUgaW50ZXJwb2xhdGlvbiBmYWN0b3JzLlxyXG5cdCAqIEBwYXJhbSB7VHlwZWRBcnJheX0gc2FtcGxlVmFsdWVzIC0gVGhlIHNhbXBsZSB2YWx1ZXMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHNhbXBsZVNpemUgLSBUaGUgc2FtcGxlIHNpemVcclxuXHQgKiBAcGFyYW0ge1R5cGVkQXJyYXl9IFtyZXN1bHRCdWZmZXJdIC0gVGhlIHJlc3VsdCBidWZmZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKSB7XHJcblxyXG5cdFx0c3VwZXIoIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKTtcclxuXHJcblx0XHR0aGlzLl93ZWlnaHRQcmV2ID0gLSAwO1xyXG5cdFx0dGhpcy5fb2Zmc2V0UHJldiA9IC0gMDtcclxuXHRcdHRoaXMuX3dlaWdodE5leHQgPSAtIDA7XHJcblx0XHR0aGlzLl9vZmZzZXROZXh0ID0gLSAwO1xyXG5cclxuXHRcdHRoaXMuRGVmYXVsdFNldHRpbmdzXyA9IHtcclxuXHJcblx0XHRcdGVuZGluZ1N0YXJ0OiBaZXJvQ3VydmF0dXJlRW5kaW5nLFxyXG5cdFx0XHRlbmRpbmdFbmQ6IFplcm9DdXJ2YXR1cmVFbmRpbmdcclxuXHJcblx0XHR9O1xyXG5cclxuXHR9XHJcblxyXG5cdGludGVydmFsQ2hhbmdlZF8oIGkxLCB0MCwgdDEgKSB7XHJcblxyXG5cdFx0Y29uc3QgcHAgPSB0aGlzLnBhcmFtZXRlclBvc2l0aW9ucztcclxuXHRcdGxldCBpUHJldiA9IGkxIC0gMixcclxuXHRcdFx0aU5leHQgPSBpMSArIDEsXHJcblxyXG5cdFx0XHR0UHJldiA9IHBwWyBpUHJldiBdLFxyXG5cdFx0XHR0TmV4dCA9IHBwWyBpTmV4dCBdO1xyXG5cclxuXHRcdGlmICggdFByZXYgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHN3aXRjaCAoIHRoaXMuZ2V0U2V0dGluZ3NfKCkuZW5kaW5nU3RhcnQgKSB7XHJcblxyXG5cdFx0XHRcdGNhc2UgWmVyb1Nsb3BlRW5kaW5nOlxyXG5cclxuXHRcdFx0XHRcdC8vIGYnKHQwKSA9IDBcclxuXHRcdFx0XHRcdGlQcmV2ID0gaTE7XHJcblx0XHRcdFx0XHR0UHJldiA9IDIgKiB0MCAtIHQxO1xyXG5cclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRjYXNlIFdyYXBBcm91bmRFbmRpbmc6XHJcblxyXG5cdFx0XHRcdFx0Ly8gdXNlIHRoZSBvdGhlciBlbmQgb2YgdGhlIGN1cnZlXHJcblx0XHRcdFx0XHRpUHJldiA9IHBwLmxlbmd0aCAtIDI7XHJcblx0XHRcdFx0XHR0UHJldiA9IHQwICsgcHBbIGlQcmV2IF0gLSBwcFsgaVByZXYgKyAxIF07XHJcblxyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdGRlZmF1bHQ6IC8vIFplcm9DdXJ2YXR1cmVFbmRpbmdcclxuXHJcblx0XHRcdFx0XHQvLyBmJycodDApID0gMCBhLmsuYS4gTmF0dXJhbCBTcGxpbmVcclxuXHRcdFx0XHRcdGlQcmV2ID0gaTE7XHJcblx0XHRcdFx0XHR0UHJldiA9IHQxO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHROZXh0ID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRzd2l0Y2ggKCB0aGlzLmdldFNldHRpbmdzXygpLmVuZGluZ0VuZCApIHtcclxuXHJcblx0XHRcdFx0Y2FzZSBaZXJvU2xvcGVFbmRpbmc6XHJcblxyXG5cdFx0XHRcdFx0Ly8gZicodE4pID0gMFxyXG5cdFx0XHRcdFx0aU5leHQgPSBpMTtcclxuXHRcdFx0XHRcdHROZXh0ID0gMiAqIHQxIC0gdDA7XHJcblxyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdGNhc2UgV3JhcEFyb3VuZEVuZGluZzpcclxuXHJcblx0XHRcdFx0XHQvLyB1c2UgdGhlIG90aGVyIGVuZCBvZiB0aGUgY3VydmVcclxuXHRcdFx0XHRcdGlOZXh0ID0gMTtcclxuXHRcdFx0XHRcdHROZXh0ID0gdDEgKyBwcFsgMSBdIC0gcHBbIDAgXTtcclxuXHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0ZGVmYXVsdDogLy8gWmVyb0N1cnZhdHVyZUVuZGluZ1xyXG5cclxuXHRcdFx0XHRcdC8vIGYnJyh0TikgPSAwLCBhLmsuYS4gTmF0dXJhbCBTcGxpbmVcclxuXHRcdFx0XHRcdGlOZXh0ID0gaTEgLSAxO1xyXG5cdFx0XHRcdFx0dE5leHQgPSB0MDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgaGFsZkR0ID0gKCB0MSAtIHQwICkgKiAwLjUsXHJcblx0XHRcdHN0cmlkZSA9IHRoaXMudmFsdWVTaXplO1xyXG5cclxuXHRcdHRoaXMuX3dlaWdodFByZXYgPSBoYWxmRHQgLyAoIHQwIC0gdFByZXYgKTtcclxuXHRcdHRoaXMuX3dlaWdodE5leHQgPSBoYWxmRHQgLyAoIHROZXh0IC0gdDEgKTtcclxuXHRcdHRoaXMuX29mZnNldFByZXYgPSBpUHJldiAqIHN0cmlkZTtcclxuXHRcdHRoaXMuX29mZnNldE5leHQgPSBpTmV4dCAqIHN0cmlkZTtcclxuXHJcblx0fVxyXG5cclxuXHRpbnRlcnBvbGF0ZV8oIGkxLCB0MCwgdCwgdDEgKSB7XHJcblxyXG5cdFx0Y29uc3QgcmVzdWx0ID0gdGhpcy5yZXN1bHRCdWZmZXIsXHJcblx0XHRcdHZhbHVlcyA9IHRoaXMuc2FtcGxlVmFsdWVzLFxyXG5cdFx0XHRzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSxcclxuXHJcblx0XHRcdG8xID0gaTEgKiBzdHJpZGUsXHRcdG8wID0gbzEgLSBzdHJpZGUsXHJcblx0XHRcdG9QID0gdGhpcy5fb2Zmc2V0UHJldiwgXHRvTiA9IHRoaXMuX29mZnNldE5leHQsXHJcblx0XHRcdHdQID0gdGhpcy5fd2VpZ2h0UHJldixcdHdOID0gdGhpcy5fd2VpZ2h0TmV4dCxcclxuXHJcblx0XHRcdHAgPSAoIHQgLSB0MCApIC8gKCB0MSAtIHQwICksXHJcblx0XHRcdHBwID0gcCAqIHAsXHJcblx0XHRcdHBwcCA9IHBwICogcDtcclxuXHJcblx0XHQvLyBldmFsdWF0ZSBwb2x5bm9taWFsc1xyXG5cclxuXHRcdGNvbnN0IHNQID0gLSB3UCAqIHBwcCArIDIgKiB3UCAqIHBwIC0gd1AgKiBwO1xyXG5cdFx0Y29uc3QgczAgPSAoIDEgKyB3UCApICogcHBwICsgKCAtIDEuNSAtIDIgKiB3UCApICogcHAgKyAoIC0gMC41ICsgd1AgKSAqIHAgKyAxO1xyXG5cdFx0Y29uc3QgczEgPSAoIC0gMSAtIHdOICkgKiBwcHAgKyAoIDEuNSArIHdOICkgKiBwcCArIDAuNSAqIHA7XHJcblx0XHRjb25zdCBzTiA9IHdOICogcHBwIC0gd04gKiBwcDtcclxuXHJcblx0XHQvLyBjb21iaW5lIGRhdGEgbGluZWFybHlcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgIT09IHN0cmlkZTsgKysgaSApIHtcclxuXHJcblx0XHRcdHJlc3VsdFsgaSBdID1cclxuXHRcdFx0XHRcdHNQICogdmFsdWVzWyBvUCArIGkgXSArXHJcblx0XHRcdFx0XHRzMCAqIHZhbHVlc1sgbzAgKyBpIF0gK1xyXG5cdFx0XHRcdFx0czEgKiB2YWx1ZXNbIG8xICsgaSBdICtcclxuXHRcdFx0XHRcdHNOICogdmFsdWVzWyBvTiArIGkgXTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgQ3ViaWNJbnRlcnBvbGFudCB9O1xyXG4iLCJpbXBvcnQgeyBJbnRlcnBvbGFudCB9IGZyb20gJy4uL0ludGVycG9sYW50LmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIGJhc2ljIGxpbmVhciBpbnRlcnBvbGFudC5cclxuICpcclxuICogQGF1Z21lbnRzIEludGVycG9sYW50XHJcbiAqL1xyXG5jbGFzcyBMaW5lYXJJbnRlcnBvbGFudCBleHRlbmRzIEludGVycG9sYW50IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBsaW5lYXIgaW50ZXJwb2xhbnQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1R5cGVkQXJyYXl9IHBhcmFtZXRlclBvc2l0aW9ucyAtIFRoZSBwYXJhbWV0ZXIgcG9zaXRpb25zIGhvbGQgdGhlIGludGVycG9sYXRpb24gZmFjdG9ycy5cclxuXHQgKiBAcGFyYW0ge1R5cGVkQXJyYXl9IHNhbXBsZVZhbHVlcyAtIFRoZSBzYW1wbGUgdmFsdWVzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzYW1wbGVTaXplIC0gVGhlIHNhbXBsZSBzaXplXHJcblx0ICogQHBhcmFtIHtUeXBlZEFycmF5fSBbcmVzdWx0QnVmZmVyXSAtIFRoZSByZXN1bHQgYnVmZmVyLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICkge1xyXG5cclxuXHRcdHN1cGVyKCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICk7XHJcblxyXG5cdH1cclxuXHJcblx0aW50ZXJwb2xhdGVfKCBpMSwgdDAsIHQsIHQxICkge1xyXG5cclxuXHRcdGNvbnN0IHJlc3VsdCA9IHRoaXMucmVzdWx0QnVmZmVyLFxyXG5cdFx0XHR2YWx1ZXMgPSB0aGlzLnNhbXBsZVZhbHVlcyxcclxuXHRcdFx0c3RyaWRlID0gdGhpcy52YWx1ZVNpemUsXHJcblxyXG5cdFx0XHRvZmZzZXQxID0gaTEgKiBzdHJpZGUsXHJcblx0XHRcdG9mZnNldDAgPSBvZmZzZXQxIC0gc3RyaWRlLFxyXG5cclxuXHRcdFx0d2VpZ2h0MSA9ICggdCAtIHQwICkgLyAoIHQxIC0gdDAgKSxcclxuXHRcdFx0d2VpZ2h0MCA9IDEgLSB3ZWlnaHQxO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSAhPT0gc3RyaWRlOyArKyBpICkge1xyXG5cclxuXHRcdFx0cmVzdWx0WyBpIF0gPVxyXG5cdFx0XHRcdFx0dmFsdWVzWyBvZmZzZXQwICsgaSBdICogd2VpZ2h0MCArXHJcblx0XHRcdFx0XHR2YWx1ZXNbIG9mZnNldDEgKyBpIF0gKiB3ZWlnaHQxO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgTGluZWFySW50ZXJwb2xhbnQgfTtcclxuIiwiaW1wb3J0IHsgSW50ZXJwb2xhbnQgfSBmcm9tICcuLi9JbnRlcnBvbGFudC5qcyc7XHJcblxyXG4vKipcclxuICogSW50ZXJwb2xhbnQgdGhhdCBldmFsdWF0ZXMgdG8gdGhlIHNhbXBsZSB2YWx1ZSBhdCB0aGUgcG9zaXRpb24gcHJlY2VkaW5nXHJcbiAqIHRoZSBwYXJhbWV0ZXIuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBJbnRlcnBvbGFudFxyXG4gKi9cclxuY2xhc3MgRGlzY3JldGVJbnRlcnBvbGFudCBleHRlbmRzIEludGVycG9sYW50IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBkaXNjcmV0ZSBpbnRlcnBvbGFudC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VHlwZWRBcnJheX0gcGFyYW1ldGVyUG9zaXRpb25zIC0gVGhlIHBhcmFtZXRlciBwb3NpdGlvbnMgaG9sZCB0aGUgaW50ZXJwb2xhdGlvbiBmYWN0b3JzLlxyXG5cdCAqIEBwYXJhbSB7VHlwZWRBcnJheX0gc2FtcGxlVmFsdWVzIC0gVGhlIHNhbXBsZSB2YWx1ZXMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHNhbXBsZVNpemUgLSBUaGUgc2FtcGxlIHNpemVcclxuXHQgKiBAcGFyYW0ge1R5cGVkQXJyYXl9IFtyZXN1bHRCdWZmZXJdIC0gVGhlIHJlc3VsdCBidWZmZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKSB7XHJcblxyXG5cdFx0c3VwZXIoIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHRpbnRlcnBvbGF0ZV8oIGkxIC8qLCB0MCwgdCwgdDEgKi8gKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuY29weVNhbXBsZVZhbHVlXyggaTEgLSAxICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBEaXNjcmV0ZUludGVycG9sYW50IH07XHJcbiIsImltcG9ydCB7XHJcblx0SW50ZXJwb2xhdGVMaW5lYXIsXHJcblx0SW50ZXJwb2xhdGVTbW9vdGgsXHJcblx0SW50ZXJwb2xhdGVEaXNjcmV0ZVxyXG59IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IEN1YmljSW50ZXJwb2xhbnQgfSBmcm9tICcuLi9tYXRoL2ludGVycG9sYW50cy9DdWJpY0ludGVycG9sYW50LmpzJztcclxuaW1wb3J0IHsgTGluZWFySW50ZXJwb2xhbnQgfSBmcm9tICcuLi9tYXRoL2ludGVycG9sYW50cy9MaW5lYXJJbnRlcnBvbGFudC5qcyc7XHJcbmltcG9ydCB7IERpc2NyZXRlSW50ZXJwb2xhbnQgfSBmcm9tICcuLi9tYXRoL2ludGVycG9sYW50cy9EaXNjcmV0ZUludGVycG9sYW50LmpzJztcclxuaW1wb3J0ICogYXMgQW5pbWF0aW9uVXRpbHMgZnJvbSAnLi9BbmltYXRpb25VdGlscy5qcyc7XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyBzIGEgdGltZWQgc2VxdWVuY2Ugb2Yga2V5ZnJhbWVzLCB3aGljaCBhcmUgY29tcG9zZWQgb2YgbGlzdHMgb2ZcclxuICogdGltZXMgYW5kIHJlbGF0ZWQgdmFsdWVzLCBhbmQgd2hpY2ggYXJlIHVzZWQgdG8gYW5pbWF0ZSBhIHNwZWNpZmljIHByb3BlcnR5XHJcbiAqIG9mIGFuIG9iamVjdC5cclxuICovXHJcbmNsYXNzIEtleWZyYW1lVHJhY2sge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGtleWZyYW1lIHRyYWNrLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUga2V5ZnJhbWUgdHJhY2sncyBuYW1lLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gdGltZXMgLSBBIGxpc3Qgb2Yga2V5ZnJhbWUgdGltZXMuXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSB2YWx1ZXMgLSBBIGxpc3Qgb2Yga2V5ZnJhbWUgdmFsdWVzLlxyXG5cdCAqIEBwYXJhbSB7KEludGVycG9sYXRlTGluZWFyfEludGVycG9sYXRlRGlzY3JldGV8SW50ZXJwb2xhdGVTbW9vdGgpfSBbaW50ZXJwb2xhdGlvbl0gLSBUaGUgaW50ZXJwb2xhdGlvbiB0eXBlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICkge1xyXG5cclxuXHRcdGlmICggbmFtZSA9PT0gdW5kZWZpbmVkICkgdGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogdHJhY2sgbmFtZSBpcyB1bmRlZmluZWQnICk7XHJcblx0XHRpZiAoIHRpbWVzID09PSB1bmRlZmluZWQgfHwgdGltZXMubGVuZ3RoID09PSAwICkgdGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogbm8ga2V5ZnJhbWVzIGluIHRyYWNrIG5hbWVkICcgKyBuYW1lICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdHJhY2sncyBuYW1lIGNhbiByZWZlciB0byBtb3JwaCB0YXJnZXRzIG9yIGJvbmVzIG9yXHJcblx0XHQgKiBwb3NzaWJseSBvdGhlciB2YWx1ZXMgd2l0aGluIGFuIGFuaW1hdGVkIG9iamVjdC4gU2VlIHtAbGluayBQcm9wZXJ0eUJpbmRpbmcjcGFyc2VUcmFja05hbWV9XHJcblx0XHQgKiBmb3IgdGhlIGZvcm1zIG9mIHN0cmluZ3MgdGhhdCBjYW4gYmUgcGFyc2VkIGZvciBwcm9wZXJ0eSBiaW5kaW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubmFtZSA9IG5hbWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUga2V5ZnJhbWUgdGltZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0Zsb2F0MzJBcnJheX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50aW1lcyA9IEFuaW1hdGlvblV0aWxzLmNvbnZlcnRBcnJheSggdGltZXMsIHRoaXMuVGltZUJ1ZmZlclR5cGUgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBrZXlmcmFtZSB2YWx1ZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0Zsb2F0MzJBcnJheX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52YWx1ZXMgPSBBbmltYXRpb25VdGlscy5jb252ZXJ0QXJyYXkoIHZhbHVlcywgdGhpcy5WYWx1ZUJ1ZmZlclR5cGUgKTtcclxuXHJcblx0XHR0aGlzLnNldEludGVycG9sYXRpb24oIGludGVycG9sYXRpb24gfHwgdGhpcy5EZWZhdWx0SW50ZXJwb2xhdGlvbiApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnZlcnRzIHRoZSBrZXlmcmFtZSB0cmFjayB0byBKU09OLlxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEBwYXJhbSB7S2V5ZnJhbWVUcmFja30gdHJhY2sgLSBUaGUga2V5ZnJhbWUgdHJhY2sgdG8gc2VyaWFsaXplLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdH0gVGhlIHNlcmlhbGl6ZWQga2V5ZnJhbWUgdHJhY2sgYXMgSlNPTi5cclxuXHQgKi9cclxuXHRzdGF0aWMgdG9KU09OKCB0cmFjayApIHtcclxuXHJcblx0XHRjb25zdCB0cmFja1R5cGUgPSB0cmFjay5jb25zdHJ1Y3RvcjtcclxuXHJcblx0XHRsZXQganNvbjtcclxuXHJcblx0XHQvLyBkZXJpdmVkIGNsYXNzZXMgY2FuIGRlZmluZSBhIHN0YXRpYyB0b0pTT04gbWV0aG9kXHJcblx0XHRpZiAoIHRyYWNrVHlwZS50b0pTT04gIT09IHRoaXMudG9KU09OICkge1xyXG5cclxuXHRcdFx0anNvbiA9IHRyYWNrVHlwZS50b0pTT04oIHRyYWNrICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdC8vIGJ5IGRlZmF1bHQsIHdlIGFzc3VtZSB0aGUgZGF0YSBjYW4gYmUgc2VyaWFsaXplZCBhcy1pc1xyXG5cdFx0XHRqc29uID0ge1xyXG5cclxuXHRcdFx0XHQnbmFtZSc6IHRyYWNrLm5hbWUsXHJcblx0XHRcdFx0J3RpbWVzJzogQW5pbWF0aW9uVXRpbHMuY29udmVydEFycmF5KCB0cmFjay50aW1lcywgQXJyYXkgKSxcclxuXHRcdFx0XHQndmFsdWVzJzogQW5pbWF0aW9uVXRpbHMuY29udmVydEFycmF5KCB0cmFjay52YWx1ZXMsIEFycmF5IClcclxuXHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHRjb25zdCBpbnRlcnBvbGF0aW9uID0gdHJhY2suZ2V0SW50ZXJwb2xhdGlvbigpO1xyXG5cclxuXHRcdFx0aWYgKCBpbnRlcnBvbGF0aW9uICE9PSB0cmFjay5EZWZhdWx0SW50ZXJwb2xhdGlvbiApIHtcclxuXHJcblx0XHRcdFx0anNvbi5pbnRlcnBvbGF0aW9uID0gaW50ZXJwb2xhdGlvbjtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0anNvbi50eXBlID0gdHJhY2suVmFsdWVUeXBlTmFtZTsgLy8gbWFuZGF0b3J5XHJcblxyXG5cdFx0cmV0dXJuIGpzb247XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRmFjdG9yeSBtZXRob2QgZm9yIGNyZWF0aW5nIGEgbmV3IGRpc2NyZXRlIGludGVycG9sYW50LlxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEBwYXJhbSB7VHlwZWRBcnJheX0gW3Jlc3VsdF0gLSBUaGUgcmVzdWx0IGJ1ZmZlci5cclxuXHQgKiBAcmV0dXJuIHtEaXNjcmV0ZUludGVycG9sYW50fSBUaGUgbmV3IGludGVycG9sYW50LlxyXG5cdCAqL1xyXG5cdEludGVycG9sYW50RmFjdG9yeU1ldGhvZERpc2NyZXRlKCByZXN1bHQgKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBEaXNjcmV0ZUludGVycG9sYW50KCB0aGlzLnRpbWVzLCB0aGlzLnZhbHVlcywgdGhpcy5nZXRWYWx1ZVNpemUoKSwgcmVzdWx0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRmFjdG9yeSBtZXRob2QgZm9yIGNyZWF0aW5nIGEgbmV3IGxpbmVhciBpbnRlcnBvbGFudC5cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAcGFyYW0ge1R5cGVkQXJyYXl9IFtyZXN1bHRdIC0gVGhlIHJlc3VsdCBidWZmZXIuXHJcblx0ICogQHJldHVybiB7TGluZWFySW50ZXJwb2xhbnR9IFRoZSBuZXcgaW50ZXJwb2xhbnQuXHJcblx0ICovXHJcblx0SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyKCByZXN1bHQgKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBMaW5lYXJJbnRlcnBvbGFudCggdGhpcy50aW1lcywgdGhpcy52YWx1ZXMsIHRoaXMuZ2V0VmFsdWVTaXplKCksIHJlc3VsdCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyBhIG5ldyBzbW9vdGggaW50ZXJwb2xhbnQuXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQHBhcmFtIHtUeXBlZEFycmF5fSBbcmVzdWx0XSAtIFRoZSByZXN1bHQgYnVmZmVyLlxyXG5cdCAqIEByZXR1cm4ge0N1YmljSW50ZXJwb2xhbnR9IFRoZSBuZXcgaW50ZXJwb2xhbnQuXHJcblx0ICovXHJcblx0SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoKCByZXN1bHQgKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBDdWJpY0ludGVycG9sYW50KCB0aGlzLnRpbWVzLCB0aGlzLnZhbHVlcywgdGhpcy5nZXRWYWx1ZVNpemUoKSwgcmVzdWx0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVmaW5lcyB0aGUgaW50ZXJwb2xhdGlvbiBmYWN0b3IgbWV0aG9kIGZvciB0aGlzIGtleWZyYW1lIHRyYWNrLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHsoSW50ZXJwb2xhdGVMaW5lYXJ8SW50ZXJwb2xhdGVEaXNjcmV0ZXxJbnRlcnBvbGF0ZVNtb290aCl9IGludGVycG9sYXRpb24gLSBUaGUgaW50ZXJwb2xhdGlvbiB0eXBlLlxyXG5cdCAqIEByZXR1cm4ge0tleWZyYW1lVHJhY2t9IEEgcmVmZXJlbmNlIHRvIHRoaXMga2V5ZnJhbWUgdHJhY2suXHJcblx0ICovXHJcblx0c2V0SW50ZXJwb2xhdGlvbiggaW50ZXJwb2xhdGlvbiApIHtcclxuXHJcblx0XHRsZXQgZmFjdG9yeU1ldGhvZDtcclxuXHJcblx0XHRzd2l0Y2ggKCBpbnRlcnBvbGF0aW9uICkge1xyXG5cclxuXHRcdFx0Y2FzZSBJbnRlcnBvbGF0ZURpc2NyZXRlOlxyXG5cclxuXHRcdFx0XHRmYWN0b3J5TWV0aG9kID0gdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZTtcclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIEludGVycG9sYXRlTGluZWFyOlxyXG5cclxuXHRcdFx0XHRmYWN0b3J5TWV0aG9kID0gdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI7XHJcblxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBJbnRlcnBvbGF0ZVNtb290aDpcclxuXHJcblx0XHRcdFx0ZmFjdG9yeU1ldGhvZCA9IHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoO1xyXG5cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBmYWN0b3J5TWV0aG9kID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBtZXNzYWdlID0gJ3Vuc3VwcG9ydGVkIGludGVycG9sYXRpb24gZm9yICcgK1xyXG5cdFx0XHRcdHRoaXMuVmFsdWVUeXBlTmFtZSArICcga2V5ZnJhbWUgdHJhY2sgbmFtZWQgJyArIHRoaXMubmFtZTtcclxuXHJcblx0XHRcdGlmICggdGhpcy5jcmVhdGVJbnRlcnBvbGFudCA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHQvLyBmYWxsIGJhY2sgdG8gZGVmYXVsdCwgdW5sZXNzIHRoZSBkZWZhdWx0IGl0c2VsZiBpcyBtZXNzZWQgdXBcclxuXHRcdFx0XHRpZiAoIGludGVycG9sYXRpb24gIT09IHRoaXMuRGVmYXVsdEludGVycG9sYXRpb24gKSB7XHJcblxyXG5cdFx0XHRcdFx0dGhpcy5zZXRJbnRlcnBvbGF0aW9uKCB0aGlzLkRlZmF1bHRJbnRlcnBvbGF0aW9uICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCBtZXNzYWdlICk7IC8vIGZhdGFsLCBpbiB0aGlzIGNhc2VcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazonLCBtZXNzYWdlICk7XHJcblx0XHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmNyZWF0ZUludGVycG9sYW50ID0gZmFjdG9yeU1ldGhvZDtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGludGVycG9sYXRpb24gdHlwZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4geyhJbnRlcnBvbGF0ZUxpbmVhcnxJbnRlcnBvbGF0ZURpc2NyZXRlfEludGVycG9sYXRlU21vb3RoKX0gVGhlIGludGVycG9sYXRpb24gdHlwZS5cclxuXHQgKi9cclxuXHRnZXRJbnRlcnBvbGF0aW9uKCkge1xyXG5cclxuXHRcdHN3aXRjaCAoIHRoaXMuY3JlYXRlSW50ZXJwb2xhbnQgKSB7XHJcblxyXG5cdFx0XHRjYXNlIHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kRGlzY3JldGU6XHJcblxyXG5cdFx0XHRcdHJldHVybiBJbnRlcnBvbGF0ZURpc2NyZXRlO1xyXG5cclxuXHRcdFx0Y2FzZSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjpcclxuXHJcblx0XHRcdFx0cmV0dXJuIEludGVycG9sYXRlTGluZWFyO1xyXG5cclxuXHRcdFx0Y2FzZSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDpcclxuXHJcblx0XHRcdFx0cmV0dXJuIEludGVycG9sYXRlU21vb3RoO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSB2YWx1ZSBzaXplLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgdmFsdWUgc2l6ZS5cclxuXHQgKi9cclxuXHRnZXRWYWx1ZVNpemUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMudmFsdWVzLmxlbmd0aCAvIHRoaXMudGltZXMubGVuZ3RoO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE1vdmVzIGFsbCBrZXlmcmFtZXMgZWl0aGVyIGZvcndhcmQgb3IgYmFja3dhcmQgaW4gdGltZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lT2Zmc2V0IC0gVGhlIG9mZnNldCB0byBtb3ZlIHRoZSB0aW1lIHZhbHVlcy5cclxuXHQgKiBAcmV0dXJuIHtLZXlmcmFtZVRyYWNrfSBBIHJlZmVyZW5jZSB0byB0aGlzIGtleWZyYW1lIHRyYWNrLlxyXG5cdCAqL1xyXG5cdHNoaWZ0KCB0aW1lT2Zmc2V0ICkge1xyXG5cclxuXHRcdGlmICggdGltZU9mZnNldCAhPT0gMC4wICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdGltZXMgPSB0aGlzLnRpbWVzO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBuID0gdGltZXMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xyXG5cclxuXHRcdFx0XHR0aW1lc1sgaSBdICs9IHRpbWVPZmZzZXQ7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNjYWxlIGFsbCBrZXlmcmFtZSB0aW1lcyBieSBhIGZhY3RvciAodXNlZnVsIGZvciBmcmFtZSAtIHNlY29uZHMgY29udmVyc2lvbnMpLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHRpbWVTY2FsZSAtIFRoZSB0aW1lIHNjYWxlLlxyXG5cdCAqIEByZXR1cm4ge0tleWZyYW1lVHJhY2t9IEEgcmVmZXJlbmNlIHRvIHRoaXMga2V5ZnJhbWUgdHJhY2suXHJcblx0ICovXHJcblx0c2NhbGUoIHRpbWVTY2FsZSApIHtcclxuXHJcblx0XHRpZiAoIHRpbWVTY2FsZSAhPT0gMS4wICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdGltZXMgPSB0aGlzLnRpbWVzO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBuID0gdGltZXMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xyXG5cclxuXHRcdFx0XHR0aW1lc1sgaSBdICo9IHRpbWVTY2FsZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVtb3ZlcyBrZXlmcmFtZXMgYmVmb3JlIGFuZCBhZnRlciBhbmltYXRpb24gd2l0aG91dCBjaGFuZ2luZyBhbnkgdmFsdWVzIHdpdGhpbiB0aGUgZGVmaW5lZCB0aW1lIHJhbmdlLlxyXG5cdCAqXHJcblx0ICogTm90ZTogVGhlIG1ldGhvZCBkb2VzIG5vdCBzaGlmdCBhcm91bmQga2V5cyB0byB0aGUgc3RhcnQgb2YgdGhlIHRyYWNrIHRpbWUsIGJlY2F1c2UgZm9yIGludGVycG9sYXRlZFxyXG5cdCAqIGtleXMgdGhpcyB3aWxsIGNoYW5nZSB0aGVpciB2YWx1ZXNcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydFRpbWUgLSBUaGUgc3RhcnQgdGltZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZW5kVGltZSAtIFRoZSBlbmQgdGltZS5cclxuXHQgKiBAcmV0dXJuIHtLZXlmcmFtZVRyYWNrfSBBIHJlZmVyZW5jZSB0byB0aGlzIGtleWZyYW1lIHRyYWNrLlxyXG5cdCAqL1xyXG5cdHRyaW0oIHN0YXJ0VGltZSwgZW5kVGltZSApIHtcclxuXHJcblx0XHRjb25zdCB0aW1lcyA9IHRoaXMudGltZXMsXHJcblx0XHRcdG5LZXlzID0gdGltZXMubGVuZ3RoO1xyXG5cclxuXHRcdGxldCBmcm9tID0gMCxcclxuXHRcdFx0dG8gPSBuS2V5cyAtIDE7XHJcblxyXG5cdFx0d2hpbGUgKCBmcm9tICE9PSBuS2V5cyAmJiB0aW1lc1sgZnJvbSBdIDwgc3RhcnRUaW1lICkge1xyXG5cclxuXHRcdFx0KysgZnJvbTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0d2hpbGUgKCB0byAhPT0gLSAxICYmIHRpbWVzWyB0byBdID4gZW5kVGltZSApIHtcclxuXHJcblx0XHRcdC0tIHRvO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQrKyB0bzsgLy8gaW5jbHVzaXZlIC0+IGV4Y2x1c2l2ZSBib3VuZFxyXG5cclxuXHRcdGlmICggZnJvbSAhPT0gMCB8fCB0byAhPT0gbktleXMgKSB7XHJcblxyXG5cdFx0XHQvLyBlbXB0eSB0cmFja3MgYXJlIGZvcmJpZGRlbiwgc28ga2VlcCBhdCBsZWFzdCBvbmUga2V5ZnJhbWVcclxuXHRcdFx0aWYgKCBmcm9tID49IHRvICkge1xyXG5cclxuXHRcdFx0XHR0byA9IE1hdGgubWF4KCB0bywgMSApO1xyXG5cdFx0XHRcdGZyb20gPSB0byAtIDE7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBzdHJpZGUgPSB0aGlzLmdldFZhbHVlU2l6ZSgpO1xyXG5cdFx0XHR0aGlzLnRpbWVzID0gdGltZXMuc2xpY2UoIGZyb20sIHRvICk7XHJcblx0XHRcdHRoaXMudmFsdWVzID0gdGhpcy52YWx1ZXMuc2xpY2UoIGZyb20gKiBzdHJpZGUsIHRvICogc3RyaWRlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBlcmZvcm1zIG1pbmltYWwgdmFsaWRhdGlvbiBvbiB0aGUga2V5ZnJhbWUgdHJhY2suIFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZXNcclxuXHQgKiBhcmUgdmFsaWQuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBrZXlmcmFtZXMgYXJlIHZhbGlkIG9yIG5vdC5cclxuXHQgKi9cclxuXHR2YWxpZGF0ZSgpIHtcclxuXHJcblx0XHRsZXQgdmFsaWQgPSB0cnVlO1xyXG5cclxuXHRcdGNvbnN0IHZhbHVlU2l6ZSA9IHRoaXMuZ2V0VmFsdWVTaXplKCk7XHJcblx0XHRpZiAoIHZhbHVlU2l6ZSAtIE1hdGguZmxvb3IoIHZhbHVlU2l6ZSApICE9PSAwICkge1xyXG5cclxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLktleWZyYW1lVHJhY2s6IEludmFsaWQgdmFsdWUgc2l6ZSBpbiB0cmFjay4nLCB0aGlzICk7XHJcblx0XHRcdHZhbGlkID0gZmFsc2U7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHRpbWVzID0gdGhpcy50aW1lcyxcclxuXHRcdFx0dmFsdWVzID0gdGhpcy52YWx1ZXMsXHJcblxyXG5cdFx0XHRuS2V5cyA9IHRpbWVzLmxlbmd0aDtcclxuXHJcblx0XHRpZiAoIG5LZXlzID09PSAwICkge1xyXG5cclxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLktleWZyYW1lVHJhY2s6IFRyYWNrIGlzIGVtcHR5LicsIHRoaXMgKTtcclxuXHRcdFx0dmFsaWQgPSBmYWxzZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0bGV0IHByZXZUaW1lID0gbnVsbDtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgIT09IG5LZXlzOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgY3VyclRpbWUgPSB0aW1lc1sgaSBdO1xyXG5cclxuXHRcdFx0aWYgKCB0eXBlb2YgY3VyclRpbWUgPT09ICdudW1iZXInICYmIGlzTmFOKCBjdXJyVGltZSApICkge1xyXG5cclxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogVGltZSBpcyBub3QgYSB2YWxpZCBudW1iZXIuJywgdGhpcywgaSwgY3VyclRpbWUgKTtcclxuXHRcdFx0XHR2YWxpZCA9IGZhbHNlO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBwcmV2VGltZSAhPT0gbnVsbCAmJiBwcmV2VGltZSA+IGN1cnJUaW1lICkge1xyXG5cclxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogT3V0IG9mIG9yZGVyIGtleXMuJywgdGhpcywgaSwgY3VyclRpbWUsIHByZXZUaW1lICk7XHJcblx0XHRcdFx0dmFsaWQgPSBmYWxzZTtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHByZXZUaW1lID0gY3VyclRpbWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdmFsdWVzICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRpZiAoIEFuaW1hdGlvblV0aWxzLmlzVHlwZWRBcnJheSggdmFsdWVzICkgKSB7XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMCwgbiA9IHZhbHVlcy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgdmFsdWUgPSB2YWx1ZXNbIGkgXTtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGlzTmFOKCB2YWx1ZSApICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLktleWZyYW1lVHJhY2s6IFZhbHVlIGlzIG5vdCBhIHZhbGlkIG51bWJlci4nLCB0aGlzLCBpLCB2YWx1ZSApO1xyXG5cdFx0XHRcdFx0XHR2YWxpZCA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHZhbGlkO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE9wdGltaXplcyB0aGlzIGtleWZyYW1lIHRyYWNrIGJ5IHJlbW92aW5nIGVxdWl2YWxlbnQgc2VxdWVudGlhbCBrZXlzICh3aGljaCBhcmVcclxuXHQgKiBjb21tb24gaW4gbW9ycGggdGFyZ2V0IHNlcXVlbmNlcykuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtBbmltYXRpb25DbGlwfSBBIHJlZmVyZW5jZSB0byB0aGlzIGFuaW1hdGlvbiBjbGlwLlxyXG5cdCAqL1xyXG5cdG9wdGltaXplKCkge1xyXG5cclxuXHRcdC8vICgwLDAsMCwwLDEsMSwxLDAsMCwwLDAsMCwwLDApIC0tPiAoMCwwLDEsMSwwLDApXHJcblxyXG5cdFx0Ly8gdGltZXMgb3IgdmFsdWVzIG1heSBiZSBzaGFyZWQgd2l0aCBvdGhlciB0cmFja3MsIHNvIG92ZXJ3cml0aW5nIGlzIHVuc2FmZVxyXG5cdFx0Y29uc3QgdGltZXMgPSB0aGlzLnRpbWVzLnNsaWNlKCksXHJcblx0XHRcdHZhbHVlcyA9IHRoaXMudmFsdWVzLnNsaWNlKCksXHJcblx0XHRcdHN0cmlkZSA9IHRoaXMuZ2V0VmFsdWVTaXplKCksXHJcblxyXG5cdFx0XHRzbW9vdGhJbnRlcnBvbGF0aW9uID0gdGhpcy5nZXRJbnRlcnBvbGF0aW9uKCkgPT09IEludGVycG9sYXRlU21vb3RoLFxyXG5cclxuXHRcdFx0bGFzdEluZGV4ID0gdGltZXMubGVuZ3RoIC0gMTtcclxuXHJcblx0XHRsZXQgd3JpdGVJbmRleCA9IDE7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAxOyBpIDwgbGFzdEluZGV4OyArKyBpICkge1xyXG5cclxuXHRcdFx0bGV0IGtlZXAgPSBmYWxzZTtcclxuXHJcblx0XHRcdGNvbnN0IHRpbWUgPSB0aW1lc1sgaSBdO1xyXG5cdFx0XHRjb25zdCB0aW1lTmV4dCA9IHRpbWVzWyBpICsgMSBdO1xyXG5cclxuXHRcdFx0Ly8gcmVtb3ZlIGFkamFjZW50IGtleWZyYW1lcyBzY2hlZHVsZWQgYXQgdGhlIHNhbWUgdGltZVxyXG5cclxuXHRcdFx0aWYgKCB0aW1lICE9PSB0aW1lTmV4dCAmJiAoIGkgIT09IDEgfHwgdGltZSAhPT0gdGltZXNbIDAgXSApICkge1xyXG5cclxuXHRcdFx0XHRpZiAoICEgc21vb3RoSW50ZXJwb2xhdGlvbiApIHtcclxuXHJcblx0XHRcdFx0XHQvLyByZW1vdmUgdW5uZWNlc3Nhcnkga2V5ZnJhbWVzIHNhbWUgYXMgdGhlaXIgbmVpZ2hib3JzXHJcblxyXG5cdFx0XHRcdFx0Y29uc3Qgb2Zmc2V0ID0gaSAqIHN0cmlkZSxcclxuXHRcdFx0XHRcdFx0b2Zmc2V0UCA9IG9mZnNldCAtIHN0cmlkZSxcclxuXHRcdFx0XHRcdFx0b2Zmc2V0TiA9IG9mZnNldCArIHN0cmlkZTtcclxuXHJcblx0XHRcdFx0XHRmb3IgKCBsZXQgaiA9IDA7IGogIT09IHN0cmlkZTsgKysgaiApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnN0IHZhbHVlID0gdmFsdWVzWyBvZmZzZXQgKyBqIF07XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIHZhbHVlICE9PSB2YWx1ZXNbIG9mZnNldFAgKyBqIF0gfHxcclxuXHRcdFx0XHRcdFx0XHR2YWx1ZSAhPT0gdmFsdWVzWyBvZmZzZXROICsgaiBdICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRrZWVwID0gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0a2VlcCA9IHRydWU7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIGluLXBsYWNlIGNvbXBhY3Rpb25cclxuXHJcblx0XHRcdGlmICgga2VlcCApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBpICE9PSB3cml0ZUluZGV4ICkge1xyXG5cclxuXHRcdFx0XHRcdHRpbWVzWyB3cml0ZUluZGV4IF0gPSB0aW1lc1sgaSBdO1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHJlYWRPZmZzZXQgPSBpICogc3RyaWRlLFxyXG5cdFx0XHRcdFx0XHR3cml0ZU9mZnNldCA9IHdyaXRlSW5kZXggKiBzdHJpZGU7XHJcblxyXG5cdFx0XHRcdFx0Zm9yICggbGV0IGogPSAwOyBqICE9PSBzdHJpZGU7ICsrIGogKSB7XHJcblxyXG5cdFx0XHRcdFx0XHR2YWx1ZXNbIHdyaXRlT2Zmc2V0ICsgaiBdID0gdmFsdWVzWyByZWFkT2Zmc2V0ICsgaiBdO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQrKyB3cml0ZUluZGV4O1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBmbHVzaCBsYXN0IGtleWZyYW1lIChjb21wYWN0aW9uIGxvb2tzIGFoZWFkKVxyXG5cclxuXHRcdGlmICggbGFzdEluZGV4ID4gMCApIHtcclxuXHJcblx0XHRcdHRpbWVzWyB3cml0ZUluZGV4IF0gPSB0aW1lc1sgbGFzdEluZGV4IF07XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgcmVhZE9mZnNldCA9IGxhc3RJbmRleCAqIHN0cmlkZSwgd3JpdGVPZmZzZXQgPSB3cml0ZUluZGV4ICogc3RyaWRlLCBqID0gMDsgaiAhPT0gc3RyaWRlOyArKyBqICkge1xyXG5cclxuXHRcdFx0XHR2YWx1ZXNbIHdyaXRlT2Zmc2V0ICsgaiBdID0gdmFsdWVzWyByZWFkT2Zmc2V0ICsgaiBdO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Kysgd3JpdGVJbmRleDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB3cml0ZUluZGV4ICE9PSB0aW1lcy5sZW5ndGggKSB7XHJcblxyXG5cdFx0XHR0aGlzLnRpbWVzID0gdGltZXMuc2xpY2UoIDAsIHdyaXRlSW5kZXggKTtcclxuXHRcdFx0dGhpcy52YWx1ZXMgPSB2YWx1ZXMuc2xpY2UoIDAsIHdyaXRlSW5kZXggKiBzdHJpZGUgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGhpcy50aW1lcyA9IHRpbWVzO1xyXG5cdFx0XHR0aGlzLnZhbHVlcyA9IHZhbHVlcztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIG5ldyBrZXlmcmFtZSB0cmFjayB3aXRoIGNvcGllZCB2YWx1ZXMgZnJvbSB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7S2V5ZnJhbWVUcmFja30gQSBjbG9uZSBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNsb25lKCkge1xyXG5cclxuXHRcdGNvbnN0IHRpbWVzID0gdGhpcy50aW1lcy5zbGljZSgpO1xyXG5cdFx0Y29uc3QgdmFsdWVzID0gdGhpcy52YWx1ZXMuc2xpY2UoKTtcclxuXHJcblx0XHRjb25zdCBUeXBlZEtleWZyYW1lVHJhY2sgPSB0aGlzLmNvbnN0cnVjdG9yO1xyXG5cdFx0Y29uc3QgdHJhY2sgPSBuZXcgVHlwZWRLZXlmcmFtZVRyYWNrKCB0aGlzLm5hbWUsIHRpbWVzLCB2YWx1ZXMgKTtcclxuXHJcblx0XHQvLyBJbnRlcnBvbGFudCBhcmd1bWVudCB0byBjb25zdHJ1Y3RvciBpcyBub3Qgc2F2ZWQsIHNvIGNvcHkgdGhlIGZhY3RvcnkgbWV0aG9kIGRpcmVjdGx5LlxyXG5cdFx0dHJhY2suY3JlYXRlSW50ZXJwb2xhbnQgPSB0aGlzLmNyZWF0ZUludGVycG9sYW50O1xyXG5cclxuXHRcdHJldHVybiB0cmFjaztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFRoZSB2YWx1ZSB0eXBlIG5hbWUuXHJcbiAqXHJcbiAqIEB0eXBlIHtTdHJpbmd9XHJcbiAqIEBkZWZhdWx0ICcnXHJcbiAqL1xyXG5LZXlmcmFtZVRyYWNrLnByb3RvdHlwZS5WYWx1ZVR5cGVOYW1lID0gJyc7XHJcblxyXG4vKipcclxuICogVGhlIHRpbWUgYnVmZmVyIHR5cGUgb2YgdGhpcyBrZXlmcmFtZSB0cmFjay5cclxuICpcclxuICogQHR5cGUge1R5cGVkQXJyYXl8QXJyYXl9XHJcbiAqIEBkZWZhdWx0IEZsb2F0MzJBcnJheS5jb25zdHJ1Y3RvclxyXG4gKi9cclxuS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUuVGltZUJ1ZmZlclR5cGUgPSBGbG9hdDMyQXJyYXk7XHJcblxyXG4vKipcclxuICogVGhlIHZhbHVlIGJ1ZmZlciB0eXBlIG9mIHRoaXMga2V5ZnJhbWUgdHJhY2suXHJcbiAqXHJcbiAqIEB0eXBlIHtUeXBlZEFycmF5fEFycmF5fVxyXG4gKiBAZGVmYXVsdCBGbG9hdDMyQXJyYXkuY29uc3RydWN0b3JcclxuICovXHJcbktleWZyYW1lVHJhY2sucHJvdG90eXBlLlZhbHVlQnVmZmVyVHlwZSA9IEZsb2F0MzJBcnJheTtcclxuXHJcbi8qKlxyXG4gKiBUaGUgZGVmYXVsdCBpbnRlcnBvbGF0aW9uIHR5cGUgb2YgdGhpcyBrZXlmcmFtZSB0cmFjay5cclxuICpcclxuICogQHR5cGUgeyhJbnRlcnBvbGF0ZUxpbmVhcnxJbnRlcnBvbGF0ZURpc2NyZXRlfEludGVycG9sYXRlU21vb3RoKX1cclxuICogQGRlZmF1bHQgSW50ZXJwb2xhdGVMaW5lYXJcclxuICovXHJcbktleWZyYW1lVHJhY2sucHJvdG90eXBlLkRlZmF1bHRJbnRlcnBvbGF0aW9uID0gSW50ZXJwb2xhdGVMaW5lYXI7XHJcblxyXG5leHBvcnQgeyBLZXlmcmFtZVRyYWNrIH07XHJcbiIsImltcG9ydCB7IEludGVycG9sYXRlRGlzY3JldGUgfSBmcm9tICcuLi8uLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBLZXlmcmFtZVRyYWNrIH0gZnJvbSAnLi4vS2V5ZnJhbWVUcmFjay5qcyc7XHJcblxyXG4vKipcclxuICogQSB0cmFjayBmb3IgYm9vbGVhbiBrZXlmcmFtZSB2YWx1ZXMuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBLZXlmcmFtZVRyYWNrXHJcbiAqL1xyXG5jbGFzcyBCb29sZWFuS2V5ZnJhbWVUcmFjayBleHRlbmRzIEtleWZyYW1lVHJhY2sge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGJvb2xlYW4ga2V5ZnJhbWUgdHJhY2suXHJcblx0ICpcclxuXHQgKiBUaGlzIGtleWZyYW1lIHRyYWNrIHR5cGUgaGFzIG5vIGBpbnRlcnBvbGF0aW9uYCBwYXJhbWV0ZXIgYmVjYXVzZSB0aGVcclxuXHQgKiBpbnRlcnBvbGF0aW9uIGlzIGFsd2F5cyBkaXNjcmV0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIGtleWZyYW1lIHRyYWNrJ3MgbmFtZS5cclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IHRpbWVzIC0gQSBsaXN0IG9mIGtleWZyYW1lIHRpbWVzLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gdmFsdWVzIC0gQSBsaXN0IG9mIGtleWZyYW1lIHZhbHVlcy5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbmFtZSwgdGltZXMsIHZhbHVlcyApIHtcclxuXHJcblx0XHRzdXBlciggbmFtZSwgdGltZXMsIHZhbHVlcyApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogVGhlIHZhbHVlIHR5cGUgbmFtZS5cclxuICpcclxuICogQHR5cGUge1N0cmluZ31cclxuICogQGRlZmF1bHQgJ2Jvb2wnXHJcbiAqL1xyXG5Cb29sZWFuS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUuVmFsdWVUeXBlTmFtZSA9ICdib29sJztcclxuXHJcbi8qKlxyXG4gKiBUaGUgdmFsdWUgYnVmZmVyIHR5cGUgb2YgdGhpcyBrZXlmcmFtZSB0cmFjay5cclxuICpcclxuICogQHR5cGUge1R5cGVkQXJyYXl8QXJyYXl9XHJcbiAqIEBkZWZhdWx0IEFycmF5LmNvbnN0cnVjdG9yXHJcbiAqL1xyXG5Cb29sZWFuS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUuVmFsdWVCdWZmZXJUeXBlID0gQXJyYXk7XHJcblxyXG4vKipcclxuICogVGhlIGRlZmF1bHQgaW50ZXJwb2xhdGlvbiB0eXBlIG9mIHRoaXMga2V5ZnJhbWUgdHJhY2suXHJcbiAqXHJcbiAqIEB0eXBlIHsoSW50ZXJwb2xhdGVMaW5lYXJ8SW50ZXJwb2xhdGVEaXNjcmV0ZXxJbnRlcnBvbGF0ZVNtb290aCl9XHJcbiAqIEBkZWZhdWx0IEludGVycG9sYXRlRGlzY3JldGVcclxuICovXHJcbkJvb2xlYW5LZXlmcmFtZVRyYWNrLnByb3RvdHlwZS5EZWZhdWx0SW50ZXJwb2xhdGlvbiA9IEludGVycG9sYXRlRGlzY3JldGU7XHJcbkJvb2xlYW5LZXlmcmFtZVRyYWNrLnByb3RvdHlwZS5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXIgPSB1bmRlZmluZWQ7XHJcbkJvb2xlYW5LZXlmcmFtZVRyYWNrLnByb3RvdHlwZS5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGggPSB1bmRlZmluZWQ7XHJcblxyXG5leHBvcnQgeyBCb29sZWFuS2V5ZnJhbWVUcmFjayB9O1xyXG4iLCJpbXBvcnQgeyBLZXlmcmFtZVRyYWNrIH0gZnJvbSAnLi4vS2V5ZnJhbWVUcmFjay5qcyc7XHJcblxyXG4vKipcclxuICogQSB0cmFjayBmb3IgY29sb3Iga2V5ZnJhbWUgdmFsdWVzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgS2V5ZnJhbWVUcmFja1xyXG4gKi9cclxuY2xhc3MgQ29sb3JLZXlmcmFtZVRyYWNrIGV4dGVuZHMgS2V5ZnJhbWVUcmFjayB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgY29sb3Iga2V5ZnJhbWUgdHJhY2suXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBrZXlmcmFtZSB0cmFjaydzIG5hbWUuXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSB0aW1lcyAtIEEgbGlzdCBvZiBrZXlmcmFtZSB0aW1lcy5cclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IHZhbHVlcyAtIEEgbGlzdCBvZiBrZXlmcmFtZSB2YWx1ZXMuXHJcblx0ICogQHBhcmFtIHsoSW50ZXJwb2xhdGVMaW5lYXJ8SW50ZXJwb2xhdGVEaXNjcmV0ZXxJbnRlcnBvbGF0ZVNtb290aCl9IFtpbnRlcnBvbGF0aW9uXSAtIFRoZSBpbnRlcnBvbGF0aW9uIHR5cGUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFRoZSB2YWx1ZSB0eXBlIG5hbWUuXHJcbiAqXHJcbiAqIEB0eXBlIHtTdHJpbmd9XHJcbiAqIEBkZWZhdWx0ICdjb2xvcidcclxuICovXHJcbkNvbG9yS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUuVmFsdWVUeXBlTmFtZSA9ICdjb2xvcic7XHJcbi8vIFZhbHVlQnVmZmVyVHlwZSBpcyBpbmhlcml0ZWRcclxuLy8gRGVmYXVsdEludGVycG9sYXRpb24gaXMgaW5oZXJpdGVkXHJcblxyXG5leHBvcnQgeyBDb2xvcktleWZyYW1lVHJhY2sgfTtcclxuIiwiaW1wb3J0IHsgS2V5ZnJhbWVUcmFjayB9IGZyb20gJy4uL0tleWZyYW1lVHJhY2suanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgdHJhY2sgZm9yIG51bWVyaWMga2V5ZnJhbWUgdmFsdWVzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgS2V5ZnJhbWVUcmFja1xyXG4gKi9cclxuY2xhc3MgTnVtYmVyS2V5ZnJhbWVUcmFjayBleHRlbmRzIEtleWZyYW1lVHJhY2sge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG51bWJlciBrZXlmcmFtZSB0cmFjay5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIGtleWZyYW1lIHRyYWNrJ3MgbmFtZS5cclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IHRpbWVzIC0gQSBsaXN0IG9mIGtleWZyYW1lIHRpbWVzLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gdmFsdWVzIC0gQSBsaXN0IG9mIGtleWZyYW1lIHZhbHVlcy5cclxuXHQgKiBAcGFyYW0geyhJbnRlcnBvbGF0ZUxpbmVhcnxJbnRlcnBvbGF0ZURpc2NyZXRlfEludGVycG9sYXRlU21vb3RoKX0gW2ludGVycG9sYXRpb25dIC0gVGhlIGludGVycG9sYXRpb24gdHlwZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApIHtcclxuXHJcblx0XHRzdXBlciggbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogVGhlIHZhbHVlIHR5cGUgbmFtZS5cclxuICpcclxuICogQHR5cGUge1N0cmluZ31cclxuICogQGRlZmF1bHQgJ251bWJlcidcclxuICovXHJcbk51bWJlcktleWZyYW1lVHJhY2sucHJvdG90eXBlLlZhbHVlVHlwZU5hbWUgPSAnbnVtYmVyJztcclxuLy8gVmFsdWVCdWZmZXJUeXBlIGlzIGluaGVyaXRlZFxyXG4vLyBEZWZhdWx0SW50ZXJwb2xhdGlvbiBpcyBpbmhlcml0ZWRcclxuXHJcbmV4cG9ydCB7IE51bWJlcktleWZyYW1lVHJhY2sgfTtcclxuIiwiaW1wb3J0IHsgSW50ZXJwb2xhbnQgfSBmcm9tICcuLi9JbnRlcnBvbGFudC5qcyc7XHJcbmltcG9ydCB7IFF1YXRlcm5pb24gfSBmcm9tICcuLi9RdWF0ZXJuaW9uLmpzJztcclxuXHJcbi8qKlxyXG4gKiBTcGhlcmljYWwgbGluZWFyIHVuaXQgcXVhdGVybmlvbiBpbnRlcnBvbGFudC5cclxuICpcclxuICogQGF1Z21lbnRzIEludGVycG9sYW50XHJcbiAqL1xyXG5jbGFzcyBRdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQgZXh0ZW5kcyBJbnRlcnBvbGFudCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgU0xFUlAgaW50ZXJwb2xhbnQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1R5cGVkQXJyYXl9IHBhcmFtZXRlclBvc2l0aW9ucyAtIFRoZSBwYXJhbWV0ZXIgcG9zaXRpb25zIGhvbGQgdGhlIGludGVycG9sYXRpb24gZmFjdG9ycy5cclxuXHQgKiBAcGFyYW0ge1R5cGVkQXJyYXl9IHNhbXBsZVZhbHVlcyAtIFRoZSBzYW1wbGUgdmFsdWVzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzYW1wbGVTaXplIC0gVGhlIHNhbXBsZSBzaXplXHJcblx0ICogQHBhcmFtIHtUeXBlZEFycmF5fSBbcmVzdWx0QnVmZmVyXSAtIFRoZSByZXN1bHQgYnVmZmVyLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICkge1xyXG5cclxuXHRcdHN1cGVyKCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICk7XHJcblxyXG5cdH1cclxuXHJcblx0aW50ZXJwb2xhdGVfKCBpMSwgdDAsIHQsIHQxICkge1xyXG5cclxuXHRcdGNvbnN0IHJlc3VsdCA9IHRoaXMucmVzdWx0QnVmZmVyLFxyXG5cdFx0XHR2YWx1ZXMgPSB0aGlzLnNhbXBsZVZhbHVlcyxcclxuXHRcdFx0c3RyaWRlID0gdGhpcy52YWx1ZVNpemUsXHJcblxyXG5cdFx0XHRhbHBoYSA9ICggdCAtIHQwICkgLyAoIHQxIC0gdDAgKTtcclxuXHJcblx0XHRsZXQgb2Zmc2V0ID0gaTEgKiBzdHJpZGU7XHJcblxyXG5cdFx0Zm9yICggbGV0IGVuZCA9IG9mZnNldCArIHN0cmlkZTsgb2Zmc2V0ICE9PSBlbmQ7IG9mZnNldCArPSA0ICkge1xyXG5cclxuXHRcdFx0UXVhdGVybmlvbi5zbGVycEZsYXQoIHJlc3VsdCwgMCwgdmFsdWVzLCBvZmZzZXQgLSBzdHJpZGUsIHZhbHVlcywgb2Zmc2V0LCBhbHBoYSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgUXVhdGVybmlvbkxpbmVhckludGVycG9sYW50IH07XHJcbiIsImltcG9ydCB7IEtleWZyYW1lVHJhY2sgfSBmcm9tICcuLi9LZXlmcmFtZVRyYWNrLmpzJztcclxuaW1wb3J0IHsgUXVhdGVybmlvbkxpbmVhckludGVycG9sYW50IH0gZnJvbSAnLi4vLi4vbWF0aC9pbnRlcnBvbGFudHMvUXVhdGVybmlvbkxpbmVhckludGVycG9sYW50LmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIHRyYWNrIGZvciBRdWF0ZXJuaW9uIGtleWZyYW1lIHZhbHVlcy5cclxuICpcclxuICogQGF1Z21lbnRzIEtleWZyYW1lVHJhY2tcclxuICovXHJcbmNsYXNzIFF1YXRlcm5pb25LZXlmcmFtZVRyYWNrIGV4dGVuZHMgS2V5ZnJhbWVUcmFjayB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgUXVhdGVybmlvbiBrZXlmcmFtZSB0cmFjay5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIGtleWZyYW1lIHRyYWNrJ3MgbmFtZS5cclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IHRpbWVzIC0gQSBsaXN0IG9mIGtleWZyYW1lIHRpbWVzLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gdmFsdWVzIC0gQSBsaXN0IG9mIGtleWZyYW1lIHZhbHVlcy5cclxuXHQgKiBAcGFyYW0geyhJbnRlcnBvbGF0ZUxpbmVhcnxJbnRlcnBvbGF0ZURpc2NyZXRlfEludGVycG9sYXRlU21vb3RoKX0gW2ludGVycG9sYXRpb25dIC0gVGhlIGludGVycG9sYXRpb24gdHlwZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApIHtcclxuXHJcblx0XHRzdXBlciggbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE92ZXJ3cml0dGVuIHNvIHRoZSBtZXRob2QgcmV0dXJucyBRdWF0ZXJuaW9uIGJhc2VkIGludGVycG9sYW50LlxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEBwYXJhbSB7VHlwZWRBcnJheX0gW3Jlc3VsdF0gLSBUaGUgcmVzdWx0IGJ1ZmZlci5cclxuXHQgKiBAcmV0dXJuIHtRdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnR9IFRoZSBuZXcgaW50ZXJwb2xhbnQuXHJcblx0ICovXHJcblx0SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyKCByZXN1bHQgKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBRdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQoIHRoaXMudGltZXMsIHRoaXMudmFsdWVzLCB0aGlzLmdldFZhbHVlU2l6ZSgpLCByZXN1bHQgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFRoZSB2YWx1ZSB0eXBlIG5hbWUuXHJcbiAqXHJcbiAqIEB0eXBlIHtTdHJpbmd9XHJcbiAqIEBkZWZhdWx0ICdxdWF0ZXJuaW9uJ1xyXG4gKi9cclxuUXVhdGVybmlvbktleWZyYW1lVHJhY2sucHJvdG90eXBlLlZhbHVlVHlwZU5hbWUgPSAncXVhdGVybmlvbic7XHJcbi8vIFZhbHVlQnVmZmVyVHlwZSBpcyBpbmhlcml0ZWRcclxuLy8gRGVmYXVsdEludGVycG9sYXRpb24gaXMgaW5oZXJpdGVkO1xyXG5RdWF0ZXJuaW9uS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoID0gdW5kZWZpbmVkO1xyXG5cclxuZXhwb3J0IHsgUXVhdGVybmlvbktleWZyYW1lVHJhY2sgfTtcclxuIiwiaW1wb3J0IHsgSW50ZXJwb2xhdGVEaXNjcmV0ZSB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IEtleWZyYW1lVHJhY2sgfSBmcm9tICcuLi9LZXlmcmFtZVRyYWNrLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIHRyYWNrIGZvciBzdHJpbmcga2V5ZnJhbWUgdmFsdWVzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgS2V5ZnJhbWVUcmFja1xyXG4gKi9cclxuY2xhc3MgU3RyaW5nS2V5ZnJhbWVUcmFjayBleHRlbmRzIEtleWZyYW1lVHJhY2sge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHN0cmluZyBrZXlmcmFtZSB0cmFjay5cclxuXHQgKlxyXG5cdCAqIFRoaXMga2V5ZnJhbWUgdHJhY2sgdHlwZSBoYXMgbm8gYGludGVycG9sYXRpb25gIHBhcmFtZXRlciBiZWNhdXNlIHRoZVxyXG5cdCAqIGludGVycG9sYXRpb24gaXMgYWx3YXlzIGRpc2NyZXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUga2V5ZnJhbWUgdHJhY2sncyBuYW1lLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gdGltZXMgLSBBIGxpc3Qgb2Yga2V5ZnJhbWUgdGltZXMuXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSB2YWx1ZXMgLSBBIGxpc3Qgb2Yga2V5ZnJhbWUgdmFsdWVzLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBuYW1lLCB0aW1lcywgdmFsdWVzICkge1xyXG5cclxuXHRcdHN1cGVyKCBuYW1lLCB0aW1lcywgdmFsdWVzICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUaGUgdmFsdWUgdHlwZSBuYW1lLlxyXG4gKlxyXG4gKiBAdHlwZSB7U3RyaW5nfVxyXG4gKiBAZGVmYXVsdCAnc3RyaW5nJ1xyXG4gKi9cclxuU3RyaW5nS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUuVmFsdWVUeXBlTmFtZSA9ICdzdHJpbmcnO1xyXG5cclxuLyoqXHJcbiAqIFRoZSB2YWx1ZSBidWZmZXIgdHlwZSBvZiB0aGlzIGtleWZyYW1lIHRyYWNrLlxyXG4gKlxyXG4gKiBAdHlwZSB7VHlwZWRBcnJheXxBcnJheX1cclxuICogQGRlZmF1bHQgQXJyYXkuY29uc3RydWN0b3JcclxuICovXHJcblN0cmluZ0tleWZyYW1lVHJhY2sucHJvdG90eXBlLlZhbHVlQnVmZmVyVHlwZSA9IEFycmF5O1xyXG5cclxuLyoqXHJcbiAqIFRoZSBkZWZhdWx0IGludGVycG9sYXRpb24gdHlwZSBvZiB0aGlzIGtleWZyYW1lIHRyYWNrLlxyXG4gKlxyXG4gKiBAdHlwZSB7KEludGVycG9sYXRlTGluZWFyfEludGVycG9sYXRlRGlzY3JldGV8SW50ZXJwb2xhdGVTbW9vdGgpfVxyXG4gKiBAZGVmYXVsdCBJbnRlcnBvbGF0ZURpc2NyZXRlXHJcbiAqL1xyXG5TdHJpbmdLZXlmcmFtZVRyYWNrLnByb3RvdHlwZS5EZWZhdWx0SW50ZXJwb2xhdGlvbiA9IEludGVycG9sYXRlRGlzY3JldGU7XHJcblN0cmluZ0tleWZyYW1lVHJhY2sucHJvdG90eXBlLkludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhciA9IHVuZGVmaW5lZDtcclxuU3RyaW5nS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoID0gdW5kZWZpbmVkO1xyXG5cclxuZXhwb3J0IHsgU3RyaW5nS2V5ZnJhbWVUcmFjayB9O1xyXG4iLCJpbXBvcnQgeyBLZXlmcmFtZVRyYWNrIH0gZnJvbSAnLi4vS2V5ZnJhbWVUcmFjay5qcyc7XHJcblxyXG4vKipcclxuICogQSB0cmFjayBmb3IgdmVjdG9yIGtleWZyYW1lIHZhbHVlcy5cclxuICpcclxuICogQGF1Z21lbnRzIEtleWZyYW1lVHJhY2tcclxuICovXHJcbmNsYXNzIFZlY3RvcktleWZyYW1lVHJhY2sgZXh0ZW5kcyBLZXlmcmFtZVRyYWNrIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB2ZWN0b3Iga2V5ZnJhbWUgdHJhY2suXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBrZXlmcmFtZSB0cmFjaydzIG5hbWUuXHJcblx0ICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSB0aW1lcyAtIEEgbGlzdCBvZiBrZXlmcmFtZSB0aW1lcy5cclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IHZhbHVlcyAtIEEgbGlzdCBvZiBrZXlmcmFtZSB2YWx1ZXMuXHJcblx0ICogQHBhcmFtIHsoSW50ZXJwb2xhdGVMaW5lYXJ8SW50ZXJwb2xhdGVEaXNjcmV0ZXxJbnRlcnBvbGF0ZVNtb290aCl9IFtpbnRlcnBvbGF0aW9uXSAtIFRoZSBpbnRlcnBvbGF0aW9uIHR5cGUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFRoZSB2YWx1ZSB0eXBlIG5hbWUuXHJcbiAqXHJcbiAqIEB0eXBlIHtTdHJpbmd9XHJcbiAqIEBkZWZhdWx0ICd2ZWN0b3InXHJcbiAqL1xyXG5WZWN0b3JLZXlmcmFtZVRyYWNrLnByb3RvdHlwZS5WYWx1ZVR5cGVOYW1lID0gJ3ZlY3Rvcic7XHJcbi8vIFZhbHVlQnVmZmVyVHlwZSBpcyBpbmhlcml0ZWRcclxuLy8gRGVmYXVsdEludGVycG9sYXRpb24gaXMgaW5oZXJpdGVkXHJcblxyXG5leHBvcnQgeyBWZWN0b3JLZXlmcmFtZVRyYWNrIH07XHJcbiIsImltcG9ydCAqIGFzIEFuaW1hdGlvblV0aWxzIGZyb20gJy4vQW5pbWF0aW9uVXRpbHMuanMnO1xyXG5pbXBvcnQgeyBLZXlmcmFtZVRyYWNrIH0gZnJvbSAnLi9LZXlmcmFtZVRyYWNrLmpzJztcclxuaW1wb3J0IHsgQm9vbGVhbktleWZyYW1lVHJhY2sgfSBmcm9tICcuL3RyYWNrcy9Cb29sZWFuS2V5ZnJhbWVUcmFjay5qcyc7XHJcbmltcG9ydCB7IENvbG9yS2V5ZnJhbWVUcmFjayB9IGZyb20gJy4vdHJhY2tzL0NvbG9yS2V5ZnJhbWVUcmFjay5qcyc7XHJcbmltcG9ydCB7IE51bWJlcktleWZyYW1lVHJhY2sgfSBmcm9tICcuL3RyYWNrcy9OdW1iZXJLZXlmcmFtZVRyYWNrLmpzJztcclxuaW1wb3J0IHsgUXVhdGVybmlvbktleWZyYW1lVHJhY2sgfSBmcm9tICcuL3RyYWNrcy9RdWF0ZXJuaW9uS2V5ZnJhbWVUcmFjay5qcyc7XHJcbmltcG9ydCB7IFN0cmluZ0tleWZyYW1lVHJhY2sgfSBmcm9tICcuL3RyYWNrcy9TdHJpbmdLZXlmcmFtZVRyYWNrLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yS2V5ZnJhbWVUcmFjayB9IGZyb20gJy4vdHJhY2tzL1ZlY3RvcktleWZyYW1lVHJhY2suanMnO1xyXG5pbXBvcnQgeyBnZW5lcmF0ZVVVSUQgfSBmcm9tICcuLi9tYXRoL01hdGhVdGlscy5qcyc7XHJcbmltcG9ydCB7IE5vcm1hbEFuaW1hdGlvbkJsZW5kTW9kZSB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XHJcblxyXG4vKipcclxuICogQSByZXVzYWJsZSBzZXQgb2Yga2V5ZnJhbWUgdHJhY2tzIHdoaWNoIHJlcHJlc2VudCBhbiBhbmltYXRpb24uXHJcbiAqL1xyXG5jbGFzcyBBbmltYXRpb25DbGlwIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBhbmltYXRpb24gY2xpcC5cclxuXHQgKlxyXG5cdCAqIE5vdGU6IEluc3RlYWQgb2YgaW5zdGFudGlhdGluZyBhbiBBbmltYXRpb25DbGlwIGRpcmVjdGx5IHdpdGggdGhlIGNvbnN0cnVjdG9yLCB5b3UgY2FuXHJcblx0ICogdXNlIHRoZSBzdGF0aWMgaW50ZXJmYWNlIG9mIHRoaXMgY2xhc3MgZm9yIGNyZWF0aW5nIGNsaXBzLiBJbiBtb3N0IGNhc2VzIHRob3VnaCwgYW5pbWF0aW9uIGNsaXBzXHJcblx0ICogd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGNyZWF0ZWQgYnkgbG9hZGVycyB3aGVuIGltcG9ydGluZyBhbmltYXRlZCAzRCBhc3NldHMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW25hbWU9JyddIC0gVGhlIGNsaXAncyBuYW1lLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZHVyYXRpb249LTFdIC0gVGhlIGNsaXAncyBkdXJhdGlvbiBpbiBzZWNvbmRzLiBJZiBhIG5lZ2F0aXZlIHZhbHVlIGlzIHBhc3NlZCxcclxuXHQgKiB0aGUgZHVyYXRpb24gd2lsbCBiZSBjYWxjdWxhdGVkIGZyb20gdGhlIHBhc3NlZCBrZXlmcmFtZXMuXHJcblx0ICogQHBhcmFtIHtBcnJheTxLZXlmcmFtZVRyYWNrPn0gdHJhY2tzIC0gQW4gYXJyYXkgb2Yga2V5ZnJhbWUgdHJhY2tzLlxyXG5cdCAqIEBwYXJhbSB7KE5vcm1hbEFuaW1hdGlvbkJsZW5kTW9kZXxBZGRpdGl2ZUFuaW1hdGlvbkJsZW5kTW9kZSl9IFtibGVuZE1vZGU9Tm9ybWFsQW5pbWF0aW9uQmxlbmRNb2RlXSAtIERlZmluZXMgaG93IHRoZSBhbmltYXRpb25cclxuXHQgKiBpcyBibGVuZGVkL2NvbWJpbmVkIHdoZW4gdHdvIG9yIG1vcmUgYW5pbWF0aW9ucyBhcmUgc2ltdWx0YW5lb3VzbHkgcGxheWVkLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBuYW1lID0gJycsIGR1cmF0aW9uID0gLSAxLCB0cmFja3MgPSBbXSwgYmxlbmRNb2RlID0gTm9ybWFsQW5pbWF0aW9uQmxlbmRNb2RlICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNsaXAncyBuYW1lLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubmFtZSA9IG5hbWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiAgQW4gYXJyYXkgb2Yga2V5ZnJhbWUgdHJhY2tzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxLZXlmcmFtZVRyYWNrPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50cmFja3MgPSB0cmFja3M7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY2xpcCdzIGR1cmF0aW9uIGluIHNlY29uZHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kdXJhdGlvbiA9IGR1cmF0aW9uO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyBob3cgdGhlIGFuaW1hdGlvbiBpcyBibGVuZGVkL2NvbWJpbmVkIHdoZW4gdHdvIG9yIG1vcmUgYW5pbWF0aW9uc1xyXG5cdFx0ICogYXJlIHNpbXVsdGFuZW91c2x5IHBsYXllZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KE5vcm1hbEFuaW1hdGlvbkJsZW5kTW9kZXxBZGRpdGl2ZUFuaW1hdGlvbkJsZW5kTW9kZSl9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYmxlbmRNb2RlID0gYmxlbmRNb2RlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIFVVSUQgb2YgdGhlIGFuaW1hdGlvbiBjbGlwLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51dWlkID0gZ2VuZXJhdGVVVUlEKCk7XHJcblxyXG5cdFx0Ly8gdGhpcyBtZWFucyBpdCBzaG91bGQgZmlndXJlIG91dCBpdHMgZHVyYXRpb24gYnkgc2Nhbm5pbmcgdGhlIHRyYWNrc1xyXG5cdFx0aWYgKCB0aGlzLmR1cmF0aW9uIDwgMCApIHtcclxuXHJcblx0XHRcdHRoaXMucmVzZXREdXJhdGlvbigpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGYWN0b3J5IG1ldGhvZCBmb3IgY3JlYXRpbmcgYW4gYW5pbWF0aW9uIGNsaXAgZnJvbSB0aGUgZ2l2ZW4gSlNPTi5cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAcGFyYW0ge09iamVjdH0ganNvbiAtIFRoZSBzZXJpYWxpemVkIGFuaW1hdGlvbiBjbGlwLlxyXG5cdCAqIEByZXR1cm4ge0FuaW1hdGlvbkNsaXB9IFRoZSBuZXcgYW5pbWF0aW9uIGNsaXAuXHJcblx0ICovXHJcblx0c3RhdGljIHBhcnNlKCBqc29uICkge1xyXG5cclxuXHRcdGNvbnN0IHRyYWNrcyA9IFtdLFxyXG5cdFx0XHRqc29uVHJhY2tzID0ganNvbi50cmFja3MsXHJcblx0XHRcdGZyYW1lVGltZSA9IDEuMCAvICgganNvbi5mcHMgfHwgMS4wICk7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBuID0ganNvblRyYWNrcy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XHJcblxyXG5cdFx0XHR0cmFja3MucHVzaCggcGFyc2VLZXlmcmFtZVRyYWNrKCBqc29uVHJhY2tzWyBpIF0gKS5zY2FsZSggZnJhbWVUaW1lICkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgY2xpcCA9IG5ldyB0aGlzKCBqc29uLm5hbWUsIGpzb24uZHVyYXRpb24sIHRyYWNrcywganNvbi5ibGVuZE1vZGUgKTtcclxuXHRcdGNsaXAudXVpZCA9IGpzb24udXVpZDtcclxuXHJcblx0XHRyZXR1cm4gY2xpcDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXJpYWxpemVzIHRoZSBnaXZlbiBhbmltYXRpb24gY2xpcCBpbnRvIEpTT04uXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQHBhcmFtIHtBbmltYXRpb25DbGlwfSBjbGlwIC0gVGhlIGFuaW1hdGlvbiBjbGlwIHRvIHNlcmlhbGl6ZS5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBKU09OIG9iamVjdC5cclxuXHQgKi9cclxuXHRzdGF0aWMgdG9KU09OKCBjbGlwICkge1xyXG5cclxuXHRcdGNvbnN0IHRyYWNrcyA9IFtdLFxyXG5cdFx0XHRjbGlwVHJhY2tzID0gY2xpcC50cmFja3M7XHJcblxyXG5cdFx0Y29uc3QganNvbiA9IHtcclxuXHJcblx0XHRcdCduYW1lJzogY2xpcC5uYW1lLFxyXG5cdFx0XHQnZHVyYXRpb24nOiBjbGlwLmR1cmF0aW9uLFxyXG5cdFx0XHQndHJhY2tzJzogdHJhY2tzLFxyXG5cdFx0XHQndXVpZCc6IGNsaXAudXVpZCxcclxuXHRcdFx0J2JsZW5kTW9kZSc6IGNsaXAuYmxlbmRNb2RlXHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIG4gPSBjbGlwVHJhY2tzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcclxuXHJcblx0XHRcdHRyYWNrcy5wdXNoKCBLZXlmcmFtZVRyYWNrLnRvSlNPTiggY2xpcFRyYWNrc1sgaSBdICkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGpzb247XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIG5ldyBhbmltYXRpb24gY2xpcCBmcm9tIHRoZSBwYXNzZWQgbW9ycGggdGFyZ2V0cyBhcnJheSBvZiBhXHJcblx0ICogZ2VvbWV0cnksIHRha2luZyBhIG5hbWUgYW5kIHRoZSBudW1iZXIgb2YgZnJhbWVzIHBlciBzZWNvbmQuXHJcblx0ICpcclxuXHQgKiBOb3RlOiBUaGUgZnBzIHBhcmFtZXRlciBpcyByZXF1aXJlZCwgYnV0IHRoZSBhbmltYXRpb24gc3BlZWQgY2FuIGJlXHJcblx0ICogb3ZlcnJpZGRlbiB2aWEge0BsaW5rIEFuaW1hdGlvbkFjdGlvbiNzZXREdXJhdGlvbn0uXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgYW5pbWF0aW9uIGNsaXAuXHJcblx0ICogQHBhcmFtIHtBcnJheTxPYmplY3Q+fSBtb3JwaFRhcmdldFNlcXVlbmNlIC0gQSBzZXF1ZW5jZSBvZiBtb3JwaCB0YXJnZXRzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBmcHMgLSBUaGUgRnJhbWVzLVBlci1TZWNvbmQgdmFsdWUuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBub0xvb3AgLSBXaGV0aGVyIHRoZSBjbGlwIHNob3VsZCBiZSBubyBsb29wIG9yIG5vdC5cclxuXHQgKiBAcmV0dXJuIHtBbmltYXRpb25DbGlwfSBUaGUgbmV3IGFuaW1hdGlvbiBjbGlwLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBDcmVhdGVGcm9tTW9ycGhUYXJnZXRTZXF1ZW5jZSggbmFtZSwgbW9ycGhUYXJnZXRTZXF1ZW5jZSwgZnBzLCBub0xvb3AgKSB7XHJcblxyXG5cdFx0Y29uc3QgbnVtTW9ycGhUYXJnZXRzID0gbW9ycGhUYXJnZXRTZXF1ZW5jZS5sZW5ndGg7XHJcblx0XHRjb25zdCB0cmFja3MgPSBbXTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBudW1Nb3JwaFRhcmdldHM7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRsZXQgdGltZXMgPSBbXTtcclxuXHRcdFx0bGV0IHZhbHVlcyA9IFtdO1xyXG5cclxuXHRcdFx0dGltZXMucHVzaChcclxuXHRcdFx0XHQoIGkgKyBudW1Nb3JwaFRhcmdldHMgLSAxICkgJSBudW1Nb3JwaFRhcmdldHMsXHJcblx0XHRcdFx0aSxcclxuXHRcdFx0XHQoIGkgKyAxICkgJSBudW1Nb3JwaFRhcmdldHMgKTtcclxuXHJcblx0XHRcdHZhbHVlcy5wdXNoKCAwLCAxLCAwICk7XHJcblxyXG5cdFx0XHRjb25zdCBvcmRlciA9IEFuaW1hdGlvblV0aWxzLmdldEtleWZyYW1lT3JkZXIoIHRpbWVzICk7XHJcblx0XHRcdHRpbWVzID0gQW5pbWF0aW9uVXRpbHMuc29ydGVkQXJyYXkoIHRpbWVzLCAxLCBvcmRlciApO1xyXG5cdFx0XHR2YWx1ZXMgPSBBbmltYXRpb25VdGlscy5zb3J0ZWRBcnJheSggdmFsdWVzLCAxLCBvcmRlciApO1xyXG5cclxuXHRcdFx0Ly8gaWYgdGhlcmUgaXMgYSBrZXkgYXQgdGhlIGZpcnN0IGZyYW1lLCBkdXBsaWNhdGUgaXQgYXMgdGhlXHJcblx0XHRcdC8vIGxhc3QgZnJhbWUgYXMgd2VsbCBmb3IgcGVyZmVjdCBsb29wLlxyXG5cdFx0XHRpZiAoICEgbm9Mb29wICYmIHRpbWVzWyAwIF0gPT09IDAgKSB7XHJcblxyXG5cdFx0XHRcdHRpbWVzLnB1c2goIG51bU1vcnBoVGFyZ2V0cyApO1xyXG5cdFx0XHRcdHZhbHVlcy5wdXNoKCB2YWx1ZXNbIDAgXSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dHJhY2tzLnB1c2goXHJcblx0XHRcdFx0bmV3IE51bWJlcktleWZyYW1lVHJhY2soXHJcblx0XHRcdFx0XHQnLm1vcnBoVGFyZ2V0SW5mbHVlbmNlc1snICsgbW9ycGhUYXJnZXRTZXF1ZW5jZVsgaSBdLm5hbWUgKyAnXScsXHJcblx0XHRcdFx0XHR0aW1lcywgdmFsdWVzXHJcblx0XHRcdFx0KS5zY2FsZSggMS4wIC8gZnBzICkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG5ldyB0aGlzKCBuYW1lLCAtIDEsIHRyYWNrcyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNlYXJjaGVzIGZvciBhbiBhbmltYXRpb24gY2xpcCBieSBuYW1lLCB0YWtpbmcgYXMgaXRzIGZpcnN0IHBhcmFtZXRlclxyXG5cdCAqIGVpdGhlciBhbiBhcnJheSBvZiBjbGlwcywgb3IgYSBtZXNoIG9yIGdlb21ldHJ5IHRoYXQgY29udGFpbnMgYW5cclxuXHQgKiBhcnJheSBuYW1lZCBcImFuaW1hdGlvbnNcIiBwcm9wZXJ0eS5cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAcGFyYW0geyhBcnJheTxBbmltYXRpb25DbGlwPnxPYmplY3QzRCl9IG9iamVjdE9yQ2xpcEFycmF5IC0gVGhlIGFycmF5IG9yIG9iamVjdCB0byBzZWFyY2ggdGhyb3VnaC5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIHRvIHNlYXJjaCBmb3IuXHJcblx0ICogQHJldHVybiB7P0FuaW1hdGlvbkNsaXB9IFRoZSBmb3VuZCBhbmltYXRpb24gY2xpcC4gUmV0dXJucyBgbnVsbGAgaWYgbm8gY2xpcCBoYXMgYmVlbiBmb3VuZC5cclxuXHQgKi9cclxuXHRzdGF0aWMgZmluZEJ5TmFtZSggb2JqZWN0T3JDbGlwQXJyYXksIG5hbWUgKSB7XHJcblxyXG5cdFx0bGV0IGNsaXBBcnJheSA9IG9iamVjdE9yQ2xpcEFycmF5O1xyXG5cclxuXHRcdGlmICggISBBcnJheS5pc0FycmF5KCBvYmplY3RPckNsaXBBcnJheSApICkge1xyXG5cclxuXHRcdFx0Y29uc3QgbyA9IG9iamVjdE9yQ2xpcEFycmF5O1xyXG5cdFx0XHRjbGlwQXJyYXkgPSBvLmdlb21ldHJ5ICYmIG8uZ2VvbWV0cnkuYW5pbWF0aW9ucyB8fCBvLmFuaW1hdGlvbnM7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGNsaXBBcnJheS5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGNsaXBBcnJheVsgaSBdLm5hbWUgPT09IG5hbWUgKSB7XHJcblxyXG5cdFx0XHRcdHJldHVybiBjbGlwQXJyYXlbIGkgXTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhbiBhcnJheSBvZiBuZXcgQW5pbWF0aW9uQ2xpcHMgY3JlYXRlZCBmcm9tIHRoZSBtb3JwaCB0YXJnZXRcclxuXHQgKiBzZXF1ZW5jZXMgb2YgYSBnZW9tZXRyeSwgdHJ5aW5nIHRvIHNvcnQgbW9ycGggdGFyZ2V0IG5hbWVzIGludG9cclxuXHQgKiBhbmltYXRpb24tZ3JvdXAtYmFzZWQgcGF0dGVybnMgbGlrZSBcIldhbGtfMDAxLCBXYWxrXzAwMiwgUnVuXzAwMSwgUnVuXzAwMi4uLlwiLlxyXG5cdCAqXHJcblx0ICogU2VlIHtAbGluayBNRDJMb2FkZXIjcGFyc2V9IGFzIGFuIGV4YW1wbGUgZm9yIGhvdyB0aGUgbWV0aG9kIHNob3VsZCBiZSB1c2VkLlxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEBwYXJhbSB7QXJyYXk8T2JqZWN0Pn0gbW9ycGhUYXJnZXRzIC0gQSBzZXF1ZW5jZSBvZiBtb3JwaCB0YXJnZXRzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBmcHMgLSBUaGUgRnJhbWVzLVBlci1TZWNvbmQgdmFsdWUuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBub0xvb3AgLSBXaGV0aGVyIHRoZSBjbGlwIHNob3VsZCBiZSBubyBsb29wIG9yIG5vdC5cclxuXHQgKiBAcmV0dXJuIHtBcnJheTxBbmltYXRpb25DbGlwPn0gQW4gYXJyYXkgb2YgbmV3IGFuaW1hdGlvbiBjbGlwcy5cclxuXHQgKi9cclxuXHRzdGF0aWMgQ3JlYXRlQ2xpcHNGcm9tTW9ycGhUYXJnZXRTZXF1ZW5jZXMoIG1vcnBoVGFyZ2V0cywgZnBzLCBub0xvb3AgKSB7XHJcblxyXG5cdFx0Y29uc3QgYW5pbWF0aW9uVG9Nb3JwaFRhcmdldHMgPSB7fTtcclxuXHJcblx0XHQvLyB0ZXN0ZWQgd2l0aCBodHRwczovL3JlZ2V4MTAxLmNvbS8gb24gdHJpY2sgc2VxdWVuY2VzXHJcblx0XHQvLyBzdWNoIGZsYW1pbmdvX2ZseUFfMDAzLCBmbGFtaW5nb19ydW4xXzAwMywgY3JkZWF0aDAwNTlcclxuXHRcdGNvbnN0IHBhdHRlcm4gPSAvXihbXFx3LV0qPykoW1xcZF0rKSQvO1xyXG5cclxuXHRcdC8vIHNvcnQgbW9ycGggdGFyZ2V0IG5hbWVzIGludG8gYW5pbWF0aW9uIGdyb3VwcyBiYXNlZFxyXG5cdFx0Ly8gcGF0dGVybnMgbGlrZSBXYWxrXzAwMSwgV2Fsa18wMDIsIFJ1bl8wMDEsIFJ1bl8wMDJcclxuXHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBtb3JwaFRhcmdldHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBtb3JwaFRhcmdldCA9IG1vcnBoVGFyZ2V0c1sgaSBdO1xyXG5cdFx0XHRjb25zdCBwYXJ0cyA9IG1vcnBoVGFyZ2V0Lm5hbWUubWF0Y2goIHBhdHRlcm4gKTtcclxuXHJcblx0XHRcdGlmICggcGFydHMgJiYgcGFydHMubGVuZ3RoID4gMSApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgbmFtZSA9IHBhcnRzWyAxIF07XHJcblxyXG5cdFx0XHRcdGxldCBhbmltYXRpb25Nb3JwaFRhcmdldHMgPSBhbmltYXRpb25Ub01vcnBoVGFyZ2V0c1sgbmFtZSBdO1xyXG5cclxuXHRcdFx0XHRpZiAoICEgYW5pbWF0aW9uTW9ycGhUYXJnZXRzICkge1xyXG5cclxuXHRcdFx0XHRcdGFuaW1hdGlvblRvTW9ycGhUYXJnZXRzWyBuYW1lIF0gPSBhbmltYXRpb25Nb3JwaFRhcmdldHMgPSBbXTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRhbmltYXRpb25Nb3JwaFRhcmdldHMucHVzaCggbW9ycGhUYXJnZXQgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgY2xpcHMgPSBbXTtcclxuXHJcblx0XHRmb3IgKCBjb25zdCBuYW1lIGluIGFuaW1hdGlvblRvTW9ycGhUYXJnZXRzICkge1xyXG5cclxuXHRcdFx0Y2xpcHMucHVzaCggdGhpcy5DcmVhdGVGcm9tTW9ycGhUYXJnZXRTZXF1ZW5jZSggbmFtZSwgYW5pbWF0aW9uVG9Nb3JwaFRhcmdldHNbIG5hbWUgXSwgZnBzLCBub0xvb3AgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gY2xpcHM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUGFyc2VzIHRoZSBgYW5pbWF0aW9uLmhpZXJhcmNoeWAgZm9ybWF0IGFuZCByZXR1cm5zIGEgbmV3IGFuaW1hdGlvbiBjbGlwLlxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEBkZXByZWNhdGVkIHNpbmNlIHIxNzUuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGFuaW1hdGlvbiAtIEEgc2VyaWFsaXplZCBhbmltYXRpb24gY2xpcCBhcyBKU09OLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8Qm9uZXM+fSBib25lcyAtIEFuIGFycmF5IG9mIGJvbmVzLlxyXG5cdCAqIEByZXR1cm4gez9BbmltYXRpb25DbGlwfSBUaGUgbmV3IGFuaW1hdGlvbiBjbGlwLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBwYXJzZUFuaW1hdGlvbiggYW5pbWF0aW9uLCBib25lcyApIHtcclxuXHJcblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5BbmltYXRpb25DbGlwOiBwYXJzZUFuaW1hdGlvbigpIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCB3aXRoIHIxODUnICk7XHJcblxyXG5cdFx0aWYgKCAhIGFuaW1hdGlvbiApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5BbmltYXRpb25DbGlwOiBObyBhbmltYXRpb24gaW4gSlNPTkxvYWRlciBkYXRhLicgKTtcclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGFkZE5vbmVtcHR5VHJhY2sgPSBmdW5jdGlvbiAoIHRyYWNrVHlwZSwgdHJhY2tOYW1lLCBhbmltYXRpb25LZXlzLCBwcm9wZXJ0eU5hbWUsIGRlc3RUcmFja3MgKSB7XHJcblxyXG5cdFx0XHQvLyBvbmx5IHJldHVybiB0cmFjayBpZiB0aGVyZSBhcmUgYWN0dWFsbHkga2V5cy5cclxuXHRcdFx0aWYgKCBhbmltYXRpb25LZXlzLmxlbmd0aCAhPT0gMCApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgdGltZXMgPSBbXTtcclxuXHRcdFx0XHRjb25zdCB2YWx1ZXMgPSBbXTtcclxuXHJcblx0XHRcdFx0QW5pbWF0aW9uVXRpbHMuZmxhdHRlbkpTT04oIGFuaW1hdGlvbktleXMsIHRpbWVzLCB2YWx1ZXMsIHByb3BlcnR5TmFtZSApO1xyXG5cclxuXHRcdFx0XHQvLyBlbXB0eSBrZXlzIGFyZSBmaWx0ZXJlZCBvdXQsIHNvIGNoZWNrIGFnYWluXHJcblx0XHRcdFx0aWYgKCB0aW1lcy5sZW5ndGggIT09IDAgKSB7XHJcblxyXG5cdFx0XHRcdFx0ZGVzdFRyYWNrcy5wdXNoKCBuZXcgdHJhY2tUeXBlKCB0cmFja05hbWUsIHRpbWVzLCB2YWx1ZXMgKSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHRjb25zdCB0cmFja3MgPSBbXTtcclxuXHJcblx0XHRjb25zdCBjbGlwTmFtZSA9IGFuaW1hdGlvbi5uYW1lIHx8ICdkZWZhdWx0JztcclxuXHRcdGNvbnN0IGZwcyA9IGFuaW1hdGlvbi5mcHMgfHwgMzA7XHJcblx0XHRjb25zdCBibGVuZE1vZGUgPSBhbmltYXRpb24uYmxlbmRNb2RlO1xyXG5cclxuXHRcdC8vIGF1dG9tYXRpYyBsZW5ndGggZGV0ZXJtaW5hdGlvbiBpbiBBbmltYXRpb25DbGlwLlxyXG5cdFx0bGV0IGR1cmF0aW9uID0gYW5pbWF0aW9uLmxlbmd0aCB8fCAtIDE7XHJcblxyXG5cdFx0Y29uc3QgaGllcmFyY2h5VHJhY2tzID0gYW5pbWF0aW9uLmhpZXJhcmNoeSB8fCBbXTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaCA9IDA7IGggPCBoaWVyYXJjaHlUcmFja3MubGVuZ3RoOyBoICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYW5pbWF0aW9uS2V5cyA9IGhpZXJhcmNoeVRyYWNrc1sgaCBdLmtleXM7XHJcblxyXG5cdFx0XHQvLyBza2lwIGVtcHR5IHRyYWNrc1xyXG5cdFx0XHRpZiAoICEgYW5pbWF0aW9uS2V5cyB8fCBhbmltYXRpb25LZXlzLmxlbmd0aCA9PT0gMCApIGNvbnRpbnVlO1xyXG5cclxuXHRcdFx0Ly8gcHJvY2VzcyBtb3JwaCB0YXJnZXRzXHJcblx0XHRcdGlmICggYW5pbWF0aW9uS2V5c1sgMCBdLm1vcnBoVGFyZ2V0cyApIHtcclxuXHJcblx0XHRcdFx0Ly8gZmlndXJlIG91dCBhbGwgbW9ycGggdGFyZ2V0cyB1c2VkIGluIHRoaXMgdHJhY2tcclxuXHRcdFx0XHRjb25zdCBtb3JwaFRhcmdldE5hbWVzID0ge307XHJcblxyXG5cdFx0XHRcdGxldCBrO1xyXG5cclxuXHRcdFx0XHRmb3IgKCBrID0gMDsgayA8IGFuaW1hdGlvbktleXMubGVuZ3RoOyBrICsrICkge1xyXG5cclxuXHRcdFx0XHRcdGlmICggYW5pbWF0aW9uS2V5c1sgayBdLm1vcnBoVGFyZ2V0cyApIHtcclxuXHJcblx0XHRcdFx0XHRcdGZvciAoIGxldCBtID0gMDsgbSA8IGFuaW1hdGlvbktleXNbIGsgXS5tb3JwaFRhcmdldHMubGVuZ3RoOyBtICsrICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRtb3JwaFRhcmdldE5hbWVzWyBhbmltYXRpb25LZXlzWyBrIF0ubW9ycGhUYXJnZXRzWyBtIF0gXSA9IC0gMTtcclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Ly8gY3JlYXRlIGEgdHJhY2sgZm9yIGVhY2ggbW9ycGggdGFyZ2V0IHdpdGggYWxsIHplcm9cclxuXHRcdFx0XHQvLyBtb3JwaFRhcmdldEluZmx1ZW5jZXMgZXhjZXB0IGZvciB0aGUga2V5cyBpbiB3aGljaFxyXG5cdFx0XHRcdC8vIHRoZSBtb3JwaFRhcmdldCBpcyBuYW1lZC5cclxuXHRcdFx0XHRmb3IgKCBjb25zdCBtb3JwaFRhcmdldE5hbWUgaW4gbW9ycGhUYXJnZXROYW1lcyApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCB0aW1lcyA9IFtdO1xyXG5cdFx0XHRcdFx0Y29uc3QgdmFsdWVzID0gW107XHJcblxyXG5cdFx0XHRcdFx0Zm9yICggbGV0IG0gPSAwOyBtICE9PSBhbmltYXRpb25LZXlzWyBrIF0ubW9ycGhUYXJnZXRzLmxlbmd0aDsgKysgbSApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnN0IGFuaW1hdGlvbktleSA9IGFuaW1hdGlvbktleXNbIGsgXTtcclxuXHJcblx0XHRcdFx0XHRcdHRpbWVzLnB1c2goIGFuaW1hdGlvbktleS50aW1lICk7XHJcblx0XHRcdFx0XHRcdHZhbHVlcy5wdXNoKCAoIGFuaW1hdGlvbktleS5tb3JwaFRhcmdldCA9PT0gbW9ycGhUYXJnZXROYW1lICkgPyAxIDogMCApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR0cmFja3MucHVzaCggbmV3IE51bWJlcktleWZyYW1lVHJhY2soICcubW9ycGhUYXJnZXRJbmZsdWVuY2VbJyArIG1vcnBoVGFyZ2V0TmFtZSArICddJywgdGltZXMsIHZhbHVlcyApICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0ZHVyYXRpb24gPSBtb3JwaFRhcmdldE5hbWVzLmxlbmd0aCAqIGZwcztcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdC8vIC4uLmFzc3VtZSBza2VsZXRhbCBhbmltYXRpb25cclxuXHJcblx0XHRcdFx0Y29uc3QgYm9uZU5hbWUgPSAnLmJvbmVzWycgKyBib25lc1sgaCBdLm5hbWUgKyAnXSc7XHJcblxyXG5cdFx0XHRcdGFkZE5vbmVtcHR5VHJhY2soXHJcblx0XHRcdFx0XHRWZWN0b3JLZXlmcmFtZVRyYWNrLCBib25lTmFtZSArICcucG9zaXRpb24nLFxyXG5cdFx0XHRcdFx0YW5pbWF0aW9uS2V5cywgJ3BvcycsIHRyYWNrcyApO1xyXG5cclxuXHRcdFx0XHRhZGROb25lbXB0eVRyYWNrKFxyXG5cdFx0XHRcdFx0UXVhdGVybmlvbktleWZyYW1lVHJhY2ssIGJvbmVOYW1lICsgJy5xdWF0ZXJuaW9uJyxcclxuXHRcdFx0XHRcdGFuaW1hdGlvbktleXMsICdyb3QnLCB0cmFja3MgKTtcclxuXHJcblx0XHRcdFx0YWRkTm9uZW1wdHlUcmFjayhcclxuXHRcdFx0XHRcdFZlY3RvcktleWZyYW1lVHJhY2ssIGJvbmVOYW1lICsgJy5zY2FsZScsXHJcblx0XHRcdFx0XHRhbmltYXRpb25LZXlzLCAnc2NsJywgdHJhY2tzICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdHJhY2tzLmxlbmd0aCA9PT0gMCApIHtcclxuXHJcblx0XHRcdHJldHVybiBudWxsO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBjbGlwID0gbmV3IHRoaXMoIGNsaXBOYW1lLCBkdXJhdGlvbiwgdHJhY2tzLCBibGVuZE1vZGUgKTtcclxuXHJcblx0XHRyZXR1cm4gY2xpcDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBkdXJhdGlvbiBvZiB0aGlzIGNsaXAgdG8gdGhlIGR1cmF0aW9uIG9mIGl0cyBsb25nZXN0IGtleWZyYW1lIHRyYWNrLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7QW5pbWF0aW9uQ2xpcH0gQSByZWZlcmVuY2UgdG8gdGhpcyBhbmltYXRpb24gY2xpcC5cclxuXHQgKi9cclxuXHRyZXNldER1cmF0aW9uKCkge1xyXG5cclxuXHRcdGNvbnN0IHRyYWNrcyA9IHRoaXMudHJhY2tzO1xyXG5cdFx0bGV0IGR1cmF0aW9uID0gMDtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIG4gPSB0cmFja3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdHJhY2sgPSB0aGlzLnRyYWNrc1sgaSBdO1xyXG5cclxuXHRcdFx0ZHVyYXRpb24gPSBNYXRoLm1heCggZHVyYXRpb24sIHRyYWNrLnRpbWVzWyB0cmFjay50aW1lcy5sZW5ndGggLSAxIF0gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5kdXJhdGlvbiA9IGR1cmF0aW9uO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRyaW1zIGFsbCB0cmFja3MgdG8gdGhlIGNsaXAncyBkdXJhdGlvbi5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0FuaW1hdGlvbkNsaXB9IEEgcmVmZXJlbmNlIHRvIHRoaXMgYW5pbWF0aW9uIGNsaXAuXHJcblx0ICovXHJcblx0dHJpbSgpIHtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB0aGlzLnRyYWNrcy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnRyYWNrc1sgaSBdLnRyaW0oIDAsIHRoaXMuZHVyYXRpb24gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUGVyZm9ybXMgbWluaW1hbCB2YWxpZGF0aW9uIG9uIGVhY2ggdHJhY2sgaW4gdGhlIGNsaXAuIFJldHVybnMgYHRydWVgIGlmIGFsbFxyXG5cdCAqIHRyYWNrcyBhcmUgdmFsaWQuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBjbGlwJ3Mga2V5ZnJhbWVzIGFyZSB2YWxpZCBvciBub3QuXHJcblx0ICovXHJcblx0dmFsaWRhdGUoKSB7XHJcblxyXG5cdFx0bGV0IHZhbGlkID0gdHJ1ZTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB0aGlzLnRyYWNrcy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHR2YWxpZCA9IHZhbGlkICYmIHRoaXMudHJhY2tzWyBpIF0udmFsaWRhdGUoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHZhbGlkO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE9wdGltaXplcyBlYWNoIHRyYWNrIGJ5IHJlbW92aW5nIGVxdWl2YWxlbnQgc2VxdWVudGlhbCBrZXlzICh3aGljaCBhcmVcclxuXHQgKiBjb21tb24gaW4gbW9ycGggdGFyZ2V0IHNlcXVlbmNlcykuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtBbmltYXRpb25DbGlwfSBBIHJlZmVyZW5jZSB0byB0aGlzIGFuaW1hdGlvbiBjbGlwLlxyXG5cdCAqL1xyXG5cdG9wdGltaXplKCkge1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHRoaXMudHJhY2tzLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdHRoaXMudHJhY2tzWyBpIF0ub3B0aW1pemUoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIG5ldyBhbmltYXRpb24gY2xpcCB3aXRoIGNvcGllZCB2YWx1ZXMgZnJvbSB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7QW5pbWF0aW9uQ2xpcH0gQSBjbG9uZSBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNsb25lKCkge1xyXG5cclxuXHRcdGNvbnN0IHRyYWNrcyA9IFtdO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHRoaXMudHJhY2tzLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdHRyYWNrcy5wdXNoKCB0aGlzLnRyYWNrc1sgaSBdLmNsb25lKCkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLm5hbWUsIHRoaXMuZHVyYXRpb24sIHRyYWNrcywgdGhpcy5ibGVuZE1vZGUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXJpYWxpemVzIHRoaXMgYW5pbWF0aW9uIGNsaXAgaW50byBKU09OLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7T2JqZWN0fSBUaGUgSlNPTiBvYmplY3QuXHJcblx0ICovXHJcblx0dG9KU09OKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvSlNPTiggdGhpcyApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRUcmFja1R5cGVGb3JWYWx1ZVR5cGVOYW1lKCB0eXBlTmFtZSApIHtcclxuXHJcblx0c3dpdGNoICggdHlwZU5hbWUudG9Mb3dlckNhc2UoKSApIHtcclxuXHJcblx0XHRjYXNlICdzY2FsYXInOlxyXG5cdFx0Y2FzZSAnZG91YmxlJzpcclxuXHRcdGNhc2UgJ2Zsb2F0JzpcclxuXHRcdGNhc2UgJ251bWJlcic6XHJcblx0XHRjYXNlICdpbnRlZ2VyJzpcclxuXHJcblx0XHRcdHJldHVybiBOdW1iZXJLZXlmcmFtZVRyYWNrO1xyXG5cclxuXHRcdGNhc2UgJ3ZlY3Rvcic6XHJcblx0XHRjYXNlICd2ZWN0b3IyJzpcclxuXHRcdGNhc2UgJ3ZlY3RvcjMnOlxyXG5cdFx0Y2FzZSAndmVjdG9yNCc6XHJcblxyXG5cdFx0XHRyZXR1cm4gVmVjdG9yS2V5ZnJhbWVUcmFjaztcclxuXHJcblx0XHRjYXNlICdjb2xvcic6XHJcblxyXG5cdFx0XHRyZXR1cm4gQ29sb3JLZXlmcmFtZVRyYWNrO1xyXG5cclxuXHRcdGNhc2UgJ3F1YXRlcm5pb24nOlxyXG5cclxuXHRcdFx0cmV0dXJuIFF1YXRlcm5pb25LZXlmcmFtZVRyYWNrO1xyXG5cclxuXHRcdGNhc2UgJ2Jvb2wnOlxyXG5cdFx0Y2FzZSAnYm9vbGVhbic6XHJcblxyXG5cdFx0XHRyZXR1cm4gQm9vbGVhbktleWZyYW1lVHJhY2s7XHJcblxyXG5cdFx0Y2FzZSAnc3RyaW5nJzpcclxuXHJcblx0XHRcdHJldHVybiBTdHJpbmdLZXlmcmFtZVRyYWNrO1xyXG5cclxuXHR9XHJcblxyXG5cdHRocm93IG5ldyBFcnJvciggJ1RIUkVFLktleWZyYW1lVHJhY2s6IFVuc3VwcG9ydGVkIHR5cGVOYW1lOiAnICsgdHlwZU5hbWUgKTtcclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHBhcnNlS2V5ZnJhbWVUcmFjaygganNvbiApIHtcclxuXHJcblx0aWYgKCBqc29uLnR5cGUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHR0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5LZXlmcmFtZVRyYWNrOiB0cmFjayB0eXBlIHVuZGVmaW5lZCwgY2FuIG5vdCBwYXJzZScgKTtcclxuXHJcblx0fVxyXG5cclxuXHRjb25zdCB0cmFja1R5cGUgPSBnZXRUcmFja1R5cGVGb3JWYWx1ZVR5cGVOYW1lKCBqc29uLnR5cGUgKTtcclxuXHJcblx0aWYgKCBqc29uLnRpbWVzID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0Y29uc3QgdGltZXMgPSBbXSwgdmFsdWVzID0gW107XHJcblxyXG5cdFx0QW5pbWF0aW9uVXRpbHMuZmxhdHRlbkpTT04oIGpzb24ua2V5cywgdGltZXMsIHZhbHVlcywgJ3ZhbHVlJyApO1xyXG5cclxuXHRcdGpzb24udGltZXMgPSB0aW1lcztcclxuXHRcdGpzb24udmFsdWVzID0gdmFsdWVzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vIGRlcml2ZWQgY2xhc3NlcyBjYW4gZGVmaW5lIGEgc3RhdGljIHBhcnNlIG1ldGhvZFxyXG5cdGlmICggdHJhY2tUeXBlLnBhcnNlICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRyYWNrVHlwZS5wYXJzZSgganNvbiApO1xyXG5cclxuXHR9IGVsc2Uge1xyXG5cclxuXHRcdC8vIGJ5IGRlZmF1bHQsIHdlIGFzc3VtZSBhIGNvbnN0cnVjdG9yIGNvbXBhdGlibGUgd2l0aCB0aGUgYmFzZVxyXG5cdFx0cmV0dXJuIG5ldyB0cmFja1R5cGUoIGpzb24ubmFtZSwganNvbi50aW1lcywganNvbi52YWx1ZXMsIGpzb24uaW50ZXJwb2xhdGlvbiApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBBbmltYXRpb25DbGlwIH07XHJcbiIsIi8qKlxyXG4gKiBAY2xhc3NcclxuICogQGNsYXNzZGVzYyBBIHNpbXBsZSBjYWNoaW5nIHN5c3RlbSwgdXNlZCBpbnRlcm5hbGx5IGJ5IHtAbGluayBGaWxlTG9hZGVyfS5cclxuICogVG8gZW5hYmxlIGNhY2hpbmcgYWNyb3NzIGFsbCBsb2FkZXJzIHRoYXQgdXNlIHtAbGluayBGaWxlTG9hZGVyfSwgYWRkIGBUSFJFRS5DYWNoZS5lbmFibGVkID0gdHJ1ZS5gIG9uY2UgaW4geW91ciBhcHAuXHJcbiAqIEBoaWRlY29uc3RydWN0b3JcclxuICovXHJcbmNvbnN0IENhY2hlID0ge1xyXG5cclxuXHQvKipcclxuXHQgKiBXaGV0aGVyIGNhY2hpbmcgaXMgZW5hYmxlZCBvciBub3QuXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHQgKi9cclxuXHRlbmFibGVkOiBmYWxzZSxcclxuXHJcblx0LyoqXHJcblx0ICogQSBkaWN0aW9uYXJ5IHRoYXQgaG9sZHMgY2FjaGVkIGZpbGVzLlxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLE9iamVjdD59XHJcblx0ICovXHJcblx0ZmlsZXM6IHt9LFxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIGEgY2FjaGUgZW50cnkgd2l0aCBhIGtleSB0byByZWZlcmVuY2UgdGhlIGZpbGUuIElmIHRoaXMga2V5IGFscmVhZHlcclxuXHQgKiBob2xkcyBhIGZpbGUsIGl0IGlzIG92ZXJ3cml0dGVuLlxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IHRvIHJlZmVyZW5jZSB0aGUgY2FjaGVkIGZpbGUuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGZpbGUgLSAgVGhlIGZpbGUgdG8gYmUgY2FjaGVkLlxyXG5cdCAqL1xyXG5cdGFkZDogZnVuY3Rpb24gKCBrZXksIGZpbGUgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmVuYWJsZWQgPT09IGZhbHNlICkgcmV0dXJuO1xyXG5cclxuXHRcdC8vIGNvbnNvbGUubG9nKCAnVEhSRUUuQ2FjaGUnLCAnQWRkaW5nIGtleTonLCBrZXkgKTtcclxuXHJcblx0XHR0aGlzLmZpbGVzWyBrZXkgXSA9IGZpbGU7XHJcblxyXG5cdH0sXHJcblxyXG5cdC8qKlxyXG5cdCAqIEdldHMgdGhlIGNhY2hlZCB2YWx1ZSBmb3IgdGhlIGdpdmVuIGtleS5cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSB0byByZWZlcmVuY2UgdGhlIGNhY2hlZCBmaWxlLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdHx1bmRlZmluZWR9IFRoZSBjYWNoZWQgZmlsZS4gSWYgdGhlIGtleSBkb2VzIG5vdCBleGlzdCBgdW5kZWZpbmVkYCBpcyByZXR1cm5lZC5cclxuXHQgKi9cclxuXHRnZXQ6IGZ1bmN0aW9uICgga2V5ICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5lbmFibGVkID09PSBmYWxzZSApIHJldHVybjtcclxuXHJcblx0XHQvLyBjb25zb2xlLmxvZyggJ1RIUkVFLkNhY2hlJywgJ0NoZWNraW5nIGtleTonLCBrZXkgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5maWxlc1sga2V5IF07XHJcblxyXG5cdH0sXHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbW92ZXMgdGhlIGNhY2hlZCBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4ga2V5LlxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IHRvIHJlZmVyZW5jZSB0aGUgY2FjaGVkIGZpbGUuXHJcblx0ICovXHJcblx0cmVtb3ZlOiBmdW5jdGlvbiAoIGtleSApIHtcclxuXHJcblx0XHRkZWxldGUgdGhpcy5maWxlc1sga2V5IF07XHJcblxyXG5cdH0sXHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbW92ZSBhbGwgdmFsdWVzIGZyb20gdGhlIGNhY2hlLlxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqL1xyXG5cdGNsZWFyOiBmdW5jdGlvbiAoKSB7XHJcblxyXG5cdFx0dGhpcy5maWxlcyA9IHt9O1xyXG5cclxuXHR9XHJcblxyXG59O1xyXG5cclxuXHJcbmV4cG9ydCB7IENhY2hlIH07XHJcbiIsIi8qKlxyXG4gKiBIYW5kbGVzIGFuZCBrZWVwcyB0cmFjayBvZiBsb2FkZWQgYW5kIHBlbmRpbmcgZGF0YS4gQSBkZWZhdWx0IGdsb2JhbFxyXG4gKiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIGNyZWF0ZWQgYW5kIHVzZWQgYnkgbG9hZGVycyBpZiBub3Qgc3VwcGxpZWRcclxuICogbWFudWFsbHkuXHJcbiAqXHJcbiAqIEluIGdlbmVyYWwgdGhhdCBzaG91bGQgYmUgc3VmZmljaWVudCwgaG93ZXZlciB0aGVyZSBhcmUgdGltZXMgd2hlbiBpdCBjYW5cclxuICogYmUgdXNlZnVsIHRvIGhhdmUgc2VwYXJhdGUgbG9hZGVycyAtIGZvciBleGFtcGxlIGlmIHlvdSB3YW50IHRvIHNob3dcclxuICogc2VwYXJhdGUgbG9hZGluZyBiYXJzIGZvciBvYmplY3RzIGFuZCB0ZXh0dXJlcy5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgbWFuYWdlciA9IG5ldyBUSFJFRS5Mb2FkaW5nTWFuYWdlcigpO1xyXG4gKiBtYW5hZ2VyLm9uTG9hZCA9ICgpID0+IGNvbnNvbGUubG9nKCAnTG9hZGluZyBjb21wbGV0ZSEnICk7XHJcbiAqXHJcbiAqIGNvbnN0IGxvYWRlcjEgPSBuZXcgT0JKTG9hZGVyKCBtYW5hZ2VyICk7XHJcbiAqIGNvbnN0IGxvYWRlcjIgPSBuZXcgQ29sbGFkYUxvYWRlciggbWFuYWdlciApO1xyXG4gKiBgYGBcclxuICovXHJcbmNsYXNzIExvYWRpbmdNYW5hZ2VyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBsb2FkaW5nIG1hbmFnZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25Mb2FkXSAtIEV4ZWN1dGVzIHdoZW4gYWxsIGl0ZW1zIGhhdmUgYmVlbiBsb2FkZWQuXHJcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gW29uUHJvZ3Jlc3NdIC0gRXhlY3V0ZXMgd2hlbiBzaW5nbGUgaXRlbXMgaGF2ZSBiZWVuIGxvYWRlZC5cclxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25FcnJvcl0gLSBFeGVjdXRlcyB3aGVuIGFuIGVycm9yIG9jY3Vycy5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xyXG5cclxuXHRcdGNvbnN0IHNjb3BlID0gdGhpcztcclxuXHJcblx0XHRsZXQgaXNMb2FkaW5nID0gZmFsc2U7XHJcblx0XHRsZXQgaXRlbXNMb2FkZWQgPSAwO1xyXG5cdFx0bGV0IGl0ZW1zVG90YWwgPSAwO1xyXG5cdFx0bGV0IHVybE1vZGlmaWVyID0gdW5kZWZpbmVkO1xyXG5cdFx0Y29uc3QgaGFuZGxlcnMgPSBbXTtcclxuXHJcblx0XHQvLyBSZWZlciB0byAjNTY4OSBmb3IgdGhlIHJlYXNvbiB3aHkgd2UgZG9uJ3Qgc2V0IC5vblN0YXJ0XHJcblx0XHQvLyBpbiB0aGUgY29uc3RydWN0b3JcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEV4ZWN1dGVzIHdoZW4gYW4gaXRlbSBzdGFydHMgbG9hZGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7RnVuY3Rpb258dW5kZWZpbmVkfVxyXG5cdFx0ICogQGRlZmF1bHQgdW5kZWZpbmVkXHJcblx0XHQgKi9cclxuXHRcdHRoaXMub25TdGFydCA9IHVuZGVmaW5lZDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEV4ZWN1dGVzIHdoZW4gYWxsIGl0ZW1zIGhhdmUgYmVlbiBsb2FkZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0Z1bmN0aW9ufHVuZGVmaW5lZH1cclxuXHRcdCAqIEBkZWZhdWx0IHVuZGVmaW5lZFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm9uTG9hZCA9IG9uTG9hZDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEV4ZWN1dGVzIHdoZW4gc2luZ2xlIGl0ZW1zIGhhdmUgYmVlbiBsb2FkZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0Z1bmN0aW9ufHVuZGVmaW5lZH1cclxuXHRcdCAqIEBkZWZhdWx0IHVuZGVmaW5lZFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm9uUHJvZ3Jlc3MgPSBvblByb2dyZXNzO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRXhlY3V0ZXMgd2hlbiBhbiBlcnJvciBvY2N1cnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0Z1bmN0aW9ufHVuZGVmaW5lZH1cclxuXHRcdCAqIEBkZWZhdWx0IHVuZGVmaW5lZFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm9uRXJyb3IgPSBvbkVycm9yO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIGJ5IGFueSBsb2FkZXIgdXNpbmcgdGhlIG1hbmFnZXIgd2hlbiB0aGUgbG9hZGVyXHJcblx0XHQgKiBzdGFydHMgbG9hZGluZyBhbiBpdGVtLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSBUaGUgVVJMIHRvIGxvYWQuXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXRlbVN0YXJ0ID0gZnVuY3Rpb24gKCB1cmwgKSB7XHJcblxyXG5cdFx0XHRpdGVtc1RvdGFsICsrO1xyXG5cclxuXHRcdFx0aWYgKCBpc0xvYWRpbmcgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIHNjb3BlLm9uU3RhcnQgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRzY29wZS5vblN0YXJ0KCB1cmwsIGl0ZW1zTG9hZGVkLCBpdGVtc1RvdGFsICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlzTG9hZGluZyA9IHRydWU7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBieSBhbnkgbG9hZGVyIHVzaW5nIHRoZSBtYW5hZ2VyIHdoZW4gdGhlIGxvYWRlclxyXG5cdFx0ICogZW5kZWQgbG9hZGluZyBhbiBpdGVtLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSBUaGUgVVJMIG9mIHRoZSBsb2FkZWQgaXRlbS5cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pdGVtRW5kID0gZnVuY3Rpb24gKCB1cmwgKSB7XHJcblxyXG5cdFx0XHRpdGVtc0xvYWRlZCArKztcclxuXHJcblx0XHRcdGlmICggc2NvcGUub25Qcm9ncmVzcyAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRzY29wZS5vblByb2dyZXNzKCB1cmwsIGl0ZW1zTG9hZGVkLCBpdGVtc1RvdGFsICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIGl0ZW1zTG9hZGVkID09PSBpdGVtc1RvdGFsICkge1xyXG5cclxuXHRcdFx0XHRpc0xvYWRpbmcgPSBmYWxzZTtcclxuXHJcblx0XHRcdFx0aWYgKCBzY29wZS5vbkxvYWQgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRzY29wZS5vbkxvYWQoKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYnkgYW55IGxvYWRlciB1c2luZyB0aGUgbWFuYWdlciB3aGVuIHRoZSBsb2FkZXJcclxuXHRcdCAqIGVuY291bnRlcnMgYW4gZXJyb3Igd2hlbiBsb2FkaW5nIGFuIGl0ZW0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIFRoZSBVUkwgb2YgdGhlIGl0ZW0gdGhhdCBwcm9kdWNlcyBhbiBlcnJvci5cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pdGVtRXJyb3IgPSBmdW5jdGlvbiAoIHVybCApIHtcclxuXHJcblx0XHRcdGlmICggc2NvcGUub25FcnJvciAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRzY29wZS5vbkVycm9yKCB1cmwgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogR2l2ZW4gYSBVUkwsIHVzZXMgdGhlIFVSTCBtb2RpZmllciBjYWxsYmFjayAoaWYgYW55KSBhbmQgcmV0dXJucyBhXHJcblx0XHQgKiByZXNvbHZlZCBVUkwuIElmIG5vIFVSTCBtb2RpZmllciBpcyBzZXQsIHJldHVybnMgdGhlIG9yaWdpbmFsIFVSTC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gVGhlIFVSTCB0byBsb2FkLlxyXG5cdFx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgcmVzb2x2ZWQgVVJMLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJlc29sdmVVUkwgPSBmdW5jdGlvbiAoIHVybCApIHtcclxuXHJcblx0XHRcdGlmICggdXJsTW9kaWZpZXIgKSB7XHJcblxyXG5cdFx0XHRcdHJldHVybiB1cmxNb2RpZmllciggdXJsICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gdXJsO1xyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBJZiBwcm92aWRlZCwgdGhlIGNhbGxiYWNrIHdpbGwgYmUgcGFzc2VkIGVhY2ggcmVzb3VyY2UgVVJMIGJlZm9yZSBhXHJcblx0XHQgKiByZXF1ZXN0IGlzIHNlbnQuIFRoZSBjYWxsYmFjayBtYXkgcmV0dXJuIHRoZSBvcmlnaW5hbCBVUkwsIG9yIGEgbmV3IFVSTCB0b1xyXG5cdFx0ICogb3ZlcnJpZGUgbG9hZGluZyBiZWhhdmlvci4gVGhpcyBiZWhhdmlvciBjYW4gYmUgdXNlZCB0byBsb2FkIGFzc2V0cyBmcm9tXHJcblx0XHQgKiAuWklQIGZpbGVzLCBkcmFnLWFuZC1kcm9wIEFQSXMsIGFuZCBEYXRhIFVSSXMuXHJcblx0XHQgKlxyXG5cdFx0ICogYGBganNcclxuXHRcdCAqIGNvbnN0IGJsb2JzID0geydmaXNoLmdsdGYnOiBibG9iMSwgJ2RpZmZ1c2UucG5nJzogYmxvYjIsICdub3JtYWwucG5nJzogYmxvYjN9O1xyXG5cdFx0ICpcclxuXHRcdCAqIGNvbnN0IG1hbmFnZXIgPSBuZXcgVEhSRUUuTG9hZGluZ01hbmFnZXIoKTtcclxuXHRcdCAqXHJcblx0XHQgKiAvLyBJbml0aWFsaXplIGxvYWRpbmcgbWFuYWdlciB3aXRoIFVSTCBjYWxsYmFjay5cclxuXHRcdCAqIGNvbnN0IG9iamVjdFVSTHMgPSBbXTtcclxuXHRcdCAqIG1hbmFnZXIuc2V0VVJMTW9kaWZpZXIoICggdXJsICkgPT4ge1xyXG5cdFx0ICpcclxuXHRcdCAqIFx0dXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTCggYmxvYnNbIHVybCBdICk7XHJcblx0XHQgKiBcdG9iamVjdFVSTHMucHVzaCggdXJsICk7XHJcblx0XHQgKiBcdHJldHVybiB1cmw7XHJcblx0XHQgKlxyXG5cdFx0ICogfSApO1xyXG5cdFx0ICpcclxuXHRcdCAqIC8vIExvYWQgYXMgdXN1YWwsIHRoZW4gcmV2b2tlIHRoZSBibG9iIFVSTHMuXHJcblx0XHQgKiBjb25zdCBsb2FkZXIgPSBuZXcgR0xURkxvYWRlciggbWFuYWdlciApO1xyXG5cdFx0ICogbG9hZGVyLmxvYWQoICdmaXNoLmdsdGYnLCAoZ2x0ZikgPT4ge1xyXG5cdFx0ICpcclxuXHRcdCAqIFx0c2NlbmUuYWRkKCBnbHRmLnNjZW5lICk7XHJcblx0XHQgKiBcdG9iamVjdFVSTHMuZm9yRWFjaCggKCB1cmwgKSA9PiBVUkwucmV2b2tlT2JqZWN0VVJMKCB1cmwgKSApO1xyXG5cdFx0ICpcclxuXHRcdCAqIH0gKTtcclxuXHRcdCAqIGBgYFxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7ZnVuY3Rpb24oc3RyaW5nKTpzdHJpbmd9IHRyYW5zZm9ybSAtIFVSTCBtb2RpZmllciBjYWxsYmFjay4gQ2FsbGVkIHdpdGggYW4gVVJMIGFuZCBtdXN0IHJldHVybiBhIHJlc29sdmVkIFVSTC5cclxuXHRcdCAqIEByZXR1cm4ge0xvYWRpbmdNYW5hZ2VyfSBBIHJlZmVyZW5jZSB0byB0aGlzIGxvYWRpbmcgbWFuYWdlci5cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zZXRVUkxNb2RpZmllciA9IGZ1bmN0aW9uICggdHJhbnNmb3JtICkge1xyXG5cclxuXHRcdFx0dXJsTW9kaWZpZXIgPSB0cmFuc2Zvcm07XHJcblxyXG5cdFx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVnaXN0ZXJzIGEgbG9hZGVyIHdpdGggdGhlIGdpdmVuIHJlZ3VsYXIgZXhwcmVzc2lvbi4gQ2FuIGJlIHVzZWQgdG9cclxuXHRcdCAqIGRlZmluZSB3aGF0IGxvYWRlciBzaG91bGQgYmUgdXNlZCBpbiBvcmRlciB0byBsb2FkIHNwZWNpZmljIGZpbGVzLiBBXHJcblx0XHQgKiB0eXBpY2FsIHVzZSBjYXNlIGlzIHRvIG92ZXJ3cml0ZSB0aGUgZGVmYXVsdCBsb2FkZXIgZm9yIHRleHR1cmVzLlxyXG5cdFx0ICpcclxuXHRcdCAqIGBgYGpzXHJcblx0XHQgKiAvLyBhZGQgaGFuZGxlciBmb3IgVEdBIHRleHR1cmVzXHJcblx0XHQgKiBtYW5hZ2VyLmFkZEhhbmRsZXIoIC9cXC50Z2EkL2ksIG5ldyBUR0FMb2FkZXIoKSApO1xyXG5cdFx0ICogYGBgXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IHJlZ2V4IC0gQSByZWd1bGFyIGV4cHJlc3Npb24uXHJcblx0XHQgKiBAcGFyYW0ge0xvYWRlcn0gbG9hZGVyIC0gQSBsb2FkZXIgdGhhdCBzaG91bGQgaGFuZGxlIG1hdGNoZWQgY2FzZXMuXHJcblx0XHQgKiBAcmV0dXJuIHtMb2FkaW5nTWFuYWdlcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBsb2FkaW5nIG1hbmFnZXIuXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYWRkSGFuZGxlciA9IGZ1bmN0aW9uICggcmVnZXgsIGxvYWRlciApIHtcclxuXHJcblx0XHRcdGhhbmRsZXJzLnB1c2goIHJlZ2V4LCBsb2FkZXIgKTtcclxuXHJcblx0XHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZW1vdmVzIHRoZSBsb2FkZXIgZm9yIHRoZSBnaXZlbiByZWd1bGFyIGV4cHJlc3Npb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IHJlZ2V4IC0gQSByZWd1bGFyIGV4cHJlc3Npb24uXHJcblx0XHQgKiBAcmV0dXJuIHtMb2FkaW5nTWFuYWdlcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBsb2FkaW5nIG1hbmFnZXIuXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVtb3ZlSGFuZGxlciA9IGZ1bmN0aW9uICggcmVnZXggKSB7XHJcblxyXG5cdFx0XHRjb25zdCBpbmRleCA9IGhhbmRsZXJzLmluZGV4T2YoIHJlZ2V4ICk7XHJcblxyXG5cdFx0XHRpZiAoIGluZGV4ICE9PSAtIDEgKSB7XHJcblxyXG5cdFx0XHRcdGhhbmRsZXJzLnNwbGljZSggaW5kZXgsIDIgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDYW4gYmUgdXNlZCB0byByZXRyaWV2ZSB0aGUgcmVnaXN0ZXJlZCBsb2FkZXIgZm9yIHRoZSBnaXZlbiBmaWxlIHBhdGguXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IGZpbGUgLSBUaGUgZmlsZSBwYXRoLlxyXG5cdFx0ICogQHJldHVybiB7P0xvYWRlcn0gVGhlIHJlZ2lzdGVyZWQgbG9hZGVyLiBSZXR1cm5zIGBudWxsYCBpZiBubyBsb2FkZXIgd2FzIGZvdW5kLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdldEhhbmRsZXIgPSBmdW5jdGlvbiAoIGZpbGUgKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBoYW5kbGVycy5sZW5ndGg7IGkgPCBsOyBpICs9IDIgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHJlZ2V4ID0gaGFuZGxlcnNbIGkgXTtcclxuXHRcdFx0XHRjb25zdCBsb2FkZXIgPSBoYW5kbGVyc1sgaSArIDEgXTtcclxuXHJcblx0XHRcdFx0aWYgKCByZWdleC5nbG9iYWwgKSByZWdleC5sYXN0SW5kZXggPSAwOyAvLyBzZWUgIzE3OTIwXHJcblxyXG5cdFx0XHRcdGlmICggcmVnZXgudGVzdCggZmlsZSApICkge1xyXG5cclxuXHRcdFx0XHRcdHJldHVybiBsb2FkZXI7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBudWxsO1xyXG5cclxuXHRcdH07XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUaGUgZ2xvYmFsIGRlZmF1bHQgbG9hZGluZyBtYW5hZ2VyLlxyXG4gKlxyXG4gKiBAY29uc3RhbnRcclxuICogQHR5cGUge0xvYWRpbmdNYW5hZ2VyfVxyXG4gKi9cclxuY29uc3QgRGVmYXVsdExvYWRpbmdNYW5hZ2VyID0gLypAX19QVVJFX18qLyBuZXcgTG9hZGluZ01hbmFnZXIoKTtcclxuXHJcbmV4cG9ydCB7IERlZmF1bHRMb2FkaW5nTWFuYWdlciwgTG9hZGluZ01hbmFnZXIgfTtcclxuIiwiaW1wb3J0IHsgRGVmYXVsdExvYWRpbmdNYW5hZ2VyIH0gZnJvbSAnLi9Mb2FkaW5nTWFuYWdlci5qcyc7XHJcblxyXG4vKipcclxuICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgbG9hZGVycy5cclxuICpcclxuICogQGFic3RyYWN0XHJcbiAqL1xyXG5jbGFzcyBMb2FkZXIge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGxvYWRlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TG9hZGluZ01hbmFnZXJ9IFttYW5hZ2VyXSAtIFRoZSBsb2FkaW5nIG1hbmFnZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG1hbmFnZXIgKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbG9hZGluZyBtYW5hZ2VyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtMb2FkaW5nTWFuYWdlcn1cclxuXHRcdCAqIEBkZWZhdWx0IERlZmF1bHRMb2FkaW5nTWFuYWdlclxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjcm9zc09yaWdpbiBzdHJpbmcgdG8gaW1wbGVtZW50IENPUlMgZm9yIGxvYWRpbmcgdGhlIHVybCBmcm9tIGFcclxuXHRcdCAqIGRpZmZlcmVudCBkb21haW4gdGhhdCBhbGxvd3MgQ09SUy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICogQGRlZmF1bHQgJ2Fub255bW91cydcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jcm9zc09yaWdpbiA9ICdhbm9ueW1vdXMnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgWE1MSHR0cFJlcXVlc3QgdXNlcyBjcmVkZW50aWFscy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMud2l0aENyZWRlbnRpYWxzID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYmFzZSBwYXRoIGZyb20gd2hpY2ggdGhlIGFzc2V0IHdpbGwgYmUgbG9hZGVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucGF0aCA9ICcnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGJhc2UgcGF0aCBmcm9tIHdoaWNoIGFkZGl0aW9uYWwgcmVzb3VyY2VzIGxpa2UgdGV4dHVyZXMgd2lsbCBiZSBsb2FkZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yZXNvdXJjZVBhdGggPSAnJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBbcmVxdWVzdCBoZWFkZXJde0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvR2xvc3NhcnkvUmVxdWVzdF9oZWFkZXJ9XHJcblx0XHQgKiB1c2VkIGluIEhUVFAgcmVxdWVzdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0PHN0cmluZywgYW55Pn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yZXF1ZXN0SGVhZGVyID0ge307XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgbmVlZHMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgYWxsIGNvbmNyZXRlIGxvYWRlcnMuIEl0IGhvbGRzIHRoZVxyXG5cdCAqIGxvZ2ljIGZvciBsb2FkaW5nIGFzc2V0cyBmcm9tIHRoZSBiYWNrZW5kLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIFRoZSBwYXRoL1VSTCBvZiB0aGUgZmlsZSB0byBiZSBsb2FkZWQuXHJcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gb25Mb2FkIC0gRXhlY3V0ZWQgd2hlbiB0aGUgbG9hZGluZyBwcm9jZXNzIGhhcyBiZWVuIGZpbmlzaGVkLlxyXG5cdCAqIEBwYXJhbSB7b25Qcm9ncmVzc0NhbGxiYWNrfSBbb25Qcm9ncmVzc10gLSBFeGVjdXRlZCB3aGlsZSB0aGUgbG9hZGluZyBpcyBpbiBwcm9ncmVzcy5cclxuXHQgKiBAcGFyYW0ge29uRXJyb3JDYWxsYmFja30gW29uRXJyb3JdIC0gRXhlY3V0ZWQgd2hlbiBlcnJvcnMgb2NjdXIuXHJcblx0ICovXHJcblx0bG9hZCggLyogdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKi8gKSB7fVxyXG5cclxuXHQvKipcclxuXHQgKiBBIGFzeW5jIHZlcnNpb24gb2Yge0BsaW5rIExvYWRlciNsb2FkfS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSBUaGUgcGF0aC9VUkwgb2YgdGhlIGZpbGUgdG8gYmUgbG9hZGVkLlxyXG5cdCAqIEBwYXJhbSB7b25Qcm9ncmVzc0NhbGxiYWNrfSBbb25Qcm9ncmVzc10gLSBFeGVjdXRlZCB3aGlsZSB0aGUgbG9hZGluZyBpcyBpbiBwcm9ncmVzcy5cclxuXHQgKiBAcmV0dXJuIHtQcm9taXNlfSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBhc3NldCBoYXMgYmVlbiBsb2FkZWQuXHJcblx0ICovXHJcblx0bG9hZEFzeW5jKCB1cmwsIG9uUHJvZ3Jlc3MgKSB7XHJcblxyXG5cdFx0Y29uc3Qgc2NvcGUgPSB0aGlzO1xyXG5cclxuXHRcdHJldHVybiBuZXcgUHJvbWlzZSggZnVuY3Rpb24gKCByZXNvbHZlLCByZWplY3QgKSB7XHJcblxyXG5cdFx0XHRzY29wZS5sb2FkKCB1cmwsIHJlc29sdmUsIG9uUHJvZ3Jlc3MsIHJlamVjdCApO1xyXG5cclxuXHRcdH0gKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBuZWVkcyB0byBiZSBpbXBsZW1lbnRlZCBieSBhbGwgY29uY3JldGUgbG9hZGVycy4gSXQgaG9sZHMgdGhlXHJcblx0ICogbG9naWMgZm9yIHBhcnNpbmcgdGhlIGFzc2V0IGludG8gdGhyZWUuanMgZW50aXRpZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge2FueX0gZGF0YSAtIFRoZSBkYXRhIHRvIHBhcnNlLlxyXG5cdCAqL1xyXG5cdHBhcnNlKCAvKiBkYXRhICovICkge31cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgYGNyb3NzT3JpZ2luYCBTdHJpbmcgdG8gaW1wbGVtZW50IENPUlMgZm9yIGxvYWRpbmcgdGhlIFVSTFxyXG5cdCAqIGZyb20gYSBkaWZmZXJlbnQgZG9tYWluIHRoYXQgYWxsb3dzIENPUlMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gY3Jvc3NPcmlnaW4gLSBUaGUgYGNyb3NzT3JpZ2luYCB2YWx1ZS5cclxuXHQgKiBAcmV0dXJuIHtMb2FkZXJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0Q3Jvc3NPcmlnaW4oIGNyb3NzT3JpZ2luICkge1xyXG5cclxuXHRcdHRoaXMuY3Jvc3NPcmlnaW4gPSBjcm9zc09yaWdpbjtcclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdoZXRoZXIgdGhlIFhNTEh0dHBSZXF1ZXN0IHVzZXMgY3JlZGVudGlhbHMgc3VjaCBhcyBjb29raWVzLCBhdXRob3JpemF0aW9uXHJcblx0ICogaGVhZGVycyBvciBUTFMgY2xpZW50IGNlcnRpZmljYXRlcywgc2VlIFtYTUxIdHRwUmVxdWVzdC53aXRoQ3JlZGVudGlhbHNde0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9YTUxIdHRwUmVxdWVzdC93aXRoQ3JlZGVudGlhbHN9LlxyXG5cdCAqXHJcblx0ICogTm90ZTogVGhpcyBzZXR0aW5nIGhhcyBubyBlZmZlY3QgaWYgeW91IGFyZSBsb2FkaW5nIGZpbGVzIGxvY2FsbHkgb3IgZnJvbSB0aGUgc2FtZSBkb21haW4uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbHVlIC0gVGhlIGB3aXRoQ3JlZGVudGlhbHNgIHZhbHVlLlxyXG5cdCAqIEByZXR1cm4ge0xvYWRlcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXRXaXRoQ3JlZGVudGlhbHMoIHZhbHVlICkge1xyXG5cclxuXHRcdHRoaXMud2l0aENyZWRlbnRpYWxzID0gdmFsdWU7XHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBiYXNlIHBhdGggZm9yIHRoZSBhc3NldC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gVGhlIGJhc2UgcGF0aC5cclxuXHQgKiBAcmV0dXJuIHtMb2FkZXJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0UGF0aCggcGF0aCApIHtcclxuXHJcblx0XHR0aGlzLnBhdGggPSBwYXRoO1xyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgYmFzZSBwYXRoIGZvciBkZXBlbmRlbnQgcmVzb3VyY2VzIGxpa2UgdGV4dHVyZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcmVzb3VyY2VQYXRoIC0gVGhlIHJlc291cmNlIHBhdGguXHJcblx0ICogQHJldHVybiB7TG9hZGVyfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldFJlc291cmNlUGF0aCggcmVzb3VyY2VQYXRoICkge1xyXG5cclxuXHRcdHRoaXMucmVzb3VyY2VQYXRoID0gcmVzb3VyY2VQYXRoO1xyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZ2l2ZW4gcmVxdWVzdCBoZWFkZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gcmVxdWVzdEhlYWRlciAtIEEgW3JlcXVlc3QgaGVhZGVyXXtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0dsb3NzYXJ5L1JlcXVlc3RfaGVhZGVyfVxyXG5cdCAqIGZvciBjb25maWd1cmluZyB0aGUgSFRUUCByZXF1ZXN0LlxyXG5cdCAqIEByZXR1cm4ge0xvYWRlcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXRSZXF1ZXN0SGVhZGVyKCByZXF1ZXN0SGVhZGVyICkge1xyXG5cclxuXHRcdHRoaXMucmVxdWVzdEhlYWRlciA9IHJlcXVlc3RIZWFkZXI7XHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIENhbGxiYWNrIGZvciBvblByb2dyZXNzIGluIGxvYWRlcnMuXHJcbiAqXHJcbiAqIEBjYWxsYmFjayBvblByb2dyZXNzQ2FsbGJhY2tcclxuICogQHBhcmFtIHtQcm9ncmVzc0V2ZW50fSBldmVudCAtIEFuIGluc3RhbmNlIG9mIGBQcm9ncmVzc0V2ZW50YCB0aGF0IHJlcHJlc2VudHMgdGhlIGN1cnJlbnQgbG9hZGluZyBzdGF0dXMuXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIENhbGxiYWNrIGZvciBvbkVycm9yIGluIGxvYWRlcnMuXHJcbiAqXHJcbiAqIEBjYWxsYmFjayBvbkVycm9yQ2FsbGJhY2tcclxuICogQHBhcmFtIHtFcnJvcn0gZXJyb3IgLSBUaGUgZXJyb3Igd2hpY2ggb2NjdXJyZWQgZHVyaW5nIHRoZSBsb2FkaW5nIHByb2Nlc3MuXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFRoZSBkZWZhdWx0IG1hdGVyaWFsIG5hbWUgdGhhdCBpcyB1c2VkIGJ5IGxvYWRlcnNcclxuICogd2hlbiBjcmVhdGluZyBtYXRlcmlhbHMgZm9yIGxvYWRlZCAzRCBvYmplY3RzLlxyXG4gKlxyXG4gKiBOb3RlOiBOb3QgYWxsIGxvYWRlcnMgbWlnaHQgaG9ub3IgdGhpcyBzZXR0aW5nLlxyXG4gKlxyXG4gKiBAc3RhdGljXHJcbiAqIEB0eXBlIHtzdHJpbmd9XHJcbiAqIEBkZWZhdWx0ICdfX0RFRkFVTFQnXHJcbiAqL1xyXG5Mb2FkZXIuREVGQVVMVF9NQVRFUklBTF9OQU1FID0gJ19fREVGQVVMVCc7XHJcblxyXG5leHBvcnQgeyBMb2FkZXIgfTtcclxuIiwiaW1wb3J0IHsgQ2FjaGUgfSBmcm9tICcuL0NhY2hlLmpzJztcclxuaW1wb3J0IHsgTG9hZGVyIH0gZnJvbSAnLi9Mb2FkZXIuanMnO1xyXG5cclxuY29uc3QgbG9hZGluZyA9IHt9O1xyXG5cclxuY2xhc3MgSHR0cEVycm9yIGV4dGVuZHMgRXJyb3Ige1xyXG5cclxuXHRjb25zdHJ1Y3RvciggbWVzc2FnZSwgcmVzcG9uc2UgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG1lc3NhZ2UgKTtcclxuXHRcdHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIEEgbG93IGxldmVsIGNsYXNzIGZvciBsb2FkaW5nIHJlc291cmNlcyB3aXRoIHRoZSBGZXRjaCBBUEksIHVzZWQgaW50ZXJuYWxseSBieVxyXG4gKiBtb3N0IGxvYWRlcnMuIEl0IGNhbiBhbHNvIGJlIHVzZWQgZGlyZWN0bHkgdG8gbG9hZCBhbnkgZmlsZSB0eXBlIHRoYXQgZG9lc1xyXG4gKiBub3QgaGF2ZSBhIGxvYWRlci5cclxuICpcclxuICogVGhpcyBsb2FkZXIgc3VwcG9ydHMgY2FjaGluZy4gSWYgeW91IHdhbnQgdG8gdXNlIGl0LCBhZGQgYFRIUkVFLkNhY2hlLmVuYWJsZWQgPSB0cnVlO2BcclxuICogb25jZSB0byB5b3VyIGFwcGxpY2F0aW9uLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBsb2FkZXIgPSBuZXcgVEhSRUUuRmlsZUxvYWRlcigpO1xyXG4gKiBjb25zdCBkYXRhID0gYXdhaXQgbG9hZGVyLmxvYWRBc3luYyggJ2V4YW1wbGUudHh0JyApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIExvYWRlclxyXG4gKi9cclxuY2xhc3MgRmlsZUxvYWRlciBleHRlbmRzIExvYWRlciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgZmlsZSBsb2FkZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0xvYWRpbmdNYW5hZ2VyfSBbbWFuYWdlcl0gLSBUaGUgbG9hZGluZyBtYW5hZ2VyLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBtYW5hZ2VyICkge1xyXG5cclxuXHRcdHN1cGVyKCBtYW5hZ2VyICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZXhwZWN0ZWQgbWltZSB0eXBlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWltZVR5cGUgPSAnJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBleHBlY3RlZCByZXNwb25zZSB0eXBlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoJ2FycmF5YnVmZmVyJ3wnYmxvYid8J2RvY3VtZW50J3wnanNvbid8JycpfVxyXG5cdFx0ICogQGRlZmF1bHQgJydcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yZXNwb25zZVR5cGUgPSAnJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTdGFydHMgbG9hZGluZyBmcm9tIHRoZSBnaXZlbiBVUkwgYW5kIHBhc3MgdGhlIGxvYWRlZCByZXNwb25zZSB0byB0aGUgYG9uTG9hZCgpYCBjYWxsYmFjay5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSBUaGUgcGF0aC9VUkwgb2YgdGhlIGZpbGUgdG8gYmUgbG9hZGVkLiBUaGlzIGNhbiBhbHNvIGJlIGEgZGF0YSBVUkkuXHJcblx0ICogQHBhcmFtIHtmdW5jdGlvbihhbnkpfSBvbkxvYWQgLSBFeGVjdXRlZCB3aGVuIHRoZSBsb2FkaW5nIHByb2Nlc3MgaGFzIGJlZW4gZmluaXNoZWQuXHJcblx0ICogQHBhcmFtIHtvblByb2dyZXNzQ2FsbGJhY2t9IFtvblByb2dyZXNzXSAtIEV4ZWN1dGVkIHdoaWxlIHRoZSBsb2FkaW5nIGlzIGluIHByb2dyZXNzLlxyXG5cdCAqIEBwYXJhbSB7b25FcnJvckNhbGxiYWNrfSBbb25FcnJvcl0gLSBFeGVjdXRlZCB3aGVuIGVycm9ycyBvY2N1ci5cclxuXHQgKiBAcmV0dXJuIHthbnl8dW5kZWZpbmVkfSBUaGUgY2FjaGVkIHJlc291cmNlIGlmIGF2YWlsYWJsZS5cclxuXHQgKi9cclxuXHRsb2FkKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcclxuXHJcblx0XHRpZiAoIHVybCA9PT0gdW5kZWZpbmVkICkgdXJsID0gJyc7XHJcblxyXG5cdFx0aWYgKCB0aGlzLnBhdGggIT09IHVuZGVmaW5lZCApIHVybCA9IHRoaXMucGF0aCArIHVybDtcclxuXHJcblx0XHR1cmwgPSB0aGlzLm1hbmFnZXIucmVzb2x2ZVVSTCggdXJsICk7XHJcblxyXG5cdFx0Y29uc3QgY2FjaGVkID0gQ2FjaGUuZ2V0KCB1cmwgKTtcclxuXHJcblx0XHRpZiAoIGNhY2hlZCAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0dGhpcy5tYW5hZ2VyLml0ZW1TdGFydCggdXJsICk7XHJcblxyXG5cdFx0XHRzZXRUaW1lb3V0KCAoKSA9PiB7XHJcblxyXG5cdFx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCBjYWNoZWQgKTtcclxuXHJcblx0XHRcdFx0dGhpcy5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xyXG5cclxuXHRcdFx0fSwgMCApO1xyXG5cclxuXHRcdFx0cmV0dXJuIGNhY2hlZDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQ2hlY2sgaWYgcmVxdWVzdCBpcyBkdXBsaWNhdGVcclxuXHJcblx0XHRpZiAoIGxvYWRpbmdbIHVybCBdICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRsb2FkaW5nWyB1cmwgXS5wdXNoKCB7XHJcblxyXG5cdFx0XHRcdG9uTG9hZDogb25Mb2FkLFxyXG5cdFx0XHRcdG9uUHJvZ3Jlc3M6IG9uUHJvZ3Jlc3MsXHJcblx0XHRcdFx0b25FcnJvcjogb25FcnJvclxyXG5cclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBJbml0aWFsaXNlIGFycmF5IGZvciBkdXBsaWNhdGUgcmVxdWVzdHNcclxuXHRcdGxvYWRpbmdbIHVybCBdID0gW107XHJcblxyXG5cdFx0bG9hZGluZ1sgdXJsIF0ucHVzaCgge1xyXG5cdFx0XHRvbkxvYWQ6IG9uTG9hZCxcclxuXHRcdFx0b25Qcm9ncmVzczogb25Qcm9ncmVzcyxcclxuXHRcdFx0b25FcnJvcjogb25FcnJvcixcclxuXHRcdH0gKTtcclxuXHJcblx0XHQvLyBjcmVhdGUgcmVxdWVzdFxyXG5cdFx0Y29uc3QgcmVxID0gbmV3IFJlcXVlc3QoIHVybCwge1xyXG5cdFx0XHRoZWFkZXJzOiBuZXcgSGVhZGVycyggdGhpcy5yZXF1ZXN0SGVhZGVyICksXHJcblx0XHRcdGNyZWRlbnRpYWxzOiB0aGlzLndpdGhDcmVkZW50aWFscyA/ICdpbmNsdWRlJyA6ICdzYW1lLW9yaWdpbicsXHJcblx0XHRcdC8vIEFuIGFib3J0IGNvbnRyb2xsZXIgY291bGQgYmUgYWRkZWQgd2l0aGluIGEgZnV0dXJlIFBSXHJcblx0XHR9ICk7XHJcblxyXG5cdFx0Ly8gcmVjb3JkIHN0YXRlcyAoIGF2b2lkIGRhdGEgcmFjZSApXHJcblx0XHRjb25zdCBtaW1lVHlwZSA9IHRoaXMubWltZVR5cGU7XHJcblx0XHRjb25zdCByZXNwb25zZVR5cGUgPSB0aGlzLnJlc3BvbnNlVHlwZTtcclxuXHJcblx0XHQvLyBzdGFydCB0aGUgZmV0Y2hcclxuXHRcdGZldGNoKCByZXEgKVxyXG5cdFx0XHQudGhlbiggcmVzcG9uc2UgPT4ge1xyXG5cclxuXHRcdFx0XHRpZiAoIHJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwIHx8IHJlc3BvbnNlLnN0YXR1cyA9PT0gMCApIHtcclxuXHJcblx0XHRcdFx0XHQvLyBTb21lIGJyb3dzZXJzIHJldHVybiBIVFRQIFN0YXR1cyAwIHdoZW4gdXNpbmcgbm9uLWh0dHAgcHJvdG9jb2xcclxuXHRcdFx0XHRcdC8vIGUuZy4gJ2ZpbGU6Ly8nIG9yICdkYXRhOi8vJy4gSGFuZGxlIGFzIHN1Y2Nlc3MuXHJcblxyXG5cdFx0XHRcdFx0aWYgKCByZXNwb25zZS5zdGF0dXMgPT09IDAgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5GaWxlTG9hZGVyOiBIVFRQIFN0YXR1cyAwIHJlY2VpdmVkLicgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Ly8gV29ya2Fyb3VuZDogQ2hlY2tpbmcgaWYgcmVzcG9uc2UuYm9keSA9PT0gdW5kZWZpbmVkIGZvciBBbGlwYXkgYnJvd3NlciAjMjM1NDhcclxuXHJcblx0XHRcdFx0XHRpZiAoIHR5cGVvZiBSZWFkYWJsZVN0cmVhbSA9PT0gJ3VuZGVmaW5lZCcgfHwgcmVzcG9uc2UuYm9keSA9PT0gdW5kZWZpbmVkIHx8IHJlc3BvbnNlLmJvZHkuZ2V0UmVhZGVyID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gcmVzcG9uc2U7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGNhbGxiYWNrcyA9IGxvYWRpbmdbIHVybCBdO1xyXG5cdFx0XHRcdFx0Y29uc3QgcmVhZGVyID0gcmVzcG9uc2UuYm9keS5nZXRSZWFkZXIoKTtcclxuXHJcblx0XHRcdFx0XHQvLyBOZ2lueCBuZWVkcyBYLUZpbGUtU2l6ZSBjaGVja1xyXG5cdFx0XHRcdFx0Ly8gaHR0cHM6Ly9zZXJ2ZXJmYXVsdC5jb20vcXVlc3Rpb25zLzQ4Mjg3NS93aHktZG9lcy1uZ2lueC1yZW1vdmUtY29udGVudC1sZW5ndGgtaGVhZGVyLWZvci1jaHVua2VkLWNvbnRlbnRcclxuXHRcdFx0XHRcdGNvbnN0IGNvbnRlbnRMZW5ndGggPSByZXNwb25zZS5oZWFkZXJzLmdldCggJ1gtRmlsZS1TaXplJyApIHx8IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCAnQ29udGVudC1MZW5ndGgnICk7XHJcblx0XHRcdFx0XHRjb25zdCB0b3RhbCA9IGNvbnRlbnRMZW5ndGggPyBwYXJzZUludCggY29udGVudExlbmd0aCApIDogMDtcclxuXHRcdFx0XHRcdGNvbnN0IGxlbmd0aENvbXB1dGFibGUgPSB0b3RhbCAhPT0gMDtcclxuXHRcdFx0XHRcdGxldCBsb2FkZWQgPSAwO1xyXG5cclxuXHRcdFx0XHRcdC8vIHBlcmlvZGljYWxseSByZWFkIGRhdGEgaW50byB0aGUgbmV3IHN0cmVhbSB0cmFja2luZyB3aGlsZSBkb3dubG9hZCBwcm9ncmVzc1xyXG5cdFx0XHRcdFx0Y29uc3Qgc3RyZWFtID0gbmV3IFJlYWRhYmxlU3RyZWFtKCB7XHJcblx0XHRcdFx0XHRcdHN0YXJ0KCBjb250cm9sbGVyICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRyZWFkRGF0YSgpO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRmdW5jdGlvbiByZWFkRGF0YSgpIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRyZWFkZXIucmVhZCgpLnRoZW4oICggeyBkb25lLCB2YWx1ZSB9ICkgPT4ge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBkb25lICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb250cm9sbGVyLmNsb3NlKCk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRsb2FkZWQgKz0gdmFsdWUuYnl0ZUxlbmd0aDtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgZXZlbnQgPSBuZXcgUHJvZ3Jlc3NFdmVudCggJ3Byb2dyZXNzJywgeyBsZW5ndGhDb21wdXRhYmxlLCBsb2FkZWQsIHRvdGFsIH0gKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gY2FsbGJhY2tzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGNhbGxiYWNrID0gY2FsbGJhY2tzWyBpIF07XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrLm9uUHJvZ3Jlc3MgKSBjYWxsYmFjay5vblByb2dyZXNzKCBldmVudCApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnRyb2xsZXIuZW5xdWV1ZSggdmFsdWUgKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZWFkRGF0YSgpO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdH0sICggZSApID0+IHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnRyb2xsZXIuZXJyb3IoIGUgKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIG5ldyBSZXNwb25zZSggc3RyZWFtICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0dGhyb3cgbmV3IEh0dHBFcnJvciggYGZldGNoIGZvciBcIiR7cmVzcG9uc2UudXJsfVwiIHJlc3BvbmRlZCB3aXRoICR7cmVzcG9uc2Uuc3RhdHVzfTogJHtyZXNwb25zZS5zdGF0dXNUZXh0fWAsIHJlc3BvbnNlICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gKVxyXG5cdFx0XHQudGhlbiggcmVzcG9uc2UgPT4ge1xyXG5cclxuXHRcdFx0XHRzd2l0Y2ggKCByZXNwb25zZVR5cGUgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y2FzZSAnYXJyYXlidWZmZXInOlxyXG5cclxuXHRcdFx0XHRcdFx0cmV0dXJuIHJlc3BvbnNlLmFycmF5QnVmZmVyKCk7XHJcblxyXG5cdFx0XHRcdFx0Y2FzZSAnYmxvYic6XHJcblxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gcmVzcG9uc2UuYmxvYigpO1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgJ2RvY3VtZW50JzpcclxuXHJcblx0XHRcdFx0XHRcdHJldHVybiByZXNwb25zZS50ZXh0KClcclxuXHRcdFx0XHRcdFx0XHQudGhlbiggdGV4dCA9PiB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHBhcnNlci5wYXJzZUZyb21TdHJpbmcoIHRleHQsIG1pbWVUeXBlICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdH0gKTtcclxuXHJcblx0XHRcdFx0XHRjYXNlICdqc29uJzpcclxuXHJcblx0XHRcdFx0XHRcdHJldHVybiByZXNwb25zZS5qc29uKCk7XHJcblxyXG5cdFx0XHRcdFx0ZGVmYXVsdDpcclxuXHJcblx0XHRcdFx0XHRcdGlmICggbWltZVR5cGUgPT09ICcnICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gcmVzcG9uc2UudGV4dCgpO1xyXG5cclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0Ly8gc25pZmYgZW5jb2RpbmdcclxuXHRcdFx0XHRcdFx0XHRjb25zdCByZSA9IC9jaGFyc2V0PVwiPyhbXjtcIlxcc10qKVwiPy9pO1xyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGV4ZWMgPSByZS5leGVjKCBtaW1lVHlwZSApO1xyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGxhYmVsID0gZXhlYyAmJiBleGVjWyAxIF0gPyBleGVjWyAxIF0udG9Mb3dlckNhc2UoKSA6IHVuZGVmaW5lZDtcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCBsYWJlbCApO1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybiByZXNwb25zZS5hcnJheUJ1ZmZlcigpLnRoZW4oIGFiID0+IGRlY29kZXIuZGVjb2RlKCBhYiApICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gKVxyXG5cdFx0XHQudGhlbiggZGF0YSA9PiB7XHJcblxyXG5cdFx0XHRcdC8vIEFkZCB0byBjYWNoZSBvbmx5IG9uIEhUVFAgc3VjY2Vzcywgc28gdGhhdCB3ZSBkbyBub3QgY2FjaGVcclxuXHRcdFx0XHQvLyBlcnJvciByZXNwb25zZSBib2RpZXMgYXMgcHJvcGVyIHJlc3BvbnNlcyB0byByZXF1ZXN0cy5cclxuXHRcdFx0XHRDYWNoZS5hZGQoIHVybCwgZGF0YSApO1xyXG5cclxuXHRcdFx0XHRjb25zdCBjYWxsYmFja3MgPSBsb2FkaW5nWyB1cmwgXTtcclxuXHRcdFx0XHRkZWxldGUgbG9hZGluZ1sgdXJsIF07XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBjYWxsYmFja3MubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgY2FsbGJhY2sgPSBjYWxsYmFja3NbIGkgXTtcclxuXHRcdFx0XHRcdGlmICggY2FsbGJhY2sub25Mb2FkICkgY2FsbGJhY2sub25Mb2FkKCBkYXRhICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gKVxyXG5cdFx0XHQuY2F0Y2goIGVyciA9PiB7XHJcblxyXG5cdFx0XHRcdC8vIEFib3J0IGVycm9ycyBhbmQgb3RoZXIgZXJyb3JzIGFyZSBoYW5kbGVkIHRoZSBzYW1lXHJcblxyXG5cdFx0XHRcdGNvbnN0IGNhbGxiYWNrcyA9IGxvYWRpbmdbIHVybCBdO1xyXG5cclxuXHRcdFx0XHRpZiAoIGNhbGxiYWNrcyA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdC8vIFdoZW4gb25Mb2FkIHdhcyBjYWxsZWQgYW5kIHVybCB3YXMgZGVsZXRlZCBpbiBgbG9hZGluZ2BcclxuXHRcdFx0XHRcdHRoaXMubWFuYWdlci5pdGVtRXJyb3IoIHVybCApO1xyXG5cdFx0XHRcdFx0dGhyb3cgZXJyO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGRlbGV0ZSBsb2FkaW5nWyB1cmwgXTtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBjYWxsYmFjayA9IGNhbGxiYWNrc1sgaSBdO1xyXG5cdFx0XHRcdFx0aWYgKCBjYWxsYmFjay5vbkVycm9yICkgY2FsbGJhY2sub25FcnJvciggZXJyICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0dGhpcy5tYW5hZ2VyLml0ZW1FcnJvciggdXJsICk7XHJcblxyXG5cdFx0XHR9IClcclxuXHRcdFx0LmZpbmFsbHkoICgpID0+IHtcclxuXHJcblx0XHRcdFx0dGhpcy5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xyXG5cclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdHRoaXMubWFuYWdlci5pdGVtU3RhcnQoIHVybCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGV4cGVjdGVkIHJlc3BvbnNlIHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geygnYXJyYXlidWZmZXInfCdibG9iJ3wnZG9jdW1lbnQnfCdqc29uJ3wnJyl9IHZhbHVlIC0gVGhlIHJlc3BvbnNlIHR5cGUuXHJcblx0ICogQHJldHVybiB7RmlsZUxvYWRlcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBmaWxlIGxvYWRlci5cclxuXHQgKi9cclxuXHRzZXRSZXNwb25zZVR5cGUoIHZhbHVlICkge1xyXG5cclxuXHRcdHRoaXMucmVzcG9uc2VUeXBlID0gdmFsdWU7XHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBleHBlY3RlZCBtaW1lIHR5cGUgb2YgdGhlIGxvYWRlZCBmaWxlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gVGhlIG1pbWUgdHlwZS5cclxuXHQgKiBAcmV0dXJuIHtGaWxlTG9hZGVyfSBBIHJlZmVyZW5jZSB0byB0aGlzIGZpbGUgbG9hZGVyLlxyXG5cdCAqL1xyXG5cdHNldE1pbWVUeXBlKCB2YWx1ZSApIHtcclxuXHJcblx0XHR0aGlzLm1pbWVUeXBlID0gdmFsdWU7XHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCB7IEZpbGVMb2FkZXIgfTtcclxuIiwiaW1wb3J0IHsgQW5pbWF0aW9uQ2xpcCB9IGZyb20gJy4uL2FuaW1hdGlvbi9BbmltYXRpb25DbGlwLmpzJztcclxuaW1wb3J0IHsgRmlsZUxvYWRlciB9IGZyb20gJy4vRmlsZUxvYWRlci5qcyc7XHJcbmltcG9ydCB7IExvYWRlciB9IGZyb20gJy4vTG9hZGVyLmpzJztcclxuXHJcbi8qKlxyXG4gKiBDbGFzcyBmb3IgbG9hZGluZyBhbmltYXRpb24gY2xpcHMgaW4gdGhlIEpTT04gZm9ybWF0LiBUaGUgZmlsZXMgYXJlIGludGVybmFsbHlcclxuICogbG9hZGVkIHZpYSB7QGxpbmsgRmlsZUxvYWRlcn0uXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGxvYWRlciA9IG5ldyBUSFJFRS5BbmltYXRpb25Mb2FkZXIoKTtcclxuICogY29uc3QgYW5pbWF0aW9ucyA9IGF3YWl0IGxvYWRlci5sb2FkQXN5bmMoICdhbmltYXRpb25zL2FuaW1hdGlvbi5qcycgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBMb2FkZXJcclxuICovXHJcbmNsYXNzIEFuaW1hdGlvbkxvYWRlciBleHRlbmRzIExvYWRlciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYW5pbWF0aW9uIGxvYWRlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TG9hZGluZ01hbmFnZXJ9IFttYW5hZ2VyXSAtIFRoZSBsb2FkaW5nIG1hbmFnZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG1hbmFnZXIgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG1hbmFnZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTdGFydHMgbG9hZGluZyBmcm9tIHRoZSBnaXZlbiBVUkwgYW5kIHBhc3MgdGhlIGxvYWRlZCBhbmltYXRpb25zIGFzIGFuIGFycmF5XHJcblx0ICogaG9sZGluZyBpbnN0YW5jZXMgb2Yge0BsaW5rIEFuaW1hdGlvbkNsaXB9IHRvIHRoZSBgb25Mb2FkKClgIGNhbGxiYWNrLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIFRoZSBwYXRoL1VSTCBvZiB0aGUgZmlsZSB0byBiZSBsb2FkZWQuIFRoaXMgY2FuIGFsc28gYmUgYSBkYXRhIFVSSS5cclxuXHQgKiBAcGFyYW0ge2Z1bmN0aW9uKEFycmF5PEFuaW1hdGlvbkNsaXA+KX0gb25Mb2FkIC0gRXhlY3V0ZWQgd2hlbiB0aGUgbG9hZGluZyBwcm9jZXNzIGhhcyBiZWVuIGZpbmlzaGVkLlxyXG5cdCAqIEBwYXJhbSB7b25Qcm9ncmVzc0NhbGxiYWNrfSBvblByb2dyZXNzIC0gRXhlY3V0ZWQgd2hpbGUgdGhlIGxvYWRpbmcgaXMgaW4gcHJvZ3Jlc3MuXHJcblx0ICogQHBhcmFtIHtvbkVycm9yQ2FsbGJhY2t9IG9uRXJyb3IgLSBFeGVjdXRlZCB3aGVuIGVycm9ycyBvY2N1ci5cclxuXHQgKi9cclxuXHRsb2FkKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcclxuXHJcblx0XHRjb25zdCBzY29wZSA9IHRoaXM7XHJcblxyXG5cdFx0Y29uc3QgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIoIHRoaXMubWFuYWdlciApO1xyXG5cdFx0bG9hZGVyLnNldFBhdGgoIHRoaXMucGF0aCApO1xyXG5cdFx0bG9hZGVyLnNldFJlcXVlc3RIZWFkZXIoIHRoaXMucmVxdWVzdEhlYWRlciApO1xyXG5cdFx0bG9hZGVyLnNldFdpdGhDcmVkZW50aWFscyggdGhpcy53aXRoQ3JlZGVudGlhbHMgKTtcclxuXHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggdGV4dCApIHtcclxuXHJcblx0XHRcdHRyeSB7XHJcblxyXG5cdFx0XHRcdG9uTG9hZCggc2NvcGUucGFyc2UoIEpTT04ucGFyc2UoIHRleHQgKSApICk7XHJcblxyXG5cdFx0XHR9IGNhdGNoICggZSApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBvbkVycm9yICkge1xyXG5cclxuXHRcdFx0XHRcdG9uRXJyb3IoIGUgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCBlICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRXJyb3IoIHVybCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQYXJzZXMgdGhlIGdpdmVuIEpTT04gb2JqZWN0IGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIGFuaW1hdGlvbiBjbGlwcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBqc29uIC0gVGhlIHNlcmlhbGl6ZWQgYW5pbWF0aW9uIGNsaXBzLlxyXG5cdCAqIEByZXR1cm4ge0FycmF5PEFuaW1hdGlvbkNsaXA+fSBUaGUgcGFyc2VkIGFuaW1hdGlvbiBjbGlwcy5cclxuXHQgKi9cclxuXHRwYXJzZSgganNvbiApIHtcclxuXHJcblx0XHRjb25zdCBhbmltYXRpb25zID0gW107XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwganNvbi5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBjbGlwID0gQW5pbWF0aW9uQ2xpcC5wYXJzZSgganNvblsgaSBdICk7XHJcblxyXG5cdFx0XHRhbmltYXRpb25zLnB1c2goIGNsaXAgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGFuaW1hdGlvbnM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBBbmltYXRpb25Mb2FkZXIgfTtcclxuIiwiaW1wb3J0IHsgTGluZWFyRmlsdGVyIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgRmlsZUxvYWRlciB9IGZyb20gJy4vRmlsZUxvYWRlci5qcyc7XHJcbmltcG9ydCB7IENvbXByZXNzZWRUZXh0dXJlIH0gZnJvbSAnLi4vdGV4dHVyZXMvQ29tcHJlc3NlZFRleHR1cmUuanMnO1xyXG5pbXBvcnQgeyBMb2FkZXIgfSBmcm9tICcuL0xvYWRlci5qcyc7XHJcblxyXG4vKipcclxuICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgbG9hZGluZyBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0cyBTM1RDLCBBU1RDIG9yIEVUQy5cclxuICogVGV4dHVyZXMgYXJlIGludGVybmFsbHkgbG9hZGVkIHZpYSB7QGxpbmsgRmlsZUxvYWRlcn0uXHJcbiAqXHJcbiAqIERlcml2ZWQgY2xhc3NlcyBoYXZlIHRvIGltcGxlbWVudCB0aGUgYHBhcnNlKClgIG1ldGhvZCB3aGljaCBob2xkcyB0aGUgcGFyc2luZ1xyXG4gKiBmb3IgdGhlIHJlc3BlY3RpdmUgZm9ybWF0LlxyXG4gKlxyXG4gKiBAYWJzdHJhY3RcclxuICogQGF1Z21lbnRzIExvYWRlclxyXG4gKi9cclxuY2xhc3MgQ29tcHJlc3NlZFRleHR1cmVMb2FkZXIgZXh0ZW5kcyBMb2FkZXIge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGNvbXByZXNzZWQgdGV4dHVyZSBsb2FkZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0xvYWRpbmdNYW5hZ2VyfSBbbWFuYWdlcl0gLSBUaGUgbG9hZGluZyBtYW5hZ2VyLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBtYW5hZ2VyICkge1xyXG5cclxuXHRcdHN1cGVyKCBtYW5hZ2VyICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3RhcnRzIGxvYWRpbmcgZnJvbSB0aGUgZ2l2ZW4gVVJMIGFuZCBwYXNzZXMgdGhlIGxvYWRlZCBjb21wcmVzc2VkIHRleHR1cmVcclxuXHQgKiB0byB0aGUgYG9uTG9hZCgpYCBjYWxsYmFjay4gVGhlIG1ldGhvZCBhbHNvIHJldHVybnMgYSBuZXcgdGV4dHVyZSBvYmplY3Qgd2hpY2ggY2FuXHJcblx0ICogZGlyZWN0bHkgYmUgdXNlZCBmb3IgbWF0ZXJpYWwgY3JlYXRpb24uIElmIHlvdSBkbyBpdCB0aGlzIHdheSwgdGhlIHRleHR1cmVcclxuXHQgKiBtYXkgcG9wIHVwIGluIHlvdXIgc2NlbmUgb25jZSB0aGUgcmVzcGVjdGl2ZSBsb2FkaW5nIHByb2Nlc3MgaXMgZmluaXNoZWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gVGhlIHBhdGgvVVJMIG9mIHRoZSBmaWxlIHRvIGJlIGxvYWRlZC4gVGhpcyBjYW4gYWxzbyBiZSBhIGRhdGEgVVJJLlxyXG5cdCAqIEBwYXJhbSB7ZnVuY3Rpb24oQ29tcHJlc3NlZFRleHR1cmUpfSBvbkxvYWQgLSBFeGVjdXRlZCB3aGVuIHRoZSBsb2FkaW5nIHByb2Nlc3MgaGFzIGJlZW4gZmluaXNoZWQuXHJcblx0ICogQHBhcmFtIHtvblByb2dyZXNzQ2FsbGJhY2t9IG9uUHJvZ3Jlc3MgLSBFeGVjdXRlZCB3aGlsZSB0aGUgbG9hZGluZyBpcyBpbiBwcm9ncmVzcy5cclxuXHQgKiBAcGFyYW0ge29uRXJyb3JDYWxsYmFja30gb25FcnJvciAtIEV4ZWN1dGVkIHdoZW4gZXJyb3JzIG9jY3VyLlxyXG5cdCAqIEByZXR1cm4ge0NvbXByZXNzZWRUZXh0dXJlfSBUaGUgY29tcHJlc3NlZCB0ZXh0dXJlLlxyXG5cdCAqL1xyXG5cdGxvYWQoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xyXG5cclxuXHRcdGNvbnN0IHNjb3BlID0gdGhpcztcclxuXHJcblx0XHRjb25zdCBpbWFnZXMgPSBbXTtcclxuXHJcblx0XHRjb25zdCB0ZXh0dXJlID0gbmV3IENvbXByZXNzZWRUZXh0dXJlKCk7XHJcblxyXG5cdFx0Y29uc3QgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIoIHRoaXMubWFuYWdlciApO1xyXG5cdFx0bG9hZGVyLnNldFBhdGgoIHRoaXMucGF0aCApO1xyXG5cdFx0bG9hZGVyLnNldFJlc3BvbnNlVHlwZSggJ2FycmF5YnVmZmVyJyApO1xyXG5cdFx0bG9hZGVyLnNldFJlcXVlc3RIZWFkZXIoIHRoaXMucmVxdWVzdEhlYWRlciApO1xyXG5cdFx0bG9hZGVyLnNldFdpdGhDcmVkZW50aWFscyggc2NvcGUud2l0aENyZWRlbnRpYWxzICk7XHJcblxyXG5cdFx0bGV0IGxvYWRlZCA9IDA7XHJcblxyXG5cdFx0ZnVuY3Rpb24gbG9hZFRleHR1cmUoIGkgKSB7XHJcblxyXG5cdFx0XHRsb2FkZXIubG9hZCggdXJsWyBpIF0sIGZ1bmN0aW9uICggYnVmZmVyICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB0ZXhEYXRhcyA9IHNjb3BlLnBhcnNlKCBidWZmZXIsIHRydWUgKTtcclxuXHJcblx0XHRcdFx0aW1hZ2VzWyBpIF0gPSB7XHJcblx0XHRcdFx0XHR3aWR0aDogdGV4RGF0YXMud2lkdGgsXHJcblx0XHRcdFx0XHRoZWlnaHQ6IHRleERhdGFzLmhlaWdodCxcclxuXHRcdFx0XHRcdGZvcm1hdDogdGV4RGF0YXMuZm9ybWF0LFxyXG5cdFx0XHRcdFx0bWlwbWFwczogdGV4RGF0YXMubWlwbWFwc1xyXG5cdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdGxvYWRlZCArPSAxO1xyXG5cclxuXHRcdFx0XHRpZiAoIGxvYWRlZCA9PT0gNiApIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIHRleERhdGFzLm1pcG1hcENvdW50ID09PSAxICkgdGV4dHVyZS5taW5GaWx0ZXIgPSBMaW5lYXJGaWx0ZXI7XHJcblxyXG5cdFx0XHRcdFx0dGV4dHVyZS5pbWFnZSA9IGltYWdlcztcclxuXHRcdFx0XHRcdHRleHR1cmUuZm9ybWF0ID0gdGV4RGF0YXMuZm9ybWF0O1xyXG5cdFx0XHRcdFx0dGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIHRleHR1cmUgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHVybCApICkge1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IHVybC5sZW5ndGg7IGkgPCBpbDsgKysgaSApIHtcclxuXHJcblx0XHRcdFx0bG9hZFRleHR1cmUoIGkgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Ly8gY29tcHJlc3NlZCBjdWJlbWFwIHRleHR1cmUgc3RvcmVkIGluIGEgc2luZ2xlIEREUyBmaWxlXHJcblxyXG5cdFx0XHRsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoIGJ1ZmZlciApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgdGV4RGF0YXMgPSBzY29wZS5wYXJzZSggYnVmZmVyLCB0cnVlICk7XHJcblxyXG5cdFx0XHRcdGlmICggdGV4RGF0YXMuaXNDdWJlbWFwICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGZhY2VzID0gdGV4RGF0YXMubWlwbWFwcy5sZW5ndGggLyB0ZXhEYXRhcy5taXBtYXBDb3VudDtcclxuXHJcblx0XHRcdFx0XHRmb3IgKCBsZXQgZiA9IDA7IGYgPCBmYWNlczsgZiArKyApIHtcclxuXHJcblx0XHRcdFx0XHRcdGltYWdlc1sgZiBdID0geyBtaXBtYXBzOiBbXSB9O1xyXG5cclxuXHRcdFx0XHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdGV4RGF0YXMubWlwbWFwQ291bnQ7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGltYWdlc1sgZiBdLm1pcG1hcHMucHVzaCggdGV4RGF0YXMubWlwbWFwc1sgZiAqIHRleERhdGFzLm1pcG1hcENvdW50ICsgaSBdICk7XHJcblx0XHRcdFx0XHRcdFx0aW1hZ2VzWyBmIF0uZm9ybWF0ID0gdGV4RGF0YXMuZm9ybWF0O1xyXG5cdFx0XHRcdFx0XHRcdGltYWdlc1sgZiBdLndpZHRoID0gdGV4RGF0YXMud2lkdGg7XHJcblx0XHRcdFx0XHRcdFx0aW1hZ2VzWyBmIF0uaGVpZ2h0ID0gdGV4RGF0YXMuaGVpZ2h0O1xyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR0ZXh0dXJlLmltYWdlID0gaW1hZ2VzO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdHRleHR1cmUuaW1hZ2Uud2lkdGggPSB0ZXhEYXRhcy53aWR0aDtcclxuXHRcdFx0XHRcdHRleHR1cmUuaW1hZ2UuaGVpZ2h0ID0gdGV4RGF0YXMuaGVpZ2h0O1xyXG5cdFx0XHRcdFx0dGV4dHVyZS5taXBtYXBzID0gdGV4RGF0YXMubWlwbWFwcztcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoIHRleERhdGFzLm1pcG1hcENvdW50ID09PSAxICkge1xyXG5cclxuXHRcdFx0XHRcdHRleHR1cmUubWluRmlsdGVyID0gTGluZWFyRmlsdGVyO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHRleHR1cmUuZm9ybWF0ID0gdGV4RGF0YXMuZm9ybWF0O1xyXG5cdFx0XHRcdHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggdGV4dHVyZSApO1xyXG5cclxuXHRcdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGV4dHVyZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgdGhlIHJlc3VsdCBvYmplY3QgdHlwZSBvZiB0aGUgYHBhcnNlKClgIG1ldGhvZC5cclxuICpcclxuICogQHR5cGVkZWYge09iamVjdH0gQ29tcHJlc3NlZFRleHR1cmVMb2FkZXJ+VGV4RGF0YVxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIGJhc2UgbWlwLlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gaGVpZ2h0IC0gVGhlIHdpZHRoIG9mIHRoZSBiYXNlIG1pcC5cclxuICogQHByb3BlcnR5IHtib29sZWFufSBpc0N1YmVtYXAgLSBXaGV0aGVyIHRoZSBkYXRhIHJlcHJlc2VudCBhIGN1YmVtYXAgb3Igbm90LlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gbWlwbWFwQ291bnQgLSBUaGUgbWlwbWFwIGNvdW50LlxyXG4gKiBAcHJvcGVydHkge0FycmF5PHtkYXRhOlR5cGVkQXJyYXksd2lkdGg6bnVtYmVyLGhlaWdodDpudW1iZXJ9Pn0gbWlwbWFwcyAtIEFuIGFycmF5IGhvbGRpbmcgdGhlIG1pcG1hcHMuXHJcbiAqIEVhY2ggZW50cnkgaG9sZHMgdGhlIGRhdGEgYW5kIHRoZSBkaW1lbnNpb25zIGZvciBlYWNoIGxldmVsLlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gZm9ybWF0IC0gVGhlIHRleHR1cmUgZm9ybWF0LlxyXG4gKiovXHJcblxyXG5leHBvcnQgeyBDb21wcmVzc2VkVGV4dHVyZUxvYWRlciB9O1xyXG4iLCJpbXBvcnQgeyBDYWNoZSB9IGZyb20gJy4vQ2FjaGUuanMnO1xyXG5pbXBvcnQgeyBMb2FkZXIgfSBmcm9tICcuL0xvYWRlci5qcyc7XHJcbmltcG9ydCB7IGNyZWF0ZUVsZW1lbnROUyB9IGZyb20gJy4uL3V0aWxzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIGxvYWRlciBmb3IgbG9hZGluZyBpbWFnZXMuIFRoZSBjbGFzcyBsb2FkcyBpbWFnZXMgd2l0aCB0aGUgSFRNTCBgSW1hZ2VgIEFQSS5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgbG9hZGVyID0gbmV3IFRIUkVFLkltYWdlTG9hZGVyKCk7XHJcbiAqIGNvbnN0IGltYWdlID0gYXdhaXQgbG9hZGVyLmxvYWRBc3luYyggJ2ltYWdlLnBuZycgKTtcclxuICogYGBgXHJcbiAqIFBsZWFzZSBub3RlIHRoYXQgYEltYWdlTG9hZGVyYCBoYXMgZHJvcHBlZCBzdXBwb3J0IGZvciBwcm9ncmVzc1xyXG4gKiBldmVudHMgaW4gYHI4NGAuIEZvciBhbiBgSW1hZ2VMb2FkZXJgIHRoYXQgc3VwcG9ydHMgcHJvZ3Jlc3MgZXZlbnRzLCBzZWVcclxuICogW3RoaXMgdGhyZWFkXXtAbGluayBodHRwczovL2dpdGh1Yi5jb20vbXJkb29iL3RocmVlLmpzL2lzc3Vlcy8xMDQzOSNpc3N1ZWNvbW1lbnQtMjc1Nzg1NjM5fS5cclxuICpcclxuICogQGF1Z21lbnRzIExvYWRlclxyXG4gKi9cclxuY2xhc3MgSW1hZ2VMb2FkZXIgZXh0ZW5kcyBMb2FkZXIge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGltYWdlIGxvYWRlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TG9hZGluZ01hbmFnZXJ9IFttYW5hZ2VyXSAtIFRoZSBsb2FkaW5nIG1hbmFnZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG1hbmFnZXIgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG1hbmFnZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTdGFydHMgbG9hZGluZyBmcm9tIHRoZSBnaXZlbiBVUkwgYW5kIHBhc3NlcyB0aGUgbG9hZGVkIGltYWdlXHJcblx0ICogdG8gdGhlIGBvbkxvYWQoKWAgY2FsbGJhY2suIFRoZSBtZXRob2QgYWxzbyByZXR1cm5zIGEgbmV3IGBJbWFnZWAgb2JqZWN0IHdoaWNoIGNhblxyXG5cdCAqIGRpcmVjdGx5IGJlIHVzZWQgZm9yIHRleHR1cmUgY3JlYXRpb24uIElmIHlvdSBkbyBpdCB0aGlzIHdheSwgdGhlIHRleHR1cmVcclxuXHQgKiBtYXkgcG9wIHVwIGluIHlvdXIgc2NlbmUgb25jZSB0aGUgcmVzcGVjdGl2ZSBsb2FkaW5nIHByb2Nlc3MgaXMgZmluaXNoZWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gVGhlIHBhdGgvVVJMIG9mIHRoZSBmaWxlIHRvIGJlIGxvYWRlZC4gVGhpcyBjYW4gYWxzbyBiZSBhIGRhdGEgVVJJLlxyXG5cdCAqIEBwYXJhbSB7ZnVuY3Rpb24oSW1hZ2UpfSBvbkxvYWQgLSBFeGVjdXRlZCB3aGVuIHRoZSBsb2FkaW5nIHByb2Nlc3MgaGFzIGJlZW4gZmluaXNoZWQuXHJcblx0ICogQHBhcmFtIHtvblByb2dyZXNzQ2FsbGJhY2t9IG9uUHJvZ3Jlc3MgLSBVbnN1cHBvcnRlZCBpbiB0aGlzIGxvYWRlci5cclxuXHQgKiBAcGFyYW0ge29uRXJyb3JDYWxsYmFja30gb25FcnJvciAtIEV4ZWN1dGVkIHdoZW4gZXJyb3JzIG9jY3VyLlxyXG5cdCAqIEByZXR1cm4ge0ltYWdlfSBUaGUgaW1hZ2UuXHJcblx0ICovXHJcblx0bG9hZCggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLnBhdGggIT09IHVuZGVmaW5lZCApIHVybCA9IHRoaXMucGF0aCArIHVybDtcclxuXHJcblx0XHR1cmwgPSB0aGlzLm1hbmFnZXIucmVzb2x2ZVVSTCggdXJsICk7XHJcblxyXG5cdFx0Y29uc3Qgc2NvcGUgPSB0aGlzO1xyXG5cclxuXHRcdGNvbnN0IGNhY2hlZCA9IENhY2hlLmdldCggdXJsICk7XHJcblxyXG5cdFx0aWYgKCBjYWNoZWQgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbVN0YXJ0KCB1cmwgKTtcclxuXHJcblx0XHRcdHNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHtcclxuXHJcblx0XHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIGNhY2hlZCApO1xyXG5cclxuXHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xyXG5cclxuXHRcdFx0fSwgMCApO1xyXG5cclxuXHRcdFx0cmV0dXJuIGNhY2hlZDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgaW1hZ2UgPSBjcmVhdGVFbGVtZW50TlMoICdpbWcnICk7XHJcblxyXG5cdFx0ZnVuY3Rpb24gb25JbWFnZUxvYWQoKSB7XHJcblxyXG5cdFx0XHRyZW1vdmVFdmVudExpc3RlbmVycygpO1xyXG5cclxuXHRcdFx0Q2FjaGUuYWRkKCB1cmwsIHRoaXMgKTtcclxuXHJcblx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCB0aGlzICk7XHJcblxyXG5cdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiBvbkltYWdlRXJyb3IoIGV2ZW50ICkge1xyXG5cclxuXHRcdFx0cmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcclxuXHJcblx0XHRcdGlmICggb25FcnJvciApIG9uRXJyb3IoIGV2ZW50ICk7XHJcblxyXG5cdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FcnJvciggdXJsICk7XHJcblx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXJzKCkge1xyXG5cclxuXHRcdFx0aW1hZ2UucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2xvYWQnLCBvbkltYWdlTG9hZCwgZmFsc2UgKTtcclxuXHRcdFx0aW1hZ2UucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2Vycm9yJywgb25JbWFnZUVycm9yLCBmYWxzZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpbWFnZS5hZGRFdmVudExpc3RlbmVyKCAnbG9hZCcsIG9uSW1hZ2VMb2FkLCBmYWxzZSApO1xyXG5cdFx0aW1hZ2UuYWRkRXZlbnRMaXN0ZW5lciggJ2Vycm9yJywgb25JbWFnZUVycm9yLCBmYWxzZSApO1xyXG5cclxuXHRcdGlmICggdXJsLnNsaWNlKCAwLCA1ICkgIT09ICdkYXRhOicgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMuY3Jvc3NPcmlnaW4gIT09IHVuZGVmaW5lZCApIGltYWdlLmNyb3NzT3JpZ2luID0gdGhpcy5jcm9zc09yaWdpbjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0c2NvcGUubWFuYWdlci5pdGVtU3RhcnQoIHVybCApO1xyXG5cclxuXHRcdGltYWdlLnNyYyA9IHVybDtcclxuXHJcblx0XHRyZXR1cm4gaW1hZ2U7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBJbWFnZUxvYWRlciB9O1xyXG4iLCJpbXBvcnQgeyBJbWFnZUxvYWRlciB9IGZyb20gJy4vSW1hZ2VMb2FkZXIuanMnO1xyXG5pbXBvcnQgeyBDdWJlVGV4dHVyZSB9IGZyb20gJy4uL3RleHR1cmVzL0N1YmVUZXh0dXJlLmpzJztcclxuaW1wb3J0IHsgTG9hZGVyIH0gZnJvbSAnLi9Mb2FkZXIuanMnO1xyXG5pbXBvcnQgeyBTUkdCQ29sb3JTcGFjZSB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XHJcblxyXG4vKipcclxuICogQ2xhc3MgZm9yIGxvYWRpbmcgY3ViZSB0ZXh0dXJlcy4gSW1hZ2VzIGFyZSBpbnRlcm5hbGx5IGxvYWRlZCB2aWEge0BsaW5rIEltYWdlTG9hZGVyfS5cclxuICpcclxuICogVGhlIGxvYWRlciByZXR1cm5zIGFuIGluc3RhbmNlIG9mIHtAbGluayBDdWJlVGV4dHVyZX0gYW5kIGV4cGVjdHMgdGhlIGN1YmUgbWFwIHRvXHJcbiAqIGJlIGRlZmluZWQgYXMgc2l4IHNlcGFyYXRlIGltYWdlcyByZXByZXNlbnRpbmcgdGhlIHNpZGVzIG9mIGEgY3ViZS4gT3RoZXIgY3ViZSBtYXAgZGVmaW5pdGlvbnNcclxuICogbGlrZSB2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbCBjcm9zcywgY29sdW1uIGFuZCByb3cgbGF5b3V0cyBhcmUgbm90IHN1cHBvcnRlZC5cclxuICpcclxuICogTm90ZSB0aGF0LCBieSBjb252ZW50aW9uLCBjdWJlIG1hcHMgYXJlIHNwZWNpZmllZCBpbiBhIGNvb3JkaW5hdGUgc3lzdGVtXHJcbiAqIGluIHdoaWNoIHBvc2l0aXZlLXggaXMgdG8gdGhlIHJpZ2h0IHdoZW4gbG9va2luZyB1cCB0aGUgcG9zaXRpdmUteiBheGlzIC0tXHJcbiAqIGluIG90aGVyIHdvcmRzLCB1c2luZyBhIGxlZnQtaGFuZGVkIGNvb3JkaW5hdGUgc3lzdGVtLiBTaW5jZSB0aHJlZS5qcyB1c2VzXHJcbiAqIGEgcmlnaHQtaGFuZGVkIGNvb3JkaW5hdGUgc3lzdGVtLCBlbnZpcm9ubWVudCBtYXBzIHVzZWQgaW4gdGhyZWUuanMgd2lsbFxyXG4gKiBoYXZlIHBvcy14IGFuZCBuZWcteCBzd2FwcGVkLlxyXG4gKlxyXG4gKiBUaGUgbG9hZGVkIGN1YmUgdGV4dHVyZSBpcyBpbiBzUkdCIGNvbG9yIHNwYWNlLiBNZWFuaW5nIHtAbGluayBUZXh0dXJlI2NvbG9yU3BhY2V9XHJcbiAqIGlzIHNldCB0byBgU1JHQkNvbG9yU3BhY2VgIGJ5IGRlZmF1bHQuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGxvYWRlciA9IG5ldyBUSFJFRS5DdWJlVGV4dHVyZUxvYWRlcigpLnNldFBhdGgoICd0ZXh0dXJlcy9jdWJlTWFwcy8nICk7XHJcbiAqIGNvbnN0IGN1YmVUZXh0dXJlID0gYXdhaXQgbG9hZGVyLmxvYWRBc3luYyggW1xyXG4gKiBcdCdweC5wbmcnLCAnbngucG5nJywgJ3B5LnBuZycsICdueS5wbmcnLCAncHoucG5nJywgJ256LnBuZydcclxuICogXSApO1xyXG4gKiBzY2VuZS5iYWNrZ3JvdW5kID0gY3ViZVRleHR1cmU7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTG9hZGVyXHJcbiAqL1xyXG5jbGFzcyBDdWJlVGV4dHVyZUxvYWRlciBleHRlbmRzIExvYWRlciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgY3ViZSB0ZXh0dXJlIGxvYWRlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TG9hZGluZ01hbmFnZXJ9IFttYW5hZ2VyXSAtIFRoZSBsb2FkaW5nIG1hbmFnZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG1hbmFnZXIgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG1hbmFnZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTdGFydHMgbG9hZGluZyBmcm9tIHRoZSBnaXZlbiBVUkwgYW5kIHBhc3MgdGhlIGZ1bGx5IGxvYWRlZCBjdWJlIHRleHR1cmVcclxuXHQgKiB0byB0aGUgYG9uTG9hZCgpYCBjYWxsYmFjay4gVGhlIG1ldGhvZCBhbHNvIHJldHVybnMgYSBuZXcgY3ViZSB0ZXh0dXJlIG9iamVjdCB3aGljaCBjYW5cclxuXHQgKiBkaXJlY3RseSBiZSB1c2VkIGZvciBtYXRlcmlhbCBjcmVhdGlvbi4gSWYgeW91IGRvIGl0IHRoaXMgd2F5LCB0aGUgY3ViZSB0ZXh0dXJlXHJcblx0ICogbWF5IHBvcCB1cCBpbiB5b3VyIHNjZW5lIG9uY2UgdGhlIHJlc3BlY3RpdmUgbG9hZGluZyBwcm9jZXNzIGlzIGZpbmlzaGVkLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSB1cmxzIC0gQXJyYXkgb2YgNiBVUkxzIHRvIGltYWdlcywgb25lIGZvciBlYWNoIHNpZGUgb2YgdGhlXHJcblx0ICogY3ViZSB0ZXh0dXJlLiBUaGUgdXJscyBzaG91bGQgYmUgc3BlY2lmaWVkIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6IHBvcy14LFxyXG5cdCAqIG5lZy14LCBwb3MteSwgbmVnLXksIHBvcy16LCBuZWctei4gQW4gYXJyYXkgb2YgZGF0YSBVUklzIGFyZSBhbGxvd2VkIGFzIHdlbGwuXHJcblx0ICogQHBhcmFtIHtmdW5jdGlvbihDdWJlVGV4dHVyZSl9IG9uTG9hZCAtIEV4ZWN1dGVkIHdoZW4gdGhlIGxvYWRpbmcgcHJvY2VzcyBoYXMgYmVlbiBmaW5pc2hlZC5cclxuXHQgKiBAcGFyYW0ge29uUHJvZ3Jlc3NDYWxsYmFja30gb25Qcm9ncmVzcyAtIFVuc3VwcG9ydGVkIGluIHRoaXMgbG9hZGVyLlxyXG5cdCAqIEBwYXJhbSB7b25FcnJvckNhbGxiYWNrfSBvbkVycm9yIC0gRXhlY3V0ZWQgd2hlbiBlcnJvcnMgb2NjdXIuXHJcblx0ICogQHJldHVybiB7Q3ViZVRleHR1cmV9IFRoZSBjdWJlIHRleHR1cmUuXHJcblx0ICovXHJcblx0bG9hZCggdXJscywgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xyXG5cclxuXHRcdGNvbnN0IHRleHR1cmUgPSBuZXcgQ3ViZVRleHR1cmUoKTtcclxuXHRcdHRleHR1cmUuY29sb3JTcGFjZSA9IFNSR0JDb2xvclNwYWNlO1xyXG5cclxuXHRcdGNvbnN0IGxvYWRlciA9IG5ldyBJbWFnZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XHJcblx0XHRsb2FkZXIuc2V0Q3Jvc3NPcmlnaW4oIHRoaXMuY3Jvc3NPcmlnaW4gKTtcclxuXHRcdGxvYWRlci5zZXRQYXRoKCB0aGlzLnBhdGggKTtcclxuXHJcblx0XHRsZXQgbG9hZGVkID0gMDtcclxuXHJcblx0XHRmdW5jdGlvbiBsb2FkVGV4dHVyZSggaSApIHtcclxuXHJcblx0XHRcdGxvYWRlci5sb2FkKCB1cmxzWyBpIF0sIGZ1bmN0aW9uICggaW1hZ2UgKSB7XHJcblxyXG5cdFx0XHRcdHRleHR1cmUuaW1hZ2VzWyBpIF0gPSBpbWFnZTtcclxuXHJcblx0XHRcdFx0bG9hZGVkICsrO1xyXG5cclxuXHRcdFx0XHRpZiAoIGxvYWRlZCA9PT0gNiApIHtcclxuXHJcblx0XHRcdFx0XHR0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggdGV4dHVyZSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9LCB1bmRlZmluZWQsIG9uRXJyb3IgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdXJscy5sZW5ndGg7ICsrIGkgKSB7XHJcblxyXG5cdFx0XHRsb2FkVGV4dHVyZSggaSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGV4dHVyZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCB7IEN1YmVUZXh0dXJlTG9hZGVyIH07XHJcbiIsImltcG9ydCB7IExpbmVhckZpbHRlciwgTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyLCBDbGFtcFRvRWRnZVdyYXBwaW5nIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgRmlsZUxvYWRlciB9IGZyb20gJy4vRmlsZUxvYWRlci5qcyc7XHJcbmltcG9ydCB7IERhdGFUZXh0dXJlIH0gZnJvbSAnLi4vdGV4dHVyZXMvRGF0YVRleHR1cmUuanMnO1xyXG5pbXBvcnQgeyBMb2FkZXIgfSBmcm9tICcuL0xvYWRlci5qcyc7XHJcblxyXG4vKipcclxuICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgbG9hZGluZyBiaW5hcnkgdGV4dHVyZSBmb3JtYXRzIFJHQkUsIEVYUiBvciBUR0EuXHJcbiAqIFRleHR1cmVzIGFyZSBpbnRlcm5hbGx5IGxvYWRlZCB2aWEge0BsaW5rIEZpbGVMb2FkZXJ9LlxyXG4gKlxyXG4gKiBEZXJpdmVkIGNsYXNzZXMgaGF2ZSB0byBpbXBsZW1lbnQgdGhlIGBwYXJzZSgpYCBtZXRob2Qgd2hpY2ggaG9sZHMgdGhlIHBhcnNpbmdcclxuICogZm9yIHRoZSByZXNwZWN0aXZlIGZvcm1hdC5cclxuICpcclxuICogQGFic3RyYWN0XHJcbiAqIEBhdWdtZW50cyBMb2FkZXJcclxuICovXHJcbmNsYXNzIERhdGFUZXh0dXJlTG9hZGVyIGV4dGVuZHMgTG9hZGVyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBkYXRhIHRleHR1cmUgbG9hZGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtMb2FkaW5nTWFuYWdlcn0gW21hbmFnZXJdIC0gVGhlIGxvYWRpbmcgbWFuYWdlci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbWFuYWdlciApIHtcclxuXHJcblx0XHRzdXBlciggbWFuYWdlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFN0YXJ0cyBsb2FkaW5nIGZyb20gdGhlIGdpdmVuIFVSTCBhbmQgcGFzc2VzIHRoZSBsb2FkZWQgZGF0YSB0ZXh0dXJlXHJcblx0ICogdG8gdGhlIGBvbkxvYWQoKWAgY2FsbGJhY2suIFRoZSBtZXRob2QgYWxzbyByZXR1cm5zIGEgbmV3IHRleHR1cmUgb2JqZWN0IHdoaWNoIGNhblxyXG5cdCAqIGRpcmVjdGx5IGJlIHVzZWQgZm9yIG1hdGVyaWFsIGNyZWF0aW9uLiBJZiB5b3UgZG8gaXQgdGhpcyB3YXksIHRoZSB0ZXh0dXJlXHJcblx0ICogbWF5IHBvcCB1cCBpbiB5b3VyIHNjZW5lIG9uY2UgdGhlIHJlc3BlY3RpdmUgbG9hZGluZyBwcm9jZXNzIGlzIGZpbmlzaGVkLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIFRoZSBwYXRoL1VSTCBvZiB0aGUgZmlsZSB0byBiZSBsb2FkZWQuIFRoaXMgY2FuIGFsc28gYmUgYSBkYXRhIFVSSS5cclxuXHQgKiBAcGFyYW0ge2Z1bmN0aW9uKERhdGFUZXh0dXJlKX0gb25Mb2FkIC0gRXhlY3V0ZWQgd2hlbiB0aGUgbG9hZGluZyBwcm9jZXNzIGhhcyBiZWVuIGZpbmlzaGVkLlxyXG5cdCAqIEBwYXJhbSB7b25Qcm9ncmVzc0NhbGxiYWNrfSBvblByb2dyZXNzIC0gRXhlY3V0ZWQgd2hpbGUgdGhlIGxvYWRpbmcgaXMgaW4gcHJvZ3Jlc3MuXHJcblx0ICogQHBhcmFtIHtvbkVycm9yQ2FsbGJhY2t9IG9uRXJyb3IgLSBFeGVjdXRlZCB3aGVuIGVycm9ycyBvY2N1ci5cclxuXHQgKiBAcmV0dXJuIHtEYXRhVGV4dHVyZX0gVGhlIGRhdGEgdGV4dHVyZS5cclxuXHQgKi9cclxuXHRsb2FkKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcclxuXHJcblx0XHRjb25zdCBzY29wZSA9IHRoaXM7XHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZSA9IG5ldyBEYXRhVGV4dHVyZSgpO1xyXG5cclxuXHRcdGNvbnN0IGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCB0aGlzLm1hbmFnZXIgKTtcclxuXHRcdGxvYWRlci5zZXRSZXNwb25zZVR5cGUoICdhcnJheWJ1ZmZlcicgKTtcclxuXHRcdGxvYWRlci5zZXRSZXF1ZXN0SGVhZGVyKCB0aGlzLnJlcXVlc3RIZWFkZXIgKTtcclxuXHRcdGxvYWRlci5zZXRQYXRoKCB0aGlzLnBhdGggKTtcclxuXHRcdGxvYWRlci5zZXRXaXRoQ3JlZGVudGlhbHMoIHNjb3BlLndpdGhDcmVkZW50aWFscyApO1xyXG5cdFx0bG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCBidWZmZXIgKSB7XHJcblxyXG5cdFx0XHRsZXQgdGV4RGF0YTtcclxuXHJcblx0XHRcdHRyeSB7XHJcblxyXG5cdFx0XHRcdHRleERhdGEgPSBzY29wZS5wYXJzZSggYnVmZmVyICk7XHJcblxyXG5cdFx0XHR9IGNhdGNoICggZXJyb3IgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggb25FcnJvciAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdG9uRXJyb3IoIGVycm9yICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvciggZXJyb3IgKTtcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCB0ZXhEYXRhLmltYWdlICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdHRleHR1cmUuaW1hZ2UgPSB0ZXhEYXRhLmltYWdlO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggdGV4RGF0YS5kYXRhICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdHRleHR1cmUuaW1hZ2Uud2lkdGggPSB0ZXhEYXRhLndpZHRoO1xyXG5cdFx0XHRcdHRleHR1cmUuaW1hZ2UuaGVpZ2h0ID0gdGV4RGF0YS5oZWlnaHQ7XHJcblx0XHRcdFx0dGV4dHVyZS5pbWFnZS5kYXRhID0gdGV4RGF0YS5kYXRhO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGV4dHVyZS53cmFwUyA9IHRleERhdGEud3JhcFMgIT09IHVuZGVmaW5lZCA/IHRleERhdGEud3JhcFMgOiBDbGFtcFRvRWRnZVdyYXBwaW5nO1xyXG5cdFx0XHR0ZXh0dXJlLndyYXBUID0gdGV4RGF0YS53cmFwVCAhPT0gdW5kZWZpbmVkID8gdGV4RGF0YS53cmFwVCA6IENsYW1wVG9FZGdlV3JhcHBpbmc7XHJcblxyXG5cdFx0XHR0ZXh0dXJlLm1hZ0ZpbHRlciA9IHRleERhdGEubWFnRmlsdGVyICE9PSB1bmRlZmluZWQgPyB0ZXhEYXRhLm1hZ0ZpbHRlciA6IExpbmVhckZpbHRlcjtcclxuXHRcdFx0dGV4dHVyZS5taW5GaWx0ZXIgPSB0ZXhEYXRhLm1pbkZpbHRlciAhPT0gdW5kZWZpbmVkID8gdGV4RGF0YS5taW5GaWx0ZXIgOiBMaW5lYXJGaWx0ZXI7XHJcblxyXG5cdFx0XHR0ZXh0dXJlLmFuaXNvdHJvcHkgPSB0ZXhEYXRhLmFuaXNvdHJvcHkgIT09IHVuZGVmaW5lZCA/IHRleERhdGEuYW5pc290cm9weSA6IDE7XHJcblxyXG5cdFx0XHRpZiAoIHRleERhdGEuY29sb3JTcGFjZSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHR0ZXh0dXJlLmNvbG9yU3BhY2UgPSB0ZXhEYXRhLmNvbG9yU3BhY2U7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHRleERhdGEuZmxpcFkgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0dGV4dHVyZS5mbGlwWSA9IHRleERhdGEuZmxpcFk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHRleERhdGEuZm9ybWF0ICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdHRleHR1cmUuZm9ybWF0ID0gdGV4RGF0YS5mb3JtYXQ7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHRleERhdGEudHlwZSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHR0ZXh0dXJlLnR5cGUgPSB0ZXhEYXRhLnR5cGU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHRleERhdGEubWlwbWFwcyAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHR0ZXh0dXJlLm1pcG1hcHMgPSB0ZXhEYXRhLm1pcG1hcHM7XHJcblx0XHRcdFx0dGV4dHVyZS5taW5GaWx0ZXIgPSBMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXI7IC8vIHByZXN1bWFibHkuLi5cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggdGV4RGF0YS5taXBtYXBDb3VudCA9PT0gMSApIHtcclxuXHJcblx0XHRcdFx0dGV4dHVyZS5taW5GaWx0ZXIgPSBMaW5lYXJGaWx0ZXI7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHRleERhdGEuZ2VuZXJhdGVNaXBtYXBzICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdHRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gdGV4RGF0YS5nZW5lcmF0ZU1pcG1hcHM7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCB0ZXh0dXJlLCB0ZXhEYXRhICk7XHJcblxyXG5cdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xyXG5cclxuXHJcblx0XHRyZXR1cm4gdGV4dHVyZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgdGhlIHJlc3VsdCBvYmplY3QgdHlwZSBvZiB0aGUgYHBhcnNlKClgIG1ldGhvZC5cclxuICpcclxuICogQHR5cGVkZWYge09iamVjdH0gRGF0YVRleHR1cmVMb2FkZXJ+VGV4RGF0YVxyXG4gKiBAcHJvcGVydHkge09iamVjdH0gW2ltYWdlXSAtIEFuIG9iamVjdCBob2xkaW5nIHdpZHRoLCBoZWlnaHQgYW5kIHRoZSB0ZXh0dXJlIGRhdGEuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbd2lkdGhdIC0gVGhlIHdpZHRoIG9mIHRoZSBiYXNlIG1pcC5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtoZWlnaHRdIC0gVGhlIHdpZHRoIG9mIHRoZSBiYXNlIG1pcC5cclxuICogQHByb3BlcnR5IHtUeXBlZEFycmF5fSBbZGF0YV0gLSBUaGUgdGV4dHVyZSBkYXRhLlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2Zvcm1hdF0gLSBUaGUgdGV4dHVyZSBmb3JtYXQuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdHlwZV0gLSBUaGUgdGV4dHVyZSB0eXBlLlxyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmbGlwWV0gLSBJZiBzZXQgdG8gYHRydWVgLCB0aGUgdGV4dHVyZSBpcyBmbGlwcGVkIGFsb25nIHRoZSB2ZXJ0aWNhbCBheGlzIHdoZW4gdXBsb2FkZWQgdG8gdGhlIEdQVS5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt3cmFwUz1DbGFtcFRvRWRnZVdyYXBwaW5nXSAtIFRoZSB3cmFwUyB2YWx1ZS5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt3cmFwVD1DbGFtcFRvRWRnZVdyYXBwaW5nXSAtIFRoZSB3cmFwVCB2YWx1ZS5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFthbmlzb3Ryb3B5PTFdIC0gVGhlIGFuaXNvdHJvcHkgdmFsdWUuXHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2dlbmVyYXRlTWlwbWFwc10gLSBXaGV0aGVyIHRvIGdlbmVyYXRlIG1pcG1hcHMgb3Igbm90LlxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2NvbG9yU3BhY2VdIC0gVGhlIGNvbG9yIHNwYWNlLlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW21hZ0ZpbHRlcl0gLSBUaGUgbWFnIGZpbHRlci5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFttaW5GaWx0ZXJdIC0gVGhlIG1pbiBmaWx0ZXIuXHJcbiAqIEBwcm9wZXJ0eSB7QXJyYXk8T2JqZWN0Pn0gW21pcG1hcHNdIC0gVGhlIG1pcG1hcHMuXHJcbiAqKi9cclxuXHJcbmV4cG9ydCB7IERhdGFUZXh0dXJlTG9hZGVyIH07XHJcbiIsImltcG9ydCB7IEltYWdlTG9hZGVyIH0gZnJvbSAnLi9JbWFnZUxvYWRlci5qcyc7XHJcbmltcG9ydCB7IFRleHR1cmUgfSBmcm9tICcuLi90ZXh0dXJlcy9UZXh0dXJlLmpzJztcclxuaW1wb3J0IHsgTG9hZGVyIH0gZnJvbSAnLi9Mb2FkZXIuanMnO1xyXG5cclxuLyoqXHJcbiAqIENsYXNzIGZvciBsb2FkaW5nIHRleHR1cmVzLiBJbWFnZXMgYXJlIGludGVybmFsbHlcclxuICogbG9hZGVkIHZpYSB7QGxpbmsgSW1hZ2VMb2FkZXJ9LlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBsb2FkZXIgPSBuZXcgVEhSRUUuVGV4dHVyZUxvYWRlcigpO1xyXG4gKiBjb25zdCB0ZXh0dXJlID0gYXdhaXQgbG9hZGVyLmxvYWRBc3luYyggJ3RleHR1cmVzL2xhbmRfb2NlYW5faWNlX2Nsb3VkXzIwNDguanBnJyApO1xyXG4gKlxyXG4gKiBjb25zdCBtYXRlcmlhbCA9IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCggeyBtYXA6dGV4dHVyZSB9ICk7XHJcbiAqIGBgYFxyXG4gKiBQbGVhc2Ugbm90ZSB0aGF0IGBUZXh0dXJlTG9hZGVyYCBoYXMgZHJvcHBlZCBzdXBwb3J0IGZvciBwcm9ncmVzc1xyXG4gKiBldmVudHMgaW4gYHI4NGAuIEZvciBhIGBUZXh0dXJlTG9hZGVyYCB0aGF0IHN1cHBvcnRzIHByb2dyZXNzIGV2ZW50cywgc2VlXHJcbiAqIFt0aGlzIHRocmVhZF17QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL21yZG9vYi90aHJlZS5qcy9pc3N1ZXMvMTA0MzkjaXNzdWVjb21tZW50LTI5MzI2MDE0NX0uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBMb2FkZXJcclxuICovXHJcbmNsYXNzIFRleHR1cmVMb2FkZXIgZXh0ZW5kcyBMb2FkZXIge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHRleHR1cmUgbG9hZGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtMb2FkaW5nTWFuYWdlcn0gW21hbmFnZXJdIC0gVGhlIGxvYWRpbmcgbWFuYWdlci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbWFuYWdlciApIHtcclxuXHJcblx0XHRzdXBlciggbWFuYWdlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFN0YXJ0cyBsb2FkaW5nIGZyb20gdGhlIGdpdmVuIFVSTCBhbmQgcGFzcyB0aGUgZnVsbHkgbG9hZGVkIHRleHR1cmVcclxuXHQgKiB0byB0aGUgYG9uTG9hZCgpYCBjYWxsYmFjay4gVGhlIG1ldGhvZCBhbHNvIHJldHVybnMgYSBuZXcgdGV4dHVyZSBvYmplY3Qgd2hpY2ggY2FuXHJcblx0ICogZGlyZWN0bHkgYmUgdXNlZCBmb3IgbWF0ZXJpYWwgY3JlYXRpb24uIElmIHlvdSBkbyBpdCB0aGlzIHdheSwgdGhlIHRleHR1cmVcclxuXHQgKiBtYXkgcG9wIHVwIGluIHlvdXIgc2NlbmUgb25jZSB0aGUgcmVzcGVjdGl2ZSBsb2FkaW5nIHByb2Nlc3MgaXMgZmluaXNoZWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gVGhlIHBhdGgvVVJMIG9mIHRoZSBmaWxlIHRvIGJlIGxvYWRlZC4gVGhpcyBjYW4gYWxzbyBiZSBhIGRhdGEgVVJJLlxyXG5cdCAqIEBwYXJhbSB7ZnVuY3Rpb24oVGV4dHVyZSl9IG9uTG9hZCAtIEV4ZWN1dGVkIHdoZW4gdGhlIGxvYWRpbmcgcHJvY2VzcyBoYXMgYmVlbiBmaW5pc2hlZC5cclxuXHQgKiBAcGFyYW0ge29uUHJvZ3Jlc3NDYWxsYmFja30gb25Qcm9ncmVzcyAtIFVuc3VwcG9ydGVkIGluIHRoaXMgbG9hZGVyLlxyXG5cdCAqIEBwYXJhbSB7b25FcnJvckNhbGxiYWNrfSBvbkVycm9yIC0gRXhlY3V0ZWQgd2hlbiBlcnJvcnMgb2NjdXIuXHJcblx0ICogQHJldHVybiB7VGV4dHVyZX0gVGhlIHRleHR1cmUuXHJcblx0ICovXHJcblx0bG9hZCggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZSA9IG5ldyBUZXh0dXJlKCk7XHJcblxyXG5cdFx0Y29uc3QgbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCB0aGlzLm1hbmFnZXIgKTtcclxuXHRcdGxvYWRlci5zZXRDcm9zc09yaWdpbiggdGhpcy5jcm9zc09yaWdpbiApO1xyXG5cdFx0bG9hZGVyLnNldFBhdGgoIHRoaXMucGF0aCApO1xyXG5cclxuXHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggaW1hZ2UgKSB7XHJcblxyXG5cdFx0XHR0ZXh0dXJlLmltYWdlID0gaW1hZ2U7XHJcblx0XHRcdHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdFx0aWYgKCBvbkxvYWQgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0b25Mb2FkKCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xyXG5cclxuXHRcdHJldHVybiB0ZXh0dXJlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgVGV4dHVyZUxvYWRlciB9O1xyXG4iLCJpbXBvcnQgeyBPYmplY3QzRCB9IGZyb20gJy4uL2NvcmUvT2JqZWN0M0QuanMnO1xyXG5pbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uL21hdGgvQ29sb3IuanMnO1xyXG5cclxuLyoqXHJcbiAqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGxpZ2h0cyAtIGFsbCBvdGhlciBsaWdodCB0eXBlcyBpbmhlcml0IHRoZVxyXG4gKiBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzIGRlc2NyaWJlZCBoZXJlLlxyXG4gKlxyXG4gKiBAYWJzdHJhY3RcclxuICogQGF1Z21lbnRzIE9iamVjdDNEXHJcbiAqL1xyXG5jbGFzcyBMaWdodCBleHRlbmRzIE9iamVjdDNEIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBsaWdodC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7KG51bWJlcnxDb2xvcnxzdHJpbmcpfSBbY29sb3I9MHhmZmZmZmZdIC0gVGhlIGxpZ2h0J3MgY29sb3IuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtpbnRlbnNpdHk9MV0gLSBUaGUgbGlnaHQncyBzdHJlbmd0aC9pbnRlbnNpdHkuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGNvbG9yLCBpbnRlbnNpdHkgPSAxICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzTGlnaHQgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdMaWdodCc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbGlnaHQncyBjb2xvci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Q29sb3J9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIGNvbG9yICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbGlnaHQncyBpbnRlbnNpdHkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pbnRlbnNpdHkgPSBpbnRlbnNpdHk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRnJlZXMgdGhlIEdQVS1yZWxhdGVkIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhpcyBpbnN0YW5jZS4gQ2FsbCB0aGlzXHJcblx0ICogbWV0aG9kIHdoZW5ldmVyIHRoaXMgaW5zdGFuY2UgaXMgbm8gbG9uZ2VyIHVzZWQgaW4geW91ciBhcHAuXHJcblx0ICovXHJcblx0ZGlzcG9zZSgpIHtcclxuXHJcblx0XHQvLyBFbXB0eSBoZXJlIGluIGJhc2UgY2xhc3M7IHNvbWUgc3ViY2xhc3NlcyBvdmVycmlkZS5cclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UsIHJlY3Vyc2l2ZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UsIHJlY3Vyc2l2ZSApO1xyXG5cclxuXHRcdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XHJcblx0XHR0aGlzLmludGVuc2l0eSA9IHNvdXJjZS5pbnRlbnNpdHk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0dG9KU09OKCBtZXRhICkge1xyXG5cclxuXHRcdGNvbnN0IGRhdGEgPSBzdXBlci50b0pTT04oIG1ldGEgKTtcclxuXHJcblx0XHRkYXRhLm9iamVjdC5jb2xvciA9IHRoaXMuY29sb3IuZ2V0SGV4KCk7XHJcblx0XHRkYXRhLm9iamVjdC5pbnRlbnNpdHkgPSB0aGlzLmludGVuc2l0eTtcclxuXHJcblx0XHRpZiAoIHRoaXMuZ3JvdW5kQ29sb3IgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0Lmdyb3VuZENvbG9yID0gdGhpcy5ncm91bmRDb2xvci5nZXRIZXgoKTtcclxuXHJcblx0XHRpZiAoIHRoaXMuZGlzdGFuY2UgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LmRpc3RhbmNlID0gdGhpcy5kaXN0YW5jZTtcclxuXHRcdGlmICggdGhpcy5hbmdsZSAhPT0gdW5kZWZpbmVkICkgZGF0YS5vYmplY3QuYW5nbGUgPSB0aGlzLmFuZ2xlO1xyXG5cdFx0aWYgKCB0aGlzLmRlY2F5ICE9PSB1bmRlZmluZWQgKSBkYXRhLm9iamVjdC5kZWNheSA9IHRoaXMuZGVjYXk7XHJcblx0XHRpZiAoIHRoaXMucGVudW1icmEgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LnBlbnVtYnJhID0gdGhpcy5wZW51bWJyYTtcclxuXHJcblx0XHRpZiAoIHRoaXMuc2hhZG93ICE9PSB1bmRlZmluZWQgKSBkYXRhLm9iamVjdC5zaGFkb3cgPSB0aGlzLnNoYWRvdy50b0pTT04oKTtcclxuXHRcdGlmICggdGhpcy50YXJnZXQgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LnRhcmdldCA9IHRoaXMudGFyZ2V0LnV1aWQ7XHJcblxyXG5cdFx0cmV0dXJuIGRhdGE7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IExpZ2h0IH07XHJcbiIsImltcG9ydCB7IExpZ2h0IH0gZnJvbSAnLi9MaWdodC5qcyc7XHJcbmltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vbWF0aC9Db2xvci5qcyc7XHJcbmltcG9ydCB7IE9iamVjdDNEIH0gZnJvbSAnLi4vY29yZS9PYmplY3QzRC5qcyc7XHJcblxyXG4vKipcclxuICogQSBsaWdodCBzb3VyY2UgcG9zaXRpb25lZCBkaXJlY3RseSBhYm92ZSB0aGUgc2NlbmUsIHdpdGggY29sb3IgZmFkaW5nIGZyb21cclxuICogdGhlIHNreSBjb2xvciB0byB0aGUgZ3JvdW5kIGNvbG9yLlxyXG4gKlxyXG4gKiBUaGlzIGxpZ2h0IGNhbm5vdCBiZSB1c2VkIHRvIGNhc3Qgc2hhZG93cy5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgbGlnaHQgPSBuZXcgVEhSRUUuSGVtaXNwaGVyZUxpZ2h0KCAweGZmZmZiYiwgMHgwODA4MjAsIDEgKTtcclxuICogc2NlbmUuYWRkKCBsaWdodCApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIExpZ2h0XHJcbiAqL1xyXG5jbGFzcyBIZW1pc3BoZXJlTGlnaHQgZXh0ZW5kcyBMaWdodCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgaGVtaXNwaGVyZSBsaWdodC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7KG51bWJlcnxDb2xvcnxzdHJpbmcpfSBbc2t5Q29sb3I9MHhmZmZmZmZdIC0gVGhlIGxpZ2h0J3Mgc2t5IGNvbG9yLlxyXG5cdCAqIEBwYXJhbSB7KG51bWJlcnxDb2xvcnxzdHJpbmcpfSBbZ3JvdW5kQ29sb3I9MHhmZmZmZmZdIC0gVGhlIGxpZ2h0J3MgZ3JvdW5kIGNvbG9yLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbaW50ZW5zaXR5PTFdIC0gVGhlIGxpZ2h0J3Mgc3RyZW5ndGgvaW50ZW5zaXR5LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBza3lDb2xvciwgZ3JvdW5kQ29sb3IsIGludGVuc2l0eSApIHtcclxuXHJcblx0XHRzdXBlciggc2t5Q29sb3IsIGludGVuc2l0eSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0hlbWlzcGhlcmVMaWdodCA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ0hlbWlzcGhlcmVMaWdodCc7XHJcblxyXG5cdFx0dGhpcy5wb3NpdGlvbi5jb3B5KCBPYmplY3QzRC5ERUZBVUxUX1VQICk7XHJcblx0XHR0aGlzLnVwZGF0ZU1hdHJpeCgpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGxpZ2h0J3MgZ3JvdW5kIGNvbG9yLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtDb2xvcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ncm91bmRDb2xvciA9IG5ldyBDb2xvciggZ3JvdW5kQ29sb3IgKTtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UsIHJlY3Vyc2l2ZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UsIHJlY3Vyc2l2ZSApO1xyXG5cclxuXHRcdHRoaXMuZ3JvdW5kQ29sb3IuY29weSggc291cmNlLmdyb3VuZENvbG9yICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IEhlbWlzcGhlcmVMaWdodCB9O1xyXG4iLCJpbXBvcnQgeyBNYXRyaXg0IH0gZnJvbSAnLi4vbWF0aC9NYXRyaXg0LmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uL21hdGgvVmVjdG9yMi5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3I0IH0gZnJvbSAnLi4vbWF0aC9WZWN0b3I0LmpzJztcclxuaW1wb3J0IHsgRnJ1c3R1bSB9IGZyb20gJy4uL21hdGgvRnJ1c3R1bS5qcyc7XHJcblxyXG5jb25zdCBfcHJvalNjcmVlbk1hdHJpeCA9IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDQoKTtcclxuY29uc3QgX2xpZ2h0UG9zaXRpb25Xb3JsZCA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX2xvb2tUYXJnZXQgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcblxyXG4vKipcclxuICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgbGlnaHQgc2hhZG93IGNsYXNzZXMuIFRoZXNlIGNsYXNzZXNcclxuICogcmVwcmVzZW50IHRoZSBzaGFkb3cgY29uZmlndXJhdGlvbiBmb3IgZGlmZmVyZW50IGxpZ2h0IHR5cGVzLlxyXG4gKlxyXG4gKiBAYWJzdHJhY3RcclxuICovXHJcbmNsYXNzIExpZ2h0U2hhZG93IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBsaWdodCBzaGFkb3cuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0NhbWVyYX0gY2FtZXJhIC0gVGhlIGxpZ2h0J3MgdmlldyBvZiB0aGUgd29ybGQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGNhbWVyYSApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBsaWdodCdzIHZpZXcgb2YgdGhlIHdvcmxkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtDYW1lcmF9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2FtZXJhID0gY2FtZXJhO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGludGVuc2l0eSBvZiB0aGUgc2hhZG93LiBUaGUgZGVmYXVsdCBpcyBgMWAuXHJcblx0XHQgKiBWYWxpZCB2YWx1ZXMgYXJlIGluIHRoZSByYW5nZSBgWzAsIDFdYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmludGVuc2l0eSA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTaGFkb3cgbWFwIGJpYXMsIGhvdyBtdWNoIHRvIGFkZCBvciBzdWJ0cmFjdCBmcm9tIHRoZSBub3JtYWxpemVkIGRlcHRoXHJcblx0XHQgKiB3aGVuIGRlY2lkaW5nIHdoZXRoZXIgYSBzdXJmYWNlIGlzIGluIHNoYWRvdy5cclxuXHRcdCAqXHJcblx0XHQgKiBUaGUgZGVmYXVsdCBpcyBgMGAuIFZlcnkgdGlueSBhZGp1c3RtZW50cyBoZXJlIChpbiB0aGUgb3JkZXIgb2YgYDAuMDAwMWApXHJcblx0XHQgKiBtYXkgaGVscCByZWR1Y2UgYXJ0aWZhY3RzIGluIHNoYWRvd3MuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5iaWFzID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgaG93IG11Y2ggdGhlIHBvc2l0aW9uIHVzZWQgdG8gcXVlcnkgdGhlIHNoYWRvdyBtYXAgaXMgb2Zmc2V0IGFsb25nXHJcblx0XHQgKiB0aGUgb2JqZWN0IG5vcm1hbC4gVGhlIGRlZmF1bHQgaXMgYDBgLiBJbmNyZWFzaW5nIHRoaXMgdmFsdWUgY2FuIGJlIHVzZWQgdG9cclxuXHRcdCAqIHJlZHVjZSBzaGFkb3cgYWNuZSBlc3BlY2lhbGx5IGluIGxhcmdlIHNjZW5lcyB3aGVyZSBsaWdodCBzaGluZXMgb250b1xyXG5cdFx0ICogZ2VvbWV0cnkgYXQgYSBzaGFsbG93IGFuZ2xlLiBUaGUgY29zdCBpcyB0aGF0IHNoYWRvd3MgbWF5IGFwcGVhciBkaXN0b3J0ZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub3JtYWxCaWFzID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNldHRpbmcgdGhpcyB0byB2YWx1ZXMgZ3JlYXRlciB0aGFuIDEgd2lsbCBibHVyIHRoZSBlZGdlcyBvZiB0aGUgc2hhZG93LlxyXG5cdFx0ICogSGlnaCB2YWx1ZXMgd2lsbCBjYXVzZSB1bndhbnRlZCBiYW5kaW5nIGVmZmVjdHMgaW4gdGhlIHNoYWRvd3MgLSBhIGdyZWF0ZXJcclxuXHRcdCAqIG1hcCBzaXplIHdpbGwgYWxsb3cgZm9yIGEgaGlnaGVyIHZhbHVlIHRvIGJlIHVzZWQgaGVyZSBiZWZvcmUgdGhlc2UgZWZmZWN0c1xyXG5cdFx0ICogYmVjb21lIHZpc2libGUuXHJcblx0XHQgKlxyXG5cdFx0ICogVGhlIHByb3BlcnR5IGhhcyBubyBlZmZlY3Qgd2hlbiB0aGUgc2hhZG93IG1hcCB0eXBlIGlzIGBQQ0ZTb2Z0U2hhZG93TWFwYCBhbmRcclxuXHRcdCAqIGFuZCBpdCBpcyByZWNvbW1lbmRlZCB0byBpbmNyZWFzZSBzb2Z0bmVzcyBieSBkZWNyZWFzaW5nIHRoZSBzaGFkb3cgbWFwIHNpemUgaW5zdGVhZC5cclxuXHRcdCAqXHJcblx0XHQgKiBUaGUgcHJvcGVydHkgaGFzIG5vIGVmZmVjdCB3aGVuIHRoZSBzaGFkb3cgbWFwIHR5cGUgaXMgYEJhc2ljU2hhZG93TWFwYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJhZGl1cyA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYW1vdW50IG9mIHNhbXBsZXMgdG8gdXNlIHdoZW4gYmx1cnJpbmcgYSBWU00gc2hhZG93IG1hcC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgOFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJsdXJTYW1wbGVzID0gODtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIHNoYWRvdyBtYXAuIEhpZ2hlciB2YWx1ZXMgZ2l2ZSBiZXR0ZXIgcXVhbGl0eVxyXG5cdFx0ICogc2hhZG93cyBhdCB0aGUgY29zdCBvZiBjb21wdXRhdGlvbiB0aW1lLiBWYWx1ZXMgbXVzdCBiZSBwb3dlcnMgb2YgdHdvLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3IyfVxyXG5cdFx0ICogQGRlZmF1bHQgKDUxMiw1MTIpXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWFwU2l6ZSA9IG5ldyBWZWN0b3IyKCA1MTIsIDUxMiApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGRlcHRoIG1hcCBnZW5lcmF0ZWQgdXNpbmcgdGhlIGludGVybmFsIGNhbWVyYTsgYSBsb2NhdGlvbiBiZXlvbmQgYVxyXG5cdFx0ICogcGl4ZWwncyBkZXB0aCBpcyBpbiBzaGFkb3cuIENvbXB1dGVkIGludGVybmFsbHkgZHVyaW5nIHJlbmRlcmluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1JlbmRlclRhcmdldH1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGRpc3RyaWJ1dGlvbiBtYXAgZ2VuZXJhdGVkIHVzaW5nIHRoZSBpbnRlcm5hbCBjYW1lcmE7IGFuIG9jY2x1c2lvbiBpc1xyXG5cdFx0ICogY2FsY3VsYXRlZCBiYXNlZCBvbiB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcHRocy4gQ29tcHV0ZWQgaW50ZXJuYWxseSBkdXJpbmdcclxuXHRcdCAqIHJlbmRlcmluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1JlbmRlclRhcmdldH1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tYXBQYXNzID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIE1vZGVsIHRvIHNoYWRvdyBjYW1lcmEgc3BhY2UsIHRvIGNvbXB1dGUgbG9jYXRpb24gYW5kIGRlcHRoIGluIHNoYWRvdyBtYXAuXHJcblx0XHQgKiBUaGlzIGlzIGNvbXB1dGVkIGludGVybmFsbHkgZHVyaW5nIHJlbmRlcmluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7TWF0cml4NH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tYXRyaXggPSBuZXcgTWF0cml4NCgpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRW5hYmxlcyBhdXRvbWF0aWMgdXBkYXRlcyBvZiB0aGUgbGlnaHQncyBzaGFkb3cuIElmIHlvdSBkbyBub3QgcmVxdWlyZSBkeW5hbWljXHJcblx0XHQgKiBsaWdodGluZyAvIHNoYWRvd3MsIHlvdSBtYXkgc2V0IHRoaXMgdG8gYGZhbHNlYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hdXRvVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZW4gc2V0IHRvIGB0cnVlYCwgc2hhZG93IG1hcHMgd2lsbCBiZSB1cGRhdGVkIGluIHRoZSBuZXh0IGByZW5kZXJgIGNhbGwuXHJcblx0XHQgKiBJZiB5b3UgaGF2ZSBzZXQge0BsaW5rIExpZ2h0U2hhZG93I2F1dG9VcGRhdGV9IHRvIGBmYWxzZWAsIHlvdSB3aWxsIG5lZWQgdG9cclxuXHRcdCAqIHNldCB0aGlzIHByb3BlcnR5IHRvIGB0cnVlYCBhbmQgdGhlbiBtYWtlIGEgcmVuZGVyIGNhbGwgdG8gdXBkYXRlIHRoZSBsaWdodCdzIHNoYWRvdy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSBmYWxzZTtcclxuXHJcblx0XHR0aGlzLl9mcnVzdHVtID0gbmV3IEZydXN0dW0oKTtcclxuXHRcdHRoaXMuX2ZyYW1lRXh0ZW50cyA9IG5ldyBWZWN0b3IyKCAxLCAxICk7XHJcblxyXG5cdFx0dGhpcy5fdmlld3BvcnRDb3VudCA9IDE7XHJcblxyXG5cdFx0dGhpcy5fdmlld3BvcnRzID0gW1xyXG5cclxuXHRcdFx0bmV3IFZlY3RvcjQoIDAsIDAsIDEsIDEgKVxyXG5cclxuXHRcdF07XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSByZW5kZXJlciB0byBnZXQgdGhlIG51bWJlciBvZiB2aWV3cG9ydHMgdGhhdCBuZWVkXHJcblx0ICogdG8gYmUgcmVuZGVyZWQgZm9yIHRoaXMgc2hhZG93LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgdmlld3BvcnQgY291bnQuXHJcblx0ICovXHJcblx0Z2V0Vmlld3BvcnRDb3VudCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fdmlld3BvcnRDb3VudDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZXRzIHRoZSBzaGFkb3cgY2FtZXJhcyBmcnVzdHVtLiBVc2VkIGludGVybmFsbHkgYnkgdGhlIHJlbmRlcmVyIHRvIGN1bGwgb2JqZWN0cy5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0ZydXN0dW19IFRoZSBzaGFkb3cgY2FtZXJhIGZydXN0dW0uXHJcblx0ICovXHJcblx0Z2V0RnJ1c3R1bSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fZnJ1c3R1bTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGUgdGhlIG1hdHJpY2VzIGZvciB0aGUgY2FtZXJhIGFuZCBzaGFkb3csIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgcmVuZGVyZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0xpZ2h0fSBsaWdodCAtIFRoZSBsaWdodCBmb3Igd2hpY2ggdGhlIHNoYWRvdyBpcyBiZWluZyByZW5kZXJlZC5cclxuXHQgKi9cclxuXHR1cGRhdGVNYXRyaWNlcyggbGlnaHQgKSB7XHJcblxyXG5cdFx0Y29uc3Qgc2hhZG93Q2FtZXJhID0gdGhpcy5jYW1lcmE7XHJcblx0XHRjb25zdCBzaGFkb3dNYXRyaXggPSB0aGlzLm1hdHJpeDtcclxuXHJcblx0XHRfbGlnaHRQb3NpdGlvbldvcmxkLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTtcclxuXHRcdHNoYWRvd0NhbWVyYS5wb3NpdGlvbi5jb3B5KCBfbGlnaHRQb3NpdGlvbldvcmxkICk7XHJcblxyXG5cdFx0X2xvb2tUYXJnZXQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC50YXJnZXQubWF0cml4V29ybGQgKTtcclxuXHRcdHNoYWRvd0NhbWVyYS5sb29rQXQoIF9sb29rVGFyZ2V0ICk7XHJcblx0XHRzaGFkb3dDYW1lcmEudXBkYXRlTWF0cml4V29ybGQoKTtcclxuXHJcblx0XHRfcHJvalNjcmVlbk1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBzaGFkb3dDYW1lcmEucHJvamVjdGlvbk1hdHJpeCwgc2hhZG93Q2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSApO1xyXG5cdFx0dGhpcy5fZnJ1c3R1bS5zZXRGcm9tUHJvamVjdGlvbk1hdHJpeCggX3Byb2pTY3JlZW5NYXRyaXggKTtcclxuXHJcblx0XHRzaGFkb3dNYXRyaXguc2V0KFxyXG5cdFx0XHQwLjUsIDAuMCwgMC4wLCAwLjUsXHJcblx0XHRcdDAuMCwgMC41LCAwLjAsIDAuNSxcclxuXHRcdFx0MC4wLCAwLjAsIDAuNSwgMC41LFxyXG5cdFx0XHQwLjAsIDAuMCwgMC4wLCAxLjBcclxuXHRcdCk7XHJcblxyXG5cdFx0c2hhZG93TWF0cml4Lm11bHRpcGx5KCBfcHJvalNjcmVlbk1hdHJpeCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSB2aWV3cG9ydCBkZWZpbml0aW9uIGZvciB0aGUgZ2l2ZW4gdmlld3BvcnQgaW5kZXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdmlld3BvcnRJbmRleCAtIFRoZSB2aWV3cG9ydCBpbmRleC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3I0fSBUaGUgdmlld3BvcnQuXHJcblx0ICovXHJcblx0Z2V0Vmlld3BvcnQoIHZpZXdwb3J0SW5kZXggKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX3ZpZXdwb3J0c1sgdmlld3BvcnRJbmRleCBdO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGZyYW1lIGV4dGVuZHMuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBUaGUgZnJhbWUgZXh0ZW5kcy5cclxuXHQgKi9cclxuXHRnZXRGcmFtZUV4dGVudHMoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX2ZyYW1lRXh0ZW50cztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGcmVlcyB0aGUgR1BVLXJlbGF0ZWQgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGlzIGluc3RhbmNlLiBDYWxsIHRoaXNcclxuXHQgKiBtZXRob2Qgd2hlbmV2ZXIgdGhpcyBpbnN0YW5jZSBpcyBubyBsb25nZXIgdXNlZCBpbiB5b3VyIGFwcC5cclxuXHQgKi9cclxuXHRkaXNwb3NlKCkge1xyXG5cclxuXHRcdGlmICggdGhpcy5tYXAgKSB7XHJcblxyXG5cdFx0XHR0aGlzLm1hcC5kaXNwb3NlKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy5tYXBQYXNzICkge1xyXG5cclxuXHRcdFx0dGhpcy5tYXBQYXNzLmRpc3Bvc2UoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29waWVzIHRoZSB2YWx1ZXMgb2YgdGhlIGdpdmVuIGxpZ2h0IHNoYWRvdyBpbnN0YW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtMaWdodFNoYWRvd30gc291cmNlIC0gVGhlIGxpZ2h0IHNoYWRvdyB0byBjb3B5LlxyXG5cdCAqIEByZXR1cm4ge0xpZ2h0U2hhZG93fSBBIHJlZmVyZW5jZSB0byB0aGlzIGxpZ2h0IHNoYWRvdyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0dGhpcy5jYW1lcmEgPSBzb3VyY2UuY2FtZXJhLmNsb25lKCk7XHJcblxyXG5cdFx0dGhpcy5pbnRlbnNpdHkgPSBzb3VyY2UuaW50ZW5zaXR5O1xyXG5cclxuXHRcdHRoaXMuYmlhcyA9IHNvdXJjZS5iaWFzO1xyXG5cdFx0dGhpcy5yYWRpdXMgPSBzb3VyY2UucmFkaXVzO1xyXG5cclxuXHRcdHRoaXMubWFwU2l6ZS5jb3B5KCBzb3VyY2UubWFwU2l6ZSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBuZXcgbGlnaHQgc2hhZG93IGluc3RhbmNlIHdpdGggY29waWVkIHZhbHVlcyBmcm9tIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtMaWdodFNoYWRvd30gQSBjbG9uZSBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNsb25lKCkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXJpYWxpemVzIHRoZSBsaWdodCBzaGFkb3cgaW50byBKU09OLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7T2JqZWN0fSBBIEpTT04gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc2VyaWFsaXplZCBsaWdodCBzaGFkb3cuXHJcblx0ICogQHNlZSB7QGxpbmsgT2JqZWN0TG9hZGVyI3BhcnNlfVxyXG5cdCAqL1xyXG5cdHRvSlNPTigpIHtcclxuXHJcblx0XHRjb25zdCBvYmplY3QgPSB7fTtcclxuXHJcblx0XHRpZiAoIHRoaXMuaW50ZW5zaXR5ICE9PSAxICkgb2JqZWN0LmludGVuc2l0eSA9IHRoaXMuaW50ZW5zaXR5O1xyXG5cdFx0aWYgKCB0aGlzLmJpYXMgIT09IDAgKSBvYmplY3QuYmlhcyA9IHRoaXMuYmlhcztcclxuXHRcdGlmICggdGhpcy5ub3JtYWxCaWFzICE9PSAwICkgb2JqZWN0Lm5vcm1hbEJpYXMgPSB0aGlzLm5vcm1hbEJpYXM7XHJcblx0XHRpZiAoIHRoaXMucmFkaXVzICE9PSAxICkgb2JqZWN0LnJhZGl1cyA9IHRoaXMucmFkaXVzO1xyXG5cdFx0aWYgKCB0aGlzLm1hcFNpemUueCAhPT0gNTEyIHx8IHRoaXMubWFwU2l6ZS55ICE9PSA1MTIgKSBvYmplY3QubWFwU2l6ZSA9IHRoaXMubWFwU2l6ZS50b0FycmF5KCk7XHJcblxyXG5cdFx0b2JqZWN0LmNhbWVyYSA9IHRoaXMuY2FtZXJhLnRvSlNPTiggZmFsc2UgKS5vYmplY3Q7XHJcblx0XHRkZWxldGUgb2JqZWN0LmNhbWVyYS5tYXRyaXg7XHJcblxyXG5cdFx0cmV0dXJuIG9iamVjdDtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgTGlnaHRTaGFkb3cgfTtcclxuIiwiaW1wb3J0IHsgTGlnaHRTaGFkb3cgfSBmcm9tICcuL0xpZ2h0U2hhZG93LmpzJztcclxuaW1wb3J0IHsgUkFEMkRFRyB9IGZyb20gJy4uL21hdGgvTWF0aFV0aWxzLmpzJztcclxuaW1wb3J0IHsgUGVyc3BlY3RpdmVDYW1lcmEgfSBmcm9tICcuLi9jYW1lcmFzL1BlcnNwZWN0aXZlQ2FtZXJhLmpzJztcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIHRoZSBzaGFkb3cgY29uZmlndXJhdGlvbiBvZiBkaXJlY3Rpb25hbCBsaWdodHMuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBMaWdodFNoYWRvd1xyXG4gKi9cclxuY2xhc3MgU3BvdExpZ2h0U2hhZG93IGV4dGVuZHMgTGlnaHRTaGFkb3cge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHNwb3QgbGlnaHQgc2hhZG93LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cclxuXHRcdHN1cGVyKCBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIDUwLCAxLCAwLjUsIDUwMCApICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzU3BvdExpZ2h0U2hhZG93ID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFVzZWQgdG8gZm9jdXMgdGhlIHNoYWRvdyBjYW1lcmEuIFRoZSBjYW1lcmEncyBmaWVsZCBvZiB2aWV3IGlzIHNldCBhcyBhXHJcblx0XHQgKiBwZXJjZW50YWdlIG9mIHRoZSBzcG90bGlnaHQncyBmaWVsZC1vZi12aWV3LiBSYW5nZSBpcyBgWzAsIDFdYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZvY3VzID0gMTtcclxuXHJcblx0fVxyXG5cclxuXHR1cGRhdGVNYXRyaWNlcyggbGlnaHQgKSB7XHJcblxyXG5cdFx0Y29uc3QgY2FtZXJhID0gdGhpcy5jYW1lcmE7XHJcblxyXG5cdFx0Y29uc3QgZm92ID0gUkFEMkRFRyAqIDIgKiBsaWdodC5hbmdsZSAqIHRoaXMuZm9jdXM7XHJcblx0XHRjb25zdCBhc3BlY3QgPSB0aGlzLm1hcFNpemUud2lkdGggLyB0aGlzLm1hcFNpemUuaGVpZ2h0O1xyXG5cdFx0Y29uc3QgZmFyID0gbGlnaHQuZGlzdGFuY2UgfHwgY2FtZXJhLmZhcjtcclxuXHJcblx0XHRpZiAoIGZvdiAhPT0gY2FtZXJhLmZvdiB8fCBhc3BlY3QgIT09IGNhbWVyYS5hc3BlY3QgfHwgZmFyICE9PSBjYW1lcmEuZmFyICkge1xyXG5cclxuXHRcdFx0Y2FtZXJhLmZvdiA9IGZvdjtcclxuXHRcdFx0Y2FtZXJhLmFzcGVjdCA9IGFzcGVjdDtcclxuXHRcdFx0Y2FtZXJhLmZhciA9IGZhcjtcclxuXHRcdFx0Y2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0c3VwZXIudXBkYXRlTWF0cmljZXMoIGxpZ2h0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMuZm9jdXMgPSBzb3VyY2UuZm9jdXM7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFNwb3RMaWdodFNoYWRvdyB9O1xyXG4iLCJpbXBvcnQgeyBMaWdodCB9IGZyb20gJy4vTGlnaHQuanMnO1xyXG5pbXBvcnQgeyBTcG90TGlnaHRTaGFkb3cgfSBmcm9tICcuL1Nwb3RMaWdodFNoYWRvdy5qcyc7XHJcbmltcG9ydCB7IE9iamVjdDNEIH0gZnJvbSAnLi4vY29yZS9PYmplY3QzRC5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBsaWdodCBnZXRzIGVtaXR0ZWQgZnJvbSBhIHNpbmdsZSBwb2ludCBpbiBvbmUgZGlyZWN0aW9uLCBhbG9uZyBhIGNvbmVcclxuICogdGhhdCBpbmNyZWFzZXMgaW4gc2l6ZSB0aGUgZnVydGhlciBmcm9tIHRoZSBsaWdodCBpdCBnZXRzLlxyXG4gKlxyXG4gKiBUaGlzIGxpZ2h0IGNhbiBjYXN0IHNoYWRvd3MgLSBzZWUgdGhlIHtAbGluayBTcG90TGlnaHRTaGFkb3d9IGZvciBkZXRhaWxzLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiAvLyB3aGl0ZSBzcG90bGlnaHQgc2hpbmluZyBmcm9tIHRoZSBzaWRlLCBtb2R1bGF0ZWQgYnkgYSB0ZXh0dXJlXHJcbiAqIGNvbnN0IHNwb3RMaWdodCA9IG5ldyBUSFJFRS5TcG90TGlnaHQoIDB4ZmZmZmZmICk7XHJcbiAqIHNwb3RMaWdodC5wb3NpdGlvbi5zZXQoIDEwMCwgMTAwMCwgMTAwICk7XHJcbiAqIHNwb3RMaWdodC5tYXAgPSBuZXcgVEhSRUUuVGV4dHVyZUxvYWRlcigpLmxvYWQoIHVybCApO1xyXG4gKlxyXG4gKiBzcG90TGlnaHQuY2FzdFNoYWRvdyA9IHRydWU7XHJcbiAqIHNwb3RMaWdodC5zaGFkb3cubWFwU2l6ZS53aWR0aCA9IDEwMjQ7XHJcbiAqIHNwb3RMaWdodC5zaGFkb3cubWFwU2l6ZS5oZWlnaHQgPSAxMDI0O1xyXG4gKiBzcG90TGlnaHQuc2hhZG93LmNhbWVyYS5uZWFyID0gNTAwO1xyXG4gKiBzcG90TGlnaHQuc2hhZG93LmNhbWVyYS5mYXIgPSA0MDAwO1xyXG4gKiBzcG90TGlnaHQuc2hhZG93LmNhbWVyYS5mb3YgPSAzMDtzXHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTGlnaHRcclxuICovXHJcbmNsYXNzIFNwb3RMaWdodCBleHRlbmRzIExpZ2h0IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBzcG90IGxpZ2h0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHsobnVtYmVyfENvbG9yfHN0cmluZyl9IFtjb2xvcj0weGZmZmZmZl0gLSBUaGUgbGlnaHQncyBjb2xvci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2ludGVuc2l0eT0xXSAtIFRoZSBsaWdodCdzIHN0cmVuZ3RoL2ludGVuc2l0eSBtZWFzdXJlZCBpbiBjYW5kZWxhIChjZCkuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtkaXN0YW5jZT0wXSAtIE1heGltdW0gcmFuZ2Ugb2YgdGhlIGxpZ2h0LiBgMGAgbWVhbnMgbm8gbGltaXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFthbmdsZT1NYXRoLlBJLzNdIC0gTWF4aW11bSBhbmdsZSBvZiBsaWdodCBkaXNwZXJzaW9uIGZyb20gaXRzIGRpcmVjdGlvbiB3aG9zZSB1cHBlciBib3VuZCBpcyBgTWF0aC5QSS8yYC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3BlbnVtYnJhPTBdIC0gUGVyY2VudCBvZiB0aGUgc3BvdGxpZ2h0IGNvbmUgdGhhdCBpcyBhdHRlbnVhdGVkIGR1ZSB0byBwZW51bWJyYS4gVmFsdWUgcmFuZ2UgaXMgYFswLDFdYC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2RlY2F5PTJdIC0gVGhlIGFtb3VudCB0aGUgbGlnaHQgZGltcyBhbG9uZyB0aGUgZGlzdGFuY2Ugb2YgdGhlIGxpZ2h0LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBjb2xvciwgaW50ZW5zaXR5LCBkaXN0YW5jZSA9IDAsIGFuZ2xlID0gTWF0aC5QSSAvIDMsIHBlbnVtYnJhID0gMCwgZGVjYXkgPSAyICkge1xyXG5cclxuXHRcdHN1cGVyKCBjb2xvciwgaW50ZW5zaXR5ICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzU3BvdExpZ2h0ID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnU3BvdExpZ2h0JztcclxuXHJcblx0XHR0aGlzLnBvc2l0aW9uLmNvcHkoIE9iamVjdDNELkRFRkFVTFRfVVAgKTtcclxuXHRcdHRoaXMudXBkYXRlTWF0cml4KCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc3BvdCBsaWdodCBwb2ludHMgZnJvbSBpdHMgcG9zaXRpb24gdG8gdGhlXHJcblx0XHQgKiB0YXJnZXQncyBwb3NpdGlvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBGb3IgdGhlIHRhcmdldCdzIHBvc2l0aW9uIHRvIGJlIGNoYW5nZWQgdG8gYW55dGhpbmcgb3RoZXJcclxuXHRcdCAqIHRoYW4gdGhlIGRlZmF1bHQsIGl0IG11c3QgYmUgYWRkZWQgdG8gdGhlIHNjZW5lLlxyXG5cdFx0ICpcclxuXHRcdCAqIEl0IGlzIGFsc28gcG9zc2libGUgdG8gc2V0IHRoZSB0YXJnZXQgdG8gYmUgYW5vdGhlciAzRCBvYmplY3RcclxuXHRcdCAqIGluIHRoZSBzY2VuZS4gVGhlIGxpZ2h0IHdpbGwgbm93IHRyYWNrIHRoZSB0YXJnZXQgb2JqZWN0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3QzRH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50YXJnZXQgPSBuZXcgT2JqZWN0M0QoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIE1heGltdW0gcmFuZ2Ugb2YgdGhlIGxpZ2h0LiBgMGAgbWVhbnMgbm8gbGltaXQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kaXN0YW5jZSA9IGRpc3RhbmNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogTWF4aW11bSBhbmdsZSBvZiBsaWdodCBkaXNwZXJzaW9uIGZyb20gaXRzIGRpcmVjdGlvbiB3aG9zZSB1cHBlciBib3VuZCBpcyBgTWF0aC5QSS8yYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgTWF0aC5QSS8zXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYW5nbGUgPSBhbmdsZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFBlcmNlbnQgb2YgdGhlIHNwb3RsaWdodCBjb25lIHRoYXQgaXMgYXR0ZW51YXRlZCBkdWUgdG8gcGVudW1icmEuXHJcblx0XHQgKiBWYWx1ZSByYW5nZSBpcyBgWzAsMV1gLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucGVudW1icmEgPSBwZW51bWJyYTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBhbW91bnQgdGhlIGxpZ2h0IGRpbXMgYWxvbmcgdGhlIGRpc3RhbmNlIG9mIHRoZSBsaWdodC4gSW4gY29udGV4dCBvZlxyXG5cdFx0ICogcGh5c2ljYWxseS1jb3JyZWN0IHJlbmRlcmluZyB0aGUgZGVmYXVsdCB2YWx1ZSBzaG91bGQgbm90IGJlIGNoYW5nZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDJcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kZWNheSA9IGRlY2F5O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSB0ZXh0dXJlIHVzZWQgdG8gbW9kdWxhdGUgdGhlIGNvbG9yIG9mIHRoZSBsaWdodC4gVGhlIHNwb3QgbGlnaHRcclxuXHRcdCAqIGNvbG9yIGlzIG1peGVkIHdpdGggdGhlIFJHQiB2YWx1ZSBvZiB0aGlzIHRleHR1cmUsIHdpdGggYSByYXRpb1xyXG5cdFx0ICogY29ycmVzcG9uZGluZyB0byBpdHMgYWxwaGEgdmFsdWUuIFRoZSBjb29raWUtbGlrZSBtYXNraW5nIGVmZmVjdCBpc1xyXG5cdFx0ICogcmVwcm9kdWNlZCB1c2luZyBwaXhlbCB2YWx1ZXMgKDAsIDAsIDAsIDEtY29va2llX3ZhbHVlKS5cclxuXHRcdCAqXHJcblx0XHQgKiAqV2FybmluZyo6IFRoaXMgcHJvcGVydHkgaXMgZGlzYWJsZWQgaWYge0BsaW5rIE9iamVjdDNEI2Nhc3RTaGFkb3d9IGlzIHNldCB0byBgZmFsc2VgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tYXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBwcm9wZXJ0eSBob2xkcyB0aGUgbGlnaHQncyBzaGFkb3cgY29uZmlndXJhdGlvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7U3BvdExpZ2h0U2hhZG93fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNoYWRvdyA9IG5ldyBTcG90TGlnaHRTaGFkb3coKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgbGlnaHQncyBwb3dlci4gUG93ZXIgaXMgdGhlIGx1bWlub3VzIHBvd2VyIG9mIHRoZSBsaWdodCBtZWFzdXJlZCBpbiBsdW1lbnMgKGxtKS5cclxuXHQgKiAgQ2hhbmdpbmcgdGhlIHBvd2VyIHdpbGwgYWxzbyBjaGFuZ2UgdGhlIGxpZ2h0J3MgaW50ZW5zaXR5LlxyXG5cdCAqXHJcblx0ICogQHR5cGUge251bWJlcn1cclxuXHQgKi9cclxuXHRnZXQgcG93ZXIoKSB7XHJcblxyXG5cdFx0Ly8gY29tcHV0ZSB0aGUgbGlnaHQncyBsdW1pbm91cyBwb3dlciAoaW4gbHVtZW5zKSBmcm9tIGl0cyBpbnRlbnNpdHkgKGluIGNhbmRlbGEpXHJcblx0XHQvLyBieSBjb252ZW50aW9uIGZvciBhIHNwb3RsaWdodCwgbHVtaW5vdXMgcG93ZXIgKGxtKSA9IM+AICogbHVtaW5vdXMgaW50ZW5zaXR5IChjZClcclxuXHRcdHJldHVybiB0aGlzLmludGVuc2l0eSAqIE1hdGguUEk7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0IHBvd2VyKCBwb3dlciApIHtcclxuXHJcblx0XHQvLyBzZXQgdGhlIGxpZ2h0J3MgaW50ZW5zaXR5IChpbiBjYW5kZWxhKSBmcm9tIHRoZSBkZXNpcmVkIGx1bWlub3VzIHBvd2VyIChpbiBsdW1lbnMpXHJcblx0XHR0aGlzLmludGVuc2l0eSA9IHBvd2VyIC8gTWF0aC5QSTtcclxuXHJcblx0fVxyXG5cclxuXHRkaXNwb3NlKCkge1xyXG5cclxuXHRcdHRoaXMuc2hhZG93LmRpc3Bvc2UoKTtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UsIHJlY3Vyc2l2ZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UsIHJlY3Vyc2l2ZSApO1xyXG5cclxuXHRcdHRoaXMuZGlzdGFuY2UgPSBzb3VyY2UuZGlzdGFuY2U7XHJcblx0XHR0aGlzLmFuZ2xlID0gc291cmNlLmFuZ2xlO1xyXG5cdFx0dGhpcy5wZW51bWJyYSA9IHNvdXJjZS5wZW51bWJyYTtcclxuXHRcdHRoaXMuZGVjYXkgPSBzb3VyY2UuZGVjYXk7XHJcblxyXG5cdFx0dGhpcy50YXJnZXQgPSBzb3VyY2UudGFyZ2V0LmNsb25lKCk7XHJcblxyXG5cdFx0dGhpcy5zaGFkb3cgPSBzb3VyY2Uuc2hhZG93LmNsb25lKCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFNwb3RMaWdodCB9O1xyXG4iLCJpbXBvcnQgeyBMaWdodFNoYWRvdyB9IGZyb20gJy4vTGlnaHRTaGFkb3cuanMnO1xyXG5pbXBvcnQgeyBQZXJzcGVjdGl2ZUNhbWVyYSB9IGZyb20gJy4uL2NhbWVyYXMvUGVyc3BlY3RpdmVDYW1lcmEuanMnO1xyXG5pbXBvcnQgeyBNYXRyaXg0IH0gZnJvbSAnLi4vbWF0aC9NYXRyaXg0LmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uL21hdGgvVmVjdG9yMi5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3I0IH0gZnJvbSAnLi4vbWF0aC9WZWN0b3I0LmpzJztcclxuXHJcbmNvbnN0IF9wcm9qU2NyZWVuTWF0cml4ID0gLypAX19QVVJFX18qLyBuZXcgTWF0cml4NCgpO1xyXG5jb25zdCBfbGlnaHRQb3NpdGlvbldvcmxkID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfbG9va1RhcmdldCA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIHRoZSBzaGFkb3cgY29uZmlndXJhdGlvbiBvZiBwb2ludCBsaWdodHMuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBMaWdodFNoYWRvd1xyXG4gKi9cclxuY2xhc3MgUG9pbnRMaWdodFNoYWRvdyBleHRlbmRzIExpZ2h0U2hhZG93IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBwb2ludCBsaWdodCBzaGFkb3cuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggOTAsIDEsIDAuNSwgNTAwICkgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNQb2ludExpZ2h0U2hhZG93ID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLl9mcmFtZUV4dGVudHMgPSBuZXcgVmVjdG9yMiggNCwgMiApO1xyXG5cclxuXHRcdHRoaXMuX3ZpZXdwb3J0Q291bnQgPSA2O1xyXG5cclxuXHRcdHRoaXMuX3ZpZXdwb3J0cyA9IFtcclxuXHRcdFx0Ly8gVGhlc2Ugdmlld3BvcnRzIG1hcCBhIGN1YmUtbWFwIG9udG8gYSAyRCB0ZXh0dXJlIHdpdGggdGhlXHJcblx0XHRcdC8vIGZvbGxvd2luZyBvcmllbnRhdGlvbjpcclxuXHRcdFx0Ly9cclxuXHRcdFx0Ly8gIHh6WFpcclxuXHRcdFx0Ly8gICB5IFlcclxuXHRcdFx0Ly9cclxuXHRcdFx0Ly8gWCAtIFBvc2l0aXZlIHggZGlyZWN0aW9uXHJcblx0XHRcdC8vIHggLSBOZWdhdGl2ZSB4IGRpcmVjdGlvblxyXG5cdFx0XHQvLyBZIC0gUG9zaXRpdmUgeSBkaXJlY3Rpb25cclxuXHRcdFx0Ly8geSAtIE5lZ2F0aXZlIHkgZGlyZWN0aW9uXHJcblx0XHRcdC8vIFogLSBQb3NpdGl2ZSB6IGRpcmVjdGlvblxyXG5cdFx0XHQvLyB6IC0gTmVnYXRpdmUgeiBkaXJlY3Rpb25cclxuXHJcblx0XHRcdC8vIHBvc2l0aXZlIFhcclxuXHRcdFx0bmV3IFZlY3RvcjQoIDIsIDEsIDEsIDEgKSxcclxuXHRcdFx0Ly8gbmVnYXRpdmUgWFxyXG5cdFx0XHRuZXcgVmVjdG9yNCggMCwgMSwgMSwgMSApLFxyXG5cdFx0XHQvLyBwb3NpdGl2ZSBaXHJcblx0XHRcdG5ldyBWZWN0b3I0KCAzLCAxLCAxLCAxICksXHJcblx0XHRcdC8vIG5lZ2F0aXZlIFpcclxuXHRcdFx0bmV3IFZlY3RvcjQoIDEsIDEsIDEsIDEgKSxcclxuXHRcdFx0Ly8gcG9zaXRpdmUgWVxyXG5cdFx0XHRuZXcgVmVjdG9yNCggMywgMCwgMSwgMSApLFxyXG5cdFx0XHQvLyBuZWdhdGl2ZSBZXHJcblx0XHRcdG5ldyBWZWN0b3I0KCAxLCAwLCAxLCAxIClcclxuXHRcdF07XHJcblxyXG5cdFx0dGhpcy5fY3ViZURpcmVjdGlvbnMgPSBbXHJcblx0XHRcdG5ldyBWZWN0b3IzKCAxLCAwLCAwICksIG5ldyBWZWN0b3IzKCAtIDEsIDAsIDAgKSwgbmV3IFZlY3RvcjMoIDAsIDAsIDEgKSxcclxuXHRcdFx0bmV3IFZlY3RvcjMoIDAsIDAsIC0gMSApLCBuZXcgVmVjdG9yMyggMCwgMSwgMCApLCBuZXcgVmVjdG9yMyggMCwgLSAxLCAwIClcclxuXHRcdF07XHJcblxyXG5cdFx0dGhpcy5fY3ViZVVwcyA9IFtcclxuXHRcdFx0bmV3IFZlY3RvcjMoIDAsIDEsIDAgKSwgbmV3IFZlY3RvcjMoIDAsIDEsIDAgKSwgbmV3IFZlY3RvcjMoIDAsIDEsIDAgKSxcclxuXHRcdFx0bmV3IFZlY3RvcjMoIDAsIDEsIDAgKSwgbmV3IFZlY3RvcjMoIDAsIDAsIDEgKSxcdG5ldyBWZWN0b3IzKCAwLCAwLCAtIDEgKVxyXG5cdFx0XTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGUgdGhlIG1hdHJpY2VzIGZvciB0aGUgY2FtZXJhIGFuZCBzaGFkb3csIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgcmVuZGVyZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0xpZ2h0fSBsaWdodCAtIFRoZSBsaWdodCBmb3Igd2hpY2ggdGhlIHNoYWRvdyBpcyBiZWluZyByZW5kZXJlZC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3ZpZXdwb3J0SW5kZXg9MF0gLSBUaGUgdmlld3BvcnQgaW5kZXguXHJcblx0ICovXHJcblx0dXBkYXRlTWF0cmljZXMoIGxpZ2h0LCB2aWV3cG9ydEluZGV4ID0gMCApIHtcclxuXHJcblx0XHRjb25zdCBjYW1lcmEgPSB0aGlzLmNhbWVyYTtcclxuXHRcdGNvbnN0IHNoYWRvd01hdHJpeCA9IHRoaXMubWF0cml4O1xyXG5cclxuXHRcdGNvbnN0IGZhciA9IGxpZ2h0LmRpc3RhbmNlIHx8IGNhbWVyYS5mYXI7XHJcblxyXG5cdFx0aWYgKCBmYXIgIT09IGNhbWVyYS5mYXIgKSB7XHJcblxyXG5cdFx0XHRjYW1lcmEuZmFyID0gZmFyO1xyXG5cdFx0XHRjYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRfbGlnaHRQb3NpdGlvbldvcmxkLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTtcclxuXHRcdGNhbWVyYS5wb3NpdGlvbi5jb3B5KCBfbGlnaHRQb3NpdGlvbldvcmxkICk7XHJcblxyXG5cdFx0X2xvb2tUYXJnZXQuY29weSggY2FtZXJhLnBvc2l0aW9uICk7XHJcblx0XHRfbG9va1RhcmdldC5hZGQoIHRoaXMuX2N1YmVEaXJlY3Rpb25zWyB2aWV3cG9ydEluZGV4IF0gKTtcclxuXHRcdGNhbWVyYS51cC5jb3B5KCB0aGlzLl9jdWJlVXBzWyB2aWV3cG9ydEluZGV4IF0gKTtcclxuXHRcdGNhbWVyYS5sb29rQXQoIF9sb29rVGFyZ2V0ICk7XHJcblx0XHRjYW1lcmEudXBkYXRlTWF0cml4V29ybGQoKTtcclxuXHJcblx0XHRzaGFkb3dNYXRyaXgubWFrZVRyYW5zbGF0aW9uKCAtIF9saWdodFBvc2l0aW9uV29ybGQueCwgLSBfbGlnaHRQb3NpdGlvbldvcmxkLnksIC0gX2xpZ2h0UG9zaXRpb25Xb3JsZC56ICk7XHJcblxyXG5cdFx0X3Byb2pTY3JlZW5NYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggY2FtZXJhLnByb2plY3Rpb25NYXRyaXgsIGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UgKTtcclxuXHRcdHRoaXMuX2ZydXN0dW0uc2V0RnJvbVByb2plY3Rpb25NYXRyaXgoIF9wcm9qU2NyZWVuTWF0cml4ICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFBvaW50TGlnaHRTaGFkb3cgfTtcclxuIiwiaW1wb3J0IHsgTGlnaHQgfSBmcm9tICcuL0xpZ2h0LmpzJztcclxuaW1wb3J0IHsgUG9pbnRMaWdodFNoYWRvdyB9IGZyb20gJy4vUG9pbnRMaWdodFNoYWRvdy5qcyc7XHJcblxyXG4vKipcclxuICogQSBsaWdodCB0aGF0IGdldHMgZW1pdHRlZCBmcm9tIGEgc2luZ2xlIHBvaW50IGluIGFsbCBkaXJlY3Rpb25zLiBBIGNvbW1vblxyXG4gKiB1c2UgY2FzZSBmb3IgdGhpcyBpcyB0byByZXBsaWNhdGUgdGhlIGxpZ2h0IGVtaXR0ZWQgZnJvbSBhIGJhcmVcclxuICogbGlnaHRidWxiLlxyXG4gKlxyXG4gKiBUaGlzIGxpZ2h0IGNhbiBjYXN0IHNoYWRvd3MgLSBzZWUgdGhlIHtAbGluayBQb2ludExpZ2h0U2hhZG93fSBmb3IgZGV0YWlscy5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgbGlnaHQgPSBuZXcgVEhSRUUuUG9pbnRMaWdodCggMHhmZjAwMDAsIDEsIDEwMCApO1xyXG4gKiBsaWdodC5wb3NpdGlvbi5zZXQoIDUwLCA1MCwgNTAgKTtcclxuICogc2NlbmUuYWRkKCBsaWdodCApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIExpZ2h0XHJcbiAqL1xyXG5jbGFzcyBQb2ludExpZ2h0IGV4dGVuZHMgTGlnaHQge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHBvaW50IGxpZ2h0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHsobnVtYmVyfENvbG9yfHN0cmluZyl9IFtjb2xvcj0weGZmZmZmZl0gLSBUaGUgbGlnaHQncyBjb2xvci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2ludGVuc2l0eT0xXSAtIFRoZSBsaWdodCdzIHN0cmVuZ3RoL2ludGVuc2l0eSBtZWFzdXJlZCBpbiBjYW5kZWxhIChjZCkuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtkaXN0YW5jZT0wXSAtIE1heGltdW0gcmFuZ2Ugb2YgdGhlIGxpZ2h0LiBgMGAgbWVhbnMgbm8gbGltaXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtkZWNheT0yXSAtIFRoZSBhbW91bnQgdGhlIGxpZ2h0IGRpbXMgYWxvbmcgdGhlIGRpc3RhbmNlIG9mIHRoZSBsaWdodC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggY29sb3IsIGludGVuc2l0eSwgZGlzdGFuY2UgPSAwLCBkZWNheSA9IDIgKSB7XHJcblxyXG5cdFx0c3VwZXIoIGNvbG9yLCBpbnRlbnNpdHkgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNQb2ludExpZ2h0ID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnUG9pbnRMaWdodCc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGVuIGRpc3RhbmNlIGlzIHplcm8sIGxpZ2h0IHdpbGwgYXR0ZW51YXRlIGFjY29yZGluZyB0byBpbnZlcnNlLXNxdWFyZVxyXG5cdFx0ICogbGF3IHRvIGluZmluaXRlIGRpc3RhbmNlLiBXaGVuIGRpc3RhbmNlIGlzIG5vbi16ZXJvLCBsaWdodCB3aWxsIGF0dGVudWF0ZVxyXG5cdFx0ICogYWNjb3JkaW5nIHRvIGludmVyc2Utc3F1YXJlIGxhdyB1bnRpbCBuZWFyIHRoZSBkaXN0YW5jZSBjdXRvZmYsIHdoZXJlIGl0XHJcblx0XHQgKiB3aWxsIHRoZW4gYXR0ZW51YXRlIHF1aWNrbHkgYW5kIHNtb290aGx5IHRvIDAuIEluaGVyZW50bHksIGN1dG9mZnMgYXJlIG5vdFxyXG5cdFx0ICogcGh5c2ljYWxseSBjb3JyZWN0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGlzdGFuY2UgPSBkaXN0YW5jZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBhbW91bnQgdGhlIGxpZ2h0IGRpbXMgYWxvbmcgdGhlIGRpc3RhbmNlIG9mIHRoZSBsaWdodC4gSW4gY29udGV4dCBvZlxyXG5cdFx0ICogcGh5c2ljYWxseS1jb3JyZWN0IHJlbmRlcmluZyB0aGUgZGVmYXVsdCB2YWx1ZSBzaG91bGQgbm90IGJlIGNoYW5nZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDJcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kZWNheSA9IGRlY2F5O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBwcm9wZXJ0eSBob2xkcyB0aGUgbGlnaHQncyBzaGFkb3cgY29uZmlndXJhdGlvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7UG9pbnRMaWdodFNoYWRvd31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zaGFkb3cgPSBuZXcgUG9pbnRMaWdodFNoYWRvdygpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBsaWdodCdzIHBvd2VyLiBQb3dlciBpcyB0aGUgbHVtaW5vdXMgcG93ZXIgb2YgdGhlIGxpZ2h0IG1lYXN1cmVkIGluIGx1bWVucyAobG0pLlxyXG5cdCAqIENoYW5naW5nIHRoZSBwb3dlciB3aWxsIGFsc28gY2hhbmdlIHRoZSBsaWdodCdzIGludGVuc2l0eS5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0ICovXHJcblx0Z2V0IHBvd2VyKCkge1xyXG5cclxuXHRcdC8vIGNvbXB1dGUgdGhlIGxpZ2h0J3MgbHVtaW5vdXMgcG93ZXIgKGluIGx1bWVucykgZnJvbSBpdHMgaW50ZW5zaXR5IChpbiBjYW5kZWxhKVxyXG5cdFx0Ly8gZm9yIGFuIGlzb3Ryb3BpYyBsaWdodCBzb3VyY2UsIGx1bWlub3VzIHBvd2VyIChsbSkgPSA0IM+AIGx1bWlub3VzIGludGVuc2l0eSAoY2QpXHJcblx0XHRyZXR1cm4gdGhpcy5pbnRlbnNpdHkgKiA0ICogTWF0aC5QSTtcclxuXHJcblx0fVxyXG5cclxuXHRzZXQgcG93ZXIoIHBvd2VyICkge1xyXG5cclxuXHRcdC8vIHNldCB0aGUgbGlnaHQncyBpbnRlbnNpdHkgKGluIGNhbmRlbGEpIGZyb20gdGhlIGRlc2lyZWQgbHVtaW5vdXMgcG93ZXIgKGluIGx1bWVucylcclxuXHRcdHRoaXMuaW50ZW5zaXR5ID0gcG93ZXIgLyAoIDQgKiBNYXRoLlBJICk7XHJcblxyXG5cdH1cclxuXHJcblx0ZGlzcG9zZSgpIHtcclxuXHJcblx0XHR0aGlzLnNoYWRvdy5kaXNwb3NlKCk7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlLCByZWN1cnNpdmUgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlLCByZWN1cnNpdmUgKTtcclxuXHJcblx0XHR0aGlzLmRpc3RhbmNlID0gc291cmNlLmRpc3RhbmNlO1xyXG5cdFx0dGhpcy5kZWNheSA9IHNvdXJjZS5kZWNheTtcclxuXHJcblx0XHR0aGlzLnNoYWRvdyA9IHNvdXJjZS5zaGFkb3cuY2xvbmUoKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgUG9pbnRMaWdodCB9O1xyXG4iLCJpbXBvcnQgeyBDYW1lcmEgfSBmcm9tICcuL0NhbWVyYS5qcyc7XHJcblxyXG4vKipcclxuICogQ2FtZXJhIHRoYXQgdXNlcyBbb3J0aG9ncmFwaGljIHByb2plY3Rpb25de0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL09ydGhvZ3JhcGhpY19wcm9qZWN0aW9ufS5cclxuICpcclxuICogSW4gdGhpcyBwcm9qZWN0aW9uIG1vZGUsIGFuIG9iamVjdCdzIHNpemUgaW4gdGhlIHJlbmRlcmVkIGltYWdlIHN0YXlzXHJcbiAqIGNvbnN0YW50IHJlZ2FyZGxlc3Mgb2YgaXRzIGRpc3RhbmNlIGZyb20gdGhlIGNhbWVyYS4gVGhpcyBjYW4gYmUgdXNlZnVsXHJcbiAqIGZvciByZW5kZXJpbmcgMkQgc2NlbmVzIGFuZCBVSSBlbGVtZW50cywgYW1vbmdzdCBvdGhlciB0aGluZ3MuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGNhbWVyYSA9IG5ldyBUSFJFRS5PcnRob2dyYXBoaWNDYW1lcmEoIHdpZHRoIC8gLSAyLCB3aWR0aCAvIDIsIGhlaWdodCAvIDIsIGhlaWdodCAvIC0gMiwgMSwgMTAwMCApO1xyXG4gKiBzY2VuZS5hZGQoIGNhbWVyYSApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIENhbWVyYVxyXG4gKi9cclxuY2xhc3MgT3J0aG9ncmFwaGljQ2FtZXJhIGV4dGVuZHMgQ2FtZXJhIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBvcnRob2dyYXBoaWMgY2FtZXJhLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtsZWZ0PS0xXSAtIFRoZSBsZWZ0IHBsYW5lIG9mIHRoZSBjYW1lcmEncyBmcnVzdHVtLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbcmlnaHQ9MV0gLSBUaGUgcmlnaHQgcGxhbmUgb2YgdGhlIGNhbWVyYSdzIGZydXN0dW0uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt0b3A9MV0gLSBUaGUgdG9wIHBsYW5lIG9mIHRoZSBjYW1lcmEncyBmcnVzdHVtLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbYm90dG9tPS0xXSAtIFRoZSBib3R0b20gcGxhbmUgb2YgdGhlIGNhbWVyYSdzIGZydXN0dW0uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuZWFyPTAuMV0gLSBUaGUgY2FtZXJhJ3MgbmVhciBwbGFuZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2Zhcj0yMDAwXSAtIFRoZSBjYW1lcmEncyBmYXIgcGxhbmUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGxlZnQgPSAtIDEsIHJpZ2h0ID0gMSwgdG9wID0gMSwgYm90dG9tID0gLSAxLCBuZWFyID0gMC4xLCBmYXIgPSAyMDAwICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzT3J0aG9ncmFwaGljQ2FtZXJhID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnT3J0aG9ncmFwaGljQ2FtZXJhJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB6b29tIGZhY3RvciBvZiB0aGUgY2FtZXJhLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuem9vbSA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXByZXNlbnRzIHRoZSBmcnVzdHVtIHdpbmRvdyBzcGVjaWZpY2F0aW9uLiBUaGlzIHByb3BlcnR5IHNob3VsZCBub3QgYmUgZWRpdGVkXHJcblx0XHQgKiBkaXJlY3RseSBidXQgdmlhIHtAbGluayBQZXJzcGVjdGl2ZUNhbWVyYSNzZXRWaWV3T2Zmc2V0fSBhbmQge0BsaW5rIFBlcnNwZWN0aXZlQ2FtZXJhI2NsZWFyVmlld09mZnNldH0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9PYmplY3R9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudmlldyA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbGVmdCBwbGFuZSBvZiB0aGUgY2FtZXJhJ3MgZnJ1c3R1bS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgLTFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5sZWZ0ID0gbGVmdDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByaWdodCBwbGFuZSBvZiB0aGUgY2FtZXJhJ3MgZnJ1c3R1bS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJpZ2h0ID0gcmlnaHQ7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdG9wIHBsYW5lIG9mIHRoZSBjYW1lcmEncyBmcnVzdHVtLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudG9wID0gdG9wO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGJvdHRvbSBwbGFuZSBvZiB0aGUgY2FtZXJhJ3MgZnJ1c3R1bS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgLTFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ib3R0b20gPSBib3R0b207XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY2FtZXJhJ3MgbmVhciBwbGFuZS4gVGhlIHZhbGlkIHJhbmdlIGlzIGdyZWF0ZXIgdGhhbiBgMGBcclxuXHRcdCAqIGFuZCBsZXNzIHRoYW4gdGhlIGN1cnJlbnQgdmFsdWUgb2Yge0BsaW5rIE9ydGhvZ3JhcGhpY0NhbWVyYSNmYXJ9LlxyXG5cdFx0ICpcclxuXHRcdCAqIE5vdGUgdGhhdCwgdW5saWtlIGZvciB0aGUge0BsaW5rIFBlcnNwZWN0aXZlQ2FtZXJhfSwgYDBgIGlzIGFcclxuXHRcdCAqIHZhbGlkIHZhbHVlIGZvciBhbiBvcnRob2dyYXBoaWMgY2FtZXJhJ3MgbmVhciBwbGFuZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMC4xXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubmVhciA9IG5lYXI7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY2FtZXJhJ3MgZmFyIHBsYW5lLiBNdXN0IGJlIGdyZWF0ZXIgdGhhbiB0aGVcclxuXHRcdCAqIGN1cnJlbnQgdmFsdWUgb2Yge0BsaW5rIE9ydGhvZ3JhcGhpY0NhbWVyYSNuZWFyfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMjAwMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZhciA9IGZhcjtcclxuXHJcblx0XHR0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UsIHJlY3Vyc2l2ZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UsIHJlY3Vyc2l2ZSApO1xyXG5cclxuXHRcdHRoaXMubGVmdCA9IHNvdXJjZS5sZWZ0O1xyXG5cdFx0dGhpcy5yaWdodCA9IHNvdXJjZS5yaWdodDtcclxuXHRcdHRoaXMudG9wID0gc291cmNlLnRvcDtcclxuXHRcdHRoaXMuYm90dG9tID0gc291cmNlLmJvdHRvbTtcclxuXHRcdHRoaXMubmVhciA9IHNvdXJjZS5uZWFyO1xyXG5cdFx0dGhpcy5mYXIgPSBzb3VyY2UuZmFyO1xyXG5cclxuXHRcdHRoaXMuem9vbSA9IHNvdXJjZS56b29tO1xyXG5cdFx0dGhpcy52aWV3ID0gc291cmNlLnZpZXcgPT09IG51bGwgPyBudWxsIDogT2JqZWN0LmFzc2lnbigge30sIHNvdXJjZS52aWV3ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyBhbiBvZmZzZXQgaW4gYSBsYXJnZXIgZnJ1c3R1bS4gVGhpcyBpcyB1c2VmdWwgZm9yIG11bHRpLXdpbmRvdyBvclxyXG5cdCAqIG11bHRpLW1vbml0b3IvbXVsdGktbWFjaGluZSBzZXR1cHMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZnVsbFdpZHRoIC0gVGhlIGZ1bGwgd2lkdGggb2YgbXVsdGl2aWV3IHNldHVwLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBmdWxsSGVpZ2h0IC0gVGhlIGZ1bGwgaGVpZ2h0IG9mIG11bHRpdmlldyBzZXR1cC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSBob3Jpem9udGFsIG9mZnNldCBvZiB0aGUgc3ViY2FtZXJhLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHZlcnRpY2FsIG9mZnNldCBvZiB0aGUgc3ViY2FtZXJhLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiBzdWJjYW1lcmEuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2Ygc3ViY2FtZXJhLlxyXG5cdCAqIEBzZWUge0BsaW5rIFBlcnNwZWN0aXZlQ2FtZXJhI3NldFZpZXdPZmZzZXR9XHJcblx0ICovXHJcblx0c2V0Vmlld09mZnNldCggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICkge1xyXG5cclxuXHRcdGlmICggdGhpcy52aWV3ID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy52aWV3ID0ge1xyXG5cdFx0XHRcdGVuYWJsZWQ6IHRydWUsXHJcblx0XHRcdFx0ZnVsbFdpZHRoOiAxLFxyXG5cdFx0XHRcdGZ1bGxIZWlnaHQ6IDEsXHJcblx0XHRcdFx0b2Zmc2V0WDogMCxcclxuXHRcdFx0XHRvZmZzZXRZOiAwLFxyXG5cdFx0XHRcdHdpZHRoOiAxLFxyXG5cdFx0XHRcdGhlaWdodDogMVxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnZpZXcuZW5hYmxlZCA9IHRydWU7XHJcblx0XHR0aGlzLnZpZXcuZnVsbFdpZHRoID0gZnVsbFdpZHRoO1xyXG5cdFx0dGhpcy52aWV3LmZ1bGxIZWlnaHQgPSBmdWxsSGVpZ2h0O1xyXG5cdFx0dGhpcy52aWV3Lm9mZnNldFggPSB4O1xyXG5cdFx0dGhpcy52aWV3Lm9mZnNldFkgPSB5O1xyXG5cdFx0dGhpcy52aWV3LndpZHRoID0gd2lkdGg7XHJcblx0XHR0aGlzLnZpZXcuaGVpZ2h0ID0gaGVpZ2h0O1xyXG5cclxuXHRcdHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbW92ZXMgdGhlIHZpZXcgb2Zmc2V0IGZyb20gdGhlIHByb2plY3Rpb24gbWF0cml4LlxyXG5cdCAqL1xyXG5cdGNsZWFyVmlld09mZnNldCgpIHtcclxuXHJcblx0XHRpZiAoIHRoaXMudmlldyAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMudmlldy5lbmFibGVkID0gZmFsc2U7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIGNhbWVyYSdzIHByb2plY3Rpb24gbWF0cml4LiBNdXN0IGJlIGNhbGxlZCBhZnRlciBhbnkgY2hhbmdlIG9mXHJcblx0ICogY2FtZXJhIHByb3BlcnRpZXMuXHJcblx0ICovXHJcblx0dXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpIHtcclxuXHJcblx0XHRjb25zdCBkeCA9ICggdGhpcy5yaWdodCAtIHRoaXMubGVmdCApIC8gKCAyICogdGhpcy56b29tICk7XHJcblx0XHRjb25zdCBkeSA9ICggdGhpcy50b3AgLSB0aGlzLmJvdHRvbSApIC8gKCAyICogdGhpcy56b29tICk7XHJcblx0XHRjb25zdCBjeCA9ICggdGhpcy5yaWdodCArIHRoaXMubGVmdCApIC8gMjtcclxuXHRcdGNvbnN0IGN5ID0gKCB0aGlzLnRvcCArIHRoaXMuYm90dG9tICkgLyAyO1xyXG5cclxuXHRcdGxldCBsZWZ0ID0gY3ggLSBkeDtcclxuXHRcdGxldCByaWdodCA9IGN4ICsgZHg7XHJcblx0XHRsZXQgdG9wID0gY3kgKyBkeTtcclxuXHRcdGxldCBib3R0b20gPSBjeSAtIGR5O1xyXG5cclxuXHRcdGlmICggdGhpcy52aWV3ICE9PSBudWxsICYmIHRoaXMudmlldy5lbmFibGVkICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgc2NhbGVXID0gKCB0aGlzLnJpZ2h0IC0gdGhpcy5sZWZ0ICkgLyB0aGlzLnZpZXcuZnVsbFdpZHRoIC8gdGhpcy56b29tO1xyXG5cdFx0XHRjb25zdCBzY2FsZUggPSAoIHRoaXMudG9wIC0gdGhpcy5ib3R0b20gKSAvIHRoaXMudmlldy5mdWxsSGVpZ2h0IC8gdGhpcy56b29tO1xyXG5cclxuXHRcdFx0bGVmdCArPSBzY2FsZVcgKiB0aGlzLnZpZXcub2Zmc2V0WDtcclxuXHRcdFx0cmlnaHQgPSBsZWZ0ICsgc2NhbGVXICogdGhpcy52aWV3LndpZHRoO1xyXG5cdFx0XHR0b3AgLT0gc2NhbGVIICogdGhpcy52aWV3Lm9mZnNldFk7XHJcblx0XHRcdGJvdHRvbSA9IHRvcCAtIHNjYWxlSCAqIHRoaXMudmlldy5oZWlnaHQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMucHJvamVjdGlvbk1hdHJpeC5tYWtlT3J0aG9ncmFwaGljKCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIHRoaXMubmVhciwgdGhpcy5mYXIsIHRoaXMuY29vcmRpbmF0ZVN5c3RlbSApO1xyXG5cclxuXHRcdHRoaXMucHJvamVjdGlvbk1hdHJpeEludmVyc2UuY29weSggdGhpcy5wcm9qZWN0aW9uTWF0cml4ICkuaW52ZXJ0KCk7XHJcblxyXG5cdH1cclxuXHJcblx0dG9KU09OKCBtZXRhICkge1xyXG5cclxuXHRcdGNvbnN0IGRhdGEgPSBzdXBlci50b0pTT04oIG1ldGEgKTtcclxuXHJcblx0XHRkYXRhLm9iamVjdC56b29tID0gdGhpcy56b29tO1xyXG5cdFx0ZGF0YS5vYmplY3QubGVmdCA9IHRoaXMubGVmdDtcclxuXHRcdGRhdGEub2JqZWN0LnJpZ2h0ID0gdGhpcy5yaWdodDtcclxuXHRcdGRhdGEub2JqZWN0LnRvcCA9IHRoaXMudG9wO1xyXG5cdFx0ZGF0YS5vYmplY3QuYm90dG9tID0gdGhpcy5ib3R0b207XHJcblx0XHRkYXRhLm9iamVjdC5uZWFyID0gdGhpcy5uZWFyO1xyXG5cdFx0ZGF0YS5vYmplY3QuZmFyID0gdGhpcy5mYXI7XHJcblxyXG5cdFx0aWYgKCB0aGlzLnZpZXcgIT09IG51bGwgKSBkYXRhLm9iamVjdC52aWV3ID0gT2JqZWN0LmFzc2lnbigge30sIHRoaXMudmlldyApO1xyXG5cclxuXHRcdHJldHVybiBkYXRhO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBPcnRob2dyYXBoaWNDYW1lcmEgfTtcclxuIiwiaW1wb3J0IHsgTGlnaHRTaGFkb3cgfSBmcm9tICcuL0xpZ2h0U2hhZG93LmpzJztcclxuaW1wb3J0IHsgT3J0aG9ncmFwaGljQ2FtZXJhIH0gZnJvbSAnLi4vY2FtZXJhcy9PcnRob2dyYXBoaWNDYW1lcmEuanMnO1xyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgdGhlIHNoYWRvdyBjb25maWd1cmF0aW9uIG9mIGRpcmVjdGlvbmFsIGxpZ2h0cy5cclxuICpcclxuICogQGF1Z21lbnRzIExpZ2h0U2hhZG93XHJcbiAqL1xyXG5jbGFzcyBEaXJlY3Rpb25hbExpZ2h0U2hhZG93IGV4dGVuZHMgTGlnaHRTaGFkb3cge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGRpcmVjdGlvbmFsIGxpZ2h0IHNoYWRvdy5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHJcblx0XHRzdXBlciggbmV3IE9ydGhvZ3JhcGhpY0NhbWVyYSggLSA1LCA1LCA1LCAtIDUsIDAuNSwgNTAwICkgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNEaXJlY3Rpb25hbExpZ2h0U2hhZG93ID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgRGlyZWN0aW9uYWxMaWdodFNoYWRvdyB9O1xyXG4iLCJpbXBvcnQgeyBMaWdodCB9IGZyb20gJy4vTGlnaHQuanMnO1xyXG5pbXBvcnQgeyBEaXJlY3Rpb25hbExpZ2h0U2hhZG93IH0gZnJvbSAnLi9EaXJlY3Rpb25hbExpZ2h0U2hhZG93LmpzJztcclxuaW1wb3J0IHsgT2JqZWN0M0QgfSBmcm9tICcuLi9jb3JlL09iamVjdDNELmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIGxpZ2h0IHRoYXQgZ2V0cyBlbWl0dGVkIGluIGEgc3BlY2lmaWMgZGlyZWN0aW9uLiBUaGlzIGxpZ2h0IHdpbGwgYmVoYXZlXHJcbiAqIGFzIHRob3VnaCBpdCBpcyBpbmZpbml0ZWx5IGZhciBhd2F5IGFuZCB0aGUgcmF5cyBwcm9kdWNlZCBmcm9tIGl0IGFyZSBhbGxcclxuICogcGFyYWxsZWwuIFRoZSBjb21tb24gdXNlIGNhc2UgZm9yIHRoaXMgaXMgdG8gc2ltdWxhdGUgZGF5bGlnaHQ7IHRoZSBzdW4gaXNcclxuICogZmFyIGVub3VnaCBhd2F5IHRoYXQgaXRzIHBvc2l0aW9uIGNhbiBiZSBjb25zaWRlcmVkIHRvIGJlIGluZmluaXRlLCBhbmRcclxuICogYWxsIGxpZ2h0IHJheXMgY29taW5nIGZyb20gaXQgYXJlIHBhcmFsbGVsLlxyXG4gKlxyXG4gKiBBIGNvbW1vbiBwb2ludCBvZiBjb25mdXNpb24gZm9yIGRpcmVjdGlvbmFsIGxpZ2h0cyBpcyB0aGF0IHNldHRpbmcgdGhlXHJcbiAqIHJvdGF0aW9uIGhhcyBubyBlZmZlY3QuIFRoaXMgaXMgYmVjYXVzZSB0aHJlZS5qcydzIERpcmVjdGlvbmFsTGlnaHQgaXMgdGhlXHJcbiAqIGVxdWl2YWxlbnQgdG8gd2hhdCBpcyBvZnRlbiBjYWxsZWQgYSAnVGFyZ2V0IERpcmVjdCBMaWdodCcgaW4gb3RoZXJcclxuICogYXBwbGljYXRpb25zLlxyXG4gKlxyXG4gKiBUaGlzIG1lYW5zIHRoYXQgaXRzIGRpcmVjdGlvbiBpcyBjYWxjdWxhdGVkIGFzIHBvaW50aW5nIGZyb20gdGhlIGxpZ2h0J3NcclxuICoge0BsaW5rIE9iamVjdDNEI3Bvc2l0aW9ufSB0byB0aGUge0BsaW5rIERpcmVjdGlvbmFsTGlnaHQjdGFyZ2V0fSBwb3NpdGlvblxyXG4gKiAoYXMgb3Bwb3NlZCB0byBhICdGcmVlIERpcmVjdCBMaWdodCcgdGhhdCBqdXN0IGhhcyBhIHJvdGF0aW9uXHJcbiAqIGNvbXBvbmVudCkuXHJcbiAqXHJcbiAqIFRoaXMgbGlnaHQgY2FuIGNhc3Qgc2hhZG93cyAtIHNlZSB0aGUge0BsaW5rIERpcmVjdGlvbmFsTGlnaHRTaGFkb3d9IGZvciBkZXRhaWxzLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiAvLyBXaGl0ZSBkaXJlY3Rpb25hbCBsaWdodCBhdCBoYWxmIGludGVuc2l0eSBzaGluaW5nIGZyb20gdGhlIHRvcC5cclxuICogY29uc3QgZGlyZWN0aW9uYWxMaWdodCA9IG5ldyBUSFJFRS5EaXJlY3Rpb25hbExpZ2h0KCAweGZmZmZmZiwgMC41ICk7XHJcbiAqIHNjZW5lLmFkZCggZGlyZWN0aW9uYWxMaWdodCApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIExpZ2h0XHJcbiAqL1xyXG5jbGFzcyBEaXJlY3Rpb25hbExpZ2h0IGV4dGVuZHMgTGlnaHQge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGRpcmVjdGlvbmFsIGxpZ2h0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHsobnVtYmVyfENvbG9yfHN0cmluZyl9IFtjb2xvcj0weGZmZmZmZl0gLSBUaGUgbGlnaHQncyBjb2xvci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2ludGVuc2l0eT0xXSAtIFRoZSBsaWdodCdzIHN0cmVuZ3RoL2ludGVuc2l0eS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggY29sb3IsIGludGVuc2l0eSApIHtcclxuXHJcblx0XHRzdXBlciggY29sb3IsIGludGVuc2l0eSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0RpcmVjdGlvbmFsTGlnaHQgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdEaXJlY3Rpb25hbExpZ2h0JztcclxuXHJcblx0XHR0aGlzLnBvc2l0aW9uLmNvcHkoIE9iamVjdDNELkRFRkFVTFRfVVAgKTtcclxuXHRcdHRoaXMudXBkYXRlTWF0cml4KCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZGlyZWN0aW9uYWwgbGlnaHQgcG9pbnRzIGZyb20gaXRzIHBvc2l0aW9uIHRvIHRoZVxyXG5cdFx0ICogdGFyZ2V0J3MgcG9zaXRpb24uXHJcblx0XHQgKlxyXG5cdFx0ICogRm9yIHRoZSB0YXJnZXQncyBwb3NpdGlvbiB0byBiZSBjaGFuZ2VkIHRvIGFueXRoaW5nIG90aGVyXHJcblx0XHQgKiB0aGFuIHRoZSBkZWZhdWx0LCBpdCBtdXN0IGJlIGFkZGVkIHRvIHRoZSBzY2VuZS5cclxuXHRcdCAqXHJcblx0XHQgKiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHNldCB0aGUgdGFyZ2V0IHRvIGJlIGFub3RoZXIgM0Qgb2JqZWN0XHJcblx0XHQgKiBpbiB0aGUgc2NlbmUuIFRoZSBsaWdodCB3aWxsIG5vdyB0cmFjayB0aGUgdGFyZ2V0IG9iamVjdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0M0R9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudGFyZ2V0ID0gbmV3IE9iamVjdDNEKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIHByb3BlcnR5IGhvbGRzIHRoZSBsaWdodCdzIHNoYWRvdyBjb25maWd1cmF0aW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtEaXJlY3Rpb25hbExpZ2h0U2hhZG93fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNoYWRvdyA9IG5ldyBEaXJlY3Rpb25hbExpZ2h0U2hhZG93KCk7XHJcblxyXG5cdH1cclxuXHJcblx0ZGlzcG9zZSgpIHtcclxuXHJcblx0XHR0aGlzLnNoYWRvdy5kaXNwb3NlKCk7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMudGFyZ2V0ID0gc291cmNlLnRhcmdldC5jbG9uZSgpO1xyXG5cdFx0dGhpcy5zaGFkb3cgPSBzb3VyY2Uuc2hhZG93LmNsb25lKCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IERpcmVjdGlvbmFsTGlnaHQgfTtcclxuIiwiaW1wb3J0IHsgTGlnaHQgfSBmcm9tICcuL0xpZ2h0LmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGxpZ2h0IGdsb2JhbGx5IGlsbHVtaW5hdGVzIGFsbCBvYmplY3RzIGluIHRoZSBzY2VuZSBlcXVhbGx5LlxyXG4gKlxyXG4gKiBJdCBjYW5ub3QgYmUgdXNlZCB0byBjYXN0IHNoYWRvd3MgYXMgaXQgZG9lcyBub3QgaGF2ZSBhIGRpcmVjdGlvbi5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgbGlnaHQgPSBuZXcgVEhSRUUuQW1iaWVudExpZ2h0KCAweDQwNDA0MCApOyAvLyBzb2Z0IHdoaXRlIGxpZ2h0XHJcbiAqIHNjZW5lLmFkZCggbGlnaHQgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBMaWdodFxyXG4gKi9cclxuY2xhc3MgQW1iaWVudExpZ2h0IGV4dGVuZHMgTGlnaHQge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGFtYmllbnQgbGlnaHQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geyhudW1iZXJ8Q29sb3J8c3RyaW5nKX0gW2NvbG9yPTB4ZmZmZmZmXSAtIFRoZSBsaWdodCdzIGNvbG9yLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbaW50ZW5zaXR5PTFdIC0gVGhlIGxpZ2h0J3Mgc3RyZW5ndGgvaW50ZW5zaXR5LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBjb2xvciwgaW50ZW5zaXR5ICkge1xyXG5cclxuXHRcdHN1cGVyKCBjb2xvciwgaW50ZW5zaXR5ICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzQW1iaWVudExpZ2h0ID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnQW1iaWVudExpZ2h0JztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgQW1iaWVudExpZ2h0IH07XHJcbiIsImltcG9ydCB7IExpZ2h0IH0gZnJvbSAnLi9MaWdodC5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBjbGFzcyBlbWl0cyBsaWdodCB1bmlmb3JtbHkgYWNyb3NzIHRoZSBmYWNlIGEgcmVjdGFuZ3VsYXIgcGxhbmUuXHJcbiAqIFRoaXMgbGlnaHQgdHlwZSBjYW4gYmUgdXNlZCB0byBzaW11bGF0ZSBsaWdodCBzb3VyY2VzIHN1Y2ggYXMgYnJpZ2h0XHJcbiAqIHdpbmRvd3Mgb3Igc3RyaXAgbGlnaHRpbmcuXHJcbiAqXHJcbiAqIEltcG9ydGFudCBOb3RlczpcclxuICpcclxuICogLSBUaGVyZSBpcyBubyBzaGFkb3cgc3VwcG9ydC5cclxuICogLSBPbmx5IFBCUiBtYXRlcmlhbHMgYXJlIHN1cHBvcnRlZC5cclxuICogLSBZb3UgaGF2ZSB0byBpbmNsdWRlIGBSZWN0QXJlYUxpZ2h0VW5pZm9ybXNMaWJgIChgV2ViR0xSZW5kZXJlcmApIG9yIGBSZWN0QXJlYUxpZ2h0VGV4dHVyZXNMaWJgIChgV2ViR1BVUmVuZGVyZXJgKVxyXG4gKiBpbnRvIHlvdXIgYXBwIGFuZCBpbml0IHRoZSB1bmlmb3Jtcy90ZXh0dXJlcy5cclxuICpcclxuICogYGBganNcclxuICogUmVjdEFyZWFMaWdodFVuaWZvcm1zTGliLmluaXQoKTsgLy8gb25seSByZWxldmFudCBmb3IgV2ViR0xSZW5kZXJlclxyXG4gKiBUSFJFRS5SZWN0QXJlYUxpZ2h0Tm9kZS5zZXRMVEMoIFJlY3RBcmVhTGlnaHRUZXh0dXJlc0xpYi5pbml0KCkgKTsgLy8gIG9ubHkgcmVsZXZhbnQgZm9yIFdlYkdQVVJlbmRlcmVyXHJcbiAqXHJcbiAqIGNvbnN0IGludGVuc2l0eSA9IDE7IGNvbnN0IHdpZHRoID0gMTA7IGNvbnN0IGhlaWdodCA9IDEwO1xyXG4gKiBjb25zdCByZWN0TGlnaHQgPSBuZXcgVEhSRUUuUmVjdEFyZWFMaWdodCggMHhmZmZmZmYsIGludGVuc2l0eSwgd2lkdGgsIGhlaWdodCApO1xyXG4gKiByZWN0TGlnaHQucG9zaXRpb24uc2V0KCA1LCA1LCAwICk7XHJcbiAqIHJlY3RMaWdodC5sb29rQXQoIDAsIDAsIDAgKTtcclxuICogc2NlbmUuYWRkKCByZWN0TGlnaHQgKVxyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIExpZ2h0XHJcbiAqL1xyXG5jbGFzcyBSZWN0QXJlYUxpZ2h0IGV4dGVuZHMgTGlnaHQge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGFyZWEgbGlnaHQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geyhudW1iZXJ8Q29sb3J8c3RyaW5nKX0gW2NvbG9yPTB4ZmZmZmZmXSAtIFRoZSBsaWdodCdzIGNvbG9yLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbaW50ZW5zaXR5PTFdIC0gVGhlIGxpZ2h0J3Mgc3RyZW5ndGgvaW50ZW5zaXR5LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbd2lkdGg9MTBdIC0gVGhlIHdpZHRoIG9mIHRoZSBsaWdodC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2hlaWdodD0xMF0gLSBUaGUgaGVpZ2h0IG9mIHRoZSBsaWdodC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggY29sb3IsIGludGVuc2l0eSwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gMTAgKSB7XHJcblxyXG5cdFx0c3VwZXIoIGNvbG9yLCBpbnRlbnNpdHkgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNSZWN0QXJlYUxpZ2h0ID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnUmVjdEFyZWFMaWdodCc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgd2lkdGggb2YgdGhlIGxpZ2h0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLndpZHRoID0gd2lkdGg7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgaGVpZ2h0IG9mIHRoZSBsaWdodC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMTBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5oZWlnaHQgPSBoZWlnaHQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGxpZ2h0J3MgcG93ZXIuIFBvd2VyIGlzIHRoZSBsdW1pbm91cyBwb3dlciBvZiB0aGUgbGlnaHQgbWVhc3VyZWQgaW4gbHVtZW5zIChsbSkuXHJcblx0ICogQ2hhbmdpbmcgdGhlIHBvd2VyIHdpbGwgYWxzbyBjaGFuZ2UgdGhlIGxpZ2h0J3MgaW50ZW5zaXR5LlxyXG5cdCAqXHJcblx0ICogQHR5cGUge251bWJlcn1cclxuXHQgKi9cclxuXHRnZXQgcG93ZXIoKSB7XHJcblxyXG5cdFx0Ly8gY29tcHV0ZSB0aGUgbGlnaHQncyBsdW1pbm91cyBwb3dlciAoaW4gbHVtZW5zKSBmcm9tIGl0cyBpbnRlbnNpdHkgKGluIG5pdHMpXHJcblx0XHRyZXR1cm4gdGhpcy5pbnRlbnNpdHkgKiB0aGlzLndpZHRoICogdGhpcy5oZWlnaHQgKiBNYXRoLlBJO1xyXG5cclxuXHR9XHJcblxyXG5cdHNldCBwb3dlciggcG93ZXIgKSB7XHJcblxyXG5cdFx0Ly8gc2V0IHRoZSBsaWdodCdzIGludGVuc2l0eSAoaW4gbml0cykgZnJvbSB0aGUgZGVzaXJlZCBsdW1pbm91cyBwb3dlciAoaW4gbHVtZW5zKVxyXG5cdFx0dGhpcy5pbnRlbnNpdHkgPSBwb3dlciAvICggdGhpcy53aWR0aCAqIHRoaXMuaGVpZ2h0ICogTWF0aC5QSSApO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0XHR0aGlzLndpZHRoID0gc291cmNlLndpZHRoO1xyXG5cdFx0dGhpcy5oZWlnaHQgPSBzb3VyY2UuaGVpZ2h0O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdHRvSlNPTiggbWV0YSApIHtcclxuXHJcblx0XHRjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCBtZXRhICk7XHJcblxyXG5cdFx0ZGF0YS5vYmplY3Qud2lkdGggPSB0aGlzLndpZHRoO1xyXG5cdFx0ZGF0YS5vYmplY3QuaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7XHJcblxyXG5cdFx0cmV0dXJuIGRhdGE7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFJlY3RBcmVhTGlnaHQgfTtcclxuIiwiaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4vVmVjdG9yMy5qcyc7XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyBhIHRoaXJkLW9yZGVyIHNwaGVyaWNhbCBoYXJtb25pY3MgKFNIKS4gTGlnaHQgcHJvYmVzIHVzZSB0aGlzIGNsYXNzXHJcbiAqIHRvIGVuY29kZSBsaWdodGluZyBpbmZvcm1hdGlvbi5cclxuICpcclxuICogLSBQcmltYXJ5IHJlZmVyZW5jZToge0BsaW5rIGh0dHBzOi8vZ3JhcGhpY3Muc3RhbmZvcmQuZWR1L3BhcGVycy9lbnZtYXAvZW52bWFwLnBkZn1cclxuICogLSBTZWNvbmRhcnkgcmVmZXJlbmNlOiB7QGxpbmsgaHR0cHM6Ly93d3cucHBzbG9hbi5vcmcvcHVibGljYXRpb25zL1N0dXBpZFNIMzYucGRmfVxyXG4gKi9cclxuY2xhc3MgU3BoZXJpY2FsSGFybW9uaWNzMyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc3BoZXJpY2FsIGhhcm1vbmljcy5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNTcGhlcmljYWxIYXJtb25pY3MzID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIGFycmF5IGhvbGRpbmcgdGhlICg5KSBTSCBjb2VmZmljaWVudHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PFZlY3RvcjM+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvZWZmaWNpZW50cyA9IFtdO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDk7IGkgKysgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmNvZWZmaWNpZW50cy5wdXNoKCBuZXcgVmVjdG9yMygpICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGdpdmVuIFNIIGNvZWZmaWNpZW50cyB0byB0aGlzIGluc3RhbmNlIGJ5IGNvcHlpbmdcclxuXHQgKiB0aGUgdmFsdWVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxWZWN0b3IzPn0gY29lZmZpY2llbnRzIC0gVGhlIFNIIGNvZWZmaWNpZW50cy5cclxuXHQgKiBAcmV0dXJuIHtTcGhlcmljYWxIYXJtb25pY3MzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHNwaGVyaWNhbCBoYXJtb25pY3MuXHJcblx0ICovXHJcblx0c2V0KCBjb2VmZmljaWVudHMgKSB7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgOTsgaSArKyApIHtcclxuXHJcblx0XHRcdHRoaXMuY29lZmZpY2llbnRzWyBpIF0uY29weSggY29lZmZpY2llbnRzWyBpIF0gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyBhbGwgU0ggY29lZmZpY2llbnRzIHRvIGAwYC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1NwaGVyaWNhbEhhcm1vbmljczN9IEEgcmVmZXJlbmNlIHRvIHRoaXMgc3BoZXJpY2FsIGhhcm1vbmljcy5cclxuXHQgKi9cclxuXHR6ZXJvKCkge1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDk7IGkgKysgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmNvZWZmaWNpZW50c1sgaSBdLnNldCggMCwgMCwgMCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSByYWRpYW5jZSBpbiB0aGUgZGlyZWN0aW9uIG9mIHRoZSBnaXZlbiBub3JtYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IG5vcm1hbCAtIFRoZSBub3JtYWwgdmVjdG9yIChhc3N1bWVkIHRvIGJlIHVuaXQgbGVuZ3RoKVxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdGFyZ2V0IC0gVGhlIHRhcmdldCB2ZWN0b3IgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBtZXRob2QncyByZXN1bHQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gVGhlIHJhZGlhbmNlLlxyXG5cdCAqL1xyXG5cdGdldEF0KCBub3JtYWwsIHRhcmdldCApIHtcclxuXHJcblx0XHQvLyBub3JtYWwgaXMgYXNzdW1lZCB0byBiZSB1bml0IGxlbmd0aFxyXG5cclxuXHRcdGNvbnN0IHggPSBub3JtYWwueCwgeSA9IG5vcm1hbC55LCB6ID0gbm9ybWFsLno7XHJcblxyXG5cdFx0Y29uc3QgY29lZmYgPSB0aGlzLmNvZWZmaWNpZW50cztcclxuXHJcblx0XHQvLyBiYW5kIDBcclxuXHRcdHRhcmdldC5jb3B5KCBjb2VmZlsgMCBdICkubXVsdGlwbHlTY2FsYXIoIDAuMjgyMDk1ICk7XHJcblxyXG5cdFx0Ly8gYmFuZCAxXHJcblx0XHR0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKCBjb2VmZlsgMSBdLCAwLjQ4ODYwMyAqIHkgKTtcclxuXHRcdHRhcmdldC5hZGRTY2FsZWRWZWN0b3IoIGNvZWZmWyAyIF0sIDAuNDg4NjAzICogeiApO1xyXG5cdFx0dGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggY29lZmZbIDMgXSwgMC40ODg2MDMgKiB4ICk7XHJcblxyXG5cdFx0Ly8gYmFuZCAyXHJcblx0XHR0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKCBjb2VmZlsgNCBdLCAxLjA5MjU0OCAqICggeCAqIHkgKSApO1xyXG5cdFx0dGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggY29lZmZbIDUgXSwgMS4wOTI1NDggKiAoIHkgKiB6ICkgKTtcclxuXHRcdHRhcmdldC5hZGRTY2FsZWRWZWN0b3IoIGNvZWZmWyA2IF0sIDAuMzE1MzkyICogKCAzLjAgKiB6ICogeiAtIDEuMCApICk7XHJcblx0XHR0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKCBjb2VmZlsgNyBdLCAxLjA5MjU0OCAqICggeCAqIHogKSApO1xyXG5cdFx0dGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggY29lZmZbIDggXSwgMC41NDYyNzQgKiAoIHggKiB4IC0geSAqIHkgKSApO1xyXG5cclxuXHRcdHJldHVybiB0YXJnZXQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgaXJyYWRpYW5jZSAocmFkaWFuY2UgY29udm9sdmVkIHdpdGggY29zaW5lIGxvYmUpIGluIHRoZVxyXG5cdCAqIGRpcmVjdGlvbiBvZiB0aGUgZ2l2ZW4gbm9ybWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBub3JtYWwgLSBUaGUgbm9ybWFsIHZlY3RvciAoYXNzdW1lZCB0byBiZSB1bml0IGxlbmd0aClcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHRhcmdldCAtIFRoZSB0YXJnZXQgdmVjdG9yIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbWV0aG9kJ3MgcmVzdWx0LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IFRoZSBpcnJhZGlhbmNlLlxyXG5cdCAqL1xyXG5cdGdldElycmFkaWFuY2VBdCggbm9ybWFsLCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0Ly8gbm9ybWFsIGlzIGFzc3VtZWQgdG8gYmUgdW5pdCBsZW5ndGhcclxuXHJcblx0XHRjb25zdCB4ID0gbm9ybWFsLngsIHkgPSBub3JtYWwueSwgeiA9IG5vcm1hbC56O1xyXG5cclxuXHRcdGNvbnN0IGNvZWZmID0gdGhpcy5jb2VmZmljaWVudHM7XHJcblxyXG5cdFx0Ly8gYmFuZCAwXHJcblx0XHR0YXJnZXQuY29weSggY29lZmZbIDAgXSApLm11bHRpcGx5U2NhbGFyKCAwLjg4NjIyNyApOyAvLyDPgCAqIDAuMjgyMDk1XHJcblxyXG5cdFx0Ly8gYmFuZCAxXHJcblx0XHR0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKCBjb2VmZlsgMSBdLCAyLjAgKiAwLjUxMTY2NCAqIHkgKTsgLy8gKCAyICogz4AgLyAzICkgKiAwLjQ4ODYwM1xyXG5cdFx0dGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggY29lZmZbIDIgXSwgMi4wICogMC41MTE2NjQgKiB6ICk7XHJcblx0XHR0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKCBjb2VmZlsgMyBdLCAyLjAgKiAwLjUxMTY2NCAqIHggKTtcclxuXHJcblx0XHQvLyBiYW5kIDJcclxuXHRcdHRhcmdldC5hZGRTY2FsZWRWZWN0b3IoIGNvZWZmWyA0IF0sIDIuMCAqIDAuNDI5MDQzICogeCAqIHkgKTsgLy8gKCDPgCAvIDQgKSAqIDEuMDkyNTQ4XHJcblx0XHR0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKCBjb2VmZlsgNSBdLCAyLjAgKiAwLjQyOTA0MyAqIHkgKiB6ICk7XHJcblx0XHR0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKCBjb2VmZlsgNiBdLCAwLjc0MzEyNSAqIHogKiB6IC0gMC4yNDc3MDggKTsgLy8gKCDPgCAvIDQgKSAqIDAuMzE1MzkyICogM1xyXG5cdFx0dGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggY29lZmZbIDcgXSwgMi4wICogMC40MjkwNDMgKiB4ICogeiApO1xyXG5cdFx0dGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggY29lZmZbIDggXSwgMC40MjkwNDMgKiAoIHggKiB4IC0geSAqIHkgKSApOyAvLyAoIM+AIC8gNCApICogMC41NDYyNzRcclxuXHJcblx0XHRyZXR1cm4gdGFyZ2V0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgdGhlIGdpdmVuIFNIIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1NwaGVyaWNhbEhhcm1vbmljczN9IHNoIC0gVGhlIFNIIHRvIGFkZC5cclxuXHQgKiBAcmV0dXJuIHtTcGhlcmljYWxIYXJtb25pY3MzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHNwaGVyaWNhbCBoYXJtb25pY3MuXHJcblx0ICovXHJcblx0YWRkKCBzaCApIHtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCA5OyBpICsrICkge1xyXG5cclxuXHRcdFx0dGhpcy5jb2VmZmljaWVudHNbIGkgXS5hZGQoIHNoLmNvZWZmaWNpZW50c1sgaSBdICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEEgY29udmVuaWVuY2UgbWV0aG9kIGZvciBwZXJmb3JtaW5nIHtAbGluayBTcGhlcmljYWxIYXJtb25pY3MzI2FkZH0gYW5kXHJcblx0ICoge0BsaW5rIFNwaGVyaWNhbEhhcm1vbmljczMjc2NhbGV9IGF0IG9uY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1NwaGVyaWNhbEhhcm1vbmljczN9IHNoIC0gVGhlIFNIIHRvIGFkZC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gcyAtIFRoZSBzY2FsZSBmYWN0b3IuXHJcblx0ICogQHJldHVybiB7U3BoZXJpY2FsSGFybW9uaWNzM30gQSByZWZlcmVuY2UgdG8gdGhpcyBzcGhlcmljYWwgaGFybW9uaWNzLlxyXG5cdCAqL1xyXG5cdGFkZFNjYWxlZFNIKCBzaCwgcyApIHtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCA5OyBpICsrICkge1xyXG5cclxuXHRcdFx0dGhpcy5jb2VmZmljaWVudHNbIGkgXS5hZGRTY2FsZWRWZWN0b3IoIHNoLmNvZWZmaWNpZW50c1sgaSBdLCBzICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNjYWxlcyB0aGlzIFNIIGJ5IHRoZSBnaXZlbiBzY2FsZSBmYWN0b3IuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gcyAtIFRoZSBzY2FsZSBmYWN0b3IuXHJcblx0ICogQHJldHVybiB7U3BoZXJpY2FsSGFybW9uaWNzM30gQSByZWZlcmVuY2UgdG8gdGhpcyBzcGhlcmljYWwgaGFybW9uaWNzLlxyXG5cdCAqL1xyXG5cdHNjYWxlKCBzICkge1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDk7IGkgKysgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmNvZWZmaWNpZW50c1sgaSBdLm11bHRpcGx5U2NhbGFyKCBzICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIExpbmVhciBpbnRlcnBvbGF0ZXMgYmV0d2VlbiB0aGUgZ2l2ZW4gU0ggYW5kIHRoaXMgaW5zdGFuY2UgYnkgdGhlIGdpdmVuXHJcblx0ICogYWxwaGEgZmFjdG9yLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTcGhlcmljYWxIYXJtb25pY3MzfSBzaCAtIFRoZSBTSCB0byBpbnRlcnBvbGF0ZSB3aXRoLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhbHBoYSAtIFRoZSBhbHBoYSBmYWN0b3IuXHJcblx0ICogQHJldHVybiB7U3BoZXJpY2FsSGFybW9uaWNzM30gQSByZWZlcmVuY2UgdG8gdGhpcyBzcGhlcmljYWwgaGFybW9uaWNzLlxyXG5cdCAqL1xyXG5cdGxlcnAoIHNoLCBhbHBoYSApIHtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCA5OyBpICsrICkge1xyXG5cclxuXHRcdFx0dGhpcy5jb2VmZmljaWVudHNbIGkgXS5sZXJwKCBzaC5jb2VmZmljaWVudHNbIGkgXSwgYWxwaGEgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBzcGhlcmljYWwgaGFybW9uaWNzIGlzIGVxdWFsIHdpdGggdGhlIGdpdmVuIG9uZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7U3BoZXJpY2FsSGFybW9uaWNzM30gc2ggLSBUaGUgc3BoZXJpY2FsIGhhcm1vbmljcyB0byB0ZXN0IGZvciBlcXVhbGl0eS5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoaXMgc3BoZXJpY2FsIGhhcm1vbmljcyBpcyBlcXVhbCB3aXRoIHRoZSBnaXZlbiBvbmUuXHJcblx0ICovXHJcblx0ZXF1YWxzKCBzaCApIHtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCA5OyBpICsrICkge1xyXG5cclxuXHRcdFx0aWYgKCAhIHRoaXMuY29lZmZpY2llbnRzWyBpIF0uZXF1YWxzKCBzaC5jb2VmZmljaWVudHNbIGkgXSApICkge1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvcGllcyB0aGUgdmFsdWVzIG9mIHRoZSBnaXZlbiBzcGhlcmljYWwgaGFybW9uaWNzIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1NwaGVyaWNhbEhhcm1vbmljczN9IHNoIC0gVGhlIHNwaGVyaWNhbCBoYXJtb25pY3MgdG8gY29weS5cclxuXHQgKiBAcmV0dXJuIHtTcGhlcmljYWxIYXJtb25pY3MzfSBBIHJlZmVyZW5jZSB0byB0aGlzIHNwaGVyaWNhbCBoYXJtb25pY3MuXHJcblx0ICovXHJcblx0Y29weSggc2ggKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuc2V0KCBzaC5jb2VmZmljaWVudHMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbmV3IHNwaGVyaWNhbCBoYXJtb25pY3Mgd2l0aCBjb3BpZWQgdmFsdWVzIGZyb20gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1NwaGVyaWNhbEhhcm1vbmljczN9IEEgY2xvbmUgb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjbG9uZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgU0ggY29lZmZpY2llbnRzIG9mIHRoaXMgaW5zdGFuY2UgZnJvbSB0aGUgZ2l2ZW4gYXJyYXkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IGFycmF5IC0gQW4gYXJyYXkgaG9sZGluZyB0aGUgU0ggY29lZmZpY2llbnRzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0PTBdIC0gVGhlIGFycmF5IG9mZnNldCB3aGVyZSB0byBzdGFydCBjb3B5aW5nLlxyXG5cdCAqIEByZXR1cm4ge1NwaGVyaWNhbEhhcm1vbmljczN9IEEgY2xvbmUgb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRmcm9tQXJyYXkoIGFycmF5LCBvZmZzZXQgPSAwICkge1xyXG5cclxuXHRcdGNvbnN0IGNvZWZmaWNpZW50cyA9IHRoaXMuY29lZmZpY2llbnRzO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDk7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb2VmZmljaWVudHNbIGkgXS5mcm9tQXJyYXkoIGFycmF5LCBvZmZzZXQgKyAoIGkgKiAzICkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhbiBhcnJheSB3aXRoIHRoZSBTSCBjb2VmZmljaWVudHMsIG9yIGNvcGllcyB0aGVtIGludG8gdGhlIHByb3ZpZGVkXHJcblx0ICogYXJyYXkuIFRoZSBjb2VmZmljaWVudHMgYXJlIHJlcHJlc2VudGVkIGFzIG51bWJlcnMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IFthcnJheT1bXV0gLSBUaGUgdGFyZ2V0IGFycmF5LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0PTBdIC0gVGhlIGFycmF5IG9mZnNldCB3aGVyZSB0byBzdGFydCBjb3B5aW5nLlxyXG5cdCAqIEByZXR1cm4ge0FycmF5PG51bWJlcj59IEFuIGFycmF5IHdpdGggZmxhdCBTSCBjb2VmZmljaWVudHMuXHJcblx0ICovXHJcblx0dG9BcnJheSggYXJyYXkgPSBbXSwgb2Zmc2V0ID0gMCApIHtcclxuXHJcblx0XHRjb25zdCBjb2VmZmljaWVudHMgPSB0aGlzLmNvZWZmaWNpZW50cztcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCA5OyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29lZmZpY2llbnRzWyBpIF0udG9BcnJheSggYXJyYXksIG9mZnNldCArICggaSAqIDMgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gYXJyYXk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgdGhlIFNIIGJhc2lzIGZvciB0aGUgZ2l2ZW4gbm9ybWFsIHZlY3Rvci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gbm9ybWFsIC0gVGhlIG5vcm1hbC5cclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IHNoQmFzaXMgLSBUaGUgdGFyZ2V0IGFycmF5IGhvbGRpbmcgdGhlIFNIIGJhc2lzLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBnZXRCYXNpc0F0KCBub3JtYWwsIHNoQmFzaXMgKSB7XHJcblxyXG5cdFx0Ly8gbm9ybWFsIGlzIGFzc3VtZWQgdG8gYmUgdW5pdCBsZW5ndGhcclxuXHJcblx0XHRjb25zdCB4ID0gbm9ybWFsLngsIHkgPSBub3JtYWwueSwgeiA9IG5vcm1hbC56O1xyXG5cclxuXHRcdC8vIGJhbmQgMFxyXG5cdFx0c2hCYXNpc1sgMCBdID0gMC4yODIwOTU7XHJcblxyXG5cdFx0Ly8gYmFuZCAxXHJcblx0XHRzaEJhc2lzWyAxIF0gPSAwLjQ4ODYwMyAqIHk7XHJcblx0XHRzaEJhc2lzWyAyIF0gPSAwLjQ4ODYwMyAqIHo7XHJcblx0XHRzaEJhc2lzWyAzIF0gPSAwLjQ4ODYwMyAqIHg7XHJcblxyXG5cdFx0Ly8gYmFuZCAyXHJcblx0XHRzaEJhc2lzWyA0IF0gPSAxLjA5MjU0OCAqIHggKiB5O1xyXG5cdFx0c2hCYXNpc1sgNSBdID0gMS4wOTI1NDggKiB5ICogejtcclxuXHRcdHNoQmFzaXNbIDYgXSA9IDAuMzE1MzkyICogKCAzICogeiAqIHogLSAxICk7XHJcblx0XHRzaEJhc2lzWyA3IF0gPSAxLjA5MjU0OCAqIHggKiB6O1xyXG5cdFx0c2hCYXNpc1sgOCBdID0gMC41NDYyNzQgKiAoIHggKiB4IC0geSAqIHkgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgU3BoZXJpY2FsSGFybW9uaWNzMyB9O1xyXG4iLCJpbXBvcnQgeyBTcGhlcmljYWxIYXJtb25pY3MzIH0gZnJvbSAnLi4vbWF0aC9TcGhlcmljYWxIYXJtb25pY3MzLmpzJztcclxuaW1wb3J0IHsgTGlnaHQgfSBmcm9tICcuL0xpZ2h0LmpzJztcclxuXHJcbi8qKlxyXG4gKiBMaWdodCBwcm9iZXMgYXJlIGFuIGFsdGVybmF0aXZlIHdheSBvZiBhZGRpbmcgbGlnaHQgdG8gYSAzRCBzY2VuZS4gVW5saWtlXHJcbiAqIGNsYXNzaWNhbCBsaWdodCBzb3VyY2VzIChlLmcuIGRpcmVjdGlvbmFsLCBwb2ludCBvciBzcG90IGxpZ2h0cyksIGxpZ2h0XHJcbiAqIHByb2JlcyBkbyBub3QgZW1pdCBsaWdodC4gSW5zdGVhZCB0aGV5IHN0b3JlIGluZm9ybWF0aW9uIGFib3V0IGxpZ2h0XHJcbiAqIHBhc3NpbmcgdGhyb3VnaCAzRCBzcGFjZS4gRHVyaW5nIHJlbmRlcmluZywgdGhlIGxpZ2h0IHRoYXQgaGl0cyBhIDNEXHJcbiAqIG9iamVjdCBpcyBhcHByb3hpbWF0ZWQgYnkgdXNpbmcgdGhlIGRhdGEgZnJvbSB0aGUgbGlnaHQgcHJvYmUuXHJcbiAqXHJcbiAqIExpZ2h0IHByb2JlcyBhcmUgdXN1YWxseSBjcmVhdGVkIGZyb20gKHJhZGlhbmNlKSBlbnZpcm9ubWVudCBtYXBzLiBUaGVcclxuICogY2xhc3Mge0BsaW5rIExpZ2h0UHJvYmVHZW5lcmF0b3J9IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBsaWdodCBwcm9iZXMgZnJvbVxyXG4gKiBjdWJlIHRleHR1cmVzIG9yIHJlbmRlciB0YXJnZXRzLiBIb3dldmVyLCBsaWdodCBlc3RpbWF0aW9uIGRhdGEgY291bGQgYWxzb1xyXG4gKiBiZSBwcm92aWRlZCBpbiBvdGhlciBmb3JtcyBlLmcuIGJ5IFdlYlhSLiBUaGlzIGVuYWJsZXMgdGhlIHJlbmRlcmluZyBvZlxyXG4gKiBhdWdtZW50ZWQgcmVhbGl0eSBjb250ZW50IHRoYXQgcmVhY3RzIHRvIHJlYWwgd29ybGQgbGlnaHRpbmcuXHJcbiAqXHJcbiAqIFRoZSBjdXJyZW50IHByb2JlIGltcGxlbWVudGF0aW9uIGluIHRocmVlLmpzIHN1cHBvcnRzIHNvLWNhbGxlZCBkaWZmdXNlXHJcbiAqIGxpZ2h0IHByb2Jlcy4gVGhpcyB0eXBlIG9mIGxpZ2h0IHByb2JlIGlzIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIGFuXHJcbiAqIGlycmFkaWFuY2UgZW52aXJvbm1lbnQgbWFwLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTGlnaHRcclxuICovXHJcbmNsYXNzIExpZ2h0UHJvYmUgZXh0ZW5kcyBMaWdodCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbGlnaHQgcHJvYmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1NwaGVyaWNhbEhhcm1vbmljczN9IHNoIC0gVGhlIHNwaGVyaWNhbCBoYXJtb25pY3Mgd2hpY2ggcmVwcmVzZW50cyBlbmNvZGVkIGxpZ2h0aW5nIGluZm9ybWF0aW9uLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbaW50ZW5zaXR5PTFdIC0gVGhlIGxpZ2h0J3Mgc3RyZW5ndGgvaW50ZW5zaXR5LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBzaCA9IG5ldyBTcGhlcmljYWxIYXJtb25pY3MzKCksIGludGVuc2l0eSA9IDEgKSB7XHJcblxyXG5cdFx0c3VwZXIoIHVuZGVmaW5lZCwgaW50ZW5zaXR5ICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzTGlnaHRQcm9iZSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGxpZ2h0IHByb2JlIHVzZXMgc3BoZXJpY2FsIGhhcm1vbmljcyB0byBlbmNvZGUgbGlnaHRpbmcgaW5mb3JtYXRpb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1NwaGVyaWNhbEhhcm1vbmljczN9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2ggPSBzaDtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy5zaC5jb3B5KCBzb3VyY2Uuc2ggKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZXNlcmlhbGl6ZXMgdGhlIGxpZ2h0IHByb3ZlIGZyb20gdGhlIGdpdmVuIEpTT04uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0ganNvbiAtIFRoZSBKU09OIGhvbGRpbmcgdGhlIHNlcmlhbGl6ZWQgbGlnaHQgcHJvYmUuXHJcblx0ICogQHJldHVybiB7TGlnaHRQcm9iZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBsaWdodCBwcm9iZS5cclxuXHQgKi9cclxuXHRmcm9tSlNPTigganNvbiApIHtcclxuXHJcblx0XHR0aGlzLmludGVuc2l0eSA9IGpzb24uaW50ZW5zaXR5OyAvLyBUT0RPOiBNb3ZlIHRoaXMgYml0IHRvIExpZ2h0LmZyb21KU09OKCk7XHJcblx0XHR0aGlzLnNoLmZyb21BcnJheSgganNvbi5zaCApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdHRvSlNPTiggbWV0YSApIHtcclxuXHJcblx0XHRjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCBtZXRhICk7XHJcblxyXG5cdFx0ZGF0YS5vYmplY3Quc2ggPSB0aGlzLnNoLnRvQXJyYXkoKTtcclxuXHJcblx0XHRyZXR1cm4gZGF0YTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgTGlnaHRQcm9iZSB9O1xyXG4iLCJpbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uL21hdGgvQ29sb3IuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IyLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjQgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjQuanMnO1xyXG5pbXBvcnQgeyBNYXRyaXgzIH0gZnJvbSAnLi4vbWF0aC9NYXRyaXgzLmpzJztcclxuaW1wb3J0IHsgTWF0cml4NCB9IGZyb20gJy4uL21hdGgvTWF0cml4NC5qcyc7XHJcbmltcG9ydCB7IEZpbGVMb2FkZXIgfSBmcm9tICcuL0ZpbGVMb2FkZXIuanMnO1xyXG5pbXBvcnQgeyBMb2FkZXIgfSBmcm9tICcuL0xvYWRlci5qcyc7XHJcbmltcG9ydCB7XHJcblx0U2hhZG93TWF0ZXJpYWwsXHJcblx0U3ByaXRlTWF0ZXJpYWwsXHJcblx0UmF3U2hhZGVyTWF0ZXJpYWwsXHJcblx0U2hhZGVyTWF0ZXJpYWwsXHJcblx0UG9pbnRzTWF0ZXJpYWwsXHJcblx0TWVzaFBoeXNpY2FsTWF0ZXJpYWwsXHJcblx0TWVzaFN0YW5kYXJkTWF0ZXJpYWwsXHJcblx0TWVzaFBob25nTWF0ZXJpYWwsXHJcblx0TWVzaFRvb25NYXRlcmlhbCxcclxuXHRNZXNoTm9ybWFsTWF0ZXJpYWwsXHJcblx0TWVzaExhbWJlcnRNYXRlcmlhbCxcclxuXHRNZXNoRGVwdGhNYXRlcmlhbCxcclxuXHRNZXNoRGlzdGFuY2VNYXRlcmlhbCxcclxuXHRNZXNoQmFzaWNNYXRlcmlhbCxcclxuXHRNZXNoTWF0Y2FwTWF0ZXJpYWwsXHJcblx0TGluZURhc2hlZE1hdGVyaWFsLFxyXG5cdExpbmVCYXNpY01hdGVyaWFsLFxyXG5cdE1hdGVyaWFsLFxyXG59IGZyb20gJy4uL21hdGVyaWFscy9NYXRlcmlhbHMuanMnO1xyXG5cclxuLyoqXHJcbiAqIENsYXNzIGZvciBsb2FkaW5nIGdlb21ldHJpZXMuIFRoZSBmaWxlcyBhcmUgaW50ZXJuYWxseVxyXG4gKiBsb2FkZWQgdmlhIHtAbGluayBGaWxlTG9hZGVyfS5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgbG9hZGVyID0gbmV3IFRIUkVFLk1hdGVyaWFsTG9hZGVyKCk7XHJcbiAqIGNvbnN0IG1hdGVyaWFsID0gYXdhaXQgbG9hZGVyLmxvYWRBc3luYyggJ21hdGVyaWFsLmpzb24nICk7XHJcbiAqIGBgYFxyXG4gKiBUaGlzIGxvYWRlciBkb2VzIG5vdCBzdXBwb3J0IG5vZGUgbWF0ZXJpYWxzLiBVc2Uge0BsaW5rIE5vZGVNYXRlcmlhbExvYWRlcn0gaW5zdGVhZC5cclxuICpcclxuICogQGF1Z21lbnRzIExvYWRlclxyXG4gKi9cclxuY2xhc3MgTWF0ZXJpYWxMb2FkZXIgZXh0ZW5kcyBMb2FkZXIge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG1hdGVyaWFsIGxvYWRlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TG9hZGluZ01hbmFnZXJ9IFttYW5hZ2VyXSAtIFRoZSBsb2FkaW5nIG1hbmFnZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG1hbmFnZXIgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG1hbmFnZXIgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgZGljdGlvbmFyeSBob2xkaW5nIHRleHR1cmVzIHVzZWQgYnkgdGhlIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLFRleHR1cmU+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRleHR1cmVzID0ge307XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3RhcnRzIGxvYWRpbmcgZnJvbSB0aGUgZ2l2ZW4gVVJMIGFuZCBwYXNzIHRoZSBsb2FkZWQgbWF0ZXJpYWwgdG8gdGhlIGBvbkxvYWQoKWAgY2FsbGJhY2suXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gVGhlIHBhdGgvVVJMIG9mIHRoZSBmaWxlIHRvIGJlIGxvYWRlZC4gVGhpcyBjYW4gYWxzbyBiZSBhIGRhdGEgVVJJLlxyXG5cdCAqIEBwYXJhbSB7ZnVuY3Rpb24oTWF0ZXJpYWwpfSBvbkxvYWQgLSBFeGVjdXRlZCB3aGVuIHRoZSBsb2FkaW5nIHByb2Nlc3MgaGFzIGJlZW4gZmluaXNoZWQuXHJcblx0ICogQHBhcmFtIHtvblByb2dyZXNzQ2FsbGJhY2t9IG9uUHJvZ3Jlc3MgLSBFeGVjdXRlZCB3aGlsZSB0aGUgbG9hZGluZyBpcyBpbiBwcm9ncmVzcy5cclxuXHQgKiBAcGFyYW0ge29uRXJyb3JDYWxsYmFja30gb25FcnJvciAtIEV4ZWN1dGVkIHdoZW4gZXJyb3JzIG9jY3VyLlxyXG5cdCAqL1xyXG5cdGxvYWQoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xyXG5cclxuXHRcdGNvbnN0IHNjb3BlID0gdGhpcztcclxuXHJcblx0XHRjb25zdCBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggc2NvcGUubWFuYWdlciApO1xyXG5cdFx0bG9hZGVyLnNldFBhdGgoIHNjb3BlLnBhdGggKTtcclxuXHRcdGxvYWRlci5zZXRSZXF1ZXN0SGVhZGVyKCBzY29wZS5yZXF1ZXN0SGVhZGVyICk7XHJcblx0XHRsb2FkZXIuc2V0V2l0aENyZWRlbnRpYWxzKCBzY29wZS53aXRoQ3JlZGVudGlhbHMgKTtcclxuXHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggdGV4dCApIHtcclxuXHJcblx0XHRcdHRyeSB7XHJcblxyXG5cdFx0XHRcdG9uTG9hZCggc2NvcGUucGFyc2UoIEpTT04ucGFyc2UoIHRleHQgKSApICk7XHJcblxyXG5cdFx0XHR9IGNhdGNoICggZSApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBvbkVycm9yICkge1xyXG5cclxuXHRcdFx0XHRcdG9uRXJyb3IoIGUgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCBlICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRXJyb3IoIHVybCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQYXJzZXMgdGhlIGdpdmVuIEpTT04gb2JqZWN0IGFuZCByZXR1cm5zIGEgbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0ganNvbiAtIFRoZSBzZXJpYWxpemVkIG1hdGVyaWFsLlxyXG5cdCAqIEByZXR1cm4ge01hdGVyaWFsfSBUaGUgcGFyc2VkIG1hdGVyaWFsLlxyXG5cdCAqL1xyXG5cdHBhcnNlKCBqc29uICkge1xyXG5cclxuXHRcdGNvbnN0IHRleHR1cmVzID0gdGhpcy50ZXh0dXJlcztcclxuXHJcblx0XHRmdW5jdGlvbiBnZXRUZXh0dXJlKCBuYW1lICkge1xyXG5cclxuXHRcdFx0aWYgKCB0ZXh0dXJlc1sgbmFtZSBdID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdGVyaWFsTG9hZGVyOiBVbmRlZmluZWQgdGV4dHVyZScsIG5hbWUgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiB0ZXh0dXJlc1sgbmFtZSBdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBtYXRlcmlhbCA9IHRoaXMuY3JlYXRlTWF0ZXJpYWxGcm9tVHlwZSgganNvbi50eXBlICk7XHJcblxyXG5cdFx0aWYgKCBqc29uLnV1aWQgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnV1aWQgPSBqc29uLnV1aWQ7XHJcblx0XHRpZiAoIGpzb24ubmFtZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubmFtZSA9IGpzb24ubmFtZTtcclxuXHRcdGlmICgganNvbi5jb2xvciAhPT0gdW5kZWZpbmVkICYmIG1hdGVyaWFsLmNvbG9yICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5jb2xvci5zZXRIZXgoIGpzb24uY29sb3IgKTtcclxuXHRcdGlmICgganNvbi5yb3VnaG5lc3MgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnJvdWdobmVzcyA9IGpzb24ucm91Z2huZXNzO1xyXG5cdFx0aWYgKCBqc29uLm1ldGFsbmVzcyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubWV0YWxuZXNzID0ganNvbi5tZXRhbG5lc3M7XHJcblx0XHRpZiAoIGpzb24uc2hlZW4gIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNoZWVuID0ganNvbi5zaGVlbjtcclxuXHRcdGlmICgganNvbi5zaGVlbkNvbG9yICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zaGVlbkNvbG9yID0gbmV3IENvbG9yKCkuc2V0SGV4KCBqc29uLnNoZWVuQ29sb3IgKTtcclxuXHRcdGlmICgganNvbi5zaGVlblJvdWdobmVzcyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc2hlZW5Sb3VnaG5lc3MgPSBqc29uLnNoZWVuUm91Z2huZXNzO1xyXG5cdFx0aWYgKCBqc29uLmVtaXNzaXZlICE9PSB1bmRlZmluZWQgJiYgbWF0ZXJpYWwuZW1pc3NpdmUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmVtaXNzaXZlLnNldEhleCgganNvbi5lbWlzc2l2ZSApO1xyXG5cdFx0aWYgKCBqc29uLnNwZWN1bGFyICE9PSB1bmRlZmluZWQgJiYgbWF0ZXJpYWwuc3BlY3VsYXIgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNwZWN1bGFyLnNldEhleCgganNvbi5zcGVjdWxhciApO1xyXG5cdFx0aWYgKCBqc29uLnNwZWN1bGFySW50ZW5zaXR5ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zcGVjdWxhckludGVuc2l0eSA9IGpzb24uc3BlY3VsYXJJbnRlbnNpdHk7XHJcblx0XHRpZiAoIGpzb24uc3BlY3VsYXJDb2xvciAhPT0gdW5kZWZpbmVkICYmIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3Iuc2V0SGV4KCBqc29uLnNwZWN1bGFyQ29sb3IgKTtcclxuXHRcdGlmICgganNvbi5zaGluaW5lc3MgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNoaW5pbmVzcyA9IGpzb24uc2hpbmluZXNzO1xyXG5cdFx0aWYgKCBqc29uLmNsZWFyY29hdCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuY2xlYXJjb2F0ID0ganNvbi5jbGVhcmNvYXQ7XHJcblx0XHRpZiAoIGpzb24uY2xlYXJjb2F0Um91Z2huZXNzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgPSBqc29uLmNsZWFyY29hdFJvdWdobmVzcztcclxuXHRcdGlmICgganNvbi5kaXNwZXJzaW9uICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5kaXNwZXJzaW9uID0ganNvbi5kaXNwZXJzaW9uO1xyXG5cdFx0aWYgKCBqc29uLmlyaWRlc2NlbmNlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5pcmlkZXNjZW5jZSA9IGpzb24uaXJpZGVzY2VuY2U7XHJcblx0XHRpZiAoIGpzb24uaXJpZGVzY2VuY2VJT1IgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmlyaWRlc2NlbmNlSU9SID0ganNvbi5pcmlkZXNjZW5jZUlPUjtcclxuXHRcdGlmICgganNvbi5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlID0ganNvbi5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlO1xyXG5cdFx0aWYgKCBqc29uLnRyYW5zbWlzc2lvbiAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwudHJhbnNtaXNzaW9uID0ganNvbi50cmFuc21pc3Npb247XHJcblx0XHRpZiAoIGpzb24udGhpY2tuZXNzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC50aGlja25lc3MgPSBqc29uLnRoaWNrbmVzcztcclxuXHRcdGlmICgganNvbi5hdHRlbnVhdGlvbkRpc3RhbmNlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5hdHRlbnVhdGlvbkRpc3RhbmNlID0ganNvbi5hdHRlbnVhdGlvbkRpc3RhbmNlO1xyXG5cdFx0aWYgKCBqc29uLmF0dGVudWF0aW9uQ29sb3IgIT09IHVuZGVmaW5lZCAmJiBtYXRlcmlhbC5hdHRlbnVhdGlvbkNvbG9yICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5hdHRlbnVhdGlvbkNvbG9yLnNldEhleCgganNvbi5hdHRlbnVhdGlvbkNvbG9yICk7XHJcblx0XHRpZiAoIGpzb24uYW5pc290cm9weSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYW5pc290cm9weSA9IGpzb24uYW5pc290cm9weTtcclxuXHRcdGlmICgganNvbi5hbmlzb3Ryb3B5Um90YXRpb24gIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmFuaXNvdHJvcHlSb3RhdGlvbiA9IGpzb24uYW5pc290cm9weVJvdGF0aW9uO1xyXG5cdFx0aWYgKCBqc29uLmZvZyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZm9nID0ganNvbi5mb2c7XHJcblx0XHRpZiAoIGpzb24uZmxhdFNoYWRpbmcgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmZsYXRTaGFkaW5nID0ganNvbi5mbGF0U2hhZGluZztcclxuXHRcdGlmICgganNvbi5ibGVuZGluZyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYmxlbmRpbmcgPSBqc29uLmJsZW5kaW5nO1xyXG5cdFx0aWYgKCBqc29uLmNvbWJpbmUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmNvbWJpbmUgPSBqc29uLmNvbWJpbmU7XHJcblx0XHRpZiAoIGpzb24uc2lkZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc2lkZSA9IGpzb24uc2lkZTtcclxuXHRcdGlmICgganNvbi5zaGFkb3dTaWRlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zaGFkb3dTaWRlID0ganNvbi5zaGFkb3dTaWRlO1xyXG5cdFx0aWYgKCBqc29uLm9wYWNpdHkgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm9wYWNpdHkgPSBqc29uLm9wYWNpdHk7XHJcblx0XHRpZiAoIGpzb24udHJhbnNwYXJlbnQgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnRyYW5zcGFyZW50ID0ganNvbi50cmFuc3BhcmVudDtcclxuXHRcdGlmICgganNvbi5hbHBoYVRlc3QgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmFscGhhVGVzdCA9IGpzb24uYWxwaGFUZXN0O1xyXG5cdFx0aWYgKCBqc29uLmFscGhhSGFzaCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYWxwaGFIYXNoID0ganNvbi5hbHBoYUhhc2g7XHJcblx0XHRpZiAoIGpzb24uZGVwdGhGdW5jICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5kZXB0aEZ1bmMgPSBqc29uLmRlcHRoRnVuYztcclxuXHRcdGlmICgganNvbi5kZXB0aFRlc3QgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmRlcHRoVGVzdCA9IGpzb24uZGVwdGhUZXN0O1xyXG5cdFx0aWYgKCBqc29uLmRlcHRoV3JpdGUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmRlcHRoV3JpdGUgPSBqc29uLmRlcHRoV3JpdGU7XHJcblx0XHRpZiAoIGpzb24uY29sb3JXcml0ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuY29sb3JXcml0ZSA9IGpzb24uY29sb3JXcml0ZTtcclxuXHRcdGlmICgganNvbi5ibGVuZFNyYyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYmxlbmRTcmMgPSBqc29uLmJsZW5kU3JjO1xyXG5cdFx0aWYgKCBqc29uLmJsZW5kRHN0ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5ibGVuZERzdCA9IGpzb24uYmxlbmREc3Q7XHJcblx0XHRpZiAoIGpzb24uYmxlbmRFcXVhdGlvbiAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYmxlbmRFcXVhdGlvbiA9IGpzb24uYmxlbmRFcXVhdGlvbjtcclxuXHRcdGlmICgganNvbi5ibGVuZFNyY0FscGhhICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5ibGVuZFNyY0FscGhhID0ganNvbi5ibGVuZFNyY0FscGhhO1xyXG5cdFx0aWYgKCBqc29uLmJsZW5kRHN0QWxwaGEgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmJsZW5kRHN0QWxwaGEgPSBqc29uLmJsZW5kRHN0QWxwaGE7XHJcblx0XHRpZiAoIGpzb24uYmxlbmRFcXVhdGlvbkFscGhhICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5ibGVuZEVxdWF0aW9uQWxwaGEgPSBqc29uLmJsZW5kRXF1YXRpb25BbHBoYTtcclxuXHRcdGlmICgganNvbi5ibGVuZENvbG9yICE9PSB1bmRlZmluZWQgJiYgbWF0ZXJpYWwuYmxlbmRDb2xvciAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYmxlbmRDb2xvci5zZXRIZXgoIGpzb24uYmxlbmRDb2xvciApO1xyXG5cdFx0aWYgKCBqc29uLmJsZW5kQWxwaGEgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmJsZW5kQWxwaGEgPSBqc29uLmJsZW5kQWxwaGE7XHJcblx0XHRpZiAoIGpzb24uc3RlbmNpbFdyaXRlTWFzayAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc3RlbmNpbFdyaXRlTWFzayA9IGpzb24uc3RlbmNpbFdyaXRlTWFzaztcclxuXHRcdGlmICgganNvbi5zdGVuY2lsRnVuYyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc3RlbmNpbEZ1bmMgPSBqc29uLnN0ZW5jaWxGdW5jO1xyXG5cdFx0aWYgKCBqc29uLnN0ZW5jaWxSZWYgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnN0ZW5jaWxSZWYgPSBqc29uLnN0ZW5jaWxSZWY7XHJcblx0XHRpZiAoIGpzb24uc3RlbmNpbEZ1bmNNYXNrICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zdGVuY2lsRnVuY01hc2sgPSBqc29uLnN0ZW5jaWxGdW5jTWFzaztcclxuXHRcdGlmICgganNvbi5zdGVuY2lsRmFpbCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc3RlbmNpbEZhaWwgPSBqc29uLnN0ZW5jaWxGYWlsO1xyXG5cdFx0aWYgKCBqc29uLnN0ZW5jaWxaRmFpbCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc3RlbmNpbFpGYWlsID0ganNvbi5zdGVuY2lsWkZhaWw7XHJcblx0XHRpZiAoIGpzb24uc3RlbmNpbFpQYXNzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zdGVuY2lsWlBhc3MgPSBqc29uLnN0ZW5jaWxaUGFzcztcclxuXHRcdGlmICgganNvbi5zdGVuY2lsV3JpdGUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnN0ZW5jaWxXcml0ZSA9IGpzb24uc3RlbmNpbFdyaXRlO1xyXG5cclxuXHRcdGlmICgganNvbi53aXJlZnJhbWUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLndpcmVmcmFtZSA9IGpzb24ud2lyZWZyYW1lO1xyXG5cdFx0aWYgKCBqc29uLndpcmVmcmFtZUxpbmV3aWR0aCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwud2lyZWZyYW1lTGluZXdpZHRoID0ganNvbi53aXJlZnJhbWVMaW5ld2lkdGg7XHJcblx0XHRpZiAoIGpzb24ud2lyZWZyYW1lTGluZWNhcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwud2lyZWZyYW1lTGluZWNhcCA9IGpzb24ud2lyZWZyYW1lTGluZWNhcDtcclxuXHRcdGlmICgganNvbi53aXJlZnJhbWVMaW5lam9pbiAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwud2lyZWZyYW1lTGluZWpvaW4gPSBqc29uLndpcmVmcmFtZUxpbmVqb2luO1xyXG5cclxuXHRcdGlmICgganNvbi5yb3RhdGlvbiAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwucm90YXRpb24gPSBqc29uLnJvdGF0aW9uO1xyXG5cclxuXHRcdGlmICgganNvbi5saW5ld2lkdGggIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmxpbmV3aWR0aCA9IGpzb24ubGluZXdpZHRoO1xyXG5cdFx0aWYgKCBqc29uLmRhc2hTaXplICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5kYXNoU2l6ZSA9IGpzb24uZGFzaFNpemU7XHJcblx0XHRpZiAoIGpzb24uZ2FwU2l6ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZ2FwU2l6ZSA9IGpzb24uZ2FwU2l6ZTtcclxuXHRcdGlmICgganNvbi5zY2FsZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc2NhbGUgPSBqc29uLnNjYWxlO1xyXG5cclxuXHRcdGlmICgganNvbi5wb2x5Z29uT2Zmc2V0ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5wb2x5Z29uT2Zmc2V0ID0ganNvbi5wb2x5Z29uT2Zmc2V0O1xyXG5cdFx0aWYgKCBqc29uLnBvbHlnb25PZmZzZXRGYWN0b3IgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnBvbHlnb25PZmZzZXRGYWN0b3IgPSBqc29uLnBvbHlnb25PZmZzZXRGYWN0b3I7XHJcblx0XHRpZiAoIGpzb24ucG9seWdvbk9mZnNldFVuaXRzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5wb2x5Z29uT2Zmc2V0VW5pdHMgPSBqc29uLnBvbHlnb25PZmZzZXRVbml0cztcclxuXHJcblx0XHRpZiAoIGpzb24uZGl0aGVyaW5nICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5kaXRoZXJpbmcgPSBqc29uLmRpdGhlcmluZztcclxuXHJcblx0XHRpZiAoIGpzb24uYWxwaGFUb0NvdmVyYWdlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5hbHBoYVRvQ292ZXJhZ2UgPSBqc29uLmFscGhhVG9Db3ZlcmFnZTtcclxuXHRcdGlmICgganNvbi5wcmVtdWx0aXBsaWVkQWxwaGEgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnByZW11bHRpcGxpZWRBbHBoYSA9IGpzb24ucHJlbXVsdGlwbGllZEFscGhhO1xyXG5cdFx0aWYgKCBqc29uLmZvcmNlU2luZ2xlUGFzcyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZm9yY2VTaW5nbGVQYXNzID0ganNvbi5mb3JjZVNpbmdsZVBhc3M7XHJcblxyXG5cdFx0aWYgKCBqc29uLnZpc2libGUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnZpc2libGUgPSBqc29uLnZpc2libGU7XHJcblxyXG5cdFx0aWYgKCBqc29uLnRvbmVNYXBwZWQgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnRvbmVNYXBwZWQgPSBqc29uLnRvbmVNYXBwZWQ7XHJcblxyXG5cdFx0aWYgKCBqc29uLnVzZXJEYXRhICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC51c2VyRGF0YSA9IGpzb24udXNlckRhdGE7XHJcblxyXG5cdFx0aWYgKCBqc29uLnZlcnRleENvbG9ycyAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0aWYgKCB0eXBlb2YganNvbi52ZXJ0ZXhDb2xvcnMgPT09ICdudW1iZXInICkge1xyXG5cclxuXHRcdFx0XHRtYXRlcmlhbC52ZXJ0ZXhDb2xvcnMgPSAoIGpzb24udmVydGV4Q29sb3JzID4gMCApID8gdHJ1ZSA6IGZhbHNlO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0bWF0ZXJpYWwudmVydGV4Q29sb3JzID0ganNvbi52ZXJ0ZXhDb2xvcnM7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFNoYWRlciBNYXRlcmlhbFxyXG5cclxuXHRcdGlmICgganNvbi51bmlmb3JtcyAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Zm9yICggY29uc3QgbmFtZSBpbiBqc29uLnVuaWZvcm1zICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB1bmlmb3JtID0ganNvbi51bmlmb3Jtc1sgbmFtZSBdO1xyXG5cclxuXHRcdFx0XHRtYXRlcmlhbC51bmlmb3Jtc1sgbmFtZSBdID0ge307XHJcblxyXG5cdFx0XHRcdHN3aXRjaCAoIHVuaWZvcm0udHlwZSApIHtcclxuXHJcblx0XHRcdFx0XHRjYXNlICd0JzpcclxuXHRcdFx0XHRcdFx0bWF0ZXJpYWwudW5pZm9ybXNbIG5hbWUgXS52YWx1ZSA9IGdldFRleHR1cmUoIHVuaWZvcm0udmFsdWUgKTtcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0Y2FzZSAnYyc6XHJcblx0XHRcdFx0XHRcdG1hdGVyaWFsLnVuaWZvcm1zWyBuYW1lIF0udmFsdWUgPSBuZXcgQ29sb3IoKS5zZXRIZXgoIHVuaWZvcm0udmFsdWUgKTtcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0Y2FzZSAndjInOlxyXG5cdFx0XHRcdFx0XHRtYXRlcmlhbC51bmlmb3Jtc1sgbmFtZSBdLnZhbHVlID0gbmV3IFZlY3RvcjIoKS5mcm9tQXJyYXkoIHVuaWZvcm0udmFsdWUgKTtcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0Y2FzZSAndjMnOlxyXG5cdFx0XHRcdFx0XHRtYXRlcmlhbC51bmlmb3Jtc1sgbmFtZSBdLnZhbHVlID0gbmV3IFZlY3RvcjMoKS5mcm9tQXJyYXkoIHVuaWZvcm0udmFsdWUgKTtcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0Y2FzZSAndjQnOlxyXG5cdFx0XHRcdFx0XHRtYXRlcmlhbC51bmlmb3Jtc1sgbmFtZSBdLnZhbHVlID0gbmV3IFZlY3RvcjQoKS5mcm9tQXJyYXkoIHVuaWZvcm0udmFsdWUgKTtcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0Y2FzZSAnbTMnOlxyXG5cdFx0XHRcdFx0XHRtYXRlcmlhbC51bmlmb3Jtc1sgbmFtZSBdLnZhbHVlID0gbmV3IE1hdHJpeDMoKS5mcm9tQXJyYXkoIHVuaWZvcm0udmFsdWUgKTtcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0Y2FzZSAnbTQnOlxyXG5cdFx0XHRcdFx0XHRtYXRlcmlhbC51bmlmb3Jtc1sgbmFtZSBdLnZhbHVlID0gbmV3IE1hdHJpeDQoKS5mcm9tQXJyYXkoIHVuaWZvcm0udmFsdWUgKTtcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRcdFx0bWF0ZXJpYWwudW5pZm9ybXNbIG5hbWUgXS52YWx1ZSA9IHVuaWZvcm0udmFsdWU7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBqc29uLmRlZmluZXMgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmRlZmluZXMgPSBqc29uLmRlZmluZXM7XHJcblx0XHRpZiAoIGpzb24udmVydGV4U2hhZGVyICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC52ZXJ0ZXhTaGFkZXIgPSBqc29uLnZlcnRleFNoYWRlcjtcclxuXHRcdGlmICgganNvbi5mcmFnbWVudFNoYWRlciAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZnJhZ21lbnRTaGFkZXIgPSBqc29uLmZyYWdtZW50U2hhZGVyO1xyXG5cdFx0aWYgKCBqc29uLmdsc2xWZXJzaW9uICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5nbHNsVmVyc2lvbiA9IGpzb24uZ2xzbFZlcnNpb247XHJcblxyXG5cdFx0aWYgKCBqc29uLmV4dGVuc2lvbnMgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGZvciAoIGNvbnN0IGtleSBpbiBqc29uLmV4dGVuc2lvbnMgKSB7XHJcblxyXG5cdFx0XHRcdG1hdGVyaWFsLmV4dGVuc2lvbnNbIGtleSBdID0ganNvbi5leHRlbnNpb25zWyBrZXkgXTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBqc29uLmxpZ2h0cyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubGlnaHRzID0ganNvbi5saWdodHM7XHJcblx0XHRpZiAoIGpzb24uY2xpcHBpbmcgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmNsaXBwaW5nID0ganNvbi5jbGlwcGluZztcclxuXHJcblx0XHQvLyBmb3IgUG9pbnRzTWF0ZXJpYWxcclxuXHJcblx0XHRpZiAoIGpzb24uc2l6ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc2l6ZSA9IGpzb24uc2l6ZTtcclxuXHRcdGlmICgganNvbi5zaXplQXR0ZW51YXRpb24gIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNpemVBdHRlbnVhdGlvbiA9IGpzb24uc2l6ZUF0dGVudWF0aW9uO1xyXG5cclxuXHRcdC8vIG1hcHNcclxuXHJcblx0XHRpZiAoIGpzb24ubWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5tYXAgPSBnZXRUZXh0dXJlKCBqc29uLm1hcCApO1xyXG5cdFx0aWYgKCBqc29uLm1hdGNhcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubWF0Y2FwID0gZ2V0VGV4dHVyZSgganNvbi5tYXRjYXAgKTtcclxuXHJcblx0XHRpZiAoIGpzb24uYWxwaGFNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmFscGhhTWFwID0gZ2V0VGV4dHVyZSgganNvbi5hbHBoYU1hcCApO1xyXG5cclxuXHRcdGlmICgganNvbi5idW1wTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5idW1wTWFwID0gZ2V0VGV4dHVyZSgganNvbi5idW1wTWFwICk7XHJcblx0XHRpZiAoIGpzb24uYnVtcFNjYWxlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5idW1wU2NhbGUgPSBqc29uLmJ1bXBTY2FsZTtcclxuXHJcblx0XHRpZiAoIGpzb24ubm9ybWFsTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5ub3JtYWxNYXAgPSBnZXRUZXh0dXJlKCBqc29uLm5vcm1hbE1hcCApO1xyXG5cdFx0aWYgKCBqc29uLm5vcm1hbE1hcFR5cGUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm5vcm1hbE1hcFR5cGUgPSBqc29uLm5vcm1hbE1hcFR5cGU7XHJcblx0XHRpZiAoIGpzb24ubm9ybWFsU2NhbGUgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGxldCBub3JtYWxTY2FsZSA9IGpzb24ubm9ybWFsU2NhbGU7XHJcblxyXG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIG5vcm1hbFNjYWxlICkgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0XHQvLyBCbGVuZGVyIGV4cG9ydGVyIHVzZWQgdG8gZXhwb3J0IGEgc2NhbGFyLiBTZWUgIzc0NTlcclxuXHJcblx0XHRcdFx0bm9ybWFsU2NhbGUgPSBbIG5vcm1hbFNjYWxlLCBub3JtYWxTY2FsZSBdO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0bWF0ZXJpYWwubm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMigpLmZyb21BcnJheSggbm9ybWFsU2NhbGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBqc29uLmRpc3BsYWNlbWVudE1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwID0gZ2V0VGV4dHVyZSgganNvbi5kaXNwbGFjZW1lbnRNYXAgKTtcclxuXHRcdGlmICgganNvbi5kaXNwbGFjZW1lbnRTY2FsZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGlzcGxhY2VtZW50U2NhbGUgPSBqc29uLmRpc3BsYWNlbWVudFNjYWxlO1xyXG5cdFx0aWYgKCBqc29uLmRpc3BsYWNlbWVudEJpYXMgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmRpc3BsYWNlbWVudEJpYXMgPSBqc29uLmRpc3BsYWNlbWVudEJpYXM7XHJcblxyXG5cdFx0aWYgKCBqc29uLnJvdWdobmVzc01hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwucm91Z2huZXNzTWFwID0gZ2V0VGV4dHVyZSgganNvbi5yb3VnaG5lc3NNYXAgKTtcclxuXHRcdGlmICgganNvbi5tZXRhbG5lc3NNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm1ldGFsbmVzc01hcCA9IGdldFRleHR1cmUoIGpzb24ubWV0YWxuZXNzTWFwICk7XHJcblxyXG5cdFx0aWYgKCBqc29uLmVtaXNzaXZlTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5lbWlzc2l2ZU1hcCA9IGdldFRleHR1cmUoIGpzb24uZW1pc3NpdmVNYXAgKTtcclxuXHRcdGlmICgganNvbi5lbWlzc2l2ZUludGVuc2l0eSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZW1pc3NpdmVJbnRlbnNpdHkgPSBqc29uLmVtaXNzaXZlSW50ZW5zaXR5O1xyXG5cclxuXHRcdGlmICgganNvbi5zcGVjdWxhck1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc3BlY3VsYXJNYXAgPSBnZXRUZXh0dXJlKCBqc29uLnNwZWN1bGFyTWFwICk7XHJcblx0XHRpZiAoIGpzb24uc3BlY3VsYXJJbnRlbnNpdHlNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNwZWN1bGFySW50ZW5zaXR5TWFwID0gZ2V0VGV4dHVyZSgganNvbi5zcGVjdWxhckludGVuc2l0eU1hcCApO1xyXG5cdFx0aWYgKCBqc29uLnNwZWN1bGFyQ29sb3JNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3JNYXAgPSBnZXRUZXh0dXJlKCBqc29uLnNwZWN1bGFyQ29sb3JNYXAgKTtcclxuXHJcblx0XHRpZiAoIGpzb24uZW52TWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5lbnZNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmVudk1hcCApO1xyXG5cdFx0aWYgKCBqc29uLmVudk1hcFJvdGF0aW9uICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5lbnZNYXBSb3RhdGlvbi5mcm9tQXJyYXkoIGpzb24uZW52TWFwUm90YXRpb24gKTtcclxuXHRcdGlmICgganNvbi5lbnZNYXBJbnRlbnNpdHkgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmVudk1hcEludGVuc2l0eSA9IGpzb24uZW52TWFwSW50ZW5zaXR5O1xyXG5cclxuXHRcdGlmICgganNvbi5yZWZsZWN0aXZpdHkgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnJlZmxlY3Rpdml0eSA9IGpzb24ucmVmbGVjdGl2aXR5O1xyXG5cdFx0aWYgKCBqc29uLnJlZnJhY3Rpb25SYXRpbyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwucmVmcmFjdGlvblJhdGlvID0ganNvbi5yZWZyYWN0aW9uUmF0aW87XHJcblxyXG5cdFx0aWYgKCBqc29uLmxpZ2h0TWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5saWdodE1hcCA9IGdldFRleHR1cmUoIGpzb24ubGlnaHRNYXAgKTtcclxuXHRcdGlmICgganNvbi5saWdodE1hcEludGVuc2l0eSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubGlnaHRNYXBJbnRlbnNpdHkgPSBqc29uLmxpZ2h0TWFwSW50ZW5zaXR5O1xyXG5cclxuXHRcdGlmICgganNvbi5hb01hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYW9NYXAgPSBnZXRUZXh0dXJlKCBqc29uLmFvTWFwICk7XHJcblx0XHRpZiAoIGpzb24uYW9NYXBJbnRlbnNpdHkgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmFvTWFwSW50ZW5zaXR5ID0ganNvbi5hb01hcEludGVuc2l0eTtcclxuXHJcblx0XHRpZiAoIGpzb24uZ3JhZGllbnRNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmdyYWRpZW50TWFwID0gZ2V0VGV4dHVyZSgganNvbi5ncmFkaWVudE1hcCApO1xyXG5cclxuXHRcdGlmICgganNvbi5jbGVhcmNvYXRNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmNsZWFyY29hdE1hcCA9IGdldFRleHR1cmUoIGpzb24uY2xlYXJjb2F0TWFwICk7XHJcblx0XHRpZiAoIGpzb24uY2xlYXJjb2F0Um91Z2huZXNzTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3NNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmNsZWFyY29hdFJvdWdobmVzc01hcCApO1xyXG5cdFx0aWYgKCBqc29uLmNsZWFyY29hdE5vcm1hbE1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuY2xlYXJjb2F0Tm9ybWFsTWFwID0gZ2V0VGV4dHVyZSgganNvbi5jbGVhcmNvYXROb3JtYWxNYXAgKTtcclxuXHRcdGlmICgganNvbi5jbGVhcmNvYXROb3JtYWxTY2FsZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuY2xlYXJjb2F0Tm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMigpLmZyb21BcnJheSgganNvbi5jbGVhcmNvYXROb3JtYWxTY2FsZSApO1xyXG5cclxuXHRcdGlmICgganNvbi5pcmlkZXNjZW5jZU1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuaXJpZGVzY2VuY2VNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmlyaWRlc2NlbmNlTWFwICk7XHJcblx0XHRpZiAoIGpzb24uaXJpZGVzY2VuY2VUaGlja25lc3NNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwID0gZ2V0VGV4dHVyZSgganNvbi5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcCApO1xyXG5cclxuXHRcdGlmICgganNvbi50cmFuc21pc3Npb25NYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnRyYW5zbWlzc2lvbk1hcCA9IGdldFRleHR1cmUoIGpzb24udHJhbnNtaXNzaW9uTWFwICk7XHJcblx0XHRpZiAoIGpzb24udGhpY2tuZXNzTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC50aGlja25lc3NNYXAgPSBnZXRUZXh0dXJlKCBqc29uLnRoaWNrbmVzc01hcCApO1xyXG5cclxuXHRcdGlmICgganNvbi5hbmlzb3Ryb3B5TWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5hbmlzb3Ryb3B5TWFwID0gZ2V0VGV4dHVyZSgganNvbi5hbmlzb3Ryb3B5TWFwICk7XHJcblxyXG5cdFx0aWYgKCBqc29uLnNoZWVuQ29sb3JNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNoZWVuQ29sb3JNYXAgPSBnZXRUZXh0dXJlKCBqc29uLnNoZWVuQ29sb3JNYXAgKTtcclxuXHRcdGlmICgganNvbi5zaGVlblJvdWdobmVzc01hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc2hlZW5Sb3VnaG5lc3NNYXAgPSBnZXRUZXh0dXJlKCBqc29uLnNoZWVuUm91Z2huZXNzTWFwICk7XHJcblxyXG5cdFx0cmV0dXJuIG1hdGVyaWFsO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRleHR1cmVzIGFyZSBub3QgZW1iZWRkZWQgaW4gdGhlIG1hdGVyaWFsIEpTT04gc28gdGhleSBoYXZlXHJcblx0ICogdG8gYmUgaW5qZWN0ZWQgYmVmb3JlIHRoZSBsb2FkaW5nIHByb2Nlc3Mgc3RhcnRzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IHZhbHVlIC0gQSBkaWN0aW9uYXJ5IGhvbGRpbmcgdGV4dHVyZXMgZm9yIG1hdGVyaWFsIHByb3BlcnRpZXMuXHJcblx0ICogQHJldHVybiB7TWF0ZXJpYWxMb2FkZXJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbWF0ZXJpYWwgbG9hZGVyLlxyXG5cdCAqL1xyXG5cdHNldFRleHR1cmVzKCB2YWx1ZSApIHtcclxuXHJcblx0XHR0aGlzLnRleHR1cmVzID0gdmFsdWU7XHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGEgbWF0ZXJpYWwgZm9yIHRoZSBnaXZlbiB0eXBlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBUaGUgbWF0ZXJpYWwgdHlwZS5cclxuXHQgKiBAcmV0dXJuIHtNYXRlcmlhbH0gVGhlIG5ldyBtYXRlcmlhbC5cclxuXHQgKi9cclxuXHRjcmVhdGVNYXRlcmlhbEZyb21UeXBlKCB0eXBlICkge1xyXG5cclxuXHRcdHJldHVybiBNYXRlcmlhbExvYWRlci5jcmVhdGVNYXRlcmlhbEZyb21UeXBlKCB0eXBlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyBhIG1hdGVyaWFsIGZvciB0aGUgZ2l2ZW4gdHlwZS5cclxuXHQgKlxyXG5cdCAqIEBzdGF0aWNcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSBtYXRlcmlhbCB0eXBlLlxyXG5cdCAqIEByZXR1cm4ge01hdGVyaWFsfSBUaGUgbmV3IG1hdGVyaWFsLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBjcmVhdGVNYXRlcmlhbEZyb21UeXBlKCB0eXBlICkge1xyXG5cclxuXHRcdGNvbnN0IG1hdGVyaWFsTGliID0ge1xyXG5cdFx0XHRTaGFkb3dNYXRlcmlhbCxcclxuXHRcdFx0U3ByaXRlTWF0ZXJpYWwsXHJcblx0XHRcdFJhd1NoYWRlck1hdGVyaWFsLFxyXG5cdFx0XHRTaGFkZXJNYXRlcmlhbCxcclxuXHRcdFx0UG9pbnRzTWF0ZXJpYWwsXHJcblx0XHRcdE1lc2hQaHlzaWNhbE1hdGVyaWFsLFxyXG5cdFx0XHRNZXNoU3RhbmRhcmRNYXRlcmlhbCxcclxuXHRcdFx0TWVzaFBob25nTWF0ZXJpYWwsXHJcblx0XHRcdE1lc2hUb29uTWF0ZXJpYWwsXHJcblx0XHRcdE1lc2hOb3JtYWxNYXRlcmlhbCxcclxuXHRcdFx0TWVzaExhbWJlcnRNYXRlcmlhbCxcclxuXHRcdFx0TWVzaERlcHRoTWF0ZXJpYWwsXHJcblx0XHRcdE1lc2hEaXN0YW5jZU1hdGVyaWFsLFxyXG5cdFx0XHRNZXNoQmFzaWNNYXRlcmlhbCxcclxuXHRcdFx0TWVzaE1hdGNhcE1hdGVyaWFsLFxyXG5cdFx0XHRMaW5lRGFzaGVkTWF0ZXJpYWwsXHJcblx0XHRcdExpbmVCYXNpY01hdGVyaWFsLFxyXG5cdFx0XHRNYXRlcmlhbFxyXG5cdFx0fTtcclxuXHJcblx0XHRyZXR1cm4gbmV3IG1hdGVyaWFsTGliWyB0eXBlIF0oKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgTWF0ZXJpYWxMb2FkZXIgfTtcclxuIiwiLyoqXHJcbiAqIEEgY2xhc3Mgd2l0aCBsb2FkZXIgdXRpbGl0eSBmdW5jdGlvbnMuXHJcbiAqL1xyXG5jbGFzcyBMb2FkZXJVdGlscyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEV4dHJhY3RzIHRoZSBiYXNlIFVSTCBmcm9tIHRoZSBnaXZlbiBVUkwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdXJsIC1UaGUgVVJMIHRvIGV4dHJhY3QgdGhlIGJhc2UgVVJMIGZyb20uXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgZXh0cmFjdGVkIGJhc2UgVVJMLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBleHRyYWN0VXJsQmFzZSggdXJsICkge1xyXG5cclxuXHRcdGNvbnN0IGluZGV4ID0gdXJsLmxhc3RJbmRleE9mKCAnLycgKTtcclxuXHJcblx0XHRpZiAoIGluZGV4ID09PSAtIDEgKSByZXR1cm4gJy4vJztcclxuXHJcblx0XHRyZXR1cm4gdXJsLnNsaWNlKCAwLCBpbmRleCArIDEgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXNvbHZlcyByZWxhdGl2ZSBVUkxzIGFnYWluc3QgdGhlIGdpdmVuIHBhdGguIEFic29sdXRlIHBhdGhzLCBkYXRhIHVybHMsXHJcblx0ICogYW5kIGJsb2IgVVJMcyB3aWxsIGJlIHJldHVybmVkIGFzIGlzLiBJbnZhbGlkIFVSTHMgd2lsbCByZXR1cm4gYW4gZW1wdHlcclxuXHQgKiBzdHJpbmcuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdXJsIC1UaGUgVVJMIHRvIHJlc29sdmUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBUaGUgYmFzZSBwYXRoIGZvciByZWxhdGl2ZSBVUkxzIHRvIGJlIHJlc29sdmVkIGFnYWluc3QuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgcmVzb2x2ZWQgVVJMLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyByZXNvbHZlVVJMKCB1cmwsIHBhdGggKSB7XHJcblxyXG5cdFx0Ly8gSW52YWxpZCBVUkxcclxuXHRcdGlmICggdHlwZW9mIHVybCAhPT0gJ3N0cmluZycgfHwgdXJsID09PSAnJyApIHJldHVybiAnJztcclxuXHJcblx0XHQvLyBIb3N0IFJlbGF0aXZlIFVSTFxyXG5cdFx0aWYgKCAvXmh0dHBzPzpcXC9cXC8vaS50ZXN0KCBwYXRoICkgJiYgL15cXC8vLnRlc3QoIHVybCApICkge1xyXG5cclxuXHRcdFx0cGF0aCA9IHBhdGgucmVwbGFjZSggLyheaHR0cHM/OlxcL1xcL1teXFwvXSspLiovaSwgJyQxJyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBBYnNvbHV0ZSBVUkwgaHR0cDovLyxodHRwczovLywvL1xyXG5cdFx0aWYgKCAvXihodHRwcz86KT9cXC9cXC8vaS50ZXN0KCB1cmwgKSApIHJldHVybiB1cmw7XHJcblxyXG5cdFx0Ly8gRGF0YSBVUklcclxuXHRcdGlmICggL15kYXRhOi4qLC4qJC9pLnRlc3QoIHVybCApICkgcmV0dXJuIHVybDtcclxuXHJcblx0XHQvLyBCbG9iIFVSTFxyXG5cdFx0aWYgKCAvXmJsb2I6LiokL2kudGVzdCggdXJsICkgKSByZXR1cm4gdXJsO1xyXG5cclxuXHRcdC8vIFJlbGF0aXZlIFVSTFxyXG5cdFx0cmV0dXJuIHBhdGggKyB1cmw7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IExvYWRlclV0aWxzIH07XHJcbiIsImltcG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi9CdWZmZXJHZW9tZXRyeS5qcyc7XHJcblxyXG4vKipcclxuICogQW4gaW5zdGFuY2VkIHZlcnNpb24gb2YgYSBnZW9tZXRyeS5cclxuICovXHJcbmNsYXNzIEluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5IGV4dGVuZHMgQnVmZmVyR2VvbWV0cnkge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlZCBidWZmZXIgZ2VvbWV0cnkuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5JztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBpbnN0YW5jZSBjb3VudC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgSW5maW5pdHlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pbnN0YW5jZUNvdW50ID0gSW5maW5pdHk7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHRcdHRoaXMuaW5zdGFuY2VDb3VudCA9IHNvdXJjZS5pbnN0YW5jZUNvdW50O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdHRvSlNPTigpIHtcclxuXHJcblx0XHRjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCk7XHJcblxyXG5cdFx0ZGF0YS5pbnN0YW5jZUNvdW50ID0gdGhpcy5pbnN0YW5jZUNvdW50O1xyXG5cclxuXHRcdGRhdGEuaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSA9IHRydWU7XHJcblxyXG5cdFx0cmV0dXJuIGRhdGE7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IEluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5IH07XHJcbiIsImltcG9ydCB7IFNwaGVyZSB9IGZyb20gJy4uL21hdGgvU3BoZXJlLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcbmltcG9ydCB7IEJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyQXR0cmlidXRlLmpzJztcclxuaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcclxuaW1wb3J0IHsgRmlsZUxvYWRlciB9IGZyb20gJy4vRmlsZUxvYWRlci5qcyc7XHJcbmltcG9ydCB7IExvYWRlciB9IGZyb20gJy4vTG9hZGVyLmpzJztcclxuaW1wb3J0IHsgSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5LmpzJztcclxuaW1wb3J0IHsgSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9JbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5pbXBvcnQgeyBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5pbXBvcnQgeyBJbnRlcmxlYXZlZEJ1ZmZlciB9IGZyb20gJy4uL2NvcmUvSW50ZXJsZWF2ZWRCdWZmZXIuanMnO1xyXG5pbXBvcnQgeyBnZXRUeXBlZEFycmF5IH0gZnJvbSAnLi4vdXRpbHMuanMnO1xyXG5cclxuLyoqXHJcbiAqIENsYXNzIGZvciBsb2FkaW5nIGdlb21ldHJpZXMuIFRoZSBmaWxlcyBhcmUgaW50ZXJuYWxseVxyXG4gKiBsb2FkZWQgdmlhIHtAbGluayBGaWxlTG9hZGVyfS5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgbG9hZGVyID0gbmV3IFRIUkVFLkJ1ZmZlckdlb21ldHJ5TG9hZGVyKCk7XHJcbiAqIGNvbnN0IGdlb21ldHJ5ID0gYXdhaXQgbG9hZGVyLmxvYWRBc3luYyggJ21vZGVscy9qc29uL3ByZXNzdXJlLmpzb24nICk7XHJcbiAqXHJcbiAqIGNvbnN0IG1hdGVyaWFsID0gbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiAweEY1RjVGNSB9ICk7XHJcbiAqIGNvbnN0IG9iamVjdCA9IG5ldyBUSFJFRS5NZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuICogc2NlbmUuYWRkKCBvYmplY3QgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBMb2FkZXJcclxuICovXHJcbmNsYXNzIEJ1ZmZlckdlb21ldHJ5TG9hZGVyIGV4dGVuZHMgTG9hZGVyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBnZW9tZXRyeSBsb2FkZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0xvYWRpbmdNYW5hZ2VyfSBbbWFuYWdlcl0gLSBUaGUgbG9hZGluZyBtYW5hZ2VyLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBtYW5hZ2VyICkge1xyXG5cclxuXHRcdHN1cGVyKCBtYW5hZ2VyICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3RhcnRzIGxvYWRpbmcgZnJvbSB0aGUgZ2l2ZW4gVVJMIGFuZCBwYXNzIHRoZSBsb2FkZWQgZ2VvbWV0cnkgdG8gdGhlIGBvbkxvYWQoKWAgY2FsbGJhY2suXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gVGhlIHBhdGgvVVJMIG9mIHRoZSBmaWxlIHRvIGJlIGxvYWRlZC4gVGhpcyBjYW4gYWxzbyBiZSBhIGRhdGEgVVJJLlxyXG5cdCAqIEBwYXJhbSB7ZnVuY3Rpb24oQnVmZmVyR2VvbWV0cnkpfSBvbkxvYWQgLSBFeGVjdXRlZCB3aGVuIHRoZSBsb2FkaW5nIHByb2Nlc3MgaGFzIGJlZW4gZmluaXNoZWQuXHJcblx0ICogQHBhcmFtIHtvblByb2dyZXNzQ2FsbGJhY2t9IG9uUHJvZ3Jlc3MgLSBFeGVjdXRlZCB3aGlsZSB0aGUgbG9hZGluZyBpcyBpbiBwcm9ncmVzcy5cclxuXHQgKiBAcGFyYW0ge29uRXJyb3JDYWxsYmFja30gb25FcnJvciAtIEV4ZWN1dGVkIHdoZW4gZXJyb3JzIG9jY3VyLlxyXG5cdCAqL1xyXG5cdGxvYWQoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xyXG5cclxuXHRcdGNvbnN0IHNjb3BlID0gdGhpcztcclxuXHJcblx0XHRjb25zdCBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggc2NvcGUubWFuYWdlciApO1xyXG5cdFx0bG9hZGVyLnNldFBhdGgoIHNjb3BlLnBhdGggKTtcclxuXHRcdGxvYWRlci5zZXRSZXF1ZXN0SGVhZGVyKCBzY29wZS5yZXF1ZXN0SGVhZGVyICk7XHJcblx0XHRsb2FkZXIuc2V0V2l0aENyZWRlbnRpYWxzKCBzY29wZS53aXRoQ3JlZGVudGlhbHMgKTtcclxuXHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggdGV4dCApIHtcclxuXHJcblx0XHRcdHRyeSB7XHJcblxyXG5cdFx0XHRcdG9uTG9hZCggc2NvcGUucGFyc2UoIEpTT04ucGFyc2UoIHRleHQgKSApICk7XHJcblxyXG5cdFx0XHR9IGNhdGNoICggZSApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBvbkVycm9yICkge1xyXG5cclxuXHRcdFx0XHRcdG9uRXJyb3IoIGUgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCBlICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRXJyb3IoIHVybCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQYXJzZXMgdGhlIGdpdmVuIEpTT04gb2JqZWN0IGFuZCByZXR1cm5zIGEgZ2VvbWV0cnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0ganNvbiAtIFRoZSBzZXJpYWxpemVkIGdlb21ldHJ5LlxyXG5cdCAqIEByZXR1cm4ge0J1ZmZlckdlb21ldHJ5fSBUaGUgcGFyc2VkIGdlb21ldHJ5LlxyXG5cdCAqL1xyXG5cdHBhcnNlKCBqc29uICkge1xyXG5cclxuXHRcdGNvbnN0IGludGVybGVhdmVkQnVmZmVyTWFwID0ge307XHJcblx0XHRjb25zdCBhcnJheUJ1ZmZlck1hcCA9IHt9O1xyXG5cclxuXHRcdGZ1bmN0aW9uIGdldEludGVybGVhdmVkQnVmZmVyKCBqc29uLCB1dWlkICkge1xyXG5cclxuXHRcdFx0aWYgKCBpbnRlcmxlYXZlZEJ1ZmZlck1hcFsgdXVpZCBdICE9PSB1bmRlZmluZWQgKSByZXR1cm4gaW50ZXJsZWF2ZWRCdWZmZXJNYXBbIHV1aWQgXTtcclxuXHJcblx0XHRcdGNvbnN0IGludGVybGVhdmVkQnVmZmVycyA9IGpzb24uaW50ZXJsZWF2ZWRCdWZmZXJzO1xyXG5cdFx0XHRjb25zdCBpbnRlcmxlYXZlZEJ1ZmZlciA9IGludGVybGVhdmVkQnVmZmVyc1sgdXVpZCBdO1xyXG5cclxuXHRcdFx0Y29uc3QgYnVmZmVyID0gZ2V0QXJyYXlCdWZmZXIoIGpzb24sIGludGVybGVhdmVkQnVmZmVyLmJ1ZmZlciApO1xyXG5cclxuXHRcdFx0Y29uc3QgYXJyYXkgPSBnZXRUeXBlZEFycmF5KCBpbnRlcmxlYXZlZEJ1ZmZlci50eXBlLCBidWZmZXIgKTtcclxuXHRcdFx0Y29uc3QgaWIgPSBuZXcgSW50ZXJsZWF2ZWRCdWZmZXIoIGFycmF5LCBpbnRlcmxlYXZlZEJ1ZmZlci5zdHJpZGUgKTtcclxuXHRcdFx0aWIudXVpZCA9IGludGVybGVhdmVkQnVmZmVyLnV1aWQ7XHJcblxyXG5cdFx0XHRpbnRlcmxlYXZlZEJ1ZmZlck1hcFsgdXVpZCBdID0gaWI7XHJcblxyXG5cdFx0XHRyZXR1cm4gaWI7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIGdldEFycmF5QnVmZmVyKCBqc29uLCB1dWlkICkge1xyXG5cclxuXHRcdFx0aWYgKCBhcnJheUJ1ZmZlck1hcFsgdXVpZCBdICE9PSB1bmRlZmluZWQgKSByZXR1cm4gYXJyYXlCdWZmZXJNYXBbIHV1aWQgXTtcclxuXHJcblx0XHRcdGNvbnN0IGFycmF5QnVmZmVycyA9IGpzb24uYXJyYXlCdWZmZXJzO1xyXG5cdFx0XHRjb25zdCBhcnJheUJ1ZmZlciA9IGFycmF5QnVmZmVyc1sgdXVpZCBdO1xyXG5cclxuXHRcdFx0Y29uc3QgYWIgPSBuZXcgVWludDMyQXJyYXkoIGFycmF5QnVmZmVyICkuYnVmZmVyO1xyXG5cclxuXHRcdFx0YXJyYXlCdWZmZXJNYXBbIHV1aWQgXSA9IGFiO1xyXG5cclxuXHRcdFx0cmV0dXJuIGFiO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeSA9IGpzb24uaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSA/IG5ldyBJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSgpIDogbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XHJcblxyXG5cdFx0Y29uc3QgaW5kZXggPSBqc29uLmRhdGEuaW5kZXg7XHJcblxyXG5cdFx0aWYgKCBpbmRleCAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdHlwZWRBcnJheSA9IGdldFR5cGVkQXJyYXkoIGluZGV4LnR5cGUsIGluZGV4LmFycmF5ICk7XHJcblx0XHRcdGdlb21ldHJ5LnNldEluZGV4KCBuZXcgQnVmZmVyQXR0cmlidXRlKCB0eXBlZEFycmF5LCAxICkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgYXR0cmlidXRlcyA9IGpzb24uZGF0YS5hdHRyaWJ1dGVzO1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IGtleSBpbiBhdHRyaWJ1dGVzICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYXR0cmlidXRlID0gYXR0cmlidXRlc1sga2V5IF07XHJcblx0XHRcdGxldCBidWZmZXJBdHRyaWJ1dGU7XHJcblxyXG5cdFx0XHRpZiAoIGF0dHJpYnV0ZS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBpbnRlcmxlYXZlZEJ1ZmZlciA9IGdldEludGVybGVhdmVkQnVmZmVyKCBqc29uLmRhdGEsIGF0dHJpYnV0ZS5kYXRhICk7XHJcblx0XHRcdFx0YnVmZmVyQXR0cmlidXRlID0gbmV3IEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKCBpbnRlcmxlYXZlZEJ1ZmZlciwgYXR0cmlidXRlLml0ZW1TaXplLCBhdHRyaWJ1dGUub2Zmc2V0LCBhdHRyaWJ1dGUubm9ybWFsaXplZCApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgdHlwZWRBcnJheSA9IGdldFR5cGVkQXJyYXkoIGF0dHJpYnV0ZS50eXBlLCBhdHRyaWJ1dGUuYXJyYXkgKTtcclxuXHRcdFx0XHRjb25zdCBidWZmZXJBdHRyaWJ1dGVDb25zdHIgPSBhdHRyaWJ1dGUuaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUgPyBJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUgOiBCdWZmZXJBdHRyaWJ1dGU7XHJcblx0XHRcdFx0YnVmZmVyQXR0cmlidXRlID0gbmV3IGJ1ZmZlckF0dHJpYnV0ZUNvbnN0ciggdHlwZWRBcnJheSwgYXR0cmlidXRlLml0ZW1TaXplLCBhdHRyaWJ1dGUubm9ybWFsaXplZCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUubmFtZSAhPT0gdW5kZWZpbmVkICkgYnVmZmVyQXR0cmlidXRlLm5hbWUgPSBhdHRyaWJ1dGUubmFtZTtcclxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUudXNhZ2UgIT09IHVuZGVmaW5lZCApIGJ1ZmZlckF0dHJpYnV0ZS5zZXRVc2FnZSggYXR0cmlidXRlLnVzYWdlICk7XHJcblxyXG5cdFx0XHRnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoIGtleSwgYnVmZmVyQXR0cmlidXRlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IG1vcnBoQXR0cmlidXRlcyA9IGpzb24uZGF0YS5tb3JwaEF0dHJpYnV0ZXM7XHJcblxyXG5cdFx0aWYgKCBtb3JwaEF0dHJpYnV0ZXMgKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBjb25zdCBrZXkgaW4gbW9ycGhBdHRyaWJ1dGVzICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBhdHRyaWJ1dGVBcnJheSA9IG1vcnBoQXR0cmlidXRlc1sga2V5IF07XHJcblxyXG5cdFx0XHRcdGNvbnN0IGFycmF5ID0gW107XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBhdHRyaWJ1dGVBcnJheS5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVBcnJheVsgaSBdO1xyXG5cdFx0XHRcdFx0bGV0IGJ1ZmZlckF0dHJpYnV0ZTtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGF0dHJpYnV0ZS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgaW50ZXJsZWF2ZWRCdWZmZXIgPSBnZXRJbnRlcmxlYXZlZEJ1ZmZlcigganNvbi5kYXRhLCBhdHRyaWJ1dGUuZGF0YSApO1xyXG5cdFx0XHRcdFx0XHRidWZmZXJBdHRyaWJ1dGUgPSBuZXcgSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUoIGludGVybGVhdmVkQnVmZmVyLCBhdHRyaWJ1dGUuaXRlbVNpemUsIGF0dHJpYnV0ZS5vZmZzZXQsIGF0dHJpYnV0ZS5ub3JtYWxpemVkICk7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnN0IHR5cGVkQXJyYXkgPSBnZXRUeXBlZEFycmF5KCBhdHRyaWJ1dGUudHlwZSwgYXR0cmlidXRlLmFycmF5ICk7XHJcblx0XHRcdFx0XHRcdGJ1ZmZlckF0dHJpYnV0ZSA9IG5ldyBCdWZmZXJBdHRyaWJ1dGUoIHR5cGVkQXJyYXksIGF0dHJpYnV0ZS5pdGVtU2l6ZSwgYXR0cmlidXRlLm5vcm1hbGl6ZWQgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBhdHRyaWJ1dGUubmFtZSAhPT0gdW5kZWZpbmVkICkgYnVmZmVyQXR0cmlidXRlLm5hbWUgPSBhdHRyaWJ1dGUubmFtZTtcclxuXHRcdFx0XHRcdGFycmF5LnB1c2goIGJ1ZmZlckF0dHJpYnV0ZSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlc1sga2V5IF0gPSBhcnJheTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgbW9ycGhUYXJnZXRzUmVsYXRpdmUgPSBqc29uLmRhdGEubW9ycGhUYXJnZXRzUmVsYXRpdmU7XHJcblxyXG5cdFx0aWYgKCBtb3JwaFRhcmdldHNSZWxhdGl2ZSApIHtcclxuXHJcblx0XHRcdGdlb21ldHJ5Lm1vcnBoVGFyZ2V0c1JlbGF0aXZlID0gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgZ3JvdXBzID0ganNvbi5kYXRhLmdyb3VwcyB8fCBqc29uLmRhdGEuZHJhd2NhbGxzIHx8IGpzb24uZGF0YS5vZmZzZXRzO1xyXG5cclxuXHRcdGlmICggZ3JvdXBzICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIG4gPSBncm91cHMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBncm91cCA9IGdyb3Vwc1sgaSBdO1xyXG5cclxuXHRcdFx0XHRnZW9tZXRyeS5hZGRHcm91cCggZ3JvdXAuc3RhcnQsIGdyb3VwLmNvdW50LCBncm91cC5tYXRlcmlhbEluZGV4ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGJvdW5kaW5nU3BoZXJlID0ganNvbi5kYXRhLmJvdW5kaW5nU3BoZXJlO1xyXG5cclxuXHRcdGlmICggYm91bmRpbmdTcGhlcmUgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGNlbnRlciA9IG5ldyBWZWN0b3IzKCk7XHJcblxyXG5cdFx0XHRpZiAoIGJvdW5kaW5nU3BoZXJlLmNlbnRlciAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRjZW50ZXIuZnJvbUFycmF5KCBib3VuZGluZ1NwaGVyZS5jZW50ZXIgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID0gbmV3IFNwaGVyZSggY2VudGVyLCBib3VuZGluZ1NwaGVyZS5yYWRpdXMgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBqc29uLm5hbWUgKSBnZW9tZXRyeS5uYW1lID0ganNvbi5uYW1lO1xyXG5cdFx0aWYgKCBqc29uLnVzZXJEYXRhICkgZ2VvbWV0cnkudXNlckRhdGEgPSBqc29uLnVzZXJEYXRhO1xyXG5cclxuXHRcdHJldHVybiBnZW9tZXRyeTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgQnVmZmVyR2VvbWV0cnlMb2FkZXIgfTtcclxuIiwiaW1wb3J0IHtcclxuXHRVVk1hcHBpbmcsXHJcblx0Q3ViZVJlZmxlY3Rpb25NYXBwaW5nLFxyXG5cdEN1YmVSZWZyYWN0aW9uTWFwcGluZyxcclxuXHRFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZyxcclxuXHRFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZyxcclxuXHRDdWJlVVZSZWZsZWN0aW9uTWFwcGluZyxcclxuXHJcblx0UmVwZWF0V3JhcHBpbmcsXHJcblx0Q2xhbXBUb0VkZ2VXcmFwcGluZyxcclxuXHRNaXJyb3JlZFJlcGVhdFdyYXBwaW5nLFxyXG5cclxuXHROZWFyZXN0RmlsdGVyLFxyXG5cdE5lYXJlc3RNaXBtYXBOZWFyZXN0RmlsdGVyLFxyXG5cdE5lYXJlc3RNaXBtYXBMaW5lYXJGaWx0ZXIsXHJcblx0TGluZWFyRmlsdGVyLFxyXG5cdExpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXIsXHJcblx0TGluZWFyTWlwbWFwTGluZWFyRmlsdGVyXHJcbn0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9JbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5pbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uL21hdGgvQ29sb3IuanMnO1xyXG5pbXBvcnQgeyBPYmplY3QzRCB9IGZyb20gJy4uL2NvcmUvT2JqZWN0M0QuanMnO1xyXG5pbXBvcnQgeyBHcm91cCB9IGZyb20gJy4uL29iamVjdHMvR3JvdXAuanMnO1xyXG5pbXBvcnQgeyBJbnN0YW5jZWRNZXNoIH0gZnJvbSAnLi4vb2JqZWN0cy9JbnN0YW5jZWRNZXNoLmpzJztcclxuaW1wb3J0IHsgQmF0Y2hlZE1lc2ggfSBmcm9tICcuLi9vYmplY3RzL0JhdGNoZWRNZXNoLmpzJztcclxuaW1wb3J0IHsgU3ByaXRlIH0gZnJvbSAnLi4vb2JqZWN0cy9TcHJpdGUuanMnO1xyXG5pbXBvcnQgeyBQb2ludHMgfSBmcm9tICcuLi9vYmplY3RzL1BvaW50cy5qcyc7XHJcbmltcG9ydCB7IExpbmUgfSBmcm9tICcuLi9vYmplY3RzL0xpbmUuanMnO1xyXG5pbXBvcnQgeyBMaW5lTG9vcCB9IGZyb20gJy4uL29iamVjdHMvTGluZUxvb3AuanMnO1xyXG5pbXBvcnQgeyBMaW5lU2VnbWVudHMgfSBmcm9tICcuLi9vYmplY3RzL0xpbmVTZWdtZW50cy5qcyc7XHJcbmltcG9ydCB7IExPRCB9IGZyb20gJy4uL29iamVjdHMvTE9ELmpzJztcclxuaW1wb3J0IHsgTWVzaCB9IGZyb20gJy4uL29iamVjdHMvTWVzaC5qcyc7XHJcbmltcG9ydCB7IFNraW5uZWRNZXNoIH0gZnJvbSAnLi4vb2JqZWN0cy9Ta2lubmVkTWVzaC5qcyc7XHJcbmltcG9ydCB7IEJvbmUgfSBmcm9tICcuLi9vYmplY3RzL0JvbmUuanMnO1xyXG5pbXBvcnQgeyBTa2VsZXRvbiB9IGZyb20gJy4uL29iamVjdHMvU2tlbGV0b24uanMnO1xyXG5pbXBvcnQgeyBTaGFwZSB9IGZyb20gJy4uL2V4dHJhcy9jb3JlL1NoYXBlLmpzJztcclxuaW1wb3J0IHsgRm9nIH0gZnJvbSAnLi4vc2NlbmVzL0ZvZy5qcyc7XHJcbmltcG9ydCB7IEZvZ0V4cDIgfSBmcm9tICcuLi9zY2VuZXMvRm9nRXhwMi5qcyc7XHJcbmltcG9ydCB7IEhlbWlzcGhlcmVMaWdodCB9IGZyb20gJy4uL2xpZ2h0cy9IZW1pc3BoZXJlTGlnaHQuanMnO1xyXG5pbXBvcnQgeyBTcG90TGlnaHQgfSBmcm9tICcuLi9saWdodHMvU3BvdExpZ2h0LmpzJztcclxuaW1wb3J0IHsgUG9pbnRMaWdodCB9IGZyb20gJy4uL2xpZ2h0cy9Qb2ludExpZ2h0LmpzJztcclxuaW1wb3J0IHsgRGlyZWN0aW9uYWxMaWdodCB9IGZyb20gJy4uL2xpZ2h0cy9EaXJlY3Rpb25hbExpZ2h0LmpzJztcclxuaW1wb3J0IHsgQW1iaWVudExpZ2h0IH0gZnJvbSAnLi4vbGlnaHRzL0FtYmllbnRMaWdodC5qcyc7XHJcbmltcG9ydCB7IFJlY3RBcmVhTGlnaHQgfSBmcm9tICcuLi9saWdodHMvUmVjdEFyZWFMaWdodC5qcyc7XHJcbmltcG9ydCB7IExpZ2h0UHJvYmUgfSBmcm9tICcuLi9saWdodHMvTGlnaHRQcm9iZS5qcyc7XHJcbmltcG9ydCB7IE9ydGhvZ3JhcGhpY0NhbWVyYSB9IGZyb20gJy4uL2NhbWVyYXMvT3J0aG9ncmFwaGljQ2FtZXJhLmpzJztcclxuaW1wb3J0IHsgUGVyc3BlY3RpdmVDYW1lcmEgfSBmcm9tICcuLi9jYW1lcmFzL1BlcnNwZWN0aXZlQ2FtZXJhLmpzJztcclxuaW1wb3J0IHsgU2NlbmUgfSBmcm9tICcuLi9zY2VuZXMvU2NlbmUuanMnO1xyXG5pbXBvcnQgeyBDdWJlVGV4dHVyZSB9IGZyb20gJy4uL3RleHR1cmVzL0N1YmVUZXh0dXJlLmpzJztcclxuaW1wb3J0IHsgVGV4dHVyZSB9IGZyb20gJy4uL3RleHR1cmVzL1RleHR1cmUuanMnO1xyXG5pbXBvcnQgeyBTb3VyY2UgfSBmcm9tICcuLi90ZXh0dXJlcy9Tb3VyY2UuanMnO1xyXG5pbXBvcnQgeyBEYXRhVGV4dHVyZSB9IGZyb20gJy4uL3RleHR1cmVzL0RhdGFUZXh0dXJlLmpzJztcclxuaW1wb3J0IHsgSW1hZ2VMb2FkZXIgfSBmcm9tICcuL0ltYWdlTG9hZGVyLmpzJztcclxuaW1wb3J0IHsgTG9hZGluZ01hbmFnZXIgfSBmcm9tICcuL0xvYWRpbmdNYW5hZ2VyLmpzJztcclxuaW1wb3J0IHsgQW5pbWF0aW9uQ2xpcCB9IGZyb20gJy4uL2FuaW1hdGlvbi9BbmltYXRpb25DbGlwLmpzJztcclxuaW1wb3J0IHsgTWF0ZXJpYWxMb2FkZXIgfSBmcm9tICcuL01hdGVyaWFsTG9hZGVyLmpzJztcclxuaW1wb3J0IHsgTG9hZGVyVXRpbHMgfSBmcm9tICcuL0xvYWRlclV0aWxzLmpzJztcclxuaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnlMb2FkZXIgfSBmcm9tICcuL0J1ZmZlckdlb21ldHJ5TG9hZGVyLmpzJztcclxuaW1wb3J0IHsgTG9hZGVyIH0gZnJvbSAnLi9Mb2FkZXIuanMnO1xyXG5pbXBvcnQgeyBGaWxlTG9hZGVyIH0gZnJvbSAnLi9GaWxlTG9hZGVyLmpzJztcclxuaW1wb3J0ICogYXMgR2VvbWV0cmllcyBmcm9tICcuLi9nZW9tZXRyaWVzL0dlb21ldHJpZXMuanMnO1xyXG5pbXBvcnQgeyBnZXRUeXBlZEFycmF5IH0gZnJvbSAnLi4vdXRpbHMuanMnO1xyXG5pbXBvcnQgeyBCb3gzIH0gZnJvbSAnLi4vbWF0aC9Cb3gzLmpzJztcclxuaW1wb3J0IHsgU3BoZXJlIH0gZnJvbSAnLi4vbWF0aC9TcGhlcmUuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgbG9hZGVyIGZvciBsb2FkaW5nIGEgSlNPTiByZXNvdXJjZSBpbiB0aGUgW0pTT04gT2JqZWN0L1NjZW5lIGZvcm1hdF17QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL21yZG9vYi90aHJlZS5qcy93aWtpL0pTT04tT2JqZWN0LVNjZW5lLWZvcm1hdC00fS5cclxuICogVGhlIGZpbGVzIGFyZSBpbnRlcm5hbGx5IGxvYWRlZCB2aWEge0BsaW5rIEZpbGVMb2FkZXJ9LlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBsb2FkZXIgPSBuZXcgVEhSRUUuT2JqZWN0TG9hZGVyKCk7XHJcbiAqIGNvbnN0IG9iaiA9IGF3YWl0IGxvYWRlci5sb2FkQXN5bmMoICdtb2RlbHMvanNvbi9leGFtcGxlLmpzb24nICk7XHJcbiAqIHNjZW5lLmFkZCggb2JqICk7XHJcbiAqXHJcbiAqIC8vIEFsdGVybmF0aXZlbHksIHRvIHBhcnNlIGEgcHJldmlvdXNseSBsb2FkZWQgSlNPTiBzdHJ1Y3R1cmVcclxuICogY29uc3Qgb2JqZWN0ID0gYXdhaXQgbG9hZGVyLnBhcnNlQXN5bmMoIGFfanNvbl9vYmplY3QgKTtcclxuICogc2NlbmUuYWRkKCBvYmplY3QgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBMb2FkZXJcclxuICovXHJcbmNsYXNzIE9iamVjdExvYWRlciBleHRlbmRzIExvYWRlciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgb2JqZWN0IGxvYWRlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TG9hZGluZ01hbmFnZXJ9IFttYW5hZ2VyXSAtIFRoZSBsb2FkaW5nIG1hbmFnZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG1hbmFnZXIgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG1hbmFnZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTdGFydHMgbG9hZGluZyBmcm9tIHRoZSBnaXZlbiBVUkwgYW5kIHBhc3MgdGhlIGxvYWRlZCAzRCBvYmplY3QgdG8gdGhlIGBvbkxvYWQoKWAgY2FsbGJhY2suXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gVGhlIHBhdGgvVVJMIG9mIHRoZSBmaWxlIHRvIGJlIGxvYWRlZC4gVGhpcyBjYW4gYWxzbyBiZSBhIGRhdGEgVVJJLlxyXG5cdCAqIEBwYXJhbSB7ZnVuY3Rpb24oT2JqZWN0M0QpfSBvbkxvYWQgLSBFeGVjdXRlZCB3aGVuIHRoZSBsb2FkaW5nIHByb2Nlc3MgaGFzIGJlZW4gZmluaXNoZWQuXHJcblx0ICogQHBhcmFtIHtvblByb2dyZXNzQ2FsbGJhY2t9IG9uUHJvZ3Jlc3MgLSBFeGVjdXRlZCB3aGlsZSB0aGUgbG9hZGluZyBpcyBpbiBwcm9ncmVzcy5cclxuXHQgKiBAcGFyYW0ge29uRXJyb3JDYWxsYmFja30gb25FcnJvciAtIEV4ZWN1dGVkIHdoZW4gZXJyb3JzIG9jY3VyLlxyXG5cdCAqL1xyXG5cdGxvYWQoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xyXG5cclxuXHRcdGNvbnN0IHNjb3BlID0gdGhpcztcclxuXHJcblx0XHRjb25zdCBwYXRoID0gKCB0aGlzLnBhdGggPT09ICcnICkgPyBMb2FkZXJVdGlscy5leHRyYWN0VXJsQmFzZSggdXJsICkgOiB0aGlzLnBhdGg7XHJcblx0XHR0aGlzLnJlc291cmNlUGF0aCA9IHRoaXMucmVzb3VyY2VQYXRoIHx8IHBhdGg7XHJcblxyXG5cdFx0Y29uc3QgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIoIHRoaXMubWFuYWdlciApO1xyXG5cdFx0bG9hZGVyLnNldFBhdGgoIHRoaXMucGF0aCApO1xyXG5cdFx0bG9hZGVyLnNldFJlcXVlc3RIZWFkZXIoIHRoaXMucmVxdWVzdEhlYWRlciApO1xyXG5cdFx0bG9hZGVyLnNldFdpdGhDcmVkZW50aWFscyggdGhpcy53aXRoQ3JlZGVudGlhbHMgKTtcclxuXHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggdGV4dCApIHtcclxuXHJcblx0XHRcdGxldCBqc29uID0gbnVsbDtcclxuXHJcblx0XHRcdHRyeSB7XHJcblxyXG5cdFx0XHRcdGpzb24gPSBKU09OLnBhcnNlKCB0ZXh0ICk7XHJcblxyXG5cdFx0XHR9IGNhdGNoICggZXJyb3IgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggb25FcnJvciAhPT0gdW5kZWZpbmVkICkgb25FcnJvciggZXJyb3IgKTtcclxuXHJcblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFOk9iamVjdExvYWRlcjogQ2FuXFwndCBwYXJzZSAnICsgdXJsICsgJy4nLCBlcnJvci5tZXNzYWdlICk7XHJcblxyXG5cdFx0XHRcdHJldHVybjtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IG1ldGFkYXRhID0ganNvbi5tZXRhZGF0YTtcclxuXHJcblx0XHRcdGlmICggbWV0YWRhdGEgPT09IHVuZGVmaW5lZCB8fCBtZXRhZGF0YS50eXBlID09PSB1bmRlZmluZWQgfHwgbWV0YWRhdGEudHlwZS50b0xvd2VyQ2FzZSgpID09PSAnZ2VvbWV0cnknICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIG9uRXJyb3IgIT09IHVuZGVmaW5lZCApIG9uRXJyb3IoIG5ldyBFcnJvciggJ1RIUkVFLk9iamVjdExvYWRlcjogQ2FuXFwndCBsb2FkICcgKyB1cmwgKSApO1xyXG5cclxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuT2JqZWN0TG9hZGVyOiBDYW5cXCd0IGxvYWQgJyArIHVybCApO1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHNjb3BlLnBhcnNlKCBqc29uLCBvbkxvYWQgKTtcclxuXHJcblx0XHR9LCBvblByb2dyZXNzLCBvbkVycm9yICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQXN5bmMgdmVyc2lvbiBvZiB7QGxpbmsgT2JqZWN0TG9hZGVyI2xvYWR9LlxyXG5cdCAqXHJcblx0ICogQGFzeW5jXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIFRoZSBwYXRoL1VSTCBvZiB0aGUgZmlsZSB0byBiZSBsb2FkZWQuIFRoaXMgY2FuIGFsc28gYmUgYSBkYXRhIFVSSS5cclxuXHQgKiBAcGFyYW0ge29uUHJvZ3Jlc3NDYWxsYmFja30gb25Qcm9ncmVzcyAtIEV4ZWN1dGVkIHdoaWxlIHRoZSBsb2FkaW5nIGlzIGluIHByb2dyZXNzLlxyXG5cdCAqIEByZXR1cm4ge1Byb21pc2U8T2JqZWN0M0Q+fSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBsb2FkZWQgM0Qgb2JqZWN0LlxyXG5cdCAqL1xyXG5cdGFzeW5jIGxvYWRBc3luYyggdXJsLCBvblByb2dyZXNzICkge1xyXG5cclxuXHRcdGNvbnN0IHNjb3BlID0gdGhpcztcclxuXHJcblx0XHRjb25zdCBwYXRoID0gKCB0aGlzLnBhdGggPT09ICcnICkgPyBMb2FkZXJVdGlscy5leHRyYWN0VXJsQmFzZSggdXJsICkgOiB0aGlzLnBhdGg7XHJcblx0XHR0aGlzLnJlc291cmNlUGF0aCA9IHRoaXMucmVzb3VyY2VQYXRoIHx8IHBhdGg7XHJcblxyXG5cdFx0Y29uc3QgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIoIHRoaXMubWFuYWdlciApO1xyXG5cdFx0bG9hZGVyLnNldFBhdGgoIHRoaXMucGF0aCApO1xyXG5cdFx0bG9hZGVyLnNldFJlcXVlc3RIZWFkZXIoIHRoaXMucmVxdWVzdEhlYWRlciApO1xyXG5cdFx0bG9hZGVyLnNldFdpdGhDcmVkZW50aWFscyggdGhpcy53aXRoQ3JlZGVudGlhbHMgKTtcclxuXHJcblx0XHRjb25zdCB0ZXh0ID0gYXdhaXQgbG9hZGVyLmxvYWRBc3luYyggdXJsLCBvblByb2dyZXNzICk7XHJcblxyXG5cdFx0Y29uc3QganNvbiA9IEpTT04ucGFyc2UoIHRleHQgKTtcclxuXHJcblx0XHRjb25zdCBtZXRhZGF0YSA9IGpzb24ubWV0YWRhdGE7XHJcblxyXG5cdFx0aWYgKCBtZXRhZGF0YSA9PT0gdW5kZWZpbmVkIHx8IG1ldGFkYXRhLnR5cGUgPT09IHVuZGVmaW5lZCB8fCBtZXRhZGF0YS50eXBlLnRvTG93ZXJDYXNlKCkgPT09ICdnZW9tZXRyeScgKSB7XHJcblxyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5PYmplY3RMb2FkZXI6IENhblxcJ3QgbG9hZCAnICsgdXJsICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBhd2FpdCBzY29wZS5wYXJzZUFzeW5jKCBqc29uICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUGFyc2VzIHRoZSBnaXZlbiBKU09OLiBUaGlzIGlzIHVzZWQgaW50ZXJuYWxseSBieSB7QGxpbmsgT2JqZWN0TG9hZGVyI2xvYWR9XHJcblx0ICogYnV0IGNhbiBhbHNvIGJlIHVzZWQgZGlyZWN0bHkgdG8gcGFyc2UgYSBwcmV2aW91c2x5IGxvYWRlZCBKU09OIHN0cnVjdHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBqc29uIC0gVGhlIHNlcmlhbGl6ZWQgM0Qgb2JqZWN0LlxyXG5cdCAqIEBwYXJhbSB7b25Mb2FkfSBvbkxvYWQgLSBFeGVjdXRlZCB3aGVuIGFsbCByZXNvdXJjZXMgKGUuZy4gdGV4dHVyZXMpIGhhdmUgYmVlbiBmdWxseSBsb2FkZWQuXHJcblx0ICogQHJldHVybiB7T2JqZWN0M0R9IFRoZSBwYXJzZWQgM0Qgb2JqZWN0LlxyXG5cdCAqL1xyXG5cdHBhcnNlKCBqc29uLCBvbkxvYWQgKSB7XHJcblxyXG5cdFx0Y29uc3QgYW5pbWF0aW9ucyA9IHRoaXMucGFyc2VBbmltYXRpb25zKCBqc29uLmFuaW1hdGlvbnMgKTtcclxuXHRcdGNvbnN0IHNoYXBlcyA9IHRoaXMucGFyc2VTaGFwZXMoIGpzb24uc2hhcGVzICk7XHJcblx0XHRjb25zdCBnZW9tZXRyaWVzID0gdGhpcy5wYXJzZUdlb21ldHJpZXMoIGpzb24uZ2VvbWV0cmllcywgc2hhcGVzICk7XHJcblxyXG5cdFx0Y29uc3QgaW1hZ2VzID0gdGhpcy5wYXJzZUltYWdlcygganNvbi5pbWFnZXMsIGZ1bmN0aW9uICgpIHtcclxuXHJcblx0XHRcdGlmICggb25Mb2FkICE9PSB1bmRlZmluZWQgKSBvbkxvYWQoIG9iamVjdCApO1xyXG5cclxuXHRcdH0gKTtcclxuXHJcblx0XHRjb25zdCB0ZXh0dXJlcyA9IHRoaXMucGFyc2VUZXh0dXJlcygganNvbi50ZXh0dXJlcywgaW1hZ2VzICk7XHJcblx0XHRjb25zdCBtYXRlcmlhbHMgPSB0aGlzLnBhcnNlTWF0ZXJpYWxzKCBqc29uLm1hdGVyaWFscywgdGV4dHVyZXMgKTtcclxuXHJcblx0XHRjb25zdCBvYmplY3QgPSB0aGlzLnBhcnNlT2JqZWN0KCBqc29uLm9iamVjdCwgZ2VvbWV0cmllcywgbWF0ZXJpYWxzLCB0ZXh0dXJlcywgYW5pbWF0aW9ucyApO1xyXG5cdFx0Y29uc3Qgc2tlbGV0b25zID0gdGhpcy5wYXJzZVNrZWxldG9ucygganNvbi5za2VsZXRvbnMsIG9iamVjdCApO1xyXG5cclxuXHRcdHRoaXMuYmluZFNrZWxldG9ucyggb2JqZWN0LCBza2VsZXRvbnMgKTtcclxuXHRcdHRoaXMuYmluZExpZ2h0VGFyZ2V0cyggb2JqZWN0ICk7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRpZiAoIG9uTG9hZCAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0bGV0IGhhc0ltYWdlcyA9IGZhbHNlO1xyXG5cclxuXHRcdFx0Zm9yICggY29uc3QgdXVpZCBpbiBpbWFnZXMgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggaW1hZ2VzWyB1dWlkIF0uZGF0YSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQgKSB7XHJcblxyXG5cdFx0XHRcdFx0aGFzSW1hZ2VzID0gdHJ1ZTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIGhhc0ltYWdlcyA9PT0gZmFsc2UgKSBvbkxvYWQoIG9iamVjdCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gb2JqZWN0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFzeW5jIHZlcnNpb24gb2Yge0BsaW5rIE9iamVjdExvYWRlciNwYXJzZX0uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0ganNvbiAtIFRoZSBzZXJpYWxpemVkIDNEIG9iamVjdC5cclxuXHQgKiBAcmV0dXJuIHtQcm9taXNlPE9iamVjdDNEPn0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcGFyc2VkIDNEIG9iamVjdC5cclxuXHQgKi9cclxuXHRhc3luYyBwYXJzZUFzeW5jKCBqc29uICkge1xyXG5cclxuXHRcdGNvbnN0IGFuaW1hdGlvbnMgPSB0aGlzLnBhcnNlQW5pbWF0aW9ucygganNvbi5hbmltYXRpb25zICk7XHJcblx0XHRjb25zdCBzaGFwZXMgPSB0aGlzLnBhcnNlU2hhcGVzKCBqc29uLnNoYXBlcyApO1xyXG5cdFx0Y29uc3QgZ2VvbWV0cmllcyA9IHRoaXMucGFyc2VHZW9tZXRyaWVzKCBqc29uLmdlb21ldHJpZXMsIHNoYXBlcyApO1xyXG5cclxuXHRcdGNvbnN0IGltYWdlcyA9IGF3YWl0IHRoaXMucGFyc2VJbWFnZXNBc3luYygganNvbi5pbWFnZXMgKTtcclxuXHJcblx0XHRjb25zdCB0ZXh0dXJlcyA9IHRoaXMucGFyc2VUZXh0dXJlcygganNvbi50ZXh0dXJlcywgaW1hZ2VzICk7XHJcblx0XHRjb25zdCBtYXRlcmlhbHMgPSB0aGlzLnBhcnNlTWF0ZXJpYWxzKCBqc29uLm1hdGVyaWFscywgdGV4dHVyZXMgKTtcclxuXHJcblx0XHRjb25zdCBvYmplY3QgPSB0aGlzLnBhcnNlT2JqZWN0KCBqc29uLm9iamVjdCwgZ2VvbWV0cmllcywgbWF0ZXJpYWxzLCB0ZXh0dXJlcywgYW5pbWF0aW9ucyApO1xyXG5cdFx0Y29uc3Qgc2tlbGV0b25zID0gdGhpcy5wYXJzZVNrZWxldG9ucygganNvbi5za2VsZXRvbnMsIG9iamVjdCApO1xyXG5cclxuXHRcdHRoaXMuYmluZFNrZWxldG9ucyggb2JqZWN0LCBza2VsZXRvbnMgKTtcclxuXHRcdHRoaXMuYmluZExpZ2h0VGFyZ2V0cyggb2JqZWN0ICk7XHJcblxyXG5cdFx0cmV0dXJuIG9iamVjdDtcclxuXHJcblx0fVxyXG5cclxuXHQvLyBpbnRlcm5hbHNcclxuXHJcblx0cGFyc2VTaGFwZXMoIGpzb24gKSB7XHJcblxyXG5cdFx0Y29uc3Qgc2hhcGVzID0ge307XHJcblxyXG5cdFx0aWYgKCBqc29uICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBqc29uLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHNoYXBlID0gbmV3IFNoYXBlKCkuZnJvbUpTT04oIGpzb25bIGkgXSApO1xyXG5cclxuXHRcdFx0XHRzaGFwZXNbIHNoYXBlLnV1aWQgXSA9IHNoYXBlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gc2hhcGVzO1xyXG5cclxuXHR9XHJcblxyXG5cdHBhcnNlU2tlbGV0b25zKCBqc29uLCBvYmplY3QgKSB7XHJcblxyXG5cdFx0Y29uc3Qgc2tlbGV0b25zID0ge307XHJcblx0XHRjb25zdCBib25lcyA9IHt9O1xyXG5cclxuXHRcdC8vIGdlbmVyYXRlIGJvbmUgbG9va3VwIHRhYmxlXHJcblxyXG5cdFx0b2JqZWN0LnRyYXZlcnNlKCBmdW5jdGlvbiAoIGNoaWxkICkge1xyXG5cclxuXHRcdFx0aWYgKCBjaGlsZC5pc0JvbmUgKSBib25lc1sgY2hpbGQudXVpZCBdID0gY2hpbGQ7XHJcblxyXG5cdFx0fSApO1xyXG5cclxuXHRcdC8vIGNyZWF0ZSBza2VsZXRvbnNcclxuXHJcblx0XHRpZiAoIGpzb24gIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGpzb24ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3Qgc2tlbGV0b24gPSBuZXcgU2tlbGV0b24oKS5mcm9tSlNPTigganNvblsgaSBdLCBib25lcyApO1xyXG5cclxuXHRcdFx0XHRza2VsZXRvbnNbIHNrZWxldG9uLnV1aWQgXSA9IHNrZWxldG9uO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gc2tlbGV0b25zO1xyXG5cclxuXHR9XHJcblxyXG5cdHBhcnNlR2VvbWV0cmllcygganNvbiwgc2hhcGVzICkge1xyXG5cclxuXHRcdGNvbnN0IGdlb21ldHJpZXMgPSB7fTtcclxuXHJcblx0XHRpZiAoIGpzb24gIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGJ1ZmZlckdlb21ldHJ5TG9hZGVyID0gbmV3IEJ1ZmZlckdlb21ldHJ5TG9hZGVyKCk7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBqc29uLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGxldCBnZW9tZXRyeTtcclxuXHRcdFx0XHRjb25zdCBkYXRhID0ganNvblsgaSBdO1xyXG5cclxuXHRcdFx0XHRzd2l0Y2ggKCBkYXRhLnR5cGUgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y2FzZSAnQnVmZmVyR2VvbWV0cnknOlxyXG5cdFx0XHRcdFx0Y2FzZSAnSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnknOlxyXG5cclxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBidWZmZXJHZW9tZXRyeUxvYWRlci5wYXJzZSggZGF0YSApO1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRkZWZhdWx0OlxyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCBkYXRhLnR5cGUgaW4gR2VvbWV0cmllcyApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXS5mcm9tSlNPTiggZGF0YSwgc2hhcGVzICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oIGBUSFJFRS5PYmplY3RMb2FkZXI6IFVuc3VwcG9ydGVkIGdlb21ldHJ5IHR5cGUgXCIkeyBkYXRhLnR5cGUgfVwiYCApO1xyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGdlb21ldHJ5LnV1aWQgPSBkYXRhLnV1aWQ7XHJcblxyXG5cdFx0XHRcdGlmICggZGF0YS5uYW1lICE9PSB1bmRlZmluZWQgKSBnZW9tZXRyeS5uYW1lID0gZGF0YS5uYW1lO1xyXG5cdFx0XHRcdGlmICggZGF0YS51c2VyRGF0YSAhPT0gdW5kZWZpbmVkICkgZ2VvbWV0cnkudXNlckRhdGEgPSBkYXRhLnVzZXJEYXRhO1xyXG5cclxuXHRcdFx0XHRnZW9tZXRyaWVzWyBkYXRhLnV1aWQgXSA9IGdlb21ldHJ5O1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZ2VvbWV0cmllcztcclxuXHJcblx0fVxyXG5cclxuXHRwYXJzZU1hdGVyaWFscygganNvbiwgdGV4dHVyZXMgKSB7XHJcblxyXG5cdFx0Y29uc3QgY2FjaGUgPSB7fTsgLy8gTXVsdGlNYXRlcmlhbFxyXG5cdFx0Y29uc3QgbWF0ZXJpYWxzID0ge307XHJcblxyXG5cdFx0aWYgKCBqc29uICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBsb2FkZXIgPSBuZXcgTWF0ZXJpYWxMb2FkZXIoKTtcclxuXHRcdFx0bG9hZGVyLnNldFRleHR1cmVzKCB0ZXh0dXJlcyApO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0ganNvbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBkYXRhID0ganNvblsgaSBdO1xyXG5cclxuXHRcdFx0XHRpZiAoIGNhY2hlWyBkYXRhLnV1aWQgXSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdGNhY2hlWyBkYXRhLnV1aWQgXSA9IGxvYWRlci5wYXJzZSggZGF0YSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdG1hdGVyaWFsc1sgZGF0YS51dWlkIF0gPSBjYWNoZVsgZGF0YS51dWlkIF07XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBtYXRlcmlhbHM7XHJcblxyXG5cdH1cclxuXHJcblx0cGFyc2VBbmltYXRpb25zKCBqc29uICkge1xyXG5cclxuXHRcdGNvbnN0IGFuaW1hdGlvbnMgPSB7fTtcclxuXHJcblx0XHRpZiAoIGpzb24gIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGpzb24ubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBkYXRhID0ganNvblsgaSBdO1xyXG5cclxuXHRcdFx0XHRjb25zdCBjbGlwID0gQW5pbWF0aW9uQ2xpcC5wYXJzZSggZGF0YSApO1xyXG5cclxuXHRcdFx0XHRhbmltYXRpb25zWyBjbGlwLnV1aWQgXSA9IGNsaXA7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBhbmltYXRpb25zO1xyXG5cclxuXHR9XHJcblxyXG5cdHBhcnNlSW1hZ2VzKCBqc29uLCBvbkxvYWQgKSB7XHJcblxyXG5cdFx0Y29uc3Qgc2NvcGUgPSB0aGlzO1xyXG5cdFx0Y29uc3QgaW1hZ2VzID0ge307XHJcblxyXG5cdFx0bGV0IGxvYWRlcjtcclxuXHJcblx0XHRmdW5jdGlvbiBsb2FkSW1hZ2UoIHVybCApIHtcclxuXHJcblx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbVN0YXJ0KCB1cmwgKTtcclxuXHJcblx0XHRcdHJldHVybiBsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoKSB7XHJcblxyXG5cdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XHJcblxyXG5cdFx0XHR9LCB1bmRlZmluZWQsIGZ1bmN0aW9uICgpIHtcclxuXHJcblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRXJyb3IoIHVybCApO1xyXG5cdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XHJcblxyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIGRlc2VyaWFsaXplSW1hZ2UoIGltYWdlICkge1xyXG5cclxuXHRcdFx0aWYgKCB0eXBlb2YgaW1hZ2UgPT09ICdzdHJpbmcnICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB1cmwgPSBpbWFnZTtcclxuXHJcblx0XHRcdFx0Y29uc3QgcGF0aCA9IC9eKFxcL1xcLyl8KFthLXpdKzooXFwvXFwvKT8pL2kudGVzdCggdXJsICkgPyB1cmwgOiBzY29wZS5yZXNvdXJjZVBhdGggKyB1cmw7XHJcblxyXG5cdFx0XHRcdHJldHVybiBsb2FkSW1hZ2UoIHBhdGggKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGlmICggaW1hZ2UuZGF0YSApIHtcclxuXHJcblx0XHRcdFx0XHRyZXR1cm4ge1xyXG5cdFx0XHRcdFx0XHRkYXRhOiBnZXRUeXBlZEFycmF5KCBpbWFnZS50eXBlLCBpbWFnZS5kYXRhICksXHJcblx0XHRcdFx0XHRcdHdpZHRoOiBpbWFnZS53aWR0aCxcclxuXHRcdFx0XHRcdFx0aGVpZ2h0OiBpbWFnZS5oZWlnaHRcclxuXHRcdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIG51bGw7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBqc29uICE9PSB1bmRlZmluZWQgJiYganNvbi5sZW5ndGggPiAwICkge1xyXG5cclxuXHRcdFx0Y29uc3QgbWFuYWdlciA9IG5ldyBMb2FkaW5nTWFuYWdlciggb25Mb2FkICk7XHJcblxyXG5cdFx0XHRsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoIG1hbmFnZXIgKTtcclxuXHRcdFx0bG9hZGVyLnNldENyb3NzT3JpZ2luKCB0aGlzLmNyb3NzT3JpZ2luICk7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0ganNvbi5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgaW1hZ2UgPSBqc29uWyBpIF07XHJcblx0XHRcdFx0Y29uc3QgdXJsID0gaW1hZ2UudXJsO1xyXG5cclxuXHRcdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHVybCApICkge1xyXG5cclxuXHRcdFx0XHRcdC8vIGxvYWQgYXJyYXkgb2YgaW1hZ2VzIGUuZyBDdWJlVGV4dHVyZVxyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGltYWdlQXJyYXkgPSBbXTtcclxuXHJcblx0XHRcdFx0XHRmb3IgKCBsZXQgaiA9IDAsIGpsID0gdXJsLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgY3VycmVudFVybCA9IHVybFsgaiBdO1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgZGVzZXJpYWxpemVkSW1hZ2UgPSBkZXNlcmlhbGl6ZUltYWdlKCBjdXJyZW50VXJsICk7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIGRlc2VyaWFsaXplZEltYWdlICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoIGRlc2VyaWFsaXplZEltYWdlIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRpbWFnZUFycmF5LnB1c2goIGRlc2VyaWFsaXplZEltYWdlICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0Ly8gc3BlY2lhbCBjYXNlOiBoYW5kbGUgYXJyYXkgb2YgZGF0YSB0ZXh0dXJlcyBmb3IgY3ViZSB0ZXh0dXJlc1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGltYWdlQXJyYXkucHVzaCggbmV3IERhdGFUZXh0dXJlKCBkZXNlcmlhbGl6ZWRJbWFnZS5kYXRhLCBkZXNlcmlhbGl6ZWRJbWFnZS53aWR0aCwgZGVzZXJpYWxpemVkSW1hZ2UuaGVpZ2h0ICkgKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRpbWFnZXNbIGltYWdlLnV1aWQgXSA9IG5ldyBTb3VyY2UoIGltYWdlQXJyYXkgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHQvLyBsb2FkIHNpbmdsZSBpbWFnZVxyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGRlc2VyaWFsaXplZEltYWdlID0gZGVzZXJpYWxpemVJbWFnZSggaW1hZ2UudXJsICk7XHJcblx0XHRcdFx0XHRpbWFnZXNbIGltYWdlLnV1aWQgXSA9IG5ldyBTb3VyY2UoIGRlc2VyaWFsaXplZEltYWdlICk7XHJcblxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBpbWFnZXM7XHJcblxyXG5cdH1cclxuXHJcblx0YXN5bmMgcGFyc2VJbWFnZXNBc3luYygganNvbiApIHtcclxuXHJcblx0XHRjb25zdCBzY29wZSA9IHRoaXM7XHJcblx0XHRjb25zdCBpbWFnZXMgPSB7fTtcclxuXHJcblx0XHRsZXQgbG9hZGVyO1xyXG5cclxuXHRcdGFzeW5jIGZ1bmN0aW9uIGRlc2VyaWFsaXplSW1hZ2UoIGltYWdlICkge1xyXG5cclxuXHRcdFx0aWYgKCB0eXBlb2YgaW1hZ2UgPT09ICdzdHJpbmcnICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB1cmwgPSBpbWFnZTtcclxuXHJcblx0XHRcdFx0Y29uc3QgcGF0aCA9IC9eKFxcL1xcLyl8KFthLXpdKzooXFwvXFwvKT8pL2kudGVzdCggdXJsICkgPyB1cmwgOiBzY29wZS5yZXNvdXJjZVBhdGggKyB1cmw7XHJcblxyXG5cdFx0XHRcdHJldHVybiBhd2FpdCBsb2FkZXIubG9hZEFzeW5jKCBwYXRoICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRpZiAoIGltYWdlLmRhdGEgKSB7XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHRcdFx0ZGF0YTogZ2V0VHlwZWRBcnJheSggaW1hZ2UudHlwZSwgaW1hZ2UuZGF0YSApLFxyXG5cdFx0XHRcdFx0XHR3aWR0aDogaW1hZ2Uud2lkdGgsXHJcblx0XHRcdFx0XHRcdGhlaWdodDogaW1hZ2UuaGVpZ2h0XHJcblx0XHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdHJldHVybiBudWxsO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICgganNvbiAhPT0gdW5kZWZpbmVkICYmIGpzb24ubGVuZ3RoID4gMCApIHtcclxuXHJcblx0XHRcdGxvYWRlciA9IG5ldyBJbWFnZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XHJcblx0XHRcdGxvYWRlci5zZXRDcm9zc09yaWdpbiggdGhpcy5jcm9zc09yaWdpbiApO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IGpzb24ubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGltYWdlID0ganNvblsgaSBdO1xyXG5cdFx0XHRcdGNvbnN0IHVybCA9IGltYWdlLnVybDtcclxuXHJcblx0XHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCB1cmwgKSApIHtcclxuXHJcblx0XHRcdFx0XHQvLyBsb2FkIGFycmF5IG9mIGltYWdlcyBlLmcgQ3ViZVRleHR1cmVcclxuXHJcblx0XHRcdFx0XHRjb25zdCBpbWFnZUFycmF5ID0gW107XHJcblxyXG5cdFx0XHRcdFx0Zm9yICggbGV0IGogPSAwLCBqbCA9IHVybC5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnN0IGN1cnJlbnRVcmwgPSB1cmxbIGogXTtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnN0IGRlc2VyaWFsaXplZEltYWdlID0gYXdhaXQgZGVzZXJpYWxpemVJbWFnZSggY3VycmVudFVybCApO1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCBkZXNlcmlhbGl6ZWRJbWFnZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKCBkZXNlcmlhbGl6ZWRJbWFnZSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0aW1hZ2VBcnJheS5wdXNoKCBkZXNlcmlhbGl6ZWRJbWFnZSApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8vIHNwZWNpYWwgY2FzZTogaGFuZGxlIGFycmF5IG9mIGRhdGEgdGV4dHVyZXMgZm9yIGN1YmUgdGV4dHVyZXNcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRpbWFnZUFycmF5LnB1c2goIG5ldyBEYXRhVGV4dHVyZSggZGVzZXJpYWxpemVkSW1hZ2UuZGF0YSwgZGVzZXJpYWxpemVkSW1hZ2Uud2lkdGgsIGRlc2VyaWFsaXplZEltYWdlLmhlaWdodCApICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aW1hZ2VzWyBpbWFnZS51dWlkIF0gPSBuZXcgU291cmNlKCBpbWFnZUFycmF5ICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gbG9hZCBzaW5nbGUgaW1hZ2VcclxuXHJcblx0XHRcdFx0XHRjb25zdCBkZXNlcmlhbGl6ZWRJbWFnZSA9IGF3YWl0IGRlc2VyaWFsaXplSW1hZ2UoIGltYWdlLnVybCApO1xyXG5cdFx0XHRcdFx0aW1hZ2VzWyBpbWFnZS51dWlkIF0gPSBuZXcgU291cmNlKCBkZXNlcmlhbGl6ZWRJbWFnZSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBpbWFnZXM7XHJcblxyXG5cdH1cclxuXHJcblx0cGFyc2VUZXh0dXJlcygganNvbiwgaW1hZ2VzICkge1xyXG5cclxuXHRcdGZ1bmN0aW9uIHBhcnNlQ29uc3RhbnQoIHZhbHVlLCB0eXBlICkge1xyXG5cclxuXHRcdFx0aWYgKCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICkgcmV0dXJuIHZhbHVlO1xyXG5cclxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0TG9hZGVyLnBhcnNlVGV4dHVyZTogQ29uc3RhbnQgc2hvdWxkIGJlIGluIG51bWVyaWMgZm9ybS4nLCB2YWx1ZSApO1xyXG5cclxuXHRcdFx0cmV0dXJuIHR5cGVbIHZhbHVlIF07XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHRleHR1cmVzID0ge307XHJcblxyXG5cdFx0aWYgKCBqc29uICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBqc29uLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGRhdGEgPSBqc29uWyBpIF07XHJcblxyXG5cdFx0XHRcdGlmICggZGF0YS5pbWFnZSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlcjogTm8gXCJpbWFnZVwiIHNwZWNpZmllZCBmb3InLCBkYXRhLnV1aWQgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoIGltYWdlc1sgZGF0YS5pbWFnZSBdID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgaW1hZ2UnLCBkYXRhLmltYWdlICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Y29uc3Qgc291cmNlID0gaW1hZ2VzWyBkYXRhLmltYWdlIF07XHJcblx0XHRcdFx0Y29uc3QgaW1hZ2UgPSBzb3VyY2UuZGF0YTtcclxuXHJcblx0XHRcdFx0bGV0IHRleHR1cmU7XHJcblxyXG5cdFx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggaW1hZ2UgKSApIHtcclxuXHJcblx0XHRcdFx0XHR0ZXh0dXJlID0gbmV3IEN1YmVUZXh0dXJlKCk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBpbWFnZS5sZW5ndGggPT09IDYgKSB0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGltYWdlICYmIGltYWdlLmRhdGEgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHR0ZXh0dXJlID0gbmV3IERhdGFUZXh0dXJlKCk7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdHRleHR1cmUgPSBuZXcgVGV4dHVyZSgpO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRpZiAoIGltYWdlICkgdGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7IC8vIHRleHR1cmVzIGNhbiBoYXZlIHVuZGVmaW5lZCBpbWFnZSBkYXRhXHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0dGV4dHVyZS5zb3VyY2UgPSBzb3VyY2U7XHJcblxyXG5cdFx0XHRcdHRleHR1cmUudXVpZCA9IGRhdGEudXVpZDtcclxuXHJcblx0XHRcdFx0aWYgKCBkYXRhLm5hbWUgIT09IHVuZGVmaW5lZCApIHRleHR1cmUubmFtZSA9IGRhdGEubmFtZTtcclxuXHJcblx0XHRcdFx0aWYgKCBkYXRhLm1hcHBpbmcgIT09IHVuZGVmaW5lZCApIHRleHR1cmUubWFwcGluZyA9IHBhcnNlQ29uc3RhbnQoIGRhdGEubWFwcGluZywgVEVYVFVSRV9NQVBQSU5HICk7XHJcblx0XHRcdFx0aWYgKCBkYXRhLmNoYW5uZWwgIT09IHVuZGVmaW5lZCApIHRleHR1cmUuY2hhbm5lbCA9IGRhdGEuY2hhbm5lbDtcclxuXHJcblx0XHRcdFx0aWYgKCBkYXRhLm9mZnNldCAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5vZmZzZXQuZnJvbUFycmF5KCBkYXRhLm9mZnNldCApO1xyXG5cdFx0XHRcdGlmICggZGF0YS5yZXBlYXQgIT09IHVuZGVmaW5lZCApIHRleHR1cmUucmVwZWF0LmZyb21BcnJheSggZGF0YS5yZXBlYXQgKTtcclxuXHRcdFx0XHRpZiAoIGRhdGEuY2VudGVyICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLmNlbnRlci5mcm9tQXJyYXkoIGRhdGEuY2VudGVyICk7XHJcblx0XHRcdFx0aWYgKCBkYXRhLnJvdGF0aW9uICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLnJvdGF0aW9uID0gZGF0YS5yb3RhdGlvbjtcclxuXHJcblx0XHRcdFx0aWYgKCBkYXRhLndyYXAgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHR0ZXh0dXJlLndyYXBTID0gcGFyc2VDb25zdGFudCggZGF0YS53cmFwWyAwIF0sIFRFWFRVUkVfV1JBUFBJTkcgKTtcclxuXHRcdFx0XHRcdHRleHR1cmUud3JhcFQgPSBwYXJzZUNvbnN0YW50KCBkYXRhLndyYXBbIDEgXSwgVEVYVFVSRV9XUkFQUElORyApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICggZGF0YS5mb3JtYXQgIT09IHVuZGVmaW5lZCApIHRleHR1cmUuZm9ybWF0ID0gZGF0YS5mb3JtYXQ7XHJcblx0XHRcdFx0aWYgKCBkYXRhLmludGVybmFsRm9ybWF0ICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLmludGVybmFsRm9ybWF0ID0gZGF0YS5pbnRlcm5hbEZvcm1hdDtcclxuXHRcdFx0XHRpZiAoIGRhdGEudHlwZSAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS50eXBlID0gZGF0YS50eXBlO1xyXG5cdFx0XHRcdGlmICggZGF0YS5jb2xvclNwYWNlICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLmNvbG9yU3BhY2UgPSBkYXRhLmNvbG9yU3BhY2U7XHJcblxyXG5cdFx0XHRcdGlmICggZGF0YS5taW5GaWx0ZXIgIT09IHVuZGVmaW5lZCApIHRleHR1cmUubWluRmlsdGVyID0gcGFyc2VDb25zdGFudCggZGF0YS5taW5GaWx0ZXIsIFRFWFRVUkVfRklMVEVSICk7XHJcblx0XHRcdFx0aWYgKCBkYXRhLm1hZ0ZpbHRlciAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5tYWdGaWx0ZXIgPSBwYXJzZUNvbnN0YW50KCBkYXRhLm1hZ0ZpbHRlciwgVEVYVFVSRV9GSUxURVIgKTtcclxuXHRcdFx0XHRpZiAoIGRhdGEuYW5pc290cm9weSAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5hbmlzb3Ryb3B5ID0gZGF0YS5hbmlzb3Ryb3B5O1xyXG5cclxuXHRcdFx0XHRpZiAoIGRhdGEuZmxpcFkgIT09IHVuZGVmaW5lZCApIHRleHR1cmUuZmxpcFkgPSBkYXRhLmZsaXBZO1xyXG5cclxuXHRcdFx0XHRpZiAoIGRhdGEuZ2VuZXJhdGVNaXBtYXBzICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGRhdGEuZ2VuZXJhdGVNaXBtYXBzO1xyXG5cdFx0XHRcdGlmICggZGF0YS5wcmVtdWx0aXBseUFscGhhICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLnByZW11bHRpcGx5QWxwaGEgPSBkYXRhLnByZW11bHRpcGx5QWxwaGE7XHJcblx0XHRcdFx0aWYgKCBkYXRhLnVucGFja0FsaWdubWVudCAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS51bnBhY2tBbGlnbm1lbnQgPSBkYXRhLnVucGFja0FsaWdubWVudDtcclxuXHRcdFx0XHRpZiAoIGRhdGEuY29tcGFyZUZ1bmN0aW9uICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLmNvbXBhcmVGdW5jdGlvbiA9IGRhdGEuY29tcGFyZUZ1bmN0aW9uO1xyXG5cclxuXHRcdFx0XHRpZiAoIGRhdGEudXNlckRhdGEgIT09IHVuZGVmaW5lZCApIHRleHR1cmUudXNlckRhdGEgPSBkYXRhLnVzZXJEYXRhO1xyXG5cclxuXHRcdFx0XHR0ZXh0dXJlc1sgZGF0YS51dWlkIF0gPSB0ZXh0dXJlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGV4dHVyZXM7XHJcblxyXG5cdH1cclxuXHJcblx0cGFyc2VPYmplY3QoIGRhdGEsIGdlb21ldHJpZXMsIG1hdGVyaWFscywgdGV4dHVyZXMsIGFuaW1hdGlvbnMgKSB7XHJcblxyXG5cdFx0bGV0IG9iamVjdDtcclxuXHJcblx0XHRmdW5jdGlvbiBnZXRHZW9tZXRyeSggbmFtZSApIHtcclxuXHJcblx0XHRcdGlmICggZ2VvbWV0cmllc1sgbmFtZSBdID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIGdlb21ldHJ5JywgbmFtZSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIGdlb21ldHJpZXNbIG5hbWUgXTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0ZnVuY3Rpb24gZ2V0TWF0ZXJpYWwoIG5hbWUgKSB7XHJcblxyXG5cdFx0XHRpZiAoIG5hbWUgPT09IHVuZGVmaW5lZCApIHJldHVybiB1bmRlZmluZWQ7XHJcblxyXG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIG5hbWUgKSApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgYXJyYXkgPSBbXTtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gbmFtZS5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHV1aWQgPSBuYW1lWyBpIF07XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBtYXRlcmlhbHNbIHV1aWQgXSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgbWF0ZXJpYWwnLCB1dWlkICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGFycmF5LnB1c2goIG1hdGVyaWFsc1sgdXVpZCBdICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0cmV0dXJuIGFycmF5O1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBtYXRlcmlhbHNbIG5hbWUgXSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCBtYXRlcmlhbCcsIG5hbWUgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBtYXRlcmlhbHNbIG5hbWUgXTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0ZnVuY3Rpb24gZ2V0VGV4dHVyZSggdXVpZCApIHtcclxuXHJcblx0XHRcdGlmICggdGV4dHVyZXNbIHV1aWQgXSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCB0ZXh0dXJlJywgdXVpZCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIHRleHR1cmVzWyB1dWlkIF07XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGxldCBnZW9tZXRyeSwgbWF0ZXJpYWw7XHJcblxyXG5cdFx0c3dpdGNoICggZGF0YS50eXBlICkge1xyXG5cclxuXHRcdFx0Y2FzZSAnU2NlbmUnOlxyXG5cclxuXHRcdFx0XHRvYmplY3QgPSBuZXcgU2NlbmUoKTtcclxuXHJcblx0XHRcdFx0aWYgKCBkYXRhLmJhY2tncm91bmQgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIE51bWJlci5pc0ludGVnZXIoIGRhdGEuYmFja2dyb3VuZCApICkge1xyXG5cclxuXHRcdFx0XHRcdFx0b2JqZWN0LmJhY2tncm91bmQgPSBuZXcgQ29sb3IoIGRhdGEuYmFja2dyb3VuZCApO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRvYmplY3QuYmFja2dyb3VuZCA9IGdldFRleHR1cmUoIGRhdGEuYmFja2dyb3VuZCApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoIGRhdGEuZW52aXJvbm1lbnQgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRvYmplY3QuZW52aXJvbm1lbnQgPSBnZXRUZXh0dXJlKCBkYXRhLmVudmlyb25tZW50ICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKCBkYXRhLmZvZyAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdGlmICggZGF0YS5mb2cudHlwZSA9PT0gJ0ZvZycgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRvYmplY3QuZm9nID0gbmV3IEZvZyggZGF0YS5mb2cuY29sb3IsIGRhdGEuZm9nLm5lYXIsIGRhdGEuZm9nLmZhciApO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIGRhdGEuZm9nLnR5cGUgPT09ICdGb2dFeHAyJyApIHtcclxuXHJcblx0XHRcdFx0XHRcdG9iamVjdC5mb2cgPSBuZXcgRm9nRXhwMiggZGF0YS5mb2cuY29sb3IsIGRhdGEuZm9nLmRlbnNpdHkgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBkYXRhLmZvZy5uYW1lICE9PSAnJyApIHtcclxuXHJcblx0XHRcdFx0XHRcdG9iamVjdC5mb2cubmFtZSA9IGRhdGEuZm9nLm5hbWU7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICggZGF0YS5iYWNrZ3JvdW5kQmx1cnJpbmVzcyAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmJhY2tncm91bmRCbHVycmluZXNzID0gZGF0YS5iYWNrZ3JvdW5kQmx1cnJpbmVzcztcclxuXHRcdFx0XHRpZiAoIGRhdGEuYmFja2dyb3VuZEludGVuc2l0eSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmJhY2tncm91bmRJbnRlbnNpdHkgPSBkYXRhLmJhY2tncm91bmRJbnRlbnNpdHk7XHJcblx0XHRcdFx0aWYgKCBkYXRhLmJhY2tncm91bmRSb3RhdGlvbiAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmJhY2tncm91bmRSb3RhdGlvbi5mcm9tQXJyYXkoIGRhdGEuYmFja2dyb3VuZFJvdGF0aW9uICk7XHJcblxyXG5cdFx0XHRcdGlmICggZGF0YS5lbnZpcm9ubWVudEludGVuc2l0eSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmVudmlyb25tZW50SW50ZW5zaXR5ID0gZGF0YS5lbnZpcm9ubWVudEludGVuc2l0eTtcclxuXHRcdFx0XHRpZiAoIGRhdGEuZW52aXJvbm1lbnRSb3RhdGlvbiAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmVudmlyb25tZW50Um90YXRpb24uZnJvbUFycmF5KCBkYXRhLmVudmlyb25tZW50Um90YXRpb24gKTtcclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlICdQZXJzcGVjdGl2ZUNhbWVyYSc6XHJcblxyXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggZGF0YS5mb3YsIGRhdGEuYXNwZWN0LCBkYXRhLm5lYXIsIGRhdGEuZmFyICk7XHJcblxyXG5cdFx0XHRcdGlmICggZGF0YS5mb2N1cyAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmZvY3VzID0gZGF0YS5mb2N1cztcclxuXHRcdFx0XHRpZiAoIGRhdGEuem9vbSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0Lnpvb20gPSBkYXRhLnpvb207XHJcblx0XHRcdFx0aWYgKCBkYXRhLmZpbG1HYXVnZSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmZpbG1HYXVnZSA9IGRhdGEuZmlsbUdhdWdlO1xyXG5cdFx0XHRcdGlmICggZGF0YS5maWxtT2Zmc2V0ICE9PSB1bmRlZmluZWQgKSBvYmplY3QuZmlsbU9mZnNldCA9IGRhdGEuZmlsbU9mZnNldDtcclxuXHRcdFx0XHRpZiAoIGRhdGEudmlldyAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnZpZXcgPSBPYmplY3QuYXNzaWduKCB7fSwgZGF0YS52aWV3ICk7XHJcblxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSAnT3J0aG9ncmFwaGljQ2FtZXJhJzpcclxuXHJcblx0XHRcdFx0b2JqZWN0ID0gbmV3IE9ydGhvZ3JhcGhpY0NhbWVyYSggZGF0YS5sZWZ0LCBkYXRhLnJpZ2h0LCBkYXRhLnRvcCwgZGF0YS5ib3R0b20sIGRhdGEubmVhciwgZGF0YS5mYXIgKTtcclxuXHJcblx0XHRcdFx0aWYgKCBkYXRhLnpvb20gIT09IHVuZGVmaW5lZCApIG9iamVjdC56b29tID0gZGF0YS56b29tO1xyXG5cdFx0XHRcdGlmICggZGF0YS52aWV3ICE9PSB1bmRlZmluZWQgKSBvYmplY3QudmlldyA9IE9iamVjdC5hc3NpZ24oIHt9LCBkYXRhLnZpZXcgKTtcclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlICdBbWJpZW50TGlnaHQnOlxyXG5cclxuXHRcdFx0XHRvYmplY3QgPSBuZXcgQW1iaWVudExpZ2h0KCBkYXRhLmNvbG9yLCBkYXRhLmludGVuc2l0eSApO1xyXG5cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgJ0RpcmVjdGlvbmFsTGlnaHQnOlxyXG5cclxuXHRcdFx0XHRvYmplY3QgPSBuZXcgRGlyZWN0aW9uYWxMaWdodCggZGF0YS5jb2xvciwgZGF0YS5pbnRlbnNpdHkgKTtcclxuXHRcdFx0XHRvYmplY3QudGFyZ2V0ID0gZGF0YS50YXJnZXQgfHwgJyc7XHJcblxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSAnUG9pbnRMaWdodCc6XHJcblxyXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBQb2ludExpZ2h0KCBkYXRhLmNvbG9yLCBkYXRhLmludGVuc2l0eSwgZGF0YS5kaXN0YW5jZSwgZGF0YS5kZWNheSApO1xyXG5cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgJ1JlY3RBcmVhTGlnaHQnOlxyXG5cclxuXHRcdFx0XHRvYmplY3QgPSBuZXcgUmVjdEFyZWFMaWdodCggZGF0YS5jb2xvciwgZGF0YS5pbnRlbnNpdHksIGRhdGEud2lkdGgsIGRhdGEuaGVpZ2h0ICk7XHJcblxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSAnU3BvdExpZ2h0JzpcclxuXHJcblx0XHRcdFx0b2JqZWN0ID0gbmV3IFNwb3RMaWdodCggZGF0YS5jb2xvciwgZGF0YS5pbnRlbnNpdHksIGRhdGEuZGlzdGFuY2UsIGRhdGEuYW5nbGUsIGRhdGEucGVudW1icmEsIGRhdGEuZGVjYXkgKTtcclxuXHRcdFx0XHRvYmplY3QudGFyZ2V0ID0gZGF0YS50YXJnZXQgfHwgJyc7XHJcblxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSAnSGVtaXNwaGVyZUxpZ2h0JzpcclxuXHJcblx0XHRcdFx0b2JqZWN0ID0gbmV3IEhlbWlzcGhlcmVMaWdodCggZGF0YS5jb2xvciwgZGF0YS5ncm91bmRDb2xvciwgZGF0YS5pbnRlbnNpdHkgKTtcclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlICdMaWdodFByb2JlJzpcclxuXHJcblx0XHRcdFx0b2JqZWN0ID0gbmV3IExpZ2h0UHJvYmUoKS5mcm9tSlNPTiggZGF0YSApO1xyXG5cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgJ1NraW5uZWRNZXNoJzpcclxuXHJcblx0XHRcdFx0Z2VvbWV0cnkgPSBnZXRHZW9tZXRyeSggZGF0YS5nZW9tZXRyeSApO1xyXG5cdFx0XHQgXHRtYXRlcmlhbCA9IGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICk7XHJcblxyXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBTa2lubmVkTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcblxyXG5cdFx0XHRcdGlmICggZGF0YS5iaW5kTW9kZSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmJpbmRNb2RlID0gZGF0YS5iaW5kTW9kZTtcclxuXHRcdFx0XHRpZiAoIGRhdGEuYmluZE1hdHJpeCAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmJpbmRNYXRyaXguZnJvbUFycmF5KCBkYXRhLmJpbmRNYXRyaXggKTtcclxuXHRcdFx0XHRpZiAoIGRhdGEuc2tlbGV0b24gIT09IHVuZGVmaW5lZCApIG9iamVjdC5za2VsZXRvbiA9IGRhdGEuc2tlbGV0b247XHJcblxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSAnTWVzaCc6XHJcblxyXG5cdFx0XHRcdGdlb21ldHJ5ID0gZ2V0R2VvbWV0cnkoIGRhdGEuZ2VvbWV0cnkgKTtcclxuXHRcdFx0XHRtYXRlcmlhbCA9IGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICk7XHJcblxyXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBNZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlICdJbnN0YW5jZWRNZXNoJzpcclxuXHJcblx0XHRcdFx0Z2VvbWV0cnkgPSBnZXRHZW9tZXRyeSggZGF0YS5nZW9tZXRyeSApO1xyXG5cdFx0XHRcdG1hdGVyaWFsID0gZ2V0TWF0ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKTtcclxuXHRcdFx0XHRjb25zdCBjb3VudCA9IGRhdGEuY291bnQ7XHJcblx0XHRcdFx0Y29uc3QgaW5zdGFuY2VNYXRyaXggPSBkYXRhLmluc3RhbmNlTWF0cml4O1xyXG5cdFx0XHRcdGNvbnN0IGluc3RhbmNlQ29sb3IgPSBkYXRhLmluc3RhbmNlQ29sb3I7XHJcblxyXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBJbnN0YW5jZWRNZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGNvdW50ICk7XHJcblx0XHRcdFx0b2JqZWN0Lmluc3RhbmNlTWF0cml4ID0gbmV3IEluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSggbmV3IEZsb2F0MzJBcnJheSggaW5zdGFuY2VNYXRyaXguYXJyYXkgKSwgMTYgKTtcclxuXHRcdFx0XHRpZiAoIGluc3RhbmNlQ29sb3IgIT09IHVuZGVmaW5lZCApIG9iamVjdC5pbnN0YW5jZUNvbG9yID0gbmV3IEluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSggbmV3IEZsb2F0MzJBcnJheSggaW5zdGFuY2VDb2xvci5hcnJheSApLCBpbnN0YW5jZUNvbG9yLml0ZW1TaXplICk7XHJcblxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSAnQmF0Y2hlZE1lc2gnOlxyXG5cclxuXHRcdFx0XHRnZW9tZXRyeSA9IGdldEdlb21ldHJ5KCBkYXRhLmdlb21ldHJ5ICk7XHJcblx0XHRcdFx0bWF0ZXJpYWwgPSBnZXRNYXRlcmlhbCggZGF0YS5tYXRlcmlhbCApO1xyXG5cclxuXHRcdFx0XHRvYmplY3QgPSBuZXcgQmF0Y2hlZE1lc2goIGRhdGEubWF4SW5zdGFuY2VDb3VudCwgZGF0YS5tYXhWZXJ0ZXhDb3VudCwgZGF0YS5tYXhJbmRleENvdW50LCBtYXRlcmlhbCApO1xyXG5cdFx0XHRcdG9iamVjdC5nZW9tZXRyeSA9IGdlb21ldHJ5O1xyXG5cdFx0XHRcdG9iamVjdC5wZXJPYmplY3RGcnVzdHVtQ3VsbGVkID0gZGF0YS5wZXJPYmplY3RGcnVzdHVtQ3VsbGVkO1xyXG5cdFx0XHRcdG9iamVjdC5zb3J0T2JqZWN0cyA9IGRhdGEuc29ydE9iamVjdHM7XHJcblxyXG5cdFx0XHRcdG9iamVjdC5fZHJhd1JhbmdlcyA9IGRhdGEuZHJhd1JhbmdlcztcclxuXHRcdFx0XHRvYmplY3QuX3Jlc2VydmVkUmFuZ2VzID0gZGF0YS5yZXNlcnZlZFJhbmdlcztcclxuXHJcblx0XHRcdFx0b2JqZWN0Ll92aXNpYmlsaXR5ID0gZGF0YS52aXNpYmlsaXR5O1xyXG5cdFx0XHRcdG9iamVjdC5fYWN0aXZlID0gZGF0YS5hY3RpdmU7XHJcblx0XHRcdFx0b2JqZWN0Ll9ib3VuZHMgPSBkYXRhLmJvdW5kcy5tYXAoIGJvdW5kID0+IHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBib3ggPSBuZXcgQm94MygpO1xyXG5cdFx0XHRcdFx0Ym94Lm1pbi5mcm9tQXJyYXkoIGJvdW5kLmJveE1pbiApO1xyXG5cdFx0XHRcdFx0Ym94Lm1heC5mcm9tQXJyYXkoIGJvdW5kLmJveE1heCApO1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHNwaGVyZSA9IG5ldyBTcGhlcmUoKTtcclxuXHRcdFx0XHRcdHNwaGVyZS5yYWRpdXMgPSBib3VuZC5zcGhlcmVSYWRpdXM7XHJcblx0XHRcdFx0XHRzcGhlcmUuY2VudGVyLmZyb21BcnJheSggYm91bmQuc3BoZXJlQ2VudGVyICk7XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHRcdFx0Ym94SW5pdGlhbGl6ZWQ6IGJvdW5kLmJveEluaXRpYWxpemVkLFxyXG5cdFx0XHRcdFx0XHRib3g6IGJveCxcclxuXHJcblx0XHRcdFx0XHRcdHNwaGVyZUluaXRpYWxpemVkOiBib3VuZC5zcGhlcmVJbml0aWFsaXplZCxcclxuXHRcdFx0XHRcdFx0c3BoZXJlOiBzcGhlcmVcclxuXHRcdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdH0gKTtcclxuXHJcblx0XHRcdFx0b2JqZWN0Ll9tYXhJbnN0YW5jZUNvdW50ID0gZGF0YS5tYXhJbnN0YW5jZUNvdW50O1xyXG5cdFx0XHRcdG9iamVjdC5fbWF4VmVydGV4Q291bnQgPSBkYXRhLm1heFZlcnRleENvdW50O1xyXG5cdFx0XHRcdG9iamVjdC5fbWF4SW5kZXhDb3VudCA9IGRhdGEubWF4SW5kZXhDb3VudDtcclxuXHJcblx0XHRcdFx0b2JqZWN0Ll9nZW9tZXRyeUluaXRpYWxpemVkID0gZGF0YS5nZW9tZXRyeUluaXRpYWxpemVkO1xyXG5cdFx0XHRcdG9iamVjdC5fZ2VvbWV0cnlDb3VudCA9IGRhdGEuZ2VvbWV0cnlDb3VudDtcclxuXHJcblx0XHRcdFx0b2JqZWN0Ll9tYXRyaWNlc1RleHR1cmUgPSBnZXRUZXh0dXJlKCBkYXRhLm1hdHJpY2VzVGV4dHVyZS51dWlkICk7XHJcblx0XHRcdFx0aWYgKCBkYXRhLmNvbG9yc1RleHR1cmUgIT09IHVuZGVmaW5lZCApIG9iamVjdC5fY29sb3JzVGV4dHVyZSA9IGdldFRleHR1cmUoIGRhdGEuY29sb3JzVGV4dHVyZS51dWlkICk7XHJcblxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSAnTE9EJzpcclxuXHJcblx0XHRcdFx0b2JqZWN0ID0gbmV3IExPRCgpO1xyXG5cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgJ0xpbmUnOlxyXG5cclxuXHRcdFx0XHRvYmplY3QgPSBuZXcgTGluZSggZ2V0R2VvbWV0cnkoIGRhdGEuZ2VvbWV0cnkgKSwgZ2V0TWF0ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKSApO1xyXG5cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgJ0xpbmVMb29wJzpcclxuXHJcblx0XHRcdFx0b2JqZWN0ID0gbmV3IExpbmVMb29wKCBnZXRHZW9tZXRyeSggZGF0YS5nZW9tZXRyeSApLCBnZXRNYXRlcmlhbCggZGF0YS5tYXRlcmlhbCApICk7XHJcblxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSAnTGluZVNlZ21lbnRzJzpcclxuXHJcblx0XHRcdFx0b2JqZWN0ID0gbmV3IExpbmVTZWdtZW50cyggZ2V0R2VvbWV0cnkoIGRhdGEuZ2VvbWV0cnkgKSwgZ2V0TWF0ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKSApO1xyXG5cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgJ1BvaW50Q2xvdWQnOlxyXG5cdFx0XHRjYXNlICdQb2ludHMnOlxyXG5cclxuXHRcdFx0XHRvYmplY3QgPSBuZXcgUG9pbnRzKCBnZXRHZW9tZXRyeSggZGF0YS5nZW9tZXRyeSApLCBnZXRNYXRlcmlhbCggZGF0YS5tYXRlcmlhbCApICk7XHJcblxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSAnU3ByaXRlJzpcclxuXHJcblx0XHRcdFx0b2JqZWN0ID0gbmV3IFNwcml0ZSggZ2V0TWF0ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKSApO1xyXG5cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgJ0dyb3VwJzpcclxuXHJcblx0XHRcdFx0b2JqZWN0ID0gbmV3IEdyb3VwKCk7XHJcblxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSAnQm9uZSc6XHJcblxyXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBCb25lKCk7XHJcblxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0ZGVmYXVsdDpcclxuXHJcblx0XHRcdFx0b2JqZWN0ID0gbmV3IE9iamVjdDNEKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdG9iamVjdC51dWlkID0gZGF0YS51dWlkO1xyXG5cclxuXHRcdGlmICggZGF0YS5uYW1lICE9PSB1bmRlZmluZWQgKSBvYmplY3QubmFtZSA9IGRhdGEubmFtZTtcclxuXHJcblx0XHRpZiAoIGRhdGEubWF0cml4ICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRvYmplY3QubWF0cml4LmZyb21BcnJheSggZGF0YS5tYXRyaXggKTtcclxuXHJcblx0XHRcdGlmICggZGF0YS5tYXRyaXhBdXRvVXBkYXRlICE9PSB1bmRlZmluZWQgKSBvYmplY3QubWF0cml4QXV0b1VwZGF0ZSA9IGRhdGEubWF0cml4QXV0b1VwZGF0ZTtcclxuXHRcdFx0aWYgKCBvYmplY3QubWF0cml4QXV0b1VwZGF0ZSApIG9iamVjdC5tYXRyaXguZGVjb21wb3NlKCBvYmplY3QucG9zaXRpb24sIG9iamVjdC5xdWF0ZXJuaW9uLCBvYmplY3Quc2NhbGUgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0aWYgKCBkYXRhLnBvc2l0aW9uICE9PSB1bmRlZmluZWQgKSBvYmplY3QucG9zaXRpb24uZnJvbUFycmF5KCBkYXRhLnBvc2l0aW9uICk7XHJcblx0XHRcdGlmICggZGF0YS5yb3RhdGlvbiAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnJvdGF0aW9uLmZyb21BcnJheSggZGF0YS5yb3RhdGlvbiApO1xyXG5cdFx0XHRpZiAoIGRhdGEucXVhdGVybmlvbiAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnF1YXRlcm5pb24uZnJvbUFycmF5KCBkYXRhLnF1YXRlcm5pb24gKTtcclxuXHRcdFx0aWYgKCBkYXRhLnNjYWxlICE9PSB1bmRlZmluZWQgKSBvYmplY3Quc2NhbGUuZnJvbUFycmF5KCBkYXRhLnNjYWxlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggZGF0YS51cCAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnVwLmZyb21BcnJheSggZGF0YS51cCApO1xyXG5cclxuXHRcdGlmICggZGF0YS5jYXN0U2hhZG93ICE9PSB1bmRlZmluZWQgKSBvYmplY3QuY2FzdFNoYWRvdyA9IGRhdGEuY2FzdFNoYWRvdztcclxuXHRcdGlmICggZGF0YS5yZWNlaXZlU2hhZG93ICE9PSB1bmRlZmluZWQgKSBvYmplY3QucmVjZWl2ZVNoYWRvdyA9IGRhdGEucmVjZWl2ZVNoYWRvdztcclxuXHJcblx0XHRpZiAoIGRhdGEuc2hhZG93ICkge1xyXG5cclxuXHRcdFx0aWYgKCBkYXRhLnNoYWRvdy5pbnRlbnNpdHkgIT09IHVuZGVmaW5lZCApIG9iamVjdC5zaGFkb3cuaW50ZW5zaXR5ID0gZGF0YS5zaGFkb3cuaW50ZW5zaXR5O1xyXG5cdFx0XHRpZiAoIGRhdGEuc2hhZG93LmJpYXMgIT09IHVuZGVmaW5lZCApIG9iamVjdC5zaGFkb3cuYmlhcyA9IGRhdGEuc2hhZG93LmJpYXM7XHJcblx0XHRcdGlmICggZGF0YS5zaGFkb3cubm9ybWFsQmlhcyAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnNoYWRvdy5ub3JtYWxCaWFzID0gZGF0YS5zaGFkb3cubm9ybWFsQmlhcztcclxuXHRcdFx0aWYgKCBkYXRhLnNoYWRvdy5yYWRpdXMgIT09IHVuZGVmaW5lZCApIG9iamVjdC5zaGFkb3cucmFkaXVzID0gZGF0YS5zaGFkb3cucmFkaXVzO1xyXG5cdFx0XHRpZiAoIGRhdGEuc2hhZG93Lm1hcFNpemUgIT09IHVuZGVmaW5lZCApIG9iamVjdC5zaGFkb3cubWFwU2l6ZS5mcm9tQXJyYXkoIGRhdGEuc2hhZG93Lm1hcFNpemUgKTtcclxuXHRcdFx0aWYgKCBkYXRhLnNoYWRvdy5jYW1lcmEgIT09IHVuZGVmaW5lZCApIG9iamVjdC5zaGFkb3cuY2FtZXJhID0gdGhpcy5wYXJzZU9iamVjdCggZGF0YS5zaGFkb3cuY2FtZXJhICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggZGF0YS52aXNpYmxlICE9PSB1bmRlZmluZWQgKSBvYmplY3QudmlzaWJsZSA9IGRhdGEudmlzaWJsZTtcclxuXHRcdGlmICggZGF0YS5mcnVzdHVtQ3VsbGVkICE9PSB1bmRlZmluZWQgKSBvYmplY3QuZnJ1c3R1bUN1bGxlZCA9IGRhdGEuZnJ1c3R1bUN1bGxlZDtcclxuXHRcdGlmICggZGF0YS5yZW5kZXJPcmRlciAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnJlbmRlck9yZGVyID0gZGF0YS5yZW5kZXJPcmRlcjtcclxuXHRcdGlmICggZGF0YS51c2VyRGF0YSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnVzZXJEYXRhID0gZGF0YS51c2VyRGF0YTtcclxuXHRcdGlmICggZGF0YS5sYXllcnMgIT09IHVuZGVmaW5lZCApIG9iamVjdC5sYXllcnMubWFzayA9IGRhdGEubGF5ZXJzO1xyXG5cclxuXHRcdGlmICggZGF0YS5jaGlsZHJlbiAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Y29uc3QgY2hpbGRyZW4gPSBkYXRhLmNoaWxkcmVuO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRvYmplY3QuYWRkKCB0aGlzLnBhcnNlT2JqZWN0KCBjaGlsZHJlblsgaSBdLCBnZW9tZXRyaWVzLCBtYXRlcmlhbHMsIHRleHR1cmVzLCBhbmltYXRpb25zICkgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBkYXRhLmFuaW1hdGlvbnMgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGNvbnN0IG9iamVjdEFuaW1hdGlvbnMgPSBkYXRhLmFuaW1hdGlvbnM7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBvYmplY3RBbmltYXRpb25zLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgdXVpZCA9IG9iamVjdEFuaW1hdGlvbnNbIGkgXTtcclxuXHJcblx0XHRcdFx0b2JqZWN0LmFuaW1hdGlvbnMucHVzaCggYW5pbWF0aW9uc1sgdXVpZCBdICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggZGF0YS50eXBlID09PSAnTE9EJyApIHtcclxuXHJcblx0XHRcdGlmICggZGF0YS5hdXRvVXBkYXRlICE9PSB1bmRlZmluZWQgKSBvYmplY3QuYXV0b1VwZGF0ZSA9IGRhdGEuYXV0b1VwZGF0ZTtcclxuXHJcblx0XHRcdGNvbnN0IGxldmVscyA9IGRhdGEubGV2ZWxzO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGwgPSAwOyBsIDwgbGV2ZWxzLmxlbmd0aDsgbCArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgbGV2ZWwgPSBsZXZlbHNbIGwgXTtcclxuXHRcdFx0XHRjb25zdCBjaGlsZCA9IG9iamVjdC5nZXRPYmplY3RCeVByb3BlcnR5KCAndXVpZCcsIGxldmVsLm9iamVjdCApO1xyXG5cclxuXHRcdFx0XHRpZiAoIGNoaWxkICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0b2JqZWN0LmFkZExldmVsKCBjaGlsZCwgbGV2ZWwuZGlzdGFuY2UsIGxldmVsLmh5c3RlcmVzaXMgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gb2JqZWN0O1xyXG5cclxuXHR9XHJcblxyXG5cdGJpbmRTa2VsZXRvbnMoIG9iamVjdCwgc2tlbGV0b25zICkge1xyXG5cclxuXHRcdGlmICggT2JqZWN0LmtleXMoIHNrZWxldG9ucyApLmxlbmd0aCA9PT0gMCApIHJldHVybjtcclxuXHJcblx0XHRvYmplY3QudHJhdmVyc2UoIGZ1bmN0aW9uICggY2hpbGQgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGNoaWxkLmlzU2tpbm5lZE1lc2ggPT09IHRydWUgJiYgY2hpbGQuc2tlbGV0b24gIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0Y29uc3Qgc2tlbGV0b24gPSBza2VsZXRvbnNbIGNoaWxkLnNrZWxldG9uIF07XHJcblxyXG5cdFx0XHRcdGlmICggc2tlbGV0b24gPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXI6IE5vIHNrZWxldG9uIGZvdW5kIHdpdGggVVVJRDonLCBjaGlsZC5za2VsZXRvbiApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdGNoaWxkLmJpbmQoIHNrZWxldG9uLCBjaGlsZC5iaW5kTWF0cml4ICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9ICk7XHJcblxyXG5cdH1cclxuXHJcblx0YmluZExpZ2h0VGFyZ2V0cyggb2JqZWN0ICkge1xyXG5cclxuXHRcdG9iamVjdC50cmF2ZXJzZSggZnVuY3Rpb24gKCBjaGlsZCApIHtcclxuXHJcblx0XHRcdGlmICggY2hpbGQuaXNEaXJlY3Rpb25hbExpZ2h0IHx8IGNoaWxkLmlzU3BvdExpZ2h0ICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB1dWlkID0gY2hpbGQudGFyZ2V0O1xyXG5cclxuXHRcdFx0XHRjb25zdCB0YXJnZXQgPSBvYmplY3QuZ2V0T2JqZWN0QnlQcm9wZXJ0eSggJ3V1aWQnLCB1dWlkICk7XHJcblxyXG5cdFx0XHRcdGlmICggdGFyZ2V0ICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y2hpbGQudGFyZ2V0ID0gdGFyZ2V0O1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdGNoaWxkLnRhcmdldCA9IG5ldyBPYmplY3QzRCgpO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5jb25zdCBURVhUVVJFX01BUFBJTkcgPSB7XHJcblx0VVZNYXBwaW5nOiBVVk1hcHBpbmcsXHJcblx0Q3ViZVJlZmxlY3Rpb25NYXBwaW5nOiBDdWJlUmVmbGVjdGlvbk1hcHBpbmcsXHJcblx0Q3ViZVJlZnJhY3Rpb25NYXBwaW5nOiBDdWJlUmVmcmFjdGlvbk1hcHBpbmcsXHJcblx0RXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmc6IEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nLFxyXG5cdEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nOiBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZyxcclxuXHRDdWJlVVZSZWZsZWN0aW9uTWFwcGluZzogQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmdcclxufTtcclxuXHJcbmNvbnN0IFRFWFRVUkVfV1JBUFBJTkcgPSB7XHJcblx0UmVwZWF0V3JhcHBpbmc6IFJlcGVhdFdyYXBwaW5nLFxyXG5cdENsYW1wVG9FZGdlV3JhcHBpbmc6IENsYW1wVG9FZGdlV3JhcHBpbmcsXHJcblx0TWlycm9yZWRSZXBlYXRXcmFwcGluZzogTWlycm9yZWRSZXBlYXRXcmFwcGluZ1xyXG59O1xyXG5cclxuY29uc3QgVEVYVFVSRV9GSUxURVIgPSB7XHJcblx0TmVhcmVzdEZpbHRlcjogTmVhcmVzdEZpbHRlcixcclxuXHROZWFyZXN0TWlwbWFwTmVhcmVzdEZpbHRlcjogTmVhcmVzdE1pcG1hcE5lYXJlc3RGaWx0ZXIsXHJcblx0TmVhcmVzdE1pcG1hcExpbmVhckZpbHRlcjogTmVhcmVzdE1pcG1hcExpbmVhckZpbHRlcixcclxuXHRMaW5lYXJGaWx0ZXI6IExpbmVhckZpbHRlcixcclxuXHRMaW5lYXJNaXBtYXBOZWFyZXN0RmlsdGVyOiBMaW5lYXJNaXBtYXBOZWFyZXN0RmlsdGVyLFxyXG5cdExpbmVhck1pcG1hcExpbmVhckZpbHRlcjogTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyXHJcbn07XHJcblxyXG5leHBvcnQgeyBPYmplY3RMb2FkZXIgfTtcclxuIiwiaW1wb3J0IHsgQ2FjaGUgfSBmcm9tICcuL0NhY2hlLmpzJztcclxuaW1wb3J0IHsgTG9hZGVyIH0gZnJvbSAnLi9Mb2FkZXIuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgbG9hZGVyIGZvciBsb2FkaW5nIGltYWdlcyBhcyBhbiBbSW1hZ2VCaXRtYXBde0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9JbWFnZUJpdG1hcH0uXHJcbiAqIEFuIGBJbWFnZUJpdG1hcGAgcHJvdmlkZXMgYW4gYXN5bmNocm9ub3VzIGFuZCByZXNvdXJjZSBlZmZpY2llbnQgcGF0aHdheSB0byBwcmVwYXJlXHJcbiAqIHRleHR1cmVzIGZvciByZW5kZXJpbmcuXHJcbiAqXHJcbiAqIE5vdGUgdGhhdCB7QGxpbmsgVGV4dHVyZSNmbGlwWX0gYW5kIHtAbGluayBUZXh0dXJlI3ByZW11bHRpcGx5QWxwaGF9IGFyZSBpZ25vcmVkIHdpdGggaW1hZ2UgYml0bWFwcy5cclxuICogVGhleSBuZWVkcyB0aGVzZSBjb25maWd1cmF0aW9uIG9uIGJpdG1hcCBjcmVhdGlvbiB1bmxpa2UgcmVndWxhciBpbWFnZXMgbmVlZCB0aGVtIG9uIHVwbG9hZGluZyB0byBHUFUuXHJcbiAqXHJcbiAqIFlvdSBuZWVkIHRvIHNldCB0aGUgZXF1aXZhbGVudCBvcHRpb25zIHZpYSB7QGxpbmsgSW1hZ2VCaXRtYXBMb2FkZXIjc2V0T3B0aW9uc30gaW5zdGVhZC5cclxuICpcclxuICogQWxzbyBub3RlIHRoYXQgdW5saWtlIHtAbGluayBGaWxlTG9hZGVyfSwgdGhpcyBsb2FkZXIgZG9lcyBub3QgYXZvaWQgbXVsdGlwbGUgY29uY3VycmVudCByZXF1ZXN0cyB0byB0aGUgc2FtZSBVUkwuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGxvYWRlciA9IG5ldyBUSFJFRS5JbWFnZUJpdG1hcExvYWRlcigpO1xyXG4gKiBsb2FkZXIuc2V0T3B0aW9ucyggeyBpbWFnZU9yaWVudGF0aW9uOiAnZmxpcFknIH0gKTsgLy8gc2V0IG9wdGlvbnMgaWYgbmVlZGVkXHJcbiAqIGNvbnN0IGltYWdlQml0bWFwID0gYXdhaXQgbG9hZGVyLmxvYWRBc3luYyggJ2ltYWdlLnBuZycgKTtcclxuICpcclxuICogY29uc3QgdGV4dHVyZSA9IG5ldyBUSFJFRS5UZXh0dXJlKCBpbWFnZUJpdG1hcCApO1xyXG4gKiB0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBMb2FkZXJcclxuICovXHJcbmNsYXNzIEltYWdlQml0bWFwTG9hZGVyIGV4dGVuZHMgTG9hZGVyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBpbWFnZSBiaXRtYXAgbG9hZGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtMb2FkaW5nTWFuYWdlcn0gW21hbmFnZXJdIC0gVGhlIGxvYWRpbmcgbWFuYWdlci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbWFuYWdlciApIHtcclxuXHJcblx0XHRzdXBlciggbWFuYWdlciApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0ltYWdlQml0bWFwTG9hZGVyID0gdHJ1ZTtcclxuXHJcblx0XHRpZiAoIHR5cGVvZiBjcmVhdGVJbWFnZUJpdG1hcCA9PT0gJ3VuZGVmaW5lZCcgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5JbWFnZUJpdG1hcExvYWRlcjogY3JlYXRlSW1hZ2VCaXRtYXAoKSBub3Qgc3VwcG9ydGVkLicgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0eXBlb2YgZmV0Y2ggPT09ICd1bmRlZmluZWQnICkge1xyXG5cclxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuSW1hZ2VCaXRtYXBMb2FkZXI6IGZldGNoKCkgbm90IHN1cHBvcnRlZC4nICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVwcmVzZW50cyB0aGUgbG9hZGVyIG9wdGlvbnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqIEBkZWZhdWx0IHtwcmVtdWx0aXBseUFscGhhOidub25lJ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5vcHRpb25zID0geyBwcmVtdWx0aXBseUFscGhhOiAnbm9uZScgfTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBnaXZlbiBsb2FkZXIgb3B0aW9ucy4gVGhlIHN0cnVjdHVyZSBvZiB0aGUgb2JqZWN0IG11c3QgbWF0Y2ggdGhlIGBvcHRpb25zYCBwYXJhbWV0ZXIgb2ZcclxuXHQgKiBbY3JlYXRlSW1hZ2VCaXRtYXBde0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XaW5kb3cvY3JlYXRlSW1hZ2VCaXRtYXB9LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBUaGUgbG9hZGVyIG9wdGlvbnMgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge0ltYWdlQml0bWFwTG9hZGVyfSBBIHJlZmVyZW5jZSB0byB0aGlzIGltYWdlIGJpdG1hcCBsb2FkZXIuXHJcblx0ICovXHJcblx0c2V0T3B0aW9ucyggb3B0aW9ucyApIHtcclxuXHJcblx0XHR0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFN0YXJ0cyBsb2FkaW5nIGZyb20gdGhlIGdpdmVuIFVSTCBhbmQgcGFzcyB0aGUgbG9hZGVkIGltYWdlIGJpdG1hcCB0byB0aGUgYG9uTG9hZCgpYCBjYWxsYmFjay5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSBUaGUgcGF0aC9VUkwgb2YgdGhlIGZpbGUgdG8gYmUgbG9hZGVkLiBUaGlzIGNhbiBhbHNvIGJlIGEgZGF0YSBVUkkuXHJcblx0ICogQHBhcmFtIHtmdW5jdGlvbihJbWFnZUJpdG1hcCl9IG9uTG9hZCAtIEV4ZWN1dGVkIHdoZW4gdGhlIGxvYWRpbmcgcHJvY2VzcyBoYXMgYmVlbiBmaW5pc2hlZC5cclxuXHQgKiBAcGFyYW0ge29uUHJvZ3Jlc3NDYWxsYmFja30gb25Qcm9ncmVzcyAtIFVuc3VwcG9ydGVkIGluIHRoaXMgbG9hZGVyLlxyXG5cdCAqIEBwYXJhbSB7b25FcnJvckNhbGxiYWNrfSBvbkVycm9yIC0gRXhlY3V0ZWQgd2hlbiBlcnJvcnMgb2NjdXIuXHJcblx0ICogQHJldHVybiB7SW1hZ2VCaXRtYXB8dW5kZWZpbmVkfSBUaGUgaW1hZ2UgYml0bWFwLlxyXG5cdCAqL1xyXG5cdGxvYWQoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xyXG5cclxuXHRcdGlmICggdXJsID09PSB1bmRlZmluZWQgKSB1cmwgPSAnJztcclxuXHJcblx0XHRpZiAoIHRoaXMucGF0aCAhPT0gdW5kZWZpbmVkICkgdXJsID0gdGhpcy5wYXRoICsgdXJsO1xyXG5cclxuXHRcdHVybCA9IHRoaXMubWFuYWdlci5yZXNvbHZlVVJMKCB1cmwgKTtcclxuXHJcblx0XHRjb25zdCBzY29wZSA9IHRoaXM7XHJcblxyXG5cdFx0Y29uc3QgY2FjaGVkID0gQ2FjaGUuZ2V0KCB1cmwgKTtcclxuXHJcblx0XHRpZiAoIGNhY2hlZCAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtU3RhcnQoIHVybCApO1xyXG5cclxuXHRcdFx0Ly8gSWYgY2FjaGVkIGlzIGEgcHJvbWlzZSwgd2FpdCBmb3IgaXQgdG8gcmVzb2x2ZVxyXG5cdFx0XHRpZiAoIGNhY2hlZC50aGVuICkge1xyXG5cclxuXHRcdFx0XHRjYWNoZWQudGhlbiggaW1hZ2VCaXRtYXAgPT4ge1xyXG5cclxuXHRcdFx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCBpbWFnZUJpdG1hcCApO1xyXG5cclxuXHRcdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XHJcblxyXG5cdFx0XHRcdH0gKS5jYXRjaCggZSA9PiB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBvbkVycm9yICkgb25FcnJvciggZSApO1xyXG5cclxuXHRcdFx0XHR9ICk7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gSWYgY2FjaGVkIGlzIG5vdCBhIHByb21pc2UgKGkuZS4sIGl0J3MgYWxyZWFkeSBhbiBpbWFnZUJpdG1hcClcclxuXHRcdFx0c2V0VGltZW91dCggZnVuY3Rpb24gKCkge1xyXG5cclxuXHRcdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggY2FjaGVkICk7XHJcblxyXG5cdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XHJcblxyXG5cdFx0XHR9LCAwICk7XHJcblxyXG5cdFx0XHRyZXR1cm4gY2FjaGVkO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBmZXRjaE9wdGlvbnMgPSB7fTtcclxuXHRcdGZldGNoT3B0aW9ucy5jcmVkZW50aWFscyA9ICggdGhpcy5jcm9zc09yaWdpbiA9PT0gJ2Fub255bW91cycgKSA/ICdzYW1lLW9yaWdpbicgOiAnaW5jbHVkZSc7XHJcblx0XHRmZXRjaE9wdGlvbnMuaGVhZGVycyA9IHRoaXMucmVxdWVzdEhlYWRlcjtcclxuXHJcblx0XHRjb25zdCBwcm9taXNlID0gZmV0Y2goIHVybCwgZmV0Y2hPcHRpb25zICkudGhlbiggZnVuY3Rpb24gKCByZXMgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gcmVzLmJsb2IoKTtcclxuXHJcblx0XHR9ICkudGhlbiggZnVuY3Rpb24gKCBibG9iICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIGNyZWF0ZUltYWdlQml0bWFwKCBibG9iLCBPYmplY3QuYXNzaWduKCBzY29wZS5vcHRpb25zLCB7IGNvbG9yU3BhY2VDb252ZXJzaW9uOiAnbm9uZScgfSApICk7XHJcblxyXG5cdFx0fSApLnRoZW4oIGZ1bmN0aW9uICggaW1hZ2VCaXRtYXAgKSB7XHJcblxyXG5cdFx0XHRDYWNoZS5hZGQoIHVybCwgaW1hZ2VCaXRtYXAgKTtcclxuXHJcblx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCBpbWFnZUJpdG1hcCApO1xyXG5cclxuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcclxuXHJcblx0XHRcdHJldHVybiBpbWFnZUJpdG1hcDtcclxuXHJcblx0XHR9ICkuY2F0Y2goIGZ1bmN0aW9uICggZSApIHtcclxuXHJcblx0XHRcdGlmICggb25FcnJvciApIG9uRXJyb3IoIGUgKTtcclxuXHJcblx0XHRcdENhY2hlLnJlbW92ZSggdXJsICk7XHJcblxyXG5cdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FcnJvciggdXJsICk7XHJcblx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XHJcblxyXG5cdFx0fSApO1xyXG5cclxuXHRcdENhY2hlLmFkZCggdXJsLCBwcm9taXNlICk7XHJcblx0XHRzY29wZS5tYW5hZ2VyLml0ZW1TdGFydCggdXJsICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IEltYWdlQml0bWFwTG9hZGVyIH07XHJcbiIsImxldCBfY29udGV4dDtcclxuXHJcbi8qKlxyXG4gKiBNYW5hZ2VzIHRoZSBnbG9iYWwgYXVkaW8gY29udGV4dCBpbiB0aGUgZW5naW5lLlxyXG4gKlxyXG4gKiBAaGlkZWNvbnN0cnVjdG9yXHJcbiAqL1xyXG5jbGFzcyBBdWRpb0NvbnRleHQge1xyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBnbG9iYWwgbmF0aXZlIGF1ZGlvIGNvbnRleHQuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtBdWRpb0NvbnRleHR9IFRoZSBuYXRpdmUgYXVkaW8gY29udGV4dC5cclxuXHQgKi9cclxuXHRzdGF0aWMgZ2V0Q29udGV4dCgpIHtcclxuXHJcblx0XHRpZiAoIF9jb250ZXh0ID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRfY29udGV4dCA9IG5ldyAoIHdpbmRvdy5BdWRpb0NvbnRleHQgfHwgd2luZG93LndlYmtpdEF1ZGlvQ29udGV4dCApKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBfY29udGV4dDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBbGxvd3MgdG8gc2V0IHRoZSBnbG9iYWwgbmF0aXZlIGF1ZGlvIGNvbnRleHQgZnJvbSBvdXRzaWRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBdWRpb0NvbnRleHR9IHZhbHVlIC0gVGhlIG5hdGl2ZSBjb250ZXh0IHRvIHNldC5cclxuXHQgKi9cclxuXHRzdGF0aWMgc2V0Q29udGV4dCggdmFsdWUgKSB7XHJcblxyXG5cdFx0X2NvbnRleHQgPSB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgQXVkaW9Db250ZXh0IH07XHJcbiIsImltcG9ydCB7IEF1ZGlvQ29udGV4dCB9IGZyb20gJy4uL2F1ZGlvL0F1ZGlvQ29udGV4dC5qcyc7XHJcbmltcG9ydCB7IEZpbGVMb2FkZXIgfSBmcm9tICcuL0ZpbGVMb2FkZXIuanMnO1xyXG5pbXBvcnQgeyBMb2FkZXIgfSBmcm9tICcuL0xvYWRlci5qcyc7XHJcblxyXG4vKipcclxuICogQ2xhc3MgZm9yIGxvYWRpbmcgYXVkaW8gYnVmZmVycy4gQXVkaW9zIGFyZSBpbnRlcm5hbGx5XHJcbiAqIGxvYWRlZCB2aWEge0BsaW5rIEZpbGVMb2FkZXJ9LlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBhdWRpb0xpc3RlbmVyID0gbmV3IFRIUkVFLkF1ZGlvTGlzdGVuZXIoKTtcclxuICogY29uc3QgYW1iaWVudFNvdW5kID0gbmV3IFRIUkVFLkF1ZGlvKCBhdWRpb0xpc3RlbmVyICk7XHJcbiAqXHJcbiAqIGNvbnN0IGxvYWRlciA9IG5ldyBUSFJFRS5BdWRpb0xvYWRlcigpO1xyXG4gKiBjb25zdCBhdWRpb0J1ZmZlciA9IGF3YWl0IGxvYWRlci5sb2FkQXN5bmMoICdhdWRpby9hbWJpZW50X29jZWFuLm9nZycgKTtcclxuICpcclxuICogYW1iaWVudFNvdW5kLnNldEJ1ZmZlciggYXVkaW9CdWZmZXIgKTtcclxuICogYW1iaWVudFNvdW5kLnBsYXkoKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBMb2FkZXJcclxuICovXHJcbmNsYXNzIEF1ZGlvTG9hZGVyIGV4dGVuZHMgTG9hZGVyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBhdWRpbyBsb2FkZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0xvYWRpbmdNYW5hZ2VyfSBbbWFuYWdlcl0gLSBUaGUgbG9hZGluZyBtYW5hZ2VyLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBtYW5hZ2VyICkge1xyXG5cclxuXHRcdHN1cGVyKCBtYW5hZ2VyICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3RhcnRzIGxvYWRpbmcgZnJvbSB0aGUgZ2l2ZW4gVVJMIGFuZCBwYXNzZXMgdGhlIGxvYWRlZCBhdWRpbyBidWZmZXJcclxuXHQgKiB0byB0aGUgYG9uTG9hZCgpYCBjYWxsYmFjay5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSBUaGUgcGF0aC9VUkwgb2YgdGhlIGZpbGUgdG8gYmUgbG9hZGVkLiBUaGlzIGNhbiBhbHNvIGJlIGEgZGF0YSBVUkkuXHJcblx0ICogQHBhcmFtIHtmdW5jdGlvbihBdWRpb0J1ZmZlcil9IG9uTG9hZCAtIEV4ZWN1dGVkIHdoZW4gdGhlIGxvYWRpbmcgcHJvY2VzcyBoYXMgYmVlbiBmaW5pc2hlZC5cclxuXHQgKiBAcGFyYW0ge29uUHJvZ3Jlc3NDYWxsYmFja30gb25Qcm9ncmVzcyAtIEV4ZWN1dGVkIHdoaWxlIHRoZSBsb2FkaW5nIGlzIGluIHByb2dyZXNzLlxyXG5cdCAqIEBwYXJhbSB7b25FcnJvckNhbGxiYWNrfSBvbkVycm9yIC0gRXhlY3V0ZWQgd2hlbiBlcnJvcnMgb2NjdXIuXHJcblx0ICovXHJcblx0bG9hZCggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XHJcblxyXG5cdFx0Y29uc3Qgc2NvcGUgPSB0aGlzO1xyXG5cclxuXHRcdGNvbnN0IGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCB0aGlzLm1hbmFnZXIgKTtcclxuXHRcdGxvYWRlci5zZXRSZXNwb25zZVR5cGUoICdhcnJheWJ1ZmZlcicgKTtcclxuXHRcdGxvYWRlci5zZXRQYXRoKCB0aGlzLnBhdGggKTtcclxuXHRcdGxvYWRlci5zZXRSZXF1ZXN0SGVhZGVyKCB0aGlzLnJlcXVlc3RIZWFkZXIgKTtcclxuXHRcdGxvYWRlci5zZXRXaXRoQ3JlZGVudGlhbHMoIHRoaXMud2l0aENyZWRlbnRpYWxzICk7XHJcblx0XHRsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoIGJ1ZmZlciApIHtcclxuXHJcblx0XHRcdHRyeSB7XHJcblxyXG5cdFx0XHRcdC8vIENyZWF0ZSBhIGNvcHkgb2YgdGhlIGJ1ZmZlci4gVGhlIGBkZWNvZGVBdWRpb0RhdGFgIG1ldGhvZFxyXG5cdFx0XHRcdC8vIGRldGFjaGVzIHRoZSBidWZmZXIgd2hlbiBjb21wbGV0ZSwgcHJldmVudGluZyByZXVzZS5cclxuXHRcdFx0XHRjb25zdCBidWZmZXJDb3B5ID0gYnVmZmVyLnNsaWNlKCAwICk7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGNvbnRleHQgPSBBdWRpb0NvbnRleHQuZ2V0Q29udGV4dCgpO1xyXG5cdFx0XHRcdGNvbnRleHQuZGVjb2RlQXVkaW9EYXRhKCBidWZmZXJDb3B5LCBmdW5jdGlvbiAoIGF1ZGlvQnVmZmVyICkge1xyXG5cclxuXHRcdFx0XHRcdG9uTG9hZCggYXVkaW9CdWZmZXIgKTtcclxuXHJcblx0XHRcdFx0fSApLmNhdGNoKCBoYW5kbGVFcnJvciApO1xyXG5cclxuXHRcdFx0fSBjYXRjaCAoIGUgKSB7XHJcblxyXG5cdFx0XHRcdGhhbmRsZUVycm9yKCBlICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xyXG5cclxuXHRcdGZ1bmN0aW9uIGhhbmRsZUVycm9yKCBlICkge1xyXG5cclxuXHRcdFx0aWYgKCBvbkVycm9yICkge1xyXG5cclxuXHRcdFx0XHRvbkVycm9yKCBlICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCBlICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FcnJvciggdXJsICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgQXVkaW9Mb2FkZXIgfTtcclxuIiwiaW1wb3J0IHsgTWF0cml4NCB9IGZyb20gJy4uL21hdGgvTWF0cml4NC5qcyc7XHJcbmltcG9ydCB7IERFRzJSQUQgfSBmcm9tICcuLi9tYXRoL01hdGhVdGlscy5qcyc7XHJcbmltcG9ydCB7IFBlcnNwZWN0aXZlQ2FtZXJhIH0gZnJvbSAnLi9QZXJzcGVjdGl2ZUNhbWVyYS5qcyc7XHJcblxyXG5jb25zdCBfZXllUmlnaHQgPSAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXg0KCk7XHJcbmNvbnN0IF9leWVMZWZ0ID0gLypAX19QVVJFX18qLyBuZXcgTWF0cml4NCgpO1xyXG5jb25zdCBfcHJvamVjdGlvbk1hdHJpeCA9IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDQoKTtcclxuXHJcbi8qKlxyXG4gKiBBIHNwZWNpYWwgdHlwZSBvZiBjYW1lcmEgdGhhdCB1c2VzIHR3byBwZXJzcGVjdGl2ZSBjYW1lcmFzIHdpdGhcclxuICogc3RlcmVvc2NvcGljIHByb2plY3Rpb24uIENhbiBiZSB1c2VkIGZvciByZW5kZXJpbmcgc3RlcmVvIGVmZmVjdHNcclxuICogbGlrZSBbM0QgQW5hZ2x5cGhde0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FuYWdseXBoXzNEfSBvclxyXG4gKiBbUGFyYWxsYXggQmFycmllcl17QGxpbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvcGFyYWxsYXhfYmFycmllcn0uXHJcbiAqL1xyXG5jbGFzcyBTdGVyZW9DYW1lcmEge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHN0ZXJlbyBjYW1lcmEuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdHlwZSBwcm9wZXJ0eSBpcyB1c2VkIGZvciBkZXRlY3RpbmcgdGhlIG9iamVjdCB0eXBlXHJcblx0XHQgKiBpbiBjb250ZXh0IG9mIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50eXBlID0gJ1N0ZXJlb0NhbWVyYSc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYXNwZWN0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYXNwZWN0ID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBleWUgc2VwYXJhdGlvbiB3aGljaCByZXByZXNlbnRzIHRoZSBkaXN0YW5jZVxyXG5cdFx0ICogYmV0d2VlbiB0aGUgbGVmdCBhbmQgcmlnaHQgY2FtZXJhLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwLjA2NFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmV5ZVNlcCA9IDAuMDY0O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNhbWVyYSByZXByZXNlbnRpbmcgdGhlIGxlZnQgZXllLiBUaGlzIGlzIGFkZGVkIHRvIGxheWVyIGAxYCBzbyBvYmplY3RzIHRvIGJlXHJcblx0XHQgKiByZW5kZXJlZCBieSB0aGUgbGVmdCBjYW1lcmEgbXVzdCBhbHNvIGJlIGFkZGVkIHRvIHRoaXMgbGF5ZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1BlcnNwZWN0aXZlQ2FtZXJhfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNhbWVyYUwgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoKTtcclxuXHRcdHRoaXMuY2FtZXJhTC5sYXllcnMuZW5hYmxlKCAxICk7XHJcblx0XHR0aGlzLmNhbWVyYUwubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNhbWVyYSByZXByZXNlbnRpbmcgdGhlIHJpZ2h0IGV5ZS4gVGhpcyBpcyBhZGRlZCB0byBsYXllciBgMmAgc28gb2JqZWN0cyB0byBiZVxyXG5cdFx0ICogcmVuZGVyZWQgYnkgdGhlIHJpZ2h0IGNhbWVyYSBtdXN0IGFsc28gYmUgYWRkZWQgdG8gdGhpcyBsYXllci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7UGVyc3BlY3RpdmVDYW1lcmF9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2FtZXJhUiA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSgpO1xyXG5cdFx0dGhpcy5jYW1lcmFSLmxheWVycy5lbmFibGUoIDIgKTtcclxuXHRcdHRoaXMuY2FtZXJhUi5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XHJcblxyXG5cdFx0dGhpcy5fY2FjaGUgPSB7XHJcblx0XHRcdGZvY3VzOiBudWxsLFxyXG5cdFx0XHRmb3Y6IG51bGwsXHJcblx0XHRcdGFzcGVjdDogbnVsbCxcclxuXHRcdFx0bmVhcjogbnVsbCxcclxuXHRcdFx0ZmFyOiBudWxsLFxyXG5cdFx0XHR6b29tOiBudWxsLFxyXG5cdFx0XHRleWVTZXA6IG51bGxcclxuXHRcdH07XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgc3RlcmVvIGNhbWVyYSBiYXNlZCBvbiB0aGUgZ2l2ZW4gcGVyc3BlY3RpdmUgY2FtZXJhLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtQZXJzcGVjdGl2ZUNhbWVyYX0gY2FtZXJhIC0gVGhlIHBlcnNwZWN0aXZlIGNhbWVyYS5cclxuXHQgKi9cclxuXHR1cGRhdGUoIGNhbWVyYSApIHtcclxuXHJcblx0XHRjb25zdCBjYWNoZSA9IHRoaXMuX2NhY2hlO1xyXG5cclxuXHRcdGNvbnN0IG5lZWRzVXBkYXRlID0gY2FjaGUuZm9jdXMgIT09IGNhbWVyYS5mb2N1cyB8fCBjYWNoZS5mb3YgIT09IGNhbWVyYS5mb3YgfHxcclxuXHRcdFx0Y2FjaGUuYXNwZWN0ICE9PSBjYW1lcmEuYXNwZWN0ICogdGhpcy5hc3BlY3QgfHwgY2FjaGUubmVhciAhPT0gY2FtZXJhLm5lYXIgfHxcclxuXHRcdFx0Y2FjaGUuZmFyICE9PSBjYW1lcmEuZmFyIHx8IGNhY2hlLnpvb20gIT09IGNhbWVyYS56b29tIHx8IGNhY2hlLmV5ZVNlcCAhPT0gdGhpcy5leWVTZXA7XHJcblxyXG5cdFx0aWYgKCBuZWVkc1VwZGF0ZSApIHtcclxuXHJcblx0XHRcdGNhY2hlLmZvY3VzID0gY2FtZXJhLmZvY3VzO1xyXG5cdFx0XHRjYWNoZS5mb3YgPSBjYW1lcmEuZm92O1xyXG5cdFx0XHRjYWNoZS5hc3BlY3QgPSBjYW1lcmEuYXNwZWN0ICogdGhpcy5hc3BlY3Q7XHJcblx0XHRcdGNhY2hlLm5lYXIgPSBjYW1lcmEubmVhcjtcclxuXHRcdFx0Y2FjaGUuZmFyID0gY2FtZXJhLmZhcjtcclxuXHRcdFx0Y2FjaGUuem9vbSA9IGNhbWVyYS56b29tO1xyXG5cdFx0XHRjYWNoZS5leWVTZXAgPSB0aGlzLmV5ZVNlcDtcclxuXHJcblx0XHRcdC8vIE9mZi1heGlzIHN0ZXJlb3Njb3BpYyBlZmZlY3QgYmFzZWQgb25cclxuXHRcdFx0Ly8gaHR0cDovL3BhdWxib3Vya2UubmV0L3N0ZXJlb2dyYXBoaWNzL3N0ZXJlb3JlbmRlci9cclxuXHJcblx0XHRcdF9wcm9qZWN0aW9uTWF0cml4LmNvcHkoIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4ICk7XHJcblx0XHRcdGNvbnN0IGV5ZVNlcEhhbGYgPSBjYWNoZS5leWVTZXAgLyAyO1xyXG5cdFx0XHRjb25zdCBleWVTZXBPblByb2plY3Rpb24gPSBleWVTZXBIYWxmICogY2FjaGUubmVhciAvIGNhY2hlLmZvY3VzO1xyXG5cdFx0XHRjb25zdCB5bWF4ID0gKCBjYWNoZS5uZWFyICogTWF0aC50YW4oIERFRzJSQUQgKiBjYWNoZS5mb3YgKiAwLjUgKSApIC8gY2FjaGUuem9vbTtcclxuXHRcdFx0bGV0IHhtaW4sIHhtYXg7XHJcblxyXG5cdFx0XHQvLyB0cmFuc2xhdGUgeE9mZnNldFxyXG5cclxuXHRcdFx0X2V5ZUxlZnQuZWxlbWVudHNbIDEyIF0gPSAtIGV5ZVNlcEhhbGY7XHJcblx0XHRcdF9leWVSaWdodC5lbGVtZW50c1sgMTIgXSA9IGV5ZVNlcEhhbGY7XHJcblxyXG5cdFx0XHQvLyBmb3IgbGVmdCBleWVcclxuXHJcblx0XHRcdHhtaW4gPSAtIHltYXggKiBjYWNoZS5hc3BlY3QgKyBleWVTZXBPblByb2plY3Rpb247XHJcblx0XHRcdHhtYXggPSB5bWF4ICogY2FjaGUuYXNwZWN0ICsgZXllU2VwT25Qcm9qZWN0aW9uO1xyXG5cclxuXHRcdFx0X3Byb2plY3Rpb25NYXRyaXguZWxlbWVudHNbIDAgXSA9IDIgKiBjYWNoZS5uZWFyIC8gKCB4bWF4IC0geG1pbiApO1xyXG5cdFx0XHRfcHJvamVjdGlvbk1hdHJpeC5lbGVtZW50c1sgOCBdID0gKCB4bWF4ICsgeG1pbiApIC8gKCB4bWF4IC0geG1pbiApO1xyXG5cclxuXHRcdFx0dGhpcy5jYW1lcmFMLnByb2plY3Rpb25NYXRyaXguY29weSggX3Byb2plY3Rpb25NYXRyaXggKTtcclxuXHJcblx0XHRcdC8vIGZvciByaWdodCBleWVcclxuXHJcblx0XHRcdHhtaW4gPSAtIHltYXggKiBjYWNoZS5hc3BlY3QgLSBleWVTZXBPblByb2plY3Rpb247XHJcblx0XHRcdHhtYXggPSB5bWF4ICogY2FjaGUuYXNwZWN0IC0gZXllU2VwT25Qcm9qZWN0aW9uO1xyXG5cclxuXHRcdFx0X3Byb2plY3Rpb25NYXRyaXguZWxlbWVudHNbIDAgXSA9IDIgKiBjYWNoZS5uZWFyIC8gKCB4bWF4IC0geG1pbiApO1xyXG5cdFx0XHRfcHJvamVjdGlvbk1hdHJpeC5lbGVtZW50c1sgOCBdID0gKCB4bWF4ICsgeG1pbiApIC8gKCB4bWF4IC0geG1pbiApO1xyXG5cclxuXHRcdFx0dGhpcy5jYW1lcmFSLnByb2plY3Rpb25NYXRyaXguY29weSggX3Byb2plY3Rpb25NYXRyaXggKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5jYW1lcmFMLm1hdHJpeFdvcmxkLmNvcHkoIGNhbWVyYS5tYXRyaXhXb3JsZCApLm11bHRpcGx5KCBfZXllTGVmdCApO1xyXG5cdFx0dGhpcy5jYW1lcmFSLm1hdHJpeFdvcmxkLmNvcHkoIGNhbWVyYS5tYXRyaXhXb3JsZCApLm11bHRpcGx5KCBfZXllUmlnaHQgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgU3RlcmVvQ2FtZXJhIH07XHJcbiIsImltcG9ydCB7IFBlcnNwZWN0aXZlQ2FtZXJhIH0gZnJvbSAnLi9QZXJzcGVjdGl2ZUNhbWVyYS5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyB0eXBlIG9mIGNhbWVyYSBjYW4gYmUgdXNlZCBpbiBvcmRlciB0byBlZmZpY2llbnRseSByZW5kZXIgYSBzY2VuZSB3aXRoIGFcclxuICogcHJlZGVmaW5lZCBzZXQgb2YgY2FtZXJhcy4gVGhpcyBpcyBhbiBpbXBvcnRhbnQgcGVyZm9ybWFuY2UgYXNwZWN0IGZvclxyXG4gKiByZW5kZXJpbmcgVlIgc2NlbmVzLlxyXG4gKlxyXG4gKiBBbiBpbnN0YW5jZSBvZiBgQXJyYXlDYW1lcmFgIGFsd2F5cyBoYXMgYW4gYXJyYXkgb2Ygc3ViIGNhbWVyYXMuIEl0J3MgbWFuZGF0b3J5XHJcbiAqIHRvIGRlZmluZSBmb3IgZWFjaCBzdWIgY2FtZXJhIHRoZSBgdmlld3BvcnRgIHByb3BlcnR5IHdoaWNoIGRldGVybWluZXMgdGhlXHJcbiAqIHBhcnQgb2YgdGhlIHZpZXdwb3J0IHRoYXQgaXMgcmVuZGVyZWQgd2l0aCB0aGlzIGNhbWVyYS5cclxuICpcclxuICogQGF1Z21lbnRzIFBlcnNwZWN0aXZlQ2FtZXJhXHJcbiAqL1xyXG5jbGFzcyBBcnJheUNhbWVyYSBleHRlbmRzIFBlcnNwZWN0aXZlQ2FtZXJhIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBhcnJheSBjYW1lcmEuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PFBlcnNwZWN0aXZlQ2FtZXJhPn0gW2FycmF5PVtdXSAtIEFuIGFycmF5IG9mIHBlcnNwZWN0aXZlIHN1YiBjYW1lcmFzLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBhcnJheSA9IFtdICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzQXJyYXlDYW1lcmEgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQW4gYXJyYXkgb2YgcGVyc3BlY3RpdmUgc3ViIGNhbWVyYXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PFBlcnNwZWN0aXZlQ2FtZXJhPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jYW1lcmFzID0gYXJyYXk7XHJcblx0XHR0aGlzLmluZGV4ID0gMDtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgQXJyYXlDYW1lcmEgfTtcclxuIiwiLyoqXHJcbiAqIENsYXNzIGZvciBrZWVwaW5nIHRyYWNrIG9mIHRpbWUuXHJcbiAqL1xyXG5jbGFzcyBDbG9jayB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgY2xvY2suXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFthdXRvU3RhcnQ9dHJ1ZV0gLSBXaGV0aGVyIHRvIGF1dG9tYXRpY2FsbHkgc3RhcnQgdGhlIGNsb2NrIHdoZW5cclxuXHQgKiBgZ2V0RGVsdGEoKWAgaXMgY2FsbGVkIGZvciB0aGUgZmlyc3QgdGltZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggYXV0b1N0YXJ0ID0gdHJ1ZSApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIElmIHNldCB0byBgdHJ1ZWAsIHRoZSBjbG9jayBzdGFydHMgYXV0b21hdGljYWxseSB3aGVuIGBnZXREZWx0YSgpYCBpcyBjYWxsZWRcclxuXHRcdCAqIGZvciB0aGUgZmlyc3QgdGltZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hdXRvU3RhcnQgPSBhdXRvU3RhcnQ7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb2xkcyB0aGUgdGltZSBhdCB3aGljaCB0aGUgY2xvY2sncyBgc3RhcnQoKWAgbWV0aG9kIHdhcyBsYXN0IGNhbGxlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnN0YXJ0VGltZSA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb2xkcyB0aGUgdGltZSBhdCB3aGljaCB0aGUgY2xvY2sncyBgc3RhcnQoKWAsIGBnZXRFbGFwc2VkVGltZSgpYCBvclxyXG5cdFx0ICogYGdldERlbHRhKClgIG1ldGhvZHMgd2VyZSBsYXN0IGNhbGxlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm9sZFRpbWUgPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogS2VlcHMgdHJhY2sgb2YgdGhlIHRvdGFsIHRpbWUgdGhhdCB0aGUgY2xvY2sgaGFzIGJlZW4gcnVubmluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmVsYXBzZWRUaW1lID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIGNsb2NrIGlzIHJ1bm5pbmcgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJ1bm5pbmcgPSBmYWxzZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTdGFydHMgdGhlIGNsb2NrLiBXaGVuIGBhdXRvU3RhcnRgIGlzIHNldCB0byBgdHJ1ZWAsIHRoZSBtZXRob2QgaXMgYXV0b21hdGljYWxseVxyXG5cdCAqIGNhbGxlZCBieSB0aGUgY2xhc3MuXHJcblx0ICovXHJcblx0c3RhcnQoKSB7XHJcblxyXG5cdFx0dGhpcy5zdGFydFRpbWUgPSBub3coKTtcclxuXHJcblx0XHR0aGlzLm9sZFRpbWUgPSB0aGlzLnN0YXJ0VGltZTtcclxuXHRcdHRoaXMuZWxhcHNlZFRpbWUgPSAwO1xyXG5cdFx0dGhpcy5ydW5uaW5nID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTdG9wcyB0aGUgY2xvY2suXHJcblx0ICovXHJcblx0c3RvcCgpIHtcclxuXHJcblx0XHR0aGlzLmdldEVsYXBzZWRUaW1lKCk7XHJcblx0XHR0aGlzLnJ1bm5pbmcgPSBmYWxzZTtcclxuXHRcdHRoaXMuYXV0b1N0YXJ0ID0gZmFsc2U7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgZWxhcHNlZCB0aW1lIGluIHNlY29uZHMuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBlbGFwc2VkIHRpbWUuXHJcblx0ICovXHJcblx0Z2V0RWxhcHNlZFRpbWUoKSB7XHJcblxyXG5cdFx0dGhpcy5nZXREZWx0YSgpO1xyXG5cdFx0cmV0dXJuIHRoaXMuZWxhcHNlZFRpbWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgZGVsdGEgdGltZSBpbiBzZWNvbmRzLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgZGVsdGEgdGltZS5cclxuXHQgKi9cclxuXHRnZXREZWx0YSgpIHtcclxuXHJcblx0XHRsZXQgZGlmZiA9IDA7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmF1dG9TdGFydCAmJiAhIHRoaXMucnVubmluZyApIHtcclxuXHJcblx0XHRcdHRoaXMuc3RhcnQoKTtcclxuXHRcdFx0cmV0dXJuIDA7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy5ydW5uaW5nICkge1xyXG5cclxuXHRcdFx0Y29uc3QgbmV3VGltZSA9IG5vdygpO1xyXG5cclxuXHRcdFx0ZGlmZiA9ICggbmV3VGltZSAtIHRoaXMub2xkVGltZSApIC8gMTAwMDtcclxuXHRcdFx0dGhpcy5vbGRUaW1lID0gbmV3VGltZTtcclxuXHJcblx0XHRcdHRoaXMuZWxhcHNlZFRpbWUgKz0gZGlmZjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGRpZmY7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIG5vdygpIHtcclxuXHJcblx0cmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpO1xyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgQ2xvY2sgfTtcclxuIiwiaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcbmltcG9ydCB7IFF1YXRlcm5pb24gfSBmcm9tICcuLi9tYXRoL1F1YXRlcm5pb24uanMnO1xyXG5pbXBvcnQgeyBDbG9jayB9IGZyb20gJy4uL2NvcmUvQ2xvY2suanMnO1xyXG5pbXBvcnQgeyBPYmplY3QzRCB9IGZyb20gJy4uL2NvcmUvT2JqZWN0M0QuanMnO1xyXG5pbXBvcnQgeyBBdWRpb0NvbnRleHQgfSBmcm9tICcuL0F1ZGlvQ29udGV4dC5qcyc7XHJcblxyXG5jb25zdCBfcG9zaXRpb24gPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF9xdWF0ZXJuaW9uID0gLypAX19QVVJFX18qLyBuZXcgUXVhdGVybmlvbigpO1xyXG5jb25zdCBfc2NhbGUgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF9vcmllbnRhdGlvbiA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuXHJcbi8qKlxyXG4gKiBUaGUgY2xhc3MgcmVwcmVzZW50cyBhIHZpcnR1YWwgbGlzdGVuZXIgb2YgdGhlIGFsbCBwb3NpdGlvbmFsIGFuZCBub24tcG9zaXRpb25hbCBhdWRpbyBlZmZlY3RzXHJcbiAqIGluIHRoZSBzY2VuZS4gQSB0aHJlZS5qcyBhcHBsaWNhdGlvbiB1c3VhbGx5IGNyZWF0ZXMgYSBzaW5nbGUgbGlzdGVuZXIuIEl0IGlzIGEgbWFuZGF0b3J5XHJcbiAqIGNvbnN0cnVjdG9yIHBhcmFtZXRlciBmb3IgYXVkaW9zIGVudGl0aWVzIGxpa2Uge0BsaW5rIEF1ZGlvfSBhbmQge0BsaW5rIFBvc2l0aW9uYWxBdWRpb30uXHJcbiAqXHJcbiAqIEluIG1vc3QgY2FzZXMsIHRoZSBsaXN0ZW5lciBvYmplY3QgaXMgYSBjaGlsZCBvZiB0aGUgY2FtZXJhLiBTbyB0aGUgM0QgdHJhbnNmb3JtYXRpb24gb2YgdGhlXHJcbiAqIGNhbWVyYSByZXByZXNlbnRzIHRoZSAzRCB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgbGlzdGVuZXIuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBPYmplY3QzRFxyXG4gKi9cclxuY2xhc3MgQXVkaW9MaXN0ZW5lciBleHRlbmRzIE9iamVjdDNEIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBhdWRpbyBsaXN0ZW5lci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdBdWRpb0xpc3RlbmVyJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBuYXRpdmUgYXVkaW8gY29udGV4dC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXVkaW9Db250ZXh0fVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29udGV4dCA9IEF1ZGlvQ29udGV4dC5nZXRDb250ZXh0KCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZ2FpbiBub2RlIHVzZWQgZm9yIHZvbHVtZSBjb250cm9sLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtHYWluTm9kZX1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdhaW4gPSB0aGlzLmNvbnRleHQuY3JlYXRlR2FpbigpO1xyXG5cdFx0dGhpcy5nYWluLmNvbm5lY3QoIHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQW4gb3B0aW9uYWwgZmlsdGVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIERlZmluZWQgdmlhIHtAbGluayBBdWRpb0xpc3RlbmVyI3NldEZpbHRlcn0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9BdWRpb05vZGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5maWx0ZXIgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGltZSBkZWx0YSB2YWx1ZXMgcmVxdWlyZWQgZm9yIGBsaW5lYXJSYW1wVG9WYWx1ZUF0VGltZSgpYCB1c2FnZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudGltZURlbHRhID0gMDtcclxuXHJcblx0XHQvLyBwcml2YXRlXHJcblxyXG5cdFx0dGhpcy5fY2xvY2sgPSBuZXcgQ2xvY2soKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBsaXN0ZW5lcidzIGlucHV0IG5vZGUuXHJcblx0ICpcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IG90aGVyIGF1ZGlvIG5vZGVzIHRvIGNvbm5lY3QgdG8gdGhpcyBsaXN0ZW5lci5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0dhaW5Ob2RlfSBUaGUgaW5wdXQgbm9kZS5cclxuXHQgKi9cclxuXHRnZXRJbnB1dCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5nYWluO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbW92ZXMgdGhlIGN1cnJlbnQgZmlsdGVyIGZyb20gdGhpcyBsaXN0ZW5lci5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0F1ZGlvTGlzdGVuZXJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbGlzdGVuZXIuXHJcblx0ICovXHJcblx0cmVtb3ZlRmlsdGVyKCkge1xyXG5cclxuXHRcdGlmICggdGhpcy5maWx0ZXIgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmdhaW4uZGlzY29ubmVjdCggdGhpcy5maWx0ZXIgKTtcclxuXHRcdFx0dGhpcy5maWx0ZXIuZGlzY29ubmVjdCggdGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uICk7XHJcblx0XHRcdHRoaXMuZ2Fpbi5jb25uZWN0KCB0aGlzLmNvbnRleHQuZGVzdGluYXRpb24gKTtcclxuXHRcdFx0dGhpcy5maWx0ZXIgPSBudWxsO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNldCBmaWx0ZXIuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHs/QXVkaW9Ob2RlfSBUaGUgZmlsdGVyLlxyXG5cdCAqL1xyXG5cdGdldEZpbHRlcigpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5maWx0ZXI7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZ2l2ZW4gZmlsdGVyIHRvIHRoaXMgbGlzdGVuZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0F1ZGlvTm9kZX0gdmFsdWUgLSBUaGUgZmlsdGVyIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtBdWRpb0xpc3RlbmVyfSBBIHJlZmVyZW5jZSB0byB0aGlzIGxpc3RlbmVyLlxyXG5cdCAqL1xyXG5cdHNldEZpbHRlciggdmFsdWUgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmZpbHRlciAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuZ2Fpbi5kaXNjb25uZWN0KCB0aGlzLmZpbHRlciApO1xyXG5cdFx0XHR0aGlzLmZpbHRlci5kaXNjb25uZWN0KCB0aGlzLmNvbnRleHQuZGVzdGluYXRpb24gKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGhpcy5nYWluLmRpc2Nvbm5lY3QoIHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmZpbHRlciA9IHZhbHVlO1xyXG5cdFx0dGhpcy5nYWluLmNvbm5lY3QoIHRoaXMuZmlsdGVyICk7XHJcblx0XHR0aGlzLmZpbHRlci5jb25uZWN0KCB0aGlzLmNvbnRleHQuZGVzdGluYXRpb24gKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBhcHBsaWNhdGlvbnMgbWFzdGVyIHZvbHVtZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIG1hc3RlciB2b2x1bWUuXHJcblx0ICovXHJcblx0Z2V0TWFzdGVyVm9sdW1lKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmdhaW4uZ2Fpbi52YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBhcHBsaWNhdGlvbnMgbWFzdGVyIHZvbHVtZS4gVGhpcyB2b2x1bWUgc2V0dGluZyBhZmZlY3RzXHJcblx0ICogYWxsIGF1ZGlvIG5vZGVzIGluIHRoZSBzY2VuZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBtYXN0ZXIgdm9sdW1lIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtBdWRpb0xpc3RlbmVyfSBBIHJlZmVyZW5jZSB0byB0aGlzIGxpc3RlbmVyLlxyXG5cdCAqL1xyXG5cdHNldE1hc3RlclZvbHVtZSggdmFsdWUgKSB7XHJcblxyXG5cdFx0dGhpcy5nYWluLmdhaW4uc2V0VGFyZ2V0QXRUaW1lKCB2YWx1ZSwgdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lLCAwLjAxICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0dXBkYXRlTWF0cml4V29ybGQoIGZvcmNlICkge1xyXG5cclxuXHRcdHN1cGVyLnVwZGF0ZU1hdHJpeFdvcmxkKCBmb3JjZSApO1xyXG5cclxuXHRcdGNvbnN0IGxpc3RlbmVyID0gdGhpcy5jb250ZXh0Lmxpc3RlbmVyO1xyXG5cdFx0Y29uc3QgdXAgPSB0aGlzLnVwO1xyXG5cclxuXHRcdHRoaXMudGltZURlbHRhID0gdGhpcy5fY2xvY2suZ2V0RGVsdGEoKTtcclxuXHJcblx0XHR0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZSggX3Bvc2l0aW9uLCBfcXVhdGVybmlvbiwgX3NjYWxlICk7XHJcblxyXG5cdFx0X29yaWVudGF0aW9uLnNldCggMCwgMCwgLSAxICkuYXBwbHlRdWF0ZXJuaW9uKCBfcXVhdGVybmlvbiApO1xyXG5cclxuXHRcdGlmICggbGlzdGVuZXIucG9zaXRpb25YICkge1xyXG5cclxuXHRcdFx0Ly8gY29kZSBwYXRoIGZvciBDaHJvbWUgKHNlZSAjMTQzOTMpXHJcblxyXG5cdFx0XHRjb25zdCBlbmRUaW1lID0gdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lICsgdGhpcy50aW1lRGVsdGE7XHJcblxyXG5cdFx0XHRsaXN0ZW5lci5wb3NpdGlvblgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoIF9wb3NpdGlvbi54LCBlbmRUaW1lICk7XHJcblx0XHRcdGxpc3RlbmVyLnBvc2l0aW9uWS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSggX3Bvc2l0aW9uLnksIGVuZFRpbWUgKTtcclxuXHRcdFx0bGlzdGVuZXIucG9zaXRpb25aLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKCBfcG9zaXRpb24ueiwgZW5kVGltZSApO1xyXG5cdFx0XHRsaXN0ZW5lci5mb3J3YXJkWC5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSggX29yaWVudGF0aW9uLngsIGVuZFRpbWUgKTtcclxuXHRcdFx0bGlzdGVuZXIuZm9yd2FyZFkubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoIF9vcmllbnRhdGlvbi55LCBlbmRUaW1lICk7XHJcblx0XHRcdGxpc3RlbmVyLmZvcndhcmRaLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKCBfb3JpZW50YXRpb24ueiwgZW5kVGltZSApO1xyXG5cdFx0XHRsaXN0ZW5lci51cFgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoIHVwLngsIGVuZFRpbWUgKTtcclxuXHRcdFx0bGlzdGVuZXIudXBZLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKCB1cC55LCBlbmRUaW1lICk7XHJcblx0XHRcdGxpc3RlbmVyLnVwWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSggdXAueiwgZW5kVGltZSApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRsaXN0ZW5lci5zZXRQb3NpdGlvbiggX3Bvc2l0aW9uLngsIF9wb3NpdGlvbi55LCBfcG9zaXRpb24ueiApO1xyXG5cdFx0XHRsaXN0ZW5lci5zZXRPcmllbnRhdGlvbiggX29yaWVudGF0aW9uLngsIF9vcmllbnRhdGlvbi55LCBfb3JpZW50YXRpb24ueiwgdXAueCwgdXAueSwgdXAueiApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgQXVkaW9MaXN0ZW5lciB9O1xyXG4iLCJpbXBvcnQgeyBPYmplY3QzRCB9IGZyb20gJy4uL2NvcmUvT2JqZWN0M0QuanMnO1xyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgYSBub24tcG9zaXRpb25hbCAoIGdsb2JhbCApIGF1ZGlvIG9iamVjdC5cclxuICpcclxuICogVGhpcyBhbmQgcmVsYXRlZCBhdWRpbyBtb2R1bGVzIG1ha2UgdXNlIG9mIHRoZSBbV2ViIEF1ZGlvIEFQSV17QGxpbmsgaHR0cHM6Ly93d3cudzMub3JnL1RSL3dlYmF1ZGlvLTEuMS99LlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiAvLyBjcmVhdGUgYW4gQXVkaW9MaXN0ZW5lciBhbmQgYWRkIGl0IHRvIHRoZSBjYW1lcmFcclxuICogY29uc3QgbGlzdGVuZXIgPSBuZXcgVEhSRUUuQXVkaW9MaXN0ZW5lcigpO1xyXG4gKiBjYW1lcmEuYWRkKCBsaXN0ZW5lciApO1xyXG4gKlxyXG4gKiAvLyBjcmVhdGUgYSBnbG9iYWwgYXVkaW8gc291cmNlXHJcbiAqIGNvbnN0IHNvdW5kID0gbmV3IFRIUkVFLkF1ZGlvKCBsaXN0ZW5lciApO1xyXG4gKlxyXG4gKiAvLyBsb2FkIGEgc291bmQgYW5kIHNldCBpdCBhcyB0aGUgQXVkaW8gb2JqZWN0J3MgYnVmZmVyXHJcbiAqIGNvbnN0IGF1ZGlvTG9hZGVyID0gbmV3IFRIUkVFLkF1ZGlvTG9hZGVyKCk7XHJcbiAqIGF1ZGlvTG9hZGVyLmxvYWQoICdzb3VuZHMvYW1iaWVudC5vZ2cnLCBmdW5jdGlvbiggYnVmZmVyICkge1xyXG4gKiBcdHNvdW5kLnNldEJ1ZmZlciggYnVmZmVyICk7XHJcbiAqIFx0c291bmQuc2V0TG9vcCggdHJ1ZSApO1xyXG4gKiBcdHNvdW5kLnNldFZvbHVtZSggMC41ICk7XHJcbiAqIFx0c291bmQucGxheSgpO1xyXG4gKiB9KTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBPYmplY3QzRFxyXG4gKi9cclxuY2xhc3MgQXVkaW8gZXh0ZW5kcyBPYmplY3QzRCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYXVkaW8uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0F1ZGlvTGlzdGVuZXJ9IGxpc3RlbmVyIC0gVGhlIGdsb2JhbCBhdWRpbyBsaXN0ZW5lci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbGlzdGVuZXIgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnQXVkaW8nO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGdsb2JhbCBhdWRpbyBsaXN0ZW5lci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXVkaW9MaXN0ZW5lcn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYXVkaW8gY29udGV4dC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXVkaW9Db250ZXh0fVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29udGV4dCA9IGxpc3RlbmVyLmNvbnRleHQ7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZ2FpbiBub2RlIHVzZWQgZm9yIHZvbHVtZSBjb250cm9sLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtHYWluTm9kZX1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdhaW4gPSB0aGlzLmNvbnRleHQuY3JlYXRlR2FpbigpO1xyXG5cdFx0dGhpcy5nYWluLmNvbm5lY3QoIGxpc3RlbmVyLmdldElucHV0KCkgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdG8gc3RhcnQgcGxheWJhY2sgYXV0b21hdGljYWxseSBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmF1dG9wbGF5ID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZSB0byBhbiBhdWRpbyBidWZmZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogRGVmaW5lZCB2aWEge0BsaW5rIEF1ZGlvI3NldEJ1ZmZlcn0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9BdWRpb0J1ZmZlcn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJ1ZmZlciA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBNb2RpZnkgcGl0Y2gsIG1lYXN1cmVkIGluIGNlbnRzLiArLy0gMTAwIGlzIGEgc2VtaXRvbmUuXHJcblx0XHQgKiArLy0gMTIwMCBpcyBhbiBvY3RhdmUuXHJcblx0XHQgKlxyXG5cdFx0ICogRGVmaW5lZCB2aWEge0BsaW5rIEF1ZGlvI3NldERldHVuZX0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRldHVuZSA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSBhdWRpbyBzaG91bGQgbG9vcCBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogRGVmaW5lZCB2aWEge0BsaW5rIEF1ZGlvI3NldExvb3B9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxvb3AgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgd2hlcmUgaW4gdGhlIGF1ZGlvIGJ1ZmZlciB0aGUgcmVwbGF5IHNob3VsZFxyXG5cdFx0ICogc3RhcnQsIGluIHNlY29uZHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5sb29wU3RhcnQgPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyB3aGVyZSBpbiB0aGUgYXVkaW8gYnVmZmVyIHRoZSByZXBsYXkgc2hvdWxkXHJcblx0XHQgKiBzdG9wLCBpbiBzZWNvbmRzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubG9vcEVuZCA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBvZmZzZXQgdG8gdGhlIHRpbWUgd2l0aGluIHRoZSBhdWRpbyBidWZmZXIgdGhlIHBsYXliYWNrXHJcblx0XHQgKiBzaG91bGQgYmVnaW4sIGluIHNlY29uZHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5vZmZzZXQgPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogT3ZlcnJpZGVzIHRoZSBkZWZhdWx0IGR1cmF0aW9uIG9mIHRoZSBhdWRpby5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7dW5kZWZpbmVkfG51bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IHVuZGVmaW5lZFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmR1cmF0aW9uID0gdW5kZWZpbmVkO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHBsYXliYWNrIHNwZWVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIERlZmluZWQgdmlhIHtAbGluayBBdWRpbyNzZXRQbGF5YmFja1JhdGV9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wbGF5YmFja1JhdGUgPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGF1ZGlvIGlzIHBsYXlpbmcgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIFRoaXMgZmxhZyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc2V0IHdoZW4gdXNpbmcge0BsaW5rIEF1ZGlvI3BsYXl9LFxyXG5cdFx0ICoge0BsaW5rIEF1ZGlvI3BhdXNlfSwge0BsaW5rIEF1ZGlvI3N0b3B9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGF1ZGlvIHBsYXliYWNrIGNhbiBiZSBjb250cm9sbGVkXHJcblx0XHQgKiB3aXRoIG1ldGhvZCBsaWtlIHtAbGluayBBdWRpbyNwbGF5fSBvciB7QGxpbmsgQXVkaW8jcGF1c2V9LlxyXG5cdFx0ICpcclxuXHRcdCAqIFRoaXMgZmxhZyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc2V0IHdoZW4gYXVkaW8gc291cmNlcyBhcmVcclxuXHRcdCAqIGRlZmluZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG9sZHMgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgYXVkaW8gc291cmNlLlxyXG5cdFx0ICpcclxuXHRcdCAqIFRoZSBwcm9wZXJ0eSBpcyBhdXRvbWF0aWNhbGx5IGJ5IG9uZSBvZiB0aGUgYHNldCooKWAgbWV0aG9kcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P0F1ZGlvTm9kZX1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNvdXJjZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIHRoZSBzb3VyY2UgdHlwZS5cclxuXHRcdCAqXHJcblx0XHQgKiBUaGUgcHJvcGVydHkgaXMgYXV0b21hdGljYWxseSBieSBvbmUgb2YgdGhlIGBzZXQqKClgIG1ldGhvZHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeygnZW1wdHknfCdhdWRpb05vZGUnfCdtZWRpYU5vZGUnfCdtZWRpYVN0cmVhbU5vZGUnfCdidWZmZXInKX1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgJ2VtcHR5J1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNvdXJjZVR5cGUgPSAnZW1wdHknO1xyXG5cclxuXHRcdHRoaXMuX3N0YXJ0ZWRBdCA9IDA7XHJcblx0XHR0aGlzLl9wcm9ncmVzcyA9IDA7XHJcblx0XHR0aGlzLl9jb25uZWN0ZWQgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENhbiBiZSB1c2VkIHRvIGFwcGx5IGEgdmFyaWV0eSBvZiBsb3ctb3JkZXIgZmlsdGVycyB0byBjcmVhdGVcclxuXHRcdCAqIG1vcmUgY29tcGxleCBzb3VuZCBlZmZlY3RzIGUuZy4gdmlhIGBCaXF1YWRGaWx0ZXJOb2RlYC5cclxuXHRcdCAqXHJcblx0XHQgKiBUaGUgcHJvcGVydHkgaXMgYXV0b21hdGljYWxseSBzZXQgYnkge0BsaW5rIEF1ZGlvI3NldEZpbHRlcnN9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxBdWRpb05vZGU+fVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZmlsdGVycyA9IFtdO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIG91dHB1dCBhdWRpbyBub2RlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7R2Fpbk5vZGV9IFRoZSBvdXRwdXQgbm9kZS5cclxuXHQgKi9cclxuXHRnZXRPdXRwdXQoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZ2FpbjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBnaXZlbiBhdWRpbyBub2RlIGFzIHRoZSBzb3VyY2Ugb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIHtAbGluayBBdWRpbyNzb3VyY2VUeXBlfSBpcyBzZXQgdG8gYGF1ZGlvTm9kZWAgYW5kIHtAbGluayBBdWRpbyNoYXNQbGF5YmFja0NvbnRyb2x9IHRvIGBmYWxzZWAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0F1ZGlvTm9kZX0gYXVkaW9Ob2RlIC0gVGhlIGF1ZGlvIG5vZGUgbGlrZSBhbiBpbnN0YW5jZSBvZiBgT3NjaWxsYXRvck5vZGVgLlxyXG5cdCAqIEByZXR1cm4ge0F1ZGlvfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldE5vZGVTb3VyY2UoIGF1ZGlvTm9kZSApIHtcclxuXHJcblx0XHR0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9IGZhbHNlO1xyXG5cdFx0dGhpcy5zb3VyY2VUeXBlID0gJ2F1ZGlvTm9kZSc7XHJcblx0XHR0aGlzLnNvdXJjZSA9IGF1ZGlvTm9kZTtcclxuXHRcdHRoaXMuY29ubmVjdCgpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGdpdmVuIG1lZGlhIGVsZW1lbnQgYXMgdGhlIHNvdXJjZSBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICoge0BsaW5rIEF1ZGlvI3NvdXJjZVR5cGV9IGlzIHNldCB0byBgbWVkaWFOb2RlYCBhbmQge0BsaW5rIEF1ZGlvI2hhc1BsYXliYWNrQ29udHJvbH0gdG8gYGZhbHNlYC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7SFRNTE1lZGlhRWxlbWVudH0gbWVkaWFFbGVtZW50IC0gVGhlIG1lZGlhIGVsZW1lbnQuXHJcblx0ICogQHJldHVybiB7QXVkaW99IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0TWVkaWFFbGVtZW50U291cmNlKCBtZWRpYUVsZW1lbnQgKSB7XHJcblxyXG5cdFx0dGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPSBmYWxzZTtcclxuXHRcdHRoaXMuc291cmNlVHlwZSA9ICdtZWRpYU5vZGUnO1xyXG5cdFx0dGhpcy5zb3VyY2UgPSB0aGlzLmNvbnRleHQuY3JlYXRlTWVkaWFFbGVtZW50U291cmNlKCBtZWRpYUVsZW1lbnQgKTtcclxuXHRcdHRoaXMuY29ubmVjdCgpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGdpdmVuIG1lZGlhIHN0cmVhbSBhcyB0aGUgc291cmNlIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiB7QGxpbmsgQXVkaW8jc291cmNlVHlwZX0gaXMgc2V0IHRvIGBtZWRpYVN0cmVhbU5vZGVgIGFuZCB7QGxpbmsgQXVkaW8jaGFzUGxheWJhY2tDb250cm9sfSB0byBgZmFsc2VgLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNZWRpYVN0cmVhbX0gbWVkaWFTdHJlYW0gLSBUaGUgbWVkaWEgc3RyZWFtLlxyXG5cdCAqIEByZXR1cm4ge0F1ZGlvfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldE1lZGlhU3RyZWFtU291cmNlKCBtZWRpYVN0cmVhbSApIHtcclxuXHJcblx0XHR0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9IGZhbHNlO1xyXG5cdFx0dGhpcy5zb3VyY2VUeXBlID0gJ21lZGlhU3RyZWFtTm9kZSc7XHJcblx0XHR0aGlzLnNvdXJjZSA9IHRoaXMuY29udGV4dC5jcmVhdGVNZWRpYVN0cmVhbVNvdXJjZSggbWVkaWFTdHJlYW0gKTtcclxuXHRcdHRoaXMuY29ubmVjdCgpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGdpdmVuIGF1ZGlvIGJ1ZmZlciBhcyB0aGUgc291cmNlIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiB7QGxpbmsgQXVkaW8jc291cmNlVHlwZX0gaXMgc2V0IHRvIGBidWZmZXJgIGFuZCB7QGxpbmsgQXVkaW8jaGFzUGxheWJhY2tDb250cm9sfSB0byBgdHJ1ZWAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0F1ZGlvQnVmZmVyfSBhdWRpb0J1ZmZlciAtIFRoZSBhdWRpbyBidWZmZXIuXHJcblx0ICogQHJldHVybiB7QXVkaW99IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0QnVmZmVyKCBhdWRpb0J1ZmZlciApIHtcclxuXHJcblx0XHR0aGlzLmJ1ZmZlciA9IGF1ZGlvQnVmZmVyO1xyXG5cdFx0dGhpcy5zb3VyY2VUeXBlID0gJ2J1ZmZlcic7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmF1dG9wbGF5ICkgdGhpcy5wbGF5KCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3RhcnRzIHRoZSBwbGF5YmFjayBvZiB0aGUgYXVkaW8uXHJcblx0ICpcclxuXHQgKiBDYW4gb25seSBiZSB1c2VkIHdpdGggY29tcGF0aWJsZSBhdWRpbyBzb3VyY2VzIHRoYXQgYWxsb3cgcGxheWJhY2sgY29udHJvbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZGVsYXk9MF0gLSBUaGUgZGVsYXksIGluIHNlY29uZHMsIGF0IHdoaWNoIHRoZSBhdWRpbyBzaG91bGQgc3RhcnQgcGxheWluZy5cclxuXHQgKiBAcmV0dXJuIHtBdWRpb3x1bmRlZmluZWR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0cGxheSggZGVsYXkgPSAwICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5pc1BsYXlpbmcgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogQXVkaW8gaXMgYWxyZWFkeSBwbGF5aW5nLicgKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMuaGFzUGxheWJhY2tDb250cm9sID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLicgKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLl9zdGFydGVkQXQgPSB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKyBkZWxheTtcclxuXHJcblx0XHRjb25zdCBzb3VyY2UgPSB0aGlzLmNvbnRleHQuY3JlYXRlQnVmZmVyU291cmNlKCk7XHJcblx0XHRzb3VyY2UuYnVmZmVyID0gdGhpcy5idWZmZXI7XHJcblx0XHRzb3VyY2UubG9vcCA9IHRoaXMubG9vcDtcclxuXHRcdHNvdXJjZS5sb29wU3RhcnQgPSB0aGlzLmxvb3BTdGFydDtcclxuXHRcdHNvdXJjZS5sb29wRW5kID0gdGhpcy5sb29wRW5kO1xyXG5cdFx0c291cmNlLm9uZW5kZWQgPSB0aGlzLm9uRW5kZWQuYmluZCggdGhpcyApO1xyXG5cdFx0c291cmNlLnN0YXJ0KCB0aGlzLl9zdGFydGVkQXQsIHRoaXMuX3Byb2dyZXNzICsgdGhpcy5vZmZzZXQsIHRoaXMuZHVyYXRpb24gKTtcclxuXHJcblx0XHR0aGlzLmlzUGxheWluZyA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy5zb3VyY2UgPSBzb3VyY2U7XHJcblxyXG5cdFx0dGhpcy5zZXREZXR1bmUoIHRoaXMuZGV0dW5lICk7XHJcblx0XHR0aGlzLnNldFBsYXliYWNrUmF0ZSggdGhpcy5wbGF5YmFja1JhdGUgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5jb25uZWN0KCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUGF1c2VzIHRoZSBwbGF5YmFjayBvZiB0aGUgYXVkaW8uXHJcblx0ICpcclxuXHQgKiBDYW4gb25seSBiZSB1c2VkIHdpdGggY29tcGF0aWJsZSBhdWRpbyBzb3VyY2VzIHRoYXQgYWxsb3cgcGxheWJhY2sgY29udHJvbC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0F1ZGlvfHVuZGVmaW5lZH0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRwYXVzZSgpIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuaGFzUGxheWJhY2tDb250cm9sID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLicgKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMuaXNQbGF5aW5nID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0Ly8gdXBkYXRlIGN1cnJlbnQgcHJvZ3Jlc3NcclxuXHJcblx0XHRcdHRoaXMuX3Byb2dyZXNzICs9IE1hdGgubWF4KCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgLSB0aGlzLl9zdGFydGVkQXQsIDAgKSAqIHRoaXMucGxheWJhY2tSYXRlO1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLmxvb3AgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdC8vIGVuc3VyZSBfcHJvZ3Jlc3MgZG9lcyBub3QgZXhjZWVkIGR1cmF0aW9uIHdpdGggbG9vcGVkIGF1ZGlvc1xyXG5cclxuXHRcdFx0XHR0aGlzLl9wcm9ncmVzcyA9IHRoaXMuX3Byb2dyZXNzICUgKCB0aGlzLmR1cmF0aW9uIHx8IHRoaXMuYnVmZmVyLmR1cmF0aW9uICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0aGlzLnNvdXJjZS5zdG9wKCk7XHJcblx0XHRcdHRoaXMuc291cmNlLm9uZW5kZWQgPSBudWxsO1xyXG5cclxuXHRcdFx0dGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3RvcHMgdGhlIHBsYXliYWNrIG9mIHRoZSBhdWRpby5cclxuXHQgKlxyXG5cdCAqIENhbiBvbmx5IGJlIHVzZWQgd2l0aCBjb21wYXRpYmxlIGF1ZGlvIHNvdXJjZXMgdGhhdCBhbGxvdyBwbGF5YmFjayBjb250cm9sLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtkZWxheT0wXSAtIFRoZSBkZWxheSwgaW4gc2Vjb25kcywgYXQgd2hpY2ggdGhlIGF1ZGlvIHNob3VsZCBzdG9wIHBsYXlpbmcuXHJcblx0ICogQHJldHVybiB7QXVkaW98dW5kZWZpbmVkfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHN0b3AoIGRlbGF5ID0gMCApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuaGFzUGxheWJhY2tDb250cm9sID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLicgKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLl9wcm9ncmVzcyA9IDA7XHJcblxyXG5cdFx0aWYgKCB0aGlzLnNvdXJjZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuc291cmNlLnN0b3AoIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSArIGRlbGF5ICk7XHJcblx0XHRcdHRoaXMuc291cmNlLm9uZW5kZWQgPSBudWxsO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbm5lY3RzIHRvIHRoZSBhdWRpbyBzb3VyY2UuIFRoaXMgaXMgdXNlZCBpbnRlcm5hbGx5IG9uXHJcblx0ICogaW5pdGlhbGlzYXRpb24gYW5kIHdoZW4gc2V0dGluZyAvIHJlbW92aW5nIGZpbHRlcnMuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtBdWRpb30gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjb25uZWN0KCkge1xyXG5cclxuXHRcdGlmICggdGhpcy5maWx0ZXJzLmxlbmd0aCA+IDAgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnNvdXJjZS5jb25uZWN0KCB0aGlzLmZpbHRlcnNbIDAgXSApO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAxLCBsID0gdGhpcy5maWx0ZXJzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdHRoaXMuZmlsdGVyc1sgaSAtIDEgXS5jb25uZWN0KCB0aGlzLmZpbHRlcnNbIGkgXSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5maWx0ZXJzWyB0aGlzLmZpbHRlcnMubGVuZ3RoIC0gMSBdLmNvbm5lY3QoIHRoaXMuZ2V0T3V0cHV0KCkgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGhpcy5zb3VyY2UuY29ubmVjdCggdGhpcy5nZXRPdXRwdXQoKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLl9jb25uZWN0ZWQgPSB0cnVlO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERpc2Nvbm5lY3RzIHRvIHRoZSBhdWRpbyBzb3VyY2UuIFRoaXMgaXMgdXNlZCBpbnRlcm5hbGx5IG9uXHJcblx0ICogaW5pdGlhbGlzYXRpb24gYW5kIHdoZW4gc2V0dGluZyAvIHJlbW92aW5nIGZpbHRlcnMuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtBdWRpb3x1bmRlZmluZWR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0ZGlzY29ubmVjdCgpIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuX2Nvbm5lY3RlZCA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy5maWx0ZXJzLmxlbmd0aCA+IDAgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnNvdXJjZS5kaXNjb25uZWN0KCB0aGlzLmZpbHRlcnNbIDAgXSApO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAxLCBsID0gdGhpcy5maWx0ZXJzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdHRoaXMuZmlsdGVyc1sgaSAtIDEgXS5kaXNjb25uZWN0KCB0aGlzLmZpbHRlcnNbIGkgXSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5maWx0ZXJzWyB0aGlzLmZpbHRlcnMubGVuZ3RoIC0gMSBdLmRpc2Nvbm5lY3QoIHRoaXMuZ2V0T3V0cHV0KCkgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGhpcy5zb3VyY2UuZGlzY29ubmVjdCggdGhpcy5nZXRPdXRwdXQoKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLl9jb25uZWN0ZWQgPSBmYWxzZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNldCBmaWx0ZXJzLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7QXJyYXk8QXVkaW9Ob2RlPn0gVGhlIGxpc3Qgb2YgZmlsdGVycy5cclxuXHQgKi9cclxuXHRnZXRGaWx0ZXJzKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmZpbHRlcnM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyBhbiBhcnJheSBvZiBmaWx0ZXJzIGFuZCBjb25uZWN0cyB0aGVtIHdpdGggdGhlIGF1ZGlvIHNvdXJjZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8QXVkaW9Ob2RlPn0gW3ZhbHVlXSAtIEEgbGlzdCBvZiBmaWx0ZXJzLlxyXG5cdCAqIEByZXR1cm4ge0F1ZGlvfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldEZpbHRlcnMoIHZhbHVlICkge1xyXG5cclxuXHRcdGlmICggISB2YWx1ZSApIHZhbHVlID0gW107XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9jb25uZWN0ZWQgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmRpc2Nvbm5lY3QoKTtcclxuXHRcdFx0dGhpcy5maWx0ZXJzID0gdmFsdWUuc2xpY2UoKTtcclxuXHRcdFx0dGhpcy5jb25uZWN0KCk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHRoaXMuZmlsdGVycyA9IHZhbHVlLnNsaWNlKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgdGhlIGRldHVuaW5nIG9mIG9zY2lsbGF0aW9uIGluIGNlbnRzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIGRldHVuaW5nIG9mIG9zY2lsbGF0aW9uIGluIGNlbnRzLlxyXG5cdCAqIEByZXR1cm4ge0F1ZGlvfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldERldHVuZSggdmFsdWUgKSB7XHJcblxyXG5cdFx0dGhpcy5kZXR1bmUgPSB2YWx1ZTtcclxuXHJcblx0XHRpZiAoIHRoaXMuaXNQbGF5aW5nID09PSB0cnVlICYmIHRoaXMuc291cmNlLmRldHVuZSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0dGhpcy5zb3VyY2UuZGV0dW5lLnNldFRhcmdldEF0VGltZSggdGhpcy5kZXR1bmUsIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwgMC4wMSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBkZXR1bmluZyBvZiBvc2NpbGxhdGlvbiBpbiBjZW50cy5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGRldHVuaW5nIG9mIG9zY2lsbGF0aW9uIGluIGNlbnRzLlxyXG5cdCAqL1xyXG5cdGdldERldHVuZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5kZXR1bmU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgZmlyc3QgZmlsdGVyIGluIHRoZSBsaXN0IG9mIGZpbHRlcnMuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtBdWRpb05vZGV8dW5kZWZpbmVkfSBUaGUgZmlyc3QgZmlsdGVyIGluIHRoZSBsaXN0IG9mIGZpbHRlcnMuXHJcblx0ICovXHJcblx0Z2V0RmlsdGVyKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmdldEZpbHRlcnMoKVsgMCBdO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFwcGxpZXMgYSBzaW5nbGUgZmlsdGVyIG5vZGUgdG8gdGhlIGF1ZGlvLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBdWRpb05vZGV9IFtmaWx0ZXJdIC0gVGhlIGZpbHRlciB0byBzZXQuXHJcblx0ICogQHJldHVybiB7QXVkaW99IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0RmlsdGVyKCBmaWx0ZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuc2V0RmlsdGVycyggZmlsdGVyID8gWyBmaWx0ZXIgXSA6IFtdICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgcGxheWJhY2sgcmF0ZS5cclxuXHQgKlxyXG5cdCAqIENhbiBvbmx5IGJlIHVzZWQgd2l0aCBjb21wYXRpYmxlIGF1ZGlvIHNvdXJjZXMgdGhhdCBhbGxvdyBwbGF5YmFjayBjb250cm9sLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt2YWx1ZV0gLSBUaGUgcGxheWJhY2sgcmF0ZSB0byBzZXQuXHJcblx0ICogQHJldHVybiB7QXVkaW98dW5kZWZpbmVkfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldFBsYXliYWNrUmF0ZSggdmFsdWUgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4nICk7XHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5wbGF5YmFja1JhdGUgPSB2YWx1ZTtcclxuXHJcblx0XHRpZiAoIHRoaXMuaXNQbGF5aW5nID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0dGhpcy5zb3VyY2UucGxheWJhY2tSYXRlLnNldFRhcmdldEF0VGltZSggdGhpcy5wbGF5YmFja1JhdGUsIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwgMC4wMSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHBsYXliYWNrIHJhdGUuXHJcblxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIHBsYXliYWNrIHJhdGUuXHJcblx0ICovXHJcblx0Z2V0UGxheWJhY2tSYXRlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnBsYXliYWNrUmF0ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBdXRvbWF0aWNhbGx5IGNhbGxlZCB3aGVuIHBsYXliYWNrIGZpbmlzaGVkLlxyXG5cdCAqL1xyXG5cdG9uRW5kZWQoKSB7XHJcblxyXG5cdFx0dGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcclxuXHRcdHRoaXMuX3Byb2dyZXNzID0gMDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBsb29wIGZsYWcuXHJcblx0ICpcclxuXHQgKiBDYW4gb25seSBiZSB1c2VkIHdpdGggY29tcGF0aWJsZSBhdWRpbyBzb3VyY2VzIHRoYXQgYWxsb3cgcGxheWJhY2sgY29udHJvbC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGF1ZGlvIHNob3VsZCBsb29wIG9yIG5vdC5cclxuXHQgKi9cclxuXHRnZXRMb29wKCkge1xyXG5cclxuXHRcdGlmICggdGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuJyApO1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzLmxvb3A7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgbG9vcCBmbGFnLlxyXG5cdCAqXHJcblx0ICogQ2FuIG9ubHkgYmUgdXNlZCB3aXRoIGNvbXBhdGlibGUgYXVkaW8gc291cmNlcyB0aGF0IGFsbG93IHBsYXliYWNrIGNvbnRyb2wuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbHVlIC0gV2hldGhlciB0aGUgYXVkaW8gc2hvdWxkIGxvb3Agb3Igbm90LlxyXG5cdCAqIEByZXR1cm4ge0F1ZGlvfHVuZGVmaW5lZH0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXRMb29wKCB2YWx1ZSApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuaGFzUGxheWJhY2tDb250cm9sID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLicgKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmxvb3AgPSB2YWx1ZTtcclxuXHJcblx0XHRpZiAoIHRoaXMuaXNQbGF5aW5nID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0dGhpcy5zb3VyY2UubG9vcCA9IHRoaXMubG9vcDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgbG9vcCBzdGFydCB2YWx1ZSB3aGljaCBkZWZpbmVzIHdoZXJlIGluIHRoZSBhdWRpbyBidWZmZXIgdGhlIHJlcGxheSBzaG91bGRcclxuXHQgKiBzdGFydCwgaW4gc2Vjb25kcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBsb29wIHN0YXJ0IHZhbHVlLlxyXG5cdCAqIEByZXR1cm4ge0F1ZGlvfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldExvb3BTdGFydCggdmFsdWUgKSB7XHJcblxyXG5cdFx0dGhpcy5sb29wU3RhcnQgPSB2YWx1ZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBsb29wIGVuZCB2YWx1ZSB3aGljaCBkZWZpbmVzIHdoZXJlIGluIHRoZSBhdWRpbyBidWZmZXIgdGhlIHJlcGxheSBzaG91bGRcclxuXHQgKiBzdG9wLCBpbiBzZWNvbmRzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIGxvb3AgZW5kIHZhbHVlLlxyXG5cdCAqIEByZXR1cm4ge0F1ZGlvfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldExvb3BFbmQoIHZhbHVlICkge1xyXG5cclxuXHRcdHRoaXMubG9vcEVuZCA9IHZhbHVlO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHZvbHVtZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIHZvbHVtZS5cclxuXHQgKi9cclxuXHRnZXRWb2x1bWUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZ2Fpbi5nYWluLnZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHZvbHVtZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSB2b2x1bWUgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge0F1ZGlvfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldFZvbHVtZSggdmFsdWUgKSB7XHJcblxyXG5cdFx0dGhpcy5nYWluLmdhaW4uc2V0VGFyZ2V0QXRUaW1lKCB2YWx1ZSwgdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lLCAwLjAxICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlLCByZWN1cnNpdmUgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlLCByZWN1cnNpdmUgKTtcclxuXHJcblx0XHRpZiAoIHNvdXJjZS5zb3VyY2VUeXBlICE9PSAnYnVmZmVyJyApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiBBdWRpbyBzb3VyY2UgdHlwZSBjYW5ub3QgYmUgY29waWVkLicgKTtcclxuXHJcblx0XHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmF1dG9wbGF5ID0gc291cmNlLmF1dG9wbGF5O1xyXG5cclxuXHRcdHRoaXMuYnVmZmVyID0gc291cmNlLmJ1ZmZlcjtcclxuXHRcdHRoaXMuZGV0dW5lID0gc291cmNlLmRldHVuZTtcclxuXHRcdHRoaXMubG9vcCA9IHNvdXJjZS5sb29wO1xyXG5cdFx0dGhpcy5sb29wU3RhcnQgPSBzb3VyY2UubG9vcFN0YXJ0O1xyXG5cdFx0dGhpcy5sb29wRW5kID0gc291cmNlLmxvb3BFbmQ7XHJcblx0XHR0aGlzLm9mZnNldCA9IHNvdXJjZS5vZmZzZXQ7XHJcblx0XHR0aGlzLmR1cmF0aW9uID0gc291cmNlLmR1cmF0aW9uO1xyXG5cdFx0dGhpcy5wbGF5YmFja1JhdGUgPSBzb3VyY2UucGxheWJhY2tSYXRlO1xyXG5cdFx0dGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPSBzb3VyY2UuaGFzUGxheWJhY2tDb250cm9sO1xyXG5cdFx0dGhpcy5zb3VyY2VUeXBlID0gc291cmNlLnNvdXJjZVR5cGU7XHJcblxyXG5cdFx0dGhpcy5maWx0ZXJzID0gc291cmNlLmZpbHRlcnMuc2xpY2UoKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHRjbG9uZSggcmVjdXJzaXZlICkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5saXN0ZW5lciApLmNvcHkoIHRoaXMsIHJlY3Vyc2l2ZSApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBBdWRpbyB9O1xyXG4iLCJpbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuaW1wb3J0IHsgUXVhdGVybmlvbiB9IGZyb20gJy4uL21hdGgvUXVhdGVybmlvbi5qcyc7XHJcbmltcG9ydCB7IEF1ZGlvIH0gZnJvbSAnLi9BdWRpby5qcyc7XHJcblxyXG5jb25zdCBfcG9zaXRpb24gPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF9xdWF0ZXJuaW9uID0gLypAX19QVVJFX18qLyBuZXcgUXVhdGVybmlvbigpO1xyXG5jb25zdCBfc2NhbGUgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF9vcmllbnRhdGlvbiA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIGEgcG9zaXRpb25hbCBhdWRpbyBvYmplY3QuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIC8vIGNyZWF0ZSBhbiBBdWRpb0xpc3RlbmVyIGFuZCBhZGQgaXQgdG8gdGhlIGNhbWVyYVxyXG4gKiBjb25zdCBsaXN0ZW5lciA9IG5ldyBUSFJFRS5BdWRpb0xpc3RlbmVyKCk7XHJcbiAqIGNhbWVyYS5hZGQoIGxpc3RlbmVyICk7XHJcbiAqXHJcbiAqIC8vIGNyZWF0ZSB0aGUgUG9zaXRpb25hbEF1ZGlvIG9iamVjdCAocGFzc2luZyBpbiB0aGUgbGlzdGVuZXIpXHJcbiAqIGNvbnN0IHNvdW5kID0gbmV3IFRIUkVFLlBvc2l0aW9uYWxBdWRpbyggbGlzdGVuZXIgKTtcclxuICpcclxuICogLy8gbG9hZCBhIHNvdW5kIGFuZCBzZXQgaXQgYXMgdGhlIFBvc2l0aW9uYWxBdWRpbyBvYmplY3QncyBidWZmZXJcclxuICogY29uc3QgYXVkaW9Mb2FkZXIgPSBuZXcgVEhSRUUuQXVkaW9Mb2FkZXIoKTtcclxuICogYXVkaW9Mb2FkZXIubG9hZCggJ3NvdW5kcy9zb25nLm9nZycsIGZ1bmN0aW9uKCBidWZmZXIgKSB7XHJcbiAqIFx0c291bmQuc2V0QnVmZmVyKCBidWZmZXIgKTtcclxuICogXHRzb3VuZC5zZXRSZWZEaXN0YW5jZSggMjAgKTtcclxuICogXHRzb3VuZC5wbGF5KCk7XHJcbiAqIH0pO1xyXG4gKlxyXG4gKiAvLyBjcmVhdGUgYW4gb2JqZWN0IGZvciB0aGUgc291bmQgdG8gcGxheSBmcm9tXHJcbiAqIGNvbnN0IHNwaGVyZSA9IG5ldyBUSFJFRS5TcGhlcmVHZW9tZXRyeSggMjAsIDMyLCAxNiApO1xyXG4gKiBjb25zdCBtYXRlcmlhbCA9IG5ldyBUSFJFRS5NZXNoUGhvbmdNYXRlcmlhbCggeyBjb2xvcjogMHhmZjIyMDAgfSApO1xyXG4gKiBjb25zdCBtZXNoID0gbmV3IFRIUkVFLk1lc2goIHNwaGVyZSwgbWF0ZXJpYWwgKTtcclxuICogc2NlbmUuYWRkKCBtZXNoICk7XHJcbiAqXHJcbiAqIC8vIGZpbmFsbHkgYWRkIHRoZSBzb3VuZCB0byB0aGUgbWVzaFxyXG4gKiBtZXNoLmFkZCggc291bmQgKTtcclxuICpcclxuICogQGF1Z21lbnRzIEF1ZGlvXHJcbiAqL1xyXG5jbGFzcyBQb3NpdGlvbmFsQXVkaW8gZXh0ZW5kcyBBdWRpbyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBwb3NpdGlvbmFsIGF1ZGlvLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBdWRpb0xpc3RlbmVyfSBsaXN0ZW5lciAtIFRoZSBnbG9iYWwgYXVkaW8gbGlzdGVuZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGxpc3RlbmVyICkge1xyXG5cclxuXHRcdHN1cGVyKCBsaXN0ZW5lciApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHBhbm5lciBub2RlIHJlcHJlc2VudHMgdGhlIGxvY2F0aW9uLCBkaXJlY3Rpb24sIGFuZCBiZWhhdmlvciBvZiBhbiBhdWRpb1xyXG5cdFx0ICogc291cmNlIGluIDNEIHNwYWNlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtQYW5uZXJOb2RlfVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucGFubmVyID0gdGhpcy5jb250ZXh0LmNyZWF0ZVBhbm5lcigpO1xyXG5cdFx0dGhpcy5wYW5uZXIucGFubmluZ01vZGVsID0gJ0hSVEYnO1xyXG5cdFx0dGhpcy5wYW5uZXIuY29ubmVjdCggdGhpcy5nYWluICk7XHJcblxyXG5cdH1cclxuXHJcblx0Y29ubmVjdCgpIHtcclxuXHJcblx0XHRzdXBlci5jb25uZWN0KCk7XHJcblxyXG5cdFx0dGhpcy5wYW5uZXIuY29ubmVjdCggdGhpcy5nYWluICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0ZGlzY29ubmVjdCgpIHtcclxuXHJcblx0XHRzdXBlci5kaXNjb25uZWN0KCk7XHJcblxyXG5cdFx0dGhpcy5wYW5uZXIuZGlzY29ubmVjdCggdGhpcy5nYWluICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0T3V0cHV0KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnBhbm5lcjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHJlZmVyZW5jZSBkaXN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIHJlZmVyZW5jZSBkaXN0YW5jZS5cclxuXHQgKi9cclxuXHRnZXRSZWZEaXN0YW5jZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5wYW5uZXIucmVmRGlzdGFuY2U7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVmaW5lcyB0aGUgcmVmZXJlbmNlIGRpc3RhbmNlIGZvciByZWR1Y2luZyB2b2x1bWUgYXMgdGhlIGF1ZGlvIHNvdXJjZSBtb3Zlc1xyXG5cdCAqIGZ1cnRoZXIgZnJvbSB0aGUgbGlzdGVuZXIg4oCTIGkuZS4gdGhlIGRpc3RhbmNlIGF0IHdoaWNoIHRoZSB2b2x1bWUgcmVkdWN0aW9uXHJcblx0ICogc3RhcnRzIHRha2luZyBlZmZlY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgcmVmZXJlbmNlIGRpc3RhbmNlIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtQb3NpdGlvbmFsQXVkaW99IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0UmVmRGlzdGFuY2UoIHZhbHVlICkge1xyXG5cclxuXHRcdHRoaXMucGFubmVyLnJlZkRpc3RhbmNlID0gdmFsdWU7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgY3VycmVudCByb2xsb2ZmIGZhY3Rvci5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIHJvbGxvZmYgZmFjdG9yLlxyXG5cdCAqL1xyXG5cdGdldFJvbGxvZmZGYWN0b3IoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMucGFubmVyLnJvbGxvZmZGYWN0b3I7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVmaW5lcyBob3cgcXVpY2tseSB0aGUgdm9sdW1lIGlzIHJlZHVjZWQgYXMgdGhlIHNvdXJjZSBtb3ZlcyBhd2F5IGZyb20gdGhlIGxpc3RlbmVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIHJvbGxvZmYgZmFjdG9yLlxyXG5cdCAqIEByZXR1cm4ge1Bvc2l0aW9uYWxBdWRpb30gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXRSb2xsb2ZmRmFjdG9yKCB2YWx1ZSApIHtcclxuXHJcblx0XHR0aGlzLnBhbm5lci5yb2xsb2ZmRmFjdG9yID0gdmFsdWU7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgY3VycmVudCBkaXN0YW5jZSBtb2RlbC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4geygnbGluZWFyJ3wnaW52ZXJzZSd8J2V4cG9uZW50aWFsJyl9IFRoZSBkaXN0YW5jZSBtb2RlbC5cclxuXHQgKi9cclxuXHRnZXREaXN0YW5jZU1vZGVsKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnBhbm5lci5kaXN0YW5jZU1vZGVsO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgd2hpY2ggYWxnb3JpdGhtIHRvIHVzZSB0byByZWR1Y2UgdGhlIHZvbHVtZSBvZiB0aGUgYXVkaW8gc291cmNlXHJcblx0ICogYXMgaXQgbW92ZXMgYXdheSBmcm9tIHRoZSBsaXN0ZW5lci5cclxuXHQgKlxyXG5cdCAqIFJlYWQgW3RoZSBzcGVjXXtAbGluayBodHRwczovL3d3dy53My5vcmcvVFIvd2ViYXVkaW8tMS4xLyNlbnVtZGVmLWRpc3RhbmNlbW9kZWx0eXBlfVxyXG5cdCAqIGZvciBtb3JlIGRldGFpbHMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geygnbGluZWFyJ3wnaW52ZXJzZSd8J2V4cG9uZW50aWFsJyl9IHZhbHVlIC0gVGhlIGRpc3RhbmNlIG1vZGVsIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtQb3NpdGlvbmFsQXVkaW99IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0RGlzdGFuY2VNb2RlbCggdmFsdWUgKSB7XHJcblxyXG5cdFx0dGhpcy5wYW5uZXIuZGlzdGFuY2VNb2RlbCA9IHZhbHVlO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGN1cnJlbnQgbWF4IGRpc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgbWF4IGRpc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGdldE1heERpc3RhbmNlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnBhbm5lci5tYXhEaXN0YW5jZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWZpbmVzIHRoZSBtYXhpbXVtIGRpc3RhbmNlIGJldHdlZW4gdGhlIGF1ZGlvIHNvdXJjZSBhbmQgdGhlIGxpc3RlbmVyLFxyXG5cdCAqIGFmdGVyIHdoaWNoIHRoZSB2b2x1bWUgaXMgbm90IHJlZHVjZWQgYW55IGZ1cnRoZXIuXHJcblx0ICpcclxuXHQgKiBUaGlzIHZhbHVlIGlzIHVzZWQgb25seSBieSB0aGUgYGxpbmVhcmAgZGlzdGFuY2UgbW9kZWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgbWF4IGRpc3RhbmNlLlxyXG5cdCAqIEByZXR1cm4ge1Bvc2l0aW9uYWxBdWRpb30gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXRNYXhEaXN0YW5jZSggdmFsdWUgKSB7XHJcblxyXG5cdFx0dGhpcy5wYW5uZXIubWF4RGlzdGFuY2UgPSB2YWx1ZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBkaXJlY3Rpb25hbCBjb25lIGluIHdoaWNoIHRoZSBhdWRpbyBjYW4gYmUgbGlzdGVuZWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gY29uZUlubmVyQW5nbGUgLSBBbiBhbmdsZSwgaW4gZGVncmVlcywgb2YgYSBjb25lIGluc2lkZSBvZiB3aGljaCB0aGVyZSB3aWxsIGJlIG5vIHZvbHVtZSByZWR1Y3Rpb24uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGNvbmVPdXRlckFuZ2xlIC0gQW4gYW5nbGUsIGluIGRlZ3JlZXMsIG9mIGEgY29uZSBvdXRzaWRlIG9mIHdoaWNoIHRoZSB2b2x1bWUgd2lsbCBiZSByZWR1Y2VkIGJ5IGEgY29uc3RhbnQgdmFsdWUsIGRlZmluZWQgYnkgdGhlIGBjb25lT3V0ZXJHYWluYCBwYXJhbWV0ZXIuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGNvbmVPdXRlckdhaW4gLSBUaGUgYW1vdW50IG9mIHZvbHVtZSByZWR1Y3Rpb24gb3V0c2lkZSB0aGUgY29uZSBkZWZpbmVkIGJ5IHRoZSBgY29uZU91dGVyQW5nbGVgLiBXaGVuIHNldCB0byBgMGAsIG5vIHNvdW5kIGNhbiBiZSBoZWFyZC5cclxuXHQgKiBAcmV0dXJuIHtQb3NpdGlvbmFsQXVkaW99IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0RGlyZWN0aW9uYWxDb25lKCBjb25lSW5uZXJBbmdsZSwgY29uZU91dGVyQW5nbGUsIGNvbmVPdXRlckdhaW4gKSB7XHJcblxyXG5cdFx0dGhpcy5wYW5uZXIuY29uZUlubmVyQW5nbGUgPSBjb25lSW5uZXJBbmdsZTtcclxuXHRcdHRoaXMucGFubmVyLmNvbmVPdXRlckFuZ2xlID0gY29uZU91dGVyQW5nbGU7XHJcblx0XHR0aGlzLnBhbm5lci5jb25lT3V0ZXJHYWluID0gY29uZU91dGVyR2FpbjtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHR1cGRhdGVNYXRyaXhXb3JsZCggZm9yY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIudXBkYXRlTWF0cml4V29ybGQoIGZvcmNlICk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gdHJ1ZSAmJiB0aGlzLmlzUGxheWluZyA9PT0gZmFsc2UgKSByZXR1cm47XHJcblxyXG5cdFx0dGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoIF9wb3NpdGlvbiwgX3F1YXRlcm5pb24sIF9zY2FsZSApO1xyXG5cclxuXHRcdF9vcmllbnRhdGlvbi5zZXQoIDAsIDAsIDEgKS5hcHBseVF1YXRlcm5pb24oIF9xdWF0ZXJuaW9uICk7XHJcblxyXG5cdFx0Y29uc3QgcGFubmVyID0gdGhpcy5wYW5uZXI7XHJcblxyXG5cdFx0aWYgKCBwYW5uZXIucG9zaXRpb25YICkge1xyXG5cclxuXHRcdFx0Ly8gY29kZSBwYXRoIGZvciBDaHJvbWUgYW5kIEZpcmVmb3ggKHNlZSAjMTQzOTMpXHJcblxyXG5cdFx0XHRjb25zdCBlbmRUaW1lID0gdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lICsgdGhpcy5saXN0ZW5lci50aW1lRGVsdGE7XHJcblxyXG5cdFx0XHRwYW5uZXIucG9zaXRpb25YLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKCBfcG9zaXRpb24ueCwgZW5kVGltZSApO1xyXG5cdFx0XHRwYW5uZXIucG9zaXRpb25ZLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKCBfcG9zaXRpb24ueSwgZW5kVGltZSApO1xyXG5cdFx0XHRwYW5uZXIucG9zaXRpb25aLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKCBfcG9zaXRpb24ueiwgZW5kVGltZSApO1xyXG5cdFx0XHRwYW5uZXIub3JpZW50YXRpb25YLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKCBfb3JpZW50YXRpb24ueCwgZW5kVGltZSApO1xyXG5cdFx0XHRwYW5uZXIub3JpZW50YXRpb25ZLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKCBfb3JpZW50YXRpb24ueSwgZW5kVGltZSApO1xyXG5cdFx0XHRwYW5uZXIub3JpZW50YXRpb25aLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKCBfb3JpZW50YXRpb24ueiwgZW5kVGltZSApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRwYW5uZXIuc2V0UG9zaXRpb24oIF9wb3NpdGlvbi54LCBfcG9zaXRpb24ueSwgX3Bvc2l0aW9uLnogKTtcclxuXHRcdFx0cGFubmVyLnNldE9yaWVudGF0aW9uKCBfb3JpZW50YXRpb24ueCwgX29yaWVudGF0aW9uLnksIF9vcmllbnRhdGlvbi56ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBQb3NpdGlvbmFsQXVkaW8gfTtcclxuIiwiLyoqXHJcbiAqIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgdG8gYW5hbHlzZSBhdWRpbyBkYXRhLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiAvLyBjcmVhdGUgYW4gQXVkaW9MaXN0ZW5lciBhbmQgYWRkIGl0IHRvIHRoZSBjYW1lcmFcclxuICogY29uc3QgbGlzdGVuZXIgPSBuZXcgVEhSRUUuQXVkaW9MaXN0ZW5lcigpO1xyXG4gKiBjYW1lcmEuYWRkKCBsaXN0ZW5lciApO1xyXG4gKlxyXG4gKiAvLyBjcmVhdGUgYW4gQXVkaW8gc291cmNlXHJcbiAqIGNvbnN0IHNvdW5kID0gbmV3IFRIUkVFLkF1ZGlvKCBsaXN0ZW5lciApO1xyXG4gKlxyXG4gKiAvLyBsb2FkIGEgc291bmQgYW5kIHNldCBpdCBhcyB0aGUgQXVkaW8gb2JqZWN0J3MgYnVmZmVyXHJcbiAqIGNvbnN0IGF1ZGlvTG9hZGVyID0gbmV3IFRIUkVFLkF1ZGlvTG9hZGVyKCk7XHJcbiAqIGF1ZGlvTG9hZGVyLmxvYWQoICdzb3VuZHMvYW1iaWVudC5vZ2cnLCBmdW5jdGlvbiggYnVmZmVyICkge1xyXG4gKiBcdHNvdW5kLnNldEJ1ZmZlciggYnVmZmVyICk7XHJcbiAqIFx0c291bmQuc2V0TG9vcCh0cnVlKTtcclxuICogXHRzb3VuZC5zZXRWb2x1bWUoMC41KTtcclxuICogXHRzb3VuZC5wbGF5KCk7XHJcbiAqIH0pO1xyXG4gKlxyXG4gKiAvLyBjcmVhdGUgYW4gQXVkaW9BbmFseXNlciwgcGFzc2luZyBpbiB0aGUgc291bmQgYW5kIGRlc2lyZWQgZmZ0U2l6ZVxyXG4gKiBjb25zdCBhbmFseXNlciA9IG5ldyBUSFJFRS5BdWRpb0FuYWx5c2VyKCBzb3VuZCwgMzIgKTtcclxuICpcclxuICogLy8gZ2V0IHRoZSBhdmVyYWdlIGZyZXF1ZW5jeSBvZiB0aGUgc291bmRcclxuICogY29uc3QgZGF0YSA9IGFuYWx5c2VyLmdldEF2ZXJhZ2VGcmVxdWVuY3koKTtcclxuICogYGBgXHJcbiAqL1xyXG5jbGFzcyBBdWRpb0FuYWx5c2VyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBhdWRpbyBhbmFseXplci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXVkaW99IGF1ZGlvIC0gVGhlIGF1ZGlvIHRvIGFuYWx5emUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtmZnRTaXplPTIwNDhdIC0gVGhlIHdpbmRvdyBzaXplIGluIHNhbXBsZXMgdGhhdCBpcyB1c2VkIHdoZW4gcGVyZm9ybWluZyBhIEZhc3QgRm91cmllciBUcmFuc2Zvcm0gKEZGVCkgdG8gZ2V0IGZyZXF1ZW5jeSBkb21haW4gZGF0YS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggYXVkaW8sIGZmdFNpemUgPSAyMDQ4ICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGdsb2JhbCBhdWRpbyBsaXN0ZW5lci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QW5hbHlzZXJOb2RlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFuYWx5c2VyID0gYXVkaW8uY29udGV4dC5jcmVhdGVBbmFseXNlcigpO1xyXG5cdFx0dGhpcy5hbmFseXNlci5mZnRTaXplID0gZmZ0U2l6ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvbGRzIHRoZSBhbmFseXplZCBkYXRhLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtVaW50OEFycmF5fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRhdGEgPSBuZXcgVWludDhBcnJheSggdGhpcy5hbmFseXNlci5mcmVxdWVuY3lCaW5Db3VudCApO1xyXG5cclxuXHRcdGF1ZGlvLmdldE91dHB1dCgpLmNvbm5lY3QoIHRoaXMuYW5hbHlzZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGFuIGFycmF5IHdpdGggZnJlcXVlbmN5IGRhdGEgb2YgdGhlIGF1ZGlvLlxyXG5cdCAqXHJcblx0ICogRWFjaCBpdGVtIGluIHRoZSBhcnJheSByZXByZXNlbnRzIHRoZSBkZWNpYmVsIHZhbHVlIGZvciBhIHNwZWNpZmljIGZyZXF1ZW5jeS5cclxuXHQgKiBUaGUgZnJlcXVlbmNpZXMgYXJlIHNwcmVhZCBsaW5lYXJseSBmcm9tIDAgdG8gMS8yIG9mIHRoZSBzYW1wbGUgcmF0ZS5cclxuXHQgKiBGb3IgZXhhbXBsZSwgZm9yIDQ4MDAwIHNhbXBsZSByYXRlLCB0aGUgbGFzdCBpdGVtIG9mIHRoZSBhcnJheSB3aWxsIHJlcHJlc2VudFxyXG5cdCAqIHRoZSBkZWNpYmVsIHZhbHVlIGZvciAyNDAwMCBIei5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1VpbnQ4QXJyYXl9IFRoZSBmcmVxdWVuY3kgZGF0YS5cclxuXHQgKi9cclxuXHRnZXRGcmVxdWVuY3lEYXRhKCkge1xyXG5cclxuXHRcdHRoaXMuYW5hbHlzZXIuZ2V0Qnl0ZUZyZXF1ZW5jeURhdGEoIHRoaXMuZGF0YSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmRhdGE7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgYXZlcmFnZSBvZiB0aGUgZnJlcXVlbmNpZXMgcmV0dXJuZWQgYnkge0BsaW5rIEF1ZGlvQW5hbHlzZXIjZ2V0RnJlcXVlbmN5RGF0YX0uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBhdmVyYWdlIGZyZXF1ZW5jeS5cclxuXHQgKi9cclxuXHRnZXRBdmVyYWdlRnJlcXVlbmN5KCkge1xyXG5cclxuXHRcdGxldCB2YWx1ZSA9IDA7XHJcblx0XHRjb25zdCBkYXRhID0gdGhpcy5nZXRGcmVxdWVuY3lEYXRhKCk7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHR2YWx1ZSArPSBkYXRhWyBpIF07XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB2YWx1ZSAvIGRhdGEubGVuZ3RoO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBBdWRpb0FuYWx5c2VyIH07XHJcbiIsImltcG9ydCB7IFF1YXRlcm5pb24gfSBmcm9tICcuLi9tYXRoL1F1YXRlcm5pb24uanMnO1xyXG5cclxuLyoqXHJcbiAqIEJ1ZmZlcmVkIHNjZW5lIGdyYXBoIHByb3BlcnR5IHRoYXQgYWxsb3dzIHdlaWdodGVkIGFjY3VtdWxhdGlvbjsgdXNlZCBpbnRlcm5hbGx5LlxyXG4gKi9cclxuY2xhc3MgUHJvcGVydHlNaXhlciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcHJvcGVydHkgbWl4ZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1Byb3BlcnR5QmluZGluZ30gYmluZGluZyAtIFRoZSBwcm9wZXJ0eSBiaW5kaW5nLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlTmFtZSAtIFRoZSBrZXlmcmFtZSB0cmFjayB0eXBlIG5hbWUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlU2l6ZSAtIFRoZSBrZXlmcmFtZSB0cmFjayB2YWx1ZSBzaXplLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBiaW5kaW5nLCB0eXBlTmFtZSwgdmFsdWVTaXplICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHByb3BlcnR5IGJpbmRpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1Byb3BlcnR5QmluZGluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5iaW5kaW5nID0gYmluZGluZztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBrZXlmcmFtZSB0cmFjayB2YWx1ZSBzaXplLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudmFsdWVTaXplID0gdmFsdWVTaXplO1xyXG5cclxuXHRcdGxldCBtaXhGdW5jdGlvbixcclxuXHRcdFx0bWl4RnVuY3Rpb25BZGRpdGl2ZSxcclxuXHRcdFx0c2V0SWRlbnRpdHk7XHJcblxyXG5cdFx0Ly8gYnVmZmVyIGxheW91dDogWyBpbmNvbWluZyB8IGFjY3UwIHwgYWNjdTEgfCBvcmlnIHwgYWRkQWNjdSB8IChvcHRpb25hbCB3b3JrKSBdXHJcblx0XHQvL1xyXG5cdFx0Ly8gaW50ZXJwb2xhdG9ycyBjYW4gdXNlIC5idWZmZXIgYXMgdGhlaXIgLnJlc3VsdFxyXG5cdFx0Ly8gdGhlIGRhdGEgdGhlbiBnb2VzIHRvICdpbmNvbWluZydcclxuXHRcdC8vXHJcblx0XHQvLyAnYWNjdTAnIGFuZCAnYWNjdTEnIGFyZSB1c2VkIGZyYW1lLWludGVybGVhdmVkIGZvclxyXG5cdFx0Ly8gdGhlIGN1bXVsYXRpdmUgcmVzdWx0IGFuZCBhcmUgY29tcGFyZWQgdG8gZGV0ZWN0XHJcblx0XHQvLyBjaGFuZ2VzXHJcblx0XHQvL1xyXG5cdFx0Ly8gJ29yaWcnIHN0b3JlcyB0aGUgb3JpZ2luYWwgc3RhdGUgb2YgdGhlIHByb3BlcnR5XHJcblx0XHQvL1xyXG5cdFx0Ly8gJ2FkZCcgaXMgdXNlZCBmb3IgYWRkaXRpdmUgY3VtdWxhdGl2ZSByZXN1bHRzXHJcblx0XHQvL1xyXG5cdFx0Ly8gJ3dvcmsnIGlzIG9wdGlvbmFsIGFuZCBpcyBvbmx5IHByZXNlbnQgZm9yIHF1YXRlcm5pb24gdHlwZXMuIEl0IGlzIHVzZWRcclxuXHRcdC8vIHRvIHN0b3JlIGludGVybWVkaWF0ZSBxdWF0ZXJuaW9uIG11bHRpcGxpY2F0aW9uIHJlc3VsdHNcclxuXHJcblx0XHRzd2l0Y2ggKCB0eXBlTmFtZSApIHtcclxuXHJcblx0XHRcdGNhc2UgJ3F1YXRlcm5pb24nOlxyXG5cdFx0XHRcdG1peEZ1bmN0aW9uID0gdGhpcy5fc2xlcnA7XHJcblx0XHRcdFx0bWl4RnVuY3Rpb25BZGRpdGl2ZSA9IHRoaXMuX3NsZXJwQWRkaXRpdmU7XHJcblx0XHRcdFx0c2V0SWRlbnRpdHkgPSB0aGlzLl9zZXRBZGRpdGl2ZUlkZW50aXR5UXVhdGVybmlvbjtcclxuXHJcblx0XHRcdFx0dGhpcy5idWZmZXIgPSBuZXcgRmxvYXQ2NEFycmF5KCB2YWx1ZVNpemUgKiA2ICk7XHJcblx0XHRcdFx0dGhpcy5fd29ya0luZGV4ID0gNTtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgJ3N0cmluZyc6XHJcblx0XHRcdGNhc2UgJ2Jvb2wnOlxyXG5cdFx0XHRcdG1peEZ1bmN0aW9uID0gdGhpcy5fc2VsZWN0O1xyXG5cclxuXHRcdFx0XHQvLyBVc2UgdGhlIHJlZ3VsYXIgbWl4IGZ1bmN0aW9uIGFuZCBmb3IgYWRkaXRpdmUgb24gdGhlc2UgdHlwZXMsXHJcblx0XHRcdFx0Ly8gYWRkaXRpdmUgaXMgbm90IHJlbGV2YW50IGZvciBub24tbnVtZXJpYyB0eXBlc1xyXG5cdFx0XHRcdG1peEZ1bmN0aW9uQWRkaXRpdmUgPSB0aGlzLl9zZWxlY3Q7XHJcblxyXG5cdFx0XHRcdHNldElkZW50aXR5ID0gdGhpcy5fc2V0QWRkaXRpdmVJZGVudGl0eU90aGVyO1xyXG5cclxuXHRcdFx0XHR0aGlzLmJ1ZmZlciA9IG5ldyBBcnJheSggdmFsdWVTaXplICogNSApO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRtaXhGdW5jdGlvbiA9IHRoaXMuX2xlcnA7XHJcblx0XHRcdFx0bWl4RnVuY3Rpb25BZGRpdGl2ZSA9IHRoaXMuX2xlcnBBZGRpdGl2ZTtcclxuXHRcdFx0XHRzZXRJZGVudGl0eSA9IHRoaXMuX3NldEFkZGl0aXZlSWRlbnRpdHlOdW1lcmljO1xyXG5cclxuXHRcdFx0XHR0aGlzLmJ1ZmZlciA9IG5ldyBGbG9hdDY0QXJyYXkoIHZhbHVlU2l6ZSAqIDUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5fbWl4QnVmZmVyUmVnaW9uID0gbWl4RnVuY3Rpb247XHJcblx0XHR0aGlzLl9taXhCdWZmZXJSZWdpb25BZGRpdGl2ZSA9IG1peEZ1bmN0aW9uQWRkaXRpdmU7XHJcblx0XHR0aGlzLl9zZXRJZGVudGl0eSA9IHNldElkZW50aXR5O1xyXG5cdFx0dGhpcy5fb3JpZ0luZGV4ID0gMztcclxuXHRcdHRoaXMuX2FkZEluZGV4ID0gNDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRPRE9cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmN1bXVsYXRpdmVXZWlnaHQgPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVE9ET1xyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY3VtdWxhdGl2ZVdlaWdodEFkZGl0aXZlID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRPRE9cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVzZUNvdW50ID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRPRE9cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJlZmVyZW5jZUNvdW50ID0gMDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBY2N1bXVsYXRlcyBkYXRhIGluIHRoZSBgaW5jb21pbmdgIHJlZ2lvbiBpbnRvIGBhY2N1PGk+YC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhY2N1SW5kZXggLSBUaGUgYWNjdW11bGF0aW9uIGluZGV4LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB3ZWlnaHQgLSBUaGUgd2VpZ2h0LlxyXG5cdCAqL1xyXG5cdGFjY3VtdWxhdGUoIGFjY3VJbmRleCwgd2VpZ2h0ICkge1xyXG5cclxuXHRcdC8vIG5vdGU6IGhhcHBpbHkgYWNjdW11bGF0aW5nIG5vdGhpbmcgd2hlbiB3ZWlnaHQgPSAwLCB0aGUgY2FsbGVyIGtub3dzXHJcblx0XHQvLyB0aGUgd2VpZ2h0IGFuZCBzaG91bGRuJ3QgaGF2ZSBtYWRlIHRoZSBjYWxsIGluIHRoZSBmaXJzdCBwbGFjZVxyXG5cclxuXHRcdGNvbnN0IGJ1ZmZlciA9IHRoaXMuYnVmZmVyLFxyXG5cdFx0XHRzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSxcclxuXHRcdFx0b2Zmc2V0ID0gYWNjdUluZGV4ICogc3RyaWRlICsgc3RyaWRlO1xyXG5cclxuXHRcdGxldCBjdXJyZW50V2VpZ2h0ID0gdGhpcy5jdW11bGF0aXZlV2VpZ2h0O1xyXG5cclxuXHRcdGlmICggY3VycmVudFdlaWdodCA9PT0gMCApIHtcclxuXHJcblx0XHRcdC8vIGFjY3VOIDo9IGluY29taW5nICogd2VpZ2h0XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgIT09IHN0cmlkZTsgKysgaSApIHtcclxuXHJcblx0XHRcdFx0YnVmZmVyWyBvZmZzZXQgKyBpIF0gPSBidWZmZXJbIGkgXTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGN1cnJlbnRXZWlnaHQgPSB3ZWlnaHQ7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdC8vIGFjY3VOIDo9IGFjY3VOICsgaW5jb21pbmcgKiB3ZWlnaHRcclxuXHJcblx0XHRcdGN1cnJlbnRXZWlnaHQgKz0gd2VpZ2h0O1xyXG5cdFx0XHRjb25zdCBtaXggPSB3ZWlnaHQgLyBjdXJyZW50V2VpZ2h0O1xyXG5cdFx0XHR0aGlzLl9taXhCdWZmZXJSZWdpb24oIGJ1ZmZlciwgb2Zmc2V0LCAwLCBtaXgsIHN0cmlkZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmN1bXVsYXRpdmVXZWlnaHQgPSBjdXJyZW50V2VpZ2h0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFjY3VtdWxhdGVzIGRhdGEgaW4gdGhlIGBpbmNvbWluZ2AgcmVnaW9uIGludG8gYGFkZGAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gd2VpZ2h0IC0gVGhlIHdlaWdodC5cclxuXHQgKi9cclxuXHRhY2N1bXVsYXRlQWRkaXRpdmUoIHdlaWdodCApIHtcclxuXHJcblx0XHRjb25zdCBidWZmZXIgPSB0aGlzLmJ1ZmZlcixcclxuXHRcdFx0c3RyaWRlID0gdGhpcy52YWx1ZVNpemUsXHJcblx0XHRcdG9mZnNldCA9IHN0cmlkZSAqIHRoaXMuX2FkZEluZGV4O1xyXG5cclxuXHRcdGlmICggdGhpcy5jdW11bGF0aXZlV2VpZ2h0QWRkaXRpdmUgPT09IDAgKSB7XHJcblxyXG5cdFx0XHQvLyBhZGQgPSBpZGVudGl0eVxyXG5cclxuXHRcdFx0dGhpcy5fc2V0SWRlbnRpdHkoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gYWRkIDo9IGFkZCArIGluY29taW5nICogd2VpZ2h0XHJcblxyXG5cdFx0dGhpcy5fbWl4QnVmZmVyUmVnaW9uQWRkaXRpdmUoIGJ1ZmZlciwgb2Zmc2V0LCAwLCB3ZWlnaHQsIHN0cmlkZSApO1xyXG5cdFx0dGhpcy5jdW11bGF0aXZlV2VpZ2h0QWRkaXRpdmUgKz0gd2VpZ2h0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFwcGxpZXMgdGhlIHN0YXRlIG9mIGBhY2N1PGk+YCB0byB0aGUgYmluZGluZyB3aGVuIGFjY3VzIGRpZmZlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhY2N1SW5kZXggLSBUaGUgYWNjdW11bGF0aW9uIGluZGV4LlxyXG5cdCAqL1xyXG5cdGFwcGx5KCBhY2N1SW5kZXggKSB7XHJcblxyXG5cdFx0Y29uc3Qgc3RyaWRlID0gdGhpcy52YWx1ZVNpemUsXHJcblx0XHRcdGJ1ZmZlciA9IHRoaXMuYnVmZmVyLFxyXG5cdFx0XHRvZmZzZXQgPSBhY2N1SW5kZXggKiBzdHJpZGUgKyBzdHJpZGUsXHJcblxyXG5cdFx0XHR3ZWlnaHQgPSB0aGlzLmN1bXVsYXRpdmVXZWlnaHQsXHJcblx0XHRcdHdlaWdodEFkZGl0aXZlID0gdGhpcy5jdW11bGF0aXZlV2VpZ2h0QWRkaXRpdmUsXHJcblxyXG5cdFx0XHRiaW5kaW5nID0gdGhpcy5iaW5kaW5nO1xyXG5cclxuXHRcdHRoaXMuY3VtdWxhdGl2ZVdlaWdodCA9IDA7XHJcblx0XHR0aGlzLmN1bXVsYXRpdmVXZWlnaHRBZGRpdGl2ZSA9IDA7XHJcblxyXG5cdFx0aWYgKCB3ZWlnaHQgPCAxICkge1xyXG5cclxuXHRcdFx0Ly8gYWNjdU4gOj0gYWNjdU4gKyBvcmlnaW5hbCAqICggMSAtIGN1bXVsYXRpdmVXZWlnaHQgKVxyXG5cclxuXHRcdFx0Y29uc3Qgb3JpZ2luYWxWYWx1ZU9mZnNldCA9IHN0cmlkZSAqIHRoaXMuX29yaWdJbmRleDtcclxuXHJcblx0XHRcdHRoaXMuX21peEJ1ZmZlclJlZ2lvbihcclxuXHRcdFx0XHRidWZmZXIsIG9mZnNldCwgb3JpZ2luYWxWYWx1ZU9mZnNldCwgMSAtIHdlaWdodCwgc3RyaWRlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggd2VpZ2h0QWRkaXRpdmUgPiAwICkge1xyXG5cclxuXHRcdFx0Ly8gYWNjdU4gOj0gYWNjdU4gKyBhZGRpdGl2ZSBhY2N1TlxyXG5cclxuXHRcdFx0dGhpcy5fbWl4QnVmZmVyUmVnaW9uQWRkaXRpdmUoIGJ1ZmZlciwgb2Zmc2V0LCB0aGlzLl9hZGRJbmRleCAqIHN0cmlkZSwgMSwgc3RyaWRlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZvciAoIGxldCBpID0gc3RyaWRlLCBlID0gc3RyaWRlICsgc3RyaWRlOyBpICE9PSBlOyArKyBpICkge1xyXG5cclxuXHRcdFx0aWYgKCBidWZmZXJbIGkgXSAhPT0gYnVmZmVyWyBpICsgc3RyaWRlIF0gKSB7XHJcblxyXG5cdFx0XHRcdC8vIHZhbHVlIGhhcyBjaGFuZ2VkIC0+IHVwZGF0ZSBzY2VuZSBncmFwaFxyXG5cclxuXHRcdFx0XHRiaW5kaW5nLnNldFZhbHVlKCBidWZmZXIsIG9mZnNldCApO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogUmVtZW1iZXJzIHRoZSBzdGF0ZSBvZiB0aGUgYm91bmQgcHJvcGVydHkgYW5kIGNvcHkgaXQgdG8gYm90aCBhY2N1cy5cclxuXHQgKi9cclxuXHRzYXZlT3JpZ2luYWxTdGF0ZSgpIHtcclxuXHJcblx0XHRjb25zdCBiaW5kaW5nID0gdGhpcy5iaW5kaW5nO1xyXG5cclxuXHRcdGNvbnN0IGJ1ZmZlciA9IHRoaXMuYnVmZmVyLFxyXG5cdFx0XHRzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSxcclxuXHJcblx0XHRcdG9yaWdpbmFsVmFsdWVPZmZzZXQgPSBzdHJpZGUgKiB0aGlzLl9vcmlnSW5kZXg7XHJcblxyXG5cdFx0YmluZGluZy5nZXRWYWx1ZSggYnVmZmVyLCBvcmlnaW5hbFZhbHVlT2Zmc2V0ICk7XHJcblxyXG5cdFx0Ly8gYWNjdVswLi4xXSA6PSBvcmlnIC0tIGluaXRpYWxseSBkZXRlY3QgY2hhbmdlcyBhZ2FpbnN0IHRoZSBvcmlnaW5hbFxyXG5cdFx0Zm9yICggbGV0IGkgPSBzdHJpZGUsIGUgPSBvcmlnaW5hbFZhbHVlT2Zmc2V0OyBpICE9PSBlOyArKyBpICkge1xyXG5cclxuXHRcdFx0YnVmZmVyWyBpIF0gPSBidWZmZXJbIG9yaWdpbmFsVmFsdWVPZmZzZXQgKyAoIGkgJSBzdHJpZGUgKSBdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBBZGQgdG8gaWRlbnRpdHkgZm9yIGFkZGl0aXZlXHJcblx0XHR0aGlzLl9zZXRJZGVudGl0eSgpO1xyXG5cclxuXHRcdHRoaXMuY3VtdWxhdGl2ZVdlaWdodCA9IDA7XHJcblx0XHR0aGlzLmN1bXVsYXRpdmVXZWlnaHRBZGRpdGl2ZSA9IDA7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQXBwbGllcyB0aGUgc3RhdGUgcHJldmlvdXNseSB0YWtlbiB2aWEge0BsaW5rIFByb3BlcnR5TWl4ZXIjc2F2ZU9yaWdpbmFsU3RhdGV9IHRvIHRoZSBiaW5kaW5nLlxyXG5cdCAqL1xyXG5cdHJlc3RvcmVPcmlnaW5hbFN0YXRlKCkge1xyXG5cclxuXHRcdGNvbnN0IG9yaWdpbmFsVmFsdWVPZmZzZXQgPSB0aGlzLnZhbHVlU2l6ZSAqIDM7XHJcblx0XHR0aGlzLmJpbmRpbmcuc2V0VmFsdWUoIHRoaXMuYnVmZmVyLCBvcmlnaW5hbFZhbHVlT2Zmc2V0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gaW50ZXJuYWxzXHJcblxyXG5cdF9zZXRBZGRpdGl2ZUlkZW50aXR5TnVtZXJpYygpIHtcclxuXHJcblx0XHRjb25zdCBzdGFydEluZGV4ID0gdGhpcy5fYWRkSW5kZXggKiB0aGlzLnZhbHVlU2l6ZTtcclxuXHRcdGNvbnN0IGVuZEluZGV4ID0gc3RhcnRJbmRleCArIHRoaXMudmFsdWVTaXplO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gc3RhcnRJbmRleDsgaSA8IGVuZEluZGV4OyBpICsrICkge1xyXG5cclxuXHRcdFx0dGhpcy5idWZmZXJbIGkgXSA9IDA7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdF9zZXRBZGRpdGl2ZUlkZW50aXR5UXVhdGVybmlvbigpIHtcclxuXHJcblx0XHR0aGlzLl9zZXRBZGRpdGl2ZUlkZW50aXR5TnVtZXJpYygpO1xyXG5cdFx0dGhpcy5idWZmZXJbIHRoaXMuX2FkZEluZGV4ICogdGhpcy52YWx1ZVNpemUgKyAzIF0gPSAxO1xyXG5cclxuXHR9XHJcblxyXG5cdF9zZXRBZGRpdGl2ZUlkZW50aXR5T3RoZXIoKSB7XHJcblxyXG5cdFx0Y29uc3Qgc3RhcnRJbmRleCA9IHRoaXMuX29yaWdJbmRleCAqIHRoaXMudmFsdWVTaXplO1xyXG5cdFx0Y29uc3QgdGFyZ2V0SW5kZXggPSB0aGlzLl9hZGRJbmRleCAqIHRoaXMudmFsdWVTaXplO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHRoaXMudmFsdWVTaXplOyBpICsrICkge1xyXG5cclxuXHRcdFx0dGhpcy5idWZmZXJbIHRhcmdldEluZGV4ICsgaSBdID0gdGhpcy5idWZmZXJbIHN0YXJ0SW5kZXggKyBpIF07XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cclxuXHQvLyBtaXggZnVuY3Rpb25zXHJcblxyXG5cdF9zZWxlY3QoIGJ1ZmZlciwgZHN0T2Zmc2V0LCBzcmNPZmZzZXQsIHQsIHN0cmlkZSApIHtcclxuXHJcblx0XHRpZiAoIHQgPj0gMC41ICkge1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpICE9PSBzdHJpZGU7ICsrIGkgKSB7XHJcblxyXG5cdFx0XHRcdGJ1ZmZlclsgZHN0T2Zmc2V0ICsgaSBdID0gYnVmZmVyWyBzcmNPZmZzZXQgKyBpIF07XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdF9zbGVycCggYnVmZmVyLCBkc3RPZmZzZXQsIHNyY09mZnNldCwgdCApIHtcclxuXHJcblx0XHRRdWF0ZXJuaW9uLnNsZXJwRmxhdCggYnVmZmVyLCBkc3RPZmZzZXQsIGJ1ZmZlciwgZHN0T2Zmc2V0LCBidWZmZXIsIHNyY09mZnNldCwgdCApO1xyXG5cclxuXHR9XHJcblxyXG5cdF9zbGVycEFkZGl0aXZlKCBidWZmZXIsIGRzdE9mZnNldCwgc3JjT2Zmc2V0LCB0LCBzdHJpZGUgKSB7XHJcblxyXG5cdFx0Y29uc3Qgd29ya09mZnNldCA9IHRoaXMuX3dvcmtJbmRleCAqIHN0cmlkZTtcclxuXHJcblx0XHQvLyBTdG9yZSByZXN1bHQgaW4gaW50ZXJtZWRpYXRlIGJ1ZmZlciBvZmZzZXRcclxuXHRcdFF1YXRlcm5pb24ubXVsdGlwbHlRdWF0ZXJuaW9uc0ZsYXQoIGJ1ZmZlciwgd29ya09mZnNldCwgYnVmZmVyLCBkc3RPZmZzZXQsIGJ1ZmZlciwgc3JjT2Zmc2V0ICk7XHJcblxyXG5cdFx0Ly8gU2xlcnAgdG8gdGhlIGludGVybWVkaWF0ZSByZXN1bHRcclxuXHRcdFF1YXRlcm5pb24uc2xlcnBGbGF0KCBidWZmZXIsIGRzdE9mZnNldCwgYnVmZmVyLCBkc3RPZmZzZXQsIGJ1ZmZlciwgd29ya09mZnNldCwgdCApO1xyXG5cclxuXHR9XHJcblxyXG5cdF9sZXJwKCBidWZmZXIsIGRzdE9mZnNldCwgc3JjT2Zmc2V0LCB0LCBzdHJpZGUgKSB7XHJcblxyXG5cdFx0Y29uc3QgcyA9IDEgLSB0O1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSAhPT0gc3RyaWRlOyArKyBpICkge1xyXG5cclxuXHRcdFx0Y29uc3QgaiA9IGRzdE9mZnNldCArIGk7XHJcblxyXG5cdFx0XHRidWZmZXJbIGogXSA9IGJ1ZmZlclsgaiBdICogcyArIGJ1ZmZlclsgc3JjT2Zmc2V0ICsgaSBdICogdDtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0X2xlcnBBZGRpdGl2ZSggYnVmZmVyLCBkc3RPZmZzZXQsIHNyY09mZnNldCwgdCwgc3RyaWRlICkge1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSAhPT0gc3RyaWRlOyArKyBpICkge1xyXG5cclxuXHRcdFx0Y29uc3QgaiA9IGRzdE9mZnNldCArIGk7XHJcblxyXG5cdFx0XHRidWZmZXJbIGogXSA9IGJ1ZmZlclsgaiBdICsgYnVmZmVyWyBzcmNPZmZzZXQgKyBpIF0gKiB0O1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCB7IFByb3BlcnR5TWl4ZXIgfTtcclxuIiwiLy8gQ2hhcmFjdGVycyBbXS46LyBhcmUgcmVzZXJ2ZWQgZm9yIHRyYWNrIGJpbmRpbmcgc3ludGF4LlxyXG5jb25zdCBfUkVTRVJWRURfQ0hBUlNfUkUgPSAnXFxcXFtcXFxcXVxcXFwuOlxcXFwvJztcclxuY29uc3QgX3Jlc2VydmVkUmUgPSBuZXcgUmVnRXhwKCAnWycgKyBfUkVTRVJWRURfQ0hBUlNfUkUgKyAnXScsICdnJyApO1xyXG5cclxuLy8gQXR0ZW1wdHMgdG8gYWxsb3cgbm9kZSBuYW1lcyBmcm9tIGFueSBsYW5ndWFnZS4gRVM1J3MgYFxcd2AgcmVnZXhwIG1hdGNoZXNcclxuLy8gb25seSBsYXRpbiBjaGFyYWN0ZXJzLCBhbmQgdGhlIHVuaWNvZGUgXFxwe0x9IGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiBTb1xyXG4vLyBpbnN0ZWFkLCB3ZSBleGNsdWRlIHJlc2VydmVkIGNoYXJhY3RlcnMgYW5kIG1hdGNoIGV2ZXJ5dGhpbmcgZWxzZS5cclxuY29uc3QgX3dvcmRDaGFyID0gJ1teJyArIF9SRVNFUlZFRF9DSEFSU19SRSArICddJztcclxuY29uc3QgX3dvcmRDaGFyT3JEb3QgPSAnW14nICsgX1JFU0VSVkVEX0NIQVJTX1JFLnJlcGxhY2UoICdcXFxcLicsICcnICkgKyAnXSc7XHJcblxyXG4vLyBQYXJlbnQgZGlyZWN0b3JpZXMsIGRlbGltaXRlZCBieSAnLycgb3IgJzonLiBDdXJyZW50bHkgdW51c2VkLCBidXQgbXVzdFxyXG4vLyBiZSBtYXRjaGVkIHRvIHBhcnNlIHRoZSByZXN0IG9mIHRoZSB0cmFjayBuYW1lLlxyXG5jb25zdCBfZGlyZWN0b3J5UmUgPSAvKkBfX1BVUkVfXyovIC8oKD86V0MrW1xcLzpdKSopLy5zb3VyY2UucmVwbGFjZSggJ1dDJywgX3dvcmRDaGFyICk7XHJcblxyXG4vLyBUYXJnZXQgbm9kZS4gTWF5IGNvbnRhaW4gd29yZCBjaGFyYWN0ZXJzIChhLXpBLVowLTlfKSBhbmQgJy4nIG9yICctJy5cclxuY29uc3QgX25vZGVSZSA9IC8qQF9fUFVSRV9fKi8gLyhXQ09EKyk/Ly5zb3VyY2UucmVwbGFjZSggJ1dDT0QnLCBfd29yZENoYXJPckRvdCApO1xyXG5cclxuLy8gT2JqZWN0IG9uIHRhcmdldCBub2RlLCBhbmQgYWNjZXNzb3IuIE1heSBub3QgY29udGFpbiByZXNlcnZlZFxyXG4vLyBjaGFyYWN0ZXJzLiBBY2Nlc3NvciBtYXkgY29udGFpbiBhbnkgY2hhcmFjdGVyIGV4Y2VwdCBjbG9zaW5nIGJyYWNrZXQuXHJcbmNvbnN0IF9vYmplY3RSZSA9IC8qQF9fUFVSRV9fKi8gLyg/OlxcLihXQyspKD86XFxbKC4rKVxcXSk/KT8vLnNvdXJjZS5yZXBsYWNlKCAnV0MnLCBfd29yZENoYXIgKTtcclxuXHJcbi8vIFByb3BlcnR5IGFuZCBhY2Nlc3Nvci4gTWF5IG5vdCBjb250YWluIHJlc2VydmVkIGNoYXJhY3RlcnMuIEFjY2Vzc29yIG1heVxyXG4vLyBjb250YWluIGFueSBub24tYnJhY2tldCBjaGFyYWN0ZXJzLlxyXG5jb25zdCBfcHJvcGVydHlSZSA9IC8qQF9fUFVSRV9fKi8gL1xcLihXQyspKD86XFxbKC4rKVxcXSk/Ly5zb3VyY2UucmVwbGFjZSggJ1dDJywgX3dvcmRDaGFyICk7XHJcblxyXG5jb25zdCBfdHJhY2tSZSA9IG5ldyBSZWdFeHAoICcnXHJcblx0KyAnXidcclxuXHQrIF9kaXJlY3RvcnlSZVxyXG5cdCsgX25vZGVSZVxyXG5cdCsgX29iamVjdFJlXHJcblx0KyBfcHJvcGVydHlSZVxyXG5cdCsgJyQnXHJcbik7XHJcblxyXG5jb25zdCBfc3VwcG9ydGVkT2JqZWN0TmFtZXMgPSBbICdtYXRlcmlhbCcsICdtYXRlcmlhbHMnLCAnYm9uZXMnLCAnbWFwJyBdO1xyXG5cclxuY2xhc3MgQ29tcG9zaXRlIHtcclxuXHJcblx0Y29uc3RydWN0b3IoIHRhcmdldEdyb3VwLCBwYXRoLCBvcHRpb25hbFBhcnNlZFBhdGggKSB7XHJcblxyXG5cdFx0Y29uc3QgcGFyc2VkUGF0aCA9IG9wdGlvbmFsUGFyc2VkUGF0aCB8fCBQcm9wZXJ0eUJpbmRpbmcucGFyc2VUcmFja05hbWUoIHBhdGggKTtcclxuXHJcblx0XHR0aGlzLl90YXJnZXRHcm91cCA9IHRhcmdldEdyb3VwO1xyXG5cdFx0dGhpcy5fYmluZGluZ3MgPSB0YXJnZXRHcm91cC5zdWJzY3JpYmVfKCBwYXRoLCBwYXJzZWRQYXRoICk7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0VmFsdWUoIGFycmF5LCBvZmZzZXQgKSB7XHJcblxyXG5cdFx0dGhpcy5iaW5kKCk7IC8vIGJpbmQgYWxsIGJpbmRpbmdcclxuXHJcblx0XHRjb25zdCBmaXJzdFZhbGlkSW5kZXggPSB0aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c18sXHJcblx0XHRcdGJpbmRpbmcgPSB0aGlzLl9iaW5kaW5nc1sgZmlyc3RWYWxpZEluZGV4IF07XHJcblxyXG5cdFx0Ly8gYW5kIG9ubHkgY2FsbCAuZ2V0VmFsdWUgb24gdGhlIGZpcnN0XHJcblx0XHRpZiAoIGJpbmRpbmcgIT09IHVuZGVmaW5lZCApIGJpbmRpbmcuZ2V0VmFsdWUoIGFycmF5LCBvZmZzZXQgKTtcclxuXHJcblx0fVxyXG5cclxuXHRzZXRWYWx1ZSggYXJyYXksIG9mZnNldCApIHtcclxuXHJcblx0XHRjb25zdCBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gdGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLCBuID0gYmluZGluZ3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xyXG5cclxuXHRcdFx0YmluZGluZ3NbIGkgXS5zZXRWYWx1ZSggYXJyYXksIG9mZnNldCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRiaW5kKCkge1xyXG5cclxuXHRcdGNvbnN0IGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3M7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSB0aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c18sIG4gPSBiaW5kaW5ncy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XHJcblxyXG5cdFx0XHRiaW5kaW5nc1sgaSBdLmJpbmQoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0dW5iaW5kKCkge1xyXG5cclxuXHRcdGNvbnN0IGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3M7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSB0aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c18sIG4gPSBiaW5kaW5ncy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XHJcblxyXG5cdFx0XHRiaW5kaW5nc1sgaSBdLnVuYmluZCgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLy8gTm90ZTogVGhpcyBjbGFzcyB1c2VzIGEgU3RhdGUgcGF0dGVybiBvbiBhIHBlci1tZXRob2QgYmFzaXM6XHJcbi8vICdiaW5kJyBzZXRzICd0aGlzLmdldFZhbHVlJyAvICdzZXRWYWx1ZScgYW5kIHNoYWRvd3MgdGhlXHJcbi8vIHByb3RvdHlwZSB2ZXJzaW9uIG9mIHRoZXNlIG1ldGhvZHMgd2l0aCBvbmUgdGhhdCByZXByZXNlbnRzXHJcbi8vIHRoZSBib3VuZCBzdGF0ZS4gV2hlbiB0aGUgcHJvcGVydHkgaXMgbm90IGZvdW5kLCB0aGUgbWV0aG9kc1xyXG4vLyBiZWNvbWUgbm8tb3BzLlxyXG5cclxuXHJcbi8qKlxyXG4gKiBUaGlzIGhvbGRzIGEgcmVmZXJlbmNlIHRvIGEgcmVhbCBwcm9wZXJ0eSBpbiB0aGUgc2NlbmUgZ3JhcGg7IHVzZWQgaW50ZXJuYWxseS5cclxuICovXHJcbmNsYXNzIFByb3BlcnR5QmluZGluZyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcHJvcGVydHkgYmluZGluZy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSByb290Tm9kZSAtIFRoZSByb290IG5vZGUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBUaGUgcGF0aC5cclxuXHQgKiBAcGFyYW0gez9PYmplY3R9IFtwYXJzZWRQYXRoXSAtIFRoZSBwYXJzZWQgcGF0aC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggcm9vdE5vZGUsIHBhdGgsIHBhcnNlZFBhdGggKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgb2JqZWN0IHBhdGggdG8gdGhlIGFuaW1hdGVkIHByb3BlcnR5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucGF0aCA9IHBhdGg7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBvYmplY3QgaG9sZGluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGF0aC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBhcnNlZFBhdGggPSBwYXJzZWRQYXRoIHx8IFByb3BlcnR5QmluZGluZy5wYXJzZVRyYWNrTmFtZSggcGF0aCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG9iamVjdCBvd25zIHRoZSBhbmltYXRlZCBwcm9wZXJ0eS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P09iamVjdH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub2RlID0gUHJvcGVydHlCaW5kaW5nLmZpbmROb2RlKCByb290Tm9kZSwgdGhpcy5wYXJzZWRQYXRoLm5vZGVOYW1lICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcm9vdCBub2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3QzRHxTa2VsZXRvbn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yb290Tm9kZSA9IHJvb3ROb2RlO1xyXG5cclxuXHRcdC8vIGluaXRpYWwgc3RhdGUgb2YgdGhlc2UgbWV0aG9kcyB0aGF0IGNhbGxzICdiaW5kJ1xyXG5cdFx0dGhpcy5nZXRWYWx1ZSA9IHRoaXMuX2dldFZhbHVlX3VuYm91bmQ7XHJcblx0XHR0aGlzLnNldFZhbHVlID0gdGhpcy5fc2V0VmFsdWVfdW5ib3VuZDtcclxuXHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogRmFjdG9yeSBtZXRob2QgZm9yIGNyZWF0aW5nIGEgcHJvcGVydHkgYmluZGluZyBmcm9tIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLlxyXG5cdCAqXHJcblx0ICogQHN0YXRpY1xyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSByb290IC0gVGhlIHJvb3Qgbm9kZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFRoZSBwYXRoLlxyXG5cdCAqIEBwYXJhbSB7P09iamVjdH0gW3BhcnNlZFBhdGhdIC0gVGhlIHBhcnNlZCBwYXRoLlxyXG5cdCAqIEByZXR1cm4ge1Byb3BlcnR5QmluZGluZ3xDb21wb3NpdGV9IFRoZSBjcmVhdGVkIHByb3BlcnR5IGJpbmRpbmcgb3IgY29tcG9zaXRlLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBjcmVhdGUoIHJvb3QsIHBhdGgsIHBhcnNlZFBhdGggKSB7XHJcblxyXG5cdFx0aWYgKCAhICggcm9vdCAmJiByb290LmlzQW5pbWF0aW9uT2JqZWN0R3JvdXAgKSApIHtcclxuXHJcblx0XHRcdHJldHVybiBuZXcgUHJvcGVydHlCaW5kaW5nKCByb290LCBwYXRoLCBwYXJzZWRQYXRoICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHJldHVybiBuZXcgUHJvcGVydHlCaW5kaW5nLkNvbXBvc2l0ZSggcm9vdCwgcGF0aCwgcGFyc2VkUGF0aCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXBsYWNlcyBzcGFjZXMgd2l0aCB1bmRlcnNjb3JlcyBhbmQgcmVtb3ZlcyB1bnN1cHBvcnRlZCBjaGFyYWN0ZXJzIGZyb21cclxuXHQgKiBub2RlIG5hbWVzLCB0byBlbnN1cmUgY29tcGF0aWJpbGl0eSB3aXRoIHBhcnNlVHJhY2tOYW1lKCkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIE5vZGUgbmFtZSB0byBiZSBzYW5pdGl6ZWQuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgc2FuaXRpemVkIG5vZGUgbmFtZS5cclxuXHQgKi9cclxuXHRzdGF0aWMgc2FuaXRpemVOb2RlTmFtZSggbmFtZSApIHtcclxuXHJcblx0XHRyZXR1cm4gbmFtZS5yZXBsYWNlKCAvXFxzL2csICdfJyApLnJlcGxhY2UoIF9yZXNlcnZlZFJlLCAnJyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBhcnNlcyB0aGUgZ2l2ZW4gdHJhY2sgbmFtZSAoYW4gb2JqZWN0IHBhdGggdG8gYW4gYW5pbWF0ZWQgcHJvcGVydHkpIGFuZFxyXG5cdCAqIHJldHVybnMgYW4gb2JqZWN0IHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBhdGguIE1hdGNoZXMgc3RyaW5ncyBpbiB0aGUgZm9sbG93aW5nIGZvcm1zOlxyXG5cdCAqXHJcblx0ICogLSBub2RlTmFtZS5wcm9wZXJ0eVxyXG5cdCAqIC0gbm9kZU5hbWUucHJvcGVydHlbYWNjZXNzb3JdXHJcblx0ICogLSBub2RlTmFtZS5tYXRlcmlhbC5wcm9wZXJ0eVthY2Nlc3Nvcl1cclxuXHQgKiAtIHV1aWQucHJvcGVydHlbYWNjZXNzb3JdXHJcblx0ICogLSB1dWlkLm9iamVjdE5hbWVbb2JqZWN0SW5kZXhdLnByb3BlcnR5TmFtZVtwcm9wZXJ0eUluZGV4XVxyXG5cdCAqIC0gcGFyZW50TmFtZS9ub2RlTmFtZS5wcm9wZXJ0eVxyXG5cdCAqIC0gcGFyZW50TmFtZS9wYXJlbnROYW1lL25vZGVOYW1lLnByb3BlcnR5W2luZGV4XVxyXG5cdCAqIC0gLmJvbmVbQXJtYXR1cmUuREVGX2NvZ10ucG9zaXRpb25cclxuXHQgKiAtIHNjZW5lOmhlbGl1bV9iYWxsb29uX21vZGVsOmhlbGl1bV9iYWxsb29uX21vZGVsLnBvc2l0aW9uXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHRyYWNrTmFtZSAtIFRoZSB0cmFjayBuYW1lIHRvIHBhcnNlLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdH0gVGhlIHBhcnNlZCB0cmFjayBuYW1lIGFzIGFuIG9iamVjdC5cclxuXHQgKi9cclxuXHRzdGF0aWMgcGFyc2VUcmFja05hbWUoIHRyYWNrTmFtZSApIHtcclxuXHJcblx0XHRjb25zdCBtYXRjaGVzID0gX3RyYWNrUmUuZXhlYyggdHJhY2tOYW1lICk7XHJcblxyXG5cdFx0aWYgKCBtYXRjaGVzID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnUHJvcGVydHlCaW5kaW5nOiBDYW5ub3QgcGFyc2UgdHJhY2tOYW1lOiAnICsgdHJhY2tOYW1lICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHJlc3VsdHMgPSB7XHJcblx0XHRcdC8vIGRpcmVjdG9yeU5hbWU6IG1hdGNoZXNbIDEgXSwgLy8gKHRzY2h3KSBjdXJyZW50bHkgdW51c2VkXHJcblx0XHRcdG5vZGVOYW1lOiBtYXRjaGVzWyAyIF0sXHJcblx0XHRcdG9iamVjdE5hbWU6IG1hdGNoZXNbIDMgXSxcclxuXHRcdFx0b2JqZWN0SW5kZXg6IG1hdGNoZXNbIDQgXSxcclxuXHRcdFx0cHJvcGVydHlOYW1lOiBtYXRjaGVzWyA1IF0sIC8vIHJlcXVpcmVkXHJcblx0XHRcdHByb3BlcnR5SW5kZXg6IG1hdGNoZXNbIDYgXVxyXG5cdFx0fTtcclxuXHJcblx0XHRjb25zdCBsYXN0RG90ID0gcmVzdWx0cy5ub2RlTmFtZSAmJiByZXN1bHRzLm5vZGVOYW1lLmxhc3RJbmRleE9mKCAnLicgKTtcclxuXHJcblx0XHRpZiAoIGxhc3REb3QgIT09IHVuZGVmaW5lZCAmJiBsYXN0RG90ICE9PSAtIDEgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBvYmplY3ROYW1lID0gcmVzdWx0cy5ub2RlTmFtZS5zdWJzdHJpbmcoIGxhc3REb3QgKyAxICk7XHJcblxyXG5cdFx0XHQvLyBPYmplY3QgbmFtZXMgbXVzdCBiZSBjaGVja2VkIGFnYWluc3QgYW4gYWxsb3dsaXN0LiBPdGhlcndpc2UsIHRoZXJlXHJcblx0XHRcdC8vIGlzIG5vIHdheSB0byBwYXJzZSAnZm9vLmJhci5iYXonOiAnYmF6JyBtdXN0IGJlIGEgcHJvcGVydHksIGJ1dFxyXG5cdFx0XHQvLyAnYmFyJyBjb3VsZCBiZSB0aGUgb2JqZWN0TmFtZSwgb3IgcGFydCBvZiBhIG5vZGVOYW1lICh3aGljaCBjYW5cclxuXHRcdFx0Ly8gaW5jbHVkZSAnLicgY2hhcmFjdGVycykuXHJcblx0XHRcdGlmICggX3N1cHBvcnRlZE9iamVjdE5hbWVzLmluZGV4T2YoIG9iamVjdE5hbWUgKSAhPT0gLSAxICkge1xyXG5cclxuXHRcdFx0XHRyZXN1bHRzLm5vZGVOYW1lID0gcmVzdWx0cy5ub2RlTmFtZS5zdWJzdHJpbmcoIDAsIGxhc3REb3QgKTtcclxuXHRcdFx0XHRyZXN1bHRzLm9iamVjdE5hbWUgPSBvYmplY3ROYW1lO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHJlc3VsdHMucHJvcGVydHlOYW1lID09PSBudWxsIHx8IHJlc3VsdHMucHJvcGVydHlOYW1lLmxlbmd0aCA9PT0gMCApIHtcclxuXHJcblx0XHRcdHRocm93IG5ldyBFcnJvciggJ1Byb3BlcnR5QmluZGluZzogY2FuIG5vdCBwYXJzZSBwcm9wZXJ0eU5hbWUgZnJvbSB0cmFja05hbWU6ICcgKyB0cmFja05hbWUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHJlc3VsdHM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2VhcmNoZXMgZm9yIGEgbm9kZSBpbiB0aGUgaGllcmFyY2h5IG9mIHRoZSBnaXZlbiByb290IG9iamVjdCBieSB0aGUgZ2l2ZW5cclxuXHQgKiBub2RlIG5hbWUuXHJcblx0ICpcclxuXHQgKiBAc3RhdGljXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IHJvb3QgLSBUaGUgcm9vdCBvYmplY3QuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBub2RlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBub2RlLlxyXG5cdCAqIEByZXR1cm4gez9PYmplY3R9IFRoZSBmb3VuZCBub2RlLiBSZXR1cm5zIGBudWxsYCBpZiBubyBvYmplY3Qgd2FzIGZvdW5kLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBmaW5kTm9kZSggcm9vdCwgbm9kZU5hbWUgKSB7XHJcblxyXG5cdFx0aWYgKCBub2RlTmFtZSA9PT0gdW5kZWZpbmVkIHx8IG5vZGVOYW1lID09PSAnJyB8fCBub2RlTmFtZSA9PT0gJy4nIHx8IG5vZGVOYW1lID09PSAtIDEgfHwgbm9kZU5hbWUgPT09IHJvb3QubmFtZSB8fCBub2RlTmFtZSA9PT0gcm9vdC51dWlkICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIHJvb3Q7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIHNlYXJjaCBpbnRvIHNrZWxldG9uIGJvbmVzLlxyXG5cdFx0aWYgKCByb290LnNrZWxldG9uICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYm9uZSA9IHJvb3Quc2tlbGV0b24uZ2V0Qm9uZUJ5TmFtZSggbm9kZU5hbWUgKTtcclxuXHJcblx0XHRcdGlmICggYm9uZSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gYm9uZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gc2VhcmNoIGludG8gbm9kZSBzdWJ0cmVlLlxyXG5cdFx0aWYgKCByb290LmNoaWxkcmVuICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgc2VhcmNoTm9kZVN1YnRyZWUgPSBmdW5jdGlvbiAoIGNoaWxkcmVuICkge1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgY2hpbGROb2RlID0gY2hpbGRyZW5bIGkgXTtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGNoaWxkTm9kZS5uYW1lID09PSBub2RlTmFtZSB8fCBjaGlsZE5vZGUudXVpZCA9PT0gbm9kZU5hbWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gY2hpbGROb2RlO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRjb25zdCByZXN1bHQgPSBzZWFyY2hOb2RlU3VidHJlZSggY2hpbGROb2RlLmNoaWxkcmVuICk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCByZXN1bHQgKSByZXR1cm4gcmVzdWx0O1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHJldHVybiBudWxsO1xyXG5cclxuXHRcdFx0fTtcclxuXHJcblx0XHRcdGNvbnN0IHN1YlRyZWVOb2RlID0gc2VhcmNoTm9kZVN1YnRyZWUoIHJvb3QuY2hpbGRyZW4gKTtcclxuXHJcblx0XHRcdGlmICggc3ViVHJlZU5vZGUgKSB7XHJcblxyXG5cdFx0XHRcdHJldHVybiBzdWJUcmVlTm9kZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gdGhlc2UgYXJlIHVzZWQgdG8gXCJiaW5kXCIgYSBub25leGlzdGVudCBwcm9wZXJ0eVxyXG5cdF9nZXRWYWx1ZV91bmF2YWlsYWJsZSgpIHt9XHJcblx0X3NldFZhbHVlX3VuYXZhaWxhYmxlKCkge31cclxuXHJcblx0Ly8gR2V0dGVyc1xyXG5cclxuXHRfZ2V0VmFsdWVfZGlyZWN0KCBidWZmZXIsIG9mZnNldCApIHtcclxuXHJcblx0XHRidWZmZXJbIG9mZnNldCBdID0gdGhpcy50YXJnZXRPYmplY3RbIHRoaXMucHJvcGVydHlOYW1lIF07XHJcblxyXG5cdH1cclxuXHJcblx0X2dldFZhbHVlX2FycmF5KCBidWZmZXIsIG9mZnNldCApIHtcclxuXHJcblx0XHRjb25zdCBzb3VyY2UgPSB0aGlzLnJlc29sdmVkUHJvcGVydHk7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBuID0gc291cmNlLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcclxuXHJcblx0XHRcdGJ1ZmZlclsgb2Zmc2V0ICsrIF0gPSBzb3VyY2VbIGkgXTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0X2dldFZhbHVlX2FycmF5RWxlbWVudCggYnVmZmVyLCBvZmZzZXQgKSB7XHJcblxyXG5cdFx0YnVmZmVyWyBvZmZzZXQgXSA9IHRoaXMucmVzb2x2ZWRQcm9wZXJ0eVsgdGhpcy5wcm9wZXJ0eUluZGV4IF07XHJcblxyXG5cdH1cclxuXHJcblx0X2dldFZhbHVlX3RvQXJyYXkoIGJ1ZmZlciwgb2Zmc2V0ICkge1xyXG5cclxuXHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eS50b0FycmF5KCBidWZmZXIsIG9mZnNldCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vIERpcmVjdFxyXG5cclxuXHRfc2V0VmFsdWVfZGlyZWN0KCBidWZmZXIsIG9mZnNldCApIHtcclxuXHJcblx0XHR0aGlzLnRhcmdldE9iamVjdFsgdGhpcy5wcm9wZXJ0eU5hbWUgXSA9IGJ1ZmZlclsgb2Zmc2V0IF07XHJcblxyXG5cdH1cclxuXHJcblx0X3NldFZhbHVlX2RpcmVjdF9zZXROZWVkc1VwZGF0ZSggYnVmZmVyLCBvZmZzZXQgKSB7XHJcblxyXG5cdFx0dGhpcy50YXJnZXRPYmplY3RbIHRoaXMucHJvcGVydHlOYW1lIF0gPSBidWZmZXJbIG9mZnNldCBdO1xyXG5cdFx0dGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdF9zZXRWYWx1ZV9kaXJlY3Rfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSggYnVmZmVyLCBvZmZzZXQgKSB7XHJcblxyXG5cdFx0dGhpcy50YXJnZXRPYmplY3RbIHRoaXMucHJvcGVydHlOYW1lIF0gPSBidWZmZXJbIG9mZnNldCBdO1xyXG5cdFx0dGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gRW50aXJlQXJyYXlcclxuXHJcblx0X3NldFZhbHVlX2FycmF5KCBidWZmZXIsIG9mZnNldCApIHtcclxuXHJcblx0XHRjb25zdCBkZXN0ID0gdGhpcy5yZXNvbHZlZFByb3BlcnR5O1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbiA9IGRlc3QubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xyXG5cclxuXHRcdFx0ZGVzdFsgaSBdID0gYnVmZmVyWyBvZmZzZXQgKysgXTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0X3NldFZhbHVlX2FycmF5X3NldE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHtcclxuXHJcblx0XHRjb25zdCBkZXN0ID0gdGhpcy5yZXNvbHZlZFByb3BlcnR5O1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbiA9IGRlc3QubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xyXG5cclxuXHRcdFx0ZGVzdFsgaSBdID0gYnVmZmVyWyBvZmZzZXQgKysgXTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdF9zZXRWYWx1ZV9hcnJheV9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHtcclxuXHJcblx0XHRjb25zdCBkZXN0ID0gdGhpcy5yZXNvbHZlZFByb3BlcnR5O1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbiA9IGRlc3QubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xyXG5cclxuXHRcdFx0ZGVzdFsgaSBdID0gYnVmZmVyWyBvZmZzZXQgKysgXTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gQXJyYXlFbGVtZW50XHJcblxyXG5cdF9zZXRWYWx1ZV9hcnJheUVsZW1lbnQoIGJ1ZmZlciwgb2Zmc2V0ICkge1xyXG5cclxuXHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eVsgdGhpcy5wcm9wZXJ0eUluZGV4IF0gPSBidWZmZXJbIG9mZnNldCBdO1xyXG5cclxuXHR9XHJcblxyXG5cdF9zZXRWYWx1ZV9hcnJheUVsZW1lbnRfc2V0TmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkge1xyXG5cclxuXHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eVsgdGhpcy5wcm9wZXJ0eUluZGV4IF0gPSBidWZmZXJbIG9mZnNldCBdO1xyXG5cdFx0dGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdF9zZXRWYWx1ZV9hcnJheUVsZW1lbnRfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSggYnVmZmVyLCBvZmZzZXQgKSB7XHJcblxyXG5cdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5WyB0aGlzLnByb3BlcnR5SW5kZXggXSA9IGJ1ZmZlclsgb2Zmc2V0IF07XHJcblx0XHR0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvLyBIYXNUb0Zyb21BcnJheVxyXG5cclxuXHRfc2V0VmFsdWVfZnJvbUFycmF5KCBidWZmZXIsIG9mZnNldCApIHtcclxuXHJcblx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHkuZnJvbUFycmF5KCBidWZmZXIsIG9mZnNldCApO1xyXG5cclxuXHR9XHJcblxyXG5cdF9zZXRWYWx1ZV9mcm9tQXJyYXlfc2V0TmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkge1xyXG5cclxuXHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eS5mcm9tQXJyYXkoIGJ1ZmZlciwgb2Zmc2V0ICk7XHJcblx0XHR0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0X3NldFZhbHVlX2Zyb21BcnJheV9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHtcclxuXHJcblx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHkuZnJvbUFycmF5KCBidWZmZXIsIG9mZnNldCApO1xyXG5cdFx0dGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0X2dldFZhbHVlX3VuYm91bmQoIHRhcmdldEFycmF5LCBvZmZzZXQgKSB7XHJcblxyXG5cdFx0dGhpcy5iaW5kKCk7XHJcblx0XHR0aGlzLmdldFZhbHVlKCB0YXJnZXRBcnJheSwgb2Zmc2V0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0X3NldFZhbHVlX3VuYm91bmQoIHNvdXJjZUFycmF5LCBvZmZzZXQgKSB7XHJcblxyXG5cdFx0dGhpcy5iaW5kKCk7XHJcblx0XHR0aGlzLnNldFZhbHVlKCBzb3VyY2VBcnJheSwgb2Zmc2V0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyBhIGdldHRlciAvIHNldHRlciBwYWlyIGZvciB0aGUgcHJvcGVydHkgdHJhY2tlZCBieSB0aGlzIGJpbmRpbmcuXHJcblx0ICovXHJcblx0YmluZCgpIHtcclxuXHJcblx0XHRsZXQgdGFyZ2V0T2JqZWN0ID0gdGhpcy5ub2RlO1xyXG5cdFx0Y29uc3QgcGFyc2VkUGF0aCA9IHRoaXMucGFyc2VkUGF0aDtcclxuXHJcblx0XHRjb25zdCBvYmplY3ROYW1lID0gcGFyc2VkUGF0aC5vYmplY3ROYW1lO1xyXG5cdFx0Y29uc3QgcHJvcGVydHlOYW1lID0gcGFyc2VkUGF0aC5wcm9wZXJ0eU5hbWU7XHJcblx0XHRsZXQgcHJvcGVydHlJbmRleCA9IHBhcnNlZFBhdGgucHJvcGVydHlJbmRleDtcclxuXHJcblx0XHRpZiAoICEgdGFyZ2V0T2JqZWN0ICkge1xyXG5cclxuXHRcdFx0dGFyZ2V0T2JqZWN0ID0gUHJvcGVydHlCaW5kaW5nLmZpbmROb2RlKCB0aGlzLnJvb3ROb2RlLCBwYXJzZWRQYXRoLm5vZGVOYW1lICk7XHJcblxyXG5cdFx0XHR0aGlzLm5vZGUgPSB0YXJnZXRPYmplY3Q7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIHNldCBmYWlsIHN0YXRlIHNvIHdlIGNhbiBqdXN0ICdyZXR1cm4nIG9uIGVycm9yXHJcblx0XHR0aGlzLmdldFZhbHVlID0gdGhpcy5fZ2V0VmFsdWVfdW5hdmFpbGFibGU7XHJcblx0XHR0aGlzLnNldFZhbHVlID0gdGhpcy5fc2V0VmFsdWVfdW5hdmFpbGFibGU7XHJcblxyXG5cdFx0Ly8gZW5zdXJlIHRoZXJlIGlzIGEgdmFsdWUgbm9kZVxyXG5cdFx0aWYgKCAhIHRhcmdldE9iamVjdCApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogTm8gdGFyZ2V0IG5vZGUgZm91bmQgZm9yIHRyYWNrOiAnICsgdGhpcy5wYXRoICsgJy4nICk7XHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBvYmplY3ROYW1lICkge1xyXG5cclxuXHRcdFx0bGV0IG9iamVjdEluZGV4ID0gcGFyc2VkUGF0aC5vYmplY3RJbmRleDtcclxuXHJcblx0XHRcdC8vIHNwZWNpYWwgY2FzZXMgd2VyZSB3ZSBuZWVkIHRvIHJlYWNoIGRlZXBlciBpbnRvIHRoZSBoaWVyYXJjaHkgdG8gZ2V0IHRoZSBmYWNlIG1hdGVyaWFscy4uLi5cclxuXHRcdFx0c3dpdGNoICggb2JqZWN0TmFtZSApIHtcclxuXHJcblx0XHRcdFx0Y2FzZSAnbWF0ZXJpYWxzJzpcclxuXHJcblx0XHRcdFx0XHRpZiAoICEgdGFyZ2V0T2JqZWN0Lm1hdGVyaWFsICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1hdGVyaWFsIGFzIG5vZGUgZG9lcyBub3QgaGF2ZSBhIG1hdGVyaWFsLicsIHRoaXMgKTtcclxuXHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRpZiAoICEgdGFyZ2V0T2JqZWN0Lm1hdGVyaWFsLm1hdGVyaWFscyApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtYXRlcmlhbC5tYXRlcmlhbHMgYXMgbm9kZS5tYXRlcmlhbCBkb2VzIG5vdCBoYXZlIGEgbWF0ZXJpYWxzIGFycmF5LicsIHRoaXMgKTtcclxuXHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR0YXJnZXRPYmplY3QgPSB0YXJnZXRPYmplY3QubWF0ZXJpYWwubWF0ZXJpYWxzO1xyXG5cclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRjYXNlICdib25lcyc6XHJcblxyXG5cdFx0XHRcdFx0aWYgKCAhIHRhcmdldE9iamVjdC5za2VsZXRvbiApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBib25lcyBhcyBub2RlIGRvZXMgbm90IGhhdmUgYSBza2VsZXRvbi4nLCB0aGlzICk7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Ly8gcG90ZW50aWFsIGZ1dHVyZSBvcHRpbWl6YXRpb246IHNraXAgdGhpcyBpZiBwcm9wZXJ0eUluZGV4IGlzIGFscmVhZHkgYW4gaW50ZWdlclxyXG5cdFx0XHRcdFx0Ly8gYW5kIGNvbnZlcnQgdGhlIGludGVnZXIgc3RyaW5nIHRvIGEgdHJ1ZSBpbnRlZ2VyLlxyXG5cclxuXHRcdFx0XHRcdHRhcmdldE9iamVjdCA9IHRhcmdldE9iamVjdC5za2VsZXRvbi5ib25lcztcclxuXHJcblx0XHRcdFx0XHQvLyBzdXBwb3J0IHJlc29sdmluZyBtb3JwaFRhcmdldCBuYW1lcyBpbnRvIGluZGljZXMuXHJcblx0XHRcdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB0YXJnZXRPYmplY3QubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCB0YXJnZXRPYmplY3RbIGkgXS5uYW1lID09PSBvYmplY3RJbmRleCApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0b2JqZWN0SW5kZXggPSBpO1xyXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0Y2FzZSAnbWFwJzpcclxuXHJcblx0XHRcdFx0XHRpZiAoICdtYXAnIGluIHRhcmdldE9iamVjdCApIHtcclxuXHJcblx0XHRcdFx0XHRcdHRhcmdldE9iamVjdCA9IHRhcmdldE9iamVjdC5tYXA7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRpZiAoICEgdGFyZ2V0T2JqZWN0Lm1hdGVyaWFsICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1hdGVyaWFsIGFzIG5vZGUgZG9lcyBub3QgaGF2ZSBhIG1hdGVyaWFsLicsIHRoaXMgKTtcclxuXHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRpZiAoICEgdGFyZ2V0T2JqZWN0Lm1hdGVyaWFsLm1hcCApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtYXRlcmlhbC5tYXAgYXMgbm9kZS5tYXRlcmlhbCBkb2VzIG5vdCBoYXZlIGEgbWFwLicsIHRoaXMgKTtcclxuXHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR0YXJnZXRPYmplY3QgPSB0YXJnZXRPYmplY3QubWF0ZXJpYWwubWFwO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdGRlZmF1bHQ6XHJcblxyXG5cdFx0XHRcdFx0aWYgKCB0YXJnZXRPYmplY3RbIG9iamVjdE5hbWUgXSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG9iamVjdE5hbWUgb2Ygbm9kZSB1bmRlZmluZWQuJywgdGhpcyApO1xyXG5cdFx0XHRcdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHRhcmdldE9iamVjdCA9IHRhcmdldE9iamVjdFsgb2JqZWN0TmFtZSBdO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHJcblx0XHRcdGlmICggb2JqZWN0SW5kZXggIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0aWYgKCB0YXJnZXRPYmplY3RbIG9iamVjdEluZGV4IF0gPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBUcnlpbmcgdG8gYmluZCB0byBvYmplY3RJbmRleCBvZiBvYmplY3ROYW1lLCBidXQgaXMgdW5kZWZpbmVkLicsIHRoaXMsIHRhcmdldE9iamVjdCApO1xyXG5cdFx0XHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHRhcmdldE9iamVjdCA9IHRhcmdldE9iamVjdFsgb2JqZWN0SW5kZXggXTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gcmVzb2x2ZSBwcm9wZXJ0eVxyXG5cdFx0Y29uc3Qgbm9kZVByb3BlcnR5ID0gdGFyZ2V0T2JqZWN0WyBwcm9wZXJ0eU5hbWUgXTtcclxuXHJcblx0XHRpZiAoIG5vZGVQcm9wZXJ0eSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgbm9kZU5hbWUgPSBwYXJzZWRQYXRoLm5vZGVOYW1lO1xyXG5cclxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogVHJ5aW5nIHRvIHVwZGF0ZSBwcm9wZXJ0eSBmb3IgdHJhY2s6ICcgKyBub2RlTmFtZSArXHJcblx0XHRcdFx0Jy4nICsgcHJvcGVydHlOYW1lICsgJyBidXQgaXQgd2FzblxcJ3QgZm91bmQuJywgdGFyZ2V0T2JqZWN0ICk7XHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gZGV0ZXJtaW5lIHZlcnNpb25pbmcgc2NoZW1lXHJcblx0XHRsZXQgdmVyc2lvbmluZyA9IHRoaXMuVmVyc2lvbmluZy5Ob25lO1xyXG5cclxuXHRcdHRoaXMudGFyZ2V0T2JqZWN0ID0gdGFyZ2V0T2JqZWN0O1xyXG5cclxuXHRcdGlmICggdGFyZ2V0T2JqZWN0LmlzTWF0ZXJpYWwgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHR2ZXJzaW9uaW5nID0gdGhpcy5WZXJzaW9uaW5nLk5lZWRzVXBkYXRlO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHRhcmdldE9iamVjdC5pc09iamVjdDNEID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0dmVyc2lvbmluZyA9IHRoaXMuVmVyc2lvbmluZy5NYXRyaXhXb3JsZE5lZWRzVXBkYXRlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBkZXRlcm1pbmUgaG93IHRoZSBwcm9wZXJ0eSBnZXRzIGJvdW5kXHJcblx0XHRsZXQgYmluZGluZ1R5cGUgPSB0aGlzLkJpbmRpbmdUeXBlLkRpcmVjdDtcclxuXHJcblx0XHRpZiAoIHByb3BlcnR5SW5kZXggIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdC8vIGFjY2VzcyBhIHN1YiBlbGVtZW50IG9mIHRoZSBwcm9wZXJ0eSBhcnJheSAob25seSBwcmltaXRpdmVzIGFyZSBzdXBwb3J0ZWQgcmlnaHQgbm93KVxyXG5cclxuXHRcdFx0aWYgKCBwcm9wZXJ0eU5hbWUgPT09ICdtb3JwaFRhcmdldEluZmx1ZW5jZXMnICkge1xyXG5cclxuXHRcdFx0XHQvLyBwb3RlbnRpYWwgb3B0aW1pemF0aW9uLCBza2lwIHRoaXMgaWYgcHJvcGVydHlJbmRleCBpcyBhbHJlYWR5IGFuIGludGVnZXIsIGFuZCBjb252ZXJ0IHRoZSBpbnRlZ2VyIHN0cmluZyB0byBhIHRydWUgaW50ZWdlci5cclxuXHJcblx0XHRcdFx0Ly8gc3VwcG9ydCByZXNvbHZpbmcgbW9ycGhUYXJnZXQgbmFtZXMgaW50byBpbmRpY2VzLlxyXG5cdFx0XHRcdGlmICggISB0YXJnZXRPYmplY3QuZ2VvbWV0cnkgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1vcnBoVGFyZ2V0SW5mbHVlbmNlcyBiZWNhdXNlIG5vZGUgZG9lcyBub3QgaGF2ZSBhIGdlb21ldHJ5LicsIHRoaXMgKTtcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoICEgdGFyZ2V0T2JqZWN0Lmdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcyApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbW9ycGhUYXJnZXRJbmZsdWVuY2VzIGJlY2F1c2Ugbm9kZSBkb2VzIG5vdCBoYXZlIGEgZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLicsIHRoaXMgKTtcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoIHRhcmdldE9iamVjdC5tb3JwaFRhcmdldERpY3Rpb25hcnlbIHByb3BlcnR5SW5kZXggXSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdHByb3BlcnR5SW5kZXggPSB0YXJnZXRPYmplY3QubW9ycGhUYXJnZXREaWN0aW9uYXJ5WyBwcm9wZXJ0eUluZGV4IF07XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGJpbmRpbmdUeXBlID0gdGhpcy5CaW5kaW5nVHlwZS5BcnJheUVsZW1lbnQ7XHJcblxyXG5cdFx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHkgPSBub2RlUHJvcGVydHk7XHJcblx0XHRcdHRoaXMucHJvcGVydHlJbmRleCA9IHByb3BlcnR5SW5kZXg7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggbm9kZVByb3BlcnR5LmZyb21BcnJheSAhPT0gdW5kZWZpbmVkICYmIG5vZGVQcm9wZXJ0eS50b0FycmF5ICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHQvLyBtdXN0IHVzZSBjb3B5IGZvciBPYmplY3QzRC5FdWxlci9RdWF0ZXJuaW9uXHJcblxyXG5cdFx0XHRiaW5kaW5nVHlwZSA9IHRoaXMuQmluZGluZ1R5cGUuSGFzRnJvbVRvQXJyYXk7XHJcblxyXG5cdFx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHkgPSBub2RlUHJvcGVydHk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggQXJyYXkuaXNBcnJheSggbm9kZVByb3BlcnR5ICkgKSB7XHJcblxyXG5cdFx0XHRiaW5kaW5nVHlwZSA9IHRoaXMuQmluZGluZ1R5cGUuRW50aXJlQXJyYXk7XHJcblxyXG5cdFx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHkgPSBub2RlUHJvcGVydHk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHRoaXMucHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBzZWxlY3QgZ2V0dGVyIC8gc2V0dGVyXHJcblx0XHR0aGlzLmdldFZhbHVlID0gdGhpcy5HZXR0ZXJCeUJpbmRpbmdUeXBlWyBiaW5kaW5nVHlwZSBdO1xyXG5cdFx0dGhpcy5zZXRWYWx1ZSA9IHRoaXMuU2V0dGVyQnlCaW5kaW5nVHlwZUFuZFZlcnNpb25pbmdbIGJpbmRpbmdUeXBlIF1bIHZlcnNpb25pbmcgXTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVbmJpbmRzIHRoZSBwcm9wZXJ0eS5cclxuXHQgKi9cclxuXHR1bmJpbmQoKSB7XHJcblxyXG5cdFx0dGhpcy5ub2RlID0gbnVsbDtcclxuXHJcblx0XHQvLyBiYWNrIHRvIHRoZSBwcm90b3R5cGUgdmVyc2lvbiBvZiBnZXRWYWx1ZSAvIHNldFZhbHVlXHJcblx0XHQvLyBub3RlOiBhdm9pZGluZyB0byBtdXRhdGUgdGhlIHNoYXBlIG9mICd0aGlzJyB2aWEgJ2RlbGV0ZSdcclxuXHRcdHRoaXMuZ2V0VmFsdWUgPSB0aGlzLl9nZXRWYWx1ZV91bmJvdW5kO1xyXG5cdFx0dGhpcy5zZXRWYWx1ZSA9IHRoaXMuX3NldFZhbHVlX3VuYm91bmQ7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblByb3BlcnR5QmluZGluZy5Db21wb3NpdGUgPSBDb21wb3NpdGU7XHJcblxyXG5Qcm9wZXJ0eUJpbmRpbmcucHJvdG90eXBlLkJpbmRpbmdUeXBlID0ge1xyXG5cdERpcmVjdDogMCxcclxuXHRFbnRpcmVBcnJheTogMSxcclxuXHRBcnJheUVsZW1lbnQ6IDIsXHJcblx0SGFzRnJvbVRvQXJyYXk6IDNcclxufTtcclxuXHJcblByb3BlcnR5QmluZGluZy5wcm90b3R5cGUuVmVyc2lvbmluZyA9IHtcclxuXHROb25lOiAwLFxyXG5cdE5lZWRzVXBkYXRlOiAxLFxyXG5cdE1hdHJpeFdvcmxkTmVlZHNVcGRhdGU6IDJcclxufTtcclxuXHJcblByb3BlcnR5QmluZGluZy5wcm90b3R5cGUuR2V0dGVyQnlCaW5kaW5nVHlwZSA9IFtcclxuXHJcblx0UHJvcGVydHlCaW5kaW5nLnByb3RvdHlwZS5fZ2V0VmFsdWVfZGlyZWN0LFxyXG5cdFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUuX2dldFZhbHVlX2FycmF5LFxyXG5cdFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUuX2dldFZhbHVlX2FycmF5RWxlbWVudCxcclxuXHRQcm9wZXJ0eUJpbmRpbmcucHJvdG90eXBlLl9nZXRWYWx1ZV90b0FycmF5LFxyXG5cclxuXTtcclxuXHJcblByb3BlcnR5QmluZGluZy5wcm90b3R5cGUuU2V0dGVyQnlCaW5kaW5nVHlwZUFuZFZlcnNpb25pbmcgPSBbXHJcblxyXG5cdFtcclxuXHRcdC8vIERpcmVjdFxyXG5cdFx0UHJvcGVydHlCaW5kaW5nLnByb3RvdHlwZS5fc2V0VmFsdWVfZGlyZWN0LFxyXG5cdFx0UHJvcGVydHlCaW5kaW5nLnByb3RvdHlwZS5fc2V0VmFsdWVfZGlyZWN0X3NldE5lZWRzVXBkYXRlLFxyXG5cdFx0UHJvcGVydHlCaW5kaW5nLnByb3RvdHlwZS5fc2V0VmFsdWVfZGlyZWN0X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGUsXHJcblxyXG5cdF0sIFtcclxuXHJcblx0XHQvLyBFbnRpcmVBcnJheVxyXG5cclxuXHRcdFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUuX3NldFZhbHVlX2FycmF5LFxyXG5cdFx0UHJvcGVydHlCaW5kaW5nLnByb3RvdHlwZS5fc2V0VmFsdWVfYXJyYXlfc2V0TmVlZHNVcGRhdGUsXHJcblx0XHRQcm9wZXJ0eUJpbmRpbmcucHJvdG90eXBlLl9zZXRWYWx1ZV9hcnJheV9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlLFxyXG5cclxuXHRdLCBbXHJcblxyXG5cdFx0Ly8gQXJyYXlFbGVtZW50XHJcblx0XHRQcm9wZXJ0eUJpbmRpbmcucHJvdG90eXBlLl9zZXRWYWx1ZV9hcnJheUVsZW1lbnQsXHJcblx0XHRQcm9wZXJ0eUJpbmRpbmcucHJvdG90eXBlLl9zZXRWYWx1ZV9hcnJheUVsZW1lbnRfc2V0TmVlZHNVcGRhdGUsXHJcblx0XHRQcm9wZXJ0eUJpbmRpbmcucHJvdG90eXBlLl9zZXRWYWx1ZV9hcnJheUVsZW1lbnRfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSxcclxuXHJcblx0XSwgW1xyXG5cclxuXHRcdC8vIEhhc1RvRnJvbUFycmF5XHJcblx0XHRQcm9wZXJ0eUJpbmRpbmcucHJvdG90eXBlLl9zZXRWYWx1ZV9mcm9tQXJyYXksXHJcblx0XHRQcm9wZXJ0eUJpbmRpbmcucHJvdG90eXBlLl9zZXRWYWx1ZV9mcm9tQXJyYXlfc2V0TmVlZHNVcGRhdGUsXHJcblx0XHRQcm9wZXJ0eUJpbmRpbmcucHJvdG90eXBlLl9zZXRWYWx1ZV9mcm9tQXJyYXlfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSxcclxuXHJcblx0XVxyXG5cclxuXTtcclxuXHJcblxyXG5leHBvcnQgeyBQcm9wZXJ0eUJpbmRpbmcgfTtcclxuIiwiaW1wb3J0IHsgUHJvcGVydHlCaW5kaW5nIH0gZnJvbSAnLi9Qcm9wZXJ0eUJpbmRpbmcuanMnO1xyXG5pbXBvcnQgeyBnZW5lcmF0ZVVVSUQgfSBmcm9tICcuLi9tYXRoL01hdGhVdGlscy5qcyc7XHJcblxyXG4vKipcclxuICogQSBncm91cCBvZiBvYmplY3RzIHRoYXQgcmVjZWl2ZXMgYSBzaGFyZWQgYW5pbWF0aW9uIHN0YXRlLlxyXG4gKlxyXG4gKiBVc2FnZTpcclxuICpcclxuICogLSBBZGQgb2JqZWN0cyB5b3Ugd291bGQgb3RoZXJ3aXNlIHBhc3MgYXMgJ3Jvb3QnIHRvIHRoZVxyXG4gKiBjb25zdHJ1Y3RvciBvciB0aGUgLmNsaXBBY3Rpb24gbWV0aG9kIG9mIEFuaW1hdGlvbk1peGVyLlxyXG4gKiAtIEluc3RlYWQgcGFzcyB0aGlzIG9iamVjdCBhcyAncm9vdCcuXHJcbiAqIC0gWW91IGNhbiBhbHNvIGFkZCBhbmQgcmVtb3ZlIG9iamVjdHMgbGF0ZXIgd2hlbiB0aGUgbWl4ZXIgaXMgcnVubmluZy5cclxuICpcclxuICogTm90ZTpcclxuICpcclxuICogLSBPYmplY3RzIG9mIHRoaXMgY2xhc3MgYXBwZWFyIGFzIG9uZSBvYmplY3QgdG8gdGhlIG1peGVyLFxyXG4gKiBzbyBjYWNoZSBjb250cm9sIG9mIHRoZSBpbmRpdmlkdWFsIG9iamVjdHMgbXVzdCBiZSBkb25lIG9uIHRoZSBncm91cC5cclxuICpcclxuICogTGltaXRhdGlvbjpcclxuICpcclxuICogLSBUaGUgYW5pbWF0ZWQgcHJvcGVydGllcyBtdXN0IGJlIGNvbXBhdGlibGUgYW1vbmcgdGhlIGFsbCBvYmplY3RzIGluIHRoZSBncm91cC5cclxuICogLSBBIHNpbmdsZSBwcm9wZXJ0eSBjYW4gZWl0aGVyIGJlIGNvbnRyb2xsZWQgdGhyb3VnaCBhIHRhcmdldCBncm91cCBvciBkaXJlY3RseSwgYnV0IG5vdCBib3RoLlxyXG4gKi9cclxuY2xhc3MgQW5pbWF0aW9uT2JqZWN0R3JvdXAge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGFuaW1hdGlvbiBncm91cC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Li4uT2JqZWN0M0R9IGFyZ3VtZW50cyAtIEFuIGFyYml0cmFyeSBudW1iZXIgb2YgM0Qgb2JqZWN0cyB0aGF0IHNoYXJlIHRoZSBzYW1lIGFuaW1hdGlvbiBzdGF0ZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNBbmltYXRpb25PYmplY3RHcm91cCA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgVVVJRCBvZiB0aGUgM0Qgb2JqZWN0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51dWlkID0gZ2VuZXJhdGVVVUlEKCk7XHJcblxyXG5cdFx0Ly8gY2FjaGVkIG9iamVjdHMgZm9sbG93ZWQgYnkgdGhlIGFjdGl2ZSBvbmVzXHJcblx0XHR0aGlzLl9vYmplY3RzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGFyZ3VtZW50cyApO1xyXG5cclxuXHRcdHRoaXMubkNhY2hlZE9iamVjdHNfID0gMDsgLy8gdGhyZXNob2xkXHJcblx0XHQvLyBub3RlOiByZWFkIGJ5IFByb3BlcnR5QmluZGluZy5Db21wb3NpdGVcclxuXHJcblx0XHRjb25zdCBpbmRpY2VzID0ge307XHJcblx0XHR0aGlzLl9pbmRpY2VzQnlVVUlEID0gaW5kaWNlczsgLy8gZm9yIGJvb2trZWVwaW5nXHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcclxuXHJcblx0XHRcdGluZGljZXNbIGFyZ3VtZW50c1sgaSBdLnV1aWQgXSA9IGk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuX3BhdGhzID0gW107IC8vIGluc2lkZTogc3RyaW5nXHJcblx0XHR0aGlzLl9wYXJzZWRQYXRocyA9IFtdOyAvLyBpbnNpZGU6IHsgd2UgZG9uJ3QgY2FyZSwgaGVyZSB9XHJcblx0XHR0aGlzLl9iaW5kaW5ncyA9IFtdOyAvLyBpbnNpZGU6IEFycmF5PCBQcm9wZXJ0eUJpbmRpbmcgPlxyXG5cdFx0dGhpcy5fYmluZGluZ3NJbmRpY2VzQnlQYXRoID0ge307IC8vIGluc2lkZTogaW5kaWNlcyBpbiB0aGVzZSBhcnJheXNcclxuXHJcblx0XHRjb25zdCBzY29wZSA9IHRoaXM7XHJcblxyXG5cdFx0dGhpcy5zdGF0cyA9IHtcclxuXHJcblx0XHRcdG9iamVjdHM6IHtcclxuXHRcdFx0XHRnZXQgdG90YWwoKSB7XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIHNjb3BlLl9vYmplY3RzLmxlbmd0aDtcclxuXHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHRnZXQgaW5Vc2UoKSB7XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMudG90YWwgLSBzY29wZS5uQ2FjaGVkT2JqZWN0c187XHJcblxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSxcclxuXHRcdFx0Z2V0IGJpbmRpbmdzUGVyT2JqZWN0KCkge1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gc2NvcGUuX2JpbmRpbmdzLmxlbmd0aDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBvYmplY3RzIHRvIHRoaXMgYW5pbWF0aW9uIGdyb3VwLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHsuLi5PYmplY3QzRH0gYXJndW1lbnRzIC0gVGhlIDNEIG9iamVjdHMgdG8gYWRkLlxyXG5cdCAqL1xyXG5cdGFkZCgpIHtcclxuXHJcblx0XHRjb25zdCBvYmplY3RzID0gdGhpcy5fb2JqZWN0cyxcclxuXHRcdFx0aW5kaWNlc0J5VVVJRCA9IHRoaXMuX2luZGljZXNCeVVVSUQsXHJcblx0XHRcdHBhdGhzID0gdGhpcy5fcGF0aHMsXHJcblx0XHRcdHBhcnNlZFBhdGhzID0gdGhpcy5fcGFyc2VkUGF0aHMsXHJcblx0XHRcdGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsXHJcblx0XHRcdG5CaW5kaW5ncyA9IGJpbmRpbmdzLmxlbmd0aDtcclxuXHJcblx0XHRsZXQga25vd25PYmplY3QgPSB1bmRlZmluZWQsXHJcblx0XHRcdG5PYmplY3RzID0gb2JqZWN0cy5sZW5ndGgsXHJcblx0XHRcdG5DYWNoZWRPYmplY3RzID0gdGhpcy5uQ2FjaGVkT2JqZWN0c187XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcclxuXHJcblx0XHRcdGNvbnN0IG9iamVjdCA9IGFyZ3VtZW50c1sgaSBdLFxyXG5cdFx0XHRcdHV1aWQgPSBvYmplY3QudXVpZDtcclxuXHRcdFx0bGV0IGluZGV4ID0gaW5kaWNlc0J5VVVJRFsgdXVpZCBdO1xyXG5cclxuXHRcdFx0aWYgKCBpbmRleCA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHQvLyB1bmtub3duIG9iamVjdCAtPiBhZGQgaXQgdG8gdGhlIEFDVElWRSByZWdpb25cclxuXHJcblx0XHRcdFx0aW5kZXggPSBuT2JqZWN0cyArKztcclxuXHRcdFx0XHRpbmRpY2VzQnlVVUlEWyB1dWlkIF0gPSBpbmRleDtcclxuXHRcdFx0XHRvYmplY3RzLnB1c2goIG9iamVjdCApO1xyXG5cclxuXHRcdFx0XHQvLyBhY2NvdW50aW5nIGlzIGRvbmUsIG5vdyBkbyB0aGUgc2FtZSBmb3IgYWxsIGJpbmRpbmdzXHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBqID0gMCwgbSA9IG5CaW5kaW5nczsgaiAhPT0gbTsgKysgaiApIHtcclxuXHJcblx0XHRcdFx0XHRiaW5kaW5nc1sgaiBdLnB1c2goIG5ldyBQcm9wZXJ0eUJpbmRpbmcoIG9iamVjdCwgcGF0aHNbIGogXSwgcGFyc2VkUGF0aHNbIGogXSApICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGluZGV4IDwgbkNhY2hlZE9iamVjdHMgKSB7XHJcblxyXG5cdFx0XHRcdGtub3duT2JqZWN0ID0gb2JqZWN0c1sgaW5kZXggXTtcclxuXHJcblx0XHRcdFx0Ly8gbW92ZSBleGlzdGluZyBvYmplY3QgdG8gdGhlIEFDVElWRSByZWdpb25cclxuXHJcblx0XHRcdFx0Y29uc3QgZmlyc3RBY3RpdmVJbmRleCA9IC0tIG5DYWNoZWRPYmplY3RzLFxyXG5cdFx0XHRcdFx0bGFzdENhY2hlZE9iamVjdCA9IG9iamVjdHNbIGZpcnN0QWN0aXZlSW5kZXggXTtcclxuXHJcblx0XHRcdFx0aW5kaWNlc0J5VVVJRFsgbGFzdENhY2hlZE9iamVjdC51dWlkIF0gPSBpbmRleDtcclxuXHRcdFx0XHRvYmplY3RzWyBpbmRleCBdID0gbGFzdENhY2hlZE9iamVjdDtcclxuXHJcblx0XHRcdFx0aW5kaWNlc0J5VVVJRFsgdXVpZCBdID0gZmlyc3RBY3RpdmVJbmRleDtcclxuXHRcdFx0XHRvYmplY3RzWyBmaXJzdEFjdGl2ZUluZGV4IF0gPSBvYmplY3Q7XHJcblxyXG5cdFx0XHRcdC8vIGFjY291bnRpbmcgaXMgZG9uZSwgbm93IGRvIHRoZSBzYW1lIGZvciBhbGwgYmluZGluZ3NcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGogPSAwLCBtID0gbkJpbmRpbmdzOyBqICE9PSBtOyArKyBqICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGJpbmRpbmdzRm9yUGF0aCA9IGJpbmRpbmdzWyBqIF0sXHJcblx0XHRcdFx0XHRcdGxhc3RDYWNoZWQgPSBiaW5kaW5nc0ZvclBhdGhbIGZpcnN0QWN0aXZlSW5kZXggXTtcclxuXHJcblx0XHRcdFx0XHRsZXQgYmluZGluZyA9IGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXTtcclxuXHJcblx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGhbIGluZGV4IF0gPSBsYXN0Q2FjaGVkO1xyXG5cclxuXHRcdFx0XHRcdGlmICggYmluZGluZyA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Ly8gc2luY2Ugd2UgZG8gbm90IGJvdGhlciB0byBjcmVhdGUgbmV3IGJpbmRpbmdzXHJcblx0XHRcdFx0XHRcdC8vIGZvciBvYmplY3RzIHRoYXQgYXJlIGNhY2hlZCwgdGhlIGJpbmRpbmcgbWF5XHJcblx0XHRcdFx0XHRcdC8vIG9yIG1heSBub3QgZXhpc3RcclxuXHJcblx0XHRcdFx0XHRcdGJpbmRpbmcgPSBuZXcgUHJvcGVydHlCaW5kaW5nKCBvYmplY3QsIHBhdGhzWyBqIF0sIHBhcnNlZFBhdGhzWyBqIF0gKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0YmluZGluZ3NGb3JQYXRoWyBmaXJzdEFjdGl2ZUluZGV4IF0gPSBiaW5kaW5nO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBvYmplY3RzWyBpbmRleCBdICE9PSBrbm93bk9iamVjdCApIHtcclxuXHJcblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkFuaW1hdGlvbk9iamVjdEdyb3VwOiBEaWZmZXJlbnQgb2JqZWN0cyB3aXRoIHRoZSBzYW1lIFVVSUQgJyArXHJcblx0XHRcdFx0XHQnZGV0ZWN0ZWQuIENsZWFuIHRoZSBjYWNoZXMgb3IgcmVjcmVhdGUgeW91ciBpbmZyYXN0cnVjdHVyZSB3aGVuIHJlbG9hZGluZyBzY2VuZXMuJyApO1xyXG5cclxuXHRcdFx0fSAvLyBlbHNlIHRoZSBvYmplY3QgaXMgYWxyZWFkeSB3aGVyZSB3ZSB3YW50IGl0IHRvIGJlXHJcblxyXG5cdFx0fSAvLyBmb3IgYXJndW1lbnRzXHJcblxyXG5cdFx0dGhpcy5uQ2FjaGVkT2JqZWN0c18gPSBuQ2FjaGVkT2JqZWN0cztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW1vdmVzIGFuIGFyYml0cmFyeSBudW1iZXIgb2Ygb2JqZWN0cyB0byB0aGlzIGFuaW1hdGlvbiBncm91cFxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHsuLi5PYmplY3QzRH0gYXJndW1lbnRzIC0gVGhlIDNEIG9iamVjdHMgdG8gcmVtb3ZlLlxyXG5cdCAqL1xyXG5cdHJlbW92ZSgpIHtcclxuXHJcblx0XHRjb25zdCBvYmplY3RzID0gdGhpcy5fb2JqZWN0cyxcclxuXHRcdFx0aW5kaWNlc0J5VVVJRCA9IHRoaXMuX2luZGljZXNCeVVVSUQsXHJcblx0XHRcdGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsXHJcblx0XHRcdG5CaW5kaW5ncyA9IGJpbmRpbmdzLmxlbmd0aDtcclxuXHJcblx0XHRsZXQgbkNhY2hlZE9iamVjdHMgPSB0aGlzLm5DYWNoZWRPYmplY3RzXztcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgb2JqZWN0ID0gYXJndW1lbnRzWyBpIF0sXHJcblx0XHRcdFx0dXVpZCA9IG9iamVjdC51dWlkLFxyXG5cdFx0XHRcdGluZGV4ID0gaW5kaWNlc0J5VVVJRFsgdXVpZCBdO1xyXG5cclxuXHRcdFx0aWYgKCBpbmRleCAhPT0gdW5kZWZpbmVkICYmIGluZGV4ID49IG5DYWNoZWRPYmplY3RzICkge1xyXG5cclxuXHRcdFx0XHQvLyBtb3ZlIGV4aXN0aW5nIG9iamVjdCBpbnRvIHRoZSBDQUNIRUQgcmVnaW9uXHJcblxyXG5cdFx0XHRcdGNvbnN0IGxhc3RDYWNoZWRJbmRleCA9IG5DYWNoZWRPYmplY3RzICsrLFxyXG5cdFx0XHRcdFx0Zmlyc3RBY3RpdmVPYmplY3QgPSBvYmplY3RzWyBsYXN0Q2FjaGVkSW5kZXggXTtcclxuXHJcblx0XHRcdFx0aW5kaWNlc0J5VVVJRFsgZmlyc3RBY3RpdmVPYmplY3QudXVpZCBdID0gaW5kZXg7XHJcblx0XHRcdFx0b2JqZWN0c1sgaW5kZXggXSA9IGZpcnN0QWN0aXZlT2JqZWN0O1xyXG5cclxuXHRcdFx0XHRpbmRpY2VzQnlVVUlEWyB1dWlkIF0gPSBsYXN0Q2FjaGVkSW5kZXg7XHJcblx0XHRcdFx0b2JqZWN0c1sgbGFzdENhY2hlZEluZGV4IF0gPSBvYmplY3Q7XHJcblxyXG5cdFx0XHRcdC8vIGFjY291bnRpbmcgaXMgZG9uZSwgbm93IGRvIHRoZSBzYW1lIGZvciBhbGwgYmluZGluZ3NcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGogPSAwLCBtID0gbkJpbmRpbmdzOyBqICE9PSBtOyArKyBqICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGJpbmRpbmdzRm9yUGF0aCA9IGJpbmRpbmdzWyBqIF0sXHJcblx0XHRcdFx0XHRcdGZpcnN0QWN0aXZlID0gYmluZGluZ3NGb3JQYXRoWyBsYXN0Q2FjaGVkSW5kZXggXSxcclxuXHRcdFx0XHRcdFx0YmluZGluZyA9IGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXTtcclxuXHJcblx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGhbIGluZGV4IF0gPSBmaXJzdEFjdGl2ZTtcclxuXHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgbGFzdENhY2hlZEluZGV4IF0gPSBiaW5kaW5nO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSAvLyBmb3IgYXJndW1lbnRzXHJcblxyXG5cdFx0dGhpcy5uQ2FjaGVkT2JqZWN0c18gPSBuQ2FjaGVkT2JqZWN0cztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWFsbG9jYXRlcyBhbGwgbWVtb3J5IHJlc291cmNlcyBmb3IgdGhlIHBhc3NlZCAzRCBvYmplY3RzIG9mIHRoaXMgYW5pbWF0aW9uIGdyb3VwLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHsuLi5PYmplY3QzRH0gYXJndW1lbnRzIC0gVGhlIDNEIG9iamVjdHMgdG8gdW5jYWNoZS5cclxuXHQgKi9cclxuXHR1bmNhY2hlKCkge1xyXG5cclxuXHRcdGNvbnN0IG9iamVjdHMgPSB0aGlzLl9vYmplY3RzLFxyXG5cdFx0XHRpbmRpY2VzQnlVVUlEID0gdGhpcy5faW5kaWNlc0J5VVVJRCxcclxuXHRcdFx0YmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncyxcclxuXHRcdFx0bkJpbmRpbmdzID0gYmluZGluZ3MubGVuZ3RoO1xyXG5cclxuXHRcdGxldCBuQ2FjaGVkT2JqZWN0cyA9IHRoaXMubkNhY2hlZE9iamVjdHNfLFxyXG5cdFx0XHRuT2JqZWN0cyA9IG9iamVjdHMubGVuZ3RoO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBvYmplY3QgPSBhcmd1bWVudHNbIGkgXSxcclxuXHRcdFx0XHR1dWlkID0gb2JqZWN0LnV1aWQsXHJcblx0XHRcdFx0aW5kZXggPSBpbmRpY2VzQnlVVUlEWyB1dWlkIF07XHJcblxyXG5cdFx0XHRpZiAoIGluZGV4ICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGRlbGV0ZSBpbmRpY2VzQnlVVUlEWyB1dWlkIF07XHJcblxyXG5cdFx0XHRcdGlmICggaW5kZXggPCBuQ2FjaGVkT2JqZWN0cyApIHtcclxuXHJcblx0XHRcdFx0XHQvLyBvYmplY3QgaXMgY2FjaGVkLCBzaHJpbmsgdGhlIENBQ0hFRCByZWdpb25cclxuXHJcblx0XHRcdFx0XHRjb25zdCBmaXJzdEFjdGl2ZUluZGV4ID0gLS0gbkNhY2hlZE9iamVjdHMsXHJcblx0XHRcdFx0XHRcdGxhc3RDYWNoZWRPYmplY3QgPSBvYmplY3RzWyBmaXJzdEFjdGl2ZUluZGV4IF0sXHJcblx0XHRcdFx0XHRcdGxhc3RJbmRleCA9IC0tIG5PYmplY3RzLFxyXG5cdFx0XHRcdFx0XHRsYXN0T2JqZWN0ID0gb2JqZWN0c1sgbGFzdEluZGV4IF07XHJcblxyXG5cdFx0XHRcdFx0Ly8gbGFzdCBjYWNoZWQgb2JqZWN0IHRha2VzIHRoaXMgb2JqZWN0J3MgcGxhY2VcclxuXHRcdFx0XHRcdGluZGljZXNCeVVVSURbIGxhc3RDYWNoZWRPYmplY3QudXVpZCBdID0gaW5kZXg7XHJcblx0XHRcdFx0XHRvYmplY3RzWyBpbmRleCBdID0gbGFzdENhY2hlZE9iamVjdDtcclxuXHJcblx0XHRcdFx0XHQvLyBsYXN0IG9iamVjdCBnb2VzIHRvIHRoZSBhY3RpdmF0ZWQgc2xvdCBhbmQgcG9wXHJcblx0XHRcdFx0XHRpbmRpY2VzQnlVVUlEWyBsYXN0T2JqZWN0LnV1aWQgXSA9IGZpcnN0QWN0aXZlSW5kZXg7XHJcblx0XHRcdFx0XHRvYmplY3RzWyBmaXJzdEFjdGl2ZUluZGV4IF0gPSBsYXN0T2JqZWN0O1xyXG5cdFx0XHRcdFx0b2JqZWN0cy5wb3AoKTtcclxuXHJcblx0XHRcdFx0XHQvLyBhY2NvdW50aW5nIGlzIGRvbmUsIG5vdyBkbyB0aGUgc2FtZSBmb3IgYWxsIGJpbmRpbmdzXHJcblxyXG5cdFx0XHRcdFx0Zm9yICggbGV0IGogPSAwLCBtID0gbkJpbmRpbmdzOyBqICE9PSBtOyArKyBqICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgYmluZGluZ3NGb3JQYXRoID0gYmluZGluZ3NbIGogXSxcclxuXHRcdFx0XHRcdFx0XHRsYXN0Q2FjaGVkID0gYmluZGluZ3NGb3JQYXRoWyBmaXJzdEFjdGl2ZUluZGV4IF0sXHJcblx0XHRcdFx0XHRcdFx0bGFzdCA9IGJpbmRpbmdzRm9yUGF0aFsgbGFzdEluZGV4IF07XHJcblxyXG5cdFx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGhbIGluZGV4IF0gPSBsYXN0Q2FjaGVkO1xyXG5cdFx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGhbIGZpcnN0QWN0aXZlSW5kZXggXSA9IGxhc3Q7XHJcblx0XHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aC5wb3AoKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gb2JqZWN0IGlzIGFjdGl2ZSwganVzdCBzd2FwIHdpdGggdGhlIGxhc3QgYW5kIHBvcFxyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGxhc3RJbmRleCA9IC0tIG5PYmplY3RzLFxyXG5cdFx0XHRcdFx0XHRsYXN0T2JqZWN0ID0gb2JqZWN0c1sgbGFzdEluZGV4IF07XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBsYXN0SW5kZXggPiAwICkge1xyXG5cclxuXHRcdFx0XHRcdFx0aW5kaWNlc0J5VVVJRFsgbGFzdE9iamVjdC51dWlkIF0gPSBpbmRleDtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0b2JqZWN0c1sgaW5kZXggXSA9IGxhc3RPYmplY3Q7XHJcblx0XHRcdFx0XHRvYmplY3RzLnBvcCgpO1xyXG5cclxuXHRcdFx0XHRcdC8vIGFjY291bnRpbmcgaXMgZG9uZSwgbm93IGRvIHRoZSBzYW1lIGZvciBhbGwgYmluZGluZ3NcclxuXHJcblx0XHRcdFx0XHRmb3IgKCBsZXQgaiA9IDAsIG0gPSBuQmluZGluZ3M7IGogIT09IG07ICsrIGogKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCBiaW5kaW5nc0ZvclBhdGggPSBiaW5kaW5nc1sgaiBdO1xyXG5cclxuXHRcdFx0XHRcdFx0YmluZGluZ3NGb3JQYXRoWyBpbmRleCBdID0gYmluZGluZ3NGb3JQYXRoWyBsYXN0SW5kZXggXTtcclxuXHRcdFx0XHRcdFx0YmluZGluZ3NGb3JQYXRoLnBvcCgpO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fSAvLyBjYWNoZWQgb3IgYWN0aXZlXHJcblxyXG5cdFx0XHR9IC8vIGlmIG9iamVjdCBpcyBrbm93blxyXG5cclxuXHRcdH0gLy8gZm9yIGFyZ3VtZW50c1xyXG5cclxuXHRcdHRoaXMubkNhY2hlZE9iamVjdHNfID0gbkNhY2hlZE9iamVjdHM7XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gSW50ZXJuYWwgaW50ZXJmYWNlIHVzZWQgYnkgYmVmcmllbmRlZCBQcm9wZXJ0eUJpbmRpbmcuQ29tcG9zaXRlOlxyXG5cclxuXHRzdWJzY3JpYmVfKCBwYXRoLCBwYXJzZWRQYXRoICkge1xyXG5cclxuXHRcdC8vIHJldHVybnMgYW4gYXJyYXkgb2YgYmluZGluZ3MgZm9yIHRoZSBnaXZlbiBwYXRoIHRoYXQgaXMgY2hhbmdlZFxyXG5cdFx0Ly8gYWNjb3JkaW5nIHRvIHRoZSBjb250YWluZWQgb2JqZWN0cyBpbiB0aGUgZ3JvdXBcclxuXHJcblx0XHRjb25zdCBpbmRpY2VzQnlQYXRoID0gdGhpcy5fYmluZGluZ3NJbmRpY2VzQnlQYXRoO1xyXG5cdFx0bGV0IGluZGV4ID0gaW5kaWNlc0J5UGF0aFsgcGF0aCBdO1xyXG5cdFx0Y29uc3QgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncztcclxuXHJcblx0XHRpZiAoIGluZGV4ICE9PSB1bmRlZmluZWQgKSByZXR1cm4gYmluZGluZ3NbIGluZGV4IF07XHJcblxyXG5cdFx0Y29uc3QgcGF0aHMgPSB0aGlzLl9wYXRocyxcclxuXHRcdFx0cGFyc2VkUGF0aHMgPSB0aGlzLl9wYXJzZWRQYXRocyxcclxuXHRcdFx0b2JqZWN0cyA9IHRoaXMuX29iamVjdHMsXHJcblx0XHRcdG5PYmplY3RzID0gb2JqZWN0cy5sZW5ndGgsXHJcblx0XHRcdG5DYWNoZWRPYmplY3RzID0gdGhpcy5uQ2FjaGVkT2JqZWN0c18sXHJcblx0XHRcdGJpbmRpbmdzRm9yUGF0aCA9IG5ldyBBcnJheSggbk9iamVjdHMgKTtcclxuXHJcblx0XHRpbmRleCA9IGJpbmRpbmdzLmxlbmd0aDtcclxuXHJcblx0XHRpbmRpY2VzQnlQYXRoWyBwYXRoIF0gPSBpbmRleDtcclxuXHJcblx0XHRwYXRocy5wdXNoKCBwYXRoICk7XHJcblx0XHRwYXJzZWRQYXRocy5wdXNoKCBwYXJzZWRQYXRoICk7XHJcblx0XHRiaW5kaW5ncy5wdXNoKCBiaW5kaW5nc0ZvclBhdGggKTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IG5DYWNoZWRPYmplY3RzLCBuID0gb2JqZWN0cy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBvYmplY3QgPSBvYmplY3RzWyBpIF07XHJcblx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgaSBdID0gbmV3IFByb3BlcnR5QmluZGluZyggb2JqZWN0LCBwYXRoLCBwYXJzZWRQYXRoICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBiaW5kaW5nc0ZvclBhdGg7XHJcblxyXG5cdH1cclxuXHJcblx0dW5zdWJzY3JpYmVfKCBwYXRoICkge1xyXG5cclxuXHRcdC8vIHRlbGxzIHRoZSBncm91cCB0byBmb3JnZXQgYWJvdXQgYSBwcm9wZXJ0eSBwYXRoIGFuZCBubyBsb25nZXJcclxuXHRcdC8vIHVwZGF0ZSB0aGUgYXJyYXkgcHJldmlvdXNseSBvYnRhaW5lZCB3aXRoICdzdWJzY3JpYmVfJ1xyXG5cclxuXHRcdGNvbnN0IGluZGljZXNCeVBhdGggPSB0aGlzLl9iaW5kaW5nc0luZGljZXNCeVBhdGgsXHJcblx0XHRcdGluZGV4ID0gaW5kaWNlc0J5UGF0aFsgcGF0aCBdO1xyXG5cclxuXHRcdGlmICggaW5kZXggIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGNvbnN0IHBhdGhzID0gdGhpcy5fcGF0aHMsXHJcblx0XHRcdFx0cGFyc2VkUGF0aHMgPSB0aGlzLl9wYXJzZWRQYXRocyxcclxuXHRcdFx0XHRiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxyXG5cdFx0XHRcdGxhc3RCaW5kaW5nc0luZGV4ID0gYmluZGluZ3MubGVuZ3RoIC0gMSxcclxuXHRcdFx0XHRsYXN0QmluZGluZ3MgPSBiaW5kaW5nc1sgbGFzdEJpbmRpbmdzSW5kZXggXSxcclxuXHRcdFx0XHRsYXN0QmluZGluZ3NQYXRoID0gcGF0aFsgbGFzdEJpbmRpbmdzSW5kZXggXTtcclxuXHJcblx0XHRcdGluZGljZXNCeVBhdGhbIGxhc3RCaW5kaW5nc1BhdGggXSA9IGluZGV4O1xyXG5cclxuXHRcdFx0YmluZGluZ3NbIGluZGV4IF0gPSBsYXN0QmluZGluZ3M7XHJcblx0XHRcdGJpbmRpbmdzLnBvcCgpO1xyXG5cclxuXHRcdFx0cGFyc2VkUGF0aHNbIGluZGV4IF0gPSBwYXJzZWRQYXRoc1sgbGFzdEJpbmRpbmdzSW5kZXggXTtcclxuXHRcdFx0cGFyc2VkUGF0aHMucG9wKCk7XHJcblxyXG5cdFx0XHRwYXRoc1sgaW5kZXggXSA9IHBhdGhzWyBsYXN0QmluZGluZ3NJbmRleCBdO1xyXG5cdFx0XHRwYXRocy5wb3AoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IEFuaW1hdGlvbk9iamVjdEdyb3VwIH07XHJcbiIsImltcG9ydCB7IFdyYXBBcm91bmRFbmRpbmcsIFplcm9DdXJ2YXR1cmVFbmRpbmcsIFplcm9TbG9wZUVuZGluZywgTG9vcFBpbmdQb25nLCBMb29wT25jZSwgTG9vcFJlcGVhdCwgTm9ybWFsQW5pbWF0aW9uQmxlbmRNb2RlLCBBZGRpdGl2ZUFuaW1hdGlvbkJsZW5kTW9kZSB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XHJcblxyXG4vKipcclxuICogQW4gaW5zdGFuY2Ugb2YgYEFuaW1hdGlvbkFjdGlvbmAgc2NoZWR1bGVzIHRoZSBwbGF5YmFjayBvZiBhbiBhbmltYXRpb24gd2hpY2ggaXNcclxuICogc3RvcmVkIGluIHtAbGluayBBbmltYXRpb25DbGlwfS5cclxuICovXHJcbmNsYXNzIEFuaW1hdGlvbkFjdGlvbiB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYW5pbWF0aW9uIGFjdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QW5pbWF0aW9uTWl4ZXJ9IG1peGVyIC0gVGhlIG1peGVyIHRoYXQgaXMgY29udHJvbGxlZCBieSB0aGlzIGFjdGlvbi5cclxuXHQgKiBAcGFyYW0ge0FuaW1hdGlvbkNsaXB9IGNsaXAgLSBUaGUgYW5pbWF0aW9uIGNsaXAgdGhhdCBob2xkcyB0aGUgYWN0dWFsIGtleWZyYW1lcy5cclxuXHQgKiBAcGFyYW0gez9PYmplY3QzRH0gW2xvY2FsUm9vdD1udWxsXSAtIFRoZSByb290IG9iamVjdCBvbiB3aGljaCB0aGlzIGFjdGlvbiBpcyBwZXJmb3JtZWQuXHJcblx0ICogQHBhcmFtIHsoTm9ybWFsQW5pbWF0aW9uQmxlbmRNb2RlfEFkZGl0aXZlQW5pbWF0aW9uQmxlbmRNb2RlKX0gW2JsZW5kTW9kZV0gLSBUaGUgYmxlbmQgbW9kZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbWl4ZXIsIGNsaXAsIGxvY2FsUm9vdCA9IG51bGwsIGJsZW5kTW9kZSA9IGNsaXAuYmxlbmRNb2RlICkge1xyXG5cclxuXHRcdHRoaXMuX21peGVyID0gbWl4ZXI7XHJcblx0XHR0aGlzLl9jbGlwID0gY2xpcDtcclxuXHRcdHRoaXMuX2xvY2FsUm9vdCA9IGxvY2FsUm9vdDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgaG93IHRoZSBhbmltYXRpb24gaXMgYmxlbmRlZC9jb21iaW5lZCB3aGVuIHR3byBvciBtb3JlIGFuaW1hdGlvbnNcclxuXHRcdCAqIGFyZSBzaW11bHRhbmVvdXNseSBwbGF5ZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeyhOb3JtYWxBbmltYXRpb25CbGVuZE1vZGV8QWRkaXRpdmVBbmltYXRpb25CbGVuZE1vZGUpfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJsZW5kTW9kZSA9IGJsZW5kTW9kZTtcclxuXHJcblx0XHRjb25zdCB0cmFja3MgPSBjbGlwLnRyYWNrcyxcclxuXHRcdFx0blRyYWNrcyA9IHRyYWNrcy5sZW5ndGgsXHJcblx0XHRcdGludGVycG9sYW50cyA9IG5ldyBBcnJheSggblRyYWNrcyApO1xyXG5cclxuXHRcdGNvbnN0IGludGVycG9sYW50U2V0dGluZ3MgPSB7XHJcblx0XHRcdGVuZGluZ1N0YXJ0OiBaZXJvQ3VydmF0dXJlRW5kaW5nLFxyXG5cdFx0XHRlbmRpbmdFbmQ6IFplcm9DdXJ2YXR1cmVFbmRpbmdcclxuXHRcdH07XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpICE9PSBuVHJhY2tzOyArKyBpICkge1xyXG5cclxuXHRcdFx0Y29uc3QgaW50ZXJwb2xhbnQgPSB0cmFja3NbIGkgXS5jcmVhdGVJbnRlcnBvbGFudCggbnVsbCApO1xyXG5cdFx0XHRpbnRlcnBvbGFudHNbIGkgXSA9IGludGVycG9sYW50O1xyXG5cdFx0XHRpbnRlcnBvbGFudC5zZXR0aW5ncyA9IGludGVycG9sYW50U2V0dGluZ3M7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuX2ludGVycG9sYW50U2V0dGluZ3MgPSBpbnRlcnBvbGFudFNldHRpbmdzO1xyXG5cclxuXHRcdHRoaXMuX2ludGVycG9sYW50cyA9IGludGVycG9sYW50czsgLy8gYm91bmQgYnkgdGhlIG1peGVyXHJcblxyXG5cdFx0Ly8gaW5zaWRlOiBQcm9wZXJ0eU1peGVyIChtYW5hZ2VkIGJ5IHRoZSBtaXhlcilcclxuXHRcdHRoaXMuX3Byb3BlcnR5QmluZGluZ3MgPSBuZXcgQXJyYXkoIG5UcmFja3MgKTtcclxuXHJcblx0XHR0aGlzLl9jYWNoZUluZGV4ID0gbnVsbDsgLy8gZm9yIHRoZSBtZW1vcnkgbWFuYWdlclxyXG5cdFx0dGhpcy5fYnlDbGlwQ2FjaGVJbmRleCA9IG51bGw7IC8vIGZvciB0aGUgbWVtb3J5IG1hbmFnZXJcclxuXHJcblx0XHR0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudCA9IG51bGw7XHJcblx0XHR0aGlzLl93ZWlnaHRJbnRlcnBvbGFudCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbG9vcCBtb2RlLCBzZXQgdmlhIHtAbGluayBBbmltYXRpb25BY3Rpb24jc2V0TG9vcH0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeyhMb29wUmVwZWF0fExvb3BPbmNlfExvb3BQaW5nUG9uZyl9XHJcblx0XHQgKiBAZGVmYXVsdCBMb29wUmVwZWF0XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubG9vcCA9IExvb3BSZXBlYXQ7XHJcblx0XHR0aGlzLl9sb29wQ291bnQgPSAtIDE7XHJcblxyXG5cdFx0Ly8gZ2xvYmFsIG1peGVyIHRpbWUgd2hlbiB0aGUgYWN0aW9uIGlzIHRvIGJlIHN0YXJ0ZWRcclxuXHRcdC8vIGl0J3Mgc2V0IGJhY2sgdG8gJ251bGwnIHVwb24gc3RhcnQgb2YgdGhlIGFjdGlvblxyXG5cdFx0dGhpcy5fc3RhcnRUaW1lID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBsb2NhbCB0aW1lIG9mIHRoaXMgYWN0aW9uIChpbiBzZWNvbmRzLCBzdGFydGluZyB3aXRoIGAwYCkuXHJcblx0XHQgKlxyXG5cdFx0ICogVGhlIHZhbHVlIGdldHMgY2xhbXBlZCBvciB3cmFwcGVkIHRvIGBbMCxjbGlwLmR1cmF0aW9uXWAgKGFjY29yZGluZyB0byB0aGVcclxuXHRcdCAqIGxvb3Agc3RhdGUpLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCBJbmZpbml0eVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRpbWUgPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU2NhbGluZyBmYWN0b3IgZm9yIHRoZSB7QGxpbmsgQW5pbWF0aW9uQWN0aW9uI3RpbWV9LiBBIHZhbHVlIG9mIGAwYCBjYXVzZXMgdGhlXHJcblx0XHQgKiBhbmltYXRpb24gdG8gcGF1c2UuIE5lZ2F0aXZlIHZhbHVlcyBjYXVzZSB0aGUgYW5pbWF0aW9uIHRvIHBsYXkgYmFja3dhcmRzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudGltZVNjYWxlID0gMTtcclxuXHRcdHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZSA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZGVncmVlIG9mIGluZmx1ZW5jZSBvZiB0aGlzIGFjdGlvbiAoaW4gdGhlIGludGVydmFsIGBbMCwgMV1gKS4gVmFsdWVzXHJcblx0XHQgKiBiZXR3ZWVuIGAwYCAobm8gaW1wYWN0KSBhbmQgYDFgIChmdWxsIGltcGFjdCkgY2FuIGJlIHVzZWQgdG8gYmxlbmQgYmV0d2VlblxyXG5cdFx0ICogc2V2ZXJhbCBhY3Rpb25zLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMud2VpZ2h0ID0gMTtcclxuXHRcdHRoaXMuX2VmZmVjdGl2ZVdlaWdodCA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbnVtYmVyIG9mIHJlcGV0aXRpb25zIG9mIHRoZSBwZXJmb3JtZWQgY2xpcCBvdmVyIHRoZSBjb3Vyc2Ugb2YgdGhpcyBhY3Rpb24uXHJcblx0XHQgKiBDYW4gYmUgc2V0IHZpYSB7QGxpbmsgQW5pbWF0aW9uQWN0aW9uI3NldExvb3B9LlxyXG5cdFx0ICpcclxuXHRcdCAqIFNldHRpbmcgdGhpcyBudW1iZXIgaGFzIG5vIGVmZmVjdCBpZiB7QGxpbmsgQW5pbWF0aW9uQWN0aW9uI2xvb3B9IGlzIHNldCB0b1xyXG5cdFx0ICogYFRIUkVFOkxvb3BPbmNlYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgSW5maW5pdHlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yZXBldGl0aW9ucyA9IEluZmluaXR5O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSWYgc2V0IHRvIGB0cnVlYCwgdGhlIHBsYXliYWNrIG9mIHRoZSBhY3Rpb24gaXMgcGF1c2VkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wYXVzZWQgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIElmIHNldCB0byBgZmFsc2VgLCB0aGUgYWN0aW9uIGlzIGRpc2FibGVkIHNvIGl0IGhhcyBubyBpbXBhY3QuXHJcblx0XHQgKlxyXG5cdFx0ICogV2hlbiB0aGUgYWN0aW9uIGlzIHJlLWVuYWJsZWQsIHRoZSBhbmltYXRpb24gY29udGludWVzIGZyb20gaXRzIGN1cnJlbnRcclxuXHRcdCAqIHRpbWUgKHNldHRpbmcgYGVuYWJsZWRgIHRvIGBmYWxzZWAgZG9lc24ndCByZXNldCB0aGUgYWN0aW9uKS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5lbmFibGVkID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIElmIHNldCB0byB0cnVlIHRoZSBhbmltYXRpb24gd2lsbCBhdXRvbWF0aWNhbGx5IGJlIHBhdXNlZCBvbiBpdHMgbGFzdCBmcmFtZS5cclxuXHRcdCAqXHJcblx0XHQgKiBJZiBzZXQgdG8gZmFsc2UsIHtAbGluayBBbmltYXRpb25BY3Rpb24jZW5hYmxlZH0gd2lsbCBhdXRvbWF0aWNhbGx5IGJlIHN3aXRjaGVkXHJcblx0XHQgKiB0byBgZmFsc2VgIHdoZW4gdGhlIGxhc3QgbG9vcCBvZiB0aGUgYWN0aW9uIGhhcyBmaW5pc2hlZCwgc28gdGhhdCB0aGlzIGFjdGlvbiBoYXNcclxuXHRcdCAqIG5vIGZ1cnRoZXIgaW1wYWN0LlxyXG5cdFx0ICpcclxuXHRcdCAqIE5vdGU6IFRoaXMgbWVtYmVyIGhhcyBubyBpbXBhY3QgaWYgdGhlIGFjdGlvbiBpcyBpbnRlcnJ1cHRlZCAoaXRcclxuXHRcdCAqIGhhcyBvbmx5IGFuIGVmZmVjdCBpZiBpdHMgbGFzdCBsb29wIGhhcyByZWFsbHkgZmluaXNoZWQpLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jbGFtcFdoZW5GaW5pc2hlZCA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRW5hYmxlcyBzbW9vdGggaW50ZXJwb2xhdGlvbiB3aXRob3V0IHNlcGFyYXRlIGNsaXBzIGZvciBzdGFydCwgbG9vcCBhbmQgZW5kLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnplcm9TbG9wZUF0U3RhcnQgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRW5hYmxlcyBzbW9vdGggaW50ZXJwb2xhdGlvbiB3aXRob3V0IHNlcGFyYXRlIGNsaXBzIGZvciBzdGFydCwgbG9vcCBhbmQgZW5kLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnplcm9TbG9wZUF0RW5kID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTdGFydHMgdGhlIHBsYXliYWNrIG9mIHRoZSBhbmltYXRpb24uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtBbmltYXRpb25BY3Rpb259IEEgcmVmZXJlbmNlIHRvIHRoaXMgYW5pbWF0aW9uIGFjdGlvbi5cclxuXHQgKi9cclxuXHRwbGF5KCkge1xyXG5cclxuXHRcdHRoaXMuX21peGVyLl9hY3RpdmF0ZUFjdGlvbiggdGhpcyApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFN0b3BzIHRoZSBwbGF5YmFjayBvZiB0aGUgYW5pbWF0aW9uLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7QW5pbWF0aW9uQWN0aW9ufSBBIHJlZmVyZW5jZSB0byB0aGlzIGFuaW1hdGlvbiBhY3Rpb24uXHJcblx0ICovXHJcblx0c3RvcCgpIHtcclxuXHJcblx0XHR0aGlzLl9taXhlci5fZGVhY3RpdmF0ZUFjdGlvbiggdGhpcyApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnJlc2V0KCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVzZXRzIHRoZSBwbGF5YmFjayBvZiB0aGUgYW5pbWF0aW9uLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7QW5pbWF0aW9uQWN0aW9ufSBBIHJlZmVyZW5jZSB0byB0aGlzIGFuaW1hdGlvbiBhY3Rpb24uXHJcblx0ICovXHJcblx0cmVzZXQoKSB7XHJcblxyXG5cdFx0dGhpcy5wYXVzZWQgPSBmYWxzZTtcclxuXHRcdHRoaXMuZW5hYmxlZCA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50aW1lID0gMDsgLy8gcmVzdGFydCBjbGlwXHJcblx0XHR0aGlzLl9sb29wQ291bnQgPSAtIDE7Ly8gZm9yZ2V0IHByZXZpb3VzIGxvb3BzXHJcblx0XHR0aGlzLl9zdGFydFRpbWUgPSBudWxsOy8vIGZvcmdldCBzY2hlZHVsaW5nXHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuc3RvcEZhZGluZygpLnN0b3BXYXJwaW5nKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGFuaW1hdGlvbiBpcyBydW5uaW5nLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgYW5pbWF0aW9uIGlzIHJ1bm5pbmcgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGlzUnVubmluZygpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5lbmFibGVkICYmICEgdGhpcy5wYXVzZWQgJiYgdGhpcy50aW1lU2NhbGUgIT09IDAgJiZcclxuXHRcdFx0dGhpcy5fc3RhcnRUaW1lID09PSBudWxsICYmIHRoaXMuX21peGVyLl9pc0FjdGl2ZUFjdGlvbiggdGhpcyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIHdoZW4ge0BsaW5rIEFuaW1hdGlvbkFjdGlvbiNwbGF5fSBoYXMgYmVlbiBjYWxsZWQuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBhbmltYXRpb24gaXMgc2NoZWR1bGVkIG9yIG5vdC5cclxuXHQgKi9cclxuXHRpc1NjaGVkdWxlZCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fbWl4ZXIuX2lzQWN0aXZlQWN0aW9uKCB0aGlzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVmaW5lcyB0aGUgdGltZSB3aGVuIHRoZSBhbmltYXRpb24gc2hvdWxkIHN0YXJ0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHRpbWUgLSBUaGUgc3RhcnQgdGltZSBpbiBzZWNvbmRzLlxyXG5cdCAqIEByZXR1cm4ge0FuaW1hdGlvbkFjdGlvbn0gQSByZWZlcmVuY2UgdG8gdGhpcyBhbmltYXRpb24gYWN0aW9uLlxyXG5cdCAqL1xyXG5cdHN0YXJ0QXQoIHRpbWUgKSB7XHJcblxyXG5cdFx0dGhpcy5fc3RhcnRUaW1lID0gdGltZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25maWd1cmVzIHRoZSBsb29wIHNldHRpbmdzIGZvciB0aGlzIGFjdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7KExvb3BSZXBlYXR8TG9vcE9uY2V8TG9vcFBpbmdQb25nKX0gbW9kZSAtIFRoZSBsb29wIG1vZGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHJlcGV0aXRpb25zIC0gVGhlIG51bWJlciBvZiByZXBldGl0aW9ucy5cclxuXHQgKiBAcmV0dXJuIHtBbmltYXRpb25BY3Rpb259IEEgcmVmZXJlbmNlIHRvIHRoaXMgYW5pbWF0aW9uIGFjdGlvbi5cclxuXHQgKi9cclxuXHRzZXRMb29wKCBtb2RlLCByZXBldGl0aW9ucyApIHtcclxuXHJcblx0XHR0aGlzLmxvb3AgPSBtb2RlO1xyXG5cdFx0dGhpcy5yZXBldGl0aW9ucyA9IHJlcGV0aXRpb25zO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGVmZmVjdGl2ZSB3ZWlnaHQgb2YgdGhpcyBhY3Rpb24uXHJcblx0ICpcclxuXHQgKiBBbiBhY3Rpb24gaGFzIG5vIGVmZmVjdCBhbmQgdGh1cyBhbiBlZmZlY3RpdmUgd2VpZ2h0IG9mIHplcm8gd2hlbiB0aGVcclxuXHQgKiBhY3Rpb24gaXMgZGlzYWJsZWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gd2VpZ2h0IC0gVGhlIHdlaWdodCB0byBzZXQuXHJcblx0ICogQHJldHVybiB7QW5pbWF0aW9uQWN0aW9ufSBBIHJlZmVyZW5jZSB0byB0aGlzIGFuaW1hdGlvbiBhY3Rpb24uXHJcblx0ICovXHJcblx0c2V0RWZmZWN0aXZlV2VpZ2h0KCB3ZWlnaHQgKSB7XHJcblxyXG5cdFx0dGhpcy53ZWlnaHQgPSB3ZWlnaHQ7XHJcblxyXG5cdFx0Ly8gbm90ZTogc2FtZSBsb2dpYyBhcyB3aGVuIHVwZGF0ZWQgYXQgcnVudGltZVxyXG5cdFx0dGhpcy5fZWZmZWN0aXZlV2VpZ2h0ID0gdGhpcy5lbmFibGVkID8gd2VpZ2h0IDogMDtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5zdG9wRmFkaW5nKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgZWZmZWN0aXZlIHdlaWdodCBvZiB0aGlzIGFjdGlvbi5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGVmZmVjdGl2ZSB3ZWlnaHQuXHJcblx0ICovXHJcblx0Z2V0RWZmZWN0aXZlV2VpZ2h0KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9lZmZlY3RpdmVXZWlnaHQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRmFkZXMgdGhlIGFuaW1hdGlvbiBpbiBieSBpbmNyZWFzaW5nIGl0cyB3ZWlnaHQgZ3JhZHVhbGx5IGZyb20gYDBgIHRvIGAxYCxcclxuXHQgKiB3aXRoaW4gdGhlIHBhc3NlZCB0aW1lIGludGVydmFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGR1cmF0aW9uIC0gVGhlIGR1cmF0aW9uIG9mIHRoZSBmYWRlLlxyXG5cdCAqIEByZXR1cm4ge0FuaW1hdGlvbkFjdGlvbn0gQSByZWZlcmVuY2UgdG8gdGhpcyBhbmltYXRpb24gYWN0aW9uLlxyXG5cdCAqL1xyXG5cdGZhZGVJbiggZHVyYXRpb24gKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX3NjaGVkdWxlRmFkaW5nKCBkdXJhdGlvbiwgMCwgMSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZhZGVzIHRoZSBhbmltYXRpb24gb3V0IGJ5IGRlY3JlYXNpbmcgaXRzIHdlaWdodCBncmFkdWFsbHkgZnJvbSBgMWAgdG8gYDBgLFxyXG5cdCAqIHdpdGhpbiB0aGUgcGFzc2VkIHRpbWUgaW50ZXJ2YWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZHVyYXRpb24gLSBUaGUgZHVyYXRpb24gb2YgdGhlIGZhZGUuXHJcblx0ICogQHJldHVybiB7QW5pbWF0aW9uQWN0aW9ufSBBIHJlZmVyZW5jZSB0byB0aGlzIGFuaW1hdGlvbiBhY3Rpb24uXHJcblx0ICovXHJcblx0ZmFkZU91dCggZHVyYXRpb24gKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX3NjaGVkdWxlRmFkaW5nKCBkdXJhdGlvbiwgMSwgMCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENhdXNlcyB0aGlzIGFjdGlvbiB0byBmYWRlIGluIGFuZCB0aGUgZ2l2ZW4gYWN0aW9uIHRvIGZhZGUgb3V0LFxyXG5cdCAqIHdpdGhpbiB0aGUgcGFzc2VkIHRpbWUgaW50ZXJ2YWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FuaW1hdGlvbkFjdGlvbn0gZmFkZU91dEFjdGlvbiAtIFRoZSBhbmltYXRpb24gYWN0aW9uIHRvIGZhZGUgb3V0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBkdXJhdGlvbiAtIFRoZSBkdXJhdGlvbiBvZiB0aGUgZmFkZS5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFt3YXJwPWZhbHNlXSAtIFdoZXRoZXIgd2FycGluZyBzaG91bGQgYmUgdXNlZCBvciBub3QuXHJcblx0ICogQHJldHVybiB7QW5pbWF0aW9uQWN0aW9ufSBBIHJlZmVyZW5jZSB0byB0aGlzIGFuaW1hdGlvbiBhY3Rpb24uXHJcblx0ICovXHJcblx0Y3Jvc3NGYWRlRnJvbSggZmFkZU91dEFjdGlvbiwgZHVyYXRpb24sIHdhcnAgPSBmYWxzZSApIHtcclxuXHJcblx0XHRmYWRlT3V0QWN0aW9uLmZhZGVPdXQoIGR1cmF0aW9uICk7XHJcblx0XHR0aGlzLmZhZGVJbiggZHVyYXRpb24gKTtcclxuXHJcblx0XHRpZiAoIHdhcnAgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBmYWRlSW5EdXJhdGlvbiA9IHRoaXMuX2NsaXAuZHVyYXRpb24sXHJcblx0XHRcdFx0ZmFkZU91dER1cmF0aW9uID0gZmFkZU91dEFjdGlvbi5fY2xpcC5kdXJhdGlvbixcclxuXHJcblx0XHRcdFx0c3RhcnRFbmRSYXRpbyA9IGZhZGVPdXREdXJhdGlvbiAvIGZhZGVJbkR1cmF0aW9uLFxyXG5cdFx0XHRcdGVuZFN0YXJ0UmF0aW8gPSBmYWRlSW5EdXJhdGlvbiAvIGZhZGVPdXREdXJhdGlvbjtcclxuXHJcblx0XHRcdGZhZGVPdXRBY3Rpb24ud2FycCggMS4wLCBzdGFydEVuZFJhdGlvLCBkdXJhdGlvbiApO1xyXG5cdFx0XHR0aGlzLndhcnAoIGVuZFN0YXJ0UmF0aW8sIDEuMCwgZHVyYXRpb24gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2F1c2VzIHRoaXMgYWN0aW9uIHRvIGZhZGUgb3V0IGFuZCB0aGUgZ2l2ZW4gYWN0aW9uIHRvIGZhZGUgaW4sXHJcblx0ICogd2l0aGluIHRoZSBwYXNzZWQgdGltZSBpbnRlcnZhbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QW5pbWF0aW9uQWN0aW9ufSBmYWRlSW5BY3Rpb24gLSBUaGUgYW5pbWF0aW9uIGFjdGlvbiB0byBmYWRlIGluLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBkdXJhdGlvbiAtIFRoZSBkdXJhdGlvbiBvZiB0aGUgZmFkZS5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFt3YXJwPWZhbHNlXSAtIFdoZXRoZXIgd2FycGluZyBzaG91bGQgYmUgdXNlZCBvciBub3QuXHJcblx0ICogQHJldHVybiB7QW5pbWF0aW9uQWN0aW9ufSBBIHJlZmVyZW5jZSB0byB0aGlzIGFuaW1hdGlvbiBhY3Rpb24uXHJcblx0ICovXHJcblx0Y3Jvc3NGYWRlVG8oIGZhZGVJbkFjdGlvbiwgZHVyYXRpb24sIHdhcnAgPSBmYWxzZSApIHtcclxuXHJcblx0XHRyZXR1cm4gZmFkZUluQWN0aW9uLmNyb3NzRmFkZUZyb20oIHRoaXMsIGR1cmF0aW9uLCB3YXJwICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3RvcHMgYW55IGZhZGluZyB3aGljaCBpcyBhcHBsaWVkIHRvIHRoaXMgYWN0aW9uLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7QW5pbWF0aW9uQWN0aW9ufSBBIHJlZmVyZW5jZSB0byB0aGlzIGFuaW1hdGlvbiBhY3Rpb24uXHJcblx0ICovXHJcblx0c3RvcEZhZGluZygpIHtcclxuXHJcblx0XHRjb25zdCB3ZWlnaHRJbnRlcnBvbGFudCA9IHRoaXMuX3dlaWdodEludGVycG9sYW50O1xyXG5cclxuXHRcdGlmICggd2VpZ2h0SW50ZXJwb2xhbnQgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLl93ZWlnaHRJbnRlcnBvbGFudCA9IG51bGw7XHJcblx0XHRcdHRoaXMuX21peGVyLl90YWtlQmFja0NvbnRyb2xJbnRlcnBvbGFudCggd2VpZ2h0SW50ZXJwb2xhbnQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZWZmZWN0aXZlIHRpbWUgc2NhbGUgb2YgdGhpcyBhY3Rpb24uXHJcblx0ICpcclxuXHQgKiBBbiBhY3Rpb24gaGFzIG5vIGVmZmVjdCBhbmQgdGh1cyBhbiBlZmZlY3RpdmUgdGltZSBzY2FsZSBvZiB6ZXJvIHdoZW4gdGhlXHJcblx0ICogYWN0aW9uIGlzIHBhdXNlZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lU2NhbGUgLSBUaGUgdGltZSBzY2FsZSB0byBzZXQuXHJcblx0ICogQHJldHVybiB7QW5pbWF0aW9uQWN0aW9ufSBBIHJlZmVyZW5jZSB0byB0aGlzIGFuaW1hdGlvbiBhY3Rpb24uXHJcblx0ICovXHJcblx0c2V0RWZmZWN0aXZlVGltZVNjYWxlKCB0aW1lU2NhbGUgKSB7XHJcblxyXG5cdFx0dGhpcy50aW1lU2NhbGUgPSB0aW1lU2NhbGU7XHJcblx0XHR0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGUgPSB0aGlzLnBhdXNlZCA/IDAgOiB0aW1lU2NhbGU7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuc3RvcFdhcnBpbmcoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBlZmZlY3RpdmUgdGltZSBzY2FsZSBvZiB0aGlzIGFjdGlvbi5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGVmZmVjdGl2ZSB0aW1lIHNjYWxlLlxyXG5cdCAqL1xyXG5cdGdldEVmZmVjdGl2ZVRpbWVTY2FsZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGR1cmF0aW9uIGZvciBhIHNpbmdsZSBsb29wIG9mIHRoaXMgYWN0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGR1cmF0aW9uIC0gVGhlIGR1cmF0aW9uIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtBbmltYXRpb25BY3Rpb259IEEgcmVmZXJlbmNlIHRvIHRoaXMgYW5pbWF0aW9uIGFjdGlvbi5cclxuXHQgKi9cclxuXHRzZXREdXJhdGlvbiggZHVyYXRpb24gKSB7XHJcblxyXG5cdFx0dGhpcy50aW1lU2NhbGUgPSB0aGlzLl9jbGlwLmR1cmF0aW9uIC8gZHVyYXRpb247XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuc3RvcFdhcnBpbmcoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTeW5jaHJvbml6ZXMgdGhpcyBhY3Rpb24gd2l0aCB0aGUgcGFzc2VkIG90aGVyIGFjdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QW5pbWF0aW9uQWN0aW9ufSBhY3Rpb24gLSBUaGUgYWN0aW9uIHRvIHN5bmMgd2l0aC5cclxuXHQgKiBAcmV0dXJuIHtBbmltYXRpb25BY3Rpb259IEEgcmVmZXJlbmNlIHRvIHRoaXMgYW5pbWF0aW9uIGFjdGlvbi5cclxuXHQgKi9cclxuXHRzeW5jV2l0aCggYWN0aW9uICkge1xyXG5cclxuXHRcdHRoaXMudGltZSA9IGFjdGlvbi50aW1lO1xyXG5cdFx0dGhpcy50aW1lU2NhbGUgPSBhY3Rpb24udGltZVNjYWxlO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnN0b3BXYXJwaW5nKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVjZWxlcmF0ZXMgdGhpcyBhbmltYXRpb24ncyBzcGVlZCB0byBgMGAgd2l0aGluIHRoZSBwYXNzZWQgdGltZSBpbnRlcnZhbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBkdXJhdGlvbiAtIFRoZSBkdXJhdGlvbi5cclxuXHQgKiBAcmV0dXJuIHtBbmltYXRpb25BY3Rpb259IEEgcmVmZXJlbmNlIHRvIHRoaXMgYW5pbWF0aW9uIGFjdGlvbi5cclxuXHQgKi9cclxuXHRoYWx0KCBkdXJhdGlvbiApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy53YXJwKCB0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGUsIDAsIGR1cmF0aW9uICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2hhbmdlcyB0aGUgcGxheWJhY2sgc3BlZWQsIHdpdGhpbiB0aGUgcGFzc2VkIHRpbWUgaW50ZXJ2YWwsIGJ5IG1vZGlmeWluZ1xyXG5cdCAqIHtAbGluayBBbmltYXRpb25BY3Rpb24jdGltZVNjYWxlfSBncmFkdWFsbHkgZnJvbSBgc3RhcnRUaW1lU2NhbGVgIHRvXHJcblx0ICogYGVuZFRpbWVTY2FsZWAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc3RhcnRUaW1lU2NhbGUgLSBUaGUgc3RhcnQgdGltZSBzY2FsZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZW5kVGltZVNjYWxlIC0gVGhlIGVuZCB0aW1lIHNjYWxlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBkdXJhdGlvbiAtIFRoZSBkdXJhdGlvbi5cclxuXHQgKiBAcmV0dXJuIHtBbmltYXRpb25BY3Rpb259IEEgcmVmZXJlbmNlIHRvIHRoaXMgYW5pbWF0aW9uIGFjdGlvbi5cclxuXHQgKi9cclxuXHR3YXJwKCBzdGFydFRpbWVTY2FsZSwgZW5kVGltZVNjYWxlLCBkdXJhdGlvbiApIHtcclxuXHJcblx0XHRjb25zdCBtaXhlciA9IHRoaXMuX21peGVyLFxyXG5cdFx0XHRub3cgPSBtaXhlci50aW1lLFxyXG5cdFx0XHR0aW1lU2NhbGUgPSB0aGlzLnRpbWVTY2FsZTtcclxuXHJcblx0XHRsZXQgaW50ZXJwb2xhbnQgPSB0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudDtcclxuXHJcblx0XHRpZiAoIGludGVycG9sYW50ID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0aW50ZXJwb2xhbnQgPSBtaXhlci5fbGVuZENvbnRyb2xJbnRlcnBvbGFudCgpO1xyXG5cdFx0XHR0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudCA9IGludGVycG9sYW50O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCB0aW1lcyA9IGludGVycG9sYW50LnBhcmFtZXRlclBvc2l0aW9ucyxcclxuXHRcdFx0dmFsdWVzID0gaW50ZXJwb2xhbnQuc2FtcGxlVmFsdWVzO1xyXG5cclxuXHRcdHRpbWVzWyAwIF0gPSBub3c7XHJcblx0XHR0aW1lc1sgMSBdID0gbm93ICsgZHVyYXRpb247XHJcblxyXG5cdFx0dmFsdWVzWyAwIF0gPSBzdGFydFRpbWVTY2FsZSAvIHRpbWVTY2FsZTtcclxuXHRcdHZhbHVlc1sgMSBdID0gZW5kVGltZVNjYWxlIC8gdGltZVNjYWxlO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFN0b3BzIGFueSBzY2hlZHVsZWQgd2FycGluZyB3aGljaCBpcyBhcHBsaWVkIHRvIHRoaXMgYWN0aW9uLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7QW5pbWF0aW9uQWN0aW9ufSBBIHJlZmVyZW5jZSB0byB0aGlzIGFuaW1hdGlvbiBhY3Rpb24uXHJcblx0ICovXHJcblx0c3RvcFdhcnBpbmcoKSB7XHJcblxyXG5cdFx0Y29uc3QgdGltZVNjYWxlSW50ZXJwb2xhbnQgPSB0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudDtcclxuXHJcblx0XHRpZiAoIHRpbWVTY2FsZUludGVycG9sYW50ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQgPSBudWxsO1xyXG5cdFx0XHR0aGlzLl9taXhlci5fdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQoIHRpbWVTY2FsZUludGVycG9sYW50ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGFuaW1hdGlvbiBtaXhlciBvZiB0aGlzIGFuaW1hdGlvbiBhY3Rpb24uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtBbmltYXRpb25NaXhlcn0gVGhlIGFuaW1hdGlvbiBtaXhlci5cclxuXHQgKi9cclxuXHRnZXRNaXhlcigpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fbWl4ZXI7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgYW5pbWF0aW9uIGNsaXAgb2YgdGhpcyBhbmltYXRpb24gYWN0aW9uLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7QW5pbWF0aW9uQ2xpcH0gVGhlIGFuaW1hdGlvbiBjbGlwLlxyXG5cdCAqL1xyXG5cdGdldENsaXAoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX2NsaXA7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgcm9vdCBvYmplY3Qgb2YgdGhpcyBhbmltYXRpb24gYWN0aW9uLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7T2JqZWN0M0R9IFRoZSByb290IG9iamVjdC5cclxuXHQgKi9cclxuXHRnZXRSb290KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9sb2NhbFJvb3QgfHwgdGhpcy5fbWl4ZXIuX3Jvb3Q7XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gSW50ZXJuYVxyXG5cclxuXHRfdXBkYXRlKCB0aW1lLCBkZWx0YVRpbWUsIHRpbWVEaXJlY3Rpb24sIGFjY3VJbmRleCApIHtcclxuXHJcblx0XHQvLyBjYWxsZWQgYnkgdGhlIG1peGVyXHJcblxyXG5cdFx0aWYgKCAhIHRoaXMuZW5hYmxlZCApIHtcclxuXHJcblx0XHRcdC8vIGNhbGwgLl91cGRhdGVXZWlnaHQoKSB0byB1cGRhdGUgLl9lZmZlY3RpdmVXZWlnaHRcclxuXHJcblx0XHRcdHRoaXMuX3VwZGF0ZVdlaWdodCggdGltZSApO1xyXG5cdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHN0YXJ0VGltZSA9IHRoaXMuX3N0YXJ0VGltZTtcclxuXHJcblx0XHRpZiAoIHN0YXJ0VGltZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdC8vIGNoZWNrIGZvciBzY2hlZHVsZWQgc3RhcnQgb2YgYWN0aW9uXHJcblxyXG5cdFx0XHRjb25zdCB0aW1lUnVubmluZyA9ICggdGltZSAtIHN0YXJ0VGltZSApICogdGltZURpcmVjdGlvbjtcclxuXHRcdFx0aWYgKCB0aW1lUnVubmluZyA8IDAgfHwgdGltZURpcmVjdGlvbiA9PT0gMCApIHtcclxuXHJcblx0XHRcdFx0ZGVsdGFUaW1lID0gMDtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cclxuXHRcdFx0XHR0aGlzLl9zdGFydFRpbWUgPSBudWxsOyAvLyB1bnNjaGVkdWxlXHJcblx0XHRcdFx0ZGVsdGFUaW1lID0gdGltZURpcmVjdGlvbiAqIHRpbWVSdW5uaW5nO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBhcHBseSB0aW1lIHNjYWxlIGFuZCBhZHZhbmNlIHRpbWVcclxuXHJcblx0XHRkZWx0YVRpbWUgKj0gdGhpcy5fdXBkYXRlVGltZVNjYWxlKCB0aW1lICk7XHJcblx0XHRjb25zdCBjbGlwVGltZSA9IHRoaXMuX3VwZGF0ZVRpbWUoIGRlbHRhVGltZSApO1xyXG5cclxuXHRcdC8vIG5vdGU6IF91cGRhdGVUaW1lIG1heSBkaXNhYmxlIHRoZSBhY3Rpb24gcmVzdWx0aW5nIGluXHJcblx0XHQvLyBhbiBlZmZlY3RpdmUgd2VpZ2h0IG9mIDBcclxuXHJcblx0XHRjb25zdCB3ZWlnaHQgPSB0aGlzLl91cGRhdGVXZWlnaHQoIHRpbWUgKTtcclxuXHJcblx0XHRpZiAoIHdlaWdodCA+IDAgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBpbnRlcnBvbGFudHMgPSB0aGlzLl9pbnRlcnBvbGFudHM7XHJcblx0XHRcdGNvbnN0IHByb3BlcnR5TWl4ZXJzID0gdGhpcy5fcHJvcGVydHlCaW5kaW5ncztcclxuXHJcblx0XHRcdHN3aXRjaCAoIHRoaXMuYmxlbmRNb2RlICkge1xyXG5cclxuXHRcdFx0XHRjYXNlIEFkZGl0aXZlQW5pbWF0aW9uQmxlbmRNb2RlOlxyXG5cclxuXHRcdFx0XHRcdGZvciAoIGxldCBqID0gMCwgbSA9IGludGVycG9sYW50cy5sZW5ndGg7IGogIT09IG07ICsrIGogKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRpbnRlcnBvbGFudHNbIGogXS5ldmFsdWF0ZSggY2xpcFRpbWUgKTtcclxuXHRcdFx0XHRcdFx0cHJvcGVydHlNaXhlcnNbIGogXS5hY2N1bXVsYXRlQWRkaXRpdmUoIHdlaWdodCApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0Y2FzZSBOb3JtYWxBbmltYXRpb25CbGVuZE1vZGU6XHJcblx0XHRcdFx0ZGVmYXVsdDpcclxuXHJcblx0XHRcdFx0XHRmb3IgKCBsZXQgaiA9IDAsIG0gPSBpbnRlcnBvbGFudHMubGVuZ3RoOyBqICE9PSBtOyArKyBqICkge1xyXG5cclxuXHRcdFx0XHRcdFx0aW50ZXJwb2xhbnRzWyBqIF0uZXZhbHVhdGUoIGNsaXBUaW1lICk7XHJcblx0XHRcdFx0XHRcdHByb3BlcnR5TWl4ZXJzWyBqIF0uYWNjdW11bGF0ZSggYWNjdUluZGV4LCB3ZWlnaHQgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdF91cGRhdGVXZWlnaHQoIHRpbWUgKSB7XHJcblxyXG5cdFx0bGV0IHdlaWdodCA9IDA7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmVuYWJsZWQgKSB7XHJcblxyXG5cdFx0XHR3ZWlnaHQgPSB0aGlzLndlaWdodDtcclxuXHRcdFx0Y29uc3QgaW50ZXJwb2xhbnQgPSB0aGlzLl93ZWlnaHRJbnRlcnBvbGFudDtcclxuXHJcblx0XHRcdGlmICggaW50ZXJwb2xhbnQgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGludGVycG9sYW50VmFsdWUgPSBpbnRlcnBvbGFudC5ldmFsdWF0ZSggdGltZSApWyAwIF07XHJcblxyXG5cdFx0XHRcdHdlaWdodCAqPSBpbnRlcnBvbGFudFZhbHVlO1xyXG5cclxuXHRcdFx0XHRpZiAoIHRpbWUgPiBpbnRlcnBvbGFudC5wYXJhbWV0ZXJQb3NpdGlvbnNbIDEgXSApIHtcclxuXHJcblx0XHRcdFx0XHR0aGlzLnN0b3BGYWRpbmcoKTtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGludGVycG9sYW50VmFsdWUgPT09IDAgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBmYWRlZCBvdXQsIGRpc2FibGVcclxuXHRcdFx0XHRcdFx0dGhpcy5lbmFibGVkID0gZmFsc2U7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuX2VmZmVjdGl2ZVdlaWdodCA9IHdlaWdodDtcclxuXHRcdHJldHVybiB3ZWlnaHQ7XHJcblxyXG5cdH1cclxuXHJcblx0X3VwZGF0ZVRpbWVTY2FsZSggdGltZSApIHtcclxuXHJcblx0XHRsZXQgdGltZVNjYWxlID0gMDtcclxuXHJcblx0XHRpZiAoICEgdGhpcy5wYXVzZWQgKSB7XHJcblxyXG5cdFx0XHR0aW1lU2NhbGUgPSB0aGlzLnRpbWVTY2FsZTtcclxuXHJcblx0XHRcdGNvbnN0IGludGVycG9sYW50ID0gdGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ7XHJcblxyXG5cdFx0XHRpZiAoIGludGVycG9sYW50ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBpbnRlcnBvbGFudFZhbHVlID0gaW50ZXJwb2xhbnQuZXZhbHVhdGUoIHRpbWUgKVsgMCBdO1xyXG5cclxuXHRcdFx0XHR0aW1lU2NhbGUgKj0gaW50ZXJwb2xhbnRWYWx1ZTtcclxuXHJcblx0XHRcdFx0aWYgKCB0aW1lID4gaW50ZXJwb2xhbnQucGFyYW1ldGVyUG9zaXRpb25zWyAxIF0gKSB7XHJcblxyXG5cdFx0XHRcdFx0dGhpcy5zdG9wV2FycGluZygpO1xyXG5cclxuXHRcdFx0XHRcdGlmICggdGltZVNjYWxlID09PSAwICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Ly8gbW90aW9uIGhhcyBoYWx0ZWQsIHBhdXNlXHJcblx0XHRcdFx0XHRcdHRoaXMucGF1c2VkID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0Ly8gd2FycCBkb25lIC0gYXBwbHkgZmluYWwgdGltZSBzY2FsZVxyXG5cdFx0XHRcdFx0XHR0aGlzLnRpbWVTY2FsZSA9IHRpbWVTY2FsZTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlID0gdGltZVNjYWxlO1xyXG5cdFx0cmV0dXJuIHRpbWVTY2FsZTtcclxuXHJcblx0fVxyXG5cclxuXHRfdXBkYXRlVGltZSggZGVsdGFUaW1lICkge1xyXG5cclxuXHRcdGNvbnN0IGR1cmF0aW9uID0gdGhpcy5fY2xpcC5kdXJhdGlvbjtcclxuXHRcdGNvbnN0IGxvb3AgPSB0aGlzLmxvb3A7XHJcblxyXG5cdFx0bGV0IHRpbWUgPSB0aGlzLnRpbWUgKyBkZWx0YVRpbWU7XHJcblx0XHRsZXQgbG9vcENvdW50ID0gdGhpcy5fbG9vcENvdW50O1xyXG5cclxuXHRcdGNvbnN0IHBpbmdQb25nID0gKCBsb29wID09PSBMb29wUGluZ1BvbmcgKTtcclxuXHJcblx0XHRpZiAoIGRlbHRhVGltZSA9PT0gMCApIHtcclxuXHJcblx0XHRcdGlmICggbG9vcENvdW50ID09PSAtIDEgKSByZXR1cm4gdGltZTtcclxuXHJcblx0XHRcdHJldHVybiAoIHBpbmdQb25nICYmICggbG9vcENvdW50ICYgMSApID09PSAxICkgPyBkdXJhdGlvbiAtIHRpbWUgOiB0aW1lO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGxvb3AgPT09IExvb3BPbmNlICkge1xyXG5cclxuXHRcdFx0aWYgKCBsb29wQ291bnQgPT09IC0gMSApIHtcclxuXHJcblx0XHRcdFx0Ly8ganVzdCBzdGFydGVkXHJcblxyXG5cdFx0XHRcdHRoaXMuX2xvb3BDb3VudCA9IDA7XHJcblx0XHRcdFx0dGhpcy5fc2V0RW5kaW5ncyggdHJ1ZSwgdHJ1ZSwgZmFsc2UgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGhhbmRsZV9zdG9wOiB7XHJcblxyXG5cdFx0XHRcdGlmICggdGltZSA+PSBkdXJhdGlvbiApIHtcclxuXHJcblx0XHRcdFx0XHR0aW1lID0gZHVyYXRpb247XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIHRpbWUgPCAwICkge1xyXG5cclxuXHRcdFx0XHRcdHRpbWUgPSAwO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdHRoaXMudGltZSA9IHRpbWU7XHJcblxyXG5cdFx0XHRcdFx0YnJlYWsgaGFuZGxlX3N0b3A7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKCB0aGlzLmNsYW1wV2hlbkZpbmlzaGVkICkgdGhpcy5wYXVzZWQgPSB0cnVlO1xyXG5cdFx0XHRcdGVsc2UgdGhpcy5lbmFibGVkID0gZmFsc2U7XHJcblxyXG5cdFx0XHRcdHRoaXMudGltZSA9IHRpbWU7XHJcblxyXG5cdFx0XHRcdHRoaXMuX21peGVyLmRpc3BhdGNoRXZlbnQoIHtcclxuXHRcdFx0XHRcdHR5cGU6ICdmaW5pc2hlZCcsIGFjdGlvbjogdGhpcyxcclxuXHRcdFx0XHRcdGRpcmVjdGlvbjogZGVsdGFUaW1lIDwgMCA/IC0gMSA6IDFcclxuXHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIHsgLy8gcmVwZXRpdGl2ZSBSZXBlYXQgb3IgUGluZ1BvbmdcclxuXHJcblx0XHRcdGlmICggbG9vcENvdW50ID09PSAtIDEgKSB7XHJcblxyXG5cdFx0XHRcdC8vIGp1c3Qgc3RhcnRlZFxyXG5cclxuXHRcdFx0XHRpZiAoIGRlbHRhVGltZSA+PSAwICkge1xyXG5cclxuXHRcdFx0XHRcdGxvb3BDb3VudCA9IDA7XHJcblxyXG5cdFx0XHRcdFx0dGhpcy5fc2V0RW5kaW5ncyggdHJ1ZSwgdGhpcy5yZXBldGl0aW9ucyA9PT0gMCwgcGluZ1BvbmcgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHQvLyB3aGVuIGxvb3BpbmcgaW4gcmV2ZXJzZSBkaXJlY3Rpb24sIHRoZSBpbml0aWFsXHJcblx0XHRcdFx0XHQvLyB0cmFuc2l0aW9uIHRocm91Z2ggemVybyBjb3VudHMgYXMgYSByZXBldGl0aW9uLFxyXG5cdFx0XHRcdFx0Ly8gc28gbGVhdmUgbG9vcENvdW50IGF0IC0xXHJcblxyXG5cdFx0XHRcdFx0dGhpcy5fc2V0RW5kaW5ncyggdGhpcy5yZXBldGl0aW9ucyA9PT0gMCwgdHJ1ZSwgcGluZ1BvbmcgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCB0aW1lID49IGR1cmF0aW9uIHx8IHRpbWUgPCAwICkge1xyXG5cclxuXHRcdFx0XHQvLyB3cmFwIGFyb3VuZFxyXG5cclxuXHRcdFx0XHRjb25zdCBsb29wRGVsdGEgPSBNYXRoLmZsb29yKCB0aW1lIC8gZHVyYXRpb24gKTsgLy8gc2lnbmVkXHJcblx0XHRcdFx0dGltZSAtPSBkdXJhdGlvbiAqIGxvb3BEZWx0YTtcclxuXHJcblx0XHRcdFx0bG9vcENvdW50ICs9IE1hdGguYWJzKCBsb29wRGVsdGEgKTtcclxuXHJcblx0XHRcdFx0Y29uc3QgcGVuZGluZyA9IHRoaXMucmVwZXRpdGlvbnMgLSBsb29wQ291bnQ7XHJcblxyXG5cdFx0XHRcdGlmICggcGVuZGluZyA8PSAwICkge1xyXG5cclxuXHRcdFx0XHRcdC8vIGhhdmUgdG8gc3RvcCAoc3dpdGNoIHN0YXRlLCBjbGFtcCB0aW1lLCBmaXJlIGV2ZW50KVxyXG5cclxuXHRcdFx0XHRcdGlmICggdGhpcy5jbGFtcFdoZW5GaW5pc2hlZCApIHRoaXMucGF1c2VkID0gdHJ1ZTtcclxuXHRcdFx0XHRcdGVsc2UgdGhpcy5lbmFibGVkID0gZmFsc2U7XHJcblxyXG5cdFx0XHRcdFx0dGltZSA9IGRlbHRhVGltZSA+IDAgPyBkdXJhdGlvbiA6IDA7XHJcblxyXG5cdFx0XHRcdFx0dGhpcy50aW1lID0gdGltZTtcclxuXHJcblx0XHRcdFx0XHR0aGlzLl9taXhlci5kaXNwYXRjaEV2ZW50KCB7XHJcblx0XHRcdFx0XHRcdHR5cGU6ICdmaW5pc2hlZCcsIGFjdGlvbjogdGhpcyxcclxuXHRcdFx0XHRcdFx0ZGlyZWN0aW9uOiBkZWx0YVRpbWUgPiAwID8gMSA6IC0gMVxyXG5cdFx0XHRcdFx0fSApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdC8vIGtlZXAgcnVubmluZ1xyXG5cclxuXHRcdFx0XHRcdGlmICggcGVuZGluZyA9PT0gMSApIHtcclxuXHJcblx0XHRcdFx0XHRcdC8vIGVudGVyaW5nIHRoZSBsYXN0IHJvdW5kXHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCBhdFN0YXJ0ID0gZGVsdGFUaW1lIDwgMDtcclxuXHRcdFx0XHRcdFx0dGhpcy5fc2V0RW5kaW5ncyggYXRTdGFydCwgISBhdFN0YXJ0LCBwaW5nUG9uZyApO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHR0aGlzLl9zZXRFbmRpbmdzKCBmYWxzZSwgZmFsc2UsIHBpbmdQb25nICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHRoaXMuX2xvb3BDb3VudCA9IGxvb3BDb3VudDtcclxuXHJcblx0XHRcdFx0XHR0aGlzLnRpbWUgPSB0aW1lO1xyXG5cclxuXHRcdFx0XHRcdHRoaXMuX21peGVyLmRpc3BhdGNoRXZlbnQoIHtcclxuXHRcdFx0XHRcdFx0dHlwZTogJ2xvb3AnLCBhY3Rpb246IHRoaXMsIGxvb3BEZWx0YTogbG9vcERlbHRhXHJcblx0XHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHRoaXMudGltZSA9IHRpbWU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHBpbmdQb25nICYmICggbG9vcENvdW50ICYgMSApID09PSAxICkge1xyXG5cclxuXHRcdFx0XHQvLyBpbnZlcnQgdGltZSBmb3IgdGhlIFwicG9uZyByb3VuZFwiXHJcblxyXG5cdFx0XHRcdHJldHVybiBkdXJhdGlvbiAtIHRpbWU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aW1lO1xyXG5cclxuXHR9XHJcblxyXG5cdF9zZXRFbmRpbmdzKCBhdFN0YXJ0LCBhdEVuZCwgcGluZ1BvbmcgKSB7XHJcblxyXG5cdFx0Y29uc3Qgc2V0dGluZ3MgPSB0aGlzLl9pbnRlcnBvbGFudFNldHRpbmdzO1xyXG5cclxuXHRcdGlmICggcGluZ1BvbmcgKSB7XHJcblxyXG5cdFx0XHRzZXR0aW5ncy5lbmRpbmdTdGFydCA9IFplcm9TbG9wZUVuZGluZztcclxuXHRcdFx0c2V0dGluZ3MuZW5kaW5nRW5kID0gWmVyb1Nsb3BlRW5kaW5nO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHQvLyBhc3N1bWluZyBmb3IgTG9vcE9uY2UgYXRTdGFydCA9PSBhdEVuZCA9PSB0cnVlXHJcblxyXG5cdFx0XHRpZiAoIGF0U3RhcnQgKSB7XHJcblxyXG5cdFx0XHRcdHNldHRpbmdzLmVuZGluZ1N0YXJ0ID0gdGhpcy56ZXJvU2xvcGVBdFN0YXJ0ID8gWmVyb1Nsb3BlRW5kaW5nIDogWmVyb0N1cnZhdHVyZUVuZGluZztcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHNldHRpbmdzLmVuZGluZ1N0YXJ0ID0gV3JhcEFyb3VuZEVuZGluZztcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggYXRFbmQgKSB7XHJcblxyXG5cdFx0XHRcdHNldHRpbmdzLmVuZGluZ0VuZCA9IHRoaXMuemVyb1Nsb3BlQXRFbmQgPyBaZXJvU2xvcGVFbmRpbmcgOiBaZXJvQ3VydmF0dXJlRW5kaW5nO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0c2V0dGluZ3MuZW5kaW5nRW5kIFx0ID0gV3JhcEFyb3VuZEVuZGluZztcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0X3NjaGVkdWxlRmFkaW5nKCBkdXJhdGlvbiwgd2VpZ2h0Tm93LCB3ZWlnaHRUaGVuICkge1xyXG5cclxuXHRcdGNvbnN0IG1peGVyID0gdGhpcy5fbWl4ZXIsIG5vdyA9IG1peGVyLnRpbWU7XHJcblx0XHRsZXQgaW50ZXJwb2xhbnQgPSB0aGlzLl93ZWlnaHRJbnRlcnBvbGFudDtcclxuXHJcblx0XHRpZiAoIGludGVycG9sYW50ID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0aW50ZXJwb2xhbnQgPSBtaXhlci5fbGVuZENvbnRyb2xJbnRlcnBvbGFudCgpO1xyXG5cdFx0XHR0aGlzLl93ZWlnaHRJbnRlcnBvbGFudCA9IGludGVycG9sYW50O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCB0aW1lcyA9IGludGVycG9sYW50LnBhcmFtZXRlclBvc2l0aW9ucyxcclxuXHRcdFx0dmFsdWVzID0gaW50ZXJwb2xhbnQuc2FtcGxlVmFsdWVzO1xyXG5cclxuXHRcdHRpbWVzWyAwIF0gPSBub3c7XHJcblx0XHR2YWx1ZXNbIDAgXSA9IHdlaWdodE5vdztcclxuXHRcdHRpbWVzWyAxIF0gPSBub3cgKyBkdXJhdGlvbjtcclxuXHRcdHZhbHVlc1sgMSBdID0gd2VpZ2h0VGhlbjtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCB7IEFuaW1hdGlvbkFjdGlvbiB9O1xyXG4iLCJpbXBvcnQgeyBBbmltYXRpb25BY3Rpb24gfSBmcm9tICcuL0FuaW1hdGlvbkFjdGlvbi5qcyc7XHJcbmltcG9ydCB7IEV2ZW50RGlzcGF0Y2hlciB9IGZyb20gJy4uL2NvcmUvRXZlbnREaXNwYXRjaGVyLmpzJztcclxuaW1wb3J0IHsgTGluZWFySW50ZXJwb2xhbnQgfSBmcm9tICcuLi9tYXRoL2ludGVycG9sYW50cy9MaW5lYXJJbnRlcnBvbGFudC5qcyc7XHJcbmltcG9ydCB7IFByb3BlcnR5QmluZGluZyB9IGZyb20gJy4vUHJvcGVydHlCaW5kaW5nLmpzJztcclxuaW1wb3J0IHsgUHJvcGVydHlNaXhlciB9IGZyb20gJy4vUHJvcGVydHlNaXhlci5qcyc7XHJcbmltcG9ydCB7IEFuaW1hdGlvbkNsaXAgfSBmcm9tICcuL0FuaW1hdGlvbkNsaXAuanMnO1xyXG5pbXBvcnQgeyBOb3JtYWxBbmltYXRpb25CbGVuZE1vZGUgfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xyXG5cclxuY29uc3QgX2NvbnRyb2xJbnRlcnBvbGFudHNSZXN1bHRCdWZmZXIgPSBuZXcgRmxvYXQzMkFycmF5KCAxICk7XHJcblxyXG4vKipcclxuICogYEFuaW1hdGlvbk1peGVyYCBpcyBhIHBsYXllciBmb3IgYW5pbWF0aW9ucyBvbiBhIHBhcnRpY3VsYXIgb2JqZWN0IGluXHJcbiAqIHRoZSBzY2VuZS4gV2hlbiBtdWx0aXBsZSBvYmplY3RzIGluIHRoZSBzY2VuZSBhcmUgYW5pbWF0ZWQgaW5kZXBlbmRlbnRseSxcclxuICogb25lIGBBbmltYXRpb25NaXhlcmAgbWF5IGJlIHVzZWQgZm9yIGVhY2ggb2JqZWN0LlxyXG4gKi9cclxuY2xhc3MgQW5pbWF0aW9uTWl4ZXIgZXh0ZW5kcyBFdmVudERpc3BhdGNoZXIge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGFuaW1hdGlvbiBtaXhlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0M0R9IHJvb3QgLSBUaGUgb2JqZWN0IHdob3NlIGFuaW1hdGlvbnMgc2hhbGwgYmUgcGxheWVkIGJ5IHRoaXMgbWl4ZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHJvb3QgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHR0aGlzLl9yb290ID0gcm9vdDtcclxuXHRcdHRoaXMuX2luaXRNZW1vcnlNYW5hZ2VyKCk7XHJcblx0XHR0aGlzLl9hY2N1SW5kZXggPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGdsb2JhbCBtaXhlciB0aW1lIChpbiBzZWNvbmRzOyBzdGFydGluZyB3aXRoIGAwYCBvbiB0aGUgbWl4ZXIncyBjcmVhdGlvbikuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50aW1lID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgc2NhbGluZyBmYWN0b3IgZm9yIHRoZSBnbG9iYWwgdGltZS5cclxuXHRcdCAqXHJcblx0XHQgKiBOb3RlOiBTZXR0aW5nIHRoaXMgbWVtYmVyIHRvIGAwYCBhbmQgbGF0ZXIgYmFjayB0byBgMWAgaXMgYVxyXG5cdFx0ICogcG9zc2liaWxpdHkgdG8gcGF1c2UvdW5wYXVzZSBhbGwgYWN0aW9ucyB0aGF0IGFyZSBjb250cm9sbGVkIGJ5IHRoaXNcclxuXHRcdCAqIG1peGVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudGltZVNjYWxlID0gMS4wO1xyXG5cclxuXHR9XHJcblxyXG5cdF9iaW5kQWN0aW9uKCBhY3Rpb24sIHByb3RvdHlwZUFjdGlvbiApIHtcclxuXHJcblx0XHRjb25zdCByb290ID0gYWN0aW9uLl9sb2NhbFJvb3QgfHwgdGhpcy5fcm9vdCxcclxuXHRcdFx0dHJhY2tzID0gYWN0aW9uLl9jbGlwLnRyYWNrcyxcclxuXHRcdFx0blRyYWNrcyA9IHRyYWNrcy5sZW5ndGgsXHJcblx0XHRcdGJpbmRpbmdzID0gYWN0aW9uLl9wcm9wZXJ0eUJpbmRpbmdzLFxyXG5cdFx0XHRpbnRlcnBvbGFudHMgPSBhY3Rpb24uX2ludGVycG9sYW50cyxcclxuXHRcdFx0cm9vdFV1aWQgPSByb290LnV1aWQsXHJcblx0XHRcdGJpbmRpbmdzQnlSb290ID0gdGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lO1xyXG5cclxuXHRcdGxldCBiaW5kaW5nc0J5TmFtZSA9IGJpbmRpbmdzQnlSb290WyByb290VXVpZCBdO1xyXG5cclxuXHRcdGlmICggYmluZGluZ3NCeU5hbWUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGJpbmRpbmdzQnlOYW1lID0ge307XHJcblx0XHRcdGJpbmRpbmdzQnlSb290WyByb290VXVpZCBdID0gYmluZGluZ3NCeU5hbWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSAhPT0gblRyYWNrczsgKysgaSApIHtcclxuXHJcblx0XHRcdGNvbnN0IHRyYWNrID0gdHJhY2tzWyBpIF0sXHJcblx0XHRcdFx0dHJhY2tOYW1lID0gdHJhY2submFtZTtcclxuXHJcblx0XHRcdGxldCBiaW5kaW5nID0gYmluZGluZ3NCeU5hbWVbIHRyYWNrTmFtZSBdO1xyXG5cclxuXHRcdFx0aWYgKCBiaW5kaW5nICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdCsrIGJpbmRpbmcucmVmZXJlbmNlQ291bnQ7XHJcblx0XHRcdFx0YmluZGluZ3NbIGkgXSA9IGJpbmRpbmc7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRiaW5kaW5nID0gYmluZGluZ3NbIGkgXTtcclxuXHJcblx0XHRcdFx0aWYgKCBiaW5kaW5nICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gZXhpc3RpbmcgYmluZGluZywgbWFrZSBzdXJlIHRoZSBjYWNoZSBrbm93c1xyXG5cclxuXHRcdFx0XHRcdGlmICggYmluZGluZy5fY2FjaGVJbmRleCA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHRcdCsrIGJpbmRpbmcucmVmZXJlbmNlQ291bnQ7XHJcblx0XHRcdFx0XHRcdHRoaXMuX2FkZEluYWN0aXZlQmluZGluZyggYmluZGluZywgcm9vdFV1aWQsIHRyYWNrTmFtZSApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRjb250aW51ZTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRjb25zdCBwYXRoID0gcHJvdG90eXBlQWN0aW9uICYmIHByb3RvdHlwZUFjdGlvbi5cclxuXHRcdFx0XHRcdF9wcm9wZXJ0eUJpbmRpbmdzWyBpIF0uYmluZGluZy5wYXJzZWRQYXRoO1xyXG5cclxuXHRcdFx0XHRiaW5kaW5nID0gbmV3IFByb3BlcnR5TWl4ZXIoXHJcblx0XHRcdFx0XHRQcm9wZXJ0eUJpbmRpbmcuY3JlYXRlKCByb290LCB0cmFja05hbWUsIHBhdGggKSxcclxuXHRcdFx0XHRcdHRyYWNrLlZhbHVlVHlwZU5hbWUsIHRyYWNrLmdldFZhbHVlU2l6ZSgpICk7XHJcblxyXG5cdFx0XHRcdCsrIGJpbmRpbmcucmVmZXJlbmNlQ291bnQ7XHJcblx0XHRcdFx0dGhpcy5fYWRkSW5hY3RpdmVCaW5kaW5nKCBiaW5kaW5nLCByb290VXVpZCwgdHJhY2tOYW1lICk7XHJcblxyXG5cdFx0XHRcdGJpbmRpbmdzWyBpIF0gPSBiaW5kaW5nO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aW50ZXJwb2xhbnRzWyBpIF0ucmVzdWx0QnVmZmVyID0gYmluZGluZy5idWZmZXI7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdF9hY3RpdmF0ZUFjdGlvbiggYWN0aW9uICkge1xyXG5cclxuXHRcdGlmICggISB0aGlzLl9pc0FjdGl2ZUFjdGlvbiggYWN0aW9uICkgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGFjdGlvbi5fY2FjaGVJbmRleCA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0Ly8gdGhpcyBhY3Rpb24gaGFzIGJlZW4gZm9yZ290dGVuIGJ5IHRoZSBjYWNoZSwgYnV0IHRoZSB1c2VyXHJcblx0XHRcdFx0Ly8gYXBwZWFycyB0byBiZSBzdGlsbCB1c2luZyBpdCAtPiByZWJpbmRcclxuXHJcblx0XHRcdFx0Y29uc3Qgcm9vdFV1aWQgPSAoIGFjdGlvbi5fbG9jYWxSb290IHx8IHRoaXMuX3Jvb3QgKS51dWlkLFxyXG5cdFx0XHRcdFx0Y2xpcFV1aWQgPSBhY3Rpb24uX2NsaXAudXVpZCxcclxuXHRcdFx0XHRcdGFjdGlvbnNGb3JDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXTtcclxuXHJcblx0XHRcdFx0dGhpcy5fYmluZEFjdGlvbiggYWN0aW9uLFxyXG5cdFx0XHRcdFx0YWN0aW9uc0ZvckNsaXAgJiYgYWN0aW9uc0ZvckNsaXAua25vd25BY3Rpb25zWyAwIF0gKTtcclxuXHJcblx0XHRcdFx0dGhpcy5fYWRkSW5hY3RpdmVBY3Rpb24oIGFjdGlvbiwgY2xpcFV1aWQsIHJvb3RVdWlkICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBiaW5kaW5ncyA9IGFjdGlvbi5fcHJvcGVydHlCaW5kaW5ncztcclxuXHJcblx0XHRcdC8vIGluY3JlbWVudCByZWZlcmVuY2UgY291bnRzIC8gc29ydCBvdXQgc3RhdGVcclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBuID0gYmluZGluZ3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBiaW5kaW5nID0gYmluZGluZ3NbIGkgXTtcclxuXHJcblx0XHRcdFx0aWYgKCBiaW5kaW5nLnVzZUNvdW50ICsrID09PSAwICkge1xyXG5cclxuXHRcdFx0XHRcdHRoaXMuX2xlbmRCaW5kaW5nKCBiaW5kaW5nICk7XHJcblx0XHRcdFx0XHRiaW5kaW5nLnNhdmVPcmlnaW5hbFN0YXRlKCk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuX2xlbmRBY3Rpb24oIGFjdGlvbiApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRfZGVhY3RpdmF0ZUFjdGlvbiggYWN0aW9uICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5faXNBY3RpdmVBY3Rpb24oIGFjdGlvbiApICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYmluZGluZ3MgPSBhY3Rpb24uX3Byb3BlcnR5QmluZGluZ3M7XHJcblxyXG5cdFx0XHQvLyBkZWNyZW1lbnQgcmVmZXJlbmNlIGNvdW50cyAvIHNvcnQgb3V0IHN0YXRlXHJcblx0XHRcdGZvciAoIGxldCBpID0gMCwgbiA9IGJpbmRpbmdzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgYmluZGluZyA9IGJpbmRpbmdzWyBpIF07XHJcblxyXG5cdFx0XHRcdGlmICggLS0gYmluZGluZy51c2VDb3VudCA9PT0gMCApIHtcclxuXHJcblx0XHRcdFx0XHRiaW5kaW5nLnJlc3RvcmVPcmlnaW5hbFN0YXRlKCk7XHJcblx0XHRcdFx0XHR0aGlzLl90YWtlQmFja0JpbmRpbmcoIGJpbmRpbmcgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5fdGFrZUJhY2tBY3Rpb24oIGFjdGlvbiApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvLyBNZW1vcnkgbWFuYWdlclxyXG5cclxuXHRfaW5pdE1lbW9yeU1hbmFnZXIoKSB7XHJcblxyXG5cdFx0dGhpcy5fYWN0aW9ucyA9IFtdOyAvLyAnbkFjdGl2ZUFjdGlvbnMnIGZvbGxvd2VkIGJ5IGluYWN0aXZlIG9uZXNcclxuXHRcdHRoaXMuX25BY3RpdmVBY3Rpb25zID0gMDtcclxuXHJcblx0XHR0aGlzLl9hY3Rpb25zQnlDbGlwID0ge307XHJcblx0XHQvLyBpbnNpZGU6XHJcblx0XHQvLyB7XHJcblx0XHQvLyBcdGtub3duQWN0aW9uczogQXJyYXk8IEFuaW1hdGlvbkFjdGlvbiA+IC0gdXNlZCBhcyBwcm90b3R5cGVzXHJcblx0XHQvLyBcdGFjdGlvbkJ5Um9vdDogQW5pbWF0aW9uQWN0aW9uIC0gbG9va3VwXHJcblx0XHQvLyB9XHJcblxyXG5cclxuXHRcdHRoaXMuX2JpbmRpbmdzID0gW107IC8vICduQWN0aXZlQmluZGluZ3MnIGZvbGxvd2VkIGJ5IGluYWN0aXZlIG9uZXNcclxuXHRcdHRoaXMuX25BY3RpdmVCaW5kaW5ncyA9IDA7XHJcblxyXG5cdFx0dGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lID0ge307IC8vIGluc2lkZTogTWFwPCBuYW1lLCBQcm9wZXJ0eU1peGVyID5cclxuXHJcblxyXG5cdFx0dGhpcy5fY29udHJvbEludGVycG9sYW50cyA9IFtdOyAvLyBzYW1lIGdhbWUgYXMgYWJvdmVcclxuXHRcdHRoaXMuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzID0gMDtcclxuXHJcblx0XHRjb25zdCBzY29wZSA9IHRoaXM7XHJcblxyXG5cdFx0dGhpcy5zdGF0cyA9IHtcclxuXHJcblx0XHRcdGFjdGlvbnM6IHtcclxuXHRcdFx0XHRnZXQgdG90YWwoKSB7XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIHNjb3BlLl9hY3Rpb25zLmxlbmd0aDtcclxuXHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHRnZXQgaW5Vc2UoKSB7XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIHNjb3BlLl9uQWN0aXZlQWN0aW9ucztcclxuXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9LFxyXG5cdFx0XHRiaW5kaW5nczoge1xyXG5cdFx0XHRcdGdldCB0b3RhbCgpIHtcclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gc2NvcGUuX2JpbmRpbmdzLmxlbmd0aDtcclxuXHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHRnZXQgaW5Vc2UoKSB7XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIHNjb3BlLl9uQWN0aXZlQmluZGluZ3M7XHJcblxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSxcclxuXHRcdFx0Y29udHJvbEludGVycG9sYW50czoge1xyXG5cdFx0XHRcdGdldCB0b3RhbCgpIHtcclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gc2NvcGUuX2NvbnRyb2xJbnRlcnBvbGFudHMubGVuZ3RoO1xyXG5cclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdGdldCBpblVzZSgpIHtcclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gc2NvcGUuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzO1xyXG5cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHR9O1xyXG5cclxuXHR9XHJcblxyXG5cdC8vIE1lbW9yeSBtYW5hZ2VtZW50IGZvciBBbmltYXRpb25BY3Rpb24gb2JqZWN0c1xyXG5cclxuXHRfaXNBY3RpdmVBY3Rpb24oIGFjdGlvbiApIHtcclxuXHJcblx0XHRjb25zdCBpbmRleCA9IGFjdGlvbi5fY2FjaGVJbmRleDtcclxuXHRcdHJldHVybiBpbmRleCAhPT0gbnVsbCAmJiBpbmRleCA8IHRoaXMuX25BY3RpdmVBY3Rpb25zO1xyXG5cclxuXHR9XHJcblxyXG5cdF9hZGRJbmFjdGl2ZUFjdGlvbiggYWN0aW9uLCBjbGlwVXVpZCwgcm9vdFV1aWQgKSB7XHJcblxyXG5cdFx0Y29uc3QgYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnMsXHJcblx0XHRcdGFjdGlvbnNCeUNsaXAgPSB0aGlzLl9hY3Rpb25zQnlDbGlwO1xyXG5cclxuXHRcdGxldCBhY3Rpb25zRm9yQ2xpcCA9IGFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07XHJcblxyXG5cdFx0aWYgKCBhY3Rpb25zRm9yQ2xpcCA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0YWN0aW9uc0ZvckNsaXAgPSB7XHJcblxyXG5cdFx0XHRcdGtub3duQWN0aW9uczogWyBhY3Rpb24gXSxcclxuXHRcdFx0XHRhY3Rpb25CeVJvb3Q6IHt9XHJcblxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0YWN0aW9uLl9ieUNsaXBDYWNoZUluZGV4ID0gMDtcclxuXHJcblx0XHRcdGFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF0gPSBhY3Rpb25zRm9yQ2xpcDtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc3Qga25vd25BY3Rpb25zID0gYWN0aW9uc0ZvckNsaXAua25vd25BY3Rpb25zO1xyXG5cclxuXHRcdFx0YWN0aW9uLl9ieUNsaXBDYWNoZUluZGV4ID0ga25vd25BY3Rpb25zLmxlbmd0aDtcclxuXHRcdFx0a25vd25BY3Rpb25zLnB1c2goIGFjdGlvbiApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRhY3Rpb24uX2NhY2hlSW5kZXggPSBhY3Rpb25zLmxlbmd0aDtcclxuXHRcdGFjdGlvbnMucHVzaCggYWN0aW9uICk7XHJcblxyXG5cdFx0YWN0aW9uc0ZvckNsaXAuYWN0aW9uQnlSb290WyByb290VXVpZCBdID0gYWN0aW9uO1xyXG5cclxuXHR9XHJcblxyXG5cdF9yZW1vdmVJbmFjdGl2ZUFjdGlvbiggYWN0aW9uICkge1xyXG5cclxuXHRcdGNvbnN0IGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLFxyXG5cdFx0XHRsYXN0SW5hY3RpdmVBY3Rpb24gPSBhY3Rpb25zWyBhY3Rpb25zLmxlbmd0aCAtIDEgXSxcclxuXHRcdFx0Y2FjaGVJbmRleCA9IGFjdGlvbi5fY2FjaGVJbmRleDtcclxuXHJcblx0XHRsYXN0SW5hY3RpdmVBY3Rpb24uX2NhY2hlSW5kZXggPSBjYWNoZUluZGV4O1xyXG5cdFx0YWN0aW9uc1sgY2FjaGVJbmRleCBdID0gbGFzdEluYWN0aXZlQWN0aW9uO1xyXG5cdFx0YWN0aW9ucy5wb3AoKTtcclxuXHJcblx0XHRhY3Rpb24uX2NhY2hlSW5kZXggPSBudWxsO1xyXG5cclxuXHJcblx0XHRjb25zdCBjbGlwVXVpZCA9IGFjdGlvbi5fY2xpcC51dWlkLFxyXG5cdFx0XHRhY3Rpb25zQnlDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcCxcclxuXHRcdFx0YWN0aW9uc0ZvckNsaXAgPSBhY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdLFxyXG5cdFx0XHRrbm93bkFjdGlvbnNGb3JDbGlwID0gYWN0aW9uc0ZvckNsaXAua25vd25BY3Rpb25zLFxyXG5cclxuXHRcdFx0bGFzdEtub3duQWN0aW9uID1cclxuXHRcdFx0XHRrbm93bkFjdGlvbnNGb3JDbGlwWyBrbm93bkFjdGlvbnNGb3JDbGlwLmxlbmd0aCAtIDEgXSxcclxuXHJcblx0XHRcdGJ5Q2xpcENhY2hlSW5kZXggPSBhY3Rpb24uX2J5Q2xpcENhY2hlSW5kZXg7XHJcblxyXG5cdFx0bGFzdEtub3duQWN0aW9uLl9ieUNsaXBDYWNoZUluZGV4ID0gYnlDbGlwQ2FjaGVJbmRleDtcclxuXHRcdGtub3duQWN0aW9uc0ZvckNsaXBbIGJ5Q2xpcENhY2hlSW5kZXggXSA9IGxhc3RLbm93bkFjdGlvbjtcclxuXHRcdGtub3duQWN0aW9uc0ZvckNsaXAucG9wKCk7XHJcblxyXG5cdFx0YWN0aW9uLl9ieUNsaXBDYWNoZUluZGV4ID0gbnVsbDtcclxuXHJcblxyXG5cdFx0Y29uc3QgYWN0aW9uQnlSb290ID0gYWN0aW9uc0ZvckNsaXAuYWN0aW9uQnlSb290LFxyXG5cdFx0XHRyb290VXVpZCA9ICggYWN0aW9uLl9sb2NhbFJvb3QgfHwgdGhpcy5fcm9vdCApLnV1aWQ7XHJcblxyXG5cdFx0ZGVsZXRlIGFjdGlvbkJ5Um9vdFsgcm9vdFV1aWQgXTtcclxuXHJcblx0XHRpZiAoIGtub3duQWN0aW9uc0ZvckNsaXAubGVuZ3RoID09PSAwICkge1xyXG5cclxuXHRcdFx0ZGVsZXRlIGFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZ3NGb3JBY3Rpb24oIGFjdGlvbiApO1xyXG5cclxuXHR9XHJcblxyXG5cdF9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uKCBhY3Rpb24gKSB7XHJcblxyXG5cdFx0Y29uc3QgYmluZGluZ3MgPSBhY3Rpb24uX3Byb3BlcnR5QmluZGluZ3M7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBuID0gYmluZGluZ3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYmluZGluZyA9IGJpbmRpbmdzWyBpIF07XHJcblxyXG5cdFx0XHRpZiAoIC0tIGJpbmRpbmcucmVmZXJlbmNlQ291bnQgPT09IDAgKSB7XHJcblxyXG5cdFx0XHRcdHRoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZyggYmluZGluZyApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRfbGVuZEFjdGlvbiggYWN0aW9uICkge1xyXG5cclxuXHRcdC8vIFsgYWN0aXZlIGFjdGlvbnMgfCAgaW5hY3RpdmUgYWN0aW9ucyAgXVxyXG5cdFx0Ly8gWyAgYWN0aXZlIGFjdGlvbnMgPnwgaW5hY3RpdmUgYWN0aW9ucyBdXHJcblx0XHQvLyAgICAgICAgICAgICAgICAgcyAgICAgICAgYVxyXG5cdFx0Ly8gICAgICAgICAgICAgICAgICA8LXN3YXAtPlxyXG5cdFx0Ly8gICAgICAgICAgICAgICAgIGEgICAgICAgIHNcclxuXHJcblx0XHRjb25zdCBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucyxcclxuXHRcdFx0cHJldkluZGV4ID0gYWN0aW9uLl9jYWNoZUluZGV4LFxyXG5cclxuXHRcdFx0bGFzdEFjdGl2ZUluZGV4ID0gdGhpcy5fbkFjdGl2ZUFjdGlvbnMgKyssXHJcblxyXG5cdFx0XHRmaXJzdEluYWN0aXZlQWN0aW9uID0gYWN0aW9uc1sgbGFzdEFjdGl2ZUluZGV4IF07XHJcblxyXG5cdFx0YWN0aW9uLl9jYWNoZUluZGV4ID0gbGFzdEFjdGl2ZUluZGV4O1xyXG5cdFx0YWN0aW9uc1sgbGFzdEFjdGl2ZUluZGV4IF0gPSBhY3Rpb247XHJcblxyXG5cdFx0Zmlyc3RJbmFjdGl2ZUFjdGlvbi5fY2FjaGVJbmRleCA9IHByZXZJbmRleDtcclxuXHRcdGFjdGlvbnNbIHByZXZJbmRleCBdID0gZmlyc3RJbmFjdGl2ZUFjdGlvbjtcclxuXHJcblx0fVxyXG5cclxuXHRfdGFrZUJhY2tBY3Rpb24oIGFjdGlvbiApIHtcclxuXHJcblx0XHQvLyBbICBhY3RpdmUgYWN0aW9ucyAgfCBpbmFjdGl2ZSBhY3Rpb25zIF1cclxuXHRcdC8vIFsgYWN0aXZlIGFjdGlvbnMgfDwgaW5hY3RpdmUgYWN0aW9ucyAgXVxyXG5cdFx0Ly8gICAgICAgIGEgICAgICAgIHNcclxuXHRcdC8vICAgICAgICAgPC1zd2FwLT5cclxuXHRcdC8vICAgICAgICBzICAgICAgICBhXHJcblxyXG5cdFx0Y29uc3QgYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnMsXHJcblx0XHRcdHByZXZJbmRleCA9IGFjdGlvbi5fY2FjaGVJbmRleCxcclxuXHJcblx0XHRcdGZpcnN0SW5hY3RpdmVJbmRleCA9IC0tIHRoaXMuX25BY3RpdmVBY3Rpb25zLFxyXG5cclxuXHRcdFx0bGFzdEFjdGl2ZUFjdGlvbiA9IGFjdGlvbnNbIGZpcnN0SW5hY3RpdmVJbmRleCBdO1xyXG5cclxuXHRcdGFjdGlvbi5fY2FjaGVJbmRleCA9IGZpcnN0SW5hY3RpdmVJbmRleDtcclxuXHRcdGFjdGlvbnNbIGZpcnN0SW5hY3RpdmVJbmRleCBdID0gYWN0aW9uO1xyXG5cclxuXHRcdGxhc3RBY3RpdmVBY3Rpb24uX2NhY2hlSW5kZXggPSBwcmV2SW5kZXg7XHJcblx0XHRhY3Rpb25zWyBwcmV2SW5kZXggXSA9IGxhc3RBY3RpdmVBY3Rpb247XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gTWVtb3J5IG1hbmFnZW1lbnQgZm9yIFByb3BlcnR5TWl4ZXIgb2JqZWN0c1xyXG5cclxuXHRfYWRkSW5hY3RpdmVCaW5kaW5nKCBiaW5kaW5nLCByb290VXVpZCwgdHJhY2tOYW1lICkge1xyXG5cclxuXHRcdGNvbnN0IGJpbmRpbmdzQnlSb290ID0gdGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lLFxyXG5cdFx0XHRiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzO1xyXG5cclxuXHRcdGxldCBiaW5kaW5nQnlOYW1lID0gYmluZGluZ3NCeVJvb3RbIHJvb3RVdWlkIF07XHJcblxyXG5cdFx0aWYgKCBiaW5kaW5nQnlOYW1lID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRiaW5kaW5nQnlOYW1lID0ge307XHJcblx0XHRcdGJpbmRpbmdzQnlSb290WyByb290VXVpZCBdID0gYmluZGluZ0J5TmFtZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0YmluZGluZ0J5TmFtZVsgdHJhY2tOYW1lIF0gPSBiaW5kaW5nO1xyXG5cclxuXHRcdGJpbmRpbmcuX2NhY2hlSW5kZXggPSBiaW5kaW5ncy5sZW5ndGg7XHJcblx0XHRiaW5kaW5ncy5wdXNoKCBiaW5kaW5nICk7XHJcblxyXG5cdH1cclxuXHJcblx0X3JlbW92ZUluYWN0aXZlQmluZGluZyggYmluZGluZyApIHtcclxuXHJcblx0XHRjb25zdCBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxyXG5cdFx0XHRwcm9wQmluZGluZyA9IGJpbmRpbmcuYmluZGluZyxcclxuXHRcdFx0cm9vdFV1aWQgPSBwcm9wQmluZGluZy5yb290Tm9kZS51dWlkLFxyXG5cdFx0XHR0cmFja05hbWUgPSBwcm9wQmluZGluZy5wYXRoLFxyXG5cdFx0XHRiaW5kaW5nc0J5Um9vdCA9IHRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZSxcclxuXHRcdFx0YmluZGluZ0J5TmFtZSA9IGJpbmRpbmdzQnlSb290WyByb290VXVpZCBdLFxyXG5cclxuXHRcdFx0bGFzdEluYWN0aXZlQmluZGluZyA9IGJpbmRpbmdzWyBiaW5kaW5ncy5sZW5ndGggLSAxIF0sXHJcblx0XHRcdGNhY2hlSW5kZXggPSBiaW5kaW5nLl9jYWNoZUluZGV4O1xyXG5cclxuXHRcdGxhc3RJbmFjdGl2ZUJpbmRpbmcuX2NhY2hlSW5kZXggPSBjYWNoZUluZGV4O1xyXG5cdFx0YmluZGluZ3NbIGNhY2hlSW5kZXggXSA9IGxhc3RJbmFjdGl2ZUJpbmRpbmc7XHJcblx0XHRiaW5kaW5ncy5wb3AoKTtcclxuXHJcblx0XHRkZWxldGUgYmluZGluZ0J5TmFtZVsgdHJhY2tOYW1lIF07XHJcblxyXG5cdFx0aWYgKCBPYmplY3Qua2V5cyggYmluZGluZ0J5TmFtZSApLmxlbmd0aCA9PT0gMCApIHtcclxuXHJcblx0XHRcdGRlbGV0ZSBiaW5kaW5nc0J5Um9vdFsgcm9vdFV1aWQgXTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0X2xlbmRCaW5kaW5nKCBiaW5kaW5nICkge1xyXG5cclxuXHRcdGNvbnN0IGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsXHJcblx0XHRcdHByZXZJbmRleCA9IGJpbmRpbmcuX2NhY2hlSW5kZXgsXHJcblxyXG5cdFx0XHRsYXN0QWN0aXZlSW5kZXggPSB0aGlzLl9uQWN0aXZlQmluZGluZ3MgKyssXHJcblxyXG5cdFx0XHRmaXJzdEluYWN0aXZlQmluZGluZyA9IGJpbmRpbmdzWyBsYXN0QWN0aXZlSW5kZXggXTtcclxuXHJcblx0XHRiaW5kaW5nLl9jYWNoZUluZGV4ID0gbGFzdEFjdGl2ZUluZGV4O1xyXG5cdFx0YmluZGluZ3NbIGxhc3RBY3RpdmVJbmRleCBdID0gYmluZGluZztcclxuXHJcblx0XHRmaXJzdEluYWN0aXZlQmluZGluZy5fY2FjaGVJbmRleCA9IHByZXZJbmRleDtcclxuXHRcdGJpbmRpbmdzWyBwcmV2SW5kZXggXSA9IGZpcnN0SW5hY3RpdmVCaW5kaW5nO1xyXG5cclxuXHR9XHJcblxyXG5cdF90YWtlQmFja0JpbmRpbmcoIGJpbmRpbmcgKSB7XHJcblxyXG5cdFx0Y29uc3QgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncyxcclxuXHRcdFx0cHJldkluZGV4ID0gYmluZGluZy5fY2FjaGVJbmRleCxcclxuXHJcblx0XHRcdGZpcnN0SW5hY3RpdmVJbmRleCA9IC0tIHRoaXMuX25BY3RpdmVCaW5kaW5ncyxcclxuXHJcblx0XHRcdGxhc3RBY3RpdmVCaW5kaW5nID0gYmluZGluZ3NbIGZpcnN0SW5hY3RpdmVJbmRleCBdO1xyXG5cclxuXHRcdGJpbmRpbmcuX2NhY2hlSW5kZXggPSBmaXJzdEluYWN0aXZlSW5kZXg7XHJcblx0XHRiaW5kaW5nc1sgZmlyc3RJbmFjdGl2ZUluZGV4IF0gPSBiaW5kaW5nO1xyXG5cclxuXHRcdGxhc3RBY3RpdmVCaW5kaW5nLl9jYWNoZUluZGV4ID0gcHJldkluZGV4O1xyXG5cdFx0YmluZGluZ3NbIHByZXZJbmRleCBdID0gbGFzdEFjdGl2ZUJpbmRpbmc7XHJcblxyXG5cdH1cclxuXHJcblxyXG5cdC8vIE1lbW9yeSBtYW5hZ2VtZW50IG9mIEludGVycG9sYW50cyBmb3Igd2VpZ2h0IGFuZCB0aW1lIHNjYWxlXHJcblxyXG5cdF9sZW5kQ29udHJvbEludGVycG9sYW50KCkge1xyXG5cclxuXHRcdGNvbnN0IGludGVycG9sYW50cyA9IHRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHMsXHJcblx0XHRcdGxhc3RBY3RpdmVJbmRleCA9IHRoaXMuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzICsrO1xyXG5cclxuXHRcdGxldCBpbnRlcnBvbGFudCA9IGludGVycG9sYW50c1sgbGFzdEFjdGl2ZUluZGV4IF07XHJcblxyXG5cdFx0aWYgKCBpbnRlcnBvbGFudCA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0aW50ZXJwb2xhbnQgPSBuZXcgTGluZWFySW50ZXJwb2xhbnQoXHJcblx0XHRcdFx0bmV3IEZsb2F0MzJBcnJheSggMiApLCBuZXcgRmxvYXQzMkFycmF5KCAyICksXHJcblx0XHRcdFx0MSwgX2NvbnRyb2xJbnRlcnBvbGFudHNSZXN1bHRCdWZmZXIgKTtcclxuXHJcblx0XHRcdGludGVycG9sYW50Ll9fY2FjaGVJbmRleCA9IGxhc3RBY3RpdmVJbmRleDtcclxuXHRcdFx0aW50ZXJwb2xhbnRzWyBsYXN0QWN0aXZlSW5kZXggXSA9IGludGVycG9sYW50O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gaW50ZXJwb2xhbnQ7XHJcblxyXG5cdH1cclxuXHJcblx0X3Rha2VCYWNrQ29udHJvbEludGVycG9sYW50KCBpbnRlcnBvbGFudCApIHtcclxuXHJcblx0XHRjb25zdCBpbnRlcnBvbGFudHMgPSB0aGlzLl9jb250cm9sSW50ZXJwb2xhbnRzLFxyXG5cdFx0XHRwcmV2SW5kZXggPSBpbnRlcnBvbGFudC5fX2NhY2hlSW5kZXgsXHJcblxyXG5cdFx0XHRmaXJzdEluYWN0aXZlSW5kZXggPSAtLSB0aGlzLl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50cyxcclxuXHJcblx0XHRcdGxhc3RBY3RpdmVJbnRlcnBvbGFudCA9IGludGVycG9sYW50c1sgZmlyc3RJbmFjdGl2ZUluZGV4IF07XHJcblxyXG5cdFx0aW50ZXJwb2xhbnQuX19jYWNoZUluZGV4ID0gZmlyc3RJbmFjdGl2ZUluZGV4O1xyXG5cdFx0aW50ZXJwb2xhbnRzWyBmaXJzdEluYWN0aXZlSW5kZXggXSA9IGludGVycG9sYW50O1xyXG5cclxuXHRcdGxhc3RBY3RpdmVJbnRlcnBvbGFudC5fX2NhY2hlSW5kZXggPSBwcmV2SW5kZXg7XHJcblx0XHRpbnRlcnBvbGFudHNbIHByZXZJbmRleCBdID0gbGFzdEFjdGl2ZUludGVycG9sYW50O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEFuaW1hdGlvbkFjdGlvbn0gZm9yIHRoZSBwYXNzZWQgY2xpcC5cclxuXHQgKlxyXG5cdCAqIElmIGFuIGFjdGlvbiBmaXR0aW5nIHRoZSBjbGlwIGFuZCByb290IHBhcmFtZXRlcnMgZG9lc24ndCB5ZXQgZXhpc3QsIGl0XHJcblx0ICogd2lsbCBiZSBjcmVhdGVkIGJ5IHRoaXMgbWV0aG9kLiBDYWxsaW5nIHRoaXMgbWV0aG9kIHNldmVyYWwgdGltZXMgd2l0aCB0aGVcclxuXHQgKiBzYW1lIGNsaXAgYW5kIHJvb3QgcGFyYW1ldGVycyBhbHdheXMgcmV0dXJucyB0aGUgc2FtZSBhY3Rpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FuaW1hdGlvbkNsaXB8c3RyaW5nfSBjbGlwIC0gQW4gYW5pbWF0aW9uIGNsaXAgb3IgYWx0ZXJuYXRpdmVseSB0aGUgbmFtZSBvZiB0aGUgYW5pbWF0aW9uIGNsaXAuXHJcblx0ICogQHBhcmFtIHtPYmplY3QzRH0gW29wdGlvbmFsUm9vdF0gLSBBbiBhbHRlcm5hdGl2ZSByb290IG9iamVjdC5cclxuXHQgKiBAcGFyYW0geyhOb3JtYWxBbmltYXRpb25CbGVuZE1vZGV8QWRkaXRpdmVBbmltYXRpb25CbGVuZE1vZGUpfSBbYmxlbmRNb2RlXSAtIFRoZSBibGVuZCBtb2RlLlxyXG5cdCAqIEByZXR1cm4gez9BbmltYXRpb25BY3Rpb259IFRoZSBhbmltYXRpb24gYWN0aW9uLlxyXG5cdCAqL1xyXG5cdGNsaXBBY3Rpb24oIGNsaXAsIG9wdGlvbmFsUm9vdCwgYmxlbmRNb2RlICkge1xyXG5cclxuXHRcdGNvbnN0IHJvb3QgPSBvcHRpb25hbFJvb3QgfHwgdGhpcy5fcm9vdCxcclxuXHRcdFx0cm9vdFV1aWQgPSByb290LnV1aWQ7XHJcblxyXG5cdFx0bGV0IGNsaXBPYmplY3QgPSB0eXBlb2YgY2xpcCA9PT0gJ3N0cmluZycgPyBBbmltYXRpb25DbGlwLmZpbmRCeU5hbWUoIHJvb3QsIGNsaXAgKSA6IGNsaXA7XHJcblxyXG5cdFx0Y29uc3QgY2xpcFV1aWQgPSBjbGlwT2JqZWN0ICE9PSBudWxsID8gY2xpcE9iamVjdC51dWlkIDogY2xpcDtcclxuXHJcblx0XHRjb25zdCBhY3Rpb25zRm9yQ2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07XHJcblx0XHRsZXQgcHJvdG90eXBlQWN0aW9uID0gbnVsbDtcclxuXHJcblx0XHRpZiAoIGJsZW5kTW9kZSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0aWYgKCBjbGlwT2JqZWN0ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRibGVuZE1vZGUgPSBjbGlwT2JqZWN0LmJsZW5kTW9kZTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGJsZW5kTW9kZSA9IE5vcm1hbEFuaW1hdGlvbkJsZW5kTW9kZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBhY3Rpb25zRm9yQ2xpcCAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Y29uc3QgZXhpc3RpbmdBY3Rpb24gPSBhY3Rpb25zRm9yQ2xpcC5hY3Rpb25CeVJvb3RbIHJvb3RVdWlkIF07XHJcblxyXG5cdFx0XHRpZiAoIGV4aXN0aW5nQWN0aW9uICE9PSB1bmRlZmluZWQgJiYgZXhpc3RpbmdBY3Rpb24uYmxlbmRNb2RlID09PSBibGVuZE1vZGUgKSB7XHJcblxyXG5cdFx0XHRcdHJldHVybiBleGlzdGluZ0FjdGlvbjtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIHdlIGtub3cgdGhlIGNsaXAsIHNvIHdlIGRvbid0IGhhdmUgdG8gcGFyc2UgYWxsXHJcblx0XHRcdC8vIHRoZSBiaW5kaW5ncyBhZ2FpbiBidXQgY2FuIGp1c3QgY29weVxyXG5cdFx0XHRwcm90b3R5cGVBY3Rpb24gPSBhY3Rpb25zRm9yQ2xpcC5rbm93bkFjdGlvbnNbIDAgXTtcclxuXHJcblx0XHRcdC8vIGFsc28sIHRha2UgdGhlIGNsaXAgZnJvbSB0aGUgcHJvdG90eXBlIGFjdGlvblxyXG5cdFx0XHRpZiAoIGNsaXBPYmplY3QgPT09IG51bGwgKVxyXG5cdFx0XHRcdGNsaXBPYmplY3QgPSBwcm90b3R5cGVBY3Rpb24uX2NsaXA7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGNsaXAgbXVzdCBiZSBrbm93biB3aGVuIHNwZWNpZmllZCB2aWEgc3RyaW5nXHJcblx0XHRpZiAoIGNsaXBPYmplY3QgPT09IG51bGwgKSByZXR1cm4gbnVsbDtcclxuXHJcblx0XHQvLyBhbGxvY2F0ZSBhbGwgcmVzb3VyY2VzIHJlcXVpcmVkIHRvIHJ1biBpdFxyXG5cdFx0Y29uc3QgbmV3QWN0aW9uID0gbmV3IEFuaW1hdGlvbkFjdGlvbiggdGhpcywgY2xpcE9iamVjdCwgb3B0aW9uYWxSb290LCBibGVuZE1vZGUgKTtcclxuXHJcblx0XHR0aGlzLl9iaW5kQWN0aW9uKCBuZXdBY3Rpb24sIHByb3RvdHlwZUFjdGlvbiApO1xyXG5cclxuXHRcdC8vIGFuZCBtYWtlIHRoZSBhY3Rpb24ga25vd24gdG8gdGhlIG1lbW9yeSBtYW5hZ2VyXHJcblx0XHR0aGlzLl9hZGRJbmFjdGl2ZUFjdGlvbiggbmV3QWN0aW9uLCBjbGlwVXVpZCwgcm9vdFV1aWQgKTtcclxuXHJcblx0XHRyZXR1cm4gbmV3QWN0aW9uO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYW4gZXhpc3RpbmcgYW5pbWF0aW9uIGFjdGlvbiBmb3IgdGhlIHBhc3NlZCBjbGlwLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBbmltYXRpb25DbGlwfHN0cmluZ30gY2xpcCAtIEFuIGFuaW1hdGlvbiBjbGlwIG9yIGFsdGVybmF0aXZlbHkgdGhlIG5hbWUgb2YgdGhlIGFuaW1hdGlvbiBjbGlwLlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0M0R9IFtvcHRpb25hbFJvb3RdIC0gQW4gYWx0ZXJuYXRpdmUgcm9vdCBvYmplY3QuXHJcblx0ICogQHJldHVybiB7P0FuaW1hdGlvbkFjdGlvbn0gVGhlIGFuaW1hdGlvbiBhY3Rpb24uIFJldHVybnMgYG51bGxgIGlmIG5vIGFjdGlvbiB3YXMgZm91bmQuXHJcblx0ICovXHJcblx0ZXhpc3RpbmdBY3Rpb24oIGNsaXAsIG9wdGlvbmFsUm9vdCApIHtcclxuXHJcblx0XHRjb25zdCByb290ID0gb3B0aW9uYWxSb290IHx8IHRoaXMuX3Jvb3QsXHJcblx0XHRcdHJvb3RVdWlkID0gcm9vdC51dWlkLFxyXG5cclxuXHRcdFx0Y2xpcE9iamVjdCA9IHR5cGVvZiBjbGlwID09PSAnc3RyaW5nJyA/XHJcblx0XHRcdFx0QW5pbWF0aW9uQ2xpcC5maW5kQnlOYW1lKCByb290LCBjbGlwICkgOiBjbGlwLFxyXG5cclxuXHRcdFx0Y2xpcFV1aWQgPSBjbGlwT2JqZWN0ID8gY2xpcE9iamVjdC51dWlkIDogY2xpcCxcclxuXHJcblx0XHRcdGFjdGlvbnNGb3JDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXTtcclxuXHJcblx0XHRpZiAoIGFjdGlvbnNGb3JDbGlwICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gYWN0aW9uc0ZvckNsaXAuYWN0aW9uQnlSb290WyByb290VXVpZCBdIHx8IG51bGw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBudWxsO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlYWN0aXZhdGVzIGFsbCBwcmV2aW91c2x5IHNjaGVkdWxlZCBhY3Rpb25zIG9uIHRoaXMgbWl4ZXIuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtBbmltYXRpb25NaXhlcn0gQSByZWZlcmVuY2UgdG8gdGhpIGFuaW1hdGlvbiBtaXhlci5cclxuXHQgKi9cclxuXHRzdG9wQWxsQWN0aW9uKCkge1xyXG5cclxuXHRcdGNvbnN0IGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLFxyXG5cdFx0XHRuQWN0aW9ucyA9IHRoaXMuX25BY3RpdmVBY3Rpb25zO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gbkFjdGlvbnMgLSAxOyBpID49IDA7IC0tIGkgKSB7XHJcblxyXG5cdFx0XHRhY3Rpb25zWyBpIF0uc3RvcCgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZHZhbmNlcyB0aGUgZ2xvYmFsIG1peGVyIHRpbWUgYW5kIHVwZGF0ZXMgdGhlIGFuaW1hdGlvbi5cclxuXHQgKlxyXG5cdCAqIFRoaXMgaXMgdXN1YWxseSBkb25lIGluIHRoZSByZW5kZXIgbG9vcCBieSBwYXNzaW5nIHRoZSBkZWx0YVxyXG5cdCAqIHRpbWUgZnJvbSB7QGxpbmsgQ2xvY2t9IG9yIHtAbGluayBUaW1lcn0uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZGVsdGFUaW1lIC0gVGhlIGRlbHRhIHRpbWUgaW4gc2Vjb25kcy5cclxuXHQgKiBAcmV0dXJuIHtBbmltYXRpb25NaXhlcn0gQSByZWZlcmVuY2UgdG8gdGhpIGFuaW1hdGlvbiBtaXhlci5cclxuXHQgKi9cclxuXHR1cGRhdGUoIGRlbHRhVGltZSApIHtcclxuXHJcblx0XHRkZWx0YVRpbWUgKj0gdGhpcy50aW1lU2NhbGU7XHJcblxyXG5cdFx0Y29uc3QgYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnMsXHJcblx0XHRcdG5BY3Rpb25zID0gdGhpcy5fbkFjdGl2ZUFjdGlvbnMsXHJcblxyXG5cdFx0XHR0aW1lID0gdGhpcy50aW1lICs9IGRlbHRhVGltZSxcclxuXHRcdFx0dGltZURpcmVjdGlvbiA9IE1hdGguc2lnbiggZGVsdGFUaW1lICksXHJcblxyXG5cdFx0XHRhY2N1SW5kZXggPSB0aGlzLl9hY2N1SW5kZXggXj0gMTtcclxuXHJcblx0XHQvLyBydW4gYWN0aXZlIGFjdGlvbnNcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgIT09IG5BY3Rpb25zOyArKyBpICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYWN0aW9uID0gYWN0aW9uc1sgaSBdO1xyXG5cclxuXHRcdFx0YWN0aW9uLl91cGRhdGUoIHRpbWUsIGRlbHRhVGltZSwgdGltZURpcmVjdGlvbiwgYWNjdUluZGV4ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIHVwZGF0ZSBzY2VuZSBncmFwaFxyXG5cclxuXHRcdGNvbnN0IGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsXHJcblx0XHRcdG5CaW5kaW5ncyA9IHRoaXMuX25BY3RpdmVCaW5kaW5ncztcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgIT09IG5CaW5kaW5nczsgKysgaSApIHtcclxuXHJcblx0XHRcdGJpbmRpbmdzWyBpIF0uYXBwbHkoIGFjY3VJbmRleCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBnbG9iYWwgbWl4ZXIgdG8gYSBzcGVjaWZpYyB0aW1lIGFuZCB1cGRhdGVzIHRoZSBhbmltYXRpb24gYWNjb3JkaW5nbHkuXHJcblx0ICpcclxuXHQgKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHlvdSBuZWVkIHRvIGp1bXAgdG8gYW4gZXhhY3QgdGltZSBpbiBhbiBhbmltYXRpb24uIFRoZVxyXG5cdCAqIGlucHV0IHBhcmFtZXRlciB3aWxsIGJlIHNjYWxlZCBieSB7QGxpbmsgQW5pbWF0aW9uTWl4ZXIjdGltZVNjYWxlfVxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHRpbWUgLSBUaGUgdGltZSB0byBzZXQgaW4gc2Vjb25kcy5cclxuXHQgKiBAcmV0dXJuIHtBbmltYXRpb25NaXhlcn0gQSByZWZlcmVuY2UgdG8gdGhpIGFuaW1hdGlvbiBtaXhlci5cclxuXHQgKi9cclxuXHRzZXRUaW1lKCB0aW1lICkge1xyXG5cclxuXHRcdHRoaXMudGltZSA9IDA7IC8vIFplcm8gb3V0IHRpbWUgYXR0cmlidXRlIGZvciBBbmltYXRpb25NaXhlciBvYmplY3Q7XHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB0aGlzLl9hY3Rpb25zLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdHRoaXMuX2FjdGlvbnNbIGkgXS50aW1lID0gMDsgLy8gWmVybyBvdXQgdGltZSBhdHRyaWJ1dGUgZm9yIGFsbCBhc3NvY2lhdGVkIEFuaW1hdGlvbkFjdGlvbiBvYmplY3RzLlxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcy51cGRhdGUoIHRpbWUgKTsgLy8gVXBkYXRlIHVzZWQgdG8gc2V0IGV4YWN0IHRpbWUuIFJldHVybnMgXCJ0aGlzXCIgQW5pbWF0aW9uTWl4ZXIgb2JqZWN0LlxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhpcyBtaXhlcidzIHJvb3Qgb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7T2JqZWN0M0R9IFRoZSBtaXhlcidzIHJvb3Qgb2JqZWN0LlxyXG5cdCAqL1xyXG5cdGdldFJvb3QoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX3Jvb3Q7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVhbGxvY2F0ZXMgYWxsIG1lbW9yeSByZXNvdXJjZXMgZm9yIGEgY2xpcC4gQmVmb3JlIHVzaW5nIHRoaXMgbWV0aG9kIG1ha2VcclxuXHQgKiBzdXJlIHRvIGNhbGwge0BsaW5rIEFuaW1hdGlvbkFjdGlvbiNzdG9wfSBmb3IgYWxsIHJlbGF0ZWQgYWN0aW9ucy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QW5pbWF0aW9uQ2xpcH0gY2xpcCAtIFRoZSBjbGlwIHRvIHVuY2FjaGUuXHJcblx0ICovXHJcblx0dW5jYWNoZUNsaXAoIGNsaXAgKSB7XHJcblxyXG5cdFx0Y29uc3QgYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnMsXHJcblx0XHRcdGNsaXBVdWlkID0gY2xpcC51dWlkLFxyXG5cdFx0XHRhY3Rpb25zQnlDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcCxcclxuXHRcdFx0YWN0aW9uc0ZvckNsaXAgPSBhY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdO1xyXG5cclxuXHRcdGlmICggYWN0aW9uc0ZvckNsaXAgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdC8vIG5vdGU6IGp1c3QgY2FsbGluZyBfcmVtb3ZlSW5hY3RpdmVBY3Rpb24gd291bGQgbWVzcyB1cCB0aGVcclxuXHRcdFx0Ly8gaXRlcmF0aW9uIHN0YXRlIGFuZCBhbHNvIHJlcXVpcmUgdXBkYXRpbmcgdGhlIHN0YXRlIHdlIGNhblxyXG5cdFx0XHQvLyBqdXN0IHRocm93IGF3YXlcclxuXHJcblx0XHRcdGNvbnN0IGFjdGlvbnNUb1JlbW92ZSA9IGFjdGlvbnNGb3JDbGlwLmtub3duQWN0aW9ucztcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMCwgbiA9IGFjdGlvbnNUb1JlbW92ZS5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGFjdGlvbiA9IGFjdGlvbnNUb1JlbW92ZVsgaSBdO1xyXG5cclxuXHRcdFx0XHR0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKCBhY3Rpb24gKTtcclxuXHJcblx0XHRcdFx0Y29uc3QgY2FjaGVJbmRleCA9IGFjdGlvbi5fY2FjaGVJbmRleCxcclxuXHRcdFx0XHRcdGxhc3RJbmFjdGl2ZUFjdGlvbiA9IGFjdGlvbnNbIGFjdGlvbnMubGVuZ3RoIC0gMSBdO1xyXG5cclxuXHRcdFx0XHRhY3Rpb24uX2NhY2hlSW5kZXggPSBudWxsO1xyXG5cdFx0XHRcdGFjdGlvbi5fYnlDbGlwQ2FjaGVJbmRleCA9IG51bGw7XHJcblxyXG5cdFx0XHRcdGxhc3RJbmFjdGl2ZUFjdGlvbi5fY2FjaGVJbmRleCA9IGNhY2hlSW5kZXg7XHJcblx0XHRcdFx0YWN0aW9uc1sgY2FjaGVJbmRleCBdID0gbGFzdEluYWN0aXZlQWN0aW9uO1xyXG5cdFx0XHRcdGFjdGlvbnMucG9wKCk7XHJcblxyXG5cdFx0XHRcdHRoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZ3NGb3JBY3Rpb24oIGFjdGlvbiApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZGVsZXRlIGFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlYWxsb2NhdGVzIGFsbCBtZW1vcnkgcmVzb3VyY2VzIGZvciBhIHJvb3Qgb2JqZWN0LiBCZWZvcmUgdXNpbmcgdGhpc1xyXG5cdCAqIG1ldGhvZCBtYWtlIHN1cmUgdG8gY2FsbCB7QGxpbmsgQW5pbWF0aW9uQWN0aW9uI3N0b3B9IGZvciBhbGwgcmVsYXRlZFxyXG5cdCAqIGFjdGlvbnMgb3IgYWx0ZXJuYXRpdmVseSB7QGxpbmsgQW5pbWF0aW9uTWl4ZXIjc3RvcEFsbEFjdGlvbn0gd2hlbiB0aGVcclxuXHQgKiBtaXhlciBvcGVyYXRlcyBvbiBhIHNpbmdsZSByb290LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3QzRH0gcm9vdCAtIFRoZSByb290IG9iamVjdCB0byB1bmNhY2hlLlxyXG5cdCAqL1xyXG5cdHVuY2FjaGVSb290KCByb290ICkge1xyXG5cclxuXHRcdGNvbnN0IHJvb3RVdWlkID0gcm9vdC51dWlkLFxyXG5cdFx0XHRhY3Rpb25zQnlDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcDtcclxuXHJcblx0XHRmb3IgKCBjb25zdCBjbGlwVXVpZCBpbiBhY3Rpb25zQnlDbGlwICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYWN0aW9uQnlSb290ID0gYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXS5hY3Rpb25CeVJvb3QsXHJcblx0XHRcdFx0YWN0aW9uID0gYWN0aW9uQnlSb290WyByb290VXVpZCBdO1xyXG5cclxuXHRcdFx0aWYgKCBhY3Rpb24gIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5fZGVhY3RpdmF0ZUFjdGlvbiggYWN0aW9uICk7XHJcblx0XHRcdFx0dGhpcy5fcmVtb3ZlSW5hY3RpdmVBY3Rpb24oIGFjdGlvbiApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBiaW5kaW5nc0J5Um9vdCA9IHRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZSxcclxuXHRcdFx0YmluZGluZ0J5TmFtZSA9IGJpbmRpbmdzQnlSb290WyByb290VXVpZCBdO1xyXG5cclxuXHRcdGlmICggYmluZGluZ0J5TmFtZSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Zm9yICggY29uc3QgdHJhY2tOYW1lIGluIGJpbmRpbmdCeU5hbWUgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGJpbmRpbmcgPSBiaW5kaW5nQnlOYW1lWyB0cmFja05hbWUgXTtcclxuXHRcdFx0XHRiaW5kaW5nLnJlc3RvcmVPcmlnaW5hbFN0YXRlKCk7XHJcblx0XHRcdFx0dGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nKCBiaW5kaW5nICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlYWxsb2NhdGVzIGFsbCBtZW1vcnkgcmVzb3VyY2VzIGZvciBhbiBhY3Rpb24uIFRoZSBhY3Rpb24gaXMgaWRlbnRpZmllZCBieSB0aGVcclxuXHQgKiBnaXZlbiBjbGlwIGFuZCBhbiBvcHRpb25hbCByb290IG9iamVjdC4gQmVmb3JlIHVzaW5nIHRoaXMgbWV0aG9kIG1ha2VcclxuXHQgKiBzdXJlIHRvIGNhbGwge0BsaW5rIEFuaW1hdGlvbkFjdGlvbiNzdG9wfSB0byBkZWFjdGl2YXRlIHRoZSBhY3Rpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FuaW1hdGlvbkNsaXB8c3RyaW5nfSBjbGlwIC0gQW4gYW5pbWF0aW9uIGNsaXAgb3IgYWx0ZXJuYXRpdmVseSB0aGUgbmFtZSBvZiB0aGUgYW5pbWF0aW9uIGNsaXAuXHJcblx0ICogQHBhcmFtIHtPYmplY3QzRH0gW29wdGlvbmFsUm9vdF0gLSBBbiBhbHRlcm5hdGl2ZSByb290IG9iamVjdC5cclxuXHQgKi9cclxuXHR1bmNhY2hlQWN0aW9uKCBjbGlwLCBvcHRpb25hbFJvb3QgKSB7XHJcblxyXG5cdFx0Y29uc3QgYWN0aW9uID0gdGhpcy5leGlzdGluZ0FjdGlvbiggY2xpcCwgb3B0aW9uYWxSb290ICk7XHJcblxyXG5cdFx0aWYgKCBhY3Rpb24gIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKCBhY3Rpb24gKTtcclxuXHRcdFx0dGhpcy5fcmVtb3ZlSW5hY3RpdmVBY3Rpb24oIGFjdGlvbiApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgQW5pbWF0aW9uTWl4ZXIgfTtcclxuIiwiaW1wb3J0IHsgUmVuZGVyVGFyZ2V0IH0gZnJvbSAnLi9SZW5kZXJUYXJnZXQuanMnO1xyXG5pbXBvcnQgeyBEYXRhM0RUZXh0dXJlIH0gZnJvbSAnLi4vdGV4dHVyZXMvRGF0YTNEVGV4dHVyZS5qcyc7XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyBhIDNEIHJlbmRlciB0YXJnZXQuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBSZW5kZXJUYXJnZXRcclxuICovXHJcbmNsYXNzIFJlbmRlclRhcmdldDNEIGV4dGVuZHMgUmVuZGVyVGFyZ2V0IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyAzRCByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt3aWR0aD0xXSAtIFRoZSB3aWR0aCBvZiB0aGUgcmVuZGVyIHRhcmdldC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2hlaWdodD0xXSAtIFRoZSBoZWlnaHQgb2YgdGhlIHJlbmRlciB0YXJnZXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtkZXB0aD0xXSAtIFRoZSBoZWlnaHQgb2YgdGhlIHJlbmRlciB0YXJnZXQuXHJcblx0ICogQHBhcmFtIHtSZW5kZXJUYXJnZXR+T3B0aW9uc30gW29wdGlvbnNdIC0gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCB3aWR0aCA9IDEsIGhlaWdodCA9IDEsIGRlcHRoID0gMSwgb3B0aW9ucyA9IHt9ICkge1xyXG5cclxuXHRcdHN1cGVyKCB3aWR0aCwgaGVpZ2h0LCBvcHRpb25zICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzUmVuZGVyVGFyZ2V0M0QgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMuZGVwdGggPSBkZXB0aDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIE92ZXJ3cml0dGVuIHdpdGggYSBkaWZmZXJlbnQgdGV4dHVyZSB0eXBlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtEYXRhM0RUZXh0dXJlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRleHR1cmUgPSBuZXcgRGF0YTNEVGV4dHVyZSggbnVsbCwgd2lkdGgsIGhlaWdodCwgZGVwdGggKTtcclxuXHJcblx0XHR0aGlzLnRleHR1cmUuaXNSZW5kZXJUYXJnZXRUZXh0dXJlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgUmVuZGVyVGFyZ2V0M0QgfTtcclxuIiwiaW1wb3J0IHsgUmVuZGVyVGFyZ2V0IH0gZnJvbSAnLi9SZW5kZXJUYXJnZXQuanMnO1xyXG5pbXBvcnQgeyBEYXRhQXJyYXlUZXh0dXJlIH0gZnJvbSAnLi4vdGV4dHVyZXMvRGF0YUFycmF5VGV4dHVyZS5qcyc7XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyBhbiBhcnJheSByZW5kZXIgdGFyZ2V0LlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgUmVuZGVyVGFyZ2V0XHJcbiAqL1xyXG5jbGFzcyBSZW5kZXJUYXJnZXRBcnJheSBleHRlbmRzIFJlbmRlclRhcmdldCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgM0QgcmVuZGVyIHRhcmdldC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbd2lkdGg9MV0gLSBUaGUgd2lkdGggb2YgdGhlIHJlbmRlciB0YXJnZXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtoZWlnaHQ9MV0gLSBUaGUgaGVpZ2h0IG9mIHRoZSByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZGVwdGg9MV0gLSBUaGUgaGVpZ2h0IG9mIHRoZSByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyVGFyZ2V0fk9wdGlvbnN9IFtvcHRpb25zXSAtIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggd2lkdGggPSAxLCBoZWlnaHQgPSAxLCBkZXB0aCA9IDEsIG9wdGlvbnMgPSB7fSApIHtcclxuXHJcblx0XHRzdXBlciggd2lkdGgsIGhlaWdodCwgb3B0aW9ucyApO1xyXG5cclxuXHRcdHRoaXMuaXNSZW5kZXJUYXJnZXRBcnJheSA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy5kZXB0aCA9IGRlcHRoO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogT3ZlcndyaXR0ZW4gd2l0aCBhIGRpZmZlcmVudCB0ZXh0dXJlIHR5cGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0RhdGFBcnJheVRleHR1cmV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudGV4dHVyZSA9IG5ldyBEYXRhQXJyYXlUZXh0dXJlKCBudWxsLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCApO1xyXG5cclxuXHRcdHRoaXMudGV4dHVyZS5pc1JlbmRlclRhcmdldFRleHR1cmUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBSZW5kZXJUYXJnZXRBcnJheSB9O1xyXG4iLCIvKipcclxuICogUmVwcmVzZW50cyBhIHVuaWZvcm0gd2hpY2ggaXMgYSBnbG9iYWwgc2hhZGVyIHZhcmlhYmxlLiBUaGV5IGFyZSBwYXNzZWQgdG8gc2hhZGVyIHByb2dyYW1zLlxyXG4gKlxyXG4gKiBXaGVuIGRlY2xhcmluZyBhIHVuaWZvcm0gb2YgYSB7QGxpbmsgU2hhZGVyTWF0ZXJpYWx9LCBpdCBpcyBkZWNsYXJlZCBieSB2YWx1ZSBvciBieSBvYmplY3QuXHJcbiAqIGBgYGpzXHJcbiAqIHVuaWZvcm1zOiB7XHJcbiAqIFx0dGltZTogeyB2YWx1ZTogMS4wIH0sXHJcbiAqIFx0cmVzb2x1dGlvbjogbmV3IFVuaWZvcm0oIG5ldyBWZWN0b3IyKCkgKVxyXG4gKiB9O1xyXG4gKiBgYGBcclxuICogU2luY2UgdGhpcyBjbGFzcyBjYW4gb25seSBiZSB1c2VkIGluIGNvbnRleHQgb2Yge0BsaW5rIFNoYWRlck1hdGVyaWFsfSwgaXQgaXMgb25seSBzdXBwb3J0ZWRcclxuICogaW4ge0BsaW5rIFdlYkdMUmVuZGVyZXJ9LlxyXG4gKi9cclxuY2xhc3MgVW5pZm9ybSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgdW5pZm9ybS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIFRoZSB1bmlmb3JtIHZhbHVlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCB2YWx1ZSApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB1bmlmb3JtIHZhbHVlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHthbnl9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudmFsdWUgPSB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbmV3IHVuaWZvcm0gd2l0aCBjb3BpZWQgdmFsdWVzIGZyb20gdGhpcyBpbnN0YW5jZS5cclxuXHQgKiBJZiB0aGUgdmFsdWUgaGFzIGEgYGNsb25lKClgIG1ldGhvZCwgdGhlIHZhbHVlIGlzIGNsb25lZCBhcyB3ZWxsLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7VW5pZm9ybX0gQSBjbG9uZSBvZiB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNsb25lKCkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgVW5pZm9ybSggdGhpcy52YWx1ZS5jbG9uZSA9PT0gdW5kZWZpbmVkID8gdGhpcy52YWx1ZSA6IHRoaXMudmFsdWUuY2xvbmUoKSApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBVbmlmb3JtIH07XHJcbiIsImltcG9ydCB7IEV2ZW50RGlzcGF0Y2hlciB9IGZyb20gJy4vRXZlbnREaXNwYXRjaGVyLmpzJztcclxuaW1wb3J0IHsgU3RhdGljRHJhd1VzYWdlIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcclxuXHJcbmxldCBfaWQgPSAwO1xyXG5cclxuLyoqXHJcbiAqIEEgY2xhc3MgZm9yIG1hbmFnaW5nIG11bHRpcGxlIHVuaWZvcm1zIGluIGEgc2luZ2xlIGdyb3VwLiBUaGUgcmVuZGVyZXIgd2lsbCBwcm9jZXNzXHJcbiAqIHN1Y2ggYSBkZWZpbml0aW9uIGFzIGEgc2luZ2xlIFVCTy5cclxuICpcclxuICogU2luY2UgdGhpcyBjbGFzcyBjYW4gb25seSBiZSB1c2VkIGluIGNvbnRleHQgb2Yge0BsaW5rIFNoYWRlck1hdGVyaWFsfSwgaXQgaXMgb25seSBzdXBwb3J0ZWRcclxuICogaW4ge0BsaW5rIFdlYkdMUmVuZGVyZXJ9LlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgRXZlbnREaXNwYXRjaGVyXHJcbiAqL1xyXG5jbGFzcyBVbmlmb3Jtc0dyb3VwIGV4dGVuZHMgRXZlbnREaXNwYXRjaGVyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB1bmlmb3JtcyBncm91cC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1VuaWZvcm1zR3JvdXAgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIElEIG9mIHRoZSAzRCBvYmplY3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQG5hbWUgVW5pZm9ybXNHcm91cCNpZFxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICovXHJcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsICdpZCcsIHsgdmFsdWU6IF9pZCArKyB9ICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbmFtZSBvZiB0aGUgdW5pZm9ybXMgZ3JvdXAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5uYW1lID0gJyc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYnVmZmVyIHVzYWdlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoU3RhdGljRHJhd1VzYWdlfER5bmFtaWNEcmF3VXNhZ2V8U3RyZWFtRHJhd1VzYWdlfFN0YXRpY1JlYWRVc2FnZXxEeW5hbWljUmVhZFVzYWdlfFN0cmVhbVJlYWRVc2FnZXxTdGF0aWNDb3B5VXNhZ2V8RHluYW1pY0NvcHlVc2FnZXxTdHJlYW1Db3B5VXNhZ2UpfVxyXG5cdFx0ICogQGRlZmF1bHQgU3RhdGljRHJhd1VzYWdlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXNhZ2UgPSBTdGF0aWNEcmF3VXNhZ2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBhcnJheSBob2xkaW5nIHRoZSB1bmlmb3Jtcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8VW5pZm9ybT59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudW5pZm9ybXMgPSBbXTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIHRoZSBnaXZlbiB1bmlmb3JtIHRvIHRoaXMgdW5pZm9ybXMgZ3JvdXAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1VuaWZvcm19IHVuaWZvcm0gLSBUaGUgdW5pZm9ybSB0byBhZGQuXHJcblx0ICogQHJldHVybiB7VW5pZm9ybXNHcm91cH0gQSByZWZlcmVuY2UgdG8gdGhpcyB1bmlmb3JtcyBncm91cC5cclxuXHQgKi9cclxuXHRhZGQoIHVuaWZvcm0gKSB7XHJcblxyXG5cdFx0dGhpcy51bmlmb3Jtcy5wdXNoKCB1bmlmb3JtICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVtb3ZlcyB0aGUgZ2l2ZW4gdW5pZm9ybSBmcm9tIHRoaXMgdW5pZm9ybXMgZ3JvdXAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1VuaWZvcm19IHVuaWZvcm0gLSBUaGUgdW5pZm9ybSB0byByZW1vdmUuXHJcblx0ICogQHJldHVybiB7VW5pZm9ybXNHcm91cH0gQSByZWZlcmVuY2UgdG8gdGhpcyB1bmlmb3JtcyBncm91cC5cclxuXHQgKi9cclxuXHRyZW1vdmUoIHVuaWZvcm0gKSB7XHJcblxyXG5cdFx0Y29uc3QgaW5kZXggPSB0aGlzLnVuaWZvcm1zLmluZGV4T2YoIHVuaWZvcm0gKTtcclxuXHJcblx0XHRpZiAoIGluZGV4ICE9PSAtIDEgKSB0aGlzLnVuaWZvcm1zLnNwbGljZSggaW5kZXgsIDEgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBuYW1lIG9mIHRoaXMgdW5pZm9ybXMgZ3JvdXAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtVbmlmb3Jtc0dyb3VwfSBBIHJlZmVyZW5jZSB0byB0aGlzIHVuaWZvcm1zIGdyb3VwLlxyXG5cdCAqL1xyXG5cdHNldE5hbWUoIG5hbWUgKSB7XHJcblxyXG5cdFx0dGhpcy5uYW1lID0gbmFtZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB1c2FnZSBvZiB0aGlzIHVuaWZvcm1zIGdyb3VwLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHsoU3RhdGljRHJhd1VzYWdlfER5bmFtaWNEcmF3VXNhZ2V8U3RyZWFtRHJhd1VzYWdlfFN0YXRpY1JlYWRVc2FnZXxEeW5hbWljUmVhZFVzYWdlfFN0cmVhbVJlYWRVc2FnZXxTdGF0aWNDb3B5VXNhZ2V8RHluYW1pY0NvcHlVc2FnZXxTdHJlYW1Db3B5VXNhZ2UpfSB2YWx1ZSAtIFRoZSB1c2FnZSB0byBzZXQuXHJcblx0ICogQHJldHVybiB7VW5pZm9ybXNHcm91cH0gQSByZWZlcmVuY2UgdG8gdGhpcyB1bmlmb3JtcyBncm91cC5cclxuXHQgKi9cclxuXHRzZXRVc2FnZSggdmFsdWUgKSB7XHJcblxyXG5cdFx0dGhpcy51c2FnZSA9IHZhbHVlO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZyZWVzIHRoZSBHUFUtcmVsYXRlZCByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHRoaXMgaW5zdGFuY2UuIENhbGwgdGhpc1xyXG5cdCAqIG1ldGhvZCB3aGVuZXZlciB0aGlzIGluc3RhbmNlIGlzIG5vIGxvbmdlciB1c2VkIGluIHlvdXIgYXBwLlxyXG5cdCAqXHJcblx0ICogQGZpcmVzIFRleHR1cmUjZGlzcG9zZVxyXG5cdCAqL1xyXG5cdGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdkaXNwb3NlJyB9ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29waWVzIHRoZSB2YWx1ZXMgb2YgdGhlIGdpdmVuIHVuaWZvcm1zIGdyb3VwIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1VuaWZvcm1zR3JvdXB9IHNvdXJjZSAtIFRoZSB1bmlmb3JtcyBncm91cCB0byBjb3B5LlxyXG5cdCAqIEByZXR1cm4ge1VuaWZvcm1zR3JvdXB9IEEgcmVmZXJlbmNlIHRvIHRoaXMgdW5pZm9ybXMgZ3JvdXAuXHJcblx0ICovXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHRoaXMubmFtZSA9IHNvdXJjZS5uYW1lO1xyXG5cdFx0dGhpcy51c2FnZSA9IHNvdXJjZS51c2FnZTtcclxuXHJcblx0XHRjb25zdCB1bmlmb3Jtc1NvdXJjZSA9IHNvdXJjZS51bmlmb3JtcztcclxuXHJcblx0XHR0aGlzLnVuaWZvcm1zLmxlbmd0aCA9IDA7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gdW5pZm9ybXNTb3VyY2UubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHVuaWZvcm1zID0gQXJyYXkuaXNBcnJheSggdW5pZm9ybXNTb3VyY2VbIGkgXSApID8gdW5pZm9ybXNTb3VyY2VbIGkgXSA6IFsgdW5pZm9ybXNTb3VyY2VbIGkgXSBdO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGogPSAwOyBqIDwgdW5pZm9ybXMubGVuZ3RoOyBqICsrICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLnVuaWZvcm1zLnB1c2goIHVuaWZvcm1zWyBqIF0uY2xvbmUoKSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbmV3IHVuaWZvcm1zIGdyb3VwIHdpdGggY29waWVkIHZhbHVlcyBmcm9tIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtVbmlmb3Jtc0dyb3VwfSBBIGNsb25lIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y2xvbmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBVbmlmb3Jtc0dyb3VwIH07XHJcbiIsImltcG9ydCB7IEludGVybGVhdmVkQnVmZmVyIH0gZnJvbSAnLi9JbnRlcmxlYXZlZEJ1ZmZlci5qcyc7XHJcblxyXG4vKipcclxuICogQW4gaW5zdGFuY2VkIHZlcnNpb24gb2YgYW4gaW50ZXJsZWF2ZWQgYnVmZmVyLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgSW50ZXJsZWF2ZWRCdWZmZXJcclxuICovXHJcbmNsYXNzIEluc3RhbmNlZEludGVybGVhdmVkQnVmZmVyIGV4dGVuZHMgSW50ZXJsZWF2ZWRCdWZmZXIge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlZCBpbnRlcmxlYXZlZCBidWZmZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1R5cGVkQXJyYXl9IGFycmF5IC0gQSB0eXBlZCBhcnJheSB3aXRoIGEgc2hhcmVkIGJ1ZmZlciBzdG9yaW5nIGF0dHJpYnV0ZSBkYXRhLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzdHJpZGUgLSBUaGUgbnVtYmVyIG9mIHR5cGVkLWFycmF5IGVsZW1lbnRzIHBlciB2ZXJ0ZXguXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFttZXNoUGVyQXR0cmlidXRlPTFdIC0gRGVmaW5lcyBob3cgb2Z0ZW4gYSB2YWx1ZSBvZiB0aGlzIGludGVybGVhdmVkIGJ1ZmZlciBzaG91bGQgYmUgcmVwZWF0ZWQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGFycmF5LCBzdHJpZGUsIG1lc2hQZXJBdHRyaWJ1dGUgPSAxICkge1xyXG5cclxuXHRcdHN1cGVyKCBhcnJheSwgc3RyaWRlICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyBob3cgb2Z0ZW4gYSB2YWx1ZSBvZiB0aGlzIGJ1ZmZlciBhdHRyaWJ1dGUgc2hvdWxkIGJlIHJlcGVhdGVkLFxyXG5cdFx0ICogc2VlIHtAbGluayBJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUjbWVzaFBlckF0dHJpYnV0ZX0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tZXNoUGVyQXR0cmlidXRlID0gbWVzaFBlckF0dHJpYnV0ZTtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy5tZXNoUGVyQXR0cmlidXRlID0gc291cmNlLm1lc2hQZXJBdHRyaWJ1dGU7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0Y2xvbmUoIGRhdGEgKSB7XHJcblxyXG5cdFx0Y29uc3QgaWIgPSBzdXBlci5jbG9uZSggZGF0YSApO1xyXG5cclxuXHRcdGliLm1lc2hQZXJBdHRyaWJ1dGUgPSB0aGlzLm1lc2hQZXJBdHRyaWJ1dGU7XHJcblxyXG5cdFx0cmV0dXJuIGliO1xyXG5cclxuXHR9XHJcblxyXG5cdHRvSlNPTiggZGF0YSApIHtcclxuXHJcblx0XHRjb25zdCBqc29uID0gc3VwZXIudG9KU09OKCBkYXRhICk7XHJcblxyXG5cdFx0anNvbi5pc0luc3RhbmNlZEludGVybGVhdmVkQnVmZmVyID0gdHJ1ZTtcclxuXHRcdGpzb24ubWVzaFBlckF0dHJpYnV0ZSA9IHRoaXMubWVzaFBlckF0dHJpYnV0ZTtcclxuXHJcblx0XHRyZXR1cm4ganNvbjtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIgfTtcclxuIiwiLyoqXHJcbiAqIEFuIGFsdGVybmF0aXZlIHZlcnNpb24gb2YgYSBidWZmZXIgYXR0cmlidXRlIHdpdGggbW9yZSBjb250cm9sIG92ZXIgdGhlIFZCTy5cclxuICpcclxuICogVGhlIHJlbmRlcmVyIGRvZXMgbm90IGNvbnN0cnVjdCBhIFZCTyBmb3IgdGhpcyBraW5kIG9mIGF0dHJpYnV0ZS4gSW5zdGVhZCwgaXQgdXNlc1xyXG4gKiB3aGF0ZXZlciBWQk8gaXMgcGFzc2VkIGluIGNvbnN0cnVjdG9yIGFuZCBjYW4gbGF0ZXIgYmUgYWx0ZXJlZCB2aWEgdGhlIGBidWZmZXJgIHByb3BlcnR5LlxyXG4gKlxyXG4gKiBUaGUgbW9zdCBjb21tb24gdXNlIGNhc2UgZm9yIHRoaXMgY2xhc3MgaXMgd2hlbiBzb21lIGtpbmQgb2YgR1BHUFUgY2FsY3VsYXRpb24gaW50ZXJmZXJlc1xyXG4gKiBvciBldmVuIHByb2R1Y2VzIHRoZSBWQk9zIGluIHF1ZXN0aW9uLlxyXG4gKlxyXG4gKiBOb3RpY2UgdGhhdCB0aGlzIGNsYXNzIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCB7QGxpbmsgV2ViR0xSZW5kZXJlcn0uXHJcbiAqL1xyXG5jbGFzcyBHTEJ1ZmZlckF0dHJpYnV0ZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgR0wgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xCdWZmZXJ9IGJ1ZmZlciAtIFRoZSBuYXRpdmUgV2ViR0wgYnVmZmVyLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0eXBlIC0gVGhlIG5hdGl2ZSBkYXRhIHR5cGUgKGUuZy4gYGdsLkZMT0FUYCkuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGl0ZW1TaXplIC0gVGhlIGl0ZW0gc2l6ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZWxlbWVudFNpemUgLSBUaGUgY29ycmVzcG9uZGluZyBzaXplIChpbiBieXRlcykgZm9yIHRoZSBnaXZlbiBgdHlwZWAgcGFyYW1ldGVyLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudCAtIFRoZSBleHBlY3RlZCBudW1iZXIgb2YgdmVydGljZXMgaW4gVkJPLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBidWZmZXIsIHR5cGUsIGl0ZW1TaXplLCBlbGVtZW50U2l6ZSwgY291bnQgKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzR0xCdWZmZXJBdHRyaWJ1dGUgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG5hbWUgb2YgdGhlIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5uYW1lID0gJyc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbmF0aXZlIFdlYkdMIGJ1ZmZlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2ViR0xCdWZmZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYnVmZmVyID0gYnVmZmVyO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG5hdGl2ZSBkYXRhIHR5cGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50eXBlID0gdHlwZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBpdGVtIHNpemUsIHNlZSB7QGxpbmsgQnVmZmVyQXR0cmlidXRlI2l0ZW1TaXplfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLml0ZW1TaXplID0gaXRlbVNpemU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY29ycmVzcG9uZGluZyBzaXplIChpbiBieXRlcykgZm9yIHRoZSBnaXZlbiBgdHlwZWAgcGFyYW1ldGVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZWxlbWVudFNpemUgPSBlbGVtZW50U2l6ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBleHBlY3RlZCBudW1iZXIgb2YgdmVydGljZXMgaW4gVkJPLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY291bnQgPSBjb3VudDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgdmVyc2lvbiBudW1iZXIsIGluY3JlbWVudGVkIGV2ZXJ5IHRpbWUgdGhlIGBuZWVkc1VwZGF0ZWAgaXMgc2V0IHRvIGB0cnVlYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnZlcnNpb24gPSAwO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZsYWcgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIGF0dHJpYnV0ZSBoYXMgY2hhbmdlZCBhbmQgc2hvdWxkIGJlIHJlLXNlbnQgdG9cclxuXHQgKiB0aGUgR1BVLiBTZXQgdGhpcyB0byBgdHJ1ZWAgd2hlbiB5b3UgbW9kaWZ5IHRoZSB2YWx1ZSBvZiB0aGUgYXJyYXkuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0ICogQHBhcmFtIHtib29sZWFufSB2YWx1ZVxyXG5cdCAqL1xyXG5cdHNldCBuZWVkc1VwZGF0ZSggdmFsdWUgKSB7XHJcblxyXG5cdFx0aWYgKCB2YWx1ZSA9PT0gdHJ1ZSApIHRoaXMudmVyc2lvbiArKztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBnaXZlbiBuYXRpdmUgV2ViR0wgYnVmZmVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHTEJ1ZmZlcn0gYnVmZmVyIC0gVGhlIGJ1ZmZlciB0byBzZXQuXHJcblx0ICogQHJldHVybiB7QnVmZmVyQXR0cmlidXRlfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldEJ1ZmZlciggYnVmZmVyICkge1xyXG5cclxuXHRcdHRoaXMuYnVmZmVyID0gYnVmZmVyO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGdpdmVuIG5hdGl2ZSBkYXRhIHR5cGUgYW5kIGVsZW1lbnQgc2l6ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0eXBlIC0gVGhlIG5hdGl2ZSBkYXRhIHR5cGUgKGUuZy4gYGdsLkZMT0FUYCkuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGVsZW1lbnRTaXplIC0gVGhlIGNvcnJlc3BvbmRpbmcgc2l6ZSAoaW4gYnl0ZXMpIGZvciB0aGUgZ2l2ZW4gYHR5cGVgIHBhcmFtZXRlci5cclxuXHQgKiBAcmV0dXJuIHtCdWZmZXJBdHRyaWJ1dGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0c2V0VHlwZSggdHlwZSwgZWxlbWVudFNpemUgKSB7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gdHlwZTtcclxuXHRcdHRoaXMuZWxlbWVudFNpemUgPSBlbGVtZW50U2l6ZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBpdGVtIHNpemUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaXRlbVNpemUgLSBUaGUgaXRlbSBzaXplLlxyXG5cdCAqIEByZXR1cm4ge0J1ZmZlckF0dHJpYnV0ZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXRJdGVtU2l6ZSggaXRlbVNpemUgKSB7XHJcblxyXG5cdFx0dGhpcy5pdGVtU2l6ZSA9IGl0ZW1TaXplO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGNvdW50ICh0aGUgZXhwZWN0ZWQgbnVtYmVyIG9mIHZlcnRpY2VzIGluIFZCTykuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gY291bnQgLSBUaGUgY291bnQuXHJcblx0ICogQHJldHVybiB7QnVmZmVyQXR0cmlidXRlfSBBIHJlZmVyZW5jZSB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdHNldENvdW50KCBjb3VudCApIHtcclxuXHJcblx0XHR0aGlzLmNvdW50ID0gY291bnQ7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IEdMQnVmZmVyQXR0cmlidXRlIH07XHJcbiIsImltcG9ydCB7IE1hdHJpeDQgfSBmcm9tICcuLi9tYXRoL01hdHJpeDQuanMnO1xyXG5pbXBvcnQgeyBSYXkgfSBmcm9tICcuLi9tYXRoL1JheS5qcyc7XHJcbmltcG9ydCB7IExheWVycyB9IGZyb20gJy4vTGF5ZXJzLmpzJztcclxuXHJcbmNvbnN0IF9tYXRyaXggPSAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXg0KCk7XHJcblxyXG4vKipcclxuICogVGhpcyBjbGFzcyBpcyBkZXNpZ25lZCB0byBhc3Npc3Qgd2l0aCByYXljYXN0aW5nLiBSYXljYXN0aW5nIGlzIHVzZWQgZm9yXHJcbiAqIG1vdXNlIHBpY2tpbmcgKHdvcmtpbmcgb3V0IHdoYXQgb2JqZWN0cyBpbiB0aGUgM2Qgc3BhY2UgdGhlIG1vdXNlIGlzIG92ZXIpXHJcbiAqIGFtb25nc3Qgb3RoZXIgdGhpbmdzLlxyXG4gKi9cclxuY2xhc3MgUmF5Y2FzdGVyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyByYXljYXN0ZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IG9yaWdpbiAtIFRoZSBvcmlnaW4gdmVjdG9yIHdoZXJlIHRoZSByYXkgY2FzdHMgZnJvbS5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IGRpcmVjdGlvbiAtIFRoZSAobm9ybWFsaXplZCkgZGlyZWN0aW9uIHZlY3RvciB0aGF0IGdpdmVzIGRpcmVjdGlvbiB0byB0aGUgcmF5LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbmVhcj0wXSAtIEFsbCByZXN1bHRzIHJldHVybmVkIGFyZSBmdXJ0aGVyIGF3YXkgdGhhbiBuZWFyLiBOZWFyIGNhbid0IGJlIG5lZ2F0aXZlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZmFyPUluZmluaXR5XSAtIEFsbCByZXN1bHRzIHJldHVybmVkIGFyZSBjbG9zZXIgdGhhbiBmYXIuIEZhciBjYW4ndCBiZSBsb3dlciB0aGFuIG5lYXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG9yaWdpbiwgZGlyZWN0aW9uLCBuZWFyID0gMCwgZmFyID0gSW5maW5pdHkgKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcmF5IHVzZWQgZm9yIHJheWNhc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1JheX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yYXkgPSBuZXcgUmF5KCBvcmlnaW4sIGRpcmVjdGlvbiApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQWxsIHJlc3VsdHMgcmV0dXJuZWQgYXJlIGZ1cnRoZXIgYXdheSB0aGFuIG5lYXIuIE5lYXIgY2FuJ3QgYmUgbmVnYXRpdmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5uZWFyID0gbmVhcjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFsbCByZXN1bHRzIHJldHVybmVkIGFyZSBmdXJ0aGVyIGF3YXkgdGhhbiBuZWFyLiBOZWFyIGNhbid0IGJlIG5lZ2F0aXZlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCBJbmZpbml0eVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZhciA9IGZhcjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjYW1lcmEgdG8gdXNlIHdoZW4gcmF5Y2FzdGluZyBhZ2FpbnN0IHZpZXctZGVwZW5kZW50IG9iamVjdHMgc3VjaCBhc1xyXG5cdFx0ICogYmlsbGJvYXJkZWQgb2JqZWN0cyBsaWtlIHNwcml0ZXMuIFRoaXMgZmllbGQgY2FuIGJlIHNldCBtYW51YWxseSBvclxyXG5cdFx0ICogaXMgc2V0IHdoZW4gY2FsbGluZyBgc2V0RnJvbUNhbWVyYSgpYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P0NhbWVyYX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jYW1lcmEgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQWxsb3dzIHRvIHNlbGVjdGl2ZWx5IGlnbm9yZSAzRCBvYmplY3RzIHdoZW4gcGVyZm9ybWluZyBpbnRlcnNlY3Rpb24gdGVzdHMuXHJcblx0XHQgKiBUaGUgZm9sbG93aW5nIGNvZGUgZXhhbXBsZSBlbnN1cmVzIHRoYXQgb25seSAzRCBvYmplY3RzIG9uIGxheWVyIGAxYCB3aWxsIGJlXHJcblx0XHQgKiBob25vcmVkIGJ5IHJheWNhc3Rlci5cclxuXHRcdCAqIGBgYGpzXHJcblx0XHQgKiByYXljYXN0ZXIubGF5ZXJzLnNldCggMSApO1xyXG5cdFx0ICogb2JqZWN0LmxheWVycy5lbmFibGUoIDEgKTtcclxuXHRcdCAqIGBgYFxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtMYXllcnN9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGF5ZXJzID0gbmV3IExheWVycygpO1xyXG5cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcGFyYW1ldGVyIG9iamVjdCB0aGF0IGNvbmZpZ3VyZXMgdGhlIHJheWNhc3RpbmcuIEl0IGhhcyB0aGUgc3RydWN0dXJlOlxyXG5cdFx0ICpcclxuXHRcdCAqIGBgYFxyXG5cdFx0ICoge1xyXG5cdFx0ICogXHRNZXNoOiB7fSxcclxuXHRcdCAqIFx0TGluZTogeyB0aHJlc2hvbGQ6IDEgfSxcclxuXHRcdCAqIFx0TE9EOiB7fSxcclxuXHRcdCAqIFx0UG9pbnRzOiB7IHRocmVzaG9sZDogMSB9LFxyXG5cdFx0ICogXHRTcHJpdGU6IHt9XHJcblx0XHQgKiB9XHJcblx0XHQgKiBgYGBcclxuXHRcdCAqIFdoZXJlIGB0aHJlc2hvbGRgIGlzIHRoZSBwcmVjaXNpb24gb2YgdGhlIHJheWNhc3RlciB3aGVuIGludGVyc2VjdGluZyBvYmplY3RzLCBpbiB3b3JsZCB1bml0cy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBhcmFtcyA9IHtcclxuXHRcdFx0TWVzaDoge30sXHJcblx0XHRcdExpbmU6IHsgdGhyZXNob2xkOiAxIH0sXHJcblx0XHRcdExPRDoge30sXHJcblx0XHRcdFBvaW50czogeyB0aHJlc2hvbGQ6IDEgfSxcclxuXHRcdFx0U3ByaXRlOiB7fVxyXG5cdFx0fTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoZSByYXkgd2l0aCBhIG5ldyBvcmlnaW4gYW5kIGRpcmVjdGlvbiBieSBjb3B5aW5nIHRoZSB2YWx1ZXMgZnJvbSB0aGUgYXJndW1lbnRzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBvcmlnaW4gLSBUaGUgb3JpZ2luIHZlY3RvciB3aGVyZSB0aGUgcmF5IGNhc3RzIGZyb20uXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBkaXJlY3Rpb24gLSBUaGUgKG5vcm1hbGl6ZWQpIGRpcmVjdGlvbiB2ZWN0b3IgdGhhdCBnaXZlcyBkaXJlY3Rpb24gdG8gdGhlIHJheS5cclxuXHQgKi9cclxuXHRzZXQoIG9yaWdpbiwgZGlyZWN0aW9uICkge1xyXG5cclxuXHRcdC8vIGRpcmVjdGlvbiBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWQgKGZvciBhY2N1cmF0ZSBkaXN0YW5jZSBjYWxjdWxhdGlvbnMpXHJcblxyXG5cdFx0dGhpcy5yYXkuc2V0KCBvcmlnaW4sIGRpcmVjdGlvbiApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVzZXMgdGhlIGdpdmVuIGNvb3JkaW5hdGVzIGFuZCBjYW1lcmEgdG8gY29tcHV0ZSBhIG5ldyBvcmlnaW4gYW5kIGRpcmVjdGlvbiBmb3IgdGhlIGludGVybmFsIHJheS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gY29vcmRzIC0gMkQgY29vcmRpbmF0ZXMgb2YgdGhlIG1vdXNlLCBpbiBub3JtYWxpemVkIGRldmljZSBjb29yZGluYXRlcyAoTkRDKS5cclxuXHQgKiBYIGFuZCBZIGNvbXBvbmVudHMgc2hvdWxkIGJlIGJldHdlZW4gYC0xYCBhbmQgYDFgLlxyXG5cdCAqIEBwYXJhbSB7Q2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIGZyb20gd2hpY2ggdGhlIHJheSBzaG91bGQgb3JpZ2luYXRlLlxyXG5cdCAqL1xyXG5cdHNldEZyb21DYW1lcmEoIGNvb3JkcywgY2FtZXJhICkge1xyXG5cclxuXHRcdGlmICggY2FtZXJhLmlzUGVyc3BlY3RpdmVDYW1lcmEgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnJheS5vcmlnaW4uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBjYW1lcmEubWF0cml4V29ybGQgKTtcclxuXHRcdFx0dGhpcy5yYXkuZGlyZWN0aW9uLnNldCggY29vcmRzLngsIGNvb3Jkcy55LCAwLjUgKS51bnByb2plY3QoIGNhbWVyYSApLnN1YiggdGhpcy5yYXkub3JpZ2luICkubm9ybWFsaXplKCk7XHJcblx0XHRcdHRoaXMuY2FtZXJhID0gY2FtZXJhO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGNhbWVyYS5pc09ydGhvZ3JhcGhpY0NhbWVyYSApIHtcclxuXHJcblx0XHRcdHRoaXMucmF5Lm9yaWdpbi5zZXQoIGNvb3Jkcy54LCBjb29yZHMueSwgKCBjYW1lcmEubmVhciArIGNhbWVyYS5mYXIgKSAvICggY2FtZXJhLm5lYXIgLSBjYW1lcmEuZmFyICkgKS51bnByb2plY3QoIGNhbWVyYSApOyAvLyBzZXQgb3JpZ2luIGluIHBsYW5lIG9mIGNhbWVyYVxyXG5cdFx0XHR0aGlzLnJheS5kaXJlY3Rpb24uc2V0KCAwLCAwLCAtIDEgKS50cmFuc2Zvcm1EaXJlY3Rpb24oIGNhbWVyYS5tYXRyaXhXb3JsZCApO1xyXG5cdFx0XHR0aGlzLmNhbWVyYSA9IGNhbWVyYTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlJheWNhc3RlcjogVW5zdXBwb3J0ZWQgY2FtZXJhIHR5cGU6ICcgKyBjYW1lcmEudHlwZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVc2VzIHRoZSBnaXZlbiBXZWJYUiBjb250cm9sbGVyIHRvIGNvbXB1dGUgYSBuZXcgb3JpZ2luIGFuZCBkaXJlY3Rpb24gZm9yIHRoZSBpbnRlcm5hbCByYXkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYlhSQ29udHJvbGxlcn0gY29udHJvbGxlciAtIFRoZSBjb250cm9sbGVyIHRvIGNvcHkgdGhlIHBvc2l0aW9uIGFuZCBkaXJlY3Rpb24gZnJvbS5cclxuXHQgKiBAcmV0dXJuIHtSYXljYXN0ZXJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgcmF5Y2FzdGVyLlxyXG5cdCAqL1xyXG5cdHNldEZyb21YUkNvbnRyb2xsZXIoIGNvbnRyb2xsZXIgKSB7XHJcblxyXG5cdFx0X21hdHJpeC5pZGVudGl0eSgpLmV4dHJhY3RSb3RhdGlvbiggY29udHJvbGxlci5tYXRyaXhXb3JsZCApO1xyXG5cclxuXHRcdHRoaXMucmF5Lm9yaWdpbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGNvbnRyb2xsZXIubWF0cml4V29ybGQgKTtcclxuXHRcdHRoaXMucmF5LmRpcmVjdGlvbi5zZXQoIDAsIDAsIC0gMSApLmFwcGx5TWF0cml4NCggX21hdHJpeCApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBpbnRlcnNlY3Rpb24gcG9pbnQgb2YgYSByYXljYXN0ZXIgaW50ZXJzZWN0aW9uIHRlc3QuXHJcblx0ICogQHR5cGVkZWYge09iamVjdH0gUmF5Y2FzdGVyfkludGVyc2VjdGlvblxyXG5cdCAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBkaXN0YW5jZSAtIFRoZSBkaXN0YW5jZSBmcm9tIHRoZSByYXkncyBvcmlnaW4gdG8gdGhlIGludGVyc2VjdGlvbiBwb2ludC5cclxuXHQgKiBAcHJvcGVydHkge251bWJlcn0gZGlzdGFuY2VUb1JheSAtICBTb21lIDNEIG9iamVjdHMgZS5nLiB7QGxpbmsgUG9pbnRzfSBwcm92aWRlIHRoZSBkaXN0YW5jZSBvZiB0aGVcclxuXHQgKiBpbnRlcnNlY3Rpb24gdG8gdGhlIG5lYXJlc3QgcG9pbnQgb24gdGhlIHJheS4gRm9yIG90aGVyIG9iamVjdHMgaXQgd2lsbCBiZSBgdW5kZWZpbmVkYC5cclxuXHQgKiBAcHJvcGVydHkge1ZlY3RvcjN9IHBvaW50IC0gVGhlIGludGVyc2VjdGlvbiBwb2ludCwgaW4gd29ybGQgY29vcmRpbmF0ZXMuXHJcblx0ICogQHByb3BlcnR5IHtPYmplY3R9IGZhY2UgLSBUaGUgZmFjZSB0aGF0IGhhcyBiZWVuIGludGVyc2VjdGVkLlxyXG5cdCAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBmYWNlSW5kZXggLSBUaGUgZmFjZSBpbmRleC5cclxuXHQgKiBAcHJvcGVydHkge09iamVjdDNEfSBvYmplY3QgLSBUaGUgM0Qgb2JqZWN0IHRoYXQgaGFzIGJlZW4gaW50ZXJzZWN0ZWQuXHJcblx0ICogQHByb3BlcnR5IHtWZWN0b3IyfSB1diAtIFUsViBjb29yZGluYXRlcyBhdCBwb2ludCBvZiBpbnRlcnNlY3Rpb24uXHJcblx0ICogQHByb3BlcnR5IHtWZWN0b3IyfSB1djEgLSBTZWNvbmQgc2V0IG9mIFUsViBjb29yZGluYXRlcyBhdCBwb2ludCBvZiBpbnRlcnNlY3Rpb24uXHJcblx0ICogQHByb3BlcnR5IHtWZWN0b3IzfSB1djEgLSBJbnRlcnBvbGF0ZWQgbm9ybWFsIHZlY3RvciBhdCBwb2ludCBvZiBpbnRlcnNlY3Rpb24uXHJcblx0ICogQHByb3BlcnR5IHtudW1iZXJ9IGluc3RhbmNlSWQgLSBUaGUgaW5kZXggbnVtYmVyIG9mIHRoZSBpbnN0YW5jZSB3aGVyZSB0aGUgcmF5XHJcblx0ICogaW50ZXJzZWN0cyB0aGUge0BsaW5rIEluc3RhbmNlZE1lc2h9LlxyXG5cdCAqL1xyXG5cclxuXHQvKipcclxuXHQgKiBDaGVja3MgYWxsIGludGVyc2VjdGlvbiBiZXR3ZWVuIHRoZSByYXkgYW5kIHRoZSBvYmplY3Qgd2l0aCBvciB3aXRob3V0IHRoZVxyXG5cdCAqIGRlc2NlbmRhbnRzLiBJbnRlcnNlY3Rpb25zIGFyZSByZXR1cm5lZCBzb3J0ZWQgYnkgZGlzdGFuY2UsIGNsb3Nlc3QgZmlyc3QuXHJcblx0ICpcclxuXHQgKiBgUmF5Y2FzdGVyYCBkZWxlZ2F0ZXMgdG8gdGhlIGByYXljYXN0KClgIG1ldGhvZCBvZiB0aGUgcGFzc2VkIDNEIG9iamVjdCwgd2hlblxyXG5cdCAqIGV2YWx1YXRpbmcgd2hldGhlciB0aGUgcmF5IGludGVyc2VjdHMgdGhlIG9iamVjdCBvciBub3QuIFRoaXMgYWxsb3dzIG1lc2hlcyB0byByZXNwb25kXHJcblx0ICogZGlmZmVyZW50bHkgdG8gcmF5IGNhc3RpbmcgdGhhbiBsaW5lcyBvciBwb2ludHMuXHJcblx0ICpcclxuXHQgKiBOb3RlIHRoYXQgZm9yIG1lc2hlcywgZmFjZXMgbXVzdCBiZSBwb2ludGVkIHRvd2FyZHMgdGhlIG9yaWdpbiBvZiB0aGUgcmF5IGluIG9yZGVyXHJcblx0ICogdG8gYmUgZGV0ZWN0ZWQ7IGludGVyc2VjdGlvbnMgb2YgdGhlIHJheSBwYXNzaW5nIHRocm91Z2ggdGhlIGJhY2sgb2YgYSBmYWNlIHdpbGwgbm90XHJcblx0ICogYmUgZGV0ZWN0ZWQuIFRvIHJheWNhc3QgYWdhaW5zdCBib3RoIGZhY2VzIG9mIGFuIG9iamVjdCwgeW91J2xsIHdhbnQgdG8gc2V0ICB7QGxpbmsgTWF0ZXJpYWwjc2lkZX1cclxuXHQgKiB0byBgVEhSRUUuRG91YmxlU2lkZWAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdDNEfSBvYmplY3QgLSBUaGUgM0Qgb2JqZWN0IHRvIGNoZWNrIGZvciBpbnRlcnNlY3Rpb24gd2l0aCB0aGUgcmF5LlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JlY3Vyc2l2ZT10cnVlXSAtIElmIHNldCB0byBgdHJ1ZWAsIGl0IGFsc28gY2hlY2tzIGFsbCBkZXNjZW5kYW50cy5cclxuXHQgKiBPdGhlcndpc2UgaXQgb25seSBjaGVja3MgaW50ZXJzZWN0aW9uIHdpdGggdGhlIG9iamVjdC5cclxuXHQgKiBAcGFyYW0ge0FycmF5PFJheWNhc3Rlcn5JbnRlcnNlY3Rpb24+fSBbaW50ZXJzZWN0cz1bXV0gVGhlIHRhcmdldCBhcnJheSB0aGF0IGhvbGRzIHRoZSByZXN1bHQgb2YgdGhlIG1ldGhvZC5cclxuXHQgKiBAcmV0dXJuIHtBcnJheTxSYXljYXN0ZXJ+SW50ZXJzZWN0aW9uPn0gQW4gYXJyYXkgaG9sZGluZyB0aGUgaW50ZXJzZWN0aW9uIHBvaW50cy5cclxuXHQgKi9cclxuXHRpbnRlcnNlY3RPYmplY3QoIG9iamVjdCwgcmVjdXJzaXZlID0gdHJ1ZSwgaW50ZXJzZWN0cyA9IFtdICkge1xyXG5cclxuXHRcdGludGVyc2VjdCggb2JqZWN0LCB0aGlzLCBpbnRlcnNlY3RzLCByZWN1cnNpdmUgKTtcclxuXHJcblx0XHRpbnRlcnNlY3RzLnNvcnQoIGFzY1NvcnQgKTtcclxuXHJcblx0XHRyZXR1cm4gaW50ZXJzZWN0cztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDaGVja3MgYWxsIGludGVyc2VjdGlvbiBiZXR3ZWVuIHRoZSByYXkgYW5kIHRoZSBvYmplY3RzIHdpdGggb3Igd2l0aG91dFxyXG5cdCAqIHRoZSBkZXNjZW5kYW50cy4gSW50ZXJzZWN0aW9ucyBhcmUgcmV0dXJuZWQgc29ydGVkIGJ5IGRpc3RhbmNlLCBjbG9zZXN0IGZpcnN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxPYmplY3QzRD59IG9iamVjdHMgLSBUaGUgM0Qgb2JqZWN0cyB0byBjaGVjayBmb3IgaW50ZXJzZWN0aW9uIHdpdGggdGhlIHJheS5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZWN1cnNpdmU9dHJ1ZV0gLSBJZiBzZXQgdG8gYHRydWVgLCBpdCBhbHNvIGNoZWNrcyBhbGwgZGVzY2VuZGFudHMuXHJcblx0ICogT3RoZXJ3aXNlIGl0IG9ubHkgY2hlY2tzIGludGVyc2VjdGlvbiB3aXRoIHRoZSBvYmplY3QuXHJcblx0ICogQHBhcmFtIHtBcnJheTxSYXljYXN0ZXJ+SW50ZXJzZWN0aW9uPn0gW2ludGVyc2VjdHM9W11dIFRoZSB0YXJnZXQgYXJyYXkgdGhhdCBob2xkcyB0aGUgcmVzdWx0IG9mIHRoZSBtZXRob2QuXHJcblx0ICogQHJldHVybiB7QXJyYXk8UmF5Y2FzdGVyfkludGVyc2VjdGlvbj59IEFuIGFycmF5IGhvbGRpbmcgdGhlIGludGVyc2VjdGlvbiBwb2ludHMuXHJcblx0ICovXHJcblx0aW50ZXJzZWN0T2JqZWN0cyggb2JqZWN0cywgcmVjdXJzaXZlID0gdHJ1ZSwgaW50ZXJzZWN0cyA9IFtdICkge1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IG9iamVjdHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGludGVyc2VjdCggb2JqZWN0c1sgaSBdLCB0aGlzLCBpbnRlcnNlY3RzLCByZWN1cnNpdmUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aW50ZXJzZWN0cy5zb3J0KCBhc2NTb3J0ICk7XHJcblxyXG5cdFx0cmV0dXJuIGludGVyc2VjdHM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFzY1NvcnQoIGEsIGIgKSB7XHJcblxyXG5cdHJldHVybiBhLmRpc3RhbmNlIC0gYi5kaXN0YW5jZTtcclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGludGVyc2VjdCggb2JqZWN0LCByYXljYXN0ZXIsIGludGVyc2VjdHMsIHJlY3Vyc2l2ZSApIHtcclxuXHJcblx0bGV0IHByb3BhZ2F0ZSA9IHRydWU7XHJcblxyXG5cdGlmICggb2JqZWN0LmxheWVycy50ZXN0KCByYXljYXN0ZXIubGF5ZXJzICkgKSB7XHJcblxyXG5cdFx0Y29uc3QgcmVzdWx0ID0gb2JqZWN0LnJheWNhc3QoIHJheWNhc3RlciwgaW50ZXJzZWN0cyApO1xyXG5cclxuXHRcdGlmICggcmVzdWx0ID09PSBmYWxzZSApIHByb3BhZ2F0ZSA9IGZhbHNlO1xyXG5cclxuXHR9XHJcblxyXG5cdGlmICggcHJvcGFnYXRlID09PSB0cnVlICYmIHJlY3Vyc2l2ZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRjb25zdCBjaGlsZHJlbiA9IG9iamVjdC5jaGlsZHJlbjtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0aW50ZXJzZWN0KCBjaGlsZHJlblsgaSBdLCByYXljYXN0ZXIsIGludGVyc2VjdHMsIHRydWUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFJheWNhc3RlciB9O1xyXG4iLCJpbXBvcnQgeyBjbGFtcCB9IGZyb20gJy4vTWF0aFV0aWxzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIHRvIHJlcHJlc2VudCBwb2ludHMgaW4gM0Qgc3BhY2UgYXNcclxuICogW1NwaGVyaWNhbCBjb29yZGluYXRlc117QGxpbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU3BoZXJpY2FsX2Nvb3JkaW5hdGVfc3lzdGVtfS5cclxuICovXHJcbmNsYXNzIFNwaGVyaWNhbCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc3BoZXJpY2FsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpdXM9MV0gLSBUaGUgcmFkaXVzLCBvciB0aGUgRXVjbGlkZWFuIGRpc3RhbmNlIChzdHJhaWdodC1saW5lIGRpc3RhbmNlKSBmcm9tIHRoZSBwb2ludCB0byB0aGUgb3JpZ2luLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbcGhpPTBdIC0gVGhlIHBvbGFyIGFuZ2xlIGluIHJhZGlhbnMgZnJvbSB0aGUgeSAodXApIGF4aXMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt0aGV0YT0wXSAtIFRoZSBlcXVhdG9yL2F6aW11dGhhbCBhbmdsZSBpbiByYWRpYW5zIGFyb3VuZCB0aGUgeSAodXApIGF4aXMuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHJhZGl1cyA9IDEsIHBoaSA9IDAsIHRoZXRhID0gMCApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByYWRpdXMsIG9yIHRoZSBFdWNsaWRlYW4gZGlzdGFuY2UgKHN0cmFpZ2h0LWxpbmUgZGlzdGFuY2UpIGZyb20gdGhlIHBvaW50IHRvIHRoZSBvcmlnaW4uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yYWRpdXMgPSByYWRpdXM7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcG9sYXIgYW5nbGUgaW4gcmFkaWFucyBmcm9tIHRoZSB5ICh1cCkgYXhpcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBoaSA9IHBoaTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBlcXVhdG9yL2F6aW11dGhhbCBhbmdsZSBpbiByYWRpYW5zIGFyb3VuZCB0aGUgeSAodXApIGF4aXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50aGV0YSA9IHRoZXRhO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHNwaGVyaWNhbCBjb21wb25lbnRzIGJ5IGNvcHlpbmcgdGhlIGdpdmVuIHZhbHVlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSByYWRpdXMgLSBUaGUgcmFkaXVzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBwaGkgLSBUaGUgcG9sYXIgYW5nbGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHRoZXRhIC0gVGhlIGF6aW11dGhhbCBhbmdsZS5cclxuXHQgKiBAcmV0dXJuIHtTcGhlcmljYWx9IEEgcmVmZXJlbmNlIHRvIHRoaXMgc3BoZXJpY2FsLlxyXG5cdCAqL1xyXG5cdHNldCggcmFkaXVzLCBwaGksIHRoZXRhICkge1xyXG5cclxuXHRcdHRoaXMucmFkaXVzID0gcmFkaXVzO1xyXG5cdFx0dGhpcy5waGkgPSBwaGk7XHJcblx0XHR0aGlzLnRoZXRhID0gdGhldGE7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29waWVzIHRoZSB2YWx1ZXMgb2YgdGhlIGdpdmVuIHNwaGVyaWNhbCB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTcGhlcmljYWx9IG90aGVyIC0gVGhlIHNwaGVyaWNhbCB0byBjb3B5LlxyXG5cdCAqIEByZXR1cm4ge1NwaGVyaWNhbH0gQSByZWZlcmVuY2UgdG8gdGhpcyBzcGhlcmljYWwuXHJcblx0ICovXHJcblx0Y29weSggb3RoZXIgKSB7XHJcblxyXG5cdFx0dGhpcy5yYWRpdXMgPSBvdGhlci5yYWRpdXM7XHJcblx0XHR0aGlzLnBoaSA9IG90aGVyLnBoaTtcclxuXHRcdHRoaXMudGhldGEgPSBvdGhlci50aGV0YTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXN0cmljdHMgdGhlIHBvbGFyIGFuZ2xlIFtwYWdlOi5waGkgcGhpXSB0byBiZSBiZXR3ZWVuIGAwLjAwMDAwMWAgYW5kIHBpIC1cclxuXHQgKiBgMC4wMDAwMDFgLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7U3BoZXJpY2FsfSBBIHJlZmVyZW5jZSB0byB0aGlzIHNwaGVyaWNhbC5cclxuXHQgKi9cclxuXHRtYWtlU2FmZSgpIHtcclxuXHJcblx0XHRjb25zdCBFUFMgPSAwLjAwMDAwMTtcclxuXHRcdHRoaXMucGhpID0gY2xhbXAoIHRoaXMucGhpLCBFUFMsIE1hdGguUEkgLSBFUFMgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBzcGhlcmljYWwgY29tcG9uZW50cyBmcm9tIHRoZSBnaXZlbiB2ZWN0b3Igd2hpY2ggaXMgYXNzdW1lZCB0byBob2xkXHJcblx0ICogQ2FydGVzaWFuIGNvb3JkaW5hdGVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSB2IC0gVGhlIHZlY3RvciB0byBzZXQuXHJcblx0ICogQHJldHVybiB7U3BoZXJpY2FsfSBBIHJlZmVyZW5jZSB0byB0aGlzIHNwaGVyaWNhbC5cclxuXHQgKi9cclxuXHRzZXRGcm9tVmVjdG9yMyggdiApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5zZXRGcm9tQ2FydGVzaWFuQ29vcmRzKCB2LngsIHYueSwgdi56ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgc3BoZXJpY2FsIGNvbXBvbmVudHMgZnJvbSB0aGUgZ2l2ZW4gQ2FydGVzaWFuIGNvb3JkaW5hdGVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeCB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB4IHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB6IC0gVGhlIHggdmFsdWUuXHJcblx0ICogQHJldHVybiB7U3BoZXJpY2FsfSBBIHJlZmVyZW5jZSB0byB0aGlzIHNwaGVyaWNhbC5cclxuXHQgKi9cclxuXHRzZXRGcm9tQ2FydGVzaWFuQ29vcmRzKCB4LCB5LCB6ICkge1xyXG5cclxuXHRcdHRoaXMucmFkaXVzID0gTWF0aC5zcXJ0KCB4ICogeCArIHkgKiB5ICsgeiAqIHogKTtcclxuXHJcblx0XHRpZiAoIHRoaXMucmFkaXVzID09PSAwICkge1xyXG5cclxuXHRcdFx0dGhpcy50aGV0YSA9IDA7XHJcblx0XHRcdHRoaXMucGhpID0gMDtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGhpcy50aGV0YSA9IE1hdGguYXRhbjIoIHgsIHogKTtcclxuXHRcdFx0dGhpcy5waGkgPSBNYXRoLmFjb3MoIGNsYW1wKCB5IC8gdGhpcy5yYWRpdXMsIC0gMSwgMSApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBuZXcgc3BoZXJpY2FsIHdpdGggY29waWVkIHZhbHVlcyBmcm9tIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtTcGhlcmljYWx9IEEgY2xvbmUgb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjbG9uZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFNwaGVyaWNhbCB9O1xyXG4iLCIvKipcclxuICogVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byByZXByZXNlbnQgcG9pbnRzIGluIDNEIHNwYWNlIGFzXHJcbiAqIFtDeWxpbmRyaWNhbCBjb29yZGluYXRlc117QGxpbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ3lsaW5kcmljYWxfY29vcmRpbmF0ZV9zeXN0ZW19LlxyXG4gKi9cclxuY2xhc3MgQ3lsaW5kcmljYWwge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGN5bGluZHJpY2FsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpdXM9MV0gLSBUaGUgZGlzdGFuY2UgZnJvbSB0aGUgb3JpZ2luIHRvIGEgcG9pbnQgaW4gdGhlIHgteiBwbGFuZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3RoZXRhPTBdIC0gQSBjb3VudGVyY2xvY2t3aXNlIGFuZ2xlIGluIHRoZSB4LXogcGxhbmUgbWVhc3VyZWQgaW4gcmFkaWFucyBmcm9tIHRoZSBwb3NpdGl2ZSB6LWF4aXMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt5PTBdIC0gVGhlIGhlaWdodCBhYm92ZSB0aGUgeC16IHBsYW5lLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCByYWRpdXMgPSAxLCB0aGV0YSA9IDAsIHkgPSAwICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGRpc3RhbmNlIGZyb20gdGhlIG9yaWdpbiB0byBhIHBvaW50IGluIHRoZSB4LXogcGxhbmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yYWRpdXMgPSByYWRpdXM7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGNvdW50ZXJjbG9ja3dpc2UgYW5nbGUgaW4gdGhlIHgteiBwbGFuZSBtZWFzdXJlZCBpbiByYWRpYW5zIGZyb20gdGhlIHBvc2l0aXZlIHotYXhpcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRoZXRhID0gdGhldGE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgaGVpZ2h0IGFib3ZlIHRoZSB4LXogcGxhbmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy55ID0geTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBjeWxpbmRyaWNhbCBjb21wb25lbnRzIGJ5IGNvcHlpbmcgdGhlIGdpdmVuIHZhbHVlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSByYWRpdXMgLSBUaGUgcmFkaXVzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0aGV0YSAtIFRoZSB0aGV0YSBhbmdsZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSBoZWlnaHQgdmFsdWUuXHJcblx0ICogQHJldHVybiB7Q3lsaW5kcmljYWx9IEEgcmVmZXJlbmNlIHRvIHRoaXMgY3lsaW5kcmljYWwuXHJcblx0ICovXHJcblx0c2V0KCByYWRpdXMsIHRoZXRhLCB5ICkge1xyXG5cclxuXHRcdHRoaXMucmFkaXVzID0gcmFkaXVzO1xyXG5cdFx0dGhpcy50aGV0YSA9IHRoZXRhO1xyXG5cdFx0dGhpcy55ID0geTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gY3lsaW5kcmljYWwgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Q3lsaW5kcmljYWx9IG90aGVyIC0gVGhlIGN5bGluZHJpY2FsIHRvIGNvcHkuXHJcblx0ICogQHJldHVybiB7Q3lsaW5kcmljYWx9IEEgcmVmZXJlbmNlIHRvIHRoaXMgY3lsaW5kcmljYWwuXHJcblx0ICovXHJcblx0Y29weSggb3RoZXIgKSB7XHJcblxyXG5cdFx0dGhpcy5yYWRpdXMgPSBvdGhlci5yYWRpdXM7XHJcblx0XHR0aGlzLnRoZXRhID0gb3RoZXIudGhldGE7XHJcblx0XHR0aGlzLnkgPSBvdGhlci55O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGN5bGluZHJpY2FsIGNvbXBvbmVudHMgZnJvbSB0aGUgZ2l2ZW4gdmVjdG9yIHdoaWNoIGlzIGFzc3VtZWQgdG8gaG9sZFxyXG5cdCAqIENhcnRlc2lhbiBjb29yZGluYXRlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdiAtIFRoZSB2ZWN0b3IgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge0N5bGluZHJpY2FsfSBBIHJlZmVyZW5jZSB0byB0aGlzIGN5bGluZHJpY2FsLlxyXG5cdCAqL1xyXG5cdHNldEZyb21WZWN0b3IzKCB2ICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnNldEZyb21DYXJ0ZXNpYW5Db29yZHMoIHYueCwgdi55LCB2LnogKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBjeWxpbmRyaWNhbCBjb21wb25lbnRzIGZyb20gdGhlIGdpdmVuIENhcnRlc2lhbiBjb29yZGluYXRlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHggdmFsdWUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgeCB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geiAtIFRoZSB4IHZhbHVlLlxyXG5cdCAqIEByZXR1cm4ge0N5bGluZHJpY2FsfSBBIHJlZmVyZW5jZSB0byB0aGlzIGN5bGluZHJpY2FsLlxyXG5cdCAqL1xyXG5cdHNldEZyb21DYXJ0ZXNpYW5Db29yZHMoIHgsIHksIHogKSB7XHJcblxyXG5cdFx0dGhpcy5yYWRpdXMgPSBNYXRoLnNxcnQoIHggKiB4ICsgeiAqIHogKTtcclxuXHRcdHRoaXMudGhldGEgPSBNYXRoLmF0YW4yKCB4LCB6ICk7XHJcblx0XHR0aGlzLnkgPSB5O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBuZXcgY3lsaW5kcmljYWwgd2l0aCBjb3BpZWQgdmFsdWVzIGZyb20gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0N5bGluZHJpY2FsfSBBIGNsb25lIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y2xvbmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBDeWxpbmRyaWNhbCB9O1xyXG4iLCIvKipcclxuICogUmVwcmVzZW50cyBhIDJ4MiBtYXRyaXguXHJcbiAqXHJcbiAqIEEgTm90ZSBvbiBSb3ctTWFqb3IgYW5kIENvbHVtbi1NYWpvciBPcmRlcmluZzpcclxuICpcclxuICogVGhlIGNvbnN0cnVjdG9yIGFuZCB7QGxpbmsgTWF0cml4MiNzZXR9IG1ldGhvZCB0YWtlIGFyZ3VtZW50cyBpblxyXG4gKiBbcm93LW1ham9yXXtAbGluayBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Sb3ctX2FuZF9jb2x1bW4tbWFqb3Jfb3JkZXIjQ29sdW1uLW1ham9yX29yZGVyfVxyXG4gKiBvcmRlciwgd2hpbGUgaW50ZXJuYWxseSB0aGV5IGFyZSBzdG9yZWQgaW4gdGhlIHtAbGluayBNYXRyaXgyI2VsZW1lbnRzfSBhcnJheSBpbiBjb2x1bW4tbWFqb3Igb3JkZXIuXHJcbiAqIFRoaXMgbWVhbnMgdGhhdCBjYWxsaW5nOlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBtID0gbmV3IFRIUkVFLk1hdHJpeDIoKTtcclxuICogbS5zZXQoIDExLCAxMixcclxuICogICAgICAgIDIxLCAyMiApO1xyXG4gKiBgYGBcclxuICogd2lsbCByZXN1bHQgaW4gdGhlIGVsZW1lbnRzIGFycmF5IGNvbnRhaW5pbmc6XHJcbiAqIGBgYGpzXHJcbiAqIG0uZWxlbWVudHMgPSBbIDExLCAyMSxcclxuICogICAgICAgICAgICAgICAgMTIsIDIyIF07XHJcbiAqIGBgYFxyXG4gKiBhbmQgaW50ZXJuYWxseSBhbGwgY2FsY3VsYXRpb25zIGFyZSBwZXJmb3JtZWQgdXNpbmcgY29sdW1uLW1ham9yIG9yZGVyaW5nLlxyXG4gKiBIb3dldmVyLCBhcyB0aGUgYWN0dWFsIG9yZGVyaW5nIG1ha2VzIG5vIGRpZmZlcmVuY2UgbWF0aGVtYXRpY2FsbHkgYW5kXHJcbiAqIG1vc3QgcGVvcGxlIGFyZSB1c2VkIHRvIHRoaW5raW5nIGFib3V0IG1hdHJpY2VzIGluIHJvdy1tYWpvciBvcmRlciwgdGhlXHJcbiAqIHRocmVlLmpzIGRvY3VtZW50YXRpb24gc2hvd3MgbWF0cmljZXMgaW4gcm93LW1ham9yIG9yZGVyLiBKdXN0IGJlYXIgaW5cclxuICogbWluZCB0aGF0IGlmIHlvdSBhcmUgcmVhZGluZyB0aGUgc291cmNlIGNvZGUsIHlvdSdsbCBoYXZlIHRvIHRha2UgdGhlXHJcbiAqIHRyYW5zcG9zZSBvZiBhbnkgbWF0cmljZXMgb3V0bGluZWQgaGVyZSB0byBtYWtlIHNlbnNlIG9mIHRoZSBjYWxjdWxhdGlvbnMuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgTWF0cml4MiB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgMngyIG1hdHJpeC4gVGhlIGFyZ3VtZW50cyBhcmUgc3VwcG9zZWQgdG8gYmVcclxuXHQgKiBpbiByb3ctbWFqb3Igb3JkZXIuIElmIG5vIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQsIHRoZSBjb25zdHJ1Y3RvclxyXG5cdCAqIGluaXRpYWxpemVzIHRoZSBtYXRyaXggYXMgYW4gaWRlbnRpdHkgbWF0cml4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuMTFdIC0gMS0xIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbjEyXSAtIDEtMiBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW24yMV0gLSAyLTEgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtuMjJdIC0gMi0yIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBuMTEsIG4xMiwgbjIxLCBuMjIgKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHRNYXRyaXgyLnByb3RvdHlwZS5pc01hdHJpeDIgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBjb2x1bW4tbWFqb3IgbGlzdCBvZiBtYXRyaXggdmFsdWVzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxudW1iZXI+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmVsZW1lbnRzID0gW1xyXG5cdFx0XHQxLCAwLFxyXG5cdFx0XHQwLCAxLFxyXG5cdFx0XTtcclxuXHJcblx0XHRpZiAoIG4xMSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0dGhpcy5zZXQoIG4xMSwgbjEyLCBuMjEsIG4yMiApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoaXMgbWF0cml4IHRvIHRoZSAyeDIgaWRlbnRpdHkgbWF0cml4LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7TWF0cml4Mn0gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0aWRlbnRpdHkoKSB7XHJcblxyXG5cdFx0dGhpcy5zZXQoXHJcblx0XHRcdDEsIDAsXHJcblx0XHRcdDAsIDEsXHJcblx0XHQpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGVsZW1lbnRzIG9mIHRoZSBtYXRyaXggZnJvbSB0aGUgZ2l2ZW4gYXJyYXkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IGFycmF5IC0gVGhlIG1hdHJpeCBlbGVtZW50cyBpbiBjb2x1bW4tbWFqb3Igb3JkZXIuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXQ9MF0gLSBJbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgYXJyYXkuXHJcblx0ICogQHJldHVybiB7TWF0cml4Mn0gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0ZnJvbUFycmF5KCBhcnJheSwgb2Zmc2V0ID0gMCApIHtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCA0OyBpICsrICkge1xyXG5cclxuXHRcdFx0dGhpcy5lbGVtZW50c1sgaSBdID0gYXJyYXlbIGkgKyBvZmZzZXQgXTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZWxlbWVudHMgb2YgdGhlIG1hdHJpeC5UaGUgYXJndW1lbnRzIGFyZSBzdXBwb3NlZCB0byBiZVxyXG5cdCAqIGluIHJvdy1tYWpvciBvcmRlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBuMTEgLSAxLTEgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IG4xMiAtIDEtMiBtYXRyaXggZWxlbWVudC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbjIxIC0gMi0xIG1hdHJpeCBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBuMjIgLSAyLTIgbWF0cml4IGVsZW1lbnQuXHJcblx0ICogQHJldHVybiB7TWF0cml4Mn0gQSByZWZlcmVuY2UgdG8gdGhpcyBtYXRyaXguXHJcblx0ICovXHJcblx0c2V0KCBuMTEsIG4xMiwgbjIxLCBuMjIgKSB7XHJcblxyXG5cdFx0Y29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzO1xyXG5cclxuXHRcdHRlWyAwIF0gPSBuMTE7IHRlWyAyIF0gPSBuMTI7XHJcblx0XHR0ZVsgMSBdID0gbjIxOyB0ZVsgMyBdID0gbjIyO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuL1ZlY3RvcjIuanMnO1xyXG5cclxuY29uc3QgX3ZlY3RvciA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjIoKTtcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIGFuIGF4aXMtYWxpZ25lZCBib3VuZGluZyBib3ggKEFBQkIpIGluIDJEIHNwYWNlLlxyXG4gKi9cclxuY2xhc3MgQm94MiB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYm91bmRpbmcgYm94LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSBbbWluPShJbmZpbml0eSxJbmZpbml0eSldIC0gQSB2ZWN0b3IgcmVwcmVzZW50aW5nIHRoZSBsb3dlciBib3VuZGFyeSBvZiB0aGUgYm94LlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gW21heD0oLUluZmluaXR5LC1JbmZpbml0eSldIC0gQSB2ZWN0b3IgcmVwcmVzZW50aW5nIHRoZSB1cHBlciBib3VuZGFyeSBvZiB0aGUgYm94LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBtaW4gPSBuZXcgVmVjdG9yMiggKyBJbmZpbml0eSwgKyBJbmZpbml0eSApLCBtYXggPSBuZXcgVmVjdG9yMiggLSBJbmZpbml0eSwgLSBJbmZpbml0eSApICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0JveDIgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGxvd2VyIGJvdW5kYXJ5IG9mIHRoZSBib3guXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWluID0gbWluO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHVwcGVyIGJvdW5kYXJ5IG9mIHRoZSBib3guXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWF4ID0gbWF4O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGxvd2VyIGFuZCB1cHBlciBib3VuZGFyaWVzIG9mIHRoaXMgYm94LlxyXG5cdCAqIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBtZXRob2Qgb25seSBjb3BpZXMgdGhlIHZhbHVlcyBmcm9tIHRoZSBnaXZlbiBvYmplY3RzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSBtaW4gLSBUaGUgbG93ZXIgYm91bmRhcnkgb2YgdGhlIGJveC5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IG1heCAtIFRoZSB1cHBlciBib3VuZGFyeSBvZiB0aGUgYm94LlxyXG5cdCAqIEByZXR1cm4ge0JveDJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgYm91bmRpbmcgYm94LlxyXG5cdCAqL1xyXG5cdHNldCggbWluLCBtYXggKSB7XHJcblxyXG5cdFx0dGhpcy5taW4uY29weSggbWluICk7XHJcblx0XHR0aGlzLm1heC5jb3B5KCBtYXggKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB1cHBlciBhbmQgbG93ZXIgYm91bmRzIG9mIHRoaXMgYm94IHNvIGl0IGVuY2xvc2VzIHRoZSBwb3NpdGlvbiBkYXRhXHJcblx0ICogaW4gdGhlIGdpdmVuIGFycmF5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxWZWN0b3IyPn0gcG9pbnRzIC0gQW4gYXJyYXkgaG9sZGluZyAyRCBwb3NpdGlvbiBkYXRhIGFzIGluc3RhbmNlcyBvZiB7QGxpbmsgVmVjdG9yMn0uXHJcblx0ICogQHJldHVybiB7Qm94Mn0gQSByZWZlcmVuY2UgdG8gdGhpcyBib3VuZGluZyBib3guXHJcblx0ICovXHJcblx0c2V0RnJvbVBvaW50cyggcG9pbnRzICkge1xyXG5cclxuXHRcdHRoaXMubWFrZUVtcHR5KCk7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHRcdHRoaXMuZXhwYW5kQnlQb2ludCggcG9pbnRzWyBpIF0gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2VudGVycyB0aGlzIGJveCBvbiB0aGUgZ2l2ZW4gY2VudGVyIHZlY3RvciBhbmQgc2V0cyB0aGlzIGJveCdzIHdpZHRoLCBoZWlnaHQgYW5kXHJcblx0ICogZGVwdGggdG8gdGhlIGdpdmVuIHNpemUgdmFsdWVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSBjZW50ZXIgLSBUaGUgY2VudGVyIG9mIHRoZSBib3guXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSBzaXplIC0gVGhlIHggYW5kIHkgZGltZW5zaW9ucyBvZiB0aGUgYm94LlxyXG5cdCAqIEByZXR1cm4ge0JveDJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgYm91bmRpbmcgYm94LlxyXG5cdCAqL1xyXG5cdHNldEZyb21DZW50ZXJBbmRTaXplKCBjZW50ZXIsIHNpemUgKSB7XHJcblxyXG5cdFx0Y29uc3QgaGFsZlNpemUgPSBfdmVjdG9yLmNvcHkoIHNpemUgKS5tdWx0aXBseVNjYWxhciggMC41ICk7XHJcblx0XHR0aGlzLm1pbi5jb3B5KCBjZW50ZXIgKS5zdWIoIGhhbGZTaXplICk7XHJcblx0XHR0aGlzLm1heC5jb3B5KCBjZW50ZXIgKS5hZGQoIGhhbGZTaXplICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIG5ldyBib3ggd2l0aCBjb3BpZWQgdmFsdWVzIGZyb20gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0JveDJ9IEEgY2xvbmUgb2YgdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjbG9uZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29waWVzIHRoZSB2YWx1ZXMgb2YgdGhlIGdpdmVuIGJveCB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCb3gyfSBib3ggLSBUaGUgYm94IHRvIGNvcHkuXHJcblx0ICogQHJldHVybiB7Qm94Mn0gQSByZWZlcmVuY2UgdG8gdGhpcyBib3VuZGluZyBib3guXHJcblx0ICovXHJcblx0Y29weSggYm94ICkge1xyXG5cclxuXHRcdHRoaXMubWluLmNvcHkoIGJveC5taW4gKTtcclxuXHRcdHRoaXMubWF4LmNvcHkoIGJveC5tYXggKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBNYWtlcyB0aGlzIGJveCBlbXB0eSB3aGljaCBtZWFucyBpbiBlbmNsb3NlcyBhIHplcm8gc3BhY2UgaW4gMkQuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtCb3gyfSBBIHJlZmVyZW5jZSB0byB0aGlzIGJvdW5kaW5nIGJveC5cclxuXHQgKi9cclxuXHRtYWtlRW1wdHkoKSB7XHJcblxyXG5cdFx0dGhpcy5taW4ueCA9IHRoaXMubWluLnkgPSArIEluZmluaXR5O1xyXG5cdFx0dGhpcy5tYXgueCA9IHRoaXMubWF4LnkgPSAtIEluZmluaXR5O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGJveCBpbmNsdWRlcyB6ZXJvIHBvaW50cyB3aXRoaW4gaXRzIGJvdW5kcy5cclxuXHQgKiBOb3RlIHRoYXQgYSBib3ggd2l0aCBlcXVhbCBsb3dlciBhbmQgdXBwZXIgYm91bmRzIHN0aWxsIGluY2x1ZGVzIG9uZVxyXG5cdCAqIHBvaW50LCB0aGUgb25lIGJvdGggYm91bmRzIHNoYXJlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGlzIGJveCBpcyBlbXB0eSBvciBub3QuXHJcblx0ICovXHJcblx0aXNFbXB0eSgpIHtcclxuXHJcblx0XHQvLyB0aGlzIGlzIGEgbW9yZSByb2J1c3QgY2hlY2sgZm9yIGVtcHR5IHRoYW4gKCB2b2x1bWUgPD0gMCApIGJlY2F1c2Ugdm9sdW1lIGNhbiBnZXQgcG9zaXRpdmUgd2l0aCB0d28gbmVnYXRpdmUgYXhlc1xyXG5cclxuXHRcdHJldHVybiAoIHRoaXMubWF4LnggPCB0aGlzLm1pbi54ICkgfHwgKCB0aGlzLm1heC55IDwgdGhpcy5taW4ueSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGNlbnRlciBwb2ludCBvZiB0aGlzIGJveC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gdGFyZ2V0IC0gVGhlIHRhcmdldCB2ZWN0b3IgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBtZXRob2QncyByZXN1bHQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gVGhlIGNlbnRlciBwb2ludC5cclxuXHQgKi9cclxuXHRnZXRDZW50ZXIoIHRhcmdldCApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5pc0VtcHR5KCkgPyB0YXJnZXQuc2V0KCAwLCAwICkgOiB0YXJnZXQuYWRkVmVjdG9ycyggdGhpcy5taW4sIHRoaXMubWF4ICkubXVsdGlwbHlTY2FsYXIoIDAuNSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGRpbWVuc2lvbnMgb2YgdGhpcyBib3guXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IHRhcmdldCAtIFRoZSB0YXJnZXQgdmVjdG9yIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbWV0aG9kJ3MgcmVzdWx0LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IFRoZSBzaXplLlxyXG5cdCAqL1xyXG5cdGdldFNpemUoIHRhcmdldCApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5pc0VtcHR5KCkgPyB0YXJnZXQuc2V0KCAwLCAwICkgOiB0YXJnZXQuc3ViVmVjdG9ycyggdGhpcy5tYXgsIHRoaXMubWluICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRXhwYW5kcyB0aGUgYm91bmRhcmllcyBvZiB0aGlzIGJveCB0byBpbmNsdWRlIHRoZSBnaXZlbiBwb2ludC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gcG9pbnQgLSBUaGUgcG9pbnQgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgYnkgdGhlIGJvdW5kaW5nIGJveC5cclxuXHQgKiBAcmV0dXJuIHtCb3gyfSBBIHJlZmVyZW5jZSB0byB0aGlzIGJvdW5kaW5nIGJveC5cclxuXHQgKi9cclxuXHRleHBhbmRCeVBvaW50KCBwb2ludCApIHtcclxuXHJcblx0XHR0aGlzLm1pbi5taW4oIHBvaW50ICk7XHJcblx0XHR0aGlzLm1heC5tYXgoIHBvaW50ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRXhwYW5kcyB0aGlzIGJveCBlcXVpbGF0ZXJhbGx5IGJ5IHRoZSBnaXZlbiB2ZWN0b3IuIFRoZSB3aWR0aCBvZiB0aGlzXHJcblx0ICogYm94IHdpbGwgYmUgZXhwYW5kZWQgYnkgdGhlIHggY29tcG9uZW50IG9mIHRoZSB2ZWN0b3IgaW4gYm90aFxyXG5cdCAqIGRpcmVjdGlvbnMuIFRoZSBoZWlnaHQgb2YgdGhpcyBib3ggd2lsbCBiZSBleHBhbmRlZCBieSB0aGUgeSBjb21wb25lbnQgb2ZcclxuXHQgKiB0aGUgdmVjdG9yIGluIGJvdGggZGlyZWN0aW9ucy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gdmVjdG9yIC0gVGhlIHZlY3RvciB0aGF0IHNob3VsZCBleHBhbmQgdGhlIGJvdW5kaW5nIGJveC5cclxuXHQgKiBAcmV0dXJuIHtCb3gyfSBBIHJlZmVyZW5jZSB0byB0aGlzIGJvdW5kaW5nIGJveC5cclxuXHQgKi9cclxuXHRleHBhbmRCeVZlY3RvciggdmVjdG9yICkge1xyXG5cclxuXHRcdHRoaXMubWluLnN1YiggdmVjdG9yICk7XHJcblx0XHR0aGlzLm1heC5hZGQoIHZlY3RvciApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEV4cGFuZHMgZWFjaCBkaW1lbnNpb24gb2YgdGhlIGJveCBieSB0aGUgZ2l2ZW4gc2NhbGFyLiBJZiBuZWdhdGl2ZSwgdGhlXHJcblx0ICogZGltZW5zaW9ucyBvZiB0aGUgYm94IHdpbGwgYmUgY29udHJhY3RlZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzY2FsYXIgLSBUaGUgc2NhbGFyIHZhbHVlIHRoYXQgc2hvdWxkIGV4cGFuZCB0aGUgYm91bmRpbmcgYm94LlxyXG5cdCAqIEByZXR1cm4ge0JveDJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgYm91bmRpbmcgYm94LlxyXG5cdCAqL1xyXG5cdGV4cGFuZEJ5U2NhbGFyKCBzY2FsYXIgKSB7XHJcblxyXG5cdFx0dGhpcy5taW4uYWRkU2NhbGFyKCAtIHNjYWxhciApO1xyXG5cdFx0dGhpcy5tYXguYWRkU2NhbGFyKCBzY2FsYXIgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gcG9pbnQgbGllcyB3aXRoaW4gb3Igb24gdGhlIGJvdW5kYXJpZXMgb2YgdGhpcyBib3guXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IHBvaW50IC0gVGhlIHBvaW50IHRvIHRlc3QuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgYm91bmRpbmcgYm94IGNvbnRhaW5zIHRoZSBnaXZlbiBwb2ludCBvciBub3QuXHJcblx0ICovXHJcblx0Y29udGFpbnNQb2ludCggcG9pbnQgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHBvaW50LnggPj0gdGhpcy5taW4ueCAmJiBwb2ludC54IDw9IHRoaXMubWF4LnggJiZcclxuXHRcdFx0cG9pbnQueSA+PSB0aGlzLm1pbi55ICYmIHBvaW50LnkgPD0gdGhpcy5tYXgueTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIGJvdW5kaW5nIGJveCBpbmNsdWRlcyB0aGUgZW50aXJldHkgb2YgdGhlIGdpdmVuIGJvdW5kaW5nIGJveC5cclxuXHQgKiBJZiB0aGlzIGJveCBhbmQgdGhlIGdpdmVuIG9uZSBhcmUgaWRlbnRpY2FsLCB0aGlzIGZ1bmN0aW9uIGFsc28gcmV0dXJucyBgdHJ1ZWAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0JveDJ9IGJveCAtIFRoZSBib3VuZGluZyBib3ggdG8gdGVzdC5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBib3VuZGluZyBib3ggY29udGFpbnMgdGhlIGdpdmVuIGJvdW5kaW5nIGJveCBvciBub3QuXHJcblx0ICovXHJcblx0Y29udGFpbnNCb3goIGJveCApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5taW4ueCA8PSBib3gubWluLnggJiYgYm94Lm1heC54IDw9IHRoaXMubWF4LnggJiZcclxuXHRcdFx0dGhpcy5taW4ueSA8PSBib3gubWluLnkgJiYgYm94Lm1heC55IDw9IHRoaXMubWF4Lnk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIHBvaW50IGFzIGEgcHJvcG9ydGlvbiBvZiB0aGlzIGJveCdzIHdpZHRoIGFuZCBoZWlnaHQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IHBvaW50IC0gQSBwb2ludCBpbiAyRCBzcGFjZS5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IHRhcmdldCAtIFRoZSB0YXJnZXQgdmVjdG9yIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbWV0aG9kJ3MgcmVzdWx0LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjJ9IEEgcG9pbnQgYXMgYSBwcm9wb3J0aW9uIG9mIHRoaXMgYm94J3Mgd2lkdGggYW5kIGhlaWdodC5cclxuXHQgKi9cclxuXHRnZXRQYXJhbWV0ZXIoIHBvaW50LCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0Ly8gVGhpcyBjYW4gcG90ZW50aWFsbHkgaGF2ZSBhIGRpdmlkZSBieSB6ZXJvIGlmIHRoZSBib3hcclxuXHRcdC8vIGhhcyBhIHNpemUgZGltZW5zaW9uIG9mIDAuXHJcblxyXG5cdFx0cmV0dXJuIHRhcmdldC5zZXQoXHJcblx0XHRcdCggcG9pbnQueCAtIHRoaXMubWluLnggKSAvICggdGhpcy5tYXgueCAtIHRoaXMubWluLnggKSxcclxuXHRcdFx0KCBwb2ludC55IC0gdGhpcy5taW4ueSApIC8gKCB0aGlzLm1heC55IC0gdGhpcy5taW4ueSApXHJcblx0XHQpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBnaXZlbiBib3VuZGluZyBib3ggaW50ZXJzZWN0cyB3aXRoIHRoaXMgYm91bmRpbmcgYm94LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCb3gyfSBib3ggLSBUaGUgYm91bmRpbmcgYm94IHRvIHRlc3QuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZ2l2ZW4gYm91bmRpbmcgYm94IGludGVyc2VjdHMgd2l0aCB0aGlzIGJvdW5kaW5nIGJveC5cclxuXHQgKi9cclxuXHRpbnRlcnNlY3RzQm94KCBib3ggKSB7XHJcblxyXG5cdFx0Ly8gdXNpbmcgNCBzcGxpdHRpbmcgcGxhbmVzIHRvIHJ1bGUgb3V0IGludGVyc2VjdGlvbnNcclxuXHJcblx0XHRyZXR1cm4gYm94Lm1heC54ID49IHRoaXMubWluLnggJiYgYm94Lm1pbi54IDw9IHRoaXMubWF4LnggJiZcclxuXHRcdFx0Ym94Lm1heC55ID49IHRoaXMubWluLnkgJiYgYm94Lm1pbi55IDw9IHRoaXMubWF4Lnk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2xhbXBzIHRoZSBnaXZlbiBwb2ludCB3aXRoaW4gdGhlIGJvdW5kcyBvZiB0aGlzIGJveC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gcG9pbnQgLSBUaGUgcG9pbnQgdG8gY2xhbXAuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IHZlY3RvciB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGhvZCdzIHJlc3VsdC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBUaGUgY2xhbXBlZCBwb2ludC5cclxuXHQgKi9cclxuXHRjbGFtcFBvaW50KCBwb2ludCwgdGFyZ2V0ICkge1xyXG5cclxuXHRcdHJldHVybiB0YXJnZXQuY29weSggcG9pbnQgKS5jbGFtcCggdGhpcy5taW4sIHRoaXMubWF4ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgZXVjbGlkZWFuIGRpc3RhbmNlIGZyb20gYW55IGVkZ2Ugb2YgdGhpcyBib3ggdG8gdGhlIHNwZWNpZmllZCBwb2ludC4gSWZcclxuXHQgKiB0aGUgZ2l2ZW4gcG9pbnQgbGllcyBpbnNpZGUgb2YgdGhpcyBib3gsIHRoZSBkaXN0YW5jZSB3aWxsIGJlIGAwYC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gcG9pbnQgLSBUaGUgcG9pbnQgdG8gY29tcHV0ZSB0aGUgZGlzdGFuY2UgdG8uXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgZXVjbGlkZWFuIGRpc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGRpc3RhbmNlVG9Qb2ludCggcG9pbnQgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuY2xhbXBQb2ludCggcG9pbnQsIF92ZWN0b3IgKS5kaXN0YW5jZVRvKCBwb2ludCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhpcyBib3VuZGluZyBib3ggYW5kIHRoZSBnaXZlbiBvbmUsIHNldHRpbmcgdGhlIHVwcGVyXHJcblx0ICogYm91bmQgb2YgdGhpcyBib3ggdG8gdGhlIGxlc3NlciBvZiB0aGUgdHdvIGJveGVzJyB1cHBlciBib3VuZHMgYW5kIHRoZVxyXG5cdCAqIGxvd2VyIGJvdW5kIG9mIHRoaXMgYm94IHRvIHRoZSBncmVhdGVyIG9mIHRoZSB0d28gYm94ZXMnIGxvd2VyIGJvdW5kcy4gSWZcclxuXHQgKiB0aGVyZSdzIG5vIG92ZXJsYXAsIG1ha2VzIHRoaXMgYm94IGVtcHR5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCb3gyfSBib3ggLSBUaGUgYm91bmRpbmcgYm94IHRvIGludGVyc2VjdCB3aXRoLlxyXG5cdCAqIEByZXR1cm4ge0JveDJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgYm91bmRpbmcgYm94LlxyXG5cdCAqL1xyXG5cdGludGVyc2VjdCggYm94ICkge1xyXG5cclxuXHRcdHRoaXMubWluLm1heCggYm94Lm1pbiApO1xyXG5cdFx0dGhpcy5tYXgubWluKCBib3gubWF4ICk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmlzRW1wdHkoKSApIHRoaXMubWFrZUVtcHR5KCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgdGhlIHVuaW9uIG9mIHRoaXMgYm94IGFuZCBhbm90aGVyIGFuZCB0aGUgZ2l2ZW4gb25lLCBzZXR0aW5nIHRoZSB1cHBlclxyXG5cdCAqIGJvdW5kIG9mIHRoaXMgYm94IHRvIHRoZSBncmVhdGVyIG9mIHRoZSB0d28gYm94ZXMnIHVwcGVyIGJvdW5kcyBhbmQgdGhlXHJcblx0ICogbG93ZXIgYm91bmQgb2YgdGhpcyBib3ggdG8gdGhlIGxlc3NlciBvZiB0aGUgdHdvIGJveGVzJyBsb3dlciBib3VuZHMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0JveDJ9IGJveCAtIFRoZSBib3VuZGluZyBib3ggdGhhdCB3aWxsIGJlIHVuaW9uZWQgd2l0aCB0aGlzIGluc3RhbmNlLlxyXG5cdCAqIEByZXR1cm4ge0JveDJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgYm91bmRpbmcgYm94LlxyXG5cdCAqL1xyXG5cdHVuaW9uKCBib3ggKSB7XHJcblxyXG5cdFx0dGhpcy5taW4ubWluKCBib3gubWluICk7XHJcblx0XHR0aGlzLm1heC5tYXgoIGJveC5tYXggKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIHRoZSBnaXZlbiBvZmZzZXQgdG8gYm90aCB0aGUgdXBwZXIgYW5kIGxvd2VyIGJvdW5kcyBvZiB0aGlzIGJvdW5kaW5nIGJveCxcclxuXHQgKiBlZmZlY3RpdmVseSBtb3ZpbmcgaXQgaW4gMkQgc3BhY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IG9mZnNldCAtIFRoZSBvZmZzZXQgdGhhdCBzaG91bGQgYmUgdXNlZCB0byB0cmFuc2xhdGUgdGhlIGJvdW5kaW5nIGJveC5cclxuXHQgKiBAcmV0dXJuIHtCb3gyfSBBIHJlZmVyZW5jZSB0byB0aGlzIGJvdW5kaW5nIGJveC5cclxuXHQgKi9cclxuXHR0cmFuc2xhdGUoIG9mZnNldCApIHtcclxuXHJcblx0XHR0aGlzLm1pbi5hZGQoIG9mZnNldCApO1xyXG5cdFx0dGhpcy5tYXguYWRkKCBvZmZzZXQgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIGJvdW5kaW5nIGJveCBpcyBlcXVhbCB3aXRoIHRoZSBnaXZlbiBvbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0JveDJ9IGJveCAtIFRoZSBib3ggdG8gdGVzdCBmb3IgZXF1YWxpdHkuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGlzIGJvdW5kaW5nIGJveCBpcyBlcXVhbCB3aXRoIHRoZSBnaXZlbiBvbmUuXHJcblx0ICovXHJcblx0ZXF1YWxzKCBib3ggKSB7XHJcblxyXG5cdFx0cmV0dXJuIGJveC5taW4uZXF1YWxzKCB0aGlzLm1pbiApICYmIGJveC5tYXguZXF1YWxzKCB0aGlzLm1heCApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBCb3gyIH07XHJcbiIsImltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBjbGFtcCB9IGZyb20gJy4vTWF0aFV0aWxzLmpzJztcclxuXHJcbmNvbnN0IF9zdGFydFAgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF9zdGFydEVuZCA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuXHJcbi8qKlxyXG4gKiBBbiBhbmFseXRpY2FsIGxpbmUgc2VnbWVudCBpbiAzRCBzcGFjZSByZXByZXNlbnRlZCBieSBhIHN0YXJ0IGFuZCBlbmQgcG9pbnQuXHJcbiAqL1xyXG5jbGFzcyBMaW5lMyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbGluZSBzZWdtZW50LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBbc3RhcnQ9KDAsMCwwKV0gLSBTdGFydCBvZiB0aGUgbGluZSBzZWdtZW50LlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gW2VuZD0oMCwwLDApXSAtIEVuZCBvZiB0aGUgbGluZSBzZWdtZW50LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBzdGFydCA9IG5ldyBWZWN0b3IzKCksIGVuZCA9IG5ldyBWZWN0b3IzKCkgKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTdGFydCBvZiB0aGUgbGluZSBzZWdtZW50LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3IzfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnN0YXJ0ID0gc3RhcnQ7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBFbmQgb2YgdGhlIGxpbmUgc2VnbWVudC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yM31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5lbmQgPSBlbmQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgc3RhcnQgYW5kIGVuZCB2YWx1ZXMgYnkgY29weWluZyB0aGUgZ2l2ZW4gdmVjdG9ycy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gc3RhcnQgLSBUaGUgc3RhcnQgcG9pbnQuXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBlbmQgLSBUaGUgZW5kIHBvaW50LlxyXG5cdCAqIEByZXR1cm4ge0xpbmUzfSBBIHJlZmVyZW5jZSB0byB0aGlzIGxpbmUgc2VnbWVudC5cclxuXHQgKi9cclxuXHRzZXQoIHN0YXJ0LCBlbmQgKSB7XHJcblxyXG5cdFx0dGhpcy5zdGFydC5jb3B5KCBzdGFydCApO1xyXG5cdFx0dGhpcy5lbmQuY29weSggZW5kICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29waWVzIHRoZSB2YWx1ZXMgb2YgdGhlIGdpdmVuIGxpbmUgc2VnbWVudCB0byB0aGlzIGluc3RhbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtMaW5lM30gbGluZSAtIFRoZSBsaW5lIHNlZ21lbnQgdG8gY29weS5cclxuXHQgKiBAcmV0dXJuIHtMaW5lM30gQSByZWZlcmVuY2UgdG8gdGhpcyBsaW5lIHNlZ21lbnQuXHJcblx0ICovXHJcblx0Y29weSggbGluZSApIHtcclxuXHJcblx0XHR0aGlzLnN0YXJ0LmNvcHkoIGxpbmUuc3RhcnQgKTtcclxuXHRcdHRoaXMuZW5kLmNvcHkoIGxpbmUuZW5kICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgY2VudGVyIG9mIHRoZSBsaW5lIHNlZ21lbnQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHRhcmdldCAtIFRoZSB0YXJnZXQgdmVjdG9yIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbWV0aG9kJ3MgcmVzdWx0LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IFRoZSBjZW50ZXIgcG9pbnQuXHJcblx0ICovXHJcblx0Z2V0Q2VudGVyKCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRhcmdldC5hZGRWZWN0b3JzKCB0aGlzLnN0YXJ0LCB0aGlzLmVuZCApLm11bHRpcGx5U2NhbGFyKCAwLjUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBkZWx0YSB2ZWN0b3Igb2YgdGhlIGxpbmUgc2VnbWVudCdzIHN0YXJ0IGFuZCBlbmQgcG9pbnQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHRhcmdldCAtIFRoZSB0YXJnZXQgdmVjdG9yIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbWV0aG9kJ3MgcmVzdWx0LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IFRoZSBkZWx0YSB2ZWN0b3IuXHJcblx0ICovXHJcblx0ZGVsdGEoIHRhcmdldCApIHtcclxuXHJcblx0XHRyZXR1cm4gdGFyZ2V0LnN1YlZlY3RvcnMoIHRoaXMuZW5kLCB0aGlzLnN0YXJ0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgc3F1YXJlZCBFdWNsaWRlYW4gZGlzdGFuY2UgYmV0d2VlbiB0aGUgbGluZScgc3RhcnQgYW5kIGVuZCBwb2ludC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIHNxdWFyZWQgRXVjbGlkZWFuIGRpc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGRpc3RhbmNlU3EoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuc3RhcnQuZGlzdGFuY2VUb1NxdWFyZWQoIHRoaXMuZW5kICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgRXVjbGlkZWFuIGRpc3RhbmNlIGJldHdlZW4gdGhlIGxpbmUnIHN0YXJ0IGFuZCBlbmQgcG9pbnQuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBFdWNsaWRlYW4gZGlzdGFuY2UuXHJcblx0ICovXHJcblx0ZGlzdGFuY2UoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuc3RhcnQuZGlzdGFuY2VUbyggdGhpcy5lbmQgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgdmVjdG9yIGF0IGEgY2VydGFpbiBwb3NpdGlvbiBhbG9uZyB0aGUgbGluZSBzZWdtZW50LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHQgLSBBIHZhbHVlIGJldHdlZW4gYFswLDFdYCB0byByZXByZXNlbnQgYSBwb3NpdGlvbiBhbG9uZyB0aGUgbGluZSBzZWdtZW50LlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdGFyZ2V0IC0gVGhlIHRhcmdldCB2ZWN0b3IgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBtZXRob2QncyByZXN1bHQuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gVGhlIGRlbHRhIHZlY3Rvci5cclxuXHQgKi9cclxuXHRhdCggdCwgdGFyZ2V0ICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmRlbHRhKCB0YXJnZXQgKS5tdWx0aXBseVNjYWxhciggdCApLmFkZCggdGhpcy5zdGFydCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBwb2ludCBwYXJhbWV0ZXIgYmFzZWQgb24gdGhlIGNsb3Nlc3QgcG9pbnQgYXMgcHJvamVjdGVkIG9uIHRoZSBsaW5lIHNlZ21lbnQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHBvaW50IC0gVGhlIHBvaW50IGZvciB3aGljaCB0byByZXR1cm4gYSBwb2ludCBwYXJhbWV0ZXIuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBjbGFtcFRvTGluZSAtIFdoZXRoZXIgdG8gY2xhbXAgdGhlIHJlc3VsdCB0byB0aGUgcmFuZ2UgYFswLDFdYCBvciBub3QuXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgcG9pbnQgcGFyYW1ldGVyLlxyXG5cdCAqL1xyXG5cdGNsb3Nlc3RQb2ludFRvUG9pbnRQYXJhbWV0ZXIoIHBvaW50LCBjbGFtcFRvTGluZSApIHtcclxuXHJcblx0XHRfc3RhcnRQLnN1YlZlY3RvcnMoIHBvaW50LCB0aGlzLnN0YXJ0ICk7XHJcblx0XHRfc3RhcnRFbmQuc3ViVmVjdG9ycyggdGhpcy5lbmQsIHRoaXMuc3RhcnQgKTtcclxuXHJcblx0XHRjb25zdCBzdGFydEVuZDIgPSBfc3RhcnRFbmQuZG90KCBfc3RhcnRFbmQgKTtcclxuXHRcdGNvbnN0IHN0YXJ0RW5kX3N0YXJ0UCA9IF9zdGFydEVuZC5kb3QoIF9zdGFydFAgKTtcclxuXHJcblx0XHRsZXQgdCA9IHN0YXJ0RW5kX3N0YXJ0UCAvIHN0YXJ0RW5kMjtcclxuXHJcblx0XHRpZiAoIGNsYW1wVG9MaW5lICkge1xyXG5cclxuXHRcdFx0dCA9IGNsYW1wKCB0LCAwLCAxICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGNsb3NldHMgcG9pbnQgb24gdGhlIGxpbmUgZm9yIGEgZ2l2ZW4gcG9pbnQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHBvaW50IC0gVGhlIHBvaW50IHRvIGNvbXB1dGUgdGhlIGNsb3Nlc3QgcG9pbnQgb24gdGhlIGxpbmUgZm9yLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gY2xhbXBUb0xpbmUgLSBXaGV0aGVyIHRvIGNsYW1wIHRoZSByZXN1bHQgdG8gdGhlIHJhbmdlIGBbMCwxXWAgb3Igbm90LlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdGFyZ2V0IC0gIFRoZSB0YXJnZXQgdmVjdG9yIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgbWV0aG9kJ3MgcmVzdWx0LlxyXG5cdCAqIEByZXR1cm4ge1ZlY3RvcjN9IFRoZSBjbG9zZXN0IHBvaW50IG9uIHRoZSBsaW5lLlxyXG5cdCAqL1xyXG5cdGNsb3Nlc3RQb2ludFRvUG9pbnQoIHBvaW50LCBjbGFtcFRvTGluZSwgdGFyZ2V0ICkge1xyXG5cclxuXHRcdGNvbnN0IHQgPSB0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnRQYXJhbWV0ZXIoIHBvaW50LCBjbGFtcFRvTGluZSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmRlbHRhKCB0YXJnZXQgKS5tdWx0aXBseVNjYWxhciggdCApLmFkZCggdGhpcy5zdGFydCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFwcGxpZXMgYSA0eDQgdHJhbnNmb3JtYXRpb24gbWF0cml4IHRvIHRoaXMgbGluZSBzZWdtZW50LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRyaXg0fSBtYXRyaXggLSBUaGUgdHJhbnNmb3JtYXRpb24gbWF0cml4LlxyXG5cdCAqIEByZXR1cm4ge0xpbmUzfSBBIHJlZmVyZW5jZSB0byB0aGlzIGxpbmUgc2VnbWVudC5cclxuXHQgKi9cclxuXHRhcHBseU1hdHJpeDQoIG1hdHJpeCApIHtcclxuXHJcblx0XHR0aGlzLnN0YXJ0LmFwcGx5TWF0cml4NCggbWF0cml4ICk7XHJcblx0XHR0aGlzLmVuZC5hcHBseU1hdHJpeDQoIG1hdHJpeCApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgbGluZSBzZWdtZW50IGlzIGVxdWFsIHdpdGggdGhlIGdpdmVuIG9uZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TGluZTN9IGxpbmUgLSBUaGUgbGluZSBzZWdtZW50IHRvIHRlc3QgZm9yIGVxdWFsaXR5LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyBsaW5lIHNlZ21lbnQgaXMgZXF1YWwgd2l0aCB0aGUgZ2l2ZW4gb25lLlxyXG5cdCAqL1xyXG5cdGVxdWFscyggbGluZSApIHtcclxuXHJcblx0XHRyZXR1cm4gbGluZS5zdGFydC5lcXVhbHMoIHRoaXMuc3RhcnQgKSAmJiBsaW5lLmVuZC5lcXVhbHMoIHRoaXMuZW5kICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIG5ldyBsaW5lIHNlZ21lbnQgd2l0aCBjb3BpZWQgdmFsdWVzIGZyb20gdGhpcyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0xpbmUzfSBBIGNsb25lIG9mIHRoaXMgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y2xvbmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBMaW5lMyB9O1xyXG4iLCJpbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuaW1wb3J0IHsgT2JqZWN0M0QgfSBmcm9tICcuLi9jb3JlL09iamVjdDNELmpzJztcclxuaW1wb3J0IHsgTGluZVNlZ21lbnRzIH0gZnJvbSAnLi4vb2JqZWN0cy9MaW5lU2VnbWVudHMuanMnO1xyXG5pbXBvcnQgeyBMaW5lQmFzaWNNYXRlcmlhbCB9IGZyb20gJy4uL21hdGVyaWFscy9MaW5lQmFzaWNNYXRlcmlhbC5qcyc7XHJcbmltcG9ydCB7IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcbmltcG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9CdWZmZXJHZW9tZXRyeS5qcyc7XHJcblxyXG5jb25zdCBfdmVjdG9yID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgZGlzcGxheXMgYSBjb25lIHNoYXBlZCBoZWxwZXIgb2JqZWN0IGZvciBhIHtAbGluayBTcG90TGlnaHR9LlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBzcG90TGlnaHQgPSBuZXcgVEhSRUUuU3BvdExpZ2h0KCAweGZmZmZmZiApO1xyXG4gKiBzcG90TGlnaHQucG9zaXRpb24uc2V0KCAxMCwgMTAsIDEwICk7XHJcbiAqIHNjZW5lLmFkZCggc3BvdExpZ2h0ICk7XHJcbiAqXHJcbiAqIGNvbnN0IHNwb3RMaWdodEhlbHBlciA9IG5ldyBUSFJFRS5TcG90TGlnaHRIZWxwZXIoIHNwb3RMaWdodCApO1xyXG4gKiBzY2VuZS5hZGQoIHNwb3RMaWdodEhlbHBlciApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIE9iamVjdDNEXHJcbiAqL1xyXG5jbGFzcyBTcG90TGlnaHRIZWxwZXIgZXh0ZW5kcyBPYmplY3QzRCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc3BvdCBsaWdodCBoZWxwZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0hlbWlzcGhlcmVMaWdodH0gbGlnaHQgLSBUaGUgbGlnaHQgdG8gYmUgdmlzdWFsaXplZC5cclxuXHQgKiBAcGFyYW0ge251bWJlcnxDb2xvcnxzdHJpbmd9IFtjb2xvcl0gLSBUaGUgaGVscGVyJ3MgY29sb3IuIElmIG5vdCBzZXQsIHRoZSBoZWxwZXIgd2lsbCB0YWtlXHJcblx0ICogdGhlIGNvbG9yIG9mIHRoZSBsaWdodC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbGlnaHQsIGNvbG9yICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbGlnaHQgYmVpbmcgdmlzdWFsaXplZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7U3BvdExpZ2h0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxpZ2h0ID0gbGlnaHQ7XHJcblxyXG5cdFx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY29sb3IgcGFyYW1ldGVyIHBhc3NlZCBpbiB0aGUgY29uc3RydWN0b3IuXHJcblx0XHQgKiBJZiBub3Qgc2V0LCB0aGUgaGVscGVyIHdpbGwgdGFrZSB0aGUgY29sb3Igb2YgdGhlIGxpZ2h0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ8Q29sb3J8c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvbG9yID0gY29sb3I7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ1Nwb3RMaWdodEhlbHBlcic7XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcclxuXHJcblx0XHRjb25zdCBwb3NpdGlvbnMgPSBbXHJcblx0XHRcdDAsIDAsIDAsIFx0MCwgMCwgMSxcclxuXHRcdFx0MCwgMCwgMCwgXHQxLCAwLCAxLFxyXG5cdFx0XHQwLCAwLCAwLFx0LSAxLCAwLCAxLFxyXG5cdFx0XHQwLCAwLCAwLCBcdDAsIDEsIDEsXHJcblx0XHRcdDAsIDAsIDAsIFx0MCwgLSAxLCAxXHJcblx0XHRdO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgaiA9IDEsIGwgPSAzMjsgaSA8IGw7IGkgKyssIGogKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBwMSA9ICggaSAvIGwgKSAqIE1hdGguUEkgKiAyO1xyXG5cdFx0XHRjb25zdCBwMiA9ICggaiAvIGwgKSAqIE1hdGguUEkgKiAyO1xyXG5cclxuXHRcdFx0cG9zaXRpb25zLnB1c2goXHJcblx0XHRcdFx0TWF0aC5jb3MoIHAxICksIE1hdGguc2luKCBwMSApLCAxLFxyXG5cdFx0XHRcdE1hdGguY29zKCBwMiApLCBNYXRoLnNpbiggcDIgKSwgMVxyXG5cdFx0XHQpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbnMsIDMgKSApO1xyXG5cclxuXHRcdGNvbnN0IG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGZvZzogZmFsc2UsIHRvbmVNYXBwZWQ6IGZhbHNlIH0gKTtcclxuXHJcblx0XHR0aGlzLmNvbmUgPSBuZXcgTGluZVNlZ21lbnRzKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuXHRcdHRoaXMuYWRkKCB0aGlzLmNvbmUgKTtcclxuXHJcblx0XHR0aGlzLnVwZGF0ZSgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZyZWVzIHRoZSBHUFUtcmVsYXRlZCByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHRoaXMgaW5zdGFuY2UuIENhbGwgdGhpc1xyXG5cdCAqIG1ldGhvZCB3aGVuZXZlciB0aGlzIGluc3RhbmNlIGlzIG5vIGxvbmdlciB1c2VkIGluIHlvdXIgYXBwLlxyXG5cdCAqL1xyXG5cdGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0dGhpcy5jb25lLmdlb21ldHJ5LmRpc3Bvc2UoKTtcclxuXHRcdHRoaXMuY29uZS5tYXRlcmlhbC5kaXNwb3NlKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgaGVscGVyIHRvIG1hdGNoIHRoZSBwb3NpdGlvbiBhbmQgZGlyZWN0aW9uIG9mIHRoZVxyXG5cdCAqIGxpZ2h0IGJlaW5nIHZpc3VhbGl6ZWQuXHJcblx0ICovXHJcblx0dXBkYXRlKCkge1xyXG5cclxuXHRcdHRoaXMubGlnaHQudXBkYXRlV29ybGRNYXRyaXgoIHRydWUsIGZhbHNlICk7XHJcblx0XHR0aGlzLmxpZ2h0LnRhcmdldC51cGRhdGVXb3JsZE1hdHJpeCggdHJ1ZSwgZmFsc2UgKTtcclxuXHJcblx0XHQvLyB1cGRhdGUgdGhlIGxvY2FsIG1hdHJpeCBiYXNlZCBvbiB0aGUgcGFyZW50IGFuZCBsaWdodCB0YXJnZXQgdHJhbnNmb3Jtc1xyXG5cdFx0aWYgKCB0aGlzLnBhcmVudCApIHtcclxuXHJcblx0XHRcdHRoaXMucGFyZW50LnVwZGF0ZVdvcmxkTWF0cml4KCB0cnVlICk7XHJcblxyXG5cdFx0XHR0aGlzLm1hdHJpeFxyXG5cdFx0XHRcdC5jb3B5KCB0aGlzLnBhcmVudC5tYXRyaXhXb3JsZCApXHJcblx0XHRcdFx0LmludmVydCgpXHJcblx0XHRcdFx0Lm11bHRpcGx5KCB0aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHRoaXMubWF0cml4LmNvcHkoIHRoaXMubGlnaHQubWF0cml4V29ybGQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5tYXRyaXhXb3JsZC5jb3B5KCB0aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkICk7XHJcblxyXG5cdFx0Y29uc3QgY29uZUxlbmd0aCA9IHRoaXMubGlnaHQuZGlzdGFuY2UgPyB0aGlzLmxpZ2h0LmRpc3RhbmNlIDogMTAwMDtcclxuXHRcdGNvbnN0IGNvbmVXaWR0aCA9IGNvbmVMZW5ndGggKiBNYXRoLnRhbiggdGhpcy5saWdodC5hbmdsZSApO1xyXG5cclxuXHRcdHRoaXMuY29uZS5zY2FsZS5zZXQoIGNvbmVXaWR0aCwgY29uZVdpZHRoLCBjb25lTGVuZ3RoICk7XHJcblxyXG5cdFx0X3ZlY3Rvci5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubGlnaHQudGFyZ2V0Lm1hdHJpeFdvcmxkICk7XHJcblxyXG5cdFx0dGhpcy5jb25lLmxvb2tBdCggX3ZlY3RvciApO1xyXG5cclxuXHRcdGlmICggdGhpcy5jb2xvciAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0dGhpcy5jb25lLm1hdGVyaWFsLmNvbG9yLnNldCggdGhpcy5jb2xvciApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR0aGlzLmNvbmUubWF0ZXJpYWwuY29sb3IuY29weSggdGhpcy5saWdodC5jb2xvciApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCB7IFNwb3RMaWdodEhlbHBlciB9O1xyXG4iLCJpbXBvcnQgeyBMaW5lU2VnbWVudHMgfSBmcm9tICcuLi9vYmplY3RzL0xpbmVTZWdtZW50cy5qcyc7XHJcbmltcG9ydCB7IE1hdHJpeDQgfSBmcm9tICcuLi9tYXRoL01hdHJpeDQuanMnO1xyXG5pbXBvcnQgeyBMaW5lQmFzaWNNYXRlcmlhbCB9IGZyb20gJy4uL21hdGVyaWFscy9MaW5lQmFzaWNNYXRlcmlhbC5qcyc7XHJcbmltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vbWF0aC9Db2xvci5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyR2VvbWV0cnkuanMnO1xyXG5pbXBvcnQgeyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5cclxuY29uc3QgX3ZlY3RvciA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX2JvbmVNYXRyaXggPSAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXg0KCk7XHJcbmNvbnN0IF9tYXRyaXhXb3JsZEludiA9IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDQoKTtcclxuXHJcbi8qKlxyXG4gKiBBIGhlbHBlciBvYmplY3QgdG8gYXNzaXN0IHdpdGggdmlzdWFsaXppbmcgYSB7QGxpbmsgU2tlbGV0b259LlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBoZWxwZXIgPSBuZXcgVEhSRUUuU2tlbGV0b25IZWxwZXIoIHNraW5uZWRNZXNoICk7XHJcbiAqIHNjZW5lLmFkZCggaGVscGVyICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTGluZVNlZ21lbnRzXHJcbiAqL1xyXG5jbGFzcyBTa2VsZXRvbkhlbHBlciBleHRlbmRzIExpbmVTZWdtZW50cyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgaGVtaXNwaGVyZSBsaWdodCBoZWxwZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdDNEfSBvYmplY3QgLSAgVXN1YWxseSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgU2tpbm5lZE1lc2h9LiBIb3dldmVyLCBhbnkgM0Qgb2JqZWN0XHJcblx0ICogY2FuIGJlIHVzZWQgaWYgaXQgcmVwcmVzZW50cyBhIGhpZXJhcmNoeSBvZiBib25lcyAoc2VlIHtAbGluayBCb25lfSkuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG9iamVjdCApIHtcclxuXHJcblx0XHRjb25zdCBib25lcyA9IGdldEJvbmVMaXN0KCBvYmplY3QgKTtcclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xyXG5cclxuXHRcdGNvbnN0IHZlcnRpY2VzID0gW107XHJcblx0XHRjb25zdCBjb2xvcnMgPSBbXTtcclxuXHJcblx0XHRjb25zdCBjb2xvcjEgPSBuZXcgQ29sb3IoIDAsIDAsIDEgKTtcclxuXHRcdGNvbnN0IGNvbG9yMiA9IG5ldyBDb2xvciggMCwgMSwgMCApO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGJvbmVzLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGJvbmUgPSBib25lc1sgaSBdO1xyXG5cclxuXHRcdFx0aWYgKCBib25lLnBhcmVudCAmJiBib25lLnBhcmVudC5pc0JvbmUgKSB7XHJcblxyXG5cdFx0XHRcdHZlcnRpY2VzLnB1c2goIDAsIDAsIDAgKTtcclxuXHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCAwLCAwLCAwICk7XHJcblx0XHRcdFx0Y29sb3JzLnB1c2goIGNvbG9yMS5yLCBjb2xvcjEuZywgY29sb3IxLmIgKTtcclxuXHRcdFx0XHRjb2xvcnMucHVzaCggY29sb3IyLnIsIGNvbG9yMi5nLCBjb2xvcjIuYiApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XHJcblx0XHRnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdjb2xvcicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBjb2xvcnMsIDMgKSApO1xyXG5cclxuXHRcdGNvbnN0IG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IHZlcnRleENvbG9yczogdHJ1ZSwgZGVwdGhUZXN0OiBmYWxzZSwgZGVwdGhXcml0ZTogZmFsc2UsIHRvbmVNYXBwZWQ6IGZhbHNlLCB0cmFuc3BhcmVudDogdHJ1ZSB9ICk7XHJcblxyXG5cdFx0c3VwZXIoIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1NrZWxldG9uSGVscGVyID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnU2tlbGV0b25IZWxwZXInO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG9iamVjdCBiZWluZyB2aXN1YWxpemVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3QzRH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yb290ID0gb2JqZWN0O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogaGUgbGlzdCBvZiBib25lcyB0aGF0IHRoZSBoZWxwZXIgdmlzdWFsaXplcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8Qm9uZT59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYm9uZXMgPSBib25lcztcclxuXHJcblx0XHR0aGlzLm1hdHJpeCA9IG9iamVjdC5tYXRyaXhXb3JsZDtcclxuXHRcdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xyXG5cclxuXHR9XHJcblxyXG5cdHVwZGF0ZU1hdHJpeFdvcmxkKCBmb3JjZSApIHtcclxuXHJcblx0XHRjb25zdCBib25lcyA9IHRoaXMuYm9uZXM7XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xyXG5cdFx0Y29uc3QgcG9zaXRpb24gPSBnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKTtcclxuXHJcblx0XHRfbWF0cml4V29ybGRJbnYuY29weSggdGhpcy5yb290Lm1hdHJpeFdvcmxkICkuaW52ZXJ0KCk7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBqID0gMDsgaSA8IGJvbmVzLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGJvbmUgPSBib25lc1sgaSBdO1xyXG5cclxuXHRcdFx0aWYgKCBib25lLnBhcmVudCAmJiBib25lLnBhcmVudC5pc0JvbmUgKSB7XHJcblxyXG5cdFx0XHRcdF9ib25lTWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIF9tYXRyaXhXb3JsZEludiwgYm9uZS5tYXRyaXhXb3JsZCApO1xyXG5cdFx0XHRcdF92ZWN0b3Iuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBfYm9uZU1hdHJpeCApO1xyXG5cdFx0XHRcdHBvc2l0aW9uLnNldFhZWiggaiwgX3ZlY3Rvci54LCBfdmVjdG9yLnksIF92ZWN0b3IueiApO1xyXG5cclxuXHRcdFx0XHRfYm9uZU1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBfbWF0cml4V29ybGRJbnYsIGJvbmUucGFyZW50Lm1hdHJpeFdvcmxkICk7XHJcblx0XHRcdFx0X3ZlY3Rvci5zZXRGcm9tTWF0cml4UG9zaXRpb24oIF9ib25lTWF0cml4ICk7XHJcblx0XHRcdFx0cG9zaXRpb24uc2V0WFlaKCBqICsgMSwgX3ZlY3Rvci54LCBfdmVjdG9yLnksIF92ZWN0b3IueiApO1xyXG5cclxuXHRcdFx0XHRqICs9IDI7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJyApLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHRzdXBlci51cGRhdGVNYXRyaXhXb3JsZCggZm9yY2UgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGcmVlcyB0aGUgR1BVLXJlbGF0ZWQgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGlzIGluc3RhbmNlLiBDYWxsIHRoaXNcclxuXHQgKiBtZXRob2Qgd2hlbmV2ZXIgdGhpcyBpbnN0YW5jZSBpcyBubyBsb25nZXIgdXNlZCBpbiB5b3VyIGFwcC5cclxuXHQgKi9cclxuXHRkaXNwb3NlKCkge1xyXG5cclxuXHRcdHRoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpO1xyXG5cdFx0dGhpcy5tYXRlcmlhbC5kaXNwb3NlKCk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblxyXG5mdW5jdGlvbiBnZXRCb25lTGlzdCggb2JqZWN0ICkge1xyXG5cclxuXHRjb25zdCBib25lTGlzdCA9IFtdO1xyXG5cclxuXHRpZiAoIG9iamVjdC5pc0JvbmUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0Ym9uZUxpc3QucHVzaCggb2JqZWN0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0Zm9yICggbGV0IGkgPSAwOyBpIDwgb2JqZWN0LmNoaWxkcmVuLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRib25lTGlzdC5wdXNoKCAuLi5nZXRCb25lTGlzdCggb2JqZWN0LmNoaWxkcmVuWyBpIF0gKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiBib25lTGlzdDtcclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBTa2VsZXRvbkhlbHBlciB9O1xyXG4iLCJpbXBvcnQgeyBNZXNoIH0gZnJvbSAnLi4vb2JqZWN0cy9NZXNoLmpzJztcclxuaW1wb3J0IHsgTWVzaEJhc2ljTWF0ZXJpYWwgfSBmcm9tICcuLi9tYXRlcmlhbHMvTWVzaEJhc2ljTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyBTcGhlcmVHZW9tZXRyeSB9IGZyb20gJy4uL2dlb21ldHJpZXMvU3BoZXJlR2VvbWV0cnkuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgZGlzcGxheXMgYSBoZWxwZXIgb2JqZWN0IGNvbnNpc3Rpbmcgb2YgYSBzcGhlcmljYWwgbWVzaCBmb3JcclxuICogdmlzdWFsaXppbmcgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFBvaW50TGlnaHR9LlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBwb2ludExpZ2h0ID0gbmV3IFRIUkVFLlBvaW50TGlnaHQoIDB4ZmYwMDAwLCAxLCAxMDAgKTtcclxuICogcG9pbnRMaWdodC5wb3NpdGlvbi5zZXQoIDEwLCAxMCwgMTAgKTtcclxuICogc2NlbmUuYWRkKCBwb2ludExpZ2h0ICk7XHJcbiAqXHJcbiAqIGNvbnN0IHNwaGVyZVNpemUgPSAxO1xyXG4gKiBjb25zdCBwb2ludExpZ2h0SGVscGVyID0gbmV3IFRIUkVFLlBvaW50TGlnaHRIZWxwZXIoIHBvaW50TGlnaHQsIHNwaGVyZVNpemUgKTtcclxuICogc2NlbmUuYWRkKCBwb2ludExpZ2h0SGVscGVyICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTWVzaFxyXG4gKi9cclxuY2xhc3MgUG9pbnRMaWdodEhlbHBlciBleHRlbmRzIE1lc2gge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHBvaW50IGxpZ2h0IGhlbHBlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UG9pbnRMaWdodH0gbGlnaHQgLSBUaGUgbGlnaHQgdG8gYmUgdmlzdWFsaXplZC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3NwaGVyZVNpemU9MV0gLSBUaGUgc2l6ZSBvZiB0aGUgc3BoZXJlIGhlbHBlci5cclxuXHQgKiBAcGFyYW0ge251bWJlcnxDb2xvcnxzdHJpbmd9IFtjb2xvcl0gLSBUaGUgaGVscGVyJ3MgY29sb3IuIElmIG5vdCBzZXQsIHRoZSBoZWxwZXIgd2lsbCB0YWtlXHJcblx0ICogdGhlIGNvbG9yIG9mIHRoZSBsaWdodC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbGlnaHQsIHNwaGVyZVNpemUsIGNvbG9yICkge1xyXG5cclxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gbmV3IFNwaGVyZUdlb21ldHJ5KCBzcGhlcmVTaXplLCA0LCAyICk7XHJcblx0XHRjb25zdCBtYXRlcmlhbCA9IG5ldyBNZXNoQmFzaWNNYXRlcmlhbCggeyB3aXJlZnJhbWU6IHRydWUsIGZvZzogZmFsc2UsIHRvbmVNYXBwZWQ6IGZhbHNlIH0gKTtcclxuXHJcblx0XHRzdXBlciggZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbGlnaHQgYmVpbmcgdmlzdWFsaXplZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7SGVtaXNwaGVyZUxpZ2h0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxpZ2h0ID0gbGlnaHQ7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY29sb3IgcGFyYW1ldGVyIHBhc3NlZCBpbiB0aGUgY29uc3RydWN0b3IuXHJcblx0XHQgKiBJZiBub3Qgc2V0LCB0aGUgaGVscGVyIHdpbGwgdGFrZSB0aGUgY29sb3Igb2YgdGhlIGxpZ2h0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ8Q29sb3J8c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvbG9yID0gY29sb3I7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ1BvaW50TGlnaHRIZWxwZXInO1xyXG5cclxuXHRcdHRoaXMubWF0cml4ID0gdGhpcy5saWdodC5tYXRyaXhXb3JsZDtcclxuXHRcdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xyXG5cclxuXHRcdHRoaXMudXBkYXRlKCk7XHJcblxyXG5cclxuXHRcdC8qXHJcblx0Ly8gVE9ETzogZGVsZXRlIHRoaXMgY29tbWVudD9cclxuXHRjb25zdCBkaXN0YW5jZUdlb21ldHJ5ID0gbmV3IFRIUkVFLkljb3NhaGVkcm9uR2VvbWV0cnkoIDEsIDIgKTtcclxuXHRjb25zdCBkaXN0YW5jZU1hdGVyaWFsID0gbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBoZXhDb2xvciwgZm9nOiBmYWxzZSwgd2lyZWZyYW1lOiB0cnVlLCBvcGFjaXR5OiAwLjEsIHRyYW5zcGFyZW50OiB0cnVlIH0gKTtcclxuXHJcblx0dGhpcy5saWdodFNwaGVyZSA9IG5ldyBUSFJFRS5NZXNoKCBidWxiR2VvbWV0cnksIGJ1bGJNYXRlcmlhbCApO1xyXG5cdHRoaXMubGlnaHREaXN0YW5jZSA9IG5ldyBUSFJFRS5NZXNoKCBkaXN0YW5jZUdlb21ldHJ5LCBkaXN0YW5jZU1hdGVyaWFsICk7XHJcblxyXG5cdGNvbnN0IGQgPSBsaWdodC5kaXN0YW5jZTtcclxuXHJcblx0aWYgKCBkID09PSAwLjAgKSB7XHJcblxyXG5cdFx0dGhpcy5saWdodERpc3RhbmNlLnZpc2libGUgPSBmYWxzZTtcclxuXHJcblx0fSBlbHNlIHtcclxuXHJcblx0XHR0aGlzLmxpZ2h0RGlzdGFuY2Uuc2NhbGUuc2V0KCBkLCBkLCBkICk7XHJcblxyXG5cdH1cclxuXHJcblx0dGhpcy5hZGQoIHRoaXMubGlnaHREaXN0YW5jZSApO1xyXG5cdCovXHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRnJlZXMgdGhlIEdQVS1yZWxhdGVkIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhpcyBpbnN0YW5jZS4gQ2FsbCB0aGlzXHJcblx0ICogbWV0aG9kIHdoZW5ldmVyIHRoaXMgaW5zdGFuY2UgaXMgbm8gbG9uZ2VyIHVzZWQgaW4geW91ciBhcHAuXHJcblx0ICovXHJcblx0ZGlzcG9zZSgpIHtcclxuXHJcblx0XHR0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKTtcclxuXHRcdHRoaXMubWF0ZXJpYWwuZGlzcG9zZSgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIGhlbHBlciB0byBtYXRjaCB0aGUgcG9zaXRpb24gb2YgdGhlXHJcblx0ICogbGlnaHQgYmVpbmcgdmlzdWFsaXplZC5cclxuXHQgKi9cclxuXHR1cGRhdGUoKSB7XHJcblxyXG5cdFx0dGhpcy5saWdodC51cGRhdGVXb3JsZE1hdHJpeCggdHJ1ZSwgZmFsc2UgKTtcclxuXHJcblx0XHRpZiAoIHRoaXMuY29sb3IgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHRoaXMubWF0ZXJpYWwuY29sb3Iuc2V0KCB0aGlzLmNvbG9yICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHRoaXMubWF0ZXJpYWwuY29sb3IuY29weSggdGhpcy5saWdodC5jb2xvciApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvKlxyXG5cdFx0Y29uc3QgZCA9IHRoaXMubGlnaHQuZGlzdGFuY2U7XHJcblxyXG5cdFx0aWYgKCBkID09PSAwLjAgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmxpZ2h0RGlzdGFuY2UudmlzaWJsZSA9IGZhbHNlO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR0aGlzLmxpZ2h0RGlzdGFuY2UudmlzaWJsZSA9IHRydWU7XHJcblx0XHRcdHRoaXMubGlnaHREaXN0YW5jZS5zY2FsZS5zZXQoIGQsIGQsIGQgKTtcclxuXHJcblx0XHR9XHJcblx0XHQqL1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgUG9pbnRMaWdodEhlbHBlciB9O1xyXG4iLCJpbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi9tYXRoL0NvbG9yLmpzJztcclxuaW1wb3J0IHsgT2JqZWN0M0QgfSBmcm9tICcuLi9jb3JlL09iamVjdDNELmpzJztcclxuaW1wb3J0IHsgTWVzaCB9IGZyb20gJy4uL29iamVjdHMvTWVzaC5qcyc7XHJcbmltcG9ydCB7IE1lc2hCYXNpY01hdGVyaWFsIH0gZnJvbSAnLi4vbWF0ZXJpYWxzL01lc2hCYXNpY01hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgT2N0YWhlZHJvbkdlb21ldHJ5IH0gZnJvbSAnLi4vZ2VvbWV0cmllcy9PY3RhaGVkcm9uR2VvbWV0cnkuanMnO1xyXG5pbXBvcnQgeyBCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcblxyXG5jb25zdCBfdmVjdG9yID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfY29sb3IxID0gLypAX19QVVJFX18qLyBuZXcgQ29sb3IoKTtcclxuY29uc3QgX2NvbG9yMiA9IC8qQF9fUFVSRV9fKi8gbmV3IENvbG9yKCk7XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIHZpc3VhbCBhaWQgY29uc2lzdGluZyBvZiBhIHNwaGVyaWNhbCBtZXNoIGZvciBhXHJcbiAqIGdpdmVuIHtAbGluayBIZW1pc3BoZXJlTGlnaHR9LlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBsaWdodCA9IG5ldyBUSFJFRS5IZW1pc3BoZXJlTGlnaHQoIDB4ZmZmZmJiLCAweDA4MDgyMCwgMSApO1xyXG4gKiBjb25zdCBoZWxwZXIgPSBuZXcgVEhSRUUuSGVtaXNwaGVyZUxpZ2h0SGVscGVyKCBsaWdodCwgNSApO1xyXG4gKiBzY2VuZS5hZGQoIGhlbHBlciApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIE9iamVjdDNEXHJcbiAqL1xyXG5jbGFzcyBIZW1pc3BoZXJlTGlnaHRIZWxwZXIgZXh0ZW5kcyBPYmplY3QzRCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgaGVtaXNwaGVyZSBsaWdodCBoZWxwZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0hlbWlzcGhlcmVMaWdodH0gbGlnaHQgLSBUaGUgbGlnaHQgdG8gYmUgdmlzdWFsaXplZC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3NpemU9MV0gLSBUaGUgc2l6ZSBvZiB0aGUgbWVzaCB1c2VkIHRvIHZpc3VhbGl6ZSB0aGUgbGlnaHQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ8Q29sb3J8c3RyaW5nfSBbY29sb3JdIC0gVGhlIGhlbHBlcidzIGNvbG9yLiBJZiBub3Qgc2V0LCB0aGUgaGVscGVyIHdpbGwgdGFrZVxyXG5cdCAqIHRoZSBjb2xvciBvZiB0aGUgbGlnaHQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGxpZ2h0LCBzaXplLCBjb2xvciApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGxpZ2h0IGJlaW5nIHZpc3VhbGl6ZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0hlbWlzcGhlcmVMaWdodH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5saWdodCA9IGxpZ2h0O1xyXG5cclxuXHRcdHRoaXMubWF0cml4ID0gbGlnaHQubWF0cml4V29ybGQ7XHJcblx0XHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjb2xvciBwYXJhbWV0ZXIgcGFzc2VkIGluIHRoZSBjb25zdHJ1Y3Rvci5cclxuXHRcdCAqIElmIG5vdCBzZXQsIHRoZSBoZWxwZXIgd2lsbCB0YWtlIHRoZSBjb2xvciBvZiB0aGUgbGlnaHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcnxDb2xvcnxzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29sb3IgPSBjb2xvcjtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnSGVtaXNwaGVyZUxpZ2h0SGVscGVyJztcclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeSA9IG5ldyBPY3RhaGVkcm9uR2VvbWV0cnkoIHNpemUgKTtcclxuXHRcdGdlb21ldHJ5LnJvdGF0ZVkoIE1hdGguUEkgKiAwLjUgKTtcclxuXHJcblx0XHR0aGlzLm1hdGVyaWFsID0gbmV3IE1lc2hCYXNpY01hdGVyaWFsKCB7IHdpcmVmcmFtZTogdHJ1ZSwgZm9nOiBmYWxzZSwgdG9uZU1hcHBlZDogZmFsc2UgfSApO1xyXG5cdFx0aWYgKCB0aGlzLmNvbG9yID09PSB1bmRlZmluZWQgKSB0aGlzLm1hdGVyaWFsLnZlcnRleENvbG9ycyA9IHRydWU7XHJcblxyXG5cdFx0Y29uc3QgcG9zaXRpb24gPSBnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKTtcclxuXHRcdGNvbnN0IGNvbG9ycyA9IG5ldyBGbG9hdDMyQXJyYXkoIHBvc2l0aW9uLmNvdW50ICogMyApO1xyXG5cclxuXHRcdGdlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAzICkgKTtcclxuXHJcblx0XHR0aGlzLmFkZCggbmV3IE1lc2goIGdlb21ldHJ5LCB0aGlzLm1hdGVyaWFsICkgKTtcclxuXHJcblx0XHR0aGlzLnVwZGF0ZSgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZyZWVzIHRoZSBHUFUtcmVsYXRlZCByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHRoaXMgaW5zdGFuY2UuIENhbGwgdGhpc1xyXG5cdCAqIG1ldGhvZCB3aGVuZXZlciB0aGlzIGluc3RhbmNlIGlzIG5vIGxvbmdlciB1c2VkIGluIHlvdXIgYXBwLlxyXG5cdCAqL1xyXG5cdGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0dGhpcy5jaGlsZHJlblsgMCBdLmdlb21ldHJ5LmRpc3Bvc2UoKTtcclxuXHRcdHRoaXMuY2hpbGRyZW5bIDAgXS5tYXRlcmlhbC5kaXNwb3NlKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgaGVscGVyIHRvIG1hdGNoIHRoZSBwb3NpdGlvbiBhbmQgZGlyZWN0aW9uIG9mIHRoZVxyXG5cdCAqIGxpZ2h0IGJlaW5nIHZpc3VhbGl6ZWQuXHJcblx0ICovXHJcblx0dXBkYXRlKCkge1xyXG5cclxuXHRcdGNvbnN0IG1lc2ggPSB0aGlzLmNoaWxkcmVuWyAwIF07XHJcblxyXG5cdFx0aWYgKCB0aGlzLmNvbG9yICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHR0aGlzLm1hdGVyaWFsLmNvbG9yLnNldCggdGhpcy5jb2xvciApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRjb25zdCBjb2xvcnMgPSBtZXNoLmdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ2NvbG9yJyApO1xyXG5cclxuXHRcdFx0X2NvbG9yMS5jb3B5KCB0aGlzLmxpZ2h0LmNvbG9yICk7XHJcblx0XHRcdF9jb2xvcjIuY29weSggdGhpcy5saWdodC5ncm91bmRDb2xvciApO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gY29sb3JzLmNvdW50OyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgY29sb3IgPSAoIGkgPCAoIGwgLyAyICkgKSA/IF9jb2xvcjEgOiBfY29sb3IyO1xyXG5cclxuXHRcdFx0XHRjb2xvcnMuc2V0WFlaKCBpLCBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb2xvcnMubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmxpZ2h0LnVwZGF0ZVdvcmxkTWF0cml4KCB0cnVlLCBmYWxzZSApO1xyXG5cclxuXHRcdG1lc2gubG9va0F0KCBfdmVjdG9yLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5saWdodC5tYXRyaXhXb3JsZCApLm5lZ2F0ZSgpICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBIZW1pc3BoZXJlTGlnaHRIZWxwZXIgfTtcclxuIiwiaW1wb3J0IHsgTGluZVNlZ21lbnRzIH0gZnJvbSAnLi4vb2JqZWN0cy9MaW5lU2VnbWVudHMuanMnO1xyXG5pbXBvcnQgeyBMaW5lQmFzaWNNYXRlcmlhbCB9IGZyb20gJy4uL21hdGVyaWFscy9MaW5lQmFzaWNNYXRlcmlhbC5qcyc7XHJcbmltcG9ydCB7IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcbmltcG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi4vY29yZS9CdWZmZXJHZW9tZXRyeS5qcyc7XHJcbmltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vbWF0aC9Db2xvci5qcyc7XHJcblxyXG4vKipcclxuICogVGhlIGhlbHBlciBpcyBhbiBvYmplY3QgdG8gZGVmaW5lIGdyaWRzLiBHcmlkcyBhcmUgdHdvLWRpbWVuc2lvbmFsXHJcbiAqIGFycmF5cyBvZiBsaW5lcy5cclxuICpcclxuICogYGBganNcclxuICogY29uc3Qgc2l6ZSA9IDEwO1xyXG4gKiBjb25zdCBkaXZpc2lvbnMgPSAxMDtcclxuICpcclxuICogY29uc3QgZ3JpZEhlbHBlciA9IG5ldyBUSFJFRS5HcmlkSGVscGVyKCBzaXplLCBkaXZpc2lvbnMgKTtcclxuICogc2NlbmUuYWRkKCBncmlkSGVscGVyICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTGluZVNlZ21lbnRzXHJcbiAqL1xyXG5jbGFzcyBHcmlkSGVscGVyIGV4dGVuZHMgTGluZVNlZ21lbnRzIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBncmlkIGhlbHBlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbc2l6ZT0xMF0gLSBUaGUgc2l6ZSBvZiB0aGUgZ3JpZC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2RpdmlzaW9ucz0xMF0gLSBUaGUgbnVtYmVyIG9mIGRpdmlzaW9ucyBhY3Jvc3MgdGhlIGdyaWQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ8Q29sb3J8c3RyaW5nfSBbY29sb3IxPTB4NDQ0NDQ0XSAtIFRoZSBjb2xvciBvZiB0aGUgY2VudGVyIGxpbmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ8Q29sb3J8c3RyaW5nfSBbY29sb3IyPTB4ODg4ODg4XSAtIFRoZSBjb2xvciBvZiB0aGUgbGluZXMgb2YgdGhlIGdyaWQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHNpemUgPSAxMCwgZGl2aXNpb25zID0gMTAsIGNvbG9yMSA9IDB4NDQ0NDQ0LCBjb2xvcjIgPSAweDg4ODg4OCApIHtcclxuXHJcblx0XHRjb2xvcjEgPSBuZXcgQ29sb3IoIGNvbG9yMSApO1xyXG5cdFx0Y29sb3IyID0gbmV3IENvbG9yKCBjb2xvcjIgKTtcclxuXHJcblx0XHRjb25zdCBjZW50ZXIgPSBkaXZpc2lvbnMgLyAyO1xyXG5cdFx0Y29uc3Qgc3RlcCA9IHNpemUgLyBkaXZpc2lvbnM7XHJcblx0XHRjb25zdCBoYWxmU2l6ZSA9IHNpemUgLyAyO1xyXG5cclxuXHRcdGNvbnN0IHZlcnRpY2VzID0gW10sIGNvbG9ycyA9IFtdO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgaiA9IDAsIGsgPSAtIGhhbGZTaXplOyBpIDw9IGRpdmlzaW9uczsgaSArKywgayArPSBzdGVwICkge1xyXG5cclxuXHRcdFx0dmVydGljZXMucHVzaCggLSBoYWxmU2l6ZSwgMCwgaywgaGFsZlNpemUsIDAsIGsgKTtcclxuXHRcdFx0dmVydGljZXMucHVzaCggaywgMCwgLSBoYWxmU2l6ZSwgaywgMCwgaGFsZlNpemUgKTtcclxuXHJcblx0XHRcdGNvbnN0IGNvbG9yID0gaSA9PT0gY2VudGVyID8gY29sb3IxIDogY29sb3IyO1xyXG5cclxuXHRcdFx0Y29sb3IudG9BcnJheSggY29sb3JzLCBqICk7IGogKz0gMztcclxuXHRcdFx0Y29sb3IudG9BcnJheSggY29sb3JzLCBqICk7IGogKz0gMztcclxuXHRcdFx0Y29sb3IudG9BcnJheSggY29sb3JzLCBqICk7IGogKz0gMztcclxuXHRcdFx0Y29sb3IudG9BcnJheSggY29sb3JzLCBqICk7IGogKz0gMztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcclxuXHRcdGdlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcclxuXHRcdGdlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGNvbG9ycywgMyApICk7XHJcblxyXG5cdFx0Y29uc3QgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgdmVydGV4Q29sb3JzOiB0cnVlLCB0b25lTWFwcGVkOiBmYWxzZSB9ICk7XHJcblxyXG5cdFx0c3VwZXIoIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdHcmlkSGVscGVyJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGcmVlcyB0aGUgR1BVLXJlbGF0ZWQgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGlzIGluc3RhbmNlLiBDYWxsIHRoaXNcclxuXHQgKiBtZXRob2Qgd2hlbmV2ZXIgdGhpcyBpbnN0YW5jZSBpcyBubyBsb25nZXIgdXNlZCBpbiB5b3VyIGFwcC5cclxuXHQgKi9cclxuXHRkaXNwb3NlKCkge1xyXG5cclxuXHRcdHRoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpO1xyXG5cdFx0dGhpcy5tYXRlcmlhbC5kaXNwb3NlKCk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBHcmlkSGVscGVyIH07XHJcbiIsImltcG9ydCB7IExpbmVTZWdtZW50cyB9IGZyb20gJy4uL29iamVjdHMvTGluZVNlZ21lbnRzLmpzJztcclxuaW1wb3J0IHsgTGluZUJhc2ljTWF0ZXJpYWwgfSBmcm9tICcuLi9tYXRlcmlhbHMvTGluZUJhc2ljTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5pbXBvcnQgeyBCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyR2VvbWV0cnkuanMnO1xyXG5pbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uL21hdGgvQ29sb3IuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgaGVscGVyIGlzIGFuIG9iamVjdCB0byBkZWZpbmUgcG9sYXIgZ3JpZHMuIEdyaWRzIGFyZVxyXG4gKiB0d28tZGltZW5zaW9uYWwgYXJyYXlzIG9mIGxpbmVzLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCByYWRpdXMgPSAxMDtcclxuICogY29uc3Qgc2VjdG9ycyA9IDE2O1xyXG4gKiBjb25zdCByaW5ncyA9IDg7XHJcbiAqIGNvbnN0IGRpdmlzaW9ucyA9IDY0O1xyXG4gKlxyXG4gKiBjb25zdCBoZWxwZXIgPSBuZXcgVEhSRUUuUG9sYXJHcmlkSGVscGVyKCByYWRpdXMsIHNlY3RvcnMsIHJpbmdzLCBkaXZpc2lvbnMgKTtcclxuICogc2NlbmUuYWRkKCBoZWxwZXIgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBMaW5lU2VnbWVudHNcclxuICovXHJcbmNsYXNzIFBvbGFyR3JpZEhlbHBlciBleHRlbmRzIExpbmVTZWdtZW50cyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcG9sYXIgZ3JpZCBoZWxwZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3JhZGl1cz0xMF0gLSBUaGUgcmFkaXVzIG9mIHRoZSBwb2xhciBncmlkLiBUaGlzIGNhbiBiZSBhbnkgcG9zaXRpdmUgbnVtYmVyLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbc2VjdG9ycz0xNl0gLSBUaGUgbnVtYmVyIG9mIHNlY3RvcnMgdGhlIGdyaWQgd2lsbCBiZSBkaXZpZGVkIGludG8uIFRoaXMgY2FuIGJlIGFueSBwb3NpdGl2ZSBpbnRlZ2VyLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbcmluZ3M9MTZdIC0gVGhlIG51bWJlciBvZiByaW5ncy4gVGhpcyBjYW4gYmUgYW55IHBvc2l0aXZlIGludGVnZXIuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtkaXZpc2lvbnM9NjRdIC0gVGhlIG51bWJlciBvZiBsaW5lIHNlZ21lbnRzIHVzZWQgZm9yIGVhY2ggY2lyY2xlLiBUaGlzIGNhbiBiZSBhbnkgcG9zaXRpdmUgaW50ZWdlci5cclxuXHQgKiBAcGFyYW0ge251bWJlcnxDb2xvcnxzdHJpbmd9IFtjb2xvcjE9MHg0NDQ0NDRdIC0gVGhlIGZpcnN0IGNvbG9yIHVzZWQgZm9yIGdyaWQgZWxlbWVudHMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ8Q29sb3J8c3RyaW5nfSBbY29sb3IyPTB4ODg4ODg4XSAtICBUaGUgc2Vjb25kIGNvbG9yIHVzZWQgZm9yIGdyaWQgZWxlbWVudHMuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHJhZGl1cyA9IDEwLCBzZWN0b3JzID0gMTYsIHJpbmdzID0gOCwgZGl2aXNpb25zID0gNjQsIGNvbG9yMSA9IDB4NDQ0NDQ0LCBjb2xvcjIgPSAweDg4ODg4OCApIHtcclxuXHJcblx0XHRjb2xvcjEgPSBuZXcgQ29sb3IoIGNvbG9yMSApO1xyXG5cdFx0Y29sb3IyID0gbmV3IENvbG9yKCBjb2xvcjIgKTtcclxuXHJcblx0XHRjb25zdCB2ZXJ0aWNlcyA9IFtdO1xyXG5cdFx0Y29uc3QgY29sb3JzID0gW107XHJcblxyXG5cdFx0Ly8gY3JlYXRlIHRoZSBzZWN0b3JzXHJcblxyXG5cdFx0aWYgKCBzZWN0b3JzID4gMSApIHtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHNlY3RvcnM7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHYgPSAoIGkgLyBzZWN0b3JzICkgKiAoIE1hdGguUEkgKiAyICk7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHggPSBNYXRoLnNpbiggdiApICogcmFkaXVzO1xyXG5cdFx0XHRcdGNvbnN0IHogPSBNYXRoLmNvcyggdiApICogcmFkaXVzO1xyXG5cclxuXHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCAwLCAwLCAwICk7XHJcblx0XHRcdFx0dmVydGljZXMucHVzaCggeCwgMCwgeiApO1xyXG5cclxuXHRcdFx0XHRjb25zdCBjb2xvciA9ICggaSAmIDEgKSA/IGNvbG9yMSA6IGNvbG9yMjtcclxuXHJcblx0XHRcdFx0Y29sb3JzLnB1c2goIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIgKTtcclxuXHRcdFx0XHRjb2xvcnMucHVzaCggY29sb3IuciwgY29sb3IuZywgY29sb3IuYiApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBjcmVhdGUgdGhlIHJpbmdzXHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgcmluZ3M7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBjb2xvciA9ICggaSAmIDEgKSA/IGNvbG9yMSA6IGNvbG9yMjtcclxuXHJcblx0XHRcdGNvbnN0IHIgPSByYWRpdXMgLSAoIHJhZGl1cyAvIHJpbmdzICogaSApO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGogPSAwOyBqIDwgZGl2aXNpb25zOyBqICsrICkge1xyXG5cclxuXHRcdFx0XHQvLyBmaXJzdCB2ZXJ0ZXhcclxuXHJcblx0XHRcdFx0bGV0IHYgPSAoIGogLyBkaXZpc2lvbnMgKSAqICggTWF0aC5QSSAqIDIgKTtcclxuXHJcblx0XHRcdFx0bGV0IHggPSBNYXRoLnNpbiggdiApICogcjtcclxuXHRcdFx0XHRsZXQgeiA9IE1hdGguY29zKCB2ICkgKiByO1xyXG5cclxuXHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCB4LCAwLCB6ICk7XHJcblx0XHRcdFx0Y29sb3JzLnB1c2goIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIgKTtcclxuXHJcblx0XHRcdFx0Ly8gc2Vjb25kIHZlcnRleFxyXG5cclxuXHRcdFx0XHR2ID0gKCAoIGogKyAxICkgLyBkaXZpc2lvbnMgKSAqICggTWF0aC5QSSAqIDIgKTtcclxuXHJcblx0XHRcdFx0eCA9IE1hdGguc2luKCB2ICkgKiByO1xyXG5cdFx0XHRcdHogPSBNYXRoLmNvcyggdiApICogcjtcclxuXHJcblx0XHRcdFx0dmVydGljZXMucHVzaCggeCwgMCwgeiApO1xyXG5cdFx0XHRcdGNvbG9ycy5wdXNoKCBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XHJcblx0XHRnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XHJcblx0XHRnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdjb2xvcicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBjb2xvcnMsIDMgKSApO1xyXG5cclxuXHRcdGNvbnN0IG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IHZlcnRleENvbG9yczogdHJ1ZSwgdG9uZU1hcHBlZDogZmFsc2UgfSApO1xyXG5cclxuXHRcdHN1cGVyKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnUG9sYXJHcmlkSGVscGVyJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGcmVlcyB0aGUgR1BVLXJlbGF0ZWQgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGlzIGluc3RhbmNlLiBDYWxsIHRoaXNcclxuXHQgKiBtZXRob2Qgd2hlbmV2ZXIgdGhpcyBpbnN0YW5jZSBpcyBubyBsb25nZXIgdXNlZCBpbiB5b3VyIGFwcC5cclxuXHQgKi9cclxuXHRkaXNwb3NlKCkge1xyXG5cclxuXHRcdHRoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpO1xyXG5cdFx0dGhpcy5tYXRlcmlhbC5kaXNwb3NlKCk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBQb2xhckdyaWRIZWxwZXIgfTtcclxuIiwiaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcbmltcG9ydCB7IE9iamVjdDNEIH0gZnJvbSAnLi4vY29yZS9PYmplY3QzRC5qcyc7XHJcbmltcG9ydCB7IExpbmUgfSBmcm9tICcuLi9vYmplY3RzL0xpbmUuanMnO1xyXG5pbXBvcnQgeyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5pbXBvcnQgeyBCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyR2VvbWV0cnkuanMnO1xyXG5pbXBvcnQgeyBMaW5lQmFzaWNNYXRlcmlhbCB9IGZyb20gJy4uL21hdGVyaWFscy9MaW5lQmFzaWNNYXRlcmlhbC5qcyc7XHJcblxyXG5jb25zdCBfdjEgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF92MiA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX3YzID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5cclxuLyoqXHJcbiAqIEhlbHBlciBvYmplY3QgdG8gYXNzaXN0IHdpdGggdmlzdWFsaXppbmcgYSB7QGxpbmsgRGlyZWN0aW9uYWxMaWdodH0nc1xyXG4gKiBlZmZlY3Qgb24gdGhlIHNjZW5lLiBUaGlzIGNvbnNpc3RzIG9mIHBsYW5lIGFuZCBhIGxpbmUgcmVwcmVzZW50aW5nIHRoZVxyXG4gKiBsaWdodCdzIHBvc2l0aW9uIGFuZCBkaXJlY3Rpb24uXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGxpZ2h0ID0gbmV3IFRIUkVFLkRpcmVjdGlvbmFsTGlnaHQoIDB4RkZGRkZGICk7XHJcbiAqIHNjZW5lLmFkZCggbGlnaHQgKTtcclxuICpcclxuICogY29uc3QgaGVscGVyID0gbmV3IFRIUkVFLkRpcmVjdGlvbmFsTGlnaHRIZWxwZXIoIGxpZ2h0LCA1ICk7XHJcbiAqIHNjZW5lLmFkZCggaGVscGVyICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgT2JqZWN0M0RcclxuICovXHJcbmNsYXNzIERpcmVjdGlvbmFsTGlnaHRIZWxwZXIgZXh0ZW5kcyBPYmplY3QzRCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgZGlyZWN0aW9uYWwgbGlnaHQgaGVscGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtEaXJlY3Rpb25hbExpZ2h0fSBsaWdodCAtIFRoZSBsaWdodCB0byBiZSB2aXN1YWxpemVkLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbc2l6ZT0xXSAtIFRoZSBkaW1lbnNpb25zIG9mIHRoZSBwbGFuZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcnxDb2xvcnxzdHJpbmd9IFtjb2xvcl0gLSBUaGUgaGVscGVyJ3MgY29sb3IuIElmIG5vdCBzZXQsIHRoZSBoZWxwZXIgd2lsbCB0YWtlXHJcblx0ICogdGhlIGNvbG9yIG9mIHRoZSBsaWdodC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbGlnaHQsIHNpemUsIGNvbG9yICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbGlnaHQgYmVpbmcgdmlzdWFsaXplZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7RGlyZWN0aW9uYWxMaWdodH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5saWdodCA9IGxpZ2h0O1xyXG5cclxuXHRcdHRoaXMubWF0cml4ID0gbGlnaHQubWF0cml4V29ybGQ7XHJcblx0XHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjb2xvciBwYXJhbWV0ZXIgcGFzc2VkIGluIHRoZSBjb25zdHJ1Y3Rvci5cclxuXHRcdCAqIElmIG5vdCBzZXQsIHRoZSBoZWxwZXIgd2lsbCB0YWtlIHRoZSBjb2xvciBvZiB0aGUgbGlnaHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcnxDb2xvcnxzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29sb3IgPSBjb2xvcjtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnRGlyZWN0aW9uYWxMaWdodEhlbHBlcic7XHJcblxyXG5cdFx0aWYgKCBzaXplID09PSB1bmRlZmluZWQgKSBzaXplID0gMTtcclxuXHJcblx0XHRsZXQgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcclxuXHRcdGdlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIFtcclxuXHRcdFx0LSBzaXplLCBzaXplLCAwLFxyXG5cdFx0XHRzaXplLCBzaXplLCAwLFxyXG5cdFx0XHRzaXplLCAtIHNpemUsIDAsXHJcblx0XHRcdC0gc2l6ZSwgLSBzaXplLCAwLFxyXG5cdFx0XHQtIHNpemUsIHNpemUsIDBcclxuXHRcdF0sIDMgKSApO1xyXG5cclxuXHRcdGNvbnN0IG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGZvZzogZmFsc2UsIHRvbmVNYXBwZWQ6IGZhbHNlIH0gKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENvbnRhaW5zIHRoZSBsaW5lIHNob3dpbmcgdGhlIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3Rpb25hbCBsaWdodC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7TGluZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5saWdodFBsYW5lID0gbmV3IExpbmUoIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG5cdFx0dGhpcy5hZGQoIHRoaXMubGlnaHRQbGFuZSApO1xyXG5cclxuXHRcdGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XHJcblx0XHRnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBbIDAsIDAsIDAsIDAsIDAsIDEgXSwgMyApICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXByZXNlbnRzIHRoZSB0YXJnZXQgbGluZSBvZiB0aGUgZGlyZWN0aW9uYWwgbGlnaHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0xpbmV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudGFyZ2V0TGluZSA9IG5ldyBMaW5lKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuXHRcdHRoaXMuYWRkKCB0aGlzLnRhcmdldExpbmUgKTtcclxuXHJcblx0XHR0aGlzLnVwZGF0ZSgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZyZWVzIHRoZSBHUFUtcmVsYXRlZCByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHRoaXMgaW5zdGFuY2UuIENhbGwgdGhpc1xyXG5cdCAqIG1ldGhvZCB3aGVuZXZlciB0aGlzIGluc3RhbmNlIGlzIG5vIGxvbmdlciB1c2VkIGluIHlvdXIgYXBwLlxyXG5cdCAqL1xyXG5cdGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0dGhpcy5saWdodFBsYW5lLmdlb21ldHJ5LmRpc3Bvc2UoKTtcclxuXHRcdHRoaXMubGlnaHRQbGFuZS5tYXRlcmlhbC5kaXNwb3NlKCk7XHJcblx0XHR0aGlzLnRhcmdldExpbmUuZ2VvbWV0cnkuZGlzcG9zZSgpO1xyXG5cdFx0dGhpcy50YXJnZXRMaW5lLm1hdGVyaWFsLmRpc3Bvc2UoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoZSBoZWxwZXIgdG8gbWF0Y2ggdGhlIHBvc2l0aW9uIGFuZCBkaXJlY3Rpb24gb2YgdGhlXHJcblx0ICogbGlnaHQgYmVpbmcgdmlzdWFsaXplZC5cclxuXHQgKi9cclxuXHR1cGRhdGUoKSB7XHJcblxyXG5cdFx0dGhpcy5saWdodC51cGRhdGVXb3JsZE1hdHJpeCggdHJ1ZSwgZmFsc2UgKTtcclxuXHRcdHRoaXMubGlnaHQudGFyZ2V0LnVwZGF0ZVdvcmxkTWF0cml4KCB0cnVlLCBmYWxzZSApO1xyXG5cclxuXHRcdF92MS5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubGlnaHQubWF0cml4V29ybGQgKTtcclxuXHRcdF92Mi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubGlnaHQudGFyZ2V0Lm1hdHJpeFdvcmxkICk7XHJcblx0XHRfdjMuc3ViVmVjdG9ycyggX3YyLCBfdjEgKTtcclxuXHJcblx0XHR0aGlzLmxpZ2h0UGxhbmUubG9va0F0KCBfdjIgKTtcclxuXHJcblx0XHRpZiAoIHRoaXMuY29sb3IgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHRoaXMubGlnaHRQbGFuZS5tYXRlcmlhbC5jb2xvci5zZXQoIHRoaXMuY29sb3IgKTtcclxuXHRcdFx0dGhpcy50YXJnZXRMaW5lLm1hdGVyaWFsLmNvbG9yLnNldCggdGhpcy5jb2xvciApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuY29sb3IuY29weSggdGhpcy5saWdodC5jb2xvciApO1xyXG5cdFx0XHR0aGlzLnRhcmdldExpbmUubWF0ZXJpYWwuY29sb3IuY29weSggdGhpcy5saWdodC5jb2xvciApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnRhcmdldExpbmUubG9va0F0KCBfdjIgKTtcclxuXHRcdHRoaXMudGFyZ2V0TGluZS5zY2FsZS56ID0gX3YzLmxlbmd0aCgpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgRGlyZWN0aW9uYWxMaWdodEhlbHBlciB9O1xyXG4iLCJpbXBvcnQgeyBDYW1lcmEgfSBmcm9tICcuLi9jYW1lcmFzL0NhbWVyYS5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBMaW5lU2VnbWVudHMgfSBmcm9tICcuLi9vYmplY3RzL0xpbmVTZWdtZW50cy5qcyc7XHJcbmltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vbWF0aC9Db2xvci5qcyc7XHJcbmltcG9ydCB7IExpbmVCYXNpY01hdGVyaWFsIH0gZnJvbSAnLi4vbWF0ZXJpYWxzL0xpbmVCYXNpY01hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcclxuaW1wb3J0IHsgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyQXR0cmlidXRlLmpzJztcclxuaW1wb3J0IHsgV2ViR0xDb29yZGluYXRlU3lzdGVtIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcclxuXHJcbmNvbnN0IF92ZWN0b3IgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF9jYW1lcmEgPSAvKkBfX1BVUkVfXyovIG5ldyBDYW1lcmEoKTtcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGhlbHBzIHdpdGggdmlzdWFsaXppbmcgd2hhdCBhIGNhbWVyYSBjb250YWlucyBpbiBpdHMgZnJ1c3R1bS4gSXRcclxuICogdmlzdWFsaXplcyB0aGUgZnJ1c3R1bSBvZiBhIGNhbWVyYSB1c2luZyBhIGxpbmUgc2VnbWVudHMuXHJcbiAqXHJcbiAqIEJhc2VkIG9uIGZydXN0dW0gdmlzdWFsaXphdGlvbiBpbiBbbGlnaHRnbC5qcyBzaGFkb3dtYXAgZXhhbXBsZV17QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2V2YW53L2xpZ2h0Z2wuanMvYmxvYi9tYXN0ZXIvdGVzdHMvc2hhZG93bWFwLmh0bWx9LlxyXG4gKlxyXG4gKiBgQ2FtZXJhSGVscGVyYCBtdXN0IGJlIGEgY2hpbGQgb2YgdGhlIHNjZW5lLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBjYW1lcmEgPSBuZXcgVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmEoIDc1LCB3aW5kb3cuaW5uZXJXaWR0aCAvIHdpbmRvdy5pbm5lckhlaWdodCwgMC4xLCAxMDAwICk7XHJcbiAqIGNvbnN0IGhlbHBlciA9IG5ldyBUSFJFRS5DYW1lcmFIZWxwZXIoIGNhbWVyYSApO1xyXG4gKiBzY2VuZS5hZGQoIGhlbHBlciApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIExpbmVTZWdtZW50c1xyXG4gKi9cclxuY2xhc3MgQ2FtZXJhSGVscGVyIGV4dGVuZHMgTGluZVNlZ21lbnRzIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBhcnJvdyBoZWxwZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0NhbWVyYX0gY2FtZXJhIC0gVGhlIGNhbWVyYSB0byB2aXN1YWxpemUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGNhbWVyYSApIHtcclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xyXG5cdFx0Y29uc3QgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IDB4ZmZmZmZmLCB2ZXJ0ZXhDb2xvcnM6IHRydWUsIHRvbmVNYXBwZWQ6IGZhbHNlIH0gKTtcclxuXHJcblx0XHRjb25zdCB2ZXJ0aWNlcyA9IFtdO1xyXG5cdFx0Y29uc3QgY29sb3JzID0gW107XHJcblxyXG5cdFx0Y29uc3QgcG9pbnRNYXAgPSB7fTtcclxuXHJcblx0XHQvLyBuZWFyXHJcblxyXG5cdFx0YWRkTGluZSggJ24xJywgJ24yJyApO1xyXG5cdFx0YWRkTGluZSggJ24yJywgJ240JyApO1xyXG5cdFx0YWRkTGluZSggJ240JywgJ24zJyApO1xyXG5cdFx0YWRkTGluZSggJ24zJywgJ24xJyApO1xyXG5cclxuXHRcdC8vIGZhclxyXG5cclxuXHRcdGFkZExpbmUoICdmMScsICdmMicgKTtcclxuXHRcdGFkZExpbmUoICdmMicsICdmNCcgKTtcclxuXHRcdGFkZExpbmUoICdmNCcsICdmMycgKTtcclxuXHRcdGFkZExpbmUoICdmMycsICdmMScgKTtcclxuXHJcblx0XHQvLyBzaWRlc1xyXG5cclxuXHRcdGFkZExpbmUoICduMScsICdmMScgKTtcclxuXHRcdGFkZExpbmUoICduMicsICdmMicgKTtcclxuXHRcdGFkZExpbmUoICduMycsICdmMycgKTtcclxuXHRcdGFkZExpbmUoICduNCcsICdmNCcgKTtcclxuXHJcblx0XHQvLyBjb25lXHJcblxyXG5cdFx0YWRkTGluZSggJ3AnLCAnbjEnICk7XHJcblx0XHRhZGRMaW5lKCAncCcsICduMicgKTtcclxuXHRcdGFkZExpbmUoICdwJywgJ24zJyApO1xyXG5cdFx0YWRkTGluZSggJ3AnLCAnbjQnICk7XHJcblxyXG5cdFx0Ly8gdXBcclxuXHJcblx0XHRhZGRMaW5lKCAndTEnLCAndTInICk7XHJcblx0XHRhZGRMaW5lKCAndTInLCAndTMnICk7XHJcblx0XHRhZGRMaW5lKCAndTMnLCAndTEnICk7XHJcblxyXG5cdFx0Ly8gdGFyZ2V0XHJcblxyXG5cdFx0YWRkTGluZSggJ2MnLCAndCcgKTtcclxuXHRcdGFkZExpbmUoICdwJywgJ2MnICk7XHJcblxyXG5cdFx0Ly8gY3Jvc3NcclxuXHJcblx0XHRhZGRMaW5lKCAnY24xJywgJ2NuMicgKTtcclxuXHRcdGFkZExpbmUoICdjbjMnLCAnY240JyApO1xyXG5cclxuXHRcdGFkZExpbmUoICdjZjEnLCAnY2YyJyApO1xyXG5cdFx0YWRkTGluZSggJ2NmMycsICdjZjQnICk7XHJcblxyXG5cdFx0ZnVuY3Rpb24gYWRkTGluZSggYSwgYiApIHtcclxuXHJcblx0XHRcdGFkZFBvaW50KCBhICk7XHJcblx0XHRcdGFkZFBvaW50KCBiICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIGFkZFBvaW50KCBpZCApIHtcclxuXHJcblx0XHRcdHZlcnRpY2VzLnB1c2goIDAsIDAsIDAgKTtcclxuXHRcdFx0Y29sb3JzLnB1c2goIDAsIDAsIDAgKTtcclxuXHJcblx0XHRcdGlmICggcG9pbnRNYXBbIGlkIF0gPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0cG9pbnRNYXBbIGlkIF0gPSBbXTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHBvaW50TWFwWyBpZCBdLnB1c2goICggdmVydGljZXMubGVuZ3RoIC8gMyApIC0gMSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XHJcblx0XHRnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdjb2xvcicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBjb2xvcnMsIDMgKSApO1xyXG5cclxuXHRcdHN1cGVyKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnQ2FtZXJhSGVscGVyJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjYW1lcmEgYmVpbmcgdmlzdWFsaXplZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Q2FtZXJhfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNhbWVyYSA9IGNhbWVyYTtcclxuXHRcdGlmICggdGhpcy5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCApIHRoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcclxuXHJcblx0XHR0aGlzLm1hdHJpeCA9IGNhbWVyYS5tYXRyaXhXb3JsZDtcclxuXHRcdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBjb250YWlucyB0aGUgcG9pbnRzIHVzZWQgdG8gdmlzdWFsaXplIHRoZSBjYW1lcmEuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdDxzdHJpbmcsQXJyYXk8bnVtYmVyPj59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucG9pbnRNYXAgPSBwb2ludE1hcDtcclxuXHJcblx0XHR0aGlzLnVwZGF0ZSgpO1xyXG5cclxuXHRcdC8vIGNvbG9yc1xyXG5cclxuXHRcdGNvbnN0IGNvbG9yRnJ1c3R1bSA9IG5ldyBDb2xvciggMHhmZmFhMDAgKTtcclxuXHRcdGNvbnN0IGNvbG9yQ29uZSA9IG5ldyBDb2xvciggMHhmZjAwMDAgKTtcclxuXHRcdGNvbnN0IGNvbG9yVXAgPSBuZXcgQ29sb3IoIDB4MDBhYWZmICk7XHJcblx0XHRjb25zdCBjb2xvclRhcmdldCA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTtcclxuXHRcdGNvbnN0IGNvbG9yQ3Jvc3MgPSBuZXcgQ29sb3IoIDB4MzMzMzMzICk7XHJcblxyXG5cdFx0dGhpcy5zZXRDb2xvcnMoIGNvbG9yRnJ1c3R1bSwgY29sb3JDb25lLCBjb2xvclVwLCBjb2xvclRhcmdldCwgY29sb3JDcm9zcyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgdGhlIGNvbG9ycyBvZiB0aGUgaGVscGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtDb2xvcn0gZnJ1c3R1bSAtIFRoZSBmcnVzdHVtIGxpbmUgY29sb3IuXHJcblx0ICogQHBhcmFtIHtDb2xvcn0gY29uZSAtIFRoZSBjb25lIGxpbmUgY29sb3IuXHJcblx0ICogQHBhcmFtIHtDb2xvcn0gdXAgLSBUaGUgdXAgbGluZSBjb2xvci5cclxuXHQgKiBAcGFyYW0ge0NvbG9yfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IGxpbmUgY29sb3IuXHJcblx0ICogQHBhcmFtIHtDb2xvcn0gY3Jvc3MgLSBUaGUgY3Jvc3MgbGluZSBjb2xvci5cclxuXHQgKi9cclxuXHRzZXRDb2xvcnMoIGZydXN0dW0sIGNvbmUsIHVwLCB0YXJnZXQsIGNyb3NzICkge1xyXG5cclxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcclxuXHJcblx0XHRjb25zdCBjb2xvckF0dHJpYnV0ZSA9IGdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ2NvbG9yJyApO1xyXG5cclxuXHRcdC8vIG5lYXJcclxuXHJcblx0XHRjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDAsIGZydXN0dW0uciwgZnJ1c3R1bS5nLCBmcnVzdHVtLmIgKTsgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKCAxLCBmcnVzdHVtLnIsIGZydXN0dW0uZywgZnJ1c3R1bS5iICk7IC8vIG4xLCBuMlxyXG5cdFx0Y29sb3JBdHRyaWJ1dGUuc2V0WFlaKCAyLCBmcnVzdHVtLnIsIGZydXN0dW0uZywgZnJ1c3R1bS5iICk7IGNvbG9yQXR0cmlidXRlLnNldFhZWiggMywgZnJ1c3R1bS5yLCBmcnVzdHVtLmcsIGZydXN0dW0uYiApOyAvLyBuMiwgbjRcclxuXHRcdGNvbG9yQXR0cmlidXRlLnNldFhZWiggNCwgZnJ1c3R1bS5yLCBmcnVzdHVtLmcsIGZydXN0dW0uYiApOyBjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDUsIGZydXN0dW0uciwgZnJ1c3R1bS5nLCBmcnVzdHVtLmIgKTsgLy8gbjQsIG4zXHJcblx0XHRjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDYsIGZydXN0dW0uciwgZnJ1c3R1bS5nLCBmcnVzdHVtLmIgKTsgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKCA3LCBmcnVzdHVtLnIsIGZydXN0dW0uZywgZnJ1c3R1bS5iICk7IC8vIG4zLCBuMVxyXG5cclxuXHRcdC8vIGZhclxyXG5cclxuXHRcdGNvbG9yQXR0cmlidXRlLnNldFhZWiggOCwgZnJ1c3R1bS5yLCBmcnVzdHVtLmcsIGZydXN0dW0uYiApOyBjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDksIGZydXN0dW0uciwgZnJ1c3R1bS5nLCBmcnVzdHVtLmIgKTsgLy8gZjEsIGYyXHJcblx0XHRjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDEwLCBmcnVzdHVtLnIsIGZydXN0dW0uZywgZnJ1c3R1bS5iICk7IGNvbG9yQXR0cmlidXRlLnNldFhZWiggMTEsIGZydXN0dW0uciwgZnJ1c3R1bS5nLCBmcnVzdHVtLmIgKTsgLy8gZjIsIGY0XHJcblx0XHRjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDEyLCBmcnVzdHVtLnIsIGZydXN0dW0uZywgZnJ1c3R1bS5iICk7IGNvbG9yQXR0cmlidXRlLnNldFhZWiggMTMsIGZydXN0dW0uciwgZnJ1c3R1bS5nLCBmcnVzdHVtLmIgKTsgLy8gZjQsIGYzXHJcblx0XHRjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDE0LCBmcnVzdHVtLnIsIGZydXN0dW0uZywgZnJ1c3R1bS5iICk7IGNvbG9yQXR0cmlidXRlLnNldFhZWiggMTUsIGZydXN0dW0uciwgZnJ1c3R1bS5nLCBmcnVzdHVtLmIgKTsgLy8gZjMsIGYxXHJcblxyXG5cdFx0Ly8gc2lkZXNcclxuXHJcblx0XHRjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDE2LCBmcnVzdHVtLnIsIGZydXN0dW0uZywgZnJ1c3R1bS5iICk7IGNvbG9yQXR0cmlidXRlLnNldFhZWiggMTcsIGZydXN0dW0uciwgZnJ1c3R1bS5nLCBmcnVzdHVtLmIgKTsgLy8gbjEsIGYxXHJcblx0XHRjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDE4LCBmcnVzdHVtLnIsIGZydXN0dW0uZywgZnJ1c3R1bS5iICk7IGNvbG9yQXR0cmlidXRlLnNldFhZWiggMTksIGZydXN0dW0uciwgZnJ1c3R1bS5nLCBmcnVzdHVtLmIgKTsgLy8gbjIsIGYyXHJcblx0XHRjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDIwLCBmcnVzdHVtLnIsIGZydXN0dW0uZywgZnJ1c3R1bS5iICk7IGNvbG9yQXR0cmlidXRlLnNldFhZWiggMjEsIGZydXN0dW0uciwgZnJ1c3R1bS5nLCBmcnVzdHVtLmIgKTsgLy8gbjMsIGYzXHJcblx0XHRjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDIyLCBmcnVzdHVtLnIsIGZydXN0dW0uZywgZnJ1c3R1bS5iICk7IGNvbG9yQXR0cmlidXRlLnNldFhZWiggMjMsIGZydXN0dW0uciwgZnJ1c3R1bS5nLCBmcnVzdHVtLmIgKTsgLy8gbjQsIGY0XHJcblxyXG5cdFx0Ly8gY29uZVxyXG5cclxuXHRcdGNvbG9yQXR0cmlidXRlLnNldFhZWiggMjQsIGNvbmUuciwgY29uZS5nLCBjb25lLmIgKTsgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKCAyNSwgY29uZS5yLCBjb25lLmcsIGNvbmUuYiApOyAvLyBwLCBuMVxyXG5cdFx0Y29sb3JBdHRyaWJ1dGUuc2V0WFlaKCAyNiwgY29uZS5yLCBjb25lLmcsIGNvbmUuYiApOyBjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDI3LCBjb25lLnIsIGNvbmUuZywgY29uZS5iICk7IC8vIHAsIG4yXHJcblx0XHRjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDI4LCBjb25lLnIsIGNvbmUuZywgY29uZS5iICk7IGNvbG9yQXR0cmlidXRlLnNldFhZWiggMjksIGNvbmUuciwgY29uZS5nLCBjb25lLmIgKTsgLy8gcCwgbjNcclxuXHRcdGNvbG9yQXR0cmlidXRlLnNldFhZWiggMzAsIGNvbmUuciwgY29uZS5nLCBjb25lLmIgKTsgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKCAzMSwgY29uZS5yLCBjb25lLmcsIGNvbmUuYiApOyAvLyBwLCBuNFxyXG5cclxuXHRcdC8vIHVwXHJcblxyXG5cdFx0Y29sb3JBdHRyaWJ1dGUuc2V0WFlaKCAzMiwgdXAuciwgdXAuZywgdXAuYiApOyBjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDMzLCB1cC5yLCB1cC5nLCB1cC5iICk7IC8vIHUxLCB1MlxyXG5cdFx0Y29sb3JBdHRyaWJ1dGUuc2V0WFlaKCAzNCwgdXAuciwgdXAuZywgdXAuYiApOyBjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDM1LCB1cC5yLCB1cC5nLCB1cC5iICk7IC8vIHUyLCB1M1xyXG5cdFx0Y29sb3JBdHRyaWJ1dGUuc2V0WFlaKCAzNiwgdXAuciwgdXAuZywgdXAuYiApOyBjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDM3LCB1cC5yLCB1cC5nLCB1cC5iICk7IC8vIHUzLCB1MVxyXG5cclxuXHRcdC8vIHRhcmdldFxyXG5cclxuXHRcdGNvbG9yQXR0cmlidXRlLnNldFhZWiggMzgsIHRhcmdldC5yLCB0YXJnZXQuZywgdGFyZ2V0LmIgKTsgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKCAzOSwgdGFyZ2V0LnIsIHRhcmdldC5nLCB0YXJnZXQuYiApOyAvLyBjLCB0XHJcblx0XHRjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDQwLCBjcm9zcy5yLCBjcm9zcy5nLCBjcm9zcy5iICk7IGNvbG9yQXR0cmlidXRlLnNldFhZWiggNDEsIGNyb3NzLnIsIGNyb3NzLmcsIGNyb3NzLmIgKTsgLy8gcCwgY1xyXG5cclxuXHRcdC8vIGNyb3NzXHJcblxyXG5cdFx0Y29sb3JBdHRyaWJ1dGUuc2V0WFlaKCA0MiwgY3Jvc3MuciwgY3Jvc3MuZywgY3Jvc3MuYiApOyBjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDQzLCBjcm9zcy5yLCBjcm9zcy5nLCBjcm9zcy5iICk7IC8vIGNuMSwgY24yXHJcblx0XHRjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDQ0LCBjcm9zcy5yLCBjcm9zcy5nLCBjcm9zcy5iICk7IGNvbG9yQXR0cmlidXRlLnNldFhZWiggNDUsIGNyb3NzLnIsIGNyb3NzLmcsIGNyb3NzLmIgKTsgLy8gY24zLCBjbjRcclxuXHJcblx0XHRjb2xvckF0dHJpYnV0ZS5zZXRYWVooIDQ2LCBjcm9zcy5yLCBjcm9zcy5nLCBjcm9zcy5iICk7IGNvbG9yQXR0cmlidXRlLnNldFhZWiggNDcsIGNyb3NzLnIsIGNyb3NzLmcsIGNyb3NzLmIgKTsgLy8gY2YxLCBjZjJcclxuXHRcdGNvbG9yQXR0cmlidXRlLnNldFhZWiggNDgsIGNyb3NzLnIsIGNyb3NzLmcsIGNyb3NzLmIgKTsgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKCA0OSwgY3Jvc3MuciwgY3Jvc3MuZywgY3Jvc3MuYiApOyAvLyBjZjMsIGNmNFxyXG5cclxuXHRcdGNvbG9yQXR0cmlidXRlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoZSBoZWxwZXIgYmFzZWQgb24gdGhlIHByb2plY3Rpb24gbWF0cml4IG9mIHRoZSBjYW1lcmEuXHJcblx0ICovXHJcblx0dXBkYXRlKCkge1xyXG5cclxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcclxuXHRcdGNvbnN0IHBvaW50TWFwID0gdGhpcy5wb2ludE1hcDtcclxuXHJcblx0XHRjb25zdCB3ID0gMSwgaCA9IDE7XHJcblxyXG5cdFx0Ly8gd2UgbmVlZCBqdXN0IGNhbWVyYSBwcm9qZWN0aW9uIG1hdHJpeCBpbnZlcnNlXHJcblx0XHQvLyB3b3JsZCBtYXRyaXggbXVzdCBiZSBpZGVudGl0eVxyXG5cclxuXHRcdF9jYW1lcmEucHJvamVjdGlvbk1hdHJpeEludmVyc2UuY29weSggdGhpcy5jYW1lcmEucHJvamVjdGlvbk1hdHJpeEludmVyc2UgKTtcclxuXHJcblx0XHQvLyBBZGp1c3QgeiB2YWx1ZXMgYmFzZWQgb24gY29vcmRpbmF0ZSBzeXN0ZW1cclxuXHRcdGNvbnN0IG5lYXJaID0gdGhpcy5jYW1lcmEuY29vcmRpbmF0ZVN5c3RlbSA9PT0gV2ViR0xDb29yZGluYXRlU3lzdGVtID8gLSAxIDogMDtcclxuXHJcblx0XHQvLyBjZW50ZXIgLyB0YXJnZXRcclxuXHRcdHNldFBvaW50KCAnYycsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgMCwgMCwgbmVhclogKTtcclxuXHRcdHNldFBvaW50KCAndCcsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgMCwgMCwgMSApO1xyXG5cclxuXHRcdC8vIG5lYXJcclxuXHJcblx0XHRzZXRQb2ludCggJ24xJywgcG9pbnRNYXAsIGdlb21ldHJ5LCBfY2FtZXJhLCAtIHcsIC0gaCwgbmVhclogKTtcclxuXHRcdHNldFBvaW50KCAnbjInLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIHcsIC0gaCwgbmVhclogKTtcclxuXHRcdHNldFBvaW50KCAnbjMnLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIC0gdywgaCwgbmVhclogKTtcclxuXHRcdHNldFBvaW50KCAnbjQnLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIHcsIGgsIG5lYXJaICk7XHJcblxyXG5cdFx0Ly8gZmFyXHJcblxyXG5cdFx0c2V0UG9pbnQoICdmMScsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgLSB3LCAtIGgsIDEgKTtcclxuXHRcdHNldFBvaW50KCAnZjInLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIHcsIC0gaCwgMSApO1xyXG5cdFx0c2V0UG9pbnQoICdmMycsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgLSB3LCBoLCAxICk7XHJcblx0XHRzZXRQb2ludCggJ2Y0JywgcG9pbnRNYXAsIGdlb21ldHJ5LCBfY2FtZXJhLCB3LCBoLCAxICk7XHJcblxyXG5cdFx0Ly8gdXBcclxuXHJcblx0XHRzZXRQb2ludCggJ3UxJywgcG9pbnRNYXAsIGdlb21ldHJ5LCBfY2FtZXJhLCB3ICogMC43LCBoICogMS4xLCBuZWFyWiApO1xyXG5cdFx0c2V0UG9pbnQoICd1MicsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgLSB3ICogMC43LCBoICogMS4xLCBuZWFyWiApO1xyXG5cdFx0c2V0UG9pbnQoICd1MycsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgMCwgaCAqIDIsIG5lYXJaICk7XHJcblxyXG5cdFx0Ly8gY3Jvc3NcclxuXHJcblx0XHRzZXRQb2ludCggJ2NmMScsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgLSB3LCAwLCAxICk7XHJcblx0XHRzZXRQb2ludCggJ2NmMicsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgdywgMCwgMSApO1xyXG5cdFx0c2V0UG9pbnQoICdjZjMnLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIDAsIC0gaCwgMSApO1xyXG5cdFx0c2V0UG9pbnQoICdjZjQnLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIDAsIGgsIDEgKTtcclxuXHJcblx0XHRzZXRQb2ludCggJ2NuMScsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgLSB3LCAwLCBuZWFyWiApO1xyXG5cdFx0c2V0UG9pbnQoICdjbjInLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIHcsIDAsIG5lYXJaICk7XHJcblx0XHRzZXRQb2ludCggJ2NuMycsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgMCwgLSBoLCBuZWFyWiApO1xyXG5cdFx0c2V0UG9pbnQoICdjbjQnLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIDAsIGgsIG5lYXJaICk7XHJcblxyXG5cdFx0Z2VvbWV0cnkuZ2V0QXR0cmlidXRlKCAncG9zaXRpb24nICkubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZyZWVzIHRoZSBHUFUtcmVsYXRlZCByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHRoaXMgaW5zdGFuY2UuIENhbGwgdGhpc1xyXG5cdCAqIG1ldGhvZCB3aGVuZXZlciB0aGlzIGluc3RhbmNlIGlzIG5vIGxvbmdlciB1c2VkIGluIHlvdXIgYXBwLlxyXG5cdCAqL1xyXG5cdGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0dGhpcy5nZW9tZXRyeS5kaXNwb3NlKCk7XHJcblx0XHR0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbmZ1bmN0aW9uIHNldFBvaW50KCBwb2ludCwgcG9pbnRNYXAsIGdlb21ldHJ5LCBjYW1lcmEsIHgsIHksIHogKSB7XHJcblxyXG5cdF92ZWN0b3Iuc2V0KCB4LCB5LCB6ICkudW5wcm9qZWN0KCBjYW1lcmEgKTtcclxuXHJcblx0Y29uc3QgcG9pbnRzID0gcG9pbnRNYXBbIHBvaW50IF07XHJcblxyXG5cdGlmICggcG9pbnRzICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0Y29uc3QgcG9zaXRpb24gPSBnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBwb2ludHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdHBvc2l0aW9uLnNldFhZWiggcG9pbnRzWyBpIF0sIF92ZWN0b3IueCwgX3ZlY3Rvci55LCBfdmVjdG9yLnogKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IENhbWVyYUhlbHBlciB9O1xyXG4iLCJpbXBvcnQgeyBCb3gzIH0gZnJvbSAnLi4vbWF0aC9Cb3gzLmpzJztcclxuaW1wb3J0IHsgTGluZVNlZ21lbnRzIH0gZnJvbSAnLi4vb2JqZWN0cy9MaW5lU2VnbWVudHMuanMnO1xyXG5pbXBvcnQgeyBMaW5lQmFzaWNNYXRlcmlhbCB9IGZyb20gJy4uL21hdGVyaWFscy9MaW5lQmFzaWNNYXRlcmlhbC5qcyc7XHJcbmltcG9ydCB7IEJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyQXR0cmlidXRlLmpzJztcclxuaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcclxuXHJcbmNvbnN0IF9ib3ggPSAvKkBfX1BVUkVfXyovIG5ldyBCb3gzKCk7XHJcblxyXG4vKipcclxuICogSGVscGVyIG9iamVjdCB0byBncmFwaGljYWxseSBzaG93IHRoZSB3b3JsZC1heGlzLWFsaWduZWQgYm91bmRpbmcgYm94XHJcbiAqIGFyb3VuZCBhbiBvYmplY3QuIFRoZSBhY3R1YWwgYm91bmRpbmcgYm94IGlzIGhhbmRsZWQgd2l0aCB7QGxpbmsgQm94M30sXHJcbiAqIHRoaXMgaXMganVzdCBhIHZpc3VhbCBoZWxwZXIgZm9yIGRlYnVnZ2luZy4gSXQgY2FuIGJlIGF1dG9tYXRpY2FsbHlcclxuICogcmVzaXplZCB3aXRoIHtAbGluayBCb3hIZWxwZXIjdXBkYXRlfSB3aGVuIHRoZSBvYmplY3QgaXQncyBjcmVhdGVkIGZyb21cclxuICogaXMgdHJhbnNmb3JtZWQuIE5vdGUgdGhhdCB0aGUgb2JqZWN0IG11c3QgaGF2ZSBhIGdlb21ldHJ5IGZvciB0aGlzIHRvIHdvcmssXHJcbiAqIHNvIGl0IHdvbid0IHdvcmsgd2l0aCBzcHJpdGVzLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBzcGhlcmUgPSBuZXcgVEhSRUUuU3BoZXJlR2VvbWV0cnkoKTtcclxuICogY29uc3Qgb2JqZWN0ID0gbmV3IFRIUkVFLk1lc2goIHNwaGVyZSwgbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKCAweGZmMDAwMCApICk7XHJcbiAqIGNvbnN0IGJveCA9IG5ldyBUSFJFRS5Cb3hIZWxwZXIoIG9iamVjdCwgMHhmZmZmMDAgKTtcclxuICogc2NlbmUuYWRkKCBib3ggKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBMaW5lU2VnbWVudHNcclxuICovXHJcbmNsYXNzIEJveEhlbHBlciBleHRlbmRzIExpbmVTZWdtZW50cyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYm94IGhlbHBlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0M0R9IFtvYmplY3RdIC0gVGhlIDNEIG9iamVjdCB0byBzaG93IHRoZSB3b3JsZC1heGlzLWFsaWduZWQgYm91bmRpbmcgYm94LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfENvbG9yfHN0cmluZ30gW2NvbG9yPTB4ZmZmZjAwXSAtIFRoZSBib3gncyBjb2xvci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggb2JqZWN0LCBjb2xvciA9IDB4ZmZmZjAwICkge1xyXG5cclxuXHRcdGNvbnN0IGluZGljZXMgPSBuZXcgVWludDE2QXJyYXkoIFsgMCwgMSwgMSwgMiwgMiwgMywgMywgMCwgNCwgNSwgNSwgNiwgNiwgNywgNywgNCwgMCwgNCwgMSwgNSwgMiwgNiwgMywgNyBdICk7XHJcblx0XHRjb25zdCBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkFycmF5KCA4ICogMyApO1xyXG5cclxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XHJcblx0XHRnZW9tZXRyeS5zZXRJbmRleCggbmV3IEJ1ZmZlckF0dHJpYnV0ZSggaW5kaWNlcywgMSApICk7XHJcblx0XHRnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9ucywgMyApICk7XHJcblxyXG5cdFx0c3VwZXIoIGdlb21ldHJ5LCBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGNvbG9yLCB0b25lTWFwcGVkOiBmYWxzZSB9ICkgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSAzRCBvYmplY3QgYmVpbmcgdmlzdWFsaXplZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0M0R9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMub2JqZWN0ID0gb2JqZWN0O1xyXG5cdFx0dGhpcy50eXBlID0gJ0JveEhlbHBlcic7XHJcblxyXG5cdFx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XHJcblxyXG5cdFx0dGhpcy51cGRhdGUoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoZSBoZWxwZXIncyBnZW9tZXRyeSB0byBtYXRjaCB0aGUgZGltZW5zaW9ucyBvZiB0aGUgb2JqZWN0LFxyXG5cdCAqIGluY2x1ZGluZyBhbnkgY2hpbGRyZW4uXHJcblx0ICovXHJcblx0dXBkYXRlKCkge1xyXG5cclxuXHRcdGlmICggdGhpcy5vYmplY3QgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdF9ib3guc2V0RnJvbU9iamVjdCggdGhpcy5vYmplY3QgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBfYm94LmlzRW1wdHkoKSApIHJldHVybjtcclxuXHJcblx0XHRjb25zdCBtaW4gPSBfYm94Lm1pbjtcclxuXHRcdGNvbnN0IG1heCA9IF9ib3gubWF4O1xyXG5cclxuXHRcdC8qXHJcblx0XHRcdDVfX19fNFxyXG5cdFx0MS9fX18wL3xcclxuXHRcdHwgNl9ffF83XHJcblx0XHQyL19fXzMvXHJcblxyXG5cdFx0MDogbWF4LngsIG1heC55LCBtYXguelxyXG5cdFx0MTogbWluLngsIG1heC55LCBtYXguelxyXG5cdFx0MjogbWluLngsIG1pbi55LCBtYXguelxyXG5cdFx0MzogbWF4LngsIG1pbi55LCBtYXguelxyXG5cdFx0NDogbWF4LngsIG1heC55LCBtaW4uelxyXG5cdFx0NTogbWluLngsIG1heC55LCBtaW4uelxyXG5cdFx0NjogbWluLngsIG1pbi55LCBtaW4uelxyXG5cdFx0NzogbWF4LngsIG1pbi55LCBtaW4uelxyXG5cdFx0Ki9cclxuXHJcblx0XHRjb25zdCBwb3NpdGlvbiA9IHRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjtcclxuXHRcdGNvbnN0IGFycmF5ID0gcG9zaXRpb24uYXJyYXk7XHJcblxyXG5cdFx0YXJyYXlbIDAgXSA9IG1heC54OyBhcnJheVsgMSBdID0gbWF4Lnk7IGFycmF5WyAyIF0gPSBtYXguejtcclxuXHRcdGFycmF5WyAzIF0gPSBtaW4ueDsgYXJyYXlbIDQgXSA9IG1heC55OyBhcnJheVsgNSBdID0gbWF4Lno7XHJcblx0XHRhcnJheVsgNiBdID0gbWluLng7IGFycmF5WyA3IF0gPSBtaW4ueTsgYXJyYXlbIDggXSA9IG1heC56O1xyXG5cdFx0YXJyYXlbIDkgXSA9IG1heC54OyBhcnJheVsgMTAgXSA9IG1pbi55OyBhcnJheVsgMTEgXSA9IG1heC56O1xyXG5cdFx0YXJyYXlbIDEyIF0gPSBtYXgueDsgYXJyYXlbIDEzIF0gPSBtYXgueTsgYXJyYXlbIDE0IF0gPSBtaW4uejtcclxuXHRcdGFycmF5WyAxNSBdID0gbWluLng7IGFycmF5WyAxNiBdID0gbWF4Lnk7IGFycmF5WyAxNyBdID0gbWluLno7XHJcblx0XHRhcnJheVsgMTggXSA9IG1pbi54OyBhcnJheVsgMTkgXSA9IG1pbi55OyBhcnJheVsgMjAgXSA9IG1pbi56O1xyXG5cdFx0YXJyYXlbIDIxIF0gPSBtYXgueDsgYXJyYXlbIDIyIF0gPSBtaW4ueTsgYXJyYXlbIDIzIF0gPSBtaW4uejtcclxuXHJcblx0XHRwb3NpdGlvbi5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy5nZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoZSB3aXJlZnJhbWUgYm94IGZvciB0aGUgcGFzc2VkIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0M0R9IG9iamVjdCAtIFRoZSAzRCBvYmplY3QgdG8gY3JlYXRlIHRoZSBoZWxwZXIgZm9yLlxyXG5cdCAqIEByZXR1cm4ge0JveEhlbHBlcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRzZXRGcm9tT2JqZWN0KCBvYmplY3QgKSB7XHJcblxyXG5cdFx0dGhpcy5vYmplY3QgPSBvYmplY3Q7XHJcblx0XHR0aGlzLnVwZGF0ZSgpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSwgcmVjdXJzaXZlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSwgcmVjdXJzaXZlICk7XHJcblxyXG5cdFx0dGhpcy5vYmplY3QgPSBzb3VyY2Uub2JqZWN0O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZyZWVzIHRoZSBHUFUtcmVsYXRlZCByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHRoaXMgaW5zdGFuY2UuIENhbGwgdGhpc1xyXG5cdCAqIG1ldGhvZCB3aGVuZXZlciB0aGlzIGluc3RhbmNlIGlzIG5vIGxvbmdlciB1c2VkIGluIHlvdXIgYXBwLlxyXG5cdCAqL1xyXG5cdGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0dGhpcy5nZW9tZXRyeS5kaXNwb3NlKCk7XHJcblx0XHR0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCB7IEJveEhlbHBlciB9O1xyXG4iLCJpbXBvcnQgeyBMaW5lU2VnbWVudHMgfSBmcm9tICcuLi9vYmplY3RzL0xpbmVTZWdtZW50cy5qcyc7XHJcbmltcG9ydCB7IExpbmVCYXNpY01hdGVyaWFsIH0gZnJvbSAnLi4vbWF0ZXJpYWxzL0xpbmVCYXNpY01hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgQnVmZmVyQXR0cmlidXRlLCBGbG9hdDMyQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5pbXBvcnQgeyBCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyR2VvbWV0cnkuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgaGVscGVyIG9iamVjdCB0byB2aXN1YWxpemUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEJveDN9LlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBib3ggPSBuZXcgVEhSRUUuQm94MygpO1xyXG4gKiBib3guc2V0RnJvbUNlbnRlckFuZFNpemUoIG5ldyBUSFJFRS5WZWN0b3IzKCAxLCAxLCAxICksIG5ldyBUSFJFRS5WZWN0b3IzKCAyLCAxLCAzICkgKTtcclxuICpcclxuICogY29uc3QgaGVscGVyID0gbmV3IFRIUkVFLkJveDNIZWxwZXIoIGJveCwgMHhmZmZmMDAgKTtcclxuICogc2NlbmUuYWRkKCBoZWxwZXIgKVxyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIExpbmVTZWdtZW50c1xyXG4gKi9cclxuY2xhc3MgQm94M0hlbHBlciBleHRlbmRzIExpbmVTZWdtZW50cyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYm94MyBoZWxwZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0JveDN9IGJveCAtIFRoZSBib3ggdG8gdmlzdWFsaXplLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfENvbG9yfHN0cmluZ30gW2NvbG9yPTB4ZmZmZjAwXSAtIFRoZSBib3gncyBjb2xvci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggYm94LCBjb2xvciA9IDB4ZmZmZjAwICkge1xyXG5cclxuXHRcdGNvbnN0IGluZGljZXMgPSBuZXcgVWludDE2QXJyYXkoIFsgMCwgMSwgMSwgMiwgMiwgMywgMywgMCwgNCwgNSwgNSwgNiwgNiwgNywgNywgNCwgMCwgNCwgMSwgNSwgMiwgNiwgMywgNyBdICk7XHJcblxyXG5cdFx0Y29uc3QgcG9zaXRpb25zID0gWyAxLCAxLCAxLCAtIDEsIDEsIDEsIC0gMSwgLSAxLCAxLCAxLCAtIDEsIDEsIDEsIDEsIC0gMSwgLSAxLCAxLCAtIDEsIC0gMSwgLSAxLCAtIDEsIDEsIC0gMSwgLSAxIF07XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcclxuXHJcblx0XHRnZW9tZXRyeS5zZXRJbmRleCggbmV3IEJ1ZmZlckF0dHJpYnV0ZSggaW5kaWNlcywgMSApICk7XHJcblxyXG5cdFx0Z2VvbWV0cnkuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25zLCAzICkgKTtcclxuXHJcblx0XHRzdXBlciggZ2VvbWV0cnksIG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IsIHRvbmVNYXBwZWQ6IGZhbHNlIH0gKSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGJveCBiZWluZyB2aXN1YWxpemVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtCb3gzfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJveCA9IGJveDtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnQm94M0hlbHBlcic7XHJcblxyXG5cdFx0dGhpcy5nZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcclxuXHJcblx0fVxyXG5cclxuXHR1cGRhdGVNYXRyaXhXb3JsZCggZm9yY2UgKSB7XHJcblxyXG5cdFx0Y29uc3QgYm94ID0gdGhpcy5ib3g7XHJcblxyXG5cdFx0aWYgKCBib3guaXNFbXB0eSgpICkgcmV0dXJuO1xyXG5cclxuXHRcdGJveC5nZXRDZW50ZXIoIHRoaXMucG9zaXRpb24gKTtcclxuXHJcblx0XHRib3guZ2V0U2l6ZSggdGhpcy5zY2FsZSApO1xyXG5cclxuXHRcdHRoaXMuc2NhbGUubXVsdGlwbHlTY2FsYXIoIDAuNSApO1xyXG5cclxuXHRcdHN1cGVyLnVwZGF0ZU1hdHJpeFdvcmxkKCBmb3JjZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZyZWVzIHRoZSBHUFUtcmVsYXRlZCByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHRoaXMgaW5zdGFuY2UuIENhbGwgdGhpc1xyXG5cdCAqIG1ldGhvZCB3aGVuZXZlciB0aGlzIGluc3RhbmNlIGlzIG5vIGxvbmdlciB1c2VkIGluIHlvdXIgYXBwLlxyXG5cdCAqL1xyXG5cdGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0dGhpcy5nZW9tZXRyeS5kaXNwb3NlKCk7XHJcblx0XHR0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgQm94M0hlbHBlciB9O1xyXG4iLCJpbXBvcnQgeyBMaW5lIH0gZnJvbSAnLi4vb2JqZWN0cy9MaW5lLmpzJztcclxuaW1wb3J0IHsgTWVzaCB9IGZyb20gJy4uL29iamVjdHMvTWVzaC5qcyc7XHJcbmltcG9ydCB7IExpbmVCYXNpY01hdGVyaWFsIH0gZnJvbSAnLi4vbWF0ZXJpYWxzL0xpbmVCYXNpY01hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgTWVzaEJhc2ljTWF0ZXJpYWwgfSBmcm9tICcuLi9tYXRlcmlhbHMvTWVzaEJhc2ljTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5pbXBvcnQgeyBCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyR2VvbWV0cnkuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgaGVscGVyIG9iamVjdCB0byB2aXN1YWxpemUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFBsYW5lfS5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgcGxhbmUgPSBuZXcgVEhSRUUuUGxhbmUoIG5ldyBUSFJFRS5WZWN0b3IzKCAxLCAxLCAwLjIgKSwgMyApO1xyXG4gKiBjb25zdCBoZWxwZXIgPSBuZXcgVEhSRUUuUGxhbmVIZWxwZXIoIHBsYW5lLCAxLCAweGZmZmYwMCApO1xyXG4gKiBzY2VuZS5hZGQoIGhlbHBlciApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIExpbmVcclxuICovXHJcbmNsYXNzIFBsYW5lSGVscGVyIGV4dGVuZHMgTGluZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcGxhbmUgaGVscGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtQbGFuZX0gcGxhbmUgLSBUaGUgcGxhbmUgdG8gYmUgdmlzdWFsaXplZC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3NpemU9MV0gLSBUaGUgc2lkZSBsZW5ndGggb2YgcGxhbmUgaGVscGVyLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfENvbG9yfHN0cmluZ30gW2hleD0weGZmZmYwMF0gLSBUaGUgaGVscGVyJ3MgY29sb3IuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHBsYW5lLCBzaXplID0gMSwgaGV4ID0gMHhmZmZmMDAgKSB7XHJcblxyXG5cdFx0Y29uc3QgY29sb3IgPSBoZXg7XHJcblxyXG5cdFx0Y29uc3QgcG9zaXRpb25zID0gWyAxLCAtIDEsIDAsIC0gMSwgMSwgMCwgLSAxLCAtIDEsIDAsIDEsIDEsIDAsIC0gMSwgMSwgMCwgLSAxLCAtIDEsIDAsIDEsIC0gMSwgMCwgMSwgMSwgMCBdO1xyXG5cclxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XHJcblx0XHRnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbnMsIDMgKSApO1xyXG5cdFx0Z2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XHJcblxyXG5cdFx0c3VwZXIoIGdlb21ldHJ5LCBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGNvbG9yLCB0b25lTWFwcGVkOiBmYWxzZSB9ICkgKTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnUGxhbmVIZWxwZXInO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHBsYW5lIGJlaW5nIHZpc3VhbGl6ZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1BsYW5lfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBsYW5lID0gcGxhbmU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc2lkZSBsZW5ndGggb2YgcGxhbmUgaGVscGVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2l6ZSA9IHNpemU7XHJcblxyXG5cdFx0Y29uc3QgcG9zaXRpb25zMiA9IFsgMSwgMSwgMCwgLSAxLCAxLCAwLCAtIDEsIC0gMSwgMCwgMSwgMSwgMCwgLSAxLCAtIDEsIDAsIDEsIC0gMSwgMCBdO1xyXG5cclxuXHRcdGNvbnN0IGdlb21ldHJ5MiA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xyXG5cdFx0Z2VvbWV0cnkyLnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uczIsIDMgKSApO1xyXG5cdFx0Z2VvbWV0cnkyLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xyXG5cclxuXHRcdHRoaXMuYWRkKCBuZXcgTWVzaCggZ2VvbWV0cnkyLCBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGNvbG9yLCBvcGFjaXR5OiAwLjIsIHRyYW5zcGFyZW50OiB0cnVlLCBkZXB0aFdyaXRlOiBmYWxzZSwgdG9uZU1hcHBlZDogZmFsc2UgfSApICkgKTtcclxuXHJcblx0fVxyXG5cclxuXHR1cGRhdGVNYXRyaXhXb3JsZCggZm9yY2UgKSB7XHJcblxyXG5cdFx0dGhpcy5wb3NpdGlvbi5zZXQoIDAsIDAsIDAgKTtcclxuXHJcblx0XHR0aGlzLnNjYWxlLnNldCggMC41ICogdGhpcy5zaXplLCAwLjUgKiB0aGlzLnNpemUsIDEgKTtcclxuXHJcblx0XHR0aGlzLmxvb2tBdCggdGhpcy5wbGFuZS5ub3JtYWwgKTtcclxuXHJcblx0XHR0aGlzLnRyYW5zbGF0ZVooIC0gdGhpcy5wbGFuZS5jb25zdGFudCApO1xyXG5cclxuXHRcdHN1cGVyLnVwZGF0ZU1hdHJpeFdvcmxkKCBmb3JjZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIGhlbHBlciB0byBtYXRjaCB0aGUgcG9zaXRpb24gYW5kIGRpcmVjdGlvbiBvZiB0aGVcclxuXHQgKiBsaWdodCBiZWluZyB2aXN1YWxpemVkLlxyXG5cdCAqL1xyXG5cdGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0dGhpcy5nZW9tZXRyeS5kaXNwb3NlKCk7XHJcblx0XHR0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKTtcclxuXHRcdHRoaXMuY2hpbGRyZW5bIDAgXS5nZW9tZXRyeS5kaXNwb3NlKCk7XHJcblx0XHR0aGlzLmNoaWxkcmVuWyAwIF0ubWF0ZXJpYWwuZGlzcG9zZSgpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBQbGFuZUhlbHBlciB9O1xyXG4iLCJpbXBvcnQgeyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5pbXBvcnQgeyBCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyR2VvbWV0cnkuanMnO1xyXG5pbXBvcnQgeyBPYmplY3QzRCB9IGZyb20gJy4uL2NvcmUvT2JqZWN0M0QuanMnO1xyXG5pbXBvcnQgeyBDeWxpbmRlckdlb21ldHJ5IH0gZnJvbSAnLi4vZ2VvbWV0cmllcy9DeWxpbmRlckdlb21ldHJ5LmpzJztcclxuaW1wb3J0IHsgTWVzaEJhc2ljTWF0ZXJpYWwgfSBmcm9tICcuLi9tYXRlcmlhbHMvTWVzaEJhc2ljTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyBMaW5lQmFzaWNNYXRlcmlhbCB9IGZyb20gJy4uL21hdGVyaWFscy9MaW5lQmFzaWNNYXRlcmlhbC5qcyc7XHJcbmltcG9ydCB7IE1lc2ggfSBmcm9tICcuLi9vYmplY3RzL01lc2guanMnO1xyXG5pbXBvcnQgeyBMaW5lIH0gZnJvbSAnLi4vb2JqZWN0cy9MaW5lLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcblxyXG5jb25zdCBfYXhpcyA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxubGV0IF9saW5lR2VvbWV0cnksIF9jb25lR2VvbWV0cnk7XHJcblxyXG4vKipcclxuICogQW4gM0QgYXJyb3cgb2JqZWN0IGZvciB2aXN1YWxpemluZyBkaXJlY3Rpb25zLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBkaXIgPSBuZXcgVEhSRUUuVmVjdG9yMyggMSwgMiwgMCApO1xyXG4gKlxyXG4gKiAvL25vcm1hbGl6ZSB0aGUgZGlyZWN0aW9uIHZlY3RvciAoY29udmVydCB0byB2ZWN0b3Igb2YgbGVuZ3RoIDEpXHJcbiAqIGRpci5ub3JtYWxpemUoKTtcclxuICpcclxuICogY29uc3Qgb3JpZ2luID0gbmV3IFRIUkVFLlZlY3RvcjMoIDAsIDAsIDAgKTtcclxuICogY29uc3QgbGVuZ3RoID0gMTtcclxuICogY29uc3QgaGV4ID0gMHhmZmZmMDA7XHJcbiAqXHJcbiAqIGNvbnN0IGFycm93SGVscGVyID0gbmV3IFRIUkVFLkFycm93SGVscGVyKCBkaXIsIG9yaWdpbiwgbGVuZ3RoLCBoZXggKTtcclxuICogc2NlbmUuYWRkKCBhcnJvd0hlbHBlciApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIE9iamVjdDNEXHJcbiAqL1xyXG5jbGFzcyBBcnJvd0hlbHBlciBleHRlbmRzIE9iamVjdDNEIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBhcnJvdyBoZWxwZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IFtkaXI9KDAsIDAsIDEpXSAtIFRoZSAobm9ybWFsaXplZCkgZGlyZWN0aW9uIHZlY3Rvci5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IFtvcmlnaW49KDAsIDAsIDApXSAtIFBvaW50IGF0IHdoaWNoIHRoZSBhcnJvdyBzdGFydHMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9MV0gLSBMZW5ndGggb2YgdGhlIGFycm93IGluIHdvcmxkIHVuaXRzLlxyXG5cdCAqIEBwYXJhbSB7KG51bWJlcnxDb2xvcnxzdHJpbmcpfSBbY29sb3I9MHhmZmZmMDBdIC0gQ29sb3Igb2YgdGhlIGFycm93LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbaGVhZExlbmd0aD1sZW5ndGgqMC4yXSAtIFRoZSBsZW5ndGggb2YgdGhlIGhlYWQgb2YgdGhlIGFycm93LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbaGVhZFdpZHRoPWhlYWRMZW5ndGgqMC4yXSAtIFRoZSB3aWR0aCBvZiB0aGUgaGVhZCBvZiB0aGUgYXJyb3cuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGRpciA9IG5ldyBWZWN0b3IzKCAwLCAwLCAxICksIG9yaWdpbiA9IG5ldyBWZWN0b3IzKCAwLCAwLCAwICksIGxlbmd0aCA9IDEsIGNvbG9yID0gMHhmZmZmMDAsIGhlYWRMZW5ndGggPSBsZW5ndGggKiAwLjIsIGhlYWRXaWR0aCA9IGhlYWRMZW5ndGggKiAwLjIgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHR0aGlzLnR5cGUgPSAnQXJyb3dIZWxwZXInO1xyXG5cclxuXHRcdGlmICggX2xpbmVHZW9tZXRyeSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0X2xpbmVHZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xyXG5cdFx0XHRfbGluZUdlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIFsgMCwgMCwgMCwgMCwgMSwgMCBdLCAzICkgKTtcclxuXHJcblx0XHRcdF9jb25lR2VvbWV0cnkgPSBuZXcgQ3lsaW5kZXJHZW9tZXRyeSggMCwgMC41LCAxLCA1LCAxICk7XHJcblx0XHRcdF9jb25lR2VvbWV0cnkudHJhbnNsYXRlKCAwLCAtIDAuNSwgMCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnBvc2l0aW9uLmNvcHkoIG9yaWdpbiApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGxpbmUgcGFydCBvZiB0aGUgYXJyb3cgaGVscGVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtMaW5lfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxpbmUgPSBuZXcgTGluZSggX2xpbmVHZW9tZXRyeSwgbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciwgdG9uZU1hcHBlZDogZmFsc2UgfSApICk7XHJcblx0XHR0aGlzLmxpbmUubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xyXG5cdFx0dGhpcy5hZGQoIHRoaXMubGluZSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNvbmUgcGFydCBvZiB0aGUgYXJyb3cgaGVscGVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtNZXNofVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvbmUgPSBuZXcgTWVzaCggX2NvbmVHZW9tZXRyeSwgbmV3IE1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciwgdG9uZU1hcHBlZDogZmFsc2UgfSApICk7XHJcblx0XHR0aGlzLmNvbmUubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xyXG5cdFx0dGhpcy5hZGQoIHRoaXMuY29uZSApO1xyXG5cclxuXHRcdHRoaXMuc2V0RGlyZWN0aW9uKCBkaXIgKTtcclxuXHRcdHRoaXMuc2V0TGVuZ3RoKCBsZW5ndGgsIGhlYWRMZW5ndGgsIGhlYWRXaWR0aCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGRpcmVjdGlvbiBvZiB0aGUgaGVscGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IzfSBkaXIgLSBUaGUgbm9ybWFsaXplZCBkaXJlY3Rpb24gdmVjdG9yLlxyXG5cdCAqL1xyXG5cdHNldERpcmVjdGlvbiggZGlyICkge1xyXG5cclxuXHRcdC8vIGRpciBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWRcclxuXHJcblx0XHRpZiAoIGRpci55ID4gMC45OTk5OSApIHtcclxuXHJcblx0XHRcdHRoaXMucXVhdGVybmlvbi5zZXQoIDAsIDAsIDAsIDEgKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBkaXIueSA8IC0gMC45OTk5OSApIHtcclxuXHJcblx0XHRcdHRoaXMucXVhdGVybmlvbi5zZXQoIDEsIDAsIDAsIDAgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0X2F4aXMuc2V0KCBkaXIueiwgMCwgLSBkaXIueCApLm5vcm1hbGl6ZSgpO1xyXG5cclxuXHRcdFx0Y29uc3QgcmFkaWFucyA9IE1hdGguYWNvcyggZGlyLnkgKTtcclxuXHJcblx0XHRcdHRoaXMucXVhdGVybmlvbi5zZXRGcm9tQXhpc0FuZ2xlKCBfYXhpcywgcmFkaWFucyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBsZW5ndGggb2YgdGhlIGhlbHBlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGggLSBMZW5ndGggb2YgdGhlIGFycm93IGluIHdvcmxkIHVuaXRzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbaGVhZExlbmd0aD1sZW5ndGgqMC4yXSAtIFRoZSBsZW5ndGggb2YgdGhlIGhlYWQgb2YgdGhlIGFycm93LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbaGVhZFdpZHRoPWhlYWRMZW5ndGgqMC4yXSAtIFRoZSB3aWR0aCBvZiB0aGUgaGVhZCBvZiB0aGUgYXJyb3cuXHJcblx0ICovXHJcblx0c2V0TGVuZ3RoKCBsZW5ndGgsIGhlYWRMZW5ndGggPSBsZW5ndGggKiAwLjIsIGhlYWRXaWR0aCA9IGhlYWRMZW5ndGggKiAwLjIgKSB7XHJcblxyXG5cdFx0dGhpcy5saW5lLnNjYWxlLnNldCggMSwgTWF0aC5tYXgoIDAuMDAwMSwgbGVuZ3RoIC0gaGVhZExlbmd0aCApLCAxICk7IC8vIHNlZSAjMTc0NThcclxuXHRcdHRoaXMubGluZS51cGRhdGVNYXRyaXgoKTtcclxuXHJcblx0XHR0aGlzLmNvbmUuc2NhbGUuc2V0KCBoZWFkV2lkdGgsIGhlYWRMZW5ndGgsIGhlYWRXaWR0aCApO1xyXG5cdFx0dGhpcy5jb25lLnBvc2l0aW9uLnkgPSBsZW5ndGg7XHJcblx0XHR0aGlzLmNvbmUudXBkYXRlTWF0cml4KCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgY29sb3Igb2YgdGhlIGhlbHBlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfENvbG9yfHN0cmluZ30gY29sb3IgLSBUaGUgY29sb3IgdG8gc2V0LlxyXG5cdCAqL1xyXG5cdHNldENvbG9yKCBjb2xvciApIHtcclxuXHJcblx0XHR0aGlzLmxpbmUubWF0ZXJpYWwuY29sb3Iuc2V0KCBjb2xvciApO1xyXG5cdFx0dGhpcy5jb25lLm1hdGVyaWFsLmNvbG9yLnNldCggY29sb3IgKTtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlLCBmYWxzZSApO1xyXG5cclxuXHRcdHRoaXMubGluZS5jb3B5KCBzb3VyY2UubGluZSApO1xyXG5cdFx0dGhpcy5jb25lLmNvcHkoIHNvdXJjZS5jb25lICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRnJlZXMgdGhlIEdQVS1yZWxhdGVkIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhpcyBpbnN0YW5jZS4gQ2FsbCB0aGlzXHJcblx0ICogbWV0aG9kIHdoZW5ldmVyIHRoaXMgaW5zdGFuY2UgaXMgbm8gbG9uZ2VyIHVzZWQgaW4geW91ciBhcHAuXHJcblx0ICovXHJcblx0ZGlzcG9zZSgpIHtcclxuXHJcblx0XHR0aGlzLmxpbmUuZ2VvbWV0cnkuZGlzcG9zZSgpO1xyXG5cdFx0dGhpcy5saW5lLm1hdGVyaWFsLmRpc3Bvc2UoKTtcclxuXHRcdHRoaXMuY29uZS5nZW9tZXRyeS5kaXNwb3NlKCk7XHJcblx0XHR0aGlzLmNvbmUubWF0ZXJpYWwuZGlzcG9zZSgpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBBcnJvd0hlbHBlciB9O1xyXG4iLCJpbXBvcnQgeyBMaW5lU2VnbWVudHMgfSBmcm9tICcuLi9vYmplY3RzL0xpbmVTZWdtZW50cy5qcyc7XHJcbmltcG9ydCB7IExpbmVCYXNpY01hdGVyaWFsIH0gZnJvbSAnLi4vbWF0ZXJpYWxzL0xpbmVCYXNpY01hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyQXR0cmlidXRlLmpzJztcclxuaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcclxuaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi9tYXRoL0NvbG9yLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBbiBheGlzIG9iamVjdCB0byB2aXN1YWxpemUgdGhlIDMgYXhlcyBpbiBhIHNpbXBsZSB3YXkuXHJcbiAqIFRoZSBYIGF4aXMgaXMgcmVkLiBUaGUgWSBheGlzIGlzIGdyZWVuLiBUaGUgWiBheGlzIGlzIGJsdWUuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGF4ZXNIZWxwZXIgPSBuZXcgVEhSRUUuQXhlc0hlbHBlciggNSApO1xyXG4gKiBzY2VuZS5hZGQoIGF4ZXNIZWxwZXIgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBMaW5lU2VnbWVudHNcclxuICovXHJcbmNsYXNzIEF4ZXNIZWxwZXIgZXh0ZW5kcyBMaW5lU2VnbWVudHMge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGF4ZXMgaGVscGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtzaXplPTFdIC0gU2l6ZSBvZiB0aGUgbGluZXMgcmVwcmVzZW50aW5nIHRoZSBheGVzLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBzaXplID0gMSApIHtcclxuXHJcblx0XHRjb25zdCB2ZXJ0aWNlcyA9IFtcclxuXHRcdFx0MCwgMCwgMCxcdHNpemUsIDAsIDAsXHJcblx0XHRcdDAsIDAsIDAsXHQwLCBzaXplLCAwLFxyXG5cdFx0XHQwLCAwLCAwLFx0MCwgMCwgc2l6ZVxyXG5cdFx0XTtcclxuXHJcblx0XHRjb25zdCBjb2xvcnMgPSBbXHJcblx0XHRcdDEsIDAsIDAsXHQxLCAwLjYsIDAsXHJcblx0XHRcdDAsIDEsIDAsXHQwLjYsIDEsIDAsXHJcblx0XHRcdDAsIDAsIDEsXHQwLCAwLjYsIDFcclxuXHRcdF07XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcclxuXHRcdGdlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcclxuXHRcdGdlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGNvbG9ycywgMyApICk7XHJcblxyXG5cdFx0Y29uc3QgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgdmVydGV4Q29sb3JzOiB0cnVlLCB0b25lTWFwcGVkOiBmYWxzZSB9ICk7XHJcblxyXG5cdFx0c3VwZXIoIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG5cclxuXHRcdHRoaXMudHlwZSA9ICdBeGVzSGVscGVyJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWZpbmVzIHRoZSBjb2xvcnMgb2YgdGhlIGF4ZXMgaGVscGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ8Q29sb3J8c3RyaW5nfSB4QXhpc0NvbG9yIC0gVGhlIGNvbG9yIGZvciB0aGUgeCBheGlzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfENvbG9yfHN0cmluZ30geUF4aXNDb2xvciAtIFRoZSBjb2xvciBmb3IgdGhlIHkgYXhpcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcnxDb2xvcnxzdHJpbmd9IHpBeGlzQ29sb3IgLSBUaGUgY29sb3IgZm9yIHRoZSB6IGF4aXMuXHJcblx0ICogQHJldHVybiB7QXhlc0hlbHBlcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBheGVzIGhlbHBlci5cclxuXHQgKi9cclxuXHRzZXRDb2xvcnMoIHhBeGlzQ29sb3IsIHlBeGlzQ29sb3IsIHpBeGlzQ29sb3IgKSB7XHJcblxyXG5cdFx0Y29uc3QgY29sb3IgPSBuZXcgQ29sb3IoKTtcclxuXHRcdGNvbnN0IGFycmF5ID0gdGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLmNvbG9yLmFycmF5O1xyXG5cclxuXHRcdGNvbG9yLnNldCggeEF4aXNDb2xvciApO1xyXG5cdFx0Y29sb3IudG9BcnJheSggYXJyYXksIDAgKTtcclxuXHRcdGNvbG9yLnRvQXJyYXkoIGFycmF5LCAzICk7XHJcblxyXG5cdFx0Y29sb3Iuc2V0KCB5QXhpc0NvbG9yICk7XHJcblx0XHRjb2xvci50b0FycmF5KCBhcnJheSwgNiApO1xyXG5cdFx0Y29sb3IudG9BcnJheSggYXJyYXksIDkgKTtcclxuXHJcblx0XHRjb2xvci5zZXQoIHpBeGlzQ29sb3IgKTtcclxuXHRcdGNvbG9yLnRvQXJyYXkoIGFycmF5LCAxMiApO1xyXG5cdFx0Y29sb3IudG9BcnJheSggYXJyYXksIDE1ICk7XHJcblxyXG5cdFx0dGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLmNvbG9yLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGcmVlcyB0aGUgR1BVLXJlbGF0ZWQgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGlzIGluc3RhbmNlLiBDYWxsIHRoaXNcclxuXHQgKiBtZXRob2Qgd2hlbmV2ZXIgdGhpcyBpbnN0YW5jZSBpcyBubyBsb25nZXIgdXNlZCBpbiB5b3VyIGFwcC5cclxuXHQgKi9cclxuXHRkaXNwb3NlKCkge1xyXG5cclxuXHRcdHRoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpO1xyXG5cdFx0dGhpcy5tYXRlcmlhbC5kaXNwb3NlKCk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBBeGVzSGVscGVyIH07XHJcbiIsImltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vLi4vbWF0aC9Db2xvci5qcyc7XHJcbmltcG9ydCB7IFBhdGggfSBmcm9tICcuL1BhdGguanMnO1xyXG5pbXBvcnQgeyBTaGFwZSB9IGZyb20gJy4vU2hhcGUuanMnO1xyXG5pbXBvcnQgeyBTaGFwZVV0aWxzIH0gZnJvbSAnLi4vU2hhcGVVdGlscy5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGNvbnZlcnQgYSBzZXJpZXMgb2YgcGF0aHMgdG8gYW4gYXJyYXkgb2ZcclxuICogc2hhcGVzLiBJdCBpcyBzcGVjaWZpY2FsbHkgdXNlZCBpbiBjb250ZXh0IG9mIGZvbnRzIGFuZCBTVkcuXHJcbiAqL1xyXG5jbGFzcyBTaGFwZVBhdGgge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHNoYXBlIHBhdGguXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblxyXG5cdFx0dGhpcy50eXBlID0gJ1NoYXBlUGF0aCc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY29sb3Igb2YgdGhlIHNoYXBlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtDb2xvcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb2xvciA9IG5ldyBDb2xvcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHBhdGhzIHRoYXQgaGF2ZSBiZWVuIGdlbmVyYXRlZCBmb3IgdGhpcyBzaGFwZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8UGF0aD59XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc3ViUGF0aHMgPSBbXTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjdXJyZW50IHBhdGggdGhhdCBpcyBiZWluZyBnZW5lcmF0ZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9QYXRofVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmN1cnJlbnRQYXRoID0gbnVsbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGEgbmV3IHBhdGggYW5kIG1vdmVzIGl0IGN1cnJlbnQgcG9pbnQgdG8gdGhlIGdpdmVuIG9uZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHggY29vcmRpbmF0ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB5IGNvb3JkaW5hdGUuXHJcblx0ICogQHJldHVybiB7U2hhcGVQYXRofSBBIHJlZmVyZW5jZSB0byB0aGlzIHNoYXBlIHBhdGguXHJcblx0ICovXHJcblx0bW92ZVRvKCB4LCB5ICkge1xyXG5cclxuXHRcdHRoaXMuY3VycmVudFBhdGggPSBuZXcgUGF0aCgpO1xyXG5cdFx0dGhpcy5zdWJQYXRocy5wdXNoKCB0aGlzLmN1cnJlbnRQYXRoICk7XHJcblx0XHR0aGlzLmN1cnJlbnRQYXRoLm1vdmVUbyggeCwgeSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIExpbmVDdXJ2ZX0gdG8gdGhlIHBhdGggYnkgY29ubmVjdGluZ1xyXG5cdCAqIHRoZSBjdXJyZW50IHBvaW50IHdpdGggdGhlIGdpdmVuIG9uZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50LlxyXG5cdCAqIEByZXR1cm4ge1NoYXBlUGF0aH0gQSByZWZlcmVuY2UgdG8gdGhpcyBzaGFwZSBwYXRoLlxyXG5cdCAqL1xyXG5cdGxpbmVUbyggeCwgeSApIHtcclxuXHJcblx0XHR0aGlzLmN1cnJlbnRQYXRoLmxpbmVUbyggeCwgeSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFF1YWRyYXRpY0JlemllckN1cnZlfSB0byB0aGUgcGF0aCBieSBjb25uZWN0aW5nXHJcblx0ICogdGhlIGN1cnJlbnQgcG9pbnQgd2l0aCB0aGUgZ2l2ZW4gb25lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFDUHggLSBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBjb250cm9sIHBvaW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhQ1B5IC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgY29udHJvbCBwb2ludC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYVggLSBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBlbmQgcG9pbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFZIC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50LlxyXG5cdCAqIEByZXR1cm4ge1NoYXBlUGF0aH0gQSByZWZlcmVuY2UgdG8gdGhpcyBzaGFwZSBwYXRoLlxyXG5cdCAqL1xyXG5cdHF1YWRyYXRpY0N1cnZlVG8oIGFDUHgsIGFDUHksIGFYLCBhWSApIHtcclxuXHJcblx0XHR0aGlzLmN1cnJlbnRQYXRoLnF1YWRyYXRpY0N1cnZlVG8oIGFDUHgsIGFDUHksIGFYLCBhWSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEN1YmljQmV6aWVyQ3VydmV9IHRvIHRoZSBwYXRoIGJ5IGNvbm5lY3RpbmdcclxuXHQgKiB0aGUgY3VycmVudCBwb2ludCB3aXRoIHRoZSBnaXZlbiBvbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYUNQMXggLSBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhQ1AxeSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFDUDJ4IC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFDUDJ5IC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFYIC0gVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgZW5kIHBvaW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhWSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludC5cclxuXHQgKiBAcmV0dXJuIHtTaGFwZVBhdGh9IEEgcmVmZXJlbmNlIHRvIHRoaXMgc2hhcGUgcGF0aC5cclxuXHQgKi9cclxuXHRiZXppZXJDdXJ2ZVRvKCBhQ1AxeCwgYUNQMXksIGFDUDJ4LCBhQ1AyeSwgYVgsIGFZICkge1xyXG5cclxuXHRcdHRoaXMuY3VycmVudFBhdGguYmV6aWVyQ3VydmVUbyggYUNQMXgsIGFDUDF5LCBhQ1AyeCwgYUNQMnksIGFYLCBhWSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFNwbGluZUN1cnZlfSB0byB0aGUgcGF0aCBieSBjb25uZWN0aW5nXHJcblx0ICogdGhlIGN1cnJlbnQgcG9pbnQgd2l0aCB0aGUgZ2l2ZW4gbGlzdCBvZiBwb2ludHMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PFZlY3RvcjI+fSBwdHMgLSBBbiBhcnJheSBvZiBwb2ludHMgaW4gMkQgc3BhY2UuXHJcblx0ICogQHJldHVybiB7U2hhcGVQYXRofSBBIHJlZmVyZW5jZSB0byB0aGlzIHNoYXBlIHBhdGguXHJcblx0ICovXHJcblx0c3BsaW5lVGhydSggcHRzICkge1xyXG5cclxuXHRcdHRoaXMuY3VycmVudFBhdGguc3BsaW5lVGhydSggcHRzICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29udmVydHMgdGhlIHBhdGhzIGludG8gYW4gYXJyYXkgb2Ygc2hhcGVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBpc0NDVyAtIEJ5IGRlZmF1bHQgc29saWQgc2hhcGVzIGFyZSAgZGVmaW5lZCBjbG9ja3dpc2UgKENXKSBhbmQgaG9sZXMgYXJlIGRlZmluZWQgY291bnRlcmNsb2Nrd2lzZSAoQ0NXKS5cclxuXHQgKiBJZiB0aGlzIGZsYWcgaXMgc2V0IHRvIGB0cnVlYCwgdGhlbiB0aG9zZSBhcmUgZmxpcHBlZC5cclxuXHQgKiBAcmV0dXJuIHtBcnJheTxTaGFwZT59IEFuIGFycmF5IG9mIHNoYXBlcy5cclxuXHQgKi9cclxuXHR0b1NoYXBlcyggaXNDQ1cgKSB7XHJcblxyXG5cdFx0ZnVuY3Rpb24gdG9TaGFwZXNOb0hvbGVzKCBpblN1YnBhdGhzICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgc2hhcGVzID0gW107XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBpblN1YnBhdGhzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHRtcFBhdGggPSBpblN1YnBhdGhzWyBpIF07XHJcblxyXG5cdFx0XHRcdGNvbnN0IHRtcFNoYXBlID0gbmV3IFNoYXBlKCk7XHJcblx0XHRcdFx0dG1wU2hhcGUuY3VydmVzID0gdG1wUGF0aC5jdXJ2ZXM7XHJcblxyXG5cdFx0XHRcdHNoYXBlcy5wdXNoKCB0bXBTaGFwZSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIHNoYXBlcztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0ZnVuY3Rpb24gaXNQb2ludEluc2lkZVBvbHlnb24oIGluUHQsIGluUG9seWdvbiApIHtcclxuXHJcblx0XHRcdGNvbnN0IHBvbHlMZW4gPSBpblBvbHlnb24ubGVuZ3RoO1xyXG5cclxuXHRcdFx0Ly8gaW5QdCBvbiBwb2x5Z29uIGNvbnRvdXIgPT4gaW1tZWRpYXRlIHN1Y2Nlc3MgICAgb3JcclxuXHRcdFx0Ly8gdG9nZ2xpbmcgb2YgaW5zaWRlL291dHNpZGUgYXQgZXZlcnkgc2luZ2xlISBpbnRlcnNlY3Rpb24gcG9pbnQgb2YgYW4gZWRnZVxyXG5cdFx0XHQvLyAgd2l0aCB0aGUgaG9yaXpvbnRhbCBsaW5lIHRocm91Z2ggaW5QdCwgbGVmdCBvZiBpblB0XHJcblx0XHRcdC8vICBub3QgY291bnRpbmcgbG93ZXJZIGVuZHBvaW50cyBvZiBlZGdlcyBhbmQgd2hvbGUgZWRnZXMgb24gdGhhdCBsaW5lXHJcblx0XHRcdGxldCBpbnNpZGUgPSBmYWxzZTtcclxuXHRcdFx0Zm9yICggbGV0IHAgPSBwb2x5TGVuIC0gMSwgcSA9IDA7IHEgPCBwb2x5TGVuOyBwID0gcSArKyApIHtcclxuXHJcblx0XHRcdFx0bGV0IGVkZ2VMb3dQdCA9IGluUG9seWdvblsgcCBdO1xyXG5cdFx0XHRcdGxldCBlZGdlSGlnaFB0ID0gaW5Qb2x5Z29uWyBxIF07XHJcblxyXG5cdFx0XHRcdGxldCBlZGdlRHggPSBlZGdlSGlnaFB0LnggLSBlZGdlTG93UHQueDtcclxuXHRcdFx0XHRsZXQgZWRnZUR5ID0gZWRnZUhpZ2hQdC55IC0gZWRnZUxvd1B0Lnk7XHJcblxyXG5cdFx0XHRcdGlmICggTWF0aC5hYnMoIGVkZ2VEeSApID4gTnVtYmVyLkVQU0lMT04gKSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gbm90IHBhcmFsbGVsXHJcblx0XHRcdFx0XHRpZiAoIGVkZ2VEeSA8IDAgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRlZGdlTG93UHQgPSBpblBvbHlnb25bIHEgXTsgZWRnZUR4ID0gLSBlZGdlRHg7XHJcblx0XHRcdFx0XHRcdGVkZ2VIaWdoUHQgPSBpblBvbHlnb25bIHAgXTsgZWRnZUR5ID0gLSBlZGdlRHk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGlmICggKCBpblB0LnkgPCBlZGdlTG93UHQueSApIHx8ICggaW5QdC55ID4gZWRnZUhpZ2hQdC55ICkgKSBcdFx0Y29udGludWU7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBpblB0LnkgPT09IGVkZ2VMb3dQdC55ICkge1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCBpblB0LnggPT09IGVkZ2VMb3dQdC54IClcdFx0cmV0dXJuXHR0cnVlO1x0XHQvLyBpblB0IGlzIG9uIGNvbnRvdXIgP1xyXG5cdFx0XHRcdFx0XHQvLyBjb250aW51ZTtcdFx0XHRcdC8vIG5vIGludGVyc2VjdGlvbiBvciBlZGdlTG93UHQgPT4gZG9lc24ndCBjb3VudCAhISFcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgcGVycEVkZ2UgPSBlZGdlRHkgKiAoIGluUHQueCAtIGVkZ2VMb3dQdC54ICkgLSBlZGdlRHggKiAoIGluUHQueSAtIGVkZ2VMb3dQdC55ICk7XHJcblx0XHRcdFx0XHRcdGlmICggcGVycEVkZ2UgPT09IDAgKVx0XHRcdFx0cmV0dXJuXHR0cnVlO1x0XHQvLyBpblB0IGlzIG9uIGNvbnRvdXIgP1xyXG5cdFx0XHRcdFx0XHRpZiAoIHBlcnBFZGdlIDwgMCApIFx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdFx0XHRcdGluc2lkZSA9ICEgaW5zaWRlO1x0XHQvLyB0cnVlIGludGVyc2VjdGlvbiBsZWZ0IG9mIGluUHRcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gcGFyYWxsZWwgb3IgY29sbGluZWFyXHJcblx0XHRcdFx0XHRpZiAoIGluUHQueSAhPT0gZWRnZUxvd1B0LnkgKSBcdFx0Y29udGludWU7XHRcdFx0Ly8gcGFyYWxsZWxcclxuXHRcdFx0XHRcdC8vIGVkZ2UgbGllcyBvbiB0aGUgc2FtZSBob3Jpem9udGFsIGxpbmUgYXMgaW5QdFxyXG5cdFx0XHRcdFx0aWYgKCAoICggZWRnZUhpZ2hQdC54IDw9IGluUHQueCApICYmICggaW5QdC54IDw9IGVkZ2VMb3dQdC54ICkgKSB8fFxyXG5cdFx0XHRcdFx0XHQgKCAoIGVkZ2VMb3dQdC54IDw9IGluUHQueCApICYmICggaW5QdC54IDw9IGVkZ2VIaWdoUHQueCApICkgKVx0XHRyZXR1cm5cdHRydWU7XHQvLyBpblB0OiBQb2ludCBvbiBjb250b3VyICFcclxuXHRcdFx0XHRcdC8vIGNvbnRpbnVlO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm5cdGluc2lkZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgaXNDbG9ja1dpc2UgPSBTaGFwZVV0aWxzLmlzQ2xvY2tXaXNlO1xyXG5cclxuXHRcdGNvbnN0IHN1YlBhdGhzID0gdGhpcy5zdWJQYXRocztcclxuXHRcdGlmICggc3ViUGF0aHMubGVuZ3RoID09PSAwICkgcmV0dXJuIFtdO1xyXG5cclxuXHRcdGxldCBzb2xpZCwgdG1wUGF0aCwgdG1wU2hhcGU7XHJcblx0XHRjb25zdCBzaGFwZXMgPSBbXTtcclxuXHJcblx0XHRpZiAoIHN1YlBhdGhzLmxlbmd0aCA9PT0gMSApIHtcclxuXHJcblx0XHRcdHRtcFBhdGggPSBzdWJQYXRoc1sgMCBdO1xyXG5cdFx0XHR0bXBTaGFwZSA9IG5ldyBTaGFwZSgpO1xyXG5cdFx0XHR0bXBTaGFwZS5jdXJ2ZXMgPSB0bXBQYXRoLmN1cnZlcztcclxuXHRcdFx0c2hhcGVzLnB1c2goIHRtcFNoYXBlICk7XHJcblx0XHRcdHJldHVybiBzaGFwZXM7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGxldCBob2xlc0ZpcnN0ID0gISBpc0Nsb2NrV2lzZSggc3ViUGF0aHNbIDAgXS5nZXRQb2ludHMoKSApO1xyXG5cdFx0aG9sZXNGaXJzdCA9IGlzQ0NXID8gISBob2xlc0ZpcnN0IDogaG9sZXNGaXJzdDtcclxuXHJcblx0XHQvLyBjb25zb2xlLmxvZyhcIkhvbGVzIGZpcnN0XCIsIGhvbGVzRmlyc3QpO1xyXG5cclxuXHRcdGNvbnN0IGJldHRlclNoYXBlSG9sZXMgPSBbXTtcclxuXHRcdGNvbnN0IG5ld1NoYXBlcyA9IFtdO1xyXG5cdFx0bGV0IG5ld1NoYXBlSG9sZXMgPSBbXTtcclxuXHRcdGxldCBtYWluSWR4ID0gMDtcclxuXHRcdGxldCB0bXBQb2ludHM7XHJcblxyXG5cdFx0bmV3U2hhcGVzWyBtYWluSWR4IF0gPSB1bmRlZmluZWQ7XHJcblx0XHRuZXdTaGFwZUhvbGVzWyBtYWluSWR4IF0gPSBbXTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBzdWJQYXRocy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0dG1wUGF0aCA9IHN1YlBhdGhzWyBpIF07XHJcblx0XHRcdHRtcFBvaW50cyA9IHRtcFBhdGguZ2V0UG9pbnRzKCk7XHJcblx0XHRcdHNvbGlkID0gaXNDbG9ja1dpc2UoIHRtcFBvaW50cyApO1xyXG5cdFx0XHRzb2xpZCA9IGlzQ0NXID8gISBzb2xpZCA6IHNvbGlkO1xyXG5cclxuXHRcdFx0aWYgKCBzb2xpZCApIHtcclxuXHJcblx0XHRcdFx0aWYgKCAoICEgaG9sZXNGaXJzdCApICYmICggbmV3U2hhcGVzWyBtYWluSWR4IF0gKSApXHRtYWluSWR4ICsrO1xyXG5cclxuXHRcdFx0XHRuZXdTaGFwZXNbIG1haW5JZHggXSA9IHsgczogbmV3IFNoYXBlKCksIHA6IHRtcFBvaW50cyB9O1xyXG5cdFx0XHRcdG5ld1NoYXBlc1sgbWFpbklkeCBdLnMuY3VydmVzID0gdG1wUGF0aC5jdXJ2ZXM7XHJcblxyXG5cdFx0XHRcdGlmICggaG9sZXNGaXJzdCApXHRtYWluSWR4ICsrO1xyXG5cdFx0XHRcdG5ld1NoYXBlSG9sZXNbIG1haW5JZHggXSA9IFtdO1xyXG5cclxuXHRcdFx0XHQvL2NvbnNvbGUubG9nKCdjdycsIGkpO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0bmV3U2hhcGVIb2xlc1sgbWFpbklkeCBdLnB1c2goIHsgaDogdG1wUGF0aCwgcDogdG1wUG9pbnRzWyAwIF0gfSApO1xyXG5cclxuXHRcdFx0XHQvL2NvbnNvbGUubG9nKCdjY3cnLCBpKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gb25seSBIb2xlcz8gLT4gcHJvYmFibHkgYWxsIFNoYXBlcyB3aXRoIHdyb25nIG9yaWVudGF0aW9uXHJcblx0XHRpZiAoICEgbmV3U2hhcGVzWyAwIF0gKVx0cmV0dXJuXHR0b1NoYXBlc05vSG9sZXMoIHN1YlBhdGhzICk7XHJcblxyXG5cclxuXHRcdGlmICggbmV3U2hhcGVzLmxlbmd0aCA+IDEgKSB7XHJcblxyXG5cdFx0XHRsZXQgYW1iaWd1b3VzID0gZmFsc2U7XHJcblx0XHRcdGxldCB0b0NoYW5nZSA9IDA7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgc0lkeCA9IDAsIHNMZW4gPSBuZXdTaGFwZXMubGVuZ3RoOyBzSWR4IDwgc0xlbjsgc0lkeCArKyApIHtcclxuXHJcblx0XHRcdFx0YmV0dGVyU2hhcGVIb2xlc1sgc0lkeCBdID0gW107XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgc0lkeCA9IDAsIHNMZW4gPSBuZXdTaGFwZXMubGVuZ3RoOyBzSWR4IDwgc0xlbjsgc0lkeCArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3Qgc2hvID0gbmV3U2hhcGVIb2xlc1sgc0lkeCBdO1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaElkeCA9IDA7IGhJZHggPCBzaG8ubGVuZ3RoOyBoSWR4ICsrICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGhvID0gc2hvWyBoSWR4IF07XHJcblx0XHRcdFx0XHRsZXQgaG9sZV91bmFzc2lnbmVkID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0XHRmb3IgKCBsZXQgczJJZHggPSAwOyBzMklkeCA8IG5ld1NoYXBlcy5sZW5ndGg7IHMySWR4ICsrICkge1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCBpc1BvaW50SW5zaWRlUG9seWdvbiggaG8ucCwgbmV3U2hhcGVzWyBzMklkeCBdLnAgKSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKCBzSWR4ICE9PSBzMklkeCApXHR0b0NoYW5nZSArKztcclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKCBob2xlX3VuYXNzaWduZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0aG9sZV91bmFzc2lnbmVkID0gZmFsc2U7XHJcblx0XHRcdFx0XHRcdFx0XHRiZXR0ZXJTaGFwZUhvbGVzWyBzMklkeCBdLnB1c2goIGhvICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0YW1iaWd1b3VzID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRpZiAoIGhvbGVfdW5hc3NpZ25lZCApIHtcclxuXHJcblx0XHRcdFx0XHRcdGJldHRlclNoYXBlSG9sZXNbIHNJZHggXS5wdXNoKCBobyApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCB0b0NoYW5nZSA+IDAgJiYgYW1iaWd1b3VzID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdFx0bmV3U2hhcGVIb2xlcyA9IGJldHRlclNoYXBlSG9sZXM7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGxldCB0bXBIb2xlcztcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gbmV3U2hhcGVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdFx0dG1wU2hhcGUgPSBuZXdTaGFwZXNbIGkgXS5zO1xyXG5cdFx0XHRzaGFwZXMucHVzaCggdG1wU2hhcGUgKTtcclxuXHRcdFx0dG1wSG9sZXMgPSBuZXdTaGFwZUhvbGVzWyBpIF07XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaiA9IDAsIGpsID0gdG1wSG9sZXMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XHJcblxyXG5cdFx0XHRcdHRtcFNoYXBlLmhvbGVzLnB1c2goIHRtcEhvbGVzWyBqIF0uaCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvL2NvbnNvbGUubG9nKFwic2hhcGVcIiwgc2hhcGVzKTtcclxuXHJcblx0XHRyZXR1cm4gc2hhcGVzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgU2hhcGVQYXRoIH07XHJcbiIsImltcG9ydCB7IEV2ZW50RGlzcGF0Y2hlciB9IGZyb20gJy4uL2NvcmUvRXZlbnREaXNwYXRjaGVyLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBjb250cm9scy5cclxuICpcclxuICogQGFic3RyYWN0XHJcbiAqIEBhdWdtZW50cyBFdmVudERpc3BhdGNoZXJcclxuICovXHJcbmNsYXNzIENvbnRyb2xzIGV4dGVuZHMgRXZlbnREaXNwYXRjaGVyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBjb250cm9scyBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0M0R9IG9iamVjdCAtIFRoZSBvYmplY3QgdGhhdCBpcyBtYW5hZ2VkIGJ5IHRoZSBjb250cm9scy5cclxuXHQgKiBAcGFyYW0gez9IVE1MRE9NRWxlbWVudH0gZG9tRWxlbWVudCAtIFRoZSBIVE1MIGVsZW1lbnQgdXNlZCBmb3IgZXZlbnQgbGlzdGVuZXJzLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBvYmplY3QsIGRvbUVsZW1lbnQgPSBudWxsICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgb2JqZWN0IHRoYXQgaXMgbWFuYWdlZCBieSB0aGUgY29udHJvbHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdDNEfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm9iamVjdCA9IG9iamVjdDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBIVE1MIGVsZW1lbnQgdXNlZCBmb3IgZXZlbnQgbGlzdGVuZXJzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/SFRNTERPTUVsZW1lbnR9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZG9tRWxlbWVudCA9IGRvbUVsZW1lbnQ7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSBjb250cm9scyByZXNwb25kcyB0byB1c2VyIGlucHV0IG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5lbmFibGVkID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgY29udHJvbHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IC0xXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc3RhdGUgPSAtIDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIG9iamVjdCBkZWZpbmVzIHRoZSBrZXlib2FyZCBpbnB1dCBvZiB0aGUgY29udHJvbHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5rZXlzID0ge307XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIG9iamVjdCBkZWZpbmVzIHdoYXQgdHlwZSBvZiBhY3Rpb25zIGFyZSBhc3NpZ25lZCB0byB0aGUgYXZhaWxhYmxlIG1vdXNlIGJ1dHRvbnMuXHJcblx0XHQgKiBJdCBkZXBlbmRzIG9uIHRoZSBjb250cm9sIGltcGxlbWVudGF0aW9uIHdoYXQga2luZCBvZiBtb3VzZSBidXR0b25zIGFuZCBhY3Rpb25zIGFyZSBzdXBwb3J0ZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3tMRUZUOiA/bnVtYmVyLCBNSURETEU6ID9udW1iZXIsIFJJR0hUOiA/bnVtYmVyfX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tb3VzZUJ1dHRvbnMgPSB7IExFRlQ6IG51bGwsIE1JRERMRTogbnVsbCwgUklHSFQ6IG51bGwgfTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgb2JqZWN0IGRlZmluZXMgd2hhdCB0eXBlIG9mIGFjdGlvbnMgYXJlIGFzc2lnbmVkIHRvIHdoYXQga2luZCBvZiB0b3VjaCBpbnRlcmFjdGlvbi5cclxuXHRcdCAqIEl0IGRlcGVuZHMgb24gdGhlIGNvbnRyb2wgaW1wbGVtZW50YXRpb24gd2hhdCBraW5kIG9mIHRvdWNoIGludGVyYWN0aW9uIGFuZCBhY3Rpb25zIGFyZSBzdXBwb3J0ZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3tPTkU6ID9udW1iZXIsIFRXTzogP251bWJlcn19XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudG91Y2hlcyA9IHsgT05FOiBudWxsLCBUV086IG51bGwgfTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25uZWN0cyB0aGUgY29udHJvbHMgdG8gdGhlIERPTS4gVGhpcyBtZXRob2QgaGFzIHNvIGNhbGxlZCBcInNpZGUgZWZmZWN0c1wiIHNpbmNlXHJcblx0ICogaXQgYWRkcyB0aGUgbW9kdWxlJ3MgZXZlbnQgbGlzdGVuZXJzIHRvIHRoZSBET00uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0hUTUxET01FbGVtZW50fSBlbGVtZW50IC0gVGhlIERPTSBlbGVtZW50IHRvIGNvbm5lY3QgdG8uXHJcblx0ICovXHJcblx0Y29ubmVjdCggZWxlbWVudCApIHtcclxuXHJcblx0XHRpZiAoIGVsZW1lbnQgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkNvbnRyb2xzOiBjb25uZWN0KCkgbm93IHJlcXVpcmVzIGFuIGVsZW1lbnQuJyApOyAvLyBAZGVwcmVjYXRlZCwgdGhlIHdhcm5pbmcgY2FuIGJlIHJlbW92ZWQgd2l0aCByMTg1XHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aGlzLmRvbUVsZW1lbnQgIT09IG51bGwgKSB0aGlzLmRpc2Nvbm5lY3QoKTtcclxuXHJcblx0XHR0aGlzLmRvbUVsZW1lbnQgPSBlbGVtZW50O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERpc2Nvbm5lY3RzIHRoZSBjb250cm9scyBmcm9tIHRoZSBET00uXHJcblx0ICovXHJcblx0ZGlzY29ubmVjdCgpIHt9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENhbGwgdGhpcyBtZXRob2QgaWYgeW91IG5vIGxvbmdlciB3YW50IHVzZSB0byB0aGUgY29udHJvbHMuIEl0IGZyZWVzIGFsbCBpbnRlcm5hbFxyXG5cdCAqIHJlc291cmNlcyBhbmQgcmVtb3ZlcyBhbGwgZXZlbnQgbGlzdGVuZXJzLlxyXG5cdCAqL1xyXG5cdGRpc3Bvc2UoKSB7fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb250cm9scyBzaG91bGQgaW1wbGVtZW50IHRoaXMgbWV0aG9kIGlmIHRoZXkgaGF2ZSB0byB1cGRhdGUgdGhlaXIgaW50ZXJuYWwgc3RhdGVcclxuXHQgKiBwZXIgc2ltdWxhdGlvbiBzdGVwLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtkZWx0YV0gLSBUaGUgdGltZSBkZWx0YSBpbiBzZWNvbmRzLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZSggLyogZGVsdGEgKi8gKSB7fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgQ29udHJvbHMgfTtcclxuIiwiaW1wb3J0IHsgQWxwaGFGb3JtYXQsIEx1bWluYW5jZUZvcm1hdCwgTHVtaW5hbmNlQWxwaGFGb3JtYXQsIFJlZEZvcm1hdCwgUmVkSW50ZWdlckZvcm1hdCwgUkdGb3JtYXQsIFJHSW50ZWdlckZvcm1hdCwgUkdCRm9ybWF0LCBSR0JBRm9ybWF0LCBSR0JBSW50ZWdlckZvcm1hdCwgUkdCX1MzVENfRFhUMV9Gb3JtYXQsIFJHQkFfUzNUQ19EWFQxX0Zvcm1hdCwgUkdCQV9TM1RDX0RYVDNfRm9ybWF0LCBSR0JBX1MzVENfRFhUNV9Gb3JtYXQsIFJHQl9QVlJUQ18yQlBQVjFfRm9ybWF0LCBSR0JBX1BWUlRDXzJCUFBWMV9Gb3JtYXQsIFJHQl9QVlJUQ180QlBQVjFfRm9ybWF0LCBSR0JBX1BWUlRDXzRCUFBWMV9Gb3JtYXQsIFJHQl9FVEMxX0Zvcm1hdCwgUkdCX0VUQzJfRm9ybWF0LCBSR0JBX0VUQzJfRUFDX0Zvcm1hdCwgUkdCQV9BU1RDXzR4NF9Gb3JtYXQsIFJHQkFfQVNUQ181eDRfRm9ybWF0LCBSR0JBX0FTVENfNXg1X0Zvcm1hdCwgUkdCQV9BU1RDXzZ4NV9Gb3JtYXQsIFJHQkFfQVNUQ182eDZfRm9ybWF0LCBSR0JBX0FTVENfOHg1X0Zvcm1hdCwgUkdCQV9BU1RDXzh4Nl9Gb3JtYXQsIFJHQkFfQVNUQ184eDhfRm9ybWF0LCBSR0JBX0FTVENfMTB4NV9Gb3JtYXQsIFJHQkFfQVNUQ18xMHg2X0Zvcm1hdCwgUkdCQV9BU1RDXzEweDhfRm9ybWF0LCBSR0JBX0FTVENfMTB4MTBfRm9ybWF0LCBSR0JBX0FTVENfMTJ4MTBfRm9ybWF0LCBSR0JBX0FTVENfMTJ4MTJfRm9ybWF0LCBSR0JBX0JQVENfRm9ybWF0LCBSR0JfQlBUQ19TSUdORURfRm9ybWF0LCBSR0JfQlBUQ19VTlNJR05FRF9Gb3JtYXQsIFJFRF9SR1RDMV9Gb3JtYXQsIFNJR05FRF9SRURfUkdUQzFfRm9ybWF0LCBSRURfR1JFRU5fUkdUQzJfRm9ybWF0LCBTSUdORURfUkVEX0dSRUVOX1JHVEMyX0Zvcm1hdCwgVW5zaWduZWRCeXRlVHlwZSwgQnl0ZVR5cGUsIFVuc2lnbmVkU2hvcnRUeXBlLCBTaG9ydFR5cGUsIEhhbGZGbG9hdFR5cGUsIFVuc2lnbmVkU2hvcnQ0NDQ0VHlwZSwgVW5zaWduZWRTaG9ydDU1NTFUeXBlLCBVbnNpZ25lZEludFR5cGUsIEludFR5cGUsIEZsb2F0VHlwZSwgVW5zaWduZWRJbnQ1OTk5VHlwZSB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XHJcblxyXG4vKipcclxuICogU2NhbGVzIHRoZSB0ZXh0dXJlIGFzIGxhcmdlIGFzIHBvc3NpYmxlIHdpdGhpbiBpdHMgc3VyZmFjZSB3aXRob3V0IGNyb3BwaW5nXHJcbiAqIG9yIHN0cmV0Y2hpbmcgdGhlIHRleHR1cmUuIFRoZSBtZXRob2QgcHJlc2VydmVzIHRoZSBvcmlnaW5hbCBhc3BlY3QgcmF0aW8gb2ZcclxuICogdGhlIHRleHR1cmUuIEFraW4gdG8gQ1NTIGBvYmplY3QtZml0OiBjb250YWluYFxyXG4gKlxyXG4gKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IGFzcGVjdCAtIFRoZSB0ZXh0dXJlJ3MgYXNwZWN0IHJhdGlvLlxyXG4gKiBAcmV0dXJuIHtUZXh0dXJlfSBUaGUgdXBkYXRlZCB0ZXh0dXJlLlxyXG4gKi9cclxuZnVuY3Rpb24gY29udGFpbiggdGV4dHVyZSwgYXNwZWN0ICkge1xyXG5cclxuXHRjb25zdCBpbWFnZUFzcGVjdCA9ICggdGV4dHVyZS5pbWFnZSAmJiB0ZXh0dXJlLmltYWdlLndpZHRoICkgPyB0ZXh0dXJlLmltYWdlLndpZHRoIC8gdGV4dHVyZS5pbWFnZS5oZWlnaHQgOiAxO1xyXG5cclxuXHRpZiAoIGltYWdlQXNwZWN0ID4gYXNwZWN0ICkge1xyXG5cclxuXHRcdHRleHR1cmUucmVwZWF0LnggPSAxO1xyXG5cdFx0dGV4dHVyZS5yZXBlYXQueSA9IGltYWdlQXNwZWN0IC8gYXNwZWN0O1xyXG5cclxuXHRcdHRleHR1cmUub2Zmc2V0LnggPSAwO1xyXG5cdFx0dGV4dHVyZS5vZmZzZXQueSA9ICggMSAtIHRleHR1cmUucmVwZWF0LnkgKSAvIDI7XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0dGV4dHVyZS5yZXBlYXQueCA9IGFzcGVjdCAvIGltYWdlQXNwZWN0O1xyXG5cdFx0dGV4dHVyZS5yZXBlYXQueSA9IDE7XHJcblxyXG5cdFx0dGV4dHVyZS5vZmZzZXQueCA9ICggMSAtIHRleHR1cmUucmVwZWF0LnggKSAvIDI7XHJcblx0XHR0ZXh0dXJlLm9mZnNldC55ID0gMDtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gdGV4dHVyZTtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTY2FsZXMgdGhlIHRleHR1cmUgdG8gdGhlIHNtYWxsZXN0IHBvc3NpYmxlIHNpemUgdG8gZmlsbCB0aGUgc3VyZmFjZSwgbGVhdmluZ1xyXG4gKiBubyBlbXB0eSBzcGFjZS4gVGhlIG1ldGhvZCBwcmVzZXJ2ZXMgdGhlIG9yaWdpbmFsIGFzcGVjdCByYXRpbyBvZiB0aGUgdGV4dHVyZS5cclxuICogQWtpbiB0byBDU1MgYG9iamVjdC1maXQ6IGNvdmVyYC5cclxuICpcclxuICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBhc3BlY3QgLSBUaGUgdGV4dHVyZSdzIGFzcGVjdCByYXRpby5cclxuICogQHJldHVybiB7VGV4dHVyZX0gVGhlIHVwZGF0ZWQgdGV4dHVyZS5cclxuICovXHJcbmZ1bmN0aW9uIGNvdmVyKCB0ZXh0dXJlLCBhc3BlY3QgKSB7XHJcblxyXG5cdGNvbnN0IGltYWdlQXNwZWN0ID0gKCB0ZXh0dXJlLmltYWdlICYmIHRleHR1cmUuaW1hZ2Uud2lkdGggKSA/IHRleHR1cmUuaW1hZ2Uud2lkdGggLyB0ZXh0dXJlLmltYWdlLmhlaWdodCA6IDE7XHJcblxyXG5cdGlmICggaW1hZ2VBc3BlY3QgPiBhc3BlY3QgKSB7XHJcblxyXG5cdFx0dGV4dHVyZS5yZXBlYXQueCA9IGFzcGVjdCAvIGltYWdlQXNwZWN0O1xyXG5cdFx0dGV4dHVyZS5yZXBlYXQueSA9IDE7XHJcblxyXG5cdFx0dGV4dHVyZS5vZmZzZXQueCA9ICggMSAtIHRleHR1cmUucmVwZWF0LnggKSAvIDI7XHJcblx0XHR0ZXh0dXJlLm9mZnNldC55ID0gMDtcclxuXHJcblx0fSBlbHNlIHtcclxuXHJcblx0XHR0ZXh0dXJlLnJlcGVhdC54ID0gMTtcclxuXHRcdHRleHR1cmUucmVwZWF0LnkgPSBpbWFnZUFzcGVjdCAvIGFzcGVjdDtcclxuXHJcblx0XHR0ZXh0dXJlLm9mZnNldC54ID0gMDtcclxuXHRcdHRleHR1cmUub2Zmc2V0LnkgPSAoIDEgLSB0ZXh0dXJlLnJlcGVhdC55ICkgLyAyO1xyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiB0ZXh0dXJlO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIENvbmZpZ3VyZXMgdGhlIHRleHR1cmUgdG8gdGhlIGRlZmF1bHQgdHJhbnNmb3JtYXRpb24uIEFraW4gdG8gQ1NTIGBvYmplY3QtZml0OiBmaWxsYC5cclxuICpcclxuICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUuXHJcbiAqIEByZXR1cm4ge1RleHR1cmV9IFRoZSB1cGRhdGVkIHRleHR1cmUuXHJcbiAqL1xyXG5mdW5jdGlvbiBmaWxsKCB0ZXh0dXJlICkge1xyXG5cclxuXHR0ZXh0dXJlLnJlcGVhdC54ID0gMTtcclxuXHR0ZXh0dXJlLnJlcGVhdC55ID0gMTtcclxuXHJcblx0dGV4dHVyZS5vZmZzZXQueCA9IDA7XHJcblx0dGV4dHVyZS5vZmZzZXQueSA9IDA7XHJcblxyXG5cdHJldHVybiB0ZXh0dXJlO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIERldGVybWluZXMgaG93IG1hbnkgYnl0ZXMgbXVzdCBiZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgdGV4dHVyZS5cclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSB0ZXh0dXJlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgdGV4dHVyZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IGZvcm1hdCAtIFRoZSB0ZXh0dXJlJ3MgZm9ybWF0LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gdHlwZSAtIFRoZSB0ZXh0dXJlJ3MgdHlwZS5cclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgYnl0ZSBsZW5ndGguXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRCeXRlTGVuZ3RoKCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUgKSB7XHJcblxyXG5cdGNvbnN0IHR5cGVCeXRlTGVuZ3RoID0gZ2V0VGV4dHVyZVR5cGVCeXRlTGVuZ3RoKCB0eXBlICk7XHJcblxyXG5cdHN3aXRjaCAoIGZvcm1hdCApIHtcclxuXHJcblx0XHQvLyBodHRwczovL3JlZ2lzdHJ5Lmtocm9ub3Mub3JnL09wZW5HTC1SZWZwYWdlcy9lczMuMC9odG1sL2dsVGV4SW1hZ2UyRC54aHRtbFxyXG5cdFx0Y2FzZSBBbHBoYUZvcm1hdDpcclxuXHRcdFx0cmV0dXJuIHdpZHRoICogaGVpZ2h0O1xyXG5cdFx0Y2FzZSBMdW1pbmFuY2VGb3JtYXQ6XHJcblx0XHRcdHJldHVybiB3aWR0aCAqIGhlaWdodDtcclxuXHRcdGNhc2UgTHVtaW5hbmNlQWxwaGFGb3JtYXQ6XHJcblx0XHRcdHJldHVybiB3aWR0aCAqIGhlaWdodCAqIDI7XHJcblx0XHRjYXNlIFJlZEZvcm1hdDpcclxuXHRcdFx0cmV0dXJuICggKCB3aWR0aCAqIGhlaWdodCApIC8gdHlwZUJ5dGVMZW5ndGguY29tcG9uZW50cyApICogdHlwZUJ5dGVMZW5ndGguYnl0ZUxlbmd0aDtcclxuXHRcdGNhc2UgUmVkSW50ZWdlckZvcm1hdDpcclxuXHRcdFx0cmV0dXJuICggKCB3aWR0aCAqIGhlaWdodCApIC8gdHlwZUJ5dGVMZW5ndGguY29tcG9uZW50cyApICogdHlwZUJ5dGVMZW5ndGguYnl0ZUxlbmd0aDtcclxuXHRcdGNhc2UgUkdGb3JtYXQ6XHJcblx0XHRcdHJldHVybiAoICggd2lkdGggKiBoZWlnaHQgKiAyICkgLyB0eXBlQnl0ZUxlbmd0aC5jb21wb25lbnRzICkgKiB0eXBlQnl0ZUxlbmd0aC5ieXRlTGVuZ3RoO1xyXG5cdFx0Y2FzZSBSR0ludGVnZXJGb3JtYXQ6XHJcblx0XHRcdHJldHVybiAoICggd2lkdGggKiBoZWlnaHQgKiAyICkgLyB0eXBlQnl0ZUxlbmd0aC5jb21wb25lbnRzICkgKiB0eXBlQnl0ZUxlbmd0aC5ieXRlTGVuZ3RoO1xyXG5cdFx0Y2FzZSBSR0JGb3JtYXQ6XHJcblx0XHRcdHJldHVybiAoICggd2lkdGggKiBoZWlnaHQgKiAzICkgLyB0eXBlQnl0ZUxlbmd0aC5jb21wb25lbnRzICkgKiB0eXBlQnl0ZUxlbmd0aC5ieXRlTGVuZ3RoO1xyXG5cdFx0Y2FzZSBSR0JBRm9ybWF0OlxyXG5cdFx0XHRyZXR1cm4gKCAoIHdpZHRoICogaGVpZ2h0ICogNCApIC8gdHlwZUJ5dGVMZW5ndGguY29tcG9uZW50cyApICogdHlwZUJ5dGVMZW5ndGguYnl0ZUxlbmd0aDtcclxuXHRcdGNhc2UgUkdCQUludGVnZXJGb3JtYXQ6XHJcblx0XHRcdHJldHVybiAoICggd2lkdGggKiBoZWlnaHQgKiA0ICkgLyB0eXBlQnl0ZUxlbmd0aC5jb21wb25lbnRzICkgKiB0eXBlQnl0ZUxlbmd0aC5ieXRlTGVuZ3RoO1xyXG5cclxuXHRcdC8vIGh0dHBzOi8vcmVnaXN0cnkua2hyb25vcy5vcmcvd2ViZ2wvZXh0ZW5zaW9ucy9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0Y19zcmdiL1xyXG5cdFx0Y2FzZSBSR0JfUzNUQ19EWFQxX0Zvcm1hdDpcclxuXHRcdGNhc2UgUkdCQV9TM1RDX0RYVDFfRm9ybWF0OlxyXG5cdFx0XHRyZXR1cm4gTWF0aC5mbG9vciggKCB3aWR0aCArIDMgKSAvIDQgKSAqIE1hdGguZmxvb3IoICggaGVpZ2h0ICsgMyApIC8gNCApICogODtcclxuXHRcdGNhc2UgUkdCQV9TM1RDX0RYVDNfRm9ybWF0OlxyXG5cdFx0Y2FzZSBSR0JBX1MzVENfRFhUNV9Gb3JtYXQ6XHJcblx0XHRcdHJldHVybiBNYXRoLmZsb29yKCAoIHdpZHRoICsgMyApIC8gNCApICogTWF0aC5mbG9vciggKCBoZWlnaHQgKyAzICkgLyA0ICkgKiAxNjtcclxuXHJcblx0XHQvLyBodHRwczovL3JlZ2lzdHJ5Lmtocm9ub3Mub3JnL3dlYmdsL2V4dGVuc2lvbnMvV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjL1xyXG5cdFx0Y2FzZSBSR0JfUFZSVENfMkJQUFYxX0Zvcm1hdDpcclxuXHRcdGNhc2UgUkdCQV9QVlJUQ18yQlBQVjFfRm9ybWF0OlxyXG5cdFx0XHRyZXR1cm4gKCBNYXRoLm1heCggd2lkdGgsIDE2ICkgKiBNYXRoLm1heCggaGVpZ2h0LCA4ICkgKSAvIDQ7XHJcblx0XHRjYXNlIFJHQl9QVlJUQ180QlBQVjFfRm9ybWF0OlxyXG5cdFx0Y2FzZSBSR0JBX1BWUlRDXzRCUFBWMV9Gb3JtYXQ6XHJcblx0XHRcdHJldHVybiAoIE1hdGgubWF4KCB3aWR0aCwgOCApICogTWF0aC5tYXgoIGhlaWdodCwgOCApICkgLyAyO1xyXG5cclxuXHRcdC8vIGh0dHBzOi8vcmVnaXN0cnkua2hyb25vcy5vcmcvd2ViZ2wvZXh0ZW5zaW9ucy9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfZXRjL1xyXG5cdFx0Y2FzZSBSR0JfRVRDMV9Gb3JtYXQ6XHJcblx0XHRjYXNlIFJHQl9FVEMyX0Zvcm1hdDpcclxuXHRcdFx0cmV0dXJuIE1hdGguZmxvb3IoICggd2lkdGggKyAzICkgLyA0ICkgKiBNYXRoLmZsb29yKCAoIGhlaWdodCArIDMgKSAvIDQgKSAqIDg7XHJcblx0XHRjYXNlIFJHQkFfRVRDMl9FQUNfRm9ybWF0OlxyXG5cdFx0XHRyZXR1cm4gTWF0aC5mbG9vciggKCB3aWR0aCArIDMgKSAvIDQgKSAqIE1hdGguZmxvb3IoICggaGVpZ2h0ICsgMyApIC8gNCApICogMTY7XHJcblxyXG5cdFx0Ly8gaHR0cHM6Ly9yZWdpc3RyeS5raHJvbm9zLm9yZy93ZWJnbC9leHRlbnNpb25zL1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9hc3RjL1xyXG5cdFx0Y2FzZSBSR0JBX0FTVENfNHg0X0Zvcm1hdDpcclxuXHRcdFx0cmV0dXJuIE1hdGguZmxvb3IoICggd2lkdGggKyAzICkgLyA0ICkgKiBNYXRoLmZsb29yKCAoIGhlaWdodCArIDMgKSAvIDQgKSAqIDE2O1xyXG5cdFx0Y2FzZSBSR0JBX0FTVENfNXg0X0Zvcm1hdDpcclxuXHRcdFx0cmV0dXJuIE1hdGguZmxvb3IoICggd2lkdGggKyA0ICkgLyA1ICkgKiBNYXRoLmZsb29yKCAoIGhlaWdodCArIDMgKSAvIDQgKSAqIDE2O1xyXG5cdFx0Y2FzZSBSR0JBX0FTVENfNXg1X0Zvcm1hdDpcclxuXHRcdFx0cmV0dXJuIE1hdGguZmxvb3IoICggd2lkdGggKyA0ICkgLyA1ICkgKiBNYXRoLmZsb29yKCAoIGhlaWdodCArIDQgKSAvIDUgKSAqIDE2O1xyXG5cdFx0Y2FzZSBSR0JBX0FTVENfNng1X0Zvcm1hdDpcclxuXHRcdFx0cmV0dXJuIE1hdGguZmxvb3IoICggd2lkdGggKyA1ICkgLyA2ICkgKiBNYXRoLmZsb29yKCAoIGhlaWdodCArIDQgKSAvIDUgKSAqIDE2O1xyXG5cdFx0Y2FzZSBSR0JBX0FTVENfNng2X0Zvcm1hdDpcclxuXHRcdFx0cmV0dXJuIE1hdGguZmxvb3IoICggd2lkdGggKyA1ICkgLyA2ICkgKiBNYXRoLmZsb29yKCAoIGhlaWdodCArIDUgKSAvIDYgKSAqIDE2O1xyXG5cdFx0Y2FzZSBSR0JBX0FTVENfOHg1X0Zvcm1hdDpcclxuXHRcdFx0cmV0dXJuIE1hdGguZmxvb3IoICggd2lkdGggKyA3ICkgLyA4ICkgKiBNYXRoLmZsb29yKCAoIGhlaWdodCArIDQgKSAvIDUgKSAqIDE2O1xyXG5cdFx0Y2FzZSBSR0JBX0FTVENfOHg2X0Zvcm1hdDpcclxuXHRcdFx0cmV0dXJuIE1hdGguZmxvb3IoICggd2lkdGggKyA3ICkgLyA4ICkgKiBNYXRoLmZsb29yKCAoIGhlaWdodCArIDUgKSAvIDYgKSAqIDE2O1xyXG5cdFx0Y2FzZSBSR0JBX0FTVENfOHg4X0Zvcm1hdDpcclxuXHRcdFx0cmV0dXJuIE1hdGguZmxvb3IoICggd2lkdGggKyA3ICkgLyA4ICkgKiBNYXRoLmZsb29yKCAoIGhlaWdodCArIDcgKSAvIDggKSAqIDE2O1xyXG5cdFx0Y2FzZSBSR0JBX0FTVENfMTB4NV9Gb3JtYXQ6XHJcblx0XHRcdHJldHVybiBNYXRoLmZsb29yKCAoIHdpZHRoICsgOSApIC8gMTAgKSAqIE1hdGguZmxvb3IoICggaGVpZ2h0ICsgNCApIC8gNSApICogMTY7XHJcblx0XHRjYXNlIFJHQkFfQVNUQ18xMHg2X0Zvcm1hdDpcclxuXHRcdFx0cmV0dXJuIE1hdGguZmxvb3IoICggd2lkdGggKyA5ICkgLyAxMCApICogTWF0aC5mbG9vciggKCBoZWlnaHQgKyA1ICkgLyA2ICkgKiAxNjtcclxuXHRcdGNhc2UgUkdCQV9BU1RDXzEweDhfRm9ybWF0OlxyXG5cdFx0XHRyZXR1cm4gTWF0aC5mbG9vciggKCB3aWR0aCArIDkgKSAvIDEwICkgKiBNYXRoLmZsb29yKCAoIGhlaWdodCArIDcgKSAvIDggKSAqIDE2O1xyXG5cdFx0Y2FzZSBSR0JBX0FTVENfMTB4MTBfRm9ybWF0OlxyXG5cdFx0XHRyZXR1cm4gTWF0aC5mbG9vciggKCB3aWR0aCArIDkgKSAvIDEwICkgKiBNYXRoLmZsb29yKCAoIGhlaWdodCArIDkgKSAvIDEwICkgKiAxNjtcclxuXHRcdGNhc2UgUkdCQV9BU1RDXzEyeDEwX0Zvcm1hdDpcclxuXHRcdFx0cmV0dXJuIE1hdGguZmxvb3IoICggd2lkdGggKyAxMSApIC8gMTIgKSAqIE1hdGguZmxvb3IoICggaGVpZ2h0ICsgOSApIC8gMTAgKSAqIDE2O1xyXG5cdFx0Y2FzZSBSR0JBX0FTVENfMTJ4MTJfRm9ybWF0OlxyXG5cdFx0XHRyZXR1cm4gTWF0aC5mbG9vciggKCB3aWR0aCArIDExICkgLyAxMiApICogTWF0aC5mbG9vciggKCBoZWlnaHQgKyAxMSApIC8gMTIgKSAqIDE2O1xyXG5cclxuXHRcdC8vIGh0dHBzOi8vcmVnaXN0cnkua2hyb25vcy5vcmcvd2ViZ2wvZXh0ZW5zaW9ucy9FWFRfdGV4dHVyZV9jb21wcmVzc2lvbl9icHRjL1xyXG5cdFx0Y2FzZSBSR0JBX0JQVENfRm9ybWF0OlxyXG5cdFx0Y2FzZSBSR0JfQlBUQ19TSUdORURfRm9ybWF0OlxyXG5cdFx0Y2FzZSBSR0JfQlBUQ19VTlNJR05FRF9Gb3JtYXQ6XHJcblx0XHRcdHJldHVybiBNYXRoLmNlaWwoIHdpZHRoIC8gNCApICogTWF0aC5jZWlsKCBoZWlnaHQgLyA0ICkgKiAxNjtcclxuXHJcblx0XHQvLyBodHRwczovL3JlZ2lzdHJ5Lmtocm9ub3Mub3JnL3dlYmdsL2V4dGVuc2lvbnMvRVhUX3RleHR1cmVfY29tcHJlc3Npb25fcmd0Yy9cclxuXHRcdGNhc2UgUkVEX1JHVEMxX0Zvcm1hdDpcclxuXHRcdGNhc2UgU0lHTkVEX1JFRF9SR1RDMV9Gb3JtYXQ6XHJcblx0XHRcdHJldHVybiBNYXRoLmNlaWwoIHdpZHRoIC8gNCApICogTWF0aC5jZWlsKCBoZWlnaHQgLyA0ICkgKiA4O1xyXG5cdFx0Y2FzZSBSRURfR1JFRU5fUkdUQzJfRm9ybWF0OlxyXG5cdFx0Y2FzZSBTSUdORURfUkVEX0dSRUVOX1JHVEMyX0Zvcm1hdDpcclxuXHRcdFx0cmV0dXJuIE1hdGguY2VpbCggd2lkdGggLyA0ICkgKiBNYXRoLmNlaWwoIGhlaWdodCAvIDQgKSAqIDE2O1xyXG5cclxuXHR9XHJcblxyXG5cdHRocm93IG5ldyBFcnJvcihcclxuXHRcdGBVbmFibGUgdG8gZGV0ZXJtaW5lIHRleHR1cmUgYnl0ZSBsZW5ndGggZm9yICR7Zm9ybWF0fSBmb3JtYXQuYCxcclxuXHQpO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0VGV4dHVyZVR5cGVCeXRlTGVuZ3RoKCB0eXBlICkge1xyXG5cclxuXHRzd2l0Y2ggKCB0eXBlICkge1xyXG5cclxuXHRcdGNhc2UgVW5zaWduZWRCeXRlVHlwZTpcclxuXHRcdGNhc2UgQnl0ZVR5cGU6XHJcblx0XHRcdHJldHVybiB7IGJ5dGVMZW5ndGg6IDEsIGNvbXBvbmVudHM6IDEgfTtcclxuXHRcdGNhc2UgVW5zaWduZWRTaG9ydFR5cGU6XHJcblx0XHRjYXNlIFNob3J0VHlwZTpcclxuXHRcdGNhc2UgSGFsZkZsb2F0VHlwZTpcclxuXHRcdFx0cmV0dXJuIHsgYnl0ZUxlbmd0aDogMiwgY29tcG9uZW50czogMSB9O1xyXG5cdFx0Y2FzZSBVbnNpZ25lZFNob3J0NDQ0NFR5cGU6XHJcblx0XHRjYXNlIFVuc2lnbmVkU2hvcnQ1NTUxVHlwZTpcclxuXHRcdFx0cmV0dXJuIHsgYnl0ZUxlbmd0aDogMiwgY29tcG9uZW50czogNCB9O1xyXG5cdFx0Y2FzZSBVbnNpZ25lZEludFR5cGU6XHJcblx0XHRjYXNlIEludFR5cGU6XHJcblx0XHRjYXNlIEZsb2F0VHlwZTpcclxuXHRcdFx0cmV0dXJuIHsgYnl0ZUxlbmd0aDogNCwgY29tcG9uZW50czogMSB9O1xyXG5cdFx0Y2FzZSBVbnNpZ25lZEludDU5OTlUeXBlOlxyXG5cdFx0XHRyZXR1cm4geyBieXRlTGVuZ3RoOiA0LCBjb21wb25lbnRzOiAzIH07XHJcblxyXG5cdH1cclxuXHJcblx0dGhyb3cgbmV3IEVycm9yKCBgVW5rbm93biB0ZXh0dXJlIHR5cGUgJHt0eXBlfS5gICk7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQSBjbGFzcyBjb250YWluaW5nIHV0aWxpdHkgZnVuY3Rpb25zIGZvciB0ZXh0dXJlcy5cclxuICpcclxuICogQGhpZGVjb25zdHJ1Y3RvclxyXG4gKi9cclxuY2xhc3MgVGV4dHVyZVV0aWxzIHtcclxuXHJcblx0LyoqXHJcblx0ICogU2NhbGVzIHRoZSB0ZXh0dXJlIGFzIGxhcmdlIGFzIHBvc3NpYmxlIHdpdGhpbiBpdHMgc3VyZmFjZSB3aXRob3V0IGNyb3BwaW5nXHJcblx0ICogb3Igc3RyZXRjaGluZyB0aGUgdGV4dHVyZS4gVGhlIG1ldGhvZCBwcmVzZXJ2ZXMgdGhlIG9yaWdpbmFsIGFzcGVjdCByYXRpbyBvZlxyXG5cdCAqIHRoZSB0ZXh0dXJlLiBBa2luIHRvIENTUyBgb2JqZWN0LWZpdDogY29udGFpbmBcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhc3BlY3QgLSBUaGUgdGV4dHVyZSdzIGFzcGVjdCByYXRpby5cclxuXHQgKiBAcmV0dXJuIHtUZXh0dXJlfSBUaGUgdXBkYXRlZCB0ZXh0dXJlLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBjb250YWluKCB0ZXh0dXJlLCBhc3BlY3QgKSB7XHJcblxyXG5cdFx0cmV0dXJuIGNvbnRhaW4oIHRleHR1cmUsIGFzcGVjdCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNjYWxlcyB0aGUgdGV4dHVyZSB0byB0aGUgc21hbGxlc3QgcG9zc2libGUgc2l6ZSB0byBmaWxsIHRoZSBzdXJmYWNlLCBsZWF2aW5nXHJcblx0ICogbm8gZW1wdHkgc3BhY2UuIFRoZSBtZXRob2QgcHJlc2VydmVzIHRoZSBvcmlnaW5hbCBhc3BlY3QgcmF0aW8gb2YgdGhlIHRleHR1cmUuXHJcblx0ICogQWtpbiB0byBDU1MgYG9iamVjdC1maXQ6IGNvdmVyYC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhc3BlY3QgLSBUaGUgdGV4dHVyZSdzIGFzcGVjdCByYXRpby5cclxuXHQgKiBAcmV0dXJuIHtUZXh0dXJlfSBUaGUgdXBkYXRlZCB0ZXh0dXJlLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBjb3ZlciggdGV4dHVyZSwgYXNwZWN0ICkge1xyXG5cclxuXHRcdHJldHVybiBjb3ZlciggdGV4dHVyZSwgYXNwZWN0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uZmlndXJlcyB0aGUgdGV4dHVyZSB0byB0aGUgZGVmYXVsdCB0cmFuc2Zvcm1hdGlvbi4gQWtpbiB0byBDU1MgYG9iamVjdC1maXQ6IGZpbGxgLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUuXHJcblx0ICogQHJldHVybiB7VGV4dHVyZX0gVGhlIHVwZGF0ZWQgdGV4dHVyZS5cclxuXHQgKi9cclxuXHRzdGF0aWMgZmlsbCggdGV4dHVyZSApIHtcclxuXHJcblx0XHRyZXR1cm4gZmlsbCggdGV4dHVyZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERldGVybWluZXMgaG93IG1hbnkgYnl0ZXMgbXVzdCBiZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZm9ybWF0IC0gVGhlIHRleHR1cmUncyBmb3JtYXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHR5cGUgLSBUaGUgdGV4dHVyZSdzIHR5cGUuXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgYnl0ZSBsZW5ndGguXHJcblx0ICovXHJcblx0c3RhdGljIGdldEJ5dGVMZW5ndGgoIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSApIHtcclxuXHJcblx0XHRyZXR1cm4gZ2V0Qnl0ZUxlbmd0aCggd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0eXBlICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IGNvbnRhaW4sIGNvdmVyLCBmaWxsLCBnZXRCeXRlTGVuZ3RoLCBUZXh0dXJlVXRpbHMgfTtcclxuIiwiaW1wb3J0IHsgUkVWSVNJT04gfSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XHJcblxyXG5leHBvcnQgeyBXZWJHTEFycmF5UmVuZGVyVGFyZ2V0IH0gZnJvbSAnLi9yZW5kZXJlcnMvV2ViR0xBcnJheVJlbmRlclRhcmdldC5qcyc7XHJcbmV4cG9ydCB7IFdlYkdMM0RSZW5kZXJUYXJnZXQgfSBmcm9tICcuL3JlbmRlcmVycy9XZWJHTDNEUmVuZGVyVGFyZ2V0LmpzJztcclxuZXhwb3J0IHsgV2ViR0xDdWJlUmVuZGVyVGFyZ2V0IH0gZnJvbSAnLi9yZW5kZXJlcnMvV2ViR0xDdWJlUmVuZGVyVGFyZ2V0LmpzJztcclxuZXhwb3J0IHsgV2ViR0xSZW5kZXJUYXJnZXQgfSBmcm9tICcuL3JlbmRlcmVycy9XZWJHTFJlbmRlclRhcmdldC5qcyc7XHJcbmV4cG9ydCB7IFdlYlhSQ29udHJvbGxlciB9IGZyb20gJy4vcmVuZGVyZXJzL3dlYnhyL1dlYlhSQ29udHJvbGxlci5qcyc7XHJcbmV4cG9ydCB7IEZvZ0V4cDIgfSBmcm9tICcuL3NjZW5lcy9Gb2dFeHAyLmpzJztcclxuZXhwb3J0IHsgRm9nIH0gZnJvbSAnLi9zY2VuZXMvRm9nLmpzJztcclxuZXhwb3J0IHsgU2NlbmUgfSBmcm9tICcuL3NjZW5lcy9TY2VuZS5qcyc7XHJcbmV4cG9ydCB7IFNwcml0ZSB9IGZyb20gJy4vb2JqZWN0cy9TcHJpdGUuanMnO1xyXG5leHBvcnQgeyBMT0QgfSBmcm9tICcuL29iamVjdHMvTE9ELmpzJztcclxuZXhwb3J0IHsgU2tpbm5lZE1lc2ggfSBmcm9tICcuL29iamVjdHMvU2tpbm5lZE1lc2guanMnO1xyXG5leHBvcnQgeyBTa2VsZXRvbiB9IGZyb20gJy4vb2JqZWN0cy9Ta2VsZXRvbi5qcyc7XHJcbmV4cG9ydCB7IEJvbmUgfSBmcm9tICcuL29iamVjdHMvQm9uZS5qcyc7XHJcbmV4cG9ydCB7IE1lc2ggfSBmcm9tICcuL29iamVjdHMvTWVzaC5qcyc7XHJcbmV4cG9ydCB7IEluc3RhbmNlZE1lc2ggfSBmcm9tICcuL29iamVjdHMvSW5zdGFuY2VkTWVzaC5qcyc7XHJcbmV4cG9ydCB7IEJhdGNoZWRNZXNoIH0gZnJvbSAnLi9vYmplY3RzL0JhdGNoZWRNZXNoLmpzJztcclxuZXhwb3J0IHsgTGluZVNlZ21lbnRzIH0gZnJvbSAnLi9vYmplY3RzL0xpbmVTZWdtZW50cy5qcyc7XHJcbmV4cG9ydCB7IExpbmVMb29wIH0gZnJvbSAnLi9vYmplY3RzL0xpbmVMb29wLmpzJztcclxuZXhwb3J0IHsgTGluZSB9IGZyb20gJy4vb2JqZWN0cy9MaW5lLmpzJztcclxuZXhwb3J0IHsgUG9pbnRzIH0gZnJvbSAnLi9vYmplY3RzL1BvaW50cy5qcyc7XHJcbmV4cG9ydCB7IEdyb3VwIH0gZnJvbSAnLi9vYmplY3RzL0dyb3VwLmpzJztcclxuZXhwb3J0IHsgVmlkZW9UZXh0dXJlIH0gZnJvbSAnLi90ZXh0dXJlcy9WaWRlb1RleHR1cmUuanMnO1xyXG5leHBvcnQgeyBWaWRlb0ZyYW1lVGV4dHVyZSB9IGZyb20gJy4vdGV4dHVyZXMvVmlkZW9GcmFtZVRleHR1cmUuanMnO1xyXG5leHBvcnQgeyBGcmFtZWJ1ZmZlclRleHR1cmUgfSBmcm9tICcuL3RleHR1cmVzL0ZyYW1lYnVmZmVyVGV4dHVyZS5qcyc7XHJcbmV4cG9ydCB7IFNvdXJjZSB9IGZyb20gJy4vdGV4dHVyZXMvU291cmNlLmpzJztcclxuZXhwb3J0IHsgRGF0YVRleHR1cmUgfSBmcm9tICcuL3RleHR1cmVzL0RhdGFUZXh0dXJlLmpzJztcclxuZXhwb3J0IHsgRGF0YUFycmF5VGV4dHVyZSB9IGZyb20gJy4vdGV4dHVyZXMvRGF0YUFycmF5VGV4dHVyZS5qcyc7XHJcbmV4cG9ydCB7IERhdGEzRFRleHR1cmUgfSBmcm9tICcuL3RleHR1cmVzL0RhdGEzRFRleHR1cmUuanMnO1xyXG5leHBvcnQgeyBDb21wcmVzc2VkVGV4dHVyZSB9IGZyb20gJy4vdGV4dHVyZXMvQ29tcHJlc3NlZFRleHR1cmUuanMnO1xyXG5leHBvcnQgeyBDb21wcmVzc2VkQXJyYXlUZXh0dXJlIH0gZnJvbSAnLi90ZXh0dXJlcy9Db21wcmVzc2VkQXJyYXlUZXh0dXJlLmpzJztcclxuZXhwb3J0IHsgQ29tcHJlc3NlZEN1YmVUZXh0dXJlIH0gZnJvbSAnLi90ZXh0dXJlcy9Db21wcmVzc2VkQ3ViZVRleHR1cmUuanMnO1xyXG5leHBvcnQgeyBDdWJlVGV4dHVyZSB9IGZyb20gJy4vdGV4dHVyZXMvQ3ViZVRleHR1cmUuanMnO1xyXG5leHBvcnQgeyBDYW52YXNUZXh0dXJlIH0gZnJvbSAnLi90ZXh0dXJlcy9DYW52YXNUZXh0dXJlLmpzJztcclxuZXhwb3J0IHsgRGVwdGhUZXh0dXJlIH0gZnJvbSAnLi90ZXh0dXJlcy9EZXB0aFRleHR1cmUuanMnO1xyXG5leHBvcnQgeyBUZXh0dXJlIH0gZnJvbSAnLi90ZXh0dXJlcy9UZXh0dXJlLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi9nZW9tZXRyaWVzL0dlb21ldHJpZXMuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL21hdGVyaWFscy9NYXRlcmlhbHMuanMnO1xyXG5leHBvcnQgeyBBbmltYXRpb25Mb2FkZXIgfSBmcm9tICcuL2xvYWRlcnMvQW5pbWF0aW9uTG9hZGVyLmpzJztcclxuZXhwb3J0IHsgQ29tcHJlc3NlZFRleHR1cmVMb2FkZXIgfSBmcm9tICcuL2xvYWRlcnMvQ29tcHJlc3NlZFRleHR1cmVMb2FkZXIuanMnO1xyXG5leHBvcnQgeyBDdWJlVGV4dHVyZUxvYWRlciB9IGZyb20gJy4vbG9hZGVycy9DdWJlVGV4dHVyZUxvYWRlci5qcyc7XHJcbmV4cG9ydCB7IERhdGFUZXh0dXJlTG9hZGVyIH0gZnJvbSAnLi9sb2FkZXJzL0RhdGFUZXh0dXJlTG9hZGVyLmpzJztcclxuZXhwb3J0IHsgVGV4dHVyZUxvYWRlciB9IGZyb20gJy4vbG9hZGVycy9UZXh0dXJlTG9hZGVyLmpzJztcclxuZXhwb3J0IHsgT2JqZWN0TG9hZGVyIH0gZnJvbSAnLi9sb2FkZXJzL09iamVjdExvYWRlci5qcyc7XHJcbmV4cG9ydCB7IE1hdGVyaWFsTG9hZGVyIH0gZnJvbSAnLi9sb2FkZXJzL01hdGVyaWFsTG9hZGVyLmpzJztcclxuZXhwb3J0IHsgQnVmZmVyR2VvbWV0cnlMb2FkZXIgfSBmcm9tICcuL2xvYWRlcnMvQnVmZmVyR2VvbWV0cnlMb2FkZXIuanMnO1xyXG5leHBvcnQgeyBEZWZhdWx0TG9hZGluZ01hbmFnZXIsIExvYWRpbmdNYW5hZ2VyIH0gZnJvbSAnLi9sb2FkZXJzL0xvYWRpbmdNYW5hZ2VyLmpzJztcclxuZXhwb3J0IHsgSW1hZ2VMb2FkZXIgfSBmcm9tICcuL2xvYWRlcnMvSW1hZ2VMb2FkZXIuanMnO1xyXG5leHBvcnQgeyBJbWFnZUJpdG1hcExvYWRlciB9IGZyb20gJy4vbG9hZGVycy9JbWFnZUJpdG1hcExvYWRlci5qcyc7XHJcbmV4cG9ydCB7IEZpbGVMb2FkZXIgfSBmcm9tICcuL2xvYWRlcnMvRmlsZUxvYWRlci5qcyc7XHJcbmV4cG9ydCB7IExvYWRlciB9IGZyb20gJy4vbG9hZGVycy9Mb2FkZXIuanMnO1xyXG5leHBvcnQgeyBMb2FkZXJVdGlscyB9IGZyb20gJy4vbG9hZGVycy9Mb2FkZXJVdGlscy5qcyc7XHJcbmV4cG9ydCB7IENhY2hlIH0gZnJvbSAnLi9sb2FkZXJzL0NhY2hlLmpzJztcclxuZXhwb3J0IHsgQXVkaW9Mb2FkZXIgfSBmcm9tICcuL2xvYWRlcnMvQXVkaW9Mb2FkZXIuanMnO1xyXG5leHBvcnQgeyBTcG90TGlnaHQgfSBmcm9tICcuL2xpZ2h0cy9TcG90TGlnaHQuanMnO1xyXG5leHBvcnQgeyBQb2ludExpZ2h0IH0gZnJvbSAnLi9saWdodHMvUG9pbnRMaWdodC5qcyc7XHJcbmV4cG9ydCB7IFJlY3RBcmVhTGlnaHQgfSBmcm9tICcuL2xpZ2h0cy9SZWN0QXJlYUxpZ2h0LmpzJztcclxuZXhwb3J0IHsgSGVtaXNwaGVyZUxpZ2h0IH0gZnJvbSAnLi9saWdodHMvSGVtaXNwaGVyZUxpZ2h0LmpzJztcclxuZXhwb3J0IHsgRGlyZWN0aW9uYWxMaWdodCB9IGZyb20gJy4vbGlnaHRzL0RpcmVjdGlvbmFsTGlnaHQuanMnO1xyXG5leHBvcnQgeyBBbWJpZW50TGlnaHQgfSBmcm9tICcuL2xpZ2h0cy9BbWJpZW50TGlnaHQuanMnO1xyXG5leHBvcnQgeyBMaWdodCB9IGZyb20gJy4vbGlnaHRzL0xpZ2h0LmpzJztcclxuZXhwb3J0IHsgTGlnaHRQcm9iZSB9IGZyb20gJy4vbGlnaHRzL0xpZ2h0UHJvYmUuanMnO1xyXG5leHBvcnQgeyBTdGVyZW9DYW1lcmEgfSBmcm9tICcuL2NhbWVyYXMvU3RlcmVvQ2FtZXJhLmpzJztcclxuZXhwb3J0IHsgUGVyc3BlY3RpdmVDYW1lcmEgfSBmcm9tICcuL2NhbWVyYXMvUGVyc3BlY3RpdmVDYW1lcmEuanMnO1xyXG5leHBvcnQgeyBPcnRob2dyYXBoaWNDYW1lcmEgfSBmcm9tICcuL2NhbWVyYXMvT3J0aG9ncmFwaGljQ2FtZXJhLmpzJztcclxuZXhwb3J0IHsgQ3ViZUNhbWVyYSB9IGZyb20gJy4vY2FtZXJhcy9DdWJlQ2FtZXJhLmpzJztcclxuZXhwb3J0IHsgQXJyYXlDYW1lcmEgfSBmcm9tICcuL2NhbWVyYXMvQXJyYXlDYW1lcmEuanMnO1xyXG5leHBvcnQgeyBDYW1lcmEgfSBmcm9tICcuL2NhbWVyYXMvQ2FtZXJhLmpzJztcclxuZXhwb3J0IHsgQXVkaW9MaXN0ZW5lciB9IGZyb20gJy4vYXVkaW8vQXVkaW9MaXN0ZW5lci5qcyc7XHJcbmV4cG9ydCB7IFBvc2l0aW9uYWxBdWRpbyB9IGZyb20gJy4vYXVkaW8vUG9zaXRpb25hbEF1ZGlvLmpzJztcclxuZXhwb3J0IHsgQXVkaW9Db250ZXh0IH0gZnJvbSAnLi9hdWRpby9BdWRpb0NvbnRleHQuanMnO1xyXG5leHBvcnQgeyBBdWRpb0FuYWx5c2VyIH0gZnJvbSAnLi9hdWRpby9BdWRpb0FuYWx5c2VyLmpzJztcclxuZXhwb3J0IHsgQXVkaW8gfSBmcm9tICcuL2F1ZGlvL0F1ZGlvLmpzJztcclxuZXhwb3J0IHsgVmVjdG9yS2V5ZnJhbWVUcmFjayB9IGZyb20gJy4vYW5pbWF0aW9uL3RyYWNrcy9WZWN0b3JLZXlmcmFtZVRyYWNrLmpzJztcclxuZXhwb3J0IHsgU3RyaW5nS2V5ZnJhbWVUcmFjayB9IGZyb20gJy4vYW5pbWF0aW9uL3RyYWNrcy9TdHJpbmdLZXlmcmFtZVRyYWNrLmpzJztcclxuZXhwb3J0IHsgUXVhdGVybmlvbktleWZyYW1lVHJhY2sgfSBmcm9tICcuL2FuaW1hdGlvbi90cmFja3MvUXVhdGVybmlvbktleWZyYW1lVHJhY2suanMnO1xyXG5leHBvcnQgeyBOdW1iZXJLZXlmcmFtZVRyYWNrIH0gZnJvbSAnLi9hbmltYXRpb24vdHJhY2tzL051bWJlcktleWZyYW1lVHJhY2suanMnO1xyXG5leHBvcnQgeyBDb2xvcktleWZyYW1lVHJhY2sgfSBmcm9tICcuL2FuaW1hdGlvbi90cmFja3MvQ29sb3JLZXlmcmFtZVRyYWNrLmpzJztcclxuZXhwb3J0IHsgQm9vbGVhbktleWZyYW1lVHJhY2sgfSBmcm9tICcuL2FuaW1hdGlvbi90cmFja3MvQm9vbGVhbktleWZyYW1lVHJhY2suanMnO1xyXG5leHBvcnQgeyBQcm9wZXJ0eU1peGVyIH0gZnJvbSAnLi9hbmltYXRpb24vUHJvcGVydHlNaXhlci5qcyc7XHJcbmV4cG9ydCB7IFByb3BlcnR5QmluZGluZyB9IGZyb20gJy4vYW5pbWF0aW9uL1Byb3BlcnR5QmluZGluZy5qcyc7XHJcbmV4cG9ydCB7IEtleWZyYW1lVHJhY2sgfSBmcm9tICcuL2FuaW1hdGlvbi9LZXlmcmFtZVRyYWNrLmpzJztcclxuZXhwb3J0IHsgQW5pbWF0aW9uVXRpbHMgfSBmcm9tICcuL2FuaW1hdGlvbi9BbmltYXRpb25VdGlscy5qcyc7XHJcbmV4cG9ydCB7IEFuaW1hdGlvbk9iamVjdEdyb3VwIH0gZnJvbSAnLi9hbmltYXRpb24vQW5pbWF0aW9uT2JqZWN0R3JvdXAuanMnO1xyXG5leHBvcnQgeyBBbmltYXRpb25NaXhlciB9IGZyb20gJy4vYW5pbWF0aW9uL0FuaW1hdGlvbk1peGVyLmpzJztcclxuZXhwb3J0IHsgQW5pbWF0aW9uQ2xpcCB9IGZyb20gJy4vYW5pbWF0aW9uL0FuaW1hdGlvbkNsaXAuanMnO1xyXG5leHBvcnQgeyBBbmltYXRpb25BY3Rpb24gfSBmcm9tICcuL2FuaW1hdGlvbi9BbmltYXRpb25BY3Rpb24uanMnO1xyXG5leHBvcnQgeyBSZW5kZXJUYXJnZXQgfSBmcm9tICcuL2NvcmUvUmVuZGVyVGFyZ2V0LmpzJztcclxuZXhwb3J0IHsgUmVuZGVyVGFyZ2V0M0QgfSBmcm9tICcuL2NvcmUvUmVuZGVyVGFyZ2V0M0QuanMnO1xyXG5leHBvcnQgeyBSZW5kZXJUYXJnZXRBcnJheSB9IGZyb20gJy4vY29yZS9SZW5kZXJUYXJnZXRBcnJheS5qcyc7XHJcbmV4cG9ydCB7IFVuaWZvcm0gfSBmcm9tICcuL2NvcmUvVW5pZm9ybS5qcyc7XHJcbmV4cG9ydCB7IFVuaWZvcm1zR3JvdXAgfSBmcm9tICcuL2NvcmUvVW5pZm9ybXNHcm91cC5qcyc7XHJcbmV4cG9ydCB7IEluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi9jb3JlL0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5LmpzJztcclxuZXhwb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuL2NvcmUvQnVmZmVyR2VvbWV0cnkuanMnO1xyXG5leHBvcnQgeyBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4vY29yZS9JbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcbmV4cG9ydCB7IEluc3RhbmNlZEludGVybGVhdmVkQnVmZmVyIH0gZnJvbSAnLi9jb3JlL0luc3RhbmNlZEludGVybGVhdmVkQnVmZmVyLmpzJztcclxuZXhwb3J0IHsgSW50ZXJsZWF2ZWRCdWZmZXIgfSBmcm9tICcuL2NvcmUvSW50ZXJsZWF2ZWRCdWZmZXIuanMnO1xyXG5leHBvcnQgeyBJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuL2NvcmUvSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlLmpzJztcclxuZXhwb3J0IHsgR0xCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuL2NvcmUvR0xCdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2NvcmUvQnVmZmVyQXR0cmlidXRlLmpzJztcclxuZXhwb3J0IHsgT2JqZWN0M0QgfSBmcm9tICcuL2NvcmUvT2JqZWN0M0QuanMnO1xyXG5leHBvcnQgeyBSYXljYXN0ZXIgfSBmcm9tICcuL2NvcmUvUmF5Y2FzdGVyLmpzJztcclxuZXhwb3J0IHsgTGF5ZXJzIH0gZnJvbSAnLi9jb3JlL0xheWVycy5qcyc7XHJcbmV4cG9ydCB7IEV2ZW50RGlzcGF0Y2hlciB9IGZyb20gJy4vY29yZS9FdmVudERpc3BhdGNoZXIuanMnO1xyXG5leHBvcnQgeyBDbG9jayB9IGZyb20gJy4vY29yZS9DbG9jay5qcyc7XHJcbmV4cG9ydCB7IFF1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudCB9IGZyb20gJy4vbWF0aC9pbnRlcnBvbGFudHMvUXVhdGVybmlvbkxpbmVhckludGVycG9sYW50LmpzJztcclxuZXhwb3J0IHsgTGluZWFySW50ZXJwb2xhbnQgfSBmcm9tICcuL21hdGgvaW50ZXJwb2xhbnRzL0xpbmVhckludGVycG9sYW50LmpzJztcclxuZXhwb3J0IHsgRGlzY3JldGVJbnRlcnBvbGFudCB9IGZyb20gJy4vbWF0aC9pbnRlcnBvbGFudHMvRGlzY3JldGVJbnRlcnBvbGFudC5qcyc7XHJcbmV4cG9ydCB7IEN1YmljSW50ZXJwb2xhbnQgfSBmcm9tICcuL21hdGgvaW50ZXJwb2xhbnRzL0N1YmljSW50ZXJwb2xhbnQuanMnO1xyXG5leHBvcnQgeyBJbnRlcnBvbGFudCB9IGZyb20gJy4vbWF0aC9JbnRlcnBvbGFudC5qcyc7XHJcbmV4cG9ydCB7IFRyaWFuZ2xlIH0gZnJvbSAnLi9tYXRoL1RyaWFuZ2xlLmpzJztcclxuZXhwb3J0IHsgTWF0aFV0aWxzIH0gZnJvbSAnLi9tYXRoL01hdGhVdGlscy5qcyc7XHJcbmV4cG9ydCB7IFNwaGVyaWNhbCB9IGZyb20gJy4vbWF0aC9TcGhlcmljYWwuanMnO1xyXG5leHBvcnQgeyBDeWxpbmRyaWNhbCB9IGZyb20gJy4vbWF0aC9DeWxpbmRyaWNhbC5qcyc7XHJcbmV4cG9ydCB7IFBsYW5lIH0gZnJvbSAnLi9tYXRoL1BsYW5lLmpzJztcclxuZXhwb3J0IHsgRnJ1c3R1bSB9IGZyb20gJy4vbWF0aC9GcnVzdHVtLmpzJztcclxuZXhwb3J0IHsgU3BoZXJlIH0gZnJvbSAnLi9tYXRoL1NwaGVyZS5qcyc7XHJcbmV4cG9ydCB7IFJheSB9IGZyb20gJy4vbWF0aC9SYXkuanMnO1xyXG5leHBvcnQgeyBNYXRyaXg0IH0gZnJvbSAnLi9tYXRoL01hdHJpeDQuanMnO1xyXG5leHBvcnQgeyBNYXRyaXgzIH0gZnJvbSAnLi9tYXRoL01hdHJpeDMuanMnO1xyXG5leHBvcnQgeyBNYXRyaXgyIH0gZnJvbSAnLi9tYXRoL01hdHJpeDIuanMnO1xyXG5leHBvcnQgeyBCb3gzIH0gZnJvbSAnLi9tYXRoL0JveDMuanMnO1xyXG5leHBvcnQgeyBCb3gyIH0gZnJvbSAnLi9tYXRoL0JveDIuanMnO1xyXG5leHBvcnQgeyBMaW5lMyB9IGZyb20gJy4vbWF0aC9MaW5lMy5qcyc7XHJcbmV4cG9ydCB7IEV1bGVyIH0gZnJvbSAnLi9tYXRoL0V1bGVyLmpzJztcclxuZXhwb3J0IHsgVmVjdG9yNCB9IGZyb20gJy4vbWF0aC9WZWN0b3I0LmpzJztcclxuZXhwb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4vbWF0aC9WZWN0b3IzLmpzJztcclxuZXhwb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4vbWF0aC9WZWN0b3IyLmpzJztcclxuZXhwb3J0IHsgUXVhdGVybmlvbiB9IGZyb20gJy4vbWF0aC9RdWF0ZXJuaW9uLmpzJztcclxuZXhwb3J0IHsgQ29sb3IgfSBmcm9tICcuL21hdGgvQ29sb3IuanMnO1xyXG5leHBvcnQgeyBDb2xvck1hbmFnZW1lbnQgfSBmcm9tICcuL21hdGgvQ29sb3JNYW5hZ2VtZW50LmpzJztcclxuZXhwb3J0IHsgU3BoZXJpY2FsSGFybW9uaWNzMyB9IGZyb20gJy4vbWF0aC9TcGhlcmljYWxIYXJtb25pY3MzLmpzJztcclxuZXhwb3J0IHsgU3BvdExpZ2h0SGVscGVyIH0gZnJvbSAnLi9oZWxwZXJzL1Nwb3RMaWdodEhlbHBlci5qcyc7XHJcbmV4cG9ydCB7IFNrZWxldG9uSGVscGVyIH0gZnJvbSAnLi9oZWxwZXJzL1NrZWxldG9uSGVscGVyLmpzJztcclxuZXhwb3J0IHsgUG9pbnRMaWdodEhlbHBlciB9IGZyb20gJy4vaGVscGVycy9Qb2ludExpZ2h0SGVscGVyLmpzJztcclxuZXhwb3J0IHsgSGVtaXNwaGVyZUxpZ2h0SGVscGVyIH0gZnJvbSAnLi9oZWxwZXJzL0hlbWlzcGhlcmVMaWdodEhlbHBlci5qcyc7XHJcbmV4cG9ydCB7IEdyaWRIZWxwZXIgfSBmcm9tICcuL2hlbHBlcnMvR3JpZEhlbHBlci5qcyc7XHJcbmV4cG9ydCB7IFBvbGFyR3JpZEhlbHBlciB9IGZyb20gJy4vaGVscGVycy9Qb2xhckdyaWRIZWxwZXIuanMnO1xyXG5leHBvcnQgeyBEaXJlY3Rpb25hbExpZ2h0SGVscGVyIH0gZnJvbSAnLi9oZWxwZXJzL0RpcmVjdGlvbmFsTGlnaHRIZWxwZXIuanMnO1xyXG5leHBvcnQgeyBDYW1lcmFIZWxwZXIgfSBmcm9tICcuL2hlbHBlcnMvQ2FtZXJhSGVscGVyLmpzJztcclxuZXhwb3J0IHsgQm94SGVscGVyIH0gZnJvbSAnLi9oZWxwZXJzL0JveEhlbHBlci5qcyc7XHJcbmV4cG9ydCB7IEJveDNIZWxwZXIgfSBmcm9tICcuL2hlbHBlcnMvQm94M0hlbHBlci5qcyc7XHJcbmV4cG9ydCB7IFBsYW5lSGVscGVyIH0gZnJvbSAnLi9oZWxwZXJzL1BsYW5lSGVscGVyLmpzJztcclxuZXhwb3J0IHsgQXJyb3dIZWxwZXIgfSBmcm9tICcuL2hlbHBlcnMvQXJyb3dIZWxwZXIuanMnO1xyXG5leHBvcnQgeyBBeGVzSGVscGVyIH0gZnJvbSAnLi9oZWxwZXJzL0F4ZXNIZWxwZXIuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2V4dHJhcy9jdXJ2ZXMvQ3VydmVzLmpzJztcclxuZXhwb3J0IHsgU2hhcGUgfSBmcm9tICcuL2V4dHJhcy9jb3JlL1NoYXBlLmpzJztcclxuZXhwb3J0IHsgUGF0aCB9IGZyb20gJy4vZXh0cmFzL2NvcmUvUGF0aC5qcyc7XHJcbmV4cG9ydCB7IFNoYXBlUGF0aCB9IGZyb20gJy4vZXh0cmFzL2NvcmUvU2hhcGVQYXRoLmpzJztcclxuZXhwb3J0IHsgQ3VydmVQYXRoIH0gZnJvbSAnLi9leHRyYXMvY29yZS9DdXJ2ZVBhdGguanMnO1xyXG5leHBvcnQgeyBDdXJ2ZSB9IGZyb20gJy4vZXh0cmFzL2NvcmUvQ3VydmUuanMnO1xyXG5leHBvcnQgeyBDb250cm9scyB9IGZyb20gJy4vZXh0cmFzL0NvbnRyb2xzLmpzJztcclxuZXhwb3J0IHsgRGF0YVV0aWxzIH0gZnJvbSAnLi9leHRyYXMvRGF0YVV0aWxzLmpzJztcclxuZXhwb3J0IHsgSW1hZ2VVdGlscyB9IGZyb20gJy4vZXh0cmFzL0ltYWdlVXRpbHMuanMnO1xyXG5leHBvcnQgeyBTaGFwZVV0aWxzIH0gZnJvbSAnLi9leHRyYXMvU2hhcGVVdGlscy5qcyc7XHJcbmV4cG9ydCB7IFRleHR1cmVVdGlscyB9IGZyb20gJy4vZXh0cmFzL1RleHR1cmVVdGlscy5qcyc7XHJcbmV4cG9ydCB7IGNyZWF0ZUNhbnZhc0VsZW1lbnQgfSBmcm9tICcuL3V0aWxzLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi9jb25zdGFudHMuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL1RocmVlLkxlZ2FjeS5qcyc7XHJcblxyXG5pZiAoIHR5cGVvZiBfX1RIUkVFX0RFVlRPT0xTX18gIT09ICd1bmRlZmluZWQnICkge1xyXG5cclxuXHRfX1RIUkVFX0RFVlRPT0xTX18uZGlzcGF0Y2hFdmVudCggbmV3IEN1c3RvbUV2ZW50KCAncmVnaXN0ZXInLCB7IGRldGFpbDoge1xyXG5cdFx0cmV2aXNpb246IFJFVklTSU9OLFxyXG5cdH0gfSApICk7XHJcblxyXG59XHJcblxyXG5pZiAoIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICkge1xyXG5cclxuXHRpZiAoIHdpbmRvdy5fX1RIUkVFX18gKSB7XHJcblxyXG5cdFx0Y29uc29sZS53YXJuKCAnV0FSTklORzogTXVsdGlwbGUgaW5zdGFuY2VzIG9mIFRocmVlLmpzIGJlaW5nIGltcG9ydGVkLicgKTtcclxuXHJcblx0fSBlbHNlIHtcclxuXHJcblx0XHR3aW5kb3cuX19USFJFRV9fID0gUkVWSVNJT047XHJcblxyXG5cdH1cclxuXHJcbn1cclxuIl0sIm5hbWVzIjpbIlJFVklTSU9OIiwiTU9VU0UiLCJMRUZUIiwiTUlERExFIiwiUklHSFQiLCJST1RBVEUiLCJET0xMWSIsIlBBTiIsIlRPVUNIIiwiRE9MTFlfUEFOIiwiRE9MTFlfUk9UQVRFIiwiQ3VsbEZhY2VOb25lIiwiQ3VsbEZhY2VCYWNrIiwiQ3VsbEZhY2VGcm9udCIsIkN1bGxGYWNlRnJvbnRCYWNrIiwiQmFzaWNTaGFkb3dNYXAiLCJQQ0ZTaGFkb3dNYXAiLCJQQ0ZTb2Z0U2hhZG93TWFwIiwiVlNNU2hhZG93TWFwIiwiRnJvbnRTaWRlIiwiQmFja1NpZGUiLCJEb3VibGVTaWRlIiwiTm9CbGVuZGluZyIsIk5vcm1hbEJsZW5kaW5nIiwiQWRkaXRpdmVCbGVuZGluZyIsIlN1YnRyYWN0aXZlQmxlbmRpbmciLCJNdWx0aXBseUJsZW5kaW5nIiwiQ3VzdG9tQmxlbmRpbmciLCJBZGRFcXVhdGlvbiIsIlN1YnRyYWN0RXF1YXRpb24iLCJSZXZlcnNlU3VidHJhY3RFcXVhdGlvbiIsIk1pbkVxdWF0aW9uIiwiTWF4RXF1YXRpb24iLCJaZXJvRmFjdG9yIiwiT25lRmFjdG9yIiwiU3JjQ29sb3JGYWN0b3IiLCJPbmVNaW51c1NyY0NvbG9yRmFjdG9yIiwiU3JjQWxwaGFGYWN0b3IiLCJPbmVNaW51c1NyY0FscGhhRmFjdG9yIiwiRHN0QWxwaGFGYWN0b3IiLCJPbmVNaW51c0RzdEFscGhhRmFjdG9yIiwiRHN0Q29sb3JGYWN0b3IiLCJPbmVNaW51c0RzdENvbG9yRmFjdG9yIiwiU3JjQWxwaGFTYXR1cmF0ZUZhY3RvciIsIkNvbnN0YW50Q29sb3JGYWN0b3IiLCJPbmVNaW51c0NvbnN0YW50Q29sb3JGYWN0b3IiLCJDb25zdGFudEFscGhhRmFjdG9yIiwiT25lTWludXNDb25zdGFudEFscGhhRmFjdG9yIiwiTmV2ZXJEZXB0aCIsIkFsd2F5c0RlcHRoIiwiTGVzc0RlcHRoIiwiTGVzc0VxdWFsRGVwdGgiLCJFcXVhbERlcHRoIiwiR3JlYXRlckVxdWFsRGVwdGgiLCJHcmVhdGVyRGVwdGgiLCJOb3RFcXVhbERlcHRoIiwiTXVsdGlwbHlPcGVyYXRpb24iLCJNaXhPcGVyYXRpb24iLCJBZGRPcGVyYXRpb24iLCJOb1RvbmVNYXBwaW5nIiwiTGluZWFyVG9uZU1hcHBpbmciLCJSZWluaGFyZFRvbmVNYXBwaW5nIiwiQ2luZW9uVG9uZU1hcHBpbmciLCJBQ0VTRmlsbWljVG9uZU1hcHBpbmciLCJDdXN0b21Ub25lTWFwcGluZyIsIkFnWFRvbmVNYXBwaW5nIiwiTmV1dHJhbFRvbmVNYXBwaW5nIiwiQXR0YWNoZWRCaW5kTW9kZSIsIkRldGFjaGVkQmluZE1vZGUiLCJVVk1hcHBpbmciLCJDdWJlUmVmbGVjdGlvbk1hcHBpbmciLCJDdWJlUmVmcmFjdGlvbk1hcHBpbmciLCJFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZyIsIkVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nIiwiQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmciLCJSZXBlYXRXcmFwcGluZyIsIkNsYW1wVG9FZGdlV3JhcHBpbmciLCJNaXJyb3JlZFJlcGVhdFdyYXBwaW5nIiwiTmVhcmVzdEZpbHRlciIsIk5lYXJlc3RNaXBtYXBOZWFyZXN0RmlsdGVyIiwiTmVhcmVzdE1pcE1hcE5lYXJlc3RGaWx0ZXIiLCJOZWFyZXN0TWlwbWFwTGluZWFyRmlsdGVyIiwiTmVhcmVzdE1pcE1hcExpbmVhckZpbHRlciIsIkxpbmVhckZpbHRlciIsIkxpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXIiLCJMaW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyIiwiTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyIiwiTGluZWFyTWlwTWFwTGluZWFyRmlsdGVyIiwiVW5zaWduZWRCeXRlVHlwZSIsIkJ5dGVUeXBlIiwiU2hvcnRUeXBlIiwiVW5zaWduZWRTaG9ydFR5cGUiLCJJbnRUeXBlIiwiVW5zaWduZWRJbnRUeXBlIiwiRmxvYXRUeXBlIiwiSGFsZkZsb2F0VHlwZSIsIlVuc2lnbmVkU2hvcnQ0NDQ0VHlwZSIsIlVuc2lnbmVkU2hvcnQ1NTUxVHlwZSIsIlVuc2lnbmVkSW50MjQ4VHlwZSIsIlVuc2lnbmVkSW50NTk5OVR5cGUiLCJBbHBoYUZvcm1hdCIsIlJHQkZvcm1hdCIsIlJHQkFGb3JtYXQiLCJMdW1pbmFuY2VGb3JtYXQiLCJMdW1pbmFuY2VBbHBoYUZvcm1hdCIsIkRlcHRoRm9ybWF0IiwiRGVwdGhTdGVuY2lsRm9ybWF0IiwiUmVkRm9ybWF0IiwiUmVkSW50ZWdlckZvcm1hdCIsIlJHRm9ybWF0IiwiUkdJbnRlZ2VyRm9ybWF0IiwiUkdCSW50ZWdlckZvcm1hdCIsIlJHQkFJbnRlZ2VyRm9ybWF0IiwiUkdCX1MzVENfRFhUMV9Gb3JtYXQiLCJSR0JBX1MzVENfRFhUMV9Gb3JtYXQiLCJSR0JBX1MzVENfRFhUM19Gb3JtYXQiLCJSR0JBX1MzVENfRFhUNV9Gb3JtYXQiLCJSR0JfUFZSVENfNEJQUFYxX0Zvcm1hdCIsIlJHQl9QVlJUQ18yQlBQVjFfRm9ybWF0IiwiUkdCQV9QVlJUQ180QlBQVjFfRm9ybWF0IiwiUkdCQV9QVlJUQ18yQlBQVjFfRm9ybWF0IiwiUkdCX0VUQzFfRm9ybWF0IiwiUkdCX0VUQzJfRm9ybWF0IiwiUkdCQV9FVEMyX0VBQ19Gb3JtYXQiLCJSR0JBX0FTVENfNHg0X0Zvcm1hdCIsIlJHQkFfQVNUQ181eDRfRm9ybWF0IiwiUkdCQV9BU1RDXzV4NV9Gb3JtYXQiLCJSR0JBX0FTVENfNng1X0Zvcm1hdCIsIlJHQkFfQVNUQ182eDZfRm9ybWF0IiwiUkdCQV9BU1RDXzh4NV9Gb3JtYXQiLCJSR0JBX0FTVENfOHg2X0Zvcm1hdCIsIlJHQkFfQVNUQ184eDhfRm9ybWF0IiwiUkdCQV9BU1RDXzEweDVfRm9ybWF0IiwiUkdCQV9BU1RDXzEweDZfRm9ybWF0IiwiUkdCQV9BU1RDXzEweDhfRm9ybWF0IiwiUkdCQV9BU1RDXzEweDEwX0Zvcm1hdCIsIlJHQkFfQVNUQ18xMngxMF9Gb3JtYXQiLCJSR0JBX0FTVENfMTJ4MTJfRm9ybWF0IiwiUkdCQV9CUFRDX0Zvcm1hdCIsIlJHQl9CUFRDX1NJR05FRF9Gb3JtYXQiLCJSR0JfQlBUQ19VTlNJR05FRF9Gb3JtYXQiLCJSRURfUkdUQzFfRm9ybWF0IiwiU0lHTkVEX1JFRF9SR1RDMV9Gb3JtYXQiLCJSRURfR1JFRU5fUkdUQzJfRm9ybWF0IiwiU0lHTkVEX1JFRF9HUkVFTl9SR1RDMl9Gb3JtYXQiLCJMb29wT25jZSIsIkxvb3BSZXBlYXQiLCJMb29wUGluZ1BvbmciLCJJbnRlcnBvbGF0ZURpc2NyZXRlIiwiSW50ZXJwb2xhdGVMaW5lYXIiLCJJbnRlcnBvbGF0ZVNtb290aCIsIlplcm9DdXJ2YXR1cmVFbmRpbmciLCJaZXJvU2xvcGVFbmRpbmciLCJXcmFwQXJvdW5kRW5kaW5nIiwiTm9ybWFsQW5pbWF0aW9uQmxlbmRNb2RlIiwiQWRkaXRpdmVBbmltYXRpb25CbGVuZE1vZGUiLCJUcmlhbmdsZXNEcmF3TW9kZSIsIlRyaWFuZ2xlU3RyaXBEcmF3TW9kZSIsIlRyaWFuZ2xlRmFuRHJhd01vZGUiLCJCYXNpY0RlcHRoUGFja2luZyIsIlJHQkFEZXB0aFBhY2tpbmciLCJSR0JEZXB0aFBhY2tpbmciLCJSR0RlcHRoUGFja2luZyIsIlRhbmdlbnRTcGFjZU5vcm1hbE1hcCIsIk9iamVjdFNwYWNlTm9ybWFsTWFwIiwiTm9Db2xvclNwYWNlIiwiU1JHQkNvbG9yU3BhY2UiLCJMaW5lYXJTUkdCQ29sb3JTcGFjZSIsIkxpbmVhclRyYW5zZmVyIiwiU1JHQlRyYW5zZmVyIiwiWmVyb1N0ZW5jaWxPcCIsIktlZXBTdGVuY2lsT3AiLCJSZXBsYWNlU3RlbmNpbE9wIiwiSW5jcmVtZW50U3RlbmNpbE9wIiwiRGVjcmVtZW50U3RlbmNpbE9wIiwiSW5jcmVtZW50V3JhcFN0ZW5jaWxPcCIsIkRlY3JlbWVudFdyYXBTdGVuY2lsT3AiLCJJbnZlcnRTdGVuY2lsT3AiLCJOZXZlclN0ZW5jaWxGdW5jIiwiTGVzc1N0ZW5jaWxGdW5jIiwiRXF1YWxTdGVuY2lsRnVuYyIsIkxlc3NFcXVhbFN0ZW5jaWxGdW5jIiwiR3JlYXRlclN0ZW5jaWxGdW5jIiwiTm90RXF1YWxTdGVuY2lsRnVuYyIsIkdyZWF0ZXJFcXVhbFN0ZW5jaWxGdW5jIiwiQWx3YXlzU3RlbmNpbEZ1bmMiLCJOZXZlckNvbXBhcmUiLCJMZXNzQ29tcGFyZSIsIkVxdWFsQ29tcGFyZSIsIkxlc3NFcXVhbENvbXBhcmUiLCJHcmVhdGVyQ29tcGFyZSIsIk5vdEVxdWFsQ29tcGFyZSIsIkdyZWF0ZXJFcXVhbENvbXBhcmUiLCJBbHdheXNDb21wYXJlIiwiU3RhdGljRHJhd1VzYWdlIiwiRHluYW1pY0RyYXdVc2FnZSIsIlN0cmVhbURyYXdVc2FnZSIsIlN0YXRpY1JlYWRVc2FnZSIsIkR5bmFtaWNSZWFkVXNhZ2UiLCJTdHJlYW1SZWFkVXNhZ2UiLCJTdGF0aWNDb3B5VXNhZ2UiLCJEeW5hbWljQ29weVVzYWdlIiwiU3RyZWFtQ29weVVzYWdlIiwiR0xTTDEiLCJHTFNMMyIsIldlYkdMQ29vcmRpbmF0ZVN5c3RlbSIsIldlYkdQVUNvb3JkaW5hdGVTeXN0ZW0iLCJUaW1lc3RhbXBRdWVyeSIsIkNPTVBVVEUiLCJSRU5ERVIiLCJFdmVudERpc3BhdGNoZXIiLCJhZGRFdmVudExpc3RlbmVyIiwidHlwZSIsImxpc3RlbmVyIiwidW5kZWZpbmVkIiwidGhpcyIsIl9saXN0ZW5lcnMiLCJsaXN0ZW5lcnMiLCJpbmRleE9mIiwicHVzaCIsImhhc0V2ZW50TGlzdGVuZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwibGlzdGVuZXJBcnJheSIsImluZGV4Iiwic3BsaWNlIiwiZGlzcGF0Y2hFdmVudCIsImV2ZW50IiwidGFyZ2V0IiwiYXJyYXkiLCJzbGljZSIsImkiLCJsIiwibGVuZ3RoIiwiY2FsbCIsIl9sdXQiLCJfc2VlZCIsIkRFRzJSQUQiLCJNYXRoIiwiUEkiLCJSQUQyREVHIiwiZ2VuZXJhdGVVVUlEIiwiZDAiLCJyYW5kb20iLCJkMSIsImQyIiwiZDMiLCJ0b0xvd2VyQ2FzZSIsImNsYW1wIiwidmFsdWUiLCJtaW4iLCJtYXgiLCJldWNsaWRlYW5Nb2R1bG8iLCJuIiwibSIsImxlcnAiLCJ4IiwieSIsInQiLCJkZW5vcm1hbGl6ZSIsImNvbnN0cnVjdG9yIiwiRmxvYXQzMkFycmF5IiwiVWludDMyQXJyYXkiLCJVaW50MTZBcnJheSIsIlVpbnQ4QXJyYXkiLCJJbnQzMkFycmF5IiwiSW50MTZBcnJheSIsIkludDhBcnJheSIsIkVycm9yIiwibm9ybWFsaXplIiwicm91bmQiLCJNYXRoVXRpbHMiLCJtYXBMaW5lYXIiLCJhMSIsImEyIiwiYjEiLCJiMiIsImludmVyc2VMZXJwIiwiZGFtcCIsImxhbWJkYSIsImR0IiwiZXhwIiwicGluZ3BvbmciLCJhYnMiLCJzbW9vdGhzdGVwIiwic21vb3RoZXJzdGVwIiwicmFuZEludCIsImxvdyIsImhpZ2giLCJmbG9vciIsInJhbmRGbG9hdCIsInJhbmRGbG9hdFNwcmVhZCIsInJhbmdlIiwic2VlZGVkUmFuZG9tIiwicyIsImltdWwiLCJkZWdUb1JhZCIsImRlZ3JlZXMiLCJyYWRUb0RlZyIsInJhZGlhbnMiLCJpc1Bvd2VyT2ZUd28iLCJjZWlsUG93ZXJPZlR3byIsInBvdyIsImNlaWwiLCJsb2ciLCJMTjIiLCJmbG9vclBvd2VyT2ZUd28iLCJzZXRRdWF0ZXJuaW9uRnJvbVByb3BlckV1bGVyIiwicSIsImEiLCJiIiwiYyIsIm9yZGVyIiwiY29zIiwic2luIiwiYzIiLCJzMiIsImMxMyIsInMxMyIsImMxXzMiLCJzMV8zIiwiYzNfMSIsInMzXzEiLCJzZXQiLCJjb25zb2xlIiwid2FybiIsIlZlY3RvcjIiLCJwcm90b3R5cGUiLCJpc1ZlY3RvcjIiLCJ3aWR0aCIsImhlaWdodCIsInNldFNjYWxhciIsInNjYWxhciIsInNldFgiLCJzZXRZIiwic2V0Q29tcG9uZW50IiwiZ2V0Q29tcG9uZW50IiwiY2xvbmUiLCJjb3B5IiwidiIsImFkZCIsImFkZFNjYWxhciIsImFkZFZlY3RvcnMiLCJhZGRTY2FsZWRWZWN0b3IiLCJzdWIiLCJzdWJTY2FsYXIiLCJzdWJWZWN0b3JzIiwibXVsdGlwbHkiLCJtdWx0aXBseVNjYWxhciIsImRpdmlkZSIsImRpdmlkZVNjYWxhciIsImFwcGx5TWF0cml4MyIsImUiLCJlbGVtZW50cyIsImNsYW1wU2NhbGFyIiwibWluVmFsIiwibWF4VmFsIiwiY2xhbXBMZW5ndGgiLCJyb3VuZFRvWmVybyIsInRydW5jIiwibmVnYXRlIiwiZG90IiwiY3Jvc3MiLCJsZW5ndGhTcSIsInNxcnQiLCJtYW5oYXR0YW5MZW5ndGgiLCJhbmdsZSIsImF0YW4yIiwiYW5nbGVUbyIsImRlbm9taW5hdG9yIiwidGhldGEiLCJhY29zIiwiZGlzdGFuY2VUbyIsImRpc3RhbmNlVG9TcXVhcmVkIiwiZHgiLCJkeSIsIm1hbmhhdHRhbkRpc3RhbmNlVG8iLCJzZXRMZW5ndGgiLCJhbHBoYSIsImxlcnBWZWN0b3JzIiwidjEiLCJ2MiIsImVxdWFscyIsImZyb21BcnJheSIsIm9mZnNldCIsInRvQXJyYXkiLCJmcm9tQnVmZmVyQXR0cmlidXRlIiwiYXR0cmlidXRlIiwiZ2V0WCIsImdldFkiLCJyb3RhdGVBcm91bmQiLCJjZW50ZXIiLCJTeW1ib2wiLCJpdGVyYXRvciIsIk1hdHJpeDMiLCJuMTEiLCJuMTIiLCJuMTMiLCJuMjEiLCJuMjIiLCJuMjMiLCJuMzEiLCJuMzIiLCJuMzMiLCJpc01hdHJpeDMiLCJ0ZSIsImlkZW50aXR5IiwibWUiLCJleHRyYWN0QmFzaXMiLCJ4QXhpcyIsInlBeGlzIiwiekF4aXMiLCJzZXRGcm9tTWF0cml4M0NvbHVtbiIsInNldEZyb21NYXRyaXg0IiwibXVsdGlwbHlNYXRyaWNlcyIsInByZW11bHRpcGx5IiwiYWUiLCJiZSIsImExMSIsImExMiIsImExMyIsImEyMSIsImEyMiIsImEyMyIsImEzMSIsImEzMiIsImEzMyIsImIxMSIsImIxMiIsImIxMyIsImIyMSIsImIyMiIsImIyMyIsImIzMSIsImIzMiIsImIzMyIsImRldGVybWluYW50IiwiZCIsImYiLCJnIiwiaCIsImludmVydCIsInQxMSIsInQxMiIsInQxMyIsImRldCIsImRldEludiIsInRyYW5zcG9zZSIsInRtcCIsImdldE5vcm1hbE1hdHJpeCIsIm1hdHJpeDQiLCJ0cmFuc3Bvc2VJbnRvQXJyYXkiLCJyIiwic2V0VXZUcmFuc2Zvcm0iLCJ0eCIsInR5Iiwic3giLCJzeSIsInJvdGF0aW9uIiwiY3giLCJjeSIsInNjYWxlIiwiX20zIiwibWFrZVNjYWxlIiwicm90YXRlIiwibWFrZVJvdGF0aW9uIiwidHJhbnNsYXRlIiwibWFrZVRyYW5zbGF0aW9uIiwibWF0cml4IiwiYXJyYXlOZWVkc1VpbnQzMiIsIlRZUEVEX0FSUkFZUyIsIlVpbnQ4Q2xhbXBlZEFycmF5IiwiRmxvYXQ2NEFycmF5IiwiZ2V0VHlwZWRBcnJheSIsImJ1ZmZlciIsImNyZWF0ZUVsZW1lbnROUyIsIm5hbWUiLCJkb2N1bWVudCIsImNyZWF0ZUNhbnZhc0VsZW1lbnQiLCJjYW52YXMiLCJzdHlsZSIsImRpc3BsYXkiLCJfY2FjaGUiLCJ3YXJuT25jZSIsIm1lc3NhZ2UiLCJwcm9iZUFzeW5jIiwiZ2wiLCJzeW5jIiwiaW50ZXJ2YWwiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInNldFRpbWVvdXQiLCJwcm9iZSIsImNsaWVudFdhaXRTeW5jIiwiU1lOQ19GTFVTSF9DT01NQU5EU19CSVQiLCJXQUlUX0ZBSUxFRCIsIlRJTUVPVVRfRVhQSVJFRCIsInRvTm9ybWFsaXplZFByb2plY3Rpb25NYXRyaXgiLCJwcm9qZWN0aW9uTWF0cml4IiwidG9SZXZlcnNlZFByb2plY3Rpb25NYXRyaXgiLCJMSU5FQVJfUkVDNzA5X1RPX1hZWiIsIlhZWl9UT19MSU5FQVJfUkVDNzA5IiwiY3JlYXRlQ29sb3JNYW5hZ2VtZW50IiwiQ29sb3JNYW5hZ2VtZW50IiwiZW5hYmxlZCIsIndvcmtpbmdDb2xvclNwYWNlIiwic3BhY2VzIiwiY29udmVydCIsImNvbG9yIiwic291cmNlQ29sb3JTcGFjZSIsInRhcmdldENvbG9yU3BhY2UiLCJ0cmFuc2ZlciIsIlNSR0JUb0xpbmVhciIsInByaW1hcmllcyIsInRvWFlaIiwiZnJvbVhZWiIsIkxpbmVhclRvU1JHQiIsImZyb21Xb3JraW5nQ29sb3JTcGFjZSIsInRvV29ya2luZ0NvbG9yU3BhY2UiLCJnZXRQcmltYXJpZXMiLCJjb2xvclNwYWNlIiwiZ2V0VHJhbnNmZXIiLCJnZXRMdW1pbmFuY2VDb2VmZmljaWVudHMiLCJsdW1pbmFuY2VDb2VmZmljaWVudHMiLCJkZWZpbmUiLCJjb2xvclNwYWNlcyIsIk9iamVjdCIsImFzc2lnbiIsIl9nZXRNYXRyaXgiLCJ0YXJnZXRNYXRyaXgiLCJfZ2V0RHJhd2luZ0J1ZmZlckNvbG9yU3BhY2UiLCJvdXRwdXRDb2xvclNwYWNlQ29uZmlnIiwiZHJhd2luZ0J1ZmZlckNvbG9yU3BhY2UiLCJfZ2V0VW5wYWNrQ29sb3JTcGFjZSIsIndvcmtpbmdDb2xvclNwYWNlQ29uZmlnIiwidW5wYWNrQ29sb3JTcGFjZSIsIlJFQzcwOV9QUklNQVJJRVMiLCJSRUM3MDlfTFVNSU5BTkNFX0NPRUZGSUNJRU5UUyIsIkQ2NSIsIndoaXRlUG9pbnQiLCJfY2FudmFzIiwiSW1hZ2VVdGlscyIsImdldERhdGFVUkwiLCJpbWFnZSIsInRlc3QiLCJzcmMiLCJIVE1MQ2FudmFzRWxlbWVudCIsImNvbnRleHQiLCJnZXRDb250ZXh0IiwiSW1hZ2VEYXRhIiwicHV0SW1hZ2VEYXRhIiwiZHJhd0ltYWdlIiwidG9EYXRhVVJMIiwic1JHQlRvTGluZWFyIiwiSFRNTEltYWdlRWxlbWVudCIsIkltYWdlQml0bWFwIiwiaW1hZ2VEYXRhIiwiZ2V0SW1hZ2VEYXRhIiwiZGF0YSIsIl9zb3VyY2VJZCIsIlNvdXJjZSIsImlzU291cmNlIiwiZGVmaW5lUHJvcGVydHkiLCJ1dWlkIiwiZGF0YVJlYWR5IiwidmVyc2lvbiIsIm5lZWRzVXBkYXRlIiwidG9KU09OIiwibWV0YSIsImlzUm9vdE9iamVjdCIsImltYWdlcyIsIm91dHB1dCIsInVybCIsIkFycmF5IiwiaXNBcnJheSIsImlzRGF0YVRleHR1cmUiLCJzZXJpYWxpemVJbWFnZSIsImZyb20iLCJfdGV4dHVyZUlkIiwiVGV4dHVyZSIsIkRFRkFVTFRfSU1BR0UiLCJtYXBwaW5nIiwiREVGQVVMVF9NQVBQSU5HIiwid3JhcFMiLCJ3cmFwVCIsIm1hZ0ZpbHRlciIsIm1pbkZpbHRlciIsImZvcm1hdCIsImFuaXNvdHJvcHkiLCJERUZBVUxUX0FOSVNPVFJPUFkiLCJzdXBlciIsImlzVGV4dHVyZSIsInNvdXJjZSIsIm1pcG1hcHMiLCJjaGFubmVsIiwiaW50ZXJuYWxGb3JtYXQiLCJyZXBlYXQiLCJtYXRyaXhBdXRvVXBkYXRlIiwiZ2VuZXJhdGVNaXBtYXBzIiwicHJlbXVsdGlwbHlBbHBoYSIsImZsaXBZIiwidW5wYWNrQWxpZ25tZW50IiwidXNlckRhdGEiLCJvblVwZGF0ZSIsInJlbmRlclRhcmdldCIsImlzUmVuZGVyVGFyZ2V0VGV4dHVyZSIsInBtcmVtVmVyc2lvbiIsInVwZGF0ZU1hdHJpeCIsIkpTT04iLCJwYXJzZSIsInN0cmluZ2lmeSIsInRleHR1cmVzIiwibWV0YWRhdGEiLCJnZW5lcmF0b3IiLCJ3cmFwIiwia2V5cyIsImRpc3Bvc2UiLCJ0cmFuc2Zvcm1VdiIsInV2IiwibmVlZHNQTVJFTVVwZGF0ZSIsIlZlY3RvcjQiLCJ6IiwidyIsImlzVmVjdG9yNCIsInNldFoiLCJzZXRXIiwiYXBwbHlNYXRyaXg0Iiwic2V0QXhpc0FuZ2xlRnJvbVF1YXRlcm5pb24iLCJzZXRBeGlzQW5nbGVGcm9tUm90YXRpb25NYXRyaXgiLCJlcHNpbG9uIiwiZXBzaWxvbjIiLCJtMTEiLCJtMTIiLCJtMTMiLCJtMjEiLCJtMjIiLCJtMjMiLCJtMzEiLCJtMzIiLCJtMzMiLCJ4eCIsInl5IiwienoiLCJ4eSIsInh6IiwieXoiLCJzZXRGcm9tTWF0cml4UG9zaXRpb24iLCJnZXRaIiwiZ2V0VyIsIlJlbmRlclRhcmdldCIsIm9wdGlvbnMiLCJpc1JlbmRlclRhcmdldCIsImRlcHRoIiwic2Npc3NvciIsInNjaXNzb3JUZXN0Iiwidmlld3BvcnQiLCJkZXB0aEJ1ZmZlciIsInN0ZW5jaWxCdWZmZXIiLCJyZXNvbHZlRGVwdGhCdWZmZXIiLCJyZXNvbHZlU3RlbmNpbEJ1ZmZlciIsImRlcHRoVGV4dHVyZSIsInNhbXBsZXMiLCJjb3VudCIsInRleHR1cmUiLCJfZGVwdGhUZXh0dXJlIiwiY3VycmVudCIsInNldFNpemUiLCJpbCIsIldlYkdMUmVuZGVyVGFyZ2V0IiwiaXNXZWJHTFJlbmRlclRhcmdldCIsIkRhdGFBcnJheVRleHR1cmUiLCJpc0RhdGFBcnJheVRleHR1cmUiLCJ3cmFwUiIsImxheWVyVXBkYXRlcyIsIlNldCIsImFkZExheWVyVXBkYXRlIiwibGF5ZXJJbmRleCIsImNsZWFyTGF5ZXJVcGRhdGVzIiwiY2xlYXIiLCJXZWJHTEFycmF5UmVuZGVyVGFyZ2V0IiwiaXNXZWJHTEFycmF5UmVuZGVyVGFyZ2V0IiwiRGF0YTNEVGV4dHVyZSIsImlzRGF0YTNEVGV4dHVyZSIsIldlYkdMM0RSZW5kZXJUYXJnZXQiLCJpc1dlYkdMM0RSZW5kZXJUYXJnZXQiLCJRdWF0ZXJuaW9uIiwiaXNRdWF0ZXJuaW9uIiwiX3giLCJfeSIsIl96IiwiX3ciLCJzbGVycEZsYXQiLCJkc3QiLCJkc3RPZmZzZXQiLCJzcmMwIiwic3JjT2Zmc2V0MCIsInNyYzEiLCJzcmNPZmZzZXQxIiwieDAiLCJ5MCIsInowIiwidzAiLCJ4MSIsInkxIiwiejEiLCJ3MSIsImRpciIsInNxclNpbiIsIk51bWJlciIsIkVQU0lMT04iLCJsZW4iLCJ0RGlyIiwibXVsdGlwbHlRdWF0ZXJuaW9uc0ZsYXQiLCJfb25DaGFuZ2VDYWxsYmFjayIsInF1YXRlcm5pb24iLCJzZXRGcm9tRXVsZXIiLCJldWxlciIsInVwZGF0ZSIsIl9vcmRlciIsImMxIiwiYzMiLCJzMSIsInMzIiwic2V0RnJvbUF4aXNBbmdsZSIsImF4aXMiLCJoYWxmQW5nbGUiLCJzZXRGcm9tUm90YXRpb25NYXRyaXgiLCJ0cmFjZSIsInNldEZyb21Vbml0VmVjdG9ycyIsInZGcm9tIiwidlRvIiwicm90YXRlVG93YXJkcyIsInN0ZXAiLCJzbGVycCIsImNvbmp1Z2F0ZSIsIm11bHRpcGx5UXVhdGVybmlvbnMiLCJxYXgiLCJxYXkiLCJxYXoiLCJxYXciLCJxYngiLCJxYnkiLCJxYnoiLCJxYnciLCJxYiIsImNvc0hhbGZUaGV0YSIsInNxclNpbkhhbGZUaGV0YSIsInNpbkhhbGZUaGV0YSIsImhhbGZUaGV0YSIsInJhdGlvQSIsInJhdGlvQiIsInNsZXJwUXVhdGVybmlvbnMiLCJxYSIsInRoZXRhMSIsInRoZXRhMiIsInIxIiwicjIiLCJfb25DaGFuZ2UiLCJjYWxsYmFjayIsIlZlY3RvcjMiLCJpc1ZlY3RvcjMiLCJtdWx0aXBseVZlY3RvcnMiLCJhcHBseUV1bGVyIiwiYXBwbHlRdWF0ZXJuaW9uIiwiX3F1YXRlcm5pb24kNCIsImFwcGx5QXhpc0FuZ2xlIiwiYXBwbHlOb3JtYWxNYXRyaXgiLCJ2eCIsInZ5IiwidnoiLCJxeCIsInF5IiwicXoiLCJxdyIsInR6IiwicHJvamVjdCIsImNhbWVyYSIsIm1hdHJpeFdvcmxkSW52ZXJzZSIsInVucHJvamVjdCIsInByb2plY3Rpb25NYXRyaXhJbnZlcnNlIiwibWF0cml4V29ybGQiLCJ0cmFuc2Zvcm1EaXJlY3Rpb24iLCJjcm9zc1ZlY3RvcnMiLCJheCIsImF5IiwiYXoiLCJieCIsImJ5IiwiYnoiLCJwcm9qZWN0T25WZWN0b3IiLCJwcm9qZWN0T25QbGFuZSIsInBsYW5lTm9ybWFsIiwiX3ZlY3RvciRjIiwicmVmbGVjdCIsIm5vcm1hbCIsImR6Iiwic2V0RnJvbVNwaGVyaWNhbCIsInNldEZyb21TcGhlcmljYWxDb29yZHMiLCJyYWRpdXMiLCJwaGkiLCJzaW5QaGlSYWRpdXMiLCJzZXRGcm9tQ3lsaW5kcmljYWwiLCJzZXRGcm9tQ3lsaW5kcmljYWxDb29yZHMiLCJzZXRGcm9tTWF0cml4U2NhbGUiLCJzZXRGcm9tTWF0cml4Q29sdW1uIiwic3oiLCJzZXRGcm9tQ29sb3IiLCJyYW5kb21EaXJlY3Rpb24iLCJ1IiwiQm94MyIsIkluZmluaXR5IiwiaXNCb3gzIiwic2V0RnJvbUFycmF5IiwibWFrZUVtcHR5IiwiZXhwYW5kQnlQb2ludCIsIl92ZWN0b3IkYiIsInNldEZyb21CdWZmZXJBdHRyaWJ1dGUiLCJzZXRGcm9tUG9pbnRzIiwicG9pbnRzIiwic2V0RnJvbUNlbnRlckFuZFNpemUiLCJzaXplIiwiaGFsZlNpemUiLCJzZXRGcm9tT2JqZWN0Iiwib2JqZWN0IiwicHJlY2lzZSIsImV4cGFuZEJ5T2JqZWN0IiwiYm94IiwiaXNFbXB0eSIsImdldENlbnRlciIsImdldFNpemUiLCJwb2ludCIsImV4cGFuZEJ5VmVjdG9yIiwidmVjdG9yIiwiZXhwYW5kQnlTY2FsYXIiLCJ1cGRhdGVXb3JsZE1hdHJpeCIsImdlb21ldHJ5IiwicG9zaXRpb25BdHRyaWJ1dGUiLCJnZXRBdHRyaWJ1dGUiLCJpc0luc3RhbmNlZE1lc2giLCJpc01lc2giLCJnZXRWZXJ0ZXhQb3NpdGlvbiIsImJvdW5kaW5nQm94IiwiY29tcHV0ZUJvdW5kaW5nQm94IiwiX2JveCQ0IiwidW5pb24iLCJjaGlsZHJlbiIsImNvbnRhaW5zUG9pbnQiLCJjb250YWluc0JveCIsImdldFBhcmFtZXRlciIsImludGVyc2VjdHNCb3giLCJpbnRlcnNlY3RzU3BoZXJlIiwic3BoZXJlIiwiY2xhbXBQb2ludCIsImludGVyc2VjdHNQbGFuZSIsInBsYW5lIiwiY29uc3RhbnQiLCJpbnRlcnNlY3RzVHJpYW5nbGUiLCJ0cmlhbmdsZSIsIl9jZW50ZXIiLCJfZXh0ZW50cyIsIl92MCQyIiwiX3YxJDciLCJfdjIkNCIsIl9mMCIsIl9mMSIsIl9mMiIsImF4ZXMiLCJzYXRGb3JBeGVzIiwiX3RyaWFuZ2xlTm9ybWFsIiwiZGlzdGFuY2VUb1BvaW50IiwiZ2V0Qm91bmRpbmdTcGhlcmUiLCJpbnRlcnNlY3QiLCJfcG9pbnRzIiwiX3Rlc3RBeGlzIiwidjAiLCJleHRlbnRzIiwiaiIsInAwIiwicDEiLCJwMiIsIl9ib3gkMyIsIl92MSQ2IiwiX3YyJDMiLCJTcGhlcmUiLCJpc1NwaGVyZSIsIm9wdGlvbmFsQ2VudGVyIiwibWF4UmFkaXVzU3EiLCJyYWRpdXNTdW0iLCJkZWx0YUxlbmd0aFNxIiwiZ2V0Qm91bmRpbmdCb3giLCJnZXRNYXhTY2FsZU9uQXhpcyIsImRlbHRhIiwiX3ZlY3RvciRhIiwiX3NlZ0NlbnRlciIsIl9zZWdEaXIiLCJfZGlmZiIsIl9lZGdlMSIsIl9lZGdlMiIsIl9ub3JtYWwkMSIsIlJheSIsIm9yaWdpbiIsImRpcmVjdGlvbiIsInJheSIsImF0IiwibG9va0F0IiwicmVjYXN0IiwiY2xvc2VzdFBvaW50VG9Qb2ludCIsImRpcmVjdGlvbkRpc3RhbmNlIiwiZGlzdGFuY2VTcVRvUG9pbnQiLCJkaXN0YW5jZVNxVG9TZWdtZW50Iiwib3B0aW9uYWxQb2ludE9uUmF5Iiwib3B0aW9uYWxQb2ludE9uU2VnbWVudCIsInNlZ0V4dGVudCIsImEwMSIsImIwIiwiczAiLCJzcXJEaXN0IiwiZXh0RGV0IiwiaW52RGV0IiwiaW50ZXJzZWN0U3BoZXJlIiwidGNhIiwicmFkaXVzMiIsInRoYyIsInQwIiwidDEiLCJkaXN0YW5jZVRvUGxhbmUiLCJpbnRlcnNlY3RQbGFuZSIsImRpc3RUb1BvaW50IiwiaW50ZXJzZWN0Qm94IiwidG1pbiIsInRtYXgiLCJ0eW1pbiIsInR5bWF4IiwidHptaW4iLCJ0em1heCIsImludmRpcngiLCJpbnZkaXJ5IiwiaW52ZGlyeiIsImlzTmFOIiwiaW50ZXJzZWN0VHJpYW5nbGUiLCJiYWNrZmFjZUN1bGxpbmciLCJzaWduIiwiRGROIiwiRGRReEUyIiwiRGRFMXhRIiwiUWROIiwiTWF0cml4NCIsIm4xNCIsIm4yNCIsIm4zNCIsIm40MSIsIm40MiIsIm40MyIsIm40NCIsImlzTWF0cml4NCIsImNvcHlQb3NpdGlvbiIsInNldEZyb21NYXRyaXgzIiwibWFrZUJhc2lzIiwiZXh0cmFjdFJvdGF0aW9uIiwic2NhbGVYIiwiX3YxJDUiLCJzY2FsZVkiLCJzY2FsZVoiLCJtYWtlUm90YXRpb25Gcm9tRXVsZXIiLCJhZiIsImJmIiwiY2UiLCJjZiIsImRlIiwiZGYiLCJhYyIsImFkIiwiYmMiLCJiZCIsIm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uIiwiY29tcG9zZSIsIl96ZXJvIiwiX29uZSIsImV5ZSIsInVwIiwiYTE0IiwiYTI0IiwiYTM0IiwiYTQxIiwiYTQyIiwiYTQzIiwiYTQ0IiwiYjE0IiwiYjI0IiwiYjM0IiwiYjQxIiwiYjQyIiwiYjQzIiwiYjQ0Iiwic2V0UG9zaXRpb24iLCJ0MTQiLCJzY2FsZVhTcSIsInNjYWxlWVNxIiwic2NhbGVaU3EiLCJtYWtlUm90YXRpb25YIiwibWFrZVJvdGF0aW9uWSIsIm1ha2VSb3RhdGlvbloiLCJtYWtlUm90YXRpb25BeGlzIiwibWFrZVNoZWFyIiwieXgiLCJ6eCIsInp5IiwicG9zaXRpb24iLCJ4MiIsInkyIiwiejIiLCJ3eCIsInd5Iiwid3oiLCJkZWNvbXBvc2UiLCJfbTEkMiIsImludlNYIiwiaW52U1kiLCJpbnZTWiIsIm1ha2VQZXJzcGVjdGl2ZSIsImxlZnQiLCJyaWdodCIsInRvcCIsImJvdHRvbSIsIm5lYXIiLCJmYXIiLCJjb29yZGluYXRlU3lzdGVtIiwibWFrZU9ydGhvZ3JhcGhpYyIsInAiLCJ6SW52IiwiX21hdHJpeCQyIiwiX3F1YXRlcm5pb24kMyIsIkV1bGVyIiwiREVGQVVMVF9PUkRFUiIsImlzRXVsZXIiLCJhc2luIiwic2V0RnJvbVF1YXRlcm5pb24iLCJzZXRGcm9tVmVjdG9yMyIsInJlb3JkZXIiLCJuZXdPcmRlciIsIkxheWVycyIsIm1hc2siLCJsYXllciIsImVuYWJsZSIsImVuYWJsZUFsbCIsInRvZ2dsZSIsImRpc2FibGUiLCJkaXNhYmxlQWxsIiwibGF5ZXJzIiwiaXNFbmFibGVkIiwiX29iamVjdDNESWQiLCJfdjEkNCIsIl9xMSIsIl9tMSQxIiwiX3RhcmdldCIsIl9wb3NpdGlvbiQzIiwiX3NjYWxlJDIiLCJfcXVhdGVybmlvbiQyIiwiX3hBeGlzIiwiX3lBeGlzIiwiX3pBeGlzIiwiX2FkZGVkRXZlbnQiLCJfcmVtb3ZlZEV2ZW50IiwiX2NoaWxkYWRkZWRFdmVudCIsImNoaWxkIiwiX2NoaWxkcmVtb3ZlZEV2ZW50IiwiT2JqZWN0M0QiLCJpc09iamVjdDNEIiwicGFyZW50IiwiREVGQVVMVF9VUCIsImRlZmluZVByb3BlcnRpZXMiLCJjb25maWd1cmFibGUiLCJlbnVtZXJhYmxlIiwibW9kZWxWaWV3TWF0cml4Iiwibm9ybWFsTWF0cml4IiwiREVGQVVMVF9NQVRSSVhfQVVUT19VUERBVEUiLCJtYXRyaXhXb3JsZEF1dG9VcGRhdGUiLCJERUZBVUxUX01BVFJJWF9XT1JMRF9BVVRPX1VQREFURSIsIm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUiLCJ2aXNpYmxlIiwiY2FzdFNoYWRvdyIsInJlY2VpdmVTaGFkb3ciLCJmcnVzdHVtQ3VsbGVkIiwicmVuZGVyT3JkZXIiLCJhbmltYXRpb25zIiwiY3VzdG9tRGVwdGhNYXRlcmlhbCIsImN1c3RvbURpc3RhbmNlTWF0ZXJpYWwiLCJvbkJlZm9yZVNoYWRvdyIsIm9uQWZ0ZXJTaGFkb3ciLCJvbkJlZm9yZVJlbmRlciIsIm9uQWZ0ZXJSZW5kZXIiLCJzZXRSb3RhdGlvbkZyb21BeGlzQW5nbGUiLCJzZXRSb3RhdGlvbkZyb21FdWxlciIsInNldFJvdGF0aW9uRnJvbU1hdHJpeCIsInNldFJvdGF0aW9uRnJvbVF1YXRlcm5pb24iLCJyb3RhdGVPbkF4aXMiLCJyb3RhdGVPbldvcmxkQXhpcyIsInJvdGF0ZVgiLCJyb3RhdGVZIiwicm90YXRlWiIsInRyYW5zbGF0ZU9uQXhpcyIsImRpc3RhbmNlIiwidHJhbnNsYXRlWCIsInRyYW5zbGF0ZVkiLCJ0cmFuc2xhdGVaIiwibG9jYWxUb1dvcmxkIiwid29ybGRUb0xvY2FsIiwiaXNDYW1lcmEiLCJpc0xpZ2h0IiwiYXJndW1lbnRzIiwiZXJyb3IiLCJyZW1vdmVGcm9tUGFyZW50IiwicmVtb3ZlIiwiYXR0YWNoIiwiZ2V0T2JqZWN0QnlJZCIsImlkIiwiZ2V0T2JqZWN0QnlQcm9wZXJ0eSIsImdldE9iamVjdEJ5TmFtZSIsImdldE9iamVjdHNCeVByb3BlcnR5IiwicmVzdWx0IiwiZ2V0V29ybGRQb3NpdGlvbiIsImdldFdvcmxkUXVhdGVybmlvbiIsImdldFdvcmxkU2NhbGUiLCJnZXRXb3JsZERpcmVjdGlvbiIsInJheWNhc3QiLCJ0cmF2ZXJzZSIsInRyYXZlcnNlVmlzaWJsZSIsInRyYXZlcnNlQW5jZXN0b3JzIiwidXBkYXRlTWF0cml4V29ybGQiLCJmb3JjZSIsInVwZGF0ZVBhcmVudHMiLCJ1cGRhdGVDaGlsZHJlbiIsImdlb21ldHJpZXMiLCJtYXRlcmlhbHMiLCJzaGFwZXMiLCJza2VsZXRvbnMiLCJub2RlcyIsInNlcmlhbGl6ZSIsImxpYnJhcnkiLCJlbGVtZW50IiwiaW5zdGFuY2VNYXRyaXgiLCJpbnN0YW5jZUNvbG9yIiwiaXNCYXRjaGVkTWVzaCIsInBlck9iamVjdEZydXN0dW1DdWxsZWQiLCJzb3J0T2JqZWN0cyIsImRyYXdSYW5nZXMiLCJfZHJhd1JhbmdlcyIsInJlc2VydmVkUmFuZ2VzIiwiX3Jlc2VydmVkUmFuZ2VzIiwidmlzaWJpbGl0eSIsIl92aXNpYmlsaXR5IiwiYWN0aXZlIiwiX2FjdGl2ZSIsImJvdW5kcyIsIl9ib3VuZHMiLCJtYXAiLCJib3VuZCIsImJveEluaXRpYWxpemVkIiwiYm94TWluIiwiYm94TWF4Iiwic3BoZXJlSW5pdGlhbGl6ZWQiLCJzcGhlcmVSYWRpdXMiLCJzcGhlcmVDZW50ZXIiLCJtYXhJbnN0YW5jZUNvdW50IiwiX21heEluc3RhbmNlQ291bnQiLCJtYXhWZXJ0ZXhDb3VudCIsIl9tYXhWZXJ0ZXhDb3VudCIsIm1heEluZGV4Q291bnQiLCJfbWF4SW5kZXhDb3VudCIsImdlb21ldHJ5SW5pdGlhbGl6ZWQiLCJfZ2VvbWV0cnlJbml0aWFsaXplZCIsImdlb21ldHJ5Q291bnQiLCJfZ2VvbWV0cnlDb3VudCIsIm1hdHJpY2VzVGV4dHVyZSIsIl9tYXRyaWNlc1RleHR1cmUiLCJfY29sb3JzVGV4dHVyZSIsImNvbG9yc1RleHR1cmUiLCJib3VuZGluZ1NwaGVyZSIsImlzU2NlbmUiLCJiYWNrZ3JvdW5kIiwiaXNDb2xvciIsImVudmlyb25tZW50IiwiaXNMaW5lIiwiaXNQb2ludHMiLCJwYXJhbWV0ZXJzIiwic2hhcGUiLCJpc1NraW5uZWRNZXNoIiwiYmluZE1vZGUiLCJiaW5kTWF0cml4Iiwic2tlbGV0b24iLCJtYXRlcmlhbCIsInV1aWRzIiwiYW5pbWF0aW9uIiwiZXh0cmFjdEZyb21DYWNoZSIsImNhY2hlIiwidmFsdWVzIiwia2V5IiwicmVjdXJzaXZlIiwiX3YwJDEiLCJfdjEkMyIsIl92MiQyIiwiX3YzJDIiLCJfdmFiIiwiX3ZhYyIsIl92YmMiLCJfdmFwIiwiX3ZicCIsIl92Y3AiLCJfdjQwIiwiX3Y0MSIsIl92NDIiLCJUcmlhbmdsZSIsImdldE5vcm1hbCIsInRhcmdldExlbmd0aFNxIiwiZ2V0QmFyeWNvb3JkIiwiZG90MDAiLCJkb3QwMSIsImRvdDAyIiwiZG90MTEiLCJkb3QxMiIsImRlbm9tIiwiaW52RGVub20iLCJnZXRJbnRlcnBvbGF0aW9uIiwicDMiLCJ2MyIsImdldEludGVycG9sYXRlZEF0dHJpYnV0ZSIsImF0dHIiLCJpMSIsImkyIiwiaTMiLCJiYXJ5Y29vcmQiLCJpc0Zyb250RmFjaW5nIiwic2V0RnJvbVBvaW50c0FuZEluZGljZXMiLCJpMCIsInNldEZyb21BdHRyaWJ1dGVBbmRJbmRpY2VzIiwiZ2V0QXJlYSIsImdldE1pZHBvaW50IiwiZ2V0UGxhbmUiLCJzZXRGcm9tQ29wbGFuYXJQb2ludHMiLCJkNCIsInZjIiwiZDUiLCJkNiIsInZiIiwidmEiLCJfY29sb3JLZXl3b3JkcyIsImFsaWNlYmx1ZSIsImFudGlxdWV3aGl0ZSIsImFxdWEiLCJhcXVhbWFyaW5lIiwiYXp1cmUiLCJiZWlnZSIsImJpc3F1ZSIsImJsYWNrIiwiYmxhbmNoZWRhbG1vbmQiLCJibHVlIiwiYmx1ZXZpb2xldCIsImJyb3duIiwiYnVybHl3b29kIiwiY2FkZXRibHVlIiwiY2hhcnRyZXVzZSIsImNob2NvbGF0ZSIsImNvcmFsIiwiY29ybmZsb3dlcmJsdWUiLCJjb3Juc2lsayIsImNyaW1zb24iLCJjeWFuIiwiZGFya2JsdWUiLCJkYXJrY3lhbiIsImRhcmtnb2xkZW5yb2QiLCJkYXJrZ3JheSIsImRhcmtncmVlbiIsImRhcmtncmV5IiwiZGFya2toYWtpIiwiZGFya21hZ2VudGEiLCJkYXJrb2xpdmVncmVlbiIsImRhcmtvcmFuZ2UiLCJkYXJrb3JjaGlkIiwiZGFya3JlZCIsImRhcmtzYWxtb24iLCJkYXJrc2VhZ3JlZW4iLCJkYXJrc2xhdGVibHVlIiwiZGFya3NsYXRlZ3JheSIsImRhcmtzbGF0ZWdyZXkiLCJkYXJrdHVycXVvaXNlIiwiZGFya3Zpb2xldCIsImRlZXBwaW5rIiwiZGVlcHNreWJsdWUiLCJkaW1ncmF5IiwiZGltZ3JleSIsImRvZGdlcmJsdWUiLCJmaXJlYnJpY2siLCJmbG9yYWx3aGl0ZSIsImZvcmVzdGdyZWVuIiwiZnVjaHNpYSIsImdhaW5zYm9ybyIsImdob3N0d2hpdGUiLCJnb2xkIiwiZ29sZGVucm9kIiwiZ3JheSIsImdyZWVuIiwiZ3JlZW55ZWxsb3ciLCJncmV5IiwiaG9uZXlkZXciLCJob3RwaW5rIiwiaW5kaWFucmVkIiwiaW5kaWdvIiwiaXZvcnkiLCJraGFraSIsImxhdmVuZGVyIiwibGF2ZW5kZXJibHVzaCIsImxhd25ncmVlbiIsImxlbW9uY2hpZmZvbiIsImxpZ2h0Ymx1ZSIsImxpZ2h0Y29yYWwiLCJsaWdodGN5YW4iLCJsaWdodGdvbGRlbnJvZHllbGxvdyIsImxpZ2h0Z3JheSIsImxpZ2h0Z3JlZW4iLCJsaWdodGdyZXkiLCJsaWdodHBpbmsiLCJsaWdodHNhbG1vbiIsImxpZ2h0c2VhZ3JlZW4iLCJsaWdodHNreWJsdWUiLCJsaWdodHNsYXRlZ3JheSIsImxpZ2h0c2xhdGVncmV5IiwibGlnaHRzdGVlbGJsdWUiLCJsaWdodHllbGxvdyIsImxpbWUiLCJsaW1lZ3JlZW4iLCJsaW5lbiIsIm1hZ2VudGEiLCJtYXJvb24iLCJtZWRpdW1hcXVhbWFyaW5lIiwibWVkaXVtYmx1ZSIsIm1lZGl1bW9yY2hpZCIsIm1lZGl1bXB1cnBsZSIsIm1lZGl1bXNlYWdyZWVuIiwibWVkaXVtc2xhdGVibHVlIiwibWVkaXVtc3ByaW5nZ3JlZW4iLCJtZWRpdW10dXJxdW9pc2UiLCJtZWRpdW12aW9sZXRyZWQiLCJtaWRuaWdodGJsdWUiLCJtaW50Y3JlYW0iLCJtaXN0eXJvc2UiLCJtb2NjYXNpbiIsIm5hdmFqb3doaXRlIiwibmF2eSIsIm9sZGxhY2UiLCJvbGl2ZSIsIm9saXZlZHJhYiIsIm9yYW5nZSIsIm9yYW5nZXJlZCIsIm9yY2hpZCIsInBhbGVnb2xkZW5yb2QiLCJwYWxlZ3JlZW4iLCJwYWxldHVycXVvaXNlIiwicGFsZXZpb2xldHJlZCIsInBhcGF5YXdoaXAiLCJwZWFjaHB1ZmYiLCJwZXJ1IiwicGluayIsInBsdW0iLCJwb3dkZXJibHVlIiwicHVycGxlIiwicmViZWNjYXB1cnBsZSIsInJlZCIsInJvc3licm93biIsInJveWFsYmx1ZSIsInNhZGRsZWJyb3duIiwic2FsbW9uIiwic2FuZHlicm93biIsInNlYWdyZWVuIiwic2Vhc2hlbGwiLCJzaWVubmEiLCJzaWx2ZXIiLCJza3libHVlIiwic2xhdGVibHVlIiwic2xhdGVncmF5Iiwic2xhdGVncmV5Iiwic25vdyIsInNwcmluZ2dyZWVuIiwic3RlZWxibHVlIiwidGFuIiwidGVhbCIsInRoaXN0bGUiLCJ0b21hdG8iLCJ0dXJxdW9pc2UiLCJ2aW9sZXQiLCJ3aGVhdCIsIndoaXRlIiwid2hpdGVzbW9rZSIsInllbGxvdyIsInllbGxvd2dyZWVuIiwiX2hzbEEiLCJfaHNsQiIsImh1ZTJyZ2IiLCJDb2xvciIsInNldEhleCIsInNldFN0eWxlIiwic2V0UkdCIiwiaGV4Iiwic2V0SFNMIiwiaGFuZGxlQWxwaGEiLCJzdHJpbmciLCJwYXJzZUZsb2F0IiwiZXhlYyIsImNvbXBvbmVudHMiLCJwYXJzZUludCIsImNoYXJBdCIsInNldENvbG9yTmFtZSIsImNvcHlTUkdCVG9MaW5lYXIiLCJjb3B5TGluZWFyVG9TUkdCIiwiY29udmVydFNSR0JUb0xpbmVhciIsImNvbnZlcnRMaW5lYXJUb1NSR0IiLCJnZXRIZXgiLCJfY29sb3IiLCJnZXRIZXhTdHJpbmciLCJ0b1N0cmluZyIsImdldEhTTCIsImh1ZSIsInNhdHVyYXRpb24iLCJsaWdodG5lc3MiLCJnZXRSR0IiLCJnZXRTdHlsZSIsInRvRml4ZWQiLCJvZmZzZXRIU0wiLCJhZGRDb2xvcnMiLCJjb2xvcjEiLCJjb2xvcjIiLCJsZXJwQ29sb3JzIiwibGVycEhTTCIsIk5BTUVTIiwiX21hdGVyaWFsSWQiLCJNYXRlcmlhbCIsImlzTWF0ZXJpYWwiLCJibGVuZGluZyIsInNpZGUiLCJ2ZXJ0ZXhDb2xvcnMiLCJvcGFjaXR5IiwidHJhbnNwYXJlbnQiLCJhbHBoYUhhc2giLCJibGVuZFNyYyIsImJsZW5kRHN0IiwiYmxlbmRFcXVhdGlvbiIsImJsZW5kU3JjQWxwaGEiLCJibGVuZERzdEFscGhhIiwiYmxlbmRFcXVhdGlvbkFscGhhIiwiYmxlbmRDb2xvciIsImJsZW5kQWxwaGEiLCJkZXB0aEZ1bmMiLCJkZXB0aFRlc3QiLCJkZXB0aFdyaXRlIiwic3RlbmNpbFdyaXRlTWFzayIsInN0ZW5jaWxGdW5jIiwic3RlbmNpbFJlZiIsInN0ZW5jaWxGdW5jTWFzayIsInN0ZW5jaWxGYWlsIiwic3RlbmNpbFpGYWlsIiwic3RlbmNpbFpQYXNzIiwic3RlbmNpbFdyaXRlIiwiY2xpcHBpbmdQbGFuZXMiLCJjbGlwSW50ZXJzZWN0aW9uIiwiY2xpcFNoYWRvd3MiLCJzaGFkb3dTaWRlIiwiY29sb3JXcml0ZSIsInByZWNpc2lvbiIsInBvbHlnb25PZmZzZXQiLCJwb2x5Z29uT2Zmc2V0RmFjdG9yIiwicG9seWdvbk9mZnNldFVuaXRzIiwiZGl0aGVyaW5nIiwiYWxwaGFUb0NvdmVyYWdlIiwicHJlbXVsdGlwbGllZEFscGhhIiwiZm9yY2VTaW5nbGVQYXNzIiwiYWxsb3dPdmVycmlkZSIsInRvbmVNYXBwZWQiLCJfYWxwaGFUZXN0IiwiYWxwaGFUZXN0Iiwib25CZWZvcmVDb21waWxlIiwiY3VzdG9tUHJvZ3JhbUNhY2hlS2V5Iiwic2V0VmFsdWVzIiwibmV3VmFsdWUiLCJjdXJyZW50VmFsdWUiLCJyb3VnaG5lc3MiLCJtZXRhbG5lc3MiLCJzaGVlbiIsInNoZWVuQ29sb3IiLCJzaGVlblJvdWdobmVzcyIsImVtaXNzaXZlIiwiZW1pc3NpdmVJbnRlbnNpdHkiLCJzcGVjdWxhciIsInNwZWN1bGFySW50ZW5zaXR5Iiwic3BlY3VsYXJDb2xvciIsInNoaW5pbmVzcyIsImNsZWFyY29hdCIsImNsZWFyY29hdFJvdWdobmVzcyIsImNsZWFyY29hdE1hcCIsImNsZWFyY29hdFJvdWdobmVzc01hcCIsImNsZWFyY29hdE5vcm1hbE1hcCIsImNsZWFyY29hdE5vcm1hbFNjYWxlIiwiZGlzcGVyc2lvbiIsImlyaWRlc2NlbmNlIiwiaXJpZGVzY2VuY2VJT1IiLCJpcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlIiwiaXJpZGVzY2VuY2VNYXAiLCJpcmlkZXNjZW5jZVRoaWNrbmVzc01hcCIsImFuaXNvdHJvcHlSb3RhdGlvbiIsImFuaXNvdHJvcHlNYXAiLCJtYXRjYXAiLCJhbHBoYU1hcCIsImxpZ2h0TWFwIiwibGlnaHRNYXBJbnRlbnNpdHkiLCJhb01hcCIsImFvTWFwSW50ZW5zaXR5IiwiYnVtcE1hcCIsImJ1bXBTY2FsZSIsIm5vcm1hbE1hcCIsIm5vcm1hbE1hcFR5cGUiLCJub3JtYWxTY2FsZSIsImRpc3BsYWNlbWVudE1hcCIsImRpc3BsYWNlbWVudFNjYWxlIiwiZGlzcGxhY2VtZW50QmlhcyIsInJvdWdobmVzc01hcCIsIm1ldGFsbmVzc01hcCIsImVtaXNzaXZlTWFwIiwic3BlY3VsYXJNYXAiLCJzcGVjdWxhckludGVuc2l0eU1hcCIsInNwZWN1bGFyQ29sb3JNYXAiLCJlbnZNYXAiLCJjb21iaW5lIiwiZW52TWFwUm90YXRpb24iLCJlbnZNYXBJbnRlbnNpdHkiLCJyZWZsZWN0aXZpdHkiLCJyZWZyYWN0aW9uUmF0aW8iLCJncmFkaWVudE1hcCIsInRyYW5zbWlzc2lvbiIsInRyYW5zbWlzc2lvbk1hcCIsInRoaWNrbmVzcyIsInRoaWNrbmVzc01hcCIsImF0dGVudWF0aW9uRGlzdGFuY2UiLCJhdHRlbnVhdGlvbkNvbG9yIiwic2l6ZUF0dGVudWF0aW9uIiwibGluZXdpZHRoIiwiZGFzaFNpemUiLCJnYXBTaXplIiwid2lyZWZyYW1lIiwid2lyZWZyYW1lTGluZXdpZHRoIiwid2lyZWZyYW1lTGluZWNhcCIsIndpcmVmcmFtZUxpbmVqb2luIiwiZmxhdFNoYWRpbmciLCJmb2ciLCJzcmNQbGFuZXMiLCJkc3RQbGFuZXMiLCJvbkJ1aWxkIiwiTWVzaEJhc2ljTWF0ZXJpYWwiLCJpc01lc2hCYXNpY01hdGVyaWFsIiwiX3RhYmxlcyIsIl9nZW5lcmF0ZVRhYmxlcyIsIkFycmF5QnVmZmVyIiwiZmxvYXRWaWV3IiwidWludDMyVmlldyIsImJhc2VUYWJsZSIsInNoaWZ0VGFibGUiLCJtYW50aXNzYVRhYmxlIiwiZXhwb25lbnRUYWJsZSIsIm9mZnNldFRhYmxlIiwidG9IYWxmRmxvYXQiLCJ2YWwiLCJmcm9tSGFsZkZsb2F0IiwiRGF0YVV0aWxzIiwiX3ZlY3RvciQ5IiwiX3ZlY3RvcjIkMSIsIl9pZCQyIiwiQnVmZmVyQXR0cmlidXRlIiwiaXRlbVNpemUiLCJub3JtYWxpemVkIiwiVHlwZUVycm9yIiwiaXNCdWZmZXJBdHRyaWJ1dGUiLCJ1c2FnZSIsInVwZGF0ZVJhbmdlcyIsImdwdVR5cGUiLCJvblVwbG9hZENhbGxiYWNrIiwic2V0VXNhZ2UiLCJhZGRVcGRhdGVSYW5nZSIsInN0YXJ0IiwiY2xlYXJVcGRhdGVSYW5nZXMiLCJjb3B5QXQiLCJpbmRleDEiLCJpbmRleDIiLCJjb3B5QXJyYXkiLCJzZXRYWSIsInNldFhZWiIsImNvbXBvbmVudCIsInNldFhZWlciLCJvblVwbG9hZCIsIkludDhCdWZmZXJBdHRyaWJ1dGUiLCJVaW50OEJ1ZmZlckF0dHJpYnV0ZSIsIlVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZSIsIkludDE2QnVmZmVyQXR0cmlidXRlIiwiVWludDE2QnVmZmVyQXR0cmlidXRlIiwiSW50MzJCdWZmZXJBdHRyaWJ1dGUiLCJVaW50MzJCdWZmZXJBdHRyaWJ1dGUiLCJGbG9hdDE2QnVmZmVyQXR0cmlidXRlIiwiaXNGbG9hdDE2QnVmZmVyQXR0cmlidXRlIiwiRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSIsIl9pZCQxIiwiX20xIiwiX29iaiIsIl9vZmZzZXQiLCJfYm94JDIiLCJfYm94TW9ycGhUYXJnZXRzIiwiX3ZlY3RvciQ4IiwiQnVmZmVyR2VvbWV0cnkiLCJpc0J1ZmZlckdlb21ldHJ5IiwiaW5kaXJlY3QiLCJhdHRyaWJ1dGVzIiwibW9ycGhBdHRyaWJ1dGVzIiwibW9ycGhUYXJnZXRzUmVsYXRpdmUiLCJncm91cHMiLCJkcmF3UmFuZ2UiLCJnZXRJbmRleCIsInNldEluZGV4Iiwic2V0SW5kaXJlY3QiLCJnZXRJbmRpcmVjdCIsInNldEF0dHJpYnV0ZSIsImRlbGV0ZUF0dHJpYnV0ZSIsImhhc0F0dHJpYnV0ZSIsImFkZEdyb3VwIiwibWF0ZXJpYWxJbmRleCIsImNsZWFyR3JvdXBzIiwic2V0RHJhd1JhbmdlIiwidGFuZ2VudCIsImNvbXB1dGVCb3VuZGluZ1NwaGVyZSIsIm1vcnBoQXR0cmlidXRlc1Bvc2l0aW9uIiwiaXNHTEJ1ZmZlckF0dHJpYnV0ZSIsIm1vcnBoQXR0cmlidXRlIiwiamwiLCJjb21wdXRlVGFuZ2VudHMiLCJub3JtYWxBdHRyaWJ1dGUiLCJ1dkF0dHJpYnV0ZSIsInRhbmdlbnRBdHRyaWJ1dGUiLCJ0YW4xIiwidGFuMiIsInZBIiwidkIiLCJ2QyIsInV2QSIsInV2QiIsInV2QyIsInNkaXIiLCJ0ZGlyIiwiaGFuZGxlVHJpYW5nbGUiLCJpc0Zpbml0ZSIsImdyb3VwIiwidG1wMiIsIm4yIiwiaGFuZGxlVmVydGV4IiwiY29tcHV0ZVZlcnRleE5vcm1hbHMiLCJwQSIsInBCIiwicEMiLCJuQSIsIm5CIiwibkMiLCJjYiIsImFiIiwibm9ybWFsaXplTm9ybWFscyIsIm5vcm1hbHMiLCJ0b05vbkluZGV4ZWQiLCJjb252ZXJ0QnVmZmVyQXR0cmlidXRlIiwiaW5kaWNlcyIsImFycmF5MiIsImlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUiLCJzdHJpZGUiLCJnZW9tZXRyeTIiLCJuZXdBdHRyaWJ1dGUiLCJtb3JwaEFycmF5IiwiaGFzTW9ycGhBdHRyaWJ1dGVzIiwiYXR0cmlidXRlQXJyYXkiLCJfaW52ZXJzZU1hdHJpeCQzIiwiX3JheSQzIiwiX3NwaGVyZSQ2IiwiX3NwaGVyZUhpdEF0IiwiX3ZBJDEiLCJfdkIkMSIsIl92QyQxIiwiX3RlbXBBIiwiX21vcnBoQSIsIl9pbnRlcnNlY3Rpb25Qb2ludCIsIl9pbnRlcnNlY3Rpb25Qb2ludFdvcmxkIiwiTWVzaCIsIm1vcnBoVGFyZ2V0RGljdGlvbmFyeSIsIm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyIsInVwZGF0ZU1vcnBoVGFyZ2V0cyIsIm1sIiwiU3RyaW5nIiwibW9ycGhQb3NpdGlvbiIsIm1vcnBoSW5mbHVlbmNlcyIsImluZmx1ZW5jZSIsInJheWNhc3RlciIsImludGVyc2VjdHMiLCJfY29tcHV0ZUludGVyc2VjdGlvbnMiLCJyYXlMb2NhbFNwYWNlIiwiaW50ZXJzZWN0aW9uIiwidXYxIiwiZ3JvdXBNYXRlcmlhbCIsImNoZWNrR2VvbWV0cnlJbnRlcnNlY3Rpb24iLCJmYWNlSW5kZXgiLCJmYWNlIiwiY2hlY2tJbnRlcnNlY3Rpb24kMSIsIkJveEdlb21ldHJ5Iiwid2lkdGhTZWdtZW50cyIsImhlaWdodFNlZ21lbnRzIiwiZGVwdGhTZWdtZW50cyIsInNjb3BlIiwidmVydGljZXMiLCJ1dnMiLCJudW1iZXJPZlZlcnRpY2VzIiwiZ3JvdXBTdGFydCIsImJ1aWxkUGxhbmUiLCJ1ZGlyIiwidmRpciIsImdyaWRYIiwiZ3JpZFkiLCJzZWdtZW50V2lkdGgiLCJzZWdtZW50SGVpZ2h0Iiwid2lkdGhIYWxmIiwiaGVpZ2h0SGFsZiIsImRlcHRoSGFsZiIsImdyaWRYMSIsImdyaWRZMSIsInZlcnRleENvdW50ZXIiLCJncm91cENvdW50IiwiaXkiLCJpeCIsImZyb21KU09OIiwiY2xvbmVVbmlmb3JtcyIsInByb3BlcnR5IiwibWVyZ2VVbmlmb3JtcyIsInVuaWZvcm1zIiwibWVyZ2VkIiwiZ2V0VW5saXRVbmlmb3JtQ29sb3JTcGFjZSIsInJlbmRlcmVyIiwiY3VycmVudFJlbmRlclRhcmdldCIsImdldFJlbmRlclRhcmdldCIsIm91dHB1dENvbG9yU3BhY2UiLCJpc1hSUmVuZGVyVGFyZ2V0IiwiVW5pZm9ybXNVdGlscyIsIm1lcmdlIiwiU2hhZGVyTWF0ZXJpYWwiLCJpc1NoYWRlck1hdGVyaWFsIiwiZGVmaW5lcyIsInVuaWZvcm1zR3JvdXBzIiwidmVydGV4U2hhZGVyIiwiZnJhZ21lbnRTaGFkZXIiLCJsaWdodHMiLCJjbGlwcGluZyIsImV4dGVuc2lvbnMiLCJjbGlwQ3VsbERpc3RhbmNlIiwibXVsdGlEcmF3IiwiZGVmYXVsdEF0dHJpYnV0ZVZhbHVlcyIsImluZGV4MEF0dHJpYnV0ZU5hbWUiLCJ1bmlmb3Jtc05lZWRVcGRhdGUiLCJnbHNsVmVyc2lvbiIsImNsb25lVW5pZm9ybXNHcm91cHMiLCJDYW1lcmEiLCJfdjMkMSIsIl9taW5UYXJnZXQiLCJfbWF4VGFyZ2V0IiwiUGVyc3BlY3RpdmVDYW1lcmEiLCJmb3YiLCJhc3BlY3QiLCJpc1BlcnNwZWN0aXZlQ2FtZXJhIiwiem9vbSIsImZvY3VzIiwidmlldyIsImZpbG1HYXVnZSIsImZpbG1PZmZzZXQiLCJ1cGRhdGVQcm9qZWN0aW9uTWF0cml4Iiwic2V0Rm9jYWxMZW5ndGgiLCJmb2NhbExlbmd0aCIsInZFeHRlbnRTbG9wZSIsImdldEZpbG1IZWlnaHQiLCJhdGFuIiwiZ2V0Rm9jYWxMZW5ndGgiLCJnZXRFZmZlY3RpdmVGT1YiLCJnZXRGaWxtV2lkdGgiLCJnZXRWaWV3Qm91bmRzIiwibWluVGFyZ2V0IiwibWF4VGFyZ2V0IiwiZ2V0Vmlld1NpemUiLCJzZXRWaWV3T2Zmc2V0IiwiZnVsbFdpZHRoIiwiZnVsbEhlaWdodCIsIm9mZnNldFgiLCJvZmZzZXRZIiwiY2xlYXJWaWV3T2Zmc2V0Iiwic2tldyIsIkN1YmVDYW1lcmEiLCJhY3RpdmVNaXBtYXBMZXZlbCIsImNhbWVyYVBYIiwiY2FtZXJhTlgiLCJjYW1lcmFQWSIsImNhbWVyYU5ZIiwiY2FtZXJhUFoiLCJjYW1lcmFOWiIsInVwZGF0ZUNvb3JkaW5hdGVTeXN0ZW0iLCJjYW1lcmFzIiwiY29uY2F0Iiwic2NlbmUiLCJjdXJyZW50QWN0aXZlQ3ViZUZhY2UiLCJnZXRBY3RpdmVDdWJlRmFjZSIsImN1cnJlbnRBY3RpdmVNaXBtYXBMZXZlbCIsImdldEFjdGl2ZU1pcG1hcExldmVsIiwiY3VycmVudFhyRW5hYmxlZCIsInhyIiwic2V0UmVuZGVyVGFyZ2V0IiwicmVuZGVyIiwiQ3ViZVRleHR1cmUiLCJpc0N1YmVUZXh0dXJlIiwiV2ViR0xDdWJlUmVuZGVyVGFyZ2V0IiwiaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQiLCJmcm9tRXF1aXJlY3Rhbmd1bGFyVGV4dHVyZSIsInNoYWRlciIsInRFcXVpcmVjdCIsIm1lc2giLCJjdXJyZW50TWluRmlsdGVyIiwic3RlbmNpbCIsIkdyb3VwIiwiaXNHcm91cCIsIl9tb3ZlRXZlbnQiLCJXZWJYUkNvbnRyb2xsZXIiLCJfdGFyZ2V0UmF5IiwiX2dyaXAiLCJfaGFuZCIsImdldEhhbmRTcGFjZSIsImpvaW50cyIsImlucHV0U3RhdGUiLCJwaW5jaGluZyIsImdldFRhcmdldFJheVNwYWNlIiwiaGFzTGluZWFyVmVsb2NpdHkiLCJsaW5lYXJWZWxvY2l0eSIsImhhc0FuZ3VsYXJWZWxvY2l0eSIsImFuZ3VsYXJWZWxvY2l0eSIsImdldEdyaXBTcGFjZSIsImNvbm5lY3QiLCJpbnB1dFNvdXJjZSIsImhhbmQiLCJpbnB1dGpvaW50IiwiX2dldEhhbmRKb2ludCIsImRpc2Nvbm5lY3QiLCJmcmFtZSIsInJlZmVyZW5jZVNwYWNlIiwiaW5wdXRQb3NlIiwiZ3JpcFBvc2UiLCJoYW5kUG9zZSIsInRhcmdldFJheSIsImdyaXAiLCJzZXNzaW9uIiwidmlzaWJpbGl0eVN0YXRlIiwiam9pbnRQb3NlIiwiZ2V0Sm9pbnRQb3NlIiwiam9pbnQiLCJ0cmFuc2Zvcm0iLCJqb2ludFJhZGl1cyIsImluZGV4VGlwIiwidGh1bWJUaXAiLCJkaXN0YW5jZVRvUGluY2giLCJ0aHJlc2hvbGQiLCJoYW5kZWRuZXNzIiwiZ3JpcFNwYWNlIiwiZ2V0UG9zZSIsInRhcmdldFJheVNwYWNlIiwiam9pbnROYW1lIiwiRm9nRXhwMiIsImRlbnNpdHkiLCJpc0ZvZ0V4cDIiLCJGb2ciLCJpc0ZvZyIsIlNjZW5lIiwiYmFja2dyb3VuZEJsdXJyaW5lc3MiLCJiYWNrZ3JvdW5kSW50ZW5zaXR5IiwiYmFja2dyb3VuZFJvdGF0aW9uIiwiZW52aXJvbm1lbnRJbnRlbnNpdHkiLCJlbnZpcm9ubWVudFJvdGF0aW9uIiwib3ZlcnJpZGVNYXRlcmlhbCIsIl9fVEhSRUVfREVWVE9PTFNfXyIsIkN1c3RvbUV2ZW50IiwiZGV0YWlsIiwiSW50ZXJsZWF2ZWRCdWZmZXIiLCJpc0ludGVybGVhdmVkQnVmZmVyIiwiaW50ZXJsZWF2ZWRCdWZmZXIiLCJhcnJheUJ1ZmZlcnMiLCJfdXVpZCIsImliIiwiX3ZlY3RvciQ3IiwiSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUiLCJpbnRlcmxlYXZlZEJ1ZmZlcnMiLCJTcHJpdGVNYXRlcmlhbCIsImlzU3ByaXRlTWF0ZXJpYWwiLCJfZ2VvbWV0cnkiLCJfaW50ZXJzZWN0UG9pbnQiLCJfd29ybGRTY2FsZSIsIl9tdlBvc2l0aW9uIiwiX2FsaWduZWRQb3NpdGlvbiIsIl9yb3RhdGVkUG9zaXRpb24iLCJfdmlld1dvcmxkTWF0cml4IiwiX3ZBIiwiX3ZCIiwiX3ZDIiwiX3V2QSIsIl91dkIiLCJfdXZDIiwiU3ByaXRlIiwiaXNTcHJpdGUiLCJmbG9hdDMyQXJyYXkiLCJ0cmFuc2Zvcm1WZXJ0ZXgiLCJ2ZXJ0ZXhQb3NpdGlvbiIsIm12UG9zaXRpb24iLCJfdjEkMiIsIl92MiQxIiwiTE9EIiwiaXNMT0QiLCJfY3VycmVudExldmVsIiwibGV2ZWxzIiwiYXV0b1VwZGF0ZSIsImxldmVsIiwiYWRkTGV2ZWwiLCJoeXN0ZXJlc2lzIiwicmVtb3ZlTGV2ZWwiLCJyZW1vdmVkRWxlbWVudHMiLCJnZXRDdXJyZW50TGV2ZWwiLCJnZXRPYmplY3RGb3JEaXN0YW5jZSIsImxldmVsRGlzdGFuY2UiLCJfYmFzZVBvc2l0aW9uIiwiX3NraW5JbmRleCIsIl9za2luV2VpZ2h0IiwiX3ZlY3RvcjMiLCJfbWF0cml4NCIsIl92ZXJ0ZXgiLCJfc3BoZXJlJDUiLCJfaW52ZXJzZU1hdHJpeCQyIiwiX3JheSQyIiwiU2tpbm5lZE1lc2giLCJiaW5kTWF0cml4SW52ZXJzZSIsImFwcGx5Qm9uZVRyYW5zZm9ybSIsImJpbmQiLCJjYWxjdWxhdGVJbnZlcnNlcyIsInBvc2UiLCJub3JtYWxpemVTa2luV2VpZ2h0cyIsInNraW5XZWlnaHQiLCJza2luSW5kZXgiLCJ3ZWlnaHQiLCJib25lSW5kZXgiLCJib25lcyIsImJvbmVJbnZlcnNlcyIsIkJvbmUiLCJpc0JvbmUiLCJEYXRhVGV4dHVyZSIsIl9vZmZzZXRNYXRyaXgiLCJfaWRlbnRpdHlNYXRyaXgiLCJTa2VsZXRvbiIsImJvbmVNYXRyaWNlcyIsImJvbmVUZXh0dXJlIiwiaW5pdCIsImludmVyc2UiLCJib25lIiwiY29tcHV0ZUJvbmVUZXh0dXJlIiwiZ2V0Qm9uZUJ5TmFtZSIsImpzb24iLCJib25lSW52ZXJzZSIsIkluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSIsIm1lc2hQZXJBdHRyaWJ1dGUiLCJpc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSIsIl9pbnN0YW5jZUxvY2FsTWF0cml4IiwiX2luc3RhbmNlV29ybGRNYXRyaXgiLCJfaW5zdGFuY2VJbnRlcnNlY3RzIiwiX2JveDMiLCJfaWRlbnRpdHkiLCJfbWVzaCQxIiwiX3NwaGVyZSQ0IiwiSW5zdGFuY2VkTWVzaCIsIm1vcnBoVGV4dHVyZSIsInNldE1hdHJpeEF0IiwiZ2V0TWF0cml4QXQiLCJnZXRDb2xvckF0IiwiZ2V0TW9ycGhBdCIsIm9iamVjdEluZmx1ZW5jZXMiLCJkYXRhSW5kZXgiLCJyYXljYXN0VGltZXMiLCJpbnN0YW5jZUlkIiwic2V0Q29sb3JBdCIsImZpbGwiLCJzZXRNb3JwaEF0IiwibW9ycGhJbmZsdWVuY2VzU3VtIiwibW9ycGhCYXNlSW5mbHVlbmNlIiwiX3ZlY3RvcjEiLCJfdmVjdG9yMiIsIl9ub3JtYWxNYXRyaXgiLCJQbGFuZSIsImlzUGxhbmUiLCJzZXRDb21wb25lbnRzIiwic2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQiLCJpbnZlcnNlTm9ybWFsTGVuZ3RoIiwiZGlzdGFuY2VUb1NwaGVyZSIsInByb2plY3RQb2ludCIsImludGVyc2VjdExpbmUiLCJsaW5lIiwiaW50ZXJzZWN0c0xpbmUiLCJzdGFydFNpZ24iLCJlbmRTaWduIiwiZW5kIiwiY29wbGFuYXJQb2ludCIsIm9wdGlvbmFsTm9ybWFsTWF0cml4IiwicmVmZXJlbmNlUG9pbnQiLCJfc3BoZXJlJDMiLCJfdmVjdG9yJDYiLCJGcnVzdHVtIiwicDQiLCJwNSIsInBsYW5lcyIsImZydXN0dW0iLCJzZXRGcm9tUHJvamVjdGlvbk1hdHJpeCIsIm1lMCIsIm1lMSIsIm1lMiIsIm1lMyIsIm1lNCIsIm1lNSIsIm1lNiIsIm1lNyIsIm1lOCIsIm1lOSIsIm1lMTAiLCJtZTExIiwibWUxMiIsIm1lMTMiLCJtZTE0IiwibWUxNSIsImludGVyc2VjdHNPYmplY3QiLCJpbnRlcnNlY3RzU3ByaXRlIiwic3ByaXRlIiwibmVnUmFkaXVzIiwiYXNjSWRTb3J0Iiwic29ydE9wYXF1ZSIsInNvcnRUcmFuc3BhcmVudCIsIk11bHRpRHJhd1JlbmRlckxpc3QiLCJwb29sIiwibGlzdCIsIml0ZW0iLCJyZXNldCIsIl9tYXRyaXgkMSIsIl93aGl0ZUNvbG9yIiwiX2ZydXN0dW0iLCJfYm94JDEiLCJfc3BoZXJlJDIiLCJfdmVjdG9yJDUiLCJfZm9yd2FyZCIsIl90ZW1wIiwiX3JlbmRlckxpc3QiLCJfbWVzaCIsIl9iYXRjaEludGVyc2VjdHMiLCJjb3B5QXR0cmlidXRlRGF0YSIsInRhcmdldE9mZnNldCIsInZlcnRleENvdW50IiwiY29weUFycmF5Q29udGVudHMiLCJCYXRjaGVkTWVzaCIsImN1c3RvbVNvcnQiLCJfaW5zdGFuY2VJbmZvIiwiX2dlb21ldHJ5SW5mbyIsIl9hdmFpbGFibGVJbnN0YW5jZUlkcyIsIl9hdmFpbGFibGVHZW9tZXRyeUlkcyIsIl9uZXh0SW5kZXhTdGFydCIsIl9uZXh0VmVydGV4U3RhcnQiLCJfdmlzaWJpbGl0eUNoYW5nZWQiLCJfbXVsdGlEcmF3Q291bnRzIiwiX211bHRpRHJhd1N0YXJ0cyIsIl9tdWx0aURyYXdDb3VudCIsIl9tdWx0aURyYXdJbnN0YW5jZXMiLCJfaW5kaXJlY3RUZXh0dXJlIiwiX2luaXRNYXRyaWNlc1RleHR1cmUiLCJfaW5pdEluZGlyZWN0VGV4dHVyZSIsImluc3RhbmNlQ291bnQiLCJ1bnVzZWRWZXJ0ZXhDb3VudCIsInVudXNlZEluZGV4Q291bnQiLCJtYXRyaWNlc0FycmF5IiwiaW5kaXJlY3RBcnJheSIsImluZGlyZWN0VGV4dHVyZSIsIl9pbml0Q29sb3JzVGV4dHVyZSIsImNvbG9yc0FycmF5IiwiX2luaXRpYWxpemVHZW9tZXRyeSIsInJlZmVyZW5jZSIsImF0dHJpYnV0ZU5hbWUiLCJzcmNBdHRyaWJ1dGUiLCJkc3RBcnJheSIsImRzdEF0dHJpYnV0ZSIsImluZGV4QXJyYXkiLCJfdmFsaWRhdGVHZW9tZXRyeSIsImJhdGNoR2VvbWV0cnkiLCJCb29sZWFuIiwidmFsaWRhdGVJbnN0YW5jZUlkIiwiaW5zdGFuY2VJbmZvIiwidmFsaWRhdGVHZW9tZXRyeUlkIiwiZ2VvbWV0cnlJZCIsImdlb21ldHJ5SW5mb0xpc3QiLCJzZXRDdXN0b21Tb3J0IiwiZnVuYyIsImdlb21ldHJ5SW5kZXgiLCJnZXRCb3VuZGluZ0JveEF0IiwiZ2V0Qm91bmRpbmdTcGhlcmVBdCIsImFkZEluc3RhbmNlIiwiZHJhd0lkIiwic29ydCIsInNoaWZ0IiwiYWRkR2VvbWV0cnkiLCJyZXNlcnZlZFZlcnRleENvdW50IiwicmVzZXJ2ZWRJbmRleENvdW50IiwiZ2VvbWV0cnlJbmZvIiwidmVydGV4U3RhcnQiLCJpbmRleFN0YXJ0IiwiaW5kZXhDb3VudCIsInNldEdlb21ldHJ5QXQiLCJoYXNJbmRleCIsImRzdEluZGV4Iiwic3JjSW5kZXgiLCJkZWxldGVHZW9tZXRyeSIsImRlbGV0ZUluc3RhbmNlIiwib3B0aW1pemUiLCJuZXh0VmVydGV4U3RhcnQiLCJuZXh0SW5kZXhTdGFydCIsImVsZW1lbnREZWx0YSIsImNvcHlXaXRoaW4iLCJpdiIsInNldFZpc2libGVBdCIsImdldFZpc2libGVBdCIsInNldEdlb21ldHJ5SWRBdCIsImdldEdlb21ldHJ5SWRBdCIsImdldEdlb21ldHJ5UmFuZ2VBdCIsInNldEluc3RhbmNlQ291bnQiLCJhdmFpbGFibGVJbnN0YW5jZUlkcyIsInBvcCIsIm11bHRpRHJhd0NvdW50cyIsIm11bHRpRHJhd1N0YXJ0cyIsInNldEdlb21ldHJ5U2l6ZSIsInZhbGlkUmFuZ2VzIiwiZmlsdGVyIiwiaW5mbyIsIm9sZEdlb21ldHJ5IiwiYmF0Y2hJZCIsImJ5dGVzUGVyRWxlbWVudCIsIkJZVEVTX1BFUl9FTEVNRU5UIiwibXVsdGlEcmF3Q291bnQiLCJjdWxsZWQiLCJzaGFkb3dDYW1lcmEiLCJkZXB0aE1hdGVyaWFsIiwiTGluZUJhc2ljTWF0ZXJpYWwiLCJpc0xpbmVCYXNpY01hdGVyaWFsIiwibGluZWNhcCIsImxpbmVqb2luIiwiX3ZTdGFydCIsIl92RW5kIiwiX2ludmVyc2VNYXRyaXgkMSIsIl9yYXkkMSIsIl9zcGhlcmUkMSIsIl9pbnRlcnNlY3RQb2ludE9uUmF5IiwiX2ludGVyc2VjdFBvaW50T25TZWdtZW50IiwiTGluZSIsImNvbXB1dGVMaW5lRGlzdGFuY2VzIiwibGluZURpc3RhbmNlcyIsInBhcmFtcyIsImxvY2FsVGhyZXNob2xkIiwibG9jYWxUaHJlc2hvbGRTcSIsImlzTGluZVNlZ21lbnRzIiwiY2hlY2tJbnRlcnNlY3Rpb24iLCJpc0xpbmVMb29wIiwidGhyZXNob2xkU3EiLCJfc3RhcnQiLCJfZW5kIiwiTGluZVNlZ21lbnRzIiwiTGluZUxvb3AiLCJQb2ludHNNYXRlcmlhbCIsImlzUG9pbnRzTWF0ZXJpYWwiLCJfaW52ZXJzZU1hdHJpeCIsIl9yYXkiLCJfc3BoZXJlIiwiX3Bvc2l0aW9uJDIiLCJQb2ludHMiLCJ0ZXN0UG9pbnQiLCJyYXlQb2ludERpc3RhbmNlU3EiLCJpbnRlcnNlY3RQb2ludCIsImRpc3RhbmNlVG9SYXkiLCJWaWRlb1RleHR1cmUiLCJ2aWRlbyIsImlzVmlkZW9UZXh0dXJlIiwicmVxdWVzdFZpZGVvRnJhbWVDYWxsYmFjayIsInVwZGF0ZVZpZGVvIiwicmVhZHlTdGF0ZSIsIkhBVkVfQ1VSUkVOVF9EQVRBIiwiVmlkZW9GcmFtZVRleHR1cmUiLCJpc1ZpZGVvRnJhbWVUZXh0dXJlIiwic2V0RnJhbWUiLCJGcmFtZWJ1ZmZlclRleHR1cmUiLCJpc0ZyYW1lYnVmZmVyVGV4dHVyZSIsIkNvbXByZXNzZWRUZXh0dXJlIiwiaXNDb21wcmVzc2VkVGV4dHVyZSIsIkNvbXByZXNzZWRBcnJheVRleHR1cmUiLCJpc0NvbXByZXNzZWRBcnJheVRleHR1cmUiLCJDb21wcmVzc2VkQ3ViZVRleHR1cmUiLCJpc0NvbXByZXNzZWRDdWJlVGV4dHVyZSIsIkNhbnZhc1RleHR1cmUiLCJpc0NhbnZhc1RleHR1cmUiLCJEZXB0aFRleHR1cmUiLCJpc0RlcHRoVGV4dHVyZSIsImNvbXBhcmVGdW5jdGlvbiIsIkN1cnZlIiwiYXJjTGVuZ3RoRGl2aXNpb25zIiwiY2FjaGVBcmNMZW5ndGhzIiwiZ2V0UG9pbnQiLCJnZXRQb2ludEF0Iiwib3B0aW9uYWxUYXJnZXQiLCJnZXRVdG9UbWFwcGluZyIsImdldFBvaW50cyIsImRpdmlzaW9ucyIsImdldFNwYWNlZFBvaW50cyIsImdldExlbmd0aCIsImxlbmd0aHMiLCJnZXRMZW5ndGhzIiwibGFzdCIsInN1bSIsInVwZGF0ZUFyY0xlbmd0aHMiLCJhcmNMZW5ndGhzIiwidGFyZ2V0QXJjTGVuZ3RoIiwiY29tcGFyaXNvbiIsImxlbmd0aEJlZm9yZSIsImdldFRhbmdlbnQiLCJ0MiIsInB0MSIsInB0MiIsImdldFRhbmdlbnRBdCIsImNvbXB1dGVGcmVuZXRGcmFtZXMiLCJzZWdtZW50cyIsImNsb3NlZCIsInRhbmdlbnRzIiwiYmlub3JtYWxzIiwidmVjIiwibWF0IiwiTUFYX1ZBTFVFIiwiRWxsaXBzZUN1cnZlIiwiYVgiLCJhWSIsInhSYWRpdXMiLCJ5UmFkaXVzIiwiYVN0YXJ0QW5nbGUiLCJhRW5kQW5nbGUiLCJhQ2xvY2t3aXNlIiwiYVJvdGF0aW9uIiwiaXNFbGxpcHNlQ3VydmUiLCJ0d29QaSIsImRlbHRhQW5nbGUiLCJzYW1lUG9pbnRzIiwiQXJjQ3VydmUiLCJhUmFkaXVzIiwiaXNBcmNDdXJ2ZSIsIkN1YmljUG9seSIsImMwIiwiaW5pdENhdG11bGxSb20iLCJ4MyIsInRlbnNpb24iLCJpbml0Tm9udW5pZm9ybUNhdG11bGxSb20iLCJkdDAiLCJkdDEiLCJkdDIiLCJjYWxjIiwicHgiLCJweSIsInB6IiwiQ2F0bXVsbFJvbUN1cnZlMyIsImN1cnZlVHlwZSIsImlzQ2F0bXVsbFJvbUN1cnZlMyIsImludFBvaW50IiwiQ2F0bXVsbFJvbSIsIlF1YWRyYXRpY0JlemllciIsImsiLCJRdWFkcmF0aWNCZXppZXJQMCIsIlF1YWRyYXRpY0JlemllclAxIiwiUXVhZHJhdGljQmV6aWVyUDIiLCJDdWJpY0JlemllciIsIkN1YmljQmV6aWVyUDAiLCJDdWJpY0JlemllclAxIiwiQ3ViaWNCZXppZXJQMiIsIkN1YmljQmV6aWVyUDMiLCJDdWJpY0JlemllckN1cnZlIiwiaXNDdWJpY0JlemllckN1cnZlIiwiQ3ViaWNCZXppZXJDdXJ2ZTMiLCJpc0N1YmljQmV6aWVyQ3VydmUzIiwiTGluZUN1cnZlIiwiaXNMaW5lQ3VydmUiLCJMaW5lQ3VydmUzIiwiaXNMaW5lQ3VydmUzIiwiUXVhZHJhdGljQmV6aWVyQ3VydmUiLCJpc1F1YWRyYXRpY0JlemllckN1cnZlIiwiUXVhZHJhdGljQmV6aWVyQ3VydmUzIiwiaXNRdWFkcmF0aWNCZXppZXJDdXJ2ZTMiLCJTcGxpbmVDdXJ2ZSIsImlzU3BsaW5lQ3VydmUiLCJDdXJ2ZVBhdGgiLCJjdXJ2ZXMiLCJhdXRvQ2xvc2UiLCJjdXJ2ZSIsImNsb3NlUGF0aCIsInN0YXJ0UG9pbnQiLCJlbmRQb2ludCIsImxpbmVUeXBlIiwiQ3VydmVzIiwiY3VydmVMZW5ndGhzIiwiZ2V0Q3VydmVMZW5ndGhzIiwiZGlmZiIsInNlZ21lbnRMZW5ndGgiLCJsZW5zIiwiY2FjaGVMZW5ndGhzIiwic3VtcyIsInJlc29sdXRpb24iLCJwdHMiLCJQYXRoIiwiY3VycmVudFBvaW50IiwibW92ZVRvIiwibGluZVRvIiwicXVhZHJhdGljQ3VydmVUbyIsImFDUHgiLCJhQ1B5IiwiYmV6aWVyQ3VydmVUbyIsImFDUDF4IiwiYUNQMXkiLCJhQ1AyeCIsImFDUDJ5Iiwic3BsaW5lVGhydSIsIm5wdHMiLCJhcmMiLCJhYnNhcmMiLCJhYnNlbGxpcHNlIiwiZWxsaXBzZSIsImZpcnN0UG9pbnQiLCJsYXN0UG9pbnQiLCJMYXRoZUdlb21ldHJ5IiwicGhpU3RhcnQiLCJwaGlMZW5ndGgiLCJpbml0Tm9ybWFscyIsImludmVyc2VTZWdtZW50cyIsInZlcnRleCIsImN1ck5vcm1hbCIsInByZXZOb3JtYWwiLCJiYXNlIiwiQ2Fwc3VsZUdlb21ldHJ5IiwiY2FwU2VnbWVudHMiLCJyYWRpYWxTZWdtZW50cyIsInBhdGgiLCJDaXJjbGVHZW9tZXRyeSIsInRoZXRhU3RhcnQiLCJ0aGV0YUxlbmd0aCIsInNlZ21lbnQiLCJDeWxpbmRlckdlb21ldHJ5IiwicmFkaXVzVG9wIiwicmFkaXVzQm90dG9tIiwib3BlbkVuZGVkIiwiaGFsZkhlaWdodCIsImdlbmVyYXRlQ2FwIiwiY2VudGVySW5kZXhTdGFydCIsImNlbnRlckluZGV4RW5kIiwiY29zVGhldGEiLCJzaW5UaGV0YSIsInNsb3BlIiwiaW5kZXhSb3ciLCJnZW5lcmF0ZVRvcnNvIiwiQ29uZUdlb21ldHJ5IiwiUG9seWhlZHJvbkdlb21ldHJ5IiwidmVydGV4QnVmZmVyIiwidXZCdWZmZXIiLCJzdWJkaXZpZGVGYWNlIiwiY29scyIsImFqIiwiYmoiLCJyb3dzIiwicHVzaFZlcnRleCIsImdldFZlcnRleEJ5SW5kZXgiLCJjb3JyZWN0VVYiLCJhemltdXRoIiwic3ViZGl2aWRlIiwiYXBwbHlSYWRpdXMiLCJjZW50cm9pZCIsImF6aSIsImNvcnJlY3RVVnMiLCJjb3JyZWN0U2VhbSIsImdlbmVyYXRlVVZzIiwiZGV0YWlscyIsIkRvZGVjYWhlZHJvbkdlb21ldHJ5IiwiX3YwIiwiX3YxJDEiLCJfbm9ybWFsIiwiX3RyaWFuZ2xlIiwiRWRnZXNHZW9tZXRyeSIsInRocmVzaG9sZEFuZ2xlIiwicHJlY2lzaW9uUG9pbnRzIiwidGhyZXNob2xkRG90IiwiaW5kZXhBdHRyIiwicG9zaXRpb25BdHRyIiwiaW5kZXhBcnIiLCJ2ZXJ0S2V5cyIsImhhc2hlcyIsImVkZ2VEYXRhIiwiak5leHQiLCJ2ZWNIYXNoMCIsInZlY0hhc2gxIiwiaGFzaCIsInJldmVyc2VIYXNoIiwiaW5kZXgwIiwiU2hhcGUiLCJob2xlcyIsImdldFBvaW50c0hvbGVzIiwiaG9sZXNQdHMiLCJleHRyYWN0UG9pbnRzIiwiaG9sZSIsImVhcmN1dCIsImhvbGVJbmRpY2VzIiwiZGltIiwiaGFzSG9sZXMiLCJvdXRlckxlbiIsIm91dGVyTm9kZSIsImxpbmtlZExpc3QiLCJ0cmlhbmdsZXMiLCJuZXh0IiwicHJldiIsIm1pblgiLCJtaW5ZIiwiaW52U2l6ZSIsInF1ZXVlIiwic3RlaW5lciIsImdldExlZnRtb3N0IiwiY29tcGFyZVhZU2xvcGUiLCJlbGltaW5hdGVIb2xlIiwiZWxpbWluYXRlSG9sZXMiLCJtYXhYIiwibWF4WSIsImVhcmN1dExpbmtlZCIsImNsb2Nrd2lzZSIsInNpZ25lZEFyZWEiLCJpbnNlcnROb2RlIiwicmVtb3ZlTm9kZSIsImZpbHRlclBvaW50cyIsImFnYWluIiwiYXJlYSIsImVhciIsInBhc3MiLCJ6T3JkZXIiLCJwcmV2WiIsIm5leHRaIiwibnVtTWVyZ2VzIiwiaW5TaXplIiwidGFpbCIsInBTaXplIiwicVNpemUiLCJzb3J0TGlua2VkIiwiaW5kZXhDdXJ2ZSIsInN0b3AiLCJpc0Vhckhhc2hlZCIsImlzRWFyIiwiY3VyZUxvY2FsSW50ZXJzZWN0aW9ucyIsInNwbGl0RWFyY3V0IiwicG9pbnRJblRyaWFuZ2xlRXhjZXB0Rmlyc3QiLCJtaW5aIiwibWF4WiIsImxvY2FsbHlJbnNpZGUiLCJpc1ZhbGlkRGlhZ29uYWwiLCJzcGxpdFBvbHlnb24iLCJicmlkZ2UiLCJoeCIsImh5IiwibXgiLCJteSIsInRhbk1pbiIsInBvaW50SW5UcmlhbmdsZSIsInNlY3RvckNvbnRhaW5zU2VjdG9yIiwiZmluZEhvbGVCcmlkZ2UiLCJicmlkZ2VSZXZlcnNlIiwibGVmdG1vc3QiLCJpbnRlcnNlY3RzUG9seWdvbiIsImluc2lkZSIsIm1pZGRsZUluc2lkZSIsInExIiwicTIiLCJvMSIsIm8yIiwibzMiLCJvNCIsIm9uU2VnbWVudCIsIm51bSIsImNyZWF0ZU5vZGUiLCJhbiIsImJwIiwiRWFyY3V0IiwidHJpYW5ndWxhdGUiLCJTaGFwZVV0aWxzIiwiY29udG91ciIsImlzQ2xvY2tXaXNlIiwidHJpYW5ndWxhdGVTaGFwZSIsImZhY2VzIiwicmVtb3ZlRHVwRW5kUHRzIiwiYWRkQ29udG91ciIsImhvbGVJbmRleCIsImZvckVhY2giLCJFeHRydWRlR2VvbWV0cnkiLCJ2ZXJ0aWNlc0FycmF5IiwidXZBcnJheSIsImFkZFNoYXBlIiwicGxhY2Vob2xkZXIiLCJjdXJ2ZVNlZ21lbnRzIiwic3RlcHMiLCJiZXZlbEVuYWJsZWQiLCJiZXZlbFRoaWNrbmVzcyIsImJldmVsU2l6ZSIsImJldmVsT2Zmc2V0IiwiYmV2ZWxTZWdtZW50cyIsImV4dHJ1ZGVQYXRoIiwidXZnZW4iLCJVVkdlbmVyYXRvciIsIldvcmxkVVZHZW5lcmF0b3IiLCJleHRydWRlUHRzIiwic3BsaW5lVHViZSIsImJpbm9ybWFsIiwicG9zaXRpb24yIiwiZXh0cnVkZUJ5UGF0aCIsInNoYXBlUG9pbnRzIiwicmV2ZXJzZSIsImhsIiwiYWhvbGUiLCJtZXJnZU92ZXJsYXBwaW5nUG9pbnRzIiwiVEhSRVNIT0xEX1NRIiwicHJldlBvcyIsImN1cnJlbnRJbmRleCIsImN1cnJlbnRQb3MiLCJkaXN0U3EiLCJzY2FsaW5nRmFjdG9yU3FydCIsIm51bUhvbGVzIiwic2NhbGVQdDIiLCJwdCIsInZsZW4iLCJnZXRCZXZlbFZlYyIsImluUHQiLCJpblByZXYiLCJpbk5leHQiLCJ2X3RyYW5zX3giLCJ2X3RyYW5zX3kiLCJzaHJpbmtfYnkiLCJ2X3ByZXZfeCIsInZfcHJldl95Iiwidl9uZXh0X3giLCJ2X25leHRfeSIsInZfcHJldl9sZW5zcSIsImNvbGxpbmVhcjAiLCJ2X3ByZXZfbGVuIiwidl9uZXh0X2xlbiIsInB0UHJldlNoaWZ0X3giLCJwdFByZXZTaGlmdF95Iiwic2YiLCJ2X3RyYW5zX2xlbnNxIiwiZGlyZWN0aW9uX2VxIiwiY29udG91ck1vdmVtZW50cyIsImhvbGVzTW92ZW1lbnRzIiwib25lSG9sZU1vdmVtZW50cyIsInZlcnRpY2VzTW92ZW1lbnRzIiwiY29udHJhY3RlZENvbnRvdXJWZXJ0aWNlcyIsImV4cGFuZGVkSG9sZVZlcnRpY2VzIiwiYnMiLCJ2ZXJ0Iiwib25lSG9sZVZlcnRpY2VzIiwiZmxlbiIsInNpZGV3YWxscyIsImxheWVyb2Zmc2V0Iiwic2wiLCJzbGVuMSIsInNsZW4yIiwiZjQiLCJmMyIsImFkZFZlcnRleCIsIm5leHRJbmRleCIsImdlbmVyYXRlVG9wVVYiLCJhZGRVViIsImdlbmVyYXRlU2lkZVdhbGxVViIsInZlY3RvcjIiLCJidWlsZExpZEZhY2VzIiwiYnVpbGRTaWRlRmFjZXMiLCJ0b0pTT04kMSIsImdlb21ldHJ5U2hhcGVzIiwiaW5kZXhBIiwiaW5kZXhCIiwiaW5kZXhDIiwiYV94IiwiYV95IiwiYl94IiwiYl95IiwiY194IiwiY195IiwiaW5kZXhEIiwiYV96IiwiYl96IiwiY196IiwiZF94IiwiZF95IiwiZF96IiwiSWNvc2FoZWRyb25HZW9tZXRyeSIsIk9jdGFoZWRyb25HZW9tZXRyeSIsIlBsYW5lR2VvbWV0cnkiLCJ3aWR0aF9oYWxmIiwiaGVpZ2h0X2hhbGYiLCJzZWdtZW50X3dpZHRoIiwic2VnbWVudF9oZWlnaHQiLCJSaW5nR2VvbWV0cnkiLCJpbm5lclJhZGl1cyIsIm91dGVyUmFkaXVzIiwidGhldGFTZWdtZW50cyIsInBoaVNlZ21lbnRzIiwicmFkaXVzU3RlcCIsInRoZXRhU2VnbWVudExldmVsIiwiU2hhcGVHZW9tZXRyeSIsImluZGV4T2Zmc2V0Iiwic2hhcGVWZXJ0aWNlcyIsInNoYXBlSG9sZXMiLCJzaGFwZUhvbGUiLCJTcGhlcmVHZW9tZXRyeSIsInRoZXRhRW5kIiwiZ3JpZCIsInZlcnRpY2VzUm93IiwidU9mZnNldCIsIlRldHJhaGVkcm9uR2VvbWV0cnkiLCJUb3J1c0dlb21ldHJ5IiwidHViZSIsInR1YnVsYXJTZWdtZW50cyIsIlRvcnVzS25vdEdlb21ldHJ5IiwiUDEiLCJQMiIsIkIiLCJUIiwiTiIsImNhbGN1bGF0ZVBvc2l0aW9uT25DdXJ2ZSIsImN1Iiwic3UiLCJxdU92ZXJQIiwiY3MiLCJUdWJlR2VvbWV0cnkiLCJmcmFtZXMiLCJQIiwiZ2VuZXJhdGVTZWdtZW50IiwiZ2VuZXJhdGVJbmRpY2VzIiwiZ2VuZXJhdGVCdWZmZXJEYXRhIiwiV2lyZWZyYW1lR2VvbWV0cnkiLCJlZGdlcyIsIm8iLCJvbCIsImlzVW5pcXVlRWRnZSIsImhhc2gxIiwiaGFzaDIiLCJoYXMiLCJTaGFkb3dNYXRlcmlhbCIsImlzU2hhZG93TWF0ZXJpYWwiLCJSYXdTaGFkZXJNYXRlcmlhbCIsImlzUmF3U2hhZGVyTWF0ZXJpYWwiLCJNZXNoU3RhbmRhcmRNYXRlcmlhbCIsImlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwiLCJTVEFOREFSRCIsIk1lc2hQaHlzaWNhbE1hdGVyaWFsIiwiaXNNZXNoUGh5c2ljYWxNYXRlcmlhbCIsIlBIWVNJQ0FMIiwiaW9yIiwiZ2V0Iiwic2hlZW5Db2xvck1hcCIsInNoZWVuUm91Z2huZXNzTWFwIiwiX2FuaXNvdHJvcHkiLCJfY2xlYXJjb2F0IiwiX2Rpc3BlcnNpb24iLCJfaXJpZGVzY2VuY2UiLCJfc2hlZW4iLCJfdHJhbnNtaXNzaW9uIiwiTWVzaFBob25nTWF0ZXJpYWwiLCJpc01lc2hQaG9uZ01hdGVyaWFsIiwiTWVzaFRvb25NYXRlcmlhbCIsImlzTWVzaFRvb25NYXRlcmlhbCIsIlRPT04iLCJNZXNoTm9ybWFsTWF0ZXJpYWwiLCJpc01lc2hOb3JtYWxNYXRlcmlhbCIsIk1lc2hMYW1iZXJ0TWF0ZXJpYWwiLCJpc01lc2hMYW1iZXJ0TWF0ZXJpYWwiLCJNZXNoRGVwdGhNYXRlcmlhbCIsImlzTWVzaERlcHRoTWF0ZXJpYWwiLCJkZXB0aFBhY2tpbmciLCJNZXNoRGlzdGFuY2VNYXRlcmlhbCIsImlzTWVzaERpc3RhbmNlTWF0ZXJpYWwiLCJNZXNoTWF0Y2FwTWF0ZXJpYWwiLCJpc01lc2hNYXRjYXBNYXRlcmlhbCIsIk1BVENBUCIsIkxpbmVEYXNoZWRNYXRlcmlhbCIsImlzTGluZURhc2hlZE1hdGVyaWFsIiwiY29udmVydEFycmF5IiwiaXNUeXBlZEFycmF5IiwiaXNWaWV3IiwiRGF0YVZpZXciLCJnZXRLZXlmcmFtZU9yZGVyIiwidGltZXMiLCJzb3J0ZWRBcnJheSIsIm5WYWx1ZXMiLCJzcmNPZmZzZXQiLCJmbGF0dGVuSlNPTiIsImpzb25LZXlzIiwidmFsdWVQcm9wZXJ0eU5hbWUiLCJ0aW1lIiwiQW5pbWF0aW9uVXRpbHMiLCJzdWJjbGlwIiwic291cmNlQ2xpcCIsInN0YXJ0RnJhbWUiLCJlbmRGcmFtZSIsImZwcyIsImNsaXAiLCJ0cmFja3MiLCJ0cmFjayIsInZhbHVlU2l6ZSIsImdldFZhbHVlU2l6ZSIsIm1pblN0YXJ0VGltZSIsInJlc2V0RHVyYXRpb24iLCJtYWtlQ2xpcEFkZGl0aXZlIiwidGFyZ2V0Q2xpcCIsInJlZmVyZW5jZUZyYW1lIiwicmVmZXJlbmNlQ2xpcCIsIm51bVRyYWNrcyIsInJlZmVyZW5jZVRpbWUiLCJyZWZlcmVuY2VUcmFjayIsInJlZmVyZW5jZVRyYWNrVHlwZSIsIlZhbHVlVHlwZU5hbWUiLCJ0YXJnZXRUcmFjayIsImZpbmQiLCJyZWZlcmVuY2VPZmZzZXQiLCJyZWZlcmVuY2VWYWx1ZVNpemUiLCJjcmVhdGVJbnRlcnBvbGFudCIsImlzSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kR0xURkN1YmljU3BsaW5lIiwidGFyZ2V0VmFsdWVTaXplIiwibGFzdEluZGV4IiwicmVmZXJlbmNlVmFsdWUiLCJzdGFydEluZGV4IiwiZW5kSW5kZXgiLCJpbnRlcnBvbGFudCIsImV2YWx1YXRlIiwicmVzdWx0QnVmZmVyIiwibnVtVGltZXMiLCJ2YWx1ZVN0YXJ0IiwidmFsdWVFbmQiLCJibGVuZE1vZGUiLCJJbnRlcnBvbGFudCIsInBhcmFtZXRlclBvc2l0aW9ucyIsInNhbXBsZVZhbHVlcyIsInNhbXBsZVNpemUiLCJfY2FjaGVkSW5kZXgiLCJzZXR0aW5ncyIsIkRlZmF1bHRTZXR0aW5nc18iLCJwcCIsInZhbGlkYXRlX2ludGVydmFsIiwic2VlayIsImxpbmVhcl9zY2FuIiwiZm9yd2FyZF9zY2FuIiwiZ2l2ZVVwQXQiLCJjb3B5U2FtcGxlVmFsdWVfIiwidDFnbG9iYWwiLCJtaWQiLCJpbnRlcnZhbENoYW5nZWRfIiwiaW50ZXJwb2xhdGVfIiwiZ2V0U2V0dGluZ3NfIiwiQ3ViaWNJbnRlcnBvbGFudCIsIl93ZWlnaHRQcmV2IiwiX29mZnNldFByZXYiLCJfd2VpZ2h0TmV4dCIsIl9vZmZzZXROZXh0IiwiZW5kaW5nU3RhcnQiLCJlbmRpbmdFbmQiLCJpUHJldiIsImlOZXh0IiwidFByZXYiLCJ0TmV4dCIsImhhbGZEdCIsIm8wIiwib1AiLCJvTiIsIndQIiwid04iLCJwcHAiLCJzUCIsInNOIiwiTGluZWFySW50ZXJwb2xhbnQiLCJvZmZzZXQxIiwib2Zmc2V0MCIsIndlaWdodDEiLCJ3ZWlnaHQwIiwiRGlzY3JldGVJbnRlcnBvbGFudCIsIktleWZyYW1lVHJhY2siLCJpbnRlcnBvbGF0aW9uIiwiVGltZUJ1ZmZlclR5cGUiLCJWYWx1ZUJ1ZmZlclR5cGUiLCJzZXRJbnRlcnBvbGF0aW9uIiwiRGVmYXVsdEludGVycG9sYXRpb24iLCJ0cmFja1R5cGUiLCJJbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZSIsIkludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhciIsIkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aCIsImZhY3RvcnlNZXRob2QiLCJ0aW1lT2Zmc2V0IiwidGltZVNjYWxlIiwidHJpbSIsInN0YXJ0VGltZSIsImVuZFRpbWUiLCJuS2V5cyIsInRvIiwidmFsaWRhdGUiLCJ2YWxpZCIsInByZXZUaW1lIiwiY3VyclRpbWUiLCJzbW9vdGhJbnRlcnBvbGF0aW9uIiwid3JpdGVJbmRleCIsImtlZXAiLCJvZmZzZXRQIiwib2Zmc2V0TiIsInJlYWRPZmZzZXQiLCJ3cml0ZU9mZnNldCIsIlR5cGVkS2V5ZnJhbWVUcmFjayIsIkJvb2xlYW5LZXlmcmFtZVRyYWNrIiwiQ29sb3JLZXlmcmFtZVRyYWNrIiwiTnVtYmVyS2V5ZnJhbWVUcmFjayIsIlF1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudCIsIlF1YXRlcm5pb25LZXlmcmFtZVRyYWNrIiwiU3RyaW5nS2V5ZnJhbWVUcmFjayIsIlZlY3RvcktleWZyYW1lVHJhY2siLCJBbmltYXRpb25DbGlwIiwiZHVyYXRpb24iLCJqc29uVHJhY2tzIiwiZnJhbWVUaW1lIiwicGFyc2VLZXlmcmFtZVRyYWNrIiwiY2xpcFRyYWNrcyIsIkNyZWF0ZUZyb21Nb3JwaFRhcmdldFNlcXVlbmNlIiwibW9ycGhUYXJnZXRTZXF1ZW5jZSIsIm5vTG9vcCIsIm51bU1vcnBoVGFyZ2V0cyIsImZpbmRCeU5hbWUiLCJvYmplY3RPckNsaXBBcnJheSIsImNsaXBBcnJheSIsIkNyZWF0ZUNsaXBzRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2VzIiwibW9ycGhUYXJnZXRzIiwiYW5pbWF0aW9uVG9Nb3JwaFRhcmdldHMiLCJwYXR0ZXJuIiwibW9ycGhUYXJnZXQiLCJwYXJ0cyIsIm1hdGNoIiwiYW5pbWF0aW9uTW9ycGhUYXJnZXRzIiwiY2xpcHMiLCJwYXJzZUFuaW1hdGlvbiIsImFkZE5vbmVtcHR5VHJhY2siLCJ0cmFja05hbWUiLCJhbmltYXRpb25LZXlzIiwicHJvcGVydHlOYW1lIiwiZGVzdFRyYWNrcyIsImNsaXBOYW1lIiwiaGllcmFyY2h5VHJhY2tzIiwiaGllcmFyY2h5IiwibW9ycGhUYXJnZXROYW1lcyIsIm1vcnBoVGFyZ2V0TmFtZSIsImFuaW1hdGlvbktleSIsImJvbmVOYW1lIiwidHlwZU5hbWUiLCJnZXRUcmFja1R5cGVGb3JWYWx1ZVR5cGVOYW1lIiwiQ2FjaGUiLCJmaWxlcyIsImZpbGUiLCJMb2FkaW5nTWFuYWdlciIsIm9uTG9hZCIsIm9uUHJvZ3Jlc3MiLCJvbkVycm9yIiwidXJsTW9kaWZpZXIiLCJpc0xvYWRpbmciLCJpdGVtc0xvYWRlZCIsIml0ZW1zVG90YWwiLCJoYW5kbGVycyIsIm9uU3RhcnQiLCJpdGVtU3RhcnQiLCJpdGVtRW5kIiwiaXRlbUVycm9yIiwicmVzb2x2ZVVSTCIsInNldFVSTE1vZGlmaWVyIiwiYWRkSGFuZGxlciIsInJlZ2V4IiwibG9hZGVyIiwicmVtb3ZlSGFuZGxlciIsImdldEhhbmRsZXIiLCJnbG9iYWwiLCJEZWZhdWx0TG9hZGluZ01hbmFnZXIiLCJMb2FkZXIiLCJtYW5hZ2VyIiwiY3Jvc3NPcmlnaW4iLCJ3aXRoQ3JlZGVudGlhbHMiLCJyZXNvdXJjZVBhdGgiLCJyZXF1ZXN0SGVhZGVyIiwibG9hZCIsImxvYWRBc3luYyIsInNldENyb3NzT3JpZ2luIiwic2V0V2l0aENyZWRlbnRpYWxzIiwic2V0UGF0aCIsInNldFJlc291cmNlUGF0aCIsInNldFJlcXVlc3RIZWFkZXIiLCJERUZBVUxUX01BVEVSSUFMX05BTUUiLCJsb2FkaW5nIiwiSHR0cEVycm9yIiwicmVzcG9uc2UiLCJGaWxlTG9hZGVyIiwibWltZVR5cGUiLCJyZXNwb25zZVR5cGUiLCJjYWNoZWQiLCJyZXEiLCJSZXF1ZXN0IiwiaGVhZGVycyIsIkhlYWRlcnMiLCJjcmVkZW50aWFscyIsImZldGNoIiwidGhlbiIsInN0YXR1cyIsIlJlYWRhYmxlU3RyZWFtIiwiYm9keSIsImdldFJlYWRlciIsImNhbGxiYWNrcyIsInJlYWRlciIsImNvbnRlbnRMZW5ndGgiLCJ0b3RhbCIsImxlbmd0aENvbXB1dGFibGUiLCJsb2FkZWQiLCJzdHJlYW0iLCJjb250cm9sbGVyIiwicmVhZERhdGEiLCJyZWFkIiwiZG9uZSIsImNsb3NlIiwiYnl0ZUxlbmd0aCIsIlByb2dyZXNzRXZlbnQiLCJlbnF1ZXVlIiwiUmVzcG9uc2UiLCJzdGF0dXNUZXh0IiwiYXJyYXlCdWZmZXIiLCJibG9iIiwidGV4dCIsIkRPTVBhcnNlciIsInBhcnNlRnJvbVN0cmluZyIsImxhYmVsIiwiZGVjb2RlciIsIlRleHREZWNvZGVyIiwiZGVjb2RlIiwiY2F0Y2giLCJlcnIiLCJmaW5hbGx5Iiwic2V0UmVzcG9uc2VUeXBlIiwic2V0TWltZVR5cGUiLCJBbmltYXRpb25Mb2FkZXIiLCJDb21wcmVzc2VkVGV4dHVyZUxvYWRlciIsImxvYWRUZXh0dXJlIiwidGV4RGF0YXMiLCJtaXBtYXBDb3VudCIsImlzQ3ViZW1hcCIsIkltYWdlTG9hZGVyIiwib25JbWFnZUxvYWQiLCJyZW1vdmVFdmVudExpc3RlbmVycyIsIm9uSW1hZ2VFcnJvciIsIkN1YmVUZXh0dXJlTG9hZGVyIiwidXJscyIsIkRhdGFUZXh0dXJlTG9hZGVyIiwidGV4RGF0YSIsIlRleHR1cmVMb2FkZXIiLCJMaWdodCIsImludGVuc2l0eSIsImdyb3VuZENvbG9yIiwiZGVjYXkiLCJwZW51bWJyYSIsInNoYWRvdyIsIkhlbWlzcGhlcmVMaWdodCIsInNreUNvbG9yIiwiaXNIZW1pc3BoZXJlTGlnaHQiLCJfcHJvalNjcmVlbk1hdHJpeCQxIiwiX2xpZ2h0UG9zaXRpb25Xb3JsZCQxIiwiX2xvb2tUYXJnZXQkMSIsIkxpZ2h0U2hhZG93IiwiYmlhcyIsIm5vcm1hbEJpYXMiLCJibHVyU2FtcGxlcyIsIm1hcFNpemUiLCJtYXBQYXNzIiwiX2ZyYW1lRXh0ZW50cyIsIl92aWV3cG9ydENvdW50IiwiX3ZpZXdwb3J0cyIsImdldFZpZXdwb3J0Q291bnQiLCJnZXRGcnVzdHVtIiwidXBkYXRlTWF0cmljZXMiLCJsaWdodCIsInNoYWRvd01hdHJpeCIsImdldFZpZXdwb3J0Iiwidmlld3BvcnRJbmRleCIsImdldEZyYW1lRXh0ZW50cyIsIlNwb3RMaWdodFNoYWRvdyIsImlzU3BvdExpZ2h0U2hhZG93IiwiU3BvdExpZ2h0IiwiaXNTcG90TGlnaHQiLCJwb3dlciIsIl9wcm9qU2NyZWVuTWF0cml4IiwiX2xpZ2h0UG9zaXRpb25Xb3JsZCIsIl9sb29rVGFyZ2V0IiwiUG9pbnRMaWdodFNoYWRvdyIsImlzUG9pbnRMaWdodFNoYWRvdyIsIl9jdWJlRGlyZWN0aW9ucyIsIl9jdWJlVXBzIiwiUG9pbnRMaWdodCIsImlzUG9pbnRMaWdodCIsIk9ydGhvZ3JhcGhpY0NhbWVyYSIsImlzT3J0aG9ncmFwaGljQ2FtZXJhIiwic2NhbGVXIiwic2NhbGVIIiwiRGlyZWN0aW9uYWxMaWdodFNoYWRvdyIsImlzRGlyZWN0aW9uYWxMaWdodFNoYWRvdyIsIkRpcmVjdGlvbmFsTGlnaHQiLCJpc0RpcmVjdGlvbmFsTGlnaHQiLCJBbWJpZW50TGlnaHQiLCJpc0FtYmllbnRMaWdodCIsIlJlY3RBcmVhTGlnaHQiLCJpc1JlY3RBcmVhTGlnaHQiLCJTcGhlcmljYWxIYXJtb25pY3MzIiwiaXNTcGhlcmljYWxIYXJtb25pY3MzIiwiY29lZmZpY2llbnRzIiwiemVybyIsImdldEF0IiwiY29lZmYiLCJnZXRJcnJhZGlhbmNlQXQiLCJzaCIsImFkZFNjYWxlZFNIIiwiZ2V0QmFzaXNBdCIsInNoQmFzaXMiLCJMaWdodFByb2JlIiwiaXNMaWdodFByb2JlIiwiTWF0ZXJpYWxMb2FkZXIiLCJnZXRUZXh0dXJlIiwiY3JlYXRlTWF0ZXJpYWxGcm9tVHlwZSIsInVuaWZvcm0iLCJzZXRUZXh0dXJlcyIsIkxvYWRlclV0aWxzIiwiZXh0cmFjdFVybEJhc2UiLCJsYXN0SW5kZXhPZiIsInJlcGxhY2UiLCJJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSIsImlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkiLCJCdWZmZXJHZW9tZXRyeUxvYWRlciIsImludGVybGVhdmVkQnVmZmVyTWFwIiwiYXJyYXlCdWZmZXJNYXAiLCJnZXRJbnRlcmxlYXZlZEJ1ZmZlciIsImdldEFycmF5QnVmZmVyIiwidHlwZWRBcnJheSIsImJ1ZmZlckF0dHJpYnV0ZSIsImRyYXdjYWxscyIsIm9mZnNldHMiLCJPYmplY3RMb2FkZXIiLCJwYXJzZUFzeW5jIiwicGFyc2VBbmltYXRpb25zIiwicGFyc2VTaGFwZXMiLCJwYXJzZUdlb21ldHJpZXMiLCJwYXJzZUltYWdlcyIsInBhcnNlVGV4dHVyZXMiLCJwYXJzZU1hdGVyaWFscyIsInBhcnNlT2JqZWN0IiwicGFyc2VTa2VsZXRvbnMiLCJiaW5kU2tlbGV0b25zIiwiYmluZExpZ2h0VGFyZ2V0cyIsImhhc0ltYWdlcyIsInBhcnNlSW1hZ2VzQXN5bmMiLCJidWZmZXJHZW9tZXRyeUxvYWRlciIsIkdlb21ldHJpZXMiLCJkZXNlcmlhbGl6ZUltYWdlIiwibG9hZEltYWdlIiwiaW1hZ2VBcnJheSIsImRlc2VyaWFsaXplZEltYWdlIiwiYXN5bmMiLCJjdXJyZW50VXJsIiwicGFyc2VDb25zdGFudCIsIlRFWFRVUkVfTUFQUElORyIsIlRFWFRVUkVfV1JBUFBJTkciLCJURVhUVVJFX0ZJTFRFUiIsImdldEdlb21ldHJ5IiwiZ2V0TWF0ZXJpYWwiLCJpc0ludGVnZXIiLCJvYmplY3RBbmltYXRpb25zIiwiSW1hZ2VCaXRtYXBMb2FkZXIiLCJpc0ltYWdlQml0bWFwTG9hZGVyIiwiY3JlYXRlSW1hZ2VCaXRtYXAiLCJzZXRPcHRpb25zIiwiaW1hZ2VCaXRtYXAiLCJmZXRjaE9wdGlvbnMiLCJwcm9taXNlIiwicmVzIiwiY29sb3JTcGFjZUNvbnZlcnNpb24iLCJfY29udGV4dCIsIkF1ZGlvQ29udGV4dCIsIndpbmRvdyIsIndlYmtpdEF1ZGlvQ29udGV4dCIsInNldENvbnRleHQiLCJBdWRpb0xvYWRlciIsImhhbmRsZUVycm9yIiwiYnVmZmVyQ29weSIsImRlY29kZUF1ZGlvRGF0YSIsImF1ZGlvQnVmZmVyIiwiX2V5ZVJpZ2h0IiwiX2V5ZUxlZnQiLCJfcHJvamVjdGlvbk1hdHJpeCIsIlN0ZXJlb0NhbWVyYSIsImV5ZVNlcCIsImNhbWVyYUwiLCJjYW1lcmFSIiwiZXllU2VwSGFsZiIsImV5ZVNlcE9uUHJvamVjdGlvbiIsInltYXgiLCJ4bWluIiwieG1heCIsIkFycmF5Q2FtZXJhIiwiaXNBcnJheUNhbWVyYSIsIkNsb2NrIiwiYXV0b1N0YXJ0Iiwib2xkVGltZSIsImVsYXBzZWRUaW1lIiwicnVubmluZyIsIm5vdyIsImdldEVsYXBzZWRUaW1lIiwiZ2V0RGVsdGEiLCJuZXdUaW1lIiwicGVyZm9ybWFuY2UiLCJfcG9zaXRpb24kMSIsIl9xdWF0ZXJuaW9uJDEiLCJfc2NhbGUkMSIsIl9vcmllbnRhdGlvbiQxIiwiQXVkaW9MaXN0ZW5lciIsImdhaW4iLCJjcmVhdGVHYWluIiwiZGVzdGluYXRpb24iLCJ0aW1lRGVsdGEiLCJfY2xvY2siLCJnZXRJbnB1dCIsInJlbW92ZUZpbHRlciIsImdldEZpbHRlciIsInNldEZpbHRlciIsImdldE1hc3RlclZvbHVtZSIsInNldE1hc3RlclZvbHVtZSIsInNldFRhcmdldEF0VGltZSIsImN1cnJlbnRUaW1lIiwicG9zaXRpb25YIiwibGluZWFyUmFtcFRvVmFsdWVBdFRpbWUiLCJwb3NpdGlvblkiLCJwb3NpdGlvbloiLCJmb3J3YXJkWCIsImZvcndhcmRZIiwiZm9yd2FyZFoiLCJ1cFgiLCJ1cFkiLCJ1cFoiLCJzZXRPcmllbnRhdGlvbiIsIkF1ZGlvIiwiYXV0b3BsYXkiLCJkZXR1bmUiLCJsb29wIiwibG9vcFN0YXJ0IiwibG9vcEVuZCIsInBsYXliYWNrUmF0ZSIsImlzUGxheWluZyIsImhhc1BsYXliYWNrQ29udHJvbCIsInNvdXJjZVR5cGUiLCJfc3RhcnRlZEF0IiwiX3Byb2dyZXNzIiwiX2Nvbm5lY3RlZCIsImZpbHRlcnMiLCJnZXRPdXRwdXQiLCJzZXROb2RlU291cmNlIiwiYXVkaW9Ob2RlIiwic2V0TWVkaWFFbGVtZW50U291cmNlIiwibWVkaWFFbGVtZW50IiwiY3JlYXRlTWVkaWFFbGVtZW50U291cmNlIiwic2V0TWVkaWFTdHJlYW1Tb3VyY2UiLCJtZWRpYVN0cmVhbSIsImNyZWF0ZU1lZGlhU3RyZWFtU291cmNlIiwic2V0QnVmZmVyIiwicGxheSIsImRlbGF5IiwiY3JlYXRlQnVmZmVyU291cmNlIiwib25lbmRlZCIsIm9uRW5kZWQiLCJzZXREZXR1bmUiLCJzZXRQbGF5YmFja1JhdGUiLCJwYXVzZSIsImdldEZpbHRlcnMiLCJzZXRGaWx0ZXJzIiwiZ2V0RGV0dW5lIiwiZ2V0UGxheWJhY2tSYXRlIiwiZ2V0TG9vcCIsInNldExvb3AiLCJzZXRMb29wU3RhcnQiLCJzZXRMb29wRW5kIiwiZ2V0Vm9sdW1lIiwic2V0Vm9sdW1lIiwiX3Bvc2l0aW9uIiwiX3F1YXRlcm5pb24iLCJfc2NhbGUiLCJfb3JpZW50YXRpb24iLCJQb3NpdGlvbmFsQXVkaW8iLCJwYW5uZXIiLCJjcmVhdGVQYW5uZXIiLCJwYW5uaW5nTW9kZWwiLCJnZXRSZWZEaXN0YW5jZSIsInJlZkRpc3RhbmNlIiwic2V0UmVmRGlzdGFuY2UiLCJnZXRSb2xsb2ZmRmFjdG9yIiwicm9sbG9mZkZhY3RvciIsInNldFJvbGxvZmZGYWN0b3IiLCJnZXREaXN0YW5jZU1vZGVsIiwiZGlzdGFuY2VNb2RlbCIsInNldERpc3RhbmNlTW9kZWwiLCJnZXRNYXhEaXN0YW5jZSIsIm1heERpc3RhbmNlIiwic2V0TWF4RGlzdGFuY2UiLCJzZXREaXJlY3Rpb25hbENvbmUiLCJjb25lSW5uZXJBbmdsZSIsImNvbmVPdXRlckFuZ2xlIiwiY29uZU91dGVyR2FpbiIsIm9yaWVudGF0aW9uWCIsIm9yaWVudGF0aW9uWSIsIm9yaWVudGF0aW9uWiIsIkF1ZGlvQW5hbHlzZXIiLCJhdWRpbyIsImZmdFNpemUiLCJhbmFseXNlciIsImNyZWF0ZUFuYWx5c2VyIiwiZnJlcXVlbmN5QmluQ291bnQiLCJnZXRGcmVxdWVuY3lEYXRhIiwiZ2V0Qnl0ZUZyZXF1ZW5jeURhdGEiLCJnZXRBdmVyYWdlRnJlcXVlbmN5IiwiUHJvcGVydHlNaXhlciIsImJpbmRpbmciLCJtaXhGdW5jdGlvbiIsIm1peEZ1bmN0aW9uQWRkaXRpdmUiLCJzZXRJZGVudGl0eSIsIl9zbGVycCIsIl9zbGVycEFkZGl0aXZlIiwiX3NldEFkZGl0aXZlSWRlbnRpdHlRdWF0ZXJuaW9uIiwiX3dvcmtJbmRleCIsIl9zZWxlY3QiLCJfc2V0QWRkaXRpdmVJZGVudGl0eU90aGVyIiwiX2xlcnAiLCJfbGVycEFkZGl0aXZlIiwiX3NldEFkZGl0aXZlSWRlbnRpdHlOdW1lcmljIiwiX21peEJ1ZmZlclJlZ2lvbiIsIl9taXhCdWZmZXJSZWdpb25BZGRpdGl2ZSIsIl9zZXRJZGVudGl0eSIsIl9vcmlnSW5kZXgiLCJfYWRkSW5kZXgiLCJjdW11bGF0aXZlV2VpZ2h0IiwiY3VtdWxhdGl2ZVdlaWdodEFkZGl0aXZlIiwidXNlQ291bnQiLCJyZWZlcmVuY2VDb3VudCIsImFjY3VtdWxhdGUiLCJhY2N1SW5kZXgiLCJjdXJyZW50V2VpZ2h0IiwibWl4IiwiYWNjdW11bGF0ZUFkZGl0aXZlIiwiYXBwbHkiLCJ3ZWlnaHRBZGRpdGl2ZSIsIm9yaWdpbmFsVmFsdWVPZmZzZXQiLCJzZXRWYWx1ZSIsInNhdmVPcmlnaW5hbFN0YXRlIiwiZ2V0VmFsdWUiLCJyZXN0b3JlT3JpZ2luYWxTdGF0ZSIsInRhcmdldEluZGV4Iiwid29ya09mZnNldCIsIl9SRVNFUlZFRF9DSEFSU19SRSIsIl9yZXNlcnZlZFJlIiwiUmVnRXhwIiwiX3dvcmRDaGFyIiwiX3dvcmRDaGFyT3JEb3QiLCJfdHJhY2tSZSIsIl9zdXBwb3J0ZWRPYmplY3ROYW1lcyIsIlByb3BlcnR5QmluZGluZyIsInJvb3ROb2RlIiwicGFyc2VkUGF0aCIsInBhcnNlVHJhY2tOYW1lIiwibm9kZSIsImZpbmROb2RlIiwibm9kZU5hbWUiLCJfZ2V0VmFsdWVfdW5ib3VuZCIsIl9zZXRWYWx1ZV91bmJvdW5kIiwiY3JlYXRlIiwicm9vdCIsImlzQW5pbWF0aW9uT2JqZWN0R3JvdXAiLCJDb21wb3NpdGUiLCJzYW5pdGl6ZU5vZGVOYW1lIiwibWF0Y2hlcyIsInJlc3VsdHMiLCJvYmplY3ROYW1lIiwib2JqZWN0SW5kZXgiLCJwcm9wZXJ0eUluZGV4IiwibGFzdERvdCIsInN1YnN0cmluZyIsInNlYXJjaE5vZGVTdWJ0cmVlIiwiY2hpbGROb2RlIiwic3ViVHJlZU5vZGUiLCJfZ2V0VmFsdWVfdW5hdmFpbGFibGUiLCJfc2V0VmFsdWVfdW5hdmFpbGFibGUiLCJfZ2V0VmFsdWVfZGlyZWN0IiwidGFyZ2V0T2JqZWN0IiwiX2dldFZhbHVlX2FycmF5IiwicmVzb2x2ZWRQcm9wZXJ0eSIsIl9nZXRWYWx1ZV9hcnJheUVsZW1lbnQiLCJfZ2V0VmFsdWVfdG9BcnJheSIsIl9zZXRWYWx1ZV9kaXJlY3QiLCJfc2V0VmFsdWVfZGlyZWN0X3NldE5lZWRzVXBkYXRlIiwiX3NldFZhbHVlX2RpcmVjdF9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlIiwiX3NldFZhbHVlX2FycmF5IiwiZGVzdCIsIl9zZXRWYWx1ZV9hcnJheV9zZXROZWVkc1VwZGF0ZSIsIl9zZXRWYWx1ZV9hcnJheV9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlIiwiX3NldFZhbHVlX2FycmF5RWxlbWVudCIsIl9zZXRWYWx1ZV9hcnJheUVsZW1lbnRfc2V0TmVlZHNVcGRhdGUiLCJfc2V0VmFsdWVfYXJyYXlFbGVtZW50X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGUiLCJfc2V0VmFsdWVfZnJvbUFycmF5IiwiX3NldFZhbHVlX2Zyb21BcnJheV9zZXROZWVkc1VwZGF0ZSIsIl9zZXRWYWx1ZV9mcm9tQXJyYXlfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSIsInRhcmdldEFycmF5Iiwic291cmNlQXJyYXkiLCJub2RlUHJvcGVydHkiLCJ2ZXJzaW9uaW5nIiwiVmVyc2lvbmluZyIsIk5vbmUiLCJOZWVkc1VwZGF0ZSIsIk1hdHJpeFdvcmxkTmVlZHNVcGRhdGUiLCJiaW5kaW5nVHlwZSIsIkJpbmRpbmdUeXBlIiwiRGlyZWN0IiwiQXJyYXlFbGVtZW50IiwiSGFzRnJvbVRvQXJyYXkiLCJFbnRpcmVBcnJheSIsIkdldHRlckJ5QmluZGluZ1R5cGUiLCJTZXR0ZXJCeUJpbmRpbmdUeXBlQW5kVmVyc2lvbmluZyIsInVuYmluZCIsInRhcmdldEdyb3VwIiwib3B0aW9uYWxQYXJzZWRQYXRoIiwiX3RhcmdldEdyb3VwIiwiX2JpbmRpbmdzIiwic3Vic2NyaWJlXyIsImZpcnN0VmFsaWRJbmRleCIsIm5DYWNoZWRPYmplY3RzXyIsImJpbmRpbmdzIiwiQW5pbWF0aW9uT2JqZWN0R3JvdXAiLCJfb2JqZWN0cyIsIl9pbmRpY2VzQnlVVUlEIiwiX3BhdGhzIiwiX3BhcnNlZFBhdGhzIiwiX2JpbmRpbmdzSW5kaWNlc0J5UGF0aCIsInN0YXRzIiwib2JqZWN0cyIsImluVXNlIiwiYmluZGluZ3NQZXJPYmplY3QiLCJpbmRpY2VzQnlVVUlEIiwicGF0aHMiLCJwYXJzZWRQYXRocyIsIm5CaW5kaW5ncyIsImtub3duT2JqZWN0Iiwibk9iamVjdHMiLCJuQ2FjaGVkT2JqZWN0cyIsImZpcnN0QWN0aXZlSW5kZXgiLCJsYXN0Q2FjaGVkT2JqZWN0IiwiYmluZGluZ3NGb3JQYXRoIiwibGFzdENhY2hlZCIsImxhc3RDYWNoZWRJbmRleCIsImZpcnN0QWN0aXZlT2JqZWN0IiwiZmlyc3RBY3RpdmUiLCJ1bmNhY2hlIiwibGFzdE9iamVjdCIsImluZGljZXNCeVBhdGgiLCJ1bnN1YnNjcmliZV8iLCJsYXN0QmluZGluZ3NJbmRleCIsImxhc3RCaW5kaW5ncyIsIkFuaW1hdGlvbkFjdGlvbiIsIm1peGVyIiwibG9jYWxSb290IiwiX21peGVyIiwiX2NsaXAiLCJfbG9jYWxSb290IiwiblRyYWNrcyIsImludGVycG9sYW50cyIsImludGVycG9sYW50U2V0dGluZ3MiLCJfaW50ZXJwb2xhbnRTZXR0aW5ncyIsIl9pbnRlcnBvbGFudHMiLCJfcHJvcGVydHlCaW5kaW5ncyIsIl9jYWNoZUluZGV4IiwiX2J5Q2xpcENhY2hlSW5kZXgiLCJfdGltZVNjYWxlSW50ZXJwb2xhbnQiLCJfd2VpZ2h0SW50ZXJwb2xhbnQiLCJfbG9vcENvdW50IiwiX3N0YXJ0VGltZSIsIl9lZmZlY3RpdmVUaW1lU2NhbGUiLCJfZWZmZWN0aXZlV2VpZ2h0IiwicmVwZXRpdGlvbnMiLCJwYXVzZWQiLCJjbGFtcFdoZW5GaW5pc2hlZCIsInplcm9TbG9wZUF0U3RhcnQiLCJ6ZXJvU2xvcGVBdEVuZCIsIl9hY3RpdmF0ZUFjdGlvbiIsIl9kZWFjdGl2YXRlQWN0aW9uIiwic3RvcEZhZGluZyIsInN0b3BXYXJwaW5nIiwiaXNSdW5uaW5nIiwiX2lzQWN0aXZlQWN0aW9uIiwiaXNTY2hlZHVsZWQiLCJzdGFydEF0IiwibW9kZSIsInNldEVmZmVjdGl2ZVdlaWdodCIsImdldEVmZmVjdGl2ZVdlaWdodCIsImZhZGVJbiIsIl9zY2hlZHVsZUZhZGluZyIsImZhZGVPdXQiLCJjcm9zc0ZhZGVGcm9tIiwiZmFkZU91dEFjdGlvbiIsIndhcnAiLCJmYWRlSW5EdXJhdGlvbiIsImZhZGVPdXREdXJhdGlvbiIsInN0YXJ0RW5kUmF0aW8iLCJlbmRTdGFydFJhdGlvIiwiY3Jvc3NGYWRlVG8iLCJmYWRlSW5BY3Rpb24iLCJ3ZWlnaHRJbnRlcnBvbGFudCIsIl90YWtlQmFja0NvbnRyb2xJbnRlcnBvbGFudCIsInNldEVmZmVjdGl2ZVRpbWVTY2FsZSIsImdldEVmZmVjdGl2ZVRpbWVTY2FsZSIsInNldER1cmF0aW9uIiwic3luY1dpdGgiLCJhY3Rpb24iLCJoYWx0Iiwic3RhcnRUaW1lU2NhbGUiLCJlbmRUaW1lU2NhbGUiLCJfbGVuZENvbnRyb2xJbnRlcnBvbGFudCIsInRpbWVTY2FsZUludGVycG9sYW50IiwiZ2V0TWl4ZXIiLCJnZXRDbGlwIiwiZ2V0Um9vdCIsIl9yb290IiwiX3VwZGF0ZSIsImRlbHRhVGltZSIsInRpbWVEaXJlY3Rpb24iLCJfdXBkYXRlV2VpZ2h0IiwidGltZVJ1bm5pbmciLCJfdXBkYXRlVGltZVNjYWxlIiwiY2xpcFRpbWUiLCJfdXBkYXRlVGltZSIsInByb3BlcnR5TWl4ZXJzIiwiaW50ZXJwb2xhbnRWYWx1ZSIsImxvb3BDb3VudCIsInBpbmdQb25nIiwiX3NldEVuZGluZ3MiLCJoYW5kbGVfc3RvcCIsImxvb3BEZWx0YSIsInBlbmRpbmciLCJhdFN0YXJ0IiwiYXRFbmQiLCJ3ZWlnaHROb3ciLCJ3ZWlnaHRUaGVuIiwiX2NvbnRyb2xJbnRlcnBvbGFudHNSZXN1bHRCdWZmZXIiLCJBbmltYXRpb25NaXhlciIsIl9pbml0TWVtb3J5TWFuYWdlciIsIl9hY2N1SW5kZXgiLCJfYmluZEFjdGlvbiIsInByb3RvdHlwZUFjdGlvbiIsInJvb3RVdWlkIiwiYmluZGluZ3NCeVJvb3QiLCJfYmluZGluZ3NCeVJvb3RBbmROYW1lIiwiYmluZGluZ3NCeU5hbWUiLCJfYWRkSW5hY3RpdmVCaW5kaW5nIiwiY2xpcFV1aWQiLCJhY3Rpb25zRm9yQ2xpcCIsIl9hY3Rpb25zQnlDbGlwIiwia25vd25BY3Rpb25zIiwiX2FkZEluYWN0aXZlQWN0aW9uIiwiX2xlbmRCaW5kaW5nIiwiX2xlbmRBY3Rpb24iLCJfdGFrZUJhY2tCaW5kaW5nIiwiX3Rha2VCYWNrQWN0aW9uIiwiX2FjdGlvbnMiLCJfbkFjdGl2ZUFjdGlvbnMiLCJfbkFjdGl2ZUJpbmRpbmdzIiwiX2NvbnRyb2xJbnRlcnBvbGFudHMiLCJfbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHMiLCJhY3Rpb25zIiwiY29udHJvbEludGVycG9sYW50cyIsImFjdGlvbnNCeUNsaXAiLCJhY3Rpb25CeVJvb3QiLCJfcmVtb3ZlSW5hY3RpdmVBY3Rpb24iLCJsYXN0SW5hY3RpdmVBY3Rpb24iLCJjYWNoZUluZGV4Iiwia25vd25BY3Rpb25zRm9yQ2xpcCIsImxhc3RLbm93bkFjdGlvbiIsImJ5Q2xpcENhY2hlSW5kZXgiLCJfcmVtb3ZlSW5hY3RpdmVCaW5kaW5nc0ZvckFjdGlvbiIsIl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmciLCJwcmV2SW5kZXgiLCJsYXN0QWN0aXZlSW5kZXgiLCJmaXJzdEluYWN0aXZlQWN0aW9uIiwiZmlyc3RJbmFjdGl2ZUluZGV4IiwibGFzdEFjdGl2ZUFjdGlvbiIsImJpbmRpbmdCeU5hbWUiLCJwcm9wQmluZGluZyIsImxhc3RJbmFjdGl2ZUJpbmRpbmciLCJmaXJzdEluYWN0aXZlQmluZGluZyIsImxhc3RBY3RpdmVCaW5kaW5nIiwiX19jYWNoZUluZGV4IiwibGFzdEFjdGl2ZUludGVycG9sYW50IiwiY2xpcEFjdGlvbiIsIm9wdGlvbmFsUm9vdCIsImNsaXBPYmplY3QiLCJleGlzdGluZ0FjdGlvbiIsIm5ld0FjdGlvbiIsInN0b3BBbGxBY3Rpb24iLCJuQWN0aW9ucyIsInNldFRpbWUiLCJ1bmNhY2hlQ2xpcCIsImFjdGlvbnNUb1JlbW92ZSIsInVuY2FjaGVSb290IiwidW5jYWNoZUFjdGlvbiIsIlJlbmRlclRhcmdldDNEIiwiaXNSZW5kZXJUYXJnZXQzRCIsIlJlbmRlclRhcmdldEFycmF5IiwiaXNSZW5kZXJUYXJnZXRBcnJheSIsIlVuaWZvcm0iLCJfaWQiLCJVbmlmb3Jtc0dyb3VwIiwiaXNVbmlmb3Jtc0dyb3VwIiwic2V0TmFtZSIsInVuaWZvcm1zU291cmNlIiwiSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIiLCJpc0luc3RhbmNlZEludGVybGVhdmVkQnVmZmVyIiwiR0xCdWZmZXJBdHRyaWJ1dGUiLCJlbGVtZW50U2l6ZSIsInNldFR5cGUiLCJzZXRJdGVtU2l6ZSIsInNldENvdW50IiwiX21hdHJpeCIsIlJheWNhc3RlciIsInNldEZyb21DYW1lcmEiLCJjb29yZHMiLCJzZXRGcm9tWFJDb250cm9sbGVyIiwiaW50ZXJzZWN0T2JqZWN0IiwiYXNjU29ydCIsImludGVyc2VjdE9iamVjdHMiLCJwcm9wYWdhdGUiLCJTcGhlcmljYWwiLCJvdGhlciIsIm1ha2VTYWZlIiwiRVBTIiwic2V0RnJvbUNhcnRlc2lhbkNvb3JkcyIsIkN5bGluZHJpY2FsIiwiTWF0cml4MiIsImlzTWF0cml4MiIsIl92ZWN0b3IkNCIsIkJveDIiLCJpc0JveDIiLCJfc3RhcnRQIiwiX3N0YXJ0RW5kIiwiTGluZTMiLCJkaXN0YW5jZVNxIiwiY2xvc2VzdFBvaW50VG9Qb2ludFBhcmFtZXRlciIsImNsYW1wVG9MaW5lIiwic3RhcnRFbmQyIiwiX3ZlY3RvciQzIiwiU3BvdExpZ2h0SGVscGVyIiwicG9zaXRpb25zIiwiY29uZSIsImNvbmVMZW5ndGgiLCJjb25lV2lkdGgiLCJfdmVjdG9yJDIiLCJfYm9uZU1hdHJpeCIsIl9tYXRyaXhXb3JsZEludiIsIlNrZWxldG9uSGVscGVyIiwiZ2V0Qm9uZUxpc3QiLCJjb2xvcnMiLCJpc1NrZWxldG9uSGVscGVyIiwiYm9uZUxpc3QiLCJQb2ludExpZ2h0SGVscGVyIiwic3BoZXJlU2l6ZSIsIl92ZWN0b3IkMSIsIl9jb2xvcjEiLCJfY29sb3IyIiwiSGVtaXNwaGVyZUxpZ2h0SGVscGVyIiwiR3JpZEhlbHBlciIsIlBvbGFyR3JpZEhlbHBlciIsInNlY3RvcnMiLCJyaW5ncyIsIl92MSIsIl92MiIsIl92MyIsIkRpcmVjdGlvbmFsTGlnaHRIZWxwZXIiLCJsaWdodFBsYW5lIiwidGFyZ2V0TGluZSIsIl92ZWN0b3IiLCJfY2FtZXJhIiwiQ2FtZXJhSGVscGVyIiwicG9pbnRNYXAiLCJhZGRMaW5lIiwiYWRkUG9pbnQiLCJjb2xvckZydXN0dW0iLCJjb2xvckNvbmUiLCJjb2xvclVwIiwiY29sb3JUYXJnZXQiLCJjb2xvckNyb3NzIiwic2V0Q29sb3JzIiwiY29sb3JBdHRyaWJ1dGUiLCJuZWFyWiIsInNldFBvaW50IiwiX2JveCIsIkJveEhlbHBlciIsIkJveDNIZWxwZXIiLCJQbGFuZUhlbHBlciIsIl9heGlzIiwiX2xpbmVHZW9tZXRyeSIsIl9jb25lR2VvbWV0cnkiLCJBcnJvd0hlbHBlciIsImhlYWRMZW5ndGgiLCJoZWFkV2lkdGgiLCJzZXREaXJlY3Rpb24iLCJzZXRDb2xvciIsIkF4ZXNIZWxwZXIiLCJ4QXhpc0NvbG9yIiwieUF4aXNDb2xvciIsInpBeGlzQ29sb3IiLCJTaGFwZVBhdGgiLCJzdWJQYXRocyIsImN1cnJlbnRQYXRoIiwidG9TaGFwZXMiLCJpc0NDVyIsImlzUG9pbnRJbnNpZGVQb2x5Z29uIiwiaW5Qb2x5Z29uIiwicG9seUxlbiIsImVkZ2VMb3dQdCIsImVkZ2VIaWdoUHQiLCJlZGdlRHgiLCJlZGdlRHkiLCJwZXJwRWRnZSIsInNvbGlkIiwidG1wUGF0aCIsInRtcFNoYXBlIiwiaG9sZXNGaXJzdCIsImJldHRlclNoYXBlSG9sZXMiLCJuZXdTaGFwZXMiLCJ0bXBQb2ludHMiLCJ0bXBIb2xlcyIsIm5ld1NoYXBlSG9sZXMiLCJtYWluSWR4IiwiaW5TdWJwYXRocyIsInRvU2hhcGVzTm9Ib2xlcyIsImFtYmlndW91cyIsInRvQ2hhbmdlIiwic0lkeCIsInNMZW4iLCJzaG8iLCJoSWR4IiwiaG8iLCJob2xlX3VuYXNzaWduZWQiLCJzMklkeCIsIkNvbnRyb2xzIiwiZG9tRWxlbWVudCIsInN0YXRlIiwibW91c2VCdXR0b25zIiwidG91Y2hlcyIsIk9ORSIsIlRXTyIsImdldEJ5dGVMZW5ndGgiLCJ0eXBlQnl0ZUxlbmd0aCIsImdldFRleHR1cmVUeXBlQnl0ZUxlbmd0aCIsIlRleHR1cmVVdGlscyIsImNvbnRhaW4iLCJpbWFnZUFzcGVjdCIsImNvdmVyIiwicmV2aXNpb24iLCJfX1RIUkVFX18iXSwibWFwcGluZ3MiOiI7Ozs7O0FBQVksTUFBQUEsRUFBQSxTQVFBQyxFQUFBLENBQUFDLEtBQUEsRUFBQUMsT0FBQSxFQUFBQyxNQUFBLEVBQUFDLE9BQUEsRUFBQUMsTUFBQSxFQUFBQyxJQUFBLEdBUUFDLEVBQUEsQ0FBQUgsT0FBQSxFQUFBRSxJQUFBLEVBQUFFLFVBQUEsRUFBQUMsYUFBQSxHQVFBQyxFQUFBLEVBUUFDLEVBQUEsRUFRQUMsRUFBQSxFQVFBQyxFQUFBLEVBUUFDLEVBQUEsRUFRQUMsRUFBQSxFQVNBQyxFQUFBLEVBU0FDLEVBQUEsRUFRQUMsRUFBQSxFQVFBQyxFQUFBLEVBUUFDLEVBQUEsRUFTQUMsRUFBQSxFQVFBQyxFQUFBLEVBUUFDLEVBQUEsRUFRQUMsRUFBQSxFQVFBQyxFQUFBLEVBUUFDLEVBQUEsRUFRQUMsRUFBQSxJQVFBQyxFQUFBLElBUUFDLEVBQUEsSUFRQUMsRUFBQSxJQVFBQyxFQUFBLElBUUFDLEVBQUEsSUFRQUMsRUFBQSxJQVFBQyxFQUFBLElBUUFDLEVBQUEsSUFRQUMsRUFBQSxJQVFBQyxFQUFBLElBUUFDLEVBQUEsSUFRQUMsRUFBQSxJQVFBQyxFQUFBLElBUUFDLEVBQUEsSUFVQUMsRUFBQSxJQVFBQyxFQUFBLElBUUFDLEVBQUEsSUFRQUMsRUFBQSxJQVFBQyxFQUFBLElBUUFDLEVBQUEsRUFRQUMsRUFBQSxFQVFBQyxFQUFBLEVBUUFDLEVBQUEsRUFRQUMsRUFBQSxFQVFBQyxFQUFBLEVBUUFDLEVBQUEsRUFRQUMsRUFBQSxFQVFBQyxFQUFBLEVBUUFDLEVBQUEsRUFRQUMsRUFBQSxFQVFBQyxFQUFBLEVBUUFDLEVBQUEsRUFRQUMsRUFBQSxFQVFBQyxHQUFBLEVBUUFDLEdBQUEsRUFVQUMsR0FBQSxFQVFBQyxHQUFBLEVBVUFDLEdBQUEsRUFRQUMsR0FBQSxXQVNBQyxHQUFBLFdBUUFDLEdBQUEsSUFRQUMsR0FBQSxJQVFBQyxHQUFBLElBUUFDLEdBQUEsSUFRQUMsR0FBQSxJQVFBQyxHQUFBLElBUUFDLEdBQUEsSUFRQUMsR0FBQSxLQVFBQyxHQUFBLEtBU0FDLEdBQUEsS0FVQUMsR0FBQSxLQUNBQyxHQUFBLEtBVUFDLEdBQUEsS0FDQUMsR0FBQSxLQVVBQyxHQUFBLEtBVUFDLEdBQUEsS0FDQUMsR0FBQSxLQVVBQyxHQUFBLEtBQ0FDLEdBQUEsS0FRQUMsR0FBQSxLQVFBQyxHQUFBLEtBUUFDLEdBQUEsS0FRQUMsR0FBQSxLQVFBQyxHQUFBLEtBUUFDLEdBQUEsS0FRQUMsR0FBQSxLQVFBQyxHQUFBLEtBUUFDLEdBQUEsS0FRQUMsR0FBQSxLQVFBQyxHQUFBLEtBUUFDLEdBQUEsTUFRQUMsR0FBQSxLQVFBQyxHQUFBLEtBUUFDLEdBQUEsS0FVQUMsR0FBQSxLQVNBQyxHQUFBLEtBUUFDLEdBQUEsS0FTQUMsR0FBQSxLQVFBQyxHQUFBLEtBUUFDLEdBQUEsS0FRQUMsR0FBQSxLQVFBQyxHQUFBLEtBUUFDLEdBQUEsS0FRQUMsR0FBQSxLQVFBQyxHQUFBLE1BUUFDLEdBQUEsTUFRQUMsR0FBQSxNQVNBQyxHQUFBLE1BUUFDLEdBQUEsTUFRQUMsR0FBQSxNQVFBQyxHQUFBLE1BUUFDLEdBQUEsTUFRQUMsR0FBQSxNQVFBQyxHQUFBLE1BUUFDLEdBQUEsTUFRQUMsR0FBQSxNQVFBQyxHQUFBLE1BUUFDLEdBQUEsTUFRQUMsR0FBQSxNQVFBQyxHQUFBLE1BUUFDLEdBQUEsTUFRQUMsR0FBQSxNQVFBQyxHQUFBLE1BUUFDLEdBQUEsTUFRQUMsR0FBQSxNQVFBQyxHQUFBLE1BUUFDLEdBQUEsTUFRQUMsR0FBQSxNQVFBQyxHQUFBLE1BUUFDLEdBQUEsTUFRQUMsR0FBQSxNQVFBQyxHQUFBLE1BUUFDLEdBQUEsTUFRQUMsR0FBQSxNQVFBQyxHQUFBLE1BUUFDLEdBQUEsTUFRQUMsR0FBQSxLQVNBQyxHQUFBLEtBU0FDLEdBQUEsS0FRQUMsR0FBQSxLQVFBQyxHQUFBLEtBUUFDLEdBQUEsS0FRQUMsR0FBQSxLQVFBQyxHQUFBLEtBUUFDLEdBQUEsS0FRQUMsR0FBQSxLQVNBQyxHQUFBLEtBUUFDLEdBQUEsRUFRQUMsR0FBQSxFQVFBQyxHQUFBLEVBUUFDLEdBQUEsS0FRQUMsR0FBQSxLQVFBQyxHQUFBLEtBUUFDLEdBQUEsS0FRQUMsR0FBQSxFQVFBQyxHQUFBLEVBVUFDLEdBQUEsR0FRQUMsR0FBQSxPQVFBQyxHQUFBLGNBUUFDLEdBQUEsU0FRQUMsR0FBQSxPQVFBQyxHQUFBLEVBUUFDLEdBQUEsS0FRQUMsR0FBQSxLQVFBQyxHQUFBLEtBUUFDLEdBQUEsS0FTQUMsR0FBQSxNQVNBQyxHQUFBLE1BUUFDLEdBQUEsS0FRQUMsR0FBQSxJQVFBQyxHQUFBLElBUUFDLEdBQUEsSUFRQUMsR0FBQSxJQVFBQyxHQUFBLElBUUFDLEdBQUEsSUFRQUMsR0FBQSxJQVFBQyxHQUFBLElBUUFDLEdBQUEsSUFRQUMsR0FBQSxJQVFBQyxHQUFBLElBUUFDLEdBQUEsSUFRQUMsR0FBQSxJQVFBQyxHQUFBLElBUUFDLEdBQUEsSUFRQUMsR0FBQSxJQVNBQyxHQUFBLE1BU0FDLEdBQUEsTUFTQUMsR0FBQSxNQVNBQyxHQUFBLE1BU0FDLEdBQUEsTUFTQUMsR0FBQSxNQVNBQyxHQUFBLE1BU0FDLEdBQUEsTUFTQUMsR0FBQSxNQVFBQyxHQUFBLE1BUUFDLEdBQUEsU0FRQUMsR0FBQSxJQVFBQyxHQUFBLEtBUUFDLEdBQUEsQ0FDWkMsUUFBQSxVQUNBQyxPQUFBLFVDbGpEQSxNQUFBQyxHQVFBLGdCQUFBQyxDQUFBQyxFQUFBQyxRQUVBQyxJQUFBQyxLQUFBQyxhQUFBRCxLQUFBQyxXQUFBLENBQUEsR0FFQSxNQUFBQyxFQUFBRixLQUFBQyxnQkFFQUYsSUFBQUcsRUFBQUwsS0FFQUssRUFBQUwsR0FBQSxLQUlBLElBQUFLLEVBQUFMLEdBQUFNLFFBQUFMLElBRUFJLEVBQUFMLEdBQUFPLEtBQUFOLEVBSUEsQ0FTQSxnQkFBQU8sQ0FBQVIsRUFBQUMsR0FFQSxNQUFBSSxFQUFBRixLQUFBQyxXQUVBLFlBQUFGLElBQUFHLFNBRUFILElBQUFHLEVBQUFMLEtBQUEsSUFBQUssRUFBQUwsR0FBQU0sUUFBQUwsR0FFQSxDQVFBLG1CQUFBUSxDQUFBVCxFQUFBQyxHQUVBLE1BQUFJLEVBQUFGLEtBQUFDLFdBRUEsUUFBQUYsSUFBQUcsRUFBQSxPQUVBLE1BQUFLLEVBQUFMLEVBQUFMLEdBRUEsUUFBQUUsSUFBQVEsRUFBQSxDQUVBLE1BQUFDLEVBQUFELEVBQUFKLFFBQUFMLElBRUEsSUFBQVUsR0FFQUQsRUFBQUUsT0FBQUQsRUFBQSxFQUlBLENBRUEsQ0FPQSxhQUFBRSxDQUFBQyxHQUVBLE1BQUFULEVBQUFGLEtBQUFDLFdBRUEsUUFBQUYsSUFBQUcsRUFBQSxPQUVBLE1BQUFLLEVBQUFMLEVBQUFTLEVBQUFkLE1BRUEsUUFBQUUsSUFBQVEsRUFBQSxDQUVBSSxFQUFBQyxPQUFBWixLQUdBLE1BQUFhLEVBQUFOLEVBQUFPLE1BQUEsR0FFQSxJQUFBLElBQUFDLEVBQUEsRUFBQUMsRUFBQUgsRUFBQUksT0FBQUYsRUFBQUMsRUFBQUQsSUFFQUYsRUFBQUUsR0FBQUcsS0FBQWxCLEtBQUFXLEdBSUFBLEVBQUFDLE9BQUEsSUFFQSxDQUVBLEVDN0hBLE1BQUFPLEdBQUEsQ0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxLQUFBLEtBQUEsS0FBQSxNQUVBLElBQUFDLEdBQUEsUUFHQSxNQUFBQyxHQUFBQyxLQUFBQyxHQUFBLElBQ0tDLEdBQUEsSUFBQUYsS0FBQUMsR0FRTCxTQUFBRSxLQUlBLE1BQUFDLEVBQUEsV0FBQUosS0FBQUssU0FBQSxFQUNBQyxFQUFBLFdBQUFOLEtBQUFLLFNBQUEsRUFDQUUsRUFBQSxXQUFBUCxLQUFBSyxTQUFBLEVBQ0FHLEVBQUEsV0FBQVIsS0FBQUssU0FBQSxFQU9BLE9BTkFSLEdBQUEsSUFBQU8sR0FBQVAsR0FBQU8sR0FBQSxFQUFBLEtBQUFQLEdBQUFPLEdBQUEsR0FBQSxLQUFBUCxHQUFBTyxHQUFBLEdBQUEsS0FBQSxJQUNBUCxHQUFBLElBQUFTLEdBQUFULEdBQUFTLEdBQUEsRUFBQSxLQUFBLElBQUFULEdBQUFTLEdBQUEsR0FBQSxHQUFBLElBQUFULEdBQUFTLEdBQUEsR0FBQSxLQUFBLElBQ0FULEdBQUEsR0FBQVUsRUFBQSxLQUFBVixHQUFBVSxHQUFBLEVBQUEsS0FBQSxJQUFBVixHQUFBVSxHQUFBLEdBQUEsS0FBQVYsR0FBQVUsR0FBQSxHQUFBLEtBQ0FWLEdBQUEsSUFBQVcsR0FBQVgsR0FBQVcsR0FBQSxFQUFBLEtBQUFYLEdBQUFXLEdBQUEsR0FBQSxLQUFBWCxHQUFBVyxHQUFBLEdBQUEsTUFHQUMsYUFFQSxDQVVBLFNBQUFDLEdBQUFDLEVBQUFDLEVBQUFDLEdBRUEsT0FBQWIsS0FBQWEsSUFBQUQsRUFBQVosS0FBQVksSUFBQUMsRUFBQUYsR0FFQSxDQVVBLFNBQUFHLEdBQUFDLEVBQUFDLEdBSUEsT0FBQUQsRUFBQUMsRUFBQUEsR0FBQUEsQ0FFQSxDQXFEQSxTQUFBQyxHQUFBQyxFQUFBQyxFQUFBQyxHQUVBLE9BQUEsRUFBQUEsR0FBQUYsRUFBQUUsRUFBQUQsQ0FFQSxDQTRRQSxTQUFBRSxHQUFBVixFQUFBcEIsR0FFQSxPQUFBQSxFQUFBK0IsYUFFQSxLQUFBQyxhQUVBLE9BQUFaLEVBRUEsS0FBQWEsWUFFQSxPQUFBYixFQUFBLFdBRUEsS0FBQWMsWUFFQSxPQUFBZCxFQUFBLE1BRUEsS0FBQWUsV0FFQSxPQUFBZixFQUFBLElBRUEsS0FBQWdCLFdBRUEsT0FBQTNCLEtBQUFhLElBQUFGLEVBQUEsWUFBQSxHQUVBLEtBQUFpQixXQUVBLE9BQUE1QixLQUFBYSxJQUFBRixFQUFBLE9BQUEsR0FFQSxLQUFBa0IsVUFFQSxPQUFBN0IsS0FBQWEsSUFBQUYsRUFBQSxLQUFBLEdBRUEsUUFFQSxNQUFBLElBQUFtQixNQUFBLDJCQUlBLENBU0EsU0FBQUMsR0FBQXBCLEVBQUFwQixHQUVBLE9BQUFBLEVBQUErQixhQUVBLEtBQUFDLGFBRUEsT0FBQVosRUFFQSxLQUFBYSxZQUVBLE9BQUF4QixLQUFBZ0MsTUFBQSxXQUFBckIsR0FFQSxLQUFBYyxZQUVBLE9BQUF6QixLQUFBZ0MsTUFBQSxNQUFBckIsR0FFQSxLQUFBZSxXQUVBLE9BQUExQixLQUFBZ0MsTUFBQSxJQUFBckIsR0FFQSxLQUFBZ0IsV0FFQSxPQUFBM0IsS0FBQWdDLE1BQUEsV0FBQXJCLEdBRUEsS0FBQWlCLFdBRUEsT0FBQTVCLEtBQUFnQyxNQUFBLE1BQUFyQixHQUVBLEtBQUFrQixVQUVBLE9BQUE3QixLQUFBZ0MsTUFBQSxJQUFBckIsR0FFQSxRQUVBLE1BQUEsSUFBQW1CLE1BQUEsMkJBSUEsQ0FPSyxNQUFBRyxHQUFBLENBQ0xsQyxRQUFBQSxHQUNBRyxRQUFBQSxHQVNBQyxhQUFBQSxHQVdBTyxNQUFBQSxHQVdBSSxnQkFBQUEsR0FjQW9CLFVBbmNBLFNBQUFoQixFQUFBaUIsRUFBQUMsRUFBQUMsRUFBQUMsR0FFQSxPQUFBRCxHQUFBbkIsRUFBQWlCLElBQUFHLEVBQUFELElBQUFELEVBQUFELEVBRUEsRUEyY0FJLFlBaGNBLFNBQUFyQixFQUFBQyxFQUFBUixHQUlBLE9BQUFPLElBQUFDLEdBRUFSLEVBQUFPLElBQUFDLEVBQUFELEdBSUEsQ0FJQSxFQThiQUQsS0FBQUEsR0FlQXVCLEtBaGJBLFNBQUF0QixFQUFBQyxFQUFBc0IsRUFBQUMsR0FFQSxPQUFBekIsR0FBQUMsRUFBQUMsRUFBQSxFQUFBbkIsS0FBQTJDLEtBQUFGLEVBQUFDLEdBRUEsRUFzYkFFLFNBN2FBLFNBQUExQixFQUFBdkIsRUFBQSxHQUlBLE9BQUFBLEVBQUFLLEtBQUE2QyxJQUFBL0IsR0FBQUksRUFBQSxFQUFBdkIsR0FBQUEsRUFFQSxFQXNiQW1ELFdBeGFBLFNBQUE1QixFQUFBTixFQUFBQyxHQUVBLE9BQUFLLEdBQUFOLEVBQUEsRUFDQU0sR0FBQUwsRUFBQSxHQUVBSyxHQUFBQSxFQUFBTixJQUFBQyxFQUFBRCxJQUVBTSxHQUFBLEVBQUEsRUFBQUEsRUFFQSxFQTJhQTZCLGFBaGFBLFNBQUE3QixFQUFBTixFQUFBQyxHQUVBLE9BQUFLLEdBQUFOLEVBQUEsRUFDQU0sR0FBQUwsRUFBQSxHQUVBSyxHQUFBQSxFQUFBTixJQUFBQyxFQUFBRCxJQUVBTSxFQUFBQSxHQUFBQSxHQUFBLEVBQUFBLEVBQUEsSUFBQSxHQUVBLEVBaWFBOEIsUUF4WkEsU0FBQUMsRUFBQUMsR0FFQSxPQUFBRCxFQUFBakQsS0FBQW1ELE1BQUFuRCxLQUFBSyxVQUFBNkMsRUFBQUQsRUFBQSxHQUVBLEVBOFpBRyxVQXJaQSxTQUFBSCxFQUFBQyxHQUVBLE9BQUFELEVBQUFqRCxLQUFBSyxVQUFBNkMsRUFBQUQsRUFFQSxFQTBaQUksZ0JBbFpBLFNBQUFDLEdBRUEsT0FBQUEsR0FBQSxHQUFBdEQsS0FBQUssU0FFQSxFQXVaQWtELGFBL1lBLFNBQUFDLFFBRUEvRSxJQUFBK0UsSUFBQTFELEdBQUEwRCxHQUlBLElBQUFwQyxFQUFBdEIsSUFBQSxXQU1BLE9BSkFzQixFQUFBcEIsS0FBQXlELEtBQUFyQyxFQUFBQSxJQUFBLEdBQUEsRUFBQUEsR0FFQUEsR0FBQUEsRUFBQXBCLEtBQUF5RCxLQUFBckMsRUFBQUEsSUFBQSxFQUFBLEdBQUFBLEtBRUFBLEVBQUFBLElBQUEsTUFBQSxHQUFBLFVBRUEsRUEwWUFzQyxTQWxZQSxTQUFBQyxHQUVBLE9BQUFBLEVBQUE1RCxFQUVBLEVBdVlBNkQsU0EvWEEsU0FBQUMsR0FFQSxPQUFBQSxFQUFBM0QsRUFFQSxFQW9ZQTRELGFBNVhBLFNBQUFuRCxHQUVBLFFBQUFBLEVBQUFBLEVBQUEsSUFBQSxJQUFBQSxDQUVBLEVBaVlBb0QsZUF6WEEsU0FBQXBELEdBRUEsT0FBQVgsS0FBQWdFLElBQUEsRUFBQWhFLEtBQUFpRSxLQUFBakUsS0FBQWtFLElBQUF2RCxHQUFBWCxLQUFBbUUsS0FFQSxFQThYQUMsZ0JBdFhBLFNBQUF6RCxHQUVBLE9BQUFYLEtBQUFnRSxJQUFBLEVBQUFoRSxLQUFBbUQsTUFBQW5ELEtBQUFrRSxJQUFBdkQsR0FBQVgsS0FBQW1FLEtBRUEsRUFrWUFFLDZCQW5YQSxTQUFBQyxFQUFBQyxFQUFBQyxFQUFBQyxFQUFBQyxHQUVBLE1BQUFDLEVBQUEzRSxLQUFBMkUsSUFDQUMsRUFBQTVFLEtBQUE0RSxJQUVBQyxFQUFBRixFQUFBSCxFQUFBLEdBQ0FNLEVBQUFGLEVBQUFKLEVBQUEsR0FFQU8sRUFBQUosR0FBQUosRUFBQUUsR0FBQSxHQUNBTyxFQUFBSixHQUFBTCxFQUFBRSxHQUFBLEdBRUFRLEVBQUFOLEdBQUFKLEVBQUFFLEdBQUEsR0FDQVMsRUFBQU4sR0FBQUwsRUFBQUUsR0FBQSxHQUVBVSxFQUFBUixHQUFBRixFQUFBRixHQUFBLEdBQ0FhLEVBQUFSLEdBQUFILEVBQUFGLEdBQUEsR0FFQSxPQUFBRyxHQUVBLElBQUEsTUFDQUosRUFBQWUsSUFBQVIsRUFBQUcsRUFBQUYsRUFBQUcsRUFBQUgsRUFBQUksRUFBQUwsRUFBQUUsR0FDQSxNQUVBLElBQUEsTUFDQVQsRUFBQWUsSUFBQVAsRUFBQUksRUFBQUwsRUFBQUcsRUFBQUYsRUFBQUcsRUFBQUosRUFBQUUsR0FDQSxNQUVBLElBQUEsTUFDQVQsRUFBQWUsSUFBQVAsRUFBQUcsRUFBQUgsRUFBQUksRUFBQUwsRUFBQUcsRUFBQUgsRUFBQUUsR0FDQSxNQUVBLElBQUEsTUFDQVQsRUFBQWUsSUFBQVIsRUFBQUcsRUFBQUYsRUFBQU0sRUFBQU4sRUFBQUssRUFBQU4sRUFBQUUsR0FDQSxNQUVBLElBQUEsTUFDQVQsRUFBQWUsSUFBQVAsRUFBQUssRUFBQU4sRUFBQUcsRUFBQUYsRUFBQU0sRUFBQVAsRUFBQUUsR0FDQSxNQUVBLElBQUEsTUFDQVQsRUFBQWUsSUFBQVAsRUFBQU0sRUFBQU4sRUFBQUssRUFBQU4sRUFBQUcsRUFBQUgsRUFBQUUsR0FDQSxNQUVBLFFBQ0FPLFFBQUFDLEtBQUEsa0ZBQUFiLEdBSUEsRUE2VUEzQyxVQUFBQSxHQVVBVixZQUFBQSxJQ3ByQkEsTUFBQW1FLEdBUUEsV0FBQWxFLENBQUFKLEVBQUEsRUFBQUMsRUFBQSxHQVNBcUUsR0FBQUMsVUFBQUMsV0FBQSxFQU9BaEgsS0FBQXdDLEVBQUFBLEVBT0F4QyxLQUFBeUMsRUFBQUEsQ0FFQSxDQU9BLFNBQUF3RSxHQUVBLE9BQUFqSCxLQUFBd0MsQ0FFQSxDQUVBLFNBQUF5RSxDQUFBaEYsR0FFQWpDLEtBQUF3QyxFQUFBUCxDQUVBLENBT0EsVUFBQWlGLEdBRUEsT0FBQWxILEtBQUF5QyxDQUVBLENBRUEsVUFBQXlFLENBQUFqRixHQUVBakMsS0FBQXlDLEVBQUFSLENBRUEsQ0FTQSxHQUFBMEUsQ0FBQW5FLEVBQUFDLEdBS0EsT0FIQXpDLEtBQUF3QyxFQUFBQSxFQUNBeEMsS0FBQXlDLEVBQUFBLEVBRUF6QyxJQUVBLENBUUEsU0FBQW1ILENBQUFDLEdBS0EsT0FIQXBILEtBQUF3QyxFQUFBNEUsRUFDQXBILEtBQUF5QyxFQUFBMkUsRUFFQXBILElBRUEsQ0FRQSxJQUFBcUgsQ0FBQTdFLEdBSUEsT0FGQXhDLEtBQUF3QyxFQUFBQSxFQUVBeEMsSUFFQSxDQVFBLElBQUFzSCxDQUFBN0UsR0FJQSxPQUZBekMsS0FBQXlDLEVBQUFBLEVBRUF6QyxJQUVBLENBU0EsWUFBQXVILENBQUEvRyxFQUFBeUIsR0FFQSxPQUFBekIsR0FFQSxLQUFBLEVBQUFSLEtBQUF3QyxFQUFBUCxFQUFBLE1BQ0EsS0FBQSxFQUFBakMsS0FBQXlDLEVBQUFSLEVBQUEsTUFDQSxRQUFBLE1BQUEsSUFBQW1CLE1BQUEsMEJBQUE1QyxHQUlBLE9BQUFSLElBRUEsQ0FRQSxZQUFBd0gsQ0FBQWhILEdBRUEsT0FBQUEsR0FFQSxLQUFBLEVBQUEsT0FBQVIsS0FBQXdDLEVBQ0EsS0FBQSxFQUFBLE9BQUF4QyxLQUFBeUMsRUFDQSxRQUFBLE1BQUEsSUFBQVcsTUFBQSwwQkFBQTVDLEdBSUEsQ0FPQSxLQUFBaUgsR0FFQSxPQUFBLElBQUF6SCxLQUFBNEMsWUFBQTVDLEtBQUF3QyxFQUFBeEMsS0FBQXlDLEVBRUEsQ0FRQSxJQUFBaUYsQ0FBQUMsR0FLQSxPQUhBM0gsS0FBQXdDLEVBQUFtRixFQUFBbkYsRUFDQXhDLEtBQUF5QyxFQUFBa0YsRUFBQWxGLEVBRUF6QyxJQUVBLENBUUEsR0FBQTRILENBQUFELEdBS0EsT0FIQTNILEtBQUF3QyxHQUFBbUYsRUFBQW5GLEVBQ0F4QyxLQUFBeUMsR0FBQWtGLEVBQUFsRixFQUVBekMsSUFFQSxDQVFBLFNBQUE2SCxDQUFBL0MsR0FLQSxPQUhBOUUsS0FBQXdDLEdBQUFzQyxFQUNBOUUsS0FBQXlDLEdBQUFxQyxFQUVBOUUsSUFFQSxDQVNBLFVBQUE4SCxDQUFBakMsRUFBQUMsR0FLQSxPQUhBOUYsS0FBQXdDLEVBQUFxRCxFQUFBckQsRUFBQXNELEVBQUF0RCxFQUNBeEMsS0FBQXlDLEVBQUFvRCxFQUFBcEQsRUFBQXFELEVBQUFyRCxFQUVBekMsSUFFQSxDQVNBLGVBQUErSCxDQUFBSixFQUFBN0MsR0FLQSxPQUhBOUUsS0FBQXdDLEdBQUFtRixFQUFBbkYsRUFBQXNDLEVBQ0E5RSxLQUFBeUMsR0FBQWtGLEVBQUFsRixFQUFBcUMsRUFFQTlFLElBRUEsQ0FRQSxHQUFBZ0ksQ0FBQUwsR0FLQSxPQUhBM0gsS0FBQXdDLEdBQUFtRixFQUFBbkYsRUFDQXhDLEtBQUF5QyxHQUFBa0YsRUFBQWxGLEVBRUF6QyxJQUVBLENBUUEsU0FBQWlJLENBQUFuRCxHQUtBLE9BSEE5RSxLQUFBd0MsR0FBQXNDLEVBQ0E5RSxLQUFBeUMsR0FBQXFDLEVBRUE5RSxJQUVBLENBU0EsVUFBQWtJLENBQUFyQyxFQUFBQyxHQUtBLE9BSEE5RixLQUFBd0MsRUFBQXFELEVBQUFyRCxFQUFBc0QsRUFBQXRELEVBQ0F4QyxLQUFBeUMsRUFBQW9ELEVBQUFwRCxFQUFBcUQsRUFBQXJELEVBRUF6QyxJQUVBLENBUUEsUUFBQW1JLENBQUFSLEdBS0EsT0FIQTNILEtBQUF3QyxHQUFBbUYsRUFBQW5GLEVBQ0F4QyxLQUFBeUMsR0FBQWtGLEVBQUFsRixFQUVBekMsSUFFQSxDQVFBLGNBQUFvSSxDQUFBaEIsR0FLQSxPQUhBcEgsS0FBQXdDLEdBQUE0RSxFQUNBcEgsS0FBQXlDLEdBQUEyRSxFQUVBcEgsSUFFQSxDQVFBLE1BQUFxSSxDQUFBVixHQUtBLE9BSEEzSCxLQUFBd0MsR0FBQW1GLEVBQUFuRixFQUNBeEMsS0FBQXlDLEdBQUFrRixFQUFBbEYsRUFFQXpDLElBRUEsQ0FRQSxZQUFBc0ksQ0FBQWxCLEdBRUEsT0FBQXBILEtBQUFvSSxlQUFBLEVBQUFoQixFQUVBLENBU0EsWUFBQW1CLENBQUFqRyxHQUVBLE1BQUFFLEVBQUF4QyxLQUFBd0MsRUFBQUMsRUFBQXpDLEtBQUF5QyxFQUNBK0YsRUFBQWxHLEVBQUFtRyxTQUtBLE9BSEF6SSxLQUFBd0MsRUFBQWdHLEVBQUEsR0FBQWhHLEVBQUFnRyxFQUFBLEdBQUEvRixFQUFBK0YsRUFBQSxHQUNBeEksS0FBQXlDLEVBQUErRixFQUFBLEdBQUFoRyxFQUFBZ0csRUFBQSxHQUFBL0YsRUFBQStGLEVBQUEsR0FFQXhJLElBRUEsQ0FTQSxHQUFBa0MsQ0FBQXlGLEdBS0EsT0FIQTNILEtBQUF3QyxFQUFBbEIsS0FBQVksSUFBQWxDLEtBQUF3QyxFQUFBbUYsRUFBQW5GLEdBQ0F4QyxLQUFBeUMsRUFBQW5CLEtBQUFZLElBQUFsQyxLQUFBeUMsRUFBQWtGLEVBQUFsRixHQUVBekMsSUFFQSxDQVNBLEdBQUFtQyxDQUFBd0YsR0FLQSxPQUhBM0gsS0FBQXdDLEVBQUFsQixLQUFBYSxJQUFBbkMsS0FBQXdDLEVBQUFtRixFQUFBbkYsR0FDQXhDLEtBQUF5QyxFQUFBbkIsS0FBQWEsSUFBQW5DLEtBQUF5QyxFQUFBa0YsRUFBQWxGLEdBRUF6QyxJQUVBLENBWUEsS0FBQWdDLENBQUFFLEVBQUFDLEdBT0EsT0FIQW5DLEtBQUF3QyxFQUFBUixHQUFBaEMsS0FBQXdDLEVBQUFOLEVBQUFNLEVBQUFMLEVBQUFLLEdBQ0F4QyxLQUFBeUMsRUFBQVQsR0FBQWhDLEtBQUF5QyxFQUFBUCxFQUFBTyxFQUFBTixFQUFBTSxHQUVBekMsSUFFQSxDQVlBLFdBQUEwSSxDQUFBQyxFQUFBQyxHQUtBLE9BSEE1SSxLQUFBd0MsRUFBQVIsR0FBQWhDLEtBQUF3QyxFQUFBbUcsRUFBQUMsR0FDQTVJLEtBQUF5QyxFQUFBVCxHQUFBaEMsS0FBQXlDLEVBQUFrRyxFQUFBQyxHQUVBNUksSUFFQSxDQVlBLFdBQUE2SSxDQUFBM0csRUFBQUMsR0FFQSxNQUFBbEIsRUFBQWpCLEtBQUFpQixTQUVBLE9BQUFqQixLQUFBc0ksYUFBQXJILEdBQUEsR0FBQW1ILGVBQUFwRyxHQUFBZixFQUFBaUIsRUFBQUMsR0FFQSxDQU9BLEtBQUFzQyxHQUtBLE9BSEF6RSxLQUFBd0MsRUFBQWxCLEtBQUFtRCxNQUFBekUsS0FBQXdDLEdBQ0F4QyxLQUFBeUMsRUFBQW5CLEtBQUFtRCxNQUFBekUsS0FBQXlDLEdBRUF6QyxJQUVBLENBT0EsSUFBQXVGLEdBS0EsT0FIQXZGLEtBQUF3QyxFQUFBbEIsS0FBQWlFLEtBQUF2RixLQUFBd0MsR0FDQXhDLEtBQUF5QyxFQUFBbkIsS0FBQWlFLEtBQUF2RixLQUFBeUMsR0FFQXpDLElBRUEsQ0FPQSxLQUFBc0QsR0FLQSxPQUhBdEQsS0FBQXdDLEVBQUFsQixLQUFBZ0MsTUFBQXRELEtBQUF3QyxHQUNBeEMsS0FBQXlDLEVBQUFuQixLQUFBZ0MsTUFBQXRELEtBQUF5QyxHQUVBekMsSUFFQSxDQVFBLFdBQUE4SSxHQUtBLE9BSEE5SSxLQUFBd0MsRUFBQWxCLEtBQUF5SCxNQUFBL0ksS0FBQXdDLEdBQ0F4QyxLQUFBeUMsRUFBQW5CLEtBQUF5SCxNQUFBL0ksS0FBQXlDLEdBRUF6QyxJQUVBLENBT0EsTUFBQWdKLEdBS0EsT0FIQWhKLEtBQUF3QyxHQUFBeEMsS0FBQXdDLEVBQ0F4QyxLQUFBeUMsR0FBQXpDLEtBQUF5QyxFQUVBekMsSUFFQSxDQVFBLEdBQUFpSixDQUFBdEIsR0FFQSxPQUFBM0gsS0FBQXdDLEVBQUFtRixFQUFBbkYsRUFBQXhDLEtBQUF5QyxFQUFBa0YsRUFBQWxGLENBRUEsQ0FRQSxLQUFBeUcsQ0FBQXZCLEdBRUEsT0FBQTNILEtBQUF3QyxFQUFBbUYsRUFBQWxGLEVBQUF6QyxLQUFBeUMsRUFBQWtGLEVBQUFuRixDQUVBLENBU0EsUUFBQTJHLEdBRUEsT0FBQW5KLEtBQUF3QyxFQUFBeEMsS0FBQXdDLEVBQUF4QyxLQUFBeUMsRUFBQXpDLEtBQUF5QyxDQUVBLENBT0EsTUFBQXhCLEdBRUEsT0FBQUssS0FBQThILEtBQUFwSixLQUFBd0MsRUFBQXhDLEtBQUF3QyxFQUFBeEMsS0FBQXlDLEVBQUF6QyxLQUFBeUMsRUFFQSxDQU9BLGVBQUE0RyxHQUVBLE9BQUEvSCxLQUFBNkMsSUFBQW5FLEtBQUF3QyxHQUFBbEIsS0FBQTZDLElBQUFuRSxLQUFBeUMsRUFFQSxDQVFBLFNBQUFZLEdBRUEsT0FBQXJELEtBQUFzSSxhQUFBdEksS0FBQWlCLFVBQUEsRUFFQSxDQU9BLEtBQUFxSSxHQUlBLE9BRkFoSSxLQUFBaUksT0FBQXZKLEtBQUF5QyxHQUFBekMsS0FBQXdDLEdBQUFsQixLQUFBQyxFQUlBLENBUUEsT0FBQWlJLENBQUE3QixHQUVBLE1BQUE4QixFQUFBbkksS0FBQThILEtBQUFwSixLQUFBbUosV0FBQXhCLEVBQUF3QixZQUVBLEdBQUEsSUFBQU0sRUFBQSxPQUFBbkksS0FBQUMsR0FBQSxFQUVBLE1BQUFtSSxFQUFBMUosS0FBQWlKLElBQUF0QixHQUFBOEIsRUFJQSxPQUFBbkksS0FBQXFJLEtBQUEzSCxHQUFBMEgsR0FBQSxFQUFBLEdBRUEsQ0FRQSxVQUFBRSxDQUFBakMsR0FFQSxPQUFBckcsS0FBQThILEtBQUFwSixLQUFBNkosa0JBQUFsQyxHQUVBLENBVUEsaUJBQUFrQyxDQUFBbEMsR0FFQSxNQUFBbUMsRUFBQTlKLEtBQUF3QyxFQUFBbUYsRUFBQW5GLEVBQUF1SCxFQUFBL0osS0FBQXlDLEVBQUFrRixFQUFBbEYsRUFDQSxPQUFBcUgsRUFBQUEsRUFBQUMsRUFBQUEsQ0FFQSxDQVFBLG1CQUFBQyxDQUFBckMsR0FFQSxPQUFBckcsS0FBQTZDLElBQUFuRSxLQUFBd0MsRUFBQW1GLEVBQUFuRixHQUFBbEIsS0FBQTZDLElBQUFuRSxLQUFBeUMsRUFBQWtGLEVBQUFsRixFQUVBLENBU0EsU0FBQXdILENBQUFoSixHQUVBLE9BQUFqQixLQUFBcUQsWUFBQStFLGVBQUFuSCxFQUVBLENBV0EsSUFBQXNCLENBQUFvRixFQUFBdUMsR0FLQSxPQUhBbEssS0FBQXdDLElBQUFtRixFQUFBbkYsRUFBQXhDLEtBQUF3QyxHQUFBMEgsRUFDQWxLLEtBQUF5QyxJQUFBa0YsRUFBQWxGLEVBQUF6QyxLQUFBeUMsR0FBQXlILEVBRUFsSyxJQUVBLENBWUEsV0FBQW1LLENBQUFDLEVBQUFDLEVBQUFILEdBS0EsT0FIQWxLLEtBQUF3QyxFQUFBNEgsRUFBQTVILEdBQUE2SCxFQUFBN0gsRUFBQTRILEVBQUE1SCxHQUFBMEgsRUFDQWxLLEtBQUF5QyxFQUFBMkgsRUFBQTNILEdBQUE0SCxFQUFBNUgsRUFBQTJILEVBQUEzSCxHQUFBeUgsRUFFQWxLLElBRUEsQ0FRQSxNQUFBc0ssQ0FBQTNDLEdBRUEsT0FBQUEsRUFBQW5GLElBQUF4QyxLQUFBd0MsR0FBQW1GLEVBQUFsRixJQUFBekMsS0FBQXlDLENBRUEsQ0FVQSxTQUFBOEgsQ0FBQTFKLEVBQUEySixFQUFBLEdBS0EsT0FIQXhLLEtBQUF3QyxFQUFBM0IsRUFBQTJKLEdBQ0F4SyxLQUFBeUMsRUFBQTVCLEVBQUEySixFQUFBLEdBRUF4SyxJQUVBLENBVUEsT0FBQXlLLENBQUE1SixFQUFBLEdBQUEySixFQUFBLEdBS0EsT0FIQTNKLEVBQUEySixHQUFBeEssS0FBQXdDLEVBQ0EzQixFQUFBMkosRUFBQSxHQUFBeEssS0FBQXlDLEVBRUE1QixDQUVBLENBU0EsbUJBQUE2SixDQUFBQyxFQUFBbkssR0FLQSxPQUhBUixLQUFBd0MsRUFBQW1JLEVBQUFDLEtBQUFwSyxHQUNBUixLQUFBeUMsRUFBQWtJLEVBQUFFLEtBQUFySyxHQUVBUixJQUVBLENBU0EsWUFBQThLLENBQUFDLEVBQUF6QixHQUVBLE1BQUF2RCxFQUFBekUsS0FBQTJFLElBQUFxRCxHQUFBeEUsRUFBQXhELEtBQUE0RSxJQUFBb0QsR0FFQTlHLEVBQUF4QyxLQUFBd0MsRUFBQXVJLEVBQUF2SSxFQUNBQyxFQUFBekMsS0FBQXlDLEVBQUFzSSxFQUFBdEksRUFLQSxPQUhBekMsS0FBQXdDLEVBQUFBLEVBQUF1RCxFQUFBdEQsRUFBQXFDLEVBQUFpRyxFQUFBdkksRUFDQXhDLEtBQUF5QyxFQUFBRCxFQUFBc0MsRUFBQXJDLEVBQUFzRCxFQUFBZ0YsRUFBQXRJLEVBRUF6QyxJQUVBLENBUUEsTUFBQTJCLEdBS0EsT0FIQTNCLEtBQUF3QyxFQUFBbEIsS0FBQUssU0FDQTNCLEtBQUF5QyxFQUFBbkIsS0FBQUssU0FFQTNCLElBRUEsQ0FFQSxFQUFBZ0wsT0FBQUMsa0JBRUFqTCxLQUFBd0MsUUFDQXhDLEtBQUF5QyxDQUVBLEVDajBCQSxNQUFBeUksR0FpQkEsV0FBQXRJLENBQUF1SSxFQUFBQyxFQUFBQyxFQUFBQyxFQUFBQyxFQUFBQyxFQUFBQyxFQUFBQyxFQUFBQyxHQVNBVCxHQUFBbkUsVUFBQTZFLFdBQUEsRUFPQTVMLEtBQUF5SSxTQUFBLENBRUEsRUFBQSxFQUFBLEVBQ0EsRUFBQSxFQUFBLEVBQ0EsRUFBQSxFQUFBLFFBSUExSSxJQUFBb0wsR0FFQW5MLEtBQUEyRyxJQUFBd0UsRUFBQUMsRUFBQUMsRUFBQUMsRUFBQUMsRUFBQUMsRUFBQUMsRUFBQUMsRUFBQUMsRUFJQSxDQWlCQSxHQUFBaEYsQ0FBQXdFLEVBQUFDLEVBQUFDLEVBQUFDLEVBQUFDLEVBQUFDLEVBQUFDLEVBQUFDLEVBQUFDLEdBRUEsTUFBQUUsRUFBQTdMLEtBQUF5SSxTQU1BLE9BSkFvRCxFQUFBLEdBQUFWLEVBQUFVLEVBQUEsR0FBQVAsRUFBQU8sRUFBQSxHQUFBSixFQUNBSSxFQUFBLEdBQUFULEVBQUFTLEVBQUEsR0FBQU4sRUFBQU0sRUFBQSxHQUFBSCxFQUNBRyxFQUFBLEdBQUFSLEVBQUFRLEVBQUEsR0FBQUwsRUFBQUssRUFBQSxHQUFBRixFQUVBM0wsSUFFQSxDQU9BLFFBQUE4TCxHQVVBLE9BUkE5TCxLQUFBMkcsSUFFQSxFQUFBLEVBQUEsRUFDQSxFQUFBLEVBQUEsRUFDQSxFQUFBLEVBQUEsR0FJQTNHLElBRUEsQ0FRQSxJQUFBMEgsQ0FBQXBGLEdBRUEsTUFBQXVKLEVBQUE3TCxLQUFBeUksU0FDQXNELEVBQUF6SixFQUFBbUcsU0FNQSxPQUpBb0QsRUFBQSxHQUFBRSxFQUFBLEdBQUFGLEVBQUEsR0FBQUUsRUFBQSxHQUFBRixFQUFBLEdBQUFFLEVBQUEsR0FDQUYsRUFBQSxHQUFBRSxFQUFBLEdBQUFGLEVBQUEsR0FBQUUsRUFBQSxHQUFBRixFQUFBLEdBQUFFLEVBQUEsR0FDQUYsRUFBQSxHQUFBRSxFQUFBLEdBQUFGLEVBQUEsR0FBQUUsRUFBQSxHQUFBRixFQUFBLEdBQUFFLEVBQUEsR0FFQS9MLElBRUEsQ0FVQSxZQUFBZ00sQ0FBQUMsRUFBQUMsRUFBQUMsR0FNQSxPQUpBRixFQUFBRyxxQkFBQXBNLEtBQUEsR0FDQWtNLEVBQUFFLHFCQUFBcE0sS0FBQSxHQUNBbU0sRUFBQUMscUJBQUFwTSxLQUFBLEdBRUFBLElBRUEsQ0FRQSxjQUFBcU0sQ0FBQS9KLEdBRUEsTUFBQXlKLEVBQUF6SixFQUFBbUcsU0FVQSxPQVJBekksS0FBQTJHLElBRUFvRixFQUFBLEdBQUFBLEVBQUEsR0FBQUEsRUFBQSxHQUNBQSxFQUFBLEdBQUFBLEVBQUEsR0FBQUEsRUFBQSxHQUNBQSxFQUFBLEdBQUFBLEVBQUEsR0FBQUEsRUFBQSxLQUlBL0wsSUFFQSxDQVFBLFFBQUFtSSxDQUFBN0YsR0FFQSxPQUFBdEMsS0FBQXNNLGlCQUFBdE0sS0FBQXNDLEVBRUEsQ0FRQSxXQUFBaUssQ0FBQWpLLEdBRUEsT0FBQXRDLEtBQUFzTSxpQkFBQWhLLEVBQUF0QyxLQUVBLENBVUEsZ0JBQUFzTSxDQUFBekcsRUFBQUMsR0FFQSxNQUFBMEcsRUFBQTNHLEVBQUE0QyxTQUNBZ0UsRUFBQTNHLEVBQUEyQyxTQUNBb0QsRUFBQTdMLEtBQUF5SSxTQUVBaUUsRUFBQUYsRUFBQSxHQUFBRyxFQUFBSCxFQUFBLEdBQUFJLEVBQUFKLEVBQUEsR0FDQUssRUFBQUwsRUFBQSxHQUFBTSxFQUFBTixFQUFBLEdBQUFPLEVBQUFQLEVBQUEsR0FDQVEsRUFBQVIsRUFBQSxHQUFBUyxFQUFBVCxFQUFBLEdBQUFVLEVBQUFWLEVBQUEsR0FFQVcsRUFBQVYsRUFBQSxHQUFBVyxFQUFBWCxFQUFBLEdBQUFZLEVBQUFaLEVBQUEsR0FDQWEsRUFBQWIsRUFBQSxHQUFBYyxFQUFBZCxFQUFBLEdBQUFlLEVBQUFmLEVBQUEsR0FDQWdCLEVBQUFoQixFQUFBLEdBQUFpQixFQUFBakIsRUFBQSxHQUFBa0IsRUFBQWxCLEVBQUEsR0FjQSxPQVpBWixFQUFBLEdBQUFhLEVBQUFTLEVBQUFSLEVBQUFXLEVBQUFWLEVBQUFhLEVBQ0E1QixFQUFBLEdBQUFhLEVBQUFVLEVBQUFULEVBQUFZLEVBQUFYLEVBQUFjLEVBQ0E3QixFQUFBLEdBQUFhLEVBQUFXLEVBQUFWLEVBQUFhLEVBQUFaLEVBQUFlLEVBRUE5QixFQUFBLEdBQUFnQixFQUFBTSxFQUFBTCxFQUFBUSxFQUFBUCxFQUFBVSxFQUNBNUIsRUFBQSxHQUFBZ0IsRUFBQU8sRUFBQU4sRUFBQVMsRUFBQVIsRUFBQVcsRUFDQTdCLEVBQUEsR0FBQWdCLEVBQUFRLEVBQUFQLEVBQUFVLEVBQUFULEVBQUFZLEVBRUE5QixFQUFBLEdBQUFtQixFQUFBRyxFQUFBRixFQUFBSyxFQUFBSixFQUFBTyxFQUNBNUIsRUFBQSxHQUFBbUIsRUFBQUksRUFBQUgsRUFBQU0sRUFBQUwsRUFBQVEsRUFDQTdCLEVBQUEsR0FBQW1CLEVBQUFLLEVBQUFKLEVBQUFPLEVBQUFOLEVBQUFTLEVBRUEzTixJQUVBLENBUUEsY0FBQW9JLENBQUF0RCxHQUVBLE1BQUErRyxFQUFBN0wsS0FBQXlJLFNBTUEsT0FKQW9ELEVBQUEsSUFBQS9HLEVBQUErRyxFQUFBLElBQUEvRyxFQUFBK0csRUFBQSxJQUFBL0csRUFDQStHLEVBQUEsSUFBQS9HLEVBQUErRyxFQUFBLElBQUEvRyxFQUFBK0csRUFBQSxJQUFBL0csRUFDQStHLEVBQUEsSUFBQS9HLEVBQUErRyxFQUFBLElBQUEvRyxFQUFBK0csRUFBQSxJQUFBL0csRUFFQTlFLElBRUEsQ0FPQSxXQUFBNE4sR0FFQSxNQUFBL0IsRUFBQTdMLEtBQUF5SSxTQUVBNUMsRUFBQWdHLEVBQUEsR0FBQS9GLEVBQUErRixFQUFBLEdBQUE5RixFQUFBOEYsRUFBQSxHQUNBZ0MsRUFBQWhDLEVBQUEsR0FBQXJELEVBQUFxRCxFQUFBLEdBQUFpQyxFQUFBakMsRUFBQSxHQUNBa0MsRUFBQWxDLEVBQUEsR0FBQW1DLEVBQUFuQyxFQUFBLEdBQUE5SyxFQUFBOEssRUFBQSxHQUVBLE9BQUFoRyxFQUFBMkMsRUFBQXpILEVBQUE4RSxFQUFBaUksRUFBQUUsRUFBQWxJLEVBQUErSCxFQUFBOU0sRUFBQStFLEVBQUFnSSxFQUFBQyxFQUFBaEksRUFBQThILEVBQUFHLEVBQUFqSSxFQUFBeUMsRUFBQXVGLENBRUEsQ0FTQSxNQUFBRSxHQUVBLE1BQUFwQyxFQUFBN0wsS0FBQXlJLFNBRUEwQyxFQUFBVSxFQUFBLEdBQUFQLEVBQUFPLEVBQUEsR0FBQUosRUFBQUksRUFBQSxHQUNBVCxFQUFBUyxFQUFBLEdBQUFOLEVBQUFNLEVBQUEsR0FBQUgsRUFBQUcsRUFBQSxHQUNBUixFQUFBUSxFQUFBLEdBQUFMLEVBQUFLLEVBQUEsR0FBQUYsRUFBQUUsRUFBQSxHQUVBcUMsRUFBQXZDLEVBQUFKLEVBQUFHLEVBQUFGLEVBQ0EyQyxFQUFBekMsRUFBQUwsRUFBQU0sRUFBQVAsRUFDQWdELEVBQUE1QyxFQUFBSixFQUFBRyxFQUFBRixFQUVBZ0QsRUFBQWxELEVBQUErQyxFQUFBNUMsRUFBQTZDLEVBQUExQyxFQUFBMkMsRUFFQSxHQUFBLElBQUFDLEVBQUEsT0FBQXJPLEtBQUEyRyxJQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxHQUVBLE1BQUEySCxFQUFBLEVBQUFELEVBY0EsT0FaQXhDLEVBQUEsR0FBQXFDLEVBQUFJLEVBQ0F6QyxFQUFBLElBQUFKLEVBQUFELEVBQUFHLEVBQUFMLEdBQUFnRCxFQUNBekMsRUFBQSxJQUFBSCxFQUFBSixFQUFBRyxFQUFBRixHQUFBK0MsRUFFQXpDLEVBQUEsR0FBQXNDLEVBQUFHLEVBQ0F6QyxFQUFBLElBQUFGLEVBQUFSLEVBQUFNLEVBQUFKLEdBQUFpRCxFQUNBekMsRUFBQSxJQUFBSixFQUFBTCxFQUFBTSxFQUFBUCxHQUFBbUQsRUFFQXpDLEVBQUEsR0FBQXVDLEVBQUFFLEVBQ0F6QyxFQUFBLElBQUFQLEVBQUFELEVBQUFHLEVBQUFMLEdBQUFtRCxFQUNBekMsRUFBQSxJQUFBTixFQUFBSixFQUFBRyxFQUFBRixHQUFBa0QsRUFFQXRPLElBRUEsQ0FPQSxTQUFBdU8sR0FFQSxJQUFBQyxFQUNBLE1BQUFsTSxFQUFBdEMsS0FBQXlJLFNBTUEsT0FKQStGLEVBQUFsTSxFQUFBLEdBQUFBLEVBQUEsR0FBQUEsRUFBQSxHQUFBQSxFQUFBLEdBQUFrTSxFQUNBQSxFQUFBbE0sRUFBQSxHQUFBQSxFQUFBLEdBQUFBLEVBQUEsR0FBQUEsRUFBQSxHQUFBa00sRUFDQUEsRUFBQWxNLEVBQUEsR0FBQUEsRUFBQSxHQUFBQSxFQUFBLEdBQUFBLEVBQUEsR0FBQWtNLEVBRUF4TyxJQUVBLENBU0EsZUFBQXlPLENBQUFDLEdBRUEsT0FBQTFPLEtBQUFxTSxlQUFBcUMsR0FBQVQsU0FBQU0sV0FFQSxDQVFBLGtCQUFBSSxDQUFBQyxHQUVBLE1BQUF0TSxFQUFBdEMsS0FBQXlJLFNBWUEsT0FWQW1HLEVBQUEsR0FBQXRNLEVBQUEsR0FDQXNNLEVBQUEsR0FBQXRNLEVBQUEsR0FDQXNNLEVBQUEsR0FBQXRNLEVBQUEsR0FDQXNNLEVBQUEsR0FBQXRNLEVBQUEsR0FDQXNNLEVBQUEsR0FBQXRNLEVBQUEsR0FDQXNNLEVBQUEsR0FBQXRNLEVBQUEsR0FDQXNNLEVBQUEsR0FBQXRNLEVBQUEsR0FDQXNNLEVBQUEsR0FBQXRNLEVBQUEsR0FDQXNNLEVBQUEsR0FBQXRNLEVBQUEsR0FFQXRDLElBRUEsQ0FjQSxjQUFBNk8sQ0FBQUMsRUFBQUMsRUFBQUMsRUFBQUMsRUFBQUMsRUFBQUMsRUFBQUMsR0FFQSxNQUFBckosRUFBQXpFLEtBQUEyRSxJQUFBaUosR0FDQXBLLEVBQUF4RCxLQUFBNEUsSUFBQWdKLEdBUUEsT0FOQWxQLEtBQUEyRyxJQUNBcUksRUFBQWpKLEVBQUFpSixFQUFBbEssR0FBQWtLLEdBQUFqSixFQUFBb0osRUFBQXJLLEVBQUFzSyxHQUFBRCxFQUFBTCxHQUNBRyxFQUFBbkssRUFBQW1LLEVBQUFsSixHQUFBa0osSUFBQW5LLEVBQUFxSyxFQUFBcEosRUFBQXFKLEdBQUFBLEVBQUFMLEVBQ0EsRUFBQSxFQUFBLEdBR0EvTyxJQUVBLENBU0EsS0FBQXFQLENBQUFMLEVBQUFDLEdBSUEsT0FGQWpQLEtBQUF1TSxZQUFBK0MsR0FBQUMsVUFBQVAsRUFBQUMsSUFFQWpQLElBRUEsQ0FRQSxNQUFBd1AsQ0FBQTlGLEdBSUEsT0FGQTFKLEtBQUF1TSxZQUFBK0MsR0FBQUcsY0FBQS9GLElBRUExSixJQUVBLENBU0EsU0FBQTBQLENBQUFaLEVBQUFDLEdBSUEsT0FGQS9PLEtBQUF1TSxZQUFBK0MsR0FBQUssZ0JBQUFiLEVBQUFDLElBRUEvTyxJQUVBLENBV0EsZUFBQTJQLENBQUFuTixFQUFBQyxHQXdCQSxPQXRCQUQsRUFBQXdFLFVBRUFoSCxLQUFBMkcsSUFFQSxFQUFBLEVBQUFuRSxFQUFBQSxFQUNBLEVBQUEsRUFBQUEsRUFBQUMsRUFDQSxFQUFBLEVBQUEsR0FNQXpDLEtBQUEyRyxJQUVBLEVBQUEsRUFBQW5FLEVBQ0EsRUFBQSxFQUFBQyxFQUNBLEVBQUEsRUFBQSxHQU1BekMsSUFFQSxDQVFBLFlBQUF5UCxDQUFBL0YsR0FJQSxNQUFBM0QsRUFBQXpFLEtBQUEyRSxJQUFBeUQsR0FDQTVFLEVBQUF4RCxLQUFBNEUsSUFBQXdELEdBVUEsT0FSQTFKLEtBQUEyRyxJQUVBWixHQUFBakIsRUFBQSxFQUNBQSxFQUFBaUIsRUFBQSxFQUNBLEVBQUEsRUFBQSxHQUlBL0YsSUFFQSxDQVNBLFNBQUF1UCxDQUFBL00sRUFBQUMsR0FVQSxPQVJBekMsS0FBQTJHLElBRUFuRSxFQUFBLEVBQUEsRUFDQSxFQUFBQyxFQUFBLEVBQ0EsRUFBQSxFQUFBLEdBSUF6QyxJQUVBLENBUUEsTUFBQXNLLENBQUFzRixHQUVBLE1BQUEvRCxFQUFBN0wsS0FBQXlJLFNBQ0FzRCxFQUFBNkQsRUFBQW5ILFNBRUEsSUFBQSxJQUFBMUgsRUFBQSxFQUFBQSxFQUFBLEVBQUFBLElBRUEsR0FBQThLLEVBQUE5SyxLQUFBZ0wsRUFBQWhMLEdBQUEsT0FBQSxFQUlBLE9BQUEsQ0FFQSxDQVNBLFNBQUF3SixDQUFBMUosRUFBQTJKLEVBQUEsR0FFQSxJQUFBLElBQUF6SixFQUFBLEVBQUFBLEVBQUEsRUFBQUEsSUFFQWYsS0FBQXlJLFNBQUExSCxHQUFBRixFQUFBRSxFQUFBeUosR0FJQSxPQUFBeEssSUFFQSxDQVVBLE9BQUF5SyxDQUFBNUosRUFBQSxHQUFBMkosRUFBQSxHQUVBLE1BQUFxQixFQUFBN0wsS0FBQXlJLFNBY0EsT0FaQTVILEVBQUEySixHQUFBcUIsRUFBQSxHQUNBaEwsRUFBQTJKLEVBQUEsR0FBQXFCLEVBQUEsR0FDQWhMLEVBQUEySixFQUFBLEdBQUFxQixFQUFBLEdBRUFoTCxFQUFBMkosRUFBQSxHQUFBcUIsRUFBQSxHQUNBaEwsRUFBQTJKLEVBQUEsR0FBQXFCLEVBQUEsR0FDQWhMLEVBQUEySixFQUFBLEdBQUFxQixFQUFBLEdBRUFoTCxFQUFBMkosRUFBQSxHQUFBcUIsRUFBQSxHQUNBaEwsRUFBQTJKLEVBQUEsR0FBQXFCLEVBQUEsR0FDQWhMLEVBQUEySixFQUFBLEdBQUFxQixFQUFBLEdBRUFoTCxDQUVBLENBT0EsS0FBQTRHLEdBRUEsT0FBQSxJQUFBekgsS0FBQTRDLGFBQUEySCxVQUFBdkssS0FBQXlJLFNBRUEsRUFJQSxNQUFBNkcsR0FBQSxJQUFBcEUsR0Nsa0JBLFNBQUEyRSxHQUFBaFAsR0FJQSxJQUFBLElBQUFFLEVBQUFGLEVBQUFJLE9BQUEsRUFBQUYsR0FBQSxJQUFBQSxFQUVBLEdBQUFGLEVBQUFFLElBQUEsTUFBQSxPQUFBLEVBSUEsT0FBQSxDQUVBLENBRUEsTUFBQStPLEdBQUEsQ0FDQTNNLFVBQUFBLFVBQ0FILFdBQUFBLFdBQ0ErTSxrQkFBQUEsa0JBQ0E3TSxXQUFBQSxXQUNBSCxZQUFBQSxZQUNBRSxXQUFBQSxXQUNBSCxZQUFBQSxZQUNBRCxhQUFBQSxhQUNBbU4sYUFBQUEsY0FHQSxTQUFBQyxHQUFBcFEsRUFBQXFRLEdBRUEsT0FBQSxJQUFBSixHQUFBalEsR0FBQXFRLEVBRUEsQ0FFQSxTQUFBQyxHQUFBQyxHQUVBLE9BQUFDLFNBQUFGLGdCQUFBLCtCQUFBQyxFQUVBLENBRUEsU0FBQUUsS0FFQSxNQUFBQyxFQUFBSixHQUFBLFVBRUEsT0FEQUksRUFBQUMsTUFBQUMsUUFBQSxRQUNBRixDQUVBLENBRUEsTUFBQUcsR0FBQSxDQUFBLEVBRUEsU0FBQUMsR0FBQUMsR0FFQUEsS0FBQUYsS0FFQUEsR0FBQUUsSUFBQSxFQUVBaEssUUFBQUMsS0FBQStKLEdBRUEsQ0FFQSxTQUFBQyxHQUFBQyxFQUFBQyxFQUFBQyxHQUVBLE9BQUEsSUFBQUMsU0FBQSxTQUFBQyxFQUFBQyxHQXFCQUMsWUFuQkEsU0FBQUMsSUFFQSxPQUFBUCxFQUFBUSxlQUFBUCxFQUFBRCxFQUFBUyx3QkFBQSxJQUVBLEtBQUFULEVBQUFVLFlBQ0FMLElBQ0EsTUFFQSxLQUFBTCxFQUFBVyxnQkFDQUwsV0FBQUMsRUFBQUwsR0FDQSxNQUVBLFFBQ0FFLElBSUEsR0FFQUYsRUFFQSxHQUVBLENBRUEsU0FBQVUsR0FBQUMsR0FFQSxNQUFBclAsRUFBQXFQLEVBQUFsSixTQUdBbkcsRUFBQSxHQUFBLEdBQUFBLEVBQUEsR0FBQSxHQUFBQSxFQUFBLEdBQ0FBLEVBQUEsR0FBQSxHQUFBQSxFQUFBLEdBQUEsR0FBQUEsRUFBQSxHQUNBQSxFQUFBLElBQUEsR0FBQUEsRUFBQSxJQUFBLEdBQUFBLEVBQUEsSUFDQUEsRUFBQSxJQUFBLEdBQUFBLEVBQUEsSUFBQSxHQUFBQSxFQUFBLEdBRUEsQ0FFQSxTQUFBc1AsR0FBQUQsR0FFQSxNQUFBclAsRUFBQXFQLEVBQUFsSixVQUNBLElBQUFuRyxFQUFBLEtBS0FBLEVBQUEsS0FBQUEsRUFBQSxJQUFBLEVBQ0FBLEVBQUEsS0FBQUEsRUFBQSxNQUlBQSxFQUFBLEtBQUFBLEVBQUEsSUFDQUEsRUFBQSxJQUFBLEVBQUFBLEVBQUEsSUFJQSxDQ2xKQSxNQUFBdVAsSUFBQSxJQUFBM0csSUFBQXZFLElBQ0EsU0FBQSxTQUFBLFNBQ0EsUUFBQSxTQUFBLFNBQ0EsU0FBQSxTQUFBLFVBR0FtTCxJQUFBLElBQUE1RyxJQUFBdkUsSUFDQSxXQUFBLFdBQUEsVUFDQSxTQUFBLFVBQUEsU0FDQSxVQUFBLFFBQUEsV0FHQSxTQUFBb0wsS0FFQSxNQUFBQyxFQUFBLENBRUFDLFNBQUEsRUFFQUMsa0JBQUFsVixHQW9CQW1WLE9BQUEsQ0FBQSxFQUVBQyxRQUFBLFNBQUFDLEVBQUFDLEVBQUFDLEdBRUEsT0FBQSxJQUFBdlMsS0FBQWlTLFNBQUFLLElBQUFDLEdBQUFELEdBQUFDLEdBTUF2UyxLQUFBbVMsT0FBQUcsR0FBQUUsV0FBQXRWLEtBRUFtVixFQUFBekQsRUFBQTZELEdBQUFKLEVBQUF6RCxHQUNBeUQsRUFBQXRFLEVBQUEwRSxHQUFBSixFQUFBdEUsR0FDQXNFLEVBQUF2TSxFQUFBMk0sR0FBQUosRUFBQXZNLElBSUE5RixLQUFBbVMsT0FBQUcsR0FBQUksWUFBQTFTLEtBQUFtUyxPQUFBSSxHQUFBRyxZQUVBTCxFQUFBOUosYUFBQXZJLEtBQUFtUyxPQUFBRyxHQUFBSyxPQUNBTixFQUFBOUosYUFBQXZJLEtBQUFtUyxPQUFBSSxHQUFBSyxVQUlBNVMsS0FBQW1TLE9BQUFJLEdBQUFDLFdBQUF0VixLQUVBbVYsRUFBQXpELEVBQUFpRSxHQUFBUixFQUFBekQsR0FDQXlELEVBQUF0RSxFQUFBOEUsR0FBQVIsRUFBQXRFLEdBQ0FzRSxFQUFBdk0sRUFBQStNLEdBQUFSLEVBQUF2TSxJQUlBdU0sR0EzQkFBLENBNkJBLEVBRUFTLHNCQUFBLFNBQUFULEVBQUFFLEdBRUEsT0FBQXZTLEtBQUFvUyxRQUFBQyxFQUFBclMsS0FBQWtTLGtCQUFBSyxFQUVBLEVBRUFRLG9CQUFBLFNBQUFWLEVBQUFDLEdBRUEsT0FBQXRTLEtBQUFvUyxRQUFBQyxFQUFBQyxFQUFBdFMsS0FBQWtTLGtCQUVBLEVBRUFjLGFBQUEsU0FBQUMsR0FFQSxPQUFBalQsS0FBQW1TLE9BQUFjLEdBQUFQLFNBRUEsRUFFQVEsWUFBQSxTQUFBRCxHQUVBLE1OeW9DWSxLTXpvQ1pBLEVBQUFoVyxHQUVBK0MsS0FBQW1TLE9BQUFjLEdBQUFULFFBRUEsRUFFQVcseUJBQUEsU0FBQXZTLEVBQUFxUyxFQUFBalQsS0FBQWtTLG1CQUVBLE9BQUF0UixFQUFBMkosVUFBQXZLLEtBQUFtUyxPQUFBYyxHQUFBRyxzQkFFQSxFQUVBQyxPQUFBLFNBQUFDLEdBRUFDLE9BQUFDLE9BQUF4VCxLQUFBbVMsT0FBQW1CLEVBRUEsRUFJQUcsV0FBQSxTQUFBQyxFQUFBcEIsRUFBQUMsR0FFQSxPQUFBbUIsRUFDQWhNLEtBQUExSCxLQUFBbVMsT0FBQUcsR0FBQUssT0FDQXhLLFNBQUFuSSxLQUFBbVMsT0FBQUksR0FBQUssUUFFQSxFQUVBZSw0QkFBQSxTQUFBVixHQUVBLE9BQUFqVCxLQUFBbVMsT0FBQWMsR0FBQVcsdUJBQUFDLHVCQUVBLEVBRUFDLHFCQUFBLFNBQUFiLEVBQUFqVCxLQUFBa1MsbUJBRUEsT0FBQWxTLEtBQUFtUyxPQUFBYyxHQUFBYyx3QkFBQUMsZ0JBRUEsR0FRQUMsRUFBQSxDQUFBLElBQUEsSUFBQSxHQUFBLEdBQUEsSUFBQSxLQUNBQyxFQUFBLENBQUEsTUFBQSxNQUFBLE9BQ0FDLEVBQUEsQ0FBQSxNQUFBLE1BMkJBLE9BekJBbkMsRUFBQXFCLE9BQUEsQ0FFQXJXLENBQUFBLElBQUEsQ0FDQTBWLFVBQUF1QixFQUNBRyxXQUFBRCxFQUNBM0IsU0FBQXZWLEdBQ0EwVixNQUFBZCxHQUNBZSxRQUFBZCxHQUNBc0Isc0JBQUFjLEVBQ0FILHdCQUFBLENBQUFDLGlCQUFBalgsSUFDQTZXLHVCQUFBLENBQUFDLHdCQUFBOVcsS0FHQUEsQ0FBQUEsSUFBQSxDQUNBMlYsVUFBQXVCLEVBQ0FHLFdBQUFELEVBQ0EzQixTQUFBdFYsR0FDQXlWLE1BQUFkLEdBQ0FlLFFBQUFkLEdBQ0FzQixzQkFBQWMsRUFDQU4sdUJBQUEsQ0FBQUMsd0JBQUE5VyxPQUtBaVYsQ0FFQSxDQUVZLE1BQUFBLEdBQUFELEtBRUwsU0FBQVUsR0FBQTFNLEdBRVAsT0FBQUEsRUFBQSxPQUFBLFlBQUFBLEVBQUF6RSxLQUFBZ0UsSUFBQSxZQUFBUyxFQUFBLFlBQUEsSUFFQSxDQUVPLFNBQUE4TSxHQUFBOU0sR0FFUCxPQUFBQSxFQUFBLFNBQUEsTUFBQUEsRUFBQSxNQUFBekUsS0FBQWdFLElBQUFTLEVBQUEsUUFBQSxJQUVBLENDMUxBLElBQUFzTyxHQU9BLE1BQUFDLEdBU0EsaUJBQUFDLENBQUFDLEVBQUEzVSxFQUFBLGFBRUEsR0FBQSxVQUFBNFUsS0FBQUQsRUFBQUUsS0FFQSxPQUFBRixFQUFBRSxJQUlBLEdBQUEsb0JBQUFDLGtCQUVBLE9BQUFILEVBQUFFLElBSUEsSUFBQW5FLEVBRUEsR0FBQWlFLGFBQUFHLGtCQUVBcEUsRUFBQWlFLE1BRUEsTUFFQXpVLElBQUFzVSxLQUFBQSxHQUFBbEUsR0FBQSxXQUVBa0UsR0FBQXBOLE1BQUF1TixFQUFBdk4sTUFDQW9OLEdBQUFuTixPQUFBc04sRUFBQXROLE9BRUEsTUFBQTBOLEVBQUFQLEdBQUFRLFdBQUEsTUFFQUwsYUFBQU0sVUFFQUYsRUFBQUcsYUFBQVAsRUFBQSxFQUFBLEdBSUFJLEVBQUFJLFVBQUFSLEVBQUEsRUFBQSxFQUFBQSxFQUFBdk4sTUFBQXVOLEVBQUF0TixRQUlBcUosRUFBQThELEVBRUEsQ0FFQSxPQUFBOUQsRUFBQTBFLFVBQUFwVixFQUVBLENBUUEsbUJBQUFxVixDQUFBVixHQUVBLEdBQUEsb0JBQUFXLGtCQUFBWCxhQUFBVyxrQkFDQSxvQkFBQVIsbUJBQUFILGFBQUFHLG1CQUNBLG9CQUFBUyxhQUFBWixhQUFBWSxZQUFBLENBRUEsTUFBQTdFLEVBQUFKLEdBQUEsVUFFQUksRUFBQXRKLE1BQUF1TixFQUFBdk4sTUFDQXNKLEVBQUFySixPQUFBc04sRUFBQXROLE9BRUEsTUFBQTBOLEVBQUFyRSxFQUFBc0UsV0FBQSxNQUNBRCxFQUFBSSxVQUFBUixFQUFBLEVBQUEsRUFBQUEsRUFBQXZOLE1BQUF1TixFQUFBdE4sUUFFQSxNQUFBbU8sRUFBQVQsRUFBQVUsYUFBQSxFQUFBLEVBQUFkLEVBQUF2TixNQUFBdU4sRUFBQXROLFFBQ0FxTyxFQUFBRixFQUFBRSxLQUVBLElBQUEsSUFBQXhVLEVBQUEsRUFBQUEsRUFBQXdVLEVBQUF0VSxPQUFBRixJQUVBd1UsRUFBQXhVLEdBQUEsSUFBQTBSLEdBQUE4QyxFQUFBeFUsR0FBQSxLQU1BLE9BRkE2VCxFQUFBRyxhQUFBTSxFQUFBLEVBQUEsR0FFQTlFLENBRUEsQ0FBQSxHQUFBaUUsRUFBQWUsS0FBQSxDQUVBLE1BQUFBLEVBQUFmLEVBQUFlLEtBQUF6VSxNQUFBLEdBRUEsSUFBQSxJQUFBQyxFQUFBLEVBQUFBLEVBQUF3VSxFQUFBdFUsT0FBQUYsSUFFQXdVLGFBQUF2UyxZQUFBdVMsYUFBQXhGLGtCQUVBd0YsRUFBQXhVLEdBQUFPLEtBQUFtRCxNQUFBLElBQUFnTyxHQUFBOEMsRUFBQXhVLEdBQUEsTUFNQXdVLEVBQUF4VSxHQUFBMFIsR0FBQThDLEVBQUF4VSxJQU1BLE1BQUEsQ0FDQXdVLEtBQUFBLEVBQ0F0TyxNQUFBdU4sRUFBQXZOLE1BQ0FDLE9BQUFzTixFQUFBdE4sT0FHQSxDQUdBLE9BREFOLFFBQUFDLEtBQUEsK0ZBQ0EyTixDQUlBLEVDaklBLElBQUFnQixHQUFBLEVBUUEsTUFBQUMsR0FPQSxXQUFBN1MsQ0FBQTJTLEVBQUEsTUFTQXZWLEtBQUEwVixVQUFBLEVBU0FuQyxPQUFBb0MsZUFBQTNWLEtBQUEsS0FBQSxDQUFBaUMsTUFBQXVULE9BUUF4VixLQUFBNFYsS0FBQW5VLEtBT0F6QixLQUFBdVYsS0FBQUEsRUFXQXZWLEtBQUE2VixXQUFBLEVBU0E3VixLQUFBOFYsUUFBQSxDQUVBLENBV0EsZUFBQUMsQ0FBQTlULElBRUEsSUFBQUEsR0FBQWpDLEtBQUE4VixTQUVBLENBU0EsTUFBQUUsQ0FBQUMsR0FFQSxNQUFBQyxPQUFBblcsSUFBQWtXLEdBQUEsaUJBQUFBLEVBRUEsSUFBQUMsUUFBQW5XLElBQUFrVyxFQUFBRSxPQUFBblcsS0FBQTRWLE1BRUEsT0FBQUssRUFBQUUsT0FBQW5XLEtBQUE0VixNQUlBLE1BQUFRLEVBQUEsQ0FDQVIsS0FBQTVWLEtBQUE0VixLQUNBUyxJQUFBLElBR0FkLEVBQUF2VixLQUFBdVYsS0FFQSxHQUFBLE9BQUFBLEVBQUEsQ0FFQSxJQUFBYyxFQUVBLEdBQUFDLE1BQUFDLFFBQUFoQixHQUFBLENBSUFjLEVBQUEsR0FFQSxJQUFBLElBQUF0VixFQUFBLEVBQUFDLEVBQUF1VSxFQUFBdFUsT0FBQUYsRUFBQUMsRUFBQUQsSUFFQXdVLEVBQUF4VSxHQUFBeVYsY0FFQUgsRUFBQWpXLEtBQUFxVyxHQUFBbEIsRUFBQXhVLEdBQUF5VCxRQUlBNkIsRUFBQWpXLEtBQUFxVyxHQUFBbEIsRUFBQXhVLElBTUEsTUFJQXNWLEVBQUFJLEdBQUFsQixHQUlBYSxFQUFBQyxJQUFBQSxDQUVBLENBUUEsT0FOQUgsSUFFQUQsRUFBQUUsT0FBQW5XLEtBQUE0VixNQUFBUSxHQUlBQSxDQUVBLEVBSUEsU0FBQUssR0FBQWpDLEdBRUEsTUFBQSxvQkFBQVcsa0JBQUFYLGFBQUFXLGtCQUNBLG9CQUFBUixtQkFBQUgsYUFBQUcsbUJBQ0Esb0JBQUFTLGFBQUFaLGFBQUFZLFlBSUFkLEdBQUFDLFdBQUFDLEdBSUFBLEVBQUFlLEtBSUEsQ0FDQUEsS0FBQWUsTUFBQUksS0FBQWxDLEVBQUFlLE1BQ0F0TyxNQUFBdU4sRUFBQXZOLE1BQ0FDLE9BQUFzTixFQUFBdE4sT0FDQXJILEtBQUEyVSxFQUFBZSxLQUFBM1MsWUFBQXdOLE9BS0F4SixRQUFBQyxLQUFBLCtDQUNBLENBQUEsRUFNQSxDQ2pMQSxJQUFBOFAsR0FBQSxFQVVBLE1BQUFDLFdBQUFqWCxHQWdCQSxXQUFBaUQsQ0FBQTRSLEVBQUFvQyxHQUFBQyxjQUFBQyxFQUFBRixHQUFBRyxnQkFBQUMsRUFBQTNmLEtBQUE0ZixFQUFBNWYsS0FBQTZmLEVBQUF0ZixLQUFBdWYsRUFBQXBmLEtBQUFxZixFQUFBcmUsS0FBQThHLEVBQUE1SCxLQUFBb2YsRUFBQVQsR0FBQVUsbUJBQUFyRSxFVGdzQ1ksSVM5ckNac0UsUUFTQXZYLEtBQUF3WCxXQUFBLEVBU0FqRSxPQUFBb0MsZUFBQTNWLEtBQUEsS0FBQSxDQUFBaUMsTUFBQTBVLE9BUUEzVyxLQUFBNFYsS0FBQW5VLEtBT0F6QixLQUFBb1EsS0FBQSxHQVVBcFEsS0FBQXlYLE9BQUEsSUFBQWhDLEdBQUFqQixHQU9BeFUsS0FBQTBYLFFBQUEsR0FTQTFYLEtBQUE4VyxRQUFBQSxFQVNBOVcsS0FBQTJYLFFBQUEsRUFTQTNYLEtBQUFnWCxNQUFBQSxFQVNBaFgsS0FBQWlYLE1BQUFBLEVBUUFqWCxLQUFBa1gsVUFBQUEsRUFRQWxYLEtBQUFtWCxVQUFBQSxFQVdBblgsS0FBQXFYLFdBQUFBLEVBUUFyWCxLQUFBb1gsT0FBQUEsRUFXQXBYLEtBQUE0WCxlQUFBLEtBUUE1WCxLQUFBSCxLQUFBQSxFQVNBRyxLQUFBd0ssT0FBQSxJQUFBMUQsR0FBQSxFQUFBLEdBV0E5RyxLQUFBNlgsT0FBQSxJQUFBL1EsR0FBQSxFQUFBLEdBU0E5RyxLQUFBK0ssT0FBQSxJQUFBakUsR0FBQSxFQUFBLEdBU0E5RyxLQUFBa1AsU0FBQSxFQVlBbFAsS0FBQThYLGtCQUFBLEVBT0E5WCxLQUFBNFAsT0FBQSxJQUFBMUUsR0FVQWxMLEtBQUErWCxpQkFBQSxFQVlBL1gsS0FBQWdZLGtCQUFBLEVBWUFoWSxLQUFBaVksT0FBQSxFQVVBalksS0FBQWtZLGdCQUFBLEVBUUFsWSxLQUFBaVQsV0FBQUEsRUFRQWpULEtBQUFtWSxTQUFBLENBQUEsRUFTQW5ZLEtBQUE4VixRQUFBLEVBU0E5VixLQUFBb1ksU0FBQSxLQVFBcFksS0FBQXFZLGFBQUEsS0FTQXJZLEtBQUFzWSx1QkFBQSxFQVVBdFksS0FBQXVZLGFBQUEsQ0FFQSxDQU9BLFNBQUEvRCxHQUVBLE9BQUF4VSxLQUFBeVgsT0FBQWxDLElBRUEsQ0FFQSxTQUFBZixDQUFBdlMsRUFBQSxNQUVBakMsS0FBQXlYLE9BQUFsQyxLQUFBdFQsQ0FFQSxDQU1BLFlBQUF1VyxHQUVBeFksS0FBQTRQLE9BQUFmLGVBQUE3TyxLQUFBd0ssT0FBQWhJLEVBQUF4QyxLQUFBd0ssT0FBQS9ILEVBQUF6QyxLQUFBNlgsT0FBQXJWLEVBQUF4QyxLQUFBNlgsT0FBQXBWLEVBQUF6QyxLQUFBa1AsU0FBQWxQLEtBQUErSyxPQUFBdkksRUFBQXhDLEtBQUErSyxPQUFBdEksRUFFQSxDQU9BLEtBQUFnRixHQUVBLE9BQUEsSUFBQXpILEtBQUE0QyxhQUFBOEUsS0FBQTFILEtBRUEsQ0FRQSxJQUFBMEgsQ0FBQStQLEdBMkNBLE9BekNBelgsS0FBQW9RLEtBQUFxSCxFQUFBckgsS0FFQXBRLEtBQUF5WCxPQUFBQSxFQUFBQSxPQUNBelgsS0FBQTBYLFFBQUFELEVBQUFDLFFBQUE1VyxNQUFBLEdBRUFkLEtBQUE4VyxRQUFBVyxFQUFBWCxRQUNBOVcsS0FBQTJYLFFBQUFGLEVBQUFFLFFBRUEzWCxLQUFBZ1gsTUFBQVMsRUFBQVQsTUFDQWhYLEtBQUFpWCxNQUFBUSxFQUFBUixNQUVBalgsS0FBQWtYLFVBQUFPLEVBQUFQLFVBQ0FsWCxLQUFBbVgsVUFBQU0sRUFBQU4sVUFFQW5YLEtBQUFxWCxXQUFBSSxFQUFBSixXQUVBclgsS0FBQW9YLE9BQUFLLEVBQUFMLE9BQ0FwWCxLQUFBNFgsZUFBQUgsRUFBQUcsZUFDQTVYLEtBQUFILEtBQUE0WCxFQUFBNVgsS0FFQUcsS0FBQXdLLE9BQUE5QyxLQUFBK1AsRUFBQWpOLFFBQ0F4SyxLQUFBNlgsT0FBQW5RLEtBQUErUCxFQUFBSSxRQUNBN1gsS0FBQStLLE9BQUFyRCxLQUFBK1AsRUFBQTFNLFFBQ0EvSyxLQUFBa1AsU0FBQXVJLEVBQUF2SSxTQUVBbFAsS0FBQThYLGlCQUFBTCxFQUFBSyxpQkFDQTlYLEtBQUE0UCxPQUFBbEksS0FBQStQLEVBQUE3SCxRQUVBNVAsS0FBQStYLGdCQUFBTixFQUFBTSxnQkFDQS9YLEtBQUFnWSxpQkFBQVAsRUFBQU8saUJBQ0FoWSxLQUFBaVksTUFBQVIsRUFBQVEsTUFDQWpZLEtBQUFrWSxnQkFBQVQsRUFBQVMsZ0JBQ0FsWSxLQUFBaVQsV0FBQXdFLEVBQUF4RSxXQUVBalQsS0FBQXFZLGFBQUFaLEVBQUFZLGFBQ0FyWSxLQUFBc1ksc0JBQUFiLEVBQUFhLHNCQUVBdFksS0FBQW1ZLFNBQUFNLEtBQUFDLE1BQUFELEtBQUFFLFVBQUFsQixFQUFBVSxXQUVBblksS0FBQStWLGFBQUEsRUFFQS9WLElBRUEsQ0FTQSxNQUFBZ1csQ0FBQUMsR0FFQSxNQUFBQyxPQUFBblcsSUFBQWtXLEdBQUEsaUJBQUFBLEVBRUEsSUFBQUMsUUFBQW5XLElBQUFrVyxFQUFBMkMsU0FBQTVZLEtBQUE0VixNQUVBLE9BQUFLLEVBQUEyQyxTQUFBNVksS0FBQTRWLE1BSUEsTUFBQVEsRUFBQSxDQUVBeUMsU0FBQSxDQUNBL0MsUUFBQSxJQUNBalcsS0FBQSxVQUNBaVosVUFBQSxrQkFHQWxELEtBQUE1VixLQUFBNFYsS0FDQXhGLEtBQUFwUSxLQUFBb1EsS0FFQW9FLE1BQUF4VSxLQUFBeVgsT0FBQXpCLE9BQUFDLEdBQUFMLEtBRUFrQixRQUFBOVcsS0FBQThXLFFBQ0FhLFFBQUEzWCxLQUFBMlgsUUFFQUUsT0FBQSxDQUFBN1gsS0FBQTZYLE9BQUFyVixFQUFBeEMsS0FBQTZYLE9BQUFwVixHQUNBK0gsT0FBQSxDQUFBeEssS0FBQXdLLE9BQUFoSSxFQUFBeEMsS0FBQXdLLE9BQUEvSCxHQUNBc0ksT0FBQSxDQUFBL0ssS0FBQStLLE9BQUF2SSxFQUFBeEMsS0FBQStLLE9BQUF0SSxHQUNBeU0sU0FBQWxQLEtBQUFrUCxTQUVBNkosS0FBQSxDQUFBL1ksS0FBQWdYLE1BQUFoWCxLQUFBaVgsT0FFQUcsT0FBQXBYLEtBQUFvWCxPQUNBUSxlQUFBNVgsS0FBQTRYLGVBQ0EvWCxLQUFBRyxLQUFBSCxLQUNBb1QsV0FBQWpULEtBQUFpVCxXQUVBa0UsVUFBQW5YLEtBQUFtWCxVQUNBRCxVQUFBbFgsS0FBQWtYLFVBQ0FHLFdBQUFyWCxLQUFBcVgsV0FFQVksTUFBQWpZLEtBQUFpWSxNQUVBRixnQkFBQS9YLEtBQUErWCxnQkFDQUMsaUJBQUFoWSxLQUFBZ1ksaUJBQ0FFLGdCQUFBbFksS0FBQWtZLGlCQVlBLE9BUkEzRSxPQUFBeUYsS0FBQWhaLEtBQUFtWSxVQUFBbFgsT0FBQSxJQUFBbVYsRUFBQStCLFNBQUFuWSxLQUFBbVksVUFFQWpDLElBRUFELEVBQUEyQyxTQUFBNVksS0FBQTRWLE1BQUFRLEdBSUFBLENBRUEsQ0FRQSxPQUFBNkMsR0FRQWpaLEtBQUFVLGNBQUEsQ0FBQWIsS0FBQSxXQUVBLENBUUEsV0FBQXFaLENBQUFDLEdBRUEsR0FBQW5aLEtBQUE4VyxVQUFBaGdCLEdBQUEsT0FBQXFpQixFQUlBLEdBRkFBLEVBQUE1USxhQUFBdkksS0FBQTRQLFFBRUF1SixFQUFBM1csRUFBQSxHQUFBMlcsRUFBQTNXLEVBQUEsRUFFQSxPQUFBeEMsS0FBQWdYLE9BRUEsS0FBQTVmLEdBRUEraEIsRUFBQTNXLEVBQUEyVyxFQUFBM1csRUFBQWxCLEtBQUFtRCxNQUFBMFUsRUFBQTNXLEdBQ0EsTUFFQSxLQUFBbkwsR0FFQThoQixFQUFBM1csRUFBQTJXLEVBQUEzVyxFQUFBLEVBQUEsRUFBQSxFQUNBLE1BRUEsS0FBQWxMLEdBRUEsSUFBQWdLLEtBQUE2QyxJQUFBN0MsS0FBQW1ELE1BQUEwVSxFQUFBM1csR0FBQSxHQUVBMlcsRUFBQTNXLEVBQUFsQixLQUFBaUUsS0FBQTRULEVBQUEzVyxHQUFBMlcsRUFBQTNXLEVBSUEyVyxFQUFBM1csRUFBQTJXLEVBQUEzVyxFQUFBbEIsS0FBQW1ELE1BQUEwVSxFQUFBM1csR0FVQSxHQUFBMlcsRUFBQTFXLEVBQUEsR0FBQTBXLEVBQUExVyxFQUFBLEVBRUEsT0FBQXpDLEtBQUFpWCxPQUVBLEtBQUE3ZixHQUVBK2hCLEVBQUExVyxFQUFBMFcsRUFBQTFXLEVBQUFuQixLQUFBbUQsTUFBQTBVLEVBQUExVyxHQUNBLE1BRUEsS0FBQXBMLEdBRUE4aEIsRUFBQTFXLEVBQUEwVyxFQUFBMVcsRUFBQSxFQUFBLEVBQUEsRUFDQSxNQUVBLEtBQUFuTCxHQUVBLElBQUFnSyxLQUFBNkMsSUFBQTdDLEtBQUFtRCxNQUFBMFUsRUFBQTFXLEdBQUEsR0FFQTBXLEVBQUExVyxFQUFBbkIsS0FBQWlFLEtBQUE0VCxFQUFBMVcsR0FBQTBXLEVBQUExVyxFQUlBMFcsRUFBQTFXLEVBQUEwVyxFQUFBMVcsRUFBQW5CLEtBQUFtRCxNQUFBMFUsRUFBQTFXLEdBZ0JBLE9BTkF6QyxLQUFBaVksUUFFQWtCLEVBQUExVyxFQUFBLEVBQUEwVyxFQUFBMVcsR0FJQTBXLENBRUEsQ0FXQSxlQUFBcEQsQ0FBQTlULElBRUEsSUFBQUEsSUFFQWpDLEtBQUE4VixVQUNBOVYsS0FBQXlYLE9BQUExQixhQUFBLEVBSUEsQ0FVQSxvQkFBQXFELENBQUFuWCxJQUVBLElBQUFBLEdBRUFqQyxLQUFBdVksY0FJQSxFQVdBM0IsR0FBQUMsY0FBQSxLQVNBRCxHQUFBRyxnQkFBQWpnQixHQVNBOGYsR0FBQVUsbUJBQUEsRUM5b0JBLE1BQUErQixHQVVBLFdBQUF6VyxDQUFBSixFQUFBLEVBQUFDLEVBQUEsRUFBQTZXLEVBQUEsRUFBQUMsRUFBQSxHQVNBRixHQUFBdFMsVUFBQXlTLFdBQUEsRUFPQXhaLEtBQUF3QyxFQUFBQSxFQU9BeEMsS0FBQXlDLEVBQUFBLEVBT0F6QyxLQUFBc1osRUFBQUEsRUFPQXRaLEtBQUF1WixFQUFBQSxDQUVBLENBT0EsU0FBQXRTLEdBRUEsT0FBQWpILEtBQUFzWixDQUVBLENBRUEsU0FBQXJTLENBQUFoRixHQUVBakMsS0FBQXNaLEVBQUFyWCxDQUVBLENBT0EsVUFBQWlGLEdBRUEsT0FBQWxILEtBQUF1WixDQUVBLENBRUEsVUFBQXJTLENBQUFqRixHQUVBakMsS0FBQXVaLEVBQUF0WCxDQUVBLENBV0EsR0FBQTBFLENBQUFuRSxFQUFBQyxFQUFBNlcsRUFBQUMsR0FPQSxPQUxBdlosS0FBQXdDLEVBQUFBLEVBQ0F4QyxLQUFBeUMsRUFBQUEsRUFDQXpDLEtBQUFzWixFQUFBQSxFQUNBdFosS0FBQXVaLEVBQUFBLEVBRUF2WixJQUVBLENBUUEsU0FBQW1ILENBQUFDLEdBT0EsT0FMQXBILEtBQUF3QyxFQUFBNEUsRUFDQXBILEtBQUF5QyxFQUFBMkUsRUFDQXBILEtBQUFzWixFQUFBbFMsRUFDQXBILEtBQUF1WixFQUFBblMsRUFFQXBILElBRUEsQ0FRQSxJQUFBcUgsQ0FBQTdFLEdBSUEsT0FGQXhDLEtBQUF3QyxFQUFBQSxFQUVBeEMsSUFFQSxDQVFBLElBQUFzSCxDQUFBN0UsR0FJQSxPQUZBekMsS0FBQXlDLEVBQUFBLEVBRUF6QyxJQUVBLENBUUEsSUFBQXlaLENBQUFILEdBSUEsT0FGQXRaLEtBQUFzWixFQUFBQSxFQUVBdFosSUFFQSxDQVFBLElBQUEwWixDQUFBSCxHQUlBLE9BRkF2WixLQUFBdVosRUFBQUEsRUFFQXZaLElBRUEsQ0FVQSxZQUFBdUgsQ0FBQS9HLEVBQUF5QixHQUVBLE9BQUF6QixHQUVBLEtBQUEsRUFBQVIsS0FBQXdDLEVBQUFQLEVBQUEsTUFDQSxLQUFBLEVBQUFqQyxLQUFBeUMsRUFBQVIsRUFBQSxNQUNBLEtBQUEsRUFBQWpDLEtBQUFzWixFQUFBclgsRUFBQSxNQUNBLEtBQUEsRUFBQWpDLEtBQUF1WixFQUFBdFgsRUFBQSxNQUNBLFFBQUEsTUFBQSxJQUFBbUIsTUFBQSwwQkFBQTVDLEdBSUEsT0FBQVIsSUFFQSxDQVNBLFlBQUF3SCxDQUFBaEgsR0FFQSxPQUFBQSxHQUVBLEtBQUEsRUFBQSxPQUFBUixLQUFBd0MsRUFDQSxLQUFBLEVBQUEsT0FBQXhDLEtBQUF5QyxFQUNBLEtBQUEsRUFBQSxPQUFBekMsS0FBQXNaLEVBQ0EsS0FBQSxFQUFBLE9BQUF0WixLQUFBdVosRUFDQSxRQUFBLE1BQUEsSUFBQW5XLE1BQUEsMEJBQUE1QyxHQUlBLENBT0EsS0FBQWlILEdBRUEsT0FBQSxJQUFBekgsS0FBQTRDLFlBQUE1QyxLQUFBd0MsRUFBQXhDLEtBQUF5QyxFQUFBekMsS0FBQXNaLEVBQUF0WixLQUFBdVosRUFFQSxDQVFBLElBQUE3UixDQUFBQyxHQU9BLE9BTEEzSCxLQUFBd0MsRUFBQW1GLEVBQUFuRixFQUNBeEMsS0FBQXlDLEVBQUFrRixFQUFBbEYsRUFDQXpDLEtBQUFzWixFQUFBM1IsRUFBQTJSLEVBQ0F0WixLQUFBdVosT0FBQXhaLElBQUE0SCxFQUFBNFIsRUFBQTVSLEVBQUE0UixFQUFBLEVBRUF2WixJQUVBLENBUUEsR0FBQTRILENBQUFELEdBT0EsT0FMQTNILEtBQUF3QyxHQUFBbUYsRUFBQW5GLEVBQ0F4QyxLQUFBeUMsR0FBQWtGLEVBQUFsRixFQUNBekMsS0FBQXNaLEdBQUEzUixFQUFBMlIsRUFDQXRaLEtBQUF1WixHQUFBNVIsRUFBQTRSLEVBRUF2WixJQUVBLENBUUEsU0FBQTZILENBQUEvQyxHQU9BLE9BTEE5RSxLQUFBd0MsR0FBQXNDLEVBQ0E5RSxLQUFBeUMsR0FBQXFDLEVBQ0E5RSxLQUFBc1osR0FBQXhVLEVBQ0E5RSxLQUFBdVosR0FBQXpVLEVBRUE5RSxJQUVBLENBU0EsVUFBQThILENBQUFqQyxFQUFBQyxHQU9BLE9BTEE5RixLQUFBd0MsRUFBQXFELEVBQUFyRCxFQUFBc0QsRUFBQXRELEVBQ0F4QyxLQUFBeUMsRUFBQW9ELEVBQUFwRCxFQUFBcUQsRUFBQXJELEVBQ0F6QyxLQUFBc1osRUFBQXpULEVBQUF5VCxFQUFBeFQsRUFBQXdULEVBQ0F0WixLQUFBdVosRUFBQTFULEVBQUEwVCxFQUFBelQsRUFBQXlULEVBRUF2WixJQUVBLENBU0EsZUFBQStILENBQUFKLEVBQUE3QyxHQU9BLE9BTEE5RSxLQUFBd0MsR0FBQW1GLEVBQUFuRixFQUFBc0MsRUFDQTlFLEtBQUF5QyxHQUFBa0YsRUFBQWxGLEVBQUFxQyxFQUNBOUUsS0FBQXNaLEdBQUEzUixFQUFBMlIsRUFBQXhVLEVBQ0E5RSxLQUFBdVosR0FBQTVSLEVBQUE0UixFQUFBelUsRUFFQTlFLElBRUEsQ0FRQSxHQUFBZ0ksQ0FBQUwsR0FPQSxPQUxBM0gsS0FBQXdDLEdBQUFtRixFQUFBbkYsRUFDQXhDLEtBQUF5QyxHQUFBa0YsRUFBQWxGLEVBQ0F6QyxLQUFBc1osR0FBQTNSLEVBQUEyUixFQUNBdFosS0FBQXVaLEdBQUE1UixFQUFBNFIsRUFFQXZaLElBRUEsQ0FRQSxTQUFBaUksQ0FBQW5ELEdBT0EsT0FMQTlFLEtBQUF3QyxHQUFBc0MsRUFDQTlFLEtBQUF5QyxHQUFBcUMsRUFDQTlFLEtBQUFzWixHQUFBeFUsRUFDQTlFLEtBQUF1WixHQUFBelUsRUFFQTlFLElBRUEsQ0FTQSxVQUFBa0ksQ0FBQXJDLEVBQUFDLEdBT0EsT0FMQTlGLEtBQUF3QyxFQUFBcUQsRUFBQXJELEVBQUFzRCxFQUFBdEQsRUFDQXhDLEtBQUF5QyxFQUFBb0QsRUFBQXBELEVBQUFxRCxFQUFBckQsRUFDQXpDLEtBQUFzWixFQUFBelQsRUFBQXlULEVBQUF4VCxFQUFBd1QsRUFDQXRaLEtBQUF1WixFQUFBMVQsRUFBQTBULEVBQUF6VCxFQUFBeVQsRUFFQXZaLElBRUEsQ0FRQSxRQUFBbUksQ0FBQVIsR0FPQSxPQUxBM0gsS0FBQXdDLEdBQUFtRixFQUFBbkYsRUFDQXhDLEtBQUF5QyxHQUFBa0YsRUFBQWxGLEVBQ0F6QyxLQUFBc1osR0FBQTNSLEVBQUEyUixFQUNBdFosS0FBQXVaLEdBQUE1UixFQUFBNFIsRUFFQXZaLElBRUEsQ0FRQSxjQUFBb0ksQ0FBQWhCLEdBT0EsT0FMQXBILEtBQUF3QyxHQUFBNEUsRUFDQXBILEtBQUF5QyxHQUFBMkUsRUFDQXBILEtBQUFzWixHQUFBbFMsRUFDQXBILEtBQUF1WixHQUFBblMsRUFFQXBILElBRUEsQ0FRQSxZQUFBMlosQ0FBQXJYLEdBRUEsTUFBQUUsRUFBQXhDLEtBQUF3QyxFQUFBQyxFQUFBekMsS0FBQXlDLEVBQUE2VyxFQUFBdFosS0FBQXNaLEVBQUFDLEVBQUF2WixLQUFBdVosRUFDQS9RLEVBQUFsRyxFQUFBbUcsU0FPQSxPQUxBekksS0FBQXdDLEVBQUFnRyxFQUFBLEdBQUFoRyxFQUFBZ0csRUFBQSxHQUFBL0YsRUFBQStGLEVBQUEsR0FBQThRLEVBQUE5USxFQUFBLElBQUErUSxFQUNBdlosS0FBQXlDLEVBQUErRixFQUFBLEdBQUFoRyxFQUFBZ0csRUFBQSxHQUFBL0YsRUFBQStGLEVBQUEsR0FBQThRLEVBQUE5USxFQUFBLElBQUErUSxFQUNBdlosS0FBQXNaLEVBQUE5USxFQUFBLEdBQUFoRyxFQUFBZ0csRUFBQSxHQUFBL0YsRUFBQStGLEVBQUEsSUFBQThRLEVBQUE5USxFQUFBLElBQUErUSxFQUNBdlosS0FBQXVaLEVBQUEvUSxFQUFBLEdBQUFoRyxFQUFBZ0csRUFBQSxHQUFBL0YsRUFBQStGLEVBQUEsSUFBQThRLEVBQUE5USxFQUFBLElBQUErUSxFQUVBdlosSUFFQSxDQVFBLE1BQUFxSSxDQUFBVixHQU9BLE9BTEEzSCxLQUFBd0MsR0FBQW1GLEVBQUFuRixFQUNBeEMsS0FBQXlDLEdBQUFrRixFQUFBbEYsRUFDQXpDLEtBQUFzWixHQUFBM1IsRUFBQTJSLEVBQ0F0WixLQUFBdVosR0FBQTVSLEVBQUE0UixFQUVBdlosSUFFQSxDQVFBLFlBQUFzSSxDQUFBbEIsR0FFQSxPQUFBcEgsS0FBQW9JLGVBQUEsRUFBQWhCLEVBRUEsQ0FTQSwwQkFBQXdTLENBQUFoVSxHQU1BNUYsS0FBQXVaLEVBQUEsRUFBQWpZLEtBQUFxSSxLQUFBL0QsRUFBQTJULEdBRUEsTUFBQXpVLEVBQUF4RCxLQUFBOEgsS0FBQSxFQUFBeEQsRUFBQTJULEVBQUEzVCxFQUFBMlQsR0FnQkEsT0FkQXpVLEVBQUEsTUFFQTlFLEtBQUF3QyxFQUFBLEVBQ0F4QyxLQUFBeUMsRUFBQSxFQUNBekMsS0FBQXNaLEVBQUEsSUFJQXRaLEtBQUF3QyxFQUFBb0QsRUFBQXBELEVBQUFzQyxFQUNBOUUsS0FBQXlDLEVBQUFtRCxFQUFBbkQsRUFBQXFDLEVBQ0E5RSxLQUFBc1osRUFBQTFULEVBQUEwVCxFQUFBeFUsR0FJQTlFLElBRUEsQ0FTQSw4QkFBQTZaLENBQUF2WCxHQU1BLElBQUFnSCxFQUFBOUcsRUFBQUMsRUFBQTZXLEVBQ0EsTUFBQVEsRUFBQSxJQUNBQyxFQUFBLEdBRUFsTyxFQUFBdkosRUFBQW1HLFNBRUF1UixFQUFBbk8sRUFBQSxHQUFBb08sRUFBQXBPLEVBQUEsR0FBQXFPLEVBQUFyTyxFQUFBLEdBQ0FzTyxFQUFBdE8sRUFBQSxHQUFBdU8sRUFBQXZPLEVBQUEsR0FBQXdPLEVBQUF4TyxFQUFBLEdBQ0F5TyxFQUFBek8sRUFBQSxHQUFBME8sRUFBQTFPLEVBQUEsR0FBQTJPLEVBQUEzTyxFQUFBLElBRUEsR0FBQXZLLEtBQUE2QyxJQUFBOFYsRUFBQUUsR0FBQUwsR0FDQXhZLEtBQUE2QyxJQUFBK1YsRUFBQUksR0FBQVIsR0FDQXhZLEtBQUE2QyxJQUFBa1csRUFBQUUsR0FBQVQsRUFBQSxDQU1BLEdBQUF4WSxLQUFBNkMsSUFBQThWLEVBQUFFLEdBQUFKLEdBQ0F6WSxLQUFBNkMsSUFBQStWLEVBQUFJLEdBQUFQLEdBQ0F6WSxLQUFBNkMsSUFBQWtXLEVBQUFFLEdBQUFSLEdBQ0F6WSxLQUFBNkMsSUFBQTZWLEVBQUFJLEVBQUFJLEVBQUEsR0FBQVQsRUFNQSxPQUZBL1osS0FBQTJHLElBQUEsRUFBQSxFQUFBLEVBQUEsR0FFQTNHLEtBTUFzSixFQUFBaEksS0FBQUMsR0FFQSxNQUFBa1osR0FBQVQsRUFBQSxHQUFBLEVBQ0FVLEdBQUFOLEVBQUEsR0FBQSxFQUNBTyxHQUFBSCxFQUFBLEdBQUEsRUFDQUksR0FBQVgsRUFBQUUsR0FBQSxFQUNBVSxHQUFBWCxFQUFBSSxHQUFBLEVBQ0FRLEdBQUFULEVBQUFFLEdBQUEsRUE0REEsT0ExREFFLEVBQUFDLEdBQUFELEVBQUFFLEVBSUFGLEVBQUFYLEdBRUF0WCxFQUFBLEVBQ0FDLEVBQUEsV0FDQTZXLEVBQUEsYUFJQTlXLEVBQUFsQixLQUFBOEgsS0FBQXFSLEdBQ0FoWSxFQUFBbVksRUFBQXBZLEVBQ0E4VyxFQUFBdUIsRUFBQXJZLEdBSUFrWSxFQUFBQyxFQUlBRCxFQUFBWixHQUVBdFgsRUFBQSxXQUNBQyxFQUFBLEVBQ0E2VyxFQUFBLGFBSUE3VyxFQUFBbkIsS0FBQThILEtBQUFzUixHQUNBbFksRUFBQW9ZLEVBQUFuWSxFQUNBNlcsRUFBQXdCLEVBQUFyWSxHQVFBa1ksRUFBQWIsR0FFQXRYLEVBQUEsV0FDQUMsRUFBQSxXQUNBNlcsRUFBQSxJQUlBQSxFQUFBaFksS0FBQThILEtBQUF1UixHQUNBblksRUFBQXFZLEVBQUF2QixFQUNBN1csRUFBQXFZLEVBQUF4QixHQU1BdFosS0FBQTJHLElBQUFuRSxFQUFBQyxFQUFBNlcsRUFBQWhRLEdBRUF0SixJQUVBLENBSUEsSUFBQThFLEVBQUF4RCxLQUFBOEgsTUFBQW1SLEVBQUFGLElBQUFFLEVBQUFGLElBQ0FILEVBQUFJLElBQUFKLEVBQUFJLElBQ0FILEVBQUFGLElBQUFFLEVBQUFGLElBWUEsT0FWQTNZLEtBQUE2QyxJQUFBVyxHQUFBLE9BQUFBLEVBQUEsR0FLQTlFLEtBQUF3QyxHQUFBK1gsRUFBQUYsR0FBQXZWLEVBQ0E5RSxLQUFBeUMsR0FBQXlYLEVBQUFJLEdBQUF4VixFQUNBOUUsS0FBQXNaLEdBQUFhLEVBQUFGLEdBQUFuVixFQUNBOUUsS0FBQXVaLEVBQUFqWSxLQUFBcUksTUFBQXFRLEVBQUFJLEVBQUFJLEVBQUEsR0FBQSxHQUVBeGEsSUFFQSxDQVNBLHFCQUFBK2EsQ0FBQXpZLEdBRUEsTUFBQWtHLEVBQUFsRyxFQUFBbUcsU0FPQSxPQUxBekksS0FBQXdDLEVBQUFnRyxFQUFBLElBQ0F4SSxLQUFBeUMsRUFBQStGLEVBQUEsSUFDQXhJLEtBQUFzWixFQUFBOVEsRUFBQSxJQUNBeEksS0FBQXVaLEVBQUEvUSxFQUFBLElBRUF4SSxJQUVBLENBU0EsR0FBQWtDLENBQUF5RixHQU9BLE9BTEEzSCxLQUFBd0MsRUFBQWxCLEtBQUFZLElBQUFsQyxLQUFBd0MsRUFBQW1GLEVBQUFuRixHQUNBeEMsS0FBQXlDLEVBQUFuQixLQUFBWSxJQUFBbEMsS0FBQXlDLEVBQUFrRixFQUFBbEYsR0FDQXpDLEtBQUFzWixFQUFBaFksS0FBQVksSUFBQWxDLEtBQUFzWixFQUFBM1IsRUFBQTJSLEdBQ0F0WixLQUFBdVosRUFBQWpZLEtBQUFZLElBQUFsQyxLQUFBdVosRUFBQTVSLEVBQUE0UixHQUVBdlosSUFFQSxDQVNBLEdBQUFtQyxDQUFBd0YsR0FPQSxPQUxBM0gsS0FBQXdDLEVBQUFsQixLQUFBYSxJQUFBbkMsS0FBQXdDLEVBQUFtRixFQUFBbkYsR0FDQXhDLEtBQUF5QyxFQUFBbkIsS0FBQWEsSUFBQW5DLEtBQUF5QyxFQUFBa0YsRUFBQWxGLEdBQ0F6QyxLQUFBc1osRUFBQWhZLEtBQUFhLElBQUFuQyxLQUFBc1osRUFBQTNSLEVBQUEyUixHQUNBdFosS0FBQXVaLEVBQUFqWSxLQUFBYSxJQUFBbkMsS0FBQXVaLEVBQUE1UixFQUFBNFIsR0FFQXZaLElBRUEsQ0FZQSxLQUFBZ0MsQ0FBQUUsRUFBQUMsR0FTQSxPQUxBbkMsS0FBQXdDLEVBQUFSLEdBQUFoQyxLQUFBd0MsRUFBQU4sRUFBQU0sRUFBQUwsRUFBQUssR0FDQXhDLEtBQUF5QyxFQUFBVCxHQUFBaEMsS0FBQXlDLEVBQUFQLEVBQUFPLEVBQUFOLEVBQUFNLEdBQ0F6QyxLQUFBc1osRUFBQXRYLEdBQUFoQyxLQUFBc1osRUFBQXBYLEVBQUFvWCxFQUFBblgsRUFBQW1YLEdBQ0F0WixLQUFBdVosRUFBQXZYLEdBQUFoQyxLQUFBdVosRUFBQXJYLEVBQUFxWCxFQUFBcFgsRUFBQW9YLEdBRUF2WixJQUVBLENBWUEsV0FBQTBJLENBQUFDLEVBQUFDLEdBT0EsT0FMQTVJLEtBQUF3QyxFQUFBUixHQUFBaEMsS0FBQXdDLEVBQUFtRyxFQUFBQyxHQUNBNUksS0FBQXlDLEVBQUFULEdBQUFoQyxLQUFBeUMsRUFBQWtHLEVBQUFDLEdBQ0E1SSxLQUFBc1osRUFBQXRYLEdBQUFoQyxLQUFBc1osRUFBQTNRLEVBQUFDLEdBQ0E1SSxLQUFBdVosRUFBQXZYLEdBQUFoQyxLQUFBdVosRUFBQTVRLEVBQUFDLEdBRUE1SSxJQUVBLENBWUEsV0FBQTZJLENBQUEzRyxFQUFBQyxHQUVBLE1BQUFsQixFQUFBakIsS0FBQWlCLFNBRUEsT0FBQWpCLEtBQUFzSSxhQUFBckgsR0FBQSxHQUFBbUgsZUFBQXBHLEdBQUFmLEVBQUFpQixFQUFBQyxHQUVBLENBT0EsS0FBQXNDLEdBT0EsT0FMQXpFLEtBQUF3QyxFQUFBbEIsS0FBQW1ELE1BQUF6RSxLQUFBd0MsR0FDQXhDLEtBQUF5QyxFQUFBbkIsS0FBQW1ELE1BQUF6RSxLQUFBeUMsR0FDQXpDLEtBQUFzWixFQUFBaFksS0FBQW1ELE1BQUF6RSxLQUFBc1osR0FDQXRaLEtBQUF1WixFQUFBalksS0FBQW1ELE1BQUF6RSxLQUFBdVosR0FFQXZaLElBRUEsQ0FPQSxJQUFBdUYsR0FPQSxPQUxBdkYsS0FBQXdDLEVBQUFsQixLQUFBaUUsS0FBQXZGLEtBQUF3QyxHQUNBeEMsS0FBQXlDLEVBQUFuQixLQUFBaUUsS0FBQXZGLEtBQUF5QyxHQUNBekMsS0FBQXNaLEVBQUFoWSxLQUFBaUUsS0FBQXZGLEtBQUFzWixHQUNBdFosS0FBQXVaLEVBQUFqWSxLQUFBaUUsS0FBQXZGLEtBQUF1WixHQUVBdlosSUFFQSxDQU9BLEtBQUFzRCxHQU9BLE9BTEF0RCxLQUFBd0MsRUFBQWxCLEtBQUFnQyxNQUFBdEQsS0FBQXdDLEdBQ0F4QyxLQUFBeUMsRUFBQW5CLEtBQUFnQyxNQUFBdEQsS0FBQXlDLEdBQ0F6QyxLQUFBc1osRUFBQWhZLEtBQUFnQyxNQUFBdEQsS0FBQXNaLEdBQ0F0WixLQUFBdVosRUFBQWpZLEtBQUFnQyxNQUFBdEQsS0FBQXVaLEdBRUF2WixJQUVBLENBUUEsV0FBQThJLEdBT0EsT0FMQTlJLEtBQUF3QyxFQUFBbEIsS0FBQXlILE1BQUEvSSxLQUFBd0MsR0FDQXhDLEtBQUF5QyxFQUFBbkIsS0FBQXlILE1BQUEvSSxLQUFBeUMsR0FDQXpDLEtBQUFzWixFQUFBaFksS0FBQXlILE1BQUEvSSxLQUFBc1osR0FDQXRaLEtBQUF1WixFQUFBalksS0FBQXlILE1BQUEvSSxLQUFBdVosR0FFQXZaLElBRUEsQ0FPQSxNQUFBZ0osR0FPQSxPQUxBaEosS0FBQXdDLEdBQUF4QyxLQUFBd0MsRUFDQXhDLEtBQUF5QyxHQUFBekMsS0FBQXlDLEVBQ0F6QyxLQUFBc1osR0FBQXRaLEtBQUFzWixFQUNBdFosS0FBQXVaLEdBQUF2WixLQUFBdVosRUFFQXZaLElBRUEsQ0FRQSxHQUFBaUosQ0FBQXRCLEdBRUEsT0FBQTNILEtBQUF3QyxFQUFBbUYsRUFBQW5GLEVBQUF4QyxLQUFBeUMsRUFBQWtGLEVBQUFsRixFQUFBekMsS0FBQXNaLEVBQUEzUixFQUFBMlIsRUFBQXRaLEtBQUF1WixFQUFBNVIsRUFBQTRSLENBRUEsQ0FTQSxRQUFBcFEsR0FFQSxPQUFBbkosS0FBQXdDLEVBQUF4QyxLQUFBd0MsRUFBQXhDLEtBQUF5QyxFQUFBekMsS0FBQXlDLEVBQUF6QyxLQUFBc1osRUFBQXRaLEtBQUFzWixFQUFBdFosS0FBQXVaLEVBQUF2WixLQUFBdVosQ0FFQSxDQU9BLE1BQUF0WSxHQUVBLE9BQUFLLEtBQUE4SCxLQUFBcEosS0FBQXdDLEVBQUF4QyxLQUFBd0MsRUFBQXhDLEtBQUF5QyxFQUFBekMsS0FBQXlDLEVBQUF6QyxLQUFBc1osRUFBQXRaLEtBQUFzWixFQUFBdFosS0FBQXVaLEVBQUF2WixLQUFBdVosRUFFQSxDQU9BLGVBQUFsUSxHQUVBLE9BQUEvSCxLQUFBNkMsSUFBQW5FLEtBQUF3QyxHQUFBbEIsS0FBQTZDLElBQUFuRSxLQUFBeUMsR0FBQW5CLEtBQUE2QyxJQUFBbkUsS0FBQXNaLEdBQUFoWSxLQUFBNkMsSUFBQW5FLEtBQUF1WixFQUVBLENBUUEsU0FBQWxXLEdBRUEsT0FBQXJELEtBQUFzSSxhQUFBdEksS0FBQWlCLFVBQUEsRUFFQSxDQVNBLFNBQUFnSixDQUFBaEosR0FFQSxPQUFBakIsS0FBQXFELFlBQUErRSxlQUFBbkgsRUFFQSxDQVdBLElBQUFzQixDQUFBb0YsRUFBQXVDLEdBT0EsT0FMQWxLLEtBQUF3QyxJQUFBbUYsRUFBQW5GLEVBQUF4QyxLQUFBd0MsR0FBQTBILEVBQ0FsSyxLQUFBeUMsSUFBQWtGLEVBQUFsRixFQUFBekMsS0FBQXlDLEdBQUF5SCxFQUNBbEssS0FBQXNaLElBQUEzUixFQUFBMlIsRUFBQXRaLEtBQUFzWixHQUFBcFAsRUFDQWxLLEtBQUF1WixJQUFBNVIsRUFBQTRSLEVBQUF2WixLQUFBdVosR0FBQXJQLEVBRUFsSyxJQUVBLENBWUEsV0FBQW1LLENBQUFDLEVBQUFDLEVBQUFILEdBT0EsT0FMQWxLLEtBQUF3QyxFQUFBNEgsRUFBQTVILEdBQUE2SCxFQUFBN0gsRUFBQTRILEVBQUE1SCxHQUFBMEgsRUFDQWxLLEtBQUF5QyxFQUFBMkgsRUFBQTNILEdBQUE0SCxFQUFBNUgsRUFBQTJILEVBQUEzSCxHQUFBeUgsRUFDQWxLLEtBQUFzWixFQUFBbFAsRUFBQWtQLEdBQUFqUCxFQUFBaVAsRUFBQWxQLEVBQUFrUCxHQUFBcFAsRUFDQWxLLEtBQUF1WixFQUFBblAsRUFBQW1QLEdBQUFsUCxFQUFBa1AsRUFBQW5QLEVBQUFtUCxHQUFBclAsRUFFQWxLLElBRUEsQ0FRQSxNQUFBc0ssQ0FBQTNDLEdBRUEsT0FBQUEsRUFBQW5GLElBQUF4QyxLQUFBd0MsR0FBQW1GLEVBQUFsRixJQUFBekMsS0FBQXlDLEdBQUFrRixFQUFBMlIsSUFBQXRaLEtBQUFzWixHQUFBM1IsRUFBQTRSLElBQUF2WixLQUFBdVosQ0FFQSxDQVVBLFNBQUFoUCxDQUFBMUosRUFBQTJKLEVBQUEsR0FPQSxPQUxBeEssS0FBQXdDLEVBQUEzQixFQUFBMkosR0FDQXhLLEtBQUF5QyxFQUFBNUIsRUFBQTJKLEVBQUEsR0FDQXhLLEtBQUFzWixFQUFBelksRUFBQTJKLEVBQUEsR0FDQXhLLEtBQUF1WixFQUFBMVksRUFBQTJKLEVBQUEsR0FFQXhLLElBRUEsQ0FVQSxPQUFBeUssQ0FBQTVKLEVBQUEsR0FBQTJKLEVBQUEsR0FPQSxPQUxBM0osRUFBQTJKLEdBQUF4SyxLQUFBd0MsRUFDQTNCLEVBQUEySixFQUFBLEdBQUF4SyxLQUFBeUMsRUFDQTVCLEVBQUEySixFQUFBLEdBQUF4SyxLQUFBc1osRUFDQXpZLEVBQUEySixFQUFBLEdBQUF4SyxLQUFBdVosRUFFQTFZLENBRUEsQ0FTQSxtQkFBQTZKLENBQUFDLEVBQUFuSyxHQU9BLE9BTEFSLEtBQUF3QyxFQUFBbUksRUFBQUMsS0FBQXBLLEdBQ0FSLEtBQUF5QyxFQUFBa0ksRUFBQUUsS0FBQXJLLEdBQ0FSLEtBQUFzWixFQUFBM08sRUFBQXFRLEtBQUF4YSxHQUNBUixLQUFBdVosRUFBQTVPLEVBQUFzUSxLQUFBemEsR0FFQVIsSUFFQSxDQVFBLE1BQUEyQixHQU9BLE9BTEEzQixLQUFBd0MsRUFBQWxCLEtBQUFLLFNBQ0EzQixLQUFBeUMsRUFBQW5CLEtBQUFLLFNBQ0EzQixLQUFBc1osRUFBQWhZLEtBQUFLLFNBQ0EzQixLQUFBdVosRUFBQWpZLEtBQUFLLFNBRUEzQixJQUVBLENBRUEsRUFBQWdMLE9BQUFDLGtCQUVBakwsS0FBQXdDLFFBQ0F4QyxLQUFBeUMsUUFDQXpDLEtBQUFzWixRQUNBdFosS0FBQXVaLENBRUEsRUNwaENBLE1BQUEyQixXQUFBdmIsR0FnQ0EsV0FBQWlELENBQUFxRSxFQUFBLEVBQUFDLEVBQUEsRUFBQWlVLEVBQUEsQ0FBQSxHQUVBNUQsUUFTQXZYLEtBQUFvYixnQkFBQSxFQVFBcGIsS0FBQWlILE1BQUFBLEVBUUFqSCxLQUFBa0gsT0FBQUEsRUFRQWxILEtBQUFxYixNQUFBLEVBU0FyYixLQUFBc2IsUUFBQSxJQUFBakMsR0FBQSxFQUFBLEVBQUFwUyxFQUFBQyxHQVNBbEgsS0FBQXViLGFBQUEsRUFRQXZiLEtBQUF3YixTQUFBLElBQUFuQyxHQUFBLEVBQUEsRUFBQXBTLEVBQUFDLEdBRUEsTUFBQXNOLEVBQUEsQ0FBQXZOLE1BQUFBLEVBQUFDLE9BQUFBLEVBQUFtVSxNQUFBLEdBRUFGLEVBQUE1SCxPQUFBQyxPQUFBLENBQ0F1RSxpQkFBQSxFQUNBSCxlQUFBLEtBQ0FULFVBQUF2ZixHQUNBNmpCLGFBQUEsRUFDQUMsZUFBQSxFQUNBQyxvQkFBQSxFQUNBQyxzQkFBQSxFQUNBQyxhQUFBLEtBQ0FDLFFBQUEsRUFDQUMsTUFBQSxHQUNBWixHQUVBLE1BQUFhLEVBQUEsSUFBQXBGLEdBQUFwQyxFQUFBMkcsRUFBQXJFLFFBQUFxRSxFQUFBbkUsTUFBQW1FLEVBQUFsRSxNQUFBa0UsRUFBQWpFLFVBQUFpRSxFQUFBaEUsVUFBQWdFLEVBQUEvRCxPQUFBK0QsRUFBQXRiLEtBQUFzYixFQUFBOUQsV0FBQThELEVBQUFsSSxZQUVBK0ksRUFBQS9ELE9BQUEsRUFDQStELEVBQUFqRSxnQkFBQW9ELEVBQUFwRCxnQkFDQWlFLEVBQUFwRSxlQUFBdUQsRUFBQXZELGVBUUE1WCxLQUFBNFksU0FBQSxHQUVBLE1BQUFtRCxFQUFBWixFQUFBWSxNQUNBLElBQUEsSUFBQWhiLEVBQUEsRUFBQUEsRUFBQWdiLEVBQUFoYixJQUVBZixLQUFBNFksU0FBQTdYLEdBQUFpYixFQUFBdlUsUUFDQXpILEtBQUE0WSxTQUFBN1gsR0FBQXVYLHVCQUFBLEVBQ0F0WSxLQUFBNFksU0FBQTdYLEdBQUFzWCxhQUFBclksS0FVQUEsS0FBQXliLFlBQUFOLEVBQUFNLFlBUUF6YixLQUFBMGIsY0FBQVAsRUFBQU8sY0FRQTFiLEtBQUEyYixtQkFBQVIsRUFBQVEsbUJBUUEzYixLQUFBNGIscUJBQUFULEVBQUFTLHFCQUVBNWIsS0FBQWljLGNBQUFkLEVBQUFVLGFBVUE3YixLQUFBOGIsUUFBQVgsRUFBQVcsT0FFQSxDQU9BLFdBQUFFLEdBRUEsT0FBQWhjLEtBQUE0WSxTQUFBLEVBRUEsQ0FFQSxXQUFBb0QsQ0FBQS9aLEdBRUFqQyxLQUFBNFksU0FBQSxHQUFBM1csQ0FFQSxDQUVBLGdCQUFBNFosQ0FBQUssR0FFQSxPQUFBbGMsS0FBQWljLGdCQUFBamMsS0FBQWljLGNBQUE1RCxhQUFBLE1BQ0EsT0FBQTZELElBQUFBLEVBQUE3RCxhQUFBclksTUFFQUEsS0FBQWljLGNBQUFDLENBRUEsQ0FVQSxnQkFBQUwsR0FFQSxPQUFBN2IsS0FBQWljLGFBRUEsQ0FTQSxPQUFBRSxDQUFBbFYsRUFBQUMsRUFBQW1VLEVBQUEsR0FFQSxHQUFBcmIsS0FBQWlILFFBQUFBLEdBQUFqSCxLQUFBa0gsU0FBQUEsR0FBQWxILEtBQUFxYixRQUFBQSxFQUFBLENBRUFyYixLQUFBaUgsTUFBQUEsRUFDQWpILEtBQUFrSCxPQUFBQSxFQUNBbEgsS0FBQXFiLE1BQUFBLEVBRUEsSUFBQSxJQUFBdGEsRUFBQSxFQUFBcWIsRUFBQXBjLEtBQUE0WSxTQUFBM1gsT0FBQUYsRUFBQXFiLEVBQUFyYixJQUVBZixLQUFBNFksU0FBQTdYLEdBQUF5VCxNQUFBdk4sTUFBQUEsRUFDQWpILEtBQUE0WSxTQUFBN1gsR0FBQXlULE1BQUF0TixPQUFBQSxFQUNBbEgsS0FBQTRZLFNBQUE3WCxHQUFBeVQsTUFBQTZHLE1BQUFBLEVBSUFyYixLQUFBaVosU0FFQSxDQUVBalosS0FBQXdiLFNBQUE3VSxJQUFBLEVBQUEsRUFBQU0sRUFBQUMsR0FDQWxILEtBQUFzYixRQUFBM1UsSUFBQSxFQUFBLEVBQUFNLEVBQUFDLEVBRUEsQ0FPQSxLQUFBTyxHQUVBLE9BQUEsSUFBQXpILEtBQUE0QyxhQUFBOEUsS0FBQTFILEtBRUEsQ0FVQSxJQUFBMEgsQ0FBQStQLEdBRUF6WCxLQUFBaUgsTUFBQXdRLEVBQUF4USxNQUNBakgsS0FBQWtILE9BQUF1USxFQUFBdlEsT0FDQWxILEtBQUFxYixNQUFBNUQsRUFBQTRELE1BRUFyYixLQUFBc2IsUUFBQTVULEtBQUErUCxFQUFBNkQsU0FDQXRiLEtBQUF1YixZQUFBOUQsRUFBQThELFlBRUF2YixLQUFBd2IsU0FBQTlULEtBQUErUCxFQUFBK0QsVUFFQXhiLEtBQUE0WSxTQUFBM1gsT0FBQSxFQUVBLElBQUEsSUFBQUYsRUFBQSxFQUFBcWIsRUFBQTNFLEVBQUFtQixTQUFBM1gsT0FBQUYsRUFBQXFiLEVBQUFyYixJQUFBLENBRUFmLEtBQUE0WSxTQUFBN1gsR0FBQTBXLEVBQUFtQixTQUFBN1gsR0FBQTBHLFFBQ0F6SCxLQUFBNFksU0FBQTdYLEdBQUF1WCx1QkFBQSxFQUNBdFksS0FBQTRZLFNBQUE3WCxHQUFBc1gsYUFBQXJZLEtBSUEsTUFBQXdVLEVBQUFqQixPQUFBQyxPQUFBLENBQUEsRUFBQWlFLEVBQUFtQixTQUFBN1gsR0FBQXlULE9BQ0F4VSxLQUFBNFksU0FBQTdYLEdBQUEwVyxPQUFBLElBQUFoQyxHQUFBakIsRUFFQSxDQVlBLE9BVkF4VSxLQUFBeWIsWUFBQWhFLEVBQUFnRSxZQUNBemIsS0FBQTBiLGNBQUFqRSxFQUFBaUUsY0FFQTFiLEtBQUEyYixtQkFBQWxFLEVBQUFrRSxtQkFDQTNiLEtBQUE0YixxQkFBQW5FLEVBQUFtRSxxQkFFQSxPQUFBbkUsRUFBQW9FLGVBQUE3YixLQUFBNmIsYUFBQXBFLEVBQUFvRSxhQUFBcFUsU0FFQXpILEtBQUE4YixRQUFBckUsRUFBQXFFLFFBRUE5YixJQUVBLENBUUEsT0FBQWlaLEdBRUFqWixLQUFBVSxjQUFBLENBQUFiLEtBQUEsV0FFQSxFQ3ZVQSxNQUFBd2MsV0FBQW5CLEdBU0EsV0FBQXRZLENBQUFxRSxFQUFBLEVBQUFDLEVBQUEsRUFBQWlVLEVBQUEsQ0FBQSxHQUVBNUQsTUFBQXRRLEVBQUFDLEVBQUFpVSxHQVNBbmIsS0FBQXNjLHFCQUFBLENBRUEsRUNyQkEsTUFBQUMsV0FBQTNGLEdBVUEsV0FBQWhVLENBQUEyUyxFQUFBLEtBQUF0TyxFQUFBLEVBQUFDLEVBQUEsRUFBQW1VLEVBQUEsR0FFQTlELE1BQUEsTUFTQXZYLEtBQUF3YyxvQkFBQSxFQU9BeGMsS0FBQXdVLE1BQUEsQ0FBQWUsT0FBQXRPLFFBQUFDLFNBQUFtVSxTQVVBcmIsS0FBQWtYLFVBQUEzZixHQVVBeUksS0FBQW1YLFVBQUE1ZixHQVNBeUksS0FBQXljLE1BQUFwbEIsR0FVQTJJLEtBQUErWCxpQkFBQSxFQVdBL1gsS0FBQWlZLE9BQUEsRUFVQWpZLEtBQUFrWSxnQkFBQSxFQU9BbFksS0FBQTBjLGFBQUEsSUFBQUMsR0FFQSxDQVdBLGNBQUFDLENBQUFDLEdBRUE3YyxLQUFBMGMsYUFBQTlVLElBQUFpVixFQUVBLENBS0EsaUJBQUFDLEdBRUE5YyxLQUFBMGMsYUFBQUssT0FFQSxFQ3pIQSxNQUFBQyxXQUFBWCxHQVVBLFdBQUF6WixDQUFBcUUsRUFBQSxFQUFBQyxFQUFBLEVBQUFtVSxFQUFBLEVBQUFGLEVBQUEsQ0FBQSxHQUVBNUQsTUFBQXRRLEVBQUFDLEVBQUFpVSxHQVNBbmIsS0FBQWlkLDBCQUFBLEVBRUFqZCxLQUFBcWIsTUFBQUEsRUFPQXJiLEtBQUFnYyxRQUFBLElBQUFPLEdBQUEsS0FBQXRWLEVBQUFDLEVBQUFtVSxHQUVBcmIsS0FBQWdjLFFBQUExRCx1QkFBQSxDQUVBLEVDakNBLE1BQUE0RSxXQUFBdEcsR0FVQSxXQUFBaFUsQ0FBQTJTLEVBQUEsS0FBQXRPLEVBQUEsRUFBQUMsRUFBQSxFQUFBbVUsRUFBQSxHQVVBOUQsTUFBQSxNQVNBdlgsS0FBQW1kLGlCQUFBLEVBT0FuZCxLQUFBd1UsTUFBQSxDQUFBZSxPQUFBdE8sUUFBQUMsU0FBQW1VLFNBVUFyYixLQUFBa1gsVUFBQTNmLEdBVUF5SSxLQUFBbVgsVUFBQTVmLEdBU0F5SSxLQUFBeWMsTUFBQXBsQixHQVVBMkksS0FBQStYLGlCQUFBLEVBV0EvWCxLQUFBaVksT0FBQSxFQVVBalksS0FBQWtZLGdCQUFBLENBRUEsRUNuR0EsTUFBQWtGLFdBQUFmLEdBVUEsV0FBQXpaLENBQUFxRSxFQUFBLEVBQUFDLEVBQUEsRUFBQW1VLEVBQUEsRUFBQUYsRUFBQSxDQUFBLEdBRUE1RCxNQUFBdFEsRUFBQUMsRUFBQWlVLEdBU0FuYixLQUFBcWQsdUJBQUEsRUFFQXJkLEtBQUFxYixNQUFBQSxFQU9BcmIsS0FBQWdjLFFBQUEsSUFBQWtCLEdBQUEsS0FBQWpXLEVBQUFDLEVBQUFtVSxHQUVBcmIsS0FBQWdjLFFBQUExRCx1QkFBQSxDQUVBLEVDekJBLE1BQUFnRixHQVVBLFdBQUExYSxDQUFBSixFQUFBLEVBQUFDLEVBQUEsRUFBQTZXLEVBQUEsRUFBQUMsRUFBQSxHQVNBdlosS0FBQXVkLGNBQUEsRUFFQXZkLEtBQUF3ZCxHQUFBaGIsRUFDQXhDLEtBQUF5ZCxHQUFBaGIsRUFDQXpDLEtBQUEwZCxHQUFBcEUsRUFDQXRaLEtBQUEyZCxHQUFBcEUsQ0FFQSxDQWVBLGdCQUFBcUUsQ0FBQUMsRUFBQUMsRUFBQUMsRUFBQUMsRUFBQUMsRUFBQUMsRUFBQXhiLEdBSUEsSUFBQXliLEVBQUFKLEVBQUFDLEVBQUEsR0FDQUksRUFBQUwsRUFBQUMsRUFBQSxHQUNBSyxFQUFBTixFQUFBQyxFQUFBLEdBQ0FNLEVBQUFQLEVBQUFDLEVBQUEsR0FFQSxNQUFBTyxFQUFBTixFQUFBQyxFQUFBLEdBQ0FNLEVBQUFQLEVBQUFDLEVBQUEsR0FDQU8sRUFBQVIsRUFBQUMsRUFBQSxHQUNBUSxFQUFBVCxFQUFBQyxFQUFBLEdBRUEsR0FBQSxJQUFBeGIsRUFNQSxPQUpBbWIsRUFBQUMsRUFBQSxHQUFBSyxFQUNBTixFQUFBQyxFQUFBLEdBQUFNLEVBQ0FQLEVBQUFDLEVBQUEsR0FBQU8sT0FDQVIsRUFBQUMsRUFBQSxHQUFBUSxHQUtBLEdBQUEsSUFBQTViLEVBTUEsT0FKQW1iLEVBQUFDLEVBQUEsR0FBQVMsRUFDQVYsRUFBQUMsRUFBQSxHQUFBVSxFQUNBWCxFQUFBQyxFQUFBLEdBQUFXLE9BQ0FaLEVBQUFDLEVBQUEsR0FBQVksR0FLQSxHQUFBSixJQUFBSSxHQUFBUCxJQUFBSSxHQUFBSCxJQUFBSSxHQUFBSCxJQUFBSSxFQUFBLENBRUEsSUFBQTNaLEVBQUEsRUFBQXBDLEVBQ0EsTUFBQXVELEVBQUFrWSxFQUFBSSxFQUFBSCxFQUFBSSxFQUFBSCxFQUFBSSxFQUFBSCxFQUFBSSxFQUNBQyxFQUFBMVksR0FBQSxFQUFBLEdBQUEsRUFDQTJZLEVBQUEsRUFBQTNZLEVBQUFBLEVBR0EsR0FBQTJZLEVBQUFDLE9BQUFDLFFBQUEsQ0FFQSxNQUFBNVksRUFBQTVFLEtBQUE4SCxLQUFBd1YsR0FDQUcsRUFBQXpkLEtBQUFpSSxNQUFBckQsRUFBQUQsRUFBQTBZLEdBRUE3WixFQUFBeEQsS0FBQTRFLElBQUFwQixFQUFBaWEsR0FBQTdZLEVBQ0F4RCxFQUFBcEIsS0FBQTRFLElBQUF4RCxFQUFBcWMsR0FBQTdZLENBRUEsQ0FFQSxNQUFBOFksRUFBQXRjLEVBQUFpYyxFQVFBLEdBTkFSLEVBQUFBLEVBQUFyWixFQUFBeVosRUFBQVMsRUFDQVosRUFBQUEsRUFBQXRaLEVBQUEwWixFQUFBUSxFQUNBWCxFQUFBQSxFQUFBdlosRUFBQTJaLEVBQUFPLEVBQ0FWLEVBQUFBLEVBQUF4WixFQUFBNFosRUFBQU0sRUFHQWxhLElBQUEsRUFBQXBDLEVBQUEsQ0FFQSxNQUFBb0wsRUFBQSxFQUFBeE0sS0FBQThILEtBQUErVSxFQUFBQSxFQUFBQyxFQUFBQSxFQUFBQyxFQUFBQSxFQUFBQyxFQUFBQSxHQUVBSCxHQUFBclEsRUFDQXNRLEdBQUF0USxFQUNBdVEsR0FBQXZRLEVBQ0F3USxHQUFBeFEsQ0FFQSxDQUVBLENBRUErUCxFQUFBQyxHQUFBSyxFQUNBTixFQUFBQyxFQUFBLEdBQUFNLEVBQ0FQLEVBQUFDLEVBQUEsR0FBQU8sRUFDQVIsRUFBQUMsRUFBQSxHQUFBUSxDQUVBLENBZUEsOEJBQUFXLENBQUFwQixFQUFBQyxFQUFBQyxFQUFBQyxFQUFBQyxFQUFBQyxHQUVBLE1BQUFDLEVBQUFKLEVBQUFDLEdBQ0FJLEVBQUFMLEVBQUFDLEVBQUEsR0FDQUssRUFBQU4sRUFBQUMsRUFBQSxHQUNBTSxFQUFBUCxFQUFBQyxFQUFBLEdBRUFPLEVBQUFOLEVBQUFDLEdBQ0FNLEVBQUFQLEVBQUFDLEVBQUEsR0FDQU8sRUFBQVIsRUFBQUMsRUFBQSxHQUNBUSxFQUFBVCxFQUFBQyxFQUFBLEdBT0EsT0FMQUwsRUFBQUMsR0FBQUssRUFBQU8sRUFBQUosRUFBQUMsRUFBQUgsRUFBQUssRUFBQUosRUFBQUcsRUFDQVgsRUFBQUMsRUFBQSxHQUFBTSxFQUFBTSxFQUFBSixFQUFBRSxFQUFBSCxFQUFBRSxFQUFBSixFQUFBTSxFQUNBWixFQUFBQyxFQUFBLEdBQUFPLEVBQUFLLEVBQUFKLEVBQUFHLEVBQUFOLEVBQUFLLEVBQUFKLEVBQUFHLEVBQ0FWLEVBQUFDLEVBQUEsR0FBQVEsRUFBQUksRUFBQVAsRUFBQUksRUFBQUgsRUFBQUksRUFBQUgsRUFBQUksRUFFQVosQ0FFQSxDQVFBLEtBQUFyYixHQUVBLE9BQUF4QyxLQUFBd2QsRUFFQSxDQUVBLEtBQUFoYixDQUFBUCxHQUVBakMsS0FBQXdkLEdBQUF2YixFQUNBakMsS0FBQWtmLG1CQUVBLENBUUEsS0FBQXpjLEdBRUEsT0FBQXpDLEtBQUF5ZCxFQUVBLENBRUEsS0FBQWhiLENBQUFSLEdBRUFqQyxLQUFBeWQsR0FBQXhiLEVBQ0FqQyxLQUFBa2YsbUJBRUEsQ0FRQSxLQUFBNUYsR0FFQSxPQUFBdFosS0FBQTBkLEVBRUEsQ0FFQSxLQUFBcEUsQ0FBQXJYLEdBRUFqQyxLQUFBMGQsR0FBQXpiLEVBQ0FqQyxLQUFBa2YsbUJBRUEsQ0FRQSxLQUFBM0YsR0FFQSxPQUFBdlosS0FBQTJkLEVBRUEsQ0FFQSxLQUFBcEUsQ0FBQXRYLEdBRUFqQyxLQUFBMmQsR0FBQTFiLEVBQ0FqQyxLQUFBa2YsbUJBRUEsQ0FXQSxHQUFBdlksQ0FBQW5FLEVBQUFDLEVBQUE2VyxFQUFBQyxHQVNBLE9BUEF2WixLQUFBd2QsR0FBQWhiLEVBQ0F4QyxLQUFBeWQsR0FBQWhiLEVBQ0F6QyxLQUFBMGQsR0FBQXBFLEVBQ0F0WixLQUFBMmQsR0FBQXBFLEVBRUF2WixLQUFBa2Ysb0JBRUFsZixJQUVBLENBT0EsS0FBQXlILEdBRUEsT0FBQSxJQUFBekgsS0FBQTRDLFlBQUE1QyxLQUFBd2QsR0FBQXhkLEtBQUF5ZCxHQUFBemQsS0FBQTBkLEdBQUExZCxLQUFBMmQsR0FFQSxDQVFBLElBQUFqVyxDQUFBeVgsR0FTQSxPQVBBbmYsS0FBQXdkLEdBQUEyQixFQUFBM2MsRUFDQXhDLEtBQUF5ZCxHQUFBMEIsRUFBQTFjLEVBQ0F6QyxLQUFBMGQsR0FBQXlCLEVBQUE3RixFQUNBdFosS0FBQTJkLEdBQUF3QixFQUFBNUYsRUFFQXZaLEtBQUFrZixvQkFFQWxmLElBRUEsQ0FVQSxZQUFBb2YsQ0FBQUMsRUFBQUMsR0FBQSxHQUVBLE1BQUE5YyxFQUFBNmMsRUFBQTdCLEdBQUEvYSxFQUFBNGMsRUFBQTVCLEdBQUFuRSxFQUFBK0YsRUFBQTNCLEdBQUExWCxFQUFBcVosRUFBQUUsT0FNQXRaLEVBQUEzRSxLQUFBMkUsSUFDQUMsRUFBQTVFLEtBQUE0RSxJQUVBc1osRUFBQXZaLEVBQUF6RCxFQUFBLEdBQ0EyRCxFQUFBRixFQUFBeEQsRUFBQSxHQUNBZ2QsRUFBQXhaLEVBQUFxVCxFQUFBLEdBRUFvRyxFQUFBeFosRUFBQTFELEVBQUEsR0FDQTRELEVBQUFGLEVBQUF6RCxFQUFBLEdBQ0FrZCxFQUFBelosRUFBQW9ULEVBQUEsR0FFQSxPQUFBdFQsR0FFQSxJQUFBLE1BQ0FoRyxLQUFBd2QsR0FBQWtDLEVBQUF2WixFQUFBc1osRUFBQUQsRUFBQXBaLEVBQUF1WixFQUNBM2YsS0FBQXlkLEdBQUErQixFQUFBcFosRUFBQXFaLEVBQUFDLEVBQUF2WixFQUFBd1osRUFDQTNmLEtBQUEwZCxHQUFBOEIsRUFBQXJaLEVBQUF3WixFQUFBRCxFQUFBdFosRUFBQXFaLEVBQ0F6ZixLQUFBMmQsR0FBQTZCLEVBQUFyWixFQUFBc1osRUFBQUMsRUFBQXRaLEVBQUF1WixFQUNBLE1BRUEsSUFBQSxNQUNBM2YsS0FBQXdkLEdBQUFrQyxFQUFBdlosRUFBQXNaLEVBQUFELEVBQUFwWixFQUFBdVosRUFDQTNmLEtBQUF5ZCxHQUFBK0IsRUFBQXBaLEVBQUFxWixFQUFBQyxFQUFBdlosRUFBQXdaLEVBQ0EzZixLQUFBMGQsR0FBQThCLEVBQUFyWixFQUFBd1osRUFBQUQsRUFBQXRaLEVBQUFxWixFQUNBemYsS0FBQTJkLEdBQUE2QixFQUFBclosRUFBQXNaLEVBQUFDLEVBQUF0WixFQUFBdVosRUFDQSxNQUVBLElBQUEsTUFDQTNmLEtBQUF3ZCxHQUFBa0MsRUFBQXZaLEVBQUFzWixFQUFBRCxFQUFBcFosRUFBQXVaLEVBQ0EzZixLQUFBeWQsR0FBQStCLEVBQUFwWixFQUFBcVosRUFBQUMsRUFBQXZaLEVBQUF3WixFQUNBM2YsS0FBQTBkLEdBQUE4QixFQUFBclosRUFBQXdaLEVBQUFELEVBQUF0WixFQUFBcVosRUFDQXpmLEtBQUEyZCxHQUFBNkIsRUFBQXJaLEVBQUFzWixFQUFBQyxFQUFBdFosRUFBQXVaLEVBQ0EsTUFFQSxJQUFBLE1BQ0EzZixLQUFBd2QsR0FBQWtDLEVBQUF2WixFQUFBc1osRUFBQUQsRUFBQXBaLEVBQUF1WixFQUNBM2YsS0FBQXlkLEdBQUErQixFQUFBcFosRUFBQXFaLEVBQUFDLEVBQUF2WixFQUFBd1osRUFDQTNmLEtBQUEwZCxHQUFBOEIsRUFBQXJaLEVBQUF3WixFQUFBRCxFQUFBdFosRUFBQXFaLEVBQ0F6ZixLQUFBMmQsR0FBQTZCLEVBQUFyWixFQUFBc1osRUFBQUMsRUFBQXRaLEVBQUF1WixFQUNBLE1BRUEsSUFBQSxNQUNBM2YsS0FBQXdkLEdBQUFrQyxFQUFBdlosRUFBQXNaLEVBQUFELEVBQUFwWixFQUFBdVosRUFDQTNmLEtBQUF5ZCxHQUFBK0IsRUFBQXBaLEVBQUFxWixFQUFBQyxFQUFBdlosRUFBQXdaLEVBQ0EzZixLQUFBMGQsR0FBQThCLEVBQUFyWixFQUFBd1osRUFBQUQsRUFBQXRaLEVBQUFxWixFQUNBemYsS0FBQTJkLEdBQUE2QixFQUFBclosRUFBQXNaLEVBQUFDLEVBQUF0WixFQUFBdVosRUFDQSxNQUVBLElBQUEsTUFDQTNmLEtBQUF3ZCxHQUFBa0MsRUFBQXZaLEVBQUFzWixFQUFBRCxFQUFBcFosRUFBQXVaLEVBQ0EzZixLQUFBeWQsR0FBQStCLEVBQUFwWixFQUFBcVosRUFBQUMsRUFBQXZaLEVBQUF3WixFQUNBM2YsS0FBQTBkLEdBQUE4QixFQUFBclosRUFBQXdaLEVBQUFELEVBQUF0WixFQUFBcVosRUFDQXpmLEtBQUEyZCxHQUFBNkIsRUFBQXJaLEVBQUFzWixFQUFBQyxFQUFBdFosRUFBQXVaLEVBQ0EsTUFFQSxRQUNBL1ksUUFBQUMsS0FBQSxtRUFBQWIsR0FNQSxPQUZBLElBQUFzWixHQUFBdGYsS0FBQWtmLG9CQUVBbGYsSUFFQSxDQVNBLGdCQUFBNGYsQ0FBQUMsRUFBQXZXLEdBSUEsTUFBQXdXLEVBQUF4VyxFQUFBLEVBQUF4RSxFQUFBeEQsS0FBQTRFLElBQUE0WixHQVNBLE9BUEE5ZixLQUFBd2QsR0FBQXFDLEVBQUFyZCxFQUFBc0MsRUFDQTlFLEtBQUF5ZCxHQUFBb0MsRUFBQXBkLEVBQUFxQyxFQUNBOUUsS0FBQTBkLEdBQUFtQyxFQUFBdkcsRUFBQXhVLEVBQ0E5RSxLQUFBMmQsR0FBQXJjLEtBQUEyRSxJQUFBNlosR0FFQTlmLEtBQUFrZixvQkFFQWxmLElBRUEsQ0FRQSxxQkFBQStmLENBQUF6ZCxHQU1BLE1BQUF1SixFQUFBdkosRUFBQW1HLFNBRUF1UixFQUFBbk8sRUFBQSxHQUFBb08sRUFBQXBPLEVBQUEsR0FBQXFPLEVBQUFyTyxFQUFBLEdBQ0FzTyxFQUFBdE8sRUFBQSxHQUFBdU8sRUFBQXZPLEVBQUEsR0FBQXdPLEVBQUF4TyxFQUFBLEdBQ0F5TyxFQUFBek8sRUFBQSxHQUFBME8sRUFBQTFPLEVBQUEsR0FBQTJPLEVBQUEzTyxFQUFBLElBRUFtVSxFQUFBaEcsRUFBQUksRUFBQUksRUFFQSxHQUFBd0YsRUFBQSxFQUFBLENBRUEsTUFBQWxiLEVBQUEsR0FBQXhELEtBQUE4SCxLQUFBNFcsRUFBQSxHQUVBaGdCLEtBQUEyZCxHQUFBLElBQUE3WSxFQUNBOUUsS0FBQXdkLElBQUFqRCxFQUFBRixHQUFBdlYsRUFDQTlFLEtBQUF5ZCxJQUFBdkQsRUFBQUksR0FBQXhWLEVBQ0E5RSxLQUFBMGQsSUFBQXZELEVBQUFGLEdBQUFuVixDQUVBLE1BQUEsR0FBQWtWLEVBQUFJLEdBQUFKLEVBQUFRLEVBQUEsQ0FFQSxNQUFBMVYsRUFBQSxFQUFBeEQsS0FBQThILEtBQUEsRUFBQTRRLEVBQUFJLEVBQUFJLEdBRUF4YSxLQUFBMmQsSUFBQXBELEVBQUFGLEdBQUF2VixFQUNBOUUsS0FBQXdkLEdBQUEsSUFBQTFZLEVBQ0E5RSxLQUFBeWQsSUFBQXhELEVBQUFFLEdBQUFyVixFQUNBOUUsS0FBQTBkLElBQUF4RCxFQUFBSSxHQUFBeFYsQ0FFQSxNQUFBLEdBQUFzVixFQUFBSSxFQUFBLENBRUEsTUFBQTFWLEVBQUEsRUFBQXhELEtBQUE4SCxLQUFBLEVBQUFnUixFQUFBSixFQUFBUSxHQUVBeGEsS0FBQTJkLElBQUF6RCxFQUFBSSxHQUFBeFYsRUFDQTlFLEtBQUF3ZCxJQUFBdkQsRUFBQUUsR0FBQXJWLEVBQ0E5RSxLQUFBeWQsR0FBQSxJQUFBM1ksRUFDQTlFLEtBQUEwZCxJQUFBckQsRUFBQUUsR0FBQXpWLENBRUEsS0FBQSxDQUVBLE1BQUFBLEVBQUEsRUFBQXhELEtBQUE4SCxLQUFBLEVBQUFvUixFQUFBUixFQUFBSSxHQUVBcGEsS0FBQTJkLElBQUF4RCxFQUFBRixHQUFBblYsRUFDQTlFLEtBQUF3ZCxJQUFBdEQsRUFBQUksR0FBQXhWLEVBQ0E5RSxLQUFBeWQsSUFBQXBELEVBQUFFLEdBQUF6VixFQUNBOUUsS0FBQTBkLEdBQUEsSUFBQTVZLENBRUEsQ0FJQSxPQUZBOUUsS0FBQWtmLG9CQUVBbGYsSUFFQSxDQVVBLGtCQUFBaWdCLENBQUFDLEVBQUFDLEdBSUEsSUFBQXZSLEVBQUFzUixFQUFBalgsSUFBQWtYLEdBQUEsRUFtQ0EsT0FqQ0F2UixFQUFBaVEsT0FBQUMsU0FJQWxRLEVBQUEsRUFFQXROLEtBQUE2QyxJQUFBK2IsRUFBQTFkLEdBQUFsQixLQUFBNkMsSUFBQStiLEVBQUE1RyxJQUVBdFosS0FBQXdkLElBQUEwQyxFQUFBemQsRUFDQXpDLEtBQUF5ZCxHQUFBeUMsRUFBQTFkLEVBQ0F4QyxLQUFBMGQsR0FBQSxFQUNBMWQsS0FBQTJkLEdBQUEvTyxJQUlBNU8sS0FBQXdkLEdBQUEsRUFDQXhkLEtBQUF5ZCxJQUFBeUMsRUFBQTVHLEVBQ0F0WixLQUFBMGQsR0FBQXdDLEVBQUF6ZCxFQUNBekMsS0FBQTJkLEdBQUEvTyxLQVFBNU8sS0FBQXdkLEdBQUEwQyxFQUFBemQsRUFBQTBkLEVBQUE3RyxFQUFBNEcsRUFBQTVHLEVBQUE2RyxFQUFBMWQsRUFDQXpDLEtBQUF5ZCxHQUFBeUMsRUFBQTVHLEVBQUE2RyxFQUFBM2QsRUFBQTBkLEVBQUExZCxFQUFBMmQsRUFBQTdHLEVBQ0F0WixLQUFBMGQsR0FBQXdDLEVBQUExZCxFQUFBMmQsRUFBQTFkLEVBQUF5ZCxFQUFBemQsRUFBQTBkLEVBQUEzZCxFQUNBeEMsS0FBQTJkLEdBQUEvTyxHQUlBNU8sS0FBQXFELFdBRUEsQ0FRQSxPQUFBbUcsQ0FBQTVELEdBRUEsT0FBQSxFQUFBdEUsS0FBQXFJLEtBQUFySSxLQUFBNkMsSUFBQW5DLEdBQUFoQyxLQUFBaUosSUFBQXJELElBQUEsRUFBQSxJQUVBLENBVUEsYUFBQXdhLENBQUF4YSxFQUFBeWEsR0FFQSxNQUFBL1csRUFBQXRKLEtBQUF3SixRQUFBNUQsR0FFQSxHQUFBLElBQUEwRCxFQUFBLE9BQUF0SixLQUVBLE1BQUEwQyxFQUFBcEIsS0FBQVksSUFBQSxFQUFBbWUsRUFBQS9XLEdBSUEsT0FGQXRKLEtBQUFzZ0IsTUFBQTFhLEVBQUFsRCxHQUVBMUMsSUFFQSxDQVFBLFFBQUE4TCxHQUVBLE9BQUE5TCxLQUFBMkcsSUFBQSxFQUFBLEVBQUEsRUFBQSxFQUVBLENBUUEsTUFBQXNILEdBRUEsT0FBQWpPLEtBQUF1Z0IsV0FFQSxDQVNBLFNBQUFBLEdBUUEsT0FOQXZnQixLQUFBd2QsS0FBQSxFQUNBeGQsS0FBQXlkLEtBQUEsRUFDQXpkLEtBQUEwZCxLQUFBLEVBRUExZCxLQUFBa2Ysb0JBRUFsZixJQUVBLENBUUEsR0FBQWlKLENBQUF0QixHQUVBLE9BQUEzSCxLQUFBd2QsR0FBQTdWLEVBQUE2VixHQUFBeGQsS0FBQXlkLEdBQUE5VixFQUFBOFYsR0FBQXpkLEtBQUEwZCxHQUFBL1YsRUFBQStWLEdBQUExZCxLQUFBMmQsR0FBQWhXLEVBQUFnVyxFQUVBLENBVUEsUUFBQXhVLEdBRUEsT0FBQW5KLEtBQUF3ZCxHQUFBeGQsS0FBQXdkLEdBQUF4ZCxLQUFBeWQsR0FBQXpkLEtBQUF5ZCxHQUFBemQsS0FBQTBkLEdBQUExZCxLQUFBMGQsR0FBQTFkLEtBQUEyZCxHQUFBM2QsS0FBQTJkLEVBRUEsQ0FRQSxNQUFBMWMsR0FFQSxPQUFBSyxLQUFBOEgsS0FBQXBKLEtBQUF3ZCxHQUFBeGQsS0FBQXdkLEdBQUF4ZCxLQUFBeWQsR0FBQXpkLEtBQUF5ZCxHQUFBemQsS0FBQTBkLEdBQUExZCxLQUFBMGQsR0FBQTFkLEtBQUEyZCxHQUFBM2QsS0FBQTJkLEdBRUEsQ0FRQSxTQUFBdGEsR0FFQSxJQUFBckMsRUFBQWhCLEtBQUFpQixTQXNCQSxPQXBCQSxJQUFBRCxHQUVBaEIsS0FBQXdkLEdBQUEsRUFDQXhkLEtBQUF5ZCxHQUFBLEVBQ0F6ZCxLQUFBMGQsR0FBQSxFQUNBMWQsS0FBQTJkLEdBQUEsSUFJQTNjLEVBQUEsRUFBQUEsRUFFQWhCLEtBQUF3ZCxHQUFBeGQsS0FBQXdkLEdBQUF4YyxFQUNBaEIsS0FBQXlkLEdBQUF6ZCxLQUFBeWQsR0FBQXpjLEVBQ0FoQixLQUFBMGQsR0FBQTFkLEtBQUEwZCxHQUFBMWMsRUFDQWhCLEtBQUEyZCxHQUFBM2QsS0FBQTJkLEdBQUEzYyxHQUlBaEIsS0FBQWtmLG9CQUVBbGYsSUFFQSxDQVFBLFFBQUFtSSxDQUFBdkMsR0FFQSxPQUFBNUYsS0FBQXdnQixvQkFBQXhnQixLQUFBNEYsRUFFQSxDQVFBLFdBQUEyRyxDQUFBM0csR0FFQSxPQUFBNUYsS0FBQXdnQixvQkFBQTVhLEVBQUE1RixLQUVBLENBU0EsbUJBQUF3Z0IsQ0FBQTNhLEVBQUFDLEdBSUEsTUFBQTJhLEVBQUE1YSxFQUFBMlgsR0FBQWtELEVBQUE3YSxFQUFBNFgsR0FBQWtELEVBQUE5YSxFQUFBNlgsR0FBQWtELEVBQUEvYSxFQUFBOFgsR0FDQWtELEVBQUEvYSxFQUFBMFgsR0FBQXNELEVBQUFoYixFQUFBMlgsR0FBQXNELEVBQUFqYixFQUFBNFgsR0FBQXNELEVBQUFsYixFQUFBNlgsR0FTQSxPQVBBM2QsS0FBQXdkLEdBQUFpRCxFQUFBTyxFQUFBSixFQUFBQyxFQUFBSCxFQUFBSyxFQUFBSixFQUFBRyxFQUNBOWdCLEtBQUF5ZCxHQUFBaUQsRUFBQU0sRUFBQUosRUFBQUUsRUFBQUgsRUFBQUUsRUFBQUosRUFBQU0sRUFDQS9nQixLQUFBMGQsR0FBQWlELEVBQUFLLEVBQUFKLEVBQUFHLEVBQUFOLEVBQUFLLEVBQUFKLEVBQUFHLEVBQ0E3Z0IsS0FBQTJkLEdBQUFpRCxFQUFBSSxFQUFBUCxFQUFBSSxFQUFBSCxFQUFBSSxFQUFBSCxFQUFBSSxFQUVBL2dCLEtBQUFrZixvQkFFQWxmLElBRUEsQ0FTQSxLQUFBc2dCLENBQUFXLEVBQUF2ZSxHQUVBLEdBQUEsSUFBQUEsRUFBQSxPQUFBMUMsS0FDQSxHQUFBLElBQUEwQyxFQUFBLE9BQUExQyxLQUFBMEgsS0FBQXVaLEdBRUEsTUFBQXplLEVBQUF4QyxLQUFBd2QsR0FBQS9hLEVBQUF6QyxLQUFBeWQsR0FBQW5FLEVBQUF0WixLQUFBMGQsR0FBQW5FLEVBQUF2WixLQUFBMmQsR0FJQSxJQUFBdUQsRUFBQTNILEVBQUEwSCxFQUFBdEQsR0FBQW5iLEVBQUF5ZSxFQUFBekQsR0FBQS9hLEVBQUF3ZSxFQUFBeEQsR0FBQW5FLEVBQUEySCxFQUFBdkQsR0FpQkEsR0FmQXdELEVBQUEsR0FFQWxoQixLQUFBMmQsSUFBQXNELEVBQUF0RCxHQUNBM2QsS0FBQXdkLElBQUF5RCxFQUFBekQsR0FDQXhkLEtBQUF5ZCxJQUFBd0QsRUFBQXhELEdBQ0F6ZCxLQUFBMGQsSUFBQXVELEVBQUF2RCxHQUVBd0QsR0FBQUEsR0FJQWxoQixLQUFBMEgsS0FBQXVaLEdBSUFDLEdBQUEsRUFPQSxPQUxBbGhCLEtBQUEyZCxHQUFBcEUsRUFDQXZaLEtBQUF3ZCxHQUFBaGIsRUFDQXhDLEtBQUF5ZCxHQUFBaGIsRUFDQXpDLEtBQUEwZCxHQUFBcEUsRUFFQXRaLEtBSUEsTUFBQW1oQixFQUFBLEVBQUFELEVBQUFBLEVBRUEsR0FBQUMsR0FBQXRDLE9BQUFDLFFBQUEsQ0FFQSxNQUFBaGEsRUFBQSxFQUFBcEMsRUFRQSxPQVBBMUMsS0FBQTJkLEdBQUE3WSxFQUFBeVUsRUFBQTdXLEVBQUExQyxLQUFBMmQsR0FDQTNkLEtBQUF3ZCxHQUFBMVksRUFBQXRDLEVBQUFFLEVBQUExQyxLQUFBd2QsR0FDQXhkLEtBQUF5ZCxHQUFBM1ksRUFBQXJDLEVBQUFDLEVBQUExQyxLQUFBeWQsR0FDQXpkLEtBQUEwZCxHQUFBNVksRUFBQXdVLEVBQUE1VyxFQUFBMUMsS0FBQTBkLEdBRUExZCxLQUFBcUQsWUFFQXJELElBRUEsQ0FFQSxNQUFBb2hCLEVBQUE5ZixLQUFBOEgsS0FBQStYLEdBQ0FFLEVBQUEvZixLQUFBaUksTUFBQTZYLEVBQUFGLEdBQ0FJLEVBQUFoZ0IsS0FBQTRFLEtBQUEsRUFBQXhELEdBQUEyZSxHQUFBRCxFQUNBRyxFQUFBamdCLEtBQUE0RSxJQUFBeEQsRUFBQTJlLEdBQUFELEVBU0EsT0FQQXBoQixLQUFBMmQsR0FBQXBFLEVBQUErSCxFQUFBdGhCLEtBQUEyZCxHQUFBNEQsRUFDQXZoQixLQUFBd2QsR0FBQWhiLEVBQUE4ZSxFQUFBdGhCLEtBQUF3ZCxHQUFBK0QsRUFDQXZoQixLQUFBeWQsR0FBQWhiLEVBQUE2ZSxFQUFBdGhCLEtBQUF5ZCxHQUFBOEQsRUFDQXZoQixLQUFBMGQsR0FBQXBFLEVBQUFnSSxFQUFBdGhCLEtBQUEwZCxHQUFBNkQsRUFFQXZoQixLQUFBa2Ysb0JBRUFsZixJQUVBLENBV0EsZ0JBQUF3aEIsQ0FBQUMsRUFBQVIsRUFBQXZlLEdBRUEsT0FBQTFDLEtBQUEwSCxLQUFBK1osR0FBQW5CLE1BQUFXLEVBQUF2ZSxFQUVBLENBT0EsTUFBQWYsR0FNQSxNQUFBK2YsRUFBQSxFQUFBcGdCLEtBQUFDLEdBQUFELEtBQUFLLFNBQ0FnZ0IsRUFBQSxFQUFBcmdCLEtBQUFDLEdBQUFELEtBQUFLLFNBRUF3YyxFQUFBN2MsS0FBQUssU0FDQWlnQixFQUFBdGdCLEtBQUE4SCxLQUFBLEVBQUErVSxHQUNBMEQsRUFBQXZnQixLQUFBOEgsS0FBQStVLEdBRUEsT0FBQW5lLEtBQUEyRyxJQUNBaWIsRUFBQXRnQixLQUFBNEUsSUFBQXdiLEdBQ0FFLEVBQUF0Z0IsS0FBQTJFLElBQUF5YixHQUNBRyxFQUFBdmdCLEtBQUE0RSxJQUFBeWIsR0FDQUUsRUFBQXZnQixLQUFBMkUsSUFBQTBiLEdBR0EsQ0FRQSxNQUFBclgsQ0FBQTZVLEdBRUEsT0FBQUEsRUFBQTNCLEtBQUF4ZCxLQUFBd2QsSUFBQTJCLEVBQUExQixLQUFBemQsS0FBQXlkLElBQUEwQixFQUFBekIsS0FBQTFkLEtBQUEwZCxJQUFBeUIsRUFBQXhCLEtBQUEzZCxLQUFBMmQsRUFFQSxDQVNBLFNBQUFwVCxDQUFBMUosRUFBQTJKLEVBQUEsR0FTQSxPQVBBeEssS0FBQXdkLEdBQUEzYyxFQUFBMkosR0FDQXhLLEtBQUF5ZCxHQUFBNWMsRUFBQTJKLEVBQUEsR0FDQXhLLEtBQUEwZCxHQUFBN2MsRUFBQTJKLEVBQUEsR0FDQXhLLEtBQUEyZCxHQUFBOWMsRUFBQTJKLEVBQUEsR0FFQXhLLEtBQUFrZixvQkFFQWxmLElBRUEsQ0FVQSxPQUFBeUssQ0FBQTVKLEVBQUEsR0FBQTJKLEVBQUEsR0FPQSxPQUxBM0osRUFBQTJKLEdBQUF4SyxLQUFBd2QsR0FDQTNjLEVBQUEySixFQUFBLEdBQUF4SyxLQUFBeWQsR0FDQTVjLEVBQUEySixFQUFBLEdBQUF4SyxLQUFBMGQsR0FDQTdjLEVBQUEySixFQUFBLEdBQUF4SyxLQUFBMmQsR0FFQTljLENBRUEsQ0FTQSxtQkFBQTZKLENBQUFDLEVBQUFuSyxHQVNBLE9BUEFSLEtBQUF3ZCxHQUFBN1MsRUFBQUMsS0FBQXBLLEdBQ0FSLEtBQUF5ZCxHQUFBOVMsRUFBQUUsS0FBQXJLLEdBQ0FSLEtBQUEwZCxHQUFBL1MsRUFBQXFRLEtBQUF4YSxHQUNBUixLQUFBMmQsR0FBQWhULEVBQUFzUSxLQUFBemEsR0FFQVIsS0FBQWtmLG9CQUVBbGYsSUFFQSxDQVFBLE1BQUFnVyxHQUVBLE9BQUFoVyxLQUFBeUssU0FFQSxDQUVBLFNBQUFxWCxDQUFBQyxHQUlBLE9BRkEvaEIsS0FBQWtmLGtCQUFBNkMsRUFFQS9oQixJQUVBLENBRUEsaUJBQUFrZixHQUFBLENBRUEsRUFBQWxVLE9BQUFDLGtCQUVBakwsS0FBQXdkLFNBQ0F4ZCxLQUFBeWQsU0FDQXpkLEtBQUEwZCxTQUNBMWQsS0FBQTJkLEVBRUEsRUM3NEJBLE1BQUFxRSxHQVNBLFdBQUFwZixDQUFBSixFQUFBLEVBQUFDLEVBQUEsRUFBQTZXLEVBQUEsR0FTQTBJLEdBQUFqYixVQUFBa2IsV0FBQSxFQU9BamlCLEtBQUF3QyxFQUFBQSxFQU9BeEMsS0FBQXlDLEVBQUFBLEVBT0F6QyxLQUFBc1osRUFBQUEsQ0FFQSxDQVVBLEdBQUEzUyxDQUFBbkUsRUFBQUMsRUFBQTZXLEdBUUEsWUFOQXZaLElBQUF1WixJQUFBQSxFQUFBdFosS0FBQXNaLEdBRUF0WixLQUFBd0MsRUFBQUEsRUFDQXhDLEtBQUF5QyxFQUFBQSxFQUNBekMsS0FBQXNaLEVBQUFBLEVBRUF0WixJQUVBLENBUUEsU0FBQW1ILENBQUFDLEdBTUEsT0FKQXBILEtBQUF3QyxFQUFBNEUsRUFDQXBILEtBQUF5QyxFQUFBMkUsRUFDQXBILEtBQUFzWixFQUFBbFMsRUFFQXBILElBRUEsQ0FRQSxJQUFBcUgsQ0FBQTdFLEdBSUEsT0FGQXhDLEtBQUF3QyxFQUFBQSxFQUVBeEMsSUFFQSxDQVFBLElBQUFzSCxDQUFBN0UsR0FJQSxPQUZBekMsS0FBQXlDLEVBQUFBLEVBRUF6QyxJQUVBLENBUUEsSUFBQXlaLENBQUFILEdBSUEsT0FGQXRaLEtBQUFzWixFQUFBQSxFQUVBdFosSUFFQSxDQVNBLFlBQUF1SCxDQUFBL0csRUFBQXlCLEdBRUEsT0FBQXpCLEdBRUEsS0FBQSxFQUFBUixLQUFBd0MsRUFBQVAsRUFBQSxNQUNBLEtBQUEsRUFBQWpDLEtBQUF5QyxFQUFBUixFQUFBLE1BQ0EsS0FBQSxFQUFBakMsS0FBQXNaLEVBQUFyWCxFQUFBLE1BQ0EsUUFBQSxNQUFBLElBQUFtQixNQUFBLDBCQUFBNUMsR0FJQSxPQUFBUixJQUVBLENBUUEsWUFBQXdILENBQUFoSCxHQUVBLE9BQUFBLEdBRUEsS0FBQSxFQUFBLE9BQUFSLEtBQUF3QyxFQUNBLEtBQUEsRUFBQSxPQUFBeEMsS0FBQXlDLEVBQ0EsS0FBQSxFQUFBLE9BQUF6QyxLQUFBc1osRUFDQSxRQUFBLE1BQUEsSUFBQWxXLE1BQUEsMEJBQUE1QyxHQUlBLENBT0EsS0FBQWlILEdBRUEsT0FBQSxJQUFBekgsS0FBQTRDLFlBQUE1QyxLQUFBd0MsRUFBQXhDLEtBQUF5QyxFQUFBekMsS0FBQXNaLEVBRUEsQ0FRQSxJQUFBNVIsQ0FBQUMsR0FNQSxPQUpBM0gsS0FBQXdDLEVBQUFtRixFQUFBbkYsRUFDQXhDLEtBQUF5QyxFQUFBa0YsRUFBQWxGLEVBQ0F6QyxLQUFBc1osRUFBQTNSLEVBQUEyUixFQUVBdFosSUFFQSxDQVFBLEdBQUE0SCxDQUFBRCxHQU1BLE9BSkEzSCxLQUFBd0MsR0FBQW1GLEVBQUFuRixFQUNBeEMsS0FBQXlDLEdBQUFrRixFQUFBbEYsRUFDQXpDLEtBQUFzWixHQUFBM1IsRUFBQTJSLEVBRUF0WixJQUVBLENBUUEsU0FBQTZILENBQUEvQyxHQU1BLE9BSkE5RSxLQUFBd0MsR0FBQXNDLEVBQ0E5RSxLQUFBeUMsR0FBQXFDLEVBQ0E5RSxLQUFBc1osR0FBQXhVLEVBRUE5RSxJQUVBLENBU0EsVUFBQThILENBQUFqQyxFQUFBQyxHQU1BLE9BSkE5RixLQUFBd0MsRUFBQXFELEVBQUFyRCxFQUFBc0QsRUFBQXRELEVBQ0F4QyxLQUFBeUMsRUFBQW9ELEVBQUFwRCxFQUFBcUQsRUFBQXJELEVBQ0F6QyxLQUFBc1osRUFBQXpULEVBQUF5VCxFQUFBeFQsRUFBQXdULEVBRUF0WixJQUVBLENBU0EsZUFBQStILENBQUFKLEVBQUE3QyxHQU1BLE9BSkE5RSxLQUFBd0MsR0FBQW1GLEVBQUFuRixFQUFBc0MsRUFDQTlFLEtBQUF5QyxHQUFBa0YsRUFBQWxGLEVBQUFxQyxFQUNBOUUsS0FBQXNaLEdBQUEzUixFQUFBMlIsRUFBQXhVLEVBRUE5RSxJQUVBLENBUUEsR0FBQWdJLENBQUFMLEdBTUEsT0FKQTNILEtBQUF3QyxHQUFBbUYsRUFBQW5GLEVBQ0F4QyxLQUFBeUMsR0FBQWtGLEVBQUFsRixFQUNBekMsS0FBQXNaLEdBQUEzUixFQUFBMlIsRUFFQXRaLElBRUEsQ0FRQSxTQUFBaUksQ0FBQW5ELEdBTUEsT0FKQTlFLEtBQUF3QyxHQUFBc0MsRUFDQTlFLEtBQUF5QyxHQUFBcUMsRUFDQTlFLEtBQUFzWixHQUFBeFUsRUFFQTlFLElBRUEsQ0FTQSxVQUFBa0ksQ0FBQXJDLEVBQUFDLEdBTUEsT0FKQTlGLEtBQUF3QyxFQUFBcUQsRUFBQXJELEVBQUFzRCxFQUFBdEQsRUFDQXhDLEtBQUF5QyxFQUFBb0QsRUFBQXBELEVBQUFxRCxFQUFBckQsRUFDQXpDLEtBQUFzWixFQUFBelQsRUFBQXlULEVBQUF4VCxFQUFBd1QsRUFFQXRaLElBRUEsQ0FRQSxRQUFBbUksQ0FBQVIsR0FNQSxPQUpBM0gsS0FBQXdDLEdBQUFtRixFQUFBbkYsRUFDQXhDLEtBQUF5QyxHQUFBa0YsRUFBQWxGLEVBQ0F6QyxLQUFBc1osR0FBQTNSLEVBQUEyUixFQUVBdFosSUFFQSxDQVFBLGNBQUFvSSxDQUFBaEIsR0FNQSxPQUpBcEgsS0FBQXdDLEdBQUE0RSxFQUNBcEgsS0FBQXlDLEdBQUEyRSxFQUNBcEgsS0FBQXNaLEdBQUFsUyxFQUVBcEgsSUFFQSxDQVNBLGVBQUFraUIsQ0FBQXJjLEVBQUFDLEdBTUEsT0FKQTlGLEtBQUF3QyxFQUFBcUQsRUFBQXJELEVBQUFzRCxFQUFBdEQsRUFDQXhDLEtBQUF5QyxFQUFBb0QsRUFBQXBELEVBQUFxRCxFQUFBckQsRUFDQXpDLEtBQUFzWixFQUFBelQsRUFBQXlULEVBQUF4VCxFQUFBd1QsRUFFQXRaLElBRUEsQ0FRQSxVQUFBbWlCLENBQUE5QyxHQUVBLE9BQUFyZixLQUFBb2lCLGdCQUFBQyxHQUFBakQsYUFBQUMsR0FFQSxDQVNBLGNBQUFpRCxDQUFBekMsRUFBQXZXLEdBRUEsT0FBQXRKLEtBQUFvaUIsZ0JBQUFDLEdBQUF6QyxpQkFBQUMsRUFBQXZXLEdBRUEsQ0FRQSxZQUFBZixDQUFBakcsR0FFQSxNQUFBRSxFQUFBeEMsS0FBQXdDLEVBQUFDLEVBQUF6QyxLQUFBeUMsRUFBQTZXLEVBQUF0WixLQUFBc1osRUFDQTlRLEVBQUFsRyxFQUFBbUcsU0FNQSxPQUpBekksS0FBQXdDLEVBQUFnRyxFQUFBLEdBQUFoRyxFQUFBZ0csRUFBQSxHQUFBL0YsRUFBQStGLEVBQUEsR0FBQThRLEVBQ0F0WixLQUFBeUMsRUFBQStGLEVBQUEsR0FBQWhHLEVBQUFnRyxFQUFBLEdBQUEvRixFQUFBK0YsRUFBQSxHQUFBOFEsRUFDQXRaLEtBQUFzWixFQUFBOVEsRUFBQSxHQUFBaEcsRUFBQWdHLEVBQUEsR0FBQS9GLEVBQUErRixFQUFBLEdBQUE4USxFQUVBdFosSUFFQSxDQVNBLGlCQUFBdWlCLENBQUFqZ0IsR0FFQSxPQUFBdEMsS0FBQXVJLGFBQUFqRyxHQUFBZSxXQUVBLENBU0EsWUFBQXNXLENBQUFyWCxHQUVBLE1BQUFFLEVBQUF4QyxLQUFBd0MsRUFBQUMsRUFBQXpDLEtBQUF5QyxFQUFBNlcsRUFBQXRaLEtBQUFzWixFQUNBOVEsRUFBQWxHLEVBQUFtRyxTQUVBOFEsRUFBQSxHQUFBL1EsRUFBQSxHQUFBaEcsRUFBQWdHLEVBQUEsR0FBQS9GLEVBQUErRixFQUFBLElBQUE4USxFQUFBOVEsRUFBQSxLQU1BLE9BSkF4SSxLQUFBd0MsR0FBQWdHLEVBQUEsR0FBQWhHLEVBQUFnRyxFQUFBLEdBQUEvRixFQUFBK0YsRUFBQSxHQUFBOFEsRUFBQTlRLEVBQUEsS0FBQStRLEVBQ0F2WixLQUFBeUMsR0FBQStGLEVBQUEsR0FBQWhHLEVBQUFnRyxFQUFBLEdBQUEvRixFQUFBK0YsRUFBQSxHQUFBOFEsRUFBQTlRLEVBQUEsS0FBQStRLEVBQ0F2WixLQUFBc1osR0FBQTlRLEVBQUEsR0FBQWhHLEVBQUFnRyxFQUFBLEdBQUEvRixFQUFBK0YsRUFBQSxJQUFBOFEsRUFBQTlRLEVBQUEsS0FBQStRLEVBRUF2WixJQUVBLENBUUEsZUFBQW9pQixDQUFBeGMsR0FJQSxNQUFBNGMsRUFBQXhpQixLQUFBd0MsRUFBQWlnQixFQUFBemlCLEtBQUF5QyxFQUFBaWdCLEVBQUExaUIsS0FBQXNaLEVBQ0FxSixFQUFBL2MsRUFBQXBELEVBQUFvZ0IsRUFBQWhkLEVBQUFuRCxFQUFBb2dCLEVBQUFqZCxFQUFBMFQsRUFBQXdKLEVBQUFsZCxFQUFBMlQsRUFHQXpLLEVBQUEsR0FBQThULEVBQUFGLEVBQUFHLEVBQUFKLEdBQ0ExVCxFQUFBLEdBQUE4VCxFQUFBTCxFQUFBRyxFQUFBRCxHQUNBSyxFQUFBLEdBQUFKLEVBQUFGLEVBQUFHLEVBQUFKLEdBT0EsT0FKQXhpQixLQUFBd0MsRUFBQWdnQixFQUFBTSxFQUFBaFUsRUFBQThULEVBQUFHLEVBQUFGLEVBQUE5VCxFQUNBL08sS0FBQXlDLEVBQUFnZ0IsRUFBQUssRUFBQS9ULEVBQUE4VCxFQUFBL1QsRUFBQTZULEVBQUFJLEVBQ0EvaUIsS0FBQXNaLEVBQUFvSixFQUFBSSxFQUFBQyxFQUFBSixFQUFBNVQsRUFBQTZULEVBQUE5VCxFQUVBOU8sSUFFQSxDQVNBLE9BQUFnakIsQ0FBQUMsR0FFQSxPQUFBampCLEtBQUEyWixhQUFBc0osRUFBQUMsb0JBQUF2SixhQUFBc0osRUFBQXRSLGlCQUVBLENBU0EsU0FBQXdSLENBQUFGLEdBRUEsT0FBQWpqQixLQUFBMlosYUFBQXNKLEVBQUFHLHlCQUFBekosYUFBQXNKLEVBQUFJLFlBRUEsQ0FTQSxrQkFBQUMsQ0FBQWhoQixHQUtBLE1BQUFFLEVBQUF4QyxLQUFBd0MsRUFBQUMsRUFBQXpDLEtBQUF5QyxFQUFBNlcsRUFBQXRaLEtBQUFzWixFQUNBOVEsRUFBQWxHLEVBQUFtRyxTQU1BLE9BSkF6SSxLQUFBd0MsRUFBQWdHLEVBQUEsR0FBQWhHLEVBQUFnRyxFQUFBLEdBQUEvRixFQUFBK0YsRUFBQSxHQUFBOFEsRUFDQXRaLEtBQUF5QyxFQUFBK0YsRUFBQSxHQUFBaEcsRUFBQWdHLEVBQUEsR0FBQS9GLEVBQUErRixFQUFBLEdBQUE4USxFQUNBdFosS0FBQXNaLEVBQUE5USxFQUFBLEdBQUFoRyxFQUFBZ0csRUFBQSxHQUFBL0YsRUFBQStGLEVBQUEsSUFBQThRLEVBRUF0WixLQUFBcUQsV0FFQSxDQVFBLE1BQUFnRixDQUFBVixHQU1BLE9BSkEzSCxLQUFBd0MsR0FBQW1GLEVBQUFuRixFQUNBeEMsS0FBQXlDLEdBQUFrRixFQUFBbEYsRUFDQXpDLEtBQUFzWixHQUFBM1IsRUFBQTJSLEVBRUF0WixJQUVBLENBUUEsWUFBQXNJLENBQUFsQixHQUVBLE9BQUFwSCxLQUFBb0ksZUFBQSxFQUFBaEIsRUFFQSxDQVNBLEdBQUFsRixDQUFBeUYsR0FNQSxPQUpBM0gsS0FBQXdDLEVBQUFsQixLQUFBWSxJQUFBbEMsS0FBQXdDLEVBQUFtRixFQUFBbkYsR0FDQXhDLEtBQUF5QyxFQUFBbkIsS0FBQVksSUFBQWxDLEtBQUF5QyxFQUFBa0YsRUFBQWxGLEdBQ0F6QyxLQUFBc1osRUFBQWhZLEtBQUFZLElBQUFsQyxLQUFBc1osRUFBQTNSLEVBQUEyUixHQUVBdFosSUFFQSxDQVNBLEdBQUFtQyxDQUFBd0YsR0FNQSxPQUpBM0gsS0FBQXdDLEVBQUFsQixLQUFBYSxJQUFBbkMsS0FBQXdDLEVBQUFtRixFQUFBbkYsR0FDQXhDLEtBQUF5QyxFQUFBbkIsS0FBQWEsSUFBQW5DLEtBQUF5QyxFQUFBa0YsRUFBQWxGLEdBQ0F6QyxLQUFBc1osRUFBQWhZLEtBQUFhLElBQUFuQyxLQUFBc1osRUFBQTNSLEVBQUEyUixHQUVBdFosSUFFQSxDQVlBLEtBQUFnQyxDQUFBRSxFQUFBQyxHQVFBLE9BSkFuQyxLQUFBd0MsRUFBQVIsR0FBQWhDLEtBQUF3QyxFQUFBTixFQUFBTSxFQUFBTCxFQUFBSyxHQUNBeEMsS0FBQXlDLEVBQUFULEdBQUFoQyxLQUFBeUMsRUFBQVAsRUFBQU8sRUFBQU4sRUFBQU0sR0FDQXpDLEtBQUFzWixFQUFBdFgsR0FBQWhDLEtBQUFzWixFQUFBcFgsRUFBQW9YLEVBQUFuWCxFQUFBbVgsR0FFQXRaLElBRUEsQ0FZQSxXQUFBMEksQ0FBQUMsRUFBQUMsR0FNQSxPQUpBNUksS0FBQXdDLEVBQUFSLEdBQUFoQyxLQUFBd0MsRUFBQW1HLEVBQUFDLEdBQ0E1SSxLQUFBeUMsRUFBQVQsR0FBQWhDLEtBQUF5QyxFQUFBa0csRUFBQUMsR0FDQTVJLEtBQUFzWixFQUFBdFgsR0FBQWhDLEtBQUFzWixFQUFBM1EsRUFBQUMsR0FFQTVJLElBRUEsQ0FZQSxXQUFBNkksQ0FBQTNHLEVBQUFDLEdBRUEsTUFBQWxCLEVBQUFqQixLQUFBaUIsU0FFQSxPQUFBakIsS0FBQXNJLGFBQUFySCxHQUFBLEdBQUFtSCxlQUFBcEcsR0FBQWYsRUFBQWlCLEVBQUFDLEdBRUEsQ0FPQSxLQUFBc0MsR0FNQSxPQUpBekUsS0FBQXdDLEVBQUFsQixLQUFBbUQsTUFBQXpFLEtBQUF3QyxHQUNBeEMsS0FBQXlDLEVBQUFuQixLQUFBbUQsTUFBQXpFLEtBQUF5QyxHQUNBekMsS0FBQXNaLEVBQUFoWSxLQUFBbUQsTUFBQXpFLEtBQUFzWixHQUVBdFosSUFFQSxDQU9BLElBQUF1RixHQU1BLE9BSkF2RixLQUFBd0MsRUFBQWxCLEtBQUFpRSxLQUFBdkYsS0FBQXdDLEdBQ0F4QyxLQUFBeUMsRUFBQW5CLEtBQUFpRSxLQUFBdkYsS0FBQXlDLEdBQ0F6QyxLQUFBc1osRUFBQWhZLEtBQUFpRSxLQUFBdkYsS0FBQXNaLEdBRUF0WixJQUVBLENBT0EsS0FBQXNELEdBTUEsT0FKQXRELEtBQUF3QyxFQUFBbEIsS0FBQWdDLE1BQUF0RCxLQUFBd0MsR0FDQXhDLEtBQUF5QyxFQUFBbkIsS0FBQWdDLE1BQUF0RCxLQUFBeUMsR0FDQXpDLEtBQUFzWixFQUFBaFksS0FBQWdDLE1BQUF0RCxLQUFBc1osR0FFQXRaLElBRUEsQ0FRQSxXQUFBOEksR0FNQSxPQUpBOUksS0FBQXdDLEVBQUFsQixLQUFBeUgsTUFBQS9JLEtBQUF3QyxHQUNBeEMsS0FBQXlDLEVBQUFuQixLQUFBeUgsTUFBQS9JLEtBQUF5QyxHQUNBekMsS0FBQXNaLEVBQUFoWSxLQUFBeUgsTUFBQS9JLEtBQUFzWixHQUVBdFosSUFFQSxDQU9BLE1BQUFnSixHQU1BLE9BSkFoSixLQUFBd0MsR0FBQXhDLEtBQUF3QyxFQUNBeEMsS0FBQXlDLEdBQUF6QyxLQUFBeUMsRUFDQXpDLEtBQUFzWixHQUFBdFosS0FBQXNaLEVBRUF0WixJQUVBLENBUUEsR0FBQWlKLENBQUF0QixHQUVBLE9BQUEzSCxLQUFBd0MsRUFBQW1GLEVBQUFuRixFQUFBeEMsS0FBQXlDLEVBQUFrRixFQUFBbEYsRUFBQXpDLEtBQUFzWixFQUFBM1IsRUFBQTJSLENBRUEsQ0FXQSxRQUFBblEsR0FFQSxPQUFBbkosS0FBQXdDLEVBQUF4QyxLQUFBd0MsRUFBQXhDLEtBQUF5QyxFQUFBekMsS0FBQXlDLEVBQUF6QyxLQUFBc1osRUFBQXRaLEtBQUFzWixDQUVBLENBT0EsTUFBQXJZLEdBRUEsT0FBQUssS0FBQThILEtBQUFwSixLQUFBd0MsRUFBQXhDLEtBQUF3QyxFQUFBeEMsS0FBQXlDLEVBQUF6QyxLQUFBeUMsRUFBQXpDLEtBQUFzWixFQUFBdFosS0FBQXNaLEVBRUEsQ0FPQSxlQUFBalEsR0FFQSxPQUFBL0gsS0FBQTZDLElBQUFuRSxLQUFBd0MsR0FBQWxCLEtBQUE2QyxJQUFBbkUsS0FBQXlDLEdBQUFuQixLQUFBNkMsSUFBQW5FLEtBQUFzWixFQUVBLENBUUEsU0FBQWpXLEdBRUEsT0FBQXJELEtBQUFzSSxhQUFBdEksS0FBQWlCLFVBQUEsRUFFQSxDQVNBLFNBQUFnSixDQUFBaEosR0FFQSxPQUFBakIsS0FBQXFELFlBQUErRSxlQUFBbkgsRUFFQSxDQVdBLElBQUFzQixDQUFBb0YsRUFBQXVDLEdBTUEsT0FKQWxLLEtBQUF3QyxJQUFBbUYsRUFBQW5GLEVBQUF4QyxLQUFBd0MsR0FBQTBILEVBQ0FsSyxLQUFBeUMsSUFBQWtGLEVBQUFsRixFQUFBekMsS0FBQXlDLEdBQUF5SCxFQUNBbEssS0FBQXNaLElBQUEzUixFQUFBMlIsRUFBQXRaLEtBQUFzWixHQUFBcFAsRUFFQWxLLElBRUEsQ0FZQSxXQUFBbUssQ0FBQUMsRUFBQUMsRUFBQUgsR0FNQSxPQUpBbEssS0FBQXdDLEVBQUE0SCxFQUFBNUgsR0FBQTZILEVBQUE3SCxFQUFBNEgsRUFBQTVILEdBQUEwSCxFQUNBbEssS0FBQXlDLEVBQUEySCxFQUFBM0gsR0FBQTRILEVBQUE1SCxFQUFBMkgsRUFBQTNILEdBQUF5SCxFQUNBbEssS0FBQXNaLEVBQUFsUCxFQUFBa1AsR0FBQWpQLEVBQUFpUCxFQUFBbFAsRUFBQWtQLEdBQUFwUCxFQUVBbEssSUFFQSxDQVFBLEtBQUFrSixDQUFBdkIsR0FFQSxPQUFBM0gsS0FBQXVqQixhQUFBdmpCLEtBQUEySCxFQUVBLENBVUEsWUFBQTRiLENBQUExZCxFQUFBQyxHQUVBLE1BQUEwZCxFQUFBM2QsRUFBQXJELEVBQUFpaEIsRUFBQTVkLEVBQUFwRCxFQUFBaWhCLEVBQUE3ZCxFQUFBeVQsRUFDQXFLLEVBQUE3ZCxFQUFBdEQsRUFBQW9oQixFQUFBOWQsRUFBQXJELEVBQUFvaEIsRUFBQS9kLEVBQUF3VCxFQU1BLE9BSkF0WixLQUFBd0MsRUFBQWloQixFQUFBSSxFQUFBSCxFQUFBRSxFQUNBNWpCLEtBQUF5QyxFQUFBaWhCLEVBQUFDLEVBQUFILEVBQUFLLEVBQ0E3akIsS0FBQXNaLEVBQUFrSyxFQUFBSSxFQUFBSCxFQUFBRSxFQUVBM2pCLElBRUEsQ0FRQSxlQUFBOGpCLENBQUFuYyxHQUVBLE1BQUE4QixFQUFBOUIsRUFBQXdCLFdBRUEsR0FBQSxJQUFBTSxFQUFBLE9BQUF6SixLQUFBMkcsSUFBQSxFQUFBLEVBQUEsR0FFQSxNQUFBUyxFQUFBTyxFQUFBc0IsSUFBQWpKLE1BQUF5SixFQUVBLE9BQUF6SixLQUFBMEgsS0FBQUMsR0FBQVMsZUFBQWhCLEVBRUEsQ0FTQSxjQUFBMmMsQ0FBQUMsR0FJQSxPQUZBQyxHQUFBdmMsS0FBQTFILE1BQUE4akIsZ0JBQUFFLEdBRUFoa0IsS0FBQWdJLElBQUFpYyxHQUVBLENBUUEsT0FBQUMsQ0FBQUMsR0FFQSxPQUFBbmtCLEtBQUFnSSxJQUFBaWMsR0FBQXZjLEtBQUF5YyxHQUFBL2IsZUFBQSxFQUFBcEksS0FBQWlKLElBQUFrYixJQUVBLENBT0EsT0FBQTNhLENBQUE3QixHQUVBLE1BQUE4QixFQUFBbkksS0FBQThILEtBQUFwSixLQUFBbUosV0FBQXhCLEVBQUF3QixZQUVBLEdBQUEsSUFBQU0sRUFBQSxPQUFBbkksS0FBQUMsR0FBQSxFQUVBLE1BQUFtSSxFQUFBMUosS0FBQWlKLElBQUF0QixHQUFBOEIsRUFJQSxPQUFBbkksS0FBQXFJLEtBQUEzSCxHQUFBMEgsR0FBQSxFQUFBLEdBRUEsQ0FRQSxVQUFBRSxDQUFBakMsR0FFQSxPQUFBckcsS0FBQThILEtBQUFwSixLQUFBNkosa0JBQUFsQyxHQUVBLENBVUEsaUJBQUFrQyxDQUFBbEMsR0FFQSxNQUFBbUMsRUFBQTlKLEtBQUF3QyxFQUFBbUYsRUFBQW5GLEVBQUF1SCxFQUFBL0osS0FBQXlDLEVBQUFrRixFQUFBbEYsRUFBQTJoQixFQUFBcGtCLEtBQUFzWixFQUFBM1IsRUFBQTJSLEVBRUEsT0FBQXhQLEVBQUFBLEVBQUFDLEVBQUFBLEVBQUFxYSxFQUFBQSxDQUVBLENBUUEsbUJBQUFwYSxDQUFBckMsR0FFQSxPQUFBckcsS0FBQTZDLElBQUFuRSxLQUFBd0MsRUFBQW1GLEVBQUFuRixHQUFBbEIsS0FBQTZDLElBQUFuRSxLQUFBeUMsRUFBQWtGLEVBQUFsRixHQUFBbkIsS0FBQTZDLElBQUFuRSxLQUFBc1osRUFBQTNSLEVBQUEyUixFQUVBLENBUUEsZ0JBQUErSyxDQUFBdmYsR0FFQSxPQUFBOUUsS0FBQXNrQix1QkFBQXhmLEVBQUF5ZixPQUFBemYsRUFBQTBmLElBQUExZixFQUFBNEUsTUFFQSxDQVVBLHNCQUFBNGEsQ0FBQUMsRUFBQUMsRUFBQTlhLEdBRUEsTUFBQSthLEVBQUFuakIsS0FBQTRFLElBQUFzZSxHQUFBRCxFQU1BLE9BSkF2a0IsS0FBQXdDLEVBQUFpaUIsRUFBQW5qQixLQUFBNEUsSUFBQXdELEdBQ0ExSixLQUFBeUMsRUFBQW5CLEtBQUEyRSxJQUFBdWUsR0FBQUQsRUFDQXZrQixLQUFBc1osRUFBQW1MLEVBQUFuakIsS0FBQTJFLElBQUF5RCxHQUVBMUosSUFFQSxDQVFBLGtCQUFBMGtCLENBQUEzZSxHQUVBLE9BQUEvRixLQUFBMmtCLHlCQUFBNWUsRUFBQXdlLE9BQUF4ZSxFQUFBMkQsTUFBQTNELEVBQUF0RCxFQUVBLENBVUEsd0JBQUFraUIsQ0FBQUosRUFBQTdhLEVBQUFqSCxHQU1BLE9BSkF6QyxLQUFBd0MsRUFBQStoQixFQUFBampCLEtBQUE0RSxJQUFBd0QsR0FDQTFKLEtBQUF5QyxFQUFBQSxFQUNBekMsS0FBQXNaLEVBQUFpTCxFQUFBampCLEtBQUEyRSxJQUFBeUQsR0FFQTFKLElBRUEsQ0FTQSxxQkFBQSthLENBQUF6WSxHQUVBLE1BQUFrRyxFQUFBbEcsRUFBQW1HLFNBTUEsT0FKQXpJLEtBQUF3QyxFQUFBZ0csRUFBQSxJQUNBeEksS0FBQXlDLEVBQUErRixFQUFBLElBQ0F4SSxLQUFBc1osRUFBQTlRLEVBQUEsSUFFQXhJLElBRUEsQ0FTQSxrQkFBQTRrQixDQUFBdGlCLEdBRUEsTUFBQTBNLEVBQUFoUCxLQUFBNmtCLG9CQUFBdmlCLEVBQUEsR0FBQXJCLFNBQ0FnTyxFQUFBalAsS0FBQTZrQixvQkFBQXZpQixFQUFBLEdBQUFyQixTQUNBNmpCLEVBQUE5a0IsS0FBQTZrQixvQkFBQXZpQixFQUFBLEdBQUFyQixTQU1BLE9BSkFqQixLQUFBd0MsRUFBQXdNLEVBQ0FoUCxLQUFBeUMsRUFBQXdNLEVBQ0FqUCxLQUFBc1osRUFBQXdMLEVBRUE5a0IsSUFFQSxDQVNBLG1CQUFBNmtCLENBQUF2aUIsRUFBQTlCLEdBRUEsT0FBQVIsS0FBQXVLLFVBQUFqSSxFQUFBbUcsU0FBQSxFQUFBakksRUFFQSxDQVNBLG9CQUFBNEwsQ0FBQTlKLEVBQUE5QixHQUVBLE9BQUFSLEtBQUF1SyxVQUFBakksRUFBQW1HLFNBQUEsRUFBQWpJLEVBRUEsQ0FRQSxZQUFBNGUsQ0FBQTVXLEdBTUEsT0FKQXhJLEtBQUF3QyxFQUFBZ0csRUFBQWdWLEdBQ0F4ZCxLQUFBeUMsRUFBQStGLEVBQUFpVixHQUNBemQsS0FBQXNaLEVBQUE5USxFQUFBa1YsR0FFQTFkLElBRUEsQ0FTQSxZQUFBK2tCLENBQUFoZixHQU1BLE9BSkEvRixLQUFBd0MsRUFBQXVELEVBQUE2SSxFQUNBNU8sS0FBQXlDLEVBQUFzRCxFQUFBZ0ksRUFDQS9OLEtBQUFzWixFQUFBdlQsRUFBQUQsRUFFQTlGLElBRUEsQ0FRQSxNQUFBc0ssQ0FBQTNDLEdBRUEsT0FBQUEsRUFBQW5GLElBQUF4QyxLQUFBd0MsR0FBQW1GLEVBQUFsRixJQUFBekMsS0FBQXlDLEdBQUFrRixFQUFBMlIsSUFBQXRaLEtBQUFzWixDQUVBLENBVUEsU0FBQS9PLENBQUExSixFQUFBMkosRUFBQSxHQU1BLE9BSkF4SyxLQUFBd0MsRUFBQTNCLEVBQUEySixHQUNBeEssS0FBQXlDLEVBQUE1QixFQUFBMkosRUFBQSxHQUNBeEssS0FBQXNaLEVBQUF6WSxFQUFBMkosRUFBQSxHQUVBeEssSUFFQSxDQVVBLE9BQUF5SyxDQUFBNUosRUFBQSxHQUFBMkosRUFBQSxHQU1BLE9BSkEzSixFQUFBMkosR0FBQXhLLEtBQUF3QyxFQUNBM0IsRUFBQTJKLEVBQUEsR0FBQXhLLEtBQUF5QyxFQUNBNUIsRUFBQTJKLEVBQUEsR0FBQXhLLEtBQUFzWixFQUVBelksQ0FFQSxDQVNBLG1CQUFBNkosQ0FBQUMsRUFBQW5LLEdBTUEsT0FKQVIsS0FBQXdDLEVBQUFtSSxFQUFBQyxLQUFBcEssR0FDQVIsS0FBQXlDLEVBQUFrSSxFQUFBRSxLQUFBckssR0FDQVIsS0FBQXNaLEVBQUEzTyxFQUFBcVEsS0FBQXhhLEdBRUFSLElBRUEsQ0FRQSxNQUFBMkIsR0FNQSxPQUpBM0IsS0FBQXdDLEVBQUFsQixLQUFBSyxTQUNBM0IsS0FBQXlDLEVBQUFuQixLQUFBSyxTQUNBM0IsS0FBQXNaLEVBQUFoWSxLQUFBSyxTQUVBM0IsSUFFQSxDQU9BLGVBQUFnbEIsR0FJQSxNQUFBdGIsRUFBQXBJLEtBQUFLLFNBQUFMLEtBQUFDLEdBQUEsRUFDQTBqQixFQUFBLEVBQUEzakIsS0FBQUssU0FBQSxFQUNBb0UsRUFBQXpFLEtBQUE4SCxLQUFBLEVBQUE2YixFQUFBQSxHQU1BLE9BSkFqbEIsS0FBQXdDLEVBQUF1RCxFQUFBekUsS0FBQTJFLElBQUF5RCxHQUNBMUosS0FBQXlDLEVBQUF3aUIsRUFDQWpsQixLQUFBc1osRUFBQXZULEVBQUF6RSxLQUFBNEUsSUFBQXdELEdBRUExSixJQUVBLENBRUEsRUFBQWdMLE9BQUFDLGtCQUVBakwsS0FBQXdDLFFBQ0F4QyxLQUFBeUMsUUFDQXpDLEtBQUFzWixDQUVBLEVBSUEsTUFBQTJLLEdBQUEsSUFBQWpDLEdBQ0FLLEdBQUEsSUFBQS9FLEdDcnVDQSxNQUFBNEgsR0FRQSxXQUFBdGlCLENBQUFWLEVBQUEsSUFBQThmLEdBQUFtRCxJQUFBQSxJQUFBQSxLQUFBaGpCLEVBQUEsSUFBQTZmLElBQUFtRCxLQUFBQSxLQUFBQSxNQVNBbmxCLEtBQUFvbEIsUUFBQSxFQU9BcGxCLEtBQUFrQyxJQUFBQSxFQU9BbEMsS0FBQW1DLElBQUFBLENBRUEsQ0FVQSxHQUFBd0UsQ0FBQXpFLEVBQUFDLEdBS0EsT0FIQW5DLEtBQUFrQyxJQUFBd0YsS0FBQXhGLEdBQ0FsQyxLQUFBbUMsSUFBQXVGLEtBQUF2RixHQUVBbkMsSUFFQSxDQVNBLFlBQUFxbEIsQ0FBQXhrQixHQUVBYixLQUFBc2xCLFlBRUEsSUFBQSxJQUFBdmtCLEVBQUEsRUFBQXFiLEVBQUF2YixFQUFBSSxPQUFBRixFQUFBcWIsRUFBQXJiLEdBQUEsRUFFQWYsS0FBQXVsQixjQUFBQyxHQUFBamIsVUFBQTFKLEVBQUFFLElBSUEsT0FBQWYsSUFFQSxDQVNBLHNCQUFBeWxCLENBQUE5YSxHQUVBM0ssS0FBQXNsQixZQUVBLElBQUEsSUFBQXZrQixFQUFBLEVBQUFxYixFQUFBelIsRUFBQW9SLE1BQUFoYixFQUFBcWIsRUFBQXJiLElBRUFmLEtBQUF1bEIsY0FBQUMsR0FBQTlhLG9CQUFBQyxFQUFBNUosSUFJQSxPQUFBZixJQUVBLENBU0EsYUFBQTBsQixDQUFBQyxHQUVBM2xCLEtBQUFzbEIsWUFFQSxJQUFBLElBQUF2a0IsRUFBQSxFQUFBcWIsRUFBQXVKLEVBQUExa0IsT0FBQUYsRUFBQXFiLEVBQUFyYixJQUVBZixLQUFBdWxCLGNBQUFJLEVBQUE1a0IsSUFJQSxPQUFBZixJQUVBLENBVUEsb0JBQUE0bEIsQ0FBQTdhLEVBQUE4YSxHQUVBLE1BQUFDLEVBQUFOLEdBQUE5ZCxLQUFBbWUsR0FBQXpkLGVBQUEsSUFLQSxPQUhBcEksS0FBQWtDLElBQUF3RixLQUFBcUQsR0FBQS9DLElBQUE4ZCxHQUNBOWxCLEtBQUFtQyxJQUFBdUYsS0FBQXFELEdBQUFuRCxJQUFBa2UsR0FFQTlsQixJQUVBLENBWUEsYUFBQStsQixDQUFBQyxFQUFBQyxHQUFBLEdBSUEsT0FGQWptQixLQUFBc2xCLFlBRUF0bEIsS0FBQWttQixlQUFBRixFQUFBQyxFQUVBLENBT0EsS0FBQXhlLEdBRUEsT0FBQSxJQUFBekgsS0FBQTRDLGFBQUE4RSxLQUFBMUgsS0FFQSxDQVFBLElBQUEwSCxDQUFBeWUsR0FLQSxPQUhBbm1CLEtBQUFrQyxJQUFBd0YsS0FBQXllLEVBQUFqa0IsS0FDQWxDLEtBQUFtQyxJQUFBdUYsS0FBQXllLEVBQUFoa0IsS0FFQW5DLElBRUEsQ0FPQSxTQUFBc2xCLEdBS0EsT0FIQXRsQixLQUFBa0MsSUFBQU0sRUFBQXhDLEtBQUFrQyxJQUFBTyxFQUFBekMsS0FBQWtDLElBQUFvWCxFQUFBNkwsSUFDQW5sQixLQUFBbUMsSUFBQUssRUFBQXhDLEtBQUFtQyxJQUFBTSxFQUFBekMsS0FBQW1DLElBQUFtWCxHQUFBNkwsSUFFQW5sQixJQUVBLENBU0EsT0FBQW9tQixHQUlBLE9BQUFwbUIsS0FBQW1DLElBQUFLLEVBQUF4QyxLQUFBa0MsSUFBQU0sR0FBQXhDLEtBQUFtQyxJQUFBTSxFQUFBekMsS0FBQWtDLElBQUFPLEdBQUF6QyxLQUFBbUMsSUFBQW1YLEVBQUF0WixLQUFBa0MsSUFBQW9YLENBRUEsQ0FRQSxTQUFBK00sQ0FBQXpsQixHQUVBLE9BQUFaLEtBQUFvbUIsVUFBQXhsQixFQUFBK0YsSUFBQSxFQUFBLEVBQUEsR0FBQS9GLEVBQUFrSCxXQUFBOUgsS0FBQWtDLElBQUFsQyxLQUFBbUMsS0FBQWlHLGVBQUEsR0FFQSxDQVFBLE9BQUFrZSxDQUFBMWxCLEdBRUEsT0FBQVosS0FBQW9tQixVQUFBeGxCLEVBQUErRixJQUFBLEVBQUEsRUFBQSxHQUFBL0YsRUFBQXNILFdBQUFsSSxLQUFBbUMsSUFBQW5DLEtBQUFrQyxJQUVBLENBUUEsYUFBQXFqQixDQUFBZ0IsR0FLQSxPQUhBdm1CLEtBQUFrQyxJQUFBQSxJQUFBcWtCLEdBQ0F2bUIsS0FBQW1DLElBQUFBLElBQUFva0IsR0FFQXZtQixJQUVBLENBWUEsY0FBQXdtQixDQUFBQyxHQUtBLE9BSEF6bUIsS0FBQWtDLElBQUE4RixJQUFBeWUsR0FDQXptQixLQUFBbUMsSUFBQXlGLElBQUE2ZSxHQUVBem1CLElBRUEsQ0FTQSxjQUFBMG1CLENBQUF0ZixHQUtBLE9BSEFwSCxLQUFBa0MsSUFBQTJGLFdBQUFULEdBQ0FwSCxLQUFBbUMsSUFBQTBGLFVBQUFULEdBRUFwSCxJQUVBLENBYUEsY0FBQWttQixDQUFBRixFQUFBQyxHQUFBLEdBS0FELEVBQUFXLG1CQUFBLEdBQUEsR0FFQSxNQUFBQyxFQUFBWixFQUFBWSxTQUVBLFFBQUE3bUIsSUFBQTZtQixFQUFBLENBRUEsTUFBQUMsRUFBQUQsRUFBQUUsYUFBQSxZQUtBLElBQUEsSUFBQWIsUUFBQWxtQixJQUFBOG1CLElBQUEsSUFBQWIsRUFBQWUsZ0JBRUEsSUFBQSxJQUFBaG1CLEVBQUEsRUFBQUMsRUFBQTZsQixFQUFBOUssTUFBQWhiLEVBQUFDLEVBQUFELEtBRUEsSUFBQWlsQixFQUFBZ0IsT0FFQWhCLEVBQUFpQixrQkFBQWxtQixFQUFBeWtCLElBSUFBLEdBQUE5YSxvQkFBQW1jLEVBQUE5bEIsR0FJQXlrQixHQUFBN0wsYUFBQXFNLEVBQUEzQyxhQUNBcmpCLEtBQUF1bEIsY0FBQUMsY0FNQXpsQixJQUFBaW1CLEVBQUFrQixhQUlBLE9BQUFsQixFQUFBa0IsYUFFQWxCLEVBQUFtQixxQkFJQUMsR0FBQTFmLEtBQUFzZSxFQUFBa0IsZUFPQSxPQUFBTixFQUFBTSxhQUVBTixFQUFBTyxxQkFJQUMsR0FBQTFmLEtBQUFrZixFQUFBTSxjQUlBRSxHQUFBek4sYUFBQXFNLEVBQUEzQyxhQUVBcmpCLEtBQUFxbkIsTUFBQUQsR0FJQSxDQUVBLE1BQUFFLEVBQUF0QixFQUFBc0IsU0FFQSxJQUFBLElBQUF2bUIsRUFBQSxFQUFBQyxFQUFBc21CLEVBQUFybUIsT0FBQUYsRUFBQUMsRUFBQUQsSUFFQWYsS0FBQWttQixlQUFBb0IsRUFBQXZtQixHQUFBa2xCLEdBSUEsT0FBQWptQixJQUVBLENBUUEsYUFBQXVuQixDQUFBaEIsR0FFQSxPQUFBQSxFQUFBL2pCLEdBQUF4QyxLQUFBa0MsSUFBQU0sR0FBQStqQixFQUFBL2pCLEdBQUF4QyxLQUFBbUMsSUFBQUssR0FDQStqQixFQUFBOWpCLEdBQUF6QyxLQUFBa0MsSUFBQU8sR0FBQThqQixFQUFBOWpCLEdBQUF6QyxLQUFBbUMsSUFBQU0sR0FDQThqQixFQUFBak4sR0FBQXRaLEtBQUFrQyxJQUFBb1gsR0FBQWlOLEVBQUFqTixHQUFBdFosS0FBQW1DLElBQUFtWCxDQUVBLENBU0EsV0FBQWtPLENBQUFyQixHQUVBLE9BQUFubUIsS0FBQWtDLElBQUFNLEdBQUEyakIsRUFBQWprQixJQUFBTSxHQUFBMmpCLEVBQUFoa0IsSUFBQUssR0FBQXhDLEtBQUFtQyxJQUFBSyxHQUNBeEMsS0FBQWtDLElBQUFPLEdBQUEwakIsRUFBQWprQixJQUFBTyxHQUFBMGpCLEVBQUFoa0IsSUFBQU0sR0FBQXpDLEtBQUFtQyxJQUFBTSxHQUNBekMsS0FBQWtDLElBQUFvWCxHQUFBNk0sRUFBQWprQixJQUFBb1gsR0FBQTZNLEVBQUFoa0IsSUFBQW1YLEdBQUF0WixLQUFBbUMsSUFBQW1YLENBRUEsQ0FTQSxZQUFBbU8sQ0FBQWxCLEVBQUEzbEIsR0FLQSxPQUFBQSxFQUFBK0YsS0FDQTRmLEVBQUEvakIsRUFBQXhDLEtBQUFrQyxJQUFBTSxJQUFBeEMsS0FBQW1DLElBQUFLLEVBQUF4QyxLQUFBa0MsSUFBQU0sSUFDQStqQixFQUFBOWpCLEVBQUF6QyxLQUFBa0MsSUFBQU8sSUFBQXpDLEtBQUFtQyxJQUFBTSxFQUFBekMsS0FBQWtDLElBQUFPLElBQ0E4akIsRUFBQWpOLEVBQUF0WixLQUFBa0MsSUFBQW9YLElBQUF0WixLQUFBbUMsSUFBQW1YLEVBQUF0WixLQUFBa0MsSUFBQW9YLEdBR0EsQ0FRQSxhQUFBb08sQ0FBQXZCLEdBR0EsT0FBQUEsRUFBQWhrQixJQUFBSyxHQUFBeEMsS0FBQWtDLElBQUFNLEdBQUEyakIsRUFBQWprQixJQUFBTSxHQUFBeEMsS0FBQW1DLElBQUFLLEdBQ0EyakIsRUFBQWhrQixJQUFBTSxHQUFBekMsS0FBQWtDLElBQUFPLEdBQUEwakIsRUFBQWprQixJQUFBTyxHQUFBekMsS0FBQW1DLElBQUFNLEdBQ0EwakIsRUFBQWhrQixJQUFBbVgsR0FBQXRaLEtBQUFrQyxJQUFBb1gsR0FBQTZNLEVBQUFqa0IsSUFBQW9YLEdBQUF0WixLQUFBbUMsSUFBQW1YLENBRUEsQ0FRQSxnQkFBQXFPLENBQUFDLEdBTUEsT0FIQTVuQixLQUFBNm5CLFdBQUFELEVBQUE3YyxPQUFBeWEsSUFHQUEsR0FBQTNiLGtCQUFBK2QsRUFBQTdjLFNBQUE2YyxFQUFBckQsT0FBQXFELEVBQUFyRCxNQUVBLENBUUEsZUFBQXVELENBQUFDLEdBS0EsSUFBQTdsQixFQUFBQyxFQXNDQSxPQXBDQTRsQixFQUFBNUQsT0FBQTNoQixFQUFBLEdBRUFOLEVBQUE2bEIsRUFBQTVELE9BQUEzaEIsRUFBQXhDLEtBQUFrQyxJQUFBTSxFQUNBTCxFQUFBNGxCLEVBQUE1RCxPQUFBM2hCLEVBQUF4QyxLQUFBbUMsSUFBQUssSUFJQU4sRUFBQTZsQixFQUFBNUQsT0FBQTNoQixFQUFBeEMsS0FBQW1DLElBQUFLLEVBQ0FMLEVBQUE0bEIsRUFBQTVELE9BQUEzaEIsRUFBQXhDLEtBQUFrQyxJQUFBTSxHQUlBdWxCLEVBQUE1RCxPQUFBMWhCLEVBQUEsR0FFQVAsR0FBQTZsQixFQUFBNUQsT0FBQTFoQixFQUFBekMsS0FBQWtDLElBQUFPLEVBQ0FOLEdBQUE0bEIsRUFBQTVELE9BQUExaEIsRUFBQXpDLEtBQUFtQyxJQUFBTSxJQUlBUCxHQUFBNmxCLEVBQUE1RCxPQUFBMWhCLEVBQUF6QyxLQUFBbUMsSUFBQU0sRUFDQU4sR0FBQTRsQixFQUFBNUQsT0FBQTFoQixFQUFBekMsS0FBQWtDLElBQUFPLEdBSUFzbEIsRUFBQTVELE9BQUE3SyxFQUFBLEdBRUFwWCxHQUFBNmxCLEVBQUE1RCxPQUFBN0ssRUFBQXRaLEtBQUFrQyxJQUFBb1gsRUFDQW5YLEdBQUE0bEIsRUFBQTVELE9BQUE3SyxFQUFBdFosS0FBQW1DLElBQUFtWCxJQUlBcFgsR0FBQTZsQixFQUFBNUQsT0FBQTdLLEVBQUF0WixLQUFBbUMsSUFBQW1YLEVBQ0FuWCxHQUFBNGxCLEVBQUE1RCxPQUFBN0ssRUFBQXRaLEtBQUFrQyxJQUFBb1gsR0FJQXBYLElBQUE2bEIsRUFBQUMsVUFBQTdsQixJQUFBNGxCLEVBQUFDLFFBRUEsQ0FRQSxrQkFBQUMsQ0FBQUMsR0FFQSxHQUFBbG9CLEtBQUFvbUIsVUFFQSxPQUFBLEVBS0FwbUIsS0FBQXFtQixVQUFBOEIsSUFDQUMsR0FBQWxnQixXQUFBbEksS0FBQW1DLElBQUFnbUIsSUFHQUUsR0FBQW5nQixXQUFBZ2dCLEVBQUFyaUIsRUFBQXNpQixJQUNBRyxHQUFBcGdCLFdBQUFnZ0IsRUFBQXBpQixFQUFBcWlCLElBQ0FJLEdBQUFyZ0IsV0FBQWdnQixFQUFBbmlCLEVBQUFvaUIsSUFHQUssR0FBQXRnQixXQUFBb2dCLEdBQUFELElBQ0FJLEdBQUF2Z0IsV0FBQXFnQixHQUFBRCxJQUNBSSxHQUFBeGdCLFdBQUFtZ0IsR0FBQUUsSUFLQSxJQUFBSSxFQUFBLENBQ0EsR0FBQUgsR0FBQWxQLEVBQUFrUCxHQUFBL2xCLEVBQUEsR0FBQWdtQixHQUFBblAsRUFBQW1QLEdBQUFobUIsRUFBQSxHQUFBaW1CLEdBQUFwUCxFQUFBb1AsR0FBQWptQixFQUNBK2xCLEdBQUFsUCxFQUFBLEdBQUFrUCxHQUFBaG1CLEVBQUFpbUIsR0FBQW5QLEVBQUEsR0FBQW1QLEdBQUFqbUIsRUFBQWttQixHQUFBcFAsRUFBQSxHQUFBb1AsR0FBQWxtQixHQUNBZ21CLEdBQUEvbEIsRUFBQStsQixHQUFBaG1CLEVBQUEsR0FBQWltQixHQUFBaG1CLEVBQUFnbUIsR0FBQWptQixFQUFBLEdBQUFrbUIsR0FBQWptQixFQUFBaW1CLEdBQUFsbUIsRUFBQSxHQUVBLFFBQUFvbUIsR0FBQUQsRUFBQU4sR0FBQUMsR0FBQUMsR0FBQUgsTUFPQU8sRUFBQSxDQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxLQUNBQyxHQUFBRCxFQUFBTixHQUFBQyxHQUFBQyxHQUFBSCxNQVFBUyxHQUFBdEYsYUFBQWlGLEdBQUFDLElBQ0FFLEVBQUEsQ0FBQUUsR0FBQXJtQixFQUFBcW1CLEdBQUFwbUIsRUFBQW9tQixHQUFBdlAsR0FFQXNQLEdBQUFELEVBQUFOLEdBQUFDLEdBQUFDLEdBQUFILEtBRUEsQ0FTQSxVQUFBUCxDQUFBdEIsRUFBQTNsQixHQUVBLE9BQUFBLEVBQUE4RyxLQUFBNmUsR0FBQXZrQixNQUFBaEMsS0FBQWtDLElBQUFsQyxLQUFBbUMsSUFFQSxDQVNBLGVBQUEybUIsQ0FBQXZDLEdBRUEsT0FBQXZtQixLQUFBNm5CLFdBQUF0QixFQUFBZixJQUFBNWIsV0FBQTJjLEVBRUEsQ0FRQSxpQkFBQXdDLENBQUFub0IsR0FjQSxPQVpBWixLQUFBb21CLFVBRUF4bEIsRUFBQTBrQixhQUlBdGxCLEtBQUFxbUIsVUFBQXpsQixFQUFBbUssUUFFQW5LLEVBQUEyakIsT0FBQSxHQUFBdmtCLEtBQUFzbUIsUUFBQWQsSUFBQXZrQixVQUlBTCxDQUVBLENBV0EsU0FBQW9vQixDQUFBN0MsR0FRQSxPQU5Bbm1CLEtBQUFrQyxJQUFBQyxJQUFBZ2tCLEVBQUFqa0IsS0FDQWxDLEtBQUFtQyxJQUFBRCxJQUFBaWtCLEVBQUFoa0IsS0FHQW5DLEtBQUFvbUIsV0FBQXBtQixLQUFBc2xCLFlBRUF0bEIsSUFFQSxDQVVBLEtBQUFxbkIsQ0FBQWxCLEdBS0EsT0FIQW5tQixLQUFBa0MsSUFBQUEsSUFBQWlrQixFQUFBamtCLEtBQ0FsQyxLQUFBbUMsSUFBQUEsSUFBQWdrQixFQUFBaGtCLEtBRUFuQyxJQUVBLENBUUEsWUFBQTJaLENBQUEvSixHQUdBLE9BQUE1UCxLQUFBb21CLFlBR0E2QyxHQUFBLEdBQUF0aUIsSUFBQTNHLEtBQUFrQyxJQUFBTSxFQUFBeEMsS0FBQWtDLElBQUFPLEVBQUF6QyxLQUFBa0MsSUFBQW9YLEdBQUFLLGFBQUEvSixHQUNBcVosR0FBQSxHQUFBdGlCLElBQUEzRyxLQUFBa0MsSUFBQU0sRUFBQXhDLEtBQUFrQyxJQUFBTyxFQUFBekMsS0FBQW1DLElBQUFtWCxHQUFBSyxhQUFBL0osR0FDQXFaLEdBQUEsR0FBQXRpQixJQUFBM0csS0FBQWtDLElBQUFNLEVBQUF4QyxLQUFBbUMsSUFBQU0sRUFBQXpDLEtBQUFrQyxJQUFBb1gsR0FBQUssYUFBQS9KLEdBQ0FxWixHQUFBLEdBQUF0aUIsSUFBQTNHLEtBQUFrQyxJQUFBTSxFQUFBeEMsS0FBQW1DLElBQUFNLEVBQUF6QyxLQUFBbUMsSUFBQW1YLEdBQUFLLGFBQUEvSixHQUNBcVosR0FBQSxHQUFBdGlCLElBQUEzRyxLQUFBbUMsSUFBQUssRUFBQXhDLEtBQUFrQyxJQUFBTyxFQUFBekMsS0FBQWtDLElBQUFvWCxHQUFBSyxhQUFBL0osR0FDQXFaLEdBQUEsR0FBQXRpQixJQUFBM0csS0FBQW1DLElBQUFLLEVBQUF4QyxLQUFBa0MsSUFBQU8sRUFBQXpDLEtBQUFtQyxJQUFBbVgsR0FBQUssYUFBQS9KLEdBQ0FxWixHQUFBLEdBQUF0aUIsSUFBQTNHLEtBQUFtQyxJQUFBSyxFQUFBeEMsS0FBQW1DLElBQUFNLEVBQUF6QyxLQUFBa0MsSUFBQW9YLEdBQUFLLGFBQUEvSixHQUNBcVosR0FBQSxHQUFBdGlCLElBQUEzRyxLQUFBbUMsSUFBQUssRUFBQXhDLEtBQUFtQyxJQUFBTSxFQUFBekMsS0FBQW1DLElBQUFtWCxHQUFBSyxhQUFBL0osR0FFQTVQLEtBQUEwbEIsY0FBQXVELEtBWkFqcEIsSUFnQkEsQ0FTQSxTQUFBMFAsQ0FBQWxGLEdBS0EsT0FIQXhLLEtBQUFrQyxJQUFBMEYsSUFBQTRDLEdBQ0F4SyxLQUFBbUMsSUFBQXlGLElBQUE0QyxHQUVBeEssSUFFQSxDQVFBLE1BQUFzSyxDQUFBNmIsR0FFQSxPQUFBQSxFQUFBamtCLElBQUFvSSxPQUFBdEssS0FBQWtDLE1BQUFpa0IsRUFBQWhrQixJQUFBbUksT0FBQXRLLEtBQUFtQyxJQUVBLEVBSUEsTUFBQThtQixHQUFBLENBQ0EsSUFBQWpILEdBQ0EsSUFBQUEsR0FDQSxJQUFBQSxHQUNBLElBQUFBLEdBQ0EsSUFBQUEsR0FDQSxJQUFBQSxHQUNBLElBQUFBLEdBQ0EsSUFBQUEsSUFHQXdELEdBQUEsSUFBQXhELEdBRUFvRixHQUFBLElBQUFsQyxHQUlBbUQsR0FBQSxJQUFBckcsR0FDQXNHLEdBQUEsSUFBQXRHLEdBQ0F1RyxHQUFBLElBQUF2RyxHQUlBd0csR0FBQSxJQUFBeEcsR0FDQXlHLEdBQUEsSUFBQXpHLEdBQ0EwRyxHQUFBLElBQUExRyxHQUVBbUcsR0FBQSxJQUFBbkcsR0FDQW9HLEdBQUEsSUFBQXBHLEdBQ0E2RyxHQUFBLElBQUE3RyxHQUNBa0gsR0FBQSxJQUFBbEgsR0FFQSxTQUFBNEcsR0FBQUQsRUFBQVEsRUFBQS9lLEVBQUFDLEVBQUErZSxHQUVBLElBQUEsSUFBQXJvQixFQUFBLEVBQUFzb0IsRUFBQVYsRUFBQTFuQixPQUFBLEVBQUFGLEdBQUFzb0IsRUFBQXRvQixHQUFBLEVBQUEsQ0FFQW1vQixHQUFBM2UsVUFBQW9lLEVBQUE1bkIsR0FFQSxNQUFBNk4sRUFBQXdhLEVBQUE1bUIsRUFBQWxCLEtBQUE2QyxJQUFBK2tCLEdBQUExbUIsR0FBQTRtQixFQUFBM21CLEVBQUFuQixLQUFBNkMsSUFBQStrQixHQUFBem1CLEdBQUEybUIsRUFBQTlQLEVBQUFoWSxLQUFBNkMsSUFBQStrQixHQUFBNVAsR0FFQWdRLEVBQUFILEVBQUFsZ0IsSUFBQWlnQixJQUNBSyxFQUFBbmYsRUFBQW5CLElBQUFpZ0IsSUFDQU0sRUFBQW5mLEVBQUFwQixJQUFBaWdCLElBRUEsR0FBQTVuQixLQUFBYSxLQUFBYixLQUFBYSxJQUFBbW5CLEVBQUFDLEVBQUFDLEdBQUFsb0IsS0FBQVksSUFBQW9uQixFQUFBQyxFQUFBQyxJQUFBNWEsRUFJQSxPQUFBLENBSUEsQ0FFQSxPQUFBLENBRUEsQ0Nud0JBLE1BQUE2YSxHQUFBLElBQUF2RSxHQUNBd0UsR0FBQSxJQUFBMUgsR0FDQTJILEdBQUEsSUFBQTNILEdBTUEsTUFBQTRILEdBUUEsV0FBQWhuQixDQUFBbUksRUFBQSxJQUFBaVgsR0FBQXVDLEdBQUEsR0FTQXZrQixLQUFBNnBCLFVBQUEsRUFPQTdwQixLQUFBK0ssT0FBQUEsRUFPQS9LLEtBQUF1a0IsT0FBQUEsQ0FFQSxDQVNBLEdBQUE1ZCxDQUFBb0UsRUFBQXdaLEdBS0EsT0FIQXZrQixLQUFBK0ssT0FBQXJELEtBQUFxRCxHQUNBL0ssS0FBQXVrQixPQUFBQSxFQUVBdmtCLElBRUEsQ0FZQSxhQUFBMGxCLENBQUFDLEVBQUFtRSxHQUVBLE1BQUEvZSxFQUFBL0ssS0FBQStLLFlBRUFoTCxJQUFBK3BCLEVBRUEvZSxFQUFBckQsS0FBQW9pQixHQUlBTCxHQUFBL0QsY0FBQUMsR0FBQVUsVUFBQXRiLEdBSUEsSUFBQWdmLEVBQUEsRUFFQSxJQUFBLElBQUFocEIsRUFBQSxFQUFBcWIsRUFBQXVKLEVBQUExa0IsT0FBQUYsRUFBQXFiLEVBQUFyYixJQUVBZ3BCLEVBQUF6b0IsS0FBQWEsSUFBQTRuQixFQUFBaGYsRUFBQWxCLGtCQUFBOGIsRUFBQTVrQixLQU1BLE9BRkFmLEtBQUF1a0IsT0FBQWpqQixLQUFBOEgsS0FBQTJnQixHQUVBL3BCLElBRUEsQ0FRQSxJQUFBMEgsQ0FBQWtnQixHQUtBLE9BSEE1bkIsS0FBQStLLE9BQUFyRCxLQUFBa2dCLEVBQUE3YyxRQUNBL0ssS0FBQXVrQixPQUFBcUQsRUFBQXJELE9BRUF2a0IsSUFFQSxDQVVBLE9BQUFvbUIsR0FFQSxPQUFBcG1CLEtBQUF1a0IsT0FBQSxDQUVBLENBT0EsU0FBQWUsR0FLQSxPQUhBdGxCLEtBQUErSyxPQUFBcEUsSUFBQSxFQUFBLEVBQUEsR0FDQTNHLEtBQUF1a0IsUUFBQSxFQUVBdmtCLElBRUEsQ0FTQSxhQUFBdW5CLENBQUFoQixHQUVBLE9BQUFBLEVBQUExYyxrQkFBQTdKLEtBQUErSyxTQUFBL0ssS0FBQXVrQixPQUFBdmtCLEtBQUF1a0IsTUFFQSxDQVVBLGVBQUF1RSxDQUFBdkMsR0FFQSxPQUFBQSxFQUFBM2MsV0FBQTVKLEtBQUErSyxRQUFBL0ssS0FBQXVrQixNQUVBLENBUUEsZ0JBQUFvRCxDQUFBQyxHQUVBLE1BQUFvQyxFQUFBaHFCLEtBQUF1a0IsT0FBQXFELEVBQUFyRCxPQUVBLE9BQUFxRCxFQUFBN2MsT0FBQWxCLGtCQUFBN0osS0FBQStLLFNBQUFpZixFQUFBQSxDQUVBLENBUUEsYUFBQXRDLENBQUF2QixHQUVBLE9BQUFBLEVBQUF3QixpQkFBQTNuQixLQUVBLENBUUEsZUFBQThuQixDQUFBQyxHQUVBLE9BQUF6bUIsS0FBQTZDLElBQUE0akIsRUFBQWUsZ0JBQUE5b0IsS0FBQStLLFVBQUEvSyxLQUFBdWtCLE1BRUEsQ0FXQSxVQUFBc0QsQ0FBQXRCLEVBQUEzbEIsR0FFQSxNQUFBcXBCLEVBQUFqcUIsS0FBQStLLE9BQUFsQixrQkFBQTBjLEdBV0EsT0FUQTNsQixFQUFBOEcsS0FBQTZlLEdBRUEwRCxFQUFBanFCLEtBQUF1a0IsT0FBQXZrQixLQUFBdWtCLFNBRUEzakIsRUFBQW9ILElBQUFoSSxLQUFBK0ssUUFBQTFILFlBQ0F6QyxFQUFBd0gsZUFBQXBJLEtBQUF1a0IsUUFBQTNjLElBQUE1SCxLQUFBK0ssU0FJQW5LLENBRUEsQ0FRQSxjQUFBc3BCLENBQUF0cEIsR0FFQSxPQUFBWixLQUFBb21CLFdBR0F4bEIsRUFBQTBrQixZQUNBMWtCLElBSUFBLEVBQUErRixJQUFBM0csS0FBQStLLE9BQUEvSyxLQUFBK0ssUUFDQW5LLEVBQUE4bEIsZUFBQTFtQixLQUFBdWtCLFFBRUEzakIsRUFFQSxDQVFBLFlBQUErWSxDQUFBL0osR0FLQSxPQUhBNVAsS0FBQStLLE9BQUE0TyxhQUFBL0osR0FDQTVQLEtBQUF1a0IsT0FBQXZrQixLQUFBdWtCLE9BQUEzVSxFQUFBdWEsb0JBRUFucUIsSUFFQSxDQVFBLFNBQUEwUCxDQUFBbEYsR0FJQSxPQUZBeEssS0FBQStLLE9BQUFuRCxJQUFBNEMsR0FFQXhLLElBRUEsQ0FRQSxhQUFBdWxCLENBQUFnQixHQUVBLEdBQUF2bUIsS0FBQW9tQixVQU1BLE9BSkFwbUIsS0FBQStLLE9BQUFyRCxLQUFBNmUsR0FFQXZtQixLQUFBdWtCLE9BQUEsRUFFQXZrQixLQUlBMHBCLEdBQUF4aEIsV0FBQXFlLEVBQUF2bUIsS0FBQStLLFFBRUEsTUFBQTVCLEVBQUF1Z0IsR0FBQXZnQixXQUVBLEdBQUFBLEVBQUFuSixLQUFBdWtCLE9BQUF2a0IsS0FBQXVrQixPQUFBLENBSUEsTUFBQXRqQixFQUFBSyxLQUFBOEgsS0FBQUQsR0FFQWloQixFQUFBLElBQUFucEIsRUFBQWpCLEtBQUF1a0IsUUFFQXZrQixLQUFBK0ssT0FBQWhELGdCQUFBMmhCLEdBQUFVLEVBQUFucEIsR0FFQWpCLEtBQUF1a0IsUUFBQTZGLENBRUEsQ0FFQSxPQUFBcHFCLElBRUEsQ0FRQSxLQUFBcW5CLENBQUFPLEdBRUEsT0FBQUEsRUFBQXhCLFVBRUFwbUIsS0FJQUEsS0FBQW9tQixXQUVBcG1CLEtBQUEwSCxLQUFBa2dCLEdBRUE1bkIsUUFJQSxJQUFBQSxLQUFBK0ssT0FBQVQsT0FBQXNkLEVBQUE3YyxRQUVBL0ssS0FBQXVrQixPQUFBampCLEtBQUFhLElBQUFuQyxLQUFBdWtCLE9BQUFxRCxFQUFBckQsU0FJQW9GLEdBQUF6aEIsV0FBQTBmLEVBQUE3YyxPQUFBL0ssS0FBQStLLFFBQUFkLFVBQUEyZCxFQUFBckQsUUFFQXZrQixLQUFBdWxCLGNBQUFtRSxHQUFBaGlCLEtBQUFrZ0IsRUFBQTdjLFFBQUFuRCxJQUFBK2hCLEtBRUEzcEIsS0FBQXVsQixjQUFBbUUsR0FBQWhpQixLQUFBa2dCLEVBQUE3YyxRQUFBL0MsSUFBQTJoQixNQUlBM3BCLEtBRUEsQ0FRQSxNQUFBc0ssQ0FBQXNkLEdBRUEsT0FBQUEsRUFBQTdjLE9BQUFULE9BQUF0SyxLQUFBK0ssU0FBQTZjLEVBQUFyRCxTQUFBdmtCLEtBQUF1a0IsTUFFQSxDQU9BLEtBQUE5YyxHQUVBLE9BQUEsSUFBQXpILEtBQUE0QyxhQUFBOEUsS0FBQTFILEtBRUEsRUNqWUEsTUFBQXFxQixHQUFBLElBQUFySSxHQUNBc0ksR0FBQSxJQUFBdEksR0FDQXVJLEdBQUEsSUFBQXZJLEdBQ0F3SSxHQUFBLElBQUF4SSxHQUVBeUksR0FBQSxJQUFBekksR0FDQTBJLEdBQUEsSUFBQTFJLEdBQ0EySSxHQUFBLElBQUEzSSxHQVFBLE1BQUE0SSxHQVFBLFdBQUFob0IsQ0FBQWlvQixFQUFBLElBQUE3SSxHQUFBOEksRUFBQSxJQUFBOUksR0FBQSxFQUFBLEdBQUEsSUFPQWhpQixLQUFBNnFCLE9BQUFBLEVBT0E3cUIsS0FBQThxQixVQUFBQSxDQUVBLENBU0EsR0FBQW5rQixDQUFBa2tCLEVBQUFDLEdBS0EsT0FIQTlxQixLQUFBNnFCLE9BQUFuakIsS0FBQW1qQixHQUNBN3FCLEtBQUE4cUIsVUFBQXBqQixLQUFBb2pCLEdBRUE5cUIsSUFFQSxDQVFBLElBQUEwSCxDQUFBcWpCLEdBS0EsT0FIQS9xQixLQUFBNnFCLE9BQUFuakIsS0FBQXFqQixFQUFBRixRQUNBN3FCLEtBQUE4cUIsVUFBQXBqQixLQUFBcWpCLEVBQUFELFdBRUE5cUIsSUFFQSxDQVNBLEVBQUFnckIsQ0FBQXRvQixFQUFBOUIsR0FFQSxPQUFBQSxFQUFBOEcsS0FBQTFILEtBQUE2cUIsUUFBQTlpQixnQkFBQS9ILEtBQUE4cUIsVUFBQXBvQixFQUVBLENBUUEsTUFBQXVvQixDQUFBdGpCLEdBSUEsT0FGQTNILEtBQUE4cUIsVUFBQXBqQixLQUFBQyxHQUFBSyxJQUFBaEksS0FBQTZxQixRQUFBeG5CLFlBRUFyRCxJQUVBLENBUUEsTUFBQWtyQixDQUFBeG9CLEdBSUEsT0FGQTFDLEtBQUE2cUIsT0FBQW5qQixLQUFBMUgsS0FBQWdyQixHQUFBdG9CLEVBQUEybkIsS0FFQXJxQixJQUVBLENBU0EsbUJBQUFtckIsQ0FBQTVFLEVBQUEzbEIsR0FFQUEsRUFBQXNILFdBQUFxZSxFQUFBdm1CLEtBQUE2cUIsUUFFQSxNQUFBTyxFQUFBeHFCLEVBQUFxSSxJQUFBakosS0FBQThxQixXQUVBLE9BQUFNLEVBQUEsRUFFQXhxQixFQUFBOEcsS0FBQTFILEtBQUE2cUIsUUFJQWpxQixFQUFBOEcsS0FBQTFILEtBQUE2cUIsUUFBQTlpQixnQkFBQS9ILEtBQUE4cUIsVUFBQU0sRUFFQSxDQVFBLGVBQUF0QyxDQUFBdkMsR0FFQSxPQUFBamxCLEtBQUE4SCxLQUFBcEosS0FBQXFyQixrQkFBQTlFLEdBRUEsQ0FRQSxpQkFBQThFLENBQUE5RSxHQUVBLE1BQUE2RSxFQUFBZixHQUFBbmlCLFdBQUFxZSxFQUFBdm1CLEtBQUE2cUIsUUFBQTVoQixJQUFBakosS0FBQThxQixXQUlBLE9BQUFNLEVBQUEsRUFFQXByQixLQUFBNnFCLE9BQUFoaEIsa0JBQUEwYyxJQUlBOEQsR0FBQTNpQixLQUFBMUgsS0FBQTZxQixRQUFBOWlCLGdCQUFBL0gsS0FBQThxQixVQUFBTSxHQUVBZixHQUFBeGdCLGtCQUFBMGMsR0FFQSxDQVdBLG1CQUFBK0UsQ0FBQW5DLEVBQUEvZSxFQUFBbWhCLEVBQUFDLEdBU0FsQixHQUFBNWlCLEtBQUF5aEIsR0FBQXZoQixJQUFBd0MsR0FBQWhDLGVBQUEsSUFDQW1pQixHQUFBN2lCLEtBQUEwQyxHQUFBcEMsSUFBQW1oQixHQUFBOWxCLFlBQ0FtbkIsR0FBQTlpQixLQUFBMUgsS0FBQTZxQixRQUFBN2lCLElBQUFzaUIsSUFFQSxNQUFBbUIsRUFBQSxHQUFBdEMsRUFBQXZmLFdBQUFRLEdBQ0FzaEIsR0FBQTFyQixLQUFBOHFCLFVBQUE3aEIsSUFBQXNoQixJQUNBb0IsRUFBQW5CLEdBQUF2aEIsSUFBQWpKLEtBQUE4cUIsV0FDQW5uQixHQUFBNm1CLEdBQUF2aEIsSUFBQXNoQixJQUNBeGtCLEVBQUF5a0IsR0FBQXJoQixXQUNBa0YsRUFBQS9NLEtBQUE2QyxJQUFBLEVBQUF1bkIsRUFBQUEsR0FDQSxJQUFBRSxFQUFBbE0sRUFBQW1NLEVBQUFDLEVBRUEsR0FBQXpkLEVBQUEsRUFRQSxHQUpBdWQsRUFBQUYsRUFBQS9uQixFQUFBZ29CLEVBQ0FqTSxFQUFBZ00sRUFBQUMsRUFBQWhvQixFQUNBbW9CLEVBQUFMLEVBQUFwZCxFQUVBdWQsR0FBQSxFQUVBLEdBQUFsTSxJQUFBb00sRUFFQSxHQUFBcE0sR0FBQW9NLEVBQUEsQ0FLQSxNQUFBQyxFQUFBLEVBQUExZCxFQUNBdWQsR0FBQUcsRUFDQXJNLEdBQUFxTSxFQUNBRixFQUFBRCxHQUFBQSxFQUFBRixFQUFBaE0sRUFBQSxFQUFBaU0sR0FBQWpNLEdBQUFnTSxFQUFBRSxFQUFBbE0sRUFBQSxFQUFBL2IsR0FBQW9DLENBRUEsTUFJQTJaLEVBQUErTCxFQUNBRyxFQUFBdHFCLEtBQUFhLElBQUEsSUFBQXVwQixFQUFBaE0sRUFBQWlNLElBQ0FFLEdBQUFELEVBQUFBLEVBQUFsTSxHQUFBQSxFQUFBLEVBQUEvYixHQUFBb0MsT0FRQTJaLEdBQUErTCxFQUNBRyxFQUFBdHFCLEtBQUFhLElBQUEsSUFBQXVwQixFQUFBaE0sRUFBQWlNLElBQ0FFLEdBQUFELEVBQUFBLEVBQUFsTSxHQUFBQSxFQUFBLEVBQUEvYixHQUFBb0MsT0FNQTJaLElBQUFvTSxHQUlBRixFQUFBdHFCLEtBQUFhLElBQUEsS0FBQXVwQixFQUFBRCxFQUFBRSxJQUNBak0sRUFBQWtNLEVBQUEsR0FBQUgsRUFBQW5xQixLQUFBWSxJQUFBWixLQUFBYSxLQUFBc3BCLEdBQUE5bkIsR0FBQThuQixHQUNBSSxHQUFBRCxFQUFBQSxFQUFBbE0sR0FBQUEsRUFBQSxFQUFBL2IsR0FBQW9DLEdBRUEyWixHQUFBb00sR0FJQUYsRUFBQSxFQUNBbE0sRUFBQXBlLEtBQUFZLElBQUFaLEtBQUFhLEtBQUFzcEIsR0FBQTluQixHQUFBOG5CLEdBQ0FJLEVBQUFuTSxHQUFBQSxFQUFBLEVBQUEvYixHQUFBb0MsSUFNQTZsQixFQUFBdHFCLEtBQUFhLElBQUEsSUFBQXVwQixFQUFBRCxFQUFBRSxJQUNBak0sRUFBQWtNLEVBQUEsRUFBQUgsRUFBQW5xQixLQUFBWSxJQUFBWixLQUFBYSxLQUFBc3BCLEdBQUE5bkIsR0FBQThuQixHQUNBSSxHQUFBRCxFQUFBQSxFQUFBbE0sR0FBQUEsRUFBQSxFQUFBL2IsR0FBQW9DLFFBVUEyWixFQUFBZ00sRUFBQSxHQUFBRCxFQUFBQSxFQUNBRyxFQUFBdHFCLEtBQUFhLElBQUEsSUFBQXVwQixFQUFBaE0sRUFBQWlNLElBQ0FFLEdBQUFELEVBQUFBLEVBQUFsTSxHQUFBQSxFQUFBLEVBQUEvYixHQUFBb0MsRUFnQkEsT0FaQXdsQixHQUVBQSxFQUFBN2pCLEtBQUExSCxLQUFBNnFCLFFBQUE5aUIsZ0JBQUEvSCxLQUFBOHFCLFVBQUFjLEdBSUFKLEdBRUFBLEVBQUE5akIsS0FBQTRpQixJQUFBdmlCLGdCQUFBd2lCLEdBQUE3SyxHQUlBbU0sQ0FFQSxDQVVBLGVBQUFHLENBQUFwRSxFQUFBaG5CLEdBRUF5cEIsR0FBQW5pQixXQUFBMGYsRUFBQTdjLE9BQUEvSyxLQUFBNnFCLFFBQ0EsTUFBQW9CLEVBQUE1QixHQUFBcGhCLElBQUFqSixLQUFBOHFCLFdBQ0FqcEIsRUFBQXdvQixHQUFBcGhCLElBQUFvaEIsSUFBQTRCLEVBQUFBLEVBQ0FDLEVBQUF0RSxFQUFBckQsT0FBQXFELEVBQUFyRCxPQUVBLEdBQUExaUIsRUFBQXFxQixFQUFBLE9BQUEsS0FFQSxNQUFBQyxFQUFBN3FCLEtBQUE4SCxLQUFBOGlCLEVBQUFycUIsR0FHQXVxQixFQUFBSCxFQUFBRSxFQUdBRSxFQUFBSixFQUFBRSxFQUdBLE9BQUFFLEVBQUEsRUFBQSxLQUtBRCxFQUFBLEVBQUFwc0IsS0FBQWdyQixHQUFBcUIsRUFBQXpyQixHQUdBWixLQUFBZ3JCLEdBQUFvQixFQUFBeHJCLEVBRUEsQ0FRQSxnQkFBQSttQixDQUFBQyxHQUVBLE9BQUE1bkIsS0FBQXFyQixrQkFBQXpELEVBQUE3YyxTQUFBNmMsRUFBQXJELE9BQUFxRCxFQUFBckQsTUFFQSxDQVNBLGVBQUErSCxDQUFBdkUsR0FFQSxNQUFBdGUsRUFBQXNlLEVBQUE1RCxPQUFBbGIsSUFBQWpKLEtBQUE4cUIsV0FFQSxHQUFBLElBQUFyaEIsRUFHQSxPQUFBLElBQUFzZSxFQUFBZSxnQkFBQTlvQixLQUFBNnFCLFFBRUEsRUFNQSxLQUlBLE1BQUFub0IsSUFBQTFDLEtBQUE2cUIsT0FBQTVoQixJQUFBOGUsRUFBQTVELFFBQUE0RCxFQUFBQyxVQUFBdmUsRUFJQSxPQUFBL0csR0FBQSxFQUFBQSxFQUFBLElBRUEsQ0FVQSxjQUFBNnBCLENBQUF4RSxFQUFBbm5CLEdBRUEsTUFBQThCLEVBQUExQyxLQUFBc3NCLGdCQUFBdkUsR0FFQSxPQUFBLE9BQUFybEIsRUFFQSxLQUlBMUMsS0FBQWdyQixHQUFBdG9CLEVBQUE5QixFQUVBLENBUUEsZUFBQWtuQixDQUFBQyxHQUlBLE1BQUF5RSxFQUFBekUsRUFBQWUsZ0JBQUE5b0IsS0FBQTZxQixRQUVBLEdBQUEsSUFBQTJCLEVBRUEsT0FBQSxFQU1BLE9BRkF6RSxFQUFBNUQsT0FBQWxiLElBQUFqSixLQUFBOHFCLFdBRUEwQixFQUFBLENBVUEsQ0FVQSxZQUFBQyxDQUFBdEcsRUFBQXZsQixHQUVBLElBQUE4ckIsRUFBQUMsRUFBQUMsRUFBQUMsRUFBQUMsRUFBQUMsRUFFQSxNQUFBQyxFQUFBLEVBQUFodEIsS0FBQThxQixVQUFBdG9CLEVBQ0F5cUIsRUFBQSxFQUFBanRCLEtBQUE4cUIsVUFBQXJvQixFQUNBeXFCLEVBQUEsRUFBQWx0QixLQUFBOHFCLFVBQUF4UixFQUVBdVIsRUFBQTdxQixLQUFBNnFCLE9BMEJBLE9BeEJBbUMsR0FBQSxHQUVBTixHQUFBdkcsRUFBQWprQixJQUFBTSxFQUFBcW9CLEVBQUFyb0IsR0FBQXdxQixFQUNBTCxHQUFBeEcsRUFBQWhrQixJQUFBSyxFQUFBcW9CLEVBQUFyb0IsR0FBQXdxQixJQUlBTixHQUFBdkcsRUFBQWhrQixJQUFBSyxFQUFBcW9CLEVBQUFyb0IsR0FBQXdxQixFQUNBTCxHQUFBeEcsRUFBQWprQixJQUFBTSxFQUFBcW9CLEVBQUFyb0IsR0FBQXdxQixHQUlBQyxHQUFBLEdBRUFMLEdBQUF6RyxFQUFBamtCLElBQUFPLEVBQUFvb0IsRUFBQXBvQixHQUFBd3FCLEVBQ0FKLEdBQUExRyxFQUFBaGtCLElBQUFNLEVBQUFvb0IsRUFBQXBvQixHQUFBd3FCLElBSUFMLEdBQUF6RyxFQUFBaGtCLElBQUFNLEVBQUFvb0IsRUFBQXBvQixHQUFBd3FCLEVBQ0FKLEdBQUExRyxFQUFBamtCLElBQUFPLEVBQUFvb0IsRUFBQXBvQixHQUFBd3FCLEdBSUFQLEVBQUFHLEdBQUFELEVBQUFELEVBQUEsT0FFQUMsRUFBQUYsR0FBQVMsTUFBQVQsTUFBQUEsRUFBQUUsSUFFQUMsRUFBQUYsR0FBQVEsTUFBQVIsTUFBQUEsRUFBQUUsR0FFQUssR0FBQSxHQUVBSixHQUFBM0csRUFBQWprQixJQUFBb1gsRUFBQXVSLEVBQUF2UixHQUFBNFQsRUFDQUgsR0FBQTVHLEVBQUFoa0IsSUFBQW1YLEVBQUF1UixFQUFBdlIsR0FBQTRULElBSUFKLEdBQUEzRyxFQUFBaGtCLElBQUFtWCxFQUFBdVIsRUFBQXZSLEdBQUE0VCxFQUNBSCxHQUFBNUcsRUFBQWprQixJQUFBb1gsRUFBQXVSLEVBQUF2UixHQUFBNFQsR0FJQVIsRUFBQUssR0FBQUQsRUFBQUgsRUFBQSxPQUVBRyxFQUFBSixHQUFBQSxHQUFBQSxLQUFBQSxFQUFBSSxJQUVBQyxFQUFBSixHQUFBQSxHQUFBQSxLQUFBQSxFQUFBSSxHQUlBSixFQUFBLEVBQUEsS0FFQTNzQixLQUFBZ3JCLEdBQUEwQixHQUFBLEVBQUFBLEVBQUFDLEVBQUEvckIsSUFFQSxDQVFBLGFBQUE4bUIsQ0FBQXZCLEdBRUEsT0FBQSxPQUFBbm1CLEtBQUF5c0IsYUFBQXRHLEVBQUFrRSxHQUVBLENBYUEsaUJBQUErQyxDQUFBdm5CLEVBQUFDLEVBQUFDLEVBQUFzbkIsRUFBQXpzQixHQU1BNnBCLEdBQUF2aUIsV0FBQXBDLEVBQUFELEdBQ0E2a0IsR0FBQXhpQixXQUFBbkMsRUFBQUYsR0FDQThrQixHQUFBcEgsYUFBQWtILEdBQUFDLElBT0EsSUFDQTRDLEVBREFDLEVBQUF2dEIsS0FBQThxQixVQUFBN2hCLElBQUEwaEIsSUFHQSxHQUFBNEMsRUFBQSxFQUFBLENBRUEsR0FBQUYsRUFBQSxPQUFBLEtBQ0FDLEVBQUEsQ0FFQSxLQUFBLE1BQUFDLEVBQUEsR0FPQSxPQUFBLEtBTEFELEdBQUEsRUFDQUMsR0FBQUEsQ0FNQSxDQUVBL0MsR0FBQXRpQixXQUFBbEksS0FBQTZxQixPQUFBaGxCLEdBQ0EsTUFBQTJuQixFQUFBRixFQUFBdHRCLEtBQUE4cUIsVUFBQTdoQixJQUFBeWhCLEdBQUFuSCxhQUFBaUgsR0FBQUUsS0FHQSxHQUFBOEMsRUFBQSxFQUVBLE9BQUEsS0FJQSxNQUFBQyxFQUFBSCxFQUFBdHRCLEtBQUE4cUIsVUFBQTdoQixJQUFBd2hCLEdBQUF2aEIsTUFBQXNoQixLQUdBLEdBQUFpRCxFQUFBLEVBRUEsT0FBQSxLQUtBLEdBQUFELEVBQUFDLEVBQUFGLEVBRUEsT0FBQSxLQUtBLE1BQUFHLEdBQUFKLEVBQUE5QyxHQUFBdmhCLElBQUEwaEIsSUFHQSxPQUFBK0MsRUFBQSxFQUVBLEtBS0ExdEIsS0FBQWdyQixHQUFBMEMsRUFBQUgsRUFBQTNzQixFQUVBLENBUUEsWUFBQStZLENBQUFqTCxHQUtBLE9BSEExTyxLQUFBNnFCLE9BQUFsUixhQUFBakwsR0FDQTFPLEtBQUE4cUIsVUFBQXhILG1CQUFBNVUsR0FFQTFPLElBRUEsQ0FRQSxNQUFBc0ssQ0FBQXlnQixHQUVBLE9BQUFBLEVBQUFGLE9BQUF2Z0IsT0FBQXRLLEtBQUE2cUIsU0FBQUUsRUFBQUQsVUFBQXhnQixPQUFBdEssS0FBQThxQixVQUVBLENBT0EsS0FBQXJqQixHQUVBLE9BQUEsSUFBQXpILEtBQUE0QyxhQUFBOEUsS0FBQTFILEtBRUEsRUMvbEJBLE1BQUEydEIsR0F3QkEsV0FBQS9xQixDQUFBdUksRUFBQUMsRUFBQUMsRUFBQXVpQixFQUFBdGlCLEVBQUFDLEVBQUFDLEVBQUFxaUIsRUFBQXBpQixFQUFBQyxFQUFBQyxFQUFBbWlCLEVBQUFDLEVBQUFDLEVBQUFDLEVBQUFDLEdBU0FQLEdBQUE1bUIsVUFBQW9uQixXQUFBLEVBT0FudUIsS0FBQXlJLFNBQUEsQ0FFQSxFQUFBLEVBQUEsRUFBQSxFQUNBLEVBQUEsRUFBQSxFQUFBLEVBQ0EsRUFBQSxFQUFBLEVBQUEsRUFDQSxFQUFBLEVBQUEsRUFBQSxRQUlBMUksSUFBQW9MLEdBRUFuTCxLQUFBMkcsSUFBQXdFLEVBQUFDLEVBQUFDLEVBQUF1aUIsRUFBQXRpQixFQUFBQyxFQUFBQyxFQUFBcWlCLEVBQUFwaUIsRUFBQUMsRUFBQUMsRUFBQW1pQixFQUFBQyxFQUFBQyxFQUFBQyxFQUFBQyxFQUlBLENBd0JBLEdBQUF2bkIsQ0FBQXdFLEVBQUFDLEVBQUFDLEVBQUF1aUIsRUFBQXRpQixFQUFBQyxFQUFBQyxFQUFBcWlCLEVBQUFwaUIsRUFBQUMsRUFBQUMsRUFBQW1pQixFQUFBQyxFQUFBQyxFQUFBQyxFQUFBQyxHQUVBLE1BQUFyaUIsRUFBQTdMLEtBQUF5SSxTQU9BLE9BTEFvRCxFQUFBLEdBQUFWLEVBQUFVLEVBQUEsR0FBQVQsRUFBQVMsRUFBQSxHQUFBUixFQUFBUSxFQUFBLElBQUEraEIsRUFDQS9oQixFQUFBLEdBQUFQLEVBQUFPLEVBQUEsR0FBQU4sRUFBQU0sRUFBQSxHQUFBTCxFQUFBSyxFQUFBLElBQUFnaUIsRUFDQWhpQixFQUFBLEdBQUFKLEVBQUFJLEVBQUEsR0FBQUgsRUFBQUcsRUFBQSxJQUFBRixFQUFBRSxFQUFBLElBQUFpaUIsRUFDQWppQixFQUFBLEdBQUFraUIsRUFBQWxpQixFQUFBLEdBQUFtaUIsRUFBQW5pQixFQUFBLElBQUFvaUIsRUFBQXBpQixFQUFBLElBQUFxaUIsRUFFQWx1QixJQUVBLENBT0EsUUFBQThMLEdBV0EsT0FUQTlMLEtBQUEyRyxJQUVBLEVBQUEsRUFBQSxFQUFBLEVBQ0EsRUFBQSxFQUFBLEVBQUEsRUFDQSxFQUFBLEVBQUEsRUFBQSxFQUNBLEVBQUEsRUFBQSxFQUFBLEdBSUEzRyxJQUVBLENBT0EsS0FBQXlILEdBRUEsT0FBQSxJQUFBa21CLElBQUFwakIsVUFBQXZLLEtBQUF5SSxTQUVBLENBUUEsSUFBQWYsQ0FBQXBGLEdBRUEsTUFBQXVKLEVBQUE3TCxLQUFBeUksU0FDQXNELEVBQUF6SixFQUFBbUcsU0FPQSxPQUxBb0QsRUFBQSxHQUFBRSxFQUFBLEdBQUFGLEVBQUEsR0FBQUUsRUFBQSxHQUFBRixFQUFBLEdBQUFFLEVBQUEsR0FBQUYsRUFBQSxHQUFBRSxFQUFBLEdBQ0FGLEVBQUEsR0FBQUUsRUFBQSxHQUFBRixFQUFBLEdBQUFFLEVBQUEsR0FBQUYsRUFBQSxHQUFBRSxFQUFBLEdBQUFGLEVBQUEsR0FBQUUsRUFBQSxHQUNBRixFQUFBLEdBQUFFLEVBQUEsR0FBQUYsRUFBQSxHQUFBRSxFQUFBLEdBQUFGLEVBQUEsSUFBQUUsRUFBQSxJQUFBRixFQUFBLElBQUFFLEVBQUEsSUFDQUYsRUFBQSxJQUFBRSxFQUFBLElBQUFGLEVBQUEsSUFBQUUsRUFBQSxJQUFBRixFQUFBLElBQUFFLEVBQUEsSUFBQUYsRUFBQSxJQUFBRSxFQUFBLElBRUEvTCxJQUVBLENBU0EsWUFBQW91QixDQUFBOXJCLEdBRUEsTUFBQXVKLEVBQUE3TCxLQUFBeUksU0FBQXNELEVBQUF6SixFQUFBbUcsU0FNQSxPQUpBb0QsRUFBQSxJQUFBRSxFQUFBLElBQ0FGLEVBQUEsSUFBQUUsRUFBQSxJQUNBRixFQUFBLElBQUFFLEVBQUEsSUFFQS9MLElBRUEsQ0FRQSxjQUFBcXVCLENBQUEvckIsR0FFQSxNQUFBeUosRUFBQXpKLEVBQUFtRyxTQVdBLE9BVEF6SSxLQUFBMkcsSUFFQW9GLEVBQUEsR0FBQUEsRUFBQSxHQUFBQSxFQUFBLEdBQUEsRUFDQUEsRUFBQSxHQUFBQSxFQUFBLEdBQUFBLEVBQUEsR0FBQSxFQUNBQSxFQUFBLEdBQUFBLEVBQUEsR0FBQUEsRUFBQSxHQUFBLEVBQ0EsRUFBQSxFQUFBLEVBQUEsR0FJQS9MLElBRUEsQ0FVQSxZQUFBZ00sQ0FBQUMsRUFBQUMsRUFBQUMsR0FNQSxPQUpBRixFQUFBNFksb0JBQUE3a0IsS0FBQSxHQUNBa00sRUFBQTJZLG9CQUFBN2tCLEtBQUEsR0FDQW1NLEVBQUEwWSxvQkFBQTdrQixLQUFBLEdBRUFBLElBRUEsQ0FVQSxTQUFBc3VCLENBQUFyaUIsRUFBQUMsRUFBQUMsR0FTQSxPQVBBbk0sS0FBQTJHLElBQ0FzRixFQUFBekosRUFBQTBKLEVBQUExSixFQUFBMkosRUFBQTNKLEVBQUEsRUFDQXlKLEVBQUF4SixFQUFBeUosRUFBQXpKLEVBQUEwSixFQUFBMUosRUFBQSxFQUNBd0osRUFBQXFOLEVBQUFwTixFQUFBb04sRUFBQW5OLEVBQUFtTixFQUFBLEVBQ0EsRUFBQSxFQUFBLEVBQUEsR0FHQXRaLElBRUEsQ0FXQSxlQUFBdXVCLENBQUFqc0IsR0FFQSxNQUFBdUosRUFBQTdMLEtBQUF5SSxTQUNBc0QsRUFBQXpKLEVBQUFtRyxTQUVBK2xCLEVBQUEsRUFBQUMsR0FBQTVKLG9CQUFBdmlCLEVBQUEsR0FBQXJCLFNBQ0F5dEIsRUFBQSxFQUFBRCxHQUFBNUosb0JBQUF2aUIsRUFBQSxHQUFBckIsU0FDQTB0QixFQUFBLEVBQUFGLEdBQUE1SixvQkFBQXZpQixFQUFBLEdBQUFyQixTQXNCQSxPQXBCQTRLLEVBQUEsR0FBQUUsRUFBQSxHQUFBeWlCLEVBQ0EzaUIsRUFBQSxHQUFBRSxFQUFBLEdBQUF5aUIsRUFDQTNpQixFQUFBLEdBQUFFLEVBQUEsR0FBQXlpQixFQUNBM2lCLEVBQUEsR0FBQSxFQUVBQSxFQUFBLEdBQUFFLEVBQUEsR0FBQTJpQixFQUNBN2lCLEVBQUEsR0FBQUUsRUFBQSxHQUFBMmlCLEVBQ0E3aUIsRUFBQSxHQUFBRSxFQUFBLEdBQUEyaUIsRUFDQTdpQixFQUFBLEdBQUEsRUFFQUEsRUFBQSxHQUFBRSxFQUFBLEdBQUE0aUIsRUFDQTlpQixFQUFBLEdBQUFFLEVBQUEsR0FBQTRpQixFQUNBOWlCLEVBQUEsSUFBQUUsRUFBQSxJQUFBNGlCLEVBQ0E5aUIsRUFBQSxJQUFBLEVBRUFBLEVBQUEsSUFBQSxFQUNBQSxFQUFBLElBQUEsRUFDQUEsRUFBQSxJQUFBLEVBQ0FBLEVBQUEsSUFBQSxFQUVBN0wsSUFFQSxDQVlBLHFCQUFBNHVCLENBQUF2UCxHQUVBLE1BQUF4VCxFQUFBN0wsS0FBQXlJLFNBRUFqRyxFQUFBNmMsRUFBQTdjLEVBQUFDLEVBQUE0YyxFQUFBNWMsRUFBQTZXLEVBQUErRixFQUFBL0YsRUFDQXpULEVBQUF2RSxLQUFBMkUsSUFBQXpELEdBQUFzRCxFQUFBeEUsS0FBQTRFLElBQUExRCxHQUNBdUQsRUFBQXpFLEtBQUEyRSxJQUFBeEQsR0FBQW9MLEVBQUF2TSxLQUFBNEUsSUFBQXpELEdBQ0ErRixFQUFBbEgsS0FBQTJFLElBQUFxVCxHQUFBeEwsRUFBQXhNLEtBQUE0RSxJQUFBb1QsR0FFQSxHQUFBLFFBQUErRixFQUFBclosTUFBQSxDQUVBLE1BQUF3RyxFQUFBM0csRUFBQTJDLEVBQUFxbUIsRUFBQWhwQixFQUFBaUksRUFBQXJCLEVBQUEzRyxFQUFBMEMsRUFBQXNtQixFQUFBaHBCLEVBQUFnSSxFQUVBakMsRUFBQSxHQUFBOUYsRUFBQXlDLEVBQ0FxRCxFQUFBLElBQUE5RixFQUFBK0gsRUFDQWpDLEVBQUEsR0FBQWdDLEVBRUFoQyxFQUFBLEdBQUFnakIsRUFBQXBpQixFQUFBb0IsRUFDQWhDLEVBQUEsR0FBQVcsRUFBQXNpQixFQUFBamhCLEVBQ0FoQyxFQUFBLElBQUEvRixFQUFBQyxFQUVBOEYsRUFBQSxHQUFBaWpCLEVBQUF0aUIsRUFBQXFCLEVBQ0FoQyxFQUFBLEdBQUFZLEVBQUFvaUIsRUFBQWhoQixFQUNBaEMsRUFBQSxJQUFBaEcsRUFBQUUsQ0FFQSxNQUFBLEdBQUEsUUFBQXNaLEVBQUFyWixNQUFBLENBRUEsTUFBQStvQixFQUFBaHBCLEVBQUF5QyxFQUFBd21CLEVBQUFqcEIsRUFBQStILEVBQUFtaEIsRUFBQXBoQixFQUFBckYsRUFBQTBtQixFQUFBcmhCLEVBQUFDLEVBRUFqQyxFQUFBLEdBQUFrakIsRUFBQUcsRUFBQXBwQixFQUNBK0YsRUFBQSxHQUFBb2pCLEVBQUFucEIsRUFBQWtwQixFQUNBbmpCLEVBQUEsR0FBQWhHLEVBQUFnSSxFQUVBaEMsRUFBQSxHQUFBaEcsRUFBQWlJLEVBQ0FqQyxFQUFBLEdBQUFoRyxFQUFBMkMsRUFDQXFELEVBQUEsSUFBQS9GLEVBRUErRixFQUFBLEdBQUFtakIsRUFBQWxwQixFQUFBbXBCLEVBQ0FwakIsRUFBQSxHQUFBcWpCLEVBQUFILEVBQUFqcEIsRUFDQStGLEVBQUEsSUFBQWhHLEVBQUFFLENBRUEsTUFBQSxHQUFBLFFBQUFzWixFQUFBclosTUFBQSxDQUVBLE1BQUErb0IsRUFBQWhwQixFQUFBeUMsRUFBQXdtQixFQUFBanBCLEVBQUErSCxFQUFBbWhCLEVBQUFwaEIsRUFBQXJGLEVBQUEwbUIsRUFBQXJoQixFQUFBQyxFQUVBakMsRUFBQSxHQUFBa2pCLEVBQUFHLEVBQUFwcEIsRUFDQStGLEVBQUEsSUFBQWhHLEVBQUFpSSxFQUNBakMsRUFBQSxHQUFBb2pCLEVBQUFELEVBQUFscEIsRUFFQStGLEVBQUEsR0FBQW1qQixFQUFBQyxFQUFBbnBCLEVBQ0ErRixFQUFBLEdBQUFoRyxFQUFBMkMsRUFDQXFELEVBQUEsR0FBQXFqQixFQUFBSCxFQUFBanBCLEVBRUErRixFQUFBLElBQUFoRyxFQUFBZ0ksRUFDQWhDLEVBQUEsR0FBQS9GLEVBQ0ErRixFQUFBLElBQUFoRyxFQUFBRSxDQUVBLE1BQUEsR0FBQSxRQUFBc1osRUFBQXJaLE1BQUEsQ0FFQSxNQUFBd0csRUFBQTNHLEVBQUEyQyxFQUFBcW1CLEVBQUFocEIsRUFBQWlJLEVBQUFyQixFQUFBM0csRUFBQTBDLEVBQUFzbUIsRUFBQWhwQixFQUFBZ0ksRUFFQWpDLEVBQUEsR0FBQTlGLEVBQUF5QyxFQUNBcUQsRUFBQSxHQUFBWSxFQUFBb0IsRUFBQWdoQixFQUNBaGpCLEVBQUEsR0FBQVcsRUFBQXFCLEVBQUFpaEIsRUFFQWpqQixFQUFBLEdBQUE5RixFQUFBK0gsRUFDQWpDLEVBQUEsR0FBQWlqQixFQUFBamhCLEVBQUFyQixFQUNBWCxFQUFBLEdBQUFnakIsRUFBQWhoQixFQUFBcEIsRUFFQVosRUFBQSxJQUFBZ0MsRUFDQWhDLEVBQUEsR0FBQS9GLEVBQUFDLEVBQ0E4RixFQUFBLElBQUFoRyxFQUFBRSxDQUVBLE1BQUEsR0FBQSxRQUFBc1osRUFBQXJaLE1BQUEsQ0FFQSxNQUFBbXBCLEVBQUF0cEIsRUFBQUUsRUFBQXFwQixFQUFBdnBCLEVBQUFnSSxFQUFBd2hCLEVBQUF2cEIsRUFBQUMsRUFBQXVwQixFQUFBeHBCLEVBQUErSCxFQUVBaEMsRUFBQSxHQUFBOUYsRUFBQXlDLEVBQ0FxRCxFQUFBLEdBQUF5akIsRUFBQUgsRUFBQXJoQixFQUNBakMsRUFBQSxHQUFBd2pCLEVBQUF2aEIsRUFBQXNoQixFQUVBdmpCLEVBQUEsR0FBQWlDLEVBQ0FqQyxFQUFBLEdBQUFoRyxFQUFBMkMsRUFDQXFELEVBQUEsSUFBQS9GLEVBQUEwQyxFQUVBcUQsRUFBQSxJQUFBZ0MsRUFBQXJGLEVBQ0FxRCxFQUFBLEdBQUF1akIsRUFBQXRoQixFQUFBdWhCLEVBQ0F4akIsRUFBQSxJQUFBc2pCLEVBQUFHLEVBQUF4aEIsQ0FFQSxNQUFBLEdBQUEsUUFBQXVSLEVBQUFyWixNQUFBLENBRUEsTUFBQW1wQixFQUFBdHBCLEVBQUFFLEVBQUFxcEIsRUFBQXZwQixFQUFBZ0ksRUFBQXdoQixFQUFBdnBCLEVBQUFDLEVBQUF1cEIsRUFBQXhwQixFQUFBK0gsRUFFQWhDLEVBQUEsR0FBQTlGLEVBQUF5QyxFQUNBcUQsRUFBQSxJQUFBaUMsRUFDQWpDLEVBQUEsR0FBQWdDLEVBQUFyRixFQUVBcUQsRUFBQSxHQUFBc2pCLEVBQUFyaEIsRUFBQXdoQixFQUNBempCLEVBQUEsR0FBQWhHLEVBQUEyQyxFQUNBcUQsRUFBQSxHQUFBdWpCLEVBQUF0aEIsRUFBQXVoQixFQUVBeGpCLEVBQUEsR0FBQXdqQixFQUFBdmhCLEVBQUFzaEIsRUFDQXZqQixFQUFBLEdBQUEvRixFQUFBMEMsRUFDQXFELEVBQUEsSUFBQXlqQixFQUFBeGhCLEVBQUFxaEIsQ0FFQSxDQWFBLE9BVkF0akIsRUFBQSxHQUFBLEVBQ0FBLEVBQUEsR0FBQSxFQUNBQSxFQUFBLElBQUEsRUFHQUEsRUFBQSxJQUFBLEVBQ0FBLEVBQUEsSUFBQSxFQUNBQSxFQUFBLElBQUEsRUFDQUEsRUFBQSxJQUFBLEVBRUE3TCxJQUVBLENBVUEsMEJBQUF1dkIsQ0FBQTNwQixHQUVBLE9BQUE1RixLQUFBd3ZCLFFBQUFDLEdBQUE3cEIsRUFBQThwQixHQUVBLENBV0EsTUFBQXpFLENBQUEwRSxFQUFBL3VCLEVBQUFndkIsR0FFQSxNQUFBL2pCLEVBQUE3TCxLQUFBeUksU0F5Q0EsT0F2Q0FpVixHQUFBeFYsV0FBQXluQixFQUFBL3VCLEdBRUEsSUFBQThjLEdBQUF2VSxhQUlBdVUsR0FBQXBFLEVBQUEsR0FJQW9FLEdBQUFyYSxZQUNBbWEsR0FBQStGLGFBQUFxTSxFQUFBbFMsSUFFQSxJQUFBRixHQUFBclUsYUFJQSxJQUFBN0gsS0FBQTZDLElBQUF5ckIsRUFBQXRXLEdBRUFvRSxHQUFBbGIsR0FBQSxLQUlBa2IsR0FBQXBFLEdBQUEsS0FJQW9FLEdBQUFyYSxZQUNBbWEsR0FBQStGLGFBQUFxTSxFQUFBbFMsS0FJQUYsR0FBQW5hLFlBQ0FvYSxHQUFBOEYsYUFBQTdGLEdBQUFGLElBRUEzUixFQUFBLEdBQUEyUixHQUFBaGIsRUFBQXFKLEVBQUEsR0FBQTRSLEdBQUFqYixFQUFBcUosRUFBQSxHQUFBNlIsR0FBQWxiLEVBQ0FxSixFQUFBLEdBQUEyUixHQUFBL2EsRUFBQW9KLEVBQUEsR0FBQTRSLEdBQUFoYixFQUFBb0osRUFBQSxHQUFBNlIsR0FBQWpiLEVBQ0FvSixFQUFBLEdBQUEyUixHQUFBbEUsRUFBQXpOLEVBQUEsR0FBQTRSLEdBQUFuRSxFQUFBek4sRUFBQSxJQUFBNlIsR0FBQXBFLEVBRUF0WixJQUVBLENBUUEsUUFBQW1JLENBQUE3RixHQUVBLE9BQUF0QyxLQUFBc00saUJBQUF0TSxLQUFBc0MsRUFFQSxDQVFBLFdBQUFpSyxDQUFBakssR0FFQSxPQUFBdEMsS0FBQXNNLGlCQUFBaEssRUFBQXRDLEtBRUEsQ0FVQSxnQkFBQXNNLENBQUF6RyxFQUFBQyxHQUVBLE1BQUEwRyxFQUFBM0csRUFBQTRDLFNBQ0FnRSxFQUFBM0csRUFBQTJDLFNBQ0FvRCxFQUFBN0wsS0FBQXlJLFNBRUFpRSxFQUFBRixFQUFBLEdBQUFHLEVBQUFILEVBQUEsR0FBQUksRUFBQUosRUFBQSxHQUFBcWpCLEVBQUFyakIsRUFBQSxJQUNBSyxFQUFBTCxFQUFBLEdBQUFNLEVBQUFOLEVBQUEsR0FBQU8sRUFBQVAsRUFBQSxHQUFBc2pCLEVBQUF0akIsRUFBQSxJQUNBUSxFQUFBUixFQUFBLEdBQUFTLEVBQUFULEVBQUEsR0FBQVUsRUFBQVYsRUFBQSxJQUFBdWpCLEVBQUF2akIsRUFBQSxJQUNBd2pCLEVBQUF4akIsRUFBQSxHQUFBeWpCLEVBQUF6akIsRUFBQSxHQUFBMGpCLEVBQUExakIsRUFBQSxJQUFBMmpCLEVBQUEzakIsRUFBQSxJQUVBVyxFQUFBVixFQUFBLEdBQUFXLEVBQUFYLEVBQUEsR0FBQVksRUFBQVosRUFBQSxHQUFBMmpCLEVBQUEzakIsRUFBQSxJQUNBYSxFQUFBYixFQUFBLEdBQUFjLEVBQUFkLEVBQUEsR0FBQWUsRUFBQWYsRUFBQSxHQUFBNGpCLEVBQUE1akIsRUFBQSxJQUNBZ0IsRUFBQWhCLEVBQUEsR0FBQWlCLEVBQUFqQixFQUFBLEdBQUFrQixFQUFBbEIsRUFBQSxJQUFBNmpCLEVBQUE3akIsRUFBQSxJQUNBOGpCLEVBQUE5akIsRUFBQSxHQUFBK2pCLEVBQUEvakIsRUFBQSxHQUFBZ2tCLEVBQUFoa0IsRUFBQSxJQUFBaWtCLEVBQUFqa0IsRUFBQSxJQXNCQSxPQXBCQVosRUFBQSxHQUFBYSxFQUFBUyxFQUFBUixFQUFBVyxFQUFBVixFQUFBYSxFQUFBb2lCLEVBQUFVLEVBQ0Exa0IsRUFBQSxHQUFBYSxFQUFBVSxFQUFBVCxFQUFBWSxFQUFBWCxFQUFBYyxFQUFBbWlCLEVBQUFXLEVBQ0Eza0IsRUFBQSxHQUFBYSxFQUFBVyxFQUFBVixFQUFBYSxFQUFBWixFQUFBZSxFQUFBa2lCLEVBQUFZLEVBQ0E1a0IsRUFBQSxJQUFBYSxFQUFBMGpCLEVBQUF6akIsRUFBQTBqQixFQUFBempCLEVBQUEwakIsRUFBQVQsRUFBQWEsRUFFQTdrQixFQUFBLEdBQUFnQixFQUFBTSxFQUFBTCxFQUFBUSxFQUFBUCxFQUFBVSxFQUFBcWlCLEVBQUFTLEVBQ0Exa0IsRUFBQSxHQUFBZ0IsRUFBQU8sRUFBQU4sRUFBQVMsRUFBQVIsRUFBQVcsRUFBQW9pQixFQUFBVSxFQUNBM2tCLEVBQUEsR0FBQWdCLEVBQUFRLEVBQUFQLEVBQUFVLEVBQUFULEVBQUFZLEVBQUFtaUIsRUFBQVcsRUFDQTVrQixFQUFBLElBQUFnQixFQUFBdWpCLEVBQUF0akIsRUFBQXVqQixFQUFBdGpCLEVBQUF1akIsRUFBQVIsRUFBQVksRUFFQTdrQixFQUFBLEdBQUFtQixFQUFBRyxFQUFBRixFQUFBSyxFQUFBSixFQUFBTyxFQUFBc2lCLEVBQUFRLEVBQ0Exa0IsRUFBQSxHQUFBbUIsRUFBQUksRUFBQUgsRUFBQU0sRUFBQUwsRUFBQVEsRUFBQXFpQixFQUFBUyxFQUNBM2tCLEVBQUEsSUFBQW1CLEVBQUFLLEVBQUFKLEVBQUFPLEVBQUFOLEVBQUFTLEVBQUFvaUIsRUFBQVUsRUFDQTVrQixFQUFBLElBQUFtQixFQUFBb2pCLEVBQUFuakIsRUFBQW9qQixFQUFBbmpCLEVBQUFvakIsRUFBQVAsRUFBQVcsRUFFQTdrQixFQUFBLEdBQUFta0IsRUFBQTdpQixFQUFBOGlCLEVBQUEzaUIsRUFBQTRpQixFQUFBemlCLEVBQUEwaUIsRUFBQUksRUFDQTFrQixFQUFBLEdBQUFta0IsRUFBQTVpQixFQUFBNmlCLEVBQUExaUIsRUFBQTJpQixFQUFBeGlCLEVBQUF5aUIsRUFBQUssRUFDQTNrQixFQUFBLElBQUFta0IsRUFBQTNpQixFQUFBNGlCLEVBQUF6aUIsRUFBQTBpQixFQUFBdmlCLEVBQUF3aUIsRUFBQU0sRUFDQTVrQixFQUFBLElBQUFta0IsRUFBQUksRUFBQUgsRUFBQUksRUFBQUgsRUFBQUksRUFBQUgsRUFBQU8sRUFFQTF3QixJQUVBLENBUUEsY0FBQW9JLENBQUF0RCxHQUVBLE1BQUErRyxFQUFBN0wsS0FBQXlJLFNBT0EsT0FMQW9ELEVBQUEsSUFBQS9HLEVBQUErRyxFQUFBLElBQUEvRyxFQUFBK0csRUFBQSxJQUFBL0csRUFBQStHLEVBQUEsS0FBQS9HLEVBQ0ErRyxFQUFBLElBQUEvRyxFQUFBK0csRUFBQSxJQUFBL0csRUFBQStHLEVBQUEsSUFBQS9HLEVBQUErRyxFQUFBLEtBQUEvRyxFQUNBK0csRUFBQSxJQUFBL0csRUFBQStHLEVBQUEsSUFBQS9HLEVBQUErRyxFQUFBLEtBQUEvRyxFQUFBK0csRUFBQSxLQUFBL0csRUFDQStHLEVBQUEsSUFBQS9HLEVBQUErRyxFQUFBLElBQUEvRyxFQUFBK0csRUFBQSxLQUFBL0csRUFBQStHLEVBQUEsS0FBQS9HLEVBRUE5RSxJQUVBLENBU0EsV0FBQTROLEdBRUEsTUFBQS9CLEVBQUE3TCxLQUFBeUksU0FFQTBDLEVBQUFVLEVBQUEsR0FBQVQsRUFBQVMsRUFBQSxHQUFBUixFQUFBUSxFQUFBLEdBQUEraEIsRUFBQS9oQixFQUFBLElBQ0FQLEVBQUFPLEVBQUEsR0FBQU4sRUFBQU0sRUFBQSxHQUFBTCxFQUFBSyxFQUFBLEdBQUFnaUIsRUFBQWhpQixFQUFBLElBQ0FKLEVBQUFJLEVBQUEsR0FBQUgsRUFBQUcsRUFBQSxHQUFBRixFQUFBRSxFQUFBLElBQUFpaUIsRUFBQWppQixFQUFBLElBS0EsT0FKQUEsRUFBQSxLQU1BK2hCLEVBQUFwaUIsRUFBQUUsRUFDQUwsRUFBQXdpQixFQUFBbmlCLEVBQ0FraUIsRUFBQXJpQixFQUFBSSxFQUNBUCxFQUFBeWlCLEVBQUFsaUIsRUFDQU4sRUFBQUUsRUFBQXVpQixFQUNBMWlCLEVBQUFJLEVBQUFzaUIsR0FYQWppQixFQUFBLEtBY0FWLEVBQUFLLEVBQUFzaUIsRUFDQTNpQixFQUFBMGlCLEVBQUFsaUIsRUFDQWlpQixFQUFBdGlCLEVBQUFLLEVBQ0FOLEVBQUFDLEVBQUF3aUIsRUFDQXppQixFQUFBd2lCLEVBQUFwaUIsRUFDQW1pQixFQUFBcGlCLEVBQUFDLEdBbkJBSSxFQUFBLE1Bc0JBVixFQUFBMGlCLEVBQUFuaUIsRUFDQVAsRUFBQUksRUFBQXVpQixFQUNBRixFQUFBdGlCLEVBQUFJLEVBQ0FOLEVBQUFFLEVBQUF3aUIsRUFDQUYsRUFBQXJpQixFQUFBRSxFQUNBTCxFQUFBeWlCLEVBQUFwaUIsR0EzQkFJLEVBQUEsTUE4QkFSLEVBQUFFLEVBQUFFLEVBQ0FOLEVBQUFLLEVBQUFFLEVBQ0FQLEVBQUFJLEVBQUFJLEVBQ0FOLEVBQUFDLEVBQUFJLEVBQ0FOLEVBQUFFLEVBQUFLLEVBQ0FQLEVBQUFJLEVBQUFDLEVBS0EsQ0FPQSxTQUFBOEMsR0FFQSxNQUFBMUMsRUFBQTdMLEtBQUF5SSxTQUNBLElBQUErRixFQVVBLE9BUkFBLEVBQUEzQyxFQUFBLEdBQUFBLEVBQUEsR0FBQUEsRUFBQSxHQUFBQSxFQUFBLEdBQUEyQyxFQUNBQSxFQUFBM0MsRUFBQSxHQUFBQSxFQUFBLEdBQUFBLEVBQUEsR0FBQUEsRUFBQSxHQUFBMkMsRUFDQUEsRUFBQTNDLEVBQUEsR0FBQUEsRUFBQSxHQUFBQSxFQUFBLEdBQUFBLEVBQUEsR0FBQTJDLEVBRUFBLEVBQUEzQyxFQUFBLEdBQUFBLEVBQUEsR0FBQUEsRUFBQSxJQUFBQSxFQUFBLElBQUEyQyxFQUNBQSxFQUFBM0MsRUFBQSxHQUFBQSxFQUFBLEdBQUFBLEVBQUEsSUFBQUEsRUFBQSxJQUFBMkMsRUFDQUEsRUFBQTNDLEVBQUEsSUFBQUEsRUFBQSxJQUFBQSxFQUFBLElBQUFBLEVBQUEsSUFBQTJDLEVBRUF4TyxJQUVBLENBV0EsV0FBQTJ3QixDQUFBbnVCLEVBQUFDLEVBQUE2VyxHQUVBLE1BQUF6TixFQUFBN0wsS0FBQXlJLFNBZ0JBLE9BZEFqRyxFQUFBeWYsV0FFQXBXLEVBQUEsSUFBQXJKLEVBQUFBLEVBQ0FxSixFQUFBLElBQUFySixFQUFBQyxFQUNBb0osRUFBQSxJQUFBckosRUFBQThXLElBSUF6TixFQUFBLElBQUFySixFQUNBcUosRUFBQSxJQUFBcEosRUFDQW9KLEVBQUEsSUFBQXlOLEdBSUF0WixJQUVBLENBU0EsTUFBQWlPLEdBR0EsTUFBQXBDLEVBQUE3TCxLQUFBeUksU0FFQTBDLEVBQUFVLEVBQUEsR0FBQVAsRUFBQU8sRUFBQSxHQUFBSixFQUFBSSxFQUFBLEdBQUFraUIsRUFBQWxpQixFQUFBLEdBQ0FULEVBQUFTLEVBQUEsR0FBQU4sRUFBQU0sRUFBQSxHQUFBSCxFQUFBRyxFQUFBLEdBQUFtaUIsRUFBQW5pQixFQUFBLEdBQ0FSLEVBQUFRLEVBQUEsR0FBQUwsRUFBQUssRUFBQSxHQUFBRixFQUFBRSxFQUFBLElBQUFvaUIsRUFBQXBpQixFQUFBLElBQ0EraEIsRUFBQS9oQixFQUFBLElBQUFnaUIsRUFBQWhpQixFQUFBLElBQUFpaUIsRUFBQWppQixFQUFBLElBQUFxaUIsRUFBQXJpQixFQUFBLElBRUFxQyxFQUFBMUMsRUFBQXNpQixFQUFBRSxFQUFBSCxFQUFBbGlCLEVBQUFxaUIsRUFBQUgsRUFBQW5pQixFQUFBdWlCLEVBQUExaUIsRUFBQXVpQixFQUFBRyxFQUFBemlCLEVBQUFFLEVBQUF3aUIsRUFBQTNpQixFQUFBSSxFQUFBdWlCLEVBQ0EvZixFQUFBeWYsRUFBQWppQixFQUFBcWlCLEVBQUEzaUIsRUFBQXlpQixFQUFBRSxFQUFBSixFQUFBbGlCLEVBQUF1aUIsRUFBQTdpQixFQUFBMGlCLEVBQUFHLEVBQUE1aUIsRUFBQUssRUFBQXdpQixFQUFBOWlCLEVBQUFPLEVBQUF1aUIsRUFDQTlmLEVBQUEvQyxFQUFBd2lCLEVBQUFHLEVBQUFKLEVBQUFwaUIsRUFBQXdpQixFQUFBSixFQUFBcmlCLEVBQUEwaUIsRUFBQTdpQixFQUFBeWlCLEVBQUFJLEVBQUE1aUIsRUFBQUUsRUFBQTJpQixFQUFBOWlCLEVBQUFJLEVBQUEwaUIsRUFDQTBDLEVBQUFoRCxFQUFBcGlCLEVBQUFFLEVBQUFMLEVBQUF3aUIsRUFBQW5pQixFQUFBa2lCLEVBQUFyaUIsRUFBQUksRUFBQVAsRUFBQXlpQixFQUFBbGlCLEVBQUFOLEVBQUFFLEVBQUF1aUIsRUFBQTFpQixFQUFBSSxFQUFBc2lCLEVBRUF6ZixFQUFBbEQsRUFBQStDLEVBQUE1QyxFQUFBNkMsRUFBQTFDLEVBQUEyQyxFQUFBMmYsRUFBQTZDLEVBRUEsR0FBQSxJQUFBdmlCLEVBQUEsT0FBQXJPLEtBQUEyRyxJQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEdBRUEsTUFBQTJILEVBQUEsRUFBQUQsRUFzQkEsT0FwQkF4QyxFQUFBLEdBQUFxQyxFQUFBSSxFQUNBekMsRUFBQSxJQUFBZ2lCLEVBQUFsaUIsRUFBQW9pQixFQUFBdmlCLEVBQUFzaUIsRUFBQUMsRUFBQUYsRUFBQXBpQixFQUFBd2lCLEVBQUEzaUIsRUFBQXdpQixFQUFBRyxFQUFBemlCLEVBQUFDLEVBQUF5aUIsRUFBQTVpQixFQUFBSyxFQUFBdWlCLEdBQUE1ZixFQUNBekMsRUFBQSxJQUFBTixFQUFBdWlCLEVBQUFDLEVBQUFGLEVBQUFuaUIsRUFBQXFpQixFQUFBRixFQUFBcGlCLEVBQUF1aUIsRUFBQTFpQixFQUFBd2lCLEVBQUFFLEVBQUF6aUIsRUFBQUUsRUFBQXlpQixFQUFBNWlCLEVBQUFJLEVBQUF3aUIsR0FBQTVmLEVBQ0F6QyxFQUFBLElBQUFMLEVBQUFFLEVBQUFxaUIsRUFBQXhpQixFQUFBSSxFQUFBb2lCLEVBQUF2aUIsRUFBQUMsRUFBQXVpQixFQUFBMWlCLEVBQUFLLEVBQUFxaUIsRUFBQXppQixFQUFBRSxFQUFBd2lCLEVBQUEzaUIsRUFBQUksRUFBQXVpQixHQUFBM2YsRUFFQXpDLEVBQUEsR0FBQXNDLEVBQUFHLEVBQ0F6QyxFQUFBLElBQUFSLEVBQUF5aUIsRUFBQUMsRUFBQUgsRUFBQWppQixFQUFBb2lCLEVBQUFILEVBQUFuaUIsRUFBQXdpQixFQUFBOWlCLEVBQUEyaUIsRUFBQUcsRUFBQTVpQixFQUFBSSxFQUFBeWlCLEVBQUEvaUIsRUFBQVEsRUFBQXVpQixHQUFBNWYsRUFDQXpDLEVBQUEsSUFBQStoQixFQUFBbGlCLEVBQUFxaUIsRUFBQTNpQixFQUFBMGlCLEVBQUFDLEVBQUFILEVBQUFuaUIsRUFBQXVpQixFQUFBN2lCLEVBQUEyaUIsRUFBQUUsRUFBQTVpQixFQUFBSyxFQUFBeWlCLEVBQUEvaUIsRUFBQU8sRUFBQXdpQixHQUFBNWYsRUFDQXpDLEVBQUEsSUFBQVQsRUFBQU8sRUFBQW9pQixFQUFBMWlCLEVBQUFLLEVBQUFxaUIsRUFBQTFpQixFQUFBSSxFQUFBdWlCLEVBQUE3aUIsRUFBQVEsRUFBQXFpQixFQUFBNWlCLEVBQUFLLEVBQUF3aUIsRUFBQTlpQixFQUFBTyxFQUFBdWlCLEdBQUEzZixFQUVBekMsRUFBQSxHQUFBdUMsRUFBQUUsRUFDQXpDLEVBQUEsSUFBQStoQixFQUFBcGlCLEVBQUF1aUIsRUFBQTFpQixFQUFBd2lCLEVBQUFFLEVBQUFILEVBQUF0aUIsRUFBQTJpQixFQUFBOWlCLEVBQUEwaUIsRUFBQUksRUFBQTVpQixFQUFBQyxFQUFBNGlCLEVBQUEvaUIsRUFBQUssRUFBQTBpQixHQUFBNWYsRUFDQXpDLEVBQUEsS0FBQVQsRUFBQXlpQixFQUFBRSxFQUFBSCxFQUFBcmlCLEVBQUF3aUIsRUFBQUgsRUFBQXRpQixFQUFBMGlCLEVBQUE3aUIsRUFBQTBpQixFQUFBRyxFQUFBNWlCLEVBQUFFLEVBQUE0aUIsRUFBQS9pQixFQUFBSSxFQUFBMmlCLEdBQUE1ZixFQUNBekMsRUFBQSxLQUFBUixFQUFBRSxFQUFBd2lCLEVBQUEzaUIsRUFBQUksRUFBQXVpQixFQUFBMWlCLEVBQUFDLEVBQUEwaUIsRUFBQTdpQixFQUFBSyxFQUFBd2lCLEVBQUE1aUIsRUFBQUUsRUFBQTJpQixFQUFBOWlCLEVBQUFJLEVBQUEwaUIsR0FBQTNmLEVBRUF6QyxFQUFBLElBQUEra0IsRUFBQXRpQixFQUNBekMsRUFBQSxLQUFBUixFQUFBd2lCLEVBQUFwaUIsRUFBQW1pQixFQUFBcGlCLEVBQUFDLEVBQUFtaUIsRUFBQXRpQixFQUFBSyxFQUFBUixFQUFBMGlCLEVBQUFsaUIsRUFBQU4sRUFBQUMsRUFBQXdpQixFQUFBM2lCLEVBQUFLLEVBQUFzaUIsR0FBQXhmLEVBQ0F6QyxFQUFBLEtBQUEraEIsRUFBQXJpQixFQUFBRSxFQUFBTCxFQUFBeWlCLEVBQUFwaUIsRUFBQW1pQixFQUFBdGlCLEVBQUFJLEVBQUFQLEVBQUEwaUIsRUFBQW5pQixFQUFBTixFQUFBRSxFQUFBd2lCLEVBQUEzaUIsRUFBQUksRUFBQXVpQixHQUFBeGYsRUFDQXpDLEVBQUEsS0FBQVQsRUFBQUksRUFBQUMsRUFBQUosRUFBQUUsRUFBQUUsRUFBQUosRUFBQUMsRUFBQUksRUFBQVAsRUFBQUssRUFBQUUsRUFBQU4sRUFBQUUsRUFBQUssRUFBQVIsRUFBQUksRUFBQUksR0FBQTJDLEVBRUF0TyxJQUVBLENBUUEsS0FBQXFQLENBQUExSCxHQUVBLE1BQUFrRSxFQUFBN0wsS0FBQXlJLFNBQ0FqRyxFQUFBbUYsRUFBQW5GLEVBQUFDLEVBQUFrRixFQUFBbEYsRUFBQTZXLEVBQUEzUixFQUFBMlIsRUFPQSxPQUxBek4sRUFBQSxJQUFBckosRUFBQXFKLEVBQUEsSUFBQXBKLEVBQUFvSixFQUFBLElBQUF5TixFQUNBek4sRUFBQSxJQUFBckosRUFBQXFKLEVBQUEsSUFBQXBKLEVBQUFvSixFQUFBLElBQUF5TixFQUNBek4sRUFBQSxJQUFBckosRUFBQXFKLEVBQUEsSUFBQXBKLEVBQUFvSixFQUFBLEtBQUF5TixFQUNBek4sRUFBQSxJQUFBckosRUFBQXFKLEVBQUEsSUFBQXBKLEVBQUFvSixFQUFBLEtBQUF5TixFQUVBdFosSUFFQSxDQU9BLGlCQUFBbXFCLEdBRUEsTUFBQXRlLEVBQUE3TCxLQUFBeUksU0FFQW9vQixFQUFBaGxCLEVBQUEsR0FBQUEsRUFBQSxHQUFBQSxFQUFBLEdBQUFBLEVBQUEsR0FBQUEsRUFBQSxHQUFBQSxFQUFBLEdBQ0FpbEIsRUFBQWpsQixFQUFBLEdBQUFBLEVBQUEsR0FBQUEsRUFBQSxHQUFBQSxFQUFBLEdBQUFBLEVBQUEsR0FBQUEsRUFBQSxHQUNBa2xCLEVBQUFsbEIsRUFBQSxHQUFBQSxFQUFBLEdBQUFBLEVBQUEsR0FBQUEsRUFBQSxHQUFBQSxFQUFBLElBQUFBLEVBQUEsSUFFQSxPQUFBdkssS0FBQThILEtBQUE5SCxLQUFBYSxJQUFBMHVCLEVBQUFDLEVBQUFDLEdBRUEsQ0FVQSxlQUFBcGhCLENBQUFuTixFQUFBQyxFQUFBNlcsR0EwQkEsT0F4QkE5VyxFQUFBeWYsVUFFQWppQixLQUFBMkcsSUFFQSxFQUFBLEVBQUEsRUFBQW5FLEVBQUFBLEVBQ0EsRUFBQSxFQUFBLEVBQUFBLEVBQUFDLEVBQ0EsRUFBQSxFQUFBLEVBQUFELEVBQUE4VyxFQUNBLEVBQUEsRUFBQSxFQUFBLEdBTUF0WixLQUFBMkcsSUFFQSxFQUFBLEVBQUEsRUFBQW5FLEVBQ0EsRUFBQSxFQUFBLEVBQUFDLEVBQ0EsRUFBQSxFQUFBLEVBQUE2VyxFQUNBLEVBQUEsRUFBQSxFQUFBLEdBTUF0WixJQUVBLENBU0EsYUFBQWd4QixDQUFBdG5CLEdBRUEsTUFBQTNELEVBQUF6RSxLQUFBMkUsSUFBQXlELEdBQUE1RSxFQUFBeEQsS0FBQTRFLElBQUF3RCxHQVdBLE9BVEExSixLQUFBMkcsSUFFQSxFQUFBLEVBQUEsRUFBQSxFQUNBLEVBQUFaLEdBQUFqQixFQUFBLEVBQ0EsRUFBQUEsRUFBQWlCLEVBQUEsRUFDQSxFQUFBLEVBQUEsRUFBQSxHQUlBL0YsSUFFQSxDQVNBLGFBQUFpeEIsQ0FBQXZuQixHQUVBLE1BQUEzRCxFQUFBekUsS0FBQTJFLElBQUF5RCxHQUFBNUUsRUFBQXhELEtBQUE0RSxJQUFBd0QsR0FXQSxPQVRBMUosS0FBQTJHLElBRUFaLEVBQUEsRUFBQWpCLEVBQUEsRUFDQSxFQUFBLEVBQUEsRUFBQSxHQUNBQSxFQUFBLEVBQUFpQixFQUFBLEVBQ0EsRUFBQSxFQUFBLEVBQUEsR0FJQS9GLElBRUEsQ0FTQSxhQUFBa3hCLENBQUF4bkIsR0FFQSxNQUFBM0QsRUFBQXpFLEtBQUEyRSxJQUFBeUQsR0FBQTVFLEVBQUF4RCxLQUFBNEUsSUFBQXdELEdBV0EsT0FUQTFKLEtBQUEyRyxJQUVBWixHQUFBakIsRUFBQSxFQUFBLEVBQ0FBLEVBQUFpQixFQUFBLEVBQUEsRUFDQSxFQUFBLEVBQUEsRUFBQSxFQUNBLEVBQUEsRUFBQSxFQUFBLEdBSUEvRixJQUVBLENBYUEsZ0JBQUFteEIsQ0FBQXRSLEVBQUF2VyxHQUlBLE1BQUF2RCxFQUFBekUsS0FBQTJFLElBQUFxRCxHQUNBeEUsRUFBQXhELEtBQUE0RSxJQUFBb0QsR0FDQTVHLEVBQUEsRUFBQXFELEVBQ0F2RCxFQUFBcWQsRUFBQXJkLEVBQUFDLEVBQUFvZCxFQUFBcGQsRUFBQTZXLEVBQUF1RyxFQUFBdkcsRUFDQXhLLEVBQUFwTSxFQUFBRixFQUFBdU0sRUFBQXJNLEVBQUFELEVBV0EsT0FUQXpDLEtBQUEyRyxJQUVBbUksRUFBQXRNLEVBQUF1RCxFQUFBK0ksRUFBQXJNLEVBQUFxQyxFQUFBd1UsRUFBQXhLLEVBQUF3SyxFQUFBeFUsRUFBQXJDLEVBQUEsRUFDQXFNLEVBQUFyTSxFQUFBcUMsRUFBQXdVLEVBQUF2SyxFQUFBdE0sRUFBQXNELEVBQUFnSixFQUFBdUssRUFBQXhVLEVBQUF0QyxFQUFBLEVBQ0FzTSxFQUFBd0ssRUFBQXhVLEVBQUFyQyxFQUFBc00sRUFBQXVLLEVBQUF4VSxFQUFBdEMsRUFBQUUsRUFBQTRXLEVBQUFBLEVBQUF2VCxFQUFBLEVBQ0EsRUFBQSxFQUFBLEVBQUEsR0FJQS9GLElBRUEsQ0FVQSxTQUFBdVAsQ0FBQS9NLEVBQUFDLEVBQUE2VyxHQVdBLE9BVEF0WixLQUFBMkcsSUFFQW5FLEVBQUEsRUFBQSxFQUFBLEVBQ0EsRUFBQUMsRUFBQSxFQUFBLEVBQ0EsRUFBQSxFQUFBNlcsRUFBQSxFQUNBLEVBQUEsRUFBQSxFQUFBLEdBSUF0WixJQUVBLENBYUEsU0FBQW94QixDQUFBeFcsRUFBQUMsRUFBQXdXLEVBQUF2VyxFQUFBd1csRUFBQUMsR0FXQSxPQVRBdnhCLEtBQUEyRyxJQUVBLEVBQUEwcUIsRUFBQUMsRUFBQSxFQUNBMVcsRUFBQSxFQUFBMlcsRUFBQSxFQUNBMVcsRUFBQUMsRUFBQSxFQUFBLEVBQ0EsRUFBQSxFQUFBLEVBQUEsR0FJQTlhLElBRUEsQ0FXQSxPQUFBd3ZCLENBQUFnQyxFQUFBclMsRUFBQTlQLEdBRUEsTUFBQXhELEVBQUE3TCxLQUFBeUksU0FFQWpHLEVBQUEyYyxFQUFBM0IsR0FBQS9hLEVBQUEwYyxFQUFBMUIsR0FBQW5FLEVBQUE2RixFQUFBekIsR0FBQW5FLEVBQUE0RixFQUFBeEIsR0FDQThULEVBQUFqdkIsRUFBQUEsRUFBQWt2QixFQUFBanZCLEVBQUFBLEVBQUFrdkIsRUFBQXJZLEVBQUFBLEVBQ0FtQixFQUFBalksRUFBQWl2QixFQUFBN1csRUFBQXBZLEVBQUFrdkIsRUFBQTdXLEVBQUFyWSxFQUFBbXZCLEVBQ0FqWCxFQUFBalksRUFBQWl2QixFQUFBNVcsRUFBQXJZLEVBQUFrdkIsRUFBQWhYLEVBQUFyQixFQUFBcVksRUFDQUMsRUFBQXJZLEVBQUFrWSxFQUFBSSxFQUFBdFksRUFBQW1ZLEVBQUFJLEVBQUF2WSxFQUFBb1ksRUFFQTNpQixFQUFBSyxFQUFBN00sRUFBQXlNLEVBQUFJLEVBQUE1TSxFQUFBcWlCLEVBQUF6VixFQUFBaUssRUFzQkEsT0FwQkF6TixFQUFBLElBQUEsR0FBQTZPLEVBQUFDLElBQUEzTCxFQUNBbkQsRUFBQSxJQUFBK08sRUFBQWtYLEdBQUE5aUIsRUFDQW5ELEVBQUEsSUFBQWdQLEVBQUFnWCxHQUFBN2lCLEVBQ0FuRCxFQUFBLEdBQUEsRUFFQUEsRUFBQSxJQUFBK08sRUFBQWtYLEdBQUE3aUIsRUFDQXBELEVBQUEsSUFBQSxHQUFBNE8sRUFBQUUsSUFBQTFMLEVBQ0FwRCxFQUFBLElBQUFpUCxFQUFBOFcsR0FBQTNpQixFQUNBcEQsRUFBQSxHQUFBLEVBRUFBLEVBQUEsSUFBQWdQLEVBQUFnWCxHQUFBL00sRUFDQWpaLEVBQUEsSUFBQWlQLEVBQUE4VyxHQUFBOU0sRUFDQWpaLEVBQUEsS0FBQSxHQUFBNE8sRUFBQUMsSUFBQW9LLEVBQ0FqWixFQUFBLElBQUEsRUFFQUEsRUFBQSxJQUFBMmxCLEVBQUFodkIsRUFDQXFKLEVBQUEsSUFBQTJsQixFQUFBL3VCLEVBQ0FvSixFQUFBLElBQUEybEIsRUFBQWxZLEVBQ0F6TixFQUFBLElBQUEsRUFFQTdMLElBRUEsQ0FlQSxTQUFBK3hCLENBQUFQLEVBQUFyUyxFQUFBOVAsR0FFQSxNQUFBeEQsRUFBQTdMLEtBQUF5SSxTQUVBLElBQUF1RyxFQUFBeWYsR0FBQTluQixJQUFBa0YsRUFBQSxHQUFBQSxFQUFBLEdBQUFBLEVBQUEsSUFBQTVLLFNBQ0EsTUFBQWdPLEVBQUF3ZixHQUFBOW5CLElBQUFrRixFQUFBLEdBQUFBLEVBQUEsR0FBQUEsRUFBQSxJQUFBNUssU0FDQTZqQixFQUFBMkosR0FBQTluQixJQUFBa0YsRUFBQSxHQUFBQSxFQUFBLEdBQUFBLEVBQUEsS0FBQTVLLFNBR0FqQixLQUFBNE4sY0FDQSxJQUFBb0IsR0FBQUEsR0FFQXdpQixFQUFBaHZCLEVBQUFxSixFQUFBLElBQ0EybEIsRUFBQS91QixFQUFBb0osRUFBQSxJQUNBMmxCLEVBQUFsWSxFQUFBek4sRUFBQSxJQUdBbW1CLEdBQUF0cUIsS0FBQTFILE1BRUEsTUFBQWl5QixFQUFBLEVBQUFqakIsRUFDQWtqQixFQUFBLEVBQUFqakIsRUFDQWtqQixFQUFBLEVBQUFyTixFQW9CQSxPQWxCQWtOLEdBQUF2cEIsU0FBQSxJQUFBd3BCLEVBQ0FELEdBQUF2cEIsU0FBQSxJQUFBd3BCLEVBQ0FELEdBQUF2cEIsU0FBQSxJQUFBd3BCLEVBRUFELEdBQUF2cEIsU0FBQSxJQUFBeXBCLEVBQ0FGLEdBQUF2cEIsU0FBQSxJQUFBeXBCLEVBQ0FGLEdBQUF2cEIsU0FBQSxJQUFBeXBCLEVBRUFGLEdBQUF2cEIsU0FBQSxJQUFBMHBCLEVBQ0FILEdBQUF2cEIsU0FBQSxJQUFBMHBCLEVBQ0FILEdBQUF2cEIsU0FBQSxLQUFBMHBCLEVBRUFoVCxFQUFBWSxzQkFBQWlTLElBRUEzaUIsRUFBQTdNLEVBQUF3TSxFQUNBSyxFQUFBNU0sRUFBQXdNLEVBQ0FJLEVBQUFpSyxFQUFBd0wsRUFFQTlrQixJQUVBLENBZUEsZUFBQW95QixDQUFBQyxFQUFBQyxFQUFBQyxFQUFBQyxFQUFBQyxFQUFBQyxFQUFBQyxFQUFBcnpCLEtBRUEsTUFBQXVNLEVBQUE3TCxLQUFBeUksU0FDQWpHLEVBQUEsRUFBQWl3QixHQUFBSCxFQUFBRCxHQUNBNXZCLEVBQUEsRUFBQWd3QixHQUFBRixFQUFBQyxHQUVBM3NCLEdBQUF5c0IsRUFBQUQsSUFBQUMsRUFBQUQsR0FDQXZzQixHQUFBeXNCLEVBQUFDLElBQUFELEVBQUFDLEdBRUEsSUFBQXpzQixFQUFBOEgsRUFFQSxHQUFBOGtCLElBQUFyekIsR0FFQXlHLElBQUEyc0IsRUFBQUQsSUFBQUMsRUFBQUQsR0FDQTVrQixHQUFBLEVBQUE2a0IsRUFBQUQsR0FBQUMsRUFBQUQsT0FFQSxJQUFBRSxJQUFBcHpCLEdBT0EsTUFBQSxJQUFBNkQsTUFBQSwrREFBQXV2QixHQUxBNXNCLEdBQUEyc0IsR0FBQUEsRUFBQUQsR0FDQTVrQixHQUFBNmtCLEVBQUFELEdBQUFDLEVBQUFELEVBTUEsQ0FPQSxPQUxBNW1CLEVBQUEsR0FBQXJKLEVBQUFxSixFQUFBLEdBQUEsRUFBQUEsRUFBQSxHQUFBaEcsRUFBQWdHLEVBQUEsSUFBQSxFQUNBQSxFQUFBLEdBQUEsRUFBQUEsRUFBQSxHQUFBcEosRUFBQW9KLEVBQUEsR0FBQS9GLEVBQUErRixFQUFBLElBQUEsRUFDQUEsRUFBQSxHQUFBLEVBQUFBLEVBQUEsR0FBQSxFQUFBQSxFQUFBLElBQUE5RixFQUFBOEYsRUFBQSxJQUFBZ0MsRUFDQWhDLEVBQUEsR0FBQSxFQUFBQSxFQUFBLEdBQUEsRUFBQUEsRUFBQSxLQUFBLEVBQUFBLEVBQUEsSUFBQSxFQUVBN0wsSUFFQSxDQWVBLGdCQUFBNHlCLENBQUFQLEVBQUFDLEVBQUFDLEVBQUFDLEVBQUFDLEVBQUFDLEVBQUFDLEVBQUFyekIsS0FFQSxNQUFBdU0sRUFBQTdMLEtBQUF5SSxTQUNBOFEsRUFBQSxHQUFBK1ksRUFBQUQsR0FDQXJrQixFQUFBLEdBQUF1a0IsRUFBQUMsR0FDQUssRUFBQSxHQUFBSCxFQUFBRCxHQUVBandCLEdBQUE4dkIsRUFBQUQsR0FBQTlZLEVBQ0E5VyxHQUFBOHZCLEVBQUFDLEdBQUF4a0IsRUFFQSxJQUFBc0wsRUFBQXdaLEVBRUEsR0FBQUgsSUFBQXJ6QixHQUVBZ2EsR0FBQW9aLEVBQUFELEdBQUFJLEVBQ0FDLEdBQUEsRUFBQUQsTUFFQSxJQUFBRixJQUFBcHpCLEdBT0EsTUFBQSxJQUFBNkQsTUFBQSxnRUFBQXV2QixHQUxBclosRUFBQW1aLEVBQUFJLEVBQ0FDLEdBQUEsRUFBQUQsQ0FNQSxDQU9BLE9BTEFobkIsRUFBQSxHQUFBLEVBQUEwTixFQUFBMU4sRUFBQSxHQUFBLEVBQUFBLEVBQUEsR0FBQSxFQUFBQSxFQUFBLEtBQUFySixFQUNBcUosRUFBQSxHQUFBLEVBQUFBLEVBQUEsR0FBQSxFQUFBbUMsRUFBQW5DLEVBQUEsR0FBQSxFQUFBQSxFQUFBLEtBQUFwSixFQUNBb0osRUFBQSxHQUFBLEVBQUFBLEVBQUEsR0FBQSxFQUFBQSxFQUFBLElBQUFpbkIsRUFBQWpuQixFQUFBLEtBQUF5TixFQUNBek4sRUFBQSxHQUFBLEVBQUFBLEVBQUEsR0FBQSxFQUFBQSxFQUFBLElBQUEsRUFBQUEsRUFBQSxJQUFBLEVBRUE3TCxJQUVBLENBUUEsTUFBQXNLLENBQUFzRixHQUVBLE1BQUEvRCxFQUFBN0wsS0FBQXlJLFNBQ0FzRCxFQUFBNkQsRUFBQW5ILFNBRUEsSUFBQSxJQUFBMUgsRUFBQSxFQUFBQSxFQUFBLEdBQUFBLElBRUEsR0FBQThLLEVBQUE5SyxLQUFBZ0wsRUFBQWhMLEdBQUEsT0FBQSxFQUlBLE9BQUEsQ0FFQSxDQVNBLFNBQUF3SixDQUFBMUosRUFBQTJKLEVBQUEsR0FFQSxJQUFBLElBQUF6SixFQUFBLEVBQUFBLEVBQUEsR0FBQUEsSUFFQWYsS0FBQXlJLFNBQUExSCxHQUFBRixFQUFBRSxFQUFBeUosR0FJQSxPQUFBeEssSUFFQSxDQVVBLE9BQUF5SyxDQUFBNUosRUFBQSxHQUFBMkosRUFBQSxHQUVBLE1BQUFxQixFQUFBN0wsS0FBQXlJLFNBc0JBLE9BcEJBNUgsRUFBQTJKLEdBQUFxQixFQUFBLEdBQ0FoTCxFQUFBMkosRUFBQSxHQUFBcUIsRUFBQSxHQUNBaEwsRUFBQTJKLEVBQUEsR0FBQXFCLEVBQUEsR0FDQWhMLEVBQUEySixFQUFBLEdBQUFxQixFQUFBLEdBRUFoTCxFQUFBMkosRUFBQSxHQUFBcUIsRUFBQSxHQUNBaEwsRUFBQTJKLEVBQUEsR0FBQXFCLEVBQUEsR0FDQWhMLEVBQUEySixFQUFBLEdBQUFxQixFQUFBLEdBQ0FoTCxFQUFBMkosRUFBQSxHQUFBcUIsRUFBQSxHQUVBaEwsRUFBQTJKLEVBQUEsR0FBQXFCLEVBQUEsR0FDQWhMLEVBQUEySixFQUFBLEdBQUFxQixFQUFBLEdBQ0FoTCxFQUFBMkosRUFBQSxJQUFBcUIsRUFBQSxJQUNBaEwsRUFBQTJKLEVBQUEsSUFBQXFCLEVBQUEsSUFFQWhMLEVBQUEySixFQUFBLElBQUFxQixFQUFBLElBQ0FoTCxFQUFBMkosRUFBQSxJQUFBcUIsRUFBQSxJQUNBaEwsRUFBQTJKLEVBQUEsSUFBQXFCLEVBQUEsSUFDQWhMLEVBQUEySixFQUFBLElBQUFxQixFQUFBLElBRUFoTCxDQUVBLEVBSUEsTUFBQTR0QixHQUFBLElBQUF6TSxHQUNBZ1EsR0FBQSxJQUFBckUsR0FDQThCLEdBQUEsSUFBQXpOLEdBQUEsRUFBQSxFQUFBLEdBQ0EwTixHQUFBLElBQUExTixHQUFBLEVBQUEsRUFBQSxHQUNBeEUsR0FBQSxJQUFBd0UsR0FDQXZFLEdBQUEsSUFBQXVFLEdBQ0F0RSxHQUFBLElBQUFzRSxHQ3p2Q0ErUSxHQUFBLElBQUFwRixHQUNBcUYsR0FBQSxJQUFBMVYsR0FrQkEsTUFBQTJWLEdBVUEsV0FBQXJ3QixDQUFBSixFQUFBLEVBQUFDLEVBQUEsRUFBQTZXLEVBQUEsRUFBQXRULEVBQUFpdEIsR0FBQUMsZUFTQWx6QixLQUFBbXpCLFNBQUEsRUFFQW56QixLQUFBd2QsR0FBQWhiLEVBQ0F4QyxLQUFBeWQsR0FBQWhiLEVBQ0F6QyxLQUFBMGQsR0FBQXBFLEVBQ0F0WixLQUFBdWYsT0FBQXZaLENBRUEsQ0FRQSxLQUFBeEQsR0FFQSxPQUFBeEMsS0FBQXdkLEVBRUEsQ0FFQSxLQUFBaGIsQ0FBQVAsR0FFQWpDLEtBQUF3ZCxHQUFBdmIsRUFDQWpDLEtBQUFrZixtQkFFQSxDQVFBLEtBQUF6YyxHQUVBLE9BQUF6QyxLQUFBeWQsRUFFQSxDQUVBLEtBQUFoYixDQUFBUixHQUVBakMsS0FBQXlkLEdBQUF4YixFQUNBakMsS0FBQWtmLG1CQUVBLENBUUEsS0FBQTVGLEdBRUEsT0FBQXRaLEtBQUEwZCxFQUVBLENBRUEsS0FBQXBFLENBQUFyWCxHQUVBakMsS0FBQTBkLEdBQUF6YixFQUNBakMsS0FBQWtmLG1CQUVBLENBUUEsU0FBQWxaLEdBRUEsT0FBQWhHLEtBQUF1ZixNQUVBLENBRUEsU0FBQXZaLENBQUEvRCxHQUVBakMsS0FBQXVmLE9BQUF0ZCxFQUNBakMsS0FBQWtmLG1CQUVBLENBV0EsR0FBQXZZLENBQUFuRSxFQUFBQyxFQUFBNlcsRUFBQXRULEVBQUFoRyxLQUFBdWYsUUFTQSxPQVBBdmYsS0FBQXdkLEdBQUFoYixFQUNBeEMsS0FBQXlkLEdBQUFoYixFQUNBekMsS0FBQTBkLEdBQUFwRSxFQUNBdFosS0FBQXVmLE9BQUF2WixFQUVBaEcsS0FBQWtmLG9CQUVBbGYsSUFFQSxDQU9BLEtBQUF5SCxHQUVBLE9BQUEsSUFBQXpILEtBQUE0QyxZQUFBNUMsS0FBQXdkLEdBQUF4ZCxLQUFBeWQsR0FBQXpkLEtBQUEwZCxHQUFBMWQsS0FBQXVmLE9BRUEsQ0FRQSxJQUFBN1gsQ0FBQTJYLEdBU0EsT0FQQXJmLEtBQUF3ZCxHQUFBNkIsRUFBQTdCLEdBQ0F4ZCxLQUFBeWQsR0FBQTRCLEVBQUE1QixHQUNBemQsS0FBQTBkLEdBQUEyQixFQUFBM0IsR0FDQTFkLEtBQUF1ZixPQUFBRixFQUFBRSxPQUVBdmYsS0FBQWtmLG9CQUVBbGYsSUFFQSxDQVVBLHFCQUFBK2YsQ0FBQXpkLEVBQUEwRCxFQUFBaEcsS0FBQXVmLE9BQUFELEdBQUEsR0FFQSxNQUFBelQsRUFBQXZKLEVBQUFtRyxTQUNBdVIsRUFBQW5PLEVBQUEsR0FBQW9PLEVBQUFwTyxFQUFBLEdBQUFxTyxFQUFBck8sRUFBQSxHQUNBc08sRUFBQXRPLEVBQUEsR0FBQXVPLEVBQUF2TyxFQUFBLEdBQUF3TyxFQUFBeE8sRUFBQSxHQUNBeU8sRUFBQXpPLEVBQUEsR0FBQTBPLEVBQUExTyxFQUFBLEdBQUEyTyxFQUFBM08sRUFBQSxJQUVBLE9BQUE3RixHQUVBLElBQUEsTUFFQWhHLEtBQUF5ZCxHQUFBbmMsS0FBQTh4QixLQUFBcHhCLEdBQUFrWSxHQUFBLEVBQUEsSUFFQTVZLEtBQUE2QyxJQUFBK1YsR0FBQSxVQUVBbGEsS0FBQXdkLEdBQUFsYyxLQUFBaUksT0FBQThRLEVBQUFHLEdBQ0F4YSxLQUFBMGQsR0FBQXBjLEtBQUFpSSxPQUFBMFEsRUFBQUQsS0FJQWhhLEtBQUF3ZCxHQUFBbGMsS0FBQWlJLE1BQUFnUixFQUFBSCxHQUNBcGEsS0FBQTBkLEdBQUEsR0FJQSxNQUVBLElBQUEsTUFFQTFkLEtBQUF3ZCxHQUFBbGMsS0FBQTh4QixNQUFBcHhCLEdBQUFxWSxHQUFBLEVBQUEsSUFFQS9ZLEtBQUE2QyxJQUFBa1csR0FBQSxVQUVBcmEsS0FBQXlkLEdBQUFuYyxLQUFBaUksTUFBQTJRLEVBQUFNLEdBQ0F4YSxLQUFBMGQsR0FBQXBjLEtBQUFpSSxNQUFBNFEsRUFBQUMsS0FJQXBhLEtBQUF5ZCxHQUFBbmMsS0FBQWlJLE9BQUErUSxFQUFBTixHQUNBaGEsS0FBQTBkLEdBQUEsR0FJQSxNQUVBLElBQUEsTUFFQTFkLEtBQUF3ZCxHQUFBbGMsS0FBQTh4QixLQUFBcHhCLEdBQUF1WSxHQUFBLEVBQUEsSUFFQWpaLEtBQUE2QyxJQUFBb1csR0FBQSxVQUVBdmEsS0FBQXlkLEdBQUFuYyxLQUFBaUksT0FBQStRLEVBQUFFLEdBQ0F4YSxLQUFBMGQsR0FBQXBjLEtBQUFpSSxPQUFBMFEsRUFBQUcsS0FJQXBhLEtBQUF5ZCxHQUFBLEVBQ0F6ZCxLQUFBMGQsR0FBQXBjLEtBQUFpSSxNQUFBNFEsRUFBQUgsSUFJQSxNQUVBLElBQUEsTUFFQWhhLEtBQUF5ZCxHQUFBbmMsS0FBQTh4QixNQUFBcHhCLEdBQUFzWSxHQUFBLEVBQUEsSUFFQWhaLEtBQUE2QyxJQUFBbVcsR0FBQSxVQUVBdGEsS0FBQXdkLEdBQUFsYyxLQUFBaUksTUFBQWdSLEVBQUFDLEdBQ0F4YSxLQUFBMGQsR0FBQXBjLEtBQUFpSSxNQUFBNFEsRUFBQUgsS0FJQWhhLEtBQUF3ZCxHQUFBLEVBQ0F4ZCxLQUFBMGQsR0FBQXBjLEtBQUFpSSxPQUFBMFEsRUFBQUcsSUFJQSxNQUVBLElBQUEsTUFFQXBhLEtBQUEwZCxHQUFBcGMsS0FBQTh4QixLQUFBcHhCLEdBQUFtWSxHQUFBLEVBQUEsSUFFQTdZLEtBQUE2QyxJQUFBZ1csR0FBQSxVQUVBbmEsS0FBQXdkLEdBQUFsYyxLQUFBaUksT0FBQThRLEVBQUFELEdBQ0FwYSxLQUFBeWQsR0FBQW5jLEtBQUFpSSxPQUFBK1EsRUFBQU4sS0FJQWhhLEtBQUF3ZCxHQUFBLEVBQ0F4ZCxLQUFBeWQsR0FBQW5jLEtBQUFpSSxNQUFBMlEsRUFBQU0sSUFJQSxNQUVBLElBQUEsTUFFQXhhLEtBQUEwZCxHQUFBcGMsS0FBQTh4QixNQUFBcHhCLEdBQUFpWSxHQUFBLEVBQUEsSUFFQTNZLEtBQUE2QyxJQUFBOFYsR0FBQSxVQUVBamEsS0FBQXdkLEdBQUFsYyxLQUFBaUksTUFBQWdSLEVBQUFILEdBQ0FwYSxLQUFBeWQsR0FBQW5jLEtBQUFpSSxNQUFBMlEsRUFBQUYsS0FJQWhhLEtBQUF3ZCxHQUFBbGMsS0FBQWlJLE9BQUE4USxFQUFBRyxHQUNBeGEsS0FBQXlkLEdBQUEsR0FJQSxNQUVBLFFBRUE3VyxRQUFBQyxLQUFBLHVFQUFBYixHQVFBLE9BSkFoRyxLQUFBdWYsT0FBQXZaLEdBRUEsSUFBQXNaLEdBQUF0ZixLQUFBa2Ysb0JBRUFsZixJQUVBLENBVUEsaUJBQUFxekIsQ0FBQXp0QixFQUFBSSxFQUFBc1osR0FJQSxPQUZBeVQsR0FBQXhELDJCQUFBM3BCLEdBRUE1RixLQUFBK2Ysc0JBQUFnVCxHQUFBL3NCLEVBQUFzWixFQUVBLENBU0EsY0FBQWdVLENBQUEzckIsRUFBQTNCLEVBQUFoRyxLQUFBdWYsUUFFQSxPQUFBdmYsS0FBQTJHLElBQUFnQixFQUFBbkYsRUFBQW1GLEVBQUFsRixFQUFBa0YsRUFBQTJSLEVBQUF0VCxFQUVBLENBWUEsT0FBQXV0QixDQUFBQyxHQUlBLE9BRkFSLEdBQUE1VCxhQUFBcGYsTUFFQUEsS0FBQXF6QixrQkFBQUwsR0FBQVEsRUFFQSxDQVFBLE1BQUFscEIsQ0FBQStVLEdBRUEsT0FBQUEsRUFBQTdCLEtBQUF4ZCxLQUFBd2QsSUFBQTZCLEVBQUE1QixLQUFBemQsS0FBQXlkLElBQUE0QixFQUFBM0IsS0FBQTFkLEtBQUEwZCxJQUFBMkIsRUFBQUUsU0FBQXZmLEtBQUF1ZixNQUVBLENBVUEsU0FBQWhWLENBQUExSixHQVNBLE9BUEFiLEtBQUF3ZCxHQUFBM2MsRUFBQSxHQUNBYixLQUFBeWQsR0FBQTVjLEVBQUEsR0FDQWIsS0FBQTBkLEdBQUE3YyxFQUFBLFFBQ0FkLElBQUFjLEVBQUEsS0FBQWIsS0FBQXVmLE9BQUExZSxFQUFBLElBRUFiLEtBQUFrZixvQkFFQWxmLElBRUEsQ0FVQSxPQUFBeUssQ0FBQTVKLEVBQUEsR0FBQTJKLEVBQUEsR0FPQSxPQUxBM0osRUFBQTJKLEdBQUF4SyxLQUFBd2QsR0FDQTNjLEVBQUEySixFQUFBLEdBQUF4SyxLQUFBeWQsR0FDQTVjLEVBQUEySixFQUFBLEdBQUF4SyxLQUFBMGQsR0FDQTdjLEVBQUEySixFQUFBLEdBQUF4SyxLQUFBdWYsT0FFQTFlLENBRUEsQ0FFQSxTQUFBaWhCLENBQUFDLEdBSUEsT0FGQS9oQixLQUFBa2Ysa0JBQUE2QyxFQUVBL2hCLElBRUEsQ0FFQSxpQkFBQWtmLEdBQUEsQ0FFQSxFQUFBbFUsT0FBQUMsa0JBRUFqTCxLQUFBd2QsU0FDQXhkLEtBQUF5ZCxTQUNBemQsS0FBQTBkLFNBQ0ExZCxLQUFBdWYsTUFFQSxFQVdBMFQsR0FBQUMsY0FBQSxNQ2piQSxNQUFBTyxHQU1BLFdBQUE3d0IsR0FRQTVDLEtBQUEwekIsS0FBQSxDQUVBLENBT0EsR0FBQS9zQixDQUFBZ3RCLEdBRUEzekIsS0FBQTB6QixLQUFBLEdBQUFDLElBQUEsQ0FFQSxDQU9BLE1BQUFDLENBQUFELEdBRUEzekIsS0FBQTB6QixNQUFBLEdBQUFDLENBRUEsQ0FLQSxTQUFBRSxHQUVBN3pCLEtBQUEwekIsTUFBQSxDQUVBLENBT0EsTUFBQUksQ0FBQUgsR0FFQTN6QixLQUFBMHpCLE1BQUEsR0FBQUMsQ0FFQSxDQU9BLE9BQUFJLENBQUFKLEdBRUEzekIsS0FBQTB6QixRQUFBLEdBQUFDLEVBRUEsQ0FLQSxVQUFBSyxHQUVBaDBCLEtBQUEwekIsS0FBQSxDQUVBLENBU0EsSUFBQWpmLENBQUF3ZixHQUVBLFNBQUFqMEIsS0FBQTB6QixLQUFBTyxFQUFBUCxLQUVBLENBUUEsU0FBQVEsQ0FBQVAsR0FFQSxTQUFBM3pCLEtBQUEwekIsS0FBQSxHQUFBQyxFQUVBLEVDMUdBLElBQUFRLEdBQUEsRUFFQSxNQUFBQyxHQUFBLElBQUFwUyxHQUNBcVMsR0FBQSxJQUFBL1csR0FDQWdYLEdBQUEsSUFBQTNHLEdBQ0E0RyxHQUFBLElBQUF2UyxHQUVBd1MsR0FBQSxJQUFBeFMsR0FDQXlTLEdBQUEsSUFBQXpTLEdBQ0EwUyxHQUFBLElBQUFwWCxHQUVBcVgsR0FBQSxJQUFBM1MsR0FBQSxFQUFBLEVBQUEsR0FDQTRTLEdBQUEsSUFBQTVTLEdBQUEsRUFBQSxFQUFBLEdBQ0E2UyxHQUFBLElBQUE3UyxHQUFBLEVBQUEsRUFBQSxHQVFBOFMsR0FBQSxDQUFBajFCLEtBQUEsU0FRQWsxQixHQUFBLENBQUFsMUIsS0FBQSxXQVFBbTFCLEdBQUEsQ0FBQW4xQixLQUFBLGFBQUFvMUIsTUFBQSxNQVFBQyxHQUFBLENBQUFyMUIsS0FBQSxlQUFBbzFCLE1BQUEsTUFRQSxNQUFBRSxXQUFBeDFCLEdBS0EsV0FBQWlELEdBRUEyVSxRQVNBdlgsS0FBQW8xQixZQUFBLEVBU0E3aEIsT0FBQW9DLGVBQUEzVixLQUFBLEtBQUEsQ0FBQWlDLE1BQUFreUIsT0FRQW4wQixLQUFBNFYsS0FBQW5VLEtBT0F6QixLQUFBb1EsS0FBQSxHQVNBcFEsS0FBQUgsS0FBQSxXQVFBRyxLQUFBcTFCLE9BQUEsS0FPQXIxQixLQUFBc25CLFNBQUEsR0FVQXRuQixLQUFBNHZCLEdBQUF1RixHQUFBRyxXQUFBN3RCLFFBRUEsTUFBQStwQixFQUFBLElBQUF4UCxHQUNBOVMsRUFBQSxJQUFBK2pCLEdBQ0E5VCxFQUFBLElBQUE3QixHQUNBak8sRUFBQSxJQUFBMlMsR0FBQSxFQUFBLEVBQUEsR0FjQTlTLEVBQUE0UyxXQVpBLFdBRUEzQyxFQUFBQyxhQUFBbFEsR0FBQSxFQUVBLElBU0FpUSxFQUFBMkMsV0FQQSxXQUVBNVMsRUFBQW1rQixrQkFBQWxVLE9BQUFwZixHQUFBLEVBRUEsSUFLQXdULE9BQUFnaUIsaUJBQUF2MUIsS0FBQSxDQVFBd3hCLFNBQUEsQ0FDQWdFLGNBQUEsRUFDQUMsWUFBQSxFQUNBeHpCLE1BQUF1dkIsR0FTQXRpQixTQUFBLENBQ0FzbUIsY0FBQSxFQUNBQyxZQUFBLEVBQ0F4ekIsTUFBQWlOLEdBUUFpUSxXQUFBLENBQ0FxVyxjQUFBLEVBQ0FDLFlBQUEsRUFDQXh6QixNQUFBa2QsR0FTQTlQLE1BQUEsQ0FDQW1tQixjQUFBLEVBQ0FDLFlBQUEsRUFDQXh6QixNQUFBb04sR0FRQXFtQixnQkFBQSxDQUNBenpCLE1BQUEsSUFBQTByQixJQVFBZ0ksYUFBQSxDQUNBMXpCLE1BQUEsSUFBQWlKLE1BU0FsTCxLQUFBNFAsT0FBQSxJQUFBK2QsR0FRQTN0QixLQUFBcWpCLFlBQUEsSUFBQXNLLEdBV0EzdEIsS0FBQThYLGlCQUFBcWQsR0FBQVMsMkJBV0E1MUIsS0FBQTYxQixzQkFBQVYsR0FBQVcsaUNBU0E5MUIsS0FBQSsxQix3QkFBQSxFQVNBLzFCLEtBQUFpMEIsT0FBQSxJQUFBUixHQVFBenpCLEtBQUFnMkIsU0FBQSxFQVFBaDJCLEtBQUFpMkIsWUFBQSxFQVFBajJCLEtBQUFrMkIsZUFBQSxFQVFBbDJCLEtBQUFtMkIsZUFBQSxFQVlBbjJCLEtBQUFvMkIsWUFBQSxFQU9BcDJCLEtBQUFxMkIsV0FBQSxHQWFBcjJCLEtBQUFzMkIseUJBQUF2MkIsRUFVQUMsS0FBQXUyQiw0QkFBQXgyQixFQVFBQyxLQUFBbVksU0FBQSxDQUFBLENBRUEsQ0FhQSxjQUFBcWUsR0FBQSxDQWFBLGFBQUFDLEdBQUEsQ0FZQSxjQUFBQyxHQUFBLENBWUEsYUFBQUMsR0FBQSxDQVFBLFlBQUFoZCxDQUFBL0osR0FFQTVQLEtBQUE4WCxrQkFBQTlYLEtBQUF3WSxlQUVBeFksS0FBQTRQLE9BQUFyRCxZQUFBcUQsR0FFQTVQLEtBQUE0UCxPQUFBbWlCLFVBQUEveEIsS0FBQXd4QixTQUFBeHhCLEtBQUFtZixXQUFBbmYsS0FBQXFQLE1BRUEsQ0FRQSxlQUFBK1MsQ0FBQXhjLEdBSUEsT0FGQTVGLEtBQUFtZixXQUFBNVMsWUFBQTNHLEdBRUE1RixJQUVBLENBUUEsd0JBQUE0MkIsQ0FBQS9XLEVBQUF2VyxHQUlBdEosS0FBQW1mLFdBQUFTLGlCQUFBQyxFQUFBdlcsRUFFQSxDQU9BLG9CQUFBdXRCLENBQUF4WCxHQUVBcmYsS0FBQW1mLFdBQUFDLGFBQUFDLEdBQUEsRUFFQSxDQVFBLHFCQUFBeVgsQ0FBQXgwQixHQUlBdEMsS0FBQW1mLFdBQUFZLHNCQUFBemQsRUFFQSxDQU9BLHlCQUFBeTBCLENBQUFueEIsR0FJQTVGLEtBQUFtZixXQUFBelgsS0FBQTlCLEVBRUEsQ0FTQSxZQUFBb3hCLENBQUFuWCxFQUFBdlcsR0FTQSxPQUpBK3FCLEdBQUF6VSxpQkFBQUMsRUFBQXZXLEdBRUF0SixLQUFBbWYsV0FBQWhYLFNBQUFrc0IsSUFFQXIwQixJQUVBLENBU0EsaUJBQUFpM0IsQ0FBQXBYLEVBQUF2VyxHQVVBLE9BSkErcUIsR0FBQXpVLGlCQUFBQyxFQUFBdlcsR0FFQXRKLEtBQUFtZixXQUFBNVMsWUFBQThuQixJQUVBcjBCLElBRUEsQ0FRQSxPQUFBazNCLENBQUE1dEIsR0FFQSxPQUFBdEosS0FBQWczQixhQUFBckMsR0FBQXJyQixFQUVBLENBUUEsT0FBQTZ0QixDQUFBN3RCLEdBRUEsT0FBQXRKLEtBQUFnM0IsYUFBQXBDLEdBQUF0ckIsRUFFQSxDQVFBLE9BQUE4dEIsQ0FBQTl0QixHQUVBLE9BQUF0SixLQUFBZzNCLGFBQUFuQyxHQUFBdnJCLEVBRUEsQ0FTQSxlQUFBK3RCLENBQUF4WCxFQUFBeVgsR0FTQSxPQUpBbEQsR0FBQTFzQixLQUFBbVksR0FBQXVDLGdCQUFBcGlCLEtBQUFtZixZQUVBbmYsS0FBQXd4QixTQUFBNXBCLElBQUF3c0IsR0FBQWhzQixlQUFBa3ZCLElBRUF0M0IsSUFFQSxDQVFBLFVBQUF1M0IsQ0FBQUQsR0FFQSxPQUFBdDNCLEtBQUFxM0IsZ0JBQUExQyxHQUFBMkMsRUFFQSxDQVFBLFVBQUFFLENBQUFGLEdBRUEsT0FBQXQzQixLQUFBcTNCLGdCQUFBekMsR0FBQTBDLEVBRUEsQ0FRQSxVQUFBRyxDQUFBSCxHQUVBLE9BQUF0M0IsS0FBQXEzQixnQkFBQXhDLEdBQUF5QyxFQUVBLENBUUEsWUFBQUksQ0FBQWpSLEdBSUEsT0FGQXptQixLQUFBMm1CLG1CQUFBLEdBQUEsR0FFQUYsRUFBQTlNLGFBQUEzWixLQUFBcWpCLFlBRUEsQ0FRQSxZQUFBc1UsQ0FBQWxSLEdBSUEsT0FGQXptQixLQUFBMm1CLG1CQUFBLEdBQUEsR0FFQUYsRUFBQTlNLGFBQUEyYSxHQUFBNXNCLEtBQUExSCxLQUFBcWpCLGFBQUFwVixTQUVBLENBV0EsTUFBQWdkLENBQUF6b0IsRUFBQUMsRUFBQTZXLEdBSUE5VyxFQUFBeWYsVUFFQXNTLEdBQUE3c0IsS0FBQWxGLEdBSUEreEIsR0FBQTV0QixJQUFBbkUsRUFBQUMsRUFBQTZXLEdBSUEsTUFBQStiLEVBQUFyMUIsS0FBQXExQixPQUVBcjFCLEtBQUEybUIsbUJBQUEsR0FBQSxHQUVBNk4sR0FBQXpaLHNCQUFBL2EsS0FBQXFqQixhQUVBcmpCLEtBQUE0M0IsVUFBQTUzQixLQUFBNjNCLFFBRUF2RCxHQUFBckosT0FBQXVKLEdBQUFELEdBQUF2MEIsS0FBQTR2QixJQUlBMEUsR0FBQXJKLE9BQUFzSixHQUFBQyxHQUFBeDBCLEtBQUE0dkIsSUFJQTV2QixLQUFBbWYsV0FBQVksc0JBQUF1VSxJQUVBZSxJQUVBZixHQUFBL0YsZ0JBQUE4RyxFQUFBaFMsYUFDQWdSLEdBQUF0VSxzQkFBQXVVLElBQ0F0MEIsS0FBQW1mLFdBQUE1UyxZQUFBOG5CLEdBQUFwbUIsVUFJQSxDQVlBLEdBQUFyRyxDQUFBb2UsR0FFQSxHQUFBOFIsVUFBQTcyQixPQUFBLEVBQUEsQ0FFQSxJQUFBLElBQUFGLEVBQUEsRUFBQUEsRUFBQSsyQixVQUFBNzJCLE9BQUFGLElBRUFmLEtBQUE0SCxJQUFBa3dCLFVBQUEvMkIsSUFJQSxPQUFBZixJQUVBLENBRUEsT0FBQWdtQixJQUFBaG1CLE1BRUE0RyxRQUFBbXhCLE1BQUEsa0VBQUEvUixHQUNBaG1CLE9BSUFnbUIsR0FBQUEsRUFBQW9QLFlBRUFwUCxFQUFBZ1MsbUJBQ0FoUyxFQUFBcVAsT0FBQXIxQixLQUNBQSxLQUFBc25CLFNBQUFsbkIsS0FBQTRsQixHQUVBQSxFQUFBdGxCLGNBQUFvMEIsSUFFQUUsR0FBQUMsTUFBQWpQLEVBQ0FobUIsS0FBQVUsY0FBQXMwQixJQUNBQSxHQUFBQyxNQUFBLE1BSUFydUIsUUFBQW14QixNQUFBLGdFQUFBL1IsR0FJQWhtQixLQUVBLENBV0EsTUFBQWk0QixDQUFBalMsR0FFQSxHQUFBOFIsVUFBQTcyQixPQUFBLEVBQUEsQ0FFQSxJQUFBLElBQUFGLEVBQUEsRUFBQUEsRUFBQSsyQixVQUFBNzJCLE9BQUFGLElBRUFmLEtBQUFpNEIsT0FBQUgsVUFBQS8yQixJQUlBLE9BQUFmLElBRUEsQ0FFQSxNQUFBUSxFQUFBUixLQUFBc25CLFNBQUFubkIsUUFBQTZsQixHQWVBLE9BYkEsSUFBQXhsQixJQUVBd2xCLEVBQUFxUCxPQUFBLEtBQ0FyMUIsS0FBQXNuQixTQUFBN21CLE9BQUFELEVBQUEsR0FFQXdsQixFQUFBdGxCLGNBQUFxMEIsSUFFQUcsR0FBQUQsTUFBQWpQLEVBQ0FobUIsS0FBQVUsY0FBQXcwQixJQUNBQSxHQUFBRCxNQUFBLE1BSUFqMUIsSUFFQSxDQVNBLGdCQUFBZzRCLEdBRUEsTUFBQTNDLEVBQUFyMUIsS0FBQXExQixPQVFBLE9BTkEsT0FBQUEsR0FFQUEsRUFBQTRDLE9BQUFqNEIsTUFJQUEsSUFFQSxDQVNBLEtBQUErYyxHQUVBLE9BQUEvYyxLQUFBaTRCLFVBQUFqNEIsS0FBQXNuQixTQUVBLENBV0EsTUFBQTRRLENBQUFsUyxHQWdDQSxPQTFCQWhtQixLQUFBMm1CLG1CQUFBLEdBQUEsR0FFQTJOLEdBQUE1c0IsS0FBQTFILEtBQUFxakIsYUFBQXBWLFNBRUEsT0FBQStYLEVBQUFxUCxTQUVBclAsRUFBQXFQLE9BQUExTyxtQkFBQSxHQUFBLEdBRUEyTixHQUFBbnNCLFNBQUE2ZCxFQUFBcVAsT0FBQWhTLGNBSUEyQyxFQUFBck0sYUFBQTJhLElBRUF0TyxFQUFBZ1MsbUJBQ0FoUyxFQUFBcVAsT0FBQXIxQixLQUNBQSxLQUFBc25CLFNBQUFsbkIsS0FBQTRsQixHQUVBQSxFQUFBVyxtQkFBQSxHQUFBLEdBRUFYLEVBQUF0bEIsY0FBQW8wQixJQUVBRSxHQUFBQyxNQUFBalAsRUFDQWhtQixLQUFBVSxjQUFBczBCLElBQ0FBLEdBQUFDLE1BQUEsS0FFQWoxQixJQUVBLENBU0EsYUFBQW00QixDQUFBQyxHQUVBLE9BQUFwNEIsS0FBQXE0QixvQkFBQSxLQUFBRCxFQUVBLENBU0EsZUFBQUUsQ0FBQWxvQixHQUVBLE9BQUFwUSxLQUFBcTRCLG9CQUFBLE9BQUFqb0IsRUFFQSxDQVVBLG1CQUFBaW9CLENBQUFqb0IsRUFBQW5PLEdBRUEsR0FBQWpDLEtBQUFvUSxLQUFBbk8sRUFBQSxPQUFBakMsS0FFQSxJQUFBLElBQUFlLEVBQUEsRUFBQUMsRUFBQWhCLEtBQUFzbkIsU0FBQXJtQixPQUFBRixFQUFBQyxFQUFBRCxJQUFBLENBRUEsTUFDQWlsQixFQURBaG1CLEtBQUFzbkIsU0FBQXZtQixHQUNBczNCLG9CQUFBam9CLEVBQUFuTyxHQUVBLFFBQUFsQyxJQUFBaW1CLEVBRUEsT0FBQUEsQ0FJQSxDQUlBLENBV0Esb0JBQUF1UyxDQUFBbm9CLEVBQUFuTyxFQUFBdTJCLEVBQUEsSUFFQXg0QixLQUFBb1EsS0FBQW5PLEdBQUF1MkIsRUFBQXA0QixLQUFBSixNQUVBLE1BQUFzbkIsRUFBQXRuQixLQUFBc25CLFNBRUEsSUFBQSxJQUFBdm1CLEVBQUEsRUFBQUMsRUFBQXNtQixFQUFBcm1CLE9BQUFGLEVBQUFDLEVBQUFELElBRUF1bUIsRUFBQXZtQixHQUFBdzNCLHFCQUFBbm9CLEVBQUFuTyxFQUFBdTJCLEdBSUEsT0FBQUEsQ0FFQSxDQVFBLGdCQUFBQyxDQUFBNzNCLEdBSUEsT0FGQVosS0FBQTJtQixtQkFBQSxHQUFBLEdBRUEvbEIsRUFBQW1hLHNCQUFBL2EsS0FBQXFqQixZQUVBLENBUUEsa0JBQUFxVixDQUFBOTNCLEdBTUEsT0FKQVosS0FBQTJtQixtQkFBQSxHQUFBLEdBRUEzbUIsS0FBQXFqQixZQUFBME8sVUFBQXlDLEdBQUE1ekIsRUFBQTZ6QixJQUVBN3pCLENBRUEsQ0FRQSxhQUFBKzNCLENBQUEvM0IsR0FNQSxPQUpBWixLQUFBMm1CLG1CQUFBLEdBQUEsR0FFQTNtQixLQUFBcWpCLFlBQUEwTyxVQUFBeUMsR0FBQUUsR0FBQTl6QixHQUVBQSxDQUVBLENBUUEsaUJBQUFnNEIsQ0FBQWg0QixHQUVBWixLQUFBMm1CLG1CQUFBLEdBQUEsR0FFQSxNQUFBbmUsRUFBQXhJLEtBQUFxakIsWUFBQTVhLFNBRUEsT0FBQTdILEVBQUErRixJQUFBNkIsRUFBQSxHQUFBQSxFQUFBLEdBQUFBLEVBQUEsS0FBQW5GLFdBRUEsQ0FXQSxPQUFBdzFCLEdBQUEsQ0FTQSxRQUFBQyxDQUFBL1csR0FFQUEsRUFBQS9oQixNQUVBLE1BQUFzbkIsRUFBQXRuQixLQUFBc25CLFNBRUEsSUFBQSxJQUFBdm1CLEVBQUEsRUFBQUMsRUFBQXNtQixFQUFBcm1CLE9BQUFGLEVBQUFDLEVBQUFELElBRUF1bUIsRUFBQXZtQixHQUFBKzNCLFNBQUEvVyxFQUlBLENBVUEsZUFBQWdYLENBQUFoWCxHQUVBLElBQUEsSUFBQS9oQixLQUFBZzJCLFFBQUEsT0FFQWpVLEVBQUEvaEIsTUFFQSxNQUFBc25CLEVBQUF0bkIsS0FBQXNuQixTQUVBLElBQUEsSUFBQXZtQixFQUFBLEVBQUFDLEVBQUFzbUIsRUFBQXJtQixPQUFBRixFQUFBQyxFQUFBRCxJQUVBdW1CLEVBQUF2bUIsR0FBQWc0QixnQkFBQWhYLEVBSUEsQ0FTQSxpQkFBQWlYLENBQUFqWCxHQUVBLE1BQUFzVCxFQUFBcjFCLEtBQUFxMUIsT0FFQSxPQUFBQSxJQUVBdFQsRUFBQXNULEdBRUFBLEVBQUEyRCxrQkFBQWpYLEdBSUEsQ0FNQSxZQUFBdkosR0FFQXhZLEtBQUE0UCxPQUFBNGYsUUFBQXh2QixLQUFBd3hCLFNBQUF4eEIsS0FBQW1mLFdBQUFuZixLQUFBcVAsT0FFQXJQLEtBQUErMUIsd0JBQUEsQ0FFQSxDQWFBLGlCQUFBa0QsQ0FBQUMsR0FFQWw1QixLQUFBOFgsa0JBQUE5WCxLQUFBd1ksZ0JBRUF4WSxLQUFBKzFCLHdCQUFBbUQsTUFFQSxJQUFBbDVCLEtBQUE2MUIsd0JBRUEsT0FBQTcxQixLQUFBcTFCLE9BRUFyMUIsS0FBQXFqQixZQUFBM2IsS0FBQTFILEtBQUE0UCxRQUlBNVAsS0FBQXFqQixZQUFBL1csaUJBQUF0TSxLQUFBcTFCLE9BQUFoUyxZQUFBcmpCLEtBQUE0UCxTQU1BNVAsS0FBQSsxQix3QkFBQSxFQUVBbUQsR0FBQSxHQU1BLE1BQUE1UixFQUFBdG5CLEtBQUFzbkIsU0FFQSxJQUFBLElBQUF2bUIsRUFBQSxFQUFBQyxFQUFBc21CLEVBQUFybUIsT0FBQUYsRUFBQUMsRUFBQUQsSUFBQSxDQUVBdW1CLEVBQUF2bUIsR0FFQWs0QixrQkFBQUMsRUFFQSxDQUVBLENBU0EsaUJBQUF2UyxDQUFBd1MsRUFBQUMsR0FFQSxNQUFBL0QsRUFBQXIxQixLQUFBcTFCLE9BMEJBLElBeEJBLElBQUE4RCxHQUFBLE9BQUE5RCxHQUVBQSxFQUFBMU8sbUJBQUEsR0FBQSxHQUlBM21CLEtBQUE4WCxrQkFBQTlYLEtBQUF3WSxnQkFFQSxJQUFBeFksS0FBQTYxQix3QkFFQSxPQUFBNzFCLEtBQUFxMUIsT0FFQXIxQixLQUFBcWpCLFlBQUEzYixLQUFBMUgsS0FBQTRQLFFBSUE1UCxLQUFBcWpCLFlBQUEvVyxpQkFBQXRNLEtBQUFxMUIsT0FBQWhTLFlBQUFyakIsS0FBQTRQLFVBUUEsSUFBQXdwQixFQUFBLENBRUEsTUFBQTlSLEVBQUF0bkIsS0FBQXNuQixTQUVBLElBQUEsSUFBQXZtQixFQUFBLEVBQUFDLEVBQUFzbUIsRUFBQXJtQixPQUFBRixFQUFBQyxFQUFBRCxJQUFBLENBRUF1bUIsRUFBQXZtQixHQUVBNGxCLG1CQUFBLEdBQUEsRUFFQSxDQUVBLENBRUEsQ0FTQSxNQUFBM1EsQ0FBQUMsR0FHQSxNQUFBQyxPQUFBblcsSUFBQWtXLEdBQUEsaUJBQUFBLEVBRUFHLEVBQUEsQ0FBQSxFQUtBRixJQUdBRCxFQUFBLENBQ0FvakIsV0FBQSxDQUFBLEVBQ0FDLFVBQUEsQ0FBQSxFQUNBMWdCLFNBQUEsQ0FBQSxFQUNBekMsT0FBQSxDQUFBLEVBQ0FvakIsT0FBQSxDQUFBLEVBQ0FDLFVBQUEsQ0FBQSxFQUNBbkQsV0FBQSxDQUFBLEVBQ0FvRCxNQUFBLENBQUEsR0FHQXJqQixFQUFBeUMsU0FBQSxDQUNBL0MsUUFBQSxJQUNBalcsS0FBQSxTQUNBaVosVUFBQSxvQkFPQSxNQUFBa04sRUFBQSxDQUFBLEVBb0ZBLFNBQUEwVCxFQUFBQyxFQUFBQyxHQVFBLFlBTkE3NUIsSUFBQTQ1QixFQUFBQyxFQUFBaGtCLFFBRUErakIsRUFBQUMsRUFBQWhrQixNQUFBZ2tCLEVBQUE1akIsT0FBQUMsSUFJQTJqQixFQUFBaGtCLElBRUEsQ0FFQSxHQTlGQW9RLEVBQUFwUSxLQUFBNVYsS0FBQTRWLEtBQ0FvUSxFQUFBbm1CLEtBQUFHLEtBQUFILEtBRUEsS0FBQUcsS0FBQW9RLE9BQUE0VixFQUFBNVYsS0FBQXBRLEtBQUFvUSxPQUNBLElBQUFwUSxLQUFBaTJCLGFBQUFqUSxFQUFBaVEsWUFBQSxJQUNBLElBQUFqMkIsS0FBQWsyQixnQkFBQWxRLEVBQUFrUSxlQUFBLElBQ0EsSUFBQWwyQixLQUFBZzJCLFVBQUFoUSxFQUFBZ1EsU0FBQSxJQUNBLElBQUFoMkIsS0FBQW0yQixnQkFBQW5RLEVBQUFtUSxlQUFBLEdBQ0EsSUFBQW4yQixLQUFBbzJCLGNBQUFwUSxFQUFBb1EsWUFBQXAyQixLQUFBbzJCLGFBQ0E3aUIsT0FBQXlGLEtBQUFoWixLQUFBbVksVUFBQWxYLE9BQUEsSUFBQStrQixFQUFBN04sU0FBQW5ZLEtBQUFtWSxVQUVBNk4sRUFBQWlPLE9BQUFqMEIsS0FBQWkwQixPQUFBUCxLQUNBMU4sRUFBQXBXLE9BQUE1UCxLQUFBNFAsT0FBQW5GLFVBQ0F1YixFQUFBNEosR0FBQTV2QixLQUFBNHZCLEdBQUFubEIsV0FFQSxJQUFBekssS0FBQThYLG1CQUFBa08sRUFBQWxPLGtCQUFBLEdBSUE5WCxLQUFBK21CLGtCQUVBZixFQUFBbm1CLEtBQUEsZ0JBQ0FtbUIsRUFBQWpLLE1BQUEvYixLQUFBK2IsTUFDQWlLLEVBQUE2VCxlQUFBNzVCLEtBQUE2NUIsZUFBQTdqQixTQUNBLE9BQUFoVyxLQUFBODVCLGdCQUFBOVQsRUFBQThULGNBQUE5NUIsS0FBQTg1QixjQUFBOWpCLFdBSUFoVyxLQUFBKzVCLGdCQUVBL1QsRUFBQW5tQixLQUFBLGNBQ0FtbUIsRUFBQWdVLHVCQUFBaDZCLEtBQUFnNkIsdUJBQ0FoVSxFQUFBaVUsWUFBQWo2QixLQUFBaTZCLFlBRUFqVSxFQUFBa1UsV0FBQWw2QixLQUFBbTZCLFlBQ0FuVSxFQUFBb1UsZUFBQXA2QixLQUFBcTZCLGdCQUVBclUsRUFBQXNVLFdBQUF0NkIsS0FBQXU2QixZQUNBdlUsRUFBQXdVLE9BQUF4NkIsS0FBQXk2QixRQUNBelUsRUFBQTBVLE9BQUExNkIsS0FBQTI2QixRQUFBQyxLQUFBQyxJQUFBLENBQ0FDLGVBQUFELEVBQUFDLGVBQ0FDLE9BQUFGLEVBQUExVSxJQUFBamtCLElBQUF1SSxVQUNBdXdCLE9BQUFILEVBQUExVSxJQUFBaGtCLElBQUFzSSxVQUVBd3dCLGtCQUFBSixFQUFBSSxrQkFDQUMsYUFBQUwsRUFBQWpULE9BQUFyRCxPQUNBNFcsYUFBQU4sRUFBQWpULE9BQUE3YyxPQUFBTixjQUdBdWIsRUFBQW9WLGlCQUFBcDdCLEtBQUFxN0Isa0JBQ0FyVixFQUFBc1YsZUFBQXQ3QixLQUFBdTdCLGdCQUNBdlYsRUFBQXdWLGNBQUF4N0IsS0FBQXk3QixlQUVBelYsRUFBQTBWLG9CQUFBMTdCLEtBQUEyN0IscUJBQ0EzVixFQUFBNFYsY0FBQTU3QixLQUFBNjdCLGVBRUE3VixFQUFBOFYsZ0JBQUE5N0IsS0FBQSs3QixpQkFBQS9sQixPQUFBQyxHQUVBLE9BQUFqVyxLQUFBZzhCLGlCQUFBaFcsRUFBQWlXLGNBQUFqOEIsS0FBQWc4QixlQUFBaG1CLE9BQUFDLElBRUEsT0FBQWpXLEtBQUFrOEIsaUJBRUFsVyxFQUFBa1csZUFBQSxDQUNBbnhCLE9BQUFpYixFQUFBa1csZUFBQW54QixPQUFBTixVQUNBOFosT0FBQXlCLEVBQUFrVyxlQUFBM1gsU0FLQSxPQUFBdmtCLEtBQUFrbkIsY0FFQWxCLEVBQUFrQixZQUFBLENBQ0FobEIsSUFBQThqQixFQUFBa0IsWUFBQWhsQixJQUFBdUksVUFDQXRJLElBQUE2akIsRUFBQWtCLFlBQUEva0IsSUFBQXNJLGFBcUJBekssS0FBQW04QixRQUVBbjhCLEtBQUFvOEIsYUFFQXA4QixLQUFBbzhCLFdBQUFDLFFBRUFyVyxFQUFBb1csV0FBQXA4QixLQUFBbzhCLFdBQUFwbUIsU0FFQWhXLEtBQUFvOEIsV0FBQTVrQixZQUVBd08sRUFBQW9XLFdBQUFwOEIsS0FBQW84QixXQUFBcG1CLE9BQUFDLEdBQUFMLE9BTUE1VixLQUFBczhCLGFBQUF0OEIsS0FBQXM4QixZQUFBOWtCLFlBQUEsSUFBQXhYLEtBQUFzOEIsWUFBQWhrQix3QkFFQTBOLEVBQUFzVyxZQUFBdDhCLEtBQUFzOEIsWUFBQXRtQixPQUFBQyxHQUFBTCxXQUlBLEdBQUE1VixLQUFBZ25CLFFBQUFobkIsS0FBQXU4QixRQUFBdjhCLEtBQUF3OEIsU0FBQSxDQUVBeFcsRUFBQVksU0FBQThTLEVBQUF6akIsRUFBQW9qQixXQUFBcjVCLEtBQUE0bUIsVUFFQSxNQUFBNlYsRUFBQXo4QixLQUFBNG1CLFNBQUE2VixXQUVBLFFBQUExOEIsSUFBQTA4QixRQUFBMThCLElBQUEwOEIsRUFBQWxELE9BQUEsQ0FFQSxNQUFBQSxFQUFBa0QsRUFBQWxELE9BRUEsR0FBQWpqQixNQUFBQyxRQUFBZ2pCLEdBRUEsSUFBQSxJQUFBeDRCLEVBQUEsRUFBQUMsRUFBQXU0QixFQUFBdDRCLE9BQUFGLEVBQUFDLEVBQUFELElBQUEsQ0FFQSxNQUFBMjdCLEVBQUFuRCxFQUFBeDRCLEdBRUEyNEIsRUFBQXpqQixFQUFBc2pCLE9BQUFtRCxFQUVBLE1BSUFoRCxFQUFBempCLEVBQUFzakIsT0FBQUEsRUFJQSxDQUVBLENBaUJBLEdBZkF2NUIsS0FBQTI4QixnQkFFQTNXLEVBQUE0VyxTQUFBNThCLEtBQUE0OEIsU0FDQTVXLEVBQUE2VyxXQUFBNzhCLEtBQUE2OEIsV0FBQXB5QixlQUVBMUssSUFBQUMsS0FBQTg4QixXQUVBcEQsRUFBQXpqQixFQUFBdWpCLFVBQUF4NUIsS0FBQTg4QixVQUVBOVcsRUFBQThXLFNBQUE5OEIsS0FBQTg4QixTQUFBbG5CLFlBTUE3VixJQUFBQyxLQUFBKzhCLFNBRUEsR0FBQXptQixNQUFBQyxRQUFBdlcsS0FBQSs4QixVQUFBLENBRUEsTUFBQUMsRUFBQSxHQUVBLElBQUEsSUFBQWo4QixFQUFBLEVBQUFDLEVBQUFoQixLQUFBKzhCLFNBQUE5N0IsT0FBQUYsRUFBQUMsRUFBQUQsSUFFQWk4QixFQUFBNThCLEtBQUFzNUIsRUFBQXpqQixFQUFBcWpCLFVBQUF0NUIsS0FBQSs4QixTQUFBaDhCLEtBSUFpbEIsRUFBQStXLFNBQUFDLENBRUEsTUFFQWhYLEVBQUErVyxTQUFBckQsRUFBQXpqQixFQUFBcWpCLFVBQUF0NUIsS0FBQSs4QixVQVFBLEdBQUEvOEIsS0FBQXNuQixTQUFBcm1CLE9BQUEsRUFBQSxDQUVBK2tCLEVBQUFzQixTQUFBLEdBRUEsSUFBQSxJQUFBdm1CLEVBQUEsRUFBQUEsRUFBQWYsS0FBQXNuQixTQUFBcm1CLE9BQUFGLElBRUFpbEIsRUFBQXNCLFNBQUFsbkIsS0FBQUosS0FBQXNuQixTQUFBdm1CLEdBQUFpVixPQUFBQyxHQUFBK1AsT0FJQSxDQUlBLEdBQUFobUIsS0FBQXEyQixXQUFBcDFCLE9BQUEsRUFBQSxDQUVBK2tCLEVBQUFxUSxXQUFBLEdBRUEsSUFBQSxJQUFBdDFCLEVBQUEsRUFBQUEsRUFBQWYsS0FBQXEyQixXQUFBcDFCLE9BQUFGLElBQUEsQ0FFQSxNQUFBazhCLEVBQUFqOUIsS0FBQXEyQixXQUFBdDFCLEdBRUFpbEIsRUFBQXFRLFdBQUFqMkIsS0FBQXM1QixFQUFBempCLEVBQUFvZ0IsV0FBQTRHLEdBRUEsQ0FFQSxDQUVBLEdBQUEvbUIsRUFBQSxDQUVBLE1BQUFtakIsRUFBQTZELEVBQUFqbkIsRUFBQW9qQixZQUNBQyxFQUFBNEQsRUFBQWpuQixFQUFBcWpCLFdBQ0ExZ0IsRUFBQXNrQixFQUFBam5CLEVBQUEyQyxVQUNBekMsRUFBQSttQixFQUFBam5CLEVBQUFFLFFBQ0FvakIsRUFBQTJELEVBQUFqbkIsRUFBQXNqQixRQUNBQyxFQUFBMEQsRUFBQWpuQixFQUFBdWpCLFdBQ0FuRCxFQUFBNkcsRUFBQWpuQixFQUFBb2dCLFlBQ0FvRCxFQUFBeUQsRUFBQWpuQixFQUFBd2pCLE9BRUFKLEVBQUFwNEIsT0FBQSxJQUFBbVYsRUFBQWlqQixXQUFBQSxHQUNBQyxFQUFBcjRCLE9BQUEsSUFBQW1WLEVBQUFrakIsVUFBQUEsR0FDQTFnQixFQUFBM1gsT0FBQSxJQUFBbVYsRUFBQXdDLFNBQUFBLEdBQ0F6QyxFQUFBbFYsT0FBQSxJQUFBbVYsRUFBQUQsT0FBQUEsR0FDQW9qQixFQUFBdDRCLE9BQUEsSUFBQW1WLEVBQUFtakIsT0FBQUEsR0FDQUMsRUFBQXY0QixPQUFBLElBQUFtVixFQUFBb2pCLFVBQUFBLEdBQ0FuRCxFQUFBcDFCLE9BQUEsSUFBQW1WLEVBQUFpZ0IsV0FBQUEsR0FDQW9ELEVBQUF4NEIsT0FBQSxJQUFBbVYsRUFBQXFqQixNQUFBQSxFQUVBLENBSUEsT0FGQXJqQixFQUFBNFAsT0FBQUEsRUFFQTVQLEVBS0EsU0FBQThtQixFQUFBQyxHQUVBLE1BQUFDLEVBQUEsR0FDQSxJQUFBLE1BQUFDLEtBQUFGLEVBQUEsQ0FFQSxNQUFBNW5CLEVBQUE0bkIsRUFBQUUsVUFDQTluQixFQUFBc0QsU0FDQXVrQixFQUFBaDlCLEtBQUFtVixFQUVBLENBRUEsT0FBQTZuQixDQUVBLENBRUEsQ0FRQSxLQUFBMzFCLENBQUE2MUIsR0FFQSxPQUFBLElBQUF0OUIsS0FBQTRDLGFBQUE4RSxLQUFBMUgsS0FBQXM5QixFQUVBLENBU0EsSUFBQTUxQixDQUFBK1AsRUFBQTZsQixHQUFBLEdBZ0NBLEdBOUJBdDlCLEtBQUFvUSxLQUFBcUgsRUFBQXJILEtBRUFwUSxLQUFBNHZCLEdBQUFsb0IsS0FBQStQLEVBQUFtWSxJQUVBNXZCLEtBQUF3eEIsU0FBQTlwQixLQUFBK1AsRUFBQStaLFVBQ0F4eEIsS0FBQWtQLFNBQUFsSixNQUFBeVIsRUFBQXZJLFNBQUFsSixNQUNBaEcsS0FBQW1mLFdBQUF6WCxLQUFBK1AsRUFBQTBILFlBQ0FuZixLQUFBcVAsTUFBQTNILEtBQUErUCxFQUFBcEksT0FFQXJQLEtBQUE0UCxPQUFBbEksS0FBQStQLEVBQUE3SCxRQUNBNVAsS0FBQXFqQixZQUFBM2IsS0FBQStQLEVBQUE0TCxhQUVBcmpCLEtBQUE4WCxpQkFBQUwsRUFBQUssaUJBRUE5WCxLQUFBNjFCLHNCQUFBcGUsRUFBQW9lLHNCQUNBNzFCLEtBQUErMUIsdUJBQUF0ZSxFQUFBc2UsdUJBRUEvMUIsS0FBQWkwQixPQUFBUCxLQUFBamMsRUFBQXdjLE9BQUFQLEtBQ0ExekIsS0FBQWcyQixRQUFBdmUsRUFBQXVlLFFBRUFoMkIsS0FBQWkyQixXQUFBeGUsRUFBQXdlLFdBQ0FqMkIsS0FBQWsyQixjQUFBemUsRUFBQXllLGNBRUFsMkIsS0FBQW0yQixjQUFBMWUsRUFBQTBlLGNBQ0FuMkIsS0FBQW8yQixZQUFBM2UsRUFBQTJlLFlBRUFwMkIsS0FBQXEyQixXQUFBNWUsRUFBQTRlLFdBQUF2MUIsUUFFQWQsS0FBQW1ZLFNBQUFNLEtBQUFDLE1BQUFELEtBQUFFLFVBQUFsQixFQUFBVSxZQUVBLElBQUFtbEIsRUFFQSxJQUFBLElBQUF2OEIsRUFBQSxFQUFBQSxFQUFBMFcsRUFBQTZQLFNBQUFybUIsT0FBQUYsSUFBQSxDQUVBLE1BQUFrMEIsRUFBQXhkLEVBQUE2UCxTQUFBdm1CLEdBQ0FmLEtBQUE0SCxJQUFBcXRCLEVBQUF4dEIsUUFFQSxDQUlBLE9BQUF6SCxJQUVBLEVBWUFtMUIsR0FBQUcsV0FBQSxJQUFBdFQsR0FBQSxFQUFBLEVBQUEsR0FVQW1ULEdBQUFTLDRCQUFBLEVBVUFULEdBQUFXLGtDQUFBLEVDM2tEQSxNQUFBeUgsR0FBQSxJQUFBdmIsR0FDQXdiLEdBQUEsSUFBQXhiLEdBQ0F5YixHQUFBLElBQUF6YixHQUNBMGIsR0FBQSxJQUFBMWIsR0FFQTJiLEdBQUEsSUFBQTNiLEdBQ0E0YixHQUFBLElBQUE1YixHQUNBNmIsR0FBQSxJQUFBN2IsR0FDQThiLEdBQUEsSUFBQTliLEdBQ0ErYixHQUFBLElBQUEvYixHQUNBZ2MsR0FBQSxJQUFBaGMsR0FFQWljLEdBQUEsSUFBQTVrQixHQUNBNmtCLEdBQUEsSUFBQTdrQixHQUNBOGtCLEdBQUEsSUFBQTlrQixHQUtBLE1BQUEra0IsR0FTQSxXQUFBeDdCLENBQUFpRCxFQUFBLElBQUFtYyxHQUFBbGMsRUFBQSxJQUFBa2MsR0FBQWpjLEVBQUEsSUFBQWljLElBT0FoaUIsS0FBQTZGLEVBQUFBLEVBT0E3RixLQUFBOEYsRUFBQUEsRUFPQTlGLEtBQUErRixFQUFBQSxDQUVBLENBV0EsZ0JBQUFzNEIsQ0FBQXg0QixFQUFBQyxFQUFBQyxFQUFBbkYsR0FFQUEsRUFBQXNILFdBQUFuQyxFQUFBRCxHQUNBeTNCLEdBQUFyMUIsV0FBQXJDLEVBQUFDLEdBQ0FsRixFQUFBc0ksTUFBQXEwQixJQUVBLE1BQUFlLEVBQUExOUIsRUFBQXVJLFdBQ0EsT0FBQW0xQixFQUFBLEVBRUExOUIsRUFBQXdILGVBQUEsRUFBQTlHLEtBQUE4SCxLQUFBazFCLElBSUExOUIsRUFBQStGLElBQUEsRUFBQSxFQUFBLEVBRUEsQ0FhQSxtQkFBQTQzQixDQUFBaFksRUFBQTFnQixFQUFBQyxFQUFBQyxFQUFBbkYsR0FJQTI4QixHQUFBcjFCLFdBQUFuQyxFQUFBRixHQUNBMjNCLEdBQUF0MUIsV0FBQXBDLEVBQUFELEdBQ0E0M0IsR0FBQXYxQixXQUFBcWUsRUFBQTFnQixHQUVBLE1BQUEyNEIsRUFBQWpCLEdBQUF0MEIsSUFBQXMwQixJQUNBa0IsRUFBQWxCLEdBQUF0MEIsSUFBQXUwQixJQUNBa0IsRUFBQW5CLEdBQUF0MEIsSUFBQXcwQixJQUNBa0IsRUFBQW5CLEdBQUF2MEIsSUFBQXUwQixJQUNBb0IsRUFBQXBCLEdBQUF2MEIsSUFBQXcwQixJQUVBb0IsRUFBQUwsRUFBQUcsRUFBQUYsRUFBQUEsRUFHQSxHQUFBLElBQUFJLEVBR0EsT0FEQWorQixFQUFBK0YsSUFBQSxFQUFBLEVBQUEsR0FDQSxLQUlBLE1BQUFtNEIsRUFBQSxFQUFBRCxFQUNBNVosR0FBQTBaLEVBQUFELEVBQUFELEVBQUFHLEdBQUFFLEVBQ0FuM0IsR0FBQTYyQixFQUFBSSxFQUFBSCxFQUFBQyxHQUFBSSxFQUdBLE9BQUFsK0IsRUFBQStGLElBQUEsRUFBQXNlLEVBQUF0ZCxFQUFBQSxFQUFBc2QsRUFFQSxDQWFBLG9CQUFBc0MsQ0FBQWhCLEVBQUExZ0IsRUFBQUMsRUFBQUMsR0FHQSxPQUFBLE9BQUEvRixLQUFBdStCLGFBQUFoWSxFQUFBMWdCLEVBQUFDLEVBQUFDLEVBQUEyM0IsTUFNQUEsR0FBQWw3QixHQUFBLEdBQUFrN0IsR0FBQWo3QixHQUFBLEdBQUFpN0IsR0FBQWw3QixFQUFBazdCLEdBQUFqN0IsR0FBQSxFQUVBLENBZ0JBLHVCQUFBczhCLENBQUF4WSxFQUFBZ0QsRUFBQUMsRUFBQXdWLEVBQUE1MEIsRUFBQUMsRUFBQTQwQixFQUFBcitCLEdBRUEsT0FBQSxPQUFBWixLQUFBdStCLGFBQUFoWSxFQUFBZ0QsRUFBQUMsRUFBQXdWLEVBQUF0QixLQUVBOThCLEVBQUE0QixFQUFBLEVBQ0E1QixFQUFBNkIsRUFBQSxFQUNBLE1BQUE3QixJQUFBQSxFQUFBMFksRUFBQSxHQUNBLE1BQUExWSxJQUFBQSxFQUFBMlksRUFBQSxHQUNBLE9BSUEzWSxFQUFBdUcsVUFBQSxHQUNBdkcsRUFBQW1ILGdCQUFBcUMsRUFBQXN6QixHQUFBbDdCLEdBQ0E1QixFQUFBbUgsZ0JBQUFzQyxFQUFBcXpCLEdBQUFqN0IsR0FDQTdCLEVBQUFtSCxnQkFBQWszQixFQUFBdkIsR0FBQXBrQixHQUVBMVksRUFFQSxDQWFBLCtCQUFBcytCLENBQUFDLEVBQUFDLEVBQUFDLEVBQUFDLEVBQUFDLEVBQUEzK0IsR0FlQSxPQWJBcTlCLEdBQUE5MkIsVUFBQSxHQUNBKzJCLEdBQUEvMkIsVUFBQSxHQUNBZzNCLEdBQUFoM0IsVUFBQSxHQUVBODJCLEdBQUF2ekIsb0JBQUF5MEIsRUFBQUMsR0FDQWxCLEdBQUF4ekIsb0JBQUF5MEIsRUFBQUUsR0FDQWxCLEdBQUF6ekIsb0JBQUF5MEIsRUFBQUcsR0FFQTErQixFQUFBdUcsVUFBQSxHQUNBdkcsRUFBQW1ILGdCQUFBazJCLEdBQUFzQixFQUFBLzhCLEdBQ0E1QixFQUFBbUgsZ0JBQUFtMkIsR0FBQXFCLEVBQUE5OEIsR0FDQTdCLEVBQUFtSCxnQkFBQW8yQixHQUFBb0IsRUFBQWptQixHQUVBMVksQ0FFQSxDQVdBLG9CQUFBNCtCLENBQUEzNUIsRUFBQUMsRUFBQUMsRUFBQStrQixHQU1BLE9BSkF5UyxHQUFBcjFCLFdBQUFuQyxFQUFBRCxHQUNBMDNCLEdBQUF0MUIsV0FBQXJDLEVBQUFDLEdBR0F5M0IsR0FBQXIwQixNQUFBczBCLElBQUF2MEIsSUFBQTZoQixHQUFBLENBRUEsQ0FVQSxHQUFBbmtCLENBQUFkLEVBQUFDLEVBQUFDLEdBTUEsT0FKQS9GLEtBQUE2RixFQUFBNkIsS0FBQTdCLEdBQ0E3RixLQUFBOEYsRUFBQTRCLEtBQUE1QixHQUNBOUYsS0FBQStGLEVBQUEyQixLQUFBM0IsR0FFQS9GLElBRUEsQ0FXQSx1QkFBQXkvQixDQUFBOVosRUFBQStaLEVBQUFOLEVBQUFDLEdBTUEsT0FKQXIvQixLQUFBNkYsRUFBQTZCLEtBQUFpZSxFQUFBK1osSUFDQTEvQixLQUFBOEYsRUFBQTRCLEtBQUFpZSxFQUFBeVosSUFDQXAvQixLQUFBK0YsRUFBQTJCLEtBQUFpZSxFQUFBMFosSUFFQXIvQixJQUVBLENBV0EsMEJBQUEyL0IsQ0FBQWgxQixFQUFBKzBCLEVBQUFOLEVBQUFDLEdBTUEsT0FKQXIvQixLQUFBNkYsRUFBQTZFLG9CQUFBQyxFQUFBKzBCLEdBQ0ExL0IsS0FBQThGLEVBQUE0RSxvQkFBQUMsRUFBQXkwQixHQUNBcC9CLEtBQUErRixFQUFBMkUsb0JBQUFDLEVBQUEwMEIsR0FFQXIvQixJQUVBLENBT0EsS0FBQXlILEdBRUEsT0FBQSxJQUFBekgsS0FBQTRDLGFBQUE4RSxLQUFBMUgsS0FFQSxDQVFBLElBQUEwSCxDQUFBd2dCLEdBTUEsT0FKQWxvQixLQUFBNkYsRUFBQTZCLEtBQUF3Z0IsRUFBQXJpQixHQUNBN0YsS0FBQThGLEVBQUE0QixLQUFBd2dCLEVBQUFwaUIsR0FDQTlGLEtBQUErRixFQUFBMkIsS0FBQXdnQixFQUFBbmlCLEdBRUEvRixJQUVBLENBT0EsT0FBQTQvQixHQUtBLE9BSEFyQyxHQUFBcjFCLFdBQUFsSSxLQUFBK0YsRUFBQS9GLEtBQUE4RixHQUNBMDNCLEdBQUF0MUIsV0FBQWxJLEtBQUE2RixFQUFBN0YsS0FBQThGLEdBRUEsR0FBQXkzQixHQUFBcjBCLE1BQUFzMEIsSUFBQXY4QixRQUVBLENBUUEsV0FBQTQrQixDQUFBai9CLEdBRUEsT0FBQUEsRUFBQWtILFdBQUE5SCxLQUFBNkYsRUFBQTdGLEtBQUE4RixHQUFBOEIsSUFBQTVILEtBQUErRixHQUFBcUMsZUFBQSxFQUFBLEVBRUEsQ0FRQSxTQUFBaTJCLENBQUF6OUIsR0FFQSxPQUFBdzlCLEdBQUFDLFVBQUFyK0IsS0FBQTZGLEVBQUE3RixLQUFBOEYsRUFBQTlGLEtBQUErRixFQUFBbkYsRUFFQSxDQVFBLFFBQUFrL0IsQ0FBQWwvQixHQUVBLE9BQUFBLEVBQUFtL0Isc0JBQUEvL0IsS0FBQTZGLEVBQUE3RixLQUFBOEYsRUFBQTlGLEtBQUErRixFQUVBLENBVUEsWUFBQXc0QixDQUFBaFksRUFBQTNsQixHQUVBLE9BQUF3OUIsR0FBQUcsYUFBQWhZLEVBQUF2bUIsS0FBQTZGLEVBQUE3RixLQUFBOEYsRUFBQTlGLEtBQUErRixFQUFBbkYsRUFFQSxDQWFBLGdCQUFBbStCLENBQUF4WSxFQUFBbmMsRUFBQUMsRUFBQTQwQixFQUFBcitCLEdBRUEsT0FBQXc5QixHQUFBVyxpQkFBQXhZLEVBQUF2bUIsS0FBQTZGLEVBQUE3RixLQUFBOEYsRUFBQTlGLEtBQUErRixFQUFBcUUsRUFBQUMsRUFBQTQwQixFQUFBcitCLEVBRUEsQ0FVQSxhQUFBMm1CLENBQUFoQixHQUVBLE9BQUE2WCxHQUFBN1csY0FBQWhCLEVBQUF2bUIsS0FBQTZGLEVBQUE3RixLQUFBOEYsRUFBQTlGLEtBQUErRixFQUVBLENBUUEsYUFBQXk1QixDQUFBMVUsR0FFQSxPQUFBc1QsR0FBQW9CLGNBQUF4L0IsS0FBQTZGLEVBQUE3RixLQUFBOEYsRUFBQTlGLEtBQUErRixFQUFBK2tCLEVBRUEsQ0FRQSxhQUFBcEQsQ0FBQXZCLEdBRUEsT0FBQUEsRUFBQThCLG1CQUFBam9CLEtBRUEsQ0FTQSxtQkFBQW1yQixDQUFBMEgsRUFBQWp5QixHQUVBLE1BQUFpRixFQUFBN0YsS0FBQTZGLEVBQUFDLEVBQUE5RixLQUFBOEYsRUFBQUMsRUFBQS9GLEtBQUErRixFQUNBLElBQUE0QixFQUFBNFIsRUFRQW9rQixHQUFBejFCLFdBQUFwQyxFQUFBRCxHQUNBKzNCLEdBQUExMUIsV0FBQW5DLEVBQUFGLEdBQ0FpNEIsR0FBQTUxQixXQUFBMnFCLEVBQUFodEIsR0FDQSxNQUFBakUsRUFBQSs3QixHQUFBMTBCLElBQUE2MEIsSUFDQWo4QixFQUFBKzdCLEdBQUEzMEIsSUFBQTYwQixJQUNBLEdBQUFsOEIsR0FBQSxHQUFBQyxHQUFBLEVBR0EsT0FBQWpCLEVBQUE4RyxLQUFBN0IsR0FJQWs0QixHQUFBNzFCLFdBQUEycUIsRUFBQS9zQixHQUNBLE1BQUFoRSxFQUFBNjdCLEdBQUExMEIsSUFBQTgwQixJQUNBaUMsRUFBQXBDLEdBQUEzMEIsSUFBQTgwQixJQUNBLEdBQUFqOEIsR0FBQSxHQUFBaytCLEdBQUFsK0IsRUFHQSxPQUFBbEIsRUFBQThHLEtBQUE1QixHQUlBLE1BQUFtNkIsRUFBQXIrQixFQUFBbytCLEVBQUFsK0IsRUFBQUQsRUFDQSxHQUFBbytCLEdBQUEsR0FBQXIrQixHQUFBLEdBQUFFLEdBQUEsRUFJQSxPQUZBNkYsRUFBQS9GLEdBQUFBLEVBQUFFLEdBRUFsQixFQUFBOEcsS0FBQTdCLEdBQUFrQyxnQkFBQTQxQixHQUFBaDJCLEdBSUFxMkIsR0FBQTkxQixXQUFBMnFCLEVBQUE5c0IsR0FDQSxNQUFBbTZCLEVBQUF2QyxHQUFBMTBCLElBQUErMEIsSUFDQW1DLEVBQUF2QyxHQUFBMzBCLElBQUErMEIsSUFDQSxHQUFBbUMsR0FBQSxHQUFBRCxHQUFBQyxFQUdBLE9BQUF2L0IsRUFBQThHLEtBQUEzQixHQUlBLE1BQUFxNkIsRUFBQUYsRUFBQXIrQixFQUFBRCxFQUFBdStCLEVBQ0EsR0FBQUMsR0FBQSxHQUFBditCLEdBQUEsR0FBQXMrQixHQUFBLEVBSUEsT0FGQTVtQixFQUFBMVgsR0FBQUEsRUFBQXMrQixHQUVBdi9CLEVBQUE4RyxLQUFBN0IsR0FBQWtDLGdCQUFBNjFCLEdBQUFya0IsR0FJQSxNQUFBOG1CLEVBQUF2K0IsRUFBQXErQixFQUFBRCxFQUFBRixFQUNBLEdBQUFLLEdBQUEsR0FBQUwsRUFBQWwrQixHQUFBLEdBQUFvK0IsRUFBQUMsR0FBQSxFQUtBLE9BSEF0QyxHQUFBMzFCLFdBQUFuQyxFQUFBRCxHQUNBeVQsR0FBQXltQixFQUFBbCtCLElBQUFrK0IsRUFBQWwrQixHQUFBbytCLEVBQUFDLElBRUF2L0IsRUFBQThHLEtBQUE1QixHQUFBaUMsZ0JBQUE4MUIsR0FBQXRrQixHQUtBLE1BQUFzbEIsRUFBQSxHQUFBd0IsRUFBQUQsRUFBQUgsR0FLQSxPQUhBdDRCLEVBQUF5NEIsRUFBQXZCLEVBQ0F0bEIsRUFBQTBtQixFQUFBcEIsRUFFQWorQixFQUFBOEcsS0FBQTdCLEdBQUFrQyxnQkFBQTQxQixHQUFBaDJCLEdBQUFJLGdCQUFBNjFCLEdBQUFya0IsRUFFQSxDQVFBLE1BQUFqUCxDQUFBNGQsR0FFQSxPQUFBQSxFQUFBcmlCLEVBQUF5RSxPQUFBdEssS0FBQTZGLElBQUFxaUIsRUFBQXBpQixFQUFBd0UsT0FBQXRLLEtBQUE4RixJQUFBb2lCLEVBQUFuaUIsRUFBQXVFLE9BQUF0SyxLQUFBK0YsRUFFQSxFQ2xoQkEsTUFBQXU2QixHQUFBLENBQUFDLFVBQUEsU0FBQUMsYUFBQSxTQUFBQyxLQUFBLE1BQUFDLFdBQUEsUUFBQUMsTUFBQSxTQUNBQyxNQUFBLFNBQUFDLE9BQUEsU0FBQUMsTUFBQSxFQUFBQyxlQUFBLFNBQUFDLEtBQUEsSUFBQUMsV0FBQSxRQUNBQyxNQUFBLFNBQUFDLFVBQUEsU0FBQUMsVUFBQSxRQUFBQyxXQUFBLFFBQUFDLFVBQUEsU0FBQUMsTUFBQSxTQUNBQyxlQUFBLFFBQUFDLFNBQUEsU0FBQUMsUUFBQSxTQUFBQyxLQUFBLE1BQUFDLFNBQUEsSUFBQUMsU0FBQSxNQUNBQyxjQUFBLFNBQUFDLFNBQUEsU0FBQUMsVUFBQSxNQUFBQyxTQUFBLFNBQUFDLFVBQUEsU0FBQUMsWUFBQSxRQUNBQyxlQUFBLFFBQUFDLFdBQUEsU0FBQUMsV0FBQSxTQUFBQyxRQUFBLFFBQUFDLFdBQUEsU0FBQUMsYUFBQSxRQUNBQyxjQUFBLFFBQUFDLGNBQUEsUUFBQUMsY0FBQSxRQUFBQyxjQUFBLE1BQUFDLFdBQUEsUUFDQUMsU0FBQSxTQUFBQyxZQUFBLE1BQUFDLFFBQUEsUUFBQUMsUUFBQSxRQUFBQyxXQUFBLFFBQUFDLFVBQUEsU0FDQUMsWUFBQSxTQUFBQyxZQUFBLFFBQUFDLFFBQUEsU0FBQUMsVUFBQSxTQUFBQyxXQUFBLFNBQUFDLEtBQUEsU0FDQUMsVUFBQSxTQUFBQyxLQUFBLFFBQUFDLE1BQUEsTUFBQUMsWUFBQSxTQUFBQyxLQUFBLFFBQUFDLFNBQUEsU0FBQUMsUUFBQSxTQUNBQyxVQUFBLFNBQUFDLE9BQUEsUUFBQUMsTUFBQSxTQUFBQyxNQUFBLFNBQUFDLFNBQUEsU0FBQUMsY0FBQSxTQUFBQyxVQUFBLFFBQ0FDLGFBQUEsU0FBQUMsVUFBQSxTQUFBQyxXQUFBLFNBQUFDLFVBQUEsU0FBQUMscUJBQUEsU0FBQUMsVUFBQSxTQUNBQyxXQUFBLFFBQUFDLFVBQUEsU0FBQUMsVUFBQSxTQUFBQyxZQUFBLFNBQUFDLGNBQUEsUUFBQUMsYUFBQSxRQUNBQyxlQUFBLFFBQUFDLGVBQUEsUUFBQUMsZUFBQSxTQUFBQyxZQUFBLFNBQUFDLEtBQUEsTUFBQUMsVUFBQSxRQUNBQyxNQUFBLFNBQUFDLFFBQUEsU0FBQUMsT0FBQSxRQUFBQyxpQkFBQSxRQUFBQyxXQUFBLElBQUFDLGFBQUEsU0FDQUMsYUFBQSxRQUFBQyxlQUFBLFFBQUFDLGdCQUFBLFFBQUFDLGtCQUFBLE1BQUFDLGdCQUFBLFFBQ0FDLGdCQUFBLFNBQUFDLGFBQUEsUUFBQUMsVUFBQSxTQUFBQyxVQUFBLFNBQUFDLFNBQUEsU0FBQUMsWUFBQSxTQUNBQyxLQUFBLElBQUFDLFFBQUEsU0FBQUMsTUFBQSxRQUFBQyxVQUFBLFFBQUFDLE9BQUEsU0FBQUMsVUFBQSxTQUFBQyxPQUFBLFNBQ0FDLGNBQUEsU0FBQUMsVUFBQSxTQUFBQyxjQUFBLFNBQUFDLGNBQUEsU0FBQUMsV0FBQSxTQUFBQyxVQUFBLFNBQ0FDLEtBQUEsU0FBQUMsS0FBQSxTQUFBQyxLQUFBLFNBQUFDLFdBQUEsU0FBQUMsT0FBQSxRQUFBQyxjQUFBLFFBQUFDLElBQUEsU0FBQUMsVUFBQSxTQUNBQyxVQUFBLFFBQUFDLFlBQUEsUUFBQUMsT0FBQSxTQUFBQyxXQUFBLFNBQUFDLFNBQUEsUUFBQUMsU0FBQSxTQUNBQyxPQUFBLFNBQUFDLE9BQUEsU0FBQUMsUUFBQSxRQUFBQyxVQUFBLFFBQUFDLFVBQUEsUUFBQUMsVUFBQSxRQUFBQyxLQUFBLFNBQ0FDLFlBQUEsTUFBQUMsVUFBQSxRQUFBQyxJQUFBLFNBQUFDLEtBQUEsTUFBQUMsUUFBQSxTQUFBQyxPQUFBLFNBQUFDLFVBQUEsUUFDQUMsT0FBQSxTQUFBQyxNQUFBLFNBQUFDLE1BQUEsU0FBQUMsV0FBQSxTQUFBQyxPQUFBLFNBQUFDLFlBQUEsVUFFQUMsR0FBQSxDQUFBMzdCLEVBQUEsRUFBQWxKLEVBQUEsRUFBQTlELEVBQUEsR0FDQTRvQyxHQUFBLENBQUE1N0IsRUFBQSxFQUFBbEosRUFBQSxFQUFBOUQsRUFBQSxHQUVBLFNBQUE2b0MsR0FBQWhYLEVBQUFqdEIsRUFBQWxELEdBSUEsT0FGQUEsRUFBQSxJQUFBQSxHQUFBLEdBQ0FBLEVBQUEsSUFBQUEsR0FBQSxHQUNBQSxFQUFBLEVBQUEsRUFBQW13QixFQUFBLEdBQUFqdEIsRUFBQWl0QixHQUFBbndCLEVBQ0FBLEVBQUEsR0FBQWtELEVBQ0FsRCxFQUFBLEVBQUEsRUFBQW13QixFQUFBLEdBQUFqdEIsRUFBQWl0QixJQUFBLEVBQUEsRUFBQW53QixHQUNBbXdCLENBRUEsQ0E2Q0EsTUFBQWlYLEdBYUEsV0FBQWxuQyxDQUFBZ00sRUFBQWIsRUFBQWpJLEdBbUNBLE9BMUJBOUYsS0FBQXE4QixTQUFBLEVBUUFyOEIsS0FBQTRPLEVBQUEsRUFRQTVPLEtBQUErTixFQUFBLEVBUUEvTixLQUFBOEYsRUFBQSxFQUVBOUYsS0FBQTJHLElBQUFpSSxFQUFBYixFQUFBakksRUFFQSxDQVdBLEdBQUFhLENBQUFpSSxFQUFBYixFQUFBakksR0FFQSxRQUFBL0YsSUFBQWdPLFFBQUFoTyxJQUFBK0YsRUFBQSxDQUlBLE1BQUE3RCxFQUFBMk0sRUFFQTNNLEdBQUFBLEVBQUFvNkIsUUFFQXI4QixLQUFBMEgsS0FBQXpGLEdBRUEsaUJBQUFBLEVBRUFqQyxLQUFBK3BDLE9BQUE5bkMsR0FFQSxpQkFBQUEsR0FFQWpDLEtBQUFncUMsU0FBQS9uQyxFQUlBLE1BRUFqQyxLQUFBaXFDLE9BQUFyN0IsRUFBQWIsRUFBQWpJLEdBSUEsT0FBQTlGLElBRUEsQ0FRQSxTQUFBbUgsQ0FBQUMsR0FNQSxPQUpBcEgsS0FBQTRPLEVBQUF4SCxFQUNBcEgsS0FBQStOLEVBQUEzRyxFQUNBcEgsS0FBQThGLEVBQUFzQixFQUVBcEgsSUFFQSxDQVNBLE1BQUErcEMsQ0FBQUcsRUFBQWozQixFQUFBbFcsSUFVQSxPQVJBbXRDLEVBQUE1b0MsS0FBQW1ELE1BQUF5bEMsR0FFQWxxQyxLQUFBNE8sR0FBQXM3QixHQUFBLEdBQUEsS0FBQSxJQUNBbHFDLEtBQUErTixHQUFBbThCLEdBQUEsRUFBQSxLQUFBLElBQ0FscUMsS0FBQThGLEdBQUEsSUFBQW9rQyxHQUFBLElBRUFsNEIsR0FBQWUsb0JBQUEvUyxLQUFBaVQsR0FFQWpULElBRUEsQ0FXQSxNQUFBaXFDLENBQUFyN0IsRUFBQWIsRUFBQWpJLEVBQUFtTixFQUFBakIsR0FBQUUsbUJBUUEsT0FOQWxTLEtBQUE0TyxFQUFBQSxFQUNBNU8sS0FBQStOLEVBQUFBLEVBQ0EvTixLQUFBOEYsRUFBQUEsRUFFQWtNLEdBQUFlLG9CQUFBL1MsS0FBQWlULEdBRUFqVCxJQUVBLENBV0EsTUFBQW1xQyxDQUFBbjhCLEVBQUFsSixFQUFBOUQsRUFBQWlTLEVBQUFqQixHQUFBRSxtQkFPQSxHQUpBbEUsRUFBQTVMLEdBQUE0TCxFQUFBLEdBQ0FsSixFQUFBOUMsR0FBQThDLEVBQUEsRUFBQSxHQUNBOUQsRUFBQWdCLEdBQUFoQixFQUFBLEVBQUEsR0FFQSxJQUFBOEQsRUFFQTlFLEtBQUE0TyxFQUFBNU8sS0FBQStOLEVBQUEvTixLQUFBOEYsRUFBQTlFLE1BRUEsQ0FFQSxNQUFBNnhCLEVBQUE3eEIsR0FBQSxHQUFBQSxHQUFBLEVBQUE4RCxHQUFBOUQsRUFBQThELEVBQUE5RCxFQUFBOEQsRUFDQWMsRUFBQSxFQUFBNUUsRUFBQTZ4QixFQUVBN3lCLEtBQUE0TyxFQUFBaTdCLEdBQUFqa0MsRUFBQWl0QixFQUFBN2tCLEVBQUEsRUFBQSxHQUNBaE8sS0FBQStOLEVBQUE4N0IsR0FBQWprQyxFQUFBaXRCLEVBQUE3a0IsR0FDQWhPLEtBQUE4RixFQUFBK2pDLEdBQUFqa0MsRUFBQWl0QixFQUFBN2tCLEVBQUEsRUFBQSxFQUVBLENBSUEsT0FGQWdFLEdBQUFlLG9CQUFBL1MsS0FBQWlULEdBRUFqVCxJQUVBLENBWUEsUUFBQWdxQyxDQUFBeDVCLEVBQUF5QyxFQUFBbFcsSUFFQSxTQUFBcXRDLEVBQUFDLFFBRUF0cUMsSUFBQXNxQyxHQUVBQyxXQUFBRCxHQUFBLEdBRUF6akMsUUFBQUMsS0FBQSxtQ0FBQTJKLEVBQUEsb0JBSUEsQ0FHQSxJQUFBbE8sRUFFQSxHQUFBQSxFQUFBLHFCQUFBaW9DLEtBQUEvNUIsR0FBQSxDQUlBLElBQUE2QixFQUNBLE1BQUFqQyxFQUFBOU4sRUFBQSxHQUNBa29DLEVBQUFsb0MsRUFBQSxHQUVBLE9BQUE4TixHQUVBLElBQUEsTUFDQSxJQUFBLE9BRUEsR0FBQWlDLEVBQUEsK0RBQUFrNEIsS0FBQUMsR0FNQSxPQUZBSixFQUFBLzNCLEVBQUEsSUFFQXJTLEtBQUFpcUMsT0FDQTNvQyxLQUFBWSxJQUFBLElBQUF1b0MsU0FBQXA0QixFQUFBLEdBQUEsS0FBQSxJQUNBL1EsS0FBQVksSUFBQSxJQUFBdW9DLFNBQUFwNEIsRUFBQSxHQUFBLEtBQUEsSUFDQS9RLEtBQUFZLElBQUEsSUFBQXVvQyxTQUFBcDRCLEVBQUEsR0FBQSxLQUFBLElBQ0FZLEdBS0EsR0FBQVosRUFBQSxxRUFBQWs0QixLQUFBQyxHQU1BLE9BRkFKLEVBQUEvM0IsRUFBQSxJQUVBclMsS0FBQWlxQyxPQUNBM29DLEtBQUFZLElBQUEsSUFBQXVvQyxTQUFBcDRCLEVBQUEsR0FBQSxLQUFBLElBQ0EvUSxLQUFBWSxJQUFBLElBQUF1b0MsU0FBQXA0QixFQUFBLEdBQUEsS0FBQSxJQUNBL1EsS0FBQVksSUFBQSxJQUFBdW9DLFNBQUFwNEIsRUFBQSxHQUFBLEtBQUEsSUFDQVksR0FLQSxNQUVBLElBQUEsTUFDQSxJQUFBLE9BRUEsR0FBQVosRUFBQSxxRkFBQWs0QixLQUFBQyxHQU1BLE9BRkFKLEVBQUEvM0IsRUFBQSxJQUVBclMsS0FBQW1xQyxPQUNBRyxXQUFBajRCLEVBQUEsSUFBQSxJQUNBaTRCLFdBQUFqNEIsRUFBQSxJQUFBLElBQ0FpNEIsV0FBQWo0QixFQUFBLElBQUEsSUFDQVksR0FLQSxNQUVBLFFBRUFyTSxRQUFBQyxLQUFBLG9DQUFBMkosR0FJQSxNQUFBLEdBQUFsTyxFQUFBLG9CQUFBaW9DLEtBQUEvNUIsR0FBQSxDQUlBLE1BQUEwNUIsRUFBQTVuQyxFQUFBLEdBQ0F1akIsRUFBQXFrQixFQUFBanBDLE9BRUEsR0FBQSxJQUFBNGtCLEVBR0EsT0FBQTdsQixLQUFBaXFDLE9BQ0FRLFNBQUFQLEVBQUFRLE9BQUEsR0FBQSxJQUFBLEdBQ0FELFNBQUFQLEVBQUFRLE9BQUEsR0FBQSxJQUFBLEdBQ0FELFNBQUFQLEVBQUFRLE9BQUEsR0FBQSxJQUFBLEdBQ0F6M0IsR0FHQSxHQUFBLElBQUE0UyxFQUdBLE9BQUE3bEIsS0FBQStwQyxPQUFBVSxTQUFBUCxFQUFBLElBQUFqM0IsR0FJQXJNLFFBQUFDLEtBQUEsa0NBQUEySixFQUlBLE1BQUEsR0FBQUEsR0FBQUEsRUFBQXZQLE9BQUEsRUFFQSxPQUFBakIsS0FBQTJxQyxhQUFBbjZCLEVBQUF5QyxHQUlBLE9BQUFqVCxJQUVBLENBZUEsWUFBQTJxQyxDQUFBbjZCLEVBQUF5QyxFQUFBbFcsSUFHQSxNQUFBbXRDLEVBQUE1SixHQUFBOXZCLEVBQUF6TyxlQWNBLFlBWkFoQyxJQUFBbXFDLEVBR0FscUMsS0FBQStwQyxPQUFBRyxFQUFBajNCLEdBS0FyTSxRQUFBQyxLQUFBLDhCQUFBMkosR0FJQXhRLElBRUEsQ0FPQSxLQUFBeUgsR0FFQSxPQUFBLElBQUF6SCxLQUFBNEMsWUFBQTVDLEtBQUE0TyxFQUFBNU8sS0FBQStOLEVBQUEvTixLQUFBOEYsRUFFQSxDQVFBLElBQUE0QixDQUFBMkssR0FNQSxPQUpBclMsS0FBQTRPLEVBQUF5RCxFQUFBekQsRUFDQTVPLEtBQUErTixFQUFBc0UsRUFBQXRFLEVBQ0EvTixLQUFBOEYsRUFBQXVNLEVBQUF2TSxFQUVBOUYsSUFFQSxDQVNBLGdCQUFBNHFDLENBQUF2NEIsR0FNQSxPQUpBclMsS0FBQTRPLEVBQUE2RCxHQUFBSixFQUFBekQsR0FDQTVPLEtBQUErTixFQUFBMEUsR0FBQUosRUFBQXRFLEdBQ0EvTixLQUFBOEYsRUFBQTJNLEdBQUFKLEVBQUF2TSxHQUVBOUYsSUFFQSxDQVNBLGdCQUFBNnFDLENBQUF4NEIsR0FNQSxPQUpBclMsS0FBQTRPLEVBQUFpRSxHQUFBUixFQUFBekQsR0FDQTVPLEtBQUErTixFQUFBOEUsR0FBQVIsRUFBQXRFLEdBQ0EvTixLQUFBOEYsRUFBQStNLEdBQUFSLEVBQUF2TSxHQUVBOUYsSUFFQSxDQU9BLG1CQUFBOHFDLEdBSUEsT0FGQTlxQyxLQUFBNHFDLGlCQUFBNXFDLE1BRUFBLElBRUEsQ0FPQSxtQkFBQStxQyxHQUlBLE9BRkEvcUMsS0FBQTZxQyxpQkFBQTdxQyxNQUVBQSxJQUVBLENBUUEsTUFBQWdyQyxDQUFBLzNCLEVBQUFsVyxJQUlBLE9BRkFpVixHQUFBYyxzQkFBQW00QixHQUFBdmpDLEtBQUExSCxNQUFBaVQsR0FFQSxNQUFBM1IsS0FBQWdDLE1BQUF0QixHQUFBLElBQUFpcEMsR0FBQXI4QixFQUFBLEVBQUEsTUFBQSxJQUFBdE4sS0FBQWdDLE1BQUF0QixHQUFBLElBQUFpcEMsR0FBQWw5QixFQUFBLEVBQUEsTUFBQXpNLEtBQUFnQyxNQUFBdEIsR0FBQSxJQUFBaXBDLEdBQUFubEMsRUFBQSxFQUFBLEtBRUEsQ0FRQSxZQUFBb2xDLENBQUFqNEIsRUFBQWxXLElBRUEsT0FBQSxTQUFBaUQsS0FBQWdyQyxPQUFBLzNCLEdBQUFrNEIsU0FBQSxLQUFBcnFDLE9BQUEsRUFFQSxDQVVBLE1BQUFzcUMsQ0FBQXhxQyxFQUFBcVMsRUFBQWpCLEdBQUFFLG1CQUlBRixHQUFBYyxzQkFBQW00QixHQUFBdmpDLEtBQUExSCxNQUFBaVQsR0FFQSxNQUFBckUsRUFBQXE4QixHQUFBcjhCLEVBQUFiLEVBQUFrOUIsR0FBQWw5QixFQUFBakksRUFBQW1sQyxHQUFBbmxDLEVBRUEzRCxFQUFBYixLQUFBYSxJQUFBeU0sRUFBQWIsRUFBQWpJLEdBQ0E1RCxFQUFBWixLQUFBWSxJQUFBME0sRUFBQWIsRUFBQWpJLEdBRUEsSUFBQXVsQyxFQUFBQyxFQUNBLE1BQUFDLEdBQUFycEMsRUFBQUMsR0FBQSxFQUVBLEdBQUFELElBQUFDLEVBRUFrcEMsRUFBQSxFQUNBQyxFQUFBLE1BRUEsQ0FFQSxNQUFBbGhCLEVBQUFqb0IsRUFBQUQsRUFJQSxPQUZBb3BDLEVBQUFDLEdBQUEsR0FBQW5oQixHQUFBam9CLEVBQUFELEdBQUFrb0IsR0FBQSxFQUFBam9CLEVBQUFELEdBRUFDLEdBRUEsS0FBQXlNLEVBQUF5OEIsR0FBQXQ5QixFQUFBakksR0FBQXNrQixHQUFBcmMsRUFBQWpJLEVBQUEsRUFBQSxHQUFBLE1BQ0EsS0FBQWlJLEVBQUFzOUIsR0FBQXZsQyxFQUFBOEksR0FBQXdiLEVBQUEsRUFBQSxNQUNBLEtBQUF0a0IsRUFBQXVsQyxHQUFBejhCLEVBQUFiLEdBQUFxYyxFQUFBLEVBSUFpaEIsR0FBQSxDQUVBLENBTUEsT0FKQXpxQyxFQUFBb04sRUFBQXE5QixFQUNBenFDLEVBQUFrRSxFQUFBd21DLEVBQ0ExcUMsRUFBQUksRUFBQXVxQyxFQUVBM3FDLENBRUEsQ0FTQSxNQUFBNHFDLENBQUE1cUMsRUFBQXFTLEVBQUFqQixHQUFBRSxtQkFRQSxPQU5BRixHQUFBYyxzQkFBQW00QixHQUFBdmpDLEtBQUExSCxNQUFBaVQsR0FFQXJTLEVBQUFnTyxFQUFBcThCLEdBQUFyOEIsRUFDQWhPLEVBQUFtTixFQUFBazlCLEdBQUFsOUIsRUFDQW5OLEVBQUFrRixFQUFBbWxDLEdBQUFubEMsRUFFQWxGLENBRUEsQ0FRQSxRQUFBNnFDLENBQUF4NEIsRUFBQWxXLElBRUFpVixHQUFBYyxzQkFBQW00QixHQUFBdmpDLEtBQUExSCxNQUFBaVQsR0FFQSxNQUFBckUsRUFBQXE4QixHQUFBcjhCLEVBQUFiLEVBQUFrOUIsR0FBQWw5QixFQUFBakksRUFBQW1sQyxHQUFBbmxDLEVBRUEsT0FBQW1OLElBQUFsVyxHQUdBLFNBQUFrVyxLQUFBckUsRUFBQTg4QixRQUFBLE1BQUEzOUIsRUFBQTI5QixRQUFBLE1BQUE1bEMsRUFBQTRsQyxRQUFBLE1BSUEsT0FBQXBxQyxLQUFBZ0MsTUFBQSxJQUFBc0wsTUFBQXROLEtBQUFnQyxNQUFBLElBQUF5SyxNQUFBek0sS0FBQWdDLE1BQUEsSUFBQXdDLEtBRUEsQ0FZQSxTQUFBNmxDLENBQUEzOUIsRUFBQWxKLEVBQUE5RCxHQUlBLE9BRkFoQixLQUFBb3JDLE9BQUF6QixJQUVBM3BDLEtBQUFtcUMsT0FBQVIsR0FBQTM3QixFQUFBQSxFQUFBMjdCLEdBQUE3a0MsRUFBQUEsRUFBQTZrQyxHQUFBM29DLEVBQUFBLEVBRUEsQ0FRQSxHQUFBNEcsQ0FBQXlLLEdBTUEsT0FKQXJTLEtBQUE0TyxHQUFBeUQsRUFBQXpELEVBQ0E1TyxLQUFBK04sR0FBQXNFLEVBQUF0RSxFQUNBL04sS0FBQThGLEdBQUF1TSxFQUFBdk0sRUFFQTlGLElBRUEsQ0FTQSxTQUFBNHJDLENBQUFDLEVBQUFDLEdBTUEsT0FKQTlyQyxLQUFBNE8sRUFBQWk5QixFQUFBajlCLEVBQUFrOUIsRUFBQWw5QixFQUNBNU8sS0FBQStOLEVBQUE4OUIsRUFBQTk5QixFQUFBKzlCLEVBQUEvOUIsRUFDQS9OLEtBQUE4RixFQUFBK2xDLEVBQUEvbEMsRUFBQWdtQyxFQUFBaG1DLEVBRUE5RixJQUVBLENBUUEsU0FBQTZILENBQUEvQyxHQU1BLE9BSkE5RSxLQUFBNE8sR0FBQTlKLEVBQ0E5RSxLQUFBK04sR0FBQWpKLEVBQ0E5RSxLQUFBOEYsR0FBQWhCLEVBRUE5RSxJQUVBLENBUUEsR0FBQWdJLENBQUFxSyxHQU1BLE9BSkFyUyxLQUFBNE8sRUFBQXROLEtBQUFhLElBQUEsRUFBQW5DLEtBQUE0TyxFQUFBeUQsRUFBQXpELEdBQ0E1TyxLQUFBK04sRUFBQXpNLEtBQUFhLElBQUEsRUFBQW5DLEtBQUErTixFQUFBc0UsRUFBQXRFLEdBQ0EvTixLQUFBOEYsRUFBQXhFLEtBQUFhLElBQUEsRUFBQW5DLEtBQUE4RixFQUFBdU0sRUFBQXZNLEdBRUE5RixJQUVBLENBUUEsUUFBQW1JLENBQUFrSyxHQU1BLE9BSkFyUyxLQUFBNE8sR0FBQXlELEVBQUF6RCxFQUNBNU8sS0FBQStOLEdBQUFzRSxFQUFBdEUsRUFDQS9OLEtBQUE4RixHQUFBdU0sRUFBQXZNLEVBRUE5RixJQUVBLENBUUEsY0FBQW9JLENBQUF0RCxHQU1BLE9BSkE5RSxLQUFBNE8sR0FBQTlKLEVBQ0E5RSxLQUFBK04sR0FBQWpKLEVBQ0E5RSxLQUFBOEYsR0FBQWhCLEVBRUE5RSxJQUVBLENBV0EsSUFBQXVDLENBQUE4UCxFQUFBbkksR0FNQSxPQUpBbEssS0FBQTRPLElBQUF5RCxFQUFBekQsRUFBQTVPLEtBQUE0TyxHQUFBMUUsRUFDQWxLLEtBQUErTixJQUFBc0UsRUFBQXRFLEVBQUEvTixLQUFBK04sR0FBQTdELEVBQ0FsSyxLQUFBOEYsSUFBQXVNLEVBQUF2TSxFQUFBOUYsS0FBQThGLEdBQUFvRSxFQUVBbEssSUFFQSxDQVlBLFVBQUErckMsQ0FBQUYsRUFBQUMsRUFBQTVoQyxHQU1BLE9BSkFsSyxLQUFBNE8sRUFBQWk5QixFQUFBajlCLEdBQUFrOUIsRUFBQWw5QixFQUFBaTlCLEVBQUFqOUIsR0FBQTFFLEVBQ0FsSyxLQUFBK04sRUFBQTg5QixFQUFBOTlCLEdBQUErOUIsRUFBQS85QixFQUFBODlCLEVBQUE5OUIsR0FBQTdELEVBQ0FsSyxLQUFBOEYsRUFBQStsQyxFQUFBL2xDLEdBQUFnbUMsRUFBQWhtQyxFQUFBK2xDLEVBQUEvbEMsR0FBQW9FLEVBRUFsSyxJQUVBLENBYUEsT0FBQWdzQyxDQUFBMzVCLEVBQUFuSSxHQUVBbEssS0FBQW9yQyxPQUFBekIsSUFDQXQzQixFQUFBKzRCLE9BQUF4QixJQUVBLE1BQUE1N0IsRUFBQXpMLEdBQUFvbkMsR0FBQTM3QixFQUFBNDdCLEdBQUE1N0IsRUFBQTlELEdBQ0FwRixFQUFBdkMsR0FBQW9uQyxHQUFBN2tDLEVBQUE4a0MsR0FBQTlrQyxFQUFBb0YsR0FDQWxKLEVBQUF1QixHQUFBb25DLEdBQUEzb0MsRUFBQTRvQyxHQUFBNW9DLEVBQUFrSixHQUlBLE9BRkFsSyxLQUFBbXFDLE9BQUFuOEIsRUFBQWxKLEVBQUE5RCxHQUVBaEIsSUFFQSxDQVFBLGNBQUFzekIsQ0FBQTNyQixHQU1BLE9BSkEzSCxLQUFBNE8sRUFBQWpILEVBQUFuRixFQUNBeEMsS0FBQStOLEVBQUFwRyxFQUFBbEYsRUFDQXpDLEtBQUE4RixFQUFBNkIsRUFBQTJSLEVBRUF0WixJQUVBLENBUUEsWUFBQXVJLENBQUFqRyxHQUVBLE1BQUFzTSxFQUFBNU8sS0FBQTRPLEVBQUFiLEVBQUEvTixLQUFBK04sRUFBQWpJLEVBQUE5RixLQUFBOEYsRUFDQTBDLEVBQUFsRyxFQUFBbUcsU0FNQSxPQUpBekksS0FBQTRPLEVBQUFwRyxFQUFBLEdBQUFvRyxFQUFBcEcsRUFBQSxHQUFBdUYsRUFBQXZGLEVBQUEsR0FBQTFDLEVBQ0E5RixLQUFBK04sRUFBQXZGLEVBQUEsR0FBQW9HLEVBQUFwRyxFQUFBLEdBQUF1RixFQUFBdkYsRUFBQSxHQUFBMUMsRUFDQTlGLEtBQUE4RixFQUFBMEMsRUFBQSxHQUFBb0csRUFBQXBHLEVBQUEsR0FBQXVGLEVBQUF2RixFQUFBLEdBQUExQyxFQUVBOUYsSUFFQSxDQVFBLE1BQUFzSyxDQUFBdkUsR0FFQSxPQUFBQSxFQUFBNkksSUFBQTVPLEtBQUE0TyxHQUFBN0ksRUFBQWdJLElBQUEvTixLQUFBK04sR0FBQWhJLEVBQUFELElBQUE5RixLQUFBOEYsQ0FFQSxDQVNBLFNBQUF5RSxDQUFBMUosRUFBQTJKLEVBQUEsR0FNQSxPQUpBeEssS0FBQTRPLEVBQUEvTixFQUFBMkosR0FDQXhLLEtBQUErTixFQUFBbE4sRUFBQTJKLEVBQUEsR0FDQXhLLEtBQUE4RixFQUFBakYsRUFBQTJKLEVBQUEsR0FFQXhLLElBRUEsQ0FVQSxPQUFBeUssQ0FBQTVKLEVBQUEsR0FBQTJKLEVBQUEsR0FNQSxPQUpBM0osRUFBQTJKLEdBQUF4SyxLQUFBNE8sRUFDQS9OLEVBQUEySixFQUFBLEdBQUF4SyxLQUFBK04sRUFDQWxOLEVBQUEySixFQUFBLEdBQUF4SyxLQUFBOEYsRUFFQWpGLENBRUEsQ0FTQSxtQkFBQTZKLENBQUFDLEVBQUFuSyxHQU1BLE9BSkFSLEtBQUE0TyxFQUFBakUsRUFBQUMsS0FBQXBLLEdBQ0FSLEtBQUErTixFQUFBcEQsRUFBQUUsS0FBQXJLLEdBQ0FSLEtBQUE4RixFQUFBNkUsRUFBQXFRLEtBQUF4YSxHQUVBUixJQUVBLENBUUEsTUFBQWdXLEdBRUEsT0FBQWhXLEtBQUFnckMsUUFFQSxDQUVBLEVBQUFoZ0MsT0FBQUMsa0JBRUFqTCxLQUFBNE8sUUFDQTVPLEtBQUErTixRQUNBL04sS0FBQThGLENBRUEsRUFJQSxNQUFBbWxDLEdBQUEsSUFBQW5CLEdBVUFBLEdBQUFtQyxNQUFBM0wsR0M5N0JBLElBQUE0TCxHQUFBLEVBVUEsTUFBQUMsV0FBQXhzQyxHQUtBLFdBQUFpRCxHQUVBMlUsUUFTQXZYLEtBQUFvc0MsWUFBQSxFQVNBNzRCLE9BQUFvQyxlQUFBM1YsS0FBQSxLQUFBLENBQUFpQyxNQUFBaXFDLE9BUUFsc0MsS0FBQTRWLEtBQUFuVSxLQU9BekIsS0FBQW9RLEtBQUEsR0FTQXBRLEtBQUFILEtBQUEsV0FZQUcsS0FBQXFzQyxTNUIrQ1ksRTRCdkNacnNDLEtBQUFzc0MsSzVCTVksRTRCS1p0c0MsS0FBQXVzQyxjQUFBLEVBWUF2c0MsS0FBQXdzQyxRQUFBLEVBYUF4c0MsS0FBQXlzQyxhQUFBLEVBV0F6c0MsS0FBQTBzQyxXQUFBLEVBUUExc0MsS0FBQTJzQyxTNUJnR1ksSTRCeEZaM3NDLEtBQUE0c0MsUzVCZ0dZLEk0QnhGWjVzQyxLQUFBNnNDLGM1QlFZLEk0QkFaN3NDLEtBQUE4c0MsY0FBQSxLQVFBOXNDLEtBQUErc0MsY0FBQSxLQVFBL3NDLEtBQUFndEMsbUJBQUEsS0FVQWh0QyxLQUFBaXRDLFdBQUEsSUFBQW5ELEdBQUEsRUFBQSxFQUFBLEdBVUE5cEMsS0FBQWt0QyxXQUFBLEVBUUFsdEMsS0FBQW10QyxVNUI4SVksRTRCcklabnRDLEtBQUFvdEMsV0FBQSxFQVdBcHRDLEtBQUFxdEMsWUFBQSxFQVFBcnRDLEtBQUFzdEMsaUJBQUEsSUFRQXR0QyxLQUFBdXRDLFk1QjBwQ1ksSTRCbHBDWnZ0QyxLQUFBd3RDLFdBQUEsRUFRQXh0QyxLQUFBeXRDLGdCQUFBLElBUUF6dEMsS0FBQTB0QyxZQUFBdHdDLEdBU0E0QyxLQUFBMnRDLGFBQUF2d0MsR0FTQTRDLEtBQUE0dEMsYUFBQXh3QyxHQVVBNEMsS0FBQTZ0QyxjQUFBLEVBWUE3dEMsS0FBQTh0QyxlQUFBLEtBU0E5dEMsS0FBQSt0QyxrQkFBQSxFQVNBL3RDLEtBQUFndUMsYUFBQSxFQWFBaHVDLEtBQUFpdUMsV0FBQSxLQVdBanVDLEtBQUFrdUMsWUFBQSxFQVFBbHVDLEtBQUFtdUMsVUFBQSxLQWNBbnVDLEtBQUFvdUMsZUFBQSxFQVFBcHVDLEtBQUFxdUMsb0JBQUEsRUFRQXJ1QyxLQUFBc3VDLG1CQUFBLEVBUUF0dUMsS0FBQXV1QyxXQUFBLEVBVUF2dUMsS0FBQXd1QyxpQkFBQSxFQVFBeHVDLEtBQUF5dUMsb0JBQUEsRUFjQXp1QyxLQUFBMHVDLGlCQUFBLEVBUUExdUMsS0FBQTJ1QyxlQUFBLEVBUUEzdUMsS0FBQWcyQixTQUFBLEVBV0FoMkIsS0FBQTR1QyxZQUFBLEVBUUE1dUMsS0FBQW1ZLFNBQUEsQ0FBQSxFQVNBblksS0FBQThWLFFBQUEsRUFFQTlWLEtBQUE2dUMsV0FBQSxDQUVBLENBVUEsYUFBQUMsR0FFQSxPQUFBOXVDLEtBQUE2dUMsVUFFQSxDQUVBLGFBQUFDLENBQUE3c0MsR0FFQWpDLEtBQUE2dUMsV0FBQSxHQUFBNXNDLEVBQUEsR0FFQWpDLEtBQUE4VixVQUlBOVYsS0FBQTZ1QyxXQUFBNXNDLENBRUEsQ0FjQSxjQUFBeTBCLEdBQUEsQ0FjQSxlQUFBcVksR0FBQSxDQVdBLHFCQUFBQyxHQUVBLE9BQUFodkMsS0FBQSt1QyxnQkFBQTVELFVBRUEsQ0FTQSxTQUFBOEQsQ0FBQTdSLEdBRUEsUUFBQXI5QixJQUFBcTlCLEVBRUEsSUFBQSxNQUFBQyxLQUFBRCxFQUFBLENBRUEsTUFBQThSLEVBQUE5UixFQUFBQyxHQUVBLFFBQUF0OUIsSUFBQW12QyxFQUFBLENBRUF0b0MsUUFBQUMsS0FBQSw4QkFBQXcyQiw4QkFDQSxRQUVBLENBRUEsTUFBQThSLEVBQUFudkMsS0FBQXE5QixRQUVBdDlCLElBQUFvdkMsRUFPQUEsR0FBQUEsRUFBQTlTLFFBRUE4UyxFQUFBeG9DLElBQUF1b0MsR0FFQUMsR0FBQUEsRUFBQWx0QixXQUFBaXRCLEdBQUFBLEVBQUFqdEIsVUFFQWt0QixFQUFBem5DLEtBQUF3bkMsR0FJQWx2QyxLQUFBcTlCLEdBQUE2UixFQWZBdG9DLFFBQUFDLEtBQUEsb0JBQUF3MkIsaUNBQUFyOUIsS0FBQUgsUUFtQkEsQ0FFQSxDQVNBLE1BQUFtVyxDQUFBQyxHQUVBLE1BQUFDLE9BQUFuVyxJQUFBa1csR0FBQSxpQkFBQUEsRUFFQUMsSUFFQUQsRUFBQSxDQUNBMkMsU0FBQSxDQUFBLEVBQ0F6QyxPQUFBLENBQUEsSUFLQSxNQUFBWixFQUFBLENBQ0FzRCxTQUFBLENBQ0EvQyxRQUFBLElBQ0FqVyxLQUFBLFdBQ0FpWixVQUFBLG9CQTROQSxTQUFBb2tCLEVBQUFDLEdBRUEsTUFBQUMsRUFBQSxHQUVBLElBQUEsTUFBQUMsS0FBQUYsRUFBQSxDQUVBLE1BQUE1bkIsRUFBQTRuQixFQUFBRSxVQUNBOW5CLEVBQUFzRCxTQUNBdWtCLEVBQUFoOUIsS0FBQW1WLEVBRUEsQ0FFQSxPQUFBNm5CLENBRUEsQ0FFQSxHQXZPQTduQixFQUFBSyxLQUFBNVYsS0FBQTRWLEtBQ0FMLEVBQUExVixLQUFBRyxLQUFBSCxLQUVBLEtBQUFHLEtBQUFvUSxPQUFBbUYsRUFBQW5GLEtBQUFwUSxLQUFBb1EsTUFFQXBRLEtBQUFxUyxPQUFBclMsS0FBQXFTLE1BQUFncUIsVUFBQTltQixFQUFBbEQsTUFBQXJTLEtBQUFxUyxNQUFBMjRCLGVBRUFqckMsSUFBQUMsS0FBQW92QyxZQUFBNzVCLEVBQUE2NUIsVUFBQXB2QyxLQUFBb3ZDLGdCQUNBcnZDLElBQUFDLEtBQUFxdkMsWUFBQTk1QixFQUFBODVCLFVBQUFydkMsS0FBQXF2QyxnQkFFQXR2QyxJQUFBQyxLQUFBc3ZDLFFBQUEvNUIsRUFBQSs1QixNQUFBdHZDLEtBQUFzdkMsT0FDQXR2QyxLQUFBdXZDLFlBQUF2dkMsS0FBQXV2QyxXQUFBbFQsVUFBQTltQixFQUFBZzZCLFdBQUF2dkMsS0FBQXV2QyxXQUFBdkUsZUFDQWpyQyxJQUFBQyxLQUFBd3ZDLGlCQUFBajZCLEVBQUFpNkIsZUFBQXh2QyxLQUFBd3ZDLGdCQUNBeHZDLEtBQUF5dkMsVUFBQXp2QyxLQUFBeXZDLFNBQUFwVCxVQUFBOW1CLEVBQUFrNkIsU0FBQXp2QyxLQUFBeXZDLFNBQUF6RSxlQUNBanJDLElBQUFDLEtBQUEwdkMsbUJBQUEsSUFBQTF2QyxLQUFBMHZDLG9CQUFBbjZCLEVBQUFtNkIsa0JBQUExdkMsS0FBQTB2QyxtQkFFQTF2QyxLQUFBMnZDLFVBQUEzdkMsS0FBQTJ2QyxTQUFBdFQsVUFBQTltQixFQUFBbzZCLFNBQUEzdkMsS0FBQTJ2QyxTQUFBM0UsZUFDQWpyQyxJQUFBQyxLQUFBNHZDLG9CQUFBcjZCLEVBQUFxNkIsa0JBQUE1dkMsS0FBQTR2QyxtQkFDQTV2QyxLQUFBNnZDLGVBQUE3dkMsS0FBQTZ2QyxjQUFBeFQsVUFBQTltQixFQUFBczZCLGNBQUE3dkMsS0FBQTZ2QyxjQUFBN0UsZUFDQWpyQyxJQUFBQyxLQUFBOHZDLFlBQUF2NkIsRUFBQXU2QixVQUFBOXZDLEtBQUE4dkMsZ0JBQ0EvdkMsSUFBQUMsS0FBQSt2QyxZQUFBeDZCLEVBQUF3NkIsVUFBQS92QyxLQUFBK3ZDLGdCQUNBaHdDLElBQUFDLEtBQUFnd0MscUJBQUF6NkIsRUFBQXk2QixtQkFBQWh3QyxLQUFBZ3dDLG9CQUVBaHdDLEtBQUFpd0MsY0FBQWp3QyxLQUFBaXdDLGFBQUF6NEIsWUFFQWpDLEVBQUEwNkIsYUFBQWp3QyxLQUFBaXdDLGFBQUFqNkIsT0FBQUMsR0FBQUwsTUFJQTVWLEtBQUFrd0MsdUJBQUFsd0MsS0FBQWt3QyxzQkFBQTE0QixZQUVBakMsRUFBQTI2QixzQkFBQWx3QyxLQUFBa3dDLHNCQUFBbDZCLE9BQUFDLEdBQUFMLE1BSUE1VixLQUFBbXdDLG9CQUFBbndDLEtBQUFtd0MsbUJBQUEzNEIsWUFFQWpDLEVBQUE0NkIsbUJBQUFud0MsS0FBQW13QyxtQkFBQW42QixPQUFBQyxHQUFBTCxLQUNBTCxFQUFBNjZCLHFCQUFBcHdDLEtBQUFvd0MscUJBQUEzbEMsZ0JBSUExSyxJQUFBQyxLQUFBcXdDLGFBQUE5NkIsRUFBQTg2QixXQUFBcndDLEtBQUFxd0MsaUJBRUF0d0MsSUFBQUMsS0FBQXN3QyxjQUFBLzZCLEVBQUErNkIsWUFBQXR3QyxLQUFBc3dDLGtCQUNBdndDLElBQUFDLEtBQUF1d0MsaUJBQUFoN0IsRUFBQWc3QixlQUFBdndDLEtBQUF1d0MscUJBQ0F4d0MsSUFBQUMsS0FBQXd3Qyw0QkFBQWo3QixFQUFBaTdCLDBCQUFBeHdDLEtBQUF3d0MsMkJBRUF4d0MsS0FBQXl3QyxnQkFBQXp3QyxLQUFBeXdDLGVBQUFqNUIsWUFFQWpDLEVBQUFrN0IsZUFBQXp3QyxLQUFBeXdDLGVBQUF6NkIsT0FBQUMsR0FBQUwsTUFJQTVWLEtBQUEwd0MseUJBQUExd0MsS0FBQTB3Qyx3QkFBQWw1QixZQUVBakMsRUFBQW03Qix3QkFBQTF3QyxLQUFBMHdDLHdCQUFBMTZCLE9BQUFDLEdBQUFMLFdBSUE3VixJQUFBQyxLQUFBcVgsYUFBQTlCLEVBQUE4QixXQUFBclgsS0FBQXFYLGlCQUNBdFgsSUFBQUMsS0FBQTJ3QyxxQkFBQXA3QixFQUFBbzdCLG1CQUFBM3dDLEtBQUEyd0Msb0JBRUEzd0MsS0FBQTR3QyxlQUFBNXdDLEtBQUE0d0MsY0FBQXA1QixZQUVBakMsRUFBQXE3QixjQUFBNXdDLEtBQUE0d0MsY0FBQTU2QixPQUFBQyxHQUFBTCxNQUlBNVYsS0FBQTQ2QixLQUFBNTZCLEtBQUE0NkIsSUFBQXBqQixZQUFBakMsRUFBQXFsQixJQUFBNTZCLEtBQUE0NkIsSUFBQTVrQixPQUFBQyxHQUFBTCxNQUNBNVYsS0FBQTZ3QyxRQUFBN3dDLEtBQUE2d0MsT0FBQXI1QixZQUFBakMsRUFBQXM3QixPQUFBN3dDLEtBQUE2d0MsT0FBQTc2QixPQUFBQyxHQUFBTCxNQUNBNVYsS0FBQTh3QyxVQUFBOXdDLEtBQUE4d0MsU0FBQXQ1QixZQUFBakMsRUFBQXU3QixTQUFBOXdDLEtBQUE4d0MsU0FBQTk2QixPQUFBQyxHQUFBTCxNQUVBNVYsS0FBQSt3QyxVQUFBL3dDLEtBQUErd0MsU0FBQXY1QixZQUVBakMsRUFBQXc3QixTQUFBL3dDLEtBQUErd0MsU0FBQS82QixPQUFBQyxHQUFBTCxLQUNBTCxFQUFBeTdCLGtCQUFBaHhDLEtBQUFneEMsbUJBSUFoeEMsS0FBQWl4QyxPQUFBanhDLEtBQUFpeEMsTUFBQXo1QixZQUVBakMsRUFBQTA3QixNQUFBanhDLEtBQUFpeEMsTUFBQWo3QixPQUFBQyxHQUFBTCxLQUNBTCxFQUFBMjdCLGVBQUFseEMsS0FBQWt4QyxnQkFJQWx4QyxLQUFBbXhDLFNBQUFueEMsS0FBQW14QyxRQUFBMzVCLFlBRUFqQyxFQUFBNDdCLFFBQUFueEMsS0FBQW14QyxRQUFBbjdCLE9BQUFDLEdBQUFMLEtBQ0FMLEVBQUE2N0IsVUFBQXB4QyxLQUFBb3hDLFdBSUFweEMsS0FBQXF4QyxXQUFBcnhDLEtBQUFxeEMsVUFBQTc1QixZQUVBakMsRUFBQTg3QixVQUFBcnhDLEtBQUFxeEMsVUFBQXI3QixPQUFBQyxHQUFBTCxLQUNBTCxFQUFBKzdCLGNBQUF0eEMsS0FBQXN4QyxjQUNBLzdCLEVBQUFnOEIsWUFBQXZ4QyxLQUFBdXhDLFlBQUE5bUMsV0FJQXpLLEtBQUF3eEMsaUJBQUF4eEMsS0FBQXd4QyxnQkFBQWg2QixZQUVBakMsRUFBQWk4QixnQkFBQXh4QyxLQUFBd3hDLGdCQUFBeDdCLE9BQUFDLEdBQUFMLEtBQ0FMLEVBQUFrOEIsa0JBQUF6eEMsS0FBQXl4QyxrQkFDQWw4QixFQUFBbThCLGlCQUFBMXhDLEtBQUEweEMsa0JBSUExeEMsS0FBQTJ4QyxjQUFBM3hDLEtBQUEyeEMsYUFBQW42QixZQUFBakMsRUFBQW84QixhQUFBM3hDLEtBQUEyeEMsYUFBQTM3QixPQUFBQyxHQUFBTCxNQUNBNVYsS0FBQTR4QyxjQUFBNXhDLEtBQUE0eEMsYUFBQXA2QixZQUFBakMsRUFBQXE4QixhQUFBNXhDLEtBQUE0eEMsYUFBQTU3QixPQUFBQyxHQUFBTCxNQUVBNVYsS0FBQTZ4QyxhQUFBN3hDLEtBQUE2eEMsWUFBQXI2QixZQUFBakMsRUFBQXM4QixZQUFBN3hDLEtBQUE2eEMsWUFBQTc3QixPQUFBQyxHQUFBTCxNQUNBNVYsS0FBQTh4QyxhQUFBOXhDLEtBQUE4eEMsWUFBQXQ2QixZQUFBakMsRUFBQXU4QixZQUFBOXhDLEtBQUE4eEMsWUFBQTk3QixPQUFBQyxHQUFBTCxNQUNBNVYsS0FBQSt4QyxzQkFBQS94QyxLQUFBK3hDLHFCQUFBdjZCLFlBQUFqQyxFQUFBdzhCLHFCQUFBL3hDLEtBQUEreEMscUJBQUEvN0IsT0FBQUMsR0FBQUwsTUFDQTVWLEtBQUFneUMsa0JBQUFoeUMsS0FBQWd5QyxpQkFBQXg2QixZQUFBakMsRUFBQXk4QixpQkFBQWh5QyxLQUFBZ3lDLGlCQUFBaDhCLE9BQUFDLEdBQUFMLE1BRUE1VixLQUFBaXlDLFFBQUFqeUMsS0FBQWl5QyxPQUFBejZCLFlBRUFqQyxFQUFBMDhCLE9BQUFqeUMsS0FBQWl5QyxPQUFBajhCLE9BQUFDLEdBQUFMLFVBRUE3VixJQUFBQyxLQUFBa3lDLFVBQUEzOEIsRUFBQTI4QixRQUFBbHlDLEtBQUFreUMsZUFJQW55QyxJQUFBQyxLQUFBbXlDLGlCQUFBNThCLEVBQUE0OEIsZUFBQW55QyxLQUFBbXlDLGVBQUExbkMsZ0JBQ0ExSyxJQUFBQyxLQUFBb3lDLGtCQUFBNzhCLEVBQUE2OEIsZ0JBQUFweUMsS0FBQW95QyxzQkFDQXJ5QyxJQUFBQyxLQUFBcXlDLGVBQUE5OEIsRUFBQTg4QixhQUFBcnlDLEtBQUFxeUMsbUJBQ0F0eUMsSUFBQUMsS0FBQXN5QyxrQkFBQS84QixFQUFBKzhCLGdCQUFBdHlDLEtBQUFzeUMsaUJBRUF0eUMsS0FBQXV5QyxhQUFBdnlDLEtBQUF1eUMsWUFBQS82QixZQUVBakMsRUFBQWc5QixZQUFBdnlDLEtBQUF1eUMsWUFBQXY4QixPQUFBQyxHQUFBTCxXQUlBN1YsSUFBQUMsS0FBQXd5QyxlQUFBajlCLEVBQUFpOUIsYUFBQXh5QyxLQUFBd3lDLGNBQ0F4eUMsS0FBQXl5QyxpQkFBQXp5QyxLQUFBeXlDLGdCQUFBajdCLFlBQUFqQyxFQUFBazlCLGdCQUFBenlDLEtBQUF5eUMsZ0JBQUF6OEIsT0FBQUMsR0FBQUwsV0FDQTdWLElBQUFDLEtBQUEweUMsWUFBQW45QixFQUFBbTlCLFVBQUExeUMsS0FBQTB5QyxXQUNBMXlDLEtBQUEyeUMsY0FBQTN5QyxLQUFBMnlDLGFBQUFuN0IsWUFBQWpDLEVBQUFvOUIsYUFBQTN5QyxLQUFBMnlDLGFBQUEzOEIsT0FBQUMsR0FBQUwsV0FDQTdWLElBQUFDLEtBQUE0eUMscUJBQUE1eUMsS0FBQTR5QyxzQkFBQXp0QixNQUFBNVAsRUFBQXE5QixvQkFBQTV5QyxLQUFBNHlDLDBCQUNBN3lDLElBQUFDLEtBQUE2eUMsbUJBQUF0OUIsRUFBQXM5QixpQkFBQTd5QyxLQUFBNnlDLGlCQUFBN0gsZUFFQWpyQyxJQUFBQyxLQUFBNmxCLE9BQUF0USxFQUFBc1EsS0FBQTdsQixLQUFBNmxCLE1BQ0EsT0FBQTdsQixLQUFBaXVDLGFBQUExNEIsRUFBQTA0QixXQUFBanVDLEtBQUFpdUMsaUJBQ0FsdUMsSUFBQUMsS0FBQTh5QyxrQkFBQXY5QixFQUFBdTlCLGdCQUFBOXlDLEtBQUE4eUMsaUI1QnZvQlksSTRCeW9CWjl5QyxLQUFBcXNDLFdBQUE5MkIsRUFBQTgyQixTQUFBcnNDLEtBQUFxc0MsVTVCMXFCWSxJNEIycUJacnNDLEtBQUFzc0MsT0FBQS8yQixFQUFBKzJCLEtBQUF0c0MsS0FBQXNzQyxPQUNBLElBQUF0c0MsS0FBQXVzQyxlQUFBaDNCLEVBQUFnM0IsY0FBQSxHQUVBdnNDLEtBQUF3c0MsUUFBQSxJQUFBajNCLEVBQUFpM0IsUUFBQXhzQyxLQUFBd3NDLFVBQ0EsSUFBQXhzQyxLQUFBeXNDLGNBQUFsM0IsRUFBQWszQixhQUFBLEc1QjloQlksTTRCZ2lCWnpzQyxLQUFBMnNDLFdBQUFwM0IsRUFBQW8zQixTQUFBM3NDLEtBQUEyc0MsVTVCeGhCWSxNNEJ5aEJaM3NDLEtBQUE0c0MsV0FBQXIzQixFQUFBcTNCLFNBQUE1c0MsS0FBQTRzQyxVNUJ6bUJZLE00QjBtQlo1c0MsS0FBQTZzQyxnQkFBQXQzQixFQUFBczNCLGNBQUE3c0MsS0FBQTZzQyxlQUNBLE9BQUE3c0MsS0FBQThzQyxnQkFBQXYzQixFQUFBdTNCLGNBQUE5c0MsS0FBQThzQyxlQUNBLE9BQUE5c0MsS0FBQStzQyxnQkFBQXgzQixFQUFBdzNCLGNBQUEvc0MsS0FBQStzQyxlQUNBLE9BQUEvc0MsS0FBQWd0QyxxQkFBQXozQixFQUFBeTNCLG1CQUFBaHRDLEtBQUFndEMsb0JBQ0FodEMsS0FBQWl0QyxZQUFBanRDLEtBQUFpdEMsV0FBQTVRLFVBQUE5bUIsRUFBQTAzQixXQUFBanRDLEtBQUFpdEMsV0FBQWpDLFVBQ0EsSUFBQWhyQyxLQUFBa3RDLGFBQUEzM0IsRUFBQTIzQixXQUFBbHRDLEtBQUFrdEMsWTVCcmJZLEk0QnViWmx0QyxLQUFBbXRDLFlBQUE1M0IsRUFBQTQzQixVQUFBbnRDLEtBQUFtdEMsWUFDQSxJQUFBbnRDLEtBQUFvdEMsWUFBQTczQixFQUFBNjNCLFVBQUFwdEMsS0FBQW90QyxZQUNBLElBQUFwdEMsS0FBQXF0QyxhQUFBOTNCLEVBQUE4M0IsV0FBQXJ0QyxLQUFBcXRDLGFBQ0EsSUFBQXJ0QyxLQUFBa3VDLGFBQUEzNEIsRUFBQTI0QixXQUFBbHVDLEtBQUFrdUMsWUFFQSxNQUFBbHVDLEtBQUFzdEMsbUJBQUEvM0IsRUFBQSszQixpQkFBQXR0QyxLQUFBc3RDLGtCNUJvbkJZLE00Qm5uQlp0dEMsS0FBQXV0QyxjQUFBaDRCLEVBQUFnNEIsWUFBQXZ0QyxLQUFBdXRDLGFBQ0EsSUFBQXZ0QyxLQUFBd3RDLGFBQUFqNEIsRUFBQWk0QixXQUFBeHRDLEtBQUF3dEMsWUFDQSxNQUFBeHRDLEtBQUF5dEMsa0JBQUFsNEIsRUFBQWs0QixnQkFBQXp0QyxLQUFBeXRDLGlCQUNBenRDLEtBQUEwdEMsY0FBQXR3QyxLQUFBbVksRUFBQW00QixZQUFBMXRDLEtBQUEwdEMsYUFDQTF0QyxLQUFBMnRDLGVBQUF2d0MsS0FBQW1ZLEVBQUFvNEIsYUFBQTN0QyxLQUFBMnRDLGNBQ0EzdEMsS0FBQTR0QyxlQUFBeHdDLEtBQUFtWSxFQUFBcTRCLGFBQUE1dEMsS0FBQTR0QyxlQUNBLElBQUE1dEMsS0FBQTZ0QyxlQUFBdDRCLEVBQUFzNEIsYUFBQTd0QyxLQUFBNnRDLG1CQUdBOXRDLElBQUFDLEtBQUFrUCxVQUFBLElBQUFsUCxLQUFBa1AsV0FBQXFHLEVBQUFyRyxTQUFBbFAsS0FBQWtQLFdBRUEsSUFBQWxQLEtBQUFvdUMsZ0JBQUE3NEIsRUFBQTY0QixlQUFBLEdBQ0EsSUFBQXB1QyxLQUFBcXVDLHNCQUFBOTRCLEVBQUE4NEIsb0JBQUFydUMsS0FBQXF1QyxxQkFDQSxJQUFBcnVDLEtBQUFzdUMscUJBQUEvNEIsRUFBQSs0QixtQkFBQXR1QyxLQUFBc3VDLHlCQUVBdnVDLElBQUFDLEtBQUEreUMsV0FBQSxJQUFBL3lDLEtBQUEreUMsWUFBQXg5QixFQUFBdzlCLFVBQUEveUMsS0FBQSt5QyxnQkFDQWh6QyxJQUFBQyxLQUFBZ3pDLFdBQUF6OUIsRUFBQXk5QixTQUFBaHpDLEtBQUFnekMsZUFDQWp6QyxJQUFBQyxLQUFBaXpDLFVBQUExOUIsRUFBQTA5QixRQUFBanpDLEtBQUFpekMsY0FDQWx6QyxJQUFBQyxLQUFBcVAsUUFBQWtHLEVBQUFsRyxNQUFBclAsS0FBQXFQLFFBRUEsSUFBQXJQLEtBQUF1dUMsWUFBQWg1QixFQUFBZzVCLFdBQUEsR0FFQXZ1QyxLQUFBOHVDLFVBQUEsSUFBQXY1QixFQUFBdTVCLFVBQUE5dUMsS0FBQTh1QyxZQUNBLElBQUE5dUMsS0FBQTBzQyxZQUFBbjNCLEVBQUFtM0IsV0FBQSxJQUNBLElBQUExc0MsS0FBQXd1QyxrQkFBQWo1QixFQUFBaTVCLGlCQUFBLElBQ0EsSUFBQXh1QyxLQUFBeXVDLHFCQUFBbDVCLEVBQUFrNUIsb0JBQUEsSUFDQSxJQUFBenVDLEtBQUEwdUMsa0JBQUFuNUIsRUFBQW01QixpQkFBQSxJQUVBLElBQUExdUMsS0FBQWt6QyxZQUFBMzlCLEVBQUEyOUIsV0FBQSxHQUNBbHpDLEtBQUFtekMsbUJBQUEsSUFBQTU5QixFQUFBNDlCLG1CQUFBbnpDLEtBQUFtekMsb0JBQ0EsVUFBQW56QyxLQUFBb3pDLG1CQUFBNzlCLEVBQUE2OUIsaUJBQUFwekMsS0FBQW96QyxrQkFDQSxVQUFBcHpDLEtBQUFxekMsb0JBQUE5OUIsRUFBQTg5QixrQkFBQXJ6QyxLQUFBcXpDLG9CQUVBLElBQUFyekMsS0FBQXN6QyxjQUFBLzlCLEVBQUErOUIsYUFBQSxJQUVBLElBQUF0ekMsS0FBQWcyQixVQUFBemdCLEVBQUF5Z0IsU0FBQSxJQUVBLElBQUFoMkIsS0FBQTR1QyxhQUFBcjVCLEVBQUFxNUIsWUFBQSxJQUVBLElBQUE1dUMsS0FBQXV6QyxNQUFBaCtCLEVBQUFnK0IsS0FBQSxHQUVBaGdDLE9BQUF5RixLQUFBaFosS0FBQW1ZLFVBQUFsWCxPQUFBLElBQUFzVSxFQUFBNEMsU0FBQW5ZLEtBQUFtWSxVQW9CQWpDLEVBQUEsQ0FFQSxNQUFBMEMsRUFBQXNrQixFQUFBam5CLEVBQUEyQyxVQUNBekMsRUFBQSttQixFQUFBam5CLEVBQUFFLFFBRUF5QyxFQUFBM1gsT0FBQSxJQUFBc1UsRUFBQXFELFNBQUFBLEdBQ0F6QyxFQUFBbFYsT0FBQSxJQUFBc1UsRUFBQVksT0FBQUEsRUFFQSxDQUVBLE9BQUFaLENBRUEsQ0FPQSxLQUFBOU4sR0FFQSxPQUFBLElBQUF6SCxLQUFBNEMsYUFBQThFLEtBQUExSCxLQUVBLENBUUEsSUFBQTBILENBQUErUCxHQUVBelgsS0FBQW9RLEtBQUFxSCxFQUFBckgsS0FFQXBRLEtBQUFxc0MsU0FBQTUwQixFQUFBNDBCLFNBQ0Fyc0MsS0FBQXNzQyxLQUFBNzBCLEVBQUE2MEIsS0FDQXRzQyxLQUFBdXNDLGFBQUE5MEIsRUFBQTgwQixhQUVBdnNDLEtBQUF3c0MsUUFBQS8wQixFQUFBKzBCLFFBQ0F4c0MsS0FBQXlzQyxZQUFBaDFCLEVBQUFnMUIsWUFFQXpzQyxLQUFBMnNDLFNBQUFsMUIsRUFBQWsxQixTQUNBM3NDLEtBQUE0c0MsU0FBQW4xQixFQUFBbTFCLFNBQ0E1c0MsS0FBQTZzQyxjQUFBcDFCLEVBQUFvMUIsY0FDQTdzQyxLQUFBOHNDLGNBQUFyMUIsRUFBQXExQixjQUNBOXNDLEtBQUErc0MsY0FBQXQxQixFQUFBczFCLGNBQ0Evc0MsS0FBQWd0QyxtQkFBQXYxQixFQUFBdTFCLG1CQUNBaHRDLEtBQUFpdEMsV0FBQXZsQyxLQUFBK1AsRUFBQXcxQixZQUNBanRDLEtBQUFrdEMsV0FBQXoxQixFQUFBeTFCLFdBRUFsdEMsS0FBQW10QyxVQUFBMTFCLEVBQUEwMUIsVUFDQW50QyxLQUFBb3RDLFVBQUEzMUIsRUFBQTIxQixVQUNBcHRDLEtBQUFxdEMsV0FBQTUxQixFQUFBNDFCLFdBRUFydEMsS0FBQXN0QyxpQkFBQTcxQixFQUFBNjFCLGlCQUNBdHRDLEtBQUF1dEMsWUFBQTkxQixFQUFBODFCLFlBQ0F2dEMsS0FBQXd0QyxXQUFBLzFCLEVBQUErMUIsV0FDQXh0QyxLQUFBeXRDLGdCQUFBaDJCLEVBQUFnMkIsZ0JBQ0F6dEMsS0FBQTB0QyxZQUFBajJCLEVBQUFpMkIsWUFDQTF0QyxLQUFBMnRDLGFBQUFsMkIsRUFBQWsyQixhQUNBM3RDLEtBQUE0dEMsYUFBQW4yQixFQUFBbTJCLGFBQ0E1dEMsS0FBQTZ0QyxhQUFBcDJCLEVBQUFvMkIsYUFFQSxNQUFBMkYsRUFBQS83QixFQUFBcTJCLGVBQ0EsSUFBQTJGLEVBQUEsS0FFQSxHQUFBLE9BQUFELEVBQUEsQ0FFQSxNQUFBbnhDLEVBQUFteEMsRUFBQXZ5QyxPQUNBd3lDLEVBQUEsSUFBQW45QixNQUFBalUsR0FFQSxJQUFBLElBQUF0QixFQUFBLEVBQUFBLElBQUFzQixJQUFBdEIsRUFFQTB5QyxFQUFBMXlDLEdBQUF5eUMsRUFBQXp5QyxHQUFBMEcsT0FJQSxDQThCQSxPQTVCQXpILEtBQUE4dEMsZUFBQTJGLEVBQ0F6ekMsS0FBQSt0QyxpQkFBQXQyQixFQUFBczJCLGlCQUNBL3RDLEtBQUFndUMsWUFBQXYyQixFQUFBdTJCLFlBRUFodUMsS0FBQWl1QyxXQUFBeDJCLEVBQUF3MkIsV0FFQWp1QyxLQUFBa3VDLFdBQUF6MkIsRUFBQXkyQixXQUVBbHVDLEtBQUFtdUMsVUFBQTEyQixFQUFBMDJCLFVBRUFudUMsS0FBQW91QyxjQUFBMzJCLEVBQUEyMkIsY0FDQXB1QyxLQUFBcXVDLG9CQUFBNTJCLEVBQUE0MkIsb0JBQ0FydUMsS0FBQXN1QyxtQkFBQTcyQixFQUFBNjJCLG1CQUVBdHVDLEtBQUF1dUMsVUFBQTkyQixFQUFBODJCLFVBRUF2dUMsS0FBQTh1QyxVQUFBcjNCLEVBQUFxM0IsVUFDQTl1QyxLQUFBMHNDLFVBQUFqMUIsRUFBQWkxQixVQUNBMXNDLEtBQUF3dUMsZ0JBQUEvMkIsRUFBQSsyQixnQkFDQXh1QyxLQUFBeXVDLG1CQUFBaDNCLEVBQUFnM0IsbUJBQ0F6dUMsS0FBQTB1QyxnQkFBQWozQixFQUFBaTNCLGdCQUVBMXVDLEtBQUFnMkIsUUFBQXZlLEVBQUF1ZSxRQUVBaDJCLEtBQUE0dUMsV0FBQW4zQixFQUFBbTNCLFdBRUE1dUMsS0FBQW1ZLFNBQUFNLEtBQUFDLE1BQUFELEtBQUFFLFVBQUFsQixFQUFBVSxXQUVBblksSUFFQSxDQVFBLE9BQUFpWixHQVFBalosS0FBQVUsY0FBQSxDQUFBYixLQUFBLFdBRUEsQ0FVQSxlQUFBa1csQ0FBQTlULElBRUEsSUFBQUEsR0FBQWpDLEtBQUE4VixTQUVBLENBRUEsT0FBQTQ5QixHQUVBOXNDLFFBQUFDLEtBQUEsd0NBRUEsRUMvOUJBLE1BQUE4c0MsV0FBQXhILEdBV0EsV0FBQXZwQyxDQUFBNjVCLEdBRUFsbEIsUUFTQXZYLEtBQUE0ekMscUJBQUEsRUFFQTV6QyxLQUFBSCxLQUFBLG9CQVFBRyxLQUFBcVMsTUFBQSxJQUFBeTNCLEdBQUEsVUFVQTlwQyxLQUFBNDZCLElBQUEsS0FRQTU2QixLQUFBK3dDLFNBQUEsS0FRQS93QyxLQUFBZ3hDLGtCQUFBLEVBU0FoeEMsS0FBQWl4QyxNQUFBLEtBVUFqeEMsS0FBQWt4QyxlQUFBLEVBUUFseEMsS0FBQTh4QyxZQUFBLEtBZUE5eEMsS0FBQTh3QyxTQUFBLEtBUUE5d0MsS0FBQWl5QyxPQUFBLEtBUUFqeUMsS0FBQW15QyxlQUFBLElBQUFsZixHQVdBanpCLEtBQUFreUMsUTdCMFBZLEU2QmpQWmx5QyxLQUFBcXlDLGFBQUEsRUFXQXJ5QyxLQUFBc3lDLGdCQUFBLElBUUF0eUMsS0FBQWt6QyxXQUFBLEVBVUFsekMsS0FBQW16QyxtQkFBQSxFQVVBbnpDLEtBQUFvekMsaUJBQUEsUUFVQXB6QyxLQUFBcXpDLGtCQUFBLFFBUUFyekMsS0FBQXV6QyxLQUFBLEVBRUF2ekMsS0FBQWl2QyxVQUFBeFMsRUFFQSxDQUVBLElBQUEvMEIsQ0FBQStQLEdBK0JBLE9BN0JBRixNQUFBN1AsS0FBQStQLEdBRUF6WCxLQUFBcVMsTUFBQTNLLEtBQUErUCxFQUFBcEYsT0FFQXJTLEtBQUE0NkIsSUFBQW5qQixFQUFBbWpCLElBRUE1NkIsS0FBQSt3QyxTQUFBdDVCLEVBQUFzNUIsU0FDQS93QyxLQUFBZ3hDLGtCQUFBdjVCLEVBQUF1NUIsa0JBRUFoeEMsS0FBQWl4QyxNQUFBeDVCLEVBQUF3NUIsTUFDQWp4QyxLQUFBa3hDLGVBQUF6NUIsRUFBQXk1QixlQUVBbHhDLEtBQUE4eEMsWUFBQXI2QixFQUFBcTZCLFlBRUE5eEMsS0FBQTh3QyxTQUFBcjVCLEVBQUFxNUIsU0FFQTl3QyxLQUFBaXlDLE9BQUF4NkIsRUFBQXc2QixPQUNBanlDLEtBQUFteUMsZUFBQXpxQyxLQUFBK1AsRUFBQTA2QixnQkFDQW55QyxLQUFBa3lDLFFBQUF6NkIsRUFBQXk2QixRQUNBbHlDLEtBQUFxeUMsYUFBQTU2QixFQUFBNDZCLGFBQ0FyeUMsS0FBQXN5QyxnQkFBQTc2QixFQUFBNjZCLGdCQUVBdHlDLEtBQUFrekMsVUFBQXo3QixFQUFBeTdCLFVBQ0FsekMsS0FBQW16QyxtQkFBQTE3QixFQUFBMDdCLG1CQUNBbnpDLEtBQUFvekMsaUJBQUEzN0IsRUFBQTI3QixpQkFDQXB6QyxLQUFBcXpDLGtCQUFBNTdCLEVBQUE0N0Isa0JBRUFyekMsS0FBQXV6QyxJQUFBOTdCLEVBQUE4N0IsSUFFQXZ6QyxJQUVBLEVDaFBBLE1BQUE2ekMsR0FBQUMsS0FFQSxTQUFBQSxLQUlBLE1BQUE1akMsRUFBQSxJQUFBNmpDLFlBQUEsR0FDQUMsRUFBQSxJQUFBbnhDLGFBQUFxTixHQUNBK2pDLEVBQUEsSUFBQW54QyxZQUFBb04sR0FFQWdrQyxFQUFBLElBQUFweEMsWUFBQSxLQUNBcXhDLEVBQUEsSUFBQXJ4QyxZQUFBLEtBRUEsSUFBQSxJQUFBL0IsRUFBQSxFQUFBQSxFQUFBLE1BQUFBLEVBQUEsQ0FFQSxNQUFBeUgsRUFBQXpILEVBQUEsSUFJQXlILEdBQUEsSUFFQTByQyxFQUFBbnpDLEdBQUEsRUFDQW16QyxFQUFBLElBQUFuekMsR0FBQSxNQUNBb3pDLEVBQUFwekMsR0FBQSxHQUNBb3pDLEVBQUEsSUFBQXB6QyxHQUFBLElBSUF5SCxHQUFBLElBRUEwckMsRUFBQW56QyxHQUFBLE9BQUF5SCxFQUFBLEdBQ0EwckMsRUFBQSxJQUFBbnpDLEdBQUEsT0FBQXlILEVBQUEsR0FBQSxNQUNBMnJDLEVBQUFwekMsSUFBQXlILEVBQUEsRUFDQTJyQyxFQUFBLElBQUFwekMsSUFBQXlILEVBQUEsR0FJQUEsR0FBQSxJQUVBMHJDLEVBQUFuekMsR0FBQXlILEVBQUEsSUFBQSxHQUNBMHJDLEVBQUEsSUFBQW56QyxHQUFBeUgsRUFBQSxJQUFBLEdBQUEsTUFDQTJyQyxFQUFBcHpDLEdBQUEsR0FDQW96QyxFQUFBLElBQUFwekMsR0FBQSxJQUlBeUgsRUFBQSxLQUVBMHJDLEVBQUFuekMsR0FBQSxNQUNBbXpDLEVBQUEsSUFBQW56QyxHQUFBLE1BQ0FvekMsRUFBQXB6QyxHQUFBLEdBQ0FvekMsRUFBQSxJQUFBcHpDLEdBQUEsS0FNQW16QyxFQUFBbnpDLEdBQUEsTUFDQW16QyxFQUFBLElBQUFuekMsR0FBQSxNQUNBb3pDLEVBQUFwekMsR0FBQSxHQUNBb3pDLEVBQUEsSUFBQXB6QyxHQUFBLEdBSUEsQ0FJQSxNQUFBcXpDLEVBQUEsSUFBQXR4QyxZQUFBLE1BQ0F1eEMsRUFBQSxJQUFBdnhDLFlBQUEsSUFDQXd4QyxFQUFBLElBQUF4eEMsWUFBQSxJQUVBLElBQUEsSUFBQS9CLEVBQUEsRUFBQUEsRUFBQSxPQUFBQSxFQUFBLENBRUEsSUFBQXVCLEVBQUF2QixHQUFBLEdBQ0F5SCxFQUFBLEVBR0EsT0FBQSxRQUFBbEcsSUFFQUEsSUFBQSxFQUNBa0csR0FBQSxRQUlBbEcsSUFBQSxRQUNBa0csR0FBQSxVQUVBNHJDLEVBQUFyekMsR0FBQXVCLEVBQUFrRyxDQUVBLENBRUEsSUFBQSxJQUFBekgsRUFBQSxLQUFBQSxFQUFBLE9BQUFBLEVBRUFxekMsRUFBQXJ6QyxHQUFBLFdBQUFBLEVBQUEsTUFBQSxJQUlBLElBQUEsSUFBQUEsRUFBQSxFQUFBQSxFQUFBLEtBQUFBLEVBRUFzekMsRUFBQXR6QyxHQUFBQSxHQUFBLEdBSUFzekMsRUFBQSxJQUFBLFdBQ0FBLEVBQUEsSUFBQSxXQUVBLElBQUEsSUFBQXR6QyxFQUFBLEdBQUFBLEVBQUEsS0FBQUEsRUFFQXN6QyxFQUFBdHpDLEdBQUEsWUFBQUEsRUFBQSxJQUFBLElBSUFzekMsRUFBQSxJQUFBLFdBRUEsSUFBQSxJQUFBdHpDLEVBQUEsRUFBQUEsRUFBQSxLQUFBQSxFQUVBLEtBQUFBLElBRUF1ekMsRUFBQXZ6QyxHQUFBLE1BTUEsTUFBQSxDQUNBaXpDLFVBQUFBLEVBQ0FDLFdBQUFBLEVBQ0FDLFVBQUFBLEVBQ0FDLFdBQUFBLEVBQ0FDLGNBQUFBLEVBQ0FDLGNBQUFBLEVBQ0FDLFlBQUFBLEVBR0EsQ0FTQSxTQUFBQyxHQUFBQyxHQUVBbHpDLEtBQUE2QyxJQUFBcXdDLEdBQUEsT0FBQTV0QyxRQUFBQyxLQUFBLHNEQUVBMnRDLEVBQUF4eUMsR0FBQXd5QyxHQUFBLE1BQUEsT0FFQVgsR0FBQUcsVUFBQSxHQUFBUSxFQUNBLE1BQUExbUMsRUFBQStsQyxHQUFBSSxXQUFBLEdBQ0F6ckMsRUFBQXNGLEdBQUEsR0FBQSxJQUNBLE9BQUErbEMsR0FBQUssVUFBQTFyQyxLQUFBLFFBQUFzRixJQUFBK2xDLEdBQUFNLFdBQUEzckMsR0FFQSxDQVNBLFNBQUFpc0MsR0FBQUQsR0FFQSxNQUFBbHlDLEVBQUFreUMsR0FBQSxHQUVBLE9BREFYLEdBQUFJLFdBQUEsR0FBQUosR0FBQU8sY0FBQVAsR0FBQVMsWUFBQWh5QyxJQUFBLEtBQUFreUMsSUFBQVgsR0FBQVEsY0FBQS94QyxHQUNBdXhDLEdBQUFHLFVBQUEsRUFFQSxDQU9BLE1BQUFVLEdBU0Esa0JBQUFILENBQUFDLEdBRUEsT0FBQUQsR0FBQUMsRUFFQSxDQVNBLG9CQUFBQyxDQUFBRCxHQUVBLE9BQUFDLEdBQUFELEVBRUEsRUN6TUEsTUFBQUcsR0FBQSxJQUFBM3lCLEdBQ0E0eUIsR0FBQSxJQUFBOXRDLEdBRUEsSUFBQSt0QyxHQUFBLEVBVUEsTUFBQUMsR0FTQSxXQUFBbHlDLENBQUEvQixFQUFBazBDLEVBQUFDLEdBQUEsR0FFQSxHQUFBMStCLE1BQUFDLFFBQUExVixHQUVBLE1BQUEsSUFBQW8wQyxVQUFBLHlEQVdBajFDLEtBQUFrMUMsbUJBQUEsRUFTQTNoQyxPQUFBb0MsZUFBQTNWLEtBQUEsS0FBQSxDQUFBaUMsTUFBQTR5QyxPQU9BNzBDLEtBQUFvUSxLQUFBLEdBUUFwUSxLQUFBYSxNQUFBQSxFQVNBYixLQUFBKzBDLFNBQUFBLEVBU0EvMEMsS0FBQStiLFdBQUFoYyxJQUFBYyxFQUFBQSxFQUFBSSxPQUFBOHpDLEVBQUEsRUFXQS8wQyxLQUFBZzFDLFdBQUFBLEVBV0FoMUMsS0FBQW0xQyxNQUFBeDJDLEdBUUFxQixLQUFBbzFDLGFBQUEsR0FXQXAxQyxLQUFBcTFDLFFBQUE5OEMsR0FPQXlILEtBQUE4VixRQUFBLENBRUEsQ0FNQSxnQkFBQXcvQixHQUFBLENBVUEsZUFBQXYvQixDQUFBOVQsSUFFQSxJQUFBQSxHQUFBakMsS0FBQThWLFNBRUEsQ0FRQSxRQUFBeS9CLENBQUF0ekMsR0FJQSxPQUZBakMsS0FBQW0xQyxNQUFBbHpDLEVBRUFqQyxJQUVBLENBUUEsY0FBQXcxQyxDQUFBQyxFQUFBMTVCLEdBRUEvYixLQUFBbzFDLGFBQUFoMUMsS0FBQSxDQUFBcTFDLFFBQUExNUIsU0FFQSxDQUtBLGlCQUFBMjVCLEdBRUExMUMsS0FBQW8xQyxhQUFBbjBDLE9BQUEsQ0FFQSxDQVFBLElBQUF5RyxDQUFBK1AsR0FXQSxPQVRBelgsS0FBQW9RLEtBQUFxSCxFQUFBckgsS0FDQXBRLEtBQUFhLE1BQUEsSUFBQTRXLEVBQUE1VyxNQUFBK0IsWUFBQTZVLEVBQUE1VyxPQUNBYixLQUFBKzBDLFNBQUF0OUIsRUFBQXM5QixTQUNBLzBDLEtBQUErYixNQUFBdEUsRUFBQXNFLE1BQ0EvYixLQUFBZzFDLFdBQUF2OUIsRUFBQXU5QixXQUVBaDFDLEtBQUFtMUMsTUFBQTE5QixFQUFBMDlCLE1BQ0FuMUMsS0FBQXExQyxRQUFBNTlCLEVBQUE0OUIsUUFFQXIxQyxJQUVBLENBWUEsTUFBQTIxQyxDQUFBQyxFQUFBanJDLEVBQUFrckMsR0FFQUQsR0FBQTUxQyxLQUFBKzBDLFNBQ0FjLEdBQUFsckMsRUFBQW9xQyxTQUVBLElBQUEsSUFBQWgwQyxFQUFBLEVBQUFDLEVBQUFoQixLQUFBKzBDLFNBQUFoMEMsRUFBQUMsRUFBQUQsSUFFQWYsS0FBQWEsTUFBQSswQyxFQUFBNzBDLEdBQUE0SixFQUFBOUosTUFBQWcxQyxFQUFBOTBDLEdBSUEsT0FBQWYsSUFFQSxDQVFBLFNBQUE4MUMsQ0FBQWoxQyxHQUlBLE9BRkFiLEtBQUFhLE1BQUE4RixJQUFBOUYsR0FFQWIsSUFFQSxDQVNBLFlBQUF1SSxDQUFBakcsR0FFQSxHQUFBLElBQUF0QyxLQUFBKzBDLFNBRUEsSUFBQSxJQUFBaDBDLEVBQUEsRUFBQUMsRUFBQWhCLEtBQUErYixNQUFBaGIsRUFBQUMsRUFBQUQsSUFFQTZ6QyxHQUFBbHFDLG9CQUFBMUssS0FBQWUsR0FDQTZ6QyxHQUFBcnNDLGFBQUFqRyxHQUVBdEMsS0FBQSsxQyxNQUFBaDFDLEVBQUE2ekMsR0FBQXB5QyxFQUFBb3lDLEdBQUFueUMsUUFJQSxHQUFBLElBQUF6QyxLQUFBKzBDLFNBRUEsSUFBQSxJQUFBaDBDLEVBQUEsRUFBQUMsRUFBQWhCLEtBQUErYixNQUFBaGIsRUFBQUMsRUFBQUQsSUFFQTR6QyxHQUFBanFDLG9CQUFBMUssS0FBQWUsR0FDQTR6QyxHQUFBcHNDLGFBQUFqRyxHQUVBdEMsS0FBQWcyQyxPQUFBajFDLEVBQUE0ekMsR0FBQW55QyxFQUFBbXlDLEdBQUFseUMsRUFBQWt5QyxHQUFBcjdCLEdBTUEsT0FBQXRaLElBRUEsQ0FTQSxZQUFBMlosQ0FBQXJYLEdBRUEsSUFBQSxJQUFBdkIsRUFBQSxFQUFBQyxFQUFBaEIsS0FBQStiLE1BQUFoYixFQUFBQyxFQUFBRCxJQUVBNHpDLEdBQUFqcUMsb0JBQUExSyxLQUFBZSxHQUVBNHpDLEdBQUFoN0IsYUFBQXJYLEdBRUF0QyxLQUFBZzJDLE9BQUFqMUMsRUFBQTR6QyxHQUFBbnlDLEVBQUFteUMsR0FBQWx5QyxFQUFBa3lDLEdBQUFyN0IsR0FJQSxPQUFBdFosSUFFQSxDQVNBLGlCQUFBdWlCLENBQUFqZ0IsR0FFQSxJQUFBLElBQUF2QixFQUFBLEVBQUFDLEVBQUFoQixLQUFBK2IsTUFBQWhiLEVBQUFDLEVBQUFELElBRUE0ekMsR0FBQWpxQyxvQkFBQTFLLEtBQUFlLEdBRUE0ekMsR0FBQXB5QixrQkFBQWpnQixHQUVBdEMsS0FBQWcyQyxPQUFBajFDLEVBQUE0ekMsR0FBQW55QyxFQUFBbXlDLEdBQUFseUMsRUFBQWt5QyxHQUFBcjdCLEdBSUEsT0FBQXRaLElBRUEsQ0FTQSxrQkFBQXNqQixDQUFBaGhCLEdBRUEsSUFBQSxJQUFBdkIsRUFBQSxFQUFBQyxFQUFBaEIsS0FBQStiLE1BQUFoYixFQUFBQyxFQUFBRCxJQUVBNHpDLEdBQUFqcUMsb0JBQUExSyxLQUFBZSxHQUVBNHpDLEdBQUFyeEIsbUJBQUFoaEIsR0FFQXRDLEtBQUFnMkMsT0FBQWoxQyxFQUFBNHpDLEdBQUFueUMsRUFBQW15QyxHQUFBbHlDLEVBQUFreUMsR0FBQXI3QixHQUlBLE9BQUF0WixJQUVBLENBU0EsR0FBQTJHLENBQUExRSxFQUFBdUksRUFBQSxHQUtBLE9BRkF4SyxLQUFBYSxNQUFBOEYsSUFBQTFFLEVBQUF1SSxHQUVBeEssSUFFQSxDQVNBLFlBQUF3SCxDQUFBaEgsRUFBQXkxQyxHQUVBLElBQUFoMEMsRUFBQWpDLEtBQUFhLE1BQUFMLEVBQUFSLEtBQUErMEMsU0FBQWtCLEdBSUEsT0FGQWoyQyxLQUFBZzFDLGFBQUEveUMsRUFBQVUsR0FBQVYsRUFBQWpDLEtBQUFhLFFBRUFvQixDQUVBLENBVUEsWUFBQXNGLENBQUEvRyxFQUFBeTFDLEVBQUFoMEMsR0FNQSxPQUpBakMsS0FBQWcxQyxhQUFBL3lDLEVBQUFvQixHQUFBcEIsRUFBQWpDLEtBQUFhLFFBRUFiLEtBQUFhLE1BQUFMLEVBQUFSLEtBQUErMEMsU0FBQWtCLEdBQUFoMEMsRUFFQWpDLElBRUEsQ0FRQSxJQUFBNEssQ0FBQXBLLEdBRUEsSUFBQWdDLEVBQUF4QyxLQUFBYSxNQUFBTCxFQUFBUixLQUFBKzBDLFVBSUEsT0FGQS8wQyxLQUFBZzFDLGFBQUF4eUMsRUFBQUcsR0FBQUgsRUFBQXhDLEtBQUFhLFFBRUEyQixDQUVBLENBU0EsSUFBQTZFLENBQUE3RyxFQUFBZ0MsR0FNQSxPQUpBeEMsS0FBQWcxQyxhQUFBeHlDLEVBQUFhLEdBQUFiLEVBQUF4QyxLQUFBYSxRQUVBYixLQUFBYSxNQUFBTCxFQUFBUixLQUFBKzBDLFVBQUF2eUMsRUFFQXhDLElBRUEsQ0FRQSxJQUFBNkssQ0FBQXJLLEdBRUEsSUFBQWlDLEVBQUF6QyxLQUFBYSxNQUFBTCxFQUFBUixLQUFBKzBDLFNBQUEsR0FJQSxPQUZBLzBDLEtBQUFnMUMsYUFBQXZ5QyxFQUFBRSxHQUFBRixFQUFBekMsS0FBQWEsUUFFQTRCLENBRUEsQ0FTQSxJQUFBNkUsQ0FBQTlHLEVBQUFpQyxHQU1BLE9BSkF6QyxLQUFBZzFDLGFBQUF2eUMsRUFBQVksR0FBQVosRUFBQXpDLEtBQUFhLFFBRUFiLEtBQUFhLE1BQUFMLEVBQUFSLEtBQUErMEMsU0FBQSxHQUFBdHlDLEVBRUF6QyxJQUVBLENBUUEsSUFBQWdiLENBQUF4YSxHQUVBLElBQUE4WSxFQUFBdFosS0FBQWEsTUFBQUwsRUFBQVIsS0FBQSswQyxTQUFBLEdBSUEsT0FGQS8wQyxLQUFBZzFDLGFBQUExN0IsRUFBQTNXLEdBQUEyVyxFQUFBdFosS0FBQWEsUUFFQXlZLENBRUEsQ0FTQSxJQUFBRyxDQUFBalosRUFBQThZLEdBTUEsT0FKQXRaLEtBQUFnMUMsYUFBQTE3QixFQUFBalcsR0FBQWlXLEVBQUF0WixLQUFBYSxRQUVBYixLQUFBYSxNQUFBTCxFQUFBUixLQUFBKzBDLFNBQUEsR0FBQXo3QixFQUVBdFosSUFFQSxDQVFBLElBQUFpYixDQUFBemEsR0FFQSxJQUFBK1ksRUFBQXZaLEtBQUFhLE1BQUFMLEVBQUFSLEtBQUErMEMsU0FBQSxHQUlBLE9BRkEvMEMsS0FBQWcxQyxhQUFBejdCLEVBQUE1VyxHQUFBNFcsRUFBQXZaLEtBQUFhLFFBRUEwWSxDQUVBLENBU0EsSUFBQUcsQ0FBQWxaLEVBQUErWSxHQU1BLE9BSkF2WixLQUFBZzFDLGFBQUF6N0IsRUFBQWxXLEdBQUFrVyxFQUFBdlosS0FBQWEsUUFFQWIsS0FBQWEsTUFBQUwsRUFBQVIsS0FBQSswQyxTQUFBLEdBQUF4N0IsRUFFQXZaLElBRUEsQ0FVQSxLQUFBKzFDLENBQUF2MUMsRUFBQWdDLEVBQUFDLEdBY0EsT0FaQWpDLEdBQUFSLEtBQUErMEMsU0FFQS8wQyxLQUFBZzFDLGFBRUF4eUMsRUFBQWEsR0FBQWIsRUFBQXhDLEtBQUFhLE9BQ0E0QixFQUFBWSxHQUFBWixFQUFBekMsS0FBQWEsUUFJQWIsS0FBQWEsTUFBQUwsRUFBQSxHQUFBZ0MsRUFDQXhDLEtBQUFhLE1BQUFMLEVBQUEsR0FBQWlDLEVBRUF6QyxJQUVBLENBV0EsTUFBQWcyQyxDQUFBeDFDLEVBQUFnQyxFQUFBQyxFQUFBNlcsR0FnQkEsT0FkQTlZLEdBQUFSLEtBQUErMEMsU0FFQS8wQyxLQUFBZzFDLGFBRUF4eUMsRUFBQWEsR0FBQWIsRUFBQXhDLEtBQUFhLE9BQ0E0QixFQUFBWSxHQUFBWixFQUFBekMsS0FBQWEsT0FDQXlZLEVBQUFqVyxHQUFBaVcsRUFBQXRaLEtBQUFhLFFBSUFiLEtBQUFhLE1BQUFMLEVBQUEsR0FBQWdDLEVBQ0F4QyxLQUFBYSxNQUFBTCxFQUFBLEdBQUFpQyxFQUNBekMsS0FBQWEsTUFBQUwsRUFBQSxHQUFBOFksRUFFQXRaLElBRUEsQ0FZQSxPQUFBazJDLENBQUExMUMsRUFBQWdDLEVBQUFDLEVBQUE2VyxFQUFBQyxHQWtCQSxPQWhCQS9ZLEdBQUFSLEtBQUErMEMsU0FFQS8wQyxLQUFBZzFDLGFBRUF4eUMsRUFBQWEsR0FBQWIsRUFBQXhDLEtBQUFhLE9BQ0E0QixFQUFBWSxHQUFBWixFQUFBekMsS0FBQWEsT0FDQXlZLEVBQUFqVyxHQUFBaVcsRUFBQXRaLEtBQUFhLE9BQ0EwWSxFQUFBbFcsR0FBQWtXLEVBQUF2WixLQUFBYSxRQUlBYixLQUFBYSxNQUFBTCxFQUFBLEdBQUFnQyxFQUNBeEMsS0FBQWEsTUFBQUwsRUFBQSxHQUFBaUMsRUFDQXpDLEtBQUFhLE1BQUFMLEVBQUEsR0FBQThZLEVBQ0F0WixLQUFBYSxNQUFBTCxFQUFBLEdBQUErWSxFQUVBdlosSUFFQSxDQVVBLFFBQUFtMkMsQ0FBQXAwQixHQUlBLE9BRkEvaEIsS0FBQXMxQyxpQkFBQXZ6QixFQUVBL2hCLElBRUEsQ0FPQSxLQUFBeUgsR0FFQSxPQUFBLElBQUF6SCxLQUFBNEMsWUFBQTVDLEtBQUFhLE1BQUFiLEtBQUErMEMsVUFBQXJ0QyxLQUFBMUgsS0FFQSxDQU9BLE1BQUFnVyxHQUVBLE1BQUFULEVBQUEsQ0FDQXcvQixTQUFBLzBDLEtBQUErMEMsU0FDQWwxQyxLQUFBRyxLQUFBYSxNQUFBK0IsWUFBQXdOLEtBQ0F2UCxNQUFBeVYsTUFBQUksS0FBQTFXLEtBQUFhLE9BQ0FtMEMsV0FBQWgxQyxLQUFBZzFDLFlBTUEsTUFIQSxLQUFBaDFDLEtBQUFvUSxPQUFBbUYsRUFBQW5GLEtBQUFwUSxLQUFBb1EsTUFDQXBRLEtBQUFtMUMsUUFBQXgyQyxLQUFBNFcsRUFBQTQvQixNQUFBbjFDLEtBQUFtMUMsT0FFQTUvQixDQUVBLEVBVUEsTUFBQTZnQyxXQUFBdEIsR0FTQSxXQUFBbHlDLENBQUEvQixFQUFBazBDLEVBQUFDLEdBRUF6OUIsTUFBQSxJQUFBcFUsVUFBQXRDLEdBQUFrMEMsRUFBQUMsRUFFQSxFQVVBLE1BQUFxQixXQUFBdkIsR0FTQSxXQUFBbHlDLENBQUEvQixFQUFBazBDLEVBQUFDLEdBRUF6OUIsTUFBQSxJQUFBdlUsV0FBQW5DLEdBQUFrMEMsRUFBQUMsRUFFQSxFQVVBLE1BQUFzQixXQUFBeEIsR0FTQSxXQUFBbHlDLENBQUEvQixFQUFBazBDLEVBQUFDLEdBRUF6OUIsTUFBQSxJQUFBeEgsa0JBQUFsUCxHQUFBazBDLEVBQUFDLEVBRUEsRUFVQSxNQUFBdUIsV0FBQXpCLEdBU0EsV0FBQWx5QyxDQUFBL0IsRUFBQWswQyxFQUFBQyxHQUVBejlCLE1BQUEsSUFBQXJVLFdBQUFyQyxHQUFBazBDLEVBQUFDLEVBRUEsRUFVQSxNQUFBd0IsV0FBQTFCLEdBU0EsV0FBQWx5QyxDQUFBL0IsRUFBQWswQyxFQUFBQyxHQUVBejlCLE1BQUEsSUFBQXhVLFlBQUFsQyxHQUFBazBDLEVBQUFDLEVBRUEsRUFVQSxNQUFBeUIsV0FBQTNCLEdBU0EsV0FBQWx5QyxDQUFBL0IsRUFBQWswQyxFQUFBQyxHQUVBejlCLE1BQUEsSUFBQXRVLFdBQUFwQyxHQUFBazBDLEVBQUFDLEVBRUEsRUFVQSxNQUFBMEIsV0FBQTVCLEdBU0EsV0FBQWx5QyxDQUFBL0IsRUFBQWswQyxFQUFBQyxHQUVBejlCLE1BQUEsSUFBQXpVLFlBQUFqQyxHQUFBazBDLEVBQUFDLEVBRUEsRUFhQSxNQUFBMkIsV0FBQTdCLEdBU0EsV0FBQWx5QyxDQUFBL0IsRUFBQWswQyxFQUFBQyxHQUVBejlCLE1BQUEsSUFBQXhVLFlBQUFsQyxHQUFBazBDLEVBQUFDLEdBRUFoMUMsS0FBQTQyQywwQkFBQSxDQUVBLENBRUEsSUFBQWhzQyxDQUFBcEssR0FFQSxJQUFBZ0MsRUFBQWl5QyxHQUFBejBDLEtBQUFhLE1BQUFMLEVBQUFSLEtBQUErMEMsV0FJQSxPQUZBLzBDLEtBQUFnMUMsYUFBQXh5QyxFQUFBRyxHQUFBSCxFQUFBeEMsS0FBQWEsUUFFQTJCLENBRUEsQ0FFQSxJQUFBNkUsQ0FBQTdHLEVBQUFnQyxHQU1BLE9BSkF4QyxLQUFBZzFDLGFBQUF4eUMsRUFBQWEsR0FBQWIsRUFBQXhDLEtBQUFhLFFBRUFiLEtBQUFhLE1BQUFMLEVBQUFSLEtBQUErMEMsVUFBQVIsR0FBQS94QyxHQUVBeEMsSUFFQSxDQUVBLElBQUE2SyxDQUFBckssR0FFQSxJQUFBaUMsRUFBQWd5QyxHQUFBejBDLEtBQUFhLE1BQUFMLEVBQUFSLEtBQUErMEMsU0FBQSxJQUlBLE9BRkEvMEMsS0FBQWcxQyxhQUFBdnlDLEVBQUFFLEdBQUFGLEVBQUF6QyxLQUFBYSxRQUVBNEIsQ0FFQSxDQUVBLElBQUE2RSxDQUFBOUcsRUFBQWlDLEdBTUEsT0FKQXpDLEtBQUFnMUMsYUFBQXZ5QyxFQUFBWSxHQUFBWixFQUFBekMsS0FBQWEsUUFFQWIsS0FBQWEsTUFBQUwsRUFBQVIsS0FBQSswQyxTQUFBLEdBQUFSLEdBQUE5eEMsR0FFQXpDLElBRUEsQ0FFQSxJQUFBZ2IsQ0FBQXhhLEdBRUEsSUFBQThZLEVBQUFtN0IsR0FBQXowQyxLQUFBYSxNQUFBTCxFQUFBUixLQUFBKzBDLFNBQUEsSUFJQSxPQUZBLzBDLEtBQUFnMUMsYUFBQTE3QixFQUFBM1csR0FBQTJXLEVBQUF0WixLQUFBYSxRQUVBeVksQ0FFQSxDQUVBLElBQUFHLENBQUFqWixFQUFBOFksR0FNQSxPQUpBdFosS0FBQWcxQyxhQUFBMTdCLEVBQUFqVyxHQUFBaVcsRUFBQXRaLEtBQUFhLFFBRUFiLEtBQUFhLE1BQUFMLEVBQUFSLEtBQUErMEMsU0FBQSxHQUFBUixHQUFBajdCLEdBRUF0WixJQUVBLENBRUEsSUFBQWliLENBQUF6YSxHQUVBLElBQUErWSxFQUFBazdCLEdBQUF6MEMsS0FBQWEsTUFBQUwsRUFBQVIsS0FBQSswQyxTQUFBLElBSUEsT0FGQS8wQyxLQUFBZzFDLGFBQUF6N0IsRUFBQTVXLEdBQUE0VyxFQUFBdlosS0FBQWEsUUFFQTBZLENBRUEsQ0FFQSxJQUFBRyxDQUFBbFosRUFBQStZLEdBTUEsT0FKQXZaLEtBQUFnMUMsYUFBQXo3QixFQUFBbFcsR0FBQWtXLEVBQUF2WixLQUFBYSxRQUVBYixLQUFBYSxNQUFBTCxFQUFBUixLQUFBKzBDLFNBQUEsR0FBQVIsR0FBQWg3QixHQUVBdlosSUFFQSxDQUVBLEtBQUErMUMsQ0FBQXYxQyxFQUFBZ0MsRUFBQUMsR0FjQSxPQVpBakMsR0FBQVIsS0FBQSswQyxTQUVBLzBDLEtBQUFnMUMsYUFFQXh5QyxFQUFBYSxHQUFBYixFQUFBeEMsS0FBQWEsT0FDQTRCLEVBQUFZLEdBQUFaLEVBQUF6QyxLQUFBYSxRQUlBYixLQUFBYSxNQUFBTCxFQUFBLEdBQUErekMsR0FBQS94QyxHQUNBeEMsS0FBQWEsTUFBQUwsRUFBQSxHQUFBK3pDLEdBQUE5eEMsR0FFQXpDLElBRUEsQ0FFQSxNQUFBZzJDLENBQUF4MUMsRUFBQWdDLEVBQUFDLEVBQUE2VyxHQWdCQSxPQWRBOVksR0FBQVIsS0FBQSswQyxTQUVBLzBDLEtBQUFnMUMsYUFFQXh5QyxFQUFBYSxHQUFBYixFQUFBeEMsS0FBQWEsT0FDQTRCLEVBQUFZLEdBQUFaLEVBQUF6QyxLQUFBYSxPQUNBeVksRUFBQWpXLEdBQUFpVyxFQUFBdFosS0FBQWEsUUFJQWIsS0FBQWEsTUFBQUwsRUFBQSxHQUFBK3pDLEdBQUEveEMsR0FDQXhDLEtBQUFhLE1BQUFMLEVBQUEsR0FBQSt6QyxHQUFBOXhDLEdBQ0F6QyxLQUFBYSxNQUFBTCxFQUFBLEdBQUErekMsR0FBQWo3QixHQUVBdFosSUFFQSxDQUVBLE9BQUFrMkMsQ0FBQTExQyxFQUFBZ0MsRUFBQUMsRUFBQTZXLEVBQUFDLEdBa0JBLE9BaEJBL1ksR0FBQVIsS0FBQSswQyxTQUVBLzBDLEtBQUFnMUMsYUFFQXh5QyxFQUFBYSxHQUFBYixFQUFBeEMsS0FBQWEsT0FDQTRCLEVBQUFZLEdBQUFaLEVBQUF6QyxLQUFBYSxPQUNBeVksRUFBQWpXLEdBQUFpVyxFQUFBdFosS0FBQWEsT0FDQTBZLEVBQUFsVyxHQUFBa1csRUFBQXZaLEtBQUFhLFFBSUFiLEtBQUFhLE1BQUFMLEVBQUEsR0FBQSt6QyxHQUFBL3hDLEdBQ0F4QyxLQUFBYSxNQUFBTCxFQUFBLEdBQUErekMsR0FBQTl4QyxHQUNBekMsS0FBQWEsTUFBQUwsRUFBQSxHQUFBK3pDLEdBQUFqN0IsR0FDQXRaLEtBQUFhLE1BQUFMLEVBQUEsR0FBQSt6QyxHQUFBaDdCLEdBRUF2WixJQUVBLEVBVUEsTUFBQTYyQyxXQUFBL0IsR0FTQSxXQUFBbHlDLENBQUEvQixFQUFBazBDLEVBQUFDLEdBRUF6OUIsTUFBQSxJQUFBMVUsYUFBQWhDLEdBQUFrMEMsRUFBQUMsRUFFQSxFQ3QvQkEsSUFBQThCLEdBQUEsRUFFQSxNQUFBQyxHQUFBLElBQUFwcEIsR0FDQXFwQixHQUFBLElBQUE3aEIsR0FDQThoQixHQUFBLElBQUFqMUIsR0FDQWsxQixHQUFBLElBQUFoeUIsR0FDQWl5QixHQUFBLElBQUFqeUIsR0FDQWt5QixHQUFBLElBQUFwMUIsR0E0QkEsTUFBQXExQixXQUFBMTNDLEdBS0EsV0FBQWlELEdBRUEyVSxRQVNBdlgsS0FBQXMzQyxrQkFBQSxFQVNBL2pDLE9BQUFvQyxlQUFBM1YsS0FBQSxLQUFBLENBQUFpQyxNQUFBNjBDLE9BUUE5MkMsS0FBQTRWLEtBQUFuVSxLQU9BekIsS0FBQW9RLEtBQUEsR0FDQXBRLEtBQUFILEtBQUEsaUJBWUFHLEtBQUFRLE1BQUEsS0FXQVIsS0FBQXUzQyxTQUFBLEtBU0F2M0MsS0FBQXczQyxXQUFBLENBQUEsRUFVQXgzQyxLQUFBeTNDLGdCQUFBLENBQUEsRUFVQXozQyxLQUFBMDNDLHNCQUFBLEVBYUExM0MsS0FBQTIzQyxPQUFBLEdBUUEzM0MsS0FBQWtuQixZQUFBLEtBUUFsbkIsS0FBQWs4QixlQUFBLEtBUUFsOEIsS0FBQTQzQyxVQUFBLENBQUFuQyxNQUFBLEVBQUExNUIsTUFBQW9KLEtBUUFubEIsS0FBQW1ZLFNBQUEsQ0FBQSxDQUVBLENBT0EsUUFBQTAvQixHQUVBLE9BQUE3M0MsS0FBQVEsS0FFQSxDQVFBLFFBQUFzM0MsQ0FBQXQzQyxHQVlBLE9BVkE4VixNQUFBQyxRQUFBL1YsR0FFQVIsS0FBQVEsTUFBQSxJQUFBcVAsR0FBQXJQLEdBQUFrMkMsR0FBQUYsSUFBQWgyQyxFQUFBLEdBSUFSLEtBQUFRLE1BQUFBLEVBSUFSLElBRUEsQ0FRQSxXQUFBKzNDLENBQUFSLEdBSUEsT0FGQXYzQyxLQUFBdTNDLFNBQUFBLEVBRUF2M0MsSUFFQSxDQU9BLFdBQUFnNEMsR0FFQSxPQUFBaDRDLEtBQUF1M0MsUUFFQSxDQVNBLFlBQUF6d0IsQ0FBQTFXLEdBRUEsT0FBQXBRLEtBQUF3M0MsV0FBQXBuQyxFQUVBLENBU0EsWUFBQTZuQyxDQUFBN25DLEVBQUF6RixHQUlBLE9BRkEzSyxLQUFBdzNDLFdBQUFwbkMsR0FBQXpGLEVBRUEzSyxJQUVBLENBUUEsZUFBQWs0QyxDQUFBOW5DLEdBSUEsY0FGQXBRLEtBQUF3M0MsV0FBQXBuQyxHQUVBcFEsSUFFQSxDQVFBLFlBQUFtNEMsQ0FBQS9uQyxHQUVBLFlBQUFyUSxJQUFBQyxLQUFBdzNDLFdBQUFwbkMsRUFFQSxDQVVBLFFBQUFnb0MsQ0FBQTNDLEVBQUExNUIsRUFBQXM4QixFQUFBLEdBRUFyNEMsS0FBQTIzQyxPQUFBdjNDLEtBQUEsQ0FFQXExQyxNQUFBQSxFQUNBMTVCLE1BQUFBLEVBQ0FzOEIsY0FBQUEsR0FJQSxDQUtBLFdBQUFDLEdBRUF0NEMsS0FBQTIzQyxPQUFBLEVBRUEsQ0FTQSxZQUFBWSxDQUFBOUMsRUFBQTE1QixHQUVBL2IsS0FBQTQzQyxVQUFBbkMsTUFBQUEsRUFDQXoxQyxLQUFBNDNDLFVBQUE3N0IsTUFBQUEsQ0FFQSxDQVFBLFlBQUFwQyxDQUFBL0osR0FFQSxNQUFBNGhCLEVBQUF4eEIsS0FBQXczQyxXQUFBaG1CLGNBRUF6eEIsSUFBQXl4QixJQUVBQSxFQUFBN1gsYUFBQS9KLEdBRUE0aEIsRUFBQXpiLGFBQUEsR0FJQSxNQUFBb08sRUFBQW5rQixLQUFBdzNDLFdBQUFyekIsT0FFQSxRQUFBcGtCLElBQUFva0IsRUFBQSxDQUVBLE1BQUF3UixHQUFBLElBQUF6cUIsSUFBQXVELGdCQUFBbUIsR0FFQXVVLEVBQUE1QixrQkFBQW9ULEdBRUF4UixFQUFBcE8sYUFBQSxDQUVBLENBRUEsTUFBQXlpQyxFQUFBeDRDLEtBQUF3M0MsV0FBQWdCLFFBc0JBLFlBcEJBejRDLElBQUF5NEMsSUFFQUEsRUFBQWwxQixtQkFBQTFULEdBRUE0b0MsRUFBQXppQyxhQUFBLEdBSUEsT0FBQS9WLEtBQUFrbkIsYUFFQWxuQixLQUFBbW5CLHFCQUlBLE9BQUFubkIsS0FBQWs4QixnQkFFQWw4QixLQUFBeTRDLHdCQUlBejRDLElBRUEsQ0FRQSxlQUFBb2lCLENBQUF4YyxHQU1BLE9BSkFteEMsR0FBQXhuQiwyQkFBQTNwQixHQUVBNUYsS0FBQTJaLGFBQUFvOUIsSUFFQS8yQyxJQUVBLENBVUEsT0FBQWszQixDQUFBNXRCLEdBUUEsT0FKQXl0QyxHQUFBL2xCLGNBQUExbkIsR0FFQXRKLEtBQUEyWixhQUFBbzlCLElBRUEvMkMsSUFFQSxDQVVBLE9BQUFtM0IsQ0FBQTd0QixHQVFBLE9BSkF5dEMsR0FBQTlsQixjQUFBM25CLEdBRUF0SixLQUFBMlosYUFBQW85QixJQUVBLzJDLElBRUEsQ0FVQSxPQUFBbzNCLENBQUE5dEIsR0FRQSxPQUpBeXRDLEdBQUE3bEIsY0FBQTVuQixHQUVBdEosS0FBQTJaLGFBQUFvOUIsSUFFQS8yQyxJQUVBLENBWUEsU0FBQTBQLENBQUFsTixFQUFBQyxFQUFBNlcsR0FRQSxPQUpBeTlCLEdBQUFwbkMsZ0JBQUFuTixFQUFBQyxFQUFBNlcsR0FFQXRaLEtBQUEyWixhQUFBbzlCLElBRUEvMkMsSUFFQSxDQVlBLEtBQUFxUCxDQUFBN00sRUFBQUMsRUFBQTZXLEdBUUEsT0FKQXk5QixHQUFBeG5DLFVBQUEvTSxFQUFBQyxFQUFBNlcsR0FFQXRaLEtBQUEyWixhQUFBbzlCLElBRUEvMkMsSUFFQSxDQVVBLE1BQUFpckIsQ0FBQXhFLEdBUUEsT0FOQXV3QixHQUFBL3JCLE9BQUF4RSxHQUVBdXdCLEdBQUF4K0IsZUFFQXhZLEtBQUEyWixhQUFBcTlCLEdBQUFwbkMsUUFFQTVQLElBRUEsQ0FPQSxNQUFBK0ssR0FRQSxPQU5BL0ssS0FBQW1uQixxQkFFQW5uQixLQUFBa25CLFlBQUFiLFVBQUE0d0IsSUFBQWp1QyxTQUVBaEosS0FBQTBQLFVBQUF1bkMsR0FBQXowQyxFQUFBeTBDLEdBQUF4MEMsRUFBQXcwQyxHQUFBMzlCLEdBRUF0WixJQUVBLENBYUEsYUFBQTBsQixDQUFBQyxHQUVBLE1BQUFrQixFQUFBN21CLEtBQUE4bUIsYUFBQSxZQUVBLFFBQUEvbUIsSUFBQThtQixFQUFBLENBRUEsTUFBQTJLLEVBQUEsR0FFQSxJQUFBLElBQUF6d0IsRUFBQSxFQUFBQyxFQUFBMmtCLEVBQUExa0IsT0FBQUYsRUFBQUMsRUFBQUQsSUFBQSxDQUVBLE1BQUF3bEIsRUFBQVosRUFBQTVrQixHQUNBeXdCLEVBQUFweEIsS0FBQW1tQixFQUFBL2pCLEVBQUErakIsRUFBQTlqQixFQUFBOGpCLEVBQUFqTixHQUFBLEVBRUEsQ0FFQXRaLEtBQUFpNEMsYUFBQSxXQUFBLElBQUFwQixHQUFBcmxCLEVBQUEsR0FFQSxLQUFBLENBRUEsTUFBQXh3QixFQUFBTSxLQUFBWSxJQUFBeWpCLEVBQUExa0IsT0FBQTRsQixFQUFBOUssT0FFQSxJQUFBLElBQUFoYixFQUFBLEVBQUFBLEVBQUFDLEVBQUFELElBQUEsQ0FFQSxNQUFBd2xCLEVBQUFaLEVBQUE1a0IsR0FDQThsQixFQUFBbXZCLE9BQUFqMUMsRUFBQXdsQixFQUFBL2pCLEVBQUErakIsRUFBQTlqQixFQUFBOGpCLEVBQUFqTixHQUFBLEVBRUEsQ0FFQXFNLEVBQUExa0IsT0FBQTRsQixFQUFBOUssT0FFQW5WLFFBQUFDLEtBQUEsMEdBSUFnZ0IsRUFBQTlRLGFBQUEsQ0FFQSxDQUVBLE9BQUEvVixJQUVBLENBT0Esa0JBQUFtbkIsR0FFQSxPQUFBbm5CLEtBQUFrbkIsY0FFQWxuQixLQUFBa25CLFlBQUEsSUFBQWhDLElBSUEsTUFBQXNNLEVBQUF4eEIsS0FBQXczQyxXQUFBaG1CLFNBQ0FrbkIsRUFBQTE0QyxLQUFBeTNDLGdCQUFBam1CLFNBRUEsR0FBQUEsR0FBQUEsRUFBQW1uQixvQkFTQSxPQVBBL3hDLFFBQUFteEIsTUFBQSwrRkFBQS8zQixXQUVBQSxLQUFBa25CLFlBQUF2Z0IsSUFDQSxJQUFBcWIsSUFBQW1ELEtBQUFBLEtBQUFBLEtBQ0EsSUFBQW5ELEdBQUFtRCxJQUFBQSxJQUFBQSxNQU9BLFFBQUFwbEIsSUFBQXl4QixHQU1BLEdBSkF4eEIsS0FBQWtuQixZQUFBekIsdUJBQUErTCxHQUlBa25CLEVBRUEsSUFBQSxJQUFBMzNDLEVBQUEsRUFBQXFiLEVBQUFzOEIsRUFBQXozQyxPQUFBRixFQUFBcWIsRUFBQXJiLElBQUEsQ0FFQSxNQUFBNjNDLEVBQUFGLEVBQUEzM0MsR0FDQW0yQyxHQUFBenhCLHVCQUFBbXpCLEdBRUE1NEMsS0FBQTAzQyxzQkFFQU4sR0FBQXR2QyxXQUFBOUgsS0FBQWtuQixZQUFBaGxCLElBQUFnMUMsR0FBQWgxQyxLQUNBbEMsS0FBQWtuQixZQUFBM0IsY0FBQTZ4QixJQUVBQSxHQUFBdHZDLFdBQUE5SCxLQUFBa25CLFlBQUEva0IsSUFBQSswQyxHQUFBLzBDLEtBQ0FuQyxLQUFBa25CLFlBQUEzQixjQUFBNnhCLE1BSUFwM0MsS0FBQWtuQixZQUFBM0IsY0FBQTJ4QixHQUFBaDFDLEtBQ0FsQyxLQUFBa25CLFlBQUEzQixjQUFBMnhCLEdBQUEvMEMsS0FJQSxPQU1BbkMsS0FBQWtuQixZQUFBNUIsYUFJQTZILE1BQUFudEIsS0FBQWtuQixZQUFBaGxCLElBQUFNLElBQUEycUIsTUFBQW50QixLQUFBa25CLFlBQUFobEIsSUFBQU8sSUFBQTBxQixNQUFBbnRCLEtBQUFrbkIsWUFBQWhsQixJQUFBb1gsS0FFQTFTLFFBQUFteEIsTUFBQSxzSUFBQS8zQixLQUlBLENBT0EscUJBQUF5NEMsR0FFQSxPQUFBejRDLEtBQUFrOEIsaUJBRUFsOEIsS0FBQWs4QixlQUFBLElBQUF0UyxJQUlBLE1BQUE0SCxFQUFBeHhCLEtBQUF3M0MsV0FBQWhtQixTQUNBa25CLEVBQUExNEMsS0FBQXkzQyxnQkFBQWptQixTQUVBLEdBQUFBLEdBQUFBLEVBQUFtbkIsb0JBTUEsT0FKQS94QyxRQUFBbXhCLE1BQUEscUdBQUEvM0IsV0FFQUEsS0FBQWs4QixlQUFBdjFCLElBQUEsSUFBQXFiLEdBQUFtRCxLQU1BLEdBQUFxTSxFQUFBLENBSUEsTUFBQXptQixFQUFBL0ssS0FBQWs4QixlQUFBbnhCLE9BTUEsR0FKQW1zQyxHQUFBenhCLHVCQUFBK0wsR0FJQWtuQixFQUVBLElBQUEsSUFBQTMzQyxFQUFBLEVBQUFxYixFQUFBczhCLEVBQUF6M0MsT0FBQUYsRUFBQXFiLEVBQUFyYixJQUFBLENBRUEsTUFBQTYzQyxFQUFBRixFQUFBMzNDLEdBQ0FvMkMsR0FBQTF4Qix1QkFBQW16QixHQUVBNTRDLEtBQUEwM0Msc0JBRUFOLEdBQUF0dkMsV0FBQW92QyxHQUFBaDFDLElBQUFpMUMsR0FBQWoxQyxLQUNBZzFDLEdBQUEzeEIsY0FBQTZ4QixJQUVBQSxHQUFBdHZDLFdBQUFvdkMsR0FBQS8wQyxJQUFBZzFDLEdBQUFoMUMsS0FDQSswQyxHQUFBM3hCLGNBQUE2eEIsTUFJQUYsR0FBQTN4QixjQUFBNHhCLEdBQUFqMUMsS0FDQWcxQyxHQUFBM3hCLGNBQUE0eEIsR0FBQWgxQyxLQUlBLENBSUErMEMsR0FBQTd3QixVQUFBdGIsR0FLQSxJQUFBZ2YsRUFBQSxFQUVBLElBQUEsSUFBQWhwQixFQUFBLEVBQUFxYixFQUFBb1YsRUFBQXpWLE1BQUFoYixFQUFBcWIsRUFBQXJiLElBRUFxMkMsR0FBQTFzQyxvQkFBQThtQixFQUFBendCLEdBRUFncEIsRUFBQXpvQixLQUFBYSxJQUFBNG5CLEVBQUFoZixFQUFBbEIsa0JBQUF1dEMsS0FNQSxHQUFBc0IsRUFFQSxJQUFBLElBQUEzM0MsRUFBQSxFQUFBcWIsRUFBQXM4QixFQUFBejNDLE9BQUFGLEVBQUFxYixFQUFBcmIsSUFBQSxDQUVBLE1BQUE2M0MsRUFBQUYsRUFBQTMzQyxHQUNBMjJDLEVBQUExM0MsS0FBQTAzQyxxQkFFQSxJQUFBLElBQUFydUIsRUFBQSxFQUFBd3ZCLEVBQUFELEVBQUE3OEIsTUFBQXNOLEVBQUF3dkIsRUFBQXh2QixJQUVBK3RCLEdBQUExc0Msb0JBQUFrdUMsRUFBQXZ2QixHQUVBcXVCLElBRUFULEdBQUF2c0Msb0JBQUE4bUIsRUFBQW5JLEdBQ0ErdEIsR0FBQXh2QyxJQUFBcXZDLEtBSUFsdEIsRUFBQXpvQixLQUFBYSxJQUFBNG5CLEVBQUFoZixFQUFBbEIsa0JBQUF1dEMsSUFJQSxDQUlBcDNDLEtBQUFrOEIsZUFBQTNYLE9BQUFqakIsS0FBQThILEtBQUEyZ0IsR0FFQW9ELE1BQUFudEIsS0FBQWs4QixlQUFBM1gsU0FFQTNkLFFBQUFteEIsTUFBQSwrSEFBQS8zQixLQUlBLENBRUEsQ0FTQSxlQUFBODRDLEdBRUEsTUFBQXQ0QyxFQUFBUixLQUFBUSxNQUNBZzNDLEVBQUF4M0MsS0FBQXczQyxXQUtBLEdBQUEsT0FBQWgzQyxRQUNBVCxJQUFBeTNDLEVBQUFobUIsZUFDQXp4QixJQUFBeTNDLEVBQUFyekIsYUFDQXBrQixJQUFBeTNDLEVBQUFyK0IsR0FHQSxZQURBdlMsUUFBQW14QixNQUFBLGdIQUtBLE1BQUFsUixFQUFBMndCLEVBQUFobUIsU0FDQXVuQixFQUFBdkIsRUFBQXJ6QixPQUNBNjBCLEVBQUF4QixFQUFBcitCLElBRUEsSUFBQW5aLEtBQUFtNEMsYUFBQSxZQUVBbjRDLEtBQUFpNEMsYUFBQSxVQUFBLElBQUFuRCxHQUFBLElBQUFqeUMsYUFBQSxFQUFBZ2tCLEVBQUE5SyxPQUFBLElBSUEsTUFBQWs5QixFQUFBajVDLEtBQUE4bUIsYUFBQSxXQUVBb3lCLEVBQUEsR0FBQUMsRUFBQSxHQUVBLElBQUEsSUFBQXA0QyxFQUFBLEVBQUFBLEVBQUE4bEIsRUFBQTlLLE1BQUFoYixJQUVBbTRDLEVBQUFuNEMsR0FBQSxJQUFBaWhCLEdBQ0FtM0IsRUFBQXA0QyxHQUFBLElBQUFpaEIsR0FJQSxNQUFBbzNCLEVBQUEsSUFBQXAzQixHQUNBcTNCLEVBQUEsSUFBQXIzQixHQUNBczNCLEVBQUEsSUFBQXQzQixHQUVBdTNCLEVBQUEsSUFBQXp5QyxHQUNBMHlDLEVBQUEsSUFBQTF5QyxHQUNBMnlDLEVBQUEsSUFBQTN5QyxHQUVBNHlDLEVBQUEsSUFBQTEzQixHQUNBMjNCLEVBQUEsSUFBQTMzQixHQUVBLFNBQUE0M0IsRUFBQS96QyxFQUFBQyxFQUFBQyxHQUVBcXpDLEVBQUExdUMsb0JBQUFtYyxFQUFBaGhCLEdBQ0F3ekMsRUFBQTN1QyxvQkFBQW1jLEVBQUEvZ0IsR0FDQXd6QyxFQUFBNXVDLG9CQUFBbWMsRUFBQTlnQixHQUVBd3pDLEVBQUE3dUMsb0JBQUFzdUMsRUFBQW56QyxHQUNBMnpDLEVBQUE5dUMsb0JBQUFzdUMsRUFBQWx6QyxHQUNBMnpDLEVBQUEvdUMsb0JBQUFzdUMsRUFBQWp6QyxHQUVBc3pDLEVBQUFyeEMsSUFBQW94QyxHQUNBRSxFQUFBdHhDLElBQUFveEMsR0FFQUksRUFBQXh4QyxJQUFBdXhDLEdBQ0FFLEVBQUF6eEMsSUFBQXV4QyxHQUVBLE1BQUEzcUMsRUFBQSxHQUFBNHFDLEVBQUFoM0MsRUFBQWkzQyxFQUFBaDNDLEVBQUFnM0MsRUFBQWozQyxFQUFBZzNDLEVBQUEvMkMsR0FJQW8zQyxTQUFBanJDLEtBRUE4cUMsRUFBQWh5QyxLQUFBMnhDLEdBQUFqeEMsZUFBQXF4QyxFQUFBaDNDLEdBQUFzRixnQkFBQXV4QyxHQUFBRSxFQUFBLzJDLEdBQUEyRixlQUFBd0csR0FDQStxQyxFQUFBanlDLEtBQUE0eEMsR0FBQWx4QyxlQUFBb3hDLEVBQUFoM0MsR0FBQXVGLGdCQUFBc3hDLEdBQUFJLEVBQUFqM0MsR0FBQTRGLGVBQUF3RyxHQUVBc3FDLEVBQUFyekMsR0FBQStCLElBQUE4eEMsR0FDQVIsRUFBQXB6QyxHQUFBOEIsSUFBQTh4QyxHQUNBUixFQUFBbnpDLEdBQUE2QixJQUFBOHhDLEdBRUFQLEVBQUF0ekMsR0FBQStCLElBQUEreEMsR0FDQVIsRUFBQXJ6QyxHQUFBOEIsSUFBQSt4QyxHQUNBUixFQUFBcHpDLEdBQUE2QixJQUFBK3hDLEdBRUEsQ0FFQSxJQUFBaEMsRUFBQTMzQyxLQUFBMjNDLE9BRUEsSUFBQUEsRUFBQTEyQyxTQUVBMDJDLEVBQUEsQ0FBQSxDQUNBbEMsTUFBQSxFQUNBMTVCLE1BQUF2YixFQUFBdWIsU0FLQSxJQUFBLElBQUFoYixFQUFBLEVBQUFxYixFQUFBdTdCLEVBQUExMkMsT0FBQUYsRUFBQXFiLElBQUFyYixFQUFBLENBRUEsTUFBQSs0QyxFQUFBbkMsRUFBQTUyQyxHQUVBMDBDLEVBQUFxRSxFQUFBckUsTUFHQSxJQUFBLElBQUFwc0IsRUFBQW9zQixFQUFBb0QsRUFBQXBELEVBRkFxRSxFQUFBLzlCLE1BRUFzTixFQUFBd3ZCLEVBQUF4dkIsR0FBQSxFQUVBdXdCLEVBQ0FwNUMsRUFBQW9LLEtBQUF5ZSxFQUFBLEdBQ0E3b0IsRUFBQW9LLEtBQUF5ZSxFQUFBLEdBQ0E3b0IsRUFBQW9LLEtBQUF5ZSxFQUFBLEdBS0EsQ0FFQSxNQUFBN2EsRUFBQSxJQUFBd1QsR0FBQSszQixFQUFBLElBQUEvM0IsR0FDQTNmLEVBQUEsSUFBQTJmLEdBQUFnNEIsRUFBQSxJQUFBaDRCLEdBRUEsU0FBQWk0QixFQUFBdHlDLEdBRUF0RixFQUFBcUksb0JBQUFxdUMsRUFBQXB4QyxHQUNBcXlDLEVBQUF0eUMsS0FBQXJGLEdBRUEsTUFBQUssRUFBQXcyQyxFQUFBdnhDLEdBSUE2RyxFQUFBOUcsS0FBQWhGLEdBQ0E4TCxFQUFBeEcsSUFBQTNGLEVBQUErRixlQUFBL0YsRUFBQTRHLElBQUF2RyxLQUFBVyxZQUlBMDJDLEVBQUF4MkIsYUFBQXkyQixFQUFBdDNDLEdBQ0EsTUFDQTZXLEVBREF3Z0MsRUFBQTl3QyxJQUFBa3dDLEVBQUF4eEMsSUFDQSxHQUFBLEVBQUEsRUFFQXN4QyxFQUFBL0MsUUFBQXZ1QyxFQUFBNkcsRUFBQWhNLEVBQUFnTSxFQUFBL0wsRUFBQStMLEVBQUE4SyxFQUFBQyxFQUVBLENBRUEsSUFBQSxJQUFBeFksRUFBQSxFQUFBcWIsRUFBQXU3QixFQUFBMTJDLE9BQUFGLEVBQUFxYixJQUFBcmIsRUFBQSxDQUVBLE1BQUErNEMsRUFBQW5DLEVBQUE1MkMsR0FFQTAwQyxFQUFBcUUsRUFBQXJFLE1BR0EsSUFBQSxJQUFBcHNCLEVBQUFvc0IsRUFBQW9ELEVBQUFwRCxFQUZBcUUsRUFBQS85QixNQUVBc04sRUFBQXd2QixFQUFBeHZCLEdBQUEsRUFFQTR3QixFQUFBejVDLEVBQUFvSyxLQUFBeWUsRUFBQSxJQUNBNHdCLEVBQUF6NUMsRUFBQW9LLEtBQUF5ZSxFQUFBLElBQ0E0d0IsRUFBQXo1QyxFQUFBb0ssS0FBQXllLEVBQUEsR0FJQSxDQUVBLENBUUEsb0JBQUE2d0IsR0FFQSxNQUFBMTVDLEVBQUFSLEtBQUFRLE1BQ0FxbUIsRUFBQTdtQixLQUFBOG1CLGFBQUEsWUFFQSxRQUFBL21CLElBQUE4bUIsRUFBQSxDQUVBLElBQUFreUIsRUFBQS80QyxLQUFBOG1CLGFBQUEsVUFFQSxRQUFBL21CLElBQUFnNUMsRUFFQUEsRUFBQSxJQUFBakUsR0FBQSxJQUFBanlDLGFBQUEsRUFBQWdrQixFQUFBOUssT0FBQSxHQUNBL2IsS0FBQWk0QyxhQUFBLFNBQUFjLFFBTUEsSUFBQSxJQUFBaDRDLEVBQUEsRUFBQXFiLEVBQUEyOEIsRUFBQWg5QixNQUFBaGIsRUFBQXFiLEVBQUFyYixJQUVBZzRDLEVBQUEvQyxPQUFBajFDLEVBQUEsRUFBQSxFQUFBLEdBTUEsTUFBQW81QyxFQUFBLElBQUFuNEIsR0FBQW80QixFQUFBLElBQUFwNEIsR0FBQXE0QixFQUFBLElBQUFyNEIsR0FDQXM0QixFQUFBLElBQUF0NEIsR0FBQXU0QixFQUFBLElBQUF2NEIsR0FBQXc0QixFQUFBLElBQUF4NEIsR0FDQXk0QixFQUFBLElBQUF6NEIsR0FBQTA0QixFQUFBLElBQUExNEIsR0FJQSxHQUFBeGhCLEVBRUEsSUFBQSxJQUFBTyxFQUFBLEVBQUFxYixFQUFBNWIsRUFBQXViLE1BQUFoYixFQUFBcWIsRUFBQXJiLEdBQUEsRUFBQSxDQUVBLE1BQUFxNEMsRUFBQTU0QyxFQUFBb0ssS0FBQTdKLEVBQUEsR0FDQXM0QyxFQUFBNzRDLEVBQUFvSyxLQUFBN0osRUFBQSxHQUNBdTRDLEVBQUE5NEMsRUFBQW9LLEtBQUE3SixFQUFBLEdBRUFvNUMsRUFBQXp2QyxvQkFBQW1jLEVBQUF1eUIsR0FDQWdCLEVBQUExdkMsb0JBQUFtYyxFQUFBd3lCLEdBQ0FnQixFQUFBM3ZDLG9CQUFBbWMsRUFBQXl5QixHQUVBbUIsRUFBQXZ5QyxXQUFBbXlDLEVBQUFELEdBQ0FNLEVBQUF4eUMsV0FBQWl5QyxFQUFBQyxHQUNBSyxFQUFBdnhDLE1BQUF3eEMsR0FFQUosRUFBQTV2QyxvQkFBQXF1QyxFQUFBSyxHQUNBbUIsRUFBQTd2QyxvQkFBQXF1QyxFQUFBTSxHQUNBbUIsRUFBQTl2QyxvQkFBQXF1QyxFQUFBTyxHQUVBZ0IsRUFBQTF5QyxJQUFBNnlDLEdBQ0FGLEVBQUEzeUMsSUFBQTZ5QyxHQUNBRCxFQUFBNXlDLElBQUE2eUMsR0FFQTFCLEVBQUEvQyxPQUFBb0QsRUFBQWtCLEVBQUE5M0MsRUFBQTgzQyxFQUFBNzNDLEVBQUE2M0MsRUFBQWhoQyxHQUNBeS9CLEVBQUEvQyxPQUFBcUQsRUFBQWtCLEVBQUEvM0MsRUFBQSszQyxFQUFBOTNDLEVBQUE4M0MsRUFBQWpoQyxHQUNBeS9CLEVBQUEvQyxPQUFBc0QsRUFBQWtCLEVBQUFoNEMsRUFBQWc0QyxFQUFBLzNDLEVBQUErM0MsRUFBQWxoQyxFQUVBLE1BTUEsSUFBQSxJQUFBdlksRUFBQSxFQUFBcWIsRUFBQXlLLEVBQUE5SyxNQUFBaGIsRUFBQXFiLEVBQUFyYixHQUFBLEVBRUFvNUMsRUFBQXp2QyxvQkFBQW1jLEVBQUE5bEIsRUFBQSxHQUNBcTVDLEVBQUExdkMsb0JBQUFtYyxFQUFBOWxCLEVBQUEsR0FDQXM1QyxFQUFBM3ZDLG9CQUFBbWMsRUFBQTlsQixFQUFBLEdBRUEwNUMsRUFBQXZ5QyxXQUFBbXlDLEVBQUFELEdBQ0FNLEVBQUF4eUMsV0FBQWl5QyxFQUFBQyxHQUNBSyxFQUFBdnhDLE1BQUF3eEMsR0FFQTNCLEVBQUEvQyxPQUFBajFDLEVBQUEsRUFBQTA1QyxFQUFBajRDLEVBQUFpNEMsRUFBQWg0QyxFQUFBZzRDLEVBQUFuaEMsR0FDQXkvQixFQUFBL0MsT0FBQWoxQyxFQUFBLEVBQUEwNUMsRUFBQWo0QyxFQUFBaTRDLEVBQUFoNEMsRUFBQWc0QyxFQUFBbmhDLEdBQ0F5L0IsRUFBQS9DLE9BQUFqMUMsRUFBQSxFQUFBMDVDLEVBQUFqNEMsRUFBQWk0QyxFQUFBaDRDLEVBQUFnNEMsRUFBQW5oQyxHQU1BdFosS0FBQTI2QyxtQkFFQTVCLEVBQUFoakMsYUFBQSxDQUVBLENBRUEsQ0FNQSxnQkFBQTRrQyxHQUVBLE1BQUFDLEVBQUE1NkMsS0FBQXczQyxXQUFBcnpCLE9BRUEsSUFBQSxJQUFBcGpCLEVBQUEsRUFBQXFiLEVBQUF3K0IsRUFBQTcrQixNQUFBaGIsRUFBQXFiLEVBQUFyYixJQUVBcTJDLEdBQUExc0Msb0JBQUFrd0MsRUFBQTc1QyxHQUVBcTJDLEdBQUEvekMsWUFFQXUzQyxFQUFBNUUsT0FBQWoxQyxFQUFBcTJDLEdBQUE1MEMsRUFBQTQwQyxHQUFBMzBDLEVBQUEyMEMsR0FBQTk5QixFQUlBLENBUUEsWUFBQXVoQyxHQUVBLFNBQUFDLEVBQUFud0MsRUFBQW93QyxHQUVBLE1BQUFsNkMsRUFBQThKLEVBQUE5SixNQUNBazBDLEVBQUFwcUMsRUFBQW9xQyxTQUNBQyxFQUFBcnFDLEVBQUFxcUMsV0FFQWdHLEVBQUEsSUFBQW42QyxFQUFBK0IsWUFBQW00QyxFQUFBOTVDLE9BQUE4ekMsR0FFQSxJQUFBdjBDLEVBQUEsRUFBQXExQyxFQUFBLEVBRUEsSUFBQSxJQUFBOTBDLEVBQUEsRUFBQUMsRUFBQSs1QyxFQUFBOTVDLE9BQUFGLEVBQUFDLEVBQUFELElBQUEsQ0FJQVAsRUFGQW1LLEVBQUFzd0MsNkJBRUFGLEVBQUFoNkMsR0FBQTRKLEVBQUE0SyxLQUFBMmxDLE9BQUF2d0MsRUFBQUgsT0FJQXV3QyxFQUFBaDZDLEdBQUFnMEMsRUFJQSxJQUFBLElBQUExckIsRUFBQSxFQUFBQSxFQUFBMHJCLEVBQUExckIsSUFFQTJ4QixFQUFBbkYsS0FBQWgxQyxFQUFBTCxJQUlBLENBRUEsT0FBQSxJQUFBczBDLEdBQUFrRyxFQUFBakcsRUFBQUMsRUFFQSxDQUlBLEdBQUEsT0FBQWgxQyxLQUFBUSxNQUdBLE9BREFvRyxRQUFBQyxLQUFBLCtFQUNBN0csS0FJQSxNQUFBbTdDLEVBQUEsSUFBQTlELEdBRUEwRCxFQUFBLzZDLEtBQUFRLE1BQUFLLE1BQ0EyMkMsRUFBQXgzQyxLQUFBdzNDLFdBSUEsSUFBQSxNQUFBcG5DLEtBQUFvbkMsRUFBQSxDQUVBLE1BRUE0RCxFQUFBTixFQUZBdEQsRUFBQXBuQyxHQUVBMnFDLEdBRUFJLEVBQUFsRCxhQUFBN25DLEVBQUFnckMsRUFFQSxDQUlBLE1BQUEzRCxFQUFBejNDLEtBQUF5M0MsZ0JBRUEsSUFBQSxNQUFBcm5DLEtBQUFxbkMsRUFBQSxDQUVBLE1BQUE0RCxFQUFBLEdBQ0F6QyxFQUFBbkIsRUFBQXJuQyxHQUVBLElBQUEsSUFBQXJQLEVBQUEsRUFBQXFiLEVBQUF3OEIsRUFBQTMzQyxPQUFBRixFQUFBcWIsRUFBQXJiLElBQUEsQ0FFQSxNQUVBcTZDLEVBQUFOLEVBRkFsQyxFQUFBNzNDLEdBRUFnNkMsR0FFQU0sRUFBQWo3QyxLQUFBZzdDLEVBRUEsQ0FFQUQsRUFBQTFELGdCQUFBcm5DLEdBQUFpckMsQ0FFQSxDQUVBRixFQUFBekQscUJBQUExM0MsS0FBQTAzQyxxQkFJQSxNQUFBQyxFQUFBMzNDLEtBQUEyM0MsT0FFQSxJQUFBLElBQUE1MkMsRUFBQSxFQUFBQyxFQUFBMjJDLEVBQUExMkMsT0FBQUYsRUFBQUMsRUFBQUQsSUFBQSxDQUVBLE1BQUErNEMsRUFBQW5DLEVBQUE1MkMsR0FDQW82QyxFQUFBL0MsU0FBQTBCLEVBQUFyRSxNQUFBcUUsRUFBQS85QixNQUFBKzlCLEVBQUF6QixjQUVBLENBRUEsT0FBQThDLENBRUEsQ0FPQSxNQUFBbmxDLEdBRUEsTUFBQVQsRUFBQSxDQUNBc0QsU0FBQSxDQUNBL0MsUUFBQSxJQUNBalcsS0FBQSxpQkFDQWlaLFVBQUEsMEJBV0EsR0FMQXZELEVBQUFLLEtBQUE1VixLQUFBNFYsS0FDQUwsRUFBQTFWLEtBQUFHLEtBQUFILEtBQ0EsS0FBQUcsS0FBQW9RLE9BQUFtRixFQUFBbkYsS0FBQXBRLEtBQUFvUSxNQUNBbUQsT0FBQXlGLEtBQUFoWixLQUFBbVksVUFBQWxYLE9BQUEsSUFBQXNVLEVBQUE0QyxTQUFBblksS0FBQW1ZLGVBRUFwWSxJQUFBQyxLQUFBeThCLFdBQUEsQ0FFQSxNQUFBQSxFQUFBejhCLEtBQUF5OEIsV0FFQSxJQUFBLE1BQUFZLEtBQUFaLE9BRUExOEIsSUFBQTA4QixFQUFBWSxLQUFBOW5CLEVBQUE4bkIsR0FBQVosRUFBQVksSUFJQSxPQUFBOW5CLENBRUEsQ0FJQUEsRUFBQUEsS0FBQSxDQUFBaWlDLFdBQUEsQ0FBQSxHQUVBLE1BQUFoM0MsRUFBQVIsS0FBQVEsTUFFQSxPQUFBQSxJQUVBK1UsRUFBQUEsS0FBQS9VLE1BQUEsQ0FDQVgsS0FBQVcsRUFBQUssTUFBQStCLFlBQUF3TixLQUNBdlAsTUFBQXlWLE1BQUF2UCxVQUFBakcsTUFBQUksS0FBQVYsRUFBQUssU0FLQSxNQUFBMjJDLEVBQUF4M0MsS0FBQXczQyxXQUVBLElBQUEsTUFBQW5hLEtBQUFtYSxFQUFBLENBRUEsTUFBQTdzQyxFQUFBNnNDLEVBQUFuYSxHQUVBOW5CLEVBQUFBLEtBQUFpaUMsV0FBQW5hLEdBQUExeUIsRUFBQXFMLE9BQUFULEVBQUFBLEtBRUEsQ0FFQSxNQUFBa2lDLEVBQUEsQ0FBQSxFQUNBLElBQUE2RCxHQUFBLEVBRUEsSUFBQSxNQUFBamUsS0FBQXI5QixLQUFBeTNDLGdCQUFBLENBRUEsTUFBQThELEVBQUF2N0MsS0FBQXkzQyxnQkFBQXBhLEdBRUF4OEIsRUFBQSxHQUVBLElBQUEsSUFBQUUsRUFBQSxFQUFBcWIsRUFBQW0vQixFQUFBdDZDLE9BQUFGLEVBQUFxYixFQUFBcmIsSUFBQSxDQUVBLE1BQUE0SixFQUFBNHdDLEVBQUF4NkMsR0FFQUYsRUFBQVQsS0FBQXVLLEVBQUFxTCxPQUFBVCxFQUFBQSxNQUVBLENBRUExVSxFQUFBSSxPQUFBLElBRUF3MkMsRUFBQXBhLEdBQUF4OEIsRUFFQXk2QyxHQUFBLEVBSUEsQ0FFQUEsSUFFQS9sQyxFQUFBQSxLQUFBa2lDLGdCQUFBQSxFQUNBbGlDLEVBQUFBLEtBQUFtaUMscUJBQUExM0MsS0FBQTAzQyxzQkFJQSxNQUFBQyxFQUFBMzNDLEtBQUEyM0MsT0FFQUEsRUFBQTEyQyxPQUFBLElBRUFzVSxFQUFBQSxLQUFBb2lDLE9BQUFsL0IsS0FBQUMsTUFBQUQsS0FBQUUsVUFBQWcvQixLQUlBLE1BQUF6YixFQUFBbDhCLEtBQUFrOEIsZUFXQSxPQVRBLE9BQUFBLElBRUEzbUIsRUFBQUEsS0FBQTJtQixlQUFBLENBQ0FueEIsT0FBQW14QixFQUFBbnhCLE9BQUFOLFVBQ0E4WixPQUFBMlgsRUFBQTNYLFNBS0FoUCxDQUVBLENBT0EsS0FBQTlOLEdBRUEsT0FBQSxJQUFBekgsS0FBQTRDLGFBQUE4RSxLQUFBMUgsS0FFQSxDQVFBLElBQUEwSCxDQUFBK1AsR0FJQXpYLEtBQUFRLE1BQUEsS0FDQVIsS0FBQXczQyxXQUFBLENBQUEsRUFDQXgzQyxLQUFBeTNDLGdCQUFBLENBQUEsRUFDQXozQyxLQUFBMjNDLE9BQUEsR0FDQTMzQyxLQUFBa25CLFlBQUEsS0FDQWxuQixLQUFBazhCLGVBQUEsS0FJQSxNQUFBM21CLEVBQUEsQ0FBQSxFQUlBdlYsS0FBQW9RLEtBQUFxSCxFQUFBckgsS0FJQSxNQUFBNVAsRUFBQWlYLEVBQUFqWCxNQUVBLE9BQUFBLEdBRUFSLEtBQUE4M0MsU0FBQXQzQyxFQUFBaUgsU0FNQSxNQUFBK3ZDLEVBQUEvL0IsRUFBQSsvQixXQUVBLElBQUEsTUFBQXBuQyxLQUFBb25DLEVBQUEsQ0FFQSxNQUFBN3NDLEVBQUE2c0MsRUFBQXBuQyxHQUNBcFEsS0FBQWk0QyxhQUFBN25DLEVBQUF6RixFQUFBbEQsTUFBQThOLEdBRUEsQ0FJQSxNQUFBa2lDLEVBQUFoZ0MsRUFBQWdnQyxnQkFFQSxJQUFBLE1BQUFybkMsS0FBQXFuQyxFQUFBLENBRUEsTUFBQTUyQyxFQUFBLEdBQ0ErM0MsRUFBQW5CLEVBQUFybkMsR0FFQSxJQUFBLElBQUFyUCxFQUFBLEVBQUFDLEVBQUE0M0MsRUFBQTMzQyxPQUFBRixFQUFBQyxFQUFBRCxJQUVBRixFQUFBVCxLQUFBdzRDLEVBQUE3M0MsR0FBQTBHLE1BQUE4TixJQUlBdlYsS0FBQXkzQyxnQkFBQXJuQyxHQUFBdlAsQ0FFQSxDQUVBYixLQUFBMDNDLHFCQUFBamdDLEVBQUFpZ0MscUJBSUEsTUFBQUMsRUFBQWxnQyxFQUFBa2dDLE9BRUEsSUFBQSxJQUFBNTJDLEVBQUEsRUFBQUMsRUFBQTIyQyxFQUFBMTJDLE9BQUFGLEVBQUFDLEVBQUFELElBQUEsQ0FFQSxNQUFBKzRDLEVBQUFuQyxFQUFBNTJDLEdBQ0FmLEtBQUFvNEMsU0FBQTBCLEVBQUFyRSxNQUFBcUUsRUFBQS85QixNQUFBKzlCLEVBQUF6QixjQUVBLENBSUEsTUFBQW54QixFQUFBelAsRUFBQXlQLFlBRUEsT0FBQUEsSUFFQWxuQixLQUFBa25CLFlBQUFBLEVBQUF6ZixTQU1BLE1BQUF5MEIsRUFBQXprQixFQUFBeWtCLGVBaUJBLE9BZkEsT0FBQUEsSUFFQWw4QixLQUFBazhCLGVBQUFBLEVBQUF6MEIsU0FNQXpILEtBQUE0M0MsVUFBQW5DLE1BQUFoK0IsRUFBQW1nQyxVQUFBbkMsTUFDQXoxQyxLQUFBNDNDLFVBQUE3N0IsTUFBQXRFLEVBQUFtZ0MsVUFBQTc3QixNQUlBL2IsS0FBQW1ZLFNBQUFWLEVBQUFVLFNBRUFuWSxJQUVBLENBUUEsT0FBQWlaLEdBRUFqWixLQUFBVSxjQUFBLENBQUFiLEtBQUEsV0FFQSxFQ3o1Q0EsTUFBQTI3QyxHQUFBLElBQUE3dEIsR0FDQTh0QixHQUFBLElBQUE3d0IsR0FDQTh3QixHQUFBLElBQUE5eEIsR0FDQSt4QixHQUFBLElBQUEzNUIsR0FFQTQ1QixHQUFBLElBQUE1NUIsR0FDQTY1QixHQUFBLElBQUE3NUIsR0FDQTg1QixHQUFBLElBQUE5NUIsR0FFQSs1QixHQUFBLElBQUEvNUIsR0FDQWc2QixHQUFBLElBQUFoNkIsR0FFQWk2QixHQUFBLElBQUFqNkIsR0FDQWs2QixHQUFBLElBQUFsNkIsR0FjQSxNQUFBbTZCLFdBQUFobkIsR0FRQSxXQUFBdnlCLENBQUFna0IsRUFBQSxJQUFBeXdCLEdBQUF0YSxFQUFBLElBQUE0VyxJQUVBcDhCLFFBU0F2WCxLQUFBZ25CLFFBQUEsRUFFQWhuQixLQUFBSCxLQUFBLE9BT0FHLEtBQUE0bUIsU0FBQUEsRUFRQTVtQixLQUFBKzhCLFNBQUFBLEVBVUEvOEIsS0FBQW84QywyQkFBQXI4QyxFQVVBQyxLQUFBcThDLDJCQUFBdDhDLEVBRUFDLEtBQUFzOEMsb0JBRUEsQ0FFQSxJQUFBNTBDLENBQUErUCxFQUFBNmxCLEdBbUJBLE9BakJBL2xCLE1BQUE3UCxLQUFBK1AsRUFBQTZsQixRQUVBdjlCLElBQUEwWCxFQUFBNGtDLHdCQUVBcjhDLEtBQUFxOEMsc0JBQUE1a0MsRUFBQTRrQyxzQkFBQXY3QyxjQUlBZixJQUFBMFgsRUFBQTJrQyx3QkFFQXA4QyxLQUFBbzhDLHNCQUFBN29DLE9BQUFDLE9BQUEsQ0FBQSxFQUFBaUUsRUFBQTJrQyx3QkFJQXA4QyxLQUFBKzhCLFNBQUF6bUIsTUFBQUMsUUFBQWtCLEVBQUFzbEIsVUFBQXRsQixFQUFBc2xCLFNBQUFqOEIsUUFBQTJXLEVBQUFzbEIsU0FDQS84QixLQUFBNG1CLFNBQUFuUCxFQUFBbVAsU0FFQTVtQixJQUVBLENBTUEsa0JBQUFzOEMsR0FFQSxNQUVBN0UsRUFGQXozQyxLQUFBNG1CLFNBRUE2d0IsZ0JBQ0F6K0IsRUFBQXpGLE9BQUF5RixLQUFBeStCLEdBRUEsR0FBQXorQixFQUFBL1gsT0FBQSxFQUFBLENBRUEsTUFBQTIzQyxFQUFBbkIsRUFBQXorQixFQUFBLElBRUEsUUFBQWpaLElBQUE2NEMsRUFBQSxDQUVBNTRDLEtBQUFxOEMsc0JBQUEsR0FDQXI4QyxLQUFBbzhDLHNCQUFBLENBQUEsRUFFQSxJQUFBLElBQUE5NUMsRUFBQSxFQUFBaTZDLEVBQUEzRCxFQUFBMzNDLE9BQUFxQixFQUFBaTZDLEVBQUFqNkMsSUFBQSxDQUVBLE1BQUE4TixFQUFBd29DLEVBQUF0MkMsR0FBQThOLE1BQUFvc0MsT0FBQWw2QyxHQUVBdEMsS0FBQXE4QyxzQkFBQWo4QyxLQUFBLEdBQ0FKLEtBQUFvOEMsc0JBQUFoc0MsR0FBQTlOLENBRUEsQ0FFQSxDQUVBLENBRUEsQ0FVQSxpQkFBQTJrQixDQUFBem1CLEVBQUFJLEdBRUEsTUFBQWdtQixFQUFBNW1CLEtBQUE0bUIsU0FDQTRLLEVBQUE1SyxFQUFBNHdCLFdBQUFobUIsU0FDQWlyQixFQUFBNzFCLEVBQUE2d0IsZ0JBQUFqbUIsU0FDQWttQixFQUFBOXdCLEVBQUE4d0IscUJBRUE5MkMsRUFBQThKLG9CQUFBOG1CLEVBQUFoeEIsR0FFQSxNQUFBazhDLEVBQUExOEMsS0FBQXE4QyxzQkFFQSxHQUFBSSxHQUFBQyxFQUFBLENBRUFWLEdBQUFyMUMsSUFBQSxFQUFBLEVBQUEsR0FFQSxJQUFBLElBQUE1RixFQUFBLEVBQUFxYixFQUFBcWdDLEVBQUF4N0MsT0FBQUYsRUFBQXFiLEVBQUFyYixJQUFBLENBRUEsTUFBQTQ3QyxFQUFBRCxFQUFBMzdDLEdBQ0E2M0MsRUFBQTZELEVBQUExN0MsR0FFQSxJQUFBNDdDLElBRUFaLEdBQUFyeEMsb0JBQUFrdUMsRUFBQXA0QyxHQUVBazNDLEVBRUFzRSxHQUFBajBDLGdCQUFBZzBDLEdBQUFZLEdBSUFYLEdBQUFqMEMsZ0JBQUFnMEMsR0FBQS96QyxJQUFBcEgsR0FBQSs3QyxHQUlBLENBRUEvN0MsRUFBQWdILElBQUFvMEMsR0FFQSxDQUVBLE9BQUFwN0MsQ0FFQSxDQVFBLE9BQUFpNEIsQ0FBQStqQixFQUFBQyxHQUVBLE1BQUFqMkIsRUFBQTVtQixLQUFBNG1CLFNBQ0FtVyxFQUFBLzhCLEtBQUErOEIsU0FDQTFaLEVBQUFyakIsS0FBQXFqQixZQUVBLFFBQUF0akIsSUFBQWc5QixFQUFBLENBYUEsR0FUQSxPQUFBblcsRUFBQXNWLGdCQUFBdFYsRUFBQTZ4Qix3QkFFQWlELEdBQUFoMEMsS0FBQWtmLEVBQUFzVixnQkFDQXdmLEdBQUEvaEMsYUFBQTBKLEdBSUFvNEIsR0FBQS96QyxLQUFBazFDLEVBQUE3eEIsS0FBQUcsT0FBQTB4QixFQUFBbnFCLE9BRUEsSUFBQWlwQixHQUFBbjBCLGNBQUFrMEIsR0FBQTV3QixRQUFBLENBRUEsR0FBQSxPQUFBNHdCLEdBQUF6dkIsZ0JBQUEwdkIsR0FBQUMsSUFBQSxPQUVBLEdBQUFGLEdBQUE1d0IsT0FBQWhoQixrQkFBQTh4QyxLQUFBaUIsRUFBQWxxQixJQUFBa3FCLEVBQUFucUIsT0FBQSxFQUFBLE1BRUEsQ0FJQStvQixHQUFBOXpDLEtBQUEyYixHQUFBcFYsU0FDQXd0QyxHQUFBL3pDLEtBQUFrMUMsRUFBQTd4QixLQUFBcFIsYUFBQTZoQyxJQUlBLE9BQUE1MEIsRUFBQU0sY0FFQSxJQUFBdTBCLEdBQUEvekIsY0FBQWQsRUFBQU0sY0FNQWxuQixLQUFBODhDLHNCQUFBRixFQUFBQyxFQUFBcEIsR0FwQ0EsQ0FzQ0EsQ0FFQSxxQkFBQXFCLENBQUFGLEVBQUFDLEVBQUFFLEdBRUEsSUFBQUMsRUFFQSxNQUFBcDJCLEVBQUE1bUIsS0FBQTRtQixTQUNBbVcsRUFBQS84QixLQUFBKzhCLFNBRUF2OEIsRUFBQW9tQixFQUFBcG1CLE1BQ0FneEIsRUFBQTVLLEVBQUE0d0IsV0FBQWhtQixTQUNBclksRUFBQXlOLEVBQUE0d0IsV0FBQXIrQixHQUNBOGpDLEVBQUFyMkIsRUFBQTR3QixXQUFBeUYsSUFDQTk0QixFQUFBeUMsRUFBQTR3QixXQUFBcnpCLE9BQ0F3ekIsRUFBQS93QixFQUFBK3dCLE9BQ0FDLEVBQUFoeEIsRUFBQWd4QixVQUVBLEdBQUEsT0FBQXAzQyxFQUlBLEdBQUE4VixNQUFBQyxRQUFBd21CLEdBRUEsSUFBQSxJQUFBaDhCLEVBQUEsRUFBQXFiLEVBQUF1N0IsRUFBQTEyQyxPQUFBRixFQUFBcWIsRUFBQXJiLElBQUEsQ0FFQSxNQUFBKzRDLEVBQUFuQyxFQUFBNTJDLEdBQ0FtOEMsRUFBQW5nQixFQUFBK2MsRUFBQXpCLGVBS0EsSUFBQSxJQUFBaHZCLEVBSEEvbkIsS0FBQWEsSUFBQTIzQyxFQUFBckUsTUFBQW1DLEVBQUFuQyxPQUdBb0QsRUFGQXYzQyxLQUFBWSxJQUFBMUIsRUFBQXViLE1BQUF6YSxLQUFBWSxJQUFBNDNDLEVBQUFyRSxNQUFBcUUsRUFBQS85QixNQUFBNjdCLEVBQUFuQyxNQUFBbUMsRUFBQTc3QixRQUVBc04sRUFBQXd2QixFQUFBeHZCLEdBQUEsRUFBQSxDQU1BMnpCLEVBQUFHLEdBQUFuOUMsS0FBQWs5QyxFQUFBTixFQUFBRyxFQUFBNWpDLEVBQUE4akMsRUFBQTk0QixFQUpBM2pCLEVBQUFvSyxLQUFBeWUsR0FDQTdvQixFQUFBb0ssS0FBQXllLEVBQUEsR0FDQTdvQixFQUFBb0ssS0FBQXllLEVBQUEsSUFJQTJ6QixJQUVBQSxFQUFBSSxVQUFBOTdDLEtBQUFtRCxNQUFBNGtCLEVBQUEsR0FDQTJ6QixFQUFBSyxLQUFBaEYsY0FBQXlCLEVBQUF6QixjQUNBd0UsRUFBQXo4QyxLQUFBNDhDLEdBSUEsQ0FFQSxLQUVBLENBS0EsSUFBQSxJQUFBajhDLEVBSEFPLEtBQUFhLElBQUEsRUFBQXkxQyxFQUFBbkMsT0FHQXI1QixFQUZBOWEsS0FBQVksSUFBQTFCLEVBQUF1YixNQUFBNjdCLEVBQUFuQyxNQUFBbUMsRUFBQTc3QixPQUVBaGIsRUFBQXFiLEVBQUFyYixHQUFBLEVBQUEsQ0FNQWk4QyxFQUFBRyxHQUFBbjlDLEtBQUErOEIsRUFBQTZmLEVBQUFHLEVBQUE1akMsRUFBQThqQyxFQUFBOTRCLEVBSkEzakIsRUFBQW9LLEtBQUE3SixHQUNBUCxFQUFBb0ssS0FBQTdKLEVBQUEsR0FDQVAsRUFBQW9LLEtBQUE3SixFQUFBLElBSUFpOEMsSUFFQUEsRUFBQUksVUFBQTk3QyxLQUFBbUQsTUFBQTFELEVBQUEsR0FDQTg3QyxFQUFBejhDLEtBQUE0OEMsR0FJQSxDQUVBLE1BRUEsUUFBQWo5QyxJQUFBeXhCLEVBSUEsR0FBQWxiLE1BQUFDLFFBQUF3bUIsR0FFQSxJQUFBLElBQUFoOEIsRUFBQSxFQUFBcWIsRUFBQXU3QixFQUFBMTJDLE9BQUFGLEVBQUFxYixFQUFBcmIsSUFBQSxDQUVBLE1BQUErNEMsRUFBQW5DLEVBQUE1MkMsR0FDQW04QyxFQUFBbmdCLEVBQUErYyxFQUFBekIsZUFLQSxJQUFBLElBQUFodkIsRUFIQS9uQixLQUFBYSxJQUFBMjNDLEVBQUFyRSxNQUFBbUMsRUFBQW5DLE9BR0FvRCxFQUZBdjNDLEtBQUFZLElBQUFzdkIsRUFBQXpWLE1BQUF6YSxLQUFBWSxJQUFBNDNDLEVBQUFyRSxNQUFBcUUsRUFBQS85QixNQUFBNjdCLEVBQUFuQyxNQUFBbUMsRUFBQTc3QixRQUVBc04sRUFBQXd2QixFQUFBeHZCLEdBQUEsRUFBQSxDQU1BMnpCLEVBQUFHLEdBQUFuOUMsS0FBQWs5QyxFQUFBTixFQUFBRyxFQUFBNWpDLEVBQUE4akMsRUFBQTk0QixFQUpBa0YsRUFDQUEsRUFBQSxFQUNBQSxFQUFBLEdBSUEyekIsSUFFQUEsRUFBQUksVUFBQTk3QyxLQUFBbUQsTUFBQTRrQixFQUFBLEdBQ0EyekIsRUFBQUssS0FBQWhGLGNBQUF5QixFQUFBekIsY0FDQXdFLEVBQUF6OEMsS0FBQTQ4QyxHQUlBLENBRUEsS0FFQSxDQUtBLElBQUEsSUFBQWo4QyxFQUhBTyxLQUFBYSxJQUFBLEVBQUF5MUMsRUFBQW5DLE9BR0FyNUIsRUFGQTlhLEtBQUFZLElBQUFzdkIsRUFBQXpWLE1BQUE2N0IsRUFBQW5DLE1BQUFtQyxFQUFBNzdCLE9BRUFoYixFQUFBcWIsRUFBQXJiLEdBQUEsRUFBQSxDQU1BaThDLEVBQUFHLEdBQUFuOUMsS0FBQSs4QixFQUFBNmYsRUFBQUcsRUFBQTVqQyxFQUFBOGpDLEVBQUE5NEIsRUFKQXBqQixFQUNBQSxFQUFBLEVBQ0FBLEVBQUEsR0FJQWk4QyxJQUVBQSxFQUFBSSxVQUFBOTdDLEtBQUFtRCxNQUFBMUQsRUFBQSxHQUNBODdDLEVBQUF6OEMsS0FBQTQ4QyxHQUlBLENBRUEsQ0FJQSxFQW1DQSxTQUFBRyxHQUFBbjNCLEVBQUErVyxFQUFBNmYsRUFBQTd4QixFQUFBNVIsRUFBQThqQyxFQUFBOTRCLEVBQUF0ZSxFQUFBQyxFQUFBQyxHQUVBaWdCLEVBQUFpQixrQkFBQXBoQixFQUFBKzFDLElBQ0E1MUIsRUFBQWlCLGtCQUFBbmhCLEVBQUErMUMsSUFDQTcxQixFQUFBaUIsa0JBQUFsaEIsRUFBQSsxQyxJQUVBLE1BQUFrQixFQXJDQSxTQUFBaDNCLEVBQUErVyxFQUFBNmYsRUFBQTd4QixFQUFBb3ZCLEVBQUFDLEVBQUFDLEVBQUE5ekIsR0FFQSxJQUFBeUMsRUFZQSxHQVJBQSxFakNuVFksSWlDaVRaK1QsRUFBQXVQLEtBRUF2aEIsRUFBQXFDLGtCQUFBaXRCLEVBQUFELEVBQUFELEdBQUEsRUFBQTV6QixHQUlBd0UsRUFBQXFDLGtCQUFBK3NCLEVBQUFDLEVBQUFDLEVqQy9UWSxJaUMrVFp0ZCxFQUFBdVAsS0FBQS9sQixHQUlBLE9BQUF5QyxFQUFBLE9BQUEsS0FFQWt6QixHQUFBeDBDLEtBQUE2ZSxHQUNBMjFCLEdBQUF2aUMsYUFBQXFNLEVBQUEzQyxhQUVBLE1BQUFpVSxFQUFBc2xCLEVBQUE3eEIsSUFBQUYsT0FBQWpoQixXQUFBc3lDLElBRUEsT0FBQTVrQixFQUFBc2xCLEVBQUFucUIsTUFBQTZFLEVBQUFzbEIsRUFBQWxxQixJQUFBLEtBRUEsQ0FDQTRFLFNBQUFBLEVBQ0EvUSxNQUFBMjFCLEdBQUF6MEMsUUFDQXVlLE9BQUFBLEVBR0EsQ0FRQXMzQixDQUFBdDNCLEVBQUErVyxFQUFBNmYsRUFBQTd4QixFQUFBNndCLEdBQUFDLEdBQUFDLEdBQUFHLElBRUEsR0FBQWUsRUFBQSxDQUVBLE1BQUF6ZCxFQUFBLElBQUF2ZCxHQUNBb2MsR0FBQUcsYUFBQTBkLEdBQUFMLEdBQUFDLEdBQUFDLEdBQUF2YyxHQUVBcG1CLElBRUE2akMsRUFBQTdqQyxHQUFBaWxCLEdBQUFjLHlCQUFBL2xCLEVBQUF0VCxFQUFBQyxFQUFBQyxFQUFBdzVCLEVBQUEsSUFBQXo0QixLQUlBbTJDLElBRUFELEVBQUFDLElBQUE3ZSxHQUFBYyx5QkFBQStkLEVBQUFwM0MsRUFBQUMsRUFBQUMsRUFBQXc1QixFQUFBLElBQUF6NEIsS0FJQXFkLElBRUE2NEIsRUFBQTc0QixPQUFBaWEsR0FBQWMseUJBQUEvYSxFQUFBdGUsRUFBQUMsRUFBQUMsRUFBQXc1QixFQUFBLElBQUF2ZCxJQUVBZzdCLEVBQUE3NEIsT0FBQWxiLElBQUE4aEIsRUFBQUQsV0FBQSxHQUVBa3lCLEVBQUE3NEIsT0FBQS9iLGdCQUFBLElBTUEsTUFBQWkxQyxFQUFBLENBQ0F4M0MsRUFBQUEsRUFDQUMsRUFBQUEsRUFDQUMsRUFBQUEsRUFDQW9lLE9BQUEsSUFBQW5DLEdBQ0FxMkIsY0FBQSxHQUdBamEsR0FBQUMsVUFBQXVkLEdBQUFDLEdBQUFDLEdBQUF1QixFQUFBbDVCLFFBRUE2NEIsRUFBQUssS0FBQUEsRUFDQUwsRUFBQXpkLFVBQUFBLENBRUEsQ0FFQSxPQUFBeWQsQ0FFQSxDQ2xkQSxNQUFBTyxXQUFBbEcsR0FZQSxXQUFBejBDLENBQUFxRSxFQUFBLEVBQUFDLEVBQUEsRUFBQW1VLEVBQUEsRUFBQW1pQyxFQUFBLEVBQUFDLEVBQUEsRUFBQUMsRUFBQSxHQUVBbm1DLFFBRUF2WCxLQUFBSCxLQUFBLGNBU0FHLEtBQUF5OEIsV0FBQSxDQUNBeDFCLE1BQUFBLEVBQ0FDLE9BQUFBLEVBQ0FtVSxNQUFBQSxFQUNBbWlDLGNBQUFBLEVBQ0FDLGVBQUFBLEVBQ0FDLGNBQUFBLEdBR0EsTUFBQUMsRUFBQTM5QyxLQUlBdzlDLEVBQUFsOEMsS0FBQW1ELE1BQUErNEMsR0FDQUMsRUFBQW44QyxLQUFBbUQsTUFBQWc1QyxHQUNBQyxFQUFBcDhDLEtBQUFtRCxNQUFBaTVDLEdBSUEsTUFBQTNDLEVBQUEsR0FDQTZDLEVBQUEsR0FDQWhELEVBQUEsR0FDQWlELEVBQUEsR0FJQSxJQUFBQyxFQUFBLEVBQ0FDLEVBQUEsRUFrQkEsU0FBQUMsRUFBQS80QixFQUFBdGQsRUFBQTRSLEVBQUEwa0MsRUFBQUMsRUFBQWozQyxFQUFBQyxFQUFBbVUsRUFBQThpQyxFQUFBQyxFQUFBL0YsR0FFQSxNQUFBZ0csRUFBQXAzQyxFQUFBazNDLEVBQ0FHLEVBQUFwM0MsRUFBQWszQyxFQUVBRyxFQUFBdDNDLEVBQUEsRUFDQXUzQyxFQUFBdDNDLEVBQUEsRUFDQXUzQyxFQUFBcGpDLEVBQUEsRUFFQXFqQyxFQUFBUCxFQUFBLEVBQ0FRLEVBQUFQLEVBQUEsRUFFQSxJQUFBUSxFQUFBLEVBQ0FDLEVBQUEsRUFFQSxNQUFBcDRCLEVBQUEsSUFBQXpFLEdBSUEsSUFBQSxJQUFBODhCLEVBQUEsRUFBQUEsRUFBQUgsRUFBQUcsSUFBQSxDQUVBLE1BQUFyOEMsRUFBQXE4QyxFQUFBUixFQUFBRSxFQUVBLElBQUEsSUFBQU8sRUFBQSxFQUFBQSxFQUFBTCxFQUFBSyxJQUFBLENBRUEsTUFBQXY4QyxFQUFBdThDLEVBQUFWLEVBQUFFLEVBSUE5M0IsRUFBQXhCLEdBQUF6aUIsRUFBQXk3QyxFQUNBeDNCLEVBQUE5ZSxHQUFBbEYsRUFBQXk3QyxFQUNBejNCLEVBQUFsTixHQUFBa2xDLEVBSUFiLEVBQUF4OUMsS0FBQXFtQixFQUFBamtCLEVBQUFpa0IsRUFBQWhrQixFQUFBZ2tCLEVBQUFuTixHQUlBbU4sRUFBQXhCLEdBQUEsRUFDQXdCLEVBQUE5ZSxHQUFBLEVBQ0E4ZSxFQUFBbE4sR0FBQThCLEVBQUEsRUFBQSxHQUFBLEVBSUF1L0IsRUFBQXg2QyxLQUFBcW1CLEVBQUFqa0IsRUFBQWlrQixFQUFBaGtCLEVBQUFna0IsRUFBQW5OLEdBSUF1a0MsRUFBQXo5QyxLQUFBMitDLEVBQUFaLEdBQ0FOLEVBQUF6OUMsS0FBQSxFQUFBMCtDLEVBQUFWLEdBSUFRLEdBQUEsQ0FFQSxDQUVBLENBUUEsSUFBQSxJQUFBRSxFQUFBLEVBQUFBLEVBQUFWLEVBQUFVLElBRUEsSUFBQSxJQUFBQyxFQUFBLEVBQUFBLEVBQUFaLEVBQUFZLElBQUEsQ0FFQSxNQUFBbDVDLEVBQUFpNEMsRUFBQWlCLEVBQUFMLEVBQUFJLEVBQ0FoNUMsRUFBQWc0QyxFQUFBaUIsRUFBQUwsR0FBQUksRUFBQSxHQUNBLzRDLEVBQUErM0MsR0FBQWlCLEVBQUEsR0FBQUwsR0FBQUksRUFBQSxHQUNBanhDLEVBQUFpd0MsR0FBQWlCLEVBQUEsR0FBQUwsRUFBQUksRUFJQS9ELEVBQUEzNkMsS0FBQXlGLEVBQUFDLEVBQUErSCxHQUNBa3RDLEVBQUEzNkMsS0FBQTBGLEVBQUFDLEVBQUE4SCxHQUlBZ3hDLEdBQUEsQ0FFQSxDQU1BbEIsRUFBQXZGLFNBQUEyRixFQUFBYyxFQUFBeEcsR0FJQTBGLEdBQUFjLEVBSUFmLEdBQUFjLENBRUEsQ0FsSEFaLEVBQUEsSUFBQSxJQUFBLEtBQUEsR0FBQSxFQUFBM2lDLEVBQUFuVSxFQUFBRCxFQUFBeTJDLEVBQUFELEVBQUEsR0FDQU8sRUFBQSxJQUFBLElBQUEsSUFBQSxHQUFBLEVBQUEzaUMsRUFBQW5VLEdBQUFELEVBQUF5MkMsRUFBQUQsRUFBQSxHQUNBTyxFQUFBLElBQUEsSUFBQSxJQUFBLEVBQUEsRUFBQS8yQyxFQUFBb1UsRUFBQW5VLEVBQUFzMkMsRUFBQUUsRUFBQSxHQUNBTSxFQUFBLElBQUEsSUFBQSxJQUFBLEdBQUEsRUFBQS8yQyxFQUFBb1UsR0FBQW5VLEVBQUFzMkMsRUFBQUUsRUFBQSxHQUNBTSxFQUFBLElBQUEsSUFBQSxJQUFBLEdBQUEsRUFBQS8yQyxFQUFBQyxFQUFBbVUsRUFBQW1pQyxFQUFBQyxFQUFBLEdBQ0FPLEVBQUEsSUFBQSxJQUFBLEtBQUEsR0FBQSxFQUFBLzJDLEVBQUFDLEdBQUFtVSxFQUFBbWlDLEVBQUFDLEVBQUEsR0FJQXo5QyxLQUFBODNDLFNBQUFpRCxHQUNBLzZDLEtBQUFpNEMsYUFBQSxXQUFBLElBQUFwQixHQUFBK0csRUFBQSxJQUNBNTlDLEtBQUFpNEMsYUFBQSxTQUFBLElBQUFwQixHQUFBK0QsRUFBQSxJQUNBNTZDLEtBQUFpNEMsYUFBQSxLQUFBLElBQUFwQixHQUFBZ0gsRUFBQSxHQXdHQSxDQUVBLElBQUFuMkMsQ0FBQStQLEdBTUEsT0FKQUYsTUFBQTdQLEtBQUErUCxHQUVBelgsS0FBQXk4QixXQUFBbHBCLE9BQUFDLE9BQUEsQ0FBQSxFQUFBaUUsRUFBQWdsQixZQUVBejhCLElBRUEsQ0FTQSxlQUFBZy9DLENBQUF6cEMsR0FFQSxPQUFBLElBQUFnb0MsR0FBQWhvQyxFQUFBdE8sTUFBQXNPLEVBQUFyTyxPQUFBcU8sRUFBQThGLE1BQUE5RixFQUFBaW9DLGNBQUFqb0MsRUFBQWtvQyxlQUFBbG9DLEVBQUFtb0MsY0FFQSxFQ2pOTyxTQUFBdUIsR0FBQXZxQyxHQUVQLE1BQUFtSixFQUFBLENBQUEsRUFFQSxJQUFBLE1BQUFvSCxLQUFBdlEsRUFBQSxDQUVBbUosRUFBQW9ILEdBQUEsQ0FBQSxFQUVBLElBQUEsTUFBQTROLEtBQUFuZSxFQUFBdVEsR0FBQSxDQUVBLE1BQUFpNkIsRUFBQXhxQyxFQUFBdVEsR0FBQTROLEdBRUFxc0IsSUFBQUEsRUFBQTdpQixTQUNBNmlCLEVBQUF0ekMsV0FBQXN6QyxFQUFBL3dCLFdBQ0Erd0IsRUFBQWw0QyxXQUFBazRDLEVBQUFqOUIsV0FBQWk5QixFQUFBMWxDLFdBQ0EwbEMsRUFBQTFuQyxXQUFBMG5DLEVBQUEzaEMsY0FFQTJoQyxFQUFBNW1DLHVCQUVBMVIsUUFBQUMsS0FBQSxzR0FDQWdYLEVBQUFvSCxHQUFBNE4sR0FBQSxNQUlBaFYsRUFBQW9ILEdBQUE0TixHQUFBcXNCLEVBQUF6M0MsUUFJQTZPLE1BQUFDLFFBQUEyb0MsR0FFQXJoQyxFQUFBb0gsR0FBQTROLEdBQUFxc0IsRUFBQXArQyxRQUlBK2MsRUFBQW9ILEdBQUE0TixHQUFBcXNCLENBSUEsQ0FFQSxDQUVBLE9BQUFyaEMsQ0FFQSxDQUVPLFNBQUFzaEMsR0FBQUMsR0FFUCxNQUFBQyxFQUFBLENBQUEsRUFFQSxJQUFBLElBQUFwNkIsRUFBQSxFQUFBQSxFQUFBbTZCLEVBQUFuK0MsT0FBQWdrQixJQUFBLENBRUEsTUFBQXpXLEVBQUF5d0MsR0FBQUcsRUFBQW42QixJQUVBLElBQUEsTUFBQTROLEtBQUFya0IsRUFFQTZ3QyxFQUFBeHNCLEdBQUFya0IsRUFBQXFrQixFQUlBLENBRUEsT0FBQXdzQixDQUVBLENBZ0JPLFNBQUFDLEdBQUFDLEdBRVAsTUFBQUMsRUFBQUQsRUFBQUUsa0JBRUEsT0FBQSxPQUFBRCxFQUdBRCxFQUFBRyxrQkFLQSxJQUFBRixFQUFBRyxpQkFFQUgsRUFBQXhqQyxRQUFBL0ksV0FJQWpCLEdBQUFFLGlCQUVBLENBSUssTUFBQTB0QyxHQUFBLENBQUFuNEMsTUFBQXczQyxHQUFBWSxNQUFBVixJQ3RFTCxNQUFBVyxXQUFBM1QsR0FXQSxXQUFBdnBDLENBQUE2NUIsR0FFQWxsQixRQVNBdlgsS0FBQSsvQyxrQkFBQSxFQUVBLy9DLEtBQUFILEtBQUEsaUJBb0JBRyxLQUFBZ2dELFFBQUEsQ0FBQSxFQXdCQWhnRCxLQUFBby9DLFNBQUEsQ0FBQSxFQU9BcC9DLEtBQUFpZ0QsZUFBQSxHQU9BamdELEtBQUFrZ0QsYUN4SEEsZ0dEK0hBbGdELEtBQUFtZ0QsZUUvSEEsaUVGMElBbmdELEtBQUEreUMsVUFBQSxFQVFBL3lDLEtBQUFrekMsV0FBQSxFQVdBbHpDLEtBQUFtekMsbUJBQUEsRUFTQW56QyxLQUFBdXpDLEtBQUEsRUFTQXZ6QyxLQUFBb2dELFFBQUEsRUFTQXBnRCxLQUFBcWdELFVBQUEsRUFRQXJnRCxLQUFBMHVDLGlCQUFBLEVBVUExdUMsS0FBQXNnRCxXQUFBLENBQ0FDLGtCQUFBLEVBQ0FDLFdBQUEsR0FjQXhnRCxLQUFBeWdELHVCQUFBLENBQ0FwdUMsTUFBQSxDQUFBLEVBQUEsRUFBQSxHQUNBOEcsR0FBQSxDQUFBLEVBQUEsR0FDQThqQyxJQUFBLENBQUEsRUFBQSxJQVVBajlDLEtBQUEwZ0QseUJBQUEzZ0QsRUFTQUMsS0FBQTJnRCxvQkFBQSxFQVFBM2dELEtBQUE0Z0QsWUFBQSxVQUVBN2dELElBQUEwOEIsR0FFQXo4QixLQUFBaXZDLFVBQUF4UyxFQUlBLENBRUEsSUFBQS8wQixDQUFBK1AsR0F1QkEsT0FyQkFGLE1BQUE3UCxLQUFBK1AsR0FFQXpYLEtBQUFtZ0QsZUFBQTFvQyxFQUFBMG9DLGVBQ0FuZ0QsS0FBQWtnRCxhQUFBem9DLEVBQUF5b0MsYUFFQWxnRCxLQUFBby9DLFNBQUFILEdBQUF4bkMsRUFBQTJuQyxVQUNBcC9DLEtBQUFpZ0QsZURwTU8sU0FBQXZyQyxHQUVQLE1BQUFtSixFQUFBLEdBRUEsSUFBQSxJQUFBb0gsRUFBQSxFQUFBQSxFQUFBdlEsRUFBQXpULE9BQUFna0IsSUFFQXBILEVBQUF6ZCxLQUFBc1UsRUFBQXVRLEdBQUF4ZCxTQUlBLE9BQUFvVyxDQUVBLENDd0xBZ2pDLENBQUFwcEMsRUFBQXdvQyxnQkFFQWpnRCxLQUFBZ2dELFFBQUF6c0MsT0FBQUMsT0FBQSxDQUFBLEVBQUFpRSxFQUFBdW9DLFNBRUFoZ0QsS0FBQWt6QyxVQUFBejdCLEVBQUF5N0IsVUFDQWx6QyxLQUFBbXpDLG1CQUFBMTdCLEVBQUEwN0IsbUJBRUFuekMsS0FBQXV6QyxJQUFBOTdCLEVBQUE4N0IsSUFDQXZ6QyxLQUFBb2dELE9BQUEzb0MsRUFBQTJvQyxPQUNBcGdELEtBQUFxZ0QsU0FBQTVvQyxFQUFBNG9DLFNBRUFyZ0QsS0FBQXNnRCxXQUFBL3NDLE9BQUFDLE9BQUEsQ0FBQSxFQUFBaUUsRUFBQTZvQyxZQUVBdGdELEtBQUE0Z0QsWUFBQW5wQyxFQUFBbXBDLFlBRUE1Z0QsSUFFQSxDQUVBLE1BQUFnVyxDQUFBQyxHQUVBLE1BQUFWLEVBQUFnQyxNQUFBdkIsT0FBQUMsR0FFQVYsRUFBQXFyQyxZQUFBNWdELEtBQUE0Z0QsWUFDQXJyQyxFQUFBNnBDLFNBQUEsQ0FBQSxFQUVBLElBQUEsTUFBQWh2QyxLQUFBcFEsS0FBQW8vQyxTQUFBLENBRUEsTUFDQW45QyxFQURBakMsS0FBQW8vQyxTQUFBaHZDLEdBQ0FuTyxNQUVBQSxHQUFBQSxFQUFBdVYsVUFFQWpDLEVBQUE2cEMsU0FBQWh2QyxHQUFBLENBQ0F2USxLQUFBLElBQ0FvQyxNQUFBQSxFQUFBK1QsT0FBQUMsR0FBQUwsTUFHQTNULEdBQUFBLEVBQUFvNkIsUUFFQTltQixFQUFBNnBDLFNBQUFodkMsR0FBQSxDQUNBdlEsS0FBQSxJQUNBb0MsTUFBQUEsRUFBQStvQyxVQUdBL29DLEdBQUFBLEVBQUErRSxVQUVBdU8sRUFBQTZwQyxTQUFBaHZDLEdBQUEsQ0FDQXZRLEtBQUEsS0FDQW9DLE1BQUFBLEVBQUF3SSxXQUdBeEksR0FBQUEsRUFBQWdnQixVQUVBMU0sRUFBQTZwQyxTQUFBaHZDLEdBQUEsQ0FDQXZRLEtBQUEsS0FDQW9DLE1BQUFBLEVBQUF3SSxXQUdBeEksR0FBQUEsRUFBQXVYLFVBRUFqRSxFQUFBNnBDLFNBQUFodkMsR0FBQSxDQUNBdlEsS0FBQSxLQUNBb0MsTUFBQUEsRUFBQXdJLFdBR0F4SSxHQUFBQSxFQUFBMkosVUFFQTJKLEVBQUE2cEMsU0FBQWh2QyxHQUFBLENBQ0F2USxLQUFBLEtBQ0FvQyxNQUFBQSxFQUFBd0ksV0FHQXhJLEdBQUFBLEVBQUFrc0IsVUFFQTVZLEVBQUE2cEMsU0FBQWh2QyxHQUFBLENBQ0F2USxLQUFBLEtBQ0FvQyxNQUFBQSxFQUFBd0ksV0FLQThLLEVBQUE2cEMsU0FBQWh2QyxHQUFBLENBQ0FuTyxNQUFBQSxFQU9BLENBRUFzUixPQUFBeUYsS0FBQWhaLEtBQUFnZ0QsU0FBQS8rQyxPQUFBLElBQUFzVSxFQUFBeXFDLFFBQUFoZ0QsS0FBQWdnRCxTQUVBenFDLEVBQUEycUMsYUFBQWxnRCxLQUFBa2dELGFBQ0EzcUMsRUFBQTRxQyxlQUFBbmdELEtBQUFtZ0QsZUFFQTVxQyxFQUFBNnFDLE9BQUFwZ0QsS0FBQW9nRCxPQUNBN3FDLEVBQUE4cUMsU0FBQXJnRCxLQUFBcWdELFNBRUEsTUFBQUMsRUFBQSxDQUFBLEVBRUEsSUFBQSxNQUFBampCLEtBQUFyOUIsS0FBQXNnRCxZQUVBLElBQUF0Z0QsS0FBQXNnRCxXQUFBampCLEtBQUFpakIsRUFBQWpqQixJQUFBLEdBTUEsT0FGQTlwQixPQUFBeUYsS0FBQXNuQyxHQUFBci9DLE9BQUEsSUFBQXNVLEVBQUErcUMsV0FBQUEsR0FFQS9xQyxDQUVBLEVHL1dBLE1BQUF1ckMsV0FBQTNyQixHQUtBLFdBQUF2eUIsR0FFQTJVLFFBU0F2WCxLQUFBNDNCLFVBQUEsRUFFQTUzQixLQUFBSCxLQUFBLFNBT0FHLEtBQUFrakIsbUJBQUEsSUFBQXlLLEdBT0EzdEIsS0FBQTJSLGlCQUFBLElBQUFnYyxHQU9BM3RCLEtBQUFvakIsd0JBQUEsSUFBQXVLLEdBT0EzdEIsS0FBQTJ5QixpQkFBQXJ6QixFQUVBLENBRUEsSUFBQW9JLENBQUErUCxFQUFBNmxCLEdBV0EsT0FUQS9sQixNQUFBN1AsS0FBQStQLEVBQUE2bEIsR0FFQXQ5QixLQUFBa2pCLG1CQUFBeGIsS0FBQStQLEVBQUF5TCxvQkFFQWxqQixLQUFBMlIsaUJBQUFqSyxLQUFBK1AsRUFBQTlGLGtCQUNBM1IsS0FBQW9qQix3QkFBQTFiLEtBQUErUCxFQUFBMkwseUJBRUFwakIsS0FBQTJ5QixpQkFBQWxiLEVBQUFrYixpQkFFQTN5QixJQUVBLENBV0EsaUJBQUE0NEIsQ0FBQWg0QixHQUVBLE9BQUEyVyxNQUFBcWhCLGtCQUFBaDRCLEdBQUFvSSxRQUVBLENBRUEsaUJBQUFpd0IsQ0FBQUMsR0FFQTNoQixNQUFBMGhCLGtCQUFBQyxHQUVBbDVCLEtBQUFrakIsbUJBQUF4YixLQUFBMUgsS0FBQXFqQixhQUFBcFYsUUFFQSxDQUVBLGlCQUFBMFksQ0FBQXdTLEVBQUFDLEdBRUE3aEIsTUFBQW9QLGtCQUFBd1MsRUFBQUMsR0FFQXA1QixLQUFBa2pCLG1CQUFBeGIsS0FBQTFILEtBQUFxakIsYUFBQXBWLFFBRUEsQ0FFQSxLQUFBeEcsR0FFQSxPQUFBLElBQUF6SCxLQUFBNEMsYUFBQThFLEtBQUExSCxLQUVBLEVDMUdBLE1BQUErZ0QsR0FBQSxJQUFBLytCLEdBQ0FnL0IsR0FBQSxJQUFBbDZDLEdBQ0FtNkMsR0FBQSxJQUFBbjZDLEdBZUEsTUFBQW82QyxXQUFBSixHQVVBLFdBQUFsK0MsQ0FBQXUrQyxFQUFBLEdBQUFDLEVBQUEsRUFBQTN1QixFQUFBLEdBQUFDLEVBQUEsS0FFQW5iLFFBU0F2WCxLQUFBcWhELHFCQUFBLEVBRUFyaEQsS0FBQUgsS0FBQSxvQkFTQUcsS0FBQW1oRCxJQUFBQSxFQVFBbmhELEtBQUFzaEQsS0FBQSxFQVlBdGhELEtBQUF5eUIsS0FBQUEsRUFTQXp5QixLQUFBMHlCLElBQUFBLEVBVUExeUIsS0FBQXVoRCxNQUFBLEdBUUF2aEQsS0FBQW9oRCxPQUFBQSxFQVNBcGhELEtBQUF3aEQsS0FBQSxLQVVBeGhELEtBQUF5aEQsVUFBQSxHQVFBemhELEtBQUEwaEQsV0FBQSxFQUVBMWhELEtBQUEyaEQsd0JBRUEsQ0FFQSxJQUFBajZDLENBQUErUCxFQUFBNmxCLEdBaUJBLE9BZkEvbEIsTUFBQTdQLEtBQUErUCxFQUFBNmxCLEdBRUF0OUIsS0FBQW1oRCxJQUFBMXBDLEVBQUEwcEMsSUFDQW5oRCxLQUFBc2hELEtBQUE3cEMsRUFBQTZwQyxLQUVBdGhELEtBQUF5eUIsS0FBQWhiLEVBQUFnYixLQUNBenlCLEtBQUEweUIsSUFBQWpiLEVBQUFpYixJQUNBMXlCLEtBQUF1aEQsTUFBQTlwQyxFQUFBOHBDLE1BRUF2aEQsS0FBQW9oRCxPQUFBM3BDLEVBQUEycEMsT0FDQXBoRCxLQUFBd2hELEtBQUEsT0FBQS9wQyxFQUFBK3BDLEtBQUEsS0FBQWp1QyxPQUFBQyxPQUFBLENBQUEsRUFBQWlFLEVBQUErcEMsTUFFQXhoRCxLQUFBeWhELFVBQUFocUMsRUFBQWdxQyxVQUNBemhELEtBQUEwaEQsV0FBQWpxQyxFQUFBaXFDLFdBRUExaEQsSUFFQSxDQVVBLGNBQUE0aEQsQ0FBQUMsR0FHQSxNQUFBQyxFQUFBLEdBQUE5aEQsS0FBQStoRCxnQkFBQUYsRUFFQTdoRCxLQUFBbWhELElBQUEsRUFBQTMvQyxHQUFBRixLQUFBMGdELEtBQUFGLEdBQ0E5aEQsS0FBQTJoRCx3QkFFQSxDQVFBLGNBQUFNLEdBRUEsTUFBQUgsRUFBQXhnRCxLQUFBMG5DLElBQUEsR0FBQTNuQyxHQUFBckIsS0FBQW1oRCxLQUVBLE1BQUEsR0FBQW5oRCxLQUFBK2hELGdCQUFBRCxDQUVBLENBT0EsZUFBQUksR0FFQSxPQUFBLEVBQUExZ0QsR0FBQUYsS0FBQTBnRCxLQUNBMWdELEtBQUEwbkMsSUFBQSxHQUFBM25DLEdBQUFyQixLQUFBbWhELEtBQUFuaEQsS0FBQXNoRCxLQUVBLENBUUEsWUFBQWEsR0FHQSxPQUFBbmlELEtBQUF5aEQsVUFBQW5nRCxLQUFBWSxJQUFBbEMsS0FBQW9oRCxPQUFBLEVBRUEsQ0FRQSxhQUFBVyxHQUdBLE9BQUEvaEQsS0FBQXloRCxVQUFBbmdELEtBQUFhLElBQUFuQyxLQUFBb2hELE9BQUEsRUFFQSxDQVVBLGFBQUFnQixDQUFBOXFCLEVBQUErcUIsRUFBQUMsR0FFQXZCLEdBQUFwNkMsS0FBQSxHQUFBLEVBQUEsSUFBQWdULGFBQUEzWixLQUFBb2pCLHlCQUVBaS9CLEVBQUExN0MsSUFBQW82QyxHQUFBditDLEVBQUF1K0MsR0FBQXQrQyxHQUFBMkYsZ0JBQUFrdkIsRUFBQXlwQixHQUFBem5DLEdBRUF5bkMsR0FBQXA2QyxJQUFBLEVBQUEsRUFBQSxJQUFBZ1QsYUFBQTNaLEtBQUFvakIseUJBRUFrL0IsRUFBQTM3QyxJQUFBbzZDLEdBQUF2K0MsRUFBQXUrQyxHQUFBdCtDLEdBQUEyRixnQkFBQWt2QixFQUFBeXBCLEdBQUF6bkMsRUFFQSxDQVNBLFdBQUFpcEMsQ0FBQWpyQixFQUFBMTJCLEdBSUEsT0FGQVosS0FBQW9pRCxjQUFBOXFCLEVBQUEwcEIsR0FBQUMsSUFFQXJnRCxFQUFBc0gsV0FBQSs0QyxHQUFBRCxHQUVBLENBNkNBLGFBQUF3QixDQUFBQyxFQUFBQyxFQUFBbGdELEVBQUFDLEVBQUF3RSxFQUFBQyxHQUVBbEgsS0FBQW9oRCxPQUFBcUIsRUFBQUMsRUFFQSxPQUFBMWlELEtBQUF3aEQsT0FFQXhoRCxLQUFBd2hELEtBQUEsQ0FDQXZ2QyxTQUFBLEVBQ0F3d0MsVUFBQSxFQUNBQyxXQUFBLEVBQ0FDLFFBQUEsRUFDQUMsUUFBQSxFQUNBMzdDLE1BQUEsRUFDQUMsT0FBQSxJQUtBbEgsS0FBQXdoRCxLQUFBdnZDLFNBQUEsRUFDQWpTLEtBQUF3aEQsS0FBQWlCLFVBQUFBLEVBQ0F6aUQsS0FBQXdoRCxLQUFBa0IsV0FBQUEsRUFDQTFpRCxLQUFBd2hELEtBQUFtQixRQUFBbmdELEVBQ0F4QyxLQUFBd2hELEtBQUFvQixRQUFBbmdELEVBQ0F6QyxLQUFBd2hELEtBQUF2NkMsTUFBQUEsRUFDQWpILEtBQUF3aEQsS0FBQXQ2QyxPQUFBQSxFQUVBbEgsS0FBQTJoRCx3QkFFQSxDQUtBLGVBQUFrQixHQUVBLE9BQUE3aUQsS0FBQXdoRCxPQUVBeGhELEtBQUF3aEQsS0FBQXZ2QyxTQUFBLEdBSUFqUyxLQUFBMmhELHdCQUVBLENBTUEsc0JBQUFBLEdBRUEsTUFBQWx2QixFQUFBenlCLEtBQUF5eUIsS0FDQSxJQUFBRixFQUFBRSxFQUFBbnhCLEtBQUEwbkMsSUFBQSxHQUFBM25DLEdBQUFyQixLQUFBbWhELEtBQUFuaEQsS0FBQXNoRCxLQUNBcDZDLEVBQUEsRUFBQXFyQixFQUNBdHJCLEVBQUFqSCxLQUFBb2hELE9BQUFsNkMsRUFDQW1yQixHQUFBLEdBQUFwckIsRUFDQSxNQUFBdTZDLEVBQUF4aEQsS0FBQXdoRCxLQUVBLEdBQUEsT0FBQXhoRCxLQUFBd2hELE1BQUF4aEQsS0FBQXdoRCxLQUFBdnZDLFFBQUEsQ0FFQSxNQUFBd3dDLEVBQUFqQixFQUFBaUIsVUFDQUMsRUFBQWxCLEVBQUFrQixXQUVBcndCLEdBQUFtdkIsRUFBQW1CLFFBQUExN0MsRUFBQXc3QyxFQUNBbHdCLEdBQUFpdkIsRUFBQW9CLFFBQUExN0MsRUFBQXc3QyxFQUNBejdDLEdBQUF1NkMsRUFBQXY2QyxNQUFBdzdDLEVBQ0F2N0MsR0FBQXM2QyxFQUFBdDZDLE9BQUF3N0MsQ0FFQSxDQUVBLE1BQUFJLEVBQUE5aUQsS0FBQTBoRCxXQUNBLElBQUFvQixJQUFBendCLEdBQUFJLEVBQUFxd0IsRUFBQTlpRCxLQUFBbWlELGdCQUVBbmlELEtBQUEyUixpQkFBQXlnQixnQkFBQUMsRUFBQUEsRUFBQXByQixFQUFBc3JCLEVBQUFBLEVBQUFyckIsRUFBQXVyQixFQUFBenlCLEtBQUEweUIsSUFBQTF5QixLQUFBMnlCLGtCQUVBM3lCLEtBQUFvakIsd0JBQUExYixLQUFBMUgsS0FBQTJSLGtCQUFBMUQsUUFFQSxDQUVBLE1BQUErSCxDQUFBQyxHQUVBLE1BQUFWLEVBQUFnQyxNQUFBdkIsT0FBQUMsR0FnQkEsT0FkQVYsRUFBQXlRLE9BQUFtN0IsSUFBQW5oRCxLQUFBbWhELElBQ0E1ckMsRUFBQXlRLE9BQUFzN0IsS0FBQXRoRCxLQUFBc2hELEtBRUEvckMsRUFBQXlRLE9BQUF5TSxLQUFBenlCLEtBQUF5eUIsS0FDQWxkLEVBQUF5USxPQUFBME0sSUFBQTF5QixLQUFBMHlCLElBQ0FuZCxFQUFBeVEsT0FBQXU3QixNQUFBdmhELEtBQUF1aEQsTUFFQWhzQyxFQUFBeVEsT0FBQW83QixPQUFBcGhELEtBQUFvaEQsT0FFQSxPQUFBcGhELEtBQUF3aEQsT0FBQWpzQyxFQUFBeVEsT0FBQXc3QixLQUFBanVDLE9BQUFDLE9BQUEsQ0FBQSxFQUFBeFQsS0FBQXdoRCxPQUVBanNDLEVBQUF5USxPQUFBeTdCLFVBQUF6aEQsS0FBQXloRCxVQUNBbHNDLEVBQUF5USxPQUFBMDdCLFdBQUExaEQsS0FBQTBoRCxXQUVBbnNDLENBRUEsRUM5WUEsTUFBQTRyQyxJQUFBLEdBaUNBLE1BQUE0QixXQUFBNXRCLEdBU0EsV0FBQXZ5QixDQUFBNnZCLEVBQUFDLEVBQUFyYSxHQUVBZCxRQUVBdlgsS0FBQUgsS0FBQSxhQU9BRyxLQUFBcVksYUFBQUEsRUFRQXJZLEtBQUEyeUIsaUJBQUEsS0FRQTN5QixLQUFBZ2pELGtCQUFBLEVBRUEsTUFBQUMsRUFBQSxJQUFBL0IsR0FBQUMsR0F0RUEsRUFzRUExdUIsRUFBQUMsR0FDQXV3QixFQUFBaHZCLE9BQUFqMEIsS0FBQWkwQixPQUNBajBCLEtBQUE0SCxJQUFBcTdDLEdBRUEsTUFBQUMsRUFBQSxJQUFBaEMsR0FBQUMsR0ExRUEsRUEwRUExdUIsRUFBQUMsR0FDQXd3QixFQUFBanZCLE9BQUFqMEIsS0FBQWkwQixPQUNBajBCLEtBQUE0SCxJQUFBczdDLEdBRUEsTUFBQUMsRUFBQSxJQUFBakMsR0FBQUMsR0E5RUEsRUE4RUExdUIsRUFBQUMsR0FDQXl3QixFQUFBbHZCLE9BQUFqMEIsS0FBQWkwQixPQUNBajBCLEtBQUE0SCxJQUFBdTdDLEdBRUEsTUFBQUMsRUFBQSxJQUFBbEMsR0FBQUMsR0FsRkEsRUFrRkExdUIsRUFBQUMsR0FDQTB3QixFQUFBbnZCLE9BQUFqMEIsS0FBQWkwQixPQUNBajBCLEtBQUE0SCxJQUFBdzdDLEdBRUEsTUFBQUMsRUFBQSxJQUFBbkMsR0FBQUMsR0F0RkEsRUFzRkExdUIsRUFBQUMsR0FDQTJ3QixFQUFBcHZCLE9BQUFqMEIsS0FBQWkwQixPQUNBajBCLEtBQUE0SCxJQUFBeTdDLEdBRUEsTUFBQUMsRUFBQSxJQUFBcEMsR0FBQUMsR0ExRkEsRUEwRkExdUIsRUFBQUMsR0FDQTR3QixFQUFBcnZCLE9BQUFqMEIsS0FBQWkwQixPQUNBajBCLEtBQUE0SCxJQUFBMDdDLEVBRUEsQ0FLQSxzQkFBQUMsR0FFQSxNQUFBNXdCLEVBQUEzeUIsS0FBQTJ5QixpQkFFQTZ3QixFQUFBeGpELEtBQUFzbkIsU0FBQW04QixVQUVBUixFQUFBQyxFQUFBQyxFQUFBQyxFQUFBQyxFQUFBQyxHQUFBRSxFQUVBLElBQUEsTUFBQXZnQyxLQUFBdWdDLEVBQUF4akQsS0FBQWk0QixPQUFBaFYsR0FFQSxHQUFBMFAsSUFBQXJ6QixHQUVBMmpELEVBQUFyekIsR0FBQWpwQixJQUFBLEVBQUEsRUFBQSxHQUNBczhDLEVBQUFoNEIsT0FBQSxFQUFBLEVBQUEsR0FFQWk0QixFQUFBdHpCLEdBQUFqcEIsSUFBQSxFQUFBLEVBQUEsR0FDQXU4QyxFQUFBajRCLFFBQUEsRUFBQSxFQUFBLEdBRUFrNEIsRUFBQXZ6QixHQUFBanBCLElBQUEsRUFBQSxHQUFBLEdBQ0F3OEMsRUFBQWw0QixPQUFBLEVBQUEsRUFBQSxHQUVBbTRCLEVBQUF4ekIsR0FBQWpwQixJQUFBLEVBQUEsRUFBQSxHQUNBeThDLEVBQUFuNEIsT0FBQSxHQUFBLEVBQUEsR0FFQW80QixFQUFBenpCLEdBQUFqcEIsSUFBQSxFQUFBLEVBQUEsR0FDQTA4QyxFQUFBcDRCLE9BQUEsRUFBQSxFQUFBLEdBRUFxNEIsRUFBQTF6QixHQUFBanBCLElBQUEsRUFBQSxFQUFBLEdBQ0EyOEMsRUFBQXI0QixPQUFBLEVBQUEsR0FBQSxPQUVBLElBQUEwSCxJQUFBcHpCLEdBc0JBLE1BQUEsSUFBQTZELE1BQUEseUVBQUF1dkIsR0FwQkFzd0IsRUFBQXJ6QixHQUFBanBCLElBQUEsR0FBQSxFQUFBLEdBQ0FzOEMsRUFBQWg0QixRQUFBLEVBQUEsRUFBQSxHQUVBaTRCLEVBQUF0ekIsR0FBQWpwQixJQUFBLEdBQUEsRUFBQSxHQUNBdThDLEVBQUFqNEIsT0FBQSxFQUFBLEVBQUEsR0FFQWs0QixFQUFBdnpCLEdBQUFqcEIsSUFBQSxFQUFBLEVBQUEsR0FDQXc4QyxFQUFBbDRCLE9BQUEsRUFBQSxFQUFBLEdBRUFtNEIsRUFBQXh6QixHQUFBanBCLElBQUEsRUFBQSxHQUFBLEdBQ0F5OEMsRUFBQW40QixPQUFBLEdBQUEsRUFBQSxHQUVBbzRCLEVBQUF6ekIsR0FBQWpwQixJQUFBLEdBQUEsRUFBQSxHQUNBMDhDLEVBQUFwNEIsT0FBQSxFQUFBLEVBQUEsR0FFQXE0QixFQUFBMXpCLEdBQUFqcEIsSUFBQSxHQUFBLEVBQUEsR0FDQTI4QyxFQUFBcjRCLE9BQUEsRUFBQSxHQUFBLEVBTUEsQ0FFQSxJQUFBLE1BQUFoSSxLQUFBdWdDLEVBRUF4akQsS0FBQTRILElBQUFxYixHQUVBQSxFQUFBZ1csbUJBSUEsQ0FTQSxNQUFBM1osQ0FBQWlnQyxFQUFBbUUsR0FFQSxPQUFBMWpELEtBQUFxMUIsUUFBQXIxQixLQUFBaTVCLG9CQUVBLE1BQUE1Z0IsYUFBQUEsRUFBQTJxQyxrQkFBQUEsR0FBQWhqRCxLQUVBQSxLQUFBMnlCLG1CQUFBNHNCLEVBQUE1c0IsbUJBRUEzeUIsS0FBQTJ5QixpQkFBQTRzQixFQUFBNXNCLGlCQUVBM3lCLEtBQUF1akQsMEJBSUEsTUFBQU4sRUFBQUMsRUFBQUMsRUFBQUMsRUFBQUMsRUFBQUMsR0FBQXRqRCxLQUFBc25CLFNBRUFrNEIsRUFBQUQsRUFBQUUsa0JBQ0FrRSxFQUFBcEUsRUFBQXFFLG9CQUNBQyxFQUFBdEUsRUFBQXVFLHVCQUVBQyxFQUFBeEUsRUFBQXlFLEdBQUEveEMsUUFFQXN0QyxFQUFBeUUsR0FBQS94QyxTQUFBLEVBRUEsTUFBQThGLEVBQUFNLEVBQUEyRCxRQUFBakUsZ0JBRUFNLEVBQUEyRCxRQUFBakUsaUJBQUEsRUFFQXduQyxFQUFBMEUsZ0JBQUE1ckMsRUFBQSxFQUFBMnFDLEdBQ0F6RCxFQUFBMkUsT0FBQVIsRUFBQVQsR0FFQTFELEVBQUEwRSxnQkFBQTVyQyxFQUFBLEVBQUEycUMsR0FDQXpELEVBQUEyRSxPQUFBUixFQUFBUixHQUVBM0QsRUFBQTBFLGdCQUFBNXJDLEVBQUEsRUFBQTJxQyxHQUNBekQsRUFBQTJFLE9BQUFSLEVBQUFQLEdBRUE1RCxFQUFBMEUsZ0JBQUE1ckMsRUFBQSxFQUFBMnFDLEdBQ0F6RCxFQUFBMkUsT0FBQVIsRUFBQU4sR0FFQTdELEVBQUEwRSxnQkFBQTVyQyxFQUFBLEVBQUEycUMsR0FDQXpELEVBQUEyRSxPQUFBUixFQUFBTCxHQUtBaHJDLEVBQUEyRCxRQUFBakUsZ0JBQUFBLEVBRUF3bkMsRUFBQTBFLGdCQUFBNXJDLEVBQUEsRUFBQTJxQyxHQUNBekQsRUFBQTJFLE9BQUFSLEVBQUFKLEdBRUEvRCxFQUFBMEUsZ0JBQUF6RSxFQUFBbUUsRUFBQUUsR0FFQXRFLEVBQUF5RSxHQUFBL3hDLFFBQUE4eEMsRUFFQTFyQyxFQUFBMkQsUUFBQTVDLGtCQUFBLENBRUEsRUN2TkEsTUFBQStxQyxXQUFBdnRDLEdBZ0JBLFdBQUFoVSxDQUFBdVQsRUFBQSxHQUFBVyxFQUFBL2YsSUFBQWlnQixFQUFBQyxFQUFBQyxFQUFBQyxFQUFBQyxFQUFBdlgsRUFBQXdYLEVBQUFwRSxHQUVBc0UsTUFBQXBCLEVBQUFXLEVBQUFFLEVBQUFDLEVBQUFDLEVBQUFDLEVBQUFDLEVBQUF2WCxFQUFBd1gsRUFBQXBFLEdBU0FqVCxLQUFBb2tELGVBQUEsRUFXQXBrRCxLQUFBaVksT0FBQSxDQUVBLENBT0EsVUFBQTlCLEdBRUEsT0FBQW5XLEtBQUF3VSxLQUVBLENBRUEsVUFBQTJCLENBQUFsVSxHQUVBakMsS0FBQXdVLE1BQUF2UyxDQUVBLEVDOURBLE1BQUFvaUQsV0FBQWhvQyxHQVFBLFdBQUF6WixDQUFBaWpCLEVBQUEsRUFBQTFLLEVBQUEsQ0FBQSxHQUVBNUQsTUFBQXNPLEVBQUFBLEVBQUExSyxHQVNBbmIsS0FBQXNrRCx5QkFBQSxFQUVBLE1BQUE5dkMsRUFBQSxDQUFBdk4sTUFBQTRlLEVBQUEzZSxPQUFBMmUsRUFBQXhLLE1BQUEsR0FDQWxGLEVBQUEsQ0FBQTNCLEVBQUFBLEVBQUFBLEVBQUFBLEVBQUFBLEVBQUFBLEdBT0F4VSxLQUFBZ2MsUUFBQSxJQUFBbW9DLEdBQUFodUMsRUFBQWdGLEVBQUFyRSxRQUFBcUUsRUFBQW5FLE1BQUFtRSxFQUFBbEUsTUFBQWtFLEVBQUFqRSxVQUFBaUUsRUFBQWhFLFVBQUFnRSxFQUFBL0QsT0FBQStELEVBQUF0YixLQUFBc2IsRUFBQTlELFdBQUE4RCxFQUFBbEksWUFVQWpULEtBQUFnYyxRQUFBMUQsdUJBQUEsRUFFQXRZLEtBQUFnYyxRQUFBakUscUJBQUFoWSxJQUFBb2IsRUFBQXBELGlCQUFBb0QsRUFBQXBELGdCQUNBL1gsS0FBQWdjLFFBQUE3RSxlQUFBcFgsSUFBQW9iLEVBQUFoRSxVQUFBZ0UsRUFBQWhFLFVBQUF2ZixFQUVBLENBU0EsMEJBQUEyc0QsQ0FBQWhGLEVBQUF2akMsR0FFQWhjLEtBQUFnYyxRQUFBbmMsS0FBQW1jLEVBQUFuYyxLQUNBRyxLQUFBZ2MsUUFBQS9JLFdBQUErSSxFQUFBL0ksV0FFQWpULEtBQUFnYyxRQUFBakUsZ0JBQUFpRSxFQUFBakUsZ0JBQ0EvWCxLQUFBZ2MsUUFBQTdFLFVBQUE2RSxFQUFBN0UsVUFDQW5YLEtBQUFnYyxRQUFBOUUsVUFBQThFLEVBQUE5RSxVQUVBLE1BQUFzdEMsRUFBQSxDQUVBcEYsU0FBQSxDQUNBcUYsVUFBQSxDQUFBeGlELE1BQUEsT0FHQWkrQyxhQUFBLHFZQW9CQUMsZUFBQSxnVkFvQkF2NUIsRUFBQSxJQUFBMjJCLEdBQUEsRUFBQSxFQUFBLEdBRUF4Z0IsRUFBQSxJQUFBK2lCLEdBQUEsQ0FFQTF2QyxLQUFBLHNCQUVBZ3ZDLFNBQUFILEdBQUF1RixFQUFBcEYsVUFDQWMsYUFBQXNFLEVBQUF0RSxhQUNBQyxlQUFBcUUsRUFBQXJFLGVBQ0E3VCxLM0NqQ1ksRTJDa0NaRCxTM0NqQlksSTJDcUJadFAsRUFBQXFpQixTQUFBcUYsVUFBQXhpRCxNQUFBK1osRUFFQSxNQUFBMG9DLEVBQUEsSUFBQXZJLEdBQUF2MUIsRUFBQW1XLEdBRUE0bkIsRUFBQTNvQyxFQUFBN0UsVUFHQTZFLEVBQUE3RSxZQUFBcGYsS0FBQWlrQixFQUFBN0UsVUFBQXZmLElBVUEsT0FSQSxJQUFBbXJELEdBQUEsRUFBQSxHQUFBL2lELE1BQ0FzZixPQUFBaWdDLEVBQUFtRixHQUVBMW9DLEVBQUE3RSxVQUFBd3RDLEVBRUFELEVBQUE5OUIsU0FBQTNOLFVBQ0F5ckMsRUFBQTNuQixTQUFBOWpCLFVBRUFqWixJQUVBLENBVUEsS0FBQStjLENBQUF3aUMsRUFBQWx0QyxHQUFBLEVBQUFnSixHQUFBLEVBQUF1cEMsR0FBQSxHQUVBLE1BQUFwRixFQUFBRCxFQUFBRSxrQkFFQSxJQUFBLElBQUExK0MsRUFBQSxFQUFBQSxFQUFBLEVBQUFBLElBRUF3K0MsRUFBQTBFLGdCQUFBamtELEtBQUFlLEdBRUF3K0MsRUFBQXhpQyxNQUFBMUssRUFBQWdKLEVBQUF1cEMsR0FJQXJGLEVBQUEwRSxnQkFBQXpFLEVBRUEsRUNoS0EsTUFBQXFGLFdBQUExdkIsR0FFQSxXQUFBdnlCLEdBRUEyVSxRQVNBdlgsS0FBQThrRCxTQUFBLEVBRUE5a0QsS0FBQUgsS0FBQSxPQUVBLEVDakNBLE1BQUFrbEQsR0FBQSxDQUFBbGxELEtBQUEsUUFRQSxNQUFBbWxELEdBS0EsV0FBQXBpRCxHQVVBNUMsS0FBQWlsRCxXQUFBLEtBVUFqbEQsS0FBQWtsRCxNQUFBLEtBVUFsbEQsS0FBQW1sRCxNQUFBLElBRUEsQ0FPQSxZQUFBQyxHQWFBLE9BWEEsT0FBQXBsRCxLQUFBbWxELFFBRUFubEQsS0FBQW1sRCxNQUFBLElBQUFOLEdBQ0E3a0QsS0FBQW1sRCxNQUFBcnRDLGtCQUFBLEVBQ0E5WCxLQUFBbWxELE1BQUFudkIsU0FBQSxFQUVBaDJCLEtBQUFtbEQsTUFBQUUsT0FBQSxDQUFBLEVBQ0FybEQsS0FBQW1sRCxNQUFBRyxXQUFBLENBQUFDLFVBQUEsSUFJQXZsRCxLQUFBbWxELEtBRUEsQ0FPQSxpQkFBQUssR0FjQSxPQVpBLE9BQUF4bEQsS0FBQWlsRCxhQUVBamxELEtBQUFpbEQsV0FBQSxJQUFBSixHQUNBN2tELEtBQUFpbEQsV0FBQW50QyxrQkFBQSxFQUNBOVgsS0FBQWlsRCxXQUFBanZCLFNBQUEsRUFDQWgyQixLQUFBaWxELFdBQUFRLG1CQUFBLEVBQ0F6bEQsS0FBQWlsRCxXQUFBUyxlQUFBLElBQUExakMsR0FDQWhpQixLQUFBaWxELFdBQUFVLG9CQUFBLEVBQ0EzbEQsS0FBQWlsRCxXQUFBVyxnQkFBQSxJQUFBNWpDLElBSUFoaUIsS0FBQWlsRCxVQUVBLENBT0EsWUFBQVksR0FjQSxPQVpBLE9BQUE3bEQsS0FBQWtsRCxRQUVBbGxELEtBQUFrbEQsTUFBQSxJQUFBTCxHQUNBN2tELEtBQUFrbEQsTUFBQXB0QyxrQkFBQSxFQUNBOVgsS0FBQWtsRCxNQUFBbHZCLFNBQUEsRUFDQWgyQixLQUFBa2xELE1BQUFPLG1CQUFBLEVBQ0F6bEQsS0FBQWtsRCxNQUFBUSxlQUFBLElBQUExakMsR0FDQWhpQixLQUFBa2xELE1BQUFTLG9CQUFBLEVBQ0EzbEQsS0FBQWtsRCxNQUFBVSxnQkFBQSxJQUFBNWpDLElBSUFoaUIsS0FBQWtsRCxLQUVBLENBU0EsYUFBQXhrRCxDQUFBQyxHQW9CQSxPQWxCQSxPQUFBWCxLQUFBaWxELFlBRUFqbEQsS0FBQWlsRCxXQUFBdmtELGNBQUFDLEdBSUEsT0FBQVgsS0FBQWtsRCxPQUVBbGxELEtBQUFrbEQsTUFBQXhrRCxjQUFBQyxHQUlBLE9BQUFYLEtBQUFtbEQsT0FFQW5sRCxLQUFBbWxELE1BQUF6a0QsY0FBQUMsR0FJQVgsSUFFQSxDQVFBLE9BQUE4bEQsQ0FBQUMsR0FFQSxHQUFBQSxHQUFBQSxFQUFBQyxLQUFBLENBRUEsTUFBQUEsRUFBQWhtRCxLQUFBbWxELE1BRUEsR0FBQWEsRUFFQSxJQUFBLE1BQUFDLEtBQUFGLEVBQUFDLEtBQUE1b0IsU0FHQXA5QixLQUFBa21ELGNBQUFGLEVBQUFDLEVBTUEsQ0FJQSxPQUZBam1ELEtBQUFVLGNBQUEsQ0FBQWIsS0FBQSxZQUFBMFYsS0FBQXd3QyxJQUVBL2xELElBRUEsQ0FRQSxVQUFBbW1ELENBQUFKLEdBc0JBLE9BcEJBL2xELEtBQUFVLGNBQUEsQ0FBQWIsS0FBQSxlQUFBMFYsS0FBQXd3QyxJQUVBLE9BQUEvbEQsS0FBQWlsRCxhQUVBamxELEtBQUFpbEQsV0FBQWp2QixTQUFBLEdBSUEsT0FBQWgyQixLQUFBa2xELFFBRUFsbEQsS0FBQWtsRCxNQUFBbHZCLFNBQUEsR0FJQSxPQUFBaDJCLEtBQUFtbEQsUUFFQW5sRCxLQUFBbWxELE1BQUFudkIsU0FBQSxHQUlBaDJCLElBRUEsQ0FZQSxNQUFBc2YsQ0FBQXltQyxFQUFBSyxFQUFBQyxHQUVBLElBQUFDLEVBQUEsS0FDQUMsRUFBQSxLQUNBQyxFQUFBLEtBRUEsTUFBQUMsRUFBQXptRCxLQUFBaWxELFdBQ0F5QixFQUFBMW1ELEtBQUFrbEQsTUFDQWMsRUFBQWhtRCxLQUFBbWxELE1BRUEsR0FBQVksR0FBQSxvQkFBQUssRUFBQU8sUUFBQUMsZ0JBQUEsQ0FFQSxHQUFBWixHQUFBRCxFQUFBQyxLQUFBLENBRUFRLEdBQUEsRUFFQSxJQUFBLE1BQUFQLEtBQUFGLEVBQUFDLEtBQUE1b0IsU0FBQSxDQUdBLE1BQUF5cEIsRUFBQVQsRUFBQVUsYUFBQWIsRUFBQUksR0FHQVUsRUFBQS9tRCxLQUFBa21ELGNBQUFGLEVBQUFDLEdBRUEsT0FBQVksSUFFQUUsRUFBQW4zQyxPQUFBckYsVUFBQXM4QyxFQUFBRyxVQUFBcDNDLFFBQ0FtM0MsRUFBQW4zQyxPQUFBbWlCLFVBQUFnMUIsRUFBQXYxQixTQUFBdTFCLEVBQUE3M0MsU0FBQTYzQyxFQUFBMTNDLE9BQ0EwM0MsRUFBQWh4Qix3QkFBQSxFQUNBZ3hCLEVBQUFFLFlBQUFKLEVBQUF0aUMsUUFJQXdpQyxFQUFBL3dCLFFBQUEsT0FBQTZ3QixDQUVBLENBS0EsTUFBQUssRUFBQWxCLEVBQUFYLE9BQUEsb0JBQ0E4QixFQUFBbkIsRUFBQVgsT0FBQSxhQUNBL3RCLEVBQUE0dkIsRUFBQTExQixTQUFBNW5CLFdBQUF1OUMsRUFBQTMxQixVQUVBNDFCLEVBQUEsSUFDQUMsRUFBQSxLQUVBckIsRUFBQVYsV0FBQUMsVUFBQWp1QixFQUFBOHZCLEVBQUFDLEdBRUFyQixFQUFBVixXQUFBQyxVQUFBLEVBQ0F2bEQsS0FBQVUsY0FBQSxDQUNBYixLQUFBLFdBQ0F5bkQsV0FBQXZCLEVBQUF1QixXQUNBMW1ELE9BQUFaLFNBR0FnbUQsRUFBQVYsV0FBQUMsVUFBQWp1QixHQUFBOHZCLEVBQUFDLElBRUFyQixFQUFBVixXQUFBQyxVQUFBLEVBQ0F2bEQsS0FBQVUsY0FBQSxDQUNBYixLQUFBLGFBQ0F5bkQsV0FBQXZCLEVBQUF1QixXQUNBMW1ELE9BQUFaLE9BS0EsTUFFQSxPQUFBMG1ELEdBQUFYLEVBQUF3QixZQUVBaEIsRUFBQUgsRUFBQW9CLFFBQUF6QixFQUFBd0IsVUFBQWxCLEdBRUEsT0FBQUUsSUFFQUcsRUFBQTkyQyxPQUFBckYsVUFBQWc4QyxFQUFBUyxVQUFBcDNDLFFBQ0E4MkMsRUFBQTkyQyxPQUFBbWlCLFVBQUEyMEIsRUFBQWwxQixTQUFBazFCLEVBQUF4M0MsU0FBQXczQyxFQUFBcjNDLE9BQ0FxM0MsRUFBQTN3Qix3QkFBQSxFQUVBd3dCLEVBQUFiLGdCQUVBZ0IsRUFBQWpCLG1CQUFBLEVBQ0FpQixFQUFBaEIsZUFBQWgrQyxLQUFBNitDLEVBQUFiLGlCQUlBZ0IsRUFBQWpCLG1CQUFBLEVBSUFjLEVBQUFYLGlCQUVBYyxFQUFBZixvQkFBQSxFQUNBZSxFQUFBZCxnQkFBQWwrQyxLQUFBNitDLEVBQUFYLGtCQUlBYyxFQUFBZixvQkFBQSxJQVVBLE9BQUFjLElBRUFILEVBQUFGLEVBQUFvQixRQUFBekIsRUFBQTBCLGVBQUFwQixHQUdBLE9BQUFDLEdBQUEsT0FBQUMsSUFFQUQsRUFBQUMsR0FJQSxPQUFBRCxJQUVBRyxFQUFBNzJDLE9BQUFyRixVQUFBKzdDLEVBQUFVLFVBQUFwM0MsUUFDQTYyQyxFQUFBNzJDLE9BQUFtaUIsVUFBQTAwQixFQUFBajFCLFNBQUFpMUIsRUFBQXYzQyxTQUFBdTNDLEVBQUFwM0MsT0FDQW8zQyxFQUFBMXdCLHdCQUFBLEVBRUF1d0IsRUFBQVosZ0JBRUFlLEVBQUFoQixtQkFBQSxFQUNBZ0IsRUFBQWYsZUFBQWgrQyxLQUFBNCtDLEVBQUFaLGlCQUlBZSxFQUFBaEIsbUJBQUEsRUFJQWEsRUFBQVYsaUJBRUFhLEVBQUFkLG9CQUFBLEVBQ0FjLEVBQUFiLGdCQUFBbCtDLEtBQUE0K0MsRUFBQVYsa0JBSUFhLEVBQUFkLG9CQUFBLEVBSUEzbEQsS0FBQVUsY0FBQXFrRCxLQU9BLENBb0JBLE9BbEJBLE9BQUEwQixJQUVBQSxFQUFBendCLFFBQUEsT0FBQXN3QixHQUlBLE9BQUFJLElBRUFBLEVBQUExd0IsUUFBQSxPQUFBdXdCLEdBSUEsT0FBQVAsSUFFQUEsRUFBQWh3QixRQUFBLE9BQUF3d0IsR0FJQXhtRCxJQUVBLENBVUEsYUFBQWttRCxDQUFBRixFQUFBQyxHQUVBLFFBQUFsbUQsSUFBQWltRCxFQUFBWCxPQUFBWSxFQUFBeUIsV0FBQSxDQUVBLE1BQUFYLEVBQUEsSUFBQWxDLEdBQ0FrQyxFQUFBanZDLGtCQUFBLEVBQ0FpdkMsRUFBQS93QixTQUFBLEVBQ0Fnd0IsRUFBQVgsT0FBQVksRUFBQXlCLFdBQUFYLEVBRUFmLEVBQUFwK0MsSUFBQW0vQyxFQUVBLENBRUEsT0FBQWYsRUFBQVgsT0FBQVksRUFBQXlCLFVBRUEsRUMxWkEsTUFBQUMsR0FRQSxXQUFBL2tELENBQUF5UCxFQUFBdTFDLEVBQUEsT0FTQTVuRCxLQUFBNm5ELFdBQUEsRUFPQTduRCxLQUFBb1EsS0FBQSxHQU9BcFEsS0FBQXFTLE1BQUEsSUFBQXkzQixHQUFBejNCLEdBUUFyUyxLQUFBNG5ELFFBQUFBLENBRUEsQ0FPQSxLQUFBbmdELEdBRUEsT0FBQSxJQUFBa2dELEdBQUEzbkQsS0FBQXFTLE1BQUFyUyxLQUFBNG5ELFFBRUEsQ0FRQSxNQUFBNXhDLEdBRUEsTUFBQSxDQUNBblcsS0FBQSxVQUNBdVEsS0FBQXBRLEtBQUFvUSxLQUNBaUMsTUFBQXJTLEtBQUFxUyxNQUFBMjRCLFNBQ0E0YyxRQUFBNW5ELEtBQUE0bkQsUUFHQSxFQ3RFQSxNQUFBRSxHQVNBLFdBQUFsbEQsQ0FBQXlQLEVBQUFvZ0IsRUFBQSxFQUFBQyxFQUFBLEtBU0ExeUIsS0FBQStuRCxPQUFBLEVBT0EvbkQsS0FBQW9RLEtBQUEsR0FPQXBRLEtBQUFxUyxNQUFBLElBQUF5M0IsR0FBQXozQixHQVNBclMsS0FBQXl5QixLQUFBQSxFQVVBenlCLEtBQUEweUIsSUFBQUEsQ0FFQSxDQU9BLEtBQUFqckIsR0FFQSxPQUFBLElBQUFxZ0QsR0FBQTluRCxLQUFBcVMsTUFBQXJTLEtBQUF5eUIsS0FBQXp5QixLQUFBMHlCLElBRUEsQ0FRQSxNQUFBMWMsR0FFQSxNQUFBLENBQ0FuVyxLQUFBLE1BQ0F1USxLQUFBcFEsS0FBQW9RLEtBQ0FpQyxNQUFBclMsS0FBQXFTLE1BQUEyNEIsU0FDQXZZLEtBQUF6eUIsS0FBQXl5QixLQUNBQyxJQUFBMXlCLEtBQUEweUIsSUFHQSxFQ3BGQSxNQUFBczFCLFdBQUE3eUIsR0FLQSxXQUFBdnlCLEdBRUEyVSxRQVNBdlgsS0FBQW04QixTQUFBLEVBRUFuOEIsS0FBQUgsS0FBQSxRQVlBRyxLQUFBbzhCLFdBQUEsS0FVQXA4QixLQUFBczhCLFlBQUEsS0FTQXQ4QixLQUFBdXpDLElBQUEsS0FVQXZ6QyxLQUFBaW9ELHFCQUFBLEVBUUFqb0QsS0FBQWtvRCxvQkFBQSxFQVNBbG9ELEtBQUFtb0QsbUJBQUEsSUFBQWwxQixHQVNBanpCLEtBQUFvb0QscUJBQUEsRUFTQXBvRCxLQUFBcW9ELG9CQUFBLElBQUFwMUIsR0FTQWp6QixLQUFBc29ELGlCQUFBLEtBRUEsb0JBQUFDLG9CQUVBQSxtQkFBQTduRCxjQUFBLElBQUE4bkQsWUFBQSxVQUFBLENBQUFDLE9BQUF6b0QsT0FJQSxDQUVBLElBQUEwSCxDQUFBK1AsRUFBQTZsQixHQW1CQSxPQWpCQS9sQixNQUFBN1AsS0FBQStQLEVBQUE2bEIsR0FFQSxPQUFBN2xCLEVBQUEya0IsYUFBQXA4QixLQUFBbzhCLFdBQUEza0IsRUFBQTJrQixXQUFBMzBCLFNBQ0EsT0FBQWdRLEVBQUE2a0IsY0FBQXQ4QixLQUFBczhCLFlBQUE3a0IsRUFBQTZrQixZQUFBNzBCLFNBQ0EsT0FBQWdRLEVBQUE4N0IsTUFBQXZ6QyxLQUFBdXpDLElBQUE5N0IsRUFBQTg3QixJQUFBOXJDLFNBRUF6SCxLQUFBaW9ELHFCQUFBeHdDLEVBQUF3d0MscUJBQ0Fqb0QsS0FBQWtvRCxvQkFBQXp3QyxFQUFBeXdDLG9CQUNBbG9ELEtBQUFtb0QsbUJBQUF6Z0QsS0FBQStQLEVBQUEwd0Msb0JBRUFub0QsS0FBQW9vRCxxQkFBQTN3QyxFQUFBMndDLHFCQUNBcG9ELEtBQUFxb0Qsb0JBQUEzZ0QsS0FBQStQLEVBQUE0d0MscUJBRUEsT0FBQTV3QyxFQUFBNndDLG1CQUFBdG9ELEtBQUFzb0QsaUJBQUE3d0MsRUFBQTZ3QyxpQkFBQTdnRCxTQUVBekgsS0FBQThYLGlCQUFBTCxFQUFBSyxpQkFFQTlYLElBRUEsQ0FFQSxNQUFBZ1csQ0FBQUMsR0FFQSxNQUFBVixFQUFBZ0MsTUFBQXZCLE9BQUFDLEdBV0EsT0FUQSxPQUFBalcsS0FBQXV6QyxNQUFBaCtCLEVBQUF5USxPQUFBdXRCLElBQUF2ekMsS0FBQXV6QyxJQUFBdjlCLFVBRUFoVyxLQUFBaW9ELHFCQUFBLElBQUExeUMsRUFBQXlRLE9BQUFpaUMscUJBQUFqb0QsS0FBQWlvRCxzQkFDQSxJQUFBam9ELEtBQUFrb0Qsc0JBQUEzeUMsRUFBQXlRLE9BQUFraUMsb0JBQUFsb0QsS0FBQWtvRCxxQkFDQTN5QyxFQUFBeVEsT0FBQW1pQyxtQkFBQW5vRCxLQUFBbW9ELG1CQUFBMTlDLFVBRUEsSUFBQXpLLEtBQUFvb0QsdUJBQUE3eUMsRUFBQXlRLE9BQUFvaUMscUJBQUFwb0QsS0FBQW9vRCxzQkFDQTd5QyxFQUFBeVEsT0FBQXFpQyxvQkFBQXJvRCxLQUFBcW9ELG9CQUFBNTlDLFVBRUE4SyxDQUVBLEVDdkpBLE1BQUFtekMsR0FRQSxXQUFBOWxELENBQUEvQixFQUFBcTZDLEdBU0FsN0MsS0FBQTJvRCxxQkFBQSxFQU9BM29ELEtBQUFhLE1BQUFBLEVBT0FiLEtBQUFrN0MsT0FBQUEsRUFRQWw3QyxLQUFBK2IsV0FBQWhjLElBQUFjLEVBQUFBLEVBQUFJLE9BQUFpNkMsRUFBQSxFQVdBbDdDLEtBQUFtMUMsTUFBQXgyQyxHQVFBcUIsS0FBQW8xQyxhQUFBLEdBT0FwMUMsS0FBQThWLFFBQUEsRUFRQTlWLEtBQUE0VixLQUFBblUsSUFFQSxDQU1BLGdCQUFBNnpDLEdBQUEsQ0FVQSxlQUFBdi9CLENBQUE5VCxJQUVBLElBQUFBLEdBQUFqQyxLQUFBOFYsU0FFQSxDQVFBLFFBQUF5L0IsQ0FBQXR6QyxHQUlBLE9BRkFqQyxLQUFBbTFDLE1BQUFsekMsRUFFQWpDLElBRUEsQ0FRQSxjQUFBdzFDLENBQUFDLEVBQUExNUIsR0FFQS9iLEtBQUFvMUMsYUFBQWgxQyxLQUFBLENBQUFxMUMsUUFBQTE1QixTQUVBLENBS0EsaUJBQUEyNUIsR0FFQTExQyxLQUFBbzFDLGFBQUFuMEMsT0FBQSxDQUVBLENBUUEsSUFBQXlHLENBQUErUCxHQU9BLE9BTEF6WCxLQUFBYSxNQUFBLElBQUE0VyxFQUFBNVcsTUFBQStCLFlBQUE2VSxFQUFBNVcsT0FDQWIsS0FBQStiLE1BQUF0RSxFQUFBc0UsTUFDQS9iLEtBQUFrN0MsT0FBQXpqQyxFQUFBeWpDLE9BQ0FsN0MsS0FBQW0xQyxNQUFBMTlCLEVBQUEwOUIsTUFFQW4xQyxJQUVBLENBWUEsTUFBQTIxQyxDQUFBQyxFQUFBZ1QsRUFBQS9TLEdBRUFELEdBQUE1MUMsS0FBQWs3QyxPQUNBckYsR0FBQStTLEVBQUExTixPQUVBLElBQUEsSUFBQW42QyxFQUFBLEVBQUFDLEVBQUFoQixLQUFBazdDLE9BQUFuNkMsRUFBQUMsRUFBQUQsSUFFQWYsS0FBQWEsTUFBQSswQyxFQUFBNzBDLEdBQUE2bkQsRUFBQS9uRCxNQUFBZzFDLEVBQUE5MEMsR0FJQSxPQUFBZixJQUVBLENBU0EsR0FBQTJHLENBQUExRSxFQUFBdUksRUFBQSxHQUlBLE9BRkF4SyxLQUFBYSxNQUFBOEYsSUFBQTFFLEVBQUF1SSxHQUVBeEssSUFFQSxDQVFBLEtBQUF5SCxDQUFBOE4sUUFFQXhWLElBQUF3VixFQUFBc3pDLGVBRUF0ekMsRUFBQXN6QyxhQUFBLENBQUEsUUFJQTlvRCxJQUFBQyxLQUFBYSxNQUFBcVAsT0FBQTQ0QyxRQUVBOW9ELEtBQUFhLE1BQUFxUCxPQUFBNDRDLE1BQUFybkQsV0FJQTFCLElBQUF3VixFQUFBc3pDLGFBQUE3b0QsS0FBQWEsTUFBQXFQLE9BQUE0NEMsU0FFQXZ6QyxFQUFBc3pDLGFBQUE3b0QsS0FBQWEsTUFBQXFQLE9BQUE0NEMsT0FBQTlvRCxLQUFBYSxNQUFBQyxNQUFBLEdBQUFvUCxRQUlBLE1BQUFyUCxFQUFBLElBQUFiLEtBQUFhLE1BQUErQixZQUFBMlMsRUFBQXN6QyxhQUFBN29ELEtBQUFhLE1BQUFxUCxPQUFBNDRDLFFBRUFDLEVBQUEsSUFBQS9vRCxLQUFBNEMsWUFBQS9CLEVBQUFiLEtBQUFrN0MsUUFHQSxPQUZBNk4sRUFBQXhULFNBQUF2MUMsS0FBQW0xQyxPQUVBNFQsQ0FFQSxDQVVBLFFBQUE1UyxDQUFBcDBCLEdBSUEsT0FGQS9oQixLQUFBczFDLGlCQUFBdnpCLEVBRUEvaEIsSUFFQSxDQVFBLE1BQUFnVyxDQUFBVCxHQXdCQSxZQXRCQXhWLElBQUF3VixFQUFBc3pDLGVBRUF0ekMsRUFBQXN6QyxhQUFBLENBQUEsUUFNQTlvRCxJQUFBQyxLQUFBYSxNQUFBcVAsT0FBQTQ0QyxRQUVBOW9ELEtBQUFhLE1BQUFxUCxPQUFBNDRDLE1BQUFybkQsV0FJQTFCLElBQUF3VixFQUFBc3pDLGFBQUE3b0QsS0FBQWEsTUFBQXFQLE9BQUE0NEMsU0FFQXZ6QyxFQUFBc3pDLGFBQUE3b0QsS0FBQWEsTUFBQXFQLE9BQUE0NEMsT0FBQXh5QyxNQUFBSSxLQUFBLElBQUE1VCxZQUFBOUMsS0FBQWEsTUFBQXFQLFVBTUEsQ0FDQTBGLEtBQUE1VixLQUFBNFYsS0FDQTFGLE9BQUFsUSxLQUFBYSxNQUFBcVAsT0FBQTQ0QyxNQUNBanBELEtBQUFHLEtBQUFhLE1BQUErQixZQUFBd04sS0FDQThxQyxPQUFBbDdDLEtBQUFrN0MsT0FHQSxFQzFSQSxNQUFBOE4sR0FBQSxJQUFBaG5DLEdBT0EsTUFBQWluQyxHQVVBLFdBQUFybUQsQ0FBQWdtRCxFQUFBN1QsRUFBQXZxQyxFQUFBd3FDLEdBQUEsR0FTQWgxQyxLQUFBaTdDLDhCQUFBLEVBT0FqN0MsS0FBQW9RLEtBQUEsR0FPQXBRLEtBQUF1VixLQUFBcXpDLEVBT0E1b0QsS0FBQSswQyxTQUFBQSxFQU9BLzBDLEtBQUF3SyxPQUFBQSxFQU9BeEssS0FBQWcxQyxXQUFBQSxDQUVBLENBUUEsU0FBQWo1QixHQUVBLE9BQUEvYixLQUFBdVYsS0FBQXdHLEtBRUEsQ0FPQSxTQUFBbGIsR0FFQSxPQUFBYixLQUFBdVYsS0FBQTFVLEtBRUEsQ0FVQSxlQUFBa1YsQ0FBQTlULEdBRUFqQyxLQUFBdVYsS0FBQVEsWUFBQTlULENBRUEsQ0FTQSxZQUFBMFgsQ0FBQXJYLEdBRUEsSUFBQSxJQUFBdkIsRUFBQSxFQUFBQyxFQUFBaEIsS0FBQXVWLEtBQUF3RyxNQUFBaGIsRUFBQUMsRUFBQUQsSUFFQWlvRCxHQUFBdCtDLG9CQUFBMUssS0FBQWUsR0FFQWlvRCxHQUFBcnZDLGFBQUFyWCxHQUVBdEMsS0FBQWcyQyxPQUFBajFDLEVBQUFpb0QsR0FBQXhtRCxFQUFBd21ELEdBQUF2bUQsRUFBQXVtRCxHQUFBMXZDLEdBSUEsT0FBQXRaLElBRUEsQ0FTQSxpQkFBQXVpQixDQUFBamdCLEdBRUEsSUFBQSxJQUFBdkIsRUFBQSxFQUFBQyxFQUFBaEIsS0FBQStiLE1BQUFoYixFQUFBQyxFQUFBRCxJQUVBaW9ELEdBQUF0K0Msb0JBQUExSyxLQUFBZSxHQUVBaW9ELEdBQUF6bUMsa0JBQUFqZ0IsR0FFQXRDLEtBQUFnMkMsT0FBQWoxQyxFQUFBaW9ELEdBQUF4bUQsRUFBQXdtRCxHQUFBdm1ELEVBQUF1bUQsR0FBQTF2QyxHQUlBLE9BQUF0WixJQUVBLENBU0Esa0JBQUFzakIsQ0FBQWhoQixHQUVBLElBQUEsSUFBQXZCLEVBQUEsRUFBQUMsRUFBQWhCLEtBQUErYixNQUFBaGIsRUFBQUMsRUFBQUQsSUFFQWlvRCxHQUFBdCtDLG9CQUFBMUssS0FBQWUsR0FFQWlvRCxHQUFBMWxDLG1CQUFBaGhCLEdBRUF0QyxLQUFBZzJDLE9BQUFqMUMsRUFBQWlvRCxHQUFBeG1ELEVBQUF3bUQsR0FBQXZtRCxFQUFBdW1ELEdBQUExdkMsR0FJQSxPQUFBdFosSUFFQSxDQVNBLFlBQUF3SCxDQUFBaEgsRUFBQXkxQyxHQUVBLElBQUFoMEMsRUFBQWpDLEtBQUFhLE1BQUFMLEVBQUFSLEtBQUF1VixLQUFBMmxDLE9BQUFsN0MsS0FBQXdLLE9BQUF5ckMsR0FJQSxPQUZBajJDLEtBQUFnMUMsYUFBQS95QyxFQUFBVSxHQUFBVixFQUFBakMsS0FBQWEsUUFFQW9CLENBRUEsQ0FVQSxZQUFBc0YsQ0FBQS9HLEVBQUF5MUMsRUFBQWgwQyxHQU1BLE9BSkFqQyxLQUFBZzFDLGFBQUEveUMsRUFBQW9CLEdBQUFwQixFQUFBakMsS0FBQWEsUUFFQWIsS0FBQXVWLEtBQUExVSxNQUFBTCxFQUFBUixLQUFBdVYsS0FBQTJsQyxPQUFBbDdDLEtBQUF3SyxPQUFBeXJDLEdBQUFoMEMsRUFFQWpDLElBRUEsQ0FTQSxJQUFBcUgsQ0FBQTdHLEVBQUFnQyxHQU1BLE9BSkF4QyxLQUFBZzFDLGFBQUF4eUMsRUFBQWEsR0FBQWIsRUFBQXhDLEtBQUFhLFFBRUFiLEtBQUF1VixLQUFBMVUsTUFBQUwsRUFBQVIsS0FBQXVWLEtBQUEybEMsT0FBQWw3QyxLQUFBd0ssUUFBQWhJLEVBRUF4QyxJQUVBLENBU0EsSUFBQXNILENBQUE5RyxFQUFBaUMsR0FNQSxPQUpBekMsS0FBQWcxQyxhQUFBdnlDLEVBQUFZLEdBQUFaLEVBQUF6QyxLQUFBYSxRQUVBYixLQUFBdVYsS0FBQTFVLE1BQUFMLEVBQUFSLEtBQUF1VixLQUFBMmxDLE9BQUFsN0MsS0FBQXdLLE9BQUEsR0FBQS9ILEVBRUF6QyxJQUVBLENBU0EsSUFBQXlaLENBQUFqWixFQUFBOFksR0FNQSxPQUpBdFosS0FBQWcxQyxhQUFBMTdCLEVBQUFqVyxHQUFBaVcsRUFBQXRaLEtBQUFhLFFBRUFiLEtBQUF1VixLQUFBMVUsTUFBQUwsRUFBQVIsS0FBQXVWLEtBQUEybEMsT0FBQWw3QyxLQUFBd0ssT0FBQSxHQUFBOE8sRUFFQXRaLElBRUEsQ0FTQSxJQUFBMFosQ0FBQWxaLEVBQUErWSxHQU1BLE9BSkF2WixLQUFBZzFDLGFBQUF6N0IsRUFBQWxXLEdBQUFrVyxFQUFBdlosS0FBQWEsUUFFQWIsS0FBQXVWLEtBQUExVSxNQUFBTCxFQUFBUixLQUFBdVYsS0FBQTJsQyxPQUFBbDdDLEtBQUF3SyxPQUFBLEdBQUErTyxFQUVBdlosSUFFQSxDQVFBLElBQUE0SyxDQUFBcEssR0FFQSxJQUFBZ0MsRUFBQXhDLEtBQUF1VixLQUFBMVUsTUFBQUwsRUFBQVIsS0FBQXVWLEtBQUEybEMsT0FBQWw3QyxLQUFBd0ssUUFJQSxPQUZBeEssS0FBQWcxQyxhQUFBeHlDLEVBQUFHLEdBQUFILEVBQUF4QyxLQUFBYSxRQUVBMkIsQ0FFQSxDQVFBLElBQUFxSSxDQUFBckssR0FFQSxJQUFBaUMsRUFBQXpDLEtBQUF1VixLQUFBMVUsTUFBQUwsRUFBQVIsS0FBQXVWLEtBQUEybEMsT0FBQWw3QyxLQUFBd0ssT0FBQSxHQUlBLE9BRkF4SyxLQUFBZzFDLGFBQUF2eUMsRUFBQUUsR0FBQUYsRUFBQXpDLEtBQUFhLFFBRUE0QixDQUVBLENBUUEsSUFBQXVZLENBQUF4YSxHQUVBLElBQUE4WSxFQUFBdFosS0FBQXVWLEtBQUExVSxNQUFBTCxFQUFBUixLQUFBdVYsS0FBQTJsQyxPQUFBbDdDLEtBQUF3SyxPQUFBLEdBSUEsT0FGQXhLLEtBQUFnMUMsYUFBQTE3QixFQUFBM1csR0FBQTJXLEVBQUF0WixLQUFBYSxRQUVBeVksQ0FFQSxDQVFBLElBQUEyQixDQUFBemEsR0FFQSxJQUFBK1ksRUFBQXZaLEtBQUF1VixLQUFBMVUsTUFBQUwsRUFBQVIsS0FBQXVWLEtBQUEybEMsT0FBQWw3QyxLQUFBd0ssT0FBQSxHQUlBLE9BRkF4SyxLQUFBZzFDLGFBQUF6N0IsRUFBQTVXLEdBQUE0VyxFQUFBdlosS0FBQWEsUUFFQTBZLENBRUEsQ0FVQSxLQUFBdzhCLENBQUF2MUMsRUFBQWdDLEVBQUFDLEdBY0EsT0FaQWpDLEVBQUFBLEVBQUFSLEtBQUF1VixLQUFBMmxDLE9BQUFsN0MsS0FBQXdLLE9BRUF4SyxLQUFBZzFDLGFBRUF4eUMsRUFBQWEsR0FBQWIsRUFBQXhDLEtBQUFhLE9BQ0E0QixFQUFBWSxHQUFBWixFQUFBekMsS0FBQWEsUUFJQWIsS0FBQXVWLEtBQUExVSxNQUFBTCxFQUFBLEdBQUFnQyxFQUNBeEMsS0FBQXVWLEtBQUExVSxNQUFBTCxFQUFBLEdBQUFpQyxFQUVBekMsSUFFQSxDQVdBLE1BQUFnMkMsQ0FBQXgxQyxFQUFBZ0MsRUFBQUMsRUFBQTZXLEdBZ0JBLE9BZEE5WSxFQUFBQSxFQUFBUixLQUFBdVYsS0FBQTJsQyxPQUFBbDdDLEtBQUF3SyxPQUVBeEssS0FBQWcxQyxhQUVBeHlDLEVBQUFhLEdBQUFiLEVBQUF4QyxLQUFBYSxPQUNBNEIsRUFBQVksR0FBQVosRUFBQXpDLEtBQUFhLE9BQ0F5WSxFQUFBalcsR0FBQWlXLEVBQUF0WixLQUFBYSxRQUlBYixLQUFBdVYsS0FBQTFVLE1BQUFMLEVBQUEsR0FBQWdDLEVBQ0F4QyxLQUFBdVYsS0FBQTFVLE1BQUFMLEVBQUEsR0FBQWlDLEVBQ0F6QyxLQUFBdVYsS0FBQTFVLE1BQUFMLEVBQUEsR0FBQThZLEVBRUF0WixJQUVBLENBWUEsT0FBQWsyQyxDQUFBMTFDLEVBQUFnQyxFQUFBQyxFQUFBNlcsRUFBQUMsR0FrQkEsT0FoQkEvWSxFQUFBQSxFQUFBUixLQUFBdVYsS0FBQTJsQyxPQUFBbDdDLEtBQUF3SyxPQUVBeEssS0FBQWcxQyxhQUVBeHlDLEVBQUFhLEdBQUFiLEVBQUF4QyxLQUFBYSxPQUNBNEIsRUFBQVksR0FBQVosRUFBQXpDLEtBQUFhLE9BQ0F5WSxFQUFBalcsR0FBQWlXLEVBQUF0WixLQUFBYSxPQUNBMFksRUFBQWxXLEdBQUFrVyxFQUFBdlosS0FBQWEsUUFJQWIsS0FBQXVWLEtBQUExVSxNQUFBTCxFQUFBLEdBQUFnQyxFQUNBeEMsS0FBQXVWLEtBQUExVSxNQUFBTCxFQUFBLEdBQUFpQyxFQUNBekMsS0FBQXVWLEtBQUExVSxNQUFBTCxFQUFBLEdBQUE4WSxFQUNBdFosS0FBQXVWLEtBQUExVSxNQUFBTCxFQUFBLEdBQUErWSxFQUVBdlosSUFFQSxDQVVBLEtBQUF5SCxDQUFBOE4sR0FFQSxRQUFBeFYsSUFBQXdWLEVBQUEsQ0FFQTNPLFFBQUFwQixJQUFBLHFIQUVBLE1BQUEzRSxFQUFBLEdBRUEsSUFBQSxJQUFBRSxFQUFBLEVBQUFBLEVBQUFmLEtBQUErYixNQUFBaGIsSUFBQSxDQUVBLE1BQUFQLEVBQUFPLEVBQUFmLEtBQUF1VixLQUFBMmxDLE9BQUFsN0MsS0FBQXdLLE9BRUEsSUFBQSxJQUFBNmUsRUFBQSxFQUFBQSxFQUFBcnBCLEtBQUErMEMsU0FBQTFyQixJQUVBeG9CLEVBQUFULEtBQUFKLEtBQUF1VixLQUFBMVUsTUFBQUwsRUFBQTZvQixHQUlBLENBRUEsT0FBQSxJQUFBeXJCLEdBQUEsSUFBQTkwQyxLQUFBYSxNQUFBK0IsWUFBQS9CLEdBQUFiLEtBQUErMEMsU0FBQS8wQyxLQUFBZzFDLFdBRUEsQ0FjQSxZQVpBajFDLElBQUF3VixFQUFBMnpDLHFCQUVBM3pDLEVBQUEyekMsbUJBQUEsQ0FBQSxRQUlBbnBELElBQUF3VixFQUFBMnpDLG1CQUFBbHBELEtBQUF1VixLQUFBSyxRQUVBTCxFQUFBMnpDLG1CQUFBbHBELEtBQUF1VixLQUFBSyxNQUFBNVYsS0FBQXVWLEtBQUE5TixNQUFBOE4sSUFJQSxJQUFBMHpDLEdBQUExekMsRUFBQTJ6QyxtQkFBQWxwRCxLQUFBdVYsS0FBQUssTUFBQTVWLEtBQUErMEMsU0FBQS8wQyxLQUFBd0ssT0FBQXhLLEtBQUFnMUMsV0FJQSxDQVVBLE1BQUFoL0IsQ0FBQVQsR0FFQSxRQUFBeFYsSUFBQXdWLEVBQUEsQ0FFQTNPLFFBQUFwQixJQUFBLDBIQUVBLE1BQUEzRSxFQUFBLEdBRUEsSUFBQSxJQUFBRSxFQUFBLEVBQUFBLEVBQUFmLEtBQUErYixNQUFBaGIsSUFBQSxDQUVBLE1BQUFQLEVBQUFPLEVBQUFmLEtBQUF1VixLQUFBMmxDLE9BQUFsN0MsS0FBQXdLLE9BRUEsSUFBQSxJQUFBNmUsRUFBQSxFQUFBQSxFQUFBcnBCLEtBQUErMEMsU0FBQTFyQixJQUVBeG9CLEVBQUFULEtBQUFKLEtBQUF1VixLQUFBMVUsTUFBQUwsRUFBQTZvQixHQUlBLENBSUEsTUFBQSxDQUNBMHJCLFNBQUEvMEMsS0FBQSswQyxTQUNBbDFDLEtBQUFHLEtBQUFhLE1BQUErQixZQUFBd04sS0FDQXZQLE1BQUFBLEVBQ0FtMEMsV0FBQWgxQyxLQUFBZzFDLFdBR0EsQ0FnQkEsWUFaQWoxQyxJQUFBd1YsRUFBQTJ6QyxxQkFFQTN6QyxFQUFBMnpDLG1CQUFBLENBQUEsUUFJQW5wRCxJQUFBd1YsRUFBQTJ6QyxtQkFBQWxwRCxLQUFBdVYsS0FBQUssUUFFQUwsRUFBQTJ6QyxtQkFBQWxwRCxLQUFBdVYsS0FBQUssTUFBQTVWLEtBQUF1VixLQUFBUyxPQUFBVCxJQUlBLENBQ0EwbEMsOEJBQUEsRUFDQWxHLFNBQUEvMEMsS0FBQSswQyxTQUNBeC9CLEtBQUF2VixLQUFBdVYsS0FBQUssS0FDQXBMLE9BQUF4SyxLQUFBd0ssT0FDQXdxQyxXQUFBaDFDLEtBQUFnMUMsV0FLQSxFQzdnQkEsTUFBQW1VLFdBQUFoZCxHQVdBLFdBQUF2cEMsQ0FBQTY1QixHQUVBbGxCLFFBU0F2WCxLQUFBb3BELGtCQUFBLEVBRUFwcEQsS0FBQUgsS0FBQSxpQkFRQUcsS0FBQXFTLE1BQUEsSUFBQXkzQixHQUFBLFVBVUE5cEMsS0FBQTQ2QixJQUFBLEtBZUE1NkIsS0FBQTh3QyxTQUFBLEtBUUE5d0MsS0FBQWtQLFNBQUEsRUFRQWxQLEtBQUE4eUMsaUJBQUEsRUFTQTl5QyxLQUFBeXNDLGFBQUEsRUFRQXpzQyxLQUFBdXpDLEtBQUEsRUFFQXZ6QyxLQUFBaXZDLFVBQUF4UyxFQUVBLENBRUEsSUFBQS8wQixDQUFBK1AsR0FnQkEsT0FkQUYsTUFBQTdQLEtBQUErUCxHQUVBelgsS0FBQXFTLE1BQUEzSyxLQUFBK1AsRUFBQXBGLE9BRUFyUyxLQUFBNDZCLElBQUFuakIsRUFBQW1qQixJQUVBNTZCLEtBQUE4d0MsU0FBQXI1QixFQUFBcTVCLFNBRUE5d0MsS0FBQWtQLFNBQUF1SSxFQUFBdkksU0FFQWxQLEtBQUE4eUMsZ0JBQUFyN0IsRUFBQXE3QixnQkFFQTl5QyxLQUFBdXpDLElBQUE5N0IsRUFBQTg3QixJQUVBdnpDLElBRUEsRUN6SEEsSUFBQXFwRCxHQUVBLE1BQUFDLEdBQUEsSUFBQXRuQyxHQUNBdW5DLEdBQUEsSUFBQXZuQyxHQUNBd25DLEdBQUEsSUFBQXhuQyxHQUVBeW5DLEdBQUEsSUFBQTNpRCxHQUNBNGlELEdBQUEsSUFBQTVpRCxHQUNBNmlELEdBQUEsSUFBQWg4QixHQUVBaThCLEdBQUEsSUFBQTVuQyxHQUNBNm5DLEdBQUEsSUFBQTduQyxHQUNBOG5DLEdBQUEsSUFBQTluQyxHQUVBK25DLEdBQUEsSUFBQWpqRCxHQUNBa2pELEdBQUEsSUFBQWxqRCxHQUNBbWpELEdBQUEsSUFBQW5qRCxHQW1CQSxNQUFBb2pELFdBQUEvMEIsR0FPQSxXQUFBdnlCLENBQUFtNkIsRUFBQSxJQUFBb3NCLElBZUEsR0FiQTV4QyxRQVNBdlgsS0FBQW1xRCxVQUFBLEVBRUFucUQsS0FBQUgsS0FBQSxjQUVBRSxJQUFBc3BELEdBQUEsQ0FFQUEsR0FBQSxJQUFBaFMsR0FFQSxNQUFBK1MsRUFBQSxJQUFBdm5ELGFBQUEsRUFDQSxJQUFBLEdBQUEsRUFBQSxFQUFBLEVBQ0EsSUFBQSxHQUFBLEVBQUEsRUFBQSxFQUNBLEdBQUEsR0FBQSxFQUFBLEVBQUEsR0FDQSxHQUFBLEdBQUEsRUFBQSxFQUFBLElBR0ErbEQsRUFBQSxJQUFBRixHQUFBMEIsRUFBQSxHQUVBZixHQUFBdlIsU0FBQSxDQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxJQUNBdVIsR0FBQXBSLGFBQUEsV0FBQSxJQUFBZ1IsR0FBQUwsRUFBQSxFQUFBLEdBQUEsSUFDQVMsR0FBQXBSLGFBQUEsS0FBQSxJQUFBZ1IsR0FBQUwsRUFBQSxFQUFBLEdBQUEsR0FFQSxDQU9BNW9ELEtBQUE0bUIsU0FBQXlpQyxHQU9BcnBELEtBQUErOEIsU0FBQUEsRUFVQS84QixLQUFBK0ssT0FBQSxJQUFBakUsR0FBQSxHQUFBLEdBRUEsQ0FRQSxPQUFBK3hCLENBQUErakIsRUFBQUMsR0FFQSxPQUFBRCxFQUFBMzVCLFFBRUFyYyxRQUFBbXhCLE1BQUEseUZBSUF3eEIsR0FBQTNrQyxtQkFBQTVrQixLQUFBcWpCLGFBRUFzbUMsR0FBQWppRCxLQUFBazFDLEVBQUEzNUIsT0FBQUksYUFDQXJqQixLQUFBMDFCLGdCQUFBcHBCLGlCQUFBc3dDLEVBQUEzNUIsT0FBQUMsbUJBQUFsakIsS0FBQXFqQixhQUVBbW1DLEdBQUF6dUMsc0JBQUEvYSxLQUFBMDFCLGlCQUVBa25CLEVBQUEzNUIsT0FBQW8rQixzQkFBQSxJQUFBcmhELEtBQUErOEIsU0FBQStWLGlCQUVBeVcsR0FBQW5oRCxnQkFBQW9oRCxHQUFBbHdDLEdBSUEsTUFBQXBLLEVBQUFsUCxLQUFBKzhCLFNBQUE3dEIsU0FDQSxJQUFBaEosRUFBQUQsRUFFQSxJQUFBaUosSUFFQWpKLEVBQUEzRSxLQUFBMkUsSUFBQWlKLEdBQ0FoSixFQUFBNUUsS0FBQTRFLElBQUFnSixJQUlBLE1BQUFuRSxFQUFBL0ssS0FBQStLLE9BRUFzL0MsR0FBQVQsR0FBQWpqRCxLQUFBLElBQUEsR0FBQSxHQUFBNmlELEdBQUF6K0MsRUFBQXcrQyxHQUFBcmpELEVBQUFELEdBQ0Fva0QsR0FBQVIsR0FBQWxqRCxJQUFBLElBQUEsR0FBQSxHQUFBNmlELEdBQUF6K0MsRUFBQXcrQyxHQUFBcmpELEVBQUFELEdBQ0Fva0QsR0FBQVAsR0FBQW5qRCxJQUFBLEdBQUEsR0FBQSxHQUFBNmlELEdBQUF6K0MsRUFBQXcrQyxHQUFBcmpELEVBQUFELEdBRUE4akQsR0FBQXBqRCxJQUFBLEVBQUEsR0FDQXFqRCxHQUFBcmpELElBQUEsRUFBQSxHQUNBc2pELEdBQUF0akQsSUFBQSxFQUFBLEdBR0EsSUFBQXFpQixFQUFBNHpCLEVBQUE3eEIsSUFBQXFDLGtCQUFBdzhCLEdBQUFDLEdBQUFDLElBQUEsRUFBQVIsSUFFQSxHQUFBLE9BQUF0Z0MsSUFHQXFoQyxHQUFBUixHQUFBbGpELEtBQUEsR0FBQSxHQUFBLEdBQUE2aUQsR0FBQXorQyxFQUFBdytDLEdBQUFyakQsRUFBQUQsR0FDQStqRCxHQUFBcmpELElBQUEsRUFBQSxHQUVBcWlCLEVBQUE0ekIsRUFBQTd4QixJQUFBcUMsa0JBQUF3OEIsR0FBQUUsR0FBQUQsSUFBQSxFQUFBUCxJQUNBLE9BQUF0Z0MsR0FFQSxPQU1BLE1BQUFzTyxFQUFBc2xCLEVBQUE3eEIsSUFBQUYsT0FBQWpoQixXQUFBMC9DLElBRUFoeUIsRUFBQXNsQixFQUFBbnFCLE1BQUE2RSxFQUFBc2xCLEVBQUFscUIsS0FFQW1xQixFQUFBejhDLEtBQUEsQ0FFQWszQixTQUFBQSxFQUNBL1EsTUFBQStpQyxHQUFBN2hELFFBQ0EwUixHQUFBaWxCLEdBQUFXLGlCQUFBdXFCLEdBQUFNLEdBQUFDLEdBQUFDLEdBQUFDLEdBQUFDLEdBQUFDLEdBQUEsSUFBQW5qRCxJQUNBdTJDLEtBQUEsS0FDQXIzQixPQUFBaG1CLE1BSUEsQ0FFQSxJQUFBMEgsQ0FBQStQLEVBQUE2bEIsR0FRQSxPQU5BL2xCLE1BQUE3UCxLQUFBK1AsRUFBQTZsQixRQUVBdjlCLElBQUEwWCxFQUFBMU0sUUFBQS9LLEtBQUErSyxPQUFBckQsS0FBQStQLEVBQUExTSxRQUVBL0ssS0FBQSs4QixTQUFBdGxCLEVBQUFzbEIsU0FFQS84QixJQUVBLEVBSUEsU0FBQXFxRCxHQUFBQyxFQUFBQyxFQUFBeC9DLEVBQUFzRSxFQUFBbkosRUFBQUQsR0FHQXdqRCxHQUFBdmhELFdBQUFvaUQsRUFBQXYvQyxHQUFBbEQsVUFBQSxJQUFBTSxTQUFBa0gsUUFHQXRQLElBQUFtRyxHQUVBd2pELEdBQUFsbkQsRUFBQXlELEVBQUF3akQsR0FBQWpuRCxFQUFBMEQsRUFBQXVqRCxHQUFBaG5ELEVBQ0FpbkQsR0FBQWpuRCxFQUFBeUQsRUFBQXVqRCxHQUFBam5ELEVBQUF5RCxFQUFBd2pELEdBQUFobkQsR0FJQWluRCxHQUFBaGlELEtBQUEraEQsSUFLQWEsRUFBQTVpRCxLQUFBNmlELEdBQ0FELEVBQUE5bkQsR0FBQWtuRCxHQUFBbG5ELEVBQ0E4bkQsRUFBQTduRCxHQUFBaW5ELEdBQUFqbkQsRUFHQTZuRCxFQUFBM3dDLGFBQUFnd0MsR0FFQSxDQ3JPQSxNQUFBYSxHQUFBLElBQUF4b0MsR0FDQXlvQyxHQUFBLElBQUF6b0MsR0E0QkEsTUFBQTBvQyxXQUFBdjFCLEdBS0EsV0FBQXZ5QixHQUVBMlUsUUFTQXZYLEtBQUEycUQsT0FBQSxFQVNBM3FELEtBQUE0cUQsY0FBQSxFQUVBNXFELEtBQUFILEtBQUEsTUFFQTBULE9BQUFnaUIsaUJBQUF2MUIsS0FBQSxDQU9BNnFELE9BQUEsQ0FDQXAxQixZQUFBLEVBQ0F4ekIsTUFBQSxNQVlBakMsS0FBQThxRCxZQUFBLENBRUEsQ0FFQSxJQUFBcGpELENBQUErUCxHQUVBRixNQUFBN1AsS0FBQStQLEdBQUEsR0FFQSxNQUFBb3pDLEVBQUFwekMsRUFBQW96QyxPQUVBLElBQUEsSUFBQTlwRCxFQUFBLEVBQUFDLEVBQUE2cEQsRUFBQTVwRCxPQUFBRixFQUFBQyxFQUFBRCxJQUFBLENBRUEsTUFBQWdxRCxFQUFBRixFQUFBOXBELEdBRUFmLEtBQUFnckQsU0FBQUQsRUFBQS9rQyxPQUFBdmUsUUFBQXNqRCxFQUFBenpCLFNBQUF5ekIsRUFBQUUsV0FFQSxDQUlBLE9BRkFqckQsS0FBQThxRCxXQUFBcnpDLEVBQUFxekMsV0FFQTlxRCxJQUVBLENBV0EsUUFBQWdyRCxDQUFBaGxDLEVBQUFzUixFQUFBLEVBQUEyekIsRUFBQSxHQUVBM3pCLEVBQUFoMkIsS0FBQTZDLElBQUFtekIsR0FFQSxNQUFBdXpCLEVBQUE3cUQsS0FBQTZxRCxPQUVBLElBQUE3cEQsRUFFQSxJQUFBQSxFQUFBLEVBQUFBLEVBQUE2cEQsRUFBQTVwRCxVQUVBcTJCLEVBQUF1ekIsRUFBQTdwRCxHQUFBczJCLFVBRkF0MkIsS0FjQSxPQUpBNnBELEVBQUFwcUQsT0FBQU8sRUFBQSxFQUFBLENBQUFzMkIsU0FBQUEsRUFBQTJ6QixXQUFBQSxFQUFBamxDLE9BQUFBLElBRUFobUIsS0FBQTRILElBQUFvZSxHQUVBaG1CLElBRUEsQ0FTQSxXQUFBa3JELENBQUE1ekIsR0FFQSxNQUFBdXpCLEVBQUE3cUQsS0FBQTZxRCxPQUVBLElBQUEsSUFBQTlwRCxFQUFBLEVBQUFBLEVBQUE4cEQsRUFBQTVwRCxPQUFBRixJQUVBLEdBQUE4cEQsRUFBQTlwRCxHQUFBdTJCLFdBQUFBLEVBQUEsQ0FFQSxNQUFBNnpCLEVBQUFOLEVBQUFwcUQsT0FBQU0sRUFBQSxHQUdBLE9BRkFmLEtBQUFpNEIsT0FBQWt6QixFQUFBLEdBQUFubEMsU0FFQSxDQUVBLENBSUEsT0FBQSxDQUVBLENBT0EsZUFBQW9sQyxHQUVBLE9BQUFwckQsS0FBQTRxRCxhQUVBLENBU0Esb0JBQUFTLENBQUEvekIsR0FFQSxNQUFBdXpCLEVBQUE3cUQsS0FBQTZxRCxPQUVBLEdBQUFBLEVBQUE1cEQsT0FBQSxFQUFBLENBRUEsSUFBQUYsRUFBQUMsRUFFQSxJQUFBRCxFQUFBLEVBQUFDLEVBQUE2cEQsRUFBQTVwRCxPQUFBRixFQUFBQyxFQUFBRCxJQUFBLENBRUEsSUFBQXVxRCxFQUFBVCxFQUFBOXBELEdBQUF1MkIsU0FRQSxHQU5BdXpCLEVBQUE5cEQsR0FBQWlsQixPQUFBZ1EsVUFFQXMxQixHQUFBQSxFQUFBVCxFQUFBOXBELEdBQUFrcUQsWUFJQTN6QixFQUFBZzBCLEVBRUEsS0FJQSxDQUVBLE9BQUFULEVBQUE5cEQsRUFBQSxHQUFBaWxCLE1BRUEsQ0FFQSxPQUFBLElBRUEsQ0FRQSxPQUFBNlMsQ0FBQStqQixFQUFBQyxHQUlBLEdBRkE3OEMsS0FBQTZxRCxPQUVBNXBELE9BQUEsRUFBQSxDQUVBdXBELEdBQUF6dkMsc0JBQUEvYSxLQUFBcWpCLGFBRUEsTUFBQWlVLEVBQUFzbEIsRUFBQTd4QixJQUFBRixPQUFBamhCLFdBQUE0Z0QsSUFFQXhxRCxLQUFBcXJELHFCQUFBL3pCLEdBQUF1QixRQUFBK2pCLEVBQUFDLEVBRUEsQ0FFQSxDQVFBLE1BQUF2OUIsQ0FBQTJELEdBRUEsTUFBQTRuQyxFQUFBN3FELEtBQUE2cUQsT0FFQSxHQUFBQSxFQUFBNXBELE9BQUEsRUFBQSxDQUVBdXBELEdBQUF6dkMsc0JBQUFrSSxFQUFBSSxhQUNBb25DLEdBQUExdkMsc0JBQUEvYSxLQUFBcWpCLGFBRUEsTUFBQWlVLEVBQUFrekIsR0FBQTVnRCxXQUFBNmdELElBQUF4bkMsRUFBQXErQixLQUlBLElBQUF2Z0QsRUFBQUMsRUFFQSxJQUpBNnBELEVBQUEsR0FBQTdrQyxPQUFBZ1EsU0FBQSxFQUlBajFCLEVBQUEsRUFBQUMsRUFBQTZwRCxFQUFBNXBELE9BQUFGLEVBQUFDLEVBQUFELElBQUEsQ0FFQSxJQUFBdXFELEVBQUFULEVBQUE5cEQsR0FBQXUyQixTQVFBLEdBTkF1ekIsRUFBQTlwRCxHQUFBaWxCLE9BQUFnUSxVQUVBczFCLEdBQUFBLEVBQUFULEVBQUE5cEQsR0FBQWtxRCxjQUlBM3pCLEdBQUFnMEIsR0FPQSxNQUxBVCxFQUFBOXBELEVBQUEsR0FBQWlsQixPQUFBZ1EsU0FBQSxFQUNBNjBCLEVBQUE5cEQsR0FBQWlsQixPQUFBZ1EsU0FBQSxDQVFBLENBSUEsSUFGQWgyQixLQUFBNHFELGNBQUE3cEQsRUFBQSxFQUVBQSxFQUFBQyxFQUFBRCxJQUVBOHBELEVBQUE5cEQsR0FBQWlsQixPQUFBZ1EsU0FBQSxDQUlBLENBRUEsQ0FFQSxNQUFBaGdCLENBQUFDLEdBRUEsTUFBQVYsRUFBQWdDLE1BQUF2QixPQUFBQyxJQUVBLElBQUFqVyxLQUFBOHFELGFBQUF2MUMsRUFBQXlRLE9BQUE4a0MsWUFBQSxHQUVBdjFDLEVBQUF5USxPQUFBNmtDLE9BQUEsR0FFQSxNQUFBQSxFQUFBN3FELEtBQUE2cUQsT0FFQSxJQUFBLElBQUE5cEQsRUFBQSxFQUFBQyxFQUFBNnBELEVBQUE1cEQsT0FBQUYsRUFBQUMsRUFBQUQsSUFBQSxDQUVBLE1BQUFncUQsRUFBQUYsRUFBQTlwRCxHQUVBd1UsRUFBQXlRLE9BQUE2a0MsT0FBQXpxRCxLQUFBLENBQ0E0bEIsT0FBQStrQyxFQUFBL2tDLE9BQUFwUSxLQUNBMGhCLFNBQUF5ekIsRUFBQXp6QixTQUNBMnpCLFdBQUFGLEVBQUFFLFlBR0EsQ0FFQSxPQUFBMTFDLENBRUEsRUMxVEEsTUFBQWcyQyxHQUFBLElBQUF2cEMsR0FFQXdwQyxHQUFBLElBQUFueUMsR0FDQW95QyxHQUFBLElBQUFweUMsR0FFQXF5QyxHQUFBLElBQUExcEMsR0FDQTJwQyxHQUFBLElBQUFoK0IsR0FDQWkrQixHQUFBLElBQUE1cEMsR0FFQTZwQyxHQUFBLElBQUFqaUMsR0FDQWtpQyxHQUFBLElBQUFuK0IsR0FDQW8rQixHQUFBLElBQUFuaEMsR0FlQSxNQUFBb2hDLFdBQUE3UCxHQVFBLFdBQUF2NUMsQ0FBQWdrQixFQUFBbVcsR0FFQXhsQixNQUFBcVAsRUFBQW1XLEdBU0EvOEIsS0FBQTI4QixlQUFBLEVBRUEzOEIsS0FBQUgsS0FBQSxjQVVBRyxLQUFBNDhCLFNBQUFobUMsR0FPQW9KLEtBQUE2OEIsV0FBQSxJQUFBbFAsR0FPQTN0QixLQUFBaXNELGtCQUFBLElBQUF0K0IsR0FRQTN0QixLQUFBa25CLFlBQUEsS0FRQWxuQixLQUFBazhCLGVBQUEsSUFFQSxDQVFBLGtCQUFBL1UsR0FFQSxNQUFBUCxFQUFBNW1CLEtBQUE0bUIsU0FFQSxPQUFBNW1CLEtBQUFrbkIsY0FFQWxuQixLQUFBa25CLFlBQUEsSUFBQWhDLElBSUFsbEIsS0FBQWtuQixZQUFBNUIsWUFFQSxNQUFBdUIsRUFBQUQsRUFBQUUsYUFBQSxZQUVBLElBQUEsSUFBQS9sQixFQUFBLEVBQUFBLEVBQUE4bEIsRUFBQTlLLE1BQUFoYixJQUVBZixLQUFBaW5CLGtCQUFBbG1CLEVBQUE2cUQsSUFDQTVyRCxLQUFBa25CLFlBQUEzQixjQUFBcW1DLEdBSUEsQ0FRQSxxQkFBQW5ULEdBRUEsTUFBQTd4QixFQUFBNW1CLEtBQUE0bUIsU0FFQSxPQUFBNW1CLEtBQUFrOEIsaUJBRUFsOEIsS0FBQWs4QixlQUFBLElBQUF0UyxJQUlBNXBCLEtBQUFrOEIsZUFBQTVXLFlBRUEsTUFBQXVCLEVBQUFELEVBQUFFLGFBQUEsWUFFQSxJQUFBLElBQUEvbEIsRUFBQSxFQUFBQSxFQUFBOGxCLEVBQUE5SyxNQUFBaGIsSUFFQWYsS0FBQWluQixrQkFBQWxtQixFQUFBNnFELElBQ0E1ckQsS0FBQWs4QixlQUFBM1csY0FBQXFtQyxHQUlBLENBRUEsSUFBQWxrRCxDQUFBK1AsRUFBQTZsQixHQWFBLE9BWEEvbEIsTUFBQTdQLEtBQUErUCxFQUFBNmxCLEdBRUF0OUIsS0FBQTQ4QixTQUFBbmxCLEVBQUFtbEIsU0FDQTU4QixLQUFBNjhCLFdBQUFuMUIsS0FBQStQLEVBQUFvbEIsWUFDQTc4QixLQUFBaXNELGtCQUFBdmtELEtBQUErUCxFQUFBdzBDLG1CQUVBanNELEtBQUE4OEIsU0FBQXJsQixFQUFBcWxCLFNBRUEsT0FBQXJsQixFQUFBeVAsY0FBQWxuQixLQUFBa25CLFlBQUF6UCxFQUFBeVAsWUFBQXpmLFNBQ0EsT0FBQWdRLEVBQUF5a0IsaUJBQUFsOEIsS0FBQWs4QixlQUFBemtCLEVBQUF5a0IsZUFBQXowQixTQUVBekgsSUFFQSxDQUVBLE9BQUE2NEIsQ0FBQStqQixFQUFBQyxHQUVBLE1BQUE5ZixFQUFBLzhCLEtBQUErOEIsU0FDQTFaLEVBQUFyakIsS0FBQXFqQixpQkFFQXRqQixJQUFBZzlCLElBSUEsT0FBQS84QixLQUFBazhCLGdCQUFBbDhCLEtBQUF5NEMsd0JBRUFvVCxHQUFBbmtELEtBQUExSCxLQUFBazhCLGdCQUNBMnZCLEdBQUFseUMsYUFBQTBKLElBRUEsSUFBQXU1QixFQUFBN3hCLElBQUFwRCxpQkFBQWtrQyxNQUlBQyxHQUFBcGtELEtBQUEyYixHQUFBcFYsU0FDQTg5QyxHQUFBcmtELEtBQUFrMUMsRUFBQTd4QixLQUFBcFIsYUFBQW15QyxJQUlBLE9BQUE5ckQsS0FBQWtuQixjQUVBLElBQUE2a0MsR0FBQXJrQyxjQUFBMW5CLEtBQUFrbkIsY0FNQWxuQixLQUFBODhDLHNCQUFBRixFQUFBQyxFQUFBa1AsS0FFQSxDQUVBLGlCQUFBOWtDLENBQUF6bUIsRUFBQUksR0FNQSxPQUpBMlcsTUFBQTBQLGtCQUFBem1CLEVBQUFJLEdBRUFaLEtBQUFrc0QsbUJBQUExckQsRUFBQUksR0FFQUEsQ0FFQSxDQVNBLElBQUF1ckQsQ0FBQXJ2QixFQUFBRCxHQUVBNzhCLEtBQUE4OEIsU0FBQUEsT0FFQS84QixJQUFBODhCLElBRUE3OEIsS0FBQWk1QixtQkFBQSxHQUVBajVCLEtBQUE4OEIsU0FBQXN2QixvQkFFQXZ2QixFQUFBNzhCLEtBQUFxakIsYUFJQXJqQixLQUFBNjhCLFdBQUFuMUIsS0FBQW0xQixHQUNBNzhCLEtBQUFpc0Qsa0JBQUF2a0QsS0FBQW0xQixHQUFBNXVCLFFBRUEsQ0FLQSxJQUFBbytDLEdBRUFyc0QsS0FBQTg4QixTQUFBdXZCLE1BRUEsQ0FNQSxvQkFBQUMsR0FFQSxNQUFBN2xDLEVBQUEsSUFBQXBOLEdBRUFrekMsRUFBQXZzRCxLQUFBNG1CLFNBQUE0d0IsV0FBQStVLFdBRUEsSUFBQSxJQUFBeHJELEVBQUEsRUFBQUMsRUFBQXVyRCxFQUFBeHdDLE1BQUFoYixFQUFBQyxFQUFBRCxJQUFBLENBRUEwbEIsRUFBQS9iLG9CQUFBNmhELEVBQUF4ckQsR0FFQSxNQUFBc08sRUFBQSxFQUFBb1gsRUFBQXBkLGtCQUVBZ0csSUFBQThWLElBRUFzQixFQUFBcmUsZUFBQWlILEdBSUFvWCxFQUFBOWYsSUFBQSxFQUFBLEVBQUEsRUFBQSxHQUlBNGxELEVBQUFyVyxRQUFBbjFDLEVBQUEwbEIsRUFBQWprQixFQUFBaWtCLEVBQUFoa0IsRUFBQWdrQixFQUFBbk4sRUFBQW1OLEVBQUFsTixFQUVBLENBRUEsQ0FFQSxpQkFBQTBmLENBQUFDLEdBRUEzaEIsTUFBQTBoQixrQkFBQUMsR0FFQWw1QixLQUFBNDhCLFdBQUFobUMsR0FFQW9KLEtBQUFpc0Qsa0JBQUF2a0QsS0FBQTFILEtBQUFxakIsYUFBQXBWLFNBRUFqTyxLQUFBNDhCLFdBQUEvbEMsR0FFQW1KLEtBQUFpc0Qsa0JBQUF2a0QsS0FBQTFILEtBQUE2OEIsWUFBQTV1QixTQUlBckgsUUFBQUMsS0FBQSw2Q0FBQTdHLEtBQUE0OEIsU0FJQSxDQVdBLGtCQUFBc3ZCLENBQUExckQsRUFBQUksR0FFQSxNQUFBazhCLEVBQUE5OEIsS0FBQTg4QixTQUNBbFcsRUFBQTVtQixLQUFBNG1CLFNBRUE0a0MsR0FBQTlnRCxvQkFBQWtjLEVBQUE0d0IsV0FBQWdWLFVBQUFoc0QsR0FDQWlyRCxHQUFBL2dELG9CQUFBa2MsRUFBQTR3QixXQUFBK1UsV0FBQS9yRCxHQUVBK3FELEdBQUE3akQsS0FBQTlHLEdBQUErWSxhQUFBM1osS0FBQTY4QixZQUVBajhCLEVBQUErRixJQUFBLEVBQUEsRUFBQSxHQUVBLElBQUEsSUFBQTVGLEVBQUEsRUFBQUEsRUFBQSxFQUFBQSxJQUFBLENBRUEsTUFBQTByRCxFQUFBaEIsR0FBQWprRCxhQUFBekcsR0FFQSxHQUFBLElBQUEwckQsRUFBQSxDQUVBLE1BQUFDLEVBQUFsQixHQUFBaGtELGFBQUF6RyxHQUVBNHFELEdBQUFyL0MsaUJBQUF3d0IsRUFBQTZ2QixNQUFBRCxHQUFBcnBDLFlBQUF5WixFQUFBOHZCLGFBQUFGLElBRUE5ckQsRUFBQW1ILGdCQUFBMmpELEdBQUFoa0QsS0FBQTZqRCxJQUFBNXhDLGFBQUFneUMsSUFBQWMsRUFFQSxDQUVBLENBRUEsT0FBQTdyRCxFQUFBK1ksYUFBQTNaLEtBQUFpc0Qsa0JBRUEsRUMxVUEsTUFBQVksV0FBQTEzQixHQUtBLFdBQUF2eUIsR0FFQTJVLFFBU0F2WCxLQUFBOHNELFFBQUEsRUFFQTlzRCxLQUFBSCxLQUFBLE1BRUEsRUN2QkEsTUFBQWt0RCxXQUFBbjJDLEdBa0JBLFdBQUFoVSxDQUFBMlMsRUFBQSxLQUFBdE8sRUFBQSxFQUFBQyxFQUFBLEVBQUFrUSxFQUFBdlgsRUFBQWlYLEVBQUFFLEVBQUFDLEVBQUFDLEVBQUEzZixLQUFBNGYsRUFBQTVmLEtBQUE4ZixFQUFBcEUsR0FFQXNFLE1BQUEsS0FBQVQsRUFBQUUsRUFBQUMsRUFBQUMsRUFBQUMsRUFBQUMsRUFBQXZYLEVBQUF3WCxFQUFBcEUsR0FTQWpULEtBQUF3VyxlQUFBLEVBT0F4VyxLQUFBd1UsTUFBQSxDQUFBZSxLQUFBQSxFQUFBdE8sTUFBQUEsRUFBQUMsT0FBQUEsR0FVQWxILEtBQUErWCxpQkFBQSxFQVdBL1gsS0FBQWlZLE9BQUEsRUFVQWpZLEtBQUFrWSxnQkFBQSxDQUVBLEVDekVBLE1BQUE4MEMsR0FBQSxJQUFBci9CLEdBQ0FzL0IsR0FBQSxJQUFBdC9CLEdBeUJBLE1BQUF1L0IsR0FTQSxXQUFBdHFELENBQUErcEQsRUFBQSxHQUFBQyxFQUFBLElBRUE1c0QsS0FBQTRWLEtBQUFuVSxLQU9BekIsS0FBQTJzRCxNQUFBQSxFQUFBN3JELE1BQUEsR0FPQWQsS0FBQTRzRCxhQUFBQSxFQVNBNXNELEtBQUFtdEQsYUFBQSxLQVNBbnRELEtBQUFvdEQsWUFBQSxLQUVBcHRELEtBQUFxdEQsTUFFQSxDQU9BLElBQUFBLEdBRUEsTUFBQVYsRUFBQTNzRCxLQUFBMnNELE1BQ0FDLEVBQUE1c0QsS0FBQTRzRCxhQU1BLEdBSkE1c0QsS0FBQW10RCxhQUFBLElBQUF0cUQsYUFBQSxHQUFBOHBELEVBQUExckQsUUFJQSxJQUFBMnJELEVBQUEzckQsT0FFQWpCLEtBQUFvc0QseUJBTUEsR0FBQU8sRUFBQTFyRCxTQUFBMnJELEVBQUEzckQsT0FBQSxDQUVBMkYsUUFBQUMsS0FBQSxtRkFFQTdHLEtBQUE0c0QsYUFBQSxHQUVBLElBQUEsSUFBQTdyRCxFQUFBLEVBQUFxYixFQUFBcGMsS0FBQTJzRCxNQUFBMXJELE9BQUFGLEVBQUFxYixFQUFBcmIsSUFFQWYsS0FBQTRzRCxhQUFBeHNELEtBQUEsSUFBQXV0QixHQUlBLENBSUEsQ0FNQSxpQkFBQXkrQixHQUVBcHNELEtBQUE0c0QsYUFBQTNyRCxPQUFBLEVBRUEsSUFBQSxJQUFBRixFQUFBLEVBQUFxYixFQUFBcGMsS0FBQTJzRCxNQUFBMXJELE9BQUFGLEVBQUFxYixFQUFBcmIsSUFBQSxDQUVBLE1BQUF1c0QsRUFBQSxJQUFBMy9CLEdBRUEzdEIsS0FBQTJzRCxNQUFBNXJELElBRUF1c0QsRUFBQTVsRCxLQUFBMUgsS0FBQTJzRCxNQUFBNXJELEdBQUFzaUIsYUFBQXBWLFNBSUFqTyxLQUFBNHNELGFBQUF4c0QsS0FBQWt0RCxFQUVBLENBRUEsQ0FLQSxJQUFBakIsR0FJQSxJQUFBLElBQUF0ckQsRUFBQSxFQUFBcWIsRUFBQXBjLEtBQUEyc0QsTUFBQTFyRCxPQUFBRixFQUFBcWIsRUFBQXJiLElBQUEsQ0FFQSxNQUFBd3NELEVBQUF2dEQsS0FBQTJzRCxNQUFBNXJELEdBRUF3c0QsR0FFQUEsRUFBQWxxQyxZQUFBM2IsS0FBQTFILEtBQUE0c0QsYUFBQTdyRCxJQUFBa04sUUFJQSxDQUlBLElBQUEsSUFBQWxOLEVBQUEsRUFBQXFiLEVBQUFwYyxLQUFBMnNELE1BQUExckQsT0FBQUYsRUFBQXFiLEVBQUFyYixJQUFBLENBRUEsTUFBQXdzRCxFQUFBdnRELEtBQUEyc0QsTUFBQTVyRCxHQUVBd3NELElBRUFBLEVBQUFsNEIsUUFBQWs0QixFQUFBbDRCLE9BQUF5M0IsUUFFQVMsRUFBQTM5QyxPQUFBbEksS0FBQTZsRCxFQUFBbDRCLE9BQUFoUyxhQUFBcFYsU0FDQXMvQyxFQUFBMzlDLE9BQUF6SCxTQUFBb2xELEVBQUFscUMsY0FJQWtxQyxFQUFBMzlDLE9BQUFsSSxLQUFBNmxELEVBQUFscUMsYUFJQWtxQyxFQUFBMzlDLE9BQUFtaUIsVUFBQXc3QixFQUFBLzdCLFNBQUErN0IsRUFBQXB1QyxXQUFBb3VDLEVBQUFsK0MsT0FJQSxDQUVBLENBS0EsTUFBQWlRLEdBRUEsTUFBQXF0QyxFQUFBM3NELEtBQUEyc0QsTUFDQUMsRUFBQTVzRCxLQUFBNHNELGFBQ0FPLEVBQUFudEQsS0FBQW10RCxhQUNBQyxFQUFBcHRELEtBQUFvdEQsWUFJQSxJQUFBLElBQUFyc0QsRUFBQSxFQUFBcWIsRUFBQXV3QyxFQUFBMXJELE9BQUFGLEVBQUFxYixFQUFBcmIsSUFBQSxDQUlBLE1BQUE2TyxFQUFBKzhDLEVBQUE1ckQsR0FBQTRyRCxFQUFBNXJELEdBQUFzaUIsWUFBQTRwQyxHQUVBRCxHQUFBMWdELGlCQUFBc0QsRUFBQWc5QyxFQUFBN3JELElBQ0Fpc0QsR0FBQXZpRCxRQUFBMGlELEVBQUEsR0FBQXBzRCxFQUVBLENBRUEsT0FBQXFzRCxJQUVBQSxFQUFBcjNDLGFBQUEsRUFJQSxDQU9BLEtBQUF0TyxHQUVBLE9BQUEsSUFBQXlsRCxHQUFBbHRELEtBQUEyc0QsTUFBQTNzRCxLQUFBNHNELGFBRUEsQ0FPQSxrQkFBQVksR0FTQSxJQUFBM25DLEVBQUF2a0IsS0FBQThILEtBQUEsRUFBQXBKLEtBQUEyc0QsTUFBQTFyRCxRQUNBNGtCLEVBQUEsRUFBQXZrQixLQUFBaUUsS0FBQXNnQixFQUFBLEdBQ0FBLEVBQUF2a0IsS0FBQWEsSUFBQTBqQixFQUFBLEdBRUEsTUFBQXNuQyxFQUFBLElBQUF0cUQsYUFBQWdqQixFQUFBQSxFQUFBLEdBQ0FzbkMsRUFBQXhtRCxJQUFBM0csS0FBQW10RCxjQUVBLE1BQUFDLEVBQUEsSUFBQUwsR0FBQUksRUFBQXRuQyxFQUFBQSxFQUFBOXNCLEdBQUFSLElBTUEsT0FMQTYwRCxFQUFBcjNDLGFBQUEsRUFFQS9WLEtBQUFtdEQsYUFBQUEsRUFDQW50RCxLQUFBb3RELFlBQUFBLEVBRUFwdEQsSUFFQSxDQVNBLGFBQUF5dEQsQ0FBQXI5QyxHQUVBLElBQUEsSUFBQXJQLEVBQUEsRUFBQXFiLEVBQUFwYyxLQUFBMnNELE1BQUExckQsT0FBQUYsRUFBQXFiLEVBQUFyYixJQUFBLENBRUEsTUFBQXdzRCxFQUFBdnRELEtBQUEyc0QsTUFBQTVyRCxHQUVBLEdBQUF3c0QsRUFBQW45QyxPQUFBQSxFQUVBLE9BQUFtOUMsQ0FJQSxDQUlBLENBTUEsT0FBQXQwQyxHQUVBLE9BQUFqWixLQUFBb3RELGNBRUFwdEQsS0FBQW90RCxZQUFBbjBDLFVBRUFqWixLQUFBb3RELFlBQUEsS0FJQSxDQVNBLFFBQUFwTyxDQUFBME8sRUFBQWYsR0FFQTNzRCxLQUFBNFYsS0FBQTgzQyxFQUFBOTNDLEtBRUEsSUFBQSxJQUFBN1UsRUFBQSxFQUFBQyxFQUFBMHNELEVBQUFmLE1BQUExckQsT0FBQUYsRUFBQUMsRUFBQUQsSUFBQSxDQUVBLE1BQUE2VSxFQUFBODNDLEVBQUFmLE1BQUE1ckQsR0FDQSxJQUFBd3NELEVBQUFaLEVBQUEvMkMsUUFFQTdWLElBQUF3dEQsSUFFQTNtRCxRQUFBQyxLQUFBLDJDQUFBK08sR0FDQTIzQyxFQUFBLElBQUFWLElBSUE3c0QsS0FBQTJzRCxNQUFBdnNELEtBQUFtdEQsR0FDQXZ0RCxLQUFBNHNELGFBQUF4c0QsTUFBQSxJQUFBdXRCLElBQUFwakIsVUFBQW1qRCxFQUFBZCxhQUFBN3JELElBRUEsQ0FJQSxPQUZBZixLQUFBcXRELE9BRUFydEQsSUFFQSxDQVFBLE1BQUFnVyxHQUVBLE1BQUFULEVBQUEsQ0FDQXNELFNBQUEsQ0FDQS9DLFFBQUEsSUFDQWpXLEtBQUEsV0FDQWlaLFVBQUEsbUJBRUE2ekMsTUFBQSxHQUNBQyxhQUFBLElBR0FyM0MsRUFBQUssS0FBQTVWLEtBQUE0VixLQUVBLE1BQUErMkMsRUFBQTNzRCxLQUFBMnNELE1BQ0FDLEVBQUE1c0QsS0FBQTRzRCxhQUVBLElBQUEsSUFBQTdyRCxFQUFBLEVBQUFDLEVBQUEyckQsRUFBQTFyRCxPQUFBRixFQUFBQyxFQUFBRCxJQUFBLENBRUEsTUFBQXdzRCxFQUFBWixFQUFBNXJELEdBQ0F3VSxFQUFBbzNDLE1BQUF2c0QsS0FBQW10RCxFQUFBMzNDLE1BRUEsTUFBQSszQyxFQUFBZixFQUFBN3JELEdBQ0F3VSxFQUFBcTNDLGFBQUF4c0QsS0FBQXV0RCxFQUFBbGpELFVBRUEsQ0FFQSxPQUFBOEssQ0FFQSxFQ2xYQSxNQUFBcTRDLFdBQUE5WSxHQVVBLFdBQUFseUMsQ0FBQS9CLEVBQUFrMEMsRUFBQUMsRUFBQTZZLEVBQUEsR0FFQXQyQyxNQUFBMVcsRUFBQWswQyxFQUFBQyxHQVNBaDFDLEtBQUE4dEQsNEJBQUEsRUFXQTl0RCxLQUFBNnRELGlCQUFBQSxDQUVBLENBRUEsSUFBQW5tRCxDQUFBK1AsR0FNQSxPQUpBRixNQUFBN1AsS0FBQStQLEdBRUF6WCxLQUFBNnRELGlCQUFBcDJDLEVBQUFvMkMsaUJBRUE3dEQsSUFFQSxDQUVBLE1BQUFnVyxHQUVBLE1BQUFULEVBQUFnQyxNQUFBdkIsU0FNQSxPQUpBVCxFQUFBczRDLGlCQUFBN3RELEtBQUE2dEQsaUJBRUF0NEMsRUFBQXU0Qyw0QkFBQSxFQUVBdjRDLENBRUEsRUN2REEsTUFBQXc0QyxHQUFBLElBQUFwZ0MsR0FDQXFnQyxHQUFBLElBQUFyZ0MsR0FFQXNnQyxHQUFBLEdBRUFDLEdBQUEsSUFBQWhwQyxHQUNBaXBDLEdBQUEsSUFBQXhnQyxHQUNBeWdDLEdBQUEsSUFBQWpTLEdBQ0FrUyxHQUFBLElBQUF6a0MsR0FXQSxNQUFBMGtDLFdBQUFuUyxHQVNBLFdBQUF2NUMsQ0FBQWdrQixFQUFBbVcsRUFBQWhoQixHQUVBeEUsTUFBQXFQLEVBQUFtVyxHQVNBLzhCLEtBQUErbUIsaUJBQUEsRUFTQS9tQixLQUFBNjVCLGVBQUEsSUFBQSt6QixHQUFBLElBQUEvcUQsYUFBQSxHQUFBa1osR0FBQSxJQVVBL2IsS0FBQTg1QixjQUFBLEtBVUE5NUIsS0FBQXV1RCxhQUFBLEtBT0F2dUQsS0FBQStiLE1BQUFBLEVBUUEvYixLQUFBa25CLFlBQUEsS0FRQWxuQixLQUFBazhCLGVBQUEsS0FFQSxJQUFBLElBQUFuN0IsRUFBQSxFQUFBQSxFQUFBZ2IsRUFBQWhiLElBRUFmLEtBQUF3dUQsWUFBQXp0RCxFQUFBb3RELEdBSUEsQ0FPQSxrQkFBQWhuQyxHQUVBLE1BQUFQLEVBQUE1bUIsS0FBQTRtQixTQUNBN0ssRUFBQS9iLEtBQUErYixNQUVBLE9BQUEvYixLQUFBa25CLGNBRUFsbkIsS0FBQWtuQixZQUFBLElBQUFoQyxJQUlBLE9BQUEwQixFQUFBTSxhQUVBTixFQUFBTyxxQkFJQW5uQixLQUFBa25CLFlBQUE1QixZQUVBLElBQUEsSUFBQXZrQixFQUFBLEVBQUFBLEVBQUFnYixFQUFBaGIsSUFFQWYsS0FBQXl1RCxZQUFBMXRELEVBQUFndEQsSUFFQUcsR0FBQXhtRCxLQUFBa2YsRUFBQU0sYUFBQXZOLGFBQUFvMEMsSUFFQS90RCxLQUFBa25CLFlBQUFHLE1BQUE2bUMsR0FJQSxDQU9BLHFCQUFBelYsR0FFQSxNQUFBN3hCLEVBQUE1bUIsS0FBQTRtQixTQUNBN0ssRUFBQS9iLEtBQUErYixNQUVBLE9BQUEvYixLQUFBazhCLGlCQUVBbDhCLEtBQUFrOEIsZUFBQSxJQUFBdFMsSUFJQSxPQUFBaEQsRUFBQXNWLGdCQUVBdFYsRUFBQTZ4Qix3QkFJQXo0QyxLQUFBazhCLGVBQUE1VyxZQUVBLElBQUEsSUFBQXZrQixFQUFBLEVBQUFBLEVBQUFnYixFQUFBaGIsSUFFQWYsS0FBQXl1RCxZQUFBMXRELEVBQUFndEQsSUFFQU0sR0FBQTNtRCxLQUFBa2YsRUFBQXNWLGdCQUFBdmlCLGFBQUFvMEMsSUFFQS90RCxLQUFBazhCLGVBQUE3VSxNQUFBZ25DLEdBSUEsQ0FFQSxJQUFBM21ELENBQUErUCxFQUFBNmxCLEdBY0EsT0FaQS9sQixNQUFBN1AsS0FBQStQLEVBQUE2bEIsR0FFQXQ5QixLQUFBNjVCLGVBQUFueUIsS0FBQStQLEVBQUFvaUIsZ0JBRUEsT0FBQXBpQixFQUFBODJDLGVBQUF2dUQsS0FBQXV1RCxhQUFBOTJDLEVBQUE4MkMsYUFBQTltRCxTQUNBLE9BQUFnUSxFQUFBcWlCLGdCQUFBOTVCLEtBQUE4NUIsY0FBQXJpQixFQUFBcWlCLGNBQUFyeUIsU0FFQXpILEtBQUErYixNQUFBdEUsRUFBQXNFLE1BRUEsT0FBQXRFLEVBQUF5UCxjQUFBbG5CLEtBQUFrbkIsWUFBQXpQLEVBQUF5UCxZQUFBemYsU0FDQSxPQUFBZ1EsRUFBQXlrQixpQkFBQWw4QixLQUFBazhCLGVBQUF6a0IsRUFBQXlrQixlQUFBejBCLFNBRUF6SCxJQUVBLENBUUEsVUFBQTB1RCxDQUFBbHVELEVBQUE2UixHQUVBQSxFQUFBOUgsVUFBQXZLLEtBQUE4NUIsY0FBQWo1QixNQUFBLEVBQUFMLEVBRUEsQ0FRQSxXQUFBaXVELENBQUFqdUQsRUFBQW9QLEdBRUFBLEVBQUFyRixVQUFBdkssS0FBQTY1QixlQUFBaDVCLE1BQUEsR0FBQUwsRUFFQSxDQVFBLFVBQUFtdUQsQ0FBQW51RCxFQUFBd2xCLEdBRUEsTUFBQTRvQyxFQUFBNW9DLEVBQUFxMkIsc0JBRUF4N0MsRUFBQWIsS0FBQXV1RCxhQUFBOTJDLE9BQUFsQyxLQUFBQSxLQUlBczVDLEVBQUFydUQsR0FGQW91RCxFQUFBM3RELE9BQUEsR0FFQSxFQUVBLElBQUEsSUFBQUYsRUFBQSxFQUFBQSxFQUFBNnRELEVBQUEzdEQsT0FBQUYsSUFFQTZ0RCxFQUFBN3RELEdBQUFGLEVBQUFndUQsRUFBQTl0RCxFQUlBLENBRUEsT0FBQTgzQixDQUFBK2pCLEVBQUFDLEdBRUEsTUFBQXg1QixFQUFBcmpCLEtBQUFxakIsWUFDQXlyQyxFQUFBOXVELEtBQUErYixNQUtBLEdBSEFxeUMsR0FBQXhuQyxTQUFBNW1CLEtBQUE0bUIsU0FDQXduQyxHQUFBcnhCLFNBQUEvOEIsS0FBQSs4QixjQUVBaDlCLElBQUFxdUQsR0FBQXJ4QixXQUlBLE9BQUEvOEIsS0FBQWs4QixnQkFBQWw4QixLQUFBeTRDLHdCQUVBNFYsR0FBQTNtRCxLQUFBMUgsS0FBQWs4QixnQkFDQW15QixHQUFBMTBDLGFBQUEwSixJQUVBLElBQUF1NUIsRUFBQTd4QixJQUFBcEQsaUJBQUEwbUMsS0FJQSxJQUFBLElBQUFVLEVBQUEsRUFBQUEsRUFBQUQsRUFBQUMsSUFBQSxDQUlBL3VELEtBQUF5dUQsWUFBQU0sRUFBQWhCLElBRUFDLEdBQUExaEQsaUJBQUErVyxFQUFBMHFDLElBSUFLLEdBQUEvcUMsWUFBQTJxQyxHQUVBSSxHQUFBdjFCLFFBQUErakIsRUFBQXFSLElBSUEsSUFBQSxJQUFBbHRELEVBQUEsRUFBQUMsRUFBQWl0RCxHQUFBaHRELE9BQUFGLEVBQUFDLEVBQUFELElBQUEsQ0FFQSxNQUFBaW9CLEVBQUFpbEMsR0FBQWx0RCxHQUNBaW9CLEVBQUErbEMsV0FBQUEsRUFDQS9sQyxFQUFBaEQsT0FBQWhtQixLQUNBNjhDLEVBQUF6OEMsS0FBQTRvQixFQUVBLENBRUFpbEMsR0FBQWh0RCxPQUFBLENBRUEsQ0FFQSxDQVNBLFVBQUErdEQsQ0FBQXh1RCxFQUFBNlIsR0FFQSxPQUFBclMsS0FBQTg1QixnQkFFQTk1QixLQUFBODVCLGNBQUEsSUFBQTh6QixHQUFBLElBQUEvcUQsYUFBQSxFQUFBN0MsS0FBQTY1QixlQUFBOWQsT0FBQWt6QyxLQUFBLEdBQUEsSUFJQTU4QyxFQUFBNUgsUUFBQXpLLEtBQUE4NUIsY0FBQWo1QixNQUFBLEVBQUFMLEVBRUEsQ0FTQSxXQUFBZ3VELENBQUFodUQsRUFBQW9QLEdBRUFBLEVBQUFuRixRQUFBekssS0FBQTY1QixlQUFBaDVCLE1BQUEsR0FBQUwsRUFFQSxDQVVBLFVBQUEwdUQsQ0FBQTF1RCxFQUFBd2xCLEdBRUEsTUFBQTRvQyxFQUFBNW9DLEVBQUFxMkIsc0JBRUF0OUIsRUFBQTZ2QyxFQUFBM3RELE9BQUEsRUFFQSxPQUFBakIsS0FBQXV1RCxlQUVBdnVELEtBQUF1dUQsYUFBQSxJQUFBeEIsR0FBQSxJQUFBbHFELGFBQUFrYyxFQUFBL2UsS0FBQStiLE9BQUFnRCxFQUFBL2UsS0FBQStiLE1BQUEzaUIsR0FBQWIsS0FJQSxNQUFBc0ksRUFBQWIsS0FBQXV1RCxhQUFBOTJDLE9BQUFsQyxLQUFBQSxLQUVBLElBQUE0NUMsRUFBQSxFQUVBLElBQUEsSUFBQXB1RCxFQUFBLEVBQUFBLEVBQUE2dEQsRUFBQTN0RCxPQUFBRixJQUVBb3VELEdBQUFQLEVBQUE3dEQsR0FJQSxNQUFBcXVELEVBQUFwdkQsS0FBQTRtQixTQUFBOHdCLHFCQUFBLEVBQUEsRUFBQXlYLEVBRUFOLEVBQUE5dkMsRUFBQXZlLEVBRUFLLEVBQUFndUQsR0FBQU8sRUFFQXZ1RCxFQUFBOEYsSUFBQWlvRCxFQUFBQyxFQUFBLEVBRUEsQ0FFQSxrQkFBQXZTLEdBRUEsQ0FNQSxPQUFBcmpDLEdBRUFqWixLQUFBVSxjQUFBLENBQUFiLEtBQUEsWUFFQSxPQUFBRyxLQUFBdXVELGVBRUF2dUQsS0FBQXV1RCxhQUFBdDFDLFVBQ0FqWixLQUFBdXVELGFBQUEsS0FJQSxFQ25ZQSxNQUFBYyxHQUFBLElBQUFydEMsR0FDQXN0QyxHQUFBLElBQUF0dEMsR0FDQXV0QyxHQUFBLElBQUFya0QsR0FPQSxNQUFBc2tELEdBUUEsV0FBQTVzRCxDQUFBdWhCLEVBQUEsSUFBQW5DLEdBQUEsRUFBQSxFQUFBLEdBQUFnRyxFQUFBLEdBU0Fob0IsS0FBQXl2RCxTQUFBLEVBT0F6dkQsS0FBQW1rQixPQUFBQSxFQVFBbmtCLEtBQUFnb0IsU0FBQUEsQ0FFQSxDQVNBLEdBQUFyaEIsQ0FBQXdkLEVBQUE2RCxHQUtBLE9BSEFob0IsS0FBQW1rQixPQUFBemMsS0FBQXljLEdBQ0Fua0IsS0FBQWdvQixTQUFBQSxFQUVBaG9CLElBRUEsQ0FZQSxhQUFBMHZELENBQUFsdEQsRUFBQUMsRUFBQTZXLEVBQUFDLEdBS0EsT0FIQXZaLEtBQUFta0IsT0FBQXhkLElBQUFuRSxFQUFBQyxFQUFBNlcsR0FDQXRaLEtBQUFnb0IsU0FBQXpPLEVBRUF2WixJQUVBLENBVUEsNkJBQUEydkQsQ0FBQXhyQyxFQUFBb0MsR0FLQSxPQUhBdm1CLEtBQUFta0IsT0FBQXpjLEtBQUF5YyxHQUNBbmtCLEtBQUFnb0IsVUFBQXpCLEVBQUF0ZCxJQUFBakosS0FBQW1rQixRQUVBbmtCLElBRUEsQ0FZQSxxQkFBQSsvQixDQUFBbDZCLEVBQUFDLEVBQUFDLEdBRUEsTUFBQW9lLEVBQUFrckMsR0FBQW5uRCxXQUFBbkMsRUFBQUQsR0FBQW9ELE1BQUFvbUQsR0FBQXBuRCxXQUFBckMsRUFBQUMsSUFBQXpDLFlBTUEsT0FGQXJELEtBQUEydkQsOEJBQUF4ckMsRUFBQXRlLEdBRUE3RixJQUVBLENBUUEsSUFBQTBILENBQUFxZ0IsR0FLQSxPQUhBL25CLEtBQUFta0IsT0FBQXpjLEtBQUFxZ0IsRUFBQTVELFFBQ0Fua0IsS0FBQWdvQixTQUFBRCxFQUFBQyxTQUVBaG9CLElBRUEsQ0FPQSxTQUFBcUQsR0FJQSxNQUFBdXNELEVBQUEsRUFBQTV2RCxLQUFBbWtCLE9BQUFsakIsU0FJQSxPQUhBakIsS0FBQW1rQixPQUFBL2IsZUFBQXduRCxHQUNBNXZELEtBQUFnb0IsVUFBQTRuQyxFQUVBNXZELElBRUEsQ0FPQSxNQUFBZ0osR0FLQSxPQUhBaEosS0FBQWdvQixXQUFBLEVBQ0Fob0IsS0FBQW1rQixPQUFBbmIsU0FFQWhKLElBRUEsQ0FRQSxlQUFBOG9CLENBQUF2QyxHQUVBLE9BQUF2bUIsS0FBQW1rQixPQUFBbGIsSUFBQXNkLEdBQUF2bUIsS0FBQWdvQixRQUVBLENBUUEsZ0JBQUE2bkMsQ0FBQWpvQyxHQUVBLE9BQUE1bkIsS0FBQThvQixnQkFBQWxCLEVBQUE3YyxRQUFBNmMsRUFBQXJELE1BRUEsQ0FTQSxZQUFBdXJDLENBQUF2cEMsRUFBQTNsQixHQUVBLE9BQUFBLEVBQUE4RyxLQUFBNmUsR0FBQXhlLGdCQUFBL0gsS0FBQW1rQixRQUFBbmtCLEtBQUE4b0IsZ0JBQUF2QyxHQUVBLENBV0EsYUFBQXdwQyxDQUFBQyxFQUFBcHZELEdBRUEsTUFBQWtxQixFQUFBa2xDLEVBQUE1bEMsTUFBQWlsQyxJQUVBNWxELEVBQUF6SixLQUFBbWtCLE9BQUFsYixJQUFBNmhCLEdBRUEsR0FBQSxJQUFBcmhCLEVBR0EsT0FBQSxJQUFBekosS0FBQThvQixnQkFBQWtuQyxFQUFBdmEsT0FFQTcwQyxFQUFBOEcsS0FBQXNvRCxFQUFBdmEsT0FLQSxLQUlBLE1BQUEveUMsSUFBQXN0RCxFQUFBdmEsTUFBQXhzQyxJQUFBakosS0FBQW1rQixRQUFBbmtCLEtBQUFnb0IsVUFBQXZlLEVBRUEsT0FBQS9HLEVBQUEsR0FBQUEsRUFBQSxFQUVBLEtBSUE5QixFQUFBOEcsS0FBQXNvRCxFQUFBdmEsT0FBQTF0QyxnQkFBQStpQixFQUFBcG9CLEVBRUEsQ0FRQSxjQUFBdXRELENBQUFELEdBSUEsTUFBQUUsRUFBQWx3RCxLQUFBOG9CLGdCQUFBa25DLEVBQUF2YSxPQUNBMGEsRUFBQW53RCxLQUFBOG9CLGdCQUFBa25DLEVBQUFJLEtBRUEsT0FBQUYsRUFBQSxHQUFBQyxFQUFBLEdBQUFBLEVBQUEsR0FBQUQsRUFBQSxDQUVBLENBUUEsYUFBQXhvQyxDQUFBdkIsR0FFQSxPQUFBQSxFQUFBMkIsZ0JBQUE5bkIsS0FFQSxDQVFBLGdCQUFBMm5CLENBQUFDLEdBRUEsT0FBQUEsRUFBQUUsZ0JBQUE5bkIsS0FFQSxDQVNBLGFBQUFxd0QsQ0FBQXp2RCxHQUVBLE9BQUFBLEVBQUE4RyxLQUFBMUgsS0FBQW1rQixRQUFBL2IsZ0JBQUFwSSxLQUFBZ29CLFNBRUEsQ0FjQSxZQUFBck8sQ0FBQS9KLEVBQUEwZ0QsR0FFQSxNQUFBMzZCLEVBQUEyNkIsR0FBQWYsR0FBQTlnRCxnQkFBQW1CLEdBRUEyZ0QsRUFBQXZ3RCxLQUFBcXdELGNBQUFoQixJQUFBMTFDLGFBQUEvSixHQUVBdVUsRUFBQW5rQixLQUFBbWtCLE9BQUE1YixhQUFBb3RCLEdBQUF0eUIsWUFJQSxPQUZBckQsS0FBQWdvQixVQUFBdW9DLEVBQUF0bkQsSUFBQWtiLEdBRUFua0IsSUFFQSxDQVNBLFNBQUEwUCxDQUFBbEYsR0FJQSxPQUZBeEssS0FBQWdvQixVQUFBeGQsRUFBQXZCLElBQUFqSixLQUFBbWtCLFFBRUFua0IsSUFFQSxDQVFBLE1BQUFzSyxDQUFBeWQsR0FFQSxPQUFBQSxFQUFBNUQsT0FBQTdaLE9BQUF0SyxLQUFBbWtCLFNBQUE0RCxFQUFBQyxXQUFBaG9CLEtBQUFnb0IsUUFFQSxDQU9BLEtBQUF2Z0IsR0FFQSxPQUFBLElBQUF6SCxLQUFBNEMsYUFBQThFLEtBQUExSCxLQUVBLEVDcldBLE1BQUF3d0QsR0FBQSxJQUFBNW1DLEdBQ0E2bUMsR0FBQSxJQUFBenVDLEdBU0EsTUFBQTB1QyxHQVlBLFdBQUE5dEQsQ0FBQTBtQixFQUFBLElBQUFrbUMsR0FBQWptQyxFQUFBLElBQUFpbUMsR0FBQWhtQyxFQUFBLElBQUFnbUMsR0FBQXh3QixFQUFBLElBQUF3d0IsR0FBQW1CLEVBQUEsSUFBQW5CLEdBQUFvQixFQUFBLElBQUFwQixJQU9BeHZELEtBQUE2d0QsT0FBQSxDQUFBdm5DLEVBQUFDLEVBQUFDLEVBQUF3VixFQUFBMnhCLEVBQUFDLEVBRUEsQ0FhQSxHQUFBanFELENBQUEyaUIsRUFBQUMsRUFBQUMsRUFBQXdWLEVBQUEyeEIsRUFBQUMsR0FFQSxNQUFBQyxFQUFBN3dELEtBQUE2d0QsT0FTQSxPQVBBQSxFQUFBLEdBQUFucEQsS0FBQTRoQixHQUNBdW5DLEVBQUEsR0FBQW5wRCxLQUFBNmhCLEdBQ0FzbkMsRUFBQSxHQUFBbnBELEtBQUE4aEIsR0FDQXFuQyxFQUFBLEdBQUFucEQsS0FBQXMzQixHQUNBNnhCLEVBQUEsR0FBQW5wRCxLQUFBaXBELEdBQ0FFLEVBQUEsR0FBQW5wRCxLQUFBa3BELEdBRUE1d0QsSUFFQSxDQVFBLElBQUEwSCxDQUFBb3BELEdBRUEsTUFBQUQsRUFBQTd3RCxLQUFBNndELE9BRUEsSUFBQSxJQUFBOXZELEVBQUEsRUFBQUEsRUFBQSxFQUFBQSxJQUVBOHZELEVBQUE5dkQsR0FBQTJHLEtBQUFvcEQsRUFBQUQsT0FBQTl2RCxJQUlBLE9BQUFmLElBRUEsQ0FTQSx1QkFBQSt3RCxDQUFBenVELEVBQUFxd0IsRUFBQXJ6QixLQUVBLE1BQUF1eEQsRUFBQTd3RCxLQUFBNndELE9BQ0E5a0QsRUFBQXpKLEVBQUFtRyxTQUNBdW9ELEVBQUFqbEQsRUFBQSxHQUFBa2xELEVBQUFsbEQsRUFBQSxHQUFBbWxELEVBQUFubEQsRUFBQSxHQUFBb2xELEVBQUFwbEQsRUFBQSxHQUNBcWxELEVBQUFybEQsRUFBQSxHQUFBc2xELEVBQUF0bEQsRUFBQSxHQUFBdWxELEVBQUF2bEQsRUFBQSxHQUFBd2xELEVBQUF4bEQsRUFBQSxHQUNBeWxELEVBQUF6bEQsRUFBQSxHQUFBMGxELEVBQUExbEQsRUFBQSxHQUFBMmxELEVBQUEzbEQsRUFBQSxJQUFBNGxELEVBQUE1bEQsRUFBQSxJQUNBNmxELEVBQUE3bEQsRUFBQSxJQUFBOGxELEVBQUE5bEQsRUFBQSxJQUFBK2xELEVBQUEvbEQsRUFBQSxJQUFBZ21ELEVBQUFobUQsRUFBQSxJQVFBLEdBTkE4a0QsRUFBQSxHQUFBbkIsY0FBQXlCLEVBQUFILEVBQUFPLEVBQUFILEVBQUFPLEVBQUFILEVBQUFPLEVBQUFILEdBQUF2dUQsWUFDQXd0RCxFQUFBLEdBQUFuQixjQUFBeUIsRUFBQUgsRUFBQU8sRUFBQUgsRUFBQU8sRUFBQUgsRUFBQU8sRUFBQUgsR0FBQXZ1RCxZQUNBd3RELEVBQUEsR0FBQW5CLGNBQUF5QixFQUFBRixFQUFBTSxFQUFBRixFQUFBTSxFQUFBRixFQUFBTSxFQUFBRixHQUFBeHVELFlBQ0F3dEQsRUFBQSxHQUFBbkIsY0FBQXlCLEVBQUFGLEVBQUFNLEVBQUFGLEVBQUFNLEVBQUFGLEVBQUFNLEVBQUFGLEdBQUF4dUQsWUFDQXd0RCxFQUFBLEdBQUFuQixjQUFBeUIsRUFBQUQsRUFBQUssRUFBQUQsRUFBQUssRUFBQUQsRUFBQUssRUFBQUQsR0FBQXp1RCxZQUVBc3ZCLElBQUFyekIsR0FFQXV4RCxFQUFBLEdBQUFuQixjQUFBeUIsRUFBQUQsRUFBQUssRUFBQUQsRUFBQUssRUFBQUQsRUFBQUssRUFBQUQsR0FBQXp1RCxnQkFFQSxJQUFBc3ZCLElBQUFwekIsR0FNQSxNQUFBLElBQUE2RCxNQUFBLHVFQUFBdXZCLEdBSkFrK0IsRUFBQSxHQUFBbkIsY0FBQXdCLEVBQUFJLEVBQUFJLEVBQUFJLEdBQUF6dUQsV0FNQSxDQUVBLE9BQUFyRCxJQUVBLENBVUEsZ0JBQUFneUQsQ0FBQWhzQyxHQUVBLFFBQUFqbUIsSUFBQWltQixFQUFBa1csZUFFQSxPQUFBbFcsRUFBQWtXLGdCQUFBbFcsRUFBQXl5Qix3QkFFQStYLEdBQUE5b0QsS0FBQXNlLEVBQUFrVyxnQkFBQXZpQixhQUFBcU0sRUFBQTNDLGlCQUVBLENBRUEsTUFBQXVELEVBQUFaLEVBQUFZLFNBRUEsT0FBQUEsRUFBQXNWLGdCQUFBdFYsRUFBQTZ4Qix3QkFFQStYLEdBQUE5b0QsS0FBQWtmLEVBQUFzVixnQkFBQXZpQixhQUFBcU0sRUFBQTNDLFlBRUEsQ0FFQSxPQUFBcmpCLEtBQUEybkIsaUJBQUE2b0MsR0FFQSxDQVFBLGdCQUFBeUIsQ0FBQUMsR0FNQSxPQUpBMUIsR0FBQXpsRCxPQUFBcEUsSUFBQSxFQUFBLEVBQUEsR0FDQTZwRCxHQUFBanNDLE9BQUEsa0JBQ0Fpc0MsR0FBQTcyQyxhQUFBdTRDLEVBQUE3dUMsYUFFQXJqQixLQUFBMm5CLGlCQUFBNm9DLEdBRUEsQ0FRQSxnQkFBQTdvQyxDQUFBQyxHQUVBLE1BQUFpcEMsRUFBQTd3RCxLQUFBNndELE9BQ0E5bEQsRUFBQTZjLEVBQUE3YyxPQUNBb25ELEdBQUF2cUMsRUFBQXJELE9BRUEsSUFBQSxJQUFBeGpCLEVBQUEsRUFBQUEsRUFBQSxFQUFBQSxJQUFBLENBSUEsR0FGQTh2RCxFQUFBOXZELEdBQUErbkIsZ0JBQUEvZCxHQUVBb25ELEVBRUEsT0FBQSxDQUlBLENBRUEsT0FBQSxDQUVBLENBUUEsYUFBQXpxQyxDQUFBdkIsR0FFQSxNQUFBMHFDLEVBQUE3d0QsS0FBQTZ3RCxPQUVBLElBQUEsSUFBQTl2RCxFQUFBLEVBQUFBLEVBQUEsRUFBQUEsSUFBQSxDQUVBLE1BQUFnbkIsRUFBQThvQyxFQUFBOXZELEdBUUEsR0FKQTB2RCxHQUFBanVELEVBQUF1bEIsRUFBQTVELE9BQUEzaEIsRUFBQSxFQUFBMmpCLEVBQUFoa0IsSUFBQUssRUFBQTJqQixFQUFBamtCLElBQUFNLEVBQ0FpdUQsR0FBQWh1RCxFQUFBc2xCLEVBQUE1RCxPQUFBMWhCLEVBQUEsRUFBQTBqQixFQUFBaGtCLElBQUFNLEVBQUEwakIsRUFBQWprQixJQUFBTyxFQUNBZ3VELEdBQUFuM0MsRUFBQXlPLEVBQUE1RCxPQUFBN0ssRUFBQSxFQUFBNk0sRUFBQWhrQixJQUFBbVgsRUFBQTZNLEVBQUFqa0IsSUFBQW9YLEVBRUF5TyxFQUFBZSxnQkFBQTJuQyxJQUFBLEVBRUEsT0FBQSxDQUlBLENBRUEsT0FBQSxDQUVBLENBUUEsYUFBQWxwQyxDQUFBaEIsR0FFQSxNQUFBc3FDLEVBQUE3d0QsS0FBQTZ3RCxPQUVBLElBQUEsSUFBQTl2RCxFQUFBLEVBQUFBLEVBQUEsRUFBQUEsSUFFQSxHQUFBOHZELEVBQUE5dkQsR0FBQStuQixnQkFBQXZDLEdBQUEsRUFFQSxPQUFBLEVBTUEsT0FBQSxDQUVBLENBT0EsS0FBQTllLEdBRUEsT0FBQSxJQUFBekgsS0FBQTRDLGFBQUE4RSxLQUFBMUgsS0FFQSxFQzFQQSxTQUFBb3lELEdBQUF2c0QsRUFBQUMsR0FFQSxPQUFBRCxFQUFBQyxDQUVBLENBRUEsU0FBQXVzRCxHQUFBeHNELEVBQUFDLEdBRUEsT0FBQUQsRUFBQXlULEVBQUF4VCxFQUFBd1QsQ0FFQSxDQUVBLFNBQUFnNUMsR0FBQXpzRCxFQUFBQyxHQUVBLE9BQUFBLEVBQUF3VCxFQUFBelQsRUFBQXlULENBRUEsQ0FFQSxNQUFBaTVDLEdBRUEsV0FBQTN2RCxHQUVBNUMsS0FBQVEsTUFBQSxFQUNBUixLQUFBd3lELEtBQUEsR0FDQXh5RCxLQUFBeXlELEtBQUEsRUFFQSxDQUVBLElBQUFyeUQsQ0FBQXExQyxFQUFBMTVCLEVBQUF6QyxFQUFBOVksR0FFQSxNQUFBZ3lELEVBQUF4eUQsS0FBQXd5RCxLQUNBQyxFQUFBenlELEtBQUF5eUQsS0FDQXp5RCxLQUFBUSxPQUFBZ3lELEVBQUF2eEQsUUFFQXV4RCxFQUFBcHlELEtBQUEsQ0FFQXExQyxPQUFBLEVBQ0ExNUIsT0FBQSxFQUNBekMsR0FBQSxFQUNBOVksT0FBQSxJQU1BLE1BQUFreUQsRUFBQUYsRUFBQXh5RCxLQUFBUSxPQUNBaXlELEVBQUFyeUQsS0FBQXN5RCxHQUNBMXlELEtBQUFRLFFBRUFreUQsRUFBQWpkLE1BQUFBLEVBQ0FpZCxFQUFBMzJDLE1BQUFBLEVBQ0EyMkMsRUFBQXA1QyxFQUFBQSxFQUNBbzVDLEVBQUFseUQsTUFBQUEsQ0FFQSxDQUVBLEtBQUFteUQsR0FFQTN5RCxLQUFBeXlELEtBQUF4eEQsT0FBQSxFQUNBakIsS0FBQVEsTUFBQSxDQUVBLEVBSUEsTUFBQW95RCxHQUFBLElBQUFqbEMsR0FDQWtsQyxHQUFBLElBQUEvb0IsR0FBQSxFQUFBLEVBQUEsR0FDQWdwQixHQUFBLElBQUFwQyxHQUNBcUMsR0FBQSxJQUFBN3RDLEdBQ0E4dEMsR0FBQSxJQUFBcHBDLEdBQ0FxcEMsR0FBQSxJQUFBanhDLEdBQ0FreEMsR0FBQSxJQUFBbHhDLEdBQ0FteEMsR0FBQSxJQUFBbnhDLEdBQ0FveEMsR0FBQSxJQUFBYixHQUNBYyxHQUFBLElBQUFsWCxHQUNBbVgsR0FBQSxHQUdBLFNBQUFDLEdBQUE3K0MsRUFBQTlULEVBQUE0eUQsRUFBQSxHQUVBLE1BQUF6ZSxFQUFBbjBDLEVBQUFtMEMsU0FDQSxHQUFBcmdDLEVBQUF1bUMsOEJBQUF2bUMsRUFBQTdULE1BQUErQixjQUFBaEMsRUFBQUMsTUFBQStCLFlBQUEsQ0FJQSxNQUFBNndELEVBQUEvK0MsRUFBQXFILE1BQ0EsSUFBQSxJQUFBaGIsRUFBQSxFQUFBQSxFQUFBMHlELEVBQUExeUQsSUFFQSxJQUFBLElBQUFnRixFQUFBLEVBQUFBLEVBQUFndkMsRUFBQWh2QyxJQUVBbkYsRUFBQTJHLGFBQUF4RyxFQUFBeXlELEVBQUF6dEQsRUFBQTJPLEVBQUFsTixhQUFBekcsRUFBQWdGLEdBTUEsTUFHQW5GLEVBQUFDLE1BQUE4RixJQUFBK04sRUFBQTdULE1BQUEyeUQsRUFBQXplLEdBSUFuMEMsRUFBQW1WLGFBQUEsQ0FFQSxDQUdBLFNBQUEyOUMsR0FBQWgvQyxFQUFBOVQsR0FFQSxHQUFBOFQsRUFBQTlSLGNBQUFoQyxFQUFBZ0MsWUFBQSxDQUdBLE1BQUFtYyxFQUFBemQsS0FBQVksSUFBQXdTLEVBQUF6VCxPQUFBTCxFQUFBSyxRQUNBLElBQUEsSUFBQUYsRUFBQSxFQUFBQSxFQUFBZ2UsRUFBQWhlLElBRUFILEVBQUFHLEdBQUEyVCxFQUFBM1QsRUFJQSxLQUFBLENBR0EsTUFBQWdlLEVBQUF6ZCxLQUFBWSxJQUFBd1MsRUFBQXpULE9BQUFMLEVBQUFLLFFBQ0FMLEVBQUErRixJQUFBLElBQUErTixFQUFBOVIsWUFBQThSLEVBQUF4RSxPQUFBLEVBQUE2TyxHQUVBLENBRUEsQ0FzQ0EsTUFBQTQwQyxXQUFBeFgsR0FVQSxXQUFBdjVDLENBQUF3NEIsRUFBQUUsRUFBQUUsRUFBQSxFQUFBRixFQUFBeUIsR0FFQXhsQixNQUFBLElBQUE4L0IsR0FBQXRhLEdBU0EvOEIsS0FBQSs1QixlQUFBLEVBUUEvNUIsS0FBQWc2Qix3QkFBQSxFQVVBaDZCLEtBQUFpNkIsYUFBQSxFQVFBajZCLEtBQUFrbkIsWUFBQSxLQVFBbG5CLEtBQUFrOEIsZUFBQSxLQVVBbDhCLEtBQUE0ekQsV0FBQSxLQUdBNXpELEtBQUE2ekQsY0FBQSxHQUNBN3pELEtBQUE4ekQsY0FBQSxHQUdBOXpELEtBQUErekQsc0JBQUEsR0FDQS96RCxLQUFBZzBELHNCQUFBLEdBR0FoMEQsS0FBQWkwRCxnQkFBQSxFQUNBajBELEtBQUFrMEQsaUJBQUEsRUFDQWwwRCxLQUFBNjdCLGVBQUEsRUFHQTc3QixLQUFBbTBELG9CQUFBLEVBQ0FuMEQsS0FBQTI3QixzQkFBQSxFQUdBMzdCLEtBQUFxN0Isa0JBQUFELEVBQ0FwN0IsS0FBQXU3QixnQkFBQUQsRUFDQXQ3QixLQUFBeTdCLGVBQUFELEVBR0F4N0IsS0FBQW8wRCxpQkFBQSxJQUFBbnhELFdBQUFtNEIsR0FDQXA3QixLQUFBcTBELGlCQUFBLElBQUFweEQsV0FBQW00QixHQUNBcDdCLEtBQUFzMEQsZ0JBQUEsRUFDQXQwRCxLQUFBdTBELG9CQUFBLEtBR0F2MEQsS0FBQSs3QixpQkFBQSxLQUNBLzdCLEtBQUF3MEQsaUJBQUEsS0FDQXgwRCxLQUFBZzhCLGVBQUEsS0FFQWg4QixLQUFBeTBELHVCQUNBejBELEtBQUEwMEQsc0JBRUEsQ0FRQSxvQkFBQXQ1QixHQUVBLE9BQUFwN0IsS0FBQXE3QixpQkFFQSxDQVFBLGlCQUFBczVCLEdBRUEsT0FBQTMwRCxLQUFBNnpELGNBQUE1eUQsT0FBQWpCLEtBQUErekQsc0JBQUE5eUQsTUFFQSxDQVFBLHFCQUFBMnpELEdBRUEsT0FBQTUwRCxLQUFBdTdCLGdCQUFBdjdCLEtBQUFrMEQsZ0JBRUEsQ0FRQSxvQkFBQVcsR0FFQSxPQUFBNzBELEtBQUF5N0IsZUFBQXo3QixLQUFBaTBELGVBRUEsQ0FFQSxvQkFBQVEsR0FTQSxJQUFBNXVDLEVBQUF2a0IsS0FBQThILEtBQUEsRUFBQXBKLEtBQUFxN0IsbUJBQ0F4VixFQUFBLEVBQUF2a0IsS0FBQWlFLEtBQUFzZ0IsRUFBQSxHQUNBQSxFQUFBdmtCLEtBQUFhLElBQUEwakIsRUFBQSxHQUVBLE1BQUFpdkMsRUFBQSxJQUFBanlELGFBQUFnakIsRUFBQUEsRUFBQSxHQUNBaVcsRUFBQSxJQUFBaXhCLEdBQUErSCxFQUFBanZDLEVBQUFBLEVBQUE5c0IsR0FBQVIsSUFFQXlILEtBQUErN0IsaUJBQUFELENBRUEsQ0FFQSxvQkFBQTQ0QixHQUVBLElBQUE3dUMsRUFBQXZrQixLQUFBOEgsS0FBQXBKLEtBQUFxN0IsbUJBQ0F4VixFQUFBdmtCLEtBQUFpRSxLQUFBc2dCLEdBRUEsTUFBQWt2QyxFQUFBLElBQUFqeUQsWUFBQStpQixFQUFBQSxHQUNBbXZDLEVBQUEsSUFBQWpJLEdBQUFnSSxFQUFBbHZDLEVBQUFBLEVBQUF4c0IsR0FBQWYsSUFFQTBILEtBQUF3MEQsaUJBQUFRLENBRUEsQ0FFQSxrQkFBQUMsR0FFQSxJQUFBcHZDLEVBQUF2a0IsS0FBQThILEtBQUFwSixLQUFBcTdCLG1CQUNBeFYsRUFBQXZrQixLQUFBaUUsS0FBQXNnQixHQUdBLE1BQUFxdkMsRUFBQSxJQUFBcnlELGFBQUFnakIsRUFBQUEsRUFBQSxHQUFBb3BDLEtBQUEsR0FDQWh6QixFQUFBLElBQUE4d0IsR0FBQW1JLEVBQUFydkMsRUFBQUEsRUFBQTlzQixHQUFBUixJQUNBMGpDLEVBQUFocEIsV0FBQWpCLEdBQUFFLGtCQUVBbFMsS0FBQWc4QixlQUFBQyxDQUVBLENBRUEsbUJBQUFrNUIsQ0FBQUMsR0FFQSxNQUFBeHVDLEVBQUE1bUIsS0FBQTRtQixTQUNBMFUsRUFBQXQ3QixLQUFBdTdCLGdCQUNBQyxFQUFBeDdCLEtBQUF5N0IsZUFDQSxJQUFBLElBQUF6N0IsS0FBQTI3QixxQkFBQSxDQUVBLElBQUEsTUFBQTA1QixLQUFBRCxFQUFBNWQsV0FBQSxDQUVBLE1BQUE4ZCxFQUFBRixFQUFBdHVDLGFBQUF1dUMsSUFDQXgwRCxNQUFBQSxFQUFBazBDLFNBQUFBLEVBQUFDLFdBQUFBLEdBQUFzZ0IsRUFFQUMsRUFBQSxJQUFBMTBELEVBQUErQixZQUFBMDRCLEVBQUF5WixHQUNBeWdCLEVBQUEsSUFBQTFnQixHQUFBeWdCLEVBQUF4Z0IsRUFBQUMsR0FFQXB1QixFQUFBcXhCLGFBQUFvZCxFQUFBRyxFQUVBLENBRUEsR0FBQSxPQUFBSixFQUFBdmQsV0FBQSxDQUdBLE1BQUE0ZCxFQUFBbjZCLEVBQUEsTUFDQSxJQUFBeDRCLFlBQUEwNEIsR0FDQSxJQUFBejRCLFlBQUF5NEIsR0FFQTVVLEVBQUFreEIsU0FBQSxJQUFBaEQsR0FBQTJnQixFQUFBLEdBRUEsQ0FFQXoxRCxLQUFBMjdCLHNCQUFBLENBRUEsQ0FFQSxDQUdBLGlCQUFBKzVCLENBQUE5dUMsR0FHQSxNQUFBK3VDLEVBQUEzMUQsS0FBQTRtQixTQUNBLEdBQUFndkMsUUFBQWh2QyxFQUFBaXhCLGNBQUErZCxRQUFBRCxFQUFBOWQsWUFFQSxNQUFBLElBQUF6MEMsTUFBQSxxRUFJQSxJQUFBLE1BQUFpeUQsS0FBQU0sRUFBQW5lLFdBQUEsQ0FFQSxJQUFBNXdCLEVBQUF1eEIsYUFBQWtkLEdBRUEsTUFBQSxJQUFBanlELE1BQUEsOENBQUFpeUQsdURBSUEsTUFBQUMsRUFBQTF1QyxFQUFBRSxhQUFBdXVDLEdBQ0FHLEVBQUFHLEVBQUE3dUMsYUFBQXV1QyxHQUNBLEdBQUFDLEVBQUF2Z0IsV0FBQXlnQixFQUFBemdCLFVBQUF1Z0IsRUFBQXRnQixhQUFBd2dCLEVBQUF4Z0IsV0FFQSxNQUFBLElBQUE1eEMsTUFBQSwwRkFJQSxDQUVBLENBT0Esa0JBQUF5eUQsQ0FBQTlHLEdBRUEsTUFBQStHLEVBQUE5MUQsS0FBQTZ6RCxjQUNBLEdBQUE5RSxFQUFBLEdBQUFBLEdBQUErRyxFQUFBNzBELFNBQUEsSUFBQTYwRCxFQUFBL0csR0FBQXYwQixPQUVBLE1BQUEsSUFBQXAzQixNQUFBLHlDQUFBMnJELDBEQUlBLENBT0Esa0JBQUFnSCxDQUFBQyxHQUVBLE1BQUFDLEVBQUFqMkQsS0FBQTh6RCxjQUNBLEdBQUFrQyxFQUFBLEdBQUFBLEdBQUFDLEVBQUFoMUQsU0FBQSxJQUFBZzFELEVBQUFELEdBQUF4N0IsT0FFQSxNQUFBLElBQUFwM0IsTUFBQSx5Q0FBQTR5RCwwREFJQSxDQVNBLGFBQUFFLENBQUFDLEdBR0EsT0FEQW4yRCxLQUFBNHpELFdBQUF1QyxFQUNBbjJELElBRUEsQ0FPQSxrQkFBQW1uQixHQUVBLE9BQUFubkIsS0FBQWtuQixjQUVBbG5CLEtBQUFrbkIsWUFBQSxJQUFBaEMsSUFJQSxNQUFBZ0MsRUFBQWxuQixLQUFBa25CLFlBQ0E0dUMsRUFBQTkxRCxLQUFBNnpELGNBRUEzc0MsRUFBQTVCLFlBQ0EsSUFBQSxJQUFBdmtCLEVBQUEsRUFBQUMsRUFBQTgwRCxFQUFBNzBELE9BQUFGLEVBQUFDLEVBQUFELElBQUEsQ0FFQSxJQUFBLElBQUErMEQsRUFBQS8wRCxHQUFBeTVCLE9BQUEsU0FFQSxNQUFBdzdCLEVBQUFGLEVBQUEvMEQsR0FBQXExRCxjQUNBcDJELEtBQUF5dUQsWUFBQTF0RCxFQUFBNnhELElBQ0E1eUQsS0FBQXEyRCxpQkFBQUwsRUFBQWpELElBQUFwNUMsYUFBQWk1QyxJQUNBMXJDLEVBQUFHLE1BQUEwckMsR0FFQSxDQUVBLENBT0EscUJBQUF0YSxHQUVBLE9BQUF6NEMsS0FBQWs4QixpQkFFQWw4QixLQUFBazhCLGVBQUEsSUFBQXRTLElBSUEsTUFBQXNTLEVBQUFsOEIsS0FBQWs4QixlQUNBNDVCLEVBQUE5MUQsS0FBQTZ6RCxjQUVBMzNCLEVBQUE1VyxZQUNBLElBQUEsSUFBQXZrQixFQUFBLEVBQUFDLEVBQUE4MEQsRUFBQTcwRCxPQUFBRixFQUFBQyxFQUFBRCxJQUFBLENBRUEsSUFBQSxJQUFBKzBELEVBQUEvMEQsR0FBQXk1QixPQUFBLFNBRUEsTUFBQXc3QixFQUFBRixFQUFBLzBELEdBQUFxMUQsY0FDQXAyRCxLQUFBeXVELFlBQUExdEQsRUFBQTZ4RCxJQUNBNXlELEtBQUFzMkQsb0JBQUFOLEVBQUFoRCxJQUFBcjVDLGFBQUFpNUMsSUFDQTEyQixFQUFBN1UsTUFBQTJyQyxHQUVBLENBRUEsQ0FTQSxXQUFBdUQsQ0FBQVAsR0FLQSxHQUhBaDJELEtBQUE2ekQsY0FBQTV5RCxRQUFBakIsS0FBQW83QixrQkFHQSxJQUFBcDdCLEtBQUErekQsc0JBQUE5eUQsT0FFQSxNQUFBLElBQUFtQyxNQUFBLGtEQUlBLE1BQUEweUQsRUFBQSxDQUNBOS9CLFNBQUEsRUFDQXdFLFFBQUEsRUFDQTQ3QixjQUFBSixHQUdBLElBQUFRLEVBQUEsS0FHQXgyRCxLQUFBK3pELHNCQUFBOXlELE9BQUEsR0FFQWpCLEtBQUErekQsc0JBQUEwQyxLQUFBckUsSUFFQW9FLEVBQUF4MkQsS0FBQSt6RCxzQkFBQTJDLFFBQ0ExMkQsS0FBQTZ6RCxjQUFBMkMsR0FBQVYsSUFJQVUsRUFBQXgyRCxLQUFBNnpELGNBQUE1eUQsT0FDQWpCLEtBQUE2ekQsY0FBQXp6RCxLQUFBMDFELElBSUEsTUFBQWg2QixFQUFBOTdCLEtBQUErN0IsaUJBQ0E2MkIsR0FBQTltRCxXQUFBckIsUUFBQXF4QixFQUFBdG5CLE1BQUFlLEtBQUEsR0FBQWloRCxHQUNBMTZCLEVBQUEvbEIsYUFBQSxFQUVBLE1BQUFrbUIsRUFBQWo4QixLQUFBZzhCLGVBU0EsT0FSQUMsSUFFQTQyQixHQUFBcG9ELFFBQUF3eEIsRUFBQXpuQixNQUFBZSxLQUFBLEVBQUFpaEQsR0FDQXY2QixFQUFBbG1CLGFBQUEsR0FJQS9WLEtBQUFtMEQsb0JBQUEsRUFDQXFDLENBRUEsQ0FpQkEsV0FBQUcsQ0FBQS92QyxFQUFBZ3dDLEdBQUEsRUFBQUMsR0FBQSxHQUVBNzJELEtBQUFtMUQsb0JBQUF2dUMsR0FFQTVtQixLQUFBMDFELGtCQUFBOXVDLEdBRUEsTUFBQWt3QyxFQUFBLENBRUFDLGFBQUEsRUFDQXRELGFBQUEsRUFDQW1ELHFCQUFBLEVBRUFJLFlBQUEsRUFDQUMsWUFBQSxFQUNBSixvQkFBQSxFQUdBcGhCLE9BQUEsRUFDQTE1QixPQUFBLEVBR0FtTCxZQUFBLEtBQ0FnVixlQUFBLEtBQ0ExQixRQUFBLEdBR0F5N0IsRUFBQWoyRCxLQUFBOHpELGNBQ0FnRCxFQUFBQyxZQUFBLzJELEtBQUFrMEQsaUJBQ0E0QyxFQUFBRixxQkFBQSxJQUFBQSxFQUFBaHdDLEVBQUFFLGFBQUEsWUFBQS9LLE1BQUE2NkMsRUFFQSxNQUFBcDJELEVBQUFvbUIsRUFBQWl4QixXQVNBLEdBUkEsT0FBQXIzQyxJQUdBczJELEVBQUFFLFdBQUFoM0QsS0FBQWkwRCxnQkFDQTZDLEVBQUFELG9CQUFBLElBQUFBLEVBQUFyMkQsRUFBQXViLE1BQUE4NkMsSUFLQSxJQUFBQyxFQUFBRSxZQUNBRixFQUFBRSxXQUFBRixFQUFBRCxtQkFBQTcyRCxLQUFBeTdCLGdCQUNBcTdCLEVBQUFDLFlBQUFELEVBQUFGLG9CQUFBNTJELEtBQUF1N0IsZ0JBR0EsTUFBQSxJQUFBbjRCLE1BQUEsOEVBS0EsSUFBQTR5RCxFQXdCQSxPQXZCQWgyRCxLQUFBZzBELHNCQUFBL3lELE9BQUEsR0FFQWpCLEtBQUFnMEQsc0JBQUF5QyxLQUFBckUsSUFFQTRELEVBQUFoMkQsS0FBQWcwRCxzQkFBQTBDLFFBQ0FULEVBQUFELEdBQUFjLElBS0FkLEVBQUFoMkQsS0FBQTY3QixlQUNBNzdCLEtBQUE2N0IsaUJBQ0FvNkIsRUFBQTcxRCxLQUFBMDJELElBS0E5MkQsS0FBQWszRCxjQUFBbEIsRUFBQXB2QyxHQUdBNW1CLEtBQUFpMEQsZ0JBQUE2QyxFQUFBRSxXQUFBRixFQUFBRCxtQkFDQTcyRCxLQUFBazBELGlCQUFBNEMsRUFBQUMsWUFBQUQsRUFBQUYsb0JBRUFaLENBRUEsQ0FXQSxhQUFBa0IsQ0FBQWxCLEVBQUFwdkMsR0FFQSxHQUFBb3ZDLEdBQUFoMkQsS0FBQTY3QixlQUVBLE1BQUEsSUFBQXo0QixNQUFBLHNEQUlBcEQsS0FBQTAxRCxrQkFBQTl1QyxHQUVBLE1BQUErdUMsRUFBQTMxRCxLQUFBNG1CLFNBQ0F1d0MsRUFBQSxPQUFBeEIsRUFBQTlkLFdBQ0F1ZixFQUFBekIsRUFBQTlkLFdBQ0F3ZixFQUFBendDLEVBQUFpeEIsV0FDQWlmLEVBQUE5MkQsS0FBQTh6RCxjQUFBa0MsR0FDQSxHQUNBbUIsR0FDQUUsRUFBQXQ3QyxNQUFBKzZDLEVBQUFELG9CQUNBandDLEVBQUE0d0IsV0FBQWhtQixTQUFBelYsTUFBQSs2QyxFQUFBRixvQkFHQSxNQUFBLElBQUF4ekQsTUFBQSw2RUFLQSxNQUFBMnpELEVBQUFELEVBQUFDLFlBQ0FILEVBQUFFLEVBQUFGLG9CQUNBRSxFQUFBckQsWUFBQTdzQyxFQUFBRSxhQUFBLFlBQUEvSyxNQUVBLElBQUEsTUFBQXM1QyxLQUFBTSxFQUFBbmUsV0FBQSxDQUdBLE1BQUE4ZCxFQUFBMXVDLEVBQUFFLGFBQUF1dUMsR0FDQUcsRUFBQUcsRUFBQTd1QyxhQUFBdXVDLEdBQ0E5QixHQUFBK0IsRUFBQUUsRUFBQXVCLEdBR0EsTUFBQWhpQixFQUFBdWdCLEVBQUF2Z0IsU0FDQSxJQUFBLElBQUFoMEMsRUFBQXUwRCxFQUFBdjVDLE1BQUEvYSxFQUFBNDFELEVBQUE3MUQsRUFBQUMsRUFBQUQsSUFBQSxDQUVBLE1BQUFQLEVBQUF1MkQsRUFBQWgyRCxFQUNBLElBQUEsSUFBQWdGLEVBQUEsRUFBQUEsRUFBQWd2QyxFQUFBaHZDLElBRUF5dkQsRUFBQWp1RCxhQUFBL0csRUFBQXVGLEVBQUEsRUFJQSxDQUVBeXZELEVBQUF6L0MsYUFBQSxFQUNBeS9DLEVBQUFoZ0IsZUFBQXVoQixFQUFBaGlCLEVBQUE2aEIsRUFBQTdoQixFQUVBLENBR0EsR0FBQW9pQixFQUFBLENBRUEsTUFBQUgsRUFBQUYsRUFBQUUsV0FDQUgsRUFBQUMsRUFBQUQsbUJBQ0FDLEVBQUFHLFdBQUFyd0MsRUFBQWl4QixXQUFBOTdCLE1BR0EsSUFBQSxJQUFBaGIsRUFBQSxFQUFBQSxFQUFBczJELEVBQUF0N0MsTUFBQWhiLElBRUFxMkQsRUFBQS92RCxLQUFBMnZELEVBQUFqMkQsRUFBQWcyRCxFQUFBTSxFQUFBenNELEtBQUE3SixJQUtBLElBQUEsSUFBQUEsRUFBQXMyRCxFQUFBdDdDLE1BQUEvYSxFQUFBNjFELEVBQUE5MUQsRUFBQUMsRUFBQUQsSUFFQXEyRCxFQUFBL3ZELEtBQUEydkQsRUFBQWoyRCxFQUFBZzJELEdBSUFLLEVBQUFyaEQsYUFBQSxFQUNBcWhELEVBQUE1aEIsZUFBQXdoQixFQUFBRixFQUFBRCxtQkFFQSxDQXNCQSxPQW5CQUMsRUFBQXJoQixNQUFBMGhCLEVBQUFMLEVBQUFFLFdBQUFGLEVBQUFDLFlBQ0FELEVBQUEvNkMsTUFBQW83QyxFQUFBTCxFQUFBRyxXQUFBSCxFQUFBckQsWUFHQXFELEVBQUE1dkMsWUFBQSxLQUNBLE9BQUFOLEVBQUFNLGNBRUE0dkMsRUFBQTV2QyxZQUFBTixFQUFBTSxZQUFBemYsU0FJQXF2RCxFQUFBNTZCLGVBQUEsS0FDQSxPQUFBdFYsRUFBQXNWLGlCQUVBNDZCLEVBQUE1NkIsZUFBQXRWLEVBQUFzVixlQUFBejBCLFNBSUF6SCxLQUFBbTBELG9CQUFBLEVBQ0E2QixDQUVBLENBU0EsY0FBQXNCLENBQUF0QixHQUVBLE1BQUFDLEVBQUFqMkQsS0FBQTh6RCxjQUNBLEdBQUFrQyxHQUFBQyxFQUFBaDFELFNBQUEsSUFBQWcxRCxFQUFBRCxHQUFBeDdCLE9BRUEsT0FBQXg2QixLQUtBLE1BQUE4MUQsRUFBQTkxRCxLQUFBNnpELGNBQ0EsSUFBQSxJQUFBOXlELEVBQUEsRUFBQUMsRUFBQTgwRCxFQUFBNzBELE9BQUFGLEVBQUFDLEVBQUFELElBRUErMEQsRUFBQS8wRCxHQUFBeTVCLFFBQUFzN0IsRUFBQS8wRCxHQUFBcTFELGdCQUFBSixHQUVBaDJELEtBQUF1M0QsZUFBQXgyRCxHQVVBLE9BSkFrMUQsRUFBQUQsR0FBQXg3QixRQUFBLEVBQ0F4NkIsS0FBQWcwRCxzQkFBQTV6RCxLQUFBNDFELEdBQ0FoMkQsS0FBQW0wRCxvQkFBQSxFQUVBbjBELElBRUEsQ0FRQSxjQUFBdTNELENBQUF4SSxHQVFBLE9BTkEvdUQsS0FBQTYxRCxtQkFBQTlHLEdBRUEvdUQsS0FBQTZ6RCxjQUFBOUUsR0FBQXYwQixRQUFBLEVBQ0F4NkIsS0FBQSt6RCxzQkFBQTN6RCxLQUFBMnVELEdBQ0EvdUQsS0FBQW0wRCxvQkFBQSxFQUVBbjBELElBRUEsQ0FTQSxRQUFBdzNELEdBR0EsSUFBQUMsRUFBQSxFQUNBQyxFQUFBLEVBSUEsTUFBQXpCLEVBQUFqMkQsS0FBQTh6RCxjQUNBL1ksRUFBQWtiLEVBQ0FyN0IsS0FBQSxDQUFBcHlCLEVBQUF6SCxJQUFBQSxJQUNBMDFELE1BQUEsQ0FBQTV3RCxFQUFBQyxJQUVBbXdELEVBQUFwd0QsR0FBQWt4RCxZQUFBZCxFQUFBbndELEdBQUFpeEQsY0FJQW53QyxFQUFBNW1CLEtBQUE0bUIsU0FDQSxJQUFBLElBQUE3bEIsRUFBQSxFQUFBQyxFQUFBaTFELEVBQUFoMUQsT0FBQUYsRUFBQUMsRUFBQUQsSUFBQSxDQUdBLE1BQUFQLEVBQUF1NkMsRUFBQWg2QyxHQUNBKzFELEVBQUFiLEVBQUF6MUQsR0FDQSxJQUFBLElBQUFzMkQsRUFBQXQ4QixPQUFBLENBT0EsR0FBQSxPQUFBNVQsRUFBQXBtQixNQUFBLENBRUEsR0FBQXMyRCxFQUFBRSxhQUFBVSxFQUFBLENBRUEsTUFBQVYsV0FBQUEsRUFBQUQsWUFBQUEsRUFBQUYsbUJBQUFBLEdBQUFDLEVBQ0F0MkQsRUFBQW9tQixFQUFBcG1CLE1BQ0FLLEVBQUFMLEVBQUFLLE1BSUE4MkQsRUFBQUYsRUFBQVYsRUFDQSxJQUFBLElBQUExdEMsRUFBQTJ0QyxFQUFBM3RDLEVBQUEydEMsRUFBQUgsRUFBQXh0QyxJQUVBeG9CLEVBQUF3b0IsR0FBQXhvQixFQUFBd29CLEdBQUFzdUMsRUFJQW4zRCxFQUFBSyxNQUFBKzJELFdBQUFGLEVBQUFWLEVBQUFBLEVBQUFILEdBQ0FyMkQsRUFBQWcxQyxlQUFBa2lCLEVBQUFiLEdBRUFDLEVBQUFFLFdBQUFVLENBRUEsQ0FFQUEsR0FBQVosRUFBQUQsa0JBRUEsQ0FHQSxHQUFBQyxFQUFBQyxjQUFBVSxFQUFBLENBRUEsTUFBQVYsWUFBQUEsRUFBQUgsb0JBQUFBLEdBQUFFLEVBQ0F0ZixFQUFBNXdCLEVBQUE0d0IsV0FDQSxJQUFBLE1BQUFuYSxLQUFBbWEsRUFBQSxDQUVBLE1BQUE3c0MsRUFBQTZzQyxFQUFBbmEsSUFDQXg4QixNQUFBQSxFQUFBazBDLFNBQUFBLEdBQUFwcUMsRUFDQTlKLEVBQUErMkQsV0FBQUgsRUFBQTFpQixFQUFBZ2lCLEVBQUFoaUIsR0FBQWdpQixFQUFBSCxHQUFBN2hCLEdBQ0FwcUMsRUFBQTZxQyxlQUFBaWlCLEVBQUExaUIsRUFBQTZoQixFQUFBN2hCLEVBRUEsQ0FFQStoQixFQUFBQyxZQUFBVSxDQUVBLENBRUFBLEdBQUFYLEVBQUFGLG9CQUNBRSxFQUFBcmhCLE1BQUE3dUIsRUFBQXBtQixNQUFBczJELEVBQUFFLFdBQUFGLEVBQUFDLFlBR0EvMkQsS0FBQWkwRCxnQkFBQXJ0QyxFQUFBcG1CLE1BQUFzMkQsRUFBQUUsV0FBQUYsRUFBQUQsbUJBQUEsRUFDQTcyRCxLQUFBazBELGlCQUFBNEMsRUFBQUMsWUFBQUQsRUFBQUYsbUJBdERBLENBd0RBLENBRUEsT0FBQTUyRCxJQUVBLENBU0EsZ0JBQUFxMkQsQ0FBQUwsRUFBQXAxRCxHQUVBLEdBQUFvMUQsR0FBQWgyRCxLQUFBNjdCLGVBRUEsT0FBQSxLQUtBLE1BQUFqVixFQUFBNW1CLEtBQUE0bUIsU0FDQWt3QyxFQUFBOTJELEtBQUE4ekQsY0FBQWtDLEdBQ0EsR0FBQSxPQUFBYyxFQUFBNXZDLFlBQUEsQ0FFQSxNQUFBZixFQUFBLElBQUFqQixHQUNBMWtCLEVBQUFvbUIsRUFBQXBtQixNQUNBZ3hCLEVBQUE1SyxFQUFBNHdCLFdBQUFobUIsU0FDQSxJQUFBLElBQUF6d0IsRUFBQSsxRCxFQUFBcmhCLE1BQUF6MEMsRUFBQTgxRCxFQUFBcmhCLE1BQUFxaEIsRUFBQS82QyxNQUFBaGIsRUFBQUMsRUFBQUQsSUFBQSxDQUVBLElBQUE4MkQsRUFBQTkyRCxFQUNBUCxJQUVBcTNELEVBQUFyM0QsRUFBQW9LLEtBQUFpdEQsSUFJQTF4QyxFQUFBWixjQUFBMHRDLEdBQUF2b0Qsb0JBQUE4bUIsRUFBQXFtQyxHQUVBLENBRUFmLEVBQUE1dkMsWUFBQWYsQ0FFQSxDQUdBLE9BREF2bEIsRUFBQThHLEtBQUFvdkQsRUFBQTV2QyxhQUNBdG1CLENBRUEsQ0FTQSxtQkFBQTAxRCxDQUFBTixFQUFBcDFELEdBRUEsR0FBQW8xRCxHQUFBaDJELEtBQUE2N0IsZUFFQSxPQUFBLEtBS0EsTUFBQWpWLEVBQUE1bUIsS0FBQTRtQixTQUNBa3dDLEVBQUE5MkQsS0FBQTh6RCxjQUFBa0MsR0FDQSxHQUFBLE9BQUFjLEVBQUE1NkIsZUFBQSxDQUVBLE1BQUF0VSxFQUFBLElBQUFnQyxHQUNBNXBCLEtBQUFxMkQsaUJBQUFMLEVBQUFqRCxJQUNBQSxHQUFBMXNDLFVBQUF1QixFQUFBN2MsUUFFQSxNQUFBdkssRUFBQW9tQixFQUFBcG1CLE1BQ0FneEIsRUFBQTVLLEVBQUE0d0IsV0FBQWhtQixTQUVBLElBQUF6SCxFQUFBLEVBQ0EsSUFBQSxJQUFBaHBCLEVBQUErMUQsRUFBQXJoQixNQUFBejBDLEVBQUE4MUQsRUFBQXJoQixNQUFBcWhCLEVBQUEvNkMsTUFBQWhiLEVBQUFDLEVBQUFELElBQUEsQ0FFQSxJQUFBODJELEVBQUE5MkQsRUFDQVAsSUFFQXEzRCxFQUFBcjNELEVBQUFvSyxLQUFBaXRELElBSUE1RSxHQUFBdm9ELG9CQUFBOG1CLEVBQUFxbUMsR0FDQTl0QyxFQUFBem9CLEtBQUFhLElBQUE0bkIsRUFBQW5DLEVBQUE3YyxPQUFBbEIsa0JBQUFvcEQsSUFFQSxDQUVBcnJDLEVBQUFyRCxPQUFBampCLEtBQUE4SCxLQUFBMmdCLEdBQ0Erc0MsRUFBQTU2QixlQUFBdFUsQ0FFQSxDQUdBLE9BREFobkIsRUFBQThHLEtBQUFvdkQsRUFBQTU2QixnQkFDQXQ3QixDQUVBLENBVUEsV0FBQTR0RCxDQUFBTyxFQUFBbi9DLEdBRUE1UCxLQUFBNjFELG1CQUFBOUcsR0FFQSxNQUFBanpCLEVBQUE5N0IsS0FBQSs3QixpQkFDQSs0QixFQUFBOTBELEtBQUErN0IsaUJBQUF2bkIsTUFBQWUsS0FJQSxPQUhBM0YsRUFBQW5GLFFBQUFxcUQsRUFBQSxHQUFBL0YsR0FDQWp6QixFQUFBL2xCLGFBQUEsRUFFQS9WLElBRUEsQ0FTQSxXQUFBeXVELENBQUFNLEVBQUFuL0MsR0FHQSxPQURBNVAsS0FBQTYxRCxtQkFBQTlHLEdBQ0FuL0MsRUFBQXJGLFVBQUF2SyxLQUFBKzdCLGlCQUFBdm5CLE1BQUFlLEtBQUEsR0FBQXc1QyxFQUVBLENBU0EsVUFBQUMsQ0FBQUQsRUFBQTE4QyxHQWFBLE9BWEFyUyxLQUFBNjFELG1CQUFBOUcsR0FFQSxPQUFBL3VELEtBQUFnOEIsZ0JBRUFoOEIsS0FBQWkxRCxxQkFJQTVpRCxFQUFBNUgsUUFBQXpLLEtBQUFnOEIsZUFBQXhuQixNQUFBZSxLQUFBLEVBQUF3NUMsR0FDQS91RCxLQUFBZzhCLGVBQUFqbUIsYUFBQSxFQUVBL1YsSUFFQSxDQVNBLFVBQUEwdUQsQ0FBQUssRUFBQTE4QyxHQUdBLE9BREFyUyxLQUFBNjFELG1CQUFBOUcsR0FDQTE4QyxFQUFBOUgsVUFBQXZLLEtBQUFnOEIsZUFBQXhuQixNQUFBZSxLQUFBLEVBQUF3NUMsRUFFQSxDQVNBLFlBQUErSSxDQUFBL0ksRUFBQS80QixHQUlBLE9BRkFoMkIsS0FBQTYxRCxtQkFBQTlHLEdBRUEvdUQsS0FBQTZ6RCxjQUFBOUUsR0FBQS80QixVQUFBQSxJQU1BaDJCLEtBQUE2ekQsY0FBQTlFLEdBQUEvNEIsUUFBQUEsRUFDQWgyQixLQUFBbTBELG9CQUFBLEdBTEFuMEQsSUFTQSxDQVFBLFlBQUErM0QsQ0FBQWhKLEdBSUEsT0FGQS91RCxLQUFBNjFELG1CQUFBOUcsR0FFQS91RCxLQUFBNnpELGNBQUE5RSxHQUFBLzRCLE9BRUEsQ0FTQSxlQUFBZ2lDLENBQUFqSixFQUFBaUgsR0FPQSxPQUxBaDJELEtBQUE2MUQsbUJBQUE5RyxHQUNBL3VELEtBQUErMUQsbUJBQUFDLEdBRUFoMkQsS0FBQTZ6RCxjQUFBOUUsR0FBQXFILGNBQUFKLEVBRUFoMkQsSUFFQSxDQVFBLGVBQUFpNEQsQ0FBQWxKLEdBSUEsT0FGQS91RCxLQUFBNjFELG1CQUFBOUcsR0FFQS91RCxLQUFBNnpELGNBQUE5RSxHQUFBcUgsYUFFQSxDQWNBLGtCQUFBOEIsQ0FBQWxDLEVBQUFwMUQsRUFBQSxDQUFBLEdBRUFaLEtBQUErMUQsbUJBQUFDLEdBRUEsTUFBQWMsRUFBQTkyRCxLQUFBOHpELGNBQUFrQyxHQVlBLE9BWEFwMUQsRUFBQW0yRCxZQUFBRCxFQUFBQyxZQUNBbjJELEVBQUE2eUQsWUFBQXFELEVBQUFyRCxZQUNBN3lELEVBQUFnMkQsb0JBQUFFLEVBQUFGLG9CQUVBaDJELEVBQUFvMkQsV0FBQUYsRUFBQUUsV0FDQXAyRCxFQUFBcTJELFdBQUFILEVBQUFHLFdBQ0FyMkQsRUFBQWkyRCxtQkFBQUMsRUFBQUQsbUJBRUFqMkQsRUFBQTYwQyxNQUFBcWhCLEVBQUFyaEIsTUFDQTcwQyxFQUFBbWIsTUFBQSs2QyxFQUFBLzZDLE1BRUFuYixDQUVBLENBU0EsZ0JBQUF1M0QsQ0FBQS84QixHQUdBLE1BQUFnOUIsRUFBQXA0RCxLQUFBK3pELHNCQUNBK0IsRUFBQTkxRCxLQUFBNnpELGNBRUEsSUFEQXVFLEVBQUEzQixLQUFBckUsSUFDQWdHLEVBQUFBLEVBQUFuM0QsT0FBQSxLQUFBNjBELEVBQUE3MEQsUUFFQTYwRCxFQUFBdUMsTUFDQUQsRUFBQUMsTUFLQSxHQUFBajlCLEVBQUEwNkIsRUFBQTcwRCxPQUVBLE1BQUEsSUFBQW1DLE1BQUEsK0NBQUFnNEIsbURBS0EsTUFBQWs5QixFQUFBLElBQUFyMUQsV0FBQW00QixHQUNBbTlCLEVBQUEsSUFBQXQxRCxXQUFBbTRCLEdBQ0FzNEIsR0FBQTF6RCxLQUFBbzBELGlCQUFBa0UsR0FDQTVFLEdBQUExekQsS0FBQXEwRCxpQkFBQWtFLEdBRUF2NEQsS0FBQW8wRCxpQkFBQWtFLEVBQ0F0NEQsS0FBQXEwRCxpQkFBQWtFLEVBQ0F2NEQsS0FBQXE3QixrQkFBQUQsRUFHQSxNQUFBNDVCLEVBQUFoMUQsS0FBQXcwRCxpQkFDQTE0QixFQUFBOTdCLEtBQUErN0IsaUJBQ0FFLEVBQUFqOEIsS0FBQWc4QixlQUVBZzVCLEVBQUEvN0MsVUFDQWpaLEtBQUEwMEQsdUJBQ0FoQixHQUFBc0IsRUFBQXhnRCxNQUFBZSxLQUFBdlYsS0FBQXcwRCxpQkFBQWhnRCxNQUFBZSxNQUVBdW1CLEVBQUE3aUIsVUFDQWpaLEtBQUF5MEQsdUJBQ0FmLEdBQUE1M0IsRUFBQXRuQixNQUFBZSxLQUFBdlYsS0FBQSs3QixpQkFBQXZuQixNQUFBZSxNQUVBMG1CLElBRUFBLEVBQUFoakIsVUFDQWpaLEtBQUFpMUQscUJBQ0F2QixHQUFBejNCLEVBQUF6bkIsTUFBQWUsS0FBQXZWLEtBQUFnOEIsZUFBQXhuQixNQUFBZSxNQUlBLENBVUEsZUFBQWlqRCxDQUFBbDlCLEVBQUFFLEdBR0EsTUFBQWk5QixFQUFBLElBQUF6NEQsS0FBQTh6RCxlQUFBNEUsUUFBQUMsR0FBQUEsRUFBQW4rQixTQUVBLEdBREFsNUIsS0FBQWEsT0FBQXMyRCxFQUFBNzlCLEtBQUFoMkIsR0FBQUEsRUFBQW15RCxZQUFBbnlELEVBQUFneUQsdUJBQ0F0N0IsRUFFQSxNQUFBLElBQUFsNEIsTUFBQSx3RUFBQW80Qiw2QkFLQSxHQUFBeDdCLEtBQUE0bUIsU0FBQXBtQixNQUFBLENBR0EsR0FEQWMsS0FBQWEsT0FBQXMyRCxFQUFBNzlCLEtBQUFoMkIsR0FBQUEsRUFBQW95RCxXQUFBcHlELEVBQUFpeUQsc0JBQ0FyN0IsRUFFQSxNQUFBLElBQUFwNEIsTUFBQSx1RUFBQW80Qiw0QkFJQSxDQUtBLE1BQUFvOUIsRUFBQTU0RCxLQUFBNG1CLFNBQ0FneUMsRUFBQTMvQyxVQUdBalosS0FBQXU3QixnQkFBQUQsRUFDQXQ3QixLQUFBeTdCLGVBQUFELEVBRUF4N0IsS0FBQTI3Qix1QkFFQTM3QixLQUFBMjdCLHNCQUFBLEVBQ0EzN0IsS0FBQTRtQixTQUFBLElBQUF5d0IsR0FDQXIzQyxLQUFBbTFELG9CQUFBeUQsSUFLQSxNQUFBaHlDLEVBQUE1bUIsS0FBQTRtQixTQUNBZ3lDLEVBQUFwNEQsT0FFQWt6RCxHQUFBa0YsRUFBQXA0RCxNQUFBSyxNQUFBK2xCLEVBQUFwbUIsTUFBQUssT0FJQSxJQUFBLE1BQUF3OEIsS0FBQXU3QixFQUFBcGhCLFdBRUFrYyxHQUFBa0YsRUFBQXBoQixXQUFBbmEsR0FBQXg4QixNQUFBK2xCLEVBQUE0d0IsV0FBQW5hLEdBQUF4OEIsTUFJQSxDQUVBLE9BQUFnNEIsQ0FBQStqQixFQUFBQyxHQUVBLE1BQUFpWixFQUFBOTFELEtBQUE2ekQsY0FDQW9DLEVBQUFqMkQsS0FBQTh6RCxjQUNBendDLEVBQUFyakIsS0FBQXFqQixZQUNBc3lDLEVBQUEzMUQsS0FBQTRtQixTQUdBeXNDLEdBQUF0MkIsU0FBQS84QixLQUFBKzhCLFNBQ0FzMkIsR0FBQXpzQyxTQUFBcG1CLE1BQUFtMUQsRUFBQW4xRCxNQUNBNnlELEdBQUF6c0MsU0FBQTR3QixXQUFBbWUsRUFBQW5lLFdBQ0EsT0FBQTZiLEdBQUF6c0MsU0FBQU0sY0FFQW1zQyxHQUFBenNDLFNBQUFNLFlBQUEsSUFBQWhDLElBSUEsT0FBQW11QyxHQUFBenNDLFNBQUFzVixpQkFFQW0zQixHQUFBenNDLFNBQUFzVixlQUFBLElBQUF0UyxJQUlBLElBQUEsSUFBQTdvQixFQUFBLEVBQUFDLEVBQUE4MEQsRUFBQTcwRCxPQUFBRixFQUFBQyxFQUFBRCxJQUFBLENBRUEsSUFBQSswRCxFQUFBLzBELEdBQUFpMUIsVUFBQTgvQixFQUFBLzBELEdBQUF5NUIsT0FFQSxTQUlBLE1BQUF3N0IsRUFBQUYsRUFBQS8wRCxHQUFBcTFELGNBQ0FVLEVBQUFiLEVBQUFELEdBQ0EzQyxHQUFBenNDLFNBQUEyeEIsYUFBQXVlLEVBQUFyaEIsTUFBQXFoQixFQUFBLzZDLE9BR0EvYixLQUFBeXVELFlBQUExdEQsRUFBQXN5RCxHQUFBaHdDLGFBQUE5VyxZQUFBOFcsR0FDQXJqQixLQUFBcTJELGlCQUFBTCxFQUFBM0MsR0FBQXpzQyxTQUFBTSxhQUNBbG5CLEtBQUFzMkQsb0JBQUFOLEVBQUEzQyxHQUFBenNDLFNBQUFzVixnQkFDQW0zQixHQUFBeDZCLFFBQUErakIsRUFBQTBXLElBR0EsSUFBQSxJQUFBanFDLEVBQUEsRUFBQXJvQixFQUFBc3lELEdBQUFyeUQsT0FBQW9vQixFQUFBcm9CLEVBQUFxb0IsSUFBQSxDQUVBLE1BQUFMLEVBQUFzcUMsR0FBQWpxQyxHQUNBTCxFQUFBaEQsT0FBQWhtQixLQUNBZ3BCLEVBQUE2dkMsUUFBQTkzRCxFQUNBODdDLEVBQUF6OEMsS0FBQTRvQixFQUVBLENBRUFzcUMsR0FBQXJ5RCxPQUFBLENBRUEsQ0FFQW95RCxHQUFBdDJCLFNBQUEsS0FDQXMyQixHQUFBenNDLFNBQUFwbUIsTUFBQSxLQUNBNnlELEdBQUF6c0MsU0FBQTR3QixXQUFBLENBQUEsRUFDQTZiLEdBQUF6c0MsU0FBQTJ4QixhQUFBLEVBQUFwekIsSUFFQSxDQUVBLElBQUF6ZCxDQUFBK1AsR0FxQ0EsT0FuQ0FGLE1BQUE3UCxLQUFBK1AsR0FFQXpYLEtBQUE0bUIsU0FBQW5QLEVBQUFtUCxTQUFBbmYsUUFDQXpILEtBQUFnNkIsdUJBQUF2aUIsRUFBQXVpQix1QkFDQWg2QixLQUFBaTZCLFlBQUF4aUIsRUFBQXdpQixZQUNBajZCLEtBQUFrbkIsWUFBQSxPQUFBelAsRUFBQXlQLFlBQUF6UCxFQUFBeVAsWUFBQXpmLFFBQUEsS0FDQXpILEtBQUFrOEIsZUFBQSxPQUFBemtCLEVBQUF5a0IsZUFBQXprQixFQUFBeWtCLGVBQUF6MEIsUUFBQSxLQUVBekgsS0FBQTh6RCxjQUFBcjhDLEVBQUFxOEMsY0FBQWw1QixLQUFBKzlCLElBQUEsSUFDQUEsRUFFQXp4QyxZQUFBLE9BQUF5eEMsRUFBQXp4QyxZQUFBeXhDLEVBQUF6eEMsWUFBQXpmLFFBQUEsS0FDQXkwQixlQUFBLE9BQUF5OEIsRUFBQXo4QixlQUFBeThCLEVBQUF6OEIsZUFBQXowQixRQUFBLFNBRUF6SCxLQUFBNnpELGNBQUFwOEMsRUFBQW84QyxjQUFBajVCLEtBQUErOUIsSUFBQSxJQUFBQSxNQUVBMzRELEtBQUFxN0Isa0JBQUE1akIsRUFBQTRqQixrQkFDQXI3QixLQUFBdTdCLGdCQUFBOWpCLEVBQUE4akIsZ0JBQ0F2N0IsS0FBQXk3QixlQUFBaGtCLEVBQUFna0IsZUFFQXo3QixLQUFBMjdCLHFCQUFBbGtCLEVBQUFra0IscUJBQ0EzN0IsS0FBQTY3QixlQUFBcGtCLEVBQUFva0IsZUFDQTc3QixLQUFBbzBELGlCQUFBMzhDLEVBQUEyOEMsaUJBQUF0ekQsUUFDQWQsS0FBQXEwRCxpQkFBQTU4QyxFQUFBNDhDLGlCQUFBdnpELFFBRUFkLEtBQUErN0IsaUJBQUF0a0IsRUFBQXNrQixpQkFBQXQwQixRQUNBekgsS0FBQSs3QixpQkFBQXZuQixNQUFBZSxLQUFBdlYsS0FBQSs3QixpQkFBQXZuQixNQUFBZSxLQUFBelUsUUFFQSxPQUFBZCxLQUFBZzhCLGlCQUVBaDhCLEtBQUFnOEIsZUFBQXZrQixFQUFBdWtCLGVBQUF2MEIsUUFDQXpILEtBQUFnOEIsZUFBQXhuQixNQUFBZSxLQUFBdlYsS0FBQWc4QixlQUFBeG5CLE1BQUFlLEtBQUF6VSxTQUlBZCxJQUVBLENBTUEsT0FBQWlaLEdBR0FqWixLQUFBNG1CLFNBQUEzTixVQUVBalosS0FBQSs3QixpQkFBQTlpQixVQUNBalosS0FBQSs3QixpQkFBQSxLQUVBLzdCLEtBQUF3MEQsaUJBQUF2N0MsVUFDQWpaLEtBQUF3MEQsaUJBQUEsS0FFQSxPQUFBeDBELEtBQUFnOEIsaUJBRUFoOEIsS0FBQWc4QixlQUFBL2lCLFVBQ0FqWixLQUFBZzhCLGVBQUEsS0FJQSxDQUVBLGNBQUF0RixDQUFBNm9CLEVBQUFtRSxFQUFBemdDLEVBQUEyRCxFQUFBbVcsR0FJQSxJQUFBLzhCLEtBQUFtMEQscUJBQUFuMEQsS0FBQWc2Qix5QkFBQWg2QixLQUFBaTZCLFlBRUEsT0FNQSxNQUFBejVCLEVBQUFvbUIsRUFBQWl4QixXQUNBaWhCLEVBQUEsT0FBQXQ0RCxFQUFBLEVBQUFBLEVBQUFLLE1BQUFrNEQsa0JBRUFqRCxFQUFBOTFELEtBQUE2ekQsY0FDQTBFLEVBQUF2NEQsS0FBQXEwRCxpQkFDQWlFLEVBQUF0NEQsS0FBQW8wRCxpQkFDQTZCLEVBQUFqMkQsS0FBQTh6RCxjQUNBOTVCLEVBQUFoNkIsS0FBQWc2Qix1QkFDQWc3QixFQUFBaDFELEtBQUF3MEQsaUJBQ0FPLEVBQUFDLEVBQUF4Z0QsTUFBQWUsS0FHQXlrQixJQUVBNDRCLEdBQ0F0bUQsaUJBQUEyVyxFQUFBdFIsaUJBQUFzUixFQUFBQyxvQkFDQS9hLFNBQUFuSSxLQUFBcWpCLGFBQ0F5dkMsR0FBQS9CLHdCQUNBNkIsR0FDQXJULEVBQUE1c0IsbUJBS0EsSUFBQXFtQyxFQUFBLEVBQ0EsR0FBQWg1RCxLQUFBaTZCLFlBQUEsQ0FHQTI0QixHQUFBbHJELEtBQUExSCxLQUFBcWpCLGFBQUFwVixTQUNBZ2xELEdBQUFsNEMsc0JBQUFrSSxFQUFBSSxhQUFBMUosYUFBQWk1QyxJQUNBTSxHQUFBdnNELElBQUEsRUFBQSxHQUFBLEdBQUEyYyxtQkFBQUwsRUFBQUksYUFBQUMsbUJBQUFzdkMsSUFFQSxJQUFBLElBQUE3eEQsRUFBQSxFQUFBQyxFQUFBODBELEVBQUE3MEQsT0FBQUYsRUFBQUMsRUFBQUQsSUFFQSxHQUFBKzBELEVBQUEvMEQsR0FBQWkxQixTQUFBOC9CLEVBQUEvMEQsR0FBQXk1QixPQUFBLENBRUEsTUFBQXc3QixFQUFBRixFQUFBLzBELEdBQUFxMUQsY0FHQXAyRCxLQUFBeXVELFlBQUExdEQsRUFBQTZ4RCxJQUNBNXlELEtBQUFzMkQsb0JBQUFOLEVBQUFoRCxJQUFBcjVDLGFBQUFpNUMsSUFHQSxJQUFBcUcsR0FBQSxFQU9BLEdBTkFqL0IsSUFFQWkvQixHQUFBbkcsR0FBQW5yQyxpQkFBQXFyQyxNQUlBaUcsRUFBQSxDQUdBLE1BQUFuQyxFQUFBYixFQUFBRCxHQUNBMThDLEVBQUE2NUMsR0FBQWpyRCxXQUFBOHFELEdBQUFqb0QsT0FBQWtvRCxJQUFBaHFELElBQUFpcUQsSUFDQUUsR0FBQWh6RCxLQUFBMDJELEVBQUFyaEIsTUFBQXFoQixFQUFBLzZDLE1BQUF6QyxFQUFBdlksRUFFQSxDQUVBLENBS0EsTUFBQTB4RCxFQUFBVyxHQUFBWCxLQUNBbUIsRUFBQTV6RCxLQUFBNHpELFdBQ0EsT0FBQUEsRUFFQW5CLEVBQUFnRSxLQUFBMTVCLEVBQUEwUCxZQUFBNmxCLEdBQUFELElBSUF1QixFQUFBMXlELEtBQUFsQixLQUFBeXlELEVBQUF4dkMsR0FJQSxJQUFBLElBQUFsaUIsRUFBQSxFQUFBQyxFQUFBeXhELEVBQUF4eEQsT0FBQUYsRUFBQUMsRUFBQUQsSUFBQSxDQUVBLE1BQUEyeEQsRUFBQUQsRUFBQTF4RCxHQUNBdzNELEVBQUFTLEdBQUF0RyxFQUFBamQsTUFBQXFqQixFQUNBUixFQUFBVSxHQUFBdEcsRUFBQTMyQyxNQUNBZzVDLEVBQUFpRSxHQUFBdEcsRUFBQWx5RCxNQUNBdzRELEdBRUEsQ0FFQTVGLEdBQUFULE9BRUEsTUFFQSxJQUFBLElBQUE1eEQsRUFBQSxFQUFBQyxFQUFBODBELEVBQUE3MEQsT0FBQUYsRUFBQUMsRUFBQUQsSUFFQSxHQUFBKzBELEVBQUEvMEQsR0FBQWkxQixTQUFBOC9CLEVBQUEvMEQsR0FBQXk1QixPQUFBLENBRUEsTUFBQXc3QixFQUFBRixFQUFBLzBELEdBQUFxMUQsY0FHQSxJQUFBNkMsR0FBQSxFQVVBLEdBVEFqL0IsSUFHQWg2QixLQUFBeXVELFlBQUExdEQsRUFBQTZ4RCxJQUNBNXlELEtBQUFzMkQsb0JBQUFOLEVBQUFoRCxJQUFBcjVDLGFBQUFpNUMsSUFDQXFHLEdBQUFuRyxHQUFBbnJDLGlCQUFBcXJDLE1BSUFpRyxFQUFBLENBRUEsTUFBQW5DLEVBQUFiLEVBQUFELEdBQ0F1QyxFQUFBUyxHQUFBbEMsRUFBQXJoQixNQUFBcWpCLEVBQ0FSLEVBQUFVLEdBQUFsQyxFQUFBLzZDLE1BQ0FnNUMsRUFBQWlFLEdBQUFqNEQsRUFDQWk0RCxHQUVBLENBRUEsQ0FNQWhFLEVBQUFqL0MsYUFBQSxFQUNBL1YsS0FBQXMwRCxnQkFBQTBFLEVBQ0FoNUQsS0FBQW0wRCxvQkFBQSxDQUVBLENBRUEsY0FBQTM5QixDQUFBK29CLEVBQUF2NUIsRUFBQS9DLEVBQUFpMkMsRUFBQXR5QyxFQUFBdXlDLEdBRUFuNUQsS0FBQTAyQixlQUFBNm9CLEVBQUEsS0FBQTJaLEVBQUF0eUMsRUFBQXV5QyxFQUVBLEVDcmxEQSxNQUFBQyxXQUFBanRCLEdBV0EsV0FBQXZwQyxDQUFBNjVCLEdBRUFsbEIsUUFTQXZYLEtBQUFxNUQscUJBQUEsRUFFQXI1RCxLQUFBSCxLQUFBLG9CQVFBRyxLQUFBcVMsTUFBQSxJQUFBeTNCLEdBQUEsVUFTQTlwQyxLQUFBNDZCLElBQUEsS0FZQTU2QixLQUFBK3lDLFVBQUEsRUFVQS95QyxLQUFBczVELFFBQUEsUUFVQXQ1RCxLQUFBdTVELFNBQUEsUUFRQXY1RCxLQUFBdXpDLEtBQUEsRUFFQXZ6QyxLQUFBaXZDLFVBQUF4UyxFQUVBLENBRUEsSUFBQS8wQixDQUFBK1AsR0FjQSxPQVpBRixNQUFBN1AsS0FBQStQLEdBRUF6WCxLQUFBcVMsTUFBQTNLLEtBQUErUCxFQUFBcEYsT0FFQXJTLEtBQUE0NkIsSUFBQW5qQixFQUFBbWpCLElBRUE1NkIsS0FBQSt5QyxVQUFBdDdCLEVBQUFzN0IsVUFDQS95QyxLQUFBczVELFFBQUE3aEQsRUFBQTZoRCxRQUNBdDVELEtBQUF1NUQsU0FBQTloRCxFQUFBOGhELFNBRUF2NUQsS0FBQXV6QyxJQUFBOTdCLEVBQUE4N0IsSUFFQXZ6QyxJQUVBLEVDNUdBLE1BQUF3NUQsR0FBQSxJQUFBeDNDLEdBQ0F5M0MsR0FBQSxJQUFBejNDLEdBRUEwM0MsR0FBQSxJQUFBL3JDLEdBQ0Fnc0MsR0FBQSxJQUFBL3VDLEdBQ0FndkMsR0FBQSxJQUFBaHdDLEdBRUFpd0MsR0FBQSxJQUFBNzNDLEdBQ0E4M0MsR0FBQSxJQUFBOTNDLEdBc0JBLE1BQUErM0MsV0FBQTVrQyxHQVFBLFdBQUF2eUIsQ0FBQWdrQixFQUFBLElBQUF5d0IsR0FBQXRhLEVBQUEsSUFBQXE4QixJQUVBN2hELFFBU0F2WCxLQUFBdThCLFFBQUEsRUFFQXY4QixLQUFBSCxLQUFBLE9BT0FHLEtBQUE0bUIsU0FBQUEsRUFRQTVtQixLQUFBKzhCLFNBQUFBLEVBVUEvOEIsS0FBQW84QywyQkFBQXI4QyxFQVVBQyxLQUFBcThDLDJCQUFBdDhDLEVBRUFDLEtBQUFzOEMsb0JBRUEsQ0FFQSxJQUFBNTBDLENBQUErUCxFQUFBNmxCLEdBT0EsT0FMQS9sQixNQUFBN1AsS0FBQStQLEVBQUE2bEIsR0FFQXQ5QixLQUFBKzhCLFNBQUF6bUIsTUFBQUMsUUFBQWtCLEVBQUFzbEIsVUFBQXRsQixFQUFBc2xCLFNBQUFqOEIsUUFBQTJXLEVBQUFzbEIsU0FDQS84QixLQUFBNG1CLFNBQUFuUCxFQUFBbVAsU0FFQTVtQixJQUVBLENBU0Esb0JBQUFnNkQsR0FFQSxNQUFBcHpDLEVBQUE1bUIsS0FBQTRtQixTQUlBLEdBQUEsT0FBQUEsRUFBQXBtQixNQUFBLENBRUEsTUFBQXFtQixFQUFBRCxFQUFBNHdCLFdBQUFobUIsU0FDQXlvQyxFQUFBLENBQUEsR0FFQSxJQUFBLElBQUFsNUQsRUFBQSxFQUFBQyxFQUFBNmxCLEVBQUE5SyxNQUFBaGIsRUFBQUMsRUFBQUQsSUFFQXk0RCxHQUFBOXVELG9CQUFBbWMsRUFBQTlsQixFQUFBLEdBQ0EwNEQsR0FBQS91RCxvQkFBQW1jLEVBQUE5bEIsR0FFQWs1RCxFQUFBbDVELEdBQUFrNUQsRUFBQWw1RCxFQUFBLEdBQ0FrNUQsRUFBQWw1RCxJQUFBeTRELEdBQUE1dkQsV0FBQTZ2RCxJQUlBN3lDLEVBQUFxeEIsYUFBQSxlQUFBLElBQUFwQixHQUFBb2pCLEVBQUEsR0FFQSxNQUVBcnpELFFBQUFDLEtBQUEsaUdBSUEsT0FBQTdHLElBRUEsQ0FRQSxPQUFBNjRCLENBQUErakIsRUFBQUMsR0FFQSxNQUFBajJCLEVBQUE1bUIsS0FBQTRtQixTQUNBdkQsRUFBQXJqQixLQUFBcWpCLFlBQ0Fna0MsRUFBQXpLLEVBQUFzZCxPQUFBSCxLQUFBMVMsVUFDQXpQLEVBQUFoeEIsRUFBQWd4QixVQVVBLEdBTkEsT0FBQWh4QixFQUFBc1YsZ0JBQUF0VixFQUFBNnhCLHdCQUVBbWhCLEdBQUFseUQsS0FBQWtmLEVBQUFzVixnQkFDQTA5QixHQUFBamdELGFBQUEwSixHQUNBdTJDLEdBQUFyMUMsUUFBQThpQyxHQUVBLElBQUF6SyxFQUFBN3hCLElBQUFwRCxpQkFBQWl5QyxJQUFBLE9BSUFGLEdBQUFoeUQsS0FBQTJiLEdBQUFwVixTQUNBMHJELEdBQUFqeUQsS0FBQWsxQyxFQUFBN3hCLEtBQUFwUixhQUFBKy9DLElBRUEsTUFBQVMsRUFBQTlTLElBQUFybkQsS0FBQXFQLE1BQUE3TSxFQUFBeEMsS0FBQXFQLE1BQUE1TSxFQUFBekMsS0FBQXFQLE1BQUFpSyxHQUFBLEdBQ0E4Z0QsRUFBQUQsRUFBQUEsRUFFQTk1QyxFQUFBcmdCLEtBQUFxNkQsZUFBQSxFQUFBLEVBRUE3NUQsRUFBQW9tQixFQUFBcG1CLE1BRUFxbUIsRUFEQUQsRUFBQTR3QixXQUNBaG1CLFNBRUEsR0FBQSxPQUFBaHhCLEVBQUEsQ0FFQSxNQUFBaTFDLEVBQUFuMEMsS0FBQWEsSUFBQSxFQUFBeTFDLEVBQUFuQyxPQUNBMmEsRUFBQTl1RCxLQUFBWSxJQUFBMUIsRUFBQXViLE1BQUE2N0IsRUFBQW5DLE1BQUFtQyxFQUFBNzdCLE9BRUEsSUFBQSxJQUFBaGIsRUFBQTAwQyxFQUFBejBDLEVBQUFvdkQsRUFBQSxFQUFBcnZELEVBQUFDLEVBQUFELEdBQUFzZixFQUFBLENBRUEsTUFBQXhhLEVBQUFyRixFQUFBb0ssS0FBQTdKLEdBQ0ErRSxFQUFBdEYsRUFBQW9LLEtBQUE3SixFQUFBLEdBRUFpb0IsRUFBQXN4QyxHQUFBdDZELEtBQUE0OEMsRUFBQStjLEdBQUFTLEVBQUF2MEQsRUFBQUMsRUFBQS9FLEdBRUFpb0IsR0FFQTZ6QixFQUFBejhDLEtBQUE0b0IsRUFJQSxDQUVBLEdBQUFocEIsS0FBQXU2RCxXQUFBLENBRUEsTUFBQTEwRCxFQUFBckYsRUFBQW9LLEtBQUF3bEQsRUFBQSxHQUNBdHFELEVBQUF0RixFQUFBb0ssS0FBQTZxQyxHQUVBenNCLEVBQUFzeEMsR0FBQXQ2RCxLQUFBNDhDLEVBQUErYyxHQUFBUyxFQUFBdjBELEVBQUFDLEVBQUFzcUQsRUFBQSxHQUVBcG5DLEdBRUE2ekIsRUFBQXo4QyxLQUFBNG9CLEVBSUEsQ0FFQSxLQUFBLENBRUEsTUFBQXlzQixFQUFBbjBDLEtBQUFhLElBQUEsRUFBQXkxQyxFQUFBbkMsT0FDQTJhLEVBQUE5dUQsS0FBQVksSUFBQTJrQixFQUFBOUssTUFBQTY3QixFQUFBbkMsTUFBQW1DLEVBQUE3N0IsT0FFQSxJQUFBLElBQUFoYixFQUFBMDBDLEVBQUF6MEMsRUFBQW92RCxFQUFBLEVBQUFydkQsRUFBQUMsRUFBQUQsR0FBQXNmLEVBQUEsQ0FFQSxNQUFBMkksRUFBQXN4QyxHQUFBdDZELEtBQUE0OEMsRUFBQStjLEdBQUFTLEVBQUFyNUQsRUFBQUEsRUFBQSxFQUFBQSxHQUVBaW9CLEdBRUE2ekIsRUFBQXo4QyxLQUFBNG9CLEVBSUEsQ0FFQSxHQUFBaHBCLEtBQUF1NkQsV0FBQSxDQUVBLE1BQUF2eEMsRUFBQXN4QyxHQUFBdDZELEtBQUE0OEMsRUFBQStjLEdBQUFTLEVBQUFoSyxFQUFBLEVBQUEzYSxFQUFBMmEsRUFBQSxHQUVBcG5DLEdBRUE2ekIsRUFBQXo4QyxLQUFBNG9CLEVBSUEsQ0FFQSxDQUVBLENBTUEsa0JBQUFzekIsR0FFQSxNQUVBN0UsRUFGQXozQyxLQUFBNG1CLFNBRUE2d0IsZ0JBQ0F6K0IsRUFBQXpGLE9BQUF5RixLQUFBeStCLEdBRUEsR0FBQXorQixFQUFBL1gsT0FBQSxFQUFBLENBRUEsTUFBQTIzQyxFQUFBbkIsRUFBQXorQixFQUFBLElBRUEsUUFBQWpaLElBQUE2NEMsRUFBQSxDQUVBNTRDLEtBQUFxOEMsc0JBQUEsR0FDQXI4QyxLQUFBbzhDLHNCQUFBLENBQUEsRUFFQSxJQUFBLElBQUE5NUMsRUFBQSxFQUFBaTZDLEVBQUEzRCxFQUFBMzNDLE9BQUFxQixFQUFBaTZDLEVBQUFqNkMsSUFBQSxDQUVBLE1BQUE4TixFQUFBd29DLEVBQUF0MkMsR0FBQThOLE1BQUFvc0MsT0FBQWw2QyxHQUVBdEMsS0FBQXE4QyxzQkFBQWo4QyxLQUFBLEdBQ0FKLEtBQUFvOEMsc0JBQUFoc0MsR0FBQTlOLENBRUEsQ0FFQSxDQUVBLENBRUEsRUFJQSxTQUFBZzRELEdBQUF0MEMsRUFBQTQyQixFQUFBN3hCLEVBQUF5dkMsRUFBQTMwRCxFQUFBQyxFQUFBL0UsR0FFQSxNQUFBOGxCLEVBQUFiLEVBQUFZLFNBQUE0d0IsV0FBQWhtQixTQUVBZ29DLEdBQUE5dUQsb0JBQUFtYyxFQUFBaGhCLEdBQ0E0ekQsR0FBQS91RCxvQkFBQW1jLEVBQUEvZ0IsR0FJQSxHQUZBaWxCLEVBQUFPLG9CQUFBa3VDLEdBQUFDLEdBQUFJLEdBQUFDLElBRUFVLEVBQUEsT0FFQVgsR0FBQWxnRCxhQUFBcU0sRUFBQTNDLGFBRUEsTUFBQWlVLEVBQUFzbEIsRUFBQTd4QixJQUFBRixPQUFBamhCLFdBQUFpd0QsSUFFQSxPQUFBdmlDLEVBQUFzbEIsRUFBQW5xQixNQUFBNkUsRUFBQXNsQixFQUFBbHFCLFNBQUEsRUFFQSxDQUVBNEUsU0FBQUEsRUFHQS9RLE1BQUF1ekMsR0FBQXJ5RCxRQUFBa1MsYUFBQXFNLEVBQUEzQyxhQUNBN2lCLE1BQUFPLEVBQ0FzOEMsS0FBQSxLQUNBRCxVQUFBLEtBQ0E3ZCxVQUFBLEtBQ0F2WixPQUFBQSxFQUlBLENDalVBLE1BQUF5MEMsR0FBQSxJQUFBejRDLEdBQ0EwNEMsR0FBQSxJQUFBMTRDLEdBT0EsTUFBQTI0QyxXQUFBWixHQVFBLFdBQUFuM0QsQ0FBQWdrQixFQUFBbVcsR0FFQXhsQixNQUFBcVAsRUFBQW1XLEdBU0EvOEIsS0FBQXE2RCxnQkFBQSxFQUVBcjZELEtBQUFILEtBQUEsY0FFQSxDQUVBLG9CQUFBbTZELEdBRUEsTUFBQXB6QyxFQUFBNW1CLEtBQUE0bUIsU0FJQSxHQUFBLE9BQUFBLEVBQUFwbUIsTUFBQSxDQUVBLE1BQUFxbUIsRUFBQUQsRUFBQTR3QixXQUFBaG1CLFNBQ0F5b0MsRUFBQSxHQUVBLElBQUEsSUFBQWw1RCxFQUFBLEVBQUFDLEVBQUE2bEIsRUFBQTlLLE1BQUFoYixFQUFBQyxFQUFBRCxHQUFBLEVBRUEwNUQsR0FBQS92RCxvQkFBQW1jLEVBQUE5bEIsR0FDQTI1RCxHQUFBaHdELG9CQUFBbWMsRUFBQTlsQixFQUFBLEdBRUFrNUQsRUFBQWw1RCxHQUFBLElBQUFBLEVBQUEsRUFBQWs1RCxFQUFBbDVELEVBQUEsR0FDQWs1RCxFQUFBbDVELEVBQUEsR0FBQWs1RCxFQUFBbDVELEdBQUEwNUQsR0FBQTd3RCxXQUFBOHdELElBSUE5ekMsRUFBQXF4QixhQUFBLGVBQUEsSUFBQXBCLEdBQUFvakIsRUFBQSxHQUVBLE1BRUFyekQsUUFBQUMsS0FBQSx5R0FJQSxPQUFBN0csSUFFQSxFQzNEQSxNQUFBNDZELFdBQUFiLEdBUUEsV0FBQW4zRCxDQUFBZ2tCLEVBQUFtVyxHQUVBeGxCLE1BQUFxUCxFQUFBbVcsR0FTQS84QixLQUFBdTZELFlBQUEsRUFFQXY2RCxLQUFBSCxLQUFBLFVBRUEsRUNKQSxNQUFBZzdELFdBQUExdUIsR0FXQSxXQUFBdnBDLENBQUE2NUIsR0FFQWxsQixRQVNBdlgsS0FBQTg2RCxrQkFBQSxFQUVBOTZELEtBQUFILEtBQUEsaUJBUUFHLEtBQUFxUyxNQUFBLElBQUF5M0IsR0FBQSxVQVVBOXBDLEtBQUE0NkIsSUFBQSxLQWVBNTZCLEtBQUE4d0MsU0FBQSxLQVVBOXdDLEtBQUE2bEIsS0FBQSxFQVFBN2xCLEtBQUE4eUMsaUJBQUEsRUFRQTl5QyxLQUFBdXpDLEtBQUEsRUFFQXZ6QyxLQUFBaXZDLFVBQUF4UyxFQUVBLENBRUEsSUFBQS8wQixDQUFBK1AsR0FlQSxPQWJBRixNQUFBN1AsS0FBQStQLEdBRUF6WCxLQUFBcVMsTUFBQTNLLEtBQUErUCxFQUFBcEYsT0FFQXJTLEtBQUE0NkIsSUFBQW5qQixFQUFBbWpCLElBRUE1NkIsS0FBQTh3QyxTQUFBcjVCLEVBQUFxNUIsU0FFQTl3QyxLQUFBNmxCLEtBQUFwTyxFQUFBb08sS0FDQTdsQixLQUFBOHlDLGdCQUFBcjdCLEVBQUFxN0IsZ0JBRUE5eUMsS0FBQXV6QyxJQUFBOTdCLEVBQUE4N0IsSUFFQXZ6QyxJQUVBLEVDOUhBLE1BQUErNkQsR0FBQSxJQUFBcHRDLEdBQ0FxdEMsR0FBQSxJQUFBcHdDLEdBQ0Fxd0MsR0FBQSxJQUFBcnhDLEdBQ0FzeEMsR0FBQSxJQUFBbDVDLEdBT0EsTUFBQW01QyxXQUFBaG1DLEdBUUEsV0FBQXZ5QixDQUFBZ2tCLEVBQUEsSUFBQXl3QixHQUFBdGEsRUFBQSxJQUFBODlCLElBRUF0akQsUUFTQXZYLEtBQUF3OEIsVUFBQSxFQUVBeDhCLEtBQUFILEtBQUEsU0FPQUcsS0FBQTRtQixTQUFBQSxFQVFBNW1CLEtBQUErOEIsU0FBQUEsRUFVQS84QixLQUFBbzhDLDJCQUFBcjhDLEVBVUFDLEtBQUFxOEMsMkJBQUF0OEMsRUFFQUMsS0FBQXM4QyxvQkFFQSxDQUVBLElBQUE1MEMsQ0FBQStQLEVBQUE2bEIsR0FPQSxPQUxBL2xCLE1BQUE3UCxLQUFBK1AsRUFBQTZsQixHQUVBdDlCLEtBQUErOEIsU0FBQXptQixNQUFBQyxRQUFBa0IsRUFBQXNsQixVQUFBdGxCLEVBQUFzbEIsU0FBQWo4QixRQUFBMlcsRUFBQXNsQixTQUNBLzhCLEtBQUE0bUIsU0FBQW5QLEVBQUFtUCxTQUVBNW1CLElBRUEsQ0FRQSxPQUFBNjRCLENBQUErakIsRUFBQUMsR0FFQSxNQUFBajJCLEVBQUE1bUIsS0FBQTRtQixTQUNBdkQsRUFBQXJqQixLQUFBcWpCLFlBQ0Fna0MsRUFBQXpLLEVBQUFzZCxPQUFBaUIsT0FBQTlULFVBQ0F6UCxFQUFBaHhCLEVBQUFneEIsVUFVQSxHQU5BLE9BQUFoeEIsRUFBQXNWLGdCQUFBdFYsRUFBQTZ4Qix3QkFFQXdpQixHQUFBdnpELEtBQUFrZixFQUFBc1YsZ0JBQ0ErK0IsR0FBQXRoRCxhQUFBMEosR0FDQTQzQyxHQUFBMTJDLFFBQUE4aUMsR0FFQSxJQUFBekssRUFBQTd4QixJQUFBcEQsaUJBQUFzekMsSUFBQSxPQUlBRixHQUFBcnpELEtBQUEyYixHQUFBcFYsU0FDQStzRCxHQUFBdHpELEtBQUFrMUMsRUFBQTd4QixLQUFBcFIsYUFBQW9oRCxJQUVBLE1BQUFaLEVBQUE5UyxJQUFBcm5ELEtBQUFxUCxNQUFBN00sRUFBQXhDLEtBQUFxUCxNQUFBNU0sRUFBQXpDLEtBQUFxUCxNQUFBaUssR0FBQSxHQUNBOGdELEVBQUFELEVBQUFBLEVBRUEzNUQsRUFBQW9tQixFQUFBcG1CLE1BRUFxbUIsRUFEQUQsRUFBQTR3QixXQUNBaG1CLFNBRUEsR0FBQSxPQUFBaHhCLEVBQUEsQ0FLQSxJQUFBLElBQUFPLEVBSEFPLEtBQUFhLElBQUEsRUFBQXkxQyxFQUFBbkMsT0FHQXI1QixFQUZBOWEsS0FBQVksSUFBQTFCLEVBQUF1YixNQUFBNjdCLEVBQUFuQyxNQUFBbUMsRUFBQTc3QixPQUVBaGIsRUFBQXFiLEVBQUFyYixJQUFBLENBRUEsTUFBQThFLEVBQUFyRixFQUFBb0ssS0FBQTdKLEdBRUFtNkQsR0FBQXh3RCxvQkFBQW1jLEVBQUFoaEIsR0FFQXUxRCxHQUFBRixHQUFBcjFELEVBQUF1MEQsRUFBQS8yQyxFQUFBdTVCLEVBQUFDLEVBQUE3OEMsS0FFQSxDQUVBLEtBQUEsQ0FLQSxJQUFBLElBQUFlLEVBSEFPLEtBQUFhLElBQUEsRUFBQXkxQyxFQUFBbkMsT0FHQXowQyxFQUZBTSxLQUFBWSxJQUFBMmtCLEVBQUE5SyxNQUFBNjdCLEVBQUFuQyxNQUFBbUMsRUFBQTc3QixPQUVBaGIsRUFBQUMsRUFBQUQsSUFFQW02RCxHQUFBeHdELG9CQUFBbWMsRUFBQTlsQixHQUVBcTZELEdBQUFGLEdBQUFuNkQsRUFBQXE1RCxFQUFBLzJDLEVBQUF1NUIsRUFBQUMsRUFBQTc4QyxLQUlBLENBRUEsQ0FNQSxrQkFBQXM4QyxHQUVBLE1BRUE3RSxFQUZBejNDLEtBQUE0bUIsU0FFQTZ3QixnQkFDQXorQixFQUFBekYsT0FBQXlGLEtBQUF5K0IsR0FFQSxHQUFBeitCLEVBQUEvWCxPQUFBLEVBQUEsQ0FFQSxNQUFBMjNDLEVBQUFuQixFQUFBeitCLEVBQUEsSUFFQSxRQUFBalosSUFBQTY0QyxFQUFBLENBRUE1NEMsS0FBQXE4QyxzQkFBQSxHQUNBcjhDLEtBQUFvOEMsc0JBQUEsQ0FBQSxFQUVBLElBQUEsSUFBQTk1QyxFQUFBLEVBQUFpNkMsRUFBQTNELEVBQUEzM0MsT0FBQXFCLEVBQUFpNkMsRUFBQWo2QyxJQUFBLENBRUEsTUFBQThOLEVBQUF3b0MsRUFBQXQyQyxHQUFBOE4sTUFBQW9zQyxPQUFBbDZDLEdBRUF0QyxLQUFBcThDLHNCQUFBajhDLEtBQUEsR0FDQUosS0FBQW84QyxzQkFBQWhzQyxHQUFBOU4sQ0FFQSxDQUVBLENBRUEsQ0FFQSxFQUlBLFNBQUE4NEQsR0FBQTcwQyxFQUFBL2xCLEVBQUE0NUQsRUFBQS8yQyxFQUFBdTVCLEVBQUFDLEVBQUE3MkIsR0FFQSxNQUFBcTFDLEVBQUFMLEdBQUEzdkMsa0JBQUE5RSxHQUVBLEdBQUE4MEMsRUFBQWpCLEVBQUEsQ0FFQSxNQUFBa0IsRUFBQSxJQUFBdDVDLEdBRUFnNUMsR0FBQTd2QyxvQkFBQTVFLEVBQUErMEMsR0FDQUEsRUFBQTNoRCxhQUFBMEosR0FFQSxNQUFBaVUsRUFBQXNsQixFQUFBN3hCLElBQUFGLE9BQUFqaEIsV0FBQTB4RCxHQUVBLEdBQUFoa0MsRUFBQXNsQixFQUFBbnFCLE1BQUE2RSxFQUFBc2xCLEVBQUFscUIsSUFBQSxPQUVBbXFCLEVBQUF6OEMsS0FBQSxDQUVBazNCLFNBQUFBLEVBQ0Fpa0MsY0FBQWo2RCxLQUFBOEgsS0FBQWl5RCxHQUNBOTBDLE1BQUErMEMsRUFDQTk2RCxNQUFBQSxFQUNBNjhDLEtBQUEsS0FDQUQsVUFBQSxLQUNBN2QsVUFBQSxLQUNBdlosT0FBQUEsR0FJQSxDQUVBLENDaE5BLE1BQUF3MUMsV0FBQTVrRCxHQWVBLFdBQUFoVSxDQUFBNjRELEVBQUEza0QsRUFBQUUsRUFBQUMsRUFBQUMsRUFBQXRmLEtBQUF1ZixFQUFBdmYsS0FBQXdmLEVBQUF2WCxFQUFBd1gsR0FFQUUsTUFBQWtrRCxFQUFBM2tELEVBQUFFLEVBQUFDLEVBQUFDLEVBQUFDLEVBQUFDLEVBQUF2WCxFQUFBd1gsR0FTQXJYLEtBQUEwN0QsZ0JBQUEsRUFVQTE3RCxLQUFBK1gsaUJBQUEsRUFFQSxNQUFBNGxDLEVBQUEzOUMsS0FTQSw4QkFBQXk3RCxHQUVBQSxFQUFBRSwyQkFUQSxTQUFBQyxJQUVBamUsRUFBQTVuQyxhQUFBLEVBQ0EwbEQsRUFBQUUsMEJBQUFDLEVBRUEsR0FRQSxDQUVBLEtBQUFuMEQsR0FFQSxPQUFBLElBQUF6SCxLQUFBNEMsWUFBQTVDLEtBQUF3VSxPQUFBOU0sS0FBQTFILEtBRUEsQ0FRQSxNQUFBc2YsR0FFQSxNQUFBbThDLEVBQUF6N0QsS0FBQXdVLE9BR0EsSUFGQSw4QkFBQWluRCxHQUVBQSxFQUFBSSxZQUFBSixFQUFBSyxvQkFFQTk3RCxLQUFBK1YsYUFBQSxFQUlBLEVDaEZBLE1BQUFnbUQsV0FBQVAsR0FjQSxXQUFBNTRELENBQUFrVSxFQUFBRSxFQUFBQyxFQUFBQyxFQUFBQyxFQUFBQyxFQUFBdlgsRUFBQXdYLEdBRUFFLE1BQUEsQ0FBQSxFQUFBVCxFQUFBRSxFQUFBQyxFQUFBQyxFQUFBQyxFQUFBQyxFQUFBdlgsRUFBQXdYLEdBU0FyWCxLQUFBZzhELHFCQUFBLENBRUEsQ0FNQSxNQUFBMThDLEdBQUEsQ0FFQSxLQUFBN1gsR0FFQSxPQUFBLElBQUF6SCxLQUFBNEMsYUFBQThFLEtBQUExSCxLQUVBLENBUUEsUUFBQWk4RCxDQUFBN1YsR0FFQXBtRCxLQUFBd1UsTUFBQTR4QyxFQUNBcG1ELEtBQUErVixhQUFBLENBRUEsRUN4Q0EsTUFBQW1tRCxXQUFBdGxELEdBUUEsV0FBQWhVLENBQUFxRSxFQUFBQyxHQUVBcVEsTUFBQSxDQUFBdFEsUUFBQUMsV0FTQWxILEtBQUFtOEQsc0JBQUEsRUFVQW44RCxLQUFBa1gsVUFBQTNmLEdBVUF5SSxLQUFBbVgsVUFBQTVmLEdBVUF5SSxLQUFBK1gsaUJBQUEsRUFFQS9YLEtBQUErVixhQUFBLENBRUEsRUN2RUEsTUFBQXFtRCxXQUFBeGxELEdBbUJBLFdBQUFoVSxDQUFBOFUsRUFBQXpRLEVBQUFDLEVBQUFrUSxFQUFBdlgsRUFBQWlYLEVBQUFFLEVBQUFDLEVBQUFDLEVBQUFDLEVBQUFFLEVBQUFwRSxHQUVBc0UsTUFBQSxLQUFBVCxFQUFBRSxFQUFBQyxFQUFBQyxFQUFBQyxFQUFBQyxFQUFBdlgsRUFBQXdYLEVBQUFwRSxHQVNBalQsS0FBQXE4RCxxQkFBQSxFQU9BcjhELEtBQUF3VSxNQUFBLENBQUF2TixNQUFBQSxFQUFBQyxPQUFBQSxHQU9BbEgsS0FBQTBYLFFBQUFBLEVBYUExWCxLQUFBaVksT0FBQSxFQWFBalksS0FBQStYLGlCQUFBLENBRUEsRUN2RUEsTUFBQXVrRCxXQUFBRixHQWFBLFdBQUF4NUQsQ0FBQThVLEVBQUF6USxFQUFBQyxFQUFBbVUsRUFBQWpFLEVBQUF2WCxHQUVBMFgsTUFBQUcsRUFBQXpRLEVBQUFDLEVBQUFrUSxFQUFBdlgsR0FTQUcsS0FBQXU4RCwwQkFBQSxFQVFBdjhELEtBQUF3VSxNQUFBNkcsTUFBQUEsRUFTQXJiLEtBQUF5YyxNQUFBcGxCLEdBT0EySSxLQUFBMGMsYUFBQSxJQUFBQyxHQUVBLENBV0EsY0FBQUMsQ0FBQUMsR0FFQTdjLEtBQUEwYyxhQUFBOVUsSUFBQWlWLEVBRUEsQ0FLQSxpQkFBQUMsR0FFQTljLEtBQUEwYyxhQUFBSyxPQUVBLEVDMUVBLE1BQUF5L0MsV0FBQUosR0FTQSxXQUFBeDVELENBQUF1VCxFQUFBaUIsRUFBQXZYLEdBRUEwWCxXQUFBeFgsRUFBQW9XLEVBQUEsR0FBQWxQLE1BQUFrUCxFQUFBLEdBQUFqUCxPQUFBa1EsRUFBQXZYLEVBQUE5SSxJQVNBaUosS0FBQXk4RCx5QkFBQSxFQVNBejhELEtBQUFva0QsZUFBQSxFQUVBcGtELEtBQUF3VSxNQUFBMkIsQ0FFQSxFQ2pDQSxNQUFBdW1ELFdBQUE5bEQsR0FlQSxXQUFBaFUsQ0FBQTJOLEVBQUF1RyxFQUFBRSxFQUFBQyxFQUFBQyxFQUFBQyxFQUFBQyxFQUFBdlgsRUFBQXdYLEdBRUFFLE1BQUFoSCxFQUFBdUcsRUFBQUUsRUFBQUMsRUFBQUMsRUFBQUMsRUFBQUMsRUFBQXZYLEVBQUF3WCxHQVNBclgsS0FBQTI4RCxpQkFBQSxFQUVBMzhELEtBQUErVixhQUFBLENBRUEsRUM5QkEsTUFBQTZtRCxXQUFBaG1ELEdBZ0JBLFdBQUFoVSxDQUFBcUUsRUFBQUMsRUFBQXJILEVBQUF2SCxLQUFBd2UsRUFBQUUsRUFBQUMsRUFBQUMsRUFBQTNmLEtBQUE0ZixFQUFBNWYsS0FBQThmLEVBQUFELEVBQUFsZSxNQUVBLEdBQUFrZSxJQUFBbGUsSTVFaXZCWSxPNEVqdkJaa2UsRUFFQSxNQUFBLElBQUFoVSxNQUFBLG9GQUlBbVUsTUFBQSxLQUFBVCxFQUFBRSxFQUFBQyxFQUFBQyxFQUFBQyxFQUFBQyxFQUFBdlgsRUFBQXdYLEdBU0FyWCxLQUFBNjhELGdCQUFBLEVBT0E3OEQsS0FBQXdVLE1BQUEsQ0FBQXZOLE1BQUFBLEVBQUFDLE9BQUFBLEdBV0FsSCxLQUFBaVksT0FBQSxFQVVBalksS0FBQStYLGlCQUFBLEVBUUEvWCxLQUFBODhELGdCQUFBLElBRUEsQ0FHQSxJQUFBcDFELENBQUErUCxHQU9BLE9BTEFGLE1BQUE3UCxLQUFBK1AsR0FFQXpYLEtBQUF5WCxPQUFBLElBQUFoQyxHQUFBbEMsT0FBQUMsT0FBQSxDQUFBLEVBQUFpRSxFQUFBakQsUUFDQXhVLEtBQUE4OEQsZ0JBQUFybEQsRUFBQXFsRCxnQkFFQTk4RCxJQUVBLENBRUEsTUFBQWdXLENBQUFDLEdBRUEsTUFBQVYsRUFBQWdDLE1BQUF2QixPQUFBQyxHQUlBLE9BRkEsT0FBQWpXLEtBQUE4OEQsa0JBQUF2bkQsRUFBQXVuRCxnQkFBQTk4RCxLQUFBODhELGlCQUVBdm5ELENBRUEsRUM1RkEsTUFBQXduRCxHQUtBLFdBQUFuNkQsR0FTQTVDLEtBQUFILEtBQUEsUUFXQUcsS0FBQWc5RCxtQkFBQSxJQVFBaDlELEtBQUErVixhQUFBLEVBU0EvVixLQUFBaTlELGdCQUFBLElBRUEsQ0FXQSxRQUFBQyxHQUVBdDJELFFBQUFDLEtBQUEsNENBRUEsQ0FXQSxVQUFBczJELENBQUFsNEMsRUFBQW00QyxHQUVBLE1BQUExNkQsRUFBQTFDLEtBQUFxOUQsZUFBQXA0QyxHQUNBLE9BQUFqbEIsS0FBQWs5RCxTQUFBeDZELEVBQUEwNkQsRUFFQSxDQVNBLFNBQUFFLENBQUFDLEVBQUEsR0FFQSxNQUFBNTNDLEVBQUEsR0FFQSxJQUFBLElBQUE5WCxFQUFBLEVBQUFBLEdBQUEwdkQsRUFBQTF2RCxJQUVBOFgsRUFBQXZsQixLQUFBSixLQUFBazlELFNBQUFydkQsRUFBQTB2RCxJQUlBLE9BQUE1M0MsQ0FFQSxDQVlBLGVBQUE2M0MsQ0FBQUQsRUFBQSxHQUVBLE1BQUE1M0MsRUFBQSxHQUVBLElBQUEsSUFBQTlYLEVBQUEsRUFBQUEsR0FBQTB2RCxFQUFBMXZELElBRUE4WCxFQUFBdmxCLEtBQUFKLEtBQUFtOUQsV0FBQXR2RCxFQUFBMHZELElBSUEsT0FBQTUzQyxDQUVBLENBT0EsU0FBQTgzQyxHQUVBLE1BQUFDLEVBQUExOUQsS0FBQTI5RCxhQUNBLE9BQUFELEVBQUFBLEVBQUF6OEQsT0FBQSxFQUVBLENBUUEsVUFBQTA4RCxDQUFBSixFQUFBdjlELEtBQUFnOUQsb0JBRUEsR0FBQWg5RCxLQUFBaTlELGlCQUNBajlELEtBQUFpOUQsZ0JBQUFoOEQsU0FBQXM4RCxFQUFBLElBQ0F2OUQsS0FBQStWLFlBRUEsT0FBQS9WLEtBQUFpOUQsZ0JBSUFqOUQsS0FBQStWLGFBQUEsRUFFQSxNQUFBb25CLEVBQUEsR0FDQSxJQUFBamhCLEVBQUEwaEQsRUFBQTU5RCxLQUFBazlELFNBQUEsR0FDQVcsRUFBQSxFQUVBMWdDLEVBQUEvOEIsS0FBQSxHQUVBLElBQUEsSUFBQXl5QixFQUFBLEVBQUFBLEdBQUEwcUMsRUFBQTFxQyxJQUVBM1csRUFBQWxjLEtBQUFrOUQsU0FBQXJxQyxFQUFBMHFDLEdBQ0FNLEdBQUEzaEQsRUFBQXRTLFdBQUFnMEQsR0FDQXpnQyxFQUFBLzhCLEtBQUF5OUQsR0FDQUQsRUFBQTFoRCxFQU1BLE9BRkFsYyxLQUFBaTlELGdCQUFBOS9CLEVBRUFBLENBRUEsQ0FRQSxnQkFBQTJnQyxHQUVBOTlELEtBQUErVixhQUFBLEVBQ0EvVixLQUFBMjlELFlBRUEsQ0FXQSxjQUFBTixDQUFBcDRDLEVBQUFxUyxFQUFBLE1BRUEsTUFBQXltQyxFQUFBLzlELEtBQUEyOUQsYUFFQSxJQUFBNThELEVBQUEsRUFDQSxNQUFBcWIsRUFBQTJoRCxFQUFBOThELE9BRUEsSUFBQSs4RCxFQUlBQSxFQUZBMW1DLEdBTUFyUyxFQUFBODRDLEVBQUEzaEQsRUFBQSxHQU1BLElBQUE2aEQsRUFBQTE1RCxFQUFBLEVBQUFDLEVBQUE0WCxFQUFBLEVBRUEsS0FBQTdYLEdBQUFDLEdBTUEsR0FKQXpELEVBQUFPLEtBQUFtRCxNQUFBRixHQUFBQyxFQUFBRCxHQUFBLEdBRUEwNUQsRUFBQUYsRUFBQWg5RCxHQUFBaTlELEVBRUFDLEVBQUEsRUFFQTE1RCxFQUFBeEQsRUFBQSxNQUVBLE1BQUFrOUQsRUFBQSxHQUlBLENBRUF6NUQsRUFBQXpELEVBQ0EsS0FJQSxDQVRBeUQsRUFBQXpELEVBQUEsQ0FTQSxDQU1BLEdBRkFBLEVBQUF5RCxFQUVBdTVELEVBQUFoOUQsS0FBQWk5RCxFQUVBLE9BQUFqOUQsR0FBQXFiLEVBQUEsR0FNQSxNQUFBOGhELEVBQUFILEVBQUFoOUQsR0FhQSxPQUZBQSxHQUpBaTlELEVBQUFFLElBTkFILEVBQUFoOUQsRUFBQSxHQUVBbTlELEtBUUE5aEQsRUFBQSxFQUlBLENBWUEsVUFBQStoRCxDQUFBejdELEVBQUEwNkQsR0FFQSxNQUFBaHpDLEVBQUEsS0FDQSxJQUFBaUMsRUFBQTNwQixFQUFBMG5CLEVBQ0FnMEMsRUFBQTE3RCxFQUFBMG5CLEVBSUFpQyxFQUFBLElBQUFBLEVBQUEsR0FDQSt4QyxFQUFBLElBQUFBLEVBQUEsR0FFQSxNQUFBQyxFQUFBcitELEtBQUFrOUQsU0FBQTd3QyxHQUNBaXlDLEVBQUF0K0QsS0FBQWs5RCxTQUFBa0IsR0FFQTVsQixFQUFBNGtCLElBQUFpQixFQUFBLFVBQUEsSUFBQXYzRCxHQUFBLElBQUFrYixJQUlBLE9BRkF3MkIsRUFBQTl3QyxLQUFBNDJELEdBQUF0MkQsSUFBQXEyRCxHQUFBaDdELFlBRUFtMUMsQ0FFQSxDQVVBLFlBQUErbEIsQ0FBQXQ1QyxFQUFBbTRDLEdBRUEsTUFBQTE2RCxFQUFBMUMsS0FBQXE5RCxlQUFBcDRDLEdBQ0EsT0FBQWpsQixLQUFBbStELFdBQUF6N0QsRUFBQTA2RCxFQUVBLENBVUEsbUJBQUFvQixDQUFBQyxFQUFBQyxHQUFBLEdBSUEsTUFBQXY2QyxFQUFBLElBQUFuQyxHQUVBMjhDLEVBQUEsR0FDQS9qQixFQUFBLEdBQ0Fna0IsRUFBQSxHQUVBQyxFQUFBLElBQUE3OEMsR0FDQTg4QyxFQUFBLElBQUFueEMsR0FJQSxJQUFBLElBQUE1c0IsRUFBQSxFQUFBQSxHQUFBMDlELEVBQUExOUQsSUFBQSxDQUVBLE1BQUFra0IsRUFBQWxrQixFQUFBMDlELEVBRUFFLEVBQUE1OUQsR0FBQWYsS0FBQXUrRCxhQUFBdDVDLEVBQUEsSUFBQWpELEdBRUEsQ0FLQTQ0QixFQUFBLEdBQUEsSUFBQTU0QixHQUNBNDhDLEVBQUEsR0FBQSxJQUFBNThDLEdBQ0EsSUFBQTlmLEVBQUEyYyxPQUFBa2dELFVBQ0EsTUFBQWp3RCxFQUFBeE4sS0FBQTZDLElBQUF3NkQsRUFBQSxHQUFBbjhELEdBQ0F1TSxFQUFBek4sS0FBQTZDLElBQUF3NkQsRUFBQSxHQUFBbDhELEdBQ0FzZ0IsRUFBQXpoQixLQUFBNkMsSUFBQXc2RCxFQUFBLEdBQUFybEQsR0FFQXhLLEdBQUE1TSxJQUVBQSxFQUFBNE0sRUFDQXFWLEVBQUF4ZCxJQUFBLEVBQUEsRUFBQSxJQUlBb0ksR0FBQTdNLElBRUFBLEVBQUE2TSxFQUNBb1YsRUFBQXhkLElBQUEsRUFBQSxFQUFBLElBSUFvYyxHQUFBN2dCLEdBRUFpaUIsRUFBQXhkLElBQUEsRUFBQSxFQUFBLEdBSUFrNEQsRUFBQXQ3QyxhQUFBbzdDLEVBQUEsR0FBQXg2QyxHQUFBOWdCLFlBRUF1M0MsRUFBQSxHQUFBcjNCLGFBQUFvN0MsRUFBQSxHQUFBRSxHQUNBRCxFQUFBLEdBQUFyN0MsYUFBQW83QyxFQUFBLEdBQUEvakIsRUFBQSxJQUtBLElBQUEsSUFBQTc1QyxFQUFBLEVBQUFBLEdBQUEwOUQsRUFBQTE5RCxJQUFBLENBUUEsR0FOQTY1QyxFQUFBNzVDLEdBQUE2NUMsRUFBQTc1QyxFQUFBLEdBQUEwRyxRQUVBbTNELEVBQUE3OUQsR0FBQTY5RCxFQUFBNzlELEVBQUEsR0FBQTBHLFFBRUFvM0QsRUFBQXQ3QyxhQUFBbzdDLEVBQUE1OUQsRUFBQSxHQUFBNDlELEVBQUE1OUQsSUFFQTg5RCxFQUFBNTlELFNBQUE0ZCxPQUFBQyxRQUFBLENBRUErL0MsRUFBQXg3RCxZQUVBLE1BQUFxRyxFQUFBcEksS0FBQXFJLEtBQUEzSCxHQUFBMjhELEVBQUE1OUQsRUFBQSxHQUFBa0ksSUFBQTAxRCxFQUFBNTlELEtBQUEsRUFBQSxJQUVBNjVDLEVBQUE3NUMsR0FBQTRZLGFBQUFtbEQsRUFBQTN0QyxpQkFBQTB0QyxFQUFBbjFELEdBRUEsQ0FFQWsxRCxFQUFBNzlELEdBQUF3aUIsYUFBQW83QyxFQUFBNTlELEdBQUE2NUMsRUFBQTc1QyxHQUVBLENBSUEsSUFBQSxJQUFBMjlELEVBQUEsQ0FFQSxJQUFBaDFELEVBQUFwSSxLQUFBcUksS0FBQTNILEdBQUE0NEMsRUFBQSxHQUFBM3hDLElBQUEyeEMsRUFBQTZqQixLQUFBLEVBQUEsSUFDQS8wRCxHQUFBKzBELEVBRUFFLEVBQUEsR0FBQTExRCxJQUFBNDFELEVBQUF0N0MsYUFBQXEzQixFQUFBLEdBQUFBLEVBQUE2akIsS0FBQSxJQUVBLzBELEdBQUFBLEdBSUEsSUFBQSxJQUFBM0ksRUFBQSxFQUFBQSxHQUFBMDlELEVBQUExOUQsSUFHQTY1QyxFQUFBNzVDLEdBQUE0WSxhQUFBbWxELEVBQUEzdEMsaUJBQUF3dEMsRUFBQTU5RCxHQUFBMkksRUFBQTNJLElBQ0E2OUQsRUFBQTc5RCxHQUFBd2lCLGFBQUFvN0MsRUFBQTU5RCxHQUFBNjVDLEVBQUE3NUMsR0FJQSxDQUVBLE1BQUEsQ0FDQTQ5RCxTQUFBQSxFQUNBL2pCLFFBQUFBLEVBQ0Fna0IsVUFBQUEsRUFHQSxDQU9BLEtBQUFuM0QsR0FFQSxPQUFBLElBQUF6SCxLQUFBNEMsYUFBQThFLEtBQUExSCxLQUVBLENBUUEsSUFBQTBILENBQUErUCxHQUlBLE9BRkF6WCxLQUFBZzlELG1CQUFBdmxELEVBQUF1bEQsbUJBRUFoOUQsSUFFQSxDQVFBLE1BQUFnVyxHQUVBLE1BQUFULEVBQUEsQ0FDQXNELFNBQUEsQ0FDQS9DLFFBQUEsSUFDQWpXLEtBQUEsUUFDQWlaLFVBQUEsaUJBT0EsT0FIQXZELEVBQUF5bkQsbUJBQUFoOUQsS0FBQWc5RCxtQkFDQXpuRCxFQUFBMVYsS0FBQUcsS0FBQUgsS0FFQTBWLENBRUEsQ0FRQSxRQUFBeXBDLENBQUEwTyxHQUlBLE9BRkExdEQsS0FBQWc5RCxtQkFBQXRQLEVBQUFzUCxtQkFFQWg5RCxJQUVBLEVDcGVBLE1BQUFnL0QsV0FBQWpDLEdBY0EsV0FBQW42RCxDQUFBcThELEVBQUEsRUFBQUMsRUFBQSxFQUFBQyxFQUFBLEVBQUFDLEVBQUEsRUFBQUMsRUFBQSxFQUFBQyxFQUFBLEVBQUFoK0QsS0FBQUMsR0FBQWcrRCxHQUFBLEVBQUFDLEVBQUEsR0FFQWpvRCxRQVNBdlgsS0FBQXkvRCxnQkFBQSxFQUVBei9ELEtBQUFILEtBQUEsZUFRQUcsS0FBQWkvRCxHQUFBQSxFQVFBai9ELEtBQUFrL0QsR0FBQUEsRUFTQWwvRCxLQUFBbS9ELFFBQUFBLEVBU0FuL0QsS0FBQW8vRCxRQUFBQSxFQVFBcC9ELEtBQUFxL0QsWUFBQUEsRUFRQXIvRCxLQUFBcy9ELFVBQUFBLEVBUUF0L0QsS0FBQXUvRCxXQUFBQSxFQVFBdi9ELEtBQUF3L0QsVUFBQUEsQ0FFQSxDQVNBLFFBQUF0QyxDQUFBeDZELEVBQUEwNkQsRUFBQSxJQUFBdDJELElBRUEsTUFBQXlmLEVBQUE2MkMsRUFFQXNDLEVBQUEsRUFBQXArRCxLQUFBQyxHQUNBLElBQUFvK0QsRUFBQTMvRCxLQUFBcy9ELFVBQUF0L0QsS0FBQXEvRCxZQUNBLE1BQUFPLEVBQUF0K0QsS0FBQTZDLElBQUF3N0QsR0FBQTlnRCxPQUFBQyxRQUdBLEtBQUE2Z0QsRUFBQSxHQUFBQSxHQUFBRCxFQUNBLEtBQUFDLEVBQUFELEdBQUFDLEdBQUFELEVBRUFDLEVBQUE5Z0QsT0FBQUMsVUFJQTZnRCxFQUZBQyxFQUVBLEVBSUFGLElBTUEsSUFBQTEvRCxLQUFBdS9ELFlBQUFLLElBRUFELElBQUFELEVBRUFDLEdBQUFELEVBSUFDLEdBQUFELEdBTUEsTUFBQXAyRCxFQUFBdEosS0FBQXEvRCxZQUFBMzhELEVBQUFpOUQsRUFDQSxJQUFBbjlELEVBQUF4QyxLQUFBaS9ELEdBQUFqL0QsS0FBQW0vRCxRQUFBNzlELEtBQUEyRSxJQUFBcUQsR0FDQTdHLEVBQUF6QyxLQUFBay9ELEdBQUFsL0QsS0FBQW8vRCxRQUFBOTlELEtBQUE0RSxJQUFBb0QsR0FFQSxHQUFBLElBQUF0SixLQUFBdy9ELFVBQUEsQ0FFQSxNQUFBdjVELEVBQUEzRSxLQUFBMkUsSUFBQWpHLEtBQUF3L0QsV0FDQXQ1RCxFQUFBNUUsS0FBQTRFLElBQUFsRyxLQUFBdy9ELFdBRUExd0QsRUFBQXRNLEVBQUF4QyxLQUFBaS9ELEdBQ0Fsd0QsRUFBQXRNLEVBQUF6QyxLQUFBay9ELEdBR0ExOEQsRUFBQXNNLEVBQUE3SSxFQUFBOEksRUFBQTdJLEVBQUFsRyxLQUFBaS9ELEdBQ0F4OEQsRUFBQXFNLEVBQUE1SSxFQUFBNkksRUFBQTlJLEVBQUFqRyxLQUFBay9ELEVBRUEsQ0FFQSxPQUFBMzRDLEVBQUE1ZixJQUFBbkUsRUFBQUMsRUFFQSxDQUVBLElBQUFpRixDQUFBK1AsR0FpQkEsT0FmQUYsTUFBQTdQLEtBQUErUCxHQUVBelgsS0FBQWkvRCxHQUFBeG5ELEVBQUF3bkQsR0FDQWovRCxLQUFBay9ELEdBQUF6bkQsRUFBQXluRCxHQUVBbC9ELEtBQUFtL0QsUUFBQTFuRCxFQUFBMG5ELFFBQ0FuL0QsS0FBQW8vRCxRQUFBM25ELEVBQUEybkQsUUFFQXAvRCxLQUFBcS9ELFlBQUE1bkQsRUFBQTRuRCxZQUNBci9ELEtBQUFzL0QsVUFBQTduRCxFQUFBNm5ELFVBRUF0L0QsS0FBQXUvRCxXQUFBOW5ELEVBQUE4bkQsV0FFQXYvRCxLQUFBdy9ELFVBQUEvbkQsRUFBQStuRCxVQUVBeC9ELElBRUEsQ0FFQSxNQUFBZ1csR0FFQSxNQUFBVCxFQUFBZ0MsTUFBQXZCLFNBZUEsT0FiQVQsRUFBQTBwRCxHQUFBai9ELEtBQUFpL0QsR0FDQTFwRCxFQUFBMnBELEdBQUFsL0QsS0FBQWsvRCxHQUVBM3BELEVBQUE0cEQsUUFBQW4vRCxLQUFBbS9ELFFBQ0E1cEQsRUFBQTZwRCxRQUFBcC9ELEtBQUFvL0QsUUFFQTdwRCxFQUFBOHBELFlBQUFyL0QsS0FBQXEvRCxZQUNBOXBELEVBQUErcEQsVUFBQXQvRCxLQUFBcy9ELFVBRUEvcEQsRUFBQWdxRCxXQUFBdi9ELEtBQUF1L0QsV0FFQWhxRCxFQUFBaXFELFVBQUF4L0QsS0FBQXcvRCxVQUVBanFELENBRUEsQ0FFQSxRQUFBeXBDLENBQUEwTyxHQWlCQSxPQWZBbjJDLE1BQUF5bkMsU0FBQTBPLEdBRUExdEQsS0FBQWkvRCxHQUFBdlIsRUFBQXVSLEdBQ0FqL0QsS0FBQWsvRCxHQUFBeFIsRUFBQXdSLEdBRUFsL0QsS0FBQW0vRCxRQUFBelIsRUFBQXlSLFFBQ0FuL0QsS0FBQW8vRCxRQUFBMVIsRUFBQTBSLFFBRUFwL0QsS0FBQXEvRCxZQUFBM1IsRUFBQTJSLFlBQ0FyL0QsS0FBQXMvRCxVQUFBNVIsRUFBQTRSLFVBRUF0L0QsS0FBQXUvRCxXQUFBN1IsRUFBQTZSLFdBRUF2L0QsS0FBQXcvRCxVQUFBOVIsRUFBQThSLFVBRUF4L0QsSUFFQSxFQ3RQQSxNQUFBNi9ELFdBQUFiLEdBWUEsV0FBQXA4RCxDQUFBcThELEVBQUFDLEVBQUFZLEVBQUFULEVBQUFDLEVBQUFDLEdBRUFob0QsTUFBQTBuRCxFQUFBQyxFQUFBWSxFQUFBQSxFQUFBVCxFQUFBQyxFQUFBQyxHQVNBdi9ELEtBQUErL0QsWUFBQSxFQUVBLy9ELEtBQUFILEtBQUEsVUFFQSxFQy9CQSxTQUFBbWdFLEtBcUJBLElBQUFDLEVBQUEsRUFBQXpnRCxFQUFBLEVBQUFyWixFQUFBLEVBQUFzWixFQUFBLEVBVUEsU0FBQTR0QyxFQUFBbHZDLEVBQUFJLEVBQUE2TixFQUFBQyxHQUVBNHpDLEVBQUE5aEQsRUFDQXFCLEVBQUE0TSxFQUNBam1CLEdBQUEsRUFBQWdZLEVBQUEsRUFBQUksRUFBQSxFQUFBNk4sRUFBQUMsRUFDQTVNLEVBQUEsRUFBQXRCLEVBQUEsRUFBQUksRUFBQTZOLEVBQUFDLENBRUEsQ0FFQSxNQUFBLENBRUE2ekMsZUFBQSxTQUFBL2hELEVBQUFJLEVBQUFrVCxFQUFBMHVDLEVBQUFDLEdBRUEvUyxFQUFBOXVDLEVBQUFrVCxFQUFBMnVDLEdBQUEzdUMsRUFBQXRULEdBQUFpaUQsR0FBQUQsRUFBQTVoRCxHQUVBLEVBRUE4aEQseUJBQUEsU0FBQWxpRCxFQUFBSSxFQUFBa1QsRUFBQTB1QyxFQUFBRyxFQUFBQyxFQUFBQyxHQUdBLElBQUFuMEMsR0FBQTlOLEVBQUFKLEdBQUFtaUQsR0FBQTd1QyxFQUFBdFQsSUFBQW1pRCxFQUFBQyxJQUFBOXVDLEVBQUFsVCxHQUFBZ2lELEVBQ0FuQyxHQUFBM3NDLEVBQUFsVCxHQUFBZ2lELEdBQUFKLEVBQUE1aEQsSUFBQWdpRCxFQUFBQyxJQUFBTCxFQUFBMXVDLEdBQUErdUMsRUFHQW4wQyxHQUFBazBDLEVBQ0FuQyxHQUFBbUMsRUFFQWxULEVBQUE5dUMsRUFBQWtULEVBQUFwRixFQUFBK3hDLEVBRUEsRUFFQXFDLEtBQUEsU0FBQS85RCxHQUVBLE1BQUEwN0QsRUFBQTE3RCxFQUFBQSxFQUVBLE9BQUF1OUQsRUFBQXpnRCxFQUFBOWMsRUFBQXlELEVBQUFpNEQsRUFBQTMrQyxHQURBMitDLEVBQUExN0QsRUFHQSxFQUlBLENBSUEsTUFBQThMLEdBQUEsSUFBQXdULEdBQ0EwK0MsR0FBQSxJQUFBVixHQUNBVyxHQUFBLElBQUFYLEdBQ0FZLEdBQUEsSUFBQVosR0EwQkEsTUFBQWEsV0FBQTlELEdBVUEsV0FBQW42RCxDQUFBK2lCLEVBQUEsR0FBQSs0QyxHQUFBLEVBQUFvQyxFQUFBLGNBQUFWLEVBQUEsSUFFQTdvRCxRQVNBdlgsS0FBQStnRSxvQkFBQSxFQUVBL2dFLEtBQUFILEtBQUEsbUJBT0FHLEtBQUEybEIsT0FBQUEsRUFRQTNsQixLQUFBMCtELE9BQUFBLEVBUUExK0QsS0FBQThnRSxVQUFBQSxFQVFBOWdFLEtBQUFvZ0UsUUFBQUEsQ0FFQSxDQVNBLFFBQUFsRCxDQUFBeDZELEVBQUEwNkQsRUFBQSxJQUFBcDdDLElBRUEsTUFBQXVFLEVBQUE2MkMsRUFFQXozQyxFQUFBM2xCLEtBQUEybEIsT0FDQTNrQixFQUFBMmtCLEVBQUExa0IsT0FFQTR4QixHQUFBN3hCLEdBQUFoQixLQUFBMCtELE9BQUEsRUFBQSxJQUFBaDhELEVBQ0EsSUFjQTRtQixFQUFBMFYsRUFkQWdpQyxFQUFBMS9ELEtBQUFtRCxNQUFBb3VCLEdBQ0E0NUIsRUFBQTU1QixFQUFBbXVDLEVBRUFoaEUsS0FBQTArRCxPQUVBc0MsR0FBQUEsRUFBQSxFQUFBLEdBQUExL0QsS0FBQW1ELE1BQUFuRCxLQUFBNkMsSUFBQTY4RCxHQUFBaGdFLEdBQUEsR0FBQUEsRUFFQSxJQUFBeXJELEdBQUF1VSxJQUFBaGdFLEVBQUEsSUFFQWdnRSxFQUFBaGdFLEVBQUEsRUFDQXlyRCxFQUFBLEdBTUF6c0QsS0FBQTArRCxRQUFBc0MsRUFBQSxFQUVBMTNDLEVBQUEzRCxHQUFBcTdDLEVBQUEsR0FBQWhnRSxJQUtBd04sR0FBQXRHLFdBQUF5ZCxFQUFBLEdBQUFBLEVBQUEsSUFBQS9kLElBQUErZCxFQUFBLElBQ0EyRCxFQUFBOWEsSUFJQSxNQUFBK2EsRUFBQTVELEVBQUFxN0MsRUFBQWhnRSxHQUNBd29CLEVBQUE3RCxHQUFBcTdDLEVBQUEsR0FBQWhnRSxHQWNBLEdBWkFoQixLQUFBMCtELFFBQUFzQyxFQUFBLEVBQUFoZ0UsRUFFQWcrQixFQUFBclosR0FBQXE3QyxFQUFBLEdBQUFoZ0UsSUFLQXdOLEdBQUF0RyxXQUFBeWQsRUFBQTNrQixFQUFBLEdBQUEya0IsRUFBQTNrQixFQUFBLElBQUE0RyxJQUFBK2QsRUFBQTNrQixFQUFBLElBQ0FnK0IsRUFBQXh3QixJQUlBLGdCQUFBeE8sS0FBQThnRSxXQUFBLFlBQUE5Z0UsS0FBQThnRSxVQUFBLENBR0EsTUFBQXg3RCxFQUFBLFlBQUF0RixLQUFBOGdFLFVBQUEsR0FBQSxJQUNBLElBQUFSLEVBQUFoL0QsS0FBQWdFLElBQUFna0IsRUFBQXpmLGtCQUFBMGYsR0FBQWprQixHQUNBaTdELEVBQUFqL0QsS0FBQWdFLElBQUFpa0IsRUFBQTFmLGtCQUFBMmYsR0FBQWxrQixHQUNBazdELEVBQUFsL0QsS0FBQWdFLElBQUFra0IsRUFBQTNmLGtCQUFBbTFCLEdBQUExNUIsR0FHQWk3RCxFQUFBLE9BQUFBLEVBQUEsR0FDQUQsRUFBQSxPQUFBQSxFQUFBQyxHQUNBQyxFQUFBLE9BQUFBLEVBQUFELEdBRUFHLEdBQUFMLHlCQUFBLzJDLEVBQUE5bUIsRUFBQSttQixFQUFBL21CLEVBQUFnbkIsRUFBQWhuQixFQUFBdzhCLEVBQUF4OEIsRUFBQTg5RCxFQUFBQyxFQUFBQyxHQUNBRyxHQUFBTix5QkFBQS8yQyxFQUFBN21CLEVBQUE4bUIsRUFBQTltQixFQUFBK21CLEVBQUEvbUIsRUFBQXU4QixFQUFBdjhCLEVBQUE2OUQsRUFBQUMsRUFBQUMsR0FDQUksR0FBQVAseUJBQUEvMkMsRUFBQWhRLEVBQUFpUSxFQUFBalEsRUFBQWtRLEVBQUFsUSxFQUFBMGxCLEVBQUExbEIsRUFBQWduRCxFQUFBQyxFQUFBQyxFQUVBLEtBQUEsZUFBQXhnRSxLQUFBOGdFLFlBRUFKLEdBQUFSLGVBQUE1MkMsRUFBQTltQixFQUFBK21CLEVBQUEvbUIsRUFBQWduQixFQUFBaG5CLEVBQUF3OEIsRUFBQXg4QixFQUFBeEMsS0FBQW9nRSxTQUNBTyxHQUFBVCxlQUFBNTJDLEVBQUE3bUIsRUFBQThtQixFQUFBOW1CLEVBQUErbUIsRUFBQS9tQixFQUFBdThCLEVBQUF2OEIsRUFBQXpDLEtBQUFvZ0UsU0FDQVEsR0FBQVYsZUFBQTUyQyxFQUFBaFEsRUFBQWlRLEVBQUFqUSxFQUFBa1EsRUFBQWxRLEVBQUEwbEIsRUFBQTFsQixFQUFBdFosS0FBQW9nRSxVQVVBLE9BTkE3NUMsRUFBQTVmLElBQ0ErNUQsR0FBQUQsS0FBQWhVLEdBQ0FrVSxHQUFBRixLQUFBaFUsR0FDQW1VLEdBQUFILEtBQUFoVSxJQUdBbG1DLENBRUEsQ0FFQSxJQUFBN2UsQ0FBQStQLEdBRUFGLE1BQUE3UCxLQUFBK1AsR0FFQXpYLEtBQUEybEIsT0FBQSxHQUVBLElBQUEsSUFBQTVrQixFQUFBLEVBQUFDLEVBQUF5VyxFQUFBa08sT0FBQTFrQixPQUFBRixFQUFBQyxFQUFBRCxJQUFBLENBRUEsTUFBQXdsQixFQUFBOU8sRUFBQWtPLE9BQUE1a0IsR0FFQWYsS0FBQTJsQixPQUFBdmxCLEtBQUFtbUIsRUFBQTllLFFBRUEsQ0FNQSxPQUpBekgsS0FBQTArRCxPQUFBam5ELEVBQUFpbkQsT0FDQTErRCxLQUFBOGdFLFVBQUFycEQsRUFBQXFwRCxVQUNBOWdFLEtBQUFvZ0UsUUFBQTNvRCxFQUFBMm9ELFFBRUFwZ0UsSUFFQSxDQUVBLE1BQUFnVyxHQUVBLE1BQUFULEVBQUFnQyxNQUFBdkIsU0FFQVQsRUFBQW9RLE9BQUEsR0FFQSxJQUFBLElBQUE1a0IsRUFBQSxFQUFBQyxFQUFBaEIsS0FBQTJsQixPQUFBMWtCLE9BQUFGLEVBQUFDLEVBQUFELElBQUEsQ0FFQSxNQUFBd2xCLEVBQUF2bUIsS0FBQTJsQixPQUFBNWtCLEdBQ0F3VSxFQUFBb1EsT0FBQXZsQixLQUFBbW1CLEVBQUE5YixVQUVBLENBTUEsT0FKQThLLEVBQUFtcEQsT0FBQTErRCxLQUFBMCtELE9BQ0FucEQsRUFBQXVyRCxVQUFBOWdFLEtBQUE4Z0UsVUFDQXZyRCxFQUFBNnFELFFBQUFwZ0UsS0FBQW9nRSxRQUVBN3FELENBRUEsQ0FFQSxRQUFBeXBDLENBQUEwTyxHQUVBbjJDLE1BQUF5bkMsU0FBQTBPLEdBRUExdEQsS0FBQTJsQixPQUFBLEdBRUEsSUFBQSxJQUFBNWtCLEVBQUEsRUFBQUMsRUFBQTBzRCxFQUFBL25DLE9BQUExa0IsT0FBQUYsRUFBQUMsRUFBQUQsSUFBQSxDQUVBLE1BQUF3bEIsRUFBQW1uQyxFQUFBL25DLE9BQUE1a0IsR0FDQWYsS0FBQTJsQixPQUFBdmxCLE1BQUEsSUFBQTRoQixJQUFBelgsVUFBQWdjLEdBRUEsQ0FNQSxPQUpBdm1CLEtBQUEwK0QsT0FBQWhSLEVBQUFnUixPQUNBMStELEtBQUE4Z0UsVUFBQXBULEVBQUFvVCxVQUNBOWdFLEtBQUFvZ0UsUUFBQTFTLEVBQUEwUyxRQUVBcGdFLElBRUEsRUNyVEEsU0FBQWloRSxHQUFBditELEVBQUE0bUIsRUFBQUMsRUFBQUMsRUFBQXdWLEdBRUEsTUFBQTdWLEVBQUEsSUFBQUssRUFBQUYsR0FDQWxmLEVBQUEsSUFBQTQwQixFQUFBelYsR0FDQTYwQyxFQUFBMTdELEVBQUFBLEVBRUEsT0FBQSxFQUFBNm1CLEVBQUEsRUFBQUMsRUFBQUwsRUFBQS9lLElBREExSCxFQUFBMDdELEtBQ0EsRUFBQTcwQyxFQUFBLEVBQUFDLEVBQUEsRUFBQUwsRUFBQS9lLEdBQUFnMEQsRUFBQWoxQyxFQUFBem1CLEVBQUE2bUIsQ0FFQSxDQWdDQSxTQUFBMjNDLEdBQUF4K0QsRUFBQTRtQixFQUFBQyxFQUFBQyxHQUVBLE9BOUJBLFNBQUE5bUIsRUFBQW13QixHQUVBLE1BQUFzdUMsRUFBQSxFQUFBeitELEVBQ0EsT0FBQXkrRCxFQUFBQSxFQUFBdHVDLENBRUEsQ0F5QkF1dUMsQ0FBQTErRCxFQUFBNG1CLEdBdkJBLFNBQUE1bUIsRUFBQW13QixHQUVBLE9BQUEsR0FBQSxFQUFBbndCLEdBQUFBLEVBQUFtd0IsQ0FFQSxDQW1CQXd1QyxDQUFBMytELEVBQUE2bUIsR0FqQkEsU0FBQTdtQixFQUFBbXdCLEdBRUEsT0FBQW53QixFQUFBQSxFQUFBbXdCLENBRUEsQ0FjQXl1QyxDQUFBNStELEVBQUE4bUIsRUFFQSxDQXdDQSxTQUFBKzNDLEdBQUE3K0QsRUFBQTRtQixFQUFBQyxFQUFBQyxFQUFBd1YsR0FFQSxPQXRDQSxTQUFBdDhCLEVBQUFtd0IsR0FFQSxNQUFBc3VDLEVBQUEsRUFBQXorRCxFQUNBLE9BQUF5K0QsRUFBQUEsRUFBQUEsRUFBQXR1QyxDQUVBLENBaUNBMnVDLENBQUE5K0QsRUFBQTRtQixHQS9CQSxTQUFBNW1CLEVBQUFtd0IsR0FFQSxNQUFBc3VDLEVBQUEsRUFBQXorRCxFQUNBLE9BQUEsRUFBQXkrRCxFQUFBQSxFQUFBeitELEVBQUFtd0IsQ0FFQSxDQTBCQTR1QyxDQUFBLytELEVBQUE2bUIsR0F4QkEsU0FBQTdtQixFQUFBbXdCLEdBRUEsT0FBQSxHQUFBLEVBQUFud0IsR0FBQUEsRUFBQUEsRUFBQW13QixDQUVBLENBb0JBNnVDLENBQUFoL0QsRUFBQThtQixHQWxCQSxTQUFBOW1CLEVBQUFtd0IsR0FFQSxPQUFBbndCLEVBQUFBLEVBQUFBLEVBQUFtd0IsQ0FFQSxDQWVBOHVDLENBQUFqL0QsRUFBQXM4QixFQUVBLENDNUVBLE1BQUE0aUMsV0FBQTdFLEdBVUEsV0FBQW42RCxDQUFBdW1CLEVBQUEsSUFBQXJpQixHQUFBc0QsRUFBQSxJQUFBdEQsR0FBQXVELEVBQUEsSUFBQXZELEdBQUFtNEIsRUFBQSxJQUFBbjRCLElBRUF5USxRQVNBdlgsS0FBQTZoRSxvQkFBQSxFQUVBN2hFLEtBQUFILEtBQUEsbUJBT0FHLEtBQUFtcEIsR0FBQUEsRUFPQW5wQixLQUFBb0ssR0FBQUEsRUFPQXBLLEtBQUFxSyxHQUFBQSxFQU9BckssS0FBQWkvQixHQUFBQSxDQUVBLENBU0EsUUFBQWkrQixDQUFBeDZELEVBQUEwNkQsRUFBQSxJQUFBdDJELElBRUEsTUFBQXlmLEVBQUE2MkMsRUFFQWowQyxFQUFBbnBCLEtBQUFtcEIsR0FBQS9lLEVBQUFwSyxLQUFBb0ssR0FBQUMsRUFBQXJLLEtBQUFxSyxHQUFBNDBCLEVBQUFqL0IsS0FBQWkvQixHQU9BLE9BTEExWSxFQUFBNWYsSUFDQTQ2RCxHQUFBNytELEVBQUF5bUIsRUFBQTNtQixFQUFBNEgsRUFBQTVILEVBQUE2SCxFQUFBN0gsRUFBQXk4QixFQUFBejhCLEdBQ0ErK0QsR0FBQTcrRCxFQUFBeW1CLEVBQUExbUIsRUFBQTJILEVBQUEzSCxFQUFBNEgsRUFBQTVILEVBQUF3OEIsRUFBQXg4QixJQUdBOGpCLENBRUEsQ0FFQSxJQUFBN2UsQ0FBQStQLEdBU0EsT0FQQUYsTUFBQTdQLEtBQUErUCxHQUVBelgsS0FBQW1wQixHQUFBemhCLEtBQUErUCxFQUFBMFIsSUFDQW5wQixLQUFBb0ssR0FBQTFDLEtBQUErUCxFQUFBck4sSUFDQXBLLEtBQUFxSyxHQUFBM0MsS0FBQStQLEVBQUFwTixJQUNBckssS0FBQWkvQixHQUFBdjNCLEtBQUErUCxFQUFBd25CLElBRUFqL0IsSUFFQSxDQUVBLE1BQUFnVyxHQUVBLE1BQUFULEVBQUFnQyxNQUFBdkIsU0FPQSxPQUxBVCxFQUFBNFQsR0FBQW5wQixLQUFBbXBCLEdBQUExZSxVQUNBOEssRUFBQW5MLEdBQUFwSyxLQUFBb0ssR0FBQUssVUFDQThLLEVBQUFsTCxHQUFBckssS0FBQXFLLEdBQUFJLFVBQ0E4SyxFQUFBMHBCLEdBQUFqL0IsS0FBQWkvQixHQUFBeDBCLFVBRUE4SyxDQUVBLENBRUEsUUFBQXlwQyxDQUFBME8sR0FTQSxPQVBBbjJDLE1BQUF5bkMsU0FBQTBPLEdBRUExdEQsS0FBQW1wQixHQUFBNWUsVUFBQW1qRCxFQUFBdmtDLElBQ0FucEIsS0FBQW9LLEdBQUFHLFVBQUFtakQsRUFBQXRqRCxJQUNBcEssS0FBQXFLLEdBQUFFLFVBQUFtakQsRUFBQXJqRCxJQUNBckssS0FBQWkvQixHQUFBMTBCLFVBQUFtakQsRUFBQXp1QixJQUVBai9CLElBRUEsRUNuSUEsTUFBQThoRSxXQUFBL0UsR0FVQSxXQUFBbjZELENBQUF1bUIsRUFBQSxJQUFBbkgsR0FBQTVYLEVBQUEsSUFBQTRYLEdBQUEzWCxFQUFBLElBQUEyWCxHQUFBaWQsRUFBQSxJQUFBamQsSUFFQXpLLFFBU0F2WCxLQUFBK2hFLHFCQUFBLEVBRUEvaEUsS0FBQUgsS0FBQSxvQkFPQUcsS0FBQW1wQixHQUFBQSxFQU9BbnBCLEtBQUFvSyxHQUFBQSxFQU9BcEssS0FBQXFLLEdBQUFBLEVBT0FySyxLQUFBaS9CLEdBQUFBLENBRUEsQ0FTQSxRQUFBaStCLENBQUF4NkQsRUFBQTA2RCxFQUFBLElBQUFwN0MsSUFFQSxNQUFBdUUsRUFBQTYyQyxFQUVBajBDLEVBQUFucEIsS0FBQW1wQixHQUFBL2UsRUFBQXBLLEtBQUFvSyxHQUFBQyxFQUFBckssS0FBQXFLLEdBQUE0MEIsRUFBQWovQixLQUFBaS9CLEdBUUEsT0FOQTFZLEVBQUE1ZixJQUNBNDZELEdBQUE3K0QsRUFBQXltQixFQUFBM21CLEVBQUE0SCxFQUFBNUgsRUFBQTZILEVBQUE3SCxFQUFBeThCLEVBQUF6OEIsR0FDQSsrRCxHQUFBNytELEVBQUF5bUIsRUFBQTFtQixFQUFBMkgsRUFBQTNILEVBQUE0SCxFQUFBNUgsRUFBQXc4QixFQUFBeDhCLEdBQ0E4K0QsR0FBQTcrRCxFQUFBeW1CLEVBQUE3UCxFQUFBbFAsRUFBQWtQLEVBQUFqUCxFQUFBaVAsRUFBQTJsQixFQUFBM2xCLElBR0FpTixDQUVBLENBRUEsSUFBQTdlLENBQUErUCxHQVNBLE9BUEFGLE1BQUE3UCxLQUFBK1AsR0FFQXpYLEtBQUFtcEIsR0FBQXpoQixLQUFBK1AsRUFBQTBSLElBQ0FucEIsS0FBQW9LLEdBQUExQyxLQUFBK1AsRUFBQXJOLElBQ0FwSyxLQUFBcUssR0FBQTNDLEtBQUErUCxFQUFBcE4sSUFDQXJLLEtBQUFpL0IsR0FBQXYzQixLQUFBK1AsRUFBQXduQixJQUVBai9CLElBRUEsQ0FFQSxNQUFBZ1csR0FFQSxNQUFBVCxFQUFBZ0MsTUFBQXZCLFNBT0EsT0FMQVQsRUFBQTRULEdBQUFucEIsS0FBQW1wQixHQUFBMWUsVUFDQThLLEVBQUFuTCxHQUFBcEssS0FBQW9LLEdBQUFLLFVBQ0E4SyxFQUFBbEwsR0FBQXJLLEtBQUFxSyxHQUFBSSxVQUNBOEssRUFBQTBwQixHQUFBai9CLEtBQUFpL0IsR0FBQXgwQixVQUVBOEssQ0FFQSxDQUVBLFFBQUF5cEMsQ0FBQTBPLEdBU0EsT0FQQW4yQyxNQUFBeW5DLFNBQUEwTyxHQUVBMXRELEtBQUFtcEIsR0FBQTVlLFVBQUFtakQsRUFBQXZrQyxJQUNBbnBCLEtBQUFvSyxHQUFBRyxVQUFBbWpELEVBQUF0akQsSUFDQXBLLEtBQUFxSyxHQUFBRSxVQUFBbWpELEVBQUFyakQsSUFDQXJLLEtBQUFpL0IsR0FBQTEwQixVQUFBbWpELEVBQUF6dUIsSUFFQWovQixJQUVBLEVDcEhBLE1BQUFnaUUsV0FBQWpGLEdBUUEsV0FBQW42RCxDQUFBd0gsRUFBQSxJQUFBdEQsR0FBQXVELEVBQUEsSUFBQXZELElBRUF5USxRQVNBdlgsS0FBQWlpRSxhQUFBLEVBRUFqaUUsS0FBQUgsS0FBQSxZQU9BRyxLQUFBb0ssR0FBQUEsRUFPQXBLLEtBQUFxSyxHQUFBQSxDQUVBLENBU0EsUUFBQTZ5RCxDQUFBeDZELEVBQUEwNkQsRUFBQSxJQUFBdDJELElBRUEsTUFBQXlmLEVBQUE2MkMsRUFhQSxPQVhBLElBQUExNkQsRUFFQTZqQixFQUFBN2UsS0FBQTFILEtBQUFxSyxLQUlBa2MsRUFBQTdlLEtBQUExSCxLQUFBcUssSUFBQXJDLElBQUFoSSxLQUFBb0ssSUFDQW1jLEVBQUFuZSxlQUFBMUYsR0FBQWtGLElBQUE1SCxLQUFBb0ssS0FJQW1jLENBRUEsQ0FHQSxVQUFBNDJDLENBQUFsNEMsRUFBQW00QyxHQUVBLE9BQUFwOUQsS0FBQWs5RCxTQUFBajRDLEVBQUFtNEMsRUFFQSxDQUVBLFVBQUFlLENBQUF6N0QsRUFBQTA2RCxFQUFBLElBQUF0MkQsSUFFQSxPQUFBczJELEVBQUFsMUQsV0FBQWxJLEtBQUFxSyxHQUFBckssS0FBQW9LLElBQUEvRyxXQUVBLENBRUEsWUFBQWs3RCxDQUFBdDVDLEVBQUFtNEMsR0FFQSxPQUFBcDlELEtBQUFtK0QsV0FBQWw1QyxFQUFBbTRDLEVBRUEsQ0FFQSxJQUFBMTFELENBQUErUCxHQU9BLE9BTEFGLE1BQUE3UCxLQUFBK1AsR0FFQXpYLEtBQUFvSyxHQUFBMUMsS0FBQStQLEVBQUFyTixJQUNBcEssS0FBQXFLLEdBQUEzQyxLQUFBK1AsRUFBQXBOLElBRUFySyxJQUVBLENBRUEsTUFBQWdXLEdBRUEsTUFBQVQsRUFBQWdDLE1BQUF2QixTQUtBLE9BSEFULEVBQUFuTCxHQUFBcEssS0FBQW9LLEdBQUFLLFVBQ0E4SyxFQUFBbEwsR0FBQXJLLEtBQUFxSyxHQUFBSSxVQUVBOEssQ0FFQSxDQUVBLFFBQUF5cEMsQ0FBQTBPLEdBT0EsT0FMQW4yQyxNQUFBeW5DLFNBQUEwTyxHQUVBMXRELEtBQUFvSyxHQUFBRyxVQUFBbWpELEVBQUF0akQsSUFDQXBLLEtBQUFxSyxHQUFBRSxVQUFBbWpELEVBQUFyakQsSUFFQXJLLElBRUEsRUNuSEEsTUFBQWtpRSxXQUFBbkYsR0FRQSxXQUFBbjZELENBQUF3SCxFQUFBLElBQUE0WCxHQUFBM1gsRUFBQSxJQUFBMlgsSUFFQXpLLFFBU0F2WCxLQUFBbWlFLGNBQUEsRUFFQW5pRSxLQUFBSCxLQUFBLGFBT0FHLEtBQUFvSyxHQUFBQSxFQU9BcEssS0FBQXFLLEdBQUFBLENBRUEsQ0FTQSxRQUFBNnlELENBQUF4NkQsRUFBQTA2RCxFQUFBLElBQUFwN0MsSUFFQSxNQUFBdUUsRUFBQTYyQyxFQWFBLE9BWEEsSUFBQTE2RCxFQUVBNmpCLEVBQUE3ZSxLQUFBMUgsS0FBQXFLLEtBSUFrYyxFQUFBN2UsS0FBQTFILEtBQUFxSyxJQUFBckMsSUFBQWhJLEtBQUFvSyxJQUNBbWMsRUFBQW5lLGVBQUExRixHQUFBa0YsSUFBQTVILEtBQUFvSyxLQUlBbWMsQ0FFQSxDQUdBLFVBQUE0MkMsQ0FBQWw0QyxFQUFBbTRDLEdBRUEsT0FBQXA5RCxLQUFBazlELFNBQUFqNEMsRUFBQW00QyxFQUVBLENBRUEsVUFBQWUsQ0FBQXo3RCxFQUFBMDZELEVBQUEsSUFBQXA3QyxJQUVBLE9BQUFvN0MsRUFBQWwxRCxXQUFBbEksS0FBQXFLLEdBQUFySyxLQUFBb0ssSUFBQS9HLFdBRUEsQ0FFQSxZQUFBazdELENBQUF0NUMsRUFBQW00QyxHQUVBLE9BQUFwOUQsS0FBQW0rRCxXQUFBbDVDLEVBQUFtNEMsRUFFQSxDQUVBLElBQUExMUQsQ0FBQStQLEdBT0EsT0FMQUYsTUFBQTdQLEtBQUErUCxHQUVBelgsS0FBQW9LLEdBQUExQyxLQUFBK1AsRUFBQXJOLElBQ0FwSyxLQUFBcUssR0FBQTNDLEtBQUErUCxFQUFBcE4sSUFFQXJLLElBRUEsQ0FFQSxNQUFBZ1csR0FFQSxNQUFBVCxFQUFBZ0MsTUFBQXZCLFNBS0EsT0FIQVQsRUFBQW5MLEdBQUFwSyxLQUFBb0ssR0FBQUssVUFDQThLLEVBQUFsTCxHQUFBckssS0FBQXFLLEdBQUFJLFVBRUE4SyxDQUVBLENBRUEsUUFBQXlwQyxDQUFBME8sR0FPQSxPQUxBbjJDLE1BQUF5bkMsU0FBQTBPLEdBRUExdEQsS0FBQW9LLEdBQUFHLFVBQUFtakQsRUFBQXRqRCxJQUNBcEssS0FBQXFLLEdBQUFFLFVBQUFtakQsRUFBQXJqRCxJQUVBckssSUFFQSxFQ2xHQSxNQUFBb2lFLFdBQUFyRixHQVNBLFdBQUFuNkQsQ0FBQXVtQixFQUFBLElBQUFyaUIsR0FBQXNELEVBQUEsSUFBQXRELEdBQUF1RCxFQUFBLElBQUF2RCxJQUVBeVEsUUFTQXZYLEtBQUFxaUUsd0JBQUEsRUFFQXJpRSxLQUFBSCxLQUFBLHVCQU9BRyxLQUFBbXBCLEdBQUFBLEVBT0FucEIsS0FBQW9LLEdBQUFBLEVBT0FwSyxLQUFBcUssR0FBQUEsQ0FFQSxDQVNBLFFBQUE2eUQsQ0FBQXg2RCxFQUFBMDZELEVBQUEsSUFBQXQyRCxJQUVBLE1BQUF5ZixFQUFBNjJDLEVBRUFqMEMsRUFBQW5wQixLQUFBbXBCLEdBQUEvZSxFQUFBcEssS0FBQW9LLEdBQUFDLEVBQUFySyxLQUFBcUssR0FPQSxPQUxBa2MsRUFBQTVmLElBQ0F1NkQsR0FBQXgrRCxFQUFBeW1CLEVBQUEzbUIsRUFBQTRILEVBQUE1SCxFQUFBNkgsRUFBQTdILEdBQ0EwK0QsR0FBQXgrRCxFQUFBeW1CLEVBQUExbUIsRUFBQTJILEVBQUEzSCxFQUFBNEgsRUFBQTVILElBR0E4akIsQ0FFQSxDQUVBLElBQUE3ZSxDQUFBK1AsR0FRQSxPQU5BRixNQUFBN1AsS0FBQStQLEdBRUF6WCxLQUFBbXBCLEdBQUF6aEIsS0FBQStQLEVBQUEwUixJQUNBbnBCLEtBQUFvSyxHQUFBMUMsS0FBQStQLEVBQUFyTixJQUNBcEssS0FBQXFLLEdBQUEzQyxLQUFBK1AsRUFBQXBOLElBRUFySyxJQUVBLENBRUEsTUFBQWdXLEdBRUEsTUFBQVQsRUFBQWdDLE1BQUF2QixTQU1BLE9BSkFULEVBQUE0VCxHQUFBbnBCLEtBQUFtcEIsR0FBQTFlLFVBQ0E4SyxFQUFBbkwsR0FBQXBLLEtBQUFvSyxHQUFBSyxVQUNBOEssRUFBQWxMLEdBQUFySyxLQUFBcUssR0FBQUksVUFFQThLLENBRUEsQ0FFQSxRQUFBeXBDLENBQUEwTyxHQVFBLE9BTkFuMkMsTUFBQXluQyxTQUFBME8sR0FFQTF0RCxLQUFBbXBCLEdBQUE1ZSxVQUFBbWpELEVBQUF2a0MsSUFDQW5wQixLQUFBb0ssR0FBQUcsVUFBQW1qRCxFQUFBdGpELElBQ0FwSyxLQUFBcUssR0FBQUUsVUFBQW1qRCxFQUFBcmpELElBRUFySyxJQUVBLEVDdkhBLE1BQUFzaUUsV0FBQXZGLEdBU0EsV0FBQW42RCxDQUFBdW1CLEVBQUEsSUFBQW5ILEdBQUE1WCxFQUFBLElBQUE0WCxHQUFBM1gsRUFBQSxJQUFBMlgsSUFFQXpLLFFBU0F2WCxLQUFBdWlFLHlCQUFBLEVBRUF2aUUsS0FBQUgsS0FBQSx3QkFPQUcsS0FBQW1wQixHQUFBQSxFQU9BbnBCLEtBQUFvSyxHQUFBQSxFQU9BcEssS0FBQXFLLEdBQUFBLENBRUEsQ0FTQSxRQUFBNnlELENBQUF4NkQsRUFBQTA2RCxFQUFBLElBQUFwN0MsSUFFQSxNQUFBdUUsRUFBQTYyQyxFQUVBajBDLEVBQUFucEIsS0FBQW1wQixHQUFBL2UsRUFBQXBLLEtBQUFvSyxHQUFBQyxFQUFBckssS0FBQXFLLEdBUUEsT0FOQWtjLEVBQUE1ZixJQUNBdTZELEdBQUF4K0QsRUFBQXltQixFQUFBM21CLEVBQUE0SCxFQUFBNUgsRUFBQTZILEVBQUE3SCxHQUNBMCtELEdBQUF4K0QsRUFBQXltQixFQUFBMW1CLEVBQUEySCxFQUFBM0gsRUFBQTRILEVBQUE1SCxHQUNBeStELEdBQUF4K0QsRUFBQXltQixFQUFBN1AsRUFBQWxQLEVBQUFrUCxFQUFBalAsRUFBQWlQLElBR0FpTixDQUVBLENBRUEsSUFBQTdlLENBQUErUCxHQVFBLE9BTkFGLE1BQUE3UCxLQUFBK1AsR0FFQXpYLEtBQUFtcEIsR0FBQXpoQixLQUFBK1AsRUFBQTBSLElBQ0FucEIsS0FBQW9LLEdBQUExQyxLQUFBK1AsRUFBQXJOLElBQ0FwSyxLQUFBcUssR0FBQTNDLEtBQUErUCxFQUFBcE4sSUFFQXJLLElBRUEsQ0FFQSxNQUFBZ1csR0FFQSxNQUFBVCxFQUFBZ0MsTUFBQXZCLFNBTUEsT0FKQVQsRUFBQTRULEdBQUFucEIsS0FBQW1wQixHQUFBMWUsVUFDQThLLEVBQUFuTCxHQUFBcEssS0FBQW9LLEdBQUFLLFVBQ0E4SyxFQUFBbEwsR0FBQXJLLEtBQUFxSyxHQUFBSSxVQUVBOEssQ0FFQSxDQUVBLFFBQUF5cEMsQ0FBQTBPLEdBUUEsT0FOQW4yQyxNQUFBeW5DLFNBQUEwTyxHQUVBMXRELEtBQUFtcEIsR0FBQTVlLFVBQUFtakQsRUFBQXZrQyxJQUNBbnBCLEtBQUFvSyxHQUFBRyxVQUFBbWpELEVBQUF0akQsSUFDQXBLLEtBQUFxSyxHQUFBRSxVQUFBbWpELEVBQUFyakQsSUFFQXJLLElBRUEsRUNyRkEsTUFBQXdpRSxXQUFBekYsR0FPQSxXQUFBbjZELENBQUEraUIsRUFBQSxJQUVBcE8sUUFTQXZYLEtBQUF5aUUsZUFBQSxFQUVBemlFLEtBQUFILEtBQUEsY0FPQUcsS0FBQTJsQixPQUFBQSxDQUVBLENBU0EsUUFBQXUzQyxDQUFBeDZELEVBQUEwNkQsRUFBQSxJQUFBdDJELElBRUEsTUFBQXlmLEVBQUE2MkMsRUFFQXozQyxFQUFBM2xCLEtBQUEybEIsT0FDQWtOLEdBQUFsTixFQUFBMWtCLE9BQUEsR0FBQXlCLEVBRUFzK0QsRUFBQTEvRCxLQUFBbUQsTUFBQW91QixHQUNBNDVCLEVBQUE1NUIsRUFBQW11QyxFQUVBMTNDLEVBQUEzRCxFQUFBLElBQUFxN0MsRUFBQUEsRUFBQUEsRUFBQSxHQUNBejNDLEVBQUE1RCxFQUFBcTdDLEdBQ0F4M0MsRUFBQTdELEVBQUFxN0MsRUFBQXI3QyxFQUFBMWtCLE9BQUEsRUFBQTBrQixFQUFBMWtCLE9BQUEsRUFBQSsvRCxFQUFBLEdBQ0FoaUMsRUFBQXJaLEVBQUFxN0MsRUFBQXI3QyxFQUFBMWtCLE9BQUEsRUFBQTBrQixFQUFBMWtCLE9BQUEsRUFBQSsvRCxFQUFBLEdBT0EsT0FMQXo2QyxFQUFBNWYsSUFDQXM2RCxHQUFBeFUsRUFBQW5qQyxFQUFBOW1CLEVBQUErbUIsRUFBQS9tQixFQUFBZ25CLEVBQUFobkIsRUFBQXc4QixFQUFBeDhCLEdBQ0F5K0QsR0FBQXhVLEVBQUFuakMsRUFBQTdtQixFQUFBOG1CLEVBQUE5bUIsRUFBQSttQixFQUFBL21CLEVBQUF1OEIsRUFBQXY4QixJQUdBOGpCLENBRUEsQ0FFQSxJQUFBN2UsQ0FBQStQLEdBRUFGLE1BQUE3UCxLQUFBK1AsR0FFQXpYLEtBQUEybEIsT0FBQSxHQUVBLElBQUEsSUFBQTVrQixFQUFBLEVBQUFDLEVBQUF5VyxFQUFBa08sT0FBQTFrQixPQUFBRixFQUFBQyxFQUFBRCxJQUFBLENBRUEsTUFBQXdsQixFQUFBOU8sRUFBQWtPLE9BQUE1a0IsR0FFQWYsS0FBQTJsQixPQUFBdmxCLEtBQUFtbUIsRUFBQTllLFFBRUEsQ0FFQSxPQUFBekgsSUFFQSxDQUVBLE1BQUFnVyxHQUVBLE1BQUFULEVBQUFnQyxNQUFBdkIsU0FFQVQsRUFBQW9RLE9BQUEsR0FFQSxJQUFBLElBQUE1a0IsRUFBQSxFQUFBQyxFQUFBaEIsS0FBQTJsQixPQUFBMWtCLE9BQUFGLEVBQUFDLEVBQUFELElBQUEsQ0FFQSxNQUFBd2xCLEVBQUF2bUIsS0FBQTJsQixPQUFBNWtCLEdBQ0F3VSxFQUFBb1EsT0FBQXZsQixLQUFBbW1CLEVBQUE5YixVQUVBLENBRUEsT0FBQThLLENBRUEsQ0FFQSxRQUFBeXBDLENBQUEwTyxHQUVBbjJDLE1BQUF5bkMsU0FBQTBPLEdBRUExdEQsS0FBQTJsQixPQUFBLEdBRUEsSUFBQSxJQUFBNWtCLEVBQUEsRUFBQUMsRUFBQTBzRCxFQUFBL25DLE9BQUExa0IsT0FBQUYsRUFBQUMsRUFBQUQsSUFBQSxDQUVBLE1BQUF3bEIsRUFBQW1uQyxFQUFBL25DLE9BQUE1a0IsR0FDQWYsS0FBQTJsQixPQUFBdmxCLE1BQUEsSUFBQTBHLElBQUF5RCxVQUFBZ2MsR0FFQSxDQUVBLE9BQUF2bUIsSUFFQSw2TkNuSUEsTUFBQTBpRSxXQUFBM0YsR0FLQSxXQUFBbjZELEdBRUEyVSxRQUVBdlgsS0FBQUgsS0FBQSxZQVFBRyxLQUFBMmlFLE9BQUEsR0FTQTNpRSxLQUFBNGlFLFdBQUEsQ0FFQSxDQU9BLEdBQUFoN0QsQ0FBQWk3RCxHQUVBN2lFLEtBQUEyaUUsT0FBQXZpRSxLQUFBeWlFLEVBRUEsQ0FPQSxTQUFBQyxHQUdBLE1BQUFDLEVBQUEvaUUsS0FBQTJpRSxPQUFBLEdBQUF6RixTQUFBLEdBQ0E4RixFQUFBaGpFLEtBQUEyaUUsT0FBQTNpRSxLQUFBMmlFLE9BQUExaEUsT0FBQSxHQUFBaThELFNBQUEsR0FFQSxJQUFBNkYsRUFBQXo0RCxPQUFBMDRELEdBQUEsQ0FFQSxNQUFBQyxHQUFBLElBQUFGLEVBQUEvN0QsVUFBQSxZQUFBLGFBQ0FoSCxLQUFBMmlFLE9BQUF2aUUsS0FBQSxJQUFBOGlFLEdBQUFELEdBQUFELEVBQUFELEdBRUEsQ0FFQSxPQUFBL2lFLElBRUEsQ0FVQSxRQUFBazlELENBQUF4NkQsRUFBQTA2RCxHQVdBLE1BQUF2dkQsRUFBQW5MLEVBQUExQyxLQUFBeTlELFlBQ0EwRixFQUFBbmpFLEtBQUFvakUsa0JBQ0EsSUFBQXJpRSxFQUFBLEVBSUEsS0FBQUEsRUFBQW9pRSxFQUFBbGlFLFFBQUEsQ0FFQSxHQUFBa2lFLEVBQUFwaUUsSUFBQThNLEVBQUEsQ0FFQSxNQUFBdzFELEVBQUFGLEVBQUFwaUUsR0FBQThNLEVBQ0FnMUQsRUFBQTdpRSxLQUFBMmlFLE9BQUE1aEUsR0FFQXVpRSxFQUFBVCxFQUFBcEYsWUFDQXg0QyxFQUFBLElBQUFxK0MsRUFBQSxFQUFBLEVBQUFELEVBQUFDLEVBRUEsT0FBQVQsRUFBQTFGLFdBQUFsNEMsRUFBQW00QyxFQUVBLENBRUFyOEQsR0FFQSxDQUVBLE9BQUEsSUFJQSxDQUVBLFNBQUEwOEQsR0FNQSxNQUFBOEYsRUFBQXZqRSxLQUFBb2pFLGtCQUNBLE9BQUFHLEVBQUFBLEVBQUF0aUUsT0FBQSxFQUVBLENBRUEsZ0JBQUE2OEQsR0FJQTk5RCxLQUFBK1YsYUFBQSxFQUNBL1YsS0FBQXdqRSxhQUFBLEtBQ0F4akUsS0FBQW9qRSxpQkFFQSxDQU9BLGVBQUFBLEdBTUEsR0FBQXBqRSxLQUFBd2pFLGNBQUF4akUsS0FBQXdqRSxhQUFBdmlFLFNBQUFqQixLQUFBMmlFLE9BQUExaEUsT0FFQSxPQUFBakIsS0FBQXdqRSxhQU9BLE1BQUE5RixFQUFBLEdBQ0EsSUFBQStGLEVBQUEsRUFFQSxJQUFBLElBQUExaUUsRUFBQSxFQUFBQyxFQUFBaEIsS0FBQTJpRSxPQUFBMWhFLE9BQUFGLEVBQUFDLEVBQUFELElBRUEwaUUsR0FBQXpqRSxLQUFBMmlFLE9BQUE1aEUsR0FBQTA4RCxZQUNBQyxFQUFBdDlELEtBQUFxakUsR0FNQSxPQUZBempFLEtBQUF3akUsYUFBQTlGLEVBRUFBLENBRUEsQ0FFQSxlQUFBRixDQUFBRCxFQUFBLElBRUEsTUFBQTUzQyxFQUFBLEdBRUEsSUFBQSxJQUFBNWtCLEVBQUEsRUFBQUEsR0FBQXc4RCxFQUFBeDhELElBRUE0a0IsRUFBQXZsQixLQUFBSixLQUFBazlELFNBQUFuOEQsRUFBQXc4RCxJQVVBLE9BTkF2OUQsS0FBQTRpRSxXQUVBajlDLEVBQUF2bEIsS0FBQXVsQixFQUFBLElBSUFBLENBRUEsQ0FFQSxTQUFBMjNDLENBQUFDLEVBQUEsSUFFQSxNQUFBNTNDLEVBQUEsR0FDQSxJQUFBaTRDLEVBRUEsSUFBQSxJQUFBNzhELEVBQUEsRUFBQTRoRSxFQUFBM2lFLEtBQUEyaUUsT0FBQTVoRSxFQUFBNGhFLEVBQUExaEUsT0FBQUYsSUFBQSxDQUVBLE1BQUE4aEUsRUFBQUYsRUFBQTVoRSxHQUNBMmlFLEVBQUFiLEVBQUFwRCxlQUFBLEVBQUFsQyxFQUNBc0YsRUFBQVosYUFBQVksRUFBQVYsYUFBQSxFQUNBVSxFQUFBSixjQUFBbEYsRUFBQXNGLEVBQUFsOUMsT0FBQTFrQixPQUNBczhELEVBRUFvRyxFQUFBZCxFQUFBdkYsVUFBQW9HLEdBRUEsSUFBQSxJQUFBcjZDLEVBQUEsRUFBQUEsRUFBQXM2QyxFQUFBMWlFLE9BQUFvb0IsSUFBQSxDQUVBLE1BQUE5QyxFQUFBbzlDLEVBQUF0NkMsR0FFQXUwQyxHQUFBQSxFQUFBdHpELE9BQUFpYyxLQUVBWixFQUFBdmxCLEtBQUFtbUIsR0FDQXEzQyxFQUFBcjNDLEVBRUEsQ0FFQSxDQVFBLE9BTkF2bUIsS0FBQTRpRSxXQUFBajlDLEVBQUExa0IsT0FBQSxJQUFBMGtCLEVBQUFBLEVBQUExa0IsT0FBQSxHQUFBcUosT0FBQXFiLEVBQUEsS0FFQUEsRUFBQXZsQixLQUFBdWxCLEVBQUEsSUFJQUEsQ0FFQSxDQUVBLElBQUFqZSxDQUFBK1AsR0FFQUYsTUFBQTdQLEtBQUErUCxHQUVBelgsS0FBQTJpRSxPQUFBLEdBRUEsSUFBQSxJQUFBNWhFLEVBQUEsRUFBQUMsRUFBQXlXLEVBQUFrckQsT0FBQTFoRSxPQUFBRixFQUFBQyxFQUFBRCxJQUFBLENBRUEsTUFBQThoRSxFQUFBcHJELEVBQUFrckQsT0FBQTVoRSxHQUVBZixLQUFBMmlFLE9BQUF2aUUsS0FBQXlpRSxFQUFBcDdELFFBRUEsQ0FJQSxPQUZBekgsS0FBQTRpRSxVQUFBbnJELEVBQUFtckQsVUFFQTVpRSxJQUVBLENBRUEsTUFBQWdXLEdBRUEsTUFBQVQsRUFBQWdDLE1BQUF2QixTQUVBVCxFQUFBcXRELFVBQUE1aUUsS0FBQTRpRSxVQUNBcnRELEVBQUFvdEQsT0FBQSxHQUVBLElBQUEsSUFBQTVoRSxFQUFBLEVBQUFDLEVBQUFoQixLQUFBMmlFLE9BQUExaEUsT0FBQUYsRUFBQUMsRUFBQUQsSUFBQSxDQUVBLE1BQUE4aEUsRUFBQTdpRSxLQUFBMmlFLE9BQUE1aEUsR0FDQXdVLEVBQUFvdEQsT0FBQXZpRSxLQUFBeWlFLEVBQUE3c0QsU0FFQSxDQUVBLE9BQUFULENBRUEsQ0FFQSxRQUFBeXBDLENBQUEwTyxHQUVBbjJDLE1BQUF5bkMsU0FBQTBPLEdBRUExdEQsS0FBQTRpRSxVQUFBbFYsRUFBQWtWLFVBQ0E1aUUsS0FBQTJpRSxPQUFBLEdBRUEsSUFBQSxJQUFBNWhFLEVBQUEsRUFBQUMsRUFBQTBzRCxFQUFBaVYsT0FBQTFoRSxPQUFBRixFQUFBQyxFQUFBRCxJQUFBLENBRUEsTUFBQThoRSxFQUFBblYsRUFBQWlWLE9BQUE1aEUsR0FDQWYsS0FBQTJpRSxPQUFBdmlFLE1BQUEsSUFBQThpRSxHQUFBTCxFQUFBaGpFLE9BQUFtL0MsU0FBQTZqQixHQUVBLENBRUEsT0FBQTdpRSxJQUVBLEVDcFFBLE1BQUE0akUsV0FBQWxCLEdBT0EsV0FBQTkvRCxDQUFBK2lCLEdBRUFwTyxRQUVBdlgsS0FBQUgsS0FBQSxPQU9BRyxLQUFBNmpFLGFBQUEsSUFBQS84RCxHQUVBNmUsR0FFQTNsQixLQUFBMGxCLGNBQUFDLEVBSUEsQ0FTQSxhQUFBRCxDQUFBQyxHQUVBM2xCLEtBQUE4akUsT0FBQW4rQyxFQUFBLEdBQUFuakIsRUFBQW1qQixFQUFBLEdBQUFsakIsR0FFQSxJQUFBLElBQUExQixFQUFBLEVBQUFDLEVBQUEya0IsRUFBQTFrQixPQUFBRixFQUFBQyxFQUFBRCxJQUVBZixLQUFBK2pFLE9BQUFwK0MsRUFBQTVrQixHQUFBeUIsRUFBQW1qQixFQUFBNWtCLEdBQUEwQixHQUlBLE9BQUF6QyxJQUVBLENBU0EsTUFBQThqRSxDQUFBdGhFLEVBQUFDLEdBSUEsT0FGQXpDLEtBQUE2akUsYUFBQWw5RCxJQUFBbkUsRUFBQUMsR0FFQXpDLElBRUEsQ0FVQSxNQUFBK2pFLENBQUF2aEUsRUFBQUMsR0FFQSxNQUFBb2dFLEVBQUEsSUFBQWIsR0FBQWhpRSxLQUFBNmpFLGFBQUFwOEQsUUFBQSxJQUFBWCxHQUFBdEUsRUFBQUMsSUFLQSxPQUpBekMsS0FBQTJpRSxPQUFBdmlFLEtBQUF5aUUsR0FFQTdpRSxLQUFBNmpFLGFBQUFsOUQsSUFBQW5FLEVBQUFDLEdBRUF6QyxJQUVBLENBWUEsZ0JBQUFna0UsQ0FBQUMsRUFBQUMsRUFBQWpGLEVBQUFDLEdBRUEsTUFBQTJELEVBQUEsSUFBQVQsR0FDQXBpRSxLQUFBNmpFLGFBQUFwOEQsUUFDQSxJQUFBWCxHQUFBbTlELEVBQUFDLEdBQ0EsSUFBQXA5RCxHQUFBbTRELEVBQUFDLElBT0EsT0FKQWwvRCxLQUFBMmlFLE9BQUF2aUUsS0FBQXlpRSxHQUVBN2lFLEtBQUE2akUsYUFBQWw5RCxJQUFBczRELEVBQUFDLEdBRUFsL0QsSUFFQSxDQWNBLGFBQUFta0UsQ0FBQUMsRUFBQUMsRUFBQUMsRUFBQUMsRUFBQXRGLEVBQUFDLEdBRUEsTUFBQTJELEVBQUEsSUFBQWpCLEdBQ0E1aEUsS0FBQTZqRSxhQUFBcDhELFFBQ0EsSUFBQVgsR0FBQXM5RCxFQUFBQyxHQUNBLElBQUF2OUQsR0FBQXc5RCxFQUFBQyxHQUNBLElBQUF6OUQsR0FBQW00RCxFQUFBQyxJQU9BLE9BSkFsL0QsS0FBQTJpRSxPQUFBdmlFLEtBQUF5aUUsR0FFQTdpRSxLQUFBNmpFLGFBQUFsOUQsSUFBQXM0RCxFQUFBQyxHQUVBbC9ELElBRUEsQ0FTQSxVQUFBd2tFLENBQUFiLEdBRUEsTUFBQWMsRUFBQSxDQUFBemtFLEtBQUE2akUsYUFBQXA4RCxTQUFBZzhDLE9BQUFrZ0IsR0FFQWQsRUFBQSxJQUFBTCxHQUFBaUMsR0FLQSxPQUpBemtFLEtBQUEyaUUsT0FBQXZpRSxLQUFBeWlFLEdBRUE3aUUsS0FBQTZqRSxhQUFBbjhELEtBQUFpOEQsRUFBQUEsRUFBQTFpRSxPQUFBLElBRUFqQixJQUVBLENBY0EsR0FBQTBrRSxDQUFBekYsRUFBQUMsRUFBQVksRUFBQVQsRUFBQUMsRUFBQUMsR0FFQSxNQUFBcGhELEVBQUFuZSxLQUFBNmpFLGFBQUFyaEUsRUFDQTRiLEVBQUFwZSxLQUFBNmpFLGFBQUFwaEUsRUFLQSxPQUhBekMsS0FBQTJrRSxPQUFBMUYsRUFBQTlnRCxFQUFBK2dELEVBQUE5Z0QsRUFBQTBoRCxFQUNBVCxFQUFBQyxFQUFBQyxHQUVBdi9ELElBRUEsQ0FhQSxNQUFBMmtFLENBQUExRixFQUFBQyxFQUFBWSxFQUFBVCxFQUFBQyxFQUFBQyxHQUlBLE9BRkF2L0QsS0FBQTRrRSxXQUFBM0YsRUFBQUMsRUFBQVksRUFBQUEsRUFBQVQsRUFBQUMsRUFBQUMsR0FFQXYvRCxJQUVBLENBZ0JBLE9BQUE2a0UsQ0FBQTVGLEVBQUFDLEVBQUFDLEVBQUFDLEVBQUFDLEVBQUFDLEVBQUFDLEVBQUFDLEdBRUEsTUFBQXJoRCxFQUFBbmUsS0FBQTZqRSxhQUFBcmhFLEVBQ0E0YixFQUFBcGUsS0FBQTZqRSxhQUFBcGhFLEVBSUEsT0FGQXpDLEtBQUE0a0UsV0FBQTNGLEVBQUE5Z0QsRUFBQStnRCxFQUFBOWdELEVBQUErZ0QsRUFBQUMsRUFBQUMsRUFBQUMsRUFBQUMsRUFBQUMsR0FFQXgvRCxJQUVBLENBZUEsVUFBQTRrRSxDQUFBM0YsRUFBQUMsRUFBQUMsRUFBQUMsRUFBQUMsRUFBQUMsRUFBQUMsRUFBQUMsR0FFQSxNQUFBcUQsRUFBQSxJQUFBN0QsR0FBQUMsRUFBQUMsRUFBQUMsRUFBQUMsRUFBQUMsRUFBQUMsRUFBQUMsRUFBQUMsR0FFQSxHQUFBeC9ELEtBQUEyaUUsT0FBQTFoRSxPQUFBLEVBQUEsQ0FHQSxNQUFBNmpFLEVBQUFqQyxFQUFBM0YsU0FBQSxHQUVBNEgsRUFBQXg2RCxPQUFBdEssS0FBQTZqRSxlQUVBN2pFLEtBQUErakUsT0FBQWUsRUFBQXRpRSxFQUFBc2lFLEVBQUFyaUUsRUFJQSxDQUVBekMsS0FBQTJpRSxPQUFBdmlFLEtBQUF5aUUsR0FFQSxNQUFBa0MsRUFBQWxDLEVBQUEzRixTQUFBLEdBR0EsT0FGQWw5RCxLQUFBNmpFLGFBQUFuOEQsS0FBQXE5RCxHQUVBL2tFLElBRUEsQ0FFQSxJQUFBMEgsQ0FBQStQLEdBTUEsT0FKQUYsTUFBQTdQLEtBQUErUCxHQUVBelgsS0FBQTZqRSxhQUFBbjhELEtBQUErUCxFQUFBb3NELGNBRUE3akUsSUFFQSxDQUVBLE1BQUFnVyxHQUVBLE1BQUFULEVBQUFnQyxNQUFBdkIsU0FJQSxPQUZBVCxFQUFBc3VELGFBQUE3akUsS0FBQTZqRSxhQUFBcDVELFVBRUE4SyxDQUVBLENBRUEsUUFBQXlwQyxDQUFBME8sR0FNQSxPQUpBbjJDLE1BQUF5bkMsU0FBQTBPLEdBRUExdEQsS0FBQTZqRSxhQUFBdDVELFVBQUFtakQsRUFBQW1XLGNBRUE3akUsSUFFQSxFQzdTQSxNQUFBZ2xFLFdBQUEzdEIsR0FZQSxXQUFBejBDLENBQUEraUIsRUFBQSxDQUFBLElBQUE3ZSxHQUFBLEdBQUEsSUFBQSxJQUFBQSxHQUFBLEdBQUEsR0FBQSxJQUFBQSxHQUFBLEVBQUEsS0FBQTIzRCxFQUFBLEdBQUF3RyxFQUFBLEVBQUFDLEVBQUEsRUFBQTVqRSxLQUFBQyxJQUVBZ1csUUFFQXZYLEtBQUFILEtBQUEsZ0JBU0FHLEtBQUF5OEIsV0FBQSxDQUNBOVcsT0FBQUEsRUFDQTg0QyxTQUFBQSxFQUNBd0csU0FBQUEsRUFDQUMsVUFBQUEsR0FHQXpHLEVBQUFuOUQsS0FBQW1ELE1BQUFnNkQsR0FJQXlHLEVBQUFsakUsR0FBQWtqRSxFQUFBLEVBQUEsRUFBQTVqRSxLQUFBQyxJQUlBLE1BQUF3NUMsRUFBQSxHQUNBNkMsRUFBQSxHQUNBQyxFQUFBLEdBQ0FzbkIsRUFBQSxHQUNBdnFCLEVBQUEsR0FJQXdxQixFQUFBLEVBQUEzRyxFQUNBNEcsRUFBQSxJQUFBcmpELEdBQ0E3SSxFQUFBLElBQUFyUyxHQUNBcWQsRUFBQSxJQUFBbkMsR0FDQXNqRCxFQUFBLElBQUF0akQsR0FDQXVqRCxFQUFBLElBQUF2akQsR0FDQSxJQUFBbFksRUFBQSxFQUNBQyxFQUFBLEVBSUEsSUFBQSxJQUFBc2YsRUFBQSxFQUFBQSxHQUFBMUQsRUFBQTFrQixPQUFBLEVBQUFvb0IsSUFFQSxPQUFBQSxHQUVBLEtBQUEsRUFFQXZmLEVBQUE2YixFQUFBMEQsRUFBQSxHQUFBN21CLEVBQUFtakIsRUFBQTBELEdBQUE3bUIsRUFDQXVILEVBQUE0YixFQUFBMEQsRUFBQSxHQUFBNW1CLEVBQUFrakIsRUFBQTBELEdBQUE1bUIsRUFFQTBoQixFQUFBM2hCLEVBQUEsRUFBQXVILEVBQ0FvYSxFQUFBMWhCLEdBQUFxSCxFQUNBcWEsRUFBQTdLLEVBQUEsRUFBQXZQLEVBRUF3N0QsRUFBQTc5RCxLQUFBeWMsR0FFQUEsRUFBQTlnQixZQUVBOGhFLEVBQUEva0UsS0FBQStqQixFQUFBM2hCLEVBQUEyaEIsRUFBQTFoQixFQUFBMGhCLEVBQUE3SyxHQUVBLE1BRUEsS0FBQXFNLEVBQUExa0IsT0FBQSxFQUVBa2tFLEVBQUEva0UsS0FBQW1sRSxFQUFBL2lFLEVBQUEraUUsRUFBQTlpRSxFQUFBOGlFLEVBQUFqc0QsR0FFQSxNQUVBLFFBRUF4UCxFQUFBNmIsRUFBQTBELEVBQUEsR0FBQTdtQixFQUFBbWpCLEVBQUEwRCxHQUFBN21CLEVBQ0F1SCxFQUFBNGIsRUFBQTBELEVBQUEsR0FBQTVtQixFQUFBa2pCLEVBQUEwRCxHQUFBNW1CLEVBRUEwaEIsRUFBQTNoQixFQUFBLEVBQUF1SCxFQUNBb2EsRUFBQTFoQixHQUFBcUgsRUFDQXFhLEVBQUE3SyxFQUFBLEVBQUF2UCxFQUVBdTdELEVBQUE1OUQsS0FBQXljLEdBRUFBLEVBQUEzaEIsR0FBQStpRSxFQUFBL2lFLEVBQ0EyaEIsRUFBQTFoQixHQUFBOGlFLEVBQUE5aUUsRUFDQTBoQixFQUFBN0ssR0FBQWlzRCxFQUFBanNELEVBRUE2SyxFQUFBOWdCLFlBRUE4aEUsRUFBQS9rRSxLQUFBK2pCLEVBQUEzaEIsRUFBQTJoQixFQUFBMWhCLEVBQUEwaEIsRUFBQTdLLEdBRUFpc0QsRUFBQTc5RCxLQUFBNDlELEdBUUEsSUFBQSxJQUFBdmtFLEVBQUEsRUFBQUEsR0FBQTA5RCxFQUFBMTlELElBQUEsQ0FFQSxNQUFBeWpCLEVBQUF5Z0QsRUFBQWxrRSxFQUFBcWtFLEVBQUFGLEVBRUFoL0QsRUFBQTVFLEtBQUE0RSxJQUFBc2UsR0FDQXZlLEVBQUEzRSxLQUFBMkUsSUFBQXVlLEdBRUEsSUFBQSxJQUFBNkUsRUFBQSxFQUFBQSxHQUFBMUQsRUFBQTFrQixPQUFBLEVBQUFvb0IsSUFBQSxDQUlBZzhDLEVBQUE3aUUsRUFBQW1qQixFQUFBMEQsR0FBQTdtQixFQUFBMEQsRUFDQW0vRCxFQUFBNWlFLEVBQUFrakIsRUFBQTBELEdBQUE1bUIsRUFDQTRpRSxFQUFBL3JELEVBQUFxTSxFQUFBMEQsR0FBQTdtQixFQUFBeUQsRUFFQTIzQyxFQUFBeDlDLEtBQUFpbEUsRUFBQTdpRSxFQUFBNmlFLEVBQUE1aUUsRUFBQTRpRSxFQUFBL3JELEdBSUFILEVBQUEzVyxFQUFBekIsRUFBQTA5RCxFQUNBdGxELEVBQUExVyxFQUFBNG1CLEdBQUExRCxFQUFBMWtCLE9BQUEsR0FFQTQ4QyxFQUFBejlDLEtBQUErWSxFQUFBM1csRUFBQTJXLEVBQUExVyxHQUlBLE1BQUFELEVBQUEyaUUsRUFBQSxFQUFBOTdDLEVBQUEsR0FBQW5qQixFQUNBekQsRUFBQTBpRSxFQUFBLEVBQUE5N0MsRUFBQSxHQUNBL1AsRUFBQTZyRCxFQUFBLEVBQUE5N0MsRUFBQSxHQUFBcGpCLEVBRUEyMEMsRUFBQXg2QyxLQUFBb0MsRUFBQUMsRUFBQTZXLEVBRUEsQ0FFQSxDQUlBLElBQUEsSUFBQXZZLEVBQUEsRUFBQUEsRUFBQTA5RCxFQUFBMTlELElBRUEsSUFBQSxJQUFBc29CLEVBQUEsRUFBQUEsRUFBQTFELEVBQUExa0IsT0FBQSxFQUFBb29CLElBQUEsQ0FFQSxNQUFBbThDLEVBQUFuOEMsRUFBQXRvQixFQUFBNGtCLEVBQUExa0IsT0FFQTRFLEVBQUEyL0QsRUFDQTEvRCxFQUFBMC9ELEVBQUE3L0MsRUFBQTFrQixPQUNBOEUsRUFBQXkvRCxFQUFBNy9DLEVBQUExa0IsT0FBQSxFQUNBNE0sRUFBQTIzRCxFQUFBLEVBSUF6cUIsRUFBQTM2QyxLQUFBeUYsRUFBQUMsRUFBQStILEdBQ0FrdEMsRUFBQTM2QyxLQUFBMkYsRUFBQThILEVBQUEvSCxFQUVBLENBTUE5RixLQUFBODNDLFNBQUFpRCxHQUNBLzZDLEtBQUFpNEMsYUFBQSxXQUFBLElBQUFwQixHQUFBK0csRUFBQSxJQUNBNTlDLEtBQUFpNEMsYUFBQSxLQUFBLElBQUFwQixHQUFBZ0gsRUFBQSxJQUNBNzlDLEtBQUFpNEMsYUFBQSxTQUFBLElBQUFwQixHQUFBK0QsRUFBQSxHQUVBLENBRUEsSUFBQWx6QyxDQUFBK1AsR0FNQSxPQUpBRixNQUFBN1AsS0FBQStQLEdBRUF6WCxLQUFBeThCLFdBQUFscEIsT0FBQUMsT0FBQSxDQUFBLEVBQUFpRSxFQUFBZ2xCLFlBRUF6OEIsSUFFQSxDQVNBLGVBQUFnL0MsQ0FBQXpwQyxHQUVBLE9BQUEsSUFBQXl2RCxHQUFBenZELEVBQUFvUSxPQUFBcFEsRUFBQWtwRCxTQUFBbHBELEVBQUEwdkQsU0FBQTF2RCxFQUFBMnZELFVBRUEsRUNoTkEsTUFBQU8sV0FBQVQsR0FVQSxXQUFBcGlFLENBQUEyaEIsRUFBQSxFQUFBdGpCLEVBQUEsRUFBQXlrRSxFQUFBLEVBQUFDLEVBQUEsR0FFQSxNQUFBQyxFQUFBLElBQUFoQyxHQUNBZ0MsRUFBQWpCLE9BQUEsR0FBQTFqRSxFQUFBLEVBQUFzakIsRUFBQSxJQUFBampCLEtBQUFDLEdBQUEsR0FDQXFrRSxFQUFBakIsT0FBQSxFQUFBMWpFLEVBQUEsRUFBQXNqQixFQUFBLEVBQUEsR0FBQWpqQixLQUFBQyxJQUVBZ1csTUFBQXF1RCxFQUFBdEksVUFBQW9JLEdBQUFDLEdBRUEzbEUsS0FBQUgsS0FBQSxrQkFTQUcsS0FBQXk4QixXQUFBLENBQ0FsWSxPQUFBQSxFQUNBdGpCLE9BQUFBLEVBQ0F5a0UsWUFBQUEsRUFDQUMsZUFBQUEsRUFHQSxDQVNBLGVBQUEzbUIsQ0FBQXpwQyxHQUVBLE9BQUEsSUFBQWt3RCxHQUFBbHdELEVBQUFnUCxPQUFBaFAsRUFBQXRVLE9BQUFzVSxFQUFBbXdELFlBQUFud0QsRUFBQW93RCxlQUVBLEVDeENBLE1BQUFFLFdBQUF4dUIsR0FXQSxXQUFBejBDLENBQUEyaEIsRUFBQSxFQUFBazZDLEVBQUEsR0FBQXFILEVBQUEsRUFBQUMsRUFBQSxFQUFBemtFLEtBQUFDLElBRUFnVyxRQUVBdlgsS0FBQUgsS0FBQSxpQkFTQUcsS0FBQXk4QixXQUFBLENBQ0FsWSxPQUFBQSxFQUNBazZDLFNBQUFBLEVBQ0FxSCxXQUFBQSxFQUNBQyxZQUFBQSxHQUdBdEgsRUFBQW45RCxLQUFBYSxJQUFBLEVBQUFzOEQsR0FJQSxNQUFBMWpCLEVBQUEsR0FDQTZDLEVBQUEsR0FDQWhELEVBQUEsR0FDQWlELEVBQUEsR0FJQXduQixFQUFBLElBQUFyakQsR0FDQTdJLEVBQUEsSUFBQXJTLEdBSUE4MkMsRUFBQXg5QyxLQUFBLEVBQUEsRUFBQSxHQUNBdzZDLEVBQUF4NkMsS0FBQSxFQUFBLEVBQUEsR0FDQXk5QyxFQUFBejlDLEtBQUEsR0FBQSxJQUVBLElBQUEsSUFBQTBFLEVBQUEsRUFBQS9ELEVBQUEsRUFBQStELEdBQUEyNUQsRUFBQTM1RCxJQUFBL0QsR0FBQSxFQUFBLENBRUEsTUFBQWlsRSxFQUFBRixFQUFBaGhFLEVBQUEyNUQsRUFBQXNILEVBSUFWLEVBQUE3aUUsRUFBQStoQixFQUFBampCLEtBQUEyRSxJQUFBKy9ELEdBQ0FYLEVBQUE1aUUsRUFBQThoQixFQUFBampCLEtBQUE0RSxJQUFBOC9ELEdBRUFwb0IsRUFBQXg5QyxLQUFBaWxFLEVBQUE3aUUsRUFBQTZpRSxFQUFBNWlFLEVBQUE0aUUsRUFBQS9yRCxHQUlBc2hDLEVBQUF4NkMsS0FBQSxFQUFBLEVBQUEsR0FJQStZLEVBQUEzVyxHQUFBbzdDLEVBQUE3OEMsR0FBQXdqQixFQUFBLEdBQUEsRUFDQXBMLEVBQUExVyxHQUFBbTdDLEVBQUE3OEMsRUFBQSxHQUFBd2pCLEVBQUEsR0FBQSxFQUVBczVCLEVBQUF6OUMsS0FBQStZLEVBQUEzVyxFQUFBMlcsRUFBQTFXLEVBRUEsQ0FJQSxJQUFBLElBQUExQixFQUFBLEVBQUFBLEdBQUEwOUQsRUFBQTE5RCxJQUVBZzZDLEVBQUEzNkMsS0FBQVcsRUFBQUEsRUFBQSxFQUFBLEdBTUFmLEtBQUE4M0MsU0FBQWlELEdBQ0EvNkMsS0FBQWk0QyxhQUFBLFdBQUEsSUFBQXBCLEdBQUErRyxFQUFBLElBQ0E1OUMsS0FBQWk0QyxhQUFBLFNBQUEsSUFBQXBCLEdBQUErRCxFQUFBLElBQ0E1NkMsS0FBQWk0QyxhQUFBLEtBQUEsSUFBQXBCLEdBQUFnSCxFQUFBLEdBRUEsQ0FFQSxJQUFBbjJDLENBQUErUCxHQU1BLE9BSkFGLE1BQUE3UCxLQUFBK1AsR0FFQXpYLEtBQUF5OEIsV0FBQWxwQixPQUFBQyxPQUFBLENBQUEsRUFBQWlFLEVBQUFnbEIsWUFFQXo4QixJQUVBLENBU0EsZUFBQWcvQyxDQUFBenBDLEdBRUEsT0FBQSxJQUFBc3dELEdBQUF0d0QsRUFBQWdQLE9BQUFoUCxFQUFBa3BELFNBQUFscEQsRUFBQXV3RCxXQUFBdndELEVBQUF3d0QsWUFFQSxFQ3RIQSxNQUFBRSxXQUFBNXVCLEdBZUEsV0FBQXowQyxDQUFBc2pFLEVBQUEsRUFBQUMsRUFBQSxFQUFBai9ELEVBQUEsRUFBQXkrRCxFQUFBLEdBQUFsb0IsRUFBQSxFQUFBMm9CLEdBQUEsRUFBQU4sRUFBQSxFQUFBQyxFQUFBLEVBQUF6a0UsS0FBQUMsSUFFQWdXLFFBRUF2WCxLQUFBSCxLQUFBLG1CQVNBRyxLQUFBeThCLFdBQUEsQ0FDQXlwQyxVQUFBQSxFQUNBQyxhQUFBQSxFQUNBai9ELE9BQUFBLEVBQ0F5K0QsZUFBQUEsRUFDQWxvQixlQUFBQSxFQUNBMm9CLFVBQUFBLEVBQ0FOLFdBQUFBLEVBQ0FDLFlBQUFBLEdBR0EsTUFBQXBvQixFQUFBMzlDLEtBRUEybEUsRUFBQXJrRSxLQUFBbUQsTUFBQWtoRSxHQUNBbG9CLEVBQUFuOEMsS0FBQW1ELE1BQUFnNUMsR0FJQSxNQUFBMUMsRUFBQSxHQUNBNkMsRUFBQSxHQUNBaEQsRUFBQSxHQUNBaUQsRUFBQSxHQUlBLElBQUFyOUMsRUFBQSxFQUNBLE1BQUFpMUQsRUFBQSxHQUNBNFEsRUFBQW4vRCxFQUFBLEVBQ0EsSUFBQTYyQyxFQUFBLEVBMEhBLFNBQUF1b0IsRUFBQS96QyxHQUdBLE1BQUFnMEMsRUFBQS9sRSxFQUVBMlksRUFBQSxJQUFBclMsR0FDQXUrRCxFQUFBLElBQUFyakQsR0FFQSxJQUFBNjhCLEVBQUEsRUFFQSxNQUFBdDZCLEdBQUEsSUFBQWdPLEVBQUEyekMsRUFBQUMsRUFDQTc0QyxHQUFBLElBQUFpRixFQUFBLEdBQUEsRUFNQSxJQUFBLElBQUEvdkIsRUFBQSxFQUFBQSxHQUFBbWpFLEVBQUFuakUsSUFJQW83QyxFQUFBeDlDLEtBQUEsRUFBQWltRSxFQUFBLzRDLEVBQUEsR0FJQXN0QixFQUFBeDZDLEtBQUEsRUFBQWt0QixFQUFBLEdBSUF1d0IsRUFBQXo5QyxLQUFBLEdBQUEsSUFJQUksSUFLQSxNQUFBZ21FLEVBQUFobUUsRUFJQSxJQUFBLElBQUFnQyxFQUFBLEVBQUFBLEdBQUFtakUsRUFBQW5qRSxJQUFBLENBRUEsTUFDQWtILEVBREFsSCxFQUFBbWpFLEVBQ0FJLEVBQUFELEVBRUFXLEVBQUFubEUsS0FBQTJFLElBQUF5RCxHQUNBZzlELEVBQUFwbEUsS0FBQTRFLElBQUF3RCxHQUlBMjdELEVBQUE3aUUsRUFBQStoQixFQUFBbWlELEVBQ0FyQixFQUFBNWlFLEVBQUE0akUsRUFBQS80QyxFQUNBKzNDLEVBQUEvckQsRUFBQWlMLEVBQUFraUQsRUFDQTdvQixFQUFBeDlDLEtBQUFpbEUsRUFBQTdpRSxFQUFBNmlFLEVBQUE1aUUsRUFBQTRpRSxFQUFBL3JELEdBSUFzaEMsRUFBQXg2QyxLQUFBLEVBQUFrdEIsRUFBQSxHQUlBblUsRUFBQTNXLEVBQUEsR0FBQWlrRSxFQUFBLEdBQ0F0dEQsRUFBQTFXLEVBQUEsR0FBQWlrRSxFQUFBcDVDLEVBQUEsR0FDQXV3QixFQUFBejlDLEtBQUErWSxFQUFBM1csRUFBQTJXLEVBQUExVyxHQUlBakMsR0FFQSxDQUlBLElBQUEsSUFBQWdDLEVBQUEsRUFBQUEsRUFBQW1qRSxFQUFBbmpFLElBQUEsQ0FFQSxNQUFBdUQsRUFBQXdnRSxFQUFBL2pFLEVBQ0F6QixFQUFBeWxFLEVBQUFoa0UsR0FFQSxJQUFBK3ZCLEVBSUF3b0IsRUFBQTM2QyxLQUFBVyxFQUFBQSxFQUFBLEVBQUFnRixHQU1BZzFDLEVBQUEzNkMsS0FBQVcsRUFBQSxFQUFBQSxFQUFBZ0YsR0FJQTg0QyxHQUFBLENBRUEsQ0FJQWxCLEVBQUF2RixTQUFBMkYsRUFBQWMsR0FBQSxJQUFBdHNCLEVBQUEsRUFBQSxHQUlBd3JCLEdBQUFjLENBRUEsRUFoTkEsV0FFQSxNQUFBMTZCLEVBQUEsSUFBQW5DLEdBQ0FxakQsRUFBQSxJQUFBcmpELEdBRUEsSUFBQTY4QixFQUFBLEVBR0EsTUFBQThuQixHQUFBUixFQUFBRCxHQUFBaC9ELEVBSUEsSUFBQSxJQUFBekUsRUFBQSxFQUFBQSxHQUFBZzdDLEVBQUFoN0MsSUFBQSxDQUVBLE1BQUFta0UsRUFBQSxHQUVBai9ELEVBQUFsRixFQUFBZzdDLEVBSUFsNUIsRUFBQTVjLEdBQUF3K0QsRUFBQUQsR0FBQUEsRUFFQSxJQUFBLElBQUExakUsRUFBQSxFQUFBQSxHQUFBbWpFLEVBQUFuakUsSUFBQSxDQUVBLE1BQUF5aUIsRUFBQXppQixFQUFBbWpFLEVBRUFqOEQsRUFBQXViLEVBQUE4Z0QsRUFBQUQsRUFFQVksRUFBQXBsRSxLQUFBNEUsSUFBQXdELEdBQ0ErOEQsRUFBQW5sRSxLQUFBMkUsSUFBQXlELEdBSUEyN0QsRUFBQTdpRSxFQUFBK2hCLEVBQUFtaUQsRUFDQXJCLEVBQUE1aUUsR0FBQWtGLEVBQUFULEVBQUFtL0QsRUFDQWhCLEVBQUEvckQsRUFBQWlMLEVBQUFraUQsRUFDQTdvQixFQUFBeDlDLEtBQUFpbEUsRUFBQTdpRSxFQUFBNmlFLEVBQUE1aUUsRUFBQTRpRSxFQUFBL3JELEdBSUE2SyxFQUFBeGQsSUFBQSsvRCxFQUFBQyxFQUFBRixHQUFBcGpFLFlBQ0F1M0MsRUFBQXg2QyxLQUFBK2pCLEVBQUEzaEIsRUFBQTJoQixFQUFBMWhCLEVBQUEwaEIsRUFBQTdLLEdBSUF1a0MsRUFBQXo5QyxLQUFBNmtCLEVBQUEsRUFBQXRkLEdBSUFpL0QsRUFBQXhtRSxLQUFBSSxJQUVBLENBSUFpMUQsRUFBQXIxRCxLQUFBd21FLEVBRUEsQ0FJQSxJQUFBLElBQUFwa0UsRUFBQSxFQUFBQSxFQUFBbWpFLEVBQUFuakUsSUFFQSxJQUFBLElBQUFDLEVBQUEsRUFBQUEsRUFBQWc3QyxFQUFBaDdDLElBQUEsQ0FJQSxNQUFBb0QsRUFBQTR2RCxFQUFBaHpELEdBQUFELEdBQ0FzRCxFQUFBMnZELEVBQUFoekQsRUFBQSxHQUFBRCxHQUNBdUQsRUFBQTB2RCxFQUFBaHpELEVBQUEsR0FBQUQsRUFBQSxHQUNBcUwsRUFBQTRuRCxFQUFBaHpELEdBQUFELEVBQUEsSUFJQTBqRSxFQUFBLEdBQUEsSUFBQXpqRSxLQUVBczRDLEVBQUEzNkMsS0FBQXlGLEVBQUFDLEVBQUErSCxHQUNBZ3hDLEdBQUEsSUFJQXNuQixFQUFBLEdBQUExakUsSUFBQWc3QyxFQUFBLEtBRUExQyxFQUFBMzZDLEtBQUEwRixFQUFBQyxFQUFBOEgsR0FDQWd4QyxHQUFBLEVBSUEsQ0FNQWxCLEVBQUF2RixTQUFBMkYsRUFBQWMsRUFBQSxHQUlBZCxHQUFBYyxDQUVBLENBcEhBZ29CLElBRUEsSUFBQVQsSUFFQUYsRUFBQSxHQUFBSSxHQUFBLEdBQ0FILEVBQUEsR0FBQUcsR0FBQSxJQU1BdG1FLEtBQUE4M0MsU0FBQWlELEdBQ0EvNkMsS0FBQWk0QyxhQUFBLFdBQUEsSUFBQXBCLEdBQUErRyxFQUFBLElBQ0E1OUMsS0FBQWk0QyxhQUFBLFNBQUEsSUFBQXBCLEdBQUErRCxFQUFBLElBQ0E1NkMsS0FBQWk0QyxhQUFBLEtBQUEsSUFBQXBCLEdBQUFnSCxFQUFBLEdBb05BLENBRUEsSUFBQW4yQyxDQUFBK1AsR0FNQSxPQUpBRixNQUFBN1AsS0FBQStQLEdBRUF6WCxLQUFBeThCLFdBQUFscEIsT0FBQUMsT0FBQSxDQUFBLEVBQUFpRSxFQUFBZ2xCLFlBRUF6OEIsSUFFQSxDQVNBLGVBQUFnL0MsQ0FBQXpwQyxHQUVBLE9BQUEsSUFBQTB3RCxHQUFBMXdELEVBQUEyd0QsVUFBQTN3RCxFQUFBNHdELGFBQUE1d0QsRUFBQXJPLE9BQUFxTyxFQUFBb3dELGVBQUFwd0QsRUFBQWtvQyxlQUFBbG9DLEVBQUE2d0QsVUFBQTd3RCxFQUFBdXdELFdBQUF2d0QsRUFBQXd3RCxZQUVBLEVDeFRBLE1BQUFlLFdBQUFiLEdBY0EsV0FBQXJqRSxDQUFBMmhCLEVBQUEsRUFBQXJkLEVBQUEsRUFBQXkrRCxFQUFBLEdBQUFsb0IsRUFBQSxFQUFBMm9CLEdBQUEsRUFBQU4sRUFBQSxFQUFBQyxFQUFBLEVBQUF6a0UsS0FBQUMsSUFFQWdXLE1BQUEsRUFBQWdOLEVBQUFyZCxFQUFBeStELEVBQUFsb0IsRUFBQTJvQixFQUFBTixFQUFBQyxHQUVBL2xFLEtBQUFILEtBQUEsZUFTQUcsS0FBQXk4QixXQUFBLENBQ0FsWSxPQUFBQSxFQUNBcmQsT0FBQUEsRUFDQXkrRCxlQUFBQSxFQUNBbG9CLGVBQUFBLEVBQ0Eyb0IsVUFBQUEsRUFDQU4sV0FBQUEsRUFDQUMsWUFBQUEsRUFHQSxDQVNBLGVBQUEvbUIsQ0FBQXpwQyxHQUVBLE9BQUEsSUFBQXV4RCxHQUFBdnhELEVBQUFnUCxPQUFBaFAsRUFBQXJPLE9BQUFxTyxFQUFBb3dELGVBQUFwd0QsRUFBQWtvQyxlQUFBbG9DLEVBQUE2d0QsVUFBQTd3RCxFQUFBdXdELFdBQUF2d0QsRUFBQXd3RCxZQUVBLEVDcERBLE1BQUFnQixXQUFBMXZCLEdBVUEsV0FBQXowQyxDQUFBZzdDLEVBQUEsR0FBQTdDLEVBQUEsR0FBQXgyQixFQUFBLEVBQUFra0MsRUFBQSxHQUVBbHhDLFFBRUF2WCxLQUFBSCxLQUFBLHFCQVNBRyxLQUFBeThCLFdBQUEsQ0FDQW1oQixTQUFBQSxFQUNBN0MsUUFBQUEsRUFDQXgyQixPQUFBQSxFQUNBa2tDLE9BQUFBLEdBS0EsTUFBQXVlLEVBQUEsR0FDQUMsRUFBQSxHQXdEQSxTQUFBQyxFQUFBcmhFLEVBQUFDLEVBQUFDLEVBQUEwaUQsR0FFQSxNQUFBMGUsRUFBQTFlLEVBQUEsRUFJQTlnRCxFQUFBLEdBSUEsSUFBQSxJQUFBNUcsRUFBQSxFQUFBQSxHQUFBb21FLEVBQUFwbUUsSUFBQSxDQUVBNEcsRUFBQTVHLEdBQUEsR0FFQSxNQUFBcW1FLEVBQUF2aEUsRUFBQTRCLFFBQUFsRixLQUFBd0QsRUFBQWhGLEVBQUFvbUUsR0FDQUUsRUFBQXZoRSxFQUFBMkIsUUFBQWxGLEtBQUF3RCxFQUFBaEYsRUFBQW9tRSxHQUVBRyxFQUFBSCxFQUFBcG1FLEVBRUEsSUFBQSxJQUFBc29CLEVBQUEsRUFBQUEsR0FBQWkrQyxFQUFBaitDLElBSUExaEIsRUFBQTVHLEdBQUFzb0IsR0FGQSxJQUFBQSxHQUFBdG9CLElBQUFvbUUsRUFFQUMsRUFJQUEsRUFBQTMvRCxRQUFBbEYsS0FBQThrRSxFQUFBaCtDLEVBQUFpK0MsRUFNQSxDQUlBLElBQUEsSUFBQXZtRSxFQUFBLEVBQUFBLEVBQUFvbUUsRUFBQXBtRSxJQUVBLElBQUEsSUFBQXNvQixFQUFBLEVBQUFBLEVBQUEsR0FBQTg5QyxFQUFBcG1FLEdBQUEsRUFBQXNvQixJQUFBLENBRUEsTUFBQTgzQyxFQUFBNy9ELEtBQUFtRCxNQUFBNGtCLEVBQUEsR0FFQUEsRUFBQSxHQUFBLEdBRUFrK0MsRUFBQTUvRCxFQUFBNUcsR0FBQW9nRSxFQUFBLElBQ0FvRyxFQUFBNS9ELEVBQUE1RyxFQUFBLEdBQUFvZ0UsSUFDQW9HLEVBQUE1L0QsRUFBQTVHLEdBQUFvZ0UsTUFJQW9HLEVBQUE1L0QsRUFBQTVHLEdBQUFvZ0UsRUFBQSxJQUNBb0csRUFBQTUvRCxFQUFBNUcsRUFBQSxHQUFBb2dFLEVBQUEsSUFDQW9HLEVBQUE1L0QsRUFBQTVHLEVBQUEsR0FBQW9nRSxJQUlBLENBSUEsQ0EyRUEsU0FBQW9HLEVBQUFsQyxHQUVBMkIsRUFBQTVtRSxLQUFBaWxFLEVBQUE3aUUsRUFBQTZpRSxFQUFBNWlFLEVBQUE0aUUsRUFBQS9yRCxFQUVBLENBRUEsU0FBQWt1RCxFQUFBaG5FLEVBQUE2a0UsR0FFQSxNQUFBbnFCLEVBQUEsRUFBQTE2QyxFQUVBNmtFLEVBQUE3aUUsRUFBQW83QyxFQUFBMUMsRUFBQSxHQUNBbXFCLEVBQUE1aUUsRUFBQW03QyxFQUFBMUMsRUFBQSxHQUNBbXFCLEVBQUEvckQsRUFBQXNrQyxFQUFBMUMsRUFBQSxFQUVBLENBb0NBLFNBQUF1c0IsRUFBQXR1RCxFQUFBK2hDLEVBQUF6MEIsRUFBQWloRCxHQUVBQSxFQUFBLEdBQUEsSUFBQXZ1RCxFQUFBM1csSUFFQXlrRSxFQUFBL3JCLEdBQUEvaEMsRUFBQTNXLEVBQUEsR0FJQSxJQUFBaWtCLEVBQUFqa0IsR0FBQSxJQUFBaWtCLEVBQUFuTixJQUVBMnRELEVBQUEvckIsR0FBQXdzQixFQUFBLEVBQUFwbUUsS0FBQUMsR0FBQSxHQUlBLENBSUEsU0FBQW1tRSxFQUFBamhELEdBRUEsT0FBQW5sQixLQUFBaUksTUFBQWtkLEVBQUFuTixHQUFBbU4sRUFBQWprQixFQUVBLEVBeE9BLFNBQUFpbUQsR0FFQSxNQUFBNWlELEVBQUEsSUFBQW1jLEdBQ0FsYyxFQUFBLElBQUFrYyxHQUNBamMsRUFBQSxJQUFBaWMsR0FJQSxJQUFBLElBQUFqaEIsRUFBQSxFQUFBQSxFQUFBZzZDLEVBQUE5NUMsT0FBQUYsR0FBQSxFQUlBeW1FLEVBQUF6c0IsRUFBQWg2QyxFQUFBLEdBQUE4RSxHQUNBMmhFLEVBQUF6c0IsRUFBQWg2QyxFQUFBLEdBQUErRSxHQUNBMGhFLEVBQUF6c0IsRUFBQWg2QyxFQUFBLEdBQUFnRixHQUlBbWhFLEVBQUFyaEUsRUFBQUMsRUFBQUMsRUFBQTBpRCxFQUlBLENBbERBa2YsQ0FBQWxmLEdBbUhBLFNBQUFsa0MsR0FFQSxNQUFBOGdELEVBQUEsSUFBQXJqRCxHQUlBLElBQUEsSUFBQWpoQixFQUFBLEVBQUFBLEVBQUFpbUUsRUFBQS9sRSxPQUFBRixHQUFBLEVBRUFza0UsRUFBQTdpRSxFQUFBd2tFLEVBQUFqbUUsRUFBQSxHQUNBc2tFLEVBQUE1aUUsRUFBQXVrRSxFQUFBam1FLEVBQUEsR0FDQXNrRSxFQUFBL3JELEVBQUEwdEQsRUFBQWptRSxFQUFBLEdBRUFza0UsRUFBQWhpRSxZQUFBK0UsZUFBQW1jLEdBRUF5aUQsRUFBQWptRSxFQUFBLEdBQUFza0UsRUFBQTdpRSxFQUNBd2tFLEVBQUFqbUUsRUFBQSxHQUFBc2tFLEVBQUE1aUUsRUFDQXVrRSxFQUFBam1FLEVBQUEsR0FBQXNrRSxFQUFBL3JELENBSUEsQ0FuSUFzdUQsQ0FBQXJqRCxHQXFJQSxXQUVBLE1BQUE4Z0QsRUFBQSxJQUFBcmpELEdBRUEsSUFBQSxJQUFBamhCLEVBQUEsRUFBQUEsRUFBQWltRSxFQUFBL2xFLE9BQUFGLEdBQUEsRUFBQSxDQUVBc2tFLEVBQUE3aUUsRUFBQXdrRSxFQUFBam1FLEVBQUEsR0FDQXNrRSxFQUFBNWlFLEVBQUF1a0UsRUFBQWptRSxFQUFBLEdBQ0Fza0UsRUFBQS9yRCxFQUFBMHRELEVBQUFqbUUsRUFBQSxHQUVBLE1BQUFra0IsRUFBQXlpRCxFQUFBckMsR0FBQSxFQUFBL2pFLEtBQUFDLEdBQUEsR0FDQW9HLEdBcUhBOGUsRUFySEE0K0MsRUF1SEEvakUsS0FBQWlJLE9BQUFrZCxFQUFBaGtCLEVBQUFuQixLQUFBOEgsS0FBQXFkLEVBQUFqa0IsRUFBQWlrQixFQUFBamtCLEVBQUFpa0IsRUFBQW5OLEVBQUFtTixFQUFBbk4sSUF2SEFoWSxLQUFBQyxHQUFBLElBQ0EwbEUsRUFBQTdtRSxLQUFBNmtCLEVBQUEsRUFBQXRkLEVBRUEsQ0FrSEEsSUFBQThlLEdBN0RBLFdBRUEsTUFBQTVnQixFQUFBLElBQUFtYyxHQUNBbGMsRUFBQSxJQUFBa2MsR0FDQWpjLEVBQUEsSUFBQWljLEdBRUE2bEQsRUFBQSxJQUFBN2xELEdBRUF1M0IsRUFBQSxJQUFBenlDLEdBQ0EweUMsRUFBQSxJQUFBMXlDLEdBQ0EyeUMsRUFBQSxJQUFBM3lDLEdBRUEsSUFBQSxJQUFBL0YsRUFBQSxFQUFBc29CLEVBQUEsRUFBQXRvQixFQUFBaW1FLEVBQUEvbEUsT0FBQUYsR0FBQSxFQUFBc29CLEdBQUEsRUFBQSxDQUVBeGpCLEVBQUFjLElBQUFxZ0UsRUFBQWptRSxFQUFBLEdBQUFpbUUsRUFBQWptRSxFQUFBLEdBQUFpbUUsRUFBQWptRSxFQUFBLElBQ0ErRSxFQUFBYSxJQUFBcWdFLEVBQUFqbUUsRUFBQSxHQUFBaW1FLEVBQUFqbUUsRUFBQSxHQUFBaW1FLEVBQUFqbUUsRUFBQSxJQUNBZ0YsRUFBQVksSUFBQXFnRSxFQUFBam1FLEVBQUEsR0FBQWltRSxFQUFBam1FLEVBQUEsR0FBQWltRSxFQUFBam1FLEVBQUEsSUFFQXc0QyxFQUFBNXlDLElBQUFzZ0UsRUFBQTU5QyxFQUFBLEdBQUE0OUMsRUFBQTU5QyxFQUFBLElBQ0Ftd0IsRUFBQTd5QyxJQUFBc2dFLEVBQUE1OUMsRUFBQSxHQUFBNDlDLEVBQUE1OUMsRUFBQSxJQUNBb3dCLEVBQUE5eUMsSUFBQXNnRSxFQUFBNTlDLEVBQUEsR0FBQTQ5QyxFQUFBNTlDLEVBQUEsSUFFQXcrQyxFQUFBbmdFLEtBQUE3QixHQUFBK0IsSUFBQTlCLEdBQUE4QixJQUFBN0IsR0FBQXVDLGFBQUEsR0FFQSxNQUFBdy9ELEVBQUFKLEVBQUFHLEdBRUFKLEVBQUFsdUIsRUFBQWx3QixFQUFBLEVBQUF4akIsRUFBQWlpRSxHQUNBTCxFQUFBanVCLEVBQUFud0IsRUFBQSxFQUFBdmpCLEVBQUFnaUUsR0FDQUwsRUFBQWh1QixFQUFBcHdCLEVBQUEsRUFBQXRqQixFQUFBK2hFLEVBRUEsQ0FFQSxFQW5GQUMsR0FNQSxXQUlBLElBQUEsSUFBQWhuRSxFQUFBLEVBQUFBLEVBQUFrbUUsRUFBQWhtRSxPQUFBRixHQUFBLEVBQUEsQ0FJQSxNQUFBb2QsRUFBQThvRCxFQUFBbG1FLEVBQUEsR0FDQXdkLEVBQUEwb0QsRUFBQWxtRSxFQUFBLEdBQ0Ewd0IsRUFBQXcxQyxFQUFBbG1FLEVBQUEsR0FFQW9CLEVBQUFiLEtBQUFhLElBQUFnYyxFQUFBSSxFQUFBa1QsR0FDQXZ2QixFQUFBWixLQUFBWSxJQUFBaWMsRUFBQUksRUFBQWtULEdBSUF0dkIsRUFBQSxJQUFBRCxFQUFBLEtBRUFpYyxFQUFBLEtBQUE4b0QsRUFBQWxtRSxFQUFBLElBQUEsR0FDQXdkLEVBQUEsS0FBQTBvRCxFQUFBbG1FLEVBQUEsSUFBQSxHQUNBMHdCLEVBQUEsS0FBQXcxQyxFQUFBbG1FLEVBQUEsSUFBQSxHQUlBLENBRUEsQ0EvQkFpbkUsRUFFQSxDQXJKQUMsR0FJQWpvRSxLQUFBaTRDLGFBQUEsV0FBQSxJQUFBcEIsR0FBQW13QixFQUFBLElBQ0FobkUsS0FBQWk0QyxhQUFBLFNBQUEsSUFBQXBCLEdBQUFtd0IsRUFBQWxtRSxRQUFBLElBQ0FkLEtBQUFpNEMsYUFBQSxLQUFBLElBQUFwQixHQUFBb3dCLEVBQUEsSUFFQSxJQUFBeGUsRUFFQXpvRCxLQUFBazZDLHVCQUlBbDZDLEtBQUEyNkMsa0JBeVBBLENBRUEsSUFBQWp6QyxDQUFBK1AsR0FNQSxPQUpBRixNQUFBN1AsS0FBQStQLEdBRUF6WCxLQUFBeThCLFdBQUFscEIsT0FBQUMsT0FBQSxDQUFBLEVBQUFpRSxFQUFBZ2xCLFlBRUF6OEIsSUFFQSxDQVNBLGVBQUFnL0MsQ0FBQXpwQyxHQUVBLE9BQUEsSUFBQXd4RCxHQUFBeHhELEVBQUFxb0MsU0FBQXJvQyxFQUFBd2xDLFFBQUF4bEMsRUFBQWdQLE9BQUFoUCxFQUFBMnlELFFBRUEsRUN6VUEsTUFBQUMsV0FBQXBCLEdBUUEsV0FBQW5rRSxDQUFBMmhCLEVBQUEsRUFBQWtrQyxFQUFBLEdBRUEsTUFBQS9sRCxHQUFBLEVBQUFwQixLQUFBOEgsS0FBQSxJQUFBLEVBQ0F3RixFQUFBLEVBQUFsTSxFQXNDQTZVLE1BcENBLEVBR0EsR0FBQSxHQUFBLEdBQUEsR0FBQSxFQUFBLEdBQ0EsRUFBQSxHQUFBLEdBQUEsRUFBQSxFQUFBLEVBQ0EsR0FBQSxHQUFBLEVBQUEsR0FBQSxFQUFBLEVBQ0EsRUFBQSxHQUFBLEVBQUEsRUFBQSxFQUFBLEVBR0EsR0FBQTNJLEdBQUFsTSxFQUFBLEdBQUFrTSxFQUFBbE0sRUFDQSxFQUFBa00sR0FBQWxNLEVBQUEsRUFBQWtNLEVBQUFsTSxHQUdBa00sR0FBQWxNLEVBQUEsR0FBQWtNLEVBQUFsTSxFQUFBLEVBQ0FrTSxHQUFBbE0sRUFBQSxFQUFBa00sRUFBQWxNLEVBQUEsR0FHQUEsRUFBQSxHQUFBa00sRUFBQWxNLEVBQUEsR0FBQWtNLEdBQ0FsTSxFQUFBLEVBQUFrTSxFQUFBbE0sRUFBQSxFQUFBa00sR0FHQSxDQUNBLEVBQUEsR0FBQSxFQUFBLEVBQUEsRUFBQSxHQUFBLEVBQUEsR0FBQSxHQUNBLEVBQUEsR0FBQSxHQUFBLEVBQUEsR0FBQSxFQUFBLEVBQUEsRUFBQSxHQUNBLEdBQUEsRUFBQSxFQUFBLEdBQUEsRUFBQSxHQUFBLEdBQUEsR0FBQSxFQUNBLEVBQUEsRUFBQSxHQUFBLEVBQUEsR0FBQSxFQUFBLEVBQUEsRUFBQSxHQUNBLEVBQUEsR0FBQSxFQUFBLEVBQUEsRUFBQSxHQUFBLEVBQUEsR0FBQSxHQUNBLEVBQUEsR0FBQSxFQUFBLEVBQUEsRUFBQSxHQUFBLEVBQUEsR0FBQSxHQUNBLEVBQUEsR0FBQSxHQUFBLEVBQUEsR0FBQSxFQUFBLEVBQUEsRUFBQSxHQUNBLEdBQUEsRUFBQSxFQUFBLEdBQUEsRUFBQSxHQUFBLEdBQUEsR0FBQSxFQUNBLEVBQUEsR0FBQSxHQUFBLEVBQUEsR0FBQSxFQUFBLEVBQUEsRUFBQSxFQUNBLEdBQUEsRUFBQSxFQUFBLEdBQUEsRUFBQSxHQUFBLEdBQUEsR0FBQSxFQUNBLEdBQUEsRUFBQSxHQUFBLEdBQUEsR0FBQSxFQUFBLEdBQUEsRUFBQSxHQUNBLEVBQUEsR0FBQSxHQUFBLEVBQUEsR0FBQSxFQUFBLEVBQUEsRUFBQSxHQUdBMlYsRUFBQWtrQyxHQUVBem9ELEtBQUFILEtBQUEsdUJBU0FHLEtBQUF5OEIsV0FBQSxDQUNBbFksT0FBQUEsRUFDQWtrQyxPQUFBQSxFQUdBLENBU0EsZUFBQXpKLENBQUF6cEMsR0FFQSxPQUFBLElBQUE0eUQsR0FBQTV5RCxFQUFBZ1AsT0FBQWhQLEVBQUFrekMsT0FFQSxFQ3RGQSxNQUFBMmYsR0FBQSxJQUFBcG1ELEdBQ0FxbUQsR0FBQSxJQUFBcm1ELEdBQ0FzbUQsR0FBQSxJQUFBdG1ELEdBQ0F1bUQsR0FBQSxJQUFBbnFDLEdBZ0JBLE1BQUFvcUMsV0FBQW54QixHQVNBLFdBQUF6MEMsQ0FBQWdrQixFQUFBLEtBQUE2aEQsRUFBQSxHQWtCQSxHQWhCQWx4RCxRQUVBdlgsS0FBQUgsS0FBQSxnQkFTQUcsS0FBQXk4QixXQUFBLENBQ0E3VixTQUFBQSxFQUNBNmhELGVBQUFBLEdBR0EsT0FBQTdoRCxFQUFBLENBRUEsTUFBQThoRCxFQUFBLEVBQ0F2NkIsRUFBQTdzQyxLQUFBZ0UsSUFBQSxHQUFBb2pFLEdBQ0FDLEVBQUFybkUsS0FBQTJFLElBQUE1RSxHQUFBb25FLEdBRUFHLEVBQUFoaUQsRUFBQWl4QixXQUNBZ3hCLEVBQUFqaUQsRUFBQUUsYUFBQSxZQUNBbXdDLEVBQUEyUixFQUFBQSxFQUFBN3NELE1BQUE4c0QsRUFBQTlzRCxNQUVBK3NELEVBQUEsQ0FBQSxFQUFBLEVBQUEsR0FDQUMsRUFBQSxDQUFBLElBQUEsSUFBQSxLQUNBQyxFQUFBLElBQUExeUQsTUFBQSxHQUVBMnlELEVBQUEsQ0FBQSxFQUNBcnJCLEVBQUEsR0FDQSxJQUFBLElBQUE3OEMsRUFBQSxFQUFBQSxFQUFBazJELEVBQUFsMkQsR0FBQSxFQUFBLENBRUE2bkUsR0FFQUUsRUFBQSxHQUFBRixFQUFBaCtELEtBQUE3SixHQUNBK25FLEVBQUEsR0FBQUYsRUFBQWgrRCxLQUFBN0osRUFBQSxHQUNBK25FLEVBQUEsR0FBQUYsRUFBQWgrRCxLQUFBN0osRUFBQSxLQUlBK25FLEVBQUEsR0FBQS9uRSxFQUNBK25FLEVBQUEsR0FBQS9uRSxFQUFBLEVBQ0ErbkUsRUFBQSxHQUFBL25FLEVBQUEsR0FJQSxNQUFBOEUsRUFBQUEsRUFBQUMsRUFBQUEsRUFBQUMsRUFBQUEsR0FBQXdpRSxHQVlBLEdBWEExaUUsRUFBQTZFLG9CQUFBbStELEVBQUFDLEVBQUEsSUFDQWhqRSxFQUFBNEUsb0JBQUFtK0QsRUFBQUMsRUFBQSxJQUNBL2lFLEVBQUEyRSxvQkFBQW0rRCxFQUFBQyxFQUFBLElBQ0FQLEdBQUFscUMsVUFBQWlxQyxJQUdBVSxFQUFBLEdBQUEsR0FBQTFuRSxLQUFBZ0MsTUFBQXVDLEVBQUFyRCxFQUFBMnJDLE1BQUE3c0MsS0FBQWdDLE1BQUF1QyxFQUFBcEQsRUFBQTByQyxNQUFBN3NDLEtBQUFnQyxNQUFBdUMsRUFBQXlULEVBQUE2MEIsS0FDQTY2QixFQUFBLEdBQUEsR0FBQTFuRSxLQUFBZ0MsTUFBQXdDLEVBQUF0RCxFQUFBMnJDLE1BQUE3c0MsS0FBQWdDLE1BQUF3QyxFQUFBckQsRUFBQTByQyxNQUFBN3NDLEtBQUFnQyxNQUFBd0MsRUFBQXdULEVBQUE2MEIsS0FDQTY2QixFQUFBLEdBQUEsR0FBQTFuRSxLQUFBZ0MsTUFBQXlDLEVBQUF2RCxFQUFBMnJDLE1BQUE3c0MsS0FBQWdDLE1BQUF5QyxFQUFBdEQsRUFBQTByQyxNQUFBN3NDLEtBQUFnQyxNQUFBeUMsRUFBQXVULEVBQUE2MEIsS0FHQTY2QixFQUFBLEtBQUFBLEVBQUEsSUFBQUEsRUFBQSxLQUFBQSxFQUFBLElBQUFBLEVBQUEsS0FBQUEsRUFBQSxHQU9BLElBQUEsSUFBQTMvQyxFQUFBLEVBQUFBLEVBQUEsRUFBQUEsSUFBQSxDQUdBLE1BQUE2L0MsR0FBQTcvQyxFQUFBLEdBQUEsRUFDQTgvQyxFQUFBSCxFQUFBMy9DLEdBQ0ErL0MsRUFBQUosRUFBQUUsR0FDQS8vQyxFQUFBby9DLEdBQUFRLEVBQUExL0MsSUFDQWpmLEVBQUFtK0QsR0FBQVEsRUFBQUcsSUFFQUcsRUFBQSxHQUFBRixLQUFBQyxJQUNBRSxFQUFBLEdBQUFGLEtBQUFELElBRUFHLEtBQUFMLEdBQUFBLEVBQUFLLElBSUFoQixHQUFBci9ELElBQUFnZ0UsRUFBQUssR0FBQW5sRCxTQUFBd2tELElBRUEvcUIsRUFBQXg5QyxLQUFBK29CLEVBQUEzbUIsRUFBQTJtQixFQUFBMW1CLEVBQUEwbUIsRUFBQTdQLEdBQ0Fza0MsRUFBQXg5QyxLQUFBZ0ssRUFBQTVILEVBQUE0SCxFQUFBM0gsRUFBQTJILEVBQUFrUCxJQUlBMnZELEVBQUFLLEdBQUEsTUFFQUQsS0FBQUosSUFHQUEsRUFBQUksR0FBQSxDQUVBRSxPQUFBVCxFQUFBei9DLEdBQ0F1c0IsT0FBQWt6QixFQUFBSSxHQUNBL2tELE9BQUFta0QsR0FBQTdnRSxTQU1BLENBRUEsQ0FHQSxJQUFBLE1BQUE0MUIsS0FBQTRyQyxFQUVBLEdBQUFBLEVBQUE1ckMsR0FBQSxDQUVBLE1BQUFrc0MsT0FBQUEsRUFBQTN6QixPQUFBQSxHQUFBcXpCLEVBQUE1ckMsR0FDQStxQyxHQUFBMTlELG9CQUFBbStELEVBQUFVLEdBQ0FsQixHQUFBMzlELG9CQUFBbStELEVBQUFqekIsR0FFQWdJLEVBQUF4OUMsS0FBQWdvRSxHQUFBNWxFLEVBQUE0bEUsR0FBQTNsRSxFQUFBMmxFLEdBQUE5dUQsR0FDQXNrQyxFQUFBeDlDLEtBQUFpb0UsR0FBQTdsRSxFQUFBNmxFLEdBQUE1bEUsRUFBQTRsRSxHQUFBL3VELEVBRUEsQ0FJQXRaLEtBQUFpNEMsYUFBQSxXQUFBLElBQUFwQixHQUFBK0csRUFBQSxHQUVBLENBRUEsQ0FFQSxJQUFBbDJDLENBQUErUCxHQU1BLE9BSkFGLE1BQUE3UCxLQUFBK1AsR0FFQXpYLEtBQUF5OEIsV0FBQWxwQixPQUFBQyxPQUFBLENBQUEsRUFBQWlFLEVBQUFnbEIsWUFFQXo4QixJQUVBLEVDN0lBLE1BQUF3cEUsV0FBQTVGLEdBT0EsV0FBQWhoRSxDQUFBK2lCLEdBRUFwTyxNQUFBb08sR0FRQTNsQixLQUFBNFYsS0FBQW5VLEtBRUF6QixLQUFBSCxLQUFBLFFBU0FHLEtBQUF5cEUsTUFBQSxFQUVBLENBU0EsY0FBQUMsQ0FBQW5NLEdBRUEsTUFBQW9NLEVBQUEsR0FFQSxJQUFBLElBQUE1b0UsRUFBQSxFQUFBQyxFQUFBaEIsS0FBQXlwRSxNQUFBeG9FLE9BQUFGLEVBQUFDLEVBQUFELElBRUE0b0UsRUFBQTVvRSxHQUFBZixLQUFBeXBFLE1BQUExb0UsR0FBQXU4RCxVQUFBQyxHQUlBLE9BQUFvTSxDQUVBLENBV0EsYUFBQUMsQ0FBQXJNLEdBRUEsTUFBQSxDQUVBN2dDLE1BQUExOEIsS0FBQXM5RCxVQUFBQyxHQUNBa00sTUFBQXpwRSxLQUFBMHBFLGVBQUFuTSxHQUlBLENBRUEsSUFBQTcxRCxDQUFBK1AsR0FFQUYsTUFBQTdQLEtBQUErUCxHQUVBelgsS0FBQXlwRSxNQUFBLEdBRUEsSUFBQSxJQUFBMW9FLEVBQUEsRUFBQUMsRUFBQXlXLEVBQUFneUQsTUFBQXhvRSxPQUFBRixFQUFBQyxFQUFBRCxJQUFBLENBRUEsTUFBQThvRSxFQUFBcHlELEVBQUFneUQsTUFBQTFvRSxHQUVBZixLQUFBeXBFLE1BQUFycEUsS0FBQXlwRSxFQUFBcGlFLFFBRUEsQ0FFQSxPQUFBekgsSUFFQSxDQUVBLE1BQUFnVyxHQUVBLE1BQUFULEVBQUFnQyxNQUFBdkIsU0FFQVQsRUFBQUssS0FBQTVWLEtBQUE0VixLQUNBTCxFQUFBazBELE1BQUEsR0FFQSxJQUFBLElBQUExb0UsRUFBQSxFQUFBQyxFQUFBaEIsS0FBQXlwRSxNQUFBeG9FLE9BQUFGLEVBQUFDLEVBQUFELElBQUEsQ0FFQSxNQUFBOG9FLEVBQUE3cEUsS0FBQXlwRSxNQUFBMW9FLEdBQ0F3VSxFQUFBazBELE1BQUFycEUsS0FBQXlwRSxFQUFBN3pELFNBRUEsQ0FFQSxPQUFBVCxDQUVBLENBRUEsUUFBQXlwQyxDQUFBME8sR0FFQW4yQyxNQUFBeW5DLFNBQUEwTyxHQUVBMXRELEtBQUE0VixLQUFBODNDLEVBQUE5M0MsS0FDQTVWLEtBQUF5cEUsTUFBQSxHQUVBLElBQUEsSUFBQTFvRSxFQUFBLEVBQUFDLEVBQUEwc0QsRUFBQStiLE1BQUF4b0UsT0FBQUYsRUFBQUMsRUFBQUQsSUFBQSxDQUVBLE1BQUE4b0UsRUFBQW5jLEVBQUErYixNQUFBMW9FLEdBQ0FmLEtBQUF5cEUsTUFBQXJwRSxNQUFBLElBQUF3akUsSUFBQTVrQixTQUFBNnFCLEdBRUEsQ0FFQSxPQUFBN3BFLElBRUEsRUMzSmUsU0FBQThwRSxHQUFBdjBELEVBQUF3MEQsRUFBQUMsRUFBQSxHQUVmLE1BQUFDLEVBQUFGLEdBQUFBLEVBQUE5b0UsT0FDQWlwRSxFQUFBRCxFQUFBRixFQUFBLEdBQUFDLEVBQUF6MEQsRUFBQXRVLE9BQ0EsSUFBQWtwRSxFQUFBQyxHQUFBNzBELEVBQUEsRUFBQTIwRCxFQUFBRixHQUFBLEdBQ0EsTUFBQUssRUFBQSxHQUVBLElBQUFGLEdBQUFBLEVBQUFHLE9BQUFILEVBQUFJLEtBQUEsT0FBQUYsRUFFQSxJQUFBRyxFQUFBQyxFQUFBQyxFQUtBLEdBSEFULElBQUFFLEVBdVBBLFNBQUE1MEQsRUFBQXcwRCxFQUFBSSxFQUFBSCxHQUNBLE1BQUFXLEVBQUEsR0FFQSxJQUFBLElBQUE1cEUsRUFBQSxFQUFBZ2UsRUFBQWdyRCxFQUFBOW9FLE9BQUFGLEVBQUFnZSxFQUFBaGUsSUFBQSxDQUNBLE1BRUEweEQsRUFBQTJYLEdBQUE3MEQsRUFGQXcwRCxFQUFBaHBFLEdBQUFpcEUsRUFDQWpwRSxFQUFBZ2UsRUFBQSxFQUFBZ3JELEVBQUFocEUsRUFBQSxHQUFBaXBFLEVBQUF6MEQsRUFBQXRVLE9BQ0Erb0UsR0FBQSxHQUNBdlgsSUFBQUEsRUFBQTZYLE9BQUE3WCxFQUFBbVksU0FBQSxHQUNBRCxFQUFBdnFFLEtBQUF5cUUsR0FBQXBZLEdBQ0EsQ0FFQWtZLEVBQUFsVSxLQUFBcVUsSUFHQSxJQUFBLElBQUEvcEUsRUFBQSxFQUFBQSxFQUFBNHBFLEVBQUExcEUsT0FBQUYsSUFDQW9wRSxFQUFBWSxHQUFBSixFQUFBNXBFLEdBQUFvcEUsR0FHQSxPQUFBQSxDQUNBLENBMVFBYSxDQUFBejFELEVBQUF3MEQsRUFBQUksRUFBQUgsSUFHQXowRCxFQUFBdFUsT0FBQSxHQUFBK29FLEVBQUEsQ0FDQVEsRUFBQXJsRCxJQUNBc2xELEVBQUF0bEQsSUFDQSxJQUFBOGxELEdBQUE5bEQsSUFDQStsRCxHQUFBL2xELElBRUEsSUFBQSxJQUFBcGtCLEVBQUFpcEUsRUFBQWpwRSxFQUFBbXBFLEVBQUFucEUsR0FBQWlwRSxFQUFBLENBQ0EsTUFBQXhuRSxFQUFBK1MsRUFBQXhVLEdBQ0EwQixFQUFBOFMsRUFBQXhVLEVBQUEsR0FDQXlCLEVBQUFnb0UsSUFBQUEsRUFBQWhvRSxHQUNBQyxFQUFBZ29FLElBQUFBLEVBQUFob0UsR0FDQUQsRUFBQXlvRSxJQUFBQSxFQUFBem9FLEdBQ0FDLEVBQUF5b0UsSUFBQUEsRUFBQXpvRSxFQUNBLENBR0Fpb0UsRUFBQXBwRSxLQUFBYSxJQUFBOG9FLEVBQUFULEVBQUFVLEVBQUFULEdBQ0FDLEVBQUEsSUFBQUEsRUFBQSxNQUFBQSxFQUFBLENBQ0EsQ0FJQSxPQUZBUyxHQUFBaEIsRUFBQUUsRUFBQUwsRUFBQVEsRUFBQUMsRUFBQUMsRUFBQSxHQUVBTCxDQUNBLENBR0EsU0FBQUQsR0FBQTcwRCxFQUFBa2dDLEVBQUEyYSxFQUFBNFosRUFBQW9CLEdBQ0EsSUFBQXhOLEVBRUEsR0FBQXdOLElBaW1CQSxTQUFBNzFELEVBQUFrZ0MsRUFBQTJhLEVBQUE0WixHQUNBLElBQUFuTSxFQUFBLEVBQ0EsSUFBQSxJQUFBOThELEVBQUEwMEMsRUFBQXBzQixFQUFBK21DLEVBQUE0WixFQUFBanBFLEVBQUFxdkQsRUFBQXJ2RCxHQUFBaXBFLEVBQ0FuTSxJQUFBdG9ELEVBQUE4VCxHQUFBOVQsRUFBQXhVLEtBQUF3VSxFQUFBeFUsRUFBQSxHQUFBd1UsRUFBQThULEVBQUEsSUFDQUEsRUFBQXRvQixFQUVBLE9BQUE4OEQsQ0FDQSxDQXhtQkF3TixDQUFBOTFELEVBQUFrZ0MsRUFBQTJhLEVBQUE0WixHQUFBLEVBQ0EsSUFBQSxJQUFBanBFLEVBQUEwMEMsRUFBQTEwQyxFQUFBcXZELEVBQUFydkQsR0FBQWlwRSxFQUFBcE0sRUFBQTBOLEdBQUF2cUUsRUFBQWlwRSxFQUFBLEVBQUF6MEQsRUFBQXhVLEdBQUF3VSxFQUFBeFUsRUFBQSxHQUFBNjhELFFBRUEsSUFBQSxJQUFBNzhELEVBQUFxdkQsRUFBQTRaLEVBQUFqcEUsR0FBQTAwQyxFQUFBMTBDLEdBQUFpcEUsRUFBQXBNLEVBQUEwTixHQUFBdnFFLEVBQUFpcEUsRUFBQSxFQUFBejBELEVBQUF4VSxHQUFBd1UsRUFBQXhVLEVBQUEsR0FBQTY4RCxHQVFBLE9BTEFBLEdBQUF0ekQsR0FBQXN6RCxFQUFBQSxFQUFBME0sUUFDQWlCLEdBQUEzTixHQUNBQSxFQUFBQSxFQUFBME0sTUFHQTFNLENBQ0EsQ0FHQSxTQUFBNE4sR0FBQS8xQixFQUFBMmEsR0FDQSxJQUFBM2EsRUFBQSxPQUFBQSxFQUNBMmEsSUFBQUEsRUFBQTNhLEdBRUEsSUFDQWcyQixFQURBNTRDLEVBQUE0aUIsRUFFQSxHQUdBLEdBRkFnMkIsR0FBQSxFQUVBNTRDLEVBQUErM0MsVUFBQXRnRSxHQUFBdW9CLEVBQUFBLEVBQUF5M0MsT0FBQSxJQUFBb0IsR0FBQTc0QyxFQUFBMDNDLEtBQUExM0MsRUFBQUEsRUFBQXkzQyxNQU9BejNDLEVBQUFBLEVBQUF5M0MsU0FQQSxDQUdBLEdBRkFpQixHQUFBMTRDLEdBQ0FBLEVBQUF1OUIsRUFBQXY5QixFQUFBMDNDLEtBQ0ExM0MsSUFBQUEsRUFBQXkzQyxLQUFBLE1BQ0FtQixHQUFBLENBRUEsUUFHQUEsR0FBQTU0QyxJQUFBdTlCLEdBRUEsT0FBQUEsQ0FDQSxDQUdBLFNBQUErYSxHQUFBUSxFQUFBdEIsRUFBQUwsRUFBQVEsRUFBQUMsRUFBQUMsRUFBQWtCLEdBQ0EsSUFBQUQsRUFBQSxRQUdBQyxHQUFBbEIsR0E2UkEsU0FBQWoxQixFQUFBKzBCLEVBQUFDLEVBQUFDLEdBQ0EsSUFBQTczQyxFQUFBNGlCLEVBQ0EsR0FDQSxJQUFBNWlCLEVBQUF2WixJQUFBdVosRUFBQXZaLEVBQUF1eUQsR0FBQWg1QyxFQUFBcndCLEVBQUFxd0IsRUFBQXB3QixFQUFBK25FLEVBQUFDLEVBQUFDLElBQ0E3M0MsRUFBQWk1QyxNQUFBajVDLEVBQUEwM0MsS0FDQTEzQyxFQUFBazVDLE1BQUFsNUMsRUFBQXkzQyxLQUNBejNDLEVBQUFBLEVBQUF5M0MsV0FDQXozQyxJQUFBNGlCLEdBRUE1aUIsRUFBQWk1QyxNQUFBQyxNQUFBLEtBQ0FsNUMsRUFBQWk1QyxNQUFBLEtBT0EsU0FBQXJaLEdBQ0EsSUFBQXVaLEVBQ0FDLEVBQUEsRUFFQSxFQUFBLENBQ0EsSUFDQXpqRSxFQURBcXFCLEVBQUE0L0IsRUFFQUEsRUFBQSxLQUNBLElBQUF5WixFQUFBLEtBR0EsSUFGQUYsRUFBQSxFQUVBbjVDLEdBQUEsQ0FDQW01QyxJQUNBLElBQUFwbUUsRUFBQWl0QixFQUNBczVDLEVBQUEsRUFDQSxJQUFBLElBQUFwckUsRUFBQSxFQUFBQSxFQUFBa3JFLElBQ0FFLElBQ0F2bUUsRUFBQUEsRUFBQW1tRSxNQUNBbm1FLEdBSEE3RSxLQUtBLElBQUFxckUsRUFBQUgsRUFFQSxLQUFBRSxFQUFBLEdBQUFDLEVBQUEsR0FBQXhtRSxHQUVBLElBQUF1bUUsSUFBQSxJQUFBQyxJQUFBeG1FLEdBQUFpdEIsRUFBQXZaLEdBQUExVCxFQUFBMFQsSUFDQTlRLEVBQUFxcUIsRUFDQUEsRUFBQUEsRUFBQWs1QyxNQUNBSSxNQUVBM2pFLEVBQUE1QyxFQUNBQSxFQUFBQSxFQUFBbW1FLE1BQ0FLLEtBR0FGLEVBQUFBLEVBQUFILE1BQUF2akUsRUFDQWlxRCxFQUFBanFELEVBRUFBLEVBQUFzakUsTUFBQUksRUFDQUEsRUFBQTFqRSxFQUdBcXFCLEVBQUFqdEIsQ0FDQSxDQUVBc21FLEVBQUFILE1BQUEsS0FDQUUsR0FBQSxDQUVBLE9BQUFELEVBQUEsRUFHQSxDQXZEQUssQ0FBQXg1QyxFQUNBLENBMVNBeTVDLENBQUFYLEVBQUFuQixFQUFBQyxFQUFBQyxHQUVBLElBQUE2QixFQUFBWixFQUdBLEtBQUFBLEVBQUFwQixPQUFBb0IsRUFBQXJCLE1BQUEsQ0FDQSxNQUFBQyxFQUFBb0IsRUFBQXBCLEtBQ0FELEVBQUFxQixFQUFBckIsS0FFQSxHQUFBSSxFQUFBOEIsR0FBQWIsRUFBQW5CLEVBQUFDLEVBQUFDLEdBQUErQixHQUFBZCxHQUNBdEIsRUFBQWpxRSxLQUFBbXFFLEVBQUF4cEUsRUFBQTRxRSxFQUFBNXFFLEVBQUF1cEUsRUFBQXZwRSxHQUVBd3FFLEdBQUFJLEdBR0FBLEVBQUFyQixFQUFBQSxLQUNBaUMsRUFBQWpDLEVBQUFBLFVBUUEsSUFIQXFCLEVBQUFyQixLQUdBaUMsRUFBQSxDQUVBWCxFQUlBLElBQUFBLEVBRUFULEdBREFRLEVBQUFlLEdBQUFsQixHQUFBRyxHQUFBdEIsR0FDQUEsRUFBQUwsRUFBQVEsRUFBQUMsRUFBQUMsRUFBQSxHQUdBLElBQUFrQixHQUNBZSxHQUFBaEIsRUFBQXRCLEVBQUFMLEVBQUFRLEVBQUFDLEVBQUFDLEdBVEFTLEdBQUFLLEdBQUFHLEdBQUF0QixFQUFBTCxFQUFBUSxFQUFBQyxFQUFBQyxFQUFBLEdBWUEsS0FDQSxDQUNBLENBQ0EsQ0FHQSxTQUFBK0IsR0FBQWQsR0FDQSxNQUFBOWxFLEVBQUE4bEUsRUFBQXBCLEtBQ0F6a0UsRUFBQTZsRSxFQUNBNWxFLEVBQUE0bEUsRUFBQXJCLEtBRUEsR0FBQW9CLEdBQUE3bEUsRUFBQUMsRUFBQUMsSUFBQSxFQUFBLE9BQUEsRUFHQSxNQUFBeWQsRUFBQTNkLEVBQUFyRCxFQUFBbWhCLEVBQUE3ZCxFQUFBdEQsRUFBQTJNLEVBQUFwSixFQUFBdkQsRUFBQWloQixFQUFBNWQsRUFBQXBELEVBQUFtaEIsRUFBQTlkLEVBQUFyRCxFQUFBMk0sRUFBQXJKLEVBQUF0RCxFQUdBMGIsRUFBQTdjLEtBQUFZLElBQUFzaEIsRUFBQUcsRUFBQXhVLEdBQ0FpUCxFQUFBOWMsS0FBQVksSUFBQXVoQixFQUFBRyxFQUFBeFUsR0FDQW1QLEVBQUFqZCxLQUFBYSxJQUFBcWhCLEVBQUFHLEVBQUF4VSxHQUNBcVAsRUFBQWxkLEtBQUFhLElBQUFzaEIsRUFBQUcsRUFBQXhVLEdBRUEsSUFBQXlqQixFQUFBOXNCLEVBQUF1a0UsS0FDQSxLQUFBejNDLElBQUFodEIsR0FBQSxDQUNBLEdBQUFndEIsRUFBQXJ3QixHQUFBMmIsR0FBQTBVLEVBQUFyd0IsR0FBQStiLEdBQUFzVSxFQUFBcHdCLEdBQUEyYixHQUFBeVUsRUFBQXB3QixHQUFBK2IsR0FDQW91RCxHQUFBcHBELEVBQUFDLEVBQUFFLEVBQUFDLEVBQUF6VSxFQUFBQyxFQUFBeWpCLEVBQUFyd0IsRUFBQXF3QixFQUFBcHdCLElBQ0FpcEUsR0FBQTc0QyxFQUFBMDNDLEtBQUExM0MsRUFBQUEsRUFBQXkzQyxPQUFBLEVBQUEsT0FBQSxFQUNBejNDLEVBQUFBLEVBQUF5M0MsSUFDQSxDQUVBLE9BQUEsQ0FDQSxDQUVBLFNBQUFrQyxHQUFBYixFQUFBbkIsRUFBQUMsRUFBQUMsR0FDQSxNQUFBN2tFLEVBQUE4bEUsRUFBQXBCLEtBQ0F6a0UsRUFBQTZsRSxFQUNBNWxFLEVBQUE0bEUsRUFBQXJCLEtBRUEsR0FBQW9CLEdBQUE3bEUsRUFBQUMsRUFBQUMsSUFBQSxFQUFBLE9BQUEsRUFFQSxNQUFBeWQsRUFBQTNkLEVBQUFyRCxFQUFBbWhCLEVBQUE3ZCxFQUFBdEQsRUFBQTJNLEVBQUFwSixFQUFBdkQsRUFBQWloQixFQUFBNWQsRUFBQXBELEVBQUFtaEIsRUFBQTlkLEVBQUFyRCxFQUFBMk0sRUFBQXJKLEVBQUF0RCxFQUdBMGIsRUFBQTdjLEtBQUFZLElBQUFzaEIsRUFBQUcsRUFBQXhVLEdBQ0FpUCxFQUFBOWMsS0FBQVksSUFBQXVoQixFQUFBRyxFQUFBeFUsR0FDQW1QLEVBQUFqZCxLQUFBYSxJQUFBcWhCLEVBQUFHLEVBQUF4VSxHQUNBcVAsRUFBQWxkLEtBQUFhLElBQUFzaEIsRUFBQUcsRUFBQXhVLEdBR0F5OUQsRUFBQWhCLEdBQUExdEQsRUFBQUMsRUFBQW9zRCxFQUFBQyxFQUFBQyxHQUNBb0MsRUFBQWpCLEdBQUF0dEQsRUFBQUMsRUFBQWdzRCxFQUFBQyxFQUFBQyxHQUVBLElBQUE3M0MsRUFBQTg0QyxFQUFBRyxNQUNBenBFLEVBQUFzcEUsRUFBQUksTUFHQSxLQUFBbDVDLEdBQUFBLEVBQUF2WixHQUFBdXpELEdBQUF4cUUsR0FBQUEsRUFBQWlYLEdBQUF3ekQsR0FBQSxDQUNBLEdBQUFqNkMsRUFBQXJ3QixHQUFBMmIsR0FBQTBVLEVBQUFyd0IsR0FBQStiLEdBQUFzVSxFQUFBcHdCLEdBQUEyYixHQUFBeVUsRUFBQXB3QixHQUFBK2IsR0FBQXFVLElBQUFodEIsR0FBQWd0QixJQUFBOXNCLEdBQ0E2bUUsR0FBQXBwRCxFQUFBQyxFQUFBRSxFQUFBQyxFQUFBelUsRUFBQUMsRUFBQXlqQixFQUFBcndCLEVBQUFxd0IsRUFBQXB3QixJQUFBaXBFLEdBQUE3NEMsRUFBQTAzQyxLQUFBMTNDLEVBQUFBLEVBQUF5M0MsT0FBQSxFQUFBLE9BQUEsRUFHQSxHQUZBejNDLEVBQUFBLEVBQUFpNUMsTUFFQXpwRSxFQUFBRyxHQUFBMmIsR0FBQTliLEVBQUFHLEdBQUErYixHQUFBbGMsRUFBQUksR0FBQTJiLEdBQUEvYixFQUFBSSxHQUFBK2IsR0FBQW5jLElBQUF3RCxHQUFBeEQsSUFBQTBELEdBQ0E2bUUsR0FBQXBwRCxFQUFBQyxFQUFBRSxFQUFBQyxFQUFBelUsRUFBQUMsRUFBQS9NLEVBQUFHLEVBQUFILEVBQUFJLElBQUFpcEUsR0FBQXJwRSxFQUFBa29FLEtBQUFsb0UsRUFBQUEsRUFBQWlvRSxPQUFBLEVBQUEsT0FBQSxFQUNBam9FLEVBQUFBLEVBQUEwcEUsS0FDQSxDQUdBLEtBQUFsNUMsR0FBQUEsRUFBQXZaLEdBQUF1ekQsR0FBQSxDQUNBLEdBQUFoNkMsRUFBQXJ3QixHQUFBMmIsR0FBQTBVLEVBQUFyd0IsR0FBQStiLEdBQUFzVSxFQUFBcHdCLEdBQUEyYixHQUFBeVUsRUFBQXB3QixHQUFBK2IsR0FBQXFVLElBQUFodEIsR0FBQWd0QixJQUFBOXNCLEdBQ0E2bUUsR0FBQXBwRCxFQUFBQyxFQUFBRSxFQUFBQyxFQUFBelUsRUFBQUMsRUFBQXlqQixFQUFBcndCLEVBQUFxd0IsRUFBQXB3QixJQUFBaXBFLEdBQUE3NEMsRUFBQTAzQyxLQUFBMTNDLEVBQUFBLEVBQUF5M0MsT0FBQSxFQUFBLE9BQUEsRUFDQXozQyxFQUFBQSxFQUFBaTVDLEtBQ0EsQ0FHQSxLQUFBenBFLEdBQUFBLEVBQUFpWCxHQUFBd3pELEdBQUEsQ0FDQSxHQUFBenFFLEVBQUFHLEdBQUEyYixHQUFBOWIsRUFBQUcsR0FBQStiLEdBQUFsYyxFQUFBSSxHQUFBMmIsR0FBQS9iLEVBQUFJLEdBQUErYixHQUFBbmMsSUFBQXdELEdBQUF4RCxJQUFBMEQsR0FDQTZtRSxHQUFBcHBELEVBQUFDLEVBQUFFLEVBQUFDLEVBQUF6VSxFQUFBQyxFQUFBL00sRUFBQUcsRUFBQUgsRUFBQUksSUFBQWlwRSxHQUFBcnBFLEVBQUFrb0UsS0FBQWxvRSxFQUFBQSxFQUFBaW9FLE9BQUEsRUFBQSxPQUFBLEVBQ0Fqb0UsRUFBQUEsRUFBQTBwRSxLQUNBLENBRUEsT0FBQSxDQUNBLENBR0EsU0FBQVcsR0FBQWozQixFQUFBNDBCLEdBQ0EsSUFBQXgzQyxFQUFBNGlCLEVBQ0EsRUFBQSxDQUNBLE1BQUE1dkMsRUFBQWd0QixFQUFBMDNDLEtBQ0F6a0UsRUFBQStzQixFQUFBeTNDLEtBQUFBLE1BRUFoZ0UsR0FBQXpFLEVBQUFDLElBQUErMkMsR0FBQWgzQyxFQUFBZ3RCLEVBQUFBLEVBQUF5M0MsS0FBQXhrRSxJQUFBaW5FLEdBQUFsbkUsRUFBQUMsSUFBQWluRSxHQUFBam5FLEVBQUFELEtBRUF3a0UsRUFBQWpxRSxLQUFBeUYsRUFBQTlFLEVBQUE4eEIsRUFBQTl4QixFQUFBK0UsRUFBQS9FLEdBR0F3cUUsR0FBQTE0QyxHQUNBMDRDLEdBQUExNEMsRUFBQXkzQyxNQUVBejNDLEVBQUE0aUIsRUFBQTN2QyxHQUVBK3NCLEVBQUFBLEVBQUF5M0MsSUFDQSxPQUFBejNDLElBQUE0aUIsR0FFQSxPQUFBKzFCLEdBQUEzNEMsRUFDQSxDQUdBLFNBQUE4NUMsR0FBQWwzQixFQUFBNDBCLEVBQUFMLEVBQUFRLEVBQUFDLEVBQUFDLEdBRUEsSUFBQTdrRSxFQUFBNHZDLEVBQ0EsRUFBQSxDQUNBLElBQUEzdkMsRUFBQUQsRUFBQXlrRSxLQUFBQSxLQUNBLEtBQUF4a0UsSUFBQUQsRUFBQTBrRSxNQUFBLENBQ0EsR0FBQTFrRSxFQUFBOUUsSUFBQStFLEVBQUEvRSxHQUFBaXNFLEdBQUFubkUsRUFBQUMsR0FBQSxDQUVBLElBQUFDLEVBQUFrbkUsR0FBQXBuRSxFQUFBQyxHQVNBLE9BTkFELEVBQUEybEUsR0FBQTNsRSxFQUFBQSxFQUFBeWtFLE1BQ0F2a0UsRUFBQXlsRSxHQUFBemxFLEVBQUFBLEVBQUF1a0UsTUFHQWEsR0FBQXRsRSxFQUFBd2tFLEVBQUFMLEVBQUFRLEVBQUFDLEVBQUFDLEVBQUEsUUFDQVMsR0FBQXBsRSxFQUFBc2tFLEVBQUFMLEVBQUFRLEVBQUFDLEVBQUFDLEVBQUEsRUFFQSxDQUNBNWtFLEVBQUFBLEVBQUF3a0UsSUFDQSxDQUNBemtFLEVBQUFBLEVBQUF5a0UsSUFDQSxPQUFBemtFLElBQUE0dkMsRUFDQSxDQXdCQSxTQUFBcTFCLEdBQUFqbEUsRUFBQUMsR0FDQSxJQUFBMHlCLEVBQUEzeUIsRUFBQXJELEVBQUFzRCxFQUFBdEQsRUFHQSxHQUFBLElBQUFnMkIsSUFDQUEsRUFBQTN5QixFQUFBcEQsRUFBQXFELEVBQUFyRCxFQUNBLElBQUErMUIsR0FBQSxDQUdBQSxHQUZBM3lCLEVBQUF5a0UsS0FBQTduRSxFQUFBb0QsRUFBQXBELElBQUFvRCxFQUFBeWtFLEtBQUE5bkUsRUFBQXFELEVBQUFyRCxJQUNBc0QsRUFBQXdrRSxLQUFBN25FLEVBQUFxRCxFQUFBckQsSUFBQXFELEVBQUF3a0UsS0FBQTluRSxFQUFBc0QsRUFBQXRELEVBRUEsQ0FFQSxPQUFBZzJCLENBQ0EsQ0FHQSxTQUFBdXlDLEdBQUFsQixFQUFBTSxHQUNBLE1BQUErQyxFQWFBLFNBQUFyRCxFQUFBTSxHQUNBLElBQUF0M0MsRUFBQXMzQyxFQUNBLE1BQUFnRCxFQUFBdEQsRUFBQXJuRSxFQUNBNHFFLEVBQUF2RCxFQUFBcG5FLEVBQ0EsSUFDQUgsRUFEQXFnQixHQUFBd0MsSUFNQSxHQUFBN2EsR0FBQXUvRCxFQUFBaDNDLEdBQUEsT0FBQUEsRUFDQSxFQUFBLENBQ0EsR0FBQXZvQixHQUFBdS9ELEVBQUFoM0MsRUFBQXkzQyxNQUFBLE9BQUF6M0MsRUFBQXkzQyxLQUNBLEdBQUE4QyxHQUFBdjZDLEVBQUFwd0IsR0FBQTJxRSxHQUFBdjZDLEVBQUF5M0MsS0FBQTduRSxHQUFBb3dCLEVBQUF5M0MsS0FBQTduRSxJQUFBb3dCLEVBQUFwd0IsRUFBQSxDQUNBLE1BQUFELEVBQUFxd0IsRUFBQXJ3QixHQUFBNHFFLEVBQUF2NkMsRUFBQXB3QixJQUFBb3dCLEVBQUF5M0MsS0FBQTluRSxFQUFBcXdCLEVBQUFyd0IsSUFBQXF3QixFQUFBeTNDLEtBQUE3bkUsRUFBQW93QixFQUFBcHdCLEdBQ0EsR0FBQUQsR0FBQTJxRSxHQUFBM3FFLEVBQUFtZ0IsSUFDQUEsRUFBQW5nQixFQUNBRixFQUFBdXdCLEVBQUFyd0IsRUFBQXF3QixFQUFBeTNDLEtBQUE5bkUsRUFBQXF3QixFQUFBQSxFQUFBeTNDLEtBQ0E5bkUsSUFBQTJxRSxHQUFBLE9BQUE3cUUsQ0FFQSxDQUNBdXdCLEVBQUFBLEVBQUF5M0MsSUFDQSxPQUFBejNDLElBQUFzM0MsR0FFQSxJQUFBN25FLEVBQUEsT0FBQSxLQU1BLE1BQUFpcUUsRUFBQWpxRSxFQUNBK3FFLEVBQUEvcUUsRUFBQUUsRUFDQThxRSxFQUFBaHJFLEVBQUFHLEVBQ0EsSUFBQThxRSxFQUFBcG9ELElBRUEwTixFQUFBdndCLEVBRUEsRUFBQSxDQUNBLEdBQUE2cUUsR0FBQXQ2QyxFQUFBcndCLEdBQUFxd0IsRUFBQXJ3QixHQUFBNnFFLEdBQUFGLElBQUF0NkMsRUFBQXJ3QixHQUNBZ3JFLEdBQUFKLEVBQUFFLEVBQUFILEVBQUF4cUQsRUFBQXlxRCxFQUFBQyxFQUFBQyxFQUFBRixFQUFBRSxFQUFBM3FELEVBQUF3cUQsRUFBQUMsRUFBQXY2QyxFQUFBcndCLEVBQUFxd0IsRUFBQXB3QixHQUFBLENBRUEsTUFBQXVtQyxFQUFBMW5DLEtBQUE2QyxJQUFBaXBFLEVBQUF2NkMsRUFBQXB3QixJQUFBMHFFLEVBQUF0NkMsRUFBQXJ3QixHQUVBdXFFLEdBQUFsNkMsRUFBQWczQyxLQUNBN2dDLEVBQUF1a0MsR0FBQXZrQyxJQUFBdWtDLElBQUExNkMsRUFBQXJ3QixFQUFBRixFQUFBRSxHQUFBcXdCLEVBQUFyd0IsSUFBQUYsRUFBQUUsR0FBQWlyRSxHQUFBbnJFLEVBQUF1d0IsT0FDQXZ3QixFQUFBdXdCLEVBQ0EwNkMsRUFBQXZrQyxFQUVBLENBRUFuVyxFQUFBQSxFQUFBeTNDLElBQ0EsT0FBQXozQyxJQUFBMDVDLEdBRUEsT0FBQWpxRSxDQUNBLENBbkVBb3JFLENBQUE3RCxFQUFBTSxHQUNBLElBQUErQyxFQUNBLE9BQUEvQyxFQUdBLE1BQUF3RCxFQUFBVixHQUFBQyxFQUFBckQsR0FJQSxPQURBMkIsR0FBQW1DLEVBQUFBLEVBQUFyRCxNQUNBa0IsR0FBQTBCLEVBQUFBLEVBQUE1QyxLQUNBLENBNERBLFNBQUFtRCxHQUFBbnJFLEVBQUF1d0IsR0FDQSxPQUFBNjRDLEdBQUFwcEUsRUFBQWlvRSxLQUFBam9FLEVBQUF1d0IsRUFBQTAzQyxNQUFBLEdBQUFtQixHQUFBNzRDLEVBQUF5M0MsS0FBQWhvRSxFQUFBQSxFQUFBZ29FLE1BQUEsQ0FDQSxDQXlFQSxTQUFBdUIsR0FBQXJwRSxFQUFBQyxFQUFBK25FLEVBQUFDLEVBQUFDLEdBZUEsT0FQQWxvRSxFQUFBLGFBREFBLEVBQUEsWUFEQUEsRUFBQSxZQURBQSxFQUFBLFdBSEFBLEdBQUFBLEVBQUFnb0UsR0FBQUUsRUFBQSxHQUdBbG9FLEdBQUEsSUFDQUEsR0FBQSxJQUNBQSxHQUFBLElBQ0FBLEdBQUEsS0FLQUMsRUFBQSxhQURBQSxFQUFBLFlBREFBLEVBQUEsWUFEQUEsRUFBQSxXQVBBQSxHQUFBQSxFQUFBZ29FLEdBQUFDLEVBQUEsR0FPQWpvRSxHQUFBLElBQ0FBLEdBQUEsSUFDQUEsR0FBQSxJQUNBQSxHQUFBLEtBRUEsQ0FDQSxDQUdBLFNBQUFvb0UsR0FBQXAxQixHQUNBLElBQUE1aUIsRUFBQTRpQixFQUNBbTRCLEVBQUFuNEIsRUFDQSxJQUNBNWlCLEVBQUFyd0IsRUFBQW9yRSxFQUFBcHJFLEdBQUFxd0IsRUFBQXJ3QixJQUFBb3JFLEVBQUFwckUsR0FBQXF3QixFQUFBcHdCLEVBQUFtckUsRUFBQW5yRSxLQUFBbXJFLEVBQUEvNkMsR0FDQUEsRUFBQUEsRUFBQXkzQyxXQUNBejNDLElBQUE0aUIsR0FFQSxPQUFBbTRCLENBQ0EsQ0FHQSxTQUFBSixHQUFBaHFELEVBQUFDLEVBQUFFLEVBQUFDLEVBQUF6VSxFQUFBQyxFQUFBc3hELEVBQUFDLEdBQ0EsT0FBQXh4RCxFQUFBdXhELElBQUFqOUMsRUFBQWs5QyxLQUFBbjlDLEVBQUFrOUMsSUFBQXR4RCxFQUFBdXhELEtBQ0FuOUMsRUFBQWs5QyxJQUFBOThDLEVBQUErOEMsS0FBQWg5QyxFQUFBKzhDLElBQUFqOUMsRUFBQWs5QyxLQUNBaDlDLEVBQUErOEMsSUFBQXR4RCxFQUFBdXhELEtBQUF4eEQsRUFBQXV4RCxJQUFBOThDLEVBQUErOEMsRUFDQSxDQUdBLFNBQUFpTSxHQUFBcHBELEVBQUFDLEVBQUFFLEVBQUFDLEVBQUF6VSxFQUFBQyxFQUFBc3hELEVBQUFDLEdBQ0EsUUFBQW45QyxJQUFBazlDLEdBQUFqOUMsSUFBQWs5QyxJQUFBNk0sR0FBQWhxRCxFQUFBQyxFQUFBRSxFQUFBQyxFQUFBelUsRUFBQUMsRUFBQXN4RCxFQUFBQyxFQUNBLENBR0EsU0FBQXFNLEdBQUFubkUsRUFBQUMsR0FDQSxPQUFBRCxFQUFBeWtFLEtBQUF2cEUsSUFBQStFLEVBQUEvRSxHQUFBOEUsRUFBQTBrRSxLQUFBeHBFLElBQUErRSxFQUFBL0UsSUEyQ0EsU0FBQThFLEVBQUFDLEdBQ0EsSUFBQStzQixFQUFBaHRCLEVBQ0EsRUFBQSxDQUNBLEdBQUFndEIsRUFBQTl4QixJQUFBOEUsRUFBQTlFLEdBQUE4eEIsRUFBQXkzQyxLQUFBdnBFLElBQUE4RSxFQUFBOUUsR0FBQTh4QixFQUFBOXhCLElBQUErRSxFQUFBL0UsR0FBQTh4QixFQUFBeTNDLEtBQUF2cEUsSUFBQStFLEVBQUEvRSxHQUNBODdDLEdBQUFocUIsRUFBQUEsRUFBQXkzQyxLQUFBemtFLEVBQUFDLEdBQUEsT0FBQSxFQUNBK3NCLEVBQUFBLEVBQUF5M0MsSUFDQSxPQUFBejNDLElBQUFodEIsR0FFQSxPQUFBLENBQ0EsQ0FwREFnb0UsQ0FBQWhvRSxFQUFBQyxLQUNBaW5FLEdBQUFsbkUsRUFBQUMsSUFBQWluRSxHQUFBam5FLEVBQUFELElBNkRBLFNBQUFBLEVBQUFDLEdBQ0EsSUFBQStzQixFQUFBaHRCLEVBQ0Fpb0UsR0FBQSxFQUNBLE1BQUFwTixHQUFBNzZELEVBQUFyRCxFQUFBc0QsRUFBQXRELEdBQUEsRUFDQW0rRCxHQUFBOTZELEVBQUFwRCxFQUFBcUQsRUFBQXJELEdBQUEsRUFDQSxHQUNBb3dCLEVBQUFwd0IsRUFBQWsrRCxHQUFBOXRDLEVBQUF5M0MsS0FBQTduRSxFQUFBaytELEdBQUE5dEMsRUFBQXkzQyxLQUFBN25FLElBQUFvd0IsRUFBQXB3QixHQUNBaStELEdBQUE3dEMsRUFBQXkzQyxLQUFBOW5FLEVBQUFxd0IsRUFBQXJ3QixJQUFBbStELEVBQUE5dEMsRUFBQXB3QixJQUFBb3dCLEVBQUF5M0MsS0FBQTduRSxFQUFBb3dCLEVBQUFwd0IsR0FBQW93QixFQUFBcndCLElBQ0FzckUsR0FBQUEsR0FDQWo3QyxFQUFBQSxFQUFBeTNDLFdBQ0F6M0MsSUFBQWh0QixHQUVBLE9BQUFpb0UsQ0FDQSxDQTFFQUMsQ0FBQWxvRSxFQUFBQyxLQUNBNGxFLEdBQUE3bEUsRUFBQTBrRSxLQUFBMWtFLEVBQUFDLEVBQUF5a0UsT0FBQW1CLEdBQUE3bEUsRUFBQUMsRUFBQXlrRSxLQUFBemtFLEtBQ0F3RSxHQUFBekUsRUFBQUMsSUFBQTRsRSxHQUFBN2xFLEVBQUEwa0UsS0FBQTFrRSxFQUFBQSxFQUFBeWtFLE1BQUEsR0FBQW9CLEdBQUE1bEUsRUFBQXlrRSxLQUFBemtFLEVBQUFBLEVBQUF3a0UsTUFBQSxFQUNBLENBR0EsU0FBQW9CLEdBQUE3NEMsRUFBQWp0QixFQUFBZ0osR0FDQSxPQUFBaEosRUFBQW5ELEVBQUFvd0IsRUFBQXB3QixJQUFBbU0sRUFBQXBNLEVBQUFvRCxFQUFBcEQsSUFBQW9ELEVBQUFwRCxFQUFBcXdCLEVBQUFyd0IsSUFBQW9NLEVBQUFuTSxFQUFBbUQsRUFBQW5ELEVBQ0EsQ0FHQSxTQUFBNkgsR0FBQWlmLEVBQUFDLEdBQ0EsT0FBQUQsRUFBQS9tQixJQUFBZ25CLEVBQUFobkIsR0FBQSttQixFQUFBOW1CLElBQUErbUIsRUFBQS9tQixDQUNBLENBR0EsU0FBQW82QyxHQUFBdHpCLEVBQUF5a0QsRUFBQXhrRCxFQUFBeWtELEdBQ0EsTUFBQUMsRUFBQTVnRCxHQUFBbytDLEdBQUFuaUQsRUFBQXlrRCxFQUFBeGtELElBQ0Eya0QsRUFBQTdnRCxHQUFBbytDLEdBQUFuaUQsRUFBQXlrRCxFQUFBQyxJQUNBRyxFQUFBOWdELEdBQUFvK0MsR0FBQWxpRCxFQUFBeWtELEVBQUExa0QsSUFDQThrRCxFQUFBL2dELEdBQUFvK0MsR0FBQWxpRCxFQUFBeWtELEVBQUFELElBRUEsT0FBQUUsSUFBQUMsR0FBQUMsSUFBQUMsTUFFQSxJQUFBSCxJQUFBSSxHQUFBL2tELEVBQUFDLEVBQUF3a0QsUUFDQSxJQUFBRyxJQUFBRyxHQUFBL2tELEVBQUEwa0QsRUFBQUQsUUFDQSxJQUFBSSxJQUFBRSxHQUFBOWtELEVBQUFELEVBQUEwa0QsT0FDQSxJQUFBSSxJQUFBQyxHQUFBOWtELEVBQUF3a0QsRUFBQUMsTUFHQSxDQUdBLFNBQUFLLEdBQUF6N0MsRUFBQWp0QixFQUFBZ0osR0FDQSxPQUFBaEosRUFBQXBELEdBQUFsQixLQUFBYSxJQUFBMHdCLEVBQUFyd0IsRUFBQW9NLEVBQUFwTSxJQUFBb0QsRUFBQXBELEdBQUFsQixLQUFBWSxJQUFBMndCLEVBQUFyd0IsRUFBQW9NLEVBQUFwTSxJQUFBb0QsRUFBQW5ELEdBQUFuQixLQUFBYSxJQUFBMHdCLEVBQUFwd0IsRUFBQW1NLEVBQUFuTSxJQUFBbUQsRUFBQW5ELEdBQUFuQixLQUFBWSxJQUFBMndCLEVBQUFwd0IsRUFBQW1NLEVBQUFuTSxFQUNBLENBRUEsU0FBQTZxQixHQUFBaWhELEdBQ0EsT0FBQUEsRUFBQSxFQUFBLEVBQUFBLEVBQUEsR0FBQSxFQUFBLENBQ0EsQ0FlQSxTQUFBeEIsR0FBQWxuRSxFQUFBQyxHQUNBLE9BQUE0bEUsR0FBQTdsRSxFQUFBMGtFLEtBQUExa0UsRUFBQUEsRUFBQXlrRSxNQUFBLEVBQ0FvQixHQUFBN2xFLEVBQUFDLEVBQUFELEVBQUF5a0UsT0FBQSxHQUFBb0IsR0FBQTdsRSxFQUFBQSxFQUFBMGtFLEtBQUF6a0UsSUFBQSxFQUNBNGxFLEdBQUE3bEUsRUFBQUMsRUFBQUQsRUFBQTBrRSxNQUFBLEdBQUFtQixHQUFBN2xFLEVBQUFBLEVBQUF5a0UsS0FBQXhrRSxHQUFBLENBQ0EsQ0FvQkEsU0FBQW1uRSxHQUFBcG5FLEVBQUFDLEdBQ0EsTUFBQXBDLEVBQUE4cUUsR0FBQTNvRSxFQUFBOUUsRUFBQThFLEVBQUFyRCxFQUFBcUQsRUFBQXBELEdBQ0FtQixFQUFBNHFFLEdBQUExb0UsRUFBQS9FLEVBQUErRSxFQUFBdEQsRUFBQXNELEVBQUFyRCxHQUNBZ3NFLEVBQUE1b0UsRUFBQXlrRSxLQUNBb0UsRUFBQTVvRSxFQUFBeWtFLEtBY0EsT0FaQTFrRSxFQUFBeWtFLEtBQUF4a0UsRUFDQUEsRUFBQXlrRSxLQUFBMWtFLEVBRUFuQyxFQUFBNG1FLEtBQUFtRSxFQUNBQSxFQUFBbEUsS0FBQTdtRSxFQUVBRSxFQUFBMG1FLEtBQUE1bUUsRUFDQUEsRUFBQTZtRSxLQUFBM21FLEVBRUE4cUUsRUFBQXBFLEtBQUExbUUsRUFDQUEsRUFBQTJtRSxLQUFBbUUsRUFFQTlxRSxDQUNBLENBR0EsU0FBQTBuRSxHQUFBdnFFLEVBQUF5QixFQUFBQyxFQUFBbTdELEdBQ0EsTUFBQS9xQyxFQUFBMjdDLEdBQUF6dEUsRUFBQXlCLEVBQUFDLEdBWUEsT0FWQW03RCxHQUtBL3FDLEVBQUF5M0MsS0FBQTFNLEVBQUEwTSxLQUNBejNDLEVBQUEwM0MsS0FBQTNNLEVBQ0FBLEVBQUEwTSxLQUFBQyxLQUFBMTNDLEVBQ0ErcUMsRUFBQTBNLEtBQUF6M0MsSUFQQUEsRUFBQTAzQyxLQUFBMTNDLEVBQ0FBLEVBQUF5M0MsS0FBQXozQyxHQVFBQSxDQUNBLENBRUEsU0FBQTA0QyxHQUFBMTRDLEdBQ0FBLEVBQUF5M0MsS0FBQUMsS0FBQTEzQyxFQUFBMDNDLEtBQ0ExM0MsRUFBQTAzQyxLQUFBRCxLQUFBejNDLEVBQUF5M0MsS0FFQXozQyxFQUFBaTVDLFFBQUFqNUMsRUFBQWk1QyxNQUFBQyxNQUFBbDVDLEVBQUFrNUMsT0FDQWw1QyxFQUFBazVDLFFBQUFsNUMsRUFBQWs1QyxNQUFBRCxNQUFBajVDLEVBQUFpNUMsTUFDQSxDQUVBLFNBQUEwQyxHQUFBenRFLEVBQUF5QixFQUFBQyxHQUNBLE1BQUEsQ0FDQTFCLElBQ0F5QixJQUFBQyxJQUNBOG5FLEtBQUEsS0FDQUQsS0FBQSxLQUNBaHhELEVBQUEsRUFDQXd5RCxNQUFBLEtBQ0FDLE1BQUEsS0FDQW5CLFNBQUEsRUFFQSxDQy9tQkEsTUFBQStELEdBV0Esa0JBQUFDLENBQUFyNUQsRUFBQXcwRCxFQUFBQyxFQUFBLEdBRUEsT0FBQUYsR0FBQXYwRCxFQUFBdzBELEVBQUFDLEVBRUEsRUNWQSxNQUFBNkUsR0FRQSxXQUFBbkQsQ0FBQW9ELEdBRUEsTUFBQXpzRSxFQUFBeXNFLEVBQUE3dEUsT0FDQSxJQUFBNEUsRUFBQSxFQUVBLElBQUEsSUFBQWd0QixFQUFBeHdCLEVBQUEsRUFBQXVELEVBQUEsRUFBQUEsRUFBQXZELEVBQUF3d0IsRUFBQWp0QixJQUVBQyxHQUFBaXBFLEVBQUFqOEMsR0FBQXJ3QixFQUFBc3NFLEVBQUFscEUsR0FBQW5ELEVBQUFxc0UsRUFBQWxwRSxHQUFBcEQsRUFBQXNzRSxFQUFBajhDLEdBQUFwd0IsRUFJQSxNQUFBLEdBQUFvRCxDQUVBLENBUUEsa0JBQUFrcEUsQ0FBQXBMLEdBRUEsT0FBQWtMLEdBQUFuRCxLQUFBL0gsR0FBQSxDQUVBLENBU0EsdUJBQUFxTCxDQUFBRixFQUFBckYsR0FFQSxNQUFBN3JCLEVBQUEsR0FDQW1zQixFQUFBLEdBQ0FrRixFQUFBLEdBRUFDLEdBQUFKLEdBQ0FLLEdBQUF2eEIsRUFBQWt4QixHQUlBLElBQUFNLEVBQUFOLEVBQUE3dEUsT0FFQXdvRSxFQUFBNEYsUUFBQUgsSUFFQSxJQUFBLElBQUFudUUsRUFBQSxFQUFBQSxFQUFBMG9FLEVBQUF4b0UsT0FBQUYsSUFFQWdwRSxFQUFBM3BFLEtBQUFndkUsR0FDQUEsR0FBQTNGLEVBQUExb0UsR0FBQUUsT0FDQWt1RSxHQUFBdnhCLEVBQUE2ckIsRUFBQTFvRSxJQU1BLE1BQUFzcEUsRUFBQXNFLEdBQUFDLFlBQUFoeEIsRUFBQW1zQixHQUlBLElBQUEsSUFBQWhwRSxFQUFBLEVBQUFBLEVBQUFzcEUsRUFBQXBwRSxPQUFBRixHQUFBLEVBRUFrdUUsRUFBQTd1RSxLQUFBaXFFLEVBQUF2cEUsTUFBQUMsRUFBQUEsRUFBQSxJQUlBLE9BQUFrdUUsQ0FFQSxFQUlBLFNBQUFDLEdBQUF2cEQsR0FFQSxNQUFBM2tCLEVBQUEya0IsRUFBQTFrQixPQUVBRCxFQUFBLEdBQUEya0IsRUFBQTNrQixFQUFBLEdBQUFzSixPQUFBcWIsRUFBQSxLQUVBQSxFQUFBMHlDLEtBSUEsQ0FFQSxTQUFBOFcsR0FBQXZ4QixFQUFBa3hCLEdBRUEsSUFBQSxJQUFBL3RFLEVBQUEsRUFBQUEsRUFBQSt0RSxFQUFBN3RFLE9BQUFGLElBRUE2OEMsRUFBQXg5QyxLQUFBMHVFLEVBQUEvdEUsR0FBQXlCLEdBQ0FvN0MsRUFBQXg5QyxLQUFBMHVFLEVBQUEvdEUsR0FBQTBCLEVBSUEsQ0NsRkEsTUFBQTZzRSxXQUFBajRCLEdBUUEsV0FBQXowQyxDQUFBMjJCLEVBQUEsSUFBQWl3QyxHQUFBLENBQUEsSUFBQTFpRSxHQUFBLEdBQUEsSUFBQSxJQUFBQSxJQUFBLEdBQUEsSUFBQSxJQUFBQSxJQUFBLElBQUEsSUFBQSxJQUFBQSxHQUFBLElBQUEsTUFBQXFVLEVBQUEsQ0FBQSxHQUVBNUQsUUFFQXZYLEtBQUFILEtBQUEsa0JBU0FHLEtBQUF5OEIsV0FBQSxDQUNBbEQsT0FBQUEsRUFDQXBlLFFBQUFBLEdBR0FvZSxFQUFBampCLE1BQUFDLFFBQUFnakIsR0FBQUEsRUFBQSxDQUFBQSxHQUVBLE1BQUFva0IsRUFBQTM5QyxLQUVBdXZFLEVBQUEsR0FDQUMsRUFBQSxHQUVBLElBQUEsSUFBQXp1RSxFQUFBLEVBQUFDLEVBQUF1NEIsRUFBQXQ0QixPQUFBRixFQUFBQyxFQUFBRCxJQUFBLENBR0EwdUUsRUFEQWwyQyxFQUFBeDRCLEdBR0EsQ0FXQSxTQUFBMHVFLEVBQUEveUMsR0FFQSxNQUFBZ3pDLEVBQUEsR0FJQUMsT0FBQTV2RSxJQUFBb2IsRUFBQXcwRCxjQUFBeDBELEVBQUF3MEQsY0FBQSxHQUNBQyxPQUFBN3ZFLElBQUFvYixFQUFBeTBELE1BQUF6MEQsRUFBQXkwRCxNQUFBLEVBQ0F2MEQsT0FBQXRiLElBQUFvYixFQUFBRSxNQUFBRixFQUFBRSxNQUFBLEVBRUEsSUFBQXcwRCxPQUFBOXZFLElBQUFvYixFQUFBMDBELGNBQUExMEQsRUFBQTAwRCxhQUNBQyxPQUFBL3ZFLElBQUFvYixFQUFBMjBELGVBQUEzMEQsRUFBQTIwRCxlQUFBLEdBQ0FDLE9BQUFod0UsSUFBQW9iLEVBQUE0MEQsVUFBQTUwRCxFQUFBNDBELFVBQUFELEVBQUEsR0FDQUUsT0FBQWp3RSxJQUFBb2IsRUFBQTYwRCxZQUFBNzBELEVBQUE2MEQsWUFBQSxFQUNBQyxPQUFBbHdFLElBQUFvYixFQUFBODBELGNBQUE5MEQsRUFBQTgwRCxjQUFBLEVBRUEsTUFBQUMsRUFBQS8wRCxFQUFBKzBELFlBRUFDLE9BQUFwd0UsSUFBQW9iLEVBQUFpMUQsWUFBQWoxRCxFQUFBaTFELFlBQUFDLEdBSUEsSUFBQUMsRUFDQUMsRUFBQUMsRUFBQXJzRCxFQUFBc3NELEVBREFDLEdBQUEsRUFHQVIsSUFFQUksRUFBQUosRUFBQTFTLGdCQUFBb1MsR0FFQWMsR0FBQSxFQUNBYixHQUFBLEVBTUFVLEVBQUFMLEVBQUExUixvQkFBQW9SLEdBQUEsR0FJQVksRUFBQSxJQUFBeHVELEdBQ0FtQyxFQUFBLElBQUFuQyxHQUNBeXVELEVBQUEsSUFBQXp1RCxJQU1BNnRELElBRUFJLEVBQUEsRUFDQUgsRUFBQSxFQUNBQyxFQUFBLEVBQ0FDLEVBQUEsR0FNQSxNQUFBVyxFQUFBajBDLEVBQUFrdEMsY0FBQStGLEdBRUEsSUFBQS94QixFQUFBK3lCLEVBQUFqMEMsTUFDQSxNQUFBK3NDLEVBQUFrSCxFQUFBbEgsTUFJQSxJQUZBb0YsR0FBQUUsWUFBQW54QixHQUVBLENBRUFBLEVBQUFBLEVBQUFnekIsVUFJQSxJQUFBLElBQUE1aUUsRUFBQSxFQUFBNmlFLEVBQUFwSCxFQUFBeG9FLE9BQUErTSxFQUFBNmlFLEVBQUE3aUUsSUFBQSxDQUVBLE1BQUE4aUUsRUFBQXJILEVBQUF6N0QsR0FFQTZnRSxHQUFBRSxZQUFBK0IsS0FFQXJILEVBQUF6N0QsR0FBQThpRSxFQUFBRixVQUlBLENBRUEsQ0FLQSxTQUFBRyxFQUFBcHJELEdBRUEsTUFDQXFyRCxFQURBLFlBRUEsSUFBQUMsRUFBQXRyRCxFQUFBLEdBQ0EsSUFBQSxJQUFBNWtCLEVBQUEsRUFBQUEsR0FBQTRrQixFQUFBMWtCLE9BQUFGLElBQUEsQ0FFQSxNQUFBbXdFLEVBQUFud0UsRUFBQTRrQixFQUFBMWtCLE9BQ0Frd0UsRUFBQXhyRCxFQUFBdXJELEdBQ0FwbkUsRUFBQXFuRSxFQUFBM3VFLEVBQUF5dUUsRUFBQXp1RSxFQUNBdUgsRUFBQW9uRSxFQUFBMXVFLEVBQUF3dUUsRUFBQXh1RSxFQUNBMnVFLEVBQUF0bkUsRUFBQUEsRUFBQUMsRUFBQUEsRUFFQXNuRSxFQUFBL3ZFLEtBQUFhLElBQ0FiLEtBQUE2QyxJQUFBZ3RFLEVBQUEzdUUsR0FDQWxCLEtBQUE2QyxJQUFBZ3RFLEVBQUExdUUsR0FDQW5CLEtBQUE2QyxJQUFBOHNFLEVBQUF6dUUsR0FDQWxCLEtBQUE2QyxJQUFBOHNFLEVBQUF4dUUsSUFHQTJ1RSxHQURBSixFQUFBSyxFQUFBQSxHQUdBMXJELEVBQUFsbEIsT0FBQXl3RSxFQUFBLEdBQ0Fud0UsS0FLQWt3RSxFQUFBRSxDQUVBLENBRUEsQ0FFQUosRUFBQW56QixHQUNBNnJCLEVBQUE0RixRQUFBMEIsR0FFQSxNQUFBTyxFQUFBN0gsRUFBQXhvRSxPQUlBNnRFLEVBQUFseEIsRUFFQSxJQUFBLElBQUE1dkMsRUFBQSxFQUFBQSxFQUFBc2pFLEVBQUF0akUsSUFBQSxDQUVBLE1BQUE4aUUsRUFBQXJILEVBQUF6N0QsR0FFQTR2QyxFQUFBQSxFQUFBNkYsT0FBQXF0QixFQUVBLENBR0EsU0FBQVMsRUFBQUMsRUFBQTNTLEVBQUFoNUMsR0FJQSxPQUZBZzVDLEdBQUFqNEQsUUFBQW14QixNQUFBLDZDQUVBeTVDLEVBQUEvcEUsUUFBQU0sZ0JBQUE4MkQsRUFBQWg1QyxFQUVBLENBRUEsTUFBQTRyRCxFQUFBN3pCLEVBQUEzOEMsT0FNQSxTQUFBeXdFLEVBQUFDLEVBQUFDLEVBQUFDLEdBU0EsSUFBQUMsRUFBQUMsRUFBQUMsRUFLQSxNQUFBQyxFQUFBTixFQUFBbnZFLEVBQUFvdkUsRUFBQXB2RSxFQUNBMHZFLEVBQUFQLEVBQUFsdkUsRUFBQW12RSxFQUFBbnZFLEVBQ0EwdkUsRUFBQU4sRUFBQXJ2RSxFQUFBbXZFLEVBQUFudkUsRUFDQTR2RSxFQUFBUCxFQUFBcHZFLEVBQUFrdkUsRUFBQWx2RSxFQUVBNHZFLEVBQUFKLEVBQUFBLEVBQUFDLEVBQUFBLEVBR0FJLEVBQUFMLEVBQUFHLEVBQUFGLEVBQUFDLEVBRUEsR0FBQTd3RSxLQUFBNkMsSUFBQW11RSxHQUFBenpELE9BQUFDLFFBQUEsQ0FNQSxNQUFBeXpELEVBQUFqeEUsS0FBQThILEtBQUFpcEUsR0FDQUcsRUFBQWx4RSxLQUFBOEgsS0FBQStvRSxFQUFBQSxFQUFBQyxFQUFBQSxHQUlBSyxFQUFBYixFQUFBcHZFLEVBQUEwdkUsRUFBQUssRUFDQUcsRUFBQWQsRUFBQW52RSxFQUFBd3ZFLEVBQUFNLEVBT0FJLElBTEFkLEVBQUFydkUsRUFBQTR2RSxFQUFBSSxFQUtBQyxHQUFBTCxHQUpBUCxFQUFBcHZFLEVBQUEwdkUsRUFBQUssRUFLQUUsR0FBQVAsSUFDQUYsRUFBQUcsRUFBQUYsRUFBQUMsR0FJQUwsRUFBQVcsRUFBQVIsRUFBQVUsRUFBQWhCLEVBQUFudkUsRUFDQXV2RSxFQUFBVyxFQUFBUixFQUFBUyxFQUFBaEIsRUFBQWx2RSxFQUlBLE1BQUFtd0UsRUFBQWQsRUFBQUEsRUFBQUMsRUFBQUEsRUFDQSxHQUFBYSxHQUFBLEVBRUEsT0FBQSxJQUFBOXJFLEdBQUFnckUsRUFBQUMsR0FJQUMsRUFBQTF3RSxLQUFBOEgsS0FBQXdwRSxFQUFBLEVBSUEsS0FBQSxDQUlBLElBQUFDLEdBQUEsRUFFQVosRUFBQXB6RCxPQUFBQyxRQUVBcXpELEVBQUF0ekQsT0FBQUMsVUFFQSt6RCxHQUFBLEdBTUFaLEdBQUFwekQsT0FBQUMsUUFFQXF6RCxHQUFBdHpELE9BQUFDLFVBRUErekQsR0FBQSxHQU1BdnhFLEtBQUFnc0IsS0FBQTRrRCxLQUFBNXdFLEtBQUFnc0IsS0FBQThrRCxLQUVBUyxHQUFBLEdBUUFBLEdBR0FmLEdBQUFJLEVBQ0FILEVBQUFFLEVBQ0FELEVBQUExd0UsS0FBQThILEtBQUFpcEUsS0FLQVAsRUFBQUcsRUFDQUYsRUFBQUcsRUFDQUYsRUFBQTF3RSxLQUFBOEgsS0FBQWlwRSxFQUFBLEdBSUEsQ0FFQSxPQUFBLElBQUF2ckUsR0FBQWdyRSxFQUFBRSxFQUFBRCxFQUFBQyxFQUVBLENBR0EsTUFBQWMsRUFBQSxHQUVBLElBQUEsSUFBQS94RSxFQUFBLEVBQUFxYixFQUFBMHlELEVBQUE3dEUsT0FBQW9vQixFQUFBak4sRUFBQSxFQUFBK2tELEVBQUFwZ0UsRUFBQSxFQUFBQSxFQUFBcWIsRUFBQXJiLElBQUFzb0IsSUFBQTgzQyxJQUVBOTNDLElBQUFqTixJQUFBaU4sRUFBQSxHQUNBODNDLElBQUEva0QsSUFBQStrRCxFQUFBLEdBS0EyUixFQUFBL3hFLEdBQUEyd0UsRUFBQTVDLEVBQUEvdEUsR0FBQSt0RSxFQUFBemxELEdBQUF5bEQsRUFBQTNOLElBSUEsTUFBQTRSLEVBQUEsR0FDQSxJQUFBQyxFQUFBQyxFQUFBSCxFQUFBcnZCLFNBRUEsSUFBQSxJQUFBejFDLEVBQUEsRUFBQTZpRSxFQUFBUyxFQUFBdGpFLEVBQUE2aUUsRUFBQTdpRSxJQUFBLENBRUEsTUFBQThpRSxFQUFBckgsRUFBQXo3RCxHQUVBZ2xFLEVBQUEsR0FFQSxJQUFBLElBQUFqeUUsRUFBQSxFQUFBcWIsRUFBQTAwRCxFQUFBN3ZFLE9BQUFvb0IsRUFBQWpOLEVBQUEsRUFBQStrRCxFQUFBcGdFLEVBQUEsRUFBQUEsRUFBQXFiLEVBQUFyYixJQUFBc29CLElBQUE4M0MsSUFFQTkzQyxJQUFBak4sSUFBQWlOLEVBQUEsR0FDQTgzQyxJQUFBL2tELElBQUEra0QsRUFBQSxHQUdBNlIsRUFBQWp5RSxHQUFBMndFLEVBQUFaLEVBQUEvdkUsR0FBQSt2RSxFQUFBem5ELEdBQUF5bkQsRUFBQTNQLElBSUE0UixFQUFBM3lFLEtBQUE0eUUsR0FDQUMsRUFBQUEsRUFBQXh2QixPQUFBdXZCLEVBRUEsQ0FFQSxNQUFBRSxFQUFBLEdBQ0FDLEVBQUEsR0FJQSxJQUFBLElBQUFydEUsRUFBQSxFQUFBQSxFQUFBbXFFLEVBQUFucUUsSUFBQSxDQUlBLE1BQUFwRCxFQUFBb0QsRUFBQW1xRSxFQUNBMzJELEVBQUF3MkQsRUFBQXh1RSxLQUFBMkUsSUFBQXZELEVBQUFwQixLQUFBQyxHQUFBLEdBQ0E2eEUsRUFBQXJELEVBQUF6dUUsS0FBQTRFLElBQUF4RCxFQUFBcEIsS0FBQUMsR0FBQSxHQUFBeXVFLEVBSUEsSUFBQSxJQUFBanZFLEVBQUEsRUFBQXFiLEVBQUEweUQsRUFBQTd0RSxPQUFBRixFQUFBcWIsRUFBQXJiLElBQUEsQ0FFQSxNQUFBc3lFLEVBQUE5QixFQUFBekMsRUFBQS90RSxHQUFBK3hFLEVBQUEveEUsR0FBQXF5RSxHQUVBenJFLEVBQUEwckUsRUFBQTd3RSxFQUFBNndFLEVBQUE1d0UsR0FBQTZXLEdBQ0EsR0FBQTVXLEdBQUF3d0UsRUFBQTl5RSxLQUFBaXpFLEVBRUEsQ0FJQSxJQUFBLElBQUFybEUsRUFBQSxFQUFBNmlFLEVBQUFTLEVBQUF0akUsRUFBQTZpRSxFQUFBN2lFLElBQUEsQ0FFQSxNQUFBOGlFLEVBQUFySCxFQUFBejdELEdBQ0FnbEUsRUFBQUQsRUFBQS9rRSxHQUNBLE1BQUFzbEUsRUFBQSxHQUNBLElBQUEsSUFBQXZ5RSxFQUFBLEVBQUFxYixFQUFBMDBELEVBQUE3dkUsT0FBQUYsRUFBQXFiLEVBQUFyYixJQUFBLENBRUEsTUFBQXN5RSxFQUFBOUIsRUFBQVQsRUFBQS92RSxHQUFBaXlFLEVBQUFqeUUsR0FBQXF5RSxHQUVBenJFLEVBQUEwckUsRUFBQTd3RSxFQUFBNndFLEVBQUE1d0UsR0FBQTZXLEdBQ0EsR0FBQTVXLEdBQUE0d0UsRUFBQWx6RSxLQUFBaXpFLEVBRUEsQ0FFQSxHQUFBM3dFLEdBQUF5d0UsRUFBQS95RSxLQUFBa3pFLEVBRUEsQ0FFQSxDQUVBLE1BQUFyRSxFQUFBSixHQUFBRyxpQkFBQWtFLEVBQUFDLEdBRUFJLEVBQUF0RSxFQUFBaHVFLE9BRUFteUUsRUFBQXJELEVBQUFDLEVBSUEsSUFBQSxJQUFBanZFLEVBQUEsRUFBQUEsRUFBQTB3RSxFQUFBMXdFLElBQUEsQ0FFQSxNQUFBc3lFLEVBQUF4RCxFQUFBMEIsRUFBQTN6QixFQUFBNzhDLEdBQUFreUUsRUFBQWx5RSxHQUFBcXlFLEdBQUF4MUIsRUFBQTc4QyxHQUVBMnZFLEdBUUF2c0QsRUFBQXpjLEtBQUE2b0UsRUFBQTMxQixRQUFBLElBQUF4eUMsZUFBQWlyRSxFQUFBN3dFLEdBQ0FndUUsRUFBQTlvRSxLQUFBNm9FLEVBQUEzUixVQUFBLElBQUF4MkQsZUFBQWlyRSxFQUFBNXdFLEdBRUFndUUsRUFBQS9vRSxLQUFBNG9FLEVBQUEsSUFBQTFvRSxJQUFBdWMsR0FBQXZjLElBQUE0b0UsR0FFQTdvRSxFQUFBOG9FLEVBQUFqdUUsRUFBQWl1RSxFQUFBaHVFLEVBQUFndUUsRUFBQW4zRCxJQVhBM1IsRUFBQTByRSxFQUFBN3dFLEVBQUE2d0UsRUFBQTV3RSxFQUFBLEVBZUEsQ0FLQSxJQUFBLElBQUFxQyxFQUFBLEVBQUFBLEdBQUE4cUUsRUFBQTlxRSxJQUVBLElBQUEsSUFBQS9ELEVBQUEsRUFBQUEsRUFBQTB3RSxFQUFBMXdFLElBQUEsQ0FFQSxNQUFBc3lFLEVBQUF4RCxFQUFBMEIsRUFBQTN6QixFQUFBNzhDLEdBQUFreUUsRUFBQWx5RSxHQUFBcXlFLEdBQUF4MUIsRUFBQTc4QyxHQUVBMnZFLEdBUUF2c0QsRUFBQXpjLEtBQUE2b0UsRUFBQTMxQixRQUFBOTFDLElBQUFzRCxlQUFBaXJFLEVBQUE3d0UsR0FDQWd1RSxFQUFBOW9FLEtBQUE2b0UsRUFBQTNSLFVBQUE5NUQsSUFBQXNELGVBQUFpckUsRUFBQTV3RSxHQUVBZ3VFLEVBQUEvb0UsS0FBQTRvRSxFQUFBeHJFLElBQUE4QyxJQUFBdWMsR0FBQXZjLElBQUE0b0UsR0FFQTdvRSxFQUFBOG9FLEVBQUFqdUUsRUFBQWl1RSxFQUFBaHVFLEVBQUFndUUsRUFBQW4zRCxJQVhBM1IsRUFBQTByRSxFQUFBN3dFLEVBQUE2d0UsRUFBQTV3RSxFQUFBNFksRUFBQXUwRCxFQUFBOXFFLEVBZUEsQ0FRQSxJQUFBLElBQUFnQixFQUFBbXFFLEVBQUEsRUFBQW5xRSxHQUFBLEVBQUFBLElBQUEsQ0FFQSxNQUFBcEQsRUFBQW9ELEVBQUFtcUUsRUFDQTMyRCxFQUFBdzJELEVBQUF4dUUsS0FBQTJFLElBQUF2RCxFQUFBcEIsS0FBQUMsR0FBQSxHQUNBNnhFLEVBQUFyRCxFQUFBenVFLEtBQUE0RSxJQUFBeEQsRUFBQXBCLEtBQUFDLEdBQUEsR0FBQXl1RSxFQUlBLElBQUEsSUFBQWp2RSxFQUFBLEVBQUFxYixFQUFBMHlELEVBQUE3dEUsT0FBQUYsRUFBQXFiLEVBQUFyYixJQUFBLENBRUEsTUFBQXN5RSxFQUFBOUIsRUFBQXpDLEVBQUEvdEUsR0FBQSt4RSxFQUFBL3hFLEdBQUFxeUUsR0FDQXpyRSxFQUFBMHJFLEVBQUE3d0UsRUFBQTZ3RSxFQUFBNXdFLEVBQUE0WSxFQUFBL0IsRUFFQSxDQUlBLElBQUEsSUFBQXRMLEVBQUEsRUFBQTZpRSxFQUFBcEgsRUFBQXhvRSxPQUFBK00sRUFBQTZpRSxFQUFBN2lFLElBQUEsQ0FFQSxNQUFBOGlFLEVBQUFySCxFQUFBejdELEdBQ0FnbEUsRUFBQUQsRUFBQS9rRSxHQUVBLElBQUEsSUFBQWpOLEVBQUEsRUFBQXFiLEVBQUEwMEQsRUFBQTd2RSxPQUFBRixFQUFBcWIsRUFBQXJiLElBQUEsQ0FFQSxNQUFBc3lFLEVBQUE5QixFQUFBVCxFQUFBL3ZFLEdBQUFpeUUsRUFBQWp5RSxHQUFBcXlFLEdBRUExQyxFQU1BL29FLEVBQUEwckUsRUFBQTd3RSxFQUFBNndFLEVBQUE1d0UsRUFBQTZ0RSxFQUFBVixFQUFBLEdBQUFudEUsRUFBQTZ0RSxFQUFBVixFQUFBLEdBQUFwdEUsRUFBQThXLEdBSkEzUixFQUFBMHJFLEVBQUE3d0UsRUFBQTZ3RSxFQUFBNXdFLEVBQUE0WSxFQUFBL0IsRUFRQSxDQUVBLENBRUEsQ0FnR0EsU0FBQWs2RCxFQUFBMUUsRUFBQTJFLEdBRUEsSUFBQTF5RSxFQUFBK3RFLEVBQUE3dEUsT0FFQSxPQUFBRixHQUFBLEdBQUEsQ0FFQSxNQUFBc29CLEVBQUF0b0IsRUFDQSxJQUFBb2dFLEVBQUFwZ0UsRUFBQSxFQUNBb2dFLEVBQUEsSUFBQUEsRUFBQTJOLEVBQUE3dEUsT0FBQSxHQUlBLElBQUEsSUFBQTZELEVBQUEsRUFBQTR1RSxFQUFBOUQsRUFBQSxFQUFBSyxFQUFBbnJFLEVBQUE0dUUsRUFBQTV1RSxJQUFBLENBRUEsTUFBQTZ1RSxFQUFBbEMsRUFBQTNzRSxFQUNBOHVFLEVBQUFuQyxHQUFBM3NFLEVBQUEsR0FPQSt1RSxFQUxBSixFQUFBcHFELEVBQUFzcUQsRUFDQUYsRUFBQXRTLEVBQUF3UyxFQUNBRixFQUFBdFMsRUFBQXlTLEVBQ0FILEVBQUFwcUQsRUFBQXVxRCxFQUlBLENBRUEsQ0FFQSxDQUVBLFNBQUFqc0UsRUFBQW5GLEVBQUFDLEVBQUE2VyxHQUVBbzJELEVBQUF0dkUsS0FBQW9DLEdBQ0FrdEUsRUFBQXR2RSxLQUFBcUMsR0FDQWl0RSxFQUFBdHZFLEtBQUFrWixFQUVBLENBR0EsU0FBQXc2RCxFQUFBanVFLEVBQUFDLEVBQUFDLEdBRUFndUUsRUFBQWx1RSxHQUNBa3VFLEVBQUFqdUUsR0FDQWl1RSxFQUFBaHVFLEdBRUEsTUFBQWl1RSxFQUFBekUsRUFBQXR1RSxPQUFBLEVBQ0E0OEMsRUFBQXN5QixFQUFBOEQsY0FBQXQyQixFQUFBNHhCLEVBQUF5RSxFQUFBLEVBQUFBLEVBQUEsRUFBQUEsRUFBQSxHQUVBRSxFQUFBcjJCLEVBQUEsSUFDQXEyQixFQUFBcjJCLEVBQUEsSUFDQXEyQixFQUFBcjJCLEVBQUEsR0FFQSxDQUVBLFNBQUFnMkIsRUFBQWh1RSxFQUFBQyxFQUFBQyxFQUFBOEgsR0FFQWttRSxFQUFBbHVFLEdBQ0FrdUUsRUFBQWp1RSxHQUNBaXVFLEVBQUFsbUUsR0FFQWttRSxFQUFBanVFLEdBQ0FpdUUsRUFBQWh1RSxHQUNBZ3VFLEVBQUFsbUUsR0FHQSxNQUFBbW1FLEVBQUF6RSxFQUFBdHVFLE9BQUEsRUFDQTQ4QyxFQUFBc3lCLEVBQUFnRSxtQkFBQXgyQixFQUFBNHhCLEVBQUF5RSxFQUFBLEVBQUFBLEVBQUEsRUFBQUEsRUFBQSxFQUFBQSxFQUFBLEdBRUFFLEVBQUFyMkIsRUFBQSxJQUNBcTJCLEVBQUFyMkIsRUFBQSxJQUNBcTJCLEVBQUFyMkIsRUFBQSxJQUVBcTJCLEVBQUFyMkIsRUFBQSxJQUNBcTJCLEVBQUFyMkIsRUFBQSxJQUNBcTJCLEVBQUFyMkIsRUFBQSxHQUVBLENBRUEsU0FBQWsyQixFQUFBdnpFLEdBRUErdUUsRUFBQW52RSxLQUFBc3ZFLEVBQUEsRUFBQWx2RSxFQUFBLElBQ0ErdUUsRUFBQW52RSxLQUFBc3ZFLEVBQUEsRUFBQWx2RSxFQUFBLElBQ0ErdUUsRUFBQW52RSxLQUFBc3ZFLEVBQUEsRUFBQWx2RSxFQUFBLEdBRUEsQ0FHQSxTQUFBMHpFLEVBQUFFLEdBRUE1RSxFQUFBcHZFLEtBQUFnMEUsRUFBQTV4RSxHQUNBZ3RFLEVBQUFwdkUsS0FBQWcwRSxFQUFBM3hFLEVBRUEsRUE3S0EsV0FFQSxNQUFBZ3pDLEVBQUE4NUIsRUFBQXR1RSxPQUFBLEVBRUEsR0FBQTR1RSxFQUFBLENBRUEsSUFBQWw4QyxFQUFBLEVBQ0FucEIsRUFBQWluRSxFQUFBOTlDLEVBSUEsSUFBQSxJQUFBNXlCLEVBQUEsRUFBQUEsRUFBQXd5RSxFQUFBeHlFLElBQUEsQ0FFQSxNQUFBczhDLEVBQUE0eEIsRUFBQWx1RSxHQUNBK3lFLEVBQUF6MkIsRUFBQSxHQUFBN3lDLEVBQUE2eUMsRUFBQSxHQUFBN3lDLEVBQUE2eUMsRUFBQSxHQUFBN3lDLEVBRUEsQ0FFQW1wQixFQUFBaThDLEVBQUEsRUFBQUssRUFDQXpsRSxFQUFBaW5FLEVBQUE5OUMsRUFJQSxJQUFBLElBQUE1eUIsRUFBQSxFQUFBQSxFQUFBd3lFLEVBQUF4eUUsSUFBQSxDQUVBLE1BQUFzOEMsRUFBQTR4QixFQUFBbHVFLEdBQ0EreUUsRUFBQXoyQixFQUFBLEdBQUE3eUMsRUFBQTZ5QyxFQUFBLEdBQUE3eUMsRUFBQTZ5QyxFQUFBLEdBQUE3eUMsRUFFQSxDQUVBLEtBQUEsQ0FJQSxJQUFBLElBQUF6SixFQUFBLEVBQUFBLEVBQUF3eUUsRUFBQXh5RSxJQUFBLENBRUEsTUFBQXM4QyxFQUFBNHhCLEVBQUFsdUUsR0FDQSt5RSxFQUFBejJCLEVBQUEsR0FBQUEsRUFBQSxHQUFBQSxFQUFBLEdBRUEsQ0FJQSxJQUFBLElBQUF0OEMsRUFBQSxFQUFBQSxFQUFBd3lFLEVBQUF4eUUsSUFBQSxDQUVBLE1BQUFzOEMsRUFBQTR4QixFQUFBbHVFLEdBQ0EreUUsRUFBQXoyQixFQUFBLEdBQUFvMEIsRUFBQTdCLEVBQUF2eUIsRUFBQSxHQUFBbzBCLEVBQUE3QixFQUFBdnlCLEVBQUEsR0FBQW8wQixFQUFBN0IsRUFFQSxDQUVBLENBRUFqeUIsRUFBQXZGLFNBQUEzQyxFQUFBODVCLEVBQUF0dUUsT0FBQSxFQUFBdzBDLEVBQUEsRUFFQSxDQS9EQTQrQixHQW1FQSxXQUVBLE1BQUE1K0IsRUFBQTg1QixFQUFBdHVFLE9BQUEsRUFDQSxJQUFBd3lFLEVBQUEsRUFDQUQsRUFBQTFFLEVBQUEyRSxHQUNBQSxHQUFBM0UsRUFBQTd0RSxPQUVBLElBQUEsSUFBQStNLEVBQUEsRUFBQTZpRSxFQUFBcEgsRUFBQXhvRSxPQUFBK00sRUFBQTZpRSxFQUFBN2lFLElBQUEsQ0FFQSxNQUFBOGlFLEVBQUFySCxFQUFBejdELEdBQ0F3bEUsRUFBQTFDLEVBQUEyQyxHQUdBQSxHQUFBM0MsRUFBQTd2RSxNQUVBLENBR0EwOEMsRUFBQXZGLFNBQUEzQyxFQUFBODVCLEVBQUF0dUUsT0FBQSxFQUFBdzBDLEVBQUEsRUFHQSxDQXBGQTYrQixFQW9MQSxDQXpwQkF0MEUsS0FBQWk0QyxhQUFBLFdBQUEsSUFBQXBCLEdBQUEwNEIsRUFBQSxJQUNBdnZFLEtBQUFpNEMsYUFBQSxLQUFBLElBQUFwQixHQUFBMjRCLEVBQUEsSUFFQXh2RSxLQUFBazZDLHNCQXdwQkEsQ0FFQSxJQUFBeHlDLENBQUErUCxHQU1BLE9BSkFGLE1BQUE3UCxLQUFBK1AsR0FFQXpYLEtBQUF5OEIsV0FBQWxwQixPQUFBQyxPQUFBLENBQUEsRUFBQWlFLEVBQUFnbEIsWUFFQXo4QixJQUVBLENBRUEsTUFBQWdXLEdBRUEsTUFBQVQsRUFBQWdDLE1BQUF2QixTQUtBLE9BZ0dBLFNBQUF1akIsRUFBQXBlLEVBQUE1RixHQUlBLEdBRkFBLEVBQUFna0IsT0FBQSxHQUVBampCLE1BQUFDLFFBQUFnakIsR0FFQSxJQUFBLElBQUF4NEIsRUFBQSxFQUFBQyxFQUFBdTRCLEVBQUF0NEIsT0FBQUYsRUFBQUMsRUFBQUQsSUFBQSxDQUVBLE1BQUEyN0IsRUFBQW5ELEVBQUF4NEIsR0FFQXdVLEVBQUFna0IsT0FBQW41QixLQUFBczhCLEVBQUE5bUIsS0FFQSxNQUlBTCxFQUFBZ2tCLE9BQUFuNUIsS0FBQW01QixFQUFBM2pCLE1BSUFMLEVBQUE0RixRQUFBNUgsT0FBQUMsT0FBQSxDQUFBLEVBQUEySCxRQUVBcGIsSUFBQW9iLEVBQUErMEQsY0FBQTM2RCxFQUFBNEYsUUFBQSswRCxZQUFBLzBELEVBQUErMEQsWUFBQWw2RCxVQUVBLE9BQUFULENBRUEsQ0ExSEFnL0QsQ0FIQXYwRSxLQUFBeThCLFdBQUFsRCxPQUNBdjVCLEtBQUF5OEIsV0FBQXRoQixRQUVBNUYsRUFFQSxDQVVBLGVBQUF5cEMsQ0FBQXpwQyxFQUFBZ2tCLEdBRUEsTUFBQWk3QyxFQUFBLEdBRUEsSUFBQSxJQUFBbnJELEVBQUEsRUFBQXd2QixFQUFBdGpDLEVBQUFna0IsT0FBQXQ0QixPQUFBb29CLEVBQUF3dkIsRUFBQXh2QixJQUFBLENBRUEsTUFBQXFULEVBQUFuRCxFQUFBaGtCLEVBQUFna0IsT0FBQWxRLElBRUFtckQsRUFBQXAwRSxLQUFBczhCLEVBRUEsQ0FFQSxNQUFBd3pDLEVBQUEzNkQsRUFBQTRGLFFBQUErMEQsWUFRQSxZQU5BbndFLElBQUFtd0UsSUFFQTM2RCxFQUFBNEYsUUFBQSswRCxhQUFBLElBQUFoTixHQUFBZ04sRUFBQXJ3RSxPQUFBbS9DLFNBQUFreEIsSUFJQSxJQUFBWixHQUFBa0YsRUFBQWovRCxFQUFBNEYsUUFFQSxFQUlBLE1BQUFrMUQsR0FBQSxDQUVBNEQsY0FBQSxTQUFBcnRELEVBQUFnM0IsRUFBQTYyQixFQUFBQyxFQUFBQyxHQUVBLE1BQUFDLEVBQUFoM0IsRUFBQSxFQUFBNjJCLEdBQ0FJLEVBQUFqM0IsRUFBQSxFQUFBNjJCLEVBQUEsR0FDQUssRUFBQWwzQixFQUFBLEVBQUE4MkIsR0FDQUssRUFBQW4zQixFQUFBLEVBQUE4MkIsRUFBQSxHQUNBTSxFQUFBcDNCLEVBQUEsRUFBQSsyQixHQUNBTSxFQUFBcjNCLEVBQUEsRUFBQSsyQixFQUFBLEdBRUEsTUFBQSxDQUNBLElBQUE3dEUsR0FBQTh0RSxFQUFBQyxHQUNBLElBQUEvdEUsR0FBQWd1RSxFQUFBQyxHQUNBLElBQUFqdUUsR0FBQWt1RSxFQUFBQyxHQUdBLEVBRUFkLG1CQUFBLFNBQUF2dEQsRUFBQWczQixFQUFBNjJCLEVBQUFDLEVBQUFDLEVBQUFPLEdBRUEsTUFBQU4sRUFBQWgzQixFQUFBLEVBQUE2MkIsR0FDQUksRUFBQWozQixFQUFBLEVBQUE2MkIsRUFBQSxHQUNBVSxFQUFBdjNCLEVBQUEsRUFBQTYyQixFQUFBLEdBQ0FLLEVBQUFsM0IsRUFBQSxFQUFBODJCLEdBQ0FLLEVBQUFuM0IsRUFBQSxFQUFBODJCLEVBQUEsR0FDQVUsRUFBQXgzQixFQUFBLEVBQUE4MkIsRUFBQSxHQUNBTSxFQUFBcDNCLEVBQUEsRUFBQSsyQixHQUNBTSxFQUFBcjNCLEVBQUEsRUFBQSsyQixFQUFBLEdBQ0FVLEVBQUF6M0IsRUFBQSxFQUFBKzJCLEVBQUEsR0FDQVcsRUFBQTEzQixFQUFBLEVBQUFzM0IsR0FDQUssRUFBQTMzQixFQUFBLEVBQUFzM0IsRUFBQSxHQUNBTSxFQUFBNTNCLEVBQUEsRUFBQXMzQixFQUFBLEdBRUEsT0FBQTV6RSxLQUFBNkMsSUFBQTB3RSxFQUFBRSxHQUFBenpFLEtBQUE2QyxJQUFBeXdFLEVBQUFFLEdBRUEsQ0FDQSxJQUFBaHVFLEdBQUE4dEUsRUFBQSxFQUFBTyxHQUNBLElBQUFydUUsR0FBQWd1RSxFQUFBLEVBQUFNLEdBQ0EsSUFBQXR1RSxHQUFBa3VFLEVBQUEsRUFBQUssR0FDQSxJQUFBdnVFLEdBQUF3dUUsRUFBQSxFQUFBRSxJQUtBLENBQ0EsSUFBQTF1RSxHQUFBK3RFLEVBQUEsRUFBQU0sR0FDQSxJQUFBcnVFLEdBQUFpdUUsRUFBQSxFQUFBSyxHQUNBLElBQUF0dUUsR0FBQW11RSxFQUFBLEVBQUFJLEdBQ0EsSUFBQXZ1RSxHQUFBeXVFLEVBQUEsRUFBQUMsR0FLQSxHQ24wQkEsTUFBQUMsV0FBQTFPLEdBUUEsV0FBQW5rRSxDQUFBMmhCLEVBQUEsRUFBQWtrQyxFQUFBLEdBRUEsTUFBQS9sRCxHQUFBLEVBQUFwQixLQUFBOEgsS0FBQSxJQUFBLEVBZUFtTyxNQWJBLEVBQ0EsRUFBQTdVLEVBQUEsRUFBQSxFQUFBQSxFQUFBLEdBQUEsR0FBQUEsRUFBQSxFQUFBLEdBQUFBLEVBQUEsRUFDQSxHQUFBLEVBQUFBLEVBQUEsRUFBQSxFQUFBQSxFQUFBLEdBQUEsR0FBQUEsRUFBQSxFQUFBLEdBQUFBLEVBQ0FBLEVBQUEsR0FBQSxFQUFBQSxFQUFBLEVBQUEsR0FBQUEsRUFBQSxHQUFBLEdBQUFBLEVBQUEsRUFBQSxHQUdBLENBQ0EsRUFBQSxHQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEdBQUEsRUFBQSxHQUFBLEdBQ0EsRUFBQSxFQUFBLEVBQUEsRUFBQSxHQUFBLEVBQUEsR0FBQSxHQUFBLEVBQUEsR0FBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEVBQ0EsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEVBQ0EsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEdBQUEsRUFBQSxFQUFBLEdBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEdBR0E2aEIsRUFBQWtrQyxHQUVBem9ELEtBQUFILEtBQUEsc0JBU0FHLEtBQUF5OEIsV0FBQSxDQUNBbFksT0FBQUEsRUFDQWtrQyxPQUFBQSxFQUdBLENBU0EsZUFBQXpKLENBQUF6cEMsR0FFQSxPQUFBLElBQUFrZ0UsR0FBQWxnRSxFQUFBZ1AsT0FBQWhQLEVBQUFrekMsT0FFQSxFQ3REQSxNQUFBaXRCLFdBQUEzTyxHQVFBLFdBQUFua0UsQ0FBQTJoQixFQUFBLEVBQUFra0MsRUFBQSxHQWFBbHhDLE1BWEEsQ0FDQSxFQUFBLEVBQUEsR0FBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFDQSxHQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEdBQUEsR0FHQSxDQUNBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUNBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUNBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxHQUdBZ04sRUFBQWtrQyxHQUVBem9ELEtBQUFILEtBQUEscUJBU0FHLEtBQUF5OEIsV0FBQSxDQUNBbFksT0FBQUEsRUFDQWtrQyxPQUFBQSxFQUdBLENBU0EsZUFBQXpKLENBQUF6cEMsR0FFQSxPQUFBLElBQUFtZ0UsR0FBQW5nRSxFQUFBZ1AsT0FBQWhQLEVBQUFrekMsT0FFQSxFQ2pEQSxNQUFBa3RCLFdBQUF0K0IsR0FVQSxXQUFBejBDLENBQUFxRSxFQUFBLEVBQUFDLEVBQUEsRUFBQXMyQyxFQUFBLEVBQUFDLEVBQUEsR0FFQWxtQyxRQUVBdlgsS0FBQUgsS0FBQSxnQkFTQUcsS0FBQXk4QixXQUFBLENBQ0F4MUIsTUFBQUEsRUFDQUMsT0FBQUEsRUFDQXMyQyxjQUFBQSxFQUNBQyxlQUFBQSxHQUdBLE1BQUFtNEIsRUFBQTN1RSxFQUFBLEVBQ0E0dUUsRUFBQTN1RSxFQUFBLEVBRUFpM0MsRUFBQTc4QyxLQUFBbUQsTUFBQSs0QyxHQUNBWSxFQUFBOThDLEtBQUFtRCxNQUFBZzVDLEdBRUFpQixFQUFBUCxFQUFBLEVBQ0FRLEVBQUFQLEVBQUEsRUFFQTAzQixFQUFBN3VFLEVBQUFrM0MsRUFDQTQzQixFQUFBN3VFLEVBQUFrM0MsRUFJQXJELEVBQUEsR0FDQTZDLEVBQUEsR0FDQWhELEVBQUEsR0FDQWlELEVBQUEsR0FFQSxJQUFBLElBQUFpQixFQUFBLEVBQUFBLEVBQUFILEVBQUFHLElBQUEsQ0FFQSxNQUFBcjhDLEVBQUFxOEMsRUFBQWkzQixFQUFBRixFQUVBLElBQUEsSUFBQTkyQixFQUFBLEVBQUFBLEVBQUFMLEVBQUFLLElBQUEsQ0FFQSxNQUFBdjhDLEVBQUF1OEMsRUFBQSsyQixFQUFBRixFQUVBaDRCLEVBQUF4OUMsS0FBQW9DLEdBQUFDLEVBQUEsR0FFQW00QyxFQUFBeDZDLEtBQUEsRUFBQSxFQUFBLEdBRUF5OUMsRUFBQXo5QyxLQUFBMitDLEVBQUFaLEdBQ0FOLEVBQUF6OUMsS0FBQSxFQUFBMCtDLEVBQUFWLEVBRUEsQ0FFQSxDQUVBLElBQUEsSUFBQVUsRUFBQSxFQUFBQSxFQUFBVixFQUFBVSxJQUVBLElBQUEsSUFBQUMsRUFBQSxFQUFBQSxFQUFBWixFQUFBWSxJQUFBLENBRUEsTUFBQWw1QyxFQUFBazVDLEVBQUFMLEVBQUFJLEVBQ0FoNUMsRUFBQWk1QyxFQUFBTCxHQUFBSSxFQUFBLEdBQ0EvNEMsRUFBQWc1QyxFQUFBLEVBQUFMLEdBQUFJLEVBQUEsR0FDQWp4QyxFQUFBa3hDLEVBQUEsRUFBQUwsRUFBQUksRUFFQS9ELEVBQUEzNkMsS0FBQXlGLEVBQUFDLEVBQUErSCxHQUNBa3RDLEVBQUEzNkMsS0FBQTBGLEVBQUFDLEVBQUE4SCxFQUVBLENBSUE3TixLQUFBODNDLFNBQUFpRCxHQUNBLzZDLEtBQUFpNEMsYUFBQSxXQUFBLElBQUFwQixHQUFBK0csRUFBQSxJQUNBNTlDLEtBQUFpNEMsYUFBQSxTQUFBLElBQUFwQixHQUFBK0QsRUFBQSxJQUNBNTZDLEtBQUFpNEMsYUFBQSxLQUFBLElBQUFwQixHQUFBZ0gsRUFBQSxHQUVBLENBRUEsSUFBQW4yQyxDQUFBK1AsR0FNQSxPQUpBRixNQUFBN1AsS0FBQStQLEdBRUF6WCxLQUFBeThCLFdBQUFscEIsT0FBQUMsT0FBQSxDQUFBLEVBQUFpRSxFQUFBZ2xCLFlBRUF6OEIsSUFFQSxDQVNBLGVBQUFnL0MsQ0FBQXpwQyxHQUVBLE9BQUEsSUFBQW9nRSxHQUFBcGdFLEVBQUF0TyxNQUFBc08sRUFBQXJPLE9BQUFxTyxFQUFBaW9DLGNBQUFqb0MsRUFBQWtvQyxlQUVBLEVDOUdBLE1BQUF1NEIsV0FBQTMrQixHQVlBLFdBQUF6MEMsQ0FBQXF6RSxFQUFBLEdBQUFDLEVBQUEsRUFBQUMsRUFBQSxHQUFBQyxFQUFBLEVBQUF0USxFQUFBLEVBQUFDLEVBQUEsRUFBQXprRSxLQUFBQyxJQUVBZ1csUUFFQXZYLEtBQUFILEtBQUEsZUFTQUcsS0FBQXk4QixXQUFBLENBQ0F3NUMsWUFBQUEsRUFDQUMsWUFBQUEsRUFDQUMsY0FBQUEsRUFDQUMsWUFBQUEsRUFDQXRRLFdBQUFBLEVBQ0FDLFlBQUFBLEdBR0FvUSxFQUFBNzBFLEtBQUFhLElBQUEsRUFBQWcwRSxHQUtBLE1BQUFwN0IsRUFBQSxHQUNBNkMsRUFBQSxHQUNBaEQsRUFBQSxHQUNBaUQsRUFBQSxHQUlBLElBQUF0NUIsRUFBQTB4RCxFQUNBLE1BQUFJLEdBQUFILEVBQUFELElBWkFHLEVBQUE5MEUsS0FBQWEsSUFBQSxFQUFBaTBFLElBYUEvUSxFQUFBLElBQUFyakQsR0FDQTdJLEVBQUEsSUFBQXJTLEdBSUEsSUFBQSxJQUFBdWlCLEVBQUEsRUFBQUEsR0FBQStzRCxFQUFBL3NELElBQUEsQ0FFQSxJQUFBLElBQUF0b0IsRUFBQSxFQUFBQSxHQUFBbzFFLEVBQUFwMUUsSUFBQSxDQUlBLE1BQUFpbEUsRUFBQUYsRUFBQS9rRSxFQUFBbzFFLEVBQUFwUSxFQUlBVixFQUFBN2lFLEVBQUEraEIsRUFBQWpqQixLQUFBMkUsSUFBQSsvRCxHQUNBWCxFQUFBNWlFLEVBQUE4aEIsRUFBQWpqQixLQUFBNEUsSUFBQTgvRCxHQUVBcG9CLEVBQUF4OUMsS0FBQWlsRSxFQUFBN2lFLEVBQUE2aUUsRUFBQTVpRSxFQUFBNGlFLEVBQUEvckQsR0FJQXNoQyxFQUFBeDZDLEtBQUEsRUFBQSxFQUFBLEdBSUErWSxFQUFBM1csR0FBQTZpRSxFQUFBN2lFLEVBQUEwekUsRUFBQSxHQUFBLEVBQ0EvOEQsRUFBQTFXLEdBQUE0aUUsRUFBQTVpRSxFQUFBeXpFLEVBQUEsR0FBQSxFQUVBcjRCLEVBQUF6OUMsS0FBQStZLEVBQUEzVyxFQUFBMlcsRUFBQTFXLEVBRUEsQ0FJQThoQixHQUFBOHhELENBRUEsQ0FJQSxJQUFBLElBQUFodEQsRUFBQSxFQUFBQSxFQUFBK3NELEVBQUEvc0QsSUFBQSxDQUVBLE1BQUFpdEQsRUFBQWp0RCxHQUFBOHNELEVBQUEsR0FFQSxJQUFBLElBQUFwMUUsRUFBQSxFQUFBQSxFQUFBbzFFLEVBQUFwMUUsSUFBQSxDQUVBLE1BQUFpbEUsRUFBQWpsRSxFQUFBdTFFLEVBRUF6d0UsRUFBQW1nRSxFQUNBbGdFLEVBQUFrZ0UsRUFBQW1RLEVBQUEsRUFDQXB3RSxFQUFBaWdFLEVBQUFtUSxFQUFBLEVBQ0F0b0UsRUFBQW00RCxFQUFBLEVBSUFqckIsRUFBQTM2QyxLQUFBeUYsRUFBQUMsRUFBQStILEdBQ0FrdEMsRUFBQTM2QyxLQUFBMEYsRUFBQUMsRUFBQThILEVBRUEsQ0FFQSxDQUlBN04sS0FBQTgzQyxTQUFBaUQsR0FDQS82QyxLQUFBaTRDLGFBQUEsV0FBQSxJQUFBcEIsR0FBQStHLEVBQUEsSUFDQTU5QyxLQUFBaTRDLGFBQUEsU0FBQSxJQUFBcEIsR0FBQStELEVBQUEsSUFDQTU2QyxLQUFBaTRDLGFBQUEsS0FBQSxJQUFBcEIsR0FBQWdILEVBQUEsR0FFQSxDQUVBLElBQUFuMkMsQ0FBQStQLEdBTUEsT0FKQUYsTUFBQTdQLEtBQUErUCxHQUVBelgsS0FBQXk4QixXQUFBbHBCLE9BQUFDLE9BQUEsQ0FBQSxFQUFBaUUsRUFBQWdsQixZQUVBejhCLElBRUEsQ0FTQSxlQUFBZy9DLENBQUF6cEMsR0FFQSxPQUFBLElBQUF5Z0UsR0FBQXpnRSxFQUFBMGdFLFlBQUExZ0UsRUFBQTJnRSxZQUFBM2dFLEVBQUE0Z0UsY0FBQTVnRSxFQUFBNmdFLFlBQUE3Z0UsRUFBQXV3RCxXQUFBdndELEVBQUF3d0QsWUFFQSxFQ3hJQSxNQUFBd1EsV0FBQWwvQixHQVFBLFdBQUF6MEMsQ0FBQTIyQixFQUFBLElBQUFpd0MsR0FBQSxDQUFBLElBQUExaUUsR0FBQSxFQUFBLElBQUEsSUFBQUEsSUFBQSxJQUFBLElBQUEsSUFBQUEsR0FBQSxJQUFBLE1BQUE2b0UsRUFBQSxJQUVBcDRELFFBRUF2WCxLQUFBSCxLQUFBLGdCQVNBRyxLQUFBeThCLFdBQUEsQ0FDQWxELE9BQUFBLEVBQ0FvMkMsY0FBQUEsR0FLQSxNQUFBNTBCLEVBQUEsR0FDQTZDLEVBQUEsR0FDQWhELEVBQUEsR0FDQWlELEVBQUEsR0FJQSxJQUFBRSxFQUFBLEVBQ0FjLEVBQUEsRUFJQSxJQUFBLElBQUF2b0MsTUFBQUMsUUFBQWdqQixHQUVBazJDLEVBQUFsMkMsUUFJQSxJQUFBLElBQUF4NEIsRUFBQSxFQUFBQSxFQUFBdzRCLEVBQUF0NEIsT0FBQUYsSUFFQTB1RSxFQUFBbDJDLEVBQUF4NEIsSUFFQWYsS0FBQW80QyxTQUFBMkYsRUFBQWMsRUFBQTk5QyxHQUVBZzlDLEdBQUFjLEVBQ0FBLEVBQUEsRUFnQkEsU0FBQTR3QixFQUFBL3lDLEdBRUEsTUFBQTg1QyxFQUFBNTRCLEVBQUEzOEMsT0FBQSxFQUNBMGtCLEVBQUErVyxFQUFBa3RDLGNBQUErRixHQUVBLElBQUE4RyxFQUFBOXdELEVBQUErVyxNQUNBLE1BQUFnNkMsRUFBQS93RCxFQUFBOGpELE9BSUEsSUFBQW9GLEdBQUFFLFlBQUEwSCxLQUVBQSxFQUFBQSxFQUFBN0YsV0FJQSxJQUFBLElBQUE3dkUsRUFBQSxFQUFBQyxFQUFBMDFFLEVBQUF6MUUsT0FBQUYsRUFBQUMsRUFBQUQsSUFBQSxDQUVBLE1BQUE0MUUsRUFBQUQsRUFBQTMxRSxJQUVBLElBQUE4dEUsR0FBQUUsWUFBQTRILEtBRUFELEVBQUEzMUUsR0FBQTQxRSxFQUFBL0YsVUFJQSxDQUVBLE1BQUEzQixFQUFBSixHQUFBRyxpQkFBQXlILEVBQUFDLEdBSUEsSUFBQSxJQUFBMzFFLEVBQUEsRUFBQUMsRUFBQTAxRSxFQUFBejFFLE9BQUFGLEVBQUFDLEVBQUFELElBQUEsQ0FFQSxNQUFBNDFFLEVBQUFELEVBQUEzMUUsR0FDQTAxRSxFQUFBQSxFQUFBaHpCLE9BQUFrekIsRUFFQSxDQUlBLElBQUEsSUFBQTUxRSxFQUFBLEVBQUFDLEVBQUF5MUUsRUFBQXgxRSxPQUFBRixFQUFBQyxFQUFBRCxJQUFBLENBRUEsTUFBQXNrRSxFQUFBb1IsRUFBQTExRSxHQUVBNjhDLEVBQUF4OUMsS0FBQWlsRSxFQUFBN2lFLEVBQUE2aUUsRUFBQTVpRSxFQUFBLEdBQ0FtNEMsRUFBQXg2QyxLQUFBLEVBQUEsRUFBQSxHQUNBeTlDLEVBQUF6OUMsS0FBQWlsRSxFQUFBN2lFLEVBQUE2aUUsRUFBQTVpRSxFQUVBLENBSUEsSUFBQSxJQUFBMUIsRUFBQSxFQUFBQyxFQUFBaXVFLEVBQUFodUUsT0FBQUYsRUFBQUMsRUFBQUQsSUFBQSxDQUVBLE1BQUFzOEMsRUFBQTR4QixFQUFBbHVFLEdBRUE4RSxFQUFBdzNDLEVBQUEsR0FBQW01QixFQUNBMXdFLEVBQUF1M0MsRUFBQSxHQUFBbTVCLEVBQ0F6d0UsRUFBQXMzQyxFQUFBLEdBQUFtNUIsRUFFQXo3QixFQUFBMzZDLEtBQUF5RixFQUFBQyxFQUFBQyxHQUNBODRDLEdBQUEsQ0FFQSxDQUVBLENBMUVBNytDLEtBQUE4M0MsU0FBQWlELEdBQ0EvNkMsS0FBQWk0QyxhQUFBLFdBQUEsSUFBQXBCLEdBQUErRyxFQUFBLElBQ0E1OUMsS0FBQWk0QyxhQUFBLFNBQUEsSUFBQXBCLEdBQUErRCxFQUFBLElBQ0E1NkMsS0FBQWk0QyxhQUFBLEtBQUEsSUFBQXBCLEdBQUFnSCxFQUFBLEdBeUVBLENBRUEsSUFBQW4yQyxDQUFBK1AsR0FNQSxPQUpBRixNQUFBN1AsS0FBQStQLEdBRUF6WCxLQUFBeThCLFdBQUFscEIsT0FBQUMsT0FBQSxDQUFBLEVBQUFpRSxFQUFBZ2xCLFlBRUF6OEIsSUFFQSxDQUVBLE1BQUFnVyxHQUVBLE1BQUFULEVBQUFnQyxNQUFBdkIsU0FJQSxPQThCQSxTQUFBdWpCLEVBQUFoa0IsR0FJQSxHQUZBQSxFQUFBZ2tCLE9BQUEsR0FFQWpqQixNQUFBQyxRQUFBZ2pCLEdBRUEsSUFBQSxJQUFBeDRCLEVBQUEsRUFBQUMsRUFBQXU0QixFQUFBdDRCLE9BQUFGLEVBQUFDLEVBQUFELElBQUEsQ0FFQSxNQUFBMjdCLEVBQUFuRCxFQUFBeDRCLEdBRUF3VSxFQUFBZ2tCLE9BQUFuNUIsS0FBQXM4QixFQUFBOW1CLEtBRUEsTUFJQUwsRUFBQWdrQixPQUFBbjVCLEtBQUFtNUIsRUFBQTNqQixNQUlBLE9BQUFMLENBRUEsQ0FwREFTLENBRkFoVyxLQUFBeThCLFdBQUFsRCxPQUVBaGtCLEVBRUEsQ0FVQSxlQUFBeXBDLENBQUF6cEMsRUFBQWdrQixHQUVBLE1BQUFpN0MsRUFBQSxHQUVBLElBQUEsSUFBQW5yRCxFQUFBLEVBQUF3dkIsRUFBQXRqQyxFQUFBZ2tCLE9BQUF0NEIsT0FBQW9vQixFQUFBd3ZCLEVBQUF4dkIsSUFBQSxDQUVBLE1BQUFxVCxFQUFBbkQsRUFBQWhrQixFQUFBZ2tCLE9BQUFsUSxJQUVBbXJELEVBQUFwMEUsS0FBQXM4QixFQUVBLENBRUEsT0FBQSxJQUFBNjVDLEdBQUEvQixFQUFBai9ELEVBQUFvNkQsY0FFQSxFQzNMQSxNQUFBaUgsV0FBQXYvQixHQWFBLFdBQUF6MEMsQ0FBQTJoQixFQUFBLEVBQUFpNUIsRUFBQSxHQUFBQyxFQUFBLEdBQUF3bkIsRUFBQSxFQUFBQyxFQUFBLEVBQUE1akUsS0FBQUMsR0FBQXVrRSxFQUFBLEVBQUFDLEVBQUF6a0UsS0FBQUMsSUFFQWdXLFFBRUF2WCxLQUFBSCxLQUFBLGlCQVNBRyxLQUFBeThCLFdBQUEsQ0FDQWxZLE9BQUFBLEVBQ0FpNUIsY0FBQUEsRUFDQUMsZUFBQUEsRUFDQXduQixTQUFBQSxFQUNBQyxVQUFBQSxFQUNBWSxXQUFBQSxFQUNBQyxZQUFBQSxHQUdBdm9CLEVBQUFsOEMsS0FBQWEsSUFBQSxFQUFBYixLQUFBbUQsTUFBQSs0QyxJQUNBQyxFQUFBbjhDLEtBQUFhLElBQUEsRUFBQWIsS0FBQW1ELE1BQUFnNUMsSUFFQSxNQUFBbzVCLEVBQUF2MUUsS0FBQVksSUFBQTRqRSxFQUFBQyxFQUFBemtFLEtBQUFDLElBRUEsSUFBQWYsRUFBQSxFQUNBLE1BQUFzMkUsRUFBQSxHQUVBelIsRUFBQSxJQUFBcmpELEdBQ0FtQyxFQUFBLElBQUFuQyxHQUlBKzRCLEVBQUEsR0FDQTZDLEVBQUEsR0FDQWhELEVBQUEsR0FDQWlELEVBQUEsR0FJQSxJQUFBLElBQUFpQixFQUFBLEVBQUFBLEdBQUFyQixFQUFBcUIsSUFBQSxDQUVBLE1BQUFpNEIsRUFBQSxHQUVBcHZFLEVBQUFtM0MsRUFBQXJCLEVBSUEsSUFBQXU1QixFQUFBLEVBRUEsSUFBQWw0QixHQUFBLElBQUFnbkIsRUFFQWtSLEVBQUEsR0FBQXg1QixFQUVBc0IsSUFBQXJCLEdBQUFvNUIsSUFBQXYxRSxLQUFBQyxLQUVBeTFFLEdBQUEsR0FBQXg1QixHQUlBLElBQUEsSUFBQXVCLEVBQUEsRUFBQUEsR0FBQXZCLEVBQUF1QixJQUFBLENBRUEsTUFBQTk1QixFQUFBODVCLEVBQUF2QixFQUlBNm5CLEVBQUE3aUUsR0FBQStoQixFQUFBampCLEtBQUEyRSxJQUFBZy9ELEVBQUFoZ0QsRUFBQWlnRCxHQUFBNWpFLEtBQUE0RSxJQUFBNC9ELEVBQUFuK0QsRUFBQW8rRCxHQUNBVixFQUFBNWlFLEVBQUE4aEIsRUFBQWpqQixLQUFBMkUsSUFBQTYvRCxFQUFBbitELEVBQUFvK0QsR0FDQVYsRUFBQS9yRCxFQUFBaUwsRUFBQWpqQixLQUFBNEUsSUFBQSsrRCxFQUFBaGdELEVBQUFpZ0QsR0FBQTVqRSxLQUFBNEUsSUFBQTQvRCxFQUFBbitELEVBQUFvK0QsR0FFQW5vQixFQUFBeDlDLEtBQUFpbEUsRUFBQTdpRSxFQUFBNmlFLEVBQUE1aUUsRUFBQTRpRSxFQUFBL3JELEdBSUE2SyxFQUFBemMsS0FBQTI5RCxHQUFBaGlFLFlBQ0F1M0MsRUFBQXg2QyxLQUFBK2pCLEVBQUEzaEIsRUFBQTJoQixFQUFBMWhCLEVBQUEwaEIsRUFBQTdLLEdBSUF1a0MsRUFBQXo5QyxLQUFBNmtCLEVBQUEreEQsRUFBQSxFQUFBcnZFLEdBRUFvdkUsRUFBQTMyRSxLQUFBSSxJQUVBLENBRUFzMkUsRUFBQTEyRSxLQUFBMjJFLEVBRUEsQ0FJQSxJQUFBLElBQUFqNEIsRUFBQSxFQUFBQSxFQUFBckIsRUFBQXFCLElBRUEsSUFBQSxJQUFBQyxFQUFBLEVBQUFBLEVBQUF2QixFQUFBdUIsSUFBQSxDQUVBLE1BQUFsNUMsRUFBQWl4RSxFQUFBaDRCLEdBQUFDLEVBQUEsR0FDQWo1QyxFQUFBZ3hFLEVBQUFoNEIsR0FBQUMsR0FDQWg1QyxFQUFBK3dFLEVBQUFoNEIsRUFBQSxHQUFBQyxHQUNBbHhDLEVBQUFpcEUsRUFBQWg0QixFQUFBLEdBQUFDLEVBQUEsSUFFQSxJQUFBRCxHQUFBZ25CLEVBQUEsSUFBQS9xQixFQUFBMzZDLEtBQUF5RixFQUFBQyxFQUFBK0gsSUFDQWl4QyxJQUFBckIsRUFBQSxHQUFBbzVCLEVBQUF2MUUsS0FBQUMsS0FBQXc1QyxFQUFBMzZDLEtBQUEwRixFQUFBQyxFQUFBOEgsRUFFQSxDQU1BN04sS0FBQTgzQyxTQUFBaUQsR0FDQS82QyxLQUFBaTRDLGFBQUEsV0FBQSxJQUFBcEIsR0FBQStHLEVBQUEsSUFDQTU5QyxLQUFBaTRDLGFBQUEsU0FBQSxJQUFBcEIsR0FBQStELEVBQUEsSUFDQTU2QyxLQUFBaTRDLGFBQUEsS0FBQSxJQUFBcEIsR0FBQWdILEVBQUEsR0FFQSxDQUVBLElBQUFuMkMsQ0FBQStQLEdBTUEsT0FKQUYsTUFBQTdQLEtBQUErUCxHQUVBelgsS0FBQXk4QixXQUFBbHBCLE9BQUFDLE9BQUEsQ0FBQSxFQUFBaUUsRUFBQWdsQixZQUVBejhCLElBRUEsQ0FTQSxlQUFBZy9DLENBQUF6cEMsR0FFQSxPQUFBLElBQUFxaEUsR0FBQXJoRSxFQUFBZ1AsT0FBQWhQLEVBQUFpb0MsY0FBQWpvQyxFQUFBa29DLGVBQUFsb0MsRUFBQTB2RCxTQUFBMXZELEVBQUEydkQsVUFBQTN2RCxFQUFBdXdELFdBQUF2d0QsRUFBQXd3RCxZQUVBLEVDM0pBLE1BQUFrUixXQUFBbFEsR0FRQSxXQUFBbmtFLENBQUEyaEIsRUFBQSxFQUFBa2tDLEVBQUEsR0FVQWx4QyxNQVJBLENBQ0EsRUFBQSxFQUFBLEdBQUEsR0FBQSxFQUFBLEdBQUEsRUFBQSxHQUFBLEVBQUEsR0FBQSxHQUFBLEdBR0EsQ0FDQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsR0FHQWdOLEVBQUFra0MsR0FFQXpvRCxLQUFBSCxLQUFBLHNCQVNBRyxLQUFBeThCLFdBQUEsQ0FDQWxZLE9BQUFBLEVBQ0Fra0MsT0FBQUEsRUFHQSxDQVNBLGVBQUF6SixDQUFBenBDLEdBRUEsT0FBQSxJQUFBMGhFLEdBQUExaEUsRUFBQWdQLE9BQUFoUCxFQUFBa3pDLE9BRUEsRUM3Q0EsTUFBQXl1QixXQUFBNy9CLEdBV0EsV0FBQXowQyxDQUFBMmhCLEVBQUEsRUFBQTR5RCxFQUFBLEdBQUF4UixFQUFBLEdBQUF5UixFQUFBLEdBQUExUyxFQUFBLEVBQUFwakUsS0FBQUMsSUFFQWdXLFFBRUF2WCxLQUFBSCxLQUFBLGdCQVNBRyxLQUFBeThCLFdBQUEsQ0FDQWxZLE9BQUFBLEVBQ0E0eUQsS0FBQUEsRUFDQXhSLGVBQUFBLEVBQ0F5UixnQkFBQUEsRUFDQTFTLElBQUFBLEdBR0FpQixFQUFBcmtFLEtBQUFtRCxNQUFBa2hFLEdBQ0F5UixFQUFBOTFFLEtBQUFtRCxNQUFBMnlFLEdBSUEsTUFBQXI4QixFQUFBLEdBQ0E2QyxFQUFBLEdBQ0FoRCxFQUFBLEdBQ0FpRCxFQUFBLEdBSUE5eUMsRUFBQSxJQUFBaVgsR0FDQXFqRCxFQUFBLElBQUFyakQsR0FDQW1DLEVBQUEsSUFBQW5DLEdBSUEsSUFBQSxJQUFBcUgsRUFBQSxFQUFBQSxHQUFBczhDLEVBQUF0OEMsSUFFQSxJQUFBLElBQUF0b0IsRUFBQSxFQUFBQSxHQUFBcTJFLEVBQUFyMkUsSUFBQSxDQUVBLE1BQUFra0IsRUFBQWxrQixFQUFBcTJFLEVBQUExUyxFQUNBLzhELEVBQUEwaEIsRUFBQXM4QyxFQUFBcmtFLEtBQUFDLEdBQUEsRUFJQThqRSxFQUFBN2lFLEdBQUEraEIsRUFBQTR5RCxFQUFBNzFFLEtBQUEyRSxJQUFBMEIsSUFBQXJHLEtBQUEyRSxJQUFBZ2YsR0FDQW9nRCxFQUFBNWlFLEdBQUE4aEIsRUFBQTR5RCxFQUFBNzFFLEtBQUEyRSxJQUFBMEIsSUFBQXJHLEtBQUE0RSxJQUFBK2UsR0FDQW9nRCxFQUFBL3JELEVBQUE2OUQsRUFBQTcxRSxLQUFBNEUsSUFBQXlCLEdBRUFpMkMsRUFBQXg5QyxLQUFBaWxFLEVBQUE3aUUsRUFBQTZpRSxFQUFBNWlFLEVBQUE0aUUsRUFBQS9yRCxHQUlBdk8sRUFBQXZJLEVBQUEraEIsRUFBQWpqQixLQUFBMkUsSUFBQWdmLEdBQ0FsYSxFQUFBdEksRUFBQThoQixFQUFBampCLEtBQUE0RSxJQUFBK2UsR0FDQWQsRUFBQWpjLFdBQUFtOUQsRUFBQXQ2RCxHQUFBMUgsWUFFQXUzQyxFQUFBeDZDLEtBQUErakIsRUFBQTNoQixFQUFBMmhCLEVBQUExaEIsRUFBQTBoQixFQUFBN0ssR0FJQXVrQyxFQUFBejlDLEtBQUFXLEVBQUFxMkUsR0FDQXY1QixFQUFBejlDLEtBQUFpcEIsRUFBQXM4QyxFQUVBLENBTUEsSUFBQSxJQUFBdDhDLEVBQUEsRUFBQUEsR0FBQXM4QyxFQUFBdDhDLElBRUEsSUFBQSxJQUFBdG9CLEVBQUEsRUFBQUEsR0FBQXEyRSxFQUFBcjJFLElBQUEsQ0FJQSxNQUFBOEUsR0FBQXV4RSxFQUFBLEdBQUEvdEQsRUFBQXRvQixFQUFBLEVBQ0ErRSxHQUFBc3hFLEVBQUEsSUFBQS90RCxFQUFBLEdBQUF0b0IsRUFBQSxFQUNBZ0YsR0FBQXF4RSxFQUFBLElBQUEvdEQsRUFBQSxHQUFBdG9CLEVBQ0E4TSxHQUFBdXBFLEVBQUEsR0FBQS90RCxFQUFBdG9CLEVBSUFnNkMsRUFBQTM2QyxLQUFBeUYsRUFBQUMsRUFBQStILEdBQ0FrdEMsRUFBQTM2QyxLQUFBMEYsRUFBQUMsRUFBQThILEVBRUEsQ0FNQTdOLEtBQUE4M0MsU0FBQWlELEdBQ0EvNkMsS0FBQWk0QyxhQUFBLFdBQUEsSUFBQXBCLEdBQUErRyxFQUFBLElBQ0E1OUMsS0FBQWk0QyxhQUFBLFNBQUEsSUFBQXBCLEdBQUErRCxFQUFBLElBQ0E1NkMsS0FBQWk0QyxhQUFBLEtBQUEsSUFBQXBCLEdBQUFnSCxFQUFBLEdBRUEsQ0FFQSxJQUFBbjJDLENBQUErUCxHQU1BLE9BSkFGLE1BQUE3UCxLQUFBK1AsR0FFQXpYLEtBQUF5OEIsV0FBQWxwQixPQUFBQyxPQUFBLENBQUEsRUFBQWlFLEVBQUFnbEIsWUFFQXo4QixJQUVBLENBU0EsZUFBQWcvQyxDQUFBenBDLEdBRUEsT0FBQSxJQUFBMmhFLEdBQUEzaEUsRUFBQWdQLE9BQUFoUCxFQUFBNGhFLEtBQUE1aEUsRUFBQW93RCxlQUFBcHdELEVBQUE2aEUsZ0JBQUE3aEUsRUFBQW12RCxJQUVBLEVDcElBLE1BQUEyUyxXQUFBaGdDLEdBWUEsV0FBQXowQyxDQUFBMmhCLEVBQUEsRUFBQTR5RCxFQUFBLEdBQUFDLEVBQUEsR0FBQXpSLEVBQUEsRUFBQTl5QyxFQUFBLEVBQUFqdEIsRUFBQSxHQUVBMlIsUUFFQXZYLEtBQUFILEtBQUEsb0JBU0FHLEtBQUF5OEIsV0FBQSxDQUNBbFksT0FBQUEsRUFDQTR5RCxLQUFBQSxFQUNBQyxnQkFBQUEsRUFDQXpSLGVBQUFBLEVBQ0E5eUMsRUFBQUEsRUFDQWp0QixFQUFBQSxHQUdBd3hFLEVBQUE5MUUsS0FBQW1ELE1BQUEyeUUsR0FDQXpSLEVBQUFya0UsS0FBQW1ELE1BQUFraEUsR0FJQSxNQUFBNXFCLEVBQUEsR0FDQTZDLEVBQUEsR0FDQWhELEVBQUEsR0FDQWlELEVBQUEsR0FJQXduQixFQUFBLElBQUFyakQsR0FDQW1DLEVBQUEsSUFBQW5DLEdBRUFzMUQsRUFBQSxJQUFBdDFELEdBQ0F1MUQsRUFBQSxJQUFBdjFELEdBRUF3MUQsRUFBQSxJQUFBeDFELEdBQ0F5MUQsRUFBQSxJQUFBejFELEdBQ0EwMUQsRUFBQSxJQUFBMTFELEdBSUEsSUFBQSxJQUFBamhCLEVBQUEsRUFBQUEsR0FBQXEyRSxJQUFBcjJFLEVBQUEsQ0FJQSxNQUFBa2tCLEVBQUFsa0IsRUFBQXEyRSxFQUFBdmtELEVBQUF2eEIsS0FBQUMsR0FBQSxFQUtBbzJFLEVBQUExeUQsRUFBQTROLEVBQUFqdEIsRUFBQTJlLEVBQUEreUQsR0FDQUssRUFBQTF5RCxFQUFBLElBQUE0TixFQUFBanRCLEVBQUEyZSxFQUFBZ3pELEdBSUFFLEVBQUF2dkUsV0FBQXF2RSxFQUFBRCxHQUNBSSxFQUFBNXZFLFdBQUF5dkUsRUFBQUQsR0FDQUUsRUFBQWowRCxhQUFBazBELEVBQUFDLEdBQ0FBLEVBQUFuMEQsYUFBQWkwRCxFQUFBQyxHQUlBRCxFQUFBbjBFLFlBQ0FxMEUsRUFBQXIwRSxZQUVBLElBQUEsSUFBQWdtQixFQUFBLEVBQUFBLEdBQUFzOEMsSUFBQXQ4QyxFQUFBLENBS0EsTUFBQTFoQixFQUFBMGhCLEVBQUFzOEMsRUFBQXJrRSxLQUFBQyxHQUFBLEVBQ0E0TixHQUFBZ29FLEVBQUE3MUUsS0FBQTJFLElBQUEwQixHQUNBeUgsRUFBQStuRSxFQUFBNzFFLEtBQUE0RSxJQUFBeUIsR0FLQTA5RCxFQUFBN2lFLEVBQUE4MEUsRUFBQTkwRSxHQUFBMk0sRUFBQXVvRSxFQUFBbDFFLEVBQUE0TSxFQUFBb29FLEVBQUFoMUUsR0FDQTZpRSxFQUFBNWlFLEVBQUE2MEUsRUFBQTcwRSxHQUFBME0sRUFBQXVvRSxFQUFBajFFLEVBQUEyTSxFQUFBb29FLEVBQUEvMEUsR0FDQTRpRSxFQUFBL3JELEVBQUFnK0QsRUFBQWgrRCxHQUFBbkssRUFBQXVvRSxFQUFBcCtELEVBQUFsSyxFQUFBb29FLEVBQUFsK0QsR0FFQXNrQyxFQUFBeDlDLEtBQUFpbEUsRUFBQTdpRSxFQUFBNmlFLEVBQUE1aUUsRUFBQTRpRSxFQUFBL3JELEdBSUE2SyxFQUFBamMsV0FBQW05RCxFQUFBaVMsR0FBQWowRSxZQUVBdTNDLEVBQUF4NkMsS0FBQStqQixFQUFBM2hCLEVBQUEyaEIsRUFBQTFoQixFQUFBMGhCLEVBQUE3SyxHQUlBdWtDLEVBQUF6OUMsS0FBQVcsRUFBQXEyRSxHQUNBdjVCLEVBQUF6OUMsS0FBQWlwQixFQUFBczhDLEVBRUEsQ0FFQSxDQUlBLElBQUEsSUFBQXQ4QyxFQUFBLEVBQUFBLEdBQUErdEQsRUFBQS90RCxJQUVBLElBQUEsSUFBQXRvQixFQUFBLEVBQUFBLEdBQUE0a0UsRUFBQTVrRSxJQUFBLENBSUEsTUFBQThFLEdBQUE4L0QsRUFBQSxJQUFBdDhDLEVBQUEsSUFBQXRvQixFQUFBLEdBQ0ErRSxHQUFBNi9ELEVBQUEsR0FBQXQ4QyxHQUFBdG9CLEVBQUEsR0FDQWdGLEdBQUE0L0QsRUFBQSxHQUFBdDhDLEVBQUF0b0IsRUFDQThNLEdBQUE4M0QsRUFBQSxJQUFBdDhDLEVBQUEsR0FBQXRvQixFQUlBZzZDLEVBQUEzNkMsS0FBQXlGLEVBQUFDLEVBQUErSCxHQUNBa3RDLEVBQUEzNkMsS0FBQTBGLEVBQUFDLEVBQUE4SCxFQUVBLENBYUEsU0FBQThwRSxFQUFBMXlELEVBQUE0TixFQUFBanRCLEVBQUEyZSxFQUFBaU4sR0FFQSxNQUFBb21ELEVBQUF0MkUsS0FBQTJFLElBQUFnZixHQUNBNHlELEVBQUF2MkUsS0FBQTRFLElBQUErZSxHQUNBNnlELEVBQUFseUUsRUFBQWl0QixFQUFBNU4sRUFDQTh5RCxFQUFBejJFLEtBQUEyRSxJQUFBNnhFLEdBRUF0bUQsRUFBQWh2QixFQUFBK2hCLEdBQUEsRUFBQXd6RCxHQUFBLEdBQUFILEVBQ0FwbUQsRUFBQS91QixFQUFBOGhCLEdBQUEsRUFBQXd6RCxHQUFBRixFQUFBLEdBQ0FybUQsRUFBQWxZLEVBQUFpTCxFQUFBampCLEtBQUE0RSxJQUFBNHhFLEdBQUEsRUFFQSxDQWxCQTkzRSxLQUFBODNDLFNBQUFpRCxHQUNBLzZDLEtBQUFpNEMsYUFBQSxXQUFBLElBQUFwQixHQUFBK0csRUFBQSxJQUNBNTlDLEtBQUFpNEMsYUFBQSxTQUFBLElBQUFwQixHQUFBK0QsRUFBQSxJQUNBNTZDLEtBQUFpNEMsYUFBQSxLQUFBLElBQUFwQixHQUFBZ0gsRUFBQSxHQWlCQSxDQUVBLElBQUFuMkMsQ0FBQStQLEdBTUEsT0FKQUYsTUFBQTdQLEtBQUErUCxHQUVBelgsS0FBQXk4QixXQUFBbHBCLE9BQUFDLE9BQUEsQ0FBQSxFQUFBaUUsRUFBQWdsQixZQUVBejhCLElBRUEsQ0FTQSxlQUFBZy9DLENBQUF6cEMsR0FFQSxPQUFBLElBQUE4aEUsR0FBQTloRSxFQUFBZ1AsT0FBQWhQLEVBQUE0aEUsS0FBQTVoRSxFQUFBNmhFLGdCQUFBN2hFLEVBQUFvd0QsZUFBQXB3RCxFQUFBc2QsRUFBQXRkLEVBQUEzUCxFQUVBLEVDeEtBLE1BQUFveUUsV0FBQTNnQyxHQVdBLFdBQUF6MEMsQ0FBQWdqRSxFQUFBLElBQUF0RCxHQUFBLElBQUF0Z0QsSUFBQSxHQUFBLEVBQUEsR0FBQSxJQUFBQSxJQUFBLEVBQUEsRUFBQSxHQUFBLElBQUFBLEdBQUEsRUFBQSxFQUFBLElBQUFvMUQsRUFBQSxHQUFBN3lELEVBQUEsRUFBQW9oRCxFQUFBLEVBQUFqSCxHQUFBLEdBRUFubkQsUUFFQXZYLEtBQUFILEtBQUEsZUFTQUcsS0FBQXk4QixXQUFBLENBQ0FtcEMsS0FBQUEsRUFDQXdSLGdCQUFBQSxFQUNBN3lELE9BQUFBLEVBQ0FvaEQsZUFBQUEsRUFDQWpILE9BQUFBLEdBR0EsTUFBQXVaLEVBQUFyUyxFQUFBcEgsb0JBQUE0WSxFQUFBMVksR0FJQTErRCxLQUFBMitELFNBQUFzWixFQUFBdFosU0FDQTMrRCxLQUFBNDZDLFFBQUFxOUIsRUFBQXI5QixRQUNBNTZDLEtBQUE0K0QsVUFBQXFaLEVBQUFyWixVQUlBLE1BQUF5RyxFQUFBLElBQUFyakQsR0FDQW1DLEVBQUEsSUFBQW5DLEdBQ0E3SSxFQUFBLElBQUFyUyxHQUNBLElBQUFveEUsRUFBQSxJQUFBbDJELEdBSUEsTUFBQTQ3QixFQUFBLEdBQ0FoRCxFQUFBLEdBQ0FpRCxFQUFBLEdBQ0E5QyxFQUFBLEdBeUNBLFNBQUFvOUIsRUFBQXAzRSxHQUlBbTNFLEVBQUF0UyxFQUFBekksV0FBQXA4RCxFQUFBcTJFLEVBQUFjLEdBSUEsTUFBQVIsRUFBQU8sRUFBQXI5QixRQUFBNzVDLEdBQ0F5MkUsRUFBQVMsRUFBQXJaLFVBQUE3OUQsR0FJQSxJQUFBLElBQUFzb0IsRUFBQSxFQUFBQSxHQUFBczhDLEVBQUF0OEMsSUFBQSxDQUVBLE1BQUExaEIsRUFBQTBoQixFQUFBczhDLEVBQUFya0UsS0FBQUMsR0FBQSxFQUVBMkUsRUFBQTVFLEtBQUE0RSxJQUFBeUIsR0FDQTFCLEdBQUEzRSxLQUFBMkUsSUFBQTBCLEdBSUF3YyxFQUFBM2hCLEVBQUF5RCxFQUFBeXhFLEVBQUFsMUUsRUFBQTBELEVBQUFzeEUsRUFBQWgxRSxFQUNBMmhCLEVBQUExaEIsRUFBQXdELEVBQUF5eEUsRUFBQWoxRSxFQUFBeUQsRUFBQXN4RSxFQUFBLzBFLEVBQ0EwaEIsRUFBQTdLLEVBQUFyVCxFQUFBeXhFLEVBQUFwK0QsRUFBQXBULEVBQUFzeEUsRUFBQWwrRCxFQUNBNkssRUFBQTlnQixZQUVBdTNDLEVBQUF4NkMsS0FBQStqQixFQUFBM2hCLEVBQUEyaEIsRUFBQTFoQixFQUFBMGhCLEVBQUE3SyxHQUlBK3JELEVBQUE3aUUsRUFBQTAxRSxFQUFBMTFFLEVBQUEraEIsRUFBQUosRUFBQTNoQixFQUNBNmlFLEVBQUE1aUUsRUFBQXkxRSxFQUFBejFFLEVBQUE4aEIsRUFBQUosRUFBQTFoQixFQUNBNGlFLEVBQUEvckQsRUFBQTQrRCxFQUFBNStELEVBQUFpTCxFQUFBSixFQUFBN0ssRUFFQXNrQyxFQUFBeDlDLEtBQUFpbEUsRUFBQTdpRSxFQUFBNmlFLEVBQUE1aUUsRUFBQTRpRSxFQUFBL3JELEVBRUEsQ0FFQSxFQWpFQSxXQUVBLElBQUEsSUFBQXZZLEVBQUEsRUFBQUEsRUFBQXEyRSxFQUFBcjJFLElBRUFvM0UsRUFBQXAzRSxHQVNBbzNFLEdBQUEsSUFBQXpaLEVBQUEwWSxFQUFBLEdBNEVBLFdBRUEsSUFBQSxJQUFBcjJFLEVBQUEsRUFBQUEsR0FBQXEyRSxFQUFBcjJFLElBRUEsSUFBQSxJQUFBc29CLEVBQUEsRUFBQUEsR0FBQXM4QyxFQUFBdDhDLElBRUFsUSxFQUFBM1csRUFBQXpCLEVBQUFxMkUsRUFDQWorRCxFQUFBMVcsRUFBQTRtQixFQUFBczhDLEVBRUE5bkIsRUFBQXo5QyxLQUFBK1ksRUFBQTNXLEVBQUEyVyxFQUFBMVcsRUFNQSxDQXRGQXdsRSxHQWlEQSxXQUVBLElBQUEsSUFBQTUrQyxFQUFBLEVBQUFBLEdBQUErdEQsRUFBQS90RCxJQUVBLElBQUEsSUFBQXRvQixFQUFBLEVBQUFBLEdBQUE0a0UsRUFBQTVrRSxJQUFBLENBRUEsTUFBQThFLEdBQUE4L0QsRUFBQSxJQUFBdDhDLEVBQUEsSUFBQXRvQixFQUFBLEdBQ0ErRSxHQUFBNi9ELEVBQUEsR0FBQXQ4QyxHQUFBdG9CLEVBQUEsR0FDQWdGLEdBQUE0L0QsRUFBQSxHQUFBdDhDLEVBQUF0b0IsRUFDQThNLEdBQUE4M0QsRUFBQSxJQUFBdDhDLEVBQUEsR0FBQXRvQixFQUlBZzZDLEVBQUEzNkMsS0FBQXlGLEVBQUFDLEVBQUErSCxHQUNBa3RDLEVBQUEzNkMsS0FBQTBGLEVBQUFDLEVBQUE4SCxFQUVBLENBSUEsQ0FqRUF1cUUsRUFFQSxDQW5DQUMsR0FJQXI0RSxLQUFBODNDLFNBQUFpRCxHQUNBLzZDLEtBQUFpNEMsYUFBQSxXQUFBLElBQUFwQixHQUFBK0csRUFBQSxJQUNBNTlDLEtBQUFpNEMsYUFBQSxTQUFBLElBQUFwQixHQUFBK0QsRUFBQSxJQUNBNTZDLEtBQUFpNEMsYUFBQSxLQUFBLElBQUFwQixHQUFBZ0gsRUFBQSxHQThHQSxDQUVBLElBQUFuMkMsQ0FBQStQLEdBTUEsT0FKQUYsTUFBQTdQLEtBQUErUCxHQUVBelgsS0FBQXk4QixXQUFBbHBCLE9BQUFDLE9BQUEsQ0FBQSxFQUFBaUUsRUFBQWdsQixZQUVBejhCLElBRUEsQ0FFQSxNQUFBZ1csR0FFQSxNQUFBVCxFQUFBZ0MsTUFBQXZCLFNBSUEsT0FGQVQsRUFBQXF3RCxLQUFBNWxFLEtBQUF5OEIsV0FBQW1wQyxLQUFBNXZELFNBRUFULENBRUEsQ0FTQSxlQUFBeXBDLENBQUF6cEMsR0FJQSxPQUFBLElBQUF5aUUsSUFDQSxJQUFBOVUsR0FBQTN0RCxFQUFBcXdELEtBQUEvbEUsT0FBQW0vQyxTQUFBenBDLEVBQUFxd0QsTUFDQXJ3RCxFQUFBNmhFLGdCQUNBN2hFLEVBQUFnUCxPQUNBaFAsRUFBQW93RCxlQUNBcHdELEVBQUFtcEQsT0FHQSxFQzlOQSxNQUFBNFosV0FBQWpoQyxHQU9BLFdBQUF6MEMsQ0FBQWdrQixFQUFBLE1BaUJBLEdBZkFyUCxRQUVBdlgsS0FBQUgsS0FBQSxvQkFTQUcsS0FBQXk4QixXQUFBLENBQ0E3VixTQUFBQSxHQUdBLE9BQUFBLEVBQUEsQ0FJQSxNQUFBZzNCLEVBQUEsR0FDQTI2QixFQUFBLElBQUE1N0QsSUFJQTg0QixFQUFBLElBQUF6ekIsR0FDQW91QyxFQUFBLElBQUFwdUMsR0FFQSxHQUFBLE9BQUE0RSxFQUFBcG1CLE1BQUEsQ0FJQSxNQUFBZ3hCLEVBQUE1SyxFQUFBNHdCLFdBQUFobUIsU0FDQXVwQixFQUFBbjBCLEVBQUFwbUIsTUFDQSxJQUFBbTNDLEVBQUEvd0IsRUFBQSt3QixPQUVBLElBQUFBLEVBQUExMkMsU0FFQTAyQyxFQUFBLENBQUEsQ0FBQWxDLE1BQUEsRUFBQTE1QixNQUFBZy9CLEVBQUFoL0IsTUFBQXM4QixjQUFBLEtBTUEsSUFBQSxJQUFBbWdDLEVBQUEsRUFBQUMsRUFBQTlnQyxFQUFBMTJDLE9BQUF1M0UsRUFBQUMsSUFBQUQsRUFBQSxDQUVBLE1BQUExK0IsRUFBQW5DLEVBQUE2Z0MsR0FFQXo2QixFQUFBakUsRUFBQXJFLE1BR0EsSUFBQSxJQUFBMTBDLEVBQUFnOUMsRUFBQS84QyxFQUFBKzhDLEVBRkFqRSxFQUFBLzlCLE1BRUFoYixFQUFBQyxFQUFBRCxHQUFBLEVBRUEsSUFBQSxJQUFBc29CLEVBQUEsRUFBQUEsRUFBQSxFQUFBQSxJQUFBLENBRUEsTUFBQXVzQixFQUFBbUYsRUFBQW53QyxLQUFBN0osRUFBQXNvQixHQUNBd3NCLEVBQUFrRixFQUFBbndDLEtBQUE3SixHQUFBc29CLEVBQUEsR0FBQSxHQUVBb3NCLEVBQUEvcUMsb0JBQUE4bUIsRUFBQW9rQixHQUNBd2EsRUFBQTFsRCxvQkFBQThtQixFQUFBcWtCLElBRUEsSUFBQTZpQyxHQUFBampDLEVBQUEyYSxFQUFBbW9CLEtBRUEzNkIsRUFBQXg5QyxLQUFBcTFDLEVBQUFqekMsRUFBQWl6QyxFQUFBaHpDLEVBQUFnekMsRUFBQW44QixHQUNBc2tDLEVBQUF4OUMsS0FBQWd3RCxFQUFBNXRELEVBQUE0dEQsRUFBQTN0RCxFQUFBMnRELEVBQUE5MkMsR0FJQSxDQUlBLENBRUEsS0FBQSxDQUlBLE1BQUFrWSxFQUFBNUssRUFBQTR3QixXQUFBaG1CLFNBRUEsSUFBQSxJQUFBendCLEVBQUEsRUFBQUMsRUFBQXd3QixFQUFBelYsTUFBQSxFQUFBaGIsRUFBQUMsRUFBQUQsSUFFQSxJQUFBLElBQUFzb0IsRUFBQSxFQUFBQSxFQUFBLEVBQUFBLElBQUEsQ0FLQSxNQUFBdXNCLEVBQUEsRUFBQTcwQyxFQUFBc29CLEVBQ0F3c0IsRUFBQSxFQUFBOTBDLEdBQUFzb0IsRUFBQSxHQUFBLEVBRUFvc0IsRUFBQS9xQyxvQkFBQThtQixFQUFBb2tCLEdBQ0F3YSxFQUFBMWxELG9CQUFBOG1CLEVBQUFxa0IsSUFFQSxJQUFBNmlDLEdBQUFqakMsRUFBQTJhLEVBQUFtb0IsS0FFQTM2QixFQUFBeDlDLEtBQUFxMUMsRUFBQWp6QyxFQUFBaXpDLEVBQUFoekMsRUFBQWd6QyxFQUFBbjhCLEdBQ0Fza0MsRUFBQXg5QyxLQUFBZ3dELEVBQUE1dEQsRUFBQTR0RCxFQUFBM3RELEVBQUEydEQsRUFBQTkyQyxHQUlBLENBSUEsQ0FJQXRaLEtBQUFpNEMsYUFBQSxXQUFBLElBQUFwQixHQUFBK0csRUFBQSxHQUVBLENBRUEsQ0FFQSxJQUFBbDJDLENBQUErUCxHQU1BLE9BSkFGLE1BQUE3UCxLQUFBK1AsR0FFQXpYLEtBQUF5OEIsV0FBQWxwQixPQUFBQyxPQUFBLENBQUEsRUFBQWlFLEVBQUFnbEIsWUFFQXo4QixJQUVBLEVBSUEsU0FBQTA0RSxHQUFBampDLEVBQUEyYSxFQUFBbW9CLEdBRUEsTUFBQUksRUFBQSxHQUFBbGpDLEVBQUFqekMsS0FBQWl6QyxFQUFBaHpDLEtBQUFnekMsRUFBQW44QixLQUFBODJDLEVBQUE1dEQsS0FBQTR0RCxFQUFBM3RELEtBQUEydEQsRUFBQTkyQyxJQUNBcy9ELEVBQUEsR0FBQXhvQixFQUFBNXRELEtBQUE0dEQsRUFBQTN0RCxLQUFBMnRELEVBQUE5MkMsS0FBQW04QixFQUFBanpDLEtBQUFpekMsRUFBQWh6QyxLQUFBZ3pDLEVBQUFuOEIsSUFFQSxPQUFBLElBQUFpL0QsRUFBQU0sSUFBQUYsS0FBQSxJQUFBSixFQUFBTSxJQUFBRCxLQU1BTCxFQUFBM3dFLElBQUErd0UsR0FDQUosRUFBQTN3RSxJQUFBZ3hFLElBQ0EsRUFJQSxzYkMxSkEsTUFBQUUsV0FBQTNzQyxHQVdBLFdBQUF2cEMsQ0FBQTY1QixHQUVBbGxCLFFBU0F2WCxLQUFBKzRFLGtCQUFBLEVBRUEvNEUsS0FBQUgsS0FBQSxpQkFRQUcsS0FBQXFTLE1BQUEsSUFBQXkzQixHQUFBLEdBU0E5cEMsS0FBQXlzQyxhQUFBLEVBUUF6c0MsS0FBQXV6QyxLQUFBLEVBRUF2ekMsS0FBQWl2QyxVQUFBeFMsRUFFQSxDQUVBLElBQUEvMEIsQ0FBQStQLEdBUUEsT0FOQUYsTUFBQTdQLEtBQUErUCxHQUVBelgsS0FBQXFTLE1BQUEzSyxLQUFBK1AsRUFBQXBGLE9BRUFyUyxLQUFBdXpDLElBQUE5N0IsRUFBQTg3QixJQUVBdnpDLElBRUEsRUMzRUEsTUFBQWc1RSxXQUFBbDVCLEdBV0EsV0FBQWw5QyxDQUFBNjVCLEdBRUFsbEIsTUFBQWtsQixHQVNBejhCLEtBQUFpNUUscUJBQUEsRUFFQWo1RSxLQUFBSCxLQUFBLG1CQUVBLEVDRUEsTUFBQXE1RSxXQUFBL3NDLEdBV0EsV0FBQXZwQyxDQUFBNjVCLEdBRUFsbEIsUUFTQXZYLEtBQUFtNUUsd0JBQUEsRUFFQW41RSxLQUFBSCxLQUFBLHVCQUVBRyxLQUFBZ2dELFFBQUEsQ0FBQW81QixTQUFBLElBUUFwNUUsS0FBQXFTLE1BQUEsSUFBQXkzQixHQUFBLFVBVUE5cEMsS0FBQW92QyxVQUFBLEVBV0FwdkMsS0FBQXF2QyxVQUFBLEVBVUFydkMsS0FBQTQ2QixJQUFBLEtBUUE1NkIsS0FBQSt3QyxTQUFBLEtBUUEvd0MsS0FBQWd4QyxrQkFBQSxFQVNBaHhDLEtBQUFpeEMsTUFBQSxLQVVBanhDLEtBQUFreEMsZUFBQSxFQVNBbHhDLEtBQUF5dkMsU0FBQSxJQUFBM0YsR0FBQSxHQVFBOXBDLEtBQUEwdkMsa0JBQUEsRUFVQTF2QyxLQUFBNnhDLFlBQUEsS0FXQTd4QyxLQUFBbXhDLFFBQUEsS0FRQW54QyxLQUFBb3hDLFVBQUEsRUFhQXB4QyxLQUFBcXhDLFVBQUEsS0FRQXJ4QyxLQUFBc3hDLGNySDJnQ1ksRXFIbmdDWnR4QyxLQUFBdXhDLFlBQUEsSUFBQXpxQyxHQUFBLEVBQUEsR0FhQTlHLEtBQUF3eEMsZ0JBQUEsS0FVQXh4QyxLQUFBeXhDLGtCQUFBLEVBVUF6eEMsS0FBQTB4QyxpQkFBQSxFQVNBMXhDLEtBQUEyeEMsYUFBQSxLQVNBM3hDLEtBQUE0eEMsYUFBQSxLQWVBNXhDLEtBQUE4d0MsU0FBQSxLQVNBOXdDLEtBQUFpeUMsT0FBQSxLQVFBanlDLEtBQUFteUMsZUFBQSxJQUFBbGYsR0FRQWp6QixLQUFBb3lDLGdCQUFBLEVBUUFweUMsS0FBQWt6QyxXQUFBLEVBVUFsekMsS0FBQW16QyxtQkFBQSxFQVVBbnpDLEtBQUFvekMsaUJBQUEsUUFVQXB6QyxLQUFBcXpDLGtCQUFBLFFBUUFyekMsS0FBQXN6QyxhQUFBLEVBUUF0ekMsS0FBQXV6QyxLQUFBLEVBRUF2ekMsS0FBQWl2QyxVQUFBeFMsRUFFQSxDQUVBLElBQUEvMEIsQ0FBQStQLEdBb0RBLE9BbERBRixNQUFBN1AsS0FBQStQLEdBRUF6WCxLQUFBZ2dELFFBQUEsQ0FBQW81QixTQUFBLElBRUFwNUUsS0FBQXFTLE1BQUEzSyxLQUFBK1AsRUFBQXBGLE9BQ0FyUyxLQUFBb3ZDLFVBQUEzM0IsRUFBQTIzQixVQUNBcHZDLEtBQUFxdkMsVUFBQTUzQixFQUFBNDNCLFVBRUFydkMsS0FBQTQ2QixJQUFBbmpCLEVBQUFtakIsSUFFQTU2QixLQUFBK3dDLFNBQUF0NUIsRUFBQXM1QixTQUNBL3dDLEtBQUFneEMsa0JBQUF2NUIsRUFBQXU1QixrQkFFQWh4QyxLQUFBaXhDLE1BQUF4NUIsRUFBQXc1QixNQUNBanhDLEtBQUFreEMsZUFBQXo1QixFQUFBeTVCLGVBRUFseEMsS0FBQXl2QyxTQUFBL25DLEtBQUErUCxFQUFBZzRCLFVBQ0F6dkMsS0FBQTZ4QyxZQUFBcDZCLEVBQUFvNkIsWUFDQTd4QyxLQUFBMHZDLGtCQUFBajRCLEVBQUFpNEIsa0JBRUExdkMsS0FBQW14QyxRQUFBMTVCLEVBQUEwNUIsUUFDQW54QyxLQUFBb3hDLFVBQUEzNUIsRUFBQTI1QixVQUVBcHhDLEtBQUFxeEMsVUFBQTU1QixFQUFBNDVCLFVBQ0FyeEMsS0FBQXN4QyxjQUFBNzVCLEVBQUE2NUIsY0FDQXR4QyxLQUFBdXhDLFlBQUE3cEMsS0FBQStQLEVBQUE4NUIsYUFFQXZ4QyxLQUFBd3hDLGdCQUFBLzVCLEVBQUErNUIsZ0JBQ0F4eEMsS0FBQXl4QyxrQkFBQWg2QixFQUFBZzZCLGtCQUNBenhDLEtBQUEweEMsaUJBQUFqNkIsRUFBQWk2QixpQkFFQTF4QyxLQUFBMnhDLGFBQUFsNkIsRUFBQWs2QixhQUVBM3hDLEtBQUE0eEMsYUFBQW42QixFQUFBbTZCLGFBRUE1eEMsS0FBQTh3QyxTQUFBcjVCLEVBQUFxNUIsU0FFQTl3QyxLQUFBaXlDLE9BQUF4NkIsRUFBQXc2QixPQUNBanlDLEtBQUFteUMsZUFBQXpxQyxLQUFBK1AsRUFBQTA2QixnQkFDQW55QyxLQUFBb3lDLGdCQUFBMzZCLEVBQUEyNkIsZ0JBRUFweUMsS0FBQWt6QyxVQUFBejdCLEVBQUF5N0IsVUFDQWx6QyxLQUFBbXpDLG1CQUFBMTdCLEVBQUEwN0IsbUJBQ0FuekMsS0FBQW96QyxpQkFBQTM3QixFQUFBMjdCLGlCQUNBcHpDLEtBQUFxekMsa0JBQUE1N0IsRUFBQTQ3QixrQkFFQXJ6QyxLQUFBc3pDLFlBQUE3N0IsRUFBQTY3QixZQUVBdHpDLEtBQUF1ekMsSUFBQTk3QixFQUFBODdCLElBRUF2ekMsSUFFQSxFQ3JZQSxNQUFBcTVFLFdBQUFILEdBV0EsV0FBQXQyRSxDQUFBNjVCLEdBRUFsbEIsUUFTQXZYLEtBQUFzNUUsd0JBQUEsRUFFQXQ1RSxLQUFBZ2dELFFBQUEsQ0FFQW81QixTQUFBLEdBQ0FHLFNBQUEsSUFJQXY1RSxLQUFBSCxLQUFBLHVCQVVBRyxLQUFBMndDLG1CQUFBLEVBVUEzd0MsS0FBQTR3QyxjQUFBLEtBU0E1d0MsS0FBQWl3QyxhQUFBLEtBUUFqd0MsS0FBQWd3QyxtQkFBQSxFQVNBaHdDLEtBQUFrd0Msc0JBQUEsS0FTQWx3QyxLQUFBb3dDLHFCQUFBLElBQUF0cEMsR0FBQSxFQUFBLEdBUUE5RyxLQUFBbXdDLG1CQUFBLEtBUUFud0MsS0FBQXc1RSxJQUFBLElBYUFqbUUsT0FBQW9DLGVBQUEzVixLQUFBLGVBQUEsQ0FDQXk1RSxJQUFBLFdBRUEsT0FBQXozRSxHQUFBLEtBQUFoQyxLQUFBdzVFLElBQUEsSUFBQXg1RSxLQUFBdzVFLElBQUEsR0FBQSxFQUFBLEVBRUEsRUFDQTd5RSxJQUFBLFNBQUEwckMsR0FFQXJ5QyxLQUFBdzVFLEtBQUEsRUFBQSxHQUFBbm5DLElBQUEsRUFBQSxHQUFBQSxFQUVBLElBVUFyeUMsS0FBQXl3QyxlQUFBLEtBU0F6d0MsS0FBQXV3QyxlQUFBLElBU0F2d0MsS0FBQXd3QywwQkFBQSxDQUFBLElBQUEsS0FZQXh3QyxLQUFBMHdDLHdCQUFBLEtBUUExd0MsS0FBQXV2QyxXQUFBLElBQUF6RixHQUFBLEdBU0E5cEMsS0FBQTA1RSxjQUFBLEtBUUExNUUsS0FBQXd2QyxlQUFBLEVBU0F4dkMsS0FBQTI1RSxrQkFBQSxLQVNBMzVFLEtBQUF5eUMsZ0JBQUEsS0FVQXp5QyxLQUFBMHlDLFVBQUEsRUFTQTF5QyxLQUFBMnlDLGFBQUEsS0FVQTN5QyxLQUFBNHlDLG9CQUFBenRCLElBU0FubEIsS0FBQTZ5QyxpQkFBQSxJQUFBL0ksR0FBQSxFQUFBLEVBQUEsR0FTQTlwQyxLQUFBNHZDLGtCQUFBLEVBU0E1dkMsS0FBQSt4QyxxQkFBQSxLQVFBL3hDLEtBQUE2dkMsY0FBQSxJQUFBL0YsR0FBQSxFQUFBLEVBQUEsR0FTQTlwQyxLQUFBZ3lDLGlCQUFBLEtBRUFoeUMsS0FBQTQ1RSxZQUFBLEVBQ0E1NUUsS0FBQTY1RSxXQUFBLEVBQ0E3NUUsS0FBQTg1RSxZQUFBLEVBQ0E5NUUsS0FBQSs1RSxhQUFBLEVBQ0EvNUUsS0FBQWc2RSxPQUFBLEVBQ0FoNkUsS0FBQWk2RSxjQUFBLEVBRUFqNkUsS0FBQWl2QyxVQUFBeFMsRUFFQSxDQVFBLGNBQUFwbEIsR0FFQSxPQUFBclgsS0FBQTQ1RSxXQUVBLENBRUEsY0FBQXZpRSxDQUFBcFYsR0FFQWpDLEtBQUE0NUUsWUFBQSxHQUFBMzNFLEVBQUEsR0FFQWpDLEtBQUE4VixVQUlBOVYsS0FBQTQ1RSxZQUFBMzNFLENBRUEsQ0FVQSxhQUFBOHRDLEdBRUEsT0FBQS92QyxLQUFBNjVFLFVBRUEsQ0FFQSxhQUFBOXBDLENBQUE5dEMsR0FFQWpDLEtBQUE2NUUsV0FBQSxHQUFBNTNFLEVBQUEsR0FFQWpDLEtBQUE4VixVQUlBOVYsS0FBQTY1RSxXQUFBNTNFLENBRUEsQ0FRQSxlQUFBcXVDLEdBRUEsT0FBQXR3QyxLQUFBKzVFLFlBRUEsQ0FFQSxlQUFBenBDLENBQUFydUMsR0FFQWpDLEtBQUErNUUsYUFBQSxHQUFBOTNFLEVBQUEsR0FFQWpDLEtBQUE4VixVQUlBOVYsS0FBQSs1RSxhQUFBOTNFLENBRUEsQ0FVQSxjQUFBb3VDLEdBRUEsT0FBQXJ3QyxLQUFBODVFLFdBRUEsQ0FFQSxjQUFBenBDLENBQUFwdUMsR0FFQWpDLEtBQUE4NUUsWUFBQSxHQUFBNzNFLEVBQUEsR0FFQWpDLEtBQUE4VixVQUlBOVYsS0FBQTg1RSxZQUFBNzNFLENBRUEsQ0FRQSxTQUFBcXRDLEdBRUEsT0FBQXR2QyxLQUFBZzZFLE1BRUEsQ0FFQSxTQUFBMXFDLENBQUFydEMsR0FFQWpDLEtBQUFnNkUsT0FBQSxHQUFBLzNFLEVBQUEsR0FFQWpDLEtBQUE4VixVQUlBOVYsS0FBQWc2RSxPQUFBLzNFLENBRUEsQ0FjQSxnQkFBQXV3QyxHQUVBLE9BQUF4eUMsS0FBQWk2RSxhQUVBLENBRUEsZ0JBQUF6bkMsQ0FBQXZ3QyxHQUVBakMsS0FBQWk2RSxjQUFBLEdBQUFoNEUsRUFBQSxHQUVBakMsS0FBQThWLFVBSUE5VixLQUFBaTZFLGNBQUFoNEUsQ0FFQSxDQUVBLElBQUF5RixDQUFBK1AsR0FrREEsT0FoREFGLE1BQUE3UCxLQUFBK1AsR0FFQXpYLEtBQUFnZ0QsUUFBQSxDQUVBbzVCLFNBQUEsR0FDQUcsU0FBQSxJQUlBdjVFLEtBQUFxWCxXQUFBSSxFQUFBSixXQUNBclgsS0FBQTJ3QyxtQkFBQWw1QixFQUFBazVCLG1CQUNBM3dDLEtBQUE0d0MsY0FBQW41QixFQUFBbTVCLGNBRUE1d0MsS0FBQSt2QyxVQUFBdDRCLEVBQUFzNEIsVUFDQS92QyxLQUFBaXdDLGFBQUF4NEIsRUFBQXc0QixhQUNBandDLEtBQUFnd0MsbUJBQUF2NEIsRUFBQXU0QixtQkFDQWh3QyxLQUFBa3dDLHNCQUFBejRCLEVBQUF5NEIsc0JBQ0Fsd0MsS0FBQW13QyxtQkFBQTE0QixFQUFBMDRCLG1CQUNBbndDLEtBQUFvd0MscUJBQUExb0MsS0FBQStQLEVBQUEyNEIsc0JBRUFwd0MsS0FBQXF3QyxXQUFBNTRCLEVBQUE0NEIsV0FDQXJ3QyxLQUFBdzVFLElBQUEvaEUsRUFBQStoRSxJQUVBeDVFLEtBQUFzd0MsWUFBQTc0QixFQUFBNjRCLFlBQ0F0d0MsS0FBQXl3QyxlQUFBaDVCLEVBQUFnNUIsZUFDQXp3QyxLQUFBdXdDLGVBQUE5NEIsRUFBQTg0QixlQUNBdndDLEtBQUF3d0MsMEJBQUEsSUFBQS80QixFQUFBKzRCLDJCQUNBeHdDLEtBQUEwd0Msd0JBQUFqNUIsRUFBQWk1Qix3QkFFQTF3QyxLQUFBc3ZDLE1BQUE3M0IsRUFBQTYzQixNQUNBdHZDLEtBQUF1dkMsV0FBQTduQyxLQUFBK1AsRUFBQTgzQixZQUNBdnZDLEtBQUEwNUUsY0FBQWppRSxFQUFBaWlFLGNBQ0ExNUUsS0FBQXd2QyxlQUFBLzNCLEVBQUErM0IsZUFDQXh2QyxLQUFBMjVFLGtCQUFBbGlFLEVBQUFraUUsa0JBRUEzNUUsS0FBQXd5QyxhQUFBLzZCLEVBQUErNkIsYUFDQXh5QyxLQUFBeXlDLGdCQUFBaDdCLEVBQUFnN0IsZ0JBRUF6eUMsS0FBQTB5QyxVQUFBajdCLEVBQUFpN0IsVUFDQTF5QyxLQUFBMnlDLGFBQUFsN0IsRUFBQWs3QixhQUNBM3lDLEtBQUE0eUMsb0JBQUFuN0IsRUFBQW03QixvQkFDQTV5QyxLQUFBNnlDLGlCQUFBbnJDLEtBQUErUCxFQUFBbzdCLGtCQUVBN3lDLEtBQUE0dkMsa0JBQUFuNEIsRUFBQW00QixrQkFDQTV2QyxLQUFBK3hDLHFCQUFBdDZCLEVBQUFzNkIscUJBQ0EveEMsS0FBQTZ2QyxjQUFBbm9DLEtBQUErUCxFQUFBbzRCLGVBQ0E3dkMsS0FBQWd5QyxpQkFBQXY2QixFQUFBdTZCLGlCQUVBaHlDLElBRUEsRUM5ZkEsTUFBQWs2RSxXQUFBL3RDLEdBV0EsV0FBQXZwQyxDQUFBNjVCLEdBRUFsbEIsUUFTQXZYLEtBQUFtNkUscUJBQUEsRUFFQW42RSxLQUFBSCxLQUFBLG9CQVFBRyxLQUFBcVMsTUFBQSxJQUFBeTNCLEdBQUEsVUFTQTlwQyxLQUFBMnZDLFNBQUEsSUFBQTdGLEdBQUEsU0FRQTlwQyxLQUFBOHZDLFVBQUEsR0FVQTl2QyxLQUFBNDZCLElBQUEsS0FRQTU2QixLQUFBK3dDLFNBQUEsS0FRQS93QyxLQUFBZ3hDLGtCQUFBLEVBU0FoeEMsS0FBQWl4QyxNQUFBLEtBVUFqeEMsS0FBQWt4QyxlQUFBLEVBU0FseEMsS0FBQXl2QyxTQUFBLElBQUEzRixHQUFBLEdBUUE5cEMsS0FBQTB2QyxrQkFBQSxFQVVBMXZDLEtBQUE2eEMsWUFBQSxLQVdBN3hDLEtBQUFteEMsUUFBQSxLQVFBbnhDLEtBQUFveEMsVUFBQSxFQWFBcHhDLEtBQUFxeEMsVUFBQSxLQVFBcnhDLEtBQUFzeEMsY3ZIb2lDWSxFdUg1aENadHhDLEtBQUF1eEMsWUFBQSxJQUFBenFDLEdBQUEsRUFBQSxHQWFBOUcsS0FBQXd4QyxnQkFBQSxLQVVBeHhDLEtBQUF5eEMsa0JBQUEsRUFVQXp4QyxLQUFBMHhDLGlCQUFBLEVBVUExeEMsS0FBQTh4QyxZQUFBLEtBZUE5eEMsS0FBQTh3QyxTQUFBLEtBUUE5d0MsS0FBQWl5QyxPQUFBLEtBUUFqeUMsS0FBQW15QyxlQUFBLElBQUFsZixHQVdBanpCLEtBQUFreUMsUXZIbUhZLEV1SDFHWmx5QyxLQUFBcXlDLGFBQUEsRUFXQXJ5QyxLQUFBc3lDLGdCQUFBLElBUUF0eUMsS0FBQWt6QyxXQUFBLEVBVUFsekMsS0FBQW16QyxtQkFBQSxFQVVBbnpDLEtBQUFvekMsaUJBQUEsUUFVQXB6QyxLQUFBcXpDLGtCQUFBLFFBUUFyekMsS0FBQXN6QyxhQUFBLEVBUUF0ekMsS0FBQXV6QyxLQUFBLEVBRUF2ekMsS0FBQWl2QyxVQUFBeFMsRUFFQSxDQUVBLElBQUEvMEIsQ0FBQStQLEdBa0RBLE9BaERBRixNQUFBN1AsS0FBQStQLEdBRUF6WCxLQUFBcVMsTUFBQTNLLEtBQUErUCxFQUFBcEYsT0FDQXJTLEtBQUEydkMsU0FBQWpvQyxLQUFBK1AsRUFBQWs0QixVQUNBM3ZDLEtBQUE4dkMsVUFBQXI0QixFQUFBcTRCLFVBRUE5dkMsS0FBQTQ2QixJQUFBbmpCLEVBQUFtakIsSUFFQTU2QixLQUFBK3dDLFNBQUF0NUIsRUFBQXM1QixTQUNBL3dDLEtBQUFneEMsa0JBQUF2NUIsRUFBQXU1QixrQkFFQWh4QyxLQUFBaXhDLE1BQUF4NUIsRUFBQXc1QixNQUNBanhDLEtBQUFreEMsZUFBQXo1QixFQUFBeTVCLGVBRUFseEMsS0FBQXl2QyxTQUFBL25DLEtBQUErUCxFQUFBZzRCLFVBQ0F6dkMsS0FBQTZ4QyxZQUFBcDZCLEVBQUFvNkIsWUFDQTd4QyxLQUFBMHZDLGtCQUFBajRCLEVBQUFpNEIsa0JBRUExdkMsS0FBQW14QyxRQUFBMTVCLEVBQUEwNUIsUUFDQW54QyxLQUFBb3hDLFVBQUEzNUIsRUFBQTI1QixVQUVBcHhDLEtBQUFxeEMsVUFBQTU1QixFQUFBNDVCLFVBQ0FyeEMsS0FBQXN4QyxjQUFBNzVCLEVBQUE2NUIsY0FDQXR4QyxLQUFBdXhDLFlBQUE3cEMsS0FBQStQLEVBQUE4NUIsYUFFQXZ4QyxLQUFBd3hDLGdCQUFBLzVCLEVBQUErNUIsZ0JBQ0F4eEMsS0FBQXl4QyxrQkFBQWg2QixFQUFBZzZCLGtCQUNBenhDLEtBQUEweEMsaUJBQUFqNkIsRUFBQWk2QixpQkFFQTF4QyxLQUFBOHhDLFlBQUFyNkIsRUFBQXE2QixZQUVBOXhDLEtBQUE4d0MsU0FBQXI1QixFQUFBcTVCLFNBRUE5d0MsS0FBQWl5QyxPQUFBeDZCLEVBQUF3NkIsT0FDQWp5QyxLQUFBbXlDLGVBQUF6cUMsS0FBQStQLEVBQUEwNkIsZ0JBQ0FueUMsS0FBQWt5QyxRQUFBejZCLEVBQUF5NkIsUUFDQWx5QyxLQUFBcXlDLGFBQUE1NkIsRUFBQTQ2QixhQUNBcnlDLEtBQUFzeUMsZ0JBQUE3NkIsRUFBQTY2QixnQkFFQXR5QyxLQUFBa3pDLFVBQUF6N0IsRUFBQXk3QixVQUNBbHpDLEtBQUFtekMsbUJBQUExN0IsRUFBQTA3QixtQkFDQW56QyxLQUFBb3pDLGlCQUFBMzdCLEVBQUEyN0IsaUJBQ0FwekMsS0FBQXF6QyxrQkFBQTU3QixFQUFBNDdCLGtCQUVBcnpDLEtBQUFzekMsWUFBQTc3QixFQUFBNjdCLFlBRUF0ekMsS0FBQXV6QyxJQUFBOTdCLEVBQUE4N0IsSUFFQXZ6QyxJQUVBLEVDNVlBLE1BQUFvNkUsV0FBQWp1QyxHQVdBLFdBQUF2cEMsQ0FBQTY1QixHQUVBbGxCLFFBU0F2WCxLQUFBcTZFLG9CQUFBLEVBRUFyNkUsS0FBQWdnRCxRQUFBLENBQUFzNkIsS0FBQSxJQUVBdDZFLEtBQUFILEtBQUEsbUJBUUFHLEtBQUFxUyxNQUFBLElBQUF5M0IsR0FBQSxVQVVBOXBDLEtBQUE0NkIsSUFBQSxLQVVBNTZCLEtBQUF1eUMsWUFBQSxLQVFBdnlDLEtBQUErd0MsU0FBQSxLQVFBL3dDLEtBQUFneEMsa0JBQUEsRUFTQWh4QyxLQUFBaXhDLE1BQUEsS0FVQWp4QyxLQUFBa3hDLGVBQUEsRUFTQWx4QyxLQUFBeXZDLFNBQUEsSUFBQTNGLEdBQUEsR0FRQTlwQyxLQUFBMHZDLGtCQUFBLEVBVUExdkMsS0FBQTZ4QyxZQUFBLEtBV0E3eEMsS0FBQW14QyxRQUFBLEtBUUFueEMsS0FBQW94QyxVQUFBLEVBYUFweEMsS0FBQXF4QyxVQUFBLEtBUUFyeEMsS0FBQXN4QyxjeEhtakNZLEV3SDNpQ1p0eEMsS0FBQXV4QyxZQUFBLElBQUF6cUMsR0FBQSxFQUFBLEdBYUE5RyxLQUFBd3hDLGdCQUFBLEtBVUF4eEMsS0FBQXl4QyxrQkFBQSxFQVVBenhDLEtBQUEweEMsaUJBQUEsRUFlQTF4QyxLQUFBOHdDLFNBQUEsS0FRQTl3QyxLQUFBa3pDLFdBQUEsRUFVQWx6QyxLQUFBbXpDLG1CQUFBLEVBVUFuekMsS0FBQW96QyxpQkFBQSxRQVVBcHpDLEtBQUFxekMsa0JBQUEsUUFRQXJ6QyxLQUFBdXpDLEtBQUEsRUFFQXZ6QyxLQUFBaXZDLFVBQUF4UyxFQUVBLENBRUEsSUFBQS8wQixDQUFBK1AsR0F1Q0EsT0FyQ0FGLE1BQUE3UCxLQUFBK1AsR0FFQXpYLEtBQUFxUyxNQUFBM0ssS0FBQStQLEVBQUFwRixPQUVBclMsS0FBQTQ2QixJQUFBbmpCLEVBQUFtakIsSUFDQTU2QixLQUFBdXlDLFlBQUE5NkIsRUFBQTg2QixZQUVBdnlDLEtBQUErd0MsU0FBQXQ1QixFQUFBczVCLFNBQ0Evd0MsS0FBQWd4QyxrQkFBQXY1QixFQUFBdTVCLGtCQUVBaHhDLEtBQUFpeEMsTUFBQXg1QixFQUFBdzVCLE1BQ0FqeEMsS0FBQWt4QyxlQUFBejVCLEVBQUF5NUIsZUFFQWx4QyxLQUFBeXZDLFNBQUEvbkMsS0FBQStQLEVBQUFnNEIsVUFDQXp2QyxLQUFBNnhDLFlBQUFwNkIsRUFBQW82QixZQUNBN3hDLEtBQUEwdkMsa0JBQUFqNEIsRUFBQWk0QixrQkFFQTF2QyxLQUFBbXhDLFFBQUExNUIsRUFBQTA1QixRQUNBbnhDLEtBQUFveEMsVUFBQTM1QixFQUFBMjVCLFVBRUFweEMsS0FBQXF4QyxVQUFBNTVCLEVBQUE0NUIsVUFDQXJ4QyxLQUFBc3hDLGNBQUE3NUIsRUFBQTY1QixjQUNBdHhDLEtBQUF1eEMsWUFBQTdwQyxLQUFBK1AsRUFBQTg1QixhQUVBdnhDLEtBQUF3eEMsZ0JBQUEvNUIsRUFBQSs1QixnQkFDQXh4QyxLQUFBeXhDLGtCQUFBaDZCLEVBQUFnNkIsa0JBQ0F6eEMsS0FBQTB4QyxpQkFBQWo2QixFQUFBaTZCLGlCQUVBMXhDLEtBQUE4d0MsU0FBQXI1QixFQUFBcTVCLFNBRUE5d0MsS0FBQWt6QyxVQUFBejdCLEVBQUF5N0IsVUFDQWx6QyxLQUFBbXpDLG1CQUFBMTdCLEVBQUEwN0IsbUJBQ0FuekMsS0FBQW96QyxpQkFBQTM3QixFQUFBMjdCLGlCQUNBcHpDLEtBQUFxekMsa0JBQUE1N0IsRUFBQTQ3QixrQkFFQXJ6QyxLQUFBdXpDLElBQUE5N0IsRUFBQTg3QixJQUVBdnpDLElBRUEsRUNsVEEsTUFBQXU2RSxXQUFBcHVDLEdBV0EsV0FBQXZwQyxDQUFBNjVCLEdBRUFsbEIsUUFTQXZYLEtBQUF3NkUsc0JBQUEsRUFFQXg2RSxLQUFBSCxLQUFBLHFCQVdBRyxLQUFBbXhDLFFBQUEsS0FRQW54QyxLQUFBb3hDLFVBQUEsRUFhQXB4QyxLQUFBcXhDLFVBQUEsS0FRQXJ4QyxLQUFBc3hDLGN6SGdwQ1ksRXlIeG9DWnR4QyxLQUFBdXhDLFlBQUEsSUFBQXpxQyxHQUFBLEVBQUEsR0FhQTlHLEtBQUF3eEMsZ0JBQUEsS0FVQXh4QyxLQUFBeXhDLGtCQUFBLEVBVUF6eEMsS0FBQTB4QyxpQkFBQSxFQVFBMXhDLEtBQUFrekMsV0FBQSxFQVdBbHpDLEtBQUFtekMsbUJBQUEsRUFRQW56QyxLQUFBc3pDLGFBQUEsRUFFQXR6QyxLQUFBaXZDLFVBQUF4UyxFQUVBLENBRUEsSUFBQS8wQixDQUFBK1AsR0FvQkEsT0FsQkFGLE1BQUE3UCxLQUFBK1AsR0FFQXpYLEtBQUFteEMsUUFBQTE1QixFQUFBMDVCLFFBQ0FueEMsS0FBQW94QyxVQUFBMzVCLEVBQUEyNUIsVUFFQXB4QyxLQUFBcXhDLFVBQUE1NUIsRUFBQTQ1QixVQUNBcnhDLEtBQUFzeEMsY0FBQTc1QixFQUFBNjVCLGNBQ0F0eEMsS0FBQXV4QyxZQUFBN3BDLEtBQUErUCxFQUFBODVCLGFBRUF2eEMsS0FBQXd4QyxnQkFBQS81QixFQUFBKzVCLGdCQUNBeHhDLEtBQUF5eEMsa0JBQUFoNkIsRUFBQWc2QixrQkFDQXp4QyxLQUFBMHhDLGlCQUFBajZCLEVBQUFpNkIsaUJBRUExeEMsS0FBQWt6QyxVQUFBejdCLEVBQUF5N0IsVUFDQWx6QyxLQUFBbXpDLG1CQUFBMTdCLEVBQUEwN0IsbUJBRUFuekMsS0FBQXN6QyxZQUFBNzdCLEVBQUE2N0IsWUFFQXR6QyxJQUVBLEVDbkpBLE1BQUF5NkUsV0FBQXR1QyxHQVdBLFdBQUF2cEMsQ0FBQTY1QixHQUVBbGxCLFFBU0F2WCxLQUFBMDZFLHVCQUFBLEVBRUExNkUsS0FBQUgsS0FBQSxzQkFRQUcsS0FBQXFTLE1BQUEsSUFBQXkzQixHQUFBLFVBVUE5cEMsS0FBQTQ2QixJQUFBLEtBUUE1NkIsS0FBQSt3QyxTQUFBLEtBUUEvd0MsS0FBQWd4QyxrQkFBQSxFQVNBaHhDLEtBQUFpeEMsTUFBQSxLQVVBanhDLEtBQUFreEMsZUFBQSxFQVNBbHhDLEtBQUF5dkMsU0FBQSxJQUFBM0YsR0FBQSxHQVFBOXBDLEtBQUEwdkMsa0JBQUEsRUFVQTF2QyxLQUFBNnhDLFlBQUEsS0FXQTd4QyxLQUFBbXhDLFFBQUEsS0FRQW54QyxLQUFBb3hDLFVBQUEsRUFhQXB4QyxLQUFBcXhDLFVBQUEsS0FRQXJ4QyxLQUFBc3hDLGMxSG1qQ1ksRTBIM2lDWnR4QyxLQUFBdXhDLFlBQUEsSUFBQXpxQyxHQUFBLEVBQUEsR0FhQTlHLEtBQUF3eEMsZ0JBQUEsS0FVQXh4QyxLQUFBeXhDLGtCQUFBLEVBVUF6eEMsS0FBQTB4QyxpQkFBQSxFQVFBMXhDLEtBQUE4eEMsWUFBQSxLQWVBOXhDLEtBQUE4d0MsU0FBQSxLQVFBOXdDLEtBQUFpeUMsT0FBQSxLQVFBanlDLEtBQUFteUMsZUFBQSxJQUFBbGYsR0FXQWp6QixLQUFBa3lDLFExSG9JWSxFMEgzSFpseUMsS0FBQXF5QyxhQUFBLEVBV0FyeUMsS0FBQXN5QyxnQkFBQSxJQVFBdHlDLEtBQUFrekMsV0FBQSxFQVVBbHpDLEtBQUFtekMsbUJBQUEsRUFVQW56QyxLQUFBb3pDLGlCQUFBLFFBVUFwekMsS0FBQXF6QyxrQkFBQSxRQVFBcnpDLEtBQUFzekMsYUFBQSxFQVFBdHpDLEtBQUF1ekMsS0FBQSxFQUVBdnpDLEtBQUFpdkMsVUFBQXhTLEVBRUEsQ0FFQSxJQUFBLzBCLENBQUErUCxHQWdEQSxPQTlDQUYsTUFBQTdQLEtBQUErUCxHQUVBelgsS0FBQXFTLE1BQUEzSyxLQUFBK1AsRUFBQXBGLE9BRUFyUyxLQUFBNDZCLElBQUFuakIsRUFBQW1qQixJQUVBNTZCLEtBQUErd0MsU0FBQXQ1QixFQUFBczVCLFNBQ0Evd0MsS0FBQWd4QyxrQkFBQXY1QixFQUFBdTVCLGtCQUVBaHhDLEtBQUFpeEMsTUFBQXg1QixFQUFBdzVCLE1BQ0FqeEMsS0FBQWt4QyxlQUFBejVCLEVBQUF5NUIsZUFFQWx4QyxLQUFBeXZDLFNBQUEvbkMsS0FBQStQLEVBQUFnNEIsVUFDQXp2QyxLQUFBNnhDLFlBQUFwNkIsRUFBQW82QixZQUNBN3hDLEtBQUEwdkMsa0JBQUFqNEIsRUFBQWk0QixrQkFFQTF2QyxLQUFBbXhDLFFBQUExNUIsRUFBQTA1QixRQUNBbnhDLEtBQUFveEMsVUFBQTM1QixFQUFBMjVCLFVBRUFweEMsS0FBQXF4QyxVQUFBNTVCLEVBQUE0NUIsVUFDQXJ4QyxLQUFBc3hDLGNBQUE3NUIsRUFBQTY1QixjQUNBdHhDLEtBQUF1eEMsWUFBQTdwQyxLQUFBK1AsRUFBQTg1QixhQUVBdnhDLEtBQUF3eEMsZ0JBQUEvNUIsRUFBQSs1QixnQkFDQXh4QyxLQUFBeXhDLGtCQUFBaDZCLEVBQUFnNkIsa0JBQ0F6eEMsS0FBQTB4QyxpQkFBQWo2QixFQUFBaTZCLGlCQUVBMXhDLEtBQUE4eEMsWUFBQXI2QixFQUFBcTZCLFlBRUE5eEMsS0FBQTh3QyxTQUFBcjVCLEVBQUFxNUIsU0FFQTl3QyxLQUFBaXlDLE9BQUF4NkIsRUFBQXc2QixPQUNBanlDLEtBQUFteUMsZUFBQXpxQyxLQUFBK1AsRUFBQTA2QixnQkFDQW55QyxLQUFBa3lDLFFBQUF6NkIsRUFBQXk2QixRQUNBbHlDLEtBQUFxeUMsYUFBQTU2QixFQUFBNDZCLGFBQ0FyeUMsS0FBQXN5QyxnQkFBQTc2QixFQUFBNjZCLGdCQUVBdHlDLEtBQUFrekMsVUFBQXo3QixFQUFBeTdCLFVBQ0FsekMsS0FBQW16QyxtQkFBQTE3QixFQUFBMDdCLG1CQUNBbnpDLEtBQUFvekMsaUJBQUEzN0IsRUFBQTI3QixpQkFDQXB6QyxLQUFBcXpDLGtCQUFBNTdCLEVBQUE0N0Isa0JBRUFyekMsS0FBQXN6QyxZQUFBNzdCLEVBQUE2N0IsWUFFQXR6QyxLQUFBdXpDLElBQUE5N0IsRUFBQTg3QixJQUVBdnpDLElBRUEsRUMxWEEsTUFBQTI2RSxXQUFBeHVDLEdBV0EsV0FBQXZwQyxDQUFBNjVCLEdBRUFsbEIsUUFTQXZYLEtBQUE0NkUscUJBQUEsRUFFQTU2RSxLQUFBSCxLQUFBLG9CQVFBRyxLQUFBNjZFLGEzSGdwQ1ksSzJIdm9DWjc2RSxLQUFBNDZCLElBQUEsS0FlQTU2QixLQUFBOHdDLFNBQUEsS0FhQTl3QyxLQUFBd3hDLGdCQUFBLEtBVUF4eEMsS0FBQXl4QyxrQkFBQSxFQVVBenhDLEtBQUEweEMsaUJBQUEsRUFRQTF4QyxLQUFBa3pDLFdBQUEsRUFXQWx6QyxLQUFBbXpDLG1CQUFBLEVBRUFuekMsS0FBQWl2QyxVQUFBeFMsRUFFQSxDQUVBLElBQUEvMEIsQ0FBQStQLEdBaUJBLE9BZkFGLE1BQUE3UCxLQUFBK1AsR0FFQXpYLEtBQUE2NkUsYUFBQXBqRSxFQUFBb2pFLGFBRUE3NkUsS0FBQTQ2QixJQUFBbmpCLEVBQUFtakIsSUFFQTU2QixLQUFBOHdDLFNBQUFyNUIsRUFBQXE1QixTQUVBOXdDLEtBQUF3eEMsZ0JBQUEvNUIsRUFBQSs1QixnQkFDQXh4QyxLQUFBeXhDLGtCQUFBaDZCLEVBQUFnNkIsa0JBQ0F6eEMsS0FBQTB4QyxpQkFBQWo2QixFQUFBaTZCLGlCQUVBMXhDLEtBQUFrekMsVUFBQXo3QixFQUFBeTdCLFVBQ0FsekMsS0FBQW16QyxtQkFBQTE3QixFQUFBMDdCLG1CQUVBbnpDLElBRUEsRUNqSUEsTUFBQTg2RSxXQUFBM3VDLEdBV0EsV0FBQXZwQyxDQUFBNjVCLEdBRUFsbEIsUUFTQXZYLEtBQUErNkUsd0JBQUEsRUFFQS82RSxLQUFBSCxLQUFBLHVCQVNBRyxLQUFBNDZCLElBQUEsS0FlQTU2QixLQUFBOHdDLFNBQUEsS0FhQTl3QyxLQUFBd3hDLGdCQUFBLEtBVUF4eEMsS0FBQXl4QyxrQkFBQSxFQVVBenhDLEtBQUEweEMsaUJBQUEsRUFFQTF4QyxLQUFBaXZDLFVBQUF4UyxFQUVBLENBRUEsSUFBQS8wQixDQUFBK1AsR0FZQSxPQVZBRixNQUFBN1AsS0FBQStQLEdBRUF6WCxLQUFBNDZCLElBQUFuakIsRUFBQW1qQixJQUVBNTZCLEtBQUE4d0MsU0FBQXI1QixFQUFBcTVCLFNBRUE5d0MsS0FBQXd4QyxnQkFBQS81QixFQUFBKzVCLGdCQUNBeHhDLEtBQUF5eEMsa0JBQUFoNkIsRUFBQWc2QixrQkFDQXp4QyxLQUFBMHhDLGlCQUFBajZCLEVBQUFpNkIsaUJBRUExeEMsSUFFQSxFQ2xHQSxNQUFBZzdFLFdBQUE3dUMsR0FXQSxXQUFBdnBDLENBQUE2NUIsR0FFQWxsQixRQVNBdlgsS0FBQWk3RSxzQkFBQSxFQUVBajdFLEtBQUFnZ0QsUUFBQSxDQUFBazdCLE9BQUEsSUFFQWw3RSxLQUFBSCxLQUFBLHFCQVFBRyxLQUFBcVMsTUFBQSxJQUFBeTNCLEdBQUEsVUFRQTlwQyxLQUFBNndDLE9BQUEsS0FVQTd3QyxLQUFBNDZCLElBQUEsS0FXQTU2QixLQUFBbXhDLFFBQUEsS0FRQW54QyxLQUFBb3hDLFVBQUEsRUFhQXB4QyxLQUFBcXhDLFVBQUEsS0FRQXJ4QyxLQUFBc3hDLGM3SDZtQ1ksRTZIcm1DWnR4QyxLQUFBdXhDLFlBQUEsSUFBQXpxQyxHQUFBLEVBQUEsR0FhQTlHLEtBQUF3eEMsZ0JBQUEsS0FVQXh4QyxLQUFBeXhDLGtCQUFBLEVBVUF6eEMsS0FBQTB4QyxpQkFBQSxFQWVBMXhDLEtBQUE4d0MsU0FBQSxLQVFBOXdDLEtBQUFzekMsYUFBQSxFQVFBdHpDLEtBQUF1ekMsS0FBQSxFQUVBdnpDLEtBQUFpdkMsVUFBQXhTLEVBRUEsQ0FHQSxJQUFBLzBCLENBQUErUCxHQTZCQSxPQTNCQUYsTUFBQTdQLEtBQUErUCxHQUVBelgsS0FBQWdnRCxRQUFBLENBQUFrN0IsT0FBQSxJQUVBbDdFLEtBQUFxUyxNQUFBM0ssS0FBQStQLEVBQUFwRixPQUVBclMsS0FBQTZ3QyxPQUFBcDVCLEVBQUFvNUIsT0FFQTd3QyxLQUFBNDZCLElBQUFuakIsRUFBQW1qQixJQUVBNTZCLEtBQUFteEMsUUFBQTE1QixFQUFBMDVCLFFBQ0FueEMsS0FBQW94QyxVQUFBMzVCLEVBQUEyNUIsVUFFQXB4QyxLQUFBcXhDLFVBQUE1NUIsRUFBQTQ1QixVQUNBcnhDLEtBQUFzeEMsY0FBQTc1QixFQUFBNjVCLGNBQ0F0eEMsS0FBQXV4QyxZQUFBN3BDLEtBQUErUCxFQUFBODVCLGFBRUF2eEMsS0FBQXd4QyxnQkFBQS81QixFQUFBKzVCLGdCQUNBeHhDLEtBQUF5eEMsa0JBQUFoNkIsRUFBQWc2QixrQkFDQXp4QyxLQUFBMHhDLGlCQUFBajZCLEVBQUFpNkIsaUJBRUExeEMsS0FBQTh3QyxTQUFBcjVCLEVBQUFxNUIsU0FFQTl3QyxLQUFBc3pDLFlBQUE3N0IsRUFBQTY3QixZQUVBdHpDLEtBQUF1ekMsSUFBQTk3QixFQUFBODdCLElBRUF2ekMsSUFFQSxFQ3hNQSxNQUFBbTdFLFdBQUEvaEIsR0FXQSxXQUFBeDJELENBQUE2NUIsR0FFQWxsQixRQVNBdlgsS0FBQW83RSxzQkFBQSxFQUNBcDdFLEtBQUFILEtBQUEscUJBUUFHLEtBQUFxUCxNQUFBLEVBUUFyUCxLQUFBZ3pDLFNBQUEsRUFRQWh6QyxLQUFBaXpDLFFBQUEsRUFFQWp6QyxLQUFBaXZDLFVBQUF4UyxFQUVBLENBRUEsSUFBQS8wQixDQUFBK1AsR0FRQSxPQU5BRixNQUFBN1AsS0FBQStQLEdBRUF6WCxLQUFBcVAsTUFBQW9JLEVBQUFwSSxNQUNBclAsS0FBQWd6QyxTQUFBdjdCLEVBQUF1N0IsU0FDQWh6QyxLQUFBaXpDLFFBQUF4N0IsRUFBQXc3QixRQUVBanpDLElBRUEsRUN2RUEsU0FBQXE3RSxHQUFBeDZFLEVBQUFoQixHQUVBLE9BQUFnQixHQUFBQSxFQUFBK0IsY0FBQS9DLEVBRUEsaUJBQUFBLEVBQUFrNUQsa0JBRUEsSUFBQWw1RCxFQUFBZ0IsR0FJQXlWLE1BQUF2UCxVQUFBakcsTUFBQUksS0FBQUwsR0FSQUEsQ0FVQSxDQVFBLFNBQUF5NkUsR0FBQXQxRCxHQUVBLE9BQUErdEIsWUFBQXduQyxPQUFBdjFELE1BQUFBLGFBQUF3MUQsU0FFQSxDQVFBLFNBQUFDLEdBQUFDLEdBUUEsTUFBQXI1RSxFQUFBcTVFLEVBQUF6NkUsT0FDQXUzQixFQUFBLElBQUFsaUIsTUFBQWpVLEdBQ0EsSUFBQSxJQUFBdEIsRUFBQSxFQUFBQSxJQUFBc0IsSUFBQXRCLEVBQUF5M0IsRUFBQXozQixHQUFBQSxFQUlBLE9BRkF5M0IsRUFBQWkrQixNQVZBLFNBQUExMUQsRUFBQXNvQixHQUVBLE9BQUFxeUQsRUFBQTM2RSxHQUFBMjZFLEVBQUFyeUQsRUFFQSxJQVFBbVAsQ0FFQSxDQVVBLFNBQUFtakQsR0FBQXYrQyxFQUFBOGQsRUFBQWwxQyxHQUVBLE1BQUE0MUUsRUFBQXgrQyxFQUFBbjhCLE9BQ0F1M0IsRUFBQSxJQUFBNEUsRUFBQXg2QixZQUFBZzVFLEdBRUEsSUFBQSxJQUFBNzZFLEVBQUEsRUFBQStjLEVBQUEsRUFBQUEsSUFBQTg5RCxJQUFBNzZFLEVBQUEsQ0FFQSxNQUFBODZFLEVBQUE3MUUsRUFBQWpGLEdBQUFtNkMsRUFFQSxJQUFBLElBQUE3eEIsRUFBQSxFQUFBQSxJQUFBNnhCLElBQUE3eEIsRUFFQW1QLEVBQUExYSxLQUFBc2YsRUFBQXkrQyxFQUFBeHlELEVBSUEsQ0FFQSxPQUFBbVAsQ0FFQSxDQVVBLFNBQUFzakQsR0FBQUMsRUFBQUwsRUFBQXQrQyxFQUFBNCtDLEdBRUEsSUFBQWo3RSxFQUFBLEVBQUFzOEIsRUFBQTArQyxFQUFBLEdBRUEsVUFBQWg4RSxJQUFBczlCLFFBQUF0OUIsSUFBQXM5QixFQUFBMitDLElBRUEzK0MsRUFBQTArQyxFQUFBaDdFLEtBSUEsUUFBQWhCLElBQUFzOUIsRUFBQSxPQUVBLElBQUFwN0IsRUFBQW83QixFQUFBMitDLEdBQ0EsUUFBQWo4RSxJQUFBa0MsRUFFQSxHQUFBcVUsTUFBQUMsUUFBQXRVLEdBRUEsR0FFQUEsRUFBQW83QixFQUFBMitDLFFBRUFqOEUsSUFBQWtDLElBRUF5NUUsRUFBQXQ3RSxLQUFBaTlCLEVBQUE0K0MsTUFDQTcrQyxFQUFBaDlCLFFBQUE2QixJQUlBbzdCLEVBQUEwK0MsRUFBQWg3RSxnQkFFQWhCLElBQUFzOUIsUUFFQSxRQUFBdDlCLElBQUFrQyxFQUFBd0ksUUFJQSxHQUVBeEksRUFBQW83QixFQUFBMitDLFFBRUFqOEUsSUFBQWtDLElBRUF5NUUsRUFBQXQ3RSxLQUFBaTlCLEVBQUE0K0MsTUFDQWg2RSxFQUFBd0ksUUFBQTJ5QixFQUFBQSxFQUFBbjhCLFNBSUFvOEIsRUFBQTArQyxFQUFBaDdFLGdCQUVBaEIsSUFBQXM5QixRQU1BLEdBRUFwN0IsRUFBQW83QixFQUFBMitDLFFBRUFqOEUsSUFBQWtDLElBRUF5NUUsRUFBQXQ3RSxLQUFBaTlCLEVBQUE0K0MsTUFDQTcrQyxFQUFBaDlCLEtBQUE2QixJQUlBbzdCLEVBQUEwK0MsRUFBQWg3RSxnQkFFQWhCLElBQUFzOUIsRUFJQSxDQTROQSxNQUFBNitDLEdBVUEsbUJBQUFiLENBQUF4NkUsRUFBQWhCLEdBRUEsT0FBQXc3RSxHQUFBeDZFLEVBQUFoQixFQUVBLENBU0EsbUJBQUF5N0UsQ0FBQXQxRCxHQUVBLE9BQUFzMUQsR0FBQXQxRCxFQUVBLENBU0EsdUJBQUF5MUQsQ0FBQUMsR0FFQSxPQUFBRCxHQUFBQyxFQUVBLENBV0Esa0JBQUFDLENBQUF2K0MsRUFBQThkLEVBQUFsMUMsR0FFQSxPQUFBMjFFLEdBQUF2K0MsRUFBQThkLEVBQUFsMUMsRUFFQSxDQVdBLGtCQUFBODFFLENBQUFDLEVBQUFMLEVBQUF0K0MsRUFBQTQrQyxHQUVBRixHQUFBQyxFQUFBTCxFQUFBdCtDLEVBQUE0K0MsRUFFQSxDQWFBLGNBQUFHLENBQUFDLEVBQUFoc0UsRUFBQWlzRSxFQUFBQyxFQUFBQyxFQUFBLElBRUEsT0FyU0EsU0FBQUgsRUFBQWhzRSxFQUFBaXNFLEVBQUFDLEVBQUFDLEVBQUEsSUFFQSxNQUFBQyxFQUFBSixFQUFBMzBFLFFBRUErMEUsRUFBQXBzRSxLQUFBQSxFQUVBLE1BQUFxc0UsRUFBQSxHQUVBLElBQUEsSUFBQTE3RSxFQUFBLEVBQUFBLEVBQUF5N0UsRUFBQUMsT0FBQXg3RSxTQUFBRixFQUFBLENBRUEsTUFBQTI3RSxFQUFBRixFQUFBQyxPQUFBMTdFLEdBQ0E0N0UsRUFBQUQsRUFBQUUsZUFFQWxCLEVBQUEsR0FDQXQrQyxFQUFBLEdBRUEsSUFBQSxJQUFBL1QsRUFBQSxFQUFBQSxFQUFBcXpELEVBQUFoQixNQUFBejZFLFNBQUFvb0IsRUFBQSxDQUVBLE1BQUErOEIsRUFBQXMyQixFQUFBaEIsTUFBQXJ5RCxHQUFBa3pELEVBRUEsS0FBQW4yQixFQUFBaTJCLEdBQUFqMkIsR0FBQWsyQixHQUFBLENBRUFaLEVBQUF0N0UsS0FBQXM4RSxFQUFBaEIsTUFBQXJ5RCxJQUVBLElBQUEsSUFBQTgzQyxFQUFBLEVBQUFBLEVBQUF3YixJQUFBeGIsRUFFQS9qQyxFQUFBaDlCLEtBQUFzOEUsRUFBQXQvQyxPQUFBL1QsRUFBQXN6RCxFQUFBeGIsR0FOQSxDQVVBLENBRUEsSUFBQXVhLEVBQUF6NkUsU0FFQXk3RSxFQUFBaEIsTUFBQUwsR0FBQUssRUFBQWdCLEVBQUFoQixNQUFBOTRFLGFBQ0E4NUUsRUFBQXQvQyxPQUFBaStDLEdBQUFqK0MsRUFBQXMvQyxFQUFBdC9DLE9BQUF4NkIsYUFFQTY1RSxFQUFBcjhFLEtBQUFzOEUsR0FFQSxDQUVBRixFQUFBQyxPQUFBQSxFQUlBLElBQUFJLEVBQUExM0QsSUFFQSxJQUFBLElBQUFwa0IsRUFBQSxFQUFBQSxFQUFBeTdFLEVBQUFDLE9BQUF4N0UsU0FBQUYsRUFFQTg3RSxFQUFBTCxFQUFBQyxPQUFBMTdFLEdBQUEyNkUsTUFBQSxLQUVBbUIsRUFBQUwsRUFBQUMsT0FBQTE3RSxHQUFBMjZFLE1BQUEsSUFRQSxJQUFBLElBQUEzNkUsRUFBQSxFQUFBQSxFQUFBeTdFLEVBQUFDLE9BQUF4N0UsU0FBQUYsRUFFQXk3RSxFQUFBQyxPQUFBMTdFLEdBQUEyMUQsT0FBQSxFQUFBbW1CLEdBTUEsT0FGQUwsRUFBQU0sZ0JBRUFOLENBRUEsQ0FnT0FMLENBQUFDLEVBQUFoc0UsRUFBQWlzRSxFQUFBQyxFQUFBQyxFQUVBLENBWUEsdUJBQUFRLENBQUFDLEVBQUFDLEVBQUEsRUFBQUMsRUFBQUYsRUFBQVQsRUFBQSxJQUVBLE9Bck9BLFNBQUFTLEVBQUFDLEVBQUEsRUFBQUMsRUFBQUYsRUFBQVQsRUFBQSxJQUVBQSxHQUFBLElBQUFBLEVBQUEsSUFFQSxNQUFBWSxFQUFBRCxFQUFBVCxPQUFBeDdFLE9BQ0FtOEUsRUFBQUgsRUFBQVYsRUFHQSxJQUFBLElBQUF4N0UsRUFBQSxFQUFBQSxFQUFBbzhFLElBQUFwOEUsRUFBQSxDQUVBLE1BQUFzOEUsRUFBQUgsRUFBQVQsT0FBQTE3RSxHQUNBdThFLEVBQUFELEVBQUFFLGNBR0EsR0FBQSxTQUFBRCxHQUFBLFdBQUFBLEVBQUEsU0FHQSxNQUFBRSxFQUFBUixFQUFBUCxPQUFBZ0IsTUFBQSxTQUFBZixHQUVBLE9BQUFBLEVBQUF0c0UsT0FBQWl0RSxFQUFBanRFLE1BQ0Fzc0UsRUFBQWEsZ0JBQUFELENBRUEsSUFFQSxRQUFBdjlFLElBQUF5OUUsRUFBQSxTQUVBLElBQUFFLEVBQUEsRUFDQSxNQUFBQyxFQUFBTixFQUFBVCxlQUVBUyxFQUFBTyxrQkFBQUMsNENBRUFILEVBQUFDLEVBQUEsR0FJQSxJQUFBbnFCLEVBQUEsRUFDQSxNQUFBc3FCLEVBQUFOLEVBQUFaLGVBRUFZLEVBQUFJLGtCQUFBQyw0Q0FFQXJxQixFQUFBc3FCLEVBQUEsR0FJQSxNQUFBQyxFQUFBVixFQUFBM0IsTUFBQXo2RSxPQUFBLEVBQ0EsSUFBQSs4RSxFQUdBLEdBQUFaLEdBQUFDLEVBQUEzQixNQUFBLEdBQUEsQ0FHQSxNQUFBdUMsRUFBQVAsRUFDQVEsRUFBQVAsRUFBQUQsRUFDQU0sRUFBQVgsRUFBQWpnRCxPQUFBdDhCLE1BQUFtOUUsRUFBQUMsRUFFQSxNQUFBLEdBQUFkLEdBQUFDLEVBQUEzQixNQUFBcUMsR0FBQSxDQUdBLE1BQUFFLEVBQUFGLEVBQUFKLEVBQUFELEVBQ0FRLEVBQUFELEVBQUFOLEVBQUFELEVBQ0FNLEVBQUFYLEVBQUFqZ0QsT0FBQXQ4QixNQUFBbTlFLEVBQUFDLEVBRUEsS0FBQSxDQUdBLE1BQUFDLEVBQUFkLEVBQUFPLG9CQUNBSyxFQUFBUCxFQUNBUSxFQUFBUCxFQUFBRCxFQUNBUyxFQUFBQyxTQUFBaEIsR0FDQVksRUFBQUcsRUFBQUUsYUFBQXY5RSxNQUFBbTlFLEVBQUFDLEVBRUEsQ0FHQSxlQUFBWixJQUVBLElBQUFoZ0UsSUFBQS9TLFVBQUF5ekUsR0FBQTM2RSxZQUFBa2QsWUFDQTlWLFFBQUF1ekUsR0FNQSxNQUFBTSxFQUFBZCxFQUFBOUIsTUFBQXo2RSxPQUNBLElBQUEsSUFBQW9vQixFQUFBLEVBQUFBLEVBQUFpMUQsSUFBQWoxRCxFQUFBLENBRUEsTUFBQWsxRCxFQUFBbDFELEVBQUF5MEQsRUFBQXRxQixFQUVBLEdBQUEsZUFBQThwQixFQUdBaGdFLEdBQUEyQix3QkFDQXUrRCxFQUFBcGdELE9BQ0FtaEQsRUFDQVAsRUFDQSxFQUNBUixFQUFBcGdELE9BQ0FtaEQsT0FHQSxDQUVBLE1BQUFDLEVBQUFWLEVBQUEsRUFBQXRxQixFQUdBLElBQUEsSUFBQTJOLEVBQUEsRUFBQUEsRUFBQXFkLElBQUFyZCxFQUVBcWMsRUFBQXBnRCxPQUFBbWhELEVBQUFwZCxJQUFBNmMsRUFBQTdjLEVBSUEsQ0FFQSxDQUVBLENBSUEsT0FGQTZiLEVBQUF5QixVQUFBcmlGLEdBRUE0Z0YsQ0FFQSxDQTRHQUQsQ0FBQUMsRUFBQUMsRUFBQUMsRUFBQVgsRUFFQSxFQ3pkQSxNQUFBbUMsR0FVQSxXQUFBOTdFLENBQUErN0UsRUFBQUMsRUFBQUMsRUFBQVIsR0FPQXIrRSxLQUFBMitFLG1CQUFBQSxFQVNBMytFLEtBQUE4K0UsYUFBQSxFQU9BOStFLEtBQUFxK0Usa0JBQUF0K0UsSUFBQXMrRSxFQUFBQSxFQUFBLElBQUFPLEVBQUFoOEUsWUFBQWk4RSxHQU9BNytFLEtBQUE0K0UsYUFBQUEsRUFPQTUrRSxLQUFBMjhFLFVBQUFrQyxFQVFBNytFLEtBQUErK0UsU0FBQSxLQU9BLytFLEtBQUFnL0UsaUJBQUEsQ0FBQSxDQUVBLENBUUEsUUFBQVosQ0FBQTE3RSxHQUVBLE1BQUF1OEUsRUFBQWovRSxLQUFBMitFLG1CQUNBLElBQUF2L0MsRUFBQXAvQixLQUFBOCtFLGFBQ0F6eUQsRUFBQTR5RCxFQUFBNy9DLEdBQ0FoVCxFQUFBNnlELEVBQUE3L0MsRUFBQSxHQUVBOC9DLEVBQUEsQ0FFQUMsRUFBQSxDQUVBLElBQUE3c0QsRUFFQThzRCxFQUFBLENBTUFDLEVBQUEsS0FBQTM4RSxFQUFBMnBCLEdBQUEsQ0FFQSxJQUFBLElBQUFpekQsRUFBQWxnRCxFQUFBLElBQUEsQ0FFQSxRQUFBci9CLElBQUFzc0IsRUFBQSxDQUVBLEdBQUEzcEIsRUFBQTBwQixFQUFBLE1BQUFpekQsRUFNQSxPQUZBamdELEVBQUE2L0MsRUFBQWgrRSxPQUNBakIsS0FBQTgrRSxhQUFBMS9DLEVBQ0FwL0IsS0FBQXUvRSxpQkFBQW5nRCxFQUFBLEVBRUEsQ0FFQSxHQUFBQSxJQUFBa2dELEVBQUEsTUFLQSxHQUhBbHpELEVBQUFDLEVBQ0FBLEVBQUE0eUQsSUFBQTcvQyxHQUVBMThCLEVBQUEycEIsRUFHQSxNQUFBOHlELENBSUEsQ0FHQTdzRCxFQUFBMnNELEVBQUFoK0UsT0FDQSxNQUFBbStFLENBRUEsQ0FJQSxHQUFBMThFLEdBQUEwcEIsRUFpREEsTUFBQTh5RCxFQWpEQSxDQUlBLE1BQUFNLEVBQUFQLEVBQUEsR0FFQXY4RSxFQUFBODhFLElBRUFwZ0QsRUFBQSxFQUNBaFQsRUFBQW96RCxHQU1BLElBQUEsSUFBQUYsRUFBQWxnRCxFQUFBLElBQUEsQ0FFQSxRQUFBci9CLElBQUFxc0IsRUFLQSxPQURBcHNCLEtBQUE4K0UsYUFBQSxFQUNBOStFLEtBQUF1L0UsaUJBQUEsR0FJQSxHQUFBbmdELElBQUFrZ0QsRUFBQSxNQUtBLEdBSEFqekQsRUFBQUQsRUFDQUEsRUFBQTZ5RCxJQUFBNy9DLEVBQUEsR0FFQTE4QixHQUFBMHBCLEVBR0EsTUFBQSt5RCxDQUlBLENBR0E3c0QsRUFBQThNLEVBQ0FBLEVBQUEsQ0FHQSxDQU1BLENBSUEsS0FBQUEsRUFBQTlNLEdBQUEsQ0FFQSxNQUFBbXRELEVBQUFyZ0QsRUFBQTlNLElBQUEsRUFFQTV2QixFQUFBdThFLEVBQUFRLEdBRUFudEQsRUFBQW10RCxFQUlBcmdELEVBQUFxZ0QsRUFBQSxDQUlBLENBT0EsR0FMQXB6RCxFQUFBNHlELEVBQUE3L0MsR0FDQWhULEVBQUE2eUQsRUFBQTcvQyxFQUFBLFFBSUFyL0IsSUFBQXFzQixFQUdBLE9BREFwc0IsS0FBQTgrRSxhQUFBLEVBQ0E5K0UsS0FBQXUvRSxpQkFBQSxHQUlBLFFBQUF4L0UsSUFBQXNzQixFQUlBLE9BRkErUyxFQUFBNi9DLEVBQUFoK0UsT0FDQWpCLEtBQUE4K0UsYUFBQTEvQyxFQUNBcC9CLEtBQUF1L0UsaUJBQUFuZ0QsRUFBQSxFQUlBLENBRUFwL0IsS0FBQTgrRSxhQUFBMS9DLEVBRUFwL0IsS0FBQTAvRSxpQkFBQXRnRCxFQUFBaFQsRUFBQUMsRUFFQSxDQUVBLE9BQUFyc0IsS0FBQTIvRSxhQUFBdmdELEVBQUFoVCxFQUFBMXBCLEVBQUEycEIsRUFFQSxDQU9BLFlBQUF1ekQsR0FFQSxPQUFBNS9FLEtBQUErK0UsVUFBQS8rRSxLQUFBZy9FLGdCQUVBLENBUUEsZ0JBQUFPLENBQUEvK0UsR0FJQSxNQUFBZzRCLEVBQUF4NEIsS0FBQXErRSxhQUNBamhELEVBQUFwOUIsS0FBQTQrRSxhQUNBMWpDLEVBQUFsN0MsS0FBQTI4RSxVQUNBbnlFLEVBQUFoSyxFQUFBMDZDLEVBRUEsSUFBQSxJQUFBbjZDLEVBQUEsRUFBQUEsSUFBQW02QyxJQUFBbjZDLEVBRUF5M0IsRUFBQXozQixHQUFBcThCLEVBQUE1eUIsRUFBQXpKLEdBSUEsT0FBQXkzQixDQUVBLENBWUEsWUFBQW1uRCxHQUVBLE1BQUEsSUFBQXY4RSxNQUFBLDBCQUdBLENBU0EsZ0JBQUFzOEUsR0FJQSxFQy9TQSxNQUFBRyxXQUFBbkIsR0FVQSxXQUFBOTdFLENBQUErN0UsRUFBQUMsRUFBQUMsRUFBQVIsR0FFQTltRSxNQUFBb25FLEVBQUFDLEVBQUFDLEVBQUFSLEdBRUFyK0UsS0FBQTgvRSxhQUFBLEVBQ0E5L0UsS0FBQSsvRSxhQUFBLEVBQ0EvL0UsS0FBQWdnRixhQUFBLEVBQ0FoZ0YsS0FBQWlnRixhQUFBLEVBRUFqZ0YsS0FBQWcvRSxpQkFBQSxDQUVBa0IsWUFBQWxrRixHQUNBbWtGLFVBQUFua0YsR0FJQSxDQUVBLGdCQUFBMGpGLENBQUF0Z0QsRUFBQWhULEVBQUFDLEdBRUEsTUFBQTR5RCxFQUFBai9FLEtBQUEyK0UsbUJBQ0EsSUFBQXlCLEVBQUFoaEQsRUFBQSxFQUNBaWhELEVBQUFqaEQsRUFBQSxFQUVBa2hELEVBQUFyQixFQUFBbUIsR0FDQUcsRUFBQXRCLEVBQUFvQixHQUVBLFFBQUF0Z0YsSUFBQXVnRixFQUVBLE9BQUF0Z0YsS0FBQTQvRSxlQUFBTSxhQUVBLEtBQUFqa0YsR0FHQW1rRixFQUFBaGhELEVBQ0FraEQsRUFBQSxFQUFBbDBELEVBQUFDLEVBRUEsTUFFQSxLQUFBbndCLEdBR0Fra0YsRUFBQW5CLEVBQUFoK0UsT0FBQSxFQUNBcS9FLEVBQUFsMEQsRUFBQTZ5RCxFQUFBbUIsR0FBQW5CLEVBQUFtQixFQUFBLEdBRUEsTUFFQSxRQUdBQSxFQUFBaGhELEVBQ0FraEQsRUFBQWowRCxFQU1BLFFBQUF0c0IsSUFBQXdnRixFQUVBLE9BQUF2Z0YsS0FBQTQvRSxlQUFBTyxXQUVBLEtBQUFsa0YsR0FHQW9rRixFQUFBamhELEVBQ0FtaEQsRUFBQSxFQUFBbDBELEVBQUFELEVBRUEsTUFFQSxLQUFBbHdCLEdBR0Fta0YsRUFBQSxFQUNBRSxFQUFBbDBELEVBQUE0eUQsRUFBQSxHQUFBQSxFQUFBLEdBRUEsTUFFQSxRQUdBb0IsRUFBQWpoRCxFQUFBLEVBQ0FtaEQsRUFBQW4wRCxFQU1BLE1BQUFvMEQsRUFBQSxJQUFBbjBELEVBQUFELEdBQ0E4dUIsRUFBQWw3QyxLQUFBMjhFLFVBRUEzOEUsS0FBQTgvRSxZQUFBVSxHQUFBcDBELEVBQUFrMEQsR0FDQXRnRixLQUFBZ2dGLFlBQUFRLEdBQUFELEVBQUFsMEQsR0FDQXJzQixLQUFBKy9FLFlBQUFLLEVBQUFsbEMsRUFDQWw3QyxLQUFBaWdGLFlBQUFJLEVBQUFubEMsQ0FFQSxDQUVBLFlBQUF5a0MsQ0FBQXZnRCxFQUFBaFQsRUFBQTFwQixFQUFBMnBCLEdBRUEsTUFBQW1NLEVBQUF4NEIsS0FBQXErRSxhQUNBamhELEVBQUFwOUIsS0FBQTQrRSxhQUNBMWpDLEVBQUFsN0MsS0FBQTI4RSxVQUVBek8sRUFBQTl1QyxFQUFBOGIsRUFBQXVsQyxFQUFBdlMsRUFBQWh6QixFQUNBd2xDLEVBQUExZ0YsS0FBQSsvRSxZQUFBWSxFQUFBM2dGLEtBQUFpZ0YsWUFDQVcsRUFBQTVnRixLQUFBOC9FLFlBQUFlLEVBQUE3Z0YsS0FBQWdnRixZQUVBbnRELEdBQUFud0IsRUFBQTBwQixJQUFBQyxFQUFBRCxHQUNBNnlELEVBQUFwc0QsRUFBQUEsRUFDQWl1RCxFQUFBN0IsRUFBQXBzRCxFQUlBa3VELEdBQUFILEVBQUFFLEVBQUEsRUFBQUYsRUFBQTNCLEVBQUEyQixFQUFBL3RELEVBQ0FqSCxHQUFBLEVBQUFnMUQsR0FBQUUsSUFBQSxJQUFBLEVBQUFGLEdBQUEzQixJQUFBLEdBQUEyQixHQUFBL3RELEVBQUEsRUFDQW5ULElBQUEsRUFBQW1oRSxHQUFBQyxHQUFBLElBQUFELEdBQUE1QixFQUFBLEdBQUFwc0QsRUFDQW11RCxFQUFBSCxFQUFBQyxFQUFBRCxFQUFBNUIsRUFJQSxJQUFBLElBQUFsK0UsRUFBQSxFQUFBQSxJQUFBbTZDLElBQUFuNkMsRUFFQXkzQixFQUFBejNCLEdBQ0FnZ0YsRUFBQTNqRCxFQUFBc2pELEVBQUEzL0UsR0FDQTZxQixFQUFBd1IsRUFBQXFqRCxFQUFBMS9FLEdBQ0EyZSxFQUFBMGQsRUFBQTh3QyxFQUFBbnRFLEdBQ0FpZ0YsRUFBQTVqRCxFQUFBdWpELEVBQUE1L0UsR0FJQSxPQUFBeTNCLENBRUEsRUNuSkEsTUFBQXlvRCxXQUFBdkMsR0FVQSxXQUFBOTdFLENBQUErN0UsRUFBQUMsRUFBQUMsRUFBQVIsR0FFQTltRSxNQUFBb25FLEVBQUFDLEVBQUFDLEVBQUFSLEVBRUEsQ0FFQSxZQUFBc0IsQ0FBQXZnRCxFQUFBaFQsRUFBQTFwQixFQUFBMnBCLEdBRUEsTUFBQW1NLEVBQUF4NEIsS0FBQXErRSxhQUNBamhELEVBQUFwOUIsS0FBQTQrRSxhQUNBMWpDLEVBQUFsN0MsS0FBQTI4RSxVQUVBdUUsRUFBQTloRCxFQUFBOGIsRUFDQWltQyxFQUFBRCxFQUFBaG1DLEVBRUFrbUMsR0FBQTErRSxFQUFBMHBCLElBQUFDLEVBQUFELEdBQ0FpMUQsRUFBQSxFQUFBRCxFQUVBLElBQUEsSUFBQXJnRixFQUFBLEVBQUFBLElBQUFtNkMsSUFBQW42QyxFQUVBeTNCLEVBQUF6M0IsR0FDQXE4QixFQUFBK2pELEVBQUFwZ0YsR0FBQXNnRixFQUNBamtELEVBQUE4akQsRUFBQW5nRixHQUFBcWdGLEVBSUEsT0FBQTVvRCxDQUVBLEVDckNBLE1BQUE4b0QsV0FBQTVDLEdBVUEsV0FBQTk3RSxDQUFBKzdFLEVBQUFDLEVBQUFDLEVBQUFSLEdBRUE5bUUsTUFBQW9uRSxFQUFBQyxFQUFBQyxFQUFBUixFQUVBLENBRUEsWUFBQXNCLENBQUF2Z0QsR0FFQSxPQUFBcC9CLEtBQUF1L0UsaUJBQUFuZ0QsRUFBQSxFQUVBLEVDYkEsTUFBQW1pRCxHQVVBLFdBQUEzK0UsQ0FBQXdOLEVBQUFzckUsRUFBQXQrQyxFQUFBb2tELEdBRUEsUUFBQXpoRixJQUFBcVEsRUFBQSxNQUFBLElBQUFoTixNQUFBLGdEQUNBLFFBQUFyRCxJQUFBMjdFLEdBQUEsSUFBQUEsRUFBQXo2RSxPQUFBLE1BQUEsSUFBQW1DLE1BQUEsb0RBQUFnTixHQVNBcFEsS0FBQW9RLEtBQUFBLEVBT0FwUSxLQUFBMDdFLE1BQUFMLEdBQUFLLEVBQUExN0UsS0FBQXloRixnQkFPQXpoRixLQUFBbzlCLE9BQUFpK0MsR0FBQWorQyxFQUFBcDlCLEtBQUEwaEYsaUJBRUExaEYsS0FBQTJoRixpQkFBQUgsR0FBQXhoRixLQUFBNGhGLHFCQUVBLENBU0EsYUFBQTVyRSxDQUFBMG1FLEdBRUEsTUFBQW1GLEVBQUFuRixFQUFBOTVFLFlBRUEsSUFBQThxRCxFQUdBLEdBQUFtMEIsRUFBQTdyRSxTQUFBaFcsS0FBQWdXLE9BRUEwM0MsRUFBQW0wQixFQUFBN3JFLE9BQUEwbUUsT0FFQSxDQUdBaHZCLEVBQUEsQ0FFQXQ5QyxLQUFBc3NFLEVBQUF0c0UsS0FDQXNyRSxNQUFBTCxHQUFBcUIsRUFBQWhCLE1BQUFwbEUsT0FDQThtQixPQUFBaStDLEdBQUFxQixFQUFBdC9DLE9BQUE5bUIsUUFJQSxNQUFBa3JFLEVBQUE5RSxFQUFBMzlDLG1CQUVBeWlELElBQUE5RSxFQUFBa0YsdUJBRUFsMEIsRUFBQTh6QixjQUFBQSxFQUlBLENBSUEsT0FGQTl6QixFQUFBN3RELEtBQUE2OEUsRUFBQWEsY0FFQTd2QixDQUVBLENBU0EsZ0NBQUFvMEIsQ0FBQXRwRCxHQUVBLE9BQUEsSUFBQThvRCxHQUFBdGhGLEtBQUEwN0UsTUFBQTE3RSxLQUFBbzlCLE9BQUFwOUIsS0FBQTQ4RSxlQUFBcGtELEVBRUEsQ0FTQSw4QkFBQXVwRCxDQUFBdnBELEdBRUEsT0FBQSxJQUFBeW9ELEdBQUFqaEYsS0FBQTA3RSxNQUFBMTdFLEtBQUFvOUIsT0FBQXA5QixLQUFBNDhFLGVBQUFwa0QsRUFFQSxDQVNBLDhCQUFBd3BELENBQUF4cEQsR0FFQSxPQUFBLElBQUFxbkQsR0FBQTcvRSxLQUFBMDdFLE1BQUExN0UsS0FBQW85QixPQUFBcDlCLEtBQUE0OEUsZUFBQXBrRCxFQUVBLENBUUEsZ0JBQUFtcEQsQ0FBQUgsR0FFQSxJQUFBUyxFQUVBLE9BQUFULEdBRUEsS0FBQTNsRixHQUVBb21GLEVBQUFqaUYsS0FBQThoRixpQ0FFQSxNQUVBLEtBQUFobUYsR0FFQW1tRixFQUFBamlGLEtBQUEraEYsK0JBRUEsTUFFQSxLQUFBaG1GLEdBRUFrbUYsRUFBQWppRixLQUFBZ2lGLCtCQU1BLFFBQUFqaUYsSUFBQWtpRixFQUFBLENBRUEsTUFBQXJ4RSxFQUFBLGlDQUNBNVEsS0FBQXU5RSxjQUFBLHlCQUFBdjlFLEtBQUFvUSxLQUVBLFFBQUFyUSxJQUFBQyxLQUFBNDlFLGtCQUFBLENBR0EsR0FBQTRELElBQUF4aEYsS0FBQTRoRixxQkFNQSxNQUFBLElBQUF4K0UsTUFBQXdOLEdBSkE1USxLQUFBMmhGLGlCQUFBM2hGLEtBQUE0aEYscUJBUUEsQ0FHQSxPQURBaDdFLFFBQUFDLEtBQUEsdUJBQUErSixHQUNBNVEsSUFFQSxDQUlBLE9BRkFBLEtBQUE0OUUsa0JBQUFxRSxFQUVBamlGLElBRUEsQ0FPQSxnQkFBQSsrQixHQUVBLE9BQUEvK0IsS0FBQTQ5RSxtQkFFQSxLQUFBNTlFLEtBQUE4aEYsaUNBRUEsT0FBQWptRixHQUVBLEtBQUFtRSxLQUFBK2hGLCtCQUVBLE9BQUFqbUYsR0FFQSxLQUFBa0UsS0FBQWdpRiwrQkFFQSxPQUFBam1GLEdBSUEsQ0FPQSxZQUFBNmdGLEdBRUEsT0FBQTU4RSxLQUFBbzlCLE9BQUFuOEIsT0FBQWpCLEtBQUEwN0UsTUFBQXo2RSxNQUVBLENBUUEsS0FBQXkxRCxDQUFBd3JCLEdBRUEsR0FBQSxJQUFBQSxFQUFBLENBRUEsTUFBQXhHLEVBQUExN0UsS0FBQTA3RSxNQUVBLElBQUEsSUFBQTM2RSxFQUFBLEVBQUFzQixFQUFBcTVFLEVBQUF6NkUsT0FBQUYsSUFBQXNCLElBQUF0QixFQUVBMjZFLEVBQUEzNkUsSUFBQW1oRixDQUlBLENBRUEsT0FBQWxpRixJQUVBLENBUUEsS0FBQXFQLENBQUE4eUUsR0FFQSxHQUFBLElBQUFBLEVBQUEsQ0FFQSxNQUFBekcsRUFBQTE3RSxLQUFBMDdFLE1BRUEsSUFBQSxJQUFBMzZFLEVBQUEsRUFBQXNCLEVBQUFxNUUsRUFBQXo2RSxPQUFBRixJQUFBc0IsSUFBQXRCLEVBRUEyNkUsRUFBQTM2RSxJQUFBb2hGLENBSUEsQ0FFQSxPQUFBbmlGLElBRUEsQ0FZQSxJQUFBb2lGLENBQUFDLEVBQUFDLEdBRUEsTUFBQTVHLEVBQUExN0UsS0FBQTA3RSxNQUNBNkcsRUFBQTdHLEVBQUF6NkUsT0FFQSxJQUFBeVYsRUFBQSxFQUNBOHJFLEVBQUFELEVBQUEsRUFFQSxLQUFBN3JFLElBQUE2ckUsR0FBQTdHLEVBQUFobEUsR0FBQTJyRSxLQUVBM3JFLEVBSUEsTUFBQSxJQUFBOHJFLEdBQUE5RyxFQUFBOEcsR0FBQUYsS0FFQUUsRUFNQSxLQUZBQSxFQUVBLElBQUE5ckUsR0FBQThyRSxJQUFBRCxFQUFBLENBR0E3ckUsR0FBQThyRSxJQUVBQSxFQUFBbGhGLEtBQUFhLElBQUFxZ0YsRUFBQSxHQUNBOXJFLEVBQUE4ckUsRUFBQSxHQUlBLE1BQUF0bkMsRUFBQWw3QyxLQUFBNDhFLGVBQ0E1OEUsS0FBQTA3RSxNQUFBQSxFQUFBNTZFLE1BQUE0VixFQUFBOHJFLEdBQ0F4aUYsS0FBQW85QixPQUFBcDlCLEtBQUFvOUIsT0FBQXQ4QixNQUFBNFYsRUFBQXdrQyxFQUFBc25DLEVBQUF0bkMsRUFFQSxDQUVBLE9BQUFsN0MsSUFFQSxDQVFBLFFBQUF5aUYsR0FFQSxJQUFBQyxHQUFBLEVBRUEsTUFBQS9GLEVBQUEzOEUsS0FBQTQ4RSxlQUNBRCxFQUFBcjdFLEtBQUFtRCxNQUFBazRFLElBQUEsSUFFQS8xRSxRQUFBbXhCLE1BQUEsb0RBQUEvM0IsTUFDQTBpRixHQUFBLEdBSUEsTUFBQWhILEVBQUExN0UsS0FBQTA3RSxNQUNBdCtDLEVBQUFwOUIsS0FBQW85QixPQUVBbWxELEVBQUE3RyxFQUFBejZFLE9BRUEsSUFBQXNoRixJQUVBMzdFLFFBQUFteEIsTUFBQSx1Q0FBQS8zQixNQUNBMGlGLEdBQUEsR0FJQSxJQUFBQyxFQUFBLEtBRUEsSUFBQSxJQUFBNWhGLEVBQUEsRUFBQUEsSUFBQXdoRixFQUFBeGhGLElBQUEsQ0FFQSxNQUFBNmhGLEVBQUFsSCxFQUFBMzZFLEdBRUEsR0FBQSxpQkFBQTZoRixHQUFBejFELE1BQUF5MUQsR0FBQSxDQUVBaDhFLFFBQUFteEIsTUFBQSxtREFBQS8zQixLQUFBZSxFQUFBNmhGLEdBQ0FGLEdBQUEsRUFDQSxLQUVBLENBRUEsR0FBQSxPQUFBQyxHQUFBQSxFQUFBQyxFQUFBLENBRUFoOEUsUUFBQW14QixNQUFBLDBDQUFBLzNCLEtBQUFlLEVBQUE2aEYsRUFBQUQsR0FDQUQsR0FBQSxFQUNBLEtBRUEsQ0FFQUMsRUFBQUMsQ0FFQSxDQUVBLFFBQUE3aUYsSUFBQXE5QixHQUVBaytDLEdBQUFsK0MsR0FFQSxJQUFBLElBQUFyOEIsRUFBQSxFQUFBc0IsRUFBQSs2QixFQUFBbjhCLE9BQUFGLElBQUFzQixJQUFBdEIsRUFBQSxDQUVBLE1BQUFrQixFQUFBbTdCLEVBQUFyOEIsR0FFQSxHQUFBb3NCLE1BQUFsckIsR0FBQSxDQUVBMkUsUUFBQW14QixNQUFBLG9EQUFBLzNCLEtBQUFlLEVBQUFrQixHQUNBeWdGLEdBQUEsRUFDQSxLQUVBLENBRUEsQ0FNQSxPQUFBQSxDQUVBLENBUUEsUUFBQWxyQixHQUtBLE1BQUFra0IsRUFBQTE3RSxLQUFBMDdFLE1BQUE1NkUsUUFDQXM4QixFQUFBcDlCLEtBQUFvOUIsT0FBQXQ4QixRQUNBbzZDLEVBQUFsN0MsS0FBQTQ4RSxlQUVBaUcsRUFBQTdpRixLQUFBKytCLHFCQUFBaGpDLEdBRUFnaUYsRUFBQXJDLEVBQUF6NkUsT0FBQSxFQUVBLElBQUE2aEYsRUFBQSxFQUVBLElBQUEsSUFBQS9oRixFQUFBLEVBQUFBLEVBQUFnOUUsSUFBQWg5RSxFQUFBLENBRUEsSUFBQWdpRixHQUFBLEVBRUEsTUFBQTlHLEVBQUFQLEVBQUEzNkUsR0FLQSxHQUFBazdFLElBSkFQLEVBQUEzNkUsRUFBQSxLQUlBLElBQUFBLEdBQUFrN0UsSUFBQVAsRUFBQSxJQUVBLEdBQUFtSCxFQXdCQUUsR0FBQSxNQXhCQSxDQUlBLE1BQUF2NEUsRUFBQXpKLEVBQUFtNkMsRUFDQThuQyxFQUFBeDRFLEVBQUEwd0MsRUFDQStuQyxFQUFBejRFLEVBQUEwd0MsRUFFQSxJQUFBLElBQUE3eEIsRUFBQSxFQUFBQSxJQUFBNnhCLElBQUE3eEIsRUFBQSxDQUVBLE1BQUFwbkIsRUFBQW03QixFQUFBNXlCLEVBQUE2ZSxHQUVBLEdBQUFwbkIsSUFBQW03QixFQUFBNGxELEVBQUEzNUQsSUFDQXBuQixJQUFBbTdCLEVBQUE2bEQsRUFBQTU1RCxHQUFBLENBRUEwNUQsR0FBQSxFQUNBLEtBRUEsQ0FFQSxDQUVBLENBVUEsR0FBQUEsRUFBQSxDQUVBLEdBQUFoaUYsSUFBQStoRixFQUFBLENBRUFwSCxFQUFBb0gsR0FBQXBILEVBQUEzNkUsR0FFQSxNQUFBbWlGLEVBQUFuaUYsRUFBQW02QyxFQUNBaW9DLEVBQUFMLEVBQUE1bkMsRUFFQSxJQUFBLElBQUE3eEIsRUFBQSxFQUFBQSxJQUFBNnhCLElBQUE3eEIsRUFFQStULEVBQUErbEQsRUFBQTk1RCxHQUFBK1QsRUFBQThsRCxFQUFBNzVELEVBSUEsR0FFQXk1RCxDQUVBLENBRUEsQ0FJQSxHQUFBL0UsRUFBQSxFQUFBLENBRUFyQyxFQUFBb0gsR0FBQXBILEVBQUFxQyxHQUVBLElBQUEsSUFBQW1GLEVBQUFuRixFQUFBN2lDLEVBQUFpb0MsRUFBQUwsRUFBQTVuQyxFQUFBN3hCLEVBQUEsRUFBQUEsSUFBQTZ4QixJQUFBN3hCLEVBRUErVCxFQUFBK2xELEVBQUE5NUQsR0FBQStULEVBQUE4bEQsRUFBQTc1RCxLQUlBeTVELENBRUEsQ0FjQSxPQVpBQSxJQUFBcEgsRUFBQXo2RSxRQUVBakIsS0FBQTA3RSxNQUFBQSxFQUFBNTZFLE1BQUEsRUFBQWdpRixHQUNBOWlGLEtBQUFvOUIsT0FBQUEsRUFBQXQ4QixNQUFBLEVBQUFnaUYsRUFBQTVuQyxLQUlBbDdDLEtBQUEwN0UsTUFBQUEsRUFDQTE3RSxLQUFBbzlCLE9BQUFBLEdBSUFwOUIsSUFFQSxDQU9BLEtBQUF5SCxHQUVBLE1BQUFpMEUsRUFBQTE3RSxLQUFBMDdFLE1BQUE1NkUsUUFDQXM4QixFQUFBcDlCLEtBQUFvOUIsT0FBQXQ4QixRQUdBNDdFLEVBQUEsSUFBQTBHLEVBREFwakYsS0FBQTRDLGFBQ0E1QyxLQUFBb1EsS0FBQXNyRSxFQUFBdCtDLEdBS0EsT0FGQXMvQyxFQUFBa0Isa0JBQUE1OUUsS0FBQTQ5RSxrQkFFQWxCLENBRUEsRUFVQTZFLEdBQUF4NkUsVUFBQXcyRSxjQUFBLEdBUUFnRSxHQUFBeDZFLFVBQUEwNkUsZUFBQTUrRSxhQVFBMCtFLEdBQUF4NkUsVUFBQTI2RSxnQkFBQTcrRSxhQVFBMCtFLEdBQUF4NkUsVUFBQTY2RSxxQkFBQTlsRixHQ3prQkEsTUFBQXVuRixXQUFBOUIsR0FZQSxXQUFBMytFLENBQUF3TixFQUFBc3JFLEVBQUF0K0MsR0FFQTdsQixNQUFBbkgsRUFBQXNyRSxFQUFBdCtDLEVBRUEsRUFVQWltRCxHQUFBdDhFLFVBQUF3MkUsY0FBQSxPQVFBOEYsR0FBQXQ4RSxVQUFBMjZFLGdCQUFBcHJFLE1BUUErc0UsR0FBQXQ4RSxVQUFBNjZFLHFCQUFBL2xGLEdBQ0F3bkYsR0FBQXQ4RSxVQUFBZzdFLG9DQUFBaGlGLEVBQ0FzakYsR0FBQXQ4RSxVQUFBaTdFLG9DQUFBamlGLEVDN0NBLE1BQUF1akYsV0FBQS9CLEdBVUEsV0FBQTMrRSxDQUFBd04sRUFBQXNyRSxFQUFBdCtDLEVBQUFva0QsR0FFQWpxRSxNQUFBbkgsRUFBQXNyRSxFQUFBdCtDLEVBQUFva0QsRUFFQSxFQVVBOEIsR0FBQXY4RSxVQUFBdzJFLGNBQUEsUUN4QkEsTUFBQWdHLFdBQUFoQyxHQVVBLFdBQUEzK0UsQ0FBQXdOLEVBQUFzckUsRUFBQXQrQyxFQUFBb2tELEdBRUFqcUUsTUFBQW5ILEVBQUFzckUsRUFBQXQrQyxFQUFBb2tELEVBRUEsRUFVQStCLEdBQUF4OEUsVUFBQXcyRSxjQUFBLFNDdkJBLE1BQUFpRyxXQUFBOUUsR0FVQSxXQUFBOTdFLENBQUErN0UsRUFBQUMsRUFBQUMsRUFBQVIsR0FFQTltRSxNQUFBb25FLEVBQUFDLEVBQUFDLEVBQUFSLEVBRUEsQ0FFQSxZQUFBc0IsQ0FBQXZnRCxFQUFBaFQsRUFBQTFwQixFQUFBMnBCLEdBRUEsTUFBQW1NLEVBQUF4NEIsS0FBQXErRSxhQUNBamhELEVBQUFwOUIsS0FBQTQrRSxhQUNBMWpDLEVBQUFsN0MsS0FBQTI4RSxVQUVBenlFLEdBQUF4SCxFQUFBMHBCLElBQUFDLEVBQUFELEdBRUEsSUFBQTVoQixFQUFBNDBCLEVBQUE4YixFQUVBLElBQUEsSUFBQWtWLEVBQUE1bEQsRUFBQTB3QyxFQUFBMXdDLElBQUE0bEQsRUFBQTVsRCxHQUFBLEVBRUE4UyxHQUFBTSxVQUFBNGEsRUFBQSxFQUFBNEUsRUFBQTV5QixFQUFBMHdDLEVBQUE5ZCxFQUFBNXlCLEVBQUFOLEdBSUEsT0FBQXN1QixDQUVBLEVDbENBLE1BQUFpckQsV0FBQWxDLEdBVUEsV0FBQTMrRSxDQUFBd04sRUFBQXNyRSxFQUFBdCtDLEVBQUFva0QsR0FFQWpxRSxNQUFBbkgsRUFBQXNyRSxFQUFBdCtDLEVBQUFva0QsRUFFQSxDQVNBLDhCQUFBTyxDQUFBdnBELEdBRUEsT0FBQSxJQUFBZ3JELEdBQUF4akYsS0FBQTA3RSxNQUFBMTdFLEtBQUFvOUIsT0FBQXA5QixLQUFBNDhFLGVBQUFwa0QsRUFFQSxFQVVBaXJELEdBQUExOEUsVUFBQXcyRSxjQUFBLGFBR0FrRyxHQUFBMThFLFVBQUFpN0Usb0NBQUFqaUYsRUN4Q0EsTUFBQTJqRixXQUFBbkMsR0FZQSxXQUFBMytFLENBQUF3TixFQUFBc3JFLEVBQUF0K0MsR0FFQTdsQixNQUFBbkgsRUFBQXNyRSxFQUFBdCtDLEVBRUEsRUFVQXNtRCxHQUFBMzhFLFVBQUF3MkUsY0FBQSxTQVFBbUcsR0FBQTM4RSxVQUFBMjZFLGdCQUFBcHJFLE1BUUFvdEUsR0FBQTM4RSxVQUFBNjZFLHFCQUFBL2xGLEdBQ0E2bkYsR0FBQTM4RSxVQUFBZzdFLG9DQUFBaGlGLEVBQ0EyakYsR0FBQTM4RSxVQUFBaTdFLG9DQUFBamlGLEVDN0NBLE1BQUE0akYsV0FBQXBDLEdBVUEsV0FBQTMrRSxDQUFBd04sRUFBQXNyRSxFQUFBdCtDLEVBQUFva0QsR0FFQWpxRSxNQUFBbkgsRUFBQXNyRSxFQUFBdCtDLEVBQUFva0QsRUFFQSxFQVVBbUMsR0FBQTU4RSxVQUFBdzJFLGNBQUEsU0NqQkEsTUFBQXFHLEdBZ0JBLFdBQUFoaEYsQ0FBQXdOLEVBQUEsR0FBQXl6RSxHQUFBLEVBQUFwSCxFQUFBLEdBQUFnQyxFQUFBdGlGLE1BT0E2RCxLQUFBb1EsS0FBQUEsRUFPQXBRLEtBQUF5OEUsT0FBQUEsRUFPQXo4RSxLQUFBNmpGLFNBQUFBLEVBUUE3akYsS0FBQXkrRSxVQUFBQSxFQVFBeitFLEtBQUE0VixLQUFBblUsS0FHQXpCLEtBQUE2akYsU0FBQSxHQUVBN2pGLEtBQUE4OEUsZUFJQSxDQVNBLFlBQUFwa0UsQ0FBQWcxQyxHQUVBLE1BQUErdUIsRUFBQSxHQUNBcUgsRUFBQXAyQixFQUFBK3VCLE9BQ0FzSCxFQUFBLEdBQUFyMkIsRUFBQTZ1QixLQUFBLEdBRUEsSUFBQSxJQUFBeDdFLEVBQUEsRUFBQXNCLEVBQUF5aEYsRUFBQTdpRixPQUFBRixJQUFBc0IsSUFBQXRCLEVBRUEwN0UsRUFBQXI4RSxLQUFBNGpGLEdBQUFGLEVBQUEvaUYsSUFBQXNPLE1BQUEwMEUsSUFJQSxNQUFBdkgsRUFBQSxJQUFBeDhFLEtBQUEwdEQsRUFBQXQ5QyxLQUFBczlDLEVBQUFtMkIsU0FBQXBILEVBQUEvdUIsRUFBQSt3QixXQUdBLE9BRkFqQyxFQUFBNW1FLEtBQUE4M0MsRUFBQTkzQyxLQUVBNG1FLENBRUEsQ0FTQSxhQUFBeG1FLENBQUF3bUUsR0FFQSxNQUFBQyxFQUFBLEdBQ0F3SCxFQUFBekgsRUFBQUMsT0FFQS91QixFQUFBLENBRUF0OUMsS0FBQW9zRSxFQUFBcHNFLEtBQ0F5ekUsU0FBQXJILEVBQUFxSCxTQUNBcEgsT0FBQUEsRUFDQTdtRSxLQUFBNG1FLEVBQUE1bUUsS0FDQTZvRSxVQUFBakMsRUFBQWlDLFdBSUEsSUFBQSxJQUFBMTlFLEVBQUEsRUFBQXNCLEVBQUE0aEYsRUFBQWhqRixPQUFBRixJQUFBc0IsSUFBQXRCLEVBRUEwN0UsRUFBQXI4RSxLQUFBbWhGLEdBQUF2ckUsT0FBQWl1RSxFQUFBbGpGLEtBSUEsT0FBQTJzRCxDQUVBLENBZ0JBLG9DQUFBdzJCLENBQUE5ekUsRUFBQSt6RSxFQUFBNUgsRUFBQTZILEdBRUEsTUFBQUMsRUFBQUYsRUFBQWxqRixPQUNBdzdFLEVBQUEsR0FFQSxJQUFBLElBQUExN0UsRUFBQSxFQUFBQSxFQUFBc2pGLEVBQUF0akYsSUFBQSxDQUVBLElBQUEyNkUsRUFBQSxHQUNBdCtDLEVBQUEsR0FFQXMrQyxFQUFBdDdFLE1BQ0FXLEVBQUFzakYsRUFBQSxHQUFBQSxFQUNBdGpGLEdBQ0FBLEVBQUEsR0FBQXNqRixHQUVBam5ELEVBQUFoOUIsS0FBQSxFQUFBLEVBQUEsR0FFQSxNQUFBNEYsRUFBQXkxRSxHQUFBQyxHQUNBQSxFQUFBQyxHQUFBRCxFQUFBLEVBQUExMUUsR0FDQW8zQixFQUFBdStDLEdBQUF2K0MsRUFBQSxFQUFBcDNCLEdBSUFvK0UsR0FBQSxJQUFBMUksRUFBQSxLQUVBQSxFQUFBdDdFLEtBQUFpa0YsR0FDQWpuRCxFQUFBaDlCLEtBQUFnOUIsRUFBQSxLQUlBcS9DLEVBQUFyOEUsS0FDQSxJQUFBbWpGLEdBQ0EsMEJBQUFZLEVBQUFwakYsR0FBQXFQLEtBQUEsSUFDQXNyRSxFQUFBdCtDLEdBQ0EvdEIsTUFBQSxFQUFBa3RFLEdBRUEsQ0FFQSxPQUFBLElBQUF2OEUsS0FBQW9RLEdBQUEsRUFBQXFzRSxFQUVBLENBWUEsaUJBQUE2SCxDQUFBQyxFQUFBbjBFLEdBRUEsSUFBQW8wRSxFQUFBRCxFQUVBLElBQUFqdUUsTUFBQUMsUUFBQWd1RSxHQUFBLENBRUEsTUFBQS9MLEVBQUErTCxFQUNBQyxFQUFBaE0sRUFBQTV4RCxVQUFBNHhELEVBQUE1eEQsU0FBQXlQLFlBQUFtaUQsRUFBQW5pRCxVQUVBLENBRUEsSUFBQSxJQUFBdDFCLEVBQUEsRUFBQUEsRUFBQXlqRixFQUFBdmpGLE9BQUFGLElBRUEsR0FBQXlqRixFQUFBempGLEdBQUFxUCxPQUFBQSxFQUVBLE9BQUFvMEUsRUFBQXpqRixHQU1BLE9BQUEsSUFFQSxDQWVBLDBDQUFBMGpGLENBQUFDLEVBQUFuSSxFQUFBNkgsR0FFQSxNQUFBTyxFQUFBLENBQUEsRUFJQUMsRUFBQSxxQkFJQSxJQUFBLElBQUE3akYsRUFBQSxFQUFBcWIsRUFBQXNvRSxFQUFBempGLE9BQUFGLEVBQUFxYixFQUFBcmIsSUFBQSxDQUVBLE1BQUE4akYsRUFBQUgsRUFBQTNqRixHQUNBK2pGLEVBQUFELEVBQUF6MEUsS0FBQTIwRSxNQUFBSCxHQUVBLEdBQUFFLEdBQUFBLEVBQUE3akYsT0FBQSxFQUFBLENBRUEsTUFBQW1QLEVBQUEwMEUsRUFBQSxHQUVBLElBQUFFLEVBQUFMLEVBQUF2MEUsR0FFQTQwRSxJQUVBTCxFQUFBdjBFLEdBQUE0MEUsRUFBQSxJQUlBQSxFQUFBNWtGLEtBQUF5a0YsRUFFQSxDQUVBLENBRUEsTUFBQUksRUFBQSxHQUVBLElBQUEsTUFBQTcwRSxLQUFBdTBFLEVBRUFNLEVBQUE3a0YsS0FBQUosS0FBQWtrRiw4QkFBQTl6RSxFQUFBdTBFLEVBQUF2MEUsR0FBQW1zRSxFQUFBNkgsSUFJQSxPQUFBYSxDQUVBLENBV0EscUJBQUFDLENBQUFqb0QsRUFBQTB2QixHQUlBLEdBRkEvbEQsUUFBQUMsS0FBQSxzRkFFQW8yQixFQUdBLE9BREFyMkIsUUFBQW14QixNQUFBLHlEQUNBLEtBSUEsTUFBQW90RCxFQUFBLFNBQUF0RCxFQUFBdUQsRUFBQUMsRUFBQUMsRUFBQUMsR0FHQSxHQUFBLElBQUFGLEVBQUFwa0YsT0FBQSxDQUVBLE1BQUF5NkUsRUFBQSxHQUNBdCtDLEVBQUEsR0FFQTArQyxHQUFBdUosRUFBQTNKLEVBQUF0K0MsRUFBQWtvRCxHQUdBLElBQUE1SixFQUFBejZFLFFBRUFza0YsRUFBQW5sRixLQUFBLElBQUF5aEYsRUFBQXVELEVBQUExSixFQUFBdCtDLEdBSUEsQ0FFQSxFQUVBcS9DLEVBQUEsR0FFQStJLEVBQUF2b0QsRUFBQTdzQixNQUFBLFVBQ0Ftc0UsRUFBQXQvQyxFQUFBcy9DLEtBQUEsR0FDQWtDLEVBQUF4aEQsRUFBQXdoRCxVQUdBLElBQUFvRixFQUFBNW1ELEVBQUFoOEIsU0FBQSxFQUVBLE1BQUF3a0YsRUFBQXhvRCxFQUFBeW9ELFdBQUEsR0FFQSxJQUFBLElBQUExM0UsRUFBQSxFQUFBQSxFQUFBeTNFLEVBQUF4a0YsT0FBQStNLElBQUEsQ0FFQSxNQUFBcTNFLEVBQUFJLEVBQUF6M0UsR0FBQWdMLEtBR0EsR0FBQXFzRSxHQUFBLElBQUFBLEVBQUFwa0YsT0FHQSxHQUFBb2tGLEVBQUEsR0FBQVgsYUFBQSxDQUdBLE1BQUFpQixFQUFBLENBQUEsRUFFQSxJQUFBeGtCLEVBRUEsSUFBQUEsRUFBQSxFQUFBQSxFQUFBa2tCLEVBQUFwa0YsT0FBQWtnRSxJQUVBLEdBQUFra0IsRUFBQWxrQixHQUFBdWpCLGFBRUEsSUFBQSxJQUFBcGlGLEVBQUEsRUFBQUEsRUFBQStpRixFQUFBbGtCLEdBQUF1akIsYUFBQXpqRixPQUFBcUIsSUFFQXFqRixFQUFBTixFQUFBbGtCLEdBQUF1akIsYUFBQXBpRixLQUFBLEVBV0EsSUFBQSxNQUFBc2pGLEtBQUFELEVBQUEsQ0FFQSxNQUFBakssRUFBQSxHQUNBdCtDLEVBQUEsR0FFQSxJQUFBLElBQUE5NkIsRUFBQSxFQUFBQSxJQUFBK2lGLEVBQUFsa0IsR0FBQXVqQixhQUFBempGLFNBQUFxQixFQUFBLENBRUEsTUFBQXVqRixFQUFBUixFQUFBbGtCLEdBRUF1YSxFQUFBdDdFLEtBQUF5bEYsRUFBQTVKLE1BQ0E3K0MsRUFBQWg5QixLQUFBeWxGLEVBQUFoQixjQUFBZSxFQUFBLEVBQUEsRUFFQSxDQUVBbkosRUFBQXI4RSxLQUFBLElBQUFtakYsR0FBQSx5QkFBQXFDLEVBQUEsSUFBQWxLLEVBQUF0K0MsR0FFQSxDQUVBeW1ELEVBQUE4QixFQUFBMWtGLE9BQUFzN0UsQ0FFQSxLQUFBLENBSUEsTUFBQXVKLEVBQUEsVUFBQW41QixFQUFBMytDLEdBQUFvQyxLQUFBLElBRUErMEUsRUFDQXhCLEdBQUFtQyxFQUFBLFlBQ0FULEVBQUEsTUFBQTVJLEdBRUEwSSxFQUNBMUIsR0FBQXFDLEVBQUEsY0FDQVQsRUFBQSxNQUFBNUksR0FFQTBJLEVBQ0F4QixHQUFBbUMsRUFBQSxTQUNBVCxFQUFBLE1BQUE1SSxFQUVBLENBRUEsQ0FFQSxHQUFBLElBQUFBLEVBQUF4N0UsT0FFQSxPQUFBLEtBTUEsT0FGQSxJQUFBakIsS0FBQXdsRixFQUFBM0IsRUFBQXBILEVBQUFnQyxFQUlBLENBT0EsYUFBQTNCLEdBR0EsSUFBQStHLEVBQUEsRUFFQSxJQUFBLElBQUE5aUYsRUFBQSxFQUFBc0IsRUFIQXJDLEtBQUF5OEUsT0FHQXg3RSxPQUFBRixJQUFBc0IsSUFBQXRCLEVBQUEsQ0FFQSxNQUFBMjdFLEVBQUExOEUsS0FBQXk4RSxPQUFBMTdFLEdBRUE4aUYsRUFBQXZpRixLQUFBYSxJQUFBMGhGLEVBQUFuSCxFQUFBaEIsTUFBQWdCLEVBQUFoQixNQUFBejZFLE9BQUEsR0FFQSxDQUlBLE9BRkFqQixLQUFBNmpGLFNBQUFBLEVBRUE3akYsSUFFQSxDQU9BLElBQUFvaUYsR0FFQSxJQUFBLElBQUFyaEYsRUFBQSxFQUFBQSxFQUFBZixLQUFBeThFLE9BQUF4N0UsT0FBQUYsSUFFQWYsS0FBQXk4RSxPQUFBMTdFLEdBQUFxaEYsS0FBQSxFQUFBcGlGLEtBQUE2akYsVUFJQSxPQUFBN2pGLElBRUEsQ0FRQSxRQUFBeWlGLEdBRUEsSUFBQUMsR0FBQSxFQUVBLElBQUEsSUFBQTNoRixFQUFBLEVBQUFBLEVBQUFmLEtBQUF5OEUsT0FBQXg3RSxPQUFBRixJQUVBMmhGLEVBQUFBLEdBQUExaUYsS0FBQXk4RSxPQUFBMTdFLEdBQUEwaEYsV0FJQSxPQUFBQyxDQUVBLENBUUEsUUFBQWxyQixHQUVBLElBQUEsSUFBQXoyRCxFQUFBLEVBQUFBLEVBQUFmLEtBQUF5OEUsT0FBQXg3RSxPQUFBRixJQUVBZixLQUFBeThFLE9BQUExN0UsR0FBQXkyRCxXQUlBLE9BQUF4M0QsSUFFQSxDQU9BLEtBQUF5SCxHQUVBLE1BQUFnMUUsRUFBQSxHQUVBLElBQUEsSUFBQTE3RSxFQUFBLEVBQUFBLEVBQUFmLEtBQUF5OEUsT0FBQXg3RSxPQUFBRixJQUVBMDdFLEVBQUFyOEUsS0FBQUosS0FBQXk4RSxPQUFBMTdFLEdBQUEwRyxTQUlBLE9BQUEsSUFBQXpILEtBQUE0QyxZQUFBNUMsS0FBQW9RLEtBQUFwUSxLQUFBNmpGLFNBQUFwSCxFQUFBejhFLEtBQUF5K0UsVUFFQSxDQU9BLE1BQUF6b0UsR0FFQSxPQUFBaFcsS0FBQTRDLFlBQUFvVCxPQUFBaFcsS0FFQSxFQThDQSxTQUFBZ2tGLEdBQUF0MkIsR0FFQSxRQUFBM3RELElBQUEydEQsRUFBQTd0RCxLQUVBLE1BQUEsSUFBQXVELE1BQUEsNERBSUEsTUFBQXkrRSxFQWxEQSxTQUFBa0UsR0FFQSxPQUFBQSxFQUFBaGtGLGVBRUEsSUFBQSxTQUNBLElBQUEsU0FDQSxJQUFBLFFBQ0EsSUFBQSxTQUNBLElBQUEsVUFFQSxPQUFBd2hGLEdBRUEsSUFBQSxTQUNBLElBQUEsVUFDQSxJQUFBLFVBQ0EsSUFBQSxVQUVBLE9BQUFJLEdBRUEsSUFBQSxRQUVBLE9BQUFMLEdBRUEsSUFBQSxhQUVBLE9BQUFHLEdBRUEsSUFBQSxPQUNBLElBQUEsVUFFQSxPQUFBSixHQUVBLElBQUEsU0FFQSxPQUFBSyxHQUlBLE1BQUEsSUFBQXRnRixNQUFBLDhDQUFBMmlGLEVBRUEsQ0FVQUMsQ0FBQXQ0QixFQUFBN3RELE1BRUEsUUFBQUUsSUFBQTJ0RCxFQUFBZ3VCLE1BQUEsQ0FFQSxNQUFBQSxFQUFBLEdBQUF0K0MsRUFBQSxHQUVBMCtDLEdBQUFwdUIsRUFBQTEwQyxLQUFBMGlFLEVBQUF0K0MsRUFBQSxTQUVBc3dCLEVBQUFndUIsTUFBQUEsRUFDQWh1QixFQUFBdHdCLE9BQUFBLENBRUEsQ0FHQSxZQUFBcjlCLElBQUE4aEYsRUFBQW5wRSxNQUVBbXBFLEVBQUFucEUsTUFBQWcxQyxHQUtBLElBQUFtMEIsRUFBQW4wQixFQUFBdDlDLEtBQUFzOUMsRUFBQWd1QixNQUFBaHVCLEVBQUF0d0IsT0FBQXN3QixFQUFBOHpCLGNBSUEsQ0MzbEJLLE1BQUF5RSxHQUFBLENBU0xoMEUsU0FBQSxFQVFBaTBFLE1BQUEsQ0FBQSxFQVVBdCtFLElBQUEsU0FBQXkxQixFQUFBOG9ELElBRUEsSUFBQW5tRixLQUFBaVMsVUFJQWpTLEtBQUFrbUYsTUFBQTdvRCxHQUFBOG9ELEVBRUEsRUFTQTFNLElBQUEsU0FBQXA4QyxHQUVBLElBQUEsSUFBQXI5QixLQUFBaVMsUUFJQSxPQUFBalMsS0FBQWttRixNQUFBN29ELEVBRUEsRUFRQXBGLE9BQUEsU0FBQW9GLFVBRUFyOUIsS0FBQWttRixNQUFBN29ELEVBRUEsRUFPQXRnQixNQUFBLFdBRUEvYyxLQUFBa21GLE1BQUEsQ0FBQSxDQUVBLEdDaEVBLE1BQUFFLEdBU0EsV0FBQXhqRixDQUFBeWpGLEVBQUFDLEVBQUFDLEdBRUEsTUFBQTVvQyxFQUFBMzlDLEtBRUEsSUFHQXdtRixFQUhBQyxHQUFBLEVBQ0FDLEVBQUEsRUFDQUMsRUFBQSxFQUVBLE1BQUFDLEVBQUEsR0FXQTVtRixLQUFBNm1GLGFBQUE5bUYsRUFRQUMsS0FBQXFtRixPQUFBQSxFQVFBcm1GLEtBQUFzbUYsV0FBQUEsRUFRQXRtRixLQUFBdW1GLFFBQUFBLEVBUUF2bUYsS0FBQThtRixVQUFBLFNBQUF6d0UsR0FFQXN3RSxLQUVBLElBQUFGLFFBRUExbUYsSUFBQTQ5QyxFQUFBa3BDLFNBRUFscEMsRUFBQWtwQyxRQUFBeHdFLEVBQUFxd0UsRUFBQUMsR0FNQUYsR0FBQSxDQUVBLEVBUUF6bUYsS0FBQSttRixRQUFBLFNBQUExd0UsR0FFQXF3RSxTQUVBM21GLElBQUE0OUMsRUFBQTJvQyxZQUVBM29DLEVBQUEyb0MsV0FBQWp3RSxFQUFBcXdFLEVBQUFDLEdBSUFELElBQUFDLElBRUFGLEdBQUEsT0FFQTFtRixJQUFBNDlDLEVBQUEwb0MsUUFFQTFvQyxFQUFBMG9DLFNBTUEsRUFRQXJtRixLQUFBZ25GLFVBQUEsU0FBQTN3RSxRQUVBdFcsSUFBQTQ5QyxFQUFBNG9DLFNBRUE1b0MsRUFBQTRvQyxRQUFBbHdFLEVBSUEsRUFTQXJXLEtBQUFpbkYsV0FBQSxTQUFBNXdFLEdBRUEsT0FBQW13RSxFQUVBQSxFQUFBbndFLEdBSUFBLENBRUEsRUFvQ0FyVyxLQUFBa25GLGVBQUEsU0FBQWxnQyxHQUlBLE9BRkF3L0IsRUFBQXgvQixFQUVBaG5ELElBRUEsRUFnQkFBLEtBQUFtbkYsV0FBQSxTQUFBQyxFQUFBQyxHQUlBLE9BRkFULEVBQUF4bUYsS0FBQWduRixFQUFBQyxHQUVBcm5GLElBRUEsRUFRQUEsS0FBQXNuRixjQUFBLFNBQUFGLEdBRUEsTUFBQTVtRixFQUFBb21GLEVBQUF6bUYsUUFBQWluRixHQVFBLE9BTkEsSUFBQTVtRixHQUVBb21GLEVBQUFubUYsT0FBQUQsRUFBQSxHQUlBUixJQUVBLEVBUUFBLEtBQUF1bkYsV0FBQSxTQUFBcEIsR0FFQSxJQUFBLElBQUFwbEYsRUFBQSxFQUFBQyxFQUFBNGxGLEVBQUEzbEYsT0FBQUYsRUFBQUMsRUFBQUQsR0FBQSxFQUFBLENBRUEsTUFBQXFtRixFQUFBUixFQUFBN2xGLEdBQ0FzbUYsRUFBQVQsRUFBQTdsRixFQUFBLEdBSUEsR0FGQXFtRixFQUFBSSxTQUFBSixFQUFBckosVUFBQSxHQUVBcUosRUFBQTN5RSxLQUFBMHhFLEdBRUEsT0FBQWtCLENBSUEsQ0FFQSxPQUFBLElBRUEsQ0FFQSxFQVVLLE1BQUFJLEdBQUEsSUFBQXJCLEdDbFJMLE1BQUFzQixHQU9BLFdBQUE5a0YsQ0FBQStrRixHQVFBM25GLEtBQUEybkYsYUFBQTVuRixJQUFBNG5GLEVBQUFBLEVBQUFGLEdBU0F6bkYsS0FBQTRuRixZQUFBLFlBUUE1bkYsS0FBQTZuRixpQkFBQSxFQU9BN25GLEtBQUE0bEUsS0FBQSxHQU9BNWxFLEtBQUE4bkYsYUFBQSxHQVFBOW5GLEtBQUErbkYsY0FBQSxDQUFBLENBRUEsQ0FXQSxJQUFBQyxHQUFBLENBU0EsU0FBQUMsQ0FBQTV4RSxFQUFBaXdFLEdBRUEsTUFBQTNvQyxFQUFBMzlDLEtBRUEsT0FBQSxJQUFBaVIsU0FBQSxTQUFBQyxFQUFBQyxHQUVBd3NDLEVBQUFxcUMsS0FBQTN4RSxFQUFBbkYsRUFBQW8xRSxFQUFBbjFFLEVBRUEsR0FFQSxDQVFBLEtBQUF1SCxHQUFBLENBU0EsY0FBQXd2RSxDQUFBTixHQUdBLE9BREE1bkYsS0FBQTRuRixZQUFBQSxFQUNBNW5GLElBRUEsQ0FXQSxrQkFBQW1vRixDQUFBbG1GLEdBR0EsT0FEQWpDLEtBQUE2bkYsZ0JBQUE1bEYsRUFDQWpDLElBRUEsQ0FRQSxPQUFBb29GLENBQUF4aUIsR0FHQSxPQURBNWxFLEtBQUE0bEUsS0FBQUEsRUFDQTVsRSxJQUVBLENBUUEsZUFBQXFvRixDQUFBUCxHQUdBLE9BREE5bkYsS0FBQThuRixhQUFBQSxFQUNBOW5GLElBRUEsQ0FTQSxnQkFBQXNvRixDQUFBUCxHQUdBLE9BREEvbkYsS0FBQStuRixjQUFBQSxFQUNBL25GLElBRUEsRUE0QkEwbkYsR0FBQWEsc0JBQUEsWUNwTUEsTUFBQUMsR0FBQSxDQUFBLEVBRUEsTUFBQUMsV0FBQXJsRixNQUVBLFdBQUFSLENBQUFnTyxFQUFBODNFLEdBRUFueEUsTUFBQTNHLEdBQ0E1USxLQUFBMG9GLFNBQUFBLENBRUEsRUFtQkEsTUFBQUMsV0FBQWpCLEdBT0EsV0FBQTlrRixDQUFBK2tGLEdBRUFwd0UsTUFBQW93RSxHQU9BM25GLEtBQUE0b0YsU0FBQSxHQVFBNW9GLEtBQUE2b0YsYUFBQSxFQUVBLENBV0EsSUFBQWIsQ0FBQTN4RSxFQUFBZ3dFLEVBQUFDLEVBQUFDLFFBRUF4bUYsSUFBQXNXLElBQUFBLEVBQUEsU0FFQXRXLElBQUFDLEtBQUE0bEUsT0FBQXZ2RCxFQUFBclcsS0FBQTRsRSxLQUFBdnZELEdBRUFBLEVBQUFyVyxLQUFBMm5GLFFBQUFWLFdBQUE1d0UsR0FFQSxNQUFBeXlFLEVBQUE3QyxHQUFBeE0sSUFBQXBqRSxHQUVBLFFBQUF0VyxJQUFBK29GLEVBWUEsT0FWQTlvRixLQUFBMm5GLFFBQUFiLFVBQUF6d0UsR0FFQWpGLFlBQUEsS0FFQWkxRSxHQUFBQSxFQUFBeUMsR0FFQTlvRixLQUFBMm5GLFFBQUFaLFFBQUExd0UsRUFBQSxHQUVBLEdBRUF5eUUsRUFNQSxRQUFBL29GLElBQUF5b0YsR0FBQW55RSxHQVVBLFlBUkFteUUsR0FBQW55RSxHQUFBalcsS0FBQSxDQUVBaW1GLE9BQUFBLEVBQ0FDLFdBQUFBLEVBQ0FDLFFBQUFBLElBU0FpQyxHQUFBbnlFLEdBQUEsR0FFQW15RSxHQUFBbnlFLEdBQUFqVyxLQUFBLENBQ0FpbUYsT0FBQUEsRUFDQUMsV0FBQUEsRUFDQUMsUUFBQUEsSUFJQSxNQUFBd0MsRUFBQSxJQUFBQyxRQUFBM3lFLEVBQUEsQ0FDQTR5RSxRQUFBLElBQUFDLFFBQUFscEYsS0FBQStuRixlQUNBb0IsWUFBQW5wRixLQUFBNm5GLGdCQUFBLFVBQUEsZ0JBS0FlLEVBQUE1b0YsS0FBQTRvRixTQUNBQyxFQUFBN29GLEtBQUE2b0YsYUFHQU8sTUFBQUwsR0FDQU0sTUFBQVgsSUFFQSxHQUFBLE1BQUFBLEVBQUFZLFFBQUEsSUFBQVosRUFBQVksT0FBQSxDQWFBLEdBUkEsSUFBQVosRUFBQVksUUFFQTFpRixRQUFBQyxLQUFBLDZDQU1BLG9CQUFBMGlGLHFCQUFBeHBGLElBQUEyb0YsRUFBQWMsV0FBQXpwRixJQUFBMm9GLEVBQUFjLEtBQUFDLFVBRUEsT0FBQWYsRUFJQSxNQUFBZ0IsRUFBQWxCLEdBQUFueUUsR0FDQXN6RSxFQUFBakIsRUFBQWMsS0FBQUMsWUFJQUcsRUFBQWxCLEVBQUFPLFFBQUF4UCxJQUFBLGdCQUFBaVAsRUFBQU8sUUFBQXhQLElBQUEsa0JBQ0FvUSxFQUFBRCxFQUFBbi9DLFNBQUFtL0MsR0FBQSxFQUNBRSxFQUFBLElBQUFELEVBQ0EsSUFBQUUsRUFBQSxFQUdBLE1BQUFDLEVBQUEsSUFBQVQsZUFBQSxDQUNBLEtBQUE5ekMsQ0FBQXcwQyxJQUlBLFNBQUFDLElBRUFQLEVBQUFRLE9BQUFkLE1BQUEsRUFBQWUsT0FBQW5vRixZQUVBLEdBQUFtb0YsRUFFQUgsRUFBQUksWUFFQSxDQUVBTixHQUFBOW5GLEVBQUFxb0YsV0FFQSxNQUFBM3BGLEVBQUEsSUFBQTRwRixjQUFBLFdBQUEsQ0FBQVQsbUJBQUFDLFNBQUFGLFVBQ0EsSUFBQSxJQUFBOW9GLEVBQUEsRUFBQXFiLEVBQUFzdEUsRUFBQXpvRixPQUFBRixFQUFBcWIsRUFBQXJiLElBQUEsQ0FFQSxNQUFBZ2hCLEVBQUEybkUsRUFBQTNvRixHQUNBZ2hCLEVBQUF1a0UsWUFBQXZrRSxFQUFBdWtFLFdBQUEzbEYsRUFFQSxDQUVBc3BGLEVBQUFPLFFBQUF2b0YsR0FDQWlvRixHQUVBLEtBRUExaEYsSUFFQXloRixFQUFBbHlELE1BQUF2dkIsRUFBQSxHQUlBLENBakNBMGhGLEVBbUNBLElBSUEsT0FBQSxJQUFBTyxTQUFBVCxFQUVBLENBRUEsTUFBQSxJQUFBdkIsR0FBQSxjQUFBQyxFQUFBcnlFLHVCQUFBcXlFLEVBQUFZLFdBQUFaLEVBQUFnQyxhQUFBaEMsRUFFQSxJQUdBVyxNQUFBWCxJQUVBLE9BQUFHLEdBRUEsSUFBQSxjQUVBLE9BQUFILEVBQUFpQyxjQUVBLElBQUEsT0FFQSxPQUFBakMsRUFBQWtDLE9BRUEsSUFBQSxXQUVBLE9BQUFsQyxFQUFBbUMsT0FDQXhCLE1BQUF3QixJQUVBLElBQUFDLFdBQ0FDLGdCQUFBRixFQUFBakMsS0FJQSxJQUFBLE9BRUEsT0FBQUYsRUFBQWg3QixPQUVBLFFBRUEsR0FBQSxLQUFBazdCLEVBRUEsT0FBQUYsRUFBQW1DLE9BRUEsQ0FHQSxNQUNBdGdELEVBREEsMEJBQ0FBLEtBQUFxK0MsR0FDQW9DLEVBQUF6Z0QsR0FBQUEsRUFBQSxHQUFBQSxFQUFBLEdBQUF4b0MsbUJBQUFoQyxFQUNBa3JGLEVBQUEsSUFBQUMsWUFBQUYsR0FDQSxPQUFBdEMsRUFBQWlDLGNBQUF0QixNQUFBM3VDLEdBQUF1d0MsRUFBQUUsT0FBQXp3QyxJQUVBLEVBRUEsSUFHQTJ1QyxNQUFBOXpFLElBSUEwd0UsR0FBQXIrRSxJQUFBeU8sRUFBQWQsR0FFQSxNQUFBbTBFLEVBQUFsQixHQUFBbnlFLFVBQ0FteUUsR0FBQW55RSxHQUVBLElBQUEsSUFBQXRWLEVBQUEsRUFBQXFiLEVBQUFzdEUsRUFBQXpvRixPQUFBRixFQUFBcWIsRUFBQXJiLElBQUEsQ0FFQSxNQUFBZ2hCLEVBQUEybkUsRUFBQTNvRixHQUNBZ2hCLEVBQUFza0UsUUFBQXRrRSxFQUFBc2tFLE9BQUE5d0UsRUFFQSxLQUdBNjFFLE9BQUFDLElBSUEsTUFBQTNCLEVBQUFsQixHQUFBbnlFLEdBRUEsUUFBQXRXLElBQUEycEYsRUFJQSxNQURBMXBGLEtBQUEybkYsUUFBQVgsVUFBQTN3RSxHQUNBZzFFLFNBSUE3QyxHQUFBbnlFLEdBRUEsSUFBQSxJQUFBdFYsRUFBQSxFQUFBcWIsRUFBQXN0RSxFQUFBem9GLE9BQUFGLEVBQUFxYixFQUFBcmIsSUFBQSxDQUVBLE1BQUFnaEIsRUFBQTJuRSxFQUFBM29GLEdBQ0FnaEIsRUFBQXdrRSxTQUFBeGtFLEVBQUF3a0UsUUFBQThFLEVBRUEsQ0FFQXJyRixLQUFBMm5GLFFBQUFYLFVBQUEzd0UsRUFBQSxJQUdBaTFFLFNBQUEsS0FFQXRyRixLQUFBMm5GLFFBQUFaLFFBQUExd0UsRUFBQSxJQUlBclcsS0FBQTJuRixRQUFBYixVQUFBendFLEVBRUEsQ0FRQSxlQUFBazFFLENBQUF0cEYsR0FHQSxPQURBakMsS0FBQTZvRixhQUFBNW1GLEVBQ0FqQyxJQUVBLENBUUEsV0FBQXdyRixDQUFBdnBGLEdBR0EsT0FEQWpDLEtBQUE0b0YsU0FBQTNtRixFQUNBakMsSUFFQSxFQ25VQSxNQUFBeXJGLFdBQUEvRCxHQU9BLFdBQUE5a0YsQ0FBQStrRixHQUVBcHdFLE1BQUFvd0UsRUFFQSxDQVdBLElBQUFLLENBQUEzeEUsRUFBQWd3RSxFQUFBQyxFQUFBQyxHQUVBLE1BQUE1b0MsRUFBQTM5QyxLQUVBcW5GLEVBQUEsSUFBQXNCLEdBQUEzb0YsS0FBQTJuRixTQUNBTixFQUFBZSxRQUFBcG9GLEtBQUE0bEUsTUFDQXloQixFQUFBaUIsaUJBQUF0b0YsS0FBQStuRixlQUNBVixFQUFBYyxtQkFBQW5vRixLQUFBNm5GLGlCQUNBUixFQUFBVyxLQUFBM3hFLEdBQUEsU0FBQXcwRSxHQUVBLElBRUF4RSxFQUFBMW9DLEVBQUFqbEMsTUFBQUQsS0FBQUMsTUFBQW15RSxJQUVBLENBQUEsTUFBQXJpRixHQUVBKzlFLEVBRUFBLEVBQUEvOUUsR0FJQTVCLFFBQUFteEIsTUFBQXZ2QixHQUlBbTFDLEVBQUFncUMsUUFBQVgsVUFBQTN3RSxFQUVBLENBRUEsR0FBQWl3RSxFQUFBQyxFQUVBLENBUUEsS0FBQTd0RSxDQUFBZzFDLEdBRUEsTUFBQXIzQixFQUFBLEdBRUEsSUFBQSxJQUFBdDFCLEVBQUEsRUFBQUEsRUFBQTJzRCxFQUFBenNELE9BQUFGLElBQUEsQ0FFQSxNQUFBeTdFLEVBQUFvSCxHQUFBbHJFLE1BQUFnMUMsRUFBQTNzRCxJQUVBczFCLEVBQUFqMkIsS0FBQW84RSxFQUVBLENBRUEsT0FBQW5tRCxDQUVBLEVDNUVBLE1BQUFxMUQsV0FBQWhFLEdBT0EsV0FBQTlrRixDQUFBK2tGLEdBRUFwd0UsTUFBQW93RSxFQUVBLENBY0EsSUFBQUssQ0FBQTN4RSxFQUFBZ3dFLEVBQUFDLEVBQUFDLEdBRUEsTUFBQTVvQyxFQUFBMzlDLEtBRUFtVyxFQUFBLEdBRUE2RixFQUFBLElBQUFvZ0QsR0FFQWlyQixFQUFBLElBQUFzQixHQUFBM29GLEtBQUEybkYsU0FDQU4sRUFBQWUsUUFBQXBvRixLQUFBNGxFLE1BQ0F5aEIsRUFBQWtFLGdCQUFBLGVBQ0FsRSxFQUFBaUIsaUJBQUF0b0YsS0FBQStuRixlQUNBVixFQUFBYyxtQkFBQXhxQyxFQUFBa3FDLGlCQUVBLElBQUFrQyxFQUFBLEVBRUEsU0FBQTRCLEVBQUE1cUYsR0FFQXNtRixFQUFBVyxLQUFBM3hFLEVBQUF0VixJQUFBLFNBQUFtUCxHQUVBLE1BQUEwN0UsRUFBQWp1QyxFQUFBamxDLE1BQUF4SSxHQUFBLEdBRUFpRyxFQUFBcFYsR0FBQSxDQUNBa0csTUFBQTJrRixFQUFBM2tGLE1BQ0FDLE9BQUEwa0YsRUFBQTFrRixPQUNBa1EsT0FBQXcwRSxFQUFBeDBFLE9BQ0FNLFFBQUFrMEUsRUFBQWwwRSxTQUdBcXlFLEdBQUEsRUFFQSxJQUFBQSxJQUVBLElBQUE2QixFQUFBQyxjQUFBN3ZFLEVBQUE3RSxVQUFBdmYsSUFFQW9rQixFQUFBeEgsTUFBQTJCLEVBQ0E2RixFQUFBNUUsT0FBQXcwRSxFQUFBeDBFLE9BQ0E0RSxFQUFBakcsYUFBQSxFQUVBc3dFLEdBQUFBLEVBQUFycUUsR0FJQSxHQUFBc3FFLEVBQUFDLEVBRUEsQ0FFQSxHQUFBandFLE1BQUFDLFFBQUFGLEdBRUEsSUFBQSxJQUFBdFYsRUFBQSxFQUFBcWIsRUFBQS9GLEVBQUFwVixPQUFBRixFQUFBcWIsSUFBQXJiLEVBRUE0cUYsRUFBQTVxRixRQVFBc21GLEVBQUFXLEtBQUEzeEUsR0FBQSxTQUFBbkcsR0FFQSxNQUFBMDdFLEVBQUFqdUMsRUFBQWpsQyxNQUFBeEksR0FBQSxHQUVBLEdBQUEwN0UsRUFBQUUsVUFBQSxDQUVBLE1BQUE3YyxFQUFBMmMsRUFBQWwwRSxRQUFBelcsT0FBQTJxRixFQUFBQyxZQUVBLElBQUEsSUFBQS85RSxFQUFBLEVBQUFBLEVBQUFtaEUsRUFBQW5oRSxJQUFBLENBRUFxSSxFQUFBckksR0FBQSxDQUFBNEosUUFBQSxJQUVBLElBQUEsSUFBQTNXLEVBQUEsRUFBQUEsRUFBQTZxRixFQUFBQyxZQUFBOXFGLElBRUFvVixFQUFBckksR0FBQTRKLFFBQUF0WCxLQUFBd3JGLEVBQUFsMEUsUUFBQTVKLEVBQUE4OUUsRUFBQUMsWUFBQTlxRixJQUNBb1YsRUFBQXJJLEdBQUFzSixPQUFBdzBFLEVBQUF4MEUsT0FDQWpCLEVBQUFySSxHQUFBN0csTUFBQTJrRixFQUFBM2tGLE1BQ0FrUCxFQUFBckksR0FBQTVHLE9BQUEwa0YsRUFBQTFrRixNQUlBLENBRUE4VSxFQUFBeEgsTUFBQTJCLENBRUEsTUFFQTZGLEVBQUF4SCxNQUFBdk4sTUFBQTJrRixFQUFBM2tGLE1BQ0ErVSxFQUFBeEgsTUFBQXROLE9BQUEwa0YsRUFBQTFrRixPQUNBOFUsRUFBQXRFLFFBQUFrMEUsRUFBQWwwRSxRQUlBLElBQUFrMEUsRUFBQUMsY0FFQTd2RSxFQUFBN0UsVUFBQXZmLElBSUFva0IsRUFBQTVFLE9BQUF3MEUsRUFBQXgwRSxPQUNBNEUsRUFBQWpHLGFBQUEsRUFFQXN3RSxHQUFBQSxFQUFBcnFFLEVBRUEsR0FBQXNxRSxFQUFBQyxHQUlBLE9BQUF2cUUsQ0FFQSxFQ3BJQSxNQUFBK3ZFLFdBQUFyRSxHQU9BLFdBQUE5a0YsQ0FBQStrRixHQUVBcHdFLE1BQUFvd0UsRUFFQSxDQWNBLElBQUFLLENBQUEzeEUsRUFBQWd3RSxFQUFBQyxFQUFBQyxRQUVBeG1GLElBQUFDLEtBQUE0bEUsT0FBQXZ2RCxFQUFBclcsS0FBQTRsRSxLQUFBdnZELEdBRUFBLEVBQUFyVyxLQUFBMm5GLFFBQUFWLFdBQUE1d0UsR0FFQSxNQUFBc25DLEVBQUEzOUMsS0FFQThvRixFQUFBN0MsR0FBQXhNLElBQUFwakUsR0FFQSxRQUFBdFcsSUFBQStvRixFQVlBLE9BVkFuckMsRUFBQWdxQyxRQUFBYixVQUFBendFLEdBRUFqRixZQUFBLFdBRUFpMUUsR0FBQUEsRUFBQXlDLEdBRUFuckMsRUFBQWdxQyxRQUFBWixRQUFBMXdFLEVBRUEsR0FBQSxHQUVBeXlFLEVBSUEsTUFBQXQwRSxFQUFBckUsR0FBQSxPQUVBLFNBQUE2N0UsSUFFQUMsSUFFQWhHLEdBQUFyK0UsSUFBQXlPLEVBQUFyVyxNQUVBcW1GLEdBQUFBLEVBQUFybUYsTUFFQTI5QyxFQUFBZ3FDLFFBQUFaLFFBQUExd0UsRUFFQSxDQUVBLFNBQUE2MUUsRUFBQXZyRixHQUVBc3JGLElBRUExRixHQUFBQSxFQUFBNWxGLEdBRUFnOUMsRUFBQWdxQyxRQUFBWCxVQUFBM3dFLEdBQ0FzbkMsRUFBQWdxQyxRQUFBWixRQUFBMXdFLEVBRUEsQ0FFQSxTQUFBNDFFLElBRUF6M0UsRUFBQWxVLG9CQUFBLE9BQUEwckYsR0FBQSxHQUNBeDNFLEVBQUFsVSxvQkFBQSxRQUFBNHJGLEdBQUEsRUFFQSxDQWVBLE9BYkExM0UsRUFBQTVVLGlCQUFBLE9BQUFvc0YsR0FBQSxHQUNBeDNFLEVBQUE1VSxpQkFBQSxRQUFBc3NGLEdBQUEsR0FFQSxVQUFBNzFFLEVBQUF2VixNQUFBLEVBQUEsU0FFQWYsSUFBQUMsS0FBQTRuRixjQUFBcHpFLEVBQUFvekUsWUFBQTVuRixLQUFBNG5GLGFBSUFqcUMsRUFBQWdxQyxRQUFBYixVQUFBendFLEdBRUE3QixFQUFBRSxJQUFBMkIsRUFFQTdCLENBRUEsRUNwRkEsTUFBQTIzRSxXQUFBekUsR0FPQSxXQUFBOWtGLENBQUEra0YsR0FFQXB3RSxNQUFBb3dFLEVBRUEsQ0FnQkEsSUFBQUssQ0FBQW9FLEVBQUEvRixFQUFBQyxFQUFBQyxHQUVBLE1BQUF2cUUsRUFBQSxJQUFBbW9DLEdBQ0Fub0MsRUFBQS9JLFdBQUFsVyxHQUVBLE1BQUFzcUYsRUFBQSxJQUFBMEUsR0FBQS9yRixLQUFBMm5GLFNBQ0FOLEVBQUFhLGVBQUFsb0YsS0FBQTRuRixhQUNBUCxFQUFBZSxRQUFBcG9GLEtBQUE0bEUsTUFFQSxJQUFBbWtCLEVBQUEsRUFFQSxTQUFBNEIsRUFBQTVxRixHQUVBc21GLEVBQUFXLEtBQUFvRSxFQUFBcnJGLElBQUEsU0FBQXlULEdBRUF3SCxFQUFBN0YsT0FBQXBWLEdBQUF5VCxFQUVBdTFFLElBRUEsSUFBQUEsSUFFQS90RSxFQUFBakcsYUFBQSxFQUVBc3dFLEdBQUFBLEVBQUFycUUsR0FJQSxRQUFBamMsRUFBQXdtRixFQUVBLENBRUEsSUFBQSxJQUFBeGxGLEVBQUEsRUFBQUEsRUFBQXFyRixFQUFBbnJGLFNBQUFGLEVBRUE0cUYsRUFBQTVxRixHQUlBLE9BQUFpYixDQUVBLEVDbEZBLE1BQUFxd0UsV0FBQTNFLEdBT0EsV0FBQTlrRixDQUFBK2tGLEdBRUFwd0UsTUFBQW93RSxFQUVBLENBY0EsSUFBQUssQ0FBQTN4RSxFQUFBZ3dFLEVBQUFDLEVBQUFDLEdBRUEsTUFBQTVvQyxFQUFBMzlDLEtBRUFnYyxFQUFBLElBQUErd0MsR0FFQXM2QixFQUFBLElBQUFzQixHQUFBM29GLEtBQUEybkYsU0FrR0EsT0FqR0FOLEVBQUFrRSxnQkFBQSxlQUNBbEUsRUFBQWlCLGlCQUFBdG9GLEtBQUErbkYsZUFDQVYsRUFBQWUsUUFBQXBvRixLQUFBNGxFLE1BQ0F5aEIsRUFBQWMsbUJBQUF4cUMsRUFBQWtxQyxpQkFDQVIsRUFBQVcsS0FBQTN4RSxHQUFBLFNBQUFuRyxHQUVBLElBQUFvOEUsRUFFQSxJQUVBQSxFQUFBM3VDLEVBQUFqbEMsTUFBQXhJLEVBRUEsQ0FBQSxNQUFBNm5CLEdBRUEsUUFBQWg0QixJQUFBd21GLEVBT0EsWUFEQTMvRSxRQUFBbXhCLE1BQUFBLEdBSkF3dUQsRUFBQXh1RCxFQVNBLE1BRUFoNEIsSUFBQXVzRixFQUFBOTNFLE1BRUF3SCxFQUFBeEgsTUFBQTgzRSxFQUFBOTNFLFdBRUF6VSxJQUFBdXNGLEVBQUEvMkUsT0FFQXlHLEVBQUF4SCxNQUFBdk4sTUFBQXFsRixFQUFBcmxGLE1BQ0ErVSxFQUFBeEgsTUFBQXROLE9BQUFvbEYsRUFBQXBsRixPQUNBOFUsRUFBQXhILE1BQUFlLEtBQUErMkUsRUFBQS8yRSxNQUlBeUcsRUFBQWhGLFdBQUFqWCxJQUFBdXNGLEVBQUF0MUUsTUFBQXMxRSxFQUFBdDFFLE1BQUEzZixHQUNBMmtCLEVBQUEvRSxXQUFBbFgsSUFBQXVzRixFQUFBcjFFLE1BQUFxMUUsRUFBQXIxRSxNQUFBNWYsR0FFQTJrQixFQUFBOUUsZUFBQW5YLElBQUF1c0YsRUFBQXAxRSxVQUFBbzFFLEVBQUFwMUUsVUFBQXRmLEdBQ0Fva0IsRUFBQTdFLGVBQUFwWCxJQUFBdXNGLEVBQUFuMUUsVUFBQW0xRSxFQUFBbjFFLFVBQUF2ZixHQUVBb2tCLEVBQUEzRSxnQkFBQXRYLElBQUF1c0YsRUFBQWoxRSxXQUFBaTFFLEVBQUFqMUUsV0FBQSxPQUVBdFgsSUFBQXVzRixFQUFBcjVFLGFBRUErSSxFQUFBL0ksV0FBQXE1RSxFQUFBcjVFLGlCQUlBbFQsSUFBQXVzRixFQUFBcjBFLFFBRUErRCxFQUFBL0QsTUFBQXEwRSxFQUFBcjBFLFlBSUFsWSxJQUFBdXNGLEVBQUFsMUUsU0FFQTRFLEVBQUE1RSxPQUFBazFFLEVBQUFsMUUsYUFJQXJYLElBQUF1c0YsRUFBQXpzRixPQUVBbWMsRUFBQW5jLEtBQUF5c0YsRUFBQXpzRixXQUlBRSxJQUFBdXNGLEVBQUE1MEUsVUFFQXNFLEVBQUF0RSxRQUFBNDBFLEVBQUE1MEUsUUFDQXNFLEVBQUE3RSxVQUFBcGYsSUFJQSxJQUFBdTBGLEVBQUFULGNBRUE3dkUsRUFBQTdFLFVBQUF2ZixTQUlBbUksSUFBQXVzRixFQUFBdjBFLGtCQUVBaUUsRUFBQWpFLGdCQUFBdTBFLEVBQUF2MEUsaUJBSUFpRSxFQUFBakcsYUFBQSxFQUVBc3dFLEdBQUFBLEVBQUFycUUsRUFBQXN3RSxFQUVBLEdBQUFoRyxFQUFBQyxHQUdBdnFFLENBRUEsRUM5SEEsTUFBQXV3RSxXQUFBN0UsR0FPQSxXQUFBOWtGLENBQUEra0YsR0FFQXB3RSxNQUFBb3dFLEVBRUEsQ0FjQSxJQUFBSyxDQUFBM3hFLEVBQUFnd0UsRUFBQUMsRUFBQUMsR0FFQSxNQUFBdnFFLEVBQUEsSUFBQXBGLEdBRUF5d0UsRUFBQSxJQUFBMEUsR0FBQS9yRixLQUFBMm5GLFNBaUJBLE9BaEJBTixFQUFBYSxlQUFBbG9GLEtBQUE0bkYsYUFDQVAsRUFBQWUsUUFBQXBvRixLQUFBNGxFLE1BRUF5aEIsRUFBQVcsS0FBQTN4RSxHQUFBLFNBQUE3QixHQUVBd0gsRUFBQXhILE1BQUFBLEVBQ0F3SCxFQUFBakcsYUFBQSxPQUVBaFcsSUFBQXNtRixHQUVBQSxFQUFBcnFFLEVBSUEsR0FBQXNxRSxFQUFBQyxHQUVBdnFFLENBRUEsRUMxREEsTUFBQXd3RSxXQUFBcjNELEdBUUEsV0FBQXZ5QixDQUFBeVAsRUFBQW82RSxFQUFBLEdBRUFsMUUsUUFTQXZYLEtBQUE2M0IsU0FBQSxFQUVBNzNCLEtBQUFILEtBQUEsUUFPQUcsS0FBQXFTLE1BQUEsSUFBQXkzQixHQUFBejNCLEdBUUFyUyxLQUFBeXNGLFVBQUFBLENBRUEsQ0FNQSxPQUFBeHpFLEdBSUEsQ0FFQSxJQUFBdlIsQ0FBQStQLEVBQUE2bEIsR0FPQSxPQUxBL2xCLE1BQUE3UCxLQUFBK1AsRUFBQTZsQixHQUVBdDlCLEtBQUFxUyxNQUFBM0ssS0FBQStQLEVBQUFwRixPQUNBclMsS0FBQXlzRixVQUFBaDFFLEVBQUFnMUUsVUFFQXpzRixJQUVBLENBRUEsTUFBQWdXLENBQUFDLEdBRUEsTUFBQVYsRUFBQWdDLE1BQUF2QixPQUFBQyxHQWVBLE9BYkFWLEVBQUF5USxPQUFBM1QsTUFBQXJTLEtBQUFxUyxNQUFBMjRCLFNBQ0F6MUIsRUFBQXlRLE9BQUF5bUUsVUFBQXpzRixLQUFBeXNGLGVBRUExc0YsSUFBQUMsS0FBQTBzRixjQUFBbjNFLEVBQUF5USxPQUFBMG1FLFlBQUExc0YsS0FBQTBzRixZQUFBMWhELGVBRUFqckMsSUFBQUMsS0FBQXMzQixXQUFBL2hCLEVBQUF5USxPQUFBc1IsU0FBQXQzQixLQUFBczNCLGVBQ0F2M0IsSUFBQUMsS0FBQXNKLFFBQUFpTSxFQUFBeVEsT0FBQTFjLE1BQUF0SixLQUFBc0osWUFDQXZKLElBQUFDLEtBQUEyc0YsUUFBQXAzRSxFQUFBeVEsT0FBQTJtRSxNQUFBM3NGLEtBQUEyc0YsWUFDQTVzRixJQUFBQyxLQUFBNHNGLFdBQUFyM0UsRUFBQXlRLE9BQUE0bUUsU0FBQTVzRixLQUFBNHNGLGVBRUE3c0YsSUFBQUMsS0FBQTZzRixTQUFBdDNFLEVBQUF5USxPQUFBNm1FLE9BQUE3c0YsS0FBQTZzRixPQUFBNzJFLGVBQ0FqVyxJQUFBQyxLQUFBWSxTQUFBMlUsRUFBQXlRLE9BQUFwbEIsT0FBQVosS0FBQVksT0FBQWdWLE1BRUFMLENBRUEsRUN6RUEsTUFBQXUzRSxXQUFBTixHQVNBLFdBQUE1cEYsQ0FBQW1xRixFQUFBTCxFQUFBRCxHQUVBbDFFLE1BQUF3MUUsRUFBQU4sR0FTQXpzRixLQUFBZ3RGLG1CQUFBLEVBRUFodEYsS0FBQUgsS0FBQSxrQkFFQUcsS0FBQXd4QixTQUFBOXBCLEtBQUF5dEIsR0FBQUcsWUFDQXQxQixLQUFBd1ksZUFPQXhZLEtBQUEwc0YsWUFBQSxJQUFBNWlELEdBQUE0aUQsRUFFQSxDQUVBLElBQUFobEYsQ0FBQStQLEVBQUE2bEIsR0FNQSxPQUpBL2xCLE1BQUE3UCxLQUFBK1AsRUFBQTZsQixHQUVBdDlCLEtBQUEwc0YsWUFBQWhsRixLQUFBK1AsRUFBQWkxRSxhQUVBMXNGLElBRUEsRUN2REEsTUFBQWl0RixHQUFBLElBQUF0L0QsR0FDQXUvRCxHQUFBLElBQUFsckUsR0FDQW1yRSxHQUFBLElBQUFuckUsR0FRQSxNQUFBb3JFLEdBT0EsV0FBQXhxRixDQUFBcWdCLEdBT0FqakIsS0FBQWlqQixPQUFBQSxFQVNBampCLEtBQUF5c0YsVUFBQSxFQVlBenNGLEtBQUFxdEYsS0FBQSxFQVdBcnRGLEtBQUFzdEYsV0FBQSxFQWdCQXR0RixLQUFBdWtCLE9BQUEsRUFRQXZrQixLQUFBdXRGLFlBQUEsRUFTQXZ0RixLQUFBd3RGLFFBQUEsSUFBQTFtRixHQUFBLElBQUEsS0FTQTlHLEtBQUE0NkIsSUFBQSxLQVVBNTZCLEtBQUF5dEYsUUFBQSxLQVFBenRGLEtBQUE0UCxPQUFBLElBQUErZCxHQVNBM3RCLEtBQUE4cUQsWUFBQSxFQVVBOXFELEtBQUErVixhQUFBLEVBRUEvVixLQUFBOHlELFNBQUEsSUFBQXBDLEdBQ0Exd0QsS0FBQTB0RixjQUFBLElBQUE1bUYsR0FBQSxFQUFBLEdBRUE5RyxLQUFBMnRGLGVBQUEsRUFFQTN0RixLQUFBNHRGLFdBQUEsQ0FFQSxJQUFBdjBFLEdBQUEsRUFBQSxFQUFBLEVBQUEsR0FJQSxDQVFBLGdCQUFBdzBFLEdBRUEsT0FBQTd0RixLQUFBMnRGLGNBRUEsQ0FPQSxVQUFBRyxHQUVBLE9BQUE5dEYsS0FBQTh5RCxRQUVBLENBT0EsY0FBQWk3QixDQUFBQyxHQUVBLE1BQUE5MEIsRUFBQWw1RCxLQUFBaWpCLE9BQ0FnckUsRUFBQWp1RixLQUFBNFAsT0FFQXM5RSxHQUFBbnlFLHNCQUFBaXpFLEVBQUEzcUUsYUFDQTYxQyxFQUFBMW5DLFNBQUE5cEIsS0FBQXdsRixJQUVBQyxHQUFBcHlFLHNCQUFBaXpFLEVBQUFwdEYsT0FBQXlpQixhQUNBNjFDLEVBQUFqdUMsT0FBQWtpRSxJQUNBajBCLEVBQUFqZ0Msb0JBRUFnMEQsR0FBQTNnRixpQkFBQTRzRCxFQUFBdm5ELGlCQUFBdW5ELEVBQUFoMkMsb0JBQ0FsakIsS0FBQTh5RCxTQUFBL0Isd0JBQUFrOEIsSUFFQWdCLEVBQUF0bkYsSUFDQSxHQUFBLEVBQUEsRUFBQSxHQUNBLEVBQUEsR0FBQSxFQUFBLEdBQ0EsRUFBQSxFQUFBLEdBQUEsR0FDQSxFQUFBLEVBQUEsRUFBQSxHQUdBc25GLEVBQUE5bEYsU0FBQThrRixHQUVBLENBUUEsV0FBQWlCLENBQUFDLEdBRUEsT0FBQW51RixLQUFBNHRGLFdBQUFPLEVBRUEsQ0FPQSxlQUFBQyxHQUVBLE9BQUFwdUYsS0FBQTB0RixhQUVBLENBTUEsT0FBQXowRSxHQUVBalosS0FBQTQ2QixLQUVBNTZCLEtBQUE0NkIsSUFBQTNoQixVQUlBalosS0FBQXl0RixTQUVBenRGLEtBQUF5dEYsUUFBQXgwRSxTQUlBLENBUUEsSUFBQXZSLENBQUErUCxHQVdBLE9BVEF6WCxLQUFBaWpCLE9BQUF4TCxFQUFBd0wsT0FBQXhiLFFBRUF6SCxLQUFBeXNGLFVBQUFoMUUsRUFBQWcxRSxVQUVBenNGLEtBQUFxdEYsS0FBQTUxRSxFQUFBNDFFLEtBQ0FydEYsS0FBQXVrQixPQUFBOU0sRUFBQThNLE9BRUF2a0IsS0FBQXd0RixRQUFBOWxGLEtBQUErUCxFQUFBKzFFLFNBRUF4dEYsSUFFQSxDQU9BLEtBQUF5SCxHQUVBLE9BQUEsSUFBQXpILEtBQUE0QyxhQUFBOEUsS0FBQTFILEtBRUEsQ0FRQSxNQUFBZ1csR0FFQSxNQUFBZ1EsRUFBQSxDQUFBLEVBV0EsT0FUQSxJQUFBaG1CLEtBQUF5c0YsWUFBQXptRSxFQUFBeW1FLFVBQUF6c0YsS0FBQXlzRixXQUNBLElBQUF6c0YsS0FBQXF0RixPQUFBcm5FLEVBQUFxbkUsS0FBQXJ0RixLQUFBcXRGLE1BQ0EsSUFBQXJ0RixLQUFBc3RGLGFBQUF0bkUsRUFBQXNuRSxXQUFBdHRGLEtBQUFzdEYsWUFDQSxJQUFBdHRGLEtBQUF1a0IsU0FBQXlCLEVBQUF6QixPQUFBdmtCLEtBQUF1a0IsUUFDQSxNQUFBdmtCLEtBQUF3dEYsUUFBQWhyRixHQUFBLE1BQUF4QyxLQUFBd3RGLFFBQUEvcUYsSUFBQXVqQixFQUFBd25FLFFBQUF4dEYsS0FBQXd0RixRQUFBL2lGLFdBRUF1YixFQUFBL0MsT0FBQWpqQixLQUFBaWpCLE9BQUFqTixRQUFBLEdBQUFnUSxjQUNBQSxFQUFBL0MsT0FBQXJULE9BRUFvVyxDQUVBLEVDelNBLE1BQUFxb0UsV0FBQWpCLEdBS0EsV0FBQXhxRixHQUVBMlUsTUFBQSxJQUFBMnBDLEdBQUEsR0FBQSxFQUFBLEdBQUEsTUFTQWxoRCxLQUFBc3VGLG1CQUFBLEVBU0F0dUYsS0FBQXVoRCxNQUFBLENBRUEsQ0FFQSxjQUFBd3NDLENBQUFDLEdBRUEsTUFBQS9xRSxFQUFBampCLEtBQUFpakIsT0FFQWsrQixFQUFBLEVBQUEzL0MsR0FBQXdzRixFQUFBMWtGLE1BQUF0SixLQUFBdWhELE1BQ0FILEVBQUFwaEQsS0FBQXd0RixRQUFBdm1GLE1BQUFqSCxLQUFBd3RGLFFBQUF0bUYsT0FDQXdyQixFQUFBczdELEVBQUExMkQsVUFBQXJVLEVBQUF5UCxJQUVBeXVCLElBQUFsK0IsRUFBQWsrQixLQUFBQyxJQUFBbitCLEVBQUFtK0IsUUFBQTF1QixJQUFBelAsRUFBQXlQLE1BRUF6UCxFQUFBaytCLElBQUFBLEVBQ0FsK0IsRUFBQW0rQixPQUFBQSxFQUNBbitCLEVBQUF5UCxJQUFBQSxFQUNBelAsRUFBQTArQiwwQkFJQXBxQyxNQUFBdzJFLGVBQUFDLEVBRUEsQ0FFQSxJQUFBdG1GLENBQUErUCxHQU1BLE9BSkFGLE1BQUE3UCxLQUFBK1AsR0FFQXpYLEtBQUF1aEQsTUFBQTlwQyxFQUFBOHBDLE1BRUF2aEQsSUFFQSxFQ3pDQSxNQUFBdXVGLFdBQUEvQixHQVlBLFdBQUE1cEYsQ0FBQXlQLEVBQUFvNkUsRUFBQW4xRCxFQUFBLEVBQUFodUIsRUFBQWhJLEtBQUFDLEdBQUEsRUFBQXFyRixFQUFBLEVBQUFELEVBQUEsR0FFQXAxRSxNQUFBbEYsRUFBQW82RSxHQVNBenNGLEtBQUF3dUYsYUFBQSxFQUVBeHVGLEtBQUFILEtBQUEsWUFFQUcsS0FBQXd4QixTQUFBOXBCLEtBQUF5dEIsR0FBQUcsWUFDQXQxQixLQUFBd1ksZUFjQXhZLEtBQUFZLE9BQUEsSUFBQXUwQixHQVFBbjFCLEtBQUFzM0IsU0FBQUEsRUFRQXQzQixLQUFBc0osTUFBQUEsRUFTQXRKLEtBQUE0c0YsU0FBQUEsRUFTQTVzRixLQUFBMnNGLE1BQUFBLEVBYUEzc0YsS0FBQTQ2QixJQUFBLEtBT0E1NkIsS0FBQTZzRixPQUFBLElBQUF3QixFQUVBLENBUUEsU0FBQUksR0FJQSxPQUFBenVGLEtBQUF5c0YsVUFBQW5yRixLQUFBQyxFQUVBLENBRUEsU0FBQWt0RixDQUFBQSxHQUdBenVGLEtBQUF5c0YsVUFBQWdDLEVBQUFudEYsS0FBQUMsRUFFQSxDQUVBLE9BQUEwWCxHQUVBalosS0FBQTZzRixPQUFBNXpFLFNBRUEsQ0FFQSxJQUFBdlIsQ0FBQStQLEVBQUE2bEIsR0FhQSxPQVhBL2xCLE1BQUE3UCxLQUFBK1AsRUFBQTZsQixHQUVBdDlCLEtBQUFzM0IsU0FBQTdmLEVBQUE2ZixTQUNBdDNCLEtBQUFzSixNQUFBbU8sRUFBQW5PLE1BQ0F0SixLQUFBNHNGLFNBQUFuMUUsRUFBQW0xRSxTQUNBNXNGLEtBQUEyc0YsTUFBQWwxRSxFQUFBazFFLE1BRUEzc0YsS0FBQVksT0FBQTZXLEVBQUE3VyxPQUFBNkcsUUFFQXpILEtBQUE2c0YsT0FBQXAxRSxFQUFBbzFFLE9BQUFwbEYsUUFFQXpILElBRUEsRUNqS0EsTUFBQTB1RixHQUFBLElBQUEvZ0UsR0FDQWdoRSxHQUFBLElBQUEzc0UsR0FDQTRzRSxHQUFBLElBQUE1c0UsR0FPQSxNQUFBNnNFLFdBQUF6QixHQUtBLFdBQUF4cUYsR0FFQTJVLE1BQUEsSUFBQTJwQyxHQUFBLEdBQUEsRUFBQSxHQUFBLE1BU0FsaEQsS0FBQTh1RixvQkFBQSxFQUVBOXVGLEtBQUEwdEYsY0FBQSxJQUFBNW1GLEdBQUEsRUFBQSxHQUVBOUcsS0FBQTJ0RixlQUFBLEVBRUEzdEYsS0FBQTR0RixXQUFBLENBZUEsSUFBQXYwRSxHQUFBLEVBQUEsRUFBQSxFQUFBLEdBRUEsSUFBQUEsR0FBQSxFQUFBLEVBQUEsRUFBQSxHQUVBLElBQUFBLEdBQUEsRUFBQSxFQUFBLEVBQUEsR0FFQSxJQUFBQSxHQUFBLEVBQUEsRUFBQSxFQUFBLEdBRUEsSUFBQUEsR0FBQSxFQUFBLEVBQUEsRUFBQSxHQUVBLElBQUFBLEdBQUEsRUFBQSxFQUFBLEVBQUEsSUFHQXJaLEtBQUErdUYsZ0JBQUEsQ0FDQSxJQUFBL3NFLEdBQUEsRUFBQSxFQUFBLEdBQUEsSUFBQUEsSUFBQSxFQUFBLEVBQUEsR0FBQSxJQUFBQSxHQUFBLEVBQUEsRUFBQSxHQUNBLElBQUFBLEdBQUEsRUFBQSxHQUFBLEdBQUEsSUFBQUEsR0FBQSxFQUFBLEVBQUEsR0FBQSxJQUFBQSxHQUFBLEdBQUEsRUFBQSxJQUdBaGlCLEtBQUFndkYsU0FBQSxDQUNBLElBQUFodEUsR0FBQSxFQUFBLEVBQUEsR0FBQSxJQUFBQSxHQUFBLEVBQUEsRUFBQSxHQUFBLElBQUFBLEdBQUEsRUFBQSxFQUFBLEdBQ0EsSUFBQUEsR0FBQSxFQUFBLEVBQUEsR0FBQSxJQUFBQSxHQUFBLEVBQUEsRUFBQSxHQUFBLElBQUFBLEdBQUEsRUFBQSxHQUFBLEdBR0EsQ0FRQSxjQUFBK3JFLENBQUFDLEVBQUFHLEVBQUEsR0FFQSxNQUFBbHJFLEVBQUFqakIsS0FBQWlqQixPQUNBZ3JFLEVBQUFqdUYsS0FBQTRQLE9BRUE4aUIsRUFBQXM3RCxFQUFBMTJELFVBQUFyVSxFQUFBeVAsSUFFQUEsSUFBQXpQLEVBQUF5UCxNQUVBelAsRUFBQXlQLElBQUFBLEVBQ0F6UCxFQUFBMCtCLDBCQUlBZ3RDLEdBQUE1ekUsc0JBQUFpekUsRUFBQTNxRSxhQUNBSixFQUFBdU8sU0FBQTlwQixLQUFBaW5GLElBRUFDLEdBQUFsbkYsS0FBQXViLEVBQUF1TyxVQUNBbzlELEdBQUFobkYsSUFBQTVILEtBQUErdUYsZ0JBQUFaLElBQ0FsckUsRUFBQTJNLEdBQUFsb0IsS0FBQTFILEtBQUFndkYsU0FBQWIsSUFDQWxyRSxFQUFBZ0ksT0FBQTJqRSxJQUNBM3JFLEVBQUFnVyxvQkFFQWcxRCxFQUFBdCtFLGlCQUFBZy9FLEdBQUFuc0YsR0FBQW1zRixHQUFBbHNGLEdBQUFrc0YsR0FBQXIxRSxHQUVBbzFFLEdBQUFwaUYsaUJBQUEyVyxFQUFBdFIsaUJBQUFzUixFQUFBQyxvQkFDQWxqQixLQUFBOHlELFNBQUEvQix3QkFBQTI5QixHQUVBLEVDOUZBLE1BQUFPLFdBQUF6QyxHQVVBLFdBQUE1cEYsQ0FBQXlQLEVBQUFvNkUsRUFBQW4xRCxFQUFBLEVBQUFxMUQsRUFBQSxHQUVBcDFFLE1BQUFsRixFQUFBbzZFLEdBU0F6c0YsS0FBQWt2RixjQUFBLEVBRUFsdkYsS0FBQUgsS0FBQSxhQVlBRyxLQUFBczNCLFNBQUFBLEVBU0F0M0IsS0FBQTJzRixNQUFBQSxFQU9BM3NGLEtBQUE2c0YsT0FBQSxJQUFBZ0MsRUFFQSxDQVFBLFNBQUFKLEdBSUEsT0FBQSxFQUFBenVGLEtBQUF5c0YsVUFBQW5yRixLQUFBQyxFQUVBLENBRUEsU0FBQWt0RixDQUFBQSxHQUdBenVGLEtBQUF5c0YsVUFBQWdDLEdBQUEsRUFBQW50RixLQUFBQyxHQUVBLENBRUEsT0FBQTBYLEdBRUFqWixLQUFBNnNGLE9BQUE1ekUsU0FFQSxDQUVBLElBQUF2UixDQUFBK1AsRUFBQTZsQixHQVNBLE9BUEEvbEIsTUFBQTdQLEtBQUErUCxFQUFBNmxCLEdBRUF0OUIsS0FBQXMzQixTQUFBN2YsRUFBQTZmLFNBQ0F0M0IsS0FBQTJzRixNQUFBbDFFLEVBQUFrMUUsTUFFQTNzRixLQUFBNnNGLE9BQUFwMUUsRUFBQW8xRSxPQUFBcGxGLFFBRUF6SCxJQUVBLEVDL0ZBLE1BQUFtdkYsV0FBQXJ1QyxHQVlBLFdBQUFsK0MsQ0FBQXl2QixHQUFBLEVBQUFDLEVBQUEsRUFBQUMsRUFBQSxFQUFBQyxHQUFBLEVBQUFDLEVBQUEsR0FBQUMsRUFBQSxLQUVBbmIsUUFTQXZYLEtBQUFvdkYsc0JBQUEsRUFFQXB2RixLQUFBSCxLQUFBLHFCQVFBRyxLQUFBc2hELEtBQUEsRUFTQXRoRCxLQUFBd2hELEtBQUEsS0FRQXhoRCxLQUFBcXlCLEtBQUFBLEVBUUFyeUIsS0FBQXN5QixNQUFBQSxFQVFBdHlCLEtBQUF1eUIsSUFBQUEsRUFRQXZ5QixLQUFBd3lCLE9BQUFBLEVBWUF4eUIsS0FBQXl5QixLQUFBQSxFQVNBenlCLEtBQUEweUIsSUFBQUEsRUFFQTF5QixLQUFBMmhELHdCQUVBLENBRUEsSUFBQWo2QyxDQUFBK1AsRUFBQTZsQixHQWNBLE9BWkEvbEIsTUFBQTdQLEtBQUErUCxFQUFBNmxCLEdBRUF0OUIsS0FBQXF5QixLQUFBNWEsRUFBQTRhLEtBQ0FyeUIsS0FBQXN5QixNQUFBN2EsRUFBQTZhLE1BQ0F0eUIsS0FBQXV5QixJQUFBOWEsRUFBQThhLElBQ0F2eUIsS0FBQXd5QixPQUFBL2EsRUFBQSthLE9BQ0F4eUIsS0FBQXl5QixLQUFBaGIsRUFBQWdiLEtBQ0F6eUIsS0FBQTB5QixJQUFBamIsRUFBQWliLElBRUExeUIsS0FBQXNoRCxLQUFBN3BDLEVBQUE2cEMsS0FDQXRoRCxLQUFBd2hELEtBQUEsT0FBQS9wQyxFQUFBK3BDLEtBQUEsS0FBQWp1QyxPQUFBQyxPQUFBLENBQUEsRUFBQWlFLEVBQUErcEMsTUFFQXhoRCxJQUVBLENBY0EsYUFBQXdpRCxDQUFBQyxFQUFBQyxFQUFBbGdELEVBQUFDLEVBQUF3RSxFQUFBQyxHQUVBLE9BQUFsSCxLQUFBd2hELE9BRUF4aEQsS0FBQXdoRCxLQUFBLENBQ0F2dkMsU0FBQSxFQUNBd3dDLFVBQUEsRUFDQUMsV0FBQSxFQUNBQyxRQUFBLEVBQ0FDLFFBQUEsRUFDQTM3QyxNQUFBLEVBQ0FDLE9BQUEsSUFLQWxILEtBQUF3aEQsS0FBQXZ2QyxTQUFBLEVBQ0FqUyxLQUFBd2hELEtBQUFpQixVQUFBQSxFQUNBemlELEtBQUF3aEQsS0FBQWtCLFdBQUFBLEVBQ0ExaUQsS0FBQXdoRCxLQUFBbUIsUUFBQW5nRCxFQUNBeEMsS0FBQXdoRCxLQUFBb0IsUUFBQW5nRCxFQUNBekMsS0FBQXdoRCxLQUFBdjZDLE1BQUFBLEVBQ0FqSCxLQUFBd2hELEtBQUF0NkMsT0FBQUEsRUFFQWxILEtBQUEyaEQsd0JBRUEsQ0FLQSxlQUFBa0IsR0FFQSxPQUFBN2lELEtBQUF3aEQsT0FFQXhoRCxLQUFBd2hELEtBQUF2dkMsU0FBQSxHQUlBalMsS0FBQTJoRCx3QkFFQSxDQU1BLHNCQUFBQSxHQUVBLE1BQUE3M0MsR0FBQTlKLEtBQUFzeUIsTUFBQXR5QixLQUFBcXlCLE9BQUEsRUFBQXJ5QixLQUFBc2hELE1BQ0F2M0MsR0FBQS9KLEtBQUF1eUIsSUFBQXZ5QixLQUFBd3lCLFNBQUEsRUFBQXh5QixLQUFBc2hELE1BQ0FueUMsR0FBQW5QLEtBQUFzeUIsTUFBQXR5QixLQUFBcXlCLE1BQUEsRUFDQWpqQixHQUFBcFAsS0FBQXV5QixJQUFBdnlCLEtBQUF3eUIsUUFBQSxFQUVBLElBQUFILEVBQUFsakIsRUFBQXJGLEVBQ0F3b0IsRUFBQW5qQixFQUFBckYsRUFDQXlvQixFQUFBbmpCLEVBQUFyRixFQUNBeW9CLEVBQUFwakIsRUFBQXJGLEVBRUEsR0FBQSxPQUFBL0osS0FBQXdoRCxNQUFBeGhELEtBQUF3aEQsS0FBQXZ2QyxRQUFBLENBRUEsTUFBQW85RSxHQUFBcnZGLEtBQUFzeUIsTUFBQXR5QixLQUFBcXlCLE1BQUFyeUIsS0FBQXdoRCxLQUFBaUIsVUFBQXppRCxLQUFBc2hELEtBQ0FndUMsR0FBQXR2RixLQUFBdXlCLElBQUF2eUIsS0FBQXd5QixRQUFBeHlCLEtBQUF3aEQsS0FBQWtCLFdBQUExaUQsS0FBQXNoRCxLQUVBanZCLEdBQUFnOUQsRUFBQXJ2RixLQUFBd2hELEtBQUFtQixRQUNBcndCLEVBQUFELEVBQUFnOUQsRUFBQXJ2RixLQUFBd2hELEtBQUF2NkMsTUFDQXNyQixHQUFBKzhELEVBQUF0dkYsS0FBQXdoRCxLQUFBb0IsUUFDQXB3QixFQUFBRCxFQUFBKzhELEVBQUF0dkYsS0FBQXdoRCxLQUFBdDZDLE1BRUEsQ0FFQWxILEtBQUEyUixpQkFBQWloQixpQkFBQVAsRUFBQUMsRUFBQUMsRUFBQUMsRUFBQXh5QixLQUFBeXlCLEtBQUF6eUIsS0FBQTB5QixJQUFBMXlCLEtBQUEyeUIsa0JBRUEzeUIsS0FBQW9qQix3QkFBQTFiLEtBQUExSCxLQUFBMlIsa0JBQUExRCxRQUVBLENBRUEsTUFBQStILENBQUFDLEdBRUEsTUFBQVYsRUFBQWdDLE1BQUF2QixPQUFBQyxHQVlBLE9BVkFWLEVBQUF5USxPQUFBczdCLEtBQUF0aEQsS0FBQXNoRCxLQUNBL3JDLEVBQUF5USxPQUFBcU0sS0FBQXJ5QixLQUFBcXlCLEtBQ0E5YyxFQUFBeVEsT0FBQXNNLE1BQUF0eUIsS0FBQXN5QixNQUNBL2MsRUFBQXlRLE9BQUF1TSxJQUFBdnlCLEtBQUF1eUIsSUFDQWhkLEVBQUF5USxPQUFBd00sT0FBQXh5QixLQUFBd3lCLE9BQ0FqZCxFQUFBeVEsT0FBQXlNLEtBQUF6eUIsS0FBQXl5QixLQUNBbGQsRUFBQXlRLE9BQUEwTSxJQUFBMXlCLEtBQUEweUIsSUFFQSxPQUFBMXlCLEtBQUF3aEQsT0FBQWpzQyxFQUFBeVEsT0FBQXc3QixLQUFBanVDLE9BQUFDLE9BQUEsQ0FBQSxFQUFBeFQsS0FBQXdoRCxPQUVBanNDLENBRUEsRUN4T0EsTUFBQWc2RSxXQUFBbkMsR0FLQSxXQUFBeHFGLEdBRUEyVSxNQUFBLElBQUE0M0UsSUFBQSxFQUFBLEVBQUEsR0FBQSxFQUFBLEdBQUEsTUFTQW52RixLQUFBd3ZGLDBCQUFBLENBRUEsRUNLQSxNQUFBQyxXQUFBakQsR0FRQSxXQUFBNXBGLENBQUF5UCxFQUFBbzZFLEdBRUFsMUUsTUFBQWxGLEVBQUFvNkUsR0FTQXpzRixLQUFBMHZGLG9CQUFBLEVBRUExdkYsS0FBQUgsS0FBQSxtQkFFQUcsS0FBQXd4QixTQUFBOXBCLEtBQUF5dEIsR0FBQUcsWUFDQXQxQixLQUFBd1ksZUFjQXhZLEtBQUFZLE9BQUEsSUFBQXUwQixHQU9BbjFCLEtBQUE2c0YsT0FBQSxJQUFBMEMsRUFFQSxDQUVBLE9BQUF0MkUsR0FFQWpaLEtBQUE2c0YsT0FBQTV6RSxTQUVBLENBRUEsSUFBQXZSLENBQUErUCxHQU9BLE9BTEFGLE1BQUE3UCxLQUFBK1AsR0FFQXpYLEtBQUFZLE9BQUE2VyxFQUFBN1csT0FBQTZHLFFBQ0F6SCxLQUFBNnNGLE9BQUFwMUUsRUFBQW8xRSxPQUFBcGxGLFFBRUF6SCxJQUVBLEVDakZBLE1BQUEydkYsV0FBQW5ELEdBUUEsV0FBQTVwRixDQUFBeVAsRUFBQW82RSxHQUVBbDFFLE1BQUFsRixFQUFBbzZFLEdBU0F6c0YsS0FBQTR2RixnQkFBQSxFQUVBNXZGLEtBQUFILEtBQUEsY0FFQSxFQ1ZBLE1BQUFnd0YsV0FBQXJELEdBVUEsV0FBQTVwRixDQUFBeVAsRUFBQW82RSxFQUFBeGxGLEVBQUEsR0FBQUMsRUFBQSxJQUVBcVEsTUFBQWxGLEVBQUFvNkUsR0FTQXpzRixLQUFBOHZGLGlCQUFBLEVBRUE5dkYsS0FBQUgsS0FBQSxnQkFRQUcsS0FBQWlILE1BQUFBLEVBUUFqSCxLQUFBa0gsT0FBQUEsQ0FFQSxDQVFBLFNBQUF1bkYsR0FHQSxPQUFBenVGLEtBQUF5c0YsVUFBQXpzRixLQUFBaUgsTUFBQWpILEtBQUFrSCxPQUFBNUYsS0FBQUMsRUFFQSxDQUVBLFNBQUFrdEYsQ0FBQUEsR0FHQXp1RixLQUFBeXNGLFVBQUFnQyxHQUFBenVGLEtBQUFpSCxNQUFBakgsS0FBQWtILE9BQUE1RixLQUFBQyxHQUVBLENBRUEsSUFBQW1HLENBQUErUCxHQU9BLE9BTEFGLE1BQUE3UCxLQUFBK1AsR0FFQXpYLEtBQUFpSCxNQUFBd1EsRUFBQXhRLE1BQ0FqSCxLQUFBa0gsT0FBQXVRLEVBQUF2USxPQUVBbEgsSUFFQSxDQUVBLE1BQUFnVyxDQUFBQyxHQUVBLE1BQUFWLEVBQUFnQyxNQUFBdkIsT0FBQUMsR0FLQSxPQUhBVixFQUFBeVEsT0FBQS9lLE1BQUFqSCxLQUFBaUgsTUFDQXNPLEVBQUF5USxPQUFBOWUsT0FBQWxILEtBQUFrSCxPQUVBcU8sQ0FFQSxFQ3JHQSxNQUFBdzZFLEdBS0EsV0FBQW50RixHQVNBNUMsS0FBQWd3Rix1QkFBQSxFQU9BaHdGLEtBQUFpd0YsYUFBQSxHQUVBLElBQUEsSUFBQWx2RixFQUFBLEVBQUFBLEVBQUEsRUFBQUEsSUFFQWYsS0FBQWl3RixhQUFBN3ZGLEtBQUEsSUFBQTRoQixHQUlBLENBU0EsR0FBQXJiLENBQUFzcEYsR0FFQSxJQUFBLElBQUFsdkYsRUFBQSxFQUFBQSxFQUFBLEVBQUFBLElBRUFmLEtBQUFpd0YsYUFBQWx2RixHQUFBMkcsS0FBQXVvRixFQUFBbHZGLElBSUEsT0FBQWYsSUFFQSxDQU9BLElBQUFrd0YsR0FFQSxJQUFBLElBQUFudkYsRUFBQSxFQUFBQSxFQUFBLEVBQUFBLElBRUFmLEtBQUFpd0YsYUFBQWx2RixHQUFBNEYsSUFBQSxFQUFBLEVBQUEsR0FJQSxPQUFBM0csSUFFQSxDQVNBLEtBQUFtd0YsQ0FBQWhzRSxFQUFBdmpCLEdBSUEsTUFBQTRCLEVBQUEyaEIsRUFBQTNoQixFQUFBQyxFQUFBMGhCLEVBQUExaEIsRUFBQTZXLEVBQUE2SyxFQUFBN0ssRUFFQTgyRSxFQUFBcHdGLEtBQUFpd0YsYUFpQkEsT0FkQXJ2RixFQUFBOEcsS0FBQTBvRixFQUFBLElBQUFob0YsZUFBQSxTQUdBeEgsRUFBQW1ILGdCQUFBcW9GLEVBQUEsR0FBQSxRQUFBM3RGLEdBQ0E3QixFQUFBbUgsZ0JBQUFxb0YsRUFBQSxHQUFBLFFBQUE5MkUsR0FDQTFZLEVBQUFtSCxnQkFBQXFvRixFQUFBLEdBQUEsUUFBQTV0RixHQUdBNUIsRUFBQW1ILGdCQUFBcW9GLEVBQUEsR0FBQTV0RixFQUFBQyxFQUFBLFVBQ0E3QixFQUFBbUgsZ0JBQUFxb0YsRUFBQSxHQUFBM3RGLEVBQUE2VyxFQUFBLFVBQ0ExWSxFQUFBbUgsZ0JBQUFxb0YsRUFBQSxHQUFBLFNBQUEsRUFBQTkyRSxFQUFBQSxFQUFBLElBQ0ExWSxFQUFBbUgsZ0JBQUFxb0YsRUFBQSxHQUFBNXRGLEVBQUE4VyxFQUFBLFVBQ0ExWSxFQUFBbUgsZ0JBQUFxb0YsRUFBQSxHQUFBLFNBQUE1dEYsRUFBQUEsRUFBQUMsRUFBQUEsSUFFQTdCLENBRUEsQ0FVQSxlQUFBeXZGLENBQUFsc0UsRUFBQXZqQixHQUlBLE1BQUE0QixFQUFBMmhCLEVBQUEzaEIsRUFBQUMsRUFBQTBoQixFQUFBMWhCLEVBQUE2VyxFQUFBNkssRUFBQTdLLEVBRUE4MkUsRUFBQXB3RixLQUFBaXdGLGFBaUJBLE9BZEFydkYsRUFBQThHLEtBQUEwb0YsRUFBQSxJQUFBaG9GLGVBQUEsU0FHQXhILEVBQUFtSCxnQkFBQXFvRixFQUFBLEdBQUEsU0FBQTN0RixHQUNBN0IsRUFBQW1ILGdCQUFBcW9GLEVBQUEsR0FBQSxTQUFBOTJFLEdBQ0ExWSxFQUFBbUgsZ0JBQUFxb0YsRUFBQSxHQUFBLFNBQUE1dEYsR0FHQTVCLEVBQUFtSCxnQkFBQXFvRixFQUFBLEdBQUEsUUFBQTV0RixFQUFBQyxHQUNBN0IsRUFBQW1ILGdCQUFBcW9GLEVBQUEsR0FBQSxRQUFBM3RGLEVBQUE2VyxHQUNBMVksRUFBQW1ILGdCQUFBcW9GLEVBQUEsR0FBQSxRQUFBOTJFLEVBQUFBLEVBQUEsU0FDQTFZLEVBQUFtSCxnQkFBQXFvRixFQUFBLEdBQUEsUUFBQTV0RixFQUFBOFcsR0FDQTFZLEVBQUFtSCxnQkFBQXFvRixFQUFBLEdBQUEsU0FBQTV0RixFQUFBQSxFQUFBQyxFQUFBQSxJQUVBN0IsQ0FFQSxDQVFBLEdBQUFnSCxDQUFBMG9GLEdBRUEsSUFBQSxJQUFBdnZGLEVBQUEsRUFBQUEsRUFBQSxFQUFBQSxJQUVBZixLQUFBaXdGLGFBQUFsdkYsR0FBQTZHLElBQUEwb0YsRUFBQUwsYUFBQWx2RixJQUlBLE9BQUFmLElBRUEsQ0FVQSxXQUFBdXdGLENBQUFELEVBQUF4ckYsR0FFQSxJQUFBLElBQUEvRCxFQUFBLEVBQUFBLEVBQUEsRUFBQUEsSUFFQWYsS0FBQWl3RixhQUFBbHZGLEdBQUFnSCxnQkFBQXVvRixFQUFBTCxhQUFBbHZGLEdBQUErRCxHQUlBLE9BQUE5RSxJQUVBLENBUUEsS0FBQXFQLENBQUF2SyxHQUVBLElBQUEsSUFBQS9ELEVBQUEsRUFBQUEsRUFBQSxFQUFBQSxJQUVBZixLQUFBaXdGLGFBQUFsdkYsR0FBQXFILGVBQUF0RCxHQUlBLE9BQUE5RSxJQUVBLENBVUEsSUFBQXVDLENBQUErdEYsRUFBQXBtRixHQUVBLElBQUEsSUFBQW5KLEVBQUEsRUFBQUEsRUFBQSxFQUFBQSxJQUVBZixLQUFBaXdGLGFBQUFsdkYsR0FBQXdCLEtBQUErdEYsRUFBQUwsYUFBQWx2RixHQUFBbUosR0FJQSxPQUFBbEssSUFFQSxDQVFBLE1BQUFzSyxDQUFBZ21GLEdBRUEsSUFBQSxJQUFBdnZGLEVBQUEsRUFBQUEsRUFBQSxFQUFBQSxJQUVBLElBQUFmLEtBQUFpd0YsYUFBQWx2RixHQUFBdUosT0FBQWdtRixFQUFBTCxhQUFBbHZGLElBRUEsT0FBQSxFQU1BLE9BQUEsQ0FFQSxDQVFBLElBQUEyRyxDQUFBNG9GLEdBRUEsT0FBQXR3RixLQUFBMkcsSUFBQTJwRixFQUFBTCxhQUVBLENBT0EsS0FBQXhvRixHQUVBLE9BQUEsSUFBQXpILEtBQUE0QyxhQUFBOEUsS0FBQTFILEtBRUEsQ0FTQSxTQUFBdUssQ0FBQTFKLEVBQUEySixFQUFBLEdBRUEsTUFBQXlsRixFQUFBandGLEtBQUFpd0YsYUFFQSxJQUFBLElBQUFsdkYsRUFBQSxFQUFBQSxFQUFBLEVBQUFBLElBRUFrdkYsRUFBQWx2RixHQUFBd0osVUFBQTFKLEVBQUEySixFQUFBLEVBQUF6SixHQUlBLE9BQUFmLElBRUEsQ0FVQSxPQUFBeUssQ0FBQTVKLEVBQUEsR0FBQTJKLEVBQUEsR0FFQSxNQUFBeWxGLEVBQUFqd0YsS0FBQWl3RixhQUVBLElBQUEsSUFBQWx2RixFQUFBLEVBQUFBLEVBQUEsRUFBQUEsSUFFQWt2RixFQUFBbHZGLEdBQUEwSixRQUFBNUosRUFBQTJKLEVBQUEsRUFBQXpKLEdBSUEsT0FBQUYsQ0FFQSxDQVFBLGlCQUFBMnZGLENBQUFyc0UsRUFBQXNzRSxHQUlBLE1BQUFqdUYsRUFBQTJoQixFQUFBM2hCLEVBQUFDLEVBQUEwaEIsRUFBQTFoQixFQUFBNlcsRUFBQTZLLEVBQUE3SyxFQUdBbTNFLEVBQUEsR0FBQSxRQUdBQSxFQUFBLEdBQUEsUUFBQWh1RixFQUNBZ3VGLEVBQUEsR0FBQSxRQUFBbjNFLEVBQ0FtM0UsRUFBQSxHQUFBLFFBQUFqdUYsRUFHQWl1RixFQUFBLEdBQUEsU0FBQWp1RixFQUFBQyxFQUNBZ3VGLEVBQUEsR0FBQSxTQUFBaHVGLEVBQUE2VyxFQUNBbTNFLEVBQUEsR0FBQSxTQUFBLEVBQUFuM0UsRUFBQUEsRUFBQSxHQUNBbTNFLEVBQUEsR0FBQSxTQUFBanVGLEVBQUE4VyxFQUNBbTNFLEVBQUEsR0FBQSxTQUFBanVGLEVBQUFBLEVBQUFDLEVBQUFBLEVBRUEsRUMxVEEsTUFBQWl1RixXQUFBbEUsR0FRQSxXQUFBNXBGLENBQUEwdEYsRUFBQSxJQUFBUCxHQUFBdEQsRUFBQSxHQUVBbDFFLFdBQUF4WCxFQUFBMHNGLEdBU0F6c0YsS0FBQTJ3RixjQUFBLEVBT0Ezd0YsS0FBQXN3RixHQUFBQSxDQUVBLENBRUEsSUFBQTVvRixDQUFBK1AsR0FNQSxPQUpBRixNQUFBN1AsS0FBQStQLEdBRUF6WCxLQUFBc3dGLEdBQUE1b0YsS0FBQStQLEVBQUE2NEUsSUFFQXR3RixJQUVBLENBUUEsUUFBQWcvQyxDQUFBME8sR0FLQSxPQUhBMXRELEtBQUF5c0YsVUFBQS8rQixFQUFBKytCLFVBQ0F6c0YsS0FBQXN3RixHQUFBL2xGLFVBQUFtakQsRUFBQTRpQyxJQUVBdHdGLElBRUEsQ0FFQSxNQUFBZ1csQ0FBQUMsR0FFQSxNQUFBVixFQUFBZ0MsTUFBQXZCLE9BQUFDLEdBSUEsT0FGQVYsRUFBQXlRLE9BQUFzcUUsR0FBQXR3RixLQUFBc3dGLEdBQUE3bEYsVUFFQThLLENBRUEsRUM1Q0EsTUFBQXE3RSxXQUFBbEosR0FPQSxXQUFBOWtGLENBQUEra0YsR0FFQXB3RSxNQUFBb3dFLEdBT0EzbkYsS0FBQTRZLFNBQUEsQ0FBQSxDQUVBLENBVUEsSUFBQW92RSxDQUFBM3hFLEVBQUFnd0UsRUFBQUMsRUFBQUMsR0FFQSxNQUFBNW9DLEVBQUEzOUMsS0FFQXFuRixFQUFBLElBQUFzQixHQUFBaHJDLEVBQUFncUMsU0FDQU4sRUFBQWUsUUFBQXpxQyxFQUFBaW9CLE1BQ0F5aEIsRUFBQWlCLGlCQUFBM3FDLEVBQUFvcUMsZUFDQVYsRUFBQWMsbUJBQUF4cUMsRUFBQWtxQyxpQkFDQVIsRUFBQVcsS0FBQTN4RSxHQUFBLFNBQUF3MEUsR0FFQSxJQUVBeEUsRUFBQTFvQyxFQUFBamxDLE1BQUFELEtBQUFDLE1BQUFteUUsSUFFQSxDQUFBLE1BQUFyaUYsR0FFQSs5RSxFQUVBQSxFQUFBLzlFLEdBSUE1QixRQUFBbXhCLE1BQUF2dkIsR0FJQW0xQyxFQUFBZ3FDLFFBQUFYLFVBQUEzd0UsRUFFQSxDQUVBLEdBQUFpd0UsRUFBQUMsRUFFQSxDQVFBLEtBQUE3dEUsQ0FBQWcxQyxHQUVBLE1BQUE5MEMsRUFBQTVZLEtBQUE0WSxTQUVBLFNBQUFpNEUsRUFBQXpnRixHQVFBLFlBTkFyUSxJQUFBNlksRUFBQXhJLElBRUF4SixRQUFBQyxLQUFBLDBDQUFBdUosR0FJQXdJLEVBQUF4SSxFQUVBLENBRUEsTUFBQTJzQixFQUFBLzhCLEtBQUE4d0YsdUJBQUFwakMsRUFBQTd0RCxNQXNHQSxRQXBHQUUsSUFBQTJ0RCxFQUFBOTNDLE9BQUFtbkIsRUFBQW5uQixLQUFBODNDLEVBQUE5M0MsV0FDQTdWLElBQUEydEQsRUFBQXQ5QyxPQUFBMnNCLEVBQUEzc0IsS0FBQXM5QyxFQUFBdDlDLFdBQ0FyUSxJQUFBMnRELEVBQUFyN0MsWUFBQXRTLElBQUFnOUIsRUFBQTFxQixPQUFBMHFCLEVBQUExcUIsTUFBQTAzQixPQUFBMmpCLEVBQUFyN0MsWUFDQXRTLElBQUEydEQsRUFBQXRlLFlBQUFyUyxFQUFBcVMsVUFBQXNlLEVBQUF0ZSxnQkFDQXJ2QyxJQUFBMnRELEVBQUFyZSxZQUFBdFMsRUFBQXNTLFVBQUFxZSxFQUFBcmUsZ0JBQ0F0dkMsSUFBQTJ0RCxFQUFBcGUsUUFBQXZTLEVBQUF1UyxNQUFBb2UsRUFBQXBlLFlBQ0F2dkMsSUFBQTJ0RCxFQUFBbmUsYUFBQXhTLEVBQUF3UyxZQUFBLElBQUF6RixJQUFBQyxPQUFBMmpCLEVBQUFuZSxrQkFDQXh2QyxJQUFBMnRELEVBQUFsZSxpQkFBQXpTLEVBQUF5UyxlQUFBa2UsRUFBQWxlLHFCQUNBenZDLElBQUEydEQsRUFBQWplLGVBQUExdkMsSUFBQWc5QixFQUFBMFMsVUFBQTFTLEVBQUEwUyxTQUFBMUYsT0FBQTJqQixFQUFBamUsZUFDQTF2QyxJQUFBMnRELEVBQUEvZCxlQUFBNXZDLElBQUFnOUIsRUFBQTRTLFVBQUE1UyxFQUFBNFMsU0FBQTVGLE9BQUEyakIsRUFBQS9kLGVBQ0E1dkMsSUFBQTJ0RCxFQUFBOWQsb0JBQUE3UyxFQUFBNlMsa0JBQUE4ZCxFQUFBOWQsd0JBQ0E3dkMsSUFBQTJ0RCxFQUFBN2Qsb0JBQUE5dkMsSUFBQWc5QixFQUFBOFMsZUFBQTlTLEVBQUE4UyxjQUFBOUYsT0FBQTJqQixFQUFBN2Qsb0JBQ0E5dkMsSUFBQTJ0RCxFQUFBNWQsWUFBQS9TLEVBQUErUyxVQUFBNGQsRUFBQTVkLGdCQUNBL3ZDLElBQUEydEQsRUFBQTNkLFlBQUFoVCxFQUFBZ1QsVUFBQTJkLEVBQUEzZCxnQkFDQWh3QyxJQUFBMnRELEVBQUExZCxxQkFBQWpULEVBQUFpVCxtQkFBQTBkLEVBQUExZCx5QkFDQWp3QyxJQUFBMnRELEVBQUFyZCxhQUFBdFQsRUFBQXNULFdBQUFxZCxFQUFBcmQsaUJBQ0F0d0MsSUFBQTJ0RCxFQUFBcGQsY0FBQXZULEVBQUF1VCxZQUFBb2QsRUFBQXBkLGtCQUNBdndDLElBQUEydEQsRUFBQW5kLGlCQUFBeFQsRUFBQXdULGVBQUFtZCxFQUFBbmQscUJBQ0F4d0MsSUFBQTJ0RCxFQUFBbGQsNEJBQUF6VCxFQUFBeVQsMEJBQUFrZCxFQUFBbGQsZ0NBQ0F6d0MsSUFBQTJ0RCxFQUFBbGIsZUFBQXpWLEVBQUF5VixhQUFBa2IsRUFBQWxiLG1CQUNBenlDLElBQUEydEQsRUFBQWhiLFlBQUEzVixFQUFBMlYsVUFBQWdiLEVBQUFoYixnQkFDQTN5QyxJQUFBMnRELEVBQUE5YSxzQkFBQTdWLEVBQUE2VixvQkFBQThhLEVBQUE5YSwwQkFDQTd5QyxJQUFBMnRELEVBQUE3YSx1QkFBQTl5QyxJQUFBZzlCLEVBQUE4VixrQkFBQTlWLEVBQUE4VixpQkFBQTlJLE9BQUEyakIsRUFBQTdhLHVCQUNBOXlDLElBQUEydEQsRUFBQXIyQyxhQUFBMGxCLEVBQUExbEIsV0FBQXEyQyxFQUFBcjJDLGlCQUNBdFgsSUFBQTJ0RCxFQUFBL2MscUJBQUE1VCxFQUFBNFQsbUJBQUErYyxFQUFBL2MseUJBQ0E1d0MsSUFBQTJ0RCxFQUFBbmEsTUFBQXhXLEVBQUF3VyxJQUFBbWEsRUFBQW5hLFVBQ0F4ekMsSUFBQTJ0RCxFQUFBcGEsY0FBQXZXLEVBQUF1VyxZQUFBb2EsRUFBQXBhLGtCQUNBdnpDLElBQUEydEQsRUFBQXJoQixXQUFBdFAsRUFBQXNQLFNBQUFxaEIsRUFBQXJoQixlQUNBdHNDLElBQUEydEQsRUFBQXhiLFVBQUFuVixFQUFBbVYsUUFBQXdiLEVBQUF4YixjQUNBbnlDLElBQUEydEQsRUFBQXBoQixPQUFBdlAsRUFBQXVQLEtBQUFvaEIsRUFBQXBoQixXQUNBdnNDLElBQUEydEQsRUFBQXpmLGFBQUFsUixFQUFBa1IsV0FBQXlmLEVBQUF6ZixpQkFDQWx1QyxJQUFBMnRELEVBQUFsaEIsVUFBQXpQLEVBQUF5UCxRQUFBa2hCLEVBQUFsaEIsY0FDQXpzQyxJQUFBMnRELEVBQUFqaEIsY0FBQTFQLEVBQUEwUCxZQUFBaWhCLEVBQUFqaEIsa0JBQ0Exc0MsSUFBQTJ0RCxFQUFBNWUsWUFBQS9SLEVBQUErUixVQUFBNGUsRUFBQTVlLGdCQUNBL3VDLElBQUEydEQsRUFBQWhoQixZQUFBM1AsRUFBQTJQLFVBQUFnaEIsRUFBQWhoQixnQkFDQTNzQyxJQUFBMnRELEVBQUF2Z0IsWUFBQXBRLEVBQUFvUSxVQUFBdWdCLEVBQUF2Z0IsZ0JBQ0FwdEMsSUFBQTJ0RCxFQUFBdGdCLFlBQUFyUSxFQUFBcVEsVUFBQXNnQixFQUFBdGdCLGdCQUNBcnRDLElBQUEydEQsRUFBQXJnQixhQUFBdFEsRUFBQXNRLFdBQUFxZ0IsRUFBQXJnQixpQkFDQXR0QyxJQUFBMnRELEVBQUF4ZixhQUFBblIsRUFBQW1SLFdBQUF3ZixFQUFBeGYsaUJBQ0FudUMsSUFBQTJ0RCxFQUFBL2dCLFdBQUE1UCxFQUFBNFAsU0FBQStnQixFQUFBL2dCLGVBQ0E1c0MsSUFBQTJ0RCxFQUFBOWdCLFdBQUE3UCxFQUFBNlAsU0FBQThnQixFQUFBOWdCLGVBQ0E3c0MsSUFBQTJ0RCxFQUFBN2dCLGdCQUFBOVAsRUFBQThQLGNBQUE2Z0IsRUFBQTdnQixvQkFDQTlzQyxJQUFBMnRELEVBQUE1Z0IsZ0JBQUEvUCxFQUFBK1AsY0FBQTRnQixFQUFBNWdCLG9CQUNBL3NDLElBQUEydEQsRUFBQTNnQixnQkFBQWhRLEVBQUFnUSxjQUFBMmdCLEVBQUEzZ0Isb0JBQ0FodEMsSUFBQTJ0RCxFQUFBMWdCLHFCQUFBalEsRUFBQWlRLG1CQUFBMGdCLEVBQUExZ0IseUJBQ0FqdEMsSUFBQTJ0RCxFQUFBemdCLGlCQUFBbHRDLElBQUFnOUIsRUFBQWtRLFlBQUFsUSxFQUFBa1EsV0FBQWxELE9BQUEyakIsRUFBQXpnQixpQkFDQWx0QyxJQUFBMnRELEVBQUF4Z0IsYUFBQW5RLEVBQUFtUSxXQUFBd2dCLEVBQUF4Z0IsaUJBQ0FudEMsSUFBQTJ0RCxFQUFBcGdCLG1CQUFBdlEsRUFBQXVRLGlCQUFBb2dCLEVBQUFwZ0IsdUJBQ0F2dEMsSUFBQTJ0RCxFQUFBbmdCLGNBQUF4USxFQUFBd1EsWUFBQW1nQixFQUFBbmdCLGtCQUNBeHRDLElBQUEydEQsRUFBQWxnQixhQUFBelEsRUFBQXlRLFdBQUFrZ0IsRUFBQWxnQixpQkFDQXp0QyxJQUFBMnRELEVBQUFqZ0Isa0JBQUExUSxFQUFBMFEsZ0JBQUFpZ0IsRUFBQWpnQixzQkFDQTF0QyxJQUFBMnRELEVBQUFoZ0IsY0FBQTNRLEVBQUEyUSxZQUFBZ2dCLEVBQUFoZ0Isa0JBQ0EzdEMsSUFBQTJ0RCxFQUFBL2YsZUFBQTVRLEVBQUE0USxhQUFBK2YsRUFBQS9mLG1CQUNBNXRDLElBQUEydEQsRUFBQTlmLGVBQUE3USxFQUFBNlEsYUFBQThmLEVBQUE5ZixtQkFDQTd0QyxJQUFBMnRELEVBQUE3ZixlQUFBOVEsRUFBQThRLGFBQUE2ZixFQUFBN2YsbUJBRUE5dEMsSUFBQTJ0RCxFQUFBeGEsWUFBQW5XLEVBQUFtVyxVQUFBd2EsRUFBQXhhLGdCQUNBbnpDLElBQUEydEQsRUFBQXZhLHFCQUFBcFcsRUFBQW9XLG1CQUFBdWEsRUFBQXZhLHlCQUNBcHpDLElBQUEydEQsRUFBQXRhLG1CQUFBclcsRUFBQXFXLGlCQUFBc2EsRUFBQXRhLHVCQUNBcnpDLElBQUEydEQsRUFBQXJhLG9CQUFBdFcsRUFBQXNXLGtCQUFBcWEsRUFBQXJhLHdCQUVBdHpDLElBQUEydEQsRUFBQXgrQyxXQUFBNnRCLEVBQUE3dEIsU0FBQXcrQyxFQUFBeCtDLGVBRUFuUCxJQUFBMnRELEVBQUEzYSxZQUFBaFcsRUFBQWdXLFVBQUEyYSxFQUFBM2EsZ0JBQ0FoekMsSUFBQTJ0RCxFQUFBMWEsV0FBQWpXLEVBQUFpVyxTQUFBMGEsRUFBQTFhLGVBQ0FqekMsSUFBQTJ0RCxFQUFBemEsVUFBQWxXLEVBQUFrVyxRQUFBeWEsRUFBQXphLGNBQ0FsekMsSUFBQTJ0RCxFQUFBcitDLFFBQUEwdEIsRUFBQTF0QixNQUFBcStDLEVBQUFyK0MsWUFFQXRQLElBQUEydEQsRUFBQXRmLGdCQUFBclIsRUFBQXFSLGNBQUFzZixFQUFBdGYsb0JBQ0FydUMsSUFBQTJ0RCxFQUFBcmYsc0JBQUF0UixFQUFBc1Isb0JBQUFxZixFQUFBcmYsMEJBQ0F0dUMsSUFBQTJ0RCxFQUFBcGYscUJBQUF2UixFQUFBdVIsbUJBQUFvZixFQUFBcGYseUJBRUF2dUMsSUFBQTJ0RCxFQUFBbmYsWUFBQXhSLEVBQUF3UixVQUFBbWYsRUFBQW5mLGdCQUVBeHVDLElBQUEydEQsRUFBQWxmLGtCQUFBelIsRUFBQXlSLGdCQUFBa2YsRUFBQWxmLHNCQUNBenVDLElBQUEydEQsRUFBQWpmLHFCQUFBMVIsRUFBQTBSLG1CQUFBaWYsRUFBQWpmLHlCQUNBMXVDLElBQUEydEQsRUFBQWhmLGtCQUFBM1IsRUFBQTJSLGdCQUFBZ2YsRUFBQWhmLHNCQUVBM3VDLElBQUEydEQsRUFBQTEzQixVQUFBK0csRUFBQS9HLFFBQUEwM0IsRUFBQTEzQixjQUVBajJCLElBQUEydEQsRUFBQTllLGFBQUE3UixFQUFBNlIsV0FBQThlLEVBQUE5ZSxpQkFFQTd1QyxJQUFBMnRELEVBQUF2MUMsV0FBQTRrQixFQUFBNWtCLFNBQUF1MUMsRUFBQXYxQyxlQUVBcFksSUFBQTJ0RCxFQUFBbmhCLGVBRUEsaUJBQUFtaEIsRUFBQW5oQixhQUVBeFAsRUFBQXdQLGFBQUFtaEIsRUFBQW5oQixhQUFBLEVBSUF4UCxFQUFBd1AsYUFBQW1oQixFQUFBbmhCLG1CQVFBeHNDLElBQUEydEQsRUFBQXRPLFNBRUEsSUFBQSxNQUFBaHZDLEtBQUFzOUMsRUFBQXRPLFNBQUEsQ0FFQSxNQUFBMnhDLEVBQUFyakMsRUFBQXRPLFNBQUFodkMsR0FJQSxPQUZBMnNCLEVBQUFxaUIsU0FBQWh2QyxHQUFBLENBQUEsRUFFQTJnRixFQUFBbHhGLE1BRUEsSUFBQSxJQUNBazlCLEVBQUFxaUIsU0FBQWh2QyxHQUFBbk8sTUFBQTR1RixFQUFBRSxFQUFBOXVGLE9BQ0EsTUFFQSxJQUFBLElBQ0E4NkIsRUFBQXFpQixTQUFBaHZDLEdBQUFuTyxPQUFBLElBQUE2bkMsSUFBQUMsT0FBQWduRCxFQUFBOXVGLE9BQ0EsTUFFQSxJQUFBLEtBQ0E4NkIsRUFBQXFpQixTQUFBaHZDLEdBQUFuTyxPQUFBLElBQUE2RSxJQUFBeUQsVUFBQXdtRixFQUFBOXVGLE9BQ0EsTUFFQSxJQUFBLEtBQ0E4NkIsRUFBQXFpQixTQUFBaHZDLEdBQUFuTyxPQUFBLElBQUErZixJQUFBelgsVUFBQXdtRixFQUFBOXVGLE9BQ0EsTUFFQSxJQUFBLEtBQ0E4NkIsRUFBQXFpQixTQUFBaHZDLEdBQUFuTyxPQUFBLElBQUFvWCxJQUFBOU8sVUFBQXdtRixFQUFBOXVGLE9BQ0EsTUFFQSxJQUFBLEtBQ0E4NkIsRUFBQXFpQixTQUFBaHZDLEdBQUFuTyxPQUFBLElBQUFpSixJQUFBWCxVQUFBd21GLEVBQUE5dUYsT0FDQSxNQUVBLElBQUEsS0FDQTg2QixFQUFBcWlCLFNBQUFodkMsR0FBQW5PLE9BQUEsSUFBQTByQixJQUFBcGpCLFVBQUF3bUYsRUFBQTl1RixPQUNBLE1BRUEsUUFDQTg2QixFQUFBcWlCLFNBQUFodkMsR0FBQW5PLE1BQUE4dUYsRUFBQTl1RixNQUlBLENBU0EsUUFMQWxDLElBQUEydEQsRUFBQTFOLFVBQUFqakIsRUFBQWlqQixRQUFBME4sRUFBQTFOLGNBQ0FqZ0QsSUFBQTJ0RCxFQUFBeE4sZUFBQW5qQixFQUFBbWpCLGFBQUF3TixFQUFBeE4sbUJBQ0FuZ0QsSUFBQTJ0RCxFQUFBdk4saUJBQUFwakIsRUFBQW9qQixlQUFBdU4sRUFBQXZOLHFCQUNBcGdELElBQUEydEQsRUFBQTlNLGNBQUE3akIsRUFBQTZqQixZQUFBOE0sRUFBQTlNLGtCQUVBN2dELElBQUEydEQsRUFBQXBOLFdBRUEsSUFBQSxNQUFBampCLEtBQUFxd0IsRUFBQXBOLFdBRUF2akIsRUFBQXVqQixXQUFBampCLEdBQUFxd0IsRUFBQXBOLFdBQUFqakIsR0EwQkEsUUFwQkF0OUIsSUFBQTJ0RCxFQUFBdE4sU0FBQXJqQixFQUFBcWpCLE9BQUFzTixFQUFBdE4sYUFDQXJnRCxJQUFBMnRELEVBQUFyTixXQUFBdGpCLEVBQUFzakIsU0FBQXFOLEVBQUFyTixlQUlBdGdELElBQUEydEQsRUFBQTduQyxPQUFBa1gsRUFBQWxYLEtBQUE2bkMsRUFBQTduQyxXQUNBOWxCLElBQUEydEQsRUFBQTVhLGtCQUFBL1YsRUFBQStWLGdCQUFBNGEsRUFBQTVhLHNCQUlBL3lDLElBQUEydEQsRUFBQTl5QixNQUFBbUMsRUFBQW5DLElBQUFpMkQsRUFBQW5qQyxFQUFBOXlCLFdBQ0E3NkIsSUFBQTJ0RCxFQUFBN2MsU0FBQTlULEVBQUE4VCxPQUFBZ2dELEVBQUFuakMsRUFBQTdjLGNBRUE5d0MsSUFBQTJ0RCxFQUFBNWMsV0FBQS9ULEVBQUErVCxTQUFBKy9DLEVBQUFuakMsRUFBQTVjLGdCQUVBL3dDLElBQUEydEQsRUFBQXZjLFVBQUFwVSxFQUFBb1UsUUFBQTAvQyxFQUFBbmpDLEVBQUF2YyxlQUNBcHhDLElBQUEydEQsRUFBQXRjLFlBQUFyVSxFQUFBcVUsVUFBQXNjLEVBQUF0YyxnQkFFQXJ4QyxJQUFBMnRELEVBQUFyYyxZQUFBdFUsRUFBQXNVLFVBQUF3L0MsRUFBQW5qQyxFQUFBcmMsaUJBQ0F0eEMsSUFBQTJ0RCxFQUFBcGMsZ0JBQUF2VSxFQUFBdVUsY0FBQW9jLEVBQUFwYyxvQkFDQXZ4QyxJQUFBMnRELEVBQUFuYyxZQUFBLENBRUEsSUFBQUEsRUFBQW1jLEVBQUFuYyxhQUVBLElBQUFqN0IsTUFBQUMsUUFBQWc3QixLQUlBQSxFQUFBLENBQUFBLEVBQUFBLElBSUF4VSxFQUFBd1UsYUFBQSxJQUFBenFDLElBQUF5RCxVQUFBZ25DLEVBRUEsQ0ErQ0EsWUE3Q0F4eEMsSUFBQTJ0RCxFQUFBbGMsa0JBQUF6VSxFQUFBeVUsZ0JBQUFxL0MsRUFBQW5qQyxFQUFBbGMsdUJBQ0F6eEMsSUFBQTJ0RCxFQUFBamMsb0JBQUExVSxFQUFBMFUsa0JBQUFpYyxFQUFBamMsd0JBQ0ExeEMsSUFBQTJ0RCxFQUFBaGMsbUJBQUEzVSxFQUFBMlUsaUJBQUFnYyxFQUFBaGMsdUJBRUEzeEMsSUFBQTJ0RCxFQUFBL2IsZUFBQTVVLEVBQUE0VSxhQUFBay9DLEVBQUFuakMsRUFBQS9iLG9CQUNBNXhDLElBQUEydEQsRUFBQTliLGVBQUE3VSxFQUFBNlUsYUFBQWkvQyxFQUFBbmpDLEVBQUE5YixvQkFFQTd4QyxJQUFBMnRELEVBQUE3YixjQUFBOVUsRUFBQThVLFlBQUFnL0MsRUFBQW5qQyxFQUFBN2IsbUJBQ0E5eEMsSUFBQTJ0RCxFQUFBaGUsb0JBQUEzUyxFQUFBMlMsa0JBQUFnZSxFQUFBaGUsd0JBRUEzdkMsSUFBQTJ0RCxFQUFBNWIsY0FBQS9VLEVBQUErVSxZQUFBKytDLEVBQUFuakMsRUFBQTViLG1CQUNBL3hDLElBQUEydEQsRUFBQTNiLHVCQUFBaFYsRUFBQWdWLHFCQUFBOCtDLEVBQUFuakMsRUFBQTNiLDRCQUNBaHlDLElBQUEydEQsRUFBQTFiLG1CQUFBalYsRUFBQWlWLGlCQUFBNitDLEVBQUFuakMsRUFBQTFiLHdCQUVBanlDLElBQUEydEQsRUFBQXpiLFNBQUFsVixFQUFBa1YsT0FBQTQrQyxFQUFBbmpDLEVBQUF6YixjQUNBbHlDLElBQUEydEQsRUFBQXZiLGdCQUFBcFYsRUFBQW9WLGVBQUE1bkMsVUFBQW1qRCxFQUFBdmIscUJBQ0FweUMsSUFBQTJ0RCxFQUFBdGIsa0JBQUFyVixFQUFBcVYsZ0JBQUFzYixFQUFBdGIsc0JBRUFyeUMsSUFBQTJ0RCxFQUFBcmIsZUFBQXRWLEVBQUFzVixhQUFBcWIsRUFBQXJiLG1CQUNBdHlDLElBQUEydEQsRUFBQXBiLGtCQUFBdlYsRUFBQXVWLGdCQUFBb2IsRUFBQXBiLHNCQUVBdnlDLElBQUEydEQsRUFBQTNjLFdBQUFoVSxFQUFBZ1UsU0FBQTgvQyxFQUFBbmpDLEVBQUEzYyxnQkFDQWh4QyxJQUFBMnRELEVBQUExYyxvQkFBQWpVLEVBQUFpVSxrQkFBQTBjLEVBQUExYyx3QkFFQWp4QyxJQUFBMnRELEVBQUF6YyxRQUFBbFUsRUFBQWtVLE1BQUE0L0MsRUFBQW5qQyxFQUFBemMsYUFDQWx4QyxJQUFBMnRELEVBQUF4YyxpQkFBQW5VLEVBQUFtVSxlQUFBd2MsRUFBQXhjLHFCQUVBbnhDLElBQUEydEQsRUFBQW5iLGNBQUF4VixFQUFBd1YsWUFBQXMrQyxFQUFBbmpDLEVBQUFuYixtQkFFQXh5QyxJQUFBMnRELEVBQUF6ZCxlQUFBbFQsRUFBQWtULGFBQUE0Z0QsRUFBQW5qQyxFQUFBemQsb0JBQ0Fsd0MsSUFBQTJ0RCxFQUFBeGQsd0JBQUFuVCxFQUFBbVQsc0JBQUEyZ0QsRUFBQW5qQyxFQUFBeGQsNkJBQ0Fud0MsSUFBQTJ0RCxFQUFBdmQscUJBQUFwVCxFQUFBb1QsbUJBQUEwZ0QsRUFBQW5qQyxFQUFBdmQsMEJBQ0Fwd0MsSUFBQTJ0RCxFQUFBdGQsdUJBQUFyVCxFQUFBcVQsc0JBQUEsSUFBQXRwQyxJQUFBeUQsVUFBQW1qRCxFQUFBdGQsNEJBRUFyd0MsSUFBQTJ0RCxFQUFBamQsaUJBQUExVCxFQUFBMFQsZUFBQW9nRCxFQUFBbmpDLEVBQUFqZCxzQkFDQTF3QyxJQUFBMnRELEVBQUFoZCwwQkFBQTNULEVBQUEyVCx3QkFBQW1nRCxFQUFBbmpDLEVBQUFoZCwrQkFFQTN3QyxJQUFBMnRELEVBQUFqYixrQkFBQTFWLEVBQUEwVixnQkFBQW8rQyxFQUFBbmpDLEVBQUFqYix1QkFDQTF5QyxJQUFBMnRELEVBQUEvYSxlQUFBNVYsRUFBQTRWLGFBQUFrK0MsRUFBQW5qQyxFQUFBL2Esb0JBRUE1eUMsSUFBQTJ0RCxFQUFBOWMsZ0JBQUE3VCxFQUFBNlQsY0FBQWlnRCxFQUFBbmpDLEVBQUE5YyxxQkFFQTd3QyxJQUFBMnRELEVBQUFnc0IsZ0JBQUEzOEMsRUFBQTI4QyxjQUFBbVgsRUFBQW5qQyxFQUFBZ3NCLHFCQUNBMzVFLElBQUEydEQsRUFBQWlzQixvQkFBQTU4QyxFQUFBNDhDLGtCQUFBa1gsRUFBQW5qQyxFQUFBaXNCLG9CQUVBNThDLENBRUEsQ0FTQSxXQUFBaTBELENBQUEvdUYsR0FHQSxPQURBakMsS0FBQTRZLFNBQUEzVyxFQUNBakMsSUFFQSxDQVFBLHNCQUFBOHdGLENBQUFqeEYsR0FFQSxPQUFBK3dGLEdBQUFFLHVCQUFBanhGLEVBRUEsQ0FTQSw2QkFBQWl4RixDQUFBanhGLEdBdUJBLE9BQUEsR0FyQkEsQ0FDQWk1RSxrQkFDQTN2QixrQkFDQTZ2QixxQkFDQWw1QixrQkFDQSthLGtCQUNBd2Usd0JBQ0FILHdCQUNBZ0IscUJBQ0FFLG9CQUNBRyxzQkFDQUUsdUJBQ0FFLHFCQUNBRyx3QkFDQW5uQyxxQkFDQXFuQyxzQkFDQUcsc0JBQ0EvaEIscUJBQ0FqdEIsYUFHQXRzQyxFQUVBLEVDN2FBLE1BQUFveEYsR0FRQSxxQkFBQUMsQ0FBQTc2RSxHQUVBLE1BQUE3VixFQUFBNlYsRUFBQTg2RSxZQUFBLEtBRUEsT0FBQSxJQUFBM3dGLEVBQUEsS0FFQTZWLEVBQUF2VixNQUFBLEVBQUFOLEVBQUEsRUFFQSxDQVdBLGlCQUFBeW1GLENBQUE1d0UsRUFBQXV2RCxHQUdBLE1BQUEsaUJBQUF2dkQsR0FBQSxLQUFBQSxFQUFBLElBR0EsZ0JBQUE1QixLQUFBbXhELElBQUEsTUFBQW54RCxLQUFBNEIsS0FFQXV2RCxFQUFBQSxFQUFBd3JCLFFBQUEsMEJBQUEsT0FLQSxtQkFBQTM4RSxLQUFBNEIsSUFHQSxnQkFBQTVCLEtBQUE0QixJQUdBLGFBQUE1QixLQUFBNEIsR0FOQUEsRUFTQXV2RCxFQUFBdnZELEVBRUEsRUNqREEsTUFBQWc3RSxXQUFBaDZDLEdBS0EsV0FBQXowQyxHQUVBMlUsUUFTQXZYLEtBQUFzeEYsMkJBQUEsRUFFQXR4RixLQUFBSCxLQUFBLDBCQVFBRyxLQUFBMjBELGNBQUF4dkMsR0FFQSxDQUVBLElBQUF6ZCxDQUFBK1AsR0FNQSxPQUpBRixNQUFBN1AsS0FBQStQLEdBRUF6WCxLQUFBMjBELGNBQUFsOUMsRUFBQWs5QyxjQUVBMzBELElBRUEsQ0FFQSxNQUFBZ1csR0FFQSxNQUFBVCxFQUFBZ0MsTUFBQXZCLFNBTUEsT0FKQVQsRUFBQW8vQyxjQUFBMzBELEtBQUEyMEQsY0FFQXAvQyxFQUFBKzdFLDJCQUFBLEVBRUEvN0UsQ0FFQSxFQzVCQSxNQUFBZzhFLFdBQUE3SixHQU9BLFdBQUE5a0YsQ0FBQStrRixHQUVBcHdFLE1BQUFvd0UsRUFFQSxDQVVBLElBQUFLLENBQUEzeEUsRUFBQWd3RSxFQUFBQyxFQUFBQyxHQUVBLE1BQUE1b0MsRUFBQTM5QyxLQUVBcW5GLEVBQUEsSUFBQXNCLEdBQUFockMsRUFBQWdxQyxTQUNBTixFQUFBZSxRQUFBenFDLEVBQUFpb0IsTUFDQXloQixFQUFBaUIsaUJBQUEzcUMsRUFBQW9xQyxlQUNBVixFQUFBYyxtQkFBQXhxQyxFQUFBa3FDLGlCQUNBUixFQUFBVyxLQUFBM3hFLEdBQUEsU0FBQXcwRSxHQUVBLElBRUF4RSxFQUFBMW9DLEVBQUFqbEMsTUFBQUQsS0FBQUMsTUFBQW15RSxJQUVBLENBQUEsTUFBQXJpRixHQUVBKzlFLEVBRUFBLEVBQUEvOUUsR0FJQTVCLFFBQUFteEIsTUFBQXZ2QixHQUlBbTFDLEVBQUFncUMsUUFBQVgsVUFBQTN3RSxFQUVBLENBRUEsR0FBQWl3RSxFQUFBQyxFQUVBLENBUUEsS0FBQTd0RSxDQUFBZzFDLEdBRUEsTUFBQThqQyxFQUFBLENBQUEsRUFDQUMsRUFBQSxDQUFBLEVBRUEsU0FBQUMsRUFBQWhrQyxFQUFBOTNDLEdBRUEsUUFBQTdWLElBQUF5eEYsRUFBQTU3RSxHQUFBLE9BQUE0N0UsRUFBQTU3RSxHQUVBLE1BQ0FnekMsRUFEQThFLEVBQUF4RSxtQkFDQXR6QyxHQUVBMUYsRUFZQSxTQUFBdzlDLEVBQUE5M0MsR0FFQSxRQUFBN1YsSUFBQTB4RixFQUFBNzdFLEdBQUEsT0FBQTY3RSxFQUFBNzdFLEdBRUEsTUFBQWl6QyxFQUFBNkUsRUFBQTdFLGFBQ0E4aEMsRUFBQTloQyxFQUFBanpDLEdBRUE4a0MsRUFBQSxJQUFBNTNDLFlBQUE2bkYsR0FBQXo2RSxPQUlBLE9BRkF1aEYsRUFBQTc3RSxHQUFBOGtDLEVBRUFBLENBRUEsQ0F6QkFpM0MsQ0FBQWprQyxFQUFBOUUsRUFBQTE0QyxRQUVBclAsRUFBQW9QLEdBQUEyNEMsRUFBQS9vRCxLQUFBcVEsR0FDQTY0QyxFQUFBLElBQUFMLEdBQUE3bkQsRUFBQStuRCxFQUFBMU4sUUFLQSxPQUpBNk4sRUFBQW56QyxLQUFBZ3pDLEVBQUFoekMsS0FFQTQ3RSxFQUFBNTdFLEdBQUFtekMsRUFFQUEsQ0FFQSxDQWlCQSxNQUFBbmlDLEVBQUE4bUMsRUFBQTRqQywwQkFBQSxJQUFBRCxHQUFBLElBQUFoNkMsR0FFQTcyQyxFQUFBa3RELEVBQUFuNEMsS0FBQS9VLE1BRUEsUUFBQVQsSUFBQVMsRUFBQSxDQUVBLE1BQUFveEYsRUFBQTNoRixHQUFBelAsRUFBQVgsS0FBQVcsRUFBQUssT0FDQStsQixFQUFBa3hCLFNBQUEsSUFBQWhELEdBQUE4OEMsRUFBQSxHQUVBLENBRUEsTUFBQXA2QyxFQUFBa1csRUFBQW40QyxLQUFBaWlDLFdBRUEsSUFBQSxNQUFBbmEsS0FBQW1hLEVBQUEsQ0FFQSxNQUFBN3NDLEVBQUE2c0MsRUFBQW5hLEdBQ0EsSUFBQXcwRCxFQUVBLEdBQUFsbkYsRUFBQXN3Qyw2QkFBQSxDQUVBLE1BQUEyTixFQUFBOG9DLEVBQUFoa0MsRUFBQW40QyxLQUFBNUssRUFBQTRLLE1BQ0FzOEUsRUFBQSxJQUFBNW9DLEdBQUFMLEVBQUFqK0MsRUFBQW9xQyxTQUFBcHFDLEVBQUFILE9BQUFHLEVBQUFxcUMsV0FFQSxLQUFBLENBRUEsTUFBQTQ4QyxFQUFBM2hGLEdBQUF0RixFQUFBOUssS0FBQThLLEVBQUE5SixPQUVBZ3hGLEVBQUEsSUFEQWxuRixFQUFBbWpELDJCQUFBRixHQUFBOVksSUFDQTg4QyxFQUFBam5GLEVBQUFvcUMsU0FBQXBxQyxFQUFBcXFDLFdBRUEsTUFFQWoxQyxJQUFBNEssRUFBQXlGLE9BQUF5aEYsRUFBQXpoRixLQUFBekYsRUFBQXlGLFdBQ0FyUSxJQUFBNEssRUFBQXdxQyxPQUFBMDhDLEVBQUF0OEMsU0FBQTVxQyxFQUFBd3FDLE9BRUF2dUIsRUFBQXF4QixhQUFBNWEsRUFBQXcwRCxFQUVBLENBRUEsTUFBQXA2QyxFQUFBaVcsRUFBQW40QyxLQUFBa2lDLGdCQUVBLEdBQUFBLEVBRUEsSUFBQSxNQUFBcGEsS0FBQW9hLEVBQUEsQ0FFQSxNQUFBOEQsRUFBQTlELEVBQUFwYSxHQUVBeDhCLEVBQUEsR0FFQSxJQUFBLElBQUFFLEVBQUEsRUFBQXFiLEVBQUFtL0IsRUFBQXQ2QyxPQUFBRixFQUFBcWIsRUFBQXJiLElBQUEsQ0FFQSxNQUFBNEosRUFBQTR3QyxFQUFBeDZDLEdBQ0EsSUFBQTh3RixFQUVBLEdBQUFsbkYsRUFBQXN3Qyw2QkFBQSxDQUVBLE1BQUEyTixFQUFBOG9DLEVBQUFoa0MsRUFBQW40QyxLQUFBNUssRUFBQTRLLE1BQ0FzOEUsRUFBQSxJQUFBNW9DLEdBQUFMLEVBQUFqK0MsRUFBQW9xQyxTQUFBcHFDLEVBQUFILE9BQUFHLEVBQUFxcUMsV0FFQSxLQUFBLENBRUEsTUFBQTQ4QyxFQUFBM2hGLEdBQUF0RixFQUFBOUssS0FBQThLLEVBQUE5SixPQUNBZ3hGLEVBQUEsSUFBQS84QyxHQUFBODhDLEVBQUFqbkYsRUFBQW9xQyxTQUFBcHFDLEVBQUFxcUMsV0FFQSxNQUVBajFDLElBQUE0SyxFQUFBeUYsT0FBQXloRixFQUFBemhGLEtBQUF6RixFQUFBeUYsTUFDQXZQLEVBQUFULEtBQUF5eEYsRUFFQSxDQUVBanJFLEVBQUE2d0IsZ0JBQUFwYSxHQUFBeDhCLENBRUEsQ0FJQTZzRCxFQUFBbjRDLEtBQUFtaUMsdUJBSUE5d0IsRUFBQTh3QixzQkFBQSxHQUlBLE1BQUFDLEVBQUErVixFQUFBbjRDLEtBQUFvaUMsUUFBQStWLEVBQUFuNEMsS0FBQXU4RSxXQUFBcGtDLEVBQUFuNEMsS0FBQXc4RSxRQUVBLFFBQUFoeUYsSUFBQTQzQyxFQUVBLElBQUEsSUFBQTUyQyxFQUFBLEVBQUFzQixFQUFBczFDLEVBQUExMkMsT0FBQUYsSUFBQXNCLElBQUF0QixFQUFBLENBRUEsTUFBQSs0QyxFQUFBbkMsRUFBQTUyQyxHQUVBNmxCLEVBQUF3eEIsU0FBQTBCLEVBQUFyRSxNQUFBcUUsRUFBQS85QixNQUFBKzlCLEVBQUF6QixjQUVBLENBSUEsTUFBQW5jLEVBQUF3eEIsRUFBQW40QyxLQUFBMm1CLGVBRUEsUUFBQW44QixJQUFBbThCLEVBQUEsQ0FFQSxNQUFBbnhCLEVBQUEsSUFBQWlYLFFBRUFqaUIsSUFBQW04QixFQUFBbnhCLFFBRUFBLEVBQUFSLFVBQUEyeEIsRUFBQW54QixRQUlBNmIsRUFBQXNWLGVBQUEsSUFBQXRTLEdBQUE3ZSxFQUFBbXhCLEVBQUEzWCxPQUVBLENBS0EsT0FIQW1wQyxFQUFBdDlDLE9BQUF3VyxFQUFBeFcsS0FBQXM5QyxFQUFBdDlDLE1BQ0FzOUMsRUFBQXYxQyxXQUFBeU8sRUFBQXpPLFNBQUF1MUMsRUFBQXYxQyxVQUVBeU8sQ0FFQSxFQ3JLQSxNQUFBb3JFLFdBQUF0SyxHQU9BLFdBQUE5a0YsQ0FBQStrRixHQUVBcHdFLE1BQUFvd0UsRUFFQSxDQVVBLElBQUFLLENBQUEzeEUsRUFBQWd3RSxFQUFBQyxFQUFBQyxHQUVBLE1BQUE1b0MsRUFBQTM5QyxLQUVBNGxFLEVBQUEsS0FBQTVsRSxLQUFBNGxFLEtBQUFxckIsR0FBQUMsZUFBQTc2RSxHQUFBclcsS0FBQTRsRSxLQUNBNWxFLEtBQUE4bkYsYUFBQTluRixLQUFBOG5GLGNBQUFsaUIsRUFFQSxNQUFBeWhCLEVBQUEsSUFBQXNCLEdBQUEzb0YsS0FBQTJuRixTQUNBTixFQUFBZSxRQUFBcG9GLEtBQUE0bEUsTUFDQXloQixFQUFBaUIsaUJBQUF0b0YsS0FBQStuRixlQUNBVixFQUFBYyxtQkFBQW5vRixLQUFBNm5GLGlCQUNBUixFQUFBVyxLQUFBM3hFLEdBQUEsU0FBQXcwRSxHQUVBLElBQUFuOUIsRUFBQSxLQUVBLElBRUFBLEVBQUFqMUMsS0FBQUMsTUFBQW15RSxFQUVBLENBQUEsTUFBQTl5RCxHQU1BLFlBSkFoNEIsSUFBQXdtRixHQUFBQSxFQUFBeHVELFFBRUFueEIsUUFBQW14QixNQUFBLG1DQUFBMWhCLEVBQUEsSUFBQTBoQixFQUFBbm5CLFFBSUEsQ0FFQSxNQUFBaUksRUFBQTYwQyxFQUFBNzBDLFNBRUEsUUFBQTlZLElBQUE4WSxRQUFBOVksSUFBQThZLEVBQUFoWixNQUFBLGFBQUFnWixFQUFBaFosS0FBQWtDLGNBS0EsWUFIQWhDLElBQUF3bUYsR0FBQUEsRUFBQSxJQUFBbmpGLE1BQUEsa0NBQUFpVCxTQUVBelAsUUFBQW14QixNQUFBLGtDQUFBMWhCLEdBS0FzbkMsRUFBQWpsQyxNQUFBZzFDLEVBQUEyNEIsRUFFQSxHQUFBQyxFQUFBQyxFQUVBLENBVUEsZUFBQTBCLENBQUE1eEUsRUFBQWl3RSxHQUVBLE1BRUExZ0IsRUFBQSxLQUFBNWxFLEtBQUE0bEUsS0FBQXFyQixHQUFBQyxlQUFBNzZFLEdBQUFyVyxLQUFBNGxFLEtBQ0E1bEUsS0FBQThuRixhQUFBOW5GLEtBQUE4bkYsY0FBQWxpQixFQUVBLE1BQUF5aEIsRUFBQSxJQUFBc0IsR0FBQTNvRixLQUFBMm5GLFNBQ0FOLEVBQUFlLFFBQUFwb0YsS0FBQTRsRSxNQUNBeWhCLEVBQUFpQixpQkFBQXRvRixLQUFBK25GLGVBQ0FWLEVBQUFjLG1CQUFBbm9GLEtBQUE2bkYsaUJBRUEsTUFBQWdELFFBQUF4RCxFQUFBWSxVQUFBNXhFLEVBQUFpd0UsR0FFQTU0QixFQUFBajFDLEtBQUFDLE1BQUFteUUsR0FFQWh5RSxFQUFBNjBDLEVBQUE3MEMsU0FFQSxRQUFBOVksSUFBQThZLFFBQUE5WSxJQUFBOFksRUFBQWhaLE1BQUEsYUFBQWdaLEVBQUFoWixLQUFBa0MsY0FFQSxNQUFBLElBQUFxQixNQUFBLGtDQUFBaVQsR0FJQSxhQXRCQXJXLEtBc0JBaXlGLFdBQUF2a0MsRUFFQSxDQVVBLEtBQUFoMUMsQ0FBQWcxQyxFQUFBMjRCLEdBRUEsTUFBQWh3RCxFQUFBcjJCLEtBQUFreUYsZ0JBQUF4a0MsRUFBQXIzQixZQUNBa0QsRUFBQXY1QixLQUFBbXlGLFlBQUF6a0MsRUFBQW4wQixRQUNBRixFQUFBcjVCLEtBQUFveUYsZ0JBQUExa0MsRUFBQXIwQixXQUFBRSxHQUVBcGpCLEVBQUFuVyxLQUFBcXlGLFlBQUEza0MsRUFBQXYzQyxRQUFBLGdCQUVBcFcsSUFBQXNtRixHQUFBQSxFQUFBcmdFLEVBRUEsSUFFQXBOLEVBQUE1WSxLQUFBc3lGLGNBQUE1a0MsRUFBQTkwQyxTQUFBekMsR0FDQW1qQixFQUFBdDVCLEtBQUF1eUYsZUFBQTdrQyxFQUFBcDBCLFVBQUExZ0IsR0FFQW9OLEVBQUFobUIsS0FBQXd5RixZQUFBOWtDLEVBQUExbkMsT0FBQXFULEVBQUFDLEVBQUExZ0IsRUFBQXlkLEdBQ0FtRCxFQUFBeDVCLEtBQUF5eUYsZUFBQS9rQyxFQUFBbDBCLFVBQUF4VCxHQU9BLEdBTEFobUIsS0FBQTB5RixjQUFBMXNFLEVBQUF3VCxHQUNBeDVCLEtBQUEyeUYsaUJBQUEzc0UsUUFJQWptQixJQUFBc21GLEVBQUEsQ0FFQSxJQUFBdU0sR0FBQSxFQUVBLElBQUEsTUFBQWg5RSxLQUFBTyxFQUVBLEdBQUFBLEVBQUFQLEdBQUFMLGdCQUFBSixpQkFBQSxDQUVBeTlFLEdBQUEsRUFDQSxLQUVBLEVBSUEsSUFBQUEsR0FBQXZNLEVBQUFyZ0UsRUFFQSxDQUVBLE9BQUFBLENBRUEsQ0FRQSxnQkFBQWlzRSxDQUFBdmtDLEdBRUEsTUFBQXIzQixFQUFBcjJCLEtBQUFreUYsZ0JBQUF4a0MsRUFBQXIzQixZQUNBa0QsRUFBQXY1QixLQUFBbXlGLFlBQUF6a0MsRUFBQW4wQixRQUNBRixFQUFBcjVCLEtBQUFveUYsZ0JBQUExa0MsRUFBQXIwQixXQUFBRSxHQUVBcGpCLFFBQUFuVyxLQUFBNnlGLGlCQUFBbmxDLEVBQUF2M0MsUUFFQXlDLEVBQUE1WSxLQUFBc3lGLGNBQUE1a0MsRUFBQTkwQyxTQUFBekMsR0FDQW1qQixFQUFBdDVCLEtBQUF1eUYsZUFBQTdrQyxFQUFBcDBCLFVBQUExZ0IsR0FFQW9OLEVBQUFobUIsS0FBQXd5RixZQUFBOWtDLEVBQUExbkMsT0FBQXFULEVBQUFDLEVBQUExZ0IsRUFBQXlkLEdBQ0FtRCxFQUFBeDVCLEtBQUF5eUYsZUFBQS9rQyxFQUFBbDBCLFVBQUF4VCxHQUtBLE9BSEFobUIsS0FBQTB5RixjQUFBMXNFLEVBQUF3VCxHQUNBeDVCLEtBQUEyeUYsaUJBQUEzc0UsR0FFQUEsQ0FFQSxDQUlBLFdBQUFtc0UsQ0FBQXprQyxHQUVBLE1BQUFuMEIsRUFBQSxDQUFBLEVBRUEsUUFBQXg1QixJQUFBMnRELEVBRUEsSUFBQSxJQUFBM3NELEVBQUEsRUFBQUMsRUFBQTBzRCxFQUFBenNELE9BQUFGLEVBQUFDLEVBQUFELElBQUEsQ0FFQSxNQUFBMjdCLEdBQUEsSUFBQThzQyxJQUFBeHFCLFNBQUEwTyxFQUFBM3NELElBRUF3NEIsRUFBQW1ELEVBQUE5bUIsTUFBQThtQixDQUVBLENBSUEsT0FBQW5ELENBRUEsQ0FFQSxjQUFBazVELENBQUEva0MsRUFBQTFuQyxHQUVBLE1BQUF3VCxFQUFBLENBQUEsRUFDQW16QixFQUFBLENBQUEsRUFZQSxHQVJBM21DLEVBQUE4UyxVQUFBLFNBQUE3RCxHQUVBQSxFQUFBNjNCLFNBQUFILEVBQUExM0IsRUFBQXJmLE1BQUFxZixFQUVBLFNBSUFsMUIsSUFBQTJ0RCxFQUVBLElBQUEsSUFBQTNzRCxFQUFBLEVBQUFDLEVBQUEwc0QsRUFBQXpzRCxPQUFBRixFQUFBQyxFQUFBRCxJQUFBLENBRUEsTUFBQSs3QixHQUFBLElBQUFvd0IsSUFBQWxPLFNBQUEwTyxFQUFBM3NELEdBQUE0ckQsR0FFQW56QixFQUFBc0QsRUFBQWxuQixNQUFBa25CLENBRUEsQ0FJQSxPQUFBdEQsQ0FFQSxDQUVBLGVBQUE0NEQsQ0FBQTFrQyxFQUFBbjBCLEdBRUEsTUFBQUYsRUFBQSxDQUFBLEVBRUEsUUFBQXQ1QixJQUFBMnRELEVBQUEsQ0FFQSxNQUFBb2xDLEVBQUEsSUFBQXZCLEdBRUEsSUFBQSxJQUFBeHdGLEVBQUEsRUFBQUMsRUFBQTBzRCxFQUFBenNELE9BQUFGLEVBQUFDLEVBQUFELElBQUEsQ0FFQSxJQUFBNmxCLEVBQ0EsTUFBQXJSLEVBQUFtNEMsRUFBQTNzRCxHQUVBLE9BQUF3VSxFQUFBMVYsTUFFQSxJQUFBLGlCQUNBLElBQUEsMEJBRUErbUIsRUFBQWtzRSxFQUFBcDZFLE1BQUFuRCxHQUNBLE1BRUEsUUFFQUEsRUFBQTFWLFFBQUFrekYsR0FFQW5zRSxFQUFBbXNFLEdBQUF4OUUsRUFBQTFWLE1BQUFtL0MsU0FBQXpwQyxFQUFBZ2tCLEdBSUEzeUIsUUFBQUMsS0FBQSxrREFBQTBPLEVBQUExVixTQU1BK21CLEVBQUFoUixLQUFBTCxFQUFBSyxVQUVBN1YsSUFBQXdWLEVBQUFuRixPQUFBd1csRUFBQXhXLEtBQUFtRixFQUFBbkYsV0FDQXJRLElBQUF3VixFQUFBNEMsV0FBQXlPLEVBQUF6TyxTQUFBNUMsRUFBQTRDLFVBRUFraEIsRUFBQTlqQixFQUFBSyxNQUFBZ1IsQ0FFQSxDQUVBLENBRUEsT0FBQXlTLENBRUEsQ0FFQSxjQUFBazVELENBQUE3a0MsRUFBQTkwQyxHQUVBLE1BQUF1a0IsRUFBQSxDQUFBLEVBQ0E3RCxFQUFBLENBQUEsRUFFQSxRQUFBdjVCLElBQUEydEQsRUFBQSxDQUVBLE1BQUEyNUIsRUFBQSxJQUFBdUosR0FDQXZKLEVBQUEySixZQUFBcDRFLEdBRUEsSUFBQSxJQUFBN1gsRUFBQSxFQUFBQyxFQUFBMHNELEVBQUF6c0QsT0FBQUYsRUFBQUMsRUFBQUQsSUFBQSxDQUVBLE1BQUF3VSxFQUFBbTRDLEVBQUEzc0QsUUFFQWhCLElBQUFvOUIsRUFBQTVuQixFQUFBSyxRQUVBdW5CLEVBQUE1bkIsRUFBQUssTUFBQXl4RSxFQUFBM3VFLE1BQUFuRCxJQUlBK2pCLEVBQUEvakIsRUFBQUssTUFBQXVuQixFQUFBNW5CLEVBQUFLLEtBRUEsQ0FFQSxDQUVBLE9BQUEwakIsQ0FFQSxDQUVBLGVBQUE0NEQsQ0FBQXhrQyxHQUVBLE1BQUFyM0IsRUFBQSxDQUFBLEVBRUEsUUFBQXQyQixJQUFBMnRELEVBRUEsSUFBQSxJQUFBM3NELEVBQUEsRUFBQUEsRUFBQTJzRCxFQUFBenNELE9BQUFGLElBQUEsQ0FFQSxNQUFBd1UsRUFBQW00QyxFQUFBM3NELEdBRUF5N0UsRUFBQW9ILEdBQUFsckUsTUFBQW5ELEdBRUE4Z0IsRUFBQW1tRCxFQUFBNW1FLE1BQUE0bUUsQ0FFQSxDQUlBLE9BQUFubUQsQ0FFQSxDQUVBLFdBQUFnOEQsQ0FBQTNrQyxFQUFBMjRCLEdBRUEsTUFBQTFvQyxFQUFBMzlDLEtBQ0FtVyxFQUFBLENBQUEsRUFFQSxJQUFBa3hFLEVBbUJBLFNBQUEyTCxFQUFBeCtFLEdBRUEsR0FBQSxpQkFBQUEsRUFBQSxDQUVBLE1BQUE2QixFQUFBN0IsRUFJQSxPQXpCQSxTQUFBNkIsR0FJQSxPQUZBc25DLEVBQUFncUMsUUFBQWIsVUFBQXp3RSxHQUVBZ3hFLEVBQUFXLEtBQUEzeEUsR0FBQSxXQUVBc25DLEVBQUFncUMsUUFBQVosUUFBQTF3RSxFQUVBLFFBQUF0VyxHQUFBLFdBRUE0OUMsRUFBQWdxQyxRQUFBWCxVQUFBM3dFLEdBQ0FzbkMsRUFBQWdxQyxRQUFBWixRQUFBMXdFLEVBRUEsR0FFQSxDQVVBNDhFLENBRkEsNEJBQUF4K0UsS0FBQTRCLEdBQUFBLEVBQUFzbkMsRUFBQW1xQyxhQUFBenhFLEVBSUEsQ0FFQSxPQUFBN0IsRUFBQWUsS0FFQSxDQUNBQSxLQUFBdEYsR0FBQXVFLEVBQUEzVSxLQUFBMlUsRUFBQWUsTUFDQXRPLE1BQUF1TixFQUFBdk4sTUFDQUMsT0FBQXNOLEVBQUF0TixRQUtBLElBTUEsQ0FFQSxRQUFBbkgsSUFBQTJ0RCxHQUFBQSxFQUFBenNELE9BQUEsRUFBQSxDQUVBLE1BQUEwbUYsRUFBQSxJQUFBdkIsR0FBQUMsR0FFQWdCLEVBQUEsSUFBQTBFLEdBQUFwRSxHQUNBTixFQUFBYSxlQUFBbG9GLEtBQUE0bkYsYUFFQSxJQUFBLElBQUE3bUYsRUFBQSxFQUFBcWIsRUFBQXN4QyxFQUFBenNELE9BQUFGLEVBQUFxYixFQUFBcmIsSUFBQSxDQUVBLE1BQUF5VCxFQUFBazVDLEVBQUEzc0QsR0FDQXNWLEVBQUE3QixFQUFBNkIsSUFFQSxHQUFBQyxNQUFBQyxRQUFBRixHQUFBLENBSUEsTUFBQTY4RSxFQUFBLEdBRUEsSUFBQSxJQUFBN3BFLEVBQUEsRUFBQXd2QixFQUFBeGlDLEVBQUFwVixPQUFBb29CLEVBQUF3dkIsRUFBQXh2QixJQUFBLENBRUEsTUFFQThwRSxFQUFBSCxFQUZBMzhFLEVBQUFnVCxJQUlBLE9BQUE4cEUsSUFFQUEsYUFBQWgrRSxpQkFFQSs5RSxFQUFBOXlGLEtBQUEreUYsR0FNQUQsRUFBQTl5RixLQUFBLElBQUEyc0QsR0FBQW9tQyxFQUFBNTlFLEtBQUE0OUUsRUFBQWxzRixNQUFBa3NGLEVBQUFqc0YsU0FNQSxDQUVBaVAsRUFBQTNCLEVBQUFvQixNQUFBLElBQUFILEdBQUF5OUUsRUFFQSxLQUFBLENBSUEsTUFBQUMsRUFBQUgsRUFBQXgrRSxFQUFBNkIsS0FDQUYsRUFBQTNCLEVBQUFvQixNQUFBLElBQUFILEdBQUEwOUUsRUFHQSxDQUVBLENBRUEsQ0FFQSxPQUFBaDlFLENBRUEsQ0FFQSxzQkFBQTA4RSxDQUFBbmxDLEdBRUEsTUFBQS9QLEVBQUEzOUMsS0FDQW1XLEVBQUEsQ0FBQSxFQUVBLElBQUFreEUsRUFFQStMLGVBQUFKLEVBQUF4K0UsR0FFQSxHQUFBLGlCQUFBQSxFQUFBLENBRUEsTUFBQTZCLEVBQUE3QixFQUVBb3hELEVBQUEsNEJBQUFueEQsS0FBQTRCLEdBQUFBLEVBQUFzbkMsRUFBQW1xQyxhQUFBenhFLEVBRUEsYUFBQWd4RSxFQUFBWSxVQUFBcmlCLEVBRUEsQ0FFQSxPQUFBcHhELEVBQUFlLEtBRUEsQ0FDQUEsS0FBQXRGLEdBQUF1RSxFQUFBM1UsS0FBQTJVLEVBQUFlLE1BQ0F0TyxNQUFBdU4sRUFBQXZOLE1BQ0FDLE9BQUFzTixFQUFBdE4sUUFLQSxJQU1BLENBRUEsUUFBQW5ILElBQUEydEQsR0FBQUEsRUFBQXpzRCxPQUFBLEVBQUEsQ0FFQW9tRixFQUFBLElBQUEwRSxHQUFBL3JGLEtBQUEybkYsU0FDQU4sRUFBQWEsZUFBQWxvRixLQUFBNG5GLGFBRUEsSUFBQSxJQUFBN21GLEVBQUEsRUFBQXFiLEVBQUFzeEMsRUFBQXpzRCxPQUFBRixFQUFBcWIsRUFBQXJiLElBQUEsQ0FFQSxNQUFBeVQsRUFBQWs1QyxFQUFBM3NELEdBQ0FzVixFQUFBN0IsRUFBQTZCLElBRUEsR0FBQUMsTUFBQUMsUUFBQUYsR0FBQSxDQUlBLE1BQUE2OEUsRUFBQSxHQUVBLElBQUEsSUFBQTdwRSxFQUFBLEVBQUF3dkIsRUFBQXhpQyxFQUFBcFYsT0FBQW9vQixFQUFBd3ZCLEVBQUF4dkIsSUFBQSxDQUVBLE1BQUFncUUsRUFBQWg5RSxFQUFBZ1QsR0FFQThwRSxRQUFBSCxFQUFBSyxHQUVBLE9BQUFGLElBRUFBLGFBQUFoK0UsaUJBRUErOUUsRUFBQTl5RixLQUFBK3lGLEdBTUFELEVBQUE5eUYsS0FBQSxJQUFBMnNELEdBQUFvbUMsRUFBQTU5RSxLQUFBNDlFLEVBQUFsc0YsTUFBQWtzRixFQUFBanNGLFNBTUEsQ0FFQWlQLEVBQUEzQixFQUFBb0IsTUFBQSxJQUFBSCxHQUFBeTlFLEVBRUEsS0FBQSxDQUlBLE1BQUFDLFFBQUFILEVBQUF4K0UsRUFBQTZCLEtBQ0FGLEVBQUEzQixFQUFBb0IsTUFBQSxJQUFBSCxHQUFBMDlFLEVBRUEsQ0FFQSxDQUVBLENBRUEsT0FBQWg5RSxDQUVBLENBRUEsYUFBQW04RSxDQUFBNWtDLEVBQUF2M0MsR0FFQSxTQUFBbTlFLEVBQUFyeEYsRUFBQXBDLEdBRUEsTUFBQSxpQkFBQW9DLEVBQUFBLEdBRUEyRSxRQUFBQyxLQUFBLHVFQUFBNUUsR0FFQXBDLEVBQUFvQyxHQUVBLENBRUEsTUFBQTJXLEVBQUEsQ0FBQSxFQUVBLFFBQUE3WSxJQUFBMnRELEVBRUEsSUFBQSxJQUFBM3NELEVBQUEsRUFBQUMsRUFBQTBzRCxFQUFBenNELE9BQUFGLEVBQUFDLEVBQUFELElBQUEsQ0FFQSxNQUFBd1UsRUFBQW00QyxFQUFBM3NELFFBRUFoQixJQUFBd1YsRUFBQWYsT0FFQTVOLFFBQUFDLEtBQUEsK0NBQUEwTyxFQUFBSyxXQUlBN1YsSUFBQW9XLEVBQUFaLEVBQUFmLFFBRUE1TixRQUFBQyxLQUFBLHNDQUFBME8sRUFBQWYsT0FJQSxNQUFBaUQsRUFBQXRCLEVBQUFaLEVBQUFmLE9BQ0FBLEVBQUFpRCxFQUFBbEMsS0FFQSxJQUFBeUcsRUFFQTFGLE1BQUFDLFFBQUEvQixJQUVBd0gsRUFBQSxJQUFBbW9DLEdBRUEsSUFBQTN2QyxFQUFBdlQsU0FBQSthLEVBQUFqRyxhQUFBLEtBTUFpRyxFQUZBeEgsR0FBQUEsRUFBQWUsS0FFQSxJQUFBdzNDLEdBSUEsSUFBQW4yQyxHQUlBcEMsSUFBQXdILEVBQUFqRyxhQUFBLElBSUFpRyxFQUFBdkUsT0FBQUEsRUFFQXVFLEVBQUFwRyxLQUFBTCxFQUFBSyxVQUVBN1YsSUFBQXdWLEVBQUFuRixPQUFBNEwsRUFBQTVMLEtBQUFtRixFQUFBbkYsV0FFQXJRLElBQUF3VixFQUFBdUIsVUFBQWtGLEVBQUFsRixRQUFBdzhFLEVBQUEvOUUsRUFBQXVCLFFBQUF5OEUsVUFDQXh6RixJQUFBd1YsRUFBQW9DLFVBQUFxRSxFQUFBckUsUUFBQXBDLEVBQUFvQyxjQUVBNVgsSUFBQXdWLEVBQUEvSyxRQUFBd1IsRUFBQXhSLE9BQUFELFVBQUFnTCxFQUFBL0ssYUFDQXpLLElBQUF3VixFQUFBc0MsUUFBQW1FLEVBQUFuRSxPQUFBdE4sVUFBQWdMLEVBQUFzQyxhQUNBOVgsSUFBQXdWLEVBQUF4SyxRQUFBaVIsRUFBQWpSLE9BQUFSLFVBQUFnTCxFQUFBeEssYUFDQWhMLElBQUF3VixFQUFBckcsV0FBQThNLEVBQUE5TSxTQUFBcUcsRUFBQXJHLGVBRUFuUCxJQUFBd1YsRUFBQXdELE9BRUFpRCxFQUFBaEYsTUFBQXM4RSxFQUFBLzlFLEVBQUF3RCxLQUFBLEdBQUF5NkUsSUFDQXgzRSxFQUFBL0UsTUFBQXE4RSxFQUFBLzlFLEVBQUF3RCxLQUFBLEdBQUF5NkUsVUFJQXp6RixJQUFBd1YsRUFBQTZCLFNBQUE0RSxFQUFBNUUsT0FBQTdCLEVBQUE2QixhQUNBclgsSUFBQXdWLEVBQUFxQyxpQkFBQW9FLEVBQUFwRSxlQUFBckMsRUFBQXFDLHFCQUNBN1gsSUFBQXdWLEVBQUExVixPQUFBbWMsRUFBQW5jLEtBQUEwVixFQUFBMVYsV0FDQUUsSUFBQXdWLEVBQUF0QyxhQUFBK0ksRUFBQS9JLFdBQUFzQyxFQUFBdEMsaUJBRUFsVCxJQUFBd1YsRUFBQTRCLFlBQUE2RSxFQUFBN0UsVUFBQW04RSxFQUFBLzlFLEVBQUE0QixVQUFBczhFLFVBQ0ExekYsSUFBQXdWLEVBQUEyQixZQUFBOEUsRUFBQTlFLFVBQUFvOEUsRUFBQS85RSxFQUFBMkIsVUFBQXU4RSxVQUNBMXpGLElBQUF3VixFQUFBOEIsYUFBQTJFLEVBQUEzRSxXQUFBOUIsRUFBQThCLGlCQUVBdFgsSUFBQXdWLEVBQUEwQyxRQUFBK0QsRUFBQS9ELE1BQUExQyxFQUFBMEMsWUFFQWxZLElBQUF3VixFQUFBd0Msa0JBQUFpRSxFQUFBakUsZ0JBQUF4QyxFQUFBd0Msc0JBQ0FoWSxJQUFBd1YsRUFBQXlDLG1CQUFBZ0UsRUFBQWhFLGlCQUFBekMsRUFBQXlDLHVCQUNBalksSUFBQXdWLEVBQUEyQyxrQkFBQThELEVBQUE5RCxnQkFBQTNDLEVBQUEyQyxzQkFDQW5ZLElBQUF3VixFQUFBdW5ELGtCQUFBOWdELEVBQUE4Z0QsZ0JBQUF2bkQsRUFBQXVuRCxzQkFFQS84RCxJQUFBd1YsRUFBQTRDLFdBQUE2RCxFQUFBN0QsU0FBQTVDLEVBQUE0QyxVQUVBUyxFQUFBckQsRUFBQUssTUFBQW9HLENBRUEsQ0FJQSxPQUFBcEQsQ0FFQSxDQUVBLFdBQUE0NUUsQ0FBQWo5RSxFQUFBOGpCLEVBQUFDLEVBQUExZ0IsRUFBQXlkLEdBRUEsSUFBQXJRLEVBOERBWSxFQUFBbVcsRUE1REEsU0FBQTIyRCxFQUFBdGpGLEdBUUEsWUFOQXJRLElBQUFzNUIsRUFBQWpwQixJQUVBeEosUUFBQUMsS0FBQSx5Q0FBQXVKLEdBSUFpcEIsRUFBQWpwQixFQUVBLENBRUEsU0FBQXVqRixFQUFBdmpGLEdBRUEsUUFBQXJRLElBQUFxUSxFQUFBLENBRUEsR0FBQWtHLE1BQUFDLFFBQUFuRyxHQUFBLENBRUEsTUFBQXZQLEVBQUEsR0FFQSxJQUFBLElBQUFFLEVBQUEsRUFBQUMsRUFBQW9QLEVBQUFuUCxPQUFBRixFQUFBQyxFQUFBRCxJQUFBLENBRUEsTUFBQTZVLEVBQUF4RixFQUFBclAsUUFFQWhCLElBQUF1NUIsRUFBQTFqQixJQUVBaFAsUUFBQUMsS0FBQSx5Q0FBQStPLEdBSUEvVSxFQUFBVCxLQUFBazVCLEVBQUExakIsR0FFQSxDQUVBLE9BQUEvVSxDQUVBLENBUUEsWUFOQWQsSUFBQXU1QixFQUFBbHBCLElBRUF4SixRQUFBQyxLQUFBLHlDQUFBdUosR0FJQWtwQixFQUFBbHBCLEVBOUJBLENBZ0NBLENBRUEsU0FBQXlnRixFQUFBajdFLEdBUUEsWUFOQTdWLElBQUE2WSxFQUFBaEQsSUFFQWhQLFFBQUFDLEtBQUEsd0NBQUErTyxHQUlBZ0QsRUFBQWhELEVBRUEsQ0FJQSxPQUFBTCxFQUFBMVYsTUFFQSxJQUFBLFFBRUFtbUIsRUFBQSxJQUFBZ2lDLFFBRUFqb0QsSUFBQXdWLEVBQUE2bUIsYUFFQXZkLE9BQUErMEUsVUFBQXIrRSxFQUFBNm1CLFlBRUFwVyxFQUFBb1csV0FBQSxJQUFBME4sR0FBQXYwQixFQUFBNm1CLFlBSUFwVyxFQUFBb1csV0FBQXkwRCxFQUFBdDdFLEVBQUE2bUIsa0JBTUFyOEIsSUFBQXdWLEVBQUErbUIsY0FFQXRXLEVBQUFzVyxZQUFBdTBELEVBQUF0N0UsRUFBQSttQixtQkFJQXY4QixJQUFBd1YsRUFBQWcrQixNQUVBLFFBQUFoK0IsRUFBQWcrQixJQUFBMXpDLEtBRUFtbUIsRUFBQXV0QixJQUFBLElBQUF1VSxHQUFBdnlDLEVBQUFnK0IsSUFBQWxoQyxNQUFBa0QsRUFBQWcrQixJQUFBOWdCLEtBQUFsZCxFQUFBZytCLElBQUE3Z0IsS0FFQSxZQUFBbmQsRUFBQWcrQixJQUFBMXpDLE9BRUFtbUIsRUFBQXV0QixJQUFBLElBQUFvVSxHQUFBcHlDLEVBQUFnK0IsSUFBQWxoQyxNQUFBa0QsRUFBQWcrQixJQUFBcVUsVUFJQSxLQUFBcnlDLEVBQUFnK0IsSUFBQW5qQyxPQUVBNFYsRUFBQXV0QixJQUFBbmpDLEtBQUFtRixFQUFBZytCLElBQUFuakMsWUFNQXJRLElBQUF3VixFQUFBMHlDLHVCQUFBamlDLEVBQUFpaUMscUJBQUExeUMsRUFBQTB5QywyQkFDQWxvRCxJQUFBd1YsRUFBQTJ5QyxzQkFBQWxpQyxFQUFBa2lDLG9CQUFBM3lDLEVBQUEyeUMsMEJBQ0Fub0QsSUFBQXdWLEVBQUE0eUMsb0JBQUFuaUMsRUFBQW1pQyxtQkFBQTU5QyxVQUFBZ0wsRUFBQTR5Qyx5QkFFQXBvRCxJQUFBd1YsRUFBQTZ5Qyx1QkFBQXBpQyxFQUFBb2lDLHFCQUFBN3lDLEVBQUE2eUMsMkJBQ0Fyb0QsSUFBQXdWLEVBQUE4eUMscUJBQUFyaUMsRUFBQXFpQyxvQkFBQTk5QyxVQUFBZ0wsRUFBQTh5QyxxQkFFQSxNQUVBLElBQUEsb0JBRUFyaUMsRUFBQSxJQUFBazdCLEdBQUEzckMsRUFBQTRyQyxJQUFBNXJDLEVBQUE2ckMsT0FBQTdyQyxFQUFBa2QsS0FBQWxkLEVBQUFtZCxVQUVBM3lCLElBQUF3VixFQUFBZ3NDLFFBQUF2N0IsRUFBQXU3QixNQUFBaHNDLEVBQUFnc0MsWUFDQXhoRCxJQUFBd1YsRUFBQStyQyxPQUFBdDdCLEVBQUFzN0IsS0FBQS9yQyxFQUFBK3JDLFdBQ0F2aEQsSUFBQXdWLEVBQUFrc0MsWUFBQXo3QixFQUFBeTdCLFVBQUFsc0MsRUFBQWtzQyxnQkFDQTFoRCxJQUFBd1YsRUFBQW1zQyxhQUFBMTdCLEVBQUEwN0IsV0FBQW5zQyxFQUFBbXNDLGlCQUNBM2hELElBQUF3VixFQUFBaXNDLE9BQUF4N0IsRUFBQXc3QixLQUFBanVDLE9BQUFDLE9BQUEsQ0FBQSxFQUFBK0IsRUFBQWlzQyxPQUVBLE1BRUEsSUFBQSxxQkFFQXg3QixFQUFBLElBQUFtcEUsR0FBQTU1RSxFQUFBOGMsS0FBQTljLEVBQUErYyxNQUFBL2MsRUFBQWdkLElBQUFoZCxFQUFBaWQsT0FBQWpkLEVBQUFrZCxLQUFBbGQsRUFBQW1kLFVBRUEzeUIsSUFBQXdWLEVBQUErckMsT0FBQXQ3QixFQUFBczdCLEtBQUEvckMsRUFBQStyQyxXQUNBdmhELElBQUF3VixFQUFBaXNDLE9BQUF4N0IsRUFBQXc3QixLQUFBanVDLE9BQUFDLE9BQUEsQ0FBQSxFQUFBK0IsRUFBQWlzQyxPQUVBLE1BRUEsSUFBQSxlQUVBeDdCLEVBQUEsSUFBQTJwRSxHQUFBcDZFLEVBQUFsRCxNQUFBa0QsRUFBQWszRSxXQUVBLE1BRUEsSUFBQSxtQkFFQXptRSxFQUFBLElBQUF5cEUsR0FBQWw2RSxFQUFBbEQsTUFBQWtELEVBQUFrM0UsV0FDQXptRSxFQUFBcGxCLE9BQUEyVSxFQUFBM1UsUUFBQSxHQUVBLE1BRUEsSUFBQSxhQUVBb2xCLEVBQUEsSUFBQWlwRSxHQUFBMTVFLEVBQUFsRCxNQUFBa0QsRUFBQWszRSxVQUFBbDNFLEVBQUEraEIsU0FBQS9oQixFQUFBbzNFLE9BRUEsTUFFQSxJQUFBLGdCQUVBM21FLEVBQUEsSUFBQTZwRSxHQUFBdDZFLEVBQUFsRCxNQUFBa0QsRUFBQWszRSxVQUFBbDNFLEVBQUF0TyxNQUFBc08sRUFBQXJPLFFBRUEsTUFFQSxJQUFBLFlBRUE4ZSxFQUFBLElBQUF1b0UsR0FBQWg1RSxFQUFBbEQsTUFBQWtELEVBQUFrM0UsVUFBQWwzRSxFQUFBK2hCLFNBQUEvaEIsRUFBQWpNLE1BQUFpTSxFQUFBcTNFLFNBQUFyM0UsRUFBQW8zRSxPQUNBM21FLEVBQUFwbEIsT0FBQTJVLEVBQUEzVSxRQUFBLEdBRUEsTUFFQSxJQUFBLGtCQUVBb2xCLEVBQUEsSUFBQThtRSxHQUFBdjNFLEVBQUFsRCxNQUFBa0QsRUFBQW0zRSxZQUFBbjNFLEVBQUFrM0UsV0FFQSxNQUVBLElBQUEsYUFFQXptRSxHQUFBLElBQUEwcUUsSUFBQTF4QyxTQUFBenBDLEdBRUEsTUFFQSxJQUFBLGNBRUFxUixFQUFBOHNFLEVBQUFuK0UsRUFBQXFSLFVBQ0FtVyxFQUFBNDJELEVBQUFwK0UsRUFBQXduQixVQUVBL1csRUFBQSxJQUFBZ21DLEdBQUFwbEMsRUFBQW1XLFFBRUFoOUIsSUFBQXdWLEVBQUFxbkIsV0FBQTVXLEVBQUE0VyxTQUFBcm5CLEVBQUFxbkIsZUFDQTc4QixJQUFBd1YsRUFBQXNuQixZQUFBN1csRUFBQTZXLFdBQUF0eUIsVUFBQWdMLEVBQUFzbkIsaUJBQ0E5OEIsSUFBQXdWLEVBQUF1bkIsV0FBQTlXLEVBQUE4VyxTQUFBdm5CLEVBQUF1bkIsVUFFQSxNQUVBLElBQUEsT0FFQWxXLEVBQUE4c0UsRUFBQW4rRSxFQUFBcVIsVUFDQW1XLEVBQUE0MkQsRUFBQXArRSxFQUFBd25CLFVBRUEvVyxFQUFBLElBQUFtMkIsR0FBQXYxQixFQUFBbVcsR0FFQSxNQUVBLElBQUEsZ0JBRUFuVyxFQUFBOHNFLEVBQUFuK0UsRUFBQXFSLFVBQ0FtVyxFQUFBNDJELEVBQUFwK0UsRUFBQXduQixVQUNBLE1BQUFoaEIsRUFBQXhHLEVBQUF3RyxNQUNBOGQsRUFBQXRrQixFQUFBc2tCLGVBQ0FDLEVBQUF2a0IsRUFBQXVrQixjQUVBOVQsRUFBQSxJQUFBc29DLEdBQUExbkMsRUFBQW1XLEVBQUFoaEIsR0FDQWlLLEVBQUE2VCxlQUFBLElBQUErekIsR0FBQSxJQUFBL3FELGFBQUFnM0IsRUFBQWg1QixPQUFBLFNBQ0FkLElBQUErNUIsSUFBQTlULEVBQUE4VCxjQUFBLElBQUE4ekIsR0FBQSxJQUFBL3FELGFBQUFpM0IsRUFBQWo1QixPQUFBaTVCLEVBQUFpYixXQUVBLE1BRUEsSUFBQSxjQUVBbnVCLEVBQUE4c0UsRUFBQW4rRSxFQUFBcVIsVUFDQW1XLEVBQUE0MkQsRUFBQXArRSxFQUFBd25CLFVBRUEvVyxFQUFBLElBQUEydEMsR0FBQXArQyxFQUFBNmxCLGlCQUFBN2xCLEVBQUErbEIsZUFBQS9sQixFQUFBaW1CLGNBQUF1QixHQUNBL1csRUFBQVksU0FBQUEsRUFDQVosRUFBQWdVLHVCQUFBemtCLEVBQUF5a0IsdUJBQ0FoVSxFQUFBaVUsWUFBQTFrQixFQUFBMGtCLFlBRUFqVSxFQUFBbVUsWUFBQTVrQixFQUFBMmtCLFdBQ0FsVSxFQUFBcVUsZ0JBQUE5a0IsRUFBQTZrQixlQUVBcFUsRUFBQXVVLFlBQUFobEIsRUFBQStrQixXQUNBdFUsRUFBQXlVLFFBQUFsbEIsRUFBQWlsQixPQUNBeFUsRUFBQTJVLFFBQUFwbEIsRUFBQW1sQixPQUFBRSxLQUFBQyxJQUVBLE1BQUExVSxFQUFBLElBQUFqQixHQUNBaUIsRUFBQWprQixJQUFBcUksVUFBQXN3QixFQUFBRSxRQUNBNVUsRUFBQWhrQixJQUFBb0ksVUFBQXN3QixFQUFBRyxRQUVBLE1BQUFwVCxFQUFBLElBQUFnQyxHQUlBLE9BSEFoQyxFQUFBckQsT0FBQXNXLEVBQUFLLGFBQ0F0VCxFQUFBN2MsT0FBQVIsVUFBQXN3QixFQUFBTSxjQUVBLENBQ0FMLGVBQUFELEVBQUFDLGVBQ0EzVSxJQUFBQSxFQUVBOFUsa0JBQUFKLEVBQUFJLGtCQUNBclQsT0FBQUEsRUFDQSxJQUlBNUIsRUFBQXFWLGtCQUFBOWxCLEVBQUE2bEIsaUJBQ0FwVixFQUFBdVYsZ0JBQUFobUIsRUFBQStsQixlQUNBdFYsRUFBQXlWLGVBQUFsbUIsRUFBQWltQixjQUVBeFYsRUFBQTJWLHFCQUFBcG1CLEVBQUFtbUIsb0JBQ0ExVixFQUFBNlYsZUFBQXRtQixFQUFBcW1CLGNBRUE1VixFQUFBK1YsaUJBQUE4MEQsRUFBQXQ3RSxFQUFBdW1CLGdCQUFBbG1CLFdBQ0E3VixJQUFBd1YsRUFBQTBtQixnQkFBQWpXLEVBQUFnVyxlQUFBNjBELEVBQUF0N0UsRUFBQTBtQixjQUFBcm1CLE9BRUEsTUFFQSxJQUFBLE1BRUFvUSxFQUFBLElBQUEwa0MsR0FFQSxNQUVBLElBQUEsT0FFQTFrQyxFQUFBLElBQUErekMsR0FBQTI1QixFQUFBbitFLEVBQUFxUixVQUFBK3NFLEVBQUFwK0UsRUFBQXduQixXQUVBLE1BRUEsSUFBQSxXQUVBL1csRUFBQSxJQUFBNDBDLEdBQUE4NEIsRUFBQW4rRSxFQUFBcVIsVUFBQStzRSxFQUFBcCtFLEVBQUF3bkIsV0FFQSxNQUVBLElBQUEsZUFFQS9XLEVBQUEsSUFBQTIwQyxHQUFBKzRCLEVBQUFuK0UsRUFBQXFSLFVBQUErc0UsRUFBQXArRSxFQUFBd25CLFdBRUEsTUFFQSxJQUFBLGFBQ0EsSUFBQSxTQUVBL1csRUFBQSxJQUFBbTFDLEdBQUF1NEIsRUFBQW4rRSxFQUFBcVIsVUFBQStzRSxFQUFBcCtFLEVBQUF3bkIsV0FFQSxNQUVBLElBQUEsU0FFQS9XLEVBQUEsSUFBQWtrQyxHQUFBeXBDLEVBQUFwK0UsRUFBQXduQixXQUVBLE1BRUEsSUFBQSxRQUVBL1csRUFBQSxJQUFBNitCLEdBRUEsTUFFQSxJQUFBLE9BRUE3K0IsRUFBQSxJQUFBNm1DLEdBRUEsTUFFQSxRQUVBN21DLEVBQUEsSUFBQW1QLEdBOENBLEdBMUNBblAsRUFBQXBRLEtBQUFMLEVBQUFLLFVBRUE3VixJQUFBd1YsRUFBQW5GLE9BQUE0VixFQUFBNVYsS0FBQW1GLEVBQUFuRixXQUVBclEsSUFBQXdWLEVBQUEzRixRQUVBb1csRUFBQXBXLE9BQUFyRixVQUFBZ0wsRUFBQTNGLGFBRUE3UCxJQUFBd1YsRUFBQXVDLG1CQUFBa08sRUFBQWxPLGlCQUFBdkMsRUFBQXVDLGtCQUNBa08sRUFBQWxPLGtCQUFBa08sRUFBQXBXLE9BQUFtaUIsVUFBQS9MLEVBQUF3TCxTQUFBeEwsRUFBQTdHLFdBQUE2RyxFQUFBM1csY0FJQXRQLElBQUF3VixFQUFBaWMsVUFBQXhMLEVBQUF3TCxTQUFBam5CLFVBQUFnTCxFQUFBaWMsZUFDQXp4QixJQUFBd1YsRUFBQXJHLFVBQUE4VyxFQUFBOVcsU0FBQTNFLFVBQUFnTCxFQUFBckcsZUFDQW5QLElBQUF3VixFQUFBNEosWUFBQTZHLEVBQUE3RyxXQUFBNVUsVUFBQWdMLEVBQUE0SixpQkFDQXBmLElBQUF3VixFQUFBbEcsT0FBQTJXLEVBQUEzVyxNQUFBOUUsVUFBQWdMLEVBQUFsRyxhQUlBdFAsSUFBQXdWLEVBQUFxYSxJQUFBNUosRUFBQTRKLEdBQUFybEIsVUFBQWdMLEVBQUFxYSxTQUVBN3ZCLElBQUF3VixFQUFBMGdCLGFBQUFqUSxFQUFBaVEsV0FBQTFnQixFQUFBMGdCLGlCQUNBbDJCLElBQUF3VixFQUFBMmdCLGdCQUFBbFEsRUFBQWtRLGNBQUEzZ0IsRUFBQTJnQixlQUVBM2dCLEVBQUFzM0UsY0FFQTlzRixJQUFBd1YsRUFBQXMzRSxPQUFBSixZQUFBem1FLEVBQUE2bUUsT0FBQUosVUFBQWwzRSxFQUFBczNFLE9BQUFKLGdCQUNBMXNGLElBQUF3VixFQUFBczNFLE9BQUFRLE9BQUFybkUsRUFBQTZtRSxPQUFBUSxLQUFBOTNFLEVBQUFzM0UsT0FBQVEsV0FDQXR0RixJQUFBd1YsRUFBQXMzRSxPQUFBUyxhQUFBdG5FLEVBQUE2bUUsT0FBQVMsV0FBQS8zRSxFQUFBczNFLE9BQUFTLGlCQUNBdnRGLElBQUF3VixFQUFBczNFLE9BQUF0b0UsU0FBQXlCLEVBQUE2bUUsT0FBQXRvRSxPQUFBaFAsRUFBQXMzRSxPQUFBdG9FLGFBQ0F4a0IsSUFBQXdWLEVBQUFzM0UsT0FBQVcsU0FBQXhuRSxFQUFBNm1FLE9BQUFXLFFBQUFqakYsVUFBQWdMLEVBQUFzM0UsT0FBQVcsY0FDQXp0RixJQUFBd1YsRUFBQXMzRSxPQUFBNXBFLFNBQUErQyxFQUFBNm1FLE9BQUE1cEUsT0FBQWpqQixLQUFBd3lGLFlBQUFqOUUsRUFBQXMzRSxPQUFBNXBFLGVBSUFsakIsSUFBQXdWLEVBQUF5Z0IsVUFBQWhRLEVBQUFnUSxRQUFBemdCLEVBQUF5Z0IsY0FDQWoyQixJQUFBd1YsRUFBQTRnQixnQkFBQW5RLEVBQUFtUSxjQUFBNWdCLEVBQUE0Z0Isb0JBQ0FwMkIsSUFBQXdWLEVBQUE2Z0IsY0FBQXBRLEVBQUFvUSxZQUFBN2dCLEVBQUE2Z0Isa0JBQ0FyMkIsSUFBQXdWLEVBQUE0QyxXQUFBNk4sRUFBQTdOLFNBQUE1QyxFQUFBNEMsZUFDQXBZLElBQUF3VixFQUFBMGUsU0FBQWpPLEVBQUFpTyxPQUFBUCxLQUFBbmUsRUFBQTBlLGFBRUFsMEIsSUFBQXdWLEVBQUErUixTQUFBLENBRUEsTUFBQUEsRUFBQS9SLEVBQUErUixTQUVBLElBQUEsSUFBQXZtQixFQUFBLEVBQUFBLEVBQUF1bUIsRUFBQXJtQixPQUFBRixJQUVBaWxCLEVBQUFwZSxJQUFBNUgsS0FBQXd5RixZQUFBbHJFLEVBQUF2bUIsR0FBQXM0QixFQUFBQyxFQUFBMWdCLEVBQUF5ZCxHQUlBLENBRUEsUUFBQXQyQixJQUFBd1YsRUFBQThnQixXQUFBLENBRUEsTUFBQXc5RCxFQUFBdCtFLEVBQUE4Z0IsV0FFQSxJQUFBLElBQUF0MUIsRUFBQSxFQUFBQSxFQUFBOHlGLEVBQUE1eUYsT0FBQUYsSUFBQSxDQUVBLE1BQUE2VSxFQUFBaStFLEVBQUE5eUYsR0FFQWlsQixFQUFBcVEsV0FBQWoyQixLQUFBaTJCLEVBQUF6Z0IsR0FFQSxDQUVBLENBRUEsR0FBQSxRQUFBTCxFQUFBMVYsS0FBQSxNQUVBRSxJQUFBd1YsRUFBQXUxQyxhQUFBOWtDLEVBQUE4a0MsV0FBQXYxQyxFQUFBdTFDLFlBRUEsTUFBQUQsRUFBQXQxQyxFQUFBczFDLE9BRUEsSUFBQSxJQUFBN3BELEVBQUEsRUFBQUEsRUFBQTZwRCxFQUFBNXBELE9BQUFELElBQUEsQ0FFQSxNQUFBK3BELEVBQUFGLEVBQUE3cEQsR0FDQWkwQixFQUFBalAsRUFBQXFTLG9CQUFBLE9BQUEweUIsRUFBQS9rQyxhQUVBam1CLElBQUFrMUIsR0FFQWpQLEVBQUFnbEMsU0FBQS8xQixFQUFBODFCLEVBQUF6ekIsU0FBQXl6QixFQUFBRSxXQUlBLENBRUEsQ0FFQSxPQUFBamxDLENBRUEsQ0FFQSxhQUFBMHNFLENBQUExc0UsRUFBQXdULEdBRUEsSUFBQWptQixPQUFBeUYsS0FBQXdnQixHQUFBdjRCLFFBRUEra0IsRUFBQThTLFVBQUEsU0FBQTdELEdBRUEsSUFBQSxJQUFBQSxFQUFBMEgsb0JBQUE1OEIsSUFBQWsxQixFQUFBNkgsU0FBQSxDQUVBLE1BQUFBLEVBQUF0RCxFQUFBdkUsRUFBQTZILGVBRUEvOEIsSUFBQSs4QixFQUVBbDJCLFFBQUFDLEtBQUEsbURBQUFvdUIsRUFBQTZILFVBSUE3SCxFQUFBazNCLEtBQUFydkIsRUFBQTdILEVBQUE0SCxXQUlBLENBRUEsR0FFQSxDQUVBLGdCQUFBODFELENBQUEzc0UsR0FFQUEsRUFBQThTLFVBQUEsU0FBQTdELEdBRUEsR0FBQUEsRUFBQXk2RCxvQkFBQXo2RCxFQUFBdTVELFlBQUEsQ0FFQSxNQUFBNTRFLEVBQUFxZixFQUFBcjBCLE9BRUFBLEVBQUFvbEIsRUFBQXFTLG9CQUFBLE9BQUF6aUIsR0FJQXFmLEVBQUFyMEIsWUFGQWIsSUFBQWEsRUFFQUEsRUFJQSxJQUFBdTBCLEVBSUEsQ0FFQSxHQUVBLEVBSUEsTUFBQW8rRCxHQUFBLENBQ0F6OEYsVUFBQUEsR0FDQUMsc0JBQUFBLEdBQ0FDLHNCeks1ckJZLEl5SzZyQlpDLGlDektyckJZLEl5S3NyQlpDLGlDeks5cUJZLEl5SytxQlpDLHdCekt2cUJZLEt5SzBxQlpxOEYsR0FBQSxDQUNBcDhGLGVBQUFBLEdBQ0FDLG9CQUFBQSxHQUNBQyx1QkFBQUEsSUFHQW04RixHQUFBLENBQ0FsOEYsY0FBQUEsR0FDQUMsMkJ6S3ZvQlksS3lLd29CWkUsMEJ6SzduQlksS3lLOG5CWkUsYUFBQUEsR0FDQUMsMEJ6SzFtQlksS3lLMm1CWkUseUJBQUFBLElDdHJDQSxNQUFBKzdGLFdBQUFwTSxHQU9BLFdBQUE5a0YsQ0FBQStrRixHQUVBcHdFLE1BQUFvd0UsR0FTQTNuRixLQUFBK3pGLHFCQUFBLEVBRUEsb0JBQUFDLG1CQUVBcHRGLFFBQUFDLEtBQUEsK0RBSUEsb0JBQUF1aUYsT0FFQXhpRixRQUFBQyxLQUFBLG1EQVVBN0csS0FBQW1iLFFBQUEsQ0FBQW5ELGlCQUFBLE9BRUEsQ0FTQSxVQUFBaThFLENBQUE5NEUsR0FJQSxPQUZBbmIsS0FBQW1iLFFBQUFBLEVBRUFuYixJQUVBLENBV0EsSUFBQWdvRixDQUFBM3hFLEVBQUFnd0UsRUFBQUMsRUFBQUMsUUFFQXhtRixJQUFBc1csSUFBQUEsRUFBQSxTQUVBdFcsSUFBQUMsS0FBQTRsRSxPQUFBdnZELEVBQUFyVyxLQUFBNGxFLEtBQUF2dkQsR0FFQUEsRUFBQXJXLEtBQUEybkYsUUFBQVYsV0FBQTV3RSxHQUVBLE1BQUFzbkMsRUFBQTM5QyxLQUVBOG9GLEVBQUE3QyxHQUFBeE0sSUFBQXBqRSxHQUVBLFFBQUF0VyxJQUFBK29GLEVBS0EsT0FIQW5yQyxFQUFBZ3FDLFFBQUFiLFVBQUF6d0UsR0FHQXl5RSxFQUFBTyxVQUVBUCxFQUFBTyxNQUFBNkssSUFFQTdOLEdBQUFBLEVBQUE2TixHQUVBdjJDLEVBQUFncUMsUUFBQVosUUFBQTF3RSxFQUFBLElBRUErMEUsT0FBQTVpRixJQUVBKzlFLEdBQUFBLEVBQUEvOUUsRUFBQSxLQVFBNEksWUFBQSxXQUVBaTFFLEdBQUFBLEVBQUF5QyxHQUVBbnJDLEVBQUFncUMsUUFBQVosUUFBQTF3RSxFQUVBLEdBQUEsR0FFQXl5RSxHQUlBLE1BQUFxTCxFQUFBLENBQUEsRUFDQUEsRUFBQWhMLFlBQUEsY0FBQW5wRixLQUFBNG5GLFlBQUEsY0FBQSxVQUNBdU0sRUFBQWxMLFFBQUFqcEYsS0FBQStuRixjQUVBLE1BQUFxTSxFQUFBaEwsTUFBQS95RSxFQUFBODlFLEdBQUE5SyxNQUFBLFNBQUFnTCxHQUVBLE9BQUFBLEVBQUF6SixNQUVBLElBQUF2QixNQUFBLFNBQUF1QixHQUVBLE9BQUFvSixrQkFBQXBKLEVBQUFyM0UsT0FBQUMsT0FBQW1xQyxFQUFBeGlDLFFBQUEsQ0FBQW01RSxxQkFBQSxTQUVBLElBQUFqTCxNQUFBLFNBQUE2SyxHQVFBLE9BTkFqTyxHQUFBcitFLElBQUF5TyxFQUFBNjlFLEdBRUE3TixHQUFBQSxFQUFBNk4sR0FFQXYyQyxFQUFBZ3FDLFFBQUFaLFFBQUExd0UsR0FFQTY5RSxDQUVBLElBQUE5SSxPQUFBLFNBQUE1aUYsR0FFQSs5RSxHQUFBQSxFQUFBLzlFLEdBRUF5OUUsR0FBQWh1RCxPQUFBNWhCLEdBRUFzbkMsRUFBQWdxQyxRQUFBWCxVQUFBM3dFLEdBQ0FzbkMsRUFBQWdxQyxRQUFBWixRQUFBMXdFLEVBRUEsSUFFQTR2RSxHQUFBcitFLElBQUF5TyxFQUFBKzlFLEdBQ0F6MkMsRUFBQWdxQyxRQUFBYixVQUFBendFLEVBRUEsRUMvS0EsSUFBQWsrRSxHQU9BLE1BQUFDLEdBT0EsaUJBQUEzL0UsR0FRQSxZQU5BOVUsSUFBQXcwRixLQUVBQSxHQUFBLElBQUFFLE9BQUFELGNBQUFDLE9BQUFDLHFCQUlBSCxFQUVBLENBT0EsaUJBQUFJLENBQUExeUYsR0FFQXN5RixHQUFBdHlGLENBRUEsRUNkQSxNQUFBMnlGLFdBQUFsTixHQU9BLFdBQUE5a0YsQ0FBQStrRixHQUVBcHdFLE1BQUFvd0UsRUFFQSxDQVdBLElBQUFLLENBQUEzeEUsRUFBQWd3RSxFQUFBQyxFQUFBQyxHQUVBLE1BQUE1b0MsRUFBQTM5QyxLQUVBcW5GLEVBQUEsSUFBQXNCLEdBQUEzb0YsS0FBQTJuRixTQTRCQSxTQUFBa04sRUFBQXJzRixHQUVBKzlFLEVBRUFBLEVBQUEvOUUsR0FJQTVCLFFBQUFteEIsTUFBQXZ2QixHQUlBbTFDLEVBQUFncUMsUUFBQVgsVUFBQTN3RSxFQUVBLENBekNBZ3hFLEVBQUFrRSxnQkFBQSxlQUNBbEUsRUFBQWUsUUFBQXBvRixLQUFBNGxFLE1BQ0F5aEIsRUFBQWlCLGlCQUFBdG9GLEtBQUErbkYsZUFDQVYsRUFBQWMsbUJBQUFub0YsS0FBQTZuRixpQkFDQVIsRUFBQVcsS0FBQTN4RSxHQUFBLFNBQUFuRyxHQUVBLElBSUEsTUFBQTRrRixFQUFBNWtGLEVBQUFwUCxNQUFBLEdBRUEwekYsR0FBQTMvRSxhQUNBa2dGLGdCQUFBRCxHQUFBLFNBQUFFLEdBRUEzTyxFQUFBMk8sRUFFQSxJQUFBNUosTUFBQXlKLEVBRUEsQ0FBQSxNQUFBcnNGLEdBRUFxc0YsRUFBQXJzRixFQUVBLENBRUEsR0FBQTg5RSxFQUFBQyxFQWtCQSxFQ3ZGQSxNQUFBME8sR0FBQSxJQUFBdG5FLEdBQ0F1bkUsR0FBQSxJQUFBdm5FLEdBQ0F3bkUsR0FBQSxJQUFBeG5FLEdBUUEsTUFBQXluRSxHQUtBLFdBQUF4eUYsR0FTQTVDLEtBQUFILEtBQUEsZUFRQUcsS0FBQW9oRCxPQUFBLEVBU0FwaEQsS0FBQXExRixPQUFBLEtBUUFyMUYsS0FBQXMxRixRQUFBLElBQUFwMEMsR0FDQWxoRCxLQUFBczFGLFFBQUFyaEUsT0FBQUwsT0FBQSxHQUNBNXpCLEtBQUFzMUYsUUFBQXg5RSxrQkFBQSxFQVFBOVgsS0FBQXUxRixRQUFBLElBQUFyMEMsR0FDQWxoRCxLQUFBdTFGLFFBQUF0aEUsT0FBQUwsT0FBQSxHQUNBNXpCLEtBQUF1MUYsUUFBQXo5RSxrQkFBQSxFQUVBOVgsS0FBQTBRLE9BQUEsQ0FDQTZ3QyxNQUFBLEtBQ0FKLElBQUEsS0FDQUMsT0FBQSxLQUNBM3VCLEtBQUEsS0FDQUMsSUFBQSxLQUNBNHVCLEtBQUEsS0FDQSt6QyxPQUFBLEtBR0EsQ0FPQSxNQUFBLzFFLENBQUEyRCxHQUVBLE1BQUFrYSxFQUFBbjlCLEtBQUEwUSxPQU1BLEdBSkF5c0IsRUFBQW9rQixRQUFBdCtCLEVBQUFzK0IsT0FBQXBrQixFQUFBZ2tCLE1BQUFsK0IsRUFBQWsrQixLQUNBaGtCLEVBQUFpa0IsU0FBQW4rQixFQUFBbStCLE9BQUFwaEQsS0FBQW9oRCxRQUFBamtCLEVBQUExSyxPQUFBeFAsRUFBQXdQLE1BQ0EwSyxFQUFBekssTUFBQXpQLEVBQUF5UCxLQUFBeUssRUFBQW1rQixPQUFBcitCLEVBQUFxK0IsTUFBQW5rQixFQUFBazRELFNBQUFyMUYsS0FBQXExRixPQUVBLENBRUFsNEQsRUFBQW9rQixNQUFBdCtCLEVBQUFzK0IsTUFDQXBrQixFQUFBZ2tCLElBQUFsK0IsRUFBQWsrQixJQUNBaGtCLEVBQUFpa0IsT0FBQW4rQixFQUFBbStCLE9BQUFwaEQsS0FBQW9oRCxPQUNBamtCLEVBQUExSyxLQUFBeFAsRUFBQXdQLEtBQ0EwSyxFQUFBekssSUFBQXpQLEVBQUF5UCxJQUNBeUssRUFBQW1rQixLQUFBcitCLEVBQUFxK0IsS0FDQW5rQixFQUFBazRELE9BQUFyMUYsS0FBQXExRixPQUtBRixHQUFBenRGLEtBQUF1YixFQUFBdFIsa0JBQ0EsTUFBQTZqRixFQUFBcjRELEVBQUFrNEQsT0FBQSxFQUNBSSxFQUFBRCxFQUFBcjRELEVBQUExSyxLQUFBMEssRUFBQW9rQixNQUNBbTBDLEVBQUF2NEQsRUFBQTFLLEtBQUFueEIsS0FBQTBuQyxJQUFBM25DLEdBQUE4N0IsRUFBQWdrQixJQUFBLElBQUFoa0IsRUFBQW1rQixLQUNBLElBQUFxMEMsRUFBQUMsRUFJQVYsR0FBQXpzRixTQUFBLEtBQUErc0YsRUFDQVAsR0FBQXhzRixTQUFBLElBQUErc0YsRUFJQUcsR0FBQUQsRUFBQXY0RCxFQUFBaWtCLE9BQUFxMEMsRUFDQUcsRUFBQUYsRUFBQXY0RCxFQUFBaWtCLE9BQUFxMEMsRUFFQU4sR0FBQTFzRixTQUFBLEdBQUEsRUFBQTAwQixFQUFBMUssTUFBQW1qRSxFQUFBRCxHQUNBUixHQUFBMXNGLFNBQUEsSUFBQW10RixFQUFBRCxJQUFBQyxFQUFBRCxHQUVBMzFGLEtBQUFzMUYsUUFBQTNqRixpQkFBQWpLLEtBQUF5dEYsSUFJQVEsR0FBQUQsRUFBQXY0RCxFQUFBaWtCLE9BQUFxMEMsRUFDQUcsRUFBQUYsRUFBQXY0RCxFQUFBaWtCLE9BQUFxMEMsRUFFQU4sR0FBQTFzRixTQUFBLEdBQUEsRUFBQTAwQixFQUFBMUssTUFBQW1qRSxFQUFBRCxHQUNBUixHQUFBMXNGLFNBQUEsSUFBQW10RixFQUFBRCxJQUFBQyxFQUFBRCxHQUVBMzFGLEtBQUF1MUYsUUFBQTVqRixpQkFBQWpLLEtBQUF5dEYsR0FFQSxDQUVBbjFGLEtBQUFzMUYsUUFBQWp5RSxZQUFBM2IsS0FBQXViLEVBQUFJLGFBQUFsYixTQUFBK3NGLElBQ0FsMUYsS0FBQXUxRixRQUFBbHlFLFlBQUEzYixLQUFBdWIsRUFBQUksYUFBQWxiLFNBQUE4c0YsR0FFQSxFQ2hJQSxNQUFBWSxXQUFBMzBDLEdBT0EsV0FBQXQrQyxDQUFBL0IsRUFBQSxJQUVBMFcsUUFTQXZYLEtBQUE4MUYsZUFBQSxFQU9BOTFGLEtBQUF3akQsUUFBQTNpRCxFQUNBYixLQUFBUSxNQUFBLENBRUEsRUN0Q0EsTUFBQXUxRixHQVFBLFdBQUFuekYsQ0FBQW96RixHQUFBLEdBU0FoMkYsS0FBQWcyRixVQUFBQSxFQVFBaDJGLEtBQUFxaUYsVUFBQSxFQVNBcmlGLEtBQUFpMkYsUUFBQSxFQVFBajJGLEtBQUFrMkYsWUFBQSxFQVFBbDJGLEtBQUFtMkYsU0FBQSxDQUVBLENBTUEsS0FBQTFnRCxHQUVBejFDLEtBQUFxaUYsVUFBQStULEtBRUFwMkYsS0FBQWkyRixRQUFBajJGLEtBQUFxaUYsVUFDQXJpRixLQUFBazJGLFlBQUEsRUFDQWwyRixLQUFBbTJGLFNBQUEsQ0FFQSxDQUtBLElBQUE1cEIsR0FFQXZzRSxLQUFBcTJGLGlCQUNBcjJGLEtBQUFtMkYsU0FBQSxFQUNBbjJGLEtBQUFnMkYsV0FBQSxDQUVBLENBT0EsY0FBQUssR0FHQSxPQURBcjJGLEtBQUFzMkYsV0FDQXQyRixLQUFBazJGLFdBRUEsQ0FPQSxRQUFBSSxHQUVBLElBQUFqekIsRUFBQSxFQUVBLEdBQUFyakUsS0FBQWcyRixZQUFBaDJGLEtBQUFtMkYsUUFHQSxPQURBbjJGLEtBQUF5MUMsUUFDQSxFQUlBLEdBQUF6MUMsS0FBQW0yRixRQUFBLENBRUEsTUFBQUksRUFBQUgsS0FFQS95QixHQUFBa3pCLEVBQUF2MkYsS0FBQWkyRixTQUFBLElBQ0FqMkYsS0FBQWkyRixRQUFBTSxFQUVBdjJGLEtBQUFrMkYsYUFBQTd5QixDQUVBLENBRUEsT0FBQUEsQ0FFQSxFQUlBLFNBQUEreUIsS0FFQSxPQUFBSSxZQUFBSixLQUVBLENDN0hBLE1BQUFLLEdBQUEsSUFBQXowRSxHQUNBMDBFLEdBQUEsSUFBQXA1RSxHQUNBcTVFLEdBQUEsSUFBQTMwRSxHQUNBNDBFLEdBQUEsSUFBQTUwRSxHQVlBLE1BQUE2MEUsV0FBQTFoRSxHQUtBLFdBQUF2eUIsR0FFQTJVLFFBRUF2WCxLQUFBSCxLQUFBLGdCQVFBRyxLQUFBNFUsUUFBQTQvRSxHQUFBMy9FLGFBUUE3VSxLQUFBODJGLEtBQUE5MkYsS0FBQTRVLFFBQUFtaUYsYUFDQS8yRixLQUFBODJGLEtBQUFoeEMsUUFBQTlsRCxLQUFBNFUsUUFBQW9pRixhQVdBaDNGLEtBQUEwNEQsT0FBQSxLQVNBMTRELEtBQUFpM0YsVUFBQSxFQUlBajNGLEtBQUFrM0YsT0FBQSxJQUFBbkIsRUFFQSxDQVNBLFFBQUFvQixHQUVBLE9BQUFuM0YsS0FBQTgyRixJQUVBLENBT0EsWUFBQU0sR0FXQSxPQVRBLE9BQUFwM0YsS0FBQTA0RCxTQUVBMTRELEtBQUE4MkYsS0FBQTN3QyxXQUFBbm1ELEtBQUEwNEQsUUFDQTE0RCxLQUFBMDRELE9BQUF2UyxXQUFBbm1ELEtBQUE0VSxRQUFBb2lGLGFBQ0FoM0YsS0FBQTgyRixLQUFBaHhDLFFBQUE5bEQsS0FBQTRVLFFBQUFvaUYsYUFDQWgzRixLQUFBMDRELE9BQUEsTUFJQTE0RCxJQUVBLENBT0EsU0FBQXEzRixHQUVBLE9BQUFyM0YsS0FBQTA0RCxNQUVBLENBUUEsU0FBQTQrQixDQUFBcjFGLEdBaUJBLE9BZkEsT0FBQWpDLEtBQUEwNEQsUUFFQTE0RCxLQUFBODJGLEtBQUEzd0MsV0FBQW5tRCxLQUFBMDRELFFBQ0ExNEQsS0FBQTA0RCxPQUFBdlMsV0FBQW5tRCxLQUFBNFUsUUFBQW9pRixjQUlBaDNGLEtBQUE4MkYsS0FBQTN3QyxXQUFBbm1ELEtBQUE0VSxRQUFBb2lGLGFBSUFoM0YsS0FBQTA0RCxPQUFBejJELEVBQ0FqQyxLQUFBODJGLEtBQUFoeEMsUUFBQTlsRCxLQUFBMDRELFFBQ0ExNEQsS0FBQTA0RCxPQUFBNVMsUUFBQTlsRCxLQUFBNFUsUUFBQW9pRixhQUVBaDNGLElBRUEsQ0FPQSxlQUFBdTNGLEdBRUEsT0FBQXYzRixLQUFBODJGLEtBQUFBLEtBQUE3MEYsS0FFQSxDQVNBLGVBQUF1MUYsQ0FBQXYxRixHQUlBLE9BRkFqQyxLQUFBODJGLEtBQUFBLEtBQUFXLGdCQUFBeDFGLEVBQUFqQyxLQUFBNFUsUUFBQThpRixZQUFBLEtBRUExM0YsSUFFQSxDQUVBLGlCQUFBaTVCLENBQUFDLEdBRUEzaEIsTUFBQTBoQixrQkFBQUMsR0FFQSxNQUFBcDVCLEVBQUFFLEtBQUE0VSxRQUFBOVUsU0FDQTh2QixFQUFBNXZCLEtBQUE0dkIsR0FRQSxHQU5BNXZCLEtBQUFpM0YsVUFBQWozRixLQUFBazNGLE9BQUFaLFdBRUF0MkYsS0FBQXFqQixZQUFBME8sVUFBQTBrRSxHQUFBQyxHQUFBQyxJQUVBQyxHQUFBandGLElBQUEsRUFBQSxHQUFBLEdBQUF5YixnQkFBQXMwRSxJQUVBNTJGLEVBQUE2M0YsVUFBQSxDQUlBLE1BQUFyVixFQUFBdGlGLEtBQUE0VSxRQUFBOGlGLFlBQUExM0YsS0FBQWkzRixVQUVBbjNGLEVBQUE2M0YsVUFBQUMsd0JBQUFuQixHQUFBajBGLEVBQUE4L0UsR0FDQXhpRixFQUFBKzNGLFVBQUFELHdCQUFBbkIsR0FBQWgwRixFQUFBNi9FLEdBQ0F4aUYsRUFBQWc0RixVQUFBRix3QkFBQW5CLEdBQUFuOUUsRUFBQWdwRSxHQUNBeGlGLEVBQUFpNEYsU0FBQUgsd0JBQUFoQixHQUFBcDBGLEVBQUE4L0UsR0FDQXhpRixFQUFBazRGLFNBQUFKLHdCQUFBaEIsR0FBQW4wRixFQUFBNi9FLEdBQ0F4aUYsRUFBQW00RixTQUFBTCx3QkFBQWhCLEdBQUF0OUUsRUFBQWdwRSxHQUNBeGlGLEVBQUFvNEYsSUFBQU4sd0JBQUFob0UsRUFBQXB0QixFQUFBOC9FLEdBQ0F4aUYsRUFBQXE0RixJQUFBUCx3QkFBQWhvRSxFQUFBbnRCLEVBQUE2L0UsR0FDQXhpRixFQUFBczRGLElBQUFSLHdCQUFBaG9FLEVBQUF0VyxFQUFBZ3BFLEVBRUEsTUFFQXhpRixFQUFBNndCLFlBQUE4bEUsR0FBQWowRixFQUFBaTBGLEdBQUFoMEYsRUFBQWcwRixHQUFBbjlFLEdBQ0F4WixFQUFBdTRGLGVBQUF6QixHQUFBcDBGLEVBQUFvMEYsR0FBQW4wRixFQUFBbTBGLEdBQUF0OUUsRUFBQXNXLEVBQUFwdEIsRUFBQW90QixFQUFBbnRCLEVBQUFtdEIsRUFBQXRXLEVBSUEsRUNyTEEsTUFBQWcvRSxXQUFBbmpFLEdBT0EsV0FBQXZ5QixDQUFBOUMsR0FFQXlYLFFBRUF2WCxLQUFBSCxLQUFBLFFBUUFHLEtBQUFGLFNBQUFBLEVBUUFFLEtBQUE0VSxRQUFBOVUsRUFBQThVLFFBUUE1VSxLQUFBODJGLEtBQUE5MkYsS0FBQTRVLFFBQUFtaUYsYUFDQS8yRixLQUFBODJGLEtBQUFoeEMsUUFBQWhtRCxFQUFBcTNGLFlBUUFuM0YsS0FBQXU0RixVQUFBLEVBV0F2NEYsS0FBQWtRLE9BQUEsS0FZQWxRLEtBQUF3NEYsT0FBQSxFQVdBeDRGLEtBQUF5NEYsTUFBQSxFQVNBejRGLEtBQUEwNEYsVUFBQSxFQVNBMTRGLEtBQUEyNEYsUUFBQSxFQVNBMzRGLEtBQUF3SyxPQUFBLEVBUUF4SyxLQUFBNmpGLGNBQUE5akYsRUFXQUMsS0FBQTQ0RixhQUFBLEVBWUE1NEYsS0FBQTY0RixXQUFBLEVBYUE3NEYsS0FBQTg0RixvQkFBQSxFQVdBOTRGLEtBQUF5WCxPQUFBLEtBV0F6WCxLQUFBKzRGLFdBQUEsUUFFQS80RixLQUFBZzVGLFdBQUEsRUFDQWg1RixLQUFBaTVGLFVBQUEsRUFDQWo1RixLQUFBazVGLFlBQUEsRUFXQWw1RixLQUFBbTVGLFFBQUEsRUFFQSxDQU9BLFNBQUFDLEdBRUEsT0FBQXA1RixLQUFBODJGLElBRUEsQ0FVQSxhQUFBdUMsQ0FBQUMsR0FPQSxPQUxBdDVGLEtBQUE4NEYsb0JBQUEsRUFDQTk0RixLQUFBKzRGLFdBQUEsWUFDQS80RixLQUFBeVgsT0FBQTZoRixFQUNBdDVGLEtBQUE4bEQsVUFFQTlsRCxJQUVBLENBVUEscUJBQUF1NUYsQ0FBQUMsR0FPQSxPQUxBeDVGLEtBQUE4NEYsb0JBQUEsRUFDQTk0RixLQUFBKzRGLFdBQUEsWUFDQS80RixLQUFBeVgsT0FBQXpYLEtBQUE0VSxRQUFBNmtGLHlCQUFBRCxHQUNBeDVGLEtBQUE4bEQsVUFFQTlsRCxJQUVBLENBVUEsb0JBQUEwNUYsQ0FBQUMsR0FPQSxPQUxBMzVGLEtBQUE4NEYsb0JBQUEsRUFDQTk0RixLQUFBKzRGLFdBQUEsa0JBQ0EvNEYsS0FBQXlYLE9BQUF6WCxLQUFBNFUsUUFBQWdsRix3QkFBQUQsR0FDQTM1RixLQUFBOGxELFVBRUE5bEQsSUFFQSxDQVVBLFNBQUE2NUYsQ0FBQTdFLEdBT0EsT0FMQWgxRixLQUFBa1EsT0FBQThrRixFQUNBaDFGLEtBQUErNEYsV0FBQSxTQUVBLzRGLEtBQUF1NEYsVUFBQXY0RixLQUFBODVGLE9BRUE5NUYsSUFFQSxDQVVBLElBQUE4NUYsQ0FBQUMsRUFBQSxHQUVBLElBQUEsSUFBQS81RixLQUFBNjRGLFVBR0EsWUFEQWp5RixRQUFBQyxLQUFBLDBDQUtBLElBQUEsSUFBQTdHLEtBQUE4NEYsbUJBR0EsWUFEQWx5RixRQUFBQyxLQUFBLG9EQUtBN0csS0FBQWc1RixXQUFBaDVGLEtBQUE0VSxRQUFBOGlGLFlBQUFxQyxFQUVBLE1BQUF0aUYsRUFBQXpYLEtBQUE0VSxRQUFBb2xGLHFCQWVBLE9BZEF2aUYsRUFBQXZILE9BQUFsUSxLQUFBa1EsT0FDQXVILEVBQUFnaEYsS0FBQXo0RixLQUFBeTRGLEtBQ0FoaEYsRUFBQWloRixVQUFBMTRGLEtBQUEwNEYsVUFDQWpoRixFQUFBa2hGLFFBQUEzNEYsS0FBQTI0RixRQUNBbGhGLEVBQUF3aUYsUUFBQWo2RixLQUFBazZGLFFBQUEvdEMsS0FBQW5zRCxNQUNBeVgsRUFBQWcrQixNQUFBejFDLEtBQUFnNUYsV0FBQWg1RixLQUFBaTVGLFVBQUFqNUYsS0FBQXdLLE9BQUF4SyxLQUFBNmpGLFVBRUE3akYsS0FBQTY0RixXQUFBLEVBRUE3NEYsS0FBQXlYLE9BQUFBLEVBRUF6WCxLQUFBbTZGLFVBQUFuNkYsS0FBQXc0RixRQUNBeDRGLEtBQUFvNkYsZ0JBQUFwNkYsS0FBQTQ0RixjQUVBNTRGLEtBQUE4bEQsU0FFQSxDQVNBLEtBQUF1MEMsR0FFQSxJQUFBLElBQUFyNkYsS0FBQTg0RixtQkE0QkEsT0FyQkEsSUFBQTk0RixLQUFBNjRGLFlBSUE3NEYsS0FBQWk1RixXQUFBMzNGLEtBQUFhLElBQUFuQyxLQUFBNFUsUUFBQThpRixZQUFBMTNGLEtBQUFnNUYsV0FBQSxHQUFBaDVGLEtBQUE0NEYsY0FFQSxJQUFBNTRGLEtBQUF5NEYsT0FJQXo0RixLQUFBaTVGLFVBQUFqNUYsS0FBQWk1RixXQUFBajVGLEtBQUE2akYsVUFBQTdqRixLQUFBa1EsT0FBQTJ6RSxXQUlBN2pGLEtBQUF5WCxPQUFBODBELE9BQ0F2c0UsS0FBQXlYLE9BQUF3aUYsUUFBQSxLQUVBajZGLEtBQUE2NEYsV0FBQSxHQUlBNzRGLEtBMUJBNEcsUUFBQUMsS0FBQSxtREE0QkEsQ0FVQSxJQUFBMGxFLENBQUF3dEIsRUFBQSxHQUVBLElBQUEsSUFBQS81RixLQUFBODRGLG1CQWtCQSxPQVhBOTRGLEtBQUFpNUYsVUFBQSxFQUVBLE9BQUFqNUYsS0FBQXlYLFNBRUF6WCxLQUFBeVgsT0FBQTgwRCxLQUFBdnNFLEtBQUE0VSxRQUFBOGlGLFlBQUFxQyxHQUNBLzVGLEtBQUF5WCxPQUFBd2lGLFFBQUEsTUFJQWo2RixLQUFBNjRGLFdBQUEsRUFFQTc0RixLQWhCQTRHLFFBQUFDLEtBQUEsbURBa0JBLENBUUEsT0FBQWkvQyxHQUVBLEdBQUE5bEQsS0FBQW01RixRQUFBbDRGLE9BQUEsRUFBQSxDQUVBakIsS0FBQXlYLE9BQUFxdUMsUUFBQTlsRCxLQUFBbTVGLFFBQUEsSUFFQSxJQUFBLElBQUFwNEYsRUFBQSxFQUFBQyxFQUFBaEIsS0FBQW01RixRQUFBbDRGLE9BQUFGLEVBQUFDLEVBQUFELElBRUFmLEtBQUFtNUYsUUFBQXA0RixFQUFBLEdBQUEra0QsUUFBQTlsRCxLQUFBbTVGLFFBQUFwNEYsSUFJQWYsS0FBQW01RixRQUFBbjVGLEtBQUFtNUYsUUFBQWw0RixPQUFBLEdBQUE2a0QsUUFBQTlsRCxLQUFBbzVGLFlBRUEsTUFFQXA1RixLQUFBeVgsT0FBQXF1QyxRQUFBOWxELEtBQUFvNUYsYUFNQSxPQUZBcDVGLEtBQUFrNUYsWUFBQSxFQUVBbDVGLElBRUEsQ0FRQSxVQUFBbW1ELEdBRUEsSUFBQSxJQUFBbm1ELEtBQUFrNUYsV0FBQSxDQU1BLEdBQUFsNUYsS0FBQW01RixRQUFBbDRGLE9BQUEsRUFBQSxDQUVBakIsS0FBQXlYLE9BQUEwdUMsV0FBQW5tRCxLQUFBbTVGLFFBQUEsSUFFQSxJQUFBLElBQUFwNEYsRUFBQSxFQUFBQyxFQUFBaEIsS0FBQW01RixRQUFBbDRGLE9BQUFGLEVBQUFDLEVBQUFELElBRUFmLEtBQUFtNUYsUUFBQXA0RixFQUFBLEdBQUFvbEQsV0FBQW5tRCxLQUFBbTVGLFFBQUFwNEYsSUFJQWYsS0FBQW01RixRQUFBbjVGLEtBQUFtNUYsUUFBQWw0RixPQUFBLEdBQUFrbEQsV0FBQW5tRCxLQUFBbzVGLFlBRUEsTUFFQXA1RixLQUFBeVgsT0FBQTB1QyxXQUFBbm1ELEtBQUFvNUYsYUFNQSxPQUZBcDVGLEtBQUFrNUYsWUFBQSxFQUVBbDVGLElBdEJBLENBd0JBLENBT0EsVUFBQXM2RixHQUVBLE9BQUF0NkYsS0FBQW01RixPQUVBLENBUUEsVUFBQW9CLENBQUF0NEYsR0FnQkEsT0FkQUEsSUFBQUEsRUFBQSxLQUVBLElBQUFqQyxLQUFBazVGLFlBRUFsNUYsS0FBQW1tRCxhQUNBbm1ELEtBQUFtNUYsUUFBQWwzRixFQUFBbkIsUUFDQWQsS0FBQThsRCxXQUlBOWxELEtBQUFtNUYsUUFBQWwzRixFQUFBbkIsUUFJQWQsSUFFQSxDQVFBLFNBQUFtNkYsQ0FBQWw0RixHQVVBLE9BUkFqQyxLQUFBdzRGLE9BQUF2MkYsR0FFQSxJQUFBakMsS0FBQTY0RixnQkFBQTk0RixJQUFBQyxLQUFBeVgsT0FBQStnRixRQUVBeDRGLEtBQUF5WCxPQUFBK2dGLE9BQUFmLGdCQUFBejNGLEtBQUF3NEYsT0FBQXg0RixLQUFBNFUsUUFBQThpRixZQUFBLEtBSUExM0YsSUFFQSxDQU9BLFNBQUF3NkYsR0FFQSxPQUFBeDZGLEtBQUF3NEYsTUFFQSxDQU9BLFNBQUFuQixHQUVBLE9BQUFyM0YsS0FBQXM2RixhQUFBLEVBRUEsQ0FRQSxTQUFBaEQsQ0FBQTUrQixHQUVBLE9BQUExNEQsS0FBQXU2RixXQUFBN2hDLEVBQUEsQ0FBQUEsR0FBQSxHQUVBLENBVUEsZUFBQTBoQyxDQUFBbjRGLEdBRUEsSUFBQSxJQUFBakMsS0FBQTg0RixtQkFlQSxPQVJBOTRGLEtBQUE0NEYsYUFBQTMyRixHQUVBLElBQUFqQyxLQUFBNjRGLFdBRUE3NEYsS0FBQXlYLE9BQUFtaEYsYUFBQW5CLGdCQUFBejNGLEtBQUE0NEYsYUFBQTU0RixLQUFBNFUsUUFBQThpRixZQUFBLEtBSUExM0YsS0FiQTRHLFFBQUFDLEtBQUEsbURBZUEsQ0FPQSxlQUFBNHpGLEdBRUEsT0FBQXo2RixLQUFBNDRGLFlBRUEsQ0FLQSxPQUFBc0IsR0FFQWw2RixLQUFBNjRGLFdBQUEsRUFDQTc0RixLQUFBaTVGLFVBQUEsQ0FFQSxDQVNBLE9BQUF5QixHQUVBLE9BQUEsSUFBQTE2RixLQUFBODRGLG9CQUVBbHlGLFFBQUFDLEtBQUEscURBQ0EsR0FJQTdHLEtBQUF5NEYsSUFFQSxDQVVBLE9BQUFrQyxDQUFBMTRGLEdBRUEsSUFBQSxJQUFBakMsS0FBQTg0RixtQkFlQSxPQVJBOTRGLEtBQUF5NEYsS0FBQXgyRixHQUVBLElBQUFqQyxLQUFBNjRGLFlBRUE3NEYsS0FBQXlYLE9BQUFnaEYsS0FBQXo0RixLQUFBeTRGLE1BSUF6NEYsS0FiQTRHLFFBQUFDLEtBQUEsbURBZUEsQ0FTQSxZQUFBK3pGLENBQUEzNEYsR0FJQSxPQUZBakMsS0FBQTA0RixVQUFBejJGLEVBRUFqQyxJQUVBLENBU0EsVUFBQTY2RixDQUFBNTRGLEdBSUEsT0FGQWpDLEtBQUEyNEYsUUFBQTEyRixFQUVBakMsSUFFQSxDQU9BLFNBQUE4NkYsR0FFQSxPQUFBOTZGLEtBQUE4MkYsS0FBQUEsS0FBQTcwRixLQUVBLENBUUEsU0FBQTg0RixDQUFBOTRGLEdBSUEsT0FGQWpDLEtBQUE4MkYsS0FBQUEsS0FBQVcsZ0JBQUF4MUYsRUFBQWpDLEtBQUE0VSxRQUFBOGlGLFlBQUEsS0FFQTEzRixJQUVBLENBRUEsSUFBQTBILENBQUErUCxFQUFBNmxCLEdBSUEsT0FGQS9sQixNQUFBN1AsS0FBQStQLEVBQUE2bEIsR0FFQSxXQUFBN2xCLEVBQUFzaEYsWUFFQW55RixRQUFBQyxLQUFBLG9EQUVBN0csT0FJQUEsS0FBQXU0RixTQUFBOWdGLEVBQUE4Z0YsU0FFQXY0RixLQUFBa1EsT0FBQXVILEVBQUF2SCxPQUNBbFEsS0FBQXc0RixPQUFBL2dGLEVBQUErZ0YsT0FDQXg0RixLQUFBeTRGLEtBQUFoaEYsRUFBQWdoRixLQUNBejRGLEtBQUEwNEYsVUFBQWpoRixFQUFBaWhGLFVBQ0ExNEYsS0FBQTI0RixRQUFBbGhGLEVBQUFraEYsUUFDQTM0RixLQUFBd0ssT0FBQWlOLEVBQUFqTixPQUNBeEssS0FBQTZqRixTQUFBcHNFLEVBQUFvc0UsU0FDQTdqRixLQUFBNDRGLGFBQUFuaEYsRUFBQW1oRixhQUNBNTRGLEtBQUE4NEYsbUJBQUFyaEYsRUFBQXFoRixtQkFDQTk0RixLQUFBKzRGLFdBQUF0aEYsRUFBQXNoRixXQUVBLzRGLEtBQUFtNUYsUUFBQTFoRixFQUFBMGhGLFFBQUFyNEYsUUFFQWQsS0FFQSxDQUVBLEtBQUF5SCxDQUFBNjFCLEdBRUEsT0FBQSxJQUFBdDlCLEtBQUE0QyxZQUFBNUMsS0FBQUYsVUFBQTRILEtBQUExSCxLQUFBczlCLEVBRUEsRUNod0JBLE1BQUEwOUQsR0FBQSxJQUFBaDVFLEdBQ0FpNUUsR0FBQSxJQUFBMzlFLEdBQ0E0OUUsR0FBQSxJQUFBbDVFLEdBQ0FtNUUsR0FBQSxJQUFBbjVFLEdBZ0NBLE1BQUFvNUUsV0FBQTlDLEdBT0EsV0FBQTExRixDQUFBOUMsR0FFQXlYLE1BQUF6WCxHQVNBRSxLQUFBcTdGLE9BQUFyN0YsS0FBQTRVLFFBQUEwbUYsZUFDQXQ3RixLQUFBcTdGLE9BQUFFLGFBQUEsT0FDQXY3RixLQUFBcTdGLE9BQUF2MUMsUUFBQTlsRCxLQUFBODJGLEtBRUEsQ0FFQSxPQUFBaHhDLEdBTUEsT0FKQXZ1QyxNQUFBdXVDLFVBRUE5bEQsS0FBQXE3RixPQUFBdjFDLFFBQUE5bEQsS0FBQTgyRixNQUVBOTJGLElBRUEsQ0FFQSxVQUFBbW1ELEdBTUEsT0FKQTV1QyxNQUFBNHVDLGFBRUFubUQsS0FBQXE3RixPQUFBbDFDLFdBQUFubUQsS0FBQTgyRixNQUVBOTJGLElBRUEsQ0FFQSxTQUFBbzVGLEdBRUEsT0FBQXA1RixLQUFBcTdGLE1BRUEsQ0FPQSxjQUFBRyxHQUVBLE9BQUF4N0YsS0FBQXE3RixPQUFBSSxXQUVBLENBVUEsY0FBQUMsQ0FBQXo1RixHQUlBLE9BRkFqQyxLQUFBcTdGLE9BQUFJLFlBQUF4NUYsRUFFQWpDLElBRUEsQ0FPQSxnQkFBQTI3RixHQUVBLE9BQUEzN0YsS0FBQXE3RixPQUFBTyxhQUVBLENBUUEsZ0JBQUFDLENBQUE1NUYsR0FJQSxPQUZBakMsS0FBQXE3RixPQUFBTyxjQUFBMzVGLEVBRUFqQyxJQUVBLENBT0EsZ0JBQUE4N0YsR0FFQSxPQUFBOTdGLEtBQUFxN0YsT0FBQVUsYUFFQSxDQVlBLGdCQUFBQyxDQUFBLzVGLEdBSUEsT0FGQWpDLEtBQUFxN0YsT0FBQVUsY0FBQTk1RixFQUVBakMsSUFFQSxDQU9BLGNBQUFpOEYsR0FFQSxPQUFBajhGLEtBQUFxN0YsT0FBQWEsV0FFQSxDQVdBLGNBQUFDLENBQUFsNkYsR0FJQSxPQUZBakMsS0FBQXE3RixPQUFBYSxZQUFBajZGLEVBRUFqQyxJQUVBLENBVUEsa0JBQUFvOEYsQ0FBQUMsRUFBQUMsRUFBQUMsR0FNQSxPQUpBdjhGLEtBQUFxN0YsT0FBQWdCLGVBQUFBLEVBQ0FyOEYsS0FBQXE3RixPQUFBaUIsZUFBQUEsRUFDQXQ4RixLQUFBcTdGLE9BQUFrQixjQUFBQSxFQUVBdjhGLElBRUEsQ0FFQSxpQkFBQWk1QixDQUFBQyxHQUlBLEdBRkEzaEIsTUFBQTBoQixrQkFBQUMsSUFFQSxJQUFBbDVCLEtBQUE4NEYscUJBQUEsSUFBQTk0RixLQUFBNjRGLFVBQUEsT0FFQTc0RixLQUFBcWpCLFlBQUEwTyxVQUFBaXBFLEdBQUFDLEdBQUFDLElBRUFDLEdBQUF4MEYsSUFBQSxFQUFBLEVBQUEsR0FBQXliLGdCQUFBNjRFLElBRUEsTUFBQUksRUFBQXI3RixLQUFBcTdGLE9BRUEsR0FBQUEsRUFBQTFELFVBQUEsQ0FJQSxNQUFBclYsRUFBQXRpRixLQUFBNFUsUUFBQThpRixZQUFBMTNGLEtBQUFGLFNBQUFtM0YsVUFFQW9FLEVBQUExRCxVQUFBQyx3QkFBQW9ELEdBQUF4NEYsRUFBQTgvRSxHQUNBK1ksRUFBQXhELFVBQUFELHdCQUFBb0QsR0FBQXY0RixFQUFBNi9FLEdBQ0ErWSxFQUFBdkQsVUFBQUYsd0JBQUFvRCxHQUFBMWhGLEVBQUFncEUsR0FDQStZLEVBQUFtQixhQUFBNUUsd0JBQUF1RCxHQUFBMzRGLEVBQUE4L0UsR0FDQStZLEVBQUFvQixhQUFBN0Usd0JBQUF1RCxHQUFBMTRGLEVBQUE2L0UsR0FDQStZLEVBQUFxQixhQUFBOUUsd0JBQUF1RCxHQUFBN2hGLEVBQUFncEUsRUFFQSxNQUVBK1ksRUFBQTFxRSxZQUFBcXFFLEdBQUF4NEYsRUFBQXc0RixHQUFBdjRGLEVBQUF1NEYsR0FBQTFoRixHQUNBK2hGLEVBQUFoRCxlQUFBOEMsR0FBQTM0RixFQUFBMjRGLEdBQUExNEYsRUFBQTA0RixHQUFBN2hGLEVBSUEsRUM3TkEsTUFBQXFqRixHQVFBLFdBQUEvNUYsQ0FBQWc2RixFQUFBQyxFQUFBLE1BT0E3OEYsS0FBQTg4RixTQUFBRixFQUFBaG9GLFFBQUFtb0YsaUJBQ0EvOEYsS0FBQTg4RixTQUFBRCxRQUFBQSxFQU9BNzhGLEtBQUF1VixLQUFBLElBQUF2UyxXQUFBaEQsS0FBQTg4RixTQUFBRSxtQkFFQUosRUFBQXhELFlBQUF0ekMsUUFBQTlsRCxLQUFBODhGLFNBRUEsQ0FZQSxnQkFBQUcsR0FJQSxPQUZBajlGLEtBQUE4OEYsU0FBQUkscUJBQUFsOUYsS0FBQXVWLE1BRUF2VixLQUFBdVYsSUFFQSxDQU9BLG1CQUFBNG5GLEdBRUEsSUFBQWw3RixFQUFBLEVBQ0EsTUFBQXNULEVBQUF2VixLQUFBaTlGLG1CQUVBLElBQUEsSUFBQWw4RixFQUFBLEVBQUFBLEVBQUF3VSxFQUFBdFUsT0FBQUYsSUFFQWtCLEdBQUFzVCxFQUFBeFUsR0FJQSxPQUFBa0IsRUFBQXNULEVBQUF0VSxNQUVBLEVDdkZBLE1BQUFtOEYsR0FTQSxXQUFBeDZGLENBQUF5NkYsRUFBQXRYLEVBQUFwSixHQWdCQSxJQUFBMmdCLEVBQ0FDLEVBQ0FDLEVBa0JBLE9BN0JBeDlGLEtBQUFxOUYsUUFBQUEsRUFPQXI5RixLQUFBMjhFLFVBQUFBLEVBc0JBb0osR0FFQSxJQUFBLGFBQ0F1WCxFQUFBdDlGLEtBQUF5OUYsT0FDQUYsRUFBQXY5RixLQUFBMDlGLGVBQ0FGLEVBQUF4OUYsS0FBQTI5RiwrQkFFQTM5RixLQUFBa1EsT0FBQSxJQUFBRixhQUFBLEVBQUEyc0UsR0FDQTM4RSxLQUFBNDlGLFdBQUEsRUFDQSxNQUVBLElBQUEsU0FDQSxJQUFBLE9BQ0FOLEVBQUF0OUYsS0FBQTY5RixRQUlBTixFQUFBdjlGLEtBQUE2OUYsUUFFQUwsRUFBQXg5RixLQUFBODlGLDBCQUVBOTlGLEtBQUFrUSxPQUFBLElBQUFvRyxNQUFBLEVBQUFxbUUsR0FDQSxNQUVBLFFBQ0EyZ0IsRUFBQXQ5RixLQUFBKzlGLE1BQ0FSLEVBQUF2OUYsS0FBQWcrRixjQUNBUixFQUFBeDlGLEtBQUFpK0YsNEJBRUFqK0YsS0FBQWtRLE9BQUEsSUFBQUYsYUFBQSxFQUFBMnNFLEdBSUEzOEUsS0FBQWsrRixpQkFBQVosRUFDQXQ5RixLQUFBbStGLHlCQUFBWixFQUNBdjlGLEtBQUFvK0YsYUFBQVosRUFDQXg5RixLQUFBcStGLFdBQUEsRUFDQXIrRixLQUFBcytGLFVBQUEsRUFRQXQrRixLQUFBdStGLGlCQUFBLEVBUUF2K0YsS0FBQXcrRix5QkFBQSxFQVFBeCtGLEtBQUF5K0YsU0FBQSxFQVFBeitGLEtBQUEwK0YsZUFBQSxDQUVBLENBUUEsVUFBQUMsQ0FBQUMsRUFBQW55QyxHQUtBLE1BQUF2OEMsRUFBQWxRLEtBQUFrUSxPQUNBZ3JDLEVBQUFsN0MsS0FBQTI4RSxVQUNBbnlFLEVBQUFvMEYsRUFBQTFqRCxFQUFBQSxFQUVBLElBQUEyakQsRUFBQTcrRixLQUFBdStGLGlCQUVBLEdBQUEsSUFBQU0sRUFBQSxDQUlBLElBQUEsSUFBQTk5RixFQUFBLEVBQUFBLElBQUFtNkMsSUFBQW42QyxFQUVBbVAsRUFBQTFGLEVBQUF6SixHQUFBbVAsRUFBQW5QLEdBSUE4OUYsRUFBQXB5QyxDQUVBLEtBQUEsQ0FJQW95QyxHQUFBcHlDLEVBQ0EsTUFBQXF5QyxFQUFBcnlDLEVBQUFveUMsRUFDQTcrRixLQUFBaytGLGlCQUFBaHVGLEVBQUExRixFQUFBLEVBQUFzMEYsRUFBQTVqRCxFQUVBLENBRUFsN0MsS0FBQXUrRixpQkFBQU0sQ0FFQSxDQU9BLGtCQUFBRSxDQUFBdHlDLEdBRUEsTUFBQXY4QyxFQUFBbFEsS0FBQWtRLE9BQ0FnckMsRUFBQWw3QyxLQUFBMjhFLFVBQ0FueUUsRUFBQTB3QyxFQUFBbDdDLEtBQUFzK0YsVUFFQSxJQUFBdCtGLEtBQUF3K0YsMEJBSUF4K0YsS0FBQW8rRixlQU1BcCtGLEtBQUFtK0YseUJBQUFqdUYsRUFBQTFGLEVBQUEsRUFBQWlpRCxFQUFBdlIsR0FDQWw3QyxLQUFBdytGLDBCQUFBL3hDLENBRUEsQ0FPQSxLQUFBdXlDLENBQUFKLEdBRUEsTUFBQTFqRCxFQUFBbDdDLEtBQUEyOEUsVUFDQXpzRSxFQUFBbFEsS0FBQWtRLE9BQ0ExRixFQUFBbzBGLEVBQUExakQsRUFBQUEsRUFFQXVSLEVBQUF6c0QsS0FBQXUrRixpQkFDQVUsRUFBQWovRixLQUFBdytGLHlCQUVBbkIsRUFBQXI5RixLQUFBcTlGLFFBS0EsR0FIQXI5RixLQUFBdStGLGlCQUFBLEVBQ0F2K0YsS0FBQXcrRix5QkFBQSxFQUVBL3hDLEVBQUEsRUFBQSxDQUlBLE1BQUF5eUMsRUFBQWhrRCxFQUFBbDdDLEtBQUFxK0YsV0FFQXIrRixLQUFBaytGLGlCQUNBaHVGLEVBQUExRixFQUFBMDBGLEVBQUEsRUFBQXp5QyxFQUFBdlIsRUFFQSxDQUVBK2pELEVBQUEsR0FJQWovRixLQUFBbStGLHlCQUFBanVGLEVBQUExRixFQUFBeEssS0FBQXMrRixVQUFBcGpELEVBQUEsRUFBQUEsR0FJQSxJQUFBLElBQUFuNkMsRUFBQW02QyxFQUFBMXlDLEVBQUEweUMsRUFBQUEsRUFBQW42QyxJQUFBeUgsSUFBQXpILEVBRUEsR0FBQW1QLEVBQUFuUCxLQUFBbVAsRUFBQW5QLEVBQUFtNkMsR0FBQSxDQUlBbWlELEVBQUE4QixTQUFBanZGLEVBQUExRixHQUNBLEtBRUEsQ0FJQSxDQU1BLGlCQUFBNDBGLEdBRUEsTUFBQS9CLEVBQUFyOUYsS0FBQXE5RixRQUVBbnRGLEVBQUFsUSxLQUFBa1EsT0FDQWdyQyxFQUFBbDdDLEtBQUEyOEUsVUFFQXVpQixFQUFBaGtELEVBQUFsN0MsS0FBQXErRixXQUVBaEIsRUFBQWdDLFNBQUFudkYsRUFBQWd2RixHQUdBLElBQUEsSUFBQW4rRixFQUFBbTZDLEVBQUExeUMsRUFBQTAyRixFQUFBbitGLElBQUF5SCxJQUFBekgsRUFFQW1QLEVBQUFuUCxHQUFBbVAsRUFBQWd2RixFQUFBbitGLEVBQUFtNkMsR0FLQWw3QyxLQUFBbytGLGVBRUFwK0YsS0FBQXUrRixpQkFBQSxFQUNBditGLEtBQUF3K0YseUJBQUEsQ0FFQSxDQUtBLG9CQUFBYyxHQUVBLE1BQUFKLEVBQUEsRUFBQWwvRixLQUFBMjhFLFVBQ0EzOEUsS0FBQXE5RixRQUFBOEIsU0FBQW4vRixLQUFBa1EsT0FBQWd2RixFQUVBLENBSUEsMkJBQUFqQixHQUVBLE1BQUFoZ0IsRUFBQWorRSxLQUFBcytGLFVBQUF0K0YsS0FBQTI4RSxVQUNBdUIsRUFBQUQsRUFBQWorRSxLQUFBMjhFLFVBRUEsSUFBQSxJQUFBNTdFLEVBQUFrOUUsRUFBQWw5RSxFQUFBbTlFLEVBQUFuOUUsSUFFQWYsS0FBQWtRLE9BQUFuUCxHQUFBLENBSUEsQ0FFQSw4QkFBQTQ4RixHQUVBMzlGLEtBQUFpK0YsOEJBQ0FqK0YsS0FBQWtRLE9BQUFsUSxLQUFBcytGLFVBQUF0K0YsS0FBQTI4RSxVQUFBLEdBQUEsQ0FFQSxDQUVBLHlCQUFBbWhCLEdBRUEsTUFBQTdmLEVBQUFqK0UsS0FBQXErRixXQUFBcitGLEtBQUEyOEUsVUFDQTRpQixFQUFBdi9GLEtBQUFzK0YsVUFBQXQrRixLQUFBMjhFLFVBRUEsSUFBQSxJQUFBNTdFLEVBQUEsRUFBQUEsRUFBQWYsS0FBQTI4RSxVQUFBNTdFLElBRUFmLEtBQUFrUSxPQUFBcXZGLEVBQUF4K0YsR0FBQWYsS0FBQWtRLE9BQUErdEUsRUFBQWw5RSxFQUlBLENBS0EsT0FBQTg4RixDQUFBM3RGLEVBQUE0TixFQUFBKzlELEVBQUFuNUUsRUFBQXc0QyxHQUVBLEdBQUF4NEMsR0FBQSxHQUVBLElBQUEsSUFBQTNCLEVBQUEsRUFBQUEsSUFBQW02QyxJQUFBbjZDLEVBRUFtUCxFQUFBNE4sRUFBQS9jLEdBQUFtUCxFQUFBMnJFLEVBQUE5NkUsRUFNQSxDQUVBLE1BQUEwOEYsQ0FBQXZ0RixFQUFBNE4sRUFBQSs5RCxFQUFBbjVFLEdBRUE0YSxHQUFBTSxVQUFBMU4sRUFBQTROLEVBQUE1TixFQUFBNE4sRUFBQTVOLEVBQUEyckUsRUFBQW41RSxFQUVBLENBRUEsY0FBQWc3RixDQUFBeHRGLEVBQUE0TixFQUFBKzlELEVBQUFuNUUsRUFBQXc0QyxHQUVBLE1BQUFza0QsRUFBQXgvRixLQUFBNDlGLFdBQUExaUQsRUFHQTU5QixHQUFBMkIsd0JBQUEvTyxFQUFBc3ZGLEVBQUF0dkYsRUFBQTROLEVBQUE1TixFQUFBMnJFLEdBR0F2K0QsR0FBQU0sVUFBQTFOLEVBQUE0TixFQUFBNU4sRUFBQTROLEVBQUE1TixFQUFBc3ZGLEVBQUE5OEYsRUFFQSxDQUVBLEtBQUFxN0YsQ0FBQTd0RixFQUFBNE4sRUFBQSs5RCxFQUFBbjVFLEVBQUF3NEMsR0FFQSxNQUFBcDJDLEVBQUEsRUFBQXBDLEVBRUEsSUFBQSxJQUFBM0IsRUFBQSxFQUFBQSxJQUFBbTZDLElBQUFuNkMsRUFBQSxDQUVBLE1BQUFzb0IsRUFBQXZMLEVBQUEvYyxFQUVBbVAsRUFBQW1aLEdBQUFuWixFQUFBbVosR0FBQXZrQixFQUFBb0wsRUFBQTJyRSxFQUFBOTZFLEdBQUEyQixDQUVBLENBRUEsQ0FFQSxhQUFBczdGLENBQUE5dEYsRUFBQTROLEVBQUErOUQsRUFBQW41RSxFQUFBdzRDLEdBRUEsSUFBQSxJQUFBbjZDLEVBQUEsRUFBQUEsSUFBQW02QyxJQUFBbjZDLEVBQUEsQ0FFQSxNQUFBc29CLEVBQUF2TCxFQUFBL2MsRUFFQW1QLEVBQUFtWixHQUFBblosRUFBQW1aLEdBQUFuWixFQUFBMnJFLEVBQUE5NkUsR0FBQTJCLENBRUEsQ0FFQSxFQzFYQSxNQUFBKzhGLEdBQUEsZ0JBQ0FDLEdBQUEsSUFBQUMsT0FBQSxJQUFBRixHQUFBLElBQUEsS0FLQUcsR0FBQSxLQUFBSCxHQUFBLElBQ0FJLEdBQUEsS0FBQUosR0FBQXJPLFFBQUEsTUFBQSxJQUFBLElBaUJBME8sR0FBQSxJQUFBSCxPQUNBLElBZEEsa0JBQUFsb0YsT0FBQTI1RSxRQUFBLEtBQUF3TyxJQUdBLFdBQUFub0YsT0FBQTI1RSxRQUFBLE9BQUF5TyxJQUlBLDRCQUFBcG9GLE9BQUEyNUUsUUFBQSxLQUFBd08sSUFJQSx1QkFBQW5vRixPQUFBMjVFLFFBQUEsS0FBQXdPLElBUUEsS0FHQUcsR0FBQSxDQUFBLFdBQUEsWUFBQSxRQUFBLE9BeUVBLE1BQUFDLEdBU0EsV0FBQXA5RixDQUFBcTlGLEVBQUFyNkIsRUFBQXM2QixHQU9BbGdHLEtBQUE0bEUsS0FBQUEsRUFPQTVsRSxLQUFBa2dHLFdBQUFBLEdBQUFGLEdBQUFHLGVBQUF2NkIsR0FPQTVsRSxLQUFBb2dHLEtBQUFKLEdBQUFLLFNBQUFKLEVBQUFqZ0csS0FBQWtnRyxXQUFBSSxVQU9BdGdHLEtBQUFpZ0csU0FBQUEsRUFHQWpnRyxLQUFBcS9GLFNBQUFyL0YsS0FBQXVnRyxrQkFDQXZnRyxLQUFBbS9GLFNBQUFuL0YsS0FBQXdnRyxpQkFFQSxDQVlBLGFBQUFDLENBQUFDLEVBQUE5NkIsRUFBQXM2QixHQUVBLE9BQUFRLEdBQUFBLEVBQUFDLHVCQU1BLElBQUFYLEdBQUFZLFVBQUFGLEVBQUE5NkIsRUFBQXM2QixHQUpBLElBQUFGLEdBQUFVLEVBQUE5NkIsRUFBQXM2QixFQVFBLENBU0EsdUJBQUFXLENBQUF6d0YsR0FFQSxPQUFBQSxFQUFBZ2hGLFFBQUEsTUFBQSxLQUFBQSxRQUFBc08sR0FBQSxHQUVBLENBb0JBLHFCQUFBUyxDQUFBL2EsR0FFQSxNQUFBMGIsRUFBQWhCLEdBQUF2MUQsS0FBQTY2QyxHQUVBLEdBQUEsT0FBQTBiLEVBRUEsTUFBQSxJQUFBMTlGLE1BQUEsNENBQUFnaUYsR0FJQSxNQUFBMmIsRUFBQSxDQUVBVCxTQUFBUSxFQUFBLEdBQ0FFLFdBQUFGLEVBQUEsR0FDQUcsWUFBQUgsRUFBQSxHQUNBeGIsYUFBQXdiLEVBQUEsR0FDQUksY0FBQUosRUFBQSxJQUdBSyxFQUFBSixFQUFBVCxVQUFBUyxFQUFBVCxTQUFBblAsWUFBQSxLQUVBLFFBQUFweEYsSUFBQW9oRyxJQUFBLElBQUFBLEVBQUEsQ0FFQSxNQUFBSCxFQUFBRCxFQUFBVCxTQUFBYyxVQUFBRCxFQUFBLElBTUEsSUFBQXBCLEdBQUE1L0YsUUFBQTZnRyxLQUVBRCxFQUFBVCxTQUFBUyxFQUFBVCxTQUFBYyxVQUFBLEVBQUFELEdBQ0FKLEVBQUFDLFdBQUFBLEVBSUEsQ0FFQSxHQUFBLE9BQUFELEVBQUF6YixjQUFBLElBQUF5YixFQUFBemIsYUFBQXJrRixPQUVBLE1BQUEsSUFBQW1DLE1BQUEsK0RBQUFnaUYsR0FJQSxPQUFBMmIsQ0FFQSxDQVdBLGVBQUFWLENBQUFLLEVBQUFKLEdBRUEsUUFBQXZnRyxJQUFBdWdHLEdBQUEsS0FBQUEsR0FBQSxNQUFBQSxJQUFBLElBQUFBLEdBQUFBLElBQUFJLEVBQUF0d0YsTUFBQWt3RixJQUFBSSxFQUFBOXFGLEtBRUEsT0FBQThxRixFQUtBLEdBQUFBLEVBQUE1akUsU0FBQSxDQUVBLE1BQUF5d0IsRUFBQW16QyxFQUFBNWpFLFNBQUEyd0IsY0FBQTZ5QyxHQUVBLFFBQUF2Z0csSUFBQXd0RCxFQUVBLE9BQUFBLENBSUEsQ0FHQSxHQUFBbXpDLEVBQUFwNUUsU0FBQSxDQUVBLE1BQUErNUUsRUFBQSxTQUFBLzVFLEdBRUEsSUFBQSxJQUFBdm1CLEVBQUEsRUFBQUEsRUFBQXVtQixFQUFBcm1CLE9BQUFGLElBQUEsQ0FFQSxNQUFBdWdHLEVBQUFoNkUsRUFBQXZtQixHQUVBLEdBQUF1Z0csRUFBQWx4RixPQUFBa3dGLEdBQUFnQixFQUFBMXJGLE9BQUEwcUYsRUFFQSxPQUFBZ0IsRUFJQSxNQUFBOW9FLEVBQUE2b0UsRUFBQUMsRUFBQWg2RSxVQUVBLEdBQUFrUixFQUFBLE9BQUFBLENBRUEsQ0FFQSxPQUFBLElBRUEsRUFFQStvRSxFQUFBRixFQUFBWCxFQUFBcDVFLFVBRUEsR0FBQWk2RSxFQUVBLE9BQUFBLENBSUEsQ0FFQSxPQUFBLElBRUEsQ0FHQSxxQkFBQUMsR0FBQSxDQUNBLHFCQUFBQyxHQUFBLENBSUEsZ0JBQUFDLENBQUF4eEYsRUFBQTFGLEdBRUEwRixFQUFBMUYsR0FBQXhLLEtBQUEyaEcsYUFBQTNoRyxLQUFBc2xGLGFBRUEsQ0FFQSxlQUFBc2MsQ0FBQTF4RixFQUFBMUYsR0FFQSxNQUFBaU4sRUFBQXpYLEtBQUE2aEcsaUJBRUEsSUFBQSxJQUFBOWdHLEVBQUEsRUFBQXNCLEVBQUFvVixFQUFBeFcsT0FBQUYsSUFBQXNCLElBQUF0QixFQUVBbVAsRUFBQTFGLEtBQUFpTixFQUFBMVcsRUFJQSxDQUVBLHNCQUFBK2dHLENBQUE1eEYsRUFBQTFGLEdBRUEwRixFQUFBMUYsR0FBQXhLLEtBQUE2aEcsaUJBQUE3aEcsS0FBQWtoRyxjQUVBLENBRUEsaUJBQUFhLENBQUE3eEYsRUFBQTFGLEdBRUF4SyxLQUFBNmhHLGlCQUFBcDNGLFFBQUF5RixFQUFBMUYsRUFFQSxDQUlBLGdCQUFBdzNGLENBQUE5eEYsRUFBQTFGLEdBRUF4SyxLQUFBMmhHLGFBQUEzaEcsS0FBQXNsRixjQUFBcDFFLEVBQUExRixFQUVBLENBRUEsK0JBQUF5M0YsQ0FBQS94RixFQUFBMUYsR0FFQXhLLEtBQUEyaEcsYUFBQTNoRyxLQUFBc2xGLGNBQUFwMUUsRUFBQTFGLEdBQ0F4SyxLQUFBMmhHLGFBQUE1ckYsYUFBQSxDQUVBLENBRUEsMENBQUFtc0YsQ0FBQWh5RixFQUFBMUYsR0FFQXhLLEtBQUEyaEcsYUFBQTNoRyxLQUFBc2xGLGNBQUFwMUUsRUFBQTFGLEdBQ0F4SyxLQUFBMmhHLGFBQUE1ckUsd0JBQUEsQ0FFQSxDQUlBLGVBQUFvc0UsQ0FBQWp5RixFQUFBMUYsR0FFQSxNQUFBNDNGLEVBQUFwaUcsS0FBQTZoRyxpQkFFQSxJQUFBLElBQUE5Z0csRUFBQSxFQUFBc0IsRUFBQSsvRixFQUFBbmhHLE9BQUFGLElBQUFzQixJQUFBdEIsRUFFQXFoRyxFQUFBcmhHLEdBQUFtUCxFQUFBMUYsSUFJQSxDQUVBLDhCQUFBNjNGLENBQUFueUYsRUFBQTFGLEdBRUEsTUFBQTQzRixFQUFBcGlHLEtBQUE2aEcsaUJBRUEsSUFBQSxJQUFBOWdHLEVBQUEsRUFBQXNCLEVBQUErL0YsRUFBQW5oRyxPQUFBRixJQUFBc0IsSUFBQXRCLEVBRUFxaEcsRUFBQXJoRyxHQUFBbVAsRUFBQTFGLEtBSUF4SyxLQUFBMmhHLGFBQUE1ckYsYUFBQSxDQUVBLENBRUEseUNBQUF1c0YsQ0FBQXB5RixFQUFBMUYsR0FFQSxNQUFBNDNGLEVBQUFwaUcsS0FBQTZoRyxpQkFFQSxJQUFBLElBQUE5Z0csRUFBQSxFQUFBc0IsRUFBQSsvRixFQUFBbmhHLE9BQUFGLElBQUFzQixJQUFBdEIsRUFFQXFoRyxFQUFBcmhHLEdBQUFtUCxFQUFBMUYsS0FJQXhLLEtBQUEyaEcsYUFBQTVyRSx3QkFBQSxDQUVBLENBSUEsc0JBQUF3c0UsQ0FBQXJ5RixFQUFBMUYsR0FFQXhLLEtBQUE2aEcsaUJBQUE3aEcsS0FBQWtoRyxlQUFBaHhGLEVBQUExRixFQUVBLENBRUEscUNBQUFnNEYsQ0FBQXR5RixFQUFBMUYsR0FFQXhLLEtBQUE2aEcsaUJBQUE3aEcsS0FBQWtoRyxlQUFBaHhGLEVBQUExRixHQUNBeEssS0FBQTJoRyxhQUFBNXJGLGFBQUEsQ0FFQSxDQUVBLGdEQUFBMHNGLENBQUF2eUYsRUFBQTFGLEdBRUF4SyxLQUFBNmhHLGlCQUFBN2hHLEtBQUFraEcsZUFBQWh4RixFQUFBMUYsR0FDQXhLLEtBQUEyaEcsYUFBQTVyRSx3QkFBQSxDQUVBLENBSUEsbUJBQUEyc0UsQ0FBQXh5RixFQUFBMUYsR0FFQXhLLEtBQUE2aEcsaUJBQUF0M0YsVUFBQTJGLEVBQUExRixFQUVBLENBRUEsa0NBQUFtNEYsQ0FBQXp5RixFQUFBMUYsR0FFQXhLLEtBQUE2aEcsaUJBQUF0M0YsVUFBQTJGLEVBQUExRixHQUNBeEssS0FBQTJoRyxhQUFBNXJGLGFBQUEsQ0FFQSxDQUVBLDZDQUFBNnNGLENBQUExeUYsRUFBQTFGLEdBRUF4SyxLQUFBNmhHLGlCQUFBdDNGLFVBQUEyRixFQUFBMUYsR0FDQXhLLEtBQUEyaEcsYUFBQTVyRSx3QkFBQSxDQUVBLENBRUEsaUJBQUF3cUUsQ0FBQXNDLEVBQUFyNEYsR0FFQXhLLEtBQUFtc0QsT0FDQW5zRCxLQUFBcS9GLFNBQUF3RCxFQUFBcjRGLEVBRUEsQ0FFQSxpQkFBQWcyRixDQUFBc0MsRUFBQXQ0RixHQUVBeEssS0FBQW1zRCxPQUNBbnNELEtBQUFtL0YsU0FBQTJELEVBQUF0NEYsRUFFQSxDQUtBLElBQUEyaEQsR0FFQSxJQUFBdzFDLEVBQUEzaEcsS0FBQW9nRyxLQUNBLE1BQUFGLEVBQUFsZ0csS0FBQWtnRyxXQUVBYyxFQUFBZCxFQUFBYyxXQUNBMWIsRUFBQTRhLEVBQUE1YSxhQUNBLElBQUE0YixFQUFBaEIsRUFBQWdCLGNBZUEsR0FiQVMsSUFFQUEsRUFBQTNCLEdBQUFLLFNBQUFyZ0csS0FBQWlnRyxTQUFBQyxFQUFBSSxVQUVBdGdHLEtBQUFvZ0csS0FBQXVCLEdBS0EzaEcsS0FBQXEvRixTQUFBci9GLEtBQUF3aEcsc0JBQ0F4aEcsS0FBQW0vRixTQUFBbi9GLEtBQUF5aEcsdUJBR0FFLEVBR0EsWUFEQS82RixRQUFBQyxLQUFBLDBEQUFBN0csS0FBQTRsRSxLQUFBLEtBS0EsR0FBQW83QixFQUFBLENBRUEsSUFBQUMsRUFBQWYsRUFBQWUsWUFHQSxPQUFBRCxHQUVBLElBQUEsWUFFQSxJQUFBVyxFQUFBNWtFLFNBR0EsWUFEQW4yQixRQUFBbXhCLE1BQUEsb0ZBQUEvM0IsTUFLQSxJQUFBMmhHLEVBQUE1a0UsU0FBQXpELFVBR0EsWUFEQTF5QixRQUFBbXhCLE1BQUEsOEdBQUEvM0IsTUFLQTJoRyxFQUFBQSxFQUFBNWtFLFNBQUF6RCxVQUVBLE1BRUEsSUFBQSxRQUVBLElBQUFxb0UsRUFBQTdrRSxTQUdBLFlBREFsMkIsUUFBQW14QixNQUFBLGlGQUFBLzNCLE1BUUEyaEcsRUFBQUEsRUFBQTdrRSxTQUFBNnZCLE1BR0EsSUFBQSxJQUFBNXJELEVBQUEsRUFBQUEsRUFBQTRnRyxFQUFBMWdHLE9BQUFGLElBRUEsR0FBQTRnRyxFQUFBNWdHLEdBQUFxUCxPQUFBNndGLEVBQUEsQ0FFQUEsRUFBQWxnRyxFQUNBLEtBRUEsQ0FJQSxNQUVBLElBQUEsTUFFQSxHQUFBLFFBQUE0Z0csRUFBQSxDQUVBQSxFQUFBQSxFQUFBL21FLElBQ0EsS0FFQSxDQUVBLElBQUErbUUsRUFBQTVrRSxTQUdBLFlBREFuMkIsUUFBQW14QixNQUFBLG9GQUFBLzNCLE1BS0EsSUFBQTJoRyxFQUFBNWtFLFNBQUFuQyxJQUdBLFlBREFoMEIsUUFBQW14QixNQUFBLDRGQUFBLzNCLE1BS0EyaEcsRUFBQUEsRUFBQTVrRSxTQUFBbkMsSUFDQSxNQUVBLFFBRUEsUUFBQTc2QixJQUFBNGhHLEVBQUFYLEdBR0EsWUFEQXA2RixRQUFBbXhCLE1BQUEsdUVBQUEvM0IsTUFLQTJoRyxFQUFBQSxFQUFBWCxHQUtBLFFBQUFqaEcsSUFBQWtoRyxFQUFBLENBRUEsUUFBQWxoRyxJQUFBNGhHLEVBQUFWLEdBR0EsWUFEQXI2RixRQUFBbXhCLE1BQUEsd0ZBQUEvM0IsS0FBQTJoRyxHQUtBQSxFQUFBQSxFQUFBVixFQUVBLENBRUEsQ0FHQSxNQUFBOEIsRUFBQXBCLEVBQUFyYyxHQUVBLFFBQUF2bEYsSUFBQWdqRyxFQUFBLENBRUEsTUFBQXpDLEVBQUFKLEVBQUFJLFNBSUEsWUFGQTE1RixRQUFBbXhCLE1BQUEsK0RBQUF1b0UsRUFDQSxJQUFBaGIsRUFBQSx3QkFBQXFjLEVBR0EsQ0FHQSxJQUFBcUIsRUFBQWhqRyxLQUFBaWpHLFdBQUFDLEtBRUFsakcsS0FBQTJoRyxhQUFBQSxHQUVBLElBQUFBLEVBQUF2MUQsV0FFQTQyRCxFQUFBaGpHLEtBQUFpakcsV0FBQUUsYUFFQSxJQUFBeEIsRUFBQXZzRSxhQUVBNHRFLEVBQUFoakcsS0FBQWlqRyxXQUFBRyx3QkFLQSxJQUFBQyxFQUFBcmpHLEtBQUFzakcsWUFBQUMsT0FFQSxRQUFBeGpHLElBQUFtaEcsRUFBQSxDQUlBLEdBQUEsMEJBQUE1YixFQUFBLENBS0EsSUFBQXFjLEVBQUEvNkUsU0FHQSxZQURBaGdCLFFBQUFteEIsTUFBQSxzR0FBQS8zQixNQUtBLElBQUEyaEcsRUFBQS82RSxTQUFBNndCLGdCQUdBLFlBREE3d0MsUUFBQW14QixNQUFBLHNIQUFBLzNCLFdBS0FELElBQUE0aEcsRUFBQXZsRCxzQkFBQThrRCxLQUVBQSxFQUFBUyxFQUFBdmxELHNCQUFBOGtELEdBSUEsQ0FFQW1DLEVBQUFyakcsS0FBQXNqRyxZQUFBRSxhQUVBeGpHLEtBQUE2aEcsaUJBQUFrQixFQUNBL2lHLEtBQUFraEcsY0FBQUEsQ0FFQSxXQUFBbmhHLElBQUFnakcsRUFBQXg0RixnQkFBQXhLLElBQUFnakcsRUFBQXQ0RixTQUlBNDRGLEVBQUFyakcsS0FBQXNqRyxZQUFBRyxlQUVBempHLEtBQUE2aEcsaUJBQUFrQixHQUVBenNGLE1BQUFDLFFBQUF3c0YsSUFFQU0sRUFBQXJqRyxLQUFBc2pHLFlBQUFJLFlBRUExakcsS0FBQTZoRyxpQkFBQWtCLEdBSUEvaUcsS0FBQXNsRixhQUFBQSxFQUtBdGxGLEtBQUFxL0YsU0FBQXIvRixLQUFBMmpHLG9CQUFBTixHQUNBcmpHLEtBQUFtL0YsU0FBQW4vRixLQUFBNGpHLGlDQUFBUCxHQUFBTCxFQUVBLENBS0EsTUFBQWEsR0FFQTdqRyxLQUFBb2dHLEtBQUEsS0FJQXBnRyxLQUFBcS9GLFNBQUFyL0YsS0FBQXVnRyxrQkFDQXZnRyxLQUFBbS9GLFNBQUFuL0YsS0FBQXdnRyxpQkFFQSxFQUlBUixHQUFBWSxVQXpyQkEsTUFFQSxXQUFBaCtGLENBQUFraEcsRUFBQWwrQixFQUFBbStCLEdBRUEsTUFBQTdELEVBQUE2RCxHQUFBL0QsR0FBQUcsZUFBQXY2QixHQUVBNWxFLEtBQUFna0csYUFBQUYsRUFDQTlqRyxLQUFBaWtHLFVBQUFILEVBQUFJLFdBQUF0K0IsRUFBQXM2QixFQUVBLENBRUEsUUFBQWIsQ0FBQXgrRixFQUFBMkosR0FFQXhLLEtBQUFtc0QsT0FFQSxNQUFBZzRDLEVBQUFua0csS0FBQWdrRyxhQUFBSSxnQkFDQS9HLEVBQUFyOUYsS0FBQWlrRyxVQUFBRSxRQUdBcGtHLElBQUFzOUYsR0FBQUEsRUFBQWdDLFNBQUF4K0YsRUFBQTJKLEVBRUEsQ0FFQSxRQUFBMjBGLENBQUF0K0YsRUFBQTJKLEdBRUEsTUFBQTY1RixFQUFBcmtHLEtBQUFpa0csVUFFQSxJQUFBLElBQUFsakcsRUFBQWYsS0FBQWdrRyxhQUFBSSxnQkFBQS9oRyxFQUFBZ2lHLEVBQUFwakcsT0FBQUYsSUFBQXNCLElBQUF0QixFQUVBc2pHLEVBQUF0akcsR0FBQW8rRixTQUFBdCtGLEVBQUEySixFQUlBLENBRUEsSUFBQTJoRCxHQUVBLE1BQUFrNEMsRUFBQXJrRyxLQUFBaWtHLFVBRUEsSUFBQSxJQUFBbGpHLEVBQUFmLEtBQUFna0csYUFBQUksZ0JBQUEvaEcsRUFBQWdpRyxFQUFBcGpHLE9BQUFGLElBQUFzQixJQUFBdEIsRUFFQXNqRyxFQUFBdGpHLEdBQUFvckQsTUFJQSxDQUVBLE1BQUEwM0MsR0FFQSxNQUFBUSxFQUFBcmtHLEtBQUFpa0csVUFFQSxJQUFBLElBQUFsakcsRUFBQWYsS0FBQWdrRyxhQUFBSSxnQkFBQS9oRyxFQUFBZ2lHLEVBQUFwakcsT0FBQUYsSUFBQXNCLElBQUF0QixFQUVBc2pHLEVBQUF0akcsR0FBQThpRyxRQUlBLEdBa29CQTdELEdBQUFqNUYsVUFBQXU4RixZQUFBLENBQ0FDLE9BQUEsRUFDQUcsWUFBQSxFQUNBRixhQUFBLEVBQ0FDLGVBQUEsR0FHQXpELEdBQUFqNUYsVUFBQWs4RixXQUFBLENBQ0FDLEtBQUEsRUFDQUMsWUFBQSxFQUNBQyx1QkFBQSxHQUdBcEQsR0FBQWo1RixVQUFBNDhGLG9CQUFBLENBRUEzRCxHQUFBajVGLFVBQUEyNkYsaUJBQ0ExQixHQUFBajVGLFVBQUE2NkYsZ0JBQ0E1QixHQUFBajVGLFVBQUErNkYsdUJBQ0E5QixHQUFBajVGLFVBQUFnN0YsbUJBSUEvQixHQUFBajVGLFVBQUE2OEYsaUNBQUEsQ0FFQSxDQUVBNUQsR0FBQWo1RixVQUFBaTdGLGlCQUNBaEMsR0FBQWo1RixVQUFBazdGLGdDQUNBakMsR0FBQWo1RixVQUFBbTdGLDRDQUVBLENBSUFsQyxHQUFBajVGLFVBQUFvN0YsZ0JBQ0FuQyxHQUFBajVGLFVBQUFzN0YsK0JBQ0FyQyxHQUFBajVGLFVBQUF1N0YsMkNBRUEsQ0FHQXRDLEdBQUFqNUYsVUFBQXc3Rix1QkFDQXZDLEdBQUFqNUYsVUFBQXk3RixzQ0FDQXhDLEdBQUFqNUYsVUFBQTA3RixrREFFQSxDQUdBekMsR0FBQWo1RixVQUFBMjdGLG9CQUNBMUMsR0FBQWo1RixVQUFBNDdGLG1DQUNBM0MsR0FBQWo1RixVQUFBNjdGLGdEQzF2QkEsTUFBQTBCLEdBT0EsV0FBQTFoRyxHQVNBNUMsS0FBQTJnRyx3QkFBQSxFQVFBM2dHLEtBQUE0VixLQUFBblUsS0FHQXpCLEtBQUF1a0csU0FBQWp1RixNQUFBdlAsVUFBQWpHLE1BQUFJLEtBQUE0MkIsV0FFQTkzQixLQUFBb2tHLGdCQUFBLEVBR0EsTUFBQXJwRCxFQUFBLENBQUEsRUFDQS82QyxLQUFBd2tHLGVBQUF6cEQsRUFFQSxJQUFBLElBQUFoNkMsRUFBQSxFQUFBc0IsRUFBQXkxQixVQUFBNzJCLE9BQUFGLElBQUFzQixJQUFBdEIsRUFFQWc2QyxFQUFBampCLFVBQUEvMkIsR0FBQTZVLE1BQUE3VSxFQUlBZixLQUFBeWtHLE9BQUEsR0FDQXprRyxLQUFBMGtHLGFBQUEsR0FDQTFrRyxLQUFBaWtHLFVBQUEsR0FDQWprRyxLQUFBMmtHLHVCQUFBLENBQUEsRUFFQSxNQUFBaG5ELEVBQUEzOUMsS0FFQUEsS0FBQTRrRyxNQUFBLENBRUFDLFFBQUEsQ0FDQSxTQUFBaGIsR0FFQSxPQUFBbHNDLEVBQUE0bUQsU0FBQXRqRyxNQUVBLEVBQ0EsU0FBQTZqRyxHQUVBLE9BQUE5a0csS0FBQTZwRixNQUFBbHNDLEVBQUF5bUQsZUFFQSxHQUVBLHFCQUFBVyxHQUVBLE9BQUFwbkQsRUFBQXNtRCxVQUFBaGpHLE1BRUEsRUFJQSxDQU9BLEdBQUEyRyxHQUVBLE1BQUFpOUYsRUFBQTdrRyxLQUFBdWtHLFNBQ0FTLEVBQUFobEcsS0FBQXdrRyxlQUNBUyxFQUFBamxHLEtBQUF5a0csT0FDQVMsRUFBQWxsRyxLQUFBMGtHLGFBQ0FMLEVBQUFya0csS0FBQWlrRyxVQUNBa0IsRUFBQWQsRUFBQXBqRyxPQUVBLElBQUFta0csRUFDQUMsRUFBQVIsRUFBQTVqRyxPQUNBcWtHLEVBQUF0bEcsS0FBQW9rRyxnQkFFQSxJQUFBLElBQUFyakcsRUFBQSxFQUFBc0IsRUFBQXkxQixVQUFBNzJCLE9BQUFGLElBQUFzQixJQUFBdEIsRUFBQSxDQUVBLE1BQUFpbEIsRUFBQThSLFVBQUEvMkIsR0FDQTZVLEVBQUFvUSxFQUFBcFEsS0FDQSxJQUFBcFYsRUFBQXdrRyxFQUFBcHZGLEdBRUEsUUFBQTdWLElBQUFTLEVBQUEsQ0FJQUEsRUFBQTZrRyxJQUNBTCxFQUFBcHZGLEdBQUFwVixFQUNBcWtHLEVBQUF6a0csS0FBQTRsQixHQUlBLElBQUEsSUFBQXFELEVBQUEsRUFBQS9tQixFQUFBNmlHLEVBQUE5N0UsSUFBQS9tQixJQUFBK21CLEVBRUFnN0UsRUFBQWg3RSxHQUFBanBCLEtBQUEsSUFBQTQvRixHQUFBaDZFLEVBQUFpL0UsRUFBQTU3RSxHQUFBNjdFLEVBQUE3N0UsSUFJQSxNQUFBLEdBQUE3b0IsRUFBQThrRyxFQUFBLENBRUFGLEVBQUFQLEVBQUFya0csR0FJQSxNQUFBK2tHLElBQUFELEVBQ0FFLEVBQUFYLEVBQUFVLEdBRUFQLEVBQUFRLEVBQUE1dkYsTUFBQXBWLEVBQ0Fxa0csRUFBQXJrRyxHQUFBZ2xHLEVBRUFSLEVBQUFwdkYsR0FBQTJ2RixFQUNBVixFQUFBVSxHQUFBdi9FLEVBSUEsSUFBQSxJQUFBcUQsRUFBQSxFQUFBL21CLEVBQUE2aUcsRUFBQTk3RSxJQUFBL21CLElBQUErbUIsRUFBQSxDQUVBLE1BQUFvOEUsRUFBQXBCLEVBQUFoN0UsR0FDQXE4RSxFQUFBRCxFQUFBRixHQUVBLElBQUFsSSxFQUFBb0ksRUFBQWpsRyxHQUVBaWxHLEVBQUFqbEcsR0FBQWtsRyxPQUVBM2xHLElBQUFzOUYsSUFNQUEsRUFBQSxJQUFBMkMsR0FBQWg2RSxFQUFBaS9FLEVBQUE1N0UsR0FBQTY3RSxFQUFBNzdFLEtBSUFvOEUsRUFBQUYsR0FBQWxJLENBRUEsQ0FFQSxNQUFBd0gsRUFBQXJrRyxLQUFBNGtHLEdBRUF4K0YsUUFBQW14QixNQUFBLHFKQUtBLENBRUEvM0IsS0FBQW9rRyxnQkFBQWtCLENBRUEsQ0FPQSxNQUFBcnRFLEdBRUEsTUFBQTRzRSxFQUFBN2tHLEtBQUF1a0csU0FDQVMsRUFBQWhsRyxLQUFBd2tHLGVBQ0FILEVBQUFya0csS0FBQWlrRyxVQUNBa0IsRUFBQWQsRUFBQXBqRyxPQUVBLElBQUFxa0csRUFBQXRsRyxLQUFBb2tHLGdCQUVBLElBQUEsSUFBQXJqRyxFQUFBLEVBQUFzQixFQUFBeTFCLFVBQUE3MkIsT0FBQUYsSUFBQXNCLElBQUF0QixFQUFBLENBRUEsTUFBQWlsQixFQUFBOFIsVUFBQS8yQixHQUNBNlUsRUFBQW9RLEVBQUFwUSxLQUNBcFYsRUFBQXdrRyxFQUFBcHZGLEdBRUEsUUFBQTdWLElBQUFTLEdBQUFBLEdBQUE4a0csRUFBQSxDQUlBLE1BQUFLLEVBQUFMLElBQ0FNLEVBQUFmLEVBQUFjLEdBRUFYLEVBQUFZLEVBQUFod0YsTUFBQXBWLEVBQ0Fxa0csRUFBQXJrRyxHQUFBb2xHLEVBRUFaLEVBQUFwdkYsR0FBQSt2RixFQUNBZCxFQUFBYyxHQUFBMy9FLEVBSUEsSUFBQSxJQUFBcUQsRUFBQSxFQUFBL21CLEVBQUE2aUcsRUFBQTk3RSxJQUFBL21CLElBQUErbUIsRUFBQSxDQUVBLE1BQUFvOEUsRUFBQXBCLEVBQUFoN0UsR0FDQXc4RSxFQUFBSixFQUFBRSxHQUNBdEksRUFBQW9JLEVBQUFqbEcsR0FFQWlsRyxFQUFBamxHLEdBQUFxbEcsRUFDQUosRUFBQUUsR0FBQXRJLENBRUEsQ0FFQSxDQUVBLENBRUFyOUYsS0FBQW9rRyxnQkFBQWtCLENBRUEsQ0FPQSxPQUFBUSxHQUVBLE1BQUFqQixFQUFBN2tHLEtBQUF1a0csU0FDQVMsRUFBQWhsRyxLQUFBd2tHLGVBQ0FILEVBQUFya0csS0FBQWlrRyxVQUNBa0IsRUFBQWQsRUFBQXBqRyxPQUVBLElBQUFxa0csRUFBQXRsRyxLQUFBb2tHLGdCQUNBaUIsRUFBQVIsRUFBQTVqRyxPQUVBLElBQUEsSUFBQUYsRUFBQSxFQUFBc0IsRUFBQXkxQixVQUFBNzJCLE9BQUFGLElBQUFzQixJQUFBdEIsRUFBQSxDQUVBLE1BQ0E2VSxFQURBa2lCLFVBQUEvMkIsR0FDQTZVLEtBQ0FwVixFQUFBd2tHLEVBQUFwdkYsR0FFQSxRQUFBN1YsSUFBQVMsRUFJQSxVQUZBd2tHLEVBQUFwdkYsR0FFQXBWLEVBQUE4a0csRUFBQSxDQUlBLE1BQUFDLElBQUFELEVBQ0FFLEVBQUFYLEVBQUFVLEdBQ0F4bkIsSUFBQXNuQixFQUNBVSxFQUFBbEIsRUFBQTltQixHQUdBaW5CLEVBQUFRLEVBQUE1dkYsTUFBQXBWLEVBQ0Fxa0csRUFBQXJrRyxHQUFBZ2xHLEVBR0FSLEVBQUFlLEVBQUFud0YsTUFBQTJ2RixFQUNBVixFQUFBVSxHQUFBUSxFQUNBbEIsRUFBQXhzQyxNQUlBLElBQUEsSUFBQWh2QyxFQUFBLEVBQUEvbUIsRUFBQTZpRyxFQUFBOTdFLElBQUEvbUIsSUFBQSttQixFQUFBLENBRUEsTUFBQW84RSxFQUFBcEIsRUFBQWg3RSxHQUNBcThFLEVBQUFELEVBQUFGLEdBQ0EzbkMsRUFBQTZuQyxFQUFBMW5CLEdBRUEwbkIsRUFBQWpsRyxHQUFBa2xHLEVBQ0FELEVBQUFGLEdBQUEzbkMsRUFDQTZuQyxFQUFBcHRDLEtBRUEsQ0FFQSxLQUFBLENBSUEsTUFBQTBsQixJQUFBc25CLEVBQ0FVLEVBQUFsQixFQUFBOW1CLEdBRUFBLEVBQUEsSUFFQWluQixFQUFBZSxFQUFBbndGLE1BQUFwVixHQUlBcWtHLEVBQUFya0csR0FBQXVsRyxFQUNBbEIsRUFBQXhzQyxNQUlBLElBQUEsSUFBQWh2QyxFQUFBLEVBQUEvbUIsRUFBQTZpRyxFQUFBOTdFLElBQUEvbUIsSUFBQSttQixFQUFBLENBRUEsTUFBQW84RSxFQUFBcEIsRUFBQWg3RSxHQUVBbzhFLEVBQUFqbEcsR0FBQWlsRyxFQUFBMW5CLEdBQ0EwbkIsRUFBQXB0QyxLQUVBLENBRUEsQ0FJQSxDQUVBcjRELEtBQUFva0csZ0JBQUFrQixDQUVBLENBSUEsVUFBQXBCLENBQUF0K0IsRUFBQXM2QixHQUtBLE1BQUE4RixFQUFBaG1HLEtBQUEya0csdUJBQ0EsSUFBQW5rRyxFQUFBd2xHLEVBQUFwZ0MsR0FDQSxNQUFBeStCLEVBQUFya0csS0FBQWlrRyxVQUVBLFFBQUFsa0csSUFBQVMsRUFBQSxPQUFBNmpHLEVBQUE3akcsR0FFQSxNQUFBeWtHLEVBQUFqbEcsS0FBQXlrRyxPQUNBUyxFQUFBbGxHLEtBQUEwa0csYUFDQUcsRUFBQTdrRyxLQUFBdWtHLFNBQ0FjLEVBQUFSLEVBQUE1akcsT0FDQXFrRyxFQUFBdGxHLEtBQUFva0csZ0JBQ0FxQixFQUFBLElBQUFudkYsTUFBQSt1RixHQUVBN2tHLEVBQUE2akcsRUFBQXBqRyxPQUVBK2tHLEVBQUFwZ0MsR0FBQXBsRSxFQUVBeWtHLEVBQUE3a0csS0FBQXdsRSxHQUNBcy9CLEVBQUE5a0csS0FBQTgvRixHQUNBbUUsRUFBQWprRyxLQUFBcWxHLEdBRUEsSUFBQSxJQUFBMWtHLEVBQUF1a0csRUFBQWpqRyxFQUFBd2lHLEVBQUE1akcsT0FBQUYsSUFBQXNCLElBQUF0QixFQUFBLENBRUEsTUFBQWlsQixFQUFBNitFLEVBQUE5akcsR0FDQTBrRyxFQUFBMWtHLEdBQUEsSUFBQWkvRixHQUFBaDZFLEVBQUE0L0MsRUFBQXM2QixFQUVBLENBRUEsT0FBQXVGLENBRUEsQ0FFQSxZQUFBUSxDQUFBcmdDLEdBS0EsTUFBQW9nQyxFQUFBaG1HLEtBQUEya0csdUJBQ0Fua0csRUFBQXdsRyxFQUFBcGdDLEdBRUEsUUFBQTdsRSxJQUFBUyxFQUFBLENBRUEsTUFBQXlrRyxFQUFBamxHLEtBQUF5a0csT0FDQVMsRUFBQWxsRyxLQUFBMGtHLGFBQ0FMLEVBQUFya0csS0FBQWlrRyxVQUNBaUMsRUFBQTdCLEVBQUFwakcsT0FBQSxFQUNBa2xHLEVBQUE5QixFQUFBNkIsR0FHQUYsRUFGQXBnQyxFQUFBc2dDLElBRUExbEcsRUFFQTZqRyxFQUFBN2pHLEdBQUEybEcsRUFDQTlCLEVBQUFoc0MsTUFFQTZzQyxFQUFBMWtHLEdBQUEwa0csRUFBQWdCLEdBQ0FoQixFQUFBN3NDLE1BRUE0c0MsRUFBQXprRyxHQUFBeWtHLEVBQUFpQixHQUNBakIsRUFBQTVzQyxLQUVBLENBRUEsRUMvWUEsTUFBQSt0QyxHQVVBLFdBQUF4akcsQ0FBQXlqRyxFQUFBN3BCLEVBQUE4cEIsRUFBQSxLQUFBN25CLEVBQUFqQyxFQUFBaUMsV0FFQXorRSxLQUFBdW1HLE9BQUFGLEVBQ0FybUcsS0FBQXdtRyxNQUFBaHFCLEVBQ0F4OEUsS0FBQXltRyxXQUFBSCxFQVFBdG1HLEtBQUF5K0UsVUFBQUEsRUFFQSxNQUFBaEMsRUFBQUQsRUFBQUMsT0FDQWlxQixFQUFBanFCLEVBQUF4N0UsT0FDQTBsRyxFQUFBLElBQUFyd0YsTUFBQW93RixHQUVBRSxFQUFBLENBQ0ExbUIsWUFBQWxrRixHQUNBbWtGLFVBQUFua0YsSUFHQSxJQUFBLElBQUErRSxFQUFBLEVBQUFBLElBQUEybEcsSUFBQTNsRyxFQUFBLENBRUEsTUFBQW85RSxFQUFBMUIsRUFBQTE3RSxHQUFBNjhFLGtCQUFBLE1BQ0Erb0IsRUFBQTVsRyxHQUFBbzlFLEVBQ0FBLEVBQUFZLFNBQUE2bkIsQ0FFQSxDQUVBNW1HLEtBQUE2bUcscUJBQUFELEVBRUE1bUcsS0FBQThtRyxjQUFBSCxFQUdBM21HLEtBQUErbUcsa0JBQUEsSUFBQXp3RixNQUFBb3dGLEdBRUExbUcsS0FBQWduRyxZQUFBLEtBQ0FobkcsS0FBQWluRyxrQkFBQSxLQUVBam5HLEtBQUFrbkcsc0JBQUEsS0FDQWxuRyxLQUFBbW5HLG1CQUFBLEtBUUFubkcsS0FBQXk0RixLdkw2Z0NZLEt1TDVnQ1p6NEYsS0FBQW9uRyxZQUFBLEVBSUFwbkcsS0FBQXFuRyxXQUFBLEtBV0FybkcsS0FBQWk4RSxLQUFBLEVBU0FqOEUsS0FBQW1pRixVQUFBLEVBQ0FuaUYsS0FBQXNuRyxvQkFBQSxFQVVBdG5HLEtBQUF5c0QsT0FBQSxFQUNBenNELEtBQUF1bkcsaUJBQUEsRUFZQXZuRyxLQUFBd25HLFlBQUFyaUYsSUFRQW5sQixLQUFBeW5HLFFBQUEsRUFXQXpuRyxLQUFBaVMsU0FBQSxFQWVBalMsS0FBQTBuRyxtQkFBQSxFQVFBMW5HLEtBQUEybkcsa0JBQUEsRUFRQTNuRyxLQUFBNG5HLGdCQUFBLENBRUEsQ0FPQSxJQUFBOU4sR0FJQSxPQUZBOTVGLEtBQUF1bUcsT0FBQXNCLGdCQUFBN25HLE1BRUFBLElBRUEsQ0FPQSxJQUFBdXNFLEdBSUEsT0FGQXZzRSxLQUFBdW1HLE9BQUF1QixrQkFBQTluRyxNQUVBQSxLQUFBMnlELE9BRUEsQ0FPQSxLQUFBQSxHQVNBLE9BUEEzeUQsS0FBQXluRyxRQUFBLEVBQ0F6bkcsS0FBQWlTLFNBQUEsRUFFQWpTLEtBQUFpOEUsS0FBQSxFQUNBajhFLEtBQUFvbkcsWUFBQSxFQUNBcG5HLEtBQUFxbkcsV0FBQSxLQUVBcm5HLEtBQUErbkcsYUFBQUMsYUFFQSxDQU9BLFNBQUFDLEdBRUEsT0FBQWpvRyxLQUFBaVMsVUFBQWpTLEtBQUF5bkcsUUFBQSxJQUFBem5HLEtBQUFtaUYsV0FDQSxPQUFBbmlGLEtBQUFxbkcsWUFBQXJuRyxLQUFBdW1HLE9BQUEyQixnQkFBQWxvRyxLQUVBLENBT0EsV0FBQW1vRyxHQUVBLE9BQUFub0csS0FBQXVtRyxPQUFBMkIsZ0JBQUFsb0csS0FFQSxDQVFBLE9BQUFvb0csQ0FBQW5zQixHQUlBLE9BRkFqOEUsS0FBQXFuRyxXQUFBcHJCLEVBRUFqOEUsSUFFQSxDQVNBLE9BQUEyNkYsQ0FBQTBOLEVBQUFiLEdBS0EsT0FIQXhuRyxLQUFBeTRGLEtBQUE0UCxFQUNBcm9HLEtBQUF3bkcsWUFBQUEsRUFFQXhuRyxJQUVBLENBV0Esa0JBQUFzb0csQ0FBQTc3QyxHQU9BLE9BTEF6c0QsS0FBQXlzRCxPQUFBQSxFQUdBenNELEtBQUF1bkcsaUJBQUF2bkcsS0FBQWlTLFFBQUF3NkMsRUFBQSxFQUVBenNELEtBQUErbkcsWUFFQSxDQU9BLGtCQUFBUSxHQUVBLE9BQUF2b0csS0FBQXVuRyxnQkFFQSxDQVNBLE1BQUFpQixDQUFBM2tCLEdBRUEsT0FBQTdqRixLQUFBeW9HLGdCQUFBNWtCLEVBQUEsRUFBQSxFQUVBLENBU0EsT0FBQTZrQixDQUFBN2tCLEdBRUEsT0FBQTdqRixLQUFBeW9HLGdCQUFBNWtCLEVBQUEsRUFBQSxFQUVBLENBV0EsYUFBQThrQixDQUFBQyxFQUFBL2tCLEVBQUFnbEIsR0FBQSxHQUtBLEdBSEFELEVBQUFGLFFBQUE3a0IsR0FDQTdqRixLQUFBd29HLE9BQUEza0IsSUFFQSxJQUFBZ2xCLEVBQUEsQ0FFQSxNQUFBQyxFQUFBOW9HLEtBQUF3bUcsTUFBQTNpQixTQUNBa2xCLEVBQUFILEVBQUFwQyxNQUFBM2lCLFNBRUFtbEIsRUFBQUQsRUFBQUQsRUFDQUcsRUFBQUgsRUFBQUMsRUFFQUgsRUFBQUMsS0FBQSxFQUFBRyxFQUFBbmxCLEdBQ0E3akYsS0FBQTZvRyxLQUFBSSxFQUFBLEVBQUFwbEIsRUFFQSxDQUVBLE9BQUE3akYsSUFFQSxDQVdBLFdBQUFrcEcsQ0FBQUMsRUFBQXRsQixFQUFBZ2xCLEdBQUEsR0FFQSxPQUFBTSxFQUFBUixjQUFBM29HLEtBQUE2akYsRUFBQWdsQixFQUVBLENBT0EsVUFBQWQsR0FFQSxNQUFBcUIsRUFBQXBwRyxLQUFBbW5HLG1CQVNBLE9BUEEsT0FBQWlDLElBRUFwcEcsS0FBQW1uRyxtQkFBQSxLQUNBbm5HLEtBQUF1bUcsT0FBQThDLDRCQUFBRCxJQUlBcHBHLElBRUEsQ0FXQSxxQkFBQXNwRyxDQUFBbm5CLEdBS0EsT0FIQW5pRixLQUFBbWlGLFVBQUFBLEVBQ0FuaUYsS0FBQXNuRyxvQkFBQXRuRyxLQUFBeW5HLE9BQUEsRUFBQXRsQixFQUVBbmlGLEtBQUFnb0csYUFFQSxDQU9BLHFCQUFBdUIsR0FFQSxPQUFBdnBHLEtBQUFzbkcsbUJBRUEsQ0FRQSxXQUFBa0MsQ0FBQTNsQixHQUlBLE9BRkE3akYsS0FBQW1pRixVQUFBbmlGLEtBQUF3bUcsTUFBQTNpQixTQUFBQSxFQUVBN2pGLEtBQUFnb0csYUFFQSxDQVFBLFFBQUF5QixDQUFBQyxHQUtBLE9BSEExcEcsS0FBQWk4RSxLQUFBeXRCLEVBQUF6dEIsS0FDQWo4RSxLQUFBbWlGLFVBQUF1bkIsRUFBQXZuQixVQUVBbmlGLEtBQUFnb0csYUFFQSxDQVFBLElBQUEyQixDQUFBOWxCLEdBRUEsT0FBQTdqRixLQUFBNm9HLEtBQUE3b0csS0FBQXNuRyxvQkFBQSxFQUFBempCLEVBRUEsQ0FZQSxJQUFBZ2xCLENBQUFlLEVBQUFDLEVBQUFobUIsR0FFQSxNQUFBd2lCLEVBQUFybUcsS0FBQXVtRyxPQUNBblEsRUFBQWlRLEVBQUFwcUIsS0FDQWtHLEVBQUFuaUYsS0FBQW1pRixVQUVBLElBQUFoRSxFQUFBbitFLEtBQUFrbkcsc0JBRUEsT0FBQS9vQixJQUVBQSxFQUFBa29CLEVBQUF5RCwwQkFDQTlwRyxLQUFBa25HLHNCQUFBL29CLEdBSUEsTUFBQXpDLEVBQUF5QyxFQUFBUSxtQkFDQXZoRCxFQUFBK2dELEVBQUFTLGFBUUEsT0FOQWxELEVBQUEsR0FBQTBhLEVBQ0ExYSxFQUFBLEdBQUEwYSxFQUFBdlMsRUFFQXptRCxFQUFBLEdBQUF3c0UsRUFBQXpuQixFQUNBL2tELEVBQUEsR0FBQXlzRSxFQUFBMW5CLEVBRUFuaUYsSUFFQSxDQU9BLFdBQUFnb0csR0FFQSxNQUFBK0IsRUFBQS9wRyxLQUFBa25HLHNCQVNBLE9BUEEsT0FBQTZDLElBRUEvcEcsS0FBQWtuRyxzQkFBQSxLQUNBbG5HLEtBQUF1bUcsT0FBQThDLDRCQUFBVSxJQUlBL3BHLElBRUEsQ0FPQSxRQUFBZ3FHLEdBRUEsT0FBQWhxRyxLQUFBdW1HLE1BRUEsQ0FPQSxPQUFBMEQsR0FFQSxPQUFBanFHLEtBQUF3bUcsS0FFQSxDQU9BLE9BQUEwRCxHQUVBLE9BQUFscUcsS0FBQXltRyxZQUFBem1HLEtBQUF1bUcsT0FBQTRELEtBRUEsQ0FJQSxPQUFBQyxDQUFBbnVCLEVBQUFvdUIsRUFBQUMsRUFBQTFMLEdBSUEsSUFBQTUrRixLQUFBaVMsUUFLQSxZQURBalMsS0FBQXVxRyxjQUFBdHVCLEdBS0EsTUFBQW9HLEVBQUFyaUYsS0FBQXFuRyxXQUVBLEdBQUEsT0FBQWhsQixFQUFBLENBSUEsTUFBQW1vQixHQUFBdnVCLEVBQUFvRyxHQUFBaW9CLEVBQ0FFLEVBQUEsR0FBQSxJQUFBRixFQUVBRCxFQUFBLEdBS0FycUcsS0FBQXFuRyxXQUFBLEtBQ0FnRCxFQUFBQyxFQUFBRSxFQUlBLENBSUFILEdBQUFycUcsS0FBQXlxRyxpQkFBQXh1QixHQUNBLE1BQUF5dUIsRUFBQTFxRyxLQUFBMnFHLFlBQUFOLEdBS0E1OUMsRUFBQXpzRCxLQUFBdXFHLGNBQUF0dUIsR0FFQSxHQUFBeHZCLEVBQUEsRUFBQSxDQUVBLE1BQUFrNkMsRUFBQTNtRyxLQUFBOG1HLGNBQ0E4RCxFQUFBNXFHLEtBQUErbUcsa0JBRUEsR0FBQS9tRyxLQUFBeStFLFlBRUFyaUYsR0FFQSxJQUFBLElBQUFpdEIsRUFBQSxFQUFBL21CLEVBQUFxa0csRUFBQTFsRyxPQUFBb29CLElBQUEvbUIsSUFBQSttQixFQUVBczlFLEVBQUF0OUUsR0FBQSswRCxTQUFBc3NCLEdBQ0FFLEVBQUF2aEYsR0FBQTAxRSxtQkFBQXR5QyxRQVNBLElBQUEsSUFBQXBqQyxFQUFBLEVBQUEvbUIsRUFBQXFrRyxFQUFBMWxHLE9BQUFvb0IsSUFBQS9tQixJQUFBK21CLEVBRUFzOUUsRUFBQXQ5RSxHQUFBKzBELFNBQUFzc0IsR0FDQUUsRUFBQXZoRixHQUFBczFFLFdBQUFDLEVBQUFueUMsRUFNQSxDQUVBLENBRUEsYUFBQTg5QyxDQUFBdHVCLEdBRUEsSUFBQXh2QixFQUFBLEVBRUEsR0FBQXpzRCxLQUFBaVMsUUFBQSxDQUVBdzZDLEVBQUF6c0QsS0FBQXlzRCxPQUNBLE1BQUEweEIsRUFBQW4rRSxLQUFBbW5HLG1CQUVBLEdBQUEsT0FBQWhwQixFQUFBLENBRUEsTUFBQTBzQixFQUFBMXNCLEVBQUFDLFNBQUFuQyxHQUFBLEdBRUF4dkIsR0FBQW8rQyxFQUVBNXVCLEVBQUFrQyxFQUFBUSxtQkFBQSxLQUVBMytFLEtBQUErbkcsYUFFQSxJQUFBOEMsSUFHQTdxRyxLQUFBaVMsU0FBQSxHQU1BLENBRUEsQ0FHQSxPQURBalMsS0FBQXVuRyxpQkFBQTk2QyxFQUNBQSxDQUVBLENBRUEsZ0JBQUFnK0MsQ0FBQXh1QixHQUVBLElBQUFrRyxFQUFBLEVBRUEsSUFBQW5pRixLQUFBeW5HLE9BQUEsQ0FFQXRsQixFQUFBbmlGLEtBQUFtaUYsVUFFQSxNQUFBaEUsRUFBQW4rRSxLQUFBa25HLHNCQUVBLEdBQUEsT0FBQS9vQixFQUFBLENBSUFnRSxHQUZBaEUsRUFBQUMsU0FBQW5DLEdBQUEsR0FJQUEsRUFBQWtDLEVBQUFRLG1CQUFBLEtBRUEzK0UsS0FBQWdvRyxjQUVBLElBQUE3bEIsRUFHQW5pRixLQUFBeW5HLFFBQUEsRUFLQXpuRyxLQUFBbWlGLFVBQUFBLEVBTUEsQ0FFQSxDQUdBLE9BREFuaUYsS0FBQXNuRyxvQkFBQW5sQixFQUNBQSxDQUVBLENBRUEsV0FBQXdvQixDQUFBTixHQUVBLE1BQUF4bUIsRUFBQTdqRixLQUFBd21HLE1BQUEzaUIsU0FDQTRVLEVBQUF6NEYsS0FBQXk0RixLQUVBLElBQUF4YyxFQUFBajhFLEtBQUFpOEUsS0FBQW91QixFQUNBUyxFQUFBOXFHLEtBQUFvbkcsV0FFQSxNQUFBMkQsRXZMMFlZLE91TDFZWnRTLEVBRUEsR0FBQSxJQUFBNFIsRUFFQSxPQUFBLElBQUFTLElBRUFDLEdBQUEsR0FBQUQsRUFGQTd1QixFQUVBNEgsRUFBQTVILEVBSUEsR3ZMOFdZLE91TDlXWndjLEVBQUEsRUFFQSxJQUFBcVMsSUFJQTlxRyxLQUFBb25HLFdBQUEsRUFDQXBuRyxLQUFBZ3JHLGFBQUEsR0FBQSxHQUFBLElBSUFDLEVBQUEsQ0FFQSxHQUFBaHZCLEdBQUE0SCxFQUVBNUgsRUFBQTRILE1BRUEsTUFBQTVILEVBQUEsR0FJQSxDQUVBajhFLEtBQUFpOEUsS0FBQUEsRUFFQSxNQUFBZ3ZCLENBRUEsQ0FSQWh2QixFQUFBLENBUUEsQ0FFQWo4RSxLQUFBMG5HLGtCQUFBMW5HLEtBQUF5bkcsUUFBQSxFQUNBem5HLEtBQUFpUyxTQUFBLEVBRUFqUyxLQUFBaThFLEtBQUFBLEVBRUFqOEUsS0FBQXVtRyxPQUFBN2xHLGNBQUEsQ0FDQWIsS0FBQSxXQUFBNnBHLE9BQUExcEcsS0FDQThxQixVQUFBdS9FLEVBQUEsR0FBQSxFQUFBLEdBR0EsQ0FFQSxLQUFBLENBd0JBLElBdEJBLElBQUFTLElBSUFULEdBQUEsR0FFQVMsRUFBQSxFQUVBOXFHLEtBQUFnckcsYUFBQSxFQUFBLElBQUFockcsS0FBQXduRyxZQUFBdUQsSUFRQS9xRyxLQUFBZ3JHLFlBQUEsSUFBQWhyRyxLQUFBd25HLGFBQUEsRUFBQXVELElBTUE5dUIsR0FBQTRILEdBQUE1SCxFQUFBLEVBQUEsQ0FJQSxNQUFBaXZCLEVBQUE1cEcsS0FBQW1ELE1BQUF3M0UsRUFBQTRILEdBQ0E1SCxHQUFBNEgsRUFBQXFuQixFQUVBSixHQUFBeHBHLEtBQUE2QyxJQUFBK21HLEdBRUEsTUFBQUMsRUFBQW5yRyxLQUFBd25HLFlBQUFzRCxFQUVBLEdBQUFLLEdBQUEsRUFJQW5yRyxLQUFBMG5HLGtCQUFBMW5HLEtBQUF5bkcsUUFBQSxFQUNBem5HLEtBQUFpUyxTQUFBLEVBRUFncUUsRUFBQW91QixFQUFBLEVBQUF4bUIsRUFBQSxFQUVBN2pGLEtBQUFpOEUsS0FBQUEsRUFFQWo4RSxLQUFBdW1HLE9BQUE3bEcsY0FBQSxDQUNBYixLQUFBLFdBQUE2cEcsT0FBQTFwRyxLQUNBOHFCLFVBQUF1L0UsRUFBQSxFQUFBLEdBQUEsUUFHQSxDQUlBLEdBQUEsSUFBQWMsRUFBQSxDQUlBLE1BQUFDLEVBQUFmLEVBQUEsRUFDQXJxRyxLQUFBZ3JHLFlBQUFJLEdBQUFBLEVBQUFMLEVBRUEsTUFFQS9xRyxLQUFBZ3JHLGFBQUEsR0FBQSxFQUFBRCxHQUlBL3FHLEtBQUFvbkcsV0FBQTBELEVBRUE5cUcsS0FBQWk4RSxLQUFBQSxFQUVBajhFLEtBQUF1bUcsT0FBQTdsRyxjQUFBLENBQ0FiLEtBQUEsT0FBQTZwRyxPQUFBMXBHLEtBQUFrckcsVUFBQUEsR0FHQSxDQUVBLE1BRUFsckcsS0FBQWk4RSxLQUFBQSxFQUlBLEdBQUE4dUIsS0FBQSxHQUFBRCxHQUlBLE9BQUFqbkIsRUFBQTVILENBSUEsQ0FFQSxPQUFBQSxDQUVBLENBRUEsV0FBQSt1QixDQUFBSSxFQUFBQyxFQUFBTixHQUVBLE1BQUFoc0IsRUFBQS8rRSxLQUFBNm1HLHFCQUVBa0UsR0FFQWhzQixFQUFBbUIsWUFBQWprRixHQUNBOGlGLEVBQUFvQixVQUFBbGtGLEtBUUE4aUYsRUFBQW1CLFlBRkFrckIsRUFFQXByRyxLQUFBMm5HLGlCQUFBMXJHLEdBQUFELEdBSUFFLEdBTUE2aUYsRUFBQW9CLFVBRkFrckIsRUFFQXJyRyxLQUFBNG5HLGVBQUEzckcsR0FBQUQsR0FJQUUsR0FNQSxDQUVBLGVBQUF1c0csQ0FBQTVrQixFQUFBeW5CLEVBQUFDLEdBRUEsTUFBQWxGLEVBQUFybUcsS0FBQXVtRyxPQUFBblEsRUFBQWlRLEVBQUFwcUIsS0FDQSxJQUFBa0MsRUFBQW4rRSxLQUFBbW5HLG1CQUVBLE9BQUFocEIsSUFFQUEsRUFBQWtvQixFQUFBeUQsMEJBQ0E5cEcsS0FBQW1uRyxtQkFBQWhwQixHQUlBLE1BQUF6QyxFQUFBeUMsRUFBQVEsbUJBQ0F2aEQsRUFBQStnRCxFQUFBUyxhQU9BLE9BTEFsRCxFQUFBLEdBQUEwYSxFQUNBaDVELEVBQUEsR0FBQWt1RSxFQUNBNXZCLEVBQUEsR0FBQTBhLEVBQUF2UyxFQUNBem1ELEVBQUEsR0FBQW11RSxFQUVBdnJHLElBRUEsRUN0NUJBLE1BQUF3ckcsR0FBQSxJQUFBM29HLGFBQUEsR0FPQSxNQUFBNG9HLFdBQUE5ckcsR0FPQSxXQUFBaUQsQ0FBQTg5RixHQUVBbnBGLFFBRUF2WCxLQUFBbXFHLE1BQUF6SixFQUNBMWdHLEtBQUEwckcscUJBQ0ExckcsS0FBQTJyRyxXQUFBLEVBUUEzckcsS0FBQWk4RSxLQUFBLEVBWUFqOEUsS0FBQW1pRixVQUFBLENBRUEsQ0FFQSxXQUFBeXBCLENBQUFsQyxFQUFBbUMsR0FFQSxNQUFBbkwsRUFBQWdKLEVBQUFqRCxZQUFBem1HLEtBQUFtcUcsTUFDQTF0QixFQUFBaXRCLEVBQUFsRCxNQUFBL3BCLE9BQ0FpcUIsRUFBQWpxQixFQUFBeDdFLE9BQ0FvakcsRUFBQXFGLEVBQUEzQyxrQkFDQUosRUFBQStDLEVBQUE1QyxjQUNBZ0YsRUFBQXBMLEVBQUE5cUYsS0FDQW0yRixFQUFBL3JHLEtBQUFnc0csdUJBRUEsSUFBQUMsRUFBQUYsRUFBQUQsUUFFQS9yRyxJQUFBa3NHLElBRUFBLEVBQUEsQ0FBQSxFQUNBRixFQUFBRCxHQUFBRyxHQUlBLElBQUEsSUFBQWxyRyxFQUFBLEVBQUFBLElBQUEybEcsSUFBQTNsRyxFQUFBLENBRUEsTUFBQTI3RSxFQUFBRCxFQUFBMTdFLEdBQ0Fxa0YsRUFBQTFJLEVBQUF0c0UsS0FFQSxJQUFBaXRGLEVBQUE0TyxFQUFBN21CLEdBRUEsUUFBQXJsRixJQUFBczlGLElBRUFBLEVBQUFxQixlQUNBMkYsRUFBQXRqRyxHQUFBczhGLE1BRUEsQ0FJQSxHQUZBQSxFQUFBZ0gsRUFBQXRqRyxRQUVBaEIsSUFBQXM5RixFQUFBLENBSUEsT0FBQUEsRUFBQTJKLGdCQUVBM0osRUFBQXFCLGVBQ0ExK0YsS0FBQWtzRyxvQkFBQTdPLEVBQUF5TyxFQUFBMW1CLElBSUEsUUFFQSxDQUVBLE1BQUF4ZixFQUFBaW1DLEdBQUFBLEVBQ0E5RSxrQkFBQWhtRyxHQUFBczhGLFFBQUE2QyxXQUVBN0MsRUFBQSxJQUFBRCxHQUNBNEMsR0FBQVMsT0FBQUMsRUFBQXRiLEVBQUF4ZixHQUNBOFcsRUFBQWEsY0FBQWIsRUFBQUUsa0JBRUF5Z0IsRUFBQXFCLGVBQ0ExK0YsS0FBQWtzRyxvQkFBQTdPLEVBQUF5TyxFQUFBMW1CLEdBRUFpZixFQUFBdGpHLEdBQUFzOEYsQ0FFQSxDQUVBc0osRUFBQTVsRyxHQUFBczlFLGFBQUFnZixFQUFBbnRGLE1BRUEsQ0FFQSxDQUVBLGVBQUEyM0YsQ0FBQTZCLEdBRUEsSUFBQTFwRyxLQUFBa29HLGdCQUFBd0IsR0FBQSxDQUVBLEdBQUEsT0FBQUEsRUFBQTFDLFlBQUEsQ0FLQSxNQUFBOEUsR0FBQXBDLEVBQUFqRCxZQUFBem1HLEtBQUFtcUcsT0FBQXYwRixLQUNBdTJGLEVBQUF6QyxFQUFBbEQsTUFBQTV3RixLQUNBdzJGLEVBQUFwc0csS0FBQXFzRyxlQUFBRixHQUVBbnNHLEtBQUE0ckcsWUFBQWxDLEVBQ0EwQyxHQUFBQSxFQUFBRSxhQUFBLElBRUF0c0csS0FBQXVzRyxtQkFBQTdDLEVBQUF5QyxFQUFBTCxFQUVBLENBRUEsTUFBQXpILEVBQUFxRixFQUFBM0Msa0JBR0EsSUFBQSxJQUFBaG1HLEVBQUEsRUFBQXNCLEVBQUFnaUcsRUFBQXBqRyxPQUFBRixJQUFBc0IsSUFBQXRCLEVBQUEsQ0FFQSxNQUFBczhGLEVBQUFnSCxFQUFBdGpHLEdBRUEsR0FBQXM4RixFQUFBb0IsYUFFQXorRixLQUFBd3NHLGFBQUFuUCxHQUNBQSxFQUFBK0Isb0JBSUEsQ0FFQXAvRixLQUFBeXNHLFlBQUEvQyxFQUVBLENBRUEsQ0FFQSxpQkFBQTVCLENBQUE0QixHQUVBLEdBQUExcEcsS0FBQWtvRyxnQkFBQXdCLEdBQUEsQ0FFQSxNQUFBckYsRUFBQXFGLEVBQUEzQyxrQkFHQSxJQUFBLElBQUFobUcsRUFBQSxFQUFBc0IsRUFBQWdpRyxFQUFBcGpHLE9BQUFGLElBQUFzQixJQUFBdEIsRUFBQSxDQUVBLE1BQUFzOEYsRUFBQWdILEVBQUF0akcsR0FFQSxLQUFBczhGLEVBQUFvQixXQUVBcEIsRUFBQWlDLHVCQUNBdC9GLEtBQUEwc0csaUJBQUFyUCxHQUlBLENBRUFyOUYsS0FBQTJzRyxnQkFBQWpELEVBRUEsQ0FFQSxDQUlBLGtCQUFBZ0MsR0FFQTFyRyxLQUFBNHNHLFNBQUEsR0FDQTVzRyxLQUFBNnNHLGdCQUFBLEVBRUE3c0csS0FBQXFzRyxlQUFBLENBQUEsRUFRQXJzRyxLQUFBaWtHLFVBQUEsR0FDQWprRyxLQUFBOHNHLGlCQUFBLEVBRUE5c0csS0FBQWdzRyx1QkFBQSxDQUFBLEVBR0Foc0csS0FBQStzRyxxQkFBQSxHQUNBL3NHLEtBQUFndEcsNEJBQUEsRUFFQSxNQUFBcnZELEVBQUEzOUMsS0FFQUEsS0FBQTRrRyxNQUFBLENBRUFxSSxRQUFBLENBQ0EsU0FBQXBqQixHQUVBLE9BQUFsc0MsRUFBQWl2RCxTQUFBM3JHLE1BRUEsRUFDQSxTQUFBNmpHLEdBRUEsT0FBQW5uRCxFQUFBa3ZELGVBRUEsR0FFQXhJLFNBQUEsQ0FDQSxTQUFBeGEsR0FFQSxPQUFBbHNDLEVBQUFzbUQsVUFBQWhqRyxNQUVBLEVBQ0EsU0FBQTZqRyxHQUVBLE9BQUFubkQsRUFBQW12RCxnQkFFQSxHQUVBSSxvQkFBQSxDQUNBLFNBQUFyakIsR0FFQSxPQUFBbHNDLEVBQUFvdkQscUJBQUE5ckcsTUFFQSxFQUNBLFNBQUE2akcsR0FFQSxPQUFBbm5ELEVBQUFxdkQsMkJBRUEsR0FLQSxDQUlBLGVBQUE5RSxDQUFBd0IsR0FFQSxNQUFBbHBHLEVBQUFrcEcsRUFBQTFDLFlBQ0EsT0FBQSxPQUFBeG1HLEdBQUFBLEVBQUFSLEtBQUE2c0csZUFFQSxDQUVBLGtCQUFBTixDQUFBN0MsRUFBQXlDLEVBQUFMLEdBRUEsTUFBQW1CLEVBQUFqdEcsS0FBQTRzRyxTQUNBTyxFQUFBbnRHLEtBQUFxc0csZUFFQSxJQUFBRCxFQUFBZSxFQUFBaEIsR0FFQSxRQUFBcHNHLElBQUFxc0csRUFFQUEsRUFBQSxDQUVBRSxhQUFBLENBQUE1QyxHQUNBMEQsYUFBQSxDQUFBLEdBSUExRCxFQUFBekMsa0JBQUEsRUFFQWtHLEVBQUFoQixHQUFBQyxNQUVBLENBRUEsTUFBQUUsRUFBQUYsRUFBQUUsYUFFQTVDLEVBQUF6QyxrQkFBQXFGLEVBQUFyckcsT0FDQXFyRyxFQUFBbHNHLEtBQUFzcEcsRUFFQSxDQUVBQSxFQUFBMUMsWUFBQWlHLEVBQUFoc0csT0FDQWdzRyxFQUFBN3NHLEtBQUFzcEcsR0FFQTBDLEVBQUFnQixhQUFBdEIsR0FBQXBDLENBRUEsQ0FFQSxxQkFBQTJELENBQUEzRCxHQUVBLE1BQUF1RCxFQUFBanRHLEtBQUE0c0csU0FDQVUsRUFBQUwsRUFBQUEsRUFBQWhzRyxPQUFBLEdBQ0Fzc0csRUFBQTdELEVBQUExQyxZQUVBc0csRUFBQXRHLFlBQUF1RyxFQUNBTixFQUFBTSxHQUFBRCxFQUNBTCxFQUFBNTBDLE1BRUFxeEMsRUFBQTFDLFlBQUEsS0FHQSxNQUFBbUYsRUFBQXpDLEVBQUFsRCxNQUFBNXdGLEtBQ0F1M0YsRUFBQW50RyxLQUFBcXNHLGVBQ0FELEVBQUFlLEVBQUFoQixHQUNBcUIsRUFBQXBCLEVBQUFFLGFBRUFtQixFQUNBRCxFQUFBQSxFQUFBdnNHLE9BQUEsR0FFQXlzRyxFQUFBaEUsRUFBQXpDLGtCQUVBd0csRUFBQXhHLGtCQUFBeUcsRUFDQUYsRUFBQUUsR0FBQUQsRUFDQUQsRUFBQW4xQyxNQUVBcXhDLEVBQUF6QyxrQkFBQSxZQUdBbUYsRUFBQWdCLGNBQ0ExRCxFQUFBakQsWUFBQXptRyxLQUFBbXFHLE9BQUF2MEYsTUFJQSxJQUFBNDNGLEVBQUF2c0csZUFFQWtzRyxFQUFBaEIsR0FJQW5zRyxLQUFBMnRHLGlDQUFBakUsRUFFQSxDQUVBLGdDQUFBaUUsQ0FBQWpFLEdBRUEsTUFBQXJGLEVBQUFxRixFQUFBM0Msa0JBRUEsSUFBQSxJQUFBaG1HLEVBQUEsRUFBQXNCLEVBQUFnaUcsRUFBQXBqRyxPQUFBRixJQUFBc0IsSUFBQXRCLEVBQUEsQ0FFQSxNQUFBczhGLEVBQUFnSCxFQUFBdGpHLEdBRUEsS0FBQXM4RixFQUFBcUIsZ0JBRUExK0YsS0FBQTR0Ryx1QkFBQXZRLEVBSUEsQ0FFQSxDQUVBLFdBQUFvUCxDQUFBL0MsR0FRQSxNQUFBdUQsRUFBQWp0RyxLQUFBNHNHLFNBQ0FpQixFQUFBbkUsRUFBQTFDLFlBRUE4RyxFQUFBOXRHLEtBQUE2c0csa0JBRUFrQixFQUFBZCxFQUFBYSxHQUVBcEUsRUFBQTFDLFlBQUE4RyxFQUNBYixFQUFBYSxHQUFBcEUsRUFFQXFFLEVBQUEvRyxZQUFBNkcsRUFDQVosRUFBQVksR0FBQUUsQ0FFQSxDQUVBLGVBQUFwQixDQUFBakQsR0FRQSxNQUFBdUQsRUFBQWp0RyxLQUFBNHNHLFNBQ0FpQixFQUFBbkUsRUFBQTFDLFlBRUFnSCxJQUFBaHVHLEtBQUE2c0csZ0JBRUFvQixFQUFBaEIsRUFBQWUsR0FFQXRFLEVBQUExQyxZQUFBZ0gsRUFDQWYsRUFBQWUsR0FBQXRFLEVBRUF1RSxFQUFBakgsWUFBQTZHLEVBQ0FaLEVBQUFZLEdBQUFJLENBRUEsQ0FJQSxtQkFBQS9CLENBQUE3TyxFQUFBeU8sRUFBQTFtQixHQUVBLE1BQUEybUIsRUFBQS9yRyxLQUFBZ3NHLHVCQUNBM0gsRUFBQXJrRyxLQUFBaWtHLFVBRUEsSUFBQWlLLEVBQUFuQyxFQUFBRCxRQUVBL3JHLElBQUFtdUcsSUFFQUEsRUFBQSxDQUFBLEVBQ0FuQyxFQUFBRCxHQUFBb0MsR0FJQUEsRUFBQTlvQixHQUFBaVksRUFFQUEsRUFBQTJKLFlBQUEzQyxFQUFBcGpHLE9BQ0FvakcsRUFBQWprRyxLQUFBaTlGLEVBRUEsQ0FFQSxzQkFBQXVRLENBQUF2USxHQUVBLE1BQUFnSCxFQUFBcmtHLEtBQUFpa0csVUFDQWtLLEVBQUE5USxFQUFBQSxRQUNBeU8sRUFBQXFDLEVBQUFsTyxTQUFBcnFGLEtBQ0F3dkUsRUFBQStvQixFQUFBdm9DLEtBQ0FtbUMsRUFBQS9yRyxLQUFBZ3NHLHVCQUNBa0MsRUFBQW5DLEVBQUFELEdBRUFzQyxFQUFBL0osRUFBQUEsRUFBQXBqRyxPQUFBLEdBQ0Fzc0csRUFBQWxRLEVBQUEySixZQUVBb0gsRUFBQXBILFlBQUF1RyxFQUNBbEosRUFBQWtKLEdBQUFhLEVBQ0EvSixFQUFBaHNDLGFBRUE2MUMsRUFBQTlvQixHQUVBLElBQUE3eEUsT0FBQXlGLEtBQUFrMUYsR0FBQWp0RyxlQUVBOHFHLEVBQUFELEVBSUEsQ0FFQSxZQUFBVSxDQUFBblAsR0FFQSxNQUFBZ0gsRUFBQXJrRyxLQUFBaWtHLFVBQ0E0SixFQUFBeFEsRUFBQTJKLFlBRUE4RyxFQUFBOXRHLEtBQUE4c0csbUJBRUF1QixFQUFBaEssRUFBQXlKLEdBRUF6USxFQUFBMkosWUFBQThHLEVBQ0F6SixFQUFBeUosR0FBQXpRLEVBRUFnUixFQUFBckgsWUFBQTZHLEVBQ0F4SixFQUFBd0osR0FBQVEsQ0FFQSxDQUVBLGdCQUFBM0IsQ0FBQXJQLEdBRUEsTUFBQWdILEVBQUFya0csS0FBQWlrRyxVQUNBNEosRUFBQXhRLEVBQUEySixZQUVBZ0gsSUFBQWh1RyxLQUFBOHNHLGlCQUVBd0IsRUFBQWpLLEVBQUEySixHQUVBM1EsRUFBQTJKLFlBQUFnSCxFQUNBM0osRUFBQTJKLEdBQUEzUSxFQUVBaVIsRUFBQXRILFlBQUE2RyxFQUNBeEosRUFBQXdKLEdBQUFTLENBRUEsQ0FLQSx1QkFBQXhFLEdBRUEsTUFBQW5ELEVBQUEzbUcsS0FBQStzRyxxQkFDQWUsRUFBQTl0RyxLQUFBZ3RHLDhCQUVBLElBQUE3dUIsRUFBQXdvQixFQUFBbUgsR0FhQSxZQVhBL3RHLElBQUFvK0UsSUFFQUEsRUFBQSxJQUFBOEMsR0FDQSxJQUFBcCtFLGFBQUEsR0FBQSxJQUFBQSxhQUFBLEdBQ0EsRUFBQTJvRyxJQUVBcnRCLEVBQUFvd0IsYUFBQVQsRUFDQW5ILEVBQUFtSCxHQUFBM3ZCLEdBSUFBLENBRUEsQ0FFQSwyQkFBQWtyQixDQUFBbHJCLEdBRUEsTUFBQXdvQixFQUFBM21HLEtBQUErc0cscUJBQ0FjLEVBQUExdkIsRUFBQW93QixhQUVBUCxJQUFBaHVHLEtBQUFndEcsNEJBRUF3QixFQUFBN0gsRUFBQXFILEdBRUE3dkIsRUFBQW93QixhQUFBUCxFQUNBckgsRUFBQXFILEdBQUE3dkIsRUFFQXF3QixFQUFBRCxhQUFBVixFQUNBbEgsRUFBQWtILEdBQUFXLENBRUEsQ0FjQSxVQUFBQyxDQUFBanlCLEVBQUFreUIsRUFBQWp3QixHQUVBLE1BQUFpaUIsRUFBQWdPLEdBQUExdUcsS0FBQW1xRyxNQUNBMkIsRUFBQXBMLEVBQUE5cUYsS0FFQSxJQUFBKzRGLEVBQUEsaUJBQUFueUIsRUFBQW9ILEdBQUFVLFdBQUFvYyxFQUFBbGtCLEdBQUFBLEVBRUEsTUFBQTJ2QixFQUFBLE9BQUF3QyxFQUFBQSxFQUFBLzRGLEtBQUE0bUUsRUFFQTR2QixFQUFBcHNHLEtBQUFxc0csZUFBQUYsR0FDQSxJQUFBTixFQUFBLEtBZ0JBLFFBZEE5ckcsSUFBQTArRSxJQUlBQSxFQUZBLE9BQUFrd0IsRUFFQUEsRUFBQWx3QixVQUlBdGlGLFNBTUE0RCxJQUFBcXNHLEVBQUEsQ0FFQSxNQUFBd0MsRUFBQXhDLEVBQUFnQixhQUFBdEIsR0FFQSxRQUFBL3JHLElBQUE2dUcsR0FBQUEsRUFBQW53QixZQUFBQSxFQUVBLE9BQUFtd0IsRUFNQS9DLEVBQUFPLEVBQUFFLGFBQUEsR0FHQSxPQUFBcUMsSUFDQUEsRUFBQTlDLEVBQUFyRixNQUVBLENBR0EsR0FBQSxPQUFBbUksRUFBQSxPQUFBLEtBR0EsTUFBQUUsRUFBQSxJQUFBekksR0FBQXBtRyxLQUFBMnVHLEVBQUFELEVBQUFqd0IsR0FPQSxPQUxBeitFLEtBQUE0ckcsWUFBQWlELEVBQUFoRCxHQUdBN3JHLEtBQUF1c0csbUJBQUFzQyxFQUFBMUMsRUFBQUwsR0FFQStDLENBRUEsQ0FTQSxjQUFBRCxDQUFBcHlCLEVBQUFreUIsR0FFQSxNQUFBaE8sRUFBQWdPLEdBQUExdUcsS0FBQW1xRyxNQUNBMkIsRUFBQXBMLEVBQUE5cUYsS0FFQSs0RixFQUFBLGlCQUFBbnlCLEVBQ0FvSCxHQUFBVSxXQUFBb2MsRUFBQWxrQixHQUFBQSxFQUVBMnZCLEVBQUF3QyxFQUFBQSxFQUFBLzRGLEtBQUE0bUUsRUFFQTR2QixFQUFBcHNHLEtBQUFxc0csZUFBQUYsR0FFQSxZQUFBcHNHLElBQUFxc0csR0FFQUEsRUFBQWdCLGFBQUF0QixJQUlBLElBRUEsQ0FPQSxhQUFBZ0QsR0FFQSxNQUFBN0IsRUFBQWp0RyxLQUFBNHNHLFNBR0EsSUFBQSxJQUFBN3JHLEVBRkFmLEtBQUE2c0csZ0JBRUEsRUFBQTlyRyxHQUFBLElBQUFBLEVBRUFrc0csRUFBQWxzRyxHQUFBd3JFLE9BSUEsT0FBQXZzRSxJQUVBLENBV0EsTUFBQXNmLENBQUErcUYsR0FFQUEsR0FBQXJxRyxLQUFBbWlGLFVBRUEsTUFBQThxQixFQUFBanRHLEtBQUE0c0csU0FDQW1DLEVBQUEvdUcsS0FBQTZzRyxnQkFFQTV3QixFQUFBajhFLEtBQUFpOEUsTUFBQW91QixFQUNBQyxFQUFBaHBHLEtBQUFnc0IsS0FBQSs4RSxHQUVBekwsRUFBQTUrRixLQUFBMnJHLFlBQUEsRUFJQSxJQUFBLElBQUE1cUcsRUFBQSxFQUFBQSxJQUFBZ3VHLElBQUFodUcsRUFBQSxDQUVBa3NHLEVBQUFsc0csR0FFQXFwRyxRQUFBbnVCLEVBQUFvdUIsRUFBQUMsRUFBQTFMLEVBRUEsQ0FJQSxNQUFBeUYsRUFBQXJrRyxLQUFBaWtHLFVBQ0FrQixFQUFBbmxHLEtBQUE4c0csaUJBRUEsSUFBQSxJQUFBL3JHLEVBQUEsRUFBQUEsSUFBQW9rRyxJQUFBcGtHLEVBRUFzakcsRUFBQXRqRyxHQUFBaStGLE1BQUFKLEdBSUEsT0FBQTUrRixJQUVBLENBV0EsT0FBQWd2RyxDQUFBL3lCLEdBRUFqOEUsS0FBQWk4RSxLQUFBLEVBQ0EsSUFBQSxJQUFBbDdFLEVBQUEsRUFBQUEsRUFBQWYsS0FBQTRzRyxTQUFBM3JHLE9BQUFGLElBRUFmLEtBQUE0c0csU0FBQTdyRyxHQUFBazdFLEtBQUEsRUFJQSxPQUFBajhFLEtBQUFzZixPQUFBMjhELEVBRUEsQ0FPQSxPQUFBaXVCLEdBRUEsT0FBQWxxRyxLQUFBbXFHLEtBRUEsQ0FRQSxXQUFBOEUsQ0FBQXp5QixHQUVBLE1BQUF5d0IsRUFBQWp0RyxLQUFBNHNHLFNBQ0FULEVBQUEzdkIsRUFBQTVtRSxLQUNBdTNGLEVBQUFudEcsS0FBQXFzRyxlQUNBRCxFQUFBZSxFQUFBaEIsR0FFQSxRQUFBcHNHLElBQUFxc0csRUFBQSxDQU1BLE1BQUE4QyxFQUFBOUMsRUFBQUUsYUFFQSxJQUFBLElBQUF2ckcsRUFBQSxFQUFBc0IsRUFBQTZzRyxFQUFBanVHLE9BQUFGLElBQUFzQixJQUFBdEIsRUFBQSxDQUVBLE1BQUEyb0csRUFBQXdGLEVBQUFudUcsR0FFQWYsS0FBQThuRyxrQkFBQTRCLEdBRUEsTUFBQTZELEVBQUE3RCxFQUFBMUMsWUFDQXNHLEVBQUFMLEVBQUFBLEVBQUFoc0csT0FBQSxHQUVBeW9HLEVBQUExQyxZQUFBLEtBQ0EwQyxFQUFBekMsa0JBQUEsS0FFQXFHLEVBQUF0RyxZQUFBdUcsRUFDQU4sRUFBQU0sR0FBQUQsRUFDQUwsRUFBQTUwQyxNQUVBcjRELEtBQUEydEcsaUNBQUFqRSxFQUVBLFFBRUF5RCxFQUFBaEIsRUFFQSxDQUVBLENBVUEsV0FBQWdELENBQUF6TyxHQUVBLE1BQUFvTCxFQUFBcEwsRUFBQTlxRixLQUNBdTNGLEVBQUFudEcsS0FBQXFzRyxlQUVBLElBQUEsTUFBQUYsS0FBQWdCLEVBQUEsQ0FFQSxNQUNBekQsRUFEQXlELEVBQUFoQixHQUFBaUIsYUFDQXRCLFFBRUEvckcsSUFBQTJwRyxJQUVBMXBHLEtBQUE4bkcsa0JBQUE0QixHQUNBMXBHLEtBQUFxdEcsc0JBQUEzRCxHQUlBLENBRUEsTUFDQXdFLEVBREFsdUcsS0FBQWdzRyx1QkFDQUYsR0FFQSxRQUFBL3JHLElBQUFtdUcsRUFFQSxJQUFBLE1BQUE5b0IsS0FBQThvQixFQUFBLENBRUEsTUFBQTdRLEVBQUE2USxFQUFBOW9CLEdBQ0FpWSxFQUFBaUMsdUJBQ0F0L0YsS0FBQTR0Ryx1QkFBQXZRLEVBRUEsQ0FJQSxDQVVBLGFBQUErUixDQUFBNXlCLEVBQUFreUIsR0FFQSxNQUFBaEYsRUFBQTFwRyxLQUFBNHVHLGVBQUFweUIsRUFBQWt5QixHQUVBLE9BQUFoRixJQUVBMXBHLEtBQUE4bkcsa0JBQUE0QixHQUNBMXBHLEtBQUFxdEcsc0JBQUEzRCxHQUlBLEVDejBCQSxNQUFBMkYsV0FBQW4wRixHQVVBLFdBQUF0WSxDQUFBcUUsRUFBQSxFQUFBQyxFQUFBLEVBQUFtVSxFQUFBLEVBQUFGLEVBQUEsQ0FBQSxHQUVBNUQsTUFBQXRRLEVBQUFDLEVBQUFpVSxHQVNBbmIsS0FBQXN2RyxrQkFBQSxFQUVBdHZHLEtBQUFxYixNQUFBQSxFQU9BcmIsS0FBQWdjLFFBQUEsSUFBQWtCLEdBQUEsS0FBQWpXLEVBQUFDLEVBQUFtVSxHQUVBcmIsS0FBQWdjLFFBQUExRCx1QkFBQSxDQUVBLEVDbENBLE1BQUFpM0YsV0FBQXIwRixHQVVBLFdBQUF0WSxDQUFBcUUsRUFBQSxFQUFBQyxFQUFBLEVBQUFtVSxFQUFBLEVBQUFGLEVBQUEsQ0FBQSxHQUVBNUQsTUFBQXRRLEVBQUFDLEVBQUFpVSxHQUVBbmIsS0FBQXd2RyxxQkFBQSxFQUVBeHZHLEtBQUFxYixNQUFBQSxFQU9BcmIsS0FBQWdjLFFBQUEsSUFBQU8sR0FBQSxLQUFBdFYsRUFBQUMsRUFBQW1VLEdBRUFyYixLQUFBZ2MsUUFBQTFELHVCQUFBLENBRUEsRUN0QkEsTUFBQW0zRixHQU9BLFdBQUE3c0csQ0FBQVgsR0FPQWpDLEtBQUFpQyxNQUFBQSxDQUVBLENBUUEsS0FBQXdGLEdBRUEsT0FBQSxJQUFBZ29HLFFBQUExdkcsSUFBQUMsS0FBQWlDLE1BQUF3RixNQUFBekgsS0FBQWlDLE1BQUFqQyxLQUFBaUMsTUFBQXdGLFFBRUEsRUN0Q0EsSUFBQWlvRyxHQUFBLEVBV0EsTUFBQUMsV0FBQWh3RyxHQUtBLFdBQUFpRCxHQUVBMlUsUUFTQXZYLEtBQUE0dkcsaUJBQUEsRUFTQXI4RixPQUFBb0MsZUFBQTNWLEtBQUEsS0FBQSxDQUFBaUMsTUFBQXl0RyxPQU9BMXZHLEtBQUFvUSxLQUFBLEdBUUFwUSxLQUFBbTFDLE1BQUF4MkMsR0FPQXFCLEtBQUFvL0MsU0FBQSxFQUVBLENBUUEsR0FBQXgzQyxDQUFBbXBGLEdBSUEsT0FGQS93RixLQUFBby9DLFNBQUFoL0MsS0FBQTJ3RixHQUVBL3dGLElBRUEsQ0FRQSxNQUFBaTRCLENBQUE4NEQsR0FFQSxNQUFBdndGLEVBQUFSLEtBQUFvL0MsU0FBQWovQyxRQUFBNHdGLEdBSUEsT0FGQSxJQUFBdndGLEdBQUFSLEtBQUFvL0MsU0FBQTMrQyxPQUFBRCxFQUFBLEdBRUFSLElBRUEsQ0FRQSxPQUFBNnZHLENBQUF6L0YsR0FJQSxPQUZBcFEsS0FBQW9RLEtBQUFBLEVBRUFwUSxJQUVBLENBUUEsUUFBQXUxQyxDQUFBdHpDLEdBSUEsT0FGQWpDLEtBQUFtMUMsTUFBQWx6QyxFQUVBakMsSUFFQSxDQVFBLE9BQUFpWixHQUVBalosS0FBQVUsY0FBQSxDQUFBYixLQUFBLFdBRUEsQ0FRQSxJQUFBNkgsQ0FBQStQLEdBRUF6WCxLQUFBb1EsS0FBQXFILEVBQUFySCxLQUNBcFEsS0FBQW0xQyxNQUFBMTlCLEVBQUEwOUIsTUFFQSxNQUFBMjZELEVBQUFyNEYsRUFBQTJuQyxTQUVBcC9DLEtBQUFvL0MsU0FBQW4rQyxPQUFBLEVBRUEsSUFBQSxJQUFBRixFQUFBLEVBQUFDLEVBQUE4dUcsRUFBQTd1RyxPQUFBRixFQUFBQyxFQUFBRCxJQUFBLENBRUEsTUFBQXErQyxFQUFBOW9DLE1BQUFDLFFBQUF1NUYsRUFBQS91RyxJQUFBK3VHLEVBQUEvdUcsR0FBQSxDQUFBK3VHLEVBQUEvdUcsSUFFQSxJQUFBLElBQUFzb0IsRUFBQSxFQUFBQSxFQUFBKzFCLEVBQUFuK0MsT0FBQW9vQixJQUVBcnBCLEtBQUFvL0MsU0FBQWgvQyxLQUFBZy9DLEVBQUEvMUIsR0FBQTVoQixRQUlBLENBRUEsT0FBQXpILElBRUEsQ0FPQSxLQUFBeUgsR0FFQSxPQUFBLElBQUF6SCxLQUFBNEMsYUFBQThFLEtBQUExSCxLQUVBLEVDeEtBLE1BQUErdkcsV0FBQXJuRCxHQVNBLFdBQUE5bEQsQ0FBQS9CLEVBQUFxNkMsRUFBQTJTLEVBQUEsR0FFQXQyQyxNQUFBMVcsRUFBQXE2QyxHQVNBbDdDLEtBQUFnd0csOEJBQUEsRUFTQWh3RyxLQUFBNnRELGlCQUFBQSxDQUVBLENBRUEsSUFBQW5tRCxDQUFBK1AsR0FNQSxPQUpBRixNQUFBN1AsS0FBQStQLEdBRUF6WCxLQUFBNnRELGlCQUFBcDJDLEVBQUFvMkMsaUJBRUE3dEQsSUFFQSxDQUVBLEtBQUF5SCxDQUFBOE4sR0FFQSxNQUFBd3pDLEVBQUF4eEMsTUFBQTlQLE1BQUE4TixHQUlBLE9BRkF3ekMsRUFBQThFLGlCQUFBN3RELEtBQUE2dEQsaUJBRUE5RSxDQUVBLENBRUEsTUFBQS95QyxDQUFBVCxHQUVBLE1BQUFtNEMsRUFBQW4yQyxNQUFBdkIsT0FBQVQsR0FLQSxPQUhBbTRDLEVBQUFzaUQsOEJBQUEsRUFDQXRpRCxFQUFBRyxpQkFBQTd0RCxLQUFBNnRELGlCQUVBSCxDQUVBLEVDMURBLE1BQUF1aUQsR0FXQSxXQUFBcnRHLENBQUFzTixFQUFBclEsRUFBQWsxQyxFQUFBbTdELEVBQUFuMEYsR0FTQS9iLEtBQUEyNEMscUJBQUEsRUFPQTM0QyxLQUFBb1EsS0FBQSxHQU9BcFEsS0FBQWtRLE9BQUFBLEVBT0FsUSxLQUFBSCxLQUFBQSxFQU9BRyxLQUFBKzBDLFNBQUFBLEVBT0EvMEMsS0FBQWt3RyxZQUFBQSxFQU9BbHdHLEtBQUErYixNQUFBQSxFQU9BL2IsS0FBQThWLFFBQUEsQ0FFQSxDQVVBLGVBQUFDLENBQUE5VCxJQUVBLElBQUFBLEdBQUFqQyxLQUFBOFYsU0FFQSxDQVFBLFNBQUErakYsQ0FBQTNwRixHQUlBLE9BRkFsUSxLQUFBa1EsT0FBQUEsRUFFQWxRLElBRUEsQ0FTQSxPQUFBbXdHLENBQUF0d0csRUFBQXF3RyxHQUtBLE9BSEFsd0csS0FBQUgsS0FBQUEsRUFDQUcsS0FBQWt3RyxZQUFBQSxFQUVBbHdHLElBRUEsQ0FRQSxXQUFBb3dHLENBQUFyN0QsR0FJQSxPQUZBLzBDLEtBQUErMEMsU0FBQUEsRUFFQS8wQyxJQUVBLENBUUEsUUFBQXF3RyxDQUFBdDBGLEdBSUEsT0FGQS9iLEtBQUErYixNQUFBQSxFQUVBL2IsSUFFQSxFQ3RKQSxNQUFBc3dHLEdBQUEsSUFBQTNpRixHQU9BLE1BQUE0aUYsR0FVQSxXQUFBM3RHLENBQUFpb0IsRUFBQUMsRUFBQTJILEVBQUEsRUFBQUMsRUFBQXZOLEtBT0FubEIsS0FBQStxQixJQUFBLElBQUFILEdBQUFDLEVBQUFDLEdBUUE5cUIsS0FBQXl5QixLQUFBQSxFQVFBenlCLEtBQUEweUIsSUFBQUEsRUFVQTF5QixLQUFBaWpCLE9BQUEsS0FhQWpqQixLQUFBaTBCLE9BQUEsSUFBQVIsR0FtQkF6ekIsS0FBQWs2RCxPQUFBLENBQ0EvZCxLQUFBLENBQUEsRUFDQTRkLEtBQUEsQ0FBQTFTLFVBQUEsR0FDQXFELElBQUEsQ0FBQSxFQUNBeVEsT0FBQSxDQUFBOVQsVUFBQSxHQUNBNkMsT0FBQSxDQUFBLEVBR0EsQ0FRQSxHQUFBdmpELENBQUFra0IsRUFBQUMsR0FJQTlxQixLQUFBK3FCLElBQUFwa0IsSUFBQWtrQixFQUFBQyxFQUVBLENBU0EsYUFBQTBsRixDQUFBQyxFQUFBeHRGLEdBRUFBLEVBQUFvK0IscUJBRUFyaEQsS0FBQStxQixJQUFBRixPQUFBOVAsc0JBQUFrSSxFQUFBSSxhQUNBcmpCLEtBQUErcUIsSUFBQUQsVUFBQW5rQixJQUFBOHBHLEVBQUFqdUcsRUFBQWl1RyxFQUFBaHVHLEVBQUEsSUFBQTBnQixVQUFBRixHQUFBamIsSUFBQWhJLEtBQUErcUIsSUFBQUYsUUFBQXhuQixZQUNBckQsS0FBQWlqQixPQUFBQSxHQUVBQSxFQUFBbXNFLHNCQUVBcHZGLEtBQUErcUIsSUFBQUYsT0FBQWxrQixJQUFBOHBHLEVBQUFqdUcsRUFBQWl1RyxFQUFBaHVHLEdBQUF3Z0IsRUFBQXdQLEtBQUF4UCxFQUFBeVAsTUFBQXpQLEVBQUF3UCxLQUFBeFAsRUFBQXlQLE1BQUF2UCxVQUFBRixHQUNBampCLEtBQUErcUIsSUFBQUQsVUFBQW5rQixJQUFBLEVBQUEsR0FBQSxHQUFBMmMsbUJBQUFMLEVBQUFJLGFBQ0FyakIsS0FBQWlqQixPQUFBQSxHQUlBcmMsUUFBQW14QixNQUFBLDZDQUFBOVUsRUFBQXBqQixLQUlBLENBUUEsbUJBQUE2d0csQ0FBQXptQixHQU9BLE9BTEFxbUIsR0FBQXhrRyxXQUFBeWlCLGdCQUFBMDdELEVBQUE1bUUsYUFFQXJqQixLQUFBK3FCLElBQUFGLE9BQUE5UCxzQkFBQWt2RSxFQUFBNW1FLGFBQ0FyakIsS0FBQStxQixJQUFBRCxVQUFBbmtCLElBQUEsRUFBQSxHQUFBLEdBQUFnVCxhQUFBMjJGLElBRUF0d0csSUFFQSxDQXNDQSxlQUFBMndHLENBQUEzcUYsRUFBQXNYLEdBQUEsRUFBQXVmLEVBQUEsSUFNQSxPQUpBN3pCLEdBQUFoRCxFQUFBaG1CLEtBQUE2OEMsRUFBQXZmLEdBRUF1ZixFQUFBNFosS0FBQW02QyxJQUVBL3pELENBRUEsQ0FZQSxnQkFBQWcwRCxDQUFBaE0sRUFBQXZuRSxHQUFBLEVBQUF1ZixFQUFBLElBRUEsSUFBQSxJQUFBOTdDLEVBQUEsRUFBQUMsRUFBQTZqRyxFQUFBNWpHLE9BQUFGLEVBQUFDLEVBQUFELElBRUFpb0IsR0FBQTY3RSxFQUFBOWpHLEdBQUFmLEtBQUE2OEMsRUFBQXZmLEdBTUEsT0FGQXVmLEVBQUE0WixLQUFBbTZDLElBRUEvekQsQ0FFQSxFQUlBLFNBQUErekQsR0FBQS9xRyxFQUFBQyxHQUVBLE9BQUFELEVBQUF5eEIsU0FBQXh4QixFQUFBd3hCLFFBRUEsQ0FFQSxTQUFBdE8sR0FBQWhELEVBQUE0MkIsRUFBQUMsRUFBQXZmLEdBRUEsSUFBQXd6RSxHQUFBLEVBRUEsR0FBQTlxRixFQUFBaU8sT0FBQXhmLEtBQUFtb0MsRUFBQTNvQixRQUFBLEVBSUEsSUFGQWpPLEVBQUE2UyxRQUFBK2pCLEVBQUFDLEtBRUFpMEQsR0FBQSxFQUVBLENBRUEsSUFBQSxJQUFBQSxJQUFBLElBQUF4ekUsRUFBQSxDQUVBLE1BQUFoVyxFQUFBdEIsRUFBQXNCLFNBRUEsSUFBQSxJQUFBdm1CLEVBQUEsRUFBQUMsRUFBQXNtQixFQUFBcm1CLE9BQUFGLEVBQUFDLEVBQUFELElBRUFpb0IsR0FBQTFCLEVBQUF2bUIsR0FBQTY3QyxFQUFBQyxHQUFBLEVBSUEsQ0FFQSxDQzVQQSxNQUFBazBELEdBU0EsV0FBQW51RyxDQUFBMmhCLEVBQUEsRUFBQUMsRUFBQSxFQUFBOWEsRUFBQSxHQVFBMUosS0FBQXVrQixPQUFBQSxFQVFBdmtCLEtBQUF3a0IsSUFBQUEsRUFRQXhrQixLQUFBMEosTUFBQUEsQ0FFQSxDQVVBLEdBQUEvQyxDQUFBNGQsRUFBQUMsRUFBQTlhLEdBTUEsT0FKQTFKLEtBQUF1a0IsT0FBQUEsRUFDQXZrQixLQUFBd2tCLElBQUFBLEVBQ0F4a0IsS0FBQTBKLE1BQUFBLEVBRUExSixJQUVBLENBUUEsSUFBQTBILENBQUFzcEcsR0FNQSxPQUpBaHhHLEtBQUF1a0IsT0FBQXlzRixFQUFBenNGLE9BQ0F2a0IsS0FBQXdrQixJQUFBd3NGLEVBQUF4c0YsSUFDQXhrQixLQUFBMEosTUFBQXNuRyxFQUFBdG5HLE1BRUExSixJQUVBLENBUUEsUUFBQWl4RyxHQUVBLE1BQUFDLEVBQUEsS0FHQSxPQUZBbHhHLEtBQUF3a0IsSUFBQXhpQixHQUFBaEMsS0FBQXdrQixJQUFBMHNGLEVBQUE1dkcsS0FBQUMsR0FBQTJ2RyxHQUVBbHhHLElBRUEsQ0FTQSxjQUFBc3pCLENBQUEzckIsR0FFQSxPQUFBM0gsS0FBQW14Ryx1QkFBQXhwRyxFQUFBbkYsRUFBQW1GLEVBQUFsRixFQUFBa0YsRUFBQTJSLEVBRUEsQ0FVQSxzQkFBQTYzRixDQUFBM3VHLEVBQUFDLEVBQUE2VyxHQWdCQSxPQWRBdFosS0FBQXVrQixPQUFBampCLEtBQUE4SCxLQUFBNUcsRUFBQUEsRUFBQUMsRUFBQUEsRUFBQTZXLEVBQUFBLEdBRUEsSUFBQXRaLEtBQUF1a0IsUUFFQXZrQixLQUFBMEosTUFBQSxFQUNBMUosS0FBQXdrQixJQUFBLElBSUF4a0IsS0FBQTBKLE1BQUFwSSxLQUFBaUksTUFBQS9HLEVBQUE4VyxHQUNBdFosS0FBQXdrQixJQUFBbGpCLEtBQUFxSSxLQUFBM0gsR0FBQVMsRUFBQXpDLEtBQUF1a0IsUUFBQSxFQUFBLEtBSUF2a0IsSUFFQSxDQU9BLEtBQUF5SCxHQUVBLE9BQUEsSUFBQXpILEtBQUE0QyxhQUFBOEUsS0FBQTFILEtBRUEsRUMxSUEsTUFBQW94RyxHQVNBLFdBQUF4dUcsQ0FBQTJoQixFQUFBLEVBQUE3YSxFQUFBLEVBQUFqSCxFQUFBLEdBUUF6QyxLQUFBdWtCLE9BQUFBLEVBUUF2a0IsS0FBQTBKLE1BQUFBLEVBUUExSixLQUFBeUMsRUFBQUEsQ0FFQSxDQVVBLEdBQUFrRSxDQUFBNGQsRUFBQTdhLEVBQUFqSCxHQU1BLE9BSkF6QyxLQUFBdWtCLE9BQUFBLEVBQ0F2a0IsS0FBQTBKLE1BQUFBLEVBQ0ExSixLQUFBeUMsRUFBQUEsRUFFQXpDLElBRUEsQ0FRQSxJQUFBMEgsQ0FBQXNwRyxHQU1BLE9BSkFoeEcsS0FBQXVrQixPQUFBeXNGLEVBQUF6c0YsT0FDQXZrQixLQUFBMEosTUFBQXNuRyxFQUFBdG5HLE1BQ0ExSixLQUFBeUMsRUFBQXV1RyxFQUFBdnVHLEVBRUF6QyxJQUVBLENBU0EsY0FBQXN6QixDQUFBM3JCLEdBRUEsT0FBQTNILEtBQUFteEcsdUJBQUF4cEcsRUFBQW5GLEVBQUFtRixFQUFBbEYsRUFBQWtGLEVBQUEyUixFQUVBLENBVUEsc0JBQUE2M0YsQ0FBQTN1RyxFQUFBQyxFQUFBNlcsR0FNQSxPQUpBdFosS0FBQXVrQixPQUFBampCLEtBQUE4SCxLQUFBNUcsRUFBQUEsRUFBQThXLEVBQUFBLEdBQ0F0WixLQUFBMEosTUFBQXBJLEtBQUFpSSxNQUFBL0csRUFBQThXLEdBQ0F0WixLQUFBeUMsRUFBQUEsRUFFQXpDLElBRUEsQ0FPQSxLQUFBeUgsR0FFQSxPQUFBLElBQUF6SCxLQUFBNEMsYUFBQThFLEtBQUExSCxLQUVBLEVDekZPLE1BQUFxeEcsR0FZUCxXQUFBenVHLENBQUF1SSxFQUFBQyxFQUFBRSxFQUFBQyxHQVNBOGxHLEdBQUF0cUcsVUFBQXVxRyxXQUFBLEVBT0F0eEcsS0FBQXlJLFNBQUEsQ0FDQSxFQUFBLEVBQ0EsRUFBQSxRQUdBMUksSUFBQW9MLEdBRUFuTCxLQUFBMkcsSUFBQXdFLEVBQUFDLEVBQUFFLEVBQUFDLEVBSUEsQ0FPQSxRQUFBTyxHQU9BLE9BTEE5TCxLQUFBMkcsSUFDQSxFQUFBLEVBQ0EsRUFBQSxHQUdBM0csSUFFQSxDQVNBLFNBQUF1SyxDQUFBMUosRUFBQTJKLEVBQUEsR0FFQSxJQUFBLElBQUF6SixFQUFBLEVBQUFBLEVBQUEsRUFBQUEsSUFFQWYsS0FBQXlJLFNBQUExSCxHQUFBRixFQUFBRSxFQUFBeUosR0FJQSxPQUFBeEssSUFFQSxDQVlBLEdBQUEyRyxDQUFBd0UsRUFBQUMsRUFBQUUsRUFBQUMsR0FFQSxNQUFBTSxFQUFBN0wsS0FBQXlJLFNBS0EsT0FIQW9ELEVBQUEsR0FBQVYsRUFBQVUsRUFBQSxHQUFBVCxFQUNBUyxFQUFBLEdBQUFQLEVBQUFPLEVBQUEsR0FBQU4sRUFFQXZMLElBRUEsRUN2SEEsTUFBQXV4RyxHQUFBLElBQUF6cUcsR0FLQSxNQUFBMHFHLEdBUUEsV0FBQTV1RyxDQUFBVixFQUFBLElBQUE0RSxHQUFBcWUsSUFBQUEsS0FBQWhqQixFQUFBLElBQUEyRSxJQUFBcWUsS0FBQUEsTUFTQW5sQixLQUFBeXhHLFFBQUEsRUFPQXp4RyxLQUFBa0MsSUFBQUEsRUFPQWxDLEtBQUFtQyxJQUFBQSxDQUVBLENBVUEsR0FBQXdFLENBQUF6RSxFQUFBQyxHQUtBLE9BSEFuQyxLQUFBa0MsSUFBQXdGLEtBQUF4RixHQUNBbEMsS0FBQW1DLElBQUF1RixLQUFBdkYsR0FFQW5DLElBRUEsQ0FTQSxhQUFBMGxCLENBQUFDLEdBRUEzbEIsS0FBQXNsQixZQUVBLElBQUEsSUFBQXZrQixFQUFBLEVBQUFxYixFQUFBdUosRUFBQTFrQixPQUFBRixFQUFBcWIsRUFBQXJiLElBRUFmLEtBQUF1bEIsY0FBQUksRUFBQTVrQixJQUlBLE9BQUFmLElBRUEsQ0FVQSxvQkFBQTRsQixDQUFBN2EsRUFBQThhLEdBRUEsTUFBQUMsRUFBQXlyRixHQUFBN3BHLEtBQUFtZSxHQUFBemQsZUFBQSxJQUlBLE9BSEFwSSxLQUFBa0MsSUFBQXdGLEtBQUFxRCxHQUFBL0MsSUFBQThkLEdBQ0E5bEIsS0FBQW1DLElBQUF1RixLQUFBcUQsR0FBQW5ELElBQUFrZSxHQUVBOWxCLElBRUEsQ0FPQSxLQUFBeUgsR0FFQSxPQUFBLElBQUF6SCxLQUFBNEMsYUFBQThFLEtBQUExSCxLQUVBLENBUUEsSUFBQTBILENBQUF5ZSxHQUtBLE9BSEFubUIsS0FBQWtDLElBQUF3RixLQUFBeWUsRUFBQWprQixLQUNBbEMsS0FBQW1DLElBQUF1RixLQUFBeWUsRUFBQWhrQixLQUVBbkMsSUFFQSxDQU9BLFNBQUFzbEIsR0FLQSxPQUhBdGxCLEtBQUFrQyxJQUFBTSxFQUFBeEMsS0FBQWtDLElBQUFPLEVBQUEwaUIsSUFDQW5sQixLQUFBbUMsSUFBQUssRUFBQXhDLEtBQUFtQyxJQUFBTSxHQUFBMGlCLElBRUFubEIsSUFFQSxDQVNBLE9BQUFvbUIsR0FJQSxPQUFBcG1CLEtBQUFtQyxJQUFBSyxFQUFBeEMsS0FBQWtDLElBQUFNLEdBQUF4QyxLQUFBbUMsSUFBQU0sRUFBQXpDLEtBQUFrQyxJQUFBTyxDQUVBLENBUUEsU0FBQTRqQixDQUFBemxCLEdBRUEsT0FBQVosS0FBQW9tQixVQUFBeGxCLEVBQUErRixJQUFBLEVBQUEsR0FBQS9GLEVBQUFrSCxXQUFBOUgsS0FBQWtDLElBQUFsQyxLQUFBbUMsS0FBQWlHLGVBQUEsR0FFQSxDQVFBLE9BQUFrZSxDQUFBMWxCLEdBRUEsT0FBQVosS0FBQW9tQixVQUFBeGxCLEVBQUErRixJQUFBLEVBQUEsR0FBQS9GLEVBQUFzSCxXQUFBbEksS0FBQW1DLElBQUFuQyxLQUFBa0MsSUFFQSxDQVFBLGFBQUFxakIsQ0FBQWdCLEdBS0EsT0FIQXZtQixLQUFBa0MsSUFBQUEsSUFBQXFrQixHQUNBdm1CLEtBQUFtQyxJQUFBQSxJQUFBb2tCLEdBRUF2bUIsSUFFQSxDQVdBLGNBQUF3bUIsQ0FBQUMsR0FLQSxPQUhBem1CLEtBQUFrQyxJQUFBOEYsSUFBQXllLEdBQ0F6bUIsS0FBQW1DLElBQUF5RixJQUFBNmUsR0FFQXptQixJQUVBLENBU0EsY0FBQTBtQixDQUFBdGYsR0FLQSxPQUhBcEgsS0FBQWtDLElBQUEyRixXQUFBVCxHQUNBcEgsS0FBQW1DLElBQUEwRixVQUFBVCxHQUVBcEgsSUFFQSxDQVFBLGFBQUF1bkIsQ0FBQWhCLEdBRUEsT0FBQUEsRUFBQS9qQixHQUFBeEMsS0FBQWtDLElBQUFNLEdBQUErakIsRUFBQS9qQixHQUFBeEMsS0FBQW1DLElBQUFLLEdBQ0ErakIsRUFBQTlqQixHQUFBekMsS0FBQWtDLElBQUFPLEdBQUE4akIsRUFBQTlqQixHQUFBekMsS0FBQW1DLElBQUFNLENBRUEsQ0FTQSxXQUFBK2tCLENBQUFyQixHQUVBLE9BQUFubUIsS0FBQWtDLElBQUFNLEdBQUEyakIsRUFBQWprQixJQUFBTSxHQUFBMmpCLEVBQUFoa0IsSUFBQUssR0FBQXhDLEtBQUFtQyxJQUFBSyxHQUNBeEMsS0FBQWtDLElBQUFPLEdBQUEwakIsRUFBQWprQixJQUFBTyxHQUFBMGpCLEVBQUFoa0IsSUFBQU0sR0FBQXpDLEtBQUFtQyxJQUFBTSxDQUVBLENBU0EsWUFBQWdsQixDQUFBbEIsRUFBQTNsQixHQUtBLE9BQUFBLEVBQUErRixLQUNBNGYsRUFBQS9qQixFQUFBeEMsS0FBQWtDLElBQUFNLElBQUF4QyxLQUFBbUMsSUFBQUssRUFBQXhDLEtBQUFrQyxJQUFBTSxJQUNBK2pCLEVBQUE5akIsRUFBQXpDLEtBQUFrQyxJQUFBTyxJQUFBekMsS0FBQW1DLElBQUFNLEVBQUF6QyxLQUFBa0MsSUFBQU8sR0FHQSxDQVFBLGFBQUFpbEIsQ0FBQXZCLEdBSUEsT0FBQUEsRUFBQWhrQixJQUFBSyxHQUFBeEMsS0FBQWtDLElBQUFNLEdBQUEyakIsRUFBQWprQixJQUFBTSxHQUFBeEMsS0FBQW1DLElBQUFLLEdBQ0EyakIsRUFBQWhrQixJQUFBTSxHQUFBekMsS0FBQWtDLElBQUFPLEdBQUEwakIsRUFBQWprQixJQUFBTyxHQUFBekMsS0FBQW1DLElBQUFNLENBRUEsQ0FTQSxVQUFBb2xCLENBQUF0QixFQUFBM2xCLEdBRUEsT0FBQUEsRUFBQThHLEtBQUE2ZSxHQUFBdmtCLE1BQUFoQyxLQUFBa0MsSUFBQWxDLEtBQUFtQyxJQUVBLENBU0EsZUFBQTJtQixDQUFBdkMsR0FFQSxPQUFBdm1CLEtBQUE2bkIsV0FBQXRCLEVBQUFnckYsSUFBQTNuRyxXQUFBMmMsRUFFQSxDQVdBLFNBQUF5QyxDQUFBN0MsR0FPQSxPQUxBbm1CLEtBQUFrQyxJQUFBQyxJQUFBZ2tCLEVBQUFqa0IsS0FDQWxDLEtBQUFtQyxJQUFBRCxJQUFBaWtCLEVBQUFoa0IsS0FFQW5DLEtBQUFvbUIsV0FBQXBtQixLQUFBc2xCLFlBRUF0bEIsSUFFQSxDQVVBLEtBQUFxbkIsQ0FBQWxCLEdBS0EsT0FIQW5tQixLQUFBa0MsSUFBQUEsSUFBQWlrQixFQUFBamtCLEtBQ0FsQyxLQUFBbUMsSUFBQUEsSUFBQWdrQixFQUFBaGtCLEtBRUFuQyxJQUVBLENBU0EsU0FBQTBQLENBQUFsRixHQUtBLE9BSEF4SyxLQUFBa0MsSUFBQTBGLElBQUE0QyxHQUNBeEssS0FBQW1DLElBQUF5RixJQUFBNEMsR0FFQXhLLElBRUEsQ0FRQSxNQUFBc0ssQ0FBQTZiLEdBRUEsT0FBQUEsRUFBQWprQixJQUFBb0ksT0FBQXRLLEtBQUFrQyxNQUFBaWtCLEVBQUFoa0IsSUFBQW1JLE9BQUF0SyxLQUFBbUMsSUFFQSxFQ3JYQSxNQUFBdXZHLEdBQUEsSUFBQTF2RixHQUNBMnZGLEdBQUEsSUFBQTN2RixHQUtBLE1BQUE0dkYsR0FRQSxXQUFBaHZHLENBQUE2eUMsRUFBQSxJQUFBenpCLEdBQUFvdUMsRUFBQSxJQUFBcHVDLElBT0FoaUIsS0FBQXkxQyxNQUFBQSxFQU9BejFDLEtBQUFvd0QsSUFBQUEsQ0FFQSxDQVNBLEdBQUF6cEQsQ0FBQTh1QyxFQUFBMmEsR0FLQSxPQUhBcHdELEtBQUF5MUMsTUFBQS90QyxLQUFBK3RDLEdBQ0F6MUMsS0FBQW93RCxJQUFBMW9ELEtBQUEwb0QsR0FFQXB3RCxJQUVBLENBUUEsSUFBQTBILENBQUFzb0QsR0FLQSxPQUhBaHdELEtBQUF5MUMsTUFBQS90QyxLQUFBc29ELEVBQUF2YSxPQUNBejFDLEtBQUFvd0QsSUFBQTFvRCxLQUFBc29ELEVBQUFJLEtBRUFwd0QsSUFFQSxDQVFBLFNBQUFxbUIsQ0FBQXpsQixHQUVBLE9BQUFBLEVBQUFrSCxXQUFBOUgsS0FBQXkxQyxNQUFBejFDLEtBQUFvd0QsS0FBQWhvRCxlQUFBLEdBRUEsQ0FRQSxLQUFBZ2lCLENBQUF4cEIsR0FFQSxPQUFBQSxFQUFBc0gsV0FBQWxJLEtBQUFvd0QsSUFBQXB3RCxLQUFBeTFDLE1BRUEsQ0FPQSxVQUFBbzhELEdBRUEsT0FBQTd4RyxLQUFBeTFDLE1BQUE1ckMsa0JBQUE3SixLQUFBb3dELElBRUEsQ0FPQSxRQUFBOTRCLEdBRUEsT0FBQXQzQixLQUFBeTFDLE1BQUE3ckMsV0FBQTVKLEtBQUFvd0QsSUFFQSxDQVNBLEVBQUFwbEMsQ0FBQXRvQixFQUFBOUIsR0FFQSxPQUFBWixLQUFBb3FCLE1BQUF4cEIsR0FBQXdILGVBQUExRixHQUFBa0YsSUFBQTVILEtBQUF5MUMsTUFFQSxDQVNBLDRCQUFBcThELENBQUF2ckYsRUFBQXdyRixHQUVBTCxHQUFBeHBHLFdBQUFxZSxFQUFBdm1CLEtBQUF5MUMsT0FDQWs4RCxHQUFBenBHLFdBQUFsSSxLQUFBb3dELElBQUFwd0QsS0FBQXkxQyxPQUVBLE1BQUF1OEQsRUFBQUwsR0FBQTFvRyxJQUFBMG9HLElBR0EsSUFBQWp2RyxFQUZBaXZHLEdBQUExb0csSUFBQXlvRyxJQUVBTSxFQVFBLE9BTkFELElBRUFydkcsRUFBQVYsR0FBQVUsRUFBQSxFQUFBLElBSUFBLENBRUEsQ0FVQSxtQkFBQXlvQixDQUFBNUUsRUFBQXdyRixFQUFBbnhHLEdBRUEsTUFBQThCLEVBQUExQyxLQUFBOHhHLDZCQUFBdnJGLEVBQUF3ckYsR0FFQSxPQUFBL3hHLEtBQUFvcUIsTUFBQXhwQixHQUFBd0gsZUFBQTFGLEdBQUFrRixJQUFBNUgsS0FBQXkxQyxNQUVBLENBUUEsWUFBQTk3QixDQUFBL0osR0FLQSxPQUhBNVAsS0FBQXkxQyxNQUFBOTdCLGFBQUEvSixHQUNBNVAsS0FBQW93RCxJQUFBejJDLGFBQUEvSixHQUVBNVAsSUFFQSxDQVFBLE1BQUFzSyxDQUFBMGxELEdBRUEsT0FBQUEsRUFBQXZhLE1BQUFuckMsT0FBQXRLLEtBQUF5MUMsUUFBQXVhLEVBQUFJLElBQUE5bEQsT0FBQXRLLEtBQUFvd0QsSUFFQSxDQU9BLEtBQUEzb0QsR0FFQSxPQUFBLElBQUF6SCxLQUFBNEMsYUFBQThFLEtBQUExSCxLQUVBLEVDck1BLE1BQUFpeUcsR0FBQSxJQUFBandGLEdBZ0JBLE1BQUFrd0YsV0FBQS84RSxHQVNBLFdBQUF2eUIsQ0FBQW9yRixFQUFBMzdFLEdBRUFrRixRQU9BdlgsS0FBQWd1RixNQUFBQSxFQUVBaHVGLEtBQUE4WCxrQkFBQSxFQVFBOVgsS0FBQXFTLE1BQUFBLEVBRUFyUyxLQUFBSCxLQUFBLGtCQUVBLE1BQUErbUIsRUFBQSxJQUFBeXdCLEdBRUE4NkQsRUFBQSxDQUNBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUNBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUNBLEVBQUEsRUFBQSxHQUFBLEVBQUEsRUFBQSxFQUNBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUNBLEVBQUEsRUFBQSxFQUFBLEdBQUEsRUFBQSxHQUdBLElBQUEsSUFBQXB4RyxFQUFBLEVBQUFzb0IsRUFBQSxFQUFBcm9CLEVBQUEsR0FBQUQsRUFBQUMsRUFBQUQsSUFBQXNvQixJQUFBLENBRUEsTUFBQUUsRUFBQXhvQixFQUFBQyxFQUFBTSxLQUFBQyxHQUFBLEVBQ0Fpb0IsRUFBQUgsRUFBQXJvQixFQUFBTSxLQUFBQyxHQUFBLEVBRUE0d0csRUFBQS94RyxLQUNBa0IsS0FBQTJFLElBQUFzakIsR0FBQWpvQixLQUFBNEUsSUFBQXFqQixHQUFBLEVBQ0Fqb0IsS0FBQTJFLElBQUF1akIsR0FBQWxvQixLQUFBNEUsSUFBQXNqQixHQUFBLEVBR0EsQ0FFQTVDLEVBQUFxeEIsYUFBQSxXQUFBLElBQUFwQixHQUFBczdELEVBQUEsSUFFQSxNQUFBcDFFLEVBQUEsSUFBQXE4QixHQUFBLENBQUE3bEIsS0FBQSxFQUFBM0UsWUFBQSxJQUVBNXVDLEtBQUFveUcsS0FBQSxJQUFBejNDLEdBQUEvekMsRUFBQW1XLEdBQ0EvOEIsS0FBQTRILElBQUE1SCxLQUFBb3lHLE1BRUFweUcsS0FBQXNmLFFBRUEsQ0FNQSxPQUFBckcsR0FFQWpaLEtBQUFveUcsS0FBQXhyRixTQUFBM04sVUFDQWpaLEtBQUFveUcsS0FBQXIxRSxTQUFBOWpCLFNBRUEsQ0FNQSxNQUFBcUcsR0FFQXRmLEtBQUFndUYsTUFBQXJuRSxtQkFBQSxHQUFBLEdBQ0EzbUIsS0FBQWd1RixNQUFBcHRGLE9BQUErbEIsbUJBQUEsR0FBQSxHQUdBM21CLEtBQUFxMUIsUUFFQXIxQixLQUFBcTFCLE9BQUExTyxtQkFBQSxHQUVBM21CLEtBQUE0UCxPQUNBbEksS0FBQTFILEtBQUFxMUIsT0FBQWhTLGFBQ0FwVixTQUNBOUYsU0FBQW5JLEtBQUFndUYsTUFBQTNxRSxjQUlBcmpCLEtBQUE0UCxPQUFBbEksS0FBQTFILEtBQUFndUYsTUFBQTNxRSxhQUlBcmpCLEtBQUFxakIsWUFBQTNiLEtBQUExSCxLQUFBZ3VGLE1BQUEzcUUsYUFFQSxNQUFBZ3ZGLEVBQUFyeUcsS0FBQWd1RixNQUFBMTJELFNBQUF0M0IsS0FBQWd1RixNQUFBMTJELFNBQUEsSUFDQWc3RSxFQUFBRCxFQUFBL3dHLEtBQUEwbkMsSUFBQWhwQyxLQUFBZ3VGLE1BQUExa0YsT0FFQXRKLEtBQUFveUcsS0FBQS9pRyxNQUFBMUksSUFBQTJyRyxFQUFBQSxFQUFBRCxHQUVBSixHQUFBbDNGLHNCQUFBL2EsS0FBQWd1RixNQUFBcHRGLE9BQUF5aUIsYUFFQXJqQixLQUFBb3lHLEtBQUFubkYsT0FBQWduRixTQUVBbHlHLElBQUFDLEtBQUFxUyxNQUVBclMsS0FBQW95RyxLQUFBcjFFLFNBQUExcUIsTUFBQTFMLElBQUEzRyxLQUFBcVMsT0FJQXJTLEtBQUFveUcsS0FBQXIxRSxTQUFBMXFCLE1BQUEzSyxLQUFBMUgsS0FBQWd1RixNQUFBMzdFLE1BSUEsRUN6SUEsTUFBQWtnRyxHQUFBLElBQUF2d0YsR0FDQXd3RixHQUFBLElBQUE3a0YsR0FDQThrRixHQUFBLElBQUE5a0YsR0FZQSxNQUFBK2tGLFdBQUEvM0MsR0FRQSxXQUFBLzNELENBQUFvakIsR0FFQSxNQUFBMm1DLEVBQUFnbUQsR0FBQTNzRixHQUVBWSxFQUFBLElBQUF5d0IsR0FFQXVHLEVBQUEsR0FDQWcxRCxFQUFBLEdBRUEvbUUsRUFBQSxJQUFBL0IsR0FBQSxFQUFBLEVBQUEsR0FDQWdDLEVBQUEsSUFBQWhDLEdBQUEsRUFBQSxFQUFBLEdBRUEsSUFBQSxJQUFBL29DLEVBQUEsRUFBQUEsRUFBQTRyRCxFQUFBMXJELE9BQUFGLElBQUEsQ0FFQSxNQUFBd3NELEVBQUFaLEVBQUE1ckQsR0FFQXdzRCxFQUFBbDRCLFFBQUFrNEIsRUFBQWw0QixPQUFBeTNCLFNBRUFsUCxFQUFBeDlDLEtBQUEsRUFBQSxFQUFBLEdBQ0F3OUMsRUFBQXg5QyxLQUFBLEVBQUEsRUFBQSxHQUNBd3lHLEVBQUF4eUcsS0FBQXlyQyxFQUFBajlCLEVBQUFpOUIsRUFBQTk5QixFQUFBODlCLEVBQUEvbEMsR0FDQThzRyxFQUFBeHlHLEtBQUEwckMsRUFBQWw5QixFQUFBazlCLEVBQUEvOUIsRUFBQSs5QixFQUFBaG1DLEdBSUEsQ0FFQThnQixFQUFBcXhCLGFBQUEsV0FBQSxJQUFBcEIsR0FBQStHLEVBQUEsSUFDQWgzQixFQUFBcXhCLGFBQUEsUUFBQSxJQUFBcEIsR0FBQSs3RCxFQUFBLElBSUFyN0YsTUFBQXFQLEVBRkEsSUFBQXd5QyxHQUFBLENBQUE3c0IsY0FBQSxFQUFBYSxXQUFBLEVBQUFDLFlBQUEsRUFBQXVCLFlBQUEsRUFBQW5DLGFBQUEsS0FXQXpzQyxLQUFBNnlHLGtCQUFBLEVBRUE3eUcsS0FBQUgsS0FBQSxpQkFPQUcsS0FBQTBnRyxLQUFBMTZFLEVBT0FobUIsS0FBQTJzRCxNQUFBQSxFQUVBM3NELEtBQUE0UCxPQUFBb1csRUFBQTNDLFlBQ0FyakIsS0FBQThYLGtCQUFBLENBRUEsQ0FFQSxpQkFBQW1oQixDQUFBQyxHQUVBLE1BQUF5ekIsRUFBQTNzRCxLQUFBMnNELE1BRUEvbEMsRUFBQTVtQixLQUFBNG1CLFNBQ0E0SyxFQUFBNUssRUFBQUUsYUFBQSxZQUVBMnJGLEdBQUEvcUcsS0FBQTFILEtBQUEwZ0csS0FBQXI5RSxhQUFBcFYsU0FFQSxJQUFBLElBQUFsTixFQUFBLEVBQUFzb0IsRUFBQSxFQUFBdG9CLEVBQUE0ckQsRUFBQTFyRCxPQUFBRixJQUFBLENBRUEsTUFBQXdzRCxFQUFBWixFQUFBNXJELEdBRUF3c0QsRUFBQWw0QixRQUFBazRCLEVBQUFsNEIsT0FBQXkzQixTQUVBMGxELEdBQUFsbUcsaUJBQUFtbUcsR0FBQWxsRCxFQUFBbHFDLGFBQ0FrdkYsR0FBQXgzRixzQkFBQXkzRixJQUNBaGhGLEVBQUF3a0IsT0FBQTNzQixFQUFBa3BGLEdBQUEvdkcsRUFBQSt2RyxHQUFBOXZHLEVBQUE4dkcsR0FBQWo1RixHQUVBazVGLEdBQUFsbUcsaUJBQUFtbUcsR0FBQWxsRCxFQUFBbDRCLE9BQUFoUyxhQUNBa3ZGLEdBQUF4M0Ysc0JBQUF5M0YsSUFDQWhoRixFQUFBd2tCLE9BQUEzc0IsRUFBQSxFQUFBa3BGLEdBQUEvdkcsRUFBQSt2RyxHQUFBOXZHLEVBQUE4dkcsR0FBQWo1RixHQUVBK1AsR0FBQSxFQUlBLENBRUF6QyxFQUFBRSxhQUFBLFlBQUEvUSxhQUFBLEVBRUF3QixNQUFBMGhCLGtCQUFBQyxFQUVBLENBTUEsT0FBQWpnQixHQUVBalosS0FBQTRtQixTQUFBM04sVUFDQWpaLEtBQUErOEIsU0FBQTlqQixTQUVBLEVBS0EsU0FBQTA1RixHQUFBM3NGLEdBRUEsTUFBQThzRixFQUFBLElBRUEsSUFBQTlzRixFQUFBOG1DLFFBRUFnbUQsRUFBQTF5RyxLQUFBNGxCLEdBSUEsSUFBQSxJQUFBamxCLEVBQUEsRUFBQUEsRUFBQWlsQixFQUFBc0IsU0FBQXJtQixPQUFBRixJQUVBK3hHLEVBQUExeUcsUUFBQXV5RyxHQUFBM3NGLEVBQUFzQixTQUFBdm1CLEtBSUEsT0FBQSt4RyxDQUVBLENDN0lBLE1BQUFDLFdBQUE1MkQsR0FVQSxXQUFBdjVDLENBQUFvckYsRUFBQWdsQixFQUFBM2dHLEdBS0FrRixNQUhBLElBQUFxL0QsR0FBQW84QixFQUFBLEVBQUEsR0FDQSxJQUFBci9ELEdBQUEsQ0FBQVQsV0FBQSxFQUFBSyxLQUFBLEVBQUEzRSxZQUFBLEtBU0E1dUMsS0FBQWd1RixNQUFBQSxFQVFBaHVGLEtBQUFxUyxNQUFBQSxFQUVBclMsS0FBQUgsS0FBQSxtQkFFQUcsS0FBQTRQLE9BQUE1UCxLQUFBZ3VGLE1BQUEzcUUsWUFDQXJqQixLQUFBOFgsa0JBQUEsRUFFQTlYLEtBQUFzZixRQTBCQSxDQU1BLE9BQUFyRyxHQUVBalosS0FBQTRtQixTQUFBM04sVUFDQWpaLEtBQUErOEIsU0FBQTlqQixTQUVBLENBTUEsTUFBQXFHLEdBRUF0ZixLQUFBZ3VGLE1BQUFybkUsbUJBQUEsR0FBQSxRQUVBNW1CLElBQUFDLEtBQUFxUyxNQUVBclMsS0FBQSs4QixTQUFBMXFCLE1BQUExTCxJQUFBM0csS0FBQXFTLE9BSUFyUyxLQUFBKzhCLFNBQUExcUIsTUFBQTNLLEtBQUExSCxLQUFBZ3VGLE1BQUEzN0UsTUFtQkEsRUN6SEEsTUFBQTRnRyxHQUFBLElBQUFqeEYsR0FDQWt4RixHQUFBLElBQUFwcEUsR0FDQXFwRSxHQUFBLElBQUFycEUsR0FjQSxNQUFBc3BFLFdBQUFqK0UsR0FVQSxXQUFBdnlCLENBQUFvckYsRUFBQW5vRSxFQUFBeFQsR0FFQWtGLFFBT0F2WCxLQUFBZ3VGLE1BQUFBLEVBRUFodUYsS0FBQTRQLE9BQUFvK0UsRUFBQTNxRSxZQUNBcmpCLEtBQUE4WCxrQkFBQSxFQVFBOVgsS0FBQXFTLE1BQUFBLEVBRUFyUyxLQUFBSCxLQUFBLHdCQUVBLE1BQUErbUIsRUFBQSxJQUFBOHVELEdBQUE3dkQsR0FDQWUsRUFBQXVRLFFBQUEsR0FBQTcxQixLQUFBQyxJQUVBdkIsS0FBQSs4QixTQUFBLElBQUE0VyxHQUFBLENBQUFULFdBQUEsRUFBQUssS0FBQSxFQUFBM0UsWUFBQSxTQUNBN3VDLElBQUFDLEtBQUFxUyxRQUFBclMsS0FBQSs4QixTQUFBd1AsY0FBQSxHQUVBLE1BQUEvYSxFQUFBNUssRUFBQUUsYUFBQSxZQUNBOHJGLEVBQUEsSUFBQS92RyxhQUFBLEVBQUEydUIsRUFBQXpWLE9BRUE2SyxFQUFBcXhCLGFBQUEsUUFBQSxJQUFBbkQsR0FBQTg5RCxFQUFBLElBRUE1eUcsS0FBQTRILElBQUEsSUFBQXUwQyxHQUFBdjFCLEVBQUE1bUIsS0FBQSs4QixXQUVBLzhCLEtBQUFzZixRQUVBLENBTUEsT0FBQXJHLEdBRUFqWixLQUFBc25CLFNBQUEsR0FBQVYsU0FBQTNOLFVBQ0FqWixLQUFBc25CLFNBQUEsR0FBQXlWLFNBQUE5akIsU0FFQSxDQU1BLE1BQUFxRyxHQUVBLE1BQUFvbEMsRUFBQTFrRCxLQUFBc25CLFNBQUEsR0FFQSxRQUFBdm5CLElBQUFDLEtBQUFxUyxNQUVBclMsS0FBQSs4QixTQUFBMXFCLE1BQUExTCxJQUFBM0csS0FBQXFTLFdBRUEsQ0FFQSxNQUFBdWdHLEVBQUFsdUQsRUFBQTk5QixTQUFBRSxhQUFBLFNBRUFvc0YsR0FBQXhyRyxLQUFBMUgsS0FBQWd1RixNQUFBMzdFLE9BQ0E4Z0csR0FBQXpyRyxLQUFBMUgsS0FBQWd1RixNQUFBdEIsYUFFQSxJQUFBLElBQUEzckYsRUFBQSxFQUFBQyxFQUFBNHhHLEVBQUE3MkYsTUFBQWhiLEVBQUFDLEVBQUFELElBQUEsQ0FFQSxNQUFBc1IsRUFBQXRSLEVBQUFDLEVBQUEsRUFBQWt5RyxHQUFBQyxHQUVBUCxFQUFBNThELE9BQUFqMUMsRUFBQXNSLEVBQUF6RCxFQUFBeUQsRUFBQXRFLEVBQUFzRSxFQUFBdk0sRUFFQSxDQUVBOHNHLEVBQUE3OEYsYUFBQSxDQUVBLENBRUEvVixLQUFBZ3VGLE1BQUFybkUsbUJBQUEsR0FBQSxHQUVBKzlCLEVBQUF6NUIsT0FBQWdvRixHQUFBbDRGLHNCQUFBL2EsS0FBQWd1RixNQUFBM3FFLGFBQUFyYSxTQUVBLEVDckdBLE1BQUFxcUcsV0FBQTE0QyxHQVVBLFdBQUEvM0QsQ0FBQWlqQixFQUFBLEdBQUEwM0MsRUFBQSxHQUFBMXhCLEVBQUEsUUFBQUMsRUFBQSxTQUVBRCxFQUFBLElBQUEvQixHQUFBK0IsR0FDQUMsRUFBQSxJQUFBaEMsR0FBQWdDLEdBRUEsTUFBQS9nQyxFQUFBd3lELEVBQUEsRUFDQWw5QyxFQUFBd0YsRUFBQTAzQyxFQUNBejNDLEVBQUFELEVBQUEsRUFFQSszQixFQUFBLEdBQUFnMUQsRUFBQSxHQUVBLElBQUEsSUFBQTd4RyxFQUFBLEVBQUFzb0IsRUFBQSxFQUFBODNDLEdBQUFyN0MsRUFBQS9rQixHQUFBdzhELEVBQUF4OEQsSUFBQW9nRSxHQUFBOWdELEVBQUEsQ0FFQXU5QixFQUFBeDlDLE1BQUEwbEIsRUFBQSxFQUFBcTdDLEVBQUFyN0MsRUFBQSxFQUFBcTdDLEdBQ0F2akIsRUFBQXg5QyxLQUFBK2dFLEVBQUEsR0FBQXI3QyxFQUFBcTdDLEVBQUEsRUFBQXI3QyxHQUVBLE1BQUF6VCxFQUFBdFIsSUFBQWdLLEVBQUE4Z0MsRUFBQUMsRUFFQXo1QixFQUFBNUgsUUFBQW1vRyxFQUFBdnBGLEdBQUFBLEdBQUEsRUFDQWhYLEVBQUE1SCxRQUFBbW9HLEVBQUF2cEYsR0FBQUEsR0FBQSxFQUNBaFgsRUFBQTVILFFBQUFtb0csRUFBQXZwRixHQUFBQSxHQUFBLEVBQ0FoWCxFQUFBNUgsUUFBQW1vRyxFQUFBdnBGLEdBQUFBLEdBQUEsQ0FFQSxDQUVBLE1BQUF6QyxFQUFBLElBQUF5d0IsR0FDQXp3QixFQUFBcXhCLGFBQUEsV0FBQSxJQUFBcEIsR0FBQStHLEVBQUEsSUFDQWgzQixFQUFBcXhCLGFBQUEsUUFBQSxJQUFBcEIsR0FBQSs3RCxFQUFBLElBSUFyN0YsTUFBQXFQLEVBRkEsSUFBQXd5QyxHQUFBLENBQUE3c0IsY0FBQSxFQUFBcUMsWUFBQSxLQUlBNXVDLEtBQUFILEtBQUEsWUFFQSxDQU1BLE9BQUFvWixHQUVBalosS0FBQTRtQixTQUFBM04sVUFDQWpaLEtBQUErOEIsU0FBQTlqQixTQUVBLEVDdERBLE1BQUFxNkYsV0FBQTM0QyxHQVlBLFdBQUEvM0QsQ0FBQTJoQixFQUFBLEdBQUFndkYsRUFBQSxHQUFBQyxFQUFBLEVBQUFqMkMsRUFBQSxHQUFBMXhCLEVBQUEsUUFBQUMsRUFBQSxTQUVBRCxFQUFBLElBQUEvQixHQUFBK0IsR0FDQUMsRUFBQSxJQUFBaEMsR0FBQWdDLEdBRUEsTUFBQThSLEVBQUEsR0FDQWcxRCxFQUFBLEdBSUEsR0FBQVcsRUFBQSxFQUVBLElBQUEsSUFBQXh5RyxFQUFBLEVBQUFBLEVBQUF3eUcsRUFBQXh5RyxJQUFBLENBRUEsTUFBQTRHLEVBQUE1RyxFQUFBd3lHLEdBQUEsRUFBQWp5RyxLQUFBQyxJQUVBaUIsRUFBQWxCLEtBQUE0RSxJQUFBeUIsR0FBQTRjLEVBQ0FqTCxFQUFBaFksS0FBQTJFLElBQUEwQixHQUFBNGMsRUFFQXE1QixFQUFBeDlDLEtBQUEsRUFBQSxFQUFBLEdBQ0F3OUMsRUFBQXg5QyxLQUFBb0MsRUFBQSxFQUFBOFcsR0FFQSxNQUFBakgsRUFBQSxFQUFBdFIsRUFBQThxQyxFQUFBQyxFQUVBOG1FLEVBQUF4eUcsS0FBQWlTLEVBQUF6RCxFQUFBeUQsRUFBQXRFLEVBQUFzRSxFQUFBdk0sR0FDQThzRyxFQUFBeHlHLEtBQUFpUyxFQUFBekQsRUFBQXlELEVBQUF0RSxFQUFBc0UsRUFBQXZNLEVBRUEsQ0FNQSxJQUFBLElBQUEvRSxFQUFBLEVBQUFBLEVBQUF5eUcsRUFBQXp5RyxJQUFBLENBRUEsTUFBQXNSLEVBQUEsRUFBQXRSLEVBQUE4cUMsRUFBQUMsRUFFQWw5QixFQUFBMlYsRUFBQUEsRUFBQWl2RixFQUFBenlHLEVBRUEsSUFBQSxJQUFBc29CLEVBQUEsRUFBQUEsRUFBQWswQyxFQUFBbDBDLElBQUEsQ0FJQSxJQUFBMWhCLEVBQUEwaEIsRUFBQWswQyxHQUFBLEVBQUFqOEQsS0FBQUMsSUFFQWlCLEVBQUFsQixLQUFBNEUsSUFBQXlCLEdBQUFpSCxFQUNBMEssRUFBQWhZLEtBQUEyRSxJQUFBMEIsR0FBQWlILEVBRUFndkMsRUFBQXg5QyxLQUFBb0MsRUFBQSxFQUFBOFcsR0FDQXM1RixFQUFBeHlHLEtBQUFpUyxFQUFBekQsRUFBQXlELEVBQUF0RSxFQUFBc0UsRUFBQXZNLEdBSUE2QixHQUFBMGhCLEVBQUEsR0FBQWswQyxHQUFBLEVBQUFqOEQsS0FBQUMsSUFFQWlCLEVBQUFsQixLQUFBNEUsSUFBQXlCLEdBQUFpSCxFQUNBMEssRUFBQWhZLEtBQUEyRSxJQUFBMEIsR0FBQWlILEVBRUFndkMsRUFBQXg5QyxLQUFBb0MsRUFBQSxFQUFBOFcsR0FDQXM1RixFQUFBeHlHLEtBQUFpUyxFQUFBekQsRUFBQXlELEVBQUF0RSxFQUFBc0UsRUFBQXZNLEVBRUEsQ0FFQSxDQUVBLE1BQUE4Z0IsRUFBQSxJQUFBeXdCLEdBQ0F6d0IsRUFBQXF4QixhQUFBLFdBQUEsSUFBQXBCLEdBQUErRyxFQUFBLElBQ0FoM0IsRUFBQXF4QixhQUFBLFFBQUEsSUFBQXBCLEdBQUErN0QsRUFBQSxJQUlBcjdGLE1BQUFxUCxFQUZBLElBQUF3eUMsR0FBQSxDQUFBN3NCLGNBQUEsRUFBQXFDLFlBQUEsS0FJQTV1QyxLQUFBSCxLQUFBLGlCQUVBLENBTUEsT0FBQW9aLEdBRUFqWixLQUFBNG1CLFNBQUEzTixVQUNBalosS0FBQSs4QixTQUFBOWpCLFNBRUEsRUNqSEEsTUFBQXc2RixHQUFBLElBQUF6eEYsR0FDQTB4RixHQUFBLElBQUExeEYsR0FDQTJ4RixHQUFBLElBQUEzeEYsR0FpQkEsTUFBQTR4RixXQUFBeitFLEdBVUEsV0FBQXZ5QixDQUFBb3JGLEVBQUFub0UsRUFBQXhULEdBRUFrRixRQU9BdlgsS0FBQWd1RixNQUFBQSxFQUVBaHVGLEtBQUE0UCxPQUFBbytFLEVBQUEzcUUsWUFDQXJqQixLQUFBOFgsa0JBQUEsRUFRQTlYLEtBQUFxUyxNQUFBQSxFQUVBclMsS0FBQUgsS0FBQSw4QkFFQUUsSUFBQThsQixJQUFBQSxFQUFBLEdBRUEsSUFBQWUsRUFBQSxJQUFBeXdCLEdBQ0F6d0IsRUFBQXF4QixhQUFBLFdBQUEsSUFBQXBCLEdBQUEsRUFDQWh4QixFQUFBQSxFQUFBLEVBQ0FBLEVBQUFBLEVBQUEsRUFDQUEsR0FBQUEsRUFBQSxHQUNBQSxHQUFBQSxFQUFBLEdBQ0FBLEVBQUFBLEVBQUEsR0FDQSxJQUVBLE1BQUFrWCxFQUFBLElBQUFxOEIsR0FBQSxDQUFBN2xCLEtBQUEsRUFBQTNFLFlBQUEsSUFPQTV1QyxLQUFBNnpHLFdBQUEsSUFBQTk1QyxHQUFBbnpDLEVBQUFtVyxHQUNBLzhCLEtBQUE0SCxJQUFBNUgsS0FBQTZ6RyxZQUVBanRGLEVBQUEsSUFBQXl3QixHQUNBendCLEVBQUFxeEIsYUFBQSxXQUFBLElBQUFwQixHQUFBLENBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEdBQUEsSUFPQTcyQyxLQUFBOHpHLFdBQUEsSUFBQS81QyxHQUFBbnpDLEVBQUFtVyxHQUNBLzhCLEtBQUE0SCxJQUFBNUgsS0FBQTh6RyxZQUVBOXpHLEtBQUFzZixRQUVBLENBTUEsT0FBQXJHLEdBRUFqWixLQUFBNnpHLFdBQUFqdEYsU0FBQTNOLFVBQ0FqWixLQUFBNnpHLFdBQUE5MkUsU0FBQTlqQixVQUNBalosS0FBQTh6RyxXQUFBbHRGLFNBQUEzTixVQUNBalosS0FBQTh6RyxXQUFBLzJFLFNBQUE5akIsU0FFQSxDQU1BLE1BQUFxRyxHQUVBdGYsS0FBQWd1RixNQUFBcm5FLG1CQUFBLEdBQUEsR0FDQTNtQixLQUFBZ3VGLE1BQUFwdEYsT0FBQStsQixtQkFBQSxHQUFBLEdBRUE4c0YsR0FBQTE0RixzQkFBQS9hLEtBQUFndUYsTUFBQTNxRSxhQUNBcXdGLEdBQUEzNEYsc0JBQUEvYSxLQUFBZ3VGLE1BQUFwdEYsT0FBQXlpQixhQUNBc3dGLEdBQUF6ckcsV0FBQXdyRyxHQUFBRCxJQUVBenpHLEtBQUE2ekcsV0FBQTVvRixPQUFBeW9GLFNBRUEzekcsSUFBQUMsS0FBQXFTLE9BRUFyUyxLQUFBNnpHLFdBQUE5MkUsU0FBQTFxQixNQUFBMUwsSUFBQTNHLEtBQUFxUyxPQUNBclMsS0FBQTh6RyxXQUFBLzJFLFNBQUExcUIsTUFBQTFMLElBQUEzRyxLQUFBcVMsU0FJQXJTLEtBQUE2ekcsV0FBQTkyRSxTQUFBMXFCLE1BQUEzSyxLQUFBMUgsS0FBQWd1RixNQUFBMzdFLE9BQ0FyUyxLQUFBOHpHLFdBQUEvMkUsU0FBQTFxQixNQUFBM0ssS0FBQTFILEtBQUFndUYsTUFBQTM3RSxRQUlBclMsS0FBQTh6RyxXQUFBN29GLE9BQUF5b0YsSUFDQTF6RyxLQUFBOHpHLFdBQUF6a0csTUFBQWlLLEVBQUFxNkYsR0FBQTF5RyxRQUVBLEVDbElBLE1BQUE4eUcsR0FBQSxJQUFBL3hGLEdBQ0FneUYsR0FBQSxJQUFBbHpELEdBa0JBLE1BQUFtekQsV0FBQXQ1QyxHQU9BLFdBQUEvM0QsQ0FBQXFnQixHQUVBLE1BQUEyRCxFQUFBLElBQUF5d0IsR0FDQXRhLEVBQUEsSUFBQXE4QixHQUFBLENBQUEvbUQsTUFBQSxTQUFBazZCLGNBQUEsRUFBQXFDLFlBQUEsSUFFQWdQLEVBQUEsR0FDQWcxRCxFQUFBLEdBRUFzQixFQUFBLENBQUEsRUFpREEsU0FBQUMsRUFBQXR1RyxFQUFBQyxHQUVBc3VHLEVBQUF2dUcsR0FDQXV1RyxFQUFBdHVHLEVBRUEsQ0FFQSxTQUFBc3VHLEVBQUFoOEUsR0FFQXdsQixFQUFBeDlDLEtBQUEsRUFBQSxFQUFBLEdBQ0F3eUcsRUFBQXh5RyxLQUFBLEVBQUEsRUFBQSxRQUVBTCxJQUFBbTBHLEVBQUE5N0UsS0FFQTg3RSxFQUFBOTdFLEdBQUEsSUFJQTg3RSxFQUFBOTdFLEdBQUFoNEIsS0FBQXc5QyxFQUFBMzhDLE9BQUEsRUFBQSxFQUVBLENBakVBa3pHLEVBQUEsS0FBQSxNQUNBQSxFQUFBLEtBQUEsTUFDQUEsRUFBQSxLQUFBLE1BQ0FBLEVBQUEsS0FBQSxNQUlBQSxFQUFBLEtBQUEsTUFDQUEsRUFBQSxLQUFBLE1BQ0FBLEVBQUEsS0FBQSxNQUNBQSxFQUFBLEtBQUEsTUFJQUEsRUFBQSxLQUFBLE1BQ0FBLEVBQUEsS0FBQSxNQUNBQSxFQUFBLEtBQUEsTUFDQUEsRUFBQSxLQUFBLE1BSUFBLEVBQUEsSUFBQSxNQUNBQSxFQUFBLElBQUEsTUFDQUEsRUFBQSxJQUFBLE1BQ0FBLEVBQUEsSUFBQSxNQUlBQSxFQUFBLEtBQUEsTUFDQUEsRUFBQSxLQUFBLE1BQ0FBLEVBQUEsS0FBQSxNQUlBQSxFQUFBLElBQUEsS0FDQUEsRUFBQSxJQUFBLEtBSUFBLEVBQUEsTUFBQSxPQUNBQSxFQUFBLE1BQUEsT0FFQUEsRUFBQSxNQUFBLE9BQ0FBLEVBQUEsTUFBQSxPQXdCQXZ0RixFQUFBcXhCLGFBQUEsV0FBQSxJQUFBcEIsR0FBQStHLEVBQUEsSUFDQWgzQixFQUFBcXhCLGFBQUEsUUFBQSxJQUFBcEIsR0FBQSs3RCxFQUFBLElBRUFyN0YsTUFBQXFQLEVBQUFtVyxHQUVBLzhCLEtBQUFILEtBQUEsZUFPQUcsS0FBQWlqQixPQUFBQSxFQUNBampCLEtBQUFpakIsT0FBQTArQix3QkFBQTNoRCxLQUFBaWpCLE9BQUEwK0IseUJBRUEzaEQsS0FBQTRQLE9BQUFxVCxFQUFBSSxZQUNBcmpCLEtBQUE4WCxrQkFBQSxFQU9BOVgsS0FBQWswRyxTQUFBQSxFQUVBbDBHLEtBQUFzZixTQUlBLE1BQUErMEYsRUFBQSxJQUFBdnFFLEdBQUEsVUFDQXdxRSxFQUFBLElBQUF4cUUsR0FBQSxVQUNBeXFFLEVBQUEsSUFBQXpxRSxHQUFBLE9BQ0EwcUUsRUFBQSxJQUFBMXFFLEdBQUEsVUFDQTJxRSxFQUFBLElBQUEzcUUsR0FBQSxTQUVBOXBDLEtBQUEwMEcsVUFBQUwsRUFBQUMsRUFBQUMsRUFBQUMsRUFBQUMsRUFFQSxDQVdBLFNBQUFDLENBQUE1akQsRUFBQXNoRCxFQUFBeGlGLEVBQUFodkIsRUFBQXNJLEdBRUEsTUFFQXlyRyxFQUZBMzBHLEtBQUE0bUIsU0FFQUUsYUFBQSxTQUlBNnRGLEVBQUEzK0QsT0FBQSxFQUFBOGEsRUFBQWxpRCxFQUFBa2lELEVBQUEvaUQsRUFBQStpRCxFQUFBaHJELEdBQUE2dUcsRUFBQTMrRCxPQUFBLEVBQUE4YSxFQUFBbGlELEVBQUFraUQsRUFBQS9pRCxFQUFBK2lELEVBQUFockQsR0FDQTZ1RyxFQUFBMytELE9BQUEsRUFBQThhLEVBQUFsaUQsRUFBQWtpRCxFQUFBL2lELEVBQUEraUQsRUFBQWhyRCxHQUFBNnVHLEVBQUEzK0QsT0FBQSxFQUFBOGEsRUFBQWxpRCxFQUFBa2lELEVBQUEvaUQsRUFBQStpRCxFQUFBaHJELEdBQ0E2dUcsRUFBQTMrRCxPQUFBLEVBQUE4YSxFQUFBbGlELEVBQUFraUQsRUFBQS9pRCxFQUFBK2lELEVBQUFockQsR0FBQTZ1RyxFQUFBMytELE9BQUEsRUFBQThhLEVBQUFsaUQsRUFBQWtpRCxFQUFBL2lELEVBQUEraUQsRUFBQWhyRCxHQUNBNnVHLEVBQUEzK0QsT0FBQSxFQUFBOGEsRUFBQWxpRCxFQUFBa2lELEVBQUEvaUQsRUFBQStpRCxFQUFBaHJELEdBQUE2dUcsRUFBQTMrRCxPQUFBLEVBQUE4YSxFQUFBbGlELEVBQUFraUQsRUFBQS9pRCxFQUFBK2lELEVBQUFockQsR0FJQTZ1RyxFQUFBMytELE9BQUEsRUFBQThhLEVBQUFsaUQsRUFBQWtpRCxFQUFBL2lELEVBQUEraUQsRUFBQWhyRCxHQUFBNnVHLEVBQUEzK0QsT0FBQSxFQUFBOGEsRUFBQWxpRCxFQUFBa2lELEVBQUEvaUQsRUFBQStpRCxFQUFBaHJELEdBQ0E2dUcsRUFBQTMrRCxPQUFBLEdBQUE4YSxFQUFBbGlELEVBQUFraUQsRUFBQS9pRCxFQUFBK2lELEVBQUFockQsR0FBQTZ1RyxFQUFBMytELE9BQUEsR0FBQThhLEVBQUFsaUQsRUFBQWtpRCxFQUFBL2lELEVBQUEraUQsRUFBQWhyRCxHQUNBNnVHLEVBQUEzK0QsT0FBQSxHQUFBOGEsRUFBQWxpRCxFQUFBa2lELEVBQUEvaUQsRUFBQStpRCxFQUFBaHJELEdBQUE2dUcsRUFBQTMrRCxPQUFBLEdBQUE4YSxFQUFBbGlELEVBQUFraUQsRUFBQS9pRCxFQUFBK2lELEVBQUFockQsR0FDQTZ1RyxFQUFBMytELE9BQUEsR0FBQThhLEVBQUFsaUQsRUFBQWtpRCxFQUFBL2lELEVBQUEraUQsRUFBQWhyRCxHQUFBNnVHLEVBQUEzK0QsT0FBQSxHQUFBOGEsRUFBQWxpRCxFQUFBa2lELEVBQUEvaUQsRUFBQStpRCxFQUFBaHJELEdBSUE2dUcsRUFBQTMrRCxPQUFBLEdBQUE4YSxFQUFBbGlELEVBQUFraUQsRUFBQS9pRCxFQUFBK2lELEVBQUFockQsR0FBQTZ1RyxFQUFBMytELE9BQUEsR0FBQThhLEVBQUFsaUQsRUFBQWtpRCxFQUFBL2lELEVBQUEraUQsRUFBQWhyRCxHQUNBNnVHLEVBQUEzK0QsT0FBQSxHQUFBOGEsRUFBQWxpRCxFQUFBa2lELEVBQUEvaUQsRUFBQStpRCxFQUFBaHJELEdBQUE2dUcsRUFBQTMrRCxPQUFBLEdBQUE4YSxFQUFBbGlELEVBQUFraUQsRUFBQS9pRCxFQUFBK2lELEVBQUFockQsR0FDQTZ1RyxFQUFBMytELE9BQUEsR0FBQThhLEVBQUFsaUQsRUFBQWtpRCxFQUFBL2lELEVBQUEraUQsRUFBQWhyRCxHQUFBNnVHLEVBQUEzK0QsT0FBQSxHQUFBOGEsRUFBQWxpRCxFQUFBa2lELEVBQUEvaUQsRUFBQStpRCxFQUFBaHJELEdBQ0E2dUcsRUFBQTMrRCxPQUFBLEdBQUE4YSxFQUFBbGlELEVBQUFraUQsRUFBQS9pRCxFQUFBK2lELEVBQUFockQsR0FBQTZ1RyxFQUFBMytELE9BQUEsR0FBQThhLEVBQUFsaUQsRUFBQWtpRCxFQUFBL2lELEVBQUEraUQsRUFBQWhyRCxHQUlBNnVHLEVBQUEzK0QsT0FBQSxHQUFBbzhELEVBQUF4akcsRUFBQXdqRyxFQUFBcmtHLEVBQUFxa0csRUFBQXRzRyxHQUFBNnVHLEVBQUEzK0QsT0FBQSxHQUFBbzhELEVBQUF4akcsRUFBQXdqRyxFQUFBcmtHLEVBQUFxa0csRUFBQXRzRyxHQUNBNnVHLEVBQUEzK0QsT0FBQSxHQUFBbzhELEVBQUF4akcsRUFBQXdqRyxFQUFBcmtHLEVBQUFxa0csRUFBQXRzRyxHQUFBNnVHLEVBQUEzK0QsT0FBQSxHQUFBbzhELEVBQUF4akcsRUFBQXdqRyxFQUFBcmtHLEVBQUFxa0csRUFBQXRzRyxHQUNBNnVHLEVBQUEzK0QsT0FBQSxHQUFBbzhELEVBQUF4akcsRUFBQXdqRyxFQUFBcmtHLEVBQUFxa0csRUFBQXRzRyxHQUFBNnVHLEVBQUEzK0QsT0FBQSxHQUFBbzhELEVBQUF4akcsRUFBQXdqRyxFQUFBcmtHLEVBQUFxa0csRUFBQXRzRyxHQUNBNnVHLEVBQUEzK0QsT0FBQSxHQUFBbzhELEVBQUF4akcsRUFBQXdqRyxFQUFBcmtHLEVBQUFxa0csRUFBQXRzRyxHQUFBNnVHLEVBQUEzK0QsT0FBQSxHQUFBbzhELEVBQUF4akcsRUFBQXdqRyxFQUFBcmtHLEVBQUFxa0csRUFBQXRzRyxHQUlBNnVHLEVBQUEzK0QsT0FBQSxHQUFBcG1CLEVBQUFoaEIsRUFBQWdoQixFQUFBN2hCLEVBQUE2aEIsRUFBQTlwQixHQUFBNnVHLEVBQUEzK0QsT0FBQSxHQUFBcG1CLEVBQUFoaEIsRUFBQWdoQixFQUFBN2hCLEVBQUE2aEIsRUFBQTlwQixHQUNBNnVHLEVBQUEzK0QsT0FBQSxHQUFBcG1CLEVBQUFoaEIsRUFBQWdoQixFQUFBN2hCLEVBQUE2aEIsRUFBQTlwQixHQUFBNnVHLEVBQUEzK0QsT0FBQSxHQUFBcG1CLEVBQUFoaEIsRUFBQWdoQixFQUFBN2hCLEVBQUE2aEIsRUFBQTlwQixHQUNBNnVHLEVBQUEzK0QsT0FBQSxHQUFBcG1CLEVBQUFoaEIsRUFBQWdoQixFQUFBN2hCLEVBQUE2aEIsRUFBQTlwQixHQUFBNnVHLEVBQUEzK0QsT0FBQSxHQUFBcG1CLEVBQUFoaEIsRUFBQWdoQixFQUFBN2hCLEVBQUE2aEIsRUFBQTlwQixHQUlBNnVHLEVBQUEzK0QsT0FBQSxHQUFBcDFDLEVBQUFnTyxFQUFBaE8sRUFBQW1OLEVBQUFuTixFQUFBa0YsR0FBQTZ1RyxFQUFBMytELE9BQUEsR0FBQXAxQyxFQUFBZ08sRUFBQWhPLEVBQUFtTixFQUFBbk4sRUFBQWtGLEdBQ0E2dUcsRUFBQTMrRCxPQUFBLEdBQUE5c0MsRUFBQTBGLEVBQUExRixFQUFBNkUsRUFBQTdFLEVBQUFwRCxHQUFBNnVHLEVBQUEzK0QsT0FBQSxHQUFBOXNDLEVBQUEwRixFQUFBMUYsRUFBQTZFLEVBQUE3RSxFQUFBcEQsR0FJQTZ1RyxFQUFBMytELE9BQUEsR0FBQTlzQyxFQUFBMEYsRUFBQTFGLEVBQUE2RSxFQUFBN0UsRUFBQXBELEdBQUE2dUcsRUFBQTMrRCxPQUFBLEdBQUE5c0MsRUFBQTBGLEVBQUExRixFQUFBNkUsRUFBQTdFLEVBQUFwRCxHQUNBNnVHLEVBQUEzK0QsT0FBQSxHQUFBOXNDLEVBQUEwRixFQUFBMUYsRUFBQTZFLEVBQUE3RSxFQUFBcEQsR0FBQTZ1RyxFQUFBMytELE9BQUEsR0FBQTlzQyxFQUFBMEYsRUFBQTFGLEVBQUE2RSxFQUFBN0UsRUFBQXBELEdBRUE2dUcsRUFBQTMrRCxPQUFBLEdBQUE5c0MsRUFBQTBGLEVBQUExRixFQUFBNkUsRUFBQTdFLEVBQUFwRCxHQUFBNnVHLEVBQUEzK0QsT0FBQSxHQUFBOXNDLEVBQUEwRixFQUFBMUYsRUFBQTZFLEVBQUE3RSxFQUFBcEQsR0FDQTZ1RyxFQUFBMytELE9BQUEsR0FBQTlzQyxFQUFBMEYsRUFBQTFGLEVBQUE2RSxFQUFBN0UsRUFBQXBELEdBQUE2dUcsRUFBQTMrRCxPQUFBLEdBQUE5c0MsRUFBQTBGLEVBQUExRixFQUFBNkUsRUFBQTdFLEVBQUFwRCxHQUVBNnVHLEVBQUE1K0YsYUFBQSxDQUVBLENBS0EsTUFBQXVKLEdBRUEsTUFBQXNILEVBQUE1bUIsS0FBQTRtQixTQUNBc3RGLEVBQUFsMEcsS0FBQWswRyxTQU9BRixHQUFBNXdGLHdCQUFBMWIsS0FBQTFILEtBQUFpakIsT0FBQUcseUJBR0EsTUFBQXd4RixFQUFBNTBHLEtBQUFpakIsT0FBQTBQLG1CQUFBcnpCLElBQUEsRUFBQSxFQUdBdTFHLEdBQUEsSUFBQVgsRUFBQXR0RixFQUFBb3RGLEdBQUEsRUFBQSxFQUFBWSxHQUNBQyxHQUFBLElBQUFYLEVBQUF0dEYsRUFBQW90RixHQUFBLEVBQUEsRUFBQSxHQUlBYSxHQUFBLEtBQUFYLEVBQUF0dEYsRUFBQW90RixJQUFBLEdBQUEsRUFBQVksR0FDQUMsR0FBQSxLQUFBWCxFQUFBdHRGLEVBQUFvdEYsR0FqQkEsR0FpQkEsRUFBQVksR0FDQUMsR0FBQSxLQUFBWCxFQUFBdHRGLEVBQUFvdEYsSUFBQSxFQWxCQSxFQWtCQVksR0FDQUMsR0FBQSxLQUFBWCxFQUFBdHRGLEVBQUFvdEYsR0FuQkEsRUFBQSxFQW1CQVksR0FJQUMsR0FBQSxLQUFBWCxFQUFBdHRGLEVBQUFvdEYsSUFBQSxHQUFBLEVBQUEsR0FDQWEsR0FBQSxLQUFBWCxFQUFBdHRGLEVBQUFvdEYsR0F4QkEsR0F3QkEsRUFBQSxHQUNBYSxHQUFBLEtBQUFYLEVBQUF0dEYsRUFBQW90RixJQUFBLEVBekJBLEVBeUJBLEdBQ0FhLEdBQUEsS0FBQVgsRUFBQXR0RixFQUFBb3RGLEdBMUJBLEVBQUEsRUEwQkEsR0FJQWEsR0FBQSxLQUFBWCxFQUFBdHRGLEVBQUFvdEYsR0FBQXo2RixHQUFBdkwsSUFBQTRtRyxHQUNBQyxHQUFBLEtBQUFYLEVBQUF0dEYsRUFBQW90RixJQUFBLEdBQUFobUcsSUFBQTRtRyxHQUNBQyxHQUFBLEtBQUFYLEVBQUF0dEYsRUFBQW90RixHQUFBLEVBQUFobUcsRUFBQTRtRyxHQUlBQyxHQUFBLE1BQUFYLEVBQUF0dEYsRUFBQW90RixJQUFBLEVBQUEsRUFBQSxHQUNBYSxHQUFBLE1BQUFYLEVBQUF0dEYsRUFBQW90RixHQXJDQSxFQXFDQSxFQUFBLEdBQ0FhLEdBQUEsTUFBQVgsRUFBQXR0RixFQUFBb3RGLEdBQUEsR0FBQSxFQUFBLEdBQ0FhLEdBQUEsTUFBQVgsRUFBQXR0RixFQUFBb3RGLEdBQUEsRUF2Q0EsRUF1Q0EsR0FFQWEsR0FBQSxNQUFBWCxFQUFBdHRGLEVBQUFvdEYsSUFBQSxFQUFBLEVBQUFZLEdBQ0FDLEdBQUEsTUFBQVgsRUFBQXR0RixFQUFBb3RGLEdBMUNBLEVBMENBLEVBQUFZLEdBQ0FDLEdBQUEsTUFBQVgsRUFBQXR0RixFQUFBb3RGLEdBQUEsR0FBQSxFQUFBWSxHQUNBQyxHQUFBLE1BQUFYLEVBQUF0dEYsRUFBQW90RixHQUFBLEVBNUNBLEVBNENBWSxHQUVBaHVGLEVBQUFFLGFBQUEsWUFBQS9RLGFBQUEsQ0FFQSxDQU1BLE9BQUFrRCxHQUVBalosS0FBQTRtQixTQUFBM04sVUFDQWpaLEtBQUErOEIsU0FBQTlqQixTQUVBLEVBS0EsU0FBQTQ3RixHQUFBdHVGLEVBQUEydEYsRUFBQXR0RixFQUFBM0QsRUFBQXpnQixFQUFBQyxFQUFBNlcsR0FFQXk2RixHQUFBcHRHLElBQUFuRSxFQUFBQyxFQUFBNlcsR0FBQTZKLFVBQUFGLEdBRUEsTUFBQTBDLEVBQUF1dUYsRUFBQTN0RixHQUVBLFFBQUF4bUIsSUFBQTRsQixFQUFBLENBRUEsTUFBQTZMLEVBQUE1SyxFQUFBRSxhQUFBLFlBRUEsSUFBQSxJQUFBL2xCLEVBQUEsRUFBQUMsRUFBQTJrQixFQUFBMWtCLE9BQUFGLEVBQUFDLEVBQUFELElBRUF5d0IsRUFBQXdrQixPQUFBcndCLEVBQUE1a0IsR0FBQWd6RyxHQUFBdnhHLEVBQUF1eEcsR0FBQXR4RyxFQUFBc3hHLEdBQUF6NkYsRUFJQSxDQUVBLENDL1NBLE1BQUF3N0YsR0FBQSxJQUFBNXZGLEdBbUJBLE1BQUE2dkYsV0FBQXA2QyxHQVFBLFdBQUEvM0QsQ0FBQW9qQixFQUFBM1QsRUFBQSxVQUVBLE1BQUEwb0MsRUFBQSxJQUFBaDRDLFlBQUEsQ0FBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsSUFDQW92RyxFQUFBLElBQUF0dkcsYUFBQSxJQUVBK2pCLEVBQUEsSUFBQXl3QixHQUNBendCLEVBQUFreEIsU0FBQSxJQUFBaEQsR0FBQWlHLEVBQUEsSUFDQW4wQixFQUFBcXhCLGFBQUEsV0FBQSxJQUFBbkQsR0FBQXE5RCxFQUFBLElBRUE1NkYsTUFBQXFQLEVBQUEsSUFBQXd5QyxHQUFBLENBQUEvbUQsTUFBQUEsRUFBQXU4QixZQUFBLEtBT0E1dUMsS0FBQWdtQixPQUFBQSxFQUNBaG1CLEtBQUFILEtBQUEsWUFFQUcsS0FBQThYLGtCQUFBLEVBRUE5WCxLQUFBc2YsUUFFQSxDQU1BLE1BQUFBLEdBUUEsUUFOQXZmLElBQUFDLEtBQUFnbUIsUUFFQTh1RixHQUFBL3VGLGNBQUEvbEIsS0FBQWdtQixRQUlBOHVGLEdBQUExdUYsVUFBQSxPQUVBLE1BQUFsa0IsRUFBQTR5RyxHQUFBNXlHLElBQ0FDLEVBQUEyeUcsR0FBQTN5RyxJQWtCQXF2QixFQUFBeHhCLEtBQUE0bUIsU0FBQTR3QixXQUFBaG1CLFNBQ0Ezd0IsRUFBQTJ3QixFQUFBM3dCLE1BRUFBLEVBQUEsR0FBQXNCLEVBQUFLLEVBQUEzQixFQUFBLEdBQUFzQixFQUFBTSxFQUFBNUIsRUFBQSxHQUFBc0IsRUFBQW1YLEVBQ0F6WSxFQUFBLEdBQUFxQixFQUFBTSxFQUFBM0IsRUFBQSxHQUFBc0IsRUFBQU0sRUFBQTVCLEVBQUEsR0FBQXNCLEVBQUFtWCxFQUNBelksRUFBQSxHQUFBcUIsRUFBQU0sRUFBQTNCLEVBQUEsR0FBQXFCLEVBQUFPLEVBQUE1QixFQUFBLEdBQUFzQixFQUFBbVgsRUFDQXpZLEVBQUEsR0FBQXNCLEVBQUFLLEVBQUEzQixFQUFBLElBQUFxQixFQUFBTyxFQUFBNUIsRUFBQSxJQUFBc0IsRUFBQW1YLEVBQ0F6WSxFQUFBLElBQUFzQixFQUFBSyxFQUFBM0IsRUFBQSxJQUFBc0IsRUFBQU0sRUFBQTVCLEVBQUEsSUFBQXFCLEVBQUFvWCxFQUNBelksRUFBQSxJQUFBcUIsRUFBQU0sRUFBQTNCLEVBQUEsSUFBQXNCLEVBQUFNLEVBQUE1QixFQUFBLElBQUFxQixFQUFBb1gsRUFDQXpZLEVBQUEsSUFBQXFCLEVBQUFNLEVBQUEzQixFQUFBLElBQUFxQixFQUFBTyxFQUFBNUIsRUFBQSxJQUFBcUIsRUFBQW9YLEVBQ0F6WSxFQUFBLElBQUFzQixFQUFBSyxFQUFBM0IsRUFBQSxJQUFBcUIsRUFBQU8sRUFBQTVCLEVBQUEsSUFBQXFCLEVBQUFvWCxFQUVBa1ksRUFBQXpiLGFBQUEsRUFFQS9WLEtBQUE0bUIsU0FBQTZ4Qix1QkFFQSxDQVFBLGFBQUExeUIsQ0FBQUMsR0FLQSxPQUhBaG1CLEtBQUFnbUIsT0FBQUEsRUFDQWhtQixLQUFBc2YsU0FFQXRmLElBRUEsQ0FFQSxJQUFBMEgsQ0FBQStQLEVBQUE2bEIsR0FNQSxPQUpBL2xCLE1BQUE3UCxLQUFBK1AsRUFBQTZsQixHQUVBdDlCLEtBQUFnbUIsT0FBQXZPLEVBQUF1TyxPQUVBaG1CLElBRUEsQ0FNQSxPQUFBaVosR0FFQWpaLEtBQUE0bUIsU0FBQTNOLFVBQ0FqWixLQUFBKzhCLFNBQUE5akIsU0FFQSxFQzdIQSxNQUFBKzdGLFdBQUFyNkMsR0FRQSxXQUFBLzNELENBQUF1akIsRUFBQTlULEVBQUEsVUFFQSxNQUFBMG9DLEVBQUEsSUFBQWg0QyxZQUFBLENBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLElBSUE2akIsRUFBQSxJQUFBeXdCLEdBRUF6d0IsRUFBQWt4QixTQUFBLElBQUFoRCxHQUFBaUcsRUFBQSxJQUVBbjBCLEVBQUFxeEIsYUFBQSxXQUFBLElBQUFwQixHQU5BLENBQUEsRUFBQSxFQUFBLEdBQUEsRUFBQSxFQUFBLEdBQUEsR0FBQSxFQUFBLEVBQUEsR0FBQSxFQUFBLEVBQUEsRUFBQSxHQUFBLEdBQUEsRUFBQSxHQUFBLEdBQUEsR0FBQSxHQUFBLEVBQUEsR0FBQSxHQUFBLEdBTUEsSUFFQXQvQixNQUFBcVAsRUFBQSxJQUFBd3lDLEdBQUEsQ0FBQS9tRCxNQUFBQSxFQUFBdThCLFlBQUEsS0FPQTV1QyxLQUFBbW1CLElBQUFBLEVBRUFubUIsS0FBQUgsS0FBQSxhQUVBRyxLQUFBNG1CLFNBQUE2eEIsdUJBRUEsQ0FFQSxpQkFBQXhmLENBQUFDLEdBRUEsTUFBQS9TLEVBQUFubUIsS0FBQW1tQixJQUVBQSxFQUFBQyxZQUVBRCxFQUFBRSxVQUFBcm1CLEtBQUF3eEIsVUFFQXJMLEVBQUFHLFFBQUF0bUIsS0FBQXFQLE9BRUFyUCxLQUFBcVAsTUFBQWpILGVBQUEsSUFFQW1QLE1BQUEwaEIsa0JBQUFDLEdBRUEsQ0FNQSxPQUFBamdCLEdBRUFqWixLQUFBNG1CLFNBQUEzTixVQUNBalosS0FBQSs4QixTQUFBOWpCLFNBRUEsRUM1REEsTUFBQWc4RixXQUFBbDdDLEdBU0EsV0FBQW4zRCxDQUFBbWxCLEVBQUFsQyxFQUFBLEVBQUFxa0IsRUFBQSxVQUVBLE1BQUE3M0IsRUFBQTYzQixFQUlBdGpCLEVBQUEsSUFBQXl3QixHQUNBendCLEVBQUFxeEIsYUFBQSxXQUFBLElBQUFwQixHQUhBLENBQUEsR0FBQSxFQUFBLEdBQUEsRUFBQSxFQUFBLEdBQUEsR0FBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEdBQUEsRUFBQSxFQUFBLEdBQUEsR0FBQSxFQUFBLEVBQUEsR0FBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEdBR0EsSUFDQWp3QixFQUFBNnhCLHdCQUVBbGhDLE1BQUFxUCxFQUFBLElBQUF3eUMsR0FBQSxDQUFBL21ELE1BQUFBLEVBQUF1OEIsWUFBQSxLQUVBNXVDLEtBQUFILEtBQUEsY0FPQUcsS0FBQStuQixNQUFBQSxFQVFBL25CLEtBQUE2bEIsS0FBQUEsRUFFQSxNQUVBczFCLEVBQUEsSUFBQTlELEdBQ0E4RCxFQUFBbEQsYUFBQSxXQUFBLElBQUFwQixHQUhBLENBQUEsRUFBQSxFQUFBLEdBQUEsRUFBQSxFQUFBLEdBQUEsR0FBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEdBQUEsR0FBQSxFQUFBLEVBQUEsR0FBQSxFQUFBLEdBR0EsSUFDQXNFLEVBQUExQyx3QkFFQXo0QyxLQUFBNEgsSUFBQSxJQUFBdTBDLEdBQUFoQixFQUFBLElBQUF4SCxHQUFBLENBQUF0aEMsTUFBQUEsRUFBQW02QixRQUFBLEdBQUFDLGFBQUEsRUFBQVksWUFBQSxFQUFBdUIsWUFBQSxLQUVBLENBRUEsaUJBQUEzVixDQUFBQyxHQUVBbDVCLEtBQUF3eEIsU0FBQTdxQixJQUFBLEVBQUEsRUFBQSxHQUVBM0csS0FBQXFQLE1BQUExSSxJQUFBLEdBQUEzRyxLQUFBNmxCLEtBQUEsR0FBQTdsQixLQUFBNmxCLEtBQUEsR0FFQTdsQixLQUFBaXJCLE9BQUFqckIsS0FBQStuQixNQUFBNUQsUUFFQW5rQixLQUFBeTNCLFlBQUF6M0IsS0FBQStuQixNQUFBQyxVQUVBelEsTUFBQTBoQixrQkFBQUMsRUFFQSxDQU1BLE9BQUFqZ0IsR0FFQWpaLEtBQUE0bUIsU0FBQTNOLFVBQ0FqWixLQUFBKzhCLFNBQUE5akIsVUFDQWpaLEtBQUFzbkIsU0FBQSxHQUFBVixTQUFBM04sVUFDQWpaLEtBQUFzbkIsU0FBQSxHQUFBeVYsU0FBQTlqQixTQUVBLEVDakZBLE1BQUFpOEYsR0FBQSxJQUFBbHpGLEdBQ0EsSUFBQW16RixHQUFBQyxHQXFCQSxNQUFBQyxXQUFBbGdGLEdBWUEsV0FBQXZ5QixDQUFBK2IsRUFBQSxJQUFBcUQsR0FBQSxFQUFBLEVBQUEsR0FBQTZJLEVBQUEsSUFBQTdJLEdBQUEsRUFBQSxFQUFBLEdBQUEvZ0IsRUFBQSxFQUFBb1IsRUFBQSxTQUFBaWpHLEVBQUEsR0FBQXIwRyxFQUFBczBHLEVBQUEsR0FBQUQsR0FFQS85RixRQUVBdlgsS0FBQUgsS0FBQSxtQkFFQUUsSUFBQW8xRyxLQUVBQSxHQUFBLElBQUE5OUQsR0FDQTg5RCxHQUFBbDlELGFBQUEsV0FBQSxJQUFBcEIsR0FBQSxDQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxHQUFBLElBRUF1K0QsR0FBQSxJQUFBbnZDLEdBQUEsRUFBQSxHQUFBLEVBQUEsRUFBQSxHQUNBbXZDLEdBQUExbEcsVUFBQSxHQUFBLEdBQUEsSUFJQTFQLEtBQUF3eEIsU0FBQTlwQixLQUFBbWpCLEdBT0E3cUIsS0FBQWd3RCxLQUFBLElBQUErSixHQUFBbzdDLEdBQUEsSUFBQS83QyxHQUFBLENBQUEvbUQsTUFBQUEsRUFBQXU4QixZQUFBLEtBQ0E1dUMsS0FBQWd3RCxLQUFBbDRDLGtCQUFBLEVBQ0E5WCxLQUFBNEgsSUFBQTVILEtBQUFnd0QsTUFPQWh3RCxLQUFBb3lHLEtBQUEsSUFBQWoyRCxHQUFBaTVELEdBQUEsSUFBQXpoRSxHQUFBLENBQUF0aEMsTUFBQUEsRUFBQXU4QixZQUFBLEtBQ0E1dUMsS0FBQW95RyxLQUFBdDZGLGtCQUFBLEVBQ0E5WCxLQUFBNEgsSUFBQTVILEtBQUFveUcsTUFFQXB5RyxLQUFBdzFHLGFBQUE3MkYsR0FDQTNlLEtBQUFpSyxVQUFBaEosRUFBQXEwRyxFQUFBQyxFQUVBLENBT0EsWUFBQUMsQ0FBQTcyRixHQUlBLEdBQUFBLEVBQUFsYyxFQUFBLE9BRUF6QyxLQUFBbWYsV0FBQXhZLElBQUEsRUFBQSxFQUFBLEVBQUEsUUFFQSxHQUFBZ1ksRUFBQWxjLEdBQUEsT0FFQXpDLEtBQUFtZixXQUFBeFksSUFBQSxFQUFBLEVBQUEsRUFBQSxPQUVBLENBRUF1dUcsR0FBQXZ1RyxJQUFBZ1ksRUFBQXJGLEVBQUEsR0FBQXFGLEVBQUFuYyxHQUFBYSxZQUVBLE1BQUE4QixFQUFBN0QsS0FBQXFJLEtBQUFnVixFQUFBbGMsR0FFQXpDLEtBQUFtZixXQUFBUyxpQkFBQXMxRixHQUFBL3ZHLEVBRUEsQ0FFQSxDQVNBLFNBQUE4RSxDQUFBaEosRUFBQXEwRyxFQUFBLEdBQUFyMEcsRUFBQXMwRyxFQUFBLEdBQUFELEdBRUF0MUcsS0FBQWd3RCxLQUFBM2dELE1BQUExSSxJQUFBLEVBQUFyRixLQUFBYSxJQUFBLEtBQUFsQixFQUFBcTBHLEdBQUEsR0FDQXQxRyxLQUFBZ3dELEtBQUF4M0MsZUFFQXhZLEtBQUFveUcsS0FBQS9pRyxNQUFBMUksSUFBQTR1RyxFQUFBRCxFQUFBQyxHQUNBdjFHLEtBQUFveUcsS0FBQTVnRixTQUFBL3VCLEVBQUF4QixFQUNBakIsS0FBQW95RyxLQUFBNTVGLGNBRUEsQ0FPQSxRQUFBaTlGLENBQUFwakcsR0FFQXJTLEtBQUFnd0QsS0FBQWp6QixTQUFBMXFCLE1BQUExTCxJQUFBMEwsR0FDQXJTLEtBQUFveUcsS0FBQXIxRSxTQUFBMXFCLE1BQUExTCxJQUFBMEwsRUFFQSxDQUVBLElBQUEzSyxDQUFBK1AsR0FPQSxPQUxBRixNQUFBN1AsS0FBQStQLEdBQUEsR0FFQXpYLEtBQUFnd0QsS0FBQXRvRCxLQUFBK1AsRUFBQXU0QyxNQUNBaHdELEtBQUFveUcsS0FBQTFxRyxLQUFBK1AsRUFBQTI2RixNQUVBcHlHLElBRUEsQ0FNQSxPQUFBaVosR0FFQWpaLEtBQUFnd0QsS0FBQXBwQyxTQUFBM04sVUFDQWpaLEtBQUFnd0QsS0FBQWp6QixTQUFBOWpCLFVBQ0FqWixLQUFBb3lHLEtBQUF4ckYsU0FBQTNOLFVBQ0FqWixLQUFBb3lHLEtBQUFyMUUsU0FBQTlqQixTQUVBLEVDckpBLE1BQUF5OEYsV0FBQS82QyxHQU9BLFdBQUEvM0QsQ0FBQWlqQixFQUFBLEdBRUEsTUFBQSszQixFQUFBLENBQ0EsRUFBQSxFQUFBLEVBQUEvM0IsRUFBQSxFQUFBLEVBQ0EsRUFBQSxFQUFBLEVBQUEsRUFBQUEsRUFBQSxFQUNBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQUEsR0FTQWUsRUFBQSxJQUFBeXdCLEdBQ0F6d0IsRUFBQXF4QixhQUFBLFdBQUEsSUFBQXBCLEdBQUErRyxFQUFBLElBQ0FoM0IsRUFBQXF4QixhQUFBLFFBQUEsSUFBQXBCLEdBUkEsQ0FDQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEdBQUEsRUFDQSxFQUFBLEVBQUEsRUFBQSxHQUFBLEVBQUEsRUFDQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEdBQUEsR0FLQSxJQUlBdC9CLE1BQUFxUCxFQUZBLElBQUF3eUMsR0FBQSxDQUFBN3NCLGNBQUEsRUFBQXFDLFlBQUEsS0FJQTV1QyxLQUFBSCxLQUFBLFlBRUEsQ0FVQSxTQUFBNjBHLENBQUFpQixFQUFBQyxFQUFBQyxHQUVBLE1BQUF4akcsRUFBQSxJQUFBeTNCLEdBQ0FqcEMsRUFBQWIsS0FBQTRtQixTQUFBNHdCLFdBQUFubEMsTUFBQXhSLE1BZ0JBLE9BZEF3UixFQUFBMUwsSUFBQWd2RyxHQUNBdGpHLEVBQUE1SCxRQUFBNUosRUFBQSxHQUNBd1IsRUFBQTVILFFBQUE1SixFQUFBLEdBRUF3UixFQUFBMUwsSUFBQWl2RyxHQUNBdmpHLEVBQUE1SCxRQUFBNUosRUFBQSxHQUNBd1IsRUFBQTVILFFBQUE1SixFQUFBLEdBRUF3UixFQUFBMUwsSUFBQWt2RyxHQUNBeGpHLEVBQUE1SCxRQUFBNUosRUFBQSxJQUNBd1IsRUFBQTVILFFBQUE1SixFQUFBLElBRUFiLEtBQUE0bUIsU0FBQTR3QixXQUFBbmxDLE1BQUEwRCxhQUFBLEVBRUEvVixJQUVBLENBTUEsT0FBQWlaLEdBRUFqWixLQUFBNG1CLFNBQUEzTixVQUNBalosS0FBQSs4QixTQUFBOWpCLFNBRUEsRUNqRkEsTUFBQTY4RixHQUtBLFdBQUFsekcsR0FFQTVDLEtBQUFILEtBQUEsWUFPQUcsS0FBQXFTLE1BQUEsSUFBQXkzQixHQVFBOXBDLEtBQUErMUcsU0FBQSxHQVFBLzFHLEtBQUFnMkcsWUFBQSxJQUVBLENBU0EsTUFBQWx5QyxDQUFBdGhFLEVBQUFDLEdBTUEsT0FKQXpDLEtBQUFnMkcsWUFBQSxJQUFBcHlDLEdBQ0E1akUsS0FBQSsxRyxTQUFBMzFHLEtBQUFKLEtBQUFnMkcsYUFDQWgyRyxLQUFBZzJHLFlBQUFseUMsT0FBQXRoRSxFQUFBQyxHQUVBekMsSUFFQSxDQVVBLE1BQUErakUsQ0FBQXZoRSxFQUFBQyxHQUlBLE9BRkF6QyxLQUFBZzJHLFlBQUFqeUMsT0FBQXZoRSxFQUFBQyxHQUVBekMsSUFFQSxDQVlBLGdCQUFBZ2tFLENBQUFDLEVBQUFDLEVBQUFqRixFQUFBQyxHQUlBLE9BRkFsL0QsS0FBQWcyRyxZQUFBaHlDLGlCQUFBQyxFQUFBQyxFQUFBakYsRUFBQUMsR0FFQWwvRCxJQUVBLENBY0EsYUFBQW1rRSxDQUFBQyxFQUFBQyxFQUFBQyxFQUFBQyxFQUFBdEYsRUFBQUMsR0FJQSxPQUZBbC9ELEtBQUFnMkcsWUFBQTd4QyxjQUFBQyxFQUFBQyxFQUFBQyxFQUFBQyxFQUFBdEYsRUFBQUMsR0FFQWwvRCxJQUVBLENBU0EsVUFBQXdrRSxDQUFBYixHQUlBLE9BRkEzakUsS0FBQWcyRyxZQUFBeHhDLFdBQUFiLEdBRUEzakUsSUFFQSxDQVNBLFFBQUFpMkcsQ0FBQUMsR0FxQkEsU0FBQUMsRUFBQXhrQyxFQUFBeWtDLEdBRUEsTUFBQUMsRUFBQUQsRUFBQW4xRyxPQU1BLElBQUE2c0UsR0FBQSxFQUNBLElBQUEsSUFBQWo3QyxFQUFBd2pGLEVBQUEsRUFBQXp3RyxFQUFBLEVBQUFBLEVBQUF5d0csRUFBQXhqRixFQUFBanRCLElBQUEsQ0FFQSxJQUFBMHdHLEVBQUFGLEVBQUF2akYsR0FDQTBqRixFQUFBSCxFQUFBeHdHLEdBRUE0d0csRUFBQUQsRUFBQS96RyxFQUFBOHpHLEVBQUE5ekcsRUFDQWkwRyxFQUFBRixFQUFBOXpHLEVBQUE2ekcsRUFBQTd6RyxFQUVBLEdBQUFuQixLQUFBNkMsSUFBQXN5RyxHQUFBNTNGLE9BQUFDLFFBQUEsQ0FVQSxHQVBBMjNGLEVBQUEsSUFFQUgsRUFBQUYsRUFBQXh3RyxHQUFBNHdHLEdBQUFBLEVBQ0FELEVBQUFILEVBQUF2akYsR0FBQTRqRixHQUFBQSxHQUlBOWtDLEVBQUFsdkUsRUFBQTZ6RyxFQUFBN3pHLEdBQUFrdkUsRUFBQWx2RSxFQUFBOHpHLEVBQUE5ekcsRUFBQSxTQUVBLEdBQUFrdkUsRUFBQWx2RSxJQUFBNnpHLEVBQUE3ekcsR0FFQSxHQUFBa3ZFLEVBQUFudkUsSUFBQTh6RyxFQUFBOXpHLEVBQUEsT0FBQSxNQUdBLENBRUEsTUFBQWswRyxFQUFBRCxHQUFBOWtDLEVBQUFudkUsRUFBQTh6RyxFQUFBOXpHLEdBQUFnMEcsR0FBQTdrQyxFQUFBbHZFLEVBQUE2ekcsRUFBQTd6RyxHQUNBLEdBQUEsSUFBQWkwRyxFQUFBLE9BQUEsRUFDQSxHQUFBQSxFQUFBLEVBQUEsU0FDQTVvQyxHQUFBQSxDQUVBLENBRUEsS0FBQSxDQUdBLEdBQUE2RCxFQUFBbHZFLElBQUE2ekcsRUFBQTd6RyxFQUFBLFNBRUEsR0FBQTh6RyxFQUFBL3pHLEdBQUFtdkUsRUFBQW52RSxHQUFBbXZFLEVBQUFudkUsR0FBQTh6RyxFQUFBOXpHLEdBQ0E4ekcsRUFBQTl6RyxHQUFBbXZFLEVBQUFudkUsR0FBQW12RSxFQUFBbnZFLEdBQUErekcsRUFBQS96RyxFQUFBLE9BQUEsQ0FHQSxDQUVBLENBRUEsT0FBQXNyRSxDQUVBLENBRUEsTUFBQWlCLEVBQUFGLEdBQUFFLFlBRUFnbkMsRUFBQS8xRyxLQUFBKzFHLFNBQ0EsR0FBQSxJQUFBQSxFQUFBOTBHLE9BQUEsTUFBQSxHQUVBLElBQUEwMUcsRUFBQUMsRUFBQUMsRUFDQSxNQUFBdDlFLEVBQUEsR0FFQSxHQUFBLElBQUF3OEUsRUFBQTkwRyxPQU1BLE9BSkEyMUcsRUFBQWIsRUFBQSxHQUNBYyxFQUFBLElBQUFydEMsR0FDQXF0QyxFQUFBbDBDLE9BQUFpMEMsRUFBQWowQyxPQUNBcHBDLEVBQUFuNUIsS0FBQXkyRyxHQUNBdDlFLEVBSUEsSUFBQXU5RSxHQUFBL25DLEVBQUFnbkMsRUFBQSxHQUFBejRDLGFBQ0F3NUMsRUFBQVosR0FBQVksRUFBQUEsRUFJQSxNQUFBQyxFQUFBLEdBQ0FDLEVBQUEsR0FDQSxJQUVBQyxFQWlHQUMsRUFuR0FDLEVBQUEsR0FDQUMsRUFBQSxFQUdBSixFQUFBSSxRQUFBcjNHLEVBQ0FvM0csRUFBQUMsR0FBQSxHQUVBLElBQUEsSUFBQXIyRyxFQUFBLEVBQUFDLEVBQUErMEcsRUFBQTkwRyxPQUFBRixFQUFBQyxFQUFBRCxJQUVBNjFHLEVBQUFiLEVBQUFoMUcsR0FDQWsyRyxFQUFBTCxFQUFBdDVDLFlBQ0FxNUMsRUFBQTVuQyxFQUFBa29DLEdBQ0FOLEVBQUFULEdBQUFTLEVBQUFBLEVBRUFBLElBRUFHLEdBQUFFLEVBQUFJLElBQUFBLElBRUFKLEVBQUFJLEdBQUEsQ0FBQXR5RyxFQUFBLElBQUEwa0UsR0FBQTMyQyxFQUFBb2tGLEdBQ0FELEVBQUFJLEdBQUF0eUcsRUFBQTY5RCxPQUFBaTBDLEVBQUFqMEMsT0FFQW0wQyxHQUFBTSxJQUNBRCxFQUFBQyxHQUFBLElBTUFELEVBQUFDLEdBQUFoM0csS0FBQSxDQUFBNE4sRUFBQTRvRyxFQUFBL2pGLEVBQUFva0YsRUFBQSxLQVNBLElBQUFELEVBQUEsR0FBQSxPQTdJQSxTQUFBSyxHQUVBLE1BQUE5OUUsRUFBQSxHQUVBLElBQUEsSUFBQXg0QixFQUFBLEVBQUFDLEVBQUFxMkcsRUFBQXAyRyxPQUFBRixFQUFBQyxFQUFBRCxJQUFBLENBRUEsTUFBQTYxRyxFQUFBUyxFQUFBdDJHLEdBRUE4MUcsRUFBQSxJQUFBcnRDLEdBQ0FxdEMsRUFBQWwwQyxPQUFBaTBDLEVBQUFqMEMsT0FFQXBwQyxFQUFBbjVCLEtBQUF5MkcsRUFFQSxDQUVBLE9BQUF0OUUsQ0FFQSxDQTRIQSs5RSxDQUFBdkIsR0FHQSxHQUFBaUIsRUFBQS8xRyxPQUFBLEVBQUEsQ0FFQSxJQUFBczJHLEdBQUEsRUFDQUMsRUFBQSxFQUVBLElBQUEsSUFBQUMsRUFBQSxFQUFBQyxFQUFBVixFQUFBLzFHLE9BQUF3MkcsRUFBQUMsRUFBQUQsSUFFQVYsRUFBQVUsR0FBQSxHQUlBLElBQUEsSUFBQUEsRUFBQSxFQUFBQyxFQUFBVixFQUFBLzFHLE9BQUF3MkcsRUFBQUMsRUFBQUQsSUFBQSxDQUVBLE1BQUFFLEVBQUFSLEVBQUFNLEdBRUEsSUFBQSxJQUFBRyxFQUFBLEVBQUFBLEVBQUFELEVBQUExMkcsT0FBQTIyRyxJQUFBLENBRUEsTUFBQUMsRUFBQUYsRUFBQUMsR0FDQSxJQUFBRSxHQUFBLEVBRUEsSUFBQSxJQUFBQyxFQUFBLEVBQUFBLEVBQUFmLEVBQUEvMUcsT0FBQTgyRyxJQUVBNUIsRUFBQTBCLEVBQUFobEYsRUFBQW1rRixFQUFBZSxHQUFBbGxGLEtBRUE0a0YsSUFBQU0sR0FBQVAsSUFFQU0sR0FFQUEsR0FBQSxFQUNBZixFQUFBZ0IsR0FBQTMzRyxLQUFBeTNHLElBSUFOLEdBQUEsR0FRQU8sR0FFQWYsRUFBQVUsR0FBQXIzRyxLQUFBeTNHLEVBSUEsQ0FFQSxDQUVBTCxFQUFBLElBQUEsSUFBQUQsSUFFQUosRUFBQUosRUFJQSxDQUlBLElBQUEsSUFBQWgyRyxFQUFBLEVBQUFxYixFQUFBNDZGLEVBQUEvMUcsT0FBQUYsRUFBQXFiLEVBQUFyYixJQUFBLENBRUE4MUcsRUFBQUcsRUFBQWoyRyxHQUFBK0QsRUFDQXkwQixFQUFBbjVCLEtBQUF5MkcsR0FDQUssRUFBQUMsRUFBQXAyRyxHQUVBLElBQUEsSUFBQXNvQixFQUFBLEVBQUF3dkIsRUFBQXErRCxFQUFBajJHLE9BQUFvb0IsRUFBQXd2QixFQUFBeHZCLElBRUF3dEYsRUFBQXB0QyxNQUFBcnBFLEtBQUE4MkcsRUFBQTd0RixHQUFBcmIsRUFJQSxDQUlBLE9BQUF1ckIsQ0FFQSxFQ2pXQSxNQUFBeStFLFdBQUFyNEcsR0FRQSxXQUFBaUQsQ0FBQW9qQixFQUFBaXlGLEVBQUEsTUFFQTFnRyxRQU9BdlgsS0FBQWdtQixPQUFBQSxFQVFBaG1CLEtBQUFpNEcsV0FBQUEsRUFRQWo0RyxLQUFBaVMsU0FBQSxFQVFBalMsS0FBQWs0RyxPQUFBLEVBT0FsNEcsS0FBQWdaLEtBQUEsQ0FBQSxFQVFBaFosS0FBQW00RyxhQUFBLENBQUF4bEgsS0FBQSxLQUFBQyxPQUFBLEtBQUFDLE1BQUEsTUFRQW1OLEtBQUFvNEcsUUFBQSxDQUFBQyxJQUFBLEtBQUFDLElBQUEsS0FFQSxDQVFBLE9BQUF4eUQsQ0FBQWxzQixRQUVBNzVCLElBQUE2NUIsR0FPQSxPQUFBNTVCLEtBQUFpNEcsWUFBQWo0RyxLQUFBbW1ELGFBRUFubUQsS0FBQWk0RyxXQUFBcitFLEdBUEFoekIsUUFBQUMsS0FBQSxxREFTQSxDQUtBLFVBQUFzL0MsR0FBQSxDQU1BLE9BQUFsdEMsR0FBQSxDQVFBLE1BQUFxRyxHQUFBLEVDZkEsU0FBQWk1RixHQUFBdHhHLEVBQUFDLEVBQUFrUSxFQUFBdlgsR0FFQSxNQUFBMjRHLEVBcUdBLFNBQUEzNEcsR0FFQSxPQUFBQSxHQUVBLEtBQUE1SCxHQUNBLEtBQUFDLEdBQ0EsTUFBQSxDQUFBb3lGLFdBQUEsRUFBQTkvQyxXQUFBLEdBQ0EsS0FBQXB5QyxHQUNBLEtBQUFELEdBQ0EsS0FBQUssR0FDQSxNQUFBLENBQUE4eEYsV0FBQSxFQUFBOS9DLFdBQUEsR0FDQSxLQUFBL3hDLEdBQ0EsS0FBQUMsR0FDQSxNQUFBLENBQUE0eEYsV0FBQSxFQUFBOS9DLFdBQUEsR0FDQSxLQUFBbHlDLEdBQ0EsS0FBQUQsR0FDQSxLQUFBRSxHQUNBLE1BQUEsQ0FBQSt4RixXQUFBLEVBQUE5L0MsV0FBQSxHQUNBLEtBQUE1eEMsR0FDQSxNQUFBLENBQUEweEYsV0FBQSxFQUFBOS9DLFdBQUEsR0FJQSxNQUFBLElBQUFwbkMsTUFBQSx3QkFBQXZELEtBRUEsQ0E5SEE0NEcsQ0FBQTU0RyxHQUVBLE9BQUF1WCxHQUdBLEtwTittQlksS29ON21CWixLcE51b0JZLEtvTnRvQlosT0FBQW5RLEVBQUFDLEVBQ0EsS3BOOG9CWSxLb043b0JaLE9BQUFELEVBQUFDLEVBQUEsRUFDQSxLQUFBOU4sR0FFQSxLQUFBQyxHQUNBLE9BQUE0TixFQUFBQyxFQUFBc3hHLEVBQUFodUUsV0FBQWd1RSxFQUFBbHVCLFdBQ0EsS3BOaXJCWSxLb04vcUJaLEtwTnVyQlksS29OdHJCWixPQUFBcmpGLEVBQUFDLEVBQUEsRUFBQXN4RyxFQUFBaHVFLFdBQUFndUUsRUFBQWx1QixXQUNBLEtwTnltQlksS29OeG1CWixPQUFBcmpGLEVBQUFDLEVBQUEsRUFBQXN4RyxFQUFBaHVFLFdBQUFndUUsRUFBQWx1QixXQUNBLEtBQUF2eEYsR0FFQSxLcE5pc0JZLEtvTmhzQlosT0FBQWtPLEVBQUFDLEVBQUEsRUFBQXN4RyxFQUFBaHVFLFdBQUFndUUsRUFBQWx1QixXQUdBLEtwTnFzQlksTW9OcHNCWixLcE40c0JZLE1vTjNzQlosT0FBQWhwRixLQUFBbUQsT0FBQXdDLEVBQUEsR0FBQSxHQUFBM0YsS0FBQW1ELE9BQUF5QyxFQUFBLEdBQUEsR0FBQSxFQUNBLEtwTmt0QlksTW9OanRCWixLcE4wdEJZLE1vTnp0QlosT0FBQTVGLEtBQUFtRCxPQUFBd0MsRUFBQSxHQUFBLEdBQUEzRixLQUFBbUQsT0FBQXlDLEVBQUEsR0FBQSxHQUFBLEdBR0EsS3BOc3VCWSxNb05ydUJaLEtwTnF2QlksTW9OcHZCWixPQUFBNUYsS0FBQWEsSUFBQThFLEVBQUEsSUFBQTNGLEtBQUFhLElBQUErRSxFQUFBLEdBQUEsRUFDQSxLcE4ydEJZLE1vTjF0QlosS3BOMHVCWSxNb056dUJaLE9BQUE1RixLQUFBYSxJQUFBOEUsRUFBQSxHQUFBM0YsS0FBQWEsSUFBQStFLEVBQUEsR0FBQSxFQUdBLEtwTnN2QlksTW9OcnZCWixLcE42dkJZLE1vTjV2QlosT0FBQTVGLEtBQUFtRCxPQUFBd0MsRUFBQSxHQUFBLEdBQUEzRixLQUFBbUQsT0FBQXlDLEVBQUEsR0FBQSxHQUFBLEVBQ0EsS3BObXdCWSxNb04vdkJaLEtwTnV3QlksTW9OdHdCWixPQUFBNUYsS0FBQW1ELE9BQUF3QyxFQUFBLEdBQUEsR0FBQTNGLEtBQUFtRCxPQUFBeUMsRUFBQSxHQUFBLEdBQUEsR0FDQSxLcE42d0JZLE1vTjV3QlosT0FBQTVGLEtBQUFtRCxPQUFBd0MsRUFBQSxHQUFBLEdBQUEzRixLQUFBbUQsT0FBQXlDLEVBQUEsR0FBQSxHQUFBLEdBQ0EsS3BObXhCWSxNb05seEJaLE9BQUE1RixLQUFBbUQsT0FBQXdDLEVBQUEsR0FBQSxHQUFBM0YsS0FBQW1ELE9BQUF5QyxFQUFBLEdBQUEsR0FBQSxHQUNBLEtwTnl4QlksTW9OeHhCWixPQUFBNUYsS0FBQW1ELE9BQUF3QyxFQUFBLEdBQUEsR0FBQTNGLEtBQUFtRCxPQUFBeUMsRUFBQSxHQUFBLEdBQUEsR0FDQSxLcE4reEJZLE1vTjl4QlosT0FBQTVGLEtBQUFtRCxPQUFBd0MsRUFBQSxHQUFBLEdBQUEzRixLQUFBbUQsT0FBQXlDLEVBQUEsR0FBQSxHQUFBLEdBQ0EsS3BOcXlCWSxNb05weUJaLE9BQUE1RixLQUFBbUQsT0FBQXdDLEVBQUEsR0FBQSxHQUFBM0YsS0FBQW1ELE9BQUF5QyxFQUFBLEdBQUEsR0FBQSxHQUNBLEtwTjJ5QlksTW9OMXlCWixPQUFBNUYsS0FBQW1ELE9BQUF3QyxFQUFBLEdBQUEsR0FBQTNGLEtBQUFtRCxPQUFBeUMsRUFBQSxHQUFBLEdBQUEsR0FDQSxLcE5pekJZLE1vTmh6QlosT0FBQTVGLEtBQUFtRCxPQUFBd0MsRUFBQSxHQUFBLEdBQUEzRixLQUFBbUQsT0FBQXlDLEVBQUEsR0FBQSxHQUFBLEdBQ0EsS3BOdXpCWSxNb050ekJaLE9BQUE1RixLQUFBbUQsT0FBQXdDLEVBQUEsR0FBQSxJQUFBM0YsS0FBQW1ELE9BQUF5QyxFQUFBLEdBQUEsR0FBQSxHQUNBLEtwTjZ6QlksTW9ONXpCWixPQUFBNUYsS0FBQW1ELE9BQUF3QyxFQUFBLEdBQUEsSUFBQTNGLEtBQUFtRCxPQUFBeUMsRUFBQSxHQUFBLEdBQUEsR0FDQSxLcE5tMEJZLE1vTmwwQlosT0FBQTVGLEtBQUFtRCxPQUFBd0MsRUFBQSxHQUFBLElBQUEzRixLQUFBbUQsT0FBQXlDLEVBQUEsR0FBQSxHQUFBLEdBQ0EsS3BOeTBCWSxNb054MEJaLE9BQUE1RixLQUFBbUQsT0FBQXdDLEVBQUEsR0FBQSxJQUFBM0YsS0FBQW1ELE9BQUF5QyxFQUFBLEdBQUEsSUFBQSxHQUNBLEtwTiswQlksTW9OOTBCWixPQUFBNUYsS0FBQW1ELE9BQUF3QyxFQUFBLElBQUEsSUFBQTNGLEtBQUFtRCxPQUFBeUMsRUFBQSxHQUFBLElBQUEsR0FDQSxLcE5xMUJZLE1vTnAxQlosT0FBQTVGLEtBQUFtRCxPQUFBd0MsRUFBQSxJQUFBLElBQUEzRixLQUFBbUQsT0FBQXlDLEVBQUEsSUFBQSxJQUFBLEdBR0EsS3BOeTFCWSxNb054MUJaLEtwTmcyQlksTW9OLzFCWixLcE51MkJZLE1vTnQyQlosT0FBQTVGLEtBQUFpRSxLQUFBMEIsRUFBQSxHQUFBM0YsS0FBQWlFLEtBQUEyQixFQUFBLEdBQUEsR0FHQSxLcE4yMkJZLE1vTjEyQlosS3BOazNCWSxNb05qM0JaLE9BQUE1RixLQUFBaUUsS0FBQTBCLEVBQUEsR0FBQTNGLEtBQUFpRSxLQUFBMkIsRUFBQSxHQUFBLEVBQ0EsS3BOdzNCWSxNb052M0JaLEtwTiszQlksTW9OOTNCWixPQUFBNUYsS0FBQWlFLEtBQUEwQixFQUFBLEdBQUEzRixLQUFBaUUsS0FBQTJCLEVBQUEsR0FBQSxHQUlBLE1BQUEsSUFBQTlELE1BQ0EsK0NBQUFnVSxZQUdBLENBa0NBLE1BQUFzaEcsR0FXQSxjQUFBQyxDQUFBMzhGLEVBQUFvbEMsR0FFQSxPQTVPQSxTQUFBcGxDLEVBQUFvbEMsR0FFQSxNQUFBdzNELEVBQUE1OEYsRUFBQXhILE9BQUF3SCxFQUFBeEgsTUFBQXZOLE1BQUErVSxFQUFBeEgsTUFBQXZOLE1BQUErVSxFQUFBeEgsTUFBQXROLE9BQUEsRUFvQkEsT0FsQkEweEcsRUFBQXgzRCxHQUVBcGxDLEVBQUFuRSxPQUFBclYsRUFBQSxFQUNBd1osRUFBQW5FLE9BQUFwVixFQUFBbTJHLEVBQUF4M0QsRUFFQXBsQyxFQUFBeFIsT0FBQWhJLEVBQUEsRUFDQXdaLEVBQUF4UixPQUFBL0gsR0FBQSxFQUFBdVosRUFBQW5FLE9BQUFwVixHQUFBLElBSUF1WixFQUFBbkUsT0FBQXJWLEVBQUE0K0MsRUFBQXczRCxFQUNBNThGLEVBQUFuRSxPQUFBcFYsRUFBQSxFQUVBdVosRUFBQXhSLE9BQUFoSSxHQUFBLEVBQUF3WixFQUFBbkUsT0FBQXJWLEdBQUEsRUFDQXdaLEVBQUF4UixPQUFBL0gsRUFBQSxHQUlBdVosQ0FFQSxDQW9OQTI4RixDQUFBMzhGLEVBQUFvbEMsRUFFQSxDQVdBLFlBQUF5M0QsQ0FBQTc4RixFQUFBb2xDLEdBRUEsT0F4TkEsU0FBQXBsQyxFQUFBb2xDLEdBRUEsTUFBQXczRCxFQUFBNThGLEVBQUF4SCxPQUFBd0gsRUFBQXhILE1BQUF2TixNQUFBK1UsRUFBQXhILE1BQUF2TixNQUFBK1UsRUFBQXhILE1BQUF0TixPQUFBLEVBb0JBLE9BbEJBMHhHLEVBQUF4M0QsR0FFQXBsQyxFQUFBbkUsT0FBQXJWLEVBQUE0K0MsRUFBQXczRCxFQUNBNThGLEVBQUFuRSxPQUFBcFYsRUFBQSxFQUVBdVosRUFBQXhSLE9BQUFoSSxHQUFBLEVBQUF3WixFQUFBbkUsT0FBQXJWLEdBQUEsRUFDQXdaLEVBQUF4UixPQUFBL0gsRUFBQSxJQUlBdVosRUFBQW5FLE9BQUFyVixFQUFBLEVBQ0F3WixFQUFBbkUsT0FBQXBWLEVBQUFtMkcsRUFBQXgzRCxFQUVBcGxDLEVBQUF4UixPQUFBaEksRUFBQSxFQUNBd1osRUFBQXhSLE9BQUEvSCxHQUFBLEVBQUF1WixFQUFBbkUsT0FBQXBWLEdBQUEsR0FJQXVaLENBRUEsQ0FnTUE2OEYsQ0FBQTc4RixFQUFBb2xDLEVBRUEsQ0FRQSxXQUFBNk4sQ0FBQWp6QyxHQUVBLE9BcE1BLFNBQUFBLEdBUUEsT0FOQUEsRUFBQW5FLE9BQUFyVixFQUFBLEVBQ0F3WixFQUFBbkUsT0FBQXBWLEVBQUEsRUFFQXVaLEVBQUF4UixPQUFBaEksRUFBQSxFQUNBd1osRUFBQXhSLE9BQUEvSCxFQUFBLEVBRUF1WixDQUVBLENBMExBaXpDLENBQUFqekMsRUFFQSxDQVdBLG9CQUFBdThGLENBQUF0eEcsRUFBQUMsRUFBQWtRLEVBQUF2WCxHQUVBLE9BQUEwNEcsR0FBQXR4RyxFQUFBQyxFQUFBa1EsRUFBQXZYLEVBRUEsRUNsSUEsb0JBQUEwb0Qsb0JBRUFBLG1CQUFBN25ELGNBQUEsSUFBQThuRCxZQUFBLFdBQUEsQ0FBQUMsT0FBQSxDQUNBcXdELFNBQUFybUgsTUFLQSxvQkFBQWdpRyxTQUVBQSxPQUFBc2tCLFVBRUFueUcsUUFBQUMsS0FBQSwyREFJQTR0RixPQUFBc2tCLFVBQUF0bUgifQ== diff --git a/build/three.module.js b/build/three.module.js index d82fcb727553d1..28717151f85faf 100644 --- a/build/three.module.js +++ b/build/three.module.js @@ -17988,3 +17988,4 @@ class WebGLRenderer { } export { ACESFilmicToneMapping, AddEquation, AddOperation, AdditiveBlending, AgXToneMapping, AlphaFormat, AlwaysCompare, AlwaysDepth, ArrayCamera, BackSide, BoxGeometry, BufferAttribute, BufferGeometry, ByteType, CineonToneMapping, ClampToEdgeWrapping, Color, ColorManagement, ConstantAlphaFactor, ConstantColorFactor, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeUVReflectionMapping, CullFaceBack, CullFaceFront, CullFaceNone, CustomBlending, CustomToneMapping, Data3DTexture, DataArrayTexture, DepthFormat, DepthStencilFormat, DepthTexture, DoubleSide, DstAlphaFactor, DstColorFactor, EqualCompare, EqualDepth, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, FloatType, FrontSide, Frustum, GLSL3, GreaterCompare, GreaterDepth, GreaterEqualCompare, GreaterEqualDepth, HalfFloatType, IntType, Layers, LessCompare, LessDepth, LessEqualCompare, LessEqualDepth, LinearFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, LinearSRGBColorSpace, LinearToneMapping, LinearTransfer, LuminanceAlphaFormat, LuminanceFormat, Matrix3, Matrix4, MaxEquation, Mesh, MeshBasicMaterial, MeshDepthMaterial, MeshDistanceMaterial, MinEquation, MirroredRepeatWrapping, MixOperation, MultiplyBlending, MultiplyOperation, NearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NeutralToneMapping, NeverCompare, NeverDepth, NoBlending, NoColorSpace, NoToneMapping, NormalBlending, NotEqualCompare, NotEqualDepth, ObjectSpaceNormalMap, OneFactor, OneMinusConstantAlphaFactor, OneMinusConstantColorFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OrthographicCamera, PCFShadowMap, PCFSoftShadowMap, PMREMGenerator, PerspectiveCamera, Plane, PlaneGeometry, RED_GREEN_RGTC2_Format, RED_RGTC1_Format, REVISION, RGBADepthPacking, RGBAFormat, RGBAIntegerFormat, RGBA_ASTC_10x10_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_BPTC_Format, RGBA_ETC2_EAC_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGBFormat, RGB_BPTC_SIGNED_Format, RGB_BPTC_UNSIGNED_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGB_S3TC_DXT1_Format, RGFormat, RGIntegerFormat, RedFormat, RedIntegerFormat, ReinhardToneMapping, RepeatWrapping, ReverseSubtractEquation, SIGNED_RED_GREEN_RGTC2_Format, SIGNED_RED_RGTC1_Format, SRGBColorSpace, SRGBTransfer, ShaderChunk, ShaderLib, ShaderMaterial, ShortType, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, SubtractEquation, SubtractiveBlending, TangentSpaceNormalMap, Texture, Uint16BufferAttribute, Uint32BufferAttribute, UniformsLib, UniformsUtils, UnsignedByteType, UnsignedInt248Type, UnsignedInt5999Type, UnsignedIntType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShortType, VSMShadowMap, Vector2, Vector3, Vector4, WebGLCoordinateSystem, WebGLCubeRenderTarget, WebGLRenderTarget, WebGLRenderer, WebGLUtils, WebXRController, ZeroFactor, createCanvasElement }; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhyZWUubW9kdWxlLmpzIiwic291cmNlcyI6WyIuLi9zcmMvcmVuZGVyZXJzL3dlYmdsL1dlYkdMQW5pbWF0aW9uLmpzIiwiLi4vc3JjL3JlbmRlcmVycy93ZWJnbC9XZWJHTEF0dHJpYnV0ZXMuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvYWxwaGFoYXNoX2ZyYWdtZW50Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvYWxwaGFoYXNoX3BhcnNfZnJhZ21lbnQuZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9hbHBoYW1hcF9mcmFnbWVudC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL2FscGhhbWFwX3BhcnNfZnJhZ21lbnQuZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9hbHBoYXRlc3RfZnJhZ21lbnQuZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9hbHBoYXRlc3RfcGFyc19mcmFnbWVudC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL2FvbWFwX2ZyYWdtZW50Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvYW9tYXBfcGFyc19mcmFnbWVudC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL2JhdGNoaW5nX3BhcnNfdmVydGV4Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvYmF0Y2hpbmdfdmVydGV4Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvYmVnaW5fdmVydGV4Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvYmVnaW5ub3JtYWxfdmVydGV4Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvYnNkZnMuZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9pcmlkZXNjZW5jZV9mcmFnbWVudC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL2J1bXBtYXBfcGFyc19mcmFnbWVudC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL2NsaXBwaW5nX3BsYW5lc19mcmFnbWVudC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL2NsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvY2xpcHBpbmdfcGxhbmVzX3ZlcnRleC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL2NvbG9yX2ZyYWdtZW50Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvY29sb3JfcGFyc19mcmFnbWVudC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL2NvbG9yX3BhcnNfdmVydGV4Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvY29sb3JfdmVydGV4Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvY29tbW9uLmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvY3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvZGVmYXVsdG5vcm1hbF92ZXJ0ZXguZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9kaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXguZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9kaXNwbGFjZW1lbnRtYXBfdmVydGV4Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvZW1pc3NpdmVtYXBfZnJhZ21lbnQuZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9lbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvY29sb3JzcGFjZV9mcmFnbWVudC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL2NvbG9yc3BhY2VfcGFyc19mcmFnbWVudC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL2Vudm1hcF9mcmFnbWVudC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL2Vudm1hcF9jb21tb25fcGFyc19mcmFnbWVudC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL2Vudm1hcF9wYXJzX2ZyYWdtZW50Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvZW52bWFwX3BhcnNfdmVydGV4Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvZW52bWFwX3ZlcnRleC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL2ZvZ192ZXJ0ZXguZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9mb2dfcGFyc192ZXJ0ZXguZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9mb2dfZnJhZ21lbnQuZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9mb2dfcGFyc19mcmFnbWVudC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL2dyYWRpZW50bWFwX3BhcnNfZnJhZ21lbnQuZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9saWdodG1hcF9wYXJzX2ZyYWdtZW50Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvbGlnaHRzX2xhbWJlcnRfZnJhZ21lbnQuZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9saWdodHNfbGFtYmVydF9wYXJzX2ZyYWdtZW50Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvbGlnaHRzX3BhcnNfYmVnaW4uZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9lbnZtYXBfcGh5c2ljYWxfcGFyc19mcmFnbWVudC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL2xpZ2h0c190b29uX2ZyYWdtZW50Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvbGlnaHRzX3Rvb25fcGFyc19mcmFnbWVudC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL2xpZ2h0c19waG9uZ19mcmFnbWVudC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL2xpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvbGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvbGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQuZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9saWdodHNfZnJhZ21lbnRfYmVnaW4uZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9saWdodHNfZnJhZ21lbnRfbWFwcy5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL2xpZ2h0c19mcmFnbWVudF9lbmQuZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9sb2dkZXB0aGJ1Zl9mcmFnbWVudC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL2xvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQuZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9sb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL2xvZ2RlcHRoYnVmX3ZlcnRleC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL21hcF9mcmFnbWVudC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL21hcF9wYXJzX2ZyYWdtZW50Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvbWFwX3BhcnRpY2xlX2ZyYWdtZW50Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvbWFwX3BhcnRpY2xlX3BhcnNfZnJhZ21lbnQuZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9tZXRhbG5lc3NtYXBfZnJhZ21lbnQuZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9tZXRhbG5lc3NtYXBfcGFyc19mcmFnbWVudC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL21vcnBoaW5zdGFuY2VfdmVydGV4Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvbW9ycGhjb2xvcl92ZXJ0ZXguZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9tb3JwaG5vcm1hbF92ZXJ0ZXguZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9tb3JwaHRhcmdldF9wYXJzX3ZlcnRleC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL21vcnBodGFyZ2V0X3ZlcnRleC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL25vcm1hbF9mcmFnbWVudF9iZWdpbi5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL25vcm1hbF9mcmFnbWVudF9tYXBzLmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvbm9ybWFsX3BhcnNfZnJhZ21lbnQuZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9ub3JtYWxfcGFyc192ZXJ0ZXguZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9ub3JtYWxfdmVydGV4Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvbm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQuZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9jbGVhcmNvYXRfbm9ybWFsX2ZyYWdtZW50X2JlZ2luLmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvY2xlYXJjb2F0X25vcm1hbF9mcmFnbWVudF9tYXBzLmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvY2xlYXJjb2F0X3BhcnNfZnJhZ21lbnQuZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9pcmlkZXNjZW5jZV9wYXJzX2ZyYWdtZW50Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvb3BhcXVlX2ZyYWdtZW50Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvcGFja2luZy5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL3ByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQuZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9wcm9qZWN0X3ZlcnRleC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL2RpdGhlcmluZ19mcmFnbWVudC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL2RpdGhlcmluZ19wYXJzX2ZyYWdtZW50Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvcm91Z2huZXNzbWFwX2ZyYWdtZW50Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvcm91Z2huZXNzbWFwX3BhcnNfZnJhZ21lbnQuZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9zaGFkb3dtYXBfcGFyc19mcmFnbWVudC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL3NoYWRvd21hcF9wYXJzX3ZlcnRleC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL3NoYWRvd21hcF92ZXJ0ZXguZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9zaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQuZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9za2luYmFzZV92ZXJ0ZXguZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9za2lubmluZ19wYXJzX3ZlcnRleC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL3NraW5uaW5nX3ZlcnRleC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rL3NraW5ub3JtYWxfdmVydGV4Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvc3BlY3VsYXJtYXBfZnJhZ21lbnQuZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay9zcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvdG9uZW1hcHBpbmdfZnJhZ21lbnQuZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay90b25lbWFwcGluZ19wYXJzX2ZyYWdtZW50Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvdHJhbnNtaXNzaW9uX2ZyYWdtZW50Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvdHJhbnNtaXNzaW9uX3BhcnNfZnJhZ21lbnQuZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay91dl9wYXJzX2ZyYWdtZW50Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyQ2h1bmsvdXZfcGFyc192ZXJ0ZXguZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay91dl92ZXJ0ZXguZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJDaHVuay93b3JsZHBvc192ZXJ0ZXguZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJMaWIvYmFja2dyb3VuZC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckxpYi9iYWNrZ3JvdW5kQ3ViZS5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckxpYi9jdWJlLmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyTGliL2RlcHRoLmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyTGliL2Rpc3RhbmNlUkdCQS5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckxpYi9lcXVpcmVjdC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckxpYi9saW5lZGFzaGVkLmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyTGliL21lc2hiYXNpYy5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckxpYi9tZXNobGFtYmVydC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckxpYi9tZXNobWF0Y2FwLmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyTGliL21lc2hub3JtYWwuZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJMaWIvbWVzaHBob25nLmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyTGliL21lc2hwaHlzaWNhbC5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckxpYi9tZXNodG9vbi5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckxpYi9wb2ludHMuZ2xzbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvc2hhZGVycy9TaGFkZXJMaWIvc2hhZG93Lmdsc2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyTGliL3Nwcml0ZS5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckNodW5rLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1VuaWZvcm1zTGliLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9zaGFkZXJzL1NoYWRlckxpYi5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2ViZ2wvV2ViR0xCYWNrZ3JvdW5kLmpzIiwiLi4vc3JjL3JlbmRlcmVycy93ZWJnbC9XZWJHTEJpbmRpbmdTdGF0ZXMuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYmdsL1dlYkdMQnVmZmVyUmVuZGVyZXIuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYmdsL1dlYkdMQ2FwYWJpbGl0aWVzLmpzIiwiLi4vc3JjL3JlbmRlcmVycy93ZWJnbC9XZWJHTENsaXBwaW5nLmpzIiwiLi4vc3JjL3JlbmRlcmVycy93ZWJnbC9XZWJHTEN1YmVNYXBzLmpzIiwiLi4vc3JjL2V4dHJhcy9QTVJFTUdlbmVyYXRvci5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2ViZ2wvV2ViR0xDdWJlVVZNYXBzLmpzIiwiLi4vc3JjL3JlbmRlcmVycy93ZWJnbC9XZWJHTEV4dGVuc2lvbnMuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYmdsL1dlYkdMR2VvbWV0cmllcy5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2ViZ2wvV2ViR0xJbmRleGVkQnVmZmVyUmVuZGVyZXIuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYmdsL1dlYkdMSW5mby5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2ViZ2wvV2ViR0xNb3JwaHRhcmdldHMuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYmdsL1dlYkdMT2JqZWN0cy5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2ViZ2wvV2ViR0xVbmlmb3Jtcy5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2ViZ2wvV2ViR0xTaGFkZXIuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYmdsL1dlYkdMUHJvZ3JhbS5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2ViZ2wvV2ViR0xTaGFkZXJDYWNoZS5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2ViZ2wvV2ViR0xQcm9ncmFtcy5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2ViZ2wvV2ViR0xQcm9wZXJ0aWVzLmpzIiwiLi4vc3JjL3JlbmRlcmVycy93ZWJnbC9XZWJHTFJlbmRlckxpc3RzLmpzIiwiLi4vc3JjL3JlbmRlcmVycy93ZWJnbC9XZWJHTExpZ2h0cy5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2ViZ2wvV2ViR0xSZW5kZXJTdGF0ZXMuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3NoYWRlcnMvU2hhZGVyTGliL3ZzbS5nbHNsLmpzIiwiLi4vc3JjL3JlbmRlcmVycy93ZWJnbC9XZWJHTFNoYWRvd01hcC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2ViZ2wvV2ViR0xTdGF0ZS5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2ViZ2wvV2ViR0xUZXh0dXJlcy5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2ViZ2wvV2ViR0xVdGlscy5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2VieHIvV2ViWFJEZXB0aFNlbnNpbmcuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYnhyL1dlYlhSTWFuYWdlci5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2ViZ2wvV2ViR0xNYXRlcmlhbHMuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYmdsL1dlYkdMVW5pZm9ybXNHcm91cHMuanMiLCIuLi9zcmMvcmVuZGVyZXJzL1dlYkdMUmVuZGVyZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gV2ViR0xBbmltYXRpb24oKSB7XHJcblxyXG5cdGxldCBjb250ZXh0ID0gbnVsbDtcclxuXHRsZXQgaXNBbmltYXRpbmcgPSBmYWxzZTtcclxuXHRsZXQgYW5pbWF0aW9uTG9vcCA9IG51bGw7XHJcblx0bGV0IHJlcXVlc3RJZCA9IG51bGw7XHJcblxyXG5cdGZ1bmN0aW9uIG9uQW5pbWF0aW9uRnJhbWUoIHRpbWUsIGZyYW1lICkge1xyXG5cclxuXHRcdGFuaW1hdGlvbkxvb3AoIHRpbWUsIGZyYW1lICk7XHJcblxyXG5cdFx0cmVxdWVzdElkID0gY29udGV4dC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIG9uQW5pbWF0aW9uRnJhbWUgKTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4ge1xyXG5cclxuXHRcdHN0YXJ0OiBmdW5jdGlvbiAoKSB7XHJcblxyXG5cdFx0XHRpZiAoIGlzQW5pbWF0aW5nID09PSB0cnVlICkgcmV0dXJuO1xyXG5cdFx0XHRpZiAoIGFuaW1hdGlvbkxvb3AgPT09IG51bGwgKSByZXR1cm47XHJcblxyXG5cdFx0XHRyZXF1ZXN0SWQgPSBjb250ZXh0LnJlcXVlc3RBbmltYXRpb25GcmFtZSggb25BbmltYXRpb25GcmFtZSApO1xyXG5cclxuXHRcdFx0aXNBbmltYXRpbmcgPSB0cnVlO1xyXG5cclxuXHRcdH0sXHJcblxyXG5cdFx0c3RvcDogZnVuY3Rpb24gKCkge1xyXG5cclxuXHRcdFx0Y29udGV4dC5jYW5jZWxBbmltYXRpb25GcmFtZSggcmVxdWVzdElkICk7XHJcblxyXG5cdFx0XHRpc0FuaW1hdGluZyA9IGZhbHNlO1xyXG5cclxuXHRcdH0sXHJcblxyXG5cdFx0c2V0QW5pbWF0aW9uTG9vcDogZnVuY3Rpb24gKCBjYWxsYmFjayApIHtcclxuXHJcblx0XHRcdGFuaW1hdGlvbkxvb3AgPSBjYWxsYmFjaztcclxuXHJcblx0XHR9LFxyXG5cclxuXHRcdHNldENvbnRleHQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XHJcblxyXG5cdFx0XHRjb250ZXh0ID0gdmFsdWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9O1xyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgV2ViR0xBbmltYXRpb24gfTtcclxuIiwiZnVuY3Rpb24gV2ViR0xBdHRyaWJ1dGVzKCBnbCApIHtcclxuXHJcblx0Y29uc3QgYnVmZmVycyA9IG5ldyBXZWFrTWFwKCk7XHJcblxyXG5cdGZ1bmN0aW9uIGNyZWF0ZUJ1ZmZlciggYXR0cmlidXRlLCBidWZmZXJUeXBlICkge1xyXG5cclxuXHRcdGNvbnN0IGFycmF5ID0gYXR0cmlidXRlLmFycmF5O1xyXG5cdFx0Y29uc3QgdXNhZ2UgPSBhdHRyaWJ1dGUudXNhZ2U7XHJcblx0XHRjb25zdCBzaXplID0gYXJyYXkuYnl0ZUxlbmd0aDtcclxuXHJcblx0XHRjb25zdCBidWZmZXIgPSBnbC5jcmVhdGVCdWZmZXIoKTtcclxuXHJcblx0XHRnbC5iaW5kQnVmZmVyKCBidWZmZXJUeXBlLCBidWZmZXIgKTtcclxuXHRcdGdsLmJ1ZmZlckRhdGEoIGJ1ZmZlclR5cGUsIGFycmF5LCB1c2FnZSApO1xyXG5cclxuXHRcdGF0dHJpYnV0ZS5vblVwbG9hZENhbGxiYWNrKCk7XHJcblxyXG5cdFx0bGV0IHR5cGU7XHJcblxyXG5cdFx0aWYgKCBhcnJheSBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSApIHtcclxuXHJcblx0XHRcdHR5cGUgPSBnbC5GTE9BVDtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIFVpbnQxNkFycmF5ICkge1xyXG5cclxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUuaXNGbG9hdDE2QnVmZmVyQXR0cmlidXRlICkge1xyXG5cclxuXHRcdFx0XHR0eXBlID0gZ2wuSEFMRl9GTE9BVDtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHR5cGUgPSBnbC5VTlNJR05FRF9TSE9SVDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIEludDE2QXJyYXkgKSB7XHJcblxyXG5cdFx0XHR0eXBlID0gZ2wuU0hPUlQ7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBVaW50MzJBcnJheSApIHtcclxuXHJcblx0XHRcdHR5cGUgPSBnbC5VTlNJR05FRF9JTlQ7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBJbnQzMkFycmF5ICkge1xyXG5cclxuXHRcdFx0dHlwZSA9IGdsLklOVDtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIEludDhBcnJheSApIHtcclxuXHJcblx0XHRcdHR5cGUgPSBnbC5CWVRFO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGFycmF5IGluc3RhbmNlb2YgVWludDhBcnJheSApIHtcclxuXHJcblx0XHRcdHR5cGUgPSBnbC5VTlNJR05FRF9CWVRFO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGFycmF5IGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXkgKSB7XHJcblxyXG5cdFx0XHR0eXBlID0gZ2wuVU5TSUdORURfQllURTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuV2ViR0xBdHRyaWJ1dGVzOiBVbnN1cHBvcnRlZCBidWZmZXIgZGF0YSBmb3JtYXQ6ICcgKyBhcnJheSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHRidWZmZXI6IGJ1ZmZlcixcclxuXHRcdFx0dHlwZTogdHlwZSxcclxuXHRcdFx0Ynl0ZXNQZXJFbGVtZW50OiBhcnJheS5CWVRFU19QRVJfRUxFTUVOVCxcclxuXHRcdFx0dmVyc2lvbjogYXR0cmlidXRlLnZlcnNpb24sXHJcblx0XHRcdHNpemU6IHNpemVcclxuXHRcdH07XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gdXBkYXRlQnVmZmVyKCBidWZmZXIsIGF0dHJpYnV0ZSwgYnVmZmVyVHlwZSApIHtcclxuXHJcblx0XHRjb25zdCBhcnJheSA9IGF0dHJpYnV0ZS5hcnJheTtcclxuXHRcdGNvbnN0IHVwZGF0ZVJhbmdlcyA9IGF0dHJpYnV0ZS51cGRhdGVSYW5nZXM7XHJcblxyXG5cdFx0Z2wuYmluZEJ1ZmZlciggYnVmZmVyVHlwZSwgYnVmZmVyICk7XHJcblxyXG5cdFx0aWYgKCB1cGRhdGVSYW5nZXMubGVuZ3RoID09PSAwICkge1xyXG5cclxuXHRcdFx0Ly8gTm90IHVzaW5nIHVwZGF0ZSByYW5nZXNcclxuXHRcdFx0Z2wuYnVmZmVyU3ViRGF0YSggYnVmZmVyVHlwZSwgMCwgYXJyYXkgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Ly8gQmVmb3JlIGFwcGx5aW5nIHVwZGF0ZSByYW5nZXMsIHdlIG1lcmdlIGFueSBhZGphY2VudCAvIG92ZXJsYXBwaW5nXHJcblx0XHRcdC8vIHJhbmdlcyB0byByZWR1Y2UgbG9hZCBvbiBgZ2wuYnVmZmVyU3ViRGF0YWAuIEVtcGlyaWNhbGx5LCB0aGlzIGhhcyBsZWRcclxuXHRcdFx0Ly8gdG8gcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzIGZvciBhcHBsaWNhdGlvbnMgd2hpY2ggbWFrZSBoZWF2eSB1c2Ugb2ZcclxuXHRcdFx0Ly8gdXBkYXRlIHJhbmdlcy4gTGlrZWx5IGR1ZSB0byBHUFUgY29tbWFuZCBvdmVyaGVhZC5cclxuXHRcdFx0Ly9cclxuXHRcdFx0Ly8gTm90ZSB0aGF0IHRvIHJlZHVjZSBnYXJiYWdlIGNvbGxlY3Rpb24gYmV0d2VlbiBmcmFtZXMsIHdlIG1lcmdlIHRoZVxyXG5cdFx0XHQvLyB1cGRhdGUgcmFuZ2VzIGluLXBsYWNlLiBUaGlzIGlzIHNhZmUgYmVjYXVzZSB0aGlzIG1ldGhvZCB3aWxsIGNsZWFyIHRoZVxyXG5cdFx0XHQvLyB1cGRhdGUgcmFuZ2VzIG9uY2UgdXBkYXRlZC5cclxuXHJcblx0XHRcdHVwZGF0ZVJhbmdlcy5zb3J0KCAoIGEsIGIgKSA9PiBhLnN0YXJ0IC0gYi5zdGFydCApO1xyXG5cclxuXHRcdFx0Ly8gVG8gbWVyZ2UgdGhlIHVwZGF0ZSByYW5nZXMgaW4tcGxhY2UsIHdlIHdvcmsgZnJvbSBsZWZ0IHRvIHJpZ2h0IGluIHRoZVxyXG5cdFx0XHQvLyBleGlzdGluZyB1cGRhdGVSYW5nZXMgYXJyYXksIG1lcmdpbmcgcmFuZ2VzLiBUaGlzIG1heSByZXN1bHQgaW4gYSBmaW5hbFxyXG5cdFx0XHQvLyBhcnJheSB3aGljaCBpcyBzbWFsbGVyIHRoYW4gdGhlIG9yaWdpbmFsLiBUaGlzIGluZGV4IHRyYWNrcyB0aGUgbGFzdFxyXG5cdFx0XHQvLyBpbmRleCByZXByZXNlbnRpbmcgYSBtZXJnZWQgcmFuZ2UsIGFueSBkYXRhIGFmdGVyIHRoaXMgaW5kZXggY2FuIGJlXHJcblx0XHRcdC8vIHRyaW1tZWQgb25jZSB0aGUgbWVyZ2UgYWxnb3JpdGhtIGlzIGNvbXBsZXRlZC5cclxuXHRcdFx0bGV0IG1lcmdlSW5kZXggPSAwO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAxOyBpIDwgdXBkYXRlUmFuZ2VzLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgcHJldmlvdXNSYW5nZSA9IHVwZGF0ZVJhbmdlc1sgbWVyZ2VJbmRleCBdO1xyXG5cdFx0XHRcdGNvbnN0IHJhbmdlID0gdXBkYXRlUmFuZ2VzWyBpIF07XHJcblxyXG5cdFx0XHRcdC8vIFdlIGFkZCBvbmUgaGVyZSB0byBtZXJnZSBhZGphY2VudCByYW5nZXMuIFRoaXMgaXMgc2FmZSBiZWNhdXNlIHJhbmdlc1xyXG5cdFx0XHRcdC8vIG9wZXJhdGUgb3ZlciBwb3NpdGl2ZSBpbnRlZ2Vycy5cclxuXHRcdFx0XHRpZiAoIHJhbmdlLnN0YXJ0IDw9IHByZXZpb3VzUmFuZ2Uuc3RhcnQgKyBwcmV2aW91c1JhbmdlLmNvdW50ICsgMSApIHtcclxuXHJcblx0XHRcdFx0XHRwcmV2aW91c1JhbmdlLmNvdW50ID0gTWF0aC5tYXgoXHJcblx0XHRcdFx0XHRcdHByZXZpb3VzUmFuZ2UuY291bnQsXHJcblx0XHRcdFx0XHRcdHJhbmdlLnN0YXJ0ICsgcmFuZ2UuY291bnQgLSBwcmV2aW91c1JhbmdlLnN0YXJ0XHJcblx0XHRcdFx0XHQpO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdCsrIG1lcmdlSW5kZXg7XHJcblx0XHRcdFx0XHR1cGRhdGVSYW5nZXNbIG1lcmdlSW5kZXggXSA9IHJhbmdlO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBUcmltIHRoZSBhcnJheSB0byBvbmx5IGNvbnRhaW4gdGhlIG1lcmdlZCByYW5nZXMuXHJcblx0XHRcdHVwZGF0ZVJhbmdlcy5sZW5ndGggPSBtZXJnZUluZGV4ICsgMTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHVwZGF0ZVJhbmdlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCByYW5nZSA9IHVwZGF0ZVJhbmdlc1sgaSBdO1xyXG5cclxuXHRcdFx0XHRnbC5idWZmZXJTdWJEYXRhKCBidWZmZXJUeXBlLCByYW5nZS5zdGFydCAqIGFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULFxyXG5cdFx0XHRcdFx0YXJyYXksIHJhbmdlLnN0YXJ0LCByYW5nZS5jb3VudCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0YXR0cmlidXRlLmNsZWFyVXBkYXRlUmFuZ2VzKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGF0dHJpYnV0ZS5vblVwbG9hZENhbGxiYWNrKCk7XHJcblxyXG5cdH1cclxuXHJcblx0Ly9cclxuXHJcblx0ZnVuY3Rpb24gZ2V0KCBhdHRyaWJ1dGUgKSB7XHJcblxyXG5cdFx0aWYgKCBhdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZS5kYXRhO1xyXG5cclxuXHRcdHJldHVybiBidWZmZXJzLmdldCggYXR0cmlidXRlICk7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gcmVtb3ZlKCBhdHRyaWJ1dGUgKSB7XHJcblxyXG5cdFx0aWYgKCBhdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZS5kYXRhO1xyXG5cclxuXHRcdGNvbnN0IGRhdGEgPSBidWZmZXJzLmdldCggYXR0cmlidXRlICk7XHJcblxyXG5cdFx0aWYgKCBkYXRhICkge1xyXG5cclxuXHRcdFx0Z2wuZGVsZXRlQnVmZmVyKCBkYXRhLmJ1ZmZlciApO1xyXG5cclxuXHRcdFx0YnVmZmVycy5kZWxldGUoIGF0dHJpYnV0ZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiB1cGRhdGUoIGF0dHJpYnV0ZSwgYnVmZmVyVHlwZSApIHtcclxuXHJcblx0XHRpZiAoIGF0dHJpYnV0ZS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlICkgYXR0cmlidXRlID0gYXR0cmlidXRlLmRhdGE7XHJcblxyXG5cdFx0aWYgKCBhdHRyaWJ1dGUuaXNHTEJ1ZmZlckF0dHJpYnV0ZSApIHtcclxuXHJcblx0XHRcdGNvbnN0IGNhY2hlZCA9IGJ1ZmZlcnMuZ2V0KCBhdHRyaWJ1dGUgKTtcclxuXHJcblx0XHRcdGlmICggISBjYWNoZWQgfHwgY2FjaGVkLnZlcnNpb24gPCBhdHRyaWJ1dGUudmVyc2lvbiApIHtcclxuXHJcblx0XHRcdFx0YnVmZmVycy5zZXQoIGF0dHJpYnV0ZSwge1xyXG5cdFx0XHRcdFx0YnVmZmVyOiBhdHRyaWJ1dGUuYnVmZmVyLFxyXG5cdFx0XHRcdFx0dHlwZTogYXR0cmlidXRlLnR5cGUsXHJcblx0XHRcdFx0XHRieXRlc1BlckVsZW1lbnQ6IGF0dHJpYnV0ZS5lbGVtZW50U2l6ZSxcclxuXHRcdFx0XHRcdHZlcnNpb246IGF0dHJpYnV0ZS52ZXJzaW9uXHJcblx0XHRcdFx0fSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBkYXRhID0gYnVmZmVycy5nZXQoIGF0dHJpYnV0ZSApO1xyXG5cclxuXHRcdGlmICggZGF0YSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0YnVmZmVycy5zZXQoIGF0dHJpYnV0ZSwgY3JlYXRlQnVmZmVyKCBhdHRyaWJ1dGUsIGJ1ZmZlclR5cGUgKSApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGRhdGEudmVyc2lvbiA8IGF0dHJpYnV0ZS52ZXJzaW9uICkge1xyXG5cclxuXHRcdFx0aWYgKCBkYXRhLnNpemUgIT09IGF0dHJpYnV0ZS5hcnJheS5ieXRlTGVuZ3RoICkge1xyXG5cclxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5XZWJHTEF0dHJpYnV0ZXM6IFRoZSBzaXplIG9mIHRoZSBidWZmZXIgYXR0cmlidXRlXFwncyBhcnJheSBidWZmZXIgZG9lcyBub3QgbWF0Y2ggdGhlIG9yaWdpbmFsIHNpemUuIFJlc2l6aW5nIGJ1ZmZlciBhdHRyaWJ1dGVzIGlzIG5vdCBzdXBwb3J0ZWQuJyApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dXBkYXRlQnVmZmVyKCBkYXRhLmJ1ZmZlciwgYXR0cmlidXRlLCBidWZmZXJUeXBlICk7XHJcblxyXG5cdFx0XHRkYXRhLnZlcnNpb24gPSBhdHRyaWJ1dGUudmVyc2lvbjtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIHtcclxuXHJcblx0XHRnZXQ6IGdldCxcclxuXHRcdHJlbW92ZTogcmVtb3ZlLFxyXG5cdFx0dXBkYXRlOiB1cGRhdGVcclxuXHJcblx0fTtcclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBXZWJHTEF0dHJpYnV0ZXMgfTtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmZGVmIFVTRV9BTFBIQUhBU0hcclxuXHJcblx0aWYgKCBkaWZmdXNlQ29sb3IuYSA8IGdldEFscGhhSGFzaFRocmVzaG9sZCggdlBvc2l0aW9uICkgKSBkaXNjYXJkO1xyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbiNpZmRlZiBVU0VfQUxQSEFIQVNIXHJcblxyXG5cdC8qKlxyXG5cdCAqIFNlZTogaHR0cHM6Ly9jYXN1YWwtZWZmZWN0cy5jb20vcmVzZWFyY2gvV3ltYW4yMDE3SGFzaGVkL2luZGV4Lmh0bWxcclxuXHQgKi9cclxuXHJcblx0Y29uc3QgZmxvYXQgQUxQSEFfSEFTSF9TQ0FMRSA9IDAuMDU7IC8vIERlcml2ZWQgZnJvbSB0cmlhbHMgb25seSwgYW5kIG1heSBiZSBjaGFuZ2VkLlxyXG5cclxuXHRmbG9hdCBoYXNoMkQoIHZlYzIgdmFsdWUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIGZyYWN0KCAxLjBlNCAqIHNpbiggMTcuMCAqIHZhbHVlLnggKyAwLjEgKiB2YWx1ZS55ICkgKiAoIDAuMSArIGFicyggc2luKCAxMy4wICogdmFsdWUueSArIHZhbHVlLnggKSApICkgKTtcclxuXHJcblx0fVxyXG5cclxuXHRmbG9hdCBoYXNoM0QoIHZlYzMgdmFsdWUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIGhhc2gyRCggdmVjMiggaGFzaDJEKCB2YWx1ZS54eSApLCB2YWx1ZS56ICkgKTtcclxuXHJcblx0fVxyXG5cclxuXHRmbG9hdCBnZXRBbHBoYUhhc2hUaHJlc2hvbGQoIHZlYzMgcG9zaXRpb24gKSB7XHJcblxyXG5cdFx0Ly8gRmluZCB0aGUgZGlzY3JldGl6ZWQgZGVyaXZhdGl2ZXMgb2Ygb3VyIGNvb3JkaW5hdGVzXHJcblx0XHRmbG9hdCBtYXhEZXJpdiA9IG1heChcclxuXHRcdFx0bGVuZ3RoKCBkRmR4KCBwb3NpdGlvbi54eXogKSApLFxyXG5cdFx0XHRsZW5ndGgoIGRGZHkoIHBvc2l0aW9uLnh5eiApIClcclxuXHRcdCk7XHJcblx0XHRmbG9hdCBwaXhTY2FsZSA9IDEuMCAvICggQUxQSEFfSEFTSF9TQ0FMRSAqIG1heERlcml2ICk7XHJcblxyXG5cdFx0Ly8gRmluZCB0d28gbmVhcmVzdCBsb2ctZGlzY3JldGl6ZWQgbm9pc2Ugc2NhbGVzXHJcblx0XHR2ZWMyIHBpeFNjYWxlcyA9IHZlYzIoXHJcblx0XHRcdGV4cDIoIGZsb29yKCBsb2cyKCBwaXhTY2FsZSApICkgKSxcclxuXHRcdFx0ZXhwMiggY2VpbCggbG9nMiggcGl4U2NhbGUgKSApIClcclxuXHRcdCk7XHJcblxyXG5cdFx0Ly8gQ29tcHV0ZSBhbHBoYSB0aHJlc2hvbGRzIGF0IG91ciB0d28gbm9pc2Ugc2NhbGVzXHJcblx0XHR2ZWMyIGFscGhhID0gdmVjMihcclxuXHRcdFx0aGFzaDNEKCBmbG9vciggcGl4U2NhbGVzLnggKiBwb3NpdGlvbi54eXogKSApLFxyXG5cdFx0XHRoYXNoM0QoIGZsb29yKCBwaXhTY2FsZXMueSAqIHBvc2l0aW9uLnh5eiApIClcclxuXHRcdCk7XHJcblxyXG5cdFx0Ly8gRmFjdG9yIHRvIGludGVycG9sYXRlIGxlcnAgd2l0aFxyXG5cdFx0ZmxvYXQgbGVycEZhY3RvciA9IGZyYWN0KCBsb2cyKCBwaXhTY2FsZSApICk7XHJcblxyXG5cdFx0Ly8gSW50ZXJwb2xhdGUgYWxwaGEgdGhyZXNob2xkIGZyb20gbm9pc2UgYXQgdHdvIHNjYWxlc1xyXG5cdFx0ZmxvYXQgeCA9ICggMS4wIC0gbGVycEZhY3RvciApICogYWxwaGEueCArIGxlcnBGYWN0b3IgKiBhbHBoYS55O1xyXG5cclxuXHRcdC8vIFBhc3MgaW50byBDREYgdG8gY29tcHV0ZSB1bmlmb3JtbHkgZGlzdHJpYiB0aHJlc2hvbGRcclxuXHRcdGZsb2F0IGEgPSBtaW4oIGxlcnBGYWN0b3IsIDEuMCAtIGxlcnBGYWN0b3IgKTtcclxuXHRcdHZlYzMgY2FzZXMgPSB2ZWMzKFxyXG5cdFx0XHR4ICogeCAvICggMi4wICogYSAqICggMS4wIC0gYSApICksXHJcblx0XHRcdCggeCAtIDAuNSAqIGEgKSAvICggMS4wIC0gYSApLFxyXG5cdFx0XHQxLjAgLSAoICggMS4wIC0geCApICogKCAxLjAgLSB4ICkgLyAoIDIuMCAqIGEgKiAoIDEuMCAtIGEgKSApIClcclxuXHRcdCk7XHJcblxyXG5cdFx0Ly8gRmluZCBvdXIgZmluYWwsIHVuaWZvcm1seSBkaXN0cmlidXRlZCBhbHBoYSB0aHJlc2hvbGQgKM6xz4QpXHJcblx0XHRmbG9hdCB0aHJlc2hvbGQgPSAoIHggPCAoIDEuMCAtIGEgKSApXHJcblx0XHRcdD8gKCAoIHggPCBhICkgPyBjYXNlcy54IDogY2FzZXMueSApXHJcblx0XHRcdDogY2FzZXMuejtcclxuXHJcblx0XHQvLyBBdm9pZHMgzrHPhCA9PSAwLiBDb3VsZCBhbHNvIGRvIM6xz4QgPTEtzrHPhFxyXG5cdFx0cmV0dXJuIGNsYW1wKCB0aHJlc2hvbGQgLCAxLjBlLTYsIDEuMCApO1xyXG5cclxuXHR9XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmZGVmIFVTRV9BTFBIQU1BUFxyXG5cclxuXHRkaWZmdXNlQ29sb3IuYSAqPSB0ZXh0dXJlMkQoIGFscGhhTWFwLCB2QWxwaGFNYXBVdiApLmc7XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmZGVmIFVTRV9BTFBIQU1BUFxyXG5cclxuXHR1bmlmb3JtIHNhbXBsZXIyRCBhbHBoYU1hcDtcclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jaWZkZWYgVVNFX0FMUEhBVEVTVFxyXG5cclxuXHQjaWZkZWYgQUxQSEFfVE9fQ09WRVJBR0VcclxuXHJcblx0ZGlmZnVzZUNvbG9yLmEgPSBzbW9vdGhzdGVwKCBhbHBoYVRlc3QsIGFscGhhVGVzdCArIGZ3aWR0aCggZGlmZnVzZUNvbG9yLmEgKSwgZGlmZnVzZUNvbG9yLmEgKTtcclxuXHRpZiAoIGRpZmZ1c2VDb2xvci5hID09IDAuMCApIGRpc2NhcmQ7XHJcblxyXG5cdCNlbHNlXHJcblxyXG5cdGlmICggZGlmZnVzZUNvbG9yLmEgPCBhbHBoYVRlc3QgKSBkaXNjYXJkO1xyXG5cclxuXHQjZW5kaWZcclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jaWZkZWYgVVNFX0FMUEhBVEVTVFxyXG5cdHVuaWZvcm0gZmxvYXQgYWxwaGFUZXN0O1xyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmZGVmIFVTRV9BT01BUFxyXG5cclxuXHQvLyByZWFkcyBjaGFubmVsIFIsIGNvbXBhdGlibGUgd2l0aCBhIGNvbWJpbmVkIE9jY2x1c2lvblJvdWdobmVzc01ldGFsbGljIChSR0IpIHRleHR1cmVcclxuXHRmbG9hdCBhbWJpZW50T2NjbHVzaW9uID0gKCB0ZXh0dXJlMkQoIGFvTWFwLCB2QW9NYXBVdiApLnIgLSAxLjAgKSAqIGFvTWFwSW50ZW5zaXR5ICsgMS4wO1xyXG5cclxuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKj0gYW1iaWVudE9jY2x1c2lvbjtcclxuXHJcblx0I2lmIGRlZmluZWQoIFVTRV9DTEVBUkNPQVQgKSBcclxuXHRcdGNsZWFyY29hdFNwZWN1bGFySW5kaXJlY3QgKj0gYW1iaWVudE9jY2x1c2lvbjtcclxuXHQjZW5kaWZcclxuXHJcblx0I2lmIGRlZmluZWQoIFVTRV9TSEVFTiApIFxyXG5cdFx0c2hlZW5TcGVjdWxhckluZGlyZWN0ICo9IGFtYmllbnRPY2NsdXNpb247XHJcblx0I2VuZGlmXHJcblxyXG5cdCNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgJiYgZGVmaW5lZCggU1RBTkRBUkQgKVxyXG5cclxuXHRcdGZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnlOb3JtYWwsIGdlb21ldHJ5Vmlld0RpciApICk7XHJcblxyXG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciAqPSBjb21wdXRlU3BlY3VsYXJPY2NsdXNpb24oIGRvdE5WLCBhbWJpZW50T2NjbHVzaW9uLCBtYXRlcmlhbC5yb3VnaG5lc3MgKTtcclxuXHJcblx0I2VuZGlmXHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmZGVmIFVTRV9BT01BUFxyXG5cclxuXHR1bmlmb3JtIHNhbXBsZXIyRCBhb01hcDtcclxuXHR1bmlmb3JtIGZsb2F0IGFvTWFwSW50ZW5zaXR5O1xyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbiNpZmRlZiBVU0VfQkFUQ0hJTkdcclxuXHQjaWYgISBkZWZpbmVkKCBHTF9BTkdMRV9tdWx0aV9kcmF3IClcclxuXHQjZGVmaW5lIGdsX0RyYXdJRCBfZ2xfRHJhd0lEXHJcblx0dW5pZm9ybSBpbnQgX2dsX0RyYXdJRDtcclxuXHQjZW5kaWZcclxuXHJcblx0dW5pZm9ybSBoaWdocCBzYW1wbGVyMkQgYmF0Y2hpbmdUZXh0dXJlO1xyXG5cdHVuaWZvcm0gaGlnaHAgdXNhbXBsZXIyRCBiYXRjaGluZ0lkVGV4dHVyZTtcclxuXHRtYXQ0IGdldEJhdGNoaW5nTWF0cml4KCBjb25zdCBpbiBmbG9hdCBpICkge1xyXG5cclxuXHRcdGludCBzaXplID0gdGV4dHVyZVNpemUoIGJhdGNoaW5nVGV4dHVyZSwgMCApLng7XHJcblx0XHRpbnQgaiA9IGludCggaSApICogNDtcclxuXHRcdGludCB4ID0gaiAlIHNpemU7XHJcblx0XHRpbnQgeSA9IGogLyBzaXplO1xyXG5cdFx0dmVjNCB2MSA9IHRleGVsRmV0Y2goIGJhdGNoaW5nVGV4dHVyZSwgaXZlYzIoIHgsIHkgKSwgMCApO1xyXG5cdFx0dmVjNCB2MiA9IHRleGVsRmV0Y2goIGJhdGNoaW5nVGV4dHVyZSwgaXZlYzIoIHggKyAxLCB5ICksIDAgKTtcclxuXHRcdHZlYzQgdjMgPSB0ZXhlbEZldGNoKCBiYXRjaGluZ1RleHR1cmUsIGl2ZWMyKCB4ICsgMiwgeSApLCAwICk7XHJcblx0XHR2ZWM0IHY0ID0gdGV4ZWxGZXRjaCggYmF0Y2hpbmdUZXh0dXJlLCBpdmVjMiggeCArIDMsIHkgKSwgMCApO1xyXG5cdFx0cmV0dXJuIG1hdDQoIHYxLCB2MiwgdjMsIHY0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0ZmxvYXQgZ2V0SW5kaXJlY3RJbmRleCggY29uc3QgaW4gaW50IGkgKSB7XHJcblxyXG5cdFx0aW50IHNpemUgPSB0ZXh0dXJlU2l6ZSggYmF0Y2hpbmdJZFRleHR1cmUsIDAgKS54O1xyXG5cdFx0aW50IHggPSBpICUgc2l6ZTtcclxuXHRcdGludCB5ID0gaSAvIHNpemU7XHJcblx0XHRyZXR1cm4gZmxvYXQoIHRleGVsRmV0Y2goIGJhdGNoaW5nSWRUZXh0dXJlLCBpdmVjMiggeCwgeSApLCAwICkuciApO1xyXG5cclxuXHR9XHJcblxyXG4jZW5kaWZcclxuXHJcbiNpZmRlZiBVU0VfQkFUQ0hJTkdfQ09MT1JcclxuXHJcblx0dW5pZm9ybSBzYW1wbGVyMkQgYmF0Y2hpbmdDb2xvclRleHR1cmU7XHJcblx0dmVjMyBnZXRCYXRjaGluZ0NvbG9yKCBjb25zdCBpbiBmbG9hdCBpICkge1xyXG5cclxuXHRcdGludCBzaXplID0gdGV4dHVyZVNpemUoIGJhdGNoaW5nQ29sb3JUZXh0dXJlLCAwICkueDtcclxuXHRcdGludCBqID0gaW50KCBpICk7XHJcblx0XHRpbnQgeCA9IGogJSBzaXplO1xyXG5cdFx0aW50IHkgPSBqIC8gc2l6ZTtcclxuXHRcdHJldHVybiB0ZXhlbEZldGNoKCBiYXRjaGluZ0NvbG9yVGV4dHVyZSwgaXZlYzIoIHgsIHkgKSwgMCApLnJnYjtcclxuXHJcblx0fVxyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbiNpZmRlZiBVU0VfQkFUQ0hJTkdcclxuXHRtYXQ0IGJhdGNoaW5nTWF0cml4ID0gZ2V0QmF0Y2hpbmdNYXRyaXgoIGdldEluZGlyZWN0SW5kZXgoIGdsX0RyYXdJRCApICk7XHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG52ZWMzIHRyYW5zZm9ybWVkID0gdmVjMyggcG9zaXRpb24gKTtcclxuXHJcbiNpZmRlZiBVU0VfQUxQSEFIQVNIXHJcblxyXG5cdHZQb3NpdGlvbiA9IHZlYzMoIHBvc2l0aW9uICk7XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxudmVjMyBvYmplY3ROb3JtYWwgPSB2ZWMzKCBub3JtYWwgKTtcclxuXHJcbiNpZmRlZiBVU0VfVEFOR0VOVFxyXG5cclxuXHR2ZWMzIG9iamVjdFRhbmdlbnQgPSB2ZWMzKCB0YW5nZW50Lnh5eiApO1xyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcblxyXG5mbG9hdCBHX0JsaW5uUGhvbmdfSW1wbGljaXQoIC8qIGNvbnN0IGluIGZsb2F0IGRvdE5MLCBjb25zdCBpbiBmbG9hdCBkb3ROViAqLyApIHtcclxuXHJcblx0Ly8gZ2VvbWV0cnkgdGVybSBpcyAobiBkb3QgbCkobiBkb3QgdikgLyA0KG4gZG90IGwpKG4gZG90IHYpXHJcblx0cmV0dXJuIDAuMjU7XHJcblxyXG59XHJcblxyXG5mbG9hdCBEX0JsaW5uUGhvbmcoIGNvbnN0IGluIGZsb2F0IHNoaW5pbmVzcywgY29uc3QgaW4gZmxvYXQgZG90TkggKSB7XHJcblxyXG5cdHJldHVybiBSRUNJUFJPQ0FMX1BJICogKCBzaGluaW5lc3MgKiAwLjUgKyAxLjAgKSAqIHBvdyggZG90TkgsIHNoaW5pbmVzcyApO1xyXG5cclxufVxyXG5cclxudmVjMyBCUkRGX0JsaW5uUGhvbmcoIGNvbnN0IGluIHZlYzMgbGlnaHREaXIsIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgc2hpbmluZXNzICkge1xyXG5cclxuXHR2ZWMzIGhhbGZEaXIgPSBub3JtYWxpemUoIGxpZ2h0RGlyICsgdmlld0RpciApO1xyXG5cclxuXHRmbG9hdCBkb3ROSCA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgaGFsZkRpciApICk7XHJcblx0ZmxvYXQgZG90VkggPSBzYXR1cmF0ZSggZG90KCB2aWV3RGlyLCBoYWxmRGlyICkgKTtcclxuXHJcblx0dmVjMyBGID0gRl9TY2hsaWNrKCBzcGVjdWxhckNvbG9yLCAxLjAsIGRvdFZIICk7XHJcblxyXG5cdGZsb2F0IEcgPSBHX0JsaW5uUGhvbmdfSW1wbGljaXQoIC8qIGRvdE5MLCBkb3ROViAqLyApO1xyXG5cclxuXHRmbG9hdCBEID0gRF9CbGlublBob25nKCBzaGluaW5lc3MsIGRvdE5IICk7XHJcblxyXG5cdHJldHVybiBGICogKCBHICogRCApO1xyXG5cclxufSAvLyB2YWxpZGF0ZWRcclxuXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcblxyXG4jaWZkZWYgVVNFX0lSSURFU0NFTkNFXHJcblxyXG5cdC8vIFhZWiB0byBsaW5lYXItc1JHQiBjb2xvciBzcGFjZVxyXG5cdGNvbnN0IG1hdDMgWFlaX1RPX1JFQzcwOSA9IG1hdDMoXHJcblx0XHQgMy4yNDA0NTQyLCAtMC45NjkyNjYwLCAgMC4wNTU2NDM0LFxyXG5cdFx0LTEuNTM3MTM4NSwgIDEuODc2MDEwOCwgLTAuMjA0MDI1OSxcclxuXHRcdC0wLjQ5ODUzMTQsICAwLjA0MTU1NjAsICAxLjA1NzIyNTJcclxuXHQpO1xyXG5cclxuXHQvLyBBc3N1bWUgYWlyIGludGVyZmFjZSBmb3IgdG9wXHJcblx0Ly8gTm90ZTogV2UgZG9uJ3QgaGFuZGxlIHRoZSBjYXNlIGZyZXNuZWwwID09IDFcclxuXHR2ZWMzIEZyZXNuZWwwVG9Jb3IoIHZlYzMgZnJlc25lbDAgKSB7XHJcblxyXG5cdFx0dmVjMyBzcXJ0RjAgPSBzcXJ0KCBmcmVzbmVsMCApO1xyXG5cdFx0cmV0dXJuICggdmVjMyggMS4wICkgKyBzcXJ0RjAgKSAvICggdmVjMyggMS4wICkgLSBzcXJ0RjAgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvLyBDb252ZXJzaW9uIEZPL0lPUlxyXG5cdHZlYzMgSW9yVG9GcmVzbmVsMCggdmVjMyB0cmFuc21pdHRlZElvciwgZmxvYXQgaW5jaWRlbnRJb3IgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHBvdzIoICggdHJhbnNtaXR0ZWRJb3IgLSB2ZWMzKCBpbmNpZGVudElvciApICkgLyAoIHRyYW5zbWl0dGVkSW9yICsgdmVjMyggaW5jaWRlbnRJb3IgKSApICk7XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gaW9yIGlzIGEgdmFsdWUgYmV0d2VlbiAxLjAgYW5kIDMuMC4gMS4wIGlzIGFpciBpbnRlcmZhY2VcclxuXHRmbG9hdCBJb3JUb0ZyZXNuZWwwKCBmbG9hdCB0cmFuc21pdHRlZElvciwgZmxvYXQgaW5jaWRlbnRJb3IgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHBvdzIoICggdHJhbnNtaXR0ZWRJb3IgLSBpbmNpZGVudElvciApIC8gKCB0cmFuc21pdHRlZElvciArIGluY2lkZW50SW9yICkpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vIEZyZXNuZWwgZXF1YXRpb25zIGZvciBkaWVsZWN0cmljL2RpZWxlY3RyaWMgaW50ZXJmYWNlcy5cclxuXHQvLyBSZWY6IGh0dHBzOi8vYmVsY291ci5naXRodWIuaW8vYmxvZy9yZXNlYXJjaC8yMDE3LzA1LzAxL2JyZGYtdGhpbi1maWxtLmh0bWxcclxuXHQvLyBFdmFsdWF0aW9uIFhZWiBzZW5zaXRpdml0eSBjdXJ2ZXMgaW4gRm91cmllciBzcGFjZVxyXG5cdHZlYzMgZXZhbFNlbnNpdGl2aXR5KCBmbG9hdCBPUEQsIHZlYzMgc2hpZnQgKSB7XHJcblxyXG5cdFx0ZmxvYXQgcGhhc2UgPSAyLjAgKiBQSSAqIE9QRCAqIDEuMGUtOTtcclxuXHRcdHZlYzMgdmFsID0gdmVjMyggNS40ODU2ZS0xMywgNC40MjAxZS0xMywgNS4yNDgxZS0xMyApO1xyXG5cdFx0dmVjMyBwb3MgPSB2ZWMzKCAxLjY4MTBlKzA2LCAxLjc5NTNlKzA2LCAyLjIwODRlKzA2ICk7XHJcblx0XHR2ZWMzIHZhciA9IHZlYzMoIDQuMzI3OGUrMDksIDkuMzA0NmUrMDksIDYuNjEyMWUrMDkgKTtcclxuXHJcblx0XHR2ZWMzIHh5eiA9IHZhbCAqIHNxcnQoIDIuMCAqIFBJICogdmFyICkgKiBjb3MoIHBvcyAqIHBoYXNlICsgc2hpZnQgKSAqIGV4cCggLSBwb3cyKCBwaGFzZSApICogdmFyICk7XHJcblx0XHR4eXoueCArPSA5Ljc0NzBlLTE0ICogc3FydCggMi4wICogUEkgKiA0LjUyODJlKzA5ICkgKiBjb3MoIDIuMjM5OWUrMDYgKiBwaGFzZSArIHNoaWZ0WyAwIF0gKSAqIGV4cCggLSA0LjUyODJlKzA5ICogcG93MiggcGhhc2UgKSApO1xyXG5cdFx0eHl6IC89IDEuMDY4NWUtNztcclxuXHJcblx0XHR2ZWMzIHJnYiA9IFhZWl9UT19SRUM3MDkgKiB4eXo7XHJcblx0XHRyZXR1cm4gcmdiO1xyXG5cclxuXHR9XHJcblxyXG5cdHZlYzMgZXZhbElyaWRlc2NlbmNlKCBmbG9hdCBvdXRzaWRlSU9SLCBmbG9hdCBldGEyLCBmbG9hdCBjb3NUaGV0YTEsIGZsb2F0IHRoaW5GaWxtVGhpY2tuZXNzLCB2ZWMzIGJhc2VGMCApIHtcclxuXHJcblx0XHR2ZWMzIEk7XHJcblxyXG5cdFx0Ly8gRm9yY2UgaXJpZGVzY2VuY2VJT1IgLT4gb3V0c2lkZUlPUiB3aGVuIHRoaW5GaWxtVGhpY2tuZXNzIC0+IDAuMFxyXG5cdFx0ZmxvYXQgaXJpZGVzY2VuY2VJT1IgPSBtaXgoIG91dHNpZGVJT1IsIGV0YTIsIHNtb290aHN0ZXAoIDAuMCwgMC4wMywgdGhpbkZpbG1UaGlja25lc3MgKSApO1xyXG5cdFx0Ly8gRXZhbHVhdGUgdGhlIGNvc1RoZXRhIG9uIHRoZSBiYXNlIGxheWVyIChTbmVsbCBsYXcpXHJcblx0XHRmbG9hdCBzaW5UaGV0YTJTcSA9IHBvdzIoIG91dHNpZGVJT1IgLyBpcmlkZXNjZW5jZUlPUiApICogKCAxLjAgLSBwb3cyKCBjb3NUaGV0YTEgKSApO1xyXG5cclxuXHRcdC8vIEhhbmRsZSBUSVI6XHJcblx0XHRmbG9hdCBjb3NUaGV0YTJTcSA9IDEuMCAtIHNpblRoZXRhMlNxO1xyXG5cdFx0aWYgKCBjb3NUaGV0YTJTcSA8IDAuMCApIHtcclxuXHJcblx0XHRcdHJldHVybiB2ZWMzKCAxLjAgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0ZmxvYXQgY29zVGhldGEyID0gc3FydCggY29zVGhldGEyU3EgKTtcclxuXHJcblx0XHQvLyBGaXJzdCBpbnRlcmZhY2VcclxuXHRcdGZsb2F0IFIwID0gSW9yVG9GcmVzbmVsMCggaXJpZGVzY2VuY2VJT1IsIG91dHNpZGVJT1IgKTtcclxuXHRcdGZsb2F0IFIxMiA9IEZfU2NobGljayggUjAsIDEuMCwgY29zVGhldGExICk7XHJcblx0XHRmbG9hdCBUMTIxID0gMS4wIC0gUjEyO1xyXG5cdFx0ZmxvYXQgcGhpMTIgPSAwLjA7XHJcblx0XHRpZiAoIGlyaWRlc2NlbmNlSU9SIDwgb3V0c2lkZUlPUiApIHBoaTEyID0gUEk7XHJcblx0XHRmbG9hdCBwaGkyMSA9IFBJIC0gcGhpMTI7XHJcblxyXG5cdFx0Ly8gU2Vjb25kIGludGVyZmFjZVxyXG5cdFx0dmVjMyBiYXNlSU9SID0gRnJlc25lbDBUb0lvciggY2xhbXAoIGJhc2VGMCwgMC4wLCAwLjk5OTkgKSApOyAvLyBndWFyZCBhZ2FpbnN0IDEuMFxyXG5cdFx0dmVjMyBSMSA9IElvclRvRnJlc25lbDAoIGJhc2VJT1IsIGlyaWRlc2NlbmNlSU9SICk7XHJcblx0XHR2ZWMzIFIyMyA9IEZfU2NobGljayggUjEsIDEuMCwgY29zVGhldGEyICk7XHJcblx0XHR2ZWMzIHBoaTIzID0gdmVjMyggMC4wICk7XHJcblx0XHRpZiAoIGJhc2VJT1JbIDAgXSA8IGlyaWRlc2NlbmNlSU9SICkgcGhpMjNbIDAgXSA9IFBJO1xyXG5cdFx0aWYgKCBiYXNlSU9SWyAxIF0gPCBpcmlkZXNjZW5jZUlPUiApIHBoaTIzWyAxIF0gPSBQSTtcclxuXHRcdGlmICggYmFzZUlPUlsgMiBdIDwgaXJpZGVzY2VuY2VJT1IgKSBwaGkyM1sgMiBdID0gUEk7XHJcblxyXG5cdFx0Ly8gUGhhc2Ugc2hpZnRcclxuXHRcdGZsb2F0IE9QRCA9IDIuMCAqIGlyaWRlc2NlbmNlSU9SICogdGhpbkZpbG1UaGlja25lc3MgKiBjb3NUaGV0YTI7XHJcblx0XHR2ZWMzIHBoaSA9IHZlYzMoIHBoaTIxICkgKyBwaGkyMztcclxuXHJcblx0XHQvLyBDb21wb3VuZCB0ZXJtc1xyXG5cdFx0dmVjMyBSMTIzID0gY2xhbXAoIFIxMiAqIFIyMywgMWUtNSwgMC45OTk5ICk7XHJcblx0XHR2ZWMzIHIxMjMgPSBzcXJ0KCBSMTIzICk7XHJcblx0XHR2ZWMzIFJzID0gcG93MiggVDEyMSApICogUjIzIC8gKCB2ZWMzKCAxLjAgKSAtIFIxMjMgKTtcclxuXHJcblx0XHQvLyBSZWZsZWN0YW5jZSB0ZXJtIGZvciBtID0gMCAoREMgdGVybSBhbXBsaXR1ZGUpXHJcblx0XHR2ZWMzIEMwID0gUjEyICsgUnM7XHJcblx0XHRJID0gQzA7XHJcblxyXG5cdFx0Ly8gUmVmbGVjdGFuY2UgdGVybSBmb3IgbSA+IDAgKHBhaXJzIG9mIGRpcmFjcylcclxuXHRcdHZlYzMgQ20gPSBScyAtIFQxMjE7XHJcblx0XHRmb3IgKCBpbnQgbSA9IDE7IG0gPD0gMjsgKysgbSApIHtcclxuXHJcblx0XHRcdENtICo9IHIxMjM7XHJcblx0XHRcdHZlYzMgU20gPSAyLjAgKiBldmFsU2Vuc2l0aXZpdHkoIGZsb2F0KCBtICkgKiBPUEQsIGZsb2F0KCBtICkgKiBwaGkgKTtcclxuXHRcdFx0SSArPSBDbSAqIFNtO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBTaW5jZSBvdXQgb2YgZ2FtdXQgY29sb3JzIG1pZ2h0IGJlIHByb2R1Y2VkLCBuZWdhdGl2ZSBjb2xvciB2YWx1ZXMgYXJlIGNsYW1wZWQgdG8gMC5cclxuXHRcdHJldHVybiBtYXgoIEksIHZlYzMoIDAuMCApICk7XHJcblxyXG5cdH1cclxuXHJcbiNlbmRpZlxyXG5cclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmZGVmIFVTRV9CVU1QTUFQXHJcblxyXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGJ1bXBNYXA7XHJcblx0dW5pZm9ybSBmbG9hdCBidW1wU2NhbGU7XHJcblxyXG5cdC8vIEJ1bXAgTWFwcGluZyBVbnBhcmFtZXRyaXplZCBTdXJmYWNlcyBvbiB0aGUgR1BVIGJ5IE1vcnRlbiBTLiBNaWtrZWxzZW5cclxuXHQvLyBodHRwczovL21taWtrLmdpdGh1Yi5pby9wYXBlcnMzZC9tbV9zZmdyYWRfYnVtcC5wZGZcclxuXHJcblx0Ly8gRXZhbHVhdGUgdGhlIGRlcml2YXRpdmUgb2YgdGhlIGhlaWdodCB3LnIudC4gc2NyZWVuLXNwYWNlIHVzaW5nIGZvcndhcmQgZGlmZmVyZW5jaW5nIChsaXN0aW5nIDIpXHJcblxyXG5cdHZlYzIgZEhkeHlfZndkKCkge1xyXG5cclxuXHRcdHZlYzIgZFNUZHggPSBkRmR4KCB2QnVtcE1hcFV2ICk7XHJcblx0XHR2ZWMyIGRTVGR5ID0gZEZkeSggdkJ1bXBNYXBVdiApO1xyXG5cclxuXHRcdGZsb2F0IEhsbCA9IGJ1bXBTY2FsZSAqIHRleHR1cmUyRCggYnVtcE1hcCwgdkJ1bXBNYXBVdiApLng7XHJcblx0XHRmbG9hdCBkQnggPSBidW1wU2NhbGUgKiB0ZXh0dXJlMkQoIGJ1bXBNYXAsIHZCdW1wTWFwVXYgKyBkU1RkeCApLnggLSBIbGw7XHJcblx0XHRmbG9hdCBkQnkgPSBidW1wU2NhbGUgKiB0ZXh0dXJlMkQoIGJ1bXBNYXAsIHZCdW1wTWFwVXYgKyBkU1RkeSApLnggLSBIbGw7XHJcblxyXG5cdFx0cmV0dXJuIHZlYzIoIGRCeCwgZEJ5ICk7XHJcblxyXG5cdH1cclxuXHJcblx0dmVjMyBwZXJ0dXJiTm9ybWFsQXJiKCB2ZWMzIHN1cmZfcG9zLCB2ZWMzIHN1cmZfbm9ybSwgdmVjMiBkSGR4eSwgZmxvYXQgZmFjZURpcmVjdGlvbiApIHtcclxuXHJcblx0XHQvLyBub3JtYWxpemUgaXMgZG9uZSB0byBlbnN1cmUgdGhhdCB0aGUgYnVtcCBtYXAgbG9va3MgdGhlIHNhbWUgcmVnYXJkbGVzcyBvZiB0aGUgdGV4dHVyZSdzIHNjYWxlXHJcblx0XHR2ZWMzIHZTaWdtYVggPSBub3JtYWxpemUoIGRGZHgoIHN1cmZfcG9zLnh5eiApICk7XHJcblx0XHR2ZWMzIHZTaWdtYVkgPSBub3JtYWxpemUoIGRGZHkoIHN1cmZfcG9zLnh5eiApICk7XHJcblx0XHR2ZWMzIHZOID0gc3VyZl9ub3JtOyAvLyBub3JtYWxpemVkXHJcblxyXG5cdFx0dmVjMyBSMSA9IGNyb3NzKCB2U2lnbWFZLCB2TiApO1xyXG5cdFx0dmVjMyBSMiA9IGNyb3NzKCB2TiwgdlNpZ21hWCApO1xyXG5cclxuXHRcdGZsb2F0IGZEZXQgPSBkb3QoIHZTaWdtYVgsIFIxICkgKiBmYWNlRGlyZWN0aW9uO1xyXG5cclxuXHRcdHZlYzMgdkdyYWQgPSBzaWduKCBmRGV0ICkgKiAoIGRIZHh5LnggKiBSMSArIGRIZHh5LnkgKiBSMiApO1xyXG5cdFx0cmV0dXJuIG5vcm1hbGl6ZSggYWJzKCBmRGV0ICkgKiBzdXJmX25vcm0gLSB2R3JhZCApO1xyXG5cclxuXHR9XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmIE5VTV9DTElQUElOR19QTEFORVMgPiAwXHJcblxyXG5cdHZlYzQgcGxhbmU7XHJcblxyXG5cdCNpZmRlZiBBTFBIQV9UT19DT1ZFUkFHRVxyXG5cclxuXHRcdGZsb2F0IGRpc3RhbmNlVG9QbGFuZSwgZGlzdGFuY2VHcmFkaWVudDtcclxuXHRcdGZsb2F0IGNsaXBPcGFjaXR5ID0gMS4wO1xyXG5cclxuXHRcdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcclxuXHRcdGZvciAoIGludCBpID0gMDsgaSA8IFVOSU9OX0NMSVBQSU5HX1BMQU5FUzsgaSArKyApIHtcclxuXHJcblx0XHRcdHBsYW5lID0gY2xpcHBpbmdQbGFuZXNbIGkgXTtcclxuXHRcdFx0ZGlzdGFuY2VUb1BsYW5lID0gLSBkb3QoIHZDbGlwUG9zaXRpb24sIHBsYW5lLnh5eiApICsgcGxhbmUudztcclxuXHRcdFx0ZGlzdGFuY2VHcmFkaWVudCA9IGZ3aWR0aCggZGlzdGFuY2VUb1BsYW5lICkgLyAyLjA7XHJcblx0XHRcdGNsaXBPcGFjaXR5ICo9IHNtb290aHN0ZXAoIC0gZGlzdGFuY2VHcmFkaWVudCwgZGlzdGFuY2VHcmFkaWVudCwgZGlzdGFuY2VUb1BsYW5lICk7XHJcblxyXG5cdFx0XHRpZiAoIGNsaXBPcGFjaXR5ID09IDAuMCApIGRpc2NhcmQ7XHJcblxyXG5cdFx0fVxyXG5cdFx0I3ByYWdtYSB1bnJvbGxfbG9vcF9lbmRcclxuXHJcblx0XHQjaWYgVU5JT05fQ0xJUFBJTkdfUExBTkVTIDwgTlVNX0NMSVBQSU5HX1BMQU5FU1xyXG5cclxuXHRcdFx0ZmxvYXQgdW5pb25DbGlwT3BhY2l0eSA9IDEuMDtcclxuXHJcblx0XHRcdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcclxuXHRcdFx0Zm9yICggaW50IGkgPSBVTklPTl9DTElQUElOR19QTEFORVM7IGkgPCBOVU1fQ0xJUFBJTkdfUExBTkVTOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRwbGFuZSA9IGNsaXBwaW5nUGxhbmVzWyBpIF07XHJcblx0XHRcdFx0ZGlzdGFuY2VUb1BsYW5lID0gLSBkb3QoIHZDbGlwUG9zaXRpb24sIHBsYW5lLnh5eiApICsgcGxhbmUudztcclxuXHRcdFx0XHRkaXN0YW5jZUdyYWRpZW50ID0gZndpZHRoKCBkaXN0YW5jZVRvUGxhbmUgKSAvIDIuMDtcclxuXHRcdFx0XHR1bmlvbkNsaXBPcGFjaXR5ICo9IDEuMCAtIHNtb290aHN0ZXAoIC0gZGlzdGFuY2VHcmFkaWVudCwgZGlzdGFuY2VHcmFkaWVudCwgZGlzdGFuY2VUb1BsYW5lICk7XHJcblxyXG5cdFx0XHR9XHJcblx0XHRcdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXHJcblxyXG5cdFx0XHRjbGlwT3BhY2l0eSAqPSAxLjAgLSB1bmlvbkNsaXBPcGFjaXR5O1xyXG5cclxuXHRcdCNlbmRpZlxyXG5cclxuXHRcdGRpZmZ1c2VDb2xvci5hICo9IGNsaXBPcGFjaXR5O1xyXG5cclxuXHRcdGlmICggZGlmZnVzZUNvbG9yLmEgPT0gMC4wICkgZGlzY2FyZDtcclxuXHJcblx0I2Vsc2VcclxuXHJcblx0XHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XHJcblx0XHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBVTklPTl9DTElQUElOR19QTEFORVM7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRwbGFuZSA9IGNsaXBwaW5nUGxhbmVzWyBpIF07XHJcblx0XHRcdGlmICggZG90KCB2Q2xpcFBvc2l0aW9uLCBwbGFuZS54eXogKSA+IHBsYW5lLncgKSBkaXNjYXJkO1xyXG5cclxuXHRcdH1cclxuXHRcdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXHJcblxyXG5cdFx0I2lmIFVOSU9OX0NMSVBQSU5HX1BMQU5FUyA8IE5VTV9DTElQUElOR19QTEFORVNcclxuXHJcblx0XHRcdGJvb2wgY2xpcHBlZCA9IHRydWU7XHJcblxyXG5cdFx0XHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XHJcblx0XHRcdGZvciAoIGludCBpID0gVU5JT05fQ0xJUFBJTkdfUExBTkVTOyBpIDwgTlVNX0NMSVBQSU5HX1BMQU5FUzsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0cGxhbmUgPSBjbGlwcGluZ1BsYW5lc1sgaSBdO1xyXG5cdFx0XHRcdGNsaXBwZWQgPSAoIGRvdCggdkNsaXBQb3NpdGlvbiwgcGxhbmUueHl6ICkgPiBwbGFuZS53ICkgJiYgY2xpcHBlZDtcclxuXHJcblx0XHRcdH1cclxuXHRcdFx0I3ByYWdtYSB1bnJvbGxfbG9vcF9lbmRcclxuXHJcblx0XHRcdGlmICggY2xpcHBlZCApIGRpc2NhcmQ7XHJcblxyXG5cdFx0I2VuZGlmXHJcblxyXG5cdCNlbmRpZlxyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTID4gMFxyXG5cclxuXHR2YXJ5aW5nIHZlYzMgdkNsaXBQb3NpdGlvbjtcclxuXHJcblx0dW5pZm9ybSB2ZWM0IGNsaXBwaW5nUGxhbmVzWyBOVU1fQ0xJUFBJTkdfUExBTkVTIF07XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmIE5VTV9DTElQUElOR19QTEFORVMgPiAwXHJcblxyXG5cdHZhcnlpbmcgdmVjMyB2Q2xpcFBvc2l0aW9uO1xyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTID4gMFxyXG5cclxuXHR2Q2xpcFBvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejtcclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jaWYgZGVmaW5lZCggVVNFX0NPTE9SX0FMUEhBIClcclxuXHJcblx0ZGlmZnVzZUNvbG9yICo9IHZDb2xvcjtcclxuXHJcbiNlbGlmIGRlZmluZWQoIFVTRV9DT0xPUiApXHJcblxyXG5cdGRpZmZ1c2VDb2xvci5yZ2IgKj0gdkNvbG9yO1xyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbiNpZiBkZWZpbmVkKCBVU0VfQ09MT1JfQUxQSEEgKVxyXG5cclxuXHR2YXJ5aW5nIHZlYzQgdkNvbG9yO1xyXG5cclxuI2VsaWYgZGVmaW5lZCggVVNFX0NPTE9SIClcclxuXHJcblx0dmFyeWluZyB2ZWMzIHZDb2xvcjtcclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jaWYgZGVmaW5lZCggVVNFX0NPTE9SX0FMUEhBIClcclxuXHJcblx0dmFyeWluZyB2ZWM0IHZDb2xvcjtcclxuXHJcbiNlbGlmIGRlZmluZWQoIFVTRV9DT0xPUiApIHx8IGRlZmluZWQoIFVTRV9JTlNUQU5DSU5HX0NPTE9SICkgfHwgZGVmaW5lZCggVVNFX0JBVENISU5HX0NPTE9SIClcclxuXHJcblx0dmFyeWluZyB2ZWMzIHZDb2xvcjtcclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jaWYgZGVmaW5lZCggVVNFX0NPTE9SX0FMUEhBIClcclxuXHJcblx0dkNvbG9yID0gdmVjNCggMS4wICk7XHJcblxyXG4jZWxpZiBkZWZpbmVkKCBVU0VfQ09MT1IgKSB8fCBkZWZpbmVkKCBVU0VfSU5TVEFOQ0lOR19DT0xPUiApIHx8IGRlZmluZWQoIFVTRV9CQVRDSElOR19DT0xPUiApXHJcblxyXG5cdHZDb2xvciA9IHZlYzMoIDEuMCApO1xyXG5cclxuI2VuZGlmXHJcblxyXG4jaWZkZWYgVVNFX0NPTE9SXHJcblxyXG5cdHZDb2xvciAqPSBjb2xvcjtcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmZGVmIFVTRV9JTlNUQU5DSU5HX0NPTE9SXHJcblxyXG5cdHZDb2xvci54eXogKj0gaW5zdGFuY2VDb2xvci54eXo7XHJcblxyXG4jZW5kaWZcclxuXHJcbiNpZmRlZiBVU0VfQkFUQ0hJTkdfQ09MT1JcclxuXHJcblx0dmVjMyBiYXRjaGluZ0NvbG9yID0gZ2V0QmF0Y2hpbmdDb2xvciggZ2V0SW5kaXJlY3RJbmRleCggZ2xfRHJhd0lEICkgKTtcclxuXHJcblx0dkNvbG9yLnh5eiAqPSBiYXRjaGluZ0NvbG9yLnh5ejtcclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jZGVmaW5lIFBJIDMuMTQxNTkyNjUzNTg5NzkzXHJcbiNkZWZpbmUgUEkyIDYuMjgzMTg1MzA3MTc5NTg2XHJcbiNkZWZpbmUgUElfSEFMRiAxLjU3MDc5NjMyNjc5NDg5NjZcclxuI2RlZmluZSBSRUNJUFJPQ0FMX1BJIDAuMzE4MzA5ODg2MTgzNzkwN1xyXG4jZGVmaW5lIFJFQ0lQUk9DQUxfUEkyIDAuMTU5MTU0OTQzMDkxODk1MzVcclxuI2RlZmluZSBFUFNJTE9OIDFlLTZcclxuXHJcbiNpZm5kZWYgc2F0dXJhdGVcclxuLy8gPHRvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQ+IG1heSBoYXZlIGRlZmluZWQgc2F0dXJhdGUoKSBhbHJlYWR5XHJcbiNkZWZpbmUgc2F0dXJhdGUoIGEgKSBjbGFtcCggYSwgMC4wLCAxLjAgKVxyXG4jZW5kaWZcclxuI2RlZmluZSB3aGl0ZUNvbXBsZW1lbnQoIGEgKSAoIDEuMCAtIHNhdHVyYXRlKCBhICkgKVxyXG5cclxuZmxvYXQgcG93MiggY29uc3QgaW4gZmxvYXQgeCApIHsgcmV0dXJuIHgqeDsgfVxyXG52ZWMzIHBvdzIoIGNvbnN0IGluIHZlYzMgeCApIHsgcmV0dXJuIHgqeDsgfVxyXG5mbG9hdCBwb3czKCBjb25zdCBpbiBmbG9hdCB4ICkgeyByZXR1cm4geCp4Kng7IH1cclxuZmxvYXQgcG93NCggY29uc3QgaW4gZmxvYXQgeCApIHsgZmxvYXQgeDIgPSB4Kng7IHJldHVybiB4Mip4MjsgfVxyXG5mbG9hdCBtYXgzKCBjb25zdCBpbiB2ZWMzIHYgKSB7IHJldHVybiBtYXgoIG1heCggdi54LCB2LnkgKSwgdi56ICk7IH1cclxuZmxvYXQgYXZlcmFnZSggY29uc3QgaW4gdmVjMyB2ICkgeyByZXR1cm4gZG90KCB2LCB2ZWMzKCAwLjMzMzMzMzMgKSApOyB9XHJcblxyXG4vLyBleHBlY3RzIHZhbHVlcyBpbiB0aGUgcmFuZ2Ugb2YgWzAsMV14WzAsMV0sIHJldHVybnMgdmFsdWVzIGluIHRoZSBbMCwxXSByYW5nZS5cclxuLy8gZG8gbm90IGNvbGxhcHNlIGludG8gYSBzaW5nbGUgZnVuY3Rpb24gcGVyOiBodHRwOi8vYnl0ZWJsYWNrc21pdGguY29tL2ltcHJvdmVtZW50cy10by10aGUtY2Fub25pY2FsLW9uZS1saW5lci1nbHNsLXJhbmQtZm9yLW9wZW5nbC1lcy0yLTAvXHJcbmhpZ2hwIGZsb2F0IHJhbmQoIGNvbnN0IGluIHZlYzIgdXYgKSB7XHJcblxyXG5cdGNvbnN0IGhpZ2hwIGZsb2F0IGEgPSAxMi45ODk4LCBiID0gNzguMjMzLCBjID0gNDM3NTguNTQ1MztcclxuXHRoaWdocCBmbG9hdCBkdCA9IGRvdCggdXYueHksIHZlYzIoIGEsYiApICksIHNuID0gbW9kKCBkdCwgUEkgKTtcclxuXHJcblx0cmV0dXJuIGZyYWN0KCBzaW4oIHNuICkgKiBjICk7XHJcblxyXG59XHJcblxyXG4jaWZkZWYgSElHSF9QUkVDSVNJT05cclxuXHRmbG9hdCBwcmVjaXNpb25TYWZlTGVuZ3RoKCB2ZWMzIHYgKSB7IHJldHVybiBsZW5ndGgoIHYgKTsgfVxyXG4jZWxzZVxyXG5cdGZsb2F0IHByZWNpc2lvblNhZmVMZW5ndGgoIHZlYzMgdiApIHtcclxuXHRcdGZsb2F0IG1heENvbXBvbmVudCA9IG1heDMoIGFicyggdiApICk7XHJcblx0XHRyZXR1cm4gbGVuZ3RoKCB2IC8gbWF4Q29tcG9uZW50ICkgKiBtYXhDb21wb25lbnQ7XHJcblx0fVxyXG4jZW5kaWZcclxuXHJcbnN0cnVjdCBJbmNpZGVudExpZ2h0IHtcclxuXHR2ZWMzIGNvbG9yO1xyXG5cdHZlYzMgZGlyZWN0aW9uO1xyXG5cdGJvb2wgdmlzaWJsZTtcclxufTtcclxuXHJcbnN0cnVjdCBSZWZsZWN0ZWRMaWdodCB7XHJcblx0dmVjMyBkaXJlY3REaWZmdXNlO1xyXG5cdHZlYzMgZGlyZWN0U3BlY3VsYXI7XHJcblx0dmVjMyBpbmRpcmVjdERpZmZ1c2U7XHJcblx0dmVjMyBpbmRpcmVjdFNwZWN1bGFyO1xyXG59O1xyXG5cclxuI2lmZGVmIFVTRV9BTFBIQUhBU0hcclxuXHJcblx0dmFyeWluZyB2ZWMzIHZQb3NpdGlvbjtcclxuXHJcbiNlbmRpZlxyXG5cclxudmVjMyB0cmFuc2Zvcm1EaXJlY3Rpb24oIGluIHZlYzMgZGlyLCBpbiBtYXQ0IG1hdHJpeCApIHtcclxuXHJcblx0cmV0dXJuIG5vcm1hbGl6ZSggKCBtYXRyaXggKiB2ZWM0KCBkaXIsIDAuMCApICkueHl6ICk7XHJcblxyXG59XHJcblxyXG52ZWMzIGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIGluIHZlYzMgZGlyLCBpbiBtYXQ0IG1hdHJpeCApIHtcclxuXHJcblx0Ly8gZGlyIGNhbiBiZSBlaXRoZXIgYSBkaXJlY3Rpb24gdmVjdG9yIG9yIGEgbm9ybWFsIHZlY3RvclxyXG5cdC8vIHVwcGVyLWxlZnQgM3gzIG9mIG1hdHJpeCBpcyBhc3N1bWVkIHRvIGJlIG9ydGhvZ29uYWxcclxuXHJcblx0cmV0dXJuIG5vcm1hbGl6ZSggKCB2ZWM0KCBkaXIsIDAuMCApICogbWF0cml4ICkueHl6ICk7XHJcblxyXG59XHJcblxyXG5tYXQzIHRyYW5zcG9zZU1hdDMoIGNvbnN0IGluIG1hdDMgbSApIHtcclxuXHJcblx0bWF0MyB0bXA7XHJcblxyXG5cdHRtcFsgMCBdID0gdmVjMyggbVsgMCBdLngsIG1bIDEgXS54LCBtWyAyIF0ueCApO1xyXG5cdHRtcFsgMSBdID0gdmVjMyggbVsgMCBdLnksIG1bIDEgXS55LCBtWyAyIF0ueSApO1xyXG5cdHRtcFsgMiBdID0gdmVjMyggbVsgMCBdLnosIG1bIDEgXS56LCBtWyAyIF0ueiApO1xyXG5cclxuXHRyZXR1cm4gdG1wO1xyXG5cclxufVxyXG5cclxuYm9vbCBpc1BlcnNwZWN0aXZlTWF0cml4KCBtYXQ0IG0gKSB7XHJcblxyXG5cdHJldHVybiBtWyAyIF1bIDMgXSA9PSAtIDEuMDtcclxuXHJcbn1cclxuXHJcbnZlYzIgZXF1aXJlY3RVdiggaW4gdmVjMyBkaXIgKSB7XHJcblxyXG5cdC8vIGRpciBpcyBhc3N1bWVkIHRvIGJlIHVuaXQgbGVuZ3RoXHJcblxyXG5cdGZsb2F0IHUgPSBhdGFuKCBkaXIueiwgZGlyLnggKSAqIFJFQ0lQUk9DQUxfUEkyICsgMC41O1xyXG5cclxuXHRmbG9hdCB2ID0gYXNpbiggY2xhbXAoIGRpci55LCAtIDEuMCwgMS4wICkgKSAqIFJFQ0lQUk9DQUxfUEkgKyAwLjU7XHJcblxyXG5cdHJldHVybiB2ZWMyKCB1LCB2ICk7XHJcblxyXG59XHJcblxyXG52ZWMzIEJSREZfTGFtYmVydCggY29uc3QgaW4gdmVjMyBkaWZmdXNlQ29sb3IgKSB7XHJcblxyXG5cdHJldHVybiBSRUNJUFJPQ0FMX1BJICogZGlmZnVzZUNvbG9yO1xyXG5cclxufSAvLyB2YWxpZGF0ZWRcclxuXHJcbnZlYzMgRl9TY2hsaWNrKCBjb25zdCBpbiB2ZWMzIGYwLCBjb25zdCBpbiBmbG9hdCBmOTAsIGNvbnN0IGluIGZsb2F0IGRvdFZIICkge1xyXG5cclxuXHQvLyBPcmlnaW5hbCBhcHByb3hpbWF0aW9uIGJ5IENocmlzdG9waGUgU2NobGljayAnOTRcclxuXHQvLyBmbG9hdCBmcmVzbmVsID0gcG93KCAxLjAgLSBkb3RWSCwgNS4wICk7XHJcblxyXG5cdC8vIE9wdGltaXplZCB2YXJpYW50IChwcmVzZW50ZWQgYnkgRXBpYyBhdCBTSUdHUkFQSCAnMTMpXHJcblx0Ly8gaHR0cHM6Ly9jZG4yLnVucmVhbGVuZ2luZS5jb20vUmVzb3VyY2VzL2ZpbGVzLzIwMTNTaWdncmFwaFByZXNlbnRhdGlvbnNOb3Rlcy0yNjkxNTczOC5wZGZcclxuXHRmbG9hdCBmcmVzbmVsID0gZXhwMiggKCAtIDUuNTU0NzMgKiBkb3RWSCAtIDYuOTgzMTYgKSAqIGRvdFZIICk7XHJcblxyXG5cdHJldHVybiBmMCAqICggMS4wIC0gZnJlc25lbCApICsgKCBmOTAgKiBmcmVzbmVsICk7XHJcblxyXG59IC8vIHZhbGlkYXRlZFxyXG5cclxuZmxvYXQgRl9TY2hsaWNrKCBjb25zdCBpbiBmbG9hdCBmMCwgY29uc3QgaW4gZmxvYXQgZjkwLCBjb25zdCBpbiBmbG9hdCBkb3RWSCApIHtcclxuXHJcblx0Ly8gT3JpZ2luYWwgYXBwcm94aW1hdGlvbiBieSBDaHJpc3RvcGhlIFNjaGxpY2sgJzk0XHJcblx0Ly8gZmxvYXQgZnJlc25lbCA9IHBvdyggMS4wIC0gZG90VkgsIDUuMCApO1xyXG5cclxuXHQvLyBPcHRpbWl6ZWQgdmFyaWFudCAocHJlc2VudGVkIGJ5IEVwaWMgYXQgU0lHR1JBUEggJzEzKVxyXG5cdC8vIGh0dHBzOi8vY2RuMi51bnJlYWxlbmdpbmUuY29tL1Jlc291cmNlcy9maWxlcy8yMDEzU2lnZ3JhcGhQcmVzZW50YXRpb25zTm90ZXMtMjY5MTU3MzgucGRmXHJcblx0ZmxvYXQgZnJlc25lbCA9IGV4cDIoICggLSA1LjU1NDczICogZG90VkggLSA2Ljk4MzE2ICkgKiBkb3RWSCApO1xyXG5cclxuXHRyZXR1cm4gZjAgKiAoIDEuMCAtIGZyZXNuZWwgKSArICggZjkwICogZnJlc25lbCApO1xyXG5cclxufSAvLyB2YWxpZGF0ZWRcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVfVVZcclxuXHJcblx0I2RlZmluZSBjdWJlVVZfbWluTWlwTGV2ZWwgNC4wXHJcblx0I2RlZmluZSBjdWJlVVZfbWluVGlsZVNpemUgMTYuMFxyXG5cclxuXHQvLyBUaGVzZSBzaGFkZXIgZnVuY3Rpb25zIGNvbnZlcnQgYmV0d2VlbiB0aGUgVVYgY29vcmRpbmF0ZXMgb2YgYSBzaW5nbGUgZmFjZSBvZlxyXG5cdC8vIGEgY3ViZW1hcCwgdGhlIDAtNSBpbnRlZ2VyIGluZGV4IG9mIGEgY3ViZSBmYWNlLCBhbmQgdGhlIGRpcmVjdGlvbiB2ZWN0b3IgZm9yXHJcblx0Ly8gc2FtcGxpbmcgYSB0ZXh0dXJlQ3ViZSAobm90IGdlbmVyYWxseSBub3JtYWxpemVkICkuXHJcblxyXG5cdGZsb2F0IGdldEZhY2UoIHZlYzMgZGlyZWN0aW9uICkge1xyXG5cclxuXHRcdHZlYzMgYWJzRGlyZWN0aW9uID0gYWJzKCBkaXJlY3Rpb24gKTtcclxuXHJcblx0XHRmbG9hdCBmYWNlID0gLSAxLjA7XHJcblxyXG5cdFx0aWYgKCBhYnNEaXJlY3Rpb24ueCA+IGFic0RpcmVjdGlvbi56ICkge1xyXG5cclxuXHRcdFx0aWYgKCBhYnNEaXJlY3Rpb24ueCA+IGFic0RpcmVjdGlvbi55IClcclxuXHJcblx0XHRcdFx0ZmFjZSA9IGRpcmVjdGlvbi54ID4gMC4wID8gMC4wIDogMy4wO1xyXG5cclxuXHRcdFx0ZWxzZVxyXG5cclxuXHRcdFx0XHRmYWNlID0gZGlyZWN0aW9uLnkgPiAwLjAgPyAxLjAgOiA0LjA7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGlmICggYWJzRGlyZWN0aW9uLnogPiBhYnNEaXJlY3Rpb24ueSApXHJcblxyXG5cdFx0XHRcdGZhY2UgPSBkaXJlY3Rpb24ueiA+IDAuMCA/IDIuMCA6IDUuMDtcclxuXHJcblx0XHRcdGVsc2VcclxuXHJcblx0XHRcdFx0ZmFjZSA9IGRpcmVjdGlvbi55ID4gMC4wID8gMS4wIDogNC4wO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZmFjZTtcclxuXHJcblx0fVxyXG5cclxuXHQvLyBSSCBjb29yZGluYXRlIHN5c3RlbTsgUE1SRU0gZmFjZS1pbmRleGluZyBjb252ZW50aW9uXHJcblx0dmVjMiBnZXRVViggdmVjMyBkaXJlY3Rpb24sIGZsb2F0IGZhY2UgKSB7XHJcblxyXG5cdFx0dmVjMiB1djtcclxuXHJcblx0XHRpZiAoIGZhY2UgPT0gMC4wICkge1xyXG5cclxuXHRcdFx0dXYgPSB2ZWMyKCBkaXJlY3Rpb24ueiwgZGlyZWN0aW9uLnkgKSAvIGFicyggZGlyZWN0aW9uLnggKTsgLy8gcG9zIHhcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBmYWNlID09IDEuMCApIHtcclxuXHJcblx0XHRcdHV2ID0gdmVjMiggLSBkaXJlY3Rpb24ueCwgLSBkaXJlY3Rpb24ueiApIC8gYWJzKCBkaXJlY3Rpb24ueSApOyAvLyBwb3MgeVxyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGZhY2UgPT0gMi4wICkge1xyXG5cclxuXHRcdFx0dXYgPSB2ZWMyKCAtIGRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueSApIC8gYWJzKCBkaXJlY3Rpb24ueiApOyAvLyBwb3MgelxyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGZhY2UgPT0gMy4wICkge1xyXG5cclxuXHRcdFx0dXYgPSB2ZWMyKCAtIGRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueSApIC8gYWJzKCBkaXJlY3Rpb24ueCApOyAvLyBuZWcgeFxyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGZhY2UgPT0gNC4wICkge1xyXG5cclxuXHRcdFx0dXYgPSB2ZWMyKCAtIGRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueiApIC8gYWJzKCBkaXJlY3Rpb24ueSApOyAvLyBuZWcgeVxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR1diA9IHZlYzIoIGRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueSApIC8gYWJzKCBkaXJlY3Rpb24ueiApOyAvLyBuZWcgelxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gMC41ICogKCB1diArIDEuMCApO1xyXG5cclxuXHR9XHJcblxyXG5cdHZlYzMgYmlsaW5lYXJDdWJlVVYoIHNhbXBsZXIyRCBlbnZNYXAsIHZlYzMgZGlyZWN0aW9uLCBmbG9hdCBtaXBJbnQgKSB7XHJcblxyXG5cdFx0ZmxvYXQgZmFjZSA9IGdldEZhY2UoIGRpcmVjdGlvbiApO1xyXG5cclxuXHRcdGZsb2F0IGZpbHRlckludCA9IG1heCggY3ViZVVWX21pbk1pcExldmVsIC0gbWlwSW50LCAwLjAgKTtcclxuXHJcblx0XHRtaXBJbnQgPSBtYXgoIG1pcEludCwgY3ViZVVWX21pbk1pcExldmVsICk7XHJcblxyXG5cdFx0ZmxvYXQgZmFjZVNpemUgPSBleHAyKCBtaXBJbnQgKTtcclxuXHJcblx0XHRoaWdocCB2ZWMyIHV2ID0gZ2V0VVYoIGRpcmVjdGlvbiwgZmFjZSApICogKCBmYWNlU2l6ZSAtIDIuMCApICsgMS4wOyAvLyAjMjUwNzFcclxuXHJcblx0XHRpZiAoIGZhY2UgPiAyLjAgKSB7XHJcblxyXG5cdFx0XHR1di55ICs9IGZhY2VTaXplO1xyXG5cclxuXHRcdFx0ZmFjZSAtPSAzLjA7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHV2LnggKz0gZmFjZSAqIGZhY2VTaXplO1xyXG5cclxuXHRcdHV2LnggKz0gZmlsdGVySW50ICogMy4wICogY3ViZVVWX21pblRpbGVTaXplO1xyXG5cclxuXHRcdHV2LnkgKz0gNC4wICogKCBleHAyKCBDVUJFVVZfTUFYX01JUCApIC0gZmFjZVNpemUgKTtcclxuXHJcblx0XHR1di54ICo9IENVQkVVVl9URVhFTF9XSURUSDtcclxuXHRcdHV2LnkgKj0gQ1VCRVVWX1RFWEVMX0hFSUdIVDtcclxuXHJcblx0XHQjaWZkZWYgdGV4dHVyZTJER3JhZEVYVFxyXG5cclxuXHRcdFx0cmV0dXJuIHRleHR1cmUyREdyYWRFWFQoIGVudk1hcCwgdXYsIHZlYzIoIDAuMCApLCB2ZWMyKCAwLjAgKSApLnJnYjsgLy8gZGlzYWJsZSBhbmlzb3Ryb3BpYyBmaWx0ZXJpbmdcclxuXHJcblx0XHQjZWxzZVxyXG5cclxuXHRcdFx0cmV0dXJuIHRleHR1cmUyRCggZW52TWFwLCB1diApLnJnYjtcclxuXHJcblx0XHQjZW5kaWZcclxuXHJcblx0fVxyXG5cclxuXHQvLyBUaGVzZSBkZWZpbmVzIG11c3QgbWF0Y2ggd2l0aCBQTVJFTUdlbmVyYXRvclxyXG5cclxuXHQjZGVmaW5lIGN1YmVVVl9yMCAxLjBcclxuXHQjZGVmaW5lIGN1YmVVVl9tMCAtIDIuMFxyXG5cdCNkZWZpbmUgY3ViZVVWX3IxIDAuOFxyXG5cdCNkZWZpbmUgY3ViZVVWX20xIC0gMS4wXHJcblx0I2RlZmluZSBjdWJlVVZfcjQgMC40XHJcblx0I2RlZmluZSBjdWJlVVZfbTQgMi4wXHJcblx0I2RlZmluZSBjdWJlVVZfcjUgMC4zMDVcclxuXHQjZGVmaW5lIGN1YmVVVl9tNSAzLjBcclxuXHQjZGVmaW5lIGN1YmVVVl9yNiAwLjIxXHJcblx0I2RlZmluZSBjdWJlVVZfbTYgNC4wXHJcblxyXG5cdGZsb2F0IHJvdWdobmVzc1RvTWlwKCBmbG9hdCByb3VnaG5lc3MgKSB7XHJcblxyXG5cdFx0ZmxvYXQgbWlwID0gMC4wO1xyXG5cclxuXHRcdGlmICggcm91Z2huZXNzID49IGN1YmVVVl9yMSApIHtcclxuXHJcblx0XHRcdG1pcCA9ICggY3ViZVVWX3IwIC0gcm91Z2huZXNzICkgKiAoIGN1YmVVVl9tMSAtIGN1YmVVVl9tMCApIC8gKCBjdWJlVVZfcjAgLSBjdWJlVVZfcjEgKSArIGN1YmVVVl9tMDtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCByb3VnaG5lc3MgPj0gY3ViZVVWX3I0ICkge1xyXG5cclxuXHRcdFx0bWlwID0gKCBjdWJlVVZfcjEgLSByb3VnaG5lc3MgKSAqICggY3ViZVVWX200IC0gY3ViZVVWX20xICkgLyAoIGN1YmVVVl9yMSAtIGN1YmVVVl9yNCApICsgY3ViZVVWX20xO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHJvdWdobmVzcyA+PSBjdWJlVVZfcjUgKSB7XHJcblxyXG5cdFx0XHRtaXAgPSAoIGN1YmVVVl9yNCAtIHJvdWdobmVzcyApICogKCBjdWJlVVZfbTUgLSBjdWJlVVZfbTQgKSAvICggY3ViZVVWX3I0IC0gY3ViZVVWX3I1ICkgKyBjdWJlVVZfbTQ7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggcm91Z2huZXNzID49IGN1YmVVVl9yNiApIHtcclxuXHJcblx0XHRcdG1pcCA9ICggY3ViZVVWX3I1IC0gcm91Z2huZXNzICkgKiAoIGN1YmVVVl9tNiAtIGN1YmVVVl9tNSApIC8gKCBjdWJlVVZfcjUgLSBjdWJlVVZfcjYgKSArIGN1YmVVVl9tNTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0bWlwID0gLSAyLjAgKiBsb2cyKCAxLjE2ICogcm91Z2huZXNzICk7IC8vIDEuMTYgPSAxLjc5XjAuMjVcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbWlwO1xyXG5cclxuXHR9XHJcblxyXG5cdHZlYzQgdGV4dHVyZUN1YmVVViggc2FtcGxlcjJEIGVudk1hcCwgdmVjMyBzYW1wbGVEaXIsIGZsb2F0IHJvdWdobmVzcyApIHtcclxuXHJcblx0XHRmbG9hdCBtaXAgPSBjbGFtcCggcm91Z2huZXNzVG9NaXAoIHJvdWdobmVzcyApLCBjdWJlVVZfbTAsIENVQkVVVl9NQVhfTUlQICk7XHJcblxyXG5cdFx0ZmxvYXQgbWlwRiA9IGZyYWN0KCBtaXAgKTtcclxuXHJcblx0XHRmbG9hdCBtaXBJbnQgPSBmbG9vciggbWlwICk7XHJcblxyXG5cdFx0dmVjMyBjb2xvcjAgPSBiaWxpbmVhckN1YmVVViggZW52TWFwLCBzYW1wbGVEaXIsIG1pcEludCApO1xyXG5cclxuXHRcdGlmICggbWlwRiA9PSAwLjAgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gdmVjNCggY29sb3IwLCAxLjAgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dmVjMyBjb2xvcjEgPSBiaWxpbmVhckN1YmVVViggZW52TWFwLCBzYW1wbGVEaXIsIG1pcEludCArIDEuMCApO1xyXG5cclxuXHRcdFx0cmV0dXJuIHZlYzQoIG1peCggY29sb3IwLCBjb2xvcjEsIG1pcEYgKSwgMS4wICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuXHJcbnZlYzMgdHJhbnNmb3JtZWROb3JtYWwgPSBvYmplY3ROb3JtYWw7XHJcbiNpZmRlZiBVU0VfVEFOR0VOVFxyXG5cclxuXHR2ZWMzIHRyYW5zZm9ybWVkVGFuZ2VudCA9IG9iamVjdFRhbmdlbnQ7XHJcblxyXG4jZW5kaWZcclxuXHJcbiNpZmRlZiBVU0VfQkFUQ0hJTkdcclxuXHJcblx0Ly8gdGhpcyBpcyBpbiBsaWV1IG9mIGEgcGVyLWluc3RhbmNlIG5vcm1hbC1tYXRyaXhcclxuXHQvLyBzaGVhciB0cmFuc2Zvcm1zIGluIHRoZSBpbnN0YW5jZSBtYXRyaXggYXJlIG5vdCBzdXBwb3J0ZWRcclxuXHJcblx0bWF0MyBibSA9IG1hdDMoIGJhdGNoaW5nTWF0cml4ICk7XHJcblx0dHJhbnNmb3JtZWROb3JtYWwgLz0gdmVjMyggZG90KCBibVsgMCBdLCBibVsgMCBdICksIGRvdCggYm1bIDEgXSwgYm1bIDEgXSApLCBkb3QoIGJtWyAyIF0sIGJtWyAyIF0gKSApO1xyXG5cdHRyYW5zZm9ybWVkTm9ybWFsID0gYm0gKiB0cmFuc2Zvcm1lZE5vcm1hbDtcclxuXHJcblx0I2lmZGVmIFVTRV9UQU5HRU5UXHJcblxyXG5cdFx0dHJhbnNmb3JtZWRUYW5nZW50ID0gYm0gKiB0cmFuc2Zvcm1lZFRhbmdlbnQ7XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuI2VuZGlmXHJcblxyXG4jaWZkZWYgVVNFX0lOU1RBTkNJTkdcclxuXHJcblx0Ly8gdGhpcyBpcyBpbiBsaWV1IG9mIGEgcGVyLWluc3RhbmNlIG5vcm1hbC1tYXRyaXhcclxuXHQvLyBzaGVhciB0cmFuc2Zvcm1zIGluIHRoZSBpbnN0YW5jZSBtYXRyaXggYXJlIG5vdCBzdXBwb3J0ZWRcclxuXHJcblx0bWF0MyBpbSA9IG1hdDMoIGluc3RhbmNlTWF0cml4ICk7XHJcblx0dHJhbnNmb3JtZWROb3JtYWwgLz0gdmVjMyggZG90KCBpbVsgMCBdLCBpbVsgMCBdICksIGRvdCggaW1bIDEgXSwgaW1bIDEgXSApLCBkb3QoIGltWyAyIF0sIGltWyAyIF0gKSApO1xyXG5cdHRyYW5zZm9ybWVkTm9ybWFsID0gaW0gKiB0cmFuc2Zvcm1lZE5vcm1hbDtcclxuXHJcblx0I2lmZGVmIFVTRV9UQU5HRU5UXHJcblxyXG5cdFx0dHJhbnNmb3JtZWRUYW5nZW50ID0gaW0gKiB0cmFuc2Zvcm1lZFRhbmdlbnQ7XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuI2VuZGlmXHJcblxyXG50cmFuc2Zvcm1lZE5vcm1hbCA9IG5vcm1hbE1hdHJpeCAqIHRyYW5zZm9ybWVkTm9ybWFsO1xyXG5cclxuI2lmZGVmIEZMSVBfU0lERURcclxuXHJcblx0dHJhbnNmb3JtZWROb3JtYWwgPSAtIHRyYW5zZm9ybWVkTm9ybWFsO1xyXG5cclxuI2VuZGlmXHJcblxyXG4jaWZkZWYgVVNFX1RBTkdFTlRcclxuXHJcblx0dHJhbnNmb3JtZWRUYW5nZW50ID0gKCBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCB0cmFuc2Zvcm1lZFRhbmdlbnQsIDAuMCApICkueHl6O1xyXG5cclxuXHQjaWZkZWYgRkxJUF9TSURFRFxyXG5cclxuXHRcdHRyYW5zZm9ybWVkVGFuZ2VudCA9IC0gdHJhbnNmb3JtZWRUYW5nZW50O1xyXG5cclxuXHQjZW5kaWZcclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUFxyXG5cclxuXHR1bmlmb3JtIHNhbXBsZXIyRCBkaXNwbGFjZW1lbnRNYXA7XHJcblx0dW5pZm9ybSBmbG9hdCBkaXNwbGFjZW1lbnRTY2FsZTtcclxuXHR1bmlmb3JtIGZsb2F0IGRpc3BsYWNlbWVudEJpYXM7XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVBcclxuXHJcblx0dHJhbnNmb3JtZWQgKz0gbm9ybWFsaXplKCBvYmplY3ROb3JtYWwgKSAqICggdGV4dHVyZTJEKCBkaXNwbGFjZW1lbnRNYXAsIHZEaXNwbGFjZW1lbnRNYXBVdiApLnggKiBkaXNwbGFjZW1lbnRTY2FsZSArIGRpc3BsYWNlbWVudEJpYXMgKTtcclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jaWZkZWYgVVNFX0VNSVNTSVZFTUFQXHJcblxyXG5cdHZlYzQgZW1pc3NpdmVDb2xvciA9IHRleHR1cmUyRCggZW1pc3NpdmVNYXAsIHZFbWlzc2l2ZU1hcFV2ICk7XHJcblxyXG5cdCNpZmRlZiBERUNPREVfVklERU9fVEVYVFVSRV9FTUlTU0lWRVxyXG5cclxuXHRcdC8vIHVzZSBpbmxpbmUgc1JHQiBkZWNvZGUgdW50aWwgYnJvd3NlcnMgcHJvcGVybHkgc3VwcG9ydCBTUkdCOF9BTFBIQTggd2l0aCB2aWRlbyB0ZXh0dXJlcyAoIzI2NTE2KVxyXG5cclxuXHRcdGVtaXNzaXZlQ29sb3IgPSBzUkdCVHJhbnNmZXJFT1RGKCBlbWlzc2l2ZUNvbG9yICk7XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuXHR0b3RhbEVtaXNzaXZlUmFkaWFuY2UgKj0gZW1pc3NpdmVDb2xvci5yZ2I7XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmZGVmIFVTRV9FTUlTU0lWRU1BUFxyXG5cclxuXHR1bmlmb3JtIHNhbXBsZXIyRCBlbWlzc2l2ZU1hcDtcclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG5nbF9GcmFnQ29sb3IgPSBsaW5lYXJUb091dHB1dFRleGVsKCBnbF9GcmFnQ29sb3IgKTtcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuXHJcbnZlYzQgTGluZWFyVHJhbnNmZXJPRVRGKCBpbiB2ZWM0IHZhbHVlICkge1xyXG5cdHJldHVybiB2YWx1ZTtcclxufVxyXG5cclxudmVjNCBzUkdCVHJhbnNmZXJFT1RGKCBpbiB2ZWM0IHZhbHVlICkge1xyXG5cdHJldHVybiB2ZWM0KCBtaXgoIHBvdyggdmFsdWUucmdiICogMC45NDc4NjcyOTg2ICsgdmVjMyggMC4wNTIxMzI3MDE0ICksIHZlYzMoIDIuNCApICksIHZhbHVlLnJnYiAqIDAuMDc3Mzk5MzgwOCwgdmVjMyggbGVzc1RoYW5FcXVhbCggdmFsdWUucmdiLCB2ZWMzKCAwLjA0MDQ1ICkgKSApICksIHZhbHVlLmEgKTtcclxufVxyXG5cclxudmVjNCBzUkdCVHJhbnNmZXJPRVRGKCBpbiB2ZWM0IHZhbHVlICkge1xyXG5cdHJldHVybiB2ZWM0KCBtaXgoIHBvdyggdmFsdWUucmdiLCB2ZWMzKCAwLjQxNjY2ICkgKSAqIDEuMDU1IC0gdmVjMyggMC4wNTUgKSwgdmFsdWUucmdiICogMTIuOTIsIHZlYzMoIGxlc3NUaGFuRXF1YWwoIHZhbHVlLnJnYiwgdmVjMyggMC4wMDMxMzA4ICkgKSApICksIHZhbHVlLmEgKTtcclxufVxyXG5cclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmZGVmIFVTRV9FTlZNQVBcclxuXHJcblx0I2lmZGVmIEVOVl9XT1JMRFBPU1xyXG5cclxuXHRcdHZlYzMgY2FtZXJhVG9GcmFnO1xyXG5cclxuXHRcdGlmICggaXNPcnRob2dyYXBoaWMgKSB7XHJcblxyXG5cdFx0XHRjYW1lcmFUb0ZyYWcgPSBub3JtYWxpemUoIHZlYzMoIC0gdmlld01hdHJpeFsgMCBdWyAyIF0sIC0gdmlld01hdHJpeFsgMSBdWyAyIF0sIC0gdmlld01hdHJpeFsgMiBdWyAyIF0gKSApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRjYW1lcmFUb0ZyYWcgPSBub3JtYWxpemUoIHZXb3JsZFBvc2l0aW9uIC0gY2FtZXJhUG9zaXRpb24gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gVHJhbnNmb3JtaW5nIE5vcm1hbCBWZWN0b3JzIHdpdGggdGhlIEludmVyc2UgVHJhbnNmb3JtYXRpb25cclxuXHRcdHZlYzMgd29ybGROb3JtYWwgPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBub3JtYWwsIHZpZXdNYXRyaXggKTtcclxuXHJcblx0XHQjaWZkZWYgRU5WTUFQX01PREVfUkVGTEVDVElPTlxyXG5cclxuXHRcdFx0dmVjMyByZWZsZWN0VmVjID0gcmVmbGVjdCggY2FtZXJhVG9GcmFnLCB3b3JsZE5vcm1hbCApO1xyXG5cclxuXHRcdCNlbHNlXHJcblxyXG5cdFx0XHR2ZWMzIHJlZmxlY3RWZWMgPSByZWZyYWN0KCBjYW1lcmFUb0ZyYWcsIHdvcmxkTm9ybWFsLCByZWZyYWN0aW9uUmF0aW8gKTtcclxuXHJcblx0XHQjZW5kaWZcclxuXHJcblx0I2Vsc2VcclxuXHJcblx0XHR2ZWMzIHJlZmxlY3RWZWMgPSB2UmVmbGVjdDtcclxuXHJcblx0I2VuZGlmXHJcblxyXG5cdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXHJcblxyXG5cdFx0dmVjNCBlbnZDb2xvciA9IHRleHR1cmVDdWJlKCBlbnZNYXAsIGVudk1hcFJvdGF0aW9uICogdmVjMyggZmxpcEVudk1hcCAqIHJlZmxlY3RWZWMueCwgcmVmbGVjdFZlYy55eiApICk7XHJcblxyXG5cdCNlbHNlXHJcblxyXG5cdFx0dmVjNCBlbnZDb2xvciA9IHZlYzQoIDAuMCApO1xyXG5cclxuXHQjZW5kaWZcclxuXHJcblx0I2lmZGVmIEVOVk1BUF9CTEVORElOR19NVUxUSVBMWVxyXG5cclxuXHRcdG91dGdvaW5nTGlnaHQgPSBtaXgoIG91dGdvaW5nTGlnaHQsIG91dGdvaW5nTGlnaHQgKiBlbnZDb2xvci54eXosIHNwZWN1bGFyU3RyZW5ndGggKiByZWZsZWN0aXZpdHkgKTtcclxuXHJcblx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX0JMRU5ESU5HX01JWCApXHJcblxyXG5cdFx0b3V0Z29pbmdMaWdodCA9IG1peCggb3V0Z29pbmdMaWdodCwgZW52Q29sb3IueHl6LCBzcGVjdWxhclN0cmVuZ3RoICogcmVmbGVjdGl2aXR5ICk7XHJcblxyXG5cdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9CTEVORElOR19BREQgKVxyXG5cclxuXHRcdG91dGdvaW5nTGlnaHQgKz0gZW52Q29sb3IueHl6ICogc3BlY3VsYXJTdHJlbmd0aCAqIHJlZmxlY3Rpdml0eTtcclxuXHJcblx0I2VuZGlmXHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmZGVmIFVTRV9FTlZNQVBcclxuXHJcblx0dW5pZm9ybSBmbG9hdCBlbnZNYXBJbnRlbnNpdHk7XHJcblx0dW5pZm9ybSBmbG9hdCBmbGlwRW52TWFwO1xyXG5cdHVuaWZvcm0gbWF0MyBlbnZNYXBSb3RhdGlvbjtcclxuXHJcblx0I2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVcclxuXHRcdHVuaWZvcm0gc2FtcGxlckN1YmUgZW52TWFwO1xyXG5cdCNlbHNlXHJcblx0XHR1bmlmb3JtIHNhbXBsZXIyRCBlbnZNYXA7XHJcblx0I2VuZGlmXHJcblx0XHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jaWZkZWYgVVNFX0VOVk1BUFxyXG5cclxuXHR1bmlmb3JtIGZsb2F0IHJlZmxlY3Rpdml0eTtcclxuXHJcblx0I2lmIGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFBIT05HICkgfHwgZGVmaW5lZCggTEFNQkVSVCApXHJcblxyXG5cdFx0I2RlZmluZSBFTlZfV09STERQT1NcclxuXHJcblx0I2VuZGlmXHJcblxyXG5cdCNpZmRlZiBFTlZfV09STERQT1NcclxuXHJcblx0XHR2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XHJcblx0XHR1bmlmb3JtIGZsb2F0IHJlZnJhY3Rpb25SYXRpbztcclxuXHQjZWxzZVxyXG5cdFx0dmFyeWluZyB2ZWMzIHZSZWZsZWN0O1xyXG5cdCNlbmRpZlxyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbiNpZmRlZiBVU0VfRU5WTUFQXHJcblxyXG5cdCNpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBQSE9ORyApIHx8IGRlZmluZWQoIExBTUJFUlQgKVxyXG5cclxuXHRcdCNkZWZpbmUgRU5WX1dPUkxEUE9TXHJcblxyXG5cdCNlbmRpZlxyXG5cclxuXHQjaWZkZWYgRU5WX1dPUkxEUE9TXHJcblx0XHRcclxuXHRcdHZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcclxuXHJcblx0I2Vsc2VcclxuXHJcblx0XHR2YXJ5aW5nIHZlYzMgdlJlZmxlY3Q7XHJcblx0XHR1bmlmb3JtIGZsb2F0IHJlZnJhY3Rpb25SYXRpbztcclxuXHJcblx0I2VuZGlmXHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmZGVmIFVTRV9FTlZNQVBcclxuXHJcblx0I2lmZGVmIEVOVl9XT1JMRFBPU1xyXG5cclxuXHRcdHZXb3JsZFBvc2l0aW9uID0gd29ybGRQb3NpdGlvbi54eXo7XHJcblxyXG5cdCNlbHNlXHJcblxyXG5cdFx0dmVjMyBjYW1lcmFUb1ZlcnRleDtcclxuXHJcblx0XHRpZiAoIGlzT3J0aG9ncmFwaGljICkge1xyXG5cclxuXHRcdFx0Y2FtZXJhVG9WZXJ0ZXggPSBub3JtYWxpemUoIHZlYzMoIC0gdmlld01hdHJpeFsgMCBdWyAyIF0sIC0gdmlld01hdHJpeFsgMSBdWyAyIF0sIC0gdmlld01hdHJpeFsgMiBdWyAyIF0gKSApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRjYW1lcmFUb1ZlcnRleCA9IG5vcm1hbGl6ZSggd29ybGRQb3NpdGlvbi54eXogLSBjYW1lcmFQb3NpdGlvbiApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR2ZWMzIHdvcmxkTm9ybWFsID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggdHJhbnNmb3JtZWROb3JtYWwsIHZpZXdNYXRyaXggKTtcclxuXHJcblx0XHQjaWZkZWYgRU5WTUFQX01PREVfUkVGTEVDVElPTlxyXG5cclxuXHRcdFx0dlJlZmxlY3QgPSByZWZsZWN0KCBjYW1lcmFUb1ZlcnRleCwgd29ybGROb3JtYWwgKTtcclxuXHJcblx0XHQjZWxzZVxyXG5cclxuXHRcdFx0dlJlZmxlY3QgPSByZWZyYWN0KCBjYW1lcmFUb1ZlcnRleCwgd29ybGROb3JtYWwsIHJlZnJhY3Rpb25SYXRpbyApO1xyXG5cclxuXHRcdCNlbmRpZlxyXG5cclxuXHQjZW5kaWZcclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jaWZkZWYgVVNFX0ZPR1xyXG5cclxuXHR2Rm9nRGVwdGggPSAtIG12UG9zaXRpb24uejtcclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jaWZkZWYgVVNFX0ZPR1xyXG5cclxuXHR2YXJ5aW5nIGZsb2F0IHZGb2dEZXB0aDtcclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jaWZkZWYgVVNFX0ZPR1xyXG5cclxuXHQjaWZkZWYgRk9HX0VYUDJcclxuXHJcblx0XHRmbG9hdCBmb2dGYWN0b3IgPSAxLjAgLSBleHAoIC0gZm9nRGVuc2l0eSAqIGZvZ0RlbnNpdHkgKiB2Rm9nRGVwdGggKiB2Rm9nRGVwdGggKTtcclxuXHJcblx0I2Vsc2VcclxuXHJcblx0XHRmbG9hdCBmb2dGYWN0b3IgPSBzbW9vdGhzdGVwKCBmb2dOZWFyLCBmb2dGYXIsIHZGb2dEZXB0aCApO1xyXG5cclxuXHQjZW5kaWZcclxuXHJcblx0Z2xfRnJhZ0NvbG9yLnJnYiA9IG1peCggZ2xfRnJhZ0NvbG9yLnJnYiwgZm9nQ29sb3IsIGZvZ0ZhY3RvciApO1xyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbiNpZmRlZiBVU0VfRk9HXHJcblxyXG5cdHVuaWZvcm0gdmVjMyBmb2dDb2xvcjtcclxuXHR2YXJ5aW5nIGZsb2F0IHZGb2dEZXB0aDtcclxuXHJcblx0I2lmZGVmIEZPR19FWFAyXHJcblxyXG5cdFx0dW5pZm9ybSBmbG9hdCBmb2dEZW5zaXR5O1xyXG5cclxuXHQjZWxzZVxyXG5cclxuXHRcdHVuaWZvcm0gZmxvYXQgZm9nTmVhcjtcclxuXHRcdHVuaWZvcm0gZmxvYXQgZm9nRmFyO1xyXG5cclxuXHQjZW5kaWZcclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG5cclxuI2lmZGVmIFVTRV9HUkFESUVOVE1BUFxyXG5cclxuXHR1bmlmb3JtIHNhbXBsZXIyRCBncmFkaWVudE1hcDtcclxuXHJcbiNlbmRpZlxyXG5cclxudmVjMyBnZXRHcmFkaWVudElycmFkaWFuY2UoIHZlYzMgbm9ybWFsLCB2ZWMzIGxpZ2h0RGlyZWN0aW9uICkge1xyXG5cclxuXHQvLyBkb3ROTCB3aWxsIGJlIGZyb20gLTEuMCB0byAxLjBcclxuXHRmbG9hdCBkb3ROTCA9IGRvdCggbm9ybWFsLCBsaWdodERpcmVjdGlvbiApO1xyXG5cdHZlYzIgY29vcmQgPSB2ZWMyKCBkb3ROTCAqIDAuNSArIDAuNSwgMC4wICk7XHJcblxyXG5cdCNpZmRlZiBVU0VfR1JBRElFTlRNQVBcclxuXHJcblx0XHRyZXR1cm4gdmVjMyggdGV4dHVyZTJEKCBncmFkaWVudE1hcCwgY29vcmQgKS5yICk7XHJcblxyXG5cdCNlbHNlXHJcblxyXG5cdFx0dmVjMiBmdyA9IGZ3aWR0aCggY29vcmQgKSAqIDAuNTtcclxuXHRcdHJldHVybiBtaXgoIHZlYzMoIDAuNyApLCB2ZWMzKCAxLjAgKSwgc21vb3Roc3RlcCggMC43IC0gZncueCwgMC43ICsgZncueCwgY29vcmQueCApICk7XHJcblxyXG5cdCNlbmRpZlxyXG5cclxufVxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jaWZkZWYgVVNFX0xJR0hUTUFQXHJcblxyXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGxpZ2h0TWFwO1xyXG5cdHVuaWZvcm0gZmxvYXQgbGlnaHRNYXBJbnRlbnNpdHk7XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuTGFtYmVydE1hdGVyaWFsIG1hdGVyaWFsO1xyXG5tYXRlcmlhbC5kaWZmdXNlQ29sb3IgPSBkaWZmdXNlQ29sb3IucmdiO1xyXG5tYXRlcmlhbC5zcGVjdWxhclN0cmVuZ3RoID0gc3BlY3VsYXJTdHJlbmd0aDtcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxudmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XHJcblxyXG5zdHJ1Y3QgTGFtYmVydE1hdGVyaWFsIHtcclxuXHJcblx0dmVjMyBkaWZmdXNlQ29sb3I7XHJcblx0ZmxvYXQgc3BlY3VsYXJTdHJlbmd0aDtcclxuXHJcbn07XHJcblxyXG52b2lkIFJFX0RpcmVjdF9MYW1iZXJ0KCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0LCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5UG9zaXRpb24sIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlOb3JtYWwsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlWaWV3RGlyLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBjb25zdCBpbiBMYW1iZXJ0TWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xyXG5cclxuXHRmbG9hdCBkb3ROTCA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Tm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKSApO1xyXG5cdHZlYzMgaXJyYWRpYW5jZSA9IGRvdE5MICogZGlyZWN0TGlnaHQuY29sb3I7XHJcblxyXG5cdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XHJcblxyXG59XHJcblxyXG52b2lkIFJFX0luZGlyZWN0RGlmZnVzZV9MYW1iZXJ0KCBjb25zdCBpbiB2ZWMzIGlycmFkaWFuY2UsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlQb3NpdGlvbiwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeU5vcm1hbCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVZpZXdEaXIsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIGNvbnN0IGluIExhbWJlcnRNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XHJcblxyXG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcclxuXHJcbn1cclxuXHJcbiNkZWZpbmUgUkVfRGlyZWN0XHRcdFx0XHRSRV9EaXJlY3RfTGFtYmVydFxyXG4jZGVmaW5lIFJFX0luZGlyZWN0RGlmZnVzZVx0XHRSRV9JbmRpcmVjdERpZmZ1c2VfTGFtYmVydFxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG51bmlmb3JtIGJvb2wgcmVjZWl2ZVNoYWRvdztcclxudW5pZm9ybSB2ZWMzIGFtYmllbnRMaWdodENvbG9yO1xyXG5cclxuI2lmIGRlZmluZWQoIFVTRV9MSUdIVF9QUk9CRVMgKVxyXG5cclxuXHR1bmlmb3JtIHZlYzMgbGlnaHRQcm9iZVsgOSBdO1xyXG5cclxuI2VuZGlmXHJcblxyXG4vLyBnZXQgdGhlIGlycmFkaWFuY2UgKHJhZGlhbmNlIGNvbnZvbHZlZCB3aXRoIGNvc2luZSBsb2JlKSBhdCB0aGUgcG9pbnQgJ25vcm1hbCcgb24gdGhlIHVuaXQgc3BoZXJlXHJcbi8vIHNvdXJjZTogaHR0cHM6Ly9ncmFwaGljcy5zdGFuZm9yZC5lZHUvcGFwZXJzL2Vudm1hcC9lbnZtYXAucGRmXHJcbnZlYzMgc2hHZXRJcnJhZGlhbmNlQXQoIGluIHZlYzMgbm9ybWFsLCBpbiB2ZWMzIHNoQ29lZmZpY2llbnRzWyA5IF0gKSB7XHJcblxyXG5cdC8vIG5vcm1hbCBpcyBhc3N1bWVkIHRvIGhhdmUgdW5pdCBsZW5ndGhcclxuXHJcblx0ZmxvYXQgeCA9IG5vcm1hbC54LCB5ID0gbm9ybWFsLnksIHogPSBub3JtYWwuejtcclxuXHJcblx0Ly8gYmFuZCAwXHJcblx0dmVjMyByZXN1bHQgPSBzaENvZWZmaWNpZW50c1sgMCBdICogMC44ODYyMjc7XHJcblxyXG5cdC8vIGJhbmQgMVxyXG5cdHJlc3VsdCArPSBzaENvZWZmaWNpZW50c1sgMSBdICogMi4wICogMC41MTE2NjQgKiB5O1xyXG5cdHJlc3VsdCArPSBzaENvZWZmaWNpZW50c1sgMiBdICogMi4wICogMC41MTE2NjQgKiB6O1xyXG5cdHJlc3VsdCArPSBzaENvZWZmaWNpZW50c1sgMyBdICogMi4wICogMC41MTE2NjQgKiB4O1xyXG5cclxuXHQvLyBiYW5kIDJcclxuXHRyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDQgXSAqIDIuMCAqIDAuNDI5MDQzICogeCAqIHk7XHJcblx0cmVzdWx0ICs9IHNoQ29lZmZpY2llbnRzWyA1IF0gKiAyLjAgKiAwLjQyOTA0MyAqIHkgKiB6O1xyXG5cdHJlc3VsdCArPSBzaENvZWZmaWNpZW50c1sgNiBdICogKCAwLjc0MzEyNSAqIHogKiB6IC0gMC4yNDc3MDggKTtcclxuXHRyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDcgXSAqIDIuMCAqIDAuNDI5MDQzICogeCAqIHo7XHJcblx0cmVzdWx0ICs9IHNoQ29lZmZpY2llbnRzWyA4IF0gKiAwLjQyOTA0MyAqICggeCAqIHggLSB5ICogeSApO1xyXG5cclxuXHRyZXR1cm4gcmVzdWx0O1xyXG5cclxufVxyXG5cclxudmVjMyBnZXRMaWdodFByb2JlSXJyYWRpYW5jZSggY29uc3QgaW4gdmVjMyBsaWdodFByb2JlWyA5IF0sIGNvbnN0IGluIHZlYzMgbm9ybWFsICkge1xyXG5cclxuXHR2ZWMzIHdvcmxkTm9ybWFsID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggbm9ybWFsLCB2aWV3TWF0cml4ICk7XHJcblxyXG5cdHZlYzMgaXJyYWRpYW5jZSA9IHNoR2V0SXJyYWRpYW5jZUF0KCB3b3JsZE5vcm1hbCwgbGlnaHRQcm9iZSApO1xyXG5cclxuXHRyZXR1cm4gaXJyYWRpYW5jZTtcclxuXHJcbn1cclxuXHJcbnZlYzMgZ2V0QW1iaWVudExpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gdmVjMyBhbWJpZW50TGlnaHRDb2xvciApIHtcclxuXHJcblx0dmVjMyBpcnJhZGlhbmNlID0gYW1iaWVudExpZ2h0Q29sb3I7XHJcblxyXG5cdHJldHVybiBpcnJhZGlhbmNlO1xyXG5cclxufVxyXG5cclxuZmxvYXQgZ2V0RGlzdGFuY2VBdHRlbnVhdGlvbiggY29uc3QgaW4gZmxvYXQgbGlnaHREaXN0YW5jZSwgY29uc3QgaW4gZmxvYXQgY3V0b2ZmRGlzdGFuY2UsIGNvbnN0IGluIGZsb2F0IGRlY2F5RXhwb25lbnQgKSB7XHJcblxyXG5cdC8vIGJhc2VkIHVwb24gRnJvc3RiaXRlIDMgTW92aW5nIHRvIFBoeXNpY2FsbHktYmFzZWQgUmVuZGVyaW5nXHJcblx0Ly8gcGFnZSAzMiwgZXF1YXRpb24gMjY6IEVbd2luZG93MV1cclxuXHQvLyBodHRwczovL3NlYmxhZ2FyZGUuZmlsZXMud29yZHByZXNzLmNvbS8yMDE1LzA3L2NvdXJzZV9ub3Rlc19tb3ZpbmdfZnJvc3RiaXRlX3RvX3Bicl92MzIucGRmXHJcblx0ZmxvYXQgZGlzdGFuY2VGYWxsb2ZmID0gMS4wIC8gbWF4KCBwb3coIGxpZ2h0RGlzdGFuY2UsIGRlY2F5RXhwb25lbnQgKSwgMC4wMSApO1xyXG5cclxuXHRpZiAoIGN1dG9mZkRpc3RhbmNlID4gMC4wICkge1xyXG5cclxuXHRcdGRpc3RhbmNlRmFsbG9mZiAqPSBwb3cyKCBzYXR1cmF0ZSggMS4wIC0gcG93NCggbGlnaHREaXN0YW5jZSAvIGN1dG9mZkRpc3RhbmNlICkgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiBkaXN0YW5jZUZhbGxvZmY7XHJcblxyXG59XHJcblxyXG5mbG9hdCBnZXRTcG90QXR0ZW51YXRpb24oIGNvbnN0IGluIGZsb2F0IGNvbmVDb3NpbmUsIGNvbnN0IGluIGZsb2F0IHBlbnVtYnJhQ29zaW5lLCBjb25zdCBpbiBmbG9hdCBhbmdsZUNvc2luZSApIHtcclxuXHJcblx0cmV0dXJuIHNtb290aHN0ZXAoIGNvbmVDb3NpbmUsIHBlbnVtYnJhQ29zaW5lLCBhbmdsZUNvc2luZSApO1xyXG5cclxufVxyXG5cclxuI2lmIE5VTV9ESVJfTElHSFRTID4gMFxyXG5cclxuXHRzdHJ1Y3QgRGlyZWN0aW9uYWxMaWdodCB7XHJcblx0XHR2ZWMzIGRpcmVjdGlvbjtcclxuXHRcdHZlYzMgY29sb3I7XHJcblx0fTtcclxuXHJcblx0dW5pZm9ybSBEaXJlY3Rpb25hbExpZ2h0IGRpcmVjdGlvbmFsTGlnaHRzWyBOVU1fRElSX0xJR0hUUyBdO1xyXG5cclxuXHR2b2lkIGdldERpcmVjdGlvbmFsTGlnaHRJbmZvKCBjb25zdCBpbiBEaXJlY3Rpb25hbExpZ2h0IGRpcmVjdGlvbmFsTGlnaHQsIG91dCBJbmNpZGVudExpZ2h0IGxpZ2h0ICkge1xyXG5cclxuXHRcdGxpZ2h0LmNvbG9yID0gZGlyZWN0aW9uYWxMaWdodC5jb2xvcjtcclxuXHRcdGxpZ2h0LmRpcmVjdGlvbiA9IGRpcmVjdGlvbmFsTGlnaHQuZGlyZWN0aW9uO1xyXG5cdFx0bGlnaHQudmlzaWJsZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcbiNlbmRpZlxyXG5cclxuXHJcbiNpZiBOVU1fUE9JTlRfTElHSFRTID4gMFxyXG5cclxuXHRzdHJ1Y3QgUG9pbnRMaWdodCB7XHJcblx0XHR2ZWMzIHBvc2l0aW9uO1xyXG5cdFx0dmVjMyBjb2xvcjtcclxuXHRcdGZsb2F0IGRpc3RhbmNlO1xyXG5cdFx0ZmxvYXQgZGVjYXk7XHJcblx0fTtcclxuXHJcblx0dW5pZm9ybSBQb2ludExpZ2h0IHBvaW50TGlnaHRzWyBOVU1fUE9JTlRfTElHSFRTIF07XHJcblxyXG5cdC8vIGxpZ2h0IGlzIGFuIG91dCBwYXJhbWV0ZXIgYXMgaGF2aW5nIGl0IGFzIGEgcmV0dXJuIHZhbHVlIGNhdXNlZCBjb21waWxlciBlcnJvcnMgb24gc29tZSBkZXZpY2VzXHJcblx0dm9pZCBnZXRQb2ludExpZ2h0SW5mbyggY29uc3QgaW4gUG9pbnRMaWdodCBwb2ludExpZ2h0LCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5UG9zaXRpb24sIG91dCBJbmNpZGVudExpZ2h0IGxpZ2h0ICkge1xyXG5cclxuXHRcdHZlYzMgbFZlY3RvciA9IHBvaW50TGlnaHQucG9zaXRpb24gLSBnZW9tZXRyeVBvc2l0aW9uO1xyXG5cclxuXHRcdGxpZ2h0LmRpcmVjdGlvbiA9IG5vcm1hbGl6ZSggbFZlY3RvciApO1xyXG5cclxuXHRcdGZsb2F0IGxpZ2h0RGlzdGFuY2UgPSBsZW5ndGgoIGxWZWN0b3IgKTtcclxuXHJcblx0XHRsaWdodC5jb2xvciA9IHBvaW50TGlnaHQuY29sb3I7XHJcblx0XHRsaWdodC5jb2xvciAqPSBnZXREaXN0YW5jZUF0dGVudWF0aW9uKCBsaWdodERpc3RhbmNlLCBwb2ludExpZ2h0LmRpc3RhbmNlLCBwb2ludExpZ2h0LmRlY2F5ICk7XHJcblx0XHRsaWdodC52aXNpYmxlID0gKCBsaWdodC5jb2xvciAhPSB2ZWMzKCAwLjAgKSApO1xyXG5cclxuXHR9XHJcblxyXG4jZW5kaWZcclxuXHJcblxyXG4jaWYgTlVNX1NQT1RfTElHSFRTID4gMFxyXG5cclxuXHRzdHJ1Y3QgU3BvdExpZ2h0IHtcclxuXHRcdHZlYzMgcG9zaXRpb247XHJcblx0XHR2ZWMzIGRpcmVjdGlvbjtcclxuXHRcdHZlYzMgY29sb3I7XHJcblx0XHRmbG9hdCBkaXN0YW5jZTtcclxuXHRcdGZsb2F0IGRlY2F5O1xyXG5cdFx0ZmxvYXQgY29uZUNvcztcclxuXHRcdGZsb2F0IHBlbnVtYnJhQ29zO1xyXG5cdH07XHJcblxyXG5cdHVuaWZvcm0gU3BvdExpZ2h0IHNwb3RMaWdodHNbIE5VTV9TUE9UX0xJR0hUUyBdO1xyXG5cclxuXHQvLyBsaWdodCBpcyBhbiBvdXQgcGFyYW1ldGVyIGFzIGhhdmluZyBpdCBhcyBhIHJldHVybiB2YWx1ZSBjYXVzZWQgY29tcGlsZXIgZXJyb3JzIG9uIHNvbWUgZGV2aWNlc1xyXG5cdHZvaWQgZ2V0U3BvdExpZ2h0SW5mbyggY29uc3QgaW4gU3BvdExpZ2h0IHNwb3RMaWdodCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVBvc2l0aW9uLCBvdXQgSW5jaWRlbnRMaWdodCBsaWdodCApIHtcclxuXHJcblx0XHR2ZWMzIGxWZWN0b3IgPSBzcG90TGlnaHQucG9zaXRpb24gLSBnZW9tZXRyeVBvc2l0aW9uO1xyXG5cclxuXHRcdGxpZ2h0LmRpcmVjdGlvbiA9IG5vcm1hbGl6ZSggbFZlY3RvciApO1xyXG5cclxuXHRcdGZsb2F0IGFuZ2xlQ29zID0gZG90KCBsaWdodC5kaXJlY3Rpb24sIHNwb3RMaWdodC5kaXJlY3Rpb24gKTtcclxuXHJcblx0XHRmbG9hdCBzcG90QXR0ZW51YXRpb24gPSBnZXRTcG90QXR0ZW51YXRpb24oIHNwb3RMaWdodC5jb25lQ29zLCBzcG90TGlnaHQucGVudW1icmFDb3MsIGFuZ2xlQ29zICk7XHJcblxyXG5cdFx0aWYgKCBzcG90QXR0ZW51YXRpb24gPiAwLjAgKSB7XHJcblxyXG5cdFx0XHRmbG9hdCBsaWdodERpc3RhbmNlID0gbGVuZ3RoKCBsVmVjdG9yICk7XHJcblxyXG5cdFx0XHRsaWdodC5jb2xvciA9IHNwb3RMaWdodC5jb2xvciAqIHNwb3RBdHRlbnVhdGlvbjtcclxuXHRcdFx0bGlnaHQuY29sb3IgKj0gZ2V0RGlzdGFuY2VBdHRlbnVhdGlvbiggbGlnaHREaXN0YW5jZSwgc3BvdExpZ2h0LmRpc3RhbmNlLCBzcG90TGlnaHQuZGVjYXkgKTtcclxuXHRcdFx0bGlnaHQudmlzaWJsZSA9ICggbGlnaHQuY29sb3IgIT0gdmVjMyggMC4wICkgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0bGlnaHQuY29sb3IgPSB2ZWMzKCAwLjAgKTtcclxuXHRcdFx0bGlnaHQudmlzaWJsZSA9IGZhbHNlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuI2VuZGlmXHJcblxyXG5cclxuI2lmIE5VTV9SRUNUX0FSRUFfTElHSFRTID4gMFxyXG5cclxuXHRzdHJ1Y3QgUmVjdEFyZWFMaWdodCB7XHJcblx0XHR2ZWMzIGNvbG9yO1xyXG5cdFx0dmVjMyBwb3NpdGlvbjtcclxuXHRcdHZlYzMgaGFsZldpZHRoO1xyXG5cdFx0dmVjMyBoYWxmSGVpZ2h0O1xyXG5cdH07XHJcblxyXG5cdC8vIFByZS1jb21wdXRlZCB2YWx1ZXMgb2YgTGluZWFyVHJhbnNmb3JtZWRDb3NpbmUgYXBwcm94aW1hdGlvbiBvZiBCUkRGXHJcblx0Ly8gQlJERiBhcHByb3hpbWF0aW9uIFRleHR1cmUgaXMgNjR4NjRcclxuXHR1bmlmb3JtIHNhbXBsZXIyRCBsdGNfMTsgLy8gUkdCQSBGbG9hdFxyXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGx0Y18yOyAvLyBSR0JBIEZsb2F0XHJcblxyXG5cdHVuaWZvcm0gUmVjdEFyZWFMaWdodCByZWN0QXJlYUxpZ2h0c1sgTlVNX1JFQ1RfQVJFQV9MSUdIVFMgXTtcclxuXHJcbiNlbmRpZlxyXG5cclxuXHJcbiNpZiBOVU1fSEVNSV9MSUdIVFMgPiAwXHJcblxyXG5cdHN0cnVjdCBIZW1pc3BoZXJlTGlnaHQge1xyXG5cdFx0dmVjMyBkaXJlY3Rpb247XHJcblx0XHR2ZWMzIHNreUNvbG9yO1xyXG5cdFx0dmVjMyBncm91bmRDb2xvcjtcclxuXHR9O1xyXG5cclxuXHR1bmlmb3JtIEhlbWlzcGhlcmVMaWdodCBoZW1pc3BoZXJlTGlnaHRzWyBOVU1fSEVNSV9MSUdIVFMgXTtcclxuXHJcblx0dmVjMyBnZXRIZW1pc3BoZXJlTGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiBIZW1pc3BoZXJlTGlnaHQgaGVtaUxpZ2h0LCBjb25zdCBpbiB2ZWMzIG5vcm1hbCApIHtcclxuXHJcblx0XHRmbG9hdCBkb3ROTCA9IGRvdCggbm9ybWFsLCBoZW1pTGlnaHQuZGlyZWN0aW9uICk7XHJcblx0XHRmbG9hdCBoZW1pRGlmZnVzZVdlaWdodCA9IDAuNSAqIGRvdE5MICsgMC41O1xyXG5cclxuXHRcdHZlYzMgaXJyYWRpYW5jZSA9IG1peCggaGVtaUxpZ2h0Lmdyb3VuZENvbG9yLCBoZW1pTGlnaHQuc2t5Q29sb3IsIGhlbWlEaWZmdXNlV2VpZ2h0ICk7XHJcblxyXG5cdFx0cmV0dXJuIGlycmFkaWFuY2U7XHJcblxyXG5cdH1cclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jaWZkZWYgVVNFX0VOVk1BUFxyXG5cclxuXHR2ZWMzIGdldElCTElycmFkaWFuY2UoIGNvbnN0IGluIHZlYzMgbm9ybWFsICkge1xyXG5cclxuXHRcdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFX1VWXHJcblxyXG5cdFx0XHR2ZWMzIHdvcmxkTm9ybWFsID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggbm9ybWFsLCB2aWV3TWF0cml4ICk7XHJcblxyXG5cdFx0XHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZUN1YmVVViggZW52TWFwLCBlbnZNYXBSb3RhdGlvbiAqIHdvcmxkTm9ybWFsLCAxLjAgKTtcclxuXHJcblx0XHRcdHJldHVybiBQSSAqIGVudk1hcENvbG9yLnJnYiAqIGVudk1hcEludGVuc2l0eTtcclxuXHJcblx0XHQjZWxzZVxyXG5cclxuXHRcdFx0cmV0dXJuIHZlYzMoIDAuMCApO1xyXG5cclxuXHRcdCNlbmRpZlxyXG5cclxuXHR9XHJcblxyXG5cdHZlYzMgZ2V0SUJMUmFkaWFuY2UoIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHtcclxuXHJcblx0XHQjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRV9VVlxyXG5cclxuXHRcdFx0dmVjMyByZWZsZWN0VmVjID0gcmVmbGVjdCggLSB2aWV3RGlyLCBub3JtYWwgKTtcclxuXHJcblx0XHRcdC8vIE1peGluZyB0aGUgcmVmbGVjdGlvbiB3aXRoIHRoZSBub3JtYWwgaXMgbW9yZSBhY2N1cmF0ZSBhbmQga2VlcHMgcm91Z2ggb2JqZWN0cyBmcm9tIGdhdGhlcmluZyBsaWdodCBmcm9tIGJlaGluZCB0aGVpciB0YW5nZW50IHBsYW5lLlxyXG5cdFx0XHRyZWZsZWN0VmVjID0gbm9ybWFsaXplKCBtaXgoIHJlZmxlY3RWZWMsIG5vcm1hbCwgcm91Z2huZXNzICogcm91Z2huZXNzKSApO1xyXG5cclxuXHRcdFx0cmVmbGVjdFZlYyA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIHJlZmxlY3RWZWMsIHZpZXdNYXRyaXggKTtcclxuXHJcblx0XHRcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZVVWKCBlbnZNYXAsIGVudk1hcFJvdGF0aW9uICogcmVmbGVjdFZlYywgcm91Z2huZXNzICk7XHJcblxyXG5cdFx0XHRyZXR1cm4gZW52TWFwQ29sb3IucmdiICogZW52TWFwSW50ZW5zaXR5O1xyXG5cclxuXHRcdCNlbHNlXHJcblxyXG5cdFx0XHRyZXR1cm4gdmVjMyggMC4wICk7XHJcblxyXG5cdFx0I2VuZGlmXHJcblxyXG5cdH1cclxuXHJcblx0I2lmZGVmIFVTRV9BTklTT1RST1BZXHJcblxyXG5cdFx0dmVjMyBnZXRJQkxBbmlzb3Ryb3B5UmFkaWFuY2UoIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gdmVjMyBiaXRhbmdlbnQsIGNvbnN0IGluIGZsb2F0IGFuaXNvdHJvcHkgKSB7XHJcblxyXG5cdFx0XHQjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRV9VVlxyXG5cclxuXHRcdFx0ICAvLyBodHRwczovL2dvb2dsZS5naXRodWIuaW8vZmlsYW1lbnQvRmlsYW1lbnQubWQuaHRtbCNsaWdodGluZy9pbWFnZWJhc2VkbGlnaHRzL2FuaXNvdHJvcHlcclxuXHRcdFx0XHR2ZWMzIGJlbnROb3JtYWwgPSBjcm9zcyggYml0YW5nZW50LCB2aWV3RGlyICk7XHJcblx0XHRcdFx0YmVudE5vcm1hbCA9IG5vcm1hbGl6ZSggY3Jvc3MoIGJlbnROb3JtYWwsIGJpdGFuZ2VudCApICk7XHJcblx0XHRcdFx0YmVudE5vcm1hbCA9IG5vcm1hbGl6ZSggbWl4KCBiZW50Tm9ybWFsLCBub3JtYWwsIHBvdzIoIHBvdzIoIDEuMCAtIGFuaXNvdHJvcHkgKiAoIDEuMCAtIHJvdWdobmVzcyApICkgKSApICk7XHJcblxyXG5cdFx0XHRcdHJldHVybiBnZXRJQkxSYWRpYW5jZSggdmlld0RpciwgYmVudE5vcm1hbCwgcm91Z2huZXNzICk7XHJcblxyXG5cdFx0XHQjZWxzZVxyXG5cclxuXHRcdFx0XHRyZXR1cm4gdmVjMyggMC4wICk7XHJcblxyXG5cdFx0XHQjZW5kaWZcclxuXHJcblx0XHR9XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcblRvb25NYXRlcmlhbCBtYXRlcmlhbDtcclxubWF0ZXJpYWwuZGlmZnVzZUNvbG9yID0gZGlmZnVzZUNvbG9yLnJnYjtcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxudmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XHJcblxyXG5zdHJ1Y3QgVG9vbk1hdGVyaWFsIHtcclxuXHJcblx0dmVjMyBkaWZmdXNlQ29sb3I7XHJcblxyXG59O1xyXG5cclxudm9pZCBSRV9EaXJlY3RfVG9vbiggY29uc3QgaW4gSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVBvc2l0aW9uLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Tm9ybWFsLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Vmlld0RpciwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgY29uc3QgaW4gVG9vbk1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcclxuXHJcblx0dmVjMyBpcnJhZGlhbmNlID0gZ2V0R3JhZGllbnRJcnJhZGlhbmNlKCBnZW9tZXRyeU5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKiBkaXJlY3RMaWdodC5jb2xvcjtcclxuXHJcblx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcclxuXHJcbn1cclxuXHJcbnZvaWQgUkVfSW5kaXJlY3REaWZmdXNlX1Rvb24oIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVBvc2l0aW9uLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Tm9ybWFsLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Vmlld0RpciwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgY29uc3QgaW4gVG9vbk1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcclxuXHJcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xyXG5cclxufVxyXG5cclxuI2RlZmluZSBSRV9EaXJlY3RcdFx0XHRcdFJFX0RpcmVjdF9Ub29uXHJcbiNkZWZpbmUgUkVfSW5kaXJlY3REaWZmdXNlXHRcdFJFX0luZGlyZWN0RGlmZnVzZV9Ub29uXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbkJsaW5uUGhvbmdNYXRlcmlhbCBtYXRlcmlhbDtcclxubWF0ZXJpYWwuZGlmZnVzZUNvbG9yID0gZGlmZnVzZUNvbG9yLnJnYjtcclxubWF0ZXJpYWwuc3BlY3VsYXJDb2xvciA9IHNwZWN1bGFyO1xyXG5tYXRlcmlhbC5zcGVjdWxhclNoaW5pbmVzcyA9IHNoaW5pbmVzcztcclxubWF0ZXJpYWwuc3BlY3VsYXJTdHJlbmd0aCA9IHNwZWN1bGFyU3RyZW5ndGg7XHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xyXG5cclxuc3RydWN0IEJsaW5uUGhvbmdNYXRlcmlhbCB7XHJcblxyXG5cdHZlYzMgZGlmZnVzZUNvbG9yO1xyXG5cdHZlYzMgc3BlY3VsYXJDb2xvcjtcclxuXHRmbG9hdCBzcGVjdWxhclNoaW5pbmVzcztcclxuXHRmbG9hdCBzcGVjdWxhclN0cmVuZ3RoO1xyXG5cclxufTtcclxuXHJcbnZvaWQgUkVfRGlyZWN0X0JsaW5uUGhvbmcoIGNvbnN0IGluIEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlQb3NpdGlvbiwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeU5vcm1hbCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVZpZXdEaXIsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIGNvbnN0IGluIEJsaW5uUGhvbmdNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XHJcblxyXG5cdGZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnlOb3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICk7XHJcblx0dmVjMyBpcnJhZGlhbmNlID0gZG90TkwgKiBkaXJlY3RMaWdodC5jb2xvcjtcclxuXHJcblx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcclxuXHJcblx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKz0gaXJyYWRpYW5jZSAqIEJSREZfQmxpbm5QaG9uZyggZGlyZWN0TGlnaHQuZGlyZWN0aW9uLCBnZW9tZXRyeVZpZXdEaXIsIGdlb21ldHJ5Tm9ybWFsLCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhclNoaW5pbmVzcyApICogbWF0ZXJpYWwuc3BlY3VsYXJTdHJlbmd0aDtcclxuXHJcbn1cclxuXHJcbnZvaWQgUkVfSW5kaXJlY3REaWZmdXNlX0JsaW5uUGhvbmcoIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVBvc2l0aW9uLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Tm9ybWFsLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Vmlld0RpciwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgY29uc3QgaW4gQmxpbm5QaG9uZ01hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcclxuXHJcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xyXG5cclxufVxyXG5cclxuI2RlZmluZSBSRV9EaXJlY3RcdFx0XHRcdFJFX0RpcmVjdF9CbGlublBob25nXHJcbiNkZWZpbmUgUkVfSW5kaXJlY3REaWZmdXNlXHRcdFJFX0luZGlyZWN0RGlmZnVzZV9CbGlublBob25nXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcblBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWw7XHJcbm1hdGVyaWFsLmRpZmZ1c2VDb2xvciA9IGRpZmZ1c2VDb2xvci5yZ2IgKiAoIDEuMCAtIG1ldGFsbmVzc0ZhY3RvciApO1xyXG5cclxudmVjMyBkeHkgPSBtYXgoIGFicyggZEZkeCggbm9uUGVydHVyYmVkTm9ybWFsICkgKSwgYWJzKCBkRmR5KCBub25QZXJ0dXJiZWROb3JtYWwgKSApICk7XHJcbmZsb2F0IGdlb21ldHJ5Um91Z2huZXNzID0gbWF4KCBtYXgoIGR4eS54LCBkeHkueSApLCBkeHkueiApO1xyXG5cclxubWF0ZXJpYWwucm91Z2huZXNzID0gbWF4KCByb3VnaG5lc3NGYWN0b3IsIDAuMDUyNSApOy8vIDAuMDUyNSBjb3JyZXNwb25kcyB0byB0aGUgYmFzZSBtaXAgb2YgYSAyNTYgY3ViZW1hcC5cclxubWF0ZXJpYWwucm91Z2huZXNzICs9IGdlb21ldHJ5Um91Z2huZXNzO1xyXG5tYXRlcmlhbC5yb3VnaG5lc3MgPSBtaW4oIG1hdGVyaWFsLnJvdWdobmVzcywgMS4wICk7XHJcblxyXG4jaWZkZWYgSU9SXHJcblxyXG5cdG1hdGVyaWFsLmlvciA9IGlvcjtcclxuXHJcblx0I2lmZGVmIFVTRV9TUEVDVUxBUlxyXG5cclxuXHRcdGZsb2F0IHNwZWN1bGFySW50ZW5zaXR5RmFjdG9yID0gc3BlY3VsYXJJbnRlbnNpdHk7XHJcblx0XHR2ZWMzIHNwZWN1bGFyQ29sb3JGYWN0b3IgPSBzcGVjdWxhckNvbG9yO1xyXG5cclxuXHRcdCNpZmRlZiBVU0VfU1BFQ1VMQVJfQ09MT1JNQVBcclxuXHJcblx0XHRcdHNwZWN1bGFyQ29sb3JGYWN0b3IgKj0gdGV4dHVyZTJEKCBzcGVjdWxhckNvbG9yTWFwLCB2U3BlY3VsYXJDb2xvck1hcFV2ICkucmdiO1xyXG5cclxuXHRcdCNlbmRpZlxyXG5cclxuXHRcdCNpZmRlZiBVU0VfU1BFQ1VMQVJfSU5URU5TSVRZTUFQXHJcblxyXG5cdFx0XHRzcGVjdWxhckludGVuc2l0eUZhY3RvciAqPSB0ZXh0dXJlMkQoIHNwZWN1bGFySW50ZW5zaXR5TWFwLCB2U3BlY3VsYXJJbnRlbnNpdHlNYXBVdiApLmE7XHJcblxyXG5cdFx0I2VuZGlmXHJcblxyXG5cdFx0bWF0ZXJpYWwuc3BlY3VsYXJGOTAgPSBtaXgoIHNwZWN1bGFySW50ZW5zaXR5RmFjdG9yLCAxLjAsIG1ldGFsbmVzc0ZhY3RvciApO1xyXG5cclxuXHQjZWxzZVxyXG5cclxuXHRcdGZsb2F0IHNwZWN1bGFySW50ZW5zaXR5RmFjdG9yID0gMS4wO1xyXG5cdFx0dmVjMyBzcGVjdWxhckNvbG9yRmFjdG9yID0gdmVjMyggMS4wICk7XHJcblx0XHRtYXRlcmlhbC5zcGVjdWxhckY5MCA9IDEuMDtcclxuXHJcblx0I2VuZGlmXHJcblxyXG5cdG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgPSBtaXgoIG1pbiggcG93MiggKCBtYXRlcmlhbC5pb3IgLSAxLjAgKSAvICggbWF0ZXJpYWwuaW9yICsgMS4wICkgKSAqIHNwZWN1bGFyQ29sb3JGYWN0b3IsIHZlYzMoIDEuMCApICkgKiBzcGVjdWxhckludGVuc2l0eUZhY3RvciwgZGlmZnVzZUNvbG9yLnJnYiwgbWV0YWxuZXNzRmFjdG9yICk7XHJcblxyXG4jZWxzZVxyXG5cclxuXHRtYXRlcmlhbC5zcGVjdWxhckNvbG9yID0gbWl4KCB2ZWMzKCAwLjA0ICksIGRpZmZ1c2VDb2xvci5yZ2IsIG1ldGFsbmVzc0ZhY3RvciApO1xyXG5cdG1hdGVyaWFsLnNwZWN1bGFyRjkwID0gMS4wO1xyXG5cclxuI2VuZGlmXHJcblxyXG4jaWZkZWYgVVNFX0NMRUFSQ09BVFxyXG5cclxuXHRtYXRlcmlhbC5jbGVhcmNvYXQgPSBjbGVhcmNvYXQ7XHJcblx0bWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzID0gY2xlYXJjb2F0Um91Z2huZXNzO1xyXG5cdG1hdGVyaWFsLmNsZWFyY29hdEYwID0gdmVjMyggMC4wNCApO1xyXG5cdG1hdGVyaWFsLmNsZWFyY29hdEY5MCA9IDEuMDtcclxuXHJcblx0I2lmZGVmIFVTRV9DTEVBUkNPQVRNQVBcclxuXHJcblx0XHRtYXRlcmlhbC5jbGVhcmNvYXQgKj0gdGV4dHVyZTJEKCBjbGVhcmNvYXRNYXAsIHZDbGVhcmNvYXRNYXBVdiApLng7XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuXHQjaWZkZWYgVVNFX0NMRUFSQ09BVF9ST1VHSE5FU1NNQVBcclxuXHJcblx0XHRtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgKj0gdGV4dHVyZTJEKCBjbGVhcmNvYXRSb3VnaG5lc3NNYXAsIHZDbGVhcmNvYXRSb3VnaG5lc3NNYXBVdiApLnk7XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuXHRtYXRlcmlhbC5jbGVhcmNvYXQgPSBzYXR1cmF0ZSggbWF0ZXJpYWwuY2xlYXJjb2F0ICk7IC8vIEJ1cmxleSBjbGVhcmNvYXQgbW9kZWxcclxuXHRtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgPSBtYXgoIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcywgMC4wNTI1ICk7XHJcblx0bWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzICs9IGdlb21ldHJ5Um91Z2huZXNzO1xyXG5cdG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcyA9IG1pbiggbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzLCAxLjAgKTtcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmZGVmIFVTRV9ESVNQRVJTSU9OXHJcblxyXG5cdG1hdGVyaWFsLmRpc3BlcnNpb24gPSBkaXNwZXJzaW9uO1xyXG5cclxuI2VuZGlmXHJcblxyXG4jaWZkZWYgVVNFX0lSSURFU0NFTkNFXHJcblxyXG5cdG1hdGVyaWFsLmlyaWRlc2NlbmNlID0gaXJpZGVzY2VuY2U7XHJcblx0bWF0ZXJpYWwuaXJpZGVzY2VuY2VJT1IgPSBpcmlkZXNjZW5jZUlPUjtcclxuXHJcblx0I2lmZGVmIFVTRV9JUklERVNDRU5DRU1BUFxyXG5cclxuXHRcdG1hdGVyaWFsLmlyaWRlc2NlbmNlICo9IHRleHR1cmUyRCggaXJpZGVzY2VuY2VNYXAsIHZJcmlkZXNjZW5jZU1hcFV2ICkucjtcclxuXHJcblx0I2VuZGlmXHJcblxyXG5cdCNpZmRlZiBVU0VfSVJJREVTQ0VOQ0VfVEhJQ0tORVNTTUFQXHJcblxyXG5cdFx0bWF0ZXJpYWwuaXJpZGVzY2VuY2VUaGlja25lc3MgPSAoaXJpZGVzY2VuY2VUaGlja25lc3NNYXhpbXVtIC0gaXJpZGVzY2VuY2VUaGlja25lc3NNaW5pbXVtKSAqIHRleHR1cmUyRCggaXJpZGVzY2VuY2VUaGlja25lc3NNYXAsIHZJcmlkZXNjZW5jZVRoaWNrbmVzc01hcFV2ICkuZyArIGlyaWRlc2NlbmNlVGhpY2tuZXNzTWluaW11bTtcclxuXHJcblx0I2Vsc2VcclxuXHJcblx0XHRtYXRlcmlhbC5pcmlkZXNjZW5jZVRoaWNrbmVzcyA9IGlyaWRlc2NlbmNlVGhpY2tuZXNzTWF4aW11bTtcclxuXHJcblx0I2VuZGlmXHJcblxyXG4jZW5kaWZcclxuXHJcbiNpZmRlZiBVU0VfU0hFRU5cclxuXHJcblx0bWF0ZXJpYWwuc2hlZW5Db2xvciA9IHNoZWVuQ29sb3I7XHJcblxyXG5cdCNpZmRlZiBVU0VfU0hFRU5fQ09MT1JNQVBcclxuXHJcblx0XHRtYXRlcmlhbC5zaGVlbkNvbG9yICo9IHRleHR1cmUyRCggc2hlZW5Db2xvck1hcCwgdlNoZWVuQ29sb3JNYXBVdiApLnJnYjtcclxuXHJcblx0I2VuZGlmXHJcblxyXG5cdG1hdGVyaWFsLnNoZWVuUm91Z2huZXNzID0gY2xhbXAoIHNoZWVuUm91Z2huZXNzLCAwLjA3LCAxLjAgKTtcclxuXHJcblx0I2lmZGVmIFVTRV9TSEVFTl9ST1VHSE5FU1NNQVBcclxuXHJcblx0XHRtYXRlcmlhbC5zaGVlblJvdWdobmVzcyAqPSB0ZXh0dXJlMkQoIHNoZWVuUm91Z2huZXNzTWFwLCB2U2hlZW5Sb3VnaG5lc3NNYXBVdiApLmE7XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuI2VuZGlmXHJcblxyXG4jaWZkZWYgVVNFX0FOSVNPVFJPUFlcclxuXHJcblx0I2lmZGVmIFVTRV9BTklTT1RST1BZTUFQXHJcblxyXG5cdFx0bWF0MiBhbmlzb3Ryb3B5TWF0ID0gbWF0MiggYW5pc290cm9weVZlY3Rvci54LCBhbmlzb3Ryb3B5VmVjdG9yLnksIC0gYW5pc290cm9weVZlY3Rvci55LCBhbmlzb3Ryb3B5VmVjdG9yLnggKTtcclxuXHRcdHZlYzMgYW5pc290cm9weVBvbGFyID0gdGV4dHVyZTJEKCBhbmlzb3Ryb3B5TWFwLCB2QW5pc290cm9weU1hcFV2ICkucmdiO1xyXG5cdFx0dmVjMiBhbmlzb3Ryb3B5ViA9IGFuaXNvdHJvcHlNYXQgKiBub3JtYWxpemUoIDIuMCAqIGFuaXNvdHJvcHlQb2xhci5yZyAtIHZlYzIoIDEuMCApICkgKiBhbmlzb3Ryb3B5UG9sYXIuYjtcclxuXHJcblx0I2Vsc2VcclxuXHJcblx0XHR2ZWMyIGFuaXNvdHJvcHlWID0gYW5pc290cm9weVZlY3RvcjtcclxuXHJcblx0I2VuZGlmXHJcblxyXG5cdG1hdGVyaWFsLmFuaXNvdHJvcHkgPSBsZW5ndGgoIGFuaXNvdHJvcHlWICk7XHJcblxyXG5cdGlmKCBtYXRlcmlhbC5hbmlzb3Ryb3B5ID09IDAuMCApIHtcclxuXHRcdGFuaXNvdHJvcHlWID0gdmVjMiggMS4wLCAwLjAgKTtcclxuXHR9IGVsc2Uge1xyXG5cdFx0YW5pc290cm9weVYgLz0gbWF0ZXJpYWwuYW5pc290cm9weTtcclxuXHRcdG1hdGVyaWFsLmFuaXNvdHJvcHkgPSBzYXR1cmF0ZSggbWF0ZXJpYWwuYW5pc290cm9weSApO1xyXG5cdH1cclxuXHJcblx0Ly8gUm91Z2huZXNzIGFsb25nIHRoZSBhbmlzb3Ryb3B5IGJpdGFuZ2VudCBpcyB0aGUgbWF0ZXJpYWwgcm91Z2huZXNzLCB3aGlsZSB0aGUgdGFuZ2VudCByb3VnaG5lc3MgaW5jcmVhc2VzIHdpdGggYW5pc290cm9weS5cclxuXHRtYXRlcmlhbC5hbHBoYVQgPSBtaXgoIHBvdzIoIG1hdGVyaWFsLnJvdWdobmVzcyApLCAxLjAsIHBvdzIoIG1hdGVyaWFsLmFuaXNvdHJvcHkgKSApO1xyXG5cclxuXHRtYXRlcmlhbC5hbmlzb3Ryb3B5VCA9IHRiblsgMCBdICogYW5pc290cm9weVYueCArIHRiblsgMSBdICogYW5pc290cm9weVYueTtcclxuXHRtYXRlcmlhbC5hbmlzb3Ryb3B5QiA9IHRiblsgMSBdICogYW5pc290cm9weVYueCAtIHRiblsgMCBdICogYW5pc290cm9weVYueTtcclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG5cclxuc3RydWN0IFBoeXNpY2FsTWF0ZXJpYWwge1xyXG5cclxuXHR2ZWMzIGRpZmZ1c2VDb2xvcjtcclxuXHRmbG9hdCByb3VnaG5lc3M7XHJcblx0dmVjMyBzcGVjdWxhckNvbG9yO1xyXG5cdGZsb2F0IHNwZWN1bGFyRjkwO1xyXG5cdGZsb2F0IGRpc3BlcnNpb247XHJcblxyXG5cdCNpZmRlZiBVU0VfQ0xFQVJDT0FUXHJcblx0XHRmbG9hdCBjbGVhcmNvYXQ7XHJcblx0XHRmbG9hdCBjbGVhcmNvYXRSb3VnaG5lc3M7XHJcblx0XHR2ZWMzIGNsZWFyY29hdEYwO1xyXG5cdFx0ZmxvYXQgY2xlYXJjb2F0RjkwO1xyXG5cdCNlbmRpZlxyXG5cclxuXHQjaWZkZWYgVVNFX0lSSURFU0NFTkNFXHJcblx0XHRmbG9hdCBpcmlkZXNjZW5jZTtcclxuXHRcdGZsb2F0IGlyaWRlc2NlbmNlSU9SO1xyXG5cdFx0ZmxvYXQgaXJpZGVzY2VuY2VUaGlja25lc3M7XHJcblx0XHR2ZWMzIGlyaWRlc2NlbmNlRnJlc25lbDtcclxuXHRcdHZlYzMgaXJpZGVzY2VuY2VGMDtcclxuXHQjZW5kaWZcclxuXHJcblx0I2lmZGVmIFVTRV9TSEVFTlxyXG5cdFx0dmVjMyBzaGVlbkNvbG9yO1xyXG5cdFx0ZmxvYXQgc2hlZW5Sb3VnaG5lc3M7XHJcblx0I2VuZGlmXHJcblxyXG5cdCNpZmRlZiBJT1JcclxuXHRcdGZsb2F0IGlvcjtcclxuXHQjZW5kaWZcclxuXHJcblx0I2lmZGVmIFVTRV9UUkFOU01JU1NJT05cclxuXHRcdGZsb2F0IHRyYW5zbWlzc2lvbjtcclxuXHRcdGZsb2F0IHRyYW5zbWlzc2lvbkFscGhhO1xyXG5cdFx0ZmxvYXQgdGhpY2tuZXNzO1xyXG5cdFx0ZmxvYXQgYXR0ZW51YXRpb25EaXN0YW5jZTtcclxuXHRcdHZlYzMgYXR0ZW51YXRpb25Db2xvcjtcclxuXHQjZW5kaWZcclxuXHJcblx0I2lmZGVmIFVTRV9BTklTT1RST1BZXHJcblx0XHRmbG9hdCBhbmlzb3Ryb3B5O1xyXG5cdFx0ZmxvYXQgYWxwaGFUO1xyXG5cdFx0dmVjMyBhbmlzb3Ryb3B5VDtcclxuXHRcdHZlYzMgYW5pc290cm9weUI7XHJcblx0I2VuZGlmXHJcblxyXG59O1xyXG5cclxuLy8gdGVtcG9yYXJ5XHJcbnZlYzMgY2xlYXJjb2F0U3BlY3VsYXJEaXJlY3QgPSB2ZWMzKCAwLjAgKTtcclxudmVjMyBjbGVhcmNvYXRTcGVjdWxhckluZGlyZWN0ID0gdmVjMyggMC4wICk7XHJcbnZlYzMgc2hlZW5TcGVjdWxhckRpcmVjdCA9IHZlYzMoIDAuMCApO1xyXG52ZWMzIHNoZWVuU3BlY3VsYXJJbmRpcmVjdCA9IHZlYzMoMC4wICk7XHJcblxyXG52ZWMzIFNjaGxpY2tfdG9fRjAoIGNvbnN0IGluIHZlYzMgZiwgY29uc3QgaW4gZmxvYXQgZjkwLCBjb25zdCBpbiBmbG9hdCBkb3RWSCApIHtcclxuICAgIGZsb2F0IHggPSBjbGFtcCggMS4wIC0gZG90VkgsIDAuMCwgMS4wICk7XHJcbiAgICBmbG9hdCB4MiA9IHggKiB4O1xyXG4gICAgZmxvYXQgeDUgPSBjbGFtcCggeCAqIHgyICogeDIsIDAuMCwgMC45OTk5ICk7XHJcblxyXG4gICAgcmV0dXJuICggZiAtIHZlYzMoIGY5MCApICogeDUgKSAvICggMS4wIC0geDUgKTtcclxufVxyXG5cclxuLy8gTW92aW5nIEZyb3N0Yml0ZSB0byBQaHlzaWNhbGx5IEJhc2VkIFJlbmRlcmluZyAzLjAgLSBwYWdlIDEyLCBsaXN0aW5nIDJcclxuLy8gaHR0cHM6Ly9zZWJsYWdhcmRlLmZpbGVzLndvcmRwcmVzcy5jb20vMjAxNS8wNy9jb3Vyc2Vfbm90ZXNfbW92aW5nX2Zyb3N0Yml0ZV90b19wYnJfdjMyLnBkZlxyXG5mbG9hdCBWX0dHWF9TbWl0aENvcnJlbGF0ZWQoIGNvbnN0IGluIGZsb2F0IGFscGhhLCBjb25zdCBpbiBmbG9hdCBkb3ROTCwgY29uc3QgaW4gZmxvYXQgZG90TlYgKSB7XHJcblxyXG5cdGZsb2F0IGEyID0gcG93MiggYWxwaGEgKTtcclxuXHJcblx0ZmxvYXQgZ3YgPSBkb3ROTCAqIHNxcnQoIGEyICsgKCAxLjAgLSBhMiApICogcG93MiggZG90TlYgKSApO1xyXG5cdGZsb2F0IGdsID0gZG90TlYgKiBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5MICkgKTtcclxuXHJcblx0cmV0dXJuIDAuNSAvIG1heCggZ3YgKyBnbCwgRVBTSUxPTiApO1xyXG5cclxufVxyXG5cclxuLy8gTWljcm9mYWNldCBNb2RlbHMgZm9yIFJlZnJhY3Rpb24gdGhyb3VnaCBSb3VnaCBTdXJmYWNlcyAtIGVxdWF0aW9uICgzMylcclxuLy8gaHR0cDovL2dyYXBoaWNyYW50cy5ibG9nc3BvdC5jb20vMjAxMy8wOC9zcGVjdWxhci1icmRmLXJlZmVyZW5jZS5odG1sXHJcbi8vIGFscGhhIGlzIFwicm91Z2huZXNzIHNxdWFyZWRcIiBpbiBEaXNuZXnigJlzIHJlcGFyYW1ldGVyaXphdGlvblxyXG5mbG9hdCBEX0dHWCggY29uc3QgaW4gZmxvYXQgYWxwaGEsIGNvbnN0IGluIGZsb2F0IGRvdE5IICkge1xyXG5cclxuXHRmbG9hdCBhMiA9IHBvdzIoIGFscGhhICk7XHJcblxyXG5cdGZsb2F0IGRlbm9tID0gcG93MiggZG90TkggKSAqICggYTIgLSAxLjAgKSArIDEuMDsgLy8gYXZvaWQgYWxwaGEgPSAwIHdpdGggZG90TkggPSAxXHJcblxyXG5cdHJldHVybiBSRUNJUFJPQ0FMX1BJICogYTIgLyBwb3cyKCBkZW5vbSApO1xyXG5cclxufVxyXG5cclxuLy8gaHR0cHM6Ly9nb29nbGUuZ2l0aHViLmlvL2ZpbGFtZW50L0ZpbGFtZW50Lm1kLmh0bWwjbWF0ZXJpYWxzeXN0ZW0vYW5pc290cm9waWNtb2RlbC9hbmlzb3Ryb3BpY3NwZWN1bGFyYnJkZlxyXG4jaWZkZWYgVVNFX0FOSVNPVFJPUFlcclxuXHJcblx0ZmxvYXQgVl9HR1hfU21pdGhDb3JyZWxhdGVkX0FuaXNvdHJvcGljKCBjb25zdCBpbiBmbG9hdCBhbHBoYVQsIGNvbnN0IGluIGZsb2F0IGFscGhhQiwgY29uc3QgaW4gZmxvYXQgZG90VFYsIGNvbnN0IGluIGZsb2F0IGRvdEJWLCBjb25zdCBpbiBmbG9hdCBkb3RUTCwgY29uc3QgaW4gZmxvYXQgZG90QkwsIGNvbnN0IGluIGZsb2F0IGRvdE5WLCBjb25zdCBpbiBmbG9hdCBkb3ROTCApIHtcclxuXHJcblx0XHRmbG9hdCBndiA9IGRvdE5MICogbGVuZ3RoKCB2ZWMzKCBhbHBoYVQgKiBkb3RUViwgYWxwaGFCICogZG90QlYsIGRvdE5WICkgKTtcclxuXHRcdGZsb2F0IGdsID0gZG90TlYgKiBsZW5ndGgoIHZlYzMoIGFscGhhVCAqIGRvdFRMLCBhbHBoYUIgKiBkb3RCTCwgZG90TkwgKSApO1xyXG5cdFx0ZmxvYXQgdiA9IDAuNSAvICggZ3YgKyBnbCApO1xyXG5cclxuXHRcdHJldHVybiBzYXR1cmF0ZSh2KTtcclxuXHJcblx0fVxyXG5cclxuXHRmbG9hdCBEX0dHWF9Bbmlzb3Ryb3BpYyggY29uc3QgaW4gZmxvYXQgYWxwaGFULCBjb25zdCBpbiBmbG9hdCBhbHBoYUIsIGNvbnN0IGluIGZsb2F0IGRvdE5ILCBjb25zdCBpbiBmbG9hdCBkb3RUSCwgY29uc3QgaW4gZmxvYXQgZG90QkggKSB7XHJcblxyXG5cdFx0ZmxvYXQgYTIgPSBhbHBoYVQgKiBhbHBoYUI7XHJcblx0XHRoaWdocCB2ZWMzIHYgPSB2ZWMzKCBhbHBoYUIgKiBkb3RUSCwgYWxwaGFUICogZG90QkgsIGEyICogZG90TkggKTtcclxuXHRcdGhpZ2hwIGZsb2F0IHYyID0gZG90KCB2LCB2ICk7XHJcblx0XHRmbG9hdCB3MiA9IGEyIC8gdjI7XHJcblxyXG5cdFx0cmV0dXJuIFJFQ0lQUk9DQUxfUEkgKiBhMiAqIHBvdzIgKCB3MiApO1xyXG5cclxuXHR9XHJcblxyXG4jZW5kaWZcclxuXHJcbiNpZmRlZiBVU0VfQ0xFQVJDT0FUXHJcblxyXG5cdC8vIEdHWCBEaXN0cmlidXRpb24sIFNjaGxpY2sgRnJlc25lbCwgR0dYX1NtaXRoQ29ycmVsYXRlZCBWaXNpYmlsaXR5XHJcblx0dmVjMyBCUkRGX0dHWF9DbGVhcmNvYXQoIGNvbnN0IGluIHZlYzMgbGlnaHREaXIsIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwpIHtcclxuXHJcblx0XHR2ZWMzIGYwID0gbWF0ZXJpYWwuY2xlYXJjb2F0RjA7XHJcblx0XHRmbG9hdCBmOTAgPSBtYXRlcmlhbC5jbGVhcmNvYXRGOTA7XHJcblx0XHRmbG9hdCByb3VnaG5lc3MgPSBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3M7XHJcblxyXG5cdFx0ZmxvYXQgYWxwaGEgPSBwb3cyKCByb3VnaG5lc3MgKTsgLy8gVUU0J3Mgcm91Z2huZXNzXHJcblxyXG5cdFx0dmVjMyBoYWxmRGlyID0gbm9ybWFsaXplKCBsaWdodERpciArIHZpZXdEaXIgKTtcclxuXHJcblx0XHRmbG9hdCBkb3ROTCA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgbGlnaHREaXIgKSApO1xyXG5cdFx0ZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIHZpZXdEaXIgKSApO1xyXG5cdFx0ZmxvYXQgZG90TkggPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIGhhbGZEaXIgKSApO1xyXG5cdFx0ZmxvYXQgZG90VkggPSBzYXR1cmF0ZSggZG90KCB2aWV3RGlyLCBoYWxmRGlyICkgKTtcclxuXHJcblx0XHR2ZWMzIEYgPSBGX1NjaGxpY2soIGYwLCBmOTAsIGRvdFZIICk7XHJcblxyXG5cdFx0ZmxvYXQgViA9IFZfR0dYX1NtaXRoQ29ycmVsYXRlZCggYWxwaGEsIGRvdE5MLCBkb3ROViApO1xyXG5cclxuXHRcdGZsb2F0IEQgPSBEX0dHWCggYWxwaGEsIGRvdE5IICk7XHJcblxyXG5cdFx0cmV0dXJuIEYgKiAoIFYgKiBEICk7XHJcblxyXG5cdH1cclxuXHJcbiNlbmRpZlxyXG5cclxudmVjMyBCUkRGX0dHWCggY29uc3QgaW4gdmVjMyBsaWdodERpciwgY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCApIHtcclxuXHJcblx0dmVjMyBmMCA9IG1hdGVyaWFsLnNwZWN1bGFyQ29sb3I7XHJcblx0ZmxvYXQgZjkwID0gbWF0ZXJpYWwuc3BlY3VsYXJGOTA7XHJcblx0ZmxvYXQgcm91Z2huZXNzID0gbWF0ZXJpYWwucm91Z2huZXNzO1xyXG5cclxuXHRmbG9hdCBhbHBoYSA9IHBvdzIoIHJvdWdobmVzcyApOyAvLyBVRTQncyByb3VnaG5lc3NcclxuXHJcblx0dmVjMyBoYWxmRGlyID0gbm9ybWFsaXplKCBsaWdodERpciArIHZpZXdEaXIgKTtcclxuXHJcblx0ZmxvYXQgZG90TkwgPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIGxpZ2h0RGlyICkgKTtcclxuXHRmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgdmlld0RpciApICk7XHJcblx0ZmxvYXQgZG90TkggPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIGhhbGZEaXIgKSApO1xyXG5cdGZsb2F0IGRvdFZIID0gc2F0dXJhdGUoIGRvdCggdmlld0RpciwgaGFsZkRpciApICk7XHJcblxyXG5cdHZlYzMgRiA9IEZfU2NobGljayggZjAsIGY5MCwgZG90VkggKTtcclxuXHJcblx0I2lmZGVmIFVTRV9JUklERVNDRU5DRVxyXG5cclxuXHRcdEYgPSBtaXgoIEYsIG1hdGVyaWFsLmlyaWRlc2NlbmNlRnJlc25lbCwgbWF0ZXJpYWwuaXJpZGVzY2VuY2UgKTtcclxuXHJcblx0I2VuZGlmXHJcblxyXG5cdCNpZmRlZiBVU0VfQU5JU09UUk9QWVxyXG5cclxuXHRcdGZsb2F0IGRvdFRMID0gZG90KCBtYXRlcmlhbC5hbmlzb3Ryb3B5VCwgbGlnaHREaXIgKTtcclxuXHRcdGZsb2F0IGRvdFRWID0gZG90KCBtYXRlcmlhbC5hbmlzb3Ryb3B5VCwgdmlld0RpciApO1xyXG5cdFx0ZmxvYXQgZG90VEggPSBkb3QoIG1hdGVyaWFsLmFuaXNvdHJvcHlULCBoYWxmRGlyICk7XHJcblx0XHRmbG9hdCBkb3RCTCA9IGRvdCggbWF0ZXJpYWwuYW5pc290cm9weUIsIGxpZ2h0RGlyICk7XHJcblx0XHRmbG9hdCBkb3RCViA9IGRvdCggbWF0ZXJpYWwuYW5pc290cm9weUIsIHZpZXdEaXIgKTtcclxuXHRcdGZsb2F0IGRvdEJIID0gZG90KCBtYXRlcmlhbC5hbmlzb3Ryb3B5QiwgaGFsZkRpciApO1xyXG5cclxuXHRcdGZsb2F0IFYgPSBWX0dHWF9TbWl0aENvcnJlbGF0ZWRfQW5pc290cm9waWMoIG1hdGVyaWFsLmFscGhhVCwgYWxwaGEsIGRvdFRWLCBkb3RCViwgZG90VEwsIGRvdEJMLCBkb3ROViwgZG90TkwgKTtcclxuXHJcblx0XHRmbG9hdCBEID0gRF9HR1hfQW5pc290cm9waWMoIG1hdGVyaWFsLmFscGhhVCwgYWxwaGEsIGRvdE5ILCBkb3RUSCwgZG90QkggKTtcclxuXHJcblx0I2Vsc2VcclxuXHJcblx0XHRmbG9hdCBWID0gVl9HR1hfU21pdGhDb3JyZWxhdGVkKCBhbHBoYSwgZG90TkwsIGRvdE5WICk7XHJcblxyXG5cdFx0ZmxvYXQgRCA9IERfR0dYKCBhbHBoYSwgZG90TkggKTtcclxuXHJcblx0I2VuZGlmXHJcblxyXG5cdHJldHVybiBGICogKCBWICogRCApO1xyXG5cclxufVxyXG5cclxuLy8gUmVjdCBBcmVhIExpZ2h0XHJcblxyXG4vLyBSZWFsLVRpbWUgUG9seWdvbmFsLUxpZ2h0IFNoYWRpbmcgd2l0aCBMaW5lYXJseSBUcmFuc2Zvcm1lZCBDb3NpbmVzXHJcbi8vIGJ5IEVyaWMgSGVpdHosIEpvbmF0aGFuIER1cHV5LCBTdGVwaGVuIEhpbGwgYW5kIERhdmlkIE5ldWJlbHRcclxuLy8gY29kZTogaHR0cHM6Ly9naXRodWIuY29tL3NlbGZzaGFkb3cvbHRjX2NvZGUvXHJcblxyXG52ZWMyIExUQ19VdiggY29uc3QgaW4gdmVjMyBOLCBjb25zdCBpbiB2ZWMzIFYsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHtcclxuXHJcblx0Y29uc3QgZmxvYXQgTFVUX1NJWkUgPSA2NC4wO1xyXG5cdGNvbnN0IGZsb2F0IExVVF9TQ0FMRSA9ICggTFVUX1NJWkUgLSAxLjAgKSAvIExVVF9TSVpFO1xyXG5cdGNvbnN0IGZsb2F0IExVVF9CSUFTID0gMC41IC8gTFVUX1NJWkU7XHJcblxyXG5cdGZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggTiwgViApICk7XHJcblxyXG5cdC8vIHRleHR1cmUgcGFyYW1ldGVyaXplZCBieSBzcXJ0KCBHR1ggYWxwaGEgKSBhbmQgc3FydCggMSAtIGNvcyggdGhldGEgKSApXHJcblx0dmVjMiB1diA9IHZlYzIoIHJvdWdobmVzcywgc3FydCggMS4wIC0gZG90TlYgKSApO1xyXG5cclxuXHR1diA9IHV2ICogTFVUX1NDQUxFICsgTFVUX0JJQVM7XHJcblxyXG5cdHJldHVybiB1djtcclxuXHJcbn1cclxuXHJcbmZsb2F0IExUQ19DbGlwcGVkU3BoZXJlRm9ybUZhY3RvciggY29uc3QgaW4gdmVjMyBmICkge1xyXG5cclxuXHQvLyBSZWFsLVRpbWUgQXJlYSBMaWdodGluZzogYSBKb3VybmV5IGZyb20gUmVzZWFyY2ggdG8gUHJvZHVjdGlvbiAocC4xMDIpXHJcblx0Ly8gQW4gYXBwcm94aW1hdGlvbiBvZiB0aGUgZm9ybSBmYWN0b3Igb2YgYSBob3Jpem9uLWNsaXBwZWQgcmVjdGFuZ2xlLlxyXG5cclxuXHRmbG9hdCBsID0gbGVuZ3RoKCBmICk7XHJcblxyXG5cdHJldHVybiBtYXgoICggbCAqIGwgKyBmLnogKSAvICggbCArIDEuMCApLCAwLjAgKTtcclxuXHJcbn1cclxuXHJcbnZlYzMgTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb25zdCBpbiB2ZWMzIHYxLCBjb25zdCBpbiB2ZWMzIHYyICkge1xyXG5cclxuXHRmbG9hdCB4ID0gZG90KCB2MSwgdjIgKTtcclxuXHJcblx0ZmxvYXQgeSA9IGFicyggeCApO1xyXG5cclxuXHQvLyByYXRpb25hbCBwb2x5bm9taWFsIGFwcHJveGltYXRpb24gdG8gdGhldGEgLyBzaW4oIHRoZXRhICkgLyAyUElcclxuXHRmbG9hdCBhID0gMC44NTQzOTg1ICsgKCAwLjQ5NjUxNTUgKyAwLjAxNDUyMDYgKiB5ICkgKiB5O1xyXG5cdGZsb2F0IGIgPSAzLjQxNzU5NDAgKyAoIDQuMTYxNjcyNCArIHkgKSAqIHk7XHJcblx0ZmxvYXQgdiA9IGEgLyBiO1xyXG5cclxuXHRmbG9hdCB0aGV0YV9zaW50aGV0YSA9ICggeCA+IDAuMCApID8gdiA6IDAuNSAqIGludmVyc2VzcXJ0KCBtYXgoIDEuMCAtIHggKiB4LCAxZS03ICkgKSAtIHY7XHJcblxyXG5cdHJldHVybiBjcm9zcyggdjEsIHYyICkgKiB0aGV0YV9zaW50aGV0YTtcclxuXHJcbn1cclxuXHJcbnZlYzMgTFRDX0V2YWx1YXRlKCBjb25zdCBpbiB2ZWMzIE4sIGNvbnN0IGluIHZlYzMgViwgY29uc3QgaW4gdmVjMyBQLCBjb25zdCBpbiBtYXQzIG1JbnYsIGNvbnN0IGluIHZlYzMgcmVjdENvb3Jkc1sgNCBdICkge1xyXG5cclxuXHQvLyBiYWlsIGlmIHBvaW50IGlzIG9uIGJhY2sgc2lkZSBvZiBwbGFuZSBvZiBsaWdodFxyXG5cdC8vIGFzc3VtZXMgY2N3IHdpbmRpbmcgb3JkZXIgb2YgbGlnaHQgdmVydGljZXNcclxuXHR2ZWMzIHYxID0gcmVjdENvb3Jkc1sgMSBdIC0gcmVjdENvb3Jkc1sgMCBdO1xyXG5cdHZlYzMgdjIgPSByZWN0Q29vcmRzWyAzIF0gLSByZWN0Q29vcmRzWyAwIF07XHJcblx0dmVjMyBsaWdodE5vcm1hbCA9IGNyb3NzKCB2MSwgdjIgKTtcclxuXHJcblx0aWYoIGRvdCggbGlnaHROb3JtYWwsIFAgLSByZWN0Q29vcmRzWyAwIF0gKSA8IDAuMCApIHJldHVybiB2ZWMzKCAwLjAgKTtcclxuXHJcblx0Ly8gY29uc3RydWN0IG9ydGhvbm9ybWFsIGJhc2lzIGFyb3VuZCBOXHJcblx0dmVjMyBUMSwgVDI7XHJcblx0VDEgPSBub3JtYWxpemUoIFYgLSBOICogZG90KCBWLCBOICkgKTtcclxuXHRUMiA9IC0gY3Jvc3MoIE4sIFQxICk7IC8vIG5lZ2F0ZWQgZnJvbSBwYXBlcjsgcG9zc2libHkgZHVlIHRvIGEgZGlmZmVyZW50IGhhbmRlZG5lc3Mgb2Ygd29ybGQgY29vcmRpbmF0ZSBzeXN0ZW1cclxuXHJcblx0Ly8gY29tcHV0ZSB0cmFuc2Zvcm1cclxuXHRtYXQzIG1hdCA9IG1JbnYgKiB0cmFuc3Bvc2VNYXQzKCBtYXQzKCBUMSwgVDIsIE4gKSApO1xyXG5cclxuXHQvLyB0cmFuc2Zvcm0gcmVjdFxyXG5cdHZlYzMgY29vcmRzWyA0IF07XHJcblx0Y29vcmRzWyAwIF0gPSBtYXQgKiAoIHJlY3RDb29yZHNbIDAgXSAtIFAgKTtcclxuXHRjb29yZHNbIDEgXSA9IG1hdCAqICggcmVjdENvb3Jkc1sgMSBdIC0gUCApO1xyXG5cdGNvb3Jkc1sgMiBdID0gbWF0ICogKCByZWN0Q29vcmRzWyAyIF0gLSBQICk7XHJcblx0Y29vcmRzWyAzIF0gPSBtYXQgKiAoIHJlY3RDb29yZHNbIDMgXSAtIFAgKTtcclxuXHJcblx0Ly8gcHJvamVjdCByZWN0IG9udG8gc3BoZXJlXHJcblx0Y29vcmRzWyAwIF0gPSBub3JtYWxpemUoIGNvb3Jkc1sgMCBdICk7XHJcblx0Y29vcmRzWyAxIF0gPSBub3JtYWxpemUoIGNvb3Jkc1sgMSBdICk7XHJcblx0Y29vcmRzWyAyIF0gPSBub3JtYWxpemUoIGNvb3Jkc1sgMiBdICk7XHJcblx0Y29vcmRzWyAzIF0gPSBub3JtYWxpemUoIGNvb3Jkc1sgMyBdICk7XHJcblxyXG5cdC8vIGNhbGN1bGF0ZSB2ZWN0b3IgZm9ybSBmYWN0b3JcclxuXHR2ZWMzIHZlY3RvckZvcm1GYWN0b3IgPSB2ZWMzKCAwLjAgKTtcclxuXHR2ZWN0b3JGb3JtRmFjdG9yICs9IExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAwIF0sIGNvb3Jkc1sgMSBdICk7XHJcblx0dmVjdG9yRm9ybUZhY3RvciArPSBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMSBdLCBjb29yZHNbIDIgXSApO1xyXG5cdHZlY3RvckZvcm1GYWN0b3IgKz0gTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb29yZHNbIDIgXSwgY29vcmRzWyAzIF0gKTtcclxuXHR2ZWN0b3JGb3JtRmFjdG9yICs9IExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAzIF0sIGNvb3Jkc1sgMCBdICk7XHJcblxyXG5cdC8vIGFkanVzdCBmb3IgaG9yaXpvbiBjbGlwcGluZ1xyXG5cdGZsb2F0IHJlc3VsdCA9IExUQ19DbGlwcGVkU3BoZXJlRm9ybUZhY3RvciggdmVjdG9yRm9ybUZhY3RvciApO1xyXG5cclxuLypcclxuXHQvLyBhbHRlcm5hdGUgbWV0aG9kIG9mIGFkanVzdGluZyBmb3IgaG9yaXpvbiBjbGlwcGluZyAoc2VlIHJlZmVyZW5jZSlcclxuXHQvLyByZWZhY3RvcmluZyByZXF1aXJlZFxyXG5cdGZsb2F0IGxlbiA9IGxlbmd0aCggdmVjdG9yRm9ybUZhY3RvciApO1xyXG5cdGZsb2F0IHogPSB2ZWN0b3JGb3JtRmFjdG9yLnogLyBsZW47XHJcblxyXG5cdGNvbnN0IGZsb2F0IExVVF9TSVpFID0gNjQuMDtcclxuXHRjb25zdCBmbG9hdCBMVVRfU0NBTEUgPSAoIExVVF9TSVpFIC0gMS4wICkgLyBMVVRfU0laRTtcclxuXHRjb25zdCBmbG9hdCBMVVRfQklBUyA9IDAuNSAvIExVVF9TSVpFO1xyXG5cclxuXHQvLyB0YWJ1bGF0ZWQgaG9yaXpvbi1jbGlwcGVkIHNwaGVyZSwgYXBwYXJlbnRseS4uLlxyXG5cdHZlYzIgdXYgPSB2ZWMyKCB6ICogMC41ICsgMC41LCBsZW4gKTtcclxuXHR1diA9IHV2ICogTFVUX1NDQUxFICsgTFVUX0JJQVM7XHJcblxyXG5cdGZsb2F0IHNjYWxlID0gdGV4dHVyZTJEKCBsdGNfMiwgdXYgKS53O1xyXG5cclxuXHRmbG9hdCByZXN1bHQgPSBsZW4gKiBzY2FsZTtcclxuKi9cclxuXHJcblx0cmV0dXJuIHZlYzMoIHJlc3VsdCApO1xyXG5cclxufVxyXG5cclxuLy8gRW5kIFJlY3QgQXJlYSBMaWdodFxyXG5cclxuI2lmIGRlZmluZWQoIFVTRV9TSEVFTiApXHJcblxyXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2ZpbGFtZW50L2Jsb2IvbWFzdGVyL3NoYWRlcnMvc3JjL2JyZGYuZnNcclxuZmxvYXQgRF9DaGFybGllKCBmbG9hdCByb3VnaG5lc3MsIGZsb2F0IGRvdE5IICkge1xyXG5cclxuXHRmbG9hdCBhbHBoYSA9IHBvdzIoIHJvdWdobmVzcyApO1xyXG5cclxuXHQvLyBFc3RldmV6IGFuZCBLdWxsYSAyMDE3LCBcIlByb2R1Y3Rpb24gRnJpZW5kbHkgTWljcm9mYWNldCBTaGVlbiBCUkRGXCJcclxuXHRmbG9hdCBpbnZBbHBoYSA9IDEuMCAvIGFscGhhO1xyXG5cdGZsb2F0IGNvczJoID0gZG90TkggKiBkb3ROSDtcclxuXHRmbG9hdCBzaW4yaCA9IG1heCggMS4wIC0gY29zMmgsIDAuMDA3ODEyNSApOyAvLyAyXigtMTQvMiksIHNvIHNpbjJoXjIgPiAwIGluIGZwMTZcclxuXHJcblx0cmV0dXJuICggMi4wICsgaW52QWxwaGEgKSAqIHBvdyggc2luMmgsIGludkFscGhhICogMC41ICkgLyAoIDIuMCAqIFBJICk7XHJcblxyXG59XHJcblxyXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2ZpbGFtZW50L2Jsb2IvbWFzdGVyL3NoYWRlcnMvc3JjL2JyZGYuZnNcclxuZmxvYXQgVl9OZXViZWx0KCBmbG9hdCBkb3ROViwgZmxvYXQgZG90TkwgKSB7XHJcblxyXG5cdC8vIE5ldWJlbHQgYW5kIFBldHRpbmVvIDIwMTMsIFwiQ3JhZnRpbmcgYSBOZXh0LWdlbiBNYXRlcmlhbCBQaXBlbGluZSBmb3IgVGhlIE9yZGVyOiAxODg2XCJcclxuXHRyZXR1cm4gc2F0dXJhdGUoIDEuMCAvICggNC4wICogKCBkb3ROTCArIGRvdE5WIC0gZG90TkwgKiBkb3ROViApICkgKTtcclxuXHJcbn1cclxuXHJcbnZlYzMgQlJERl9TaGVlbiggY29uc3QgaW4gdmVjMyBsaWdodERpciwgY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgdmVjMyBzaGVlbkNvbG9yLCBjb25zdCBpbiBmbG9hdCBzaGVlblJvdWdobmVzcyApIHtcclxuXHJcblx0dmVjMyBoYWxmRGlyID0gbm9ybWFsaXplKCBsaWdodERpciArIHZpZXdEaXIgKTtcclxuXHJcblx0ZmxvYXQgZG90TkwgPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIGxpZ2h0RGlyICkgKTtcclxuXHRmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgdmlld0RpciApICk7XHJcblx0ZmxvYXQgZG90TkggPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIGhhbGZEaXIgKSApO1xyXG5cclxuXHRmbG9hdCBEID0gRF9DaGFybGllKCBzaGVlblJvdWdobmVzcywgZG90TkggKTtcclxuXHRmbG9hdCBWID0gVl9OZXViZWx0KCBkb3ROViwgZG90TkwgKTtcclxuXHJcblx0cmV0dXJuIHNoZWVuQ29sb3IgKiAoIEQgKiBWICk7XHJcblxyXG59XHJcblxyXG4jZW5kaWZcclxuXHJcbi8vIFRoaXMgaXMgYSBjdXJ2ZS1maXQgYXBwcm94aW1hdGlvbiB0byB0aGUgXCJDaGFybGllIHNoZWVuXCIgQlJERiBpbnRlZ3JhdGVkIG92ZXIgdGhlIGhlbWlzcGhlcmUgZnJvbVxyXG4vLyBFc3RldmV6IGFuZCBLdWxsYSAyMDE3LCBcIlByb2R1Y3Rpb24gRnJpZW5kbHkgTWljcm9mYWNldCBTaGVlbiBCUkRGXCIuIFRoZSBhbmFseXNpcyBjYW4gYmUgZm91bmRcclxuLy8gaW4gdGhlIFNoZWVuIHNlY3Rpb24gb2YgaHR0cHM6Ly9kcml2ZS5nb29nbGUuY29tL2ZpbGUvZC8xVDBEMVZTeVI0QWxscUlKVFFBcmFFSXpqbGI1aDRGS0gvdmlldz91c3A9c2hhcmluZ1xyXG5mbG9hdCBJQkxTaGVlbkJSREYoIGNvbnN0IGluIHZlYzMgbm9ybWFsLCBjb25zdCBpbiB2ZWMzIHZpZXdEaXIsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHtcclxuXHJcblx0ZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIHZpZXdEaXIgKSApO1xyXG5cclxuXHRmbG9hdCByMiA9IHJvdWdobmVzcyAqIHJvdWdobmVzcztcclxuXHJcblx0ZmxvYXQgYSA9IHJvdWdobmVzcyA8IDAuMjUgPyAtMzM5LjIgKiByMiArIDE2MS40ICogcm91Z2huZXNzIC0gMjUuOSA6IC04LjQ4ICogcjIgKyAxNC4zICogcm91Z2huZXNzIC0gOS45NTtcclxuXHJcblx0ZmxvYXQgYiA9IHJvdWdobmVzcyA8IDAuMjUgPyA0NC4wICogcjIgLSAyMy43ICogcm91Z2huZXNzICsgMy4yNiA6IDEuOTcgKiByMiAtIDMuMjcgKiByb3VnaG5lc3MgKyAwLjcyO1xyXG5cclxuXHRmbG9hdCBERyA9IGV4cCggYSAqIGRvdE5WICsgYiApICsgKCByb3VnaG5lc3MgPCAwLjI1ID8gMC4wIDogMC4xICogKCByb3VnaG5lc3MgLSAwLjI1ICkgKTtcclxuXHJcblx0cmV0dXJuIHNhdHVyYXRlKCBERyAqIFJFQ0lQUk9DQUxfUEkgKTtcclxuXHJcbn1cclxuXHJcbi8vIEFuYWx5dGljYWwgYXBwcm94aW1hdGlvbiBvZiB0aGUgREZHIExVVCwgb25lIGhhbGYgb2YgdGhlXHJcbi8vIHNwbGl0LXN1bSBhcHByb3hpbWF0aW9uIHVzZWQgaW4gaW5kaXJlY3Qgc3BlY3VsYXIgbGlnaHRpbmcuXHJcbi8vIHZpYSAnZW52aXJvbm1lbnRCUkRGJyBmcm9tIFwiUGh5c2ljYWxseSBCYXNlZCBTaGFkaW5nIG9uIE1vYmlsZVwiXHJcbi8vIGh0dHBzOi8vd3d3LnVucmVhbGVuZ2luZS5jb20vYmxvZy9waHlzaWNhbGx5LWJhc2VkLXNoYWRpbmctb24tbW9iaWxlXHJcbnZlYzIgREZHQXBwcm94KCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XHJcblxyXG5cdGZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCB2aWV3RGlyICkgKTtcclxuXHJcblx0Y29uc3QgdmVjNCBjMCA9IHZlYzQoIC0gMSwgLSAwLjAyNzUsIC0gMC41NzIsIDAuMDIyICk7XHJcblxyXG5cdGNvbnN0IHZlYzQgYzEgPSB2ZWM0KCAxLCAwLjA0MjUsIDEuMDQsIC0gMC4wNCApO1xyXG5cclxuXHR2ZWM0IHIgPSByb3VnaG5lc3MgKiBjMCArIGMxO1xyXG5cclxuXHRmbG9hdCBhMDA0ID0gbWluKCByLnggKiByLngsIGV4cDIoIC0gOS4yOCAqIGRvdE5WICkgKSAqIHIueCArIHIueTtcclxuXHJcblx0dmVjMiBmYWIgPSB2ZWMyKCAtIDEuMDQsIDEuMDQgKSAqIGEwMDQgKyByLnp3O1xyXG5cclxuXHRyZXR1cm4gZmFiO1xyXG5cclxufVxyXG5cclxudmVjMyBFbnZpcm9ubWVudEJSREYoIGNvbnN0IGluIHZlYzMgbm9ybWFsLCBjb25zdCBpbiB2ZWMzIHZpZXdEaXIsIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgc3BlY3VsYXJGOTAsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHtcclxuXHJcblx0dmVjMiBmYWIgPSBERkdBcHByb3goIG5vcm1hbCwgdmlld0Rpciwgcm91Z2huZXNzICk7XHJcblxyXG5cdHJldHVybiBzcGVjdWxhckNvbG9yICogZmFiLnggKyBzcGVjdWxhckY5MCAqIGZhYi55O1xyXG5cclxufVxyXG5cclxuLy8gRmRlei1BZ8O8ZXJhJ3MgXCJNdWx0aXBsZS1TY2F0dGVyaW5nIE1pY3JvZmFjZXQgTW9kZWwgZm9yIFJlYWwtVGltZSBJbWFnZSBCYXNlZCBMaWdodGluZ1wiXHJcbi8vIEFwcHJveGltYXRlcyBtdWx0aXNjYXR0ZXJpbmcgaW4gb3JkZXIgdG8gcHJlc2VydmUgZW5lcmd5LlxyXG4vLyBodHRwOi8vd3d3LmpjZ3Qub3JnL3B1Ymxpc2hlZC8wMDA4LzAxLzAzL1xyXG4jaWZkZWYgVVNFX0lSSURFU0NFTkNFXHJcbnZvaWQgY29tcHV0ZU11bHRpc2NhdHRlcmluZ0lyaWRlc2NlbmNlKCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IHNwZWN1bGFyRjkwLCBjb25zdCBpbiBmbG9hdCBpcmlkZXNjZW5jZSwgY29uc3QgaW4gdmVjMyBpcmlkZXNjZW5jZUYwLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGlub3V0IHZlYzMgc2luZ2xlU2NhdHRlciwgaW5vdXQgdmVjMyBtdWx0aVNjYXR0ZXIgKSB7XHJcbiNlbHNlXHJcbnZvaWQgY29tcHV0ZU11bHRpc2NhdHRlcmluZyggY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCBzcGVjdWxhckY5MCwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzLCBpbm91dCB2ZWMzIHNpbmdsZVNjYXR0ZXIsIGlub3V0IHZlYzMgbXVsdGlTY2F0dGVyICkge1xyXG4jZW5kaWZcclxuXHJcblx0dmVjMiBmYWIgPSBERkdBcHByb3goIG5vcm1hbCwgdmlld0Rpciwgcm91Z2huZXNzICk7XHJcblxyXG5cdCNpZmRlZiBVU0VfSVJJREVTQ0VOQ0VcclxuXHJcblx0XHR2ZWMzIEZyID0gbWl4KCBzcGVjdWxhckNvbG9yLCBpcmlkZXNjZW5jZUYwLCBpcmlkZXNjZW5jZSApO1xyXG5cclxuXHQjZWxzZVxyXG5cclxuXHRcdHZlYzMgRnIgPSBzcGVjdWxhckNvbG9yO1xyXG5cclxuXHQjZW5kaWZcclxuXHJcblx0dmVjMyBGc3NFc3MgPSBGciAqIGZhYi54ICsgc3BlY3VsYXJGOTAgKiBmYWIueTtcclxuXHJcblx0ZmxvYXQgRXNzID0gZmFiLnggKyBmYWIueTtcclxuXHRmbG9hdCBFbXMgPSAxLjAgLSBFc3M7XHJcblxyXG5cdHZlYzMgRmF2ZyA9IEZyICsgKCAxLjAgLSBGciApICogMC4wNDc2MTk7IC8vIDEvMjFcclxuXHR2ZWMzIEZtcyA9IEZzc0VzcyAqIEZhdmcgLyAoIDEuMCAtIEVtcyAqIEZhdmcgKTtcclxuXHJcblx0c2luZ2xlU2NhdHRlciArPSBGc3NFc3M7XHJcblx0bXVsdGlTY2F0dGVyICs9IEZtcyAqIEVtcztcclxuXHJcbn1cclxuXHJcbiNpZiBOVU1fUkVDVF9BUkVBX0xJR0hUUyA+IDBcclxuXHJcblx0dm9pZCBSRV9EaXJlY3RfUmVjdEFyZWFfUGh5c2ljYWwoIGNvbnN0IGluIFJlY3RBcmVhTGlnaHQgcmVjdEFyZWFMaWdodCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVBvc2l0aW9uLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Tm9ybWFsLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Vmlld0RpciwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XHJcblxyXG5cdFx0dmVjMyBub3JtYWwgPSBnZW9tZXRyeU5vcm1hbDtcclxuXHRcdHZlYzMgdmlld0RpciA9IGdlb21ldHJ5Vmlld0RpcjtcclxuXHRcdHZlYzMgcG9zaXRpb24gPSBnZW9tZXRyeVBvc2l0aW9uO1xyXG5cdFx0dmVjMyBsaWdodFBvcyA9IHJlY3RBcmVhTGlnaHQucG9zaXRpb247XHJcblx0XHR2ZWMzIGhhbGZXaWR0aCA9IHJlY3RBcmVhTGlnaHQuaGFsZldpZHRoO1xyXG5cdFx0dmVjMyBoYWxmSGVpZ2h0ID0gcmVjdEFyZWFMaWdodC5oYWxmSGVpZ2h0O1xyXG5cdFx0dmVjMyBsaWdodENvbG9yID0gcmVjdEFyZWFMaWdodC5jb2xvcjtcclxuXHRcdGZsb2F0IHJvdWdobmVzcyA9IG1hdGVyaWFsLnJvdWdobmVzcztcclxuXHJcblx0XHR2ZWMzIHJlY3RDb29yZHNbIDQgXTtcclxuXHRcdHJlY3RDb29yZHNbIDAgXSA9IGxpZ2h0UG9zICsgaGFsZldpZHRoIC0gaGFsZkhlaWdodDsgLy8gY291bnRlcmNsb2Nrd2lzZTsgbGlnaHQgc2hpbmVzIGluIGxvY2FsIG5lZyB6IGRpcmVjdGlvblxyXG5cdFx0cmVjdENvb3Jkc1sgMSBdID0gbGlnaHRQb3MgLSBoYWxmV2lkdGggLSBoYWxmSGVpZ2h0O1xyXG5cdFx0cmVjdENvb3Jkc1sgMiBdID0gbGlnaHRQb3MgLSBoYWxmV2lkdGggKyBoYWxmSGVpZ2h0O1xyXG5cdFx0cmVjdENvb3Jkc1sgMyBdID0gbGlnaHRQb3MgKyBoYWxmV2lkdGggKyBoYWxmSGVpZ2h0O1xyXG5cclxuXHRcdHZlYzIgdXYgPSBMVENfVXYoIG5vcm1hbCwgdmlld0Rpciwgcm91Z2huZXNzICk7XHJcblxyXG5cdFx0dmVjNCB0MSA9IHRleHR1cmUyRCggbHRjXzEsIHV2ICk7XHJcblx0XHR2ZWM0IHQyID0gdGV4dHVyZTJEKCBsdGNfMiwgdXYgKTtcclxuXHJcblx0XHRtYXQzIG1JbnYgPSBtYXQzKFxyXG5cdFx0XHR2ZWMzKCB0MS54LCAwLCB0MS55ICksXHJcblx0XHRcdHZlYzMoICAgIDAsIDEsICAgIDAgKSxcclxuXHRcdFx0dmVjMyggdDEueiwgMCwgdDEudyApXHJcblx0XHQpO1xyXG5cclxuXHRcdC8vIExUQyBGcmVzbmVsIEFwcHJveGltYXRpb24gYnkgU3RlcGhlbiBIaWxsXHJcblx0XHQvLyBodHRwOi8vYmxvZy5zZWxmc2hhZG93LmNvbS9wdWJsaWNhdGlvbnMvczIwMTYtYWR2YW5jZXMvczIwMTZfbHRjX2ZyZXNuZWwucGRmXHJcblx0XHR2ZWMzIGZyZXNuZWwgPSAoIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgKiB0Mi54ICsgKCB2ZWMzKCAxLjAgKSAtIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgKSAqIHQyLnkgKTtcclxuXHJcblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPSBsaWdodENvbG9yICogZnJlc25lbCAqIExUQ19FdmFsdWF0ZSggbm9ybWFsLCB2aWV3RGlyLCBwb3NpdGlvbiwgbUludiwgcmVjdENvb3JkcyApO1xyXG5cclxuXHRcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKz0gbGlnaHRDb2xvciAqIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciAqIExUQ19FdmFsdWF0ZSggbm9ybWFsLCB2aWV3RGlyLCBwb3NpdGlvbiwgbWF0MyggMS4wICksIHJlY3RDb29yZHMgKTtcclxuXHJcblx0fVxyXG5cclxuI2VuZGlmXHJcblxyXG52b2lkIFJFX0RpcmVjdF9QaHlzaWNhbCggY29uc3QgaW4gSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVBvc2l0aW9uLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Tm9ybWFsLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Vmlld0RpciwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XHJcblxyXG5cdGZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnlOb3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICk7XHJcblxyXG5cdHZlYzMgaXJyYWRpYW5jZSA9IGRvdE5MICogZGlyZWN0TGlnaHQuY29sb3I7XHJcblxyXG5cdCNpZmRlZiBVU0VfQ0xFQVJDT0FUXHJcblxyXG5cdFx0ZmxvYXQgZG90TkxjYyA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKSApO1xyXG5cclxuXHRcdHZlYzMgY2NJcnJhZGlhbmNlID0gZG90TkxjYyAqIGRpcmVjdExpZ2h0LmNvbG9yO1xyXG5cclxuXHRcdGNsZWFyY29hdFNwZWN1bGFyRGlyZWN0ICs9IGNjSXJyYWRpYW5jZSAqIEJSREZfR0dYX0NsZWFyY29hdCggZGlyZWN0TGlnaHQuZGlyZWN0aW9uLCBnZW9tZXRyeVZpZXdEaXIsIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBtYXRlcmlhbCApO1xyXG5cclxuXHQjZW5kaWZcclxuXHJcblx0I2lmZGVmIFVTRV9TSEVFTlxyXG5cclxuXHRcdHNoZWVuU3BlY3VsYXJEaXJlY3QgKz0gaXJyYWRpYW5jZSAqIEJSREZfU2hlZW4oIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiwgZ2VvbWV0cnlWaWV3RGlyLCBnZW9tZXRyeU5vcm1hbCwgbWF0ZXJpYWwuc2hlZW5Db2xvciwgbWF0ZXJpYWwuc2hlZW5Sb3VnaG5lc3MgKTtcclxuXHJcblx0I2VuZGlmXHJcblxyXG5cdHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICs9IGlycmFkaWFuY2UgKiBCUkRGX0dHWCggZGlyZWN0TGlnaHQuZGlyZWN0aW9uLCBnZW9tZXRyeVZpZXdEaXIsIGdlb21ldHJ5Tm9ybWFsLCBtYXRlcmlhbCApO1xyXG5cclxuXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xyXG59XHJcblxyXG52b2lkIFJFX0luZGlyZWN0RGlmZnVzZV9QaHlzaWNhbCggY29uc3QgaW4gdmVjMyBpcnJhZGlhbmNlLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5UG9zaXRpb24sIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlOb3JtYWwsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlWaWV3RGlyLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcclxuXHJcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xyXG5cclxufVxyXG5cclxudm9pZCBSRV9JbmRpcmVjdFNwZWN1bGFyX1BoeXNpY2FsKCBjb25zdCBpbiB2ZWMzIHJhZGlhbmNlLCBjb25zdCBpbiB2ZWMzIGlycmFkaWFuY2UsIGNvbnN0IGluIHZlYzMgY2xlYXJjb2F0UmFkaWFuY2UsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlQb3NpdGlvbiwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeU5vcm1hbCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVZpZXdEaXIsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0KSB7XHJcblxyXG5cdCNpZmRlZiBVU0VfQ0xFQVJDT0FUXHJcblxyXG5cdFx0Y2xlYXJjb2F0U3BlY3VsYXJJbmRpcmVjdCArPSBjbGVhcmNvYXRSYWRpYW5jZSAqIEVudmlyb25tZW50QlJERiggZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIGdlb21ldHJ5Vmlld0RpciwgbWF0ZXJpYWwuY2xlYXJjb2F0RjAsIG1hdGVyaWFsLmNsZWFyY29hdEY5MCwgbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzICk7XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuXHQjaWZkZWYgVVNFX1NIRUVOXHJcblxyXG5cdFx0c2hlZW5TcGVjdWxhckluZGlyZWN0ICs9IGlycmFkaWFuY2UgKiBtYXRlcmlhbC5zaGVlbkNvbG9yICogSUJMU2hlZW5CUkRGKCBnZW9tZXRyeU5vcm1hbCwgZ2VvbWV0cnlWaWV3RGlyLCBtYXRlcmlhbC5zaGVlblJvdWdobmVzcyApO1xyXG5cclxuXHQjZW5kaWZcclxuXHJcblx0Ly8gQm90aCBpbmRpcmVjdCBzcGVjdWxhciBhbmQgaW5kaXJlY3QgZGlmZnVzZSBsaWdodCBhY2N1bXVsYXRlIGhlcmVcclxuXHJcblx0dmVjMyBzaW5nbGVTY2F0dGVyaW5nID0gdmVjMyggMC4wICk7XHJcblx0dmVjMyBtdWx0aVNjYXR0ZXJpbmcgPSB2ZWMzKCAwLjAgKTtcclxuXHR2ZWMzIGNvc2luZVdlaWdodGVkSXJyYWRpYW5jZSA9IGlycmFkaWFuY2UgKiBSRUNJUFJPQ0FMX1BJO1xyXG5cclxuXHQjaWZkZWYgVVNFX0lSSURFU0NFTkNFXHJcblxyXG5cdFx0Y29tcHV0ZU11bHRpc2NhdHRlcmluZ0lyaWRlc2NlbmNlKCBnZW9tZXRyeU5vcm1hbCwgZ2VvbWV0cnlWaWV3RGlyLCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhckY5MCwgbWF0ZXJpYWwuaXJpZGVzY2VuY2UsIG1hdGVyaWFsLmlyaWRlc2NlbmNlRnJlc25lbCwgbWF0ZXJpYWwucm91Z2huZXNzLCBzaW5nbGVTY2F0dGVyaW5nLCBtdWx0aVNjYXR0ZXJpbmcgKTtcclxuXHJcblx0I2Vsc2VcclxuXHJcblx0XHRjb21wdXRlTXVsdGlzY2F0dGVyaW5nKCBnZW9tZXRyeU5vcm1hbCwgZ2VvbWV0cnlWaWV3RGlyLCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhckY5MCwgbWF0ZXJpYWwucm91Z2huZXNzLCBzaW5nbGVTY2F0dGVyaW5nLCBtdWx0aVNjYXR0ZXJpbmcgKTtcclxuXHJcblx0I2VuZGlmXHJcblxyXG5cdHZlYzMgdG90YWxTY2F0dGVyaW5nID0gc2luZ2xlU2NhdHRlcmluZyArIG11bHRpU2NhdHRlcmluZztcclxuXHR2ZWMzIGRpZmZ1c2UgPSBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKiAoIDEuMCAtIG1heCggbWF4KCB0b3RhbFNjYXR0ZXJpbmcuciwgdG90YWxTY2F0dGVyaW5nLmcgKSwgdG90YWxTY2F0dGVyaW5nLmIgKSApO1xyXG5cclxuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICs9IHJhZGlhbmNlICogc2luZ2xlU2NhdHRlcmluZztcclxuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICs9IG11bHRpU2NhdHRlcmluZyAqIGNvc2luZVdlaWdodGVkSXJyYWRpYW5jZTtcclxuXHJcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IGRpZmZ1c2UgKiBjb3NpbmVXZWlnaHRlZElycmFkaWFuY2U7XHJcblxyXG59XHJcblxyXG4jZGVmaW5lIFJFX0RpcmVjdFx0XHRcdFx0UkVfRGlyZWN0X1BoeXNpY2FsXHJcbiNkZWZpbmUgUkVfRGlyZWN0X1JlY3RBcmVhXHRcdFJFX0RpcmVjdF9SZWN0QXJlYV9QaHlzaWNhbFxyXG4jZGVmaW5lIFJFX0luZGlyZWN0RGlmZnVzZVx0XHRSRV9JbmRpcmVjdERpZmZ1c2VfUGh5c2ljYWxcclxuI2RlZmluZSBSRV9JbmRpcmVjdFNwZWN1bGFyXHRcdFJFX0luZGlyZWN0U3BlY3VsYXJfUGh5c2ljYWxcclxuXHJcbi8vIHJlZjogaHR0cHM6Ly9zZWJsYWdhcmRlLmZpbGVzLndvcmRwcmVzcy5jb20vMjAxNS8wNy9jb3Vyc2Vfbm90ZXNfbW92aW5nX2Zyb3N0Yml0ZV90b19wYnJfdjMyLnBkZlxyXG5mbG9hdCBjb21wdXRlU3BlY3VsYXJPY2NsdXNpb24oIGNvbnN0IGluIGZsb2F0IGRvdE5WLCBjb25zdCBpbiBmbG9hdCBhbWJpZW50T2NjbHVzaW9uLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XHJcblxyXG5cdHJldHVybiBzYXR1cmF0ZSggcG93KCBkb3ROViArIGFtYmllbnRPY2NsdXNpb24sIGV4cDIoIC0gMTYuMCAqIHJvdWdobmVzcyAtIDEuMCApICkgLSAxLjAgKyBhbWJpZW50T2NjbHVzaW9uICk7XHJcblxyXG59XHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbi8qKlxyXG4gKiBUaGlzIGlzIGEgdGVtcGxhdGUgdGhhdCBjYW4gYmUgdXNlZCB0byBsaWdodCBhIG1hdGVyaWFsLCBpdCB1c2VzIHBsdWdnYWJsZVxyXG4gKiBSZW5kZXJFcXVhdGlvbnMgKFJFKWZvciBzcGVjaWZpYyBsaWdodGluZyBzY2VuYXJpb3MuXHJcbiAqXHJcbiAqIEluc3RydWN0aW9ucyBmb3IgdXNlOlxyXG4gKiAtIEVuc3VyZSB0aGF0IGJvdGggUkVfRGlyZWN0LCBSRV9JbmRpcmVjdERpZmZ1c2UgYW5kIFJFX0luZGlyZWN0U3BlY3VsYXIgYXJlIGRlZmluZWRcclxuICogLSBDcmVhdGUgYSBtYXRlcmlhbCBwYXJhbWV0ZXIgdGhhdCBpcyB0byBiZSBwYXNzZWQgYXMgdGhlIHRoaXJkIHBhcmFtZXRlciB0byB5b3VyIGxpZ2h0aW5nIGZ1bmN0aW9ucy5cclxuICpcclxuICogVE9ETzpcclxuICogLSBBZGQgYXJlYSBsaWdodCBzdXBwb3J0LlxyXG4gKiAtIEFkZCBzcGhlcmUgbGlnaHQgc3VwcG9ydC5cclxuICogLSBBZGQgZGlmZnVzZSBsaWdodCBwcm9iZSAoaXJyYWRpYW5jZSBjdWJlbWFwKSBzdXBwb3J0LlxyXG4gKi9cclxuXHJcbnZlYzMgZ2VvbWV0cnlQb3NpdGlvbiA9IC0gdlZpZXdQb3NpdGlvbjtcclxudmVjMyBnZW9tZXRyeU5vcm1hbCA9IG5vcm1hbDtcclxudmVjMyBnZW9tZXRyeVZpZXdEaXIgPSAoIGlzT3J0aG9ncmFwaGljICkgPyB2ZWMzKCAwLCAwLCAxICkgOiBub3JtYWxpemUoIHZWaWV3UG9zaXRpb24gKTtcclxuXHJcbnZlYzMgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwgPSB2ZWMzKCAwLjAgKTtcclxuXHJcbiNpZmRlZiBVU0VfQ0xFQVJDT0FUXHJcblxyXG5cdGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsID0gY2xlYXJjb2F0Tm9ybWFsO1xyXG5cclxuI2VuZGlmXHJcblxyXG4jaWZkZWYgVVNFX0lSSURFU0NFTkNFXHJcblxyXG5cdGZsb2F0IGRvdE5WaSA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgZ2VvbWV0cnlWaWV3RGlyICkgKTtcclxuXHJcblx0aWYgKCBtYXRlcmlhbC5pcmlkZXNjZW5jZVRoaWNrbmVzcyA9PSAwLjAgKSB7XHJcblxyXG5cdFx0bWF0ZXJpYWwuaXJpZGVzY2VuY2UgPSAwLjA7XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0bWF0ZXJpYWwuaXJpZGVzY2VuY2UgPSBzYXR1cmF0ZSggbWF0ZXJpYWwuaXJpZGVzY2VuY2UgKTtcclxuXHJcblx0fVxyXG5cclxuXHRpZiAoIG1hdGVyaWFsLmlyaWRlc2NlbmNlID4gMC4wICkge1xyXG5cclxuXHRcdG1hdGVyaWFsLmlyaWRlc2NlbmNlRnJlc25lbCA9IGV2YWxJcmlkZXNjZW5jZSggMS4wLCBtYXRlcmlhbC5pcmlkZXNjZW5jZUlPUiwgZG90TlZpLCBtYXRlcmlhbC5pcmlkZXNjZW5jZVRoaWNrbmVzcywgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciApO1xyXG5cclxuXHRcdC8vIElyaWRlc2NlbmNlIEYwIGFwcHJveGltYXRpb25cclxuXHRcdG1hdGVyaWFsLmlyaWRlc2NlbmNlRjAgPSBTY2hsaWNrX3RvX0YwKCBtYXRlcmlhbC5pcmlkZXNjZW5jZUZyZXNuZWwsIDEuMCwgZG90TlZpICk7XHJcblxyXG5cdH1cclxuXHJcbiNlbmRpZlxyXG5cclxuSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodDtcclxuXHJcbiNpZiAoIE5VTV9QT0lOVF9MSUdIVFMgPiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0IClcclxuXHJcblx0UG9pbnRMaWdodCBwb2ludExpZ2h0O1xyXG5cdCNpZiBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQICkgJiYgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgPiAwXHJcblx0UG9pbnRMaWdodFNoYWRvdyBwb2ludExpZ2h0U2hhZG93O1xyXG5cdCNlbmRpZlxyXG5cclxuXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XHJcblx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1BPSU5UX0xJR0hUUzsgaSArKyApIHtcclxuXHJcblx0XHRwb2ludExpZ2h0ID0gcG9pbnRMaWdodHNbIGkgXTtcclxuXHJcblx0XHRnZXRQb2ludExpZ2h0SW5mbyggcG9pbnRMaWdodCwgZ2VvbWV0cnlQb3NpdGlvbiwgZGlyZWN0TGlnaHQgKTtcclxuXHJcblx0XHQjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApICYmICggVU5ST0xMRURfTE9PUF9JTkRFWCA8IE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIClcclxuXHRcdHBvaW50TGlnaHRTaGFkb3cgPSBwb2ludExpZ2h0U2hhZG93c1sgaSBdO1xyXG5cdFx0ZGlyZWN0TGlnaHQuY29sb3IgKj0gKCBkaXJlY3RMaWdodC52aXNpYmxlICYmIHJlY2VpdmVTaGFkb3cgKSA/IGdldFBvaW50U2hhZG93KCBwb2ludFNoYWRvd01hcFsgaSBdLCBwb2ludExpZ2h0U2hhZG93LnNoYWRvd01hcFNpemUsIHBvaW50TGlnaHRTaGFkb3cuc2hhZG93SW50ZW5zaXR5LCBwb2ludExpZ2h0U2hhZG93LnNoYWRvd0JpYXMsIHBvaW50TGlnaHRTaGFkb3cuc2hhZG93UmFkaXVzLCB2UG9pbnRTaGFkb3dDb29yZFsgaSBdLCBwb2ludExpZ2h0U2hhZG93LnNoYWRvd0NhbWVyYU5lYXIsIHBvaW50TGlnaHRTaGFkb3cuc2hhZG93Q2FtZXJhRmFyICkgOiAxLjA7XHJcblx0XHQjZW5kaWZcclxuXHJcblx0XHRSRV9EaXJlY3QoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeVBvc2l0aW9uLCBnZW9tZXRyeU5vcm1hbCwgZ2VvbWV0cnlWaWV3RGlyLCBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XHJcblxyXG5cdH1cclxuXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxyXG5cclxuI2VuZGlmXHJcblxyXG4jaWYgKCBOVU1fU1BPVF9MSUdIVFMgPiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0IClcclxuXHJcblx0U3BvdExpZ2h0IHNwb3RMaWdodDtcclxuXHR2ZWM0IHNwb3RDb2xvcjtcclxuXHR2ZWMzIHNwb3RMaWdodENvb3JkO1xyXG5cdGJvb2wgaW5TcG90TGlnaHRNYXA7XHJcblxyXG5cdCNpZiBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQICkgJiYgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyA+IDBcclxuXHRTcG90TGlnaHRTaGFkb3cgc3BvdExpZ2h0U2hhZG93O1xyXG5cdCNlbmRpZlxyXG5cclxuXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XHJcblx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1NQT1RfTElHSFRTOyBpICsrICkge1xyXG5cclxuXHRcdHNwb3RMaWdodCA9IHNwb3RMaWdodHNbIGkgXTtcclxuXHJcblx0XHRnZXRTcG90TGlnaHRJbmZvKCBzcG90TGlnaHQsIGdlb21ldHJ5UG9zaXRpb24sIGRpcmVjdExpZ2h0ICk7XHJcblxyXG5cdFx0Ly8gc3BvdCBsaWdodHMgYXJlIG9yZGVyZWQgW3NoYWRvd3Mgd2l0aCBtYXBzLCBzaGFkb3dzIHdpdGhvdXQgbWFwcywgbWFwcyB3aXRob3V0IHNoYWRvd3MsIG5vbmVdXHJcblx0XHQjaWYgKCBVTlJPTExFRF9MT09QX0lOREVYIDwgTlVNX1NQT1RfTElHSFRfU0hBRE9XU19XSVRIX01BUFMgKVxyXG5cdFx0I2RlZmluZSBTUE9UX0xJR0hUX01BUF9JTkRFWCBVTlJPTExFRF9MT09QX0lOREVYXHJcblx0XHQjZWxpZiAoIFVOUk9MTEVEX0xPT1BfSU5ERVggPCBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIClcclxuXHRcdCNkZWZpbmUgU1BPVF9MSUdIVF9NQVBfSU5ERVggTlVNX1NQT1RfTElHSFRfTUFQU1xyXG5cdFx0I2Vsc2VcclxuXHRcdCNkZWZpbmUgU1BPVF9MSUdIVF9NQVBfSU5ERVggKCBVTlJPTExFRF9MT09QX0lOREVYIC0gTlVNX1NQT1RfTElHSFRfU0hBRE9XUyArIE5VTV9TUE9UX0xJR0hUX1NIQURPV1NfV0lUSF9NQVBTIClcclxuXHRcdCNlbmRpZlxyXG5cclxuXHRcdCNpZiAoIFNQT1RfTElHSFRfTUFQX0lOREVYIDwgTlVNX1NQT1RfTElHSFRfTUFQUyApXHJcblx0XHRcdHNwb3RMaWdodENvb3JkID0gdlNwb3RMaWdodENvb3JkWyBpIF0ueHl6IC8gdlNwb3RMaWdodENvb3JkWyBpIF0udztcclxuXHRcdFx0aW5TcG90TGlnaHRNYXAgPSBhbGwoIGxlc3NUaGFuKCBhYnMoIHNwb3RMaWdodENvb3JkICogMi4gLSAxLiApLCB2ZWMzKCAxLjAgKSApICk7XHJcblx0XHRcdHNwb3RDb2xvciA9IHRleHR1cmUyRCggc3BvdExpZ2h0TWFwWyBTUE9UX0xJR0hUX01BUF9JTkRFWCBdLCBzcG90TGlnaHRDb29yZC54eSApO1xyXG5cdFx0XHRkaXJlY3RMaWdodC5jb2xvciA9IGluU3BvdExpZ2h0TWFwID8gZGlyZWN0TGlnaHQuY29sb3IgKiBzcG90Q29sb3IucmdiIDogZGlyZWN0TGlnaHQuY29sb3I7XHJcblx0XHQjZW5kaWZcclxuXHJcblx0XHQjdW5kZWYgU1BPVF9MSUdIVF9NQVBfSU5ERVhcclxuXHJcblx0XHQjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApICYmICggVU5ST0xMRURfTE9PUF9JTkRFWCA8IE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgKVxyXG5cdFx0c3BvdExpZ2h0U2hhZG93ID0gc3BvdExpZ2h0U2hhZG93c1sgaSBdO1xyXG5cdFx0ZGlyZWN0TGlnaHQuY29sb3IgKj0gKCBkaXJlY3RMaWdodC52aXNpYmxlICYmIHJlY2VpdmVTaGFkb3cgKSA/IGdldFNoYWRvdyggc3BvdFNoYWRvd01hcFsgaSBdLCBzcG90TGlnaHRTaGFkb3cuc2hhZG93TWFwU2l6ZSwgc3BvdExpZ2h0U2hhZG93LnNoYWRvd0ludGVuc2l0eSwgc3BvdExpZ2h0U2hhZG93LnNoYWRvd0JpYXMsIHNwb3RMaWdodFNoYWRvdy5zaGFkb3dSYWRpdXMsIHZTcG90TGlnaHRDb29yZFsgaSBdICkgOiAxLjA7XHJcblx0XHQjZW5kaWZcclxuXHJcblx0XHRSRV9EaXJlY3QoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeVBvc2l0aW9uLCBnZW9tZXRyeU5vcm1hbCwgZ2VvbWV0cnlWaWV3RGlyLCBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XHJcblxyXG5cdH1cclxuXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxyXG5cclxuI2VuZGlmXHJcblxyXG4jaWYgKCBOVU1fRElSX0xJR0hUUyA+IDAgKSAmJiBkZWZpbmVkKCBSRV9EaXJlY3QgKVxyXG5cclxuXHREaXJlY3Rpb25hbExpZ2h0IGRpcmVjdGlvbmFsTGlnaHQ7XHJcblx0I2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSAmJiBOVU1fRElSX0xJR0hUX1NIQURPV1MgPiAwXHJcblx0RGlyZWN0aW9uYWxMaWdodFNoYWRvdyBkaXJlY3Rpb25hbExpZ2h0U2hhZG93O1xyXG5cdCNlbmRpZlxyXG5cclxuXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XHJcblx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX0RJUl9MSUdIVFM7IGkgKysgKSB7XHJcblxyXG5cdFx0ZGlyZWN0aW9uYWxMaWdodCA9IGRpcmVjdGlvbmFsTGlnaHRzWyBpIF07XHJcblxyXG5cdFx0Z2V0RGlyZWN0aW9uYWxMaWdodEluZm8oIGRpcmVjdGlvbmFsTGlnaHQsIGRpcmVjdExpZ2h0ICk7XHJcblxyXG5cdFx0I2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSAmJiAoIFVOUk9MTEVEX0xPT1BfSU5ERVggPCBOVU1fRElSX0xJR0hUX1NIQURPV1MgKVxyXG5cdFx0ZGlyZWN0aW9uYWxMaWdodFNoYWRvdyA9IGRpcmVjdGlvbmFsTGlnaHRTaGFkb3dzWyBpIF07XHJcblx0XHRkaXJlY3RMaWdodC5jb2xvciAqPSAoIGRpcmVjdExpZ2h0LnZpc2libGUgJiYgcmVjZWl2ZVNoYWRvdyApID8gZ2V0U2hhZG93KCBkaXJlY3Rpb25hbFNoYWRvd01hcFsgaSBdLCBkaXJlY3Rpb25hbExpZ2h0U2hhZG93LnNoYWRvd01hcFNpemUsIGRpcmVjdGlvbmFsTGlnaHRTaGFkb3cuc2hhZG93SW50ZW5zaXR5LCBkaXJlY3Rpb25hbExpZ2h0U2hhZG93LnNoYWRvd0JpYXMsIGRpcmVjdGlvbmFsTGlnaHRTaGFkb3cuc2hhZG93UmFkaXVzLCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7XHJcblx0XHQjZW5kaWZcclxuXHJcblx0XHRSRV9EaXJlY3QoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeVBvc2l0aW9uLCBnZW9tZXRyeU5vcm1hbCwgZ2VvbWV0cnlWaWV3RGlyLCBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XHJcblxyXG5cdH1cclxuXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxyXG5cclxuI2VuZGlmXHJcblxyXG4jaWYgKCBOVU1fUkVDVF9BUkVBX0xJR0hUUyA+IDAgKSAmJiBkZWZpbmVkKCBSRV9EaXJlY3RfUmVjdEFyZWEgKVxyXG5cclxuXHRSZWN0QXJlYUxpZ2h0IHJlY3RBcmVhTGlnaHQ7XHJcblxyXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcclxuXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fUkVDVF9BUkVBX0xJR0hUUzsgaSArKyApIHtcclxuXHJcblx0XHRyZWN0QXJlYUxpZ2h0ID0gcmVjdEFyZWFMaWdodHNbIGkgXTtcclxuXHRcdFJFX0RpcmVjdF9SZWN0QXJlYSggcmVjdEFyZWFMaWdodCwgZ2VvbWV0cnlQb3NpdGlvbiwgZ2VvbWV0cnlOb3JtYWwsIGdlb21ldHJ5Vmlld0RpciwgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xyXG5cclxuXHR9XHJcblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9lbmRcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0RGlmZnVzZSApXHJcblxyXG5cdHZlYzMgaWJsSXJyYWRpYW5jZSA9IHZlYzMoIDAuMCApO1xyXG5cclxuXHR2ZWMzIGlycmFkaWFuY2UgPSBnZXRBbWJpZW50TGlnaHRJcnJhZGlhbmNlKCBhbWJpZW50TGlnaHRDb2xvciApO1xyXG5cclxuXHQjaWYgZGVmaW5lZCggVVNFX0xJR0hUX1BST0JFUyApXHJcblxyXG5cdFx0aXJyYWRpYW5jZSArPSBnZXRMaWdodFByb2JlSXJyYWRpYW5jZSggbGlnaHRQcm9iZSwgZ2VvbWV0cnlOb3JtYWwgKTtcclxuXHJcblx0I2VuZGlmXHJcblxyXG5cdCNpZiAoIE5VTV9IRU1JX0xJR0hUUyA+IDAgKVxyXG5cclxuXHRcdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcclxuXHRcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9IRU1JX0xJR0hUUzsgaSArKyApIHtcclxuXHJcblx0XHRcdGlycmFkaWFuY2UgKz0gZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggaGVtaXNwaGVyZUxpZ2h0c1sgaSBdLCBnZW9tZXRyeU5vcm1hbCApO1xyXG5cclxuXHRcdH1cclxuXHRcdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXHJcblxyXG5cdCNlbmRpZlxyXG5cclxuI2VuZGlmXHJcblxyXG4jaWYgZGVmaW5lZCggUkVfSW5kaXJlY3RTcGVjdWxhciApXHJcblxyXG5cdHZlYzMgcmFkaWFuY2UgPSB2ZWMzKCAwLjAgKTtcclxuXHR2ZWMzIGNsZWFyY29hdFJhZGlhbmNlID0gdmVjMyggMC4wICk7XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0RGlmZnVzZSApXHJcblxyXG5cdCNpZmRlZiBVU0VfTElHSFRNQVBcclxuXHJcblx0XHR2ZWM0IGxpZ2h0TWFwVGV4ZWwgPSB0ZXh0dXJlMkQoIGxpZ2h0TWFwLCB2TGlnaHRNYXBVdiApO1xyXG5cdFx0dmVjMyBsaWdodE1hcElycmFkaWFuY2UgPSBsaWdodE1hcFRleGVsLnJnYiAqIGxpZ2h0TWFwSW50ZW5zaXR5O1xyXG5cclxuXHRcdGlycmFkaWFuY2UgKz0gbGlnaHRNYXBJcnJhZGlhbmNlO1xyXG5cclxuXHQjZW5kaWZcclxuXHJcblx0I2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSAmJiBkZWZpbmVkKCBTVEFOREFSRCApICYmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0NVQkVfVVYgKVxyXG5cclxuXHRcdGlibElycmFkaWFuY2UgKz0gZ2V0SUJMSXJyYWRpYW5jZSggZ2VvbWV0cnlOb3JtYWwgKTtcclxuXHJcblx0I2VuZGlmXHJcblxyXG4jZW5kaWZcclxuXHJcbiNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgJiYgZGVmaW5lZCggUkVfSW5kaXJlY3RTcGVjdWxhciApXHJcblxyXG5cdCNpZmRlZiBVU0VfQU5JU09UUk9QWVxyXG5cclxuXHRcdHJhZGlhbmNlICs9IGdldElCTEFuaXNvdHJvcHlSYWRpYW5jZSggZ2VvbWV0cnlWaWV3RGlyLCBnZW9tZXRyeU5vcm1hbCwgbWF0ZXJpYWwucm91Z2huZXNzLCBtYXRlcmlhbC5hbmlzb3Ryb3B5QiwgbWF0ZXJpYWwuYW5pc290cm9weSApO1xyXG5cclxuXHQjZWxzZVxyXG5cclxuXHRcdHJhZGlhbmNlICs9IGdldElCTFJhZGlhbmNlKCBnZW9tZXRyeVZpZXdEaXIsIGdlb21ldHJ5Tm9ybWFsLCBtYXRlcmlhbC5yb3VnaG5lc3MgKTtcclxuXHJcblx0I2VuZGlmXHJcblxyXG5cdCNpZmRlZiBVU0VfQ0xFQVJDT0FUXHJcblxyXG5cdFx0Y2xlYXJjb2F0UmFkaWFuY2UgKz0gZ2V0SUJMUmFkaWFuY2UoIGdlb21ldHJ5Vmlld0RpciwgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcyApO1xyXG5cclxuXHQjZW5kaWZcclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jaWYgZGVmaW5lZCggUkVfSW5kaXJlY3REaWZmdXNlIClcclxuXHJcblx0UkVfSW5kaXJlY3REaWZmdXNlKCBpcnJhZGlhbmNlLCBnZW9tZXRyeVBvc2l0aW9uLCBnZW9tZXRyeU5vcm1hbCwgZ2VvbWV0cnlWaWV3RGlyLCBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XHJcblxyXG4jZW5kaWZcclxuXHJcbiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdFNwZWN1bGFyIClcclxuXHJcblx0UkVfSW5kaXJlY3RTcGVjdWxhciggcmFkaWFuY2UsIGlibElycmFkaWFuY2UsIGNsZWFyY29hdFJhZGlhbmNlLCBnZW9tZXRyeVBvc2l0aW9uLCBnZW9tZXRyeU5vcm1hbCwgZ2VvbWV0cnlWaWV3RGlyLCBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmIGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRiApXHJcblxyXG5cdC8vIERvaW5nIGEgc3RyaWN0IGNvbXBhcmlzb24gd2l0aCA9PSAxLjAgY2FuIGNhdXNlIG5vaXNlIGFydGlmYWN0c1xyXG5cdC8vIG9uIHNvbWUgcGxhdGZvcm1zLiBTZWUgaXNzdWUgIzE3NjIzLlxyXG5cdGdsX0ZyYWdEZXB0aCA9IHZJc1BlcnNwZWN0aXZlID09IDAuMCA/IGdsX0ZyYWdDb29yZC56IDogbG9nMiggdkZyYWdEZXB0aCApICogbG9nRGVwdGhCdWZGQyAqIDAuNTtcclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jaWYgZGVmaW5lZCggVVNFX0xPR0RFUFRIQlVGIClcclxuXHJcblx0dW5pZm9ybSBmbG9hdCBsb2dEZXB0aEJ1ZkZDO1xyXG5cdHZhcnlpbmcgZmxvYXQgdkZyYWdEZXB0aDtcclxuXHR2YXJ5aW5nIGZsb2F0IHZJc1BlcnNwZWN0aXZlO1xyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbiNpZmRlZiBVU0VfTE9HREVQVEhCVUZcclxuXHJcblx0dmFyeWluZyBmbG9hdCB2RnJhZ0RlcHRoO1xyXG5cdHZhcnlpbmcgZmxvYXQgdklzUGVyc3BlY3RpdmU7XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmZGVmIFVTRV9MT0dERVBUSEJVRlxyXG5cclxuXHR2RnJhZ0RlcHRoID0gMS4wICsgZ2xfUG9zaXRpb24udztcclxuXHR2SXNQZXJzcGVjdGl2ZSA9IGZsb2F0KCBpc1BlcnNwZWN0aXZlTWF0cml4KCBwcm9qZWN0aW9uTWF0cml4ICkgKTtcclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jaWZkZWYgVVNFX01BUFxyXG5cclxuXHR2ZWM0IHNhbXBsZWREaWZmdXNlQ29sb3IgPSB0ZXh0dXJlMkQoIG1hcCwgdk1hcFV2ICk7XHJcblxyXG5cdCNpZmRlZiBERUNPREVfVklERU9fVEVYVFVSRVxyXG5cclxuXHRcdC8vIHVzZSBpbmxpbmUgc1JHQiBkZWNvZGUgdW50aWwgYnJvd3NlcnMgcHJvcGVybHkgc3VwcG9ydCBTUkdCOF9BTFBIQTggd2l0aCB2aWRlbyB0ZXh0dXJlcyAoIzI2NTE2KVxyXG5cclxuXHRcdHNhbXBsZWREaWZmdXNlQ29sb3IgPSBzUkdCVHJhbnNmZXJFT1RGKCBzYW1wbGVkRGlmZnVzZUNvbG9yICk7XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuXHRkaWZmdXNlQ29sb3IgKj0gc2FtcGxlZERpZmZ1c2VDb2xvcjtcclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jaWZkZWYgVVNFX01BUFxyXG5cclxuXHR1bmlmb3JtIHNhbXBsZXIyRCBtYXA7XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmIGRlZmluZWQoIFVTRV9NQVAgKSB8fCBkZWZpbmVkKCBVU0VfQUxQSEFNQVAgKVxyXG5cclxuXHQjaWYgZGVmaW5lZCggVVNFX1BPSU5UU19VViApXHJcblxyXG5cdFx0dmVjMiB1diA9IHZVdjtcclxuXHJcblx0I2Vsc2VcclxuXHJcblx0XHR2ZWMyIHV2ID0gKCB1dlRyYW5zZm9ybSAqIHZlYzMoIGdsX1BvaW50Q29vcmQueCwgMS4wIC0gZ2xfUG9pbnRDb29yZC55LCAxICkgKS54eTtcclxuXHJcblx0I2VuZGlmXHJcblxyXG4jZW5kaWZcclxuXHJcbiNpZmRlZiBVU0VfTUFQXHJcblxyXG5cdGRpZmZ1c2VDb2xvciAqPSB0ZXh0dXJlMkQoIG1hcCwgdXYgKTtcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmZGVmIFVTRV9BTFBIQU1BUFxyXG5cclxuXHRkaWZmdXNlQ29sb3IuYSAqPSB0ZXh0dXJlMkQoIGFscGhhTWFwLCB1diApLmc7XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmIGRlZmluZWQoIFVTRV9QT0lOVFNfVVYgKVxyXG5cclxuXHR2YXJ5aW5nIHZlYzIgdlV2O1xyXG5cclxuI2Vsc2VcclxuXHJcblx0I2lmIGRlZmluZWQoIFVTRV9NQVAgKSB8fCBkZWZpbmVkKCBVU0VfQUxQSEFNQVAgKVxyXG5cclxuXHRcdHVuaWZvcm0gbWF0MyB1dlRyYW5zZm9ybTtcclxuXHJcblx0I2VuZGlmXHJcblxyXG4jZW5kaWZcclxuXHJcbiNpZmRlZiBVU0VfTUFQXHJcblxyXG5cdHVuaWZvcm0gc2FtcGxlcjJEIG1hcDtcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmZGVmIFVTRV9BTFBIQU1BUFxyXG5cclxuXHR1bmlmb3JtIHNhbXBsZXIyRCBhbHBoYU1hcDtcclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG5mbG9hdCBtZXRhbG5lc3NGYWN0b3IgPSBtZXRhbG5lc3M7XHJcblxyXG4jaWZkZWYgVVNFX01FVEFMTkVTU01BUFxyXG5cclxuXHR2ZWM0IHRleGVsTWV0YWxuZXNzID0gdGV4dHVyZTJEKCBtZXRhbG5lc3NNYXAsIHZNZXRhbG5lc3NNYXBVdiApO1xyXG5cclxuXHQvLyByZWFkcyBjaGFubmVsIEIsIGNvbXBhdGlibGUgd2l0aCBhIGNvbWJpbmVkIE9jY2x1c2lvblJvdWdobmVzc01ldGFsbGljIChSR0IpIHRleHR1cmVcclxuXHRtZXRhbG5lc3NGYWN0b3IgKj0gdGV4ZWxNZXRhbG5lc3MuYjtcclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jaWZkZWYgVVNFX01FVEFMTkVTU01BUFxyXG5cclxuXHR1bmlmb3JtIHNhbXBsZXIyRCBtZXRhbG5lc3NNYXA7XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmZGVmIFVTRV9JTlNUQU5DSU5HX01PUlBIXHJcblxyXG5cdGZsb2F0IG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgTU9SUEhUQVJHRVRTX0NPVU5UIF07XHJcblxyXG5cdGZsb2F0IG1vcnBoVGFyZ2V0QmFzZUluZmx1ZW5jZSA9IHRleGVsRmV0Y2goIG1vcnBoVGV4dHVyZSwgaXZlYzIoIDAsIGdsX0luc3RhbmNlSUQgKSwgMCApLnI7XHJcblxyXG5cdGZvciAoIGludCBpID0gMDsgaSA8IE1PUlBIVEFSR0VUU19DT1VOVDsgaSArKyApIHtcclxuXHJcblx0XHRtb3JwaFRhcmdldEluZmx1ZW5jZXNbaV0gPSAgdGV4ZWxGZXRjaCggbW9ycGhUZXh0dXJlLCBpdmVjMiggaSArIDEsIGdsX0luc3RhbmNlSUQgKSwgMCApLnI7XHJcblxyXG5cdH1cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbiNpZiBkZWZpbmVkKCBVU0VfTU9SUEhDT0xPUlMgKVxyXG5cclxuXHQvLyBtb3JwaFRhcmdldEJhc2VJbmZsdWVuY2UgaXMgc2V0IGJhc2VkIG9uIEJ1ZmZlckdlb21ldHJ5Lm1vcnBoVGFyZ2V0c1JlbGF0aXZlIHZhbHVlOlxyXG5cdC8vIFdoZW4gbW9ycGhUYXJnZXRzUmVsYXRpdmUgaXMgZmFsc2UsIHRoaXMgaXMgc2V0IHRvIDEgLSBzdW0oaW5mbHVlbmNlcyk7IHRoaXMgcmVzdWx0cyBpbiBub3JtYWwgPSBzdW0oKHRhcmdldCAtIGJhc2UpICogaW5mbHVlbmNlKVxyXG5cdC8vIFdoZW4gbW9ycGhUYXJnZXRzUmVsYXRpdmUgaXMgdHJ1ZSwgdGhpcyBpcyBzZXQgdG8gMTsgYXMgYSByZXN1bHQsIGFsbCBtb3JwaCB0YXJnZXRzIGFyZSBzaW1wbHkgYWRkZWQgdG8gdGhlIGJhc2UgYWZ0ZXIgd2VpZ2h0aW5nXHJcblx0dkNvbG9yICo9IG1vcnBoVGFyZ2V0QmFzZUluZmx1ZW5jZTtcclxuXHJcblx0Zm9yICggaW50IGkgPSAwOyBpIDwgTU9SUEhUQVJHRVRTX0NPVU5UOyBpICsrICkge1xyXG5cclxuXHRcdCNpZiBkZWZpbmVkKCBVU0VfQ09MT1JfQUxQSEEgKVxyXG5cclxuXHRcdFx0aWYgKCBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIGkgXSAhPSAwLjAgKSB2Q29sb3IgKz0gZ2V0TW9ycGgoIGdsX1ZlcnRleElELCBpLCAyICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIGkgXTtcclxuXHJcblx0XHQjZWxpZiBkZWZpbmVkKCBVU0VfQ09MT1IgKVxyXG5cclxuXHRcdFx0aWYgKCBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIGkgXSAhPSAwLjAgKSB2Q29sb3IgKz0gZ2V0TW9ycGgoIGdsX1ZlcnRleElELCBpLCAyICkucmdiICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBpIF07XHJcblxyXG5cdFx0I2VuZGlmXHJcblxyXG5cdH1cclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jaWZkZWYgVVNFX01PUlBITk9STUFMU1xyXG5cclxuXHQvLyBtb3JwaFRhcmdldEJhc2VJbmZsdWVuY2UgaXMgc2V0IGJhc2VkIG9uIEJ1ZmZlckdlb21ldHJ5Lm1vcnBoVGFyZ2V0c1JlbGF0aXZlIHZhbHVlOlxyXG5cdC8vIFdoZW4gbW9ycGhUYXJnZXRzUmVsYXRpdmUgaXMgZmFsc2UsIHRoaXMgaXMgc2V0IHRvIDEgLSBzdW0oaW5mbHVlbmNlcyk7IHRoaXMgcmVzdWx0cyBpbiBub3JtYWwgPSBzdW0oKHRhcmdldCAtIGJhc2UpICogaW5mbHVlbmNlKVxyXG5cdC8vIFdoZW4gbW9ycGhUYXJnZXRzUmVsYXRpdmUgaXMgdHJ1ZSwgdGhpcyBpcyBzZXQgdG8gMTsgYXMgYSByZXN1bHQsIGFsbCBtb3JwaCB0YXJnZXRzIGFyZSBzaW1wbHkgYWRkZWQgdG8gdGhlIGJhc2UgYWZ0ZXIgd2VpZ2h0aW5nXHJcblx0b2JqZWN0Tm9ybWFsICo9IG1vcnBoVGFyZ2V0QmFzZUluZmx1ZW5jZTtcclxuXHJcblx0Zm9yICggaW50IGkgPSAwOyBpIDwgTU9SUEhUQVJHRVRTX0NPVU5UOyBpICsrICkge1xyXG5cclxuXHRcdGlmICggbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBpIF0gIT0gMC4wICkgb2JqZWN0Tm9ybWFsICs9IGdldE1vcnBoKCBnbF9WZXJ0ZXhJRCwgaSwgMSApLnh5eiAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgaSBdO1xyXG5cclxuXHR9XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmZGVmIFVTRV9NT1JQSFRBUkdFVFNcclxuXHJcblx0I2lmbmRlZiBVU0VfSU5TVEFOQ0lOR19NT1JQSFxyXG5cclxuXHRcdHVuaWZvcm0gZmxvYXQgbW9ycGhUYXJnZXRCYXNlSW5mbHVlbmNlO1xyXG5cdFx0dW5pZm9ybSBmbG9hdCBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIE1PUlBIVEFSR0VUU19DT1VOVCBdO1xyXG5cclxuXHQjZW5kaWZcclxuXHJcblx0dW5pZm9ybSBzYW1wbGVyMkRBcnJheSBtb3JwaFRhcmdldHNUZXh0dXJlO1xyXG5cdHVuaWZvcm0gaXZlYzIgbW9ycGhUYXJnZXRzVGV4dHVyZVNpemU7XHJcblxyXG5cdHZlYzQgZ2V0TW9ycGgoIGNvbnN0IGluIGludCB2ZXJ0ZXhJbmRleCwgY29uc3QgaW4gaW50IG1vcnBoVGFyZ2V0SW5kZXgsIGNvbnN0IGluIGludCBvZmZzZXQgKSB7XHJcblxyXG5cdFx0aW50IHRleGVsSW5kZXggPSB2ZXJ0ZXhJbmRleCAqIE1PUlBIVEFSR0VUU19URVhUVVJFX1NUUklERSArIG9mZnNldDtcclxuXHRcdGludCB5ID0gdGV4ZWxJbmRleCAvIG1vcnBoVGFyZ2V0c1RleHR1cmVTaXplLng7XHJcblx0XHRpbnQgeCA9IHRleGVsSW5kZXggLSB5ICogbW9ycGhUYXJnZXRzVGV4dHVyZVNpemUueDtcclxuXHJcblx0XHRpdmVjMyBtb3JwaFVWID0gaXZlYzMoIHgsIHksIG1vcnBoVGFyZ2V0SW5kZXggKTtcclxuXHRcdHJldHVybiB0ZXhlbEZldGNoKCBtb3JwaFRhcmdldHNUZXh0dXJlLCBtb3JwaFVWLCAwICk7XHJcblxyXG5cdH1cclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jaWZkZWYgVVNFX01PUlBIVEFSR0VUU1xyXG5cclxuXHQvLyBtb3JwaFRhcmdldEJhc2VJbmZsdWVuY2UgaXMgc2V0IGJhc2VkIG9uIEJ1ZmZlckdlb21ldHJ5Lm1vcnBoVGFyZ2V0c1JlbGF0aXZlIHZhbHVlOlxyXG5cdC8vIFdoZW4gbW9ycGhUYXJnZXRzUmVsYXRpdmUgaXMgZmFsc2UsIHRoaXMgaXMgc2V0IHRvIDEgLSBzdW0oaW5mbHVlbmNlcyk7IHRoaXMgcmVzdWx0cyBpbiBwb3NpdGlvbiA9IHN1bSgodGFyZ2V0IC0gYmFzZSkgKiBpbmZsdWVuY2UpXHJcblx0Ly8gV2hlbiBtb3JwaFRhcmdldHNSZWxhdGl2ZSBpcyB0cnVlLCB0aGlzIGlzIHNldCB0byAxOyBhcyBhIHJlc3VsdCwgYWxsIG1vcnBoIHRhcmdldHMgYXJlIHNpbXBseSBhZGRlZCB0byB0aGUgYmFzZSBhZnRlciB3ZWlnaHRpbmdcclxuXHR0cmFuc2Zvcm1lZCAqPSBtb3JwaFRhcmdldEJhc2VJbmZsdWVuY2U7XHJcblxyXG5cdGZvciAoIGludCBpID0gMDsgaSA8IE1PUlBIVEFSR0VUU19DT1VOVDsgaSArKyApIHtcclxuXHJcblx0XHRpZiAoIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgaSBdICE9IDAuMCApIHRyYW5zZm9ybWVkICs9IGdldE1vcnBoKCBnbF9WZXJ0ZXhJRCwgaSwgMCApLnh5eiAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgaSBdO1xyXG5cclxuXHR9XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuZmxvYXQgZmFjZURpcmVjdGlvbiA9IGdsX0Zyb250RmFjaW5nID8gMS4wIDogLSAxLjA7XHJcblxyXG4jaWZkZWYgRkxBVF9TSEFERURcclxuXHJcblx0dmVjMyBmZHggPSBkRmR4KCB2Vmlld1Bvc2l0aW9uICk7XHJcblx0dmVjMyBmZHkgPSBkRmR5KCB2Vmlld1Bvc2l0aW9uICk7XHJcblx0dmVjMyBub3JtYWwgPSBub3JtYWxpemUoIGNyb3NzKCBmZHgsIGZkeSApICk7XHJcblxyXG4jZWxzZVxyXG5cclxuXHR2ZWMzIG5vcm1hbCA9IG5vcm1hbGl6ZSggdk5vcm1hbCApO1xyXG5cclxuXHQjaWZkZWYgRE9VQkxFX1NJREVEXHJcblxyXG5cdFx0bm9ybWFsICo9IGZhY2VEaXJlY3Rpb247XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuI2VuZGlmXHJcblxyXG4jaWYgZGVmaW5lZCggVVNFX05PUk1BTE1BUF9UQU5HRU5UU1BBQ0UgKSB8fCBkZWZpbmVkKCBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFVTRV9BTklTT1RST1BZIClcclxuXHJcblx0I2lmZGVmIFVTRV9UQU5HRU5UXHJcblxyXG5cdFx0bWF0MyB0Ym4gPSBtYXQzKCBub3JtYWxpemUoIHZUYW5nZW50ICksIG5vcm1hbGl6ZSggdkJpdGFuZ2VudCApLCBub3JtYWwgKTtcclxuXHJcblx0I2Vsc2VcclxuXHJcblx0XHRtYXQzIHRibiA9IGdldFRhbmdlbnRGcmFtZSggLSB2Vmlld1Bvc2l0aW9uLCBub3JtYWwsXHJcblx0XHQjaWYgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApXHJcblx0XHRcdHZOb3JtYWxNYXBVdlxyXG5cdFx0I2VsaWYgZGVmaW5lZCggVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVAgKVxyXG5cdFx0XHR2Q2xlYXJjb2F0Tm9ybWFsTWFwVXZcclxuXHRcdCNlbHNlXHJcblx0XHRcdHZVdlxyXG5cdFx0I2VuZGlmXHJcblx0XHQpO1xyXG5cclxuXHQjZW5kaWZcclxuXHJcblx0I2lmIGRlZmluZWQoIERPVUJMRV9TSURFRCApICYmICEgZGVmaW5lZCggRkxBVF9TSEFERUQgKVxyXG5cclxuXHRcdHRiblswXSAqPSBmYWNlRGlyZWN0aW9uO1xyXG5cdFx0dGJuWzFdICo9IGZhY2VEaXJlY3Rpb247XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuI2VuZGlmXHJcblxyXG4jaWZkZWYgVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVBcclxuXHJcblx0I2lmZGVmIFVTRV9UQU5HRU5UXHJcblxyXG5cdFx0bWF0MyB0Ym4yID0gbWF0Myggbm9ybWFsaXplKCB2VGFuZ2VudCApLCBub3JtYWxpemUoIHZCaXRhbmdlbnQgKSwgbm9ybWFsICk7XHJcblxyXG5cdCNlbHNlXHJcblxyXG5cdFx0bWF0MyB0Ym4yID0gZ2V0VGFuZ2VudEZyYW1lKCAtIHZWaWV3UG9zaXRpb24sIG5vcm1hbCwgdkNsZWFyY29hdE5vcm1hbE1hcFV2ICk7XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuXHQjaWYgZGVmaW5lZCggRE9VQkxFX1NJREVEICkgJiYgISBkZWZpbmVkKCBGTEFUX1NIQURFRCApXHJcblxyXG5cdFx0dGJuMlswXSAqPSBmYWNlRGlyZWN0aW9uO1xyXG5cdFx0dGJuMlsxXSAqPSBmYWNlRGlyZWN0aW9uO1xyXG5cclxuXHQjZW5kaWZcclxuXHJcbiNlbmRpZlxyXG5cclxuLy8gbm9uIHBlcnR1cmJlZCBub3JtYWwgZm9yIGNsZWFyY29hdCBhbW9uZyBvdGhlcnNcclxuXHJcbnZlYzMgbm9uUGVydHVyYmVkTm9ybWFsID0gbm9ybWFsO1xyXG5cclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuXHJcbiNpZmRlZiBVU0VfTk9STUFMTUFQX09CSkVDVFNQQUNFXHJcblxyXG5cdG5vcm1hbCA9IHRleHR1cmUyRCggbm9ybWFsTWFwLCB2Tm9ybWFsTWFwVXYgKS54eXogKiAyLjAgLSAxLjA7IC8vIG92ZXJyaWRlcyBib3RoIGZsYXRTaGFkaW5nIGFuZCBhdHRyaWJ1dGUgbm9ybWFsc1xyXG5cclxuXHQjaWZkZWYgRkxJUF9TSURFRFxyXG5cclxuXHRcdG5vcm1hbCA9IC0gbm9ybWFsO1xyXG5cclxuXHQjZW5kaWZcclxuXHJcblx0I2lmZGVmIERPVUJMRV9TSURFRFxyXG5cclxuXHRcdG5vcm1hbCA9IG5vcm1hbCAqIGZhY2VEaXJlY3Rpb247XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuXHRub3JtYWwgPSBub3JtYWxpemUoIG5vcm1hbE1hdHJpeCAqIG5vcm1hbCApO1xyXG5cclxuI2VsaWYgZGVmaW5lZCggVVNFX05PUk1BTE1BUF9UQU5HRU5UU1BBQ0UgKVxyXG5cclxuXHR2ZWMzIG1hcE4gPSB0ZXh0dXJlMkQoIG5vcm1hbE1hcCwgdk5vcm1hbE1hcFV2ICkueHl6ICogMi4wIC0gMS4wO1xyXG5cdG1hcE4ueHkgKj0gbm9ybWFsU2NhbGU7XHJcblxyXG5cdG5vcm1hbCA9IG5vcm1hbGl6ZSggdGJuICogbWFwTiApO1xyXG5cclxuI2VsaWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKVxyXG5cclxuXHRub3JtYWwgPSBwZXJ0dXJiTm9ybWFsQXJiKCAtIHZWaWV3UG9zaXRpb24sIG5vcm1hbCwgZEhkeHlfZndkKCksIGZhY2VEaXJlY3Rpb24gKTtcclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jaWZuZGVmIEZMQVRfU0hBREVEXHJcblxyXG5cdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xyXG5cclxuXHQjaWZkZWYgVVNFX1RBTkdFTlRcclxuXHJcblx0XHR2YXJ5aW5nIHZlYzMgdlRhbmdlbnQ7XHJcblx0XHR2YXJ5aW5nIHZlYzMgdkJpdGFuZ2VudDtcclxuXHJcblx0I2VuZGlmXHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmbmRlZiBGTEFUX1NIQURFRFxyXG5cclxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcclxuXHJcblx0I2lmZGVmIFVTRV9UQU5HRU5UXHJcblxyXG5cdFx0dmFyeWluZyB2ZWMzIHZUYW5nZW50O1xyXG5cdFx0dmFyeWluZyB2ZWMzIHZCaXRhbmdlbnQ7XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbiNpZm5kZWYgRkxBVF9TSEFERUQgLy8gbm9ybWFsIGlzIGNvbXB1dGVkIHdpdGggZGVyaXZhdGl2ZXMgd2hlbiBGTEFUX1NIQURFRFxyXG5cclxuXHR2Tm9ybWFsID0gbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xyXG5cclxuXHQjaWZkZWYgVVNFX1RBTkdFTlRcclxuXHJcblx0XHR2VGFuZ2VudCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWRUYW5nZW50ICk7XHJcblx0XHR2Qml0YW5nZW50ID0gbm9ybWFsaXplKCBjcm9zcyggdk5vcm1hbCwgdlRhbmdlbnQgKSAqIHRhbmdlbnQudyApO1xyXG5cclxuXHQjZW5kaWZcclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jaWZkZWYgVVNFX05PUk1BTE1BUFxyXG5cclxuXHR1bmlmb3JtIHNhbXBsZXIyRCBub3JtYWxNYXA7XHJcblx0dW5pZm9ybSB2ZWMyIG5vcm1hbFNjYWxlO1xyXG5cclxuI2VuZGlmXHJcblxyXG4jaWZkZWYgVVNFX05PUk1BTE1BUF9PQkpFQ1RTUEFDRVxyXG5cclxuXHR1bmlmb3JtIG1hdDMgbm9ybWFsTWF0cml4O1xyXG5cclxuI2VuZGlmXHJcblxyXG4jaWYgISBkZWZpbmVkICggVVNFX1RBTkdFTlQgKSAmJiAoIGRlZmluZWQgKCBVU0VfTk9STUFMTUFQX1RBTkdFTlRTUEFDRSApIHx8IGRlZmluZWQgKCBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFVTRV9BTklTT1RST1BZICkgKVxyXG5cclxuXHQvLyBOb3JtYWwgTWFwcGluZyBXaXRob3V0IFByZWNvbXB1dGVkIFRhbmdlbnRzXHJcblx0Ly8gaHR0cDovL3d3dy50aGV0ZW50aHBsYW5ldC5kZS9hcmNoaXZlcy8xMTgwXHJcblxyXG5cdG1hdDMgZ2V0VGFuZ2VudEZyYW1lKCB2ZWMzIGV5ZV9wb3MsIHZlYzMgc3VyZl9ub3JtLCB2ZWMyIHV2ICkge1xyXG5cclxuXHRcdHZlYzMgcTAgPSBkRmR4KCBleWVfcG9zLnh5eiApO1xyXG5cdFx0dmVjMyBxMSA9IGRGZHkoIGV5ZV9wb3MueHl6ICk7XHJcblx0XHR2ZWMyIHN0MCA9IGRGZHgoIHV2LnN0ICk7XHJcblx0XHR2ZWMyIHN0MSA9IGRGZHkoIHV2LnN0ICk7XHJcblxyXG5cdFx0dmVjMyBOID0gc3VyZl9ub3JtOyAvLyBub3JtYWxpemVkXHJcblxyXG5cdFx0dmVjMyBxMXBlcnAgPSBjcm9zcyggcTEsIE4gKTtcclxuXHRcdHZlYzMgcTBwZXJwID0gY3Jvc3MoIE4sIHEwICk7XHJcblxyXG5cdFx0dmVjMyBUID0gcTFwZXJwICogc3QwLnggKyBxMHBlcnAgKiBzdDEueDtcclxuXHRcdHZlYzMgQiA9IHExcGVycCAqIHN0MC55ICsgcTBwZXJwICogc3QxLnk7XHJcblxyXG5cdFx0ZmxvYXQgZGV0ID0gbWF4KCBkb3QoIFQsIFQgKSwgZG90KCBCLCBCICkgKTtcclxuXHRcdGZsb2F0IHNjYWxlID0gKCBkZXQgPT0gMC4wICkgPyAwLjAgOiBpbnZlcnNlc3FydCggZGV0ICk7XHJcblxyXG5cdFx0cmV0dXJuIG1hdDMoIFQgKiBzY2FsZSwgQiAqIHNjYWxlLCBOICk7XHJcblxyXG5cdH1cclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jaWZkZWYgVVNFX0NMRUFSQ09BVFxyXG5cclxuXHR2ZWMzIGNsZWFyY29hdE5vcm1hbCA9IG5vblBlcnR1cmJlZE5vcm1hbDtcclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jaWZkZWYgVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVBcclxuXHJcblx0dmVjMyBjbGVhcmNvYXRNYXBOID0gdGV4dHVyZTJEKCBjbGVhcmNvYXROb3JtYWxNYXAsIHZDbGVhcmNvYXROb3JtYWxNYXBVdiApLnh5eiAqIDIuMCAtIDEuMDtcclxuXHRjbGVhcmNvYXRNYXBOLnh5ICo9IGNsZWFyY29hdE5vcm1hbFNjYWxlO1xyXG5cclxuXHRjbGVhcmNvYXROb3JtYWwgPSBub3JtYWxpemUoIHRibjIgKiBjbGVhcmNvYXRNYXBOICk7XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuXHJcbiNpZmRlZiBVU0VfQ0xFQVJDT0FUTUFQXHJcblxyXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGNsZWFyY29hdE1hcDtcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmZGVmIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQXHJcblxyXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGNsZWFyY29hdE5vcm1hbE1hcDtcclxuXHR1bmlmb3JtIHZlYzIgY2xlYXJjb2F0Tm9ybWFsU2NhbGU7XHJcblxyXG4jZW5kaWZcclxuXHJcbiNpZmRlZiBVU0VfQ0xFQVJDT0FUX1JPVUdITkVTU01BUFxyXG5cclxuXHR1bmlmb3JtIHNhbXBsZXIyRCBjbGVhcmNvYXRSb3VnaG5lc3NNYXA7XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuXHJcbiNpZmRlZiBVU0VfSVJJREVTQ0VOQ0VNQVBcclxuXHJcblx0dW5pZm9ybSBzYW1wbGVyMkQgaXJpZGVzY2VuY2VNYXA7XHJcblxyXG4jZW5kaWZcclxuXHJcbiNpZmRlZiBVU0VfSVJJREVTQ0VOQ0VfVEhJQ0tORVNTTUFQXHJcblxyXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwO1xyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbiNpZmRlZiBPUEFRVUVcclxuZGlmZnVzZUNvbG9yLmEgPSAxLjA7XHJcbiNlbmRpZlxyXG5cclxuI2lmZGVmIFVTRV9UUkFOU01JU1NJT05cclxuZGlmZnVzZUNvbG9yLmEgKj0gbWF0ZXJpYWwudHJhbnNtaXNzaW9uQWxwaGE7XHJcbiNlbmRpZlxyXG5cclxuZ2xfRnJhZ0NvbG9yID0gdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxudmVjMyBwYWNrTm9ybWFsVG9SR0IoIGNvbnN0IGluIHZlYzMgbm9ybWFsICkge1xyXG5cdHJldHVybiBub3JtYWxpemUoIG5vcm1hbCApICogMC41ICsgMC41O1xyXG59XHJcblxyXG52ZWMzIHVucGFja1JHQlRvTm9ybWFsKCBjb25zdCBpbiB2ZWMzIHJnYiApIHtcclxuXHRyZXR1cm4gMi4wICogcmdiLnh5eiAtIDEuMDtcclxufVxyXG5cclxuY29uc3QgZmxvYXQgUGFja1Vwc2NhbGUgPSAyNTYuIC8gMjU1LjsgLy8gZnJhY3Rpb24gLT4gMC4uMSAoaW5jbHVkaW5nIDEpXHJcbmNvbnN0IGZsb2F0IFVucGFja0Rvd25zY2FsZSA9IDI1NS4gLyAyNTYuOyAvLyAwLi4xIC0+IGZyYWN0aW9uIChleGNsdWRpbmcgMSlcclxuY29uc3QgZmxvYXQgU2hpZnRSaWdodDggPSAxLiAvIDI1Ni47XHJcbmNvbnN0IGZsb2F0IEludjI1NSA9IDEuIC8gMjU1LjtcclxuXHJcbmNvbnN0IHZlYzQgUGFja0ZhY3RvcnMgPSB2ZWM0KCAxLjAsIDI1Ni4wLCAyNTYuMCAqIDI1Ni4wLCAyNTYuMCAqIDI1Ni4wICogMjU2LjAgKTtcclxuXHJcbmNvbnN0IHZlYzIgVW5wYWNrRmFjdG9yczIgPSB2ZWMyKCBVbnBhY2tEb3duc2NhbGUsIDEuMCAvIFBhY2tGYWN0b3JzLmcgKTtcclxuY29uc3QgdmVjMyBVbnBhY2tGYWN0b3JzMyA9IHZlYzMoIFVucGFja0Rvd25zY2FsZSAvIFBhY2tGYWN0b3JzLnJnLCAxLjAgLyBQYWNrRmFjdG9ycy5iICk7XHJcbmNvbnN0IHZlYzQgVW5wYWNrRmFjdG9yczQgPSB2ZWM0KCBVbnBhY2tEb3duc2NhbGUgLyBQYWNrRmFjdG9ycy5yZ2IsIDEuMCAvIFBhY2tGYWN0b3JzLmEgKTtcclxuXHJcbnZlYzQgcGFja0RlcHRoVG9SR0JBKCBjb25zdCBpbiBmbG9hdCB2ICkge1xyXG5cdGlmKCB2IDw9IDAuMCApXHJcblx0XHRyZXR1cm4gdmVjNCggMC4sIDAuLCAwLiwgMC4gKTtcclxuXHRpZiggdiA+PSAxLjAgKVxyXG5cdFx0cmV0dXJuIHZlYzQoIDEuLCAxLiwgMS4sIDEuICk7XHJcblx0ZmxvYXQgdnVmO1xyXG5cdGZsb2F0IGFmID0gbW9kZiggdiAqIFBhY2tGYWN0b3JzLmEsIHZ1ZiApO1xyXG5cdGZsb2F0IGJmID0gbW9kZiggdnVmICogU2hpZnRSaWdodDgsIHZ1ZiApO1xyXG5cdGZsb2F0IGdmID0gbW9kZiggdnVmICogU2hpZnRSaWdodDgsIHZ1ZiApO1xyXG5cdHJldHVybiB2ZWM0KCB2dWYgKiBJbnYyNTUsIGdmICogUGFja1Vwc2NhbGUsIGJmICogUGFja1Vwc2NhbGUsIGFmICk7XHJcbn1cclxuXHJcbnZlYzMgcGFja0RlcHRoVG9SR0IoIGNvbnN0IGluIGZsb2F0IHYgKSB7XHJcblx0aWYoIHYgPD0gMC4wIClcclxuXHRcdHJldHVybiB2ZWMzKCAwLiwgMC4sIDAuICk7XHJcblx0aWYoIHYgPj0gMS4wIClcclxuXHRcdHJldHVybiB2ZWMzKCAxLiwgMS4sIDEuICk7XHJcblx0ZmxvYXQgdnVmO1xyXG5cdGZsb2F0IGJmID0gbW9kZiggdiAqIFBhY2tGYWN0b3JzLmIsIHZ1ZiApO1xyXG5cdGZsb2F0IGdmID0gbW9kZiggdnVmICogU2hpZnRSaWdodDgsIHZ1ZiApO1xyXG5cdC8vIHRoZSAwLjk5OTkgdHdlYWsgaXMgdW5pbXBvcnRhbnQsIHZlcnkgdGlueSBlbXBpcmljYWwgaW1wcm92ZW1lbnRcclxuXHQvLyByZXR1cm4gdmVjMyggdnVmICogSW52MjU1LCBnZiAqIFBhY2tVcHNjYWxlLCBiZiAqIDAuOTk5OSApO1xyXG5cdHJldHVybiB2ZWMzKCB2dWYgKiBJbnYyNTUsIGdmICogUGFja1Vwc2NhbGUsIGJmICk7XHJcbn1cclxuXHJcbnZlYzIgcGFja0RlcHRoVG9SRyggY29uc3QgaW4gZmxvYXQgdiApIHtcclxuXHRpZiggdiA8PSAwLjAgKVxyXG5cdFx0cmV0dXJuIHZlYzIoIDAuLCAwLiApO1xyXG5cdGlmKCB2ID49IDEuMCApXHJcblx0XHRyZXR1cm4gdmVjMiggMS4sIDEuICk7XHJcblx0ZmxvYXQgdnVmO1xyXG5cdGZsb2F0IGdmID0gbW9kZiggdiAqIDI1Ni4sIHZ1ZiApO1xyXG5cdHJldHVybiB2ZWMyKCB2dWYgKiBJbnYyNTUsIGdmICk7XHJcbn1cclxuXHJcbmZsb2F0IHVucGFja1JHQkFUb0RlcHRoKCBjb25zdCBpbiB2ZWM0IHYgKSB7XHJcblx0cmV0dXJuIGRvdCggdiwgVW5wYWNrRmFjdG9yczQgKTtcclxufVxyXG5cclxuZmxvYXQgdW5wYWNrUkdCVG9EZXB0aCggY29uc3QgaW4gdmVjMyB2ICkge1xyXG5cdHJldHVybiBkb3QoIHYsIFVucGFja0ZhY3RvcnMzICk7XHJcbn1cclxuXHJcbmZsb2F0IHVucGFja1JHVG9EZXB0aCggY29uc3QgaW4gdmVjMiB2ICkge1xyXG5cdHJldHVybiB2LnIgKiBVbnBhY2tGYWN0b3JzMi5yICsgdi5nICogVW5wYWNrRmFjdG9yczIuZztcclxufVxyXG5cclxudmVjNCBwYWNrMkhhbGZUb1JHQkEoIGNvbnN0IGluIHZlYzIgdiApIHtcclxuXHR2ZWM0IHIgPSB2ZWM0KCB2LngsIGZyYWN0KCB2LnggKiAyNTUuMCApLCB2LnksIGZyYWN0KCB2LnkgKiAyNTUuMCApICk7XHJcblx0cmV0dXJuIHZlYzQoIHIueCAtIHIueSAvIDI1NS4wLCByLnksIHIueiAtIHIudyAvIDI1NS4wLCByLncgKTtcclxufVxyXG5cclxudmVjMiB1bnBhY2tSR0JBVG8ySGFsZiggY29uc3QgaW4gdmVjNCB2ICkge1xyXG5cdHJldHVybiB2ZWMyKCB2LnggKyAoIHYueSAvIDI1NS4wICksIHYueiArICggdi53IC8gMjU1LjAgKSApO1xyXG59XHJcblxyXG4vLyBOT1RFOiB2aWV3WiwgdGhlIHotY29vcmRpbmF0ZSBpbiBjYW1lcmEgc3BhY2UsIGlzIG5lZ2F0aXZlIGZvciBwb2ludHMgaW4gZnJvbnQgb2YgdGhlIGNhbWVyYVxyXG5cclxuZmxvYXQgdmlld1pUb09ydGhvZ3JhcGhpY0RlcHRoKCBjb25zdCBpbiBmbG9hdCB2aWV3WiwgY29uc3QgaW4gZmxvYXQgbmVhciwgY29uc3QgaW4gZmxvYXQgZmFyICkge1xyXG5cdC8vIC1uZWFyIG1hcHMgdG8gMDsgLWZhciBtYXBzIHRvIDFcclxuXHRyZXR1cm4gKCB2aWV3WiArIG5lYXIgKSAvICggbmVhciAtIGZhciApO1xyXG59XHJcblxyXG5mbG9hdCBvcnRob2dyYXBoaWNEZXB0aFRvVmlld1ooIGNvbnN0IGluIGZsb2F0IGRlcHRoLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XHJcblx0Ly8gbWFwcyBvcnRob2dyYXBoaWMgZGVwdGggaW4gWyAwLCAxIF0gdG8gdmlld1pcclxuXHRyZXR1cm4gZGVwdGggKiAoIG5lYXIgLSBmYXIgKSAtIG5lYXI7XHJcbn1cclxuXHJcbi8vIE5PVEU6IGh0dHBzOi8vdHdpdHRlci5jb20vZ29ubmF2aXMvc3RhdHVzLzEzNzcxODM3ODY5NDk5NTk2ODJcclxuXHJcbmZsb2F0IHZpZXdaVG9QZXJzcGVjdGl2ZURlcHRoKCBjb25zdCBpbiBmbG9hdCB2aWV3WiwgY29uc3QgaW4gZmxvYXQgbmVhciwgY29uc3QgaW4gZmxvYXQgZmFyICkge1xyXG5cdC8vIC1uZWFyIG1hcHMgdG8gMDsgLWZhciBtYXBzIHRvIDFcclxuXHRyZXR1cm4gKCAoIG5lYXIgKyB2aWV3WiApICogZmFyICkgLyAoICggZmFyIC0gbmVhciApICogdmlld1ogKTtcclxufVxyXG5cclxuZmxvYXQgcGVyc3BlY3RpdmVEZXB0aFRvVmlld1ooIGNvbnN0IGluIGZsb2F0IGRlcHRoLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XHJcblx0Ly8gbWFwcyBwZXJzcGVjdGl2ZSBkZXB0aCBpbiBbIDAsIDEgXSB0byB2aWV3WlxyXG5cdHJldHVybiAoIG5lYXIgKiBmYXIgKSAvICggKCBmYXIgLSBuZWFyICkgKiBkZXB0aCAtIGZhciApO1xyXG59XHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbiNpZmRlZiBQUkVNVUxUSVBMSUVEX0FMUEhBXHJcblxyXG5cdC8vIEdldCBnZXQgbm9ybWFsIGJsZW5kaW5nIHdpdGggcHJlbXVsdGlwbGVkLCB1c2Ugd2l0aCBDdXN0b21CbGVuZGluZywgT25lRmFjdG9yLCBPbmVNaW51c1NyY0FscGhhRmFjdG9yLCBBZGRFcXVhdGlvbi5cclxuXHRnbF9GcmFnQ29sb3IucmdiICo9IGdsX0ZyYWdDb2xvci5hO1xyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbnZlYzQgbXZQb3NpdGlvbiA9IHZlYzQoIHRyYW5zZm9ybWVkLCAxLjAgKTtcclxuXHJcbiNpZmRlZiBVU0VfQkFUQ0hJTkdcclxuXHJcblx0bXZQb3NpdGlvbiA9IGJhdGNoaW5nTWF0cml4ICogbXZQb3NpdGlvbjtcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmZGVmIFVTRV9JTlNUQU5DSU5HXHJcblxyXG5cdG12UG9zaXRpb24gPSBpbnN0YW5jZU1hdHJpeCAqIG12UG9zaXRpb247XHJcblxyXG4jZW5kaWZcclxuXHJcbm12UG9zaXRpb24gPSBtb2RlbFZpZXdNYXRyaXggKiBtdlBvc2l0aW9uO1xyXG5cclxuZ2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjtcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmZGVmIERJVEhFUklOR1xyXG5cclxuXHRnbF9GcmFnQ29sb3IucmdiID0gZGl0aGVyaW5nKCBnbF9GcmFnQ29sb3IucmdiICk7XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmZGVmIERJVEhFUklOR1xyXG5cclxuXHQvLyBiYXNlZCBvbiBodHRwczovL3d3dy5zaGFkZXJ0b3kuY29tL3ZpZXcvTXNsR1I4XHJcblx0dmVjMyBkaXRoZXJpbmcoIHZlYzMgY29sb3IgKSB7XHJcblx0XHQvL0NhbGN1bGF0ZSBncmlkIHBvc2l0aW9uXHJcblx0XHRmbG9hdCBncmlkX3Bvc2l0aW9uID0gcmFuZCggZ2xfRnJhZ0Nvb3JkLnh5ICk7XHJcblxyXG5cdFx0Ly9TaGlmdCB0aGUgaW5kaXZpZHVhbCBjb2xvcnMgZGlmZmVyZW50bHksIHRodXMgbWFraW5nIGl0IGV2ZW4gaGFyZGVyIHRvIHNlZSB0aGUgZGl0aGVyaW5nIHBhdHRlcm5cclxuXHRcdHZlYzMgZGl0aGVyX3NoaWZ0X1JHQiA9IHZlYzMoIDAuMjUgLyAyNTUuMCwgLTAuMjUgLyAyNTUuMCwgMC4yNSAvIDI1NS4wICk7XHJcblxyXG5cdFx0Ly9tb2RpZnkgc2hpZnQgYWNjb3JkaW5nIHRvIGdyaWQgcG9zaXRpb24uXHJcblx0XHRkaXRoZXJfc2hpZnRfUkdCID0gbWl4KCAyLjAgKiBkaXRoZXJfc2hpZnRfUkdCLCAtMi4wICogZGl0aGVyX3NoaWZ0X1JHQiwgZ3JpZF9wb3NpdGlvbiApO1xyXG5cclxuXHRcdC8vc2hpZnQgdGhlIGNvbG9yIGJ5IGRpdGhlcl9zaGlmdFxyXG5cdFx0cmV0dXJuIGNvbG9yICsgZGl0aGVyX3NoaWZ0X1JHQjtcclxuXHR9XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuZmxvYXQgcm91Z2huZXNzRmFjdG9yID0gcm91Z2huZXNzO1xyXG5cclxuI2lmZGVmIFVTRV9ST1VHSE5FU1NNQVBcclxuXHJcblx0dmVjNCB0ZXhlbFJvdWdobmVzcyA9IHRleHR1cmUyRCggcm91Z2huZXNzTWFwLCB2Um91Z2huZXNzTWFwVXYgKTtcclxuXHJcblx0Ly8gcmVhZHMgY2hhbm5lbCBHLCBjb21wYXRpYmxlIHdpdGggYSBjb21iaW5lZCBPY2NsdXNpb25Sb3VnaG5lc3NNZXRhbGxpYyAoUkdCKSB0ZXh0dXJlXHJcblx0cm91Z2huZXNzRmFjdG9yICo9IHRleGVsUm91Z2huZXNzLmc7XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmZGVmIFVTRV9ST1VHSE5FU1NNQVBcclxuXHJcblx0dW5pZm9ybSBzYW1wbGVyMkQgcm91Z2huZXNzTWFwO1xyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbiNpZiBOVU1fU1BPVF9MSUdIVF9DT09SRFMgPiAwXHJcblxyXG5cdHZhcnlpbmcgdmVjNCB2U3BvdExpZ2h0Q29vcmRbIE5VTV9TUE9UX0xJR0hUX0NPT1JEUyBdO1xyXG5cclxuI2VuZGlmXHJcblxyXG4jaWYgTlVNX1NQT1RfTElHSFRfTUFQUyA+IDBcclxuXHJcblx0dW5pZm9ybSBzYW1wbGVyMkQgc3BvdExpZ2h0TWFwWyBOVU1fU1BPVF9MSUdIVF9NQVBTIF07XHJcblxyXG4jZW5kaWZcclxuXHJcbiNpZmRlZiBVU0VfU0hBRE9XTUFQXHJcblxyXG5cdCNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgPiAwXHJcblxyXG5cdFx0dW5pZm9ybSBzYW1wbGVyMkQgZGlyZWN0aW9uYWxTaGFkb3dNYXBbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdO1xyXG5cdFx0dmFyeWluZyB2ZWM0IHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBOVU1fRElSX0xJR0hUX1NIQURPV1MgXTtcclxuXHJcblx0XHRzdHJ1Y3QgRGlyZWN0aW9uYWxMaWdodFNoYWRvdyB7XHJcblx0XHRcdGZsb2F0IHNoYWRvd0ludGVuc2l0eTtcclxuXHRcdFx0ZmxvYXQgc2hhZG93QmlhcztcclxuXHRcdFx0ZmxvYXQgc2hhZG93Tm9ybWFsQmlhcztcclxuXHRcdFx0ZmxvYXQgc2hhZG93UmFkaXVzO1xyXG5cdFx0XHR2ZWMyIHNoYWRvd01hcFNpemU7XHJcblx0XHR9O1xyXG5cclxuXHRcdHVuaWZvcm0gRGlyZWN0aW9uYWxMaWdodFNoYWRvdyBkaXJlY3Rpb25hbExpZ2h0U2hhZG93c1sgTlVNX0RJUl9MSUdIVF9TSEFET1dTIF07XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuXHQjaWYgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyA+IDBcclxuXHJcblx0XHR1bmlmb3JtIHNhbXBsZXIyRCBzcG90U2hhZG93TWFwWyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIF07XHJcblxyXG5cdFx0c3RydWN0IFNwb3RMaWdodFNoYWRvdyB7XHJcblx0XHRcdGZsb2F0IHNoYWRvd0ludGVuc2l0eTtcclxuXHRcdFx0ZmxvYXQgc2hhZG93QmlhcztcclxuXHRcdFx0ZmxvYXQgc2hhZG93Tm9ybWFsQmlhcztcclxuXHRcdFx0ZmxvYXQgc2hhZG93UmFkaXVzO1xyXG5cdFx0XHR2ZWMyIHNoYWRvd01hcFNpemU7XHJcblx0XHR9O1xyXG5cclxuXHRcdHVuaWZvcm0gU3BvdExpZ2h0U2hhZG93IHNwb3RMaWdodFNoYWRvd3NbIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXTtcclxuXHJcblx0I2VuZGlmXHJcblxyXG5cdCNpZiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyA+IDBcclxuXHJcblx0XHR1bmlmb3JtIHNhbXBsZXIyRCBwb2ludFNoYWRvd01hcFsgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXTtcclxuXHRcdHZhcnlpbmcgdmVjNCB2UG9pbnRTaGFkb3dDb29yZFsgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXTtcclxuXHJcblx0XHRzdHJ1Y3QgUG9pbnRMaWdodFNoYWRvdyB7XHJcblx0XHRcdGZsb2F0IHNoYWRvd0ludGVuc2l0eTtcclxuXHRcdFx0ZmxvYXQgc2hhZG93QmlhcztcclxuXHRcdFx0ZmxvYXQgc2hhZG93Tm9ybWFsQmlhcztcclxuXHRcdFx0ZmxvYXQgc2hhZG93UmFkaXVzO1xyXG5cdFx0XHR2ZWMyIHNoYWRvd01hcFNpemU7XHJcblx0XHRcdGZsb2F0IHNoYWRvd0NhbWVyYU5lYXI7XHJcblx0XHRcdGZsb2F0IHNoYWRvd0NhbWVyYUZhcjtcclxuXHRcdH07XHJcblxyXG5cdFx0dW5pZm9ybSBQb2ludExpZ2h0U2hhZG93IHBvaW50TGlnaHRTaGFkb3dzWyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBdO1xyXG5cclxuXHQjZW5kaWZcclxuXHJcblx0LypcclxuXHQjaWYgTlVNX1JFQ1RfQVJFQV9MSUdIVFMgPiAwXHJcblxyXG5cdFx0Ly8gVE9ETyAoYWJlbG5hdGlvbik6IGNyZWF0ZSB1bmlmb3JtcyBmb3IgYXJlYSBsaWdodCBzaGFkb3dzXHJcblxyXG5cdCNlbmRpZlxyXG5cdCovXHJcblxyXG5cdGZsb2F0IHRleHR1cmUyRENvbXBhcmUoIHNhbXBsZXIyRCBkZXB0aHMsIHZlYzIgdXYsIGZsb2F0IGNvbXBhcmUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHN0ZXAoIGNvbXBhcmUsIHVucGFja1JHQkFUb0RlcHRoKCB0ZXh0dXJlMkQoIGRlcHRocywgdXYgKSApICk7XHJcblxyXG5cdH1cclxuXHJcblx0dmVjMiB0ZXh0dXJlMkREaXN0cmlidXRpb24oIHNhbXBsZXIyRCBzaGFkb3csIHZlYzIgdXYgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHVucGFja1JHQkFUbzJIYWxmKCB0ZXh0dXJlMkQoIHNoYWRvdywgdXYgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdGZsb2F0IFZTTVNoYWRvdyAoc2FtcGxlcjJEIHNoYWRvdywgdmVjMiB1diwgZmxvYXQgY29tcGFyZSApe1xyXG5cclxuXHRcdGZsb2F0IG9jY2x1c2lvbiA9IDEuMDtcclxuXHJcblx0XHR2ZWMyIGRpc3RyaWJ1dGlvbiA9IHRleHR1cmUyRERpc3RyaWJ1dGlvbiggc2hhZG93LCB1diApO1xyXG5cclxuXHRcdGZsb2F0IGhhcmRfc2hhZG93ID0gc3RlcCggY29tcGFyZSAsIGRpc3RyaWJ1dGlvbi54ICk7IC8vIEhhcmQgU2hhZG93XHJcblxyXG5cdFx0aWYgKGhhcmRfc2hhZG93ICE9IDEuMCApIHtcclxuXHJcblx0XHRcdGZsb2F0IGRpc3RhbmNlID0gY29tcGFyZSAtIGRpc3RyaWJ1dGlvbi54IDtcclxuXHRcdFx0ZmxvYXQgdmFyaWFuY2UgPSBtYXgoIDAuMDAwMDAsIGRpc3RyaWJ1dGlvbi55ICogZGlzdHJpYnV0aW9uLnkgKTtcclxuXHRcdFx0ZmxvYXQgc29mdG5lc3NfcHJvYmFiaWxpdHkgPSB2YXJpYW5jZSAvICh2YXJpYW5jZSArIGRpc3RhbmNlICogZGlzdGFuY2UgKTsgLy8gQ2hlYmV5c2hldnMgaW5lcXVhbGl0eVxyXG5cdFx0XHRzb2Z0bmVzc19wcm9iYWJpbGl0eSA9IGNsYW1wKCAoIHNvZnRuZXNzX3Byb2JhYmlsaXR5IC0gMC4zICkgLyAoIDAuOTUgLSAwLjMgKSwgMC4wLCAxLjAgKTsgLy8gMC4zIHJlZHVjZXMgbGlnaHQgYmxlZWRcclxuXHRcdFx0b2NjbHVzaW9uID0gY2xhbXAoIG1heCggaGFyZF9zaGFkb3csIHNvZnRuZXNzX3Byb2JhYmlsaXR5ICksIDAuMCwgMS4wICk7XHJcblxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIG9jY2x1c2lvbjtcclxuXHJcblx0fVxyXG5cclxuXHRmbG9hdCBnZXRTaGFkb3coIHNhbXBsZXIyRCBzaGFkb3dNYXAsIHZlYzIgc2hhZG93TWFwU2l6ZSwgZmxvYXQgc2hhZG93SW50ZW5zaXR5LCBmbG9hdCBzaGFkb3dCaWFzLCBmbG9hdCBzaGFkb3dSYWRpdXMsIHZlYzQgc2hhZG93Q29vcmQgKSB7XHJcblxyXG5cdFx0ZmxvYXQgc2hhZG93ID0gMS4wO1xyXG5cclxuXHRcdHNoYWRvd0Nvb3JkLnh5eiAvPSBzaGFkb3dDb29yZC53O1xyXG5cdFx0c2hhZG93Q29vcmQueiArPSBzaGFkb3dCaWFzO1xyXG5cclxuXHRcdGJvb2wgaW5GcnVzdHVtID0gc2hhZG93Q29vcmQueCA+PSAwLjAgJiYgc2hhZG93Q29vcmQueCA8PSAxLjAgJiYgc2hhZG93Q29vcmQueSA+PSAwLjAgJiYgc2hhZG93Q29vcmQueSA8PSAxLjA7XHJcblx0XHRib29sIGZydXN0dW1UZXN0ID0gaW5GcnVzdHVtICYmIHNoYWRvd0Nvb3JkLnogPD0gMS4wO1xyXG5cclxuXHRcdGlmICggZnJ1c3R1bVRlc3QgKSB7XHJcblxyXG5cdFx0I2lmIGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1BDRiApXHJcblxyXG5cdFx0XHR2ZWMyIHRleGVsU2l6ZSA9IHZlYzIoIDEuMCApIC8gc2hhZG93TWFwU2l6ZTtcclxuXHJcblx0XHRcdGZsb2F0IGR4MCA9IC0gdGV4ZWxTaXplLnggKiBzaGFkb3dSYWRpdXM7XHJcblx0XHRcdGZsb2F0IGR5MCA9IC0gdGV4ZWxTaXplLnkgKiBzaGFkb3dSYWRpdXM7XHJcblx0XHRcdGZsb2F0IGR4MSA9ICsgdGV4ZWxTaXplLnggKiBzaGFkb3dSYWRpdXM7XHJcblx0XHRcdGZsb2F0IGR5MSA9ICsgdGV4ZWxTaXplLnkgKiBzaGFkb3dSYWRpdXM7XHJcblx0XHRcdGZsb2F0IGR4MiA9IGR4MCAvIDIuMDtcclxuXHRcdFx0ZmxvYXQgZHkyID0gZHkwIC8gMi4wO1xyXG5cdFx0XHRmbG9hdCBkeDMgPSBkeDEgLyAyLjA7XHJcblx0XHRcdGZsb2F0IGR5MyA9IGR5MSAvIDIuMDtcclxuXHJcblx0XHRcdHNoYWRvdyA9IChcclxuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcclxuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcclxuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcclxuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgyLCBkeTIgKSwgc2hhZG93Q29vcmQueiApICtcclxuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTIgKSwgc2hhZG93Q29vcmQueiApICtcclxuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgzLCBkeTIgKSwgc2hhZG93Q29vcmQueiApICtcclxuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcclxuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgyLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcclxuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICkgK1xyXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDMsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xyXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xyXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDIsIGR5MyApLCBzaGFkb3dDb29yZC56ICkgK1xyXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MyApLCBzaGFkb3dDb29yZC56ICkgK1xyXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDMsIGR5MyApLCBzaGFkb3dDb29yZC56ICkgK1xyXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIGR5MSApLCBzaGFkb3dDb29yZC56ICkgK1xyXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MSApLCBzaGFkb3dDb29yZC56ICkgK1xyXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIGR5MSApLCBzaGFkb3dDb29yZC56IClcclxuXHRcdFx0KSAqICggMS4wIC8gMTcuMCApO1xyXG5cclxuXHRcdCNlbGlmIGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1BDRl9TT0ZUIClcclxuXHJcblx0XHRcdHZlYzIgdGV4ZWxTaXplID0gdmVjMiggMS4wICkgLyBzaGFkb3dNYXBTaXplO1xyXG5cdFx0XHRmbG9hdCBkeCA9IHRleGVsU2l6ZS54O1xyXG5cdFx0XHRmbG9hdCBkeSA9IHRleGVsU2l6ZS55O1xyXG5cclxuXHRcdFx0dmVjMiB1diA9IHNoYWRvd0Nvb3JkLnh5O1xyXG5cdFx0XHR2ZWMyIGYgPSBmcmFjdCggdXYgKiBzaGFkb3dNYXBTaXplICsgMC41ICk7XHJcblx0XHRcdHV2IC09IGYgKiB0ZXhlbFNpemU7XHJcblxyXG5cdFx0XHRzaGFkb3cgPSAoXHJcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diwgc2hhZG93Q29vcmQueiApICtcclxuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggZHgsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xyXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAwLjAsIGR5ICksIHNoYWRvd0Nvb3JkLnogKSArXHJcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHRleGVsU2l6ZSwgc2hhZG93Q29vcmQueiApICtcclxuXHRcdFx0XHRtaXgoIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAtZHgsIDAuMCApLCBzaGFkb3dDb29yZC56ICksXHJcblx0XHRcdFx0XHQgdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIDIuMCAqIGR4LCAwLjAgKSwgc2hhZG93Q29vcmQueiApLFxyXG5cdFx0XHRcdFx0IGYueCApICtcclxuXHRcdFx0XHRtaXgoIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAtZHgsIGR5ICksIHNoYWRvd0Nvb3JkLnogKSxcclxuXHRcdFx0XHRcdCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggMi4wICogZHgsIGR5ICksIHNoYWRvd0Nvb3JkLnogKSxcclxuXHRcdFx0XHRcdCBmLnggKSArXHJcblx0XHRcdFx0bWl4KCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggMC4wLCAtZHkgKSwgc2hhZG93Q29vcmQueiApLFxyXG5cdFx0XHRcdFx0IHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAwLjAsIDIuMCAqIGR5ICksIHNoYWRvd0Nvb3JkLnogKSxcclxuXHRcdFx0XHRcdCBmLnkgKSArXHJcblx0XHRcdFx0bWl4KCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggZHgsIC1keSApLCBzaGFkb3dDb29yZC56ICksXHJcblx0XHRcdFx0XHQgdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIGR4LCAyLjAgKiBkeSApLCBzaGFkb3dDb29yZC56ICksXHJcblx0XHRcdFx0XHQgZi55ICkgK1xyXG5cdFx0XHRcdG1peCggbWl4KCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggLWR4LCAtZHkgKSwgc2hhZG93Q29vcmQueiApLFxyXG5cdFx0XHRcdFx0XHQgIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAyLjAgKiBkeCwgLWR5ICksIHNoYWRvd0Nvb3JkLnogKSxcclxuXHRcdFx0XHRcdFx0ICBmLnggKSxcclxuXHRcdFx0XHRcdCBtaXgoIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAtZHgsIDIuMCAqIGR5ICksIHNoYWRvd0Nvb3JkLnogKSxcclxuXHRcdFx0XHRcdFx0ICB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggMi4wICogZHgsIDIuMCAqIGR5ICksIHNoYWRvd0Nvb3JkLnogKSxcclxuXHRcdFx0XHRcdFx0ICBmLnggKSxcclxuXHRcdFx0XHRcdCBmLnkgKVxyXG5cdFx0XHQpICogKCAxLjAgLyA5LjAgKTtcclxuXHJcblx0XHQjZWxpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9WU00gKVxyXG5cclxuXHRcdFx0c2hhZG93ID0gVlNNU2hhZG93KCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICk7XHJcblxyXG5cdFx0I2Vsc2UgLy8gbm8gcGVyY2VudGFnZS1jbG9zZXIgZmlsdGVyaW5nOlxyXG5cclxuXHRcdFx0c2hhZG93ID0gdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSwgc2hhZG93Q29vcmQueiApO1xyXG5cclxuXHRcdCNlbmRpZlxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbWl4KCAxLjAsIHNoYWRvdywgc2hhZG93SW50ZW5zaXR5ICk7XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gY3ViZVRvVVYoKSBtYXBzIGEgM0QgZGlyZWN0aW9uIHZlY3RvciBzdWl0YWJsZSBmb3IgY3ViZSB0ZXh0dXJlIG1hcHBpbmcgdG8gYSAyRFxyXG5cdC8vIHZlY3RvciBzdWl0YWJsZSBmb3IgMkQgdGV4dHVyZSBtYXBwaW5nLiBUaGlzIGNvZGUgdXNlcyB0aGUgZm9sbG93aW5nIGxheW91dCBmb3IgdGhlXHJcblx0Ly8gMkQgdGV4dHVyZTpcclxuXHQvL1xyXG5cdC8vIHh6WFpcclxuXHQvLyAgeSBZXHJcblx0Ly9cclxuXHQvLyBZIC0gUG9zaXRpdmUgeSBkaXJlY3Rpb25cclxuXHQvLyB5IC0gTmVnYXRpdmUgeSBkaXJlY3Rpb25cclxuXHQvLyBYIC0gUG9zaXRpdmUgeCBkaXJlY3Rpb25cclxuXHQvLyB4IC0gTmVnYXRpdmUgeCBkaXJlY3Rpb25cclxuXHQvLyBaIC0gUG9zaXRpdmUgeiBkaXJlY3Rpb25cclxuXHQvLyB6IC0gTmVnYXRpdmUgeiBkaXJlY3Rpb25cclxuXHQvL1xyXG5cdC8vIFNvdXJjZSBhbmQgdGVzdCBiZWQ6XHJcblx0Ly8gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vdHNjaHcvZGExMGM0M2M0NjdjZThhZmQwYzRcclxuXHJcblx0dmVjMiBjdWJlVG9VViggdmVjMyB2LCBmbG9hdCB0ZXhlbFNpemVZICkge1xyXG5cclxuXHRcdC8vIE51bWJlciBvZiB0ZXhlbHMgdG8gYXZvaWQgYXQgdGhlIGVkZ2Ugb2YgZWFjaCBzcXVhcmVcclxuXHJcblx0XHR2ZWMzIGFic1YgPSBhYnMoIHYgKTtcclxuXHJcblx0XHQvLyBJbnRlcnNlY3QgdW5pdCBjdWJlXHJcblxyXG5cdFx0ZmxvYXQgc2NhbGVUb0N1YmUgPSAxLjAgLyBtYXgoIGFic1YueCwgbWF4KCBhYnNWLnksIGFic1YueiApICk7XHJcblx0XHRhYnNWICo9IHNjYWxlVG9DdWJlO1xyXG5cclxuXHRcdC8vIEFwcGx5IHNjYWxlIHRvIGF2b2lkIHNlYW1zXHJcblxyXG5cdFx0Ly8gdHdvIHRleGVscyBsZXNzIHBlciBzcXVhcmUgKG9uZSB0ZXhlbCB3aWxsIGRvIGZvciBORUFSRVNUKVxyXG5cdFx0diAqPSBzY2FsZVRvQ3ViZSAqICggMS4wIC0gMi4wICogdGV4ZWxTaXplWSApO1xyXG5cclxuXHRcdC8vIFVud3JhcFxyXG5cclxuXHRcdC8vIHNwYWNlOiAtMSAuLi4gMSByYW5nZSBmb3IgZWFjaCBzcXVhcmVcclxuXHRcdC8vXHJcblx0XHQvLyAjWCMjXHRcdGRpbSAgICA6PSAoIDQgLCAyIClcclxuXHRcdC8vICAjICNcdFx0Y2VudGVyIDo9ICggMSAsIDEgKVxyXG5cclxuXHRcdHZlYzIgcGxhbmFyID0gdi54eTtcclxuXHJcblx0XHRmbG9hdCBhbG1vc3RBVGV4ZWwgPSAxLjUgKiB0ZXhlbFNpemVZO1xyXG5cdFx0ZmxvYXQgYWxtb3N0T25lID0gMS4wIC0gYWxtb3N0QVRleGVsO1xyXG5cclxuXHRcdGlmICggYWJzVi56ID49IGFsbW9zdE9uZSApIHtcclxuXHJcblx0XHRcdGlmICggdi56ID4gMC4wIClcclxuXHRcdFx0XHRwbGFuYXIueCA9IDQuMCAtIHYueDtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBhYnNWLnggPj0gYWxtb3N0T25lICkge1xyXG5cclxuXHRcdFx0ZmxvYXQgc2lnblggPSBzaWduKCB2LnggKTtcclxuXHRcdFx0cGxhbmFyLnggPSB2LnogKiBzaWduWCArIDIuMCAqIHNpZ25YO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGFic1YueSA+PSBhbG1vc3RPbmUgKSB7XHJcblxyXG5cdFx0XHRmbG9hdCBzaWduWSA9IHNpZ24oIHYueSApO1xyXG5cdFx0XHRwbGFuYXIueCA9IHYueCArIDIuMCAqIHNpZ25ZICsgMi4wO1xyXG5cdFx0XHRwbGFuYXIueSA9IHYueiAqIHNpZ25ZIC0gMi4wO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBUcmFuc2Zvcm0gdG8gVVYgc3BhY2VcclxuXHJcblx0XHQvLyBzY2FsZSA6PSAwLjUgLyBkaW1cclxuXHRcdC8vIHRyYW5zbGF0ZSA6PSAoIGNlbnRlciArIDAuNSApIC8gZGltXHJcblx0XHRyZXR1cm4gdmVjMiggMC4xMjUsIDAuMjUgKSAqIHBsYW5hciArIHZlYzIoIDAuMzc1LCAwLjc1ICk7XHJcblxyXG5cdH1cclxuXHJcblx0ZmxvYXQgZ2V0UG9pbnRTaGFkb3coIHNhbXBsZXIyRCBzaGFkb3dNYXAsIHZlYzIgc2hhZG93TWFwU2l6ZSwgZmxvYXQgc2hhZG93SW50ZW5zaXR5LCBmbG9hdCBzaGFkb3dCaWFzLCBmbG9hdCBzaGFkb3dSYWRpdXMsIHZlYzQgc2hhZG93Q29vcmQsIGZsb2F0IHNoYWRvd0NhbWVyYU5lYXIsIGZsb2F0IHNoYWRvd0NhbWVyYUZhciApIHtcclxuXHJcblx0XHRmbG9hdCBzaGFkb3cgPSAxLjA7XHJcblxyXG5cdFx0Ly8gZm9yIHBvaW50IGxpZ2h0cywgdGhlIHVuaWZvcm0gQHZTaGFkb3dDb29yZCBpcyByZS1wdXJwb3NlZCB0byBob2xkXHJcblx0XHQvLyB0aGUgdmVjdG9yIGZyb20gdGhlIGxpZ2h0IHRvIHRoZSB3b3JsZC1zcGFjZSBwb3NpdGlvbiBvZiB0aGUgZnJhZ21lbnQuXHJcblx0XHR2ZWMzIGxpZ2h0VG9Qb3NpdGlvbiA9IHNoYWRvd0Nvb3JkLnh5ejtcclxuXHRcdFxyXG5cdFx0ZmxvYXQgbGlnaHRUb1Bvc2l0aW9uTGVuZ3RoID0gbGVuZ3RoKCBsaWdodFRvUG9zaXRpb24gKTtcclxuXHJcblx0XHRpZiAoIGxpZ2h0VG9Qb3NpdGlvbkxlbmd0aCAtIHNoYWRvd0NhbWVyYUZhciA8PSAwLjAgJiYgbGlnaHRUb1Bvc2l0aW9uTGVuZ3RoIC0gc2hhZG93Q2FtZXJhTmVhciA+PSAwLjAgKSB7XHJcblxyXG5cdFx0XHQvLyBkcCA9IG5vcm1hbGl6ZWQgZGlzdGFuY2UgZnJvbSBsaWdodCB0byBmcmFnbWVudCBwb3NpdGlvblxyXG5cdFx0XHRmbG9hdCBkcCA9ICggbGlnaHRUb1Bvc2l0aW9uTGVuZ3RoIC0gc2hhZG93Q2FtZXJhTmVhciApIC8gKCBzaGFkb3dDYW1lcmFGYXIgLSBzaGFkb3dDYW1lcmFOZWFyICk7IC8vIG5lZWQgdG8gY2xhbXA/XHJcblx0XHRcdGRwICs9IHNoYWRvd0JpYXM7XHJcblxyXG5cdFx0XHQvLyBiZDNEID0gYmFzZSBkaXJlY3Rpb24gM0RcclxuXHRcdFx0dmVjMyBiZDNEID0gbm9ybWFsaXplKCBsaWdodFRvUG9zaXRpb24gKTtcclxuXHJcblx0XHRcdHZlYzIgdGV4ZWxTaXplID0gdmVjMiggMS4wICkgLyAoIHNoYWRvd01hcFNpemUgKiB2ZWMyKCA0LjAsIDIuMCApICk7XHJcblxyXG5cdFx0XHQjaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGICkgfHwgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGX1NPRlQgKSB8fCBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9WU00gKVxyXG5cclxuXHRcdFx0XHR2ZWMyIG9mZnNldCA9IHZlYzIoIC0gMSwgMSApICogc2hhZG93UmFkaXVzICogdGV4ZWxTaXplLnk7XHJcblxyXG5cdFx0XHRcdHNoYWRvdyA9IChcclxuXHRcdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHl5LCB0ZXhlbFNpemUueSApLCBkcCApICtcclxuXHRcdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueXl5LCB0ZXhlbFNpemUueSApLCBkcCApICtcclxuXHRcdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHl4LCB0ZXhlbFNpemUueSApLCBkcCApICtcclxuXHRcdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueXl4LCB0ZXhlbFNpemUueSApLCBkcCApICtcclxuXHRcdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QsIHRleGVsU2l6ZS55ICksIGRwICkgK1xyXG5cdFx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eHksIHRleGVsU2l6ZS55ICksIGRwICkgK1xyXG5cdFx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eHksIHRleGVsU2l6ZS55ICksIGRwICkgK1xyXG5cdFx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eHgsIHRleGVsU2l6ZS55ICksIGRwICkgK1xyXG5cdFx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eHgsIHRleGVsU2l6ZS55ICksIGRwIClcclxuXHRcdFx0XHQpICogKCAxLjAgLyA5LjAgKTtcclxuXHJcblx0XHRcdCNlbHNlIC8vIG5vIHBlcmNlbnRhZ2UtY2xvc2VyIGZpbHRlcmluZ1xyXG5cclxuXHRcdFx0XHRzaGFkb3cgPSB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNELCB0ZXhlbFNpemUueSApLCBkcCApO1xyXG5cclxuXHRcdFx0I2VuZGlmXHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBtaXgoIDEuMCwgc2hhZG93LCBzaGFkb3dJbnRlbnNpdHkgKTtcclxuXHJcblx0fVxyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcblxyXG4jaWYgTlVNX1NQT1RfTElHSFRfQ09PUkRTID4gMFxyXG5cclxuXHR1bmlmb3JtIG1hdDQgc3BvdExpZ2h0TWF0cml4WyBOVU1fU1BPVF9MSUdIVF9DT09SRFMgXTtcclxuXHR2YXJ5aW5nIHZlYzQgdlNwb3RMaWdodENvb3JkWyBOVU1fU1BPVF9MSUdIVF9DT09SRFMgXTtcclxuXHJcbiNlbmRpZlxyXG5cclxuI2lmZGVmIFVTRV9TSEFET1dNQVBcclxuXHJcblx0I2lmIE5VTV9ESVJfTElHSFRfU0hBRE9XUyA+IDBcclxuXHJcblx0XHR1bmlmb3JtIG1hdDQgZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXhbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdO1xyXG5cdFx0dmFyeWluZyB2ZWM0IHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBOVU1fRElSX0xJR0hUX1NIQURPV1MgXTtcclxuXHJcblx0XHRzdHJ1Y3QgRGlyZWN0aW9uYWxMaWdodFNoYWRvdyB7XHJcblx0XHRcdGZsb2F0IHNoYWRvd0ludGVuc2l0eTtcclxuXHRcdFx0ZmxvYXQgc2hhZG93QmlhcztcclxuXHRcdFx0ZmxvYXQgc2hhZG93Tm9ybWFsQmlhcztcclxuXHRcdFx0ZmxvYXQgc2hhZG93UmFkaXVzO1xyXG5cdFx0XHR2ZWMyIHNoYWRvd01hcFNpemU7XHJcblx0XHR9O1xyXG5cclxuXHRcdHVuaWZvcm0gRGlyZWN0aW9uYWxMaWdodFNoYWRvdyBkaXJlY3Rpb25hbExpZ2h0U2hhZG93c1sgTlVNX0RJUl9MSUdIVF9TSEFET1dTIF07XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuXHQjaWYgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyA+IDBcclxuXHJcblx0XHRzdHJ1Y3QgU3BvdExpZ2h0U2hhZG93IHtcclxuXHRcdFx0ZmxvYXQgc2hhZG93SW50ZW5zaXR5O1xyXG5cdFx0XHRmbG9hdCBzaGFkb3dCaWFzO1xyXG5cdFx0XHRmbG9hdCBzaGFkb3dOb3JtYWxCaWFzO1xyXG5cdFx0XHRmbG9hdCBzaGFkb3dSYWRpdXM7XHJcblx0XHRcdHZlYzIgc2hhZG93TWFwU2l6ZTtcclxuXHRcdH07XHJcblxyXG5cdFx0dW5pZm9ybSBTcG90TGlnaHRTaGFkb3cgc3BvdExpZ2h0U2hhZG93c1sgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBdO1xyXG5cclxuXHQjZW5kaWZcclxuXHJcblx0I2lmIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTID4gMFxyXG5cclxuXHRcdHVuaWZvcm0gbWF0NCBwb2ludFNoYWRvd01hdHJpeFsgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXTtcclxuXHRcdHZhcnlpbmcgdmVjNCB2UG9pbnRTaGFkb3dDb29yZFsgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXTtcclxuXHJcblx0XHRzdHJ1Y3QgUG9pbnRMaWdodFNoYWRvdyB7XHJcblx0XHRcdGZsb2F0IHNoYWRvd0ludGVuc2l0eTtcclxuXHRcdFx0ZmxvYXQgc2hhZG93QmlhcztcclxuXHRcdFx0ZmxvYXQgc2hhZG93Tm9ybWFsQmlhcztcclxuXHRcdFx0ZmxvYXQgc2hhZG93UmFkaXVzO1xyXG5cdFx0XHR2ZWMyIHNoYWRvd01hcFNpemU7XHJcblx0XHRcdGZsb2F0IHNoYWRvd0NhbWVyYU5lYXI7XHJcblx0XHRcdGZsb2F0IHNoYWRvd0NhbWVyYUZhcjtcclxuXHRcdH07XHJcblxyXG5cdFx0dW5pZm9ybSBQb2ludExpZ2h0U2hhZG93IHBvaW50TGlnaHRTaGFkb3dzWyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBdO1xyXG5cclxuXHQjZW5kaWZcclxuXHJcblx0LypcclxuXHQjaWYgTlVNX1JFQ1RfQVJFQV9MSUdIVFMgPiAwXHJcblxyXG5cdFx0Ly8gVE9ETyAoYWJlbG5hdGlvbik6IHVuaWZvcm1zIGZvciBhcmVhIGxpZ2h0IHNoYWRvd3NcclxuXHJcblx0I2VuZGlmXHJcblx0Ki9cclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG5cclxuI2lmICggZGVmaW5lZCggVVNFX1NIQURPV01BUCApICYmICggTlVNX0RJUl9MSUdIVF9TSEFET1dTID4gMCB8fCBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyA+IDAgKSApIHx8ICggTlVNX1NQT1RfTElHSFRfQ09PUkRTID4gMCApXHJcblxyXG5cdC8vIE9mZnNldHRpbmcgdGhlIHBvc2l0aW9uIHVzZWQgZm9yIHF1ZXJ5aW5nIG9jY2x1c2lvbiBhbG9uZyB0aGUgd29ybGQgbm9ybWFsIGNhbiBiZSB1c2VkIHRvIHJlZHVjZSBzaGFkb3cgYWNuZS5cclxuXHR2ZWMzIHNoYWRvd1dvcmxkTm9ybWFsID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggdHJhbnNmb3JtZWROb3JtYWwsIHZpZXdNYXRyaXggKTtcclxuXHR2ZWM0IHNoYWRvd1dvcmxkUG9zaXRpb247XHJcblxyXG4jZW5kaWZcclxuXHJcbiNpZiBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQIClcclxuXHJcblx0I2lmIE5VTV9ESVJfTElHSFRfU0hBRE9XUyA+IDBcclxuXHJcblx0XHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XHJcblx0XHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fRElSX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRzaGFkb3dXb3JsZFBvc2l0aW9uID0gd29ybGRQb3NpdGlvbiArIHZlYzQoIHNoYWRvd1dvcmxkTm9ybWFsICogZGlyZWN0aW9uYWxMaWdodFNoYWRvd3NbIGkgXS5zaGFkb3dOb3JtYWxCaWFzLCAwICk7XHJcblx0XHRcdHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBpIF0gPSBkaXJlY3Rpb25hbFNoYWRvd01hdHJpeFsgaSBdICogc2hhZG93V29ybGRQb3NpdGlvbjtcclxuXHJcblx0XHR9XHJcblx0XHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxyXG5cclxuXHQjZW5kaWZcclxuXHJcblx0I2lmIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTID4gMFxyXG5cclxuXHRcdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcclxuXHRcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTOyBpICsrICkge1xyXG5cclxuXHRcdFx0c2hhZG93V29ybGRQb3NpdGlvbiA9IHdvcmxkUG9zaXRpb24gKyB2ZWM0KCBzaGFkb3dXb3JsZE5vcm1hbCAqIHBvaW50TGlnaHRTaGFkb3dzWyBpIF0uc2hhZG93Tm9ybWFsQmlhcywgMCApO1xyXG5cdFx0XHR2UG9pbnRTaGFkb3dDb29yZFsgaSBdID0gcG9pbnRTaGFkb3dNYXRyaXhbIGkgXSAqIHNoYWRvd1dvcmxkUG9zaXRpb247XHJcblxyXG5cdFx0fVxyXG5cdFx0I3ByYWdtYSB1bnJvbGxfbG9vcF9lbmRcclxuXHJcblx0I2VuZGlmXHJcblxyXG5cdC8qXHJcblx0I2lmIE5VTV9SRUNUX0FSRUFfTElHSFRTID4gMFxyXG5cclxuXHRcdC8vIFRPRE8gKGFiZWxuYXRpb24pOiB1cGRhdGUgdkFyZWFTaGFkb3dDb29yZCB3aXRoIGFyZWEgbGlnaHQgaW5mb1xyXG5cclxuXHQjZW5kaWZcclxuXHQqL1xyXG5cclxuI2VuZGlmXHJcblxyXG4vLyBzcG90IGxpZ2h0cyBjYW4gYmUgZXZhbHVhdGVkIHdpdGhvdXQgYWN0aXZlIHNoYWRvdyBtYXBwaW5nICh3aGVuIFNwb3RMaWdodC5tYXAgaXMgdXNlZClcclxuXHJcbiNpZiBOVU1fU1BPVF9MSUdIVF9DT09SRFMgPiAwXHJcblxyXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcclxuXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fU1BPVF9MSUdIVF9DT09SRFM7IGkgKysgKSB7XHJcblxyXG5cdFx0c2hhZG93V29ybGRQb3NpdGlvbiA9IHdvcmxkUG9zaXRpb247XHJcblx0XHQjaWYgKCBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQICkgJiYgVU5ST0xMRURfTE9PUF9JTkRFWCA8IE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgKVxyXG5cdFx0XHRzaGFkb3dXb3JsZFBvc2l0aW9uLnh5eiArPSBzaGFkb3dXb3JsZE5vcm1hbCAqIHNwb3RMaWdodFNoYWRvd3NbIGkgXS5zaGFkb3dOb3JtYWxCaWFzO1xyXG5cdFx0I2VuZGlmXHJcblx0XHR2U3BvdExpZ2h0Q29vcmRbIGkgXSA9IHNwb3RMaWdodE1hdHJpeFsgaSBdICogc2hhZG93V29ybGRQb3NpdGlvbjtcclxuXHJcblx0fVxyXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXHJcblxyXG4jZW5kaWZcclxuXHJcblxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG5mbG9hdCBnZXRTaGFkb3dNYXNrKCkge1xyXG5cclxuXHRmbG9hdCBzaGFkb3cgPSAxLjA7XHJcblxyXG5cdCNpZmRlZiBVU0VfU0hBRE9XTUFQXHJcblxyXG5cdCNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgPiAwXHJcblxyXG5cdERpcmVjdGlvbmFsTGlnaHRTaGFkb3cgZGlyZWN0aW9uYWxMaWdodDtcclxuXHJcblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxyXG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9ESVJfTElHSFRfU0hBRE9XUzsgaSArKyApIHtcclxuXHJcblx0XHRkaXJlY3Rpb25hbExpZ2h0ID0gZGlyZWN0aW9uYWxMaWdodFNoYWRvd3NbIGkgXTtcclxuXHRcdHNoYWRvdyAqPSByZWNlaXZlU2hhZG93ID8gZ2V0U2hhZG93KCBkaXJlY3Rpb25hbFNoYWRvd01hcFsgaSBdLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd01hcFNpemUsIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93SW50ZW5zaXR5LCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd0JpYXMsIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93UmFkaXVzLCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7XHJcblxyXG5cdH1cclxuXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxyXG5cclxuXHQjZW5kaWZcclxuXHJcblx0I2lmIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgPiAwXHJcblxyXG5cdFNwb3RMaWdodFNoYWRvdyBzcG90TGlnaHQ7XHJcblxyXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcclxuXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fU1BPVF9MSUdIVF9TSEFET1dTOyBpICsrICkge1xyXG5cclxuXHRcdHNwb3RMaWdodCA9IHNwb3RMaWdodFNoYWRvd3NbIGkgXTtcclxuXHRcdHNoYWRvdyAqPSByZWNlaXZlU2hhZG93ID8gZ2V0U2hhZG93KCBzcG90U2hhZG93TWFwWyBpIF0sIHNwb3RMaWdodC5zaGFkb3dNYXBTaXplLCBzcG90TGlnaHQuc2hhZG93SW50ZW5zaXR5LCBzcG90TGlnaHQuc2hhZG93Qmlhcywgc3BvdExpZ2h0LnNoYWRvd1JhZGl1cywgdlNwb3RMaWdodENvb3JkWyBpIF0gKSA6IDEuMDtcclxuXHJcblx0fVxyXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXHJcblxyXG5cdCNlbmRpZlxyXG5cclxuXHQjaWYgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgPiAwXHJcblxyXG5cdFBvaW50TGlnaHRTaGFkb3cgcG9pbnRMaWdodDtcclxuXHJcblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxyXG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTOyBpICsrICkge1xyXG5cclxuXHRcdHBvaW50TGlnaHQgPSBwb2ludExpZ2h0U2hhZG93c1sgaSBdO1xyXG5cdFx0c2hhZG93ICo9IHJlY2VpdmVTaGFkb3cgPyBnZXRQb2ludFNoYWRvdyggcG9pbnRTaGFkb3dNYXBbIGkgXSwgcG9pbnRMaWdodC5zaGFkb3dNYXBTaXplLCBwb2ludExpZ2h0LnNoYWRvd0ludGVuc2l0eSwgcG9pbnRMaWdodC5zaGFkb3dCaWFzLCBwb2ludExpZ2h0LnNoYWRvd1JhZGl1cywgdlBvaW50U2hhZG93Q29vcmRbIGkgXSwgcG9pbnRMaWdodC5zaGFkb3dDYW1lcmFOZWFyLCBwb2ludExpZ2h0LnNoYWRvd0NhbWVyYUZhciApIDogMS4wO1xyXG5cclxuXHR9XHJcblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9lbmRcclxuXHJcblx0I2VuZGlmXHJcblxyXG5cdC8qXHJcblx0I2lmIE5VTV9SRUNUX0FSRUFfTElHSFRTID4gMFxyXG5cclxuXHRcdC8vIFRPRE8gKGFiZWxuYXRpb24pOiB1cGRhdGUgc2hhZG93IGZvciBBcmVhIGxpZ2h0XHJcblxyXG5cdCNlbmRpZlxyXG5cdCovXHJcblxyXG5cdCNlbmRpZlxyXG5cclxuXHRyZXR1cm4gc2hhZG93O1xyXG5cclxufVxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jaWZkZWYgVVNFX1NLSU5OSU5HXHJcblxyXG5cdG1hdDQgYm9uZU1hdFggPSBnZXRCb25lTWF0cml4KCBza2luSW5kZXgueCApO1xyXG5cdG1hdDQgYm9uZU1hdFkgPSBnZXRCb25lTWF0cml4KCBza2luSW5kZXgueSApO1xyXG5cdG1hdDQgYm9uZU1hdFogPSBnZXRCb25lTWF0cml4KCBza2luSW5kZXgueiApO1xyXG5cdG1hdDQgYm9uZU1hdFcgPSBnZXRCb25lTWF0cml4KCBza2luSW5kZXgudyApO1xyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbiNpZmRlZiBVU0VfU0tJTk5JTkdcclxuXHJcblx0dW5pZm9ybSBtYXQ0IGJpbmRNYXRyaXg7XHJcblx0dW5pZm9ybSBtYXQ0IGJpbmRNYXRyaXhJbnZlcnNlO1xyXG5cclxuXHR1bmlmb3JtIGhpZ2hwIHNhbXBsZXIyRCBib25lVGV4dHVyZTtcclxuXHJcblx0bWF0NCBnZXRCb25lTWF0cml4KCBjb25zdCBpbiBmbG9hdCBpICkge1xyXG5cclxuXHRcdGludCBzaXplID0gdGV4dHVyZVNpemUoIGJvbmVUZXh0dXJlLCAwICkueDtcclxuXHRcdGludCBqID0gaW50KCBpICkgKiA0O1xyXG5cdFx0aW50IHggPSBqICUgc2l6ZTtcclxuXHRcdGludCB5ID0gaiAvIHNpemU7XHJcblx0XHR2ZWM0IHYxID0gdGV4ZWxGZXRjaCggYm9uZVRleHR1cmUsIGl2ZWMyKCB4LCB5ICksIDAgKTtcclxuXHRcdHZlYzQgdjIgPSB0ZXhlbEZldGNoKCBib25lVGV4dHVyZSwgaXZlYzIoIHggKyAxLCB5ICksIDAgKTtcclxuXHRcdHZlYzQgdjMgPSB0ZXhlbEZldGNoKCBib25lVGV4dHVyZSwgaXZlYzIoIHggKyAyLCB5ICksIDAgKTtcclxuXHRcdHZlYzQgdjQgPSB0ZXhlbEZldGNoKCBib25lVGV4dHVyZSwgaXZlYzIoIHggKyAzLCB5ICksIDAgKTtcclxuXHJcblx0XHRyZXR1cm4gbWF0NCggdjEsIHYyLCB2MywgdjQgKTtcclxuXHJcblx0fVxyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbiNpZmRlZiBVU0VfU0tJTk5JTkdcclxuXHJcblx0dmVjNCBza2luVmVydGV4ID0gYmluZE1hdHJpeCAqIHZlYzQoIHRyYW5zZm9ybWVkLCAxLjAgKTtcclxuXHJcblx0dmVjNCBza2lubmVkID0gdmVjNCggMC4wICk7XHJcblx0c2tpbm5lZCArPSBib25lTWF0WCAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lng7XHJcblx0c2tpbm5lZCArPSBib25lTWF0WSAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lnk7XHJcblx0c2tpbm5lZCArPSBib25lTWF0WiAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lno7XHJcblx0c2tpbm5lZCArPSBib25lTWF0VyAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lnc7XHJcblxyXG5cdHRyYW5zZm9ybWVkID0gKCBiaW5kTWF0cml4SW52ZXJzZSAqIHNraW5uZWQgKS54eXo7XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmZGVmIFVTRV9TS0lOTklOR1xyXG5cclxuXHRtYXQ0IHNraW5NYXRyaXggPSBtYXQ0KCAwLjAgKTtcclxuXHRza2luTWF0cml4ICs9IHNraW5XZWlnaHQueCAqIGJvbmVNYXRYO1xyXG5cdHNraW5NYXRyaXggKz0gc2tpbldlaWdodC55ICogYm9uZU1hdFk7XHJcblx0c2tpbk1hdHJpeCArPSBza2luV2VpZ2h0LnogKiBib25lTWF0WjtcclxuXHRza2luTWF0cml4ICs9IHNraW5XZWlnaHQudyAqIGJvbmVNYXRXO1xyXG5cdHNraW5NYXRyaXggPSBiaW5kTWF0cml4SW52ZXJzZSAqIHNraW5NYXRyaXggKiBiaW5kTWF0cml4O1xyXG5cclxuXHRvYmplY3ROb3JtYWwgPSB2ZWM0KCBza2luTWF0cml4ICogdmVjNCggb2JqZWN0Tm9ybWFsLCAwLjAgKSApLnh5ejtcclxuXHJcblx0I2lmZGVmIFVTRV9UQU5HRU5UXHJcblxyXG5cdFx0b2JqZWN0VGFuZ2VudCA9IHZlYzQoIHNraW5NYXRyaXggKiB2ZWM0KCBvYmplY3RUYW5nZW50LCAwLjAgKSApLnh5ejtcclxuXHJcblx0I2VuZGlmXHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuZmxvYXQgc3BlY3VsYXJTdHJlbmd0aDtcclxuXHJcbiNpZmRlZiBVU0VfU1BFQ1VMQVJNQVBcclxuXHJcblx0dmVjNCB0ZXhlbFNwZWN1bGFyID0gdGV4dHVyZTJEKCBzcGVjdWxhck1hcCwgdlNwZWN1bGFyTWFwVXYgKTtcclxuXHRzcGVjdWxhclN0cmVuZ3RoID0gdGV4ZWxTcGVjdWxhci5yO1xyXG5cclxuI2Vsc2VcclxuXHJcblx0c3BlY3VsYXJTdHJlbmd0aCA9IDEuMDtcclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jaWZkZWYgVVNFX1NQRUNVTEFSTUFQXHJcblxyXG5cdHVuaWZvcm0gc2FtcGxlcjJEIHNwZWN1bGFyTWFwO1xyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbiNpZiBkZWZpbmVkKCBUT05FX01BUFBJTkcgKVxyXG5cclxuXHRnbF9GcmFnQ29sb3IucmdiID0gdG9uZU1hcHBpbmcoIGdsX0ZyYWdDb2xvci5yZ2IgKTtcclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jaWZuZGVmIHNhdHVyYXRlXHJcbi8vIDxjb21tb24+IG1heSBoYXZlIGRlZmluZWQgc2F0dXJhdGUoKSBhbHJlYWR5XHJcbiNkZWZpbmUgc2F0dXJhdGUoIGEgKSBjbGFtcCggYSwgMC4wLCAxLjAgKVxyXG4jZW5kaWZcclxuXHJcbnVuaWZvcm0gZmxvYXQgdG9uZU1hcHBpbmdFeHBvc3VyZTtcclxuXHJcbi8vIGV4cG9zdXJlIG9ubHlcclxudmVjMyBMaW5lYXJUb25lTWFwcGluZyggdmVjMyBjb2xvciApIHtcclxuXHJcblx0cmV0dXJuIHNhdHVyYXRlKCB0b25lTWFwcGluZ0V4cG9zdXJlICogY29sb3IgKTtcclxuXHJcbn1cclxuXHJcbi8vIHNvdXJjZTogaHR0cHM6Ly93d3cuY3MudXRhaC5lZHUvZG9jcy90ZWNocmVwb3J0cy8yMDAyL3BkZi9VVUNTLTAyLTAwMS5wZGZcclxudmVjMyBSZWluaGFyZFRvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkge1xyXG5cclxuXHRjb2xvciAqPSB0b25lTWFwcGluZ0V4cG9zdXJlO1xyXG5cdHJldHVybiBzYXR1cmF0ZSggY29sb3IgLyAoIHZlYzMoIDEuMCApICsgY29sb3IgKSApO1xyXG5cclxufVxyXG5cclxuLy8gc291cmNlOiBodHRwOi8vZmlsbWljd29ybGRzLmNvbS9ibG9nL2ZpbG1pYy10b25lbWFwcGluZy1vcGVyYXRvcnMvXHJcbnZlYzMgQ2luZW9uVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XHJcblxyXG5cdC8vIGZpbG1pYyBvcGVyYXRvciBieSBKaW0gSGVqbCBhbmQgUmljaGFyZCBCdXJnZXNzLURhd3NvblxyXG5cdGNvbG9yICo9IHRvbmVNYXBwaW5nRXhwb3N1cmU7XHJcblx0Y29sb3IgPSBtYXgoIHZlYzMoIDAuMCApLCBjb2xvciAtIDAuMDA0ICk7XHJcblx0cmV0dXJuIHBvdyggKCBjb2xvciAqICggNi4yICogY29sb3IgKyAwLjUgKSApIC8gKCBjb2xvciAqICggNi4yICogY29sb3IgKyAxLjcgKSArIDAuMDYgKSwgdmVjMyggMi4yICkgKTtcclxuXHJcbn1cclxuXHJcbi8vIHNvdXJjZTogaHR0cHM6Ly9naXRodWIuY29tL3NlbGZzaGFkb3cvbHRjX2NvZGUvYmxvYi9tYXN0ZXIvd2ViZ2wvc2hhZGVycy9sdGMvbHRjX2JsaXQuZnNcclxudmVjMyBSUlRBbmRPRFRGaXQoIHZlYzMgdiApIHtcclxuXHJcblx0dmVjMyBhID0gdiAqICggdiArIDAuMDI0NTc4NiApIC0gMC4wMDAwOTA1Mzc7XHJcblx0dmVjMyBiID0gdiAqICggMC45ODM3MjkgKiB2ICsgMC40MzI5NTEwICkgKyAwLjIzODA4MTtcclxuXHRyZXR1cm4gYSAvIGI7XHJcblxyXG59XHJcblxyXG4vLyB0aGlzIGltcGxlbWVudGF0aW9uIG9mIEFDRVMgaXMgbW9kaWZpZWQgdG8gYWNjb21tb2RhdGUgYSBicmlnaHRlciB2aWV3aW5nIGVudmlyb25tZW50LlxyXG4vLyB0aGUgc2NhbGUgZmFjdG9yIG9mIDEvMC42IGlzIHN1YmplY3RpdmUuIHNlZSBkaXNjdXNzaW9uIGluICMxOTYyMS5cclxuXHJcbnZlYzMgQUNFU0ZpbG1pY1RvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkge1xyXG5cclxuXHQvLyBzUkdCID0+IFhZWiA9PiBENjVfMl9ENjAgPT4gQVAxID0+IFJSVF9TQVRcclxuXHRjb25zdCBtYXQzIEFDRVNJbnB1dE1hdCA9IG1hdDMoXHJcblx0XHR2ZWMzKCAwLjU5NzE5LCAwLjA3NjAwLCAwLjAyODQwICksIC8vIHRyYW5zcG9zZWQgZnJvbSBzb3VyY2VcclxuXHRcdHZlYzMoIDAuMzU0NTgsIDAuOTA4MzQsIDAuMTMzODMgKSxcclxuXHRcdHZlYzMoIDAuMDQ4MjMsIDAuMDE1NjYsIDAuODM3NzcgKVxyXG5cdCk7XHJcblxyXG5cdC8vIE9EVF9TQVQgPT4gWFlaID0+IEQ2MF8yX0Q2NSA9PiBzUkdCXHJcblx0Y29uc3QgbWF0MyBBQ0VTT3V0cHV0TWF0ID0gbWF0MyhcclxuXHRcdHZlYzMoICAxLjYwNDc1LCAtMC4xMDIwOCwgLTAuMDAzMjcgKSwgLy8gdHJhbnNwb3NlZCBmcm9tIHNvdXJjZVxyXG5cdFx0dmVjMyggLTAuNTMxMDgsICAxLjEwODEzLCAtMC4wNzI3NiApLFxyXG5cdFx0dmVjMyggLTAuMDczNjcsIC0wLjAwNjA1LCAgMS4wNzYwMiApXHJcblx0KTtcclxuXHJcblx0Y29sb3IgKj0gdG9uZU1hcHBpbmdFeHBvc3VyZSAvIDAuNjtcclxuXHJcblx0Y29sb3IgPSBBQ0VTSW5wdXRNYXQgKiBjb2xvcjtcclxuXHJcblx0Ly8gQXBwbHkgUlJUIGFuZCBPRFRcclxuXHRjb2xvciA9IFJSVEFuZE9EVEZpdCggY29sb3IgKTtcclxuXHJcblx0Y29sb3IgPSBBQ0VTT3V0cHV0TWF0ICogY29sb3I7XHJcblxyXG5cdC8vIENsYW1wIHRvIFswLCAxXVxyXG5cdHJldHVybiBzYXR1cmF0ZSggY29sb3IgKTtcclxuXHJcbn1cclxuXHJcbi8vIE1hdHJpY2VzIGZvciByZWMgMjAyMCA8PiByZWMgNzA5IGNvbG9yIHNwYWNlIGNvbnZlcnNpb25cclxuLy8gbWF0cml4IHByb3ZpZGVkIGluIHJvdy1tYWpvciBvcmRlciBzbyBpdCBoYXMgYmVlbiB0cmFuc3Bvc2VkXHJcbi8vIGh0dHBzOi8vd3d3Lml0dS5pbnQvcHViL1ItUkVQLUJULjI0MDctMjAxN1xyXG5jb25zdCBtYXQzIExJTkVBUl9SRUMyMDIwX1RPX0xJTkVBUl9TUkdCID0gbWF0MyhcclxuXHR2ZWMzKCAxLjY2MDUsIC0gMC4xMjQ2LCAtIDAuMDE4MiApLFxyXG5cdHZlYzMoIC0gMC41ODc2LCAxLjEzMjksIC0gMC4xMDA2ICksXHJcblx0dmVjMyggLSAwLjA3MjgsIC0gMC4wMDgzLCAxLjExODcgKVxyXG4pO1xyXG5cclxuY29uc3QgbWF0MyBMSU5FQVJfU1JHQl9UT19MSU5FQVJfUkVDMjAyMCA9IG1hdDMoXHJcblx0dmVjMyggMC42Mjc0LCAwLjA2OTEsIDAuMDE2NCApLFxyXG5cdHZlYzMoIDAuMzI5MywgMC45MTk1LCAwLjA4ODAgKSxcclxuXHR2ZWMzKCAwLjA0MzMsIDAuMDExMywgMC44OTU2IClcclxuKTtcclxuXHJcbi8vIGh0dHBzOi8vaW9saXRlLWVuZ2luZS5jb20vYmxvZ19wb3N0cy9taW5pbWFsX2FneF9pbXBsZW1lbnRhdGlvblxyXG4vLyBNZWFuIGVycm9yXjI6IDMuNjcwNTE0MWUtMDZcclxudmVjMyBhZ3hEZWZhdWx0Q29udHJhc3RBcHByb3goIHZlYzMgeCApIHtcclxuXHJcblx0dmVjMyB4MiA9IHggKiB4O1xyXG5cdHZlYzMgeDQgPSB4MiAqIHgyO1xyXG5cclxuXHRyZXR1cm4gKyAxNS41ICogeDQgKiB4MlxyXG5cdFx0LSA0MC4xNCAqIHg0ICogeFxyXG5cdFx0KyAzMS45NiAqIHg0XHJcblx0XHQtIDYuODY4ICogeDIgKiB4XHJcblx0XHQrIDAuNDI5OCAqIHgyXHJcblx0XHQrIDAuMTE5MSAqIHhcclxuXHRcdC0gMC4wMDIzMjtcclxuXHJcbn1cclxuXHJcbi8vIEFnWCBUb25lIE1hcHBpbmcgaW1wbGVtZW50YXRpb24gYmFzZWQgb24gRmlsYW1lbnQsIHdoaWNoIGluIHR1cm4gaXMgYmFzZWRcclxuLy8gb24gQmxlbmRlcidzIGltcGxlbWVudGF0aW9uIHVzaW5nIHJlYyAyMDIwIHByaW1hcmllc1xyXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2ZpbGFtZW50L3B1bGwvNzIzNlxyXG4vLyBJbnB1dHMgYW5kIG91dHB1dHMgYXJlIGVuY29kZWQgYXMgTGluZWFyLXNSR0IuXHJcblxyXG52ZWMzIEFnWFRvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkge1xyXG5cclxuXHQvLyBBZ1ggY29uc3RhbnRzXHJcblx0Y29uc3QgbWF0MyBBZ1hJbnNldE1hdHJpeCA9IG1hdDMoXHJcblx0XHR2ZWMzKCAwLjg1NjYyNzE1MzMxNTk4MywgMC4xMzczMTg5NzI5Mjk4NDcsIDAuMTExODk4MjEyOTk5OTUgKSxcclxuXHRcdHZlYzMoIDAuMDk1MTIxMjQwNTM4MTU4OCwgMC43NjEyNDE5OTA2MDI1OTEsIDAuMDc2Nzk5NDE4NjAzMTkwMyApLFxyXG5cdFx0dmVjMyggMC4wNDgyNTE2MDYxNDU4NTgzLCAwLjEwMTQzOTAzNjQ2NzU2MiwgMC44MTEzMDIzNjgzOTY4NTkgKVxyXG5cdCk7XHJcblxyXG5cdC8vIGV4cGxpY2l0IEFnWE91dHNldE1hdHJpeCBnZW5lcmF0ZWQgZnJvbSBGaWxhbWVudHMgQWdYT3V0c2V0TWF0cml4SW52XHJcblx0Y29uc3QgbWF0MyBBZ1hPdXRzZXRNYXRyaXggPSBtYXQzKFxyXG5cdFx0dmVjMyggMS4xMjcxMDA1ODE4MTQ0MzY4LCAtIDAuMTQxMzI5NzYzNDk4NDM4MywgLSAwLjE0MTMyOTc2MzQ5ODQzODI2ICksXHJcblx0XHR2ZWMzKCAtIDAuMTEwNjA2NjQzMDk2NjAzMjMsIDEuMTU3ODIzNzAyMjE2MjcyLCAtIDAuMTEwNjA2NjQzMDk2NjAyOTQgKSxcclxuXHRcdHZlYzMoIC0gMC4wMTY0OTM5Mzg3MTc4MzQ1NzMsIC0gMC4wMTY0OTM5Mzg3MTc4MzQyNTcsIDEuMjUxOTM2NDA2NTk1MDQwNSApXHJcblx0KTtcclxuXHJcblx0Ly8gTE9HMl9NSU4gICAgICA9IC0xMC4wXHJcblx0Ly8gTE9HMl9NQVggICAgICA9ICArNi41XHJcblx0Ly8gTUlERExFX0dSQVkgICA9ICAwLjE4XHJcblx0Y29uc3QgZmxvYXQgQWd4TWluRXYgPSAtIDEyLjQ3MzkzOyAgLy8gbG9nMiggcG93KCAyLCBMT0cyX01JTiApICogTUlERExFX0dSQVkgKVxyXG5cdGNvbnN0IGZsb2F0IEFneE1heEV2ID0gNC4wMjYwNjk7ICAgIC8vIGxvZzIoIHBvdyggMiwgTE9HMl9NQVggKSAqIE1JRERMRV9HUkFZIClcclxuXHJcblx0Y29sb3IgKj0gdG9uZU1hcHBpbmdFeHBvc3VyZTtcclxuXHJcblx0Y29sb3IgPSBMSU5FQVJfU1JHQl9UT19MSU5FQVJfUkVDMjAyMCAqIGNvbG9yO1xyXG5cclxuXHRjb2xvciA9IEFnWEluc2V0TWF0cml4ICogY29sb3I7XHJcblxyXG5cdC8vIExvZzIgZW5jb2RpbmdcclxuXHRjb2xvciA9IG1heCggY29sb3IsIDFlLTEwICk7IC8vIGF2b2lkIDAgb3IgbmVnYXRpdmUgbnVtYmVycyBmb3IgbG9nMlxyXG5cdGNvbG9yID0gbG9nMiggY29sb3IgKTtcclxuXHRjb2xvciA9ICggY29sb3IgLSBBZ3hNaW5FdiApIC8gKCBBZ3hNYXhFdiAtIEFneE1pbkV2ICk7XHJcblxyXG5cdGNvbG9yID0gY2xhbXAoIGNvbG9yLCAwLjAsIDEuMCApO1xyXG5cclxuXHQvLyBBcHBseSBzaWdtb2lkXHJcblx0Y29sb3IgPSBhZ3hEZWZhdWx0Q29udHJhc3RBcHByb3goIGNvbG9yICk7XHJcblxyXG5cdC8vIEFwcGx5IEFnWCBsb29rXHJcblx0Ly8gdiA9IGFneExvb2sodiwgbG9vayk7XHJcblxyXG5cdGNvbG9yID0gQWdYT3V0c2V0TWF0cml4ICogY29sb3I7XHJcblxyXG5cdC8vIExpbmVhcml6ZVxyXG5cdGNvbG9yID0gcG93KCBtYXgoIHZlYzMoIDAuMCApLCBjb2xvciApLCB2ZWMzKCAyLjIgKSApO1xyXG5cclxuXHRjb2xvciA9IExJTkVBUl9SRUMyMDIwX1RPX0xJTkVBUl9TUkdCICogY29sb3I7XHJcblxyXG5cdC8vIEdhbXV0IG1hcHBpbmcuIFNpbXBsZSBjbGFtcCBmb3Igbm93LlxyXG5cdGNvbG9yID0gY2xhbXAoIGNvbG9yLCAwLjAsIDEuMCApO1xyXG5cclxuXHRyZXR1cm4gY29sb3I7XHJcblxyXG59XHJcblxyXG4vLyBodHRwczovL21vZGVsdmlld2VyLmRldi9leGFtcGxlcy90b25lLW1hcHBpbmdcclxuXHJcbnZlYzMgTmV1dHJhbFRvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkge1xyXG5cclxuXHRjb25zdCBmbG9hdCBTdGFydENvbXByZXNzaW9uID0gMC44IC0gMC4wNDtcclxuXHRjb25zdCBmbG9hdCBEZXNhdHVyYXRpb24gPSAwLjE1O1xyXG5cclxuXHRjb2xvciAqPSB0b25lTWFwcGluZ0V4cG9zdXJlO1xyXG5cclxuXHRmbG9hdCB4ID0gbWluKCBjb2xvci5yLCBtaW4oIGNvbG9yLmcsIGNvbG9yLmIgKSApO1xyXG5cclxuXHRmbG9hdCBvZmZzZXQgPSB4IDwgMC4wOCA/IHggLSA2LjI1ICogeCAqIHggOiAwLjA0O1xyXG5cclxuXHRjb2xvciAtPSBvZmZzZXQ7XHJcblxyXG5cdGZsb2F0IHBlYWsgPSBtYXgoIGNvbG9yLnIsIG1heCggY29sb3IuZywgY29sb3IuYiApICk7XHJcblxyXG5cdGlmICggcGVhayA8IFN0YXJ0Q29tcHJlc3Npb24gKSByZXR1cm4gY29sb3I7XHJcblxyXG5cdGZsb2F0IGQgPSAxLiAtIFN0YXJ0Q29tcHJlc3Npb247XHJcblxyXG5cdGZsb2F0IG5ld1BlYWsgPSAxLiAtIGQgKiBkIC8gKCBwZWFrICsgZCAtIFN0YXJ0Q29tcHJlc3Npb24gKTtcclxuXHJcblx0Y29sb3IgKj0gbmV3UGVhayAvIHBlYWs7XHJcblxyXG5cdGZsb2F0IGcgPSAxLiAtIDEuIC8gKCBEZXNhdHVyYXRpb24gKiAoIHBlYWsgLSBuZXdQZWFrICkgKyAxLiApO1xyXG5cclxuXHRyZXR1cm4gbWl4KCBjb2xvciwgdmVjMyggbmV3UGVhayApLCBnICk7XHJcblxyXG59XHJcblxyXG52ZWMzIEN1c3RvbVRvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkgeyByZXR1cm4gY29sb3I7IH1cclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmZGVmIFVTRV9UUkFOU01JU1NJT05cclxuXHJcblx0bWF0ZXJpYWwudHJhbnNtaXNzaW9uID0gdHJhbnNtaXNzaW9uO1xyXG5cdG1hdGVyaWFsLnRyYW5zbWlzc2lvbkFscGhhID0gMS4wO1xyXG5cdG1hdGVyaWFsLnRoaWNrbmVzcyA9IHRoaWNrbmVzcztcclxuXHRtYXRlcmlhbC5hdHRlbnVhdGlvbkRpc3RhbmNlID0gYXR0ZW51YXRpb25EaXN0YW5jZTtcclxuXHRtYXRlcmlhbC5hdHRlbnVhdGlvbkNvbG9yID0gYXR0ZW51YXRpb25Db2xvcjtcclxuXHJcblx0I2lmZGVmIFVTRV9UUkFOU01JU1NJT05NQVBcclxuXHJcblx0XHRtYXRlcmlhbC50cmFuc21pc3Npb24gKj0gdGV4dHVyZTJEKCB0cmFuc21pc3Npb25NYXAsIHZUcmFuc21pc3Npb25NYXBVdiApLnI7XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuXHQjaWZkZWYgVVNFX1RISUNLTkVTU01BUFxyXG5cclxuXHRcdG1hdGVyaWFsLnRoaWNrbmVzcyAqPSB0ZXh0dXJlMkQoIHRoaWNrbmVzc01hcCwgdlRoaWNrbmVzc01hcFV2ICkuZztcclxuXHJcblx0I2VuZGlmXHJcblxyXG5cdHZlYzMgcG9zID0gdldvcmxkUG9zaXRpb247XHJcblx0dmVjMyB2ID0gbm9ybWFsaXplKCBjYW1lcmFQb3NpdGlvbiAtIHBvcyApO1xyXG5cdHZlYzMgbiA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIG5vcm1hbCwgdmlld01hdHJpeCApO1xyXG5cclxuXHR2ZWM0IHRyYW5zbWl0dGVkID0gZ2V0SUJMVm9sdW1lUmVmcmFjdGlvbihcclxuXHRcdG4sIHYsIG1hdGVyaWFsLnJvdWdobmVzcywgbWF0ZXJpYWwuZGlmZnVzZUNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhckY5MCxcclxuXHRcdHBvcywgbW9kZWxNYXRyaXgsIHZpZXdNYXRyaXgsIHByb2plY3Rpb25NYXRyaXgsIG1hdGVyaWFsLmRpc3BlcnNpb24sIG1hdGVyaWFsLmlvciwgbWF0ZXJpYWwudGhpY2tuZXNzLFxyXG5cdFx0bWF0ZXJpYWwuYXR0ZW51YXRpb25Db2xvciwgbWF0ZXJpYWwuYXR0ZW51YXRpb25EaXN0YW5jZSApO1xyXG5cclxuXHRtYXRlcmlhbC50cmFuc21pc3Npb25BbHBoYSA9IG1peCggbWF0ZXJpYWwudHJhbnNtaXNzaW9uQWxwaGEsIHRyYW5zbWl0dGVkLmEsIG1hdGVyaWFsLnRyYW5zbWlzc2lvbiApO1xyXG5cclxuXHR0b3RhbERpZmZ1c2UgPSBtaXgoIHRvdGFsRGlmZnVzZSwgdHJhbnNtaXR0ZWQucmdiLCBtYXRlcmlhbC50cmFuc21pc3Npb24gKTtcclxuXHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jaWZkZWYgVVNFX1RSQU5TTUlTU0lPTlxyXG5cclxuXHQvLyBUcmFuc21pc3Npb24gY29kZSBpcyBiYXNlZCBvbiBnbFRGLVNhbXBsZXItVmlld2VyXHJcblx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9nbFRGLVNhbXBsZS1WaWV3ZXJcclxuXHJcblx0dW5pZm9ybSBmbG9hdCB0cmFuc21pc3Npb247XHJcblx0dW5pZm9ybSBmbG9hdCB0aGlja25lc3M7XHJcblx0dW5pZm9ybSBmbG9hdCBhdHRlbnVhdGlvbkRpc3RhbmNlO1xyXG5cdHVuaWZvcm0gdmVjMyBhdHRlbnVhdGlvbkNvbG9yO1xyXG5cclxuXHQjaWZkZWYgVVNFX1RSQU5TTUlTU0lPTk1BUFxyXG5cclxuXHRcdHVuaWZvcm0gc2FtcGxlcjJEIHRyYW5zbWlzc2lvbk1hcDtcclxuXHJcblx0I2VuZGlmXHJcblxyXG5cdCNpZmRlZiBVU0VfVEhJQ0tORVNTTUFQXHJcblxyXG5cdFx0dW5pZm9ybSBzYW1wbGVyMkQgdGhpY2tuZXNzTWFwO1xyXG5cclxuXHQjZW5kaWZcclxuXHJcblx0dW5pZm9ybSB2ZWMyIHRyYW5zbWlzc2lvblNhbXBsZXJTaXplO1xyXG5cdHVuaWZvcm0gc2FtcGxlcjJEIHRyYW5zbWlzc2lvblNhbXBsZXJNYXA7XHJcblxyXG5cdHVuaWZvcm0gbWF0NCBtb2RlbE1hdHJpeDtcclxuXHR1bmlmb3JtIG1hdDQgcHJvamVjdGlvbk1hdHJpeDtcclxuXHJcblx0dmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xyXG5cclxuXHQvLyBNaXBwZWQgQmljdWJpYyBUZXh0dXJlIEZpbHRlcmluZyBieSBOOFxyXG5cdC8vIGh0dHBzOi8vd3d3LnNoYWRlcnRveS5jb20vdmlldy9EbDJTRFdcclxuXHJcblx0ZmxvYXQgdzAoIGZsb2F0IGEgKSB7XHJcblxyXG5cdFx0cmV0dXJuICggMS4wIC8gNi4wICkgKiAoIGEgKiAoIGEgKiAoIC0gYSArIDMuMCApIC0gMy4wICkgKyAxLjAgKTtcclxuXHJcblx0fVxyXG5cclxuXHRmbG9hdCB3MSggZmxvYXQgYSApIHtcclxuXHJcblx0XHRyZXR1cm4gKCAxLjAgLyA2LjAgKSAqICggYSAqICBhICogKCAzLjAgKiBhIC0gNi4wICkgKyA0LjAgKTtcclxuXHJcblx0fVxyXG5cclxuXHRmbG9hdCB3MiggZmxvYXQgYSApe1xyXG5cclxuXHRcdHJldHVybiAoIDEuMCAvIDYuMCApICogKCBhICogKCBhICogKCAtIDMuMCAqIGEgKyAzLjAgKSArIDMuMCApICsgMS4wICk7XHJcblxyXG5cdH1cclxuXHJcblx0ZmxvYXQgdzMoIGZsb2F0IGEgKSB7XHJcblxyXG5cdFx0cmV0dXJuICggMS4wIC8gNi4wICkgKiAoIGEgKiBhICogYSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vIGcwIGFuZCBnMSBhcmUgdGhlIHR3byBhbXBsaXR1ZGUgZnVuY3Rpb25zXHJcblx0ZmxvYXQgZzAoIGZsb2F0IGEgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHcwKCBhICkgKyB3MSggYSApO1xyXG5cclxuXHR9XHJcblxyXG5cdGZsb2F0IGcxKCBmbG9hdCBhICkge1xyXG5cclxuXHRcdHJldHVybiB3MiggYSApICsgdzMoIGEgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvLyBoMCBhbmQgaDEgYXJlIHRoZSB0d28gb2Zmc2V0IGZ1bmN0aW9uc1xyXG5cdGZsb2F0IGgwKCBmbG9hdCBhICkge1xyXG5cclxuXHRcdHJldHVybiAtIDEuMCArIHcxKCBhICkgLyAoIHcwKCBhICkgKyB3MSggYSApICk7XHJcblxyXG5cdH1cclxuXHJcblx0ZmxvYXQgaDEoIGZsb2F0IGEgKSB7XHJcblxyXG5cdFx0cmV0dXJuIDEuMCArIHczKCBhICkgLyAoIHcyKCBhICkgKyB3MyggYSApICk7XHJcblxyXG5cdH1cclxuXHJcblx0dmVjNCBiaWN1YmljKCBzYW1wbGVyMkQgdGV4LCB2ZWMyIHV2LCB2ZWM0IHRleGVsU2l6ZSwgZmxvYXQgbG9kICkge1xyXG5cclxuXHRcdHV2ID0gdXYgKiB0ZXhlbFNpemUuencgKyAwLjU7XHJcblxyXG5cdFx0dmVjMiBpdXYgPSBmbG9vciggdXYgKTtcclxuXHRcdHZlYzIgZnV2ID0gZnJhY3QoIHV2ICk7XHJcblxyXG5cdFx0ZmxvYXQgZzB4ID0gZzAoIGZ1di54ICk7XHJcblx0XHRmbG9hdCBnMXggPSBnMSggZnV2LnggKTtcclxuXHRcdGZsb2F0IGgweCA9IGgwKCBmdXYueCApO1xyXG5cdFx0ZmxvYXQgaDF4ID0gaDEoIGZ1di54ICk7XHJcblx0XHRmbG9hdCBoMHkgPSBoMCggZnV2LnkgKTtcclxuXHRcdGZsb2F0IGgxeSA9IGgxKCBmdXYueSApO1xyXG5cclxuXHRcdHZlYzIgcDAgPSAoIHZlYzIoIGl1di54ICsgaDB4LCBpdXYueSArIGgweSApIC0gMC41ICkgKiB0ZXhlbFNpemUueHk7XHJcblx0XHR2ZWMyIHAxID0gKCB2ZWMyKCBpdXYueCArIGgxeCwgaXV2LnkgKyBoMHkgKSAtIDAuNSApICogdGV4ZWxTaXplLnh5O1xyXG5cdFx0dmVjMiBwMiA9ICggdmVjMiggaXV2LnggKyBoMHgsIGl1di55ICsgaDF5ICkgLSAwLjUgKSAqIHRleGVsU2l6ZS54eTtcclxuXHRcdHZlYzIgcDMgPSAoIHZlYzIoIGl1di54ICsgaDF4LCBpdXYueSArIGgxeSApIC0gMC41ICkgKiB0ZXhlbFNpemUueHk7XHJcblxyXG5cdFx0cmV0dXJuIGcwKCBmdXYueSApICogKCBnMHggKiB0ZXh0dXJlTG9kKCB0ZXgsIHAwLCBsb2QgKSArIGcxeCAqIHRleHR1cmVMb2QoIHRleCwgcDEsIGxvZCApICkgK1xyXG5cdFx0XHRnMSggZnV2LnkgKSAqICggZzB4ICogdGV4dHVyZUxvZCggdGV4LCBwMiwgbG9kICkgKyBnMXggKiB0ZXh0dXJlTG9kKCB0ZXgsIHAzLCBsb2QgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdHZlYzQgdGV4dHVyZUJpY3ViaWMoIHNhbXBsZXIyRCBzYW1wbGVyLCB2ZWMyIHV2LCBmbG9hdCBsb2QgKSB7XHJcblxyXG5cdFx0dmVjMiBmTG9kU2l6ZSA9IHZlYzIoIHRleHR1cmVTaXplKCBzYW1wbGVyLCBpbnQoIGxvZCApICkgKTtcclxuXHRcdHZlYzIgY0xvZFNpemUgPSB2ZWMyKCB0ZXh0dXJlU2l6ZSggc2FtcGxlciwgaW50KCBsb2QgKyAxLjAgKSApICk7XHJcblx0XHR2ZWMyIGZMb2RTaXplSW52ID0gMS4wIC8gZkxvZFNpemU7XHJcblx0XHR2ZWMyIGNMb2RTaXplSW52ID0gMS4wIC8gY0xvZFNpemU7XHJcblx0XHR2ZWM0IGZTYW1wbGUgPSBiaWN1YmljKCBzYW1wbGVyLCB1diwgdmVjNCggZkxvZFNpemVJbnYsIGZMb2RTaXplICksIGZsb29yKCBsb2QgKSApO1xyXG5cdFx0dmVjNCBjU2FtcGxlID0gYmljdWJpYyggc2FtcGxlciwgdXYsIHZlYzQoIGNMb2RTaXplSW52LCBjTG9kU2l6ZSApLCBjZWlsKCBsb2QgKSApO1xyXG5cdFx0cmV0dXJuIG1peCggZlNhbXBsZSwgY1NhbXBsZSwgZnJhY3QoIGxvZCApICk7XHJcblxyXG5cdH1cclxuXHJcblx0dmVjMyBnZXRWb2x1bWVUcmFuc21pc3Npb25SYXkoIGNvbnN0IGluIHZlYzMgbiwgY29uc3QgaW4gdmVjMyB2LCBjb25zdCBpbiBmbG9hdCB0aGlja25lc3MsIGNvbnN0IGluIGZsb2F0IGlvciwgY29uc3QgaW4gbWF0NCBtb2RlbE1hdHJpeCApIHtcclxuXHJcblx0XHQvLyBEaXJlY3Rpb24gb2YgcmVmcmFjdGVkIGxpZ2h0LlxyXG5cdFx0dmVjMyByZWZyYWN0aW9uVmVjdG9yID0gcmVmcmFjdCggLSB2LCBub3JtYWxpemUoIG4gKSwgMS4wIC8gaW9yICk7XHJcblxyXG5cdFx0Ly8gQ29tcHV0ZSByb3RhdGlvbi1pbmRlcGVuZGVudCBzY2FsaW5nIG9mIHRoZSBtb2RlbCBtYXRyaXguXHJcblx0XHR2ZWMzIG1vZGVsU2NhbGU7XHJcblx0XHRtb2RlbFNjYWxlLnggPSBsZW5ndGgoIHZlYzMoIG1vZGVsTWF0cml4WyAwIF0ueHl6ICkgKTtcclxuXHRcdG1vZGVsU2NhbGUueSA9IGxlbmd0aCggdmVjMyggbW9kZWxNYXRyaXhbIDEgXS54eXogKSApO1xyXG5cdFx0bW9kZWxTY2FsZS56ID0gbGVuZ3RoKCB2ZWMzKCBtb2RlbE1hdHJpeFsgMiBdLnh5eiApICk7XHJcblxyXG5cdFx0Ly8gVGhlIHRoaWNrbmVzcyBpcyBzcGVjaWZpZWQgaW4gbG9jYWwgc3BhY2UuXHJcblx0XHRyZXR1cm4gbm9ybWFsaXplKCByZWZyYWN0aW9uVmVjdG9yICkgKiB0aGlja25lc3MgKiBtb2RlbFNjYWxlO1xyXG5cclxuXHR9XHJcblxyXG5cdGZsb2F0IGFwcGx5SW9yVG9Sb3VnaG5lc3MoIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gZmxvYXQgaW9yICkge1xyXG5cclxuXHRcdC8vIFNjYWxlIHJvdWdobmVzcyB3aXRoIElPUiBzbyB0aGF0IGFuIElPUiBvZiAxLjAgcmVzdWx0cyBpbiBubyBtaWNyb2ZhY2V0IHJlZnJhY3Rpb24gYW5kXHJcblx0XHQvLyBhbiBJT1Igb2YgMS41IHJlc3VsdHMgaW4gdGhlIGRlZmF1bHQgYW1vdW50IG9mIG1pY3JvZmFjZXQgcmVmcmFjdGlvbi5cclxuXHRcdHJldHVybiByb3VnaG5lc3MgKiBjbGFtcCggaW9yICogMi4wIC0gMi4wLCAwLjAsIDEuMCApO1xyXG5cclxuXHR9XHJcblxyXG5cdHZlYzQgZ2V0VHJhbnNtaXNzaW9uU2FtcGxlKCBjb25zdCBpbiB2ZWMyIGZyYWdDb29yZCwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzLCBjb25zdCBpbiBmbG9hdCBpb3IgKSB7XHJcblxyXG5cdFx0ZmxvYXQgbG9kID0gbG9nMiggdHJhbnNtaXNzaW9uU2FtcGxlclNpemUueCApICogYXBwbHlJb3JUb1JvdWdobmVzcyggcm91Z2huZXNzLCBpb3IgKTtcclxuXHRcdHJldHVybiB0ZXh0dXJlQmljdWJpYyggdHJhbnNtaXNzaW9uU2FtcGxlck1hcCwgZnJhZ0Nvb3JkLnh5LCBsb2QgKTtcclxuXHJcblx0fVxyXG5cclxuXHR2ZWMzIHZvbHVtZUF0dGVudWF0aW9uKCBjb25zdCBpbiBmbG9hdCB0cmFuc21pc3Npb25EaXN0YW5jZSwgY29uc3QgaW4gdmVjMyBhdHRlbnVhdGlvbkNvbG9yLCBjb25zdCBpbiBmbG9hdCBhdHRlbnVhdGlvbkRpc3RhbmNlICkge1xyXG5cclxuXHRcdGlmICggaXNpbmYoIGF0dGVudWF0aW9uRGlzdGFuY2UgKSApIHtcclxuXHJcblx0XHRcdC8vIEF0dGVudWF0aW9uIGRpc3RhbmNlIGlzICviiJ4sIGkuZS4gdGhlIHRyYW5zbWl0dGVkIGNvbG9yIGlzIG5vdCBhdHRlbnVhdGVkIGF0IGFsbC5cclxuXHRcdFx0cmV0dXJuIHZlYzMoIDEuMCApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHQvLyBDb21wdXRlIGxpZ2h0IGF0dGVudWF0aW9uIHVzaW5nIEJlZXIncyBsYXcuXHJcblx0XHRcdHZlYzMgYXR0ZW51YXRpb25Db2VmZmljaWVudCA9IC1sb2coIGF0dGVudWF0aW9uQ29sb3IgKSAvIGF0dGVudWF0aW9uRGlzdGFuY2U7XHJcblx0XHRcdHZlYzMgdHJhbnNtaXR0YW5jZSA9IGV4cCggLSBhdHRlbnVhdGlvbkNvZWZmaWNpZW50ICogdHJhbnNtaXNzaW9uRGlzdGFuY2UgKTsgLy8gQmVlcidzIGxhd1xyXG5cdFx0XHRyZXR1cm4gdHJhbnNtaXR0YW5jZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0dmVjNCBnZXRJQkxWb2x1bWVSZWZyYWN0aW9uKCBjb25zdCBpbiB2ZWMzIG4sIGNvbnN0IGluIHZlYzMgdiwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzLCBjb25zdCBpbiB2ZWMzIGRpZmZ1c2VDb2xvcixcclxuXHRcdGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgc3BlY3VsYXJGOTAsIGNvbnN0IGluIHZlYzMgcG9zaXRpb24sIGNvbnN0IGluIG1hdDQgbW9kZWxNYXRyaXgsXHJcblx0XHRjb25zdCBpbiBtYXQ0IHZpZXdNYXRyaXgsIGNvbnN0IGluIG1hdDQgcHJvak1hdHJpeCwgY29uc3QgaW4gZmxvYXQgZGlzcGVyc2lvbiwgY29uc3QgaW4gZmxvYXQgaW9yLCBjb25zdCBpbiBmbG9hdCB0aGlja25lc3MsXHJcblx0XHRjb25zdCBpbiB2ZWMzIGF0dGVudWF0aW9uQ29sb3IsIGNvbnN0IGluIGZsb2F0IGF0dGVudWF0aW9uRGlzdGFuY2UgKSB7XHJcblxyXG5cdFx0dmVjNCB0cmFuc21pdHRlZExpZ2h0O1xyXG5cdFx0dmVjMyB0cmFuc21pdHRhbmNlO1xyXG5cclxuXHRcdCNpZmRlZiBVU0VfRElTUEVSU0lPTlxyXG5cclxuXHRcdFx0ZmxvYXQgaGFsZlNwcmVhZCA9ICggaW9yIC0gMS4wICkgKiAwLjAyNSAqIGRpc3BlcnNpb247XHJcblx0XHRcdHZlYzMgaW9ycyA9IHZlYzMoIGlvciAtIGhhbGZTcHJlYWQsIGlvciwgaW9yICsgaGFsZlNwcmVhZCApO1xyXG5cclxuXHRcdFx0Zm9yICggaW50IGkgPSAwOyBpIDwgMzsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0dmVjMyB0cmFuc21pc3Npb25SYXkgPSBnZXRWb2x1bWVUcmFuc21pc3Npb25SYXkoIG4sIHYsIHRoaWNrbmVzcywgaW9yc1sgaSBdLCBtb2RlbE1hdHJpeCApO1xyXG5cdFx0XHRcdHZlYzMgcmVmcmFjdGVkUmF5RXhpdCA9IHBvc2l0aW9uICsgdHJhbnNtaXNzaW9uUmF5O1xyXG5cclxuXHRcdFx0XHQvLyBQcm9qZWN0IHJlZnJhY3RlZCB2ZWN0b3Igb24gdGhlIGZyYW1lYnVmZmVyLCB3aGlsZSBtYXBwaW5nIHRvIG5vcm1hbGl6ZWQgZGV2aWNlIGNvb3JkaW5hdGVzLlxyXG5cdFx0XHRcdHZlYzQgbmRjUG9zID0gcHJvak1hdHJpeCAqIHZpZXdNYXRyaXggKiB2ZWM0KCByZWZyYWN0ZWRSYXlFeGl0LCAxLjAgKTtcclxuXHRcdFx0XHR2ZWMyIHJlZnJhY3Rpb25Db29yZHMgPSBuZGNQb3MueHkgLyBuZGNQb3MudztcclxuXHRcdFx0XHRyZWZyYWN0aW9uQ29vcmRzICs9IDEuMDtcclxuXHRcdFx0XHRyZWZyYWN0aW9uQ29vcmRzIC89IDIuMDtcclxuXHJcblx0XHRcdFx0Ly8gU2FtcGxlIGZyYW1lYnVmZmVyIHRvIGdldCBwaXhlbCB0aGUgcmVmcmFjdGVkIHJheSBoaXRzLlxyXG5cdFx0XHRcdHZlYzQgdHJhbnNtaXNzaW9uU2FtcGxlID0gZ2V0VHJhbnNtaXNzaW9uU2FtcGxlKCByZWZyYWN0aW9uQ29vcmRzLCByb3VnaG5lc3MsIGlvcnNbIGkgXSApO1xyXG5cdFx0XHRcdHRyYW5zbWl0dGVkTGlnaHRbIGkgXSA9IHRyYW5zbWlzc2lvblNhbXBsZVsgaSBdO1xyXG5cdFx0XHRcdHRyYW5zbWl0dGVkTGlnaHQuYSArPSB0cmFuc21pc3Npb25TYW1wbGUuYTtcclxuXHJcblx0XHRcdFx0dHJhbnNtaXR0YW5jZVsgaSBdID0gZGlmZnVzZUNvbG9yWyBpIF0gKiB2b2x1bWVBdHRlbnVhdGlvbiggbGVuZ3RoKCB0cmFuc21pc3Npb25SYXkgKSwgYXR0ZW51YXRpb25Db2xvciwgYXR0ZW51YXRpb25EaXN0YW5jZSApWyBpIF07XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0cmFuc21pdHRlZExpZ2h0LmEgLz0gMy4wO1xyXG5cclxuXHRcdCNlbHNlXHJcblxyXG5cdFx0XHR2ZWMzIHRyYW5zbWlzc2lvblJheSA9IGdldFZvbHVtZVRyYW5zbWlzc2lvblJheSggbiwgdiwgdGhpY2tuZXNzLCBpb3IsIG1vZGVsTWF0cml4ICk7XHJcblx0XHRcdHZlYzMgcmVmcmFjdGVkUmF5RXhpdCA9IHBvc2l0aW9uICsgdHJhbnNtaXNzaW9uUmF5O1xyXG5cclxuXHRcdFx0Ly8gUHJvamVjdCByZWZyYWN0ZWQgdmVjdG9yIG9uIHRoZSBmcmFtZWJ1ZmZlciwgd2hpbGUgbWFwcGluZyB0byBub3JtYWxpemVkIGRldmljZSBjb29yZGluYXRlcy5cclxuXHRcdFx0dmVjNCBuZGNQb3MgPSBwcm9qTWF0cml4ICogdmlld01hdHJpeCAqIHZlYzQoIHJlZnJhY3RlZFJheUV4aXQsIDEuMCApO1xyXG5cdFx0XHR2ZWMyIHJlZnJhY3Rpb25Db29yZHMgPSBuZGNQb3MueHkgLyBuZGNQb3MudztcclxuXHRcdFx0cmVmcmFjdGlvbkNvb3JkcyArPSAxLjA7XHJcblx0XHRcdHJlZnJhY3Rpb25Db29yZHMgLz0gMi4wO1xyXG5cclxuXHRcdFx0Ly8gU2FtcGxlIGZyYW1lYnVmZmVyIHRvIGdldCBwaXhlbCB0aGUgcmVmcmFjdGVkIHJheSBoaXRzLlxyXG5cdFx0XHR0cmFuc21pdHRlZExpZ2h0ID0gZ2V0VHJhbnNtaXNzaW9uU2FtcGxlKCByZWZyYWN0aW9uQ29vcmRzLCByb3VnaG5lc3MsIGlvciApO1xyXG5cdFx0XHR0cmFuc21pdHRhbmNlID0gZGlmZnVzZUNvbG9yICogdm9sdW1lQXR0ZW51YXRpb24oIGxlbmd0aCggdHJhbnNtaXNzaW9uUmF5ICksIGF0dGVudWF0aW9uQ29sb3IsIGF0dGVudWF0aW9uRGlzdGFuY2UgKTtcclxuXHJcblx0XHQjZW5kaWZcclxuXHJcblx0XHR2ZWMzIGF0dGVudWF0ZWRDb2xvciA9IHRyYW5zbWl0dGFuY2UgKiB0cmFuc21pdHRlZExpZ2h0LnJnYjtcclxuXHJcblx0XHQvLyBHZXQgdGhlIHNwZWN1bGFyIGNvbXBvbmVudC5cclxuXHRcdHZlYzMgRiA9IEVudmlyb25tZW50QlJERiggbiwgdiwgc3BlY3VsYXJDb2xvciwgc3BlY3VsYXJGOTAsIHJvdWdobmVzcyApO1xyXG5cclxuXHRcdC8vIEFzIGxlc3MgbGlnaHQgaXMgdHJhbnNtaXR0ZWQsIHRoZSBvcGFjaXR5IHNob3VsZCBiZSBpbmNyZWFzZWQuIFRoaXMgc2ltcGxlIGFwcHJveGltYXRpb24gZG9lcyBhIGRlY2VudCBqb2JcclxuXHRcdC8vIG9mIG1vZHVsYXRpbmcgYSBDU1MgYmFja2dyb3VuZCwgYW5kIGhhcyBubyBlZmZlY3Qgd2hlbiB0aGUgYnVmZmVyIGlzIG9wYXF1ZSwgZHVlIHRvIGEgc29saWQgb2JqZWN0IG9yIGNsZWFyIGNvbG9yLlxyXG5cdFx0ZmxvYXQgdHJhbnNtaXR0YW5jZUZhY3RvciA9ICggdHJhbnNtaXR0YW5jZS5yICsgdHJhbnNtaXR0YW5jZS5nICsgdHJhbnNtaXR0YW5jZS5iICkgLyAzLjA7XHJcblxyXG5cdFx0cmV0dXJuIHZlYzQoICggMS4wIC0gRiApICogYXR0ZW51YXRlZENvbG9yLCAxLjAgLSAoIDEuMCAtIHRyYW5zbWl0dGVkTGlnaHQuYSApICogdHJhbnNtaXR0YW5jZUZhY3RvciApO1xyXG5cclxuXHR9XHJcbiNlbmRpZlxyXG5gO1xyXG4iLCJleHBvcnQgZGVmYXVsdCAvKiBnbHNsICovYFxyXG4jaWYgZGVmaW5lZCggVVNFX1VWICkgfHwgZGVmaW5lZCggVVNFX0FOSVNPVFJPUFkgKVxyXG5cclxuXHR2YXJ5aW5nIHZlYzIgdlV2O1xyXG5cclxuI2VuZGlmXHJcbiNpZmRlZiBVU0VfTUFQXHJcblxyXG5cdHZhcnlpbmcgdmVjMiB2TWFwVXY7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9BTFBIQU1BUFxyXG5cclxuXHR2YXJ5aW5nIHZlYzIgdkFscGhhTWFwVXY7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9MSUdIVE1BUFxyXG5cclxuXHR2YXJ5aW5nIHZlYzIgdkxpZ2h0TWFwVXY7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9BT01BUFxyXG5cclxuXHR2YXJ5aW5nIHZlYzIgdkFvTWFwVXY7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9CVU1QTUFQXHJcblxyXG5cdHZhcnlpbmcgdmVjMiB2QnVtcE1hcFV2O1xyXG5cclxuI2VuZGlmXHJcbiNpZmRlZiBVU0VfTk9STUFMTUFQXHJcblxyXG5cdHZhcnlpbmcgdmVjMiB2Tm9ybWFsTWFwVXY7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9FTUlTU0lWRU1BUFxyXG5cclxuXHR2YXJ5aW5nIHZlYzIgdkVtaXNzaXZlTWFwVXY7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9NRVRBTE5FU1NNQVBcclxuXHJcblx0dmFyeWluZyB2ZWMyIHZNZXRhbG5lc3NNYXBVdjtcclxuXHJcbiNlbmRpZlxyXG4jaWZkZWYgVVNFX1JPVUdITkVTU01BUFxyXG5cclxuXHR2YXJ5aW5nIHZlYzIgdlJvdWdobmVzc01hcFV2O1xyXG5cclxuI2VuZGlmXHJcbiNpZmRlZiBVU0VfQU5JU09UUk9QWU1BUFxyXG5cclxuXHR2YXJ5aW5nIHZlYzIgdkFuaXNvdHJvcHlNYXBVdjtcclxuXHJcbiNlbmRpZlxyXG4jaWZkZWYgVVNFX0NMRUFSQ09BVE1BUFxyXG5cclxuXHR2YXJ5aW5nIHZlYzIgdkNsZWFyY29hdE1hcFV2O1xyXG5cclxuI2VuZGlmXHJcbiNpZmRlZiBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUFxyXG5cclxuXHR2YXJ5aW5nIHZlYzIgdkNsZWFyY29hdE5vcm1hbE1hcFV2O1xyXG5cclxuI2VuZGlmXHJcbiNpZmRlZiBVU0VfQ0xFQVJDT0FUX1JPVUdITkVTU01BUFxyXG5cclxuXHR2YXJ5aW5nIHZlYzIgdkNsZWFyY29hdFJvdWdobmVzc01hcFV2O1xyXG5cclxuI2VuZGlmXHJcbiNpZmRlZiBVU0VfSVJJREVTQ0VOQ0VNQVBcclxuXHJcblx0dmFyeWluZyB2ZWMyIHZJcmlkZXNjZW5jZU1hcFV2O1xyXG5cclxuI2VuZGlmXHJcbiNpZmRlZiBVU0VfSVJJREVTQ0VOQ0VfVEhJQ0tORVNTTUFQXHJcblxyXG5cdHZhcnlpbmcgdmVjMiB2SXJpZGVzY2VuY2VUaGlja25lc3NNYXBVdjtcclxuXHJcbiNlbmRpZlxyXG4jaWZkZWYgVVNFX1NIRUVOX0NPTE9STUFQXHJcblxyXG5cdHZhcnlpbmcgdmVjMiB2U2hlZW5Db2xvck1hcFV2O1xyXG5cclxuI2VuZGlmXHJcbiNpZmRlZiBVU0VfU0hFRU5fUk9VR0hORVNTTUFQXHJcblxyXG5cdHZhcnlpbmcgdmVjMiB2U2hlZW5Sb3VnaG5lc3NNYXBVdjtcclxuXHJcbiNlbmRpZlxyXG4jaWZkZWYgVVNFX1NQRUNVTEFSTUFQXHJcblxyXG5cdHZhcnlpbmcgdmVjMiB2U3BlY3VsYXJNYXBVdjtcclxuXHJcbiNlbmRpZlxyXG4jaWZkZWYgVVNFX1NQRUNVTEFSX0NPTE9STUFQXHJcblxyXG5cdHZhcnlpbmcgdmVjMiB2U3BlY3VsYXJDb2xvck1hcFV2O1xyXG5cclxuI2VuZGlmXHJcbiNpZmRlZiBVU0VfU1BFQ1VMQVJfSU5URU5TSVRZTUFQXHJcblxyXG5cdHZhcnlpbmcgdmVjMiB2U3BlY3VsYXJJbnRlbnNpdHlNYXBVdjtcclxuXHJcbiNlbmRpZlxyXG4jaWZkZWYgVVNFX1RSQU5TTUlTU0lPTk1BUFxyXG5cclxuXHR1bmlmb3JtIG1hdDMgdHJhbnNtaXNzaW9uTWFwVHJhbnNmb3JtO1xyXG5cdHZhcnlpbmcgdmVjMiB2VHJhbnNtaXNzaW9uTWFwVXY7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9USElDS05FU1NNQVBcclxuXHJcblx0dW5pZm9ybSBtYXQzIHRoaWNrbmVzc01hcFRyYW5zZm9ybTtcclxuXHR2YXJ5aW5nIHZlYzIgdlRoaWNrbmVzc01hcFV2O1xyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbiNpZiBkZWZpbmVkKCBVU0VfVVYgKSB8fCBkZWZpbmVkKCBVU0VfQU5JU09UUk9QWSApXHJcblxyXG5cdHZhcnlpbmcgdmVjMiB2VXY7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9NQVBcclxuXHJcblx0dW5pZm9ybSBtYXQzIG1hcFRyYW5zZm9ybTtcclxuXHR2YXJ5aW5nIHZlYzIgdk1hcFV2O1xyXG5cclxuI2VuZGlmXHJcbiNpZmRlZiBVU0VfQUxQSEFNQVBcclxuXHJcblx0dW5pZm9ybSBtYXQzIGFscGhhTWFwVHJhbnNmb3JtO1xyXG5cdHZhcnlpbmcgdmVjMiB2QWxwaGFNYXBVdjtcclxuXHJcbiNlbmRpZlxyXG4jaWZkZWYgVVNFX0xJR0hUTUFQXHJcblxyXG5cdHVuaWZvcm0gbWF0MyBsaWdodE1hcFRyYW5zZm9ybTtcclxuXHR2YXJ5aW5nIHZlYzIgdkxpZ2h0TWFwVXY7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9BT01BUFxyXG5cclxuXHR1bmlmb3JtIG1hdDMgYW9NYXBUcmFuc2Zvcm07XHJcblx0dmFyeWluZyB2ZWMyIHZBb01hcFV2O1xyXG5cclxuI2VuZGlmXHJcbiNpZmRlZiBVU0VfQlVNUE1BUFxyXG5cclxuXHR1bmlmb3JtIG1hdDMgYnVtcE1hcFRyYW5zZm9ybTtcclxuXHR2YXJ5aW5nIHZlYzIgdkJ1bXBNYXBVdjtcclxuXHJcbiNlbmRpZlxyXG4jaWZkZWYgVVNFX05PUk1BTE1BUFxyXG5cclxuXHR1bmlmb3JtIG1hdDMgbm9ybWFsTWFwVHJhbnNmb3JtO1xyXG5cdHZhcnlpbmcgdmVjMiB2Tm9ybWFsTWFwVXY7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVBcclxuXHJcblx0dW5pZm9ybSBtYXQzIGRpc3BsYWNlbWVudE1hcFRyYW5zZm9ybTtcclxuXHR2YXJ5aW5nIHZlYzIgdkRpc3BsYWNlbWVudE1hcFV2O1xyXG5cclxuI2VuZGlmXHJcbiNpZmRlZiBVU0VfRU1JU1NJVkVNQVBcclxuXHJcblx0dW5pZm9ybSBtYXQzIGVtaXNzaXZlTWFwVHJhbnNmb3JtO1xyXG5cdHZhcnlpbmcgdmVjMiB2RW1pc3NpdmVNYXBVdjtcclxuXHJcbiNlbmRpZlxyXG4jaWZkZWYgVVNFX01FVEFMTkVTU01BUFxyXG5cclxuXHR1bmlmb3JtIG1hdDMgbWV0YWxuZXNzTWFwVHJhbnNmb3JtO1xyXG5cdHZhcnlpbmcgdmVjMiB2TWV0YWxuZXNzTWFwVXY7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9ST1VHSE5FU1NNQVBcclxuXHJcblx0dW5pZm9ybSBtYXQzIHJvdWdobmVzc01hcFRyYW5zZm9ybTtcclxuXHR2YXJ5aW5nIHZlYzIgdlJvdWdobmVzc01hcFV2O1xyXG5cclxuI2VuZGlmXHJcbiNpZmRlZiBVU0VfQU5JU09UUk9QWU1BUFxyXG5cclxuXHR1bmlmb3JtIG1hdDMgYW5pc290cm9weU1hcFRyYW5zZm9ybTtcclxuXHR2YXJ5aW5nIHZlYzIgdkFuaXNvdHJvcHlNYXBVdjtcclxuXHJcbiNlbmRpZlxyXG4jaWZkZWYgVVNFX0NMRUFSQ09BVE1BUFxyXG5cclxuXHR1bmlmb3JtIG1hdDMgY2xlYXJjb2F0TWFwVHJhbnNmb3JtO1xyXG5cdHZhcnlpbmcgdmVjMiB2Q2xlYXJjb2F0TWFwVXY7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQXHJcblxyXG5cdHVuaWZvcm0gbWF0MyBjbGVhcmNvYXROb3JtYWxNYXBUcmFuc2Zvcm07XHJcblx0dmFyeWluZyB2ZWMyIHZDbGVhcmNvYXROb3JtYWxNYXBVdjtcclxuXHJcbiNlbmRpZlxyXG4jaWZkZWYgVVNFX0NMRUFSQ09BVF9ST1VHSE5FU1NNQVBcclxuXHJcblx0dW5pZm9ybSBtYXQzIGNsZWFyY29hdFJvdWdobmVzc01hcFRyYW5zZm9ybTtcclxuXHR2YXJ5aW5nIHZlYzIgdkNsZWFyY29hdFJvdWdobmVzc01hcFV2O1xyXG5cclxuI2VuZGlmXHJcbiNpZmRlZiBVU0VfU0hFRU5fQ09MT1JNQVBcclxuXHJcblx0dW5pZm9ybSBtYXQzIHNoZWVuQ29sb3JNYXBUcmFuc2Zvcm07XHJcblx0dmFyeWluZyB2ZWMyIHZTaGVlbkNvbG9yTWFwVXY7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9TSEVFTl9ST1VHSE5FU1NNQVBcclxuXHJcblx0dW5pZm9ybSBtYXQzIHNoZWVuUm91Z2huZXNzTWFwVHJhbnNmb3JtO1xyXG5cdHZhcnlpbmcgdmVjMiB2U2hlZW5Sb3VnaG5lc3NNYXBVdjtcclxuXHJcbiNlbmRpZlxyXG4jaWZkZWYgVVNFX0lSSURFU0NFTkNFTUFQXHJcblxyXG5cdHVuaWZvcm0gbWF0MyBpcmlkZXNjZW5jZU1hcFRyYW5zZm9ybTtcclxuXHR2YXJ5aW5nIHZlYzIgdklyaWRlc2NlbmNlTWFwVXY7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9JUklERVNDRU5DRV9USElDS05FU1NNQVBcclxuXHJcblx0dW5pZm9ybSBtYXQzIGlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwVHJhbnNmb3JtO1xyXG5cdHZhcnlpbmcgdmVjMiB2SXJpZGVzY2VuY2VUaGlja25lc3NNYXBVdjtcclxuXHJcbiNlbmRpZlxyXG4jaWZkZWYgVVNFX1NQRUNVTEFSTUFQXHJcblxyXG5cdHVuaWZvcm0gbWF0MyBzcGVjdWxhck1hcFRyYW5zZm9ybTtcclxuXHR2YXJ5aW5nIHZlYzIgdlNwZWN1bGFyTWFwVXY7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9TUEVDVUxBUl9DT0xPUk1BUFxyXG5cclxuXHR1bmlmb3JtIG1hdDMgc3BlY3VsYXJDb2xvck1hcFRyYW5zZm9ybTtcclxuXHR2YXJ5aW5nIHZlYzIgdlNwZWN1bGFyQ29sb3JNYXBVdjtcclxuXHJcbiNlbmRpZlxyXG4jaWZkZWYgVVNFX1NQRUNVTEFSX0lOVEVOU0lUWU1BUFxyXG5cclxuXHR1bmlmb3JtIG1hdDMgc3BlY3VsYXJJbnRlbnNpdHlNYXBUcmFuc2Zvcm07XHJcblx0dmFyeWluZyB2ZWMyIHZTcGVjdWxhckludGVuc2l0eU1hcFV2O1xyXG5cclxuI2VuZGlmXHJcbiNpZmRlZiBVU0VfVFJBTlNNSVNTSU9OTUFQXHJcblxyXG5cdHVuaWZvcm0gbWF0MyB0cmFuc21pc3Npb25NYXBUcmFuc2Zvcm07XHJcblx0dmFyeWluZyB2ZWMyIHZUcmFuc21pc3Npb25NYXBVdjtcclxuXHJcbiNlbmRpZlxyXG4jaWZkZWYgVVNFX1RISUNLTkVTU01BUFxyXG5cclxuXHR1bmlmb3JtIG1hdDMgdGhpY2tuZXNzTWFwVHJhbnNmb3JtO1xyXG5cdHZhcnlpbmcgdmVjMiB2VGhpY2tuZXNzTWFwVXY7XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGRlZmF1bHQgLyogZ2xzbCAqL2BcclxuI2lmIGRlZmluZWQoIFVTRV9VViApIHx8IGRlZmluZWQoIFVTRV9BTklTT1RST1BZIClcclxuXHJcblx0dlV2ID0gdmVjMyggdXYsIDEgKS54eTtcclxuXHJcbiNlbmRpZlxyXG4jaWZkZWYgVVNFX01BUFxyXG5cclxuXHR2TWFwVXYgPSAoIG1hcFRyYW5zZm9ybSAqIHZlYzMoIE1BUF9VViwgMSApICkueHk7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9BTFBIQU1BUFxyXG5cclxuXHR2QWxwaGFNYXBVdiA9ICggYWxwaGFNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBBTFBIQU1BUF9VViwgMSApICkueHk7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9MSUdIVE1BUFxyXG5cclxuXHR2TGlnaHRNYXBVdiA9ICggbGlnaHRNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBMSUdIVE1BUF9VViwgMSApICkueHk7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9BT01BUFxyXG5cclxuXHR2QW9NYXBVdiA9ICggYW9NYXBUcmFuc2Zvcm0gKiB2ZWMzKCBBT01BUF9VViwgMSApICkueHk7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9CVU1QTUFQXHJcblxyXG5cdHZCdW1wTWFwVXYgPSAoIGJ1bXBNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBCVU1QTUFQX1VWLCAxICkgKS54eTtcclxuXHJcbiNlbmRpZlxyXG4jaWZkZWYgVVNFX05PUk1BTE1BUFxyXG5cclxuXHR2Tm9ybWFsTWFwVXYgPSAoIG5vcm1hbE1hcFRyYW5zZm9ybSAqIHZlYzMoIE5PUk1BTE1BUF9VViwgMSApICkueHk7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVBcclxuXHJcblx0dkRpc3BsYWNlbWVudE1hcFV2ID0gKCBkaXNwbGFjZW1lbnRNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBESVNQTEFDRU1FTlRNQVBfVVYsIDEgKSApLnh5O1xyXG5cclxuI2VuZGlmXHJcbiNpZmRlZiBVU0VfRU1JU1NJVkVNQVBcclxuXHJcblx0dkVtaXNzaXZlTWFwVXYgPSAoIGVtaXNzaXZlTWFwVHJhbnNmb3JtICogdmVjMyggRU1JU1NJVkVNQVBfVVYsIDEgKSApLnh5O1xyXG5cclxuI2VuZGlmXHJcbiNpZmRlZiBVU0VfTUVUQUxORVNTTUFQXHJcblxyXG5cdHZNZXRhbG5lc3NNYXBVdiA9ICggbWV0YWxuZXNzTWFwVHJhbnNmb3JtICogdmVjMyggTUVUQUxORVNTTUFQX1VWLCAxICkgKS54eTtcclxuXHJcbiNlbmRpZlxyXG4jaWZkZWYgVVNFX1JPVUdITkVTU01BUFxyXG5cclxuXHR2Um91Z2huZXNzTWFwVXYgPSAoIHJvdWdobmVzc01hcFRyYW5zZm9ybSAqIHZlYzMoIFJPVUdITkVTU01BUF9VViwgMSApICkueHk7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9BTklTT1RST1BZTUFQXHJcblxyXG5cdHZBbmlzb3Ryb3B5TWFwVXYgPSAoIGFuaXNvdHJvcHlNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBBTklTT1RST1BZTUFQX1VWLCAxICkgKS54eTtcclxuXHJcbiNlbmRpZlxyXG4jaWZkZWYgVVNFX0NMRUFSQ09BVE1BUFxyXG5cclxuXHR2Q2xlYXJjb2F0TWFwVXYgPSAoIGNsZWFyY29hdE1hcFRyYW5zZm9ybSAqIHZlYzMoIENMRUFSQ09BVE1BUF9VViwgMSApICkueHk7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQXHJcblxyXG5cdHZDbGVhcmNvYXROb3JtYWxNYXBVdiA9ICggY2xlYXJjb2F0Tm9ybWFsTWFwVHJhbnNmb3JtICogdmVjMyggQ0xFQVJDT0FUX05PUk1BTE1BUF9VViwgMSApICkueHk7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9DTEVBUkNPQVRfUk9VR0hORVNTTUFQXHJcblxyXG5cdHZDbGVhcmNvYXRSb3VnaG5lc3NNYXBVdiA9ICggY2xlYXJjb2F0Um91Z2huZXNzTWFwVHJhbnNmb3JtICogdmVjMyggQ0xFQVJDT0FUX1JPVUdITkVTU01BUF9VViwgMSApICkueHk7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9JUklERVNDRU5DRU1BUFxyXG5cclxuXHR2SXJpZGVzY2VuY2VNYXBVdiA9ICggaXJpZGVzY2VuY2VNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBJUklERVNDRU5DRU1BUF9VViwgMSApICkueHk7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9JUklERVNDRU5DRV9USElDS05FU1NNQVBcclxuXHJcblx0dklyaWRlc2NlbmNlVGhpY2tuZXNzTWFwVXYgPSAoIGlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwVHJhbnNmb3JtICogdmVjMyggSVJJREVTQ0VOQ0VfVEhJQ0tORVNTTUFQX1VWLCAxICkgKS54eTtcclxuXHJcbiNlbmRpZlxyXG4jaWZkZWYgVVNFX1NIRUVOX0NPTE9STUFQXHJcblxyXG5cdHZTaGVlbkNvbG9yTWFwVXYgPSAoIHNoZWVuQ29sb3JNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBTSEVFTl9DT0xPUk1BUF9VViwgMSApICkueHk7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9TSEVFTl9ST1VHSE5FU1NNQVBcclxuXHJcblx0dlNoZWVuUm91Z2huZXNzTWFwVXYgPSAoIHNoZWVuUm91Z2huZXNzTWFwVHJhbnNmb3JtICogdmVjMyggU0hFRU5fUk9VR0hORVNTTUFQX1VWLCAxICkgKS54eTtcclxuXHJcbiNlbmRpZlxyXG4jaWZkZWYgVVNFX1NQRUNVTEFSTUFQXHJcblxyXG5cdHZTcGVjdWxhck1hcFV2ID0gKCBzcGVjdWxhck1hcFRyYW5zZm9ybSAqIHZlYzMoIFNQRUNVTEFSTUFQX1VWLCAxICkgKS54eTtcclxuXHJcbiNlbmRpZlxyXG4jaWZkZWYgVVNFX1NQRUNVTEFSX0NPTE9STUFQXHJcblxyXG5cdHZTcGVjdWxhckNvbG9yTWFwVXYgPSAoIHNwZWN1bGFyQ29sb3JNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBTUEVDVUxBUl9DT0xPUk1BUF9VViwgMSApICkueHk7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9TUEVDVUxBUl9JTlRFTlNJVFlNQVBcclxuXHJcblx0dlNwZWN1bGFySW50ZW5zaXR5TWFwVXYgPSAoIHNwZWN1bGFySW50ZW5zaXR5TWFwVHJhbnNmb3JtICogdmVjMyggU1BFQ1VMQVJfSU5URU5TSVRZTUFQX1VWLCAxICkgKS54eTtcclxuXHJcbiNlbmRpZlxyXG4jaWZkZWYgVVNFX1RSQU5TTUlTU0lPTk1BUFxyXG5cclxuXHR2VHJhbnNtaXNzaW9uTWFwVXYgPSAoIHRyYW5zbWlzc2lvbk1hcFRyYW5zZm9ybSAqIHZlYzMoIFRSQU5TTUlTU0lPTk1BUF9VViwgMSApICkueHk7XHJcblxyXG4jZW5kaWZcclxuI2lmZGVmIFVTRV9USElDS05FU1NNQVBcclxuXHJcblx0dlRoaWNrbmVzc01hcFV2ID0gKCB0aGlja25lc3NNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBUSElDS05FU1NNQVBfVVYsIDEgKSApLnh5O1xyXG5cclxuI2VuZGlmXHJcbmA7XHJcbiIsImV4cG9ydCBkZWZhdWx0IC8qIGdsc2wgKi9gXHJcbiNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgfHwgZGVmaW5lZCggRElTVEFOQ0UgKSB8fCBkZWZpbmVkICggVVNFX1NIQURPV01BUCApIHx8IGRlZmluZWQgKCBVU0VfVFJBTlNNSVNTSU9OICkgfHwgTlVNX1NQT1RfTElHSFRfQ09PUkRTID4gMFxyXG5cclxuXHR2ZWM0IHdvcmxkUG9zaXRpb24gPSB2ZWM0KCB0cmFuc2Zvcm1lZCwgMS4wICk7XHJcblxyXG5cdCNpZmRlZiBVU0VfQkFUQ0hJTkdcclxuXHJcblx0XHR3b3JsZFBvc2l0aW9uID0gYmF0Y2hpbmdNYXRyaXggKiB3b3JsZFBvc2l0aW9uO1xyXG5cclxuXHQjZW5kaWZcclxuXHJcblx0I2lmZGVmIFVTRV9JTlNUQU5DSU5HXHJcblxyXG5cdFx0d29ybGRQb3NpdGlvbiA9IGluc3RhbmNlTWF0cml4ICogd29ybGRQb3NpdGlvbjtcclxuXHJcblx0I2VuZGlmXHJcblxyXG5cdHdvcmxkUG9zaXRpb24gPSBtb2RlbE1hdHJpeCAqIHdvcmxkUG9zaXRpb247XHJcblxyXG4jZW5kaWZcclxuYDtcclxuIiwiZXhwb3J0IGNvbnN0IHZlcnRleCA9IC8qIGdsc2wgKi9gXHJcbnZhcnlpbmcgdmVjMiB2VXY7XHJcbnVuaWZvcm0gbWF0MyB1dlRyYW5zZm9ybTtcclxuXHJcbnZvaWQgbWFpbigpIHtcclxuXHJcblx0dlV2ID0gKCB1dlRyYW5zZm9ybSAqIHZlYzMoIHV2LCAxICkgKS54eTtcclxuXHJcblx0Z2xfUG9zaXRpb24gPSB2ZWM0KCBwb3NpdGlvbi54eSwgMS4wLCAxLjAgKTtcclxuXHJcbn1cclxuYDtcclxuXHJcbmV4cG9ydCBjb25zdCBmcmFnbWVudCA9IC8qIGdsc2wgKi9gXHJcbnVuaWZvcm0gc2FtcGxlcjJEIHQyRDtcclxudW5pZm9ybSBmbG9hdCBiYWNrZ3JvdW5kSW50ZW5zaXR5O1xyXG5cclxudmFyeWluZyB2ZWMyIHZVdjtcclxuXHJcbnZvaWQgbWFpbigpIHtcclxuXHJcblx0dmVjNCB0ZXhDb2xvciA9IHRleHR1cmUyRCggdDJELCB2VXYgKTtcclxuXHJcblx0I2lmZGVmIERFQ09ERV9WSURFT19URVhUVVJFXHJcblxyXG5cdFx0Ly8gdXNlIGlubGluZSBzUkdCIGRlY29kZSB1bnRpbCBicm93c2VycyBwcm9wZXJseSBzdXBwb3J0IFNSR0I4X0FQTEhBOCB3aXRoIHZpZGVvIHRleHR1cmVzXHJcblxyXG5cdFx0dGV4Q29sb3IgPSB2ZWM0KCBtaXgoIHBvdyggdGV4Q29sb3IucmdiICogMC45NDc4NjcyOTg2ICsgdmVjMyggMC4wNTIxMzI3MDE0ICksIHZlYzMoIDIuNCApICksIHRleENvbG9yLnJnYiAqIDAuMDc3Mzk5MzgwOCwgdmVjMyggbGVzc1RoYW5FcXVhbCggdGV4Q29sb3IucmdiLCB2ZWMzKCAwLjA0MDQ1ICkgKSApICksIHRleENvbG9yLncgKTtcclxuXHJcblx0I2VuZGlmXHJcblxyXG5cdHRleENvbG9yLnJnYiAqPSBiYWNrZ3JvdW5kSW50ZW5zaXR5O1xyXG5cclxuXHRnbF9GcmFnQ29sb3IgPSB0ZXhDb2xvcjtcclxuXHJcblx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxjb2xvcnNwYWNlX2ZyYWdtZW50PlxyXG5cclxufVxyXG5gO1xyXG4iLCJleHBvcnQgY29uc3QgdmVydGV4ID0gLyogZ2xzbCAqL2BcclxudmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcclxuXHJcbiNpbmNsdWRlIDxjb21tb24+XHJcblxyXG52b2lkIG1haW4oKSB7XHJcblxyXG5cdHZXb3JsZERpcmVjdGlvbiA9IHRyYW5zZm9ybURpcmVjdGlvbiggcG9zaXRpb24sIG1vZGVsTWF0cml4ICk7XHJcblxyXG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxyXG5cclxuXHRnbF9Qb3NpdGlvbi56ID0gZ2xfUG9zaXRpb24udzsgLy8gc2V0IHogdG8gY2FtZXJhLmZhclxyXG5cclxufVxyXG5gO1xyXG5cclxuZXhwb3J0IGNvbnN0IGZyYWdtZW50ID0gLyogZ2xzbCAqL2BcclxuXHJcbiNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXHJcblxyXG5cdHVuaWZvcm0gc2FtcGxlckN1YmUgZW52TWFwO1xyXG5cclxuI2VsaWYgZGVmaW5lZCggRU5WTUFQX1RZUEVfQ1VCRV9VViApXHJcblxyXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGVudk1hcDtcclxuXHJcbiNlbmRpZlxyXG5cclxudW5pZm9ybSBmbG9hdCBmbGlwRW52TWFwO1xyXG51bmlmb3JtIGZsb2F0IGJhY2tncm91bmRCbHVycmluZXNzO1xyXG51bmlmb3JtIGZsb2F0IGJhY2tncm91bmRJbnRlbnNpdHk7XHJcbnVuaWZvcm0gbWF0MyBiYWNrZ3JvdW5kUm90YXRpb247XHJcblxyXG52YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uO1xyXG5cclxuI2luY2x1ZGUgPGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudD5cclxuXHJcbnZvaWQgbWFpbigpIHtcclxuXHJcblx0I2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVcclxuXHJcblx0XHR2ZWM0IHRleENvbG9yID0gdGV4dHVyZUN1YmUoIGVudk1hcCwgYmFja2dyb3VuZFJvdGF0aW9uICogdmVjMyggZmxpcEVudk1hcCAqIHZXb3JsZERpcmVjdGlvbi54LCB2V29ybGREaXJlY3Rpb24ueXogKSApO1xyXG5cclxuXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9DVUJFX1VWIClcclxuXHJcblx0XHR2ZWM0IHRleENvbG9yID0gdGV4dHVyZUN1YmVVViggZW52TWFwLCBiYWNrZ3JvdW5kUm90YXRpb24gKiB2V29ybGREaXJlY3Rpb24sIGJhY2tncm91bmRCbHVycmluZXNzICk7XHJcblxyXG5cdCNlbHNlXHJcblxyXG5cdFx0dmVjNCB0ZXhDb2xvciA9IHZlYzQoIDAuMCwgMC4wLCAwLjAsIDEuMCApO1xyXG5cclxuXHQjZW5kaWZcclxuXHJcblx0dGV4Q29sb3IucmdiICo9IGJhY2tncm91bmRJbnRlbnNpdHk7XHJcblxyXG5cdGdsX0ZyYWdDb2xvciA9IHRleENvbG9yO1xyXG5cclxuXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPGNvbG9yc3BhY2VfZnJhZ21lbnQ+XHJcblxyXG59XHJcbmA7XHJcbiIsImV4cG9ydCBjb25zdCB2ZXJ0ZXggPSAvKiBnbHNsICovYFxyXG52YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uO1xyXG5cclxuI2luY2x1ZGUgPGNvbW1vbj5cclxuXHJcbnZvaWQgbWFpbigpIHtcclxuXHJcblx0dldvcmxkRGlyZWN0aW9uID0gdHJhbnNmb3JtRGlyZWN0aW9uKCBwb3NpdGlvbiwgbW9kZWxNYXRyaXggKTtcclxuXHJcblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XHJcblxyXG5cdGdsX1Bvc2l0aW9uLnogPSBnbF9Qb3NpdGlvbi53OyAvLyBzZXQgeiB0byBjYW1lcmEuZmFyXHJcblxyXG59XHJcbmA7XHJcblxyXG5leHBvcnQgY29uc3QgZnJhZ21lbnQgPSAvKiBnbHNsICovYFxyXG51bmlmb3JtIHNhbXBsZXJDdWJlIHRDdWJlO1xyXG51bmlmb3JtIGZsb2F0IHRGbGlwO1xyXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XHJcblxyXG52YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uO1xyXG5cclxudm9pZCBtYWluKCkge1xyXG5cclxuXHR2ZWM0IHRleENvbG9yID0gdGV4dHVyZUN1YmUoIHRDdWJlLCB2ZWMzKCB0RmxpcCAqIHZXb3JsZERpcmVjdGlvbi54LCB2V29ybGREaXJlY3Rpb24ueXogKSApO1xyXG5cclxuXHRnbF9GcmFnQ29sb3IgPSB0ZXhDb2xvcjtcclxuXHRnbF9GcmFnQ29sb3IuYSAqPSBvcGFjaXR5O1xyXG5cclxuXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPGNvbG9yc3BhY2VfZnJhZ21lbnQ+XHJcblxyXG59XHJcbmA7XHJcbiIsImV4cG9ydCBjb25zdCB2ZXJ0ZXggPSAvKiBnbHNsICovYFxyXG4jaW5jbHVkZSA8Y29tbW9uPlxyXG4jaW5jbHVkZSA8YmF0Y2hpbmdfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cclxuXHJcbi8vIFRoaXMgaXMgdXNlZCBmb3IgY29tcHV0aW5nIGFuIGVxdWl2YWxlbnQgb2YgZ2xfRnJhZ0Nvb3JkLnogdGhhdCBpcyBhcyBoaWdoIHByZWNpc2lvbiBhcyBwb3NzaWJsZS5cclxuLy8gU29tZSBwbGF0Zm9ybXMgY29tcHV0ZSBnbF9GcmFnQ29vcmQgYXQgYSBsb3dlciBwcmVjaXNpb24gd2hpY2ggbWFrZXMgdGhlIG1hbnVhbGx5IGNvbXB1dGVkIHZhbHVlIGJldHRlciBmb3JcclxuLy8gZGVwdGgtYmFzZWQgcG9zdHByb2Nlc3NpbmcgZWZmZWN0cy4gUmVwcm9kdWNlZCBvbiBpUGFkIHdpdGggQTEwIHByb2Nlc3NvciAvIGlQYWRPUyAxMy4zLjEuXHJcbnZhcnlpbmcgdmVjMiB2SGlnaFByZWNpc2lvblpXO1xyXG5cclxudm9pZCBtYWluKCkge1xyXG5cclxuXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxyXG5cclxuXHQjaW5jbHVkZSA8YmF0Y2hpbmdfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XHJcblxyXG5cdCNpbmNsdWRlIDxtb3JwaGluc3RhbmNlX3ZlcnRleD5cclxuXHJcblx0I2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVBcclxuXHJcblx0XHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxyXG5cdFx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cclxuXHRcdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cclxuXHJcblx0I2VuZGlmXHJcblxyXG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxyXG5cclxuXHR2SGlnaFByZWNpc2lvblpXID0gZ2xfUG9zaXRpb24uenc7XHJcblxyXG59XHJcbmA7XHJcblxyXG5leHBvcnQgY29uc3QgZnJhZ21lbnQgPSAvKiBnbHNsICovYFxyXG4jaWYgREVQVEhfUEFDS0lORyA9PSAzMjAwXHJcblxyXG5cdHVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcclxuXHJcbiNlbmRpZlxyXG5cclxuI2luY2x1ZGUgPGNvbW1vbj5cclxuI2luY2x1ZGUgPHBhY2tpbmc+XHJcbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8YWxwaGF0ZXN0X3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxhbHBoYWhhc2hfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cclxuXHJcbnZhcnlpbmcgdmVjMiB2SGlnaFByZWNpc2lvblpXO1xyXG5cclxudm9pZCBtYWluKCkge1xyXG5cclxuXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIDEuMCApO1xyXG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XHJcblxyXG5cdCNpZiBERVBUSF9QQUNLSU5HID09IDMyMDBcclxuXHJcblx0XHRkaWZmdXNlQ29sb3IuYSA9IG9wYWNpdHk7XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxhbHBoYWhhc2hfZnJhZ21lbnQ+XHJcblxyXG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cclxuXHJcblx0Ly8gSGlnaGVyIHByZWNpc2lvbiBlcXVpdmFsZW50IG9mIGdsX0ZyYWdDb29yZC56LiBUaGlzIGFzc3VtZXMgZGVwdGhSYW5nZSBoYXMgYmVlbiBsZWZ0IHRvIGl0cyBkZWZhdWx0IHZhbHVlcy5cclxuXHRmbG9hdCBmcmFnQ29vcmRaID0gMC41ICogdkhpZ2hQcmVjaXNpb25aV1swXSAvIHZIaWdoUHJlY2lzaW9uWldbMV0gKyAwLjU7XHJcblxyXG5cdCNpZiBERVBUSF9QQUNLSU5HID09IDMyMDBcclxuXHJcblx0XHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCB2ZWMzKCAxLjAgLSBmcmFnQ29vcmRaICksIG9wYWNpdHkgKTtcclxuXHJcblx0I2VsaWYgREVQVEhfUEFDS0lORyA9PSAzMjAxXHJcblxyXG5cdFx0Z2xfRnJhZ0NvbG9yID0gcGFja0RlcHRoVG9SR0JBKCBmcmFnQ29vcmRaICk7XHJcblxyXG5cdCNlbGlmIERFUFRIX1BBQ0tJTkcgPT0gMzIwMlxyXG5cclxuXHRcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIHBhY2tEZXB0aFRvUkdCKCBmcmFnQ29vcmRaICksIDEuMCApO1xyXG5cclxuXHQjZWxpZiBERVBUSF9QQUNLSU5HID09IDMyMDNcclxuXHJcblx0XHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBwYWNrRGVwdGhUb1JHKCBmcmFnQ29vcmRaICksIDAuMCwgMS4wICk7XHJcblxyXG5cdCNlbmRpZlxyXG5cclxufVxyXG5gO1xyXG4iLCJleHBvcnQgY29uc3QgdmVydGV4ID0gLyogZ2xzbCAqL2BcclxuI2RlZmluZSBESVNUQU5DRVxyXG5cclxudmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xyXG5cclxuI2luY2x1ZGUgPGNvbW1vbj5cclxuI2luY2x1ZGUgPGJhdGNoaW5nX3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PlxyXG5cclxudm9pZCBtYWluKCkge1xyXG5cclxuXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxyXG5cclxuXHQjaW5jbHVkZSA8YmF0Y2hpbmdfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XHJcblxyXG5cdCNpbmNsdWRlIDxtb3JwaGluc3RhbmNlX3ZlcnRleD5cclxuXHJcblx0I2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVBcclxuXHJcblx0XHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxyXG5cdFx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cclxuXHRcdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cclxuXHJcblx0I2VuZGlmXHJcblxyXG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxyXG5cclxuXHR2V29ybGRQb3NpdGlvbiA9IHdvcmxkUG9zaXRpb24ueHl6O1xyXG5cclxufVxyXG5gO1xyXG5cclxuZXhwb3J0IGNvbnN0IGZyYWdtZW50ID0gLyogZ2xzbCAqL2BcclxuI2RlZmluZSBESVNUQU5DRVxyXG5cclxudW5pZm9ybSB2ZWMzIHJlZmVyZW5jZVBvc2l0aW9uO1xyXG51bmlmb3JtIGZsb2F0IG5lYXJEaXN0YW5jZTtcclxudW5pZm9ybSBmbG9hdCBmYXJEaXN0YW5jZTtcclxudmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xyXG5cclxuI2luY2x1ZGUgPGNvbW1vbj5cclxuI2luY2x1ZGUgPHBhY2tpbmc+XHJcbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8YWxwaGF0ZXN0X3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxhbHBoYWhhc2hfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxyXG5cclxudm9pZCBtYWluICgpIHtcclxuXHJcblx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCAxLjAgKTtcclxuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxyXG5cclxuXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxhbHBoYWhhc2hfZnJhZ21lbnQ+XHJcblxyXG5cdGZsb2F0IGRpc3QgPSBsZW5ndGgoIHZXb3JsZFBvc2l0aW9uIC0gcmVmZXJlbmNlUG9zaXRpb24gKTtcclxuXHRkaXN0ID0gKCBkaXN0IC0gbmVhckRpc3RhbmNlICkgLyAoIGZhckRpc3RhbmNlIC0gbmVhckRpc3RhbmNlICk7XHJcblx0ZGlzdCA9IHNhdHVyYXRlKCBkaXN0ICk7IC8vIGNsYW1wIHRvIFsgMCwgMSBdXHJcblxyXG5cdGdsX0ZyYWdDb2xvciA9IHBhY2tEZXB0aFRvUkdCQSggZGlzdCApO1xyXG5cclxufVxyXG5gO1xyXG4iLCJleHBvcnQgY29uc3QgdmVydGV4ID0gLyogZ2xzbCAqL2BcclxudmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcclxuXHJcbiNpbmNsdWRlIDxjb21tb24+XHJcblxyXG52b2lkIG1haW4oKSB7XHJcblxyXG5cdHZXb3JsZERpcmVjdGlvbiA9IHRyYW5zZm9ybURpcmVjdGlvbiggcG9zaXRpb24sIG1vZGVsTWF0cml4ICk7XHJcblxyXG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxyXG5cclxufVxyXG5gO1xyXG5cclxuZXhwb3J0IGNvbnN0IGZyYWdtZW50ID0gLyogZ2xzbCAqL2BcclxudW5pZm9ybSBzYW1wbGVyMkQgdEVxdWlyZWN0O1xyXG5cclxudmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcclxuXHJcbiNpbmNsdWRlIDxjb21tb24+XHJcblxyXG52b2lkIG1haW4oKSB7XHJcblxyXG5cdHZlYzMgZGlyZWN0aW9uID0gbm9ybWFsaXplKCB2V29ybGREaXJlY3Rpb24gKTtcclxuXHJcblx0dmVjMiBzYW1wbGVVViA9IGVxdWlyZWN0VXYoIGRpcmVjdGlvbiApO1xyXG5cclxuXHRnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQoIHRFcXVpcmVjdCwgc2FtcGxlVVYgKTtcclxuXHJcblx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxjb2xvcnNwYWNlX2ZyYWdtZW50PlxyXG5cclxufVxyXG5gO1xyXG4iLCJleHBvcnQgY29uc3QgdmVydGV4ID0gLyogZ2xzbCAqL2BcclxudW5pZm9ybSBmbG9hdCBzY2FsZTtcclxuYXR0cmlidXRlIGZsb2F0IGxpbmVEaXN0YW5jZTtcclxuXHJcbnZhcnlpbmcgZmxvYXQgdkxpbmVEaXN0YW5jZTtcclxuXHJcbiNpbmNsdWRlIDxjb21tb24+XHJcbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cclxuXHJcbnZvaWQgbWFpbigpIHtcclxuXHJcblx0dkxpbmVEaXN0YW5jZSA9IHNjYWxlICogbGluZURpc3RhbmNlO1xyXG5cclxuXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPG1vcnBoaW5zdGFuY2VfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxtb3JwaGNvbG9yX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XHJcblxyXG59XHJcbmA7XHJcblxyXG5leHBvcnQgY29uc3QgZnJhZ21lbnQgPSAvKiBnbHNsICovYFxyXG51bmlmb3JtIHZlYzMgZGlmZnVzZTtcclxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xyXG5cclxudW5pZm9ybSBmbG9hdCBkYXNoU2l6ZTtcclxudW5pZm9ybSBmbG9hdCB0b3RhbFNpemU7XHJcblxyXG52YXJ5aW5nIGZsb2F0IHZMaW5lRGlzdGFuY2U7XHJcblxyXG4jaW5jbHVkZSA8Y29tbW9uPlxyXG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxyXG5cclxudm9pZCBtYWluKCkge1xyXG5cclxuXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcclxuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxyXG5cclxuXHRpZiAoIG1vZCggdkxpbmVEaXN0YW5jZSwgdG90YWxTaXplICkgPiBkYXNoU2l6ZSApIHtcclxuXHJcblx0XHRkaXNjYXJkO1xyXG5cclxuXHR9XHJcblxyXG5cdHZlYzMgb3V0Z29pbmdMaWdodCA9IHZlYzMoIDAuMCApO1xyXG5cclxuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XHJcblxyXG5cdG91dGdvaW5nTGlnaHQgPSBkaWZmdXNlQ29sb3IucmdiOyAvLyBzaW1wbGUgc2hhZGVyXHJcblxyXG5cdCNpbmNsdWRlIDxvcGFxdWVfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxjb2xvcnNwYWNlX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XHJcblxyXG59XHJcbmA7XHJcbiIsImV4cG9ydCBjb25zdCB2ZXJ0ZXggPSAvKiBnbHNsICovYFxyXG4jaW5jbHVkZSA8Y29tbW9uPlxyXG4jaW5jbHVkZSA8YmF0Y2hpbmdfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PlxyXG5cclxudm9pZCBtYWluKCkge1xyXG5cclxuXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPG1vcnBoaW5zdGFuY2VfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxtb3JwaGNvbG9yX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8YmF0Y2hpbmdfdmVydGV4PlxyXG5cclxuXHQjaWYgZGVmaW5lZCAoIFVTRV9FTlZNQVAgKSB8fCBkZWZpbmVkICggVVNFX1NLSU5OSU5HIClcclxuXHJcblx0XHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxyXG5cdFx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cclxuXHRcdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XHJcblx0XHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XHJcblx0XHQjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cclxuXHJcblx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8ZW52bWFwX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cclxuXHJcbn1cclxuYDtcclxuXHJcbmV4cG9ydCBjb25zdCBmcmFnbWVudCA9IC8qIGdsc2wgKi9gXHJcbnVuaWZvcm0gdmVjMyBkaWZmdXNlO1xyXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XHJcblxyXG4jaWZuZGVmIEZMQVRfU0hBREVEXHJcblxyXG5cdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xyXG5cclxuI2VuZGlmXHJcblxyXG4jaW5jbHVkZSA8Y29tbW9uPlxyXG4jaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGFscGhhdGVzdF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8YWxwaGFoYXNoX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxhb21hcF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGVudm1hcF9jb21tb25fcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxyXG5cclxudm9pZCBtYWluKCkge1xyXG5cclxuXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcclxuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxyXG5cclxuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPGFscGhhaGFzaF9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8c3BlY3VsYXJtYXBfZnJhZ21lbnQ+XHJcblxyXG5cdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ID0gUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XHJcblxyXG5cdC8vIGFjY3VtdWxhdGlvbiAoYmFrZWQgaW5kaXJlY3QgbGlnaHRpbmcgb25seSlcclxuXHQjaWZkZWYgVVNFX0xJR0hUTUFQXHJcblxyXG5cdFx0dmVjNCBsaWdodE1hcFRleGVsID0gdGV4dHVyZTJEKCBsaWdodE1hcCwgdkxpZ2h0TWFwVXYgKTtcclxuXHRcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBsaWdodE1hcFRleGVsLnJnYiAqIGxpZ2h0TWFwSW50ZW5zaXR5ICogUkVDSVBST0NBTF9QSTtcclxuXHJcblx0I2Vsc2VcclxuXHJcblx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gdmVjMyggMS4wICk7XHJcblxyXG5cdCNlbmRpZlxyXG5cclxuXHQvLyBtb2R1bGF0aW9uXHJcblx0I2luY2x1ZGUgPGFvbWFwX2ZyYWdtZW50PlxyXG5cclxuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKj0gZGlmZnVzZUNvbG9yLnJnYjtcclxuXHJcblx0dmVjMyBvdXRnb2luZ0xpZ2h0ID0gcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlO1xyXG5cclxuXHQjaW5jbHVkZSA8ZW52bWFwX2ZyYWdtZW50PlxyXG5cclxuXHQjaW5jbHVkZSA8b3BhcXVlX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8Y29sb3JzcGFjZV9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+XHJcblxyXG59XHJcbmA7XHJcbiIsImV4cG9ydCBjb25zdCB2ZXJ0ZXggPSAvKiBnbHNsICovYFxyXG4jZGVmaW5lIExBTUJFUlRcclxuXHJcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xyXG5cclxuI2luY2x1ZGUgPGNvbW1vbj5cclxuI2luY2x1ZGUgPGJhdGNoaW5nX3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxlbnZtYXBfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPG5vcm1hbF9wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cclxuXHJcbnZvaWQgbWFpbigpIHtcclxuXHJcblx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxtb3JwaGluc3RhbmNlX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8bW9ycGhjb2xvcl92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPGJhdGNoaW5nX3ZlcnRleD5cclxuXHJcblx0I2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8bm9ybWFsX3ZlcnRleD5cclxuXHJcblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XHJcblxyXG5cdHZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6O1xyXG5cclxuXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxlbnZtYXBfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxzaGFkb3dtYXBfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxmb2dfdmVydGV4PlxyXG5cclxufVxyXG5gO1xyXG5cclxuZXhwb3J0IGNvbnN0IGZyYWdtZW50ID0gLyogZ2xzbCAqL2BcclxuI2RlZmluZSBMQU1CRVJUXHJcblxyXG51bmlmb3JtIHZlYzMgZGlmZnVzZTtcclxudW5pZm9ybSB2ZWMzIGVtaXNzaXZlO1xyXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XHJcblxyXG4jaW5jbHVkZSA8Y29tbW9uPlxyXG4jaW5jbHVkZSA8cGFja2luZz5cclxuI2luY2x1ZGUgPGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxhbHBoYXRlc3RfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGFscGhhaGFzaF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8ZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGJzZGZzPlxyXG4jaW5jbHVkZSA8bGlnaHRzX3BhcnNfYmVnaW4+XHJcbiNpbmNsdWRlIDxub3JtYWxfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGxpZ2h0c19sYW1iZXJ0X3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGJ1bXBtYXBfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8c3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cclxuXHJcbnZvaWQgbWFpbigpIHtcclxuXHJcblx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XHJcblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cclxuXHJcblx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgPSBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcclxuXHR2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSA9IGVtaXNzaXZlO1xyXG5cclxuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPGFscGhhaGFzaF9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8c3BlY3VsYXJtYXBfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9iZWdpbj5cclxuXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X21hcHM+XHJcblx0I2luY2x1ZGUgPGVtaXNzaXZlbWFwX2ZyYWdtZW50PlxyXG5cclxuXHQvLyBhY2N1bXVsYXRpb25cclxuXHQjaW5jbHVkZSA8bGlnaHRzX2xhbWJlcnRfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9iZWdpbj5cclxuXHQjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X21hcHM+XHJcblx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9lbmQ+XHJcblxyXG5cdC8vIG1vZHVsYXRpb25cclxuXHQjaW5jbHVkZSA8YW9tYXBfZnJhZ21lbnQ+XHJcblxyXG5cdHZlYzMgb3V0Z29pbmdMaWdodCA9IHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7XHJcblxyXG5cdCNpbmNsdWRlIDxlbnZtYXBfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPG9wYXF1ZV9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPGNvbG9yc3BhY2VfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50PlxyXG5cclxufVxyXG5gO1xyXG4iLCJleHBvcnQgY29uc3QgdmVydGV4ID0gLyogZ2xzbCAqL2BcclxuI2RlZmluZSBNQVRDQVBcclxuXHJcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xyXG5cclxuI2luY2x1ZGUgPGNvbW1vbj5cclxuI2luY2x1ZGUgPGJhdGNoaW5nX3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPG5vcm1hbF9wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XHJcblxyXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XHJcblxyXG52b2lkIG1haW4oKSB7XHJcblxyXG5cdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8bW9ycGhpbnN0YW5jZV92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPG1vcnBoY29sb3JfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxiYXRjaGluZ192ZXJ0ZXg+XHJcblxyXG5cdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPG5vcm1hbF92ZXJ0ZXg+XHJcblxyXG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cclxuXHJcblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cclxuXHJcblx0dlZpZXdQb3NpdGlvbiA9IC0gbXZQb3NpdGlvbi54eXo7XHJcblxyXG59XHJcbmA7XHJcblxyXG5leHBvcnQgY29uc3QgZnJhZ21lbnQgPSAvKiBnbHNsICovYFxyXG4jZGVmaW5lIE1BVENBUFxyXG5cclxudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XHJcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcclxudW5pZm9ybSBzYW1wbGVyMkQgbWF0Y2FwO1xyXG5cclxudmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XHJcblxyXG4jaW5jbHVkZSA8Y29tbW9uPlxyXG4jaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGFscGhhdGVzdF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8YWxwaGFoYXNoX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPG5vcm1hbF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8YnVtcG1hcF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8bm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XHJcblxyXG52b2lkIG1haW4oKSB7XHJcblxyXG5cdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xyXG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XHJcblxyXG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8YWxwaGFoYXNoX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfYmVnaW4+XHJcblx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9tYXBzPlxyXG5cclxuXHR2ZWMzIHZpZXdEaXIgPSBub3JtYWxpemUoIHZWaWV3UG9zaXRpb24gKTtcclxuXHR2ZWMzIHggPSBub3JtYWxpemUoIHZlYzMoIHZpZXdEaXIueiwgMC4wLCAtIHZpZXdEaXIueCApICk7XHJcblx0dmVjMyB5ID0gY3Jvc3MoIHZpZXdEaXIsIHggKTtcclxuXHR2ZWMyIHV2ID0gdmVjMiggZG90KCB4LCBub3JtYWwgKSwgZG90KCB5LCBub3JtYWwgKSApICogMC40OTUgKyAwLjU7IC8vIDAuNDk1IHRvIHJlbW92ZSBhcnRpZmFjdHMgY2F1c2VkIGJ5IHVuZGVyc2l6ZWQgbWF0Y2FwIGRpc2tzXHJcblxyXG5cdCNpZmRlZiBVU0VfTUFUQ0FQXHJcblxyXG5cdFx0dmVjNCBtYXRjYXBDb2xvciA9IHRleHR1cmUyRCggbWF0Y2FwLCB1diApO1xyXG5cclxuXHQjZWxzZVxyXG5cclxuXHRcdHZlYzQgbWF0Y2FwQ29sb3IgPSB2ZWM0KCB2ZWMzKCBtaXgoIDAuMiwgMC44LCB1di55ICkgKSwgMS4wICk7IC8vIGRlZmF1bHQgaWYgbWF0Y2FwIGlzIG1pc3NpbmdcclxuXHJcblx0I2VuZGlmXHJcblxyXG5cdHZlYzMgb3V0Z29pbmdMaWdodCA9IGRpZmZ1c2VDb2xvci5yZ2IgKiBtYXRjYXBDb2xvci5yZ2I7XHJcblxyXG5cdCNpbmNsdWRlIDxvcGFxdWVfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxjb2xvcnNwYWNlX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD5cclxuXHJcbn1cclxuYDtcclxuIiwiZXhwb3J0IGNvbnN0IHZlcnRleCA9IC8qIGdsc2wgKi9gXHJcbiNkZWZpbmUgTk9STUFMXHJcblxyXG4jaWYgZGVmaW5lZCggRkxBVF9TSEFERUQgKSB8fCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVBfVEFOR0VOVFNQQUNFIClcclxuXHJcblx0dmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XHJcblxyXG4jZW5kaWZcclxuXHJcbiNpbmNsdWRlIDxjb21tb24+XHJcbiNpbmNsdWRlIDxiYXRjaGluZ19wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8bm9ybWFsX3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PlxyXG5cclxudm9pZCBtYWluKCkge1xyXG5cclxuXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxiYXRjaGluZ192ZXJ0ZXg+XHJcblxyXG5cdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPG1vcnBoaW5zdGFuY2VfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxub3JtYWxfdmVydGV4PlxyXG5cclxuXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cclxuXHJcbiNpZiBkZWZpbmVkKCBGTEFUX1NIQURFRCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUF9UQU5HRU5UU1BBQ0UgKVxyXG5cclxuXHR2Vmlld1Bvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejtcclxuXHJcbiNlbmRpZlxyXG5cclxufVxyXG5gO1xyXG5cclxuZXhwb3J0IGNvbnN0IGZyYWdtZW50ID0gLyogZ2xzbCAqL2BcclxuI2RlZmluZSBOT1JNQUxcclxuXHJcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcclxuXHJcbiNpZiBkZWZpbmVkKCBGTEFUX1NIQURFRCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUF9UQU5HRU5UU1BBQ0UgKVxyXG5cclxuXHR2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcclxuXHJcbiNlbmRpZlxyXG5cclxuI2luY2x1ZGUgPHBhY2tpbmc+XHJcbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8bm9ybWFsX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxidW1wbWFwX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cclxuXHJcbnZvaWQgbWFpbigpIHtcclxuXHJcblx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCAwLjAsIDAuMCwgMC4wLCBvcGFjaXR5ICk7XHJcblxyXG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfYmVnaW4+XHJcblx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9tYXBzPlxyXG5cclxuXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBwYWNrTm9ybWFsVG9SR0IoIG5vcm1hbCApLCBkaWZmdXNlQ29sb3IuYSApO1xyXG5cclxuXHQjaWZkZWYgT1BBUVVFXHJcblxyXG5cdFx0Z2xfRnJhZ0NvbG9yLmEgPSAxLjA7XHJcblxyXG5cdCNlbmRpZlxyXG5cclxufVxyXG5gO1xyXG4iLCJleHBvcnQgY29uc3QgdmVydGV4ID0gLyogZ2xzbCAqL2BcclxuI2RlZmluZSBQSE9OR1xyXG5cclxudmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XHJcblxyXG4jaW5jbHVkZSA8Y29tbW9uPlxyXG4jaW5jbHVkZSA8YmF0Y2hpbmdfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8bm9ybWFsX3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PlxyXG5cclxudm9pZCBtYWluKCkge1xyXG5cclxuXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPG1vcnBoY29sb3JfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxiYXRjaGluZ192ZXJ0ZXg+XHJcblxyXG5cdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPG1vcnBoaW5zdGFuY2VfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxub3JtYWxfdmVydGV4PlxyXG5cclxuXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cclxuXHJcblx0dlZpZXdQb3NpdGlvbiA9IC0gbXZQb3NpdGlvbi54eXo7XHJcblxyXG5cdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPGVudm1hcF92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XHJcblxyXG59XHJcbmA7XHJcblxyXG5leHBvcnQgY29uc3QgZnJhZ21lbnQgPSAvKiBnbHNsICovYFxyXG4jZGVmaW5lIFBIT05HXHJcblxyXG51bmlmb3JtIHZlYzMgZGlmZnVzZTtcclxudW5pZm9ybSB2ZWMzIGVtaXNzaXZlO1xyXG51bmlmb3JtIHZlYzMgc3BlY3VsYXI7XHJcbnVuaWZvcm0gZmxvYXQgc2hpbmluZXNzO1xyXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XHJcblxyXG4jaW5jbHVkZSA8Y29tbW9uPlxyXG4jaW5jbHVkZSA8cGFja2luZz5cclxuI2luY2x1ZGUgPGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxhbHBoYXRlc3RfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGFscGhhaGFzaF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8ZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGJzZGZzPlxyXG4jaW5jbHVkZSA8bGlnaHRzX3BhcnNfYmVnaW4+XHJcbiNpbmNsdWRlIDxub3JtYWxfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGxpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxidW1wbWFwX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XHJcblxyXG52b2lkIG1haW4oKSB7XHJcblxyXG5cdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xyXG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XHJcblxyXG5cdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ID0gUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XHJcblx0dmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgPSBlbWlzc2l2ZTtcclxuXHJcblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxhbHBoYWhhc2hfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPHNwZWN1bGFybWFwX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfYmVnaW4+XHJcblx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9tYXBzPlxyXG5cdCNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9mcmFnbWVudD5cclxuXHJcblx0Ly8gYWNjdW11bGF0aW9uXHJcblx0I2luY2x1ZGUgPGxpZ2h0c19waG9uZ19mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2JlZ2luPlxyXG5cdCNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfbWFwcz5cclxuXHQjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2VuZD5cclxuXHJcblx0Ly8gbW9kdWxhdGlvblxyXG5cdCNpbmNsdWRlIDxhb21hcF9mcmFnbWVudD5cclxuXHJcblx0dmVjMyBvdXRnb2luZ0xpZ2h0ID0gcmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciArIHRvdGFsRW1pc3NpdmVSYWRpYW5jZTtcclxuXHJcblx0I2luY2x1ZGUgPGVudm1hcF9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8b3BhcXVlX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8Y29sb3JzcGFjZV9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+XHJcblxyXG59XHJcbmA7XHJcbiIsImV4cG9ydCBjb25zdCB2ZXJ0ZXggPSAvKiBnbHNsICovYFxyXG4jZGVmaW5lIFNUQU5EQVJEXHJcblxyXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcclxuXHJcbiNpZmRlZiBVU0VfVFJBTlNNSVNTSU9OXHJcblxyXG5cdHZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcclxuXHJcbiNlbmRpZlxyXG5cclxuI2luY2x1ZGUgPGNvbW1vbj5cclxuI2luY2x1ZGUgPGJhdGNoaW5nX3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPG5vcm1hbF9wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cclxuXHJcbnZvaWQgbWFpbigpIHtcclxuXHJcblx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxtb3JwaGluc3RhbmNlX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8bW9ycGhjb2xvcl92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPGJhdGNoaW5nX3ZlcnRleD5cclxuXHJcblx0I2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8bm9ybWFsX3ZlcnRleD5cclxuXHJcblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XHJcblxyXG5cdHZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6O1xyXG5cclxuXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxzaGFkb3dtYXBfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxmb2dfdmVydGV4PlxyXG5cclxuI2lmZGVmIFVTRV9UUkFOU01JU1NJT05cclxuXHJcblx0dldvcmxkUG9zaXRpb24gPSB3b3JsZFBvc2l0aW9uLnh5ejtcclxuXHJcbiNlbmRpZlxyXG59XHJcbmA7XHJcblxyXG5leHBvcnQgY29uc3QgZnJhZ21lbnQgPSAvKiBnbHNsICovYFxyXG4jZGVmaW5lIFNUQU5EQVJEXHJcblxyXG4jaWZkZWYgUEhZU0lDQUxcclxuXHQjZGVmaW5lIElPUlxyXG5cdCNkZWZpbmUgVVNFX1NQRUNVTEFSXHJcbiNlbmRpZlxyXG5cclxudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XHJcbnVuaWZvcm0gdmVjMyBlbWlzc2l2ZTtcclxudW5pZm9ybSBmbG9hdCByb3VnaG5lc3M7XHJcbnVuaWZvcm0gZmxvYXQgbWV0YWxuZXNzO1xyXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XHJcblxyXG4jaWZkZWYgSU9SXHJcblx0dW5pZm9ybSBmbG9hdCBpb3I7XHJcbiNlbmRpZlxyXG5cclxuI2lmZGVmIFVTRV9TUEVDVUxBUlxyXG5cdHVuaWZvcm0gZmxvYXQgc3BlY3VsYXJJbnRlbnNpdHk7XHJcblx0dW5pZm9ybSB2ZWMzIHNwZWN1bGFyQ29sb3I7XHJcblxyXG5cdCNpZmRlZiBVU0VfU1BFQ1VMQVJfQ09MT1JNQVBcclxuXHRcdHVuaWZvcm0gc2FtcGxlcjJEIHNwZWN1bGFyQ29sb3JNYXA7XHJcblx0I2VuZGlmXHJcblxyXG5cdCNpZmRlZiBVU0VfU1BFQ1VMQVJfSU5URU5TSVRZTUFQXHJcblx0XHR1bmlmb3JtIHNhbXBsZXIyRCBzcGVjdWxhckludGVuc2l0eU1hcDtcclxuXHQjZW5kaWZcclxuI2VuZGlmXHJcblxyXG4jaWZkZWYgVVNFX0NMRUFSQ09BVFxyXG5cdHVuaWZvcm0gZmxvYXQgY2xlYXJjb2F0O1xyXG5cdHVuaWZvcm0gZmxvYXQgY2xlYXJjb2F0Um91Z2huZXNzO1xyXG4jZW5kaWZcclxuXHJcbiNpZmRlZiBVU0VfRElTUEVSU0lPTlxyXG5cdHVuaWZvcm0gZmxvYXQgZGlzcGVyc2lvbjtcclxuI2VuZGlmXHJcblxyXG4jaWZkZWYgVVNFX0lSSURFU0NFTkNFXHJcblx0dW5pZm9ybSBmbG9hdCBpcmlkZXNjZW5jZTtcclxuXHR1bmlmb3JtIGZsb2F0IGlyaWRlc2NlbmNlSU9SO1xyXG5cdHVuaWZvcm0gZmxvYXQgaXJpZGVzY2VuY2VUaGlja25lc3NNaW5pbXVtO1xyXG5cdHVuaWZvcm0gZmxvYXQgaXJpZGVzY2VuY2VUaGlja25lc3NNYXhpbXVtO1xyXG4jZW5kaWZcclxuXHJcbiNpZmRlZiBVU0VfU0hFRU5cclxuXHR1bmlmb3JtIHZlYzMgc2hlZW5Db2xvcjtcclxuXHR1bmlmb3JtIGZsb2F0IHNoZWVuUm91Z2huZXNzO1xyXG5cclxuXHQjaWZkZWYgVVNFX1NIRUVOX0NPTE9STUFQXHJcblx0XHR1bmlmb3JtIHNhbXBsZXIyRCBzaGVlbkNvbG9yTWFwO1xyXG5cdCNlbmRpZlxyXG5cclxuXHQjaWZkZWYgVVNFX1NIRUVOX1JPVUdITkVTU01BUFxyXG5cdFx0dW5pZm9ybSBzYW1wbGVyMkQgc2hlZW5Sb3VnaG5lc3NNYXA7XHJcblx0I2VuZGlmXHJcbiNlbmRpZlxyXG5cclxuI2lmZGVmIFVTRV9BTklTT1RST1BZXHJcblx0dW5pZm9ybSB2ZWMyIGFuaXNvdHJvcHlWZWN0b3I7XHJcblxyXG5cdCNpZmRlZiBVU0VfQU5JU09UUk9QWU1BUFxyXG5cdFx0dW5pZm9ybSBzYW1wbGVyMkQgYW5pc290cm9weU1hcDtcclxuXHQjZW5kaWZcclxuI2VuZGlmXHJcblxyXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcclxuXHJcbiNpbmNsdWRlIDxjb21tb24+XHJcbiNpbmNsdWRlIDxwYWNraW5nPlxyXG4jaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGFscGhhdGVzdF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8YWxwaGFoYXNoX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxhb21hcF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxpcmlkZXNjZW5jZV9mcmFnbWVudD5cclxuI2luY2x1ZGUgPGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudD5cclxuI2luY2x1ZGUgPGVudm1hcF9jb21tb25fcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGVudm1hcF9waHlzaWNhbF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxsaWdodHNfcGFyc19iZWdpbj5cclxuI2luY2x1ZGUgPG5vcm1hbF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8bGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDx0cmFuc21pc3Npb25fcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8YnVtcG1hcF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8bm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxjbGVhcmNvYXRfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGlyaWRlc2NlbmNlX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxyb3VnaG5lc3NtYXBfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPG1ldGFsbmVzc21hcF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxyXG5cclxudm9pZCBtYWluKCkge1xyXG5cclxuXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcclxuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxyXG5cclxuXHRSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCA9IFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApO1xyXG5cdHZlYzMgdG90YWxFbWlzc2l2ZVJhZGlhbmNlID0gZW1pc3NpdmU7XHJcblxyXG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8YWxwaGFoYXNoX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxyb3VnaG5lc3NtYXBfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPG1ldGFsbmVzc21hcF9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X2JlZ2luPlxyXG5cdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfbWFwcz5cclxuXHQjaW5jbHVkZSA8Y2xlYXJjb2F0X25vcm1hbF9mcmFnbWVudF9iZWdpbj5cclxuXHQjaW5jbHVkZSA8Y2xlYXJjb2F0X25vcm1hbF9mcmFnbWVudF9tYXBzPlxyXG5cdCNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9mcmFnbWVudD5cclxuXHJcblx0Ly8gYWNjdW11bGF0aW9uXHJcblx0I2luY2x1ZGUgPGxpZ2h0c19waHlzaWNhbF9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2JlZ2luPlxyXG5cdCNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfbWFwcz5cclxuXHQjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2VuZD5cclxuXHJcblx0Ly8gbW9kdWxhdGlvblxyXG5cdCNpbmNsdWRlIDxhb21hcF9mcmFnbWVudD5cclxuXHJcblx0dmVjMyB0b3RhbERpZmZ1c2UgPSByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlO1xyXG5cdHZlYzMgdG90YWxTcGVjdWxhciA9IHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhcjtcclxuXHJcblx0I2luY2x1ZGUgPHRyYW5zbWlzc2lvbl9mcmFnbWVudD5cclxuXHJcblx0dmVjMyBvdXRnb2luZ0xpZ2h0ID0gdG90YWxEaWZmdXNlICsgdG90YWxTcGVjdWxhciArIHRvdGFsRW1pc3NpdmVSYWRpYW5jZTtcclxuXHJcblx0I2lmZGVmIFVTRV9TSEVFTlxyXG5cclxuXHRcdC8vIFNoZWVuIGVuZXJneSBjb21wZW5zYXRpb24gYXBwcm94aW1hdGlvbiBjYWxjdWxhdGlvbiBjYW4gYmUgZm91bmQgYXQgdGhlIGVuZCBvZlxyXG5cdFx0Ly8gaHR0cHM6Ly9kcml2ZS5nb29nbGUuY29tL2ZpbGUvZC8xVDBEMVZTeVI0QWxscUlKVFFBcmFFSXpqbGI1aDRGS0gvdmlldz91c3A9c2hhcmluZ1xyXG5cdFx0ZmxvYXQgc2hlZW5FbmVyZ3lDb21wID0gMS4wIC0gMC4xNTcgKiBtYXgzKCBtYXRlcmlhbC5zaGVlbkNvbG9yICk7XHJcblxyXG5cdFx0b3V0Z29pbmdMaWdodCA9IG91dGdvaW5nTGlnaHQgKiBzaGVlbkVuZXJneUNvbXAgKyBzaGVlblNwZWN1bGFyRGlyZWN0ICsgc2hlZW5TcGVjdWxhckluZGlyZWN0O1xyXG5cclxuXHQjZW5kaWZcclxuXHJcblx0I2lmZGVmIFVTRV9DTEVBUkNPQVRcclxuXHJcblx0XHRmbG9hdCBkb3ROVmNjID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIGdlb21ldHJ5Vmlld0RpciApICk7XHJcblxyXG5cdFx0dmVjMyBGY2MgPSBGX1NjaGxpY2soIG1hdGVyaWFsLmNsZWFyY29hdEYwLCBtYXRlcmlhbC5jbGVhcmNvYXRGOTAsIGRvdE5WY2MgKTtcclxuXHJcblx0XHRvdXRnb2luZ0xpZ2h0ID0gb3V0Z29pbmdMaWdodCAqICggMS4wIC0gbWF0ZXJpYWwuY2xlYXJjb2F0ICogRmNjICkgKyAoIGNsZWFyY29hdFNwZWN1bGFyRGlyZWN0ICsgY2xlYXJjb2F0U3BlY3VsYXJJbmRpcmVjdCApICogbWF0ZXJpYWwuY2xlYXJjb2F0O1xyXG5cclxuXHQjZW5kaWZcclxuXHJcblx0I2luY2x1ZGUgPG9wYXF1ZV9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPGNvbG9yc3BhY2VfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50PlxyXG5cclxufVxyXG5gO1xyXG4iLCJleHBvcnQgY29uc3QgdmVydGV4ID0gLyogZ2xzbCAqL2BcclxuI2RlZmluZSBUT09OXHJcblxyXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcclxuXHJcbiNpbmNsdWRlIDxjb21tb24+XHJcbiNpbmNsdWRlIDxiYXRjaGluZ19wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxub3JtYWxfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XHJcblxyXG52b2lkIG1haW4oKSB7XHJcblxyXG5cdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8bW9ycGhpbnN0YW5jZV92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPG1vcnBoY29sb3JfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxiYXRjaGluZ192ZXJ0ZXg+XHJcblxyXG5cdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPG5vcm1hbF92ZXJ0ZXg+XHJcblxyXG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxyXG5cclxuXHR2Vmlld1Bvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejtcclxuXHJcblx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8c2hhZG93bWFwX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cclxuXHJcbn1cclxuYDtcclxuXHJcbmV4cG9ydCBjb25zdCBmcmFnbWVudCA9IC8qIGdsc2wgKi9gXHJcbiNkZWZpbmUgVE9PTlxyXG5cclxudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XHJcbnVuaWZvcm0gdmVjMyBlbWlzc2l2ZTtcclxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xyXG5cclxuI2luY2x1ZGUgPGNvbW1vbj5cclxuI2luY2x1ZGUgPHBhY2tpbmc+XHJcbiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8YWxwaGF0ZXN0X3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxhbHBoYWhhc2hfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGFvbWFwX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxsaWdodG1hcF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGdyYWRpZW50bWFwX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGJzZGZzPlxyXG4jaW5jbHVkZSA8bGlnaHRzX3BhcnNfYmVnaW4+XHJcbiNpbmNsdWRlIDxub3JtYWxfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGxpZ2h0c190b29uX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGJ1bXBtYXBfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxyXG5cclxudm9pZCBtYWluKCkge1xyXG5cclxuXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcclxuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxyXG5cclxuXHRSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCA9IFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApO1xyXG5cdHZlYzMgdG90YWxFbWlzc2l2ZVJhZGlhbmNlID0gZW1pc3NpdmU7XHJcblxyXG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8YWxwaGFoYXNoX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfYmVnaW4+XHJcblx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9tYXBzPlxyXG5cdCNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9mcmFnbWVudD5cclxuXHJcblx0Ly8gYWNjdW11bGF0aW9uXHJcblx0I2luY2x1ZGUgPGxpZ2h0c190b29uX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfYmVnaW4+XHJcblx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9tYXBzPlxyXG5cdCNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfZW5kPlxyXG5cclxuXHQvLyBtb2R1bGF0aW9uXHJcblx0I2luY2x1ZGUgPGFvbWFwX2ZyYWdtZW50PlxyXG5cclxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlO1xyXG5cclxuXHQjaW5jbHVkZSA8b3BhcXVlX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8Y29sb3JzcGFjZV9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+XHJcblxyXG59XHJcbmA7XHJcbiIsImV4cG9ydCBjb25zdCB2ZXJ0ZXggPSAvKiBnbHNsICovYFxyXG51bmlmb3JtIGZsb2F0IHNpemU7XHJcbnVuaWZvcm0gZmxvYXQgc2NhbGU7XHJcblxyXG4jaW5jbHVkZSA8Y29tbW9uPlxyXG4jaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PlxyXG5cclxuI2lmZGVmIFVTRV9QT0lOVFNfVVZcclxuXHJcblx0dmFyeWluZyB2ZWMyIHZVdjtcclxuXHR1bmlmb3JtIG1hdDMgdXZUcmFuc2Zvcm07XHJcblxyXG4jZW5kaWZcclxuXHJcbnZvaWQgbWFpbigpIHtcclxuXHJcblx0I2lmZGVmIFVTRV9QT0lOVFNfVVZcclxuXHJcblx0XHR2VXYgPSAoIHV2VHJhbnNmb3JtICogdmVjMyggdXYsIDEgKSApLnh5O1xyXG5cclxuXHQjZW5kaWZcclxuXHJcblx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8bW9ycGhpbnN0YW5jZV92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPG1vcnBoY29sb3JfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XHJcblxyXG5cdGdsX1BvaW50U2l6ZSA9IHNpemU7XHJcblxyXG5cdCNpZmRlZiBVU0VfU0laRUFUVEVOVUFUSU9OXHJcblxyXG5cdFx0Ym9vbCBpc1BlcnNwZWN0aXZlID0gaXNQZXJzcGVjdGl2ZU1hdHJpeCggcHJvamVjdGlvbk1hdHJpeCApO1xyXG5cclxuXHRcdGlmICggaXNQZXJzcGVjdGl2ZSApIGdsX1BvaW50U2l6ZSAqPSAoIHNjYWxlIC8gLSBtdlBvc2l0aW9uLnogKTtcclxuXHJcblx0I2VuZGlmXHJcblxyXG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cclxuXHJcbn1cclxuYDtcclxuXHJcbmV4cG9ydCBjb25zdCBmcmFnbWVudCA9IC8qIGdsc2wgKi9gXHJcbnVuaWZvcm0gdmVjMyBkaWZmdXNlO1xyXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XHJcblxyXG4jaW5jbHVkZSA8Y29tbW9uPlxyXG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPG1hcF9wYXJ0aWNsZV9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8YWxwaGF0ZXN0X3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxhbHBoYWhhc2hfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxyXG5cclxudm9pZCBtYWluKCkge1xyXG5cclxuXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcclxuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxyXG5cclxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSB2ZWMzKCAwLjAgKTtcclxuXHJcblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxtYXBfcGFydGljbGVfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPGFscGhhaGFzaF9mcmFnbWVudD5cclxuXHJcblx0b3V0Z29pbmdMaWdodCA9IGRpZmZ1c2VDb2xvci5yZ2I7XHJcblxyXG5cdCNpbmNsdWRlIDxvcGFxdWVfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxjb2xvcnNwYWNlX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XHJcblxyXG59XHJcbmA7XHJcbiIsImV4cG9ydCBjb25zdCB2ZXJ0ZXggPSAvKiBnbHNsICovYFxyXG4jaW5jbHVkZSA8Y29tbW9uPlxyXG4jaW5jbHVkZSA8YmF0Y2hpbmdfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XHJcbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+XHJcblxyXG52b2lkIG1haW4oKSB7XHJcblxyXG5cdCNpbmNsdWRlIDxiYXRjaGluZ192ZXJ0ZXg+XHJcblxyXG5cdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPG1vcnBoaW5zdGFuY2VfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxyXG5cclxuXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XHJcblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cclxuXHJcblx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8c2hhZG93bWFwX3ZlcnRleD5cclxuXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cclxuXHJcbn1cclxuYDtcclxuXHJcbmV4cG9ydCBjb25zdCBmcmFnbWVudCA9IC8qIGdsc2wgKi9gXHJcbnVuaWZvcm0gdmVjMyBjb2xvcjtcclxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xyXG5cclxuI2luY2x1ZGUgPGNvbW1vbj5cclxuI2luY2x1ZGUgPHBhY2tpbmc+XHJcbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGJzZGZzPlxyXG4jaW5jbHVkZSA8bGlnaHRzX3BhcnNfYmVnaW4+XHJcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQ+XHJcblxyXG52b2lkIG1haW4oKSB7XHJcblxyXG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cclxuXHJcblx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggY29sb3IsIG9wYWNpdHkgKiAoIDEuMCAtIGdldFNoYWRvd01hc2soKSApICk7XHJcblxyXG5cdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8Y29sb3JzcGFjZV9mcmFnbWVudD5cclxuXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PlxyXG5cclxufVxyXG5gO1xyXG4iLCJleHBvcnQgY29uc3QgdmVydGV4ID0gLyogZ2xzbCAqL2BcclxudW5pZm9ybSBmbG9hdCByb3RhdGlvbjtcclxudW5pZm9ybSB2ZWMyIGNlbnRlcjtcclxuXHJcbiNpbmNsdWRlIDxjb21tb24+XHJcbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cclxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxyXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PlxyXG5cclxudm9pZCBtYWluKCkge1xyXG5cclxuXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxyXG5cclxuXHR2ZWM0IG12UG9zaXRpb24gPSBtb2RlbFZpZXdNYXRyaXhbIDMgXTtcclxuXHJcblx0dmVjMiBzY2FsZSA9IHZlYzIoIGxlbmd0aCggbW9kZWxNYXRyaXhbIDAgXS54eXogKSwgbGVuZ3RoKCBtb2RlbE1hdHJpeFsgMSBdLnh5eiApICk7XHJcblxyXG5cdCNpZm5kZWYgVVNFX1NJWkVBVFRFTlVBVElPTlxyXG5cclxuXHRcdGJvb2wgaXNQZXJzcGVjdGl2ZSA9IGlzUGVyc3BlY3RpdmVNYXRyaXgoIHByb2plY3Rpb25NYXRyaXggKTtcclxuXHJcblx0XHRpZiAoIGlzUGVyc3BlY3RpdmUgKSBzY2FsZSAqPSAtIG12UG9zaXRpb24uejtcclxuXHJcblx0I2VuZGlmXHJcblxyXG5cdHZlYzIgYWxpZ25lZFBvc2l0aW9uID0gKCBwb3NpdGlvbi54eSAtICggY2VudGVyIC0gdmVjMiggMC41ICkgKSApICogc2NhbGU7XHJcblxyXG5cdHZlYzIgcm90YXRlZFBvc2l0aW9uO1xyXG5cdHJvdGF0ZWRQb3NpdGlvbi54ID0gY29zKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnggLSBzaW4oIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueTtcclxuXHRyb3RhdGVkUG9zaXRpb24ueSA9IHNpbiggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi54ICsgY29zKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnk7XHJcblxyXG5cdG12UG9zaXRpb24ueHkgKz0gcm90YXRlZFBvc2l0aW9uO1xyXG5cclxuXHRnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtdlBvc2l0aW9uO1xyXG5cclxuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxyXG5cdCNpbmNsdWRlIDxmb2dfdmVydGV4PlxyXG5cclxufVxyXG5gO1xyXG5cclxuZXhwb3J0IGNvbnN0IGZyYWdtZW50ID0gLyogZ2xzbCAqL2BcclxudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XHJcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcclxuXHJcbiNpbmNsdWRlIDxjb21tb24+XHJcbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8YWxwaGF0ZXN0X3BhcnNfZnJhZ21lbnQ+XHJcbiNpbmNsdWRlIDxhbHBoYWhhc2hfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxyXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cclxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxyXG5cclxudm9pZCBtYWluKCkge1xyXG5cclxuXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcclxuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxyXG5cclxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSB2ZWMzKCAwLjAgKTtcclxuXHJcblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPGFscGhhaGFzaF9mcmFnbWVudD5cclxuXHJcblx0b3V0Z29pbmdMaWdodCA9IGRpZmZ1c2VDb2xvci5yZ2I7XHJcblxyXG5cdCNpbmNsdWRlIDxvcGFxdWVfZnJhZ21lbnQ+XHJcblx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxjb2xvcnNwYWNlX2ZyYWdtZW50PlxyXG5cdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XHJcblxyXG59XHJcbmA7XHJcbiIsImltcG9ydCBhbHBoYWhhc2hfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9hbHBoYWhhc2hfZnJhZ21lbnQuZ2xzbC5qcyc7XHJcbmltcG9ydCBhbHBoYWhhc2hfcGFyc19mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL2FscGhhaGFzaF9wYXJzX2ZyYWdtZW50Lmdsc2wuanMnO1xyXG5pbXBvcnQgYWxwaGFtYXBfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9hbHBoYW1hcF9mcmFnbWVudC5nbHNsLmpzJztcclxuaW1wb3J0IGFscGhhbWFwX3BhcnNfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9hbHBoYW1hcF9wYXJzX2ZyYWdtZW50Lmdsc2wuanMnO1xyXG5pbXBvcnQgYWxwaGF0ZXN0X2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvYWxwaGF0ZXN0X2ZyYWdtZW50Lmdsc2wuanMnO1xyXG5pbXBvcnQgYWxwaGF0ZXN0X3BhcnNfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9hbHBoYXRlc3RfcGFyc19mcmFnbWVudC5nbHNsLmpzJztcclxuaW1wb3J0IGFvbWFwX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvYW9tYXBfZnJhZ21lbnQuZ2xzbC5qcyc7XHJcbmltcG9ydCBhb21hcF9wYXJzX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvYW9tYXBfcGFyc19mcmFnbWVudC5nbHNsLmpzJztcclxuaW1wb3J0IGJhdGNoaW5nX3BhcnNfdmVydGV4IGZyb20gJy4vU2hhZGVyQ2h1bmsvYmF0Y2hpbmdfcGFyc192ZXJ0ZXguZ2xzbC5qcyc7XHJcbmltcG9ydCBiYXRjaGluZ192ZXJ0ZXggZnJvbSAnLi9TaGFkZXJDaHVuay9iYXRjaGluZ192ZXJ0ZXguZ2xzbC5qcyc7XHJcbmltcG9ydCBiZWdpbl92ZXJ0ZXggZnJvbSAnLi9TaGFkZXJDaHVuay9iZWdpbl92ZXJ0ZXguZ2xzbC5qcyc7XHJcbmltcG9ydCBiZWdpbm5vcm1hbF92ZXJ0ZXggZnJvbSAnLi9TaGFkZXJDaHVuay9iZWdpbm5vcm1hbF92ZXJ0ZXguZ2xzbC5qcyc7XHJcbmltcG9ydCBic2RmcyBmcm9tICcuL1NoYWRlckNodW5rL2JzZGZzLmdsc2wuanMnO1xyXG5pbXBvcnQgaXJpZGVzY2VuY2VfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9pcmlkZXNjZW5jZV9mcmFnbWVudC5nbHNsLmpzJztcclxuaW1wb3J0IGJ1bXBtYXBfcGFyc19mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL2J1bXBtYXBfcGFyc19mcmFnbWVudC5nbHNsLmpzJztcclxuaW1wb3J0IGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL2NsaXBwaW5nX3BsYW5lc19mcmFnbWVudC5nbHNsLmpzJztcclxuaW1wb3J0IGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQuZ2xzbC5qcyc7XHJcbmltcG9ydCBjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXggZnJvbSAnLi9TaGFkZXJDaHVuay9jbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXguZ2xzbC5qcyc7XHJcbmltcG9ydCBjbGlwcGluZ19wbGFuZXNfdmVydGV4IGZyb20gJy4vU2hhZGVyQ2h1bmsvY2xpcHBpbmdfcGxhbmVzX3ZlcnRleC5nbHNsLmpzJztcclxuaW1wb3J0IGNvbG9yX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvY29sb3JfZnJhZ21lbnQuZ2xzbC5qcyc7XHJcbmltcG9ydCBjb2xvcl9wYXJzX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvY29sb3JfcGFyc19mcmFnbWVudC5nbHNsLmpzJztcclxuaW1wb3J0IGNvbG9yX3BhcnNfdmVydGV4IGZyb20gJy4vU2hhZGVyQ2h1bmsvY29sb3JfcGFyc192ZXJ0ZXguZ2xzbC5qcyc7XHJcbmltcG9ydCBjb2xvcl92ZXJ0ZXggZnJvbSAnLi9TaGFkZXJDaHVuay9jb2xvcl92ZXJ0ZXguZ2xzbC5qcyc7XHJcbmltcG9ydCBjb21tb24gZnJvbSAnLi9TaGFkZXJDaHVuay9jb21tb24uZ2xzbC5qcyc7XHJcbmltcG9ydCBjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9jdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQuZ2xzbC5qcyc7XHJcbmltcG9ydCBkZWZhdWx0bm9ybWFsX3ZlcnRleCBmcm9tICcuL1NoYWRlckNodW5rL2RlZmF1bHRub3JtYWxfdmVydGV4Lmdsc2wuanMnO1xyXG5pbXBvcnQgZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4IGZyb20gJy4vU2hhZGVyQ2h1bmsvZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4Lmdsc2wuanMnO1xyXG5pbXBvcnQgZGlzcGxhY2VtZW50bWFwX3ZlcnRleCBmcm9tICcuL1NoYWRlckNodW5rL2Rpc3BsYWNlbWVudG1hcF92ZXJ0ZXguZ2xzbC5qcyc7XHJcbmltcG9ydCBlbWlzc2l2ZW1hcF9mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL2VtaXNzaXZlbWFwX2ZyYWdtZW50Lmdsc2wuanMnO1xyXG5pbXBvcnQgZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL2VtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQuZ2xzbC5qcyc7XHJcbmltcG9ydCBjb2xvcnNwYWNlX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvY29sb3JzcGFjZV9mcmFnbWVudC5nbHNsLmpzJztcclxuaW1wb3J0IGNvbG9yc3BhY2VfcGFyc19mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL2NvbG9yc3BhY2VfcGFyc19mcmFnbWVudC5nbHNsLmpzJztcclxuaW1wb3J0IGVudm1hcF9mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL2Vudm1hcF9mcmFnbWVudC5nbHNsLmpzJztcclxuaW1wb3J0IGVudm1hcF9jb21tb25fcGFyc19mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL2Vudm1hcF9jb21tb25fcGFyc19mcmFnbWVudC5nbHNsLmpzJztcclxuaW1wb3J0IGVudm1hcF9wYXJzX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvZW52bWFwX3BhcnNfZnJhZ21lbnQuZ2xzbC5qcyc7XHJcbmltcG9ydCBlbnZtYXBfcGFyc192ZXJ0ZXggZnJvbSAnLi9TaGFkZXJDaHVuay9lbnZtYXBfcGFyc192ZXJ0ZXguZ2xzbC5qcyc7XHJcbmltcG9ydCBlbnZtYXBfdmVydGV4IGZyb20gJy4vU2hhZGVyQ2h1bmsvZW52bWFwX3ZlcnRleC5nbHNsLmpzJztcclxuaW1wb3J0IGZvZ192ZXJ0ZXggZnJvbSAnLi9TaGFkZXJDaHVuay9mb2dfdmVydGV4Lmdsc2wuanMnO1xyXG5pbXBvcnQgZm9nX3BhcnNfdmVydGV4IGZyb20gJy4vU2hhZGVyQ2h1bmsvZm9nX3BhcnNfdmVydGV4Lmdsc2wuanMnO1xyXG5pbXBvcnQgZm9nX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvZm9nX2ZyYWdtZW50Lmdsc2wuanMnO1xyXG5pbXBvcnQgZm9nX3BhcnNfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9mb2dfcGFyc19mcmFnbWVudC5nbHNsLmpzJztcclxuaW1wb3J0IGdyYWRpZW50bWFwX3BhcnNfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9ncmFkaWVudG1hcF9wYXJzX2ZyYWdtZW50Lmdsc2wuanMnO1xyXG5pbXBvcnQgbGlnaHRtYXBfcGFyc19mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL2xpZ2h0bWFwX3BhcnNfZnJhZ21lbnQuZ2xzbC5qcyc7XHJcbmltcG9ydCBsaWdodHNfbGFtYmVydF9mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL2xpZ2h0c19sYW1iZXJ0X2ZyYWdtZW50Lmdsc2wuanMnO1xyXG5pbXBvcnQgbGlnaHRzX2xhbWJlcnRfcGFyc19mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL2xpZ2h0c19sYW1iZXJ0X3BhcnNfZnJhZ21lbnQuZ2xzbC5qcyc7XHJcbmltcG9ydCBsaWdodHNfcGFyc19iZWdpbiBmcm9tICcuL1NoYWRlckNodW5rL2xpZ2h0c19wYXJzX2JlZ2luLmdsc2wuanMnO1xyXG5pbXBvcnQgZW52bWFwX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9lbnZtYXBfcGh5c2ljYWxfcGFyc19mcmFnbWVudC5nbHNsLmpzJztcclxuaW1wb3J0IGxpZ2h0c190b29uX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvbGlnaHRzX3Rvb25fZnJhZ21lbnQuZ2xzbC5qcyc7XHJcbmltcG9ydCBsaWdodHNfdG9vbl9wYXJzX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvbGlnaHRzX3Rvb25fcGFyc19mcmFnbWVudC5nbHNsLmpzJztcclxuaW1wb3J0IGxpZ2h0c19waG9uZ19mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL2xpZ2h0c19waG9uZ19mcmFnbWVudC5nbHNsLmpzJztcclxuaW1wb3J0IGxpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvbGlnaHRzX3Bob25nX3BhcnNfZnJhZ21lbnQuZ2xzbC5qcyc7XHJcbmltcG9ydCBsaWdodHNfcGh5c2ljYWxfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9saWdodHNfcGh5c2ljYWxfZnJhZ21lbnQuZ2xzbC5qcyc7XHJcbmltcG9ydCBsaWdodHNfcGh5c2ljYWxfcGFyc19mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL2xpZ2h0c19waHlzaWNhbF9wYXJzX2ZyYWdtZW50Lmdsc2wuanMnO1xyXG5pbXBvcnQgbGlnaHRzX2ZyYWdtZW50X2JlZ2luIGZyb20gJy4vU2hhZGVyQ2h1bmsvbGlnaHRzX2ZyYWdtZW50X2JlZ2luLmdsc2wuanMnO1xyXG5pbXBvcnQgbGlnaHRzX2ZyYWdtZW50X21hcHMgZnJvbSAnLi9TaGFkZXJDaHVuay9saWdodHNfZnJhZ21lbnRfbWFwcy5nbHNsLmpzJztcclxuaW1wb3J0IGxpZ2h0c19mcmFnbWVudF9lbmQgZnJvbSAnLi9TaGFkZXJDaHVuay9saWdodHNfZnJhZ21lbnRfZW5kLmdsc2wuanMnO1xyXG5pbXBvcnQgbG9nZGVwdGhidWZfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9sb2dkZXB0aGJ1Zl9mcmFnbWVudC5nbHNsLmpzJztcclxuaW1wb3J0IGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9sb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50Lmdsc2wuanMnO1xyXG5pbXBvcnQgbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXggZnJvbSAnLi9TaGFkZXJDaHVuay9sb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleC5nbHNsLmpzJztcclxuaW1wb3J0IGxvZ2RlcHRoYnVmX3ZlcnRleCBmcm9tICcuL1NoYWRlckNodW5rL2xvZ2RlcHRoYnVmX3ZlcnRleC5nbHNsLmpzJztcclxuaW1wb3J0IG1hcF9mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL21hcF9mcmFnbWVudC5nbHNsLmpzJztcclxuaW1wb3J0IG1hcF9wYXJzX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvbWFwX3BhcnNfZnJhZ21lbnQuZ2xzbC5qcyc7XHJcbmltcG9ydCBtYXBfcGFydGljbGVfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9tYXBfcGFydGljbGVfZnJhZ21lbnQuZ2xzbC5qcyc7XHJcbmltcG9ydCBtYXBfcGFydGljbGVfcGFyc19mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL21hcF9wYXJ0aWNsZV9wYXJzX2ZyYWdtZW50Lmdsc2wuanMnO1xyXG5pbXBvcnQgbWV0YWxuZXNzbWFwX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvbWV0YWxuZXNzbWFwX2ZyYWdtZW50Lmdsc2wuanMnO1xyXG5pbXBvcnQgbWV0YWxuZXNzbWFwX3BhcnNfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9tZXRhbG5lc3NtYXBfcGFyc19mcmFnbWVudC5nbHNsLmpzJztcclxuaW1wb3J0IG1vcnBoaW5zdGFuY2VfdmVydGV4IGZyb20gJy4vU2hhZGVyQ2h1bmsvbW9ycGhpbnN0YW5jZV92ZXJ0ZXguZ2xzbC5qcyc7XHJcbmltcG9ydCBtb3JwaGNvbG9yX3ZlcnRleCBmcm9tICcuL1NoYWRlckNodW5rL21vcnBoY29sb3JfdmVydGV4Lmdsc2wuanMnO1xyXG5pbXBvcnQgbW9ycGhub3JtYWxfdmVydGV4IGZyb20gJy4vU2hhZGVyQ2h1bmsvbW9ycGhub3JtYWxfdmVydGV4Lmdsc2wuanMnO1xyXG5pbXBvcnQgbW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXggZnJvbSAnLi9TaGFkZXJDaHVuay9tb3JwaHRhcmdldF9wYXJzX3ZlcnRleC5nbHNsLmpzJztcclxuaW1wb3J0IG1vcnBodGFyZ2V0X3ZlcnRleCBmcm9tICcuL1NoYWRlckNodW5rL21vcnBodGFyZ2V0X3ZlcnRleC5nbHNsLmpzJztcclxuaW1wb3J0IG5vcm1hbF9mcmFnbWVudF9iZWdpbiBmcm9tICcuL1NoYWRlckNodW5rL25vcm1hbF9mcmFnbWVudF9iZWdpbi5nbHNsLmpzJztcclxuaW1wb3J0IG5vcm1hbF9mcmFnbWVudF9tYXBzIGZyb20gJy4vU2hhZGVyQ2h1bmsvbm9ybWFsX2ZyYWdtZW50X21hcHMuZ2xzbC5qcyc7XHJcbmltcG9ydCBub3JtYWxfcGFyc19mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL25vcm1hbF9wYXJzX2ZyYWdtZW50Lmdsc2wuanMnO1xyXG5pbXBvcnQgbm9ybWFsX3BhcnNfdmVydGV4IGZyb20gJy4vU2hhZGVyQ2h1bmsvbm9ybWFsX3BhcnNfdmVydGV4Lmdsc2wuanMnO1xyXG5pbXBvcnQgbm9ybWFsX3ZlcnRleCBmcm9tICcuL1NoYWRlckNodW5rL25vcm1hbF92ZXJ0ZXguZ2xzbC5qcyc7XHJcbmltcG9ydCBub3JtYWxtYXBfcGFyc19mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL25vcm1hbG1hcF9wYXJzX2ZyYWdtZW50Lmdsc2wuanMnO1xyXG5pbXBvcnQgY2xlYXJjb2F0X25vcm1hbF9mcmFnbWVudF9iZWdpbiBmcm9tICcuL1NoYWRlckNodW5rL2NsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfYmVnaW4uZ2xzbC5qcyc7XHJcbmltcG9ydCBjbGVhcmNvYXRfbm9ybWFsX2ZyYWdtZW50X21hcHMgZnJvbSAnLi9TaGFkZXJDaHVuay9jbGVhcmNvYXRfbm9ybWFsX2ZyYWdtZW50X21hcHMuZ2xzbC5qcyc7XHJcbmltcG9ydCBjbGVhcmNvYXRfcGFyc19mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL2NsZWFyY29hdF9wYXJzX2ZyYWdtZW50Lmdsc2wuanMnO1xyXG5pbXBvcnQgaXJpZGVzY2VuY2VfcGFyc19mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL2lyaWRlc2NlbmNlX3BhcnNfZnJhZ21lbnQuZ2xzbC5qcyc7XHJcbmltcG9ydCBvcGFxdWVfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9vcGFxdWVfZnJhZ21lbnQuZ2xzbC5qcyc7XHJcbmltcG9ydCBwYWNraW5nIGZyb20gJy4vU2hhZGVyQ2h1bmsvcGFja2luZy5nbHNsLmpzJztcclxuaW1wb3J0IHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9wcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50Lmdsc2wuanMnO1xyXG5pbXBvcnQgcHJvamVjdF92ZXJ0ZXggZnJvbSAnLi9TaGFkZXJDaHVuay9wcm9qZWN0X3ZlcnRleC5nbHNsLmpzJztcclxuaW1wb3J0IGRpdGhlcmluZ19mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL2RpdGhlcmluZ19mcmFnbWVudC5nbHNsLmpzJztcclxuaW1wb3J0IGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQuZ2xzbC5qcyc7XHJcbmltcG9ydCByb3VnaG5lc3NtYXBfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9yb3VnaG5lc3NtYXBfZnJhZ21lbnQuZ2xzbC5qcyc7XHJcbmltcG9ydCByb3VnaG5lc3NtYXBfcGFyc19mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL3JvdWdobmVzc21hcF9wYXJzX2ZyYWdtZW50Lmdsc2wuanMnO1xyXG5pbXBvcnQgc2hhZG93bWFwX3BhcnNfZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay9zaGFkb3dtYXBfcGFyc19mcmFnbWVudC5nbHNsLmpzJztcclxuaW1wb3J0IHNoYWRvd21hcF9wYXJzX3ZlcnRleCBmcm9tICcuL1NoYWRlckNodW5rL3NoYWRvd21hcF9wYXJzX3ZlcnRleC5nbHNsLmpzJztcclxuaW1wb3J0IHNoYWRvd21hcF92ZXJ0ZXggZnJvbSAnLi9TaGFkZXJDaHVuay9zaGFkb3dtYXBfdmVydGV4Lmdsc2wuanMnO1xyXG5pbXBvcnQgc2hhZG93bWFza19wYXJzX2ZyYWdtZW50IGZyb20gJy4vU2hhZGVyQ2h1bmsvc2hhZG93bWFza19wYXJzX2ZyYWdtZW50Lmdsc2wuanMnO1xyXG5pbXBvcnQgc2tpbmJhc2VfdmVydGV4IGZyb20gJy4vU2hhZGVyQ2h1bmsvc2tpbmJhc2VfdmVydGV4Lmdsc2wuanMnO1xyXG5pbXBvcnQgc2tpbm5pbmdfcGFyc192ZXJ0ZXggZnJvbSAnLi9TaGFkZXJDaHVuay9za2lubmluZ19wYXJzX3ZlcnRleC5nbHNsLmpzJztcclxuaW1wb3J0IHNraW5uaW5nX3ZlcnRleCBmcm9tICcuL1NoYWRlckNodW5rL3NraW5uaW5nX3ZlcnRleC5nbHNsLmpzJztcclxuaW1wb3J0IHNraW5ub3JtYWxfdmVydGV4IGZyb20gJy4vU2hhZGVyQ2h1bmsvc2tpbm5vcm1hbF92ZXJ0ZXguZ2xzbC5qcyc7XHJcbmltcG9ydCBzcGVjdWxhcm1hcF9mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL3NwZWN1bGFybWFwX2ZyYWdtZW50Lmdsc2wuanMnO1xyXG5pbXBvcnQgc3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL3NwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQuZ2xzbC5qcyc7XHJcbmltcG9ydCB0b25lbWFwcGluZ19mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL3RvbmVtYXBwaW5nX2ZyYWdtZW50Lmdsc2wuanMnO1xyXG5pbXBvcnQgdG9uZW1hcHBpbmdfcGFyc19mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL3RvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQuZ2xzbC5qcyc7XHJcbmltcG9ydCB0cmFuc21pc3Npb25fZnJhZ21lbnQgZnJvbSAnLi9TaGFkZXJDaHVuay90cmFuc21pc3Npb25fZnJhZ21lbnQuZ2xzbC5qcyc7XHJcbmltcG9ydCB0cmFuc21pc3Npb25fcGFyc19mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL3RyYW5zbWlzc2lvbl9wYXJzX2ZyYWdtZW50Lmdsc2wuanMnO1xyXG5pbXBvcnQgdXZfcGFyc19mcmFnbWVudCBmcm9tICcuL1NoYWRlckNodW5rL3V2X3BhcnNfZnJhZ21lbnQuZ2xzbC5qcyc7XHJcbmltcG9ydCB1dl9wYXJzX3ZlcnRleCBmcm9tICcuL1NoYWRlckNodW5rL3V2X3BhcnNfdmVydGV4Lmdsc2wuanMnO1xyXG5pbXBvcnQgdXZfdmVydGV4IGZyb20gJy4vU2hhZGVyQ2h1bmsvdXZfdmVydGV4Lmdsc2wuanMnO1xyXG5pbXBvcnQgd29ybGRwb3NfdmVydGV4IGZyb20gJy4vU2hhZGVyQ2h1bmsvd29ybGRwb3NfdmVydGV4Lmdsc2wuanMnO1xyXG5cclxuaW1wb3J0ICogYXMgYmFja2dyb3VuZCBmcm9tICcuL1NoYWRlckxpYi9iYWNrZ3JvdW5kLmdsc2wuanMnO1xyXG5pbXBvcnQgKiBhcyBiYWNrZ3JvdW5kQ3ViZSBmcm9tICcuL1NoYWRlckxpYi9iYWNrZ3JvdW5kQ3ViZS5nbHNsLmpzJztcclxuaW1wb3J0ICogYXMgY3ViZSBmcm9tICcuL1NoYWRlckxpYi9jdWJlLmdsc2wuanMnO1xyXG5pbXBvcnQgKiBhcyBkZXB0aCBmcm9tICcuL1NoYWRlckxpYi9kZXB0aC5nbHNsLmpzJztcclxuaW1wb3J0ICogYXMgZGlzdGFuY2VSR0JBIGZyb20gJy4vU2hhZGVyTGliL2Rpc3RhbmNlUkdCQS5nbHNsLmpzJztcclxuaW1wb3J0ICogYXMgZXF1aXJlY3QgZnJvbSAnLi9TaGFkZXJMaWIvZXF1aXJlY3QuZ2xzbC5qcyc7XHJcbmltcG9ydCAqIGFzIGxpbmVkYXNoZWQgZnJvbSAnLi9TaGFkZXJMaWIvbGluZWRhc2hlZC5nbHNsLmpzJztcclxuaW1wb3J0ICogYXMgbWVzaGJhc2ljIGZyb20gJy4vU2hhZGVyTGliL21lc2hiYXNpYy5nbHNsLmpzJztcclxuaW1wb3J0ICogYXMgbWVzaGxhbWJlcnQgZnJvbSAnLi9TaGFkZXJMaWIvbWVzaGxhbWJlcnQuZ2xzbC5qcyc7XHJcbmltcG9ydCAqIGFzIG1lc2htYXRjYXAgZnJvbSAnLi9TaGFkZXJMaWIvbWVzaG1hdGNhcC5nbHNsLmpzJztcclxuaW1wb3J0ICogYXMgbWVzaG5vcm1hbCBmcm9tICcuL1NoYWRlckxpYi9tZXNobm9ybWFsLmdsc2wuanMnO1xyXG5pbXBvcnQgKiBhcyBtZXNocGhvbmcgZnJvbSAnLi9TaGFkZXJMaWIvbWVzaHBob25nLmdsc2wuanMnO1xyXG5pbXBvcnQgKiBhcyBtZXNocGh5c2ljYWwgZnJvbSAnLi9TaGFkZXJMaWIvbWVzaHBoeXNpY2FsLmdsc2wuanMnO1xyXG5pbXBvcnQgKiBhcyBtZXNodG9vbiBmcm9tICcuL1NoYWRlckxpYi9tZXNodG9vbi5nbHNsLmpzJztcclxuaW1wb3J0ICogYXMgcG9pbnRzIGZyb20gJy4vU2hhZGVyTGliL3BvaW50cy5nbHNsLmpzJztcclxuaW1wb3J0ICogYXMgc2hhZG93IGZyb20gJy4vU2hhZGVyTGliL3NoYWRvdy5nbHNsLmpzJztcclxuaW1wb3J0ICogYXMgc3ByaXRlIGZyb20gJy4vU2hhZGVyTGliL3Nwcml0ZS5nbHNsLmpzJztcclxuXHJcbmV4cG9ydCBjb25zdCBTaGFkZXJDaHVuayA9IHtcclxuXHRhbHBoYWhhc2hfZnJhZ21lbnQ6IGFscGhhaGFzaF9mcmFnbWVudCxcclxuXHRhbHBoYWhhc2hfcGFyc19mcmFnbWVudDogYWxwaGFoYXNoX3BhcnNfZnJhZ21lbnQsXHJcblx0YWxwaGFtYXBfZnJhZ21lbnQ6IGFscGhhbWFwX2ZyYWdtZW50LFxyXG5cdGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ6IGFscGhhbWFwX3BhcnNfZnJhZ21lbnQsXHJcblx0YWxwaGF0ZXN0X2ZyYWdtZW50OiBhbHBoYXRlc3RfZnJhZ21lbnQsXHJcblx0YWxwaGF0ZXN0X3BhcnNfZnJhZ21lbnQ6IGFscGhhdGVzdF9wYXJzX2ZyYWdtZW50LFxyXG5cdGFvbWFwX2ZyYWdtZW50OiBhb21hcF9mcmFnbWVudCxcclxuXHRhb21hcF9wYXJzX2ZyYWdtZW50OiBhb21hcF9wYXJzX2ZyYWdtZW50LFxyXG5cdGJhdGNoaW5nX3BhcnNfdmVydGV4OiBiYXRjaGluZ19wYXJzX3ZlcnRleCxcclxuXHRiYXRjaGluZ192ZXJ0ZXg6IGJhdGNoaW5nX3ZlcnRleCxcclxuXHRiZWdpbl92ZXJ0ZXg6IGJlZ2luX3ZlcnRleCxcclxuXHRiZWdpbm5vcm1hbF92ZXJ0ZXg6IGJlZ2lubm9ybWFsX3ZlcnRleCxcclxuXHRic2RmczogYnNkZnMsXHJcblx0aXJpZGVzY2VuY2VfZnJhZ21lbnQ6IGlyaWRlc2NlbmNlX2ZyYWdtZW50LFxyXG5cdGJ1bXBtYXBfcGFyc19mcmFnbWVudDogYnVtcG1hcF9wYXJzX2ZyYWdtZW50LFxyXG5cdGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudDogY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50LFxyXG5cdGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50OiBjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudCxcclxuXHRjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg6IGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleCxcclxuXHRjbGlwcGluZ19wbGFuZXNfdmVydGV4OiBjbGlwcGluZ19wbGFuZXNfdmVydGV4LFxyXG5cdGNvbG9yX2ZyYWdtZW50OiBjb2xvcl9mcmFnbWVudCxcclxuXHRjb2xvcl9wYXJzX2ZyYWdtZW50OiBjb2xvcl9wYXJzX2ZyYWdtZW50LFxyXG5cdGNvbG9yX3BhcnNfdmVydGV4OiBjb2xvcl9wYXJzX3ZlcnRleCxcclxuXHRjb2xvcl92ZXJ0ZXg6IGNvbG9yX3ZlcnRleCxcclxuXHRjb21tb246IGNvbW1vbixcclxuXHRjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQ6IGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudCxcclxuXHRkZWZhdWx0bm9ybWFsX3ZlcnRleDogZGVmYXVsdG5vcm1hbF92ZXJ0ZXgsXHJcblx0ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4OiBkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXgsXHJcblx0ZGlzcGxhY2VtZW50bWFwX3ZlcnRleDogZGlzcGxhY2VtZW50bWFwX3ZlcnRleCxcclxuXHRlbWlzc2l2ZW1hcF9mcmFnbWVudDogZW1pc3NpdmVtYXBfZnJhZ21lbnQsXHJcblx0ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudDogZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudCxcclxuXHRjb2xvcnNwYWNlX2ZyYWdtZW50OiBjb2xvcnNwYWNlX2ZyYWdtZW50LFxyXG5cdGNvbG9yc3BhY2VfcGFyc19mcmFnbWVudDogY29sb3JzcGFjZV9wYXJzX2ZyYWdtZW50LFxyXG5cdGVudm1hcF9mcmFnbWVudDogZW52bWFwX2ZyYWdtZW50LFxyXG5cdGVudm1hcF9jb21tb25fcGFyc19mcmFnbWVudDogZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50LFxyXG5cdGVudm1hcF9wYXJzX2ZyYWdtZW50OiBlbnZtYXBfcGFyc19mcmFnbWVudCxcclxuXHRlbnZtYXBfcGFyc192ZXJ0ZXg6IGVudm1hcF9wYXJzX3ZlcnRleCxcclxuXHRlbnZtYXBfcGh5c2ljYWxfcGFyc19mcmFnbWVudDogZW52bWFwX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQsXHJcblx0ZW52bWFwX3ZlcnRleDogZW52bWFwX3ZlcnRleCxcclxuXHRmb2dfdmVydGV4OiBmb2dfdmVydGV4LFxyXG5cdGZvZ19wYXJzX3ZlcnRleDogZm9nX3BhcnNfdmVydGV4LFxyXG5cdGZvZ19mcmFnbWVudDogZm9nX2ZyYWdtZW50LFxyXG5cdGZvZ19wYXJzX2ZyYWdtZW50OiBmb2dfcGFyc19mcmFnbWVudCxcclxuXHRncmFkaWVudG1hcF9wYXJzX2ZyYWdtZW50OiBncmFkaWVudG1hcF9wYXJzX2ZyYWdtZW50LFxyXG5cdGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ6IGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQsXHJcblx0bGlnaHRzX2xhbWJlcnRfZnJhZ21lbnQ6IGxpZ2h0c19sYW1iZXJ0X2ZyYWdtZW50LFxyXG5cdGxpZ2h0c19sYW1iZXJ0X3BhcnNfZnJhZ21lbnQ6IGxpZ2h0c19sYW1iZXJ0X3BhcnNfZnJhZ21lbnQsXHJcblx0bGlnaHRzX3BhcnNfYmVnaW46IGxpZ2h0c19wYXJzX2JlZ2luLFxyXG5cdGxpZ2h0c190b29uX2ZyYWdtZW50OiBsaWdodHNfdG9vbl9mcmFnbWVudCxcclxuXHRsaWdodHNfdG9vbl9wYXJzX2ZyYWdtZW50OiBsaWdodHNfdG9vbl9wYXJzX2ZyYWdtZW50LFxyXG5cdGxpZ2h0c19waG9uZ19mcmFnbWVudDogbGlnaHRzX3Bob25nX2ZyYWdtZW50LFxyXG5cdGxpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50OiBsaWdodHNfcGhvbmdfcGFyc19mcmFnbWVudCxcclxuXHRsaWdodHNfcGh5c2ljYWxfZnJhZ21lbnQ6IGxpZ2h0c19waHlzaWNhbF9mcmFnbWVudCxcclxuXHRsaWdodHNfcGh5c2ljYWxfcGFyc19mcmFnbWVudDogbGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQsXHJcblx0bGlnaHRzX2ZyYWdtZW50X2JlZ2luOiBsaWdodHNfZnJhZ21lbnRfYmVnaW4sXHJcblx0bGlnaHRzX2ZyYWdtZW50X21hcHM6IGxpZ2h0c19mcmFnbWVudF9tYXBzLFxyXG5cdGxpZ2h0c19mcmFnbWVudF9lbmQ6IGxpZ2h0c19mcmFnbWVudF9lbmQsXHJcblx0bG9nZGVwdGhidWZfZnJhZ21lbnQ6IGxvZ2RlcHRoYnVmX2ZyYWdtZW50LFxyXG5cdGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ6IGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQsXHJcblx0bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg6IGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4LFxyXG5cdGxvZ2RlcHRoYnVmX3ZlcnRleDogbG9nZGVwdGhidWZfdmVydGV4LFxyXG5cdG1hcF9mcmFnbWVudDogbWFwX2ZyYWdtZW50LFxyXG5cdG1hcF9wYXJzX2ZyYWdtZW50OiBtYXBfcGFyc19mcmFnbWVudCxcclxuXHRtYXBfcGFydGljbGVfZnJhZ21lbnQ6IG1hcF9wYXJ0aWNsZV9mcmFnbWVudCxcclxuXHRtYXBfcGFydGljbGVfcGFyc19mcmFnbWVudDogbWFwX3BhcnRpY2xlX3BhcnNfZnJhZ21lbnQsXHJcblx0bWV0YWxuZXNzbWFwX2ZyYWdtZW50OiBtZXRhbG5lc3NtYXBfZnJhZ21lbnQsXHJcblx0bWV0YWxuZXNzbWFwX3BhcnNfZnJhZ21lbnQ6IG1ldGFsbmVzc21hcF9wYXJzX2ZyYWdtZW50LFxyXG5cdG1vcnBoaW5zdGFuY2VfdmVydGV4OiBtb3JwaGluc3RhbmNlX3ZlcnRleCxcclxuXHRtb3JwaGNvbG9yX3ZlcnRleDogbW9ycGhjb2xvcl92ZXJ0ZXgsXHJcblx0bW9ycGhub3JtYWxfdmVydGV4OiBtb3JwaG5vcm1hbF92ZXJ0ZXgsXHJcblx0bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg6IG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4LFxyXG5cdG1vcnBodGFyZ2V0X3ZlcnRleDogbW9ycGh0YXJnZXRfdmVydGV4LFxyXG5cdG5vcm1hbF9mcmFnbWVudF9iZWdpbjogbm9ybWFsX2ZyYWdtZW50X2JlZ2luLFxyXG5cdG5vcm1hbF9mcmFnbWVudF9tYXBzOiBub3JtYWxfZnJhZ21lbnRfbWFwcyxcclxuXHRub3JtYWxfcGFyc19mcmFnbWVudDogbm9ybWFsX3BhcnNfZnJhZ21lbnQsXHJcblx0bm9ybWFsX3BhcnNfdmVydGV4OiBub3JtYWxfcGFyc192ZXJ0ZXgsXHJcblx0bm9ybWFsX3ZlcnRleDogbm9ybWFsX3ZlcnRleCxcclxuXHRub3JtYWxtYXBfcGFyc19mcmFnbWVudDogbm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQsXHJcblx0Y2xlYXJjb2F0X25vcm1hbF9mcmFnbWVudF9iZWdpbjogY2xlYXJjb2F0X25vcm1hbF9mcmFnbWVudF9iZWdpbixcclxuXHRjbGVhcmNvYXRfbm9ybWFsX2ZyYWdtZW50X21hcHM6IGNsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfbWFwcyxcclxuXHRjbGVhcmNvYXRfcGFyc19mcmFnbWVudDogY2xlYXJjb2F0X3BhcnNfZnJhZ21lbnQsXHJcblx0aXJpZGVzY2VuY2VfcGFyc19mcmFnbWVudDogaXJpZGVzY2VuY2VfcGFyc19mcmFnbWVudCxcclxuXHRvcGFxdWVfZnJhZ21lbnQ6IG9wYXF1ZV9mcmFnbWVudCxcclxuXHRwYWNraW5nOiBwYWNraW5nLFxyXG5cdHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ6IHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQsXHJcblx0cHJvamVjdF92ZXJ0ZXg6IHByb2plY3RfdmVydGV4LFxyXG5cdGRpdGhlcmluZ19mcmFnbWVudDogZGl0aGVyaW5nX2ZyYWdtZW50LFxyXG5cdGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50OiBkaXRoZXJpbmdfcGFyc19mcmFnbWVudCxcclxuXHRyb3VnaG5lc3NtYXBfZnJhZ21lbnQ6IHJvdWdobmVzc21hcF9mcmFnbWVudCxcclxuXHRyb3VnaG5lc3NtYXBfcGFyc19mcmFnbWVudDogcm91Z2huZXNzbWFwX3BhcnNfZnJhZ21lbnQsXHJcblx0c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ6IHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50LFxyXG5cdHNoYWRvd21hcF9wYXJzX3ZlcnRleDogc2hhZG93bWFwX3BhcnNfdmVydGV4LFxyXG5cdHNoYWRvd21hcF92ZXJ0ZXg6IHNoYWRvd21hcF92ZXJ0ZXgsXHJcblx0c2hhZG93bWFza19wYXJzX2ZyYWdtZW50OiBzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQsXHJcblx0c2tpbmJhc2VfdmVydGV4OiBza2luYmFzZV92ZXJ0ZXgsXHJcblx0c2tpbm5pbmdfcGFyc192ZXJ0ZXg6IHNraW5uaW5nX3BhcnNfdmVydGV4LFxyXG5cdHNraW5uaW5nX3ZlcnRleDogc2tpbm5pbmdfdmVydGV4LFxyXG5cdHNraW5ub3JtYWxfdmVydGV4OiBza2lubm9ybWFsX3ZlcnRleCxcclxuXHRzcGVjdWxhcm1hcF9mcmFnbWVudDogc3BlY3VsYXJtYXBfZnJhZ21lbnQsXHJcblx0c3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudDogc3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudCxcclxuXHR0b25lbWFwcGluZ19mcmFnbWVudDogdG9uZW1hcHBpbmdfZnJhZ21lbnQsXHJcblx0dG9uZW1hcHBpbmdfcGFyc19mcmFnbWVudDogdG9uZW1hcHBpbmdfcGFyc19mcmFnbWVudCxcclxuXHR0cmFuc21pc3Npb25fZnJhZ21lbnQ6IHRyYW5zbWlzc2lvbl9mcmFnbWVudCxcclxuXHR0cmFuc21pc3Npb25fcGFyc19mcmFnbWVudDogdHJhbnNtaXNzaW9uX3BhcnNfZnJhZ21lbnQsXHJcblx0dXZfcGFyc19mcmFnbWVudDogdXZfcGFyc19mcmFnbWVudCxcclxuXHR1dl9wYXJzX3ZlcnRleDogdXZfcGFyc192ZXJ0ZXgsXHJcblx0dXZfdmVydGV4OiB1dl92ZXJ0ZXgsXHJcblx0d29ybGRwb3NfdmVydGV4OiB3b3JsZHBvc192ZXJ0ZXgsXHJcblxyXG5cdGJhY2tncm91bmRfdmVydDogYmFja2dyb3VuZC52ZXJ0ZXgsXHJcblx0YmFja2dyb3VuZF9mcmFnOiBiYWNrZ3JvdW5kLmZyYWdtZW50LFxyXG5cdGJhY2tncm91bmRDdWJlX3ZlcnQ6IGJhY2tncm91bmRDdWJlLnZlcnRleCxcclxuXHRiYWNrZ3JvdW5kQ3ViZV9mcmFnOiBiYWNrZ3JvdW5kQ3ViZS5mcmFnbWVudCxcclxuXHRjdWJlX3ZlcnQ6IGN1YmUudmVydGV4LFxyXG5cdGN1YmVfZnJhZzogY3ViZS5mcmFnbWVudCxcclxuXHRkZXB0aF92ZXJ0OiBkZXB0aC52ZXJ0ZXgsXHJcblx0ZGVwdGhfZnJhZzogZGVwdGguZnJhZ21lbnQsXHJcblx0ZGlzdGFuY2VSR0JBX3ZlcnQ6IGRpc3RhbmNlUkdCQS52ZXJ0ZXgsXHJcblx0ZGlzdGFuY2VSR0JBX2ZyYWc6IGRpc3RhbmNlUkdCQS5mcmFnbWVudCxcclxuXHRlcXVpcmVjdF92ZXJ0OiBlcXVpcmVjdC52ZXJ0ZXgsXHJcblx0ZXF1aXJlY3RfZnJhZzogZXF1aXJlY3QuZnJhZ21lbnQsXHJcblx0bGluZWRhc2hlZF92ZXJ0OiBsaW5lZGFzaGVkLnZlcnRleCxcclxuXHRsaW5lZGFzaGVkX2ZyYWc6IGxpbmVkYXNoZWQuZnJhZ21lbnQsXHJcblx0bWVzaGJhc2ljX3ZlcnQ6IG1lc2hiYXNpYy52ZXJ0ZXgsXHJcblx0bWVzaGJhc2ljX2ZyYWc6IG1lc2hiYXNpYy5mcmFnbWVudCxcclxuXHRtZXNobGFtYmVydF92ZXJ0OiBtZXNobGFtYmVydC52ZXJ0ZXgsXHJcblx0bWVzaGxhbWJlcnRfZnJhZzogbWVzaGxhbWJlcnQuZnJhZ21lbnQsXHJcblx0bWVzaG1hdGNhcF92ZXJ0OiBtZXNobWF0Y2FwLnZlcnRleCxcclxuXHRtZXNobWF0Y2FwX2ZyYWc6IG1lc2htYXRjYXAuZnJhZ21lbnQsXHJcblx0bWVzaG5vcm1hbF92ZXJ0OiBtZXNobm9ybWFsLnZlcnRleCxcclxuXHRtZXNobm9ybWFsX2ZyYWc6IG1lc2hub3JtYWwuZnJhZ21lbnQsXHJcblx0bWVzaHBob25nX3ZlcnQ6IG1lc2hwaG9uZy52ZXJ0ZXgsXHJcblx0bWVzaHBob25nX2ZyYWc6IG1lc2hwaG9uZy5mcmFnbWVudCxcclxuXHRtZXNocGh5c2ljYWxfdmVydDogbWVzaHBoeXNpY2FsLnZlcnRleCxcclxuXHRtZXNocGh5c2ljYWxfZnJhZzogbWVzaHBoeXNpY2FsLmZyYWdtZW50LFxyXG5cdG1lc2h0b29uX3ZlcnQ6IG1lc2h0b29uLnZlcnRleCxcclxuXHRtZXNodG9vbl9mcmFnOiBtZXNodG9vbi5mcmFnbWVudCxcclxuXHRwb2ludHNfdmVydDogcG9pbnRzLnZlcnRleCxcclxuXHRwb2ludHNfZnJhZzogcG9pbnRzLmZyYWdtZW50LFxyXG5cdHNoYWRvd192ZXJ0OiBzaGFkb3cudmVydGV4LFxyXG5cdHNoYWRvd19mcmFnOiBzaGFkb3cuZnJhZ21lbnQsXHJcblx0c3ByaXRlX3ZlcnQ6IHNwcml0ZS52ZXJ0ZXgsXHJcblx0c3ByaXRlX2ZyYWc6IHNwcml0ZS5mcmFnbWVudFxyXG59O1xyXG4iLCJpbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uLy4uL21hdGgvQ29sb3IuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IyLmpzJztcclxuaW1wb3J0IHsgTWF0cml4MyB9IGZyb20gJy4uLy4uL21hdGgvTWF0cml4My5qcyc7XHJcblxyXG4vLyBVbmlmb3JtcyBsaWJyYXJ5IGZvciBzaGFyZWQgd2ViZ2wgc2hhZGVyc1xyXG5jb25zdCBVbmlmb3Jtc0xpYiA9IHtcclxuXHJcblx0Y29tbW9uOiB7XHJcblxyXG5cdFx0ZGlmZnVzZTogeyB2YWx1ZTogLypAX19QVVJFX18qLyBuZXcgQ29sb3IoIDB4ZmZmZmZmICkgfSxcclxuXHRcdG9wYWNpdHk6IHsgdmFsdWU6IDEuMCB9LFxyXG5cclxuXHRcdG1hcDogeyB2YWx1ZTogbnVsbCB9LFxyXG5cdFx0bWFwVHJhbnNmb3JtOiB7IHZhbHVlOiAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXgzKCkgfSxcclxuXHJcblx0XHRhbHBoYU1hcDogeyB2YWx1ZTogbnVsbCB9LFxyXG5cdFx0YWxwaGFNYXBUcmFuc2Zvcm06IHsgdmFsdWU6IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDMoKSB9LFxyXG5cclxuXHRcdGFscGhhVGVzdDogeyB2YWx1ZTogMCB9XHJcblxyXG5cdH0sXHJcblxyXG5cdHNwZWN1bGFybWFwOiB7XHJcblxyXG5cdFx0c3BlY3VsYXJNYXA6IHsgdmFsdWU6IG51bGwgfSxcclxuXHRcdHNwZWN1bGFyTWFwVHJhbnNmb3JtOiB7IHZhbHVlOiAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXgzKCkgfVxyXG5cclxuXHR9LFxyXG5cclxuXHRlbnZtYXA6IHtcclxuXHJcblx0XHRlbnZNYXA6IHsgdmFsdWU6IG51bGwgfSxcclxuXHRcdGVudk1hcFJvdGF0aW9uOiB7IHZhbHVlOiAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXgzKCkgfSxcclxuXHRcdGZsaXBFbnZNYXA6IHsgdmFsdWU6IC0gMSB9LFxyXG5cdFx0cmVmbGVjdGl2aXR5OiB7IHZhbHVlOiAxLjAgfSwgLy8gYmFzaWMsIGxhbWJlcnQsIHBob25nXHJcblx0XHRpb3I6IHsgdmFsdWU6IDEuNSB9LCAvLyBwaHlzaWNhbFxyXG5cdFx0cmVmcmFjdGlvblJhdGlvOiB7IHZhbHVlOiAwLjk4IH0sIC8vIGJhc2ljLCBsYW1iZXJ0LCBwaG9uZ1xyXG5cclxuXHR9LFxyXG5cclxuXHRhb21hcDoge1xyXG5cclxuXHRcdGFvTWFwOiB7IHZhbHVlOiBudWxsIH0sXHJcblx0XHRhb01hcEludGVuc2l0eTogeyB2YWx1ZTogMSB9LFxyXG5cdFx0YW9NYXBUcmFuc2Zvcm06IHsgdmFsdWU6IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDMoKSB9XHJcblxyXG5cdH0sXHJcblxyXG5cdGxpZ2h0bWFwOiB7XHJcblxyXG5cdFx0bGlnaHRNYXA6IHsgdmFsdWU6IG51bGwgfSxcclxuXHRcdGxpZ2h0TWFwSW50ZW5zaXR5OiB7IHZhbHVlOiAxIH0sXHJcblx0XHRsaWdodE1hcFRyYW5zZm9ybTogeyB2YWx1ZTogLypAX19QVVJFX18qLyBuZXcgTWF0cml4MygpIH1cclxuXHJcblx0fSxcclxuXHJcblx0YnVtcG1hcDoge1xyXG5cclxuXHRcdGJ1bXBNYXA6IHsgdmFsdWU6IG51bGwgfSxcclxuXHRcdGJ1bXBNYXBUcmFuc2Zvcm06IHsgdmFsdWU6IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDMoKSB9LFxyXG5cdFx0YnVtcFNjYWxlOiB7IHZhbHVlOiAxIH1cclxuXHJcblx0fSxcclxuXHJcblx0bm9ybWFsbWFwOiB7XHJcblxyXG5cdFx0bm9ybWFsTWFwOiB7IHZhbHVlOiBudWxsIH0sXHJcblx0XHRub3JtYWxNYXBUcmFuc2Zvcm06IHsgdmFsdWU6IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDMoKSB9LFxyXG5cdFx0bm9ybWFsU2NhbGU6IHsgdmFsdWU6IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjIoIDEsIDEgKSB9XHJcblxyXG5cdH0sXHJcblxyXG5cdGRpc3BsYWNlbWVudG1hcDoge1xyXG5cclxuXHRcdGRpc3BsYWNlbWVudE1hcDogeyB2YWx1ZTogbnVsbCB9LFxyXG5cdFx0ZGlzcGxhY2VtZW50TWFwVHJhbnNmb3JtOiB7IHZhbHVlOiAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXgzKCkgfSxcclxuXHRcdGRpc3BsYWNlbWVudFNjYWxlOiB7IHZhbHVlOiAxIH0sXHJcblx0XHRkaXNwbGFjZW1lbnRCaWFzOiB7IHZhbHVlOiAwIH1cclxuXHJcblx0fSxcclxuXHJcblx0ZW1pc3NpdmVtYXA6IHtcclxuXHJcblx0XHRlbWlzc2l2ZU1hcDogeyB2YWx1ZTogbnVsbCB9LFxyXG5cdFx0ZW1pc3NpdmVNYXBUcmFuc2Zvcm06IHsgdmFsdWU6IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDMoKSB9XHJcblxyXG5cdH0sXHJcblxyXG5cdG1ldGFsbmVzc21hcDoge1xyXG5cclxuXHRcdG1ldGFsbmVzc01hcDogeyB2YWx1ZTogbnVsbCB9LFxyXG5cdFx0bWV0YWxuZXNzTWFwVHJhbnNmb3JtOiB7IHZhbHVlOiAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXgzKCkgfVxyXG5cclxuXHR9LFxyXG5cclxuXHRyb3VnaG5lc3NtYXA6IHtcclxuXHJcblx0XHRyb3VnaG5lc3NNYXA6IHsgdmFsdWU6IG51bGwgfSxcclxuXHRcdHJvdWdobmVzc01hcFRyYW5zZm9ybTogeyB2YWx1ZTogLypAX19QVVJFX18qLyBuZXcgTWF0cml4MygpIH1cclxuXHJcblx0fSxcclxuXHJcblx0Z3JhZGllbnRtYXA6IHtcclxuXHJcblx0XHRncmFkaWVudE1hcDogeyB2YWx1ZTogbnVsbCB9XHJcblxyXG5cdH0sXHJcblxyXG5cdGZvZzoge1xyXG5cclxuXHRcdGZvZ0RlbnNpdHk6IHsgdmFsdWU6IDAuMDAwMjUgfSxcclxuXHRcdGZvZ05lYXI6IHsgdmFsdWU6IDEgfSxcclxuXHRcdGZvZ0ZhcjogeyB2YWx1ZTogMjAwMCB9LFxyXG5cdFx0Zm9nQ29sb3I6IHsgdmFsdWU6IC8qQF9fUFVSRV9fKi8gbmV3IENvbG9yKCAweGZmZmZmZiApIH1cclxuXHJcblx0fSxcclxuXHJcblx0bGlnaHRzOiB7XHJcblxyXG5cdFx0YW1iaWVudExpZ2h0Q29sb3I6IHsgdmFsdWU6IFtdIH0sXHJcblxyXG5cdFx0bGlnaHRQcm9iZTogeyB2YWx1ZTogW10gfSxcclxuXHJcblx0XHRkaXJlY3Rpb25hbExpZ2h0czogeyB2YWx1ZTogW10sIHByb3BlcnRpZXM6IHtcclxuXHRcdFx0ZGlyZWN0aW9uOiB7fSxcclxuXHRcdFx0Y29sb3I6IHt9XHJcblx0XHR9IH0sXHJcblxyXG5cdFx0ZGlyZWN0aW9uYWxMaWdodFNoYWRvd3M6IHsgdmFsdWU6IFtdLCBwcm9wZXJ0aWVzOiB7XHJcblx0XHRcdHNoYWRvd0ludGVuc2l0eTogMSxcclxuXHRcdFx0c2hhZG93Qmlhczoge30sXHJcblx0XHRcdHNoYWRvd05vcm1hbEJpYXM6IHt9LFxyXG5cdFx0XHRzaGFkb3dSYWRpdXM6IHt9LFxyXG5cdFx0XHRzaGFkb3dNYXBTaXplOiB7fVxyXG5cdFx0fSB9LFxyXG5cclxuXHRcdGRpcmVjdGlvbmFsU2hhZG93TWFwOiB7IHZhbHVlOiBbXSB9LFxyXG5cdFx0ZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXg6IHsgdmFsdWU6IFtdIH0sXHJcblxyXG5cdFx0c3BvdExpZ2h0czogeyB2YWx1ZTogW10sIHByb3BlcnRpZXM6IHtcclxuXHRcdFx0Y29sb3I6IHt9LFxyXG5cdFx0XHRwb3NpdGlvbjoge30sXHJcblx0XHRcdGRpcmVjdGlvbjoge30sXHJcblx0XHRcdGRpc3RhbmNlOiB7fSxcclxuXHRcdFx0Y29uZUNvczoge30sXHJcblx0XHRcdHBlbnVtYnJhQ29zOiB7fSxcclxuXHRcdFx0ZGVjYXk6IHt9XHJcblx0XHR9IH0sXHJcblxyXG5cdFx0c3BvdExpZ2h0U2hhZG93czogeyB2YWx1ZTogW10sIHByb3BlcnRpZXM6IHtcclxuXHRcdFx0c2hhZG93SW50ZW5zaXR5OiAxLFxyXG5cdFx0XHRzaGFkb3dCaWFzOiB7fSxcclxuXHRcdFx0c2hhZG93Tm9ybWFsQmlhczoge30sXHJcblx0XHRcdHNoYWRvd1JhZGl1czoge30sXHJcblx0XHRcdHNoYWRvd01hcFNpemU6IHt9XHJcblx0XHR9IH0sXHJcblxyXG5cdFx0c3BvdExpZ2h0TWFwOiB7IHZhbHVlOiBbXSB9LFxyXG5cdFx0c3BvdFNoYWRvd01hcDogeyB2YWx1ZTogW10gfSxcclxuXHRcdHNwb3RMaWdodE1hdHJpeDogeyB2YWx1ZTogW10gfSxcclxuXHJcblx0XHRwb2ludExpZ2h0czogeyB2YWx1ZTogW10sIHByb3BlcnRpZXM6IHtcclxuXHRcdFx0Y29sb3I6IHt9LFxyXG5cdFx0XHRwb3NpdGlvbjoge30sXHJcblx0XHRcdGRlY2F5OiB7fSxcclxuXHRcdFx0ZGlzdGFuY2U6IHt9XHJcblx0XHR9IH0sXHJcblxyXG5cdFx0cG9pbnRMaWdodFNoYWRvd3M6IHsgdmFsdWU6IFtdLCBwcm9wZXJ0aWVzOiB7XHJcblx0XHRcdHNoYWRvd0ludGVuc2l0eTogMSxcclxuXHRcdFx0c2hhZG93Qmlhczoge30sXHJcblx0XHRcdHNoYWRvd05vcm1hbEJpYXM6IHt9LFxyXG5cdFx0XHRzaGFkb3dSYWRpdXM6IHt9LFxyXG5cdFx0XHRzaGFkb3dNYXBTaXplOiB7fSxcclxuXHRcdFx0c2hhZG93Q2FtZXJhTmVhcjoge30sXHJcblx0XHRcdHNoYWRvd0NhbWVyYUZhcjoge31cclxuXHRcdH0gfSxcclxuXHJcblx0XHRwb2ludFNoYWRvd01hcDogeyB2YWx1ZTogW10gfSxcclxuXHRcdHBvaW50U2hhZG93TWF0cml4OiB7IHZhbHVlOiBbXSB9LFxyXG5cclxuXHRcdGhlbWlzcGhlcmVMaWdodHM6IHsgdmFsdWU6IFtdLCBwcm9wZXJ0aWVzOiB7XHJcblx0XHRcdGRpcmVjdGlvbjoge30sXHJcblx0XHRcdHNreUNvbG9yOiB7fSxcclxuXHRcdFx0Z3JvdW5kQ29sb3I6IHt9XHJcblx0XHR9IH0sXHJcblxyXG5cdFx0Ly8gVE9ETyAoYWJlbG5hdGlvbik6IFJlY3RBcmVhTGlnaHQgQlJERiBkYXRhIG5lZWRzIHRvIGJlIG1vdmVkIGZyb20gZXhhbXBsZSB0byBtYWluIHNyY1xyXG5cdFx0cmVjdEFyZWFMaWdodHM6IHsgdmFsdWU6IFtdLCBwcm9wZXJ0aWVzOiB7XHJcblx0XHRcdGNvbG9yOiB7fSxcclxuXHRcdFx0cG9zaXRpb246IHt9LFxyXG5cdFx0XHR3aWR0aDoge30sXHJcblx0XHRcdGhlaWdodDoge31cclxuXHRcdH0gfSxcclxuXHJcblx0XHRsdGNfMTogeyB2YWx1ZTogbnVsbCB9LFxyXG5cdFx0bHRjXzI6IHsgdmFsdWU6IG51bGwgfVxyXG5cclxuXHR9LFxyXG5cclxuXHRwb2ludHM6IHtcclxuXHJcblx0XHRkaWZmdXNlOiB7IHZhbHVlOiAvKkBfX1BVUkVfXyovIG5ldyBDb2xvciggMHhmZmZmZmYgKSB9LFxyXG5cdFx0b3BhY2l0eTogeyB2YWx1ZTogMS4wIH0sXHJcblx0XHRzaXplOiB7IHZhbHVlOiAxLjAgfSxcclxuXHRcdHNjYWxlOiB7IHZhbHVlOiAxLjAgfSxcclxuXHRcdG1hcDogeyB2YWx1ZTogbnVsbCB9LFxyXG5cdFx0YWxwaGFNYXA6IHsgdmFsdWU6IG51bGwgfSxcclxuXHRcdGFscGhhTWFwVHJhbnNmb3JtOiB7IHZhbHVlOiAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXgzKCkgfSxcclxuXHRcdGFscGhhVGVzdDogeyB2YWx1ZTogMCB9LFxyXG5cdFx0dXZUcmFuc2Zvcm06IHsgdmFsdWU6IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDMoKSB9XHJcblxyXG5cdH0sXHJcblxyXG5cdHNwcml0ZToge1xyXG5cclxuXHRcdGRpZmZ1c2U6IHsgdmFsdWU6IC8qQF9fUFVSRV9fKi8gbmV3IENvbG9yKCAweGZmZmZmZiApIH0sXHJcblx0XHRvcGFjaXR5OiB7IHZhbHVlOiAxLjAgfSxcclxuXHRcdGNlbnRlcjogeyB2YWx1ZTogLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMiggMC41LCAwLjUgKSB9LFxyXG5cdFx0cm90YXRpb246IHsgdmFsdWU6IDAuMCB9LFxyXG5cdFx0bWFwOiB7IHZhbHVlOiBudWxsIH0sXHJcblx0XHRtYXBUcmFuc2Zvcm06IHsgdmFsdWU6IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDMoKSB9LFxyXG5cdFx0YWxwaGFNYXA6IHsgdmFsdWU6IG51bGwgfSxcclxuXHRcdGFscGhhTWFwVHJhbnNmb3JtOiB7IHZhbHVlOiAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXgzKCkgfSxcclxuXHRcdGFscGhhVGVzdDogeyB2YWx1ZTogMCB9XHJcblxyXG5cdH1cclxuXHJcbn07XHJcblxyXG5leHBvcnQgeyBVbmlmb3Jtc0xpYiB9O1xyXG4iLCJpbXBvcnQgeyBTaGFkZXJDaHVuayB9IGZyb20gJy4vU2hhZGVyQ2h1bmsuanMnO1xyXG5pbXBvcnQgeyBtZXJnZVVuaWZvcm1zIH0gZnJvbSAnLi9Vbmlmb3Jtc1V0aWxzLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMi5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBVbmlmb3Jtc0xpYiB9IGZyb20gJy4vVW5pZm9ybXNMaWIuanMnO1xyXG5pbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uLy4uL21hdGgvQ29sb3IuanMnO1xyXG5pbXBvcnQgeyBNYXRyaXgzIH0gZnJvbSAnLi4vLi4vbWF0aC9NYXRyaXgzLmpzJztcclxuXHJcbmNvbnN0IFNoYWRlckxpYiA9IHtcclxuXHJcblx0YmFzaWM6IHtcclxuXHJcblx0XHR1bmlmb3JtczogLypAX19QVVJFX18qLyBtZXJnZVVuaWZvcm1zKCBbXHJcblx0XHRcdFVuaWZvcm1zTGliLmNvbW1vbixcclxuXHRcdFx0VW5pZm9ybXNMaWIuc3BlY3VsYXJtYXAsXHJcblx0XHRcdFVuaWZvcm1zTGliLmVudm1hcCxcclxuXHRcdFx0VW5pZm9ybXNMaWIuYW9tYXAsXHJcblx0XHRcdFVuaWZvcm1zTGliLmxpZ2h0bWFwLFxyXG5cdFx0XHRVbmlmb3Jtc0xpYi5mb2dcclxuXHRcdF0gKSxcclxuXHJcblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hiYXNpY192ZXJ0LFxyXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hiYXNpY19mcmFnXHJcblxyXG5cdH0sXHJcblxyXG5cdGxhbWJlcnQ6IHtcclxuXHJcblx0XHR1bmlmb3JtczogLypAX19QVVJFX18qLyBtZXJnZVVuaWZvcm1zKCBbXHJcblx0XHRcdFVuaWZvcm1zTGliLmNvbW1vbixcclxuXHRcdFx0VW5pZm9ybXNMaWIuc3BlY3VsYXJtYXAsXHJcblx0XHRcdFVuaWZvcm1zTGliLmVudm1hcCxcclxuXHRcdFx0VW5pZm9ybXNMaWIuYW9tYXAsXHJcblx0XHRcdFVuaWZvcm1zTGliLmxpZ2h0bWFwLFxyXG5cdFx0XHRVbmlmb3Jtc0xpYi5lbWlzc2l2ZW1hcCxcclxuXHRcdFx0VW5pZm9ybXNMaWIuYnVtcG1hcCxcclxuXHRcdFx0VW5pZm9ybXNMaWIubm9ybWFsbWFwLFxyXG5cdFx0XHRVbmlmb3Jtc0xpYi5kaXNwbGFjZW1lbnRtYXAsXHJcblx0XHRcdFVuaWZvcm1zTGliLmZvZyxcclxuXHRcdFx0VW5pZm9ybXNMaWIubGlnaHRzLFxyXG5cdFx0XHR7XHJcblx0XHRcdFx0ZW1pc3NpdmU6IHsgdmFsdWU6IC8qQF9fUFVSRV9fKi8gbmV3IENvbG9yKCAweDAwMDAwMCApIH1cclxuXHRcdFx0fVxyXG5cdFx0XSApLFxyXG5cclxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaGxhbWJlcnRfdmVydCxcclxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNobGFtYmVydF9mcmFnXHJcblxyXG5cdH0sXHJcblxyXG5cdHBob25nOiB7XHJcblxyXG5cdFx0dW5pZm9ybXM6IC8qQF9fUFVSRV9fKi8gbWVyZ2VVbmlmb3JtcyggW1xyXG5cdFx0XHRVbmlmb3Jtc0xpYi5jb21tb24sXHJcblx0XHRcdFVuaWZvcm1zTGliLnNwZWN1bGFybWFwLFxyXG5cdFx0XHRVbmlmb3Jtc0xpYi5lbnZtYXAsXHJcblx0XHRcdFVuaWZvcm1zTGliLmFvbWFwLFxyXG5cdFx0XHRVbmlmb3Jtc0xpYi5saWdodG1hcCxcclxuXHRcdFx0VW5pZm9ybXNMaWIuZW1pc3NpdmVtYXAsXHJcblx0XHRcdFVuaWZvcm1zTGliLmJ1bXBtYXAsXHJcblx0XHRcdFVuaWZvcm1zTGliLm5vcm1hbG1hcCxcclxuXHRcdFx0VW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwLFxyXG5cdFx0XHRVbmlmb3Jtc0xpYi5mb2csXHJcblx0XHRcdFVuaWZvcm1zTGliLmxpZ2h0cyxcclxuXHRcdFx0e1xyXG5cdFx0XHRcdGVtaXNzaXZlOiB7IHZhbHVlOiAvKkBfX1BVUkVfXyovIG5ldyBDb2xvciggMHgwMDAwMDAgKSB9LFxyXG5cdFx0XHRcdHNwZWN1bGFyOiB7IHZhbHVlOiAvKkBfX1BVUkVfXyovIG5ldyBDb2xvciggMHgxMTExMTEgKSB9LFxyXG5cdFx0XHRcdHNoaW5pbmVzczogeyB2YWx1ZTogMzAgfVxyXG5cdFx0XHR9XHJcblx0XHRdICksXHJcblxyXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNocGhvbmdfdmVydCxcclxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNocGhvbmdfZnJhZ1xyXG5cclxuXHR9LFxyXG5cclxuXHRzdGFuZGFyZDoge1xyXG5cclxuXHRcdHVuaWZvcm1zOiAvKkBfX1BVUkVfXyovIG1lcmdlVW5pZm9ybXMoIFtcclxuXHRcdFx0VW5pZm9ybXNMaWIuY29tbW9uLFxyXG5cdFx0XHRVbmlmb3Jtc0xpYi5lbnZtYXAsXHJcblx0XHRcdFVuaWZvcm1zTGliLmFvbWFwLFxyXG5cdFx0XHRVbmlmb3Jtc0xpYi5saWdodG1hcCxcclxuXHRcdFx0VW5pZm9ybXNMaWIuZW1pc3NpdmVtYXAsXHJcblx0XHRcdFVuaWZvcm1zTGliLmJ1bXBtYXAsXHJcblx0XHRcdFVuaWZvcm1zTGliLm5vcm1hbG1hcCxcclxuXHRcdFx0VW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwLFxyXG5cdFx0XHRVbmlmb3Jtc0xpYi5yb3VnaG5lc3NtYXAsXHJcblx0XHRcdFVuaWZvcm1zTGliLm1ldGFsbmVzc21hcCxcclxuXHRcdFx0VW5pZm9ybXNMaWIuZm9nLFxyXG5cdFx0XHRVbmlmb3Jtc0xpYi5saWdodHMsXHJcblx0XHRcdHtcclxuXHRcdFx0XHRlbWlzc2l2ZTogeyB2YWx1ZTogLypAX19QVVJFX18qLyBuZXcgQ29sb3IoIDB4MDAwMDAwICkgfSxcclxuXHRcdFx0XHRyb3VnaG5lc3M6IHsgdmFsdWU6IDEuMCB9LFxyXG5cdFx0XHRcdG1ldGFsbmVzczogeyB2YWx1ZTogMC4wIH0sXHJcblx0XHRcdFx0ZW52TWFwSW50ZW5zaXR5OiB7IHZhbHVlOiAxIH1cclxuXHRcdFx0fVxyXG5cdFx0XSApLFxyXG5cclxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHBoeXNpY2FsX3ZlcnQsXHJcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHBoeXNpY2FsX2ZyYWdcclxuXHJcblx0fSxcclxuXHJcblx0dG9vbjoge1xyXG5cclxuXHRcdHVuaWZvcm1zOiAvKkBfX1BVUkVfXyovIG1lcmdlVW5pZm9ybXMoIFtcclxuXHRcdFx0VW5pZm9ybXNMaWIuY29tbW9uLFxyXG5cdFx0XHRVbmlmb3Jtc0xpYi5hb21hcCxcclxuXHRcdFx0VW5pZm9ybXNMaWIubGlnaHRtYXAsXHJcblx0XHRcdFVuaWZvcm1zTGliLmVtaXNzaXZlbWFwLFxyXG5cdFx0XHRVbmlmb3Jtc0xpYi5idW1wbWFwLFxyXG5cdFx0XHRVbmlmb3Jtc0xpYi5ub3JtYWxtYXAsXHJcblx0XHRcdFVuaWZvcm1zTGliLmRpc3BsYWNlbWVudG1hcCxcclxuXHRcdFx0VW5pZm9ybXNMaWIuZ3JhZGllbnRtYXAsXHJcblx0XHRcdFVuaWZvcm1zTGliLmZvZyxcclxuXHRcdFx0VW5pZm9ybXNMaWIubGlnaHRzLFxyXG5cdFx0XHR7XHJcblx0XHRcdFx0ZW1pc3NpdmU6IHsgdmFsdWU6IC8qQF9fUFVSRV9fKi8gbmV3IENvbG9yKCAweDAwMDAwMCApIH1cclxuXHRcdFx0fVxyXG5cdFx0XSApLFxyXG5cclxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHRvb25fdmVydCxcclxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNodG9vbl9mcmFnXHJcblxyXG5cdH0sXHJcblxyXG5cdG1hdGNhcDoge1xyXG5cclxuXHRcdHVuaWZvcm1zOiAvKkBfX1BVUkVfXyovIG1lcmdlVW5pZm9ybXMoIFtcclxuXHRcdFx0VW5pZm9ybXNMaWIuY29tbW9uLFxyXG5cdFx0XHRVbmlmb3Jtc0xpYi5idW1wbWFwLFxyXG5cdFx0XHRVbmlmb3Jtc0xpYi5ub3JtYWxtYXAsXHJcblx0XHRcdFVuaWZvcm1zTGliLmRpc3BsYWNlbWVudG1hcCxcclxuXHRcdFx0VW5pZm9ybXNMaWIuZm9nLFxyXG5cdFx0XHR7XHJcblx0XHRcdFx0bWF0Y2FwOiB7IHZhbHVlOiBudWxsIH1cclxuXHRcdFx0fVxyXG5cdFx0XSApLFxyXG5cclxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaG1hdGNhcF92ZXJ0LFxyXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLm1lc2htYXRjYXBfZnJhZ1xyXG5cclxuXHR9LFxyXG5cclxuXHRwb2ludHM6IHtcclxuXHJcblx0XHR1bmlmb3JtczogLypAX19QVVJFX18qLyBtZXJnZVVuaWZvcm1zKCBbXHJcblx0XHRcdFVuaWZvcm1zTGliLnBvaW50cyxcclxuXHRcdFx0VW5pZm9ybXNMaWIuZm9nXHJcblx0XHRdICksXHJcblxyXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5wb2ludHNfdmVydCxcclxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5wb2ludHNfZnJhZ1xyXG5cclxuXHR9LFxyXG5cclxuXHRkYXNoZWQ6IHtcclxuXHJcblx0XHR1bmlmb3JtczogLypAX19QVVJFX18qLyBtZXJnZVVuaWZvcm1zKCBbXHJcblx0XHRcdFVuaWZvcm1zTGliLmNvbW1vbixcclxuXHRcdFx0VW5pZm9ybXNMaWIuZm9nLFxyXG5cdFx0XHR7XHJcblx0XHRcdFx0c2NhbGU6IHsgdmFsdWU6IDEgfSxcclxuXHRcdFx0XHRkYXNoU2l6ZTogeyB2YWx1ZTogMSB9LFxyXG5cdFx0XHRcdHRvdGFsU2l6ZTogeyB2YWx1ZTogMiB9XHJcblx0XHRcdH1cclxuXHRcdF0gKSxcclxuXHJcblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLmxpbmVkYXNoZWRfdmVydCxcclxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5saW5lZGFzaGVkX2ZyYWdcclxuXHJcblx0fSxcclxuXHJcblx0ZGVwdGg6IHtcclxuXHJcblx0XHR1bmlmb3JtczogLypAX19QVVJFX18qLyBtZXJnZVVuaWZvcm1zKCBbXHJcblx0XHRcdFVuaWZvcm1zTGliLmNvbW1vbixcclxuXHRcdFx0VW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwXHJcblx0XHRdICksXHJcblxyXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5kZXB0aF92ZXJ0LFxyXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLmRlcHRoX2ZyYWdcclxuXHJcblx0fSxcclxuXHJcblx0bm9ybWFsOiB7XHJcblxyXG5cdFx0dW5pZm9ybXM6IC8qQF9fUFVSRV9fKi8gbWVyZ2VVbmlmb3JtcyggW1xyXG5cdFx0XHRVbmlmb3Jtc0xpYi5jb21tb24sXHJcblx0XHRcdFVuaWZvcm1zTGliLmJ1bXBtYXAsXHJcblx0XHRcdFVuaWZvcm1zTGliLm5vcm1hbG1hcCxcclxuXHRcdFx0VW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwLFxyXG5cdFx0XHR7XHJcblx0XHRcdFx0b3BhY2l0eTogeyB2YWx1ZTogMS4wIH1cclxuXHRcdFx0fVxyXG5cdFx0XSApLFxyXG5cclxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaG5vcm1hbF92ZXJ0LFxyXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hub3JtYWxfZnJhZ1xyXG5cclxuXHR9LFxyXG5cclxuXHRzcHJpdGU6IHtcclxuXHJcblx0XHR1bmlmb3JtczogLypAX19QVVJFX18qLyBtZXJnZVVuaWZvcm1zKCBbXHJcblx0XHRcdFVuaWZvcm1zTGliLnNwcml0ZSxcclxuXHRcdFx0VW5pZm9ybXNMaWIuZm9nXHJcblx0XHRdICksXHJcblxyXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5zcHJpdGVfdmVydCxcclxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5zcHJpdGVfZnJhZ1xyXG5cclxuXHR9LFxyXG5cclxuXHRiYWNrZ3JvdW5kOiB7XHJcblxyXG5cdFx0dW5pZm9ybXM6IHtcclxuXHRcdFx0dXZUcmFuc2Zvcm06IHsgdmFsdWU6IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDMoKSB9LFxyXG5cdFx0XHR0MkQ6IHsgdmFsdWU6IG51bGwgfSxcclxuXHRcdFx0YmFja2dyb3VuZEludGVuc2l0eTogeyB2YWx1ZTogMSB9XHJcblx0XHR9LFxyXG5cclxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsuYmFja2dyb3VuZF92ZXJ0LFxyXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLmJhY2tncm91bmRfZnJhZ1xyXG5cclxuXHR9LFxyXG5cclxuXHRiYWNrZ3JvdW5kQ3ViZToge1xyXG5cclxuXHRcdHVuaWZvcm1zOiB7XHJcblx0XHRcdGVudk1hcDogeyB2YWx1ZTogbnVsbCB9LFxyXG5cdFx0XHRmbGlwRW52TWFwOiB7IHZhbHVlOiAtIDEgfSxcclxuXHRcdFx0YmFja2dyb3VuZEJsdXJyaW5lc3M6IHsgdmFsdWU6IDAgfSxcclxuXHRcdFx0YmFja2dyb3VuZEludGVuc2l0eTogeyB2YWx1ZTogMSB9LFxyXG5cdFx0XHRiYWNrZ3JvdW5kUm90YXRpb246IHsgdmFsdWU6IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDMoKSB9XHJcblx0XHR9LFxyXG5cclxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsuYmFja2dyb3VuZEN1YmVfdmVydCxcclxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5iYWNrZ3JvdW5kQ3ViZV9mcmFnXHJcblxyXG5cdH0sXHJcblxyXG5cdGN1YmU6IHtcclxuXHJcblx0XHR1bmlmb3Jtczoge1xyXG5cdFx0XHR0Q3ViZTogeyB2YWx1ZTogbnVsbCB9LFxyXG5cdFx0XHR0RmxpcDogeyB2YWx1ZTogLSAxIH0sXHJcblx0XHRcdG9wYWNpdHk6IHsgdmFsdWU6IDEuMCB9XHJcblx0XHR9LFxyXG5cclxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsuY3ViZV92ZXJ0LFxyXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLmN1YmVfZnJhZ1xyXG5cclxuXHR9LFxyXG5cclxuXHRlcXVpcmVjdDoge1xyXG5cclxuXHRcdHVuaWZvcm1zOiB7XHJcblx0XHRcdHRFcXVpcmVjdDogeyB2YWx1ZTogbnVsbCB9LFxyXG5cdFx0fSxcclxuXHJcblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLmVxdWlyZWN0X3ZlcnQsXHJcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsuZXF1aXJlY3RfZnJhZ1xyXG5cclxuXHR9LFxyXG5cclxuXHRkaXN0YW5jZVJHQkE6IHtcclxuXHJcblx0XHR1bmlmb3JtczogLypAX19QVVJFX18qLyBtZXJnZVVuaWZvcm1zKCBbXHJcblx0XHRcdFVuaWZvcm1zTGliLmNvbW1vbixcclxuXHRcdFx0VW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwLFxyXG5cdFx0XHR7XHJcblx0XHRcdFx0cmVmZXJlbmNlUG9zaXRpb246IHsgdmFsdWU6IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKSB9LFxyXG5cdFx0XHRcdG5lYXJEaXN0YW5jZTogeyB2YWx1ZTogMSB9LFxyXG5cdFx0XHRcdGZhckRpc3RhbmNlOiB7IHZhbHVlOiAxMDAwIH1cclxuXHRcdFx0fVxyXG5cdFx0XSApLFxyXG5cclxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsuZGlzdGFuY2VSR0JBX3ZlcnQsXHJcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsuZGlzdGFuY2VSR0JBX2ZyYWdcclxuXHJcblx0fSxcclxuXHJcblx0c2hhZG93OiB7XHJcblxyXG5cdFx0dW5pZm9ybXM6IC8qQF9fUFVSRV9fKi8gbWVyZ2VVbmlmb3JtcyggW1xyXG5cdFx0XHRVbmlmb3Jtc0xpYi5saWdodHMsXHJcblx0XHRcdFVuaWZvcm1zTGliLmZvZyxcclxuXHRcdFx0e1xyXG5cdFx0XHRcdGNvbG9yOiB7IHZhbHVlOiAvKkBfX1BVUkVfXyovIG5ldyBDb2xvciggMHgwMDAwMCApIH0sXHJcblx0XHRcdFx0b3BhY2l0eTogeyB2YWx1ZTogMS4wIH1cclxuXHRcdFx0fSxcclxuXHRcdF0gKSxcclxuXHJcblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLnNoYWRvd192ZXJ0LFxyXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLnNoYWRvd19mcmFnXHJcblxyXG5cdH1cclxuXHJcbn07XHJcblxyXG5TaGFkZXJMaWIucGh5c2ljYWwgPSB7XHJcblxyXG5cdHVuaWZvcm1zOiAvKkBfX1BVUkVfXyovIG1lcmdlVW5pZm9ybXMoIFtcclxuXHRcdFNoYWRlckxpYi5zdGFuZGFyZC51bmlmb3JtcyxcclxuXHRcdHtcclxuXHRcdFx0Y2xlYXJjb2F0OiB7IHZhbHVlOiAwIH0sXHJcblx0XHRcdGNsZWFyY29hdE1hcDogeyB2YWx1ZTogbnVsbCB9LFxyXG5cdFx0XHRjbGVhcmNvYXRNYXBUcmFuc2Zvcm06IHsgdmFsdWU6IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDMoKSB9LFxyXG5cdFx0XHRjbGVhcmNvYXROb3JtYWxNYXA6IHsgdmFsdWU6IG51bGwgfSxcclxuXHRcdFx0Y2xlYXJjb2F0Tm9ybWFsTWFwVHJhbnNmb3JtOiB7IHZhbHVlOiAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXgzKCkgfSxcclxuXHRcdFx0Y2xlYXJjb2F0Tm9ybWFsU2NhbGU6IHsgdmFsdWU6IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjIoIDEsIDEgKSB9LFxyXG5cdFx0XHRjbGVhcmNvYXRSb3VnaG5lc3M6IHsgdmFsdWU6IDAgfSxcclxuXHRcdFx0Y2xlYXJjb2F0Um91Z2huZXNzTWFwOiB7IHZhbHVlOiBudWxsIH0sXHJcblx0XHRcdGNsZWFyY29hdFJvdWdobmVzc01hcFRyYW5zZm9ybTogeyB2YWx1ZTogLypAX19QVVJFX18qLyBuZXcgTWF0cml4MygpIH0sXHJcblx0XHRcdGRpc3BlcnNpb246IHsgdmFsdWU6IDAgfSxcclxuXHRcdFx0aXJpZGVzY2VuY2U6IHsgdmFsdWU6IDAgfSxcclxuXHRcdFx0aXJpZGVzY2VuY2VNYXA6IHsgdmFsdWU6IG51bGwgfSxcclxuXHRcdFx0aXJpZGVzY2VuY2VNYXBUcmFuc2Zvcm06IHsgdmFsdWU6IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDMoKSB9LFxyXG5cdFx0XHRpcmlkZXNjZW5jZUlPUjogeyB2YWx1ZTogMS4zIH0sXHJcblx0XHRcdGlyaWRlc2NlbmNlVGhpY2tuZXNzTWluaW11bTogeyB2YWx1ZTogMTAwIH0sXHJcblx0XHRcdGlyaWRlc2NlbmNlVGhpY2tuZXNzTWF4aW11bTogeyB2YWx1ZTogNDAwIH0sXHJcblx0XHRcdGlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwOiB7IHZhbHVlOiBudWxsIH0sXHJcblx0XHRcdGlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwVHJhbnNmb3JtOiB7IHZhbHVlOiAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXgzKCkgfSxcclxuXHRcdFx0c2hlZW46IHsgdmFsdWU6IDAgfSxcclxuXHRcdFx0c2hlZW5Db2xvcjogeyB2YWx1ZTogLypAX19QVVJFX18qLyBuZXcgQ29sb3IoIDB4MDAwMDAwICkgfSxcclxuXHRcdFx0c2hlZW5Db2xvck1hcDogeyB2YWx1ZTogbnVsbCB9LFxyXG5cdFx0XHRzaGVlbkNvbG9yTWFwVHJhbnNmb3JtOiB7IHZhbHVlOiAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXgzKCkgfSxcclxuXHRcdFx0c2hlZW5Sb3VnaG5lc3M6IHsgdmFsdWU6IDEgfSxcclxuXHRcdFx0c2hlZW5Sb3VnaG5lc3NNYXA6IHsgdmFsdWU6IG51bGwgfSxcclxuXHRcdFx0c2hlZW5Sb3VnaG5lc3NNYXBUcmFuc2Zvcm06IHsgdmFsdWU6IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDMoKSB9LFxyXG5cdFx0XHR0cmFuc21pc3Npb246IHsgdmFsdWU6IDAgfSxcclxuXHRcdFx0dHJhbnNtaXNzaW9uTWFwOiB7IHZhbHVlOiBudWxsIH0sXHJcblx0XHRcdHRyYW5zbWlzc2lvbk1hcFRyYW5zZm9ybTogeyB2YWx1ZTogLypAX19QVVJFX18qLyBuZXcgTWF0cml4MygpIH0sXHJcblx0XHRcdHRyYW5zbWlzc2lvblNhbXBsZXJTaXplOiB7IHZhbHVlOiAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IyKCkgfSxcclxuXHRcdFx0dHJhbnNtaXNzaW9uU2FtcGxlck1hcDogeyB2YWx1ZTogbnVsbCB9LFxyXG5cdFx0XHR0aGlja25lc3M6IHsgdmFsdWU6IDAgfSxcclxuXHRcdFx0dGhpY2tuZXNzTWFwOiB7IHZhbHVlOiBudWxsIH0sXHJcblx0XHRcdHRoaWNrbmVzc01hcFRyYW5zZm9ybTogeyB2YWx1ZTogLypAX19QVVJFX18qLyBuZXcgTWF0cml4MygpIH0sXHJcblx0XHRcdGF0dGVudWF0aW9uRGlzdGFuY2U6IHsgdmFsdWU6IDAgfSxcclxuXHRcdFx0YXR0ZW51YXRpb25Db2xvcjogeyB2YWx1ZTogLypAX19QVVJFX18qLyBuZXcgQ29sb3IoIDB4MDAwMDAwICkgfSxcclxuXHRcdFx0c3BlY3VsYXJDb2xvcjogeyB2YWx1ZTogLypAX19QVVJFX18qLyBuZXcgQ29sb3IoIDEsIDEsIDEgKSB9LFxyXG5cdFx0XHRzcGVjdWxhckNvbG9yTWFwOiB7IHZhbHVlOiBudWxsIH0sXHJcblx0XHRcdHNwZWN1bGFyQ29sb3JNYXBUcmFuc2Zvcm06IHsgdmFsdWU6IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDMoKSB9LFxyXG5cdFx0XHRzcGVjdWxhckludGVuc2l0eTogeyB2YWx1ZTogMSB9LFxyXG5cdFx0XHRzcGVjdWxhckludGVuc2l0eU1hcDogeyB2YWx1ZTogbnVsbCB9LFxyXG5cdFx0XHRzcGVjdWxhckludGVuc2l0eU1hcFRyYW5zZm9ybTogeyB2YWx1ZTogLypAX19QVVJFX18qLyBuZXcgTWF0cml4MygpIH0sXHJcblx0XHRcdGFuaXNvdHJvcHlWZWN0b3I6IHsgdmFsdWU6IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjIoKSB9LFxyXG5cdFx0XHRhbmlzb3Ryb3B5TWFwOiB7IHZhbHVlOiBudWxsIH0sXHJcblx0XHRcdGFuaXNvdHJvcHlNYXBUcmFuc2Zvcm06IHsgdmFsdWU6IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDMoKSB9LFxyXG5cdFx0fVxyXG5cdF0gKSxcclxuXHJcblx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNocGh5c2ljYWxfdmVydCxcclxuXHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHBoeXNpY2FsX2ZyYWdcclxuXHJcbn07XHJcblxyXG5cclxuZXhwb3J0IHsgU2hhZGVyTGliIH07XHJcbiIsImltcG9ydCB7IEJhY2tTaWRlLCBGcm9udFNpZGUsIEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nLCBTUkdCVHJhbnNmZXIgfSBmcm9tICcuLi8uLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBCb3hHZW9tZXRyeSB9IGZyb20gJy4uLy4uL2dlb21ldHJpZXMvQm94R2VvbWV0cnkuanMnO1xyXG5pbXBvcnQgeyBQbGFuZUdlb21ldHJ5IH0gZnJvbSAnLi4vLi4vZ2VvbWV0cmllcy9QbGFuZUdlb21ldHJ5LmpzJztcclxuaW1wb3J0IHsgU2hhZGVyTWF0ZXJpYWwgfSBmcm9tICcuLi8uLi9tYXRlcmlhbHMvU2hhZGVyTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uLy4uL21hdGgvQ29sb3IuanMnO1xyXG5pbXBvcnQgeyBDb2xvck1hbmFnZW1lbnQgfSBmcm9tICcuLi8uLi9tYXRoL0NvbG9yTWFuYWdlbWVudC5qcyc7XHJcbmltcG9ydCB7IEV1bGVyIH0gZnJvbSAnLi4vLi4vbWF0aC9FdWxlci5qcyc7XHJcbmltcG9ydCB7IE1hdHJpeDQgfSBmcm9tICcuLi8uLi9tYXRoL01hdHJpeDQuanMnO1xyXG5pbXBvcnQgeyBNZXNoIH0gZnJvbSAnLi4vLi4vb2JqZWN0cy9NZXNoLmpzJztcclxuaW1wb3J0IHsgU2hhZGVyTGliIH0gZnJvbSAnLi4vc2hhZGVycy9TaGFkZXJMaWIuanMnO1xyXG5pbXBvcnQgeyBjbG9uZVVuaWZvcm1zLCBnZXRVbmxpdFVuaWZvcm1Db2xvclNwYWNlIH0gZnJvbSAnLi4vc2hhZGVycy9Vbmlmb3Jtc1V0aWxzLmpzJztcclxuXHJcbmNvbnN0IF9yZ2IgPSB7IHI6IDAsIGI6IDAsIGc6IDAgfTtcclxuY29uc3QgX2UxID0gLypAX19QVVJFX18qLyBuZXcgRXVsZXIoKTtcclxuY29uc3QgX20xID0gLypAX19QVVJFX18qLyBuZXcgTWF0cml4NCgpO1xyXG5cclxuZnVuY3Rpb24gV2ViR0xCYWNrZ3JvdW5kKCByZW5kZXJlciwgY3ViZW1hcHMsIGN1YmV1dm1hcHMsIHN0YXRlLCBvYmplY3RzLCBhbHBoYSwgcHJlbXVsdGlwbGllZEFscGhhICkge1xyXG5cclxuXHRjb25zdCBjbGVhckNvbG9yID0gbmV3IENvbG9yKCAweDAwMDAwMCApO1xyXG5cdGxldCBjbGVhckFscGhhID0gYWxwaGEgPT09IHRydWUgPyAwIDogMTtcclxuXHJcblx0bGV0IHBsYW5lTWVzaDtcclxuXHRsZXQgYm94TWVzaDtcclxuXHJcblx0bGV0IGN1cnJlbnRCYWNrZ3JvdW5kID0gbnVsbDtcclxuXHRsZXQgY3VycmVudEJhY2tncm91bmRWZXJzaW9uID0gMDtcclxuXHRsZXQgY3VycmVudFRvbmVtYXBwaW5nID0gbnVsbDtcclxuXHJcblx0ZnVuY3Rpb24gZ2V0QmFja2dyb3VuZCggc2NlbmUgKSB7XHJcblxyXG5cdFx0bGV0IGJhY2tncm91bmQgPSBzY2VuZS5pc1NjZW5lID09PSB0cnVlID8gc2NlbmUuYmFja2dyb3VuZCA6IG51bGw7XHJcblxyXG5cdFx0aWYgKCBiYWNrZ3JvdW5kICYmIGJhY2tncm91bmQuaXNUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdXNlUE1SRU0gPSBzY2VuZS5iYWNrZ3JvdW5kQmx1cnJpbmVzcyA+IDA7IC8vIHVzZSBQTVJFTSBpZiB0aGUgdXNlciB3YW50cyB0byBibHVyIHRoZSBiYWNrZ3JvdW5kXHJcblx0XHRcdGJhY2tncm91bmQgPSAoIHVzZVBNUkVNID8gY3ViZXV2bWFwcyA6IGN1YmVtYXBzICkuZ2V0KCBiYWNrZ3JvdW5kICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBiYWNrZ3JvdW5kO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHJlbmRlciggc2NlbmUgKSB7XHJcblxyXG5cdFx0bGV0IGZvcmNlQ2xlYXIgPSBmYWxzZTtcclxuXHRcdGNvbnN0IGJhY2tncm91bmQgPSBnZXRCYWNrZ3JvdW5kKCBzY2VuZSApO1xyXG5cclxuXHRcdGlmICggYmFja2dyb3VuZCA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHNldENsZWFyKCBjbGVhckNvbG9yLCBjbGVhckFscGhhICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggYmFja2dyb3VuZCAmJiBiYWNrZ3JvdW5kLmlzQ29sb3IgKSB7XHJcblxyXG5cdFx0XHRzZXRDbGVhciggYmFja2dyb3VuZCwgMSApO1xyXG5cdFx0XHRmb3JjZUNsZWFyID0gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgZW52aXJvbm1lbnRCbGVuZE1vZGUgPSByZW5kZXJlci54ci5nZXRFbnZpcm9ubWVudEJsZW5kTW9kZSgpO1xyXG5cclxuXHRcdGlmICggZW52aXJvbm1lbnRCbGVuZE1vZGUgPT09ICdhZGRpdGl2ZScgKSB7XHJcblxyXG5cdFx0XHRzdGF0ZS5idWZmZXJzLmNvbG9yLnNldENsZWFyKCAwLCAwLCAwLCAxLCBwcmVtdWx0aXBsaWVkQWxwaGEgKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBlbnZpcm9ubWVudEJsZW5kTW9kZSA9PT0gJ2FscGhhLWJsZW5kJyApIHtcclxuXHJcblx0XHRcdHN0YXRlLmJ1ZmZlcnMuY29sb3Iuc2V0Q2xlYXIoIDAsIDAsIDAsIDAsIHByZW11bHRpcGxpZWRBbHBoYSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHJlbmRlcmVyLmF1dG9DbGVhciB8fCBmb3JjZUNsZWFyICkge1xyXG5cclxuXHRcdFx0Ly8gYnVmZmVycyBtaWdodCBub3QgYmUgd3JpdGFibGUgd2hpY2ggaXMgcmVxdWlyZWQgdG8gZW5zdXJlIGEgY29ycmVjdCBjbGVhclxyXG5cclxuXHRcdFx0c3RhdGUuYnVmZmVycy5kZXB0aC5zZXRUZXN0KCB0cnVlICk7XHJcblx0XHRcdHN0YXRlLmJ1ZmZlcnMuZGVwdGguc2V0TWFzayggdHJ1ZSApO1xyXG5cdFx0XHRzdGF0ZS5idWZmZXJzLmNvbG9yLnNldE1hc2soIHRydWUgKTtcclxuXHJcblx0XHRcdHJlbmRlcmVyLmNsZWFyKCByZW5kZXJlci5hdXRvQ2xlYXJDb2xvciwgcmVuZGVyZXIuYXV0b0NsZWFyRGVwdGgsIHJlbmRlcmVyLmF1dG9DbGVhclN0ZW5jaWwgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gYWRkVG9SZW5kZXJMaXN0KCByZW5kZXJMaXN0LCBzY2VuZSApIHtcclxuXHJcblx0XHRjb25zdCBiYWNrZ3JvdW5kID0gZ2V0QmFja2dyb3VuZCggc2NlbmUgKTtcclxuXHJcblx0XHRpZiAoIGJhY2tncm91bmQgJiYgKCBiYWNrZ3JvdW5kLmlzQ3ViZVRleHR1cmUgfHwgYmFja2dyb3VuZC5tYXBwaW5nID09PSBDdWJlVVZSZWZsZWN0aW9uTWFwcGluZyApICkge1xyXG5cclxuXHRcdFx0aWYgKCBib3hNZXNoID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGJveE1lc2ggPSBuZXcgTWVzaChcclxuXHRcdFx0XHRcdG5ldyBCb3hHZW9tZXRyeSggMSwgMSwgMSApLFxyXG5cdFx0XHRcdFx0bmV3IFNoYWRlck1hdGVyaWFsKCB7XHJcblx0XHRcdFx0XHRcdG5hbWU6ICdCYWNrZ3JvdW5kQ3ViZU1hdGVyaWFsJyxcclxuXHRcdFx0XHRcdFx0dW5pZm9ybXM6IGNsb25lVW5pZm9ybXMoIFNoYWRlckxpYi5iYWNrZ3JvdW5kQ3ViZS51bmlmb3JtcyApLFxyXG5cdFx0XHRcdFx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckxpYi5iYWNrZ3JvdW5kQ3ViZS52ZXJ0ZXhTaGFkZXIsXHJcblx0XHRcdFx0XHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJMaWIuYmFja2dyb3VuZEN1YmUuZnJhZ21lbnRTaGFkZXIsXHJcblx0XHRcdFx0XHRcdHNpZGU6IEJhY2tTaWRlLFxyXG5cdFx0XHRcdFx0XHRkZXB0aFRlc3Q6IGZhbHNlLFxyXG5cdFx0XHRcdFx0XHRkZXB0aFdyaXRlOiBmYWxzZSxcclxuXHRcdFx0XHRcdFx0Zm9nOiBmYWxzZSxcclxuXHRcdFx0XHRcdFx0YWxsb3dPdmVycmlkZTogZmFsc2VcclxuXHRcdFx0XHRcdH0gKVxyXG5cdFx0XHRcdCk7XHJcblxyXG5cdFx0XHRcdGJveE1lc2guZ2VvbWV0cnkuZGVsZXRlQXR0cmlidXRlKCAnbm9ybWFsJyApO1xyXG5cdFx0XHRcdGJveE1lc2guZ2VvbWV0cnkuZGVsZXRlQXR0cmlidXRlKCAndXYnICk7XHJcblxyXG5cdFx0XHRcdGJveE1lc2gub25CZWZvcmVSZW5kZXIgPSBmdW5jdGlvbiAoIHJlbmRlcmVyLCBzY2VuZSwgY2FtZXJhICkge1xyXG5cclxuXHRcdFx0XHRcdHRoaXMubWF0cml4V29ybGQuY29weVBvc2l0aW9uKCBjYW1lcmEubWF0cml4V29ybGQgKTtcclxuXHJcblx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0Ly8gYWRkIFwiZW52TWFwXCIgbWF0ZXJpYWwgcHJvcGVydHkgc28gdGhlIHJlbmRlcmVyIGNhbiBldmFsdWF0ZSBpdCBsaWtlIGZvciBidWlsdC1pbiBtYXRlcmlhbHNcclxuXHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIGJveE1lc2gubWF0ZXJpYWwsICdlbnZNYXAnLCB7XHJcblxyXG5cdFx0XHRcdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy51bmlmb3Jtcy5lbnZNYXAudmFsdWU7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRcdG9iamVjdHMudXBkYXRlKCBib3hNZXNoICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRfZTEuY29weSggc2NlbmUuYmFja2dyb3VuZFJvdGF0aW9uICk7XHJcblxyXG5cdFx0XHQvLyBhY2NvbW1vZGF0ZSBsZWZ0LWhhbmRlZCBmcmFtZVxyXG5cdFx0XHRfZTEueCAqPSAtIDE7IF9lMS55ICo9IC0gMTsgX2UxLnogKj0gLSAxO1xyXG5cclxuXHRcdFx0aWYgKCBiYWNrZ3JvdW5kLmlzQ3ViZVRleHR1cmUgJiYgYmFja2dyb3VuZC5pc1JlbmRlclRhcmdldFRleHR1cmUgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0XHQvLyBlbnZpcm9ubWVudCBtYXBzIHdoaWNoIGFyZSBub3QgY3ViZSByZW5kZXIgdGFyZ2V0cyBvciBQTVJFTXMgZm9sbG93IGEgZGlmZmVyZW50IGNvbnZlbnRpb25cclxuXHRcdFx0XHRfZTEueSAqPSAtIDE7XHJcblx0XHRcdFx0X2UxLnogKj0gLSAxO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ym94TWVzaC5tYXRlcmlhbC51bmlmb3Jtcy5lbnZNYXAudmFsdWUgPSBiYWNrZ3JvdW5kO1xyXG5cdFx0XHRib3hNZXNoLm1hdGVyaWFsLnVuaWZvcm1zLmZsaXBFbnZNYXAudmFsdWUgPSAoIGJhY2tncm91bmQuaXNDdWJlVGV4dHVyZSAmJiBiYWNrZ3JvdW5kLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSA9PT0gZmFsc2UgKSA/IC0gMSA6IDE7XHJcblx0XHRcdGJveE1lc2gubWF0ZXJpYWwudW5pZm9ybXMuYmFja2dyb3VuZEJsdXJyaW5lc3MudmFsdWUgPSBzY2VuZS5iYWNrZ3JvdW5kQmx1cnJpbmVzcztcclxuXHRcdFx0Ym94TWVzaC5tYXRlcmlhbC51bmlmb3Jtcy5iYWNrZ3JvdW5kSW50ZW5zaXR5LnZhbHVlID0gc2NlbmUuYmFja2dyb3VuZEludGVuc2l0eTtcclxuXHRcdFx0Ym94TWVzaC5tYXRlcmlhbC51bmlmb3Jtcy5iYWNrZ3JvdW5kUm90YXRpb24udmFsdWUuc2V0RnJvbU1hdHJpeDQoIF9tMS5tYWtlUm90YXRpb25Gcm9tRXVsZXIoIF9lMSApICk7XHJcblx0XHRcdGJveE1lc2gubWF0ZXJpYWwudG9uZU1hcHBlZCA9IENvbG9yTWFuYWdlbWVudC5nZXRUcmFuc2ZlciggYmFja2dyb3VuZC5jb2xvclNwYWNlICkgIT09IFNSR0JUcmFuc2ZlcjtcclxuXHJcblx0XHRcdGlmICggY3VycmVudEJhY2tncm91bmQgIT09IGJhY2tncm91bmQgfHxcclxuXHRcdFx0XHRjdXJyZW50QmFja2dyb3VuZFZlcnNpb24gIT09IGJhY2tncm91bmQudmVyc2lvbiB8fFxyXG5cdFx0XHRcdGN1cnJlbnRUb25lbWFwcGluZyAhPT0gcmVuZGVyZXIudG9uZU1hcHBpbmcgKSB7XHJcblxyXG5cdFx0XHRcdGJveE1lc2gubWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHRjdXJyZW50QmFja2dyb3VuZCA9IGJhY2tncm91bmQ7XHJcblx0XHRcdFx0Y3VycmVudEJhY2tncm91bmRWZXJzaW9uID0gYmFja2dyb3VuZC52ZXJzaW9uO1xyXG5cdFx0XHRcdGN1cnJlbnRUb25lbWFwcGluZyA9IHJlbmRlcmVyLnRvbmVNYXBwaW5nO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ym94TWVzaC5sYXllcnMuZW5hYmxlQWxsKCk7XHJcblxyXG5cdFx0XHQvLyBwdXNoIHRvIHRoZSBwcmUtc29ydGVkIG9wYXF1ZSByZW5kZXIgbGlzdFxyXG5cdFx0XHRyZW5kZXJMaXN0LnVuc2hpZnQoIGJveE1lc2gsIGJveE1lc2guZ2VvbWV0cnksIGJveE1lc2gubWF0ZXJpYWwsIDAsIDAsIG51bGwgKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBiYWNrZ3JvdW5kICYmIGJhY2tncm91bmQuaXNUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0aWYgKCBwbGFuZU1lc2ggPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0cGxhbmVNZXNoID0gbmV3IE1lc2goXHJcblx0XHRcdFx0XHRuZXcgUGxhbmVHZW9tZXRyeSggMiwgMiApLFxyXG5cdFx0XHRcdFx0bmV3IFNoYWRlck1hdGVyaWFsKCB7XHJcblx0XHRcdFx0XHRcdG5hbWU6ICdCYWNrZ3JvdW5kTWF0ZXJpYWwnLFxyXG5cdFx0XHRcdFx0XHR1bmlmb3JtczogY2xvbmVVbmlmb3JtcyggU2hhZGVyTGliLmJhY2tncm91bmQudW5pZm9ybXMgKSxcclxuXHRcdFx0XHRcdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJMaWIuYmFja2dyb3VuZC52ZXJ0ZXhTaGFkZXIsXHJcblx0XHRcdFx0XHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJMaWIuYmFja2dyb3VuZC5mcmFnbWVudFNoYWRlcixcclxuXHRcdFx0XHRcdFx0c2lkZTogRnJvbnRTaWRlLFxyXG5cdFx0XHRcdFx0XHRkZXB0aFRlc3Q6IGZhbHNlLFxyXG5cdFx0XHRcdFx0XHRkZXB0aFdyaXRlOiBmYWxzZSxcclxuXHRcdFx0XHRcdFx0Zm9nOiBmYWxzZSxcclxuXHRcdFx0XHRcdFx0YWxsb3dPdmVycmlkZTogZmFsc2VcclxuXHRcdFx0XHRcdH0gKVxyXG5cdFx0XHRcdCk7XHJcblxyXG5cdFx0XHRcdHBsYW5lTWVzaC5nZW9tZXRyeS5kZWxldGVBdHRyaWJ1dGUoICdub3JtYWwnICk7XHJcblxyXG5cdFx0XHRcdC8vIGFkZCBcIm1hcFwiIG1hdGVyaWFsIHByb3BlcnR5IHNvIHRoZSByZW5kZXJlciBjYW4gZXZhbHVhdGUgaXQgbGlrZSBmb3IgYnVpbHQtaW4gbWF0ZXJpYWxzXHJcblx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCBwbGFuZU1lc2gubWF0ZXJpYWwsICdtYXAnLCB7XHJcblxyXG5cdFx0XHRcdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy51bmlmb3Jtcy50MkQudmFsdWU7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRcdG9iamVjdHMudXBkYXRlKCBwbGFuZU1lc2ggKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHBsYW5lTWVzaC5tYXRlcmlhbC51bmlmb3Jtcy50MkQudmFsdWUgPSBiYWNrZ3JvdW5kO1xyXG5cdFx0XHRwbGFuZU1lc2gubWF0ZXJpYWwudW5pZm9ybXMuYmFja2dyb3VuZEludGVuc2l0eS52YWx1ZSA9IHNjZW5lLmJhY2tncm91bmRJbnRlbnNpdHk7XHJcblx0XHRcdHBsYW5lTWVzaC5tYXRlcmlhbC50b25lTWFwcGVkID0gQ29sb3JNYW5hZ2VtZW50LmdldFRyYW5zZmVyKCBiYWNrZ3JvdW5kLmNvbG9yU3BhY2UgKSAhPT0gU1JHQlRyYW5zZmVyO1xyXG5cclxuXHRcdFx0aWYgKCBiYWNrZ3JvdW5kLm1hdHJpeEF1dG9VcGRhdGUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdGJhY2tncm91bmQudXBkYXRlTWF0cml4KCk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRwbGFuZU1lc2gubWF0ZXJpYWwudW5pZm9ybXMudXZUcmFuc2Zvcm0udmFsdWUuY29weSggYmFja2dyb3VuZC5tYXRyaXggKTtcclxuXHJcblx0XHRcdGlmICggY3VycmVudEJhY2tncm91bmQgIT09IGJhY2tncm91bmQgfHxcclxuXHRcdFx0XHRjdXJyZW50QmFja2dyb3VuZFZlcnNpb24gIT09IGJhY2tncm91bmQudmVyc2lvbiB8fFxyXG5cdFx0XHRcdGN1cnJlbnRUb25lbWFwcGluZyAhPT0gcmVuZGVyZXIudG9uZU1hcHBpbmcgKSB7XHJcblxyXG5cdFx0XHRcdHBsYW5lTWVzaC5tYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0XHRcdGN1cnJlbnRCYWNrZ3JvdW5kID0gYmFja2dyb3VuZDtcclxuXHRcdFx0XHRjdXJyZW50QmFja2dyb3VuZFZlcnNpb24gPSBiYWNrZ3JvdW5kLnZlcnNpb247XHJcblx0XHRcdFx0Y3VycmVudFRvbmVtYXBwaW5nID0gcmVuZGVyZXIudG9uZU1hcHBpbmc7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRwbGFuZU1lc2gubGF5ZXJzLmVuYWJsZUFsbCgpO1xyXG5cclxuXHRcdFx0Ly8gcHVzaCB0byB0aGUgcHJlLXNvcnRlZCBvcGFxdWUgcmVuZGVyIGxpc3RcclxuXHRcdFx0cmVuZGVyTGlzdC51bnNoaWZ0KCBwbGFuZU1lc2gsIHBsYW5lTWVzaC5nZW9tZXRyeSwgcGxhbmVNZXNoLm1hdGVyaWFsLCAwLCAwLCBudWxsICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHNldENsZWFyKCBjb2xvciwgYWxwaGEgKSB7XHJcblxyXG5cdFx0Y29sb3IuZ2V0UkdCKCBfcmdiLCBnZXRVbmxpdFVuaWZvcm1Db2xvclNwYWNlKCByZW5kZXJlciApICk7XHJcblxyXG5cdFx0c3RhdGUuYnVmZmVycy5jb2xvci5zZXRDbGVhciggX3JnYi5yLCBfcmdiLmcsIF9yZ2IuYiwgYWxwaGEsIHByZW11bHRpcGxpZWRBbHBoYSApO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0aWYgKCBib3hNZXNoICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRib3hNZXNoLmdlb21ldHJ5LmRpc3Bvc2UoKTtcclxuXHRcdFx0Ym94TWVzaC5tYXRlcmlhbC5kaXNwb3NlKCk7XHJcblxyXG5cdFx0XHRib3hNZXNoID0gdW5kZWZpbmVkO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHBsYW5lTWVzaCAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0cGxhbmVNZXNoLmdlb21ldHJ5LmRpc3Bvc2UoKTtcclxuXHRcdFx0cGxhbmVNZXNoLm1hdGVyaWFsLmRpc3Bvc2UoKTtcclxuXHJcblx0XHRcdHBsYW5lTWVzaCA9IHVuZGVmaW5lZDtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIHtcclxuXHJcblx0XHRnZXRDbGVhckNvbG9yOiBmdW5jdGlvbiAoKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gY2xlYXJDb2xvcjtcclxuXHJcblx0XHR9LFxyXG5cdFx0c2V0Q2xlYXJDb2xvcjogZnVuY3Rpb24gKCBjb2xvciwgYWxwaGEgPSAxICkge1xyXG5cclxuXHRcdFx0Y2xlYXJDb2xvci5zZXQoIGNvbG9yICk7XHJcblx0XHRcdGNsZWFyQWxwaGEgPSBhbHBoYTtcclxuXHRcdFx0c2V0Q2xlYXIoIGNsZWFyQ29sb3IsIGNsZWFyQWxwaGEgKTtcclxuXHJcblx0XHR9LFxyXG5cdFx0Z2V0Q2xlYXJBbHBoYTogZnVuY3Rpb24gKCkge1xyXG5cclxuXHRcdFx0cmV0dXJuIGNsZWFyQWxwaGE7XHJcblxyXG5cdFx0fSxcclxuXHRcdHNldENsZWFyQWxwaGE6IGZ1bmN0aW9uICggYWxwaGEgKSB7XHJcblxyXG5cdFx0XHRjbGVhckFscGhhID0gYWxwaGE7XHJcblx0XHRcdHNldENsZWFyKCBjbGVhckNvbG9yLCBjbGVhckFscGhhICk7XHJcblxyXG5cdFx0fSxcclxuXHRcdHJlbmRlcjogcmVuZGVyLFxyXG5cdFx0YWRkVG9SZW5kZXJMaXN0OiBhZGRUb1JlbmRlckxpc3QsXHJcblx0XHRkaXNwb3NlOiBkaXNwb3NlXHJcblxyXG5cdH07XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgV2ViR0xCYWNrZ3JvdW5kIH07XHJcbiIsImltcG9ydCB7IEludFR5cGUgfSBmcm9tICcuLi8uLi9jb25zdGFudHMuanMnO1xyXG5cclxuZnVuY3Rpb24gV2ViR0xCaW5kaW5nU3RhdGVzKCBnbCwgYXR0cmlidXRlcyApIHtcclxuXHJcblx0Y29uc3QgbWF4VmVydGV4QXR0cmlidXRlcyA9IGdsLmdldFBhcmFtZXRlciggZ2wuTUFYX1ZFUlRFWF9BVFRSSUJTICk7XHJcblxyXG5cdGNvbnN0IGJpbmRpbmdTdGF0ZXMgPSB7fTtcclxuXHJcblx0Y29uc3QgZGVmYXVsdFN0YXRlID0gY3JlYXRlQmluZGluZ1N0YXRlKCBudWxsICk7XHJcblx0bGV0IGN1cnJlbnRTdGF0ZSA9IGRlZmF1bHRTdGF0ZTtcclxuXHRsZXQgZm9yY2VVcGRhdGUgPSBmYWxzZTtcclxuXHJcblx0ZnVuY3Rpb24gc2V0dXAoIG9iamVjdCwgbWF0ZXJpYWwsIHByb2dyYW0sIGdlb21ldHJ5LCBpbmRleCApIHtcclxuXHJcblx0XHRsZXQgdXBkYXRlQnVmZmVycyA9IGZhbHNlO1xyXG5cclxuXHRcdGNvbnN0IHN0YXRlID0gZ2V0QmluZGluZ1N0YXRlKCBnZW9tZXRyeSwgcHJvZ3JhbSwgbWF0ZXJpYWwgKTtcclxuXHJcblx0XHRpZiAoIGN1cnJlbnRTdGF0ZSAhPT0gc3RhdGUgKSB7XHJcblxyXG5cdFx0XHRjdXJyZW50U3RhdGUgPSBzdGF0ZTtcclxuXHRcdFx0YmluZFZlcnRleEFycmF5T2JqZWN0KCBjdXJyZW50U3RhdGUub2JqZWN0ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHVwZGF0ZUJ1ZmZlcnMgPSBuZWVkc1VwZGF0ZSggb2JqZWN0LCBnZW9tZXRyeSwgcHJvZ3JhbSwgaW5kZXggKTtcclxuXHJcblx0XHRpZiAoIHVwZGF0ZUJ1ZmZlcnMgKSBzYXZlQ2FjaGUoIG9iamVjdCwgZ2VvbWV0cnksIHByb2dyYW0sIGluZGV4ICk7XHJcblxyXG5cdFx0aWYgKCBpbmRleCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGF0dHJpYnV0ZXMudXBkYXRlKCBpbmRleCwgZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB1cGRhdGVCdWZmZXJzIHx8IGZvcmNlVXBkYXRlICkge1xyXG5cclxuXHRcdFx0Zm9yY2VVcGRhdGUgPSBmYWxzZTtcclxuXHJcblx0XHRcdHNldHVwVmVydGV4QXR0cmlidXRlcyggb2JqZWN0LCBtYXRlcmlhbCwgcHJvZ3JhbSwgZ2VvbWV0cnkgKTtcclxuXHJcblx0XHRcdGlmICggaW5kZXggIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdGdsLmJpbmRCdWZmZXIoIGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBhdHRyaWJ1dGVzLmdldCggaW5kZXggKS5idWZmZXIgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gY3JlYXRlVmVydGV4QXJyYXlPYmplY3QoKSB7XHJcblxyXG5cdFx0cmV0dXJuIGdsLmNyZWF0ZVZlcnRleEFycmF5KCk7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gYmluZFZlcnRleEFycmF5T2JqZWN0KCB2YW8gKSB7XHJcblxyXG5cdFx0cmV0dXJuIGdsLmJpbmRWZXJ0ZXhBcnJheSggdmFvICk7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gZGVsZXRlVmVydGV4QXJyYXlPYmplY3QoIHZhbyApIHtcclxuXHJcblx0XHRyZXR1cm4gZ2wuZGVsZXRlVmVydGV4QXJyYXkoIHZhbyApO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGdldEJpbmRpbmdTdGF0ZSggZ2VvbWV0cnksIHByb2dyYW0sIG1hdGVyaWFsICkge1xyXG5cclxuXHRcdGNvbnN0IHdpcmVmcmFtZSA9ICggbWF0ZXJpYWwud2lyZWZyYW1lID09PSB0cnVlICk7XHJcblxyXG5cdFx0bGV0IHByb2dyYW1NYXAgPSBiaW5kaW5nU3RhdGVzWyBnZW9tZXRyeS5pZCBdO1xyXG5cclxuXHRcdGlmICggcHJvZ3JhbU1hcCA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0cHJvZ3JhbU1hcCA9IHt9O1xyXG5cdFx0XHRiaW5kaW5nU3RhdGVzWyBnZW9tZXRyeS5pZCBdID0gcHJvZ3JhbU1hcDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0bGV0IHN0YXRlTWFwID0gcHJvZ3JhbU1hcFsgcHJvZ3JhbS5pZCBdO1xyXG5cclxuXHRcdGlmICggc3RhdGVNYXAgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHN0YXRlTWFwID0ge307XHJcblx0XHRcdHByb2dyYW1NYXBbIHByb2dyYW0uaWQgXSA9IHN0YXRlTWFwO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRsZXQgc3RhdGUgPSBzdGF0ZU1hcFsgd2lyZWZyYW1lIF07XHJcblxyXG5cdFx0aWYgKCBzdGF0ZSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0c3RhdGUgPSBjcmVhdGVCaW5kaW5nU3RhdGUoIGNyZWF0ZVZlcnRleEFycmF5T2JqZWN0KCkgKTtcclxuXHRcdFx0c3RhdGVNYXBbIHdpcmVmcmFtZSBdID0gc3RhdGU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBzdGF0ZTtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBjcmVhdGVCaW5kaW5nU3RhdGUoIHZhbyApIHtcclxuXHJcblx0XHRjb25zdCBuZXdBdHRyaWJ1dGVzID0gW107XHJcblx0XHRjb25zdCBlbmFibGVkQXR0cmlidXRlcyA9IFtdO1xyXG5cdFx0Y29uc3QgYXR0cmlidXRlRGl2aXNvcnMgPSBbXTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBtYXhWZXJ0ZXhBdHRyaWJ1dGVzOyBpICsrICkge1xyXG5cclxuXHRcdFx0bmV3QXR0cmlidXRlc1sgaSBdID0gMDtcclxuXHRcdFx0ZW5hYmxlZEF0dHJpYnV0ZXNbIGkgXSA9IDA7XHJcblx0XHRcdGF0dHJpYnV0ZURpdmlzb3JzWyBpIF0gPSAwO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4ge1xyXG5cclxuXHRcdFx0Ly8gZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgb24gbm9uLVZBTyBzdXBwb3J0IGJyb3dzZXJcclxuXHRcdFx0Z2VvbWV0cnk6IG51bGwsXHJcblx0XHRcdHByb2dyYW06IG51bGwsXHJcblx0XHRcdHdpcmVmcmFtZTogZmFsc2UsXHJcblxyXG5cdFx0XHRuZXdBdHRyaWJ1dGVzOiBuZXdBdHRyaWJ1dGVzLFxyXG5cdFx0XHRlbmFibGVkQXR0cmlidXRlczogZW5hYmxlZEF0dHJpYnV0ZXMsXHJcblx0XHRcdGF0dHJpYnV0ZURpdmlzb3JzOiBhdHRyaWJ1dGVEaXZpc29ycyxcclxuXHRcdFx0b2JqZWN0OiB2YW8sXHJcblx0XHRcdGF0dHJpYnV0ZXM6IHt9LFxyXG5cdFx0XHRpbmRleDogbnVsbFxyXG5cclxuXHRcdH07XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gbmVlZHNVcGRhdGUoIG9iamVjdCwgZ2VvbWV0cnksIHByb2dyYW0sIGluZGV4ICkge1xyXG5cclxuXHRcdGNvbnN0IGNhY2hlZEF0dHJpYnV0ZXMgPSBjdXJyZW50U3RhdGUuYXR0cmlidXRlcztcclxuXHRcdGNvbnN0IGdlb21ldHJ5QXR0cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXM7XHJcblxyXG5cdFx0bGV0IGF0dHJpYnV0ZXNOdW0gPSAwO1xyXG5cclxuXHRcdGNvbnN0IHByb2dyYW1BdHRyaWJ1dGVzID0gcHJvZ3JhbS5nZXRBdHRyaWJ1dGVzKCk7XHJcblxyXG5cdFx0Zm9yICggY29uc3QgbmFtZSBpbiBwcm9ncmFtQXR0cmlidXRlcyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHByb2dyYW1BdHRyaWJ1dGUgPSBwcm9ncmFtQXR0cmlidXRlc1sgbmFtZSBdO1xyXG5cclxuXHRcdFx0aWYgKCBwcm9ncmFtQXR0cmlidXRlLmxvY2F0aW9uID49IDAgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGNhY2hlZEF0dHJpYnV0ZSA9IGNhY2hlZEF0dHJpYnV0ZXNbIG5hbWUgXTtcclxuXHRcdFx0XHRsZXQgZ2VvbWV0cnlBdHRyaWJ1dGUgPSBnZW9tZXRyeUF0dHJpYnV0ZXNbIG5hbWUgXTtcclxuXHJcblx0XHRcdFx0aWYgKCBnZW9tZXRyeUF0dHJpYnV0ZSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdGlmICggbmFtZSA9PT0gJ2luc3RhbmNlTWF0cml4JyAmJiBvYmplY3QuaW5zdGFuY2VNYXRyaXggKSBnZW9tZXRyeUF0dHJpYnV0ZSA9IG9iamVjdC5pbnN0YW5jZU1hdHJpeDtcclxuXHRcdFx0XHRcdGlmICggbmFtZSA9PT0gJ2luc3RhbmNlQ29sb3InICYmIG9iamVjdC5pbnN0YW5jZUNvbG9yICkgZ2VvbWV0cnlBdHRyaWJ1dGUgPSBvYmplY3QuaW5zdGFuY2VDb2xvcjtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoIGNhY2hlZEF0dHJpYnV0ZSA9PT0gdW5kZWZpbmVkICkgcmV0dXJuIHRydWU7XHJcblxyXG5cdFx0XHRcdGlmICggY2FjaGVkQXR0cmlidXRlLmF0dHJpYnV0ZSAhPT0gZ2VvbWV0cnlBdHRyaWJ1dGUgKSByZXR1cm4gdHJ1ZTtcclxuXHJcblx0XHRcdFx0aWYgKCBnZW9tZXRyeUF0dHJpYnV0ZSAmJiBjYWNoZWRBdHRyaWJ1dGUuZGF0YSAhPT0gZ2VvbWV0cnlBdHRyaWJ1dGUuZGF0YSApIHJldHVybiB0cnVlO1xyXG5cclxuXHRcdFx0XHRhdHRyaWJ1dGVzTnVtICsrO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGN1cnJlbnRTdGF0ZS5hdHRyaWJ1dGVzTnVtICE9PSBhdHRyaWJ1dGVzTnVtICkgcmV0dXJuIHRydWU7XHJcblxyXG5cdFx0aWYgKCBjdXJyZW50U3RhdGUuaW5kZXggIT09IGluZGV4ICkgcmV0dXJuIHRydWU7XHJcblxyXG5cdFx0cmV0dXJuIGZhbHNlO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHNhdmVDYWNoZSggb2JqZWN0LCBnZW9tZXRyeSwgcHJvZ3JhbSwgaW5kZXggKSB7XHJcblxyXG5cdFx0Y29uc3QgY2FjaGUgPSB7fTtcclxuXHRcdGNvbnN0IGF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzO1xyXG5cdFx0bGV0IGF0dHJpYnV0ZXNOdW0gPSAwO1xyXG5cclxuXHRcdGNvbnN0IHByb2dyYW1BdHRyaWJ1dGVzID0gcHJvZ3JhbS5nZXRBdHRyaWJ1dGVzKCk7XHJcblxyXG5cdFx0Zm9yICggY29uc3QgbmFtZSBpbiBwcm9ncmFtQXR0cmlidXRlcyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHByb2dyYW1BdHRyaWJ1dGUgPSBwcm9ncmFtQXR0cmlidXRlc1sgbmFtZSBdO1xyXG5cclxuXHRcdFx0aWYgKCBwcm9ncmFtQXR0cmlidXRlLmxvY2F0aW9uID49IDAgKSB7XHJcblxyXG5cdFx0XHRcdGxldCBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzWyBuYW1lIF07XHJcblxyXG5cdFx0XHRcdGlmICggYXR0cmlidXRlID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBuYW1lID09PSAnaW5zdGFuY2VNYXRyaXgnICYmIG9iamVjdC5pbnN0YW5jZU1hdHJpeCApIGF0dHJpYnV0ZSA9IG9iamVjdC5pbnN0YW5jZU1hdHJpeDtcclxuXHRcdFx0XHRcdGlmICggbmFtZSA9PT0gJ2luc3RhbmNlQ29sb3InICYmIG9iamVjdC5pbnN0YW5jZUNvbG9yICkgYXR0cmlidXRlID0gb2JqZWN0Lmluc3RhbmNlQ29sb3I7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Y29uc3QgZGF0YSA9IHt9O1xyXG5cdFx0XHRcdGRhdGEuYXR0cmlidXRlID0gYXR0cmlidXRlO1xyXG5cclxuXHRcdFx0XHRpZiAoIGF0dHJpYnV0ZSAmJiBhdHRyaWJ1dGUuZGF0YSApIHtcclxuXHJcblx0XHRcdFx0XHRkYXRhLmRhdGEgPSBhdHRyaWJ1dGUuZGF0YTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRjYWNoZVsgbmFtZSBdID0gZGF0YTtcclxuXHJcblx0XHRcdFx0YXR0cmlidXRlc051bSArKztcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y3VycmVudFN0YXRlLmF0dHJpYnV0ZXMgPSBjYWNoZTtcclxuXHRcdGN1cnJlbnRTdGF0ZS5hdHRyaWJ1dGVzTnVtID0gYXR0cmlidXRlc051bTtcclxuXHJcblx0XHRjdXJyZW50U3RhdGUuaW5kZXggPSBpbmRleDtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBpbml0QXR0cmlidXRlcygpIHtcclxuXHJcblx0XHRjb25zdCBuZXdBdHRyaWJ1dGVzID0gY3VycmVudFN0YXRlLm5ld0F0dHJpYnV0ZXM7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IG5ld0F0dHJpYnV0ZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRuZXdBdHRyaWJ1dGVzWyBpIF0gPSAwO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBlbmFibGVBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApIHtcclxuXHJcblx0XHRlbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yKCBhdHRyaWJ1dGUsIDAgKTtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBlbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yKCBhdHRyaWJ1dGUsIG1lc2hQZXJBdHRyaWJ1dGUgKSB7XHJcblxyXG5cdFx0Y29uc3QgbmV3QXR0cmlidXRlcyA9IGN1cnJlbnRTdGF0ZS5uZXdBdHRyaWJ1dGVzO1xyXG5cdFx0Y29uc3QgZW5hYmxlZEF0dHJpYnV0ZXMgPSBjdXJyZW50U3RhdGUuZW5hYmxlZEF0dHJpYnV0ZXM7XHJcblx0XHRjb25zdCBhdHRyaWJ1dGVEaXZpc29ycyA9IGN1cnJlbnRTdGF0ZS5hdHRyaWJ1dGVEaXZpc29ycztcclxuXHJcblx0XHRuZXdBdHRyaWJ1dGVzWyBhdHRyaWJ1dGUgXSA9IDE7XHJcblxyXG5cdFx0aWYgKCBlbmFibGVkQXR0cmlidXRlc1sgYXR0cmlidXRlIF0gPT09IDAgKSB7XHJcblxyXG5cdFx0XHRnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSggYXR0cmlidXRlICk7XHJcblx0XHRcdGVuYWJsZWRBdHRyaWJ1dGVzWyBhdHRyaWJ1dGUgXSA9IDE7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggYXR0cmlidXRlRGl2aXNvcnNbIGF0dHJpYnV0ZSBdICE9PSBtZXNoUGVyQXR0cmlidXRlICkge1xyXG5cclxuXHRcdFx0Z2wudmVydGV4QXR0cmliRGl2aXNvciggYXR0cmlidXRlLCBtZXNoUGVyQXR0cmlidXRlICk7XHJcblx0XHRcdGF0dHJpYnV0ZURpdmlzb3JzWyBhdHRyaWJ1dGUgXSA9IG1lc2hQZXJBdHRyaWJ1dGU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzKCkge1xyXG5cclxuXHRcdGNvbnN0IG5ld0F0dHJpYnV0ZXMgPSBjdXJyZW50U3RhdGUubmV3QXR0cmlidXRlcztcclxuXHRcdGNvbnN0IGVuYWJsZWRBdHRyaWJ1dGVzID0gY3VycmVudFN0YXRlLmVuYWJsZWRBdHRyaWJ1dGVzO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBlbmFibGVkQXR0cmlidXRlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGlmICggZW5hYmxlZEF0dHJpYnV0ZXNbIGkgXSAhPT0gbmV3QXR0cmlidXRlc1sgaSBdICkge1xyXG5cclxuXHRcdFx0XHRnbC5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoIGkgKTtcclxuXHRcdFx0XHRlbmFibGVkQXR0cmlidXRlc1sgaSBdID0gMDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gdmVydGV4QXR0cmliUG9pbnRlciggaW5kZXgsIHNpemUsIHR5cGUsIG5vcm1hbGl6ZWQsIHN0cmlkZSwgb2Zmc2V0LCBpbnRlZ2VyICkge1xyXG5cclxuXHRcdGlmICggaW50ZWdlciA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdGdsLnZlcnRleEF0dHJpYklQb2ludGVyKCBpbmRleCwgc2l6ZSwgdHlwZSwgc3RyaWRlLCBvZmZzZXQgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Z2wudmVydGV4QXR0cmliUG9pbnRlciggaW5kZXgsIHNpemUsIHR5cGUsIG5vcm1hbGl6ZWQsIHN0cmlkZSwgb2Zmc2V0ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHNldHVwVmVydGV4QXR0cmlidXRlcyggb2JqZWN0LCBtYXRlcmlhbCwgcHJvZ3JhbSwgZ2VvbWV0cnkgKSB7XHJcblxyXG5cdFx0aW5pdEF0dHJpYnV0ZXMoKTtcclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeUF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzO1xyXG5cclxuXHRcdGNvbnN0IHByb2dyYW1BdHRyaWJ1dGVzID0gcHJvZ3JhbS5nZXRBdHRyaWJ1dGVzKCk7XHJcblxyXG5cdFx0Y29uc3QgbWF0ZXJpYWxEZWZhdWx0QXR0cmlidXRlVmFsdWVzID0gbWF0ZXJpYWwuZGVmYXVsdEF0dHJpYnV0ZVZhbHVlcztcclxuXHJcblx0XHRmb3IgKCBjb25zdCBuYW1lIGluIHByb2dyYW1BdHRyaWJ1dGVzICkge1xyXG5cclxuXHRcdFx0Y29uc3QgcHJvZ3JhbUF0dHJpYnV0ZSA9IHByb2dyYW1BdHRyaWJ1dGVzWyBuYW1lIF07XHJcblxyXG5cdFx0XHRpZiAoIHByb2dyYW1BdHRyaWJ1dGUubG9jYXRpb24gPj0gMCApIHtcclxuXHJcblx0XHRcdFx0bGV0IGdlb21ldHJ5QXR0cmlidXRlID0gZ2VvbWV0cnlBdHRyaWJ1dGVzWyBuYW1lIF07XHJcblxyXG5cdFx0XHRcdGlmICggZ2VvbWV0cnlBdHRyaWJ1dGUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIG5hbWUgPT09ICdpbnN0YW5jZU1hdHJpeCcgJiYgb2JqZWN0Lmluc3RhbmNlTWF0cml4ICkgZ2VvbWV0cnlBdHRyaWJ1dGUgPSBvYmplY3QuaW5zdGFuY2VNYXRyaXg7XHJcblx0XHRcdFx0XHRpZiAoIG5hbWUgPT09ICdpbnN0YW5jZUNvbG9yJyAmJiBvYmplY3QuaW5zdGFuY2VDb2xvciApIGdlb21ldHJ5QXR0cmlidXRlID0gb2JqZWN0Lmluc3RhbmNlQ29sb3I7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKCBnZW9tZXRyeUF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IG5vcm1hbGl6ZWQgPSBnZW9tZXRyeUF0dHJpYnV0ZS5ub3JtYWxpemVkO1xyXG5cdFx0XHRcdFx0Y29uc3Qgc2l6ZSA9IGdlb21ldHJ5QXR0cmlidXRlLml0ZW1TaXplO1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMuZ2V0KCBnZW9tZXRyeUF0dHJpYnV0ZSApO1xyXG5cclxuXHRcdFx0XHRcdC8vIFRPRE8gQXR0cmlidXRlIG1heSBub3QgYmUgYXZhaWxhYmxlIG9uIGNvbnRleHQgcmVzdG9yZVxyXG5cclxuXHRcdFx0XHRcdGlmICggYXR0cmlidXRlID09PSB1bmRlZmluZWQgKSBjb250aW51ZTtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBidWZmZXIgPSBhdHRyaWJ1dGUuYnVmZmVyO1xyXG5cdFx0XHRcdFx0Y29uc3QgdHlwZSA9IGF0dHJpYnV0ZS50eXBlO1xyXG5cdFx0XHRcdFx0Y29uc3QgYnl0ZXNQZXJFbGVtZW50ID0gYXR0cmlidXRlLmJ5dGVzUGVyRWxlbWVudDtcclxuXHJcblx0XHRcdFx0XHQvLyBjaGVjayBmb3IgaW50ZWdlciBhdHRyaWJ1dGVzXHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgaW50ZWdlciA9ICggdHlwZSA9PT0gZ2wuSU5UIHx8IHR5cGUgPT09IGdsLlVOU0lHTkVEX0lOVCB8fCBnZW9tZXRyeUF0dHJpYnV0ZS5ncHVUeXBlID09PSBJbnRUeXBlICk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBnZW9tZXRyeUF0dHJpYnV0ZS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgZGF0YSA9IGdlb21ldHJ5QXR0cmlidXRlLmRhdGE7XHJcblx0XHRcdFx0XHRcdGNvbnN0IHN0cmlkZSA9IGRhdGEuc3RyaWRlO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBvZmZzZXQgPSBnZW9tZXRyeUF0dHJpYnV0ZS5vZmZzZXQ7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIGRhdGEuaXNJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlciApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgcHJvZ3JhbUF0dHJpYnV0ZS5sb2NhdGlvblNpemU7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0ZW5hYmxlQXR0cmlidXRlQW5kRGl2aXNvciggcHJvZ3JhbUF0dHJpYnV0ZS5sb2NhdGlvbiArIGksIGRhdGEubWVzaFBlckF0dHJpYnV0ZSApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmICggb2JqZWN0LmlzSW5zdGFuY2VkTWVzaCAhPT0gdHJ1ZSAmJiBnZW9tZXRyeS5fbWF4SW5zdGFuY2VDb3VudCA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGdlb21ldHJ5Ll9tYXhJbnN0YW5jZUNvdW50ID0gZGF0YS5tZXNoUGVyQXR0cmlidXRlICogZGF0YS5jb3VudDtcclxuXHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgcHJvZ3JhbUF0dHJpYnV0ZS5sb2NhdGlvblNpemU7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0ZW5hYmxlQXR0cmlidXRlKCBwcm9ncmFtQXR0cmlidXRlLmxvY2F0aW9uICsgaSApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRnbC5iaW5kQnVmZmVyKCBnbC5BUlJBWV9CVUZGRVIsIGJ1ZmZlciApO1xyXG5cclxuXHRcdFx0XHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgcHJvZ3JhbUF0dHJpYnV0ZS5sb2NhdGlvblNpemU7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdHZlcnRleEF0dHJpYlBvaW50ZXIoXHJcblx0XHRcdFx0XHRcdFx0XHRwcm9ncmFtQXR0cmlidXRlLmxvY2F0aW9uICsgaSxcclxuXHRcdFx0XHRcdFx0XHRcdHNpemUgLyBwcm9ncmFtQXR0cmlidXRlLmxvY2F0aW9uU2l6ZSxcclxuXHRcdFx0XHRcdFx0XHRcdHR5cGUsXHJcblx0XHRcdFx0XHRcdFx0XHRub3JtYWxpemVkLFxyXG5cdFx0XHRcdFx0XHRcdFx0c3RyaWRlICogYnl0ZXNQZXJFbGVtZW50LFxyXG5cdFx0XHRcdFx0XHRcdFx0KCBvZmZzZXQgKyAoIHNpemUgLyBwcm9ncmFtQXR0cmlidXRlLmxvY2F0aW9uU2l6ZSApICogaSApICogYnl0ZXNQZXJFbGVtZW50LFxyXG5cdFx0XHRcdFx0XHRcdFx0aW50ZWdlclxyXG5cdFx0XHRcdFx0XHRcdCk7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggZ2VvbWV0cnlBdHRyaWJ1dGUuaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHByb2dyYW1BdHRyaWJ1dGUubG9jYXRpb25TaXplOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGVuYWJsZUF0dHJpYnV0ZUFuZERpdmlzb3IoIHByb2dyYW1BdHRyaWJ1dGUubG9jYXRpb24gKyBpLCBnZW9tZXRyeUF0dHJpYnV0ZS5tZXNoUGVyQXR0cmlidXRlICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKCBvYmplY3QuaXNJbnN0YW5jZWRNZXNoICE9PSB0cnVlICYmIGdlb21ldHJ5Ll9tYXhJbnN0YW5jZUNvdW50ID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0Z2VvbWV0cnkuX21heEluc3RhbmNlQ291bnQgPSBnZW9tZXRyeUF0dHJpYnV0ZS5tZXNoUGVyQXR0cmlidXRlICogZ2VvbWV0cnlBdHRyaWJ1dGUuY291bnQ7XHJcblxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHByb2dyYW1BdHRyaWJ1dGUubG9jYXRpb25TaXplOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGVuYWJsZUF0dHJpYnV0ZSggcHJvZ3JhbUF0dHJpYnV0ZS5sb2NhdGlvbiArIGkgKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0Z2wuYmluZEJ1ZmZlciggZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXIgKTtcclxuXHJcblx0XHRcdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHByb2dyYW1BdHRyaWJ1dGUubG9jYXRpb25TaXplOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHR2ZXJ0ZXhBdHRyaWJQb2ludGVyKFxyXG5cdFx0XHRcdFx0XHRcdFx0cHJvZ3JhbUF0dHJpYnV0ZS5sb2NhdGlvbiArIGksXHJcblx0XHRcdFx0XHRcdFx0XHRzaXplIC8gcHJvZ3JhbUF0dHJpYnV0ZS5sb2NhdGlvblNpemUsXHJcblx0XHRcdFx0XHRcdFx0XHR0eXBlLFxyXG5cdFx0XHRcdFx0XHRcdFx0bm9ybWFsaXplZCxcclxuXHRcdFx0XHRcdFx0XHRcdHNpemUgKiBieXRlc1BlckVsZW1lbnQsXHJcblx0XHRcdFx0XHRcdFx0XHQoIHNpemUgLyBwcm9ncmFtQXR0cmlidXRlLmxvY2F0aW9uU2l6ZSApICogaSAqIGJ5dGVzUGVyRWxlbWVudCxcclxuXHRcdFx0XHRcdFx0XHRcdGludGVnZXJcclxuXHRcdFx0XHRcdFx0XHQpO1xyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWxEZWZhdWx0QXR0cmlidXRlVmFsdWVzICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgdmFsdWUgPSBtYXRlcmlhbERlZmF1bHRBdHRyaWJ1dGVWYWx1ZXNbIG5hbWUgXTtcclxuXHJcblx0XHRcdFx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRzd2l0Y2ggKCB2YWx1ZS5sZW5ndGggKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGNhc2UgMjpcclxuXHRcdFx0XHRcdFx0XHRcdGdsLnZlcnRleEF0dHJpYjJmdiggcHJvZ3JhbUF0dHJpYnV0ZS5sb2NhdGlvbiwgdmFsdWUgKTtcclxuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRjYXNlIDM6XHJcblx0XHRcdFx0XHRcdFx0XHRnbC52ZXJ0ZXhBdHRyaWIzZnYoIHByb2dyYW1BdHRyaWJ1dGUubG9jYXRpb24sIHZhbHVlICk7XHJcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRcdFx0Y2FzZSA0OlxyXG5cdFx0XHRcdFx0XHRcdFx0Z2wudmVydGV4QXR0cmliNGZ2KCBwcm9ncmFtQXR0cmlidXRlLmxvY2F0aW9uLCB2YWx1ZSApO1xyXG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0XHRcdFx0XHRnbC52ZXJ0ZXhBdHRyaWIxZnYoIHByb2dyYW1BdHRyaWJ1dGUubG9jYXRpb24sIHZhbHVlICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzKCk7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gZGlzcG9zZSgpIHtcclxuXHJcblx0XHRyZXNldCgpO1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IGdlb21ldHJ5SWQgaW4gYmluZGluZ1N0YXRlcyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHByb2dyYW1NYXAgPSBiaW5kaW5nU3RhdGVzWyBnZW9tZXRyeUlkIF07XHJcblxyXG5cdFx0XHRmb3IgKCBjb25zdCBwcm9ncmFtSWQgaW4gcHJvZ3JhbU1hcCApIHtcclxuXHJcblx0XHRcdFx0Y29uc3Qgc3RhdGVNYXAgPSBwcm9ncmFtTWFwWyBwcm9ncmFtSWQgXTtcclxuXHJcblx0XHRcdFx0Zm9yICggY29uc3Qgd2lyZWZyYW1lIGluIHN0YXRlTWFwICkge1xyXG5cclxuXHRcdFx0XHRcdGRlbGV0ZVZlcnRleEFycmF5T2JqZWN0KCBzdGF0ZU1hcFsgd2lyZWZyYW1lIF0ub2JqZWN0ICk7XHJcblxyXG5cdFx0XHRcdFx0ZGVsZXRlIHN0YXRlTWFwWyB3aXJlZnJhbWUgXTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRkZWxldGUgcHJvZ3JhbU1hcFsgcHJvZ3JhbUlkIF07XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRkZWxldGUgYmluZGluZ1N0YXRlc1sgZ2VvbWV0cnlJZCBdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiByZWxlYXNlU3RhdGVzT2ZHZW9tZXRyeSggZ2VvbWV0cnkgKSB7XHJcblxyXG5cdFx0aWYgKCBiaW5kaW5nU3RhdGVzWyBnZW9tZXRyeS5pZCBdID09PSB1bmRlZmluZWQgKSByZXR1cm47XHJcblxyXG5cdFx0Y29uc3QgcHJvZ3JhbU1hcCA9IGJpbmRpbmdTdGF0ZXNbIGdlb21ldHJ5LmlkIF07XHJcblxyXG5cdFx0Zm9yICggY29uc3QgcHJvZ3JhbUlkIGluIHByb2dyYW1NYXAgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBzdGF0ZU1hcCA9IHByb2dyYW1NYXBbIHByb2dyYW1JZCBdO1xyXG5cclxuXHRcdFx0Zm9yICggY29uc3Qgd2lyZWZyYW1lIGluIHN0YXRlTWFwICkge1xyXG5cclxuXHRcdFx0XHRkZWxldGVWZXJ0ZXhBcnJheU9iamVjdCggc3RhdGVNYXBbIHdpcmVmcmFtZSBdLm9iamVjdCApO1xyXG5cclxuXHRcdFx0XHRkZWxldGUgc3RhdGVNYXBbIHdpcmVmcmFtZSBdO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZGVsZXRlIHByb2dyYW1NYXBbIHByb2dyYW1JZCBdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRkZWxldGUgYmluZGluZ1N0YXRlc1sgZ2VvbWV0cnkuaWQgXTtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiByZWxlYXNlU3RhdGVzT2ZQcm9ncmFtKCBwcm9ncmFtICkge1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IGdlb21ldHJ5SWQgaW4gYmluZGluZ1N0YXRlcyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHByb2dyYW1NYXAgPSBiaW5kaW5nU3RhdGVzWyBnZW9tZXRyeUlkIF07XHJcblxyXG5cdFx0XHRpZiAoIHByb2dyYW1NYXBbIHByb2dyYW0uaWQgXSA9PT0gdW5kZWZpbmVkICkgY29udGludWU7XHJcblxyXG5cdFx0XHRjb25zdCBzdGF0ZU1hcCA9IHByb2dyYW1NYXBbIHByb2dyYW0uaWQgXTtcclxuXHJcblx0XHRcdGZvciAoIGNvbnN0IHdpcmVmcmFtZSBpbiBzdGF0ZU1hcCApIHtcclxuXHJcblx0XHRcdFx0ZGVsZXRlVmVydGV4QXJyYXlPYmplY3QoIHN0YXRlTWFwWyB3aXJlZnJhbWUgXS5vYmplY3QgKTtcclxuXHJcblx0XHRcdFx0ZGVsZXRlIHN0YXRlTWFwWyB3aXJlZnJhbWUgXTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGRlbGV0ZSBwcm9ncmFtTWFwWyBwcm9ncmFtLmlkIF07XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHJlc2V0KCkge1xyXG5cclxuXHRcdHJlc2V0RGVmYXVsdFN0YXRlKCk7XHJcblx0XHRmb3JjZVVwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0aWYgKCBjdXJyZW50U3RhdGUgPT09IGRlZmF1bHRTdGF0ZSApIHJldHVybjtcclxuXHJcblx0XHRjdXJyZW50U3RhdGUgPSBkZWZhdWx0U3RhdGU7XHJcblx0XHRiaW5kVmVydGV4QXJyYXlPYmplY3QoIGN1cnJlbnRTdGF0ZS5vYmplY3QgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvLyBmb3IgYmFja3dhcmQtY29tcGF0aWJpbGl0eVxyXG5cclxuXHRmdW5jdGlvbiByZXNldERlZmF1bHRTdGF0ZSgpIHtcclxuXHJcblx0XHRkZWZhdWx0U3RhdGUuZ2VvbWV0cnkgPSBudWxsO1xyXG5cdFx0ZGVmYXVsdFN0YXRlLnByb2dyYW0gPSBudWxsO1xyXG5cdFx0ZGVmYXVsdFN0YXRlLndpcmVmcmFtZSA9IGZhbHNlO1xyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiB7XHJcblxyXG5cdFx0c2V0dXA6IHNldHVwLFxyXG5cdFx0cmVzZXQ6IHJlc2V0LFxyXG5cdFx0cmVzZXREZWZhdWx0U3RhdGU6IHJlc2V0RGVmYXVsdFN0YXRlLFxyXG5cdFx0ZGlzcG9zZTogZGlzcG9zZSxcclxuXHRcdHJlbGVhc2VTdGF0ZXNPZkdlb21ldHJ5OiByZWxlYXNlU3RhdGVzT2ZHZW9tZXRyeSxcclxuXHRcdHJlbGVhc2VTdGF0ZXNPZlByb2dyYW06IHJlbGVhc2VTdGF0ZXNPZlByb2dyYW0sXHJcblxyXG5cdFx0aW5pdEF0dHJpYnV0ZXM6IGluaXRBdHRyaWJ1dGVzLFxyXG5cdFx0ZW5hYmxlQXR0cmlidXRlOiBlbmFibGVBdHRyaWJ1dGUsXHJcblx0XHRkaXNhYmxlVW51c2VkQXR0cmlidXRlczogZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXNcclxuXHJcblx0fTtcclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBXZWJHTEJpbmRpbmdTdGF0ZXMgfTtcclxuIiwiZnVuY3Rpb24gV2ViR0xCdWZmZXJSZW5kZXJlciggZ2wsIGV4dGVuc2lvbnMsIGluZm8gKSB7XHJcblxyXG5cdGxldCBtb2RlO1xyXG5cclxuXHRmdW5jdGlvbiBzZXRNb2RlKCB2YWx1ZSApIHtcclxuXHJcblx0XHRtb2RlID0gdmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gcmVuZGVyKCBzdGFydCwgY291bnQgKSB7XHJcblxyXG5cdFx0Z2wuZHJhd0FycmF5cyggbW9kZSwgc3RhcnQsIGNvdW50ICk7XHJcblxyXG5cdFx0aW5mby51cGRhdGUoIGNvdW50LCBtb2RlLCAxICk7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gcmVuZGVySW5zdGFuY2VzKCBzdGFydCwgY291bnQsIHByaW1jb3VudCApIHtcclxuXHJcblx0XHRpZiAoIHByaW1jb3VudCA9PT0gMCApIHJldHVybjtcclxuXHJcblx0XHRnbC5kcmF3QXJyYXlzSW5zdGFuY2VkKCBtb2RlLCBzdGFydCwgY291bnQsIHByaW1jb3VudCApO1xyXG5cclxuXHRcdGluZm8udXBkYXRlKCBjb3VudCwgbW9kZSwgcHJpbWNvdW50ICk7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gcmVuZGVyTXVsdGlEcmF3KCBzdGFydHMsIGNvdW50cywgZHJhd0NvdW50ICkge1xyXG5cclxuXHRcdGlmICggZHJhd0NvdW50ID09PSAwICkgcmV0dXJuO1xyXG5cclxuXHRcdGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfbXVsdGlfZHJhdycgKTtcclxuXHRcdGV4dGVuc2lvbi5tdWx0aURyYXdBcnJheXNXRUJHTCggbW9kZSwgc3RhcnRzLCAwLCBjb3VudHMsIDAsIGRyYXdDb3VudCApO1xyXG5cclxuXHRcdGxldCBlbGVtZW50Q291bnQgPSAwO1xyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgZHJhd0NvdW50OyBpICsrICkge1xyXG5cclxuXHRcdFx0ZWxlbWVudENvdW50ICs9IGNvdW50c1sgaSBdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpbmZvLnVwZGF0ZSggZWxlbWVudENvdW50LCBtb2RlLCAxICk7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gcmVuZGVyTXVsdGlEcmF3SW5zdGFuY2VzKCBzdGFydHMsIGNvdW50cywgZHJhd0NvdW50LCBwcmltY291bnQgKSB7XHJcblxyXG5cdFx0aWYgKCBkcmF3Q291bnQgPT09IDAgKSByZXR1cm47XHJcblxyXG5cdFx0Y29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9tdWx0aV9kcmF3JyApO1xyXG5cclxuXHRcdGlmICggZXh0ZW5zaW9uID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgc3RhcnRzLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0cmVuZGVySW5zdGFuY2VzKCBzdGFydHNbIGkgXSwgY291bnRzWyBpIF0sIHByaW1jb3VudFsgaSBdICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGV4dGVuc2lvbi5tdWx0aURyYXdBcnJheXNJbnN0YW5jZWRXRUJHTCggbW9kZSwgc3RhcnRzLCAwLCBjb3VudHMsIDAsIHByaW1jb3VudCwgMCwgZHJhd0NvdW50ICk7XHJcblxyXG5cdFx0XHRsZXQgZWxlbWVudENvdW50ID0gMDtcclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgZHJhd0NvdW50OyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRlbGVtZW50Q291bnQgKz0gY291bnRzWyBpIF0gKiBwcmltY291bnRbIGkgXTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGluZm8udXBkYXRlKCBlbGVtZW50Q291bnQsIG1vZGUsIDEgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0Ly9cclxuXHJcblx0dGhpcy5zZXRNb2RlID0gc2V0TW9kZTtcclxuXHR0aGlzLnJlbmRlciA9IHJlbmRlcjtcclxuXHR0aGlzLnJlbmRlckluc3RhbmNlcyA9IHJlbmRlckluc3RhbmNlcztcclxuXHR0aGlzLnJlbmRlck11bHRpRHJhdyA9IHJlbmRlck11bHRpRHJhdztcclxuXHR0aGlzLnJlbmRlck11bHRpRHJhd0luc3RhbmNlcyA9IHJlbmRlck11bHRpRHJhd0luc3RhbmNlcztcclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBXZWJHTEJ1ZmZlclJlbmRlcmVyIH07XHJcbiIsImltcG9ydCB7IEZsb2F0VHlwZSwgSGFsZkZsb2F0VHlwZSwgUkdCQUZvcm1hdCwgVW5zaWduZWRCeXRlVHlwZSB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcblxyXG5mdW5jdGlvbiBXZWJHTENhcGFiaWxpdGllcyggZ2wsIGV4dGVuc2lvbnMsIHBhcmFtZXRlcnMsIHV0aWxzICkge1xyXG5cclxuXHRsZXQgbWF4QW5pc290cm9weTtcclxuXHJcblx0ZnVuY3Rpb24gZ2V0TWF4QW5pc290cm9weSgpIHtcclxuXHJcblx0XHRpZiAoIG1heEFuaXNvdHJvcHkgIT09IHVuZGVmaW5lZCApIHJldHVybiBtYXhBbmlzb3Ryb3B5O1xyXG5cclxuXHRcdGlmICggZXh0ZW5zaW9ucy5oYXMoICdFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnICkgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYycgKTtcclxuXHJcblx0XHRcdG1heEFuaXNvdHJvcHkgPSBnbC5nZXRQYXJhbWV0ZXIoIGV4dGVuc2lvbi5NQVhfVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0bWF4QW5pc290cm9weSA9IDA7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBtYXhBbmlzb3Ryb3B5O1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHRleHR1cmVGb3JtYXRSZWFkYWJsZSggdGV4dHVyZUZvcm1hdCApIHtcclxuXHJcblx0XHRpZiAoIHRleHR1cmVGb3JtYXQgIT09IFJHQkFGb3JtYXQgJiYgdXRpbHMuY29udmVydCggdGV4dHVyZUZvcm1hdCApICE9PSBnbC5nZXRQYXJhbWV0ZXIoIGdsLklNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfRk9STUFUICkgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHRleHR1cmVUeXBlUmVhZGFibGUoIHRleHR1cmVUeXBlICkge1xyXG5cclxuXHRcdGNvbnN0IGhhbGZGbG9hdFN1cHBvcnRlZEJ5RXh0ID0gKCB0ZXh0dXJlVHlwZSA9PT0gSGFsZkZsb2F0VHlwZSApICYmICggZXh0ZW5zaW9ucy5oYXMoICdFWFRfY29sb3JfYnVmZmVyX2hhbGZfZmxvYXQnICkgfHwgZXh0ZW5zaW9ucy5oYXMoICdFWFRfY29sb3JfYnVmZmVyX2Zsb2F0JyApICk7XHJcblxyXG5cdFx0aWYgKCB0ZXh0dXJlVHlwZSAhPT0gVW5zaWduZWRCeXRlVHlwZSAmJiB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlVHlwZSApICE9PSBnbC5nZXRQYXJhbWV0ZXIoIGdsLklNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfVFlQRSApICYmIC8vIEVkZ2UgYW5kIENocm9tZSBNYWMgPCA1MiAoIzk1MTMpXHJcblx0XHRcdHRleHR1cmVUeXBlICE9PSBGbG9hdFR5cGUgJiYgISBoYWxmRmxvYXRTdXBwb3J0ZWRCeUV4dCApIHtcclxuXHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gZ2V0TWF4UHJlY2lzaW9uKCBwcmVjaXNpb24gKSB7XHJcblxyXG5cdFx0aWYgKCBwcmVjaXNpb24gPT09ICdoaWdocCcgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGdsLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCggZ2wuVkVSVEVYX1NIQURFUiwgZ2wuSElHSF9GTE9BVCApLnByZWNpc2lvbiA+IDAgJiZcclxuXHRcdFx0XHRnbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoIGdsLkZSQUdNRU5UX1NIQURFUiwgZ2wuSElHSF9GTE9BVCApLnByZWNpc2lvbiA+IDAgKSB7XHJcblxyXG5cdFx0XHRcdHJldHVybiAnaGlnaHAnO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cHJlY2lzaW9uID0gJ21lZGl1bXAnO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHByZWNpc2lvbiA9PT0gJ21lZGl1bXAnICkge1xyXG5cclxuXHRcdFx0aWYgKCBnbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoIGdsLlZFUlRFWF9TSEFERVIsIGdsLk1FRElVTV9GTE9BVCApLnByZWNpc2lvbiA+IDAgJiZcclxuXHRcdFx0XHRnbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoIGdsLkZSQUdNRU5UX1NIQURFUiwgZ2wuTUVESVVNX0ZMT0FUICkucHJlY2lzaW9uID4gMCApIHtcclxuXHJcblx0XHRcdFx0cmV0dXJuICdtZWRpdW1wJztcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuICdsb3dwJztcclxuXHJcblx0fVxyXG5cclxuXHRsZXQgcHJlY2lzaW9uID0gcGFyYW1ldGVycy5wcmVjaXNpb24gIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMucHJlY2lzaW9uIDogJ2hpZ2hwJztcclxuXHRjb25zdCBtYXhQcmVjaXNpb24gPSBnZXRNYXhQcmVjaXNpb24oIHByZWNpc2lvbiApO1xyXG5cclxuXHRpZiAoIG1heFByZWNpc2lvbiAhPT0gcHJlY2lzaW9uICkge1xyXG5cclxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6JywgcHJlY2lzaW9uLCAnbm90IHN1cHBvcnRlZCwgdXNpbmcnLCBtYXhQcmVjaXNpb24sICdpbnN0ZWFkLicgKTtcclxuXHRcdHByZWNpc2lvbiA9IG1heFByZWNpc2lvbjtcclxuXHJcblx0fVxyXG5cclxuXHRjb25zdCBsb2dhcml0aG1pY0RlcHRoQnVmZmVyID0gcGFyYW1ldGVycy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyID09PSB0cnVlO1xyXG5cdGNvbnN0IHJldmVyc2VEZXB0aEJ1ZmZlciA9IHBhcmFtZXRlcnMucmV2ZXJzZURlcHRoQnVmZmVyID09PSB0cnVlICYmIGV4dGVuc2lvbnMuaGFzKCAnRVhUX2NsaXBfY29udHJvbCcgKTtcclxuXHJcblx0Y29uc3QgbWF4VGV4dHVyZXMgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9URVhUVVJFX0lNQUdFX1VOSVRTICk7XHJcblx0Y29uc3QgbWF4VmVydGV4VGV4dHVyZXMgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9WRVJURVhfVEVYVFVSRV9JTUFHRV9VTklUUyApO1xyXG5cdGNvbnN0IG1heFRleHR1cmVTaXplID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfVEVYVFVSRV9TSVpFICk7XHJcblx0Y29uc3QgbWF4Q3ViZW1hcFNpemUgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9DVUJFX01BUF9URVhUVVJFX1NJWkUgKTtcclxuXHJcblx0Y29uc3QgbWF4QXR0cmlidXRlcyA9IGdsLmdldFBhcmFtZXRlciggZ2wuTUFYX1ZFUlRFWF9BVFRSSUJTICk7XHJcblx0Y29uc3QgbWF4VmVydGV4VW5pZm9ybXMgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9WRVJURVhfVU5JRk9STV9WRUNUT1JTICk7XHJcblx0Y29uc3QgbWF4VmFyeWluZ3MgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9WQVJZSU5HX1ZFQ1RPUlMgKTtcclxuXHRjb25zdCBtYXhGcmFnbWVudFVuaWZvcm1zID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfRlJBR01FTlRfVU5JRk9STV9WRUNUT1JTICk7XHJcblxyXG5cdGNvbnN0IHZlcnRleFRleHR1cmVzID0gbWF4VmVydGV4VGV4dHVyZXMgPiAwO1xyXG5cclxuXHRjb25zdCBtYXhTYW1wbGVzID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfU0FNUExFUyApO1xyXG5cclxuXHRyZXR1cm4ge1xyXG5cclxuXHRcdGlzV2ViR0wyOiB0cnVlLCAvLyBrZWVwaW5nIHRoaXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XHJcblxyXG5cdFx0Z2V0TWF4QW5pc290cm9weTogZ2V0TWF4QW5pc290cm9weSxcclxuXHRcdGdldE1heFByZWNpc2lvbjogZ2V0TWF4UHJlY2lzaW9uLFxyXG5cclxuXHRcdHRleHR1cmVGb3JtYXRSZWFkYWJsZTogdGV4dHVyZUZvcm1hdFJlYWRhYmxlLFxyXG5cdFx0dGV4dHVyZVR5cGVSZWFkYWJsZTogdGV4dHVyZVR5cGVSZWFkYWJsZSxcclxuXHJcblx0XHRwcmVjaXNpb246IHByZWNpc2lvbixcclxuXHRcdGxvZ2FyaXRobWljRGVwdGhCdWZmZXI6IGxvZ2FyaXRobWljRGVwdGhCdWZmZXIsXHJcblx0XHRyZXZlcnNlRGVwdGhCdWZmZXI6IHJldmVyc2VEZXB0aEJ1ZmZlcixcclxuXHJcblx0XHRtYXhUZXh0dXJlczogbWF4VGV4dHVyZXMsXHJcblx0XHRtYXhWZXJ0ZXhUZXh0dXJlczogbWF4VmVydGV4VGV4dHVyZXMsXHJcblx0XHRtYXhUZXh0dXJlU2l6ZTogbWF4VGV4dHVyZVNpemUsXHJcblx0XHRtYXhDdWJlbWFwU2l6ZTogbWF4Q3ViZW1hcFNpemUsXHJcblxyXG5cdFx0bWF4QXR0cmlidXRlczogbWF4QXR0cmlidXRlcyxcclxuXHRcdG1heFZlcnRleFVuaWZvcm1zOiBtYXhWZXJ0ZXhVbmlmb3JtcyxcclxuXHRcdG1heFZhcnlpbmdzOiBtYXhWYXJ5aW5ncyxcclxuXHRcdG1heEZyYWdtZW50VW5pZm9ybXM6IG1heEZyYWdtZW50VW5pZm9ybXMsXHJcblxyXG5cdFx0dmVydGV4VGV4dHVyZXM6IHZlcnRleFRleHR1cmVzLFxyXG5cclxuXHRcdG1heFNhbXBsZXM6IG1heFNhbXBsZXNcclxuXHJcblx0fTtcclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBXZWJHTENhcGFiaWxpdGllcyB9O1xyXG4iLCJpbXBvcnQgeyBNYXRyaXgzIH0gZnJvbSAnLi4vLi4vbWF0aC9NYXRyaXgzLmpzJztcclxuaW1wb3J0IHsgUGxhbmUgfSBmcm9tICcuLi8uLi9tYXRoL1BsYW5lLmpzJztcclxuXHJcbmZ1bmN0aW9uIFdlYkdMQ2xpcHBpbmcoIHByb3BlcnRpZXMgKSB7XHJcblxyXG5cdGNvbnN0IHNjb3BlID0gdGhpcztcclxuXHJcblx0bGV0IGdsb2JhbFN0YXRlID0gbnVsbCxcclxuXHRcdG51bUdsb2JhbFBsYW5lcyA9IDAsXHJcblx0XHRsb2NhbENsaXBwaW5nRW5hYmxlZCA9IGZhbHNlLFxyXG5cdFx0cmVuZGVyaW5nU2hhZG93cyA9IGZhbHNlO1xyXG5cclxuXHRjb25zdCBwbGFuZSA9IG5ldyBQbGFuZSgpLFxyXG5cdFx0dmlld05vcm1hbE1hdHJpeCA9IG5ldyBNYXRyaXgzKCksXHJcblxyXG5cdFx0dW5pZm9ybSA9IHsgdmFsdWU6IG51bGwsIG5lZWRzVXBkYXRlOiBmYWxzZSB9O1xyXG5cclxuXHR0aGlzLnVuaWZvcm0gPSB1bmlmb3JtO1xyXG5cdHRoaXMubnVtUGxhbmVzID0gMDtcclxuXHR0aGlzLm51bUludGVyc2VjdGlvbiA9IDA7XHJcblxyXG5cdHRoaXMuaW5pdCA9IGZ1bmN0aW9uICggcGxhbmVzLCBlbmFibGVMb2NhbENsaXBwaW5nICkge1xyXG5cclxuXHRcdGNvbnN0IGVuYWJsZWQgPVxyXG5cdFx0XHRwbGFuZXMubGVuZ3RoICE9PSAwIHx8XHJcblx0XHRcdGVuYWJsZUxvY2FsQ2xpcHBpbmcgfHxcclxuXHRcdFx0Ly8gZW5hYmxlIHN0YXRlIG9mIHByZXZpb3VzIGZyYW1lIC0gdGhlIGNsaXBwaW5nIGNvZGUgaGFzIHRvXHJcblx0XHRcdC8vIHJ1biBhbm90aGVyIGZyYW1lIGluIG9yZGVyIHRvIHJlc2V0IHRoZSBzdGF0ZTpcclxuXHRcdFx0bnVtR2xvYmFsUGxhbmVzICE9PSAwIHx8XHJcblx0XHRcdGxvY2FsQ2xpcHBpbmdFbmFibGVkO1xyXG5cclxuXHRcdGxvY2FsQ2xpcHBpbmdFbmFibGVkID0gZW5hYmxlTG9jYWxDbGlwcGluZztcclxuXHJcblx0XHRudW1HbG9iYWxQbGFuZXMgPSBwbGFuZXMubGVuZ3RoO1xyXG5cclxuXHRcdHJldHVybiBlbmFibGVkO1xyXG5cclxuXHR9O1xyXG5cclxuXHR0aGlzLmJlZ2luU2hhZG93cyA9IGZ1bmN0aW9uICgpIHtcclxuXHJcblx0XHRyZW5kZXJpbmdTaGFkb3dzID0gdHJ1ZTtcclxuXHRcdHByb2plY3RQbGFuZXMoIG51bGwgKTtcclxuXHJcblx0fTtcclxuXHJcblx0dGhpcy5lbmRTaGFkb3dzID0gZnVuY3Rpb24gKCkge1xyXG5cclxuXHRcdHJlbmRlcmluZ1NoYWRvd3MgPSBmYWxzZTtcclxuXHJcblx0fTtcclxuXHJcblx0dGhpcy5zZXRHbG9iYWxTdGF0ZSA9IGZ1bmN0aW9uICggcGxhbmVzLCBjYW1lcmEgKSB7XHJcblxyXG5cdFx0Z2xvYmFsU3RhdGUgPSBwcm9qZWN0UGxhbmVzKCBwbGFuZXMsIGNhbWVyYSwgMCApO1xyXG5cclxuXHR9O1xyXG5cclxuXHR0aGlzLnNldFN0YXRlID0gZnVuY3Rpb24gKCBtYXRlcmlhbCwgY2FtZXJhLCB1c2VDYWNoZSApIHtcclxuXHJcblx0XHRjb25zdCBwbGFuZXMgPSBtYXRlcmlhbC5jbGlwcGluZ1BsYW5lcyxcclxuXHRcdFx0Y2xpcEludGVyc2VjdGlvbiA9IG1hdGVyaWFsLmNsaXBJbnRlcnNlY3Rpb24sXHJcblx0XHRcdGNsaXBTaGFkb3dzID0gbWF0ZXJpYWwuY2xpcFNoYWRvd3M7XHJcblxyXG5cdFx0Y29uc3QgbWF0ZXJpYWxQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIG1hdGVyaWFsICk7XHJcblxyXG5cdFx0aWYgKCAhIGxvY2FsQ2xpcHBpbmdFbmFibGVkIHx8IHBsYW5lcyA9PT0gbnVsbCB8fCBwbGFuZXMubGVuZ3RoID09PSAwIHx8IHJlbmRlcmluZ1NoYWRvd3MgJiYgISBjbGlwU2hhZG93cyApIHtcclxuXHJcblx0XHRcdC8vIHRoZXJlJ3Mgbm8gbG9jYWwgY2xpcHBpbmdcclxuXHJcblx0XHRcdGlmICggcmVuZGVyaW5nU2hhZG93cyApIHtcclxuXHJcblx0XHRcdFx0Ly8gdGhlcmUncyBubyBnbG9iYWwgY2xpcHBpbmdcclxuXHJcblx0XHRcdFx0cHJvamVjdFBsYW5lcyggbnVsbCApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0cmVzZXRHbG9iYWxTdGF0ZSgpO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRjb25zdCBuR2xvYmFsID0gcmVuZGVyaW5nU2hhZG93cyA/IDAgOiBudW1HbG9iYWxQbGFuZXMsXHJcblx0XHRcdFx0bEdsb2JhbCA9IG5HbG9iYWwgKiA0O1xyXG5cclxuXHRcdFx0bGV0IGRzdEFycmF5ID0gbWF0ZXJpYWxQcm9wZXJ0aWVzLmNsaXBwaW5nU3RhdGUgfHwgbnVsbDtcclxuXHJcblx0XHRcdHVuaWZvcm0udmFsdWUgPSBkc3RBcnJheTsgLy8gZW5zdXJlIHVuaXF1ZSBzdGF0ZVxyXG5cclxuXHRcdFx0ZHN0QXJyYXkgPSBwcm9qZWN0UGxhbmVzKCBwbGFuZXMsIGNhbWVyYSwgbEdsb2JhbCwgdXNlQ2FjaGUgKTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSAhPT0gbEdsb2JhbDsgKysgaSApIHtcclxuXHJcblx0XHRcdFx0ZHN0QXJyYXlbIGkgXSA9IGdsb2JhbFN0YXRlWyBpIF07XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMuY2xpcHBpbmdTdGF0ZSA9IGRzdEFycmF5O1xyXG5cdFx0XHR0aGlzLm51bUludGVyc2VjdGlvbiA9IGNsaXBJbnRlcnNlY3Rpb24gPyB0aGlzLm51bVBsYW5lcyA6IDA7XHJcblx0XHRcdHRoaXMubnVtUGxhbmVzICs9IG5HbG9iYWw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHJcblx0fTtcclxuXHJcblx0ZnVuY3Rpb24gcmVzZXRHbG9iYWxTdGF0ZSgpIHtcclxuXHJcblx0XHRpZiAoIHVuaWZvcm0udmFsdWUgIT09IGdsb2JhbFN0YXRlICkge1xyXG5cclxuXHRcdFx0dW5pZm9ybS52YWx1ZSA9IGdsb2JhbFN0YXRlO1xyXG5cdFx0XHR1bmlmb3JtLm5lZWRzVXBkYXRlID0gbnVtR2xvYmFsUGxhbmVzID4gMDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0c2NvcGUubnVtUGxhbmVzID0gbnVtR2xvYmFsUGxhbmVzO1xyXG5cdFx0c2NvcGUubnVtSW50ZXJzZWN0aW9uID0gMDtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBwcm9qZWN0UGxhbmVzKCBwbGFuZXMsIGNhbWVyYSwgZHN0T2Zmc2V0LCBza2lwVHJhbnNmb3JtICkge1xyXG5cclxuXHRcdGNvbnN0IG5QbGFuZXMgPSBwbGFuZXMgIT09IG51bGwgPyBwbGFuZXMubGVuZ3RoIDogMDtcclxuXHRcdGxldCBkc3RBcnJheSA9IG51bGw7XHJcblxyXG5cdFx0aWYgKCBuUGxhbmVzICE9PSAwICkge1xyXG5cclxuXHRcdFx0ZHN0QXJyYXkgPSB1bmlmb3JtLnZhbHVlO1xyXG5cclxuXHRcdFx0aWYgKCBza2lwVHJhbnNmb3JtICE9PSB0cnVlIHx8IGRzdEFycmF5ID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBmbGF0U2l6ZSA9IGRzdE9mZnNldCArIG5QbGFuZXMgKiA0LFxyXG5cdFx0XHRcdFx0dmlld01hdHJpeCA9IGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2U7XHJcblxyXG5cdFx0XHRcdHZpZXdOb3JtYWxNYXRyaXguZ2V0Tm9ybWFsTWF0cml4KCB2aWV3TWF0cml4ICk7XHJcblxyXG5cdFx0XHRcdGlmICggZHN0QXJyYXkgPT09IG51bGwgfHwgZHN0QXJyYXkubGVuZ3RoIDwgZmxhdFNpemUgKSB7XHJcblxyXG5cdFx0XHRcdFx0ZHN0QXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KCBmbGF0U2l6ZSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMCwgaTQgPSBkc3RPZmZzZXQ7IGkgIT09IG5QbGFuZXM7ICsrIGksIGk0ICs9IDQgKSB7XHJcblxyXG5cdFx0XHRcdFx0cGxhbmUuY29weSggcGxhbmVzWyBpIF0gKS5hcHBseU1hdHJpeDQoIHZpZXdNYXRyaXgsIHZpZXdOb3JtYWxNYXRyaXggKTtcclxuXHJcblx0XHRcdFx0XHRwbGFuZS5ub3JtYWwudG9BcnJheSggZHN0QXJyYXksIGk0ICk7XHJcblx0XHRcdFx0XHRkc3RBcnJheVsgaTQgKyAzIF0gPSBwbGFuZS5jb25zdGFudDtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dW5pZm9ybS52YWx1ZSA9IGRzdEFycmF5O1xyXG5cdFx0XHR1bmlmb3JtLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0c2NvcGUubnVtUGxhbmVzID0gblBsYW5lcztcclxuXHRcdHNjb3BlLm51bUludGVyc2VjdGlvbiA9IDA7XHJcblxyXG5cdFx0cmV0dXJuIGRzdEFycmF5O1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgV2ViR0xDbGlwcGluZyB9O1xyXG4iLCJpbXBvcnQgeyBDdWJlUmVmbGVjdGlvbk1hcHBpbmcsIEN1YmVSZWZyYWN0aW9uTWFwcGluZywgRXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmcsIEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgV2ViR0xDdWJlUmVuZGVyVGFyZ2V0IH0gZnJvbSAnLi4vV2ViR0xDdWJlUmVuZGVyVGFyZ2V0LmpzJztcclxuXHJcbmZ1bmN0aW9uIFdlYkdMQ3ViZU1hcHMoIHJlbmRlcmVyICkge1xyXG5cclxuXHRsZXQgY3ViZW1hcHMgPSBuZXcgV2Vha01hcCgpO1xyXG5cclxuXHRmdW5jdGlvbiBtYXBUZXh0dXJlTWFwcGluZyggdGV4dHVyZSwgbWFwcGluZyApIHtcclxuXHJcblx0XHRpZiAoIG1hcHBpbmcgPT09IEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nICkge1xyXG5cclxuXHRcdFx0dGV4dHVyZS5tYXBwaW5nID0gQ3ViZVJlZmxlY3Rpb25NYXBwaW5nO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIG1hcHBpbmcgPT09IEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nICkge1xyXG5cclxuXHRcdFx0dGV4dHVyZS5tYXBwaW5nID0gQ3ViZVJlZnJhY3Rpb25NYXBwaW5nO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGV4dHVyZTtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBnZXQoIHRleHR1cmUgKSB7XHJcblxyXG5cdFx0aWYgKCB0ZXh0dXJlICYmIHRleHR1cmUuaXNUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0Y29uc3QgbWFwcGluZyA9IHRleHR1cmUubWFwcGluZztcclxuXHJcblx0XHRcdGlmICggbWFwcGluZyA9PT0gRXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmcgfHwgbWFwcGluZyA9PT0gRXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmcgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggY3ViZW1hcHMuaGFzKCB0ZXh0dXJlICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgY3ViZW1hcCA9IGN1YmVtYXBzLmdldCggdGV4dHVyZSApLnRleHR1cmU7XHJcblx0XHRcdFx0XHRyZXR1cm4gbWFwVGV4dHVyZU1hcHBpbmcoIGN1YmVtYXAsIHRleHR1cmUubWFwcGluZyApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGltYWdlID0gdGV4dHVyZS5pbWFnZTtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGltYWdlICYmIGltYWdlLmhlaWdodCA+IDAgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCByZW5kZXJUYXJnZXQgPSBuZXcgV2ViR0xDdWJlUmVuZGVyVGFyZ2V0KCBpbWFnZS5oZWlnaHQgKTtcclxuXHRcdFx0XHRcdFx0cmVuZGVyVGFyZ2V0LmZyb21FcXVpcmVjdGFuZ3VsYXJUZXh0dXJlKCByZW5kZXJlciwgdGV4dHVyZSApO1xyXG5cdFx0XHRcdFx0XHRjdWJlbWFwcy5zZXQoIHRleHR1cmUsIHJlbmRlclRhcmdldCApO1xyXG5cclxuXHRcdFx0XHRcdFx0dGV4dHVyZS5hZGRFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uVGV4dHVyZURpc3Bvc2UgKTtcclxuXHJcblx0XHRcdFx0XHRcdHJldHVybiBtYXBUZXh0dXJlTWFwcGluZyggcmVuZGVyVGFyZ2V0LnRleHR1cmUsIHRleHR1cmUubWFwcGluZyApO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBpbWFnZSBub3QgeWV0IHJlYWR5LiB0cnkgdGhlIGNvbnZlcnNpb24gbmV4dCBmcmFtZVxyXG5cclxuXHRcdFx0XHRcdFx0cmV0dXJuIG51bGw7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0ZXh0dXJlO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIG9uVGV4dHVyZURpc3Bvc2UoIGV2ZW50ICkge1xyXG5cclxuXHRcdGNvbnN0IHRleHR1cmUgPSBldmVudC50YXJnZXQ7XHJcblxyXG5cdFx0dGV4dHVyZS5yZW1vdmVFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uVGV4dHVyZURpc3Bvc2UgKTtcclxuXHJcblx0XHRjb25zdCBjdWJlbWFwID0gY3ViZW1hcHMuZ2V0KCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0aWYgKCBjdWJlbWFwICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRjdWJlbWFwcy5kZWxldGUoIHRleHR1cmUgKTtcclxuXHRcdFx0Y3ViZW1hcC5kaXNwb3NlKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0Y3ViZW1hcHMgPSBuZXcgV2Vha01hcCgpO1xyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiB7XHJcblx0XHRnZXQ6IGdldCxcclxuXHRcdGRpc3Bvc2U6IGRpc3Bvc2VcclxuXHR9O1xyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgV2ViR0xDdWJlTWFwcyB9O1xyXG4iLCJpbXBvcnQge1xyXG5cdEN1YmVSZWZsZWN0aW9uTWFwcGluZyxcclxuXHRDdWJlUmVmcmFjdGlvbk1hcHBpbmcsXHJcblx0Q3ViZVVWUmVmbGVjdGlvbk1hcHBpbmcsXHJcblx0TGluZWFyRmlsdGVyLFxyXG5cdE5vVG9uZU1hcHBpbmcsXHJcblx0Tm9CbGVuZGluZyxcclxuXHRSR0JBRm9ybWF0LFxyXG5cdEhhbGZGbG9hdFR5cGUsXHJcblx0QmFja1NpZGUsXHJcblx0TGluZWFyU1JHQkNvbG9yU3BhY2VcclxufSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xyXG5cclxuaW1wb3J0IHsgQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5pbXBvcnQgeyBCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4uL2NvcmUvQnVmZmVyR2VvbWV0cnkuanMnO1xyXG5pbXBvcnQgeyBNZXNoIH0gZnJvbSAnLi4vb2JqZWN0cy9NZXNoLmpzJztcclxuaW1wb3J0IHsgT3J0aG9ncmFwaGljQ2FtZXJhIH0gZnJvbSAnLi4vY2FtZXJhcy9PcnRob2dyYXBoaWNDYW1lcmEuanMnO1xyXG5pbXBvcnQgeyBQZXJzcGVjdGl2ZUNhbWVyYSB9IGZyb20gJy4uL2NhbWVyYXMvUGVyc3BlY3RpdmVDYW1lcmEuanMnO1xyXG5pbXBvcnQgeyBTaGFkZXJNYXRlcmlhbCB9IGZyb20gJy4uL21hdGVyaWFscy9TaGFkZXJNYXRlcmlhbC5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uL21hdGgvQ29sb3IuanMnO1xyXG5pbXBvcnQgeyBXZWJHTFJlbmRlclRhcmdldCB9IGZyb20gJy4uL3JlbmRlcmVycy9XZWJHTFJlbmRlclRhcmdldC5qcyc7XHJcbmltcG9ydCB7IE1lc2hCYXNpY01hdGVyaWFsIH0gZnJvbSAnLi4vbWF0ZXJpYWxzL01lc2hCYXNpY01hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgQm94R2VvbWV0cnkgfSBmcm9tICcuLi9nZW9tZXRyaWVzL0JveEdlb21ldHJ5LmpzJztcclxuXHJcbmNvbnN0IExPRF9NSU4gPSA0O1xyXG5cclxuLy8gVGhlIHN0YW5kYXJkIGRldmlhdGlvbnMgKHJhZGlhbnMpIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXh0cmEgbWlwcy4gVGhlc2UgYXJlXHJcbi8vIGNob3NlbiB0byBhcHByb3hpbWF0ZSBhIFRyb3dicmlkZ2UtUmVpdHogZGlzdHJpYnV0aW9uIGZ1bmN0aW9uIHRpbWVzIHRoZVxyXG4vLyBnZW9tZXRyaWMgc2hhZG93aW5nIGZ1bmN0aW9uLiBUaGVzZSBzaWdtYSB2YWx1ZXMgc3F1YXJlZCBtdXN0IG1hdGNoIHRoZVxyXG4vLyB2YXJpYW5jZSAjZGVmaW5lcyBpbiBjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQuZ2xzbC5qcy5cclxuY29uc3QgRVhUUkFfTE9EX1NJR01BID0gWyAwLjEyNSwgMC4yMTUsIDAuMzUsIDAuNDQ2LCAwLjUyNiwgMC41ODIgXTtcclxuXHJcbi8vIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgYmx1ciBmb3IgbG9vcC4gU21hbGxlciBzaWdtYXMgd2lsbCB1c2UgZmV3ZXJcclxuLy8gc2FtcGxlcyBhbmQgZXhpdCBlYXJseSwgYnV0IG5vdCByZWNvbXBpbGUgdGhlIHNoYWRlci5cclxuY29uc3QgTUFYX1NBTVBMRVMgPSAyMDtcclxuXHJcbmNvbnN0IF9mbGF0Q2FtZXJhID0gLypAX19QVVJFX18qLyBuZXcgT3J0aG9ncmFwaGljQ2FtZXJhKCk7XHJcbmNvbnN0IF9jbGVhckNvbG9yID0gLypAX19QVVJFX18qLyBuZXcgQ29sb3IoKTtcclxubGV0IF9vbGRUYXJnZXQgPSBudWxsO1xyXG5sZXQgX29sZEFjdGl2ZUN1YmVGYWNlID0gMDtcclxubGV0IF9vbGRBY3RpdmVNaXBtYXBMZXZlbCA9IDA7XHJcbmxldCBfb2xkWHJFbmFibGVkID0gZmFsc2U7XHJcblxyXG4vLyBHb2xkZW4gUmF0aW9cclxuY29uc3QgUEhJID0gKCAxICsgTWF0aC5zcXJ0KCA1ICkgKSAvIDI7XHJcbmNvbnN0IElOVl9QSEkgPSAxIC8gUEhJO1xyXG5cclxuLy8gVmVydGljZXMgb2YgYSBkb2RlY2FoZWRyb24gKGV4Y2VwdCB0aGUgb3Bwb3NpdGVzLCB3aGljaCByZXByZXNlbnQgdGhlXHJcbi8vIHNhbWUgYXhpcyksIHVzZWQgYXMgYXhpcyBkaXJlY3Rpb25zIGV2ZW5seSBzcHJlYWQgb24gYSBzcGhlcmUuXHJcbmNvbnN0IF9heGlzRGlyZWN0aW9ucyA9IFtcclxuXHQvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCAtIFBISSwgSU5WX1BISSwgMCApLFxyXG5cdC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoIFBISSwgSU5WX1BISSwgMCApLFxyXG5cdC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoIC0gSU5WX1BISSwgMCwgUEhJICksXHJcblx0LypAX19QVVJFX18qLyBuZXcgVmVjdG9yMyggSU5WX1BISSwgMCwgUEhJICksXHJcblx0LypAX19QVVJFX18qLyBuZXcgVmVjdG9yMyggMCwgUEhJLCAtIElOVl9QSEkgKSxcclxuXHQvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCAwLCBQSEksIElOVl9QSEkgKSxcclxuXHQvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCAtIDEsIDEsIC0gMSApLFxyXG5cdC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoIDEsIDEsIC0gMSApLFxyXG5cdC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoIC0gMSwgMSwgMSApLFxyXG5cdC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoIDEsIDEsIDEgKSBdO1xyXG5cclxuY29uc3QgX29yaWdpbiA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGNsYXNzIGdlbmVyYXRlcyBhIFByZWZpbHRlcmVkLCBNaXBtYXBwZWQgUmFkaWFuY2UgRW52aXJvbm1lbnQgTWFwXHJcbiAqIChQTVJFTSkgZnJvbSBhIGN1YmVNYXAgZW52aXJvbm1lbnQgdGV4dHVyZS4gVGhpcyBhbGxvd3MgZGlmZmVyZW50IGxldmVscyBvZlxyXG4gKiBibHVyIHRvIGJlIHF1aWNrbHkgYWNjZXNzZWQgYmFzZWQgb24gbWF0ZXJpYWwgcm91Z2huZXNzLiBJdCBpcyBwYWNrZWQgaW50byBhXHJcbiAqIHNwZWNpYWwgQ3ViZVVWIGZvcm1hdCB0aGF0IGFsbG93cyB1cyB0byBwZXJmb3JtIGN1c3RvbSBpbnRlcnBvbGF0aW9uIHNvIHRoYXRcclxuICogd2UgY2FuIHN1cHBvcnQgbm9ubGluZWFyIGZvcm1hdHMgc3VjaCBhcyBSR0JFLiBVbmxpa2UgYSB0cmFkaXRpb25hbCBtaXBtYXBcclxuICogY2hhaW4sIGl0IG9ubHkgZ29lcyBkb3duIHRvIHRoZSBMT0RfTUlOIGxldmVsIChhYm92ZSksIGFuZCB0aGVuIGNyZWF0ZXMgZXh0cmFcclxuICogZXZlbiBtb3JlIGZpbHRlcmVkICdtaXBzJyBhdCB0aGUgc2FtZSBMT0RfTUlOIHJlc29sdXRpb24sIGFzc29jaWF0ZWQgd2l0aFxyXG4gKiBoaWdoZXIgcm91Z2huZXNzIGxldmVscy4gSW4gdGhpcyB3YXkgd2UgbWFpbnRhaW4gcmVzb2x1dGlvbiB0byBzbW9vdGhseVxyXG4gKiBpbnRlcnBvbGF0ZSBkaWZmdXNlIGxpZ2h0aW5nIHdoaWxlIGxpbWl0aW5nIHNhbXBsaW5nIGNvbXB1dGF0aW9uLlxyXG4gKlxyXG4gKiBQYXBlcjogRmFzdCwgQWNjdXJhdGUgSW1hZ2UtQmFzZWQgTGlnaHRpbmc6XHJcbiAqIHtAbGluayBodHRwczovL2RyaXZlLmdvb2dsZS5jb20vZmlsZS9kLzE1eThyX1VwS2xVOVN2VjRJTGIwQzNxQ1BlY1M4cHZMei92aWV3fVxyXG4qL1xyXG5jbGFzcyBQTVJFTUdlbmVyYXRvciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgUE1SRU0gZ2VuZXJhdG9yLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcmVuZGVyZXIgKSB7XHJcblxyXG5cdFx0dGhpcy5fcmVuZGVyZXIgPSByZW5kZXJlcjtcclxuXHRcdHRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0ID0gbnVsbDtcclxuXHJcblx0XHR0aGlzLl9sb2RNYXggPSAwO1xyXG5cdFx0dGhpcy5fY3ViZVNpemUgPSAwO1xyXG5cdFx0dGhpcy5fbG9kUGxhbmVzID0gW107XHJcblx0XHR0aGlzLl9zaXplTG9kcyA9IFtdO1xyXG5cdFx0dGhpcy5fc2lnbWFzID0gW107XHJcblxyXG5cdFx0dGhpcy5fYmx1ck1hdGVyaWFsID0gbnVsbDtcclxuXHRcdHRoaXMuX2N1YmVtYXBNYXRlcmlhbCA9IG51bGw7XHJcblx0XHR0aGlzLl9lcXVpcmVjdE1hdGVyaWFsID0gbnVsbDtcclxuXHJcblx0XHR0aGlzLl9jb21waWxlTWF0ZXJpYWwoIHRoaXMuX2JsdXJNYXRlcmlhbCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyBhIFBNUkVNIGZyb20gYSBzdXBwbGllZCBTY2VuZSwgd2hpY2ggY2FuIGJlIGZhc3RlciB0aGFuIHVzaW5nIGFuXHJcblx0ICogaW1hZ2UgaWYgbmV0d29ya2luZyBiYW5kd2lkdGggaXMgbG93LiBPcHRpb25hbCBzaWdtYSBzcGVjaWZpZXMgYSBibHVyIHJhZGl1c1xyXG5cdCAqIGluIHJhZGlhbnMgdG8gYmUgYXBwbGllZCB0byB0aGUgc2NlbmUgYmVmb3JlIFBNUkVNIGdlbmVyYXRpb24uIE9wdGlvbmFsIG5lYXJcclxuXHQgKiBhbmQgZmFyIHBsYW5lcyBlbnN1cmUgdGhlIHNjZW5lIGlzIHJlbmRlcmVkIGluIGl0cyBlbnRpcmV0eS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7U2NlbmV9IHNjZW5lIC0gVGhlIHNjZW5lIHRvIGJlIGNhcHR1cmVkLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbc2lnbWE9MF0gLSBUaGUgYmx1ciByYWRpdXMgaW4gcmFkaWFucy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW25lYXI9MC4xXSAtIFRoZSBuZWFyIHBsYW5lIGRpc3RhbmNlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZmFyPTEwMF0gLSBUaGUgZmFyIHBsYW5lIGRpc3RhbmNlLlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gLSBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5zaXplPTI1Nl0gLSBUaGUgdGV4dHVyZSBzaXplIG9mIHRoZSBQTVJFTS5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IFtvcHRpb25zLnJlbmRlclRhcmdldD1vcmlnaW5dIC0gVGhlIHBvc2l0aW9uIG9mIHRoZSBpbnRlcm5hbCBjdWJlIGNhbWVyYSB0aGF0IHJlbmRlcnMgdGhlIHNjZW5lLlxyXG5cdCAqIEByZXR1cm4ge1dlYkdMUmVuZGVyVGFyZ2V0fSBUaGUgcmVzdWx0aW5nIFBNUkVNLlxyXG5cdCAqL1xyXG5cdGZyb21TY2VuZSggc2NlbmUsIHNpZ21hID0gMCwgbmVhciA9IDAuMSwgZmFyID0gMTAwLCBvcHRpb25zID0ge30gKSB7XHJcblxyXG5cdFx0Y29uc3Qge1xyXG5cdFx0XHRzaXplID0gMjU2LFxyXG5cdFx0XHRwb3NpdGlvbiA9IF9vcmlnaW4sXHJcblx0XHR9ID0gb3B0aW9ucztcclxuXHJcblx0XHRfb2xkVGFyZ2V0ID0gdGhpcy5fcmVuZGVyZXIuZ2V0UmVuZGVyVGFyZ2V0KCk7XHJcblx0XHRfb2xkQWN0aXZlQ3ViZUZhY2UgPSB0aGlzLl9yZW5kZXJlci5nZXRBY3RpdmVDdWJlRmFjZSgpO1xyXG5cdFx0X29sZEFjdGl2ZU1pcG1hcExldmVsID0gdGhpcy5fcmVuZGVyZXIuZ2V0QWN0aXZlTWlwbWFwTGV2ZWwoKTtcclxuXHRcdF9vbGRYckVuYWJsZWQgPSB0aGlzLl9yZW5kZXJlci54ci5lbmFibGVkO1xyXG5cclxuXHRcdHRoaXMuX3JlbmRlcmVyLnhyLmVuYWJsZWQgPSBmYWxzZTtcclxuXHJcblx0XHR0aGlzLl9zZXRTaXplKCBzaXplICk7XHJcblxyXG5cdFx0Y29uc3QgY3ViZVVWUmVuZGVyVGFyZ2V0ID0gdGhpcy5fYWxsb2NhdGVUYXJnZXRzKCk7XHJcblx0XHRjdWJlVVZSZW5kZXJUYXJnZXQuZGVwdGhCdWZmZXIgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMuX3NjZW5lVG9DdWJlVVYoIHNjZW5lLCBuZWFyLCBmYXIsIGN1YmVVVlJlbmRlclRhcmdldCwgcG9zaXRpb24gKTtcclxuXHJcblx0XHRpZiAoIHNpZ21hID4gMCApIHtcclxuXHJcblx0XHRcdHRoaXMuX2JsdXIoIGN1YmVVVlJlbmRlclRhcmdldCwgMCwgMCwgc2lnbWEgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5fYXBwbHlQTVJFTSggY3ViZVVWUmVuZGVyVGFyZ2V0ICk7XHJcblx0XHR0aGlzLl9jbGVhbnVwKCBjdWJlVVZSZW5kZXJUYXJnZXQgKTtcclxuXHJcblx0XHRyZXR1cm4gY3ViZVVWUmVuZGVyVGFyZ2V0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyBhIFBNUkVNIGZyb20gYW4gZXF1aXJlY3Rhbmd1bGFyIHRleHR1cmUsIHdoaWNoIGNhbiBiZSBlaXRoZXIgTERSXHJcblx0ICogb3IgSERSLiBUaGUgaWRlYWwgaW5wdXQgaW1hZ2Ugc2l6ZSBpcyAxayAoMTAyNCB4IDUxMiksXHJcblx0ICogYXMgdGhpcyBtYXRjaGVzIGJlc3Qgd2l0aCB0aGUgMjU2IHggMjU2IGN1YmVtYXAgb3V0cHV0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSBlcXVpcmVjdGFuZ3VsYXIgLSBUaGUgZXF1aXJlY3Rhbmd1bGFyIHRleHR1cmUgdG8gYmUgY29udmVydGVkLlxyXG5cdCAqIEBwYXJhbSB7P1dlYkdMUmVuZGVyVGFyZ2V0fSBbcmVuZGVyVGFyZ2V0PW51bGxdIC0gVGhlIHJlbmRlciB0YXJnZXQgdG8gdXNlLlxyXG5cdCAqIEByZXR1cm4ge1dlYkdMUmVuZGVyVGFyZ2V0fSBUaGUgcmVzdWx0aW5nIFBNUkVNLlxyXG5cdCAqL1xyXG5cdGZyb21FcXVpcmVjdGFuZ3VsYXIoIGVxdWlyZWN0YW5ndWxhciwgcmVuZGVyVGFyZ2V0ID0gbnVsbCApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fZnJvbVRleHR1cmUoIGVxdWlyZWN0YW5ndWxhciwgcmVuZGVyVGFyZ2V0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2VuZXJhdGVzIGEgUE1SRU0gZnJvbSBhbiBjdWJlbWFwIHRleHR1cmUsIHdoaWNoIGNhbiBiZSBlaXRoZXIgTERSXHJcblx0ICogb3IgSERSLiBUaGUgaWRlYWwgaW5wdXQgY3ViZSBzaXplIGlzIDI1NiB4IDI1NixcclxuXHQgKiBhcyB0aGlzIG1hdGNoZXMgYmVzdCB3aXRoIHRoZSAyNTYgeCAyNTYgY3ViZW1hcCBvdXRwdXQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IGN1YmVtYXAgLSBUaGUgY3ViZW1hcCB0ZXh0dXJlIHRvIGJlIGNvbnZlcnRlZC5cclxuXHQgKiBAcGFyYW0gez9XZWJHTFJlbmRlclRhcmdldH0gW3JlbmRlclRhcmdldD1udWxsXSAtIFRoZSByZW5kZXIgdGFyZ2V0IHRvIHVzZS5cclxuXHQgKiBAcmV0dXJuIHtXZWJHTFJlbmRlclRhcmdldH0gVGhlIHJlc3VsdGluZyBQTVJFTS5cclxuXHQgKi9cclxuXHRmcm9tQ3ViZW1hcCggY3ViZW1hcCwgcmVuZGVyVGFyZ2V0ID0gbnVsbCApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fZnJvbVRleHR1cmUoIGN1YmVtYXAsIHJlbmRlclRhcmdldCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFByZS1jb21waWxlcyB0aGUgY3ViZW1hcCBzaGFkZXIuIFlvdSBjYW4gZ2V0IGZhc3RlciBzdGFydC11cCBieSBpbnZva2luZyB0aGlzIG1ldGhvZCBkdXJpbmdcclxuXHQgKiB5b3VyIHRleHR1cmUncyBuZXR3b3JrIGZldGNoIGZvciBpbmNyZWFzZWQgY29uY3VycmVuY3kuXHJcblx0ICovXHJcblx0Y29tcGlsZUN1YmVtYXBTaGFkZXIoKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9jdWJlbWFwTWF0ZXJpYWwgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLl9jdWJlbWFwTWF0ZXJpYWwgPSBfZ2V0Q3ViZW1hcE1hdGVyaWFsKCk7XHJcblx0XHRcdHRoaXMuX2NvbXBpbGVNYXRlcmlhbCggdGhpcy5fY3ViZW1hcE1hdGVyaWFsICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFByZS1jb21waWxlcyB0aGUgZXF1aXJlY3Rhbmd1bGFyIHNoYWRlci4gWW91IGNhbiBnZXQgZmFzdGVyIHN0YXJ0LXVwIGJ5IGludm9raW5nIHRoaXMgbWV0aG9kIGR1cmluZ1xyXG5cdCAqIHlvdXIgdGV4dHVyZSdzIG5ldHdvcmsgZmV0Y2ggZm9yIGluY3JlYXNlZCBjb25jdXJyZW5jeS5cclxuXHQgKi9cclxuXHRjb21waWxlRXF1aXJlY3Rhbmd1bGFyU2hhZGVyKCkge1xyXG5cclxuXHRcdGlmICggdGhpcy5fZXF1aXJlY3RNYXRlcmlhbCA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuX2VxdWlyZWN0TWF0ZXJpYWwgPSBfZ2V0RXF1aXJlY3RNYXRlcmlhbCgpO1xyXG5cdFx0XHR0aGlzLl9jb21waWxlTWF0ZXJpYWwoIHRoaXMuX2VxdWlyZWN0TWF0ZXJpYWwgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGlzcG9zZXMgb2YgdGhlIFBNUkVNR2VuZXJhdG9yJ3MgaW50ZXJuYWwgbWVtb3J5LiBOb3RlIHRoYXQgUE1SRU1HZW5lcmF0b3IgaXMgYSBzdGF0aWMgY2xhc3MsXHJcblx0ICogc28geW91IHNob3VsZCBub3QgbmVlZCBtb3JlIHRoYW4gb25lIFBNUkVNR2VuZXJhdG9yIG9iamVjdC4gSWYgeW91IGRvLCBjYWxsaW5nIGRpc3Bvc2UoKSBvblxyXG5cdCAqIG9uZSBvZiB0aGVtIHdpbGwgY2F1c2UgYW55IG90aGVycyB0byBhbHNvIGJlY29tZSB1bnVzYWJsZS5cclxuXHQgKi9cclxuXHRkaXNwb3NlKCkge1xyXG5cclxuXHRcdHRoaXMuX2Rpc3Bvc2UoKTtcclxuXHJcblx0XHRpZiAoIHRoaXMuX2N1YmVtYXBNYXRlcmlhbCAhPT0gbnVsbCApIHRoaXMuX2N1YmVtYXBNYXRlcmlhbC5kaXNwb3NlKCk7XHJcblx0XHRpZiAoIHRoaXMuX2VxdWlyZWN0TWF0ZXJpYWwgIT09IG51bGwgKSB0aGlzLl9lcXVpcmVjdE1hdGVyaWFsLmRpc3Bvc2UoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvLyBwcml2YXRlIGludGVyZmFjZVxyXG5cclxuXHRfc2V0U2l6ZSggY3ViZVNpemUgKSB7XHJcblxyXG5cdFx0dGhpcy5fbG9kTWF4ID0gTWF0aC5mbG9vciggTWF0aC5sb2cyKCBjdWJlU2l6ZSApICk7XHJcblx0XHR0aGlzLl9jdWJlU2l6ZSA9IE1hdGgucG93KCAyLCB0aGlzLl9sb2RNYXggKTtcclxuXHJcblx0fVxyXG5cclxuXHRfZGlzcG9zZSgpIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuX2JsdXJNYXRlcmlhbCAhPT0gbnVsbCApIHRoaXMuX2JsdXJNYXRlcmlhbC5kaXNwb3NlKCk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9waW5nUG9uZ1JlbmRlclRhcmdldCAhPT0gbnVsbCApIHRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0LmRpc3Bvc2UoKTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB0aGlzLl9sb2RQbGFuZXMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0dGhpcy5fbG9kUGxhbmVzWyBpIF0uZGlzcG9zZSgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRfY2xlYW51cCggb3V0cHV0VGFyZ2V0ICkge1xyXG5cclxuXHRcdHRoaXMuX3JlbmRlcmVyLnNldFJlbmRlclRhcmdldCggX29sZFRhcmdldCwgX29sZEFjdGl2ZUN1YmVGYWNlLCBfb2xkQWN0aXZlTWlwbWFwTGV2ZWwgKTtcclxuXHRcdHRoaXMuX3JlbmRlcmVyLnhyLmVuYWJsZWQgPSBfb2xkWHJFbmFibGVkO1xyXG5cclxuXHRcdG91dHB1dFRhcmdldC5zY2lzc29yVGVzdCA9IGZhbHNlO1xyXG5cdFx0X3NldFZpZXdwb3J0KCBvdXRwdXRUYXJnZXQsIDAsIDAsIG91dHB1dFRhcmdldC53aWR0aCwgb3V0cHV0VGFyZ2V0LmhlaWdodCApO1xyXG5cclxuXHR9XHJcblxyXG5cdF9mcm9tVGV4dHVyZSggdGV4dHVyZSwgcmVuZGVyVGFyZ2V0ICkge1xyXG5cclxuXHRcdGlmICggdGV4dHVyZS5tYXBwaW5nID09PSBDdWJlUmVmbGVjdGlvbk1hcHBpbmcgfHwgdGV4dHVyZS5tYXBwaW5nID09PSBDdWJlUmVmcmFjdGlvbk1hcHBpbmcgKSB7XHJcblxyXG5cdFx0XHR0aGlzLl9zZXRTaXplKCB0ZXh0dXJlLmltYWdlLmxlbmd0aCA9PT0gMCA/IDE2IDogKCB0ZXh0dXJlLmltYWdlWyAwIF0ud2lkdGggfHwgdGV4dHVyZS5pbWFnZVsgMCBdLmltYWdlLndpZHRoICkgKTtcclxuXHJcblx0XHR9IGVsc2UgeyAvLyBFcXVpcmVjdGFuZ3VsYXJcclxuXHJcblx0XHRcdHRoaXMuX3NldFNpemUoIHRleHR1cmUuaW1hZ2Uud2lkdGggLyA0ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdF9vbGRUYXJnZXQgPSB0aGlzLl9yZW5kZXJlci5nZXRSZW5kZXJUYXJnZXQoKTtcclxuXHRcdF9vbGRBY3RpdmVDdWJlRmFjZSA9IHRoaXMuX3JlbmRlcmVyLmdldEFjdGl2ZUN1YmVGYWNlKCk7XHJcblx0XHRfb2xkQWN0aXZlTWlwbWFwTGV2ZWwgPSB0aGlzLl9yZW5kZXJlci5nZXRBY3RpdmVNaXBtYXBMZXZlbCgpO1xyXG5cdFx0X29sZFhyRW5hYmxlZCA9IHRoaXMuX3JlbmRlcmVyLnhyLmVuYWJsZWQ7XHJcblxyXG5cdFx0dGhpcy5fcmVuZGVyZXIueHIuZW5hYmxlZCA9IGZhbHNlO1xyXG5cclxuXHRcdGNvbnN0IGN1YmVVVlJlbmRlclRhcmdldCA9IHJlbmRlclRhcmdldCB8fCB0aGlzLl9hbGxvY2F0ZVRhcmdldHMoKTtcclxuXHRcdHRoaXMuX3RleHR1cmVUb0N1YmVVViggdGV4dHVyZSwgY3ViZVVWUmVuZGVyVGFyZ2V0ICk7XHJcblx0XHR0aGlzLl9hcHBseVBNUkVNKCBjdWJlVVZSZW5kZXJUYXJnZXQgKTtcclxuXHRcdHRoaXMuX2NsZWFudXAoIGN1YmVVVlJlbmRlclRhcmdldCApO1xyXG5cclxuXHRcdHJldHVybiBjdWJlVVZSZW5kZXJUYXJnZXQ7XHJcblxyXG5cdH1cclxuXHJcblx0X2FsbG9jYXRlVGFyZ2V0cygpIHtcclxuXHJcblx0XHRjb25zdCB3aWR0aCA9IDMgKiBNYXRoLm1heCggdGhpcy5fY3ViZVNpemUsIDE2ICogNyApO1xyXG5cdFx0Y29uc3QgaGVpZ2h0ID0gNCAqIHRoaXMuX2N1YmVTaXplO1xyXG5cclxuXHRcdGNvbnN0IHBhcmFtcyA9IHtcclxuXHRcdFx0bWFnRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXHJcblx0XHRcdG1pbkZpbHRlcjogTGluZWFyRmlsdGVyLFxyXG5cdFx0XHRnZW5lcmF0ZU1pcG1hcHM6IGZhbHNlLFxyXG5cdFx0XHR0eXBlOiBIYWxmRmxvYXRUeXBlLFxyXG5cdFx0XHRmb3JtYXQ6IFJHQkFGb3JtYXQsXHJcblx0XHRcdGNvbG9yU3BhY2U6IExpbmVhclNSR0JDb2xvclNwYWNlLFxyXG5cdFx0XHRkZXB0aEJ1ZmZlcjogZmFsc2VcclxuXHRcdH07XHJcblxyXG5cdFx0Y29uc3QgY3ViZVVWUmVuZGVyVGFyZ2V0ID0gX2NyZWF0ZVJlbmRlclRhcmdldCggd2lkdGgsIGhlaWdodCwgcGFyYW1zICk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9waW5nUG9uZ1JlbmRlclRhcmdldCA9PT0gbnVsbCB8fCB0aGlzLl9waW5nUG9uZ1JlbmRlclRhcmdldC53aWR0aCAhPT0gd2lkdGggfHwgdGhpcy5fcGluZ1BvbmdSZW5kZXJUYXJnZXQuaGVpZ2h0ICE9PSBoZWlnaHQgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLl9kaXNwb3NlKCk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0aGlzLl9waW5nUG9uZ1JlbmRlclRhcmdldCA9IF9jcmVhdGVSZW5kZXJUYXJnZXQoIHdpZHRoLCBoZWlnaHQsIHBhcmFtcyApO1xyXG5cclxuXHRcdFx0Y29uc3QgeyBfbG9kTWF4IH0gPSB0aGlzO1xyXG5cdFx0XHQoIHsgc2l6ZUxvZHM6IHRoaXMuX3NpemVMb2RzLCBsb2RQbGFuZXM6IHRoaXMuX2xvZFBsYW5lcywgc2lnbWFzOiB0aGlzLl9zaWdtYXMgfSA9IF9jcmVhdGVQbGFuZXMoIF9sb2RNYXggKSApO1xyXG5cclxuXHRcdFx0dGhpcy5fYmx1ck1hdGVyaWFsID0gX2dldEJsdXJTaGFkZXIoIF9sb2RNYXgsIHdpZHRoLCBoZWlnaHQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGN1YmVVVlJlbmRlclRhcmdldDtcclxuXHJcblx0fVxyXG5cclxuXHRfY29tcGlsZU1hdGVyaWFsKCBtYXRlcmlhbCApIHtcclxuXHJcblx0XHRjb25zdCB0bXBNZXNoID0gbmV3IE1lc2goIHRoaXMuX2xvZFBsYW5lc1sgMCBdLCBtYXRlcmlhbCApO1xyXG5cdFx0dGhpcy5fcmVuZGVyZXIuY29tcGlsZSggdG1wTWVzaCwgX2ZsYXRDYW1lcmEgKTtcclxuXHJcblx0fVxyXG5cclxuXHRfc2NlbmVUb0N1YmVVViggc2NlbmUsIG5lYXIsIGZhciwgY3ViZVVWUmVuZGVyVGFyZ2V0LCBwb3NpdGlvbiApIHtcclxuXHJcblx0XHRjb25zdCBmb3YgPSA5MDtcclxuXHRcdGNvbnN0IGFzcGVjdCA9IDE7XHJcblx0XHRjb25zdCBjdWJlQ2FtZXJhID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICk7XHJcblx0XHRjb25zdCB1cFNpZ24gPSBbIDEsIC0gMSwgMSwgMSwgMSwgMSBdO1xyXG5cdFx0Y29uc3QgZm9yd2FyZFNpZ24gPSBbIDEsIDEsIDEsIC0gMSwgLSAxLCAtIDEgXTtcclxuXHRcdGNvbnN0IHJlbmRlcmVyID0gdGhpcy5fcmVuZGVyZXI7XHJcblxyXG5cdFx0Y29uc3Qgb3JpZ2luYWxBdXRvQ2xlYXIgPSByZW5kZXJlci5hdXRvQ2xlYXI7XHJcblx0XHRjb25zdCB0b25lTWFwcGluZyA9IHJlbmRlcmVyLnRvbmVNYXBwaW5nO1xyXG5cdFx0cmVuZGVyZXIuZ2V0Q2xlYXJDb2xvciggX2NsZWFyQ29sb3IgKTtcclxuXHJcblx0XHRyZW5kZXJlci50b25lTWFwcGluZyA9IE5vVG9uZU1hcHBpbmc7XHJcblx0XHRyZW5kZXJlci5hdXRvQ2xlYXIgPSBmYWxzZTtcclxuXHJcblx0XHRjb25zdCBiYWNrZ3JvdW5kTWF0ZXJpYWwgPSBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoIHtcclxuXHRcdFx0bmFtZTogJ1BNUkVNLkJhY2tncm91bmQnLFxyXG5cdFx0XHRzaWRlOiBCYWNrU2lkZSxcclxuXHRcdFx0ZGVwdGhXcml0ZTogZmFsc2UsXHJcblx0XHRcdGRlcHRoVGVzdDogZmFsc2UsXHJcblx0XHR9ICk7XHJcblxyXG5cdFx0Y29uc3QgYmFja2dyb3VuZEJveCA9IG5ldyBNZXNoKCBuZXcgQm94R2VvbWV0cnkoKSwgYmFja2dyb3VuZE1hdGVyaWFsICk7XHJcblxyXG5cdFx0bGV0IHVzZVNvbGlkQ29sb3IgPSBmYWxzZTtcclxuXHRcdGNvbnN0IGJhY2tncm91bmQgPSBzY2VuZS5iYWNrZ3JvdW5kO1xyXG5cclxuXHRcdGlmICggYmFja2dyb3VuZCApIHtcclxuXHJcblx0XHRcdGlmICggYmFja2dyb3VuZC5pc0NvbG9yICkge1xyXG5cclxuXHRcdFx0XHRiYWNrZ3JvdW5kTWF0ZXJpYWwuY29sb3IuY29weSggYmFja2dyb3VuZCApO1xyXG5cdFx0XHRcdHNjZW5lLmJhY2tncm91bmQgPSBudWxsO1xyXG5cdFx0XHRcdHVzZVNvbGlkQ29sb3IgPSB0cnVlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRiYWNrZ3JvdW5kTWF0ZXJpYWwuY29sb3IuY29weSggX2NsZWFyQ29sb3IgKTtcclxuXHRcdFx0dXNlU29saWRDb2xvciA9IHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDY7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBjb2wgPSBpICUgMztcclxuXHJcblx0XHRcdGlmICggY29sID09PSAwICkge1xyXG5cclxuXHRcdFx0XHRjdWJlQ2FtZXJhLnVwLnNldCggMCwgdXBTaWduWyBpIF0sIDAgKTtcclxuXHRcdFx0XHRjdWJlQ2FtZXJhLnBvc2l0aW9uLnNldCggcG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24ueiApO1xyXG5cdFx0XHRcdGN1YmVDYW1lcmEubG9va0F0KCBwb3NpdGlvbi54ICsgZm9yd2FyZFNpZ25bIGkgXSwgcG9zaXRpb24ueSwgcG9zaXRpb24ueiApO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggY29sID09PSAxICkge1xyXG5cclxuXHRcdFx0XHRjdWJlQ2FtZXJhLnVwLnNldCggMCwgMCwgdXBTaWduWyBpIF0gKTtcclxuXHRcdFx0XHRjdWJlQ2FtZXJhLnBvc2l0aW9uLnNldCggcG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24ueiApO1xyXG5cdFx0XHRcdGN1YmVDYW1lcmEubG9va0F0KCBwb3NpdGlvbi54LCBwb3NpdGlvbi55ICsgZm9yd2FyZFNpZ25bIGkgXSwgcG9zaXRpb24ueiApO1xyXG5cclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGN1YmVDYW1lcmEudXAuc2V0KCAwLCB1cFNpZ25bIGkgXSwgMCApO1xyXG5cdFx0XHRcdGN1YmVDYW1lcmEucG9zaXRpb24uc2V0KCBwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56ICk7XHJcblx0XHRcdFx0Y3ViZUNhbWVyYS5sb29rQXQoIHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHBvc2l0aW9uLnogKyBmb3J3YXJkU2lnblsgaSBdICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBzaXplID0gdGhpcy5fY3ViZVNpemU7XHJcblxyXG5cdFx0XHRfc2V0Vmlld3BvcnQoIGN1YmVVVlJlbmRlclRhcmdldCwgY29sICogc2l6ZSwgaSA+IDIgPyBzaXplIDogMCwgc2l6ZSwgc2l6ZSApO1xyXG5cclxuXHRcdFx0cmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCBjdWJlVVZSZW5kZXJUYXJnZXQgKTtcclxuXHJcblx0XHRcdGlmICggdXNlU29saWRDb2xvciApIHtcclxuXHJcblx0XHRcdFx0cmVuZGVyZXIucmVuZGVyKCBiYWNrZ3JvdW5kQm94LCBjdWJlQ2FtZXJhICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZW5kZXJlci5yZW5kZXIoIHNjZW5lLCBjdWJlQ2FtZXJhICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGJhY2tncm91bmRCb3guZ2VvbWV0cnkuZGlzcG9zZSgpO1xyXG5cdFx0YmFja2dyb3VuZEJveC5tYXRlcmlhbC5kaXNwb3NlKCk7XHJcblxyXG5cdFx0cmVuZGVyZXIudG9uZU1hcHBpbmcgPSB0b25lTWFwcGluZztcclxuXHRcdHJlbmRlcmVyLmF1dG9DbGVhciA9IG9yaWdpbmFsQXV0b0NsZWFyO1xyXG5cdFx0c2NlbmUuYmFja2dyb3VuZCA9IGJhY2tncm91bmQ7XHJcblxyXG5cdH1cclxuXHJcblx0X3RleHR1cmVUb0N1YmVVViggdGV4dHVyZSwgY3ViZVVWUmVuZGVyVGFyZ2V0ICkge1xyXG5cclxuXHRcdGNvbnN0IHJlbmRlcmVyID0gdGhpcy5fcmVuZGVyZXI7XHJcblxyXG5cdFx0Y29uc3QgaXNDdWJlVGV4dHVyZSA9ICggdGV4dHVyZS5tYXBwaW5nID09PSBDdWJlUmVmbGVjdGlvbk1hcHBpbmcgfHwgdGV4dHVyZS5tYXBwaW5nID09PSBDdWJlUmVmcmFjdGlvbk1hcHBpbmcgKTtcclxuXHJcblx0XHRpZiAoIGlzQ3ViZVRleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMuX2N1YmVtYXBNYXRlcmlhbCA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5fY3ViZW1hcE1hdGVyaWFsID0gX2dldEN1YmVtYXBNYXRlcmlhbCgpO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5fY3ViZW1hcE1hdGVyaWFsLnVuaWZvcm1zLmZsaXBFbnZNYXAudmFsdWUgPSAoIHRleHR1cmUuaXNSZW5kZXJUYXJnZXRUZXh0dXJlID09PSBmYWxzZSApID8gLSAxIDogMTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLl9lcXVpcmVjdE1hdGVyaWFsID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLl9lcXVpcmVjdE1hdGVyaWFsID0gX2dldEVxdWlyZWN0TWF0ZXJpYWwoKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgbWF0ZXJpYWwgPSBpc0N1YmVUZXh0dXJlID8gdGhpcy5fY3ViZW1hcE1hdGVyaWFsIDogdGhpcy5fZXF1aXJlY3RNYXRlcmlhbDtcclxuXHRcdGNvbnN0IG1lc2ggPSBuZXcgTWVzaCggdGhpcy5fbG9kUGxhbmVzWyAwIF0sIG1hdGVyaWFsICk7XHJcblxyXG5cdFx0Y29uc3QgdW5pZm9ybXMgPSBtYXRlcmlhbC51bmlmb3JtcztcclxuXHJcblx0XHR1bmlmb3Jtc1sgJ2Vudk1hcCcgXS52YWx1ZSA9IHRleHR1cmU7XHJcblxyXG5cdFx0Y29uc3Qgc2l6ZSA9IHRoaXMuX2N1YmVTaXplO1xyXG5cclxuXHRcdF9zZXRWaWV3cG9ydCggY3ViZVVWUmVuZGVyVGFyZ2V0LCAwLCAwLCAzICogc2l6ZSwgMiAqIHNpemUgKTtcclxuXHJcblx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIGN1YmVVVlJlbmRlclRhcmdldCApO1xyXG5cdFx0cmVuZGVyZXIucmVuZGVyKCBtZXNoLCBfZmxhdENhbWVyYSApO1xyXG5cclxuXHR9XHJcblxyXG5cdF9hcHBseVBNUkVNKCBjdWJlVVZSZW5kZXJUYXJnZXQgKSB7XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyZXIgPSB0aGlzLl9yZW5kZXJlcjtcclxuXHRcdGNvbnN0IGF1dG9DbGVhciA9IHJlbmRlcmVyLmF1dG9DbGVhcjtcclxuXHRcdHJlbmRlcmVyLmF1dG9DbGVhciA9IGZhbHNlO1xyXG5cdFx0Y29uc3QgbiA9IHRoaXMuX2xvZFBsYW5lcy5sZW5ndGg7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAxOyBpIDwgbjsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHNpZ21hID0gTWF0aC5zcXJ0KCB0aGlzLl9zaWdtYXNbIGkgXSAqIHRoaXMuX3NpZ21hc1sgaSBdIC0gdGhpcy5fc2lnbWFzWyBpIC0gMSBdICogdGhpcy5fc2lnbWFzWyBpIC0gMSBdICk7XHJcblxyXG5cdFx0XHRjb25zdCBwb2xlQXhpcyA9IF9heGlzRGlyZWN0aW9uc1sgKCBuIC0gaSAtIDEgKSAlIF9heGlzRGlyZWN0aW9ucy5sZW5ndGggXTtcclxuXHJcblx0XHRcdHRoaXMuX2JsdXIoIGN1YmVVVlJlbmRlclRhcmdldCwgaSAtIDEsIGksIHNpZ21hLCBwb2xlQXhpcyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZW5kZXJlci5hdXRvQ2xlYXIgPSBhdXRvQ2xlYXI7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBpcyBhIHR3by1wYXNzIEdhdXNzaWFuIGJsdXIgZm9yIGEgY3ViZW1hcC4gTm9ybWFsbHkgdGhpcyBpcyBkb25lXHJcblx0ICogdmVydGljYWxseSBhbmQgaG9yaXpvbnRhbGx5LCBidXQgdGhpcyBicmVha3MgZG93biBvbiBhIGN1YmUuIEhlcmUgd2UgYXBwbHlcclxuXHQgKiB0aGUgYmx1ciBsYXRpdHVkaW5hbGx5IChhcm91bmQgdGhlIHBvbGVzKSwgYW5kIHRoZW4gbG9uZ2l0dWRpbmFsbHkgKHRvd2FyZHNcclxuXHQgKiB0aGUgcG9sZXMpIHRvIGFwcHJveGltYXRlIHRoZSBvcnRob2dvbmFsbHktc2VwYXJhYmxlIGJsdXIuIEl0IGlzIGxlYXN0XHJcblx0ICogYWNjdXJhdGUgYXQgdGhlIHBvbGVzLCBidXQgc3RpbGwgZG9lcyBhIGRlY2VudCBqb2IuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGN1YmVVVlJlbmRlclRhcmdldFxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBsb2RJblxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBsb2RPdXRcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc2lnbWFcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IFtwb2xlQXhpc11cclxuXHQgKi9cclxuXHRfYmx1ciggY3ViZVVWUmVuZGVyVGFyZ2V0LCBsb2RJbiwgbG9kT3V0LCBzaWdtYSwgcG9sZUF4aXMgKSB7XHJcblxyXG5cdFx0Y29uc3QgcGluZ1BvbmdSZW5kZXJUYXJnZXQgPSB0aGlzLl9waW5nUG9uZ1JlbmRlclRhcmdldDtcclxuXHJcblx0XHR0aGlzLl9oYWxmQmx1cihcclxuXHRcdFx0Y3ViZVVWUmVuZGVyVGFyZ2V0LFxyXG5cdFx0XHRwaW5nUG9uZ1JlbmRlclRhcmdldCxcclxuXHRcdFx0bG9kSW4sXHJcblx0XHRcdGxvZE91dCxcclxuXHRcdFx0c2lnbWEsXHJcblx0XHRcdCdsYXRpdHVkaW5hbCcsXHJcblx0XHRcdHBvbGVBeGlzICk7XHJcblxyXG5cdFx0dGhpcy5faGFsZkJsdXIoXHJcblx0XHRcdHBpbmdQb25nUmVuZGVyVGFyZ2V0LFxyXG5cdFx0XHRjdWJlVVZSZW5kZXJUYXJnZXQsXHJcblx0XHRcdGxvZE91dCxcclxuXHRcdFx0bG9kT3V0LFxyXG5cdFx0XHRzaWdtYSxcclxuXHRcdFx0J2xvbmdpdHVkaW5hbCcsXHJcblx0XHRcdHBvbGVBeGlzICk7XHJcblxyXG5cdH1cclxuXHJcblx0X2hhbGZCbHVyKCB0YXJnZXRJbiwgdGFyZ2V0T3V0LCBsb2RJbiwgbG9kT3V0LCBzaWdtYVJhZGlhbnMsIGRpcmVjdGlvbiwgcG9sZUF4aXMgKSB7XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyZXIgPSB0aGlzLl9yZW5kZXJlcjtcclxuXHRcdGNvbnN0IGJsdXJNYXRlcmlhbCA9IHRoaXMuX2JsdXJNYXRlcmlhbDtcclxuXHJcblx0XHRpZiAoIGRpcmVjdGlvbiAhPT0gJ2xhdGl0dWRpbmFsJyAmJiBkaXJlY3Rpb24gIT09ICdsb25naXR1ZGluYWwnICkge1xyXG5cclxuXHRcdFx0Y29uc29sZS5lcnJvcihcclxuXHRcdFx0XHQnYmx1ciBkaXJlY3Rpb24gbXVzdCBiZSBlaXRoZXIgbGF0aXR1ZGluYWwgb3IgbG9uZ2l0dWRpbmFsIScgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gTnVtYmVyIG9mIHN0YW5kYXJkIGRldmlhdGlvbnMgYXQgd2hpY2ggdG8gY3V0IG9mZiB0aGUgZGlzY3JldGUgYXBwcm94aW1hdGlvbi5cclxuXHRcdGNvbnN0IFNUQU5EQVJEX0RFVklBVElPTlMgPSAzO1xyXG5cclxuXHRcdGNvbnN0IGJsdXJNZXNoID0gbmV3IE1lc2goIHRoaXMuX2xvZFBsYW5lc1sgbG9kT3V0IF0sIGJsdXJNYXRlcmlhbCApO1xyXG5cdFx0Y29uc3QgYmx1clVuaWZvcm1zID0gYmx1ck1hdGVyaWFsLnVuaWZvcm1zO1xyXG5cclxuXHRcdGNvbnN0IHBpeGVscyA9IHRoaXMuX3NpemVMb2RzWyBsb2RJbiBdIC0gMTtcclxuXHRcdGNvbnN0IHJhZGlhbnNQZXJQaXhlbCA9IGlzRmluaXRlKCBzaWdtYVJhZGlhbnMgKSA/IE1hdGguUEkgLyAoIDIgKiBwaXhlbHMgKSA6IDIgKiBNYXRoLlBJIC8gKCAyICogTUFYX1NBTVBMRVMgLSAxICk7XHJcblx0XHRjb25zdCBzaWdtYVBpeGVscyA9IHNpZ21hUmFkaWFucyAvIHJhZGlhbnNQZXJQaXhlbDtcclxuXHRcdGNvbnN0IHNhbXBsZXMgPSBpc0Zpbml0ZSggc2lnbWFSYWRpYW5zICkgPyAxICsgTWF0aC5mbG9vciggU1RBTkRBUkRfREVWSUFUSU9OUyAqIHNpZ21hUGl4ZWxzICkgOiBNQVhfU0FNUExFUztcclxuXHJcblx0XHRpZiAoIHNhbXBsZXMgPiBNQVhfU0FNUExFUyApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUud2FybiggYHNpZ21hUmFkaWFucywgJHtcclxuXHRcdFx0XHRzaWdtYVJhZGlhbnN9LCBpcyB0b28gbGFyZ2UgYW5kIHdpbGwgY2xpcCwgYXMgaXQgcmVxdWVzdGVkICR7XHJcblx0XHRcdFx0c2FtcGxlc30gc2FtcGxlcyB3aGVuIHRoZSBtYXhpbXVtIGlzIHNldCB0byAke01BWF9TQU1QTEVTfWAgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3Qgd2VpZ2h0cyA9IFtdO1xyXG5cdFx0bGV0IHN1bSA9IDA7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgTUFYX1NBTVBMRVM7ICsrIGkgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB4ID0gaSAvIHNpZ21hUGl4ZWxzO1xyXG5cdFx0XHRjb25zdCB3ZWlnaHQgPSBNYXRoLmV4cCggLSB4ICogeCAvIDIgKTtcclxuXHRcdFx0d2VpZ2h0cy5wdXNoKCB3ZWlnaHQgKTtcclxuXHJcblx0XHRcdGlmICggaSA9PT0gMCApIHtcclxuXHJcblx0XHRcdFx0c3VtICs9IHdlaWdodDtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGkgPCBzYW1wbGVzICkge1xyXG5cclxuXHRcdFx0XHRzdW0gKz0gMiAqIHdlaWdodDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgd2VpZ2h0cy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHR3ZWlnaHRzWyBpIF0gPSB3ZWlnaHRzWyBpIF0gLyBzdW07XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGJsdXJVbmlmb3Jtc1sgJ2Vudk1hcCcgXS52YWx1ZSA9IHRhcmdldEluLnRleHR1cmU7XHJcblx0XHRibHVyVW5pZm9ybXNbICdzYW1wbGVzJyBdLnZhbHVlID0gc2FtcGxlcztcclxuXHRcdGJsdXJVbmlmb3Jtc1sgJ3dlaWdodHMnIF0udmFsdWUgPSB3ZWlnaHRzO1xyXG5cdFx0Ymx1clVuaWZvcm1zWyAnbGF0aXR1ZGluYWwnIF0udmFsdWUgPSBkaXJlY3Rpb24gPT09ICdsYXRpdHVkaW5hbCc7XHJcblxyXG5cdFx0aWYgKCBwb2xlQXhpcyApIHtcclxuXHJcblx0XHRcdGJsdXJVbmlmb3Jtc1sgJ3BvbGVBeGlzJyBdLnZhbHVlID0gcG9sZUF4aXM7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHsgX2xvZE1heCB9ID0gdGhpcztcclxuXHRcdGJsdXJVbmlmb3Jtc1sgJ2RUaGV0YScgXS52YWx1ZSA9IHJhZGlhbnNQZXJQaXhlbDtcclxuXHRcdGJsdXJVbmlmb3Jtc1sgJ21pcEludCcgXS52YWx1ZSA9IF9sb2RNYXggLSBsb2RJbjtcclxuXHJcblx0XHRjb25zdCBvdXRwdXRTaXplID0gdGhpcy5fc2l6ZUxvZHNbIGxvZE91dCBdO1xyXG5cdFx0Y29uc3QgeCA9IDMgKiBvdXRwdXRTaXplICogKCBsb2RPdXQgPiBfbG9kTWF4IC0gTE9EX01JTiA/IGxvZE91dCAtIF9sb2RNYXggKyBMT0RfTUlOIDogMCApO1xyXG5cdFx0Y29uc3QgeSA9IDQgKiAoIHRoaXMuX2N1YmVTaXplIC0gb3V0cHV0U2l6ZSApO1xyXG5cclxuXHRcdF9zZXRWaWV3cG9ydCggdGFyZ2V0T3V0LCB4LCB5LCAzICogb3V0cHV0U2l6ZSwgMiAqIG91dHB1dFNpemUgKTtcclxuXHRcdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggdGFyZ2V0T3V0ICk7XHJcblx0XHRyZW5kZXJlci5yZW5kZXIoIGJsdXJNZXNoLCBfZmxhdENhbWVyYSApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5cclxuXHJcbmZ1bmN0aW9uIF9jcmVhdGVQbGFuZXMoIGxvZE1heCApIHtcclxuXHJcblx0Y29uc3QgbG9kUGxhbmVzID0gW107XHJcblx0Y29uc3Qgc2l6ZUxvZHMgPSBbXTtcclxuXHRjb25zdCBzaWdtYXMgPSBbXTtcclxuXHJcblx0bGV0IGxvZCA9IGxvZE1heDtcclxuXHJcblx0Y29uc3QgdG90YWxMb2RzID0gbG9kTWF4IC0gTE9EX01JTiArIDEgKyBFWFRSQV9MT0RfU0lHTUEubGVuZ3RoO1xyXG5cclxuXHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB0b3RhbExvZHM7IGkgKysgKSB7XHJcblxyXG5cdFx0Y29uc3Qgc2l6ZUxvZCA9IE1hdGgucG93KCAyLCBsb2QgKTtcclxuXHRcdHNpemVMb2RzLnB1c2goIHNpemVMb2QgKTtcclxuXHRcdGxldCBzaWdtYSA9IDEuMCAvIHNpemVMb2Q7XHJcblxyXG5cdFx0aWYgKCBpID4gbG9kTWF4IC0gTE9EX01JTiApIHtcclxuXHJcblx0XHRcdHNpZ21hID0gRVhUUkFfTE9EX1NJR01BWyBpIC0gbG9kTWF4ICsgTE9EX01JTiAtIDEgXTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBpID09PSAwICkge1xyXG5cclxuXHRcdFx0c2lnbWEgPSAwO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRzaWdtYXMucHVzaCggc2lnbWEgKTtcclxuXHJcblx0XHRjb25zdCB0ZXhlbFNpemUgPSAxLjAgLyAoIHNpemVMb2QgLSAyICk7XHJcblx0XHRjb25zdCBtaW4gPSAtIHRleGVsU2l6ZTtcclxuXHRcdGNvbnN0IG1heCA9IDEgKyB0ZXhlbFNpemU7XHJcblx0XHRjb25zdCB1djEgPSBbIG1pbiwgbWluLCBtYXgsIG1pbiwgbWF4LCBtYXgsIG1pbiwgbWluLCBtYXgsIG1heCwgbWluLCBtYXggXTtcclxuXHJcblx0XHRjb25zdCBjdWJlRmFjZXMgPSA2O1xyXG5cdFx0Y29uc3QgdmVydGljZXMgPSA2O1xyXG5cdFx0Y29uc3QgcG9zaXRpb25TaXplID0gMztcclxuXHRcdGNvbnN0IHV2U2l6ZSA9IDI7XHJcblx0XHRjb25zdCBmYWNlSW5kZXhTaXplID0gMTtcclxuXHJcblx0XHRjb25zdCBwb3NpdGlvbiA9IG5ldyBGbG9hdDMyQXJyYXkoIHBvc2l0aW9uU2l6ZSAqIHZlcnRpY2VzICogY3ViZUZhY2VzICk7XHJcblx0XHRjb25zdCB1diA9IG5ldyBGbG9hdDMyQXJyYXkoIHV2U2l6ZSAqIHZlcnRpY2VzICogY3ViZUZhY2VzICk7XHJcblx0XHRjb25zdCBmYWNlSW5kZXggPSBuZXcgRmxvYXQzMkFycmF5KCBmYWNlSW5kZXhTaXplICogdmVydGljZXMgKiBjdWJlRmFjZXMgKTtcclxuXHJcblx0XHRmb3IgKCBsZXQgZmFjZSA9IDA7IGZhY2UgPCBjdWJlRmFjZXM7IGZhY2UgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB4ID0gKCBmYWNlICUgMyApICogMiAvIDMgLSAxO1xyXG5cdFx0XHRjb25zdCB5ID0gZmFjZSA+IDIgPyAwIDogLSAxO1xyXG5cdFx0XHRjb25zdCBjb29yZGluYXRlcyA9IFtcclxuXHRcdFx0XHR4LCB5LCAwLFxyXG5cdFx0XHRcdHggKyAyIC8gMywgeSwgMCxcclxuXHRcdFx0XHR4ICsgMiAvIDMsIHkgKyAxLCAwLFxyXG5cdFx0XHRcdHgsIHksIDAsXHJcblx0XHRcdFx0eCArIDIgLyAzLCB5ICsgMSwgMCxcclxuXHRcdFx0XHR4LCB5ICsgMSwgMFxyXG5cdFx0XHRdO1xyXG5cdFx0XHRwb3NpdGlvbi5zZXQoIGNvb3JkaW5hdGVzLCBwb3NpdGlvblNpemUgKiB2ZXJ0aWNlcyAqIGZhY2UgKTtcclxuXHRcdFx0dXYuc2V0KCB1djEsIHV2U2l6ZSAqIHZlcnRpY2VzICogZmFjZSApO1xyXG5cdFx0XHRjb25zdCBmaWxsID0gWyBmYWNlLCBmYWNlLCBmYWNlLCBmYWNlLCBmYWNlLCBmYWNlIF07XHJcblx0XHRcdGZhY2VJbmRleC5zZXQoIGZpbGwsIGZhY2VJbmRleFNpemUgKiB2ZXJ0aWNlcyAqIGZhY2UgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgcGxhbmVzID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XHJcblx0XHRwbGFuZXMuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgcG9zaXRpb25TaXplICkgKTtcclxuXHRcdHBsYW5lcy5zZXRBdHRyaWJ1dGUoICd1dicsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIHV2LCB1dlNpemUgKSApO1xyXG5cdFx0cGxhbmVzLnNldEF0dHJpYnV0ZSggJ2ZhY2VJbmRleCcsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIGZhY2VJbmRleCwgZmFjZUluZGV4U2l6ZSApICk7XHJcblx0XHRsb2RQbGFuZXMucHVzaCggcGxhbmVzICk7XHJcblxyXG5cdFx0aWYgKCBsb2QgPiBMT0RfTUlOICkge1xyXG5cclxuXHRcdFx0bG9kIC0tO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4geyBsb2RQbGFuZXMsIHNpemVMb2RzLCBzaWdtYXMgfTtcclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIF9jcmVhdGVSZW5kZXJUYXJnZXQoIHdpZHRoLCBoZWlnaHQsIHBhcmFtcyApIHtcclxuXHJcblx0Y29uc3QgY3ViZVVWUmVuZGVyVGFyZ2V0ID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KCB3aWR0aCwgaGVpZ2h0LCBwYXJhbXMgKTtcclxuXHRjdWJlVVZSZW5kZXJUYXJnZXQudGV4dHVyZS5tYXBwaW5nID0gQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmc7XHJcblx0Y3ViZVVWUmVuZGVyVGFyZ2V0LnRleHR1cmUubmFtZSA9ICdQTVJFTS5jdWJlVXYnO1xyXG5cdGN1YmVVVlJlbmRlclRhcmdldC5zY2lzc29yVGVzdCA9IHRydWU7XHJcblx0cmV0dXJuIGN1YmVVVlJlbmRlclRhcmdldDtcclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIF9zZXRWaWV3cG9ydCggdGFyZ2V0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICkge1xyXG5cclxuXHR0YXJnZXQudmlld3BvcnQuc2V0KCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICk7XHJcblx0dGFyZ2V0LnNjaXNzb3Iuc2V0KCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICk7XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBfZ2V0Qmx1clNoYWRlciggbG9kTWF4LCB3aWR0aCwgaGVpZ2h0ICkge1xyXG5cclxuXHRjb25zdCB3ZWlnaHRzID0gbmV3IEZsb2F0MzJBcnJheSggTUFYX1NBTVBMRVMgKTtcclxuXHRjb25zdCBwb2xlQXhpcyA9IG5ldyBWZWN0b3IzKCAwLCAxLCAwICk7XHJcblx0Y29uc3Qgc2hhZGVyTWF0ZXJpYWwgPSBuZXcgU2hhZGVyTWF0ZXJpYWwoIHtcclxuXHJcblx0XHRuYW1lOiAnU3BoZXJpY2FsR2F1c3NpYW5CbHVyJyxcclxuXHJcblx0XHRkZWZpbmVzOiB7XHJcblx0XHRcdCduJzogTUFYX1NBTVBMRVMsXHJcblx0XHRcdCdDVUJFVVZfVEVYRUxfV0lEVEgnOiAxLjAgLyB3aWR0aCxcclxuXHRcdFx0J0NVQkVVVl9URVhFTF9IRUlHSFQnOiAxLjAgLyBoZWlnaHQsXHJcblx0XHRcdCdDVUJFVVZfTUFYX01JUCc6IGAke2xvZE1heH0uMGAsXHJcblx0XHR9LFxyXG5cclxuXHRcdHVuaWZvcm1zOiB7XHJcblx0XHRcdCdlbnZNYXAnOiB7IHZhbHVlOiBudWxsIH0sXHJcblx0XHRcdCdzYW1wbGVzJzogeyB2YWx1ZTogMSB9LFxyXG5cdFx0XHQnd2VpZ2h0cyc6IHsgdmFsdWU6IHdlaWdodHMgfSxcclxuXHRcdFx0J2xhdGl0dWRpbmFsJzogeyB2YWx1ZTogZmFsc2UgfSxcclxuXHRcdFx0J2RUaGV0YSc6IHsgdmFsdWU6IDAgfSxcclxuXHRcdFx0J21pcEludCc6IHsgdmFsdWU6IDAgfSxcclxuXHRcdFx0J3BvbGVBeGlzJzogeyB2YWx1ZTogcG9sZUF4aXMgfVxyXG5cdFx0fSxcclxuXHJcblx0XHR2ZXJ0ZXhTaGFkZXI6IF9nZXRDb21tb25WZXJ0ZXhTaGFkZXIoKSxcclxuXHJcblx0XHRmcmFnbWVudFNoYWRlcjogLyogZ2xzbCAqL2BcclxuXHJcblx0XHRcdHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xyXG5cdFx0XHRwcmVjaXNpb24gbWVkaXVtcCBpbnQ7XHJcblxyXG5cdFx0XHR2YXJ5aW5nIHZlYzMgdk91dHB1dERpcmVjdGlvbjtcclxuXHJcblx0XHRcdHVuaWZvcm0gc2FtcGxlcjJEIGVudk1hcDtcclxuXHRcdFx0dW5pZm9ybSBpbnQgc2FtcGxlcztcclxuXHRcdFx0dW5pZm9ybSBmbG9hdCB3ZWlnaHRzWyBuIF07XHJcblx0XHRcdHVuaWZvcm0gYm9vbCBsYXRpdHVkaW5hbDtcclxuXHRcdFx0dW5pZm9ybSBmbG9hdCBkVGhldGE7XHJcblx0XHRcdHVuaWZvcm0gZmxvYXQgbWlwSW50O1xyXG5cdFx0XHR1bmlmb3JtIHZlYzMgcG9sZUF4aXM7XHJcblxyXG5cdFx0XHQjZGVmaW5lIEVOVk1BUF9UWVBFX0NVQkVfVVZcclxuXHRcdFx0I2luY2x1ZGUgPGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudD5cclxuXHJcblx0XHRcdHZlYzMgZ2V0U2FtcGxlKCBmbG9hdCB0aGV0YSwgdmVjMyBheGlzICkge1xyXG5cclxuXHRcdFx0XHRmbG9hdCBjb3NUaGV0YSA9IGNvcyggdGhldGEgKTtcclxuXHRcdFx0XHQvLyBSb2RyaWd1ZXMnIGF4aXMtYW5nbGUgcm90YXRpb25cclxuXHRcdFx0XHR2ZWMzIHNhbXBsZURpcmVjdGlvbiA9IHZPdXRwdXREaXJlY3Rpb24gKiBjb3NUaGV0YVxyXG5cdFx0XHRcdFx0KyBjcm9zcyggYXhpcywgdk91dHB1dERpcmVjdGlvbiApICogc2luKCB0aGV0YSApXHJcblx0XHRcdFx0XHQrIGF4aXMgKiBkb3QoIGF4aXMsIHZPdXRwdXREaXJlY3Rpb24gKSAqICggMS4wIC0gY29zVGhldGEgKTtcclxuXHJcblx0XHRcdFx0cmV0dXJuIGJpbGluZWFyQ3ViZVVWKCBlbnZNYXAsIHNhbXBsZURpcmVjdGlvbiwgbWlwSW50ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR2b2lkIG1haW4oKSB7XHJcblxyXG5cdFx0XHRcdHZlYzMgYXhpcyA9IGxhdGl0dWRpbmFsID8gcG9sZUF4aXMgOiBjcm9zcyggcG9sZUF4aXMsIHZPdXRwdXREaXJlY3Rpb24gKTtcclxuXHJcblx0XHRcdFx0aWYgKCBhbGwoIGVxdWFsKCBheGlzLCB2ZWMzKCAwLjAgKSApICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0YXhpcyA9IHZlYzMoIHZPdXRwdXREaXJlY3Rpb24ueiwgMC4wLCAtIHZPdXRwdXREaXJlY3Rpb24ueCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGF4aXMgPSBub3JtYWxpemUoIGF4aXMgKTtcclxuXHJcblx0XHRcdFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggMC4wLCAwLjAsIDAuMCwgMS4wICk7XHJcblx0XHRcdFx0Z2xfRnJhZ0NvbG9yLnJnYiArPSB3ZWlnaHRzWyAwIF0gKiBnZXRTYW1wbGUoIDAuMCwgYXhpcyApO1xyXG5cclxuXHRcdFx0XHRmb3IgKCBpbnQgaSA9IDE7IGkgPCBuOyBpKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBpID49IHNhbXBsZXMgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0ZmxvYXQgdGhldGEgPSBkVGhldGEgKiBmbG9hdCggaSApO1xyXG5cdFx0XHRcdFx0Z2xfRnJhZ0NvbG9yLnJnYiArPSB3ZWlnaHRzWyBpIF0gKiBnZXRTYW1wbGUoIC0xLjAgKiB0aGV0YSwgYXhpcyApO1xyXG5cdFx0XHRcdFx0Z2xfRnJhZ0NvbG9yLnJnYiArPSB3ZWlnaHRzWyBpIF0gKiBnZXRTYW1wbGUoIHRoZXRhLCBheGlzICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHRcdGAsXHJcblxyXG5cdFx0YmxlbmRpbmc6IE5vQmxlbmRpbmcsXHJcblx0XHRkZXB0aFRlc3Q6IGZhbHNlLFxyXG5cdFx0ZGVwdGhXcml0ZTogZmFsc2VcclxuXHJcblx0fSApO1xyXG5cclxuXHRyZXR1cm4gc2hhZGVyTWF0ZXJpYWw7XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBfZ2V0RXF1aXJlY3RNYXRlcmlhbCgpIHtcclxuXHJcblx0cmV0dXJuIG5ldyBTaGFkZXJNYXRlcmlhbCgge1xyXG5cclxuXHRcdG5hbWU6ICdFcXVpcmVjdGFuZ3VsYXJUb0N1YmVVVicsXHJcblxyXG5cdFx0dW5pZm9ybXM6IHtcclxuXHRcdFx0J2Vudk1hcCc6IHsgdmFsdWU6IG51bGwgfVxyXG5cdFx0fSxcclxuXHJcblx0XHR2ZXJ0ZXhTaGFkZXI6IF9nZXRDb21tb25WZXJ0ZXhTaGFkZXIoKSxcclxuXHJcblx0XHRmcmFnbWVudFNoYWRlcjogLyogZ2xzbCAqL2BcclxuXHJcblx0XHRcdHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xyXG5cdFx0XHRwcmVjaXNpb24gbWVkaXVtcCBpbnQ7XHJcblxyXG5cdFx0XHR2YXJ5aW5nIHZlYzMgdk91dHB1dERpcmVjdGlvbjtcclxuXHJcblx0XHRcdHVuaWZvcm0gc2FtcGxlcjJEIGVudk1hcDtcclxuXHJcblx0XHRcdCNpbmNsdWRlIDxjb21tb24+XHJcblxyXG5cdFx0XHR2b2lkIG1haW4oKSB7XHJcblxyXG5cdFx0XHRcdHZlYzMgb3V0cHV0RGlyZWN0aW9uID0gbm9ybWFsaXplKCB2T3V0cHV0RGlyZWN0aW9uICk7XHJcblx0XHRcdFx0dmVjMiB1diA9IGVxdWlyZWN0VXYoIG91dHB1dERpcmVjdGlvbiApO1xyXG5cclxuXHRcdFx0XHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCB0ZXh0dXJlMkQgKCBlbnZNYXAsIHV2ICkucmdiLCAxLjAgKTtcclxuXHJcblx0XHRcdH1cclxuXHRcdGAsXHJcblxyXG5cdFx0YmxlbmRpbmc6IE5vQmxlbmRpbmcsXHJcblx0XHRkZXB0aFRlc3Q6IGZhbHNlLFxyXG5cdFx0ZGVwdGhXcml0ZTogZmFsc2VcclxuXHJcblx0fSApO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gX2dldEN1YmVtYXBNYXRlcmlhbCgpIHtcclxuXHJcblx0cmV0dXJuIG5ldyBTaGFkZXJNYXRlcmlhbCgge1xyXG5cclxuXHRcdG5hbWU6ICdDdWJlbWFwVG9DdWJlVVYnLFxyXG5cclxuXHRcdHVuaWZvcm1zOiB7XHJcblx0XHRcdCdlbnZNYXAnOiB7IHZhbHVlOiBudWxsIH0sXHJcblx0XHRcdCdmbGlwRW52TWFwJzogeyB2YWx1ZTogLSAxIH1cclxuXHRcdH0sXHJcblxyXG5cdFx0dmVydGV4U2hhZGVyOiBfZ2V0Q29tbW9uVmVydGV4U2hhZGVyKCksXHJcblxyXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IC8qIGdsc2wgKi9gXHJcblxyXG5cdFx0XHRwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcclxuXHRcdFx0cHJlY2lzaW9uIG1lZGl1bXAgaW50O1xyXG5cclxuXHRcdFx0dW5pZm9ybSBmbG9hdCBmbGlwRW52TWFwO1xyXG5cclxuXHRcdFx0dmFyeWluZyB2ZWMzIHZPdXRwdXREaXJlY3Rpb247XHJcblxyXG5cdFx0XHR1bmlmb3JtIHNhbXBsZXJDdWJlIGVudk1hcDtcclxuXHJcblx0XHRcdHZvaWQgbWFpbigpIHtcclxuXHJcblx0XHRcdFx0Z2xfRnJhZ0NvbG9yID0gdGV4dHVyZUN1YmUoIGVudk1hcCwgdmVjMyggZmxpcEVudk1hcCAqIHZPdXRwdXREaXJlY3Rpb24ueCwgdk91dHB1dERpcmVjdGlvbi55eiApICk7XHJcblxyXG5cdFx0XHR9XHJcblx0XHRgLFxyXG5cclxuXHRcdGJsZW5kaW5nOiBOb0JsZW5kaW5nLFxyXG5cdFx0ZGVwdGhUZXN0OiBmYWxzZSxcclxuXHRcdGRlcHRoV3JpdGU6IGZhbHNlXHJcblxyXG5cdH0gKTtcclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIF9nZXRDb21tb25WZXJ0ZXhTaGFkZXIoKSB7XHJcblxyXG5cdHJldHVybiAvKiBnbHNsICovYFxyXG5cclxuXHRcdHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xyXG5cdFx0cHJlY2lzaW9uIG1lZGl1bXAgaW50O1xyXG5cclxuXHRcdGF0dHJpYnV0ZSBmbG9hdCBmYWNlSW5kZXg7XHJcblxyXG5cdFx0dmFyeWluZyB2ZWMzIHZPdXRwdXREaXJlY3Rpb247XHJcblxyXG5cdFx0Ly8gUkggY29vcmRpbmF0ZSBzeXN0ZW07IFBNUkVNIGZhY2UtaW5kZXhpbmcgY29udmVudGlvblxyXG5cdFx0dmVjMyBnZXREaXJlY3Rpb24oIHZlYzIgdXYsIGZsb2F0IGZhY2UgKSB7XHJcblxyXG5cdFx0XHR1diA9IDIuMCAqIHV2IC0gMS4wO1xyXG5cclxuXHRcdFx0dmVjMyBkaXJlY3Rpb24gPSB2ZWMzKCB1diwgMS4wICk7XHJcblxyXG5cdFx0XHRpZiAoIGZhY2UgPT0gMC4wICkge1xyXG5cclxuXHRcdFx0XHRkaXJlY3Rpb24gPSBkaXJlY3Rpb24uenl4OyAvLyAoIDEsIHYsIHUgKSBwb3MgeFxyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggZmFjZSA9PSAxLjAgKSB7XHJcblxyXG5cdFx0XHRcdGRpcmVjdGlvbiA9IGRpcmVjdGlvbi54enk7XHJcblx0XHRcdFx0ZGlyZWN0aW9uLnh6ICo9IC0xLjA7IC8vICggLXUsIDEsIC12ICkgcG9zIHlcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGZhY2UgPT0gMi4wICkge1xyXG5cclxuXHRcdFx0XHRkaXJlY3Rpb24ueCAqPSAtMS4wOyAvLyAoIC11LCB2LCAxICkgcG9zIHpcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGZhY2UgPT0gMy4wICkge1xyXG5cclxuXHRcdFx0XHRkaXJlY3Rpb24gPSBkaXJlY3Rpb24uenl4O1xyXG5cdFx0XHRcdGRpcmVjdGlvbi54eiAqPSAtMS4wOyAvLyAoIC0xLCB2LCAtdSApIG5lZyB4XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBmYWNlID09IDQuMCApIHtcclxuXHJcblx0XHRcdFx0ZGlyZWN0aW9uID0gZGlyZWN0aW9uLnh6eTtcclxuXHRcdFx0XHRkaXJlY3Rpb24ueHkgKj0gLTEuMDsgLy8gKCAtdSwgLTEsIHYgKSBuZWcgeVxyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggZmFjZSA9PSA1LjAgKSB7XHJcblxyXG5cdFx0XHRcdGRpcmVjdGlvbi56ICo9IC0xLjA7IC8vICggdSwgdiwgLTEgKSBuZWcgelxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIGRpcmVjdGlvbjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dm9pZCBtYWluKCkge1xyXG5cclxuXHRcdFx0dk91dHB1dERpcmVjdGlvbiA9IGdldERpcmVjdGlvbiggdXYsIGZhY2VJbmRleCApO1xyXG5cdFx0XHRnbF9Qb3NpdGlvbiA9IHZlYzQoIHBvc2l0aW9uLCAxLjAgKTtcclxuXHJcblx0XHR9XHJcblx0YDtcclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFBNUkVNR2VuZXJhdG9yIH07XHJcbiIsImltcG9ydCB7IEN1YmVSZWZsZWN0aW9uTWFwcGluZywgQ3ViZVJlZnJhY3Rpb25NYXBwaW5nLCBFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZywgRXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmcgfSBmcm9tICcuLi8uLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBQTVJFTUdlbmVyYXRvciB9IGZyb20gJy4uLy4uL2V4dHJhcy9QTVJFTUdlbmVyYXRvci5qcyc7XHJcblxyXG5mdW5jdGlvbiBXZWJHTEN1YmVVVk1hcHMoIHJlbmRlcmVyICkge1xyXG5cclxuXHRsZXQgY3ViZVVWbWFwcyA9IG5ldyBXZWFrTWFwKCk7XHJcblxyXG5cdGxldCBwbXJlbUdlbmVyYXRvciA9IG51bGw7XHJcblxyXG5cdGZ1bmN0aW9uIGdldCggdGV4dHVyZSApIHtcclxuXHJcblx0XHRpZiAoIHRleHR1cmUgJiYgdGV4dHVyZS5pc1RleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBtYXBwaW5nID0gdGV4dHVyZS5tYXBwaW5nO1xyXG5cclxuXHRcdFx0Y29uc3QgaXNFcXVpcmVjdE1hcCA9ICggbWFwcGluZyA9PT0gRXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmcgfHwgbWFwcGluZyA9PT0gRXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmcgKTtcclxuXHRcdFx0Y29uc3QgaXNDdWJlTWFwID0gKCBtYXBwaW5nID09PSBDdWJlUmVmbGVjdGlvbk1hcHBpbmcgfHwgbWFwcGluZyA9PT0gQ3ViZVJlZnJhY3Rpb25NYXBwaW5nICk7XHJcblxyXG5cdFx0XHQvLyBlcXVpcmVjdC9jdWJlIG1hcCB0byBjdWJlVVYgY29udmVyc2lvblxyXG5cclxuXHRcdFx0aWYgKCBpc0VxdWlyZWN0TWFwIHx8IGlzQ3ViZU1hcCApIHtcclxuXHJcblx0XHRcdFx0bGV0IHJlbmRlclRhcmdldCA9IGN1YmVVVm1hcHMuZ2V0KCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGN1cnJlbnRQTVJFTVZlcnNpb24gPSByZW5kZXJUYXJnZXQgIT09IHVuZGVmaW5lZCA/IHJlbmRlclRhcmdldC50ZXh0dXJlLnBtcmVtVmVyc2lvbiA6IDA7XHJcblxyXG5cdFx0XHRcdGlmICggdGV4dHVyZS5pc1JlbmRlclRhcmdldFRleHR1cmUgJiYgdGV4dHVyZS5wbXJlbVZlcnNpb24gIT09IGN1cnJlbnRQTVJFTVZlcnNpb24gKSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBwbXJlbUdlbmVyYXRvciA9PT0gbnVsbCApIHBtcmVtR2VuZXJhdG9yID0gbmV3IFBNUkVNR2VuZXJhdG9yKCByZW5kZXJlciApO1xyXG5cclxuXHRcdFx0XHRcdHJlbmRlclRhcmdldCA9IGlzRXF1aXJlY3RNYXAgPyBwbXJlbUdlbmVyYXRvci5mcm9tRXF1aXJlY3Rhbmd1bGFyKCB0ZXh0dXJlLCByZW5kZXJUYXJnZXQgKSA6IHBtcmVtR2VuZXJhdG9yLmZyb21DdWJlbWFwKCB0ZXh0dXJlLCByZW5kZXJUYXJnZXQgKTtcclxuXHRcdFx0XHRcdHJlbmRlclRhcmdldC50ZXh0dXJlLnBtcmVtVmVyc2lvbiA9IHRleHR1cmUucG1yZW1WZXJzaW9uO1xyXG5cclxuXHRcdFx0XHRcdGN1YmVVVm1hcHMuc2V0KCB0ZXh0dXJlLCByZW5kZXJUYXJnZXQgKTtcclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gcmVuZGVyVGFyZ2V0LnRleHR1cmU7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCByZW5kZXJUYXJnZXQgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRcdHJldHVybiByZW5kZXJUYXJnZXQudGV4dHVyZTtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgaW1hZ2UgPSB0ZXh0dXJlLmltYWdlO1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCAoIGlzRXF1aXJlY3RNYXAgJiYgaW1hZ2UgJiYgaW1hZ2UuaGVpZ2h0ID4gMCApIHx8ICggaXNDdWJlTWFwICYmIGltYWdlICYmIGlzQ3ViZVRleHR1cmVDb21wbGV0ZSggaW1hZ2UgKSApICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoIHBtcmVtR2VuZXJhdG9yID09PSBudWxsICkgcG1yZW1HZW5lcmF0b3IgPSBuZXcgUE1SRU1HZW5lcmF0b3IoIHJlbmRlcmVyICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdHJlbmRlclRhcmdldCA9IGlzRXF1aXJlY3RNYXAgPyBwbXJlbUdlbmVyYXRvci5mcm9tRXF1aXJlY3Rhbmd1bGFyKCB0ZXh0dXJlICkgOiBwbXJlbUdlbmVyYXRvci5mcm9tQ3ViZW1hcCggdGV4dHVyZSApO1xyXG5cdFx0XHRcdFx0XHRcdHJlbmRlclRhcmdldC50ZXh0dXJlLnBtcmVtVmVyc2lvbiA9IHRleHR1cmUucG1yZW1WZXJzaW9uO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRjdWJlVVZtYXBzLnNldCggdGV4dHVyZSwgcmVuZGVyVGFyZ2V0ICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdHRleHR1cmUuYWRkRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvblRleHR1cmVEaXNwb3NlICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdHJldHVybiByZW5kZXJUYXJnZXQudGV4dHVyZTtcclxuXHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdC8vIGltYWdlIG5vdCB5ZXQgcmVhZHkuIHRyeSB0aGUgY29udmVyc2lvbiBuZXh0IGZyYW1lXHJcblxyXG5cdFx0XHRcdFx0XHRcdHJldHVybiBudWxsO1xyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGV4dHVyZTtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBpc0N1YmVUZXh0dXJlQ29tcGxldGUoIGltYWdlICkge1xyXG5cclxuXHRcdGxldCBjb3VudCA9IDA7XHJcblx0XHRjb25zdCBsZW5ndGggPSA2O1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdGlmICggaW1hZ2VbIGkgXSAhPT0gdW5kZWZpbmVkICkgY291bnQgKys7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBjb3VudCA9PT0gbGVuZ3RoO1xyXG5cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBvblRleHR1cmVEaXNwb3NlKCBldmVudCApIHtcclxuXHJcblx0XHRjb25zdCB0ZXh0dXJlID0gZXZlbnQudGFyZ2V0O1xyXG5cclxuXHRcdHRleHR1cmUucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvblRleHR1cmVEaXNwb3NlICk7XHJcblxyXG5cdFx0Y29uc3QgY3ViZW1hcFVWID0gY3ViZVVWbWFwcy5nZXQoIHRleHR1cmUgKTtcclxuXHJcblx0XHRpZiAoIGN1YmVtYXBVViAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Y3ViZVVWbWFwcy5kZWxldGUoIHRleHR1cmUgKTtcclxuXHRcdFx0Y3ViZW1hcFVWLmRpc3Bvc2UoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gZGlzcG9zZSgpIHtcclxuXHJcblx0XHRjdWJlVVZtYXBzID0gbmV3IFdlYWtNYXAoKTtcclxuXHJcblx0XHRpZiAoIHBtcmVtR2VuZXJhdG9yICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0cG1yZW1HZW5lcmF0b3IuZGlzcG9zZSgpO1xyXG5cdFx0XHRwbXJlbUdlbmVyYXRvciA9IG51bGw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiB7XHJcblx0XHRnZXQ6IGdldCxcclxuXHRcdGRpc3Bvc2U6IGRpc3Bvc2VcclxuXHR9O1xyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgV2ViR0xDdWJlVVZNYXBzIH07XHJcbiIsImltcG9ydCB7IHdhcm5PbmNlIH0gZnJvbSAnLi4vLi4vdXRpbHMuanMnO1xyXG5cclxuZnVuY3Rpb24gV2ViR0xFeHRlbnNpb25zKCBnbCApIHtcclxuXHJcblx0Y29uc3QgZXh0ZW5zaW9ucyA9IHt9O1xyXG5cclxuXHRmdW5jdGlvbiBnZXRFeHRlbnNpb24oIG5hbWUgKSB7XHJcblxyXG5cdFx0aWYgKCBleHRlbnNpb25zWyBuYW1lIF0gIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHJldHVybiBleHRlbnNpb25zWyBuYW1lIF07XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGxldCBleHRlbnNpb247XHJcblxyXG5cdFx0c3dpdGNoICggbmFtZSApIHtcclxuXHJcblx0XHRcdGNhc2UgJ1dFQkdMX2RlcHRoX3RleHR1cmUnOlxyXG5cdFx0XHRcdGV4dGVuc2lvbiA9IGdsLmdldEV4dGVuc2lvbiggJ1dFQkdMX2RlcHRoX3RleHR1cmUnICkgfHwgZ2wuZ2V0RXh0ZW5zaW9uKCAnTU9aX1dFQkdMX2RlcHRoX3RleHR1cmUnICkgfHwgZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCS0lUX1dFQkdMX2RlcHRoX3RleHR1cmUnICk7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlICdFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnOlxyXG5cdFx0XHRcdGV4dGVuc2lvbiA9IGdsLmdldEV4dGVuc2lvbiggJ0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYycgKSB8fCBnbC5nZXRFeHRlbnNpb24oICdNT1pfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ1dFQktJVF9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnICk7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0Yyc6XHJcblx0XHRcdFx0ZXh0ZW5zaW9uID0gZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMnICkgfHwgZ2wuZ2V0RXh0ZW5zaW9uKCAnTU9aX1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ1dFQktJVF9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YycgKTtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0Yyc6XHJcblx0XHRcdFx0ZXh0ZW5zaW9uID0gZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ1dFQktJVF9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnICk7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdGV4dGVuc2lvbiA9IGdsLmdldEV4dGVuc2lvbiggbmFtZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRleHRlbnNpb25zWyBuYW1lIF0gPSBleHRlbnNpb247XHJcblxyXG5cdFx0cmV0dXJuIGV4dGVuc2lvbjtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4ge1xyXG5cclxuXHRcdGhhczogZnVuY3Rpb24gKCBuYW1lICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIGdldEV4dGVuc2lvbiggbmFtZSApICE9PSBudWxsO1xyXG5cclxuXHRcdH0sXHJcblxyXG5cdFx0aW5pdDogZnVuY3Rpb24gKCkge1xyXG5cclxuXHRcdFx0Z2V0RXh0ZW5zaW9uKCAnRVhUX2NvbG9yX2J1ZmZlcl9mbG9hdCcgKTtcclxuXHRcdFx0Z2V0RXh0ZW5zaW9uKCAnV0VCR0xfY2xpcF9jdWxsX2Rpc3RhbmNlJyApO1xyXG5cdFx0XHRnZXRFeHRlbnNpb24oICdPRVNfdGV4dHVyZV9mbG9hdF9saW5lYXInICk7XHJcblx0XHRcdGdldEV4dGVuc2lvbiggJ0VYVF9jb2xvcl9idWZmZXJfaGFsZl9mbG9hdCcgKTtcclxuXHRcdFx0Z2V0RXh0ZW5zaW9uKCAnV0VCR0xfbXVsdGlzYW1wbGVkX3JlbmRlcl90b190ZXh0dXJlJyApO1xyXG5cdFx0XHRnZXRFeHRlbnNpb24oICdXRUJHTF9yZW5kZXJfc2hhcmVkX2V4cG9uZW50JyApO1xyXG5cclxuXHRcdH0sXHJcblxyXG5cdFx0Z2V0OiBmdW5jdGlvbiAoIG5hbWUgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBleHRlbnNpb24gPSBnZXRFeHRlbnNpb24oIG5hbWUgKTtcclxuXHJcblx0XHRcdGlmICggZXh0ZW5zaW9uID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHR3YXJuT25jZSggJ1RIUkVFLldlYkdMUmVuZGVyZXI6ICcgKyBuYW1lICsgJyBleHRlbnNpb24gbm90IHN1cHBvcnRlZC4nICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gZXh0ZW5zaW9uO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fTtcclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBXZWJHTEV4dGVuc2lvbnMgfTtcclxuIiwiaW1wb3J0IHsgVWludDE2QnVmZmVyQXR0cmlidXRlLCBVaW50MzJCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi8uLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcbmltcG9ydCB7IGFycmF5TmVlZHNVaW50MzIgfSBmcm9tICcuLi8uLi91dGlscy5qcyc7XHJcblxyXG5mdW5jdGlvbiBXZWJHTEdlb21ldHJpZXMoIGdsLCBhdHRyaWJ1dGVzLCBpbmZvLCBiaW5kaW5nU3RhdGVzICkge1xyXG5cclxuXHRjb25zdCBnZW9tZXRyaWVzID0ge307XHJcblx0Y29uc3Qgd2lyZWZyYW1lQXR0cmlidXRlcyA9IG5ldyBXZWFrTWFwKCk7XHJcblxyXG5cdGZ1bmN0aW9uIG9uR2VvbWV0cnlEaXNwb3NlKCBldmVudCApIHtcclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeSA9IGV2ZW50LnRhcmdldDtcclxuXHJcblx0XHRpZiAoIGdlb21ldHJ5LmluZGV4ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0YXR0cmlidXRlcy5yZW1vdmUoIGdlb21ldHJ5LmluZGV4ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZvciAoIGNvbnN0IG5hbWUgaW4gZ2VvbWV0cnkuYXR0cmlidXRlcyApIHtcclxuXHJcblx0XHRcdGF0dHJpYnV0ZXMucmVtb3ZlKCBnZW9tZXRyeS5hdHRyaWJ1dGVzWyBuYW1lIF0gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Z2VvbWV0cnkucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvbkdlb21ldHJ5RGlzcG9zZSApO1xyXG5cclxuXHRcdGRlbGV0ZSBnZW9tZXRyaWVzWyBnZW9tZXRyeS5pZCBdO1xyXG5cclxuXHRcdGNvbnN0IGF0dHJpYnV0ZSA9IHdpcmVmcmFtZUF0dHJpYnV0ZXMuZ2V0KCBnZW9tZXRyeSApO1xyXG5cclxuXHRcdGlmICggYXR0cmlidXRlICkge1xyXG5cclxuXHRcdFx0YXR0cmlidXRlcy5yZW1vdmUoIGF0dHJpYnV0ZSApO1xyXG5cdFx0XHR3aXJlZnJhbWVBdHRyaWJ1dGVzLmRlbGV0ZSggZ2VvbWV0cnkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0YmluZGluZ1N0YXRlcy5yZWxlYXNlU3RhdGVzT2ZHZW9tZXRyeSggZ2VvbWV0cnkgKTtcclxuXHJcblx0XHRpZiAoIGdlb21ldHJ5LmlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRkZWxldGUgZ2VvbWV0cnkuX21heEluc3RhbmNlQ291bnQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0aW5mby5tZW1vcnkuZ2VvbWV0cmllcyAtLTtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBnZXQoIG9iamVjdCwgZ2VvbWV0cnkgKSB7XHJcblxyXG5cdFx0aWYgKCBnZW9tZXRyaWVzWyBnZW9tZXRyeS5pZCBdID09PSB0cnVlICkgcmV0dXJuIGdlb21ldHJ5O1xyXG5cclxuXHRcdGdlb21ldHJ5LmFkZEV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25HZW9tZXRyeURpc3Bvc2UgKTtcclxuXHJcblx0XHRnZW9tZXRyaWVzWyBnZW9tZXRyeS5pZCBdID0gdHJ1ZTtcclxuXHJcblx0XHRpbmZvLm1lbW9yeS5nZW9tZXRyaWVzICsrO1xyXG5cclxuXHRcdHJldHVybiBnZW9tZXRyeTtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiB1cGRhdGUoIGdlb21ldHJ5ICkge1xyXG5cclxuXHRcdGNvbnN0IGdlb21ldHJ5QXR0cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXM7XHJcblxyXG5cdFx0Ly8gVXBkYXRpbmcgaW5kZXggYnVmZmVyIGluIFZBTyBub3cuIFNlZSBXZWJHTEJpbmRpbmdTdGF0ZXMuXHJcblxyXG5cdFx0Zm9yICggY29uc3QgbmFtZSBpbiBnZW9tZXRyeUF0dHJpYnV0ZXMgKSB7XHJcblxyXG5cdFx0XHRhdHRyaWJ1dGVzLnVwZGF0ZSggZ2VvbWV0cnlBdHRyaWJ1dGVzWyBuYW1lIF0sIGdsLkFSUkFZX0JVRkZFUiApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiB1cGRhdGVXaXJlZnJhbWVBdHRyaWJ1dGUoIGdlb21ldHJ5ICkge1xyXG5cclxuXHRcdGNvbnN0IGluZGljZXMgPSBbXTtcclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeUluZGV4ID0gZ2VvbWV0cnkuaW5kZXg7XHJcblx0XHRjb25zdCBnZW9tZXRyeVBvc2l0aW9uID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjtcclxuXHRcdGxldCB2ZXJzaW9uID0gMDtcclxuXHJcblx0XHRpZiAoIGdlb21ldHJ5SW5kZXggIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBhcnJheSA9IGdlb21ldHJ5SW5kZXguYXJyYXk7XHJcblx0XHRcdHZlcnNpb24gPSBnZW9tZXRyeUluZGV4LnZlcnNpb247XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpICs9IDMgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGEgPSBhcnJheVsgaSArIDAgXTtcclxuXHRcdFx0XHRjb25zdCBiID0gYXJyYXlbIGkgKyAxIF07XHJcblx0XHRcdFx0Y29uc3QgYyA9IGFycmF5WyBpICsgMiBdO1xyXG5cclxuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGIsIGMsIGMsIGEgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2UgaWYgKCBnZW9tZXRyeVBvc2l0aW9uICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBhcnJheSA9IGdlb21ldHJ5UG9zaXRpb24uYXJyYXk7XHJcblx0XHRcdHZlcnNpb24gPSBnZW9tZXRyeVBvc2l0aW9uLnZlcnNpb247XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSAoIGFycmF5Lmxlbmd0aCAvIDMgKSAtIDE7IGkgPCBsOyBpICs9IDMgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGEgPSBpICsgMDtcclxuXHRcdFx0XHRjb25zdCBiID0gaSArIDE7XHJcblx0XHRcdFx0Y29uc3QgYyA9IGkgKyAyO1xyXG5cclxuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGIsIGMsIGMsIGEgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBhdHRyaWJ1dGUgPSBuZXcgKCBhcnJheU5lZWRzVWludDMyKCBpbmRpY2VzICkgPyBVaW50MzJCdWZmZXJBdHRyaWJ1dGUgOiBVaW50MTZCdWZmZXJBdHRyaWJ1dGUgKSggaW5kaWNlcywgMSApO1xyXG5cdFx0YXR0cmlidXRlLnZlcnNpb24gPSB2ZXJzaW9uO1xyXG5cclxuXHRcdC8vIFVwZGF0aW5nIGluZGV4IGJ1ZmZlciBpbiBWQU8gbm93LiBTZWUgV2ViR0xCaW5kaW5nU3RhdGVzXHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCBwcmV2aW91c0F0dHJpYnV0ZSA9IHdpcmVmcmFtZUF0dHJpYnV0ZXMuZ2V0KCBnZW9tZXRyeSApO1xyXG5cclxuXHRcdGlmICggcHJldmlvdXNBdHRyaWJ1dGUgKSBhdHRyaWJ1dGVzLnJlbW92ZSggcHJldmlvdXNBdHRyaWJ1dGUgKTtcclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdHdpcmVmcmFtZUF0dHJpYnV0ZXMuc2V0KCBnZW9tZXRyeSwgYXR0cmlidXRlICk7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gZ2V0V2lyZWZyYW1lQXR0cmlidXRlKCBnZW9tZXRyeSApIHtcclxuXHJcblx0XHRjb25zdCBjdXJyZW50QXR0cmlidXRlID0gd2lyZWZyYW1lQXR0cmlidXRlcy5nZXQoIGdlb21ldHJ5ICk7XHJcblxyXG5cdFx0aWYgKCBjdXJyZW50QXR0cmlidXRlICkge1xyXG5cclxuXHRcdFx0Y29uc3QgZ2VvbWV0cnlJbmRleCA9IGdlb21ldHJ5LmluZGV4O1xyXG5cclxuXHRcdFx0aWYgKCBnZW9tZXRyeUluZGV4ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHQvLyBpZiB0aGUgYXR0cmlidXRlIGlzIG9ic29sZXRlLCBjcmVhdGUgYSBuZXcgb25lXHJcblxyXG5cdFx0XHRcdGlmICggY3VycmVudEF0dHJpYnV0ZS52ZXJzaW9uIDwgZ2VvbWV0cnlJbmRleC52ZXJzaW9uICkge1xyXG5cclxuXHRcdFx0XHRcdHVwZGF0ZVdpcmVmcmFtZUF0dHJpYnV0ZSggZ2VvbWV0cnkgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR1cGRhdGVXaXJlZnJhbWVBdHRyaWJ1dGUoIGdlb21ldHJ5ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB3aXJlZnJhbWVBdHRyaWJ1dGVzLmdldCggZ2VvbWV0cnkgKTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4ge1xyXG5cclxuXHRcdGdldDogZ2V0LFxyXG5cdFx0dXBkYXRlOiB1cGRhdGUsXHJcblxyXG5cdFx0Z2V0V2lyZWZyYW1lQXR0cmlidXRlOiBnZXRXaXJlZnJhbWVBdHRyaWJ1dGVcclxuXHJcblx0fTtcclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBXZWJHTEdlb21ldHJpZXMgfTtcclxuIiwiZnVuY3Rpb24gV2ViR0xJbmRleGVkQnVmZmVyUmVuZGVyZXIoIGdsLCBleHRlbnNpb25zLCBpbmZvICkge1xyXG5cclxuXHRsZXQgbW9kZTtcclxuXHJcblx0ZnVuY3Rpb24gc2V0TW9kZSggdmFsdWUgKSB7XHJcblxyXG5cdFx0bW9kZSA9IHZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdGxldCB0eXBlLCBieXRlc1BlckVsZW1lbnQ7XHJcblxyXG5cdGZ1bmN0aW9uIHNldEluZGV4KCB2YWx1ZSApIHtcclxuXHJcblx0XHR0eXBlID0gdmFsdWUudHlwZTtcclxuXHRcdGJ5dGVzUGVyRWxlbWVudCA9IHZhbHVlLmJ5dGVzUGVyRWxlbWVudDtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiByZW5kZXIoIHN0YXJ0LCBjb3VudCApIHtcclxuXHJcblx0XHRnbC5kcmF3RWxlbWVudHMoIG1vZGUsIGNvdW50LCB0eXBlLCBzdGFydCAqIGJ5dGVzUGVyRWxlbWVudCApO1xyXG5cclxuXHRcdGluZm8udXBkYXRlKCBjb3VudCwgbW9kZSwgMSApO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHJlbmRlckluc3RhbmNlcyggc3RhcnQsIGNvdW50LCBwcmltY291bnQgKSB7XHJcblxyXG5cdFx0aWYgKCBwcmltY291bnQgPT09IDAgKSByZXR1cm47XHJcblxyXG5cdFx0Z2wuZHJhd0VsZW1lbnRzSW5zdGFuY2VkKCBtb2RlLCBjb3VudCwgdHlwZSwgc3RhcnQgKiBieXRlc1BlckVsZW1lbnQsIHByaW1jb3VudCApO1xyXG5cclxuXHRcdGluZm8udXBkYXRlKCBjb3VudCwgbW9kZSwgcHJpbWNvdW50ICk7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gcmVuZGVyTXVsdGlEcmF3KCBzdGFydHMsIGNvdW50cywgZHJhd0NvdW50ICkge1xyXG5cclxuXHRcdGlmICggZHJhd0NvdW50ID09PSAwICkgcmV0dXJuO1xyXG5cclxuXHRcdGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfbXVsdGlfZHJhdycgKTtcclxuXHRcdGV4dGVuc2lvbi5tdWx0aURyYXdFbGVtZW50c1dFQkdMKCBtb2RlLCBjb3VudHMsIDAsIHR5cGUsIHN0YXJ0cywgMCwgZHJhd0NvdW50ICk7XHJcblxyXG5cdFx0bGV0IGVsZW1lbnRDb3VudCA9IDA7XHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBkcmF3Q291bnQ7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRlbGVtZW50Q291bnQgKz0gY291bnRzWyBpIF07XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGluZm8udXBkYXRlKCBlbGVtZW50Q291bnQsIG1vZGUsIDEgKTtcclxuXHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gcmVuZGVyTXVsdGlEcmF3SW5zdGFuY2VzKCBzdGFydHMsIGNvdW50cywgZHJhd0NvdW50LCBwcmltY291bnQgKSB7XHJcblxyXG5cdFx0aWYgKCBkcmF3Q291bnQgPT09IDAgKSByZXR1cm47XHJcblxyXG5cdFx0Y29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9tdWx0aV9kcmF3JyApO1xyXG5cclxuXHRcdGlmICggZXh0ZW5zaW9uID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgc3RhcnRzLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0cmVuZGVySW5zdGFuY2VzKCBzdGFydHNbIGkgXSAvIGJ5dGVzUGVyRWxlbWVudCwgY291bnRzWyBpIF0sIHByaW1jb3VudFsgaSBdICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGV4dGVuc2lvbi5tdWx0aURyYXdFbGVtZW50c0luc3RhbmNlZFdFQkdMKCBtb2RlLCBjb3VudHMsIDAsIHR5cGUsIHN0YXJ0cywgMCwgcHJpbWNvdW50LCAwLCBkcmF3Q291bnQgKTtcclxuXHJcblx0XHRcdGxldCBlbGVtZW50Q291bnQgPSAwO1xyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBkcmF3Q291bnQ7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGVsZW1lbnRDb3VudCArPSBjb3VudHNbIGkgXSAqIHByaW1jb3VudFsgaSBdO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aW5mby51cGRhdGUoIGVsZW1lbnRDb3VudCwgbW9kZSwgMSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvL1xyXG5cclxuXHR0aGlzLnNldE1vZGUgPSBzZXRNb2RlO1xyXG5cdHRoaXMuc2V0SW5kZXggPSBzZXRJbmRleDtcclxuXHR0aGlzLnJlbmRlciA9IHJlbmRlcjtcclxuXHR0aGlzLnJlbmRlckluc3RhbmNlcyA9IHJlbmRlckluc3RhbmNlcztcclxuXHR0aGlzLnJlbmRlck11bHRpRHJhdyA9IHJlbmRlck11bHRpRHJhdztcclxuXHR0aGlzLnJlbmRlck11bHRpRHJhd0luc3RhbmNlcyA9IHJlbmRlck11bHRpRHJhd0luc3RhbmNlcztcclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBXZWJHTEluZGV4ZWRCdWZmZXJSZW5kZXJlciB9O1xyXG4iLCJmdW5jdGlvbiBXZWJHTEluZm8oIGdsICkge1xyXG5cclxuXHRjb25zdCBtZW1vcnkgPSB7XHJcblx0XHRnZW9tZXRyaWVzOiAwLFxyXG5cdFx0dGV4dHVyZXM6IDBcclxuXHR9O1xyXG5cclxuXHRjb25zdCByZW5kZXIgPSB7XHJcblx0XHRmcmFtZTogMCxcclxuXHRcdGNhbGxzOiAwLFxyXG5cdFx0dHJpYW5nbGVzOiAwLFxyXG5cdFx0cG9pbnRzOiAwLFxyXG5cdFx0bGluZXM6IDBcclxuXHR9O1xyXG5cclxuXHRmdW5jdGlvbiB1cGRhdGUoIGNvdW50LCBtb2RlLCBpbnN0YW5jZUNvdW50ICkge1xyXG5cclxuXHRcdHJlbmRlci5jYWxscyArKztcclxuXHJcblx0XHRzd2l0Y2ggKCBtb2RlICkge1xyXG5cclxuXHRcdFx0Y2FzZSBnbC5UUklBTkdMRVM6XHJcblx0XHRcdFx0cmVuZGVyLnRyaWFuZ2xlcyArPSBpbnN0YW5jZUNvdW50ICogKCBjb3VudCAvIDMgKTtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgZ2wuTElORVM6XHJcblx0XHRcdFx0cmVuZGVyLmxpbmVzICs9IGluc3RhbmNlQ291bnQgKiAoIGNvdW50IC8gMiApO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBnbC5MSU5FX1NUUklQOlxyXG5cdFx0XHRcdHJlbmRlci5saW5lcyArPSBpbnN0YW5jZUNvdW50ICogKCBjb3VudCAtIDEgKTtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgZ2wuTElORV9MT09QOlxyXG5cdFx0XHRcdHJlbmRlci5saW5lcyArPSBpbnN0YW5jZUNvdW50ICogY291bnQ7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIGdsLlBPSU5UUzpcclxuXHRcdFx0XHRyZW5kZXIucG9pbnRzICs9IGluc3RhbmNlQ291bnQgKiBjb3VudDtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMSW5mbzogVW5rbm93biBkcmF3IG1vZGU6JywgbW9kZSApO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiByZXNldCgpIHtcclxuXHJcblx0XHRyZW5kZXIuY2FsbHMgPSAwO1xyXG5cdFx0cmVuZGVyLnRyaWFuZ2xlcyA9IDA7XHJcblx0XHRyZW5kZXIucG9pbnRzID0gMDtcclxuXHRcdHJlbmRlci5saW5lcyA9IDA7XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIHtcclxuXHRcdG1lbW9yeTogbWVtb3J5LFxyXG5cdFx0cmVuZGVyOiByZW5kZXIsXHJcblx0XHRwcm9ncmFtczogbnVsbCxcclxuXHRcdGF1dG9SZXNldDogdHJ1ZSxcclxuXHRcdHJlc2V0OiByZXNldCxcclxuXHRcdHVwZGF0ZTogdXBkYXRlXHJcblx0fTtcclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBXZWJHTEluZm8gfTtcclxuIiwiaW1wb3J0IHsgRmxvYXRUeXBlIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgRGF0YUFycmF5VGV4dHVyZSB9IGZyb20gJy4uLy4uL3RleHR1cmVzL0RhdGFBcnJheVRleHR1cmUuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3I0IH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3I0LmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMi5qcyc7XHJcblxyXG5mdW5jdGlvbiBXZWJHTE1vcnBodGFyZ2V0cyggZ2wsIGNhcGFiaWxpdGllcywgdGV4dHVyZXMgKSB7XHJcblxyXG5cdGNvbnN0IG1vcnBoVGV4dHVyZXMgPSBuZXcgV2Vha01hcCgpO1xyXG5cdGNvbnN0IG1vcnBoID0gbmV3IFZlY3RvcjQoKTtcclxuXHJcblx0ZnVuY3Rpb24gdXBkYXRlKCBvYmplY3QsIGdlb21ldHJ5LCBwcm9ncmFtICkge1xyXG5cclxuXHRcdGNvbnN0IG9iamVjdEluZmx1ZW5jZXMgPSBvYmplY3QubW9ycGhUYXJnZXRJbmZsdWVuY2VzO1xyXG5cclxuXHRcdC8vIHRoZSBmb2xsb3dpbmcgZW5jb2RlcyBtb3JwaCB0YXJnZXRzIGludG8gYW4gYXJyYXkgb2YgZGF0YSB0ZXh0dXJlcy4gRWFjaCBsYXllciByZXByZXNlbnRzIGEgc2luZ2xlIG1vcnBoIHRhcmdldC5cclxuXHJcblx0XHRjb25zdCBtb3JwaEF0dHJpYnV0ZSA9IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbiB8fCBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMubm9ybWFsIHx8IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5jb2xvcjtcclxuXHRcdGNvbnN0IG1vcnBoVGFyZ2V0c0NvdW50ID0gKCBtb3JwaEF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkgPyBtb3JwaEF0dHJpYnV0ZS5sZW5ndGggOiAwO1xyXG5cclxuXHRcdGxldCBlbnRyeSA9IG1vcnBoVGV4dHVyZXMuZ2V0KCBnZW9tZXRyeSApO1xyXG5cclxuXHRcdGlmICggZW50cnkgPT09IHVuZGVmaW5lZCB8fCBlbnRyeS5jb3VudCAhPT0gbW9ycGhUYXJnZXRzQ291bnQgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGVudHJ5ICE9PSB1bmRlZmluZWQgKSBlbnRyeS50ZXh0dXJlLmRpc3Bvc2UoKTtcclxuXHJcblx0XHRcdGNvbnN0IGhhc01vcnBoUG9zaXRpb24gPSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24gIT09IHVuZGVmaW5lZDtcclxuXHRcdFx0Y29uc3QgaGFzTW9ycGhOb3JtYWxzID0gZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbCAhPT0gdW5kZWZpbmVkO1xyXG5cdFx0XHRjb25zdCBoYXNNb3JwaENvbG9ycyA9IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5jb2xvciAhPT0gdW5kZWZpbmVkO1xyXG5cclxuXHRcdFx0Y29uc3QgbW9ycGhUYXJnZXRzID0gZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uIHx8IFtdO1xyXG5cdFx0XHRjb25zdCBtb3JwaE5vcm1hbHMgPSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMubm9ybWFsIHx8IFtdO1xyXG5cdFx0XHRjb25zdCBtb3JwaENvbG9ycyA9IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5jb2xvciB8fCBbXTtcclxuXHJcblx0XHRcdGxldCB2ZXJ0ZXhEYXRhQ291bnQgPSAwO1xyXG5cclxuXHRcdFx0aWYgKCBoYXNNb3JwaFBvc2l0aW9uID09PSB0cnVlICkgdmVydGV4RGF0YUNvdW50ID0gMTtcclxuXHRcdFx0aWYgKCBoYXNNb3JwaE5vcm1hbHMgPT09IHRydWUgKSB2ZXJ0ZXhEYXRhQ291bnQgPSAyO1xyXG5cdFx0XHRpZiAoIGhhc01vcnBoQ29sb3JzID09PSB0cnVlICkgdmVydGV4RGF0YUNvdW50ID0gMztcclxuXHJcblx0XHRcdGxldCB3aWR0aCA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24uY291bnQgKiB2ZXJ0ZXhEYXRhQ291bnQ7XHJcblx0XHRcdGxldCBoZWlnaHQgPSAxO1xyXG5cclxuXHRcdFx0aWYgKCB3aWR0aCA+IGNhcGFiaWxpdGllcy5tYXhUZXh0dXJlU2l6ZSApIHtcclxuXHJcblx0XHRcdFx0aGVpZ2h0ID0gTWF0aC5jZWlsKCB3aWR0aCAvIGNhcGFiaWxpdGllcy5tYXhUZXh0dXJlU2l6ZSApO1xyXG5cdFx0XHRcdHdpZHRoID0gY2FwYWJpbGl0aWVzLm1heFRleHR1cmVTaXplO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgYnVmZmVyID0gbmV3IEZsb2F0MzJBcnJheSggd2lkdGggKiBoZWlnaHQgKiA0ICogbW9ycGhUYXJnZXRzQ291bnQgKTtcclxuXHJcblx0XHRcdGNvbnN0IHRleHR1cmUgPSBuZXcgRGF0YUFycmF5VGV4dHVyZSggYnVmZmVyLCB3aWR0aCwgaGVpZ2h0LCBtb3JwaFRhcmdldHNDb3VudCApO1xyXG5cdFx0XHR0ZXh0dXJlLnR5cGUgPSBGbG9hdFR5cGU7XHJcblx0XHRcdHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdFx0Ly8gZmlsbCBidWZmZXJcclxuXHJcblx0XHRcdGNvbnN0IHZlcnRleERhdGFTdHJpZGUgPSB2ZXJ0ZXhEYXRhQ291bnQgKiA0O1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgbW9ycGhUYXJnZXRzQ291bnQ7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IG1vcnBoVGFyZ2V0ID0gbW9ycGhUYXJnZXRzWyBpIF07XHJcblx0XHRcdFx0Y29uc3QgbW9ycGhOb3JtYWwgPSBtb3JwaE5vcm1hbHNbIGkgXTtcclxuXHRcdFx0XHRjb25zdCBtb3JwaENvbG9yID0gbW9ycGhDb2xvcnNbIGkgXTtcclxuXHJcblx0XHRcdFx0Y29uc3Qgb2Zmc2V0ID0gd2lkdGggKiBoZWlnaHQgKiA0ICogaTtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGogPSAwOyBqIDwgbW9ycGhUYXJnZXQuY291bnQ7IGogKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3Qgc3RyaWRlID0gaiAqIHZlcnRleERhdGFTdHJpZGU7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBoYXNNb3JwaFBvc2l0aW9uID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0bW9ycGguZnJvbUJ1ZmZlckF0dHJpYnV0ZSggbW9ycGhUYXJnZXQsIGogKTtcclxuXHJcblx0XHRcdFx0XHRcdGJ1ZmZlclsgb2Zmc2V0ICsgc3RyaWRlICsgMCBdID0gbW9ycGgueDtcclxuXHRcdFx0XHRcdFx0YnVmZmVyWyBvZmZzZXQgKyBzdHJpZGUgKyAxIF0gPSBtb3JwaC55O1xyXG5cdFx0XHRcdFx0XHRidWZmZXJbIG9mZnNldCArIHN0cmlkZSArIDIgXSA9IG1vcnBoLno7XHJcblx0XHRcdFx0XHRcdGJ1ZmZlclsgb2Zmc2V0ICsgc3RyaWRlICsgMyBdID0gMDtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBoYXNNb3JwaE5vcm1hbHMgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRtb3JwaC5mcm9tQnVmZmVyQXR0cmlidXRlKCBtb3JwaE5vcm1hbCwgaiApO1xyXG5cclxuXHRcdFx0XHRcdFx0YnVmZmVyWyBvZmZzZXQgKyBzdHJpZGUgKyA0IF0gPSBtb3JwaC54O1xyXG5cdFx0XHRcdFx0XHRidWZmZXJbIG9mZnNldCArIHN0cmlkZSArIDUgXSA9IG1vcnBoLnk7XHJcblx0XHRcdFx0XHRcdGJ1ZmZlclsgb2Zmc2V0ICsgc3RyaWRlICsgNiBdID0gbW9ycGguejtcclxuXHRcdFx0XHRcdFx0YnVmZmVyWyBvZmZzZXQgKyBzdHJpZGUgKyA3IF0gPSAwO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRpZiAoIGhhc01vcnBoQ29sb3JzID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0bW9ycGguZnJvbUJ1ZmZlckF0dHJpYnV0ZSggbW9ycGhDb2xvciwgaiApO1xyXG5cclxuXHRcdFx0XHRcdFx0YnVmZmVyWyBvZmZzZXQgKyBzdHJpZGUgKyA4IF0gPSBtb3JwaC54O1xyXG5cdFx0XHRcdFx0XHRidWZmZXJbIG9mZnNldCArIHN0cmlkZSArIDkgXSA9IG1vcnBoLnk7XHJcblx0XHRcdFx0XHRcdGJ1ZmZlclsgb2Zmc2V0ICsgc3RyaWRlICsgMTAgXSA9IG1vcnBoLno7XHJcblx0XHRcdFx0XHRcdGJ1ZmZlclsgb2Zmc2V0ICsgc3RyaWRlICsgMTEgXSA9ICggbW9ycGhDb2xvci5pdGVtU2l6ZSA9PT0gNCApID8gbW9ycGgudyA6IDE7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRlbnRyeSA9IHtcclxuXHRcdFx0XHRjb3VudDogbW9ycGhUYXJnZXRzQ291bnQsXHJcblx0XHRcdFx0dGV4dHVyZTogdGV4dHVyZSxcclxuXHRcdFx0XHRzaXplOiBuZXcgVmVjdG9yMiggd2lkdGgsIGhlaWdodCApXHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHRtb3JwaFRleHR1cmVzLnNldCggZ2VvbWV0cnksIGVudHJ5ICk7XHJcblxyXG5cdFx0XHRmdW5jdGlvbiBkaXNwb3NlVGV4dHVyZSgpIHtcclxuXHJcblx0XHRcdFx0dGV4dHVyZS5kaXNwb3NlKCk7XHJcblxyXG5cdFx0XHRcdG1vcnBoVGV4dHVyZXMuZGVsZXRlKCBnZW9tZXRyeSApO1xyXG5cclxuXHRcdFx0XHRnZW9tZXRyeS5yZW1vdmVFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIGRpc3Bvc2VUZXh0dXJlICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRnZW9tZXRyeS5hZGRFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIGRpc3Bvc2VUZXh0dXJlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vXHJcblx0XHRpZiAoIG9iamVjdC5pc0luc3RhbmNlZE1lc2ggPT09IHRydWUgJiYgb2JqZWN0Lm1vcnBoVGV4dHVyZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHByb2dyYW0uZ2V0VW5pZm9ybXMoKS5zZXRWYWx1ZSggZ2wsICdtb3JwaFRleHR1cmUnLCBvYmplY3QubW9ycGhUZXh0dXJlLCB0ZXh0dXJlcyApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRsZXQgbW9ycGhJbmZsdWVuY2VzU3VtID0gMDtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IG9iamVjdEluZmx1ZW5jZXMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRtb3JwaEluZmx1ZW5jZXNTdW0gKz0gb2JqZWN0SW5mbHVlbmNlc1sgaSBdO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgbW9ycGhCYXNlSW5mbHVlbmNlID0gZ2VvbWV0cnkubW9ycGhUYXJnZXRzUmVsYXRpdmUgPyAxIDogMSAtIG1vcnBoSW5mbHVlbmNlc1N1bTtcclxuXHJcblxyXG5cdFx0XHRwcm9ncmFtLmdldFVuaWZvcm1zKCkuc2V0VmFsdWUoIGdsLCAnbW9ycGhUYXJnZXRCYXNlSW5mbHVlbmNlJywgbW9ycGhCYXNlSW5mbHVlbmNlICk7XHJcblx0XHRcdHByb2dyYW0uZ2V0VW5pZm9ybXMoKS5zZXRWYWx1ZSggZ2wsICdtb3JwaFRhcmdldEluZmx1ZW5jZXMnLCBvYmplY3RJbmZsdWVuY2VzICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHByb2dyYW0uZ2V0VW5pZm9ybXMoKS5zZXRWYWx1ZSggZ2wsICdtb3JwaFRhcmdldHNUZXh0dXJlJywgZW50cnkudGV4dHVyZSwgdGV4dHVyZXMgKTtcclxuXHRcdHByb2dyYW0uZ2V0VW5pZm9ybXMoKS5zZXRWYWx1ZSggZ2wsICdtb3JwaFRhcmdldHNUZXh0dXJlU2l6ZScsIGVudHJ5LnNpemUgKTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4ge1xyXG5cclxuXHRcdHVwZGF0ZTogdXBkYXRlXHJcblxyXG5cdH07XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgV2ViR0xNb3JwaHRhcmdldHMgfTtcclxuIiwiZnVuY3Rpb24gV2ViR0xPYmplY3RzKCBnbCwgZ2VvbWV0cmllcywgYXR0cmlidXRlcywgaW5mbyApIHtcclxuXHJcblx0bGV0IHVwZGF0ZU1hcCA9IG5ldyBXZWFrTWFwKCk7XHJcblxyXG5cdGZ1bmN0aW9uIHVwZGF0ZSggb2JqZWN0ICkge1xyXG5cclxuXHRcdGNvbnN0IGZyYW1lID0gaW5mby5yZW5kZXIuZnJhbWU7XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSBvYmplY3QuZ2VvbWV0cnk7XHJcblx0XHRjb25zdCBidWZmZXJnZW9tZXRyeSA9IGdlb21ldHJpZXMuZ2V0KCBvYmplY3QsIGdlb21ldHJ5ICk7XHJcblxyXG5cdFx0Ly8gVXBkYXRlIG9uY2UgcGVyIGZyYW1lXHJcblxyXG5cdFx0aWYgKCB1cGRhdGVNYXAuZ2V0KCBidWZmZXJnZW9tZXRyeSApICE9PSBmcmFtZSApIHtcclxuXHJcblx0XHRcdGdlb21ldHJpZXMudXBkYXRlKCBidWZmZXJnZW9tZXRyeSApO1xyXG5cclxuXHRcdFx0dXBkYXRlTWFwLnNldCggYnVmZmVyZ2VvbWV0cnksIGZyYW1lICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggb2JqZWN0LmlzSW5zdGFuY2VkTWVzaCApIHtcclxuXHJcblx0XHRcdGlmICggb2JqZWN0Lmhhc0V2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25JbnN0YW5jZWRNZXNoRGlzcG9zZSApID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdFx0b2JqZWN0LmFkZEV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25JbnN0YW5jZWRNZXNoRGlzcG9zZSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCB1cGRhdGVNYXAuZ2V0KCBvYmplY3QgKSAhPT0gZnJhbWUgKSB7XHJcblxyXG5cdFx0XHRcdGF0dHJpYnV0ZXMudXBkYXRlKCBvYmplY3QuaW5zdGFuY2VNYXRyaXgsIGdsLkFSUkFZX0JVRkZFUiApO1xyXG5cclxuXHRcdFx0XHRpZiAoIG9iamVjdC5pbnN0YW5jZUNvbG9yICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRcdGF0dHJpYnV0ZXMudXBkYXRlKCBvYmplY3QuaW5zdGFuY2VDb2xvciwgZ2wuQVJSQVlfQlVGRkVSICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0dXBkYXRlTWFwLnNldCggb2JqZWN0LCBmcmFtZSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIG9iamVjdC5pc1NraW5uZWRNZXNoICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgc2tlbGV0b24gPSBvYmplY3Quc2tlbGV0b247XHJcblxyXG5cdFx0XHRpZiAoIHVwZGF0ZU1hcC5nZXQoIHNrZWxldG9uICkgIT09IGZyYW1lICkge1xyXG5cclxuXHRcdFx0XHRza2VsZXRvbi51cGRhdGUoKTtcclxuXHJcblx0XHRcdFx0dXBkYXRlTWFwLnNldCggc2tlbGV0b24sIGZyYW1lICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBidWZmZXJnZW9tZXRyeTtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBkaXNwb3NlKCkge1xyXG5cclxuXHRcdHVwZGF0ZU1hcCA9IG5ldyBXZWFrTWFwKCk7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gb25JbnN0YW5jZWRNZXNoRGlzcG9zZSggZXZlbnQgKSB7XHJcblxyXG5cdFx0Y29uc3QgaW5zdGFuY2VkTWVzaCA9IGV2ZW50LnRhcmdldDtcclxuXHJcblx0XHRpbnN0YW5jZWRNZXNoLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25JbnN0YW5jZWRNZXNoRGlzcG9zZSApO1xyXG5cclxuXHRcdGF0dHJpYnV0ZXMucmVtb3ZlKCBpbnN0YW5jZWRNZXNoLmluc3RhbmNlTWF0cml4ICk7XHJcblxyXG5cdFx0aWYgKCBpbnN0YW5jZWRNZXNoLmluc3RhbmNlQ29sb3IgIT09IG51bGwgKSBhdHRyaWJ1dGVzLnJlbW92ZSggaW5zdGFuY2VkTWVzaC5pbnN0YW5jZUNvbG9yICk7XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIHtcclxuXHJcblx0XHR1cGRhdGU6IHVwZGF0ZSxcclxuXHRcdGRpc3Bvc2U6IGRpc3Bvc2VcclxuXHJcblx0fTtcclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBXZWJHTE9iamVjdHMgfTtcclxuIiwiLyoqXHJcbiAqIFVuaWZvcm1zIG9mIGEgcHJvZ3JhbS5cclxuICogVGhvc2UgZm9ybSBhIHRyZWUgc3RydWN0dXJlIHdpdGggYSBzcGVjaWFsIHRvcC1sZXZlbCBjb250YWluZXIgZm9yIHRoZSByb290LFxyXG4gKiB3aGljaCB5b3UgZ2V0IGJ5IGNhbGxpbmcgJ25ldyBXZWJHTFVuaWZvcm1zKCBnbCwgcHJvZ3JhbSApJy5cclxuICpcclxuICpcclxuICogUHJvcGVydGllcyBvZiBpbm5lciBub2RlcyBpbmNsdWRpbmcgdGhlIHRvcC1sZXZlbCBjb250YWluZXI6XHJcbiAqXHJcbiAqIC5zZXEgLSBhcnJheSBvZiBuZXN0ZWQgdW5pZm9ybXNcclxuICogLm1hcCAtIG5lc3RlZCB1bmlmb3JtcyBieSBuYW1lXHJcbiAqXHJcbiAqXHJcbiAqIE1ldGhvZHMgb2YgYWxsIG5vZGVzIGV4Y2VwdCB0aGUgdG9wLWxldmVsIGNvbnRhaW5lcjpcclxuICpcclxuICogLnNldFZhbHVlKCBnbCwgdmFsdWUsIFt0ZXh0dXJlc10gKVxyXG4gKlxyXG4gKiBcdFx0dXBsb2FkcyBhIHVuaWZvcm0gdmFsdWUocylcclxuICogIFx0dGhlICd0ZXh0dXJlcycgcGFyYW1ldGVyIGlzIG5lZWRlZCBmb3Igc2FtcGxlciB1bmlmb3Jtc1xyXG4gKlxyXG4gKlxyXG4gKiBTdGF0aWMgbWV0aG9kcyBvZiB0aGUgdG9wLWxldmVsIGNvbnRhaW5lciAodGV4dHVyZXMgZmFjdG9yaXphdGlvbnMpOlxyXG4gKlxyXG4gKiAudXBsb2FkKCBnbCwgc2VxLCB2YWx1ZXMsIHRleHR1cmVzIClcclxuICpcclxuICogXHRcdHNldHMgdW5pZm9ybXMgaW4gJ3NlcScgdG8gJ3ZhbHVlc1tpZF0udmFsdWUnXHJcbiAqXHJcbiAqIC5zZXFXaXRoVmFsdWUoIHNlcSwgdmFsdWVzICkgOiBmaWx0ZXJlZFNlcVxyXG4gKlxyXG4gKiBcdFx0ZmlsdGVycyAnc2VxJyBlbnRyaWVzIHdpdGggY29ycmVzcG9uZGluZyBlbnRyeSBpbiB2YWx1ZXNcclxuICpcclxuICpcclxuICogTWV0aG9kcyBvZiB0aGUgdG9wLWxldmVsIGNvbnRhaW5lciAodGV4dHVyZXMgZmFjdG9yaXphdGlvbnMpOlxyXG4gKlxyXG4gKiAuc2V0VmFsdWUoIGdsLCBuYW1lLCB2YWx1ZSwgdGV4dHVyZXMgKVxyXG4gKlxyXG4gKiBcdFx0c2V0cyB1bmlmb3JtIHdpdGggIG5hbWUgJ25hbWUnIHRvICd2YWx1ZSdcclxuICpcclxuICogLnNldE9wdGlvbmFsKCBnbCwgb2JqLCBwcm9wIClcclxuICpcclxuICogXHRcdGxpa2UgLnNldCBmb3IgYW4gb3B0aW9uYWwgcHJvcGVydHkgb2YgdGhlIG9iamVjdFxyXG4gKlxyXG4gKi9cclxuXHJcbmltcG9ydCB7IEN1YmVUZXh0dXJlIH0gZnJvbSAnLi4vLi4vdGV4dHVyZXMvQ3ViZVRleHR1cmUuanMnO1xyXG5pbXBvcnQgeyBUZXh0dXJlIH0gZnJvbSAnLi4vLi4vdGV4dHVyZXMvVGV4dHVyZS5qcyc7XHJcbmltcG9ydCB7IERhdGFBcnJheVRleHR1cmUgfSBmcm9tICcuLi8uLi90ZXh0dXJlcy9EYXRhQXJyYXlUZXh0dXJlLmpzJztcclxuaW1wb3J0IHsgRGF0YTNEVGV4dHVyZSB9IGZyb20gJy4uLy4uL3RleHR1cmVzL0RhdGEzRFRleHR1cmUuanMnO1xyXG5pbXBvcnQgeyBEZXB0aFRleHR1cmUgfSBmcm9tICcuLi8uLi90ZXh0dXJlcy9EZXB0aFRleHR1cmUuanMnO1xyXG5pbXBvcnQgeyBMZXNzRXF1YWxDb21wYXJlIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzLmpzJztcclxuXHJcbmNvbnN0IGVtcHR5VGV4dHVyZSA9IC8qQF9fUFVSRV9fKi8gbmV3IFRleHR1cmUoKTtcclxuXHJcbmNvbnN0IGVtcHR5U2hhZG93VGV4dHVyZSA9IC8qQF9fUFVSRV9fKi8gbmV3IERlcHRoVGV4dHVyZSggMSwgMSApO1xyXG5cclxuY29uc3QgZW1wdHlBcnJheVRleHR1cmUgPSAvKkBfX1BVUkVfXyovIG5ldyBEYXRhQXJyYXlUZXh0dXJlKCk7XHJcbmNvbnN0IGVtcHR5M2RUZXh0dXJlID0gLypAX19QVVJFX18qLyBuZXcgRGF0YTNEVGV4dHVyZSgpO1xyXG5jb25zdCBlbXB0eUN1YmVUZXh0dXJlID0gLypAX19QVVJFX18qLyBuZXcgQ3ViZVRleHR1cmUoKTtcclxuXHJcbi8vIC0tLSBVdGlsaXRpZXMgLS0tXHJcblxyXG4vLyBBcnJheSBDYWNoZXMgKHByb3ZpZGUgdHlwZWQgYXJyYXlzIGZvciB0ZW1wb3JhcnkgYnkgc2l6ZSlcclxuXHJcbmNvbnN0IGFycmF5Q2FjaGVGMzIgPSBbXTtcclxuY29uc3QgYXJyYXlDYWNoZUkzMiA9IFtdO1xyXG5cclxuLy8gRmxvYXQzMkFycmF5IGNhY2hlcyB1c2VkIGZvciB1cGxvYWRpbmcgTWF0cml4IHVuaWZvcm1zXHJcblxyXG5jb25zdCBtYXQ0YXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KCAxNiApO1xyXG5jb25zdCBtYXQzYXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KCA5ICk7XHJcbmNvbnN0IG1hdDJhcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoIDQgKTtcclxuXHJcbi8vIEZsYXR0ZW5pbmcgZm9yIGFycmF5cyBvZiB2ZWN0b3JzIGFuZCBtYXRyaWNlc1xyXG5cclxuZnVuY3Rpb24gZmxhdHRlbiggYXJyYXksIG5CbG9ja3MsIGJsb2NrU2l6ZSApIHtcclxuXHJcblx0Y29uc3QgZmlyc3RFbGVtID0gYXJyYXlbIDAgXTtcclxuXHJcblx0aWYgKCBmaXJzdEVsZW0gPD0gMCB8fCBmaXJzdEVsZW0gPiAwICkgcmV0dXJuIGFycmF5O1xyXG5cdC8vIHVub3B0aW1pemVkOiAhIGlzTmFOKCBmaXJzdEVsZW0gKVxyXG5cdC8vIHNlZSBodHRwOi8vamFja3NvbmR1bnN0YW4uY29tL2FydGljbGVzLzk4M1xyXG5cclxuXHRjb25zdCBuID0gbkJsb2NrcyAqIGJsb2NrU2l6ZTtcclxuXHRsZXQgciA9IGFycmF5Q2FjaGVGMzJbIG4gXTtcclxuXHJcblx0aWYgKCByID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0ciA9IG5ldyBGbG9hdDMyQXJyYXkoIG4gKTtcclxuXHRcdGFycmF5Q2FjaGVGMzJbIG4gXSA9IHI7XHJcblxyXG5cdH1cclxuXHJcblx0aWYgKCBuQmxvY2tzICE9PSAwICkge1xyXG5cclxuXHRcdGZpcnN0RWxlbS50b0FycmF5KCByLCAwICk7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAxLCBvZmZzZXQgPSAwOyBpICE9PSBuQmxvY2tzOyArKyBpICkge1xyXG5cclxuXHRcdFx0b2Zmc2V0ICs9IGJsb2NrU2l6ZTtcclxuXHRcdFx0YXJyYXlbIGkgXS50b0FycmF5KCByLCBvZmZzZXQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIHI7XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBhcnJheXNFcXVhbCggYSwgYiApIHtcclxuXHJcblx0aWYgKCBhLmxlbmd0aCAhPT0gYi5sZW5ndGggKSByZXR1cm4gZmFsc2U7XHJcblxyXG5cdGZvciAoIGxldCBpID0gMCwgbCA9IGEubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRpZiAoIGFbIGkgXSAhPT0gYlsgaSBdICkgcmV0dXJuIGZhbHNlO1xyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiB0cnVlO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gY29weUFycmF5KCBhLCBiICkge1xyXG5cclxuXHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBiLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0YVsgaSBdID0gYlsgaSBdO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vLyBUZXh0dXJlIHVuaXQgYWxsb2NhdGlvblxyXG5cclxuZnVuY3Rpb24gYWxsb2NUZXhVbml0cyggdGV4dHVyZXMsIG4gKSB7XHJcblxyXG5cdGxldCByID0gYXJyYXlDYWNoZUkzMlsgbiBdO1xyXG5cclxuXHRpZiAoIHIgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRyID0gbmV3IEludDMyQXJyYXkoIG4gKTtcclxuXHRcdGFycmF5Q2FjaGVJMzJbIG4gXSA9IHI7XHJcblxyXG5cdH1cclxuXHJcblx0Zm9yICggbGV0IGkgPSAwOyBpICE9PSBuOyArKyBpICkge1xyXG5cclxuXHRcdHJbIGkgXSA9IHRleHR1cmVzLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gcjtcclxuXHJcbn1cclxuXHJcbi8vIC0tLSBTZXR0ZXJzIC0tLVxyXG5cclxuLy8gTm90ZTogRGVmaW5pbmcgdGhlc2UgbWV0aG9kcyBleHRlcm5hbGx5LCBiZWNhdXNlIHRoZXkgY29tZSBpbiBhIGJ1bmNoXHJcbi8vIGFuZCB0aGlzIHdheSB0aGVpciBuYW1lcyBtaW5pZnkuXHJcblxyXG4vLyBTaW5nbGUgc2NhbGFyXHJcblxyXG5mdW5jdGlvbiBzZXRWYWx1ZVYxZiggZ2wsIHYgKSB7XHJcblxyXG5cdGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZTtcclxuXHJcblx0aWYgKCBjYWNoZVsgMCBdID09PSB2ICkgcmV0dXJuO1xyXG5cclxuXHRnbC51bmlmb3JtMWYoIHRoaXMuYWRkciwgdiApO1xyXG5cclxuXHRjYWNoZVsgMCBdID0gdjtcclxuXHJcbn1cclxuXHJcbi8vIFNpbmdsZSBmbG9hdCB2ZWN0b3IgKGZyb20gZmxhdCBhcnJheSBvciBUSFJFRS5WZWN0b3JOKVxyXG5cclxuZnVuY3Rpb24gc2V0VmFsdWVWMmYoIGdsLCB2ICkge1xyXG5cclxuXHRjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGU7XHJcblxyXG5cdGlmICggdi54ICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0aWYgKCBjYWNoZVsgMCBdICE9PSB2LnggfHwgY2FjaGVbIDEgXSAhPT0gdi55ICkge1xyXG5cclxuXHRcdFx0Z2wudW5pZm9ybTJmKCB0aGlzLmFkZHIsIHYueCwgdi55ICk7XHJcblxyXG5cdFx0XHRjYWNoZVsgMCBdID0gdi54O1xyXG5cdFx0XHRjYWNoZVsgMSBdID0gdi55O1xyXG5cclxuXHRcdH1cclxuXHJcblx0fSBlbHNlIHtcclxuXHJcblx0XHRpZiAoIGFycmF5c0VxdWFsKCBjYWNoZSwgdiApICkgcmV0dXJuO1xyXG5cclxuXHRcdGdsLnVuaWZvcm0yZnYoIHRoaXMuYWRkciwgdiApO1xyXG5cclxuXHRcdGNvcHlBcnJheSggY2FjaGUsIHYgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gc2V0VmFsdWVWM2YoIGdsLCB2ICkge1xyXG5cclxuXHRjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGU7XHJcblxyXG5cdGlmICggdi54ICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0aWYgKCBjYWNoZVsgMCBdICE9PSB2LnggfHwgY2FjaGVbIDEgXSAhPT0gdi55IHx8IGNhY2hlWyAyIF0gIT09IHYueiApIHtcclxuXHJcblx0XHRcdGdsLnVuaWZvcm0zZiggdGhpcy5hZGRyLCB2LngsIHYueSwgdi56ICk7XHJcblxyXG5cdFx0XHRjYWNoZVsgMCBdID0gdi54O1xyXG5cdFx0XHRjYWNoZVsgMSBdID0gdi55O1xyXG5cdFx0XHRjYWNoZVsgMiBdID0gdi56O1xyXG5cclxuXHRcdH1cclxuXHJcblx0fSBlbHNlIGlmICggdi5yICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0aWYgKCBjYWNoZVsgMCBdICE9PSB2LnIgfHwgY2FjaGVbIDEgXSAhPT0gdi5nIHx8IGNhY2hlWyAyIF0gIT09IHYuYiApIHtcclxuXHJcblx0XHRcdGdsLnVuaWZvcm0zZiggdGhpcy5hZGRyLCB2LnIsIHYuZywgdi5iICk7XHJcblxyXG5cdFx0XHRjYWNoZVsgMCBdID0gdi5yO1xyXG5cdFx0XHRjYWNoZVsgMSBdID0gdi5nO1xyXG5cdFx0XHRjYWNoZVsgMiBdID0gdi5iO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fSBlbHNlIHtcclxuXHJcblx0XHRpZiAoIGFycmF5c0VxdWFsKCBjYWNoZSwgdiApICkgcmV0dXJuO1xyXG5cclxuXHRcdGdsLnVuaWZvcm0zZnYoIHRoaXMuYWRkciwgdiApO1xyXG5cclxuXHRcdGNvcHlBcnJheSggY2FjaGUsIHYgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gc2V0VmFsdWVWNGYoIGdsLCB2ICkge1xyXG5cclxuXHRjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGU7XHJcblxyXG5cdGlmICggdi54ICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0aWYgKCBjYWNoZVsgMCBdICE9PSB2LnggfHwgY2FjaGVbIDEgXSAhPT0gdi55IHx8IGNhY2hlWyAyIF0gIT09IHYueiB8fCBjYWNoZVsgMyBdICE9PSB2LncgKSB7XHJcblxyXG5cdFx0XHRnbC51bmlmb3JtNGYoIHRoaXMuYWRkciwgdi54LCB2LnksIHYueiwgdi53ICk7XHJcblxyXG5cdFx0XHRjYWNoZVsgMCBdID0gdi54O1xyXG5cdFx0XHRjYWNoZVsgMSBdID0gdi55O1xyXG5cdFx0XHRjYWNoZVsgMiBdID0gdi56O1xyXG5cdFx0XHRjYWNoZVsgMyBdID0gdi53O1xyXG5cclxuXHRcdH1cclxuXHJcblx0fSBlbHNlIHtcclxuXHJcblx0XHRpZiAoIGFycmF5c0VxdWFsKCBjYWNoZSwgdiApICkgcmV0dXJuO1xyXG5cclxuXHRcdGdsLnVuaWZvcm00ZnYoIHRoaXMuYWRkciwgdiApO1xyXG5cclxuXHRcdGNvcHlBcnJheSggY2FjaGUsIHYgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLy8gU2luZ2xlIG1hdHJpeCAoZnJvbSBmbGF0IGFycmF5IG9yIFRIUkVFLk1hdHJpeE4pXHJcblxyXG5mdW5jdGlvbiBzZXRWYWx1ZU0yKCBnbCwgdiApIHtcclxuXHJcblx0Y29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlO1xyXG5cdGNvbnN0IGVsZW1lbnRzID0gdi5lbGVtZW50cztcclxuXHJcblx0aWYgKCBlbGVtZW50cyA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdGlmICggYXJyYXlzRXF1YWwoIGNhY2hlLCB2ICkgKSByZXR1cm47XHJcblxyXG5cdFx0Z2wudW5pZm9ybU1hdHJpeDJmdiggdGhpcy5hZGRyLCBmYWxzZSwgdiApO1xyXG5cclxuXHRcdGNvcHlBcnJheSggY2FjaGUsIHYgKTtcclxuXHJcblx0fSBlbHNlIHtcclxuXHJcblx0XHRpZiAoIGFycmF5c0VxdWFsKCBjYWNoZSwgZWxlbWVudHMgKSApIHJldHVybjtcclxuXHJcblx0XHRtYXQyYXJyYXkuc2V0KCBlbGVtZW50cyApO1xyXG5cclxuXHRcdGdsLnVuaWZvcm1NYXRyaXgyZnYoIHRoaXMuYWRkciwgZmFsc2UsIG1hdDJhcnJheSApO1xyXG5cclxuXHRcdGNvcHlBcnJheSggY2FjaGUsIGVsZW1lbnRzICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNldFZhbHVlTTMoIGdsLCB2ICkge1xyXG5cclxuXHRjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGU7XHJcblx0Y29uc3QgZWxlbWVudHMgPSB2LmVsZW1lbnRzO1xyXG5cclxuXHRpZiAoIGVsZW1lbnRzID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0aWYgKCBhcnJheXNFcXVhbCggY2FjaGUsIHYgKSApIHJldHVybjtcclxuXHJcblx0XHRnbC51bmlmb3JtTWF0cml4M2Z2KCB0aGlzLmFkZHIsIGZhbHNlLCB2ICk7XHJcblxyXG5cdFx0Y29weUFycmF5KCBjYWNoZSwgdiApO1xyXG5cclxuXHR9IGVsc2Uge1xyXG5cclxuXHRcdGlmICggYXJyYXlzRXF1YWwoIGNhY2hlLCBlbGVtZW50cyApICkgcmV0dXJuO1xyXG5cclxuXHRcdG1hdDNhcnJheS5zZXQoIGVsZW1lbnRzICk7XHJcblxyXG5cdFx0Z2wudW5pZm9ybU1hdHJpeDNmdiggdGhpcy5hZGRyLCBmYWxzZSwgbWF0M2FycmF5ICk7XHJcblxyXG5cdFx0Y29weUFycmF5KCBjYWNoZSwgZWxlbWVudHMgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gc2V0VmFsdWVNNCggZ2wsIHYgKSB7XHJcblxyXG5cdGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZTtcclxuXHRjb25zdCBlbGVtZW50cyA9IHYuZWxlbWVudHM7XHJcblxyXG5cdGlmICggZWxlbWVudHMgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRpZiAoIGFycmF5c0VxdWFsKCBjYWNoZSwgdiApICkgcmV0dXJuO1xyXG5cclxuXHRcdGdsLnVuaWZvcm1NYXRyaXg0ZnYoIHRoaXMuYWRkciwgZmFsc2UsIHYgKTtcclxuXHJcblx0XHRjb3B5QXJyYXkoIGNhY2hlLCB2ICk7XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0aWYgKCBhcnJheXNFcXVhbCggY2FjaGUsIGVsZW1lbnRzICkgKSByZXR1cm47XHJcblxyXG5cdFx0bWF0NGFycmF5LnNldCggZWxlbWVudHMgKTtcclxuXHJcblx0XHRnbC51bmlmb3JtTWF0cml4NGZ2KCB0aGlzLmFkZHIsIGZhbHNlLCBtYXQ0YXJyYXkgKTtcclxuXHJcblx0XHRjb3B5QXJyYXkoIGNhY2hlLCBlbGVtZW50cyApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vLyBTaW5nbGUgaW50ZWdlciAvIGJvb2xlYW5cclxuXHJcbmZ1bmN0aW9uIHNldFZhbHVlVjFpKCBnbCwgdiApIHtcclxuXHJcblx0Y29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlO1xyXG5cclxuXHRpZiAoIGNhY2hlWyAwIF0gPT09IHYgKSByZXR1cm47XHJcblxyXG5cdGdsLnVuaWZvcm0xaSggdGhpcy5hZGRyLCB2ICk7XHJcblxyXG5cdGNhY2hlWyAwIF0gPSB2O1xyXG5cclxufVxyXG5cclxuLy8gU2luZ2xlIGludGVnZXIgLyBib29sZWFuIHZlY3RvciAoZnJvbSBmbGF0IGFycmF5IG9yIFRIUkVFLlZlY3Rvck4pXHJcblxyXG5mdW5jdGlvbiBzZXRWYWx1ZVYyaSggZ2wsIHYgKSB7XHJcblxyXG5cdGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZTtcclxuXHJcblx0aWYgKCB2LnggIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRpZiAoIGNhY2hlWyAwIF0gIT09IHYueCB8fCBjYWNoZVsgMSBdICE9PSB2LnkgKSB7XHJcblxyXG5cdFx0XHRnbC51bmlmb3JtMmkoIHRoaXMuYWRkciwgdi54LCB2LnkgKTtcclxuXHJcblx0XHRcdGNhY2hlWyAwIF0gPSB2Lng7XHJcblx0XHRcdGNhY2hlWyAxIF0gPSB2Lnk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9IGVsc2Uge1xyXG5cclxuXHRcdGlmICggYXJyYXlzRXF1YWwoIGNhY2hlLCB2ICkgKSByZXR1cm47XHJcblxyXG5cdFx0Z2wudW5pZm9ybTJpdiggdGhpcy5hZGRyLCB2ICk7XHJcblxyXG5cdFx0Y29weUFycmF5KCBjYWNoZSwgdiApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBzZXRWYWx1ZVYzaSggZ2wsIHYgKSB7XHJcblxyXG5cdGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZTtcclxuXHJcblx0aWYgKCB2LnggIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRpZiAoIGNhY2hlWyAwIF0gIT09IHYueCB8fCBjYWNoZVsgMSBdICE9PSB2LnkgfHwgY2FjaGVbIDIgXSAhPT0gdi56ICkge1xyXG5cclxuXHRcdFx0Z2wudW5pZm9ybTNpKCB0aGlzLmFkZHIsIHYueCwgdi55LCB2LnogKTtcclxuXHJcblx0XHRcdGNhY2hlWyAwIF0gPSB2Lng7XHJcblx0XHRcdGNhY2hlWyAxIF0gPSB2Lnk7XHJcblx0XHRcdGNhY2hlWyAyIF0gPSB2Lno7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9IGVsc2Uge1xyXG5cclxuXHRcdGlmICggYXJyYXlzRXF1YWwoIGNhY2hlLCB2ICkgKSByZXR1cm47XHJcblxyXG5cdFx0Z2wudW5pZm9ybTNpdiggdGhpcy5hZGRyLCB2ICk7XHJcblxyXG5cdFx0Y29weUFycmF5KCBjYWNoZSwgdiApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBzZXRWYWx1ZVY0aSggZ2wsIHYgKSB7XHJcblxyXG5cdGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZTtcclxuXHJcblx0aWYgKCB2LnggIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRpZiAoIGNhY2hlWyAwIF0gIT09IHYueCB8fCBjYWNoZVsgMSBdICE9PSB2LnkgfHwgY2FjaGVbIDIgXSAhPT0gdi56IHx8IGNhY2hlWyAzIF0gIT09IHYudyApIHtcclxuXHJcblx0XHRcdGdsLnVuaWZvcm00aSggdGhpcy5hZGRyLCB2LngsIHYueSwgdi56LCB2LncgKTtcclxuXHJcblx0XHRcdGNhY2hlWyAwIF0gPSB2Lng7XHJcblx0XHRcdGNhY2hlWyAxIF0gPSB2Lnk7XHJcblx0XHRcdGNhY2hlWyAyIF0gPSB2Lno7XHJcblx0XHRcdGNhY2hlWyAzIF0gPSB2Lnc7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9IGVsc2Uge1xyXG5cclxuXHRcdGlmICggYXJyYXlzRXF1YWwoIGNhY2hlLCB2ICkgKSByZXR1cm47XHJcblxyXG5cdFx0Z2wudW5pZm9ybTRpdiggdGhpcy5hZGRyLCB2ICk7XHJcblxyXG5cdFx0Y29weUFycmF5KCBjYWNoZSwgdiApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vLyBTaW5nbGUgdW5zaWduZWQgaW50ZWdlclxyXG5cclxuZnVuY3Rpb24gc2V0VmFsdWVWMXVpKCBnbCwgdiApIHtcclxuXHJcblx0Y29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlO1xyXG5cclxuXHRpZiAoIGNhY2hlWyAwIF0gPT09IHYgKSByZXR1cm47XHJcblxyXG5cdGdsLnVuaWZvcm0xdWkoIHRoaXMuYWRkciwgdiApO1xyXG5cclxuXHRjYWNoZVsgMCBdID0gdjtcclxuXHJcbn1cclxuXHJcbi8vIFNpbmdsZSB1bnNpZ25lZCBpbnRlZ2VyIHZlY3RvciAoZnJvbSBmbGF0IGFycmF5IG9yIFRIUkVFLlZlY3Rvck4pXHJcblxyXG5mdW5jdGlvbiBzZXRWYWx1ZVYydWkoIGdsLCB2ICkge1xyXG5cclxuXHRjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGU7XHJcblxyXG5cdGlmICggdi54ICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0aWYgKCBjYWNoZVsgMCBdICE9PSB2LnggfHwgY2FjaGVbIDEgXSAhPT0gdi55ICkge1xyXG5cclxuXHRcdFx0Z2wudW5pZm9ybTJ1aSggdGhpcy5hZGRyLCB2LngsIHYueSApO1xyXG5cclxuXHRcdFx0Y2FjaGVbIDAgXSA9IHYueDtcclxuXHRcdFx0Y2FjaGVbIDEgXSA9IHYueTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0aWYgKCBhcnJheXNFcXVhbCggY2FjaGUsIHYgKSApIHJldHVybjtcclxuXHJcblx0XHRnbC51bmlmb3JtMnVpdiggdGhpcy5hZGRyLCB2ICk7XHJcblxyXG5cdFx0Y29weUFycmF5KCBjYWNoZSwgdiApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBzZXRWYWx1ZVYzdWkoIGdsLCB2ICkge1xyXG5cclxuXHRjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGU7XHJcblxyXG5cdGlmICggdi54ICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0aWYgKCBjYWNoZVsgMCBdICE9PSB2LnggfHwgY2FjaGVbIDEgXSAhPT0gdi55IHx8IGNhY2hlWyAyIF0gIT09IHYueiApIHtcclxuXHJcblx0XHRcdGdsLnVuaWZvcm0zdWkoIHRoaXMuYWRkciwgdi54LCB2LnksIHYueiApO1xyXG5cclxuXHRcdFx0Y2FjaGVbIDAgXSA9IHYueDtcclxuXHRcdFx0Y2FjaGVbIDEgXSA9IHYueTtcclxuXHRcdFx0Y2FjaGVbIDIgXSA9IHYuejtcclxuXHJcblx0XHR9XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0aWYgKCBhcnJheXNFcXVhbCggY2FjaGUsIHYgKSApIHJldHVybjtcclxuXHJcblx0XHRnbC51bmlmb3JtM3VpdiggdGhpcy5hZGRyLCB2ICk7XHJcblxyXG5cdFx0Y29weUFycmF5KCBjYWNoZSwgdiApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBzZXRWYWx1ZVY0dWkoIGdsLCB2ICkge1xyXG5cclxuXHRjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGU7XHJcblxyXG5cdGlmICggdi54ICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0aWYgKCBjYWNoZVsgMCBdICE9PSB2LnggfHwgY2FjaGVbIDEgXSAhPT0gdi55IHx8IGNhY2hlWyAyIF0gIT09IHYueiB8fCBjYWNoZVsgMyBdICE9PSB2LncgKSB7XHJcblxyXG5cdFx0XHRnbC51bmlmb3JtNHVpKCB0aGlzLmFkZHIsIHYueCwgdi55LCB2LnosIHYudyApO1xyXG5cclxuXHRcdFx0Y2FjaGVbIDAgXSA9IHYueDtcclxuXHRcdFx0Y2FjaGVbIDEgXSA9IHYueTtcclxuXHRcdFx0Y2FjaGVbIDIgXSA9IHYuejtcclxuXHRcdFx0Y2FjaGVbIDMgXSA9IHYudztcclxuXHJcblx0XHR9XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0aWYgKCBhcnJheXNFcXVhbCggY2FjaGUsIHYgKSApIHJldHVybjtcclxuXHJcblx0XHRnbC51bmlmb3JtNHVpdiggdGhpcy5hZGRyLCB2ICk7XHJcblxyXG5cdFx0Y29weUFycmF5KCBjYWNoZSwgdiApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5cclxuLy8gU2luZ2xlIHRleHR1cmUgKDJEIC8gQ3ViZSlcclxuXHJcbmZ1bmN0aW9uIHNldFZhbHVlVDEoIGdsLCB2LCB0ZXh0dXJlcyApIHtcclxuXHJcblx0Y29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlO1xyXG5cdGNvbnN0IHVuaXQgPSB0ZXh0dXJlcy5hbGxvY2F0ZVRleHR1cmVVbml0KCk7XHJcblxyXG5cdGlmICggY2FjaGVbIDAgXSAhPT0gdW5pdCApIHtcclxuXHJcblx0XHRnbC51bmlmb3JtMWkoIHRoaXMuYWRkciwgdW5pdCApO1xyXG5cdFx0Y2FjaGVbIDAgXSA9IHVuaXQ7XHJcblxyXG5cdH1cclxuXHJcblx0bGV0IGVtcHR5VGV4dHVyZTJEO1xyXG5cclxuXHRpZiAoIHRoaXMudHlwZSA9PT0gZ2wuU0FNUExFUl8yRF9TSEFET1cgKSB7XHJcblxyXG5cdFx0ZW1wdHlTaGFkb3dUZXh0dXJlLmNvbXBhcmVGdW5jdGlvbiA9IExlc3NFcXVhbENvbXBhcmU7IC8vICMyODY3MFxyXG5cdFx0ZW1wdHlUZXh0dXJlMkQgPSBlbXB0eVNoYWRvd1RleHR1cmU7XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0ZW1wdHlUZXh0dXJlMkQgPSBlbXB0eVRleHR1cmU7XHJcblxyXG5cdH1cclxuXHJcblx0dGV4dHVyZXMuc2V0VGV4dHVyZTJEKCB2IHx8IGVtcHR5VGV4dHVyZTJELCB1bml0ICk7XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBzZXRWYWx1ZVQzRDEoIGdsLCB2LCB0ZXh0dXJlcyApIHtcclxuXHJcblx0Y29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlO1xyXG5cdGNvbnN0IHVuaXQgPSB0ZXh0dXJlcy5hbGxvY2F0ZVRleHR1cmVVbml0KCk7XHJcblxyXG5cdGlmICggY2FjaGVbIDAgXSAhPT0gdW5pdCApIHtcclxuXHJcblx0XHRnbC51bmlmb3JtMWkoIHRoaXMuYWRkciwgdW5pdCApO1xyXG5cdFx0Y2FjaGVbIDAgXSA9IHVuaXQ7XHJcblxyXG5cdH1cclxuXHJcblx0dGV4dHVyZXMuc2V0VGV4dHVyZTNEKCB2IHx8IGVtcHR5M2RUZXh0dXJlLCB1bml0ICk7XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBzZXRWYWx1ZVQ2KCBnbCwgdiwgdGV4dHVyZXMgKSB7XHJcblxyXG5cdGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZTtcclxuXHRjb25zdCB1bml0ID0gdGV4dHVyZXMuYWxsb2NhdGVUZXh0dXJlVW5pdCgpO1xyXG5cclxuXHRpZiAoIGNhY2hlWyAwIF0gIT09IHVuaXQgKSB7XHJcblxyXG5cdFx0Z2wudW5pZm9ybTFpKCB0aGlzLmFkZHIsIHVuaXQgKTtcclxuXHRcdGNhY2hlWyAwIF0gPSB1bml0O1xyXG5cclxuXHR9XHJcblxyXG5cdHRleHR1cmVzLnNldFRleHR1cmVDdWJlKCB2IHx8IGVtcHR5Q3ViZVRleHR1cmUsIHVuaXQgKTtcclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNldFZhbHVlVDJEQXJyYXkxKCBnbCwgdiwgdGV4dHVyZXMgKSB7XHJcblxyXG5cdGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZTtcclxuXHRjb25zdCB1bml0ID0gdGV4dHVyZXMuYWxsb2NhdGVUZXh0dXJlVW5pdCgpO1xyXG5cclxuXHRpZiAoIGNhY2hlWyAwIF0gIT09IHVuaXQgKSB7XHJcblxyXG5cdFx0Z2wudW5pZm9ybTFpKCB0aGlzLmFkZHIsIHVuaXQgKTtcclxuXHRcdGNhY2hlWyAwIF0gPSB1bml0O1xyXG5cclxuXHR9XHJcblxyXG5cdHRleHR1cmVzLnNldFRleHR1cmUyREFycmF5KCB2IHx8IGVtcHR5QXJyYXlUZXh0dXJlLCB1bml0ICk7XHJcblxyXG59XHJcblxyXG4vLyBIZWxwZXIgdG8gcGljayB0aGUgcmlnaHQgc2V0dGVyIGZvciB0aGUgc2luZ3VsYXIgY2FzZVxyXG5cclxuZnVuY3Rpb24gZ2V0U2luZ3VsYXJTZXR0ZXIoIHR5cGUgKSB7XHJcblxyXG5cdHN3aXRjaCAoIHR5cGUgKSB7XHJcblxyXG5cdFx0Y2FzZSAweDE0MDY6IHJldHVybiBzZXRWYWx1ZVYxZjsgLy8gRkxPQVRcclxuXHRcdGNhc2UgMHg4YjUwOiByZXR1cm4gc2V0VmFsdWVWMmY7IC8vIF9WRUMyXHJcblx0XHRjYXNlIDB4OGI1MTogcmV0dXJuIHNldFZhbHVlVjNmOyAvLyBfVkVDM1xyXG5cdFx0Y2FzZSAweDhiNTI6IHJldHVybiBzZXRWYWx1ZVY0ZjsgLy8gX1ZFQzRcclxuXHJcblx0XHRjYXNlIDB4OGI1YTogcmV0dXJuIHNldFZhbHVlTTI7IC8vIF9NQVQyXHJcblx0XHRjYXNlIDB4OGI1YjogcmV0dXJuIHNldFZhbHVlTTM7IC8vIF9NQVQzXHJcblx0XHRjYXNlIDB4OGI1YzogcmV0dXJuIHNldFZhbHVlTTQ7IC8vIF9NQVQ0XHJcblxyXG5cdFx0Y2FzZSAweDE0MDQ6IGNhc2UgMHg4YjU2OiByZXR1cm4gc2V0VmFsdWVWMWk7IC8vIElOVCwgQk9PTFxyXG5cdFx0Y2FzZSAweDhiNTM6IGNhc2UgMHg4YjU3OiByZXR1cm4gc2V0VmFsdWVWMmk7IC8vIF9WRUMyXHJcblx0XHRjYXNlIDB4OGI1NDogY2FzZSAweDhiNTg6IHJldHVybiBzZXRWYWx1ZVYzaTsgLy8gX1ZFQzNcclxuXHRcdGNhc2UgMHg4YjU1OiBjYXNlIDB4OGI1OTogcmV0dXJuIHNldFZhbHVlVjRpOyAvLyBfVkVDNFxyXG5cclxuXHRcdGNhc2UgMHgxNDA1OiByZXR1cm4gc2V0VmFsdWVWMXVpOyAvLyBVSU5UXHJcblx0XHRjYXNlIDB4OGRjNjogcmV0dXJuIHNldFZhbHVlVjJ1aTsgLy8gX1ZFQzJcclxuXHRcdGNhc2UgMHg4ZGM3OiByZXR1cm4gc2V0VmFsdWVWM3VpOyAvLyBfVkVDM1xyXG5cdFx0Y2FzZSAweDhkYzg6IHJldHVybiBzZXRWYWx1ZVY0dWk7IC8vIF9WRUM0XHJcblxyXG5cdFx0Y2FzZSAweDhiNWU6IC8vIFNBTVBMRVJfMkRcclxuXHRcdGNhc2UgMHg4ZDY2OiAvLyBTQU1QTEVSX0VYVEVSTkFMX09FU1xyXG5cdFx0Y2FzZSAweDhkY2E6IC8vIElOVF9TQU1QTEVSXzJEXHJcblx0XHRjYXNlIDB4OGRkMjogLy8gVU5TSUdORURfSU5UX1NBTVBMRVJfMkRcclxuXHRcdGNhc2UgMHg4YjYyOiAvLyBTQU1QTEVSXzJEX1NIQURPV1xyXG5cdFx0XHRyZXR1cm4gc2V0VmFsdWVUMTtcclxuXHJcblx0XHRjYXNlIDB4OGI1ZjogLy8gU0FNUExFUl8zRFxyXG5cdFx0Y2FzZSAweDhkY2I6IC8vIElOVF9TQU1QTEVSXzNEXHJcblx0XHRjYXNlIDB4OGRkMzogLy8gVU5TSUdORURfSU5UX1NBTVBMRVJfM0RcclxuXHRcdFx0cmV0dXJuIHNldFZhbHVlVDNEMTtcclxuXHJcblx0XHRjYXNlIDB4OGI2MDogLy8gU0FNUExFUl9DVUJFXHJcblx0XHRjYXNlIDB4OGRjYzogLy8gSU5UX1NBTVBMRVJfQ1VCRVxyXG5cdFx0Y2FzZSAweDhkZDQ6IC8vIFVOU0lHTkVEX0lOVF9TQU1QTEVSX0NVQkVcclxuXHRcdGNhc2UgMHg4ZGM1OiAvLyBTQU1QTEVSX0NVQkVfU0hBRE9XXHJcblx0XHRcdHJldHVybiBzZXRWYWx1ZVQ2O1xyXG5cclxuXHRcdGNhc2UgMHg4ZGMxOiAvLyBTQU1QTEVSXzJEX0FSUkFZXHJcblx0XHRjYXNlIDB4OGRjZjogLy8gSU5UX1NBTVBMRVJfMkRfQVJSQVlcclxuXHRcdGNhc2UgMHg4ZGQ3OiAvLyBVTlNJR05FRF9JTlRfU0FNUExFUl8yRF9BUlJBWVxyXG5cdFx0Y2FzZSAweDhkYzQ6IC8vIFNBTVBMRVJfMkRfQVJSQVlfU0hBRE9XXHJcblx0XHRcdHJldHVybiBzZXRWYWx1ZVQyREFycmF5MTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbi8vIEFycmF5IG9mIHNjYWxhcnNcclxuXHJcbmZ1bmN0aW9uIHNldFZhbHVlVjFmQXJyYXkoIGdsLCB2ICkge1xyXG5cclxuXHRnbC51bmlmb3JtMWZ2KCB0aGlzLmFkZHIsIHYgKTtcclxuXHJcbn1cclxuXHJcbi8vIEFycmF5IG9mIHZlY3RvcnMgKGZyb20gZmxhdCBhcnJheSBvciBhcnJheSBvZiBUSFJFRS5WZWN0b3JOKVxyXG5cclxuZnVuY3Rpb24gc2V0VmFsdWVWMmZBcnJheSggZ2wsIHYgKSB7XHJcblxyXG5cdGNvbnN0IGRhdGEgPSBmbGF0dGVuKCB2LCB0aGlzLnNpemUsIDIgKTtcclxuXHJcblx0Z2wudW5pZm9ybTJmdiggdGhpcy5hZGRyLCBkYXRhICk7XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBzZXRWYWx1ZVYzZkFycmF5KCBnbCwgdiApIHtcclxuXHJcblx0Y29uc3QgZGF0YSA9IGZsYXR0ZW4oIHYsIHRoaXMuc2l6ZSwgMyApO1xyXG5cclxuXHRnbC51bmlmb3JtM2Z2KCB0aGlzLmFkZHIsIGRhdGEgKTtcclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNldFZhbHVlVjRmQXJyYXkoIGdsLCB2ICkge1xyXG5cclxuXHRjb25zdCBkYXRhID0gZmxhdHRlbiggdiwgdGhpcy5zaXplLCA0ICk7XHJcblxyXG5cdGdsLnVuaWZvcm00ZnYoIHRoaXMuYWRkciwgZGF0YSApO1xyXG5cclxufVxyXG5cclxuLy8gQXJyYXkgb2YgbWF0cmljZXMgKGZyb20gZmxhdCBhcnJheSBvciBhcnJheSBvZiBUSFJFRS5NYXRyaXhOKVxyXG5cclxuZnVuY3Rpb24gc2V0VmFsdWVNMkFycmF5KCBnbCwgdiApIHtcclxuXHJcblx0Y29uc3QgZGF0YSA9IGZsYXR0ZW4oIHYsIHRoaXMuc2l6ZSwgNCApO1xyXG5cclxuXHRnbC51bmlmb3JtTWF0cml4MmZ2KCB0aGlzLmFkZHIsIGZhbHNlLCBkYXRhICk7XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBzZXRWYWx1ZU0zQXJyYXkoIGdsLCB2ICkge1xyXG5cclxuXHRjb25zdCBkYXRhID0gZmxhdHRlbiggdiwgdGhpcy5zaXplLCA5ICk7XHJcblxyXG5cdGdsLnVuaWZvcm1NYXRyaXgzZnYoIHRoaXMuYWRkciwgZmFsc2UsIGRhdGEgKTtcclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNldFZhbHVlTTRBcnJheSggZ2wsIHYgKSB7XHJcblxyXG5cdGNvbnN0IGRhdGEgPSBmbGF0dGVuKCB2LCB0aGlzLnNpemUsIDE2ICk7XHJcblxyXG5cdGdsLnVuaWZvcm1NYXRyaXg0ZnYoIHRoaXMuYWRkciwgZmFsc2UsIGRhdGEgKTtcclxuXHJcbn1cclxuXHJcbi8vIEFycmF5IG9mIGludGVnZXIgLyBib29sZWFuXHJcblxyXG5mdW5jdGlvbiBzZXRWYWx1ZVYxaUFycmF5KCBnbCwgdiApIHtcclxuXHJcblx0Z2wudW5pZm9ybTFpdiggdGhpcy5hZGRyLCB2ICk7XHJcblxyXG59XHJcblxyXG4vLyBBcnJheSBvZiBpbnRlZ2VyIC8gYm9vbGVhbiB2ZWN0b3JzIChmcm9tIGZsYXQgYXJyYXkpXHJcblxyXG5mdW5jdGlvbiBzZXRWYWx1ZVYyaUFycmF5KCBnbCwgdiApIHtcclxuXHJcblx0Z2wudW5pZm9ybTJpdiggdGhpcy5hZGRyLCB2ICk7XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBzZXRWYWx1ZVYzaUFycmF5KCBnbCwgdiApIHtcclxuXHJcblx0Z2wudW5pZm9ybTNpdiggdGhpcy5hZGRyLCB2ICk7XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBzZXRWYWx1ZVY0aUFycmF5KCBnbCwgdiApIHtcclxuXHJcblx0Z2wudW5pZm9ybTRpdiggdGhpcy5hZGRyLCB2ICk7XHJcblxyXG59XHJcblxyXG4vLyBBcnJheSBvZiB1bnNpZ25lZCBpbnRlZ2VyXHJcblxyXG5mdW5jdGlvbiBzZXRWYWx1ZVYxdWlBcnJheSggZ2wsIHYgKSB7XHJcblxyXG5cdGdsLnVuaWZvcm0xdWl2KCB0aGlzLmFkZHIsIHYgKTtcclxuXHJcbn1cclxuXHJcbi8vIEFycmF5IG9mIHVuc2lnbmVkIGludGVnZXIgdmVjdG9ycyAoZnJvbSBmbGF0IGFycmF5KVxyXG5cclxuZnVuY3Rpb24gc2V0VmFsdWVWMnVpQXJyYXkoIGdsLCB2ICkge1xyXG5cclxuXHRnbC51bmlmb3JtMnVpdiggdGhpcy5hZGRyLCB2ICk7XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBzZXRWYWx1ZVYzdWlBcnJheSggZ2wsIHYgKSB7XHJcblxyXG5cdGdsLnVuaWZvcm0zdWl2KCB0aGlzLmFkZHIsIHYgKTtcclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNldFZhbHVlVjR1aUFycmF5KCBnbCwgdiApIHtcclxuXHJcblx0Z2wudW5pZm9ybTR1aXYoIHRoaXMuYWRkciwgdiApO1xyXG5cclxufVxyXG5cclxuXHJcbi8vIEFycmF5IG9mIHRleHR1cmVzICgyRCAvIDNEIC8gQ3ViZSAvIDJEQXJyYXkpXHJcblxyXG5mdW5jdGlvbiBzZXRWYWx1ZVQxQXJyYXkoIGdsLCB2LCB0ZXh0dXJlcyApIHtcclxuXHJcblx0Y29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlO1xyXG5cclxuXHRjb25zdCBuID0gdi5sZW5ndGg7XHJcblxyXG5cdGNvbnN0IHVuaXRzID0gYWxsb2NUZXhVbml0cyggdGV4dHVyZXMsIG4gKTtcclxuXHJcblx0aWYgKCAhIGFycmF5c0VxdWFsKCBjYWNoZSwgdW5pdHMgKSApIHtcclxuXHJcblx0XHRnbC51bmlmb3JtMWl2KCB0aGlzLmFkZHIsIHVuaXRzICk7XHJcblxyXG5cdFx0Y29weUFycmF5KCBjYWNoZSwgdW5pdHMgKTtcclxuXHJcblx0fVxyXG5cclxuXHRmb3IgKCBsZXQgaSA9IDA7IGkgIT09IG47ICsrIGkgKSB7XHJcblxyXG5cdFx0dGV4dHVyZXMuc2V0VGV4dHVyZTJEKCB2WyBpIF0gfHwgZW1wdHlUZXh0dXJlLCB1bml0c1sgaSBdICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNldFZhbHVlVDNEQXJyYXkoIGdsLCB2LCB0ZXh0dXJlcyApIHtcclxuXHJcblx0Y29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlO1xyXG5cclxuXHRjb25zdCBuID0gdi5sZW5ndGg7XHJcblxyXG5cdGNvbnN0IHVuaXRzID0gYWxsb2NUZXhVbml0cyggdGV4dHVyZXMsIG4gKTtcclxuXHJcblx0aWYgKCAhIGFycmF5c0VxdWFsKCBjYWNoZSwgdW5pdHMgKSApIHtcclxuXHJcblx0XHRnbC51bmlmb3JtMWl2KCB0aGlzLmFkZHIsIHVuaXRzICk7XHJcblxyXG5cdFx0Y29weUFycmF5KCBjYWNoZSwgdW5pdHMgKTtcclxuXHJcblx0fVxyXG5cclxuXHRmb3IgKCBsZXQgaSA9IDA7IGkgIT09IG47ICsrIGkgKSB7XHJcblxyXG5cdFx0dGV4dHVyZXMuc2V0VGV4dHVyZTNEKCB2WyBpIF0gfHwgZW1wdHkzZFRleHR1cmUsIHVuaXRzWyBpIF0gKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gc2V0VmFsdWVUNkFycmF5KCBnbCwgdiwgdGV4dHVyZXMgKSB7XHJcblxyXG5cdGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZTtcclxuXHJcblx0Y29uc3QgbiA9IHYubGVuZ3RoO1xyXG5cclxuXHRjb25zdCB1bml0cyA9IGFsbG9jVGV4VW5pdHMoIHRleHR1cmVzLCBuICk7XHJcblxyXG5cdGlmICggISBhcnJheXNFcXVhbCggY2FjaGUsIHVuaXRzICkgKSB7XHJcblxyXG5cdFx0Z2wudW5pZm9ybTFpdiggdGhpcy5hZGRyLCB1bml0cyApO1xyXG5cclxuXHRcdGNvcHlBcnJheSggY2FjaGUsIHVuaXRzICk7XHJcblxyXG5cdH1cclxuXHJcblx0Zm9yICggbGV0IGkgPSAwOyBpICE9PSBuOyArKyBpICkge1xyXG5cclxuXHRcdHRleHR1cmVzLnNldFRleHR1cmVDdWJlKCB2WyBpIF0gfHwgZW1wdHlDdWJlVGV4dHVyZSwgdW5pdHNbIGkgXSApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBzZXRWYWx1ZVQyREFycmF5QXJyYXkoIGdsLCB2LCB0ZXh0dXJlcyApIHtcclxuXHJcblx0Y29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlO1xyXG5cclxuXHRjb25zdCBuID0gdi5sZW5ndGg7XHJcblxyXG5cdGNvbnN0IHVuaXRzID0gYWxsb2NUZXhVbml0cyggdGV4dHVyZXMsIG4gKTtcclxuXHJcblx0aWYgKCAhIGFycmF5c0VxdWFsKCBjYWNoZSwgdW5pdHMgKSApIHtcclxuXHJcblx0XHRnbC51bmlmb3JtMWl2KCB0aGlzLmFkZHIsIHVuaXRzICk7XHJcblxyXG5cdFx0Y29weUFycmF5KCBjYWNoZSwgdW5pdHMgKTtcclxuXHJcblx0fVxyXG5cclxuXHRmb3IgKCBsZXQgaSA9IDA7IGkgIT09IG47ICsrIGkgKSB7XHJcblxyXG5cdFx0dGV4dHVyZXMuc2V0VGV4dHVyZTJEQXJyYXkoIHZbIGkgXSB8fCBlbXB0eUFycmF5VGV4dHVyZSwgdW5pdHNbIGkgXSApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5cclxuLy8gSGVscGVyIHRvIHBpY2sgdGhlIHJpZ2h0IHNldHRlciBmb3IgYSBwdXJlIChib3R0b20tbGV2ZWwpIGFycmF5XHJcblxyXG5mdW5jdGlvbiBnZXRQdXJlQXJyYXlTZXR0ZXIoIHR5cGUgKSB7XHJcblxyXG5cdHN3aXRjaCAoIHR5cGUgKSB7XHJcblxyXG5cdFx0Y2FzZSAweDE0MDY6IHJldHVybiBzZXRWYWx1ZVYxZkFycmF5OyAvLyBGTE9BVFxyXG5cdFx0Y2FzZSAweDhiNTA6IHJldHVybiBzZXRWYWx1ZVYyZkFycmF5OyAvLyBfVkVDMlxyXG5cdFx0Y2FzZSAweDhiNTE6IHJldHVybiBzZXRWYWx1ZVYzZkFycmF5OyAvLyBfVkVDM1xyXG5cdFx0Y2FzZSAweDhiNTI6IHJldHVybiBzZXRWYWx1ZVY0ZkFycmF5OyAvLyBfVkVDNFxyXG5cclxuXHRcdGNhc2UgMHg4YjVhOiByZXR1cm4gc2V0VmFsdWVNMkFycmF5OyAvLyBfTUFUMlxyXG5cdFx0Y2FzZSAweDhiNWI6IHJldHVybiBzZXRWYWx1ZU0zQXJyYXk7IC8vIF9NQVQzXHJcblx0XHRjYXNlIDB4OGI1YzogcmV0dXJuIHNldFZhbHVlTTRBcnJheTsgLy8gX01BVDRcclxuXHJcblx0XHRjYXNlIDB4MTQwNDogY2FzZSAweDhiNTY6IHJldHVybiBzZXRWYWx1ZVYxaUFycmF5OyAvLyBJTlQsIEJPT0xcclxuXHRcdGNhc2UgMHg4YjUzOiBjYXNlIDB4OGI1NzogcmV0dXJuIHNldFZhbHVlVjJpQXJyYXk7IC8vIF9WRUMyXHJcblx0XHRjYXNlIDB4OGI1NDogY2FzZSAweDhiNTg6IHJldHVybiBzZXRWYWx1ZVYzaUFycmF5OyAvLyBfVkVDM1xyXG5cdFx0Y2FzZSAweDhiNTU6IGNhc2UgMHg4YjU5OiByZXR1cm4gc2V0VmFsdWVWNGlBcnJheTsgLy8gX1ZFQzRcclxuXHJcblx0XHRjYXNlIDB4MTQwNTogcmV0dXJuIHNldFZhbHVlVjF1aUFycmF5OyAvLyBVSU5UXHJcblx0XHRjYXNlIDB4OGRjNjogcmV0dXJuIHNldFZhbHVlVjJ1aUFycmF5OyAvLyBfVkVDMlxyXG5cdFx0Y2FzZSAweDhkYzc6IHJldHVybiBzZXRWYWx1ZVYzdWlBcnJheTsgLy8gX1ZFQzNcclxuXHRcdGNhc2UgMHg4ZGM4OiByZXR1cm4gc2V0VmFsdWVWNHVpQXJyYXk7IC8vIF9WRUM0XHJcblxyXG5cdFx0Y2FzZSAweDhiNWU6IC8vIFNBTVBMRVJfMkRcclxuXHRcdGNhc2UgMHg4ZDY2OiAvLyBTQU1QTEVSX0VYVEVSTkFMX09FU1xyXG5cdFx0Y2FzZSAweDhkY2E6IC8vIElOVF9TQU1QTEVSXzJEXHJcblx0XHRjYXNlIDB4OGRkMjogLy8gVU5TSUdORURfSU5UX1NBTVBMRVJfMkRcclxuXHRcdGNhc2UgMHg4YjYyOiAvLyBTQU1QTEVSXzJEX1NIQURPV1xyXG5cdFx0XHRyZXR1cm4gc2V0VmFsdWVUMUFycmF5O1xyXG5cclxuXHRcdGNhc2UgMHg4YjVmOiAvLyBTQU1QTEVSXzNEXHJcblx0XHRjYXNlIDB4OGRjYjogLy8gSU5UX1NBTVBMRVJfM0RcclxuXHRcdGNhc2UgMHg4ZGQzOiAvLyBVTlNJR05FRF9JTlRfU0FNUExFUl8zRFxyXG5cdFx0XHRyZXR1cm4gc2V0VmFsdWVUM0RBcnJheTtcclxuXHJcblx0XHRjYXNlIDB4OGI2MDogLy8gU0FNUExFUl9DVUJFXHJcblx0XHRjYXNlIDB4OGRjYzogLy8gSU5UX1NBTVBMRVJfQ1VCRVxyXG5cdFx0Y2FzZSAweDhkZDQ6IC8vIFVOU0lHTkVEX0lOVF9TQU1QTEVSX0NVQkVcclxuXHRcdGNhc2UgMHg4ZGM1OiAvLyBTQU1QTEVSX0NVQkVfU0hBRE9XXHJcblx0XHRcdHJldHVybiBzZXRWYWx1ZVQ2QXJyYXk7XHJcblxyXG5cdFx0Y2FzZSAweDhkYzE6IC8vIFNBTVBMRVJfMkRfQVJSQVlcclxuXHRcdGNhc2UgMHg4ZGNmOiAvLyBJTlRfU0FNUExFUl8yRF9BUlJBWVxyXG5cdFx0Y2FzZSAweDhkZDc6IC8vIFVOU0lHTkVEX0lOVF9TQU1QTEVSXzJEX0FSUkFZXHJcblx0XHRjYXNlIDB4OGRjNDogLy8gU0FNUExFUl8yRF9BUlJBWV9TSEFET1dcclxuXHRcdFx0cmV0dXJuIHNldFZhbHVlVDJEQXJyYXlBcnJheTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLy8gLS0tIFVuaWZvcm0gQ2xhc3NlcyAtLS1cclxuXHJcbmNsYXNzIFNpbmdsZVVuaWZvcm0ge1xyXG5cclxuXHRjb25zdHJ1Y3RvciggaWQsIGFjdGl2ZUluZm8sIGFkZHIgKSB7XHJcblxyXG5cdFx0dGhpcy5pZCA9IGlkO1xyXG5cdFx0dGhpcy5hZGRyID0gYWRkcjtcclxuXHRcdHRoaXMuY2FjaGUgPSBbXTtcclxuXHRcdHRoaXMudHlwZSA9IGFjdGl2ZUluZm8udHlwZTtcclxuXHRcdHRoaXMuc2V0VmFsdWUgPSBnZXRTaW5ndWxhclNldHRlciggYWN0aXZlSW5mby50eXBlICk7XHJcblxyXG5cdFx0Ly8gdGhpcy5wYXRoID0gYWN0aXZlSW5mby5uYW1lOyAvLyBERUJVR1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5jbGFzcyBQdXJlQXJyYXlVbmlmb3JtIHtcclxuXHJcblx0Y29uc3RydWN0b3IoIGlkLCBhY3RpdmVJbmZvLCBhZGRyICkge1xyXG5cclxuXHRcdHRoaXMuaWQgPSBpZDtcclxuXHRcdHRoaXMuYWRkciA9IGFkZHI7XHJcblx0XHR0aGlzLmNhY2hlID0gW107XHJcblx0XHR0aGlzLnR5cGUgPSBhY3RpdmVJbmZvLnR5cGU7XHJcblx0XHR0aGlzLnNpemUgPSBhY3RpdmVJbmZvLnNpemU7XHJcblx0XHR0aGlzLnNldFZhbHVlID0gZ2V0UHVyZUFycmF5U2V0dGVyKCBhY3RpdmVJbmZvLnR5cGUgKTtcclxuXHJcblx0XHQvLyB0aGlzLnBhdGggPSBhY3RpdmVJbmZvLm5hbWU7IC8vIERFQlVHXHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmNsYXNzIFN0cnVjdHVyZWRVbmlmb3JtIHtcclxuXHJcblx0Y29uc3RydWN0b3IoIGlkICkge1xyXG5cclxuXHRcdHRoaXMuaWQgPSBpZDtcclxuXHJcblx0XHR0aGlzLnNlcSA9IFtdO1xyXG5cdFx0dGhpcy5tYXAgPSB7fTtcclxuXHJcblx0fVxyXG5cclxuXHRzZXRWYWx1ZSggZ2wsIHZhbHVlLCB0ZXh0dXJlcyApIHtcclxuXHJcblx0XHRjb25zdCBzZXEgPSB0aGlzLnNlcTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIG4gPSBzZXEubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdSA9IHNlcVsgaSBdO1xyXG5cdFx0XHR1LnNldFZhbHVlKCBnbCwgdmFsdWVbIHUuaWQgXSwgdGV4dHVyZXMgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8vIC0tLSBUb3AtbGV2ZWwgLS0tXHJcblxyXG4vLyBQYXJzZXIgLSBidWlsZHMgdXAgdGhlIHByb3BlcnR5IHRyZWUgZnJvbSB0aGUgcGF0aCBzdHJpbmdzXHJcblxyXG5jb25zdCBSZVBhdGhQYXJ0ID0gLyhcXHcrKShcXF0pPyhcXFt8XFwuKT8vZztcclxuXHJcbi8vIGV4dHJhY3RzXHJcbi8vIFx0LSB0aGUgaWRlbnRpZmllciAobWVtYmVyIG5hbWUgb3IgYXJyYXkgaW5kZXgpXHJcbi8vICAtIGZvbGxvd2VkIGJ5IGFuIG9wdGlvbmFsIHJpZ2h0IGJyYWNrZXQgKGZvdW5kIHdoZW4gYXJyYXkgaW5kZXgpXHJcbi8vICAtIGZvbGxvd2VkIGJ5IGFuIG9wdGlvbmFsIGxlZnQgYnJhY2tldCBvciBkb3QgKHR5cGUgb2Ygc3Vic2NyaXB0KVxyXG4vL1xyXG4vLyBOb3RlOiBUaGVzZSBwb3J0aW9ucyBjYW4gYmUgcmVhZCBpbiBhIG5vbi1vdmVybGFwcGluZyBmYXNoaW9uIGFuZFxyXG4vLyBhbGxvdyBzdHJhaWdodGZvcndhcmQgcGFyc2luZyBvZiB0aGUgaGllcmFyY2h5IHRoYXQgV2ViR0wgZW5jb2Rlc1xyXG4vLyBpbiB0aGUgdW5pZm9ybSBuYW1lcy5cclxuXHJcbmZ1bmN0aW9uIGFkZFVuaWZvcm0oIGNvbnRhaW5lciwgdW5pZm9ybU9iamVjdCApIHtcclxuXHJcblx0Y29udGFpbmVyLnNlcS5wdXNoKCB1bmlmb3JtT2JqZWN0ICk7XHJcblx0Y29udGFpbmVyLm1hcFsgdW5pZm9ybU9iamVjdC5pZCBdID0gdW5pZm9ybU9iamVjdDtcclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHBhcnNlVW5pZm9ybSggYWN0aXZlSW5mbywgYWRkciwgY29udGFpbmVyICkge1xyXG5cclxuXHRjb25zdCBwYXRoID0gYWN0aXZlSW5mby5uYW1lLFxyXG5cdFx0cGF0aExlbmd0aCA9IHBhdGgubGVuZ3RoO1xyXG5cclxuXHQvLyByZXNldCBSZWdFeHAgb2JqZWN0LCBiZWNhdXNlIG9mIHRoZSBlYXJseSBleGl0IG9mIGEgcHJldmlvdXMgcnVuXHJcblx0UmVQYXRoUGFydC5sYXN0SW5kZXggPSAwO1xyXG5cclxuXHR3aGlsZSAoIHRydWUgKSB7XHJcblxyXG5cdFx0Y29uc3QgbWF0Y2ggPSBSZVBhdGhQYXJ0LmV4ZWMoIHBhdGggKSxcclxuXHRcdFx0bWF0Y2hFbmQgPSBSZVBhdGhQYXJ0Lmxhc3RJbmRleDtcclxuXHJcblx0XHRsZXQgaWQgPSBtYXRjaFsgMSBdO1xyXG5cdFx0Y29uc3QgaWRJc0luZGV4ID0gbWF0Y2hbIDIgXSA9PT0gJ10nLFxyXG5cdFx0XHRzdWJzY3JpcHQgPSBtYXRjaFsgMyBdO1xyXG5cclxuXHRcdGlmICggaWRJc0luZGV4ICkgaWQgPSBpZCB8IDA7IC8vIGNvbnZlcnQgdG8gaW50ZWdlclxyXG5cclxuXHRcdGlmICggc3Vic2NyaXB0ID09PSB1bmRlZmluZWQgfHwgc3Vic2NyaXB0ID09PSAnWycgJiYgbWF0Y2hFbmQgKyAyID09PSBwYXRoTGVuZ3RoICkge1xyXG5cclxuXHRcdFx0Ly8gYmFyZSBuYW1lIG9yIFwicHVyZVwiIGJvdHRvbS1sZXZlbCBhcnJheSBcIlswXVwiIHN1ZmZpeFxyXG5cclxuXHRcdFx0YWRkVW5pZm9ybSggY29udGFpbmVyLCBzdWJzY3JpcHQgPT09IHVuZGVmaW5lZCA/XHJcblx0XHRcdFx0bmV3IFNpbmdsZVVuaWZvcm0oIGlkLCBhY3RpdmVJbmZvLCBhZGRyICkgOlxyXG5cdFx0XHRcdG5ldyBQdXJlQXJyYXlVbmlmb3JtKCBpZCwgYWN0aXZlSW5mbywgYWRkciApICk7XHJcblxyXG5cdFx0XHRicmVhaztcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Ly8gc3RlcCBpbnRvIGlubmVyIG5vZGUgLyBjcmVhdGUgaXQgaW4gY2FzZSBpdCBkb2Vzbid0IGV4aXN0XHJcblxyXG5cdFx0XHRjb25zdCBtYXAgPSBjb250YWluZXIubWFwO1xyXG5cdFx0XHRsZXQgbmV4dCA9IG1hcFsgaWQgXTtcclxuXHJcblx0XHRcdGlmICggbmV4dCA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRuZXh0ID0gbmV3IFN0cnVjdHVyZWRVbmlmb3JtKCBpZCApO1xyXG5cdFx0XHRcdGFkZFVuaWZvcm0oIGNvbnRhaW5lciwgbmV4dCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29udGFpbmVyID0gbmV4dDtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8vIFJvb3QgQ29udGFpbmVyXHJcblxyXG5jbGFzcyBXZWJHTFVuaWZvcm1zIHtcclxuXHJcblx0Y29uc3RydWN0b3IoIGdsLCBwcm9ncmFtICkge1xyXG5cclxuXHRcdHRoaXMuc2VxID0gW107XHJcblx0XHR0aGlzLm1hcCA9IHt9O1xyXG5cclxuXHRcdGNvbnN0IG4gPSBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKCBwcm9ncmFtLCBnbC5BQ1RJVkVfVU5JRk9STVMgKTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBuOyArKyBpICkge1xyXG5cclxuXHRcdFx0Y29uc3QgaW5mbyA9IGdsLmdldEFjdGl2ZVVuaWZvcm0oIHByb2dyYW0sIGkgKSxcclxuXHRcdFx0XHRhZGRyID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCBpbmZvLm5hbWUgKTtcclxuXHJcblx0XHRcdHBhcnNlVW5pZm9ybSggaW5mbywgYWRkciwgdGhpcyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRzZXRWYWx1ZSggZ2wsIG5hbWUsIHZhbHVlLCB0ZXh0dXJlcyApIHtcclxuXHJcblx0XHRjb25zdCB1ID0gdGhpcy5tYXBbIG5hbWUgXTtcclxuXHJcblx0XHRpZiAoIHUgIT09IHVuZGVmaW5lZCApIHUuc2V0VmFsdWUoIGdsLCB2YWx1ZSwgdGV4dHVyZXMgKTtcclxuXHJcblx0fVxyXG5cclxuXHRzZXRPcHRpb25hbCggZ2wsIG9iamVjdCwgbmFtZSApIHtcclxuXHJcblx0XHRjb25zdCB2ID0gb2JqZWN0WyBuYW1lIF07XHJcblxyXG5cdFx0aWYgKCB2ICE9PSB1bmRlZmluZWQgKSB0aGlzLnNldFZhbHVlKCBnbCwgbmFtZSwgdiApO1xyXG5cclxuXHR9XHJcblxyXG5cdHN0YXRpYyB1cGxvYWQoIGdsLCBzZXEsIHZhbHVlcywgdGV4dHVyZXMgKSB7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBuID0gc2VxLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcclxuXHJcblx0XHRcdGNvbnN0IHUgPSBzZXFbIGkgXSxcclxuXHRcdFx0XHR2ID0gdmFsdWVzWyB1LmlkIF07XHJcblxyXG5cdFx0XHRpZiAoIHYubmVlZHNVcGRhdGUgIT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0XHQvLyBub3RlOiBhbHdheXMgdXBkYXRpbmcgd2hlbiAubmVlZHNVcGRhdGUgaXMgdW5kZWZpbmVkXHJcblx0XHRcdFx0dS5zZXRWYWx1ZSggZ2wsIHYudmFsdWUsIHRleHR1cmVzICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdHN0YXRpYyBzZXFXaXRoVmFsdWUoIHNlcSwgdmFsdWVzICkge1xyXG5cclxuXHRcdGNvbnN0IHIgPSBbXTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIG4gPSBzZXEubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdSA9IHNlcVsgaSBdO1xyXG5cdFx0XHRpZiAoIHUuaWQgaW4gdmFsdWVzICkgci5wdXNoKCB1ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiByO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBXZWJHTFVuaWZvcm1zIH07XHJcbiIsImZ1bmN0aW9uIFdlYkdMU2hhZGVyKCBnbCwgdHlwZSwgc3RyaW5nICkge1xyXG5cclxuXHRjb25zdCBzaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIoIHR5cGUgKTtcclxuXHJcblx0Z2wuc2hhZGVyU291cmNlKCBzaGFkZXIsIHN0cmluZyApO1xyXG5cdGdsLmNvbXBpbGVTaGFkZXIoIHNoYWRlciApO1xyXG5cclxuXHRyZXR1cm4gc2hhZGVyO1xyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgV2ViR0xTaGFkZXIgfTtcclxuIiwiaW1wb3J0IHsgV2ViR0xVbmlmb3JtcyB9IGZyb20gJy4vV2ViR0xVbmlmb3Jtcy5qcyc7XHJcbmltcG9ydCB7IFdlYkdMU2hhZGVyIH0gZnJvbSAnLi9XZWJHTFNoYWRlci5qcyc7XHJcbmltcG9ydCB7IFNoYWRlckNodW5rIH0gZnJvbSAnLi4vc2hhZGVycy9TaGFkZXJDaHVuay5qcyc7XHJcbmltcG9ydCB7IE5vVG9uZU1hcHBpbmcsIEFkZE9wZXJhdGlvbiwgTWl4T3BlcmF0aW9uLCBNdWx0aXBseU9wZXJhdGlvbiwgQ3ViZVJlZnJhY3Rpb25NYXBwaW5nLCBDdWJlVVZSZWZsZWN0aW9uTWFwcGluZywgQ3ViZVJlZmxlY3Rpb25NYXBwaW5nLCBQQ0ZTb2Z0U2hhZG93TWFwLCBQQ0ZTaGFkb3dNYXAsIFZTTVNoYWRvd01hcCwgQWdYVG9uZU1hcHBpbmcsIEFDRVNGaWxtaWNUb25lTWFwcGluZywgTmV1dHJhbFRvbmVNYXBwaW5nLCBDaW5lb25Ub25lTWFwcGluZywgQ3VzdG9tVG9uZU1hcHBpbmcsIFJlaW5oYXJkVG9uZU1hcHBpbmcsIExpbmVhclRvbmVNYXBwaW5nLCBHTFNMMywgTGluZWFyVHJhbnNmZXIsIFNSR0JUcmFuc2ZlciB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IENvbG9yTWFuYWdlbWVudCB9IGZyb20gJy4uLy4uL21hdGgvQ29sb3JNYW5hZ2VtZW50LmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcbmltcG9ydCB7IE1hdHJpeDMgfSBmcm9tICcuLi8uLi9tYXRoL01hdHJpeDMuanMnO1xyXG5cclxuLy8gRnJvbSBodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS93ZWJnbC9leHRlbnNpb25zL0tIUl9wYXJhbGxlbF9zaGFkZXJfY29tcGlsZS9cclxuY29uc3QgQ09NUExFVElPTl9TVEFUVVNfS0hSID0gMHg5MUIxO1xyXG5cclxubGV0IHByb2dyYW1JZENvdW50ID0gMDtcclxuXHJcbmZ1bmN0aW9uIGhhbmRsZVNvdXJjZSggc3RyaW5nLCBlcnJvckxpbmUgKSB7XHJcblxyXG5cdGNvbnN0IGxpbmVzID0gc3RyaW5nLnNwbGl0KCAnXFxuJyApO1xyXG5cdGNvbnN0IGxpbmVzMiA9IFtdO1xyXG5cclxuXHRjb25zdCBmcm9tID0gTWF0aC5tYXgoIGVycm9yTGluZSAtIDYsIDAgKTtcclxuXHRjb25zdCB0byA9IE1hdGgubWluKCBlcnJvckxpbmUgKyA2LCBsaW5lcy5sZW5ndGggKTtcclxuXHJcblx0Zm9yICggbGV0IGkgPSBmcm9tOyBpIDwgdG87IGkgKysgKSB7XHJcblxyXG5cdFx0Y29uc3QgbGluZSA9IGkgKyAxO1xyXG5cdFx0bGluZXMyLnB1c2goIGAke2xpbmUgPT09IGVycm9yTGluZSA/ICc+JyA6ICcgJ30gJHtsaW5lfTogJHtsaW5lc1sgaSBdfWAgKTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gbGluZXMyLmpvaW4oICdcXG4nICk7XHJcblxyXG59XHJcblxyXG5jb25zdCBfbTAgPSAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXgzKCk7XHJcblxyXG5mdW5jdGlvbiBnZXRFbmNvZGluZ0NvbXBvbmVudHMoIGNvbG9yU3BhY2UgKSB7XHJcblxyXG5cdENvbG9yTWFuYWdlbWVudC5fZ2V0TWF0cml4KCBfbTAsIENvbG9yTWFuYWdlbWVudC53b3JraW5nQ29sb3JTcGFjZSwgY29sb3JTcGFjZSApO1xyXG5cclxuXHRjb25zdCBlbmNvZGluZ01hdHJpeCA9IGBtYXQzKCAkeyBfbTAuZWxlbWVudHMubWFwKCAoIHYgKSA9PiB2LnRvRml4ZWQoIDQgKSApIH0gKWA7XHJcblxyXG5cdHN3aXRjaCAoIENvbG9yTWFuYWdlbWVudC5nZXRUcmFuc2ZlciggY29sb3JTcGFjZSApICkge1xyXG5cclxuXHRcdGNhc2UgTGluZWFyVHJhbnNmZXI6XHJcblx0XHRcdHJldHVybiBbIGVuY29kaW5nTWF0cml4LCAnTGluZWFyVHJhbnNmZXJPRVRGJyBdO1xyXG5cclxuXHRcdGNhc2UgU1JHQlRyYW5zZmVyOlxyXG5cdFx0XHRyZXR1cm4gWyBlbmNvZGluZ01hdHJpeCwgJ3NSR0JUcmFuc2Zlck9FVEYnIF07XHJcblxyXG5cdFx0ZGVmYXVsdDpcclxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xQcm9ncmFtOiBVbnN1cHBvcnRlZCBjb2xvciBzcGFjZTogJywgY29sb3JTcGFjZSApO1xyXG5cdFx0XHRyZXR1cm4gWyBlbmNvZGluZ01hdHJpeCwgJ0xpbmVhclRyYW5zZmVyT0VURicgXTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0U2hhZGVyRXJyb3JzKCBnbCwgc2hhZGVyLCB0eXBlICkge1xyXG5cclxuXHRjb25zdCBzdGF0dXMgPSBnbC5nZXRTaGFkZXJQYXJhbWV0ZXIoIHNoYWRlciwgZ2wuQ09NUElMRV9TVEFUVVMgKTtcclxuXHRjb25zdCBlcnJvcnMgPSBnbC5nZXRTaGFkZXJJbmZvTG9nKCBzaGFkZXIgKS50cmltKCk7XHJcblxyXG5cdGlmICggc3RhdHVzICYmIGVycm9ycyA9PT0gJycgKSByZXR1cm4gJyc7XHJcblxyXG5cdGNvbnN0IGVycm9yTWF0Y2hlcyA9IC9FUlJPUjogMDooXFxkKykvLmV4ZWMoIGVycm9ycyApO1xyXG5cdGlmICggZXJyb3JNYXRjaGVzICkge1xyXG5cclxuXHRcdC8vIC0tZW5hYmxlLXByaXZpbGVnZWQtd2ViZ2wtZXh0ZW5zaW9uXHJcblx0XHQvLyBjb25zb2xlLmxvZyggJyoqJyArIHR5cGUgKyAnKionLCBnbC5nZXRFeHRlbnNpb24oICdXRUJHTF9kZWJ1Z19zaGFkZXJzJyApLmdldFRyYW5zbGF0ZWRTaGFkZXJTb3VyY2UoIHNoYWRlciApICk7XHJcblxyXG5cdFx0Y29uc3QgZXJyb3JMaW5lID0gcGFyc2VJbnQoIGVycm9yTWF0Y2hlc1sgMSBdICk7XHJcblx0XHRyZXR1cm4gdHlwZS50b1VwcGVyQ2FzZSgpICsgJ1xcblxcbicgKyBlcnJvcnMgKyAnXFxuXFxuJyArIGhhbmRsZVNvdXJjZSggZ2wuZ2V0U2hhZGVyU291cmNlKCBzaGFkZXIgKSwgZXJyb3JMaW5lICk7XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0cmV0dXJuIGVycm9ycztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0VGV4ZWxFbmNvZGluZ0Z1bmN0aW9uKCBmdW5jdGlvbk5hbWUsIGNvbG9yU3BhY2UgKSB7XHJcblxyXG5cdGNvbnN0IGNvbXBvbmVudHMgPSBnZXRFbmNvZGluZ0NvbXBvbmVudHMoIGNvbG9yU3BhY2UgKTtcclxuXHJcblx0cmV0dXJuIFtcclxuXHJcblx0XHRgdmVjNCAke2Z1bmN0aW9uTmFtZX0oIHZlYzQgdmFsdWUgKSB7YCxcclxuXHJcblx0XHRgXHRyZXR1cm4gJHtjb21wb25lbnRzWyAxIF19KCB2ZWM0KCB2YWx1ZS5yZ2IgKiAke2NvbXBvbmVudHNbIDAgXX0sIHZhbHVlLmEgKSApO2AsXHJcblxyXG5cdFx0J30nLFxyXG5cclxuXHRdLmpvaW4oICdcXG4nICk7XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRUb25lTWFwcGluZ0Z1bmN0aW9uKCBmdW5jdGlvbk5hbWUsIHRvbmVNYXBwaW5nICkge1xyXG5cclxuXHRsZXQgdG9uZU1hcHBpbmdOYW1lO1xyXG5cclxuXHRzd2l0Y2ggKCB0b25lTWFwcGluZyApIHtcclxuXHJcblx0XHRjYXNlIExpbmVhclRvbmVNYXBwaW5nOlxyXG5cdFx0XHR0b25lTWFwcGluZ05hbWUgPSAnTGluZWFyJztcclxuXHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0Y2FzZSBSZWluaGFyZFRvbmVNYXBwaW5nOlxyXG5cdFx0XHR0b25lTWFwcGluZ05hbWUgPSAnUmVpbmhhcmQnO1xyXG5cdFx0XHRicmVhaztcclxuXHJcblx0XHRjYXNlIENpbmVvblRvbmVNYXBwaW5nOlxyXG5cdFx0XHR0b25lTWFwcGluZ05hbWUgPSAnQ2luZW9uJztcclxuXHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0Y2FzZSBBQ0VTRmlsbWljVG9uZU1hcHBpbmc6XHJcblx0XHRcdHRvbmVNYXBwaW5nTmFtZSA9ICdBQ0VTRmlsbWljJztcclxuXHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0Y2FzZSBBZ1hUb25lTWFwcGluZzpcclxuXHRcdFx0dG9uZU1hcHBpbmdOYW1lID0gJ0FnWCc7XHJcblx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdGNhc2UgTmV1dHJhbFRvbmVNYXBwaW5nOlxyXG5cdFx0XHR0b25lTWFwcGluZ05hbWUgPSAnTmV1dHJhbCc7XHJcblx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdGNhc2UgQ3VzdG9tVG9uZU1hcHBpbmc6XHJcblx0XHRcdHRvbmVNYXBwaW5nTmFtZSA9ICdDdXN0b20nO1xyXG5cdFx0XHRicmVhaztcclxuXHJcblx0XHRkZWZhdWx0OlxyXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFByb2dyYW06IFVuc3VwcG9ydGVkIHRvbmVNYXBwaW5nOicsIHRvbmVNYXBwaW5nICk7XHJcblx0XHRcdHRvbmVNYXBwaW5nTmFtZSA9ICdMaW5lYXInO1xyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiAndmVjMyAnICsgZnVuY3Rpb25OYW1lICsgJyggdmVjMyBjb2xvciApIHsgcmV0dXJuICcgKyB0b25lTWFwcGluZ05hbWUgKyAnVG9uZU1hcHBpbmcoIGNvbG9yICk7IH0nO1xyXG5cclxufVxyXG5cclxuY29uc3QgX3YwID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5cclxuZnVuY3Rpb24gZ2V0THVtaW5hbmNlRnVuY3Rpb24oKSB7XHJcblxyXG5cdENvbG9yTWFuYWdlbWVudC5nZXRMdW1pbmFuY2VDb2VmZmljaWVudHMoIF92MCApO1xyXG5cclxuXHRjb25zdCByID0gX3YwLngudG9GaXhlZCggNCApO1xyXG5cdGNvbnN0IGcgPSBfdjAueS50b0ZpeGVkKCA0ICk7XHJcblx0Y29uc3QgYiA9IF92MC56LnRvRml4ZWQoIDQgKTtcclxuXHJcblx0cmV0dXJuIFtcclxuXHJcblx0XHQnZmxvYXQgbHVtaW5hbmNlKCBjb25zdCBpbiB2ZWMzIHJnYiApIHsnLFxyXG5cclxuXHRcdGBcdGNvbnN0IHZlYzMgd2VpZ2h0cyA9IHZlYzMoICR7IHIgfSwgJHsgZyB9LCAkeyBiIH0gKTtgLFxyXG5cclxuXHRcdCdcdHJldHVybiBkb3QoIHdlaWdodHMsIHJnYiApOycsXHJcblxyXG5cdFx0J30nXHJcblxyXG5cdF0uam9pbiggJ1xcbicgKTtcclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdlbmVyYXRlVmVydGV4RXh0ZW5zaW9ucyggcGFyYW1ldGVycyApIHtcclxuXHJcblx0Y29uc3QgY2h1bmtzID0gW1xyXG5cdFx0cGFyYW1ldGVycy5leHRlbnNpb25DbGlwQ3VsbERpc3RhbmNlID8gJyNleHRlbnNpb24gR0xfQU5HTEVfY2xpcF9jdWxsX2Rpc3RhbmNlIDogcmVxdWlyZScgOiAnJyxcclxuXHRcdHBhcmFtZXRlcnMuZXh0ZW5zaW9uTXVsdGlEcmF3ID8gJyNleHRlbnNpb24gR0xfQU5HTEVfbXVsdGlfZHJhdyA6IHJlcXVpcmUnIDogJycsXHJcblx0XTtcclxuXHJcblx0cmV0dXJuIGNodW5rcy5maWx0ZXIoIGZpbHRlckVtcHR5TGluZSApLmpvaW4oICdcXG4nICk7XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBnZW5lcmF0ZURlZmluZXMoIGRlZmluZXMgKSB7XHJcblxyXG5cdGNvbnN0IGNodW5rcyA9IFtdO1xyXG5cclxuXHRmb3IgKCBjb25zdCBuYW1lIGluIGRlZmluZXMgKSB7XHJcblxyXG5cdFx0Y29uc3QgdmFsdWUgPSBkZWZpbmVzWyBuYW1lIF07XHJcblxyXG5cdFx0aWYgKCB2YWx1ZSA9PT0gZmFsc2UgKSBjb250aW51ZTtcclxuXHJcblx0XHRjaHVua3MucHVzaCggJyNkZWZpbmUgJyArIG5hbWUgKyAnICcgKyB2YWx1ZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiBjaHVua3Muam9pbiggJ1xcbicgKTtcclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGZldGNoQXR0cmlidXRlTG9jYXRpb25zKCBnbCwgcHJvZ3JhbSApIHtcclxuXHJcblx0Y29uc3QgYXR0cmlidXRlcyA9IHt9O1xyXG5cclxuXHRjb25zdCBuID0gZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlciggcHJvZ3JhbSwgZ2wuQUNUSVZFX0FUVFJJQlVURVMgKTtcclxuXHJcblx0Zm9yICggbGV0IGkgPSAwOyBpIDwgbjsgaSArKyApIHtcclxuXHJcblx0XHRjb25zdCBpbmZvID0gZ2wuZ2V0QWN0aXZlQXR0cmliKCBwcm9ncmFtLCBpICk7XHJcblx0XHRjb25zdCBuYW1lID0gaW5mby5uYW1lO1xyXG5cclxuXHRcdGxldCBsb2NhdGlvblNpemUgPSAxO1xyXG5cdFx0aWYgKCBpbmZvLnR5cGUgPT09IGdsLkZMT0FUX01BVDIgKSBsb2NhdGlvblNpemUgPSAyO1xyXG5cdFx0aWYgKCBpbmZvLnR5cGUgPT09IGdsLkZMT0FUX01BVDMgKSBsb2NhdGlvblNpemUgPSAzO1xyXG5cdFx0aWYgKCBpbmZvLnR5cGUgPT09IGdsLkZMT0FUX01BVDQgKSBsb2NhdGlvblNpemUgPSA0O1xyXG5cclxuXHRcdC8vIGNvbnNvbGUubG9nKCAnVEhSRUUuV2ViR0xQcm9ncmFtOiBBQ1RJVkUgVkVSVEVYIEFUVFJJQlVURTonLCBuYW1lLCBpICk7XHJcblxyXG5cdFx0YXR0cmlidXRlc1sgbmFtZSBdID0ge1xyXG5cdFx0XHR0eXBlOiBpbmZvLnR5cGUsXHJcblx0XHRcdGxvY2F0aW9uOiBnbC5nZXRBdHRyaWJMb2NhdGlvbiggcHJvZ3JhbSwgbmFtZSApLFxyXG5cdFx0XHRsb2NhdGlvblNpemU6IGxvY2F0aW9uU2l6ZVxyXG5cdFx0fTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gYXR0cmlidXRlcztcclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGZpbHRlckVtcHR5TGluZSggc3RyaW5nICkge1xyXG5cclxuXHRyZXR1cm4gc3RyaW5nICE9PSAnJztcclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlcGxhY2VMaWdodE51bXMoIHN0cmluZywgcGFyYW1ldGVycyApIHtcclxuXHJcblx0Y29uc3QgbnVtU3BvdExpZ2h0Q29vcmRzID0gcGFyYW1ldGVycy5udW1TcG90TGlnaHRTaGFkb3dzICsgcGFyYW1ldGVycy5udW1TcG90TGlnaHRNYXBzIC0gcGFyYW1ldGVycy5udW1TcG90TGlnaHRTaGFkb3dzV2l0aE1hcHM7XHJcblxyXG5cdHJldHVybiBzdHJpbmdcclxuXHRcdC5yZXBsYWNlKCAvTlVNX0RJUl9MSUdIVFMvZywgcGFyYW1ldGVycy5udW1EaXJMaWdodHMgKVxyXG5cdFx0LnJlcGxhY2UoIC9OVU1fU1BPVF9MSUdIVFMvZywgcGFyYW1ldGVycy5udW1TcG90TGlnaHRzIClcclxuXHRcdC5yZXBsYWNlKCAvTlVNX1NQT1RfTElHSFRfTUFQUy9nLCBwYXJhbWV0ZXJzLm51bVNwb3RMaWdodE1hcHMgKVxyXG5cdFx0LnJlcGxhY2UoIC9OVU1fU1BPVF9MSUdIVF9DT09SRFMvZywgbnVtU3BvdExpZ2h0Q29vcmRzIClcclxuXHRcdC5yZXBsYWNlKCAvTlVNX1JFQ1RfQVJFQV9MSUdIVFMvZywgcGFyYW1ldGVycy5udW1SZWN0QXJlYUxpZ2h0cyApXHJcblx0XHQucmVwbGFjZSggL05VTV9QT0lOVF9MSUdIVFMvZywgcGFyYW1ldGVycy5udW1Qb2ludExpZ2h0cyApXHJcblx0XHQucmVwbGFjZSggL05VTV9IRU1JX0xJR0hUUy9nLCBwYXJhbWV0ZXJzLm51bUhlbWlMaWdodHMgKVxyXG5cdFx0LnJlcGxhY2UoIC9OVU1fRElSX0xJR0hUX1NIQURPV1MvZywgcGFyYW1ldGVycy5udW1EaXJMaWdodFNoYWRvd3MgKVxyXG5cdFx0LnJlcGxhY2UoIC9OVU1fU1BPVF9MSUdIVF9TSEFET1dTX1dJVEhfTUFQUy9nLCBwYXJhbWV0ZXJzLm51bVNwb3RMaWdodFNoYWRvd3NXaXRoTWFwcyApXHJcblx0XHQucmVwbGFjZSggL05VTV9TUE9UX0xJR0hUX1NIQURPV1MvZywgcGFyYW1ldGVycy5udW1TcG90TGlnaHRTaGFkb3dzIClcclxuXHRcdC5yZXBsYWNlKCAvTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MvZywgcGFyYW1ldGVycy5udW1Qb2ludExpZ2h0U2hhZG93cyApO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gcmVwbGFjZUNsaXBwaW5nUGxhbmVOdW1zKCBzdHJpbmcsIHBhcmFtZXRlcnMgKSB7XHJcblxyXG5cdHJldHVybiBzdHJpbmdcclxuXHRcdC5yZXBsYWNlKCAvTlVNX0NMSVBQSU5HX1BMQU5FUy9nLCBwYXJhbWV0ZXJzLm51bUNsaXBwaW5nUGxhbmVzIClcclxuXHRcdC5yZXBsYWNlKCAvVU5JT05fQ0xJUFBJTkdfUExBTkVTL2csICggcGFyYW1ldGVycy5udW1DbGlwcGluZ1BsYW5lcyAtIHBhcmFtZXRlcnMubnVtQ2xpcEludGVyc2VjdGlvbiApICk7XHJcblxyXG59XHJcblxyXG4vLyBSZXNvbHZlIEluY2x1ZGVzXHJcblxyXG5jb25zdCBpbmNsdWRlUGF0dGVybiA9IC9eWyBcXHRdKiNpbmNsdWRlICs8KFtcXHdcXGQuL10rKT4vZ207XHJcblxyXG5mdW5jdGlvbiByZXNvbHZlSW5jbHVkZXMoIHN0cmluZyApIHtcclxuXHJcblx0cmV0dXJuIHN0cmluZy5yZXBsYWNlKCBpbmNsdWRlUGF0dGVybiwgaW5jbHVkZVJlcGxhY2VyICk7XHJcblxyXG59XHJcblxyXG5jb25zdCBzaGFkZXJDaHVua01hcCA9IG5ldyBNYXAoKTtcclxuXHJcbmZ1bmN0aW9uIGluY2x1ZGVSZXBsYWNlciggbWF0Y2gsIGluY2x1ZGUgKSB7XHJcblxyXG5cdGxldCBzdHJpbmcgPSBTaGFkZXJDaHVua1sgaW5jbHVkZSBdO1xyXG5cclxuXHRpZiAoIHN0cmluZyA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdGNvbnN0IG5ld0luY2x1ZGUgPSBzaGFkZXJDaHVua01hcC5nZXQoIGluY2x1ZGUgKTtcclxuXHJcblx0XHRpZiAoIG5ld0luY2x1ZGUgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHN0cmluZyA9IFNoYWRlckNodW5rWyBuZXdJbmNsdWRlIF07XHJcblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IFNoYWRlciBjaHVuayBcIiVzXCIgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFwiJXNcIiBpbnN0ZWFkLicsIGluY2x1ZGUsIG5ld0luY2x1ZGUgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnQ2FuIG5vdCByZXNvbHZlICNpbmNsdWRlIDwnICsgaW5jbHVkZSArICc+JyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gcmVzb2x2ZUluY2x1ZGVzKCBzdHJpbmcgKTtcclxuXHJcbn1cclxuXHJcbi8vIFVucm9sbCBMb29wc1xyXG5cclxuY29uc3QgdW5yb2xsTG9vcFBhdHRlcm4gPSAvI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxccytmb3JcXHMqXFwoXFxzKmludFxccytpXFxzKj1cXHMqKFxcZCspXFxzKjtcXHMqaVxccyo8XFxzKihcXGQrKVxccyo7XFxzKmlcXHMqXFwrXFwrXFxzKlxcKVxccyp7KFtcXHNcXFNdKz8pfVxccysjcHJhZ21hIHVucm9sbF9sb29wX2VuZC9nO1xyXG5cclxuZnVuY3Rpb24gdW5yb2xsTG9vcHMoIHN0cmluZyApIHtcclxuXHJcblx0cmV0dXJuIHN0cmluZy5yZXBsYWNlKCB1bnJvbGxMb29wUGF0dGVybiwgbG9vcFJlcGxhY2VyICk7XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBsb29wUmVwbGFjZXIoIG1hdGNoLCBzdGFydCwgZW5kLCBzbmlwcGV0ICkge1xyXG5cclxuXHRsZXQgc3RyaW5nID0gJyc7XHJcblxyXG5cdGZvciAoIGxldCBpID0gcGFyc2VJbnQoIHN0YXJ0ICk7IGkgPCBwYXJzZUludCggZW5kICk7IGkgKysgKSB7XHJcblxyXG5cdFx0c3RyaW5nICs9IHNuaXBwZXRcclxuXHRcdFx0LnJlcGxhY2UoIC9cXFtcXHMqaVxccypcXF0vZywgJ1sgJyArIGkgKyAnIF0nIClcclxuXHRcdFx0LnJlcGxhY2UoIC9VTlJPTExFRF9MT09QX0lOREVYL2csIGkgKTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gc3RyaW5nO1xyXG5cclxufVxyXG5cclxuLy9cclxuXHJcbmZ1bmN0aW9uIGdlbmVyYXRlUHJlY2lzaW9uKCBwYXJhbWV0ZXJzICkge1xyXG5cclxuXHRsZXQgcHJlY2lzaW9uc3RyaW5nID0gYHByZWNpc2lvbiAke3BhcmFtZXRlcnMucHJlY2lzaW9ufSBmbG9hdDtcclxuXHRwcmVjaXNpb24gJHtwYXJhbWV0ZXJzLnByZWNpc2lvbn0gaW50O1xyXG5cdHByZWNpc2lvbiAke3BhcmFtZXRlcnMucHJlY2lzaW9ufSBzYW1wbGVyMkQ7XHJcblx0cHJlY2lzaW9uICR7cGFyYW1ldGVycy5wcmVjaXNpb259IHNhbXBsZXJDdWJlO1xyXG5cdHByZWNpc2lvbiAke3BhcmFtZXRlcnMucHJlY2lzaW9ufSBzYW1wbGVyM0Q7XHJcblx0cHJlY2lzaW9uICR7cGFyYW1ldGVycy5wcmVjaXNpb259IHNhbXBsZXIyREFycmF5O1xyXG5cdHByZWNpc2lvbiAke3BhcmFtZXRlcnMucHJlY2lzaW9ufSBzYW1wbGVyMkRTaGFkb3c7XHJcblx0cHJlY2lzaW9uICR7cGFyYW1ldGVycy5wcmVjaXNpb259IHNhbXBsZXJDdWJlU2hhZG93O1xyXG5cdHByZWNpc2lvbiAke3BhcmFtZXRlcnMucHJlY2lzaW9ufSBzYW1wbGVyMkRBcnJheVNoYWRvdztcclxuXHRwcmVjaXNpb24gJHtwYXJhbWV0ZXJzLnByZWNpc2lvbn0gaXNhbXBsZXIyRDtcclxuXHRwcmVjaXNpb24gJHtwYXJhbWV0ZXJzLnByZWNpc2lvbn0gaXNhbXBsZXIzRDtcclxuXHRwcmVjaXNpb24gJHtwYXJhbWV0ZXJzLnByZWNpc2lvbn0gaXNhbXBsZXJDdWJlO1xyXG5cdHByZWNpc2lvbiAke3BhcmFtZXRlcnMucHJlY2lzaW9ufSBpc2FtcGxlcjJEQXJyYXk7XHJcblx0cHJlY2lzaW9uICR7cGFyYW1ldGVycy5wcmVjaXNpb259IHVzYW1wbGVyMkQ7XHJcblx0cHJlY2lzaW9uICR7cGFyYW1ldGVycy5wcmVjaXNpb259IHVzYW1wbGVyM0Q7XHJcblx0cHJlY2lzaW9uICR7cGFyYW1ldGVycy5wcmVjaXNpb259IHVzYW1wbGVyQ3ViZTtcclxuXHRwcmVjaXNpb24gJHtwYXJhbWV0ZXJzLnByZWNpc2lvbn0gdXNhbXBsZXIyREFycmF5O1xyXG5cdGA7XHJcblxyXG5cdGlmICggcGFyYW1ldGVycy5wcmVjaXNpb24gPT09ICdoaWdocCcgKSB7XHJcblxyXG5cdFx0cHJlY2lzaW9uc3RyaW5nICs9ICdcXG4jZGVmaW5lIEhJR0hfUFJFQ0lTSU9OJztcclxuXHJcblx0fSBlbHNlIGlmICggcGFyYW1ldGVycy5wcmVjaXNpb24gPT09ICdtZWRpdW1wJyApIHtcclxuXHJcblx0XHRwcmVjaXNpb25zdHJpbmcgKz0gJ1xcbiNkZWZpbmUgTUVESVVNX1BSRUNJU0lPTic7XHJcblxyXG5cdH0gZWxzZSBpZiAoIHBhcmFtZXRlcnMucHJlY2lzaW9uID09PSAnbG93cCcgKSB7XHJcblxyXG5cdFx0cHJlY2lzaW9uc3RyaW5nICs9ICdcXG4jZGVmaW5lIExPV19QUkVDSVNJT04nO1xyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiBwcmVjaXNpb25zdHJpbmc7XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBnZW5lcmF0ZVNoYWRvd01hcFR5cGVEZWZpbmUoIHBhcmFtZXRlcnMgKSB7XHJcblxyXG5cdGxldCBzaGFkb3dNYXBUeXBlRGVmaW5lID0gJ1NIQURPV01BUF9UWVBFX0JBU0lDJztcclxuXHJcblx0aWYgKCBwYXJhbWV0ZXJzLnNoYWRvd01hcFR5cGUgPT09IFBDRlNoYWRvd01hcCApIHtcclxuXHJcblx0XHRzaGFkb3dNYXBUeXBlRGVmaW5lID0gJ1NIQURPV01BUF9UWVBFX1BDRic7XHJcblxyXG5cdH0gZWxzZSBpZiAoIHBhcmFtZXRlcnMuc2hhZG93TWFwVHlwZSA9PT0gUENGU29mdFNoYWRvd01hcCApIHtcclxuXHJcblx0XHRzaGFkb3dNYXBUeXBlRGVmaW5lID0gJ1NIQURPV01BUF9UWVBFX1BDRl9TT0ZUJztcclxuXHJcblx0fSBlbHNlIGlmICggcGFyYW1ldGVycy5zaGFkb3dNYXBUeXBlID09PSBWU01TaGFkb3dNYXAgKSB7XHJcblxyXG5cdFx0c2hhZG93TWFwVHlwZURlZmluZSA9ICdTSEFET1dNQVBfVFlQRV9WU00nO1xyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiBzaGFkb3dNYXBUeXBlRGVmaW5lO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gZ2VuZXJhdGVFbnZNYXBUeXBlRGVmaW5lKCBwYXJhbWV0ZXJzICkge1xyXG5cclxuXHRsZXQgZW52TWFwVHlwZURlZmluZSA9ICdFTlZNQVBfVFlQRV9DVUJFJztcclxuXHJcblx0aWYgKCBwYXJhbWV0ZXJzLmVudk1hcCApIHtcclxuXHJcblx0XHRzd2l0Y2ggKCBwYXJhbWV0ZXJzLmVudk1hcE1vZGUgKSB7XHJcblxyXG5cdFx0XHRjYXNlIEN1YmVSZWZsZWN0aW9uTWFwcGluZzpcclxuXHRcdFx0Y2FzZSBDdWJlUmVmcmFjdGlvbk1hcHBpbmc6XHJcblx0XHRcdFx0ZW52TWFwVHlwZURlZmluZSA9ICdFTlZNQVBfVFlQRV9DVUJFJztcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmc6XHJcblx0XHRcdFx0ZW52TWFwVHlwZURlZmluZSA9ICdFTlZNQVBfVFlQRV9DVUJFX1VWJztcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIGVudk1hcFR5cGVEZWZpbmU7XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBnZW5lcmF0ZUVudk1hcE1vZGVEZWZpbmUoIHBhcmFtZXRlcnMgKSB7XHJcblxyXG5cdGxldCBlbnZNYXBNb2RlRGVmaW5lID0gJ0VOVk1BUF9NT0RFX1JFRkxFQ1RJT04nO1xyXG5cclxuXHRpZiAoIHBhcmFtZXRlcnMuZW52TWFwICkge1xyXG5cclxuXHRcdHN3aXRjaCAoIHBhcmFtZXRlcnMuZW52TWFwTW9kZSApIHtcclxuXHJcblx0XHRcdGNhc2UgQ3ViZVJlZnJhY3Rpb25NYXBwaW5nOlxyXG5cclxuXHRcdFx0XHRlbnZNYXBNb2RlRGVmaW5lID0gJ0VOVk1BUF9NT0RFX1JFRlJBQ1RJT04nO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gZW52TWFwTW9kZURlZmluZTtcclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdlbmVyYXRlRW52TWFwQmxlbmRpbmdEZWZpbmUoIHBhcmFtZXRlcnMgKSB7XHJcblxyXG5cdGxldCBlbnZNYXBCbGVuZGluZ0RlZmluZSA9ICdFTlZNQVBfQkxFTkRJTkdfTk9ORSc7XHJcblxyXG5cdGlmICggcGFyYW1ldGVycy5lbnZNYXAgKSB7XHJcblxyXG5cdFx0c3dpdGNoICggcGFyYW1ldGVycy5jb21iaW5lICkge1xyXG5cclxuXHRcdFx0Y2FzZSBNdWx0aXBseU9wZXJhdGlvbjpcclxuXHRcdFx0XHRlbnZNYXBCbGVuZGluZ0RlZmluZSA9ICdFTlZNQVBfQkxFTkRJTkdfTVVMVElQTFknO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBNaXhPcGVyYXRpb246XHJcblx0XHRcdFx0ZW52TWFwQmxlbmRpbmdEZWZpbmUgPSAnRU5WTUFQX0JMRU5ESU5HX01JWCc7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIEFkZE9wZXJhdGlvbjpcclxuXHRcdFx0XHRlbnZNYXBCbGVuZGluZ0RlZmluZSA9ICdFTlZNQVBfQkxFTkRJTkdfQUREJztcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIGVudk1hcEJsZW5kaW5nRGVmaW5lO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gZ2VuZXJhdGVDdWJlVVZTaXplKCBwYXJhbWV0ZXJzICkge1xyXG5cclxuXHRjb25zdCBpbWFnZUhlaWdodCA9IHBhcmFtZXRlcnMuZW52TWFwQ3ViZVVWSGVpZ2h0O1xyXG5cclxuXHRpZiAoIGltYWdlSGVpZ2h0ID09PSBudWxsICkgcmV0dXJuIG51bGw7XHJcblxyXG5cdGNvbnN0IG1heE1pcCA9IE1hdGgubG9nMiggaW1hZ2VIZWlnaHQgKSAtIDI7XHJcblxyXG5cdGNvbnN0IHRleGVsSGVpZ2h0ID0gMS4wIC8gaW1hZ2VIZWlnaHQ7XHJcblxyXG5cdGNvbnN0IHRleGVsV2lkdGggPSAxLjAgLyAoIDMgKiBNYXRoLm1heCggTWF0aC5wb3coIDIsIG1heE1pcCApLCA3ICogMTYgKSApO1xyXG5cclxuXHRyZXR1cm4geyB0ZXhlbFdpZHRoLCB0ZXhlbEhlaWdodCwgbWF4TWlwIH07XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBXZWJHTFByb2dyYW0oIHJlbmRlcmVyLCBjYWNoZUtleSwgcGFyYW1ldGVycywgYmluZGluZ1N0YXRlcyApIHtcclxuXHJcblx0Ly8gVE9ETyBTZW5kIHRoaXMgZXZlbnQgdG8gVGhyZWUuanMgRGV2VG9vbHNcclxuXHQvLyBjb25zb2xlLmxvZyggJ1dlYkdMUHJvZ3JhbScsIGNhY2hlS2V5ICk7XHJcblxyXG5cdGNvbnN0IGdsID0gcmVuZGVyZXIuZ2V0Q29udGV4dCgpO1xyXG5cclxuXHRjb25zdCBkZWZpbmVzID0gcGFyYW1ldGVycy5kZWZpbmVzO1xyXG5cclxuXHRsZXQgdmVydGV4U2hhZGVyID0gcGFyYW1ldGVycy52ZXJ0ZXhTaGFkZXI7XHJcblx0bGV0IGZyYWdtZW50U2hhZGVyID0gcGFyYW1ldGVycy5mcmFnbWVudFNoYWRlcjtcclxuXHJcblx0Y29uc3Qgc2hhZG93TWFwVHlwZURlZmluZSA9IGdlbmVyYXRlU2hhZG93TWFwVHlwZURlZmluZSggcGFyYW1ldGVycyApO1xyXG5cdGNvbnN0IGVudk1hcFR5cGVEZWZpbmUgPSBnZW5lcmF0ZUVudk1hcFR5cGVEZWZpbmUoIHBhcmFtZXRlcnMgKTtcclxuXHRjb25zdCBlbnZNYXBNb2RlRGVmaW5lID0gZ2VuZXJhdGVFbnZNYXBNb2RlRGVmaW5lKCBwYXJhbWV0ZXJzICk7XHJcblx0Y29uc3QgZW52TWFwQmxlbmRpbmdEZWZpbmUgPSBnZW5lcmF0ZUVudk1hcEJsZW5kaW5nRGVmaW5lKCBwYXJhbWV0ZXJzICk7XHJcblx0Y29uc3QgZW52TWFwQ3ViZVVWU2l6ZSA9IGdlbmVyYXRlQ3ViZVVWU2l6ZSggcGFyYW1ldGVycyApO1xyXG5cclxuXHRjb25zdCBjdXN0b21WZXJ0ZXhFeHRlbnNpb25zID0gZ2VuZXJhdGVWZXJ0ZXhFeHRlbnNpb25zKCBwYXJhbWV0ZXJzICk7XHJcblxyXG5cdGNvbnN0IGN1c3RvbURlZmluZXMgPSBnZW5lcmF0ZURlZmluZXMoIGRlZmluZXMgKTtcclxuXHJcblx0Y29uc3QgcHJvZ3JhbSA9IGdsLmNyZWF0ZVByb2dyYW0oKTtcclxuXHJcblx0bGV0IHByZWZpeFZlcnRleCwgcHJlZml4RnJhZ21lbnQ7XHJcblx0bGV0IHZlcnNpb25TdHJpbmcgPSBwYXJhbWV0ZXJzLmdsc2xWZXJzaW9uID8gJyN2ZXJzaW9uICcgKyBwYXJhbWV0ZXJzLmdsc2xWZXJzaW9uICsgJ1xcbicgOiAnJztcclxuXHJcblx0aWYgKCBwYXJhbWV0ZXJzLmlzUmF3U2hhZGVyTWF0ZXJpYWwgKSB7XHJcblxyXG5cdFx0cHJlZml4VmVydGV4ID0gW1xyXG5cclxuXHRcdFx0JyNkZWZpbmUgU0hBREVSX1RZUEUgJyArIHBhcmFtZXRlcnMuc2hhZGVyVHlwZSxcclxuXHRcdFx0JyNkZWZpbmUgU0hBREVSX05BTUUgJyArIHBhcmFtZXRlcnMuc2hhZGVyTmFtZSxcclxuXHJcblx0XHRcdGN1c3RvbURlZmluZXNcclxuXHJcblx0XHRdLmZpbHRlciggZmlsdGVyRW1wdHlMaW5lICkuam9pbiggJ1xcbicgKTtcclxuXHJcblx0XHRpZiAoIHByZWZpeFZlcnRleC5sZW5ndGggPiAwICkge1xyXG5cclxuXHRcdFx0cHJlZml4VmVydGV4ICs9ICdcXG4nO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRwcmVmaXhGcmFnbWVudCA9IFtcclxuXHJcblx0XHRcdCcjZGVmaW5lIFNIQURFUl9UWVBFICcgKyBwYXJhbWV0ZXJzLnNoYWRlclR5cGUsXHJcblx0XHRcdCcjZGVmaW5lIFNIQURFUl9OQU1FICcgKyBwYXJhbWV0ZXJzLnNoYWRlck5hbWUsXHJcblxyXG5cdFx0XHRjdXN0b21EZWZpbmVzXHJcblxyXG5cdFx0XS5maWx0ZXIoIGZpbHRlckVtcHR5TGluZSApLmpvaW4oICdcXG4nICk7XHJcblxyXG5cdFx0aWYgKCBwcmVmaXhGcmFnbWVudC5sZW5ndGggPiAwICkge1xyXG5cclxuXHRcdFx0cHJlZml4RnJhZ21lbnQgKz0gJ1xcbic7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9IGVsc2Uge1xyXG5cclxuXHRcdHByZWZpeFZlcnRleCA9IFtcclxuXHJcblx0XHRcdGdlbmVyYXRlUHJlY2lzaW9uKCBwYXJhbWV0ZXJzICksXHJcblxyXG5cdFx0XHQnI2RlZmluZSBTSEFERVJfVFlQRSAnICsgcGFyYW1ldGVycy5zaGFkZXJUeXBlLFxyXG5cdFx0XHQnI2RlZmluZSBTSEFERVJfTkFNRSAnICsgcGFyYW1ldGVycy5zaGFkZXJOYW1lLFxyXG5cclxuXHRcdFx0Y3VzdG9tRGVmaW5lcyxcclxuXHJcblx0XHRcdHBhcmFtZXRlcnMuZXh0ZW5zaW9uQ2xpcEN1bGxEaXN0YW5jZSA/ICcjZGVmaW5lIFVTRV9DTElQX0RJU1RBTkNFJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLmJhdGNoaW5nID8gJyNkZWZpbmUgVVNFX0JBVENISU5HJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLmJhdGNoaW5nQ29sb3IgPyAnI2RlZmluZSBVU0VfQkFUQ0hJTkdfQ09MT1InIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMuaW5zdGFuY2luZyA/ICcjZGVmaW5lIFVTRV9JTlNUQU5DSU5HJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLmluc3RhbmNpbmdDb2xvciA/ICcjZGVmaW5lIFVTRV9JTlNUQU5DSU5HX0NPTE9SJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLmluc3RhbmNpbmdNb3JwaCA/ICcjZGVmaW5lIFVTRV9JTlNUQU5DSU5HX01PUlBIJyA6ICcnLFxyXG5cclxuXHRcdFx0cGFyYW1ldGVycy51c2VGb2cgJiYgcGFyYW1ldGVycy5mb2cgPyAnI2RlZmluZSBVU0VfRk9HJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLnVzZUZvZyAmJiBwYXJhbWV0ZXJzLmZvZ0V4cDIgPyAnI2RlZmluZSBGT0dfRVhQMicgOiAnJyxcclxuXHJcblx0XHRcdHBhcmFtZXRlcnMubWFwID8gJyNkZWZpbmUgVVNFX01BUCcgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy5lbnZNYXAgPyAnI2RlZmluZSBVU0VfRU5WTUFQJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLmVudk1hcCA/ICcjZGVmaW5lICcgKyBlbnZNYXBNb2RlRGVmaW5lIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMubGlnaHRNYXAgPyAnI2RlZmluZSBVU0VfTElHSFRNQVAnIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMuYW9NYXAgPyAnI2RlZmluZSBVU0VfQU9NQVAnIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMuYnVtcE1hcCA/ICcjZGVmaW5lIFVTRV9CVU1QTUFQJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLm5vcm1hbE1hcCA/ICcjZGVmaW5lIFVTRV9OT1JNQUxNQVAnIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMubm9ybWFsTWFwT2JqZWN0U3BhY2UgPyAnI2RlZmluZSBVU0VfTk9STUFMTUFQX09CSkVDVFNQQUNFJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLm5vcm1hbE1hcFRhbmdlbnRTcGFjZSA/ICcjZGVmaW5lIFVTRV9OT1JNQUxNQVBfVEFOR0VOVFNQQUNFJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLmRpc3BsYWNlbWVudE1hcCA/ICcjZGVmaW5lIFVTRV9ESVNQTEFDRU1FTlRNQVAnIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMuZW1pc3NpdmVNYXAgPyAnI2RlZmluZSBVU0VfRU1JU1NJVkVNQVAnIDogJycsXHJcblxyXG5cdFx0XHRwYXJhbWV0ZXJzLmFuaXNvdHJvcHkgPyAnI2RlZmluZSBVU0VfQU5JU09UUk9QWScgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy5hbmlzb3Ryb3B5TWFwID8gJyNkZWZpbmUgVVNFX0FOSVNPVFJPUFlNQVAnIDogJycsXHJcblxyXG5cdFx0XHRwYXJhbWV0ZXJzLmNsZWFyY29hdE1hcCA/ICcjZGVmaW5lIFVTRV9DTEVBUkNPQVRNQVAnIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMuY2xlYXJjb2F0Um91Z2huZXNzTWFwID8gJyNkZWZpbmUgVVNFX0NMRUFSQ09BVF9ST1VHSE5FU1NNQVAnIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMuY2xlYXJjb2F0Tm9ybWFsTWFwID8gJyNkZWZpbmUgVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVAnIDogJycsXHJcblxyXG5cdFx0XHRwYXJhbWV0ZXJzLmlyaWRlc2NlbmNlTWFwID8gJyNkZWZpbmUgVVNFX0lSSURFU0NFTkNFTUFQJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwID8gJyNkZWZpbmUgVVNFX0lSSURFU0NFTkNFX1RISUNLTkVTU01BUCcgOiAnJyxcclxuXHJcblx0XHRcdHBhcmFtZXRlcnMuc3BlY3VsYXJNYXAgPyAnI2RlZmluZSBVU0VfU1BFQ1VMQVJNQVAnIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMuc3BlY3VsYXJDb2xvck1hcCA/ICcjZGVmaW5lIFVTRV9TUEVDVUxBUl9DT0xPUk1BUCcgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy5zcGVjdWxhckludGVuc2l0eU1hcCA/ICcjZGVmaW5lIFVTRV9TUEVDVUxBUl9JTlRFTlNJVFlNQVAnIDogJycsXHJcblxyXG5cdFx0XHRwYXJhbWV0ZXJzLnJvdWdobmVzc01hcCA/ICcjZGVmaW5lIFVTRV9ST1VHSE5FU1NNQVAnIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMubWV0YWxuZXNzTWFwID8gJyNkZWZpbmUgVVNFX01FVEFMTkVTU01BUCcgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy5hbHBoYU1hcCA/ICcjZGVmaW5lIFVTRV9BTFBIQU1BUCcgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy5hbHBoYUhhc2ggPyAnI2RlZmluZSBVU0VfQUxQSEFIQVNIJyA6ICcnLFxyXG5cclxuXHRcdFx0cGFyYW1ldGVycy50cmFuc21pc3Npb24gPyAnI2RlZmluZSBVU0VfVFJBTlNNSVNTSU9OJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLnRyYW5zbWlzc2lvbk1hcCA/ICcjZGVmaW5lIFVTRV9UUkFOU01JU1NJT05NQVAnIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMudGhpY2tuZXNzTWFwID8gJyNkZWZpbmUgVVNFX1RISUNLTkVTU01BUCcgOiAnJyxcclxuXHJcblx0XHRcdHBhcmFtZXRlcnMuc2hlZW5Db2xvck1hcCA/ICcjZGVmaW5lIFVTRV9TSEVFTl9DT0xPUk1BUCcgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy5zaGVlblJvdWdobmVzc01hcCA/ICcjZGVmaW5lIFVTRV9TSEVFTl9ST1VHSE5FU1NNQVAnIDogJycsXHJcblxyXG5cdFx0XHQvL1xyXG5cclxuXHRcdFx0cGFyYW1ldGVycy5tYXBVdiA/ICcjZGVmaW5lIE1BUF9VViAnICsgcGFyYW1ldGVycy5tYXBVdiA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLmFscGhhTWFwVXYgPyAnI2RlZmluZSBBTFBIQU1BUF9VViAnICsgcGFyYW1ldGVycy5hbHBoYU1hcFV2IDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMubGlnaHRNYXBVdiA/ICcjZGVmaW5lIExJR0hUTUFQX1VWICcgKyBwYXJhbWV0ZXJzLmxpZ2h0TWFwVXYgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy5hb01hcFV2ID8gJyNkZWZpbmUgQU9NQVBfVVYgJyArIHBhcmFtZXRlcnMuYW9NYXBVdiA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLmVtaXNzaXZlTWFwVXYgPyAnI2RlZmluZSBFTUlTU0lWRU1BUF9VViAnICsgcGFyYW1ldGVycy5lbWlzc2l2ZU1hcFV2IDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMuYnVtcE1hcFV2ID8gJyNkZWZpbmUgQlVNUE1BUF9VViAnICsgcGFyYW1ldGVycy5idW1wTWFwVXYgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy5ub3JtYWxNYXBVdiA/ICcjZGVmaW5lIE5PUk1BTE1BUF9VViAnICsgcGFyYW1ldGVycy5ub3JtYWxNYXBVdiA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLmRpc3BsYWNlbWVudE1hcFV2ID8gJyNkZWZpbmUgRElTUExBQ0VNRU5UTUFQX1VWICcgKyBwYXJhbWV0ZXJzLmRpc3BsYWNlbWVudE1hcFV2IDogJycsXHJcblxyXG5cdFx0XHRwYXJhbWV0ZXJzLm1ldGFsbmVzc01hcFV2ID8gJyNkZWZpbmUgTUVUQUxORVNTTUFQX1VWICcgKyBwYXJhbWV0ZXJzLm1ldGFsbmVzc01hcFV2IDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMucm91Z2huZXNzTWFwVXYgPyAnI2RlZmluZSBST1VHSE5FU1NNQVBfVVYgJyArIHBhcmFtZXRlcnMucm91Z2huZXNzTWFwVXYgOiAnJyxcclxuXHJcblx0XHRcdHBhcmFtZXRlcnMuYW5pc290cm9weU1hcFV2ID8gJyNkZWZpbmUgQU5JU09UUk9QWU1BUF9VViAnICsgcGFyYW1ldGVycy5hbmlzb3Ryb3B5TWFwVXYgOiAnJyxcclxuXHJcblx0XHRcdHBhcmFtZXRlcnMuY2xlYXJjb2F0TWFwVXYgPyAnI2RlZmluZSBDTEVBUkNPQVRNQVBfVVYgJyArIHBhcmFtZXRlcnMuY2xlYXJjb2F0TWFwVXYgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy5jbGVhcmNvYXROb3JtYWxNYXBVdiA/ICcjZGVmaW5lIENMRUFSQ09BVF9OT1JNQUxNQVBfVVYgJyArIHBhcmFtZXRlcnMuY2xlYXJjb2F0Tm9ybWFsTWFwVXYgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy5jbGVhcmNvYXRSb3VnaG5lc3NNYXBVdiA/ICcjZGVmaW5lIENMRUFSQ09BVF9ST1VHSE5FU1NNQVBfVVYgJyArIHBhcmFtZXRlcnMuY2xlYXJjb2F0Um91Z2huZXNzTWFwVXYgOiAnJyxcclxuXHJcblx0XHRcdHBhcmFtZXRlcnMuaXJpZGVzY2VuY2VNYXBVdiA/ICcjZGVmaW5lIElSSURFU0NFTkNFTUFQX1VWICcgKyBwYXJhbWV0ZXJzLmlyaWRlc2NlbmNlTWFwVXYgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcFV2ID8gJyNkZWZpbmUgSVJJREVTQ0VOQ0VfVEhJQ0tORVNTTUFQX1VWICcgKyBwYXJhbWV0ZXJzLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwVXYgOiAnJyxcclxuXHJcblx0XHRcdHBhcmFtZXRlcnMuc2hlZW5Db2xvck1hcFV2ID8gJyNkZWZpbmUgU0hFRU5fQ09MT1JNQVBfVVYgJyArIHBhcmFtZXRlcnMuc2hlZW5Db2xvck1hcFV2IDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMuc2hlZW5Sb3VnaG5lc3NNYXBVdiA/ICcjZGVmaW5lIFNIRUVOX1JPVUdITkVTU01BUF9VViAnICsgcGFyYW1ldGVycy5zaGVlblJvdWdobmVzc01hcFV2IDogJycsXHJcblxyXG5cdFx0XHRwYXJhbWV0ZXJzLnNwZWN1bGFyTWFwVXYgPyAnI2RlZmluZSBTUEVDVUxBUk1BUF9VViAnICsgcGFyYW1ldGVycy5zcGVjdWxhck1hcFV2IDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMuc3BlY3VsYXJDb2xvck1hcFV2ID8gJyNkZWZpbmUgU1BFQ1VMQVJfQ09MT1JNQVBfVVYgJyArIHBhcmFtZXRlcnMuc3BlY3VsYXJDb2xvck1hcFV2IDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMuc3BlY3VsYXJJbnRlbnNpdHlNYXBVdiA/ICcjZGVmaW5lIFNQRUNVTEFSX0lOVEVOU0lUWU1BUF9VViAnICsgcGFyYW1ldGVycy5zcGVjdWxhckludGVuc2l0eU1hcFV2IDogJycsXHJcblxyXG5cdFx0XHRwYXJhbWV0ZXJzLnRyYW5zbWlzc2lvbk1hcFV2ID8gJyNkZWZpbmUgVFJBTlNNSVNTSU9OTUFQX1VWICcgKyBwYXJhbWV0ZXJzLnRyYW5zbWlzc2lvbk1hcFV2IDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMudGhpY2tuZXNzTWFwVXYgPyAnI2RlZmluZSBUSElDS05FU1NNQVBfVVYgJyArIHBhcmFtZXRlcnMudGhpY2tuZXNzTWFwVXYgOiAnJyxcclxuXHJcblx0XHRcdC8vXHJcblxyXG5cdFx0XHRwYXJhbWV0ZXJzLnZlcnRleFRhbmdlbnRzICYmIHBhcmFtZXRlcnMuZmxhdFNoYWRpbmcgPT09IGZhbHNlID8gJyNkZWZpbmUgVVNFX1RBTkdFTlQnIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMudmVydGV4Q29sb3JzID8gJyNkZWZpbmUgVVNFX0NPTE9SJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLnZlcnRleEFscGhhcyA/ICcjZGVmaW5lIFVTRV9DT0xPUl9BTFBIQScgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy52ZXJ0ZXhVdjFzID8gJyNkZWZpbmUgVVNFX1VWMScgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy52ZXJ0ZXhVdjJzID8gJyNkZWZpbmUgVVNFX1VWMicgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy52ZXJ0ZXhVdjNzID8gJyNkZWZpbmUgVVNFX1VWMycgOiAnJyxcclxuXHJcblx0XHRcdHBhcmFtZXRlcnMucG9pbnRzVXZzID8gJyNkZWZpbmUgVVNFX1BPSU5UU19VVicgOiAnJyxcclxuXHJcblx0XHRcdHBhcmFtZXRlcnMuZmxhdFNoYWRpbmcgPyAnI2RlZmluZSBGTEFUX1NIQURFRCcgOiAnJyxcclxuXHJcblx0XHRcdHBhcmFtZXRlcnMuc2tpbm5pbmcgPyAnI2RlZmluZSBVU0VfU0tJTk5JTkcnIDogJycsXHJcblxyXG5cdFx0XHRwYXJhbWV0ZXJzLm1vcnBoVGFyZ2V0cyA/ICcjZGVmaW5lIFVTRV9NT1JQSFRBUkdFVFMnIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMubW9ycGhOb3JtYWxzICYmIHBhcmFtZXRlcnMuZmxhdFNoYWRpbmcgPT09IGZhbHNlID8gJyNkZWZpbmUgVVNFX01PUlBITk9STUFMUycgOiAnJyxcclxuXHRcdFx0KCBwYXJhbWV0ZXJzLm1vcnBoQ29sb3JzICkgPyAnI2RlZmluZSBVU0VfTU9SUEhDT0xPUlMnIDogJycsXHJcblx0XHRcdCggcGFyYW1ldGVycy5tb3JwaFRhcmdldHNDb3VudCA+IDAgKSA/ICcjZGVmaW5lIE1PUlBIVEFSR0VUU19URVhUVVJFX1NUUklERSAnICsgcGFyYW1ldGVycy5tb3JwaFRleHR1cmVTdHJpZGUgOiAnJyxcclxuXHRcdFx0KCBwYXJhbWV0ZXJzLm1vcnBoVGFyZ2V0c0NvdW50ID4gMCApID8gJyNkZWZpbmUgTU9SUEhUQVJHRVRTX0NPVU5UICcgKyBwYXJhbWV0ZXJzLm1vcnBoVGFyZ2V0c0NvdW50IDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMuZG91YmxlU2lkZWQgPyAnI2RlZmluZSBET1VCTEVfU0lERUQnIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMuZmxpcFNpZGVkID8gJyNkZWZpbmUgRkxJUF9TSURFRCcgOiAnJyxcclxuXHJcblx0XHRcdHBhcmFtZXRlcnMuc2hhZG93TWFwRW5hYmxlZCA/ICcjZGVmaW5lIFVTRV9TSEFET1dNQVAnIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMuc2hhZG93TWFwRW5hYmxlZCA/ICcjZGVmaW5lICcgKyBzaGFkb3dNYXBUeXBlRGVmaW5lIDogJycsXHJcblxyXG5cdFx0XHRwYXJhbWV0ZXJzLnNpemVBdHRlbnVhdGlvbiA/ICcjZGVmaW5lIFVTRV9TSVpFQVRURU5VQVRJT04nIDogJycsXHJcblxyXG5cdFx0XHRwYXJhbWV0ZXJzLm51bUxpZ2h0UHJvYmVzID4gMCA/ICcjZGVmaW5lIFVTRV9MSUdIVF9QUk9CRVMnIDogJycsXHJcblxyXG5cdFx0XHRwYXJhbWV0ZXJzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIgPyAnI2RlZmluZSBVU0VfTE9HREVQVEhCVUYnIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMucmV2ZXJzZURlcHRoQnVmZmVyID8gJyNkZWZpbmUgVVNFX1JFVkVSU0VERVBUSEJVRicgOiAnJyxcclxuXHJcblx0XHRcdCd1bmlmb3JtIG1hdDQgbW9kZWxNYXRyaXg7JyxcclxuXHRcdFx0J3VuaWZvcm0gbWF0NCBtb2RlbFZpZXdNYXRyaXg7JyxcclxuXHRcdFx0J3VuaWZvcm0gbWF0NCBwcm9qZWN0aW9uTWF0cml4OycsXHJcblx0XHRcdCd1bmlmb3JtIG1hdDQgdmlld01hdHJpeDsnLFxyXG5cdFx0XHQndW5pZm9ybSBtYXQzIG5vcm1hbE1hdHJpeDsnLFxyXG5cdFx0XHQndW5pZm9ybSB2ZWMzIGNhbWVyYVBvc2l0aW9uOycsXHJcblx0XHRcdCd1bmlmb3JtIGJvb2wgaXNPcnRob2dyYXBoaWM7JyxcclxuXHJcblx0XHRcdCcjaWZkZWYgVVNFX0lOU1RBTkNJTkcnLFxyXG5cclxuXHRcdFx0J1x0YXR0cmlidXRlIG1hdDQgaW5zdGFuY2VNYXRyaXg7JyxcclxuXHJcblx0XHRcdCcjZW5kaWYnLFxyXG5cclxuXHRcdFx0JyNpZmRlZiBVU0VfSU5TVEFOQ0lOR19DT0xPUicsXHJcblxyXG5cdFx0XHQnXHRhdHRyaWJ1dGUgdmVjMyBpbnN0YW5jZUNvbG9yOycsXHJcblxyXG5cdFx0XHQnI2VuZGlmJyxcclxuXHJcblx0XHRcdCcjaWZkZWYgVVNFX0lOU1RBTkNJTkdfTU9SUEgnLFxyXG5cclxuXHRcdFx0J1x0dW5pZm9ybSBzYW1wbGVyMkQgbW9ycGhUZXh0dXJlOycsXHJcblxyXG5cdFx0XHQnI2VuZGlmJyxcclxuXHJcblx0XHRcdCdhdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbjsnLFxyXG5cdFx0XHQnYXR0cmlidXRlIHZlYzMgbm9ybWFsOycsXHJcblx0XHRcdCdhdHRyaWJ1dGUgdmVjMiB1djsnLFxyXG5cclxuXHRcdFx0JyNpZmRlZiBVU0VfVVYxJyxcclxuXHJcblx0XHRcdCdcdGF0dHJpYnV0ZSB2ZWMyIHV2MTsnLFxyXG5cclxuXHRcdFx0JyNlbmRpZicsXHJcblxyXG5cdFx0XHQnI2lmZGVmIFVTRV9VVjInLFxyXG5cclxuXHRcdFx0J1x0YXR0cmlidXRlIHZlYzIgdXYyOycsXHJcblxyXG5cdFx0XHQnI2VuZGlmJyxcclxuXHJcblx0XHRcdCcjaWZkZWYgVVNFX1VWMycsXHJcblxyXG5cdFx0XHQnXHRhdHRyaWJ1dGUgdmVjMiB1djM7JyxcclxuXHJcblx0XHRcdCcjZW5kaWYnLFxyXG5cclxuXHRcdFx0JyNpZmRlZiBVU0VfVEFOR0VOVCcsXHJcblxyXG5cdFx0XHQnXHRhdHRyaWJ1dGUgdmVjNCB0YW5nZW50OycsXHJcblxyXG5cdFx0XHQnI2VuZGlmJyxcclxuXHJcblx0XHRcdCcjaWYgZGVmaW5lZCggVVNFX0NPTE9SX0FMUEhBICknLFxyXG5cclxuXHRcdFx0J1x0YXR0cmlidXRlIHZlYzQgY29sb3I7JyxcclxuXHJcblx0XHRcdCcjZWxpZiBkZWZpbmVkKCBVU0VfQ09MT1IgKScsXHJcblxyXG5cdFx0XHQnXHRhdHRyaWJ1dGUgdmVjMyBjb2xvcjsnLFxyXG5cclxuXHRcdFx0JyNlbmRpZicsXHJcblxyXG5cdFx0XHQnI2lmZGVmIFVTRV9TS0lOTklORycsXHJcblxyXG5cdFx0XHQnXHRhdHRyaWJ1dGUgdmVjNCBza2luSW5kZXg7JyxcclxuXHRcdFx0J1x0YXR0cmlidXRlIHZlYzQgc2tpbldlaWdodDsnLFxyXG5cclxuXHRcdFx0JyNlbmRpZicsXHJcblxyXG5cdFx0XHQnXFxuJ1xyXG5cclxuXHRcdF0uZmlsdGVyKCBmaWx0ZXJFbXB0eUxpbmUgKS5qb2luKCAnXFxuJyApO1xyXG5cclxuXHRcdHByZWZpeEZyYWdtZW50ID0gW1xyXG5cclxuXHRcdFx0Z2VuZXJhdGVQcmVjaXNpb24oIHBhcmFtZXRlcnMgKSxcclxuXHJcblx0XHRcdCcjZGVmaW5lIFNIQURFUl9UWVBFICcgKyBwYXJhbWV0ZXJzLnNoYWRlclR5cGUsXHJcblx0XHRcdCcjZGVmaW5lIFNIQURFUl9OQU1FICcgKyBwYXJhbWV0ZXJzLnNoYWRlck5hbWUsXHJcblxyXG5cdFx0XHRjdXN0b21EZWZpbmVzLFxyXG5cclxuXHRcdFx0cGFyYW1ldGVycy51c2VGb2cgJiYgcGFyYW1ldGVycy5mb2cgPyAnI2RlZmluZSBVU0VfRk9HJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLnVzZUZvZyAmJiBwYXJhbWV0ZXJzLmZvZ0V4cDIgPyAnI2RlZmluZSBGT0dfRVhQMicgOiAnJyxcclxuXHJcblx0XHRcdHBhcmFtZXRlcnMuYWxwaGFUb0NvdmVyYWdlID8gJyNkZWZpbmUgQUxQSEFfVE9fQ09WRVJBR0UnIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMubWFwID8gJyNkZWZpbmUgVVNFX01BUCcgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy5tYXRjYXAgPyAnI2RlZmluZSBVU0VfTUFUQ0FQJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLmVudk1hcCA/ICcjZGVmaW5lIFVTRV9FTlZNQVAnIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMuZW52TWFwID8gJyNkZWZpbmUgJyArIGVudk1hcFR5cGVEZWZpbmUgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy5lbnZNYXAgPyAnI2RlZmluZSAnICsgZW52TWFwTW9kZURlZmluZSA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLmVudk1hcCA/ICcjZGVmaW5lICcgKyBlbnZNYXBCbGVuZGluZ0RlZmluZSA6ICcnLFxyXG5cdFx0XHRlbnZNYXBDdWJlVVZTaXplID8gJyNkZWZpbmUgQ1VCRVVWX1RFWEVMX1dJRFRIICcgKyBlbnZNYXBDdWJlVVZTaXplLnRleGVsV2lkdGggOiAnJyxcclxuXHRcdFx0ZW52TWFwQ3ViZVVWU2l6ZSA/ICcjZGVmaW5lIENVQkVVVl9URVhFTF9IRUlHSFQgJyArIGVudk1hcEN1YmVVVlNpemUudGV4ZWxIZWlnaHQgOiAnJyxcclxuXHRcdFx0ZW52TWFwQ3ViZVVWU2l6ZSA/ICcjZGVmaW5lIENVQkVVVl9NQVhfTUlQICcgKyBlbnZNYXBDdWJlVVZTaXplLm1heE1pcCArICcuMCcgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy5saWdodE1hcCA/ICcjZGVmaW5lIFVTRV9MSUdIVE1BUCcgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy5hb01hcCA/ICcjZGVmaW5lIFVTRV9BT01BUCcgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy5idW1wTWFwID8gJyNkZWZpbmUgVVNFX0JVTVBNQVAnIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMubm9ybWFsTWFwID8gJyNkZWZpbmUgVVNFX05PUk1BTE1BUCcgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy5ub3JtYWxNYXBPYmplY3RTcGFjZSA/ICcjZGVmaW5lIFVTRV9OT1JNQUxNQVBfT0JKRUNUU1BBQ0UnIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMubm9ybWFsTWFwVGFuZ2VudFNwYWNlID8gJyNkZWZpbmUgVVNFX05PUk1BTE1BUF9UQU5HRU5UU1BBQ0UnIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMuZW1pc3NpdmVNYXAgPyAnI2RlZmluZSBVU0VfRU1JU1NJVkVNQVAnIDogJycsXHJcblxyXG5cdFx0XHRwYXJhbWV0ZXJzLmFuaXNvdHJvcHkgPyAnI2RlZmluZSBVU0VfQU5JU09UUk9QWScgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy5hbmlzb3Ryb3B5TWFwID8gJyNkZWZpbmUgVVNFX0FOSVNPVFJPUFlNQVAnIDogJycsXHJcblxyXG5cdFx0XHRwYXJhbWV0ZXJzLmNsZWFyY29hdCA/ICcjZGVmaW5lIFVTRV9DTEVBUkNPQVQnIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMuY2xlYXJjb2F0TWFwID8gJyNkZWZpbmUgVVNFX0NMRUFSQ09BVE1BUCcgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy5jbGVhcmNvYXRSb3VnaG5lc3NNYXAgPyAnI2RlZmluZSBVU0VfQ0xFQVJDT0FUX1JPVUdITkVTU01BUCcgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy5jbGVhcmNvYXROb3JtYWxNYXAgPyAnI2RlZmluZSBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUCcgOiAnJyxcclxuXHJcblx0XHRcdHBhcmFtZXRlcnMuZGlzcGVyc2lvbiA/ICcjZGVmaW5lIFVTRV9ESVNQRVJTSU9OJyA6ICcnLFxyXG5cclxuXHRcdFx0cGFyYW1ldGVycy5pcmlkZXNjZW5jZSA/ICcjZGVmaW5lIFVTRV9JUklERVNDRU5DRScgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy5pcmlkZXNjZW5jZU1hcCA/ICcjZGVmaW5lIFVTRV9JUklERVNDRU5DRU1BUCcgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcCA/ICcjZGVmaW5lIFVTRV9JUklERVNDRU5DRV9USElDS05FU1NNQVAnIDogJycsXHJcblxyXG5cdFx0XHRwYXJhbWV0ZXJzLnNwZWN1bGFyTWFwID8gJyNkZWZpbmUgVVNFX1NQRUNVTEFSTUFQJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLnNwZWN1bGFyQ29sb3JNYXAgPyAnI2RlZmluZSBVU0VfU1BFQ1VMQVJfQ09MT1JNQVAnIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMuc3BlY3VsYXJJbnRlbnNpdHlNYXAgPyAnI2RlZmluZSBVU0VfU1BFQ1VMQVJfSU5URU5TSVRZTUFQJyA6ICcnLFxyXG5cclxuXHRcdFx0cGFyYW1ldGVycy5yb3VnaG5lc3NNYXAgPyAnI2RlZmluZSBVU0VfUk9VR0hORVNTTUFQJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLm1ldGFsbmVzc01hcCA/ICcjZGVmaW5lIFVTRV9NRVRBTE5FU1NNQVAnIDogJycsXHJcblxyXG5cdFx0XHRwYXJhbWV0ZXJzLmFscGhhTWFwID8gJyNkZWZpbmUgVVNFX0FMUEhBTUFQJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLmFscGhhVGVzdCA/ICcjZGVmaW5lIFVTRV9BTFBIQVRFU1QnIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMuYWxwaGFIYXNoID8gJyNkZWZpbmUgVVNFX0FMUEhBSEFTSCcgOiAnJyxcclxuXHJcblx0XHRcdHBhcmFtZXRlcnMuc2hlZW4gPyAnI2RlZmluZSBVU0VfU0hFRU4nIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMuc2hlZW5Db2xvck1hcCA/ICcjZGVmaW5lIFVTRV9TSEVFTl9DT0xPUk1BUCcgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy5zaGVlblJvdWdobmVzc01hcCA/ICcjZGVmaW5lIFVTRV9TSEVFTl9ST1VHSE5FU1NNQVAnIDogJycsXHJcblxyXG5cdFx0XHRwYXJhbWV0ZXJzLnRyYW5zbWlzc2lvbiA/ICcjZGVmaW5lIFVTRV9UUkFOU01JU1NJT04nIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMudHJhbnNtaXNzaW9uTWFwID8gJyNkZWZpbmUgVVNFX1RSQU5TTUlTU0lPTk1BUCcgOiAnJyxcclxuXHRcdFx0cGFyYW1ldGVycy50aGlja25lc3NNYXAgPyAnI2RlZmluZSBVU0VfVEhJQ0tORVNTTUFQJyA6ICcnLFxyXG5cclxuXHRcdFx0cGFyYW1ldGVycy52ZXJ0ZXhUYW5nZW50cyAmJiBwYXJhbWV0ZXJzLmZsYXRTaGFkaW5nID09PSBmYWxzZSA/ICcjZGVmaW5lIFVTRV9UQU5HRU5UJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLnZlcnRleENvbG9ycyB8fCBwYXJhbWV0ZXJzLmluc3RhbmNpbmdDb2xvciB8fCBwYXJhbWV0ZXJzLmJhdGNoaW5nQ29sb3IgPyAnI2RlZmluZSBVU0VfQ09MT1InIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMudmVydGV4QWxwaGFzID8gJyNkZWZpbmUgVVNFX0NPTE9SX0FMUEhBJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLnZlcnRleFV2MXMgPyAnI2RlZmluZSBVU0VfVVYxJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLnZlcnRleFV2MnMgPyAnI2RlZmluZSBVU0VfVVYyJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLnZlcnRleFV2M3MgPyAnI2RlZmluZSBVU0VfVVYzJyA6ICcnLFxyXG5cclxuXHRcdFx0cGFyYW1ldGVycy5wb2ludHNVdnMgPyAnI2RlZmluZSBVU0VfUE9JTlRTX1VWJyA6ICcnLFxyXG5cclxuXHRcdFx0cGFyYW1ldGVycy5ncmFkaWVudE1hcCA/ICcjZGVmaW5lIFVTRV9HUkFESUVOVE1BUCcgOiAnJyxcclxuXHJcblx0XHRcdHBhcmFtZXRlcnMuZmxhdFNoYWRpbmcgPyAnI2RlZmluZSBGTEFUX1NIQURFRCcgOiAnJyxcclxuXHJcblx0XHRcdHBhcmFtZXRlcnMuZG91YmxlU2lkZWQgPyAnI2RlZmluZSBET1VCTEVfU0lERUQnIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMuZmxpcFNpZGVkID8gJyNkZWZpbmUgRkxJUF9TSURFRCcgOiAnJyxcclxuXHJcblx0XHRcdHBhcmFtZXRlcnMuc2hhZG93TWFwRW5hYmxlZCA/ICcjZGVmaW5lIFVTRV9TSEFET1dNQVAnIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMuc2hhZG93TWFwRW5hYmxlZCA/ICcjZGVmaW5lICcgKyBzaGFkb3dNYXBUeXBlRGVmaW5lIDogJycsXHJcblxyXG5cdFx0XHRwYXJhbWV0ZXJzLnByZW11bHRpcGxpZWRBbHBoYSA/ICcjZGVmaW5lIFBSRU1VTFRJUExJRURfQUxQSEEnIDogJycsXHJcblxyXG5cdFx0XHRwYXJhbWV0ZXJzLm51bUxpZ2h0UHJvYmVzID4gMCA/ICcjZGVmaW5lIFVTRV9MSUdIVF9QUk9CRVMnIDogJycsXHJcblxyXG5cdFx0XHRwYXJhbWV0ZXJzLmRlY29kZVZpZGVvVGV4dHVyZSA/ICcjZGVmaW5lIERFQ09ERV9WSURFT19URVhUVVJFJyA6ICcnLFxyXG5cdFx0XHRwYXJhbWV0ZXJzLmRlY29kZVZpZGVvVGV4dHVyZUVtaXNzaXZlID8gJyNkZWZpbmUgREVDT0RFX1ZJREVPX1RFWFRVUkVfRU1JU1NJVkUnIDogJycsXHJcblxyXG5cdFx0XHRwYXJhbWV0ZXJzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIgPyAnI2RlZmluZSBVU0VfTE9HREVQVEhCVUYnIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMucmV2ZXJzZURlcHRoQnVmZmVyID8gJyNkZWZpbmUgVVNFX1JFVkVSU0VERVBUSEJVRicgOiAnJyxcclxuXHJcblx0XHRcdCd1bmlmb3JtIG1hdDQgdmlld01hdHJpeDsnLFxyXG5cdFx0XHQndW5pZm9ybSB2ZWMzIGNhbWVyYVBvc2l0aW9uOycsXHJcblx0XHRcdCd1bmlmb3JtIGJvb2wgaXNPcnRob2dyYXBoaWM7JyxcclxuXHJcblx0XHRcdCggcGFyYW1ldGVycy50b25lTWFwcGluZyAhPT0gTm9Ub25lTWFwcGluZyApID8gJyNkZWZpbmUgVE9ORV9NQVBQSU5HJyA6ICcnLFxyXG5cdFx0XHQoIHBhcmFtZXRlcnMudG9uZU1hcHBpbmcgIT09IE5vVG9uZU1hcHBpbmcgKSA/IFNoYWRlckNodW5rWyAndG9uZW1hcHBpbmdfcGFyc19mcmFnbWVudCcgXSA6ICcnLCAvLyB0aGlzIGNvZGUgaXMgcmVxdWlyZWQgaGVyZSBiZWNhdXNlIGl0IGlzIHVzZWQgYnkgdGhlIHRvbmVNYXBwaW5nKCkgZnVuY3Rpb24gZGVmaW5lZCBiZWxvd1xyXG5cdFx0XHQoIHBhcmFtZXRlcnMudG9uZU1hcHBpbmcgIT09IE5vVG9uZU1hcHBpbmcgKSA/IGdldFRvbmVNYXBwaW5nRnVuY3Rpb24oICd0b25lTWFwcGluZycsIHBhcmFtZXRlcnMudG9uZU1hcHBpbmcgKSA6ICcnLFxyXG5cclxuXHRcdFx0cGFyYW1ldGVycy5kaXRoZXJpbmcgPyAnI2RlZmluZSBESVRIRVJJTkcnIDogJycsXHJcblx0XHRcdHBhcmFtZXRlcnMub3BhcXVlID8gJyNkZWZpbmUgT1BBUVVFJyA6ICcnLFxyXG5cclxuXHRcdFx0U2hhZGVyQ2h1bmtbICdjb2xvcnNwYWNlX3BhcnNfZnJhZ21lbnQnIF0sIC8vIHRoaXMgY29kZSBpcyByZXF1aXJlZCBoZXJlIGJlY2F1c2UgaXQgaXMgdXNlZCBieSB0aGUgdmFyaW91cyBlbmNvZGluZy9kZWNvZGluZyBmdW5jdGlvbiBkZWZpbmVkIGJlbG93XHJcblx0XHRcdGdldFRleGVsRW5jb2RpbmdGdW5jdGlvbiggJ2xpbmVhclRvT3V0cHV0VGV4ZWwnLCBwYXJhbWV0ZXJzLm91dHB1dENvbG9yU3BhY2UgKSxcclxuXHRcdFx0Z2V0THVtaW5hbmNlRnVuY3Rpb24oKSxcclxuXHJcblx0XHRcdHBhcmFtZXRlcnMudXNlRGVwdGhQYWNraW5nID8gJyNkZWZpbmUgREVQVEhfUEFDS0lORyAnICsgcGFyYW1ldGVycy5kZXB0aFBhY2tpbmcgOiAnJyxcclxuXHJcblx0XHRcdCdcXG4nXHJcblxyXG5cdFx0XS5maWx0ZXIoIGZpbHRlckVtcHR5TGluZSApLmpvaW4oICdcXG4nICk7XHJcblxyXG5cdH1cclxuXHJcblx0dmVydGV4U2hhZGVyID0gcmVzb2x2ZUluY2x1ZGVzKCB2ZXJ0ZXhTaGFkZXIgKTtcclxuXHR2ZXJ0ZXhTaGFkZXIgPSByZXBsYWNlTGlnaHROdW1zKCB2ZXJ0ZXhTaGFkZXIsIHBhcmFtZXRlcnMgKTtcclxuXHR2ZXJ0ZXhTaGFkZXIgPSByZXBsYWNlQ2xpcHBpbmdQbGFuZU51bXMoIHZlcnRleFNoYWRlciwgcGFyYW1ldGVycyApO1xyXG5cclxuXHRmcmFnbWVudFNoYWRlciA9IHJlc29sdmVJbmNsdWRlcyggZnJhZ21lbnRTaGFkZXIgKTtcclxuXHRmcmFnbWVudFNoYWRlciA9IHJlcGxhY2VMaWdodE51bXMoIGZyYWdtZW50U2hhZGVyLCBwYXJhbWV0ZXJzICk7XHJcblx0ZnJhZ21lbnRTaGFkZXIgPSByZXBsYWNlQ2xpcHBpbmdQbGFuZU51bXMoIGZyYWdtZW50U2hhZGVyLCBwYXJhbWV0ZXJzICk7XHJcblxyXG5cdHZlcnRleFNoYWRlciA9IHVucm9sbExvb3BzKCB2ZXJ0ZXhTaGFkZXIgKTtcclxuXHRmcmFnbWVudFNoYWRlciA9IHVucm9sbExvb3BzKCBmcmFnbWVudFNoYWRlciApO1xyXG5cclxuXHRpZiAoIHBhcmFtZXRlcnMuaXNSYXdTaGFkZXJNYXRlcmlhbCAhPT0gdHJ1ZSApIHtcclxuXHJcblx0XHQvLyBHTFNMIDMuMCBjb252ZXJzaW9uIGZvciBidWlsdC1pbiBtYXRlcmlhbHMgYW5kIFNoYWRlck1hdGVyaWFsXHJcblxyXG5cdFx0dmVyc2lvblN0cmluZyA9ICcjdmVyc2lvbiAzMDAgZXNcXG4nO1xyXG5cclxuXHRcdHByZWZpeFZlcnRleCA9IFtcclxuXHRcdFx0Y3VzdG9tVmVydGV4RXh0ZW5zaW9ucyxcclxuXHRcdFx0JyNkZWZpbmUgYXR0cmlidXRlIGluJyxcclxuXHRcdFx0JyNkZWZpbmUgdmFyeWluZyBvdXQnLFxyXG5cdFx0XHQnI2RlZmluZSB0ZXh0dXJlMkQgdGV4dHVyZSdcclxuXHRcdF0uam9pbiggJ1xcbicgKSArICdcXG4nICsgcHJlZml4VmVydGV4O1xyXG5cclxuXHRcdHByZWZpeEZyYWdtZW50ID0gW1xyXG5cdFx0XHQnI2RlZmluZSB2YXJ5aW5nIGluJyxcclxuXHRcdFx0KCBwYXJhbWV0ZXJzLmdsc2xWZXJzaW9uID09PSBHTFNMMyApID8gJycgOiAnbGF5b3V0KGxvY2F0aW9uID0gMCkgb3V0IGhpZ2hwIHZlYzQgcGNfZnJhZ0NvbG9yOycsXHJcblx0XHRcdCggcGFyYW1ldGVycy5nbHNsVmVyc2lvbiA9PT0gR0xTTDMgKSA/ICcnIDogJyNkZWZpbmUgZ2xfRnJhZ0NvbG9yIHBjX2ZyYWdDb2xvcicsXHJcblx0XHRcdCcjZGVmaW5lIGdsX0ZyYWdEZXB0aEVYVCBnbF9GcmFnRGVwdGgnLFxyXG5cdFx0XHQnI2RlZmluZSB0ZXh0dXJlMkQgdGV4dHVyZScsXHJcblx0XHRcdCcjZGVmaW5lIHRleHR1cmVDdWJlIHRleHR1cmUnLFxyXG5cdFx0XHQnI2RlZmluZSB0ZXh0dXJlMkRQcm9qIHRleHR1cmVQcm9qJyxcclxuXHRcdFx0JyNkZWZpbmUgdGV4dHVyZTJETG9kRVhUIHRleHR1cmVMb2QnLFxyXG5cdFx0XHQnI2RlZmluZSB0ZXh0dXJlMkRQcm9qTG9kRVhUIHRleHR1cmVQcm9qTG9kJyxcclxuXHRcdFx0JyNkZWZpbmUgdGV4dHVyZUN1YmVMb2RFWFQgdGV4dHVyZUxvZCcsXHJcblx0XHRcdCcjZGVmaW5lIHRleHR1cmUyREdyYWRFWFQgdGV4dHVyZUdyYWQnLFxyXG5cdFx0XHQnI2RlZmluZSB0ZXh0dXJlMkRQcm9qR3JhZEVYVCB0ZXh0dXJlUHJvakdyYWQnLFxyXG5cdFx0XHQnI2RlZmluZSB0ZXh0dXJlQ3ViZUdyYWRFWFQgdGV4dHVyZUdyYWQnXHJcblx0XHRdLmpvaW4oICdcXG4nICkgKyAnXFxuJyArIHByZWZpeEZyYWdtZW50O1xyXG5cclxuXHR9XHJcblxyXG5cdGNvbnN0IHZlcnRleEdsc2wgPSB2ZXJzaW9uU3RyaW5nICsgcHJlZml4VmVydGV4ICsgdmVydGV4U2hhZGVyO1xyXG5cdGNvbnN0IGZyYWdtZW50R2xzbCA9IHZlcnNpb25TdHJpbmcgKyBwcmVmaXhGcmFnbWVudCArIGZyYWdtZW50U2hhZGVyO1xyXG5cclxuXHQvLyBjb25zb2xlLmxvZyggJypWRVJURVgqJywgdmVydGV4R2xzbCApO1xyXG5cdC8vIGNvbnNvbGUubG9nKCAnKkZSQUdNRU5UKicsIGZyYWdtZW50R2xzbCApO1xyXG5cclxuXHRjb25zdCBnbFZlcnRleFNoYWRlciA9IFdlYkdMU2hhZGVyKCBnbCwgZ2wuVkVSVEVYX1NIQURFUiwgdmVydGV4R2xzbCApO1xyXG5cdGNvbnN0IGdsRnJhZ21lbnRTaGFkZXIgPSBXZWJHTFNoYWRlciggZ2wsIGdsLkZSQUdNRU5UX1NIQURFUiwgZnJhZ21lbnRHbHNsICk7XHJcblxyXG5cdGdsLmF0dGFjaFNoYWRlciggcHJvZ3JhbSwgZ2xWZXJ0ZXhTaGFkZXIgKTtcclxuXHRnbC5hdHRhY2hTaGFkZXIoIHByb2dyYW0sIGdsRnJhZ21lbnRTaGFkZXIgKTtcclxuXHJcblx0Ly8gRm9yY2UgYSBwYXJ0aWN1bGFyIGF0dHJpYnV0ZSB0byBpbmRleCAwLlxyXG5cclxuXHRpZiAoIHBhcmFtZXRlcnMuaW5kZXgwQXR0cmlidXRlTmFtZSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdGdsLmJpbmRBdHRyaWJMb2NhdGlvbiggcHJvZ3JhbSwgMCwgcGFyYW1ldGVycy5pbmRleDBBdHRyaWJ1dGVOYW1lICk7XHJcblxyXG5cdH0gZWxzZSBpZiAoIHBhcmFtZXRlcnMubW9ycGhUYXJnZXRzID09PSB0cnVlICkge1xyXG5cclxuXHRcdC8vIHByb2dyYW1zIHdpdGggbW9ycGhUYXJnZXRzIGRpc3BsYWNlIHBvc2l0aW9uIG91dCBvZiBhdHRyaWJ1dGUgMFxyXG5cdFx0Z2wuYmluZEF0dHJpYkxvY2F0aW9uKCBwcm9ncmFtLCAwLCAncG9zaXRpb24nICk7XHJcblxyXG5cdH1cclxuXHJcblx0Z2wubGlua1Byb2dyYW0oIHByb2dyYW0gKTtcclxuXHJcblx0ZnVuY3Rpb24gb25GaXJzdFVzZSggc2VsZiApIHtcclxuXHJcblx0XHQvLyBjaGVjayBmb3IgbGluayBlcnJvcnNcclxuXHRcdGlmICggcmVuZGVyZXIuZGVidWcuY2hlY2tTaGFkZXJFcnJvcnMgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBwcm9ncmFtTG9nID0gZ2wuZ2V0UHJvZ3JhbUluZm9Mb2coIHByb2dyYW0gKS50cmltKCk7XHJcblx0XHRcdGNvbnN0IHZlcnRleExvZyA9IGdsLmdldFNoYWRlckluZm9Mb2coIGdsVmVydGV4U2hhZGVyICkudHJpbSgpO1xyXG5cdFx0XHRjb25zdCBmcmFnbWVudExvZyA9IGdsLmdldFNoYWRlckluZm9Mb2coIGdsRnJhZ21lbnRTaGFkZXIgKS50cmltKCk7XHJcblxyXG5cdFx0XHRsZXQgcnVubmFibGUgPSB0cnVlO1xyXG5cdFx0XHRsZXQgaGF2ZURpYWdub3N0aWNzID0gdHJ1ZTtcclxuXHJcblx0XHRcdGlmICggZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlciggcHJvZ3JhbSwgZ2wuTElOS19TVEFUVVMgKSA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRcdHJ1bm5hYmxlID0gZmFsc2U7XHJcblxyXG5cdFx0XHRcdGlmICggdHlwZW9mIHJlbmRlcmVyLmRlYnVnLm9uU2hhZGVyRXJyb3IgPT09ICdmdW5jdGlvbicgKSB7XHJcblxyXG5cdFx0XHRcdFx0cmVuZGVyZXIuZGVidWcub25TaGFkZXJFcnJvciggZ2wsIHByb2dyYW0sIGdsVmVydGV4U2hhZGVyLCBnbEZyYWdtZW50U2hhZGVyICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gZGVmYXVsdCBlcnJvciByZXBvcnRpbmdcclxuXHJcblx0XHRcdFx0XHRjb25zdCB2ZXJ0ZXhFcnJvcnMgPSBnZXRTaGFkZXJFcnJvcnMoIGdsLCBnbFZlcnRleFNoYWRlciwgJ3ZlcnRleCcgKTtcclxuXHRcdFx0XHRcdGNvbnN0IGZyYWdtZW50RXJyb3JzID0gZ2V0U2hhZGVyRXJyb3JzKCBnbCwgZ2xGcmFnbWVudFNoYWRlciwgJ2ZyYWdtZW50JyApO1xyXG5cclxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoXHJcblx0XHRcdFx0XHRcdCdUSFJFRS5XZWJHTFByb2dyYW06IFNoYWRlciBFcnJvciAnICsgZ2wuZ2V0RXJyb3IoKSArICcgLSAnICtcclxuXHRcdFx0XHRcdFx0J1ZBTElEQVRFX1NUQVRVUyAnICsgZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlciggcHJvZ3JhbSwgZ2wuVkFMSURBVEVfU1RBVFVTICkgKyAnXFxuXFxuJyArXHJcblx0XHRcdFx0XHRcdCdNYXRlcmlhbCBOYW1lOiAnICsgc2VsZi5uYW1lICsgJ1xcbicgK1xyXG5cdFx0XHRcdFx0XHQnTWF0ZXJpYWwgVHlwZTogJyArIHNlbGYudHlwZSArICdcXG5cXG4nICtcclxuXHRcdFx0XHRcdFx0J1Byb2dyYW0gSW5mbyBMb2c6ICcgKyBwcm9ncmFtTG9nICsgJ1xcbicgK1xyXG5cdFx0XHRcdFx0XHR2ZXJ0ZXhFcnJvcnMgKyAnXFxuJyArXHJcblx0XHRcdFx0XHRcdGZyYWdtZW50RXJyb3JzXHJcblx0XHRcdFx0XHQpO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBwcm9ncmFtTG9nICE9PSAnJyApIHtcclxuXHJcblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xQcm9ncmFtOiBQcm9ncmFtIEluZm8gTG9nOicsIHByb2dyYW1Mb2cgKTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIHZlcnRleExvZyA9PT0gJycgfHwgZnJhZ21lbnRMb2cgPT09ICcnICkge1xyXG5cclxuXHRcdFx0XHRoYXZlRGlhZ25vc3RpY3MgPSBmYWxzZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggaGF2ZURpYWdub3N0aWNzICkge1xyXG5cclxuXHRcdFx0XHRzZWxmLmRpYWdub3N0aWNzID0ge1xyXG5cclxuXHRcdFx0XHRcdHJ1bm5hYmxlOiBydW5uYWJsZSxcclxuXHJcblx0XHRcdFx0XHRwcm9ncmFtTG9nOiBwcm9ncmFtTG9nLFxyXG5cclxuXHRcdFx0XHRcdHZlcnRleFNoYWRlcjoge1xyXG5cclxuXHRcdFx0XHRcdFx0bG9nOiB2ZXJ0ZXhMb2csXHJcblx0XHRcdFx0XHRcdHByZWZpeDogcHJlZml4VmVydGV4XHJcblxyXG5cdFx0XHRcdFx0fSxcclxuXHJcblx0XHRcdFx0XHRmcmFnbWVudFNoYWRlcjoge1xyXG5cclxuXHRcdFx0XHRcdFx0bG9nOiBmcmFnbWVudExvZyxcclxuXHRcdFx0XHRcdFx0cHJlZml4OiBwcmVmaXhGcmFnbWVudFxyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQ2xlYW4gdXBcclxuXHJcblx0XHQvLyBDcmFzaGVzIGluIGlPUzkgYW5kIGlPUzEwLiAjMTg0MDJcclxuXHRcdC8vIGdsLmRldGFjaFNoYWRlciggcHJvZ3JhbSwgZ2xWZXJ0ZXhTaGFkZXIgKTtcclxuXHRcdC8vIGdsLmRldGFjaFNoYWRlciggcHJvZ3JhbSwgZ2xGcmFnbWVudFNoYWRlciApO1xyXG5cclxuXHRcdGdsLmRlbGV0ZVNoYWRlciggZ2xWZXJ0ZXhTaGFkZXIgKTtcclxuXHRcdGdsLmRlbGV0ZVNoYWRlciggZ2xGcmFnbWVudFNoYWRlciApO1xyXG5cclxuXHRcdGNhY2hlZFVuaWZvcm1zID0gbmV3IFdlYkdMVW5pZm9ybXMoIGdsLCBwcm9ncmFtICk7XHJcblx0XHRjYWNoZWRBdHRyaWJ1dGVzID0gZmV0Y2hBdHRyaWJ1dGVMb2NhdGlvbnMoIGdsLCBwcm9ncmFtICk7XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gc2V0IHVwIGNhY2hpbmcgZm9yIHVuaWZvcm0gbG9jYXRpb25zXHJcblxyXG5cdGxldCBjYWNoZWRVbmlmb3JtcztcclxuXHJcblx0dGhpcy5nZXRVbmlmb3JtcyA9IGZ1bmN0aW9uICgpIHtcclxuXHJcblx0XHRpZiAoIGNhY2hlZFVuaWZvcm1zID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHQvLyBQb3B1bGF0ZXMgY2FjaGVkVW5pZm9ybXMgYW5kIGNhY2hlZEF0dHJpYnV0ZXNcclxuXHRcdFx0b25GaXJzdFVzZSggdGhpcyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gY2FjaGVkVW5pZm9ybXM7XHJcblxyXG5cdH07XHJcblxyXG5cdC8vIHNldCB1cCBjYWNoaW5nIGZvciBhdHRyaWJ1dGUgbG9jYXRpb25zXHJcblxyXG5cdGxldCBjYWNoZWRBdHRyaWJ1dGVzO1xyXG5cclxuXHR0aGlzLmdldEF0dHJpYnV0ZXMgPSBmdW5jdGlvbiAoKSB7XHJcblxyXG5cdFx0aWYgKCBjYWNoZWRBdHRyaWJ1dGVzID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHQvLyBQb3B1bGF0ZXMgY2FjaGVkQXR0cmlidXRlcyBhbmQgY2FjaGVkVW5pZm9ybXNcclxuXHRcdFx0b25GaXJzdFVzZSggdGhpcyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gY2FjaGVkQXR0cmlidXRlcztcclxuXHJcblx0fTtcclxuXHJcblx0Ly8gaW5kaWNhdGUgd2hlbiB0aGUgcHJvZ3JhbSBpcyByZWFkeSB0byBiZSB1c2VkLiBpZiB0aGUgS0hSX3BhcmFsbGVsX3NoYWRlcl9jb21waWxlIGV4dGVuc2lvbiBpc24ndCBzdXBwb3J0ZWQsXHJcblx0Ly8gZmxhZyB0aGUgcHJvZ3JhbSBhcyByZWFkeSBpbW1lZGlhdGVseS4gSXQgbWF5IGNhdXNlIGEgc3RhbGwgd2hlbiBpdCdzIGZpcnN0IHVzZWQuXHJcblxyXG5cdGxldCBwcm9ncmFtUmVhZHkgPSAoIHBhcmFtZXRlcnMucmVuZGVyZXJFeHRlbnNpb25QYXJhbGxlbFNoYWRlckNvbXBpbGUgPT09IGZhbHNlICk7XHJcblxyXG5cdHRoaXMuaXNSZWFkeSA9IGZ1bmN0aW9uICgpIHtcclxuXHJcblx0XHRpZiAoIHByb2dyYW1SZWFkeSA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRwcm9ncmFtUmVhZHkgPSBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKCBwcm9ncmFtLCBDT01QTEVUSU9OX1NUQVRVU19LSFIgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHByb2dyYW1SZWFkeTtcclxuXHJcblx0fTtcclxuXHJcblx0Ly8gZnJlZSByZXNvdXJjZVxyXG5cclxuXHR0aGlzLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XHJcblxyXG5cdFx0YmluZGluZ1N0YXRlcy5yZWxlYXNlU3RhdGVzT2ZQcm9ncmFtKCB0aGlzICk7XHJcblxyXG5cdFx0Z2wuZGVsZXRlUHJvZ3JhbSggcHJvZ3JhbSApO1xyXG5cdFx0dGhpcy5wcm9ncmFtID0gdW5kZWZpbmVkO1xyXG5cclxuXHR9O1xyXG5cclxuXHQvL1xyXG5cclxuXHR0aGlzLnR5cGUgPSBwYXJhbWV0ZXJzLnNoYWRlclR5cGU7XHJcblx0dGhpcy5uYW1lID0gcGFyYW1ldGVycy5zaGFkZXJOYW1lO1xyXG5cdHRoaXMuaWQgPSBwcm9ncmFtSWRDb3VudCArKztcclxuXHR0aGlzLmNhY2hlS2V5ID0gY2FjaGVLZXk7XHJcblx0dGhpcy51c2VkVGltZXMgPSAxO1xyXG5cdHRoaXMucHJvZ3JhbSA9IHByb2dyYW07XHJcblx0dGhpcy52ZXJ0ZXhTaGFkZXIgPSBnbFZlcnRleFNoYWRlcjtcclxuXHR0aGlzLmZyYWdtZW50U2hhZGVyID0gZ2xGcmFnbWVudFNoYWRlcjtcclxuXHJcblx0cmV0dXJuIHRoaXM7XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBXZWJHTFByb2dyYW0gfTtcclxuIiwibGV0IF9pZCA9IDA7XHJcblxyXG5jbGFzcyBXZWJHTFNoYWRlckNhY2hlIHtcclxuXHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblxyXG5cdFx0dGhpcy5zaGFkZXJDYWNoZSA9IG5ldyBNYXAoKTtcclxuXHRcdHRoaXMubWF0ZXJpYWxDYWNoZSA9IG5ldyBNYXAoKTtcclxuXHJcblx0fVxyXG5cclxuXHR1cGRhdGUoIG1hdGVyaWFsICkge1xyXG5cclxuXHRcdGNvbnN0IHZlcnRleFNoYWRlciA9IG1hdGVyaWFsLnZlcnRleFNoYWRlcjtcclxuXHRcdGNvbnN0IGZyYWdtZW50U2hhZGVyID0gbWF0ZXJpYWwuZnJhZ21lbnRTaGFkZXI7XHJcblxyXG5cdFx0Y29uc3QgdmVydGV4U2hhZGVyU3RhZ2UgPSB0aGlzLl9nZXRTaGFkZXJTdGFnZSggdmVydGV4U2hhZGVyICk7XHJcblx0XHRjb25zdCBmcmFnbWVudFNoYWRlclN0YWdlID0gdGhpcy5fZ2V0U2hhZGVyU3RhZ2UoIGZyYWdtZW50U2hhZGVyICk7XHJcblxyXG5cdFx0Y29uc3QgbWF0ZXJpYWxTaGFkZXJzID0gdGhpcy5fZ2V0U2hhZGVyQ2FjaGVGb3JNYXRlcmlhbCggbWF0ZXJpYWwgKTtcclxuXHJcblx0XHRpZiAoIG1hdGVyaWFsU2hhZGVycy5oYXMoIHZlcnRleFNoYWRlclN0YWdlICkgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0bWF0ZXJpYWxTaGFkZXJzLmFkZCggdmVydGV4U2hhZGVyU3RhZ2UgKTtcclxuXHRcdFx0dmVydGV4U2hhZGVyU3RhZ2UudXNlZFRpbWVzICsrO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIG1hdGVyaWFsU2hhZGVycy5oYXMoIGZyYWdtZW50U2hhZGVyU3RhZ2UgKSA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRtYXRlcmlhbFNoYWRlcnMuYWRkKCBmcmFnbWVudFNoYWRlclN0YWdlICk7XHJcblx0XHRcdGZyYWdtZW50U2hhZGVyU3RhZ2UudXNlZFRpbWVzICsrO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHRyZW1vdmUoIG1hdGVyaWFsICkge1xyXG5cclxuXHRcdGNvbnN0IG1hdGVyaWFsU2hhZGVycyA9IHRoaXMubWF0ZXJpYWxDYWNoZS5nZXQoIG1hdGVyaWFsICk7XHJcblxyXG5cdFx0Zm9yICggY29uc3Qgc2hhZGVyU3RhZ2Ugb2YgbWF0ZXJpYWxTaGFkZXJzICkge1xyXG5cclxuXHRcdFx0c2hhZGVyU3RhZ2UudXNlZFRpbWVzIC0tO1xyXG5cclxuXHRcdFx0aWYgKCBzaGFkZXJTdGFnZS51c2VkVGltZXMgPT09IDAgKSB0aGlzLnNoYWRlckNhY2hlLmRlbGV0ZSggc2hhZGVyU3RhZ2UuY29kZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLm1hdGVyaWFsQ2FjaGUuZGVsZXRlKCBtYXRlcmlhbCApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdGdldFZlcnRleFNoYWRlcklEKCBtYXRlcmlhbCApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fZ2V0U2hhZGVyU3RhZ2UoIG1hdGVyaWFsLnZlcnRleFNoYWRlciApLmlkO1xyXG5cclxuXHR9XHJcblxyXG5cdGdldEZyYWdtZW50U2hhZGVySUQoIG1hdGVyaWFsICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9nZXRTaGFkZXJTdGFnZSggbWF0ZXJpYWwuZnJhZ21lbnRTaGFkZXIgKS5pZDtcclxuXHJcblx0fVxyXG5cclxuXHRkaXNwb3NlKCkge1xyXG5cclxuXHRcdHRoaXMuc2hhZGVyQ2FjaGUuY2xlYXIoKTtcclxuXHRcdHRoaXMubWF0ZXJpYWxDYWNoZS5jbGVhcigpO1xyXG5cclxuXHR9XHJcblxyXG5cdF9nZXRTaGFkZXJDYWNoZUZvck1hdGVyaWFsKCBtYXRlcmlhbCApIHtcclxuXHJcblx0XHRjb25zdCBjYWNoZSA9IHRoaXMubWF0ZXJpYWxDYWNoZTtcclxuXHRcdGxldCBzZXQgPSBjYWNoZS5nZXQoIG1hdGVyaWFsICk7XHJcblxyXG5cdFx0aWYgKCBzZXQgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHNldCA9IG5ldyBTZXQoKTtcclxuXHRcdFx0Y2FjaGUuc2V0KCBtYXRlcmlhbCwgc2V0ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBzZXQ7XHJcblxyXG5cdH1cclxuXHJcblx0X2dldFNoYWRlclN0YWdlKCBjb2RlICkge1xyXG5cclxuXHRcdGNvbnN0IGNhY2hlID0gdGhpcy5zaGFkZXJDYWNoZTtcclxuXHRcdGxldCBzdGFnZSA9IGNhY2hlLmdldCggY29kZSApO1xyXG5cclxuXHRcdGlmICggc3RhZ2UgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHN0YWdlID0gbmV3IFdlYkdMU2hhZGVyU3RhZ2UoIGNvZGUgKTtcclxuXHRcdFx0Y2FjaGUuc2V0KCBjb2RlLCBzdGFnZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gc3RhZ2U7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmNsYXNzIFdlYkdMU2hhZGVyU3RhZ2Uge1xyXG5cclxuXHRjb25zdHJ1Y3RvciggY29kZSApIHtcclxuXHJcblx0XHR0aGlzLmlkID0gX2lkICsrO1xyXG5cclxuXHRcdHRoaXMuY29kZSA9IGNvZGU7XHJcblx0XHR0aGlzLnVzZWRUaW1lcyA9IDA7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFdlYkdMU2hhZGVyQ2FjaGUgfTtcclxuIiwiaW1wb3J0IHsgQmFja1NpZGUsIERvdWJsZVNpZGUsIEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nLCBPYmplY3RTcGFjZU5vcm1hbE1hcCwgVGFuZ2VudFNwYWNlTm9ybWFsTWFwLCBOb1RvbmVNYXBwaW5nLCBOb3JtYWxCbGVuZGluZywgTGluZWFyU1JHQkNvbG9yU3BhY2UsIFNSR0JUcmFuc2ZlciB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IExheWVycyB9IGZyb20gJy4uLy4uL2NvcmUvTGF5ZXJzLmpzJztcclxuaW1wb3J0IHsgV2ViR0xQcm9ncmFtIH0gZnJvbSAnLi9XZWJHTFByb2dyYW0uanMnO1xyXG5pbXBvcnQgeyBXZWJHTFNoYWRlckNhY2hlIH0gZnJvbSAnLi9XZWJHTFNoYWRlckNhY2hlLmpzJztcclxuaW1wb3J0IHsgU2hhZGVyTGliIH0gZnJvbSAnLi4vc2hhZGVycy9TaGFkZXJMaWIuanMnO1xyXG5pbXBvcnQgeyBVbmlmb3Jtc1V0aWxzIH0gZnJvbSAnLi4vc2hhZGVycy9Vbmlmb3Jtc1V0aWxzLmpzJztcclxuaW1wb3J0IHsgQ29sb3JNYW5hZ2VtZW50IH0gZnJvbSAnLi4vLi4vbWF0aC9Db2xvck1hbmFnZW1lbnQuanMnO1xyXG5cclxuZnVuY3Rpb24gV2ViR0xQcm9ncmFtcyggcmVuZGVyZXIsIGN1YmVtYXBzLCBjdWJldXZtYXBzLCBleHRlbnNpb25zLCBjYXBhYmlsaXRpZXMsIGJpbmRpbmdTdGF0ZXMsIGNsaXBwaW5nICkge1xyXG5cclxuXHRjb25zdCBfcHJvZ3JhbUxheWVycyA9IG5ldyBMYXllcnMoKTtcclxuXHRjb25zdCBfY3VzdG9tU2hhZGVycyA9IG5ldyBXZWJHTFNoYWRlckNhY2hlKCk7XHJcblx0Y29uc3QgX2FjdGl2ZUNoYW5uZWxzID0gbmV3IFNldCgpO1xyXG5cdGNvbnN0IHByb2dyYW1zID0gW107XHJcblxyXG5cdGNvbnN0IGxvZ2FyaXRobWljRGVwdGhCdWZmZXIgPSBjYXBhYmlsaXRpZXMubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcjtcclxuXHRjb25zdCBTVVBQT1JUU19WRVJURVhfVEVYVFVSRVMgPSBjYXBhYmlsaXRpZXMudmVydGV4VGV4dHVyZXM7XHJcblxyXG5cdGxldCBwcmVjaXNpb24gPSBjYXBhYmlsaXRpZXMucHJlY2lzaW9uO1xyXG5cclxuXHRjb25zdCBzaGFkZXJJRHMgPSB7XHJcblx0XHRNZXNoRGVwdGhNYXRlcmlhbDogJ2RlcHRoJyxcclxuXHRcdE1lc2hEaXN0YW5jZU1hdGVyaWFsOiAnZGlzdGFuY2VSR0JBJyxcclxuXHRcdE1lc2hOb3JtYWxNYXRlcmlhbDogJ25vcm1hbCcsXHJcblx0XHRNZXNoQmFzaWNNYXRlcmlhbDogJ2Jhc2ljJyxcclxuXHRcdE1lc2hMYW1iZXJ0TWF0ZXJpYWw6ICdsYW1iZXJ0JyxcclxuXHRcdE1lc2hQaG9uZ01hdGVyaWFsOiAncGhvbmcnLFxyXG5cdFx0TWVzaFRvb25NYXRlcmlhbDogJ3Rvb24nLFxyXG5cdFx0TWVzaFN0YW5kYXJkTWF0ZXJpYWw6ICdwaHlzaWNhbCcsXHJcblx0XHRNZXNoUGh5c2ljYWxNYXRlcmlhbDogJ3BoeXNpY2FsJyxcclxuXHRcdE1lc2hNYXRjYXBNYXRlcmlhbDogJ21hdGNhcCcsXHJcblx0XHRMaW5lQmFzaWNNYXRlcmlhbDogJ2Jhc2ljJyxcclxuXHRcdExpbmVEYXNoZWRNYXRlcmlhbDogJ2Rhc2hlZCcsXHJcblx0XHRQb2ludHNNYXRlcmlhbDogJ3BvaW50cycsXHJcblx0XHRTaGFkb3dNYXRlcmlhbDogJ3NoYWRvdycsXHJcblx0XHRTcHJpdGVNYXRlcmlhbDogJ3Nwcml0ZSdcclxuXHR9O1xyXG5cclxuXHRmdW5jdGlvbiBnZXRDaGFubmVsKCB2YWx1ZSApIHtcclxuXHJcblx0XHRfYWN0aXZlQ2hhbm5lbHMuYWRkKCB2YWx1ZSApO1xyXG5cclxuXHRcdGlmICggdmFsdWUgPT09IDAgKSByZXR1cm4gJ3V2JztcclxuXHJcblx0XHRyZXR1cm4gYHV2JHsgdmFsdWUgfWA7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gZ2V0UGFyYW1ldGVycyggbWF0ZXJpYWwsIGxpZ2h0cywgc2hhZG93cywgc2NlbmUsIG9iamVjdCApIHtcclxuXHJcblx0XHRjb25zdCBmb2cgPSBzY2VuZS5mb2c7XHJcblx0XHRjb25zdCBnZW9tZXRyeSA9IG9iamVjdC5nZW9tZXRyeTtcclxuXHRcdGNvbnN0IGVudmlyb25tZW50ID0gbWF0ZXJpYWwuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCA/IHNjZW5lLmVudmlyb25tZW50IDogbnVsbDtcclxuXHJcblx0XHRjb25zdCBlbnZNYXAgPSAoIG1hdGVyaWFsLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwgPyBjdWJldXZtYXBzIDogY3ViZW1hcHMgKS5nZXQoIG1hdGVyaWFsLmVudk1hcCB8fCBlbnZpcm9ubWVudCApO1xyXG5cdFx0Y29uc3QgZW52TWFwQ3ViZVVWSGVpZ2h0ID0gKCAhISBlbnZNYXAgKSAmJiAoIGVudk1hcC5tYXBwaW5nID09PSBDdWJlVVZSZWZsZWN0aW9uTWFwcGluZyApID8gZW52TWFwLmltYWdlLmhlaWdodCA6IG51bGw7XHJcblxyXG5cdFx0Y29uc3Qgc2hhZGVySUQgPSBzaGFkZXJJRHNbIG1hdGVyaWFsLnR5cGUgXTtcclxuXHJcblx0XHQvLyBoZXVyaXN0aWNzIHRvIGNyZWF0ZSBzaGFkZXIgcGFyYW1ldGVycyBhY2NvcmRpbmcgdG8gbGlnaHRzIGluIHRoZSBzY2VuZVxyXG5cdFx0Ly8gKG5vdCB0byBibG93IG92ZXIgbWF4TGlnaHRzIGJ1ZGdldClcclxuXHJcblx0XHRpZiAoIG1hdGVyaWFsLnByZWNpc2lvbiAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHByZWNpc2lvbiA9IGNhcGFiaWxpdGllcy5nZXRNYXhQcmVjaXNpb24oIG1hdGVyaWFsLnByZWNpc2lvbiApO1xyXG5cclxuXHRcdFx0aWYgKCBwcmVjaXNpb24gIT09IG1hdGVyaWFsLnByZWNpc2lvbiApIHtcclxuXHJcblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xQcm9ncmFtLmdldFBhcmFtZXRlcnM6JywgbWF0ZXJpYWwucHJlY2lzaW9uLCAnbm90IHN1cHBvcnRlZCwgdXNpbmcnLCBwcmVjaXNpb24sICdpbnN0ZWFkLicgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCBtb3JwaEF0dHJpYnV0ZSA9IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbiB8fCBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMubm9ybWFsIHx8IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5jb2xvcjtcclxuXHRcdGNvbnN0IG1vcnBoVGFyZ2V0c0NvdW50ID0gKCBtb3JwaEF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkgPyBtb3JwaEF0dHJpYnV0ZS5sZW5ndGggOiAwO1xyXG5cclxuXHRcdGxldCBtb3JwaFRleHR1cmVTdHJpZGUgPSAwO1xyXG5cclxuXHRcdGlmICggZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uICE9PSB1bmRlZmluZWQgKSBtb3JwaFRleHR1cmVTdHJpZGUgPSAxO1xyXG5cdFx0aWYgKCBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMubm9ybWFsICE9PSB1bmRlZmluZWQgKSBtb3JwaFRleHR1cmVTdHJpZGUgPSAyO1xyXG5cdFx0aWYgKCBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMuY29sb3IgIT09IHVuZGVmaW5lZCApIG1vcnBoVGV4dHVyZVN0cmlkZSA9IDM7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRsZXQgdmVydGV4U2hhZGVyLCBmcmFnbWVudFNoYWRlcjtcclxuXHRcdGxldCBjdXN0b21WZXJ0ZXhTaGFkZXJJRCwgY3VzdG9tRnJhZ21lbnRTaGFkZXJJRDtcclxuXHJcblx0XHRpZiAoIHNoYWRlcklEICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgc2hhZGVyID0gU2hhZGVyTGliWyBzaGFkZXJJRCBdO1xyXG5cclxuXHRcdFx0dmVydGV4U2hhZGVyID0gc2hhZGVyLnZlcnRleFNoYWRlcjtcclxuXHRcdFx0ZnJhZ21lbnRTaGFkZXIgPSBzaGFkZXIuZnJhZ21lbnRTaGFkZXI7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHZlcnRleFNoYWRlciA9IG1hdGVyaWFsLnZlcnRleFNoYWRlcjtcclxuXHRcdFx0ZnJhZ21lbnRTaGFkZXIgPSBtYXRlcmlhbC5mcmFnbWVudFNoYWRlcjtcclxuXHJcblx0XHRcdF9jdXN0b21TaGFkZXJzLnVwZGF0ZSggbWF0ZXJpYWwgKTtcclxuXHJcblx0XHRcdGN1c3RvbVZlcnRleFNoYWRlcklEID0gX2N1c3RvbVNoYWRlcnMuZ2V0VmVydGV4U2hhZGVySUQoIG1hdGVyaWFsICk7XHJcblx0XHRcdGN1c3RvbUZyYWdtZW50U2hhZGVySUQgPSBfY3VzdG9tU2hhZGVycy5nZXRGcmFnbWVudFNoYWRlcklEKCBtYXRlcmlhbCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBjdXJyZW50UmVuZGVyVGFyZ2V0ID0gcmVuZGVyZXIuZ2V0UmVuZGVyVGFyZ2V0KCk7XHJcblx0XHRjb25zdCByZXZlcnNlRGVwdGhCdWZmZXIgPSByZW5kZXJlci5zdGF0ZS5idWZmZXJzLmRlcHRoLmdldFJldmVyc2VkKCk7XHJcblxyXG5cdFx0Y29uc3QgSVNfSU5TVEFOQ0VETUVTSCA9IG9iamVjdC5pc0luc3RhbmNlZE1lc2ggPT09IHRydWU7XHJcblx0XHRjb25zdCBJU19CQVRDSEVETUVTSCA9IG9iamVjdC5pc0JhdGNoZWRNZXNoID09PSB0cnVlO1xyXG5cclxuXHRcdGNvbnN0IEhBU19NQVAgPSAhISBtYXRlcmlhbC5tYXA7XHJcblx0XHRjb25zdCBIQVNfTUFUQ0FQID0gISEgbWF0ZXJpYWwubWF0Y2FwO1xyXG5cdFx0Y29uc3QgSEFTX0VOVk1BUCA9ICEhIGVudk1hcDtcclxuXHRcdGNvbnN0IEhBU19BT01BUCA9ICEhIG1hdGVyaWFsLmFvTWFwO1xyXG5cdFx0Y29uc3QgSEFTX0xJR0hUTUFQID0gISEgbWF0ZXJpYWwubGlnaHRNYXA7XHJcblx0XHRjb25zdCBIQVNfQlVNUE1BUCA9ICEhIG1hdGVyaWFsLmJ1bXBNYXA7XHJcblx0XHRjb25zdCBIQVNfTk9STUFMTUFQID0gISEgbWF0ZXJpYWwubm9ybWFsTWFwO1xyXG5cdFx0Y29uc3QgSEFTX0RJU1BMQUNFTUVOVE1BUCA9ICEhIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcDtcclxuXHRcdGNvbnN0IEhBU19FTUlTU0lWRU1BUCA9ICEhIG1hdGVyaWFsLmVtaXNzaXZlTWFwO1xyXG5cclxuXHRcdGNvbnN0IEhBU19NRVRBTE5FU1NNQVAgPSAhISBtYXRlcmlhbC5tZXRhbG5lc3NNYXA7XHJcblx0XHRjb25zdCBIQVNfUk9VR0hORVNTTUFQID0gISEgbWF0ZXJpYWwucm91Z2huZXNzTWFwO1xyXG5cclxuXHRcdGNvbnN0IEhBU19BTklTT1RST1BZID0gbWF0ZXJpYWwuYW5pc290cm9weSA+IDA7XHJcblx0XHRjb25zdCBIQVNfQ0xFQVJDT0FUID0gbWF0ZXJpYWwuY2xlYXJjb2F0ID4gMDtcclxuXHRcdGNvbnN0IEhBU19ESVNQRVJTSU9OID0gbWF0ZXJpYWwuZGlzcGVyc2lvbiA+IDA7XHJcblx0XHRjb25zdCBIQVNfSVJJREVTQ0VOQ0UgPSBtYXRlcmlhbC5pcmlkZXNjZW5jZSA+IDA7XHJcblx0XHRjb25zdCBIQVNfU0hFRU4gPSBtYXRlcmlhbC5zaGVlbiA+IDA7XHJcblx0XHRjb25zdCBIQVNfVFJBTlNNSVNTSU9OID0gbWF0ZXJpYWwudHJhbnNtaXNzaW9uID4gMDtcclxuXHJcblx0XHRjb25zdCBIQVNfQU5JU09UUk9QWU1BUCA9IEhBU19BTklTT1RST1BZICYmICEhIG1hdGVyaWFsLmFuaXNvdHJvcHlNYXA7XHJcblxyXG5cdFx0Y29uc3QgSEFTX0NMRUFSQ09BVE1BUCA9IEhBU19DTEVBUkNPQVQgJiYgISEgbWF0ZXJpYWwuY2xlYXJjb2F0TWFwO1xyXG5cdFx0Y29uc3QgSEFTX0NMRUFSQ09BVF9OT1JNQUxNQVAgPSBIQVNfQ0xFQVJDT0FUICYmICEhIG1hdGVyaWFsLmNsZWFyY29hdE5vcm1hbE1hcDtcclxuXHRcdGNvbnN0IEhBU19DTEVBUkNPQVRfUk9VR0hORVNTTUFQID0gSEFTX0NMRUFSQ09BVCAmJiAhISBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3NNYXA7XHJcblxyXG5cdFx0Y29uc3QgSEFTX0lSSURFU0NFTkNFTUFQID0gSEFTX0lSSURFU0NFTkNFICYmICEhIG1hdGVyaWFsLmlyaWRlc2NlbmNlTWFwO1xyXG5cdFx0Y29uc3QgSEFTX0lSSURFU0NFTkNFX1RISUNLTkVTU01BUCA9IEhBU19JUklERVNDRU5DRSAmJiAhISBtYXRlcmlhbC5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcDtcclxuXHJcblx0XHRjb25zdCBIQVNfU0hFRU5fQ09MT1JNQVAgPSBIQVNfU0hFRU4gJiYgISEgbWF0ZXJpYWwuc2hlZW5Db2xvck1hcDtcclxuXHRcdGNvbnN0IEhBU19TSEVFTl9ST1VHSE5FU1NNQVAgPSBIQVNfU0hFRU4gJiYgISEgbWF0ZXJpYWwuc2hlZW5Sb3VnaG5lc3NNYXA7XHJcblxyXG5cdFx0Y29uc3QgSEFTX1NQRUNVTEFSTUFQID0gISEgbWF0ZXJpYWwuc3BlY3VsYXJNYXA7XHJcblx0XHRjb25zdCBIQVNfU1BFQ1VMQVJfQ09MT1JNQVAgPSAhISBtYXRlcmlhbC5zcGVjdWxhckNvbG9yTWFwO1xyXG5cdFx0Y29uc3QgSEFTX1NQRUNVTEFSX0lOVEVOU0lUWU1BUCA9ICEhIG1hdGVyaWFsLnNwZWN1bGFySW50ZW5zaXR5TWFwO1xyXG5cclxuXHRcdGNvbnN0IEhBU19UUkFOU01JU1NJT05NQVAgPSBIQVNfVFJBTlNNSVNTSU9OICYmICEhIG1hdGVyaWFsLnRyYW5zbWlzc2lvbk1hcDtcclxuXHRcdGNvbnN0IEhBU19USElDS05FU1NNQVAgPSBIQVNfVFJBTlNNSVNTSU9OICYmICEhIG1hdGVyaWFsLnRoaWNrbmVzc01hcDtcclxuXHJcblx0XHRjb25zdCBIQVNfR1JBRElFTlRNQVAgPSAhISBtYXRlcmlhbC5ncmFkaWVudE1hcDtcclxuXHJcblx0XHRjb25zdCBIQVNfQUxQSEFNQVAgPSAhISBtYXRlcmlhbC5hbHBoYU1hcDtcclxuXHJcblx0XHRjb25zdCBIQVNfQUxQSEFURVNUID0gbWF0ZXJpYWwuYWxwaGFUZXN0ID4gMDtcclxuXHJcblx0XHRjb25zdCBIQVNfQUxQSEFIQVNIID0gISEgbWF0ZXJpYWwuYWxwaGFIYXNoO1xyXG5cclxuXHRcdGNvbnN0IEhBU19FWFRFTlNJT05TID0gISEgbWF0ZXJpYWwuZXh0ZW5zaW9ucztcclxuXHJcblx0XHRsZXQgdG9uZU1hcHBpbmcgPSBOb1RvbmVNYXBwaW5nO1xyXG5cclxuXHRcdGlmICggbWF0ZXJpYWwudG9uZU1hcHBlZCApIHtcclxuXHJcblx0XHRcdGlmICggY3VycmVudFJlbmRlclRhcmdldCA9PT0gbnVsbCB8fCBjdXJyZW50UmVuZGVyVGFyZ2V0LmlzWFJSZW5kZXJUYXJnZXQgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdHRvbmVNYXBwaW5nID0gcmVuZGVyZXIudG9uZU1hcHBpbmc7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHBhcmFtZXRlcnMgPSB7XHJcblxyXG5cdFx0XHRzaGFkZXJJRDogc2hhZGVySUQsXHJcblx0XHRcdHNoYWRlclR5cGU6IG1hdGVyaWFsLnR5cGUsXHJcblx0XHRcdHNoYWRlck5hbWU6IG1hdGVyaWFsLm5hbWUsXHJcblxyXG5cdFx0XHR2ZXJ0ZXhTaGFkZXI6IHZlcnRleFNoYWRlcixcclxuXHRcdFx0ZnJhZ21lbnRTaGFkZXI6IGZyYWdtZW50U2hhZGVyLFxyXG5cdFx0XHRkZWZpbmVzOiBtYXRlcmlhbC5kZWZpbmVzLFxyXG5cclxuXHRcdFx0Y3VzdG9tVmVydGV4U2hhZGVySUQ6IGN1c3RvbVZlcnRleFNoYWRlcklELFxyXG5cdFx0XHRjdXN0b21GcmFnbWVudFNoYWRlcklEOiBjdXN0b21GcmFnbWVudFNoYWRlcklELFxyXG5cclxuXHRcdFx0aXNSYXdTaGFkZXJNYXRlcmlhbDogbWF0ZXJpYWwuaXNSYXdTaGFkZXJNYXRlcmlhbCA9PT0gdHJ1ZSxcclxuXHRcdFx0Z2xzbFZlcnNpb246IG1hdGVyaWFsLmdsc2xWZXJzaW9uLFxyXG5cclxuXHRcdFx0cHJlY2lzaW9uOiBwcmVjaXNpb24sXHJcblxyXG5cdFx0XHRiYXRjaGluZzogSVNfQkFUQ0hFRE1FU0gsXHJcblx0XHRcdGJhdGNoaW5nQ29sb3I6IElTX0JBVENIRURNRVNIICYmIG9iamVjdC5fY29sb3JzVGV4dHVyZSAhPT0gbnVsbCxcclxuXHRcdFx0aW5zdGFuY2luZzogSVNfSU5TVEFOQ0VETUVTSCxcclxuXHRcdFx0aW5zdGFuY2luZ0NvbG9yOiBJU19JTlNUQU5DRURNRVNIICYmIG9iamVjdC5pbnN0YW5jZUNvbG9yICE9PSBudWxsLFxyXG5cdFx0XHRpbnN0YW5jaW5nTW9ycGg6IElTX0lOU1RBTkNFRE1FU0ggJiYgb2JqZWN0Lm1vcnBoVGV4dHVyZSAhPT0gbnVsbCxcclxuXHJcblx0XHRcdHN1cHBvcnRzVmVydGV4VGV4dHVyZXM6IFNVUFBPUlRTX1ZFUlRFWF9URVhUVVJFUyxcclxuXHRcdFx0b3V0cHV0Q29sb3JTcGFjZTogKCBjdXJyZW50UmVuZGVyVGFyZ2V0ID09PSBudWxsICkgPyByZW5kZXJlci5vdXRwdXRDb2xvclNwYWNlIDogKCBjdXJyZW50UmVuZGVyVGFyZ2V0LmlzWFJSZW5kZXJUYXJnZXQgPT09IHRydWUgPyBjdXJyZW50UmVuZGVyVGFyZ2V0LnRleHR1cmUuY29sb3JTcGFjZSA6IExpbmVhclNSR0JDb2xvclNwYWNlICksXHJcblx0XHRcdGFscGhhVG9Db3ZlcmFnZTogISEgbWF0ZXJpYWwuYWxwaGFUb0NvdmVyYWdlLFxyXG5cclxuXHRcdFx0bWFwOiBIQVNfTUFQLFxyXG5cdFx0XHRtYXRjYXA6IEhBU19NQVRDQVAsXHJcblx0XHRcdGVudk1hcDogSEFTX0VOVk1BUCxcclxuXHRcdFx0ZW52TWFwTW9kZTogSEFTX0VOVk1BUCAmJiBlbnZNYXAubWFwcGluZyxcclxuXHRcdFx0ZW52TWFwQ3ViZVVWSGVpZ2h0OiBlbnZNYXBDdWJlVVZIZWlnaHQsXHJcblx0XHRcdGFvTWFwOiBIQVNfQU9NQVAsXHJcblx0XHRcdGxpZ2h0TWFwOiBIQVNfTElHSFRNQVAsXHJcblx0XHRcdGJ1bXBNYXA6IEhBU19CVU1QTUFQLFxyXG5cdFx0XHRub3JtYWxNYXA6IEhBU19OT1JNQUxNQVAsXHJcblx0XHRcdGRpc3BsYWNlbWVudE1hcDogU1VQUE9SVFNfVkVSVEVYX1RFWFRVUkVTICYmIEhBU19ESVNQTEFDRU1FTlRNQVAsXHJcblx0XHRcdGVtaXNzaXZlTWFwOiBIQVNfRU1JU1NJVkVNQVAsXHJcblxyXG5cdFx0XHRub3JtYWxNYXBPYmplY3RTcGFjZTogSEFTX05PUk1BTE1BUCAmJiBtYXRlcmlhbC5ub3JtYWxNYXBUeXBlID09PSBPYmplY3RTcGFjZU5vcm1hbE1hcCxcclxuXHRcdFx0bm9ybWFsTWFwVGFuZ2VudFNwYWNlOiBIQVNfTk9STUFMTUFQICYmIG1hdGVyaWFsLm5vcm1hbE1hcFR5cGUgPT09IFRhbmdlbnRTcGFjZU5vcm1hbE1hcCxcclxuXHJcblx0XHRcdG1ldGFsbmVzc01hcDogSEFTX01FVEFMTkVTU01BUCxcclxuXHRcdFx0cm91Z2huZXNzTWFwOiBIQVNfUk9VR0hORVNTTUFQLFxyXG5cclxuXHRcdFx0YW5pc290cm9weTogSEFTX0FOSVNPVFJPUFksXHJcblx0XHRcdGFuaXNvdHJvcHlNYXA6IEhBU19BTklTT1RST1BZTUFQLFxyXG5cclxuXHRcdFx0Y2xlYXJjb2F0OiBIQVNfQ0xFQVJDT0FULFxyXG5cdFx0XHRjbGVhcmNvYXRNYXA6IEhBU19DTEVBUkNPQVRNQVAsXHJcblx0XHRcdGNsZWFyY29hdE5vcm1hbE1hcDogSEFTX0NMRUFSQ09BVF9OT1JNQUxNQVAsXHJcblx0XHRcdGNsZWFyY29hdFJvdWdobmVzc01hcDogSEFTX0NMRUFSQ09BVF9ST1VHSE5FU1NNQVAsXHJcblxyXG5cdFx0XHRkaXNwZXJzaW9uOiBIQVNfRElTUEVSU0lPTixcclxuXHJcblx0XHRcdGlyaWRlc2NlbmNlOiBIQVNfSVJJREVTQ0VOQ0UsXHJcblx0XHRcdGlyaWRlc2NlbmNlTWFwOiBIQVNfSVJJREVTQ0VOQ0VNQVAsXHJcblx0XHRcdGlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwOiBIQVNfSVJJREVTQ0VOQ0VfVEhJQ0tORVNTTUFQLFxyXG5cclxuXHRcdFx0c2hlZW46IEhBU19TSEVFTixcclxuXHRcdFx0c2hlZW5Db2xvck1hcDogSEFTX1NIRUVOX0NPTE9STUFQLFxyXG5cdFx0XHRzaGVlblJvdWdobmVzc01hcDogSEFTX1NIRUVOX1JPVUdITkVTU01BUCxcclxuXHJcblx0XHRcdHNwZWN1bGFyTWFwOiBIQVNfU1BFQ1VMQVJNQVAsXHJcblx0XHRcdHNwZWN1bGFyQ29sb3JNYXA6IEhBU19TUEVDVUxBUl9DT0xPUk1BUCxcclxuXHRcdFx0c3BlY3VsYXJJbnRlbnNpdHlNYXA6IEhBU19TUEVDVUxBUl9JTlRFTlNJVFlNQVAsXHJcblxyXG5cdFx0XHR0cmFuc21pc3Npb246IEhBU19UUkFOU01JU1NJT04sXHJcblx0XHRcdHRyYW5zbWlzc2lvbk1hcDogSEFTX1RSQU5TTUlTU0lPTk1BUCxcclxuXHRcdFx0dGhpY2tuZXNzTWFwOiBIQVNfVEhJQ0tORVNTTUFQLFxyXG5cclxuXHRcdFx0Z3JhZGllbnRNYXA6IEhBU19HUkFESUVOVE1BUCxcclxuXHJcblx0XHRcdG9wYXF1ZTogbWF0ZXJpYWwudHJhbnNwYXJlbnQgPT09IGZhbHNlICYmIG1hdGVyaWFsLmJsZW5kaW5nID09PSBOb3JtYWxCbGVuZGluZyAmJiBtYXRlcmlhbC5hbHBoYVRvQ292ZXJhZ2UgPT09IGZhbHNlLFxyXG5cclxuXHRcdFx0YWxwaGFNYXA6IEhBU19BTFBIQU1BUCxcclxuXHRcdFx0YWxwaGFUZXN0OiBIQVNfQUxQSEFURVNULFxyXG5cdFx0XHRhbHBoYUhhc2g6IEhBU19BTFBIQUhBU0gsXHJcblxyXG5cdFx0XHRjb21iaW5lOiBtYXRlcmlhbC5jb21iaW5lLFxyXG5cclxuXHRcdFx0Ly9cclxuXHJcblx0XHRcdG1hcFV2OiBIQVNfTUFQICYmIGdldENoYW5uZWwoIG1hdGVyaWFsLm1hcC5jaGFubmVsICksXHJcblx0XHRcdGFvTWFwVXY6IEhBU19BT01BUCAmJiBnZXRDaGFubmVsKCBtYXRlcmlhbC5hb01hcC5jaGFubmVsICksXHJcblx0XHRcdGxpZ2h0TWFwVXY6IEhBU19MSUdIVE1BUCAmJiBnZXRDaGFubmVsKCBtYXRlcmlhbC5saWdodE1hcC5jaGFubmVsICksXHJcblx0XHRcdGJ1bXBNYXBVdjogSEFTX0JVTVBNQVAgJiYgZ2V0Q2hhbm5lbCggbWF0ZXJpYWwuYnVtcE1hcC5jaGFubmVsICksXHJcblx0XHRcdG5vcm1hbE1hcFV2OiBIQVNfTk9STUFMTUFQICYmIGdldENoYW5uZWwoIG1hdGVyaWFsLm5vcm1hbE1hcC5jaGFubmVsICksXHJcblx0XHRcdGRpc3BsYWNlbWVudE1hcFV2OiBIQVNfRElTUExBQ0VNRU5UTUFQICYmIGdldENoYW5uZWwoIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcC5jaGFubmVsICksXHJcblx0XHRcdGVtaXNzaXZlTWFwVXY6IEhBU19FTUlTU0lWRU1BUCAmJiBnZXRDaGFubmVsKCBtYXRlcmlhbC5lbWlzc2l2ZU1hcC5jaGFubmVsICksXHJcblxyXG5cdFx0XHRtZXRhbG5lc3NNYXBVdjogSEFTX01FVEFMTkVTU01BUCAmJiBnZXRDaGFubmVsKCBtYXRlcmlhbC5tZXRhbG5lc3NNYXAuY2hhbm5lbCApLFxyXG5cdFx0XHRyb3VnaG5lc3NNYXBVdjogSEFTX1JPVUdITkVTU01BUCAmJiBnZXRDaGFubmVsKCBtYXRlcmlhbC5yb3VnaG5lc3NNYXAuY2hhbm5lbCApLFxyXG5cclxuXHRcdFx0YW5pc290cm9weU1hcFV2OiBIQVNfQU5JU09UUk9QWU1BUCAmJiBnZXRDaGFubmVsKCBtYXRlcmlhbC5hbmlzb3Ryb3B5TWFwLmNoYW5uZWwgKSxcclxuXHJcblx0XHRcdGNsZWFyY29hdE1hcFV2OiBIQVNfQ0xFQVJDT0FUTUFQICYmIGdldENoYW5uZWwoIG1hdGVyaWFsLmNsZWFyY29hdE1hcC5jaGFubmVsICksXHJcblx0XHRcdGNsZWFyY29hdE5vcm1hbE1hcFV2OiBIQVNfQ0xFQVJDT0FUX05PUk1BTE1BUCAmJiBnZXRDaGFubmVsKCBtYXRlcmlhbC5jbGVhcmNvYXROb3JtYWxNYXAuY2hhbm5lbCApLFxyXG5cdFx0XHRjbGVhcmNvYXRSb3VnaG5lc3NNYXBVdjogSEFTX0NMRUFSQ09BVF9ST1VHSE5FU1NNQVAgJiYgZ2V0Q2hhbm5lbCggbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzTWFwLmNoYW5uZWwgKSxcclxuXHJcblx0XHRcdGlyaWRlc2NlbmNlTWFwVXY6IEhBU19JUklERVNDRU5DRU1BUCAmJiBnZXRDaGFubmVsKCBtYXRlcmlhbC5pcmlkZXNjZW5jZU1hcC5jaGFubmVsICksXHJcblx0XHRcdGlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwVXY6IEhBU19JUklERVNDRU5DRV9USElDS05FU1NNQVAgJiYgZ2V0Q2hhbm5lbCggbWF0ZXJpYWwuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAuY2hhbm5lbCApLFxyXG5cclxuXHRcdFx0c2hlZW5Db2xvck1hcFV2OiBIQVNfU0hFRU5fQ09MT1JNQVAgJiYgZ2V0Q2hhbm5lbCggbWF0ZXJpYWwuc2hlZW5Db2xvck1hcC5jaGFubmVsICksXHJcblx0XHRcdHNoZWVuUm91Z2huZXNzTWFwVXY6IEhBU19TSEVFTl9ST1VHSE5FU1NNQVAgJiYgZ2V0Q2hhbm5lbCggbWF0ZXJpYWwuc2hlZW5Sb3VnaG5lc3NNYXAuY2hhbm5lbCApLFxyXG5cclxuXHRcdFx0c3BlY3VsYXJNYXBVdjogSEFTX1NQRUNVTEFSTUFQICYmIGdldENoYW5uZWwoIG1hdGVyaWFsLnNwZWN1bGFyTWFwLmNoYW5uZWwgKSxcclxuXHRcdFx0c3BlY3VsYXJDb2xvck1hcFV2OiBIQVNfU1BFQ1VMQVJfQ09MT1JNQVAgJiYgZ2V0Q2hhbm5lbCggbWF0ZXJpYWwuc3BlY3VsYXJDb2xvck1hcC5jaGFubmVsICksXHJcblx0XHRcdHNwZWN1bGFySW50ZW5zaXR5TWFwVXY6IEhBU19TUEVDVUxBUl9JTlRFTlNJVFlNQVAgJiYgZ2V0Q2hhbm5lbCggbWF0ZXJpYWwuc3BlY3VsYXJJbnRlbnNpdHlNYXAuY2hhbm5lbCApLFxyXG5cclxuXHRcdFx0dHJhbnNtaXNzaW9uTWFwVXY6IEhBU19UUkFOU01JU1NJT05NQVAgJiYgZ2V0Q2hhbm5lbCggbWF0ZXJpYWwudHJhbnNtaXNzaW9uTWFwLmNoYW5uZWwgKSxcclxuXHRcdFx0dGhpY2tuZXNzTWFwVXY6IEhBU19USElDS05FU1NNQVAgJiYgZ2V0Q2hhbm5lbCggbWF0ZXJpYWwudGhpY2tuZXNzTWFwLmNoYW5uZWwgKSxcclxuXHJcblx0XHRcdGFscGhhTWFwVXY6IEhBU19BTFBIQU1BUCAmJiBnZXRDaGFubmVsKCBtYXRlcmlhbC5hbHBoYU1hcC5jaGFubmVsICksXHJcblxyXG5cdFx0XHQvL1xyXG5cclxuXHRcdFx0dmVydGV4VGFuZ2VudHM6ICEhIGdlb21ldHJ5LmF0dHJpYnV0ZXMudGFuZ2VudCAmJiAoIEhBU19OT1JNQUxNQVAgfHwgSEFTX0FOSVNPVFJPUFkgKSxcclxuXHRcdFx0dmVydGV4Q29sb3JzOiBtYXRlcmlhbC52ZXJ0ZXhDb2xvcnMsXHJcblx0XHRcdHZlcnRleEFscGhhczogbWF0ZXJpYWwudmVydGV4Q29sb3JzID09PSB0cnVlICYmICEhIGdlb21ldHJ5LmF0dHJpYnV0ZXMuY29sb3IgJiYgZ2VvbWV0cnkuYXR0cmlidXRlcy5jb2xvci5pdGVtU2l6ZSA9PT0gNCxcclxuXHJcblx0XHRcdHBvaW50c1V2czogb2JqZWN0LmlzUG9pbnRzID09PSB0cnVlICYmICEhIGdlb21ldHJ5LmF0dHJpYnV0ZXMudXYgJiYgKCBIQVNfTUFQIHx8IEhBU19BTFBIQU1BUCApLFxyXG5cclxuXHRcdFx0Zm9nOiAhISBmb2csXHJcblx0XHRcdHVzZUZvZzogbWF0ZXJpYWwuZm9nID09PSB0cnVlLFxyXG5cdFx0XHRmb2dFeHAyOiAoICEhIGZvZyAmJiBmb2cuaXNGb2dFeHAyICksXHJcblxyXG5cdFx0XHRmbGF0U2hhZGluZzogbWF0ZXJpYWwuZmxhdFNoYWRpbmcgPT09IHRydWUsXHJcblxyXG5cdFx0XHRzaXplQXR0ZW51YXRpb246IG1hdGVyaWFsLnNpemVBdHRlbnVhdGlvbiA9PT0gdHJ1ZSxcclxuXHRcdFx0bG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcjogbG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcixcclxuXHRcdFx0cmV2ZXJzZURlcHRoQnVmZmVyOiByZXZlcnNlRGVwdGhCdWZmZXIsXHJcblxyXG5cdFx0XHRza2lubmluZzogb2JqZWN0LmlzU2tpbm5lZE1lc2ggPT09IHRydWUsXHJcblxyXG5cdFx0XHRtb3JwaFRhcmdldHM6IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbiAhPT0gdW5kZWZpbmVkLFxyXG5cdFx0XHRtb3JwaE5vcm1hbHM6IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5ub3JtYWwgIT09IHVuZGVmaW5lZCxcclxuXHRcdFx0bW9ycGhDb2xvcnM6IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5jb2xvciAhPT0gdW5kZWZpbmVkLFxyXG5cdFx0XHRtb3JwaFRhcmdldHNDb3VudDogbW9ycGhUYXJnZXRzQ291bnQsXHJcblx0XHRcdG1vcnBoVGV4dHVyZVN0cmlkZTogbW9ycGhUZXh0dXJlU3RyaWRlLFxyXG5cclxuXHRcdFx0bnVtRGlyTGlnaHRzOiBsaWdodHMuZGlyZWN0aW9uYWwubGVuZ3RoLFxyXG5cdFx0XHRudW1Qb2ludExpZ2h0czogbGlnaHRzLnBvaW50Lmxlbmd0aCxcclxuXHRcdFx0bnVtU3BvdExpZ2h0czogbGlnaHRzLnNwb3QubGVuZ3RoLFxyXG5cdFx0XHRudW1TcG90TGlnaHRNYXBzOiBsaWdodHMuc3BvdExpZ2h0TWFwLmxlbmd0aCxcclxuXHRcdFx0bnVtUmVjdEFyZWFMaWdodHM6IGxpZ2h0cy5yZWN0QXJlYS5sZW5ndGgsXHJcblx0XHRcdG51bUhlbWlMaWdodHM6IGxpZ2h0cy5oZW1pLmxlbmd0aCxcclxuXHJcblx0XHRcdG51bURpckxpZ2h0U2hhZG93czogbGlnaHRzLmRpcmVjdGlvbmFsU2hhZG93TWFwLmxlbmd0aCxcclxuXHRcdFx0bnVtUG9pbnRMaWdodFNoYWRvd3M6IGxpZ2h0cy5wb2ludFNoYWRvd01hcC5sZW5ndGgsXHJcblx0XHRcdG51bVNwb3RMaWdodFNoYWRvd3M6IGxpZ2h0cy5zcG90U2hhZG93TWFwLmxlbmd0aCxcclxuXHRcdFx0bnVtU3BvdExpZ2h0U2hhZG93c1dpdGhNYXBzOiBsaWdodHMubnVtU3BvdExpZ2h0U2hhZG93c1dpdGhNYXBzLFxyXG5cclxuXHRcdFx0bnVtTGlnaHRQcm9iZXM6IGxpZ2h0cy5udW1MaWdodFByb2JlcyxcclxuXHJcblx0XHRcdG51bUNsaXBwaW5nUGxhbmVzOiBjbGlwcGluZy5udW1QbGFuZXMsXHJcblx0XHRcdG51bUNsaXBJbnRlcnNlY3Rpb246IGNsaXBwaW5nLm51bUludGVyc2VjdGlvbixcclxuXHJcblx0XHRcdGRpdGhlcmluZzogbWF0ZXJpYWwuZGl0aGVyaW5nLFxyXG5cclxuXHRcdFx0c2hhZG93TWFwRW5hYmxlZDogcmVuZGVyZXIuc2hhZG93TWFwLmVuYWJsZWQgJiYgc2hhZG93cy5sZW5ndGggPiAwLFxyXG5cdFx0XHRzaGFkb3dNYXBUeXBlOiByZW5kZXJlci5zaGFkb3dNYXAudHlwZSxcclxuXHJcblx0XHRcdHRvbmVNYXBwaW5nOiB0b25lTWFwcGluZyxcclxuXHJcblx0XHRcdGRlY29kZVZpZGVvVGV4dHVyZTogSEFTX01BUCAmJiAoIG1hdGVyaWFsLm1hcC5pc1ZpZGVvVGV4dHVyZSA9PT0gdHJ1ZSApICYmICggQ29sb3JNYW5hZ2VtZW50LmdldFRyYW5zZmVyKCBtYXRlcmlhbC5tYXAuY29sb3JTcGFjZSApID09PSBTUkdCVHJhbnNmZXIgKSxcclxuXHRcdFx0ZGVjb2RlVmlkZW9UZXh0dXJlRW1pc3NpdmU6IEhBU19FTUlTU0lWRU1BUCAmJiAoIG1hdGVyaWFsLmVtaXNzaXZlTWFwLmlzVmlkZW9UZXh0dXJlID09PSB0cnVlICkgJiYgKCBDb2xvck1hbmFnZW1lbnQuZ2V0VHJhbnNmZXIoIG1hdGVyaWFsLmVtaXNzaXZlTWFwLmNvbG9yU3BhY2UgKSA9PT0gU1JHQlRyYW5zZmVyICksXHJcblxyXG5cdFx0XHRwcmVtdWx0aXBsaWVkQWxwaGE6IG1hdGVyaWFsLnByZW11bHRpcGxpZWRBbHBoYSxcclxuXHJcblx0XHRcdGRvdWJsZVNpZGVkOiBtYXRlcmlhbC5zaWRlID09PSBEb3VibGVTaWRlLFxyXG5cdFx0XHRmbGlwU2lkZWQ6IG1hdGVyaWFsLnNpZGUgPT09IEJhY2tTaWRlLFxyXG5cclxuXHRcdFx0dXNlRGVwdGhQYWNraW5nOiBtYXRlcmlhbC5kZXB0aFBhY2tpbmcgPj0gMCxcclxuXHRcdFx0ZGVwdGhQYWNraW5nOiBtYXRlcmlhbC5kZXB0aFBhY2tpbmcgfHwgMCxcclxuXHJcblx0XHRcdGluZGV4MEF0dHJpYnV0ZU5hbWU6IG1hdGVyaWFsLmluZGV4MEF0dHJpYnV0ZU5hbWUsXHJcblxyXG5cdFx0XHRleHRlbnNpb25DbGlwQ3VsbERpc3RhbmNlOiBIQVNfRVhURU5TSU9OUyAmJiBtYXRlcmlhbC5leHRlbnNpb25zLmNsaXBDdWxsRGlzdGFuY2UgPT09IHRydWUgJiYgZXh0ZW5zaW9ucy5oYXMoICdXRUJHTF9jbGlwX2N1bGxfZGlzdGFuY2UnICksXHJcblx0XHRcdGV4dGVuc2lvbk11bHRpRHJhdzogKCBIQVNfRVhURU5TSU9OUyAmJiBtYXRlcmlhbC5leHRlbnNpb25zLm11bHRpRHJhdyA9PT0gdHJ1ZSB8fCBJU19CQVRDSEVETUVTSCApICYmIGV4dGVuc2lvbnMuaGFzKCAnV0VCR0xfbXVsdGlfZHJhdycgKSxcclxuXHJcblx0XHRcdHJlbmRlcmVyRXh0ZW5zaW9uUGFyYWxsZWxTaGFkZXJDb21waWxlOiBleHRlbnNpb25zLmhhcyggJ0tIUl9wYXJhbGxlbF9zaGFkZXJfY29tcGlsZScgKSxcclxuXHJcblx0XHRcdGN1c3RvbVByb2dyYW1DYWNoZUtleTogbWF0ZXJpYWwuY3VzdG9tUHJvZ3JhbUNhY2hlS2V5KClcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8vIHRoZSB1c2FnZSBvZiBnZXRDaGFubmVsKCkgZGV0ZXJtaW5lcyB0aGUgYWN0aXZlIHRleHR1cmUgY2hhbm5lbHMgZm9yIHRoaXMgc2hhZGVyXHJcblxyXG5cdFx0cGFyYW1ldGVycy52ZXJ0ZXhVdjFzID0gX2FjdGl2ZUNoYW5uZWxzLmhhcyggMSApO1xyXG5cdFx0cGFyYW1ldGVycy52ZXJ0ZXhVdjJzID0gX2FjdGl2ZUNoYW5uZWxzLmhhcyggMiApO1xyXG5cdFx0cGFyYW1ldGVycy52ZXJ0ZXhVdjNzID0gX2FjdGl2ZUNoYW5uZWxzLmhhcyggMyApO1xyXG5cclxuXHRcdF9hY3RpdmVDaGFubmVscy5jbGVhcigpO1xyXG5cclxuXHRcdHJldHVybiBwYXJhbWV0ZXJzO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGdldFByb2dyYW1DYWNoZUtleSggcGFyYW1ldGVycyApIHtcclxuXHJcblx0XHRjb25zdCBhcnJheSA9IFtdO1xyXG5cclxuXHRcdGlmICggcGFyYW1ldGVycy5zaGFkZXJJRCApIHtcclxuXHJcblx0XHRcdGFycmF5LnB1c2goIHBhcmFtZXRlcnMuc2hhZGVySUQgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0YXJyYXkucHVzaCggcGFyYW1ldGVycy5jdXN0b21WZXJ0ZXhTaGFkZXJJRCApO1xyXG5cdFx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLmN1c3RvbUZyYWdtZW50U2hhZGVySUQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBwYXJhbWV0ZXJzLmRlZmluZXMgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGZvciAoIGNvbnN0IG5hbWUgaW4gcGFyYW1ldGVycy5kZWZpbmVzICkge1xyXG5cclxuXHRcdFx0XHRhcnJheS5wdXNoKCBuYW1lICk7XHJcblx0XHRcdFx0YXJyYXkucHVzaCggcGFyYW1ldGVycy5kZWZpbmVzWyBuYW1lIF0gKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBwYXJhbWV0ZXJzLmlzUmF3U2hhZGVyTWF0ZXJpYWwgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0Z2V0UHJvZ3JhbUNhY2hlS2V5UGFyYW1ldGVycyggYXJyYXksIHBhcmFtZXRlcnMgKTtcclxuXHRcdFx0Z2V0UHJvZ3JhbUNhY2hlS2V5Qm9vbGVhbnMoIGFycmF5LCBwYXJhbWV0ZXJzICk7XHJcblx0XHRcdGFycmF5LnB1c2goIHJlbmRlcmVyLm91dHB1dENvbG9yU3BhY2UgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0YXJyYXkucHVzaCggcGFyYW1ldGVycy5jdXN0b21Qcm9ncmFtQ2FjaGVLZXkgKTtcclxuXHJcblx0XHRyZXR1cm4gYXJyYXkuam9pbigpO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGdldFByb2dyYW1DYWNoZUtleVBhcmFtZXRlcnMoIGFycmF5LCBwYXJhbWV0ZXJzICkge1xyXG5cclxuXHRcdGFycmF5LnB1c2goIHBhcmFtZXRlcnMucHJlY2lzaW9uICk7XHJcblx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLm91dHB1dENvbG9yU3BhY2UgKTtcclxuXHRcdGFycmF5LnB1c2goIHBhcmFtZXRlcnMuZW52TWFwTW9kZSApO1xyXG5cdFx0YXJyYXkucHVzaCggcGFyYW1ldGVycy5lbnZNYXBDdWJlVVZIZWlnaHQgKTtcclxuXHRcdGFycmF5LnB1c2goIHBhcmFtZXRlcnMubWFwVXYgKTtcclxuXHRcdGFycmF5LnB1c2goIHBhcmFtZXRlcnMuYWxwaGFNYXBVdiApO1xyXG5cdFx0YXJyYXkucHVzaCggcGFyYW1ldGVycy5saWdodE1hcFV2ICk7XHJcblx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLmFvTWFwVXYgKTtcclxuXHRcdGFycmF5LnB1c2goIHBhcmFtZXRlcnMuYnVtcE1hcFV2ICk7XHJcblx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLm5vcm1hbE1hcFV2ICk7XHJcblx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLmRpc3BsYWNlbWVudE1hcFV2ICk7XHJcblx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLmVtaXNzaXZlTWFwVXYgKTtcclxuXHRcdGFycmF5LnB1c2goIHBhcmFtZXRlcnMubWV0YWxuZXNzTWFwVXYgKTtcclxuXHRcdGFycmF5LnB1c2goIHBhcmFtZXRlcnMucm91Z2huZXNzTWFwVXYgKTtcclxuXHRcdGFycmF5LnB1c2goIHBhcmFtZXRlcnMuYW5pc290cm9weU1hcFV2ICk7XHJcblx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLmNsZWFyY29hdE1hcFV2ICk7XHJcblx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLmNsZWFyY29hdE5vcm1hbE1hcFV2ICk7XHJcblx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLmNsZWFyY29hdFJvdWdobmVzc01hcFV2ICk7XHJcblx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLmlyaWRlc2NlbmNlTWFwVXYgKTtcclxuXHRcdGFycmF5LnB1c2goIHBhcmFtZXRlcnMuaXJpZGVzY2VuY2VUaGlja25lc3NNYXBVdiApO1xyXG5cdFx0YXJyYXkucHVzaCggcGFyYW1ldGVycy5zaGVlbkNvbG9yTWFwVXYgKTtcclxuXHRcdGFycmF5LnB1c2goIHBhcmFtZXRlcnMuc2hlZW5Sb3VnaG5lc3NNYXBVdiApO1xyXG5cdFx0YXJyYXkucHVzaCggcGFyYW1ldGVycy5zcGVjdWxhck1hcFV2ICk7XHJcblx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLnNwZWN1bGFyQ29sb3JNYXBVdiApO1xyXG5cdFx0YXJyYXkucHVzaCggcGFyYW1ldGVycy5zcGVjdWxhckludGVuc2l0eU1hcFV2ICk7XHJcblx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLnRyYW5zbWlzc2lvbk1hcFV2ICk7XHJcblx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLnRoaWNrbmVzc01hcFV2ICk7XHJcblx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLmNvbWJpbmUgKTtcclxuXHRcdGFycmF5LnB1c2goIHBhcmFtZXRlcnMuZm9nRXhwMiApO1xyXG5cdFx0YXJyYXkucHVzaCggcGFyYW1ldGVycy5zaXplQXR0ZW51YXRpb24gKTtcclxuXHRcdGFycmF5LnB1c2goIHBhcmFtZXRlcnMubW9ycGhUYXJnZXRzQ291bnQgKTtcclxuXHRcdGFycmF5LnB1c2goIHBhcmFtZXRlcnMubW9ycGhBdHRyaWJ1dGVDb3VudCApO1xyXG5cdFx0YXJyYXkucHVzaCggcGFyYW1ldGVycy5udW1EaXJMaWdodHMgKTtcclxuXHRcdGFycmF5LnB1c2goIHBhcmFtZXRlcnMubnVtUG9pbnRMaWdodHMgKTtcclxuXHRcdGFycmF5LnB1c2goIHBhcmFtZXRlcnMubnVtU3BvdExpZ2h0cyApO1xyXG5cdFx0YXJyYXkucHVzaCggcGFyYW1ldGVycy5udW1TcG90TGlnaHRNYXBzICk7XHJcblx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLm51bUhlbWlMaWdodHMgKTtcclxuXHRcdGFycmF5LnB1c2goIHBhcmFtZXRlcnMubnVtUmVjdEFyZWFMaWdodHMgKTtcclxuXHRcdGFycmF5LnB1c2goIHBhcmFtZXRlcnMubnVtRGlyTGlnaHRTaGFkb3dzICk7XHJcblx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLm51bVBvaW50TGlnaHRTaGFkb3dzICk7XHJcblx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLm51bVNwb3RMaWdodFNoYWRvd3MgKTtcclxuXHRcdGFycmF5LnB1c2goIHBhcmFtZXRlcnMubnVtU3BvdExpZ2h0U2hhZG93c1dpdGhNYXBzICk7XHJcblx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLm51bUxpZ2h0UHJvYmVzICk7XHJcblx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLnNoYWRvd01hcFR5cGUgKTtcclxuXHRcdGFycmF5LnB1c2goIHBhcmFtZXRlcnMudG9uZU1hcHBpbmcgKTtcclxuXHRcdGFycmF5LnB1c2goIHBhcmFtZXRlcnMubnVtQ2xpcHBpbmdQbGFuZXMgKTtcclxuXHRcdGFycmF5LnB1c2goIHBhcmFtZXRlcnMubnVtQ2xpcEludGVyc2VjdGlvbiApO1xyXG5cdFx0YXJyYXkucHVzaCggcGFyYW1ldGVycy5kZXB0aFBhY2tpbmcgKTtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBnZXRQcm9ncmFtQ2FjaGVLZXlCb29sZWFucyggYXJyYXksIHBhcmFtZXRlcnMgKSB7XHJcblxyXG5cdFx0X3Byb2dyYW1MYXllcnMuZGlzYWJsZUFsbCgpO1xyXG5cclxuXHRcdGlmICggcGFyYW1ldGVycy5zdXBwb3J0c1ZlcnRleFRleHR1cmVzIClcclxuXHRcdFx0X3Byb2dyYW1MYXllcnMuZW5hYmxlKCAwICk7XHJcblx0XHRpZiAoIHBhcmFtZXRlcnMuaW5zdGFuY2luZyApXHJcblx0XHRcdF9wcm9ncmFtTGF5ZXJzLmVuYWJsZSggMSApO1xyXG5cdFx0aWYgKCBwYXJhbWV0ZXJzLmluc3RhbmNpbmdDb2xvciApXHJcblx0XHRcdF9wcm9ncmFtTGF5ZXJzLmVuYWJsZSggMiApO1xyXG5cdFx0aWYgKCBwYXJhbWV0ZXJzLmluc3RhbmNpbmdNb3JwaCApXHJcblx0XHRcdF9wcm9ncmFtTGF5ZXJzLmVuYWJsZSggMyApO1xyXG5cdFx0aWYgKCBwYXJhbWV0ZXJzLm1hdGNhcCApXHJcblx0XHRcdF9wcm9ncmFtTGF5ZXJzLmVuYWJsZSggNCApO1xyXG5cdFx0aWYgKCBwYXJhbWV0ZXJzLmVudk1hcCApXHJcblx0XHRcdF9wcm9ncmFtTGF5ZXJzLmVuYWJsZSggNSApO1xyXG5cdFx0aWYgKCBwYXJhbWV0ZXJzLm5vcm1hbE1hcE9iamVjdFNwYWNlIClcclxuXHRcdFx0X3Byb2dyYW1MYXllcnMuZW5hYmxlKCA2ICk7XHJcblx0XHRpZiAoIHBhcmFtZXRlcnMubm9ybWFsTWFwVGFuZ2VudFNwYWNlIClcclxuXHRcdFx0X3Byb2dyYW1MYXllcnMuZW5hYmxlKCA3ICk7XHJcblx0XHRpZiAoIHBhcmFtZXRlcnMuY2xlYXJjb2F0IClcclxuXHRcdFx0X3Byb2dyYW1MYXllcnMuZW5hYmxlKCA4ICk7XHJcblx0XHRpZiAoIHBhcmFtZXRlcnMuaXJpZGVzY2VuY2UgKVxyXG5cdFx0XHRfcHJvZ3JhbUxheWVycy5lbmFibGUoIDkgKTtcclxuXHRcdGlmICggcGFyYW1ldGVycy5hbHBoYVRlc3QgKVxyXG5cdFx0XHRfcHJvZ3JhbUxheWVycy5lbmFibGUoIDEwICk7XHJcblx0XHRpZiAoIHBhcmFtZXRlcnMudmVydGV4Q29sb3JzIClcclxuXHRcdFx0X3Byb2dyYW1MYXllcnMuZW5hYmxlKCAxMSApO1xyXG5cdFx0aWYgKCBwYXJhbWV0ZXJzLnZlcnRleEFscGhhcyApXHJcblx0XHRcdF9wcm9ncmFtTGF5ZXJzLmVuYWJsZSggMTIgKTtcclxuXHRcdGlmICggcGFyYW1ldGVycy52ZXJ0ZXhVdjFzIClcclxuXHRcdFx0X3Byb2dyYW1MYXllcnMuZW5hYmxlKCAxMyApO1xyXG5cdFx0aWYgKCBwYXJhbWV0ZXJzLnZlcnRleFV2MnMgKVxyXG5cdFx0XHRfcHJvZ3JhbUxheWVycy5lbmFibGUoIDE0ICk7XHJcblx0XHRpZiAoIHBhcmFtZXRlcnMudmVydGV4VXYzcyApXHJcblx0XHRcdF9wcm9ncmFtTGF5ZXJzLmVuYWJsZSggMTUgKTtcclxuXHRcdGlmICggcGFyYW1ldGVycy52ZXJ0ZXhUYW5nZW50cyApXHJcblx0XHRcdF9wcm9ncmFtTGF5ZXJzLmVuYWJsZSggMTYgKTtcclxuXHRcdGlmICggcGFyYW1ldGVycy5hbmlzb3Ryb3B5IClcclxuXHRcdFx0X3Byb2dyYW1MYXllcnMuZW5hYmxlKCAxNyApO1xyXG5cdFx0aWYgKCBwYXJhbWV0ZXJzLmFscGhhSGFzaCApXHJcblx0XHRcdF9wcm9ncmFtTGF5ZXJzLmVuYWJsZSggMTggKTtcclxuXHRcdGlmICggcGFyYW1ldGVycy5iYXRjaGluZyApXHJcblx0XHRcdF9wcm9ncmFtTGF5ZXJzLmVuYWJsZSggMTkgKTtcclxuXHRcdGlmICggcGFyYW1ldGVycy5kaXNwZXJzaW9uIClcclxuXHRcdFx0X3Byb2dyYW1MYXllcnMuZW5hYmxlKCAyMCApO1xyXG5cdFx0aWYgKCBwYXJhbWV0ZXJzLmJhdGNoaW5nQ29sb3IgKVxyXG5cdFx0XHRfcHJvZ3JhbUxheWVycy5lbmFibGUoIDIxICk7XHJcblxyXG5cdFx0YXJyYXkucHVzaCggX3Byb2dyYW1MYXllcnMubWFzayApO1xyXG5cdFx0X3Byb2dyYW1MYXllcnMuZGlzYWJsZUFsbCgpO1xyXG5cclxuXHRcdGlmICggcGFyYW1ldGVycy5mb2cgKVxyXG5cdFx0XHRfcHJvZ3JhbUxheWVycy5lbmFibGUoIDAgKTtcclxuXHRcdGlmICggcGFyYW1ldGVycy51c2VGb2cgKVxyXG5cdFx0XHRfcHJvZ3JhbUxheWVycy5lbmFibGUoIDEgKTtcclxuXHRcdGlmICggcGFyYW1ldGVycy5mbGF0U2hhZGluZyApXHJcblx0XHRcdF9wcm9ncmFtTGF5ZXJzLmVuYWJsZSggMiApO1xyXG5cdFx0aWYgKCBwYXJhbWV0ZXJzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIgKVxyXG5cdFx0XHRfcHJvZ3JhbUxheWVycy5lbmFibGUoIDMgKTtcclxuXHRcdGlmICggcGFyYW1ldGVycy5yZXZlcnNlRGVwdGhCdWZmZXIgKVxyXG5cdFx0XHRfcHJvZ3JhbUxheWVycy5lbmFibGUoIDQgKTtcclxuXHRcdGlmICggcGFyYW1ldGVycy5za2lubmluZyApXHJcblx0XHRcdF9wcm9ncmFtTGF5ZXJzLmVuYWJsZSggNSApO1xyXG5cdFx0aWYgKCBwYXJhbWV0ZXJzLm1vcnBoVGFyZ2V0cyApXHJcblx0XHRcdF9wcm9ncmFtTGF5ZXJzLmVuYWJsZSggNiApO1xyXG5cdFx0aWYgKCBwYXJhbWV0ZXJzLm1vcnBoTm9ybWFscyApXHJcblx0XHRcdF9wcm9ncmFtTGF5ZXJzLmVuYWJsZSggNyApO1xyXG5cdFx0aWYgKCBwYXJhbWV0ZXJzLm1vcnBoQ29sb3JzIClcclxuXHRcdFx0X3Byb2dyYW1MYXllcnMuZW5hYmxlKCA4ICk7XHJcblx0XHRpZiAoIHBhcmFtZXRlcnMucHJlbXVsdGlwbGllZEFscGhhIClcclxuXHRcdFx0X3Byb2dyYW1MYXllcnMuZW5hYmxlKCA5ICk7XHJcblx0XHRpZiAoIHBhcmFtZXRlcnMuc2hhZG93TWFwRW5hYmxlZCApXHJcblx0XHRcdF9wcm9ncmFtTGF5ZXJzLmVuYWJsZSggMTAgKTtcclxuXHRcdGlmICggcGFyYW1ldGVycy5kb3VibGVTaWRlZCApXHJcblx0XHRcdF9wcm9ncmFtTGF5ZXJzLmVuYWJsZSggMTEgKTtcclxuXHRcdGlmICggcGFyYW1ldGVycy5mbGlwU2lkZWQgKVxyXG5cdFx0XHRfcHJvZ3JhbUxheWVycy5lbmFibGUoIDEyICk7XHJcblx0XHRpZiAoIHBhcmFtZXRlcnMudXNlRGVwdGhQYWNraW5nIClcclxuXHRcdFx0X3Byb2dyYW1MYXllcnMuZW5hYmxlKCAxMyApO1xyXG5cdFx0aWYgKCBwYXJhbWV0ZXJzLmRpdGhlcmluZyApXHJcblx0XHRcdF9wcm9ncmFtTGF5ZXJzLmVuYWJsZSggMTQgKTtcclxuXHRcdGlmICggcGFyYW1ldGVycy50cmFuc21pc3Npb24gKVxyXG5cdFx0XHRfcHJvZ3JhbUxheWVycy5lbmFibGUoIDE1ICk7XHJcblx0XHRpZiAoIHBhcmFtZXRlcnMuc2hlZW4gKVxyXG5cdFx0XHRfcHJvZ3JhbUxheWVycy5lbmFibGUoIDE2ICk7XHJcblx0XHRpZiAoIHBhcmFtZXRlcnMub3BhcXVlIClcclxuXHRcdFx0X3Byb2dyYW1MYXllcnMuZW5hYmxlKCAxNyApO1xyXG5cdFx0aWYgKCBwYXJhbWV0ZXJzLnBvaW50c1V2cyApXHJcblx0XHRcdF9wcm9ncmFtTGF5ZXJzLmVuYWJsZSggMTggKTtcclxuXHRcdGlmICggcGFyYW1ldGVycy5kZWNvZGVWaWRlb1RleHR1cmUgKVxyXG5cdFx0XHRfcHJvZ3JhbUxheWVycy5lbmFibGUoIDE5ICk7XHJcblx0XHRpZiAoIHBhcmFtZXRlcnMuZGVjb2RlVmlkZW9UZXh0dXJlRW1pc3NpdmUgKVxyXG5cdFx0XHRfcHJvZ3JhbUxheWVycy5lbmFibGUoIDIwICk7XHJcblx0XHRpZiAoIHBhcmFtZXRlcnMuYWxwaGFUb0NvdmVyYWdlIClcclxuXHRcdFx0X3Byb2dyYW1MYXllcnMuZW5hYmxlKCAyMSApO1xyXG5cclxuXHRcdGFycmF5LnB1c2goIF9wcm9ncmFtTGF5ZXJzLm1hc2sgKTtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBnZXRVbmlmb3JtcyggbWF0ZXJpYWwgKSB7XHJcblxyXG5cdFx0Y29uc3Qgc2hhZGVySUQgPSBzaGFkZXJJRHNbIG1hdGVyaWFsLnR5cGUgXTtcclxuXHRcdGxldCB1bmlmb3JtcztcclxuXHJcblx0XHRpZiAoIHNoYWRlcklEICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgc2hhZGVyID0gU2hhZGVyTGliWyBzaGFkZXJJRCBdO1xyXG5cdFx0XHR1bmlmb3JtcyA9IFVuaWZvcm1zVXRpbHMuY2xvbmUoIHNoYWRlci51bmlmb3JtcyApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR1bmlmb3JtcyA9IG1hdGVyaWFsLnVuaWZvcm1zO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdW5pZm9ybXM7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gYWNxdWlyZVByb2dyYW0oIHBhcmFtZXRlcnMsIGNhY2hlS2V5ICkge1xyXG5cclxuXHRcdGxldCBwcm9ncmFtO1xyXG5cclxuXHRcdC8vIENoZWNrIGlmIGNvZGUgaGFzIGJlZW4gYWxyZWFkeSBjb21waWxlZFxyXG5cdFx0Zm9yICggbGV0IHAgPSAwLCBwbCA9IHByb2dyYW1zLmxlbmd0aDsgcCA8IHBsOyBwICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgcHJlZXhpc3RpbmdQcm9ncmFtID0gcHJvZ3JhbXNbIHAgXTtcclxuXHJcblx0XHRcdGlmICggcHJlZXhpc3RpbmdQcm9ncmFtLmNhY2hlS2V5ID09PSBjYWNoZUtleSApIHtcclxuXHJcblx0XHRcdFx0cHJvZ3JhbSA9IHByZWV4aXN0aW5nUHJvZ3JhbTtcclxuXHRcdFx0XHQrKyBwcm9ncmFtLnVzZWRUaW1lcztcclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggcHJvZ3JhbSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0cHJvZ3JhbSA9IG5ldyBXZWJHTFByb2dyYW0oIHJlbmRlcmVyLCBjYWNoZUtleSwgcGFyYW1ldGVycywgYmluZGluZ1N0YXRlcyApO1xyXG5cdFx0XHRwcm9ncmFtcy5wdXNoKCBwcm9ncmFtICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBwcm9ncmFtO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHJlbGVhc2VQcm9ncmFtKCBwcm9ncmFtICkge1xyXG5cclxuXHRcdGlmICggLS0gcHJvZ3JhbS51c2VkVGltZXMgPT09IDAgKSB7XHJcblxyXG5cdFx0XHQvLyBSZW1vdmUgZnJvbSB1bm9yZGVyZWQgc2V0XHJcblx0XHRcdGNvbnN0IGkgPSBwcm9ncmFtcy5pbmRleE9mKCBwcm9ncmFtICk7XHJcblx0XHRcdHByb2dyYW1zWyBpIF0gPSBwcm9ncmFtc1sgcHJvZ3JhbXMubGVuZ3RoIC0gMSBdO1xyXG5cdFx0XHRwcm9ncmFtcy5wb3AoKTtcclxuXHJcblx0XHRcdC8vIEZyZWUgV2ViR0wgcmVzb3VyY2VzXHJcblx0XHRcdHByb2dyYW0uZGVzdHJveSgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiByZWxlYXNlU2hhZGVyQ2FjaGUoIG1hdGVyaWFsICkge1xyXG5cclxuXHRcdF9jdXN0b21TaGFkZXJzLnJlbW92ZSggbWF0ZXJpYWwgKTtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBkaXNwb3NlKCkge1xyXG5cclxuXHRcdF9jdXN0b21TaGFkZXJzLmRpc3Bvc2UoKTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4ge1xyXG5cdFx0Z2V0UGFyYW1ldGVyczogZ2V0UGFyYW1ldGVycyxcclxuXHRcdGdldFByb2dyYW1DYWNoZUtleTogZ2V0UHJvZ3JhbUNhY2hlS2V5LFxyXG5cdFx0Z2V0VW5pZm9ybXM6IGdldFVuaWZvcm1zLFxyXG5cdFx0YWNxdWlyZVByb2dyYW06IGFjcXVpcmVQcm9ncmFtLFxyXG5cdFx0cmVsZWFzZVByb2dyYW06IHJlbGVhc2VQcm9ncmFtLFxyXG5cdFx0cmVsZWFzZVNoYWRlckNhY2hlOiByZWxlYXNlU2hhZGVyQ2FjaGUsXHJcblx0XHQvLyBFeHBvc2VkIGZvciByZXNvdXJjZSBtb25pdG9yaW5nICYgZXJyb3IgZmVlZGJhY2sgdmlhIHJlbmRlcmVyLmluZm86XHJcblx0XHRwcm9ncmFtczogcHJvZ3JhbXMsXHJcblx0XHRkaXNwb3NlOiBkaXNwb3NlXHJcblx0fTtcclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFdlYkdMUHJvZ3JhbXMgfTtcclxuIiwiZnVuY3Rpb24gV2ViR0xQcm9wZXJ0aWVzKCkge1xyXG5cclxuXHRsZXQgcHJvcGVydGllcyA9IG5ldyBXZWFrTWFwKCk7XHJcblxyXG5cdGZ1bmN0aW9uIGhhcyggb2JqZWN0ICkge1xyXG5cclxuXHRcdHJldHVybiBwcm9wZXJ0aWVzLmhhcyggb2JqZWN0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gZ2V0KCBvYmplY3QgKSB7XHJcblxyXG5cdFx0bGV0IG1hcCA9IHByb3BlcnRpZXMuZ2V0KCBvYmplY3QgKTtcclxuXHJcblx0XHRpZiAoIG1hcCA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0bWFwID0ge307XHJcblx0XHRcdHByb3BlcnRpZXMuc2V0KCBvYmplY3QsIG1hcCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbWFwO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHJlbW92ZSggb2JqZWN0ICkge1xyXG5cclxuXHRcdHByb3BlcnRpZXMuZGVsZXRlKCBvYmplY3QgKTtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiB1cGRhdGUoIG9iamVjdCwga2V5LCB2YWx1ZSApIHtcclxuXHJcblx0XHRwcm9wZXJ0aWVzLmdldCggb2JqZWN0IClbIGtleSBdID0gdmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gZGlzcG9zZSgpIHtcclxuXHJcblx0XHRwcm9wZXJ0aWVzID0gbmV3IFdlYWtNYXAoKTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4ge1xyXG5cdFx0aGFzOiBoYXMsXHJcblx0XHRnZXQ6IGdldCxcclxuXHRcdHJlbW92ZTogcmVtb3ZlLFxyXG5cdFx0dXBkYXRlOiB1cGRhdGUsXHJcblx0XHRkaXNwb3NlOiBkaXNwb3NlXHJcblx0fTtcclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBXZWJHTFByb3BlcnRpZXMgfTtcclxuIiwiZnVuY3Rpb24gcGFpbnRlclNvcnRTdGFibGUoIGEsIGIgKSB7XHJcblxyXG5cdGlmICggYS5ncm91cE9yZGVyICE9PSBiLmdyb3VwT3JkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIGEuZ3JvdXBPcmRlciAtIGIuZ3JvdXBPcmRlcjtcclxuXHJcblx0fSBlbHNlIGlmICggYS5yZW5kZXJPcmRlciAhPT0gYi5yZW5kZXJPcmRlciApIHtcclxuXHJcblx0XHRyZXR1cm4gYS5yZW5kZXJPcmRlciAtIGIucmVuZGVyT3JkZXI7XHJcblxyXG5cdH0gZWxzZSBpZiAoIGEubWF0ZXJpYWwuaWQgIT09IGIubWF0ZXJpYWwuaWQgKSB7XHJcblxyXG5cdFx0cmV0dXJuIGEubWF0ZXJpYWwuaWQgLSBiLm1hdGVyaWFsLmlkO1xyXG5cclxuXHR9IGVsc2UgaWYgKCBhLnogIT09IGIueiApIHtcclxuXHJcblx0XHRyZXR1cm4gYS56IC0gYi56O1xyXG5cclxuXHR9IGVsc2Uge1xyXG5cclxuXHRcdHJldHVybiBhLmlkIC0gYi5pZDtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gcmV2ZXJzZVBhaW50ZXJTb3J0U3RhYmxlKCBhLCBiICkge1xyXG5cclxuXHRpZiAoIGEuZ3JvdXBPcmRlciAhPT0gYi5ncm91cE9yZGVyICkge1xyXG5cclxuXHRcdHJldHVybiBhLmdyb3VwT3JkZXIgLSBiLmdyb3VwT3JkZXI7XHJcblxyXG5cdH0gZWxzZSBpZiAoIGEucmVuZGVyT3JkZXIgIT09IGIucmVuZGVyT3JkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIGEucmVuZGVyT3JkZXIgLSBiLnJlbmRlck9yZGVyO1xyXG5cclxuXHR9IGVsc2UgaWYgKCBhLnogIT09IGIueiApIHtcclxuXHJcblx0XHRyZXR1cm4gYi56IC0gYS56O1xyXG5cclxuXHR9IGVsc2Uge1xyXG5cclxuXHRcdHJldHVybiBhLmlkIC0gYi5pZDtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbmZ1bmN0aW9uIFdlYkdMUmVuZGVyTGlzdCgpIHtcclxuXHJcblx0Y29uc3QgcmVuZGVySXRlbXMgPSBbXTtcclxuXHRsZXQgcmVuZGVySXRlbXNJbmRleCA9IDA7XHJcblxyXG5cdGNvbnN0IG9wYXF1ZSA9IFtdO1xyXG5cdGNvbnN0IHRyYW5zbWlzc2l2ZSA9IFtdO1xyXG5cdGNvbnN0IHRyYW5zcGFyZW50ID0gW107XHJcblxyXG5cdGZ1bmN0aW9uIGluaXQoKSB7XHJcblxyXG5cdFx0cmVuZGVySXRlbXNJbmRleCA9IDA7XHJcblxyXG5cdFx0b3BhcXVlLmxlbmd0aCA9IDA7XHJcblx0XHR0cmFuc21pc3NpdmUubGVuZ3RoID0gMDtcclxuXHRcdHRyYW5zcGFyZW50Lmxlbmd0aCA9IDA7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gZ2V0TmV4dFJlbmRlckl0ZW0oIG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cE9yZGVyLCB6LCBncm91cCApIHtcclxuXHJcblx0XHRsZXQgcmVuZGVySXRlbSA9IHJlbmRlckl0ZW1zWyByZW5kZXJJdGVtc0luZGV4IF07XHJcblxyXG5cdFx0aWYgKCByZW5kZXJJdGVtID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRyZW5kZXJJdGVtID0ge1xyXG5cdFx0XHRcdGlkOiBvYmplY3QuaWQsXHJcblx0XHRcdFx0b2JqZWN0OiBvYmplY3QsXHJcblx0XHRcdFx0Z2VvbWV0cnk6IGdlb21ldHJ5LFxyXG5cdFx0XHRcdG1hdGVyaWFsOiBtYXRlcmlhbCxcclxuXHRcdFx0XHRncm91cE9yZGVyOiBncm91cE9yZGVyLFxyXG5cdFx0XHRcdHJlbmRlck9yZGVyOiBvYmplY3QucmVuZGVyT3JkZXIsXHJcblx0XHRcdFx0ejogeixcclxuXHRcdFx0XHRncm91cDogZ3JvdXBcclxuXHRcdFx0fTtcclxuXHJcblx0XHRcdHJlbmRlckl0ZW1zWyByZW5kZXJJdGVtc0luZGV4IF0gPSByZW5kZXJJdGVtO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRyZW5kZXJJdGVtLmlkID0gb2JqZWN0LmlkO1xyXG5cdFx0XHRyZW5kZXJJdGVtLm9iamVjdCA9IG9iamVjdDtcclxuXHRcdFx0cmVuZGVySXRlbS5nZW9tZXRyeSA9IGdlb21ldHJ5O1xyXG5cdFx0XHRyZW5kZXJJdGVtLm1hdGVyaWFsID0gbWF0ZXJpYWw7XHJcblx0XHRcdHJlbmRlckl0ZW0uZ3JvdXBPcmRlciA9IGdyb3VwT3JkZXI7XHJcblx0XHRcdHJlbmRlckl0ZW0ucmVuZGVyT3JkZXIgPSBvYmplY3QucmVuZGVyT3JkZXI7XHJcblx0XHRcdHJlbmRlckl0ZW0ueiA9IHo7XHJcblx0XHRcdHJlbmRlckl0ZW0uZ3JvdXAgPSBncm91cDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmVuZGVySXRlbXNJbmRleCArKztcclxuXHJcblx0XHRyZXR1cm4gcmVuZGVySXRlbTtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBwdXNoKCBvYmplY3QsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXBPcmRlciwgeiwgZ3JvdXAgKSB7XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVySXRlbSA9IGdldE5leHRSZW5kZXJJdGVtKCBvYmplY3QsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXBPcmRlciwgeiwgZ3JvdXAgKTtcclxuXHJcblx0XHRpZiAoIG1hdGVyaWFsLnRyYW5zbWlzc2lvbiA+IDAuMCApIHtcclxuXHJcblx0XHRcdHRyYW5zbWlzc2l2ZS5wdXNoKCByZW5kZXJJdGVtICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwudHJhbnNwYXJlbnQgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHR0cmFuc3BhcmVudC5wdXNoKCByZW5kZXJJdGVtICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdG9wYXF1ZS5wdXNoKCByZW5kZXJJdGVtICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHVuc2hpZnQoIG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cE9yZGVyLCB6LCBncm91cCApIHtcclxuXHJcblx0XHRjb25zdCByZW5kZXJJdGVtID0gZ2V0TmV4dFJlbmRlckl0ZW0oIG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cE9yZGVyLCB6LCBncm91cCApO1xyXG5cclxuXHRcdGlmICggbWF0ZXJpYWwudHJhbnNtaXNzaW9uID4gMC4wICkge1xyXG5cclxuXHRcdFx0dHJhbnNtaXNzaXZlLnVuc2hpZnQoIHJlbmRlckl0ZW0gKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC50cmFuc3BhcmVudCA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdHRyYW5zcGFyZW50LnVuc2hpZnQoIHJlbmRlckl0ZW0gKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0b3BhcXVlLnVuc2hpZnQoIHJlbmRlckl0ZW0gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gc29ydCggY3VzdG9tT3BhcXVlU29ydCwgY3VzdG9tVHJhbnNwYXJlbnRTb3J0ICkge1xyXG5cclxuXHRcdGlmICggb3BhcXVlLmxlbmd0aCA+IDEgKSBvcGFxdWUuc29ydCggY3VzdG9tT3BhcXVlU29ydCB8fCBwYWludGVyU29ydFN0YWJsZSApO1xyXG5cdFx0aWYgKCB0cmFuc21pc3NpdmUubGVuZ3RoID4gMSApIHRyYW5zbWlzc2l2ZS5zb3J0KCBjdXN0b21UcmFuc3BhcmVudFNvcnQgfHwgcmV2ZXJzZVBhaW50ZXJTb3J0U3RhYmxlICk7XHJcblx0XHRpZiAoIHRyYW5zcGFyZW50Lmxlbmd0aCA+IDEgKSB0cmFuc3BhcmVudC5zb3J0KCBjdXN0b21UcmFuc3BhcmVudFNvcnQgfHwgcmV2ZXJzZVBhaW50ZXJTb3J0U3RhYmxlICk7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gZmluaXNoKCkge1xyXG5cclxuXHRcdC8vIENsZWFyIHJlZmVyZW5jZXMgZnJvbSBpbmFjdGl2ZSByZW5kZXJJdGVtcyBpbiB0aGUgbGlzdFxyXG5cclxuXHRcdGZvciAoIGxldCBpID0gcmVuZGVySXRlbXNJbmRleCwgaWwgPSByZW5kZXJJdGVtcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHJlbmRlckl0ZW0gPSByZW5kZXJJdGVtc1sgaSBdO1xyXG5cclxuXHRcdFx0aWYgKCByZW5kZXJJdGVtLmlkID09PSBudWxsICkgYnJlYWs7XHJcblxyXG5cdFx0XHRyZW5kZXJJdGVtLmlkID0gbnVsbDtcclxuXHRcdFx0cmVuZGVySXRlbS5vYmplY3QgPSBudWxsO1xyXG5cdFx0XHRyZW5kZXJJdGVtLmdlb21ldHJ5ID0gbnVsbDtcclxuXHRcdFx0cmVuZGVySXRlbS5tYXRlcmlhbCA9IG51bGw7XHJcblx0XHRcdHJlbmRlckl0ZW0uZ3JvdXAgPSBudWxsO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4ge1xyXG5cclxuXHRcdG9wYXF1ZTogb3BhcXVlLFxyXG5cdFx0dHJhbnNtaXNzaXZlOiB0cmFuc21pc3NpdmUsXHJcblx0XHR0cmFuc3BhcmVudDogdHJhbnNwYXJlbnQsXHJcblxyXG5cdFx0aW5pdDogaW5pdCxcclxuXHRcdHB1c2g6IHB1c2gsXHJcblx0XHR1bnNoaWZ0OiB1bnNoaWZ0LFxyXG5cdFx0ZmluaXNoOiBmaW5pc2gsXHJcblxyXG5cdFx0c29ydDogc29ydFxyXG5cdH07XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBXZWJHTFJlbmRlckxpc3RzKCkge1xyXG5cclxuXHRsZXQgbGlzdHMgPSBuZXcgV2Vha01hcCgpO1xyXG5cclxuXHRmdW5jdGlvbiBnZXQoIHNjZW5lLCByZW5kZXJDYWxsRGVwdGggKSB7XHJcblxyXG5cdFx0Y29uc3QgbGlzdEFycmF5ID0gbGlzdHMuZ2V0KCBzY2VuZSApO1xyXG5cdFx0bGV0IGxpc3Q7XHJcblxyXG5cdFx0aWYgKCBsaXN0QXJyYXkgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGxpc3QgPSBuZXcgV2ViR0xSZW5kZXJMaXN0KCk7XHJcblx0XHRcdGxpc3RzLnNldCggc2NlbmUsIFsgbGlzdCBdICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGlmICggcmVuZGVyQ2FsbERlcHRoID49IGxpc3RBcnJheS5sZW5ndGggKSB7XHJcblxyXG5cdFx0XHRcdGxpc3QgPSBuZXcgV2ViR0xSZW5kZXJMaXN0KCk7XHJcblx0XHRcdFx0bGlzdEFycmF5LnB1c2goIGxpc3QgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGxpc3QgPSBsaXN0QXJyYXlbIHJlbmRlckNhbGxEZXB0aCBdO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbGlzdDtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBkaXNwb3NlKCkge1xyXG5cclxuXHRcdGxpc3RzID0gbmV3IFdlYWtNYXAoKTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4ge1xyXG5cdFx0Z2V0OiBnZXQsXHJcblx0XHRkaXNwb3NlOiBkaXNwb3NlXHJcblx0fTtcclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBXZWJHTFJlbmRlckxpc3RzLCBXZWJHTFJlbmRlckxpc3QgfTtcclxuIiwiaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi8uLi9tYXRoL0NvbG9yLmpzJztcclxuaW1wb3J0IHsgTWF0cml4NCB9IGZyb20gJy4uLy4uL21hdGgvTWF0cml4NC5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjIuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuaW1wb3J0IHsgVW5pZm9ybXNMaWIgfSBmcm9tICcuLi9zaGFkZXJzL1VuaWZvcm1zTGliLmpzJztcclxuXHJcbmZ1bmN0aW9uIFVuaWZvcm1zQ2FjaGUoKSB7XHJcblxyXG5cdGNvbnN0IGxpZ2h0cyA9IHt9O1xyXG5cclxuXHRyZXR1cm4ge1xyXG5cclxuXHRcdGdldDogZnVuY3Rpb24gKCBsaWdodCApIHtcclxuXHJcblx0XHRcdGlmICggbGlnaHRzWyBsaWdodC5pZCBdICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdHJldHVybiBsaWdodHNbIGxpZ2h0LmlkIF07XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRsZXQgdW5pZm9ybXM7XHJcblxyXG5cdFx0XHRzd2l0Y2ggKCBsaWdodC50eXBlICkge1xyXG5cclxuXHRcdFx0XHRjYXNlICdEaXJlY3Rpb25hbExpZ2h0JzpcclxuXHRcdFx0XHRcdHVuaWZvcm1zID0ge1xyXG5cdFx0XHRcdFx0XHRkaXJlY3Rpb246IG5ldyBWZWN0b3IzKCksXHJcblx0XHRcdFx0XHRcdGNvbG9yOiBuZXcgQ29sb3IoKVxyXG5cdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRjYXNlICdTcG90TGlnaHQnOlxyXG5cdFx0XHRcdFx0dW5pZm9ybXMgPSB7XHJcblx0XHRcdFx0XHRcdHBvc2l0aW9uOiBuZXcgVmVjdG9yMygpLFxyXG5cdFx0XHRcdFx0XHRkaXJlY3Rpb246IG5ldyBWZWN0b3IzKCksXHJcblx0XHRcdFx0XHRcdGNvbG9yOiBuZXcgQ29sb3IoKSxcclxuXHRcdFx0XHRcdFx0ZGlzdGFuY2U6IDAsXHJcblx0XHRcdFx0XHRcdGNvbmVDb3M6IDAsXHJcblx0XHRcdFx0XHRcdHBlbnVtYnJhQ29zOiAwLFxyXG5cdFx0XHRcdFx0XHRkZWNheTogMFxyXG5cdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRjYXNlICdQb2ludExpZ2h0JzpcclxuXHRcdFx0XHRcdHVuaWZvcm1zID0ge1xyXG5cdFx0XHRcdFx0XHRwb3NpdGlvbjogbmV3IFZlY3RvcjMoKSxcclxuXHRcdFx0XHRcdFx0Y29sb3I6IG5ldyBDb2xvcigpLFxyXG5cdFx0XHRcdFx0XHRkaXN0YW5jZTogMCxcclxuXHRcdFx0XHRcdFx0ZGVjYXk6IDBcclxuXHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0Y2FzZSAnSGVtaXNwaGVyZUxpZ2h0JzpcclxuXHRcdFx0XHRcdHVuaWZvcm1zID0ge1xyXG5cdFx0XHRcdFx0XHRkaXJlY3Rpb246IG5ldyBWZWN0b3IzKCksXHJcblx0XHRcdFx0XHRcdHNreUNvbG9yOiBuZXcgQ29sb3IoKSxcclxuXHRcdFx0XHRcdFx0Z3JvdW5kQ29sb3I6IG5ldyBDb2xvcigpXHJcblx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdGNhc2UgJ1JlY3RBcmVhTGlnaHQnOlxyXG5cdFx0XHRcdFx0dW5pZm9ybXMgPSB7XHJcblx0XHRcdFx0XHRcdGNvbG9yOiBuZXcgQ29sb3IoKSxcclxuXHRcdFx0XHRcdFx0cG9zaXRpb246IG5ldyBWZWN0b3IzKCksXHJcblx0XHRcdFx0XHRcdGhhbGZXaWR0aDogbmV3IFZlY3RvcjMoKSxcclxuXHRcdFx0XHRcdFx0aGFsZkhlaWdodDogbmV3IFZlY3RvcjMoKVxyXG5cdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0bGlnaHRzWyBsaWdodC5pZCBdID0gdW5pZm9ybXM7XHJcblxyXG5cdFx0XHRyZXR1cm4gdW5pZm9ybXM7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9O1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gU2hhZG93VW5pZm9ybXNDYWNoZSgpIHtcclxuXHJcblx0Y29uc3QgbGlnaHRzID0ge307XHJcblxyXG5cdHJldHVybiB7XHJcblxyXG5cdFx0Z2V0OiBmdW5jdGlvbiAoIGxpZ2h0ICkge1xyXG5cclxuXHRcdFx0aWYgKCBsaWdodHNbIGxpZ2h0LmlkIF0gIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0cmV0dXJuIGxpZ2h0c1sgbGlnaHQuaWQgXTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGxldCB1bmlmb3JtcztcclxuXHJcblx0XHRcdHN3aXRjaCAoIGxpZ2h0LnR5cGUgKSB7XHJcblxyXG5cdFx0XHRcdGNhc2UgJ0RpcmVjdGlvbmFsTGlnaHQnOlxyXG5cdFx0XHRcdFx0dW5pZm9ybXMgPSB7XHJcblx0XHRcdFx0XHRcdHNoYWRvd0ludGVuc2l0eTogMSxcclxuXHRcdFx0XHRcdFx0c2hhZG93QmlhczogMCxcclxuXHRcdFx0XHRcdFx0c2hhZG93Tm9ybWFsQmlhczogMCxcclxuXHRcdFx0XHRcdFx0c2hhZG93UmFkaXVzOiAxLFxyXG5cdFx0XHRcdFx0XHRzaGFkb3dNYXBTaXplOiBuZXcgVmVjdG9yMigpXHJcblx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdGNhc2UgJ1Nwb3RMaWdodCc6XHJcblx0XHRcdFx0XHR1bmlmb3JtcyA9IHtcclxuXHRcdFx0XHRcdFx0c2hhZG93SW50ZW5zaXR5OiAxLFxyXG5cdFx0XHRcdFx0XHRzaGFkb3dCaWFzOiAwLFxyXG5cdFx0XHRcdFx0XHRzaGFkb3dOb3JtYWxCaWFzOiAwLFxyXG5cdFx0XHRcdFx0XHRzaGFkb3dSYWRpdXM6IDEsXHJcblx0XHRcdFx0XHRcdHNoYWRvd01hcFNpemU6IG5ldyBWZWN0b3IyKClcclxuXHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0Y2FzZSAnUG9pbnRMaWdodCc6XHJcblx0XHRcdFx0XHR1bmlmb3JtcyA9IHtcclxuXHRcdFx0XHRcdFx0c2hhZG93SW50ZW5zaXR5OiAxLFxyXG5cdFx0XHRcdFx0XHRzaGFkb3dCaWFzOiAwLFxyXG5cdFx0XHRcdFx0XHRzaGFkb3dOb3JtYWxCaWFzOiAwLFxyXG5cdFx0XHRcdFx0XHRzaGFkb3dSYWRpdXM6IDEsXHJcblx0XHRcdFx0XHRcdHNoYWRvd01hcFNpemU6IG5ldyBWZWN0b3IyKCksXHJcblx0XHRcdFx0XHRcdHNoYWRvd0NhbWVyYU5lYXI6IDEsXHJcblx0XHRcdFx0XHRcdHNoYWRvd0NhbWVyYUZhcjogMTAwMFxyXG5cdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHQvLyBUT0RPIChhYmVsbmF0aW9uKTogc2V0IFJlY3RBcmVhTGlnaHQgc2hhZG93IHVuaWZvcm1zXHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRsaWdodHNbIGxpZ2h0LmlkIF0gPSB1bmlmb3JtcztcclxuXHJcblx0XHRcdHJldHVybiB1bmlmb3JtcztcclxuXHJcblx0XHR9XHJcblxyXG5cdH07XHJcblxyXG59XHJcblxyXG5cclxuXHJcbmxldCBuZXh0VmVyc2lvbiA9IDA7XHJcblxyXG5mdW5jdGlvbiBzaGFkb3dDYXN0aW5nQW5kVGV4dHVyaW5nTGlnaHRzRmlyc3QoIGxpZ2h0QSwgbGlnaHRCICkge1xyXG5cclxuXHRyZXR1cm4gKCBsaWdodEIuY2FzdFNoYWRvdyA/IDIgOiAwICkgLSAoIGxpZ2h0QS5jYXN0U2hhZG93ID8gMiA6IDAgKSArICggbGlnaHRCLm1hcCA/IDEgOiAwICkgLSAoIGxpZ2h0QS5tYXAgPyAxIDogMCApO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gV2ViR0xMaWdodHMoIGV4dGVuc2lvbnMgKSB7XHJcblxyXG5cdGNvbnN0IGNhY2hlID0gbmV3IFVuaWZvcm1zQ2FjaGUoKTtcclxuXHJcblx0Y29uc3Qgc2hhZG93Q2FjaGUgPSBTaGFkb3dVbmlmb3Jtc0NhY2hlKCk7XHJcblxyXG5cdGNvbnN0IHN0YXRlID0ge1xyXG5cclxuXHRcdHZlcnNpb246IDAsXHJcblxyXG5cdFx0aGFzaDoge1xyXG5cdFx0XHRkaXJlY3Rpb25hbExlbmd0aDogLSAxLFxyXG5cdFx0XHRwb2ludExlbmd0aDogLSAxLFxyXG5cdFx0XHRzcG90TGVuZ3RoOiAtIDEsXHJcblx0XHRcdHJlY3RBcmVhTGVuZ3RoOiAtIDEsXHJcblx0XHRcdGhlbWlMZW5ndGg6IC0gMSxcclxuXHJcblx0XHRcdG51bURpcmVjdGlvbmFsU2hhZG93czogLSAxLFxyXG5cdFx0XHRudW1Qb2ludFNoYWRvd3M6IC0gMSxcclxuXHRcdFx0bnVtU3BvdFNoYWRvd3M6IC0gMSxcclxuXHRcdFx0bnVtU3BvdE1hcHM6IC0gMSxcclxuXHJcblx0XHRcdG51bUxpZ2h0UHJvYmVzOiAtIDFcclxuXHRcdH0sXHJcblxyXG5cdFx0YW1iaWVudDogWyAwLCAwLCAwIF0sXHJcblx0XHRwcm9iZTogW10sXHJcblx0XHRkaXJlY3Rpb25hbDogW10sXHJcblx0XHRkaXJlY3Rpb25hbFNoYWRvdzogW10sXHJcblx0XHRkaXJlY3Rpb25hbFNoYWRvd01hcDogW10sXHJcblx0XHRkaXJlY3Rpb25hbFNoYWRvd01hdHJpeDogW10sXHJcblx0XHRzcG90OiBbXSxcclxuXHRcdHNwb3RMaWdodE1hcDogW10sXHJcblx0XHRzcG90U2hhZG93OiBbXSxcclxuXHRcdHNwb3RTaGFkb3dNYXA6IFtdLFxyXG5cdFx0c3BvdExpZ2h0TWF0cml4OiBbXSxcclxuXHRcdHJlY3RBcmVhOiBbXSxcclxuXHRcdHJlY3RBcmVhTFRDMTogbnVsbCxcclxuXHRcdHJlY3RBcmVhTFRDMjogbnVsbCxcclxuXHRcdHBvaW50OiBbXSxcclxuXHRcdHBvaW50U2hhZG93OiBbXSxcclxuXHRcdHBvaW50U2hhZG93TWFwOiBbXSxcclxuXHRcdHBvaW50U2hhZG93TWF0cml4OiBbXSxcclxuXHRcdGhlbWk6IFtdLFxyXG5cdFx0bnVtU3BvdExpZ2h0U2hhZG93c1dpdGhNYXBzOiAwLFxyXG5cdFx0bnVtTGlnaHRQcm9iZXM6IDBcclxuXHJcblx0fTtcclxuXHJcblx0Zm9yICggbGV0IGkgPSAwOyBpIDwgOTsgaSArKyApIHN0YXRlLnByb2JlLnB1c2goIG5ldyBWZWN0b3IzKCkgKTtcclxuXHJcblx0Y29uc3QgdmVjdG9yMyA9IG5ldyBWZWN0b3IzKCk7XHJcblx0Y29uc3QgbWF0cml4NCA9IG5ldyBNYXRyaXg0KCk7XHJcblx0Y29uc3QgbWF0cml4NDIgPSBuZXcgTWF0cml4NCgpO1xyXG5cclxuXHRmdW5jdGlvbiBzZXR1cCggbGlnaHRzICkge1xyXG5cclxuXHRcdGxldCByID0gMCwgZyA9IDAsIGIgPSAwO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDk7IGkgKysgKSBzdGF0ZS5wcm9iZVsgaSBdLnNldCggMCwgMCwgMCApO1xyXG5cclxuXHRcdGxldCBkaXJlY3Rpb25hbExlbmd0aCA9IDA7XHJcblx0XHRsZXQgcG9pbnRMZW5ndGggPSAwO1xyXG5cdFx0bGV0IHNwb3RMZW5ndGggPSAwO1xyXG5cdFx0bGV0IHJlY3RBcmVhTGVuZ3RoID0gMDtcclxuXHRcdGxldCBoZW1pTGVuZ3RoID0gMDtcclxuXHJcblx0XHRsZXQgbnVtRGlyZWN0aW9uYWxTaGFkb3dzID0gMDtcclxuXHRcdGxldCBudW1Qb2ludFNoYWRvd3MgPSAwO1xyXG5cdFx0bGV0IG51bVNwb3RTaGFkb3dzID0gMDtcclxuXHRcdGxldCBudW1TcG90TWFwcyA9IDA7XHJcblx0XHRsZXQgbnVtU3BvdFNoYWRvd3NXaXRoTWFwcyA9IDA7XHJcblxyXG5cdFx0bGV0IG51bUxpZ2h0UHJvYmVzID0gMDtcclxuXHJcblx0XHQvLyBvcmRlcmluZyA6IFtzaGFkb3cgY2FzdGluZyArIG1hcCB0ZXh0dXJpbmcsIG1hcCB0ZXh0dXJpbmcsIHNoYWRvdyBjYXN0aW5nLCBub25lIF1cclxuXHRcdGxpZ2h0cy5zb3J0KCBzaGFkb3dDYXN0aW5nQW5kVGV4dHVyaW5nTGlnaHRzRmlyc3QgKTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBsaWdodHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGxpZ2h0ID0gbGlnaHRzWyBpIF07XHJcblxyXG5cdFx0XHRjb25zdCBjb2xvciA9IGxpZ2h0LmNvbG9yO1xyXG5cdFx0XHRjb25zdCBpbnRlbnNpdHkgPSBsaWdodC5pbnRlbnNpdHk7XHJcblx0XHRcdGNvbnN0IGRpc3RhbmNlID0gbGlnaHQuZGlzdGFuY2U7XHJcblxyXG5cdFx0XHRjb25zdCBzaGFkb3dNYXAgPSAoIGxpZ2h0LnNoYWRvdyAmJiBsaWdodC5zaGFkb3cubWFwICkgPyBsaWdodC5zaGFkb3cubWFwLnRleHR1cmUgOiBudWxsO1xyXG5cclxuXHRcdFx0aWYgKCBsaWdodC5pc0FtYmllbnRMaWdodCApIHtcclxuXHJcblx0XHRcdFx0ciArPSBjb2xvci5yICogaW50ZW5zaXR5O1xyXG5cdFx0XHRcdGcgKz0gY29sb3IuZyAqIGludGVuc2l0eTtcclxuXHRcdFx0XHRiICs9IGNvbG9yLmIgKiBpbnRlbnNpdHk7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBsaWdodC5pc0xpZ2h0UHJvYmUgKSB7XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBqID0gMDsgaiA8IDk7IGogKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0c3RhdGUucHJvYmVbIGogXS5hZGRTY2FsZWRWZWN0b3IoIGxpZ2h0LnNoLmNvZWZmaWNpZW50c1sgaiBdLCBpbnRlbnNpdHkgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRudW1MaWdodFByb2JlcyArKztcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGxpZ2h0LmlzRGlyZWN0aW9uYWxMaWdodCApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgdW5pZm9ybXMgPSBjYWNoZS5nZXQoIGxpZ2h0ICk7XHJcblxyXG5cdFx0XHRcdHVuaWZvcm1zLmNvbG9yLmNvcHkoIGxpZ2h0LmNvbG9yICkubXVsdGlwbHlTY2FsYXIoIGxpZ2h0LmludGVuc2l0eSApO1xyXG5cclxuXHRcdFx0XHRpZiAoIGxpZ2h0LmNhc3RTaGFkb3cgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3Qgc2hhZG93ID0gbGlnaHQuc2hhZG93O1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHNoYWRvd1VuaWZvcm1zID0gc2hhZG93Q2FjaGUuZ2V0KCBsaWdodCApO1xyXG5cclxuXHRcdFx0XHRcdHNoYWRvd1VuaWZvcm1zLnNoYWRvd0ludGVuc2l0eSA9IHNoYWRvdy5pbnRlbnNpdHk7XHJcblx0XHRcdFx0XHRzaGFkb3dVbmlmb3Jtcy5zaGFkb3dCaWFzID0gc2hhZG93LmJpYXM7XHJcblx0XHRcdFx0XHRzaGFkb3dVbmlmb3Jtcy5zaGFkb3dOb3JtYWxCaWFzID0gc2hhZG93Lm5vcm1hbEJpYXM7XHJcblx0XHRcdFx0XHRzaGFkb3dVbmlmb3Jtcy5zaGFkb3dSYWRpdXMgPSBzaGFkb3cucmFkaXVzO1xyXG5cdFx0XHRcdFx0c2hhZG93VW5pZm9ybXMuc2hhZG93TWFwU2l6ZSA9IHNoYWRvdy5tYXBTaXplO1xyXG5cclxuXHRcdFx0XHRcdHN0YXRlLmRpcmVjdGlvbmFsU2hhZG93WyBkaXJlY3Rpb25hbExlbmd0aCBdID0gc2hhZG93VW5pZm9ybXM7XHJcblx0XHRcdFx0XHRzdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hcFsgZGlyZWN0aW9uYWxMZW5ndGggXSA9IHNoYWRvd01hcDtcclxuXHRcdFx0XHRcdHN0YXRlLmRpcmVjdGlvbmFsU2hhZG93TWF0cml4WyBkaXJlY3Rpb25hbExlbmd0aCBdID0gbGlnaHQuc2hhZG93Lm1hdHJpeDtcclxuXHJcblx0XHRcdFx0XHRudW1EaXJlY3Rpb25hbFNoYWRvd3MgKys7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0c3RhdGUuZGlyZWN0aW9uYWxbIGRpcmVjdGlvbmFsTGVuZ3RoIF0gPSB1bmlmb3JtcztcclxuXHJcblx0XHRcdFx0ZGlyZWN0aW9uYWxMZW5ndGggKys7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBsaWdodC5pc1Nwb3RMaWdodCApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgdW5pZm9ybXMgPSBjYWNoZS5nZXQoIGxpZ2h0ICk7XHJcblxyXG5cdFx0XHRcdHVuaWZvcm1zLnBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTtcclxuXHJcblx0XHRcdFx0dW5pZm9ybXMuY29sb3IuY29weSggY29sb3IgKS5tdWx0aXBseVNjYWxhciggaW50ZW5zaXR5ICk7XHJcblx0XHRcdFx0dW5pZm9ybXMuZGlzdGFuY2UgPSBkaXN0YW5jZTtcclxuXHJcblx0XHRcdFx0dW5pZm9ybXMuY29uZUNvcyA9IE1hdGguY29zKCBsaWdodC5hbmdsZSApO1xyXG5cdFx0XHRcdHVuaWZvcm1zLnBlbnVtYnJhQ29zID0gTWF0aC5jb3MoIGxpZ2h0LmFuZ2xlICogKCAxIC0gbGlnaHQucGVudW1icmEgKSApO1xyXG5cdFx0XHRcdHVuaWZvcm1zLmRlY2F5ID0gbGlnaHQuZGVjYXk7XHJcblxyXG5cdFx0XHRcdHN0YXRlLnNwb3RbIHNwb3RMZW5ndGggXSA9IHVuaWZvcm1zO1xyXG5cclxuXHRcdFx0XHRjb25zdCBzaGFkb3cgPSBsaWdodC5zaGFkb3c7XHJcblxyXG5cdFx0XHRcdGlmICggbGlnaHQubWFwICkge1xyXG5cclxuXHRcdFx0XHRcdHN0YXRlLnNwb3RMaWdodE1hcFsgbnVtU3BvdE1hcHMgXSA9IGxpZ2h0Lm1hcDtcclxuXHRcdFx0XHRcdG51bVNwb3RNYXBzICsrO1xyXG5cclxuXHRcdFx0XHRcdC8vIG1ha2Ugc3VyZSB0aGUgbGlnaHRNYXRyaXggaXMgdXAgdG8gZGF0ZVxyXG5cdFx0XHRcdFx0Ly8gVE9ETyA6IGRvIGl0IGlmIHJlcXVpcmVkIG9ubHlcclxuXHRcdFx0XHRcdHNoYWRvdy51cGRhdGVNYXRyaWNlcyggbGlnaHQgKTtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGxpZ2h0LmNhc3RTaGFkb3cgKSBudW1TcG90U2hhZG93c1dpdGhNYXBzICsrO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHN0YXRlLnNwb3RMaWdodE1hdHJpeFsgc3BvdExlbmd0aCBdID0gc2hhZG93Lm1hdHJpeDtcclxuXHJcblx0XHRcdFx0aWYgKCBsaWdodC5jYXN0U2hhZG93ICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHNoYWRvd1VuaWZvcm1zID0gc2hhZG93Q2FjaGUuZ2V0KCBsaWdodCApO1xyXG5cclxuXHRcdFx0XHRcdHNoYWRvd1VuaWZvcm1zLnNoYWRvd0ludGVuc2l0eSA9IHNoYWRvdy5pbnRlbnNpdHk7XHJcblx0XHRcdFx0XHRzaGFkb3dVbmlmb3Jtcy5zaGFkb3dCaWFzID0gc2hhZG93LmJpYXM7XHJcblx0XHRcdFx0XHRzaGFkb3dVbmlmb3Jtcy5zaGFkb3dOb3JtYWxCaWFzID0gc2hhZG93Lm5vcm1hbEJpYXM7XHJcblx0XHRcdFx0XHRzaGFkb3dVbmlmb3Jtcy5zaGFkb3dSYWRpdXMgPSBzaGFkb3cucmFkaXVzO1xyXG5cdFx0XHRcdFx0c2hhZG93VW5pZm9ybXMuc2hhZG93TWFwU2l6ZSA9IHNoYWRvdy5tYXBTaXplO1xyXG5cclxuXHRcdFx0XHRcdHN0YXRlLnNwb3RTaGFkb3dbIHNwb3RMZW5ndGggXSA9IHNoYWRvd1VuaWZvcm1zO1xyXG5cdFx0XHRcdFx0c3RhdGUuc3BvdFNoYWRvd01hcFsgc3BvdExlbmd0aCBdID0gc2hhZG93TWFwO1xyXG5cclxuXHRcdFx0XHRcdG51bVNwb3RTaGFkb3dzICsrO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHNwb3RMZW5ndGggKys7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBsaWdodC5pc1JlY3RBcmVhTGlnaHQgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHVuaWZvcm1zID0gY2FjaGUuZ2V0KCBsaWdodCApO1xyXG5cclxuXHRcdFx0XHR1bmlmb3Jtcy5jb2xvci5jb3B5KCBjb2xvciApLm11bHRpcGx5U2NhbGFyKCBpbnRlbnNpdHkgKTtcclxuXHJcblx0XHRcdFx0dW5pZm9ybXMuaGFsZldpZHRoLnNldCggbGlnaHQud2lkdGggKiAwLjUsIDAuMCwgMC4wICk7XHJcblx0XHRcdFx0dW5pZm9ybXMuaGFsZkhlaWdodC5zZXQoIDAuMCwgbGlnaHQuaGVpZ2h0ICogMC41LCAwLjAgKTtcclxuXHJcblx0XHRcdFx0c3RhdGUucmVjdEFyZWFbIHJlY3RBcmVhTGVuZ3RoIF0gPSB1bmlmb3JtcztcclxuXHJcblx0XHRcdFx0cmVjdEFyZWFMZW5ndGggKys7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBsaWdodC5pc1BvaW50TGlnaHQgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHVuaWZvcm1zID0gY2FjaGUuZ2V0KCBsaWdodCApO1xyXG5cclxuXHRcdFx0XHR1bmlmb3Jtcy5jb2xvci5jb3B5KCBsaWdodC5jb2xvciApLm11bHRpcGx5U2NhbGFyKCBsaWdodC5pbnRlbnNpdHkgKTtcclxuXHRcdFx0XHR1bmlmb3Jtcy5kaXN0YW5jZSA9IGxpZ2h0LmRpc3RhbmNlO1xyXG5cdFx0XHRcdHVuaWZvcm1zLmRlY2F5ID0gbGlnaHQuZGVjYXk7XHJcblxyXG5cdFx0XHRcdGlmICggbGlnaHQuY2FzdFNoYWRvdyApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBzaGFkb3cgPSBsaWdodC5zaGFkb3c7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3Qgc2hhZG93VW5pZm9ybXMgPSBzaGFkb3dDYWNoZS5nZXQoIGxpZ2h0ICk7XHJcblxyXG5cdFx0XHRcdFx0c2hhZG93VW5pZm9ybXMuc2hhZG93SW50ZW5zaXR5ID0gc2hhZG93LmludGVuc2l0eTtcclxuXHRcdFx0XHRcdHNoYWRvd1VuaWZvcm1zLnNoYWRvd0JpYXMgPSBzaGFkb3cuYmlhcztcclxuXHRcdFx0XHRcdHNoYWRvd1VuaWZvcm1zLnNoYWRvd05vcm1hbEJpYXMgPSBzaGFkb3cubm9ybWFsQmlhcztcclxuXHRcdFx0XHRcdHNoYWRvd1VuaWZvcm1zLnNoYWRvd1JhZGl1cyA9IHNoYWRvdy5yYWRpdXM7XHJcblx0XHRcdFx0XHRzaGFkb3dVbmlmb3Jtcy5zaGFkb3dNYXBTaXplID0gc2hhZG93Lm1hcFNpemU7XHJcblx0XHRcdFx0XHRzaGFkb3dVbmlmb3Jtcy5zaGFkb3dDYW1lcmFOZWFyID0gc2hhZG93LmNhbWVyYS5uZWFyO1xyXG5cdFx0XHRcdFx0c2hhZG93VW5pZm9ybXMuc2hhZG93Q2FtZXJhRmFyID0gc2hhZG93LmNhbWVyYS5mYXI7XHJcblxyXG5cdFx0XHRcdFx0c3RhdGUucG9pbnRTaGFkb3dbIHBvaW50TGVuZ3RoIF0gPSBzaGFkb3dVbmlmb3JtcztcclxuXHRcdFx0XHRcdHN0YXRlLnBvaW50U2hhZG93TWFwWyBwb2ludExlbmd0aCBdID0gc2hhZG93TWFwO1xyXG5cdFx0XHRcdFx0c3RhdGUucG9pbnRTaGFkb3dNYXRyaXhbIHBvaW50TGVuZ3RoIF0gPSBsaWdodC5zaGFkb3cubWF0cml4O1xyXG5cclxuXHRcdFx0XHRcdG51bVBvaW50U2hhZG93cyArKztcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRzdGF0ZS5wb2ludFsgcG9pbnRMZW5ndGggXSA9IHVuaWZvcm1zO1xyXG5cclxuXHRcdFx0XHRwb2ludExlbmd0aCArKztcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGxpZ2h0LmlzSGVtaXNwaGVyZUxpZ2h0ICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB1bmlmb3JtcyA9IGNhY2hlLmdldCggbGlnaHQgKTtcclxuXHJcblx0XHRcdFx0dW5pZm9ybXMuc2t5Q29sb3IuY29weSggbGlnaHQuY29sb3IgKS5tdWx0aXBseVNjYWxhciggaW50ZW5zaXR5ICk7XHJcblx0XHRcdFx0dW5pZm9ybXMuZ3JvdW5kQ29sb3IuY29weSggbGlnaHQuZ3JvdW5kQ29sb3IgKS5tdWx0aXBseVNjYWxhciggaW50ZW5zaXR5ICk7XHJcblxyXG5cdFx0XHRcdHN0YXRlLmhlbWlbIGhlbWlMZW5ndGggXSA9IHVuaWZvcm1zO1xyXG5cclxuXHRcdFx0XHRoZW1pTGVuZ3RoICsrO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHJlY3RBcmVhTGVuZ3RoID4gMCApIHtcclxuXHJcblx0XHRcdGlmICggZXh0ZW5zaW9ucy5oYXMoICdPRVNfdGV4dHVyZV9mbG9hdF9saW5lYXInICkgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdHN0YXRlLnJlY3RBcmVhTFRDMSA9IFVuaWZvcm1zTGliLkxUQ19GTE9BVF8xO1xyXG5cdFx0XHRcdHN0YXRlLnJlY3RBcmVhTFRDMiA9IFVuaWZvcm1zTGliLkxUQ19GTE9BVF8yO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0c3RhdGUucmVjdEFyZWFMVEMxID0gVW5pZm9ybXNMaWIuTFRDX0hBTEZfMTtcclxuXHRcdFx0XHRzdGF0ZS5yZWN0QXJlYUxUQzIgPSBVbmlmb3Jtc0xpYi5MVENfSEFMRl8yO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRzdGF0ZS5hbWJpZW50WyAwIF0gPSByO1xyXG5cdFx0c3RhdGUuYW1iaWVudFsgMSBdID0gZztcclxuXHRcdHN0YXRlLmFtYmllbnRbIDIgXSA9IGI7XHJcblxyXG5cdFx0Y29uc3QgaGFzaCA9IHN0YXRlLmhhc2g7XHJcblxyXG5cdFx0aWYgKCBoYXNoLmRpcmVjdGlvbmFsTGVuZ3RoICE9PSBkaXJlY3Rpb25hbExlbmd0aCB8fFxyXG5cdFx0XHRoYXNoLnBvaW50TGVuZ3RoICE9PSBwb2ludExlbmd0aCB8fFxyXG5cdFx0XHRoYXNoLnNwb3RMZW5ndGggIT09IHNwb3RMZW5ndGggfHxcclxuXHRcdFx0aGFzaC5yZWN0QXJlYUxlbmd0aCAhPT0gcmVjdEFyZWFMZW5ndGggfHxcclxuXHRcdFx0aGFzaC5oZW1pTGVuZ3RoICE9PSBoZW1pTGVuZ3RoIHx8XHJcblx0XHRcdGhhc2gubnVtRGlyZWN0aW9uYWxTaGFkb3dzICE9PSBudW1EaXJlY3Rpb25hbFNoYWRvd3MgfHxcclxuXHRcdFx0aGFzaC5udW1Qb2ludFNoYWRvd3MgIT09IG51bVBvaW50U2hhZG93cyB8fFxyXG5cdFx0XHRoYXNoLm51bVNwb3RTaGFkb3dzICE9PSBudW1TcG90U2hhZG93cyB8fFxyXG5cdFx0XHRoYXNoLm51bVNwb3RNYXBzICE9PSBudW1TcG90TWFwcyB8fFxyXG5cdFx0XHRoYXNoLm51bUxpZ2h0UHJvYmVzICE9PSBudW1MaWdodFByb2JlcyApIHtcclxuXHJcblx0XHRcdHN0YXRlLmRpcmVjdGlvbmFsLmxlbmd0aCA9IGRpcmVjdGlvbmFsTGVuZ3RoO1xyXG5cdFx0XHRzdGF0ZS5zcG90Lmxlbmd0aCA9IHNwb3RMZW5ndGg7XHJcblx0XHRcdHN0YXRlLnJlY3RBcmVhLmxlbmd0aCA9IHJlY3RBcmVhTGVuZ3RoO1xyXG5cdFx0XHRzdGF0ZS5wb2ludC5sZW5ndGggPSBwb2ludExlbmd0aDtcclxuXHRcdFx0c3RhdGUuaGVtaS5sZW5ndGggPSBoZW1pTGVuZ3RoO1xyXG5cclxuXHRcdFx0c3RhdGUuZGlyZWN0aW9uYWxTaGFkb3cubGVuZ3RoID0gbnVtRGlyZWN0aW9uYWxTaGFkb3dzO1xyXG5cdFx0XHRzdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hcC5sZW5ndGggPSBudW1EaXJlY3Rpb25hbFNoYWRvd3M7XHJcblx0XHRcdHN0YXRlLnBvaW50U2hhZG93Lmxlbmd0aCA9IG51bVBvaW50U2hhZG93cztcclxuXHRcdFx0c3RhdGUucG9pbnRTaGFkb3dNYXAubGVuZ3RoID0gbnVtUG9pbnRTaGFkb3dzO1xyXG5cdFx0XHRzdGF0ZS5zcG90U2hhZG93Lmxlbmd0aCA9IG51bVNwb3RTaGFkb3dzO1xyXG5cdFx0XHRzdGF0ZS5zcG90U2hhZG93TWFwLmxlbmd0aCA9IG51bVNwb3RTaGFkb3dzO1xyXG5cdFx0XHRzdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeC5sZW5ndGggPSBudW1EaXJlY3Rpb25hbFNoYWRvd3M7XHJcblx0XHRcdHN0YXRlLnBvaW50U2hhZG93TWF0cml4Lmxlbmd0aCA9IG51bVBvaW50U2hhZG93cztcclxuXHRcdFx0c3RhdGUuc3BvdExpZ2h0TWF0cml4Lmxlbmd0aCA9IG51bVNwb3RTaGFkb3dzICsgbnVtU3BvdE1hcHMgLSBudW1TcG90U2hhZG93c1dpdGhNYXBzO1xyXG5cdFx0XHRzdGF0ZS5zcG90TGlnaHRNYXAubGVuZ3RoID0gbnVtU3BvdE1hcHM7XHJcblx0XHRcdHN0YXRlLm51bVNwb3RMaWdodFNoYWRvd3NXaXRoTWFwcyA9IG51bVNwb3RTaGFkb3dzV2l0aE1hcHM7XHJcblx0XHRcdHN0YXRlLm51bUxpZ2h0UHJvYmVzID0gbnVtTGlnaHRQcm9iZXM7XHJcblxyXG5cdFx0XHRoYXNoLmRpcmVjdGlvbmFsTGVuZ3RoID0gZGlyZWN0aW9uYWxMZW5ndGg7XHJcblx0XHRcdGhhc2gucG9pbnRMZW5ndGggPSBwb2ludExlbmd0aDtcclxuXHRcdFx0aGFzaC5zcG90TGVuZ3RoID0gc3BvdExlbmd0aDtcclxuXHRcdFx0aGFzaC5yZWN0QXJlYUxlbmd0aCA9IHJlY3RBcmVhTGVuZ3RoO1xyXG5cdFx0XHRoYXNoLmhlbWlMZW5ndGggPSBoZW1pTGVuZ3RoO1xyXG5cclxuXHRcdFx0aGFzaC5udW1EaXJlY3Rpb25hbFNoYWRvd3MgPSBudW1EaXJlY3Rpb25hbFNoYWRvd3M7XHJcblx0XHRcdGhhc2gubnVtUG9pbnRTaGFkb3dzID0gbnVtUG9pbnRTaGFkb3dzO1xyXG5cdFx0XHRoYXNoLm51bVNwb3RTaGFkb3dzID0gbnVtU3BvdFNoYWRvd3M7XHJcblx0XHRcdGhhc2gubnVtU3BvdE1hcHMgPSBudW1TcG90TWFwcztcclxuXHJcblx0XHRcdGhhc2gubnVtTGlnaHRQcm9iZXMgPSBudW1MaWdodFByb2JlcztcclxuXHJcblx0XHRcdHN0YXRlLnZlcnNpb24gPSBuZXh0VmVyc2lvbiArKztcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gc2V0dXBWaWV3KCBsaWdodHMsIGNhbWVyYSApIHtcclxuXHJcblx0XHRsZXQgZGlyZWN0aW9uYWxMZW5ndGggPSAwO1xyXG5cdFx0bGV0IHBvaW50TGVuZ3RoID0gMDtcclxuXHRcdGxldCBzcG90TGVuZ3RoID0gMDtcclxuXHRcdGxldCByZWN0QXJlYUxlbmd0aCA9IDA7XHJcblx0XHRsZXQgaGVtaUxlbmd0aCA9IDA7XHJcblxyXG5cdFx0Y29uc3Qgdmlld01hdHJpeCA9IGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2U7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gbGlnaHRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBsaWdodCA9IGxpZ2h0c1sgaSBdO1xyXG5cclxuXHRcdFx0aWYgKCBsaWdodC5pc0RpcmVjdGlvbmFsTGlnaHQgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHVuaWZvcm1zID0gc3RhdGUuZGlyZWN0aW9uYWxbIGRpcmVjdGlvbmFsTGVuZ3RoIF07XHJcblxyXG5cdFx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7XHJcblx0XHRcdFx0dmVjdG9yMy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCApO1xyXG5cdFx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbi5zdWIoIHZlY3RvcjMgKTtcclxuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKCB2aWV3TWF0cml4ICk7XHJcblxyXG5cdFx0XHRcdGRpcmVjdGlvbmFsTGVuZ3RoICsrO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggbGlnaHQuaXNTcG90TGlnaHQgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHVuaWZvcm1zID0gc3RhdGUuc3BvdFsgc3BvdExlbmd0aCBdO1xyXG5cclxuXHRcdFx0XHR1bmlmb3Jtcy5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7XHJcblx0XHRcdFx0dW5pZm9ybXMucG9zaXRpb24uYXBwbHlNYXRyaXg0KCB2aWV3TWF0cml4ICk7XHJcblxyXG5cdFx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7XHJcblx0XHRcdFx0dmVjdG9yMy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCApO1xyXG5cdFx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbi5zdWIoIHZlY3RvcjMgKTtcclxuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKCB2aWV3TWF0cml4ICk7XHJcblxyXG5cdFx0XHRcdHNwb3RMZW5ndGggKys7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBsaWdodC5pc1JlY3RBcmVhTGlnaHQgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHVuaWZvcm1zID0gc3RhdGUucmVjdEFyZWFbIHJlY3RBcmVhTGVuZ3RoIF07XHJcblxyXG5cdFx0XHRcdHVuaWZvcm1zLnBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTtcclxuXHRcdFx0XHR1bmlmb3Jtcy5wb3NpdGlvbi5hcHBseU1hdHJpeDQoIHZpZXdNYXRyaXggKTtcclxuXHJcblx0XHRcdFx0Ly8gZXh0cmFjdCBsb2NhbCByb3RhdGlvbiBvZiBsaWdodCB0byBkZXJpdmUgd2lkdGgvaGVpZ2h0IGhhbGYgdmVjdG9yc1xyXG5cdFx0XHRcdG1hdHJpeDQyLmlkZW50aXR5KCk7XHJcblx0XHRcdFx0bWF0cml4NC5jb3B5KCBsaWdodC5tYXRyaXhXb3JsZCApO1xyXG5cdFx0XHRcdG1hdHJpeDQucHJlbXVsdGlwbHkoIHZpZXdNYXRyaXggKTtcclxuXHRcdFx0XHRtYXRyaXg0Mi5leHRyYWN0Um90YXRpb24oIG1hdHJpeDQgKTtcclxuXHJcblx0XHRcdFx0dW5pZm9ybXMuaGFsZldpZHRoLnNldCggbGlnaHQud2lkdGggKiAwLjUsIDAuMCwgMC4wICk7XHJcblx0XHRcdFx0dW5pZm9ybXMuaGFsZkhlaWdodC5zZXQoIDAuMCwgbGlnaHQuaGVpZ2h0ICogMC41LCAwLjAgKTtcclxuXHJcblx0XHRcdFx0dW5pZm9ybXMuaGFsZldpZHRoLmFwcGx5TWF0cml4NCggbWF0cml4NDIgKTtcclxuXHRcdFx0XHR1bmlmb3Jtcy5oYWxmSGVpZ2h0LmFwcGx5TWF0cml4NCggbWF0cml4NDIgKTtcclxuXHJcblx0XHRcdFx0cmVjdEFyZWFMZW5ndGggKys7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBsaWdodC5pc1BvaW50TGlnaHQgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHVuaWZvcm1zID0gc3RhdGUucG9pbnRbIHBvaW50TGVuZ3RoIF07XHJcblxyXG5cdFx0XHRcdHVuaWZvcm1zLnBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTtcclxuXHRcdFx0XHR1bmlmb3Jtcy5wb3NpdGlvbi5hcHBseU1hdHJpeDQoIHZpZXdNYXRyaXggKTtcclxuXHJcblx0XHRcdFx0cG9pbnRMZW5ndGggKys7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBsaWdodC5pc0hlbWlzcGhlcmVMaWdodCApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgdW5pZm9ybXMgPSBzdGF0ZS5oZW1pWyBoZW1pTGVuZ3RoIF07XHJcblxyXG5cdFx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7XHJcblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbiggdmlld01hdHJpeCApO1xyXG5cclxuXHRcdFx0XHRoZW1pTGVuZ3RoICsrO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4ge1xyXG5cdFx0c2V0dXA6IHNldHVwLFxyXG5cdFx0c2V0dXBWaWV3OiBzZXR1cFZpZXcsXHJcblx0XHRzdGF0ZTogc3RhdGVcclxuXHR9O1xyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCB7IFdlYkdMTGlnaHRzIH07XHJcbiIsImltcG9ydCB7IFdlYkdMTGlnaHRzIH0gZnJvbSAnLi9XZWJHTExpZ2h0cy5qcyc7XHJcblxyXG5mdW5jdGlvbiBXZWJHTFJlbmRlclN0YXRlKCBleHRlbnNpb25zICkge1xyXG5cclxuXHRjb25zdCBsaWdodHMgPSBuZXcgV2ViR0xMaWdodHMoIGV4dGVuc2lvbnMgKTtcclxuXHJcblx0Y29uc3QgbGlnaHRzQXJyYXkgPSBbXTtcclxuXHRjb25zdCBzaGFkb3dzQXJyYXkgPSBbXTtcclxuXHJcblx0ZnVuY3Rpb24gaW5pdCggY2FtZXJhICkge1xyXG5cclxuXHRcdHN0YXRlLmNhbWVyYSA9IGNhbWVyYTtcclxuXHJcblx0XHRsaWdodHNBcnJheS5sZW5ndGggPSAwO1xyXG5cdFx0c2hhZG93c0FycmF5Lmxlbmd0aCA9IDA7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gcHVzaExpZ2h0KCBsaWdodCApIHtcclxuXHJcblx0XHRsaWdodHNBcnJheS5wdXNoKCBsaWdodCApO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHB1c2hTaGFkb3coIHNoYWRvd0xpZ2h0ICkge1xyXG5cclxuXHRcdHNoYWRvd3NBcnJheS5wdXNoKCBzaGFkb3dMaWdodCApO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHNldHVwTGlnaHRzKCkge1xyXG5cclxuXHRcdGxpZ2h0cy5zZXR1cCggbGlnaHRzQXJyYXkgKTtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBzZXR1cExpZ2h0c1ZpZXcoIGNhbWVyYSApIHtcclxuXHJcblx0XHRsaWdodHMuc2V0dXBWaWV3KCBsaWdodHNBcnJheSwgY2FtZXJhICk7XHJcblxyXG5cdH1cclxuXHJcblx0Y29uc3Qgc3RhdGUgPSB7XHJcblx0XHRsaWdodHNBcnJheTogbGlnaHRzQXJyYXksXHJcblx0XHRzaGFkb3dzQXJyYXk6IHNoYWRvd3NBcnJheSxcclxuXHJcblx0XHRjYW1lcmE6IG51bGwsXHJcblxyXG5cdFx0bGlnaHRzOiBsaWdodHMsXHJcblxyXG5cdFx0dHJhbnNtaXNzaW9uUmVuZGVyVGFyZ2V0OiB7fVxyXG5cdH07XHJcblxyXG5cdHJldHVybiB7XHJcblx0XHRpbml0OiBpbml0LFxyXG5cdFx0c3RhdGU6IHN0YXRlLFxyXG5cdFx0c2V0dXBMaWdodHM6IHNldHVwTGlnaHRzLFxyXG5cdFx0c2V0dXBMaWdodHNWaWV3OiBzZXR1cExpZ2h0c1ZpZXcsXHJcblxyXG5cdFx0cHVzaExpZ2h0OiBwdXNoTGlnaHQsXHJcblx0XHRwdXNoU2hhZG93OiBwdXNoU2hhZG93XHJcblx0fTtcclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIFdlYkdMUmVuZGVyU3RhdGVzKCBleHRlbnNpb25zICkge1xyXG5cclxuXHRsZXQgcmVuZGVyU3RhdGVzID0gbmV3IFdlYWtNYXAoKTtcclxuXHJcblx0ZnVuY3Rpb24gZ2V0KCBzY2VuZSwgcmVuZGVyQ2FsbERlcHRoID0gMCApIHtcclxuXHJcblx0XHRjb25zdCByZW5kZXJTdGF0ZUFycmF5ID0gcmVuZGVyU3RhdGVzLmdldCggc2NlbmUgKTtcclxuXHRcdGxldCByZW5kZXJTdGF0ZTtcclxuXHJcblx0XHRpZiAoIHJlbmRlclN0YXRlQXJyYXkgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHJlbmRlclN0YXRlID0gbmV3IFdlYkdMUmVuZGVyU3RhdGUoIGV4dGVuc2lvbnMgKTtcclxuXHRcdFx0cmVuZGVyU3RhdGVzLnNldCggc2NlbmUsIFsgcmVuZGVyU3RhdGUgXSApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRpZiAoIHJlbmRlckNhbGxEZXB0aCA+PSByZW5kZXJTdGF0ZUFycmF5Lmxlbmd0aCApIHtcclxuXHJcblx0XHRcdFx0cmVuZGVyU3RhdGUgPSBuZXcgV2ViR0xSZW5kZXJTdGF0ZSggZXh0ZW5zaW9ucyApO1xyXG5cdFx0XHRcdHJlbmRlclN0YXRlQXJyYXkucHVzaCggcmVuZGVyU3RhdGUgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHJlbmRlclN0YXRlID0gcmVuZGVyU3RhdGVBcnJheVsgcmVuZGVyQ2FsbERlcHRoIF07XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiByZW5kZXJTdGF0ZTtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBkaXNwb3NlKCkge1xyXG5cclxuXHRcdHJlbmRlclN0YXRlcyA9IG5ldyBXZWFrTWFwKCk7XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIHtcclxuXHRcdGdldDogZ2V0LFxyXG5cdFx0ZGlzcG9zZTogZGlzcG9zZVxyXG5cdH07XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgV2ViR0xSZW5kZXJTdGF0ZXMgfTtcclxuIiwiZXhwb3J0IGNvbnN0IHZlcnRleCA9IC8qIGdsc2wgKi9gXHJcbnZvaWQgbWFpbigpIHtcclxuXHJcblx0Z2xfUG9zaXRpb24gPSB2ZWM0KCBwb3NpdGlvbiwgMS4wICk7XHJcblxyXG59XHJcbmA7XHJcblxyXG5leHBvcnQgY29uc3QgZnJhZ21lbnQgPSAvKiBnbHNsICovYFxyXG51bmlmb3JtIHNhbXBsZXIyRCBzaGFkb3dfcGFzcztcclxudW5pZm9ybSB2ZWMyIHJlc29sdXRpb247XHJcbnVuaWZvcm0gZmxvYXQgcmFkaXVzO1xyXG5cclxuI2luY2x1ZGUgPHBhY2tpbmc+XHJcblxyXG52b2lkIG1haW4oKSB7XHJcblxyXG5cdGNvbnN0IGZsb2F0IHNhbXBsZXMgPSBmbG9hdCggVlNNX1NBTVBMRVMgKTtcclxuXHJcblx0ZmxvYXQgbWVhbiA9IDAuMDtcclxuXHRmbG9hdCBzcXVhcmVkX21lYW4gPSAwLjA7XHJcblxyXG5cdGZsb2F0IHV2U3RyaWRlID0gc2FtcGxlcyA8PSAxLjAgPyAwLjAgOiAyLjAgLyAoIHNhbXBsZXMgLSAxLjAgKTtcclxuXHRmbG9hdCB1dlN0YXJ0ID0gc2FtcGxlcyA8PSAxLjAgPyAwLjAgOiAtIDEuMDtcclxuXHRmb3IgKCBmbG9hdCBpID0gMC4wOyBpIDwgc2FtcGxlczsgaSArKyApIHtcclxuXHJcblx0XHRmbG9hdCB1dk9mZnNldCA9IHV2U3RhcnQgKyBpICogdXZTdHJpZGU7XHJcblxyXG5cdFx0I2lmZGVmIEhPUklaT05UQUxfUEFTU1xyXG5cclxuXHRcdFx0dmVjMiBkaXN0cmlidXRpb24gPSB1bnBhY2tSR0JBVG8ySGFsZiggdGV4dHVyZTJEKCBzaGFkb3dfcGFzcywgKCBnbF9GcmFnQ29vcmQueHkgKyB2ZWMyKCB1dk9mZnNldCwgMC4wICkgKiByYWRpdXMgKSAvIHJlc29sdXRpb24gKSApO1xyXG5cdFx0XHRtZWFuICs9IGRpc3RyaWJ1dGlvbi54O1xyXG5cdFx0XHRzcXVhcmVkX21lYW4gKz0gZGlzdHJpYnV0aW9uLnkgKiBkaXN0cmlidXRpb24ueSArIGRpc3RyaWJ1dGlvbi54ICogZGlzdHJpYnV0aW9uLng7XHJcblxyXG5cdFx0I2Vsc2VcclxuXHJcblx0XHRcdGZsb2F0IGRlcHRoID0gdW5wYWNrUkdCQVRvRGVwdGgoIHRleHR1cmUyRCggc2hhZG93X3Bhc3MsICggZ2xfRnJhZ0Nvb3JkLnh5ICsgdmVjMiggMC4wLCB1dk9mZnNldCApICogcmFkaXVzICkgLyByZXNvbHV0aW9uICkgKTtcclxuXHRcdFx0bWVhbiArPSBkZXB0aDtcclxuXHRcdFx0c3F1YXJlZF9tZWFuICs9IGRlcHRoICogZGVwdGg7XHJcblxyXG5cdFx0I2VuZGlmXHJcblxyXG5cdH1cclxuXHJcblx0bWVhbiA9IG1lYW4gLyBzYW1wbGVzO1xyXG5cdHNxdWFyZWRfbWVhbiA9IHNxdWFyZWRfbWVhbiAvIHNhbXBsZXM7XHJcblxyXG5cdGZsb2F0IHN0ZF9kZXYgPSBzcXJ0KCBzcXVhcmVkX21lYW4gLSBtZWFuICogbWVhbiApO1xyXG5cclxuXHRnbF9GcmFnQ29sb3IgPSBwYWNrMkhhbGZUb1JHQkEoIHZlYzIoIG1lYW4sIHN0ZF9kZXYgKSApO1xyXG5cclxufVxyXG5gO1xyXG4iLCJpbXBvcnQgeyBGcm9udFNpZGUsIEJhY2tTaWRlLCBEb3VibGVTaWRlLCBOZWFyZXN0RmlsdGVyLCBQQ0ZTaGFkb3dNYXAsIFZTTVNoYWRvd01hcCwgUkdCQURlcHRoUGFja2luZywgTm9CbGVuZGluZyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IFdlYkdMUmVuZGVyVGFyZ2V0IH0gZnJvbSAnLi4vV2ViR0xSZW5kZXJUYXJnZXQuanMnO1xyXG5pbXBvcnQgeyBNZXNoRGVwdGhNYXRlcmlhbCB9IGZyb20gJy4uLy4uL21hdGVyaWFscy9NZXNoRGVwdGhNYXRlcmlhbC5qcyc7XHJcbmltcG9ydCB7IE1lc2hEaXN0YW5jZU1hdGVyaWFsIH0gZnJvbSAnLi4vLi4vbWF0ZXJpYWxzL01lc2hEaXN0YW5jZU1hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgU2hhZGVyTWF0ZXJpYWwgfSBmcm9tICcuLi8uLi9tYXRlcmlhbHMvU2hhZGVyTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyBCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi8uLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcbmltcG9ydCB7IEJ1ZmZlckdlb21ldHJ5IH0gZnJvbSAnLi4vLi4vY29yZS9CdWZmZXJHZW9tZXRyeS5qcyc7XHJcbmltcG9ydCB7IE1lc2ggfSBmcm9tICcuLi8uLi9vYmplY3RzL01lc2guanMnO1xyXG5pbXBvcnQgeyBWZWN0b3I0IH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3I0LmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMi5qcyc7XHJcbmltcG9ydCB7IEZydXN0dW0gfSBmcm9tICcuLi8uLi9tYXRoL0ZydXN0dW0uanMnO1xyXG5cclxuaW1wb3J0ICogYXMgdnNtIGZyb20gJy4uL3NoYWRlcnMvU2hhZGVyTGliL3ZzbS5nbHNsLmpzJztcclxuXHJcbmZ1bmN0aW9uIFdlYkdMU2hhZG93TWFwKCByZW5kZXJlciwgb2JqZWN0cywgY2FwYWJpbGl0aWVzICkge1xyXG5cclxuXHRsZXQgX2ZydXN0dW0gPSBuZXcgRnJ1c3R1bSgpO1xyXG5cclxuXHRjb25zdCBfc2hhZG93TWFwU2l6ZSA9IG5ldyBWZWN0b3IyKCksXHJcblx0XHRfdmlld3BvcnRTaXplID0gbmV3IFZlY3RvcjIoKSxcclxuXHJcblx0XHRfdmlld3BvcnQgPSBuZXcgVmVjdG9yNCgpLFxyXG5cclxuXHRcdF9kZXB0aE1hdGVyaWFsID0gbmV3IE1lc2hEZXB0aE1hdGVyaWFsKCB7IGRlcHRoUGFja2luZzogUkdCQURlcHRoUGFja2luZyB9ICksXHJcblx0XHRfZGlzdGFuY2VNYXRlcmlhbCA9IG5ldyBNZXNoRGlzdGFuY2VNYXRlcmlhbCgpLFxyXG5cclxuXHRcdF9tYXRlcmlhbENhY2hlID0ge30sXHJcblxyXG5cdFx0X21heFRleHR1cmVTaXplID0gY2FwYWJpbGl0aWVzLm1heFRleHR1cmVTaXplO1xyXG5cclxuXHRjb25zdCBzaGFkb3dTaWRlID0geyBbIEZyb250U2lkZSBdOiBCYWNrU2lkZSwgWyBCYWNrU2lkZSBdOiBGcm9udFNpZGUsIFsgRG91YmxlU2lkZSBdOiBEb3VibGVTaWRlIH07XHJcblxyXG5cdGNvbnN0IHNoYWRvd01hdGVyaWFsVmVydGljYWwgPSBuZXcgU2hhZGVyTWF0ZXJpYWwoIHtcclxuXHRcdGRlZmluZXM6IHtcclxuXHRcdFx0VlNNX1NBTVBMRVM6IDhcclxuXHRcdH0sXHJcblx0XHR1bmlmb3Jtczoge1xyXG5cdFx0XHRzaGFkb3dfcGFzczogeyB2YWx1ZTogbnVsbCB9LFxyXG5cdFx0XHRyZXNvbHV0aW9uOiB7IHZhbHVlOiBuZXcgVmVjdG9yMigpIH0sXHJcblx0XHRcdHJhZGl1czogeyB2YWx1ZTogNC4wIH1cclxuXHRcdH0sXHJcblxyXG5cdFx0dmVydGV4U2hhZGVyOiB2c20udmVydGV4LFxyXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IHZzbS5mcmFnbWVudFxyXG5cclxuXHR9ICk7XHJcblxyXG5cdGNvbnN0IHNoYWRvd01hdGVyaWFsSG9yaXpvbnRhbCA9IHNoYWRvd01hdGVyaWFsVmVydGljYWwuY2xvbmUoKTtcclxuXHRzaGFkb3dNYXRlcmlhbEhvcml6b250YWwuZGVmaW5lcy5IT1JJWk9OVEFMX1BBU1MgPSAxO1xyXG5cclxuXHRjb25zdCBmdWxsU2NyZWVuVHJpID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XHJcblx0ZnVsbFNjcmVlblRyaS5zZXRBdHRyaWJ1dGUoXHJcblx0XHQncG9zaXRpb24nLFxyXG5cdFx0bmV3IEJ1ZmZlckF0dHJpYnV0ZShcclxuXHRcdFx0bmV3IEZsb2F0MzJBcnJheSggWyAtIDEsIC0gMSwgMC41LCAzLCAtIDEsIDAuNSwgLSAxLCAzLCAwLjUgXSApLFxyXG5cdFx0XHQzXHJcblx0XHQpXHJcblx0KTtcclxuXHJcblx0Y29uc3QgZnVsbFNjcmVlbk1lc2ggPSBuZXcgTWVzaCggZnVsbFNjcmVlblRyaSwgc2hhZG93TWF0ZXJpYWxWZXJ0aWNhbCApO1xyXG5cclxuXHRjb25zdCBzY29wZSA9IHRoaXM7XHJcblxyXG5cdHRoaXMuZW5hYmxlZCA9IGZhbHNlO1xyXG5cclxuXHR0aGlzLmF1dG9VcGRhdGUgPSB0cnVlO1xyXG5cdHRoaXMubmVlZHNVcGRhdGUgPSBmYWxzZTtcclxuXHJcblx0dGhpcy50eXBlID0gUENGU2hhZG93TWFwO1xyXG5cdGxldCBfcHJldmlvdXNUeXBlID0gdGhpcy50eXBlO1xyXG5cclxuXHR0aGlzLnJlbmRlciA9IGZ1bmN0aW9uICggbGlnaHRzLCBzY2VuZSwgY2FtZXJhICkge1xyXG5cclxuXHRcdGlmICggc2NvcGUuZW5hYmxlZCA9PT0gZmFsc2UgKSByZXR1cm47XHJcblx0XHRpZiAoIHNjb3BlLmF1dG9VcGRhdGUgPT09IGZhbHNlICYmIHNjb3BlLm5lZWRzVXBkYXRlID09PSBmYWxzZSApIHJldHVybjtcclxuXHJcblx0XHRpZiAoIGxpZ2h0cy5sZW5ndGggPT09IDAgKSByZXR1cm47XHJcblxyXG5cdFx0Y29uc3QgY3VycmVudFJlbmRlclRhcmdldCA9IHJlbmRlcmVyLmdldFJlbmRlclRhcmdldCgpO1xyXG5cdFx0Y29uc3QgYWN0aXZlQ3ViZUZhY2UgPSByZW5kZXJlci5nZXRBY3RpdmVDdWJlRmFjZSgpO1xyXG5cdFx0Y29uc3QgYWN0aXZlTWlwbWFwTGV2ZWwgPSByZW5kZXJlci5nZXRBY3RpdmVNaXBtYXBMZXZlbCgpO1xyXG5cclxuXHRcdGNvbnN0IF9zdGF0ZSA9IHJlbmRlcmVyLnN0YXRlO1xyXG5cclxuXHRcdC8vIFNldCBHTCBzdGF0ZSBmb3IgZGVwdGggbWFwLlxyXG5cdFx0X3N0YXRlLnNldEJsZW5kaW5nKCBOb0JsZW5kaW5nICk7XHJcblx0XHRfc3RhdGUuYnVmZmVycy5jb2xvci5zZXRDbGVhciggMSwgMSwgMSwgMSApO1xyXG5cdFx0X3N0YXRlLmJ1ZmZlcnMuZGVwdGguc2V0VGVzdCggdHJ1ZSApO1xyXG5cdFx0X3N0YXRlLnNldFNjaXNzb3JUZXN0KCBmYWxzZSApO1xyXG5cclxuXHRcdC8vIGNoZWNrIGZvciBzaGFkb3cgbWFwIHR5cGUgY2hhbmdlc1xyXG5cclxuXHRcdGNvbnN0IHRvVlNNID0gKCBfcHJldmlvdXNUeXBlICE9PSBWU01TaGFkb3dNYXAgJiYgdGhpcy50eXBlID09PSBWU01TaGFkb3dNYXAgKTtcclxuXHRcdGNvbnN0IGZyb21WU00gPSAoIF9wcmV2aW91c1R5cGUgPT09IFZTTVNoYWRvd01hcCAmJiB0aGlzLnR5cGUgIT09IFZTTVNoYWRvd01hcCApO1xyXG5cclxuXHRcdC8vIHJlbmRlciBkZXB0aCBtYXBcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gbGlnaHRzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgbGlnaHQgPSBsaWdodHNbIGkgXTtcclxuXHRcdFx0Y29uc3Qgc2hhZG93ID0gbGlnaHQuc2hhZG93O1xyXG5cclxuXHRcdFx0aWYgKCBzaGFkb3cgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xTaGFkb3dNYXA6JywgbGlnaHQsICdoYXMgbm8gc2hhZG93LicgKTtcclxuXHRcdFx0XHRjb250aW51ZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggc2hhZG93LmF1dG9VcGRhdGUgPT09IGZhbHNlICYmIHNoYWRvdy5uZWVkc1VwZGF0ZSA9PT0gZmFsc2UgKSBjb250aW51ZTtcclxuXHJcblx0XHRcdF9zaGFkb3dNYXBTaXplLmNvcHkoIHNoYWRvdy5tYXBTaXplICk7XHJcblxyXG5cdFx0XHRjb25zdCBzaGFkb3dGcmFtZUV4dGVudHMgPSBzaGFkb3cuZ2V0RnJhbWVFeHRlbnRzKCk7XHJcblxyXG5cdFx0XHRfc2hhZG93TWFwU2l6ZS5tdWx0aXBseSggc2hhZG93RnJhbWVFeHRlbnRzICk7XHJcblxyXG5cdFx0XHRfdmlld3BvcnRTaXplLmNvcHkoIHNoYWRvdy5tYXBTaXplICk7XHJcblxyXG5cdFx0XHRpZiAoIF9zaGFkb3dNYXBTaXplLnggPiBfbWF4VGV4dHVyZVNpemUgfHwgX3NoYWRvd01hcFNpemUueSA+IF9tYXhUZXh0dXJlU2l6ZSApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBfc2hhZG93TWFwU2l6ZS54ID4gX21heFRleHR1cmVTaXplICkge1xyXG5cclxuXHRcdFx0XHRcdF92aWV3cG9ydFNpemUueCA9IE1hdGguZmxvb3IoIF9tYXhUZXh0dXJlU2l6ZSAvIHNoYWRvd0ZyYW1lRXh0ZW50cy54ICk7XHJcblx0XHRcdFx0XHRfc2hhZG93TWFwU2l6ZS54ID0gX3ZpZXdwb3J0U2l6ZS54ICogc2hhZG93RnJhbWVFeHRlbnRzLng7XHJcblx0XHRcdFx0XHRzaGFkb3cubWFwU2l6ZS54ID0gX3ZpZXdwb3J0U2l6ZS54O1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICggX3NoYWRvd01hcFNpemUueSA+IF9tYXhUZXh0dXJlU2l6ZSApIHtcclxuXHJcblx0XHRcdFx0XHRfdmlld3BvcnRTaXplLnkgPSBNYXRoLmZsb29yKCBfbWF4VGV4dHVyZVNpemUgLyBzaGFkb3dGcmFtZUV4dGVudHMueSApO1xyXG5cdFx0XHRcdFx0X3NoYWRvd01hcFNpemUueSA9IF92aWV3cG9ydFNpemUueSAqIHNoYWRvd0ZyYW1lRXh0ZW50cy55O1xyXG5cdFx0XHRcdFx0c2hhZG93Lm1hcFNpemUueSA9IF92aWV3cG9ydFNpemUueTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBzaGFkb3cubWFwID09PSBudWxsIHx8IHRvVlNNID09PSB0cnVlIHx8IGZyb21WU00gPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHBhcnMgPSAoIHRoaXMudHlwZSAhPT0gVlNNU2hhZG93TWFwICkgPyB7IG1pbkZpbHRlcjogTmVhcmVzdEZpbHRlciwgbWFnRmlsdGVyOiBOZWFyZXN0RmlsdGVyIH0gOiB7fTtcclxuXHJcblx0XHRcdFx0aWYgKCBzaGFkb3cubWFwICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRcdHNoYWRvdy5tYXAuZGlzcG9zZSgpO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHNoYWRvdy5tYXAgPSBuZXcgV2ViR0xSZW5kZXJUYXJnZXQoIF9zaGFkb3dNYXBTaXplLngsIF9zaGFkb3dNYXBTaXplLnksIHBhcnMgKTtcclxuXHRcdFx0XHRzaGFkb3cubWFwLnRleHR1cmUubmFtZSA9IGxpZ2h0Lm5hbWUgKyAnLnNoYWRvd01hcCc7XHJcblxyXG5cdFx0XHRcdHNoYWRvdy5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCBzaGFkb3cubWFwICk7XHJcblx0XHRcdHJlbmRlcmVyLmNsZWFyKCk7XHJcblxyXG5cdFx0XHRjb25zdCB2aWV3cG9ydENvdW50ID0gc2hhZG93LmdldFZpZXdwb3J0Q291bnQoKTtcclxuXHJcblx0XHRcdGZvciAoIGxldCB2cCA9IDA7IHZwIDwgdmlld3BvcnRDb3VudDsgdnAgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHZpZXdwb3J0ID0gc2hhZG93LmdldFZpZXdwb3J0KCB2cCApO1xyXG5cclxuXHRcdFx0XHRfdmlld3BvcnQuc2V0KFxyXG5cdFx0XHRcdFx0X3ZpZXdwb3J0U2l6ZS54ICogdmlld3BvcnQueCxcclxuXHRcdFx0XHRcdF92aWV3cG9ydFNpemUueSAqIHZpZXdwb3J0LnksXHJcblx0XHRcdFx0XHRfdmlld3BvcnRTaXplLnggKiB2aWV3cG9ydC56LFxyXG5cdFx0XHRcdFx0X3ZpZXdwb3J0U2l6ZS55ICogdmlld3BvcnQud1xyXG5cdFx0XHRcdCk7XHJcblxyXG5cdFx0XHRcdF9zdGF0ZS52aWV3cG9ydCggX3ZpZXdwb3J0ICk7XHJcblxyXG5cdFx0XHRcdHNoYWRvdy51cGRhdGVNYXRyaWNlcyggbGlnaHQsIHZwICk7XHJcblxyXG5cdFx0XHRcdF9mcnVzdHVtID0gc2hhZG93LmdldEZydXN0dW0oKTtcclxuXHJcblx0XHRcdFx0cmVuZGVyT2JqZWN0KCBzY2VuZSwgY2FtZXJhLCBzaGFkb3cuY2FtZXJhLCBsaWdodCwgdGhpcy50eXBlICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBkbyBibHVyIHBhc3MgZm9yIFZTTVxyXG5cclxuXHRcdFx0aWYgKCBzaGFkb3cuaXNQb2ludExpZ2h0U2hhZG93ICE9PSB0cnVlICYmIHRoaXMudHlwZSA9PT0gVlNNU2hhZG93TWFwICkge1xyXG5cclxuXHRcdFx0XHRWU01QYXNzKCBzaGFkb3csIGNhbWVyYSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0c2hhZG93Lm5lZWRzVXBkYXRlID0gZmFsc2U7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdF9wcmV2aW91c1R5cGUgPSB0aGlzLnR5cGU7XHJcblxyXG5cdFx0c2NvcGUubmVlZHNVcGRhdGUgPSBmYWxzZTtcclxuXHJcblx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIGN1cnJlbnRSZW5kZXJUYXJnZXQsIGFjdGl2ZUN1YmVGYWNlLCBhY3RpdmVNaXBtYXBMZXZlbCApO1xyXG5cclxuXHR9O1xyXG5cclxuXHRmdW5jdGlvbiBWU01QYXNzKCBzaGFkb3csIGNhbWVyYSApIHtcclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeSA9IG9iamVjdHMudXBkYXRlKCBmdWxsU2NyZWVuTWVzaCApO1xyXG5cclxuXHRcdGlmICggc2hhZG93TWF0ZXJpYWxWZXJ0aWNhbC5kZWZpbmVzLlZTTV9TQU1QTEVTICE9PSBzaGFkb3cuYmx1clNhbXBsZXMgKSB7XHJcblxyXG5cdFx0XHRzaGFkb3dNYXRlcmlhbFZlcnRpY2FsLmRlZmluZXMuVlNNX1NBTVBMRVMgPSBzaGFkb3cuYmx1clNhbXBsZXM7XHJcblx0XHRcdHNoYWRvd01hdGVyaWFsSG9yaXpvbnRhbC5kZWZpbmVzLlZTTV9TQU1QTEVTID0gc2hhZG93LmJsdXJTYW1wbGVzO1xyXG5cclxuXHRcdFx0c2hhZG93TWF0ZXJpYWxWZXJ0aWNhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblx0XHRcdHNoYWRvd01hdGVyaWFsSG9yaXpvbnRhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggc2hhZG93Lm1hcFBhc3MgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRzaGFkb3cubWFwUGFzcyA9IG5ldyBXZWJHTFJlbmRlclRhcmdldCggX3NoYWRvd01hcFNpemUueCwgX3NoYWRvd01hcFNpemUueSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyB2ZXJ0aWNhbCBwYXNzXHJcblxyXG5cdFx0c2hhZG93TWF0ZXJpYWxWZXJ0aWNhbC51bmlmb3Jtcy5zaGFkb3dfcGFzcy52YWx1ZSA9IHNoYWRvdy5tYXAudGV4dHVyZTtcclxuXHRcdHNoYWRvd01hdGVyaWFsVmVydGljYWwudW5pZm9ybXMucmVzb2x1dGlvbi52YWx1ZSA9IHNoYWRvdy5tYXBTaXplO1xyXG5cdFx0c2hhZG93TWF0ZXJpYWxWZXJ0aWNhbC51bmlmb3Jtcy5yYWRpdXMudmFsdWUgPSBzaGFkb3cucmFkaXVzO1xyXG5cdFx0cmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCBzaGFkb3cubWFwUGFzcyApO1xyXG5cdFx0cmVuZGVyZXIuY2xlYXIoKTtcclxuXHRcdHJlbmRlcmVyLnJlbmRlckJ1ZmZlckRpcmVjdCggY2FtZXJhLCBudWxsLCBnZW9tZXRyeSwgc2hhZG93TWF0ZXJpYWxWZXJ0aWNhbCwgZnVsbFNjcmVlbk1lc2gsIG51bGwgKTtcclxuXHJcblx0XHQvLyBob3Jpem9udGFsIHBhc3NcclxuXHJcblx0XHRzaGFkb3dNYXRlcmlhbEhvcml6b250YWwudW5pZm9ybXMuc2hhZG93X3Bhc3MudmFsdWUgPSBzaGFkb3cubWFwUGFzcy50ZXh0dXJlO1xyXG5cdFx0c2hhZG93TWF0ZXJpYWxIb3Jpem9udGFsLnVuaWZvcm1zLnJlc29sdXRpb24udmFsdWUgPSBzaGFkb3cubWFwU2l6ZTtcclxuXHRcdHNoYWRvd01hdGVyaWFsSG9yaXpvbnRhbC51bmlmb3Jtcy5yYWRpdXMudmFsdWUgPSBzaGFkb3cucmFkaXVzO1xyXG5cdFx0cmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCBzaGFkb3cubWFwICk7XHJcblx0XHRyZW5kZXJlci5jbGVhcigpO1xyXG5cdFx0cmVuZGVyZXIucmVuZGVyQnVmZmVyRGlyZWN0KCBjYW1lcmEsIG51bGwsIGdlb21ldHJ5LCBzaGFkb3dNYXRlcmlhbEhvcml6b250YWwsIGZ1bGxTY3JlZW5NZXNoLCBudWxsICk7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gZ2V0RGVwdGhNYXRlcmlhbCggb2JqZWN0LCBtYXRlcmlhbCwgbGlnaHQsIHR5cGUgKSB7XHJcblxyXG5cdFx0bGV0IHJlc3VsdCA9IG51bGw7XHJcblxyXG5cdFx0Y29uc3QgY3VzdG9tTWF0ZXJpYWwgPSAoIGxpZ2h0LmlzUG9pbnRMaWdodCA9PT0gdHJ1ZSApID8gb2JqZWN0LmN1c3RvbURpc3RhbmNlTWF0ZXJpYWwgOiBvYmplY3QuY3VzdG9tRGVwdGhNYXRlcmlhbDtcclxuXHJcblx0XHRpZiAoIGN1c3RvbU1hdGVyaWFsICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRyZXN1bHQgPSBjdXN0b21NYXRlcmlhbDtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0cmVzdWx0ID0gKCBsaWdodC5pc1BvaW50TGlnaHQgPT09IHRydWUgKSA/IF9kaXN0YW5jZU1hdGVyaWFsIDogX2RlcHRoTWF0ZXJpYWw7XHJcblxyXG5cdFx0XHRpZiAoICggcmVuZGVyZXIubG9jYWxDbGlwcGluZ0VuYWJsZWQgJiYgbWF0ZXJpYWwuY2xpcFNoYWRvd3MgPT09IHRydWUgJiYgQXJyYXkuaXNBcnJheSggbWF0ZXJpYWwuY2xpcHBpbmdQbGFuZXMgKSAmJiBtYXRlcmlhbC5jbGlwcGluZ1BsYW5lcy5sZW5ndGggIT09IDAgKSB8fFxyXG5cdFx0XHRcdCggbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwICYmIG1hdGVyaWFsLmRpc3BsYWNlbWVudFNjYWxlICE9PSAwICkgfHxcclxuXHRcdFx0XHQoIG1hdGVyaWFsLmFscGhhTWFwICYmIG1hdGVyaWFsLmFscGhhVGVzdCA+IDAgKSB8fFxyXG5cdFx0XHRcdCggbWF0ZXJpYWwubWFwICYmIG1hdGVyaWFsLmFscGhhVGVzdCA+IDAgKSApIHtcclxuXHJcblx0XHRcdFx0Ly8gaW4gdGhpcyBjYXNlIHdlIG5lZWQgYSB1bmlxdWUgbWF0ZXJpYWwgaW5zdGFuY2UgcmVmbGVjdGluZyB0aGVcclxuXHRcdFx0XHQvLyBhcHByb3ByaWF0ZSBzdGF0ZVxyXG5cclxuXHRcdFx0XHRjb25zdCBrZXlBID0gcmVzdWx0LnV1aWQsIGtleUIgPSBtYXRlcmlhbC51dWlkO1xyXG5cclxuXHRcdFx0XHRsZXQgbWF0ZXJpYWxzRm9yVmFyaWFudCA9IF9tYXRlcmlhbENhY2hlWyBrZXlBIF07XHJcblxyXG5cdFx0XHRcdGlmICggbWF0ZXJpYWxzRm9yVmFyaWFudCA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdG1hdGVyaWFsc0ZvclZhcmlhbnQgPSB7fTtcclxuXHRcdFx0XHRcdF9tYXRlcmlhbENhY2hlWyBrZXlBIF0gPSBtYXRlcmlhbHNGb3JWYXJpYW50O1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGxldCBjYWNoZWRNYXRlcmlhbCA9IG1hdGVyaWFsc0ZvclZhcmlhbnRbIGtleUIgXTtcclxuXHJcblx0XHRcdFx0aWYgKCBjYWNoZWRNYXRlcmlhbCA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdGNhY2hlZE1hdGVyaWFsID0gcmVzdWx0LmNsb25lKCk7XHJcblx0XHRcdFx0XHRtYXRlcmlhbHNGb3JWYXJpYW50WyBrZXlCIF0gPSBjYWNoZWRNYXRlcmlhbDtcclxuXHRcdFx0XHRcdG1hdGVyaWFsLmFkZEV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25NYXRlcmlhbERpc3Bvc2UgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRyZXN1bHQgPSBjYWNoZWRNYXRlcmlhbDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmVzdWx0LnZpc2libGUgPSBtYXRlcmlhbC52aXNpYmxlO1xyXG5cdFx0cmVzdWx0LndpcmVmcmFtZSA9IG1hdGVyaWFsLndpcmVmcmFtZTtcclxuXHJcblx0XHRpZiAoIHR5cGUgPT09IFZTTVNoYWRvd01hcCApIHtcclxuXHJcblx0XHRcdHJlc3VsdC5zaWRlID0gKCBtYXRlcmlhbC5zaGFkb3dTaWRlICE9PSBudWxsICkgPyBtYXRlcmlhbC5zaGFkb3dTaWRlIDogbWF0ZXJpYWwuc2lkZTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0cmVzdWx0LnNpZGUgPSAoIG1hdGVyaWFsLnNoYWRvd1NpZGUgIT09IG51bGwgKSA/IG1hdGVyaWFsLnNoYWRvd1NpZGUgOiBzaGFkb3dTaWRlWyBtYXRlcmlhbC5zaWRlIF07XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJlc3VsdC5hbHBoYU1hcCA9IG1hdGVyaWFsLmFscGhhTWFwO1xyXG5cdFx0cmVzdWx0LmFscGhhVGVzdCA9IG1hdGVyaWFsLmFscGhhVGVzdDtcclxuXHRcdHJlc3VsdC5tYXAgPSBtYXRlcmlhbC5tYXA7XHJcblxyXG5cdFx0cmVzdWx0LmNsaXBTaGFkb3dzID0gbWF0ZXJpYWwuY2xpcFNoYWRvd3M7XHJcblx0XHRyZXN1bHQuY2xpcHBpbmdQbGFuZXMgPSBtYXRlcmlhbC5jbGlwcGluZ1BsYW5lcztcclxuXHRcdHJlc3VsdC5jbGlwSW50ZXJzZWN0aW9uID0gbWF0ZXJpYWwuY2xpcEludGVyc2VjdGlvbjtcclxuXHJcblx0XHRyZXN1bHQuZGlzcGxhY2VtZW50TWFwID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwO1xyXG5cdFx0cmVzdWx0LmRpc3BsYWNlbWVudFNjYWxlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50U2NhbGU7XHJcblx0XHRyZXN1bHQuZGlzcGxhY2VtZW50QmlhcyA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudEJpYXM7XHJcblxyXG5cdFx0cmVzdWx0LndpcmVmcmFtZUxpbmV3aWR0aCA9IG1hdGVyaWFsLndpcmVmcmFtZUxpbmV3aWR0aDtcclxuXHRcdHJlc3VsdC5saW5ld2lkdGggPSBtYXRlcmlhbC5saW5ld2lkdGg7XHJcblxyXG5cdFx0aWYgKCBsaWdodC5pc1BvaW50TGlnaHQgPT09IHRydWUgJiYgcmVzdWx0LmlzTWVzaERpc3RhbmNlTWF0ZXJpYWwgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBtYXRlcmlhbFByb3BlcnRpZXMgPSByZW5kZXJlci5wcm9wZXJ0aWVzLmdldCggcmVzdWx0ICk7XHJcblx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy5saWdodCA9IGxpZ2h0O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHJlbmRlck9iamVjdCggb2JqZWN0LCBjYW1lcmEsIHNoYWRvd0NhbWVyYSwgbGlnaHQsIHR5cGUgKSB7XHJcblxyXG5cdFx0aWYgKCBvYmplY3QudmlzaWJsZSA9PT0gZmFsc2UgKSByZXR1cm47XHJcblxyXG5cdFx0Y29uc3QgdmlzaWJsZSA9IG9iamVjdC5sYXllcnMudGVzdCggY2FtZXJhLmxheWVycyApO1xyXG5cclxuXHRcdGlmICggdmlzaWJsZSAmJiAoIG9iamVjdC5pc01lc2ggfHwgb2JqZWN0LmlzTGluZSB8fCBvYmplY3QuaXNQb2ludHMgKSApIHtcclxuXHJcblx0XHRcdGlmICggKCBvYmplY3QuY2FzdFNoYWRvdyB8fCAoIG9iamVjdC5yZWNlaXZlU2hhZG93ICYmIHR5cGUgPT09IFZTTVNoYWRvd01hcCApICkgJiYgKCAhIG9iamVjdC5mcnVzdHVtQ3VsbGVkIHx8IF9mcnVzdHVtLmludGVyc2VjdHNPYmplY3QoIG9iamVjdCApICkgKSB7XHJcblxyXG5cdFx0XHRcdG9iamVjdC5tb2RlbFZpZXdNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggc2hhZG93Q2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSwgb2JqZWN0Lm1hdHJpeFdvcmxkICk7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGdlb21ldHJ5ID0gb2JqZWN0cy51cGRhdGUoIG9iamVjdCApO1xyXG5cdFx0XHRcdGNvbnN0IG1hdGVyaWFsID0gb2JqZWN0Lm1hdGVyaWFsO1xyXG5cclxuXHRcdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIG1hdGVyaWFsICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgZ3JvdXBzID0gZ2VvbWV0cnkuZ3JvdXBzO1xyXG5cclxuXHRcdFx0XHRcdGZvciAoIGxldCBrID0gMCwga2wgPSBncm91cHMubGVuZ3RoOyBrIDwga2w7IGsgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCBncm91cCA9IGdyb3Vwc1sgayBdO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBncm91cE1hdGVyaWFsID0gbWF0ZXJpYWxbIGdyb3VwLm1hdGVyaWFsSW5kZXggXTtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggZ3JvdXBNYXRlcmlhbCAmJiBncm91cE1hdGVyaWFsLnZpc2libGUgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGRlcHRoTWF0ZXJpYWwgPSBnZXREZXB0aE1hdGVyaWFsKCBvYmplY3QsIGdyb3VwTWF0ZXJpYWwsIGxpZ2h0LCB0eXBlICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdG9iamVjdC5vbkJlZm9yZVNoYWRvdyggcmVuZGVyZXIsIG9iamVjdCwgY2FtZXJhLCBzaGFkb3dDYW1lcmEsIGdlb21ldHJ5LCBkZXB0aE1hdGVyaWFsLCBncm91cCApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRyZW5kZXJlci5yZW5kZXJCdWZmZXJEaXJlY3QoIHNoYWRvd0NhbWVyYSwgbnVsbCwgZ2VvbWV0cnksIGRlcHRoTWF0ZXJpYWwsIG9iamVjdCwgZ3JvdXAgKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0b2JqZWN0Lm9uQWZ0ZXJTaGFkb3coIHJlbmRlcmVyLCBvYmplY3QsIGNhbWVyYSwgc2hhZG93Q2FtZXJhLCBnZW9tZXRyeSwgZGVwdGhNYXRlcmlhbCwgZ3JvdXAgKTtcclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLnZpc2libGUgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgZGVwdGhNYXRlcmlhbCA9IGdldERlcHRoTWF0ZXJpYWwoIG9iamVjdCwgbWF0ZXJpYWwsIGxpZ2h0LCB0eXBlICk7XHJcblxyXG5cdFx0XHRcdFx0b2JqZWN0Lm9uQmVmb3JlU2hhZG93KCByZW5kZXJlciwgb2JqZWN0LCBjYW1lcmEsIHNoYWRvd0NhbWVyYSwgZ2VvbWV0cnksIGRlcHRoTWF0ZXJpYWwsIG51bGwgKTtcclxuXHJcblx0XHRcdFx0XHRyZW5kZXJlci5yZW5kZXJCdWZmZXJEaXJlY3QoIHNoYWRvd0NhbWVyYSwgbnVsbCwgZ2VvbWV0cnksIGRlcHRoTWF0ZXJpYWwsIG9iamVjdCwgbnVsbCApO1xyXG5cclxuXHRcdFx0XHRcdG9iamVjdC5vbkFmdGVyU2hhZG93KCByZW5kZXJlciwgb2JqZWN0LCBjYW1lcmEsIHNoYWRvd0NhbWVyYSwgZ2VvbWV0cnksIGRlcHRoTWF0ZXJpYWwsIG51bGwgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBjaGlsZHJlbiA9IG9iamVjdC5jaGlsZHJlbjtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0cmVuZGVyT2JqZWN0KCBjaGlsZHJlblsgaSBdLCBjYW1lcmEsIHNoYWRvd0NhbWVyYSwgbGlnaHQsIHR5cGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gb25NYXRlcmlhbERpc3Bvc2UoIGV2ZW50ICkge1xyXG5cclxuXHRcdGNvbnN0IG1hdGVyaWFsID0gZXZlbnQudGFyZ2V0O1xyXG5cclxuXHRcdG1hdGVyaWFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25NYXRlcmlhbERpc3Bvc2UgKTtcclxuXHJcblx0XHQvLyBtYWtlIHN1cmUgdG8gcmVtb3ZlIHRoZSB1bmlxdWUgZGlzdGFuY2UvZGVwdGggbWF0ZXJpYWxzIHVzZWQgZm9yIHNoYWRvdyBtYXAgcmVuZGVyaW5nXHJcblxyXG5cdFx0Zm9yICggY29uc3QgaWQgaW4gX21hdGVyaWFsQ2FjaGUgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBjYWNoZSA9IF9tYXRlcmlhbENhY2hlWyBpZCBdO1xyXG5cclxuXHRcdFx0Y29uc3QgdXVpZCA9IGV2ZW50LnRhcmdldC51dWlkO1xyXG5cclxuXHRcdFx0aWYgKCB1dWlkIGluIGNhY2hlICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBzaGFkb3dNYXRlcmlhbCA9IGNhY2hlWyB1dWlkIF07XHJcblx0XHRcdFx0c2hhZG93TWF0ZXJpYWwuZGlzcG9zZSgpO1xyXG5cdFx0XHRcdGRlbGV0ZSBjYWNoZVsgdXVpZCBdO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCB7IFdlYkdMU2hhZG93TWFwIH07XHJcbiIsImltcG9ydCB7IE5vdEVxdWFsRGVwdGgsIEdyZWF0ZXJEZXB0aCwgR3JlYXRlckVxdWFsRGVwdGgsIEVxdWFsRGVwdGgsIExlc3NFcXVhbERlcHRoLCBMZXNzRGVwdGgsIEFsd2F5c0RlcHRoLCBOZXZlckRlcHRoLCBDdWxsRmFjZUZyb250LCBDdWxsRmFjZUJhY2ssIEN1bGxGYWNlTm9uZSwgRG91YmxlU2lkZSwgQmFja1NpZGUsIEN1c3RvbUJsZW5kaW5nLCBNdWx0aXBseUJsZW5kaW5nLCBTdWJ0cmFjdGl2ZUJsZW5kaW5nLCBBZGRpdGl2ZUJsZW5kaW5nLCBOb0JsZW5kaW5nLCBOb3JtYWxCbGVuZGluZywgQWRkRXF1YXRpb24sIFN1YnRyYWN0RXF1YXRpb24sIFJldmVyc2VTdWJ0cmFjdEVxdWF0aW9uLCBNaW5FcXVhdGlvbiwgTWF4RXF1YXRpb24sIFplcm9GYWN0b3IsIE9uZUZhY3RvciwgU3JjQ29sb3JGYWN0b3IsIFNyY0FscGhhRmFjdG9yLCBTcmNBbHBoYVNhdHVyYXRlRmFjdG9yLCBEc3RDb2xvckZhY3RvciwgRHN0QWxwaGFGYWN0b3IsIE9uZU1pbnVzU3JjQ29sb3JGYWN0b3IsIE9uZU1pbnVzU3JjQWxwaGFGYWN0b3IsIE9uZU1pbnVzRHN0Q29sb3JGYWN0b3IsIE9uZU1pbnVzRHN0QWxwaGFGYWN0b3IsIENvbnN0YW50Q29sb3JGYWN0b3IsIE9uZU1pbnVzQ29uc3RhbnRDb2xvckZhY3RvciwgQ29uc3RhbnRBbHBoYUZhY3RvciwgT25lTWludXNDb25zdGFudEFscGhhRmFjdG9yIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi8uLi9tYXRoL0NvbG9yLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yNCB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yNC5qcyc7XHJcblxyXG5jb25zdCByZXZlcnNlZEZ1bmNzID0ge1xyXG5cdFsgTmV2ZXJEZXB0aCBdOiBBbHdheXNEZXB0aCxcclxuXHRbIExlc3NEZXB0aCBdOiBHcmVhdGVyRGVwdGgsXHJcblx0WyBFcXVhbERlcHRoIF06IE5vdEVxdWFsRGVwdGgsXHJcblx0WyBMZXNzRXF1YWxEZXB0aCBdOiBHcmVhdGVyRXF1YWxEZXB0aCxcclxuXHJcblx0WyBBbHdheXNEZXB0aCBdOiBOZXZlckRlcHRoLFxyXG5cdFsgR3JlYXRlckRlcHRoIF06IExlc3NEZXB0aCxcclxuXHRbIE5vdEVxdWFsRGVwdGggXTogRXF1YWxEZXB0aCxcclxuXHRbIEdyZWF0ZXJFcXVhbERlcHRoIF06IExlc3NFcXVhbERlcHRoLFxyXG59O1xyXG5cclxuZnVuY3Rpb24gV2ViR0xTdGF0ZSggZ2wsIGV4dGVuc2lvbnMgKSB7XHJcblxyXG5cdGZ1bmN0aW9uIENvbG9yQnVmZmVyKCkge1xyXG5cclxuXHRcdGxldCBsb2NrZWQgPSBmYWxzZTtcclxuXHJcblx0XHRjb25zdCBjb2xvciA9IG5ldyBWZWN0b3I0KCk7XHJcblx0XHRsZXQgY3VycmVudENvbG9yTWFzayA9IG51bGw7XHJcblx0XHRjb25zdCBjdXJyZW50Q29sb3JDbGVhciA9IG5ldyBWZWN0b3I0KCAwLCAwLCAwLCAwICk7XHJcblxyXG5cdFx0cmV0dXJuIHtcclxuXHJcblx0XHRcdHNldE1hc2s6IGZ1bmN0aW9uICggY29sb3JNYXNrICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIGN1cnJlbnRDb2xvck1hc2sgIT09IGNvbG9yTWFzayAmJiAhIGxvY2tlZCApIHtcclxuXHJcblx0XHRcdFx0XHRnbC5jb2xvck1hc2soIGNvbG9yTWFzaywgY29sb3JNYXNrLCBjb2xvck1hc2ssIGNvbG9yTWFzayApO1xyXG5cdFx0XHRcdFx0Y3VycmVudENvbG9yTWFzayA9IGNvbG9yTWFzaztcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdHNldExvY2tlZDogZnVuY3Rpb24gKCBsb2NrICkge1xyXG5cclxuXHRcdFx0XHRsb2NrZWQgPSBsb2NrO1xyXG5cclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdHNldENsZWFyOiBmdW5jdGlvbiAoIHIsIGcsIGIsIGEsIHByZW11bHRpcGxpZWRBbHBoYSApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBwcmVtdWx0aXBsaWVkQWxwaGEgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0ciAqPSBhOyBnICo9IGE7IGIgKj0gYTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRjb2xvci5zZXQoIHIsIGcsIGIsIGEgKTtcclxuXHJcblx0XHRcdFx0aWYgKCBjdXJyZW50Q29sb3JDbGVhci5lcXVhbHMoIGNvbG9yICkgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0XHRcdGdsLmNsZWFyQ29sb3IoIHIsIGcsIGIsIGEgKTtcclxuXHRcdFx0XHRcdGN1cnJlbnRDb2xvckNsZWFyLmNvcHkoIGNvbG9yICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHRyZXNldDogZnVuY3Rpb24gKCkge1xyXG5cclxuXHRcdFx0XHRsb2NrZWQgPSBmYWxzZTtcclxuXHJcblx0XHRcdFx0Y3VycmVudENvbG9yTWFzayA9IG51bGw7XHJcblx0XHRcdFx0Y3VycmVudENvbG9yQ2xlYXIuc2V0KCAtIDEsIDAsIDAsIDAgKTsgLy8gc2V0IHRvIGludmFsaWQgc3RhdGVcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9O1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIERlcHRoQnVmZmVyKCkge1xyXG5cclxuXHRcdGxldCBsb2NrZWQgPSBmYWxzZTtcclxuXHJcblx0XHRsZXQgY3VycmVudFJldmVyc2VkID0gZmFsc2U7XHJcblx0XHRsZXQgY3VycmVudERlcHRoTWFzayA9IG51bGw7XHJcblx0XHRsZXQgY3VycmVudERlcHRoRnVuYyA9IG51bGw7XHJcblx0XHRsZXQgY3VycmVudERlcHRoQ2xlYXIgPSBudWxsO1xyXG5cclxuXHRcdHJldHVybiB7XHJcblxyXG5cdFx0XHRzZXRSZXZlcnNlZDogZnVuY3Rpb24gKCByZXZlcnNlZCApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBjdXJyZW50UmV2ZXJzZWQgIT09IHJldmVyc2VkICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGV4dCA9IGV4dGVuc2lvbnMuZ2V0KCAnRVhUX2NsaXBfY29udHJvbCcgKTtcclxuXHJcblx0XHRcdFx0XHRpZiAoIHJldmVyc2VkICkge1xyXG5cclxuXHRcdFx0XHRcdFx0ZXh0LmNsaXBDb250cm9sRVhUKCBleHQuTE9XRVJfTEVGVF9FWFQsIGV4dC5aRVJPX1RPX09ORV9FWFQgKTtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0ZXh0LmNsaXBDb250cm9sRVhUKCBleHQuTE9XRVJfTEVGVF9FWFQsIGV4dC5ORUdBVElWRV9PTkVfVE9fT05FX0VYVCApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRjdXJyZW50UmV2ZXJzZWQgPSByZXZlcnNlZDtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBvbGREZXB0aCA9IGN1cnJlbnREZXB0aENsZWFyO1xyXG5cdFx0XHRcdFx0Y3VycmVudERlcHRoQ2xlYXIgPSBudWxsO1xyXG5cdFx0XHRcdFx0dGhpcy5zZXRDbGVhciggb2xkRGVwdGggKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdGdldFJldmVyc2VkOiBmdW5jdGlvbiAoKSB7XHJcblxyXG5cdFx0XHRcdHJldHVybiBjdXJyZW50UmV2ZXJzZWQ7XHJcblxyXG5cdFx0XHR9LFxyXG5cclxuXHRcdFx0c2V0VGVzdDogZnVuY3Rpb24gKCBkZXB0aFRlc3QgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggZGVwdGhUZXN0ICkge1xyXG5cclxuXHRcdFx0XHRcdGVuYWJsZSggZ2wuREVQVEhfVEVTVCApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdGRpc2FibGUoIGdsLkRFUFRIX1RFU1QgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdHNldE1hc2s6IGZ1bmN0aW9uICggZGVwdGhNYXNrICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIGN1cnJlbnREZXB0aE1hc2sgIT09IGRlcHRoTWFzayAmJiAhIGxvY2tlZCApIHtcclxuXHJcblx0XHRcdFx0XHRnbC5kZXB0aE1hc2soIGRlcHRoTWFzayApO1xyXG5cdFx0XHRcdFx0Y3VycmVudERlcHRoTWFzayA9IGRlcHRoTWFzaztcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdHNldEZ1bmM6IGZ1bmN0aW9uICggZGVwdGhGdW5jICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIGN1cnJlbnRSZXZlcnNlZCApIGRlcHRoRnVuYyA9IHJldmVyc2VkRnVuY3NbIGRlcHRoRnVuYyBdO1xyXG5cclxuXHRcdFx0XHRpZiAoIGN1cnJlbnREZXB0aEZ1bmMgIT09IGRlcHRoRnVuYyApIHtcclxuXHJcblx0XHRcdFx0XHRzd2l0Y2ggKCBkZXB0aEZ1bmMgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjYXNlIE5ldmVyRGVwdGg6XHJcblxyXG5cdFx0XHRcdFx0XHRcdGdsLmRlcHRoRnVuYyggZ2wuTkVWRVIgKTtcclxuXHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRcdGNhc2UgQWx3YXlzRGVwdGg6XHJcblxyXG5cdFx0XHRcdFx0XHRcdGdsLmRlcHRoRnVuYyggZ2wuQUxXQVlTICk7XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0XHRjYXNlIExlc3NEZXB0aDpcclxuXHJcblx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5MRVNTICk7XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0XHRjYXNlIExlc3NFcXVhbERlcHRoOlxyXG5cclxuXHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIGdsLkxFUVVBTCApO1xyXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdFx0Y2FzZSBFcXVhbERlcHRoOlxyXG5cclxuXHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIGdsLkVRVUFMICk7XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0XHRjYXNlIEdyZWF0ZXJFcXVhbERlcHRoOlxyXG5cclxuXHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIGdsLkdFUVVBTCApO1xyXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdFx0Y2FzZSBHcmVhdGVyRGVwdGg6XHJcblxyXG5cdFx0XHRcdFx0XHRcdGdsLmRlcHRoRnVuYyggZ2wuR1JFQVRFUiApO1xyXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdFx0Y2FzZSBOb3RFcXVhbERlcHRoOlxyXG5cclxuXHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIGdsLk5PVEVRVUFMICk7XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0XHRkZWZhdWx0OlxyXG5cclxuXHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIGdsLkxFUVVBTCApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRjdXJyZW50RGVwdGhGdW5jID0gZGVwdGhGdW5jO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9LFxyXG5cclxuXHRcdFx0c2V0TG9ja2VkOiBmdW5jdGlvbiAoIGxvY2sgKSB7XHJcblxyXG5cdFx0XHRcdGxvY2tlZCA9IGxvY2s7XHJcblxyXG5cdFx0XHR9LFxyXG5cclxuXHRcdFx0c2V0Q2xlYXI6IGZ1bmN0aW9uICggZGVwdGggKSB7XHJcblxyXG5cdFx0XHRcdGlmICggY3VycmVudERlcHRoQ2xlYXIgIT09IGRlcHRoICkge1xyXG5cclxuXHRcdFx0XHRcdGlmICggY3VycmVudFJldmVyc2VkICkge1xyXG5cclxuXHRcdFx0XHRcdFx0ZGVwdGggPSAxIC0gZGVwdGg7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGdsLmNsZWFyRGVwdGgoIGRlcHRoICk7XHJcblx0XHRcdFx0XHRjdXJyZW50RGVwdGhDbGVhciA9IGRlcHRoO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9LFxyXG5cclxuXHRcdFx0cmVzZXQ6IGZ1bmN0aW9uICgpIHtcclxuXHJcblx0XHRcdFx0bG9ja2VkID0gZmFsc2U7XHJcblxyXG5cdFx0XHRcdGN1cnJlbnREZXB0aE1hc2sgPSBudWxsO1xyXG5cdFx0XHRcdGN1cnJlbnREZXB0aEZ1bmMgPSBudWxsO1xyXG5cdFx0XHRcdGN1cnJlbnREZXB0aENsZWFyID0gbnVsbDtcclxuXHRcdFx0XHRjdXJyZW50UmV2ZXJzZWQgPSBmYWxzZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9O1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIFN0ZW5jaWxCdWZmZXIoKSB7XHJcblxyXG5cdFx0bGV0IGxvY2tlZCA9IGZhbHNlO1xyXG5cclxuXHRcdGxldCBjdXJyZW50U3RlbmNpbE1hc2sgPSBudWxsO1xyXG5cdFx0bGV0IGN1cnJlbnRTdGVuY2lsRnVuYyA9IG51bGw7XHJcblx0XHRsZXQgY3VycmVudFN0ZW5jaWxSZWYgPSBudWxsO1xyXG5cdFx0bGV0IGN1cnJlbnRTdGVuY2lsRnVuY01hc2sgPSBudWxsO1xyXG5cdFx0bGV0IGN1cnJlbnRTdGVuY2lsRmFpbCA9IG51bGw7XHJcblx0XHRsZXQgY3VycmVudFN0ZW5jaWxaRmFpbCA9IG51bGw7XHJcblx0XHRsZXQgY3VycmVudFN0ZW5jaWxaUGFzcyA9IG51bGw7XHJcblx0XHRsZXQgY3VycmVudFN0ZW5jaWxDbGVhciA9IG51bGw7XHJcblxyXG5cdFx0cmV0dXJuIHtcclxuXHJcblx0XHRcdHNldFRlc3Q6IGZ1bmN0aW9uICggc3RlbmNpbFRlc3QgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggISBsb2NrZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBzdGVuY2lsVGVzdCApIHtcclxuXHJcblx0XHRcdFx0XHRcdGVuYWJsZSggZ2wuU1RFTkNJTF9URVNUICk7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdGRpc2FibGUoIGdsLlNURU5DSUxfVEVTVCApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdHNldE1hc2s6IGZ1bmN0aW9uICggc3RlbmNpbE1hc2sgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggY3VycmVudFN0ZW5jaWxNYXNrICE9PSBzdGVuY2lsTWFzayAmJiAhIGxvY2tlZCApIHtcclxuXHJcblx0XHRcdFx0XHRnbC5zdGVuY2lsTWFzayggc3RlbmNpbE1hc2sgKTtcclxuXHRcdFx0XHRcdGN1cnJlbnRTdGVuY2lsTWFzayA9IHN0ZW5jaWxNYXNrO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9LFxyXG5cclxuXHRcdFx0c2V0RnVuYzogZnVuY3Rpb24gKCBzdGVuY2lsRnVuYywgc3RlbmNpbFJlZiwgc3RlbmNpbE1hc2sgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggY3VycmVudFN0ZW5jaWxGdW5jICE9PSBzdGVuY2lsRnVuYyB8fFxyXG5cdFx0XHRcdCAgICAgY3VycmVudFN0ZW5jaWxSZWYgIT09IHN0ZW5jaWxSZWYgfHxcclxuXHRcdFx0XHQgICAgIGN1cnJlbnRTdGVuY2lsRnVuY01hc2sgIT09IHN0ZW5jaWxNYXNrICkge1xyXG5cclxuXHRcdFx0XHRcdGdsLnN0ZW5jaWxGdW5jKCBzdGVuY2lsRnVuYywgc3RlbmNpbFJlZiwgc3RlbmNpbE1hc2sgKTtcclxuXHJcblx0XHRcdFx0XHRjdXJyZW50U3RlbmNpbEZ1bmMgPSBzdGVuY2lsRnVuYztcclxuXHRcdFx0XHRcdGN1cnJlbnRTdGVuY2lsUmVmID0gc3RlbmNpbFJlZjtcclxuXHRcdFx0XHRcdGN1cnJlbnRTdGVuY2lsRnVuY01hc2sgPSBzdGVuY2lsTWFzaztcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdHNldE9wOiBmdW5jdGlvbiAoIHN0ZW5jaWxGYWlsLCBzdGVuY2lsWkZhaWwsIHN0ZW5jaWxaUGFzcyApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBjdXJyZW50U3RlbmNpbEZhaWwgIT09IHN0ZW5jaWxGYWlsIHx8XHJcblx0XHRcdFx0ICAgICBjdXJyZW50U3RlbmNpbFpGYWlsICE9PSBzdGVuY2lsWkZhaWwgfHxcclxuXHRcdFx0XHQgICAgIGN1cnJlbnRTdGVuY2lsWlBhc3MgIT09IHN0ZW5jaWxaUGFzcyApIHtcclxuXHJcblx0XHRcdFx0XHRnbC5zdGVuY2lsT3AoIHN0ZW5jaWxGYWlsLCBzdGVuY2lsWkZhaWwsIHN0ZW5jaWxaUGFzcyApO1xyXG5cclxuXHRcdFx0XHRcdGN1cnJlbnRTdGVuY2lsRmFpbCA9IHN0ZW5jaWxGYWlsO1xyXG5cdFx0XHRcdFx0Y3VycmVudFN0ZW5jaWxaRmFpbCA9IHN0ZW5jaWxaRmFpbDtcclxuXHRcdFx0XHRcdGN1cnJlbnRTdGVuY2lsWlBhc3MgPSBzdGVuY2lsWlBhc3M7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHRzZXRMb2NrZWQ6IGZ1bmN0aW9uICggbG9jayApIHtcclxuXHJcblx0XHRcdFx0bG9ja2VkID0gbG9jaztcclxuXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHRzZXRDbGVhcjogZnVuY3Rpb24gKCBzdGVuY2lsICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIGN1cnJlbnRTdGVuY2lsQ2xlYXIgIT09IHN0ZW5jaWwgKSB7XHJcblxyXG5cdFx0XHRcdFx0Z2wuY2xlYXJTdGVuY2lsKCBzdGVuY2lsICk7XHJcblx0XHRcdFx0XHRjdXJyZW50U3RlbmNpbENsZWFyID0gc3RlbmNpbDtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdHJlc2V0OiBmdW5jdGlvbiAoKSB7XHJcblxyXG5cdFx0XHRcdGxvY2tlZCA9IGZhbHNlO1xyXG5cclxuXHRcdFx0XHRjdXJyZW50U3RlbmNpbE1hc2sgPSBudWxsO1xyXG5cdFx0XHRcdGN1cnJlbnRTdGVuY2lsRnVuYyA9IG51bGw7XHJcblx0XHRcdFx0Y3VycmVudFN0ZW5jaWxSZWYgPSBudWxsO1xyXG5cdFx0XHRcdGN1cnJlbnRTdGVuY2lsRnVuY01hc2sgPSBudWxsO1xyXG5cdFx0XHRcdGN1cnJlbnRTdGVuY2lsRmFpbCA9IG51bGw7XHJcblx0XHRcdFx0Y3VycmVudFN0ZW5jaWxaRmFpbCA9IG51bGw7XHJcblx0XHRcdFx0Y3VycmVudFN0ZW5jaWxaUGFzcyA9IG51bGw7XHJcblx0XHRcdFx0Y3VycmVudFN0ZW5jaWxDbGVhciA9IG51bGw7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fTtcclxuXHJcblx0fVxyXG5cclxuXHQvL1xyXG5cclxuXHRjb25zdCBjb2xvckJ1ZmZlciA9IG5ldyBDb2xvckJ1ZmZlcigpO1xyXG5cdGNvbnN0IGRlcHRoQnVmZmVyID0gbmV3IERlcHRoQnVmZmVyKCk7XHJcblx0Y29uc3Qgc3RlbmNpbEJ1ZmZlciA9IG5ldyBTdGVuY2lsQnVmZmVyKCk7XHJcblxyXG5cdGNvbnN0IHVib0JpbmRpbmdzID0gbmV3IFdlYWtNYXAoKTtcclxuXHRjb25zdCB1Ym9Qcm9ncmFtTWFwID0gbmV3IFdlYWtNYXAoKTtcclxuXHJcblx0bGV0IGVuYWJsZWRDYXBhYmlsaXRpZXMgPSB7fTtcclxuXHJcblx0bGV0IGN1cnJlbnRCb3VuZEZyYW1lYnVmZmVycyA9IHt9O1xyXG5cdGxldCBjdXJyZW50RHJhd2J1ZmZlcnMgPSBuZXcgV2Vha01hcCgpO1xyXG5cdGxldCBkZWZhdWx0RHJhd2J1ZmZlcnMgPSBbXTtcclxuXHJcblx0bGV0IGN1cnJlbnRQcm9ncmFtID0gbnVsbDtcclxuXHJcblx0bGV0IGN1cnJlbnRCbGVuZGluZ0VuYWJsZWQgPSBmYWxzZTtcclxuXHRsZXQgY3VycmVudEJsZW5kaW5nID0gbnVsbDtcclxuXHRsZXQgY3VycmVudEJsZW5kRXF1YXRpb24gPSBudWxsO1xyXG5cdGxldCBjdXJyZW50QmxlbmRTcmMgPSBudWxsO1xyXG5cdGxldCBjdXJyZW50QmxlbmREc3QgPSBudWxsO1xyXG5cdGxldCBjdXJyZW50QmxlbmRFcXVhdGlvbkFscGhhID0gbnVsbDtcclxuXHRsZXQgY3VycmVudEJsZW5kU3JjQWxwaGEgPSBudWxsO1xyXG5cdGxldCBjdXJyZW50QmxlbmREc3RBbHBoYSA9IG51bGw7XHJcblx0bGV0IGN1cnJlbnRCbGVuZENvbG9yID0gbmV3IENvbG9yKCAwLCAwLCAwICk7XHJcblx0bGV0IGN1cnJlbnRCbGVuZEFscGhhID0gMDtcclxuXHRsZXQgY3VycmVudFByZW11bHRpcGxlZEFscGhhID0gZmFsc2U7XHJcblxyXG5cdGxldCBjdXJyZW50RmxpcFNpZGVkID0gbnVsbDtcclxuXHRsZXQgY3VycmVudEN1bGxGYWNlID0gbnVsbDtcclxuXHJcblx0bGV0IGN1cnJlbnRMaW5lV2lkdGggPSBudWxsO1xyXG5cclxuXHRsZXQgY3VycmVudFBvbHlnb25PZmZzZXRGYWN0b3IgPSBudWxsO1xyXG5cdGxldCBjdXJyZW50UG9seWdvbk9mZnNldFVuaXRzID0gbnVsbDtcclxuXHJcblx0Y29uc3QgbWF4VGV4dHVyZXMgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTICk7XHJcblxyXG5cdGxldCBsaW5lV2lkdGhBdmFpbGFibGUgPSBmYWxzZTtcclxuXHRsZXQgdmVyc2lvbiA9IDA7XHJcblx0Y29uc3QgZ2xWZXJzaW9uID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5WRVJTSU9OICk7XHJcblxyXG5cdGlmICggZ2xWZXJzaW9uLmluZGV4T2YoICdXZWJHTCcgKSAhPT0gLSAxICkge1xyXG5cclxuXHRcdHZlcnNpb24gPSBwYXJzZUZsb2F0KCAvXldlYkdMIChcXGQpLy5leGVjKCBnbFZlcnNpb24gKVsgMSBdICk7XHJcblx0XHRsaW5lV2lkdGhBdmFpbGFibGUgPSAoIHZlcnNpb24gPj0gMS4wICk7XHJcblxyXG5cdH0gZWxzZSBpZiAoIGdsVmVyc2lvbi5pbmRleE9mKCAnT3BlbkdMIEVTJyApICE9PSAtIDEgKSB7XHJcblxyXG5cdFx0dmVyc2lvbiA9IHBhcnNlRmxvYXQoIC9eT3BlbkdMIEVTIChcXGQpLy5leGVjKCBnbFZlcnNpb24gKVsgMSBdICk7XHJcblx0XHRsaW5lV2lkdGhBdmFpbGFibGUgPSAoIHZlcnNpb24gPj0gMi4wICk7XHJcblxyXG5cdH1cclxuXHJcblx0bGV0IGN1cnJlbnRUZXh0dXJlU2xvdCA9IG51bGw7XHJcblx0bGV0IGN1cnJlbnRCb3VuZFRleHR1cmVzID0ge307XHJcblxyXG5cdGNvbnN0IHNjaXNzb3JQYXJhbSA9IGdsLmdldFBhcmFtZXRlciggZ2wuU0NJU1NPUl9CT1ggKTtcclxuXHRjb25zdCB2aWV3cG9ydFBhcmFtID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5WSUVXUE9SVCApO1xyXG5cclxuXHRjb25zdCBjdXJyZW50U2Npc3NvciA9IG5ldyBWZWN0b3I0KCkuZnJvbUFycmF5KCBzY2lzc29yUGFyYW0gKTtcclxuXHRjb25zdCBjdXJyZW50Vmlld3BvcnQgPSBuZXcgVmVjdG9yNCgpLmZyb21BcnJheSggdmlld3BvcnRQYXJhbSApO1xyXG5cclxuXHRmdW5jdGlvbiBjcmVhdGVUZXh0dXJlKCB0eXBlLCB0YXJnZXQsIGNvdW50LCBkaW1lbnNpb25zICkge1xyXG5cclxuXHRcdGNvbnN0IGRhdGEgPSBuZXcgVWludDhBcnJheSggNCApOyAvLyA0IGlzIHJlcXVpcmVkIHRvIG1hdGNoIGRlZmF1bHQgdW5wYWNrIGFsaWdubWVudCBvZiA0LlxyXG5cdFx0Y29uc3QgdGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTtcclxuXHJcblx0XHRnbC5iaW5kVGV4dHVyZSggdHlwZSwgdGV4dHVyZSApO1xyXG5cdFx0Z2wudGV4UGFyYW1ldGVyaSggdHlwZSwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBnbC5ORUFSRVNUICk7XHJcblx0XHRnbC50ZXhQYXJhbWV0ZXJpKCB0eXBlLCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLk5FQVJFU1QgKTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSArKyApIHtcclxuXHJcblx0XHRcdGlmICggdHlwZSA9PT0gZ2wuVEVYVFVSRV8zRCB8fCB0eXBlID09PSBnbC5URVhUVVJFXzJEX0FSUkFZICkge1xyXG5cclxuXHRcdFx0XHRnbC50ZXhJbWFnZTNEKCB0YXJnZXQsIDAsIGdsLlJHQkEsIDEsIDEsIGRpbWVuc2lvbnMsIDAsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIGRhdGEgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGdsLnRleEltYWdlMkQoIHRhcmdldCArIGksIDAsIGdsLlJHQkEsIDEsIDEsIDAsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIGRhdGEgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRleHR1cmU7XHJcblxyXG5cdH1cclxuXHJcblx0Y29uc3QgZW1wdHlUZXh0dXJlcyA9IHt9O1xyXG5cdGVtcHR5VGV4dHVyZXNbIGdsLlRFWFRVUkVfMkQgXSA9IGNyZWF0ZVRleHR1cmUoIGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfMkQsIDEgKTtcclxuXHRlbXB0eVRleHR1cmVzWyBnbC5URVhUVVJFX0NVQkVfTUFQIF0gPSBjcmVhdGVUZXh0dXJlKCBnbC5URVhUVVJFX0NVQkVfTUFQLCBnbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1gsIDYgKTtcclxuXHRlbXB0eVRleHR1cmVzWyBnbC5URVhUVVJFXzJEX0FSUkFZIF0gPSBjcmVhdGVUZXh0dXJlKCBnbC5URVhUVVJFXzJEX0FSUkFZLCBnbC5URVhUVVJFXzJEX0FSUkFZLCAxLCAxICk7XHJcblx0ZW1wdHlUZXh0dXJlc1sgZ2wuVEVYVFVSRV8zRCBdID0gY3JlYXRlVGV4dHVyZSggZ2wuVEVYVFVSRV8zRCwgZ2wuVEVYVFVSRV8zRCwgMSwgMSApO1xyXG5cclxuXHQvLyBpbml0XHJcblxyXG5cdGNvbG9yQnVmZmVyLnNldENsZWFyKCAwLCAwLCAwLCAxICk7XHJcblx0ZGVwdGhCdWZmZXIuc2V0Q2xlYXIoIDEgKTtcclxuXHRzdGVuY2lsQnVmZmVyLnNldENsZWFyKCAwICk7XHJcblxyXG5cdGVuYWJsZSggZ2wuREVQVEhfVEVTVCApO1xyXG5cdGRlcHRoQnVmZmVyLnNldEZ1bmMoIExlc3NFcXVhbERlcHRoICk7XHJcblxyXG5cdHNldEZsaXBTaWRlZCggZmFsc2UgKTtcclxuXHRzZXRDdWxsRmFjZSggQ3VsbEZhY2VCYWNrICk7XHJcblx0ZW5hYmxlKCBnbC5DVUxMX0ZBQ0UgKTtcclxuXHJcblx0c2V0QmxlbmRpbmcoIE5vQmxlbmRpbmcgKTtcclxuXHJcblx0Ly9cclxuXHJcblx0ZnVuY3Rpb24gZW5hYmxlKCBpZCApIHtcclxuXHJcblx0XHRpZiAoIGVuYWJsZWRDYXBhYmlsaXRpZXNbIGlkIF0gIT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRnbC5lbmFibGUoIGlkICk7XHJcblx0XHRcdGVuYWJsZWRDYXBhYmlsaXRpZXNbIGlkIF0gPSB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBkaXNhYmxlKCBpZCApIHtcclxuXHJcblx0XHRpZiAoIGVuYWJsZWRDYXBhYmlsaXRpZXNbIGlkIF0gIT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0Z2wuZGlzYWJsZSggaWQgKTtcclxuXHRcdFx0ZW5hYmxlZENhcGFiaWxpdGllc1sgaWQgXSA9IGZhbHNlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBiaW5kRnJhbWVidWZmZXIoIHRhcmdldCwgZnJhbWVidWZmZXIgKSB7XHJcblxyXG5cdFx0aWYgKCBjdXJyZW50Qm91bmRGcmFtZWJ1ZmZlcnNbIHRhcmdldCBdICE9PSBmcmFtZWJ1ZmZlciApIHtcclxuXHJcblx0XHRcdGdsLmJpbmRGcmFtZWJ1ZmZlciggdGFyZ2V0LCBmcmFtZWJ1ZmZlciApO1xyXG5cclxuXHRcdFx0Y3VycmVudEJvdW5kRnJhbWVidWZmZXJzWyB0YXJnZXQgXSA9IGZyYW1lYnVmZmVyO1xyXG5cclxuXHRcdFx0Ly8gZ2wuRFJBV19GUkFNRUJVRkZFUiBpcyBlcXVpdmFsZW50IHRvIGdsLkZSQU1FQlVGRkVSXHJcblxyXG5cdFx0XHRpZiAoIHRhcmdldCA9PT0gZ2wuRFJBV19GUkFNRUJVRkZFUiApIHtcclxuXHJcblx0XHRcdFx0Y3VycmVudEJvdW5kRnJhbWVidWZmZXJzWyBnbC5GUkFNRUJVRkZFUiBdID0gZnJhbWVidWZmZXI7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHRhcmdldCA9PT0gZ2wuRlJBTUVCVUZGRVIgKSB7XHJcblxyXG5cdFx0XHRcdGN1cnJlbnRCb3VuZEZyYW1lYnVmZmVyc1sgZ2wuRFJBV19GUkFNRUJVRkZFUiBdID0gZnJhbWVidWZmZXI7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGZhbHNlO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGRyYXdCdWZmZXJzKCByZW5kZXJUYXJnZXQsIGZyYW1lYnVmZmVyICkge1xyXG5cclxuXHRcdGxldCBkcmF3QnVmZmVycyA9IGRlZmF1bHREcmF3YnVmZmVycztcclxuXHJcblx0XHRsZXQgbmVlZHNVcGRhdGUgPSBmYWxzZTtcclxuXHJcblx0XHRpZiAoIHJlbmRlclRhcmdldCApIHtcclxuXHJcblx0XHRcdGRyYXdCdWZmZXJzID0gY3VycmVudERyYXdidWZmZXJzLmdldCggZnJhbWVidWZmZXIgKTtcclxuXHJcblx0XHRcdGlmICggZHJhd0J1ZmZlcnMgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0ZHJhd0J1ZmZlcnMgPSBbXTtcclxuXHRcdFx0XHRjdXJyZW50RHJhd2J1ZmZlcnMuc2V0KCBmcmFtZWJ1ZmZlciwgZHJhd0J1ZmZlcnMgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IHRleHR1cmVzID0gcmVuZGVyVGFyZ2V0LnRleHR1cmVzO1xyXG5cclxuXHRcdFx0aWYgKCBkcmF3QnVmZmVycy5sZW5ndGggIT09IHRleHR1cmVzLmxlbmd0aCB8fCBkcmF3QnVmZmVyc1sgMCBdICE9PSBnbC5DT0xPUl9BVFRBQ0hNRU5UMCApIHtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IHRleHR1cmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdGRyYXdCdWZmZXJzWyBpIF0gPSBnbC5DT0xPUl9BVFRBQ0hNRU5UMCArIGk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0ZHJhd0J1ZmZlcnMubGVuZ3RoID0gdGV4dHVyZXMubGVuZ3RoO1xyXG5cclxuXHRcdFx0XHRuZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGlmICggZHJhd0J1ZmZlcnNbIDAgXSAhPT0gZ2wuQkFDSyApIHtcclxuXHJcblx0XHRcdFx0ZHJhd0J1ZmZlcnNbIDAgXSA9IGdsLkJBQ0s7XHJcblxyXG5cdFx0XHRcdG5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBuZWVkc1VwZGF0ZSApIHtcclxuXHJcblx0XHRcdGdsLmRyYXdCdWZmZXJzKCBkcmF3QnVmZmVycyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiB1c2VQcm9ncmFtKCBwcm9ncmFtICkge1xyXG5cclxuXHRcdGlmICggY3VycmVudFByb2dyYW0gIT09IHByb2dyYW0gKSB7XHJcblxyXG5cdFx0XHRnbC51c2VQcm9ncmFtKCBwcm9ncmFtICk7XHJcblxyXG5cdFx0XHRjdXJyZW50UHJvZ3JhbSA9IHByb2dyYW07XHJcblxyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGZhbHNlO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvbnN0IGVxdWF0aW9uVG9HTCA9IHtcclxuXHRcdFsgQWRkRXF1YXRpb24gXTogZ2wuRlVOQ19BREQsXHJcblx0XHRbIFN1YnRyYWN0RXF1YXRpb24gXTogZ2wuRlVOQ19TVUJUUkFDVCxcclxuXHRcdFsgUmV2ZXJzZVN1YnRyYWN0RXF1YXRpb24gXTogZ2wuRlVOQ19SRVZFUlNFX1NVQlRSQUNUXHJcblx0fTtcclxuXHJcblx0ZXF1YXRpb25Ub0dMWyBNaW5FcXVhdGlvbiBdID0gZ2wuTUlOO1xyXG5cdGVxdWF0aW9uVG9HTFsgTWF4RXF1YXRpb24gXSA9IGdsLk1BWDtcclxuXHJcblx0Y29uc3QgZmFjdG9yVG9HTCA9IHtcclxuXHRcdFsgWmVyb0ZhY3RvciBdOiBnbC5aRVJPLFxyXG5cdFx0WyBPbmVGYWN0b3IgXTogZ2wuT05FLFxyXG5cdFx0WyBTcmNDb2xvckZhY3RvciBdOiBnbC5TUkNfQ09MT1IsXHJcblx0XHRbIFNyY0FscGhhRmFjdG9yIF06IGdsLlNSQ19BTFBIQSxcclxuXHRcdFsgU3JjQWxwaGFTYXR1cmF0ZUZhY3RvciBdOiBnbC5TUkNfQUxQSEFfU0FUVVJBVEUsXHJcblx0XHRbIERzdENvbG9yRmFjdG9yIF06IGdsLkRTVF9DT0xPUixcclxuXHRcdFsgRHN0QWxwaGFGYWN0b3IgXTogZ2wuRFNUX0FMUEhBLFxyXG5cdFx0WyBPbmVNaW51c1NyY0NvbG9yRmFjdG9yIF06IGdsLk9ORV9NSU5VU19TUkNfQ09MT1IsXHJcblx0XHRbIE9uZU1pbnVzU3JjQWxwaGFGYWN0b3IgXTogZ2wuT05FX01JTlVTX1NSQ19BTFBIQSxcclxuXHRcdFsgT25lTWludXNEc3RDb2xvckZhY3RvciBdOiBnbC5PTkVfTUlOVVNfRFNUX0NPTE9SLFxyXG5cdFx0WyBPbmVNaW51c0RzdEFscGhhRmFjdG9yIF06IGdsLk9ORV9NSU5VU19EU1RfQUxQSEEsXHJcblx0XHRbIENvbnN0YW50Q29sb3JGYWN0b3IgXTogZ2wuQ09OU1RBTlRfQ09MT1IsXHJcblx0XHRbIE9uZU1pbnVzQ29uc3RhbnRDb2xvckZhY3RvciBdOiBnbC5PTkVfTUlOVVNfQ09OU1RBTlRfQ09MT1IsXHJcblx0XHRbIENvbnN0YW50QWxwaGFGYWN0b3IgXTogZ2wuQ09OU1RBTlRfQUxQSEEsXHJcblx0XHRbIE9uZU1pbnVzQ29uc3RhbnRBbHBoYUZhY3RvciBdOiBnbC5PTkVfTUlOVVNfQ09OU1RBTlRfQUxQSEFcclxuXHR9O1xyXG5cclxuXHRmdW5jdGlvbiBzZXRCbGVuZGluZyggYmxlbmRpbmcsIGJsZW5kRXF1YXRpb24sIGJsZW5kU3JjLCBibGVuZERzdCwgYmxlbmRFcXVhdGlvbkFscGhhLCBibGVuZFNyY0FscGhhLCBibGVuZERzdEFscGhhLCBibGVuZENvbG9yLCBibGVuZEFscGhhLCBwcmVtdWx0aXBsaWVkQWxwaGEgKSB7XHJcblxyXG5cdFx0aWYgKCBibGVuZGluZyA9PT0gTm9CbGVuZGluZyApIHtcclxuXHJcblx0XHRcdGlmICggY3VycmVudEJsZW5kaW5nRW5hYmxlZCA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0ZGlzYWJsZSggZ2wuQkxFTkQgKTtcclxuXHRcdFx0XHRjdXJyZW50QmxlbmRpbmdFbmFibGVkID0gZmFsc2U7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggY3VycmVudEJsZW5kaW5nRW5hYmxlZCA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRlbmFibGUoIGdsLkJMRU5EICk7XHJcblx0XHRcdGN1cnJlbnRCbGVuZGluZ0VuYWJsZWQgPSB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGJsZW5kaW5nICE9PSBDdXN0b21CbGVuZGluZyApIHtcclxuXHJcblx0XHRcdGlmICggYmxlbmRpbmcgIT09IGN1cnJlbnRCbGVuZGluZyB8fCBwcmVtdWx0aXBsaWVkQWxwaGEgIT09IGN1cnJlbnRQcmVtdWx0aXBsZWRBbHBoYSApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBjdXJyZW50QmxlbmRFcXVhdGlvbiAhPT0gQWRkRXF1YXRpb24gfHwgY3VycmVudEJsZW5kRXF1YXRpb25BbHBoYSAhPT0gQWRkRXF1YXRpb24gKSB7XHJcblxyXG5cdFx0XHRcdFx0Z2wuYmxlbmRFcXVhdGlvbiggZ2wuRlVOQ19BREQgKTtcclxuXHJcblx0XHRcdFx0XHRjdXJyZW50QmxlbmRFcXVhdGlvbiA9IEFkZEVxdWF0aW9uO1xyXG5cdFx0XHRcdFx0Y3VycmVudEJsZW5kRXF1YXRpb25BbHBoYSA9IEFkZEVxdWF0aW9uO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICggcHJlbXVsdGlwbGllZEFscGhhICkge1xyXG5cclxuXHRcdFx0XHRcdHN3aXRjaCAoIGJsZW5kaW5nICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y2FzZSBOb3JtYWxCbGVuZGluZzpcclxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEZ1bmNTZXBhcmF0ZSggZ2wuT05FLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBLCBnbC5PTkUsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEgKTtcclxuXHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRcdGNhc2UgQWRkaXRpdmVCbGVuZGluZzpcclxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEZ1bmMoIGdsLk9ORSwgZ2wuT05FICk7XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0XHRjYXNlIFN1YnRyYWN0aXZlQmxlbmRpbmc6XHJcblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRGdW5jU2VwYXJhdGUoIGdsLlpFUk8sIGdsLk9ORV9NSU5VU19TUkNfQ09MT1IsIGdsLlpFUk8sIGdsLk9ORSApO1xyXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdFx0Y2FzZSBNdWx0aXBseUJsZW5kaW5nOlxyXG5cdFx0XHRcdFx0XHRcdGdsLmJsZW5kRnVuY1NlcGFyYXRlKCBnbC5aRVJPLCBnbC5TUkNfQ09MT1IsIGdsLlpFUk8sIGdsLlNSQ19BTFBIQSApO1xyXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xTdGF0ZTogSW52YWxpZCBibGVuZGluZzogJywgYmxlbmRpbmcgKTtcclxuXHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0c3dpdGNoICggYmxlbmRpbmcgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjYXNlIE5vcm1hbEJsZW5kaW5nOlxyXG5cdFx0XHRcdFx0XHRcdGdsLmJsZW5kRnVuY1NlcGFyYXRlKCBnbC5TUkNfQUxQSEEsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEsIGdsLk9ORSwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSApO1xyXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdFx0Y2FzZSBBZGRpdGl2ZUJsZW5kaW5nOlxyXG5cdFx0XHRcdFx0XHRcdGdsLmJsZW5kRnVuYyggZ2wuU1JDX0FMUEhBLCBnbC5PTkUgKTtcclxuXHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRcdGNhc2UgU3VidHJhY3RpdmVCbGVuZGluZzpcclxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEZ1bmNTZXBhcmF0ZSggZ2wuWkVSTywgZ2wuT05FX01JTlVTX1NSQ19DT0xPUiwgZ2wuWkVSTywgZ2wuT05FICk7XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0XHRjYXNlIE11bHRpcGx5QmxlbmRpbmc6XHJcblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRGdW5jKCBnbC5aRVJPLCBnbC5TUkNfQ09MT1IgKTtcclxuXHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMU3RhdGU6IEludmFsaWQgYmxlbmRpbmc6ICcsIGJsZW5kaW5nICk7XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGN1cnJlbnRCbGVuZFNyYyA9IG51bGw7XHJcblx0XHRcdFx0Y3VycmVudEJsZW5kRHN0ID0gbnVsbDtcclxuXHRcdFx0XHRjdXJyZW50QmxlbmRTcmNBbHBoYSA9IG51bGw7XHJcblx0XHRcdFx0Y3VycmVudEJsZW5kRHN0QWxwaGEgPSBudWxsO1xyXG5cdFx0XHRcdGN1cnJlbnRCbGVuZENvbG9yLnNldCggMCwgMCwgMCApO1xyXG5cdFx0XHRcdGN1cnJlbnRCbGVuZEFscGhhID0gMDtcclxuXHJcblx0XHRcdFx0Y3VycmVudEJsZW5kaW5nID0gYmxlbmRpbmc7XHJcblx0XHRcdFx0Y3VycmVudFByZW11bHRpcGxlZEFscGhhID0gcHJlbXVsdGlwbGllZEFscGhhO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBjdXN0b20gYmxlbmRpbmdcclxuXHJcblx0XHRibGVuZEVxdWF0aW9uQWxwaGEgPSBibGVuZEVxdWF0aW9uQWxwaGEgfHwgYmxlbmRFcXVhdGlvbjtcclxuXHRcdGJsZW5kU3JjQWxwaGEgPSBibGVuZFNyY0FscGhhIHx8IGJsZW5kU3JjO1xyXG5cdFx0YmxlbmREc3RBbHBoYSA9IGJsZW5kRHN0QWxwaGEgfHwgYmxlbmREc3Q7XHJcblxyXG5cdFx0aWYgKCBibGVuZEVxdWF0aW9uICE9PSBjdXJyZW50QmxlbmRFcXVhdGlvbiB8fCBibGVuZEVxdWF0aW9uQWxwaGEgIT09IGN1cnJlbnRCbGVuZEVxdWF0aW9uQWxwaGEgKSB7XHJcblxyXG5cdFx0XHRnbC5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoIGVxdWF0aW9uVG9HTFsgYmxlbmRFcXVhdGlvbiBdLCBlcXVhdGlvblRvR0xbIGJsZW5kRXF1YXRpb25BbHBoYSBdICk7XHJcblxyXG5cdFx0XHRjdXJyZW50QmxlbmRFcXVhdGlvbiA9IGJsZW5kRXF1YXRpb247XHJcblx0XHRcdGN1cnJlbnRCbGVuZEVxdWF0aW9uQWxwaGEgPSBibGVuZEVxdWF0aW9uQWxwaGE7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggYmxlbmRTcmMgIT09IGN1cnJlbnRCbGVuZFNyYyB8fCBibGVuZERzdCAhPT0gY3VycmVudEJsZW5kRHN0IHx8IGJsZW5kU3JjQWxwaGEgIT09IGN1cnJlbnRCbGVuZFNyY0FscGhhIHx8IGJsZW5kRHN0QWxwaGEgIT09IGN1cnJlbnRCbGVuZERzdEFscGhhICkge1xyXG5cclxuXHRcdFx0Z2wuYmxlbmRGdW5jU2VwYXJhdGUoIGZhY3RvclRvR0xbIGJsZW5kU3JjIF0sIGZhY3RvclRvR0xbIGJsZW5kRHN0IF0sIGZhY3RvclRvR0xbIGJsZW5kU3JjQWxwaGEgXSwgZmFjdG9yVG9HTFsgYmxlbmREc3RBbHBoYSBdICk7XHJcblxyXG5cdFx0XHRjdXJyZW50QmxlbmRTcmMgPSBibGVuZFNyYztcclxuXHRcdFx0Y3VycmVudEJsZW5kRHN0ID0gYmxlbmREc3Q7XHJcblx0XHRcdGN1cnJlbnRCbGVuZFNyY0FscGhhID0gYmxlbmRTcmNBbHBoYTtcclxuXHRcdFx0Y3VycmVudEJsZW5kRHN0QWxwaGEgPSBibGVuZERzdEFscGhhO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGJsZW5kQ29sb3IuZXF1YWxzKCBjdXJyZW50QmxlbmRDb2xvciApID09PSBmYWxzZSB8fCBibGVuZEFscGhhICE9PSBjdXJyZW50QmxlbmRBbHBoYSApIHtcclxuXHJcblx0XHRcdGdsLmJsZW5kQ29sb3IoIGJsZW5kQ29sb3IuciwgYmxlbmRDb2xvci5nLCBibGVuZENvbG9yLmIsIGJsZW5kQWxwaGEgKTtcclxuXHJcblx0XHRcdGN1cnJlbnRCbGVuZENvbG9yLmNvcHkoIGJsZW5kQ29sb3IgKTtcclxuXHRcdFx0Y3VycmVudEJsZW5kQWxwaGEgPSBibGVuZEFscGhhO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjdXJyZW50QmxlbmRpbmcgPSBibGVuZGluZztcclxuXHRcdGN1cnJlbnRQcmVtdWx0aXBsZWRBbHBoYSA9IGZhbHNlO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHNldE1hdGVyaWFsKCBtYXRlcmlhbCwgZnJvbnRGYWNlQ1cgKSB7XHJcblxyXG5cdFx0bWF0ZXJpYWwuc2lkZSA9PT0gRG91YmxlU2lkZVxyXG5cdFx0XHQ/IGRpc2FibGUoIGdsLkNVTExfRkFDRSApXHJcblx0XHRcdDogZW5hYmxlKCBnbC5DVUxMX0ZBQ0UgKTtcclxuXHJcblx0XHRsZXQgZmxpcFNpZGVkID0gKCBtYXRlcmlhbC5zaWRlID09PSBCYWNrU2lkZSApO1xyXG5cdFx0aWYgKCBmcm9udEZhY2VDVyApIGZsaXBTaWRlZCA9ICEgZmxpcFNpZGVkO1xyXG5cclxuXHRcdHNldEZsaXBTaWRlZCggZmxpcFNpZGVkICk7XHJcblxyXG5cdFx0KCBtYXRlcmlhbC5ibGVuZGluZyA9PT0gTm9ybWFsQmxlbmRpbmcgJiYgbWF0ZXJpYWwudHJhbnNwYXJlbnQgPT09IGZhbHNlIClcclxuXHRcdFx0PyBzZXRCbGVuZGluZyggTm9CbGVuZGluZyApXHJcblx0XHRcdDogc2V0QmxlbmRpbmcoIG1hdGVyaWFsLmJsZW5kaW5nLCBtYXRlcmlhbC5ibGVuZEVxdWF0aW9uLCBtYXRlcmlhbC5ibGVuZFNyYywgbWF0ZXJpYWwuYmxlbmREc3QsIG1hdGVyaWFsLmJsZW5kRXF1YXRpb25BbHBoYSwgbWF0ZXJpYWwuYmxlbmRTcmNBbHBoYSwgbWF0ZXJpYWwuYmxlbmREc3RBbHBoYSwgbWF0ZXJpYWwuYmxlbmRDb2xvciwgbWF0ZXJpYWwuYmxlbmRBbHBoYSwgbWF0ZXJpYWwucHJlbXVsdGlwbGllZEFscGhhICk7XHJcblxyXG5cdFx0ZGVwdGhCdWZmZXIuc2V0RnVuYyggbWF0ZXJpYWwuZGVwdGhGdW5jICk7XHJcblx0XHRkZXB0aEJ1ZmZlci5zZXRUZXN0KCBtYXRlcmlhbC5kZXB0aFRlc3QgKTtcclxuXHRcdGRlcHRoQnVmZmVyLnNldE1hc2soIG1hdGVyaWFsLmRlcHRoV3JpdGUgKTtcclxuXHRcdGNvbG9yQnVmZmVyLnNldE1hc2soIG1hdGVyaWFsLmNvbG9yV3JpdGUgKTtcclxuXHJcblx0XHRjb25zdCBzdGVuY2lsV3JpdGUgPSBtYXRlcmlhbC5zdGVuY2lsV3JpdGU7XHJcblx0XHRzdGVuY2lsQnVmZmVyLnNldFRlc3QoIHN0ZW5jaWxXcml0ZSApO1xyXG5cdFx0aWYgKCBzdGVuY2lsV3JpdGUgKSB7XHJcblxyXG5cdFx0XHRzdGVuY2lsQnVmZmVyLnNldE1hc2soIG1hdGVyaWFsLnN0ZW5jaWxXcml0ZU1hc2sgKTtcclxuXHRcdFx0c3RlbmNpbEJ1ZmZlci5zZXRGdW5jKCBtYXRlcmlhbC5zdGVuY2lsRnVuYywgbWF0ZXJpYWwuc3RlbmNpbFJlZiwgbWF0ZXJpYWwuc3RlbmNpbEZ1bmNNYXNrICk7XHJcblx0XHRcdHN0ZW5jaWxCdWZmZXIuc2V0T3AoIG1hdGVyaWFsLnN0ZW5jaWxGYWlsLCBtYXRlcmlhbC5zdGVuY2lsWkZhaWwsIG1hdGVyaWFsLnN0ZW5jaWxaUGFzcyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRzZXRQb2x5Z29uT2Zmc2V0KCBtYXRlcmlhbC5wb2x5Z29uT2Zmc2V0LCBtYXRlcmlhbC5wb2x5Z29uT2Zmc2V0RmFjdG9yLCBtYXRlcmlhbC5wb2x5Z29uT2Zmc2V0VW5pdHMgKTtcclxuXHJcblx0XHRtYXRlcmlhbC5hbHBoYVRvQ292ZXJhZ2UgPT09IHRydWVcclxuXHRcdFx0PyBlbmFibGUoIGdsLlNBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSApXHJcblx0XHRcdDogZGlzYWJsZSggZ2wuU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFICk7XHJcblxyXG5cdH1cclxuXHJcblx0Ly9cclxuXHJcblx0ZnVuY3Rpb24gc2V0RmxpcFNpZGVkKCBmbGlwU2lkZWQgKSB7XHJcblxyXG5cdFx0aWYgKCBjdXJyZW50RmxpcFNpZGVkICE9PSBmbGlwU2lkZWQgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGZsaXBTaWRlZCApIHtcclxuXHJcblx0XHRcdFx0Z2wuZnJvbnRGYWNlKCBnbC5DVyApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0Z2wuZnJvbnRGYWNlKCBnbC5DQ1cgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGN1cnJlbnRGbGlwU2lkZWQgPSBmbGlwU2lkZWQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHNldEN1bGxGYWNlKCBjdWxsRmFjZSApIHtcclxuXHJcblx0XHRpZiAoIGN1bGxGYWNlICE9PSBDdWxsRmFjZU5vbmUgKSB7XHJcblxyXG5cdFx0XHRlbmFibGUoIGdsLkNVTExfRkFDRSApO1xyXG5cclxuXHRcdFx0aWYgKCBjdWxsRmFjZSAhPT0gY3VycmVudEN1bGxGYWNlICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIGN1bGxGYWNlID09PSBDdWxsRmFjZUJhY2sgKSB7XHJcblxyXG5cdFx0XHRcdFx0Z2wuY3VsbEZhY2UoIGdsLkJBQ0sgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggY3VsbEZhY2UgPT09IEN1bGxGYWNlRnJvbnQgKSB7XHJcblxyXG5cdFx0XHRcdFx0Z2wuY3VsbEZhY2UoIGdsLkZST05UICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0Z2wuY3VsbEZhY2UoIGdsLkZST05UX0FORF9CQUNLICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0ZGlzYWJsZSggZ2wuQ1VMTF9GQUNFICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGN1cnJlbnRDdWxsRmFjZSA9IGN1bGxGYWNlO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHNldExpbmVXaWR0aCggd2lkdGggKSB7XHJcblxyXG5cdFx0aWYgKCB3aWR0aCAhPT0gY3VycmVudExpbmVXaWR0aCApIHtcclxuXHJcblx0XHRcdGlmICggbGluZVdpZHRoQXZhaWxhYmxlICkgZ2wubGluZVdpZHRoKCB3aWR0aCApO1xyXG5cclxuXHRcdFx0Y3VycmVudExpbmVXaWR0aCA9IHdpZHRoO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBzZXRQb2x5Z29uT2Zmc2V0KCBwb2x5Z29uT2Zmc2V0LCBmYWN0b3IsIHVuaXRzICkge1xyXG5cclxuXHRcdGlmICggcG9seWdvbk9mZnNldCApIHtcclxuXHJcblx0XHRcdGVuYWJsZSggZ2wuUE9MWUdPTl9PRkZTRVRfRklMTCApO1xyXG5cclxuXHRcdFx0aWYgKCBjdXJyZW50UG9seWdvbk9mZnNldEZhY3RvciAhPT0gZmFjdG9yIHx8IGN1cnJlbnRQb2x5Z29uT2Zmc2V0VW5pdHMgIT09IHVuaXRzICkge1xyXG5cclxuXHRcdFx0XHRnbC5wb2x5Z29uT2Zmc2V0KCBmYWN0b3IsIHVuaXRzICk7XHJcblxyXG5cdFx0XHRcdGN1cnJlbnRQb2x5Z29uT2Zmc2V0RmFjdG9yID0gZmFjdG9yO1xyXG5cdFx0XHRcdGN1cnJlbnRQb2x5Z29uT2Zmc2V0VW5pdHMgPSB1bml0cztcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0ZGlzYWJsZSggZ2wuUE9MWUdPTl9PRkZTRVRfRklMTCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBzZXRTY2lzc29yVGVzdCggc2Npc3NvclRlc3QgKSB7XHJcblxyXG5cdFx0aWYgKCBzY2lzc29yVGVzdCApIHtcclxuXHJcblx0XHRcdGVuYWJsZSggZ2wuU0NJU1NPUl9URVNUICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGRpc2FibGUoIGdsLlNDSVNTT1JfVEVTVCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvLyB0ZXh0dXJlXHJcblxyXG5cdGZ1bmN0aW9uIGFjdGl2ZVRleHR1cmUoIHdlYmdsU2xvdCApIHtcclxuXHJcblx0XHRpZiAoIHdlYmdsU2xvdCA9PT0gdW5kZWZpbmVkICkgd2ViZ2xTbG90ID0gZ2wuVEVYVFVSRTAgKyBtYXhUZXh0dXJlcyAtIDE7XHJcblxyXG5cdFx0aWYgKCBjdXJyZW50VGV4dHVyZVNsb3QgIT09IHdlYmdsU2xvdCApIHtcclxuXHJcblx0XHRcdGdsLmFjdGl2ZVRleHR1cmUoIHdlYmdsU2xvdCApO1xyXG5cdFx0XHRjdXJyZW50VGV4dHVyZVNsb3QgPSB3ZWJnbFNsb3Q7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGJpbmRUZXh0dXJlKCB3ZWJnbFR5cGUsIHdlYmdsVGV4dHVyZSwgd2ViZ2xTbG90ICkge1xyXG5cclxuXHRcdGlmICggd2ViZ2xTbG90ID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGN1cnJlbnRUZXh0dXJlU2xvdCA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0d2ViZ2xTbG90ID0gZ2wuVEVYVFVSRTAgKyBtYXhUZXh0dXJlcyAtIDE7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHR3ZWJnbFNsb3QgPSBjdXJyZW50VGV4dHVyZVNsb3Q7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGxldCBib3VuZFRleHR1cmUgPSBjdXJyZW50Qm91bmRUZXh0dXJlc1sgd2ViZ2xTbG90IF07XHJcblxyXG5cdFx0aWYgKCBib3VuZFRleHR1cmUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGJvdW5kVGV4dHVyZSA9IHsgdHlwZTogdW5kZWZpbmVkLCB0ZXh0dXJlOiB1bmRlZmluZWQgfTtcclxuXHRcdFx0Y3VycmVudEJvdW5kVGV4dHVyZXNbIHdlYmdsU2xvdCBdID0gYm91bmRUZXh0dXJlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGJvdW5kVGV4dHVyZS50eXBlICE9PSB3ZWJnbFR5cGUgfHwgYm91bmRUZXh0dXJlLnRleHR1cmUgIT09IHdlYmdsVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdGlmICggY3VycmVudFRleHR1cmVTbG90ICE9PSB3ZWJnbFNsb3QgKSB7XHJcblxyXG5cdFx0XHRcdGdsLmFjdGl2ZVRleHR1cmUoIHdlYmdsU2xvdCApO1xyXG5cdFx0XHRcdGN1cnJlbnRUZXh0dXJlU2xvdCA9IHdlYmdsU2xvdDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGdsLmJpbmRUZXh0dXJlKCB3ZWJnbFR5cGUsIHdlYmdsVGV4dHVyZSB8fCBlbXB0eVRleHR1cmVzWyB3ZWJnbFR5cGUgXSApO1xyXG5cclxuXHRcdFx0Ym91bmRUZXh0dXJlLnR5cGUgPSB3ZWJnbFR5cGU7XHJcblx0XHRcdGJvdW5kVGV4dHVyZS50ZXh0dXJlID0gd2ViZ2xUZXh0dXJlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiB1bmJpbmRUZXh0dXJlKCkge1xyXG5cclxuXHRcdGNvbnN0IGJvdW5kVGV4dHVyZSA9IGN1cnJlbnRCb3VuZFRleHR1cmVzWyBjdXJyZW50VGV4dHVyZVNsb3QgXTtcclxuXHJcblx0XHRpZiAoIGJvdW5kVGV4dHVyZSAhPT0gdW5kZWZpbmVkICYmIGJvdW5kVGV4dHVyZS50eXBlICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRnbC5iaW5kVGV4dHVyZSggYm91bmRUZXh0dXJlLnR5cGUsIG51bGwgKTtcclxuXHJcblx0XHRcdGJvdW5kVGV4dHVyZS50eXBlID0gdW5kZWZpbmVkO1xyXG5cdFx0XHRib3VuZFRleHR1cmUudGV4dHVyZSA9IHVuZGVmaW5lZDtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gY29tcHJlc3NlZFRleEltYWdlMkQoKSB7XHJcblxyXG5cdFx0dHJ5IHtcclxuXHJcblx0XHRcdGdsLmNvbXByZXNzZWRUZXhJbWFnZTJEKCAuLi5hcmd1bWVudHMgKTtcclxuXHJcblx0XHR9IGNhdGNoICggZXJyb3IgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xTdGF0ZTonLCBlcnJvciApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBjb21wcmVzc2VkVGV4SW1hZ2UzRCgpIHtcclxuXHJcblx0XHR0cnkge1xyXG5cclxuXHRcdFx0Z2wuY29tcHJlc3NlZFRleEltYWdlM0QoIC4uLmFyZ3VtZW50cyApO1xyXG5cclxuXHRcdH0gY2F0Y2ggKCBlcnJvciApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFN0YXRlOicsIGVycm9yICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHRleFN1YkltYWdlMkQoKSB7XHJcblxyXG5cdFx0dHJ5IHtcclxuXHJcblx0XHRcdGdsLnRleFN1YkltYWdlMkQoIC4uLmFyZ3VtZW50cyApO1xyXG5cclxuXHRcdH0gY2F0Y2ggKCBlcnJvciApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFN0YXRlOicsIGVycm9yICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHRleFN1YkltYWdlM0QoKSB7XHJcblxyXG5cdFx0dHJ5IHtcclxuXHJcblx0XHRcdGdsLnRleFN1YkltYWdlM0QoIC4uLmFyZ3VtZW50cyApO1xyXG5cclxuXHRcdH0gY2F0Y2ggKCBlcnJvciApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFN0YXRlOicsIGVycm9yICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGNvbXByZXNzZWRUZXhTdWJJbWFnZTJEKCkge1xyXG5cclxuXHRcdHRyeSB7XHJcblxyXG5cdFx0XHRnbC5jb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCggLi4uYXJndW1lbnRzICk7XHJcblxyXG5cdFx0fSBjYXRjaCAoIGVycm9yICkge1xyXG5cclxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMU3RhdGU6JywgZXJyb3IgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gY29tcHJlc3NlZFRleFN1YkltYWdlM0QoKSB7XHJcblxyXG5cdFx0dHJ5IHtcclxuXHJcblx0XHRcdGdsLmNvbXByZXNzZWRUZXhTdWJJbWFnZTNEKCAuLi5hcmd1bWVudHMgKTtcclxuXHJcblx0XHR9IGNhdGNoICggZXJyb3IgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xTdGF0ZTonLCBlcnJvciApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiB0ZXhTdG9yYWdlMkQoKSB7XHJcblxyXG5cdFx0dHJ5IHtcclxuXHJcblx0XHRcdGdsLnRleFN0b3JhZ2UyRCggLi4uYXJndW1lbnRzICk7XHJcblxyXG5cdFx0fSBjYXRjaCAoIGVycm9yICkge1xyXG5cclxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMU3RhdGU6JywgZXJyb3IgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gdGV4U3RvcmFnZTNEKCkge1xyXG5cclxuXHRcdHRyeSB7XHJcblxyXG5cdFx0XHRnbC50ZXhTdG9yYWdlM0QoIC4uLmFyZ3VtZW50cyApO1xyXG5cclxuXHRcdH0gY2F0Y2ggKCBlcnJvciApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFN0YXRlOicsIGVycm9yICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHRleEltYWdlMkQoKSB7XHJcblxyXG5cdFx0dHJ5IHtcclxuXHJcblx0XHRcdGdsLnRleEltYWdlMkQoIC4uLmFyZ3VtZW50cyApO1xyXG5cclxuXHRcdH0gY2F0Y2ggKCBlcnJvciApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFN0YXRlOicsIGVycm9yICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHRleEltYWdlM0QoKSB7XHJcblxyXG5cdFx0dHJ5IHtcclxuXHJcblx0XHRcdGdsLnRleEltYWdlM0QoIC4uLmFyZ3VtZW50cyApO1xyXG5cclxuXHRcdH0gY2F0Y2ggKCBlcnJvciApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFN0YXRlOicsIGVycm9yICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8vXHJcblxyXG5cdGZ1bmN0aW9uIHNjaXNzb3IoIHNjaXNzb3IgKSB7XHJcblxyXG5cdFx0aWYgKCBjdXJyZW50U2Npc3Nvci5lcXVhbHMoIHNjaXNzb3IgKSA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRnbC5zY2lzc29yKCBzY2lzc29yLngsIHNjaXNzb3IueSwgc2Npc3Nvci56LCBzY2lzc29yLncgKTtcclxuXHRcdFx0Y3VycmVudFNjaXNzb3IuY29weSggc2Npc3NvciApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiB2aWV3cG9ydCggdmlld3BvcnQgKSB7XHJcblxyXG5cdFx0aWYgKCBjdXJyZW50Vmlld3BvcnQuZXF1YWxzKCB2aWV3cG9ydCApID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdGdsLnZpZXdwb3J0KCB2aWV3cG9ydC54LCB2aWV3cG9ydC55LCB2aWV3cG9ydC56LCB2aWV3cG9ydC53ICk7XHJcblx0XHRcdGN1cnJlbnRWaWV3cG9ydC5jb3B5KCB2aWV3cG9ydCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiB1cGRhdGVVQk9NYXBwaW5nKCB1bmlmb3Jtc0dyb3VwLCBwcm9ncmFtICkge1xyXG5cclxuXHRcdGxldCBtYXBwaW5nID0gdWJvUHJvZ3JhbU1hcC5nZXQoIHByb2dyYW0gKTtcclxuXHJcblx0XHRpZiAoIG1hcHBpbmcgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdG1hcHBpbmcgPSBuZXcgV2Vha01hcCgpO1xyXG5cclxuXHRcdFx0dWJvUHJvZ3JhbU1hcC5zZXQoIHByb2dyYW0sIG1hcHBpbmcgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0bGV0IGJsb2NrSW5kZXggPSBtYXBwaW5nLmdldCggdW5pZm9ybXNHcm91cCApO1xyXG5cclxuXHRcdGlmICggYmxvY2tJbmRleCA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0YmxvY2tJbmRleCA9IGdsLmdldFVuaWZvcm1CbG9ja0luZGV4KCBwcm9ncmFtLCB1bmlmb3Jtc0dyb3VwLm5hbWUgKTtcclxuXHJcblx0XHRcdG1hcHBpbmcuc2V0KCB1bmlmb3Jtc0dyb3VwLCBibG9ja0luZGV4ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHVuaWZvcm1CbG9ja0JpbmRpbmcoIHVuaWZvcm1zR3JvdXAsIHByb2dyYW0gKSB7XHJcblxyXG5cdFx0Y29uc3QgbWFwcGluZyA9IHVib1Byb2dyYW1NYXAuZ2V0KCBwcm9ncmFtICk7XHJcblx0XHRjb25zdCBibG9ja0luZGV4ID0gbWFwcGluZy5nZXQoIHVuaWZvcm1zR3JvdXAgKTtcclxuXHJcblx0XHRpZiAoIHVib0JpbmRpbmdzLmdldCggcHJvZ3JhbSApICE9PSBibG9ja0luZGV4ICkge1xyXG5cclxuXHRcdFx0Ly8gYmluZCBzaGFkZXIgc3BlY2lmaWMgYmxvY2sgaW5kZXggdG8gZ2xvYmFsIGJsb2NrIHBvaW50XHJcblx0XHRcdGdsLnVuaWZvcm1CbG9ja0JpbmRpbmcoIHByb2dyYW0sIGJsb2NrSW5kZXgsIHVuaWZvcm1zR3JvdXAuX19iaW5kaW5nUG9pbnRJbmRleCApO1xyXG5cclxuXHRcdFx0dWJvQmluZGluZ3Muc2V0KCBwcm9ncmFtLCBibG9ja0luZGV4ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8vXHJcblxyXG5cdGZ1bmN0aW9uIHJlc2V0KCkge1xyXG5cclxuXHRcdC8vIHJlc2V0IHN0YXRlXHJcblxyXG5cdFx0Z2wuZGlzYWJsZSggZ2wuQkxFTkQgKTtcclxuXHRcdGdsLmRpc2FibGUoIGdsLkNVTExfRkFDRSApO1xyXG5cdFx0Z2wuZGlzYWJsZSggZ2wuREVQVEhfVEVTVCApO1xyXG5cdFx0Z2wuZGlzYWJsZSggZ2wuUE9MWUdPTl9PRkZTRVRfRklMTCApO1xyXG5cdFx0Z2wuZGlzYWJsZSggZ2wuU0NJU1NPUl9URVNUICk7XHJcblx0XHRnbC5kaXNhYmxlKCBnbC5TVEVOQ0lMX1RFU1QgKTtcclxuXHRcdGdsLmRpc2FibGUoIGdsLlNBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSApO1xyXG5cclxuXHRcdGdsLmJsZW5kRXF1YXRpb24oIGdsLkZVTkNfQUREICk7XHJcblx0XHRnbC5ibGVuZEZ1bmMoIGdsLk9ORSwgZ2wuWkVSTyApO1xyXG5cdFx0Z2wuYmxlbmRGdW5jU2VwYXJhdGUoIGdsLk9ORSwgZ2wuWkVSTywgZ2wuT05FLCBnbC5aRVJPICk7XHJcblx0XHRnbC5ibGVuZENvbG9yKCAwLCAwLCAwLCAwICk7XHJcblxyXG5cdFx0Z2wuY29sb3JNYXNrKCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlICk7XHJcblx0XHRnbC5jbGVhckNvbG9yKCAwLCAwLCAwLCAwICk7XHJcblxyXG5cdFx0Z2wuZGVwdGhNYXNrKCB0cnVlICk7XHJcblx0XHRnbC5kZXB0aEZ1bmMoIGdsLkxFU1MgKTtcclxuXHJcblx0XHRkZXB0aEJ1ZmZlci5zZXRSZXZlcnNlZCggZmFsc2UgKTtcclxuXHJcblx0XHRnbC5jbGVhckRlcHRoKCAxICk7XHJcblxyXG5cdFx0Z2wuc3RlbmNpbE1hc2soIDB4ZmZmZmZmZmYgKTtcclxuXHRcdGdsLnN0ZW5jaWxGdW5jKCBnbC5BTFdBWVMsIDAsIDB4ZmZmZmZmZmYgKTtcclxuXHRcdGdsLnN0ZW5jaWxPcCggZ2wuS0VFUCwgZ2wuS0VFUCwgZ2wuS0VFUCApO1xyXG5cdFx0Z2wuY2xlYXJTdGVuY2lsKCAwICk7XHJcblxyXG5cdFx0Z2wuY3VsbEZhY2UoIGdsLkJBQ0sgKTtcclxuXHRcdGdsLmZyb250RmFjZSggZ2wuQ0NXICk7XHJcblxyXG5cdFx0Z2wucG9seWdvbk9mZnNldCggMCwgMCApO1xyXG5cclxuXHRcdGdsLmFjdGl2ZVRleHR1cmUoIGdsLlRFWFRVUkUwICk7XHJcblxyXG5cdFx0Z2wuYmluZEZyYW1lYnVmZmVyKCBnbC5GUkFNRUJVRkZFUiwgbnVsbCApO1xyXG5cdFx0Z2wuYmluZEZyYW1lYnVmZmVyKCBnbC5EUkFXX0ZSQU1FQlVGRkVSLCBudWxsICk7XHJcblx0XHRnbC5iaW5kRnJhbWVidWZmZXIoIGdsLlJFQURfRlJBTUVCVUZGRVIsIG51bGwgKTtcclxuXHJcblx0XHRnbC51c2VQcm9ncmFtKCBudWxsICk7XHJcblxyXG5cdFx0Z2wubGluZVdpZHRoKCAxICk7XHJcblxyXG5cdFx0Z2wuc2Npc3NvciggMCwgMCwgZ2wuY2FudmFzLndpZHRoLCBnbC5jYW52YXMuaGVpZ2h0ICk7XHJcblx0XHRnbC52aWV3cG9ydCggMCwgMCwgZ2wuY2FudmFzLndpZHRoLCBnbC5jYW52YXMuaGVpZ2h0ICk7XHJcblxyXG5cdFx0Ly8gcmVzZXQgaW50ZXJuYWxzXHJcblxyXG5cdFx0ZW5hYmxlZENhcGFiaWxpdGllcyA9IHt9O1xyXG5cclxuXHRcdGN1cnJlbnRUZXh0dXJlU2xvdCA9IG51bGw7XHJcblx0XHRjdXJyZW50Qm91bmRUZXh0dXJlcyA9IHt9O1xyXG5cclxuXHRcdGN1cnJlbnRCb3VuZEZyYW1lYnVmZmVycyA9IHt9O1xyXG5cdFx0Y3VycmVudERyYXdidWZmZXJzID0gbmV3IFdlYWtNYXAoKTtcclxuXHRcdGRlZmF1bHREcmF3YnVmZmVycyA9IFtdO1xyXG5cclxuXHRcdGN1cnJlbnRQcm9ncmFtID0gbnVsbDtcclxuXHJcblx0XHRjdXJyZW50QmxlbmRpbmdFbmFibGVkID0gZmFsc2U7XHJcblx0XHRjdXJyZW50QmxlbmRpbmcgPSBudWxsO1xyXG5cdFx0Y3VycmVudEJsZW5kRXF1YXRpb24gPSBudWxsO1xyXG5cdFx0Y3VycmVudEJsZW5kU3JjID0gbnVsbDtcclxuXHRcdGN1cnJlbnRCbGVuZERzdCA9IG51bGw7XHJcblx0XHRjdXJyZW50QmxlbmRFcXVhdGlvbkFscGhhID0gbnVsbDtcclxuXHRcdGN1cnJlbnRCbGVuZFNyY0FscGhhID0gbnVsbDtcclxuXHRcdGN1cnJlbnRCbGVuZERzdEFscGhhID0gbnVsbDtcclxuXHRcdGN1cnJlbnRCbGVuZENvbG9yID0gbmV3IENvbG9yKCAwLCAwLCAwICk7XHJcblx0XHRjdXJyZW50QmxlbmRBbHBoYSA9IDA7XHJcblx0XHRjdXJyZW50UHJlbXVsdGlwbGVkQWxwaGEgPSBmYWxzZTtcclxuXHJcblx0XHRjdXJyZW50RmxpcFNpZGVkID0gbnVsbDtcclxuXHRcdGN1cnJlbnRDdWxsRmFjZSA9IG51bGw7XHJcblxyXG5cdFx0Y3VycmVudExpbmVXaWR0aCA9IG51bGw7XHJcblxyXG5cdFx0Y3VycmVudFBvbHlnb25PZmZzZXRGYWN0b3IgPSBudWxsO1xyXG5cdFx0Y3VycmVudFBvbHlnb25PZmZzZXRVbml0cyA9IG51bGw7XHJcblxyXG5cdFx0Y3VycmVudFNjaXNzb3Iuc2V0KCAwLCAwLCBnbC5jYW52YXMud2lkdGgsIGdsLmNhbnZhcy5oZWlnaHQgKTtcclxuXHRcdGN1cnJlbnRWaWV3cG9ydC5zZXQoIDAsIDAsIGdsLmNhbnZhcy53aWR0aCwgZ2wuY2FudmFzLmhlaWdodCApO1xyXG5cclxuXHRcdGNvbG9yQnVmZmVyLnJlc2V0KCk7XHJcblx0XHRkZXB0aEJ1ZmZlci5yZXNldCgpO1xyXG5cdFx0c3RlbmNpbEJ1ZmZlci5yZXNldCgpO1xyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiB7XHJcblxyXG5cdFx0YnVmZmVyczoge1xyXG5cdFx0XHRjb2xvcjogY29sb3JCdWZmZXIsXHJcblx0XHRcdGRlcHRoOiBkZXB0aEJ1ZmZlcixcclxuXHRcdFx0c3RlbmNpbDogc3RlbmNpbEJ1ZmZlclxyXG5cdFx0fSxcclxuXHJcblx0XHRlbmFibGU6IGVuYWJsZSxcclxuXHRcdGRpc2FibGU6IGRpc2FibGUsXHJcblxyXG5cdFx0YmluZEZyYW1lYnVmZmVyOiBiaW5kRnJhbWVidWZmZXIsXHJcblx0XHRkcmF3QnVmZmVyczogZHJhd0J1ZmZlcnMsXHJcblxyXG5cdFx0dXNlUHJvZ3JhbTogdXNlUHJvZ3JhbSxcclxuXHJcblx0XHRzZXRCbGVuZGluZzogc2V0QmxlbmRpbmcsXHJcblx0XHRzZXRNYXRlcmlhbDogc2V0TWF0ZXJpYWwsXHJcblxyXG5cdFx0c2V0RmxpcFNpZGVkOiBzZXRGbGlwU2lkZWQsXHJcblx0XHRzZXRDdWxsRmFjZTogc2V0Q3VsbEZhY2UsXHJcblxyXG5cdFx0c2V0TGluZVdpZHRoOiBzZXRMaW5lV2lkdGgsXHJcblx0XHRzZXRQb2x5Z29uT2Zmc2V0OiBzZXRQb2x5Z29uT2Zmc2V0LFxyXG5cclxuXHRcdHNldFNjaXNzb3JUZXN0OiBzZXRTY2lzc29yVGVzdCxcclxuXHJcblx0XHRhY3RpdmVUZXh0dXJlOiBhY3RpdmVUZXh0dXJlLFxyXG5cdFx0YmluZFRleHR1cmU6IGJpbmRUZXh0dXJlLFxyXG5cdFx0dW5iaW5kVGV4dHVyZTogdW5iaW5kVGV4dHVyZSxcclxuXHRcdGNvbXByZXNzZWRUZXhJbWFnZTJEOiBjb21wcmVzc2VkVGV4SW1hZ2UyRCxcclxuXHRcdGNvbXByZXNzZWRUZXhJbWFnZTNEOiBjb21wcmVzc2VkVGV4SW1hZ2UzRCxcclxuXHRcdHRleEltYWdlMkQ6IHRleEltYWdlMkQsXHJcblx0XHR0ZXhJbWFnZTNEOiB0ZXhJbWFnZTNELFxyXG5cclxuXHRcdHVwZGF0ZVVCT01hcHBpbmc6IHVwZGF0ZVVCT01hcHBpbmcsXHJcblx0XHR1bmlmb3JtQmxvY2tCaW5kaW5nOiB1bmlmb3JtQmxvY2tCaW5kaW5nLFxyXG5cclxuXHRcdHRleFN0b3JhZ2UyRDogdGV4U3RvcmFnZTJELFxyXG5cdFx0dGV4U3RvcmFnZTNEOiB0ZXhTdG9yYWdlM0QsXHJcblx0XHR0ZXhTdWJJbWFnZTJEOiB0ZXhTdWJJbWFnZTJELFxyXG5cdFx0dGV4U3ViSW1hZ2UzRDogdGV4U3ViSW1hZ2UzRCxcclxuXHRcdGNvbXByZXNzZWRUZXhTdWJJbWFnZTJEOiBjb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCxcclxuXHRcdGNvbXByZXNzZWRUZXhTdWJJbWFnZTNEOiBjb21wcmVzc2VkVGV4U3ViSW1hZ2UzRCxcclxuXHJcblx0XHRzY2lzc29yOiBzY2lzc29yLFxyXG5cdFx0dmlld3BvcnQ6IHZpZXdwb3J0LFxyXG5cclxuXHRcdHJlc2V0OiByZXNldFxyXG5cclxuXHR9O1xyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgV2ViR0xTdGF0ZSB9O1xyXG4iLCJpbXBvcnQgeyBMaW5lYXJGaWx0ZXIsIExpbmVhck1pcG1hcExpbmVhckZpbHRlciwgTGluZWFyTWlwbWFwTmVhcmVzdEZpbHRlciwgTmVhcmVzdEZpbHRlciwgTmVhcmVzdE1pcG1hcExpbmVhckZpbHRlciwgTmVhcmVzdE1pcG1hcE5lYXJlc3RGaWx0ZXIsIFJHQkFGb3JtYXQsIERlcHRoRm9ybWF0LCBEZXB0aFN0ZW5jaWxGb3JtYXQsIFVuc2lnbmVkSW50VHlwZSwgRmxvYXRUeXBlLCBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nLCBDbGFtcFRvRWRnZVdyYXBwaW5nLCBSZXBlYXRXcmFwcGluZywgVW5zaWduZWRCeXRlVHlwZSwgTm9Db2xvclNwYWNlLCBMaW5lYXJTUkdCQ29sb3JTcGFjZSwgTmV2ZXJDb21wYXJlLCBBbHdheXNDb21wYXJlLCBMZXNzQ29tcGFyZSwgTGVzc0VxdWFsQ29tcGFyZSwgRXF1YWxDb21wYXJlLCBHcmVhdGVyRXF1YWxDb21wYXJlLCBHcmVhdGVyQ29tcGFyZSwgTm90RXF1YWxDb21wYXJlLCBTUkdCVHJhbnNmZXIsIExpbmVhclRyYW5zZmVyLCBVbnNpZ25lZFNob3J0VHlwZSwgVW5zaWduZWRJbnQyNDhUeXBlIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgY3JlYXRlRWxlbWVudE5TIH0gZnJvbSAnLi4vLi4vdXRpbHMuanMnO1xyXG5pbXBvcnQgeyBDb2xvck1hbmFnZW1lbnQgfSBmcm9tICcuLi8uLi9tYXRoL0NvbG9yTWFuYWdlbWVudC5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjIuanMnO1xyXG5pbXBvcnQgeyBnZXRCeXRlTGVuZ3RoIH0gZnJvbSAnLi4vLi4vZXh0cmFzL1RleHR1cmVVdGlscy5qcyc7XHJcblxyXG5mdW5jdGlvbiBXZWJHTFRleHR1cmVzKCBfZ2wsIGV4dGVuc2lvbnMsIHN0YXRlLCBwcm9wZXJ0aWVzLCBjYXBhYmlsaXRpZXMsIHV0aWxzLCBpbmZvICkge1xyXG5cclxuXHRjb25zdCBtdWx0aXNhbXBsZWRSVFRFeHQgPSBleHRlbnNpb25zLmhhcyggJ1dFQkdMX211bHRpc2FtcGxlZF9yZW5kZXJfdG9fdGV4dHVyZScgKSA/IGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfbXVsdGlzYW1wbGVkX3JlbmRlcl90b190ZXh0dXJlJyApIDogbnVsbDtcclxuXHRjb25zdCBzdXBwb3J0c0ludmFsaWRhdGVGcmFtZWJ1ZmZlciA9IHR5cGVvZiBuYXZpZ2F0b3IgPT09ICd1bmRlZmluZWQnID8gZmFsc2UgOiAvT2N1bHVzQnJvd3Nlci9nLnRlc3QoIG5hdmlnYXRvci51c2VyQWdlbnQgKTtcclxuXHJcblx0Y29uc3QgX2ltYWdlRGltZW5zaW9ucyA9IG5ldyBWZWN0b3IyKCk7XHJcblx0Y29uc3QgX3ZpZGVvVGV4dHVyZXMgPSBuZXcgV2Vha01hcCgpO1xyXG5cdGxldCBfY2FudmFzO1xyXG5cclxuXHRjb25zdCBfc291cmNlcyA9IG5ldyBXZWFrTWFwKCk7IC8vIG1hcHMgV2ViZ2xUZXh0dXJlIG9iamVjdHMgdG8gaW5zdGFuY2VzIG9mIFNvdXJjZVxyXG5cclxuXHQvLyBjb3Jkb3ZhIGlPUyAoYXMgb2YgNS4wKSBzdGlsbCB1c2VzIFVJV2ViVmlldywgd2hpY2ggcHJvdmlkZXMgT2Zmc2NyZWVuQ2FudmFzLFxyXG5cdC8vIGFsc28gT2Zmc2NyZWVuQ2FudmFzLmdldENvbnRleHQoXCJ3ZWJnbFwiKSwgYnV0IG5vdCBPZmZzY3JlZW5DYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpIVxyXG5cdC8vIFNvbWUgaW1wbGVtZW50YXRpb25zIG1heSBvbmx5IGltcGxlbWVudCBPZmZzY3JlZW5DYW52YXMgcGFydGlhbGx5IChlLmcuIGxhY2tpbmcgMmQpLlxyXG5cclxuXHRsZXQgdXNlT2Zmc2NyZWVuQ2FudmFzID0gZmFsc2U7XHJcblxyXG5cdHRyeSB7XHJcblxyXG5cdFx0dXNlT2Zmc2NyZWVuQ2FudmFzID0gdHlwZW9mIE9mZnNjcmVlbkNhbnZhcyAhPT0gJ3VuZGVmaW5lZCdcclxuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBhdC9jb21wYXRcclxuXHRcdFx0JiYgKCBuZXcgT2Zmc2NyZWVuQ2FudmFzKCAxLCAxICkuZ2V0Q29udGV4dCggJzJkJyApICkgIT09IG51bGw7XHJcblxyXG5cdH0gY2F0Y2ggKCBlcnIgKSB7XHJcblxyXG5cdFx0Ly8gSWdub3JlIGFueSBlcnJvcnNcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBjcmVhdGVDYW52YXMoIHdpZHRoLCBoZWlnaHQgKSB7XHJcblxyXG5cdFx0Ly8gVXNlIE9mZnNjcmVlbkNhbnZhcyB3aGVuIGF2YWlsYWJsZS4gU3BlY2lhbGx5IG5lZWRlZCBpbiB3ZWIgd29ya2Vyc1xyXG5cclxuXHRcdHJldHVybiB1c2VPZmZzY3JlZW5DYW52YXMgP1xyXG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGF0L2NvbXBhdFxyXG5cdFx0XHRuZXcgT2Zmc2NyZWVuQ2FudmFzKCB3aWR0aCwgaGVpZ2h0ICkgOiBjcmVhdGVFbGVtZW50TlMoICdjYW52YXMnICk7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gcmVzaXplSW1hZ2UoIGltYWdlLCBuZWVkc05ld0NhbnZhcywgbWF4U2l6ZSApIHtcclxuXHJcblx0XHRsZXQgc2NhbGUgPSAxO1xyXG5cclxuXHRcdGNvbnN0IGRpbWVuc2lvbnMgPSBnZXREaW1lbnNpb25zKCBpbWFnZSApO1xyXG5cclxuXHRcdC8vIGhhbmRsZSBjYXNlIGlmIHRleHR1cmUgZXhjZWVkcyBtYXggc2l6ZVxyXG5cclxuXHRcdGlmICggZGltZW5zaW9ucy53aWR0aCA+IG1heFNpemUgfHwgZGltZW5zaW9ucy5oZWlnaHQgPiBtYXhTaXplICkge1xyXG5cclxuXHRcdFx0c2NhbGUgPSBtYXhTaXplIC8gTWF0aC5tYXgoIGRpbWVuc2lvbnMud2lkdGgsIGRpbWVuc2lvbnMuaGVpZ2h0ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIG9ubHkgcGVyZm9ybSByZXNpemUgaWYgbmVjZXNzYXJ5XHJcblxyXG5cdFx0aWYgKCBzY2FsZSA8IDEgKSB7XHJcblxyXG5cdFx0XHQvLyBvbmx5IHBlcmZvcm0gcmVzaXplIGZvciBjZXJ0YWluIGltYWdlIHR5cGVzXHJcblxyXG5cdFx0XHRpZiAoICggdHlwZW9mIEhUTUxJbWFnZUVsZW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGltYWdlIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCApIHx8XHJcblx0XHRcdFx0KCB0eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGltYWdlIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQgKSB8fFxyXG5cdFx0XHRcdCggdHlwZW9mIEltYWdlQml0bWFwICE9PSAndW5kZWZpbmVkJyAmJiBpbWFnZSBpbnN0YW5jZW9mIEltYWdlQml0bWFwICkgfHxcclxuXHRcdFx0XHQoIHR5cGVvZiBWaWRlb0ZyYW1lICE9PSAndW5kZWZpbmVkJyAmJiBpbWFnZSBpbnN0YW5jZW9mIFZpZGVvRnJhbWUgKSApIHtcclxuXHJcblx0XHRcdFx0Y29uc3Qgd2lkdGggPSBNYXRoLmZsb29yKCBzY2FsZSAqIGRpbWVuc2lvbnMud2lkdGggKTtcclxuXHRcdFx0XHRjb25zdCBoZWlnaHQgPSBNYXRoLmZsb29yKCBzY2FsZSAqIGRpbWVuc2lvbnMuaGVpZ2h0ICk7XHJcblxyXG5cdFx0XHRcdGlmICggX2NhbnZhcyA9PT0gdW5kZWZpbmVkICkgX2NhbnZhcyA9IGNyZWF0ZUNhbnZhcyggd2lkdGgsIGhlaWdodCApO1xyXG5cclxuXHRcdFx0XHQvLyBjdWJlIHRleHR1cmVzIGNhbid0IHJldXNlIHRoZSBzYW1lIGNhbnZhc1xyXG5cclxuXHRcdFx0XHRjb25zdCBjYW52YXMgPSBuZWVkc05ld0NhbnZhcyA/IGNyZWF0ZUNhbnZhcyggd2lkdGgsIGhlaWdodCApIDogX2NhbnZhcztcclxuXHJcblx0XHRcdFx0Y2FudmFzLndpZHRoID0gd2lkdGg7XHJcblx0XHRcdFx0Y2FudmFzLmhlaWdodCA9IGhlaWdodDtcclxuXHJcblx0XHRcdFx0Y29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCAnMmQnICk7XHJcblx0XHRcdFx0Y29udGV4dC5kcmF3SW1hZ2UoIGltYWdlLCAwLCAwLCB3aWR0aCwgaGVpZ2h0ICk7XHJcblxyXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgaGFzIGJlZW4gcmVzaXplZCBmcm9tICgnICsgZGltZW5zaW9ucy53aWR0aCArICd4JyArIGRpbWVuc2lvbnMuaGVpZ2h0ICsgJykgdG8gKCcgKyB3aWR0aCArICd4JyArIGhlaWdodCArICcpLicgKTtcclxuXHJcblx0XHRcdFx0cmV0dXJuIGNhbnZhcztcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGlmICggJ2RhdGEnIGluIGltYWdlICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IEltYWdlIGluIERhdGFUZXh0dXJlIGlzIHRvbyBiaWcgKCcgKyBkaW1lbnNpb25zLndpZHRoICsgJ3gnICsgZGltZW5zaW9ucy5oZWlnaHQgKyAnKS4nICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0cmV0dXJuIGltYWdlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gaW1hZ2U7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gdGV4dHVyZU5lZWRzR2VuZXJhdGVNaXBtYXBzKCB0ZXh0dXJlICkge1xyXG5cclxuXHRcdHJldHVybiB0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcztcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBnZW5lcmF0ZU1pcG1hcCggdGFyZ2V0ICkge1xyXG5cclxuXHRcdF9nbC5nZW5lcmF0ZU1pcG1hcCggdGFyZ2V0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gZ2V0VGFyZ2V0VHlwZSggdGV4dHVyZSApIHtcclxuXHJcblx0XHRpZiAoIHRleHR1cmUuaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQgKSByZXR1cm4gX2dsLlRFWFRVUkVfQ1VCRV9NQVA7XHJcblx0XHRpZiAoIHRleHR1cmUuaXNXZWJHTDNEUmVuZGVyVGFyZ2V0ICkgcmV0dXJuIF9nbC5URVhUVVJFXzNEO1xyXG5cdFx0aWYgKCB0ZXh0dXJlLmlzV2ViR0xBcnJheVJlbmRlclRhcmdldCB8fCB0ZXh0dXJlLmlzQ29tcHJlc3NlZEFycmF5VGV4dHVyZSApIHJldHVybiBfZ2wuVEVYVFVSRV8yRF9BUlJBWTtcclxuXHRcdHJldHVybiBfZ2wuVEVYVFVSRV8yRDtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBnZXRJbnRlcm5hbEZvcm1hdCggaW50ZXJuYWxGb3JtYXROYW1lLCBnbEZvcm1hdCwgZ2xUeXBlLCBjb2xvclNwYWNlLCBmb3JjZUxpbmVhclRyYW5zZmVyID0gZmFsc2UgKSB7XHJcblxyXG5cdFx0aWYgKCBpbnRlcm5hbEZvcm1hdE5hbWUgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRpZiAoIF9nbFsgaW50ZXJuYWxGb3JtYXROYW1lIF0gIT09IHVuZGVmaW5lZCApIHJldHVybiBfZ2xbIGludGVybmFsRm9ybWF0TmFtZSBdO1xyXG5cclxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogQXR0ZW1wdCB0byB1c2Ugbm9uLWV4aXN0aW5nIFdlYkdMIGludGVybmFsIGZvcm1hdCBcXCcnICsgaW50ZXJuYWxGb3JtYXROYW1lICsgJ1xcJycgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0bGV0IGludGVybmFsRm9ybWF0ID0gZ2xGb3JtYXQ7XHJcblxyXG5cdFx0aWYgKCBnbEZvcm1hdCA9PT0gX2dsLlJFRCApIHtcclxuXHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBfZ2wuRkxPQVQgKSBpbnRlcm5hbEZvcm1hdCA9IF9nbC5SMzJGO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gX2dsLkhBTEZfRkxPQVQgKSBpbnRlcm5hbEZvcm1hdCA9IF9nbC5SMTZGO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gX2dsLlVOU0lHTkVEX0JZVEUgKSBpbnRlcm5hbEZvcm1hdCA9IF9nbC5SODtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBnbEZvcm1hdCA9PT0gX2dsLlJFRF9JTlRFR0VSICkge1xyXG5cclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IF9nbC5VTlNJR05FRF9CWVRFICkgaW50ZXJuYWxGb3JtYXQgPSBfZ2wuUjhVSTtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IF9nbC5VTlNJR05FRF9TSE9SVCApIGludGVybmFsRm9ybWF0ID0gX2dsLlIxNlVJO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gX2dsLlVOU0lHTkVEX0lOVCApIGludGVybmFsRm9ybWF0ID0gX2dsLlIzMlVJO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gX2dsLkJZVEUgKSBpbnRlcm5hbEZvcm1hdCA9IF9nbC5SOEk7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBfZ2wuU0hPUlQgKSBpbnRlcm5hbEZvcm1hdCA9IF9nbC5SMTZJO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gX2dsLklOVCApIGludGVybmFsRm9ybWF0ID0gX2dsLlIzMkk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggZ2xGb3JtYXQgPT09IF9nbC5SRyApIHtcclxuXHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBfZ2wuRkxPQVQgKSBpbnRlcm5hbEZvcm1hdCA9IF9nbC5SRzMyRjtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IF9nbC5IQUxGX0ZMT0FUICkgaW50ZXJuYWxGb3JtYXQgPSBfZ2wuUkcxNkY7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBfZ2wuVU5TSUdORURfQllURSApIGludGVybmFsRm9ybWF0ID0gX2dsLlJHODtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBnbEZvcm1hdCA9PT0gX2dsLlJHX0lOVEVHRVIgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gX2dsLlVOU0lHTkVEX0JZVEUgKSBpbnRlcm5hbEZvcm1hdCA9IF9nbC5SRzhVSTtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IF9nbC5VTlNJR05FRF9TSE9SVCApIGludGVybmFsRm9ybWF0ID0gX2dsLlJHMTZVSTtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IF9nbC5VTlNJR05FRF9JTlQgKSBpbnRlcm5hbEZvcm1hdCA9IF9nbC5SRzMyVUk7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBfZ2wuQllURSApIGludGVybmFsRm9ybWF0ID0gX2dsLlJHOEk7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBfZ2wuU0hPUlQgKSBpbnRlcm5hbEZvcm1hdCA9IF9nbC5SRzE2STtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IF9nbC5JTlQgKSBpbnRlcm5hbEZvcm1hdCA9IF9nbC5SRzMySTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBnbEZvcm1hdCA9PT0gX2dsLlJHQl9JTlRFR0VSICkge1xyXG5cclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IF9nbC5VTlNJR05FRF9CWVRFICkgaW50ZXJuYWxGb3JtYXQgPSBfZ2wuUkdCOFVJO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gX2dsLlVOU0lHTkVEX1NIT1JUICkgaW50ZXJuYWxGb3JtYXQgPSBfZ2wuUkdCMTZVSTtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IF9nbC5VTlNJR05FRF9JTlQgKSBpbnRlcm5hbEZvcm1hdCA9IF9nbC5SR0IzMlVJO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gX2dsLkJZVEUgKSBpbnRlcm5hbEZvcm1hdCA9IF9nbC5SR0I4STtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IF9nbC5TSE9SVCApIGludGVybmFsRm9ybWF0ID0gX2dsLlJHQjE2STtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IF9nbC5JTlQgKSBpbnRlcm5hbEZvcm1hdCA9IF9nbC5SR0IzMkk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggZ2xGb3JtYXQgPT09IF9nbC5SR0JBX0lOVEVHRVIgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gX2dsLlVOU0lHTkVEX0JZVEUgKSBpbnRlcm5hbEZvcm1hdCA9IF9nbC5SR0JBOFVJO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gX2dsLlVOU0lHTkVEX1NIT1JUICkgaW50ZXJuYWxGb3JtYXQgPSBfZ2wuUkdCQTE2VUk7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBfZ2wuVU5TSUdORURfSU5UICkgaW50ZXJuYWxGb3JtYXQgPSBfZ2wuUkdCQTMyVUk7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBfZ2wuQllURSApIGludGVybmFsRm9ybWF0ID0gX2dsLlJHQkE4STtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IF9nbC5TSE9SVCApIGludGVybmFsRm9ybWF0ID0gX2dsLlJHQkExNkk7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBfZ2wuSU5UICkgaW50ZXJuYWxGb3JtYXQgPSBfZ2wuUkdCQTMySTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBnbEZvcm1hdCA9PT0gX2dsLlJHQiApIHtcclxuXHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBfZ2wuVU5TSUdORURfSU5UXzVfOV85XzlfUkVWICkgaW50ZXJuYWxGb3JtYXQgPSBfZ2wuUkdCOV9FNTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBnbEZvcm1hdCA9PT0gX2dsLlJHQkEgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB0cmFuc2ZlciA9IGZvcmNlTGluZWFyVHJhbnNmZXIgPyBMaW5lYXJUcmFuc2ZlciA6IENvbG9yTWFuYWdlbWVudC5nZXRUcmFuc2ZlciggY29sb3JTcGFjZSApO1xyXG5cclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IF9nbC5GTE9BVCApIGludGVybmFsRm9ybWF0ID0gX2dsLlJHQkEzMkY7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBfZ2wuSEFMRl9GTE9BVCApIGludGVybmFsRm9ybWF0ID0gX2dsLlJHQkExNkY7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBfZ2wuVU5TSUdORURfQllURSApIGludGVybmFsRm9ybWF0ID0gKCB0cmFuc2ZlciA9PT0gU1JHQlRyYW5zZmVyICkgPyBfZ2wuU1JHQjhfQUxQSEE4IDogX2dsLlJHQkE4O1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gX2dsLlVOU0lHTkVEX1NIT1JUXzRfNF80XzQgKSBpbnRlcm5hbEZvcm1hdCA9IF9nbC5SR0JBNDtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IF9nbC5VTlNJR05FRF9TSE9SVF81XzVfNV8xICkgaW50ZXJuYWxGb3JtYXQgPSBfZ2wuUkdCNV9BMTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBpbnRlcm5hbEZvcm1hdCA9PT0gX2dsLlIxNkYgfHwgaW50ZXJuYWxGb3JtYXQgPT09IF9nbC5SMzJGIHx8XHJcblx0XHRcdGludGVybmFsRm9ybWF0ID09PSBfZ2wuUkcxNkYgfHwgaW50ZXJuYWxGb3JtYXQgPT09IF9nbC5SRzMyRiB8fFxyXG5cdFx0XHRpbnRlcm5hbEZvcm1hdCA9PT0gX2dsLlJHQkExNkYgfHwgaW50ZXJuYWxGb3JtYXQgPT09IF9nbC5SR0JBMzJGICkge1xyXG5cclxuXHRcdFx0ZXh0ZW5zaW9ucy5nZXQoICdFWFRfY29sb3JfYnVmZmVyX2Zsb2F0JyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gaW50ZXJuYWxGb3JtYXQ7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gZ2V0SW50ZXJuYWxEZXB0aEZvcm1hdCggdXNlU3RlbmNpbCwgZGVwdGhUeXBlICkge1xyXG5cclxuXHRcdGxldCBnbEludGVybmFsRm9ybWF0O1xyXG5cdFx0aWYgKCB1c2VTdGVuY2lsICkge1xyXG5cclxuXHRcdFx0aWYgKCBkZXB0aFR5cGUgPT09IG51bGwgfHwgZGVwdGhUeXBlID09PSBVbnNpZ25lZEludFR5cGUgfHwgZGVwdGhUeXBlID09PSBVbnNpZ25lZEludDI0OFR5cGUgKSB7XHJcblxyXG5cdFx0XHRcdGdsSW50ZXJuYWxGb3JtYXQgPSBfZ2wuREVQVEgyNF9TVEVOQ0lMODtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGRlcHRoVHlwZSA9PT0gRmxvYXRUeXBlICkge1xyXG5cclxuXHRcdFx0XHRnbEludGVybmFsRm9ybWF0ID0gX2dsLkRFUFRIMzJGX1NURU5DSUw4O1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggZGVwdGhUeXBlID09PSBVbnNpZ25lZFNob3J0VHlwZSApIHtcclxuXHJcblx0XHRcdFx0Z2xJbnRlcm5hbEZvcm1hdCA9IF9nbC5ERVBUSDI0X1NURU5DSUw4O1xyXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ0RlcHRoVGV4dHVyZTogMTYgYml0IGRlcHRoIGF0dGFjaG1lbnQgaXMgbm90IHN1cHBvcnRlZCB3aXRoIHN0ZW5jaWwuIFVzaW5nIDI0LWJpdCBhdHRhY2htZW50LicgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0aWYgKCBkZXB0aFR5cGUgPT09IG51bGwgfHwgZGVwdGhUeXBlID09PSBVbnNpZ25lZEludFR5cGUgfHwgZGVwdGhUeXBlID09PSBVbnNpZ25lZEludDI0OFR5cGUgKSB7XHJcblxyXG5cdFx0XHRcdGdsSW50ZXJuYWxGb3JtYXQgPSBfZ2wuREVQVEhfQ09NUE9ORU5UMjQ7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBkZXB0aFR5cGUgPT09IEZsb2F0VHlwZSApIHtcclxuXHJcblx0XHRcdFx0Z2xJbnRlcm5hbEZvcm1hdCA9IF9nbC5ERVBUSF9DT01QT05FTlQzMkY7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBkZXB0aFR5cGUgPT09IFVuc2lnbmVkU2hvcnRUeXBlICkge1xyXG5cclxuXHRcdFx0XHRnbEludGVybmFsRm9ybWF0ID0gX2dsLkRFUFRIX0NPTVBPTkVOVDE2O1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZ2xJbnRlcm5hbEZvcm1hdDtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBnZXRNaXBMZXZlbHMoIHRleHR1cmUsIGltYWdlICkge1xyXG5cclxuXHRcdGlmICggdGV4dHVyZU5lZWRzR2VuZXJhdGVNaXBtYXBzKCB0ZXh0dXJlICkgPT09IHRydWUgfHwgKCB0ZXh0dXJlLmlzRnJhbWVidWZmZXJUZXh0dXJlICYmIHRleHR1cmUubWluRmlsdGVyICE9PSBOZWFyZXN0RmlsdGVyICYmIHRleHR1cmUubWluRmlsdGVyICE9PSBMaW5lYXJGaWx0ZXIgKSApIHtcclxuXHJcblx0XHRcdHJldHVybiBNYXRoLmxvZzIoIE1hdGgubWF4KCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0ICkgKSArIDE7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggdGV4dHVyZS5taXBtYXBzICE9PSB1bmRlZmluZWQgJiYgdGV4dHVyZS5taXBtYXBzLmxlbmd0aCA+IDAgKSB7XHJcblxyXG5cdFx0XHQvLyB1c2VyLWRlZmluZWQgbWlwbWFwc1xyXG5cclxuXHRcdFx0cmV0dXJuIHRleHR1cmUubWlwbWFwcy5sZW5ndGg7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggdGV4dHVyZS5pc0NvbXByZXNzZWRUZXh0dXJlICYmIEFycmF5LmlzQXJyYXkoIHRleHR1cmUuaW1hZ2UgKSApIHtcclxuXHJcblx0XHRcdHJldHVybiBpbWFnZS5taXBtYXBzLmxlbmd0aDtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Ly8gdGV4dHVyZSB3aXRob3V0IG1pcG1hcHMgKG9ubHkgYmFzZSBsZXZlbClcclxuXHJcblx0XHRcdHJldHVybiAxO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvL1xyXG5cclxuXHRmdW5jdGlvbiBvblRleHR1cmVEaXNwb3NlKCBldmVudCApIHtcclxuXHJcblx0XHRjb25zdCB0ZXh0dXJlID0gZXZlbnQudGFyZ2V0O1xyXG5cclxuXHRcdHRleHR1cmUucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvblRleHR1cmVEaXNwb3NlICk7XHJcblxyXG5cdFx0ZGVhbGxvY2F0ZVRleHR1cmUoIHRleHR1cmUgKTtcclxuXHJcblx0XHRpZiAoIHRleHR1cmUuaXNWaWRlb1RleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRfdmlkZW9UZXh0dXJlcy5kZWxldGUoIHRleHR1cmUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gb25SZW5kZXJUYXJnZXREaXNwb3NlKCBldmVudCApIHtcclxuXHJcblx0XHRjb25zdCByZW5kZXJUYXJnZXQgPSBldmVudC50YXJnZXQ7XHJcblxyXG5cdFx0cmVuZGVyVGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25SZW5kZXJUYXJnZXREaXNwb3NlICk7XHJcblxyXG5cdFx0ZGVhbGxvY2F0ZVJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0Ly9cclxuXHJcblx0ZnVuY3Rpb24gZGVhbGxvY2F0ZVRleHR1cmUoIHRleHR1cmUgKSB7XHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggdGV4dHVyZSApO1xyXG5cclxuXHRcdGlmICggdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbEluaXQgPT09IHVuZGVmaW5lZCApIHJldHVybjtcclxuXHJcblx0XHQvLyBjaGVjayBpZiBpdCdzIG5lY2Vzc2FyeSB0byByZW1vdmUgdGhlIFdlYkdMVGV4dHVyZSBvYmplY3RcclxuXHJcblx0XHRjb25zdCBzb3VyY2UgPSB0ZXh0dXJlLnNvdXJjZTtcclxuXHRcdGNvbnN0IHdlYmdsVGV4dHVyZXMgPSBfc291cmNlcy5nZXQoIHNvdXJjZSApO1xyXG5cclxuXHRcdGlmICggd2ViZ2xUZXh0dXJlcyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHdlYmdsVGV4dHVyZSA9IHdlYmdsVGV4dHVyZXNbIHRleHR1cmVQcm9wZXJ0aWVzLl9fY2FjaGVLZXkgXTtcclxuXHRcdFx0d2ViZ2xUZXh0dXJlLnVzZWRUaW1lcyAtLTtcclxuXHJcblx0XHRcdC8vIHRoZSBXZWJHTFRleHR1cmUgb2JqZWN0IGlzIG5vdCB1c2VkIGFueW1vcmUsIHJlbW92ZSBpdFxyXG5cclxuXHRcdFx0aWYgKCB3ZWJnbFRleHR1cmUudXNlZFRpbWVzID09PSAwICkge1xyXG5cclxuXHRcdFx0XHRkZWxldGVUZXh0dXJlKCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyByZW1vdmUgdGhlIHdlYWsgbWFwIGVudHJ5IGlmIG5vIFdlYkdMVGV4dHVyZSB1c2VzIHRoZSBzb3VyY2UgYW55bW9yZVxyXG5cclxuXHRcdFx0aWYgKCBPYmplY3Qua2V5cyggd2ViZ2xUZXh0dXJlcyApLmxlbmd0aCA9PT0gMCApIHtcclxuXHJcblx0XHRcdFx0X3NvdXJjZXMuZGVsZXRlKCBzb3VyY2UgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cHJvcGVydGllcy5yZW1vdmUoIHRleHR1cmUgKTtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBkZWxldGVUZXh0dXJlKCB0ZXh0dXJlICkge1xyXG5cclxuXHRcdGNvbnN0IHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKTtcclxuXHRcdF9nbC5kZWxldGVUZXh0dXJlKCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApO1xyXG5cclxuXHRcdGNvbnN0IHNvdXJjZSA9IHRleHR1cmUuc291cmNlO1xyXG5cdFx0Y29uc3Qgd2ViZ2xUZXh0dXJlcyA9IF9zb3VyY2VzLmdldCggc291cmNlICk7XHJcblx0XHRkZWxldGUgd2ViZ2xUZXh0dXJlc1sgdGV4dHVyZVByb3BlcnRpZXMuX19jYWNoZUtleSBdO1xyXG5cclxuXHRcdGluZm8ubWVtb3J5LnRleHR1cmVzIC0tO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGRlYWxsb2NhdGVSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCApIHtcclxuXHJcblx0XHRjb25zdCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCApO1xyXG5cclxuXHRcdGlmICggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuZGlzcG9zZSgpO1xyXG5cclxuXHRcdFx0cHJvcGVydGllcy5yZW1vdmUoIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQuaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQgKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCA2OyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyWyBpIF0gKSApIHtcclxuXHJcblx0XHRcdFx0XHRmb3IgKCBsZXQgbGV2ZWwgPSAwOyBsZXZlbCA8IHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyWyBpIF0ubGVuZ3RoOyBsZXZlbCArKyApIF9nbC5kZWxldGVGcmFtZWJ1ZmZlciggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXJbIGkgXVsgbGV2ZWwgXSApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdF9nbC5kZWxldGVGcmFtZWJ1ZmZlciggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXJbIGkgXSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXIgKSBfZ2wuZGVsZXRlUmVuZGVyYnVmZmVyKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlclsgaSBdICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXIgKSApIHtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGxldmVsID0gMDsgbGV2ZWwgPCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlci5sZW5ndGg7IGxldmVsICsrICkgX2dsLmRlbGV0ZUZyYW1lYnVmZmVyKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlclsgbGV2ZWwgXSApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0X2dsLmRlbGV0ZUZyYW1lYnVmZmVyKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlciApIF9nbC5kZWxldGVSZW5kZXJidWZmZXIoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyICk7XHJcblx0XHRcdGlmICggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXIgKSBfZ2wuZGVsZXRlRnJhbWVidWZmZXIoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyICk7XHJcblxyXG5cdFx0XHRpZiAoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyICkge1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlci5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlclsgaSBdICkgX2dsLmRlbGV0ZVJlbmRlcmJ1ZmZlciggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXJbIGkgXSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoUmVuZGVyYnVmZmVyICkgX2dsLmRlbGV0ZVJlbmRlcmJ1ZmZlciggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhSZW5kZXJidWZmZXIgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZXMgPSByZW5kZXJUYXJnZXQudGV4dHVyZXM7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IHRleHR1cmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYXR0YWNobWVudFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggdGV4dHVyZXNbIGkgXSApO1xyXG5cclxuXHRcdFx0aWYgKCBhdHRhY2htZW50UHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0X2dsLmRlbGV0ZVRleHR1cmUoIGF0dGFjaG1lbnRQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICk7XHJcblxyXG5cdFx0XHRcdGluZm8ubWVtb3J5LnRleHR1cmVzIC0tO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cHJvcGVydGllcy5yZW1vdmUoIHRleHR1cmVzWyBpIF0gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cHJvcGVydGllcy5yZW1vdmUoIHJlbmRlclRhcmdldCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vXHJcblxyXG5cdGxldCB0ZXh0dXJlVW5pdHMgPSAwO1xyXG5cclxuXHRmdW5jdGlvbiByZXNldFRleHR1cmVVbml0cygpIHtcclxuXHJcblx0XHR0ZXh0dXJlVW5pdHMgPSAwO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGFsbG9jYXRlVGV4dHVyZVVuaXQoKSB7XHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZVVuaXQgPSB0ZXh0dXJlVW5pdHM7XHJcblxyXG5cdFx0aWYgKCB0ZXh0dXJlVW5pdCA+PSBjYXBhYmlsaXRpZXMubWF4VGV4dHVyZXMgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFRleHR1cmVzOiBUcnlpbmcgdG8gdXNlICcgKyB0ZXh0dXJlVW5pdCArICcgdGV4dHVyZSB1bml0cyB3aGlsZSB0aGlzIEdQVSBzdXBwb3J0cyBvbmx5ICcgKyBjYXBhYmlsaXRpZXMubWF4VGV4dHVyZXMgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGV4dHVyZVVuaXRzICs9IDE7XHJcblxyXG5cdFx0cmV0dXJuIHRleHR1cmVVbml0O1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGdldFRleHR1cmVDYWNoZUtleSggdGV4dHVyZSApIHtcclxuXHJcblx0XHRjb25zdCBhcnJheSA9IFtdO1xyXG5cclxuXHRcdGFycmF5LnB1c2goIHRleHR1cmUud3JhcFMgKTtcclxuXHRcdGFycmF5LnB1c2goIHRleHR1cmUud3JhcFQgKTtcclxuXHRcdGFycmF5LnB1c2goIHRleHR1cmUud3JhcFIgfHwgMCApO1xyXG5cdFx0YXJyYXkucHVzaCggdGV4dHVyZS5tYWdGaWx0ZXIgKTtcclxuXHRcdGFycmF5LnB1c2goIHRleHR1cmUubWluRmlsdGVyICk7XHJcblx0XHRhcnJheS5wdXNoKCB0ZXh0dXJlLmFuaXNvdHJvcHkgKTtcclxuXHRcdGFycmF5LnB1c2goIHRleHR1cmUuaW50ZXJuYWxGb3JtYXQgKTtcclxuXHRcdGFycmF5LnB1c2goIHRleHR1cmUuZm9ybWF0ICk7XHJcblx0XHRhcnJheS5wdXNoKCB0ZXh0dXJlLnR5cGUgKTtcclxuXHRcdGFycmF5LnB1c2goIHRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzICk7XHJcblx0XHRhcnJheS5wdXNoKCB0ZXh0dXJlLnByZW11bHRpcGx5QWxwaGEgKTtcclxuXHRcdGFycmF5LnB1c2goIHRleHR1cmUuZmxpcFkgKTtcclxuXHRcdGFycmF5LnB1c2goIHRleHR1cmUudW5wYWNrQWxpZ25tZW50ICk7XHJcblx0XHRhcnJheS5wdXNoKCB0ZXh0dXJlLmNvbG9yU3BhY2UgKTtcclxuXHJcblx0XHRyZXR1cm4gYXJyYXkuam9pbigpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vXHJcblxyXG5cdGZ1bmN0aW9uIHNldFRleHR1cmUyRCggdGV4dHVyZSwgc2xvdCApIHtcclxuXHJcblx0XHRjb25zdCB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0aWYgKCB0ZXh0dXJlLmlzVmlkZW9UZXh0dXJlICkgdXBkYXRlVmlkZW9UZXh0dXJlKCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0aWYgKCB0ZXh0dXJlLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSA9PT0gZmFsc2UgJiYgdGV4dHVyZS52ZXJzaW9uID4gMCAmJiB0ZXh0dXJlUHJvcGVydGllcy5fX3ZlcnNpb24gIT09IHRleHR1cmUudmVyc2lvbiApIHtcclxuXHJcblx0XHRcdGNvbnN0IGltYWdlID0gdGV4dHVyZS5pbWFnZTtcclxuXHJcblx0XHRcdGlmICggaW1hZ2UgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgbWFya2VkIGZvciB1cGRhdGUgYnV0IG5vIGltYWdlIGRhdGEgZm91bmQuJyApO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggaW1hZ2UuY29tcGxldGUgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIG1hcmtlZCBmb3IgdXBkYXRlIGJ1dCBpbWFnZSBpcyBpbmNvbXBsZXRlJyApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0dXBsb2FkVGV4dHVyZSggdGV4dHVyZVByb3BlcnRpZXMsIHRleHR1cmUsIHNsb3QgKTtcclxuXHRcdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHN0YXRlLmJpbmRUZXh0dXJlKCBfZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUsIF9nbC5URVhUVVJFMCArIHNsb3QgKTtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBzZXRUZXh0dXJlMkRBcnJheSggdGV4dHVyZSwgc2xvdCApIHtcclxuXHJcblx0XHRjb25zdCB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0aWYgKCB0ZXh0dXJlLnZlcnNpb24gPiAwICYmIHRleHR1cmVQcm9wZXJ0aWVzLl9fdmVyc2lvbiAhPT0gdGV4dHVyZS52ZXJzaW9uICkge1xyXG5cclxuXHRcdFx0dXBsb2FkVGV4dHVyZSggdGV4dHVyZVByb3BlcnRpZXMsIHRleHR1cmUsIHNsb3QgKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggX2dsLlRFWFRVUkVfMkRfQVJSQVksIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlLCBfZ2wuVEVYVFVSRTAgKyBzbG90ICk7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gc2V0VGV4dHVyZTNEKCB0ZXh0dXJlLCBzbG90ICkge1xyXG5cclxuXHRcdGNvbnN0IHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKTtcclxuXHJcblx0XHRpZiAoIHRleHR1cmUudmVyc2lvbiA+IDAgJiYgdGV4dHVyZVByb3BlcnRpZXMuX192ZXJzaW9uICE9PSB0ZXh0dXJlLnZlcnNpb24gKSB7XHJcblxyXG5cdFx0XHR1cGxvYWRUZXh0dXJlKCB0ZXh0dXJlUHJvcGVydGllcywgdGV4dHVyZSwgc2xvdCApO1xyXG5cdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHN0YXRlLmJpbmRUZXh0dXJlKCBfZ2wuVEVYVFVSRV8zRCwgdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUsIF9nbC5URVhUVVJFMCArIHNsb3QgKTtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBzZXRUZXh0dXJlQ3ViZSggdGV4dHVyZSwgc2xvdCApIHtcclxuXHJcblx0XHRjb25zdCB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0aWYgKCB0ZXh0dXJlLnZlcnNpb24gPiAwICYmIHRleHR1cmVQcm9wZXJ0aWVzLl9fdmVyc2lvbiAhPT0gdGV4dHVyZS52ZXJzaW9uICkge1xyXG5cclxuXHRcdFx0dXBsb2FkQ3ViZVRleHR1cmUoIHRleHR1cmVQcm9wZXJ0aWVzLCB0ZXh0dXJlLCBzbG90ICk7XHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0c3RhdGUuYmluZFRleHR1cmUoIF9nbC5URVhUVVJFX0NVQkVfTUFQLCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSwgX2dsLlRFWFRVUkUwICsgc2xvdCApO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvbnN0IHdyYXBwaW5nVG9HTCA9IHtcclxuXHRcdFsgUmVwZWF0V3JhcHBpbmcgXTogX2dsLlJFUEVBVCxcclxuXHRcdFsgQ2xhbXBUb0VkZ2VXcmFwcGluZyBdOiBfZ2wuQ0xBTVBfVE9fRURHRSxcclxuXHRcdFsgTWlycm9yZWRSZXBlYXRXcmFwcGluZyBdOiBfZ2wuTUlSUk9SRURfUkVQRUFUXHJcblx0fTtcclxuXHJcblx0Y29uc3QgZmlsdGVyVG9HTCA9IHtcclxuXHRcdFsgTmVhcmVzdEZpbHRlciBdOiBfZ2wuTkVBUkVTVCxcclxuXHRcdFsgTmVhcmVzdE1pcG1hcE5lYXJlc3RGaWx0ZXIgXTogX2dsLk5FQVJFU1RfTUlQTUFQX05FQVJFU1QsXHJcblx0XHRbIE5lYXJlc3RNaXBtYXBMaW5lYXJGaWx0ZXIgXTogX2dsLk5FQVJFU1RfTUlQTUFQX0xJTkVBUixcclxuXHJcblx0XHRbIExpbmVhckZpbHRlciBdOiBfZ2wuTElORUFSLFxyXG5cdFx0WyBMaW5lYXJNaXBtYXBOZWFyZXN0RmlsdGVyIF06IF9nbC5MSU5FQVJfTUlQTUFQX05FQVJFU1QsXHJcblx0XHRbIExpbmVhck1pcG1hcExpbmVhckZpbHRlciBdOiBfZ2wuTElORUFSX01JUE1BUF9MSU5FQVJcclxuXHR9O1xyXG5cclxuXHRjb25zdCBjb21wYXJlVG9HTCA9IHtcclxuXHRcdFsgTmV2ZXJDb21wYXJlIF06IF9nbC5ORVZFUixcclxuXHRcdFsgQWx3YXlzQ29tcGFyZSBdOiBfZ2wuQUxXQVlTLFxyXG5cdFx0WyBMZXNzQ29tcGFyZSBdOiBfZ2wuTEVTUyxcclxuXHRcdFsgTGVzc0VxdWFsQ29tcGFyZSBdOiBfZ2wuTEVRVUFMLFxyXG5cdFx0WyBFcXVhbENvbXBhcmUgXTogX2dsLkVRVUFMLFxyXG5cdFx0WyBHcmVhdGVyRXF1YWxDb21wYXJlIF06IF9nbC5HRVFVQUwsXHJcblx0XHRbIEdyZWF0ZXJDb21wYXJlIF06IF9nbC5HUkVBVEVSLFxyXG5cdFx0WyBOb3RFcXVhbENvbXBhcmUgXTogX2dsLk5PVEVRVUFMXHJcblx0fTtcclxuXHJcblx0ZnVuY3Rpb24gc2V0VGV4dHVyZVBhcmFtZXRlcnMoIHRleHR1cmVUeXBlLCB0ZXh0dXJlICkge1xyXG5cclxuXHRcdGlmICggdGV4dHVyZS50eXBlID09PSBGbG9hdFR5cGUgJiYgZXh0ZW5zaW9ucy5oYXMoICdPRVNfdGV4dHVyZV9mbG9hdF9saW5lYXInICkgPT09IGZhbHNlICYmXHJcblx0XHRcdCggdGV4dHVyZS5tYWdGaWx0ZXIgPT09IExpbmVhckZpbHRlciB8fCB0ZXh0dXJlLm1hZ0ZpbHRlciA9PT0gTGluZWFyTWlwbWFwTmVhcmVzdEZpbHRlciB8fCB0ZXh0dXJlLm1hZ0ZpbHRlciA9PT0gTmVhcmVzdE1pcG1hcExpbmVhckZpbHRlciB8fCB0ZXh0dXJlLm1hZ0ZpbHRlciA9PT0gTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyIHx8XHJcblx0XHRcdHRleHR1cmUubWluRmlsdGVyID09PSBMaW5lYXJGaWx0ZXIgfHwgdGV4dHVyZS5taW5GaWx0ZXIgPT09IExpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXIgfHwgdGV4dHVyZS5taW5GaWx0ZXIgPT09IE5lYXJlc3RNaXBtYXBMaW5lYXJGaWx0ZXIgfHwgdGV4dHVyZS5taW5GaWx0ZXIgPT09IExpbmVhck1pcG1hcExpbmVhckZpbHRlciApICkge1xyXG5cclxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogVW5hYmxlIHRvIHVzZSBsaW5lYXIgZmlsdGVyaW5nIHdpdGggZmxvYXRpbmcgcG9pbnQgdGV4dHVyZXMuIE9FU190ZXh0dXJlX2Zsb2F0X2xpbmVhciBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgZGV2aWNlLicgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0X2dsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCBfZ2wuVEVYVFVSRV9XUkFQX1MsIHdyYXBwaW5nVG9HTFsgdGV4dHVyZS53cmFwUyBdICk7XHJcblx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIF9nbC5URVhUVVJFX1dSQVBfVCwgd3JhcHBpbmdUb0dMWyB0ZXh0dXJlLndyYXBUIF0gKTtcclxuXHJcblx0XHRpZiAoIHRleHR1cmVUeXBlID09PSBfZ2wuVEVYVFVSRV8zRCB8fCB0ZXh0dXJlVHlwZSA9PT0gX2dsLlRFWFRVUkVfMkRfQVJSQVkgKSB7XHJcblxyXG5cdFx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIF9nbC5URVhUVVJFX1dSQVBfUiwgd3JhcHBpbmdUb0dMWyB0ZXh0dXJlLndyYXBSIF0gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0X2dsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCBfZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBmaWx0ZXJUb0dMWyB0ZXh0dXJlLm1hZ0ZpbHRlciBdICk7XHJcblx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIF9nbC5URVhUVVJFX01JTl9GSUxURVIsIGZpbHRlclRvR0xbIHRleHR1cmUubWluRmlsdGVyIF0gKTtcclxuXHJcblx0XHRpZiAoIHRleHR1cmUuY29tcGFyZUZ1bmN0aW9uICkge1xyXG5cclxuXHRcdFx0X2dsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCBfZ2wuVEVYVFVSRV9DT01QQVJFX01PREUsIF9nbC5DT01QQVJFX1JFRl9UT19URVhUVVJFICk7XHJcblx0XHRcdF9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgX2dsLlRFWFRVUkVfQ09NUEFSRV9GVU5DLCBjb21wYXJlVG9HTFsgdGV4dHVyZS5jb21wYXJlRnVuY3Rpb24gXSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGV4dGVuc2lvbnMuaGFzKCAnRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJyApID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0aWYgKCB0ZXh0dXJlLm1hZ0ZpbHRlciA9PT0gTmVhcmVzdEZpbHRlciApIHJldHVybjtcclxuXHRcdFx0aWYgKCB0ZXh0dXJlLm1pbkZpbHRlciAhPT0gTmVhcmVzdE1pcG1hcExpbmVhckZpbHRlciAmJiB0ZXh0dXJlLm1pbkZpbHRlciAhPT0gTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyICkgcmV0dXJuO1xyXG5cdFx0XHRpZiAoIHRleHR1cmUudHlwZSA9PT0gRmxvYXRUeXBlICYmIGV4dGVuc2lvbnMuaGFzKCAnT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyJyApID09PSBmYWxzZSApIHJldHVybjsgLy8gdmVyaWZ5IGV4dGVuc2lvblxyXG5cclxuXHRcdFx0aWYgKCB0ZXh0dXJlLmFuaXNvdHJvcHkgPiAxIHx8IHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICkuX19jdXJyZW50QW5pc290cm9weSApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnICk7XHJcblx0XHRcdFx0X2dsLnRleFBhcmFtZXRlcmYoIHRleHR1cmVUeXBlLCBleHRlbnNpb24uVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQsIE1hdGgubWluKCB0ZXh0dXJlLmFuaXNvdHJvcHksIGNhcGFiaWxpdGllcy5nZXRNYXhBbmlzb3Ryb3B5KCkgKSApO1xyXG5cdFx0XHRcdHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICkuX19jdXJyZW50QW5pc290cm9weSA9IHRleHR1cmUuYW5pc290cm9weTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gaW5pdFRleHR1cmUoIHRleHR1cmVQcm9wZXJ0aWVzLCB0ZXh0dXJlICkge1xyXG5cclxuXHRcdGxldCBmb3JjZVVwbG9hZCA9IGZhbHNlO1xyXG5cclxuXHRcdGlmICggdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbEluaXQgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xJbml0ID0gdHJ1ZTtcclxuXHJcblx0XHRcdHRleHR1cmUuYWRkRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvblRleHR1cmVEaXNwb3NlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGNyZWF0ZSBTb3VyY2UgPC0+IFdlYkdMVGV4dHVyZXMgbWFwcGluZyBpZiBuZWNlc3NhcnlcclxuXHJcblx0XHRjb25zdCBzb3VyY2UgPSB0ZXh0dXJlLnNvdXJjZTtcclxuXHRcdGxldCB3ZWJnbFRleHR1cmVzID0gX3NvdXJjZXMuZ2V0KCBzb3VyY2UgKTtcclxuXHJcblx0XHRpZiAoIHdlYmdsVGV4dHVyZXMgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHdlYmdsVGV4dHVyZXMgPSB7fTtcclxuXHRcdFx0X3NvdXJjZXMuc2V0KCBzb3VyY2UsIHdlYmdsVGV4dHVyZXMgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gY2hlY2sgaWYgdGhlcmUgaXMgYWxyZWFkeSBhIFdlYkdMVGV4dHVyZSBvYmplY3QgZm9yIHRoZSBnaXZlbiB0ZXh0dXJlIHBhcmFtZXRlcnNcclxuXHJcblx0XHRjb25zdCB0ZXh0dXJlQ2FjaGVLZXkgPSBnZXRUZXh0dXJlQ2FjaGVLZXkoIHRleHR1cmUgKTtcclxuXHJcblx0XHRpZiAoIHRleHR1cmVDYWNoZUtleSAhPT0gdGV4dHVyZVByb3BlcnRpZXMuX19jYWNoZUtleSApIHtcclxuXHJcblx0XHRcdC8vIGlmIG5vdCwgY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIFdlYkdMVGV4dHVyZVxyXG5cclxuXHRcdFx0aWYgKCB3ZWJnbFRleHR1cmVzWyB0ZXh0dXJlQ2FjaGVLZXkgXSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHQvLyBjcmVhdGUgbmV3IGVudHJ5XHJcblxyXG5cdFx0XHRcdHdlYmdsVGV4dHVyZXNbIHRleHR1cmVDYWNoZUtleSBdID0ge1xyXG5cdFx0XHRcdFx0dGV4dHVyZTogX2dsLmNyZWF0ZVRleHR1cmUoKSxcclxuXHRcdFx0XHRcdHVzZWRUaW1lczogMFxyXG5cdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdGluZm8ubWVtb3J5LnRleHR1cmVzICsrO1xyXG5cclxuXHRcdFx0XHQvLyB3aGVuIGEgbmV3IGluc3RhbmNlIG9mIFdlYkdMVGV4dHVyZSB3YXMgY3JlYXRlZCwgYSB0ZXh0dXJlIHVwbG9hZCBpcyByZXF1aXJlZFxyXG5cdFx0XHRcdC8vIGV2ZW4gaWYgdGhlIGltYWdlIGNvbnRlbnRzIGFyZSBpZGVudGljYWxcclxuXHJcblx0XHRcdFx0Zm9yY2VVcGxvYWQgPSB0cnVlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0d2ViZ2xUZXh0dXJlc1sgdGV4dHVyZUNhY2hlS2V5IF0udXNlZFRpbWVzICsrO1xyXG5cclxuXHRcdFx0Ly8gZXZlcnkgdGltZSB0aGUgdGV4dHVyZSBjYWNoZSBrZXkgY2hhbmdlcywgaXQncyBuZWNlc3NhcnkgdG8gY2hlY2sgaWYgYW4gaW5zdGFuY2Ugb2ZcclxuXHRcdFx0Ly8gV2ViR0xUZXh0dXJlIGNhbiBiZSBkZWxldGVkIGluIG9yZGVyIHRvIGF2b2lkIGEgbWVtb3J5IGxlYWsuXHJcblxyXG5cdFx0XHRjb25zdCB3ZWJnbFRleHR1cmUgPSB3ZWJnbFRleHR1cmVzWyB0ZXh0dXJlUHJvcGVydGllcy5fX2NhY2hlS2V5IF07XHJcblxyXG5cdFx0XHRpZiAoIHdlYmdsVGV4dHVyZSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHR3ZWJnbFRleHR1cmVzWyB0ZXh0dXJlUHJvcGVydGllcy5fX2NhY2hlS2V5IF0udXNlZFRpbWVzIC0tO1xyXG5cclxuXHRcdFx0XHRpZiAoIHdlYmdsVGV4dHVyZS51c2VkVGltZXMgPT09IDAgKSB7XHJcblxyXG5cdFx0XHRcdFx0ZGVsZXRlVGV4dHVyZSggdGV4dHVyZSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBzdG9yZSByZWZlcmVuY2VzIHRvIGNhY2hlIGtleSBhbmQgV2ViR0xUZXh0dXJlIG9iamVjdFxyXG5cclxuXHRcdFx0dGV4dHVyZVByb3BlcnRpZXMuX19jYWNoZUtleSA9IHRleHR1cmVDYWNoZUtleTtcclxuXHRcdFx0dGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgPSB3ZWJnbFRleHR1cmVzWyB0ZXh0dXJlQ2FjaGVLZXkgXS50ZXh0dXJlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZm9yY2VVcGxvYWQ7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gdXBsb2FkVGV4dHVyZSggdGV4dHVyZVByb3BlcnRpZXMsIHRleHR1cmUsIHNsb3QgKSB7XHJcblxyXG5cdFx0bGV0IHRleHR1cmVUeXBlID0gX2dsLlRFWFRVUkVfMkQ7XHJcblxyXG5cdFx0aWYgKCB0ZXh0dXJlLmlzRGF0YUFycmF5VGV4dHVyZSB8fCB0ZXh0dXJlLmlzQ29tcHJlc3NlZEFycmF5VGV4dHVyZSApIHRleHR1cmVUeXBlID0gX2dsLlRFWFRVUkVfMkRfQVJSQVk7XHJcblx0XHRpZiAoIHRleHR1cmUuaXNEYXRhM0RUZXh0dXJlICkgdGV4dHVyZVR5cGUgPSBfZ2wuVEVYVFVSRV8zRDtcclxuXHJcblx0XHRjb25zdCBmb3JjZVVwbG9hZCA9IGluaXRUZXh0dXJlKCB0ZXh0dXJlUHJvcGVydGllcywgdGV4dHVyZSApO1xyXG5cdFx0Y29uc3Qgc291cmNlID0gdGV4dHVyZS5zb3VyY2U7XHJcblxyXG5cdFx0c3RhdGUuYmluZFRleHR1cmUoIHRleHR1cmVUeXBlLCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSwgX2dsLlRFWFRVUkUwICsgc2xvdCApO1xyXG5cclxuXHRcdGNvbnN0IHNvdXJjZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggc291cmNlICk7XHJcblxyXG5cdFx0aWYgKCBzb3VyY2UudmVyc2lvbiAhPT0gc291cmNlUHJvcGVydGllcy5fX3ZlcnNpb24gfHwgZm9yY2VVcGxvYWQgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRzdGF0ZS5hY3RpdmVUZXh0dXJlKCBfZ2wuVEVYVFVSRTAgKyBzbG90ICk7XHJcblxyXG5cdFx0XHRjb25zdCB3b3JraW5nUHJpbWFyaWVzID0gQ29sb3JNYW5hZ2VtZW50LmdldFByaW1hcmllcyggQ29sb3JNYW5hZ2VtZW50LndvcmtpbmdDb2xvclNwYWNlICk7XHJcblx0XHRcdGNvbnN0IHRleHR1cmVQcmltYXJpZXMgPSB0ZXh0dXJlLmNvbG9yU3BhY2UgPT09IE5vQ29sb3JTcGFjZSA/IG51bGwgOiBDb2xvck1hbmFnZW1lbnQuZ2V0UHJpbWFyaWVzKCB0ZXh0dXJlLmNvbG9yU3BhY2UgKTtcclxuXHRcdFx0Y29uc3QgdW5wYWNrQ29udmVyc2lvbiA9IHRleHR1cmUuY29sb3JTcGFjZSA9PT0gTm9Db2xvclNwYWNlIHx8IHdvcmtpbmdQcmltYXJpZXMgPT09IHRleHR1cmVQcmltYXJpZXMgPyBfZ2wuTk9ORSA6IF9nbC5CUk9XU0VSX0RFRkFVTFRfV0VCR0w7XHJcblxyXG5cdFx0XHRfZ2wucGl4ZWxTdG9yZWkoIF9nbC5VTlBBQ0tfRkxJUF9ZX1dFQkdMLCB0ZXh0dXJlLmZsaXBZICk7XHJcblx0XHRcdF9nbC5waXhlbFN0b3JlaSggX2dsLlVOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTCwgdGV4dHVyZS5wcmVtdWx0aXBseUFscGhhICk7XHJcblx0XHRcdF9nbC5waXhlbFN0b3JlaSggX2dsLlVOUEFDS19BTElHTk1FTlQsIHRleHR1cmUudW5wYWNrQWxpZ25tZW50ICk7XHJcblx0XHRcdF9nbC5waXhlbFN0b3JlaSggX2dsLlVOUEFDS19DT0xPUlNQQUNFX0NPTlZFUlNJT05fV0VCR0wsIHVucGFja0NvbnZlcnNpb24gKTtcclxuXHJcblx0XHRcdGxldCBpbWFnZSA9IHJlc2l6ZUltYWdlKCB0ZXh0dXJlLmltYWdlLCBmYWxzZSwgY2FwYWJpbGl0aWVzLm1heFRleHR1cmVTaXplICk7XHJcblx0XHRcdGltYWdlID0gdmVyaWZ5Q29sb3JTcGFjZSggdGV4dHVyZSwgaW1hZ2UgKTtcclxuXHJcblx0XHRcdGNvbnN0IGdsRm9ybWF0ID0gdXRpbHMuY29udmVydCggdGV4dHVyZS5mb3JtYXQsIHRleHR1cmUuY29sb3JTcGFjZSApO1xyXG5cclxuXHRcdFx0Y29uc3QgZ2xUeXBlID0gdXRpbHMuY29udmVydCggdGV4dHVyZS50eXBlICk7XHJcblx0XHRcdGxldCBnbEludGVybmFsRm9ybWF0ID0gZ2V0SW50ZXJuYWxGb3JtYXQoIHRleHR1cmUuaW50ZXJuYWxGb3JtYXQsIGdsRm9ybWF0LCBnbFR5cGUsIHRleHR1cmUuY29sb3JTcGFjZSwgdGV4dHVyZS5pc1ZpZGVvVGV4dHVyZSApO1xyXG5cclxuXHRcdFx0c2V0VGV4dHVyZVBhcmFtZXRlcnMoIHRleHR1cmVUeXBlLCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0XHRsZXQgbWlwbWFwO1xyXG5cdFx0XHRjb25zdCBtaXBtYXBzID0gdGV4dHVyZS5taXBtYXBzO1xyXG5cclxuXHRcdFx0Y29uc3QgdXNlVGV4U3RvcmFnZSA9ICggdGV4dHVyZS5pc1ZpZGVvVGV4dHVyZSAhPT0gdHJ1ZSApO1xyXG5cdFx0XHRjb25zdCBhbGxvY2F0ZU1lbW9yeSA9ICggc291cmNlUHJvcGVydGllcy5fX3ZlcnNpb24gPT09IHVuZGVmaW5lZCApIHx8ICggZm9yY2VVcGxvYWQgPT09IHRydWUgKTtcclxuXHRcdFx0Y29uc3QgZGF0YVJlYWR5ID0gc291cmNlLmRhdGFSZWFkeTtcclxuXHRcdFx0Y29uc3QgbGV2ZWxzID0gZ2V0TWlwTGV2ZWxzKCB0ZXh0dXJlLCBpbWFnZSApO1xyXG5cclxuXHRcdFx0aWYgKCB0ZXh0dXJlLmlzRGVwdGhUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0XHRnbEludGVybmFsRm9ybWF0ID0gZ2V0SW50ZXJuYWxEZXB0aEZvcm1hdCggdGV4dHVyZS5mb3JtYXQgPT09IERlcHRoU3RlbmNpbEZvcm1hdCwgdGV4dHVyZS50eXBlICk7XHJcblxyXG5cdFx0XHRcdC8vXHJcblxyXG5cdFx0XHRcdGlmICggYWxsb2NhdGVNZW1vcnkgKSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCB1c2VUZXhTdG9yYWdlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0c3RhdGUudGV4U3RvcmFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgMSwgZ2xJbnRlcm5hbEZvcm1hdCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCApO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgMCwgZ2xJbnRlcm5hbEZvcm1hdCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgbnVsbCApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggdGV4dHVyZS5pc0RhdGFUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0XHQvLyB1c2UgbWFudWFsbHkgY3JlYXRlZCBtaXBtYXBzIGlmIGF2YWlsYWJsZVxyXG5cdFx0XHRcdC8vIGlmIHRoZXJlIGFyZSBubyBtYW51YWwgbWlwbWFwc1xyXG5cdFx0XHRcdC8vIHNldCAwIGxldmVsIG1pcG1hcCBhbmQgdGhlbiB1c2UgR0wgdG8gZ2VuZXJhdGUgb3RoZXIgbWlwbWFwIGxldmVsc1xyXG5cclxuXHRcdFx0XHRpZiAoIG1pcG1hcHMubGVuZ3RoID4gMCApIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIHVzZVRleFN0b3JhZ2UgJiYgYWxsb2NhdGVNZW1vcnkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRzdGF0ZS50ZXhTdG9yYWdlMkQoIF9nbC5URVhUVVJFXzJELCBsZXZlbHMsIGdsSW50ZXJuYWxGb3JtYXQsIG1pcG1hcHNbIDAgXS53aWR0aCwgbWlwbWFwc1sgMCBdLmhlaWdodCApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gbWlwbWFwcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRcdG1pcG1hcCA9IG1pcG1hcHNbIGkgXTtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggdXNlVGV4U3RvcmFnZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKCBkYXRhUmVhZHkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0c3RhdGUudGV4U3ViSW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIGksIDAsIDAsIG1pcG1hcC53aWR0aCwgbWlwbWFwLmhlaWdodCwgZ2xGb3JtYXQsIGdsVHlwZSwgbWlwbWFwLmRhdGEgKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0c3RhdGUudGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIGksIGdsSW50ZXJuYWxGb3JtYXQsIG1pcG1hcC53aWR0aCwgbWlwbWFwLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgbWlwbWFwLmRhdGEgKTtcclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0dGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIHVzZVRleFN0b3JhZ2UgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIGFsbG9jYXRlTWVtb3J5ICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRzdGF0ZS50ZXhTdG9yYWdlMkQoIF9nbC5URVhUVVJFXzJELCBsZXZlbHMsIGdsSW50ZXJuYWxGb3JtYXQsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQgKTtcclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdGlmICggZGF0YVJlYWR5ICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRzdGF0ZS50ZXhTdWJJbWFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgMCwgMCwgMCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCwgZ2xGb3JtYXQsIGdsVHlwZSwgaW1hZ2UuZGF0YSApO1xyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgMCwgZ2xJbnRlcm5hbEZvcm1hdCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgaW1hZ2UuZGF0YSApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggdGV4dHVyZS5pc0NvbXByZXNzZWRUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIHRleHR1cmUuaXNDb21wcmVzc2VkQXJyYXlUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0XHRcdGlmICggdXNlVGV4U3RvcmFnZSAmJiBhbGxvY2F0ZU1lbW9yeSApIHtcclxuXHJcblx0XHRcdFx0XHRcdHN0YXRlLnRleFN0b3JhZ2UzRCggX2dsLlRFWFRVUkVfMkRfQVJSQVksIGxldmVscywgZ2xJbnRlcm5hbEZvcm1hdCwgbWlwbWFwc1sgMCBdLndpZHRoLCBtaXBtYXBzWyAwIF0uaGVpZ2h0LCBpbWFnZS5kZXB0aCApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gbWlwbWFwcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRcdG1pcG1hcCA9IG1pcG1hcHNbIGkgXTtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggdGV4dHVyZS5mb3JtYXQgIT09IFJHQkFGb3JtYXQgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmICggZ2xGb3JtYXQgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCB1c2VUZXhTdG9yYWdlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBkYXRhUmVhZHkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICggdGV4dHVyZS5sYXllclVwZGF0ZXMuc2l6ZSA+IDAgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgbGF5ZXJCeXRlTGVuZ3RoID0gZ2V0Qnl0ZUxlbmd0aCggbWlwbWFwLndpZHRoLCBtaXBtYXAuaGVpZ2h0LCB0ZXh0dXJlLmZvcm1hdCwgdGV4dHVyZS50eXBlICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yICggY29uc3QgbGF5ZXJJbmRleCBvZiB0ZXh0dXJlLmxheWVyVXBkYXRlcyApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGxheWVyRGF0YSA9IG1pcG1hcC5kYXRhLnN1YmFycmF5KFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGxheWVySW5kZXggKiBsYXllckJ5dGVMZW5ndGggLyBtaXBtYXAuZGF0YS5CWVRFU19QRVJfRUxFTUVOVCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQoIGxheWVySW5kZXggKyAxICkgKiBsYXllckJ5dGVMZW5ndGggLyBtaXBtYXAuZGF0YS5CWVRFU19QRVJfRUxFTUVOVFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzdGF0ZS5jb21wcmVzc2VkVGV4U3ViSW1hZ2UzRCggX2dsLlRFWFRVUkVfMkRfQVJSQVksIGksIDAsIDAsIGxheWVySW5kZXgsIG1pcG1hcC53aWR0aCwgbWlwbWFwLmhlaWdodCwgMSwgZ2xGb3JtYXQsIGxheWVyRGF0YSApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0ZXh0dXJlLmNsZWFyTGF5ZXJVcGRhdGVzKCk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0c3RhdGUuY29tcHJlc3NlZFRleFN1YkltYWdlM0QoIF9nbC5URVhUVVJFXzJEX0FSUkFZLCBpLCAwLCAwLCAwLCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIGltYWdlLmRlcHRoLCBnbEZvcm1hdCwgbWlwbWFwLmRhdGEgKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRzdGF0ZS5jb21wcmVzc2VkVGV4SW1hZ2UzRCggX2dsLlRFWFRVUkVfMkRfQVJSQVksIGksIGdsSW50ZXJuYWxGb3JtYXQsIG1pcG1hcC53aWR0aCwgbWlwbWFwLmhlaWdodCwgaW1hZ2UuZGVwdGgsIDAsIG1pcG1hcC5kYXRhLCAwLCAwICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IEF0dGVtcHQgdG8gbG9hZCB1bnN1cHBvcnRlZCBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0IGluIC51cGxvYWRUZXh0dXJlKCknICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmICggdXNlVGV4U3RvcmFnZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoIGRhdGFSZWFkeSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdHN0YXRlLnRleFN1YkltYWdlM0QoIF9nbC5URVhUVVJFXzJEX0FSUkFZLCBpLCAwLCAwLCAwLCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIGltYWdlLmRlcHRoLCBnbEZvcm1hdCwgZ2xUeXBlLCBtaXBtYXAuZGF0YSApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRzdGF0ZS50ZXhJbWFnZTNEKCBfZ2wuVEVYVFVSRV8yRF9BUlJBWSwgaSwgZ2xJbnRlcm5hbEZvcm1hdCwgbWlwbWFwLndpZHRoLCBtaXBtYXAuaGVpZ2h0LCBpbWFnZS5kZXB0aCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgbWlwbWFwLmRhdGEgKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIHVzZVRleFN0b3JhZ2UgJiYgYWxsb2NhdGVNZW1vcnkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRzdGF0ZS50ZXhTdG9yYWdlMkQoIF9nbC5URVhUVVJFXzJELCBsZXZlbHMsIGdsSW50ZXJuYWxGb3JtYXQsIG1pcG1hcHNbIDAgXS53aWR0aCwgbWlwbWFwc1sgMCBdLmhlaWdodCApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gbWlwbWFwcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRcdG1pcG1hcCA9IG1pcG1hcHNbIGkgXTtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggdGV4dHVyZS5mb3JtYXQgIT09IFJHQkFGb3JtYXQgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmICggZ2xGb3JtYXQgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCB1c2VUZXhTdG9yYWdlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBkYXRhUmVhZHkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHN0YXRlLmNvbXByZXNzZWRUZXhTdWJJbWFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgaSwgMCwgMCwgbWlwbWFwLndpZHRoLCBtaXBtYXAuaGVpZ2h0LCBnbEZvcm1hdCwgbWlwbWFwLmRhdGEgKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0c3RhdGUuY29tcHJlc3NlZFRleEltYWdlMkQoIF9nbC5URVhUVVJFXzJELCBpLCBnbEludGVybmFsRm9ybWF0LCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIDAsIG1pcG1hcC5kYXRhICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IEF0dGVtcHQgdG8gbG9hZCB1bnN1cHBvcnRlZCBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0IGluIC51cGxvYWRUZXh0dXJlKCknICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmICggdXNlVGV4U3RvcmFnZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoIGRhdGFSZWFkeSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdHN0YXRlLnRleFN1YkltYWdlMkQoIF9nbC5URVhUVVJFXzJELCBpLCAwLCAwLCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIGdsRm9ybWF0LCBnbFR5cGUsIG1pcG1hcC5kYXRhICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFXzJELCBpLCBnbEludGVybmFsRm9ybWF0LCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIG1pcG1hcC5kYXRhICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIHRleHR1cmUuaXNEYXRhQXJyYXlUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIHVzZVRleFN0b3JhZ2UgKSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBhbGxvY2F0ZU1lbW9yeSApIHtcclxuXHJcblx0XHRcdFx0XHRcdHN0YXRlLnRleFN0b3JhZ2UzRCggX2dsLlRFWFRVUkVfMkRfQVJSQVksIGxldmVscywgZ2xJbnRlcm5hbEZvcm1hdCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCwgaW1hZ2UuZGVwdGggKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBkYXRhUmVhZHkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIHRleHR1cmUubGF5ZXJVcGRhdGVzLnNpemUgPiAwICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRjb25zdCBsYXllckJ5dGVMZW5ndGggPSBnZXRCeXRlTGVuZ3RoKCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0LCB0ZXh0dXJlLmZvcm1hdCwgdGV4dHVyZS50eXBlICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGZvciAoIGNvbnN0IGxheWVySW5kZXggb2YgdGV4dHVyZS5sYXllclVwZGF0ZXMgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgbGF5ZXJEYXRhID0gaW1hZ2UuZGF0YS5zdWJhcnJheShcclxuXHRcdFx0XHRcdFx0XHRcdFx0bGF5ZXJJbmRleCAqIGxheWVyQnl0ZUxlbmd0aCAvIGltYWdlLmRhdGEuQllURVNfUEVSX0VMRU1FTlQsXHJcblx0XHRcdFx0XHRcdFx0XHRcdCggbGF5ZXJJbmRleCArIDEgKSAqIGxheWVyQnl0ZUxlbmd0aCAvIGltYWdlLmRhdGEuQllURVNfUEVSX0VMRU1FTlRcclxuXHRcdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdFx0XHRzdGF0ZS50ZXhTdWJJbWFnZTNEKCBfZ2wuVEVYVFVSRV8yRF9BUlJBWSwgMCwgMCwgMCwgbGF5ZXJJbmRleCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCwgMSwgZ2xGb3JtYXQsIGdsVHlwZSwgbGF5ZXJEYXRhICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0dGV4dHVyZS5jbGVhckxheWVyVXBkYXRlcygpO1xyXG5cclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0c3RhdGUudGV4U3ViSW1hZ2UzRCggX2dsLlRFWFRVUkVfMkRfQVJSQVksIDAsIDAsIDAsIDAsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQsIGltYWdlLmRlcHRoLCBnbEZvcm1hdCwgZ2xUeXBlLCBpbWFnZS5kYXRhICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdHN0YXRlLnRleEltYWdlM0QoIF9nbC5URVhUVVJFXzJEX0FSUkFZLCAwLCBnbEludGVybmFsRm9ybWF0LCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0LCBpbWFnZS5kZXB0aCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgaW1hZ2UuZGF0YSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCB0ZXh0dXJlLmlzRGF0YTNEVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0aWYgKCB1c2VUZXhTdG9yYWdlICkge1xyXG5cclxuXHRcdFx0XHRcdGlmICggYWxsb2NhdGVNZW1vcnkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRzdGF0ZS50ZXhTdG9yYWdlM0QoIF9nbC5URVhUVVJFXzNELCBsZXZlbHMsIGdsSW50ZXJuYWxGb3JtYXQsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQsIGltYWdlLmRlcHRoICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGlmICggZGF0YVJlYWR5ICkge1xyXG5cclxuXHRcdFx0XHRcdFx0c3RhdGUudGV4U3ViSW1hZ2UzRCggX2dsLlRFWFRVUkVfM0QsIDAsIDAsIDAsIDAsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQsIGltYWdlLmRlcHRoLCBnbEZvcm1hdCwgZ2xUeXBlLCBpbWFnZS5kYXRhICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdHN0YXRlLnRleEltYWdlM0QoIF9nbC5URVhUVVJFXzNELCAwLCBnbEludGVybmFsRm9ybWF0LCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0LCBpbWFnZS5kZXB0aCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgaW1hZ2UuZGF0YSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCB0ZXh0dXJlLmlzRnJhbWVidWZmZXJUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIGFsbG9jYXRlTWVtb3J5ICkge1xyXG5cclxuXHRcdFx0XHRcdGlmICggdXNlVGV4U3RvcmFnZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdHN0YXRlLnRleFN0b3JhZ2UyRCggX2dsLlRFWFRVUkVfMkQsIGxldmVscywgZ2xJbnRlcm5hbEZvcm1hdCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCApO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRsZXQgd2lkdGggPSBpbWFnZS53aWR0aCwgaGVpZ2h0ID0gaW1hZ2UuaGVpZ2h0O1xyXG5cclxuXHRcdFx0XHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgbGV2ZWxzOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgaSwgZ2xJbnRlcm5hbEZvcm1hdCwgd2lkdGgsIGhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgbnVsbCApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHR3aWR0aCA+Pj0gMTtcclxuXHRcdFx0XHRcdFx0XHRoZWlnaHQgPj49IDE7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHQvLyByZWd1bGFyIFRleHR1cmUgKGltYWdlLCB2aWRlbywgY2FudmFzKVxyXG5cclxuXHRcdFx0XHQvLyB1c2UgbWFudWFsbHkgY3JlYXRlZCBtaXBtYXBzIGlmIGF2YWlsYWJsZVxyXG5cdFx0XHRcdC8vIGlmIHRoZXJlIGFyZSBubyBtYW51YWwgbWlwbWFwc1xyXG5cdFx0XHRcdC8vIHNldCAwIGxldmVsIG1pcG1hcCBhbmQgdGhlbiB1c2UgR0wgdG8gZ2VuZXJhdGUgb3RoZXIgbWlwbWFwIGxldmVsc1xyXG5cclxuXHRcdFx0XHRpZiAoIG1pcG1hcHMubGVuZ3RoID4gMCApIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIHVzZVRleFN0b3JhZ2UgJiYgYWxsb2NhdGVNZW1vcnkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCBkaW1lbnNpb25zID0gZ2V0RGltZW5zaW9ucyggbWlwbWFwc1sgMCBdICk7XHJcblxyXG5cdFx0XHRcdFx0XHRzdGF0ZS50ZXhTdG9yYWdlMkQoIF9nbC5URVhUVVJFXzJELCBsZXZlbHMsIGdsSW50ZXJuYWxGb3JtYXQsIGRpbWVuc2lvbnMud2lkdGgsIGRpbWVuc2lvbnMuaGVpZ2h0ICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBtaXBtYXBzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdFx0bWlwbWFwID0gbWlwbWFwc1sgaSBdO1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCB1c2VUZXhTdG9yYWdlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoIGRhdGFSZWFkeSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRzdGF0ZS50ZXhTdWJJbWFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgaSwgMCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgbWlwbWFwICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFXzJELCBpLCBnbEludGVybmFsRm9ybWF0LCBnbEZvcm1hdCwgZ2xUeXBlLCBtaXBtYXAgKTtcclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0dGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIHVzZVRleFN0b3JhZ2UgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIGFsbG9jYXRlTWVtb3J5ICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRjb25zdCBkaW1lbnNpb25zID0gZ2V0RGltZW5zaW9ucyggaW1hZ2UgKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0c3RhdGUudGV4U3RvcmFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgbGV2ZWxzLCBnbEludGVybmFsRm9ybWF0LCBkaW1lbnNpb25zLndpZHRoLCBkaW1lbnNpb25zLmhlaWdodCApO1xyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCBkYXRhUmVhZHkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdHN0YXRlLnRleFN1YkltYWdlMkQoIF9nbC5URVhUVVJFXzJELCAwLCAwLCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBpbWFnZSApO1xyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgMCwgZ2xJbnRlcm5hbEZvcm1hdCwgZ2xGb3JtYXQsIGdsVHlwZSwgaW1hZ2UgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggdGV4dHVyZU5lZWRzR2VuZXJhdGVNaXBtYXBzKCB0ZXh0dXJlICkgKSB7XHJcblxyXG5cdFx0XHRcdGdlbmVyYXRlTWlwbWFwKCB0ZXh0dXJlVHlwZSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0c291cmNlUHJvcGVydGllcy5fX3ZlcnNpb24gPSBzb3VyY2UudmVyc2lvbjtcclxuXHJcblx0XHRcdGlmICggdGV4dHVyZS5vblVwZGF0ZSApIHRleHR1cmUub25VcGRhdGUoIHRleHR1cmUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGV4dHVyZVByb3BlcnRpZXMuX192ZXJzaW9uID0gdGV4dHVyZS52ZXJzaW9uO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHVwbG9hZEN1YmVUZXh0dXJlKCB0ZXh0dXJlUHJvcGVydGllcywgdGV4dHVyZSwgc2xvdCApIHtcclxuXHJcblx0XHRpZiAoIHRleHR1cmUuaW1hZ2UubGVuZ3RoICE9PSA2ICkgcmV0dXJuO1xyXG5cclxuXHRcdGNvbnN0IGZvcmNlVXBsb2FkID0gaW5pdFRleHR1cmUoIHRleHR1cmVQcm9wZXJ0aWVzLCB0ZXh0dXJlICk7XHJcblx0XHRjb25zdCBzb3VyY2UgPSB0ZXh0dXJlLnNvdXJjZTtcclxuXHJcblx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggX2dsLlRFWFRVUkVfQ1VCRV9NQVAsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlLCBfZ2wuVEVYVFVSRTAgKyBzbG90ICk7XHJcblxyXG5cdFx0Y29uc3Qgc291cmNlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCBzb3VyY2UgKTtcclxuXHJcblx0XHRpZiAoIHNvdXJjZS52ZXJzaW9uICE9PSBzb3VyY2VQcm9wZXJ0aWVzLl9fdmVyc2lvbiB8fCBmb3JjZVVwbG9hZCA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdHN0YXRlLmFjdGl2ZVRleHR1cmUoIF9nbC5URVhUVVJFMCArIHNsb3QgKTtcclxuXHJcblx0XHRcdGNvbnN0IHdvcmtpbmdQcmltYXJpZXMgPSBDb2xvck1hbmFnZW1lbnQuZ2V0UHJpbWFyaWVzKCBDb2xvck1hbmFnZW1lbnQud29ya2luZ0NvbG9yU3BhY2UgKTtcclxuXHRcdFx0Y29uc3QgdGV4dHVyZVByaW1hcmllcyA9IHRleHR1cmUuY29sb3JTcGFjZSA9PT0gTm9Db2xvclNwYWNlID8gbnVsbCA6IENvbG9yTWFuYWdlbWVudC5nZXRQcmltYXJpZXMoIHRleHR1cmUuY29sb3JTcGFjZSApO1xyXG5cdFx0XHRjb25zdCB1bnBhY2tDb252ZXJzaW9uID0gdGV4dHVyZS5jb2xvclNwYWNlID09PSBOb0NvbG9yU3BhY2UgfHwgd29ya2luZ1ByaW1hcmllcyA9PT0gdGV4dHVyZVByaW1hcmllcyA/IF9nbC5OT05FIDogX2dsLkJST1dTRVJfREVGQVVMVF9XRUJHTDtcclxuXHJcblx0XHRcdF9nbC5waXhlbFN0b3JlaSggX2dsLlVOUEFDS19GTElQX1lfV0VCR0wsIHRleHR1cmUuZmxpcFkgKTtcclxuXHRcdFx0X2dsLnBpeGVsU3RvcmVpKCBfZ2wuVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMLCB0ZXh0dXJlLnByZW11bHRpcGx5QWxwaGEgKTtcclxuXHRcdFx0X2dsLnBpeGVsU3RvcmVpKCBfZ2wuVU5QQUNLX0FMSUdOTUVOVCwgdGV4dHVyZS51bnBhY2tBbGlnbm1lbnQgKTtcclxuXHRcdFx0X2dsLnBpeGVsU3RvcmVpKCBfZ2wuVU5QQUNLX0NPTE9SU1BBQ0VfQ09OVkVSU0lPTl9XRUJHTCwgdW5wYWNrQ29udmVyc2lvbiApO1xyXG5cclxuXHRcdFx0Y29uc3QgaXNDb21wcmVzc2VkID0gKCB0ZXh0dXJlLmlzQ29tcHJlc3NlZFRleHR1cmUgfHwgdGV4dHVyZS5pbWFnZVsgMCBdLmlzQ29tcHJlc3NlZFRleHR1cmUgKTtcclxuXHRcdFx0Y29uc3QgaXNEYXRhVGV4dHVyZSA9ICggdGV4dHVyZS5pbWFnZVsgMCBdICYmIHRleHR1cmUuaW1hZ2VbIDAgXS5pc0RhdGFUZXh0dXJlICk7XHJcblxyXG5cdFx0XHRjb25zdCBjdWJlSW1hZ2UgPSBbXTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDY7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggISBpc0NvbXByZXNzZWQgJiYgISBpc0RhdGFUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0XHRcdGN1YmVJbWFnZVsgaSBdID0gcmVzaXplSW1hZ2UoIHRleHR1cmUuaW1hZ2VbIGkgXSwgdHJ1ZSwgY2FwYWJpbGl0aWVzLm1heEN1YmVtYXBTaXplICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0Y3ViZUltYWdlWyBpIF0gPSBpc0RhdGFUZXh0dXJlID8gdGV4dHVyZS5pbWFnZVsgaSBdLmltYWdlIDogdGV4dHVyZS5pbWFnZVsgaSBdO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGN1YmVJbWFnZVsgaSBdID0gdmVyaWZ5Q29sb3JTcGFjZSggdGV4dHVyZSwgY3ViZUltYWdlWyBpIF0gKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IGltYWdlID0gY3ViZUltYWdlWyAwIF0sXHJcblx0XHRcdFx0Z2xGb3JtYXQgPSB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLmZvcm1hdCwgdGV4dHVyZS5jb2xvclNwYWNlICksXHJcblx0XHRcdFx0Z2xUeXBlID0gdXRpbHMuY29udmVydCggdGV4dHVyZS50eXBlICksXHJcblx0XHRcdFx0Z2xJbnRlcm5hbEZvcm1hdCA9IGdldEludGVybmFsRm9ybWF0KCB0ZXh0dXJlLmludGVybmFsRm9ybWF0LCBnbEZvcm1hdCwgZ2xUeXBlLCB0ZXh0dXJlLmNvbG9yU3BhY2UgKTtcclxuXHJcblx0XHRcdGNvbnN0IHVzZVRleFN0b3JhZ2UgPSAoIHRleHR1cmUuaXNWaWRlb1RleHR1cmUgIT09IHRydWUgKTtcclxuXHRcdFx0Y29uc3QgYWxsb2NhdGVNZW1vcnkgPSAoIHNvdXJjZVByb3BlcnRpZXMuX192ZXJzaW9uID09PSB1bmRlZmluZWQgKSB8fCAoIGZvcmNlVXBsb2FkID09PSB0cnVlICk7XHJcblx0XHRcdGNvbnN0IGRhdGFSZWFkeSA9IHNvdXJjZS5kYXRhUmVhZHk7XHJcblx0XHRcdGxldCBsZXZlbHMgPSBnZXRNaXBMZXZlbHMoIHRleHR1cmUsIGltYWdlICk7XHJcblxyXG5cdFx0XHRzZXRUZXh0dXJlUGFyYW1ldGVycyggX2dsLlRFWFRVUkVfQ1VCRV9NQVAsIHRleHR1cmUgKTtcclxuXHJcblx0XHRcdGxldCBtaXBtYXBzO1xyXG5cclxuXHRcdFx0aWYgKCBpc0NvbXByZXNzZWQgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggdXNlVGV4U3RvcmFnZSAmJiBhbGxvY2F0ZU1lbW9yeSApIHtcclxuXHJcblx0XHRcdFx0XHRzdGF0ZS50ZXhTdG9yYWdlMkQoIF9nbC5URVhUVVJFX0NVQkVfTUFQLCBsZXZlbHMsIGdsSW50ZXJuYWxGb3JtYXQsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCA2OyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdG1pcG1hcHMgPSBjdWJlSW1hZ2VbIGkgXS5taXBtYXBzO1xyXG5cclxuXHRcdFx0XHRcdGZvciAoIGxldCBqID0gMDsgaiA8IG1pcG1hcHMubGVuZ3RoOyBqICsrICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgbWlwbWFwID0gbWlwbWFwc1sgaiBdO1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCB0ZXh0dXJlLmZvcm1hdCAhPT0gUkdCQUZvcm1hdCApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKCBnbEZvcm1hdCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoIHVzZVRleFN0b3JhZ2UgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGRhdGFSZWFkeSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0c3RhdGUuY29tcHJlc3NlZFRleFN1YkltYWdlMkQoIF9nbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBpLCBqLCAwLCAwLCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIGdsRm9ybWF0LCBtaXBtYXAuZGF0YSApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRzdGF0ZS5jb21wcmVzc2VkVGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCArIGksIGosIGdsSW50ZXJuYWxGb3JtYXQsIG1pcG1hcC53aWR0aCwgbWlwbWFwLmhlaWdodCwgMCwgbWlwbWFwLmRhdGEgKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogQXR0ZW1wdCB0byBsb2FkIHVuc3VwcG9ydGVkIGNvbXByZXNzZWQgdGV4dHVyZSBmb3JtYXQgaW4gLnNldFRleHR1cmVDdWJlKCknICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmICggdXNlVGV4U3RvcmFnZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoIGRhdGFSZWFkeSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdHN0YXRlLnRleFN1YkltYWdlMkQoIF9nbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBpLCBqLCAwLCAwLCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIGdsRm9ybWF0LCBnbFR5cGUsIG1pcG1hcC5kYXRhICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBpLCBqLCBnbEludGVybmFsRm9ybWF0LCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIG1pcG1hcC5kYXRhICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdG1pcG1hcHMgPSB0ZXh0dXJlLm1pcG1hcHM7XHJcblxyXG5cdFx0XHRcdGlmICggdXNlVGV4U3RvcmFnZSAmJiBhbGxvY2F0ZU1lbW9yeSApIHtcclxuXHJcblx0XHRcdFx0XHQvLyBUT0RPOiBVbmlmb3JtbHkgaGFuZGxlIG1pcG1hcCBkZWZpbml0aW9uc1xyXG5cdFx0XHRcdFx0Ly8gTm9ybWFsIHRleHR1cmVzIGFuZCBjb21wcmVzc2VkIGN1YmUgdGV4dHVyZXMgZGVmaW5lIGJhc2UgbGV2ZWwgKyBtaXBzIHdpdGggdGhlaXIgbWlwbWFwIGFycmF5XHJcblx0XHRcdFx0XHQvLyBVbmNvbXByZXNzZWQgY3ViZSB0ZXh0dXJlcyB1c2UgdGhlaXIgbWlwbWFwIGFycmF5IG9ubHkgZm9yIG1pcHMgKG5vIGJhc2UgbGV2ZWwpXHJcblxyXG5cdFx0XHRcdFx0aWYgKCBtaXBtYXBzLmxlbmd0aCA+IDAgKSBsZXZlbHMgKys7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgZGltZW5zaW9ucyA9IGdldERpbWVuc2lvbnMoIGN1YmVJbWFnZVsgMCBdICk7XHJcblxyXG5cdFx0XHRcdFx0c3RhdGUudGV4U3RvcmFnZTJEKCBfZ2wuVEVYVFVSRV9DVUJFX01BUCwgbGV2ZWxzLCBnbEludGVybmFsRm9ybWF0LCBkaW1lbnNpb25zLndpZHRoLCBkaW1lbnNpb25zLmhlaWdodCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDY7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBpc0RhdGFUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCB1c2VUZXhTdG9yYWdlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoIGRhdGFSZWFkeSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRzdGF0ZS50ZXhTdWJJbWFnZTJEKCBfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaSwgMCwgMCwgMCwgY3ViZUltYWdlWyBpIF0ud2lkdGgsIGN1YmVJbWFnZVsgaSBdLmhlaWdodCwgZ2xGb3JtYXQsIGdsVHlwZSwgY3ViZUltYWdlWyBpIF0uZGF0YSApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaSwgMCwgZ2xJbnRlcm5hbEZvcm1hdCwgY3ViZUltYWdlWyBpIF0ud2lkdGgsIGN1YmVJbWFnZVsgaSBdLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgY3ViZUltYWdlWyBpIF0uZGF0YSApO1xyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0Zm9yICggbGV0IGogPSAwOyBqIDwgbWlwbWFwcy5sZW5ndGg7IGogKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IG1pcG1hcCA9IG1pcG1hcHNbIGogXTtcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBtaXBtYXBJbWFnZSA9IG1pcG1hcC5pbWFnZVsgaSBdLmltYWdlO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoIHVzZVRleFN0b3JhZ2UgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBkYXRhUmVhZHkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRzdGF0ZS50ZXhTdWJJbWFnZTJEKCBfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaSwgaiArIDEsIDAsIDAsIG1pcG1hcEltYWdlLndpZHRoLCBtaXBtYXBJbWFnZS5oZWlnaHQsIGdsRm9ybWF0LCBnbFR5cGUsIG1pcG1hcEltYWdlLmRhdGEgKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0c3RhdGUudGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCArIGksIGogKyAxLCBnbEludGVybmFsRm9ybWF0LCBtaXBtYXBJbWFnZS53aWR0aCwgbWlwbWFwSW1hZ2UuaGVpZ2h0LCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBtaXBtYXBJbWFnZS5kYXRhICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCB1c2VUZXhTdG9yYWdlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoIGRhdGFSZWFkeSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRzdGF0ZS50ZXhTdWJJbWFnZTJEKCBfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaSwgMCwgMCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgY3ViZUltYWdlWyBpIF0gKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0c3RhdGUudGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCArIGksIDAsIGdsSW50ZXJuYWxGb3JtYXQsIGdsRm9ybWF0LCBnbFR5cGUsIGN1YmVJbWFnZVsgaSBdICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRmb3IgKCBsZXQgaiA9IDA7IGogPCBtaXBtYXBzLmxlbmd0aDsgaiArKyApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgbWlwbWFwID0gbWlwbWFwc1sgaiBdO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoIHVzZVRleFN0b3JhZ2UgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBkYXRhUmVhZHkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRzdGF0ZS50ZXhTdWJJbWFnZTJEKCBfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaSwgaiArIDEsIDAsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIG1pcG1hcC5pbWFnZVsgaSBdICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBpLCBqICsgMSwgZ2xJbnRlcm5hbEZvcm1hdCwgZ2xGb3JtYXQsIGdsVHlwZSwgbWlwbWFwLmltYWdlWyBpIF0gKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCB0ZXh0dXJlTmVlZHNHZW5lcmF0ZU1pcG1hcHMoIHRleHR1cmUgKSApIHtcclxuXHJcblx0XHRcdFx0Ly8gV2UgYXNzdW1lIGltYWdlcyBmb3IgY3ViZSBtYXAgaGF2ZSB0aGUgc2FtZSBzaXplLlxyXG5cdFx0XHRcdGdlbmVyYXRlTWlwbWFwKCBfZ2wuVEVYVFVSRV9DVUJFX01BUCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0c291cmNlUHJvcGVydGllcy5fX3ZlcnNpb24gPSBzb3VyY2UudmVyc2lvbjtcclxuXHJcblx0XHRcdGlmICggdGV4dHVyZS5vblVwZGF0ZSApIHRleHR1cmUub25VcGRhdGUoIHRleHR1cmUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGV4dHVyZVByb3BlcnRpZXMuX192ZXJzaW9uID0gdGV4dHVyZS52ZXJzaW9uO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vIFJlbmRlciB0YXJnZXRzXHJcblxyXG5cdC8vIFNldHVwIHN0b3JhZ2UgZm9yIHRhcmdldCB0ZXh0dXJlIGFuZCBiaW5kIGl0IHRvIGNvcnJlY3QgZnJhbWVidWZmZXJcclxuXHRmdW5jdGlvbiBzZXR1cEZyYW1lQnVmZmVyVGV4dHVyZSggZnJhbWVidWZmZXIsIHJlbmRlclRhcmdldCwgdGV4dHVyZSwgYXR0YWNobWVudCwgdGV4dHVyZVRhcmdldCwgbGV2ZWwgKSB7XHJcblxyXG5cdFx0Y29uc3QgZ2xGb3JtYXQgPSB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLmZvcm1hdCwgdGV4dHVyZS5jb2xvclNwYWNlICk7XHJcblx0XHRjb25zdCBnbFR5cGUgPSB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLnR5cGUgKTtcclxuXHRcdGNvbnN0IGdsSW50ZXJuYWxGb3JtYXQgPSBnZXRJbnRlcm5hbEZvcm1hdCggdGV4dHVyZS5pbnRlcm5hbEZvcm1hdCwgZ2xGb3JtYXQsIGdsVHlwZSwgdGV4dHVyZS5jb2xvclNwYWNlICk7XHJcblx0XHRjb25zdCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCApO1xyXG5cdFx0Y29uc3QgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggdGV4dHVyZSApO1xyXG5cclxuXHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fcmVuZGVyVGFyZ2V0ID0gcmVuZGVyVGFyZ2V0O1xyXG5cclxuXHRcdGlmICggISByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9faGFzRXh0ZXJuYWxUZXh0dXJlcyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHdpZHRoID0gTWF0aC5tYXgoIDEsIHJlbmRlclRhcmdldC53aWR0aCA+PiBsZXZlbCApO1xyXG5cdFx0XHRjb25zdCBoZWlnaHQgPSBNYXRoLm1heCggMSwgcmVuZGVyVGFyZ2V0LmhlaWdodCA+PiBsZXZlbCApO1xyXG5cclxuXHRcdFx0aWYgKCB0ZXh0dXJlVGFyZ2V0ID09PSBfZ2wuVEVYVFVSRV8zRCB8fCB0ZXh0dXJlVGFyZ2V0ID09PSBfZ2wuVEVYVFVSRV8yRF9BUlJBWSApIHtcclxuXHJcblx0XHRcdFx0c3RhdGUudGV4SW1hZ2UzRCggdGV4dHVyZVRhcmdldCwgbGV2ZWwsIGdsSW50ZXJuYWxGb3JtYXQsIHdpZHRoLCBoZWlnaHQsIHJlbmRlclRhcmdldC5kZXB0aCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgbnVsbCApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0c3RhdGUudGV4SW1hZ2UyRCggdGV4dHVyZVRhcmdldCwgbGV2ZWwsIGdsSW50ZXJuYWxGb3JtYXQsIHdpZHRoLCBoZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIG51bGwgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0c3RhdGUuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIGZyYW1lYnVmZmVyICk7XHJcblxyXG5cdFx0aWYgKCB1c2VNdWx0aXNhbXBsZWRSVFQoIHJlbmRlclRhcmdldCApICkge1xyXG5cclxuXHRcdFx0bXVsdGlzYW1wbGVkUlRURXh0LmZyYW1lYnVmZmVyVGV4dHVyZTJETXVsdGlzYW1wbGVFWFQoIF9nbC5GUkFNRUJVRkZFUiwgYXR0YWNobWVudCwgdGV4dHVyZVRhcmdldCwgdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUsIDAsIGdldFJlbmRlclRhcmdldFNhbXBsZXMoIHJlbmRlclRhcmdldCApICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggdGV4dHVyZVRhcmdldCA9PT0gX2dsLlRFWFRVUkVfMkQgfHwgKCB0ZXh0dXJlVGFyZ2V0ID49IF9nbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggJiYgdGV4dHVyZVRhcmdldCA8PSBfZ2wuVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9aICkgKSB7IC8vIHNlZSAjMjQ3NTNcclxuXHJcblx0XHRcdF9nbC5mcmFtZWJ1ZmZlclRleHR1cmUyRCggX2dsLkZSQU1FQlVGRkVSLCBhdHRhY2htZW50LCB0ZXh0dXJlVGFyZ2V0LCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSwgbGV2ZWwgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0c3RhdGUuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIG51bGwgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvLyBTZXR1cCBzdG9yYWdlIGZvciBpbnRlcm5hbCBkZXB0aC9zdGVuY2lsIGJ1ZmZlcnMgYW5kIGJpbmQgdG8gY29ycmVjdCBmcmFtZWJ1ZmZlclxyXG5cdGZ1bmN0aW9uIHNldHVwUmVuZGVyQnVmZmVyU3RvcmFnZSggcmVuZGVyYnVmZmVyLCByZW5kZXJUYXJnZXQsIGlzTXVsdGlzYW1wbGUgKSB7XHJcblxyXG5cdFx0X2dsLmJpbmRSZW5kZXJidWZmZXIoIF9nbC5SRU5ERVJCVUZGRVIsIHJlbmRlcmJ1ZmZlciApO1xyXG5cclxuXHRcdGlmICggcmVuZGVyVGFyZ2V0LmRlcHRoQnVmZmVyICkge1xyXG5cclxuXHRcdFx0Ly8gcmV0cmlldmUgdGhlIGRlcHRoIGF0dGFjaG1lbnQgdHlwZXNcclxuXHRcdFx0Y29uc3QgZGVwdGhUZXh0dXJlID0gcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZTtcclxuXHRcdFx0Y29uc3QgZGVwdGhUeXBlID0gZGVwdGhUZXh0dXJlICYmIGRlcHRoVGV4dHVyZS5pc0RlcHRoVGV4dHVyZSA/IGRlcHRoVGV4dHVyZS50eXBlIDogbnVsbDtcclxuXHRcdFx0Y29uc3QgZ2xJbnRlcm5hbEZvcm1hdCA9IGdldEludGVybmFsRGVwdGhGb3JtYXQoIHJlbmRlclRhcmdldC5zdGVuY2lsQnVmZmVyLCBkZXB0aFR5cGUgKTtcclxuXHRcdFx0Y29uc3QgZ2xBdHRhY2htZW50VHlwZSA9IHJlbmRlclRhcmdldC5zdGVuY2lsQnVmZmVyID8gX2dsLkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVCA6IF9nbC5ERVBUSF9BVFRBQ0hNRU5UO1xyXG5cclxuXHRcdFx0Ly8gc2V0IHVwIHRoZSBhdHRhY2htZW50XHJcblx0XHRcdGNvbnN0IHNhbXBsZXMgPSBnZXRSZW5kZXJUYXJnZXRTYW1wbGVzKCByZW5kZXJUYXJnZXQgKTtcclxuXHRcdFx0Y29uc3QgaXNVc2VNdWx0aXNhbXBsZWRSVFQgPSB1c2VNdWx0aXNhbXBsZWRSVFQoIHJlbmRlclRhcmdldCApO1xyXG5cdFx0XHRpZiAoIGlzVXNlTXVsdGlzYW1wbGVkUlRUICkge1xyXG5cclxuXHRcdFx0XHRtdWx0aXNhbXBsZWRSVFRFeHQucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlRVhUKCBfZ2wuUkVOREVSQlVGRkVSLCBzYW1wbGVzLCBnbEludGVybmFsRm9ybWF0LCByZW5kZXJUYXJnZXQud2lkdGgsIHJlbmRlclRhcmdldC5oZWlnaHQgKTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGlzTXVsdGlzYW1wbGUgKSB7XHJcblxyXG5cdFx0XHRcdF9nbC5yZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGUoIF9nbC5SRU5ERVJCVUZGRVIsIHNhbXBsZXMsIGdsSW50ZXJuYWxGb3JtYXQsIHJlbmRlclRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0X2dsLnJlbmRlcmJ1ZmZlclN0b3JhZ2UoIF9nbC5SRU5ERVJCVUZGRVIsIGdsSW50ZXJuYWxGb3JtYXQsIHJlbmRlclRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0X2dsLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIGdsQXR0YWNobWVudFR5cGUsIF9nbC5SRU5ERVJCVUZGRVIsIHJlbmRlcmJ1ZmZlciApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRjb25zdCB0ZXh0dXJlcyA9IHJlbmRlclRhcmdldC50ZXh0dXJlcztcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHRleHR1cmVzLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgdGV4dHVyZSA9IHRleHR1cmVzWyBpIF07XHJcblxyXG5cdFx0XHRcdGNvbnN0IGdsRm9ybWF0ID0gdXRpbHMuY29udmVydCggdGV4dHVyZS5mb3JtYXQsIHRleHR1cmUuY29sb3JTcGFjZSApO1xyXG5cdFx0XHRcdGNvbnN0IGdsVHlwZSA9IHV0aWxzLmNvbnZlcnQoIHRleHR1cmUudHlwZSApO1xyXG5cdFx0XHRcdGNvbnN0IGdsSW50ZXJuYWxGb3JtYXQgPSBnZXRJbnRlcm5hbEZvcm1hdCggdGV4dHVyZS5pbnRlcm5hbEZvcm1hdCwgZ2xGb3JtYXQsIGdsVHlwZSwgdGV4dHVyZS5jb2xvclNwYWNlICk7XHJcblx0XHRcdFx0Y29uc3Qgc2FtcGxlcyA9IGdldFJlbmRlclRhcmdldFNhbXBsZXMoIHJlbmRlclRhcmdldCApO1xyXG5cclxuXHRcdFx0XHRpZiAoIGlzTXVsdGlzYW1wbGUgJiYgdXNlTXVsdGlzYW1wbGVkUlRUKCByZW5kZXJUYXJnZXQgKSA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRcdFx0X2dsLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZSggX2dsLlJFTkRFUkJVRkZFUiwgc2FtcGxlcywgZ2xJbnRlcm5hbEZvcm1hdCwgcmVuZGVyVGFyZ2V0LndpZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0ICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIHVzZU11bHRpc2FtcGxlZFJUVCggcmVuZGVyVGFyZ2V0ICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0bXVsdGlzYW1wbGVkUlRURXh0LnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUVYVCggX2dsLlJFTkRFUkJVRkZFUiwgc2FtcGxlcywgZ2xJbnRlcm5hbEZvcm1hdCwgcmVuZGVyVGFyZ2V0LndpZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0ICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0X2dsLnJlbmRlcmJ1ZmZlclN0b3JhZ2UoIF9nbC5SRU5ERVJCVUZGRVIsIGdsSW50ZXJuYWxGb3JtYXQsIHJlbmRlclRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdF9nbC5iaW5kUmVuZGVyYnVmZmVyKCBfZ2wuUkVOREVSQlVGRkVSLCBudWxsICk7XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gU2V0dXAgcmVzb3VyY2VzIGZvciBhIERlcHRoIFRleHR1cmUgZm9yIGEgRkJPIChuZWVkcyBhbiBleHRlbnNpb24pXHJcblx0ZnVuY3Rpb24gc2V0dXBEZXB0aFRleHR1cmUoIGZyYW1lYnVmZmVyLCByZW5kZXJUYXJnZXQgKSB7XHJcblxyXG5cdFx0Y29uc3QgaXNDdWJlID0gKCByZW5kZXJUYXJnZXQgJiYgcmVuZGVyVGFyZ2V0LmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0ICk7XHJcblx0XHRpZiAoIGlzQ3ViZSApIHRocm93IG5ldyBFcnJvciggJ0RlcHRoIFRleHR1cmUgd2l0aCBjdWJlIHJlbmRlciB0YXJnZXRzIGlzIG5vdCBzdXBwb3J0ZWQnICk7XHJcblxyXG5cdFx0c3RhdGUuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIGZyYW1lYnVmZmVyICk7XHJcblxyXG5cdFx0aWYgKCAhICggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSAmJiByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmlzRGVwdGhUZXh0dXJlICkgKSB7XHJcblxyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuRGVwdGhUZXh0dXJlJyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlICk7XHJcblx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX3JlbmRlclRhcmdldCA9IHJlbmRlclRhcmdldDtcclxuXHJcblx0XHQvLyB1cGxvYWQgYW4gZW1wdHkgZGVwdGggdGV4dHVyZSB3aXRoIGZyYW1lYnVmZmVyIHNpemVcclxuXHRcdGlmICggISB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSB8fFxyXG5cdFx0XHRcdHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuaW1hZ2Uud2lkdGggIT09IHJlbmRlclRhcmdldC53aWR0aCB8fFxyXG5cdFx0XHRcdHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuaW1hZ2UuaGVpZ2h0ICE9PSByZW5kZXJUYXJnZXQuaGVpZ2h0ICkge1xyXG5cclxuXHRcdFx0cmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS5pbWFnZS53aWR0aCA9IHJlbmRlclRhcmdldC53aWR0aDtcclxuXHRcdFx0cmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS5pbWFnZS5oZWlnaHQgPSByZW5kZXJUYXJnZXQuaGVpZ2h0O1xyXG5cdFx0XHRyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0c2V0VGV4dHVyZTJEKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLCAwICk7XHJcblxyXG5cdFx0Y29uc3Qgd2ViZ2xEZXB0aFRleHR1cmUgPSB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZTtcclxuXHRcdGNvbnN0IHNhbXBsZXMgPSBnZXRSZW5kZXJUYXJnZXRTYW1wbGVzKCByZW5kZXJUYXJnZXQgKTtcclxuXHJcblx0XHRpZiAoIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuZm9ybWF0ID09PSBEZXB0aEZvcm1hdCApIHtcclxuXHJcblx0XHRcdGlmICggdXNlTXVsdGlzYW1wbGVkUlRUKCByZW5kZXJUYXJnZXQgKSApIHtcclxuXHJcblx0XHRcdFx0bXVsdGlzYW1wbGVkUlRURXh0LmZyYW1lYnVmZmVyVGV4dHVyZTJETXVsdGlzYW1wbGVFWFQoIF9nbC5GUkFNRUJVRkZFUiwgX2dsLkRFUFRIX0FUVEFDSE1FTlQsIF9nbC5URVhUVVJFXzJELCB3ZWJnbERlcHRoVGV4dHVyZSwgMCwgc2FtcGxlcyApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0X2dsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKCBfZ2wuRlJBTUVCVUZGRVIsIF9nbC5ERVBUSF9BVFRBQ0hNRU5ULCBfZ2wuVEVYVFVSRV8yRCwgd2ViZ2xEZXB0aFRleHR1cmUsIDAgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2UgaWYgKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmZvcm1hdCA9PT0gRGVwdGhTdGVuY2lsRm9ybWF0ICkge1xyXG5cclxuXHRcdFx0aWYgKCB1c2VNdWx0aXNhbXBsZWRSVFQoIHJlbmRlclRhcmdldCApICkge1xyXG5cclxuXHRcdFx0XHRtdWx0aXNhbXBsZWRSVFRFeHQuZnJhbWVidWZmZXJUZXh0dXJlMkRNdWx0aXNhbXBsZUVYVCggX2dsLkZSQU1FQlVGRkVSLCBfZ2wuREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5ULCBfZ2wuVEVYVFVSRV8yRCwgd2ViZ2xEZXB0aFRleHR1cmUsIDAsIHNhbXBsZXMgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdF9nbC5mcmFtZWJ1ZmZlclRleHR1cmUyRCggX2dsLkZSQU1FQlVGRkVSLCBfZ2wuREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5ULCBfZ2wuVEVYVFVSRV8yRCwgd2ViZ2xEZXB0aFRleHR1cmUsIDAgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnVW5rbm93biBkZXB0aFRleHR1cmUgZm9ybWF0JyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvLyBTZXR1cCBHTCByZXNvdXJjZXMgZm9yIGEgbm9uLXRleHR1cmUgZGVwdGggYnVmZmVyXHJcblx0ZnVuY3Rpb24gc2V0dXBEZXB0aFJlbmRlcmJ1ZmZlciggcmVuZGVyVGFyZ2V0ICkge1xyXG5cclxuXHRcdGNvbnN0IHJlbmRlclRhcmdldFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0ICk7XHJcblx0XHRjb25zdCBpc0N1YmUgPSAoIHJlbmRlclRhcmdldC5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldCA9PT0gdHJ1ZSApO1xyXG5cclxuXHRcdC8vIGlmIHRoZSBib3VuZCBkZXB0aCB0ZXh0dXJlIGhhcyBjaGFuZ2VkXHJcblx0XHRpZiAoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX19ib3VuZERlcHRoVGV4dHVyZSAhPT0gcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdC8vIGZpcmUgdGhlIGRpc3Bvc2UgZXZlbnQgdG8gZ2V0IHJpZCBvZiBzdG9yZWQgc3RhdGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmV2aW91c2x5IGJvdW5kIGRlcHRoIGJ1ZmZlclxyXG5cdFx0XHRjb25zdCBkZXB0aFRleHR1cmUgPSByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlO1xyXG5cdFx0XHRpZiAoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX19kZXB0aERpc3Bvc2VDYWxsYmFjayApIHtcclxuXHJcblx0XHRcdFx0cmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX2RlcHRoRGlzcG9zZUNhbGxiYWNrKCk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBzZXQgdXAgZGlzcG9zZSBsaXN0ZW5lcnMgdG8gdHJhY2sgd2hlbiB0aGUgY3VycmVudGx5IGF0dGFjaGVkIGJ1ZmZlciBpcyBpbXBsaWNpdGx5IHVuYm91bmRcclxuXHRcdFx0aWYgKCBkZXB0aFRleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGRpc3Bvc2VFdmVudCA9ICgpID0+IHtcclxuXHJcblx0XHRcdFx0XHRkZWxldGUgcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX2JvdW5kRGVwdGhUZXh0dXJlO1xyXG5cdFx0XHRcdFx0ZGVsZXRlIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX19kZXB0aERpc3Bvc2VDYWxsYmFjaztcclxuXHRcdFx0XHRcdGRlcHRoVGV4dHVyZS5yZW1vdmVFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIGRpc3Bvc2VFdmVudCApO1xyXG5cclxuXHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0XHRkZXB0aFRleHR1cmUuYWRkRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBkaXNwb3NlRXZlbnQgKTtcclxuXHRcdFx0XHRyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fZGVwdGhEaXNwb3NlQ2FsbGJhY2sgPSBkaXNwb3NlRXZlbnQ7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fYm91bmREZXB0aFRleHR1cmUgPSBkZXB0aFRleHR1cmU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSAmJiAhIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX19hdXRvQWxsb2NhdGVEZXB0aEJ1ZmZlciApIHtcclxuXHJcblx0XHRcdGlmICggaXNDdWJlICkgdGhyb3cgbmV3IEVycm9yKCAndGFyZ2V0LmRlcHRoVGV4dHVyZSBub3Qgc3VwcG9ydGVkIGluIEN1YmUgcmVuZGVyIHRhcmdldHMnICk7XHJcblxyXG5cdFx0XHRzZXR1cERlcHRoVGV4dHVyZSggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXIsIHJlbmRlclRhcmdldCApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRpZiAoIGlzQ3ViZSApIHtcclxuXHJcblx0XHRcdFx0cmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXIgPSBbXTtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgNjsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRzdGF0ZS5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXJbIGkgXSApO1xyXG5cclxuXHRcdFx0XHRcdGlmICggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXJbIGkgXSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdFx0cmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXJbIGkgXSA9IF9nbC5jcmVhdGVSZW5kZXJidWZmZXIoKTtcclxuXHRcdFx0XHRcdFx0c2V0dXBSZW5kZXJCdWZmZXJTdG9yYWdlKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlclsgaSBdLCByZW5kZXJUYXJnZXQsIGZhbHNlICk7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdC8vIGF0dGFjaCBidWZmZXIgaWYgaXQncyBiZWVuIGNyZWF0ZWQgYWxyZWFkeVxyXG5cdFx0XHRcdFx0XHRjb25zdCBnbEF0dGFjaG1lbnRUeXBlID0gcmVuZGVyVGFyZ2V0LnN0ZW5jaWxCdWZmZXIgPyBfZ2wuREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UIDogX2dsLkRFUFRIX0FUVEFDSE1FTlQ7XHJcblx0XHRcdFx0XHRcdGNvbnN0IHJlbmRlcmJ1ZmZlciA9IHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyWyBpIF07XHJcblx0XHRcdFx0XHRcdF9nbC5iaW5kUmVuZGVyYnVmZmVyKCBfZ2wuUkVOREVSQlVGRkVSLCByZW5kZXJidWZmZXIgKTtcclxuXHRcdFx0XHRcdFx0X2dsLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIGdsQXR0YWNobWVudFR5cGUsIF9nbC5SRU5ERVJCVUZGRVIsIHJlbmRlcmJ1ZmZlciApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0c3RhdGUuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyICk7XHJcblxyXG5cdFx0XHRcdGlmICggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXIgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlciA9IF9nbC5jcmVhdGVSZW5kZXJidWZmZXIoKTtcclxuXHRcdFx0XHRcdHNldHVwUmVuZGVyQnVmZmVyU3RvcmFnZSggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXIsIHJlbmRlclRhcmdldCwgZmFsc2UgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHQvLyBhdHRhY2ggYnVmZmVyIGlmIGl0J3MgYmVlbiBjcmVhdGVkIGFscmVhZHlcclxuXHRcdFx0XHRcdGNvbnN0IGdsQXR0YWNobWVudFR5cGUgPSByZW5kZXJUYXJnZXQuc3RlbmNpbEJ1ZmZlciA/IF9nbC5ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQgOiBfZ2wuREVQVEhfQVRUQUNITUVOVDtcclxuXHRcdFx0XHRcdGNvbnN0IHJlbmRlcmJ1ZmZlciA9IHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyO1xyXG5cdFx0XHRcdFx0X2dsLmJpbmRSZW5kZXJidWZmZXIoIF9nbC5SRU5ERVJCVUZGRVIsIHJlbmRlcmJ1ZmZlciApO1xyXG5cdFx0XHRcdFx0X2dsLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIGdsQXR0YWNobWVudFR5cGUsIF9nbC5SRU5ERVJCVUZGRVIsIHJlbmRlcmJ1ZmZlciApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHN0YXRlLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBudWxsICk7XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gcmViaW5kIGZyYW1lYnVmZmVyIHdpdGggZXh0ZXJuYWwgdGV4dHVyZXNcclxuXHRmdW5jdGlvbiByZWJpbmRUZXh0dXJlcyggcmVuZGVyVGFyZ2V0LCBjb2xvclRleHR1cmUsIGRlcHRoVGV4dHVyZSApIHtcclxuXHJcblx0XHRjb25zdCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCApO1xyXG5cclxuXHRcdGlmICggY29sb3JUZXh0dXJlICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRzZXR1cEZyYW1lQnVmZmVyVGV4dHVyZSggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXIsIHJlbmRlclRhcmdldCwgcmVuZGVyVGFyZ2V0LnRleHR1cmUsIF9nbC5DT0xPUl9BVFRBQ0hNRU5UMCwgX2dsLlRFWFRVUkVfMkQsIDAgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBkZXB0aFRleHR1cmUgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHNldHVwRGVwdGhSZW5kZXJidWZmZXIoIHJlbmRlclRhcmdldCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvLyBTZXQgdXAgR0wgcmVzb3VyY2VzIGZvciB0aGUgcmVuZGVyIHRhcmdldFxyXG5cdGZ1bmN0aW9uIHNldHVwUmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQgKSB7XHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZSA9IHJlbmRlclRhcmdldC50ZXh0dXJlO1xyXG5cclxuXHRcdGNvbnN0IHJlbmRlclRhcmdldFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0ICk7XHJcblx0XHRjb25zdCB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0cmVuZGVyVGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25SZW5kZXJUYXJnZXREaXNwb3NlICk7XHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZXMgPSByZW5kZXJUYXJnZXQudGV4dHVyZXM7XHJcblxyXG5cdFx0Y29uc3QgaXNDdWJlID0gKCByZW5kZXJUYXJnZXQuaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQgPT09IHRydWUgKTtcclxuXHRcdGNvbnN0IGlzTXVsdGlwbGVSZW5kZXJUYXJnZXRzID0gKCB0ZXh0dXJlcy5sZW5ndGggPiAxICk7XHJcblxyXG5cdFx0aWYgKCAhIGlzTXVsdGlwbGVSZW5kZXJUYXJnZXRzICkge1xyXG5cclxuXHRcdFx0aWYgKCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSA9IF9nbC5jcmVhdGVUZXh0dXJlKCk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX3ZlcnNpb24gPSB0ZXh0dXJlLnZlcnNpb247XHJcblx0XHRcdGluZm8ubWVtb3J5LnRleHR1cmVzICsrO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBTZXR1cCBmcmFtZWJ1ZmZlclxyXG5cclxuXHRcdGlmICggaXNDdWJlICkge1xyXG5cclxuXHRcdFx0cmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXIgPSBbXTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDY7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggdGV4dHVyZS5taXBtYXBzICYmIHRleHR1cmUubWlwbWFwcy5sZW5ndGggPiAwICkge1xyXG5cclxuXHRcdFx0XHRcdHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyWyBpIF0gPSBbXTtcclxuXHJcblx0XHRcdFx0XHRmb3IgKCBsZXQgbGV2ZWwgPSAwOyBsZXZlbCA8IHRleHR1cmUubWlwbWFwcy5sZW5ndGg7IGxldmVsICsrICkge1xyXG5cclxuXHRcdFx0XHRcdFx0cmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXJbIGkgXVsgbGV2ZWwgXSA9IF9nbC5jcmVhdGVGcmFtZWJ1ZmZlcigpO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlclsgaSBdID0gX2dsLmNyZWF0ZUZyYW1lYnVmZmVyKCk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0aWYgKCB0ZXh0dXJlLm1pcG1hcHMgJiYgdGV4dHVyZS5taXBtYXBzLmxlbmd0aCA+IDAgKSB7XHJcblxyXG5cdFx0XHRcdHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyID0gW107XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBsZXZlbCA9IDA7IGxldmVsIDwgdGV4dHVyZS5taXBtYXBzLmxlbmd0aDsgbGV2ZWwgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0cmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXJbIGxldmVsIF0gPSBfZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0cmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXIgPSBfZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggaXNNdWx0aXBsZVJlbmRlclRhcmdldHMgKSB7XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSB0ZXh0dXJlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBhdHRhY2htZW50UHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlc1sgaSBdICk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBhdHRhY2htZW50UHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdFx0YXR0YWNobWVudFByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgPSBfZ2wuY3JlYXRlVGV4dHVyZSgpO1xyXG5cclxuXHRcdFx0XHRcdFx0aW5mby5tZW1vcnkudGV4dHVyZXMgKys7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoICggcmVuZGVyVGFyZ2V0LnNhbXBsZXMgPiAwICkgJiYgdXNlTXVsdGlzYW1wbGVkUlRUKCByZW5kZXJUYXJnZXQgKSA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRcdHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyID0gX2dsLmNyZWF0ZUZyYW1lYnVmZmVyKCk7XHJcblx0XHRcdFx0cmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXIgPSBbXTtcclxuXHJcblx0XHRcdFx0c3RhdGUuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyICk7XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHRleHR1cmVzLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCB0ZXh0dXJlID0gdGV4dHVyZXNbIGkgXTtcclxuXHRcdFx0XHRcdHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyWyBpIF0gPSBfZ2wuY3JlYXRlUmVuZGVyYnVmZmVyKCk7XHJcblxyXG5cdFx0XHRcdFx0X2dsLmJpbmRSZW5kZXJidWZmZXIoIF9nbC5SRU5ERVJCVUZGRVIsIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyWyBpIF0gKTtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBnbEZvcm1hdCA9IHV0aWxzLmNvbnZlcnQoIHRleHR1cmUuZm9ybWF0LCB0ZXh0dXJlLmNvbG9yU3BhY2UgKTtcclxuXHRcdFx0XHRcdGNvbnN0IGdsVHlwZSA9IHV0aWxzLmNvbnZlcnQoIHRleHR1cmUudHlwZSApO1xyXG5cdFx0XHRcdFx0Y29uc3QgZ2xJbnRlcm5hbEZvcm1hdCA9IGdldEludGVybmFsRm9ybWF0KCB0ZXh0dXJlLmludGVybmFsRm9ybWF0LCBnbEZvcm1hdCwgZ2xUeXBlLCB0ZXh0dXJlLmNvbG9yU3BhY2UsIHJlbmRlclRhcmdldC5pc1hSUmVuZGVyVGFyZ2V0ID09PSB0cnVlICk7XHJcblx0XHRcdFx0XHRjb25zdCBzYW1wbGVzID0gZ2V0UmVuZGVyVGFyZ2V0U2FtcGxlcyggcmVuZGVyVGFyZ2V0ICk7XHJcblx0XHRcdFx0XHRfZ2wucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKCBfZ2wuUkVOREVSQlVGRkVSLCBzYW1wbGVzLCBnbEludGVybmFsRm9ybWF0LCByZW5kZXJUYXJnZXQud2lkdGgsIHJlbmRlclRhcmdldC5oZWlnaHQgKTtcclxuXHJcblx0XHRcdFx0XHRfZ2wuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgX2dsLkNPTE9SX0FUVEFDSE1FTlQwICsgaSwgX2dsLlJFTkRFUkJVRkZFUiwgcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXJbIGkgXSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdF9nbC5iaW5kUmVuZGVyYnVmZmVyKCBfZ2wuUkVOREVSQlVGRkVSLCBudWxsICk7XHJcblxyXG5cdFx0XHRcdGlmICggcmVuZGVyVGFyZ2V0LmRlcHRoQnVmZmVyICkge1xyXG5cclxuXHRcdFx0XHRcdHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoUmVuZGVyYnVmZmVyID0gX2dsLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpO1xyXG5cdFx0XHRcdFx0c2V0dXBSZW5kZXJCdWZmZXJTdG9yYWdlKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aFJlbmRlcmJ1ZmZlciwgcmVuZGVyVGFyZ2V0LCB0cnVlICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0c3RhdGUuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIG51bGwgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gU2V0dXAgY29sb3IgYnVmZmVyXHJcblxyXG5cdFx0aWYgKCBpc0N1YmUgKSB7XHJcblxyXG5cdFx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggX2dsLlRFWFRVUkVfQ1VCRV9NQVAsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICk7XHJcblx0XHRcdHNldFRleHR1cmVQYXJhbWV0ZXJzKCBfZ2wuVEVYVFVSRV9DVUJFX01BUCwgdGV4dHVyZSApO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgNjsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0aWYgKCB0ZXh0dXJlLm1pcG1hcHMgJiYgdGV4dHVyZS5taXBtYXBzLmxlbmd0aCA+IDAgKSB7XHJcblxyXG5cdFx0XHRcdFx0Zm9yICggbGV0IGxldmVsID0gMDsgbGV2ZWwgPCB0ZXh0dXJlLm1pcG1hcHMubGVuZ3RoOyBsZXZlbCArKyApIHtcclxuXHJcblx0XHRcdFx0XHRcdHNldHVwRnJhbWVCdWZmZXJUZXh0dXJlKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlclsgaSBdWyBsZXZlbCBdLCByZW5kZXJUYXJnZXQsIHRleHR1cmUsIF9nbC5DT0xPUl9BVFRBQ0hNRU5UMCwgX2dsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCArIGksIGxldmVsICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdHNldHVwRnJhbWVCdWZmZXJUZXh0dXJlKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlclsgaSBdLCByZW5kZXJUYXJnZXQsIHRleHR1cmUsIF9nbC5DT0xPUl9BVFRBQ0hNRU5UMCwgX2dsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCArIGksIDAgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCB0ZXh0dXJlTmVlZHNHZW5lcmF0ZU1pcG1hcHMoIHRleHR1cmUgKSApIHtcclxuXHJcblx0XHRcdFx0Z2VuZXJhdGVNaXBtYXAoIF9nbC5URVhUVVJFX0NVQkVfTUFQICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRzdGF0ZS51bmJpbmRUZXh0dXJlKCk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggaXNNdWx0aXBsZVJlbmRlclRhcmdldHMgKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gdGV4dHVyZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGF0dGFjaG1lbnQgPSB0ZXh0dXJlc1sgaSBdO1xyXG5cdFx0XHRcdGNvbnN0IGF0dGFjaG1lbnRQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIGF0dGFjaG1lbnQgKTtcclxuXHJcblx0XHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIF9nbC5URVhUVVJFXzJELCBhdHRhY2htZW50UHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApO1xyXG5cdFx0XHRcdHNldFRleHR1cmVQYXJhbWV0ZXJzKCBfZ2wuVEVYVFVSRV8yRCwgYXR0YWNobWVudCApO1xyXG5cdFx0XHRcdHNldHVwRnJhbWVCdWZmZXJUZXh0dXJlKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciwgcmVuZGVyVGFyZ2V0LCBhdHRhY2htZW50LCBfZ2wuQ09MT1JfQVRUQUNITUVOVDAgKyBpLCBfZ2wuVEVYVFVSRV8yRCwgMCApO1xyXG5cclxuXHRcdFx0XHRpZiAoIHRleHR1cmVOZWVkc0dlbmVyYXRlTWlwbWFwcyggYXR0YWNobWVudCApICkge1xyXG5cclxuXHRcdFx0XHRcdGdlbmVyYXRlTWlwbWFwKCBfZ2wuVEVYVFVSRV8yRCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRzdGF0ZS51bmJpbmRUZXh0dXJlKCk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGxldCBnbFRleHR1cmVUeXBlID0gX2dsLlRFWFRVUkVfMkQ7XHJcblxyXG5cdFx0XHRpZiAoIHJlbmRlclRhcmdldC5pc1dlYkdMM0RSZW5kZXJUYXJnZXQgfHwgcmVuZGVyVGFyZ2V0LmlzV2ViR0xBcnJheVJlbmRlclRhcmdldCApIHtcclxuXHJcblx0XHRcdFx0Z2xUZXh0dXJlVHlwZSA9IHJlbmRlclRhcmdldC5pc1dlYkdMM0RSZW5kZXJUYXJnZXQgPyBfZ2wuVEVYVFVSRV8zRCA6IF9nbC5URVhUVVJFXzJEX0FSUkFZO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIGdsVGV4dHVyZVR5cGUsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICk7XHJcblx0XHRcdHNldFRleHR1cmVQYXJhbWV0ZXJzKCBnbFRleHR1cmVUeXBlLCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0XHRpZiAoIHRleHR1cmUubWlwbWFwcyAmJiB0ZXh0dXJlLm1pcG1hcHMubGVuZ3RoID4gMCApIHtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGxldmVsID0gMDsgbGV2ZWwgPCB0ZXh0dXJlLm1pcG1hcHMubGVuZ3RoOyBsZXZlbCArKyApIHtcclxuXHJcblx0XHRcdFx0XHRzZXR1cEZyYW1lQnVmZmVyVGV4dHVyZSggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXJbIGxldmVsIF0sIHJlbmRlclRhcmdldCwgdGV4dHVyZSwgX2dsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbFRleHR1cmVUeXBlLCBsZXZlbCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRzZXR1cEZyYW1lQnVmZmVyVGV4dHVyZSggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXIsIHJlbmRlclRhcmdldCwgdGV4dHVyZSwgX2dsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbFRleHR1cmVUeXBlLCAwICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHRleHR1cmVOZWVkc0dlbmVyYXRlTWlwbWFwcyggdGV4dHVyZSApICkge1xyXG5cclxuXHRcdFx0XHRnZW5lcmF0ZU1pcG1hcCggZ2xUZXh0dXJlVHlwZSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0c3RhdGUudW5iaW5kVGV4dHVyZSgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBTZXR1cCBkZXB0aCBhbmQgc3RlbmNpbCBidWZmZXJzXHJcblxyXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQuZGVwdGhCdWZmZXIgKSB7XHJcblxyXG5cdFx0XHRzZXR1cERlcHRoUmVuZGVyYnVmZmVyKCByZW5kZXJUYXJnZXQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gdXBkYXRlUmVuZGVyVGFyZ2V0TWlwbWFwKCByZW5kZXJUYXJnZXQgKSB7XHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZXMgPSByZW5kZXJUYXJnZXQudGV4dHVyZXM7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IHRleHR1cmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdGV4dHVyZSA9IHRleHR1cmVzWyBpIF07XHJcblxyXG5cdFx0XHRpZiAoIHRleHR1cmVOZWVkc0dlbmVyYXRlTWlwbWFwcyggdGV4dHVyZSApICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB0YXJnZXRUeXBlID0gZ2V0VGFyZ2V0VHlwZSggcmVuZGVyVGFyZ2V0ICk7XHJcblx0XHRcdFx0Y29uc3Qgd2ViZ2xUZXh0dXJlID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKS5fX3dlYmdsVGV4dHVyZTtcclxuXHJcblx0XHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIHRhcmdldFR5cGUsIHdlYmdsVGV4dHVyZSApO1xyXG5cdFx0XHRcdGdlbmVyYXRlTWlwbWFwKCB0YXJnZXRUeXBlICk7XHJcblx0XHRcdFx0c3RhdGUudW5iaW5kVGV4dHVyZSgpO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRjb25zdCBpbnZhbGlkYXRpb25BcnJheVJlYWQgPSBbXTtcclxuXHRjb25zdCBpbnZhbGlkYXRpb25BcnJheURyYXcgPSBbXTtcclxuXHJcblx0ZnVuY3Rpb24gdXBkYXRlTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCApIHtcclxuXHJcblx0XHRpZiAoIHJlbmRlclRhcmdldC5zYW1wbGVzID4gMCApIHtcclxuXHJcblx0XHRcdGlmICggdXNlTXVsdGlzYW1wbGVkUlRUKCByZW5kZXJUYXJnZXQgKSA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHRleHR1cmVzID0gcmVuZGVyVGFyZ2V0LnRleHR1cmVzO1xyXG5cdFx0XHRcdGNvbnN0IHdpZHRoID0gcmVuZGVyVGFyZ2V0LndpZHRoO1xyXG5cdFx0XHRcdGNvbnN0IGhlaWdodCA9IHJlbmRlclRhcmdldC5oZWlnaHQ7XHJcblx0XHRcdFx0bGV0IG1hc2sgPSBfZ2wuQ09MT1JfQlVGRkVSX0JJVDtcclxuXHRcdFx0XHRjb25zdCBkZXB0aFN0eWxlID0gcmVuZGVyVGFyZ2V0LnN0ZW5jaWxCdWZmZXIgPyBfZ2wuREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UIDogX2dsLkRFUFRIX0FUVEFDSE1FTlQ7XHJcblx0XHRcdFx0Y29uc3QgcmVuZGVyVGFyZ2V0UHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQgKTtcclxuXHRcdFx0XHRjb25zdCBpc011bHRpcGxlUmVuZGVyVGFyZ2V0cyA9ICggdGV4dHVyZXMubGVuZ3RoID4gMSApO1xyXG5cclxuXHRcdFx0XHQvLyBJZiBNUlQgd2UgbmVlZCB0byByZW1vdmUgRkJPIGF0dGFjaG1lbnRzXHJcblx0XHRcdFx0aWYgKCBpc011bHRpcGxlUmVuZGVyVGFyZ2V0cyApIHtcclxuXHJcblx0XHRcdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB0ZXh0dXJlcy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRzdGF0ZS5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXIgKTtcclxuXHRcdFx0XHRcdFx0X2dsLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIF9nbC5DT0xPUl9BVFRBQ0hNRU5UMCArIGksIF9nbC5SRU5ERVJCVUZGRVIsIG51bGwgKTtcclxuXHJcblx0XHRcdFx0XHRcdHN0YXRlLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciApO1xyXG5cdFx0XHRcdFx0XHRfZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoIF9nbC5EUkFXX0ZSQU1FQlVGRkVSLCBfZ2wuQ09MT1JfQVRUQUNITUVOVDAgKyBpLCBfZ2wuVEVYVFVSRV8yRCwgbnVsbCwgMCApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRzdGF0ZS5iaW5kRnJhbWVidWZmZXIoIF9nbC5SRUFEX0ZSQU1FQlVGRkVSLCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlciApO1xyXG5cdFx0XHRcdHN0YXRlLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkRSQVdfRlJBTUVCVUZGRVIsIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyICk7XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHRleHR1cmVzLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIHJlbmRlclRhcmdldC5yZXNvbHZlRGVwdGhCdWZmZXIgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIHJlbmRlclRhcmdldC5kZXB0aEJ1ZmZlciApIG1hc2sgfD0gX2dsLkRFUFRIX0JVRkZFUl9CSVQ7XHJcblxyXG5cdFx0XHRcdFx0XHQvLyByZXNvbHZpbmcgc3RlbmNpbCBpcyBzbG93IHdpdGggYSBEM0QgYmFja2VuZC4gZGlzYWJsZSBpdCBmb3IgYWxsIHRyYW5zbWlzc2lvbiByZW5kZXIgdGFyZ2V0cyAoc2VlICMyNzc5OSlcclxuXHJcblx0XHRcdFx0XHRcdGlmICggcmVuZGVyVGFyZ2V0LnN0ZW5jaWxCdWZmZXIgJiYgcmVuZGVyVGFyZ2V0LnJlc29sdmVTdGVuY2lsQnVmZmVyICkgbWFzayB8PSBfZ2wuU1RFTkNJTF9CVUZGRVJfQklUO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRpZiAoIGlzTXVsdGlwbGVSZW5kZXJUYXJnZXRzICkge1xyXG5cclxuXHRcdFx0XHRcdFx0X2dsLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKCBfZ2wuUkVBRF9GUkFNRUJVRkZFUiwgX2dsLkNPTE9SX0FUVEFDSE1FTlQwLCBfZ2wuUkVOREVSQlVGRkVSLCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlclsgaSBdICk7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCB3ZWJnbFRleHR1cmUgPSBwcm9wZXJ0aWVzLmdldCggdGV4dHVyZXNbIGkgXSApLl9fd2ViZ2xUZXh0dXJlO1xyXG5cdFx0XHRcdFx0XHRfZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoIF9nbC5EUkFXX0ZSQU1FQlVGRkVSLCBfZ2wuQ09MT1JfQVRUQUNITUVOVDAsIF9nbC5URVhUVVJFXzJELCB3ZWJnbFRleHR1cmUsIDAgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0X2dsLmJsaXRGcmFtZWJ1ZmZlciggMCwgMCwgd2lkdGgsIGhlaWdodCwgMCwgMCwgd2lkdGgsIGhlaWdodCwgbWFzaywgX2dsLk5FQVJFU1QgKTtcclxuXHJcblx0XHRcdFx0XHRpZiAoIHN1cHBvcnRzSW52YWxpZGF0ZUZyYW1lYnVmZmVyID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0aW52YWxpZGF0aW9uQXJyYXlSZWFkLmxlbmd0aCA9IDA7XHJcblx0XHRcdFx0XHRcdGludmFsaWRhdGlvbkFycmF5RHJhdy5sZW5ndGggPSAwO1xyXG5cclxuXHRcdFx0XHRcdFx0aW52YWxpZGF0aW9uQXJyYXlSZWFkLnB1c2goIF9nbC5DT0xPUl9BVFRBQ0hNRU5UMCArIGkgKTtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggcmVuZGVyVGFyZ2V0LmRlcHRoQnVmZmVyICYmIHJlbmRlclRhcmdldC5yZXNvbHZlRGVwdGhCdWZmZXIgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpbnZhbGlkYXRpb25BcnJheVJlYWQucHVzaCggZGVwdGhTdHlsZSApO1xyXG5cdFx0XHRcdFx0XHRcdGludmFsaWRhdGlvbkFycmF5RHJhdy5wdXNoKCBkZXB0aFN0eWxlICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdF9nbC5pbnZhbGlkYXRlRnJhbWVidWZmZXIoIF9nbC5EUkFXX0ZSQU1FQlVGRkVSLCBpbnZhbGlkYXRpb25BcnJheURyYXcgKTtcclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdF9nbC5pbnZhbGlkYXRlRnJhbWVidWZmZXIoIF9nbC5SRUFEX0ZSQU1FQlVGRkVSLCBpbnZhbGlkYXRpb25BcnJheVJlYWQgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0c3RhdGUuYmluZEZyYW1lYnVmZmVyKCBfZ2wuUkVBRF9GUkFNRUJVRkZFUiwgbnVsbCApO1xyXG5cdFx0XHRcdHN0YXRlLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkRSQVdfRlJBTUVCVUZGRVIsIG51bGwgKTtcclxuXHJcblx0XHRcdFx0Ly8gSWYgTVJUIHNpbmNlIHByZS1ibGl0IHdlIHJlbW92ZWQgdGhlIEZCTyB3ZSBuZWVkIHRvIHJlY29uc3RydWN0IHRoZSBhdHRhY2htZW50c1xyXG5cdFx0XHRcdGlmICggaXNNdWx0aXBsZVJlbmRlclRhcmdldHMgKSB7XHJcblxyXG5cdFx0XHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdGV4dHVyZXMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdFx0c3RhdGUuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyICk7XHJcblx0XHRcdFx0XHRcdF9nbC5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBfZ2wuQ09MT1JfQVRUQUNITUVOVDAgKyBpLCBfZ2wuUkVOREVSQlVGRkVSLCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlclsgaSBdICk7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCB3ZWJnbFRleHR1cmUgPSBwcm9wZXJ0aWVzLmdldCggdGV4dHVyZXNbIGkgXSApLl9fd2ViZ2xUZXh0dXJlO1xyXG5cclxuXHRcdFx0XHRcdFx0c3RhdGUuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyICk7XHJcblx0XHRcdFx0XHRcdF9nbC5mcmFtZWJ1ZmZlclRleHR1cmUyRCggX2dsLkRSQVdfRlJBTUVCVUZGRVIsIF9nbC5DT0xPUl9BVFRBQ0hNRU5UMCArIGksIF9nbC5URVhUVVJFXzJELCB3ZWJnbFRleHR1cmUsIDAgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0c3RhdGUuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRFJBV19GUkFNRUJVRkZFUiwgcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXIgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGlmICggcmVuZGVyVGFyZ2V0LmRlcHRoQnVmZmVyICYmIHJlbmRlclRhcmdldC5yZXNvbHZlRGVwdGhCdWZmZXIgPT09IGZhbHNlICYmIHN1cHBvcnRzSW52YWxpZGF0ZUZyYW1lYnVmZmVyICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGRlcHRoU3R5bGUgPSByZW5kZXJUYXJnZXQuc3RlbmNpbEJ1ZmZlciA/IF9nbC5ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQgOiBfZ2wuREVQVEhfQVRUQUNITUVOVDtcclxuXHJcblx0XHRcdFx0XHRfZ2wuaW52YWxpZGF0ZUZyYW1lYnVmZmVyKCBfZ2wuRFJBV19GUkFNRUJVRkZFUiwgWyBkZXB0aFN0eWxlIF0gKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBnZXRSZW5kZXJUYXJnZXRTYW1wbGVzKCByZW5kZXJUYXJnZXQgKSB7XHJcblxyXG5cdFx0cmV0dXJuIE1hdGgubWluKCBjYXBhYmlsaXRpZXMubWF4U2FtcGxlcywgcmVuZGVyVGFyZ2V0LnNhbXBsZXMgKTtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiB1c2VNdWx0aXNhbXBsZWRSVFQoIHJlbmRlclRhcmdldCApIHtcclxuXHJcblx0XHRjb25zdCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCApO1xyXG5cclxuXHRcdHJldHVybiByZW5kZXJUYXJnZXQuc2FtcGxlcyA+IDAgJiYgZXh0ZW5zaW9ucy5oYXMoICdXRUJHTF9tdWx0aXNhbXBsZWRfcmVuZGVyX3RvX3RleHR1cmUnICkgPT09IHRydWUgJiYgcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3VzZVJlbmRlclRvVGV4dHVyZSAhPT0gZmFsc2U7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gdXBkYXRlVmlkZW9UZXh0dXJlKCB0ZXh0dXJlICkge1xyXG5cclxuXHRcdGNvbnN0IGZyYW1lID0gaW5mby5yZW5kZXIuZnJhbWU7XHJcblxyXG5cdFx0Ly8gQ2hlY2sgdGhlIGxhc3QgZnJhbWUgd2UgdXBkYXRlZCB0aGUgVmlkZW9UZXh0dXJlXHJcblxyXG5cdFx0aWYgKCBfdmlkZW9UZXh0dXJlcy5nZXQoIHRleHR1cmUgKSAhPT0gZnJhbWUgKSB7XHJcblxyXG5cdFx0XHRfdmlkZW9UZXh0dXJlcy5zZXQoIHRleHR1cmUsIGZyYW1lICk7XHJcblx0XHRcdHRleHR1cmUudXBkYXRlKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHZlcmlmeUNvbG9yU3BhY2UoIHRleHR1cmUsIGltYWdlICkge1xyXG5cclxuXHRcdGNvbnN0IGNvbG9yU3BhY2UgPSB0ZXh0dXJlLmNvbG9yU3BhY2U7XHJcblx0XHRjb25zdCBmb3JtYXQgPSB0ZXh0dXJlLmZvcm1hdDtcclxuXHRcdGNvbnN0IHR5cGUgPSB0ZXh0dXJlLnR5cGU7XHJcblxyXG5cdFx0aWYgKCB0ZXh0dXJlLmlzQ29tcHJlc3NlZFRleHR1cmUgPT09IHRydWUgfHwgdGV4dHVyZS5pc1ZpZGVvVGV4dHVyZSA9PT0gdHJ1ZSApIHJldHVybiBpbWFnZTtcclxuXHJcblx0XHRpZiAoIGNvbG9yU3BhY2UgIT09IExpbmVhclNSR0JDb2xvclNwYWNlICYmIGNvbG9yU3BhY2UgIT09IE5vQ29sb3JTcGFjZSApIHtcclxuXHJcblx0XHRcdC8vIHNSR0JcclxuXHJcblx0XHRcdGlmICggQ29sb3JNYW5hZ2VtZW50LmdldFRyYW5zZmVyKCBjb2xvclNwYWNlICkgPT09IFNSR0JUcmFuc2ZlciApIHtcclxuXHJcblx0XHRcdFx0Ly8gaW4gV2ViR0wgMiB1bmNvbXByZXNzZWQgdGV4dHVyZXMgY2FuIG9ubHkgYmUgc1JHQiBlbmNvZGVkIGlmIHRoZXkgaGF2ZSB0aGUgUkdCQTggZm9ybWF0XHJcblxyXG5cdFx0XHRcdGlmICggZm9ybWF0ICE9PSBSR0JBRm9ybWF0IHx8IHR5cGUgIT09IFVuc2lnbmVkQnl0ZVR5cGUgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xUZXh0dXJlczogc1JHQiBlbmNvZGVkIHRleHR1cmVzIGhhdmUgdG8gdXNlIFJHQkFGb3JtYXQgYW5kIFVuc2lnbmVkQnl0ZVR5cGUuJyApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xUZXh0dXJlczogVW5zdXBwb3J0ZWQgdGV4dHVyZSBjb2xvciBzcGFjZTonLCBjb2xvclNwYWNlICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBpbWFnZTtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBnZXREaW1lbnNpb25zKCBpbWFnZSApIHtcclxuXHJcblx0XHRpZiAoIHR5cGVvZiBIVE1MSW1hZ2VFbGVtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBpbWFnZSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQgKSB7XHJcblxyXG5cdFx0XHQvLyBpZiBpbnRyaW5zaWMgZGF0YSBhcmUgbm90IGF2YWlsYWJsZSwgZmFsbGJhY2sgdG8gd2lkdGgvaGVpZ2h0XHJcblxyXG5cdFx0XHRfaW1hZ2VEaW1lbnNpb25zLndpZHRoID0gaW1hZ2UubmF0dXJhbFdpZHRoIHx8IGltYWdlLndpZHRoO1xyXG5cdFx0XHRfaW1hZ2VEaW1lbnNpb25zLmhlaWdodCA9IGltYWdlLm5hdHVyYWxIZWlnaHQgfHwgaW1hZ2UuaGVpZ2h0O1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHR5cGVvZiBWaWRlb0ZyYW1lICE9PSAndW5kZWZpbmVkJyAmJiBpbWFnZSBpbnN0YW5jZW9mIFZpZGVvRnJhbWUgKSB7XHJcblxyXG5cdFx0XHRfaW1hZ2VEaW1lbnNpb25zLndpZHRoID0gaW1hZ2UuZGlzcGxheVdpZHRoO1xyXG5cdFx0XHRfaW1hZ2VEaW1lbnNpb25zLmhlaWdodCA9IGltYWdlLmRpc3BsYXlIZWlnaHQ7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdF9pbWFnZURpbWVuc2lvbnMud2lkdGggPSBpbWFnZS53aWR0aDtcclxuXHRcdFx0X2ltYWdlRGltZW5zaW9ucy5oZWlnaHQgPSBpbWFnZS5oZWlnaHQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBfaW1hZ2VEaW1lbnNpb25zO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vXHJcblxyXG5cdHRoaXMuYWxsb2NhdGVUZXh0dXJlVW5pdCA9IGFsbG9jYXRlVGV4dHVyZVVuaXQ7XHJcblx0dGhpcy5yZXNldFRleHR1cmVVbml0cyA9IHJlc2V0VGV4dHVyZVVuaXRzO1xyXG5cclxuXHR0aGlzLnNldFRleHR1cmUyRCA9IHNldFRleHR1cmUyRDtcclxuXHR0aGlzLnNldFRleHR1cmUyREFycmF5ID0gc2V0VGV4dHVyZTJEQXJyYXk7XHJcblx0dGhpcy5zZXRUZXh0dXJlM0QgPSBzZXRUZXh0dXJlM0Q7XHJcblx0dGhpcy5zZXRUZXh0dXJlQ3ViZSA9IHNldFRleHR1cmVDdWJlO1xyXG5cdHRoaXMucmViaW5kVGV4dHVyZXMgPSByZWJpbmRUZXh0dXJlcztcclxuXHR0aGlzLnNldHVwUmVuZGVyVGFyZ2V0ID0gc2V0dXBSZW5kZXJUYXJnZXQ7XHJcblx0dGhpcy51cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXAgPSB1cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXA7XHJcblx0dGhpcy51cGRhdGVNdWx0aXNhbXBsZVJlbmRlclRhcmdldCA9IHVwZGF0ZU11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0O1xyXG5cdHRoaXMuc2V0dXBEZXB0aFJlbmRlcmJ1ZmZlciA9IHNldHVwRGVwdGhSZW5kZXJidWZmZXI7XHJcblx0dGhpcy5zZXR1cEZyYW1lQnVmZmVyVGV4dHVyZSA9IHNldHVwRnJhbWVCdWZmZXJUZXh0dXJlO1xyXG5cdHRoaXMudXNlTXVsdGlzYW1wbGVkUlRUID0gdXNlTXVsdGlzYW1wbGVkUlRUO1xyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgV2ViR0xUZXh0dXJlcyB9O1xyXG4iLCJpbXBvcnQgeyBSR0JBX0FTVENfNHg0X0Zvcm1hdCwgUkdCQV9BU1RDXzV4NF9Gb3JtYXQsIFJHQkFfQVNUQ181eDVfRm9ybWF0LCBSR0JBX0FTVENfNng1X0Zvcm1hdCwgUkdCQV9BU1RDXzZ4Nl9Gb3JtYXQsIFJHQkFfQVNUQ184eDVfRm9ybWF0LCBSR0JBX0FTVENfOHg2X0Zvcm1hdCwgUkdCQV9BU1RDXzh4OF9Gb3JtYXQsIFJHQkFfQVNUQ18xMHg1X0Zvcm1hdCwgUkdCQV9BU1RDXzEweDZfRm9ybWF0LCBSR0JBX0FTVENfMTB4OF9Gb3JtYXQsIFJHQkFfQVNUQ18xMHgxMF9Gb3JtYXQsIFJHQkFfQVNUQ18xMngxMF9Gb3JtYXQsIFJHQkFfQVNUQ18xMngxMl9Gb3JtYXQsIFJHQl9FVEMxX0Zvcm1hdCwgUkdCX0VUQzJfRm9ybWF0LCBSR0JBX0VUQzJfRUFDX0Zvcm1hdCwgUkdCQV9QVlJUQ18yQlBQVjFfRm9ybWF0LCBSR0JBX1BWUlRDXzRCUFBWMV9Gb3JtYXQsIFJHQl9QVlJUQ18yQlBQVjFfRm9ybWF0LCBSR0JfUFZSVENfNEJQUFYxX0Zvcm1hdCwgUkdCQV9TM1RDX0RYVDVfRm9ybWF0LCBSR0JBX1MzVENfRFhUM19Gb3JtYXQsIFJHQkFfUzNUQ19EWFQxX0Zvcm1hdCwgUkdCX1MzVENfRFhUMV9Gb3JtYXQsIERlcHRoRm9ybWF0LCBEZXB0aFN0ZW5jaWxGb3JtYXQsIEx1bWluYW5jZUFscGhhRm9ybWF0LCBMdW1pbmFuY2VGb3JtYXQsIFJlZEZvcm1hdCwgUkdCQUZvcm1hdCwgQWxwaGFGb3JtYXQsIFJlZEludGVnZXJGb3JtYXQsIFJHRm9ybWF0LCBSR0ludGVnZXJGb3JtYXQsIFJHQkFJbnRlZ2VyRm9ybWF0LCBIYWxmRmxvYXRUeXBlLCBGbG9hdFR5cGUsIFVuc2lnbmVkSW50VHlwZSwgSW50VHlwZSwgVW5zaWduZWRTaG9ydFR5cGUsIFNob3J0VHlwZSwgQnl0ZVR5cGUsIFVuc2lnbmVkSW50MjQ4VHlwZSwgVW5zaWduZWRTaG9ydDU1NTFUeXBlLCBVbnNpZ25lZFNob3J0NDQ0NFR5cGUsIFVuc2lnbmVkQnl0ZVR5cGUsIFJHQkFfQlBUQ19Gb3JtYXQsIFJHQl9CUFRDX1NJR05FRF9Gb3JtYXQsIFJHQl9CUFRDX1VOU0lHTkVEX0Zvcm1hdCwgUkVEX1JHVEMxX0Zvcm1hdCwgU0lHTkVEX1JFRF9SR1RDMV9Gb3JtYXQsIFJFRF9HUkVFTl9SR1RDMl9Gb3JtYXQsIFNJR05FRF9SRURfR1JFRU5fUkdUQzJfRm9ybWF0LCBOb0NvbG9yU3BhY2UsIFNSR0JUcmFuc2ZlciwgVW5zaWduZWRJbnQ1OTk5VHlwZSwgUkdCRm9ybWF0IH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgQ29sb3JNYW5hZ2VtZW50IH0gZnJvbSAnLi4vLi4vbWF0aC9Db2xvck1hbmFnZW1lbnQuanMnO1xyXG5cclxuZnVuY3Rpb24gV2ViR0xVdGlscyggZ2wsIGV4dGVuc2lvbnMgKSB7XHJcblxyXG5cdGZ1bmN0aW9uIGNvbnZlcnQoIHAsIGNvbG9yU3BhY2UgPSBOb0NvbG9yU3BhY2UgKSB7XHJcblxyXG5cdFx0bGV0IGV4dGVuc2lvbjtcclxuXHJcblx0XHRjb25zdCB0cmFuc2ZlciA9IENvbG9yTWFuYWdlbWVudC5nZXRUcmFuc2ZlciggY29sb3JTcGFjZSApO1xyXG5cclxuXHRcdGlmICggcCA9PT0gVW5zaWduZWRCeXRlVHlwZSApIHJldHVybiBnbC5VTlNJR05FRF9CWVRFO1xyXG5cdFx0aWYgKCBwID09PSBVbnNpZ25lZFNob3J0NDQ0NFR5cGUgKSByZXR1cm4gZ2wuVU5TSUdORURfU0hPUlRfNF80XzRfNDtcclxuXHRcdGlmICggcCA9PT0gVW5zaWduZWRTaG9ydDU1NTFUeXBlICkgcmV0dXJuIGdsLlVOU0lHTkVEX1NIT1JUXzVfNV81XzE7XHJcblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkSW50NTk5OVR5cGUgKSByZXR1cm4gZ2wuVU5TSUdORURfSU5UXzVfOV85XzlfUkVWO1xyXG5cclxuXHRcdGlmICggcCA9PT0gQnl0ZVR5cGUgKSByZXR1cm4gZ2wuQllURTtcclxuXHRcdGlmICggcCA9PT0gU2hvcnRUeXBlICkgcmV0dXJuIGdsLlNIT1JUO1xyXG5cdFx0aWYgKCBwID09PSBVbnNpZ25lZFNob3J0VHlwZSApIHJldHVybiBnbC5VTlNJR05FRF9TSE9SVDtcclxuXHRcdGlmICggcCA9PT0gSW50VHlwZSApIHJldHVybiBnbC5JTlQ7XHJcblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkSW50VHlwZSApIHJldHVybiBnbC5VTlNJR05FRF9JTlQ7XHJcblx0XHRpZiAoIHAgPT09IEZsb2F0VHlwZSApIHJldHVybiBnbC5GTE9BVDtcclxuXHRcdGlmICggcCA9PT0gSGFsZkZsb2F0VHlwZSApIHJldHVybiBnbC5IQUxGX0ZMT0FUO1xyXG5cclxuXHRcdGlmICggcCA9PT0gQWxwaGFGb3JtYXQgKSByZXR1cm4gZ2wuQUxQSEE7XHJcblx0XHRpZiAoIHAgPT09IFJHQkZvcm1hdCApIHJldHVybiBnbC5SR0I7XHJcblx0XHRpZiAoIHAgPT09IFJHQkFGb3JtYXQgKSByZXR1cm4gZ2wuUkdCQTtcclxuXHRcdGlmICggcCA9PT0gTHVtaW5hbmNlRm9ybWF0ICkgcmV0dXJuIGdsLkxVTUlOQU5DRTtcclxuXHRcdGlmICggcCA9PT0gTHVtaW5hbmNlQWxwaGFGb3JtYXQgKSByZXR1cm4gZ2wuTFVNSU5BTkNFX0FMUEhBO1xyXG5cdFx0aWYgKCBwID09PSBEZXB0aEZvcm1hdCApIHJldHVybiBnbC5ERVBUSF9DT01QT05FTlQ7XHJcblx0XHRpZiAoIHAgPT09IERlcHRoU3RlbmNpbEZvcm1hdCApIHJldHVybiBnbC5ERVBUSF9TVEVOQ0lMO1xyXG5cclxuXHRcdC8vIFdlYkdMMiBmb3JtYXRzLlxyXG5cclxuXHRcdGlmICggcCA9PT0gUmVkRm9ybWF0ICkgcmV0dXJuIGdsLlJFRDtcclxuXHRcdGlmICggcCA9PT0gUmVkSW50ZWdlckZvcm1hdCApIHJldHVybiBnbC5SRURfSU5URUdFUjtcclxuXHRcdGlmICggcCA9PT0gUkdGb3JtYXQgKSByZXR1cm4gZ2wuUkc7XHJcblx0XHRpZiAoIHAgPT09IFJHSW50ZWdlckZvcm1hdCApIHJldHVybiBnbC5SR19JTlRFR0VSO1xyXG5cdFx0aWYgKCBwID09PSBSR0JBSW50ZWdlckZvcm1hdCApIHJldHVybiBnbC5SR0JBX0lOVEVHRVI7XHJcblxyXG5cdFx0Ly8gUzNUQ1xyXG5cclxuXHRcdGlmICggcCA9PT0gUkdCX1MzVENfRFhUMV9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9TM1RDX0RYVDFfRm9ybWF0IHx8IHAgPT09IFJHQkFfUzNUQ19EWFQzX0Zvcm1hdCB8fCBwID09PSBSR0JBX1MzVENfRFhUNV9Gb3JtYXQgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHRyYW5zZmVyID09PSBTUkdCVHJhbnNmZXIgKSB7XHJcblxyXG5cdFx0XHRcdGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGNfc3JnYicgKTtcclxuXHJcblx0XHRcdFx0aWYgKCBleHRlbnNpb24gIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBwID09PSBSR0JfUzNUQ19EWFQxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9TUkdCX1MzVENfRFhUMV9FWFQ7XHJcblx0XHRcdFx0XHRpZiAoIHAgPT09IFJHQkFfUzNUQ19EWFQxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9TUkdCX0FMUEhBX1MzVENfRFhUMV9FWFQ7XHJcblx0XHRcdFx0XHRpZiAoIHAgPT09IFJHQkFfUzNUQ19EWFQzX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9TUkdCX0FMUEhBX1MzVENfRFhUM19FWFQ7XHJcblx0XHRcdFx0XHRpZiAoIHAgPT09IFJHQkFfUzNUQ19EWFQ1X0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9TUkdCX0FMUEhBX1MzVENfRFhUNV9FWFQ7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIG51bGw7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMnICk7XHJcblxyXG5cdFx0XHRcdGlmICggZXh0ZW5zaW9uICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRcdGlmICggcCA9PT0gUkdCX1MzVENfRFhUMV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCX1MzVENfRFhUMV9FWFQ7XHJcblx0XHRcdFx0XHRpZiAoIHAgPT09IFJHQkFfUzNUQ19EWFQxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQ7XHJcblx0XHRcdFx0XHRpZiAoIHAgPT09IFJHQkFfUzNUQ19EWFQzX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUM19FWFQ7XHJcblx0XHRcdFx0XHRpZiAoIHAgPT09IFJHQkFfUzNUQ19EWFQ1X0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUNV9FWFQ7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIG51bGw7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gUFZSVENcclxuXHJcblx0XHRpZiAoIHAgPT09IFJHQl9QVlJUQ180QlBQVjFfRm9ybWF0IHx8IHAgPT09IFJHQl9QVlJUQ18yQlBQVjFfRm9ybWF0IHx8IHAgPT09IFJHQkFfUFZSVENfNEJQUFYxX0Zvcm1hdCB8fCBwID09PSBSR0JBX1BWUlRDXzJCUFBWMV9Gb3JtYXQgKSB7XHJcblxyXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YycgKTtcclxuXHJcblx0XHRcdGlmICggZXh0ZW5zaW9uICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIHAgPT09IFJHQl9QVlJUQ180QlBQVjFfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQl9QVlJUQ180QlBQVjFfSU1HO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCX1BWUlRDXzJCUFBWMV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCX1BWUlRDXzJCUFBWMV9JTUc7XHJcblx0XHRcdFx0aWYgKCBwID09PSBSR0JBX1BWUlRDXzRCUFBWMV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9QVlJUQ180QlBQVjFfSU1HO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9QVlJUQ18yQlBQVjFfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfUFZSVENfMkJQUFYxX0lNRztcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHJldHVybiBudWxsO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBFVENcclxuXHJcblx0XHRpZiAoIHAgPT09IFJHQl9FVEMxX0Zvcm1hdCB8fCBwID09PSBSR0JfRVRDMl9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9FVEMyX0VBQ19Gb3JtYXQgKSB7XHJcblxyXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9ldGMnICk7XHJcblxyXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBwID09PSBSR0JfRVRDMV9Gb3JtYXQgfHwgcCA9PT0gUkdCX0VUQzJfRm9ybWF0ICkgcmV0dXJuICggdHJhbnNmZXIgPT09IFNSR0JUcmFuc2ZlciApID8gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU1JHQjhfRVRDMiA6IGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQjhfRVRDMjtcclxuXHRcdFx0XHRpZiAoIHAgPT09IFJHQkFfRVRDMl9FQUNfRm9ybWF0ICkgcmV0dXJuICggdHJhbnNmZXIgPT09IFNSR0JUcmFuc2ZlciApID8gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0VUQzJfRUFDIDogZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQThfRVRDMl9FQUM7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQVNUQ1xyXG5cclxuXHRcdGlmICggcCA9PT0gUkdCQV9BU1RDXzR4NF9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzV4NF9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzV4NV9Gb3JtYXQgfHxcclxuXHRcdFx0cCA9PT0gUkdCQV9BU1RDXzZ4NV9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzZ4Nl9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzh4NV9Gb3JtYXQgfHxcclxuXHRcdFx0cCA9PT0gUkdCQV9BU1RDXzh4Nl9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzh4OF9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzEweDVfRm9ybWF0IHx8XHJcblx0XHRcdHAgPT09IFJHQkFfQVNUQ18xMHg2X0Zvcm1hdCB8fCBwID09PSBSR0JBX0FTVENfMTB4OF9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzEweDEwX0Zvcm1hdCB8fFxyXG5cdFx0XHRwID09PSBSR0JBX0FTVENfMTJ4MTBfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ18xMngxMl9Gb3JtYXQgKSB7XHJcblxyXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9hc3RjJyApO1xyXG5cclxuXHRcdFx0aWYgKCBleHRlbnNpb24gIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9BU1RDXzR4NF9Gb3JtYXQgKSByZXR1cm4gKCB0cmFuc2ZlciA9PT0gU1JHQlRyYW5zZmVyICkgPyBleHRlbnNpb24uQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ180eDRfS0hSIDogZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9BU1RDXzR4NF9LSFI7XHJcblx0XHRcdFx0aWYgKCBwID09PSBSR0JBX0FTVENfNXg0X0Zvcm1hdCApIHJldHVybiAoIHRyYW5zZmVyID09PSBTUkdCVHJhbnNmZXIgKSA/IGV4dGVuc2lvbi5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzV4NF9LSFIgOiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX0FTVENfNXg0X0tIUjtcclxuXHRcdFx0XHRpZiAoIHAgPT09IFJHQkFfQVNUQ181eDVfRm9ybWF0ICkgcmV0dXJuICggdHJhbnNmZXIgPT09IFNSR0JUcmFuc2ZlciApID8gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfNXg1X0tIUiA6IGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfQVNUQ181eDVfS0hSO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9BU1RDXzZ4NV9Gb3JtYXQgKSByZXR1cm4gKCB0cmFuc2ZlciA9PT0gU1JHQlRyYW5zZmVyICkgPyBleHRlbnNpb24uQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ182eDVfS0hSIDogZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9BU1RDXzZ4NV9LSFI7XHJcblx0XHRcdFx0aWYgKCBwID09PSBSR0JBX0FTVENfNng2X0Zvcm1hdCApIHJldHVybiAoIHRyYW5zZmVyID09PSBTUkdCVHJhbnNmZXIgKSA/IGV4dGVuc2lvbi5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzZ4Nl9LSFIgOiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX0FTVENfNng2X0tIUjtcclxuXHRcdFx0XHRpZiAoIHAgPT09IFJHQkFfQVNUQ184eDVfRm9ybWF0ICkgcmV0dXJuICggdHJhbnNmZXIgPT09IFNSR0JUcmFuc2ZlciApID8gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfOHg1X0tIUiA6IGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfQVNUQ184eDVfS0hSO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9BU1RDXzh4Nl9Gb3JtYXQgKSByZXR1cm4gKCB0cmFuc2ZlciA9PT0gU1JHQlRyYW5zZmVyICkgPyBleHRlbnNpb24uQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ184eDZfS0hSIDogZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9BU1RDXzh4Nl9LSFI7XHJcblx0XHRcdFx0aWYgKCBwID09PSBSR0JBX0FTVENfOHg4X0Zvcm1hdCApIHJldHVybiAoIHRyYW5zZmVyID09PSBTUkdCVHJhbnNmZXIgKSA/IGV4dGVuc2lvbi5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzh4OF9LSFIgOiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX0FTVENfOHg4X0tIUjtcclxuXHRcdFx0XHRpZiAoIHAgPT09IFJHQkFfQVNUQ18xMHg1X0Zvcm1hdCApIHJldHVybiAoIHRyYW5zZmVyID09PSBTUkdCVHJhbnNmZXIgKSA/IGV4dGVuc2lvbi5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzEweDVfS0hSIDogZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9BU1RDXzEweDVfS0hSO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9BU1RDXzEweDZfRm9ybWF0ICkgcmV0dXJuICggdHJhbnNmZXIgPT09IFNSR0JUcmFuc2ZlciApID8gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfMTB4Nl9LSFIgOiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX0FTVENfMTB4Nl9LSFI7XHJcblx0XHRcdFx0aWYgKCBwID09PSBSR0JBX0FTVENfMTB4OF9Gb3JtYXQgKSByZXR1cm4gKCB0cmFuc2ZlciA9PT0gU1JHQlRyYW5zZmVyICkgPyBleHRlbnNpb24uQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ18xMHg4X0tIUiA6IGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfQVNUQ18xMHg4X0tIUjtcclxuXHRcdFx0XHRpZiAoIHAgPT09IFJHQkFfQVNUQ18xMHgxMF9Gb3JtYXQgKSByZXR1cm4gKCB0cmFuc2ZlciA9PT0gU1JHQlRyYW5zZmVyICkgPyBleHRlbnNpb24uQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ18xMHgxMF9LSFIgOiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX0FTVENfMTB4MTBfS0hSO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9BU1RDXzEyeDEwX0Zvcm1hdCApIHJldHVybiAoIHRyYW5zZmVyID09PSBTUkdCVHJhbnNmZXIgKSA/IGV4dGVuc2lvbi5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzEyeDEwX0tIUiA6IGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfQVNUQ18xMngxMF9LSFI7XHJcblx0XHRcdFx0aWYgKCBwID09PSBSR0JBX0FTVENfMTJ4MTJfRm9ybWF0ICkgcmV0dXJuICggdHJhbnNmZXIgPT09IFNSR0JUcmFuc2ZlciApID8gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfMTJ4MTJfS0hSIDogZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9BU1RDXzEyeDEyX0tIUjtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHJldHVybiBudWxsO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBCUFRDXHJcblxyXG5cdFx0aWYgKCBwID09PSBSR0JBX0JQVENfRm9ybWF0IHx8IHAgPT09IFJHQl9CUFRDX1NJR05FRF9Gb3JtYXQgfHwgcCA9PT0gUkdCX0JQVENfVU5TSUdORURfRm9ybWF0ICkge1xyXG5cclxuXHRcdFx0ZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdFWFRfdGV4dHVyZV9jb21wcmVzc2lvbl9icHRjJyApO1xyXG5cclxuXHRcdFx0aWYgKCBleHRlbnNpb24gIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9CUFRDX0Zvcm1hdCApIHJldHVybiAoIHRyYW5zZmVyID09PSBTUkdCVHJhbnNmZXIgKSA/IGV4dGVuc2lvbi5DT01QUkVTU0VEX1NSR0JfQUxQSEFfQlBUQ19VTk9STV9FWFQgOiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX0JQVENfVU5PUk1fRVhUO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCX0JQVENfU0lHTkVEX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JfQlBUQ19TSUdORURfRkxPQVRfRVhUO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCX0JQVENfVU5TSUdORURfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQl9CUFRDX1VOU0lHTkVEX0ZMT0FUX0VYVDtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHJldHVybiBudWxsO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBSR1RDXHJcblxyXG5cdFx0aWYgKCBwID09PSBSRURfUkdUQzFfRm9ybWF0IHx8IHAgPT09IFNJR05FRF9SRURfUkdUQzFfRm9ybWF0IHx8IHAgPT09IFJFRF9HUkVFTl9SR1RDMl9Gb3JtYXQgfHwgcCA9PT0gU0lHTkVEX1JFRF9HUkVFTl9SR1RDMl9Gb3JtYXQgKSB7XHJcblxyXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ0VYVF90ZXh0dXJlX2NvbXByZXNzaW9uX3JndGMnICk7XHJcblxyXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBwID09PSBSR0JBX0JQVENfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JFRF9SR1RDMV9FWFQ7XHJcblx0XHRcdFx0aWYgKCBwID09PSBTSUdORURfUkVEX1JHVEMxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9TSUdORURfUkVEX1JHVEMxX0VYVDtcclxuXHRcdFx0XHRpZiAoIHAgPT09IFJFRF9HUkVFTl9SR1RDMl9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkVEX0dSRUVOX1JHVEMyX0VYVDtcclxuXHRcdFx0XHRpZiAoIHAgPT09IFNJR05FRF9SRURfR1JFRU5fUkdUQzJfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1NJR05FRF9SRURfR1JFRU5fUkdUQzJfRVhUO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0cmV0dXJuIG51bGw7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0aWYgKCBwID09PSBVbnNpZ25lZEludDI0OFR5cGUgKSByZXR1cm4gZ2wuVU5TSUdORURfSU5UXzI0Xzg7XHJcblxyXG5cdFx0Ly8gaWYgXCJwXCIgY2FuJ3QgYmUgcmVzb2x2ZWQsIGFzc3VtZSB0aGUgdXNlciBkZWZpbmVzIGEgV2ViR0wgY29uc3RhbnQgYXMgYSBzdHJpbmcgKGZhbGxiYWNrL3dvcmthcm91bmQgZm9yIHBhY2tlZCBSR0IgZm9ybWF0cylcclxuXHJcblx0XHRyZXR1cm4gKCBnbFsgcCBdICE9PSB1bmRlZmluZWQgKSA/IGdsWyBwIF0gOiBudWxsO1xyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiB7IGNvbnZlcnQ6IGNvbnZlcnQgfTtcclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBXZWJHTFV0aWxzIH07XHJcbiIsImltcG9ydCB7IFBsYW5lR2VvbWV0cnkgfSBmcm9tICcuLi8uLi9nZW9tZXRyaWVzL1BsYW5lR2VvbWV0cnkuanMnO1xyXG5pbXBvcnQgeyBTaGFkZXJNYXRlcmlhbCB9IGZyb20gJy4uLy4uL21hdGVyaWFscy9TaGFkZXJNYXRlcmlhbC5qcyc7XHJcbmltcG9ydCB7IE1lc2ggfSBmcm9tICcuLi8uLi9vYmplY3RzL01lc2guanMnO1xyXG5pbXBvcnQgeyBUZXh0dXJlIH0gZnJvbSAnLi4vLi4vdGV4dHVyZXMvVGV4dHVyZS5qcyc7XHJcblxyXG5jb25zdCBfb2NjbHVzaW9uX3ZlcnRleCA9IGBcclxudm9pZCBtYWluKCkge1xyXG5cclxuXHRnbF9Qb3NpdGlvbiA9IHZlYzQoIHBvc2l0aW9uLCAxLjAgKTtcclxuXHJcbn1gO1xyXG5cclxuY29uc3QgX29jY2x1c2lvbl9mcmFnbWVudCA9IGBcclxudW5pZm9ybSBzYW1wbGVyMkRBcnJheSBkZXB0aENvbG9yO1xyXG51bmlmb3JtIGZsb2F0IGRlcHRoV2lkdGg7XHJcbnVuaWZvcm0gZmxvYXQgZGVwdGhIZWlnaHQ7XHJcblxyXG52b2lkIG1haW4oKSB7XHJcblxyXG5cdHZlYzIgY29vcmQgPSB2ZWMyKCBnbF9GcmFnQ29vcmQueCAvIGRlcHRoV2lkdGgsIGdsX0ZyYWdDb29yZC55IC8gZGVwdGhIZWlnaHQgKTtcclxuXHJcblx0aWYgKCBjb29yZC54ID49IDEuMCApIHtcclxuXHJcblx0XHRnbF9GcmFnRGVwdGggPSB0ZXh0dXJlKCBkZXB0aENvbG9yLCB2ZWMzKCBjb29yZC54IC0gMS4wLCBjb29yZC55LCAxICkgKS5yO1xyXG5cclxuXHR9IGVsc2Uge1xyXG5cclxuXHRcdGdsX0ZyYWdEZXB0aCA9IHRleHR1cmUoIGRlcHRoQ29sb3IsIHZlYzMoIGNvb3JkLngsIGNvb3JkLnksIDAgKSApLnI7XHJcblxyXG5cdH1cclxuXHJcbn1gO1xyXG5cclxuLyoqXHJcbiAqIEEgWFIgbW9kdWxlIHRoYXQgbWFuYWdlcyB0aGUgYWNjZXNzIHRvIHRoZSBEZXB0aCBTZW5zaW5nIEFQSS5cclxuICovXHJcbmNsYXNzIFdlYlhSRGVwdGhTZW5zaW5nIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBkZXB0aCBzZW5zaW5nIG1vZHVsZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgdGV4dHVyZSByZXByZXNlbnRpbmcgdGhlIGRlcHRoIG9mIHRoZSB1c2VyJ3MgZW52aXJvbm1lbnQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRleHR1cmUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBwbGFuZSBtZXNoIGZvciB2aXN1YWxpemluZyB0aGUgZGVwdGggdGV4dHVyZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P01lc2h9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWVzaCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZGVwdGggbmVhciB2YWx1ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRlcHRoTmVhciA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZGVwdGggbmVhciBmYXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kZXB0aEZhciA9IDA7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW5pdHMgdGhlIGRlcHRoIHNlbnNpbmcgbW9kdWxlXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7WFJXZWJHTERlcHRoSW5mb3JtYXRpb259IGRlcHRoRGF0YSAtIFRoZSBYUiBkZXB0aCBkYXRhLlxyXG5cdCAqIEBwYXJhbSB7WFJSZW5kZXJTdGF0ZX0gcmVuZGVyU3RhdGUgLSBUaGUgWFIgcmVuZGVyIHN0YXRlLlxyXG5cdCAqL1xyXG5cdGluaXQoIHJlbmRlcmVyLCBkZXB0aERhdGEsIHJlbmRlclN0YXRlICkge1xyXG5cclxuXHRcdGlmICggdGhpcy50ZXh0dXJlID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdGV4dHVyZSA9IG5ldyBUZXh0dXJlKCk7XHJcblxyXG5cdFx0XHRjb25zdCB0ZXhQcm9wcyA9IHJlbmRlcmVyLnByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICk7XHJcblx0XHRcdHRleFByb3BzLl9fd2ViZ2xUZXh0dXJlID0gZGVwdGhEYXRhLnRleHR1cmU7XHJcblxyXG5cdFx0XHRpZiAoICggZGVwdGhEYXRhLmRlcHRoTmVhciAhPT0gcmVuZGVyU3RhdGUuZGVwdGhOZWFyICkgfHwgKCBkZXB0aERhdGEuZGVwdGhGYXIgIT09IHJlbmRlclN0YXRlLmRlcHRoRmFyICkgKSB7XHJcblxyXG5cdFx0XHRcdHRoaXMuZGVwdGhOZWFyID0gZGVwdGhEYXRhLmRlcHRoTmVhcjtcclxuXHRcdFx0XHR0aGlzLmRlcHRoRmFyID0gZGVwdGhEYXRhLmRlcHRoRmFyO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy50ZXh0dXJlID0gdGV4dHVyZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIHBsYW5lIG1lc2ggdGhhdCB2aXN1YWxpemVzIHRoZSBkZXB0aCB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheUNhbWVyYX0gY2FtZXJhWFIgLSBUaGUgWFIgY2FtZXJhLlxyXG5cdCAqIEByZXR1cm4gez9NZXNofSBUaGUgcGxhbmUgbWVzaC5cclxuXHQgKi9cclxuXHRnZXRNZXNoKCBjYW1lcmFYUiApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMudGV4dHVyZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGlmICggdGhpcy5tZXNoID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB2aWV3cG9ydCA9IGNhbWVyYVhSLmNhbWVyYXNbIDAgXS52aWV3cG9ydDtcclxuXHRcdFx0XHRjb25zdCBtYXRlcmlhbCA9IG5ldyBTaGFkZXJNYXRlcmlhbCgge1xyXG5cdFx0XHRcdFx0dmVydGV4U2hhZGVyOiBfb2NjbHVzaW9uX3ZlcnRleCxcclxuXHRcdFx0XHRcdGZyYWdtZW50U2hhZGVyOiBfb2NjbHVzaW9uX2ZyYWdtZW50LFxyXG5cdFx0XHRcdFx0dW5pZm9ybXM6IHtcclxuXHRcdFx0XHRcdFx0ZGVwdGhDb2xvcjogeyB2YWx1ZTogdGhpcy50ZXh0dXJlIH0sXHJcblx0XHRcdFx0XHRcdGRlcHRoV2lkdGg6IHsgdmFsdWU6IHZpZXdwb3J0LnogfSxcclxuXHRcdFx0XHRcdFx0ZGVwdGhIZWlnaHQ6IHsgdmFsdWU6IHZpZXdwb3J0LncgfVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gKTtcclxuXHJcblx0XHRcdFx0dGhpcy5tZXNoID0gbmV3IE1lc2goIG5ldyBQbGFuZUdlb21ldHJ5KCAyMCwgMjAgKSwgbWF0ZXJpYWwgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubWVzaDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXNldHMgdGhlIG1vZHVsZVxyXG5cdCAqL1xyXG5cdHJlc2V0KCkge1xyXG5cclxuXHRcdHRoaXMudGV4dHVyZSA9IG51bGw7XHJcblx0XHR0aGlzLm1lc2ggPSBudWxsO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSB0ZXh0dXJlIHJlcHJlc2VudGluZyB0aGUgZGVwdGggb2YgdGhlIHVzZXIncyBlbnZpcm9ubWVudC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4gez9UZXh0dXJlfSBUaGUgZGVwdGggdGV4dHVyZS5cclxuXHQgKi9cclxuXHRnZXREZXB0aFRleHR1cmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMudGV4dHVyZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgV2ViWFJEZXB0aFNlbnNpbmcgfTtcclxuIiwiaW1wb3J0IHsgQXJyYXlDYW1lcmEgfSBmcm9tICcuLi8uLi9jYW1lcmFzL0FycmF5Q2FtZXJhLmpzJztcclxuaW1wb3J0IHsgRXZlbnREaXNwYXRjaGVyIH0gZnJvbSAnLi4vLi4vY29yZS9FdmVudERpc3BhdGNoZXIuanMnO1xyXG5pbXBvcnQgeyBQZXJzcGVjdGl2ZUNhbWVyYSB9IGZyb20gJy4uLy4uL2NhbWVyYXMvUGVyc3BlY3RpdmVDYW1lcmEuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IyLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjQgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjQuanMnO1xyXG5pbXBvcnQgeyBSQUQyREVHIH0gZnJvbSAnLi4vLi4vbWF0aC9NYXRoVXRpbHMuanMnO1xyXG5pbXBvcnQgeyBXZWJHTEFuaW1hdGlvbiB9IGZyb20gJy4uL3dlYmdsL1dlYkdMQW5pbWF0aW9uLmpzJztcclxuaW1wb3J0IHsgV2ViR0xSZW5kZXJUYXJnZXQgfSBmcm9tICcuLi9XZWJHTFJlbmRlclRhcmdldC5qcyc7XHJcbmltcG9ydCB7IFdlYlhSQ29udHJvbGxlciB9IGZyb20gJy4vV2ViWFJDb250cm9sbGVyLmpzJztcclxuaW1wb3J0IHsgRGVwdGhUZXh0dXJlIH0gZnJvbSAnLi4vLi4vdGV4dHVyZXMvRGVwdGhUZXh0dXJlLmpzJztcclxuaW1wb3J0IHsgRGVwdGhGb3JtYXQsIERlcHRoU3RlbmNpbEZvcm1hdCwgUkdCQUZvcm1hdCwgVW5zaWduZWRCeXRlVHlwZSwgVW5zaWduZWRJbnRUeXBlLCBVbnNpZ25lZEludDI0OFR5cGUgfSBmcm9tICcuLi8uLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBXZWJYUkRlcHRoU2Vuc2luZyB9IGZyb20gJy4vV2ViWFJEZXB0aFNlbnNpbmcuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBhYnN0cmFjdGlvbiBvZiB0aGUgV2ViWFIgRGV2aWNlIEFQSSBhbmQgaXNcclxuICogaW50ZXJuYWxseSB1c2VkIGJ5IHtAbGluayBXZWJHTFJlbmRlcmVyfS4gYFdlYlhSTWFuYWdlcmAgYWxzbyBwcm92aWRlcyBhIHB1YmxpY1xyXG4gKiBpbnRlcmZhY2UgdGhhdCBhbGxvd3MgdXNlcnMgdG8gZW5hYmxlL2Rpc2FibGUgWFIgYW5kIHBlcmZvcm0gWFIgcmVsYXRlZFxyXG4gKiB0YXNrcyBsaWtlIGZvciBpbnN0YW5jZSByZXRyaWV2aW5nIGNvbnRyb2xsZXJzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgRXZlbnREaXNwYXRjaGVyXHJcbiAqIEBoaWRlY29uc3RydWN0b3JcclxuICovXHJcbmNsYXNzIFdlYlhSTWFuYWdlciBleHRlbmRzIEV2ZW50RGlzcGF0Y2hlciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgV2ViR0wgcmVuZGVyZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0wyUmVuZGVyaW5nQ29udGV4dH0gZ2wgLSBUaGUgcmVuZGVyaW5nIGNvbnRleHQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHJlbmRlcmVyLCBnbCApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdGNvbnN0IHNjb3BlID0gdGhpcztcclxuXHJcblx0XHRsZXQgc2Vzc2lvbiA9IG51bGw7XHJcblxyXG5cdFx0bGV0IGZyYW1lYnVmZmVyU2NhbGVGYWN0b3IgPSAxLjA7XHJcblxyXG5cdFx0bGV0IHJlZmVyZW5jZVNwYWNlID0gbnVsbDtcclxuXHRcdGxldCByZWZlcmVuY2VTcGFjZVR5cGUgPSAnbG9jYWwtZmxvb3InO1xyXG5cdFx0Ly8gU2V0IGRlZmF1bHQgZm92ZWF0aW9uIHRvIG1heGltdW0uXHJcblx0XHRsZXQgZm92ZWF0aW9uID0gMS4wO1xyXG5cdFx0bGV0IGN1c3RvbVJlZmVyZW5jZVNwYWNlID0gbnVsbDtcclxuXHJcblx0XHRsZXQgcG9zZSA9IG51bGw7XHJcblx0XHRsZXQgZ2xCaW5kaW5nID0gbnVsbDtcclxuXHRcdGxldCBnbFByb2pMYXllciA9IG51bGw7XHJcblx0XHRsZXQgZ2xCYXNlTGF5ZXIgPSBudWxsO1xyXG5cdFx0bGV0IHhyRnJhbWUgPSBudWxsO1xyXG5cclxuXHRcdGNvbnN0IGRlcHRoU2Vuc2luZyA9IG5ldyBXZWJYUkRlcHRoU2Vuc2luZygpO1xyXG5cdFx0Y29uc3QgYXR0cmlidXRlcyA9IGdsLmdldENvbnRleHRBdHRyaWJ1dGVzKCk7XHJcblxyXG5cdFx0bGV0IGluaXRpYWxSZW5kZXJUYXJnZXQgPSBudWxsO1xyXG5cdFx0bGV0IG5ld1JlbmRlclRhcmdldCA9IG51bGw7XHJcblxyXG5cdFx0Y29uc3QgY29udHJvbGxlcnMgPSBbXTtcclxuXHRcdGNvbnN0IGNvbnRyb2xsZXJJbnB1dFNvdXJjZXMgPSBbXTtcclxuXHJcblx0XHRjb25zdCBjdXJyZW50U2l6ZSA9IG5ldyBWZWN0b3IyKCk7XHJcblx0XHRsZXQgY3VycmVudFBpeGVsUmF0aW8gPSBudWxsO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0Y29uc3QgY2FtZXJhTCA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSgpO1xyXG5cdFx0Y2FtZXJhTC52aWV3cG9ydCA9IG5ldyBWZWN0b3I0KCk7XHJcblxyXG5cdFx0Y29uc3QgY2FtZXJhUiA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSgpO1xyXG5cdFx0Y2FtZXJhUi52aWV3cG9ydCA9IG5ldyBWZWN0b3I0KCk7XHJcblxyXG5cdFx0Y29uc3QgY2FtZXJhcyA9IFsgY2FtZXJhTCwgY2FtZXJhUiBdO1xyXG5cclxuXHRcdGNvbnN0IGNhbWVyYVhSID0gbmV3IEFycmF5Q2FtZXJhKCk7XHJcblxyXG5cdFx0bGV0IF9jdXJyZW50RGVwdGhOZWFyID0gbnVsbDtcclxuXHRcdGxldCBfY3VycmVudERlcHRoRmFyID0gbnVsbDtcclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgbWFuYWdlcidzIFhSIGNhbWVyYSBzaG91bGQgYmUgYXV0b21hdGljYWxseSB1cGRhdGVkIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jYW1lcmFBdXRvVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBub3RpZmllcyB0aGUgcmVuZGVyZXIgdG8gYmUgcmVhZHkgZm9yIFhSIHJlbmRlcmluZy4gU2V0IGl0IHRvIGB0cnVlYFxyXG5cdFx0ICogaWYgeW91IGFyZSBnb2luZyB0byB1c2UgWFIgaW4geW91ciBhcHAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmVuYWJsZWQgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgWFIgcHJlc2VudGF0aW9uIGlzIGFjdGl2ZSBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNQcmVzZW50aW5nID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXR1cm5zIGEgZ3JvdXAgcmVwcmVzZW50aW5nIHRoZSBgdGFyZ2V0IHJheWAgc3BhY2Ugb2YgdGhlIFhSIGNvbnRyb2xsZXIuXHJcblx0XHQgKiBVc2UgdGhpcyBzcGFjZSBmb3IgdmlzdWFsaXppbmcgM0Qgb2JqZWN0cyB0aGF0IHN1cHBvcnQgdGhlIHVzZXIgaW4gcG9pbnRpbmdcclxuXHRcdCAqIHRhc2tzIGxpa2UgVUkgaW50ZXJhY3Rpb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluZGV4IG9mIHRoZSBjb250cm9sbGVyLlxyXG5cdFx0ICogQHJldHVybiB7R3JvdXB9IEEgZ3JvdXAgcmVwcmVzZW50aW5nIHRoZSBgdGFyZ2V0IHJheWAgc3BhY2UuXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ2V0Q29udHJvbGxlciA9IGZ1bmN0aW9uICggaW5kZXggKSB7XHJcblxyXG5cdFx0XHRsZXQgY29udHJvbGxlciA9IGNvbnRyb2xsZXJzWyBpbmRleCBdO1xyXG5cclxuXHRcdFx0aWYgKCBjb250cm9sbGVyID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnRyb2xsZXIgPSBuZXcgV2ViWFJDb250cm9sbGVyKCk7XHJcblx0XHRcdFx0Y29udHJvbGxlcnNbIGluZGV4IF0gPSBjb250cm9sbGVyO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIGNvbnRyb2xsZXIuZ2V0VGFyZ2V0UmF5U3BhY2UoKTtcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmV0dXJucyBhIGdyb3VwIHJlcHJlc2VudGluZyB0aGUgYGdyaXBgIHNwYWNlIG9mIHRoZSBYUiBjb250cm9sbGVyLlxyXG5cdFx0ICogVXNlIHRoaXMgc3BhY2UgZm9yIHZpc3VhbGl6aW5nIDNEIG9iamVjdHMgdGhhdCBzdXBwb3J0IHRoZSB1c2VyIGluIHBvaW50aW5nXHJcblx0XHQgKiB0YXNrcyBsaWtlIFVJIGludGVyYWN0aW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIE5vdGU6IElmIHlvdSB3YW50IHRvIHNob3cgc29tZXRoaW5nIGluIHRoZSB1c2VyJ3MgaGFuZCBBTkQgb2ZmZXIgYVxyXG5cdFx0ICogcG9pbnRpbmcgcmF5IGF0IHRoZSBzYW1lIHRpbWUsIHlvdSdsbCB3YW50IHRvIGF0dGFjaGVkIHRoZSBoYW5kaGVsZCBvYmplY3RcclxuXHRcdCAqIHRvIHRoZSBncm91cCByZXR1cm5lZCBieSBgZ2V0Q29udHJvbGxlckdyaXAoKWAgYW5kIHRoZSByYXkgdG8gdGhlXHJcblx0XHQgKiBncm91cCByZXR1cm5lZCBieSBgZ2V0Q29udHJvbGxlcigpYC4gVGhlIGlkZWEgaXMgdG8gaGF2ZSB0d29cclxuXHRcdCAqIGRpZmZlcmVudCBncm91cHMgaW4gdHdvIGRpZmZlcmVudCBjb29yZGluYXRlIHNwYWNlcyBmb3IgdGhlIHNhbWUgV2ViWFJcclxuXHRcdCAqIGNvbnRyb2xsZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluZGV4IG9mIHRoZSBjb250cm9sbGVyLlxyXG5cdFx0ICogQHJldHVybiB7R3JvdXB9IEEgZ3JvdXAgcmVwcmVzZW50aW5nIHRoZSBgZ3JpcGAgc3BhY2UuXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ2V0Q29udHJvbGxlckdyaXAgPSBmdW5jdGlvbiAoIGluZGV4ICkge1xyXG5cclxuXHRcdFx0bGV0IGNvbnRyb2xsZXIgPSBjb250cm9sbGVyc1sgaW5kZXggXTtcclxuXHJcblx0XHRcdGlmICggY29udHJvbGxlciA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRjb250cm9sbGVyID0gbmV3IFdlYlhSQ29udHJvbGxlcigpO1xyXG5cdFx0XHRcdGNvbnRyb2xsZXJzWyBpbmRleCBdID0gY29udHJvbGxlcjtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBjb250cm9sbGVyLmdldEdyaXBTcGFjZSgpO1xyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXR1cm5zIGEgZ3JvdXAgcmVwcmVzZW50aW5nIHRoZSBgaGFuZGAgc3BhY2Ugb2YgdGhlIFhSIGNvbnRyb2xsZXIuXHJcblx0XHQgKiBVc2UgdGhpcyBzcGFjZSBmb3IgdmlzdWFsaXppbmcgM0Qgb2JqZWN0cyB0aGF0IHN1cHBvcnQgdGhlIHVzZXIgaW4gcG9pbnRpbmdcclxuXHRcdCAqIHRhc2tzIGxpa2UgVUkgaW50ZXJhY3Rpb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIGluZGV4IG9mIHRoZSBjb250cm9sbGVyLlxyXG5cdFx0ICogQHJldHVybiB7R3JvdXB9IEEgZ3JvdXAgcmVwcmVzZW50aW5nIHRoZSBgaGFuZGAgc3BhY2UuXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ2V0SGFuZCA9IGZ1bmN0aW9uICggaW5kZXggKSB7XHJcblxyXG5cdFx0XHRsZXQgY29udHJvbGxlciA9IGNvbnRyb2xsZXJzWyBpbmRleCBdO1xyXG5cclxuXHRcdFx0aWYgKCBjb250cm9sbGVyID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnRyb2xsZXIgPSBuZXcgV2ViWFJDb250cm9sbGVyKCk7XHJcblx0XHRcdFx0Y29udHJvbGxlcnNbIGluZGV4IF0gPSBjb250cm9sbGVyO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIGNvbnRyb2xsZXIuZ2V0SGFuZFNwYWNlKCk7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGZ1bmN0aW9uIG9uU2Vzc2lvbkV2ZW50KCBldmVudCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGNvbnRyb2xsZXJJbmRleCA9IGNvbnRyb2xsZXJJbnB1dFNvdXJjZXMuaW5kZXhPZiggZXZlbnQuaW5wdXRTb3VyY2UgKTtcclxuXHJcblx0XHRcdGlmICggY29udHJvbGxlckluZGV4ID09PSAtIDEgKSB7XHJcblxyXG5cdFx0XHRcdHJldHVybjtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IGNvbnRyb2xsZXIgPSBjb250cm9sbGVyc1sgY29udHJvbGxlckluZGV4IF07XHJcblxyXG5cdFx0XHRpZiAoIGNvbnRyb2xsZXIgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0Y29udHJvbGxlci51cGRhdGUoIGV2ZW50LmlucHV0U291cmNlLCBldmVudC5mcmFtZSwgY3VzdG9tUmVmZXJlbmNlU3BhY2UgfHwgcmVmZXJlbmNlU3BhY2UgKTtcclxuXHRcdFx0XHRjb250cm9sbGVyLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogZXZlbnQudHlwZSwgZGF0YTogZXZlbnQuaW5wdXRTb3VyY2UgfSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiBvblNlc3Npb25FbmQoKSB7XHJcblxyXG5cdFx0XHRzZXNzaW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdzZWxlY3QnLCBvblNlc3Npb25FdmVudCApO1xyXG5cdFx0XHRzZXNzaW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdzZWxlY3RzdGFydCcsIG9uU2Vzc2lvbkV2ZW50ICk7XHJcblx0XHRcdHNlc3Npb24ucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3NlbGVjdGVuZCcsIG9uU2Vzc2lvbkV2ZW50ICk7XHJcblx0XHRcdHNlc3Npb24ucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3NxdWVlemUnLCBvblNlc3Npb25FdmVudCApO1xyXG5cdFx0XHRzZXNzaW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdzcXVlZXplc3RhcnQnLCBvblNlc3Npb25FdmVudCApO1xyXG5cdFx0XHRzZXNzaW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdzcXVlZXplZW5kJywgb25TZXNzaW9uRXZlbnQgKTtcclxuXHRcdFx0c2Vzc2lvbi5yZW1vdmVFdmVudExpc3RlbmVyKCAnZW5kJywgb25TZXNzaW9uRW5kICk7XHJcblx0XHRcdHNlc3Npb24ucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2lucHV0c291cmNlc2NoYW5nZScsIG9uSW5wdXRTb3VyY2VzQ2hhbmdlICk7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBjb250cm9sbGVycy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGlucHV0U291cmNlID0gY29udHJvbGxlcklucHV0U291cmNlc1sgaSBdO1xyXG5cclxuXHRcdFx0XHRpZiAoIGlucHV0U291cmNlID09PSBudWxsICkgY29udGludWU7XHJcblxyXG5cdFx0XHRcdGNvbnRyb2xsZXJJbnB1dFNvdXJjZXNbIGkgXSA9IG51bGw7XHJcblxyXG5cdFx0XHRcdGNvbnRyb2xsZXJzWyBpIF0uZGlzY29ubmVjdCggaW5wdXRTb3VyY2UgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdF9jdXJyZW50RGVwdGhOZWFyID0gbnVsbDtcclxuXHRcdFx0X2N1cnJlbnREZXB0aEZhciA9IG51bGw7XHJcblxyXG5cdFx0XHRkZXB0aFNlbnNpbmcucmVzZXQoKTtcclxuXHJcblx0XHRcdC8vIHJlc3RvcmUgZnJhbWVidWZmZXIvcmVuZGVyaW5nIHN0YXRlXHJcblxyXG5cdFx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIGluaXRpYWxSZW5kZXJUYXJnZXQgKTtcclxuXHJcblx0XHRcdGdsQmFzZUxheWVyID0gbnVsbDtcclxuXHRcdFx0Z2xQcm9qTGF5ZXIgPSBudWxsO1xyXG5cdFx0XHRnbEJpbmRpbmcgPSBudWxsO1xyXG5cdFx0XHRzZXNzaW9uID0gbnVsbDtcclxuXHRcdFx0bmV3UmVuZGVyVGFyZ2V0ID0gbnVsbDtcclxuXHJcblx0XHRcdC8vXHJcblxyXG5cdFx0XHRhbmltYXRpb24uc3RvcCgpO1xyXG5cclxuXHRcdFx0c2NvcGUuaXNQcmVzZW50aW5nID0gZmFsc2U7XHJcblxyXG5cdFx0XHRyZW5kZXJlci5zZXRQaXhlbFJhdGlvKCBjdXJyZW50UGl4ZWxSYXRpbyApO1xyXG5cdFx0XHRyZW5kZXJlci5zZXRTaXplKCBjdXJyZW50U2l6ZS53aWR0aCwgY3VycmVudFNpemUuaGVpZ2h0LCBmYWxzZSApO1xyXG5cclxuXHRcdFx0c2NvcGUuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnc2Vzc2lvbmVuZCcgfSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNldHMgdGhlIGZyYW1lYnVmZmVyIHNjYWxlIGZhY3Rvci5cclxuXHRcdCAqXHJcblx0XHQgKiBUaGlzIG1ldGhvZCBjYW4gbm90IGJlIHVzZWQgZHVyaW5nIGEgWFIgc2Vzc2lvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgZnJhbWVidWZmZXIgc2NhbGUgZmFjdG9yLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNldEZyYW1lYnVmZmVyU2NhbGVGYWN0b3IgPSBmdW5jdGlvbiAoIHZhbHVlICkge1xyXG5cclxuXHRcdFx0ZnJhbWVidWZmZXJTY2FsZUZhY3RvciA9IHZhbHVlO1xyXG5cclxuXHRcdFx0aWYgKCBzY29wZS5pc1ByZXNlbnRpbmcgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYlhSTWFuYWdlcjogQ2Fubm90IGNoYW5nZSBmcmFtZWJ1ZmZlciBzY2FsZSB3aGlsZSBwcmVzZW50aW5nLicgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU2V0cyB0aGUgcmVmZXJlbmNlIHNwYWNlIHR5cGUuIENhbiBiZSB1c2VkIHRvIGNvbmZpZ3VyZSBhIHNwYXRpYWwgcmVsYXRpb25zaGlwIHdpdGggdGhlIHVzZXIncyBwaHlzaWNhbFxyXG5cdFx0ICogZW52aXJvbm1lbnQuIERlcGVuZGluZyBvbiBob3cgdGhlIHVzZXIgbW92ZXMgaW4gM0Qgc3BhY2UsIHNldHRpbmcgYW4gYXBwcm9wcmlhdGUgcmVmZXJlbmNlIHNwYWNlIGNhblxyXG5cdFx0ICogaW1wcm92ZSB0cmFja2luZy4gRGVmYXVsdCBpcyBgbG9jYWwtZmxvb3JgLlxyXG5cdFx0ICpcclxuXHRcdCAqIFRoaXMgbWV0aG9kIGNhbiBub3QgYmUgdXNlZCBkdXJpbmcgYSBYUiBzZXNzaW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFRoZSByZWZlcmVuY2Ugc3BhY2UgdHlwZS5cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zZXRSZWZlcmVuY2VTcGFjZVR5cGUgPSBmdW5jdGlvbiAoIHZhbHVlICkge1xyXG5cclxuXHRcdFx0cmVmZXJlbmNlU3BhY2VUeXBlID0gdmFsdWU7XHJcblxyXG5cdFx0XHRpZiAoIHNjb3BlLmlzUHJlc2VudGluZyA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViWFJNYW5hZ2VyOiBDYW5ub3QgY2hhbmdlIHJlZmVyZW5jZSBzcGFjZSB0eXBlIHdoaWxlIHByZXNlbnRpbmcuJyApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXR1cm5zIHRoZSBYUiByZWZlcmVuY2Ugc3BhY2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHJldHVybiB7WFJSZWZlcmVuY2VTcGFjZX0gVGhlIFhSIHJlZmVyZW5jZSBzcGFjZS5cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nZXRSZWZlcmVuY2VTcGFjZSA9IGZ1bmN0aW9uICgpIHtcclxuXHJcblx0XHRcdHJldHVybiBjdXN0b21SZWZlcmVuY2VTcGFjZSB8fCByZWZlcmVuY2VTcGFjZTtcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU2V0cyBhIGN1c3RvbSBYUiByZWZlcmVuY2Ugc3BhY2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtYUlJlZmVyZW5jZVNwYWNlfSBzcGFjZSAtIFRoZSBYUiByZWZlcmVuY2Ugc3BhY2UuXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2V0UmVmZXJlbmNlU3BhY2UgPSBmdW5jdGlvbiAoIHNwYWNlICkge1xyXG5cclxuXHRcdFx0Y3VzdG9tUmVmZXJlbmNlU3BhY2UgPSBzcGFjZTtcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmV0dXJucyB0aGUgY3VycmVudCBiYXNlIGxheWVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEByZXR1cm4gez8oWFJXZWJHTExheWVyfFhSUHJvamVjdGlvbkxheWVyKX0gVGhlIFhSIGJhc2UgbGF5ZXIuXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ2V0QmFzZUxheWVyID0gZnVuY3Rpb24gKCkge1xyXG5cclxuXHRcdFx0cmV0dXJuIGdsUHJvakxheWVyICE9PSBudWxsID8gZ2xQcm9qTGF5ZXIgOiBnbEJhc2VMYXllcjtcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmV0dXJucyB0aGUgY3VycmVudCBYUiBiaW5kaW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEByZXR1cm4gez9YUldlYkdMQmluZGluZ30gVGhlIFhSIGJpbmRpbmcuXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ2V0QmluZGluZyA9IGZ1bmN0aW9uICgpIHtcclxuXHJcblx0XHRcdHJldHVybiBnbEJpbmRpbmc7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJldHVybnMgdGhlIGN1cnJlbnQgWFIgZnJhbWUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHJldHVybiB7P1hSRnJhbWV9IFRoZSBYUiBmcmFtZS4gUmV0dXJucyBgbnVsbGAgd2hlbiB1c2VkIG91dHNpZGUgYSBYUiBzZXNzaW9uLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdldEZyYW1lID0gZnVuY3Rpb24gKCkge1xyXG5cclxuXHRcdFx0cmV0dXJuIHhyRnJhbWU7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJldHVybnMgdGhlIGN1cnJlbnQgWFIgc2Vzc2lvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAcmV0dXJuIHs/WFJTZXNzaW9ufSBUaGUgWFIgc2Vzc2lvbi4gUmV0dXJucyBgbnVsbGAgd2hlbiB1c2VkIG91dHNpZGUgYSBYUiBzZXNzaW9uLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdldFNlc3Npb24gPSBmdW5jdGlvbiAoKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gc2Vzc2lvbjtcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQWZ0ZXIgYSBYUiBzZXNzaW9uIGhhcyBiZWVuIHJlcXVlc3RlZCB1c3VhbGx5IHdpdGggb25lIG9mIHRoZSBgKkJ1dHRvbmAgbW9kdWxlcywgaXRcclxuXHRcdCAqIGlzIGluamVjdGVkIGludG8gdGhlIHJlbmRlcmVyIHdpdGggdGhpcyBtZXRob2QuIFRoaXMgbWV0aG9kIHRyaWdnZXJzIHRoZSBzdGFydCBvZlxyXG5cdFx0ICogdGhlIGFjdHVhbCBYUiByZW5kZXJpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQGFzeW5jXHJcblx0XHQgKiBAcGFyYW0ge1hSU2Vzc2lvbn0gdmFsdWUgLSBUaGUgWFIgc2Vzc2lvbiB0byBzZXQuXHJcblx0XHQgKiBAcmV0dXJuIHtQcm9taXNlfSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBzZXNzaW9uIGhhcyBiZWVuIHNldC5cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zZXRTZXNzaW9uID0gYXN5bmMgZnVuY3Rpb24gKCB2YWx1ZSApIHtcclxuXHJcblx0XHRcdHNlc3Npb24gPSB2YWx1ZTtcclxuXHJcblx0XHRcdGlmICggc2Vzc2lvbiAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0aW5pdGlhbFJlbmRlclRhcmdldCA9IHJlbmRlcmVyLmdldFJlbmRlclRhcmdldCgpO1xyXG5cclxuXHRcdFx0XHRzZXNzaW9uLmFkZEV2ZW50TGlzdGVuZXIoICdzZWxlY3QnLCBvblNlc3Npb25FdmVudCApO1xyXG5cdFx0XHRcdHNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lciggJ3NlbGVjdHN0YXJ0Jywgb25TZXNzaW9uRXZlbnQgKTtcclxuXHRcdFx0XHRzZXNzaW9uLmFkZEV2ZW50TGlzdGVuZXIoICdzZWxlY3RlbmQnLCBvblNlc3Npb25FdmVudCApO1xyXG5cdFx0XHRcdHNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lciggJ3NxdWVlemUnLCBvblNlc3Npb25FdmVudCApO1xyXG5cdFx0XHRcdHNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lciggJ3NxdWVlemVzdGFydCcsIG9uU2Vzc2lvbkV2ZW50ICk7XHJcblx0XHRcdFx0c2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCAnc3F1ZWV6ZWVuZCcsIG9uU2Vzc2lvbkV2ZW50ICk7XHJcblx0XHRcdFx0c2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCAnZW5kJywgb25TZXNzaW9uRW5kICk7XHJcblx0XHRcdFx0c2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCAnaW5wdXRzb3VyY2VzY2hhbmdlJywgb25JbnB1dFNvdXJjZXNDaGFuZ2UgKTtcclxuXHJcblx0XHRcdFx0aWYgKCBhdHRyaWJ1dGVzLnhyQ29tcGF0aWJsZSAhPT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0XHRhd2FpdCBnbC5tYWtlWFJDb21wYXRpYmxlKCk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Y3VycmVudFBpeGVsUmF0aW8gPSByZW5kZXJlci5nZXRQaXhlbFJhdGlvKCk7XHJcblx0XHRcdFx0cmVuZGVyZXIuZ2V0U2l6ZSggY3VycmVudFNpemUgKTtcclxuXHJcblx0XHRcdFx0Ly8gQ2hlY2sgdGhhdCB0aGUgYnJvd3NlciBpbXBsZW1lbnRzIHRoZSBuZWNlc3NhcnkgQVBJcyB0byB1c2UgYW5cclxuXHRcdFx0XHQvLyBYUlByb2plY3Rpb25MYXllciByYXRoZXIgdGhhbiBhbiBYUldlYkdMTGF5ZXJcclxuXHRcdFx0XHRjb25zdCB1c2VMYXllcnMgPSB0eXBlb2YgWFJXZWJHTEJpbmRpbmcgIT09ICd1bmRlZmluZWQnICYmICdjcmVhdGVQcm9qZWN0aW9uTGF5ZXInIGluIFhSV2ViR0xCaW5kaW5nLnByb3RvdHlwZTtcclxuXHJcblx0XHRcdFx0aWYgKCAhIHVzZUxheWVycyApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBsYXllckluaXQgPSB7XHJcblx0XHRcdFx0XHRcdGFudGlhbGlhczogYXR0cmlidXRlcy5hbnRpYWxpYXMsXHJcblx0XHRcdFx0XHRcdGFscGhhOiB0cnVlLFxyXG5cdFx0XHRcdFx0XHRkZXB0aDogYXR0cmlidXRlcy5kZXB0aCxcclxuXHRcdFx0XHRcdFx0c3RlbmNpbDogYXR0cmlidXRlcy5zdGVuY2lsLFxyXG5cdFx0XHRcdFx0XHRmcmFtZWJ1ZmZlclNjYWxlRmFjdG9yOiBmcmFtZWJ1ZmZlclNjYWxlRmFjdG9yXHJcblx0XHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0XHRcdGdsQmFzZUxheWVyID0gbmV3IFhSV2ViR0xMYXllciggc2Vzc2lvbiwgZ2wsIGxheWVySW5pdCApO1xyXG5cclxuXHRcdFx0XHRcdHNlc3Npb24udXBkYXRlUmVuZGVyU3RhdGUoIHsgYmFzZUxheWVyOiBnbEJhc2VMYXllciB9ICk7XHJcblxyXG5cdFx0XHRcdFx0cmVuZGVyZXIuc2V0UGl4ZWxSYXRpbyggMSApO1xyXG5cdFx0XHRcdFx0cmVuZGVyZXIuc2V0U2l6ZSggZ2xCYXNlTGF5ZXIuZnJhbWVidWZmZXJXaWR0aCwgZ2xCYXNlTGF5ZXIuZnJhbWVidWZmZXJIZWlnaHQsIGZhbHNlICk7XHJcblxyXG5cdFx0XHRcdFx0bmV3UmVuZGVyVGFyZ2V0ID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KFxyXG5cdFx0XHRcdFx0XHRnbEJhc2VMYXllci5mcmFtZWJ1ZmZlcldpZHRoLFxyXG5cdFx0XHRcdFx0XHRnbEJhc2VMYXllci5mcmFtZWJ1ZmZlckhlaWdodCxcclxuXHRcdFx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0XHRcdGZvcm1hdDogUkdCQUZvcm1hdCxcclxuXHRcdFx0XHRcdFx0XHR0eXBlOiBVbnNpZ25lZEJ5dGVUeXBlLFxyXG5cdFx0XHRcdFx0XHRcdGNvbG9yU3BhY2U6IHJlbmRlcmVyLm91dHB1dENvbG9yU3BhY2UsXHJcblx0XHRcdFx0XHRcdFx0c3RlbmNpbEJ1ZmZlcjogYXR0cmlidXRlcy5zdGVuY2lsLFxyXG5cdFx0XHRcdFx0XHRcdHJlc29sdmVEZXB0aEJ1ZmZlcjogKCBnbEJhc2VMYXllci5pZ25vcmVEZXB0aFZhbHVlcyA9PT0gZmFsc2UgKSxcclxuXHRcdFx0XHRcdFx0XHRyZXNvbHZlU3RlbmNpbEJ1ZmZlcjogKCBnbEJhc2VMYXllci5pZ25vcmVEZXB0aFZhbHVlcyA9PT0gZmFsc2UgKVxyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0KTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRsZXQgZGVwdGhGb3JtYXQgPSBudWxsO1xyXG5cdFx0XHRcdFx0bGV0IGRlcHRoVHlwZSA9IG51bGw7XHJcblx0XHRcdFx0XHRsZXQgZ2xEZXB0aEZvcm1hdCA9IG51bGw7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBhdHRyaWJ1dGVzLmRlcHRoICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Z2xEZXB0aEZvcm1hdCA9IGF0dHJpYnV0ZXMuc3RlbmNpbCA/IGdsLkRFUFRIMjRfU1RFTkNJTDggOiBnbC5ERVBUSF9DT01QT05FTlQyNDtcclxuXHRcdFx0XHRcdFx0ZGVwdGhGb3JtYXQgPSBhdHRyaWJ1dGVzLnN0ZW5jaWwgPyBEZXB0aFN0ZW5jaWxGb3JtYXQgOiBEZXB0aEZvcm1hdDtcclxuXHRcdFx0XHRcdFx0ZGVwdGhUeXBlID0gYXR0cmlidXRlcy5zdGVuY2lsID8gVW5zaWduZWRJbnQyNDhUeXBlIDogVW5zaWduZWRJbnRUeXBlO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRjb25zdCBwcm9qZWN0aW9ubGF5ZXJJbml0ID0ge1xyXG5cdFx0XHRcdFx0XHRjb2xvckZvcm1hdDogZ2wuUkdCQTgsXHJcblx0XHRcdFx0XHRcdGRlcHRoRm9ybWF0OiBnbERlcHRoRm9ybWF0LFxyXG5cdFx0XHRcdFx0XHRzY2FsZUZhY3RvcjogZnJhbWVidWZmZXJTY2FsZUZhY3RvclxyXG5cdFx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0XHRnbEJpbmRpbmcgPSBuZXcgWFJXZWJHTEJpbmRpbmcoIHNlc3Npb24sIGdsICk7XHJcblxyXG5cdFx0XHRcdFx0Z2xQcm9qTGF5ZXIgPSBnbEJpbmRpbmcuY3JlYXRlUHJvamVjdGlvbkxheWVyKCBwcm9qZWN0aW9ubGF5ZXJJbml0ICk7XHJcblxyXG5cdFx0XHRcdFx0c2Vzc2lvbi51cGRhdGVSZW5kZXJTdGF0ZSggeyBsYXllcnM6IFsgZ2xQcm9qTGF5ZXIgXSB9ICk7XHJcblxyXG5cdFx0XHRcdFx0cmVuZGVyZXIuc2V0UGl4ZWxSYXRpbyggMSApO1xyXG5cdFx0XHRcdFx0cmVuZGVyZXIuc2V0U2l6ZSggZ2xQcm9qTGF5ZXIudGV4dHVyZVdpZHRoLCBnbFByb2pMYXllci50ZXh0dXJlSGVpZ2h0LCBmYWxzZSApO1xyXG5cclxuXHRcdFx0XHRcdG5ld1JlbmRlclRhcmdldCA9IG5ldyBXZWJHTFJlbmRlclRhcmdldChcclxuXHRcdFx0XHRcdFx0Z2xQcm9qTGF5ZXIudGV4dHVyZVdpZHRoLFxyXG5cdFx0XHRcdFx0XHRnbFByb2pMYXllci50ZXh0dXJlSGVpZ2h0LFxyXG5cdFx0XHRcdFx0XHR7XHJcblx0XHRcdFx0XHRcdFx0Zm9ybWF0OiBSR0JBRm9ybWF0LFxyXG5cdFx0XHRcdFx0XHRcdHR5cGU6IFVuc2lnbmVkQnl0ZVR5cGUsXHJcblx0XHRcdFx0XHRcdFx0ZGVwdGhUZXh0dXJlOiBuZXcgRGVwdGhUZXh0dXJlKCBnbFByb2pMYXllci50ZXh0dXJlV2lkdGgsIGdsUHJvakxheWVyLnRleHR1cmVIZWlnaHQsIGRlcHRoVHlwZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgZGVwdGhGb3JtYXQgKSxcclxuXHRcdFx0XHRcdFx0XHRzdGVuY2lsQnVmZmVyOiBhdHRyaWJ1dGVzLnN0ZW5jaWwsXHJcblx0XHRcdFx0XHRcdFx0Y29sb3JTcGFjZTogcmVuZGVyZXIub3V0cHV0Q29sb3JTcGFjZSxcclxuXHRcdFx0XHRcdFx0XHRzYW1wbGVzOiBhdHRyaWJ1dGVzLmFudGlhbGlhcyA/IDQgOiAwLFxyXG5cdFx0XHRcdFx0XHRcdHJlc29sdmVEZXB0aEJ1ZmZlcjogKCBnbFByb2pMYXllci5pZ25vcmVEZXB0aFZhbHVlcyA9PT0gZmFsc2UgKSxcclxuXHRcdFx0XHRcdFx0XHRyZXNvbHZlU3RlbmNpbEJ1ZmZlcjogKCBnbFByb2pMYXllci5pZ25vcmVEZXB0aFZhbHVlcyA9PT0gZmFsc2UgKVxyXG5cdFx0XHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0bmV3UmVuZGVyVGFyZ2V0LmlzWFJSZW5kZXJUYXJnZXQgPSB0cnVlOyAvLyBUT0RPIFJlbW92ZSB0aGlzIHdoZW4gcG9zc2libGUsIHNlZSAjMjMyNzhcclxuXHJcblx0XHRcdFx0dGhpcy5zZXRGb3ZlYXRpb24oIGZvdmVhdGlvbiApO1xyXG5cclxuXHRcdFx0XHRjdXN0b21SZWZlcmVuY2VTcGFjZSA9IG51bGw7XHJcblx0XHRcdFx0cmVmZXJlbmNlU3BhY2UgPSBhd2FpdCBzZXNzaW9uLnJlcXVlc3RSZWZlcmVuY2VTcGFjZSggcmVmZXJlbmNlU3BhY2VUeXBlICk7XHJcblxyXG5cdFx0XHRcdGFuaW1hdGlvbi5zZXRDb250ZXh0KCBzZXNzaW9uICk7XHJcblx0XHRcdFx0YW5pbWF0aW9uLnN0YXJ0KCk7XHJcblxyXG5cdFx0XHRcdHNjb3BlLmlzUHJlc2VudGluZyA9IHRydWU7XHJcblxyXG5cdFx0XHRcdHNjb3BlLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ3Nlc3Npb25zdGFydCcgfSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXR1cm5zIHRoZSBlbnZpcm9ubWVudCBibGVuZCBtb2RlIGZyb20gdGhlIGN1cnJlbnQgWFIgc2Vzc2lvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAcmV0dXJuIHsnb3BhcXVlJ3wnYWRkaXRpdmUnfCdhbHBoYS1ibGVuZCd8dW5kZWZpbmVkfSBUaGUgZW52aXJvbm1lbnQgYmxlbmQgbW9kZS4gUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHVzZWQgb3V0c2lkZSBvZiBhIFhSIHNlc3Npb24uXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ2V0RW52aXJvbm1lbnRCbGVuZE1vZGUgPSBmdW5jdGlvbiAoKSB7XHJcblxyXG5cdFx0XHRpZiAoIHNlc3Npb24gIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdHJldHVybiBzZXNzaW9uLmVudmlyb25tZW50QmxlbmRNb2RlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGRlcHRoIHRleHR1cmUgY29tcHV0ZWQgdmlhIGRlcHRoIHNlbnNpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHJldHVybiB7P1RleHR1cmV9IFRoZSBkZXB0aCB0ZXh0dXJlLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdldERlcHRoVGV4dHVyZSA9IGZ1bmN0aW9uICgpIHtcclxuXHJcblx0XHRcdHJldHVybiBkZXB0aFNlbnNpbmcuZ2V0RGVwdGhUZXh0dXJlKCk7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHRmdW5jdGlvbiBvbklucHV0U291cmNlc0NoYW5nZSggZXZlbnQgKSB7XHJcblxyXG5cdFx0XHQvLyBOb3RpZnkgZGlzY29ubmVjdGVkXHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBldmVudC5yZW1vdmVkLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgaW5wdXRTb3VyY2UgPSBldmVudC5yZW1vdmVkWyBpIF07XHJcblx0XHRcdFx0Y29uc3QgaW5kZXggPSBjb250cm9sbGVySW5wdXRTb3VyY2VzLmluZGV4T2YoIGlucHV0U291cmNlICk7XHJcblxyXG5cdFx0XHRcdGlmICggaW5kZXggPj0gMCApIHtcclxuXHJcblx0XHRcdFx0XHRjb250cm9sbGVySW5wdXRTb3VyY2VzWyBpbmRleCBdID0gbnVsbDtcclxuXHRcdFx0XHRcdGNvbnRyb2xsZXJzWyBpbmRleCBdLmRpc2Nvbm5lY3QoIGlucHV0U291cmNlICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIE5vdGlmeSBjb25uZWN0ZWRcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGV2ZW50LmFkZGVkLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgaW5wdXRTb3VyY2UgPSBldmVudC5hZGRlZFsgaSBdO1xyXG5cclxuXHRcdFx0XHRsZXQgY29udHJvbGxlckluZGV4ID0gY29udHJvbGxlcklucHV0U291cmNlcy5pbmRleE9mKCBpbnB1dFNvdXJjZSApO1xyXG5cclxuXHRcdFx0XHRpZiAoIGNvbnRyb2xsZXJJbmRleCA9PT0gLSAxICkge1xyXG5cclxuXHRcdFx0XHRcdC8vIEFzc2lnbiBpbnB1dCBzb3VyY2UgYSBjb250cm9sbGVyIHRoYXQgY3VycmVudGx5IGhhcyBubyBpbnB1dCBzb3VyY2VcclxuXHJcblx0XHRcdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBjb250cm9sbGVycy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIGkgPj0gY29udHJvbGxlcklucHV0U291cmNlcy5sZW5ndGggKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGNvbnRyb2xsZXJJbnB1dFNvdXJjZXMucHVzaCggaW5wdXRTb3VyY2UgKTtcclxuXHRcdFx0XHRcdFx0XHRjb250cm9sbGVySW5kZXggPSBpO1xyXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICggY29udHJvbGxlcklucHV0U291cmNlc1sgaSBdID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRjb250cm9sbGVySW5wdXRTb3VyY2VzWyBpIF0gPSBpbnB1dFNvdXJjZTtcclxuXHRcdFx0XHRcdFx0XHRjb250cm9sbGVySW5kZXggPSBpO1xyXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvLyBJZiBhbGwgY29udHJvbGxlcnMgZG8gY3VycmVudGx5IHJlY2VpdmUgaW5wdXQgd2UgaWdub3JlIG5ldyBvbmVzXHJcblxyXG5cdFx0XHRcdFx0aWYgKCBjb250cm9sbGVySW5kZXggPT09IC0gMSApIGJyZWFrO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGNvbnN0IGNvbnRyb2xsZXIgPSBjb250cm9sbGVyc1sgY29udHJvbGxlckluZGV4IF07XHJcblxyXG5cdFx0XHRcdGlmICggY29udHJvbGxlciApIHtcclxuXHJcblx0XHRcdFx0XHRjb250cm9sbGVyLmNvbm5lY3QoIGlucHV0U291cmNlICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCBjYW1lcmFMUG9zID0gbmV3IFZlY3RvcjMoKTtcclxuXHRcdGNvbnN0IGNhbWVyYVJQb3MgPSBuZXcgVmVjdG9yMygpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQXNzdW1lcyAyIGNhbWVyYXMgdGhhdCBhcmUgcGFyYWxsZWwgYW5kIHNoYXJlIGFuIFgtYXhpcywgYW5kIHRoYXRcclxuXHRcdCAqIHRoZSBjYW1lcmFzJyBwcm9qZWN0aW9uIGFuZCB3b3JsZCBtYXRyaWNlcyBoYXZlIGFscmVhZHkgYmVlbiBzZXQuXHJcblx0XHQgKiBBbmQgdGhhdCBuZWFyIGFuZCBmYXIgcGxhbmVzIGFyZSBpZGVudGljYWwgZm9yIGJvdGggY2FtZXJhcy5cclxuXHRcdCAqIFZpc3VhbGl6YXRpb24gb2YgdGhpcyB0ZWNobmlxdWU6IGh0dHBzOi8vY29tcHV0ZXJncmFwaGljcy5zdGFja2V4Y2hhbmdlLmNvbS9hLzQ3NjVcclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge0FycmF5Q2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIHRvIHVwZGF0ZS5cclxuXHRcdCAqIEBwYXJhbSB7UGVyc3BlY3RpdmVDYW1lcmF9IGNhbWVyYUwgLSBUaGUgbGVmdCBjYW1lcmEuXHJcblx0XHQgKiBAcGFyYW0ge1BlcnNwZWN0aXZlQ2FtZXJhfSBjYW1lcmFSIC0gVGhlIHJpZ2h0IGNhbWVyYS5cclxuXHRcdCAqL1xyXG5cdFx0ZnVuY3Rpb24gc2V0UHJvamVjdGlvbkZyb21VbmlvbiggY2FtZXJhLCBjYW1lcmFMLCBjYW1lcmFSICkge1xyXG5cclxuXHRcdFx0Y2FtZXJhTFBvcy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGNhbWVyYUwubWF0cml4V29ybGQgKTtcclxuXHRcdFx0Y2FtZXJhUlBvcy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGNhbWVyYVIubWF0cml4V29ybGQgKTtcclxuXHJcblx0XHRcdGNvbnN0IGlwZCA9IGNhbWVyYUxQb3MuZGlzdGFuY2VUbyggY2FtZXJhUlBvcyApO1xyXG5cclxuXHRcdFx0Y29uc3QgcHJvakwgPSBjYW1lcmFMLnByb2plY3Rpb25NYXRyaXguZWxlbWVudHM7XHJcblx0XHRcdGNvbnN0IHByb2pSID0gY2FtZXJhUi5wcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzO1xyXG5cclxuXHRcdFx0Ly8gVlIgc3lzdGVtcyB3aWxsIGhhdmUgaWRlbnRpY2FsIGZhciBhbmQgbmVhciBwbGFuZXMsIGFuZFxyXG5cdFx0XHQvLyBtb3N0IGxpa2VseSBpZGVudGljYWwgdG9wIGFuZCBib3R0b20gZnJ1c3R1bSBleHRlbnRzLlxyXG5cdFx0XHQvLyBVc2UgdGhlIGxlZnQgY2FtZXJhIGZvciB0aGVzZSB2YWx1ZXMuXHJcblx0XHRcdGNvbnN0IG5lYXIgPSBwcm9qTFsgMTQgXSAvICggcHJvakxbIDEwIF0gLSAxICk7XHJcblx0XHRcdGNvbnN0IGZhciA9IHByb2pMWyAxNCBdIC8gKCBwcm9qTFsgMTAgXSArIDEgKTtcclxuXHRcdFx0Y29uc3QgdG9wRm92ID0gKCBwcm9qTFsgOSBdICsgMSApIC8gcHJvakxbIDUgXTtcclxuXHRcdFx0Y29uc3QgYm90dG9tRm92ID0gKCBwcm9qTFsgOSBdIC0gMSApIC8gcHJvakxbIDUgXTtcclxuXHJcblx0XHRcdGNvbnN0IGxlZnRGb3YgPSAoIHByb2pMWyA4IF0gLSAxICkgLyBwcm9qTFsgMCBdO1xyXG5cdFx0XHRjb25zdCByaWdodEZvdiA9ICggcHJvalJbIDggXSArIDEgKSAvIHByb2pSWyAwIF07XHJcblx0XHRcdGNvbnN0IGxlZnQgPSBuZWFyICogbGVmdEZvdjtcclxuXHRcdFx0Y29uc3QgcmlnaHQgPSBuZWFyICogcmlnaHRGb3Y7XHJcblxyXG5cdFx0XHQvLyBDYWxjdWxhdGUgdGhlIG5ldyBjYW1lcmEncyBwb3NpdGlvbiBvZmZzZXQgZnJvbSB0aGVcclxuXHRcdFx0Ly8gbGVmdCBjYW1lcmEuIHhPZmZzZXQgc2hvdWxkIGJlIHJvdWdobHkgaGFsZiBgaXBkYC5cclxuXHRcdFx0Y29uc3Qgek9mZnNldCA9IGlwZCAvICggLSBsZWZ0Rm92ICsgcmlnaHRGb3YgKTtcclxuXHRcdFx0Y29uc3QgeE9mZnNldCA9IHpPZmZzZXQgKiAtIGxlZnRGb3Y7XHJcblxyXG5cdFx0XHQvLyBUT0RPOiBCZXR0ZXIgd2F5IHRvIGFwcGx5IHRoaXMgb2Zmc2V0P1xyXG5cdFx0XHRjYW1lcmFMLm1hdHJpeFdvcmxkLmRlY29tcG9zZSggY2FtZXJhLnBvc2l0aW9uLCBjYW1lcmEucXVhdGVybmlvbiwgY2FtZXJhLnNjYWxlICk7XHJcblx0XHRcdGNhbWVyYS50cmFuc2xhdGVYKCB4T2Zmc2V0ICk7XHJcblx0XHRcdGNhbWVyYS50cmFuc2xhdGVaKCB6T2Zmc2V0ICk7XHJcblx0XHRcdGNhbWVyYS5tYXRyaXhXb3JsZC5jb21wb3NlKCBjYW1lcmEucG9zaXRpb24sIGNhbWVyYS5xdWF0ZXJuaW9uLCBjYW1lcmEuc2NhbGUgKTtcclxuXHRcdFx0Y2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZS5jb3B5KCBjYW1lcmEubWF0cml4V29ybGQgKS5pbnZlcnQoKTtcclxuXHJcblx0XHRcdC8vIENoZWNrIGlmIHRoZSBwcm9qZWN0aW9uIHVzZXMgYW4gaW5maW5pdGUgZmFyIHBsYW5lLlxyXG5cdFx0XHRpZiAoIHByb2pMWyAxMCBdID09PSAtIDEuMCApIHtcclxuXHJcblx0XHRcdFx0Ly8gVXNlIHRoZSBwcm9qZWN0aW9uIG1hdHJpeCBmcm9tIHRoZSBsZWZ0IGV5ZS5cclxuXHRcdFx0XHQvLyBUaGUgY2FtZXJhIG9mZnNldCBpcyBzdWZmaWNpZW50IHRvIGluY2x1ZGUgdGhlIHZpZXcgdm9sdW1lc1xyXG5cdFx0XHRcdC8vIG9mIGJvdGggZXllcyAoYXNzdW1pbmcgc3ltbWV0cmljIHByb2plY3Rpb25zKS5cclxuXHRcdFx0XHRjYW1lcmEucHJvamVjdGlvbk1hdHJpeC5jb3B5KCBjYW1lcmFMLnByb2plY3Rpb25NYXRyaXggKTtcclxuXHRcdFx0XHRjYW1lcmEucHJvamVjdGlvbk1hdHJpeEludmVyc2UuY29weSggY2FtZXJhTC5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0Ly8gRmluZCB0aGUgdW5pb24gb2YgdGhlIGZydXN0dW0gdmFsdWVzIG9mIHRoZSBjYW1lcmFzIGFuZCBzY2FsZVxyXG5cdFx0XHRcdC8vIHRoZSB2YWx1ZXMgc28gdGhhdCB0aGUgbmVhciBwbGFuZSdzIHBvc2l0aW9uIGRvZXMgbm90IGNoYW5nZSBpbiB3b3JsZCBzcGFjZSxcclxuXHRcdFx0XHQvLyBhbHRob3VnaCBtdXN0IG5vdyBiZSByZWxhdGl2ZSB0byB0aGUgbmV3IHVuaW9uIGNhbWVyYS5cclxuXHRcdFx0XHRjb25zdCBuZWFyMiA9IG5lYXIgKyB6T2Zmc2V0O1xyXG5cdFx0XHRcdGNvbnN0IGZhcjIgPSBmYXIgKyB6T2Zmc2V0O1xyXG5cdFx0XHRcdGNvbnN0IGxlZnQyID0gbGVmdCAtIHhPZmZzZXQ7XHJcblx0XHRcdFx0Y29uc3QgcmlnaHQyID0gcmlnaHQgKyAoIGlwZCAtIHhPZmZzZXQgKTtcclxuXHRcdFx0XHRjb25zdCB0b3AyID0gdG9wRm92ICogZmFyIC8gZmFyMiAqIG5lYXIyO1xyXG5cdFx0XHRcdGNvbnN0IGJvdHRvbTIgPSBib3R0b21Gb3YgKiBmYXIgLyBmYXIyICogbmVhcjI7XHJcblxyXG5cdFx0XHRcdGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4Lm1ha2VQZXJzcGVjdGl2ZSggbGVmdDIsIHJpZ2h0MiwgdG9wMiwgYm90dG9tMiwgbmVhcjIsIGZhcjIgKTtcclxuXHRcdFx0XHRjYW1lcmEucHJvamVjdGlvbk1hdHJpeEludmVyc2UuY29weSggY2FtZXJhLnByb2plY3Rpb25NYXRyaXggKS5pbnZlcnQoKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0ZnVuY3Rpb24gdXBkYXRlQ2FtZXJhKCBjYW1lcmEsIHBhcmVudCApIHtcclxuXHJcblx0XHRcdGlmICggcGFyZW50ID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRjYW1lcmEubWF0cml4V29ybGQuY29weSggY2FtZXJhLm1hdHJpeCApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0Y2FtZXJhLm1hdHJpeFdvcmxkLm11bHRpcGx5TWF0cmljZXMoIHBhcmVudC5tYXRyaXhXb3JsZCwgY2FtZXJhLm1hdHJpeCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZS5jb3B5KCBjYW1lcmEubWF0cml4V29ybGQgKS5pbnZlcnQoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBVcGRhdGVzIHRoZSBzdGF0ZSBvZiB0aGUgWFIgY2FtZXJhLiBVc2UgdGhpcyBtZXRob2Qgb24gYXBwIGxldmVsIGlmIHlvdVxyXG5cdFx0ICogc2V0IGNhbWVyYUF1dG9VcGRhdGVgIHRvIGBmYWxzZWAuIFRoZSBtZXRob2QgcmVxdWlyZXMgdGhlIG5vbi1YUlxyXG5cdFx0ICogY2FtZXJhIG9mIHRoZSBzY2VuZSBhcyBhIHBhcmFtZXRlci4gVGhlIHBhc3NlZCBpbiBjYW1lcmEncyB0cmFuc2Zvcm1hdGlvblxyXG5cdFx0ICogaXMgYXV0b21hdGljYWxseSBhZGp1c3RlZCB0byB0aGUgcG9zaXRpb24gb2YgdGhlIFhSIGNhbWVyYSB3aGVuIGNhbGxpbmdcclxuXHRcdCAqIHRoaXMgbWV0aG9kLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7Q2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVwZGF0ZUNhbWVyYSA9IGZ1bmN0aW9uICggY2FtZXJhICkge1xyXG5cclxuXHRcdFx0aWYgKCBzZXNzaW9uID09PSBudWxsICkgcmV0dXJuO1xyXG5cclxuXHRcdFx0bGV0IGRlcHRoTmVhciA9IGNhbWVyYS5uZWFyO1xyXG5cdFx0XHRsZXQgZGVwdGhGYXIgPSBjYW1lcmEuZmFyO1xyXG5cclxuXHRcdFx0aWYgKCBkZXB0aFNlbnNpbmcudGV4dHVyZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBkZXB0aFNlbnNpbmcuZGVwdGhOZWFyID4gMCApIGRlcHRoTmVhciA9IGRlcHRoU2Vuc2luZy5kZXB0aE5lYXI7XHJcblx0XHRcdFx0aWYgKCBkZXB0aFNlbnNpbmcuZGVwdGhGYXIgPiAwICkgZGVwdGhGYXIgPSBkZXB0aFNlbnNpbmcuZGVwdGhGYXI7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjYW1lcmFYUi5uZWFyID0gY2FtZXJhUi5uZWFyID0gY2FtZXJhTC5uZWFyID0gZGVwdGhOZWFyO1xyXG5cdFx0XHRjYW1lcmFYUi5mYXIgPSBjYW1lcmFSLmZhciA9IGNhbWVyYUwuZmFyID0gZGVwdGhGYXI7XHJcblxyXG5cdFx0XHRpZiAoIF9jdXJyZW50RGVwdGhOZWFyICE9PSBjYW1lcmFYUi5uZWFyIHx8IF9jdXJyZW50RGVwdGhGYXIgIT09IGNhbWVyYVhSLmZhciApIHtcclxuXHJcblx0XHRcdFx0Ly8gTm90ZSB0aGF0IHRoZSBuZXcgcmVuZGVyU3RhdGUgd29uJ3QgYXBwbHkgdW50aWwgdGhlIG5leHQgZnJhbWUuIFNlZSAjMTgzMjBcclxuXHJcblx0XHRcdFx0c2Vzc2lvbi51cGRhdGVSZW5kZXJTdGF0ZSgge1xyXG5cdFx0XHRcdFx0ZGVwdGhOZWFyOiBjYW1lcmFYUi5uZWFyLFxyXG5cdFx0XHRcdFx0ZGVwdGhGYXI6IGNhbWVyYVhSLmZhclxyXG5cdFx0XHRcdH0gKTtcclxuXHJcblx0XHRcdFx0X2N1cnJlbnREZXB0aE5lYXIgPSBjYW1lcmFYUi5uZWFyO1xyXG5cdFx0XHRcdF9jdXJyZW50RGVwdGhGYXIgPSBjYW1lcmFYUi5mYXI7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjYW1lcmFMLmxheWVycy5tYXNrID0gY2FtZXJhLmxheWVycy5tYXNrIHwgMGIwMTA7XHJcblx0XHRcdGNhbWVyYVIubGF5ZXJzLm1hc2sgPSBjYW1lcmEubGF5ZXJzLm1hc2sgfCAwYjEwMDtcclxuXHRcdFx0Y2FtZXJhWFIubGF5ZXJzLm1hc2sgPSBjYW1lcmFMLmxheWVycy5tYXNrIHwgY2FtZXJhUi5sYXllcnMubWFzaztcclxuXHJcblx0XHRcdGNvbnN0IHBhcmVudCA9IGNhbWVyYS5wYXJlbnQ7XHJcblx0XHRcdGNvbnN0IGNhbWVyYXMgPSBjYW1lcmFYUi5jYW1lcmFzO1xyXG5cclxuXHRcdFx0dXBkYXRlQ2FtZXJhKCBjYW1lcmFYUiwgcGFyZW50ICk7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBjYW1lcmFzLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0dXBkYXRlQ2FtZXJhKCBjYW1lcmFzWyBpIF0sIHBhcmVudCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gdXBkYXRlIHByb2plY3Rpb24gbWF0cml4IGZvciBwcm9wZXIgdmlldyBmcnVzdHVtIGN1bGxpbmdcclxuXHJcblx0XHRcdGlmICggY2FtZXJhcy5sZW5ndGggPT09IDIgKSB7XHJcblxyXG5cdFx0XHRcdHNldFByb2plY3Rpb25Gcm9tVW5pb24oIGNhbWVyYVhSLCBjYW1lcmFMLCBjYW1lcmFSICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHQvLyBhc3N1bWUgc2luZ2xlIGNhbWVyYSBzZXR1cCAoQVIpXHJcblxyXG5cdFx0XHRcdGNhbWVyYVhSLnByb2plY3Rpb25NYXRyaXguY29weSggY2FtZXJhTC5wcm9qZWN0aW9uTWF0cml4ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyB1cGRhdGUgdXNlciBjYW1lcmEgYW5kIGl0cyBjaGlsZHJlblxyXG5cclxuXHRcdFx0dXBkYXRlVXNlckNhbWVyYSggY2FtZXJhLCBjYW1lcmFYUiwgcGFyZW50ICk7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHRmdW5jdGlvbiB1cGRhdGVVc2VyQ2FtZXJhKCBjYW1lcmEsIGNhbWVyYVhSLCBwYXJlbnQgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHBhcmVudCA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0Y2FtZXJhLm1hdHJpeC5jb3B5KCBjYW1lcmFYUi5tYXRyaXhXb3JsZCApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0Y2FtZXJhLm1hdHJpeC5jb3B5KCBwYXJlbnQubWF0cml4V29ybGQgKTtcclxuXHRcdFx0XHRjYW1lcmEubWF0cml4LmludmVydCgpO1xyXG5cdFx0XHRcdGNhbWVyYS5tYXRyaXgubXVsdGlwbHkoIGNhbWVyYVhSLm1hdHJpeFdvcmxkICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjYW1lcmEubWF0cml4LmRlY29tcG9zZSggY2FtZXJhLnBvc2l0aW9uLCBjYW1lcmEucXVhdGVybmlvbiwgY2FtZXJhLnNjYWxlICk7XHJcblx0XHRcdGNhbWVyYS51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSApO1xyXG5cclxuXHRcdFx0Y2FtZXJhLnByb2plY3Rpb25NYXRyaXguY29weSggY2FtZXJhWFIucHJvamVjdGlvbk1hdHJpeCApO1xyXG5cdFx0XHRjYW1lcmEucHJvamVjdGlvbk1hdHJpeEludmVyc2UuY29weSggY2FtZXJhWFIucHJvamVjdGlvbk1hdHJpeEludmVyc2UgKTtcclxuXHJcblx0XHRcdGlmICggY2FtZXJhLmlzUGVyc3BlY3RpdmVDYW1lcmEgKSB7XHJcblxyXG5cdFx0XHRcdGNhbWVyYS5mb3YgPSBSQUQyREVHICogMiAqIE1hdGguYXRhbiggMSAvIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWyA1IF0gKTtcclxuXHRcdFx0XHRjYW1lcmEuem9vbSA9IDE7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgQXJyYXlDYW1lcmF9IHdoaWNoIHJlcHJlc2VudHMgdGhlIFhSIGNhbWVyYVxyXG5cdFx0ICogb2YgdGhlIGFjdGl2ZSBYUiBzZXNzaW9uLiBGb3IgZWFjaCB2aWV3IGl0IGhvbGRzIGEgc2VwYXJhdGUgY2FtZXJhIG9iamVjdC5cclxuXHRcdCAqXHJcblx0XHQgKiBUaGUgY2FtZXJhJ3MgYGZvdmAgaXMgY3VycmVudGx5IG5vdCB1c2VkIGFuZCBkb2VzIG5vdCByZWZsZWN0IHRoZSBmb3Ygb2ZcclxuXHRcdCAqIHRoZSBYUiBjYW1lcmEuIElmIHlvdSBuZWVkIHRoZSBmb3Ygb24gYXBwIGxldmVsLCB5b3UgaGF2ZSB0byBjb21wdXRlIGluXHJcblx0XHQgKiBtYW51YWxseSBmcm9tIHRoZSBYUiBjYW1lcmEncyBwcm9qZWN0aW9uIG1hdHJpY2VzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEByZXR1cm4ge0FycmF5Q2FtZXJhfSBUaGUgWFIgY2FtZXJhLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdldENhbWVyYSA9IGZ1bmN0aW9uICgpIHtcclxuXHJcblx0XHRcdHJldHVybiBjYW1lcmFYUjtcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmV0dXJucyB0aGUgYW1vdW50IG9mIGZvdmVhdGlvbiB1c2VkIGJ5IHRoZSBYUiBjb21wb3NpdG9yIGZvciB0aGUgcHJvamVjdGlvbiBsYXllci5cclxuXHRcdCAqXHJcblx0XHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBhbW91bnQgb2YgZm92ZWF0aW9uLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdldEZvdmVhdGlvbiA9IGZ1bmN0aW9uICgpIHtcclxuXHJcblx0XHRcdGlmICggZ2xQcm9qTGF5ZXIgPT09IG51bGwgJiYgZ2xCYXNlTGF5ZXIgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gZm92ZWF0aW9uO1xyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTZXRzIHRoZSBmb3ZlYXRpb24gdmFsdWUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gQSBudW1iZXIgaW4gdGhlIHJhbmdlIGBbMCwxXWAgd2hlcmUgYDBgIG1lYW5zIG5vIGZvdmVhdGlvbiAoZnVsbCByZXNvbHV0aW9uKVxyXG5cdFx0ICogYW5kIGAxYCBtZWFucyBtYXhpbXVtIGZvdmVhdGlvbiAodGhlIGVkZ2VzIHJlbmRlciBhdCBsb3dlciByZXNvbHV0aW9uKS5cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zZXRGb3ZlYXRpb24gPSBmdW5jdGlvbiAoIHZhbHVlICkge1xyXG5cclxuXHRcdFx0Ly8gMCA9IG5vIGZvdmVhdGlvbiA9IGZ1bGwgcmVzb2x1dGlvblxyXG5cdFx0XHQvLyAxID0gbWF4aW11bSBmb3ZlYXRpb24gPSB0aGUgZWRnZXMgcmVuZGVyIGF0IGxvd2VyIHJlc29sdXRpb25cclxuXHJcblx0XHRcdGZvdmVhdGlvbiA9IHZhbHVlO1xyXG5cclxuXHRcdFx0aWYgKCBnbFByb2pMYXllciAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0Z2xQcm9qTGF5ZXIuZml4ZWRGb3ZlYXRpb24gPSB2YWx1ZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggZ2xCYXNlTGF5ZXIgIT09IG51bGwgJiYgZ2xCYXNlTGF5ZXIuZml4ZWRGb3ZlYXRpb24gIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0Z2xCYXNlTGF5ZXIuZml4ZWRGb3ZlYXRpb24gPSB2YWx1ZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgZGVwdGggc2Vuc2luZyBpcyBzdXBwb3J0ZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciBkZXB0aCBzZW5zaW5nIGlzIHN1cHBvcnRlZCBvciBub3QuXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaGFzRGVwdGhTZW5zaW5nID0gZnVuY3Rpb24gKCkge1xyXG5cclxuXHRcdFx0cmV0dXJuIGRlcHRoU2Vuc2luZy50ZXh0dXJlICE9PSBudWxsO1xyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXR1cm5zIHRoZSBkZXB0aCBzZW5zaW5nIG1lc2guXHJcblx0XHQgKlxyXG5cdFx0ICogQHJldHVybiB7TWVzaH0gVGhlIGRlcHRoIHNlbnNpbmcgbWVzaC5cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nZXREZXB0aFNlbnNpbmdNZXNoID0gZnVuY3Rpb24gKCkge1xyXG5cclxuXHRcdFx0cmV0dXJuIGRlcHRoU2Vuc2luZy5nZXRNZXNoKCBjYW1lcmFYUiApO1xyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0Ly8gQW5pbWF0aW9uIExvb3BcclxuXHJcblx0XHRsZXQgb25BbmltYXRpb25GcmFtZUNhbGxiYWNrID0gbnVsbDtcclxuXHJcblx0XHRmdW5jdGlvbiBvbkFuaW1hdGlvbkZyYW1lKCB0aW1lLCBmcmFtZSApIHtcclxuXHJcblx0XHRcdHBvc2UgPSBmcmFtZS5nZXRWaWV3ZXJQb3NlKCBjdXN0b21SZWZlcmVuY2VTcGFjZSB8fCByZWZlcmVuY2VTcGFjZSApO1xyXG5cdFx0XHR4ckZyYW1lID0gZnJhbWU7XHJcblxyXG5cdFx0XHRpZiAoIHBvc2UgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHZpZXdzID0gcG9zZS52aWV3cztcclxuXHJcblx0XHRcdFx0aWYgKCBnbEJhc2VMYXllciAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXRGcmFtZWJ1ZmZlciggbmV3UmVuZGVyVGFyZ2V0LCBnbEJhc2VMYXllci5mcmFtZWJ1ZmZlciApO1xyXG5cdFx0XHRcdFx0cmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCBuZXdSZW5kZXJUYXJnZXQgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRsZXQgY2FtZXJhWFJOZWVkc1VwZGF0ZSA9IGZhbHNlO1xyXG5cclxuXHRcdFx0XHQvLyBjaGVjayBpZiBpdCdzIG5lY2Vzc2FyeSB0byByZWJ1aWxkIGNhbWVyYVhSJ3MgY2FtZXJhIGxpc3RcclxuXHJcblx0XHRcdFx0aWYgKCB2aWV3cy5sZW5ndGggIT09IGNhbWVyYVhSLmNhbWVyYXMubGVuZ3RoICkge1xyXG5cclxuXHRcdFx0XHRcdGNhbWVyYVhSLmNhbWVyYXMubGVuZ3RoID0gMDtcclxuXHRcdFx0XHRcdGNhbWVyYVhSTmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHZpZXdzLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCB2aWV3ID0gdmlld3NbIGkgXTtcclxuXHJcblx0XHRcdFx0XHRsZXQgdmlld3BvcnQgPSBudWxsO1xyXG5cclxuXHRcdFx0XHRcdGlmICggZ2xCYXNlTGF5ZXIgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHR2aWV3cG9ydCA9IGdsQmFzZUxheWVyLmdldFZpZXdwb3J0KCB2aWV3ICk7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnN0IGdsU3ViSW1hZ2UgPSBnbEJpbmRpbmcuZ2V0Vmlld1N1YkltYWdlKCBnbFByb2pMYXllciwgdmlldyApO1xyXG5cdFx0XHRcdFx0XHR2aWV3cG9ydCA9IGdsU3ViSW1hZ2Uudmlld3BvcnQ7XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBGb3Igc2lkZS1ieS1zaWRlIHByb2plY3Rpb24sIHdlIG9ubHkgcHJvZHVjZSBhIHNpbmdsZSB0ZXh0dXJlIGZvciBib3RoIGV5ZXMuXHJcblx0XHRcdFx0XHRcdGlmICggaSA9PT0gMCApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0cmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0VGV4dHVyZXMoXHJcblx0XHRcdFx0XHRcdFx0XHRuZXdSZW5kZXJUYXJnZXQsXHJcblx0XHRcdFx0XHRcdFx0XHRnbFN1YkltYWdlLmNvbG9yVGV4dHVyZSxcclxuXHRcdFx0XHRcdFx0XHRcdGdsU3ViSW1hZ2UuZGVwdGhTdGVuY2lsVGV4dHVyZSApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIG5ld1JlbmRlclRhcmdldCApO1xyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRsZXQgY2FtZXJhID0gY2FtZXJhc1sgaSBdO1xyXG5cclxuXHRcdFx0XHRcdGlmICggY2FtZXJhID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjYW1lcmEgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoKTtcclxuXHRcdFx0XHRcdFx0Y2FtZXJhLmxheWVycy5lbmFibGUoIGkgKTtcclxuXHRcdFx0XHRcdFx0Y2FtZXJhLnZpZXdwb3J0ID0gbmV3IFZlY3RvcjQoKTtcclxuXHRcdFx0XHRcdFx0Y2FtZXJhc1sgaSBdID0gY2FtZXJhO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRjYW1lcmEubWF0cml4LmZyb21BcnJheSggdmlldy50cmFuc2Zvcm0ubWF0cml4ICk7XHJcblx0XHRcdFx0XHRjYW1lcmEubWF0cml4LmRlY29tcG9zZSggY2FtZXJhLnBvc2l0aW9uLCBjYW1lcmEucXVhdGVybmlvbiwgY2FtZXJhLnNjYWxlICk7XHJcblx0XHRcdFx0XHRjYW1lcmEucHJvamVjdGlvbk1hdHJpeC5mcm9tQXJyYXkoIHZpZXcucHJvamVjdGlvbk1hdHJpeCApO1xyXG5cdFx0XHRcdFx0Y2FtZXJhLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkoIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4ICkuaW52ZXJ0KCk7XHJcblx0XHRcdFx0XHRjYW1lcmEudmlld3BvcnQuc2V0KCB2aWV3cG9ydC54LCB2aWV3cG9ydC55LCB2aWV3cG9ydC53aWR0aCwgdmlld3BvcnQuaGVpZ2h0ICk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBpID09PSAwICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y2FtZXJhWFIubWF0cml4LmNvcHkoIGNhbWVyYS5tYXRyaXggKTtcclxuXHRcdFx0XHRcdFx0Y2FtZXJhWFIubWF0cml4LmRlY29tcG9zZSggY2FtZXJhWFIucG9zaXRpb24sIGNhbWVyYVhSLnF1YXRlcm5pb24sIGNhbWVyYVhSLnNjYWxlICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGlmICggY2FtZXJhWFJOZWVkc1VwZGF0ZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNhbWVyYVhSLmNhbWVyYXMucHVzaCggY2FtZXJhICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8vXHJcblxyXG5cdFx0XHRcdGNvbnN0IGVuYWJsZWRGZWF0dXJlcyA9IHNlc3Npb24uZW5hYmxlZEZlYXR1cmVzO1xyXG5cdFx0XHRcdGNvbnN0IGdwdURlcHRoU2Vuc2luZ0VuYWJsZWQgPSBlbmFibGVkRmVhdHVyZXMgJiZcclxuXHRcdFx0XHRcdGVuYWJsZWRGZWF0dXJlcy5pbmNsdWRlcyggJ2RlcHRoLXNlbnNpbmcnICkgJiZcclxuXHRcdFx0XHRcdHNlc3Npb24uZGVwdGhVc2FnZSA9PSAnZ3B1LW9wdGltaXplZCc7XHJcblxyXG5cdFx0XHRcdGlmICggZ3B1RGVwdGhTZW5zaW5nRW5hYmxlZCAmJiBnbEJpbmRpbmcgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgZGVwdGhEYXRhID0gZ2xCaW5kaW5nLmdldERlcHRoSW5mb3JtYXRpb24oIHZpZXdzWyAwIF0gKTtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGRlcHRoRGF0YSAmJiBkZXB0aERhdGEuaXNWYWxpZCAmJiBkZXB0aERhdGEudGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdGRlcHRoU2Vuc2luZy5pbml0KCByZW5kZXJlciwgZGVwdGhEYXRhLCBzZXNzaW9uLnJlbmRlclN0YXRlICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvL1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgY29udHJvbGxlcnMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBpbnB1dFNvdXJjZSA9IGNvbnRyb2xsZXJJbnB1dFNvdXJjZXNbIGkgXTtcclxuXHRcdFx0XHRjb25zdCBjb250cm9sbGVyID0gY29udHJvbGxlcnNbIGkgXTtcclxuXHJcblx0XHRcdFx0aWYgKCBpbnB1dFNvdXJjZSAhPT0gbnVsbCAmJiBjb250cm9sbGVyICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29udHJvbGxlci51cGRhdGUoIGlucHV0U291cmNlLCBmcmFtZSwgY3VzdG9tUmVmZXJlbmNlU3BhY2UgfHwgcmVmZXJlbmNlU3BhY2UgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBvbkFuaW1hdGlvbkZyYW1lQ2FsbGJhY2sgKSBvbkFuaW1hdGlvbkZyYW1lQ2FsbGJhY2soIHRpbWUsIGZyYW1lICk7XHJcblxyXG5cdFx0XHRpZiAoIGZyYW1lLmRldGVjdGVkUGxhbmVzICkge1xyXG5cclxuXHRcdFx0XHRzY29wZS5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdwbGFuZXNkZXRlY3RlZCcsIGRhdGE6IGZyYW1lIH0gKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHhyRnJhbWUgPSBudWxsO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBhbmltYXRpb24gPSBuZXcgV2ViR0xBbmltYXRpb24oKTtcclxuXHJcblx0XHRhbmltYXRpb24uc2V0QW5pbWF0aW9uTG9vcCggb25BbmltYXRpb25GcmFtZSApO1xyXG5cclxuXHRcdHRoaXMuc2V0QW5pbWF0aW9uTG9vcCA9IGZ1bmN0aW9uICggY2FsbGJhY2sgKSB7XHJcblxyXG5cdFx0XHRvbkFuaW1hdGlvbkZyYW1lQ2FsbGJhY2sgPSBjYWxsYmFjaztcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdHRoaXMuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHt9O1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBXZWJYUk1hbmFnZXIgfTtcclxuIiwiaW1wb3J0IHsgQmFja1NpZGUgfSBmcm9tICcuLi8uLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBnZXRVbmxpdFVuaWZvcm1Db2xvclNwYWNlIH0gZnJvbSAnLi4vc2hhZGVycy9Vbmlmb3Jtc1V0aWxzLmpzJztcclxuaW1wb3J0IHsgRXVsZXIgfSBmcm9tICcuLi8uLi9tYXRoL0V1bGVyLmpzJztcclxuaW1wb3J0IHsgTWF0cml4NCB9IGZyb20gJy4uLy4uL21hdGgvTWF0cml4NC5qcyc7XHJcblxyXG5jb25zdCBfZTEgPSAvKkBfX1BVUkVfXyovIG5ldyBFdWxlcigpO1xyXG5jb25zdCBfbTEgPSAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXg0KCk7XHJcblxyXG5mdW5jdGlvbiBXZWJHTE1hdGVyaWFscyggcmVuZGVyZXIsIHByb3BlcnRpZXMgKSB7XHJcblxyXG5cdGZ1bmN0aW9uIHJlZnJlc2hUcmFuc2Zvcm1Vbmlmb3JtKCBtYXAsIHVuaWZvcm0gKSB7XHJcblxyXG5cdFx0aWYgKCBtYXAubWF0cml4QXV0b1VwZGF0ZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdG1hcC51cGRhdGVNYXRyaXgoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dW5pZm9ybS52YWx1ZS5jb3B5KCBtYXAubWF0cml4ICk7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gcmVmcmVzaEZvZ1VuaWZvcm1zKCB1bmlmb3JtcywgZm9nICkge1xyXG5cclxuXHRcdGZvZy5jb2xvci5nZXRSR0IoIHVuaWZvcm1zLmZvZ0NvbG9yLnZhbHVlLCBnZXRVbmxpdFVuaWZvcm1Db2xvclNwYWNlKCByZW5kZXJlciApICk7XHJcblxyXG5cdFx0aWYgKCBmb2cuaXNGb2cgKSB7XHJcblxyXG5cdFx0XHR1bmlmb3Jtcy5mb2dOZWFyLnZhbHVlID0gZm9nLm5lYXI7XHJcblx0XHRcdHVuaWZvcm1zLmZvZ0Zhci52YWx1ZSA9IGZvZy5mYXI7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggZm9nLmlzRm9nRXhwMiApIHtcclxuXHJcblx0XHRcdHVuaWZvcm1zLmZvZ0RlbnNpdHkudmFsdWUgPSBmb2cuZGVuc2l0eTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gcmVmcmVzaE1hdGVyaWFsVW5pZm9ybXMoIHVuaWZvcm1zLCBtYXRlcmlhbCwgcGl4ZWxSYXRpbywgaGVpZ2h0LCB0cmFuc21pc3Npb25SZW5kZXJUYXJnZXQgKSB7XHJcblxyXG5cdFx0aWYgKCBtYXRlcmlhbC5pc01lc2hCYXNpY01hdGVyaWFsICkge1xyXG5cclxuXHRcdFx0cmVmcmVzaFVuaWZvcm1zQ29tbW9uKCB1bmlmb3JtcywgbWF0ZXJpYWwgKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc01lc2hMYW1iZXJ0TWF0ZXJpYWwgKSB7XHJcblxyXG5cdFx0XHRyZWZyZXNoVW5pZm9ybXNDb21tb24oIHVuaWZvcm1zLCBtYXRlcmlhbCApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzTWVzaFRvb25NYXRlcmlhbCApIHtcclxuXHJcblx0XHRcdHJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggdW5pZm9ybXMsIG1hdGVyaWFsICk7XHJcblx0XHRcdHJlZnJlc2hVbmlmb3Jtc1Rvb24oIHVuaWZvcm1zLCBtYXRlcmlhbCApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzTWVzaFBob25nTWF0ZXJpYWwgKSB7XHJcblxyXG5cdFx0XHRyZWZyZXNoVW5pZm9ybXNDb21tb24oIHVuaWZvcm1zLCBtYXRlcmlhbCApO1xyXG5cdFx0XHRyZWZyZXNoVW5pZm9ybXNQaG9uZyggdW5pZm9ybXMsIG1hdGVyaWFsICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCApIHtcclxuXHJcblx0XHRcdHJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggdW5pZm9ybXMsIG1hdGVyaWFsICk7XHJcblx0XHRcdHJlZnJlc2hVbmlmb3Jtc1N0YW5kYXJkKCB1bmlmb3JtcywgbWF0ZXJpYWwgKTtcclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWwuaXNNZXNoUGh5c2ljYWxNYXRlcmlhbCApIHtcclxuXHJcblx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zUGh5c2ljYWwoIHVuaWZvcm1zLCBtYXRlcmlhbCwgdHJhbnNtaXNzaW9uUmVuZGVyVGFyZ2V0ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoTWF0Y2FwTWF0ZXJpYWwgKSB7XHJcblxyXG5cdFx0XHRyZWZyZXNoVW5pZm9ybXNDb21tb24oIHVuaWZvcm1zLCBtYXRlcmlhbCApO1xyXG5cdFx0XHRyZWZyZXNoVW5pZm9ybXNNYXRjYXAoIHVuaWZvcm1zLCBtYXRlcmlhbCApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzTWVzaERlcHRoTWF0ZXJpYWwgKSB7XHJcblxyXG5cdFx0XHRyZWZyZXNoVW5pZm9ybXNDb21tb24oIHVuaWZvcm1zLCBtYXRlcmlhbCApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzTWVzaERpc3RhbmNlTWF0ZXJpYWwgKSB7XHJcblxyXG5cdFx0XHRyZWZyZXNoVW5pZm9ybXNDb21tb24oIHVuaWZvcm1zLCBtYXRlcmlhbCApO1xyXG5cdFx0XHRyZWZyZXNoVW5pZm9ybXNEaXN0YW5jZSggdW5pZm9ybXMsIG1hdGVyaWFsICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoTm9ybWFsTWF0ZXJpYWwgKSB7XHJcblxyXG5cdFx0XHRyZWZyZXNoVW5pZm9ybXNDb21tb24oIHVuaWZvcm1zLCBtYXRlcmlhbCApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzTGluZUJhc2ljTWF0ZXJpYWwgKSB7XHJcblxyXG5cdFx0XHRyZWZyZXNoVW5pZm9ybXNMaW5lKCB1bmlmb3JtcywgbWF0ZXJpYWwgKTtcclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWwuaXNMaW5lRGFzaGVkTWF0ZXJpYWwgKSB7XHJcblxyXG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc0Rhc2goIHVuaWZvcm1zLCBtYXRlcmlhbCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzUG9pbnRzTWF0ZXJpYWwgKSB7XHJcblxyXG5cdFx0XHRyZWZyZXNoVW5pZm9ybXNQb2ludHMoIHVuaWZvcm1zLCBtYXRlcmlhbCwgcGl4ZWxSYXRpbywgaGVpZ2h0ICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNTcHJpdGVNYXRlcmlhbCApIHtcclxuXHJcblx0XHRcdHJlZnJlc2hVbmlmb3Jtc1Nwcml0ZXMoIHVuaWZvcm1zLCBtYXRlcmlhbCApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzU2hhZG93TWF0ZXJpYWwgKSB7XHJcblxyXG5cdFx0XHR1bmlmb3Jtcy5jb2xvci52YWx1ZS5jb3B5KCBtYXRlcmlhbC5jb2xvciApO1xyXG5cdFx0XHR1bmlmb3Jtcy5vcGFjaXR5LnZhbHVlID0gbWF0ZXJpYWwub3BhY2l0eTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc1NoYWRlck1hdGVyaWFsICkge1xyXG5cclxuXHRcdFx0bWF0ZXJpYWwudW5pZm9ybXNOZWVkVXBkYXRlID0gZmFsc2U7IC8vICMxNTU4MVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNDb21tb24oIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcclxuXHJcblx0XHR1bmlmb3Jtcy5vcGFjaXR5LnZhbHVlID0gbWF0ZXJpYWwub3BhY2l0eTtcclxuXHJcblx0XHRpZiAoIG1hdGVyaWFsLmNvbG9yICkge1xyXG5cclxuXHRcdFx0dW5pZm9ybXMuZGlmZnVzZS52YWx1ZS5jb3B5KCBtYXRlcmlhbC5jb2xvciApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIG1hdGVyaWFsLmVtaXNzaXZlICkge1xyXG5cclxuXHRcdFx0dW5pZm9ybXMuZW1pc3NpdmUudmFsdWUuY29weSggbWF0ZXJpYWwuZW1pc3NpdmUgKS5tdWx0aXBseVNjYWxhciggbWF0ZXJpYWwuZW1pc3NpdmVJbnRlbnNpdHkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBtYXRlcmlhbC5tYXAgKSB7XHJcblxyXG5cdFx0XHR1bmlmb3Jtcy5tYXAudmFsdWUgPSBtYXRlcmlhbC5tYXA7XHJcblxyXG5cdFx0XHRyZWZyZXNoVHJhbnNmb3JtVW5pZm9ybSggbWF0ZXJpYWwubWFwLCB1bmlmb3Jtcy5tYXBUcmFuc2Zvcm0gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBtYXRlcmlhbC5hbHBoYU1hcCApIHtcclxuXHJcblx0XHRcdHVuaWZvcm1zLmFscGhhTWFwLnZhbHVlID0gbWF0ZXJpYWwuYWxwaGFNYXA7XHJcblxyXG5cdFx0XHRyZWZyZXNoVHJhbnNmb3JtVW5pZm9ybSggbWF0ZXJpYWwuYWxwaGFNYXAsIHVuaWZvcm1zLmFscGhhTWFwVHJhbnNmb3JtICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggbWF0ZXJpYWwuYnVtcE1hcCApIHtcclxuXHJcblx0XHRcdHVuaWZvcm1zLmJ1bXBNYXAudmFsdWUgPSBtYXRlcmlhbC5idW1wTWFwO1xyXG5cclxuXHRcdFx0cmVmcmVzaFRyYW5zZm9ybVVuaWZvcm0oIG1hdGVyaWFsLmJ1bXBNYXAsIHVuaWZvcm1zLmJ1bXBNYXBUcmFuc2Zvcm0gKTtcclxuXHJcblx0XHRcdHVuaWZvcm1zLmJ1bXBTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmJ1bXBTY2FsZTtcclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWwuc2lkZSA9PT0gQmFja1NpZGUgKSB7XHJcblxyXG5cdFx0XHRcdHVuaWZvcm1zLmJ1bXBTY2FsZS52YWx1ZSAqPSAtIDE7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggbWF0ZXJpYWwubm9ybWFsTWFwICkge1xyXG5cclxuXHRcdFx0dW5pZm9ybXMubm9ybWFsTWFwLnZhbHVlID0gbWF0ZXJpYWwubm9ybWFsTWFwO1xyXG5cclxuXHRcdFx0cmVmcmVzaFRyYW5zZm9ybVVuaWZvcm0oIG1hdGVyaWFsLm5vcm1hbE1hcCwgdW5pZm9ybXMubm9ybWFsTWFwVHJhbnNmb3JtICk7XHJcblxyXG5cdFx0XHR1bmlmb3Jtcy5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KCBtYXRlcmlhbC5ub3JtYWxTY2FsZSApO1xyXG5cclxuXHRcdFx0aWYgKCBtYXRlcmlhbC5zaWRlID09PSBCYWNrU2lkZSApIHtcclxuXHJcblx0XHRcdFx0dW5pZm9ybXMubm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwICkge1xyXG5cclxuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50TWFwLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwO1xyXG5cclxuXHRcdFx0cmVmcmVzaFRyYW5zZm9ybVVuaWZvcm0oIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCwgdW5pZm9ybXMuZGlzcGxhY2VtZW50TWFwVHJhbnNmb3JtICk7XHJcblxyXG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudFNjYWxlO1xyXG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50QmlhcztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBtYXRlcmlhbC5lbWlzc2l2ZU1hcCApIHtcclxuXHJcblx0XHRcdHVuaWZvcm1zLmVtaXNzaXZlTWFwLnZhbHVlID0gbWF0ZXJpYWwuZW1pc3NpdmVNYXA7XHJcblxyXG5cdFx0XHRyZWZyZXNoVHJhbnNmb3JtVW5pZm9ybSggbWF0ZXJpYWwuZW1pc3NpdmVNYXAsIHVuaWZvcm1zLmVtaXNzaXZlTWFwVHJhbnNmb3JtICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggbWF0ZXJpYWwuc3BlY3VsYXJNYXAgKSB7XHJcblxyXG5cdFx0XHR1bmlmb3Jtcy5zcGVjdWxhck1hcC52YWx1ZSA9IG1hdGVyaWFsLnNwZWN1bGFyTWFwO1xyXG5cclxuXHRcdFx0cmVmcmVzaFRyYW5zZm9ybVVuaWZvcm0oIG1hdGVyaWFsLnNwZWN1bGFyTWFwLCB1bmlmb3Jtcy5zcGVjdWxhck1hcFRyYW5zZm9ybSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIG1hdGVyaWFsLmFscGhhVGVzdCA+IDAgKSB7XHJcblxyXG5cdFx0XHR1bmlmb3Jtcy5hbHBoYVRlc3QudmFsdWUgPSBtYXRlcmlhbC5hbHBoYVRlc3Q7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IG1hdGVyaWFsUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCBtYXRlcmlhbCApO1xyXG5cclxuXHRcdGNvbnN0IGVudk1hcCA9IG1hdGVyaWFsUHJvcGVydGllcy5lbnZNYXA7XHJcblx0XHRjb25zdCBlbnZNYXBSb3RhdGlvbiA9IG1hdGVyaWFsUHJvcGVydGllcy5lbnZNYXBSb3RhdGlvbjtcclxuXHJcblx0XHRpZiAoIGVudk1hcCApIHtcclxuXHJcblx0XHRcdHVuaWZvcm1zLmVudk1hcC52YWx1ZSA9IGVudk1hcDtcclxuXHJcblx0XHRcdF9lMS5jb3B5KCBlbnZNYXBSb3RhdGlvbiApO1xyXG5cclxuXHRcdFx0Ly8gYWNjb21tb2RhdGUgbGVmdC1oYW5kZWQgZnJhbWVcclxuXHRcdFx0X2UxLnggKj0gLSAxOyBfZTEueSAqPSAtIDE7IF9lMS56ICo9IC0gMTtcclxuXHJcblx0XHRcdGlmICggZW52TWFwLmlzQ3ViZVRleHR1cmUgJiYgZW52TWFwLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRcdC8vIGVudmlyb25tZW50IG1hcHMgd2hpY2ggYXJlIG5vdCBjdWJlIHJlbmRlciB0YXJnZXRzIG9yIFBNUkVNcyBmb2xsb3cgYSBkaWZmZXJlbnQgY29udmVudGlvblxyXG5cdFx0XHRcdF9lMS55ICo9IC0gMTtcclxuXHRcdFx0XHRfZTEueiAqPSAtIDE7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR1bmlmb3Jtcy5lbnZNYXBSb3RhdGlvbi52YWx1ZS5zZXRGcm9tTWF0cml4NCggX20xLm1ha2VSb3RhdGlvbkZyb21FdWxlciggX2UxICkgKTtcclxuXHJcblx0XHRcdHVuaWZvcm1zLmZsaXBFbnZNYXAudmFsdWUgPSAoIGVudk1hcC5pc0N1YmVUZXh0dXJlICYmIGVudk1hcC5pc1JlbmRlclRhcmdldFRleHR1cmUgPT09IGZhbHNlICkgPyAtIDEgOiAxO1xyXG5cclxuXHRcdFx0dW5pZm9ybXMucmVmbGVjdGl2aXR5LnZhbHVlID0gbWF0ZXJpYWwucmVmbGVjdGl2aXR5O1xyXG5cdFx0XHR1bmlmb3Jtcy5pb3IudmFsdWUgPSBtYXRlcmlhbC5pb3I7XHJcblx0XHRcdHVuaWZvcm1zLnJlZnJhY3Rpb25SYXRpby52YWx1ZSA9IG1hdGVyaWFsLnJlZnJhY3Rpb25SYXRpbztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBtYXRlcmlhbC5saWdodE1hcCApIHtcclxuXHJcblx0XHRcdHVuaWZvcm1zLmxpZ2h0TWFwLnZhbHVlID0gbWF0ZXJpYWwubGlnaHRNYXA7XHJcblx0XHRcdHVuaWZvcm1zLmxpZ2h0TWFwSW50ZW5zaXR5LnZhbHVlID0gbWF0ZXJpYWwubGlnaHRNYXBJbnRlbnNpdHk7XHJcblxyXG5cdFx0XHRyZWZyZXNoVHJhbnNmb3JtVW5pZm9ybSggbWF0ZXJpYWwubGlnaHRNYXAsIHVuaWZvcm1zLmxpZ2h0TWFwVHJhbnNmb3JtICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggbWF0ZXJpYWwuYW9NYXAgKSB7XHJcblxyXG5cdFx0XHR1bmlmb3Jtcy5hb01hcC52YWx1ZSA9IG1hdGVyaWFsLmFvTWFwO1xyXG5cdFx0XHR1bmlmb3Jtcy5hb01hcEludGVuc2l0eS52YWx1ZSA9IG1hdGVyaWFsLmFvTWFwSW50ZW5zaXR5O1xyXG5cclxuXHRcdFx0cmVmcmVzaFRyYW5zZm9ybVVuaWZvcm0oIG1hdGVyaWFsLmFvTWFwLCB1bmlmb3Jtcy5hb01hcFRyYW5zZm9ybSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNMaW5lKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XHJcblxyXG5cdFx0dW5pZm9ybXMuZGlmZnVzZS52YWx1ZS5jb3B5KCBtYXRlcmlhbC5jb2xvciApO1xyXG5cdFx0dW5pZm9ybXMub3BhY2l0eS52YWx1ZSA9IG1hdGVyaWFsLm9wYWNpdHk7XHJcblxyXG5cdFx0aWYgKCBtYXRlcmlhbC5tYXAgKSB7XHJcblxyXG5cdFx0XHR1bmlmb3Jtcy5tYXAudmFsdWUgPSBtYXRlcmlhbC5tYXA7XHJcblxyXG5cdFx0XHRyZWZyZXNoVHJhbnNmb3JtVW5pZm9ybSggbWF0ZXJpYWwubWFwLCB1bmlmb3Jtcy5tYXBUcmFuc2Zvcm0gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zRGFzaCggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xyXG5cclxuXHRcdHVuaWZvcm1zLmRhc2hTaXplLnZhbHVlID0gbWF0ZXJpYWwuZGFzaFNpemU7XHJcblx0XHR1bmlmb3Jtcy50b3RhbFNpemUudmFsdWUgPSBtYXRlcmlhbC5kYXNoU2l6ZSArIG1hdGVyaWFsLmdhcFNpemU7XHJcblx0XHR1bmlmb3Jtcy5zY2FsZS52YWx1ZSA9IG1hdGVyaWFsLnNjYWxlO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc1BvaW50cyggdW5pZm9ybXMsIG1hdGVyaWFsLCBwaXhlbFJhdGlvLCBoZWlnaHQgKSB7XHJcblxyXG5cdFx0dW5pZm9ybXMuZGlmZnVzZS52YWx1ZS5jb3B5KCBtYXRlcmlhbC5jb2xvciApO1xyXG5cdFx0dW5pZm9ybXMub3BhY2l0eS52YWx1ZSA9IG1hdGVyaWFsLm9wYWNpdHk7XHJcblx0XHR1bmlmb3Jtcy5zaXplLnZhbHVlID0gbWF0ZXJpYWwuc2l6ZSAqIHBpeGVsUmF0aW87XHJcblx0XHR1bmlmb3Jtcy5zY2FsZS52YWx1ZSA9IGhlaWdodCAqIDAuNTtcclxuXHJcblx0XHRpZiAoIG1hdGVyaWFsLm1hcCApIHtcclxuXHJcblx0XHRcdHVuaWZvcm1zLm1hcC52YWx1ZSA9IG1hdGVyaWFsLm1hcDtcclxuXHJcblx0XHRcdHJlZnJlc2hUcmFuc2Zvcm1Vbmlmb3JtKCBtYXRlcmlhbC5tYXAsIHVuaWZvcm1zLnV2VHJhbnNmb3JtICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggbWF0ZXJpYWwuYWxwaGFNYXAgKSB7XHJcblxyXG5cdFx0XHR1bmlmb3Jtcy5hbHBoYU1hcC52YWx1ZSA9IG1hdGVyaWFsLmFscGhhTWFwO1xyXG5cclxuXHRcdFx0cmVmcmVzaFRyYW5zZm9ybVVuaWZvcm0oIG1hdGVyaWFsLmFscGhhTWFwLCB1bmlmb3Jtcy5hbHBoYU1hcFRyYW5zZm9ybSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIG1hdGVyaWFsLmFscGhhVGVzdCA+IDAgKSB7XHJcblxyXG5cdFx0XHR1bmlmb3Jtcy5hbHBoYVRlc3QudmFsdWUgPSBtYXRlcmlhbC5hbHBoYVRlc3Q7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc1Nwcml0ZXMoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcclxuXHJcblx0XHR1bmlmb3Jtcy5kaWZmdXNlLnZhbHVlLmNvcHkoIG1hdGVyaWFsLmNvbG9yICk7XHJcblx0XHR1bmlmb3Jtcy5vcGFjaXR5LnZhbHVlID0gbWF0ZXJpYWwub3BhY2l0eTtcclxuXHRcdHVuaWZvcm1zLnJvdGF0aW9uLnZhbHVlID0gbWF0ZXJpYWwucm90YXRpb247XHJcblxyXG5cdFx0aWYgKCBtYXRlcmlhbC5tYXAgKSB7XHJcblxyXG5cdFx0XHR1bmlmb3Jtcy5tYXAudmFsdWUgPSBtYXRlcmlhbC5tYXA7XHJcblxyXG5cdFx0XHRyZWZyZXNoVHJhbnNmb3JtVW5pZm9ybSggbWF0ZXJpYWwubWFwLCB1bmlmb3Jtcy5tYXBUcmFuc2Zvcm0gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBtYXRlcmlhbC5hbHBoYU1hcCApIHtcclxuXHJcblx0XHRcdHVuaWZvcm1zLmFscGhhTWFwLnZhbHVlID0gbWF0ZXJpYWwuYWxwaGFNYXA7XHJcblxyXG5cdFx0XHRyZWZyZXNoVHJhbnNmb3JtVW5pZm9ybSggbWF0ZXJpYWwuYWxwaGFNYXAsIHVuaWZvcm1zLmFscGhhTWFwVHJhbnNmb3JtICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggbWF0ZXJpYWwuYWxwaGFUZXN0ID4gMCApIHtcclxuXHJcblx0XHRcdHVuaWZvcm1zLmFscGhhVGVzdC52YWx1ZSA9IG1hdGVyaWFsLmFscGhhVGVzdDtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zUGhvbmcoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcclxuXHJcblx0XHR1bmlmb3Jtcy5zcGVjdWxhci52YWx1ZS5jb3B5KCBtYXRlcmlhbC5zcGVjdWxhciApO1xyXG5cdFx0dW5pZm9ybXMuc2hpbmluZXNzLnZhbHVlID0gTWF0aC5tYXgoIG1hdGVyaWFsLnNoaW5pbmVzcywgMWUtNCApOyAvLyB0byBwcmV2ZW50IHBvdyggMC4wLCAwLjAgKVxyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc1Rvb24oIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcclxuXHJcblx0XHRpZiAoIG1hdGVyaWFsLmdyYWRpZW50TWFwICkge1xyXG5cclxuXHRcdFx0dW5pZm9ybXMuZ3JhZGllbnRNYXAudmFsdWUgPSBtYXRlcmlhbC5ncmFkaWVudE1hcDtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zU3RhbmRhcmQoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcclxuXHJcblx0XHR1bmlmb3Jtcy5tZXRhbG5lc3MudmFsdWUgPSBtYXRlcmlhbC5tZXRhbG5lc3M7XHJcblxyXG5cdFx0aWYgKCBtYXRlcmlhbC5tZXRhbG5lc3NNYXAgKSB7XHJcblxyXG5cdFx0XHR1bmlmb3Jtcy5tZXRhbG5lc3NNYXAudmFsdWUgPSBtYXRlcmlhbC5tZXRhbG5lc3NNYXA7XHJcblxyXG5cdFx0XHRyZWZyZXNoVHJhbnNmb3JtVW5pZm9ybSggbWF0ZXJpYWwubWV0YWxuZXNzTWFwLCB1bmlmb3Jtcy5tZXRhbG5lc3NNYXBUcmFuc2Zvcm0gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dW5pZm9ybXMucm91Z2huZXNzLnZhbHVlID0gbWF0ZXJpYWwucm91Z2huZXNzO1xyXG5cclxuXHRcdGlmICggbWF0ZXJpYWwucm91Z2huZXNzTWFwICkge1xyXG5cclxuXHRcdFx0dW5pZm9ybXMucm91Z2huZXNzTWFwLnZhbHVlID0gbWF0ZXJpYWwucm91Z2huZXNzTWFwO1xyXG5cclxuXHRcdFx0cmVmcmVzaFRyYW5zZm9ybVVuaWZvcm0oIG1hdGVyaWFsLnJvdWdobmVzc01hcCwgdW5pZm9ybXMucm91Z2huZXNzTWFwVHJhbnNmb3JtICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggbWF0ZXJpYWwuZW52TWFwICkge1xyXG5cclxuXHRcdFx0Ly91bmlmb3Jtcy5lbnZNYXAudmFsdWUgPSBtYXRlcmlhbC5lbnZNYXA7IC8vIHBhcnQgb2YgdW5pZm9ybXMgY29tbW9uXHJcblxyXG5cdFx0XHR1bmlmb3Jtcy5lbnZNYXBJbnRlbnNpdHkudmFsdWUgPSBtYXRlcmlhbC5lbnZNYXBJbnRlbnNpdHk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc1BoeXNpY2FsKCB1bmlmb3JtcywgbWF0ZXJpYWwsIHRyYW5zbWlzc2lvblJlbmRlclRhcmdldCApIHtcclxuXHJcblx0XHR1bmlmb3Jtcy5pb3IudmFsdWUgPSBtYXRlcmlhbC5pb3I7IC8vIGFsc28gcGFydCBvZiB1bmlmb3JtcyBjb21tb25cclxuXHJcblx0XHRpZiAoIG1hdGVyaWFsLnNoZWVuID4gMCApIHtcclxuXHJcblx0XHRcdHVuaWZvcm1zLnNoZWVuQ29sb3IudmFsdWUuY29weSggbWF0ZXJpYWwuc2hlZW5Db2xvciApLm11bHRpcGx5U2NhbGFyKCBtYXRlcmlhbC5zaGVlbiApO1xyXG5cclxuXHRcdFx0dW5pZm9ybXMuc2hlZW5Sb3VnaG5lc3MudmFsdWUgPSBtYXRlcmlhbC5zaGVlblJvdWdobmVzcztcclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWwuc2hlZW5Db2xvck1hcCApIHtcclxuXHJcblx0XHRcdFx0dW5pZm9ybXMuc2hlZW5Db2xvck1hcC52YWx1ZSA9IG1hdGVyaWFsLnNoZWVuQ29sb3JNYXA7XHJcblxyXG5cdFx0XHRcdHJlZnJlc2hUcmFuc2Zvcm1Vbmlmb3JtKCBtYXRlcmlhbC5zaGVlbkNvbG9yTWFwLCB1bmlmb3Jtcy5zaGVlbkNvbG9yTWFwVHJhbnNmb3JtICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIG1hdGVyaWFsLnNoZWVuUm91Z2huZXNzTWFwICkge1xyXG5cclxuXHRcdFx0XHR1bmlmb3Jtcy5zaGVlblJvdWdobmVzc01hcC52YWx1ZSA9IG1hdGVyaWFsLnNoZWVuUm91Z2huZXNzTWFwO1xyXG5cclxuXHRcdFx0XHRyZWZyZXNoVHJhbnNmb3JtVW5pZm9ybSggbWF0ZXJpYWwuc2hlZW5Sb3VnaG5lc3NNYXAsIHVuaWZvcm1zLnNoZWVuUm91Z2huZXNzTWFwVHJhbnNmb3JtICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggbWF0ZXJpYWwuY2xlYXJjb2F0ID4gMCApIHtcclxuXHJcblx0XHRcdHVuaWZvcm1zLmNsZWFyY29hdC52YWx1ZSA9IG1hdGVyaWFsLmNsZWFyY29hdDtcclxuXHRcdFx0dW5pZm9ybXMuY2xlYXJjb2F0Um91Z2huZXNzLnZhbHVlID0gbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzO1xyXG5cclxuXHRcdFx0aWYgKCBtYXRlcmlhbC5jbGVhcmNvYXRNYXAgKSB7XHJcblxyXG5cdFx0XHRcdHVuaWZvcm1zLmNsZWFyY29hdE1hcC52YWx1ZSA9IG1hdGVyaWFsLmNsZWFyY29hdE1hcDtcclxuXHJcblx0XHRcdFx0cmVmcmVzaFRyYW5zZm9ybVVuaWZvcm0oIG1hdGVyaWFsLmNsZWFyY29hdE1hcCwgdW5pZm9ybXMuY2xlYXJjb2F0TWFwVHJhbnNmb3JtICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzc01hcCApIHtcclxuXHJcblx0XHRcdFx0dW5pZm9ybXMuY2xlYXJjb2F0Um91Z2huZXNzTWFwLnZhbHVlID0gbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzTWFwO1xyXG5cclxuXHRcdFx0XHRyZWZyZXNoVHJhbnNmb3JtVW5pZm9ybSggbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzTWFwLCB1bmlmb3Jtcy5jbGVhcmNvYXRSb3VnaG5lc3NNYXBUcmFuc2Zvcm0gKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWwuY2xlYXJjb2F0Tm9ybWFsTWFwICkge1xyXG5cclxuXHRcdFx0XHR1bmlmb3Jtcy5jbGVhcmNvYXROb3JtYWxNYXAudmFsdWUgPSBtYXRlcmlhbC5jbGVhcmNvYXROb3JtYWxNYXA7XHJcblxyXG5cdFx0XHRcdHJlZnJlc2hUcmFuc2Zvcm1Vbmlmb3JtKCBtYXRlcmlhbC5jbGVhcmNvYXROb3JtYWxNYXAsIHVuaWZvcm1zLmNsZWFyY29hdE5vcm1hbE1hcFRyYW5zZm9ybSApO1xyXG5cclxuXHRcdFx0XHR1bmlmb3Jtcy5jbGVhcmNvYXROb3JtYWxTY2FsZS52YWx1ZS5jb3B5KCBtYXRlcmlhbC5jbGVhcmNvYXROb3JtYWxTY2FsZSApO1xyXG5cclxuXHRcdFx0XHRpZiAoIG1hdGVyaWFsLnNpZGUgPT09IEJhY2tTaWRlICkge1xyXG5cclxuXHRcdFx0XHRcdHVuaWZvcm1zLmNsZWFyY29hdE5vcm1hbFNjYWxlLnZhbHVlLm5lZ2F0ZSgpO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggbWF0ZXJpYWwuZGlzcGVyc2lvbiA+IDAgKSB7XHJcblxyXG5cdFx0XHR1bmlmb3Jtcy5kaXNwZXJzaW9uLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGVyc2lvbjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBtYXRlcmlhbC5pcmlkZXNjZW5jZSA+IDAgKSB7XHJcblxyXG5cdFx0XHR1bmlmb3Jtcy5pcmlkZXNjZW5jZS52YWx1ZSA9IG1hdGVyaWFsLmlyaWRlc2NlbmNlO1xyXG5cdFx0XHR1bmlmb3Jtcy5pcmlkZXNjZW5jZUlPUi52YWx1ZSA9IG1hdGVyaWFsLmlyaWRlc2NlbmNlSU9SO1xyXG5cdFx0XHR1bmlmb3Jtcy5pcmlkZXNjZW5jZVRoaWNrbmVzc01pbmltdW0udmFsdWUgPSBtYXRlcmlhbC5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlWyAwIF07XHJcblx0XHRcdHVuaWZvcm1zLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWF4aW11bS52YWx1ZSA9IG1hdGVyaWFsLmlyaWRlc2NlbmNlVGhpY2tuZXNzUmFuZ2VbIDEgXTtcclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWwuaXJpZGVzY2VuY2VNYXAgKSB7XHJcblxyXG5cdFx0XHRcdHVuaWZvcm1zLmlyaWRlc2NlbmNlTWFwLnZhbHVlID0gbWF0ZXJpYWwuaXJpZGVzY2VuY2VNYXA7XHJcblxyXG5cdFx0XHRcdHJlZnJlc2hUcmFuc2Zvcm1Vbmlmb3JtKCBtYXRlcmlhbC5pcmlkZXNjZW5jZU1hcCwgdW5pZm9ybXMuaXJpZGVzY2VuY2VNYXBUcmFuc2Zvcm0gKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWwuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAgKSB7XHJcblxyXG5cdFx0XHRcdHVuaWZvcm1zLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwLnZhbHVlID0gbWF0ZXJpYWwuaXJpZGVzY2VuY2VUaGlja25lc3NNYXA7XHJcblxyXG5cdFx0XHRcdHJlZnJlc2hUcmFuc2Zvcm1Vbmlmb3JtKCBtYXRlcmlhbC5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcCwgdW5pZm9ybXMuaXJpZGVzY2VuY2VUaGlja25lc3NNYXBUcmFuc2Zvcm0gKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBtYXRlcmlhbC50cmFuc21pc3Npb24gPiAwICkge1xyXG5cclxuXHRcdFx0dW5pZm9ybXMudHJhbnNtaXNzaW9uLnZhbHVlID0gbWF0ZXJpYWwudHJhbnNtaXNzaW9uO1xyXG5cdFx0XHR1bmlmb3Jtcy50cmFuc21pc3Npb25TYW1wbGVyTWFwLnZhbHVlID0gdHJhbnNtaXNzaW9uUmVuZGVyVGFyZ2V0LnRleHR1cmU7XHJcblx0XHRcdHVuaWZvcm1zLnRyYW5zbWlzc2lvblNhbXBsZXJTaXplLnZhbHVlLnNldCggdHJhbnNtaXNzaW9uUmVuZGVyVGFyZ2V0LndpZHRoLCB0cmFuc21pc3Npb25SZW5kZXJUYXJnZXQuaGVpZ2h0ICk7XHJcblxyXG5cdFx0XHRpZiAoIG1hdGVyaWFsLnRyYW5zbWlzc2lvbk1hcCApIHtcclxuXHJcblx0XHRcdFx0dW5pZm9ybXMudHJhbnNtaXNzaW9uTWFwLnZhbHVlID0gbWF0ZXJpYWwudHJhbnNtaXNzaW9uTWFwO1xyXG5cclxuXHRcdFx0XHRyZWZyZXNoVHJhbnNmb3JtVW5pZm9ybSggbWF0ZXJpYWwudHJhbnNtaXNzaW9uTWFwLCB1bmlmb3Jtcy50cmFuc21pc3Npb25NYXBUcmFuc2Zvcm0gKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHVuaWZvcm1zLnRoaWNrbmVzcy52YWx1ZSA9IG1hdGVyaWFsLnRoaWNrbmVzcztcclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWwudGhpY2tuZXNzTWFwICkge1xyXG5cclxuXHRcdFx0XHR1bmlmb3Jtcy50aGlja25lc3NNYXAudmFsdWUgPSBtYXRlcmlhbC50aGlja25lc3NNYXA7XHJcblxyXG5cdFx0XHRcdHJlZnJlc2hUcmFuc2Zvcm1Vbmlmb3JtKCBtYXRlcmlhbC50aGlja25lc3NNYXAsIHVuaWZvcm1zLnRoaWNrbmVzc01hcFRyYW5zZm9ybSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dW5pZm9ybXMuYXR0ZW51YXRpb25EaXN0YW5jZS52YWx1ZSA9IG1hdGVyaWFsLmF0dGVudWF0aW9uRGlzdGFuY2U7XHJcblx0XHRcdHVuaWZvcm1zLmF0dGVudWF0aW9uQ29sb3IudmFsdWUuY29weSggbWF0ZXJpYWwuYXR0ZW51YXRpb25Db2xvciApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIG1hdGVyaWFsLmFuaXNvdHJvcHkgPiAwICkge1xyXG5cclxuXHRcdFx0dW5pZm9ybXMuYW5pc290cm9weVZlY3Rvci52YWx1ZS5zZXQoIG1hdGVyaWFsLmFuaXNvdHJvcHkgKiBNYXRoLmNvcyggbWF0ZXJpYWwuYW5pc290cm9weVJvdGF0aW9uICksIG1hdGVyaWFsLmFuaXNvdHJvcHkgKiBNYXRoLnNpbiggbWF0ZXJpYWwuYW5pc290cm9weVJvdGF0aW9uICkgKTtcclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWwuYW5pc290cm9weU1hcCApIHtcclxuXHJcblx0XHRcdFx0dW5pZm9ybXMuYW5pc290cm9weU1hcC52YWx1ZSA9IG1hdGVyaWFsLmFuaXNvdHJvcHlNYXA7XHJcblxyXG5cdFx0XHRcdHJlZnJlc2hUcmFuc2Zvcm1Vbmlmb3JtKCBtYXRlcmlhbC5hbmlzb3Ryb3B5TWFwLCB1bmlmb3Jtcy5hbmlzb3Ryb3B5TWFwVHJhbnNmb3JtICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHVuaWZvcm1zLnNwZWN1bGFySW50ZW5zaXR5LnZhbHVlID0gbWF0ZXJpYWwuc3BlY3VsYXJJbnRlbnNpdHk7XHJcblx0XHR1bmlmb3Jtcy5zcGVjdWxhckNvbG9yLnZhbHVlLmNvcHkoIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgKTtcclxuXHJcblx0XHRpZiAoIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3JNYXAgKSB7XHJcblxyXG5cdFx0XHR1bmlmb3Jtcy5zcGVjdWxhckNvbG9yTWFwLnZhbHVlID0gbWF0ZXJpYWwuc3BlY3VsYXJDb2xvck1hcDtcclxuXHJcblx0XHRcdHJlZnJlc2hUcmFuc2Zvcm1Vbmlmb3JtKCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yTWFwLCB1bmlmb3Jtcy5zcGVjdWxhckNvbG9yTWFwVHJhbnNmb3JtICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggbWF0ZXJpYWwuc3BlY3VsYXJJbnRlbnNpdHlNYXAgKSB7XHJcblxyXG5cdFx0XHR1bmlmb3Jtcy5zcGVjdWxhckludGVuc2l0eU1hcC52YWx1ZSA9IG1hdGVyaWFsLnNwZWN1bGFySW50ZW5zaXR5TWFwO1xyXG5cclxuXHRcdFx0cmVmcmVzaFRyYW5zZm9ybVVuaWZvcm0oIG1hdGVyaWFsLnNwZWN1bGFySW50ZW5zaXR5TWFwLCB1bmlmb3Jtcy5zcGVjdWxhckludGVuc2l0eU1hcFRyYW5zZm9ybSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNNYXRjYXAoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcclxuXHJcblx0XHRpZiAoIG1hdGVyaWFsLm1hdGNhcCApIHtcclxuXHJcblx0XHRcdHVuaWZvcm1zLm1hdGNhcC52YWx1ZSA9IG1hdGVyaWFsLm1hdGNhcDtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zRGlzdGFuY2UoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcclxuXHJcblx0XHRjb25zdCBsaWdodCA9IHByb3BlcnRpZXMuZ2V0KCBtYXRlcmlhbCApLmxpZ2h0O1xyXG5cclxuXHRcdHVuaWZvcm1zLnJlZmVyZW5jZVBvc2l0aW9uLnZhbHVlLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTtcclxuXHRcdHVuaWZvcm1zLm5lYXJEaXN0YW5jZS52YWx1ZSA9IGxpZ2h0LnNoYWRvdy5jYW1lcmEubmVhcjtcclxuXHRcdHVuaWZvcm1zLmZhckRpc3RhbmNlLnZhbHVlID0gbGlnaHQuc2hhZG93LmNhbWVyYS5mYXI7XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIHtcclxuXHRcdHJlZnJlc2hGb2dVbmlmb3JtczogcmVmcmVzaEZvZ1VuaWZvcm1zLFxyXG5cdFx0cmVmcmVzaE1hdGVyaWFsVW5pZm9ybXM6IHJlZnJlc2hNYXRlcmlhbFVuaWZvcm1zXHJcblx0fTtcclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFdlYkdMTWF0ZXJpYWxzIH07XHJcbiIsImZ1bmN0aW9uIFdlYkdMVW5pZm9ybXNHcm91cHMoIGdsLCBpbmZvLCBjYXBhYmlsaXRpZXMsIHN0YXRlICkge1xyXG5cclxuXHRsZXQgYnVmZmVycyA9IHt9O1xyXG5cdGxldCB1cGRhdGVMaXN0ID0ge307XHJcblx0bGV0IGFsbG9jYXRlZEJpbmRpbmdQb2ludHMgPSBbXTtcclxuXHJcblx0Y29uc3QgbWF4QmluZGluZ1BvaW50cyA9IGdsLmdldFBhcmFtZXRlciggZ2wuTUFYX1VOSUZPUk1fQlVGRkVSX0JJTkRJTkdTICk7IC8vIGJpbmRpbmcgcG9pbnRzIGFyZSBnbG9iYWwgd2hlcmVhcyBibG9jayBpbmRpY2VzIGFyZSBwZXIgc2hhZGVyIHByb2dyYW1cclxuXHJcblx0ZnVuY3Rpb24gYmluZCggdW5pZm9ybXNHcm91cCwgcHJvZ3JhbSApIHtcclxuXHJcblx0XHRjb25zdCB3ZWJnbFByb2dyYW0gPSBwcm9ncmFtLnByb2dyYW07XHJcblx0XHRzdGF0ZS51bmlmb3JtQmxvY2tCaW5kaW5nKCB1bmlmb3Jtc0dyb3VwLCB3ZWJnbFByb2dyYW0gKTtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiB1cGRhdGUoIHVuaWZvcm1zR3JvdXAsIHByb2dyYW0gKSB7XHJcblxyXG5cdFx0bGV0IGJ1ZmZlciA9IGJ1ZmZlcnNbIHVuaWZvcm1zR3JvdXAuaWQgXTtcclxuXHJcblx0XHRpZiAoIGJ1ZmZlciA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0cHJlcGFyZVVuaWZvcm1zR3JvdXAoIHVuaWZvcm1zR3JvdXAgKTtcclxuXHJcblx0XHRcdGJ1ZmZlciA9IGNyZWF0ZUJ1ZmZlciggdW5pZm9ybXNHcm91cCApO1xyXG5cdFx0XHRidWZmZXJzWyB1bmlmb3Jtc0dyb3VwLmlkIF0gPSBidWZmZXI7XHJcblxyXG5cdFx0XHR1bmlmb3Jtc0dyb3VwLmFkZEV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25Vbmlmb3Jtc0dyb3Vwc0Rpc3Bvc2UgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gZW5zdXJlIHRvIHVwZGF0ZSB0aGUgYmluZGluZyBwb2ludHMvYmxvY2sgaW5kaWNlcyBtYXBwaW5nIGZvciB0aGlzIHByb2dyYW1cclxuXHJcblx0XHRjb25zdCB3ZWJnbFByb2dyYW0gPSBwcm9ncmFtLnByb2dyYW07XHJcblx0XHRzdGF0ZS51cGRhdGVVQk9NYXBwaW5nKCB1bmlmb3Jtc0dyb3VwLCB3ZWJnbFByb2dyYW0gKTtcclxuXHJcblx0XHQvLyB1cGRhdGUgVUJPIG9uY2UgcGVyIGZyYW1lXHJcblxyXG5cdFx0Y29uc3QgZnJhbWUgPSBpbmZvLnJlbmRlci5mcmFtZTtcclxuXHJcblx0XHRpZiAoIHVwZGF0ZUxpc3RbIHVuaWZvcm1zR3JvdXAuaWQgXSAhPT0gZnJhbWUgKSB7XHJcblxyXG5cdFx0XHR1cGRhdGVCdWZmZXJEYXRhKCB1bmlmb3Jtc0dyb3VwICk7XHJcblxyXG5cdFx0XHR1cGRhdGVMaXN0WyB1bmlmb3Jtc0dyb3VwLmlkIF0gPSBmcmFtZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gY3JlYXRlQnVmZmVyKCB1bmlmb3Jtc0dyb3VwICkge1xyXG5cclxuXHRcdC8vIHRoZSBzZXR1cCBvZiBhbiBVQk8gaXMgaW5kZXBlbmRlbnQgb2YgYSBwYXJ0aWN1bGFyIHNoYWRlciBwcm9ncmFtIGJ1dCBnbG9iYWxcclxuXHJcblx0XHRjb25zdCBiaW5kaW5nUG9pbnRJbmRleCA9IGFsbG9jYXRlQmluZGluZ1BvaW50SW5kZXgoKTtcclxuXHRcdHVuaWZvcm1zR3JvdXAuX19iaW5kaW5nUG9pbnRJbmRleCA9IGJpbmRpbmdQb2ludEluZGV4O1xyXG5cclxuXHRcdGNvbnN0IGJ1ZmZlciA9IGdsLmNyZWF0ZUJ1ZmZlcigpO1xyXG5cdFx0Y29uc3Qgc2l6ZSA9IHVuaWZvcm1zR3JvdXAuX19zaXplO1xyXG5cdFx0Y29uc3QgdXNhZ2UgPSB1bmlmb3Jtc0dyb3VwLnVzYWdlO1xyXG5cclxuXHRcdGdsLmJpbmRCdWZmZXIoIGdsLlVOSUZPUk1fQlVGRkVSLCBidWZmZXIgKTtcclxuXHRcdGdsLmJ1ZmZlckRhdGEoIGdsLlVOSUZPUk1fQlVGRkVSLCBzaXplLCB1c2FnZSApO1xyXG5cdFx0Z2wuYmluZEJ1ZmZlciggZ2wuVU5JRk9STV9CVUZGRVIsIG51bGwgKTtcclxuXHRcdGdsLmJpbmRCdWZmZXJCYXNlKCBnbC5VTklGT1JNX0JVRkZFUiwgYmluZGluZ1BvaW50SW5kZXgsIGJ1ZmZlciApO1xyXG5cclxuXHRcdHJldHVybiBidWZmZXI7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gYWxsb2NhdGVCaW5kaW5nUG9pbnRJbmRleCgpIHtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBtYXhCaW5kaW5nUG9pbnRzOyBpICsrICkge1xyXG5cclxuXHRcdFx0aWYgKCBhbGxvY2F0ZWRCaW5kaW5nUG9pbnRzLmluZGV4T2YoIGkgKSA9PT0gLSAxICkge1xyXG5cclxuXHRcdFx0XHRhbGxvY2F0ZWRCaW5kaW5nUG9pbnRzLnB1c2goIGkgKTtcclxuXHRcdFx0XHRyZXR1cm4gaTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IE1heGltdW0gbnVtYmVyIG9mIHNpbXVsdGFuZW91c2x5IHVzYWJsZSB1bmlmb3JtcyBncm91cHMgcmVhY2hlZC4nICk7XHJcblxyXG5cdFx0cmV0dXJuIDA7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gdXBkYXRlQnVmZmVyRGF0YSggdW5pZm9ybXNHcm91cCApIHtcclxuXHJcblx0XHRjb25zdCBidWZmZXIgPSBidWZmZXJzWyB1bmlmb3Jtc0dyb3VwLmlkIF07XHJcblx0XHRjb25zdCB1bmlmb3JtcyA9IHVuaWZvcm1zR3JvdXAudW5pZm9ybXM7XHJcblx0XHRjb25zdCBjYWNoZSA9IHVuaWZvcm1zR3JvdXAuX19jYWNoZTtcclxuXHJcblx0XHRnbC5iaW5kQnVmZmVyKCBnbC5VTklGT1JNX0JVRkZFUiwgYnVmZmVyICk7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IHVuaWZvcm1zLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdW5pZm9ybUFycmF5ID0gQXJyYXkuaXNBcnJheSggdW5pZm9ybXNbIGkgXSApID8gdW5pZm9ybXNbIGkgXSA6IFsgdW5pZm9ybXNbIGkgXSBdO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGogPSAwLCBqbCA9IHVuaWZvcm1BcnJheS5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgdW5pZm9ybSA9IHVuaWZvcm1BcnJheVsgaiBdO1xyXG5cclxuXHRcdFx0XHRpZiAoIGhhc1VuaWZvcm1DaGFuZ2VkKCB1bmlmb3JtLCBpLCBqLCBjYWNoZSApID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IG9mZnNldCA9IHVuaWZvcm0uX19vZmZzZXQ7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgdmFsdWVzID0gQXJyYXkuaXNBcnJheSggdW5pZm9ybS52YWx1ZSApID8gdW5pZm9ybS52YWx1ZSA6IFsgdW5pZm9ybS52YWx1ZSBdO1xyXG5cclxuXHRcdFx0XHRcdGxldCBhcnJheU9mZnNldCA9IDA7XHJcblxyXG5cdFx0XHRcdFx0Zm9yICggbGV0IGsgPSAwOyBrIDwgdmFsdWVzLmxlbmd0aDsgayArKyApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnN0IHZhbHVlID0gdmFsdWVzWyBrIF07XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCBpbmZvID0gZ2V0VW5pZm9ybVNpemUoIHZhbHVlICk7XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBUT0RPIGFkZCBpbnRlZ2VyIGFuZCBzdHJ1Y3Qgc3VwcG9ydFxyXG5cdFx0XHRcdFx0XHRpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdHVuaWZvcm0uX19kYXRhWyAwIF0gPSB2YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRnbC5idWZmZXJTdWJEYXRhKCBnbC5VTklGT1JNX0JVRkZFUiwgb2Zmc2V0ICsgYXJyYXlPZmZzZXQsIHVuaWZvcm0uX19kYXRhICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCB2YWx1ZS5pc01hdHJpeDMgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdC8vIG1hbnVhbGx5IGNvbnZlcnRpbmcgM3gzIHRvIDN4NFxyXG5cclxuXHRcdFx0XHRcdFx0XHR1bmlmb3JtLl9fZGF0YVsgMCBdID0gdmFsdWUuZWxlbWVudHNbIDAgXTtcclxuXHRcdFx0XHRcdFx0XHR1bmlmb3JtLl9fZGF0YVsgMSBdID0gdmFsdWUuZWxlbWVudHNbIDEgXTtcclxuXHRcdFx0XHRcdFx0XHR1bmlmb3JtLl9fZGF0YVsgMiBdID0gdmFsdWUuZWxlbWVudHNbIDIgXTtcclxuXHRcdFx0XHRcdFx0XHR1bmlmb3JtLl9fZGF0YVsgMyBdID0gMDtcclxuXHRcdFx0XHRcdFx0XHR1bmlmb3JtLl9fZGF0YVsgNCBdID0gdmFsdWUuZWxlbWVudHNbIDMgXTtcclxuXHRcdFx0XHRcdFx0XHR1bmlmb3JtLl9fZGF0YVsgNSBdID0gdmFsdWUuZWxlbWVudHNbIDQgXTtcclxuXHRcdFx0XHRcdFx0XHR1bmlmb3JtLl9fZGF0YVsgNiBdID0gdmFsdWUuZWxlbWVudHNbIDUgXTtcclxuXHRcdFx0XHRcdFx0XHR1bmlmb3JtLl9fZGF0YVsgNyBdID0gMDtcclxuXHRcdFx0XHRcdFx0XHR1bmlmb3JtLl9fZGF0YVsgOCBdID0gdmFsdWUuZWxlbWVudHNbIDYgXTtcclxuXHRcdFx0XHRcdFx0XHR1bmlmb3JtLl9fZGF0YVsgOSBdID0gdmFsdWUuZWxlbWVudHNbIDcgXTtcclxuXHRcdFx0XHRcdFx0XHR1bmlmb3JtLl9fZGF0YVsgMTAgXSA9IHZhbHVlLmVsZW1lbnRzWyA4IF07XHJcblx0XHRcdFx0XHRcdFx0dW5pZm9ybS5fX2RhdGFbIDExIF0gPSAwO1xyXG5cclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0dmFsdWUudG9BcnJheSggdW5pZm9ybS5fX2RhdGEsIGFycmF5T2Zmc2V0ICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGFycmF5T2Zmc2V0ICs9IGluZm8uc3RvcmFnZSAvIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVDtcclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Z2wuYnVmZmVyU3ViRGF0YSggZ2wuVU5JRk9STV9CVUZGRVIsIG9mZnNldCwgdW5pZm9ybS5fX2RhdGEgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRnbC5iaW5kQnVmZmVyKCBnbC5VTklGT1JNX0JVRkZFUiwgbnVsbCApO1xyXG5cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGhhc1VuaWZvcm1DaGFuZ2VkKCB1bmlmb3JtLCBpbmRleCwgaW5kZXhBcnJheSwgY2FjaGUgKSB7XHJcblxyXG5cdFx0Y29uc3QgdmFsdWUgPSB1bmlmb3JtLnZhbHVlO1xyXG5cdFx0Y29uc3QgaW5kZXhTdHJpbmcgPSBpbmRleCArICdfJyArIGluZGV4QXJyYXk7XHJcblxyXG5cdFx0aWYgKCBjYWNoZVsgaW5kZXhTdHJpbmcgXSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Ly8gY2FjaGUgZW50cnkgZG9lcyBub3QgZXhpc3Qgc28gZmFyXHJcblxyXG5cdFx0XHRpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgKSB7XHJcblxyXG5cdFx0XHRcdGNhY2hlWyBpbmRleFN0cmluZyBdID0gdmFsdWU7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRjYWNoZVsgaW5kZXhTdHJpbmcgXSA9IHZhbHVlLmNsb25lKCk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc3QgY2FjaGVkT2JqZWN0ID0gY2FjaGVbIGluZGV4U3RyaW5nIF07XHJcblxyXG5cdFx0XHQvLyBjb21wYXJlIGN1cnJlbnQgdmFsdWUgd2l0aCBjYWNoZWQgZW50cnlcclxuXHJcblx0XHRcdGlmICggdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBjYWNoZWRPYmplY3QgIT09IHZhbHVlICkge1xyXG5cclxuXHRcdFx0XHRcdGNhY2hlWyBpbmRleFN0cmluZyBdID0gdmFsdWU7XHJcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0aWYgKCBjYWNoZWRPYmplY3QuZXF1YWxzKCB2YWx1ZSApID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdFx0XHRjYWNoZWRPYmplY3QuY29weSggdmFsdWUgKTtcclxuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBmYWxzZTtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBwcmVwYXJlVW5pZm9ybXNHcm91cCggdW5pZm9ybXNHcm91cCApIHtcclxuXHJcblx0XHQvLyBkZXRlcm1pbmUgdG90YWwgYnVmZmVyIHNpemUgYWNjb3JkaW5nIHRvIHRoZSBTVEQxNDAgbGF5b3V0XHJcblx0XHQvLyBIaW50OiBTVEQxNDAgaXMgdGhlIG9ubHkgc3VwcG9ydGVkIGxheW91dCBpbiBXZWJHTCAyXHJcblxyXG5cdFx0Y29uc3QgdW5pZm9ybXMgPSB1bmlmb3Jtc0dyb3VwLnVuaWZvcm1zO1xyXG5cclxuXHRcdGxldCBvZmZzZXQgPSAwOyAvLyBnbG9iYWwgYnVmZmVyIG9mZnNldCBpbiBieXRlc1xyXG5cdFx0Y29uc3QgY2h1bmtTaXplID0gMTY7IC8vIHNpemUgb2YgYSBjaHVuayBpbiBieXRlc1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHVuaWZvcm1zLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB1bmlmb3JtQXJyYXkgPSBBcnJheS5pc0FycmF5KCB1bmlmb3Jtc1sgaSBdICkgPyB1bmlmb3Jtc1sgaSBdIDogWyB1bmlmb3Jtc1sgaSBdIF07XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaiA9IDAsIGpsID0gdW5pZm9ybUFycmF5Lmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB1bmlmb3JtID0gdW5pZm9ybUFycmF5WyBqIF07XHJcblxyXG5cdFx0XHRcdGNvbnN0IHZhbHVlcyA9IEFycmF5LmlzQXJyYXkoIHVuaWZvcm0udmFsdWUgKSA/IHVuaWZvcm0udmFsdWUgOiBbIHVuaWZvcm0udmFsdWUgXTtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGsgPSAwLCBrbCA9IHZhbHVlcy5sZW5ndGg7IGsgPCBrbDsgayArKyApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCB2YWx1ZSA9IHZhbHVlc1sgayBdO1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGluZm8gPSBnZXRVbmlmb3JtU2l6ZSggdmFsdWUgKTtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBjaHVua09mZnNldCA9IG9mZnNldCAlIGNodW5rU2l6ZTsgLy8gb2Zmc2V0IGluIHRoZSBjdXJyZW50IGNodW5rXHJcblx0XHRcdFx0XHRjb25zdCBjaHVua1BhZGRpbmcgPSBjaHVua09mZnNldCAlIGluZm8uYm91bmRhcnk7IC8vIHJlcXVpcmVkIHBhZGRpbmcgdG8gbWF0Y2ggYm91bmRhcnlcclxuXHRcdFx0XHRcdGNvbnN0IGNodW5rU3RhcnQgPSBjaHVua09mZnNldCArIGNodW5rUGFkZGluZzsgLy8gdGhlIHN0YXJ0IHBvc2l0aW9uIGluIHRoZSBjdXJyZW50IGNodW5rIGZvciB0aGUgZGF0YVxyXG5cclxuXHRcdFx0XHRcdG9mZnNldCArPSBjaHVua1BhZGRpbmc7XHJcblxyXG5cdFx0XHRcdFx0Ly8gQ2hlY2sgZm9yIGNodW5rIG92ZXJmbG93XHJcblx0XHRcdFx0XHRpZiAoIGNodW5rU3RhcnQgIT09IDAgJiYgKCBjaHVua1NpemUgLSBjaHVua1N0YXJ0ICkgPCBpbmZvLnN0b3JhZ2UgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBBZGQgcGFkZGluZyBhbmQgYWRqdXN0IG9mZnNldFxyXG5cdFx0XHRcdFx0XHRvZmZzZXQgKz0gKCBjaHVua1NpemUgLSBjaHVua1N0YXJ0ICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8vIHRoZSBmb2xsb3dpbmcgdHdvIHByb3BlcnRpZXMgd2lsbCBiZSB1c2VkIGZvciBwYXJ0aWFsIGJ1ZmZlciB1cGRhdGVzXHJcblx0XHRcdFx0XHR1bmlmb3JtLl9fZGF0YSA9IG5ldyBGbG9hdDMyQXJyYXkoIGluZm8uc3RvcmFnZSAvIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCApO1xyXG5cdFx0XHRcdFx0dW5pZm9ybS5fX29mZnNldCA9IG9mZnNldDtcclxuXHJcblx0XHRcdFx0XHQvLyBVcGRhdGUgdGhlIGdsb2JhbCBvZmZzZXRcclxuXHRcdFx0XHRcdG9mZnNldCArPSBpbmZvLnN0b3JhZ2U7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gZW5zdXJlIGNvcnJlY3QgZmluYWwgcGFkZGluZ1xyXG5cclxuXHRcdGNvbnN0IGNodW5rT2Zmc2V0ID0gb2Zmc2V0ICUgY2h1bmtTaXplO1xyXG5cclxuXHRcdGlmICggY2h1bmtPZmZzZXQgPiAwICkgb2Zmc2V0ICs9ICggY2h1bmtTaXplIC0gY2h1bmtPZmZzZXQgKTtcclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdHVuaWZvcm1zR3JvdXAuX19zaXplID0gb2Zmc2V0O1xyXG5cdFx0dW5pZm9ybXNHcm91cC5fX2NhY2hlID0ge307XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gZ2V0VW5pZm9ybVNpemUoIHZhbHVlICkge1xyXG5cclxuXHRcdGNvbnN0IGluZm8gPSB7XHJcblx0XHRcdGJvdW5kYXJ5OiAwLCAvLyBieXRlc1xyXG5cdFx0XHRzdG9yYWdlOiAwIC8vIGJ5dGVzXHJcblx0XHR9O1xyXG5cclxuXHRcdC8vIGRldGVybWluZSBzaXplcyBhY2NvcmRpbmcgdG8gU1REMTQwXHJcblxyXG5cdFx0aWYgKCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nICkge1xyXG5cclxuXHRcdFx0Ly8gZmxvYXQvaW50L2Jvb2xcclxuXHJcblx0XHRcdGluZm8uYm91bmRhcnkgPSA0O1xyXG5cdFx0XHRpbmZvLnN0b3JhZ2UgPSA0O1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHZhbHVlLmlzVmVjdG9yMiApIHtcclxuXHJcblx0XHRcdC8vIHZlYzJcclxuXHJcblx0XHRcdGluZm8uYm91bmRhcnkgPSA4O1xyXG5cdFx0XHRpbmZvLnN0b3JhZ2UgPSA4O1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHZhbHVlLmlzVmVjdG9yMyB8fCB2YWx1ZS5pc0NvbG9yICkge1xyXG5cclxuXHRcdFx0Ly8gdmVjM1xyXG5cclxuXHRcdFx0aW5mby5ib3VuZGFyeSA9IDE2O1xyXG5cdFx0XHRpbmZvLnN0b3JhZ2UgPSAxMjsgLy8gZXZpbDogdmVjMyBtdXN0IHN0YXJ0IG9uIGEgMTYtYnl0ZSBib3VuZGFyeSBidXQgaXQgb25seSBjb25zdW1lcyAxMiBieXRlc1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHZhbHVlLmlzVmVjdG9yNCApIHtcclxuXHJcblx0XHRcdC8vIHZlYzRcclxuXHJcblx0XHRcdGluZm8uYm91bmRhcnkgPSAxNjtcclxuXHRcdFx0aW5mby5zdG9yYWdlID0gMTY7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggdmFsdWUuaXNNYXRyaXgzICkge1xyXG5cclxuXHRcdFx0Ly8gbWF0MyAoaW4gU1REMTQwIGEgM3gzIG1hdHJpeCBpcyByZXByZXNlbnRlZCBhcyAzeDQpXHJcblxyXG5cdFx0XHRpbmZvLmJvdW5kYXJ5ID0gNDg7XHJcblx0XHRcdGluZm8uc3RvcmFnZSA9IDQ4O1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHZhbHVlLmlzTWF0cml4NCApIHtcclxuXHJcblx0XHRcdC8vIG1hdDRcclxuXHJcblx0XHRcdGluZm8uYm91bmRhcnkgPSA2NDtcclxuXHRcdFx0aW5mby5zdG9yYWdlID0gNjQ7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggdmFsdWUuaXNUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBzYW1wbGVycyBjYW4gbm90IGJlIHBhcnQgb2YgYW4gdW5pZm9ybXMgZ3JvdXAuJyApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBVbnN1cHBvcnRlZCB1bmlmb3JtIHZhbHVlIHR5cGUuJywgdmFsdWUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGluZm87XHJcblxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gb25Vbmlmb3Jtc0dyb3Vwc0Rpc3Bvc2UoIGV2ZW50ICkge1xyXG5cclxuXHRcdGNvbnN0IHVuaWZvcm1zR3JvdXAgPSBldmVudC50YXJnZXQ7XHJcblxyXG5cdFx0dW5pZm9ybXNHcm91cC5yZW1vdmVFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uVW5pZm9ybXNHcm91cHNEaXNwb3NlICk7XHJcblxyXG5cdFx0Y29uc3QgaW5kZXggPSBhbGxvY2F0ZWRCaW5kaW5nUG9pbnRzLmluZGV4T2YoIHVuaWZvcm1zR3JvdXAuX19iaW5kaW5nUG9pbnRJbmRleCApO1xyXG5cdFx0YWxsb2NhdGVkQmluZGluZ1BvaW50cy5zcGxpY2UoIGluZGV4LCAxICk7XHJcblxyXG5cdFx0Z2wuZGVsZXRlQnVmZmVyKCBidWZmZXJzWyB1bmlmb3Jtc0dyb3VwLmlkIF0gKTtcclxuXHJcblx0XHRkZWxldGUgYnVmZmVyc1sgdW5pZm9ybXNHcm91cC5pZCBdO1xyXG5cdFx0ZGVsZXRlIHVwZGF0ZUxpc3RbIHVuaWZvcm1zR3JvdXAuaWQgXTtcclxuXHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBkaXNwb3NlKCkge1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IGlkIGluIGJ1ZmZlcnMgKSB7XHJcblxyXG5cdFx0XHRnbC5kZWxldGVCdWZmZXIoIGJ1ZmZlcnNbIGlkIF0gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0YWxsb2NhdGVkQmluZGluZ1BvaW50cyA9IFtdO1xyXG5cdFx0YnVmZmVycyA9IHt9O1xyXG5cdFx0dXBkYXRlTGlzdCA9IHt9O1xyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiB7XHJcblxyXG5cdFx0YmluZDogYmluZCxcclxuXHRcdHVwZGF0ZTogdXBkYXRlLFxyXG5cclxuXHRcdGRpc3Bvc2U6IGRpc3Bvc2VcclxuXHJcblx0fTtcclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgeyBXZWJHTFVuaWZvcm1zR3JvdXBzIH07XHJcbiIsImltcG9ydCB7XHJcblx0UkVWSVNJT04sXHJcblx0QmFja1NpZGUsXHJcblx0RnJvbnRTaWRlLFxyXG5cdERvdWJsZVNpZGUsXHJcblx0SGFsZkZsb2F0VHlwZSxcclxuXHRVbnNpZ25lZEJ5dGVUeXBlLFxyXG5cdE5vVG9uZU1hcHBpbmcsXHJcblx0TGluZWFyTWlwbWFwTGluZWFyRmlsdGVyLFxyXG5cdFNSR0JDb2xvclNwYWNlLFxyXG5cdExpbmVhclNSR0JDb2xvclNwYWNlLFxyXG5cdFJHQkFJbnRlZ2VyRm9ybWF0LFxyXG5cdFJHSW50ZWdlckZvcm1hdCxcclxuXHRSZWRJbnRlZ2VyRm9ybWF0LFxyXG5cdFVuc2lnbmVkSW50VHlwZSxcclxuXHRVbnNpZ25lZFNob3J0VHlwZSxcclxuXHRVbnNpZ25lZEludDI0OFR5cGUsXHJcblx0VW5zaWduZWRTaG9ydDQ0NDRUeXBlLFxyXG5cdFVuc2lnbmVkU2hvcnQ1NTUxVHlwZSxcclxuXHRXZWJHTENvb3JkaW5hdGVTeXN0ZW1cclxufSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uL21hdGgvQ29sb3IuanMnO1xyXG5pbXBvcnQgeyBGcnVzdHVtIH0gZnJvbSAnLi4vbWF0aC9GcnVzdHVtLmpzJztcclxuaW1wb3J0IHsgTWF0cml4NCB9IGZyb20gJy4uL21hdGgvTWF0cml4NC5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3I0IH0gZnJvbSAnLi4vbWF0aC9WZWN0b3I0LmpzJztcclxuaW1wb3J0IHsgV2ViR0xBbmltYXRpb24gfSBmcm9tICcuL3dlYmdsL1dlYkdMQW5pbWF0aW9uLmpzJztcclxuaW1wb3J0IHsgV2ViR0xBdHRyaWJ1dGVzIH0gZnJvbSAnLi93ZWJnbC9XZWJHTEF0dHJpYnV0ZXMuanMnO1xyXG5pbXBvcnQgeyBXZWJHTEJhY2tncm91bmQgfSBmcm9tICcuL3dlYmdsL1dlYkdMQmFja2dyb3VuZC5qcyc7XHJcbmltcG9ydCB7IFdlYkdMQmluZGluZ1N0YXRlcyB9IGZyb20gJy4vd2ViZ2wvV2ViR0xCaW5kaW5nU3RhdGVzLmpzJztcclxuaW1wb3J0IHsgV2ViR0xCdWZmZXJSZW5kZXJlciB9IGZyb20gJy4vd2ViZ2wvV2ViR0xCdWZmZXJSZW5kZXJlci5qcyc7XHJcbmltcG9ydCB7IFdlYkdMQ2FwYWJpbGl0aWVzIH0gZnJvbSAnLi93ZWJnbC9XZWJHTENhcGFiaWxpdGllcy5qcyc7XHJcbmltcG9ydCB7IFdlYkdMQ2xpcHBpbmcgfSBmcm9tICcuL3dlYmdsL1dlYkdMQ2xpcHBpbmcuanMnO1xyXG5pbXBvcnQgeyBXZWJHTEN1YmVNYXBzIH0gZnJvbSAnLi93ZWJnbC9XZWJHTEN1YmVNYXBzLmpzJztcclxuaW1wb3J0IHsgV2ViR0xDdWJlVVZNYXBzIH0gZnJvbSAnLi93ZWJnbC9XZWJHTEN1YmVVVk1hcHMuanMnO1xyXG5pbXBvcnQgeyBXZWJHTEV4dGVuc2lvbnMgfSBmcm9tICcuL3dlYmdsL1dlYkdMRXh0ZW5zaW9ucy5qcyc7XHJcbmltcG9ydCB7IFdlYkdMR2VvbWV0cmllcyB9IGZyb20gJy4vd2ViZ2wvV2ViR0xHZW9tZXRyaWVzLmpzJztcclxuaW1wb3J0IHsgV2ViR0xJbmRleGVkQnVmZmVyUmVuZGVyZXIgfSBmcm9tICcuL3dlYmdsL1dlYkdMSW5kZXhlZEJ1ZmZlclJlbmRlcmVyLmpzJztcclxuaW1wb3J0IHsgV2ViR0xJbmZvIH0gZnJvbSAnLi93ZWJnbC9XZWJHTEluZm8uanMnO1xyXG5pbXBvcnQgeyBXZWJHTE1vcnBodGFyZ2V0cyB9IGZyb20gJy4vd2ViZ2wvV2ViR0xNb3JwaHRhcmdldHMuanMnO1xyXG5pbXBvcnQgeyBXZWJHTE9iamVjdHMgfSBmcm9tICcuL3dlYmdsL1dlYkdMT2JqZWN0cy5qcyc7XHJcbmltcG9ydCB7IFdlYkdMUHJvZ3JhbXMgfSBmcm9tICcuL3dlYmdsL1dlYkdMUHJvZ3JhbXMuanMnO1xyXG5pbXBvcnQgeyBXZWJHTFByb3BlcnRpZXMgfSBmcm9tICcuL3dlYmdsL1dlYkdMUHJvcGVydGllcy5qcyc7XHJcbmltcG9ydCB7IFdlYkdMUmVuZGVyTGlzdHMgfSBmcm9tICcuL3dlYmdsL1dlYkdMUmVuZGVyTGlzdHMuanMnO1xyXG5pbXBvcnQgeyBXZWJHTFJlbmRlclN0YXRlcyB9IGZyb20gJy4vd2ViZ2wvV2ViR0xSZW5kZXJTdGF0ZXMuanMnO1xyXG5pbXBvcnQgeyBXZWJHTFJlbmRlclRhcmdldCB9IGZyb20gJy4vV2ViR0xSZW5kZXJUYXJnZXQuanMnO1xyXG5pbXBvcnQgeyBXZWJHTFNoYWRvd01hcCB9IGZyb20gJy4vd2ViZ2wvV2ViR0xTaGFkb3dNYXAuanMnO1xyXG5pbXBvcnQgeyBXZWJHTFN0YXRlIH0gZnJvbSAnLi93ZWJnbC9XZWJHTFN0YXRlLmpzJztcclxuaW1wb3J0IHsgV2ViR0xUZXh0dXJlcyB9IGZyb20gJy4vd2ViZ2wvV2ViR0xUZXh0dXJlcy5qcyc7XHJcbmltcG9ydCB7IFdlYkdMVW5pZm9ybXMgfSBmcm9tICcuL3dlYmdsL1dlYkdMVW5pZm9ybXMuanMnO1xyXG5pbXBvcnQgeyBXZWJHTFV0aWxzIH0gZnJvbSAnLi93ZWJnbC9XZWJHTFV0aWxzLmpzJztcclxuaW1wb3J0IHsgV2ViWFJNYW5hZ2VyIH0gZnJvbSAnLi93ZWJ4ci9XZWJYUk1hbmFnZXIuanMnO1xyXG5pbXBvcnQgeyBXZWJHTE1hdGVyaWFscyB9IGZyb20gJy4vd2ViZ2wvV2ViR0xNYXRlcmlhbHMuanMnO1xyXG5pbXBvcnQgeyBXZWJHTFVuaWZvcm1zR3JvdXBzIH0gZnJvbSAnLi93ZWJnbC9XZWJHTFVuaWZvcm1zR3JvdXBzLmpzJztcclxuaW1wb3J0IHsgY3JlYXRlQ2FudmFzRWxlbWVudCwgcHJvYmVBc3luYywgdG9Ob3JtYWxpemVkUHJvamVjdGlvbk1hdHJpeCwgdG9SZXZlcnNlZFByb2plY3Rpb25NYXRyaXgsIHdhcm5PbmNlIH0gZnJvbSAnLi4vdXRpbHMuanMnO1xyXG5pbXBvcnQgeyBDb2xvck1hbmFnZW1lbnQgfSBmcm9tICcuLi9tYXRoL0NvbG9yTWFuYWdlbWVudC5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyByZW5kZXJlciB1c2VzIFdlYkdMIDIgdG8gZGlzcGxheSBzY2VuZXMuXHJcbiAqXHJcbiAqIFdlYkdMIDEgaXMgbm90IHN1cHBvcnRlZCBzaW5jZSBgcjE2M2AuXHJcbiAqL1xyXG5jbGFzcyBXZWJHTFJlbmRlcmVyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBXZWJHTCByZW5kZXJlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn5PcHRpb25zfSBbcGFyYW1ldGVyc10gLSBUaGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHBhcmFtZXRlcnMgPSB7fSApIHtcclxuXHJcblx0XHRjb25zdCB7XHJcblx0XHRcdGNhbnZhcyA9IGNyZWF0ZUNhbnZhc0VsZW1lbnQoKSxcclxuXHRcdFx0Y29udGV4dCA9IG51bGwsXHJcblx0XHRcdGRlcHRoID0gdHJ1ZSxcclxuXHRcdFx0c3RlbmNpbCA9IGZhbHNlLFxyXG5cdFx0XHRhbHBoYSA9IGZhbHNlLFxyXG5cdFx0XHRhbnRpYWxpYXMgPSBmYWxzZSxcclxuXHRcdFx0cHJlbXVsdGlwbGllZEFscGhhID0gdHJ1ZSxcclxuXHRcdFx0cHJlc2VydmVEcmF3aW5nQnVmZmVyID0gZmFsc2UsXHJcblx0XHRcdHBvd2VyUHJlZmVyZW5jZSA9ICdkZWZhdWx0JyxcclxuXHRcdFx0ZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdCA9IGZhbHNlLFxyXG5cdFx0XHRyZXZlcnNlRGVwdGhCdWZmZXIgPSBmYWxzZSxcclxuXHRcdH0gPSBwYXJhbWV0ZXJzO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1dlYkdMUmVuZGVyZXIgPSB0cnVlO1xyXG5cclxuXHRcdGxldCBfYWxwaGE7XHJcblxyXG5cdFx0aWYgKCBjb250ZXh0ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0aWYgKCB0eXBlb2YgV2ViR0xSZW5kZXJpbmdDb250ZXh0ICE9PSAndW5kZWZpbmVkJyAmJiBjb250ZXh0IGluc3RhbmNlb2YgV2ViR0xSZW5kZXJpbmdDb250ZXh0ICkge1xyXG5cclxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBXZWJHTCAxIGlzIG5vdCBzdXBwb3J0ZWQgc2luY2UgcjE2My4nICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRfYWxwaGEgPSBjb250ZXh0LmdldENvbnRleHRBdHRyaWJ1dGVzKCkuYWxwaGE7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdF9hbHBoYSA9IGFscGhhO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCB1aW50Q2xlYXJDb2xvciA9IG5ldyBVaW50MzJBcnJheSggNCApO1xyXG5cdFx0Y29uc3QgaW50Q2xlYXJDb2xvciA9IG5ldyBJbnQzMkFycmF5KCA0ICk7XHJcblxyXG5cdFx0bGV0IGN1cnJlbnRSZW5kZXJMaXN0ID0gbnVsbDtcclxuXHRcdGxldCBjdXJyZW50UmVuZGVyU3RhdGUgPSBudWxsO1xyXG5cclxuXHRcdC8vIHJlbmRlcigpIGNhbiBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gYSBjYWxsYmFjayB0cmlnZ2VyZWQgYnkgYW5vdGhlciByZW5kZXIuXHJcblx0XHQvLyBXZSB0cmFjayB0aGlzIHNvIHRoYXQgdGhlIG5lc3RlZCByZW5kZXIgY2FsbCBnZXRzIGl0cyBsaXN0IGFuZCBzdGF0ZSBpc29sYXRlZCBmcm9tIHRoZSBwYXJlbnQgcmVuZGVyIGNhbGwuXHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyTGlzdFN0YWNrID0gW107XHJcblx0XHRjb25zdCByZW5kZXJTdGF0ZVN0YWNrID0gW107XHJcblxyXG5cdFx0Ly8gcHVibGljIHByb3BlcnRpZXNcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgY2FudmFzIHdoZXJlIHRoZSByZW5kZXJlciBkcmF3cyBpdHMgb3V0cHV0LlRoaXMgaXMgYXV0b21hdGljYWxseSBjcmVhdGVkIGJ5IHRoZSByZW5kZXJlclxyXG5cdFx0ICogaW4gdGhlIGNvbnN0cnVjdG9yIChpZiBub3QgcHJvdmlkZWQgYWxyZWFkeSk7IHlvdSBqdXN0IG5lZWQgdG8gYWRkIGl0IHRvIHlvdXIgcGFnZSBsaWtlIHNvOlxyXG5cdFx0ICogYGBganNcclxuXHRcdCAqIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoIHJlbmRlcmVyLmRvbUVsZW1lbnQgKTtcclxuXHRcdCAqIGBgYFxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtET01FbGVtZW50fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRvbUVsZW1lbnQgPSBjYW52YXM7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIG9iamVjdCB3aXRoIGRlYnVnIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MuXHJcblx0XHQgKlxyXG5cdFx0ICogLSBgY2hlY2tTaGFkZXJFcnJvcnNgOiBJZiBpdCBpcyBgdHJ1ZWAsIGRlZmluZXMgd2hldGhlciBtYXRlcmlhbCBzaGFkZXIgcHJvZ3JhbXMgYXJlXHJcblx0XHQgKiBjaGVja2VkIGZvciBlcnJvcnMgZHVyaW5nIGNvbXBpbGF0aW9uIGFuZCBsaW5rYWdlIHByb2Nlc3MuIEl0IG1heSBiZSB1c2VmdWwgdG8gZGlzYWJsZVxyXG5cdFx0ICogdGhpcyBjaGVjayBpbiBwcm9kdWN0aW9uIGZvciBwZXJmb3JtYW5jZSBnYWluLiBJdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0byBrZWVwIHRoZXNlXHJcblx0XHQgKiBjaGVja3MgZW5hYmxlZCBkdXJpbmcgZGV2ZWxvcG1lbnQuIElmIHRoZSBzaGFkZXIgZG9lcyBub3QgY29tcGlsZSBhbmQgbGluayAtIGl0IHdpbGwgbm90XHJcblx0XHQgKiB3b3JrIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsIHdpbGwgbm90IHJlbmRlci5cclxuXHRcdCAqIC0gYG9uU2hhZGVyRXJyb3IoZ2wsIHByb2dyYW0sIGdsVmVydGV4U2hhZGVyLGdsRnJhZ21lbnRTaGFkZXIpYDogQSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0XHJcblx0XHQgKiBjYW4gYmUgdXNlZCBmb3IgY3VzdG9tIGVycm9yIHJlcG9ydGluZy4gVGhlIGNhbGxiYWNrIHJlY2VpdmVzIHRoZSBXZWJHTCBjb250ZXh0LCBhbiBpbnN0YW5jZVxyXG5cdFx0ICogb2YgV2ViR0xQcm9ncmFtIGFzIHdlbGwgdHdvIGluc3RhbmNlcyBvZiBXZWJHTFNoYWRlciByZXByZXNlbnRpbmcgdGhlIHZlcnRleCBhbmQgZnJhZ21lbnQgc2hhZGVyLlxyXG5cdFx0ICogQXNzaWduaW5nIGEgY3VzdG9tIGZ1bmN0aW9uIGRpc2FibGVzIHRoZSBkZWZhdWx0IGVycm9yIHJlcG9ydGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRlYnVnID0ge1xyXG5cclxuXHRcdFx0LyoqXHJcblx0XHRcdCAqIEVuYWJsZXMgZXJyb3IgY2hlY2tpbmcgYW5kIHJlcG9ydGluZyB3aGVuIHNoYWRlciBwcm9ncmFtcyBhcmUgYmVpbmcgY29tcGlsZWQuXHJcblx0XHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0XHQgKi9cclxuXHRcdFx0Y2hlY2tTaGFkZXJFcnJvcnM6IHRydWUsXHJcblx0XHRcdC8qKlxyXG5cdFx0XHQgKiBDYWxsYmFjayBmb3IgY3VzdG9tIGVycm9yIHJlcG9ydGluZy5cclxuXHRcdFx0ICogQHR5cGUgez9GdW5jdGlvbn1cclxuXHRcdFx0ICovXHJcblx0XHRcdG9uU2hhZGVyRXJyb3I6IG51bGxcclxuXHRcdH07XHJcblxyXG5cdFx0Ly8gY2xlYXJpbmdcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIHJlbmRlcmVyIHNob3VsZCBhdXRvbWF0aWNhbGx5IGNsZWFyIGl0cyBvdXRwdXQgYmVmb3JlIHJlbmRlcmluZyBhIGZyYW1lIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hdXRvQ2xlYXIgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSWYge0BsaW5rIFdlYkdMUmVuZGVyZXIjYXV0b0NsZWFyfSBzZXQgdG8gYHRydWVgLCB3aGV0aGVyIHRoZSByZW5kZXJlciBzaG91bGQgY2xlYXJcclxuXHRcdCAqIHRoZSBjb2xvciBidWZmZXIgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmF1dG9DbGVhckNvbG9yID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIElmIHtAbGluayBXZWJHTFJlbmRlcmVyI2F1dG9DbGVhcn0gc2V0IHRvIGB0cnVlYCwgd2hldGhlciB0aGUgcmVuZGVyZXIgc2hvdWxkIGNsZWFyXHJcblx0XHQgKiB0aGUgZGVwdGggYnVmZmVyIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hdXRvQ2xlYXJEZXB0aCA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBJZiB7QGxpbmsgV2ViR0xSZW5kZXJlciNhdXRvQ2xlYXJ9IHNldCB0byBgdHJ1ZWAsIHdoZXRoZXIgdGhlIHJlbmRlcmVyIHNob3VsZCBjbGVhclxyXG5cdFx0ICogdGhlIHN0ZW5jaWwgYnVmZmVyIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hdXRvQ2xlYXJTdGVuY2lsID0gdHJ1ZTtcclxuXHJcblx0XHQvLyBzY2VuZSBncmFwaFxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgcmVuZGVyZXIgc2hvdWxkIHNvcnQgb2JqZWN0cyBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogTm90ZTogU29ydGluZyBpcyB1c2VkIHRvIGF0dGVtcHQgdG8gcHJvcGVybHkgcmVuZGVyIG9iamVjdHMgdGhhdCBoYXZlIHNvbWVcclxuXHRcdCAqIGRlZ3JlZSBvZiB0cmFuc3BhcmVuY3kuIEJ5IGRlZmluaXRpb24sIHNvcnRpbmcgb2JqZWN0cyBtYXkgbm90IHdvcmsgaW4gYWxsXHJcblx0XHQgKiBjYXNlcy4gRGVwZW5kaW5nIG9uIHRoZSBuZWVkcyBvZiBhcHBsaWNhdGlvbiwgaXQgbWF5IGJlIG5lY2Vzc2FyeSB0byB0dXJuXHJcblx0XHQgKiBvZmYgc29ydGluZyBhbmQgdXNlIG90aGVyIG1ldGhvZHMgdG8gZGVhbCB3aXRoIHRyYW5zcGFyZW5jeSByZW5kZXJpbmcgZS5nLlxyXG5cdFx0ICogbWFudWFsbHkgZGV0ZXJtaW5pbmcgZWFjaCBvYmplY3QncyByZW5kZXJpbmcgb3JkZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc29ydE9iamVjdHMgPSB0cnVlO1xyXG5cclxuXHRcdC8vIHVzZXItZGVmaW5lZCBjbGlwcGluZ1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVXNlci1kZWZpbmVkIGNsaXBwaW5nIHBsYW5lcyBzcGVjaWZpZWQgaW4gd29ybGQgc3BhY2UuIFRoZXNlIHBsYW5lcyBhcHBseSBnbG9iYWxseS5cclxuXHRcdCAqIFBvaW50cyBpbiBzcGFjZSB3aG9zZSBkb3QgcHJvZHVjdCB3aXRoIHRoZSBwbGFuZSBpcyBuZWdhdGl2ZSBhcmUgY3V0IGF3YXkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PFBsYW5lPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jbGlwcGluZ1BsYW5lcyA9IFtdO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgcmVuZGVyZXIgcmVzcGVjdHMgb2JqZWN0LWxldmVsIGNsaXBwaW5nIHBsYW5lcyBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxvY2FsQ2xpcHBpbmdFbmFibGVkID0gZmFsc2U7XHJcblxyXG5cdFx0Ly8gdG9uZSBtYXBwaW5nXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdG9uZSBtYXBwaW5nIHRlY2huaXF1ZSBvZiB0aGUgcmVuZGVyZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeyhOb1RvbmVNYXBwaW5nfExpbmVhclRvbmVNYXBwaW5nfFJlaW5oYXJkVG9uZU1hcHBpbmd8Q2luZW9uVG9uZU1hcHBpbmd8QUNFU0ZpbG1pY1RvbmVNYXBwaW5nfEN1c3RvbVRvbmVNYXBwaW5nfEFnWFRvbmVNYXBwaW5nfE5ldXRyYWxUb25lTWFwcGluZyl9XHJcblx0XHQgKiBAZGVmYXVsdCBOb1RvbmVNYXBwaW5nXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudG9uZU1hcHBpbmcgPSBOb1RvbmVNYXBwaW5nO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRXhwb3N1cmUgbGV2ZWwgb2YgdG9uZSBtYXBwaW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudG9uZU1hcHBpbmdFeHBvc3VyZSA9IDEuMDtcclxuXHJcblx0XHQvLyB0cmFuc21pc3Npb25cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBub3JtYWxpemVkIHJlc29sdXRpb24gc2NhbGUgZm9yIHRoZSB0cmFuc21pc3Npb24gcmVuZGVyIHRhcmdldCwgbWVhc3VyZWQgaW4gcGVyY2VudGFnZVxyXG5cdFx0ICogb2Ygdmlld3BvcnQgZGltZW5zaW9ucy4gTG93ZXJpbmcgdGhpcyB2YWx1ZSBjYW4gcmVzdWx0IGluIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGltcHJvdmVtZW50c1xyXG5cdFx0ICogd2hlbiB1c2luZyB7QGxpbmsgTWVzaFBoeXNpY2FsTWF0ZXJpYWwjdHJhbnNtaXNzaW9ufS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRyYW5zbWlzc2lvblJlc29sdXRpb25TY2FsZSA9IDEuMDtcclxuXHJcblx0XHQvLyBpbnRlcm5hbCBwcm9wZXJ0aWVzXHJcblxyXG5cdFx0Y29uc3QgX3RoaXMgPSB0aGlzO1xyXG5cclxuXHRcdGxldCBfaXNDb250ZXh0TG9zdCA9IGZhbHNlO1xyXG5cclxuXHRcdC8vIGludGVybmFsIHN0YXRlIGNhY2hlXHJcblxyXG5cdFx0dGhpcy5fb3V0cHV0Q29sb3JTcGFjZSA9IFNSR0JDb2xvclNwYWNlO1xyXG5cclxuXHRcdGxldCBfY3VycmVudEFjdGl2ZUN1YmVGYWNlID0gMDtcclxuXHRcdGxldCBfY3VycmVudEFjdGl2ZU1pcG1hcExldmVsID0gMDtcclxuXHRcdGxldCBfY3VycmVudFJlbmRlclRhcmdldCA9IG51bGw7XHJcblx0XHRsZXQgX2N1cnJlbnRNYXRlcmlhbElkID0gLSAxO1xyXG5cclxuXHRcdGxldCBfY3VycmVudENhbWVyYSA9IG51bGw7XHJcblxyXG5cdFx0Y29uc3QgX2N1cnJlbnRWaWV3cG9ydCA9IG5ldyBWZWN0b3I0KCk7XHJcblx0XHRjb25zdCBfY3VycmVudFNjaXNzb3IgPSBuZXcgVmVjdG9yNCgpO1xyXG5cdFx0bGV0IF9jdXJyZW50U2Npc3NvclRlc3QgPSBudWxsO1xyXG5cclxuXHRcdGNvbnN0IF9jdXJyZW50Q2xlYXJDb2xvciA9IG5ldyBDb2xvciggMHgwMDAwMDAgKTtcclxuXHRcdGxldCBfY3VycmVudENsZWFyQWxwaGEgPSAwO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0bGV0IF93aWR0aCA9IGNhbnZhcy53aWR0aDtcclxuXHRcdGxldCBfaGVpZ2h0ID0gY2FudmFzLmhlaWdodDtcclxuXHJcblx0XHRsZXQgX3BpeGVsUmF0aW8gPSAxO1xyXG5cdFx0bGV0IF9vcGFxdWVTb3J0ID0gbnVsbDtcclxuXHRcdGxldCBfdHJhbnNwYXJlbnRTb3J0ID0gbnVsbDtcclxuXHJcblx0XHRjb25zdCBfdmlld3BvcnQgPSBuZXcgVmVjdG9yNCggMCwgMCwgX3dpZHRoLCBfaGVpZ2h0ICk7XHJcblx0XHRjb25zdCBfc2Npc3NvciA9IG5ldyBWZWN0b3I0KCAwLCAwLCBfd2lkdGgsIF9oZWlnaHQgKTtcclxuXHRcdGxldCBfc2Npc3NvclRlc3QgPSBmYWxzZTtcclxuXHJcblx0XHQvLyBmcnVzdHVtXHJcblxyXG5cdFx0Y29uc3QgX2ZydXN0dW0gPSBuZXcgRnJ1c3R1bSgpO1xyXG5cclxuXHRcdC8vIGNsaXBwaW5nXHJcblxyXG5cdFx0bGV0IF9jbGlwcGluZ0VuYWJsZWQgPSBmYWxzZTtcclxuXHRcdGxldCBfbG9jYWxDbGlwcGluZ0VuYWJsZWQgPSBmYWxzZTtcclxuXHJcblx0XHQvLyBjYW1lcmEgbWF0cmljZXMgY2FjaGVcclxuXHJcblx0XHRjb25zdCBfY3VycmVudFByb2plY3Rpb25NYXRyaXggPSBuZXcgTWF0cml4NCgpO1xyXG5cdFx0Y29uc3QgX3Byb2pTY3JlZW5NYXRyaXggPSBuZXcgTWF0cml4NCgpO1xyXG5cclxuXHRcdGNvbnN0IF92ZWN0b3IzID0gbmV3IFZlY3RvcjMoKTtcclxuXHJcblx0XHRjb25zdCBfdmVjdG9yNCA9IG5ldyBWZWN0b3I0KCk7XHJcblxyXG5cdFx0Y29uc3QgX2VtcHR5U2NlbmUgPSB7IGJhY2tncm91bmQ6IG51bGwsIGZvZzogbnVsbCwgZW52aXJvbm1lbnQ6IG51bGwsIG92ZXJyaWRlTWF0ZXJpYWw6IG51bGwsIGlzU2NlbmU6IHRydWUgfTtcclxuXHJcblx0XHRsZXQgX3JlbmRlckJhY2tncm91bmQgPSBmYWxzZTtcclxuXHJcblx0XHRmdW5jdGlvbiBnZXRUYXJnZXRQaXhlbFJhdGlvKCkge1xyXG5cclxuXHRcdFx0cmV0dXJuIF9jdXJyZW50UmVuZGVyVGFyZ2V0ID09PSBudWxsID8gX3BpeGVsUmF0aW8gOiAxO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBpbml0aWFsaXplXHJcblxyXG5cdFx0bGV0IF9nbCA9IGNvbnRleHQ7XHJcblxyXG5cdFx0ZnVuY3Rpb24gZ2V0Q29udGV4dCggY29udGV4dE5hbWUsIGNvbnRleHRBdHRyaWJ1dGVzICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIGNhbnZhcy5nZXRDb250ZXh0KCBjb250ZXh0TmFtZSwgY29udGV4dEF0dHJpYnV0ZXMgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dHJ5IHtcclxuXHJcblx0XHRcdGNvbnN0IGNvbnRleHRBdHRyaWJ1dGVzID0ge1xyXG5cdFx0XHRcdGFscGhhOiB0cnVlLFxyXG5cdFx0XHRcdGRlcHRoLFxyXG5cdFx0XHRcdHN0ZW5jaWwsXHJcblx0XHRcdFx0YW50aWFsaWFzLFxyXG5cdFx0XHRcdHByZW11bHRpcGxpZWRBbHBoYSxcclxuXHRcdFx0XHRwcmVzZXJ2ZURyYXdpbmdCdWZmZXIsXHJcblx0XHRcdFx0cG93ZXJQcmVmZXJlbmNlLFxyXG5cdFx0XHRcdGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQsXHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHQvLyBPZmZzY3JlZW5DYW52YXMgZG9lcyBub3QgaGF2ZSBzZXRBdHRyaWJ1dGUsIHNlZSAjMjI4MTFcclxuXHRcdFx0aWYgKCAnc2V0QXR0cmlidXRlJyBpbiBjYW52YXMgKSBjYW52YXMuc2V0QXR0cmlidXRlKCAnZGF0YS1lbmdpbmUnLCBgdGhyZWUuanMgciR7UkVWSVNJT059YCApO1xyXG5cclxuXHRcdFx0Ly8gZXZlbnQgbGlzdGVuZXJzIG11c3QgYmUgcmVnaXN0ZXJlZCBiZWZvcmUgV2ViR0wgY29udGV4dCBpcyBjcmVhdGVkLCBzZWUgIzEyNzUzXHJcblx0XHRcdGNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCAnd2ViZ2xjb250ZXh0bG9zdCcsIG9uQ29udGV4dExvc3QsIGZhbHNlICk7XHJcblx0XHRcdGNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCAnd2ViZ2xjb250ZXh0cmVzdG9yZWQnLCBvbkNvbnRleHRSZXN0b3JlLCBmYWxzZSApO1xyXG5cdFx0XHRjYW52YXMuYWRkRXZlbnRMaXN0ZW5lciggJ3dlYmdsY29udGV4dGNyZWF0aW9uZXJyb3InLCBvbkNvbnRleHRDcmVhdGlvbkVycm9yLCBmYWxzZSApO1xyXG5cclxuXHRcdFx0aWYgKCBfZ2wgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGNvbnRleHROYW1lID0gJ3dlYmdsMic7XHJcblxyXG5cdFx0XHRcdF9nbCA9IGdldENvbnRleHQoIGNvbnRleHROYW1lLCBjb250ZXh0QXR0cmlidXRlcyApO1xyXG5cclxuXHRcdFx0XHRpZiAoIF9nbCA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGdldENvbnRleHQoIGNvbnRleHROYW1lICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdFcnJvciBjcmVhdGluZyBXZWJHTCBjb250ZXh0IHdpdGggeW91ciBzZWxlY3RlZCBhdHRyaWJ1dGVzLicgKTtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnRXJyb3IgY3JlYXRpbmcgV2ViR0wgY29udGV4dC4nICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBjYXRjaCAoIGVycm9yICkge1xyXG5cclxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUmVuZGVyZXI6ICcgKyBlcnJvci5tZXNzYWdlICk7XHJcblx0XHRcdHRocm93IGVycm9yO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRsZXQgZXh0ZW5zaW9ucywgY2FwYWJpbGl0aWVzLCBzdGF0ZSwgaW5mbztcclxuXHRcdGxldCBwcm9wZXJ0aWVzLCB0ZXh0dXJlcywgY3ViZW1hcHMsIGN1YmV1dm1hcHMsIGF0dHJpYnV0ZXMsIGdlb21ldHJpZXMsIG9iamVjdHM7XHJcblx0XHRsZXQgcHJvZ3JhbUNhY2hlLCBtYXRlcmlhbHMsIHJlbmRlckxpc3RzLCByZW5kZXJTdGF0ZXMsIGNsaXBwaW5nLCBzaGFkb3dNYXA7XHJcblxyXG5cdFx0bGV0IGJhY2tncm91bmQsIG1vcnBodGFyZ2V0cywgYnVmZmVyUmVuZGVyZXIsIGluZGV4ZWRCdWZmZXJSZW5kZXJlcjtcclxuXHJcblx0XHRsZXQgdXRpbHMsIGJpbmRpbmdTdGF0ZXMsIHVuaWZvcm1zR3JvdXBzO1xyXG5cclxuXHRcdGZ1bmN0aW9uIGluaXRHTENvbnRleHQoKSB7XHJcblxyXG5cdFx0XHRleHRlbnNpb25zID0gbmV3IFdlYkdMRXh0ZW5zaW9ucyggX2dsICk7XHJcblx0XHRcdGV4dGVuc2lvbnMuaW5pdCgpO1xyXG5cclxuXHRcdFx0dXRpbHMgPSBuZXcgV2ViR0xVdGlscyggX2dsLCBleHRlbnNpb25zICk7XHJcblxyXG5cdFx0XHRjYXBhYmlsaXRpZXMgPSBuZXcgV2ViR0xDYXBhYmlsaXRpZXMoIF9nbCwgZXh0ZW5zaW9ucywgcGFyYW1ldGVycywgdXRpbHMgKTtcclxuXHJcblx0XHRcdHN0YXRlID0gbmV3IFdlYkdMU3RhdGUoIF9nbCwgZXh0ZW5zaW9ucyApO1xyXG5cclxuXHRcdFx0aWYgKCBjYXBhYmlsaXRpZXMucmV2ZXJzZURlcHRoQnVmZmVyICYmIHJldmVyc2VEZXB0aEJ1ZmZlciApIHtcclxuXHJcblx0XHRcdFx0c3RhdGUuYnVmZmVycy5kZXB0aC5zZXRSZXZlcnNlZCggdHJ1ZSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aW5mbyA9IG5ldyBXZWJHTEluZm8oIF9nbCApO1xyXG5cdFx0XHRwcm9wZXJ0aWVzID0gbmV3IFdlYkdMUHJvcGVydGllcygpO1xyXG5cdFx0XHR0ZXh0dXJlcyA9IG5ldyBXZWJHTFRleHR1cmVzKCBfZ2wsIGV4dGVuc2lvbnMsIHN0YXRlLCBwcm9wZXJ0aWVzLCBjYXBhYmlsaXRpZXMsIHV0aWxzLCBpbmZvICk7XHJcblx0XHRcdGN1YmVtYXBzID0gbmV3IFdlYkdMQ3ViZU1hcHMoIF90aGlzICk7XHJcblx0XHRcdGN1YmV1dm1hcHMgPSBuZXcgV2ViR0xDdWJlVVZNYXBzKCBfdGhpcyApO1xyXG5cdFx0XHRhdHRyaWJ1dGVzID0gbmV3IFdlYkdMQXR0cmlidXRlcyggX2dsICk7XHJcblx0XHRcdGJpbmRpbmdTdGF0ZXMgPSBuZXcgV2ViR0xCaW5kaW5nU3RhdGVzKCBfZ2wsIGF0dHJpYnV0ZXMgKTtcclxuXHRcdFx0Z2VvbWV0cmllcyA9IG5ldyBXZWJHTEdlb21ldHJpZXMoIF9nbCwgYXR0cmlidXRlcywgaW5mbywgYmluZGluZ1N0YXRlcyApO1xyXG5cdFx0XHRvYmplY3RzID0gbmV3IFdlYkdMT2JqZWN0cyggX2dsLCBnZW9tZXRyaWVzLCBhdHRyaWJ1dGVzLCBpbmZvICk7XHJcblx0XHRcdG1vcnBodGFyZ2V0cyA9IG5ldyBXZWJHTE1vcnBodGFyZ2V0cyggX2dsLCBjYXBhYmlsaXRpZXMsIHRleHR1cmVzICk7XHJcblx0XHRcdGNsaXBwaW5nID0gbmV3IFdlYkdMQ2xpcHBpbmcoIHByb3BlcnRpZXMgKTtcclxuXHRcdFx0cHJvZ3JhbUNhY2hlID0gbmV3IFdlYkdMUHJvZ3JhbXMoIF90aGlzLCBjdWJlbWFwcywgY3ViZXV2bWFwcywgZXh0ZW5zaW9ucywgY2FwYWJpbGl0aWVzLCBiaW5kaW5nU3RhdGVzLCBjbGlwcGluZyApO1xyXG5cdFx0XHRtYXRlcmlhbHMgPSBuZXcgV2ViR0xNYXRlcmlhbHMoIF90aGlzLCBwcm9wZXJ0aWVzICk7XHJcblx0XHRcdHJlbmRlckxpc3RzID0gbmV3IFdlYkdMUmVuZGVyTGlzdHMoKTtcclxuXHRcdFx0cmVuZGVyU3RhdGVzID0gbmV3IFdlYkdMUmVuZGVyU3RhdGVzKCBleHRlbnNpb25zICk7XHJcblx0XHRcdGJhY2tncm91bmQgPSBuZXcgV2ViR0xCYWNrZ3JvdW5kKCBfdGhpcywgY3ViZW1hcHMsIGN1YmV1dm1hcHMsIHN0YXRlLCBvYmplY3RzLCBfYWxwaGEsIHByZW11bHRpcGxpZWRBbHBoYSApO1xyXG5cdFx0XHRzaGFkb3dNYXAgPSBuZXcgV2ViR0xTaGFkb3dNYXAoIF90aGlzLCBvYmplY3RzLCBjYXBhYmlsaXRpZXMgKTtcclxuXHRcdFx0dW5pZm9ybXNHcm91cHMgPSBuZXcgV2ViR0xVbmlmb3Jtc0dyb3VwcyggX2dsLCBpbmZvLCBjYXBhYmlsaXRpZXMsIHN0YXRlICk7XHJcblxyXG5cdFx0XHRidWZmZXJSZW5kZXJlciA9IG5ldyBXZWJHTEJ1ZmZlclJlbmRlcmVyKCBfZ2wsIGV4dGVuc2lvbnMsIGluZm8gKTtcclxuXHRcdFx0aW5kZXhlZEJ1ZmZlclJlbmRlcmVyID0gbmV3IFdlYkdMSW5kZXhlZEJ1ZmZlclJlbmRlcmVyKCBfZ2wsIGV4dGVuc2lvbnMsIGluZm8gKTtcclxuXHJcblx0XHRcdGluZm8ucHJvZ3JhbXMgPSBwcm9ncmFtQ2FjaGUucHJvZ3JhbXM7XHJcblxyXG5cdFx0XHQvKipcclxuXHRcdFx0ICogSG9sZHMgZGV0YWlscyBhYm91dCB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSBjdXJyZW50IHJlbmRlcmluZyBjb250ZXh0LlxyXG5cdFx0XHQgKlxyXG5cdFx0XHQgKiBAbmFtZSBXZWJHTFJlbmRlcmVyI2NhcGFiaWxpdGllc1xyXG5cdFx0XHQgKiBAdHlwZSB7V2ViR0xSZW5kZXJlcn5DYXBhYmlsaXRpZXN9XHJcblx0XHRcdCAqL1xyXG5cdFx0XHRfdGhpcy5jYXBhYmlsaXRpZXMgPSBjYXBhYmlsaXRpZXM7XHJcblxyXG5cdFx0XHQvKipcclxuXHRcdFx0ICogUHJvdmlkZXMgbWV0aG9kcyBmb3IgcmV0cmlldmluZyBhbmQgdGVzdGluZyBXZWJHTCBleHRlbnNpb25zLlxyXG5cdFx0XHQgKlxyXG5cdFx0XHQgKiAtIGBnZXQoZXh0ZW5zaW9uTmFtZTpzdHJpbmcpYDogVXNlZCB0byBjaGVjayB3aGV0aGVyIGEgV2ViR0wgZXh0ZW5zaW9uIGlzIHN1cHBvcnRlZFxyXG5cdFx0XHQgKiBhbmQgcmV0dXJuIHRoZSBleHRlbnNpb24gb2JqZWN0IGlmIGF2YWlsYWJsZS5cclxuXHRcdFx0ICogLSBgaGFzKGV4dGVuc2lvbk5hbWU6c3RyaW5nKWA6IHJldHVybnMgYHRydWVgIGlmIHRoZSBleHRlbnNpb24gaXMgc3VwcG9ydGVkLlxyXG5cdFx0XHQgKlxyXG5cdFx0XHQgKiBAbmFtZSBXZWJHTFJlbmRlcmVyI2V4dGVuc2lvbnNcclxuXHRcdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdFx0ICovXHJcblx0XHRcdF90aGlzLmV4dGVuc2lvbnMgPSBleHRlbnNpb25zO1xyXG5cclxuXHRcdFx0LyoqXHJcblx0XHRcdCAqIFVzZWQgdG8gdHJhY2sgcHJvcGVydGllcyBvZiBvdGhlciBvYmplY3RzIGxpa2UgbmF0aXZlIFdlYkdMIG9iamVjdHMuXHJcblx0XHRcdCAqXHJcblx0XHRcdCAqIEBuYW1lIFdlYkdMUmVuZGVyZXIjcHJvcGVydGllc1xyXG5cdFx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0XHQgKi9cclxuXHRcdFx0X3RoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7XHJcblxyXG5cdFx0XHQvKipcclxuXHRcdFx0ICogTWFuYWdlcyB0aGUgcmVuZGVyIGxpc3RzIG9mIHRoZSByZW5kZXJlci5cclxuXHRcdFx0ICpcclxuXHRcdFx0ICogQG5hbWUgV2ViR0xSZW5kZXJlciNyZW5kZXJMaXN0c1xyXG5cdFx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0XHQgKi9cclxuXHRcdFx0X3RoaXMucmVuZGVyTGlzdHMgPSByZW5kZXJMaXN0cztcclxuXHJcblxyXG5cclxuXHRcdFx0LyoqXHJcblx0XHRcdCAqIEludGVyZmFjZSBmb3IgbWFuYWdpbmcgc2hhZG93cy5cclxuXHRcdFx0ICpcclxuXHRcdFx0ICogQG5hbWUgV2ViR0xSZW5kZXJlciNzaGFkb3dNYXBcclxuXHRcdFx0ICogQHR5cGUge1dlYkdMUmVuZGVyZXJ+U2hhZG93TWFwfVxyXG5cdFx0XHQgKi9cclxuXHRcdFx0X3RoaXMuc2hhZG93TWFwID0gc2hhZG93TWFwO1xyXG5cclxuXHRcdFx0LyoqXHJcblx0XHRcdCAqIEludGVyZmFjZSBmb3IgbWFuYWdpbmcgdGhlIFdlYkdMIHN0YXRlLlxyXG5cdFx0XHQgKlxyXG5cdFx0XHQgKiBAbmFtZSBXZWJHTFJlbmRlcmVyI3N0YXRlXHJcblx0XHRcdCAqIEB0eXBlIHtPYmplY3R9XHJcblx0XHRcdCAqL1xyXG5cdFx0XHRfdGhpcy5zdGF0ZSA9IHN0YXRlO1xyXG5cclxuXHRcdFx0LyoqXHJcblx0XHRcdCAqIEhvbGRzIGEgc2VyaWVzIG9mIHN0YXRpc3RpY2FsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBHUFUgbWVtb3J5XHJcblx0XHRcdCAqIGFuZCB0aGUgcmVuZGVyaW5nIHByb2Nlc3MuIFVzZWZ1bCBmb3IgZGVidWdnaW5nIGFuZCBtb25pdG9yaW5nLlxyXG5cdFx0XHQgKlxyXG5cdFx0XHQgKiBCeSBkZWZhdWx0IHRoZXNlIGRhdGEgYXJlIHJlc2V0IGF0IGVhY2ggcmVuZGVyIGNhbGwgYnV0IHdoZW4gaGF2aW5nXHJcblx0XHRcdCAqIG11bHRpcGxlIHJlbmRlciBwYXNzZXMgcGVyIGZyYW1lIChlLmcuIHdoZW4gdXNpbmcgcG9zdCBwcm9jZXNzaW5nKSBpdCBjYW5cclxuXHRcdFx0ICogYmUgcHJlZmVycmVkIHRvIHJlc2V0IHdpdGggYSBjdXN0b20gcGF0dGVybi4gRmlyc3QsIHNldCBgYXV0b1Jlc2V0YCB0b1xyXG5cdFx0XHQgKiBgZmFsc2VgLlxyXG5cdFx0XHQgKiBgYGBqc1xyXG5cdFx0XHQgKiByZW5kZXJlci5pbmZvLmF1dG9SZXNldCA9IGZhbHNlO1xyXG5cdFx0XHQgKiBgYGBcclxuXHRcdFx0ICogQ2FsbCBgcmVzZXQoKWAgd2hlbmV2ZXIgeW91IGhhdmUgZmluaXNoZWQgdG8gcmVuZGVyIGEgc2luZ2xlIGZyYW1lLlxyXG5cdFx0XHQgKiBgYGBqc1xyXG5cdFx0XHQgKiByZW5kZXJlci5pbmZvLnJlc2V0KCk7XHJcblx0XHRcdCAqIGBgYFxyXG5cdFx0XHQgKlxyXG5cdFx0XHQgKiBAbmFtZSBXZWJHTFJlbmRlcmVyI2luZm9cclxuXHRcdFx0ICogQHR5cGUge1dlYkdMUmVuZGVyZXJ+SW5mb31cclxuXHRcdFx0ICovXHJcblx0XHRcdF90aGlzLmluZm8gPSBpbmZvO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpbml0R0xDb250ZXh0KCk7XHJcblxyXG5cdFx0Ly8geHJcclxuXHJcblx0XHRjb25zdCB4ciA9IG5ldyBXZWJYUk1hbmFnZXIoIF90aGlzLCBfZ2wgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIHRoZSBYUiBtYW5hZ2VyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtXZWJYUk1hbmFnZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMueHIgPSB4cjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJldHVybnMgdGhlIHJlbmRlcmluZyBjb250ZXh0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEByZXR1cm4ge1dlYkdMMlJlbmRlcmluZ0NvbnRleHR9IFRoZSByZW5kZXJpbmcgY29udGV4dC5cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nZXRDb250ZXh0ID0gZnVuY3Rpb24gKCkge1xyXG5cclxuXHRcdFx0cmV0dXJuIF9nbDtcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmV0dXJucyB0aGUgcmVuZGVyaW5nIGNvbnRleHQgYXR0cmlidXRlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAcmV0dXJuIHtXZWJHTENvbnRleHRBdHRyaWJ1dGVzfSBUaGUgcmVuZGVyaW5nIGNvbnRleHQgYXR0cmlidXRlcy5cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nZXRDb250ZXh0QXR0cmlidXRlcyA9IGZ1bmN0aW9uICgpIHtcclxuXHJcblx0XHRcdHJldHVybiBfZ2wuZ2V0Q29udGV4dEF0dHJpYnV0ZXMoKTtcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU2ltdWxhdGVzIGEgbG9zcyBvZiB0aGUgV2ViR0wgY29udGV4dC4gVGhpcyByZXF1aXJlcyBzdXBwb3J0IGZvciB0aGUgYFdFQkdMX2xvc2VfY29udGV4dGAgZXh0ZW5zaW9uLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZvcmNlQ29udGV4dExvc3MgPSBmdW5jdGlvbiAoKSB7XHJcblxyXG5cdFx0XHRjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2xvc2VfY29udGV4dCcgKTtcclxuXHRcdFx0aWYgKCBleHRlbnNpb24gKSBleHRlbnNpb24ubG9zZUNvbnRleHQoKTtcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU2ltdWxhdGVzIGEgcmVzdG9yZSBvZiB0aGUgV2ViR0wgY29udGV4dC4gVGhpcyByZXF1aXJlcyBzdXBwb3J0IGZvciB0aGUgYFdFQkdMX2xvc2VfY29udGV4dGAgZXh0ZW5zaW9uLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZvcmNlQ29udGV4dFJlc3RvcmUgPSBmdW5jdGlvbiAoKSB7XHJcblxyXG5cdFx0XHRjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2xvc2VfY29udGV4dCcgKTtcclxuXHRcdFx0aWYgKCBleHRlbnNpb24gKSBleHRlbnNpb24ucmVzdG9yZUNvbnRleHQoKTtcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmV0dXJucyB0aGUgcGl4ZWwgcmF0aW8uXHJcblx0XHQgKlxyXG5cdFx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgcGl4ZWwgcmF0aW8uXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ2V0UGl4ZWxSYXRpbyA9IGZ1bmN0aW9uICgpIHtcclxuXHJcblx0XHRcdHJldHVybiBfcGl4ZWxSYXRpbztcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU2V0cyB0aGUgZ2l2ZW4gcGl4ZWwgcmF0aW8gYW5kIHJlc2l6ZXMgdGhlIGNhbnZhcyBpZiBuZWNlc3NhcnkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIHBpeGVsIHJhdGlvLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNldFBpeGVsUmF0aW8gPSBmdW5jdGlvbiAoIHZhbHVlICkge1xyXG5cclxuXHRcdFx0aWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgcmV0dXJuO1xyXG5cclxuXHRcdFx0X3BpeGVsUmF0aW8gPSB2YWx1ZTtcclxuXHJcblx0XHRcdHRoaXMuc2V0U2l6ZSggX3dpZHRoLCBfaGVpZ2h0LCBmYWxzZSApO1xyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXR1cm5zIHRoZSByZW5kZXJlcidzIHNpemUgaW4gbG9naWNhbCBwaXhlbHMuIFRoaXMgbWV0aG9kIGRvZXMgbm90IGhvbm9yIHRoZSBwaXhlbCByYXRpby5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IHRhcmdldCAtIFRoZSBtZXRob2Qgd3JpdGVzIHRoZSByZXN1bHQgaW4gdGhpcyB0YXJnZXQgb2JqZWN0LlxyXG5cdFx0ICogQHJldHVybiB7VmVjdG9yMn0gVGhlIHJlbmRlcmVyJ3Mgc2l6ZSBpbiBsb2dpY2FsIHBpeGVscy5cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nZXRTaXplID0gZnVuY3Rpb24gKCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gdGFyZ2V0LnNldCggX3dpZHRoLCBfaGVpZ2h0ICk7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlc2l6ZXMgdGhlIG91dHB1dCBjYW52YXMgdG8gKHdpZHRoLCBoZWlnaHQpIHdpdGggZGV2aWNlIHBpeGVsIHJhdGlvIHRha2VuXHJcblx0XHQgKiBpbnRvIGFjY291bnQsIGFuZCBhbHNvIHNldHMgdGhlIHZpZXdwb3J0IHRvIGZpdCB0aGF0IHNpemUsIHN0YXJ0aW5nIGluICgwLFxyXG5cdFx0ICogMCkuIFNldHRpbmcgYHVwZGF0ZVN0eWxlYCB0byBmYWxzZSBwcmV2ZW50cyBhbnkgc3R5bGUgY2hhbmdlcyB0byB0aGUgb3V0cHV0IGNhbnZhcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggaW4gbG9naWNhbCBwaXhlbHMuXHJcblx0XHQgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBpbiBsb2dpY2FsIHBpeGVscy5cclxuXHRcdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW3VwZGF0ZVN0eWxlPXRydWVdIC0gV2hldGhlciB0byB1cGRhdGUgdGhlIGBzdHlsZWAgYXR0cmlidXRlIG9mIHRoZSBjYW52YXMgb3Igbm90LlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNldFNpemUgPSBmdW5jdGlvbiAoIHdpZHRoLCBoZWlnaHQsIHVwZGF0ZVN0eWxlID0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdGlmICggeHIuaXNQcmVzZW50aW5nICkge1xyXG5cclxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBDYW5cXCd0IGNoYW5nZSBzaXplIHdoaWxlIFZSIGRldmljZSBpcyBwcmVzZW50aW5nLicgKTtcclxuXHRcdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRfd2lkdGggPSB3aWR0aDtcclxuXHRcdFx0X2hlaWdodCA9IGhlaWdodDtcclxuXHJcblx0XHRcdGNhbnZhcy53aWR0aCA9IE1hdGguZmxvb3IoIHdpZHRoICogX3BpeGVsUmF0aW8gKTtcclxuXHRcdFx0Y2FudmFzLmhlaWdodCA9IE1hdGguZmxvb3IoIGhlaWdodCAqIF9waXhlbFJhdGlvICk7XHJcblxyXG5cdFx0XHRpZiAoIHVwZGF0ZVN0eWxlID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRjYW52YXMuc3R5bGUud2lkdGggPSB3aWR0aCArICdweCc7XHJcblx0XHRcdFx0Y2FudmFzLnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0aGlzLnNldFZpZXdwb3J0KCAwLCAwLCB3aWR0aCwgaGVpZ2h0ICk7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJldHVybnMgdGhlIGRyYXdpbmcgYnVmZmVyIHNpemUgaW4gcGh5c2ljYWwgcGl4ZWxzLiBUaGlzIG1ldGhvZCBob25vcnMgdGhlIHBpeGVsIHJhdGlvLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7VmVjdG9yMn0gdGFyZ2V0IC0gVGhlIG1ldGhvZCB3cml0ZXMgdGhlIHJlc3VsdCBpbiB0aGlzIHRhcmdldCBvYmplY3QuXHJcblx0XHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBUaGUgZHJhd2luZyBidWZmZXIgc2l6ZS5cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nZXREcmF3aW5nQnVmZmVyU2l6ZSA9IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIHRhcmdldC5zZXQoIF93aWR0aCAqIF9waXhlbFJhdGlvLCBfaGVpZ2h0ICogX3BpeGVsUmF0aW8gKS5mbG9vcigpO1xyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIG1ldGhvZCBhbGxvd3MgdG8gZGVmaW5lIHRoZSBkcmF3aW5nIGJ1ZmZlciBzaXplIGJ5IHNwZWNpZnlpbmdcclxuXHRcdCAqIHdpZHRoLCBoZWlnaHQgYW5kIHBpeGVsIHJhdGlvIGFsbCBhdCBvbmNlLiBUaGUgc2l6ZSBvZiB0aGUgZHJhd2luZ1xyXG5cdFx0ICogYnVmZmVyIGlzIGNvbXB1dGVkIHdpdGggdGhpcyBmb3JtdWxhOlxyXG5cdFx0ICogYGBganNcclxuXHRcdCAqIHNpemUueCA9IHdpZHRoICogcGl4ZWxSYXRpbztcclxuXHRcdCAqIHNpemUueSA9IGhlaWdodCAqIHBpeGVsUmF0aW87XHJcblx0XHQgKiBgYGBcclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggaW4gbG9naWNhbCBwaXhlbHMuXHJcblx0XHQgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBpbiBsb2dpY2FsIHBpeGVscy5cclxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyfSBwaXhlbFJhdGlvIC0gVGhlIHBpeGVsIHJhdGlvLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNldERyYXdpbmdCdWZmZXJTaXplID0gZnVuY3Rpb24gKCB3aWR0aCwgaGVpZ2h0LCBwaXhlbFJhdGlvICkge1xyXG5cclxuXHRcdFx0X3dpZHRoID0gd2lkdGg7XHJcblx0XHRcdF9oZWlnaHQgPSBoZWlnaHQ7XHJcblxyXG5cdFx0XHRfcGl4ZWxSYXRpbyA9IHBpeGVsUmF0aW87XHJcblxyXG5cdFx0XHRjYW52YXMud2lkdGggPSBNYXRoLmZsb29yKCB3aWR0aCAqIHBpeGVsUmF0aW8gKTtcclxuXHRcdFx0Y2FudmFzLmhlaWdodCA9IE1hdGguZmxvb3IoIGhlaWdodCAqIHBpeGVsUmF0aW8gKTtcclxuXHJcblx0XHRcdHRoaXMuc2V0Vmlld3BvcnQoIDAsIDAsIHdpZHRoLCBoZWlnaHQgKTtcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmV0dXJucyB0aGUgY3VycmVudCB2aWV3cG9ydCBkZWZpbml0aW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7VmVjdG9yMn0gdGFyZ2V0IC0gVGhlIG1ldGhvZCB3cml0ZXMgdGhlIHJlc3VsdCBpbiB0aGlzIHRhcmdldCBvYmplY3QuXHJcblx0XHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBUaGUgY3VycmVudCB2aWV3cG9ydCBkZWZpbml0aW9uLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdldEN1cnJlbnRWaWV3cG9ydCA9IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIHRhcmdldC5jb3B5KCBfY3VycmVudFZpZXdwb3J0ICk7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJldHVybnMgdGhlIHZpZXdwb3J0IGRlZmluaXRpb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtWZWN0b3I0fSB0YXJnZXQgLSBUaGUgbWV0aG9kIHdyaXRlcyB0aGUgcmVzdWx0IGluIHRoaXMgdGFyZ2V0IG9iamVjdC5cclxuXHRcdCAqIEByZXR1cm4ge1ZlY3RvcjR9IFRoZSB2aWV3cG9ydCBkZWZpbml0aW9uLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdldFZpZXdwb3J0ID0gZnVuY3Rpb24gKCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIF92aWV3cG9ydCApO1xyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTZXRzIHRoZSB2aWV3cG9ydCB0byByZW5kZXIgZnJvbSBgKHgsIHkpYCB0byBgKHggKyB3aWR0aCwgeSArIGhlaWdodClgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyIHwgVmVjdG9yNH0geCAtIFRoZSBob3Jpem9udGFsIGNvb3JkaW5hdGUgZm9yIHRoZSBsb3dlciBsZWZ0IGNvcm5lciBvZiB0aGUgdmlld3BvcnQgb3JpZ2luIGluIGxvZ2ljYWwgcGl4ZWwgdW5pdC5cclxuXHRcdCAqIE9yIGFsdGVybmF0aXZlbHkgYSBmb3VyLWNvbXBvbmVudCB2ZWN0b3Igc3BlY2lmeWluZyBhbGwgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIHZpZXdwb3J0LlxyXG5cdFx0ICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmVydGljYWwgY29vcmRpbmF0ZSBmb3IgdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSB2aWV3cG9ydCBvcmlnaW4gIGluIGxvZ2ljYWwgcGl4ZWwgdW5pdC5cclxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgdmlld3BvcnQgaW4gbG9naWNhbCBwaXhlbCB1bml0LlxyXG5cdFx0ICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIHZpZXdwb3J0IGluIGxvZ2ljYWwgcGl4ZWwgdW5pdC5cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zZXRWaWV3cG9ydCA9IGZ1bmN0aW9uICggeCwgeSwgd2lkdGgsIGhlaWdodCApIHtcclxuXHJcblx0XHRcdGlmICggeC5pc1ZlY3RvcjQgKSB7XHJcblxyXG5cdFx0XHRcdF92aWV3cG9ydC5zZXQoIHgueCwgeC55LCB4LnosIHgudyApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0X3ZpZXdwb3J0LnNldCggeCwgeSwgd2lkdGgsIGhlaWdodCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0c3RhdGUudmlld3BvcnQoIF9jdXJyZW50Vmlld3BvcnQuY29weSggX3ZpZXdwb3J0ICkubXVsdGlwbHlTY2FsYXIoIF9waXhlbFJhdGlvICkucm91bmQoKSApO1xyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXR1cm5zIHRoZSBzY2lzc29yIHJlZ2lvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge1ZlY3RvcjR9IHRhcmdldCAtIFRoZSBtZXRob2Qgd3JpdGVzIHRoZSByZXN1bHQgaW4gdGhpcyB0YXJnZXQgb2JqZWN0LlxyXG5cdFx0ICogQHJldHVybiB7VmVjdG9yNH0gVGhlIHNjaXNzb3IgcmVnaW9uLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdldFNjaXNzb3IgPSBmdW5jdGlvbiAoIHRhcmdldCApIHtcclxuXHJcblx0XHRcdHJldHVybiB0YXJnZXQuY29weSggX3NjaXNzb3IgKTtcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU2V0cyB0aGUgc2Npc3NvciByZWdpb24gdG8gcmVuZGVyIGZyb20gYCh4LCB5KWAgdG8gYCh4ICsgd2lkdGgsIHkgKyBoZWlnaHQpYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge251bWJlciB8IFZlY3RvcjR9IHggLSBUaGUgaG9yaXpvbnRhbCBjb29yZGluYXRlIGZvciB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHNjaXNzb3IgcmVnaW9uIG9yaWdpbiBpbiBsb2dpY2FsIHBpeGVsIHVuaXQuXHJcblx0XHQgKiBPciBhbHRlcm5hdGl2ZWx5IGEgZm91ci1jb21wb25lbnQgdmVjdG9yIHNwZWNpZnlpbmcgYWxsIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBzY2lzc29yIHJlZ2lvbi5cclxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHZlcnRpY2FsIGNvb3JkaW5hdGUgZm9yIHRoZSBsb3dlciBsZWZ0IGNvcm5lciBvZiB0aGUgc2Npc3NvciByZWdpb24gb3JpZ2luICBpbiBsb2dpY2FsIHBpeGVsIHVuaXQuXHJcblx0XHQgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIHNjaXNzb3IgcmVnaW9uIGluIGxvZ2ljYWwgcGl4ZWwgdW5pdC5cclxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSBzY2lzc29yIHJlZ2lvbiBpbiBsb2dpY2FsIHBpeGVsIHVuaXQuXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2V0U2Npc3NvciA9IGZ1bmN0aW9uICggeCwgeSwgd2lkdGgsIGhlaWdodCApIHtcclxuXHJcblx0XHRcdGlmICggeC5pc1ZlY3RvcjQgKSB7XHJcblxyXG5cdFx0XHRcdF9zY2lzc29yLnNldCggeC54LCB4LnksIHgueiwgeC53ICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRfc2Npc3Nvci5zZXQoIHgsIHksIHdpZHRoLCBoZWlnaHQgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHN0YXRlLnNjaXNzb3IoIF9jdXJyZW50U2Npc3Nvci5jb3B5KCBfc2Npc3NvciApLm11bHRpcGx5U2NhbGFyKCBfcGl4ZWxSYXRpbyApLnJvdW5kKCkgKTtcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHNjaXNzb3IgdGVzdCBpcyBlbmFibGVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHNjaXNzb3IgdGVzdCBpcyBlbmFibGVkIG9yIG5vdC5cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nZXRTY2lzc29yVGVzdCA9IGZ1bmN0aW9uICgpIHtcclxuXHJcblx0XHRcdHJldHVybiBfc2Npc3NvclRlc3Q7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBzY2lzc29yIHRlc3QuIFdoZW4gdGhpcyBpcyBlbmFibGVkLCBvbmx5IHRoZSBwaXhlbHNcclxuXHRcdCAqIHdpdGhpbiB0aGUgZGVmaW5lZCBzY2lzc29yIGFyZWEgd2lsbCBiZSBhZmZlY3RlZCBieSBmdXJ0aGVyIHJlbmRlcmVyXHJcblx0XHQgKiBhY3Rpb25zLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7Ym9vbGVhbn0gYm9vbGVhbiAtIFdoZXRoZXIgdGhlIHNjaXNzb3IgdGVzdCBpcyBlbmFibGVkIG9yIG5vdC5cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zZXRTY2lzc29yVGVzdCA9IGZ1bmN0aW9uICggYm9vbGVhbiApIHtcclxuXHJcblx0XHRcdHN0YXRlLnNldFNjaXNzb3JUZXN0KCBfc2Npc3NvclRlc3QgPSBib29sZWFuICk7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNldHMgYSBjdXN0b20gb3BhcXVlIHNvcnQgZnVuY3Rpb24gZm9yIHRoZSByZW5kZXIgbGlzdHMuIFBhc3MgYG51bGxgXHJcblx0XHQgKiB0byB1c2UgdGhlIGRlZmF1bHQgYHBhaW50ZXJTb3J0U3RhYmxlYCBmdW5jdGlvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0gez9GdW5jdGlvbn0gbWV0aG9kIC0gVGhlIG9wYXF1ZSBzb3J0IGZ1bmN0aW9uLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNldE9wYXF1ZVNvcnQgPSBmdW5jdGlvbiAoIG1ldGhvZCApIHtcclxuXHJcblx0XHRcdF9vcGFxdWVTb3J0ID0gbWV0aG9kO1xyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTZXRzIGEgY3VzdG9tIHRyYW5zcGFyZW50IHNvcnQgZnVuY3Rpb24gZm9yIHRoZSByZW5kZXIgbGlzdHMuIFBhc3MgYG51bGxgXHJcblx0XHQgKiB0byB1c2UgdGhlIGRlZmF1bHQgYHJldmVyc2VQYWludGVyU29ydFN0YWJsZWAgZnVuY3Rpb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHs/RnVuY3Rpb259IG1ldGhvZCAtIFRoZSBvcGFxdWUgc29ydCBmdW5jdGlvbi5cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zZXRUcmFuc3BhcmVudFNvcnQgPSBmdW5jdGlvbiAoIG1ldGhvZCApIHtcclxuXHJcblx0XHRcdF90cmFuc3BhcmVudFNvcnQgPSBtZXRob2Q7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHQvLyBDbGVhcmluZ1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmV0dXJucyB0aGUgY2xlYXIgY29sb3IuXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtDb2xvcn0gdGFyZ2V0IC0gVGhlIG1ldGhvZCB3cml0ZXMgdGhlIHJlc3VsdCBpbiB0aGlzIHRhcmdldCBvYmplY3QuXHJcblx0XHQgKiBAcmV0dXJuIHtDb2xvcn0gVGhlIGNsZWFyIGNvbG9yLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdldENsZWFyQ29sb3IgPSBmdW5jdGlvbiAoIHRhcmdldCApIHtcclxuXHJcblx0XHRcdHJldHVybiB0YXJnZXQuY29weSggYmFja2dyb3VuZC5nZXRDbGVhckNvbG9yKCkgKTtcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU2V0cyB0aGUgY2xlYXIgY29sb3IgYW5kIGFscGhhLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7Q29sb3J9IGNvbG9yIC0gVGhlIGNsZWFyIGNvbG9yLlxyXG5cdFx0ICogQHBhcmFtIHtudW1iZXJ9IFthbHBoYT0xXSAtIFRoZSBjbGVhciBhbHBoYS5cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zZXRDbGVhckNvbG9yID0gZnVuY3Rpb24gKCkge1xyXG5cclxuXHRcdFx0YmFja2dyb3VuZC5zZXRDbGVhckNvbG9yKCAuLi5hcmd1bWVudHMgKTtcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmV0dXJucyB0aGUgY2xlYXIgYWxwaGEuIFJhbmdlcyB3aXRoaW4gYFswLDFdYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBjbGVhciBhbHBoYS5cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nZXRDbGVhckFscGhhID0gZnVuY3Rpb24gKCkge1xyXG5cclxuXHRcdFx0cmV0dXJuIGJhY2tncm91bmQuZ2V0Q2xlYXJBbHBoYSgpO1xyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTZXRzIHRoZSBjbGVhciBhbHBoYS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge251bWJlcn0gYWxwaGEgLSBUaGUgY2xlYXIgYWxwaGEuXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2V0Q2xlYXJBbHBoYSA9IGZ1bmN0aW9uICgpIHtcclxuXHJcblx0XHRcdGJhY2tncm91bmQuc2V0Q2xlYXJBbHBoYSggLi4uYXJndW1lbnRzICk7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRlbGxzIHRoZSByZW5kZXJlciB0byBjbGVhciBpdHMgY29sb3IsIGRlcHRoIG9yIHN0ZW5jaWwgZHJhd2luZyBidWZmZXIocykuXHJcblx0XHQgKiBUaGlzIG1ldGhvZCBpbml0aWFsaXplcyB0aGUgYnVmZmVycyB0byB0aGUgY3VycmVudCBjbGVhciBjb2xvciB2YWx1ZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtib29sZWFufSBbY29sb3I9dHJ1ZV0gLSBXaGV0aGVyIHRoZSBjb2xvciBidWZmZXIgc2hvdWxkIGJlIGNsZWFyZWQgb3Igbm90LlxyXG5cdFx0ICogQHBhcmFtIHtib29sZWFufSBbZGVwdGg9dHJ1ZV0gLSBXaGV0aGVyIHRoZSBkZXB0aCBidWZmZXIgc2hvdWxkIGJlIGNsZWFyZWQgb3Igbm90LlxyXG5cdFx0ICogQHBhcmFtIHtib29sZWFufSBbc3RlbmNpbD10cnVlXSAtIFdoZXRoZXIgdGhlIHN0ZW5jaWwgYnVmZmVyIHNob3VsZCBiZSBjbGVhcmVkIG9yIG5vdC5cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jbGVhciA9IGZ1bmN0aW9uICggY29sb3IgPSB0cnVlLCBkZXB0aCA9IHRydWUsIHN0ZW5jaWwgPSB0cnVlICkge1xyXG5cclxuXHRcdFx0bGV0IGJpdHMgPSAwO1xyXG5cclxuXHRcdFx0aWYgKCBjb2xvciApIHtcclxuXHJcblx0XHRcdFx0Ly8gY2hlY2sgaWYgd2UncmUgdHJ5aW5nIHRvIGNsZWFyIGFuIGludGVnZXIgdGFyZ2V0XHJcblx0XHRcdFx0bGV0IGlzSW50ZWdlckZvcm1hdCA9IGZhbHNlO1xyXG5cdFx0XHRcdGlmICggX2N1cnJlbnRSZW5kZXJUYXJnZXQgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgdGFyZ2V0Rm9ybWF0ID0gX2N1cnJlbnRSZW5kZXJUYXJnZXQudGV4dHVyZS5mb3JtYXQ7XHJcblx0XHRcdFx0XHRpc0ludGVnZXJGb3JtYXQgPSB0YXJnZXRGb3JtYXQgPT09IFJHQkFJbnRlZ2VyRm9ybWF0IHx8XHJcblx0XHRcdFx0XHRcdHRhcmdldEZvcm1hdCA9PT0gUkdJbnRlZ2VyRm9ybWF0IHx8XHJcblx0XHRcdFx0XHRcdHRhcmdldEZvcm1hdCA9PT0gUmVkSW50ZWdlckZvcm1hdDtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyB1c2UgdGhlIGFwcHJvcHJpYXRlIGNsZWFyIGZ1bmN0aW9ucyB0byBjbGVhciB0aGUgdGFyZ2V0IGlmIGl0J3MgYSBzaWduZWRcclxuXHRcdFx0XHQvLyBvciB1bnNpZ25lZCBpbnRlZ2VyIHRhcmdldFxyXG5cdFx0XHRcdGlmICggaXNJbnRlZ2VyRm9ybWF0ICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHRhcmdldFR5cGUgPSBfY3VycmVudFJlbmRlclRhcmdldC50ZXh0dXJlLnR5cGU7XHJcblx0XHRcdFx0XHRjb25zdCBpc1Vuc2lnbmVkVHlwZSA9IHRhcmdldFR5cGUgPT09IFVuc2lnbmVkQnl0ZVR5cGUgfHxcclxuXHRcdFx0XHRcdFx0dGFyZ2V0VHlwZSA9PT0gVW5zaWduZWRJbnRUeXBlIHx8XHJcblx0XHRcdFx0XHRcdHRhcmdldFR5cGUgPT09IFVuc2lnbmVkU2hvcnRUeXBlIHx8XHJcblx0XHRcdFx0XHRcdHRhcmdldFR5cGUgPT09IFVuc2lnbmVkSW50MjQ4VHlwZSB8fFxyXG5cdFx0XHRcdFx0XHR0YXJnZXRUeXBlID09PSBVbnNpZ25lZFNob3J0NDQ0NFR5cGUgfHxcclxuXHRcdFx0XHRcdFx0dGFyZ2V0VHlwZSA9PT0gVW5zaWduZWRTaG9ydDU1NTFUeXBlO1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGNsZWFyQ29sb3IgPSBiYWNrZ3JvdW5kLmdldENsZWFyQ29sb3IoKTtcclxuXHRcdFx0XHRcdGNvbnN0IGEgPSBiYWNrZ3JvdW5kLmdldENsZWFyQWxwaGEoKTtcclxuXHRcdFx0XHRcdGNvbnN0IHIgPSBjbGVhckNvbG9yLnI7XHJcblx0XHRcdFx0XHRjb25zdCBnID0gY2xlYXJDb2xvci5nO1xyXG5cdFx0XHRcdFx0Y29uc3QgYiA9IGNsZWFyQ29sb3IuYjtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGlzVW5zaWduZWRUeXBlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0dWludENsZWFyQ29sb3JbIDAgXSA9IHI7XHJcblx0XHRcdFx0XHRcdHVpbnRDbGVhckNvbG9yWyAxIF0gPSBnO1xyXG5cdFx0XHRcdFx0XHR1aW50Q2xlYXJDb2xvclsgMiBdID0gYjtcclxuXHRcdFx0XHRcdFx0dWludENsZWFyQ29sb3JbIDMgXSA9IGE7XHJcblx0XHRcdFx0XHRcdF9nbC5jbGVhckJ1ZmZlcnVpdiggX2dsLkNPTE9SLCAwLCB1aW50Q2xlYXJDb2xvciApO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRpbnRDbGVhckNvbG9yWyAwIF0gPSByO1xyXG5cdFx0XHRcdFx0XHRpbnRDbGVhckNvbG9yWyAxIF0gPSBnO1xyXG5cdFx0XHRcdFx0XHRpbnRDbGVhckNvbG9yWyAyIF0gPSBiO1xyXG5cdFx0XHRcdFx0XHRpbnRDbGVhckNvbG9yWyAzIF0gPSBhO1xyXG5cdFx0XHRcdFx0XHRfZ2wuY2xlYXJCdWZmZXJpdiggX2dsLkNPTE9SLCAwLCBpbnRDbGVhckNvbG9yICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdGJpdHMgfD0gX2dsLkNPTE9SX0JVRkZFUl9CSVQ7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggZGVwdGggKSB7XHJcblxyXG5cdFx0XHRcdGJpdHMgfD0gX2dsLkRFUFRIX0JVRkZFUl9CSVQ7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHN0ZW5jaWwgKSB7XHJcblxyXG5cdFx0XHRcdGJpdHMgfD0gX2dsLlNURU5DSUxfQlVGRkVSX0JJVDtcclxuXHRcdFx0XHR0aGlzLnN0YXRlLmJ1ZmZlcnMuc3RlbmNpbC5zZXRNYXNrKCAweGZmZmZmZmZmICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRfZ2wuY2xlYXIoIGJpdHMgKTtcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQ2xlYXJzIHRoZSBjb2xvciBidWZmZXIuIEVxdWl2YWxlbnQgdG8gY2FsbGluZyBgcmVuZGVyZXIuY2xlYXIoIHRydWUsIGZhbHNlLCBmYWxzZSApYC5cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jbGVhckNvbG9yID0gZnVuY3Rpb24gKCkge1xyXG5cclxuXHRcdFx0dGhpcy5jbGVhciggdHJ1ZSwgZmFsc2UsIGZhbHNlICk7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENsZWFycyB0aGUgZGVwdGggYnVmZmVyLiBFcXVpdmFsZW50IHRvIGNhbGxpbmcgYHJlbmRlcmVyLmNsZWFyKCBmYWxzZSwgdHJ1ZSwgZmFsc2UgKWAuXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2xlYXJEZXB0aCA9IGZ1bmN0aW9uICgpIHtcclxuXHJcblx0XHRcdHRoaXMuY2xlYXIoIGZhbHNlLCB0cnVlLCBmYWxzZSApO1xyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDbGVhcnMgdGhlIHN0ZW5jaWwgYnVmZmVyLiBFcXVpdmFsZW50IHRvIGNhbGxpbmcgYHJlbmRlcmVyLmNsZWFyKCBmYWxzZSwgZmFsc2UsIHRydWUgKWAuXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2xlYXJTdGVuY2lsID0gZnVuY3Rpb24gKCkge1xyXG5cclxuXHRcdFx0dGhpcy5jbGVhciggZmFsc2UsIGZhbHNlLCB0cnVlICk7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEZyZWVzIHRoZSBHUFUtcmVsYXRlZCByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHRoaXMgaW5zdGFuY2UuIENhbGwgdGhpc1xyXG5cdFx0ICogbWV0aG9kIHdoZW5ldmVyIHRoaXMgaW5zdGFuY2UgaXMgbm8gbG9uZ2VyIHVzZWQgaW4geW91ciBhcHAuXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcclxuXHJcblx0XHRcdGNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKCAnd2ViZ2xjb250ZXh0bG9zdCcsIG9uQ29udGV4dExvc3QsIGZhbHNlICk7XHJcblx0XHRcdGNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKCAnd2ViZ2xjb250ZXh0cmVzdG9yZWQnLCBvbkNvbnRleHRSZXN0b3JlLCBmYWxzZSApO1xyXG5cdFx0XHRjYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3dlYmdsY29udGV4dGNyZWF0aW9uZXJyb3InLCBvbkNvbnRleHRDcmVhdGlvbkVycm9yLCBmYWxzZSApO1xyXG5cclxuXHRcdFx0YmFja2dyb3VuZC5kaXNwb3NlKCk7XHJcblx0XHRcdHJlbmRlckxpc3RzLmRpc3Bvc2UoKTtcclxuXHRcdFx0cmVuZGVyU3RhdGVzLmRpc3Bvc2UoKTtcclxuXHRcdFx0cHJvcGVydGllcy5kaXNwb3NlKCk7XHJcblx0XHRcdGN1YmVtYXBzLmRpc3Bvc2UoKTtcclxuXHRcdFx0Y3ViZXV2bWFwcy5kaXNwb3NlKCk7XHJcblx0XHRcdG9iamVjdHMuZGlzcG9zZSgpO1xyXG5cdFx0XHRiaW5kaW5nU3RhdGVzLmRpc3Bvc2UoKTtcclxuXHRcdFx0dW5pZm9ybXNHcm91cHMuZGlzcG9zZSgpO1xyXG5cdFx0XHRwcm9ncmFtQ2FjaGUuZGlzcG9zZSgpO1xyXG5cclxuXHRcdFx0eHIuZGlzcG9zZSgpO1xyXG5cclxuXHRcdFx0eHIucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3Nlc3Npb25zdGFydCcsIG9uWFJTZXNzaW9uU3RhcnQgKTtcclxuXHRcdFx0eHIucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3Nlc3Npb25lbmQnLCBvblhSU2Vzc2lvbkVuZCApO1xyXG5cclxuXHRcdFx0YW5pbWF0aW9uLnN0b3AoKTtcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8vIEV2ZW50c1xyXG5cclxuXHRcdGZ1bmN0aW9uIG9uQ29udGV4dExvc3QoIGV2ZW50ICkge1xyXG5cclxuXHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcblx0XHRcdGNvbnNvbGUubG9nKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogQ29udGV4dCBMb3N0LicgKTtcclxuXHJcblx0XHRcdF9pc0NvbnRleHRMb3N0ID0gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0ZnVuY3Rpb24gb25Db250ZXh0UmVzdG9yZSggLyogZXZlbnQgKi8gKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLmxvZyggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IENvbnRleHQgUmVzdG9yZWQuJyApO1xyXG5cclxuXHRcdFx0X2lzQ29udGV4dExvc3QgPSBmYWxzZTtcclxuXHJcblx0XHRcdGNvbnN0IGluZm9BdXRvUmVzZXQgPSBpbmZvLmF1dG9SZXNldDtcclxuXHRcdFx0Y29uc3Qgc2hhZG93TWFwRW5hYmxlZCA9IHNoYWRvd01hcC5lbmFibGVkO1xyXG5cdFx0XHRjb25zdCBzaGFkb3dNYXBBdXRvVXBkYXRlID0gc2hhZG93TWFwLmF1dG9VcGRhdGU7XHJcblx0XHRcdGNvbnN0IHNoYWRvd01hcE5lZWRzVXBkYXRlID0gc2hhZG93TWFwLm5lZWRzVXBkYXRlO1xyXG5cdFx0XHRjb25zdCBzaGFkb3dNYXBUeXBlID0gc2hhZG93TWFwLnR5cGU7XHJcblxyXG5cdFx0XHRpbml0R0xDb250ZXh0KCk7XHJcblxyXG5cdFx0XHRpbmZvLmF1dG9SZXNldCA9IGluZm9BdXRvUmVzZXQ7XHJcblx0XHRcdHNoYWRvd01hcC5lbmFibGVkID0gc2hhZG93TWFwRW5hYmxlZDtcclxuXHRcdFx0c2hhZG93TWFwLmF1dG9VcGRhdGUgPSBzaGFkb3dNYXBBdXRvVXBkYXRlO1xyXG5cdFx0XHRzaGFkb3dNYXAubmVlZHNVcGRhdGUgPSBzaGFkb3dNYXBOZWVkc1VwZGF0ZTtcclxuXHRcdFx0c2hhZG93TWFwLnR5cGUgPSBzaGFkb3dNYXBUeXBlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiBvbkNvbnRleHRDcmVhdGlvbkVycm9yKCBldmVudCApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBBIFdlYkdMIGNvbnRleHQgY291bGQgbm90IGJlIGNyZWF0ZWQuIFJlYXNvbjogJywgZXZlbnQuc3RhdHVzTWVzc2FnZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiBvbk1hdGVyaWFsRGlzcG9zZSggZXZlbnQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBtYXRlcmlhbCA9IGV2ZW50LnRhcmdldDtcclxuXHJcblx0XHRcdG1hdGVyaWFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25NYXRlcmlhbERpc3Bvc2UgKTtcclxuXHJcblx0XHRcdGRlYWxsb2NhdGVNYXRlcmlhbCggbWF0ZXJpYWwgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQnVmZmVyIGRlYWxsb2NhdGlvblxyXG5cclxuXHRcdGZ1bmN0aW9uIGRlYWxsb2NhdGVNYXRlcmlhbCggbWF0ZXJpYWwgKSB7XHJcblxyXG5cdFx0XHRyZWxlYXNlTWF0ZXJpYWxQcm9ncmFtUmVmZXJlbmNlcyggbWF0ZXJpYWwgKTtcclxuXHJcblx0XHRcdHByb3BlcnRpZXMucmVtb3ZlKCBtYXRlcmlhbCApO1xyXG5cclxuXHRcdH1cclxuXHJcblxyXG5cdFx0ZnVuY3Rpb24gcmVsZWFzZU1hdGVyaWFsUHJvZ3JhbVJlZmVyZW5jZXMoIG1hdGVyaWFsICkge1xyXG5cclxuXHRcdFx0Y29uc3QgcHJvZ3JhbXMgPSBwcm9wZXJ0aWVzLmdldCggbWF0ZXJpYWwgKS5wcm9ncmFtcztcclxuXHJcblx0XHRcdGlmICggcHJvZ3JhbXMgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0cHJvZ3JhbXMuZm9yRWFjaCggZnVuY3Rpb24gKCBwcm9ncmFtICkge1xyXG5cclxuXHRcdFx0XHRcdHByb2dyYW1DYWNoZS5yZWxlYXNlUHJvZ3JhbSggcHJvZ3JhbSApO1xyXG5cclxuXHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRcdGlmICggbWF0ZXJpYWwuaXNTaGFkZXJNYXRlcmlhbCApIHtcclxuXHJcblx0XHRcdFx0XHRwcm9ncmFtQ2FjaGUucmVsZWFzZVNoYWRlckNhY2hlKCBtYXRlcmlhbCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEJ1ZmZlciByZW5kZXJpbmdcclxuXHJcblx0XHR0aGlzLnJlbmRlckJ1ZmZlckRpcmVjdCA9IGZ1bmN0aW9uICggY2FtZXJhLCBzY2VuZSwgZ2VvbWV0cnksIG1hdGVyaWFsLCBvYmplY3QsIGdyb3VwICkge1xyXG5cclxuXHRcdFx0aWYgKCBzY2VuZSA9PT0gbnVsbCApIHNjZW5lID0gX2VtcHR5U2NlbmU7IC8vIHJlbmRlckJ1ZmZlckRpcmVjdCBzZWNvbmQgcGFyYW1ldGVyIHVzZWQgdG8gYmUgZm9nIChjb3VsZCBiZSBudWxsKVxyXG5cclxuXHRcdFx0Y29uc3QgZnJvbnRGYWNlQ1cgPSAoIG9iamVjdC5pc01lc2ggJiYgb2JqZWN0Lm1hdHJpeFdvcmxkLmRldGVybWluYW50KCkgPCAwICk7XHJcblxyXG5cdFx0XHRjb25zdCBwcm9ncmFtID0gc2V0UHJvZ3JhbSggY2FtZXJhLCBzY2VuZSwgZ2VvbWV0cnksIG1hdGVyaWFsLCBvYmplY3QgKTtcclxuXHJcblx0XHRcdHN0YXRlLnNldE1hdGVyaWFsKCBtYXRlcmlhbCwgZnJvbnRGYWNlQ1cgKTtcclxuXHJcblx0XHRcdC8vXHJcblxyXG5cdFx0XHRsZXQgaW5kZXggPSBnZW9tZXRyeS5pbmRleDtcclxuXHRcdFx0bGV0IHJhbmdlRmFjdG9yID0gMTtcclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWwud2lyZWZyYW1lID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRpbmRleCA9IGdlb21ldHJpZXMuZ2V0V2lyZWZyYW1lQXR0cmlidXRlKCBnZW9tZXRyeSApO1xyXG5cclxuXHRcdFx0XHRpZiAoIGluZGV4ID09PSB1bmRlZmluZWQgKSByZXR1cm47XHJcblxyXG5cdFx0XHRcdHJhbmdlRmFjdG9yID0gMjtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vXHJcblxyXG5cdFx0XHRjb25zdCBkcmF3UmFuZ2UgPSBnZW9tZXRyeS5kcmF3UmFuZ2U7XHJcblx0XHRcdGNvbnN0IHBvc2l0aW9uID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjtcclxuXHJcblx0XHRcdGxldCBkcmF3U3RhcnQgPSBkcmF3UmFuZ2Uuc3RhcnQgKiByYW5nZUZhY3RvcjtcclxuXHRcdFx0bGV0IGRyYXdFbmQgPSAoIGRyYXdSYW5nZS5zdGFydCArIGRyYXdSYW5nZS5jb3VudCApICogcmFuZ2VGYWN0b3I7XHJcblxyXG5cdFx0XHRpZiAoIGdyb3VwICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRkcmF3U3RhcnQgPSBNYXRoLm1heCggZHJhd1N0YXJ0LCBncm91cC5zdGFydCAqIHJhbmdlRmFjdG9yICk7XHJcblx0XHRcdFx0ZHJhd0VuZCA9IE1hdGgubWluKCBkcmF3RW5kLCAoIGdyb3VwLnN0YXJ0ICsgZ3JvdXAuY291bnQgKSAqIHJhbmdlRmFjdG9yICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRkcmF3U3RhcnQgPSBNYXRoLm1heCggZHJhd1N0YXJ0LCAwICk7XHJcblx0XHRcdFx0ZHJhd0VuZCA9IE1hdGgubWluKCBkcmF3RW5kLCBpbmRleC5jb3VudCApO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggcG9zaXRpb24gIT09IHVuZGVmaW5lZCAmJiBwb3NpdGlvbiAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0ZHJhd1N0YXJ0ID0gTWF0aC5tYXgoIGRyYXdTdGFydCwgMCApO1xyXG5cdFx0XHRcdGRyYXdFbmQgPSBNYXRoLm1pbiggZHJhd0VuZCwgcG9zaXRpb24uY291bnQgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IGRyYXdDb3VudCA9IGRyYXdFbmQgLSBkcmF3U3RhcnQ7XHJcblxyXG5cdFx0XHRpZiAoIGRyYXdDb3VudCA8IDAgfHwgZHJhd0NvdW50ID09PSBJbmZpbml0eSApIHJldHVybjtcclxuXHJcblx0XHRcdC8vXHJcblxyXG5cdFx0XHRiaW5kaW5nU3RhdGVzLnNldHVwKCBvYmplY3QsIG1hdGVyaWFsLCBwcm9ncmFtLCBnZW9tZXRyeSwgaW5kZXggKTtcclxuXHJcblx0XHRcdGxldCBhdHRyaWJ1dGU7XHJcblx0XHRcdGxldCByZW5kZXJlciA9IGJ1ZmZlclJlbmRlcmVyO1xyXG5cclxuXHRcdFx0aWYgKCBpbmRleCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0YXR0cmlidXRlID0gYXR0cmlidXRlcy5nZXQoIGluZGV4ICk7XHJcblxyXG5cdFx0XHRcdHJlbmRlcmVyID0gaW5kZXhlZEJ1ZmZlclJlbmRlcmVyO1xyXG5cdFx0XHRcdHJlbmRlcmVyLnNldEluZGV4KCBhdHRyaWJ1dGUgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vXHJcblxyXG5cdFx0XHRpZiAoIG9iamVjdC5pc01lc2ggKSB7XHJcblxyXG5cdFx0XHRcdGlmICggbWF0ZXJpYWwud2lyZWZyYW1lID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRcdHN0YXRlLnNldExpbmVXaWR0aCggbWF0ZXJpYWwud2lyZWZyYW1lTGluZXdpZHRoICogZ2V0VGFyZ2V0UGl4ZWxSYXRpbygpICk7XHJcblx0XHRcdFx0XHRyZW5kZXJlci5zZXRNb2RlKCBfZ2wuTElORVMgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRyZW5kZXJlci5zZXRNb2RlKCBfZ2wuVFJJQU5HTEVTICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc0xpbmUgKSB7XHJcblxyXG5cdFx0XHRcdGxldCBsaW5lV2lkdGggPSBtYXRlcmlhbC5saW5ld2lkdGg7XHJcblxyXG5cdFx0XHRcdGlmICggbGluZVdpZHRoID09PSB1bmRlZmluZWQgKSBsaW5lV2lkdGggPSAxOyAvLyBOb3QgdXNpbmcgTGluZSpNYXRlcmlhbFxyXG5cclxuXHRcdFx0XHRzdGF0ZS5zZXRMaW5lV2lkdGgoIGxpbmVXaWR0aCAqIGdldFRhcmdldFBpeGVsUmF0aW8oKSApO1xyXG5cclxuXHRcdFx0XHRpZiAoIG9iamVjdC5pc0xpbmVTZWdtZW50cyApIHtcclxuXHJcblx0XHRcdFx0XHRyZW5kZXJlci5zZXRNb2RlKCBfZ2wuTElORVMgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzTGluZUxvb3AgKSB7XHJcblxyXG5cdFx0XHRcdFx0cmVuZGVyZXIuc2V0TW9kZSggX2dsLkxJTkVfTE9PUCApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdHJlbmRlcmVyLnNldE1vZGUoIF9nbC5MSU5FX1NUUklQICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc1BvaW50cyApIHtcclxuXHJcblx0XHRcdFx0cmVuZGVyZXIuc2V0TW9kZSggX2dsLlBPSU5UUyApO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzU3ByaXRlICkge1xyXG5cclxuXHRcdFx0XHRyZW5kZXJlci5zZXRNb2RlKCBfZ2wuVFJJQU5HTEVTICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIG9iamVjdC5pc0JhdGNoZWRNZXNoICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIG9iamVjdC5fbXVsdGlEcmF3SW5zdGFuY2VzICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRcdC8vIEBkZXByZWNhdGVkLCByMTc0XHJcblx0XHRcdFx0XHR3YXJuT25jZSggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IHJlbmRlck11bHRpRHJhd0luc3RhbmNlcyBoYXMgYmVlbiBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gcjE4NC4gQXBwZW5kIHRvIHJlbmRlck11bHRpRHJhdyBhcmd1bWVudHMgYW5kIHVzZSBpbmRpcmVjdGlvbi4nICk7XHJcblx0XHRcdFx0XHRyZW5kZXJlci5yZW5kZXJNdWx0aURyYXdJbnN0YW5jZXMoIG9iamVjdC5fbXVsdGlEcmF3U3RhcnRzLCBvYmplY3QuX211bHRpRHJhd0NvdW50cywgb2JqZWN0Ll9tdWx0aURyYXdDb3VudCwgb2JqZWN0Ll9tdWx0aURyYXdJbnN0YW5jZXMgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoICEgZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9tdWx0aV9kcmF3JyApICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3Qgc3RhcnRzID0gb2JqZWN0Ll9tdWx0aURyYXdTdGFydHM7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGNvdW50cyA9IG9iamVjdC5fbXVsdGlEcmF3Q291bnRzO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBkcmF3Q291bnQgPSBvYmplY3QuX211bHRpRHJhd0NvdW50O1xyXG5cdFx0XHRcdFx0XHRjb25zdCBieXRlc1BlckVsZW1lbnQgPSBpbmRleCA/IGF0dHJpYnV0ZXMuZ2V0KCBpbmRleCApLmJ5dGVzUGVyRWxlbWVudCA6IDE7XHJcblx0XHRcdFx0XHRcdGNvbnN0IHVuaWZvcm1zID0gcHJvcGVydGllcy5nZXQoIG1hdGVyaWFsICkuY3VycmVudFByb2dyYW0uZ2V0VW5pZm9ybXMoKTtcclxuXHRcdFx0XHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgZHJhd0NvdW50OyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHR1bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAnX2dsX0RyYXdJRCcsIGkgKTtcclxuXHRcdFx0XHRcdFx0XHRyZW5kZXJlci5yZW5kZXIoIHN0YXJ0c1sgaSBdIC8gYnl0ZXNQZXJFbGVtZW50LCBjb3VudHNbIGkgXSApO1xyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRyZW5kZXJlci5yZW5kZXJNdWx0aURyYXcoIG9iamVjdC5fbXVsdGlEcmF3U3RhcnRzLCBvYmplY3QuX211bHRpRHJhd0NvdW50cywgb2JqZWN0Ll9tdWx0aURyYXdDb3VudCApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzSW5zdGFuY2VkTWVzaCApIHtcclxuXHJcblx0XHRcdFx0cmVuZGVyZXIucmVuZGVySW5zdGFuY2VzKCBkcmF3U3RhcnQsIGRyYXdDb3VudCwgb2JqZWN0LmNvdW50ICk7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBnZW9tZXRyeS5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5ICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBtYXhJbnN0YW5jZUNvdW50ID0gZ2VvbWV0cnkuX21heEluc3RhbmNlQ291bnQgIT09IHVuZGVmaW5lZCA/IGdlb21ldHJ5Ll9tYXhJbnN0YW5jZUNvdW50IDogSW5maW5pdHk7XHJcblx0XHRcdFx0Y29uc3QgaW5zdGFuY2VDb3VudCA9IE1hdGgubWluKCBnZW9tZXRyeS5pbnN0YW5jZUNvdW50LCBtYXhJbnN0YW5jZUNvdW50ICk7XHJcblxyXG5cdFx0XHRcdHJlbmRlcmVyLnJlbmRlckluc3RhbmNlcyggZHJhd1N0YXJ0LCBkcmF3Q291bnQsIGluc3RhbmNlQ291bnQgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHJlbmRlcmVyLnJlbmRlciggZHJhd1N0YXJ0LCBkcmF3Q291bnQgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8vIENvbXBpbGVcclxuXHJcblx0XHRmdW5jdGlvbiBwcmVwYXJlTWF0ZXJpYWwoIG1hdGVyaWFsLCBzY2VuZSwgb2JqZWN0ICkge1xyXG5cclxuXHRcdFx0aWYgKCBtYXRlcmlhbC50cmFuc3BhcmVudCA9PT0gdHJ1ZSAmJiBtYXRlcmlhbC5zaWRlID09PSBEb3VibGVTaWRlICYmIG1hdGVyaWFsLmZvcmNlU2luZ2xlUGFzcyA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRcdG1hdGVyaWFsLnNpZGUgPSBCYWNrU2lkZTtcclxuXHRcdFx0XHRtYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblx0XHRcdFx0Z2V0UHJvZ3JhbSggbWF0ZXJpYWwsIHNjZW5lLCBvYmplY3QgKTtcclxuXHJcblx0XHRcdFx0bWF0ZXJpYWwuc2lkZSA9IEZyb250U2lkZTtcclxuXHRcdFx0XHRtYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblx0XHRcdFx0Z2V0UHJvZ3JhbSggbWF0ZXJpYWwsIHNjZW5lLCBvYmplY3QgKTtcclxuXHJcblx0XHRcdFx0bWF0ZXJpYWwuc2lkZSA9IERvdWJsZVNpZGU7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRnZXRQcm9ncmFtKCBtYXRlcmlhbCwgc2NlbmUsIG9iamVjdCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENvbXBpbGVzIGFsbCBtYXRlcmlhbHMgaW4gdGhlIHNjZW5lIHdpdGggdGhlIGNhbWVyYS4gVGhpcyBpcyB1c2VmdWwgdG8gcHJlY29tcGlsZSBzaGFkZXJzXHJcblx0XHQgKiBiZWZvcmUgdGhlIGZpcnN0IHJlbmRlcmluZy4gSWYgeW91IHdhbnQgdG8gYWRkIGEgM0Qgb2JqZWN0IHRvIGFuIGV4aXN0aW5nIHNjZW5lLCB1c2UgdGhlIHRoaXJkXHJcblx0XHQgKiBvcHRpb25hbCBwYXJhbWV0ZXIgZm9yIGFwcGx5aW5nIHRoZSB0YXJnZXQgc2NlbmUuXHJcblx0XHQgKlxyXG5cdFx0ICogTm90ZSB0aGF0IHRoZSAodGFyZ2V0KSBzY2VuZSdzIGxpZ2h0aW5nIGFuZCBlbnZpcm9ubWVudCBtdXN0IGJlIGNvbmZpZ3VyZWQgYmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtPYmplY3QzRH0gc2NlbmUgLSBUaGUgc2NlbmUgb3IgYW5vdGhlciB0eXBlIG9mIDNEIG9iamVjdCB0byBwcmVjb21waWxlLlxyXG5cdFx0ICogQHBhcmFtIHtDYW1lcmF9IGNhbWVyYSAtIFRoZSBjYW1lcmEuXHJcblx0XHQgKiBAcGFyYW0gez9TY2VuZX0gW3RhcmdldFNjZW5lPW51bGxdIC0gVGhlIHRhcmdldCBzY2VuZS5cclxuXHRcdCAqIEByZXR1cm4gez9TZXR9IFRoZSBwcmVjb21waWxlZCBtYXRlcmlhbHMuXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29tcGlsZSA9IGZ1bmN0aW9uICggc2NlbmUsIGNhbWVyYSwgdGFyZ2V0U2NlbmUgPSBudWxsICkge1xyXG5cclxuXHRcdFx0aWYgKCB0YXJnZXRTY2VuZSA9PT0gbnVsbCApIHRhcmdldFNjZW5lID0gc2NlbmU7XHJcblxyXG5cdFx0XHRjdXJyZW50UmVuZGVyU3RhdGUgPSByZW5kZXJTdGF0ZXMuZ2V0KCB0YXJnZXRTY2VuZSApO1xyXG5cdFx0XHRjdXJyZW50UmVuZGVyU3RhdGUuaW5pdCggY2FtZXJhICk7XHJcblxyXG5cdFx0XHRyZW5kZXJTdGF0ZVN0YWNrLnB1c2goIGN1cnJlbnRSZW5kZXJTdGF0ZSApO1xyXG5cclxuXHRcdFx0Ly8gZ2F0aGVyIGxpZ2h0cyBmcm9tIGJvdGggdGhlIHRhcmdldCBzY2VuZSBhbmQgdGhlIG5ldyBvYmplY3QgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBzY2VuZS5cclxuXHJcblx0XHRcdHRhcmdldFNjZW5lLnRyYXZlcnNlVmlzaWJsZSggZnVuY3Rpb24gKCBvYmplY3QgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggb2JqZWN0LmlzTGlnaHQgJiYgb2JqZWN0LmxheWVycy50ZXN0KCBjYW1lcmEubGF5ZXJzICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y3VycmVudFJlbmRlclN0YXRlLnB1c2hMaWdodCggb2JqZWN0ICk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBvYmplY3QuY2FzdFNoYWRvdyApIHtcclxuXHJcblx0XHRcdFx0XHRcdGN1cnJlbnRSZW5kZXJTdGF0ZS5wdXNoU2hhZG93KCBvYmplY3QgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHRcdGlmICggc2NlbmUgIT09IHRhcmdldFNjZW5lICkge1xyXG5cclxuXHRcdFx0XHRzY2VuZS50cmF2ZXJzZVZpc2libGUoIGZ1bmN0aW9uICggb2JqZWN0ICkge1xyXG5cclxuXHRcdFx0XHRcdGlmICggb2JqZWN0LmlzTGlnaHQgJiYgb2JqZWN0LmxheWVycy50ZXN0KCBjYW1lcmEubGF5ZXJzICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjdXJyZW50UmVuZGVyU3RhdGUucHVzaExpZ2h0KCBvYmplY3QgKTtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggb2JqZWN0LmNhc3RTaGFkb3cgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGN1cnJlbnRSZW5kZXJTdGF0ZS5wdXNoU2hhZG93KCBvYmplY3QgKTtcclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH0gKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGN1cnJlbnRSZW5kZXJTdGF0ZS5zZXR1cExpZ2h0cygpO1xyXG5cclxuXHRcdFx0Ly8gT25seSBpbml0aWFsaXplIG1hdGVyaWFscyBpbiB0aGUgbmV3IHNjZW5lLCBub3QgdGhlIHRhcmdldFNjZW5lLlxyXG5cclxuXHRcdFx0Y29uc3QgbWF0ZXJpYWxzID0gbmV3IFNldCgpO1xyXG5cclxuXHRcdFx0c2NlbmUudHJhdmVyc2UoIGZ1bmN0aW9uICggb2JqZWN0ICkge1xyXG5cclxuXHRcdFx0XHRpZiAoICEgKCBvYmplY3QuaXNNZXNoIHx8IG9iamVjdC5pc1BvaW50cyB8fCBvYmplY3QuaXNMaW5lIHx8IG9iamVjdC5pc1Nwcml0ZSApICkge1xyXG5cclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRjb25zdCBtYXRlcmlhbCA9IG9iamVjdC5tYXRlcmlhbDtcclxuXHJcblx0XHRcdFx0aWYgKCBtYXRlcmlhbCApIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIG1hdGVyaWFsICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBtYXRlcmlhbC5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IG1hdGVyaWFsMiA9IG1hdGVyaWFsWyBpIF07XHJcblxyXG5cdFx0XHRcdFx0XHRcdHByZXBhcmVNYXRlcmlhbCggbWF0ZXJpYWwyLCB0YXJnZXRTY2VuZSwgb2JqZWN0ICk7XHJcblx0XHRcdFx0XHRcdFx0bWF0ZXJpYWxzLmFkZCggbWF0ZXJpYWwyICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdHByZXBhcmVNYXRlcmlhbCggbWF0ZXJpYWwsIHRhcmdldFNjZW5lLCBvYmplY3QgKTtcclxuXHRcdFx0XHRcdFx0bWF0ZXJpYWxzLmFkZCggbWF0ZXJpYWwgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHRcdGN1cnJlbnRSZW5kZXJTdGF0ZSA9IHJlbmRlclN0YXRlU3RhY2sucG9wKCk7XHJcblxyXG5cdFx0XHRyZXR1cm4gbWF0ZXJpYWxzO1xyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0Ly8gY29tcGlsZUFzeW5jXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBc3luY2hyb25vdXMgdmVyc2lvbiBvZiB7QGxpbmsgV2ViR0xSZW5kZXJlciNjb21waWxlfS5cclxuXHRcdCAqXHJcblx0XHQgKiBUaGlzIG1ldGhvZCBtYWtlcyB1c2Ugb2YgdGhlIGBLSFJfcGFyYWxsZWxfc2hhZGVyX2NvbXBpbGVgIFdlYkdMIGV4dGVuc2lvbi4gSGVuY2UsXHJcblx0XHQgKiBpdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgdGhpcyB2ZXJzaW9uIG9mIGBjb21waWxlKClgIHdoZW5ldmVyIHBvc3NpYmxlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBhc3luY1xyXG5cdFx0ICogQHBhcmFtIHtPYmplY3QzRH0gc2NlbmUgLSBUaGUgc2NlbmUgb3IgYW5vdGhlciB0eXBlIG9mIDNEIG9iamVjdCB0byBwcmVjb21waWxlLlxyXG5cdFx0ICogQHBhcmFtIHtDYW1lcmF9IGNhbWVyYSAtIFRoZSBjYW1lcmEuXHJcblx0XHQgKiBAcGFyYW0gez9TY2VuZX0gW3RhcmdldFNjZW5lPW51bGxdIC0gVGhlIHRhcmdldCBzY2VuZS5cclxuXHRcdCAqIEByZXR1cm4ge1Byb21pc2V9IEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGdpdmVuIHNjZW5lIGNhbiBiZSByZW5kZXJlZCB3aXRob3V0IHVubmVjZXNzYXJ5IHN0YWxsaW5nIGR1ZSB0byBzaGFkZXIgY29tcGlsYXRpb24uXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29tcGlsZUFzeW5jID0gZnVuY3Rpb24gKCBzY2VuZSwgY2FtZXJhLCB0YXJnZXRTY2VuZSA9IG51bGwgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBtYXRlcmlhbHMgPSB0aGlzLmNvbXBpbGUoIHNjZW5lLCBjYW1lcmEsIHRhcmdldFNjZW5lICk7XHJcblxyXG5cdFx0XHQvLyBXYWl0IGZvciBhbGwgdGhlIG1hdGVyaWFscyBpbiB0aGUgbmV3IG9iamVjdCB0byBpbmRpY2F0ZSB0aGF0IHRoZXkncmVcclxuXHRcdFx0Ly8gcmVhZHkgdG8gYmUgdXNlZCBiZWZvcmUgcmVzb2x2aW5nIHRoZSBwcm9taXNlLlxyXG5cclxuXHRcdFx0cmV0dXJuIG5ldyBQcm9taXNlKCAoIHJlc29sdmUgKSA9PiB7XHJcblxyXG5cdFx0XHRcdGZ1bmN0aW9uIGNoZWNrTWF0ZXJpYWxzUmVhZHkoKSB7XHJcblxyXG5cdFx0XHRcdFx0bWF0ZXJpYWxzLmZvckVhY2goIGZ1bmN0aW9uICggbWF0ZXJpYWwgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCBtYXRlcmlhbFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggbWF0ZXJpYWwgKTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgcHJvZ3JhbSA9IG1hdGVyaWFsUHJvcGVydGllcy5jdXJyZW50UHJvZ3JhbTtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggcHJvZ3JhbS5pc1JlYWR5KCkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdC8vIHJlbW92ZSBhbnkgcHJvZ3JhbXMgdGhhdCByZXBvcnQgdGhleSdyZSByZWFkeSB0byB1c2UgZnJvbSB0aGUgbGlzdFxyXG5cdFx0XHRcdFx0XHRcdG1hdGVyaWFscy5kZWxldGUoIG1hdGVyaWFsICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fSApO1xyXG5cclxuXHRcdFx0XHRcdC8vIG9uY2UgdGhlIGxpc3Qgb2YgY29tcGlsaW5nIG1hdGVyaWFscyBpcyBlbXB0eSwgY2FsbCB0aGUgY2FsbGJhY2tcclxuXHJcblx0XHRcdFx0XHRpZiAoIG1hdGVyaWFscy5zaXplID09PSAwICkge1xyXG5cclxuXHRcdFx0XHRcdFx0cmVzb2x2ZSggc2NlbmUgKTtcclxuXHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvLyBpZiBzb21lIG1hdGVyaWFscyBhcmUgc3RpbGwgbm90IHJlYWR5LCB3YWl0IGEgYml0IGFuZCBjaGVjayBhZ2FpblxyXG5cclxuXHRcdFx0XHRcdHNldFRpbWVvdXQoIGNoZWNrTWF0ZXJpYWxzUmVhZHksIDEwICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKCBleHRlbnNpb25zLmdldCggJ0tIUl9wYXJhbGxlbF9zaGFkZXJfY29tcGlsZScgKSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHQvLyBJZiB3ZSBjYW4gY2hlY2sgdGhlIGNvbXBpbGF0aW9uIHN0YXR1cyBvZiB0aGUgbWF0ZXJpYWxzIHdpdGhvdXRcclxuXHRcdFx0XHRcdC8vIGJsb2NraW5nIHRoZW4gZG8gc28gcmlnaHQgYXdheS5cclxuXHJcblx0XHRcdFx0XHRjaGVja01hdGVyaWFsc1JlYWR5KCk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gT3RoZXJ3aXNlIHN0YXJ0IGJ5IHdhaXRpbmcgYSBiaXQgdG8gZ2l2ZSB0aGUgbWF0ZXJpYWxzIHdlIGp1c3RcclxuXHRcdFx0XHRcdC8vIGluaXRpYWxpemVkIGEgY2hhbmNlIHRvIGZpbmlzaC5cclxuXHJcblx0XHRcdFx0XHRzZXRUaW1lb3V0KCBjaGVja01hdGVyaWFsc1JlYWR5LCAxMCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHQvLyBBbmltYXRpb24gTG9vcFxyXG5cclxuXHRcdGxldCBvbkFuaW1hdGlvbkZyYW1lQ2FsbGJhY2sgPSBudWxsO1xyXG5cclxuXHRcdGZ1bmN0aW9uIG9uQW5pbWF0aW9uRnJhbWUoIHRpbWUgKSB7XHJcblxyXG5cdFx0XHRpZiAoIG9uQW5pbWF0aW9uRnJhbWVDYWxsYmFjayApIG9uQW5pbWF0aW9uRnJhbWVDYWxsYmFjayggdGltZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiBvblhSU2Vzc2lvblN0YXJ0KCkge1xyXG5cclxuXHRcdFx0YW5pbWF0aW9uLnN0b3AoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0ZnVuY3Rpb24gb25YUlNlc3Npb25FbmQoKSB7XHJcblxyXG5cdFx0XHRhbmltYXRpb24uc3RhcnQoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgYW5pbWF0aW9uID0gbmV3IFdlYkdMQW5pbWF0aW9uKCk7XHJcblx0XHRhbmltYXRpb24uc2V0QW5pbWF0aW9uTG9vcCggb25BbmltYXRpb25GcmFtZSApO1xyXG5cclxuXHRcdGlmICggdHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnICkgYW5pbWF0aW9uLnNldENvbnRleHQoIHNlbGYgKTtcclxuXHJcblx0XHR0aGlzLnNldEFuaW1hdGlvbkxvb3AgPSBmdW5jdGlvbiAoIGNhbGxiYWNrICkge1xyXG5cclxuXHRcdFx0b25BbmltYXRpb25GcmFtZUNhbGxiYWNrID0gY2FsbGJhY2s7XHJcblx0XHRcdHhyLnNldEFuaW1hdGlvbkxvb3AoIGNhbGxiYWNrICk7XHJcblxyXG5cdFx0XHQoIGNhbGxiYWNrID09PSBudWxsICkgPyBhbmltYXRpb24uc3RvcCgpIDogYW5pbWF0aW9uLnN0YXJ0KCk7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHR4ci5hZGRFdmVudExpc3RlbmVyKCAnc2Vzc2lvbnN0YXJ0Jywgb25YUlNlc3Npb25TdGFydCApO1xyXG5cdFx0eHIuYWRkRXZlbnRMaXN0ZW5lciggJ3Nlc3Npb25lbmQnLCBvblhSU2Vzc2lvbkVuZCApO1xyXG5cclxuXHRcdC8vIFJlbmRlcmluZ1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVuZGVycyB0aGUgZ2l2ZW4gc2NlbmUgKG9yIG90aGVyIHR5cGUgb2YgM0Qgb2JqZWN0KSB1c2luZyB0aGUgZ2l2ZW4gY2FtZXJhLlxyXG5cdFx0ICpcclxuXHRcdCAqIFRoZSByZW5kZXIgaXMgZG9uZSB0byBhIHByZXZpb3VzbHkgc3BlY2lmaWVkIHJlbmRlciB0YXJnZXQgc2V0IGJ5IGNhbGxpbmcge0BsaW5rIFdlYkdMUmVuZGVyZXIjc2V0UmVuZGVyVGFyZ2V0fVxyXG5cdFx0ICogb3IgdG8gdGhlIGNhbnZhcyBhcyB1c3VhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBCeSBkZWZhdWx0IHJlbmRlciBidWZmZXJzIGFyZSBjbGVhcmVkIGJlZm9yZSByZW5kZXJpbmcgYnV0IHlvdSBjYW4gcHJldmVudFxyXG5cdFx0ICogdGhpcyBieSBzZXR0aW5nIHRoZSBwcm9wZXJ0eSBgYXV0b0NsZWFyYCB0byBgZmFsc2VgLiBJZiB5b3Ugd2FudCB0byBwcmV2ZW50XHJcblx0XHQgKiBvbmx5IGNlcnRhaW4gYnVmZmVycyBiZWluZyBjbGVhcmVkIHlvdSBjYW4gYGF1dG9DbGVhckNvbG9yYCwgYGF1dG9DbGVhckRlcHRoYFxyXG5cdFx0ICogb3IgYGF1dG9DbGVhclN0ZW5jaWxgIHRvIGBmYWxzZWAuIFRvIGZvcmNlIGEgY2xlYXIsIHVzZSB7QGxpbmsgV2ViR0xSZW5kZXJlciNjbGVhcn0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtPYmplY3QzRH0gc2NlbmUgLSBUaGUgc2NlbmUgdG8gcmVuZGVyLlxyXG5cdFx0ICogQHBhcmFtIHtDYW1lcmF9IGNhbWVyYSAtIFRoZSBjYW1lcmEuXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVuZGVyID0gZnVuY3Rpb24gKCBzY2VuZSwgY2FtZXJhICkge1xyXG5cclxuXHRcdFx0aWYgKCBjYW1lcmEgIT09IHVuZGVmaW5lZCAmJiBjYW1lcmEuaXNDYW1lcmEgIT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyLnJlbmRlcjogY2FtZXJhIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5DYW1lcmEuJyApO1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggX2lzQ29udGV4dExvc3QgPT09IHRydWUgKSByZXR1cm47XHJcblxyXG5cdFx0XHQvLyB1cGRhdGUgc2NlbmUgZ3JhcGhcclxuXHJcblx0XHRcdGlmICggc2NlbmUubWF0cml4V29ybGRBdXRvVXBkYXRlID09PSB0cnVlICkgc2NlbmUudXBkYXRlTWF0cml4V29ybGQoKTtcclxuXHJcblx0XHRcdC8vIHVwZGF0ZSBjYW1lcmEgbWF0cmljZXMgYW5kIGZydXN0dW1cclxuXHJcblx0XHRcdGlmICggY2FtZXJhLnBhcmVudCA9PT0gbnVsbCAmJiBjYW1lcmEubWF0cml4V29ybGRBdXRvVXBkYXRlID09PSB0cnVlICkgY2FtZXJhLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XHJcblxyXG5cdFx0XHRpZiAoIHhyLmVuYWJsZWQgPT09IHRydWUgJiYgeHIuaXNQcmVzZW50aW5nID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIHhyLmNhbWVyYUF1dG9VcGRhdGUgPT09IHRydWUgKSB4ci51cGRhdGVDYW1lcmEoIGNhbWVyYSApO1xyXG5cclxuXHRcdFx0XHRjYW1lcmEgPSB4ci5nZXRDYW1lcmEoKTsgLy8gdXNlIFhSIGNhbWVyYSBmb3IgcmVuZGVyaW5nXHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvL1xyXG5cdFx0XHRpZiAoIHNjZW5lLmlzU2NlbmUgPT09IHRydWUgKSBzY2VuZS5vbkJlZm9yZVJlbmRlciggX3RoaXMsIHNjZW5lLCBjYW1lcmEsIF9jdXJyZW50UmVuZGVyVGFyZ2V0ICk7XHJcblxyXG5cdFx0XHRjdXJyZW50UmVuZGVyU3RhdGUgPSByZW5kZXJTdGF0ZXMuZ2V0KCBzY2VuZSwgcmVuZGVyU3RhdGVTdGFjay5sZW5ndGggKTtcclxuXHRcdFx0Y3VycmVudFJlbmRlclN0YXRlLmluaXQoIGNhbWVyYSApO1xyXG5cclxuXHRcdFx0cmVuZGVyU3RhdGVTdGFjay5wdXNoKCBjdXJyZW50UmVuZGVyU3RhdGUgKTtcclxuXHJcblx0XHRcdF9wcm9qU2NyZWVuTWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlICk7XHJcblx0XHRcdF9mcnVzdHVtLnNldEZyb21Qcm9qZWN0aW9uTWF0cml4KCBfcHJvalNjcmVlbk1hdHJpeCApO1xyXG5cclxuXHRcdFx0X2xvY2FsQ2xpcHBpbmdFbmFibGVkID0gdGhpcy5sb2NhbENsaXBwaW5nRW5hYmxlZDtcclxuXHRcdFx0X2NsaXBwaW5nRW5hYmxlZCA9IGNsaXBwaW5nLmluaXQoIHRoaXMuY2xpcHBpbmdQbGFuZXMsIF9sb2NhbENsaXBwaW5nRW5hYmxlZCApO1xyXG5cclxuXHRcdFx0Y3VycmVudFJlbmRlckxpc3QgPSByZW5kZXJMaXN0cy5nZXQoIHNjZW5lLCByZW5kZXJMaXN0U3RhY2subGVuZ3RoICk7XHJcblx0XHRcdGN1cnJlbnRSZW5kZXJMaXN0LmluaXQoKTtcclxuXHJcblx0XHRcdHJlbmRlckxpc3RTdGFjay5wdXNoKCBjdXJyZW50UmVuZGVyTGlzdCApO1xyXG5cclxuXHRcdFx0aWYgKCB4ci5lbmFibGVkID09PSB0cnVlICYmIHhyLmlzUHJlc2VudGluZyA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgZGVwdGhTZW5zaW5nTWVzaCA9IF90aGlzLnhyLmdldERlcHRoU2Vuc2luZ01lc2goKTtcclxuXHJcblx0XHRcdFx0aWYgKCBkZXB0aFNlbnNpbmdNZXNoICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRcdHByb2plY3RPYmplY3QoIGRlcHRoU2Vuc2luZ01lc2gsIGNhbWVyYSwgLSBJbmZpbml0eSwgX3RoaXMuc29ydE9iamVjdHMgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cHJvamVjdE9iamVjdCggc2NlbmUsIGNhbWVyYSwgMCwgX3RoaXMuc29ydE9iamVjdHMgKTtcclxuXHJcblx0XHRcdGN1cnJlbnRSZW5kZXJMaXN0LmZpbmlzaCgpO1xyXG5cclxuXHRcdFx0aWYgKCBfdGhpcy5zb3J0T2JqZWN0cyA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0Y3VycmVudFJlbmRlckxpc3Quc29ydCggX29wYXF1ZVNvcnQsIF90cmFuc3BhcmVudFNvcnQgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdF9yZW5kZXJCYWNrZ3JvdW5kID0geHIuZW5hYmxlZCA9PT0gZmFsc2UgfHwgeHIuaXNQcmVzZW50aW5nID09PSBmYWxzZSB8fCB4ci5oYXNEZXB0aFNlbnNpbmcoKSA9PT0gZmFsc2U7XHJcblx0XHRcdGlmICggX3JlbmRlckJhY2tncm91bmQgKSB7XHJcblxyXG5cdFx0XHRcdGJhY2tncm91bmQuYWRkVG9SZW5kZXJMaXN0KCBjdXJyZW50UmVuZGVyTGlzdCwgc2NlbmUgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vXHJcblxyXG5cdFx0XHR0aGlzLmluZm8ucmVuZGVyLmZyYW1lICsrO1xyXG5cclxuXHRcdFx0aWYgKCBfY2xpcHBpbmdFbmFibGVkID09PSB0cnVlICkgY2xpcHBpbmcuYmVnaW5TaGFkb3dzKCk7XHJcblxyXG5cdFx0XHRjb25zdCBzaGFkb3dzQXJyYXkgPSBjdXJyZW50UmVuZGVyU3RhdGUuc3RhdGUuc2hhZG93c0FycmF5O1xyXG5cclxuXHRcdFx0c2hhZG93TWFwLnJlbmRlciggc2hhZG93c0FycmF5LCBzY2VuZSwgY2FtZXJhICk7XHJcblxyXG5cdFx0XHRpZiAoIF9jbGlwcGluZ0VuYWJsZWQgPT09IHRydWUgKSBjbGlwcGluZy5lbmRTaGFkb3dzKCk7XHJcblxyXG5cdFx0XHQvL1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLmluZm8uYXV0b1Jlc2V0ID09PSB0cnVlICkgdGhpcy5pbmZvLnJlc2V0KCk7XHJcblxyXG5cdFx0XHQvLyByZW5kZXIgc2NlbmVcclxuXHJcblx0XHRcdGNvbnN0IG9wYXF1ZU9iamVjdHMgPSBjdXJyZW50UmVuZGVyTGlzdC5vcGFxdWU7XHJcblx0XHRcdGNvbnN0IHRyYW5zbWlzc2l2ZU9iamVjdHMgPSBjdXJyZW50UmVuZGVyTGlzdC50cmFuc21pc3NpdmU7XHJcblxyXG5cdFx0XHRjdXJyZW50UmVuZGVyU3RhdGUuc2V0dXBMaWdodHMoKTtcclxuXHJcblx0XHRcdGlmICggY2FtZXJhLmlzQXJyYXlDYW1lcmEgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGNhbWVyYXMgPSBjYW1lcmEuY2FtZXJhcztcclxuXHJcblx0XHRcdFx0aWYgKCB0cmFuc21pc3NpdmVPYmplY3RzLmxlbmd0aCA+IDAgKSB7XHJcblxyXG5cdFx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gY2FtZXJhcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgY2FtZXJhMiA9IGNhbWVyYXNbIGkgXTtcclxuXHJcblx0XHRcdFx0XHRcdHJlbmRlclRyYW5zbWlzc2lvblBhc3MoIG9wYXF1ZU9iamVjdHMsIHRyYW5zbWlzc2l2ZU9iamVjdHMsIHNjZW5lLCBjYW1lcmEyICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICggX3JlbmRlckJhY2tncm91bmQgKSBiYWNrZ3JvdW5kLnJlbmRlciggc2NlbmUgKTtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gY2FtZXJhcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGNhbWVyYTIgPSBjYW1lcmFzWyBpIF07XHJcblxyXG5cdFx0XHRcdFx0cmVuZGVyU2NlbmUoIGN1cnJlbnRSZW5kZXJMaXN0LCBzY2VuZSwgY2FtZXJhMiwgY2FtZXJhMi52aWV3cG9ydCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRpZiAoIHRyYW5zbWlzc2l2ZU9iamVjdHMubGVuZ3RoID4gMCApIHJlbmRlclRyYW5zbWlzc2lvblBhc3MoIG9wYXF1ZU9iamVjdHMsIHRyYW5zbWlzc2l2ZU9iamVjdHMsIHNjZW5lLCBjYW1lcmEgKTtcclxuXHJcblx0XHRcdFx0aWYgKCBfcmVuZGVyQmFja2dyb3VuZCApIGJhY2tncm91bmQucmVuZGVyKCBzY2VuZSApO1xyXG5cclxuXHRcdFx0XHRyZW5kZXJTY2VuZSggY3VycmVudFJlbmRlckxpc3QsIHNjZW5lLCBjYW1lcmEgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vXHJcblxyXG5cdFx0XHRpZiAoIF9jdXJyZW50UmVuZGVyVGFyZ2V0ICE9PSBudWxsICYmIF9jdXJyZW50QWN0aXZlTWlwbWFwTGV2ZWwgPT09IDAgKSB7XHJcblxyXG5cdFx0XHRcdC8vIHJlc29sdmUgbXVsdGlzYW1wbGUgcmVuZGVyYnVmZmVycyB0byBhIHNpbmdsZS1zYW1wbGUgdGV4dHVyZSBpZiBuZWNlc3NhcnlcclxuXHJcblx0XHRcdFx0dGV4dHVyZXMudXBkYXRlTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQoIF9jdXJyZW50UmVuZGVyVGFyZ2V0ICk7XHJcblxyXG5cdFx0XHRcdC8vIEdlbmVyYXRlIG1pcG1hcCBpZiB3ZSdyZSB1c2luZyBhbnkga2luZCBvZiBtaXBtYXAgZmlsdGVyaW5nXHJcblxyXG5cdFx0XHRcdHRleHR1cmVzLnVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcCggX2N1cnJlbnRSZW5kZXJUYXJnZXQgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vXHJcblxyXG5cdFx0XHRpZiAoIHNjZW5lLmlzU2NlbmUgPT09IHRydWUgKSBzY2VuZS5vbkFmdGVyUmVuZGVyKCBfdGhpcywgc2NlbmUsIGNhbWVyYSApO1xyXG5cclxuXHRcdFx0Ly8gX2dsLmZpbmlzaCgpO1xyXG5cclxuXHRcdFx0YmluZGluZ1N0YXRlcy5yZXNldERlZmF1bHRTdGF0ZSgpO1xyXG5cdFx0XHRfY3VycmVudE1hdGVyaWFsSWQgPSAtIDE7XHJcblx0XHRcdF9jdXJyZW50Q2FtZXJhID0gbnVsbDtcclxuXHJcblx0XHRcdHJlbmRlclN0YXRlU3RhY2sucG9wKCk7XHJcblxyXG5cdFx0XHRpZiAoIHJlbmRlclN0YXRlU3RhY2subGVuZ3RoID4gMCApIHtcclxuXHJcblx0XHRcdFx0Y3VycmVudFJlbmRlclN0YXRlID0gcmVuZGVyU3RhdGVTdGFja1sgcmVuZGVyU3RhdGVTdGFjay5sZW5ndGggLSAxIF07XHJcblxyXG5cdFx0XHRcdGlmICggX2NsaXBwaW5nRW5hYmxlZCA9PT0gdHJ1ZSApIGNsaXBwaW5nLnNldEdsb2JhbFN0YXRlKCBfdGhpcy5jbGlwcGluZ1BsYW5lcywgY3VycmVudFJlbmRlclN0YXRlLnN0YXRlLmNhbWVyYSApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0Y3VycmVudFJlbmRlclN0YXRlID0gbnVsbDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJlbmRlckxpc3RTdGFjay5wb3AoKTtcclxuXHJcblx0XHRcdGlmICggcmVuZGVyTGlzdFN0YWNrLmxlbmd0aCA+IDAgKSB7XHJcblxyXG5cdFx0XHRcdGN1cnJlbnRSZW5kZXJMaXN0ID0gcmVuZGVyTGlzdFN0YWNrWyByZW5kZXJMaXN0U3RhY2subGVuZ3RoIC0gMSBdO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0Y3VycmVudFJlbmRlckxpc3QgPSBudWxsO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0ZnVuY3Rpb24gcHJvamVjdE9iamVjdCggb2JqZWN0LCBjYW1lcmEsIGdyb3VwT3JkZXIsIHNvcnRPYmplY3RzICkge1xyXG5cclxuXHRcdFx0aWYgKCBvYmplY3QudmlzaWJsZSA9PT0gZmFsc2UgKSByZXR1cm47XHJcblxyXG5cdFx0XHRjb25zdCB2aXNpYmxlID0gb2JqZWN0LmxheWVycy50ZXN0KCBjYW1lcmEubGF5ZXJzICk7XHJcblxyXG5cdFx0XHRpZiAoIHZpc2libGUgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggb2JqZWN0LmlzR3JvdXAgKSB7XHJcblxyXG5cdFx0XHRcdFx0Z3JvdXBPcmRlciA9IG9iamVjdC5yZW5kZXJPcmRlcjtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzTE9EICkge1xyXG5cclxuXHRcdFx0XHRcdGlmICggb2JqZWN0LmF1dG9VcGRhdGUgPT09IHRydWUgKSBvYmplY3QudXBkYXRlKCBjYW1lcmEgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzTGlnaHQgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y3VycmVudFJlbmRlclN0YXRlLnB1c2hMaWdodCggb2JqZWN0ICk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBvYmplY3QuY2FzdFNoYWRvdyApIHtcclxuXHJcblx0XHRcdFx0XHRcdGN1cnJlbnRSZW5kZXJTdGF0ZS5wdXNoU2hhZG93KCBvYmplY3QgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc1Nwcml0ZSApIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoICEgb2JqZWN0LmZydXN0dW1DdWxsZWQgfHwgX2ZydXN0dW0uaW50ZXJzZWN0c1Nwcml0ZSggb2JqZWN0ICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIHNvcnRPYmplY3RzICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRfdmVjdG9yNC5zZXRGcm9tTWF0cml4UG9zaXRpb24oIG9iamVjdC5tYXRyaXhXb3JsZCApXHJcblx0XHRcdFx0XHRcdFx0XHQuYXBwbHlNYXRyaXg0KCBfcHJvalNjcmVlbk1hdHJpeCApO1xyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgZ2VvbWV0cnkgPSBvYmplY3RzLnVwZGF0ZSggb2JqZWN0ICk7XHJcblx0XHRcdFx0XHRcdGNvbnN0IG1hdGVyaWFsID0gb2JqZWN0Lm1hdGVyaWFsO1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCBtYXRlcmlhbC52aXNpYmxlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRjdXJyZW50UmVuZGVyTGlzdC5wdXNoKCBvYmplY3QsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXBPcmRlciwgX3ZlY3RvcjQueiwgbnVsbCApO1xyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzTWVzaCB8fCBvYmplY3QuaXNMaW5lIHx8IG9iamVjdC5pc1BvaW50cyApIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoICEgb2JqZWN0LmZydXN0dW1DdWxsZWQgfHwgX2ZydXN0dW0uaW50ZXJzZWN0c09iamVjdCggb2JqZWN0ICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCBnZW9tZXRyeSA9IG9iamVjdHMudXBkYXRlKCBvYmplY3QgKTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgbWF0ZXJpYWwgPSBvYmplY3QubWF0ZXJpYWw7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIHNvcnRPYmplY3RzICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoIG9iamVjdC5ib3VuZGluZ1NwaGVyZSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGlmICggb2JqZWN0LmJvdW5kaW5nU3BoZXJlID09PSBudWxsICkgb2JqZWN0LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xyXG5cdFx0XHRcdFx0XHRcdFx0X3ZlY3RvcjQuY29weSggb2JqZWN0LmJvdW5kaW5nU3BoZXJlLmNlbnRlciApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSBnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcclxuXHRcdFx0XHRcdFx0XHRcdF92ZWN0b3I0LmNvcHkoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlLmNlbnRlciApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdF92ZWN0b3I0XHJcblx0XHRcdFx0XHRcdFx0XHQuYXBwbHlNYXRyaXg0KCBvYmplY3QubWF0cml4V29ybGQgKVxyXG5cdFx0XHRcdFx0XHRcdFx0LmFwcGx5TWF0cml4NCggX3Byb2pTY3JlZW5NYXRyaXggKTtcclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggbWF0ZXJpYWwgKSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgZ3JvdXBzID0gZ2VvbWV0cnkuZ3JvdXBzO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBncm91cHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBncm91cCA9IGdyb3Vwc1sgaSBdO1xyXG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgZ3JvdXBNYXRlcmlhbCA9IG1hdGVyaWFsWyBncm91cC5tYXRlcmlhbEluZGV4IF07XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBncm91cE1hdGVyaWFsICYmIGdyb3VwTWF0ZXJpYWwudmlzaWJsZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdGN1cnJlbnRSZW5kZXJMaXN0LnB1c2goIG9iamVjdCwgZ2VvbWV0cnksIGdyb3VwTWF0ZXJpYWwsIGdyb3VwT3JkZXIsIF92ZWN0b3I0LnosIGdyb3VwICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC52aXNpYmxlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRjdXJyZW50UmVuZGVyTGlzdC5wdXNoKCBvYmplY3QsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXBPcmRlciwgX3ZlY3RvcjQueiwgbnVsbCApO1xyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgY2hpbGRyZW4gPSBvYmplY3QuY2hpbGRyZW47XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRwcm9qZWN0T2JqZWN0KCBjaGlsZHJlblsgaSBdLCBjYW1lcmEsIGdyb3VwT3JkZXIsIHNvcnRPYmplY3RzICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIHJlbmRlclNjZW5lKCBjdXJyZW50UmVuZGVyTGlzdCwgc2NlbmUsIGNhbWVyYSwgdmlld3BvcnQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBvcGFxdWVPYmplY3RzID0gY3VycmVudFJlbmRlckxpc3Qub3BhcXVlO1xyXG5cdFx0XHRjb25zdCB0cmFuc21pc3NpdmVPYmplY3RzID0gY3VycmVudFJlbmRlckxpc3QudHJhbnNtaXNzaXZlO1xyXG5cdFx0XHRjb25zdCB0cmFuc3BhcmVudE9iamVjdHMgPSBjdXJyZW50UmVuZGVyTGlzdC50cmFuc3BhcmVudDtcclxuXHJcblx0XHRcdGN1cnJlbnRSZW5kZXJTdGF0ZS5zZXR1cExpZ2h0c1ZpZXcoIGNhbWVyYSApO1xyXG5cclxuXHRcdFx0aWYgKCBfY2xpcHBpbmdFbmFibGVkID09PSB0cnVlICkgY2xpcHBpbmcuc2V0R2xvYmFsU3RhdGUoIF90aGlzLmNsaXBwaW5nUGxhbmVzLCBjYW1lcmEgKTtcclxuXHJcblx0XHRcdGlmICggdmlld3BvcnQgKSBzdGF0ZS52aWV3cG9ydCggX2N1cnJlbnRWaWV3cG9ydC5jb3B5KCB2aWV3cG9ydCApICk7XHJcblxyXG5cdFx0XHRpZiAoIG9wYXF1ZU9iamVjdHMubGVuZ3RoID4gMCApIHJlbmRlck9iamVjdHMoIG9wYXF1ZU9iamVjdHMsIHNjZW5lLCBjYW1lcmEgKTtcclxuXHRcdFx0aWYgKCB0cmFuc21pc3NpdmVPYmplY3RzLmxlbmd0aCA+IDAgKSByZW5kZXJPYmplY3RzKCB0cmFuc21pc3NpdmVPYmplY3RzLCBzY2VuZSwgY2FtZXJhICk7XHJcblx0XHRcdGlmICggdHJhbnNwYXJlbnRPYmplY3RzLmxlbmd0aCA+IDAgKSByZW5kZXJPYmplY3RzKCB0cmFuc3BhcmVudE9iamVjdHMsIHNjZW5lLCBjYW1lcmEgKTtcclxuXHJcblx0XHRcdC8vIEVuc3VyZSBkZXB0aCBidWZmZXIgd3JpdGluZyBpcyBlbmFibGVkIHNvIGl0IGNhbiBiZSBjbGVhcmVkIG9uIG5leHQgcmVuZGVyXHJcblxyXG5cdFx0XHRzdGF0ZS5idWZmZXJzLmRlcHRoLnNldFRlc3QoIHRydWUgKTtcclxuXHRcdFx0c3RhdGUuYnVmZmVycy5kZXB0aC5zZXRNYXNrKCB0cnVlICk7XHJcblx0XHRcdHN0YXRlLmJ1ZmZlcnMuY29sb3Iuc2V0TWFzayggdHJ1ZSApO1xyXG5cclxuXHRcdFx0c3RhdGUuc2V0UG9seWdvbk9mZnNldCggZmFsc2UgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0ZnVuY3Rpb24gcmVuZGVyVHJhbnNtaXNzaW9uUGFzcyggb3BhcXVlT2JqZWN0cywgdHJhbnNtaXNzaXZlT2JqZWN0cywgc2NlbmUsIGNhbWVyYSApIHtcclxuXHJcblx0XHRcdGNvbnN0IG92ZXJyaWRlTWF0ZXJpYWwgPSBzY2VuZS5pc1NjZW5lID09PSB0cnVlID8gc2NlbmUub3ZlcnJpZGVNYXRlcmlhbCA6IG51bGw7XHJcblxyXG5cdFx0XHRpZiAoIG92ZXJyaWRlTWF0ZXJpYWwgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdHJldHVybjtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggY3VycmVudFJlbmRlclN0YXRlLnN0YXRlLnRyYW5zbWlzc2lvblJlbmRlclRhcmdldFsgY2FtZXJhLmlkIF0gPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0Y3VycmVudFJlbmRlclN0YXRlLnN0YXRlLnRyYW5zbWlzc2lvblJlbmRlclRhcmdldFsgY2FtZXJhLmlkIF0gPSBuZXcgV2ViR0xSZW5kZXJUYXJnZXQoIDEsIDEsIHtcclxuXHRcdFx0XHRcdGdlbmVyYXRlTWlwbWFwczogdHJ1ZSxcclxuXHRcdFx0XHRcdHR5cGU6ICggZXh0ZW5zaW9ucy5oYXMoICdFWFRfY29sb3JfYnVmZmVyX2hhbGZfZmxvYXQnICkgfHwgZXh0ZW5zaW9ucy5oYXMoICdFWFRfY29sb3JfYnVmZmVyX2Zsb2F0JyApICkgPyBIYWxmRmxvYXRUeXBlIDogVW5zaWduZWRCeXRlVHlwZSxcclxuXHRcdFx0XHRcdG1pbkZpbHRlcjogTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyLFxyXG5cdFx0XHRcdFx0c2FtcGxlczogNCxcclxuXHRcdFx0XHRcdHN0ZW5jaWxCdWZmZXI6IHN0ZW5jaWwsXHJcblx0XHRcdFx0XHRyZXNvbHZlRGVwdGhCdWZmZXI6IGZhbHNlLFxyXG5cdFx0XHRcdFx0cmVzb2x2ZVN0ZW5jaWxCdWZmZXI6IGZhbHNlLFxyXG5cdFx0XHRcdFx0Y29sb3JTcGFjZTogQ29sb3JNYW5hZ2VtZW50LndvcmtpbmdDb2xvclNwYWNlLFxyXG5cdFx0XHRcdH0gKTtcclxuXHJcblx0XHRcdFx0Ly8gZGVidWdcclxuXHJcblx0XHRcdFx0LypcclxuXHRcdFx0XHRjb25zdCBnZW9tZXRyeSA9IG5ldyBQbGFuZUdlb21ldHJ5KCk7XHJcblx0XHRcdFx0Y29uc3QgbWF0ZXJpYWwgPSBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoIHsgbWFwOiBfdHJhbnNtaXNzaW9uUmVuZGVyVGFyZ2V0LnRleHR1cmUgfSApO1xyXG5cclxuXHRcdFx0XHRjb25zdCBtZXNoID0gbmV3IE1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG5cdFx0XHRcdHNjZW5lLmFkZCggbWVzaCApO1xyXG5cdFx0XHRcdCovXHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCB0cmFuc21pc3Npb25SZW5kZXJUYXJnZXQgPSBjdXJyZW50UmVuZGVyU3RhdGUuc3RhdGUudHJhbnNtaXNzaW9uUmVuZGVyVGFyZ2V0WyBjYW1lcmEuaWQgXTtcclxuXHJcblx0XHRcdGNvbnN0IGFjdGl2ZVZpZXdwb3J0ID0gY2FtZXJhLnZpZXdwb3J0IHx8IF9jdXJyZW50Vmlld3BvcnQ7XHJcblx0XHRcdHRyYW5zbWlzc2lvblJlbmRlclRhcmdldC5zZXRTaXplKCBhY3RpdmVWaWV3cG9ydC56ICogX3RoaXMudHJhbnNtaXNzaW9uUmVzb2x1dGlvblNjYWxlLCBhY3RpdmVWaWV3cG9ydC53ICogX3RoaXMudHJhbnNtaXNzaW9uUmVzb2x1dGlvblNjYWxlICk7XHJcblxyXG5cdFx0XHQvL1xyXG5cclxuXHRcdFx0Y29uc3QgY3VycmVudFJlbmRlclRhcmdldCA9IF90aGlzLmdldFJlbmRlclRhcmdldCgpO1xyXG5cdFx0XHRfdGhpcy5zZXRSZW5kZXJUYXJnZXQoIHRyYW5zbWlzc2lvblJlbmRlclRhcmdldCApO1xyXG5cclxuXHRcdFx0X3RoaXMuZ2V0Q2xlYXJDb2xvciggX2N1cnJlbnRDbGVhckNvbG9yICk7XHJcblx0XHRcdF9jdXJyZW50Q2xlYXJBbHBoYSA9IF90aGlzLmdldENsZWFyQWxwaGEoKTtcclxuXHRcdFx0aWYgKCBfY3VycmVudENsZWFyQWxwaGEgPCAxICkgX3RoaXMuc2V0Q2xlYXJDb2xvciggMHhmZmZmZmYsIDAuNSApO1xyXG5cclxuXHRcdFx0X3RoaXMuY2xlYXIoKTtcclxuXHJcblx0XHRcdGlmICggX3JlbmRlckJhY2tncm91bmQgKSBiYWNrZ3JvdW5kLnJlbmRlciggc2NlbmUgKTtcclxuXHJcblx0XHRcdC8vIFR1cm4gb2ZmIHRoZSBmZWF0dXJlcyB3aGljaCBjYW4gYWZmZWN0IHRoZSBmcmFnIGNvbG9yIGZvciBvcGFxdWUgb2JqZWN0cyBwYXNzLlxyXG5cdFx0XHQvLyBPdGhlcndpc2UgdGhleSBhcmUgYXBwbGllZCB0d2ljZSBpbiBvcGFxdWUgb2JqZWN0cyBwYXNzIGFuZCB0cmFuc21pc3Npb24gb2JqZWN0cyBwYXNzLlxyXG5cdFx0XHRjb25zdCBjdXJyZW50VG9uZU1hcHBpbmcgPSBfdGhpcy50b25lTWFwcGluZztcclxuXHRcdFx0X3RoaXMudG9uZU1hcHBpbmcgPSBOb1RvbmVNYXBwaW5nO1xyXG5cclxuXHRcdFx0Ly8gUmVtb3ZlIHZpZXdwb3J0IGZyb20gY2FtZXJhIHRvIGF2b2lkIG5lc3RlZCByZW5kZXIgY2FsbHMgcmVzZXR0aW5nIHZpZXdwb3J0IHRvIGl0IChlLmcgUmVmbGVjdG9yKS5cclxuXHRcdFx0Ly8gVHJhbnNtaXNzaW9uIHJlbmRlciBwYXNzIHJlcXVpcmVzIHZpZXdwb3J0IHRvIG1hdGNoIHRoZSB0cmFuc21pc3Npb25SZW5kZXJUYXJnZXQuXHJcblx0XHRcdGNvbnN0IGN1cnJlbnRDYW1lcmFWaWV3cG9ydCA9IGNhbWVyYS52aWV3cG9ydDtcclxuXHRcdFx0aWYgKCBjYW1lcmEudmlld3BvcnQgIT09IHVuZGVmaW5lZCApIGNhbWVyYS52aWV3cG9ydCA9IHVuZGVmaW5lZDtcclxuXHJcblx0XHRcdGN1cnJlbnRSZW5kZXJTdGF0ZS5zZXR1cExpZ2h0c1ZpZXcoIGNhbWVyYSApO1xyXG5cclxuXHRcdFx0aWYgKCBfY2xpcHBpbmdFbmFibGVkID09PSB0cnVlICkgY2xpcHBpbmcuc2V0R2xvYmFsU3RhdGUoIF90aGlzLmNsaXBwaW5nUGxhbmVzLCBjYW1lcmEgKTtcclxuXHJcblx0XHRcdHJlbmRlck9iamVjdHMoIG9wYXF1ZU9iamVjdHMsIHNjZW5lLCBjYW1lcmEgKTtcclxuXHJcblx0XHRcdHRleHR1cmVzLnVwZGF0ZU11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0KCB0cmFuc21pc3Npb25SZW5kZXJUYXJnZXQgKTtcclxuXHRcdFx0dGV4dHVyZXMudXBkYXRlUmVuZGVyVGFyZ2V0TWlwbWFwKCB0cmFuc21pc3Npb25SZW5kZXJUYXJnZXQgKTtcclxuXHJcblx0XHRcdGlmICggZXh0ZW5zaW9ucy5oYXMoICdXRUJHTF9tdWx0aXNhbXBsZWRfcmVuZGVyX3RvX3RleHR1cmUnICkgPT09IGZhbHNlICkgeyAvLyBzZWUgIzI4MTMxXHJcblxyXG5cdFx0XHRcdGxldCByZW5kZXJUYXJnZXROZWVkc1VwZGF0ZSA9IGZhbHNlO1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSB0cmFuc21pc3NpdmVPYmplY3RzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgcmVuZGVySXRlbSA9IHRyYW5zbWlzc2l2ZU9iamVjdHNbIGkgXTtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBvYmplY3QgPSByZW5kZXJJdGVtLm9iamVjdDtcclxuXHRcdFx0XHRcdGNvbnN0IGdlb21ldHJ5ID0gcmVuZGVySXRlbS5nZW9tZXRyeTtcclxuXHRcdFx0XHRcdGNvbnN0IG1hdGVyaWFsID0gcmVuZGVySXRlbS5tYXRlcmlhbDtcclxuXHRcdFx0XHRcdGNvbnN0IGdyb3VwID0gcmVuZGVySXRlbS5ncm91cDtcclxuXHJcblx0XHRcdFx0XHRpZiAoIG1hdGVyaWFsLnNpZGUgPT09IERvdWJsZVNpZGUgJiYgb2JqZWN0LmxheWVycy50ZXN0KCBjYW1lcmEubGF5ZXJzICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCBjdXJyZW50U2lkZSA9IG1hdGVyaWFsLnNpZGU7XHJcblxyXG5cdFx0XHRcdFx0XHRtYXRlcmlhbC5zaWRlID0gQmFja1NpZGU7XHJcblx0XHRcdFx0XHRcdG1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0XHRcdHJlbmRlck9iamVjdCggb2JqZWN0LCBzY2VuZSwgY2FtZXJhLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwICk7XHJcblxyXG5cdFx0XHRcdFx0XHRtYXRlcmlhbC5zaWRlID0gY3VycmVudFNpZGU7XHJcblx0XHRcdFx0XHRcdG1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0XHRcdHJlbmRlclRhcmdldE5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKCByZW5kZXJUYXJnZXROZWVkc1VwZGF0ZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0XHR0ZXh0dXJlcy51cGRhdGVNdWx0aXNhbXBsZVJlbmRlclRhcmdldCggdHJhbnNtaXNzaW9uUmVuZGVyVGFyZ2V0ICk7XHJcblx0XHRcdFx0XHR0ZXh0dXJlcy51cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXAoIHRyYW5zbWlzc2lvblJlbmRlclRhcmdldCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRfdGhpcy5zZXRSZW5kZXJUYXJnZXQoIGN1cnJlbnRSZW5kZXJUYXJnZXQgKTtcclxuXHJcblx0XHRcdF90aGlzLnNldENsZWFyQ29sb3IoIF9jdXJyZW50Q2xlYXJDb2xvciwgX2N1cnJlbnRDbGVhckFscGhhICk7XHJcblxyXG5cdFx0XHRpZiAoIGN1cnJlbnRDYW1lcmFWaWV3cG9ydCAhPT0gdW5kZWZpbmVkICkgY2FtZXJhLnZpZXdwb3J0ID0gY3VycmVudENhbWVyYVZpZXdwb3J0O1xyXG5cclxuXHRcdFx0X3RoaXMudG9uZU1hcHBpbmcgPSBjdXJyZW50VG9uZU1hcHBpbmc7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIHJlbmRlck9iamVjdHMoIHJlbmRlckxpc3QsIHNjZW5lLCBjYW1lcmEgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBvdmVycmlkZU1hdGVyaWFsID0gc2NlbmUuaXNTY2VuZSA9PT0gdHJ1ZSA/IHNjZW5lLm92ZXJyaWRlTWF0ZXJpYWwgOiBudWxsO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gcmVuZGVyTGlzdC5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCByZW5kZXJJdGVtID0gcmVuZGVyTGlzdFsgaSBdO1xyXG5cclxuXHRcdFx0XHRjb25zdCBvYmplY3QgPSByZW5kZXJJdGVtLm9iamVjdDtcclxuXHRcdFx0XHRjb25zdCBnZW9tZXRyeSA9IHJlbmRlckl0ZW0uZ2VvbWV0cnk7XHJcblx0XHRcdFx0Y29uc3QgZ3JvdXAgPSByZW5kZXJJdGVtLmdyb3VwO1xyXG5cdFx0XHRcdGxldCBtYXRlcmlhbCA9IHJlbmRlckl0ZW0ubWF0ZXJpYWw7XHJcblxyXG5cdFx0XHRcdGlmICggbWF0ZXJpYWwuYWxsb3dPdmVycmlkZSA9PT0gdHJ1ZSAmJiBvdmVycmlkZU1hdGVyaWFsICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRcdG1hdGVyaWFsID0gb3ZlcnJpZGVNYXRlcmlhbDtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoIG9iamVjdC5sYXllcnMudGVzdCggY2FtZXJhLmxheWVycyApICkge1xyXG5cclxuXHRcdFx0XHRcdHJlbmRlck9iamVjdCggb2JqZWN0LCBzY2VuZSwgY2FtZXJhLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0ZnVuY3Rpb24gcmVuZGVyT2JqZWN0KCBvYmplY3QsIHNjZW5lLCBjYW1lcmEsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXAgKSB7XHJcblxyXG5cdFx0XHRvYmplY3Qub25CZWZvcmVSZW5kZXIoIF90aGlzLCBzY2VuZSwgY2FtZXJhLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwICk7XHJcblxyXG5cdFx0XHRvYmplY3QubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UsIG9iamVjdC5tYXRyaXhXb3JsZCApO1xyXG5cdFx0XHRvYmplY3Qubm9ybWFsTWF0cml4LmdldE5vcm1hbE1hdHJpeCggb2JqZWN0Lm1vZGVsVmlld01hdHJpeCApO1xyXG5cclxuXHRcdFx0bWF0ZXJpYWwub25CZWZvcmVSZW5kZXIoIF90aGlzLCBzY2VuZSwgY2FtZXJhLCBnZW9tZXRyeSwgb2JqZWN0LCBncm91cCApO1xyXG5cclxuXHRcdFx0aWYgKCBtYXRlcmlhbC50cmFuc3BhcmVudCA9PT0gdHJ1ZSAmJiBtYXRlcmlhbC5zaWRlID09PSBEb3VibGVTaWRlICYmIG1hdGVyaWFsLmZvcmNlU2luZ2xlUGFzcyA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRcdG1hdGVyaWFsLnNpZGUgPSBCYWNrU2lkZTtcclxuXHRcdFx0XHRtYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblx0XHRcdFx0X3RoaXMucmVuZGVyQnVmZmVyRGlyZWN0KCBjYW1lcmEsIHNjZW5lLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIG9iamVjdCwgZ3JvdXAgKTtcclxuXHJcblx0XHRcdFx0bWF0ZXJpYWwuc2lkZSA9IEZyb250U2lkZTtcclxuXHRcdFx0XHRtYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblx0XHRcdFx0X3RoaXMucmVuZGVyQnVmZmVyRGlyZWN0KCBjYW1lcmEsIHNjZW5lLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIG9iamVjdCwgZ3JvdXAgKTtcclxuXHJcblx0XHRcdFx0bWF0ZXJpYWwuc2lkZSA9IERvdWJsZVNpZGU7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRfdGhpcy5yZW5kZXJCdWZmZXJEaXJlY3QoIGNhbWVyYSwgc2NlbmUsIGdlb21ldHJ5LCBtYXRlcmlhbCwgb2JqZWN0LCBncm91cCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0b2JqZWN0Lm9uQWZ0ZXJSZW5kZXIoIF90aGlzLCBzY2VuZSwgY2FtZXJhLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIGdldFByb2dyYW0oIG1hdGVyaWFsLCBzY2VuZSwgb2JqZWN0ICkge1xyXG5cclxuXHRcdFx0aWYgKCBzY2VuZS5pc1NjZW5lICE9PSB0cnVlICkgc2NlbmUgPSBfZW1wdHlTY2VuZTsgLy8gc2NlbmUgY291bGQgYmUgYSBNZXNoLCBMaW5lLCBQb2ludHMsIC4uLlxyXG5cclxuXHRcdFx0Y29uc3QgbWF0ZXJpYWxQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIG1hdGVyaWFsICk7XHJcblxyXG5cdFx0XHRjb25zdCBsaWdodHMgPSBjdXJyZW50UmVuZGVyU3RhdGUuc3RhdGUubGlnaHRzO1xyXG5cdFx0XHRjb25zdCBzaGFkb3dzQXJyYXkgPSBjdXJyZW50UmVuZGVyU3RhdGUuc3RhdGUuc2hhZG93c0FycmF5O1xyXG5cclxuXHRcdFx0Y29uc3QgbGlnaHRzU3RhdGVWZXJzaW9uID0gbGlnaHRzLnN0YXRlLnZlcnNpb247XHJcblxyXG5cdFx0XHRjb25zdCBwYXJhbWV0ZXJzID0gcHJvZ3JhbUNhY2hlLmdldFBhcmFtZXRlcnMoIG1hdGVyaWFsLCBsaWdodHMuc3RhdGUsIHNoYWRvd3NBcnJheSwgc2NlbmUsIG9iamVjdCApO1xyXG5cdFx0XHRjb25zdCBwcm9ncmFtQ2FjaGVLZXkgPSBwcm9ncmFtQ2FjaGUuZ2V0UHJvZ3JhbUNhY2hlS2V5KCBwYXJhbWV0ZXJzICk7XHJcblxyXG5cdFx0XHRsZXQgcHJvZ3JhbXMgPSBtYXRlcmlhbFByb3BlcnRpZXMucHJvZ3JhbXM7XHJcblxyXG5cdFx0XHQvLyBhbHdheXMgdXBkYXRlIGVudmlyb25tZW50IGFuZCBmb2cgLSBjaGFuZ2luZyB0aGVzZSB0cmlnZ2VyIGFuIGdldFByb2dyYW0gY2FsbCwgYnV0IGl0J3MgcG9zc2libGUgdGhhdCB0aGUgcHJvZ3JhbSBkb2Vzbid0IGNoYW5nZVxyXG5cclxuXHRcdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLmVudmlyb25tZW50ID0gbWF0ZXJpYWwuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCA/IHNjZW5lLmVudmlyb25tZW50IDogbnVsbDtcclxuXHRcdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLmZvZyA9IHNjZW5lLmZvZztcclxuXHRcdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLmVudk1hcCA9ICggbWF0ZXJpYWwuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCA/IGN1YmV1dm1hcHMgOiBjdWJlbWFwcyApLmdldCggbWF0ZXJpYWwuZW52TWFwIHx8IG1hdGVyaWFsUHJvcGVydGllcy5lbnZpcm9ubWVudCApO1xyXG5cdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMuZW52TWFwUm90YXRpb24gPSAoIG1hdGVyaWFsUHJvcGVydGllcy5lbnZpcm9ubWVudCAhPT0gbnVsbCAmJiBtYXRlcmlhbC5lbnZNYXAgPT09IG51bGwgKSA/IHNjZW5lLmVudmlyb25tZW50Um90YXRpb24gOiBtYXRlcmlhbC5lbnZNYXBSb3RhdGlvbjtcclxuXHJcblx0XHRcdGlmICggcHJvZ3JhbXMgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0Ly8gbmV3IG1hdGVyaWFsXHJcblxyXG5cdFx0XHRcdG1hdGVyaWFsLmFkZEV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25NYXRlcmlhbERpc3Bvc2UgKTtcclxuXHJcblx0XHRcdFx0cHJvZ3JhbXMgPSBuZXcgTWFwKCk7XHJcblx0XHRcdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLnByb2dyYW1zID0gcHJvZ3JhbXM7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRsZXQgcHJvZ3JhbSA9IHByb2dyYW1zLmdldCggcHJvZ3JhbUNhY2hlS2V5ICk7XHJcblxyXG5cdFx0XHRpZiAoIHByb2dyYW0gIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0Ly8gZWFybHkgb3V0IGlmIHByb2dyYW0gYW5kIGxpZ2h0IHN0YXRlIGlzIGlkZW50aWNhbFxyXG5cclxuXHRcdFx0XHRpZiAoIG1hdGVyaWFsUHJvcGVydGllcy5jdXJyZW50UHJvZ3JhbSA9PT0gcHJvZ3JhbSAmJiBtYXRlcmlhbFByb3BlcnRpZXMubGlnaHRzU3RhdGVWZXJzaW9uID09PSBsaWdodHNTdGF0ZVZlcnNpb24gKSB7XHJcblxyXG5cdFx0XHRcdFx0dXBkYXRlQ29tbW9uTWF0ZXJpYWxQcm9wZXJ0aWVzKCBtYXRlcmlhbCwgcGFyYW1ldGVycyApO1xyXG5cclxuXHRcdFx0XHRcdHJldHVybiBwcm9ncmFtO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRwYXJhbWV0ZXJzLnVuaWZvcm1zID0gcHJvZ3JhbUNhY2hlLmdldFVuaWZvcm1zKCBtYXRlcmlhbCApO1xyXG5cclxuXHRcdFx0XHRtYXRlcmlhbC5vbkJlZm9yZUNvbXBpbGUoIHBhcmFtZXRlcnMsIF90aGlzICk7XHJcblxyXG5cdFx0XHRcdHByb2dyYW0gPSBwcm9ncmFtQ2FjaGUuYWNxdWlyZVByb2dyYW0oIHBhcmFtZXRlcnMsIHByb2dyYW1DYWNoZUtleSApO1xyXG5cdFx0XHRcdHByb2dyYW1zLnNldCggcHJvZ3JhbUNhY2hlS2V5LCBwcm9ncmFtICk7XHJcblxyXG5cdFx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy51bmlmb3JtcyA9IHBhcmFtZXRlcnMudW5pZm9ybXM7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCB1bmlmb3JtcyA9IG1hdGVyaWFsUHJvcGVydGllcy51bmlmb3JtcztcclxuXHJcblx0XHRcdGlmICggKCAhIG1hdGVyaWFsLmlzU2hhZGVyTWF0ZXJpYWwgJiYgISBtYXRlcmlhbC5pc1Jhd1NoYWRlck1hdGVyaWFsICkgfHwgbWF0ZXJpYWwuY2xpcHBpbmcgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdHVuaWZvcm1zLmNsaXBwaW5nUGxhbmVzID0gY2xpcHBpbmcudW5pZm9ybTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHVwZGF0ZUNvbW1vbk1hdGVyaWFsUHJvcGVydGllcyggbWF0ZXJpYWwsIHBhcmFtZXRlcnMgKTtcclxuXHJcblx0XHRcdC8vIHN0b3JlIHRoZSBsaWdodCBzZXR1cCBpdCB3YXMgY3JlYXRlZCBmb3JcclxuXHJcblx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy5uZWVkc0xpZ2h0cyA9IG1hdGVyaWFsTmVlZHNMaWdodHMoIG1hdGVyaWFsICk7XHJcblx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy5saWdodHNTdGF0ZVZlcnNpb24gPSBsaWdodHNTdGF0ZVZlcnNpb247XHJcblxyXG5cdFx0XHRpZiAoIG1hdGVyaWFsUHJvcGVydGllcy5uZWVkc0xpZ2h0cyApIHtcclxuXHJcblx0XHRcdFx0Ly8gd2lyZSB1cCB0aGUgbWF0ZXJpYWwgdG8gdGhpcyByZW5kZXJlcidzIGxpZ2h0aW5nIHN0YXRlXHJcblxyXG5cdFx0XHRcdHVuaWZvcm1zLmFtYmllbnRMaWdodENvbG9yLnZhbHVlID0gbGlnaHRzLnN0YXRlLmFtYmllbnQ7XHJcblx0XHRcdFx0dW5pZm9ybXMubGlnaHRQcm9iZS52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5wcm9iZTtcclxuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb25hbExpZ2h0cy52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5kaXJlY3Rpb25hbDtcclxuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb25hbExpZ2h0U2hhZG93cy52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5kaXJlY3Rpb25hbFNoYWRvdztcclxuXHRcdFx0XHR1bmlmb3Jtcy5zcG90TGlnaHRzLnZhbHVlID0gbGlnaHRzLnN0YXRlLnNwb3Q7XHJcblx0XHRcdFx0dW5pZm9ybXMuc3BvdExpZ2h0U2hhZG93cy52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5zcG90U2hhZG93O1xyXG5cdFx0XHRcdHVuaWZvcm1zLnJlY3RBcmVhTGlnaHRzLnZhbHVlID0gbGlnaHRzLnN0YXRlLnJlY3RBcmVhO1xyXG5cdFx0XHRcdHVuaWZvcm1zLmx0Y18xLnZhbHVlID0gbGlnaHRzLnN0YXRlLnJlY3RBcmVhTFRDMTtcclxuXHRcdFx0XHR1bmlmb3Jtcy5sdGNfMi52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5yZWN0QXJlYUxUQzI7XHJcblx0XHRcdFx0dW5pZm9ybXMucG9pbnRMaWdodHMudmFsdWUgPSBsaWdodHMuc3RhdGUucG9pbnQ7XHJcblx0XHRcdFx0dW5pZm9ybXMucG9pbnRMaWdodFNoYWRvd3MudmFsdWUgPSBsaWdodHMuc3RhdGUucG9pbnRTaGFkb3c7XHJcblx0XHRcdFx0dW5pZm9ybXMuaGVtaXNwaGVyZUxpZ2h0cy52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5oZW1pO1xyXG5cclxuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb25hbFNoYWRvd01hcC52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hcDtcclxuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeC52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeDtcclxuXHRcdFx0XHR1bmlmb3Jtcy5zcG90U2hhZG93TWFwLnZhbHVlID0gbGlnaHRzLnN0YXRlLnNwb3RTaGFkb3dNYXA7XHJcblx0XHRcdFx0dW5pZm9ybXMuc3BvdExpZ2h0TWF0cml4LnZhbHVlID0gbGlnaHRzLnN0YXRlLnNwb3RMaWdodE1hdHJpeDtcclxuXHRcdFx0XHR1bmlmb3Jtcy5zcG90TGlnaHRNYXAudmFsdWUgPSBsaWdodHMuc3RhdGUuc3BvdExpZ2h0TWFwO1xyXG5cdFx0XHRcdHVuaWZvcm1zLnBvaW50U2hhZG93TWFwLnZhbHVlID0gbGlnaHRzLnN0YXRlLnBvaW50U2hhZG93TWFwO1xyXG5cdFx0XHRcdHVuaWZvcm1zLnBvaW50U2hhZG93TWF0cml4LnZhbHVlID0gbGlnaHRzLnN0YXRlLnBvaW50U2hhZG93TWF0cml4O1xyXG5cdFx0XHRcdC8vIFRPRE8gKGFiZWxuYXRpb24pOiBhZGQgYXJlYSBsaWdodHMgc2hhZG93IGluZm8gdG8gdW5pZm9ybXNcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy5jdXJyZW50UHJvZ3JhbSA9IHByb2dyYW07XHJcblx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy51bmlmb3Jtc0xpc3QgPSBudWxsO1xyXG5cclxuXHRcdFx0cmV0dXJuIHByb2dyYW07XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIGdldFVuaWZvcm1MaXN0KCBtYXRlcmlhbFByb3BlcnRpZXMgKSB7XHJcblxyXG5cdFx0XHRpZiAoIG1hdGVyaWFsUHJvcGVydGllcy51bmlmb3Jtc0xpc3QgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHByb2dVbmlmb3JtcyA9IG1hdGVyaWFsUHJvcGVydGllcy5jdXJyZW50UHJvZ3JhbS5nZXRVbmlmb3JtcygpO1xyXG5cdFx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy51bmlmb3Jtc0xpc3QgPSBXZWJHTFVuaWZvcm1zLnNlcVdpdGhWYWx1ZSggcHJvZ1VuaWZvcm1zLnNlcSwgbWF0ZXJpYWxQcm9wZXJ0aWVzLnVuaWZvcm1zICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gbWF0ZXJpYWxQcm9wZXJ0aWVzLnVuaWZvcm1zTGlzdDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0ZnVuY3Rpb24gdXBkYXRlQ29tbW9uTWF0ZXJpYWxQcm9wZXJ0aWVzKCBtYXRlcmlhbCwgcGFyYW1ldGVycyApIHtcclxuXHJcblx0XHRcdGNvbnN0IG1hdGVyaWFsUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCBtYXRlcmlhbCApO1xyXG5cclxuXHRcdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLm91dHB1dENvbG9yU3BhY2UgPSBwYXJhbWV0ZXJzLm91dHB1dENvbG9yU3BhY2U7XHJcblx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy5iYXRjaGluZyA9IHBhcmFtZXRlcnMuYmF0Y2hpbmc7XHJcblx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy5iYXRjaGluZ0NvbG9yID0gcGFyYW1ldGVycy5iYXRjaGluZ0NvbG9yO1xyXG5cdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMuaW5zdGFuY2luZyA9IHBhcmFtZXRlcnMuaW5zdGFuY2luZztcclxuXHRcdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLmluc3RhbmNpbmdDb2xvciA9IHBhcmFtZXRlcnMuaW5zdGFuY2luZ0NvbG9yO1xyXG5cdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMuaW5zdGFuY2luZ01vcnBoID0gcGFyYW1ldGVycy5pbnN0YW5jaW5nTW9ycGg7XHJcblx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy5za2lubmluZyA9IHBhcmFtZXRlcnMuc2tpbm5pbmc7XHJcblx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy5tb3JwaFRhcmdldHMgPSBwYXJhbWV0ZXJzLm1vcnBoVGFyZ2V0cztcclxuXHRcdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLm1vcnBoTm9ybWFscyA9IHBhcmFtZXRlcnMubW9ycGhOb3JtYWxzO1xyXG5cdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMubW9ycGhDb2xvcnMgPSBwYXJhbWV0ZXJzLm1vcnBoQ29sb3JzO1xyXG5cdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMubW9ycGhUYXJnZXRzQ291bnQgPSBwYXJhbWV0ZXJzLm1vcnBoVGFyZ2V0c0NvdW50O1xyXG5cdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMubnVtQ2xpcHBpbmdQbGFuZXMgPSBwYXJhbWV0ZXJzLm51bUNsaXBwaW5nUGxhbmVzO1xyXG5cdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMubnVtSW50ZXJzZWN0aW9uID0gcGFyYW1ldGVycy5udW1DbGlwSW50ZXJzZWN0aW9uO1xyXG5cdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMudmVydGV4QWxwaGFzID0gcGFyYW1ldGVycy52ZXJ0ZXhBbHBoYXM7XHJcblx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy52ZXJ0ZXhUYW5nZW50cyA9IHBhcmFtZXRlcnMudmVydGV4VGFuZ2VudHM7XHJcblx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy50b25lTWFwcGluZyA9IHBhcmFtZXRlcnMudG9uZU1hcHBpbmc7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIHNldFByb2dyYW0oIGNhbWVyYSwgc2NlbmUsIGdlb21ldHJ5LCBtYXRlcmlhbCwgb2JqZWN0ICkge1xyXG5cclxuXHRcdFx0aWYgKCBzY2VuZS5pc1NjZW5lICE9PSB0cnVlICkgc2NlbmUgPSBfZW1wdHlTY2VuZTsgLy8gc2NlbmUgY291bGQgYmUgYSBNZXNoLCBMaW5lLCBQb2ludHMsIC4uLlxyXG5cclxuXHRcdFx0dGV4dHVyZXMucmVzZXRUZXh0dXJlVW5pdHMoKTtcclxuXHJcblx0XHRcdGNvbnN0IGZvZyA9IHNjZW5lLmZvZztcclxuXHRcdFx0Y29uc3QgZW52aXJvbm1lbnQgPSBtYXRlcmlhbC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsID8gc2NlbmUuZW52aXJvbm1lbnQgOiBudWxsO1xyXG5cdFx0XHRjb25zdCBjb2xvclNwYWNlID0gKCBfY3VycmVudFJlbmRlclRhcmdldCA9PT0gbnVsbCApID8gX3RoaXMub3V0cHV0Q29sb3JTcGFjZSA6ICggX2N1cnJlbnRSZW5kZXJUYXJnZXQuaXNYUlJlbmRlclRhcmdldCA9PT0gdHJ1ZSA/IF9jdXJyZW50UmVuZGVyVGFyZ2V0LnRleHR1cmUuY29sb3JTcGFjZSA6IExpbmVhclNSR0JDb2xvclNwYWNlICk7XHJcblx0XHRcdGNvbnN0IGVudk1hcCA9ICggbWF0ZXJpYWwuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCA/IGN1YmV1dm1hcHMgOiBjdWJlbWFwcyApLmdldCggbWF0ZXJpYWwuZW52TWFwIHx8IGVudmlyb25tZW50ICk7XHJcblx0XHRcdGNvbnN0IHZlcnRleEFscGhhcyA9IG1hdGVyaWFsLnZlcnRleENvbG9ycyA9PT0gdHJ1ZSAmJiAhISBnZW9tZXRyeS5hdHRyaWJ1dGVzLmNvbG9yICYmIGdlb21ldHJ5LmF0dHJpYnV0ZXMuY29sb3IuaXRlbVNpemUgPT09IDQ7XHJcblx0XHRcdGNvbnN0IHZlcnRleFRhbmdlbnRzID0gISEgZ2VvbWV0cnkuYXR0cmlidXRlcy50YW5nZW50ICYmICggISEgbWF0ZXJpYWwubm9ybWFsTWFwIHx8IG1hdGVyaWFsLmFuaXNvdHJvcHkgPiAwICk7XHJcblx0XHRcdGNvbnN0IG1vcnBoVGFyZ2V0cyA9ICEhIGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbjtcclxuXHRcdFx0Y29uc3QgbW9ycGhOb3JtYWxzID0gISEgZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbDtcclxuXHRcdFx0Y29uc3QgbW9ycGhDb2xvcnMgPSAhISBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMuY29sb3I7XHJcblxyXG5cdFx0XHRsZXQgdG9uZU1hcHBpbmcgPSBOb1RvbmVNYXBwaW5nO1xyXG5cclxuXHRcdFx0aWYgKCBtYXRlcmlhbC50b25lTWFwcGVkICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIF9jdXJyZW50UmVuZGVyVGFyZ2V0ID09PSBudWxsIHx8IF9jdXJyZW50UmVuZGVyVGFyZ2V0LmlzWFJSZW5kZXJUYXJnZXQgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0dG9uZU1hcHBpbmcgPSBfdGhpcy50b25lTWFwcGluZztcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgbW9ycGhBdHRyaWJ1dGUgPSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24gfHwgZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbCB8fCBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMuY29sb3I7XHJcblx0XHRcdGNvbnN0IG1vcnBoVGFyZ2V0c0NvdW50ID0gKCBtb3JwaEF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkgPyBtb3JwaEF0dHJpYnV0ZS5sZW5ndGggOiAwO1xyXG5cclxuXHRcdFx0Y29uc3QgbWF0ZXJpYWxQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIG1hdGVyaWFsICk7XHJcblx0XHRcdGNvbnN0IGxpZ2h0cyA9IGN1cnJlbnRSZW5kZXJTdGF0ZS5zdGF0ZS5saWdodHM7XHJcblxyXG5cdFx0XHRpZiAoIF9jbGlwcGluZ0VuYWJsZWQgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggX2xvY2FsQ2xpcHBpbmdFbmFibGVkID09PSB0cnVlIHx8IGNhbWVyYSAhPT0gX2N1cnJlbnRDYW1lcmEgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgdXNlQ2FjaGUgPVxyXG5cdFx0XHRcdFx0XHRjYW1lcmEgPT09IF9jdXJyZW50Q2FtZXJhICYmXHJcblx0XHRcdFx0XHRcdG1hdGVyaWFsLmlkID09PSBfY3VycmVudE1hdGVyaWFsSWQ7XHJcblxyXG5cdFx0XHRcdFx0Ly8gd2UgbWlnaHQgd2FudCB0byBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aCBzb21lIENsaXBwaW5nR3JvdXBcclxuXHRcdFx0XHRcdC8vIG9iamVjdCBpbnN0ZWFkIG9mIHRoZSBtYXRlcmlhbCwgb25jZSBpdCBiZWNvbWVzIGZlYXNpYmxlXHJcblx0XHRcdFx0XHQvLyAoIzg0NjUsICM4Mzc5KVxyXG5cdFx0XHRcdFx0Y2xpcHBpbmcuc2V0U3RhdGUoIG1hdGVyaWFsLCBjYW1lcmEsIHVzZUNhY2hlICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vXHJcblxyXG5cdFx0XHRsZXQgbmVlZHNQcm9ncmFtQ2hhbmdlID0gZmFsc2U7XHJcblxyXG5cdFx0XHRpZiAoIG1hdGVyaWFsLnZlcnNpb24gPT09IG1hdGVyaWFsUHJvcGVydGllcy5fX3ZlcnNpb24gKSB7XHJcblxyXG5cdFx0XHRcdGlmICggbWF0ZXJpYWxQcm9wZXJ0aWVzLm5lZWRzTGlnaHRzICYmICggbWF0ZXJpYWxQcm9wZXJ0aWVzLmxpZ2h0c1N0YXRlVmVyc2lvbiAhPT0gbGlnaHRzLnN0YXRlLnZlcnNpb24gKSApIHtcclxuXHJcblx0XHRcdFx0XHRuZWVkc1Byb2dyYW1DaGFuZ2UgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbFByb3BlcnRpZXMub3V0cHV0Q29sb3JTcGFjZSAhPT0gY29sb3JTcGFjZSApIHtcclxuXHJcblx0XHRcdFx0XHRuZWVkc1Byb2dyYW1DaGFuZ2UgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCBvYmplY3QuaXNCYXRjaGVkTWVzaCAmJiBtYXRlcmlhbFByb3BlcnRpZXMuYmF0Y2hpbmcgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0XHRcdG5lZWRzUHJvZ3JhbUNoYW5nZSA9IHRydWU7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoICEgb2JqZWN0LmlzQmF0Y2hlZE1lc2ggJiYgbWF0ZXJpYWxQcm9wZXJ0aWVzLmJhdGNoaW5nID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRcdG5lZWRzUHJvZ3JhbUNoYW5nZSA9IHRydWU7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc0JhdGNoZWRNZXNoICYmIG1hdGVyaWFsUHJvcGVydGllcy5iYXRjaGluZ0NvbG9yID09PSB0cnVlICYmIG9iamVjdC5jb2xvclRleHR1cmUgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdFx0bmVlZHNQcm9ncmFtQ2hhbmdlID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzQmF0Y2hlZE1lc2ggJiYgbWF0ZXJpYWxQcm9wZXJ0aWVzLmJhdGNoaW5nQ29sb3IgPT09IGZhbHNlICYmIG9iamVjdC5jb2xvclRleHR1cmUgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdFx0bmVlZHNQcm9ncmFtQ2hhbmdlID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzSW5zdGFuY2VkTWVzaCAmJiBtYXRlcmlhbFByb3BlcnRpZXMuaW5zdGFuY2luZyA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRcdFx0bmVlZHNQcm9ncmFtQ2hhbmdlID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggISBvYmplY3QuaXNJbnN0YW5jZWRNZXNoICYmIG1hdGVyaWFsUHJvcGVydGllcy5pbnN0YW5jaW5nID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRcdG5lZWRzUHJvZ3JhbUNoYW5nZSA9IHRydWU7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc1NraW5uZWRNZXNoICYmIG1hdGVyaWFsUHJvcGVydGllcy5za2lubmluZyA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRcdFx0bmVlZHNQcm9ncmFtQ2hhbmdlID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggISBvYmplY3QuaXNTa2lubmVkTWVzaCAmJiBtYXRlcmlhbFByb3BlcnRpZXMuc2tpbm5pbmcgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0bmVlZHNQcm9ncmFtQ2hhbmdlID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzSW5zdGFuY2VkTWVzaCAmJiBtYXRlcmlhbFByb3BlcnRpZXMuaW5zdGFuY2luZ0NvbG9yID09PSB0cnVlICYmIG9iamVjdC5pbnN0YW5jZUNvbG9yID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRcdG5lZWRzUHJvZ3JhbUNoYW5nZSA9IHRydWU7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc0luc3RhbmNlZE1lc2ggJiYgbWF0ZXJpYWxQcm9wZXJ0aWVzLmluc3RhbmNpbmdDb2xvciA9PT0gZmFsc2UgJiYgb2JqZWN0Lmluc3RhbmNlQ29sb3IgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdFx0bmVlZHNQcm9ncmFtQ2hhbmdlID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzSW5zdGFuY2VkTWVzaCAmJiBtYXRlcmlhbFByb3BlcnRpZXMuaW5zdGFuY2luZ01vcnBoID09PSB0cnVlICYmIG9iamVjdC5tb3JwaFRleHR1cmUgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdFx0bmVlZHNQcm9ncmFtQ2hhbmdlID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzSW5zdGFuY2VkTWVzaCAmJiBtYXRlcmlhbFByb3BlcnRpZXMuaW5zdGFuY2luZ01vcnBoID09PSBmYWxzZSAmJiBvYmplY3QubW9ycGhUZXh0dXJlICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRcdG5lZWRzUHJvZ3JhbUNoYW5nZSA9IHRydWU7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsUHJvcGVydGllcy5lbnZNYXAgIT09IGVudk1hcCApIHtcclxuXHJcblx0XHRcdFx0XHRuZWVkc1Byb2dyYW1DaGFuZ2UgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5mb2cgPT09IHRydWUgJiYgbWF0ZXJpYWxQcm9wZXJ0aWVzLmZvZyAhPT0gZm9nICkge1xyXG5cclxuXHRcdFx0XHRcdG5lZWRzUHJvZ3JhbUNoYW5nZSA9IHRydWU7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsUHJvcGVydGllcy5udW1DbGlwcGluZ1BsYW5lcyAhPT0gdW5kZWZpbmVkICYmXHJcblx0XHRcdFx0XHQoIG1hdGVyaWFsUHJvcGVydGllcy5udW1DbGlwcGluZ1BsYW5lcyAhPT0gY2xpcHBpbmcubnVtUGxhbmVzIHx8XHJcblx0XHRcdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMubnVtSW50ZXJzZWN0aW9uICE9PSBjbGlwcGluZy5udW1JbnRlcnNlY3Rpb24gKSApIHtcclxuXHJcblx0XHRcdFx0XHRuZWVkc1Byb2dyYW1DaGFuZ2UgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbFByb3BlcnRpZXMudmVydGV4QWxwaGFzICE9PSB2ZXJ0ZXhBbHBoYXMgKSB7XHJcblxyXG5cdFx0XHRcdFx0bmVlZHNQcm9ncmFtQ2hhbmdlID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWxQcm9wZXJ0aWVzLnZlcnRleFRhbmdlbnRzICE9PSB2ZXJ0ZXhUYW5nZW50cyApIHtcclxuXHJcblx0XHRcdFx0XHRuZWVkc1Byb2dyYW1DaGFuZ2UgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbFByb3BlcnRpZXMubW9ycGhUYXJnZXRzICE9PSBtb3JwaFRhcmdldHMgKSB7XHJcblxyXG5cdFx0XHRcdFx0bmVlZHNQcm9ncmFtQ2hhbmdlID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWxQcm9wZXJ0aWVzLm1vcnBoTm9ybWFscyAhPT0gbW9ycGhOb3JtYWxzICkge1xyXG5cclxuXHRcdFx0XHRcdG5lZWRzUHJvZ3JhbUNoYW5nZSA9IHRydWU7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsUHJvcGVydGllcy5tb3JwaENvbG9ycyAhPT0gbW9ycGhDb2xvcnMgKSB7XHJcblxyXG5cdFx0XHRcdFx0bmVlZHNQcm9ncmFtQ2hhbmdlID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWxQcm9wZXJ0aWVzLnRvbmVNYXBwaW5nICE9PSB0b25lTWFwcGluZyApIHtcclxuXHJcblx0XHRcdFx0XHRuZWVkc1Byb2dyYW1DaGFuZ2UgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbFByb3BlcnRpZXMubW9ycGhUYXJnZXRzQ291bnQgIT09IG1vcnBoVGFyZ2V0c0NvdW50ICkge1xyXG5cclxuXHRcdFx0XHRcdG5lZWRzUHJvZ3JhbUNoYW5nZSA9IHRydWU7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdG5lZWRzUHJvZ3JhbUNoYW5nZSA9IHRydWU7XHJcblx0XHRcdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLl9fdmVyc2lvbiA9IG1hdGVyaWFsLnZlcnNpb247XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvL1xyXG5cclxuXHRcdFx0bGV0IHByb2dyYW0gPSBtYXRlcmlhbFByb3BlcnRpZXMuY3VycmVudFByb2dyYW07XHJcblxyXG5cdFx0XHRpZiAoIG5lZWRzUHJvZ3JhbUNoYW5nZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0cHJvZ3JhbSA9IGdldFByb2dyYW0oIG1hdGVyaWFsLCBzY2VuZSwgb2JqZWN0ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRsZXQgcmVmcmVzaFByb2dyYW0gPSBmYWxzZTtcclxuXHRcdFx0bGV0IHJlZnJlc2hNYXRlcmlhbCA9IGZhbHNlO1xyXG5cdFx0XHRsZXQgcmVmcmVzaExpZ2h0cyA9IGZhbHNlO1xyXG5cclxuXHRcdFx0Y29uc3QgcF91bmlmb3JtcyA9IHByb2dyYW0uZ2V0VW5pZm9ybXMoKSxcclxuXHRcdFx0XHRtX3VuaWZvcm1zID0gbWF0ZXJpYWxQcm9wZXJ0aWVzLnVuaWZvcm1zO1xyXG5cclxuXHRcdFx0aWYgKCBzdGF0ZS51c2VQcm9ncmFtKCBwcm9ncmFtLnByb2dyYW0gKSApIHtcclxuXHJcblx0XHRcdFx0cmVmcmVzaFByb2dyYW0gPSB0cnVlO1xyXG5cdFx0XHRcdHJlZnJlc2hNYXRlcmlhbCA9IHRydWU7XHJcblx0XHRcdFx0cmVmcmVzaExpZ2h0cyA9IHRydWU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIG1hdGVyaWFsLmlkICE9PSBfY3VycmVudE1hdGVyaWFsSWQgKSB7XHJcblxyXG5cdFx0XHRcdF9jdXJyZW50TWF0ZXJpYWxJZCA9IG1hdGVyaWFsLmlkO1xyXG5cclxuXHRcdFx0XHRyZWZyZXNoTWF0ZXJpYWwgPSB0cnVlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCByZWZyZXNoUHJvZ3JhbSB8fCBfY3VycmVudENhbWVyYSAhPT0gY2FtZXJhICkge1xyXG5cclxuXHRcdFx0XHQvLyBjb21tb24gY2FtZXJhIHVuaWZvcm1zXHJcblxyXG5cdFx0XHRcdGNvbnN0IHJldmVyc2VEZXB0aEJ1ZmZlciA9IHN0YXRlLmJ1ZmZlcnMuZGVwdGguZ2V0UmV2ZXJzZWQoKTtcclxuXHJcblx0XHRcdFx0aWYgKCByZXZlcnNlRGVwdGhCdWZmZXIgKSB7XHJcblxyXG5cdFx0XHRcdFx0X2N1cnJlbnRQcm9qZWN0aW9uTWF0cml4LmNvcHkoIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4ICk7XHJcblxyXG5cdFx0XHRcdFx0dG9Ob3JtYWxpemVkUHJvamVjdGlvbk1hdHJpeCggX2N1cnJlbnRQcm9qZWN0aW9uTWF0cml4ICk7XHJcblx0XHRcdFx0XHR0b1JldmVyc2VkUHJvamVjdGlvbk1hdHJpeCggX2N1cnJlbnRQcm9qZWN0aW9uTWF0cml4ICk7XHJcblxyXG5cdFx0XHRcdFx0cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAncHJvamVjdGlvbk1hdHJpeCcsIF9jdXJyZW50UHJvamVjdGlvbk1hdHJpeCApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ3Byb2plY3Rpb25NYXRyaXgnLCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ3ZpZXdNYXRyaXgnLCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlICk7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHVDYW1Qb3MgPSBwX3VuaWZvcm1zLm1hcC5jYW1lcmFQb3NpdGlvbjtcclxuXHJcblx0XHRcdFx0aWYgKCB1Q2FtUG9zICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0dUNhbVBvcy5zZXRWYWx1ZSggX2dsLCBfdmVjdG9yMy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGNhbWVyYS5tYXRyaXhXb3JsZCApICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKCBjYXBhYmlsaXRpZXMubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciApIHtcclxuXHJcblx0XHRcdFx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdsb2dEZXB0aEJ1ZkZDJyxcclxuXHRcdFx0XHRcdFx0Mi4wIC8gKCBNYXRoLmxvZyggY2FtZXJhLmZhciArIDEuMCApIC8gTWF0aC5MTjIgKSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8vIGNvbnNpZGVyIG1vdmluZyBpc09ydGhvZ3JhcGhpYyB0byBVbmlmb3JtTGliIGFuZCBXZWJHTE1hdGVyaWFscywgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tcmRvb2IvdGhyZWUuanMvcHVsbC8yNjQ2NyNpc3N1ZWNvbW1lbnQtMTY0NTE4NTA2N1xyXG5cclxuXHRcdFx0XHRpZiAoIG1hdGVyaWFsLmlzTWVzaFBob25nTWF0ZXJpYWwgfHxcclxuXHRcdFx0XHRcdG1hdGVyaWFsLmlzTWVzaFRvb25NYXRlcmlhbCB8fFxyXG5cdFx0XHRcdFx0bWF0ZXJpYWwuaXNNZXNoTGFtYmVydE1hdGVyaWFsIHx8XHJcblx0XHRcdFx0XHRtYXRlcmlhbC5pc01lc2hCYXNpY01hdGVyaWFsIHx8XHJcblx0XHRcdFx0XHRtYXRlcmlhbC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsIHx8XHJcblx0XHRcdFx0XHRtYXRlcmlhbC5pc1NoYWRlck1hdGVyaWFsICkge1xyXG5cclxuXHRcdFx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ2lzT3J0aG9ncmFwaGljJywgY2FtZXJhLmlzT3J0aG9ncmFwaGljQ2FtZXJhID09PSB0cnVlICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKCBfY3VycmVudENhbWVyYSAhPT0gY2FtZXJhICkge1xyXG5cclxuXHRcdFx0XHRcdF9jdXJyZW50Q2FtZXJhID0gY2FtZXJhO1xyXG5cclxuXHRcdFx0XHRcdC8vIGxpZ2h0aW5nIHVuaWZvcm1zIGRlcGVuZCBvbiB0aGUgY2FtZXJhIHNvIGVuZm9yY2UgYW4gdXBkYXRlXHJcblx0XHRcdFx0XHQvLyBub3csIGluIGNhc2UgdGhpcyBtYXRlcmlhbCBzdXBwb3J0cyBsaWdodHMgLSBvciBsYXRlciwgd2hlblxyXG5cdFx0XHRcdFx0Ly8gdGhlIG5leHQgbWF0ZXJpYWwgdGhhdCBkb2VzIGdldHMgYWN0aXZhdGVkOlxyXG5cclxuXHRcdFx0XHRcdHJlZnJlc2hNYXRlcmlhbCA9IHRydWU7XHRcdC8vIHNldCB0byB0cnVlIG9uIG1hdGVyaWFsIGNoYW5nZVxyXG5cdFx0XHRcdFx0cmVmcmVzaExpZ2h0cyA9IHRydWU7XHRcdC8vIHJlbWFpbnMgc2V0IHVudGlsIHVwZGF0ZSBkb25lXHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIHNraW5uaW5nIGFuZCBtb3JwaCB0YXJnZXQgdW5pZm9ybXMgbXVzdCBiZSBzZXQgZXZlbiBpZiBtYXRlcmlhbCBkaWRuJ3QgY2hhbmdlXHJcblx0XHRcdC8vIGF1dG8tc2V0dGluZyBvZiB0ZXh0dXJlIHVuaXQgZm9yIGJvbmUgYW5kIG1vcnBoIHRleHR1cmUgbXVzdCBnbyBiZWZvcmUgb3RoZXIgdGV4dHVyZXNcclxuXHRcdFx0Ly8gb3RoZXJ3aXNlIHRleHR1cmVzIHVzZWQgZm9yIHNraW5uaW5nIGFuZCBtb3JwaGluZyBjYW4gdGFrZSBvdmVyIHRleHR1cmUgdW5pdHMgcmVzZXJ2ZWQgZm9yIG90aGVyIG1hdGVyaWFsIHRleHR1cmVzXHJcblxyXG5cdFx0XHRpZiAoIG9iamVjdC5pc1NraW5uZWRNZXNoICkge1xyXG5cclxuXHRcdFx0XHRwX3VuaWZvcm1zLnNldE9wdGlvbmFsKCBfZ2wsIG9iamVjdCwgJ2JpbmRNYXRyaXgnICk7XHJcblx0XHRcdFx0cF91bmlmb3Jtcy5zZXRPcHRpb25hbCggX2dsLCBvYmplY3QsICdiaW5kTWF0cml4SW52ZXJzZScgKTtcclxuXHJcblx0XHRcdFx0Y29uc3Qgc2tlbGV0b24gPSBvYmplY3Quc2tlbGV0b247XHJcblxyXG5cdFx0XHRcdGlmICggc2tlbGV0b24gKSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBza2VsZXRvbi5ib25lVGV4dHVyZSA9PT0gbnVsbCApIHNrZWxldG9uLmNvbXB1dGVCb25lVGV4dHVyZSgpO1xyXG5cclxuXHRcdFx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ2JvbmVUZXh0dXJlJywgc2tlbGV0b24uYm9uZVRleHR1cmUsIHRleHR1cmVzICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggb2JqZWN0LmlzQmF0Y2hlZE1lc2ggKSB7XHJcblxyXG5cdFx0XHRcdHBfdW5pZm9ybXMuc2V0T3B0aW9uYWwoIF9nbCwgb2JqZWN0LCAnYmF0Y2hpbmdUZXh0dXJlJyApO1xyXG5cdFx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ2JhdGNoaW5nVGV4dHVyZScsIG9iamVjdC5fbWF0cmljZXNUZXh0dXJlLCB0ZXh0dXJlcyApO1xyXG5cclxuXHRcdFx0XHRwX3VuaWZvcm1zLnNldE9wdGlvbmFsKCBfZ2wsIG9iamVjdCwgJ2JhdGNoaW5nSWRUZXh0dXJlJyApO1xyXG5cdFx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ2JhdGNoaW5nSWRUZXh0dXJlJywgb2JqZWN0Ll9pbmRpcmVjdFRleHR1cmUsIHRleHR1cmVzICk7XHJcblxyXG5cdFx0XHRcdHBfdW5pZm9ybXMuc2V0T3B0aW9uYWwoIF9nbCwgb2JqZWN0LCAnYmF0Y2hpbmdDb2xvclRleHR1cmUnICk7XHJcblx0XHRcdFx0aWYgKCBvYmplY3QuX2NvbG9yc1RleHR1cmUgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdFx0cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAnYmF0Y2hpbmdDb2xvclRleHR1cmUnLCBvYmplY3QuX2NvbG9yc1RleHR1cmUsIHRleHR1cmVzICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IG1vcnBoQXR0cmlidXRlcyA9IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcztcclxuXHJcblx0XHRcdGlmICggbW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uICE9PSB1bmRlZmluZWQgfHwgbW9ycGhBdHRyaWJ1dGVzLm5vcm1hbCAhPT0gdW5kZWZpbmVkIHx8ICggbW9ycGhBdHRyaWJ1dGVzLmNvbG9yICE9PSB1bmRlZmluZWQgKSApIHtcclxuXHJcblx0XHRcdFx0bW9ycGh0YXJnZXRzLnVwZGF0ZSggb2JqZWN0LCBnZW9tZXRyeSwgcHJvZ3JhbSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCByZWZyZXNoTWF0ZXJpYWwgfHwgbWF0ZXJpYWxQcm9wZXJ0aWVzLnJlY2VpdmVTaGFkb3cgIT09IG9iamVjdC5yZWNlaXZlU2hhZG93ICkge1xyXG5cclxuXHRcdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMucmVjZWl2ZVNoYWRvdyA9IG9iamVjdC5yZWNlaXZlU2hhZG93O1xyXG5cdFx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ3JlY2VpdmVTaGFkb3cnLCBvYmplY3QucmVjZWl2ZVNoYWRvdyApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL21yZG9vYi90aHJlZS5qcy9wdWxsLzI0NDY3I2lzc3VlY29tbWVudC0xMjA5MDMxNTEyXHJcblxyXG5cdFx0XHRpZiAoIG1hdGVyaWFsLmlzTWVzaEdvdXJhdWRNYXRlcmlhbCAmJiBtYXRlcmlhbC5lbnZNYXAgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdG1fdW5pZm9ybXMuZW52TWFwLnZhbHVlID0gZW52TWFwO1xyXG5cclxuXHRcdFx0XHRtX3VuaWZvcm1zLmZsaXBFbnZNYXAudmFsdWUgPSAoIGVudk1hcC5pc0N1YmVUZXh0dXJlICYmIGVudk1hcC5pc1JlbmRlclRhcmdldFRleHR1cmUgPT09IGZhbHNlICkgPyAtIDEgOiAxO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBtYXRlcmlhbC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsICYmIG1hdGVyaWFsLmVudk1hcCA9PT0gbnVsbCAmJiBzY2VuZS5lbnZpcm9ubWVudCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0bV91bmlmb3Jtcy5lbnZNYXBJbnRlbnNpdHkudmFsdWUgPSBzY2VuZS5lbnZpcm9ubWVudEludGVuc2l0eTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggcmVmcmVzaE1hdGVyaWFsICkge1xyXG5cclxuXHRcdFx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICd0b25lTWFwcGluZ0V4cG9zdXJlJywgX3RoaXMudG9uZU1hcHBpbmdFeHBvc3VyZSApO1xyXG5cclxuXHRcdFx0XHRpZiAoIG1hdGVyaWFsUHJvcGVydGllcy5uZWVkc0xpZ2h0cyApIHtcclxuXHJcblx0XHRcdFx0XHQvLyB0aGUgY3VycmVudCBtYXRlcmlhbCByZXF1aXJlcyBsaWdodGluZyBpbmZvXHJcblxyXG5cdFx0XHRcdFx0Ly8gbm90ZTogYWxsIGxpZ2h0aW5nIHVuaWZvcm1zIGFyZSBhbHdheXMgc2V0IGNvcnJlY3RseVxyXG5cdFx0XHRcdFx0Ly8gdGhleSBzaW1wbHkgcmVmZXJlbmNlIHRoZSByZW5kZXJlcidzIHN0YXRlIGZvciB0aGVpclxyXG5cdFx0XHRcdFx0Ly8gdmFsdWVzXHJcblx0XHRcdFx0XHQvL1xyXG5cdFx0XHRcdFx0Ly8gdXNlIHRoZSBjdXJyZW50IG1hdGVyaWFsJ3MgLm5lZWRzVXBkYXRlIGZsYWdzIHRvIHNldFxyXG5cdFx0XHRcdFx0Ly8gdGhlIEdMIHN0YXRlIHdoZW4gcmVxdWlyZWRcclxuXHJcblx0XHRcdFx0XHRtYXJrVW5pZm9ybXNMaWdodHNOZWVkc1VwZGF0ZSggbV91bmlmb3JtcywgcmVmcmVzaExpZ2h0cyApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8vIHJlZnJlc2ggdW5pZm9ybXMgY29tbW9uIHRvIHNldmVyYWwgbWF0ZXJpYWxzXHJcblxyXG5cdFx0XHRcdGlmICggZm9nICYmIG1hdGVyaWFsLmZvZyA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0XHRtYXRlcmlhbHMucmVmcmVzaEZvZ1VuaWZvcm1zKCBtX3VuaWZvcm1zLCBmb2cgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRtYXRlcmlhbHMucmVmcmVzaE1hdGVyaWFsVW5pZm9ybXMoIG1fdW5pZm9ybXMsIG1hdGVyaWFsLCBfcGl4ZWxSYXRpbywgX2hlaWdodCwgY3VycmVudFJlbmRlclN0YXRlLnN0YXRlLnRyYW5zbWlzc2lvblJlbmRlclRhcmdldFsgY2FtZXJhLmlkIF0gKTtcclxuXHJcblx0XHRcdFx0V2ViR0xVbmlmb3Jtcy51cGxvYWQoIF9nbCwgZ2V0VW5pZm9ybUxpc3QoIG1hdGVyaWFsUHJvcGVydGllcyApLCBtX3VuaWZvcm1zLCB0ZXh0dXJlcyApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBtYXRlcmlhbC5pc1NoYWRlck1hdGVyaWFsICYmIG1hdGVyaWFsLnVuaWZvcm1zTmVlZFVwZGF0ZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0V2ViR0xVbmlmb3Jtcy51cGxvYWQoIF9nbCwgZ2V0VW5pZm9ybUxpc3QoIG1hdGVyaWFsUHJvcGVydGllcyApLCBtX3VuaWZvcm1zLCB0ZXh0dXJlcyApO1xyXG5cdFx0XHRcdG1hdGVyaWFsLnVuaWZvcm1zTmVlZFVwZGF0ZSA9IGZhbHNlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBtYXRlcmlhbC5pc1Nwcml0ZU1hdGVyaWFsICkge1xyXG5cclxuXHRcdFx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdjZW50ZXInLCBvYmplY3QuY2VudGVyICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBjb21tb24gbWF0cmljZXNcclxuXHJcblx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ21vZGVsVmlld01hdHJpeCcsIG9iamVjdC5tb2RlbFZpZXdNYXRyaXggKTtcclxuXHRcdFx0cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAnbm9ybWFsTWF0cml4Jywgb2JqZWN0Lm5vcm1hbE1hdHJpeCApO1xyXG5cdFx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdtb2RlbE1hdHJpeCcsIG9iamVjdC5tYXRyaXhXb3JsZCApO1xyXG5cclxuXHRcdFx0Ly8gVUJPc1xyXG5cclxuXHRcdFx0aWYgKCBtYXRlcmlhbC5pc1NoYWRlck1hdGVyaWFsIHx8IG1hdGVyaWFsLmlzUmF3U2hhZGVyTWF0ZXJpYWwgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGdyb3VwcyA9IG1hdGVyaWFsLnVuaWZvcm1zR3JvdXBzO1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBncm91cHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBncm91cCA9IGdyb3Vwc1sgaSBdO1xyXG5cclxuXHRcdFx0XHRcdHVuaWZvcm1zR3JvdXBzLnVwZGF0ZSggZ3JvdXAsIHByb2dyYW0gKTtcclxuXHRcdFx0XHRcdHVuaWZvcm1zR3JvdXBzLmJpbmQoIGdyb3VwLCBwcm9ncmFtICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBwcm9ncmFtO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBJZiB1bmlmb3JtcyBhcmUgbWFya2VkIGFzIGNsZWFuLCB0aGV5IGRvbid0IG5lZWQgdG8gYmUgbG9hZGVkIHRvIHRoZSBHUFUuXHJcblxyXG5cdFx0ZnVuY3Rpb24gbWFya1VuaWZvcm1zTGlnaHRzTmVlZHNVcGRhdGUoIHVuaWZvcm1zLCB2YWx1ZSApIHtcclxuXHJcblx0XHRcdHVuaWZvcm1zLmFtYmllbnRMaWdodENvbG9yLm5lZWRzVXBkYXRlID0gdmFsdWU7XHJcblx0XHRcdHVuaWZvcm1zLmxpZ2h0UHJvYmUubmVlZHNVcGRhdGUgPSB2YWx1ZTtcclxuXHJcblx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbmFsTGlnaHRzLm5lZWRzVXBkYXRlID0gdmFsdWU7XHJcblx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbmFsTGlnaHRTaGFkb3dzLm5lZWRzVXBkYXRlID0gdmFsdWU7XHJcblx0XHRcdHVuaWZvcm1zLnBvaW50TGlnaHRzLm5lZWRzVXBkYXRlID0gdmFsdWU7XHJcblx0XHRcdHVuaWZvcm1zLnBvaW50TGlnaHRTaGFkb3dzLm5lZWRzVXBkYXRlID0gdmFsdWU7XHJcblx0XHRcdHVuaWZvcm1zLnNwb3RMaWdodHMubmVlZHNVcGRhdGUgPSB2YWx1ZTtcclxuXHRcdFx0dW5pZm9ybXMuc3BvdExpZ2h0U2hhZG93cy5uZWVkc1VwZGF0ZSA9IHZhbHVlO1xyXG5cdFx0XHR1bmlmb3Jtcy5yZWN0QXJlYUxpZ2h0cy5uZWVkc1VwZGF0ZSA9IHZhbHVlO1xyXG5cdFx0XHR1bmlmb3Jtcy5oZW1pc3BoZXJlTGlnaHRzLm5lZWRzVXBkYXRlID0gdmFsdWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIG1hdGVyaWFsTmVlZHNMaWdodHMoIG1hdGVyaWFsICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIG1hdGVyaWFsLmlzTWVzaExhbWJlcnRNYXRlcmlhbCB8fCBtYXRlcmlhbC5pc01lc2hUb29uTWF0ZXJpYWwgfHwgbWF0ZXJpYWwuaXNNZXNoUGhvbmdNYXRlcmlhbCB8fFxyXG5cdFx0XHRcdG1hdGVyaWFsLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwgfHwgbWF0ZXJpYWwuaXNTaGFkb3dNYXRlcmlhbCB8fFxyXG5cdFx0XHRcdCggbWF0ZXJpYWwuaXNTaGFkZXJNYXRlcmlhbCAmJiBtYXRlcmlhbC5saWdodHMgPT09IHRydWUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXR1cm5zIHRoZSBhY3RpdmUgY3ViZSBmYWNlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGFjdGl2ZSBjdWJlIGZhY2UuXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ2V0QWN0aXZlQ3ViZUZhY2UgPSBmdW5jdGlvbiAoKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gX2N1cnJlbnRBY3RpdmVDdWJlRmFjZTtcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmV0dXJucyB0aGUgYWN0aXZlIG1pcG1hcCBsZXZlbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBhY3RpdmUgbWlwbWFwIGxldmVsLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdldEFjdGl2ZU1pcG1hcExldmVsID0gZnVuY3Rpb24gKCkge1xyXG5cclxuXHRcdFx0cmV0dXJuIF9jdXJyZW50QWN0aXZlTWlwbWFwTGV2ZWw7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJldHVybnMgdGhlIGFjdGl2ZSByZW5kZXIgdGFyZ2V0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEByZXR1cm4gez9XZWJHTFJlbmRlclRhcmdldH0gVGhlIGFjdGl2ZSByZW5kZXIgdGFyZ2V0LiBSZXR1cm5zIGBudWxsYCBpZiBubyByZW5kZXIgdGFyZ2V0XHJcblx0XHQgKiBpcyBjdXJyZW50bHkgc2V0LlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdldFJlbmRlclRhcmdldCA9IGZ1bmN0aW9uICgpIHtcclxuXHJcblx0XHRcdHJldHVybiBfY3VycmVudFJlbmRlclRhcmdldDtcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdHRoaXMuc2V0UmVuZGVyVGFyZ2V0VGV4dHVyZXMgPSBmdW5jdGlvbiAoIHJlbmRlclRhcmdldCwgY29sb3JUZXh0dXJlLCBkZXB0aFRleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRjb25zdCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCApO1xyXG5cclxuXHRcdFx0cmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX2F1dG9BbGxvY2F0ZURlcHRoQnVmZmVyID0gcmVuZGVyVGFyZ2V0LnJlc29sdmVEZXB0aEJ1ZmZlciA9PT0gZmFsc2U7XHJcblx0XHRcdGlmICggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX2F1dG9BbGxvY2F0ZURlcHRoQnVmZmVyID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdFx0Ly8gVGhlIG11bHRpc2FtcGxlX3JlbmRlcl90b190ZXh0dXJlIGV4dGVuc2lvbiBkb2Vzbid0IHdvcmsgcHJvcGVybHkgaWYgdGhlcmVcclxuXHRcdFx0XHQvLyBhcmUgbWlkZnJhbWUgZmx1c2hlcyBhbmQgYW4gZXh0ZXJuYWwgZGVwdGggYnVmZmVyLiBEaXNhYmxlIHVzZSBvZiB0aGUgZXh0ZW5zaW9uLlxyXG5cdFx0XHRcdHJlbmRlclRhcmdldFByb3BlcnRpZXMuX191c2VSZW5kZXJUb1RleHR1cmUgPSBmYWxzZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQudGV4dHVyZSApLl9fd2ViZ2xUZXh0dXJlID0gY29sb3JUZXh0dXJlO1xyXG5cdFx0XHRwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSApLl9fd2ViZ2xUZXh0dXJlID0gcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX2F1dG9BbGxvY2F0ZURlcHRoQnVmZmVyID8gdW5kZWZpbmVkIDogZGVwdGhUZXh0dXJlO1xyXG5cclxuXHRcdFx0cmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX2hhc0V4dGVybmFsVGV4dHVyZXMgPSB0cnVlO1xyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0dGhpcy5zZXRSZW5kZXJUYXJnZXRGcmFtZWJ1ZmZlciA9IGZ1bmN0aW9uICggcmVuZGVyVGFyZ2V0LCBkZWZhdWx0RnJhbWVidWZmZXIgKSB7XHJcblxyXG5cdFx0XHRjb25zdCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCApO1xyXG5cdFx0XHRyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciA9IGRlZmF1bHRGcmFtZWJ1ZmZlcjtcclxuXHRcdFx0cmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3VzZURlZmF1bHRGcmFtZWJ1ZmZlciA9IGRlZmF1bHRGcmFtZWJ1ZmZlciA9PT0gdW5kZWZpbmVkO1xyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0Y29uc3QgX3NjcmF0Y2hGcmFtZUJ1ZmZlciA9IF9nbC5jcmVhdGVGcmFtZWJ1ZmZlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU2V0cyB0aGUgYWN0aXZlIHJlbmRlcnRhcmdldC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0gez9XZWJHTFJlbmRlclRhcmdldH0gcmVuZGVyVGFyZ2V0IC0gVGhlIHJlbmRlciB0YXJnZXQgdG8gc2V0LiBXaGVuIGBudWxsYCBpcyBnaXZlbixcclxuXHRcdCAqIHRoZSBjYW52YXMgaXMgc2V0IGFzIHRoZSBhY3RpdmUgcmVuZGVyIHRhcmdldCBpbnN0ZWFkLlxyXG5cdFx0ICogQHBhcmFtIHtudW1iZXJ9IFthY3RpdmVDdWJlRmFjZT0wXSAtIFRoZSBhY3RpdmUgY3ViZSBmYWNlIHdoZW4gdXNpbmcgYSBjdWJlIHJlbmRlciB0YXJnZXQuXHJcblx0XHQgKiBJbmRpY2F0ZXMgdGhlIHogbGF5ZXIgdG8gcmVuZGVyIGluIHRvIHdoZW4gdXNpbmcgM0Qgb3IgYXJyYXkgcmVuZGVyIHRhcmdldHMuXHJcblx0XHQgKiBAcGFyYW0ge251bWJlcn0gW2FjdGl2ZU1pcG1hcExldmVsPTBdIC0gVGhlIGFjdGl2ZSBtaXBtYXAgbGV2ZWwuXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2V0UmVuZGVyVGFyZ2V0ID0gZnVuY3Rpb24gKCByZW5kZXJUYXJnZXQsIGFjdGl2ZUN1YmVGYWNlID0gMCwgYWN0aXZlTWlwbWFwTGV2ZWwgPSAwICkge1xyXG5cclxuXHRcdFx0X2N1cnJlbnRSZW5kZXJUYXJnZXQgPSByZW5kZXJUYXJnZXQ7XHJcblx0XHRcdF9jdXJyZW50QWN0aXZlQ3ViZUZhY2UgPSBhY3RpdmVDdWJlRmFjZTtcclxuXHRcdFx0X2N1cnJlbnRBY3RpdmVNaXBtYXBMZXZlbCA9IGFjdGl2ZU1pcG1hcExldmVsO1xyXG5cclxuXHRcdFx0bGV0IHVzZURlZmF1bHRGcmFtZWJ1ZmZlciA9IHRydWU7XHJcblx0XHRcdGxldCBmcmFtZWJ1ZmZlciA9IG51bGw7XHJcblx0XHRcdGxldCBpc0N1YmUgPSBmYWxzZTtcclxuXHRcdFx0bGV0IGlzUmVuZGVyVGFyZ2V0M0QgPSBmYWxzZTtcclxuXHJcblx0XHRcdGlmICggcmVuZGVyVGFyZ2V0ICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCApO1xyXG5cclxuXHRcdFx0XHRpZiAoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX191c2VEZWZhdWx0RnJhbWVidWZmZXIgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHQvLyBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0byByZWJpbmQgdGhlIGZyYW1lYnVmZmVyLlxyXG5cdFx0XHRcdFx0c3RhdGUuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIG51bGwgKTtcclxuXHRcdFx0XHRcdHVzZURlZmF1bHRGcmFtZWJ1ZmZlciA9IGZhbHNlO1xyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdHRleHR1cmVzLnNldHVwUmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX2hhc0V4dGVybmFsVGV4dHVyZXMgKSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gQ29sb3IgYW5kIGRlcHRoIHRleHR1cmUgbXVzdCBiZSByZWJvdW5kIGluIG9yZGVyIGZvciB0aGUgc3dhcGNoYWluIHRvIHVwZGF0ZS5cclxuXHRcdFx0XHRcdHRleHR1cmVzLnJlYmluZFRleHR1cmVzKCByZW5kZXJUYXJnZXQsIHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQudGV4dHVyZSApLl9fd2ViZ2xUZXh0dXJlLCBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSApLl9fd2ViZ2xUZXh0dXJlICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIHJlbmRlclRhcmdldC5kZXB0aEJ1ZmZlciApIHtcclxuXHJcblx0XHRcdFx0XHQvLyBjaGVjayBpZiB0aGUgZGVwdGggdGV4dHVyZSBpcyBhbHJlYWR5IGJvdW5kIHRvIHRoZSBmcmFtZSBidWZmZXIgYW5kIHRoYXQgaXQncyBiZWVuIGluaXRpYWxpemVkXHJcblx0XHRcdFx0XHRjb25zdCBkZXB0aFRleHR1cmUgPSByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlO1xyXG5cdFx0XHRcdFx0aWYgKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fYm91bmREZXB0aFRleHR1cmUgIT09IGRlcHRoVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdC8vIGNoZWNrIGlmIHRoZSBkZXB0aCB0ZXh0dXJlIGlzIGNvbXBhdGlibGVcclxuXHRcdFx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0XHRcdGRlcHRoVGV4dHVyZSAhPT0gbnVsbCAmJlxyXG5cdFx0XHRcdFx0XHRcdHByb3BlcnRpZXMuaGFzKCBkZXB0aFRleHR1cmUgKSAmJlxyXG5cdFx0XHRcdFx0XHRcdCggcmVuZGVyVGFyZ2V0LndpZHRoICE9PSBkZXB0aFRleHR1cmUuaW1hZ2Uud2lkdGggfHwgcmVuZGVyVGFyZ2V0LmhlaWdodCAhPT0gZGVwdGhUZXh0dXJlLmltYWdlLmhlaWdodCApXHJcblx0XHRcdFx0XHRcdCkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdXZWJHTFJlbmRlclRhcmdldDogQXR0YWNoZWQgRGVwdGhUZXh0dXJlIGlzIGluaXRpYWxpemVkIHRvIHRoZSBpbmNvcnJlY3Qgc2l6ZS4nICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBTd2FwIHRoZSBkZXB0aCBidWZmZXIgdG8gdGhlIGN1cnJlbnRseSBhdHRhY2hlZCBvbmVcclxuXHRcdFx0XHRcdFx0dGV4dHVyZXMuc2V0dXBEZXB0aFJlbmRlcmJ1ZmZlciggcmVuZGVyVGFyZ2V0ICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGNvbnN0IHRleHR1cmUgPSByZW5kZXJUYXJnZXQudGV4dHVyZTtcclxuXHJcblx0XHRcdFx0aWYgKCB0ZXh0dXJlLmlzRGF0YTNEVGV4dHVyZSB8fCB0ZXh0dXJlLmlzRGF0YUFycmF5VGV4dHVyZSB8fCB0ZXh0dXJlLmlzQ29tcHJlc3NlZEFycmF5VGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0XHRpc1JlbmRlclRhcmdldDNEID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRjb25zdCBfX3dlYmdsRnJhbWVidWZmZXIgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0ICkuX193ZWJnbEZyYW1lYnVmZmVyO1xyXG5cclxuXHRcdFx0XHRpZiAoIHJlbmRlclRhcmdldC5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldCApIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIF9fd2ViZ2xGcmFtZWJ1ZmZlclsgYWN0aXZlQ3ViZUZhY2UgXSApICkge1xyXG5cclxuXHRcdFx0XHRcdFx0ZnJhbWVidWZmZXIgPSBfX3dlYmdsRnJhbWVidWZmZXJbIGFjdGl2ZUN1YmVGYWNlIF1bIGFjdGl2ZU1pcG1hcExldmVsIF07XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdGZyYW1lYnVmZmVyID0gX193ZWJnbEZyYW1lYnVmZmVyWyBhY3RpdmVDdWJlRmFjZSBdO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRpc0N1YmUgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCAoIHJlbmRlclRhcmdldC5zYW1wbGVzID4gMCApICYmIHRleHR1cmVzLnVzZU11bHRpc2FtcGxlZFJUVCggcmVuZGVyVGFyZ2V0ICkgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0XHRcdGZyYW1lYnVmZmVyID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCApLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlcjtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIF9fd2ViZ2xGcmFtZWJ1ZmZlciApICkge1xyXG5cclxuXHRcdFx0XHRcdFx0ZnJhbWVidWZmZXIgPSBfX3dlYmdsRnJhbWVidWZmZXJbIGFjdGl2ZU1pcG1hcExldmVsIF07XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdGZyYW1lYnVmZmVyID0gX193ZWJnbEZyYW1lYnVmZmVyO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRfY3VycmVudFZpZXdwb3J0LmNvcHkoIHJlbmRlclRhcmdldC52aWV3cG9ydCApO1xyXG5cdFx0XHRcdF9jdXJyZW50U2Npc3Nvci5jb3B5KCByZW5kZXJUYXJnZXQuc2Npc3NvciApO1xyXG5cdFx0XHRcdF9jdXJyZW50U2Npc3NvclRlc3QgPSByZW5kZXJUYXJnZXQuc2Npc3NvclRlc3Q7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRfY3VycmVudFZpZXdwb3J0LmNvcHkoIF92aWV3cG9ydCApLm11bHRpcGx5U2NhbGFyKCBfcGl4ZWxSYXRpbyApLmZsb29yKCk7XHJcblx0XHRcdFx0X2N1cnJlbnRTY2lzc29yLmNvcHkoIF9zY2lzc29yICkubXVsdGlwbHlTY2FsYXIoIF9waXhlbFJhdGlvICkuZmxvb3IoKTtcclxuXHRcdFx0XHRfY3VycmVudFNjaXNzb3JUZXN0ID0gX3NjaXNzb3JUZXN0O1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gVXNlIGEgc2NyYXRjaCBmcmFtZSBidWZmZXIgaWYgcmVuZGVyaW5nIHRvIGEgbWlwIGxldmVsIHRvIGF2b2lkIGRlcHRoIGJ1ZmZlcnNcclxuXHRcdFx0Ly8gYmVpbmcgYm91bmQgdGhhdCBhcmUgZGlmZmVyZW50IHNpemVzLlxyXG5cdFx0XHRpZiAoIGFjdGl2ZU1pcG1hcExldmVsICE9PSAwICkge1xyXG5cclxuXHRcdFx0XHRmcmFtZWJ1ZmZlciA9IF9zY3JhdGNoRnJhbWVCdWZmZXI7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBmcmFtZWJ1ZmZlckJvdW5kID0gc3RhdGUuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIGZyYW1lYnVmZmVyICk7XHJcblxyXG5cdFx0XHRpZiAoIGZyYW1lYnVmZmVyQm91bmQgJiYgdXNlRGVmYXVsdEZyYW1lYnVmZmVyICkge1xyXG5cclxuXHRcdFx0XHRzdGF0ZS5kcmF3QnVmZmVycyggcmVuZGVyVGFyZ2V0LCBmcmFtZWJ1ZmZlciApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0c3RhdGUudmlld3BvcnQoIF9jdXJyZW50Vmlld3BvcnQgKTtcclxuXHRcdFx0c3RhdGUuc2Npc3NvciggX2N1cnJlbnRTY2lzc29yICk7XHJcblx0XHRcdHN0YXRlLnNldFNjaXNzb3JUZXN0KCBfY3VycmVudFNjaXNzb3JUZXN0ICk7XHJcblxyXG5cdFx0XHRpZiAoIGlzQ3ViZSApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LnRleHR1cmUgKTtcclxuXHRcdFx0XHRfZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoIF9nbC5GUkFNRUJVRkZFUiwgX2dsLkNPTE9SX0FUVEFDSE1FTlQwLCBfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgYWN0aXZlQ3ViZUZhY2UsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlLCBhY3RpdmVNaXBtYXBMZXZlbCApO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggaXNSZW5kZXJUYXJnZXQzRCApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LnRleHR1cmUgKTtcclxuXHRcdFx0XHRjb25zdCBsYXllciA9IGFjdGl2ZUN1YmVGYWNlO1xyXG5cdFx0XHRcdF9nbC5mcmFtZWJ1ZmZlclRleHR1cmVMYXllciggX2dsLkZSQU1FQlVGRkVSLCBfZ2wuQ09MT1JfQVRUQUNITUVOVDAsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlLCBhY3RpdmVNaXBtYXBMZXZlbCwgbGF5ZXIgKTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIHJlbmRlclRhcmdldCAhPT0gbnVsbCAmJiBhY3RpdmVNaXBtYXBMZXZlbCAhPT0gMCApIHtcclxuXHJcblx0XHRcdFx0Ly8gT25seSBiaW5kIHRoZSBmcmFtZSBidWZmZXIgaWYgd2UgYXJlIHVzaW5nIGEgc2NyYXRjaCBmcmFtZSBidWZmZXIgdG8gcmVuZGVyIHRvIGEgbWlwbWFwLlxyXG5cdFx0XHRcdC8vIElmIHdlIHJlYmluZCB0aGUgdGV4dHVyZSB3aGVuIHVzaW5nIGEgbXVsdGkgc2FtcGxlIGJ1ZmZlciB0aGVuIGFuIGVycm9yIGFib3V0IGluY29uc2lzdGVudCBzYW1wbGVzIHdpbGwgYmUgdGhyb3duLlxyXG5cdFx0XHRcdGNvbnN0IHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldC50ZXh0dXJlICk7XHJcblx0XHRcdFx0X2dsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKCBfZ2wuRlJBTUVCVUZGRVIsIF9nbC5DT0xPUl9BVFRBQ0hNRU5UMCwgX2dsLlRFWFRVUkVfMkQsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlLCBhY3RpdmVNaXBtYXBMZXZlbCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0X2N1cnJlbnRNYXRlcmlhbElkID0gLSAxOyAvLyByZXNldCBjdXJyZW50IG1hdGVyaWFsIHRvIGVuc3VyZSBjb3JyZWN0IHVuaWZvcm0gYmluZGluZ3NcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVhZHMgdGhlIHBpeGVsIGRhdGEgZnJvbSB0aGUgZ2l2ZW4gcmVuZGVyIHRhcmdldCBpbnRvIHRoZSBnaXZlbiBidWZmZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gcmVuZGVyVGFyZ2V0IC0gVGhlIHJlbmRlciB0YXJnZXQgdG8gcmVhZCBmcm9tLlxyXG5cdFx0ICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgYHhgIGNvb3JkaW5hdGUgb2YgdGhlIGNvcHkgcmVnaW9uJ3Mgb3JpZ2luLlxyXG5cdFx0ICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgYHlgIGNvb3JkaW5hdGUgb2YgdGhlIGNvcHkgcmVnaW9uJ3Mgb3JpZ2luLlxyXG5cdFx0ICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSBjb3B5IHJlZ2lvbi5cclxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSBjb3B5IHJlZ2lvbi5cclxuXHRcdCAqIEBwYXJhbSB7VHlwZWRBcnJheX0gYnVmZmVyIC0gVGhlIHJlc3VsdCBidWZmZXIuXHJcblx0XHQgKiBAcGFyYW0ge251bWJlcn0gW2FjdGl2ZUN1YmVGYWNlSW5kZXhdIC0gVGhlIGFjdGl2ZSBjdWJlIGZhY2UgaW5kZXguXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVhZFJlbmRlclRhcmdldFBpeGVscyA9IGZ1bmN0aW9uICggcmVuZGVyVGFyZ2V0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBidWZmZXIsIGFjdGl2ZUN1YmVGYWNlSW5kZXggKSB7XHJcblxyXG5cdFx0XHRpZiAoICEgKCByZW5kZXJUYXJnZXQgJiYgcmVuZGVyVGFyZ2V0LmlzV2ViR0xSZW5kZXJUYXJnZXQgKSApIHtcclxuXHJcblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVuZGVyVGFyZ2V0IGlzIG5vdCBUSFJFRS5XZWJHTFJlbmRlclRhcmdldC4nICk7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0bGV0IGZyYW1lYnVmZmVyID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCApLl9fd2ViZ2xGcmFtZWJ1ZmZlcjtcclxuXHJcblx0XHRcdGlmICggcmVuZGVyVGFyZ2V0LmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0ICYmIGFjdGl2ZUN1YmVGYWNlSW5kZXggIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0ZnJhbWVidWZmZXIgPSBmcmFtZWJ1ZmZlclsgYWN0aXZlQ3ViZUZhY2VJbmRleCBdO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBmcmFtZWJ1ZmZlciApIHtcclxuXHJcblx0XHRcdFx0c3RhdGUuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIGZyYW1lYnVmZmVyICk7XHJcblxyXG5cdFx0XHRcdHRyeSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgdGV4dHVyZSA9IHJlbmRlclRhcmdldC50ZXh0dXJlO1xyXG5cdFx0XHRcdFx0Y29uc3QgdGV4dHVyZUZvcm1hdCA9IHRleHR1cmUuZm9ybWF0O1xyXG5cdFx0XHRcdFx0Y29uc3QgdGV4dHVyZVR5cGUgPSB0ZXh0dXJlLnR5cGU7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCAhIGNhcGFiaWxpdGllcy50ZXh0dXJlRm9ybWF0UmVhZGFibGUoIHRleHR1cmVGb3JtYXQgKSApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlbmRlclRhcmdldCBpcyBub3QgaW4gUkdCQSBvciBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGZvcm1hdC4nICk7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aWYgKCAhIGNhcGFiaWxpdGllcy50ZXh0dXJlVHlwZVJlYWRhYmxlKCB0ZXh0dXJlVHlwZSApICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVuZGVyVGFyZ2V0IGlzIG5vdCBpbiBVbnNpZ25lZEJ5dGVUeXBlIG9yIGltcGxlbWVudGF0aW9uIGRlZmluZWQgdHlwZS4nICk7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Ly8gdGhlIGZvbGxvd2luZyBpZiBzdGF0ZW1lbnQgZW5zdXJlcyB2YWxpZCByZWFkIHJlcXVlc3RzIChubyBvdXQtb2YtYm91bmRzIHBpeGVscywgc2VlICM4NjA0KVxyXG5cclxuXHRcdFx0XHRcdGlmICggKCB4ID49IDAgJiYgeCA8PSAoIHJlbmRlclRhcmdldC53aWR0aCAtIHdpZHRoICkgKSAmJiAoIHkgPj0gMCAmJiB5IDw9ICggcmVuZGVyVGFyZ2V0LmhlaWdodCAtIGhlaWdodCApICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRfZ2wucmVhZFBpeGVscyggeCwgeSwgd2lkdGgsIGhlaWdodCwgdXRpbHMuY29udmVydCggdGV4dHVyZUZvcm1hdCApLCB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlVHlwZSApLCBidWZmZXIgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH0gZmluYWxseSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gcmVzdG9yZSBmcmFtZWJ1ZmZlciBvZiBjdXJyZW50IHJlbmRlciB0YXJnZXQgaWYgbmVjZXNzYXJ5XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgZnJhbWVidWZmZXIgPSAoIF9jdXJyZW50UmVuZGVyVGFyZ2V0ICE9PSBudWxsICkgPyBwcm9wZXJ0aWVzLmdldCggX2N1cnJlbnRSZW5kZXJUYXJnZXQgKS5fX3dlYmdsRnJhbWVidWZmZXIgOiBudWxsO1xyXG5cdFx0XHRcdFx0c3RhdGUuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIGZyYW1lYnVmZmVyICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQXN5bmNocm9ub3VzLCBub24tYmxvY2tpbmcgdmVyc2lvbiBvZiB7QGxpbmsgV2ViR0xSZW5kZXJlciNyZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzfS5cclxuXHRcdCAqXHJcblx0XHQgKiBJdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgdGhpcyB2ZXJzaW9uIG9mIGByZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzKClgIHdoZW5ldmVyIHBvc3NpYmxlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBhc3luY1xyXG5cdFx0ICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gcmVuZGVyVGFyZ2V0IC0gVGhlIHJlbmRlciB0YXJnZXQgdG8gcmVhZCBmcm9tLlxyXG5cdFx0ICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgYHhgIGNvb3JkaW5hdGUgb2YgdGhlIGNvcHkgcmVnaW9uJ3Mgb3JpZ2luLlxyXG5cdFx0ICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgYHlgIGNvb3JkaW5hdGUgb2YgdGhlIGNvcHkgcmVnaW9uJ3Mgb3JpZ2luLlxyXG5cdFx0ICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSBjb3B5IHJlZ2lvbi5cclxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSBjb3B5IHJlZ2lvbi5cclxuXHRcdCAqIEBwYXJhbSB7VHlwZWRBcnJheX0gYnVmZmVyIC0gVGhlIHJlc3VsdCBidWZmZXIuXHJcblx0XHQgKiBAcGFyYW0ge251bWJlcn0gW2FjdGl2ZUN1YmVGYWNlSW5kZXhdIC0gVGhlIGFjdGl2ZSBjdWJlIGZhY2UgaW5kZXguXHJcblx0XHQgKiBAcmV0dXJuIHtQcm9taXNlPFR5cGVkQXJyYXk+fSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSByZWFkIGhhcyBiZWVuIGZpbmlzaGVkLiBUaGUgcmVzb2x2ZSBwcm92aWRlcyB0aGUgcmVhZCBkYXRhIGFzIGEgdHlwZWQgYXJyYXkuXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVhZFJlbmRlclRhcmdldFBpeGVsc0FzeW5jID0gYXN5bmMgZnVuY3Rpb24gKCByZW5kZXJUYXJnZXQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGJ1ZmZlciwgYWN0aXZlQ3ViZUZhY2VJbmRleCApIHtcclxuXHJcblx0XHRcdGlmICggISAoIHJlbmRlclRhcmdldCAmJiByZW5kZXJUYXJnZXQuaXNXZWJHTFJlbmRlclRhcmdldCApICkge1xyXG5cclxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlbmRlclRhcmdldCBpcyBub3QgVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQuJyApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0bGV0IGZyYW1lYnVmZmVyID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCApLl9fd2ViZ2xGcmFtZWJ1ZmZlcjtcclxuXHRcdFx0aWYgKCByZW5kZXJUYXJnZXQuaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQgJiYgYWN0aXZlQ3ViZUZhY2VJbmRleCAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRmcmFtZWJ1ZmZlciA9IGZyYW1lYnVmZmVyWyBhY3RpdmVDdWJlRmFjZUluZGV4IF07XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIGZyYW1lYnVmZmVyICkge1xyXG5cclxuXHRcdFx0XHQvLyB0aGUgZm9sbG93aW5nIGlmIHN0YXRlbWVudCBlbnN1cmVzIHZhbGlkIHJlYWQgcmVxdWVzdHMgKG5vIG91dC1vZi1ib3VuZHMgcGl4ZWxzLCBzZWUgIzg2MDQpXHJcblx0XHRcdFx0aWYgKCAoIHggPj0gMCAmJiB4IDw9ICggcmVuZGVyVGFyZ2V0LndpZHRoIC0gd2lkdGggKSApICYmICggeSA+PSAwICYmIHkgPD0gKCByZW5kZXJUYXJnZXQuaGVpZ2h0IC0gaGVpZ2h0ICkgKSApIHtcclxuXHJcblx0XHRcdFx0XHQvLyBzZXQgdGhlIGFjdGl2ZSBmcmFtZSBidWZmZXIgdG8gdGhlIG9uZSB3ZSB3YW50IHRvIHJlYWRcclxuXHRcdFx0XHRcdHN0YXRlLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBmcmFtZWJ1ZmZlciApO1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHRleHR1cmUgPSByZW5kZXJUYXJnZXQudGV4dHVyZTtcclxuXHRcdFx0XHRcdGNvbnN0IHRleHR1cmVGb3JtYXQgPSB0ZXh0dXJlLmZvcm1hdDtcclxuXHRcdFx0XHRcdGNvbnN0IHRleHR1cmVUeXBlID0gdGV4dHVyZS50eXBlO1xyXG5cclxuXHRcdFx0XHRcdGlmICggISBjYXBhYmlsaXRpZXMudGV4dHVyZUZvcm1hdFJlYWRhYmxlKCB0ZXh0dXJlRm9ybWF0ICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHNBc3luYzogcmVuZGVyVGFyZ2V0IGlzIG5vdCBpbiBSR0JBIG9yIGltcGxlbWVudGF0aW9uIGRlZmluZWQgZm9ybWF0LicgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aWYgKCAhIGNhcGFiaWxpdGllcy50ZXh0dXJlVHlwZVJlYWRhYmxlKCB0ZXh0dXJlVHlwZSApICkge1xyXG5cclxuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzQXN5bmM6IHJlbmRlclRhcmdldCBpcyBub3QgaW4gVW5zaWduZWRCeXRlVHlwZSBvciBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIHR5cGUuJyApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRjb25zdCBnbEJ1ZmZlciA9IF9nbC5jcmVhdGVCdWZmZXIoKTtcclxuXHRcdFx0XHRcdF9nbC5iaW5kQnVmZmVyKCBfZ2wuUElYRUxfUEFDS19CVUZGRVIsIGdsQnVmZmVyICk7XHJcblx0XHRcdFx0XHRfZ2wuYnVmZmVyRGF0YSggX2dsLlBJWEVMX1BBQ0tfQlVGRkVSLCBidWZmZXIuYnl0ZUxlbmd0aCwgX2dsLlNUUkVBTV9SRUFEICk7XHJcblx0XHRcdFx0XHRfZ2wucmVhZFBpeGVscyggeCwgeSwgd2lkdGgsIGhlaWdodCwgdXRpbHMuY29udmVydCggdGV4dHVyZUZvcm1hdCApLCB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlVHlwZSApLCAwICk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gcmVzZXQgdGhlIGZyYW1lIGJ1ZmZlciB0byB0aGUgY3VycmVudGx5IHNldCBidWZmZXIgYmVmb3JlIHdhaXRpbmdcclxuXHRcdFx0XHRcdGNvbnN0IGN1cnJGcmFtZWJ1ZmZlciA9IF9jdXJyZW50UmVuZGVyVGFyZ2V0ICE9PSBudWxsID8gcHJvcGVydGllcy5nZXQoIF9jdXJyZW50UmVuZGVyVGFyZ2V0ICkuX193ZWJnbEZyYW1lYnVmZmVyIDogbnVsbDtcclxuXHRcdFx0XHRcdHN0YXRlLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBjdXJyRnJhbWVidWZmZXIgKTtcclxuXHJcblx0XHRcdFx0XHQvLyBjaGVjayBpZiB0aGUgY29tbWFuZHMgaGF2ZSBmaW5pc2hlZCBldmVyeSA4IG1zXHJcblx0XHRcdFx0XHRjb25zdCBzeW5jID0gX2dsLmZlbmNlU3luYyggX2dsLlNZTkNfR1BVX0NPTU1BTkRTX0NPTVBMRVRFLCAwICk7XHJcblxyXG5cdFx0XHRcdFx0X2dsLmZsdXNoKCk7XHJcblxyXG5cdFx0XHRcdFx0YXdhaXQgcHJvYmVBc3luYyggX2dsLCBzeW5jLCA0ICk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gcmVhZCB0aGUgZGF0YSBhbmQgZGVsZXRlIHRoZSBidWZmZXJcclxuXHRcdFx0XHRcdF9nbC5iaW5kQnVmZmVyKCBfZ2wuUElYRUxfUEFDS19CVUZGRVIsIGdsQnVmZmVyICk7XHJcblx0XHRcdFx0XHRfZ2wuZ2V0QnVmZmVyU3ViRGF0YSggX2dsLlBJWEVMX1BBQ0tfQlVGRkVSLCAwLCBidWZmZXIgKTtcclxuXHRcdFx0XHRcdF9nbC5kZWxldGVCdWZmZXIoIGdsQnVmZmVyICk7XHJcblx0XHRcdFx0XHRfZ2wuZGVsZXRlU3luYyggc3luYyApO1xyXG5cclxuXHRcdFx0XHRcdHJldHVybiBidWZmZXI7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzQXN5bmM6IHJlcXVlc3RlZCByZWFkIGJvdW5kcyBhcmUgb3V0IG9mIHJhbmdlLicgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDb3BpZXMgcGl4ZWxzIGZyb20gdGhlIGN1cnJlbnQgYm91bmQgZnJhbWVidWZmZXIgaW50byB0aGUgZ2l2ZW4gdGV4dHVyZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge0ZyYW1lYnVmZmVyVGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlLlxyXG5cdFx0ICogQHBhcmFtIHtWZWN0b3IyfSBwb3NpdGlvbiAtIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgY29weSBvcGVyYXRpb24uXHJcblx0XHQgKiBAcGFyYW0ge251bWJlcn0gW2xldmVsPTBdIC0gVGhlIG1pcCBsZXZlbC4gVGhlIGRlZmF1bHQgcmVwcmVzZW50cyB0aGUgYmFzZSBtaXAuXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29weUZyYW1lYnVmZmVyVG9UZXh0dXJlID0gZnVuY3Rpb24gKCB0ZXh0dXJlLCBwb3NpdGlvbiA9IG51bGwsIGxldmVsID0gMCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGxldmVsU2NhbGUgPSBNYXRoLnBvdyggMiwgLSBsZXZlbCApO1xyXG5cdFx0XHRjb25zdCB3aWR0aCA9IE1hdGguZmxvb3IoIHRleHR1cmUuaW1hZ2Uud2lkdGggKiBsZXZlbFNjYWxlICk7XHJcblx0XHRcdGNvbnN0IGhlaWdodCA9IE1hdGguZmxvb3IoIHRleHR1cmUuaW1hZ2UuaGVpZ2h0ICogbGV2ZWxTY2FsZSApO1xyXG5cclxuXHRcdFx0Y29uc3QgeCA9IHBvc2l0aW9uICE9PSBudWxsID8gcG9zaXRpb24ueCA6IDA7XHJcblx0XHRcdGNvbnN0IHkgPSBwb3NpdGlvbiAhPT0gbnVsbCA/IHBvc2l0aW9uLnkgOiAwO1xyXG5cclxuXHRcdFx0dGV4dHVyZXMuc2V0VGV4dHVyZTJEKCB0ZXh0dXJlLCAwICk7XHJcblxyXG5cdFx0XHRfZ2wuY29weVRleFN1YkltYWdlMkQoIF9nbC5URVhUVVJFXzJELCBsZXZlbCwgMCwgMCwgeCwgeSwgd2lkdGgsIGhlaWdodCApO1xyXG5cclxuXHRcdFx0c3RhdGUudW5iaW5kVGV4dHVyZSgpO1xyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0Y29uc3QgX3NyY0ZyYW1lYnVmZmVyID0gX2dsLmNyZWF0ZUZyYW1lYnVmZmVyKCk7XHJcblx0XHRjb25zdCBfZHN0RnJhbWVidWZmZXIgPSBfZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENvcGllcyBkYXRhIG9mIHRoZSBnaXZlbiBzb3VyY2UgdGV4dHVyZSBpbnRvIGEgZGVzdGluYXRpb24gdGV4dHVyZS5cclxuXHRcdCAqXHJcblx0XHQgKiBXaGVuIHVzaW5nIHJlbmRlciB0YXJnZXQgdGV4dHVyZXMgYXMgYHNyY1RleHR1cmVgIGFuZCBgZHN0VGV4dHVyZWAsIHlvdSBtdXN0IG1ha2Ugc3VyZSBib3RoIHJlbmRlciB0YXJnZXRzIGFyZSBpbml0aWFsaXplZFxyXG5cdFx0ICoge0BsaW5rIFdlYkdMUmVuZGVyZXIjaW5pdFJlbmRlclRhcmdldH0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtUZXh0dXJlfSBzcmNUZXh0dXJlIC0gVGhlIHNvdXJjZSB0ZXh0dXJlLlxyXG5cdFx0ICogQHBhcmFtIHtUZXh0dXJlfSBkc3RUZXh0dXJlIC0gVGhlIGRlc3RpbmF0aW9uIHRleHR1cmUuXHJcblx0XHQgKiBAcGFyYW0ge0JveDJ8Qm94M30gW3NyY1JlZ2lvbj1udWxsXSAtIEEgYm91bmRpbmcgYm94IHdoaWNoIGRlc2NyaWJlcyB0aGUgc291cmNlIHJlZ2lvbi4gQ2FuIGJlIHR3byBvciB0aHJlZS1kaW1lbnNpb25hbC5cclxuXHRcdCAqIEBwYXJhbSB7VmVjdG9yMnxWZWN0b3IzfSBbZHN0UG9zaXRpb249bnVsbF0gLSBBIHZlY3RvciB0aGF0IHJlcHJlc2VudHMgdGhlIG9yaWdpbiBvZiB0aGUgZGVzdGluYXRpb24gcmVnaW9uLiBDYW4gYmUgdHdvIG9yIHRocmVlLWRpbWVuc2lvbmFsLlxyXG5cdFx0ICogQHBhcmFtIHtudW1iZXJ9IHNyY0xldmVsIC0gVGhlIHNvdXJjZSBtaXBtYXAgbGV2ZWwgdG8gY29weS5cclxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyfSBkc3RMZXZlbCAtIFRoZSBkZXN0aW5hdGlvbiBtaXBtYXAgbGV2ZWwuXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29weVRleHR1cmVUb1RleHR1cmUgPSBmdW5jdGlvbiAoIHNyY1RleHR1cmUsIGRzdFRleHR1cmUsIHNyY1JlZ2lvbiA9IG51bGwsIGRzdFBvc2l0aW9uID0gbnVsbCwgc3JjTGV2ZWwgPSAwLCBkc3RMZXZlbCA9IG51bGwgKSB7XHJcblxyXG5cdFx0XHQvLyBzdXBwb3J0IHRoZSBwcmV2aW91cyBzaWduYXR1cmUgd2l0aCBqdXN0IGEgc2luZ2xlIGRzdCBtaXBtYXAgbGV2ZWxcclxuXHRcdFx0aWYgKCBkc3RMZXZlbCA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBzcmNMZXZlbCAhPT0gMCApIHtcclxuXHJcblx0XHRcdFx0XHQvLyBAZGVwcmVjYXRlZCwgcjE3MVxyXG5cdFx0XHRcdFx0d2Fybk9uY2UoICdXZWJHTFJlbmRlcmVyOiBjb3B5VGV4dHVyZVRvVGV4dHVyZSBmdW5jdGlvbiBzaWduYXR1cmUgaGFzIGNoYW5nZWQgdG8gc3VwcG9ydCBzcmMgYW5kIGRzdCBtaXBtYXAgbGV2ZWxzLicgKTtcclxuXHRcdFx0XHRcdGRzdExldmVsID0gc3JjTGV2ZWw7XHJcblx0XHRcdFx0XHRzcmNMZXZlbCA9IDA7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0ZHN0TGV2ZWwgPSAwO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBnYXRoZXIgdGhlIG5lY2Vzc2FyeSBkaW1lbnNpb25zIHRvIGNvcHlcclxuXHRcdFx0bGV0IHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBtaW5YLCBtaW5ZLCBtaW5aO1xyXG5cdFx0XHRsZXQgZHN0WCwgZHN0WSwgZHN0WjtcclxuXHRcdFx0Y29uc3QgaW1hZ2UgPSBzcmNUZXh0dXJlLmlzQ29tcHJlc3NlZFRleHR1cmUgPyBzcmNUZXh0dXJlLm1pcG1hcHNbIGRzdExldmVsIF0gOiBzcmNUZXh0dXJlLmltYWdlO1xyXG5cdFx0XHRpZiAoIHNyY1JlZ2lvbiAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0d2lkdGggPSBzcmNSZWdpb24ubWF4LnggLSBzcmNSZWdpb24ubWluLng7XHJcblx0XHRcdFx0aGVpZ2h0ID0gc3JjUmVnaW9uLm1heC55IC0gc3JjUmVnaW9uLm1pbi55O1xyXG5cdFx0XHRcdGRlcHRoID0gc3JjUmVnaW9uLmlzQm94MyA/IHNyY1JlZ2lvbi5tYXgueiAtIHNyY1JlZ2lvbi5taW4ueiA6IDE7XHJcblx0XHRcdFx0bWluWCA9IHNyY1JlZ2lvbi5taW4ueDtcclxuXHRcdFx0XHRtaW5ZID0gc3JjUmVnaW9uLm1pbi55O1xyXG5cdFx0XHRcdG1pblogPSBzcmNSZWdpb24uaXNCb3gzID8gc3JjUmVnaW9uLm1pbi56IDogMDtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGxldmVsU2NhbGUgPSBNYXRoLnBvdyggMiwgLSBzcmNMZXZlbCApO1xyXG5cdFx0XHRcdHdpZHRoID0gTWF0aC5mbG9vciggaW1hZ2Uud2lkdGggKiBsZXZlbFNjYWxlICk7XHJcblx0XHRcdFx0aGVpZ2h0ID0gTWF0aC5mbG9vciggaW1hZ2UuaGVpZ2h0ICogbGV2ZWxTY2FsZSApO1xyXG5cdFx0XHRcdGlmICggc3JjVGV4dHVyZS5pc0RhdGFBcnJheVRleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRcdFx0ZGVwdGggPSBpbWFnZS5kZXB0aDtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggc3JjVGV4dHVyZS5pc0RhdGEzRFRleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRcdFx0ZGVwdGggPSBNYXRoLmZsb29yKCBpbWFnZS5kZXB0aCAqIGxldmVsU2NhbGUgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRkZXB0aCA9IDE7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0bWluWCA9IDA7XHJcblx0XHRcdFx0bWluWSA9IDA7XHJcblx0XHRcdFx0bWluWiA9IDA7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIGRzdFBvc2l0aW9uICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRkc3RYID0gZHN0UG9zaXRpb24ueDtcclxuXHRcdFx0XHRkc3RZID0gZHN0UG9zaXRpb24ueTtcclxuXHRcdFx0XHRkc3RaID0gZHN0UG9zaXRpb24uejtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGRzdFggPSAwO1xyXG5cdFx0XHRcdGRzdFkgPSAwO1xyXG5cdFx0XHRcdGRzdFogPSAwO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gU2V0IHVwIHRoZSBkZXN0aW5hdGlvbiB0YXJnZXRcclxuXHRcdFx0Y29uc3QgZ2xGb3JtYXQgPSB1dGlscy5jb252ZXJ0KCBkc3RUZXh0dXJlLmZvcm1hdCApO1xyXG5cdFx0XHRjb25zdCBnbFR5cGUgPSB1dGlscy5jb252ZXJ0KCBkc3RUZXh0dXJlLnR5cGUgKTtcclxuXHRcdFx0bGV0IGdsVGFyZ2V0O1xyXG5cclxuXHRcdFx0aWYgKCBkc3RUZXh0dXJlLmlzRGF0YTNEVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0dGV4dHVyZXMuc2V0VGV4dHVyZTNEKCBkc3RUZXh0dXJlLCAwICk7XHJcblx0XHRcdFx0Z2xUYXJnZXQgPSBfZ2wuVEVYVFVSRV8zRDtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGRzdFRleHR1cmUuaXNEYXRhQXJyYXlUZXh0dXJlIHx8IGRzdFRleHR1cmUuaXNDb21wcmVzc2VkQXJyYXlUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0XHR0ZXh0dXJlcy5zZXRUZXh0dXJlMkRBcnJheSggZHN0VGV4dHVyZSwgMCApO1xyXG5cdFx0XHRcdGdsVGFyZ2V0ID0gX2dsLlRFWFRVUkVfMkRfQVJSQVk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHR0ZXh0dXJlcy5zZXRUZXh0dXJlMkQoIGRzdFRleHR1cmUsIDAgKTtcclxuXHRcdFx0XHRnbFRhcmdldCA9IF9nbC5URVhUVVJFXzJEO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0X2dsLnBpeGVsU3RvcmVpKCBfZ2wuVU5QQUNLX0ZMSVBfWV9XRUJHTCwgZHN0VGV4dHVyZS5mbGlwWSApO1xyXG5cdFx0XHRfZ2wucGl4ZWxTdG9yZWkoIF9nbC5VTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wsIGRzdFRleHR1cmUucHJlbXVsdGlwbHlBbHBoYSApO1xyXG5cdFx0XHRfZ2wucGl4ZWxTdG9yZWkoIF9nbC5VTlBBQ0tfQUxJR05NRU5ULCBkc3RUZXh0dXJlLnVucGFja0FsaWdubWVudCApO1xyXG5cclxuXHRcdFx0Ly8gdXNlZCBmb3IgY29weWluZyBkYXRhIGZyb20gY3B1XHJcblx0XHRcdGNvbnN0IGN1cnJlbnRVbnBhY2tSb3dMZW4gPSBfZ2wuZ2V0UGFyYW1ldGVyKCBfZ2wuVU5QQUNLX1JPV19MRU5HVEggKTtcclxuXHRcdFx0Y29uc3QgY3VycmVudFVucGFja0ltYWdlSGVpZ2h0ID0gX2dsLmdldFBhcmFtZXRlciggX2dsLlVOUEFDS19JTUFHRV9IRUlHSFQgKTtcclxuXHRcdFx0Y29uc3QgY3VycmVudFVucGFja1NraXBQaXhlbHMgPSBfZ2wuZ2V0UGFyYW1ldGVyKCBfZ2wuVU5QQUNLX1NLSVBfUElYRUxTICk7XHJcblx0XHRcdGNvbnN0IGN1cnJlbnRVbnBhY2tTa2lwUm93cyA9IF9nbC5nZXRQYXJhbWV0ZXIoIF9nbC5VTlBBQ0tfU0tJUF9ST1dTICk7XHJcblx0XHRcdGNvbnN0IGN1cnJlbnRVbnBhY2tTa2lwSW1hZ2VzID0gX2dsLmdldFBhcmFtZXRlciggX2dsLlVOUEFDS19TS0lQX0lNQUdFUyApO1xyXG5cclxuXHRcdFx0X2dsLnBpeGVsU3RvcmVpKCBfZ2wuVU5QQUNLX1JPV19MRU5HVEgsIGltYWdlLndpZHRoICk7XHJcblx0XHRcdF9nbC5waXhlbFN0b3JlaSggX2dsLlVOUEFDS19JTUFHRV9IRUlHSFQsIGltYWdlLmhlaWdodCApO1xyXG5cdFx0XHRfZ2wucGl4ZWxTdG9yZWkoIF9nbC5VTlBBQ0tfU0tJUF9QSVhFTFMsIG1pblggKTtcclxuXHRcdFx0X2dsLnBpeGVsU3RvcmVpKCBfZ2wuVU5QQUNLX1NLSVBfUk9XUywgbWluWSApO1xyXG5cdFx0XHRfZ2wucGl4ZWxTdG9yZWkoIF9nbC5VTlBBQ0tfU0tJUF9JTUFHRVMsIG1pblogKTtcclxuXHJcblx0XHRcdC8vIHNldCB1cCB0aGUgc3JjIHRleHR1cmVcclxuXHRcdFx0Y29uc3QgaXNTcmMzRCA9IHNyY1RleHR1cmUuaXNEYXRhQXJyYXlUZXh0dXJlIHx8IHNyY1RleHR1cmUuaXNEYXRhM0RUZXh0dXJlO1xyXG5cdFx0XHRjb25zdCBpc0RzdDNEID0gZHN0VGV4dHVyZS5pc0RhdGFBcnJheVRleHR1cmUgfHwgZHN0VGV4dHVyZS5pc0RhdGEzRFRleHR1cmU7XHJcblx0XHRcdGlmICggc3JjVGV4dHVyZS5pc0RlcHRoVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0Y29uc3Qgc3JjVGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggc3JjVGV4dHVyZSApO1xyXG5cdFx0XHRcdGNvbnN0IGRzdFRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIGRzdFRleHR1cmUgKTtcclxuXHRcdFx0XHRjb25zdCBzcmNSZW5kZXJUYXJnZXRQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHNyY1RleHR1cmVQcm9wZXJ0aWVzLl9fcmVuZGVyVGFyZ2V0ICk7XHJcblx0XHRcdFx0Y29uc3QgZHN0UmVuZGVyVGFyZ2V0UHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCBkc3RUZXh0dXJlUHJvcGVydGllcy5fX3JlbmRlclRhcmdldCApO1xyXG5cdFx0XHRcdHN0YXRlLmJpbmRGcmFtZWJ1ZmZlciggX2dsLlJFQURfRlJBTUVCVUZGRVIsIHNyY1JlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyICk7XHJcblx0XHRcdFx0c3RhdGUuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRFJBV19GUkFNRUJVRkZFUiwgZHN0UmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXIgKTtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgZGVwdGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gaWYgdGhlIHNvdXJjZSBvciBkZXN0aW5hdGlvbiBhcmUgYSAzZCB0YXJnZXQgdGhlbiBhIGxheWVyIG5lZWRzIHRvIGJlIGJvdW5kXHJcblx0XHRcdFx0XHRpZiAoIGlzU3JjM0QgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRfZ2wuZnJhbWVidWZmZXJUZXh0dXJlTGF5ZXIoIF9nbC5SRUFEX0ZSQU1FQlVGRkVSLCBfZ2wuQ09MT1JfQVRUQUNITUVOVDAsIHByb3BlcnRpZXMuZ2V0KCBzcmNUZXh0dXJlICkuX193ZWJnbFRleHR1cmUsIHNyY0xldmVsLCBtaW5aICsgaSApO1xyXG5cdFx0XHRcdFx0XHRfZ2wuZnJhbWVidWZmZXJUZXh0dXJlTGF5ZXIoIF9nbC5EUkFXX0ZSQU1FQlVGRkVSLCBfZ2wuQ09MT1JfQVRUQUNITUVOVDAsIHByb3BlcnRpZXMuZ2V0KCBkc3RUZXh0dXJlICkuX193ZWJnbFRleHR1cmUsIGRzdExldmVsLCBkc3RaICsgaSApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRfZ2wuYmxpdEZyYW1lYnVmZmVyKCBtaW5YLCBtaW5ZLCB3aWR0aCwgaGVpZ2h0LCBkc3RYLCBkc3RZLCB3aWR0aCwgaGVpZ2h0LCBfZ2wuREVQVEhfQlVGRkVSX0JJVCwgX2dsLk5FQVJFU1QgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRzdGF0ZS5iaW5kRnJhbWVidWZmZXIoIF9nbC5SRUFEX0ZSQU1FQlVGRkVSLCBudWxsICk7XHJcblx0XHRcdFx0c3RhdGUuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRFJBV19GUkFNRUJVRkZFUiwgbnVsbCApO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggc3JjTGV2ZWwgIT09IDAgfHwgc3JjVGV4dHVyZS5pc1JlbmRlclRhcmdldFRleHR1cmUgfHwgcHJvcGVydGllcy5oYXMoIHNyY1RleHR1cmUgKSApIHtcclxuXHJcblx0XHRcdFx0Ly8gZ2V0IHRoZSBhcHByb3ByaWF0ZSBmcmFtZSBidWZmZXJzXHJcblx0XHRcdFx0Y29uc3Qgc3JjVGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggc3JjVGV4dHVyZSApO1xyXG5cdFx0XHRcdGNvbnN0IGRzdFRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIGRzdFRleHR1cmUgKTtcclxuXHJcblx0XHRcdFx0Ly8gYmluZCB0aGUgZnJhbWUgYnVmZmVyIHRhcmdldHNcclxuXHRcdFx0XHRzdGF0ZS5iaW5kRnJhbWVidWZmZXIoIF9nbC5SRUFEX0ZSQU1FQlVGRkVSLCBfc3JjRnJhbWVidWZmZXIgKTtcclxuXHRcdFx0XHRzdGF0ZS5iaW5kRnJhbWVidWZmZXIoIF9nbC5EUkFXX0ZSQU1FQlVGRkVSLCBfZHN0RnJhbWVidWZmZXIgKTtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgZGVwdGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gYXNzaWduIHRoZSBjb3JyZWN0IGxheWVycyBhbmQgbWlwIG1hcHMgdG8gdGhlIGZyYW1lIGJ1ZmZlcnNcclxuXHRcdFx0XHRcdGlmICggaXNTcmMzRCApIHtcclxuXHJcblx0XHRcdFx0XHRcdF9nbC5mcmFtZWJ1ZmZlclRleHR1cmVMYXllciggX2dsLlJFQURfRlJBTUVCVUZGRVIsIF9nbC5DT0xPUl9BVFRBQ0hNRU5UMCwgc3JjVGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUsIHNyY0xldmVsLCBtaW5aICsgaSApO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRfZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoIF9nbC5SRUFEX0ZSQU1FQlVGRkVSLCBfZ2wuQ09MT1JfQVRUQUNITUVOVDAsIF9nbC5URVhUVVJFXzJELCBzcmNUZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSwgc3JjTGV2ZWwgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBpc0RzdDNEICkge1xyXG5cclxuXHRcdFx0XHRcdFx0X2dsLmZyYW1lYnVmZmVyVGV4dHVyZUxheWVyKCBfZ2wuRFJBV19GUkFNRUJVRkZFUiwgX2dsLkNPTE9SX0FUVEFDSE1FTlQwLCBkc3RUZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSwgZHN0TGV2ZWwsIGRzdFogKyBpICk7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdF9nbC5mcmFtZWJ1ZmZlclRleHR1cmUyRCggX2dsLkRSQVdfRlJBTUVCVUZGRVIsIF9nbC5DT0xPUl9BVFRBQ0hNRU5UMCwgX2dsLlRFWFRVUkVfMkQsIGRzdFRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlLCBkc3RMZXZlbCApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvLyBjb3B5IHRoZSBkYXRhIHVzaW5nIHRoZSBmYXN0ZXN0IGZ1bmN0aW9uIHRoYXQgY2FuIGFjaGlldmUgdGhlIGNvcHlcclxuXHRcdFx0XHRcdGlmICggc3JjTGV2ZWwgIT09IDAgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRfZ2wuYmxpdEZyYW1lYnVmZmVyKCBtaW5YLCBtaW5ZLCB3aWR0aCwgaGVpZ2h0LCBkc3RYLCBkc3RZLCB3aWR0aCwgaGVpZ2h0LCBfZ2wuQ09MT1JfQlVGRkVSX0JJVCwgX2dsLk5FQVJFU1QgKTtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKCBpc0RzdDNEICkge1xyXG5cclxuXHRcdFx0XHRcdFx0X2dsLmNvcHlUZXhTdWJJbWFnZTNEKCBnbFRhcmdldCwgZHN0TGV2ZWwsIGRzdFgsIGRzdFksIGRzdFogKyBpLCBtaW5YLCBtaW5ZLCB3aWR0aCwgaGVpZ2h0ICk7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdF9nbC5jb3B5VGV4U3ViSW1hZ2UyRCggZ2xUYXJnZXQsIGRzdExldmVsLCBkc3RYLCBkc3RZLCBtaW5YLCBtaW5ZLCB3aWR0aCwgaGVpZ2h0ICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8vIHVuYmluZCByZWFkLCBkcmF3IGJ1ZmZlcnNcclxuXHRcdFx0XHRzdGF0ZS5iaW5kRnJhbWVidWZmZXIoIF9nbC5SRUFEX0ZSQU1FQlVGRkVSLCBudWxsICk7XHJcblx0XHRcdFx0c3RhdGUuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRFJBV19GUkFNRUJVRkZFUiwgbnVsbCApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0aWYgKCBpc0RzdDNEICkge1xyXG5cclxuXHRcdFx0XHRcdC8vIGNvcHkgZGF0YSBpbnRvIHRoZSAzZCB0ZXh0dXJlXHJcblx0XHRcdFx0XHRpZiAoIHNyY1RleHR1cmUuaXNEYXRhVGV4dHVyZSB8fCBzcmNUZXh0dXJlLmlzRGF0YTNEVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdF9nbC50ZXhTdWJJbWFnZTNEKCBnbFRhcmdldCwgZHN0TGV2ZWwsIGRzdFgsIGRzdFksIGRzdFosIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBnbEZvcm1hdCwgZ2xUeXBlLCBpbWFnZS5kYXRhICk7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIGlmICggZHN0VGV4dHVyZS5pc0NvbXByZXNzZWRBcnJheVRleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRfZ2wuY29tcHJlc3NlZFRleFN1YkltYWdlM0QoIGdsVGFyZ2V0LCBkc3RMZXZlbCwgZHN0WCwgZHN0WSwgZHN0Wiwgd2lkdGgsIGhlaWdodCwgZGVwdGgsIGdsRm9ybWF0LCBpbWFnZS5kYXRhICk7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdF9nbC50ZXhTdWJJbWFnZTNEKCBnbFRhcmdldCwgZHN0TGV2ZWwsIGRzdFgsIGRzdFksIGRzdFosIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBnbEZvcm1hdCwgZ2xUeXBlLCBpbWFnZSApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHQvLyBjb3B5IGRhdGEgaW50byB0aGUgMmQgdGV4dHVyZVxyXG5cdFx0XHRcdFx0aWYgKCBzcmNUZXh0dXJlLmlzRGF0YVRleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRfZ2wudGV4U3ViSW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIGRzdExldmVsLCBkc3RYLCBkc3RZLCB3aWR0aCwgaGVpZ2h0LCBnbEZvcm1hdCwgZ2xUeXBlLCBpbWFnZS5kYXRhICk7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIGlmICggc3JjVGV4dHVyZS5pc0NvbXByZXNzZWRUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0X2dsLmNvbXByZXNzZWRUZXhTdWJJbWFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgZHN0TGV2ZWwsIGRzdFgsIGRzdFksIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQsIGdsRm9ybWF0LCBpbWFnZS5kYXRhICk7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdF9nbC50ZXhTdWJJbWFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgZHN0TGV2ZWwsIGRzdFgsIGRzdFksIHdpZHRoLCBoZWlnaHQsIGdsRm9ybWF0LCBnbFR5cGUsIGltYWdlICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyByZXNldCB2YWx1ZXNcclxuXHRcdFx0X2dsLnBpeGVsU3RvcmVpKCBfZ2wuVU5QQUNLX1JPV19MRU5HVEgsIGN1cnJlbnRVbnBhY2tSb3dMZW4gKTtcclxuXHRcdFx0X2dsLnBpeGVsU3RvcmVpKCBfZ2wuVU5QQUNLX0lNQUdFX0hFSUdIVCwgY3VycmVudFVucGFja0ltYWdlSGVpZ2h0ICk7XHJcblx0XHRcdF9nbC5waXhlbFN0b3JlaSggX2dsLlVOUEFDS19TS0lQX1BJWEVMUywgY3VycmVudFVucGFja1NraXBQaXhlbHMgKTtcclxuXHRcdFx0X2dsLnBpeGVsU3RvcmVpKCBfZ2wuVU5QQUNLX1NLSVBfUk9XUywgY3VycmVudFVucGFja1NraXBSb3dzICk7XHJcblx0XHRcdF9nbC5waXhlbFN0b3JlaSggX2dsLlVOUEFDS19TS0lQX0lNQUdFUywgY3VycmVudFVucGFja1NraXBJbWFnZXMgKTtcclxuXHJcblx0XHRcdC8vIEdlbmVyYXRlIG1pcG1hcHMgb25seSB3aGVuIGNvcHlpbmcgbGV2ZWwgMFxyXG5cdFx0XHRpZiAoIGRzdExldmVsID09PSAwICYmIGRzdFRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzICkge1xyXG5cclxuXHRcdFx0XHRfZ2wuZ2VuZXJhdGVNaXBtYXAoIGdsVGFyZ2V0ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRzdGF0ZS51bmJpbmRUZXh0dXJlKCk7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHR0aGlzLmNvcHlUZXh0dXJlVG9UZXh0dXJlM0QgPSBmdW5jdGlvbiAoIHNyY1RleHR1cmUsIGRzdFRleHR1cmUsIHNyY1JlZ2lvbiA9IG51bGwsIGRzdFBvc2l0aW9uID0gbnVsbCwgbGV2ZWwgPSAwICkge1xyXG5cclxuXHRcdFx0Ly8gQGRlcHJlY2F0ZWQsIHIxNzBcclxuXHRcdFx0d2Fybk9uY2UoICdXZWJHTFJlbmRlcmVyOiBjb3B5VGV4dHVyZVRvVGV4dHVyZTNEIGZ1bmN0aW9uIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBcImNvcHlUZXh0dXJlVG9UZXh0dXJlXCIgaW5zdGVhZC4nICk7XHJcblxyXG5cdFx0XHRyZXR1cm4gdGhpcy5jb3B5VGV4dHVyZVRvVGV4dHVyZSggc3JjVGV4dHVyZSwgZHN0VGV4dHVyZSwgc3JjUmVnaW9uLCBkc3RQb3NpdGlvbiwgbGV2ZWwgKTtcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSW5pdGlhbGl6ZXMgdGhlIGdpdmVuIFdlYkdMUmVuZGVyVGFyZ2V0IG1lbW9yeS4gVXNlZnVsIGZvciBpbml0aWFsaXppbmcgYSByZW5kZXIgdGFyZ2V0IHNvIGRhdGFcclxuXHRcdCAqIGNhbiBiZSBjb3BpZWQgaW50byBpdCB1c2luZyB7QGxpbmsgV2ViR0xSZW5kZXJlciNjb3B5VGV4dHVyZVRvVGV4dHVyZX0gYmVmb3JlIGl0IGhhcyBiZWVuXHJcblx0XHQgKiByZW5kZXJlZCB0by5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSB0YXJnZXQgLSBUaGUgcmVuZGVyIHRhcmdldC5cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pbml0UmVuZGVyVGFyZ2V0ID0gZnVuY3Rpb24gKCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHByb3BlcnRpZXMuZ2V0KCB0YXJnZXQgKS5fX3dlYmdsRnJhbWVidWZmZXIgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0dGV4dHVyZXMuc2V0dXBSZW5kZXJUYXJnZXQoIHRhcmdldCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBJbml0aWFsaXplcyB0aGUgZ2l2ZW4gdGV4dHVyZS4gVXNlZnVsIGZvciBwcmVsb2FkaW5nIGEgdGV4dHVyZSByYXRoZXIgdGhhbiB3YWl0aW5nIHVudGlsIGZpcnN0XHJcblx0XHQgKiByZW5kZXIgKHdoaWNoIGNhbiBjYXVzZSBub3RpY2VhYmxlIGxhZ3MgZHVlIHRvIGRlY29kZSBhbmQgR1BVIHVwbG9hZCBvdmVyaGVhZCkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUuXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaW5pdFRleHR1cmUgPSBmdW5jdGlvbiAoIHRleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHRleHR1cmUuaXNDdWJlVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0dGV4dHVyZXMuc2V0VGV4dHVyZUN1YmUoIHRleHR1cmUsIDAgKTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIHRleHR1cmUuaXNEYXRhM0RUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0XHR0ZXh0dXJlcy5zZXRUZXh0dXJlM0QoIHRleHR1cmUsIDAgKTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIHRleHR1cmUuaXNEYXRhQXJyYXlUZXh0dXJlIHx8IHRleHR1cmUuaXNDb21wcmVzc2VkQXJyYXlUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0XHR0ZXh0dXJlcy5zZXRUZXh0dXJlMkRBcnJheSggdGV4dHVyZSwgMCApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0dGV4dHVyZXMuc2V0VGV4dHVyZTJEKCB0ZXh0dXJlLCAwICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRzdGF0ZS51bmJpbmRUZXh0dXJlKCk7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENhbiBiZSB1c2VkIHRvIHJlc2V0IHRoZSBpbnRlcm5hbCBXZWJHTCBzdGF0ZS4gVGhpcyBtZXRob2QgaXMgbW9zdGx5XHJcblx0XHQgKiByZWxldmFudCBmb3IgYXBwbGljYXRpb25zIHdoaWNoIHNoYXJlIGEgc2luZ2xlIFdlYkdMIGNvbnRleHQgYWNyb3NzXHJcblx0XHQgKiBtdWx0aXBsZSBXZWJHTCBsaWJyYXJpZXMuXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVzZXRTdGF0ZSA9IGZ1bmN0aW9uICgpIHtcclxuXHJcblx0XHRcdF9jdXJyZW50QWN0aXZlQ3ViZUZhY2UgPSAwO1xyXG5cdFx0XHRfY3VycmVudEFjdGl2ZU1pcG1hcExldmVsID0gMDtcclxuXHRcdFx0X2N1cnJlbnRSZW5kZXJUYXJnZXQgPSBudWxsO1xyXG5cclxuXHRcdFx0c3RhdGUucmVzZXQoKTtcclxuXHRcdFx0YmluZGluZ1N0YXRlcy5yZXNldCgpO1xyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0aWYgKCB0eXBlb2YgX19USFJFRV9ERVZUT09MU19fICE9PSAndW5kZWZpbmVkJyApIHtcclxuXHJcblx0XHRcdF9fVEhSRUVfREVWVE9PTFNfXy5kaXNwYXRjaEV2ZW50KCBuZXcgQ3VzdG9tRXZlbnQoICdvYnNlcnZlJywgeyBkZXRhaWw6IHRoaXMgfSApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgdGhlIGNvb3JkaW5hdGUgc3lzdGVtIG9mIHRoZSByZW5kZXJlci5cclxuXHQgKlxyXG5cdCAqIEluIGBXZWJHTFJlbmRlcmVyYCwgdGhlIHZhbHVlIGlzIGFsd2F5cyBgV2ViR0xDb29yZGluYXRlU3lzdGVtYC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtXZWJHTENvb3JkaW5hdGVTeXN0ZW18V2ViR1BVQ29vcmRpbmF0ZVN5c3RlbX1cclxuXHQgKiBAZGVmYXVsdCBXZWJHTENvb3JkaW5hdGVTeXN0ZW1cclxuXHQgKiBAcmVhZG9ubHlcclxuXHQgKi9cclxuXHRnZXQgY29vcmRpbmF0ZVN5c3RlbSgpIHtcclxuXHJcblx0XHRyZXR1cm4gV2ViR0xDb29yZGluYXRlU3lzdGVtO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgdGhlIG91dHB1dCBjb2xvciBzcGFjZSBvZiB0aGUgcmVuZGVyZXIuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7U1JHQkNvbG9yU3BhY2V8TGluZWFyU1JHQkNvbG9yU3BhY2V9XHJcblx0ICogQGRlZmF1bHQgU1JHQkNvbG9yU3BhY2VcclxuXHQgKi9cclxuXHRnZXQgb3V0cHV0Q29sb3JTcGFjZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fb3V0cHV0Q29sb3JTcGFjZTtcclxuXHJcblx0fVxyXG5cclxuXHRzZXQgb3V0cHV0Q29sb3JTcGFjZSggY29sb3JTcGFjZSApIHtcclxuXHJcblx0XHR0aGlzLl9vdXRwdXRDb2xvclNwYWNlID0gY29sb3JTcGFjZTtcclxuXHJcblx0XHRjb25zdCBnbCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xyXG5cdFx0Z2wuZHJhd2luZ0J1ZmZlckNvbG9yU3BhY2UgPSBDb2xvck1hbmFnZW1lbnQuX2dldERyYXdpbmdCdWZmZXJDb2xvclNwYWNlKCBjb2xvclNwYWNlICk7XHJcblx0XHRnbC51bnBhY2tDb2xvclNwYWNlID0gQ29sb3JNYW5hZ2VtZW50Ll9nZXRVbnBhY2tDb2xvclNwYWNlKCk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8vIEpTRG9jXHJcblxyXG4vKipcclxuICogV2ViR0xSZW5kZXJlciBvcHRpb25zLlxyXG4gKlxyXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBXZWJHTFJlbmRlcmVyfk9wdGlvbnNcclxuICogQHByb3BlcnR5IHtET01FbGVtZW50fSBbY2FudmFzPW51bGxdIC0gQSBjYW52YXMgZWxlbWVudCB3aGVyZSB0aGUgcmVuZGVyZXIgZHJhd3MgaXRzIG91dHB1dC4gSWYgbm90IHBhc3NlZCBpbiBoZXJlLCBhIG5ldyBjYW52YXMgZWxlbWVudCB3aWxsIGJlIGNyZWF0ZWQgYnkgdGhlIHJlbmRlcmVyLlxyXG4gKiBAcHJvcGVydHkge1dlYkdMMlJlbmRlcmluZ0NvbnRleHR9IFtjb250ZXh0PW51bGxdIC0gQ2FuIGJlIHVzZWQgdG8gYXR0YWNoIGFuIGV4aXN0aW5nIHJlbmRlcmluZyBjb250ZXh0IHRvIHRoaXMgcmVuZGVyZXIuXHJcbiAqIEBwcm9wZXJ0eSB7KCdoaWdocCd8J21lZGl1bXAnfCdsb3dwJyl9IFtwcmVjaXNpb249J2hpZ2hwJ10gLSBUaGUgZGVmYXVsdCBzaGFkZXIgcHJlY2lzaW9uLiBVc2VzIGBoaWdocGAgaWYgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UuXHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2FscGhhPWZhbHNlXSAtIENvbnRyb2xzIHRoZSBkZWZhdWx0IGNsZWFyIGFscGhhIHZhbHVlLiBXaGVuIHNldCB0b2B0cnVlYCwgdGhlIHZhbHVlIGlzIGAwYC4gT3RoZXJ3aXNlIGl0J3MgYDFgLlxyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtwcmVtdWx0aXBsaWVkQWxwaGE9dHJ1ZV0gV2hldGhlciB0aGUgcmVuZGVyZXIgd2lsbCBhc3N1bWUgY29sb3JzIGhhdmUgcHJlbXVsdGlwbGllZCBhbHBoYSBvciBub3QuXHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2FudGlhbGlhcz1mYWxzZV0gV2hldGhlciB0byB1c2UgdGhlIGRlZmF1bHQgTVNBQSBvciBub3QuXHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3N0ZW5jaWw9ZmFsc2VdIFdoZXRoZXIgdGhlIGRyYXdpbmcgYnVmZmVyIGhhcyBhIHN0ZW5jaWwgYnVmZmVyIG9mIGF0IGxlYXN0IDggYml0cyBvciBub3QuXHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3ByZXNlcnZlRHJhd2luZ0J1ZmZlcj1mYWxzZV0gV2hldGhlciB0byBwcmVzZXJ2ZSB0aGUgYnVmZmVyIHVudGlsIG1hbnVhbGx5IGNsZWFyZWQgb3Igb3ZlcndyaXR0ZW4uXHJcbiAqIEBwcm9wZXJ0eSB7KCdkZWZhdWx0J3wnbG93LXBvd2VyJ3wnaGlnaC1wZXJmb3JtYW5jZScpfSBbcG93ZXJQcmVmZXJlbmNlPSdkZWZhdWx0J10gUHJvdmlkZXMgYSBoaW50IHRvIHRoZSB1c2VyIGFnZW50IGluZGljYXRpbmcgd2hhdCBjb25maWd1cmF0aW9uIG9mIEdQVSBpcyBzdWl0YWJsZSBmb3IgdGhpcyBXZWJHTCBjb250ZXh0LlxyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0PWZhbHNlXSBXaGV0aGVyIHRoZSByZW5kZXJlciBjcmVhdGlvbiB3aWxsIGZhaWwgdXBvbiBsb3cgcGVyZm9ybWFuY2UgaXMgZGV0ZWN0ZWQuXHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2RlcHRoPXRydWVdIFdoZXRoZXIgdGhlIGRyYXdpbmcgYnVmZmVyIGhhcyBhIGRlcHRoIGJ1ZmZlciBvZiBhdCBsZWFzdCAxNiBiaXRzLlxyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtsb2dhcml0aG1pY0RlcHRoQnVmZmVyPWZhbHNlXSBXaGV0aGVyIHRvIHVzZSBhIGxvZ2FyaXRobWljIGRlcHRoIGJ1ZmZlci4gSXQgbWF5IGJlIG5lY2Vzc2FyeSB0byB1c2UgdGhpcyBpZiBkZWFsaW5nIHdpdGggaHVnZSBkaWZmZXJlbmNlcyBpbiBzY2FsZSBpbiBhIHNpbmdsZSBzY2VuZS5cclxuICogTm90ZSB0aGF0IHRoaXMgc2V0dGluZyB1c2VzIGBnbF9GcmFnRGVwdGhgIGlmIGF2YWlsYWJsZSB3aGljaCBkaXNhYmxlcyB0aGUgRWFybHkgRnJhZ21lbnQgVGVzdCBvcHRpbWl6YXRpb24gYW5kIGNhbiBjYXVzZSBhIGRlY3JlYXNlIGluIHBlcmZvcm1hbmNlLlxyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtyZXZlcnNlRGVwdGhCdWZmZXI9ZmFsc2VdIFdoZXRoZXIgdG8gdXNlIGEgcmV2ZXJzZSBkZXB0aCBidWZmZXIuIFJlcXVpcmVzIHRoZSBgRVhUX2NsaXBfY29udHJvbGAgZXh0ZW5zaW9uLlxyXG4gKiBUaGlzIGlzIGEgbW9yZSBmYXN0ZXIgYW5kIGFjY3VyYXRlIHZlcnNpb24gdGhhbiBsb2dhcml0aG1pYyBkZXB0aCBidWZmZXIuXHJcbiAqKi9cclxuXHJcbi8qKlxyXG4gKiBXZWJHTFJlbmRlcmVyIENhcGFiaWxpdGllcy5cclxuICpcclxuICogQHR5cGVkZWYge09iamVjdH0gV2ViR0xSZW5kZXJlcn5DYXBhYmlsaXRpZXNcclxuICogQHByb3BlcnR5IHtGdW5jdGlvbn0gZ2V0TWF4QW5pc290cm9weSAtIFJldHVybnMgdGhlIG1heGltdW0gYXZhaWxhYmxlIGFuaXNvdHJvcHkuXHJcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGdldE1heFByZWNpc2lvbiAtIFJldHVybnMgdGhlIG1heGltdW0gYXZhaWxhYmxlIHByZWNpc2lvbiBmb3IgdmVydGV4IGFuZCBmcmFnbWVudCBzaGFkZXJzLlxyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGxvZ2FyaXRobWljRGVwdGhCdWZmZXIgLSBgdHJ1ZWAgaWYgYGxvZ2FyaXRobWljRGVwdGhCdWZmZXJgIHdhcyBzZXQgdG8gYHRydWVgIGluIHRoZSBjb25zdHJ1Y3Rvci5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IG1heEF0dHJpYnV0ZXMgLSBUaGUgbnVtYmVyIG9mIHNoYWRlciBhdHRyaWJ1dGVzIHRoYXQgY2FuIGJlIHVzZWQgYnkgdGhlIHZlcnRleCBzaGFkZXIuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBtYXhDdWJlbWFwU2l6ZSAtIE1heGltdW0gaGVpZ2h0ICogd2lkdGggb2YgY3ViZSBtYXAgdGV4dHVyZXMgdGhhdCBhIHNoYWRlciBjYW4gdXNlLlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gbWF4RnJhZ21lbnRVbmlmb3JtcyAtIFRoZSBudW1iZXIgb2YgdW5pZm9ybXMgdGhhdCBjYW4gYmUgdXNlZCBieSBhIGZyYWdtZW50IHNoYWRlci5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IG1heFNhbXBsZXMgLSBNYXhpbXVtIG51bWJlciBvZiBzYW1wbGVzIGluIGNvbnRleHQgb2YgTXVsdGlzYW1wbGUgYW50aS1hbGlhc2luZyAoTVNBQSkuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBtYXhUZXh0dXJlcyAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0ZXh0dXJlcyB0aGF0IGNhbiBiZSB1c2VkIGJ5IGEgc2hhZGVyLlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gbWF4VGV4dHVyZVNpemUgLSBNYXhpbXVtIGhlaWdodCAqIHdpZHRoIG9mIGEgdGV4dHVyZSB0aGF0IGEgc2hhZGVyIHVzZS5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IG1heFZhcnlpbmdzIC0gVGhlIG51bWJlciBvZiB2YXJ5aW5nIHZlY3RvcnMgdGhhdCBjYW4gdXNlZCBieSBzaGFkZXJzLlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gbWF4VmVydGV4VGV4dHVyZXMgLSBUaGUgbnVtYmVyIG9mIHRleHR1cmVzIHRoYXQgY2FuIGJlIHVzZWQgaW4gYSB2ZXJ0ZXggc2hhZGVyLlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gbWF4VmVydGV4VW5pZm9ybXMgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgdW5pZm9ybXMgdGhhdCBjYW4gYmUgdXNlZCBpbiBhIHZlcnRleCBzaGFkZXIuXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwcmVjaXNpb24gLSBUaGUgc2hhZGVyIHByZWNpc2lvbiBjdXJyZW50bHkgYmVpbmcgdXNlZCBieSB0aGUgcmVuZGVyZXIuXHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcmV2ZXJzZURlcHRoQnVmZmVyIC0gYHRydWVgIGlmIGByZXZlcnNlRGVwdGhCdWZmZXJgIHdhcyBzZXQgdG8gYHRydWVgIGluIHRoZSBjb25zdHJ1Y3RvclxyXG4gKiBhbmQgdGhlIHJlbmRlcmluZyBjb250ZXh0IHN1cHBvcnRzIGBFWFRfY2xpcF9jb250cm9sYC5cclxuICogQHByb3BlcnR5IHtib29sZWFufSB2ZXJ0ZXhUZXh0dXJlcyAtIGB0cnVlYCBpZiB2ZXJ0ZXggdGV4dHVyZXMgY2FuIGJlIHVzZWQuXHJcbiAqKi9cclxuXHJcbi8qKlxyXG4gKiBXZWJHTFJlbmRlcmVyIEluZm8gTWVtb3J5XHJcbiAqXHJcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFdlYkdMUmVuZGVyZXJ+SW5mb01lbW9yeVxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gZ2VvbWV0cmllcyAtIFRoZSBudW1iZXIgb2YgYWN0aXZlIGdlb21ldHJpZXMuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0ZXh0dXJlcyAtIFRoZSBudW1iZXIgb2YgYWN0aXZlIHRleHR1cmVzLlxyXG4gKiovXHJcblxyXG4vKipcclxuICogV2ViR0xSZW5kZXJlciBJbmZvIFJlbmRlclxyXG4gKlxyXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBXZWJHTFJlbmRlcmVyfkluZm9SZW5kZXJcclxuICogQHByb3BlcnR5IHtudW1iZXJ9IGZyYW1lIC0gVGhlIGZyYW1lIElELlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gY2FsbHMgLSBUaGUgbnVtYmVyIG9mIGRyYXcgY2FsbHMgcGVyIGZyYW1lLlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gdHJpYW5nbGVzIC0gVGhlIG51bWJlciBvZiByZW5kZXJlZCB0cmlhbmdsZXMgcHJpbWl0aXZlcyBwZXIgZnJhbWUuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBwb2ludHMgLSBUaGUgbnVtYmVyIG9mIHJlbmRlcmVkIHBvaW50cyBwcmltaXRpdmVzIHBlciBmcmFtZS5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IGxpbmVzIC0gVGhlIG51bWJlciBvZiByZW5kZXJlZCBsaW5lcyBwcmltaXRpdmVzIHBlciBmcmFtZS5cclxuICoqL1xyXG5cclxuLyoqXHJcbiAqIFdlYkdMUmVuZGVyZXIgSW5mb1xyXG4gKlxyXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBXZWJHTFJlbmRlcmVyfkluZm9cclxuICogQHByb3BlcnR5IHtib29sZWFufSBbYXV0b1Jlc2V0PXRydWVdIC0gV2hldGhlciB0byBhdXRvbWF0aWNhbGx5IHJlc2V0IHRoZSBpbmZvIGJ5IHRoZSByZW5kZXJlciBvciBub3QuXHJcbiAqIEBwcm9wZXJ0eSB7V2ViR0xSZW5kZXJlcn5JbmZvTWVtb3J5fSBtZW1vcnkgLSBJbmZvcm1hdGlvbiBhYm91dCBhbGxvY2F0ZWQgb2JqZWN0cy5cclxuICogQHByb3BlcnR5IHtXZWJHTFJlbmRlcmVyfkluZm9SZW5kZXJ9IHJlbmRlciAtIEluZm9ybWF0aW9uIGFib3V0IHJlbmRlcmVkIG9iamVjdHMuXHJcbiAqIEBwcm9wZXJ0eSB7P0FycmF5PFdlYkdMUHJvZ3JhbT59IHByb2dyYW1zIC0gQW4gYXJyYXkgYFdlYkdMUHJvZ3JhbWBzIHVzZWQgZm9yIHJlbmRlcmluZy5cclxuICogQHByb3BlcnR5IHtGdW5jdGlvbn0gcmVzZXQgLSBSZXNldHMgdGhlIGluZm8gb2JqZWN0IGZvciB0aGUgbmV4dCBmcmFtZS5cclxuICoqL1xyXG5cclxuLyoqXHJcbiAqIFdlYkdMUmVuZGVyZXIgU2hhZG93IE1hcC5cclxuICpcclxuICogQHR5cGVkZWYge09iamVjdH0gV2ViR0xSZW5kZXJlcn5TaGFkb3dNYXBcclxuICogQHByb3BlcnR5IHtib29sZWFufSBbZW5hYmxlZD1mYWxzZV0gLSBJZiBzZXQgdG8gYHRydWVgLCB1c2Ugc2hhZG93IG1hcHMgaW4gdGhlIHNjZW5lLlxyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFthdXRvVXBkYXRlPXRydWVdIC0gRW5hYmxlcyBhdXRvbWF0aWMgdXBkYXRlcyB0byB0aGUgc2hhZG93cyBpbiB0aGUgc2NlbmUuXHJcbiAqIElmIHlvdSBkbyBub3QgcmVxdWlyZSBkeW5hbWljIGxpZ2h0aW5nIC8gc2hhZG93cywgeW91IG1heSBzZXQgdGhpcyB0byBgZmFsc2VgLlxyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtuZWVkc1VwZGF0ZT1mYWxzZV0gLSBXaGVuIHNldCB0byBgdHJ1ZWAsIHNoYWRvdyBtYXBzIGluIHRoZSBzY2VuZVxyXG4gKiB3aWxsIGJlIHVwZGF0ZWQgaW4gdGhlIG5leHQgYHJlbmRlcmAgY2FsbC5cclxuICogQHByb3BlcnR5IHsoQmFzaWNTaGFkb3dNYXB8UENGU2hhZG93TWFwfFBDRlNvZnRTaGFkb3dNYXB8VlNNU2hhZG93TWFwKX0gW3R5cGU9UENGU2hhZG93TWFwXSAtIERlZmluZXMgdGhlIHNoYWRvdyBtYXAgdHlwZS5cclxuICoqL1xyXG5cclxuZXhwb3J0IHsgV2ViR0xSZW5kZXJlciB9O1xyXG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDck9BOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBOztBQ0FBO0FBWUE7QUFDQTs7QUNiQTtBQWdCQTtBQUNBOztBQ2pCQTtBQWdCQTtBQUNBOztBQ2pCQTtBQTRDQTtBQUNBOztBQzdDQTtBQTBDQTtBQUNBOztBQzNDQTtBQWNBO0FBQ0E7O0FDZkE7QUErQkE7QUFDQTs7QUNoQ0E7QUEyQ0E7QUFDQTs7QUM1Q0E7QUFtREE7QUFDQTs7QUNwREE7QUErQ0E7QUFDQTs7QUNoREE7QUFnREE7QUFDQTs7QUNqREE7QUFtREE7QUFDQTs7QUNwREE7QUE0REE7QUFDQTs7QUM3REE7QUFpREE7QUFDQTs7QUNsREE7QUFrREE7QUFDQTs7QUNuREE7QUFnQ0E7QUFDQTs7QUNqQ0E7QUEwQ0E7QUFDQTs7QUNtRlk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pRQTtBQUNLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNU5LO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDelZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6U0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOWtCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25GQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3A3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25MQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzb0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6akNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNycEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25EQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdHQTtBQU9BO0FBQ0E7O0FDTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoYUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxeUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbm9FQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3TUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNWtCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OyJ9 diff --git a/build/three.module.min.js b/build/three.module.min.js index f6de4a9c9cfaa5..e0c1e0d55323dc 100644 --- a/build/three.module.min.js +++ b/build/three.module.min.js @@ -4,3 +4,4 @@ * SPDX-License-Identifier: MIT */ import{Matrix3 as e,Vector2 as t,Color as n,mergeUniforms as r,Vector3 as i,CubeUVReflectionMapping as a,Mesh as o,BoxGeometry as s,ShaderMaterial as l,BackSide as c,cloneUniforms as d,Euler as u,Matrix4 as f,ColorManagement as p,SRGBTransfer as m,PlaneGeometry as h,FrontSide as _,getUnlitUniformColorSpace as g,IntType as v,HalfFloatType as E,UnsignedByteType as S,FloatType as T,RGBAFormat as M,Plane as x,EquirectangularReflectionMapping as R,EquirectangularRefractionMapping as A,WebGLCubeRenderTarget as b,CubeReflectionMapping as C,CubeRefractionMapping as L,OrthographicCamera as P,PerspectiveCamera as U,NoToneMapping as D,MeshBasicMaterial as w,NoBlending as y,WebGLRenderTarget as I,BufferGeometry as N,BufferAttribute as O,LinearSRGBColorSpace as F,LinearFilter as B,warnOnce as H,Uint32BufferAttribute as G,Uint16BufferAttribute as V,arrayNeedsUint32 as z,Vector4 as k,DataArrayTexture as W,CubeTexture as X,Data3DTexture as Y,LessEqualCompare as K,DepthTexture as j,Texture as q,GLSL3 as Z,PCFShadowMap as $,PCFSoftShadowMap as Q,VSMShadowMap as J,CustomToneMapping as ee,NeutralToneMapping as te,AgXToneMapping as ne,ACESFilmicToneMapping as re,CineonToneMapping as ie,ReinhardToneMapping as ae,LinearToneMapping as oe,LinearTransfer as se,AddOperation as le,MixOperation as ce,MultiplyOperation as de,UniformsUtils as ue,DoubleSide as fe,NormalBlending as pe,TangentSpaceNormalMap as me,ObjectSpaceNormalMap as he,Layers as _e,Frustum as ge,MeshDepthMaterial as ve,RGBADepthPacking as Ee,MeshDistanceMaterial as Se,NearestFilter as Te,LessEqualDepth as Me,ReverseSubtractEquation as xe,SubtractEquation as Re,AddEquation as Ae,OneMinusConstantAlphaFactor as be,ConstantAlphaFactor as Ce,OneMinusConstantColorFactor as Le,ConstantColorFactor as Pe,OneMinusDstAlphaFactor as Ue,OneMinusDstColorFactor as De,OneMinusSrcAlphaFactor as we,OneMinusSrcColorFactor as ye,DstAlphaFactor as Ie,DstColorFactor as Ne,SrcAlphaSaturateFactor as Oe,SrcAlphaFactor as Fe,SrcColorFactor as Be,OneFactor as He,ZeroFactor as Ge,NotEqualDepth as Ve,GreaterDepth as ze,GreaterEqualDepth as ke,EqualDepth as We,LessDepth as Xe,AlwaysDepth as Ye,NeverDepth as Ke,CullFaceNone as je,CullFaceBack as qe,CullFaceFront as Ze,CustomBlending as $e,MultiplyBlending as Qe,SubtractiveBlending as Je,AdditiveBlending as et,MinEquation as tt,MaxEquation as nt,MirroredRepeatWrapping as rt,ClampToEdgeWrapping as it,RepeatWrapping as at,LinearMipmapLinearFilter as ot,LinearMipmapNearestFilter as st,NearestMipmapLinearFilter as lt,NearestMipmapNearestFilter as ct,NotEqualCompare as dt,GreaterCompare as ut,GreaterEqualCompare as ft,EqualCompare as pt,LessCompare as mt,AlwaysCompare as ht,NeverCompare as _t,NoColorSpace as gt,DepthStencilFormat as vt,getByteLength as Et,DepthFormat as St,UnsignedIntType as Tt,UnsignedInt248Type as Mt,UnsignedShortType as xt,createElementNS as Rt,UnsignedShort4444Type as At,UnsignedShort5551Type as bt,UnsignedInt5999Type as Ct,ByteType as Lt,ShortType as Pt,AlphaFormat as Ut,RGBFormat as Dt,LuminanceFormat as wt,LuminanceAlphaFormat as yt,RedFormat as It,RedIntegerFormat as Nt,RGFormat as Ot,RGIntegerFormat as Ft,RGBAIntegerFormat as Bt,RGB_S3TC_DXT1_Format as Ht,RGBA_S3TC_DXT1_Format as Gt,RGBA_S3TC_DXT3_Format as Vt,RGBA_S3TC_DXT5_Format as zt,RGB_PVRTC_4BPPV1_Format as kt,RGB_PVRTC_2BPPV1_Format as Wt,RGBA_PVRTC_4BPPV1_Format as Xt,RGBA_PVRTC_2BPPV1_Format as Yt,RGB_ETC1_Format as Kt,RGB_ETC2_Format as jt,RGBA_ETC2_EAC_Format as qt,RGBA_ASTC_4x4_Format as Zt,RGBA_ASTC_5x4_Format as $t,RGBA_ASTC_5x5_Format as Qt,RGBA_ASTC_6x5_Format as Jt,RGBA_ASTC_6x6_Format as en,RGBA_ASTC_8x5_Format as tn,RGBA_ASTC_8x6_Format as nn,RGBA_ASTC_8x8_Format as rn,RGBA_ASTC_10x5_Format as an,RGBA_ASTC_10x6_Format as on,RGBA_ASTC_10x8_Format as sn,RGBA_ASTC_10x10_Format as ln,RGBA_ASTC_12x10_Format as cn,RGBA_ASTC_12x12_Format as dn,RGBA_BPTC_Format as un,RGB_BPTC_SIGNED_Format as fn,RGB_BPTC_UNSIGNED_Format as pn,RED_RGTC1_Format as mn,SIGNED_RED_RGTC1_Format as hn,RED_GREEN_RGTC2_Format as _n,SIGNED_RED_GREEN_RGTC2_Format as gn,EventDispatcher as vn,ArrayCamera as En,WebXRController as Sn,RAD2DEG as Tn,createCanvasElement as Mn,SRGBColorSpace as xn,REVISION as Rn,toNormalizedProjectionMatrix as An,toReversedProjectionMatrix as bn,probeAsync as Cn,WebGLCoordinateSystem as Ln}from"./three.core.min.js";export{AdditiveAnimationBlendMode,AlwaysStencilFunc,AmbientLight,AnimationAction,AnimationClip,AnimationLoader,AnimationMixer,AnimationObjectGroup,AnimationUtils,ArcCurve,ArrowHelper,AttachedBindMode,Audio,AudioAnalyser,AudioContext,AudioListener,AudioLoader,AxesHelper,BasicDepthPacking,BasicShadowMap,BatchedMesh,Bone,BooleanKeyframeTrack,Box2,Box3,Box3Helper,BoxHelper,BufferGeometryLoader,Cache,Camera,CameraHelper,CanvasTexture,CapsuleGeometry,CatmullRomCurve3,CircleGeometry,Clock,ColorKeyframeTrack,CompressedArrayTexture,CompressedCubeTexture,CompressedTexture,CompressedTextureLoader,ConeGeometry,Controls,CubeCamera,CubeTextureLoader,CubicBezierCurve,CubicBezierCurve3,CubicInterpolant,CullFaceFrontBack,Curve,CurvePath,CylinderGeometry,Cylindrical,DataTexture,DataTextureLoader,DataUtils,DecrementStencilOp,DecrementWrapStencilOp,DefaultLoadingManager,DetachedBindMode,DirectionalLight,DirectionalLightHelper,DiscreteInterpolant,DodecahedronGeometry,DynamicCopyUsage,DynamicDrawUsage,DynamicReadUsage,EdgesGeometry,EllipseCurve,EqualStencilFunc,ExtrudeGeometry,FileLoader,Float16BufferAttribute,Float32BufferAttribute,Fog,FogExp2,FramebufferTexture,GLBufferAttribute,GLSL1,GreaterEqualStencilFunc,GreaterStencilFunc,GridHelper,Group,HemisphereLight,HemisphereLightHelper,IcosahedronGeometry,ImageBitmapLoader,ImageLoader,ImageUtils,IncrementStencilOp,IncrementWrapStencilOp,InstancedBufferAttribute,InstancedBufferGeometry,InstancedInterleavedBuffer,InstancedMesh,Int16BufferAttribute,Int32BufferAttribute,Int8BufferAttribute,InterleavedBuffer,InterleavedBufferAttribute,Interpolant,InterpolateDiscrete,InterpolateLinear,InterpolateSmooth,InvertStencilOp,KeepStencilOp,KeyframeTrack,LOD,LatheGeometry,LessEqualStencilFunc,LessStencilFunc,Light,LightProbe,Line,Line3,LineBasicMaterial,LineCurve,LineCurve3,LineDashedMaterial,LineLoop,LineSegments,LinearInterpolant,LinearMipMapLinearFilter,LinearMipMapNearestFilter,Loader,LoaderUtils,LoadingManager,LoopOnce,LoopPingPong,LoopRepeat,MOUSE,Material,MaterialLoader,MathUtils,Matrix2,MeshLambertMaterial,MeshMatcapMaterial,MeshNormalMaterial,MeshPhongMaterial,MeshPhysicalMaterial,MeshStandardMaterial,MeshToonMaterial,NearestMipMapLinearFilter,NearestMipMapNearestFilter,NeverStencilFunc,NormalAnimationBlendMode,NotEqualStencilFunc,NumberKeyframeTrack,Object3D,ObjectLoader,OctahedronGeometry,Path,PlaneHelper,PointLight,PointLightHelper,Points,PointsMaterial,PolarGridHelper,PolyhedronGeometry,PositionalAudio,PropertyBinding,PropertyMixer,QuadraticBezierCurve,QuadraticBezierCurve3,Quaternion,QuaternionKeyframeTrack,QuaternionLinearInterpolant,RGBDepthPacking,RGBIntegerFormat,RGDepthPacking,RawShaderMaterial,Ray,Raycaster,RectAreaLight,RenderTarget,RenderTarget3D,RenderTargetArray,ReplaceStencilOp,RingGeometry,Scene,ShadowMaterial,Shape,ShapeGeometry,ShapePath,ShapeUtils,Skeleton,SkeletonHelper,SkinnedMesh,Source,Sphere,SphereGeometry,Spherical,SphericalHarmonics3,SplineCurve,SpotLight,SpotLightHelper,Sprite,SpriteMaterial,StaticCopyUsage,StaticDrawUsage,StaticReadUsage,StereoCamera,StreamCopyUsage,StreamDrawUsage,StreamReadUsage,StringKeyframeTrack,TOUCH,TetrahedronGeometry,TextureLoader,TextureUtils,TimestampQuery,TorusGeometry,TorusKnotGeometry,Triangle,TriangleFanDrawMode,TriangleStripDrawMode,TrianglesDrawMode,TubeGeometry,UVMapping,Uint8BufferAttribute,Uint8ClampedBufferAttribute,Uniform,UniformsGroup,VectorKeyframeTrack,VideoFrameTexture,VideoTexture,WebGL3DRenderTarget,WebGLArrayRenderTarget,WebGPUCoordinateSystem,WireframeGeometry,WrapAroundEnding,ZeroCurvatureEnding,ZeroSlopeEnding,ZeroStencilOp}from"./three.core.min.js";function Pn(){let e=null,t=!1,n=null,r=null;function i(t,a){n(t,a),r=e.requestAnimationFrame(i)}return{start:function(){!0!==t&&null!==n&&(r=e.requestAnimationFrame(i),t=!0)},stop:function(){e.cancelAnimationFrame(r),t=!1},setAnimationLoop:function(e){n=e},setContext:function(t){e=t}}}function Un(e){const t=new WeakMap;return{get:function(e){return e.isInterleavedBufferAttribute&&(e=e.data),t.get(e)},remove:function(n){n.isInterleavedBufferAttribute&&(n=n.data);const r=t.get(n);r&&(e.deleteBuffer(r.buffer),t.delete(n))},update:function(n,r){if(n.isInterleavedBufferAttribute&&(n=n.data),n.isGLBufferAttribute){const e=t.get(n);return void((!e||e.versione.start-t.start));let t=0;for(let e=1;e 0\n\tvec4 plane;\n\t#ifdef ALPHA_TO_COVERAGE\n\t\tfloat distanceToPlane, distanceGradient;\n\t\tfloat clipOpacity = 1.0;\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\n\t\t\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\n\t\t\tclipOpacity *= smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\n\t\t\tif ( clipOpacity == 0.0 ) discard;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\t\tfloat unionClipOpacity = 1.0;\n\t\t\t#pragma unroll_loop_start\n\t\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\t\tplane = clippingPlanes[ i ];\n\t\t\t\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\n\t\t\t\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\n\t\t\t\tunionClipOpacity *= 1.0 - smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\n\t\t\t}\n\t\t\t#pragma unroll_loop_end\n\t\t\tclipOpacity *= 1.0 - unionClipOpacity;\n\t\t#endif\n\t\tdiffuseColor.a *= clipOpacity;\n\t\tif ( diffuseColor.a == 0.0 ) discard;\n\t#else\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\t\tbool clipped = true;\n\t\t\t#pragma unroll_loop_start\n\t\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\t\tplane = clippingPlanes[ i ];\n\t\t\t\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t\t}\n\t\t\t#pragma unroll_loop_end\n\t\t\tif ( clipped ) discard;\n\t\t#endif\n\t#endif\n#endif",clipping_planes_pars_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif",clipping_planes_pars_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n#endif",clipping_planes_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvClipPosition = - mvPosition.xyz;\n#endif",color_fragment:"#if defined( USE_COLOR_ALPHA )\n\tdiffuseColor *= vColor;\n#elif defined( USE_COLOR )\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR )\n\tvarying vec3 vColor;\n#endif",color_pars_vertex:"#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\n\tvarying vec3 vColor;\n#endif",color_vertex:"#if defined( USE_COLOR_ALPHA )\n\tvColor = vec4( 1.0 );\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\n\tvColor = vec3( 1.0 );\n#endif\n#ifdef USE_COLOR\n\tvColor *= color;\n#endif\n#ifdef USE_INSTANCING_COLOR\n\tvColor.xyz *= instanceColor.xyz;\n#endif\n#ifdef USE_BATCHING_COLOR\n\tvec3 batchingColor = getBatchingColor( getIndirectIndex( gl_DrawID ) );\n\tvColor.xyz *= batchingColor.xyz;\n#endif",common:"#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nvec3 pow2( const in vec3 x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\nfloat average( const in vec3 v ) { return dot( v, vec3( 0.3333333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract( sin( sn ) * c );\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\n#ifdef USE_ALPHAHASH\n\tvarying vec3 vPosition;\n#endif\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nbool isPerspectiveMatrix( mat4 m ) {\n\treturn m[ 2 ][ 3 ] == - 1.0;\n}\nvec2 equirectUv( in vec3 dir ) {\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\treturn vec2( u, v );\n}\nvec3 BRDF_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) {\n\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n}\nfloat F_Schlick( const in float f0, const in float f90, const in float dotVH ) {\n\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n} // validated",cube_uv_reflection_fragment:"#ifdef ENVMAP_TYPE_CUBE_UV\n\t#define cubeUV_minMipLevel 4.0\n\t#define cubeUV_minTileSize 16.0\n\tfloat getFace( vec3 direction ) {\n\t\tvec3 absDirection = abs( direction );\n\t\tfloat face = - 1.0;\n\t\tif ( absDirection.x > absDirection.z ) {\n\t\t\tif ( absDirection.x > absDirection.y )\n\t\t\t\tface = direction.x > 0.0 ? 0.0 : 3.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t} else {\n\t\t\tif ( absDirection.z > absDirection.y )\n\t\t\t\tface = direction.z > 0.0 ? 2.0 : 5.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t}\n\t\treturn face;\n\t}\n\tvec2 getUV( vec3 direction, float face ) {\n\t\tvec2 uv;\n\t\tif ( face == 0.0 ) {\n\t\t\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 1.0 ) {\n\t\t\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\n\t\t} else if ( face == 2.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\n\t\t} else if ( face == 3.0 ) {\n\t\t\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 4.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\n\t\t} else {\n\t\t\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\n\t\t}\n\t\treturn 0.5 * ( uv + 1.0 );\n\t}\n\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\n\t\tfloat face = getFace( direction );\n\t\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\n\t\tmipInt = max( mipInt, cubeUV_minMipLevel );\n\t\tfloat faceSize = exp2( mipInt );\n\t\thighp vec2 uv = getUV( direction, face ) * ( faceSize - 2.0 ) + 1.0;\n\t\tif ( face > 2.0 ) {\n\t\t\tuv.y += faceSize;\n\t\t\tface -= 3.0;\n\t\t}\n\t\tuv.x += face * faceSize;\n\t\tuv.x += filterInt * 3.0 * cubeUV_minTileSize;\n\t\tuv.y += 4.0 * ( exp2( CUBEUV_MAX_MIP ) - faceSize );\n\t\tuv.x *= CUBEUV_TEXEL_WIDTH;\n\t\tuv.y *= CUBEUV_TEXEL_HEIGHT;\n\t\t#ifdef texture2DGradEXT\n\t\t\treturn texture2DGradEXT( envMap, uv, vec2( 0.0 ), vec2( 0.0 ) ).rgb;\n\t\t#else\n\t\t\treturn texture2D( envMap, uv ).rgb;\n\t\t#endif\n\t}\n\t#define cubeUV_r0 1.0\n\t#define cubeUV_m0 - 2.0\n\t#define cubeUV_r1 0.8\n\t#define cubeUV_m1 - 1.0\n\t#define cubeUV_r4 0.4\n\t#define cubeUV_m4 2.0\n\t#define cubeUV_r5 0.305\n\t#define cubeUV_m5 3.0\n\t#define cubeUV_r6 0.21\n\t#define cubeUV_m6 4.0\n\tfloat roughnessToMip( float roughness ) {\n\t\tfloat mip = 0.0;\n\t\tif ( roughness >= cubeUV_r1 ) {\n\t\t\tmip = ( cubeUV_r0 - roughness ) * ( cubeUV_m1 - cubeUV_m0 ) / ( cubeUV_r0 - cubeUV_r1 ) + cubeUV_m0;\n\t\t} else if ( roughness >= cubeUV_r4 ) {\n\t\t\tmip = ( cubeUV_r1 - roughness ) * ( cubeUV_m4 - cubeUV_m1 ) / ( cubeUV_r1 - cubeUV_r4 ) + cubeUV_m1;\n\t\t} else if ( roughness >= cubeUV_r5 ) {\n\t\t\tmip = ( cubeUV_r4 - roughness ) * ( cubeUV_m5 - cubeUV_m4 ) / ( cubeUV_r4 - cubeUV_r5 ) + cubeUV_m4;\n\t\t} else if ( roughness >= cubeUV_r6 ) {\n\t\t\tmip = ( cubeUV_r5 - roughness ) * ( cubeUV_m6 - cubeUV_m5 ) / ( cubeUV_r5 - cubeUV_r6 ) + cubeUV_m5;\n\t\t} else {\n\t\t\tmip = - 2.0 * log2( 1.16 * roughness );\t\t}\n\t\treturn mip;\n\t}\n\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\n\t\tfloat mip = clamp( roughnessToMip( roughness ), cubeUV_m0, CUBEUV_MAX_MIP );\n\t\tfloat mipF = fract( mip );\n\t\tfloat mipInt = floor( mip );\n\t\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\n\t\tif ( mipF == 0.0 ) {\n\t\t\treturn vec4( color0, 1.0 );\n\t\t} else {\n\t\t\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\n\t\t\treturn vec4( mix( color0, color1, mipF ), 1.0 );\n\t\t}\n\t}\n#endif",defaultnormal_vertex:"vec3 transformedNormal = objectNormal;\n#ifdef USE_TANGENT\n\tvec3 transformedTangent = objectTangent;\n#endif\n#ifdef USE_BATCHING\n\tmat3 bm = mat3( batchingMatrix );\n\ttransformedNormal /= vec3( dot( bm[ 0 ], bm[ 0 ] ), dot( bm[ 1 ], bm[ 1 ] ), dot( bm[ 2 ], bm[ 2 ] ) );\n\ttransformedNormal = bm * transformedNormal;\n\t#ifdef USE_TANGENT\n\t\ttransformedTangent = bm * transformedTangent;\n\t#endif\n#endif\n#ifdef USE_INSTANCING\n\tmat3 im = mat3( instanceMatrix );\n\ttransformedNormal /= vec3( dot( im[ 0 ], im[ 0 ] ), dot( im[ 1 ], im[ 1 ] ), dot( im[ 2 ], im[ 2 ] ) );\n\ttransformedNormal = im * transformedNormal;\n\t#ifdef USE_TANGENT\n\t\ttransformedTangent = im * transformedTangent;\n\t#endif\n#endif\ntransformedNormal = normalMatrix * transformedNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n\ttransformedTangent = ( modelViewMatrix * vec4( transformedTangent, 0.0 ) ).xyz;\n\t#ifdef FLIP_SIDED\n\t\ttransformedTangent = - transformedTangent;\n\t#endif\n#endif",displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vDisplacementMapUv ).x * displacementScale + displacementBias );\n#endif",emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vEmissiveMapUv );\n\t#ifdef DECODE_VIDEO_TEXTURE_EMISSIVE\n\t\temissiveColor = sRGBTransferEOTF( emissiveColor );\n\t#endif\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif",emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif",colorspace_fragment:"gl_FragColor = linearToOutputTexel( gl_FragColor );",colorspace_pars_fragment:"vec4 LinearTransferOETF( in vec4 value ) {\n\treturn value;\n}\nvec4 sRGBTransferEOTF( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\n}\nvec4 sRGBTransferOETF( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}",envmap_fragment:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToFrag;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, envMapRotation * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif",envmap_common_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\tuniform mat3 envMapRotation;\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\t\n#endif",envmap_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float reflectivity;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\tvarying vec3 vWorldPosition;\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif",envmap_pars_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\t\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif",envmap_physical_pars_fragment:"#ifdef USE_ENVMAP\n\tvec3 getIBLIrradiance( const in vec3 normal ) {\n\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * worldNormal, 1.0 );\n\t\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n\tvec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\n\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\tvec3 reflectVec = reflect( - viewDir, normal );\n\t\t\treflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\n\t\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * reflectVec, roughness );\n\t\t\treturn envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n\t#ifdef USE_ANISOTROPY\n\t\tvec3 getIBLAnisotropyRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in vec3 bitangent, const in float anisotropy ) {\n\t\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\t\tvec3 bentNormal = cross( bitangent, viewDir );\n\t\t\t\tbentNormal = normalize( cross( bentNormal, bitangent ) );\n\t\t\t\tbentNormal = normalize( mix( bentNormal, normal, pow2( pow2( 1.0 - anisotropy * ( 1.0 - roughness ) ) ) ) );\n\t\t\t\treturn getIBLRadiance( viewDir, bentNormal, roughness );\n\t\t\t#else\n\t\t\t\treturn vec3( 0.0 );\n\t\t\t#endif\n\t\t}\n\t#endif\n#endif",envmap_vertex:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif",fog_vertex:"#ifdef USE_FOG\n\tvFogDepth = - mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n\tvarying float vFogDepth;\n#endif",fog_fragment:"#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif",fog_pars_fragment:"#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float vFogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif",gradientmap_pars_fragment:"#ifdef USE_GRADIENTMAP\n\tuniform sampler2D gradientMap;\n#endif\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\tfloat dotNL = dot( normal, lightDirection );\n\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t#ifdef USE_GRADIENTMAP\n\t\treturn vec3( texture2D( gradientMap, coord ).r );\n\t#else\n\t\tvec2 fw = fwidth( coord ) * 0.5;\n\t\treturn mix( vec3( 0.7 ), vec3( 1.0 ), smoothstep( 0.7 - fw.x, 0.7 + fw.x, coord.x ) );\n\t#endif\n}",lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",lights_lambert_fragment:"LambertMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularStrength = specularStrength;",lights_lambert_pars_fragment:"varying vec3 vViewPosition;\nstruct LambertMaterial {\n\tvec3 diffuseColor;\n\tfloat specularStrength;\n};\nvoid RE_Direct_Lambert( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Lambert( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Lambert\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Lambert",lights_pars_begin:"uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\n#if defined( USE_LIGHT_PROBES )\n\tuniform vec3 lightProbe[ 9 ];\n#endif\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\tfloat x = normal.x, y = normal.y, z = normal.z;\n\tvec3 result = shCoefficients[ 0 ] * 0.886227;\n\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n\treturn result;\n}\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) {\n\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\treturn irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\treturn irradiance;\n}\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\tif ( cutoffDistance > 0.0 ) {\n\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t}\n\treturn distanceFalloff;\n}\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\n\treturn smoothstep( coneCosine, penumbraCosine, angleCosine );\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalLightInfo( const in DirectionalLight directionalLight, out IncidentLight light ) {\n\t\tlight.color = directionalLight.color;\n\t\tlight.direction = directionalLight.direction;\n\t\tlight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointLightInfo( const in PointLight pointLight, const in vec3 geometryPosition, out IncidentLight light ) {\n\t\tvec3 lVector = pointLight.position - geometryPosition;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tlight.color = pointLight.color;\n\t\tlight.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\n\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotLightInfo( const in SpotLight spotLight, const in vec3 geometryPosition, out IncidentLight light ) {\n\t\tvec3 lVector = spotLight.position - geometryPosition;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat angleCos = dot( light.direction, spotLight.direction );\n\t\tfloat spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\tif ( spotAttenuation > 0.0 ) {\n\t\t\tfloat lightDistance = length( lVector );\n\t\t\tlight.color = spotLight.color * spotAttenuation;\n\t\t\tlight.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t\t} else {\n\t\t\tlight.color = vec3( 0.0 );\n\t\t\tlight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) {\n\t\tfloat dotNL = dot( normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\treturn irradiance;\n\t}\n#endif",lights_toon_fragment:"ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;",lights_toon_pars_fragment:"varying vec3 vViewPosition;\nstruct ToonMaterial {\n\tvec3 diffuseColor;\n};\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\tvec3 irradiance = getGradientIrradiance( geometryNormal, directLight.direction ) * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Toon\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Toon",lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;",lights_phong_pars_fragment:"varying vec3 vViewPosition;\nstruct BlinnPhongMaterial {\n\tvec3 diffuseColor;\n\tvec3 specularColor;\n\tfloat specularShininess;\n\tfloat specularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometryViewDir, geometryNormal, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong",lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nvec3 dxy = max( abs( dFdx( nonPerturbedNormal ) ), abs( dFdy( nonPerturbedNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\nmaterial.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness;\nmaterial.roughness = min( material.roughness, 1.0 );\n#ifdef IOR\n\tmaterial.ior = ior;\n\t#ifdef USE_SPECULAR\n\t\tfloat specularIntensityFactor = specularIntensity;\n\t\tvec3 specularColorFactor = specularColor;\n\t\t#ifdef USE_SPECULAR_COLORMAP\n\t\t\tspecularColorFactor *= texture2D( specularColorMap, vSpecularColorMapUv ).rgb;\n\t\t#endif\n\t\t#ifdef USE_SPECULAR_INTENSITYMAP\n\t\t\tspecularIntensityFactor *= texture2D( specularIntensityMap, vSpecularIntensityMapUv ).a;\n\t\t#endif\n\t\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\n\t#else\n\t\tfloat specularIntensityFactor = 1.0;\n\t\tvec3 specularColorFactor = vec3( 1.0 );\n\t\tmaterial.specularF90 = 1.0;\n\t#endif\n\tmaterial.specularColor = mix( min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.specularF90 = 1.0;\n#endif\n#ifdef USE_CLEARCOAT\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\n\tmaterial.clearcoatF0 = vec3( 0.04 );\n\tmaterial.clearcoatF90 = 1.0;\n\t#ifdef USE_CLEARCOATMAP\n\t\tmaterial.clearcoat *= texture2D( clearcoatMap, vClearcoatMapUv ).x;\n\t#endif\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vClearcoatRoughnessMapUv ).y;\n\t#endif\n\tmaterial.clearcoat = saturate( material.clearcoat );\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n\tmaterial.clearcoatRoughness += geometryRoughness;\n\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n#endif\n#ifdef USE_DISPERSION\n\tmaterial.dispersion = dispersion;\n#endif\n#ifdef USE_IRIDESCENCE\n\tmaterial.iridescence = iridescence;\n\tmaterial.iridescenceIOR = iridescenceIOR;\n\t#ifdef USE_IRIDESCENCEMAP\n\t\tmaterial.iridescence *= texture2D( iridescenceMap, vIridescenceMapUv ).r;\n\t#endif\n\t#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\t\tmaterial.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vIridescenceThicknessMapUv ).g + iridescenceThicknessMinimum;\n\t#else\n\t\tmaterial.iridescenceThickness = iridescenceThicknessMaximum;\n\t#endif\n#endif\n#ifdef USE_SHEEN\n\tmaterial.sheenColor = sheenColor;\n\t#ifdef USE_SHEEN_COLORMAP\n\t\tmaterial.sheenColor *= texture2D( sheenColorMap, vSheenColorMapUv ).rgb;\n\t#endif\n\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );\n\t#ifdef USE_SHEEN_ROUGHNESSMAP\n\t\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vSheenRoughnessMapUv ).a;\n\t#endif\n#endif\n#ifdef USE_ANISOTROPY\n\t#ifdef USE_ANISOTROPYMAP\n\t\tmat2 anisotropyMat = mat2( anisotropyVector.x, anisotropyVector.y, - anisotropyVector.y, anisotropyVector.x );\n\t\tvec3 anisotropyPolar = texture2D( anisotropyMap, vAnisotropyMapUv ).rgb;\n\t\tvec2 anisotropyV = anisotropyMat * normalize( 2.0 * anisotropyPolar.rg - vec2( 1.0 ) ) * anisotropyPolar.b;\n\t#else\n\t\tvec2 anisotropyV = anisotropyVector;\n\t#endif\n\tmaterial.anisotropy = length( anisotropyV );\n\tif( material.anisotropy == 0.0 ) {\n\t\tanisotropyV = vec2( 1.0, 0.0 );\n\t} else {\n\t\tanisotropyV /= material.anisotropy;\n\t\tmaterial.anisotropy = saturate( material.anisotropy );\n\t}\n\tmaterial.alphaT = mix( pow2( material.roughness ), 1.0, pow2( material.anisotropy ) );\n\tmaterial.anisotropyT = tbn[ 0 ] * anisotropyV.x + tbn[ 1 ] * anisotropyV.y;\n\tmaterial.anisotropyB = tbn[ 1 ] * anisotropyV.x - tbn[ 0 ] * anisotropyV.y;\n#endif",lights_physical_pars_fragment:"struct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tfloat roughness;\n\tvec3 specularColor;\n\tfloat specularF90;\n\tfloat dispersion;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat clearcoat;\n\t\tfloat clearcoatRoughness;\n\t\tvec3 clearcoatF0;\n\t\tfloat clearcoatF90;\n\t#endif\n\t#ifdef USE_IRIDESCENCE\n\t\tfloat iridescence;\n\t\tfloat iridescenceIOR;\n\t\tfloat iridescenceThickness;\n\t\tvec3 iridescenceFresnel;\n\t\tvec3 iridescenceF0;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tvec3 sheenColor;\n\t\tfloat sheenRoughness;\n\t#endif\n\t#ifdef IOR\n\t\tfloat ior;\n\t#endif\n\t#ifdef USE_TRANSMISSION\n\t\tfloat transmission;\n\t\tfloat transmissionAlpha;\n\t\tfloat thickness;\n\t\tfloat attenuationDistance;\n\t\tvec3 attenuationColor;\n\t#endif\n\t#ifdef USE_ANISOTROPY\n\t\tfloat anisotropy;\n\t\tfloat alphaT;\n\t\tvec3 anisotropyT;\n\t\tvec3 anisotropyB;\n\t#endif\n};\nvec3 clearcoatSpecularDirect = vec3( 0.0 );\nvec3 clearcoatSpecularIndirect = vec3( 0.0 );\nvec3 sheenSpecularDirect = vec3( 0.0 );\nvec3 sheenSpecularIndirect = vec3(0.0 );\nvec3 Schlick_to_F0( const in vec3 f, const in float f90, const in float dotVH ) {\n float x = clamp( 1.0 - dotVH, 0.0, 1.0 );\n float x2 = x * x;\n float x5 = clamp( x * x2 * x2, 0.0, 0.9999 );\n return ( f - vec3( f90 ) * x5 ) / ( 1.0 - x5 );\n}\nfloat V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\n#ifdef USE_ANISOTROPY\n\tfloat V_GGX_SmithCorrelated_Anisotropic( const in float alphaT, const in float alphaB, const in float dotTV, const in float dotBV, const in float dotTL, const in float dotBL, const in float dotNV, const in float dotNL ) {\n\t\tfloat gv = dotNL * length( vec3( alphaT * dotTV, alphaB * dotBV, dotNV ) );\n\t\tfloat gl = dotNV * length( vec3( alphaT * dotTL, alphaB * dotBL, dotNL ) );\n\t\tfloat v = 0.5 / ( gv + gl );\n\t\treturn saturate(v);\n\t}\n\tfloat D_GGX_Anisotropic( const in float alphaT, const in float alphaB, const in float dotNH, const in float dotTH, const in float dotBH ) {\n\t\tfloat a2 = alphaT * alphaB;\n\t\thighp vec3 v = vec3( alphaB * dotTH, alphaT * dotBH, a2 * dotNH );\n\t\thighp float v2 = dot( v, v );\n\t\tfloat w2 = a2 / v2;\n\t\treturn RECIPROCAL_PI * a2 * pow2 ( w2 );\n\t}\n#endif\n#ifdef USE_CLEARCOAT\n\tvec3 BRDF_GGX_Clearcoat( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material) {\n\t\tvec3 f0 = material.clearcoatF0;\n\t\tfloat f90 = material.clearcoatF90;\n\t\tfloat roughness = material.clearcoatRoughness;\n\t\tfloat alpha = pow2( roughness );\n\t\tvec3 halfDir = normalize( lightDir + viewDir );\n\t\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\t\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\t\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\t\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\t\tvec3 F = F_Schlick( f0, f90, dotVH );\n\t\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\t\tfloat D = D_GGX( alpha, dotNH );\n\t\treturn F * ( V * D );\n\t}\n#endif\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\n\tvec3 f0 = material.specularColor;\n\tfloat f90 = material.specularF90;\n\tfloat roughness = material.roughness;\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\tvec3 F = F_Schlick( f0, f90, dotVH );\n\t#ifdef USE_IRIDESCENCE\n\t\tF = mix( F, material.iridescenceFresnel, material.iridescence );\n\t#endif\n\t#ifdef USE_ANISOTROPY\n\t\tfloat dotTL = dot( material.anisotropyT, lightDir );\n\t\tfloat dotTV = dot( material.anisotropyT, viewDir );\n\t\tfloat dotTH = dot( material.anisotropyT, halfDir );\n\t\tfloat dotBL = dot( material.anisotropyB, lightDir );\n\t\tfloat dotBV = dot( material.anisotropyB, viewDir );\n\t\tfloat dotBH = dot( material.anisotropyB, halfDir );\n\t\tfloat V = V_GGX_SmithCorrelated_Anisotropic( material.alphaT, alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL );\n\t\tfloat D = D_GGX_Anisotropic( material.alphaT, alpha, dotNH, dotTH, dotBH );\n\t#else\n\t\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\t\tfloat D = D_GGX( alpha, dotNH );\n\t#endif\n\treturn F * ( V * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie( float roughness, float dotNH ) {\n\tfloat alpha = pow2( roughness );\n\tfloat invAlpha = 1.0 / alpha;\n\tfloat cos2h = dotNH * dotNH;\n\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 );\n\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\n}\nfloat V_Neubelt( float dotNV, float dotNL ) {\n\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\n}\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat D = D_Charlie( sheenRoughness, dotNH );\n\tfloat V = V_Neubelt( dotNV, dotNL );\n\treturn sheenColor * ( D * V );\n}\n#endif\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat r2 = roughness * roughness;\n\tfloat a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95;\n\tfloat b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72;\n\tfloat DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) );\n\treturn saturate( DG * RECIPROCAL_PI );\n}\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\tvec2 fab = vec2( - 1.04, 1.04 ) * a004 + r.zw;\n\treturn fab;\n}\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\treturn specularColor * fab.x + specularF90 * fab.y;\n}\n#ifdef USE_IRIDESCENCE\nvoid computeMultiscatteringIridescence( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float iridescence, const in vec3 iridescenceF0, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#else\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#endif\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\t#ifdef USE_IRIDESCENCE\n\t\tvec3 Fr = mix( specularColor, iridescenceF0, iridescence );\n\t#else\n\t\tvec3 Fr = specularColor;\n\t#endif\n\tvec3 FssEss = Fr * fab.x + specularF90 * fab.y;\n\tfloat Ess = fab.x + fab.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = Fr + ( 1.0 - Fr ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometryNormal;\n\t\tvec3 viewDir = geometryViewDir;\n\t\tvec3 position = geometryPosition;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.roughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3( 0, 1, 0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNLcc = saturate( dot( geometryClearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = dotNLcc * directLight.color;\n\t\tclearcoatSpecularDirect += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );\n\t#endif\n\treflectedLight.directSpecular += irradiance * BRDF_GGX( directLight.direction, geometryViewDir, geometryNormal, material );\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatSpecularIndirect += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecularIndirect += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n\t#endif\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\t#ifdef USE_IRIDESCENCE\n\t\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness, singleScattering, multiScattering );\n\t#else\n\t\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\n\t#endif\n\tvec3 totalScattering = singleScattering + multiScattering;\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - max( max( totalScattering.r, totalScattering.g ), totalScattering.b ) );\n\treflectedLight.indirectSpecular += radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}",lights_fragment_begin:"\nvec3 geometryPosition = - vViewPosition;\nvec3 geometryNormal = normal;\nvec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\nvec3 geometryClearcoatNormal = vec3( 0.0 );\n#ifdef USE_CLEARCOAT\n\tgeometryClearcoatNormal = clearcoatNormal;\n#endif\n#ifdef USE_IRIDESCENCE\n\tfloat dotNVi = saturate( dot( normal, geometryViewDir ) );\n\tif ( material.iridescenceThickness == 0.0 ) {\n\t\tmaterial.iridescence = 0.0;\n\t} else {\n\t\tmaterial.iridescence = saturate( material.iridescence );\n\t}\n\tif ( material.iridescence > 0.0 ) {\n\t\tmaterial.iridescenceFresnel = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\n\t\tmaterial.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );\n\t}\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointLightInfo( pointLight, geometryPosition, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowIntensity, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\tvec4 spotColor;\n\tvec3 spotLightCoord;\n\tbool inSpotLightMap;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotLightInfo( spotLight, geometryPosition, directLight );\n\t\t#if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX\n\t\t#elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\t#define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS\n\t\t#else\n\t\t#define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#endif\n\t\t#if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS )\n\t\t\tspotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w;\n\t\t\tinSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) );\n\t\t\tspotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy );\n\t\t\tdirectLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color;\n\t\t#endif\n\t\t#undef SPOT_LIGHT_MAP_INDEX\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowIntensity, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalLightInfo( directionalLight, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowIntensity, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 iblIrradiance = vec3( 0.0 );\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#if defined( USE_LIGHT_PROBES )\n\t\tirradiance += getLightProbeIrradiance( lightProbe, geometryNormal );\n\t#endif\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometryNormal );\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n#endif",lights_fragment_maps:"#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n\t\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tiblIrradiance += getIBLIrradiance( geometryNormal );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\t#ifdef USE_ANISOTROPY\n\t\tradiance += getIBLAnisotropyRadiance( geometryViewDir, geometryNormal, material.roughness, material.anisotropyB, material.anisotropy );\n\t#else\n\t\tradiance += getIBLRadiance( geometryViewDir, geometryNormal, material.roughness );\n\t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness );\n\t#endif\n#endif",lights_fragment_end:"#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif",logdepthbuf_fragment:"#if defined( USE_LOGDEPTHBUF )\n\tgl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#if defined( USE_LOGDEPTHBUF )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_pars_vertex:"#ifdef USE_LOGDEPTHBUF\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGDEPTHBUF\n\tvFragDepth = 1.0 + gl_Position.w;\n\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n#endif",map_fragment:"#ifdef USE_MAP\n\tvec4 sampledDiffuseColor = texture2D( map, vMapUv );\n\t#ifdef DECODE_VIDEO_TEXTURE\n\t\tsampledDiffuseColor = sRGBTransferEOTF( sampledDiffuseColor );\n\t#endif\n\tdiffuseColor *= sampledDiffuseColor;\n#endif",map_pars_fragment:"#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif",map_particle_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\t#if defined( USE_POINTS_UV )\n\t\tvec2 uv = vUv;\n\t#else\n\t\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n\t#endif\n#endif\n#ifdef USE_MAP\n\tdiffuseColor *= texture2D( map, uv );\n#endif\n#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\n#endif",map_particle_pars_fragment:"#if defined( USE_POINTS_UV )\n\tvarying vec2 vUv;\n#else\n\t#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\t\tuniform mat3 uvTransform;\n\t#endif\n#endif\n#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif",metalnessmap_fragment:"float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vMetalnessMapUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif",metalnessmap_pars_fragment:"#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",morphinstance_vertex:"#ifdef USE_INSTANCING_MORPH\n\tfloat morphTargetInfluences[ MORPHTARGETS_COUNT ];\n\tfloat morphTargetBaseInfluence = texelFetch( morphTexture, ivec2( 0, gl_InstanceID ), 0 ).r;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\tmorphTargetInfluences[i] = texelFetch( morphTexture, ivec2( i + 1, gl_InstanceID ), 0 ).r;\n\t}\n#endif",morphcolor_vertex:"#if defined( USE_MORPHCOLORS )\n\tvColor *= morphTargetBaseInfluence;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\t#if defined( USE_COLOR_ALPHA )\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ) * morphTargetInfluences[ i ];\n\t\t#elif defined( USE_COLOR )\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ).rgb * morphTargetInfluences[ i ];\n\t\t#endif\n\t}\n#endif",morphnormal_vertex:"#ifdef USE_MORPHNORMALS\n\tobjectNormal *= morphTargetBaseInfluence;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\tif ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ];\n\t}\n#endif",morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n\t#ifndef USE_INSTANCING_MORPH\n\t\tuniform float morphTargetBaseInfluence;\n\t\tuniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\n\t#endif\n\tuniform sampler2DArray morphTargetsTexture;\n\tuniform ivec2 morphTargetsTextureSize;\n\tvec4 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset ) {\n\t\tint texelIndex = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset;\n\t\tint y = texelIndex / morphTargetsTextureSize.x;\n\t\tint x = texelIndex - y * morphTargetsTextureSize.x;\n\t\tivec3 morphUV = ivec3( x, y, morphTargetIndex );\n\t\treturn texelFetch( morphTargetsTexture, morphUV, 0 );\n\t}\n#endif",morphtarget_vertex:"#ifdef USE_MORPHTARGETS\n\ttransformed *= morphTargetBaseInfluence;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\tif ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ];\n\t}\n#endif",normal_fragment_begin:"float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\n#ifdef FLAT_SHADED\n\tvec3 fdx = dFdx( vViewPosition );\n\tvec3 fdy = dFdy( vViewPosition );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal *= faceDirection;\n\t#endif\n#endif\n#if defined( USE_NORMALMAP_TANGENTSPACE ) || defined( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY )\n\t#ifdef USE_TANGENT\n\t\tmat3 tbn = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\n\t#else\n\t\tmat3 tbn = getTangentFrame( - vViewPosition, normal,\n\t\t#if defined( USE_NORMALMAP )\n\t\t\tvNormalMapUv\n\t\t#elif defined( USE_CLEARCOAT_NORMALMAP )\n\t\t\tvClearcoatNormalMapUv\n\t\t#else\n\t\t\tvUv\n\t\t#endif\n\t\t);\n\t#endif\n\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\n\t\ttbn[0] *= faceDirection;\n\t\ttbn[1] *= faceDirection;\n\t#endif\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\t#ifdef USE_TANGENT\n\t\tmat3 tbn2 = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\n\t#else\n\t\tmat3 tbn2 = getTangentFrame( - vViewPosition, normal, vClearcoatNormalMapUv );\n\t#endif\n\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\n\t\ttbn2[0] *= faceDirection;\n\t\ttbn2[1] *= faceDirection;\n\t#endif\n#endif\nvec3 nonPerturbedNormal = normal;",normal_fragment_maps:"#ifdef USE_NORMALMAP_OBJECTSPACE\n\tnormal = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\n\t#ifdef FLIP_SIDED\n\t\tnormal = - normal;\n\t#endif\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * faceDirection;\n\t#endif\n\tnormal = normalize( normalMatrix * normal );\n#elif defined( USE_NORMALMAP_TANGENTSPACE )\n\tvec3 mapN = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\n\tmapN.xy *= normalScale;\n\tnormal = normalize( tbn * mapN );\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\n#endif",normal_pars_fragment:"#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif",normal_pars_vertex:"#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif",normal_vertex:"#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif",normalmap_pars_fragment:"#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n#endif\n#ifdef USE_NORMALMAP_OBJECTSPACE\n\tuniform mat3 normalMatrix;\n#endif\n#if ! defined ( USE_TANGENT ) && ( defined ( USE_NORMALMAP_TANGENTSPACE ) || defined ( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY ) )\n\tmat3 getTangentFrame( vec3 eye_pos, vec3 surf_norm, vec2 uv ) {\n\t\tvec3 q0 = dFdx( eye_pos.xyz );\n\t\tvec3 q1 = dFdy( eye_pos.xyz );\n\t\tvec2 st0 = dFdx( uv.st );\n\t\tvec2 st1 = dFdy( uv.st );\n\t\tvec3 N = surf_norm;\n\t\tvec3 q1perp = cross( q1, N );\n\t\tvec3 q0perp = cross( N, q0 );\n\t\tvec3 T = q1perp * st0.x + q0perp * st1.x;\n\t\tvec3 B = q1perp * st0.y + q0perp * st1.y;\n\t\tfloat det = max( dot( T, T ), dot( B, B ) );\n\t\tfloat scale = ( det == 0.0 ) ? 0.0 : inversesqrt( det );\n\t\treturn mat3( T * scale, B * scale, N );\n\t}\n#endif",clearcoat_normal_fragment_begin:"#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal = nonPerturbedNormal;\n#endif",clearcoat_normal_fragment_maps:"#ifdef USE_CLEARCOAT_NORMALMAP\n\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vClearcoatNormalMapUv ).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\tclearcoatNormal = normalize( tbn2 * clearcoatMapN );\n#endif",clearcoat_pars_fragment:"#ifdef USE_CLEARCOATMAP\n\tuniform sampler2D clearcoatMap;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform sampler2D clearcoatRoughnessMap;\n#endif",iridescence_pars_fragment:"#ifdef USE_IRIDESCENCEMAP\n\tuniform sampler2D iridescenceMap;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tuniform sampler2D iridescenceThicknessMap;\n#endif",opaque_fragment:"#ifdef OPAQUE\ndiffuseColor.a = 1.0;\n#endif\n#ifdef USE_TRANSMISSION\ndiffuseColor.a *= material.transmissionAlpha;\n#endif\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );",packing:"vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;const float ShiftRight8 = 1. / 256.;\nconst float Inv255 = 1. / 255.;\nconst vec4 PackFactors = vec4( 1.0, 256.0, 256.0 * 256.0, 256.0 * 256.0 * 256.0 );\nconst vec2 UnpackFactors2 = vec2( UnpackDownscale, 1.0 / PackFactors.g );\nconst vec3 UnpackFactors3 = vec3( UnpackDownscale / PackFactors.rg, 1.0 / PackFactors.b );\nconst vec4 UnpackFactors4 = vec4( UnpackDownscale / PackFactors.rgb, 1.0 / PackFactors.a );\nvec4 packDepthToRGBA( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec4( 0., 0., 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec4( 1., 1., 1., 1. );\n\tfloat vuf;\n\tfloat af = modf( v * PackFactors.a, vuf );\n\tfloat bf = modf( vuf * ShiftRight8, vuf );\n\tfloat gf = modf( vuf * ShiftRight8, vuf );\n\treturn vec4( vuf * Inv255, gf * PackUpscale, bf * PackUpscale, af );\n}\nvec3 packDepthToRGB( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec3( 0., 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec3( 1., 1., 1. );\n\tfloat vuf;\n\tfloat bf = modf( v * PackFactors.b, vuf );\n\tfloat gf = modf( vuf * ShiftRight8, vuf );\n\treturn vec3( vuf * Inv255, gf * PackUpscale, bf );\n}\nvec2 packDepthToRG( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec2( 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec2( 1., 1. );\n\tfloat vuf;\n\tfloat gf = modf( v * 256., vuf );\n\treturn vec2( vuf * Inv255, gf );\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors4 );\n}\nfloat unpackRGBToDepth( const in vec3 v ) {\n\treturn dot( v, UnpackFactors3 );\n}\nfloat unpackRGToDepth( const in vec2 v ) {\n\treturn v.r * UnpackFactors2.r + v.g * UnpackFactors2.g;\n}\nvec4 pack2HalfToRGBA( const in vec2 v ) {\n\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\n\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\n}\nvec2 unpackRGBATo2Half( const in vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float depth, const in float near, const in float far ) {\n\treturn depth * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float depth, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * depth - far );\n}",premultiplied_alpha_fragment:"#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif",project_vertex:"vec4 mvPosition = vec4( transformed, 1.0 );\n#ifdef USE_BATCHING\n\tmvPosition = batchingMatrix * mvPosition;\n#endif\n#ifdef USE_INSTANCING\n\tmvPosition = instanceMatrix * mvPosition;\n#endif\nmvPosition = modelViewMatrix * mvPosition;\ngl_Position = projectionMatrix * mvPosition;",dithering_fragment:"#ifdef DITHERING\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif",dithering_pars_fragment:"#ifdef DITHERING\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif",roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vRoughnessMapUv );\n\troughnessFactor *= texelRoughness.g;\n#endif",roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#if NUM_SPOT_LIGHT_COORDS > 0\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#if NUM_SPOT_LIGHT_MAPS > 0\n\tuniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ];\n#endif\n#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\n\t\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\n\t}\n\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\n\t\tfloat occlusion = 1.0;\n\t\tvec2 distribution = texture2DDistribution( shadow, uv );\n\t\tfloat hard_shadow = step( compare , distribution.x );\n\t\tif (hard_shadow != 1.0 ) {\n\t\t\tfloat distance = compare - distribution.x ;\n\t\t\tfloat variance = max( 0.00000, distribution.y * distribution.y );\n\t\t\tfloat softness_probability = variance / (variance + distance * distance );\t\t\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\t\t\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\n\t\t}\n\t\treturn occlusion;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tfloat dx2 = dx0 / 2.0;\n\t\t\tfloat dy2 = dy0 / 2.0;\n\t\t\tfloat dx3 = dx1 / 2.0;\n\t\t\tfloat dy3 = dy1 / 2.0;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 17.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx = texelSize.x;\n\t\t\tfloat dy = texelSize.y;\n\t\t\tvec2 uv = shadowCoord.xy;\n\t\t\tvec2 f = fract( uv * shadowMapSize + 0.5 );\n\t\t\tuv -= f * texelSize;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t f.x ),\n\t\t\t\t\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t f.x ),\n\t\t\t\t\t f.y )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\t\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tfloat shadow = 1.0;\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\t\n\t\tfloat lightToPositionLength = length( lightToPosition );\n\t\tif ( lightToPositionLength - shadowCameraFar <= 0.0 && lightToPositionLength - shadowCameraNear >= 0.0 ) {\n\t\t\tfloat dp = ( lightToPositionLength - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\t\tdp += shadowBias;\n\t\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n\t\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\t\tshadow = (\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t\t) * ( 1.0 / 9.0 );\n\t\t\t#else\n\t\t\t\tshadow = texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t\t#endif\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n#endif",shadowmap_pars_vertex:"#if NUM_SPOT_LIGHT_COORDS > 0\n\tuniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ];\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n#endif",shadowmap_vertex:"#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 )\n\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\tvec4 shadowWorldPosition;\n#endif\n#if defined( USE_SHADOWMAP )\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\n\t\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\n\t\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if NUM_SPOT_LIGHT_COORDS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_COORDS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition;\n\t\t#if ( defined( USE_SHADOWMAP ) && UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\t\tshadowWorldPosition.xyz += shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias;\n\t\t#endif\n\t\tvSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n#endif",shadowmask_pars_fragment:"float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tdirectionalLight = directionalLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowIntensity, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tspotLight = spotLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowIntensity, spotLight.shadowBias, spotLight.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tpointLight = pointLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowIntensity, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#endif\n\treturn shadow;\n}",skinbase_vertex:"#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\tuniform highp sampler2D boneTexture;\n\tmat4 getBoneMatrix( const in float i ) {\n\t\tint size = textureSize( boneTexture, 0 ).x;\n\t\tint j = int( i ) * 4;\n\t\tint x = j % size;\n\t\tint y = j / size;\n\t\tvec4 v1 = texelFetch( boneTexture, ivec2( x, y ), 0 );\n\t\tvec4 v2 = texelFetch( boneTexture, ivec2( x + 1, y ), 0 );\n\t\tvec4 v3 = texelFetch( boneTexture, ivec2( x + 2, y ), 0 );\n\t\tvec4 v4 = texelFetch( boneTexture, ivec2( x + 3, y ), 0 );\n\t\treturn mat4( v1, v2, v3, v4 );\n\t}\n#endif",skinning_vertex:"#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif",skinnormal_vertex:"#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\t#ifdef USE_TANGENT\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#endif\n#endif",specularmap_fragment:"float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vSpecularMapUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",specularmap_pars_fragment:"#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",tonemapping_fragment:"#if defined( TONE_MAPPING )\n\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif",tonemapping_pars_fragment:"#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn saturate( toneMappingExposure * color );\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\nvec3 CineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\nvec3 RRTAndODTFit( vec3 v ) {\n\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\n\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\n\treturn a / b;\n}\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\tconst mat3 ACESInputMat = mat3(\n\t\tvec3( 0.59719, 0.07600, 0.02840 ),\t\tvec3( 0.35458, 0.90834, 0.13383 ),\n\t\tvec3( 0.04823, 0.01566, 0.83777 )\n\t);\n\tconst mat3 ACESOutputMat = mat3(\n\t\tvec3( 1.60475, -0.10208, -0.00327 ),\t\tvec3( -0.53108, 1.10813, -0.07276 ),\n\t\tvec3( -0.07367, -0.00605, 1.07602 )\n\t);\n\tcolor *= toneMappingExposure / 0.6;\n\tcolor = ACESInputMat * color;\n\tcolor = RRTAndODTFit( color );\n\tcolor = ACESOutputMat * color;\n\treturn saturate( color );\n}\nconst mat3 LINEAR_REC2020_TO_LINEAR_SRGB = mat3(\n\tvec3( 1.6605, - 0.1246, - 0.0182 ),\n\tvec3( - 0.5876, 1.1329, - 0.1006 ),\n\tvec3( - 0.0728, - 0.0083, 1.1187 )\n);\nconst mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = mat3(\n\tvec3( 0.6274, 0.0691, 0.0164 ),\n\tvec3( 0.3293, 0.9195, 0.0880 ),\n\tvec3( 0.0433, 0.0113, 0.8956 )\n);\nvec3 agxDefaultContrastApprox( vec3 x ) {\n\tvec3 x2 = x * x;\n\tvec3 x4 = x2 * x2;\n\treturn + 15.5 * x4 * x2\n\t\t- 40.14 * x4 * x\n\t\t+ 31.96 * x4\n\t\t- 6.868 * x2 * x\n\t\t+ 0.4298 * x2\n\t\t+ 0.1191 * x\n\t\t- 0.00232;\n}\nvec3 AgXToneMapping( vec3 color ) {\n\tconst mat3 AgXInsetMatrix = mat3(\n\t\tvec3( 0.856627153315983, 0.137318972929847, 0.11189821299995 ),\n\t\tvec3( 0.0951212405381588, 0.761241990602591, 0.0767994186031903 ),\n\t\tvec3( 0.0482516061458583, 0.101439036467562, 0.811302368396859 )\n\t);\n\tconst mat3 AgXOutsetMatrix = mat3(\n\t\tvec3( 1.1271005818144368, - 0.1413297634984383, - 0.14132976349843826 ),\n\t\tvec3( - 0.11060664309660323, 1.157823702216272, - 0.11060664309660294 ),\n\t\tvec3( - 0.016493938717834573, - 0.016493938717834257, 1.2519364065950405 )\n\t);\n\tconst float AgxMinEv = - 12.47393;\tconst float AgxMaxEv = 4.026069;\n\tcolor *= toneMappingExposure;\n\tcolor = LINEAR_SRGB_TO_LINEAR_REC2020 * color;\n\tcolor = AgXInsetMatrix * color;\n\tcolor = max( color, 1e-10 );\tcolor = log2( color );\n\tcolor = ( color - AgxMinEv ) / ( AgxMaxEv - AgxMinEv );\n\tcolor = clamp( color, 0.0, 1.0 );\n\tcolor = agxDefaultContrastApprox( color );\n\tcolor = AgXOutsetMatrix * color;\n\tcolor = pow( max( vec3( 0.0 ), color ), vec3( 2.2 ) );\n\tcolor = LINEAR_REC2020_TO_LINEAR_SRGB * color;\n\tcolor = clamp( color, 0.0, 1.0 );\n\treturn color;\n}\nvec3 NeutralToneMapping( vec3 color ) {\n\tconst float StartCompression = 0.8 - 0.04;\n\tconst float Desaturation = 0.15;\n\tcolor *= toneMappingExposure;\n\tfloat x = min( color.r, min( color.g, color.b ) );\n\tfloat offset = x < 0.08 ? x - 6.25 * x * x : 0.04;\n\tcolor -= offset;\n\tfloat peak = max( color.r, max( color.g, color.b ) );\n\tif ( peak < StartCompression ) return color;\n\tfloat d = 1. - StartCompression;\n\tfloat newPeak = 1. - d * d / ( peak + d - StartCompression );\n\tcolor *= newPeak / peak;\n\tfloat g = 1. - 1. / ( Desaturation * ( peak - newPeak ) + 1. );\n\treturn mix( color, vec3( newPeak ), g );\n}\nvec3 CustomToneMapping( vec3 color ) { return color; }",transmission_fragment:"#ifdef USE_TRANSMISSION\n\tmaterial.transmission = transmission;\n\tmaterial.transmissionAlpha = 1.0;\n\tmaterial.thickness = thickness;\n\tmaterial.attenuationDistance = attenuationDistance;\n\tmaterial.attenuationColor = attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tmaterial.transmission *= texture2D( transmissionMap, vTransmissionMapUv ).r;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tmaterial.thickness *= texture2D( thicknessMap, vThicknessMapUv ).g;\n\t#endif\n\tvec3 pos = vWorldPosition;\n\tvec3 v = normalize( cameraPosition - pos );\n\tvec3 n = inverseTransformDirection( normal, viewMatrix );\n\tvec4 transmitted = getIBLVolumeRefraction(\n\t\tn, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, material.dispersion, material.ior, material.thickness,\n\t\tmaterial.attenuationColor, material.attenuationDistance );\n\tmaterial.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission );\n\ttotalDiffuse = mix( totalDiffuse, transmitted.rgb, material.transmission );\n#endif",transmission_pars_fragment:"#ifdef USE_TRANSMISSION\n\tuniform float transmission;\n\tuniform float thickness;\n\tuniform float attenuationDistance;\n\tuniform vec3 attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tuniform sampler2D transmissionMap;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tuniform sampler2D thicknessMap;\n\t#endif\n\tuniform vec2 transmissionSamplerSize;\n\tuniform sampler2D transmissionSamplerMap;\n\tuniform mat4 modelMatrix;\n\tuniform mat4 projectionMatrix;\n\tvarying vec3 vWorldPosition;\n\tfloat w0( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 );\n\t}\n\tfloat w1( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * ( 3.0 * a - 6.0 ) + 4.0 );\n\t}\n\tfloat w2( float a ){\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 );\n\t}\n\tfloat w3( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * a );\n\t}\n\tfloat g0( float a ) {\n\t\treturn w0( a ) + w1( a );\n\t}\n\tfloat g1( float a ) {\n\t\treturn w2( a ) + w3( a );\n\t}\n\tfloat h0( float a ) {\n\t\treturn - 1.0 + w1( a ) / ( w0( a ) + w1( a ) );\n\t}\n\tfloat h1( float a ) {\n\t\treturn 1.0 + w3( a ) / ( w2( a ) + w3( a ) );\n\t}\n\tvec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, float lod ) {\n\t\tuv = uv * texelSize.zw + 0.5;\n\t\tvec2 iuv = floor( uv );\n\t\tvec2 fuv = fract( uv );\n\t\tfloat g0x = g0( fuv.x );\n\t\tfloat g1x = g1( fuv.x );\n\t\tfloat h0x = h0( fuv.x );\n\t\tfloat h1x = h1( fuv.x );\n\t\tfloat h0y = h0( fuv.y );\n\t\tfloat h1y = h1( fuv.y );\n\t\tvec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\treturn g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) +\n\t\t\tg1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) );\n\t}\n\tvec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) {\n\t\tvec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) );\n\t\tvec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) );\n\t\tvec2 fLodSizeInv = 1.0 / fLodSize;\n\t\tvec2 cLodSizeInv = 1.0 / cLodSize;\n\t\tvec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), floor( lod ) );\n\t\tvec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), ceil( lod ) );\n\t\treturn mix( fSample, cSample, fract( lod ) );\n\t}\n\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\n\t\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\n\t\tvec3 modelScale;\n\t\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\n\t\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\n\t\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\n\t\treturn normalize( refractionVector ) * thickness * modelScale;\n\t}\n\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\n\t\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\n\t}\n\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\n\t\tfloat lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\n\t\treturn textureBicubic( transmissionSamplerMap, fragCoord.xy, lod );\n\t}\n\tvec3 volumeAttenuation( const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tif ( isinf( attenuationDistance ) ) {\n\t\t\treturn vec3( 1.0 );\n\t\t} else {\n\t\t\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\n\t\t\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\t\t\treturn transmittance;\n\t\t}\n\t}\n\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\n\t\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\n\t\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float dispersion, const in float ior, const in float thickness,\n\t\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tvec4 transmittedLight;\n\t\tvec3 transmittance;\n\t\t#ifdef USE_DISPERSION\n\t\t\tfloat halfSpread = ( ior - 1.0 ) * 0.025 * dispersion;\n\t\t\tvec3 iors = vec3( ior - halfSpread, ior, ior + halfSpread );\n\t\t\tfor ( int i = 0; i < 3; i ++ ) {\n\t\t\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, iors[ i ], modelMatrix );\n\t\t\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\t\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\t\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\t\t\trefractionCoords += 1.0;\n\t\t\t\trefractionCoords /= 2.0;\n\t\t\t\tvec4 transmissionSample = getTransmissionSample( refractionCoords, roughness, iors[ i ] );\n\t\t\t\ttransmittedLight[ i ] = transmissionSample[ i ];\n\t\t\t\ttransmittedLight.a += transmissionSample.a;\n\t\t\t\ttransmittance[ i ] = diffuseColor[ i ] * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance )[ i ];\n\t\t\t}\n\t\t\ttransmittedLight.a /= 3.0;\n\t\t#else\n\t\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n\t\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\t\trefractionCoords += 1.0;\n\t\t\trefractionCoords /= 2.0;\n\t\t\ttransmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\n\t\t\ttransmittance = diffuseColor * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance );\n\t\t#endif\n\t\tvec3 attenuatedColor = transmittance * transmittedLight.rgb;\n\t\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\n\t\tfloat transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0;\n\t\treturn vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor );\n\t}\n#endif",uv_pars_fragment:"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvarying vec2 vUv;\n#endif\n#ifdef USE_MAP\n\tvarying vec2 vMapUv;\n#endif\n#ifdef USE_ALPHAMAP\n\tvarying vec2 vAlphaMapUv;\n#endif\n#ifdef USE_LIGHTMAP\n\tvarying vec2 vLightMapUv;\n#endif\n#ifdef USE_AOMAP\n\tvarying vec2 vAoMapUv;\n#endif\n#ifdef USE_BUMPMAP\n\tvarying vec2 vBumpMapUv;\n#endif\n#ifdef USE_NORMALMAP\n\tvarying vec2 vNormalMapUv;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tvarying vec2 vEmissiveMapUv;\n#endif\n#ifdef USE_METALNESSMAP\n\tvarying vec2 vMetalnessMapUv;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tvarying vec2 vRoughnessMapUv;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tvarying vec2 vAnisotropyMapUv;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tvarying vec2 vClearcoatMapUv;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tvarying vec2 vClearcoatNormalMapUv;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tvarying vec2 vClearcoatRoughnessMapUv;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tvarying vec2 vIridescenceMapUv;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tvarying vec2 vIridescenceThicknessMapUv;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tvarying vec2 vSheenColorMapUv;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tvarying vec2 vSheenRoughnessMapUv;\n#endif\n#ifdef USE_SPECULARMAP\n\tvarying vec2 vSpecularMapUv;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tvarying vec2 vSpecularColorMapUv;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tvarying vec2 vSpecularIntensityMapUv;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tuniform mat3 transmissionMapTransform;\n\tvarying vec2 vTransmissionMapUv;\n#endif\n#ifdef USE_THICKNESSMAP\n\tuniform mat3 thicknessMapTransform;\n\tvarying vec2 vThicknessMapUv;\n#endif",uv_pars_vertex:"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvarying vec2 vUv;\n#endif\n#ifdef USE_MAP\n\tuniform mat3 mapTransform;\n\tvarying vec2 vMapUv;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform mat3 alphaMapTransform;\n\tvarying vec2 vAlphaMapUv;\n#endif\n#ifdef USE_LIGHTMAP\n\tuniform mat3 lightMapTransform;\n\tvarying vec2 vLightMapUv;\n#endif\n#ifdef USE_AOMAP\n\tuniform mat3 aoMapTransform;\n\tvarying vec2 vAoMapUv;\n#endif\n#ifdef USE_BUMPMAP\n\tuniform mat3 bumpMapTransform;\n\tvarying vec2 vBumpMapUv;\n#endif\n#ifdef USE_NORMALMAP\n\tuniform mat3 normalMapTransform;\n\tvarying vec2 vNormalMapUv;\n#endif\n#ifdef USE_DISPLACEMENTMAP\n\tuniform mat3 displacementMapTransform;\n\tvarying vec2 vDisplacementMapUv;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tuniform mat3 emissiveMapTransform;\n\tvarying vec2 vEmissiveMapUv;\n#endif\n#ifdef USE_METALNESSMAP\n\tuniform mat3 metalnessMapTransform;\n\tvarying vec2 vMetalnessMapUv;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tuniform mat3 roughnessMapTransform;\n\tvarying vec2 vRoughnessMapUv;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tuniform mat3 anisotropyMapTransform;\n\tvarying vec2 vAnisotropyMapUv;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tuniform mat3 clearcoatMapTransform;\n\tvarying vec2 vClearcoatMapUv;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform mat3 clearcoatNormalMapTransform;\n\tvarying vec2 vClearcoatNormalMapUv;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform mat3 clearcoatRoughnessMapTransform;\n\tvarying vec2 vClearcoatRoughnessMapUv;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tuniform mat3 sheenColorMapTransform;\n\tvarying vec2 vSheenColorMapUv;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tuniform mat3 sheenRoughnessMapTransform;\n\tvarying vec2 vSheenRoughnessMapUv;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tuniform mat3 iridescenceMapTransform;\n\tvarying vec2 vIridescenceMapUv;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tuniform mat3 iridescenceThicknessMapTransform;\n\tvarying vec2 vIridescenceThicknessMapUv;\n#endif\n#ifdef USE_SPECULARMAP\n\tuniform mat3 specularMapTransform;\n\tvarying vec2 vSpecularMapUv;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tuniform mat3 specularColorMapTransform;\n\tvarying vec2 vSpecularColorMapUv;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tuniform mat3 specularIntensityMapTransform;\n\tvarying vec2 vSpecularIntensityMapUv;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tuniform mat3 transmissionMapTransform;\n\tvarying vec2 vTransmissionMapUv;\n#endif\n#ifdef USE_THICKNESSMAP\n\tuniform mat3 thicknessMapTransform;\n\tvarying vec2 vThicknessMapUv;\n#endif",uv_vertex:"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvUv = vec3( uv, 1 ).xy;\n#endif\n#ifdef USE_MAP\n\tvMapUv = ( mapTransform * vec3( MAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ALPHAMAP\n\tvAlphaMapUv = ( alphaMapTransform * vec3( ALPHAMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_LIGHTMAP\n\tvLightMapUv = ( lightMapTransform * vec3( LIGHTMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_AOMAP\n\tvAoMapUv = ( aoMapTransform * vec3( AOMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_BUMPMAP\n\tvBumpMapUv = ( bumpMapTransform * vec3( BUMPMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_NORMALMAP\n\tvNormalMapUv = ( normalMapTransform * vec3( NORMALMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_DISPLACEMENTMAP\n\tvDisplacementMapUv = ( displacementMapTransform * vec3( DISPLACEMENTMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tvEmissiveMapUv = ( emissiveMapTransform * vec3( EMISSIVEMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_METALNESSMAP\n\tvMetalnessMapUv = ( metalnessMapTransform * vec3( METALNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tvRoughnessMapUv = ( roughnessMapTransform * vec3( ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tvAnisotropyMapUv = ( anisotropyMapTransform * vec3( ANISOTROPYMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tvClearcoatMapUv = ( clearcoatMapTransform * vec3( CLEARCOATMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tvClearcoatNormalMapUv = ( clearcoatNormalMapTransform * vec3( CLEARCOAT_NORMALMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tvClearcoatRoughnessMapUv = ( clearcoatRoughnessMapTransform * vec3( CLEARCOAT_ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tvIridescenceMapUv = ( iridescenceMapTransform * vec3( IRIDESCENCEMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tvIridescenceThicknessMapUv = ( iridescenceThicknessMapTransform * vec3( IRIDESCENCE_THICKNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tvSheenColorMapUv = ( sheenColorMapTransform * vec3( SHEEN_COLORMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tvSheenRoughnessMapUv = ( sheenRoughnessMapTransform * vec3( SHEEN_ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULARMAP\n\tvSpecularMapUv = ( specularMapTransform * vec3( SPECULARMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tvSpecularColorMapUv = ( specularColorMapTransform * vec3( SPECULAR_COLORMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tvSpecularIntensityMapUv = ( specularIntensityMapTransform * vec3( SPECULAR_INTENSITYMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tvTransmissionMapUv = ( transmissionMapTransform * vec3( TRANSMISSIONMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_THICKNESSMAP\n\tvThicknessMapUv = ( thicknessMapTransform * vec3( THICKNESSMAP_UV, 1 ) ).xy;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0\n\tvec4 worldPosition = vec4( transformed, 1.0 );\n\t#ifdef USE_BATCHING\n\t\tworldPosition = batchingMatrix * worldPosition;\n\t#endif\n\t#ifdef USE_INSTANCING\n\t\tworldPosition = instanceMatrix * worldPosition;\n\t#endif\n\tworldPosition = modelMatrix * worldPosition;\n#endif",background_vert:"varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n}",background_frag:"uniform sampler2D t2D;\nuniform float backgroundIntensity;\nvarying vec2 vUv;\nvoid main() {\n\tvec4 texColor = texture2D( t2D, vUv );\n\t#ifdef DECODE_VIDEO_TEXTURE\n\t\ttexColor = vec4( mix( pow( texColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), texColor.rgb * 0.0773993808, vec3( lessThanEqual( texColor.rgb, vec3( 0.04045 ) ) ) ), texColor.w );\n\t#endif\n\ttexColor.rgb *= backgroundIntensity;\n\tgl_FragColor = texColor;\n\t#include \n\t#include \n}",backgroundCube_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}",backgroundCube_frag:"#ifdef ENVMAP_TYPE_CUBE\n\tuniform samplerCube envMap;\n#elif defined( ENVMAP_TYPE_CUBE_UV )\n\tuniform sampler2D envMap;\n#endif\nuniform float flipEnvMap;\nuniform float backgroundBlurriness;\nuniform float backgroundIntensity;\nuniform mat3 backgroundRotation;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 texColor = textureCube( envMap, backgroundRotation * vec3( flipEnvMap * vWorldDirection.x, vWorldDirection.yz ) );\n\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\tvec4 texColor = textureCubeUV( envMap, backgroundRotation * vWorldDirection, backgroundBlurriness );\n\t#else\n\t\tvec4 texColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t#endif\n\ttexColor.rgb *= backgroundIntensity;\n\tgl_FragColor = texColor;\n\t#include \n\t#include \n}",cube_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}",cube_frag:"uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldDirection;\nvoid main() {\n\tvec4 texColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) );\n\tgl_FragColor = texColor;\n\tgl_FragColor.a *= opacity;\n\t#include \n\t#include \n}",depth_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvHighPrecisionZW = gl_Position.zw;\n}",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\t#elif DEPTH_PACKING == 3202\n\t\tgl_FragColor = vec4( packDepthToRGB( fragCoordZ ), 1.0 );\n\t#elif DEPTH_PACKING == 3203\n\t\tgl_FragColor = vec4( packDepthToRG( fragCoordZ ), 0.0, 1.0 );\n\t#endif\n}",distanceRGBA_vert:"#define DISTANCE\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition.xyz;\n}",distanceRGBA_frag:"#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main () {\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}",equirect_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}",equirect_frag:"uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV = equirectUv( direction );\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\t#include \n\t#include \n}",linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvLineDistance = scale * lineDistance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshbasic_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n\t\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_vert:"#define LAMBERT\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_frag:"#define LAMBERT\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshmatcap_vert:"#define MATCAP\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n}",meshmatcap_frag:"#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 viewDir = normalize( vViewPosition );\n\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n\tvec3 y = cross( viewDir, x );\n\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\n\t#ifdef USE_MATCAP\n\t\tvec4 matcapColor = texture2D( matcap, uv );\n\t#else\n\t\tvec4 matcapColor = vec4( vec3( mix( 0.2, 0.8, uv.y ) ), 1.0 );\n\t#endif\n\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshnormal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvarying vec3 vViewPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}",meshnormal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvarying vec3 vViewPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( 0.0, 0.0, 0.0, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_FragColor = vec4( packNormalToRGB( normal ), diffuseColor.a );\n\t#ifdef OPAQUE\n\t\tgl_FragColor.a = 1.0;\n\t#endif\n}",meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphysical_vert:"#define STANDARD\nvarying vec3 vViewPosition;\n#ifdef USE_TRANSMISSION\n\tvarying vec3 vWorldPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n#ifdef USE_TRANSMISSION\n\tvWorldPosition = worldPosition.xyz;\n#endif\n}",meshphysical_frag:"#define STANDARD\n#ifdef PHYSICAL\n\t#define IOR\n\t#define USE_SPECULAR\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef IOR\n\tuniform float ior;\n#endif\n#ifdef USE_SPECULAR\n\tuniform float specularIntensity;\n\tuniform vec3 specularColor;\n\t#ifdef USE_SPECULAR_COLORMAP\n\t\tuniform sampler2D specularColorMap;\n\t#endif\n\t#ifdef USE_SPECULAR_INTENSITYMAP\n\t\tuniform sampler2D specularIntensityMap;\n\t#endif\n#endif\n#ifdef USE_CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_DISPERSION\n\tuniform float dispersion;\n#endif\n#ifdef USE_IRIDESCENCE\n\tuniform float iridescence;\n\tuniform float iridescenceIOR;\n\tuniform float iridescenceThicknessMinimum;\n\tuniform float iridescenceThicknessMaximum;\n#endif\n#ifdef USE_SHEEN\n\tuniform vec3 sheenColor;\n\tuniform float sheenRoughness;\n\t#ifdef USE_SHEEN_COLORMAP\n\t\tuniform sampler2D sheenColorMap;\n\t#endif\n\t#ifdef USE_SHEEN_ROUGHNESSMAP\n\t\tuniform sampler2D sheenRoughnessMap;\n\t#endif\n#endif\n#ifdef USE_ANISOTROPY\n\tuniform vec2 anisotropyVector;\n\t#ifdef USE_ANISOTROPYMAP\n\t\tuniform sampler2D anisotropyMap;\n\t#endif\n#endif\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\n\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\n\t#include \n\tvec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\n\t#ifdef USE_SHEEN\n\t\tfloat sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );\n\t\toutgoingLight = outgoingLight * sheenEnergyComp + sheenSpecularDirect + sheenSpecularIndirect;\n\t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNVcc = saturate( dot( geometryClearcoatNormal, geometryViewDir ) );\n\t\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\n\t\toutgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + ( clearcoatSpecularDirect + clearcoatSpecularIndirect ) * material.clearcoat;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshtoon_vert:"#define TOON\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}",meshtoon_frag:"#define TOON\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",points_vert:"uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \n#ifdef USE_POINTS_UV\n\tvarying vec2 vUv;\n\tuniform mat3 uvTransform;\n#endif\nvoid main() {\n\t#ifdef USE_POINTS_UV\n\t\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_PointSize = size;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n}",points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",shadow_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",shadow_frag:"uniform vec3 color;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include \n\t#include \n\t#include \n}",sprite_vert:"uniform float rotation;\nuniform vec2 center;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 mvPosition = modelViewMatrix[ 3 ];\n\tvec2 scale = vec2( length( modelMatrix[ 0 ].xyz ), length( modelMatrix[ 1 ].xyz ) );\n\t#ifndef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\t#endif\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}",sprite_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n}"},wn={common:{diffuse:{value:new n(16777215)},opacity:{value:1},map:{value:null},mapTransform:{value:new e},alphaMap:{value:null},alphaMapTransform:{value:new e},alphaTest:{value:0}},specularmap:{specularMap:{value:null},specularMapTransform:{value:new e}},envmap:{envMap:{value:null},envMapRotation:{value:new e},flipEnvMap:{value:-1},reflectivity:{value:1},ior:{value:1.5},refractionRatio:{value:.98}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1},aoMapTransform:{value:new e}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1},lightMapTransform:{value:new e}},bumpmap:{bumpMap:{value:null},bumpMapTransform:{value:new e},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalMapTransform:{value:new e},normalScale:{value:new t(1,1)}},displacementmap:{displacementMap:{value:null},displacementMapTransform:{value:new e},displacementScale:{value:1},displacementBias:{value:0}},emissivemap:{emissiveMap:{value:null},emissiveMapTransform:{value:new e}},metalnessmap:{metalnessMap:{value:null},metalnessMapTransform:{value:new e}},roughnessmap:{roughnessMap:{value:null},roughnessMapTransform:{value:new e}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new n(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotLightMap:{value:[]},spotShadowMap:{value:[]},spotLightMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}},ltc_1:{value:null},ltc_2:{value:null}},points:{diffuse:{value:new n(16777215)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},alphaMapTransform:{value:new e},alphaTest:{value:0},uvTransform:{value:new e}},sprite:{diffuse:{value:new n(16777215)},opacity:{value:1},center:{value:new t(.5,.5)},rotation:{value:0},map:{value:null},mapTransform:{value:new e},alphaMap:{value:null},alphaMapTransform:{value:new e},alphaTest:{value:0}}},yn={basic:{uniforms:r([wn.common,wn.specularmap,wn.envmap,wn.aomap,wn.lightmap,wn.fog]),vertexShader:Dn.meshbasic_vert,fragmentShader:Dn.meshbasic_frag},lambert:{uniforms:r([wn.common,wn.specularmap,wn.envmap,wn.aomap,wn.lightmap,wn.emissivemap,wn.bumpmap,wn.normalmap,wn.displacementmap,wn.fog,wn.lights,{emissive:{value:new n(0)}}]),vertexShader:Dn.meshlambert_vert,fragmentShader:Dn.meshlambert_frag},phong:{uniforms:r([wn.common,wn.specularmap,wn.envmap,wn.aomap,wn.lightmap,wn.emissivemap,wn.bumpmap,wn.normalmap,wn.displacementmap,wn.fog,wn.lights,{emissive:{value:new n(0)},specular:{value:new n(1118481)},shininess:{value:30}}]),vertexShader:Dn.meshphong_vert,fragmentShader:Dn.meshphong_frag},standard:{uniforms:r([wn.common,wn.envmap,wn.aomap,wn.lightmap,wn.emissivemap,wn.bumpmap,wn.normalmap,wn.displacementmap,wn.roughnessmap,wn.metalnessmap,wn.fog,wn.lights,{emissive:{value:new n(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:Dn.meshphysical_vert,fragmentShader:Dn.meshphysical_frag},toon:{uniforms:r([wn.common,wn.aomap,wn.lightmap,wn.emissivemap,wn.bumpmap,wn.normalmap,wn.displacementmap,wn.gradientmap,wn.fog,wn.lights,{emissive:{value:new n(0)}}]),vertexShader:Dn.meshtoon_vert,fragmentShader:Dn.meshtoon_frag},matcap:{uniforms:r([wn.common,wn.bumpmap,wn.normalmap,wn.displacementmap,wn.fog,{matcap:{value:null}}]),vertexShader:Dn.meshmatcap_vert,fragmentShader:Dn.meshmatcap_frag},points:{uniforms:r([wn.points,wn.fog]),vertexShader:Dn.points_vert,fragmentShader:Dn.points_frag},dashed:{uniforms:r([wn.common,wn.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:Dn.linedashed_vert,fragmentShader:Dn.linedashed_frag},depth:{uniforms:r([wn.common,wn.displacementmap]),vertexShader:Dn.depth_vert,fragmentShader:Dn.depth_frag},normal:{uniforms:r([wn.common,wn.bumpmap,wn.normalmap,wn.displacementmap,{opacity:{value:1}}]),vertexShader:Dn.meshnormal_vert,fragmentShader:Dn.meshnormal_frag},sprite:{uniforms:r([wn.sprite,wn.fog]),vertexShader:Dn.sprite_vert,fragmentShader:Dn.sprite_frag},background:{uniforms:{uvTransform:{value:new e},t2D:{value:null},backgroundIntensity:{value:1}},vertexShader:Dn.background_vert,fragmentShader:Dn.background_frag},backgroundCube:{uniforms:{envMap:{value:null},flipEnvMap:{value:-1},backgroundBlurriness:{value:0},backgroundIntensity:{value:1},backgroundRotation:{value:new e}},vertexShader:Dn.backgroundCube_vert,fragmentShader:Dn.backgroundCube_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:Dn.cube_vert,fragmentShader:Dn.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:Dn.equirect_vert,fragmentShader:Dn.equirect_frag},distanceRGBA:{uniforms:r([wn.common,wn.displacementmap,{referencePosition:{value:new i},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:Dn.distanceRGBA_vert,fragmentShader:Dn.distanceRGBA_frag},shadow:{uniforms:r([wn.lights,wn.fog,{color:{value:new n(0)},opacity:{value:1}}]),vertexShader:Dn.shadow_vert,fragmentShader:Dn.shadow_frag}};yn.physical={uniforms:r([yn.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatMapTransform:{value:new e},clearcoatNormalMap:{value:null},clearcoatNormalMapTransform:{value:new e},clearcoatNormalScale:{value:new t(1,1)},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatRoughnessMapTransform:{value:new e},dispersion:{value:0},iridescence:{value:0},iridescenceMap:{value:null},iridescenceMapTransform:{value:new e},iridescenceIOR:{value:1.3},iridescenceThicknessMinimum:{value:100},iridescenceThicknessMaximum:{value:400},iridescenceThicknessMap:{value:null},iridescenceThicknessMapTransform:{value:new e},sheen:{value:0},sheenColor:{value:new n(0)},sheenColorMap:{value:null},sheenColorMapTransform:{value:new e},sheenRoughness:{value:1},sheenRoughnessMap:{value:null},sheenRoughnessMapTransform:{value:new e},transmission:{value:0},transmissionMap:{value:null},transmissionMapTransform:{value:new e},transmissionSamplerSize:{value:new t},transmissionSamplerMap:{value:null},thickness:{value:0},thicknessMap:{value:null},thicknessMapTransform:{value:new e},attenuationDistance:{value:0},attenuationColor:{value:new n(0)},specularColor:{value:new n(1,1,1)},specularColorMap:{value:null},specularColorMapTransform:{value:new e},specularIntensity:{value:1},specularIntensityMap:{value:null},specularIntensityMapTransform:{value:new e},anisotropyVector:{value:new t},anisotropyMap:{value:null},anisotropyMapTransform:{value:new e}}]),vertexShader:Dn.meshphysical_vert,fragmentShader:Dn.meshphysical_frag};const In={r:0,b:0,g:0},Nn=new u,On=new f;function Fn(e,t,r,i,u,f,v){const E=new n(0);let S,T,M=!0===f?0:1,x=null,R=0,A=null;function b(e){let n=!0===e.isScene?e.background:null;if(n&&n.isTexture){n=(e.backgroundBlurriness>0?r:t).get(n)}return n}function C(t,n){t.getRGB(In,g(e)),i.buffers.color.setClear(In.r,In.g,In.b,n,v)}return{getClearColor:function(){return E},setClearColor:function(e,t=1){E.set(e),M=t,C(E,M)},getClearAlpha:function(){return M},setClearAlpha:function(e){M=e,C(E,M)},render:function(t){let n=!1;const r=b(t);null===r?C(E,M):r&&r.isColor&&(C(r,1),n=!0);const a=e.xr.getEnvironmentBlendMode();"additive"===a?i.buffers.color.setClear(0,0,0,1,v):"alpha-blend"===a&&i.buffers.color.setClear(0,0,0,0,v),(e.autoClear||n)&&(i.buffers.depth.setTest(!0),i.buffers.depth.setMask(!0),i.buffers.color.setMask(!0),e.clear(e.autoClearColor,e.autoClearDepth,e.autoClearStencil))},addToRenderList:function(t,n){const r=b(n);r&&(r.isCubeTexture||r.mapping===a)?(void 0===T&&(T=new o(new s(1,1,1),new l({name:"BackgroundCubeMaterial",uniforms:d(yn.backgroundCube.uniforms),vertexShader:yn.backgroundCube.vertexShader,fragmentShader:yn.backgroundCube.fragmentShader,side:c,depthTest:!1,depthWrite:!1,fog:!1,allowOverride:!1})),T.geometry.deleteAttribute("normal"),T.geometry.deleteAttribute("uv"),T.onBeforeRender=function(e,t,n){this.matrixWorld.copyPosition(n.matrixWorld)},Object.defineProperty(T.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),u.update(T)),Nn.copy(n.backgroundRotation),Nn.x*=-1,Nn.y*=-1,Nn.z*=-1,r.isCubeTexture&&!1===r.isRenderTargetTexture&&(Nn.y*=-1,Nn.z*=-1),T.material.uniforms.envMap.value=r,T.material.uniforms.flipEnvMap.value=r.isCubeTexture&&!1===r.isRenderTargetTexture?-1:1,T.material.uniforms.backgroundBlurriness.value=n.backgroundBlurriness,T.material.uniforms.backgroundIntensity.value=n.backgroundIntensity,T.material.uniforms.backgroundRotation.value.setFromMatrix4(On.makeRotationFromEuler(Nn)),T.material.toneMapped=p.getTransfer(r.colorSpace)!==m,x===r&&R===r.version&&A===e.toneMapping||(T.material.needsUpdate=!0,x=r,R=r.version,A=e.toneMapping),T.layers.enableAll(),t.unshift(T,T.geometry,T.material,0,0,null)):r&&r.isTexture&&(void 0===S&&(S=new o(new h(2,2),new l({name:"BackgroundMaterial",uniforms:d(yn.background.uniforms),vertexShader:yn.background.vertexShader,fragmentShader:yn.background.fragmentShader,side:_,depthTest:!1,depthWrite:!1,fog:!1,allowOverride:!1})),S.geometry.deleteAttribute("normal"),Object.defineProperty(S.material,"map",{get:function(){return this.uniforms.t2D.value}}),u.update(S)),S.material.uniforms.t2D.value=r,S.material.uniforms.backgroundIntensity.value=n.backgroundIntensity,S.material.toneMapped=p.getTransfer(r.colorSpace)!==m,!0===r.matrixAutoUpdate&&r.updateMatrix(),S.material.uniforms.uvTransform.value.copy(r.matrix),x===r&&R===r.version&&A===e.toneMapping||(S.material.needsUpdate=!0,x=r,R=r.version,A=e.toneMapping),S.layers.enableAll(),t.unshift(S,S.geometry,S.material,0,0,null))},dispose:function(){void 0!==T&&(T.geometry.dispose(),T.material.dispose(),T=void 0),void 0!==S&&(S.geometry.dispose(),S.material.dispose(),S=void 0)}}}function Bn(e,t){const n=e.getParameter(e.MAX_VERTEX_ATTRIBS),r={},i=c(null);let a=i,o=!1;function s(t){return e.bindVertexArray(t)}function l(t){return e.deleteVertexArray(t)}function c(e){const t=[],r=[],i=[];for(let e=0;e=0){const n=i[t];let r=o[t];if(void 0===r&&("instanceMatrix"===t&&e.instanceMatrix&&(r=e.instanceMatrix),"instanceColor"===t&&e.instanceColor&&(r=e.instanceColor)),void 0===n)return!0;if(n.attribute!==r)return!0;if(r&&n.data!==r.data)return!0;s++}}return a.attributesNum!==s||a.index!==r}(n,h,l,_),g&&function(e,t,n,r){const i={},o=t.attributes;let s=0;const l=n.getAttributes();for(const t in l){if(l[t].location>=0){let n=o[t];void 0===n&&("instanceMatrix"===t&&e.instanceMatrix&&(n=e.instanceMatrix),"instanceColor"===t&&e.instanceColor&&(n=e.instanceColor));const r={};r.attribute=n,n&&n.data&&(r.data=n.data),i[t]=r,s++}}a.attributes=i,a.attributesNum=s,a.index=r}(n,h,l,_),null!==_&&t.update(_,e.ELEMENT_ARRAY_BUFFER),(g||o)&&(o=!1,function(n,r,i,a){d();const o=a.attributes,s=i.getAttributes(),l=r.defaultAttributeValues;for(const r in s){const i=s[r];if(i.location>=0){let s=o[r];if(void 0===s&&("instanceMatrix"===r&&n.instanceMatrix&&(s=n.instanceMatrix),"instanceColor"===r&&n.instanceColor&&(s=n.instanceColor)),void 0!==s){const r=s.normalized,o=s.itemSize,l=t.get(s);if(void 0===l)continue;const c=l.buffer,d=l.type,p=l.bytesPerElement,h=d===e.INT||d===e.UNSIGNED_INT||s.gpuType===v;if(s.isInterleavedBufferAttribute){const t=s.data,l=t.stride,_=s.offset;if(t.isInstancedInterleavedBuffer){for(let e=0;e0&&e.getShaderPrecisionFormat(e.FRAGMENT_SHADER,e.HIGH_FLOAT).precision>0)return"highp";t="mediump"}return"mediump"===t&&e.getShaderPrecisionFormat(e.VERTEX_SHADER,e.MEDIUM_FLOAT).precision>0&&e.getShaderPrecisionFormat(e.FRAGMENT_SHADER,e.MEDIUM_FLOAT).precision>0?"mediump":"lowp"}let o=void 0!==n.precision?n.precision:"highp";const s=a(o);s!==o&&(console.warn("THREE.WebGLRenderer:",o,"not supported, using",s,"instead."),o=s);const l=!0===n.logarithmicDepthBuffer,c=!0===n.reverseDepthBuffer&&t.has("EXT_clip_control"),d=e.getParameter(e.MAX_TEXTURE_IMAGE_UNITS),u=e.getParameter(e.MAX_VERTEX_TEXTURE_IMAGE_UNITS);return{isWebGL2:!0,getMaxAnisotropy:function(){if(void 0!==i)return i;if(!0===t.has("EXT_texture_filter_anisotropic")){const n=t.get("EXT_texture_filter_anisotropic");i=e.getParameter(n.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else i=0;return i},getMaxPrecision:a,textureFormatReadable:function(t){return t===M||r.convert(t)===e.getParameter(e.IMPLEMENTATION_COLOR_READ_FORMAT)},textureTypeReadable:function(n){const i=n===E&&(t.has("EXT_color_buffer_half_float")||t.has("EXT_color_buffer_float"));return!(n!==S&&r.convert(n)!==e.getParameter(e.IMPLEMENTATION_COLOR_READ_TYPE)&&n!==T&&!i)},precision:o,logarithmicDepthBuffer:l,reverseDepthBuffer:c,maxTextures:d,maxVertexTextures:u,maxTextureSize:e.getParameter(e.MAX_TEXTURE_SIZE),maxCubemapSize:e.getParameter(e.MAX_CUBE_MAP_TEXTURE_SIZE),maxAttributes:e.getParameter(e.MAX_VERTEX_ATTRIBS),maxVertexUniforms:e.getParameter(e.MAX_VERTEX_UNIFORM_VECTORS),maxVaryings:e.getParameter(e.MAX_VARYING_VECTORS),maxFragmentUniforms:e.getParameter(e.MAX_FRAGMENT_UNIFORM_VECTORS),vertexTextures:u>0,maxSamples:e.getParameter(e.MAX_SAMPLES)}}function Vn(t){const n=this;let r=null,i=0,a=!1,o=!1;const s=new x,l=new e,c={value:null,needsUpdate:!1};function d(e,t,r,i){const a=null!==e?e.length:0;let o=null;if(0!==a){if(o=c.value,!0!==i||null===o){const n=r+4*a,i=t.matrixWorldInverse;l.getNormalMatrix(i),(null===o||o.length0);n.numPlanes=i,n.numIntersection=0}();else{const e=o?0:i,t=4*e;let n=m.clippingState||null;c.value=n,n=d(u,s,t,l);for(let e=0;e!==t;++e)n[e]=r[e];m.clippingState=n,this.numIntersection=f?this.numPlanes:0,this.numPlanes+=e}}}function zn(e){let t=new WeakMap;function n(e,t){return t===R?e.mapping=C:t===A&&(e.mapping=L),e}function r(e){const n=e.target;n.removeEventListener("dispose",r);const i=t.get(n);void 0!==i&&(t.delete(n),i.dispose())}return{get:function(i){if(i&&i.isTexture){const a=i.mapping;if(a===R||a===A){if(t.has(i)){return n(t.get(i).texture,i.mapping)}{const a=i.image;if(a&&a.height>0){const o=new b(a.height);return o.fromEquirectangularTexture(e,i),t.set(i,o),i.addEventListener("dispose",r),n(o.texture,i.mapping)}return null}}}return i},dispose:function(){t=new WeakMap}}}const kn=[.125,.215,.35,.446,.526,.582],Wn=20,Xn=new P,Yn=new n;let Kn=null,jn=0,qn=0,Zn=!1;const $n=(1+Math.sqrt(5))/2,Qn=1/$n,Jn=[new i(-$n,Qn,0),new i($n,Qn,0),new i(-Qn,0,$n),new i(Qn,0,$n),new i(0,$n,-Qn),new i(0,$n,Qn),new i(-1,1,-1),new i(1,1,-1),new i(-1,1,1),new i(1,1,1)],er=new i;class tr{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._lodPlanes=[],this._sizeLods=[],this._sigmas=[],this._blurMaterial=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._compileMaterial(this._blurMaterial)}fromScene(e,t=0,n=.1,r=100,i={}){const{size:a=256,position:o=er}=i;Kn=this._renderer.getRenderTarget(),jn=this._renderer.getActiveCubeFace(),qn=this._renderer.getActiveMipmapLevel(),Zn=this._renderer.xr.enabled,this._renderer.xr.enabled=!1,this._setSize(a);const s=this._allocateTargets();return s.depthBuffer=!0,this._sceneToCubeUV(e,n,r,s,o),t>0&&this._blur(s,0,0,t),this._applyPMREM(s),this._cleanup(s),s}fromEquirectangular(e,t=null){return this._fromTexture(e,t)}fromCubemap(e,t=null){return this._fromTexture(e,t)}compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=ar(),this._compileMaterial(this._cubemapMaterial))}compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=ir(),this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),null!==this._cubemapMaterial&&this._cubemapMaterial.dispose(),null!==this._equirectMaterial&&this._equirectMaterial.dispose()}_setSize(e){this._lodMax=Math.floor(Math.log2(e)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){null!==this._blurMaterial&&this._blurMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;ee-4?s=kn[o-e+4-1]:0===o&&(s=0),r.push(s);const l=1/(a-2),c=-l,d=1+l,u=[c,c,d,c,d,d,c,c,d,d,c,d],f=6,p=6,m=3,h=2,_=1,g=new Float32Array(m*p*f),v=new Float32Array(h*p*f),E=new Float32Array(_*p*f);for(let e=0;e2?0:-1,r=[t,n,0,t+2/3,n,0,t+2/3,n+1,0,t,n,0,t+2/3,n+1,0,t,n+1,0];g.set(r,m*p*e),v.set(u,h*p*e);const i=[e,e,e,e,e,e];E.set(i,_*p*e)}const S=new N;S.setAttribute("position",new O(g,m)),S.setAttribute("uv",new O(v,h)),S.setAttribute("faceIndex",new O(E,_)),t.push(S),i>4&&i--}return{lodPlanes:t,sizeLods:n,sigmas:r}}(r)),this._blurMaterial=function(e,t,n){const r=new Float32Array(Wn),a=new i(0,1,0),o=new l({name:"SphericalGaussianBlur",defines:{n:Wn,CUBEUV_TEXEL_WIDTH:1/t,CUBEUV_TEXEL_HEIGHT:1/n,CUBEUV_MAX_MIP:`${e}.0`},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:r},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:a}},vertexShader:or(),fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform int samples;\n\t\t\tuniform float weights[ n ];\n\t\t\tuniform bool latitudinal;\n\t\t\tuniform float dTheta;\n\t\t\tuniform float mipInt;\n\t\t\tuniform vec3 poleAxis;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include \n\n\t\t\tvec3 getSample( float theta, vec3 axis ) {\n\n\t\t\t\tfloat cosTheta = cos( theta );\n\t\t\t\t// Rodrigues' axis-angle rotation\n\t\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross( axis, vOutputDirection ) * sin( theta )\n\t\t\t\t\t+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n\n\t\t\t\treturn bilinearCubeUV( envMap, sampleDirection, mipInt );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n\n\t\t\t\tif ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n\n\t\t\t\t\taxis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n\n\t\t\t\t}\n\n\t\t\t\taxis = normalize( axis );\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n\n\t\t\t\tfor ( int i = 1; i < n; i++ ) {\n\n\t\t\t\t\tif ( i >= samples ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat theta = dTheta * float( i );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t",blending:y,depthTest:!1,depthWrite:!1});return o}(r,e,t)}return r}_compileMaterial(e){const t=new o(this._lodPlanes[0],e);this._renderer.compile(t,Xn)}_sceneToCubeUV(e,t,n,r,i){const a=new U(90,1,t,n),l=[1,-1,1,1,1,1],d=[1,1,1,-1,-1,-1],u=this._renderer,f=u.autoClear,p=u.toneMapping;u.getClearColor(Yn),u.toneMapping=D,u.autoClear=!1;const m=new w({name:"PMREM.Background",side:c,depthWrite:!1,depthTest:!1}),h=new o(new s,m);let _=!1;const g=e.background;g?g.isColor&&(m.color.copy(g),e.background=null,_=!0):(m.color.copy(Yn),_=!0);for(let t=0;t<6;t++){const n=t%3;0===n?(a.up.set(0,l[t],0),a.position.set(i.x,i.y,i.z),a.lookAt(i.x+d[t],i.y,i.z)):1===n?(a.up.set(0,0,l[t]),a.position.set(i.x,i.y,i.z),a.lookAt(i.x,i.y+d[t],i.z)):(a.up.set(0,l[t],0),a.position.set(i.x,i.y,i.z),a.lookAt(i.x,i.y,i.z+d[t]));const o=this._cubeSize;rr(r,n*o,t>2?o:0,o,o),u.setRenderTarget(r),_&&u.render(h,a),u.render(e,a)}h.geometry.dispose(),h.material.dispose(),u.toneMapping=p,u.autoClear=f,e.background=g}_textureToCubeUV(e,t){const n=this._renderer,r=e.mapping===C||e.mapping===L;r?(null===this._cubemapMaterial&&(this._cubemapMaterial=ar()),this._cubemapMaterial.uniforms.flipEnvMap.value=!1===e.isRenderTargetTexture?-1:1):null===this._equirectMaterial&&(this._equirectMaterial=ir());const i=r?this._cubemapMaterial:this._equirectMaterial,a=new o(this._lodPlanes[0],i);i.uniforms.envMap.value=e;const s=this._cubeSize;rr(t,0,0,3*s,2*s),n.setRenderTarget(t),n.render(a,Xn)}_applyPMREM(e){const t=this._renderer,n=t.autoClear;t.autoClear=!1;const r=this._lodPlanes.length;for(let t=1;tWn&&console.warn(`sigmaRadians, ${i}, is too large and will clip, as it requested ${h} samples when the maximum is set to 20`);const _=[];let g=0;for(let e=0;ev-4?r-v+4:0),4*(this._cubeSize-E),3*E,2*E),l.setRenderTarget(t),l.render(d,Xn)}}function nr(e,t,n){const r=new I(e,t,n);return r.texture.mapping=a,r.texture.name="PMREM.cubeUv",r.scissorTest=!0,r}function rr(e,t,n,r,i){e.viewport.set(t,n,r,i),e.scissor.set(t,n,r,i)}function ir(){return new l({name:"EquirectangularToCubeUV",uniforms:{envMap:{value:null}},vertexShader:or(),fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\n\t\t\t#include \n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tgl_FragColor = vec4( texture2D ( envMap, uv ).rgb, 1.0 );\n\n\t\t\t}\n\t\t",blending:y,depthTest:!1,depthWrite:!1})}function ar(){return new l({name:"CubemapToCubeUV",uniforms:{envMap:{value:null},flipEnvMap:{value:-1}},vertexShader:or(),fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tuniform float flipEnvMap;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = textureCube( envMap, vec3( flipEnvMap * vOutputDirection.x, vOutputDirection.yz ) );\n\n\t\t\t}\n\t\t",blending:y,depthTest:!1,depthWrite:!1})}function or(){return"\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t"}function sr(e){let t=new WeakMap,n=null;function r(e){const n=e.target;n.removeEventListener("dispose",r);const i=t.get(n);void 0!==i&&(t.delete(n),i.dispose())}return{get:function(i){if(i&&i.isTexture){const a=i.mapping,o=a===R||a===A,s=a===C||a===L;if(o||s){let a=t.get(i);const l=void 0!==a?a.texture.pmremVersion:0;if(i.isRenderTargetTexture&&i.pmremVersion!==l)return null===n&&(n=new tr(e)),a=o?n.fromEquirectangular(i,a):n.fromCubemap(i,a),a.texture.pmremVersion=i.pmremVersion,t.set(i,a),a.texture;if(void 0!==a)return a.texture;{const l=i.image;return o&&l&&l.height>0||s&&l&&function(e){let t=0;const n=6;for(let r=0;rn.maxTextureSize&&(M=Math.ceil(S/n.maxTextureSize),S=n.maxTextureSize);const x=new Float32Array(S*M*4*u),R=new W(x,S,M,u);R.type=T,R.needsUpdate=!0;const A=4*E;for(let C=0;C0)return e;const i=t*n;let a=Er[i];if(void 0===a&&(a=new Float32Array(i),Er[i]=a),0!==t){r.toArray(a,0);for(let r=1,i=0;r!==t;++r)i+=n,e[r].toArray(a,i)}return a}function Ar(e,t){if(e.length!==t.length)return!1;for(let n=0,r=e.length;n":" "} ${i}: ${n[e]}`)}return r.join("\n")}(e.getShaderSource(t),r)}return i}function xi(e,t){const n=function(e){p._getMatrix(Ti,p.workingColorSpace,e);const t=`mat3( ${Ti.elements.map((e=>e.toFixed(4)))} )`;switch(p.getTransfer(e)){case se:return[t,"LinearTransferOETF"];case m:return[t,"sRGBTransferOETF"];default:return console.warn("THREE.WebGLProgram: Unsupported color space: ",e),[t,"LinearTransferOETF"]}}(t);return[`vec4 ${e}( vec4 value ) {`,`\treturn ${n[1]}( vec4( value.rgb * ${n[0]}, value.a ) );`,"}"].join("\n")}function Ri(e,t){let n;switch(t){case oe:n="Linear";break;case ae:n="Reinhard";break;case ie:n="Cineon";break;case re:n="ACESFilmic";break;case ne:n="AgX";break;case te:n="Neutral";break;case ee:n="Custom";break;default:console.warn("THREE.WebGLProgram: Unsupported toneMapping:",t),n="Linear"}return"vec3 "+e+"( vec3 color ) { return "+n+"ToneMapping( color ); }"}const Ai=new i;function bi(){p.getLuminanceCoefficients(Ai);return["float luminance( const in vec3 rgb ) {",`\tconst vec3 weights = vec3( ${Ai.x.toFixed(4)}, ${Ai.y.toFixed(4)}, ${Ai.z.toFixed(4)} );`,"\treturn dot( weights, rgb );","}"].join("\n")}function Ci(e){return""!==e}function Li(e,t){const n=t.numSpotLightShadows+t.numSpotLightMaps-t.numSpotLightShadowsWithMaps;return e.replace(/NUM_DIR_LIGHTS/g,t.numDirLights).replace(/NUM_SPOT_LIGHTS/g,t.numSpotLights).replace(/NUM_SPOT_LIGHT_MAPS/g,t.numSpotLightMaps).replace(/NUM_SPOT_LIGHT_COORDS/g,n).replace(/NUM_RECT_AREA_LIGHTS/g,t.numRectAreaLights).replace(/NUM_POINT_LIGHTS/g,t.numPointLights).replace(/NUM_HEMI_LIGHTS/g,t.numHemiLights).replace(/NUM_DIR_LIGHT_SHADOWS/g,t.numDirLightShadows).replace(/NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS/g,t.numSpotLightShadowsWithMaps).replace(/NUM_SPOT_LIGHT_SHADOWS/g,t.numSpotLightShadows).replace(/NUM_POINT_LIGHT_SHADOWS/g,t.numPointLightShadows)}function Pi(e,t){return e.replace(/NUM_CLIPPING_PLANES/g,t.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g,t.numClippingPlanes-t.numClipIntersection)}const Ui=/^[ \t]*#include +<([\w\d./]+)>/gm;function Di(e){return e.replace(Ui,yi)}const wi=new Map;function yi(e,t){let n=Dn[t];if(void 0===n){const e=wi.get(t);if(void 0===e)throw new Error("Can not resolve #include <"+t+">");n=Dn[e],console.warn('THREE.WebGLRenderer: Shader chunk "%s" has been deprecated. Use "%s" instead.',t,e)}return Di(n)}const Ii=/#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g;function Ni(e){return e.replace(Ii,Oi)}function Oi(e,t,n,r){let i="";for(let e=parseInt(t);e0&&(g+="\n"),v=["#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,h].filter(Ci).join("\n"),v.length>0&&(v+="\n")):(g=[Fi(n),"#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,h,n.extensionClipCullDistance?"#define USE_CLIP_DISTANCE":"",n.batching?"#define USE_BATCHING":"",n.batchingColor?"#define USE_BATCHING_COLOR":"",n.instancing?"#define USE_INSTANCING":"",n.instancingColor?"#define USE_INSTANCING_COLOR":"",n.instancingMorph?"#define USE_INSTANCING_MORPH":"",n.useFog&&n.fog?"#define USE_FOG":"",n.useFog&&n.fogExp2?"#define FOG_EXP2":"",n.map?"#define USE_MAP":"",n.envMap?"#define USE_ENVMAP":"",n.envMap?"#define "+u:"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",n.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",n.displacementMap?"#define USE_DISPLACEMENTMAP":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.anisotropy?"#define USE_ANISOTROPY":"",n.anisotropyMap?"#define USE_ANISOTROPYMAP":"",n.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",n.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",n.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.alphaHash?"#define USE_ALPHAHASH":"",n.transmission?"#define USE_TRANSMISSION":"",n.transmissionMap?"#define USE_TRANSMISSIONMAP":"",n.thicknessMap?"#define USE_THICKNESSMAP":"",n.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",n.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",n.mapUv?"#define MAP_UV "+n.mapUv:"",n.alphaMapUv?"#define ALPHAMAP_UV "+n.alphaMapUv:"",n.lightMapUv?"#define LIGHTMAP_UV "+n.lightMapUv:"",n.aoMapUv?"#define AOMAP_UV "+n.aoMapUv:"",n.emissiveMapUv?"#define EMISSIVEMAP_UV "+n.emissiveMapUv:"",n.bumpMapUv?"#define BUMPMAP_UV "+n.bumpMapUv:"",n.normalMapUv?"#define NORMALMAP_UV "+n.normalMapUv:"",n.displacementMapUv?"#define DISPLACEMENTMAP_UV "+n.displacementMapUv:"",n.metalnessMapUv?"#define METALNESSMAP_UV "+n.metalnessMapUv:"",n.roughnessMapUv?"#define ROUGHNESSMAP_UV "+n.roughnessMapUv:"",n.anisotropyMapUv?"#define ANISOTROPYMAP_UV "+n.anisotropyMapUv:"",n.clearcoatMapUv?"#define CLEARCOATMAP_UV "+n.clearcoatMapUv:"",n.clearcoatNormalMapUv?"#define CLEARCOAT_NORMALMAP_UV "+n.clearcoatNormalMapUv:"",n.clearcoatRoughnessMapUv?"#define CLEARCOAT_ROUGHNESSMAP_UV "+n.clearcoatRoughnessMapUv:"",n.iridescenceMapUv?"#define IRIDESCENCEMAP_UV "+n.iridescenceMapUv:"",n.iridescenceThicknessMapUv?"#define IRIDESCENCE_THICKNESSMAP_UV "+n.iridescenceThicknessMapUv:"",n.sheenColorMapUv?"#define SHEEN_COLORMAP_UV "+n.sheenColorMapUv:"",n.sheenRoughnessMapUv?"#define SHEEN_ROUGHNESSMAP_UV "+n.sheenRoughnessMapUv:"",n.specularMapUv?"#define SPECULARMAP_UV "+n.specularMapUv:"",n.specularColorMapUv?"#define SPECULAR_COLORMAP_UV "+n.specularColorMapUv:"",n.specularIntensityMapUv?"#define SPECULAR_INTENSITYMAP_UV "+n.specularIntensityMapUv:"",n.transmissionMapUv?"#define TRANSMISSIONMAP_UV "+n.transmissionMapUv:"",n.thicknessMapUv?"#define THICKNESSMAP_UV "+n.thicknessMapUv:"",n.vertexTangents&&!1===n.flatShading?"#define USE_TANGENT":"",n.vertexColors?"#define USE_COLOR":"",n.vertexAlphas?"#define USE_COLOR_ALPHA":"",n.vertexUv1s?"#define USE_UV1":"",n.vertexUv2s?"#define USE_UV2":"",n.vertexUv3s?"#define USE_UV3":"",n.pointsUvs?"#define USE_POINTS_UV":"",n.flatShading?"#define FLAT_SHADED":"",n.skinning?"#define USE_SKINNING":"",n.morphTargets?"#define USE_MORPHTARGETS":"",n.morphNormals&&!1===n.flatShading?"#define USE_MORPHNORMALS":"",n.morphColors?"#define USE_MORPHCOLORS":"",n.morphTargetsCount>0?"#define MORPHTARGETS_TEXTURE_STRIDE "+n.morphTextureStride:"",n.morphTargetsCount>0?"#define MORPHTARGETS_COUNT "+n.morphTargetsCount:"",n.doubleSided?"#define DOUBLE_SIDED":"",n.flipSided?"#define FLIP_SIDED":"",n.shadowMapEnabled?"#define USE_SHADOWMAP":"",n.shadowMapEnabled?"#define "+c:"",n.sizeAttenuation?"#define USE_SIZEATTENUATION":"",n.numLightProbes>0?"#define USE_LIGHT_PROBES":"",n.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",n.reverseDepthBuffer?"#define USE_REVERSEDEPTHBUF":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;","#ifdef USE_INSTANCING","\tattribute mat4 instanceMatrix;","#endif","#ifdef USE_INSTANCING_COLOR","\tattribute vec3 instanceColor;","#endif","#ifdef USE_INSTANCING_MORPH","\tuniform sampler2D morphTexture;","#endif","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_UV1","\tattribute vec2 uv1;","#endif","#ifdef USE_UV2","\tattribute vec2 uv2;","#endif","#ifdef USE_UV3","\tattribute vec2 uv3;","#endif","#ifdef USE_TANGENT","\tattribute vec4 tangent;","#endif","#if defined( USE_COLOR_ALPHA )","\tattribute vec4 color;","#elif defined( USE_COLOR )","\tattribute vec3 color;","#endif","#ifdef USE_SKINNING","\tattribute vec4 skinIndex;","\tattribute vec4 skinWeight;","#endif","\n"].filter(Ci).join("\n"),v=[Fi(n),"#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,h,n.useFog&&n.fog?"#define USE_FOG":"",n.useFog&&n.fogExp2?"#define FOG_EXP2":"",n.alphaToCoverage?"#define ALPHA_TO_COVERAGE":"",n.map?"#define USE_MAP":"",n.matcap?"#define USE_MATCAP":"",n.envMap?"#define USE_ENVMAP":"",n.envMap?"#define "+d:"",n.envMap?"#define "+u:"",n.envMap?"#define "+f:"",p?"#define CUBEUV_TEXEL_WIDTH "+p.texelWidth:"",p?"#define CUBEUV_TEXEL_HEIGHT "+p.texelHeight:"",p?"#define CUBEUV_MAX_MIP "+p.maxMip+".0":"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",n.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.anisotropy?"#define USE_ANISOTROPY":"",n.anisotropyMap?"#define USE_ANISOTROPYMAP":"",n.clearcoat?"#define USE_CLEARCOAT":"",n.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.dispersion?"#define USE_DISPERSION":"",n.iridescence?"#define USE_IRIDESCENCE":"",n.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",n.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",n.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.alphaTest?"#define USE_ALPHATEST":"",n.alphaHash?"#define USE_ALPHAHASH":"",n.sheen?"#define USE_SHEEN":"",n.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",n.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",n.transmission?"#define USE_TRANSMISSION":"",n.transmissionMap?"#define USE_TRANSMISSIONMAP":"",n.thicknessMap?"#define USE_THICKNESSMAP":"",n.vertexTangents&&!1===n.flatShading?"#define USE_TANGENT":"",n.vertexColors||n.instancingColor||n.batchingColor?"#define USE_COLOR":"",n.vertexAlphas?"#define USE_COLOR_ALPHA":"",n.vertexUv1s?"#define USE_UV1":"",n.vertexUv2s?"#define USE_UV2":"",n.vertexUv3s?"#define USE_UV3":"",n.pointsUvs?"#define USE_POINTS_UV":"",n.gradientMap?"#define USE_GRADIENTMAP":"",n.flatShading?"#define FLAT_SHADED":"",n.doubleSided?"#define DOUBLE_SIDED":"",n.flipSided?"#define FLIP_SIDED":"",n.shadowMapEnabled?"#define USE_SHADOWMAP":"",n.shadowMapEnabled?"#define "+c:"",n.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",n.numLightProbes>0?"#define USE_LIGHT_PROBES":"",n.decodeVideoTexture?"#define DECODE_VIDEO_TEXTURE":"",n.decodeVideoTextureEmissive?"#define DECODE_VIDEO_TEXTURE_EMISSIVE":"",n.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",n.reverseDepthBuffer?"#define USE_REVERSEDEPTHBUF":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",n.toneMapping!==D?"#define TONE_MAPPING":"",n.toneMapping!==D?Dn.tonemapping_pars_fragment:"",n.toneMapping!==D?Ri("toneMapping",n.toneMapping):"",n.dithering?"#define DITHERING":"",n.opaque?"#define OPAQUE":"",Dn.colorspace_pars_fragment,xi("linearToOutputTexel",n.outputColorSpace),bi(),n.useDepthPacking?"#define DEPTH_PACKING "+n.depthPacking:"","\n"].filter(Ci).join("\n")),s=Di(s),s=Li(s,n),s=Pi(s,n),l=Di(l),l=Li(l,n),l=Pi(l,n),s=Ni(s),l=Ni(l),!0!==n.isRawShaderMaterial&&(E="#version 300 es\n",g=[m,"#define attribute in","#define varying out","#define texture2D texture"].join("\n")+"\n"+g,v=["#define varying in",n.glslVersion===Z?"":"layout(location = 0) out highp vec4 pc_fragColor;",n.glslVersion===Z?"":"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth","#define texture2D texture","#define textureCube texture","#define texture2DProj textureProj","#define texture2DLodEXT textureLod","#define texture2DProjLodEXT textureProjLod","#define textureCubeLodEXT textureLod","#define texture2DGradEXT textureGrad","#define texture2DProjGradEXT textureProjGrad","#define textureCubeGradEXT textureGrad"].join("\n")+"\n"+v);const S=E+g+s,T=E+v+l,M=Ei(i,i.VERTEX_SHADER,S),x=Ei(i,i.FRAGMENT_SHADER,T);function R(t){if(e.debug.checkShaderErrors){const n=i.getProgramInfoLog(_).trim(),r=i.getShaderInfoLog(M).trim(),a=i.getShaderInfoLog(x).trim();let o=!0,s=!0;if(!1===i.getProgramParameter(_,i.LINK_STATUS))if(o=!1,"function"==typeof e.debug.onShaderError)e.debug.onShaderError(i,_,M,x);else{const e=Mi(i,M,"vertex"),r=Mi(i,x,"fragment");console.error("THREE.WebGLProgram: Shader Error "+i.getError()+" - VALIDATE_STATUS "+i.getProgramParameter(_,i.VALIDATE_STATUS)+"\n\nMaterial Name: "+t.name+"\nMaterial Type: "+t.type+"\n\nProgram Info Log: "+n+"\n"+e+"\n"+r)}else""!==n?console.warn("THREE.WebGLProgram: Program Info Log:",n):""!==r&&""!==a||(s=!1);s&&(t.diagnostics={runnable:o,programLog:n,vertexShader:{log:r,prefix:g},fragmentShader:{log:a,prefix:v}})}i.deleteShader(M),i.deleteShader(x),A=new vi(i,_),b=function(e,t){const n={},r=e.getProgramParameter(t,e.ACTIVE_ATTRIBUTES);for(let i=0;i0,J=o.clearcoat>0,ee=o.dispersion>0,te=o.iridescence>0,ne=o.sheen>0,re=o.transmission>0,ie=Q&&!!o.anisotropyMap,ae=J&&!!o.clearcoatMap,oe=J&&!!o.clearcoatNormalMap,se=J&&!!o.clearcoatRoughnessMap,le=te&&!!o.iridescenceMap,ce=te&&!!o.iridescenceThicknessMap,de=ne&&!!o.sheenColorMap,ue=ne&&!!o.sheenRoughnessMap,_e=!!o.specularMap,ge=!!o.specularColorMap,ve=!!o.specularIntensityMap,Ee=re&&!!o.transmissionMap,Se=re&&!!o.thicknessMap,Te=!!o.gradientMap,Me=!!o.alphaMap,xe=o.alphaTest>0,Re=!!o.alphaHash,Ae=!!o.extensions;let be=D;o.toneMapped&&(null!==O&&!0!==O.isXRRenderTarget||(be=e.toneMapping));const Ce={shaderID:C,shaderType:o.type,shaderName:o.name,vertexShader:U,fragmentShader:w,defines:o.defines,customVertexShaderID:y,customFragmentShaderID:I,isRawShaderMaterial:!0===o.isRawShaderMaterial,glslVersion:o.glslVersion,precision:g,batching:G,batchingColor:G&&null!==T._colorsTexture,instancing:H,instancingColor:H&&null!==T.instanceColor,instancingMorph:H&&null!==T.morphTexture,supportsVertexTextures:_,outputColorSpace:null===O?e.outputColorSpace:!0===O.isXRRenderTarget?O.texture.colorSpace:F,alphaToCoverage:!!o.alphaToCoverage,map:V,matcap:z,envMap:k,envMapMode:k&&A.mapping,envMapCubeUVHeight:b,aoMap:W,lightMap:X,bumpMap:Y,normalMap:K,displacementMap:_&&j,emissiveMap:q,normalMapObjectSpace:K&&o.normalMapType===he,normalMapTangentSpace:K&&o.normalMapType===me,metalnessMap:Z,roughnessMap:$,anisotropy:Q,anisotropyMap:ie,clearcoat:J,clearcoatMap:ae,clearcoatNormalMap:oe,clearcoatRoughnessMap:se,dispersion:ee,iridescence:te,iridescenceMap:le,iridescenceThicknessMap:ce,sheen:ne,sheenColorMap:de,sheenRoughnessMap:ue,specularMap:_e,specularColorMap:ge,specularIntensityMap:ve,transmission:re,transmissionMap:Ee,thicknessMap:Se,gradientMap:Te,opaque:!1===o.transparent&&o.blending===pe&&!1===o.alphaToCoverage,alphaMap:Me,alphaTest:xe,alphaHash:Re,combine:o.combine,mapUv:V&&E(o.map.channel),aoMapUv:W&&E(o.aoMap.channel),lightMapUv:X&&E(o.lightMap.channel),bumpMapUv:Y&&E(o.bumpMap.channel),normalMapUv:K&&E(o.normalMap.channel),displacementMapUv:j&&E(o.displacementMap.channel),emissiveMapUv:q&&E(o.emissiveMap.channel),metalnessMapUv:Z&&E(o.metalnessMap.channel),roughnessMapUv:$&&E(o.roughnessMap.channel),anisotropyMapUv:ie&&E(o.anisotropyMap.channel),clearcoatMapUv:ae&&E(o.clearcoatMap.channel),clearcoatNormalMapUv:oe&&E(o.clearcoatNormalMap.channel),clearcoatRoughnessMapUv:se&&E(o.clearcoatRoughnessMap.channel),iridescenceMapUv:le&&E(o.iridescenceMap.channel),iridescenceThicknessMapUv:ce&&E(o.iridescenceThicknessMap.channel),sheenColorMapUv:de&&E(o.sheenColorMap.channel),sheenRoughnessMapUv:ue&&E(o.sheenRoughnessMap.channel),specularMapUv:_e&&E(o.specularMap.channel),specularColorMapUv:ge&&E(o.specularColorMap.channel),specularIntensityMapUv:ve&&E(o.specularIntensityMap.channel),transmissionMapUv:Ee&&E(o.transmissionMap.channel),thicknessMapUv:Se&&E(o.thicknessMap.channel),alphaMapUv:Me&&E(o.alphaMap.channel),vertexTangents:!!x.attributes.tangent&&(K||Q),vertexColors:o.vertexColors,vertexAlphas:!0===o.vertexColors&&!!x.attributes.color&&4===x.attributes.color.itemSize,pointsUvs:!0===T.isPoints&&!!x.attributes.uv&&(V||Me),fog:!!M,useFog:!0===o.fog,fogExp2:!!M&&M.isFogExp2,flatShading:!0===o.flatShading,sizeAttenuation:!0===o.sizeAttenuation,logarithmicDepthBuffer:h,reverseDepthBuffer:B,skinning:!0===T.isSkinnedMesh,morphTargets:void 0!==x.morphAttributes.position,morphNormals:void 0!==x.morphAttributes.normal,morphColors:void 0!==x.morphAttributes.color,morphTargetsCount:P,morphTextureStride:N,numDirLights:l.directional.length,numPointLights:l.point.length,numSpotLights:l.spot.length,numSpotLightMaps:l.spotLightMap.length,numRectAreaLights:l.rectArea.length,numHemiLights:l.hemi.length,numDirLightShadows:l.directionalShadowMap.length,numPointLightShadows:l.pointShadowMap.length,numSpotLightShadows:l.spotShadowMap.length,numSpotLightShadowsWithMaps:l.numSpotLightShadowsWithMaps,numLightProbes:l.numLightProbes,numClippingPlanes:s.numPlanes,numClipIntersection:s.numIntersection,dithering:o.dithering,shadowMapEnabled:e.shadowMap.enabled&&f.length>0,shadowMapType:e.shadowMap.type,toneMapping:be,decodeVideoTexture:V&&!0===o.map.isVideoTexture&&p.getTransfer(o.map.colorSpace)===m,decodeVideoTextureEmissive:q&&!0===o.emissiveMap.isVideoTexture&&p.getTransfer(o.emissiveMap.colorSpace)===m,premultipliedAlpha:o.premultipliedAlpha,doubleSided:o.side===fe,flipSided:o.side===c,useDepthPacking:o.depthPacking>=0,depthPacking:o.depthPacking||0,index0AttributeName:o.index0AttributeName,extensionClipCullDistance:Ae&&!0===o.extensions.clipCullDistance&&r.has("WEBGL_clip_cull_distance"),extensionMultiDraw:(Ae&&!0===o.extensions.multiDraw||G)&&r.has("WEBGL_multi_draw"),rendererExtensionParallelShaderCompile:r.has("KHR_parallel_shader_compile"),customProgramCacheKey:o.customProgramCacheKey()};return Ce.vertexUv1s=u.has(1),Ce.vertexUv2s=u.has(2),Ce.vertexUv3s=u.has(3),u.clear(),Ce},getProgramCacheKey:function(t){const n=[];if(t.shaderID?n.push(t.shaderID):(n.push(t.customVertexShaderID),n.push(t.customFragmentShaderID)),void 0!==t.defines)for(const e in t.defines)n.push(e),n.push(t.defines[e]);return!1===t.isRawShaderMaterial&&(!function(e,t){e.push(t.precision),e.push(t.outputColorSpace),e.push(t.envMapMode),e.push(t.envMapCubeUVHeight),e.push(t.mapUv),e.push(t.alphaMapUv),e.push(t.lightMapUv),e.push(t.aoMapUv),e.push(t.bumpMapUv),e.push(t.normalMapUv),e.push(t.displacementMapUv),e.push(t.emissiveMapUv),e.push(t.metalnessMapUv),e.push(t.roughnessMapUv),e.push(t.anisotropyMapUv),e.push(t.clearcoatMapUv),e.push(t.clearcoatNormalMapUv),e.push(t.clearcoatRoughnessMapUv),e.push(t.iridescenceMapUv),e.push(t.iridescenceThicknessMapUv),e.push(t.sheenColorMapUv),e.push(t.sheenRoughnessMapUv),e.push(t.specularMapUv),e.push(t.specularColorMapUv),e.push(t.specularIntensityMapUv),e.push(t.transmissionMapUv),e.push(t.thicknessMapUv),e.push(t.combine),e.push(t.fogExp2),e.push(t.sizeAttenuation),e.push(t.morphTargetsCount),e.push(t.morphAttributeCount),e.push(t.numDirLights),e.push(t.numPointLights),e.push(t.numSpotLights),e.push(t.numSpotLightMaps),e.push(t.numHemiLights),e.push(t.numRectAreaLights),e.push(t.numDirLightShadows),e.push(t.numPointLightShadows),e.push(t.numSpotLightShadows),e.push(t.numSpotLightShadowsWithMaps),e.push(t.numLightProbes),e.push(t.shadowMapType),e.push(t.toneMapping),e.push(t.numClippingPlanes),e.push(t.numClipIntersection),e.push(t.depthPacking)}(n,t),function(e,t){l.disableAll(),t.supportsVertexTextures&&l.enable(0);t.instancing&&l.enable(1);t.instancingColor&&l.enable(2);t.instancingMorph&&l.enable(3);t.matcap&&l.enable(4);t.envMap&&l.enable(5);t.normalMapObjectSpace&&l.enable(6);t.normalMapTangentSpace&&l.enable(7);t.clearcoat&&l.enable(8);t.iridescence&&l.enable(9);t.alphaTest&&l.enable(10);t.vertexColors&&l.enable(11);t.vertexAlphas&&l.enable(12);t.vertexUv1s&&l.enable(13);t.vertexUv2s&&l.enable(14);t.vertexUv3s&&l.enable(15);t.vertexTangents&&l.enable(16);t.anisotropy&&l.enable(17);t.alphaHash&&l.enable(18);t.batching&&l.enable(19);t.dispersion&&l.enable(20);t.batchingColor&&l.enable(21);e.push(l.mask),l.disableAll(),t.fog&&l.enable(0);t.useFog&&l.enable(1);t.flatShading&&l.enable(2);t.logarithmicDepthBuffer&&l.enable(3);t.reverseDepthBuffer&&l.enable(4);t.skinning&&l.enable(5);t.morphTargets&&l.enable(6);t.morphNormals&&l.enable(7);t.morphColors&&l.enable(8);t.premultipliedAlpha&&l.enable(9);t.shadowMapEnabled&&l.enable(10);t.doubleSided&&l.enable(11);t.flipSided&&l.enable(12);t.useDepthPacking&&l.enable(13);t.dithering&&l.enable(14);t.transmission&&l.enable(15);t.sheen&&l.enable(16);t.opaque&&l.enable(17);t.pointsUvs&&l.enable(18);t.decodeVideoTexture&&l.enable(19);t.decodeVideoTextureEmissive&&l.enable(20);t.alphaToCoverage&&l.enable(21);e.push(l.mask)}(n,t),n.push(e.outputColorSpace)),n.push(t.customProgramCacheKey),n.join()},getUniforms:function(e){const t=v[e.type];let n;if(t){const e=yn[t];n=ue.clone(e.uniforms)}else n=e.uniforms;return n},acquireProgram:function(t,n){let r;for(let e=0,t=f.length;e0?r.push(d):!0===o.transparent?i.push(d):n.push(d)},unshift:function(e,t,o,s,l,c){const d=a(e,t,o,s,l,c);o.transmission>0?r.unshift(d):!0===o.transparent?i.unshift(d):n.unshift(d)},finish:function(){for(let n=t,r=e.length;n1&&n.sort(e||Wi),r.length>1&&r.sort(t||Xi),i.length>1&&i.sort(t||Xi)}}}function Ki(){let e=new WeakMap;return{get:function(t,n){const r=e.get(t);let i;return void 0===r?(i=new Yi,e.set(t,[i])):n>=r.length?(i=new Yi,r.push(i)):i=r[n],i},dispose:function(){e=new WeakMap}}}function ji(){const e={};return{get:function(t){if(void 0!==e[t.id])return e[t.id];let r;switch(t.type){case"DirectionalLight":r={direction:new i,color:new n};break;case"SpotLight":r={position:new i,direction:new i,color:new n,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":r={position:new i,color:new n,distance:0,decay:0};break;case"HemisphereLight":r={direction:new i,skyColor:new n,groundColor:new n};break;case"RectAreaLight":r={color:new n,position:new i,halfWidth:new i,halfHeight:new i}}return e[t.id]=r,r}}}let qi=0;function Zi(e,t){return(t.castShadow?2:0)-(e.castShadow?2:0)+(t.map?1:0)-(e.map?1:0)}function $i(e){const n=new ji,r=function(){const e={};return{get:function(n){if(void 0!==e[n.id])return e[n.id];let r;switch(n.type){case"DirectionalLight":case"SpotLight":r={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new t};break;case"PointLight":r={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new t,shadowCameraNear:1,shadowCameraFar:1e3}}return e[n.id]=r,r}}}(),a={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1,numSpotMaps:-1,numLightProbes:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotLightMap:[],spotShadow:[],spotShadowMap:[],spotLightMatrix:[],rectArea:[],rectAreaLTC1:null,rectAreaLTC2:null,point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[],numSpotLightShadowsWithMaps:0,numLightProbes:0};for(let e=0;e<9;e++)a.probe.push(new i);const o=new i,s=new f,l=new f;return{setup:function(t){let i=0,o=0,s=0;for(let e=0;e<9;e++)a.probe[e].set(0,0,0);let l=0,c=0,d=0,u=0,f=0,p=0,m=0,h=0,_=0,g=0,v=0;t.sort(Zi);for(let e=0,E=t.length;e0&&(!0===e.has("OES_texture_float_linear")?(a.rectAreaLTC1=wn.LTC_FLOAT_1,a.rectAreaLTC2=wn.LTC_FLOAT_2):(a.rectAreaLTC1=wn.LTC_HALF_1,a.rectAreaLTC2=wn.LTC_HALF_2)),a.ambient[0]=i,a.ambient[1]=o,a.ambient[2]=s;const E=a.hash;E.directionalLength===l&&E.pointLength===c&&E.spotLength===d&&E.rectAreaLength===u&&E.hemiLength===f&&E.numDirectionalShadows===p&&E.numPointShadows===m&&E.numSpotShadows===h&&E.numSpotMaps===_&&E.numLightProbes===v||(a.directional.length=l,a.spot.length=d,a.rectArea.length=u,a.point.length=c,a.hemi.length=f,a.directionalShadow.length=p,a.directionalShadowMap.length=p,a.pointShadow.length=m,a.pointShadowMap.length=m,a.spotShadow.length=h,a.spotShadowMap.length=h,a.directionalShadowMatrix.length=p,a.pointShadowMatrix.length=m,a.spotLightMatrix.length=h+_-g,a.spotLightMap.length=_,a.numSpotLightShadowsWithMaps=g,a.numLightProbes=v,E.directionalLength=l,E.pointLength=c,E.spotLength=d,E.rectAreaLength=u,E.hemiLength=f,E.numDirectionalShadows=p,E.numPointShadows=m,E.numSpotShadows=h,E.numSpotMaps=_,E.numLightProbes=v,a.version=qi++)},setupView:function(e,t){let n=0,r=0,i=0,c=0,d=0;const u=t.matrixWorldInverse;for(let t=0,f=e.length;t=i.length?(a=new Qi(e),i.push(a)):a=i[r],a},dispose:function(){t=new WeakMap}}}function ea(e,n,r){let i=new ge;const a=new t,s=new t,d=new k,u=new ve({depthPacking:Ee}),f=new Se,p={},m=r.maxTextureSize,h={[_]:c,[c]:_,[fe]:fe},g=new l({defines:{VSM_SAMPLES:8},uniforms:{shadow_pass:{value:null},resolution:{value:new t},radius:{value:4}},vertexShader:"void main() {\n\tgl_Position = vec4( position, 1.0 );\n}",fragmentShader:"uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\n#include \nvoid main() {\n\tconst float samples = float( VSM_SAMPLES );\n\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\n\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\n\tfor ( float i = 0.0; i < samples; i ++ ) {\n\t\tfloat uvOffset = uvStart + i * uvStride;\n\t\t#ifdef HORIZONTAL_PASS\n\t\t\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ) );\n\t\t\tmean += distribution.x;\n\t\t\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n\t\t#else\n\t\t\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ) );\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\t\t#endif\n\t}\n\tmean = mean / samples;\n\tsquared_mean = squared_mean / samples;\n\tfloat std_dev = sqrt( squared_mean - mean * mean );\n\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\n}"}),v=g.clone();v.defines.HORIZONTAL_PASS=1;const E=new N;E.setAttribute("position",new O(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const S=new o(E,g),T=this;this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=$;let M=this.type;function x(t,r){const i=n.update(S);g.defines.VSM_SAMPLES!==t.blurSamples&&(g.defines.VSM_SAMPLES=t.blurSamples,v.defines.VSM_SAMPLES=t.blurSamples,g.needsUpdate=!0,v.needsUpdate=!0),null===t.mapPass&&(t.mapPass=new I(a.x,a.y)),g.uniforms.shadow_pass.value=t.map.texture,g.uniforms.resolution.value=t.mapSize,g.uniforms.radius.value=t.radius,e.setRenderTarget(t.mapPass),e.clear(),e.renderBufferDirect(r,null,i,g,S,null),v.uniforms.shadow_pass.value=t.mapPass.texture,v.uniforms.resolution.value=t.mapSize,v.uniforms.radius.value=t.radius,e.setRenderTarget(t.map),e.clear(),e.renderBufferDirect(r,null,i,v,S,null)}function R(t,n,r,i){let a=null;const o=!0===r.isPointLight?t.customDistanceMaterial:t.customDepthMaterial;if(void 0!==o)a=o;else if(a=!0===r.isPointLight?f:u,e.localClippingEnabled&&!0===n.clipShadows&&Array.isArray(n.clippingPlanes)&&0!==n.clippingPlanes.length||n.displacementMap&&0!==n.displacementScale||n.alphaMap&&n.alphaTest>0||n.map&&n.alphaTest>0){const e=a.uuid,t=n.uuid;let r=p[e];void 0===r&&(r={},p[e]=r);let i=r[t];void 0===i&&(i=a.clone(),r[t]=i,n.addEventListener("dispose",b)),a=i}if(a.visible=n.visible,a.wireframe=n.wireframe,a.side=i===J?null!==n.shadowSide?n.shadowSide:n.side:null!==n.shadowSide?n.shadowSide:h[n.side],a.alphaMap=n.alphaMap,a.alphaTest=n.alphaTest,a.map=n.map,a.clipShadows=n.clipShadows,a.clippingPlanes=n.clippingPlanes,a.clipIntersection=n.clipIntersection,a.displacementMap=n.displacementMap,a.displacementScale=n.displacementScale,a.displacementBias=n.displacementBias,a.wireframeLinewidth=n.wireframeLinewidth,a.linewidth=n.linewidth,!0===r.isPointLight&&!0===a.isMeshDistanceMaterial){e.properties.get(a).light=r}return a}function A(t,r,a,o,s){if(!1===t.visible)return;if(t.layers.test(r.layers)&&(t.isMesh||t.isLine||t.isPoints)&&(t.castShadow||t.receiveShadow&&s===J)&&(!t.frustumCulled||i.intersectsObject(t))){t.modelViewMatrix.multiplyMatrices(a.matrixWorldInverse,t.matrixWorld);const i=n.update(t),l=t.material;if(Array.isArray(l)){const n=i.groups;for(let c=0,d=n.length;cm||a.y>m)&&(a.x>m&&(s.x=Math.floor(m/h.x),a.x=s.x*h.x,c.mapSize.x=s.x),a.y>m&&(s.y=Math.floor(m/h.y),a.y=s.y*h.y,c.mapSize.y=s.y)),null===c.map||!0===f||!0===p){const e=this.type!==J?{minFilter:Te,magFilter:Te}:{};null!==c.map&&c.map.dispose(),c.map=new I(a.x,a.y,e),c.map.texture.name=l.name+".shadowMap",c.camera.updateProjectionMatrix()}e.setRenderTarget(c.map),e.clear();const _=c.getViewportCount();for(let e=0;e<_;e++){const t=c.getViewport(e);d.set(s.x*t.x,s.y*t.y,s.x*t.z,s.y*t.w),u.viewport(d),c.updateMatrices(l,e),i=c.getFrustum(),A(n,r,c.camera,l,this.type)}!0!==c.isPointLightShadow&&this.type===J&&x(c,r),c.needsUpdate=!1}M=this.type,T.needsUpdate=!1,e.setRenderTarget(o,l,c)}}const ta={[Ke]:Ye,[Xe]:ze,[We]:Ve,[Me]:ke,[Ye]:Ke,[ze]:Xe,[Ve]:We,[ke]:Me};function na(e,t){const r=new function(){let t=!1;const n=new k;let r=null;const i=new k(0,0,0,0);return{setMask:function(n){r===n||t||(e.colorMask(n,n,n,n),r=n)},setLocked:function(e){t=e},setClear:function(t,r,a,o,s){!0===s&&(t*=o,r*=o,a*=o),n.set(t,r,a,o),!1===i.equals(n)&&(e.clearColor(t,r,a,o),i.copy(n))},reset:function(){t=!1,r=null,i.set(-1,0,0,0)}}},i=new function(){let n=!1,r=!1,i=null,a=null,o=null;return{setReversed:function(e){if(r!==e){const n=t.get("EXT_clip_control");e?n.clipControlEXT(n.LOWER_LEFT_EXT,n.ZERO_TO_ONE_EXT):n.clipControlEXT(n.LOWER_LEFT_EXT,n.NEGATIVE_ONE_TO_ONE_EXT),r=e;const i=o;o=null,this.setClear(i)}},getReversed:function(){return r},setTest:function(t){t?W(e.DEPTH_TEST):X(e.DEPTH_TEST)},setMask:function(t){i===t||n||(e.depthMask(t),i=t)},setFunc:function(t){if(r&&(t=ta[t]),a!==t){switch(t){case Ke:e.depthFunc(e.NEVER);break;case Ye:e.depthFunc(e.ALWAYS);break;case Xe:e.depthFunc(e.LESS);break;case Me:e.depthFunc(e.LEQUAL);break;case We:e.depthFunc(e.EQUAL);break;case ke:e.depthFunc(e.GEQUAL);break;case ze:e.depthFunc(e.GREATER);break;case Ve:e.depthFunc(e.NOTEQUAL);break;default:e.depthFunc(e.LEQUAL)}a=t}},setLocked:function(e){n=e},setClear:function(t){o!==t&&(r&&(t=1-t),e.clearDepth(t),o=t)},reset:function(){n=!1,i=null,a=null,o=null,r=!1}}},a=new function(){let t=!1,n=null,r=null,i=null,a=null,o=null,s=null,l=null,c=null;return{setTest:function(n){t||(n?W(e.STENCIL_TEST):X(e.STENCIL_TEST))},setMask:function(r){n===r||t||(e.stencilMask(r),n=r)},setFunc:function(t,n,o){r===t&&i===n&&a===o||(e.stencilFunc(t,n,o),r=t,i=n,a=o)},setOp:function(t,n,r){o===t&&s===n&&l===r||(e.stencilOp(t,n,r),o=t,s=n,l=r)},setLocked:function(e){t=e},setClear:function(t){c!==t&&(e.clearStencil(t),c=t)},reset:function(){t=!1,n=null,r=null,i=null,a=null,o=null,s=null,l=null,c=null}}},o=new WeakMap,s=new WeakMap;let l={},d={},u=new WeakMap,f=[],p=null,m=!1,h=null,_=null,g=null,v=null,E=null,S=null,T=null,M=new n(0,0,0),x=0,R=!1,A=null,b=null,C=null,L=null,P=null;const U=e.getParameter(e.MAX_COMBINED_TEXTURE_IMAGE_UNITS);let D=!1,w=0;const I=e.getParameter(e.VERSION);-1!==I.indexOf("WebGL")?(w=parseFloat(/^WebGL (\d)/.exec(I)[1]),D=w>=1):-1!==I.indexOf("OpenGL ES")&&(w=parseFloat(/^OpenGL ES (\d)/.exec(I)[1]),D=w>=2);let N=null,O={};const F=e.getParameter(e.SCISSOR_BOX),B=e.getParameter(e.VIEWPORT),H=(new k).fromArray(F),G=(new k).fromArray(B);function V(t,n,r,i){const a=new Uint8Array(4),o=e.createTexture();e.bindTexture(t,o),e.texParameteri(t,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(t,e.TEXTURE_MAG_FILTER,e.NEAREST);for(let o=0;on||i.height>n)&&(r=n/Math.max(i.width,i.height)),r<1){if("undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap||"undefined"!=typeof VideoFrame&&e instanceof VideoFrame){const n=Math.floor(r*i.width),a=Math.floor(r*i.height);void 0===f&&(f=g(n,a));const o=t?g(n,a):f;o.width=n,o.height=a;return o.getContext("2d").drawImage(e,0,0,n,a),console.warn("THREE.WebGLRenderer: Texture has been resized from ("+i.width+"x"+i.height+") to ("+n+"x"+a+")."),o}return"data"in e&&console.warn("THREE.WebGLRenderer: Image in DataTexture is too big ("+i.width+"x"+i.height+")."),e}return e}function E(e){return e.generateMipmaps}function x(t){e.generateMipmap(t)}function R(t){return t.isWebGLCubeRenderTarget?e.TEXTURE_CUBE_MAP:t.isWebGL3DRenderTarget?e.TEXTURE_3D:t.isWebGLArrayRenderTarget||t.isCompressedArrayTexture?e.TEXTURE_2D_ARRAY:e.TEXTURE_2D}function A(t,r,i,a,o=!1){if(null!==t){if(void 0!==e[t])return e[t];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+t+"'")}let s=r;if(r===e.RED&&(i===e.FLOAT&&(s=e.R32F),i===e.HALF_FLOAT&&(s=e.R16F),i===e.UNSIGNED_BYTE&&(s=e.R8)),r===e.RED_INTEGER&&(i===e.UNSIGNED_BYTE&&(s=e.R8UI),i===e.UNSIGNED_SHORT&&(s=e.R16UI),i===e.UNSIGNED_INT&&(s=e.R32UI),i===e.BYTE&&(s=e.R8I),i===e.SHORT&&(s=e.R16I),i===e.INT&&(s=e.R32I)),r===e.RG&&(i===e.FLOAT&&(s=e.RG32F),i===e.HALF_FLOAT&&(s=e.RG16F),i===e.UNSIGNED_BYTE&&(s=e.RG8)),r===e.RG_INTEGER&&(i===e.UNSIGNED_BYTE&&(s=e.RG8UI),i===e.UNSIGNED_SHORT&&(s=e.RG16UI),i===e.UNSIGNED_INT&&(s=e.RG32UI),i===e.BYTE&&(s=e.RG8I),i===e.SHORT&&(s=e.RG16I),i===e.INT&&(s=e.RG32I)),r===e.RGB_INTEGER&&(i===e.UNSIGNED_BYTE&&(s=e.RGB8UI),i===e.UNSIGNED_SHORT&&(s=e.RGB16UI),i===e.UNSIGNED_INT&&(s=e.RGB32UI),i===e.BYTE&&(s=e.RGB8I),i===e.SHORT&&(s=e.RGB16I),i===e.INT&&(s=e.RGB32I)),r===e.RGBA_INTEGER&&(i===e.UNSIGNED_BYTE&&(s=e.RGBA8UI),i===e.UNSIGNED_SHORT&&(s=e.RGBA16UI),i===e.UNSIGNED_INT&&(s=e.RGBA32UI),i===e.BYTE&&(s=e.RGBA8I),i===e.SHORT&&(s=e.RGBA16I),i===e.INT&&(s=e.RGBA32I)),r===e.RGB&&i===e.UNSIGNED_INT_5_9_9_9_REV&&(s=e.RGB9_E5),r===e.RGBA){const t=o?se:p.getTransfer(a);i===e.FLOAT&&(s=e.RGBA32F),i===e.HALF_FLOAT&&(s=e.RGBA16F),i===e.UNSIGNED_BYTE&&(s=t===m?e.SRGB8_ALPHA8:e.RGBA8),i===e.UNSIGNED_SHORT_4_4_4_4&&(s=e.RGBA4),i===e.UNSIGNED_SHORT_5_5_5_1&&(s=e.RGB5_A1)}return s!==e.R16F&&s!==e.R32F&&s!==e.RG16F&&s!==e.RG32F&&s!==e.RGBA16F&&s!==e.RGBA32F||n.get("EXT_color_buffer_float"),s}function b(t,n){let r;return t?null===n||n===Tt||n===Mt?r=e.DEPTH24_STENCIL8:n===T?r=e.DEPTH32F_STENCIL8:n===xt&&(r=e.DEPTH24_STENCIL8,console.warn("DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment.")):null===n||n===Tt||n===Mt?r=e.DEPTH_COMPONENT24:n===T?r=e.DEPTH_COMPONENT32F:n===xt&&(r=e.DEPTH_COMPONENT16),r}function C(e,t){return!0===E(e)||e.isFramebufferTexture&&e.minFilter!==Te&&e.minFilter!==B?Math.log2(Math.max(t.width,t.height))+1:void 0!==e.mipmaps&&e.mipmaps.length>0?e.mipmaps.length:e.isCompressedTexture&&Array.isArray(e.image)?t.mipmaps.length:1}function L(e){const t=e.target;t.removeEventListener("dispose",L),function(e){const t=i.get(e);if(void 0===t.__webglInit)return;const n=e.source,r=h.get(n);if(r){const i=r[t.__cacheKey];i.usedTimes--,0===i.usedTimes&&U(e),0===Object.keys(r).length&&h.delete(n)}i.remove(e)}(t),t.isVideoTexture&&u.delete(t)}function P(t){const n=t.target;n.removeEventListener("dispose",P),function(t){const n=i.get(t);t.depthTexture&&(t.depthTexture.dispose(),i.remove(t.depthTexture));if(t.isWebGLCubeRenderTarget)for(let t=0;t<6;t++){if(Array.isArray(n.__webglFramebuffer[t]))for(let r=0;r0&&a.__version!==t.version){const e=t.image;if(null===e)console.warn("THREE.WebGLRenderer: Texture marked for update but no image data found.");else{if(!1!==e.complete)return void G(a,t,n);console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete")}}r.bindTexture(e.TEXTURE_2D,a.__webglTexture,e.TEXTURE0+n)}const y={[at]:e.REPEAT,[it]:e.CLAMP_TO_EDGE,[rt]:e.MIRRORED_REPEAT},I={[Te]:e.NEAREST,[ct]:e.NEAREST_MIPMAP_NEAREST,[lt]:e.NEAREST_MIPMAP_LINEAR,[B]:e.LINEAR,[st]:e.LINEAR_MIPMAP_NEAREST,[ot]:e.LINEAR_MIPMAP_LINEAR},N={[_t]:e.NEVER,[ht]:e.ALWAYS,[mt]:e.LESS,[K]:e.LEQUAL,[pt]:e.EQUAL,[ft]:e.GEQUAL,[ut]:e.GREATER,[dt]:e.NOTEQUAL};function O(t,r){if(r.type!==T||!1!==n.has("OES_texture_float_linear")||r.magFilter!==B&&r.magFilter!==st&&r.magFilter!==lt&&r.magFilter!==ot&&r.minFilter!==B&&r.minFilter!==st&&r.minFilter!==lt&&r.minFilter!==ot||console.warn("THREE.WebGLRenderer: Unable to use linear filtering with floating point textures. OES_texture_float_linear not supported on this device."),e.texParameteri(t,e.TEXTURE_WRAP_S,y[r.wrapS]),e.texParameteri(t,e.TEXTURE_WRAP_T,y[r.wrapT]),t!==e.TEXTURE_3D&&t!==e.TEXTURE_2D_ARRAY||e.texParameteri(t,e.TEXTURE_WRAP_R,y[r.wrapR]),e.texParameteri(t,e.TEXTURE_MAG_FILTER,I[r.magFilter]),e.texParameteri(t,e.TEXTURE_MIN_FILTER,I[r.minFilter]),r.compareFunction&&(e.texParameteri(t,e.TEXTURE_COMPARE_MODE,e.COMPARE_REF_TO_TEXTURE),e.texParameteri(t,e.TEXTURE_COMPARE_FUNC,N[r.compareFunction])),!0===n.has("EXT_texture_filter_anisotropic")){if(r.magFilter===Te)return;if(r.minFilter!==lt&&r.minFilter!==ot)return;if(r.type===T&&!1===n.has("OES_texture_float_linear"))return;if(r.anisotropy>1||i.get(r).__currentAnisotropy){const o=n.get("EXT_texture_filter_anisotropic");e.texParameterf(t,o.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(r.anisotropy,a.getMaxAnisotropy())),i.get(r).__currentAnisotropy=r.anisotropy}}}function H(t,n){let r=!1;void 0===t.__webglInit&&(t.__webglInit=!0,n.addEventListener("dispose",L));const i=n.source;let a=h.get(i);void 0===a&&(a={},h.set(i,a));const o=function(e){const t=[];return t.push(e.wrapS),t.push(e.wrapT),t.push(e.wrapR||0),t.push(e.magFilter),t.push(e.minFilter),t.push(e.anisotropy),t.push(e.internalFormat),t.push(e.format),t.push(e.type),t.push(e.generateMipmaps),t.push(e.premultiplyAlpha),t.push(e.flipY),t.push(e.unpackAlignment),t.push(e.colorSpace),t.join()}(n);if(o!==t.__cacheKey){void 0===a[o]&&(a[o]={texture:e.createTexture(),usedTimes:0},s.memory.textures++,r=!0),a[o].usedTimes++;const i=a[t.__cacheKey];void 0!==i&&(a[t.__cacheKey].usedTimes--,0===i.usedTimes&&U(n)),t.__cacheKey=o,t.__webglTexture=a[o].texture}return r}function G(t,n,s){let l=e.TEXTURE_2D;(n.isDataArrayTexture||n.isCompressedArrayTexture)&&(l=e.TEXTURE_2D_ARRAY),n.isData3DTexture&&(l=e.TEXTURE_3D);const c=H(t,n),d=n.source;r.bindTexture(l,t.__webglTexture,e.TEXTURE0+s);const u=i.get(d);if(d.version!==u.__version||!0===c){r.activeTexture(e.TEXTURE0+s);const t=p.getPrimaries(p.workingColorSpace),i=n.colorSpace===gt?null:p.getPrimaries(n.colorSpace),f=n.colorSpace===gt||t===i?e.NONE:e.BROWSER_DEFAULT_WEBGL;e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,n.flipY),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,n.premultiplyAlpha),e.pixelStorei(e.UNPACK_ALIGNMENT,n.unpackAlignment),e.pixelStorei(e.UNPACK_COLORSPACE_CONVERSION_WEBGL,f);let m=v(n.image,!1,a.maxTextureSize);m=q(n,m);const h=o.convert(n.format,n.colorSpace),_=o.convert(n.type);let g,S=A(n.internalFormat,h,_,n.colorSpace,n.isVideoTexture);O(l,n);const T=n.mipmaps,R=!0!==n.isVideoTexture,L=void 0===u.__version||!0===c,P=d.dataReady,U=C(n,m);if(n.isDepthTexture)S=b(n.format===vt,n.type),L&&(R?r.texStorage2D(e.TEXTURE_2D,1,S,m.width,m.height):r.texImage2D(e.TEXTURE_2D,0,S,m.width,m.height,0,h,_,null));else if(n.isDataTexture)if(T.length>0){R&&L&&r.texStorage2D(e.TEXTURE_2D,U,S,T[0].width,T[0].height);for(let t=0,n=T.length;t0){const i=Et(g.width,g.height,n.format,n.type);for(const a of n.layerUpdates){const n=g.data.subarray(a*i/g.data.BYTES_PER_ELEMENT,(a+1)*i/g.data.BYTES_PER_ELEMENT);r.compressedTexSubImage3D(e.TEXTURE_2D_ARRAY,t,0,0,a,g.width,g.height,1,h,n)}n.clearLayerUpdates()}else r.compressedTexSubImage3D(e.TEXTURE_2D_ARRAY,t,0,0,0,g.width,g.height,m.depth,h,g.data)}else r.compressedTexImage3D(e.TEXTURE_2D_ARRAY,t,S,g.width,g.height,m.depth,0,g.data,0,0);else console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()");else R?P&&r.texSubImage3D(e.TEXTURE_2D_ARRAY,t,0,0,0,g.width,g.height,m.depth,h,_,g.data):r.texImage3D(e.TEXTURE_2D_ARRAY,t,S,g.width,g.height,m.depth,0,h,_,g.data)}else{R&&L&&r.texStorage2D(e.TEXTURE_2D,U,S,T[0].width,T[0].height);for(let t=0,i=T.length;t0){const t=Et(m.width,m.height,n.format,n.type);for(const i of n.layerUpdates){const n=m.data.subarray(i*t/m.data.BYTES_PER_ELEMENT,(i+1)*t/m.data.BYTES_PER_ELEMENT);r.texSubImage3D(e.TEXTURE_2D_ARRAY,0,0,0,i,m.width,m.height,1,h,_,n)}n.clearLayerUpdates()}else r.texSubImage3D(e.TEXTURE_2D_ARRAY,0,0,0,0,m.width,m.height,m.depth,h,_,m.data)}else r.texImage3D(e.TEXTURE_2D_ARRAY,0,S,m.width,m.height,m.depth,0,h,_,m.data);else if(n.isData3DTexture)R?(L&&r.texStorage3D(e.TEXTURE_3D,U,S,m.width,m.height,m.depth),P&&r.texSubImage3D(e.TEXTURE_3D,0,0,0,0,m.width,m.height,m.depth,h,_,m.data)):r.texImage3D(e.TEXTURE_3D,0,S,m.width,m.height,m.depth,0,h,_,m.data);else if(n.isFramebufferTexture){if(L)if(R)r.texStorage2D(e.TEXTURE_2D,U,S,m.width,m.height);else{let t=m.width,n=m.height;for(let i=0;i>=1,n>>=1}}else if(T.length>0){if(R&&L){const t=Z(T[0]);r.texStorage2D(e.TEXTURE_2D,U,S,t.width,t.height)}for(let t=0,n=T.length;t>d),i=Math.max(1,n.height>>d);c===e.TEXTURE_3D||c===e.TEXTURE_2D_ARRAY?r.texImage3D(c,d,p,t,i,n.depth,0,u,f,null):r.texImage2D(c,d,p,t,i,0,u,f,null)}r.bindFramebuffer(e.FRAMEBUFFER,t),j(n)?l.framebufferTexture2DMultisampleEXT(e.FRAMEBUFFER,s,c,h.__webglTexture,0,Y(n)):(c===e.TEXTURE_2D||c>=e.TEXTURE_CUBE_MAP_POSITIVE_X&&c<=e.TEXTURE_CUBE_MAP_NEGATIVE_Z)&&e.framebufferTexture2D(e.FRAMEBUFFER,s,c,h.__webglTexture,d),r.bindFramebuffer(e.FRAMEBUFFER,null)}function z(t,n,r){if(e.bindRenderbuffer(e.RENDERBUFFER,t),n.depthBuffer){const i=n.depthTexture,a=i&&i.isDepthTexture?i.type:null,o=b(n.stencilBuffer,a),s=n.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT,c=Y(n);j(n)?l.renderbufferStorageMultisampleEXT(e.RENDERBUFFER,c,o,n.width,n.height):r?e.renderbufferStorageMultisample(e.RENDERBUFFER,c,o,n.width,n.height):e.renderbufferStorage(e.RENDERBUFFER,o,n.width,n.height),e.framebufferRenderbuffer(e.FRAMEBUFFER,s,e.RENDERBUFFER,t)}else{const t=n.textures;for(let i=0;i{delete n.__boundDepthTexture,delete n.__depthDisposeCallback,e.removeEventListener("dispose",t)};e.addEventListener("dispose",t),n.__depthDisposeCallback=t}n.__boundDepthTexture=e}if(t.depthTexture&&!n.__autoAllocateDepthBuffer){if(a)throw new Error("target.depthTexture not supported in Cube render targets");!function(t,n){if(n&&n.isWebGLCubeRenderTarget)throw new Error("Depth Texture with cube render targets is not supported");if(r.bindFramebuffer(e.FRAMEBUFFER,t),!n.depthTexture||!n.depthTexture.isDepthTexture)throw new Error("renderTarget.depthTexture must be an instance of THREE.DepthTexture");const a=i.get(n.depthTexture);a.__renderTarget=n,a.__webglTexture&&n.depthTexture.image.width===n.width&&n.depthTexture.image.height===n.height||(n.depthTexture.image.width=n.width,n.depthTexture.image.height=n.height,n.depthTexture.needsUpdate=!0),w(n.depthTexture,0);const o=a.__webglTexture,s=Y(n);if(n.depthTexture.format===St)j(n)?l.framebufferTexture2DMultisampleEXT(e.FRAMEBUFFER,e.DEPTH_ATTACHMENT,e.TEXTURE_2D,o,0,s):e.framebufferTexture2D(e.FRAMEBUFFER,e.DEPTH_ATTACHMENT,e.TEXTURE_2D,o,0);else{if(n.depthTexture.format!==vt)throw new Error("Unknown depthTexture format");j(n)?l.framebufferTexture2DMultisampleEXT(e.FRAMEBUFFER,e.DEPTH_STENCIL_ATTACHMENT,e.TEXTURE_2D,o,0,s):e.framebufferTexture2D(e.FRAMEBUFFER,e.DEPTH_STENCIL_ATTACHMENT,e.TEXTURE_2D,o,0)}}(n.__webglFramebuffer,t)}else if(a){n.__webglDepthbuffer=[];for(let i=0;i<6;i++)if(r.bindFramebuffer(e.FRAMEBUFFER,n.__webglFramebuffer[i]),void 0===n.__webglDepthbuffer[i])n.__webglDepthbuffer[i]=e.createRenderbuffer(),z(n.__webglDepthbuffer[i],t,!1);else{const r=t.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT,a=n.__webglDepthbuffer[i];e.bindRenderbuffer(e.RENDERBUFFER,a),e.framebufferRenderbuffer(e.FRAMEBUFFER,r,e.RENDERBUFFER,a)}}else if(r.bindFramebuffer(e.FRAMEBUFFER,n.__webglFramebuffer),void 0===n.__webglDepthbuffer)n.__webglDepthbuffer=e.createRenderbuffer(),z(n.__webglDepthbuffer,t,!1);else{const r=t.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT,i=n.__webglDepthbuffer;e.bindRenderbuffer(e.RENDERBUFFER,i),e.framebufferRenderbuffer(e.FRAMEBUFFER,r,e.RENDERBUFFER,i)}r.bindFramebuffer(e.FRAMEBUFFER,null)}const W=[],X=[];function Y(e){return Math.min(a.maxSamples,e.samples)}function j(e){const t=i.get(e);return e.samples>0&&!0===n.has("WEBGL_multisampled_render_to_texture")&&!1!==t.__useRenderToTexture}function q(e,t){const n=e.colorSpace,r=e.format,i=e.type;return!0===e.isCompressedTexture||!0===e.isVideoTexture||n!==F&&n!==gt&&(p.getTransfer(n)===m?r===M&&i===S||console.warn("THREE.WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType."):console.error("THREE.WebGLTextures: Unsupported texture color space:",n)),t}function Z(e){return"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement?(d.width=e.naturalWidth||e.width,d.height=e.naturalHeight||e.height):"undefined"!=typeof VideoFrame&&e instanceof VideoFrame?(d.width=e.displayWidth,d.height=e.displayHeight):(d.width=e.width,d.height=e.height),d}this.allocateTextureUnit=function(){const e=D;return e>=a.maxTextures&&console.warn("THREE.WebGLTextures: Trying to use "+e+" texture units while this GPU supports only "+a.maxTextures),D+=1,e},this.resetTextureUnits=function(){D=0},this.setTexture2D=w,this.setTexture2DArray=function(t,n){const a=i.get(t);t.version>0&&a.__version!==t.version?G(a,t,n):r.bindTexture(e.TEXTURE_2D_ARRAY,a.__webglTexture,e.TEXTURE0+n)},this.setTexture3D=function(t,n){const a=i.get(t);t.version>0&&a.__version!==t.version?G(a,t,n):r.bindTexture(e.TEXTURE_3D,a.__webglTexture,e.TEXTURE0+n)},this.setTextureCube=function(t,n){const s=i.get(t);t.version>0&&s.__version!==t.version?function(t,n,s){if(6!==n.image.length)return;const l=H(t,n),c=n.source;r.bindTexture(e.TEXTURE_CUBE_MAP,t.__webglTexture,e.TEXTURE0+s);const d=i.get(c);if(c.version!==d.__version||!0===l){r.activeTexture(e.TEXTURE0+s);const t=p.getPrimaries(p.workingColorSpace),i=n.colorSpace===gt?null:p.getPrimaries(n.colorSpace),u=n.colorSpace===gt||t===i?e.NONE:e.BROWSER_DEFAULT_WEBGL;e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,n.flipY),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,n.premultiplyAlpha),e.pixelStorei(e.UNPACK_ALIGNMENT,n.unpackAlignment),e.pixelStorei(e.UNPACK_COLORSPACE_CONVERSION_WEBGL,u);const f=n.isCompressedTexture||n.image[0].isCompressedTexture,m=n.image[0]&&n.image[0].isDataTexture,h=[];for(let e=0;e<6;e++)h[e]=f||m?m?n.image[e].image:n.image[e]:v(n.image[e],!0,a.maxCubemapSize),h[e]=q(n,h[e]);const _=h[0],g=o.convert(n.format,n.colorSpace),S=o.convert(n.type),T=A(n.internalFormat,g,S,n.colorSpace),R=!0!==n.isVideoTexture,b=void 0===d.__version||!0===l,L=c.dataReady;let P,U=C(n,_);if(O(e.TEXTURE_CUBE_MAP,n),f){R&&b&&r.texStorage2D(e.TEXTURE_CUBE_MAP,U,T,_.width,_.height);for(let t=0;t<6;t++){P=h[t].mipmaps;for(let i=0;i0&&U++;const t=Z(h[0]);r.texStorage2D(e.TEXTURE_CUBE_MAP,U,T,t.width,t.height)}for(let t=0;t<6;t++)if(m){R?L&&r.texSubImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+t,0,0,0,h[t].width,h[t].height,g,S,h[t].data):r.texImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+t,0,T,h[t].width,h[t].height,0,g,S,h[t].data);for(let n=0;n1;if(u||(void 0===l.__webglTexture&&(l.__webglTexture=e.createTexture()),l.__version=n.version,s.memory.textures++),d){a.__webglFramebuffer=[];for(let t=0;t<6;t++)if(n.mipmaps&&n.mipmaps.length>0){a.__webglFramebuffer[t]=[];for(let r=0;r0){a.__webglFramebuffer=[];for(let t=0;t0&&!1===j(t)){a.__webglMultisampledFramebuffer=e.createFramebuffer(),a.__webglColorRenderbuffer=[],r.bindFramebuffer(e.FRAMEBUFFER,a.__webglMultisampledFramebuffer);for(let n=0;n0)for(let i=0;i0)for(let r=0;r0)if(!1===j(t)){const n=t.textures,a=t.width,o=t.height;let s=e.COLOR_BUFFER_BIT;const l=t.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT,d=i.get(t),u=n.length>1;if(u)for(let t=0;t= 1.0 ) {\n\n\t\tgl_FragDepth = texture( depthColor, vec3( coord.x - 1.0, coord.y, 1 ) ).r;\n\n\t} else {\n\n\t\tgl_FragDepth = texture( depthColor, vec3( coord.x, coord.y, 0 ) ).r;\n\n\t}\n\n}",uniforms:{depthColor:{value:this.texture},depthWidth:{value:t.z},depthHeight:{value:t.w}}});this.mesh=new o(new h(20,20),n)}return this.mesh}reset(){this.texture=null,this.mesh=null}getDepthTexture(){return this.texture}}class oa extends vn{constructor(e,n){super();const r=this;let a=null,o=1,s=null,l="local-floor",c=1,d=null,u=null,f=null,p=null,m=null,h=null;const _=new aa,g=n.getContextAttributes();let v=null,E=null;const T=[],x=[],R=new t;let A=null;const b=new U;b.viewport=new k;const C=new U;C.viewport=new k;const L=[b,C],P=new En;let D=null,w=null;function y(e){const t=x.indexOf(e.inputSource);if(-1===t)return;const n=T[t];void 0!==n&&(n.update(e.inputSource,e.frame,d||s),n.dispatchEvent({type:e.type,data:e.inputSource}))}function N(){a.removeEventListener("select",y),a.removeEventListener("selectstart",y),a.removeEventListener("selectend",y),a.removeEventListener("squeeze",y),a.removeEventListener("squeezestart",y),a.removeEventListener("squeezeend",y),a.removeEventListener("end",N),a.removeEventListener("inputsourceschange",O);for(let e=0;e=0&&(x[r]=null,T[r].disconnect(n))}for(let t=0;t=x.length){x.push(n),r=e;break}if(null===x[e]){x[e]=n,r=e;break}}if(-1===r)break}const i=T[r];i&&i.connect(n)}}this.cameraAutoUpdate=!0,this.enabled=!1,this.isPresenting=!1,this.getController=function(e){let t=T[e];return void 0===t&&(t=new Sn,T[e]=t),t.getTargetRaySpace()},this.getControllerGrip=function(e){let t=T[e];return void 0===t&&(t=new Sn,T[e]=t),t.getGripSpace()},this.getHand=function(e){let t=T[e];return void 0===t&&(t=new Sn,T[e]=t),t.getHandSpace()},this.setFramebufferScaleFactor=function(e){o=e,!0===r.isPresenting&&console.warn("THREE.WebXRManager: Cannot change framebuffer scale while presenting.")},this.setReferenceSpaceType=function(e){l=e,!0===r.isPresenting&&console.warn("THREE.WebXRManager: Cannot change reference space type while presenting.")},this.getReferenceSpace=function(){return d||s},this.setReferenceSpace=function(e){d=e},this.getBaseLayer=function(){return null!==p?p:m},this.getBinding=function(){return f},this.getFrame=function(){return h},this.getSession=function(){return a},this.setSession=async function(t){if(a=t,null!==a){v=e.getRenderTarget(),a.addEventListener("select",y),a.addEventListener("selectstart",y),a.addEventListener("selectend",y),a.addEventListener("squeeze",y),a.addEventListener("squeezestart",y),a.addEventListener("squeezeend",y),a.addEventListener("end",N),a.addEventListener("inputsourceschange",O),!0!==g.xrCompatible&&await n.makeXRCompatible(),A=e.getPixelRatio(),e.getSize(R);if("undefined"!=typeof XRWebGLBinding&&"createProjectionLayer"in XRWebGLBinding.prototype){let t=null,r=null,i=null;g.depth&&(i=g.stencil?n.DEPTH24_STENCIL8:n.DEPTH_COMPONENT24,t=g.stencil?vt:St,r=g.stencil?Mt:Tt);const s={colorFormat:n.RGBA8,depthFormat:i,scaleFactor:o};f=new XRWebGLBinding(a,n),p=f.createProjectionLayer(s),a.updateRenderState({layers:[p]}),e.setPixelRatio(1),e.setSize(p.textureWidth,p.textureHeight,!1),E=new I(p.textureWidth,p.textureHeight,{format:M,type:S,depthTexture:new j(p.textureWidth,p.textureHeight,r,void 0,void 0,void 0,void 0,void 0,void 0,t),stencilBuffer:g.stencil,colorSpace:e.outputColorSpace,samples:g.antialias?4:0,resolveDepthBuffer:!1===p.ignoreDepthValues,resolveStencilBuffer:!1===p.ignoreDepthValues})}else{const t={antialias:g.antialias,alpha:!0,depth:g.depth,stencil:g.stencil,framebufferScaleFactor:o};m=new XRWebGLLayer(a,n,t),a.updateRenderState({baseLayer:m}),e.setPixelRatio(1),e.setSize(m.framebufferWidth,m.framebufferHeight,!1),E=new I(m.framebufferWidth,m.framebufferHeight,{format:M,type:S,colorSpace:e.outputColorSpace,stencilBuffer:g.stencil,resolveDepthBuffer:!1===m.ignoreDepthValues,resolveStencilBuffer:!1===m.ignoreDepthValues})}E.isXRRenderTarget=!0,this.setFoveation(c),d=null,s=await a.requestReferenceSpace(l),V.setContext(a),V.start(),r.isPresenting=!0,r.dispatchEvent({type:"sessionstart"})}},this.getEnvironmentBlendMode=function(){if(null!==a)return a.environmentBlendMode},this.getDepthTexture=function(){return _.getDepthTexture()};const F=new i,B=new i;function H(e,t){null===t?e.matrixWorld.copy(e.matrix):e.matrixWorld.multiplyMatrices(t.matrixWorld,e.matrix),e.matrixWorldInverse.copy(e.matrixWorld).invert()}this.updateCamera=function(e){if(null===a)return;let t=e.near,n=e.far;null!==_.texture&&(_.depthNear>0&&(t=_.depthNear),_.depthFar>0&&(n=_.depthFar)),P.near=C.near=b.near=t,P.far=C.far=b.far=n,D===P.near&&w===P.far||(a.updateRenderState({depthNear:P.near,depthFar:P.far}),D=P.near,w=P.far),b.layers.mask=2|e.layers.mask,C.layers.mask=4|e.layers.mask,P.layers.mask=b.layers.mask|C.layers.mask;const r=e.parent,i=P.cameras;H(P,r);for(let e=0;e0&&(e.alphaTest.value=r.alphaTest);const i=t.get(r),a=i.envMap,o=i.envMapRotation;a&&(e.envMap.value=a,sa.copy(o),sa.x*=-1,sa.y*=-1,sa.z*=-1,a.isCubeTexture&&!1===a.isRenderTargetTexture&&(sa.y*=-1,sa.z*=-1),e.envMapRotation.value.setFromMatrix4(la.makeRotationFromEuler(sa)),e.flipEnvMap.value=a.isCubeTexture&&!1===a.isRenderTargetTexture?-1:1,e.reflectivity.value=r.reflectivity,e.ior.value=r.ior,e.refractionRatio.value=r.refractionRatio),r.lightMap&&(e.lightMap.value=r.lightMap,e.lightMapIntensity.value=r.lightMapIntensity,n(r.lightMap,e.lightMapTransform)),r.aoMap&&(e.aoMap.value=r.aoMap,e.aoMapIntensity.value=r.aoMapIntensity,n(r.aoMap,e.aoMapTransform))}return{refreshFogUniforms:function(t,n){n.color.getRGB(t.fogColor.value,g(e)),n.isFog?(t.fogNear.value=n.near,t.fogFar.value=n.far):n.isFogExp2&&(t.fogDensity.value=n.density)},refreshMaterialUniforms:function(e,i,a,o,s){i.isMeshBasicMaterial||i.isMeshLambertMaterial?r(e,i):i.isMeshToonMaterial?(r(e,i),function(e,t){t.gradientMap&&(e.gradientMap.value=t.gradientMap)}(e,i)):i.isMeshPhongMaterial?(r(e,i),function(e,t){e.specular.value.copy(t.specular),e.shininess.value=Math.max(t.shininess,1e-4)}(e,i)):i.isMeshStandardMaterial?(r(e,i),function(e,t){e.metalness.value=t.metalness,t.metalnessMap&&(e.metalnessMap.value=t.metalnessMap,n(t.metalnessMap,e.metalnessMapTransform));e.roughness.value=t.roughness,t.roughnessMap&&(e.roughnessMap.value=t.roughnessMap,n(t.roughnessMap,e.roughnessMapTransform));t.envMap&&(e.envMapIntensity.value=t.envMapIntensity)}(e,i),i.isMeshPhysicalMaterial&&function(e,t,r){e.ior.value=t.ior,t.sheen>0&&(e.sheenColor.value.copy(t.sheenColor).multiplyScalar(t.sheen),e.sheenRoughness.value=t.sheenRoughness,t.sheenColorMap&&(e.sheenColorMap.value=t.sheenColorMap,n(t.sheenColorMap,e.sheenColorMapTransform)),t.sheenRoughnessMap&&(e.sheenRoughnessMap.value=t.sheenRoughnessMap,n(t.sheenRoughnessMap,e.sheenRoughnessMapTransform)));t.clearcoat>0&&(e.clearcoat.value=t.clearcoat,e.clearcoatRoughness.value=t.clearcoatRoughness,t.clearcoatMap&&(e.clearcoatMap.value=t.clearcoatMap,n(t.clearcoatMap,e.clearcoatMapTransform)),t.clearcoatRoughnessMap&&(e.clearcoatRoughnessMap.value=t.clearcoatRoughnessMap,n(t.clearcoatRoughnessMap,e.clearcoatRoughnessMapTransform)),t.clearcoatNormalMap&&(e.clearcoatNormalMap.value=t.clearcoatNormalMap,n(t.clearcoatNormalMap,e.clearcoatNormalMapTransform),e.clearcoatNormalScale.value.copy(t.clearcoatNormalScale),t.side===c&&e.clearcoatNormalScale.value.negate()));t.dispersion>0&&(e.dispersion.value=t.dispersion);t.iridescence>0&&(e.iridescence.value=t.iridescence,e.iridescenceIOR.value=t.iridescenceIOR,e.iridescenceThicknessMinimum.value=t.iridescenceThicknessRange[0],e.iridescenceThicknessMaximum.value=t.iridescenceThicknessRange[1],t.iridescenceMap&&(e.iridescenceMap.value=t.iridescenceMap,n(t.iridescenceMap,e.iridescenceMapTransform)),t.iridescenceThicknessMap&&(e.iridescenceThicknessMap.value=t.iridescenceThicknessMap,n(t.iridescenceThicknessMap,e.iridescenceThicknessMapTransform)));t.transmission>0&&(e.transmission.value=t.transmission,e.transmissionSamplerMap.value=r.texture,e.transmissionSamplerSize.value.set(r.width,r.height),t.transmissionMap&&(e.transmissionMap.value=t.transmissionMap,n(t.transmissionMap,e.transmissionMapTransform)),e.thickness.value=t.thickness,t.thicknessMap&&(e.thicknessMap.value=t.thicknessMap,n(t.thicknessMap,e.thicknessMapTransform)),e.attenuationDistance.value=t.attenuationDistance,e.attenuationColor.value.copy(t.attenuationColor));t.anisotropy>0&&(e.anisotropyVector.value.set(t.anisotropy*Math.cos(t.anisotropyRotation),t.anisotropy*Math.sin(t.anisotropyRotation)),t.anisotropyMap&&(e.anisotropyMap.value=t.anisotropyMap,n(t.anisotropyMap,e.anisotropyMapTransform)));e.specularIntensity.value=t.specularIntensity,e.specularColor.value.copy(t.specularColor),t.specularColorMap&&(e.specularColorMap.value=t.specularColorMap,n(t.specularColorMap,e.specularColorMapTransform));t.specularIntensityMap&&(e.specularIntensityMap.value=t.specularIntensityMap,n(t.specularIntensityMap,e.specularIntensityMapTransform))}(e,i,s)):i.isMeshMatcapMaterial?(r(e,i),function(e,t){t.matcap&&(e.matcap.value=t.matcap)}(e,i)):i.isMeshDepthMaterial?r(e,i):i.isMeshDistanceMaterial?(r(e,i),function(e,n){const r=t.get(n).light;e.referencePosition.value.setFromMatrixPosition(r.matrixWorld),e.nearDistance.value=r.shadow.camera.near,e.farDistance.value=r.shadow.camera.far}(e,i)):i.isMeshNormalMaterial?r(e,i):i.isLineBasicMaterial?(function(e,t){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity,t.map&&(e.map.value=t.map,n(t.map,e.mapTransform))}(e,i),i.isLineDashedMaterial&&function(e,t){e.dashSize.value=t.dashSize,e.totalSize.value=t.dashSize+t.gapSize,e.scale.value=t.scale}(e,i)):i.isPointsMaterial?function(e,t,r,i){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity,e.size.value=t.size*r,e.scale.value=.5*i,t.map&&(e.map.value=t.map,n(t.map,e.uvTransform));t.alphaMap&&(e.alphaMap.value=t.alphaMap,n(t.alphaMap,e.alphaMapTransform));t.alphaTest>0&&(e.alphaTest.value=t.alphaTest)}(e,i,a,o):i.isSpriteMaterial?function(e,t){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity,e.rotation.value=t.rotation,t.map&&(e.map.value=t.map,n(t.map,e.mapTransform));t.alphaMap&&(e.alphaMap.value=t.alphaMap,n(t.alphaMap,e.alphaMapTransform));t.alphaTest>0&&(e.alphaTest.value=t.alphaTest)}(e,i):i.isShadowMaterial?(e.color.value.copy(i.color),e.opacity.value=i.opacity):i.isShaderMaterial&&(i.uniformsNeedUpdate=!1)}}}function da(e,t,n,r){let i={},a={},o=[];const s=e.getParameter(e.MAX_UNIFORM_BUFFER_BINDINGS);function l(e,t,n,r){const i=e.value,a=t+"_"+n;if(void 0===r[a])return r[a]="number"==typeof i||"boolean"==typeof i?i:i.clone(),!0;{const e=r[a];if("number"==typeof i||"boolean"==typeof i){if(e!==i)return r[a]=i,!0}else if(!1===e.equals(i))return e.copy(i),!0}return!1}function c(e){const t={boundary:0,storage:0};return"number"==typeof e||"boolean"==typeof e?(t.boundary=4,t.storage=4):e.isVector2?(t.boundary=8,t.storage=8):e.isVector3||e.isColor?(t.boundary=16,t.storage=12):e.isVector4?(t.boundary=16,t.storage=16):e.isMatrix3?(t.boundary=48,t.storage=48):e.isMatrix4?(t.boundary=64,t.storage=64):e.isTexture?console.warn("THREE.WebGLRenderer: Texture samplers can not be part of an uniforms group."):console.warn("THREE.WebGLRenderer: Unsupported uniform value type.",e),t}function d(t){const n=t.target;n.removeEventListener("dispose",d);const r=o.indexOf(n.__bindingPointIndex);o.splice(r,1),e.deleteBuffer(i[n.id]),delete i[n.id],delete a[n.id]}return{bind:function(e,t){const n=t.program;r.uniformBlockBinding(e,n)},update:function(n,u){let f=i[n.id];void 0===f&&(!function(e){const t=e.uniforms;let n=0;const r=16;for(let e=0,i=t.length;e0&&(n+=r-i);e.__size=n,e.__cache={}}(n),f=function(t){const n=function(){for(let e=0;e0),u=!!n.morphAttributes.position,f=!!n.morphAttributes.normal,p=!!n.morphAttributes.color;let m=D;r.toneMapped&&(null!==w&&!0!==w.isXRRenderTarget||(m=C.toneMapping));const h=n.morphAttributes.position||n.morphAttributes.normal||n.morphAttributes.color,_=void 0!==h?h.length:0,g=pe.get(r),v=R.state.lights;if(!0===J&&(!0===ee||e!==N)){const t=e===N&&r.id===y;Ae.setState(r,e,t)}let E=!1;r.version===g.__version?g.needsLights&&g.lightsStateVersion!==v.state.version||g.outputColorSpace!==s||i.isBatchedMesh&&!1===g.batching?E=!0:i.isBatchedMesh||!0!==g.batching?i.isBatchedMesh&&!0===g.batchingColor&&null===i.colorTexture||i.isBatchedMesh&&!1===g.batchingColor&&null!==i.colorTexture||i.isInstancedMesh&&!1===g.instancing?E=!0:i.isInstancedMesh||!0!==g.instancing?i.isSkinnedMesh&&!1===g.skinning?E=!0:i.isSkinnedMesh||!0!==g.skinning?i.isInstancedMesh&&!0===g.instancingColor&&null===i.instanceColor||i.isInstancedMesh&&!1===g.instancingColor&&null!==i.instanceColor||i.isInstancedMesh&&!0===g.instancingMorph&&null===i.morphTexture||i.isInstancedMesh&&!1===g.instancingMorph&&null!==i.morphTexture||g.envMap!==l||!0===r.fog&&g.fog!==a?E=!0:void 0===g.numClippingPlanes||g.numClippingPlanes===Ae.numPlanes&&g.numIntersection===Ae.numIntersection?(g.vertexAlphas!==c||g.vertexTangents!==d||g.morphTargets!==u||g.morphNormals!==f||g.morphColors!==p||g.toneMapping!==m||g.morphTargetsCount!==_)&&(E=!0):E=!0:E=!0:E=!0:E=!0:(E=!0,g.__version=r.version);let S=g.currentProgram;!0===E&&(S=Qe(r,t,i));let T=!1,M=!1,x=!1;const A=S.getUniforms(),b=g.uniforms;de.useProgram(S.program)&&(T=!0,M=!0,x=!0);r.id!==y&&(y=r.id,M=!0);if(T||N!==e){de.buffers.depth.getReversed()?(te.copy(e.projectionMatrix),An(te),bn(te),A.setValue(Ie,"projectionMatrix",te)):A.setValue(Ie,"projectionMatrix",e.projectionMatrix),A.setValue(Ie,"viewMatrix",e.matrixWorldInverse);const t=A.map.cameraPosition;void 0!==t&&t.setValue(Ie,re.setFromMatrixPosition(e.matrixWorld)),ce.logarithmicDepthBuffer&&A.setValue(Ie,"logDepthBufFC",2/(Math.log(e.far+1)/Math.LN2)),(r.isMeshPhongMaterial||r.isMeshToonMaterial||r.isMeshLambertMaterial||r.isMeshBasicMaterial||r.isMeshStandardMaterial||r.isShaderMaterial)&&A.setValue(Ie,"isOrthographic",!0===e.isOrthographicCamera),N!==e&&(N=e,M=!0,x=!0)}if(i.isSkinnedMesh){A.setOptional(Ie,i,"bindMatrix"),A.setOptional(Ie,i,"bindMatrixInverse");const e=i.skeleton;e&&(null===e.boneTexture&&e.computeBoneTexture(),A.setValue(Ie,"boneTexture",e.boneTexture,me))}i.isBatchedMesh&&(A.setOptional(Ie,i,"batchingTexture"),A.setValue(Ie,"batchingTexture",i._matricesTexture,me),A.setOptional(Ie,i,"batchingIdTexture"),A.setValue(Ie,"batchingIdTexture",i._indirectTexture,me),A.setOptional(Ie,i,"batchingColorTexture"),null!==i._colorsTexture&&A.setValue(Ie,"batchingColorTexture",i._colorsTexture,me));const L=n.morphAttributes;void 0===L.position&&void 0===L.normal&&void 0===L.color||Le.update(i,n,S);(M||g.receiveShadow!==i.receiveShadow)&&(g.receiveShadow=i.receiveShadow,A.setValue(Ie,"receiveShadow",i.receiveShadow));r.isMeshGouraudMaterial&&null!==r.envMap&&(b.envMap.value=l,b.flipEnvMap.value=l.isCubeTexture&&!1===l.isRenderTargetTexture?-1:1);r.isMeshStandardMaterial&&null===r.envMap&&null!==t.environment&&(b.envMapIntensity.value=t.environmentIntensity);M&&(A.setValue(Ie,"toneMappingExposure",C.toneMappingExposure),g.needsLights&&(U=x,(P=b).ambientLightColor.needsUpdate=U,P.lightProbe.needsUpdate=U,P.directionalLights.needsUpdate=U,P.directionalLightShadows.needsUpdate=U,P.pointLights.needsUpdate=U,P.pointLightShadows.needsUpdate=U,P.spotLights.needsUpdate=U,P.spotLightShadows.needsUpdate=U,P.rectAreaLights.needsUpdate=U,P.hemisphereLights.needsUpdate=U),a&&!0===r.fog&&Me.refreshFogUniforms(b,a),Me.refreshMaterialUniforms(b,r,Y,X,R.state.transmissionRenderTarget[e.id]),vi.upload(Ie,Je(g),b,me));var P,U;r.isShaderMaterial&&!0===r.uniformsNeedUpdate&&(vi.upload(Ie,Je(g),b,me),r.uniformsNeedUpdate=!1);r.isSpriteMaterial&&A.setValue(Ie,"center",i.center);if(A.setValue(Ie,"modelViewMatrix",i.modelViewMatrix),A.setValue(Ie,"normalMatrix",i.normalMatrix),A.setValue(Ie,"modelMatrix",i.matrixWorld),r.isShaderMaterial||r.isRawShaderMaterial){const e=r.uniformsGroups;for(let t=0,n=e.length;t{function n(){r.forEach((function(e){pe.get(e).currentProgram.isReady()&&r.delete(e)})),0!==r.size?setTimeout(n,10):t(e)}null!==le.get("KHR_parallel_shader_compile")?n():setTimeout(n,10)}))};let ke=null;function We(){Ye.stop()}function Xe(){Ye.start()}const Ye=new Pn;function Ke(e,t,n,r){if(!1===e.visible)return;if(e.layers.test(t.layers))if(e.isGroup)n=e.renderOrder;else if(e.isLOD)!0===e.autoUpdate&&e.update(t);else if(e.isLight)R.pushLight(e),e.castShadow&&R.pushShadow(e);else if(e.isSprite){if(!e.frustumCulled||Q.intersectsSprite(e)){r&&ie.setFromMatrixPosition(e.matrixWorld).applyMatrix4(ne);const t=Se.update(e),i=e.material;i.visible&&x.push(e,t,i,n,ie.z,null)}}else if((e.isMesh||e.isLine||e.isPoints)&&(!e.frustumCulled||Q.intersectsObject(e))){const t=Se.update(e),i=e.material;if(r&&(void 0!==e.boundingSphere?(null===e.boundingSphere&&e.computeBoundingSphere(),ie.copy(e.boundingSphere.center)):(null===t.boundingSphere&&t.computeBoundingSphere(),ie.copy(t.boundingSphere.center)),ie.applyMatrix4(e.matrixWorld).applyMatrix4(ne)),Array.isArray(i)){const r=t.groups;for(let a=0,o=r.length;a0&&Ze(i,t,n),a.length>0&&Ze(a,t,n),o.length>0&&Ze(o,t,n),de.buffers.depth.setTest(!0),de.buffers.depth.setMask(!0),de.buffers.color.setMask(!0),de.setPolygonOffset(!1)}function qe(e,t,n,r){if(null!==(!0===n.isScene?n.overrideMaterial:null))return;void 0===R.state.transmissionRenderTarget[r.id]&&(R.state.transmissionRenderTarget[r.id]=new I(1,1,{generateMipmaps:!0,type:le.has("EXT_color_buffer_half_float")||le.has("EXT_color_buffer_float")?E:S,minFilter:ot,samples:4,stencilBuffer:o,resolveDepthBuffer:!1,resolveStencilBuffer:!1,colorSpace:p.workingColorSpace}));const i=R.state.transmissionRenderTarget[r.id],a=r.viewport||O;i.setSize(a.z*C.transmissionResolutionScale,a.w*C.transmissionResolutionScale);const s=C.getRenderTarget();C.setRenderTarget(i),C.getClearColor(V),z=C.getClearAlpha(),z<1&&C.setClearColor(16777215,.5),C.clear(),oe&&Ce.render(n);const l=C.toneMapping;C.toneMapping=D;const d=r.viewport;if(void 0!==r.viewport&&(r.viewport=void 0),R.setupLightsView(r),!0===J&&Ae.setGlobalState(C.clippingPlanes,r),Ze(e,n,r),me.updateMultisampleRenderTarget(i),me.updateRenderTargetMipmap(i),!1===le.has("WEBGL_multisampled_render_to_texture")){let e=!1;for(let i=0,a=t.length;i0)for(let t=0,a=n.length;t0&&qe(r,i,e,t),oe&&Ce.render(e),je(x,e,t);null!==w&&0===U&&(me.updateMultisampleRenderTarget(w),me.updateRenderTargetMipmap(w)),!0===e.isScene&&e.onAfterRender(C,e,t),we.resetDefaultState(),y=-1,N=null,b.pop(),b.length>0?(R=b[b.length-1],!0===J&&Ae.setGlobalState(C.clippingPlanes,R.state.camera)):R=null,A.pop(),x=A.length>0?A[A.length-1]:null},this.getActiveCubeFace=function(){return P},this.getActiveMipmapLevel=function(){return U},this.getRenderTarget=function(){return w},this.setRenderTargetTextures=function(e,t,n){const r=pe.get(e);r.__autoAllocateDepthBuffer=!1===e.resolveDepthBuffer,!1===r.__autoAllocateDepthBuffer&&(r.__useRenderToTexture=!1),pe.get(e.texture).__webglTexture=t,pe.get(e.depthTexture).__webglTexture=r.__autoAllocateDepthBuffer?void 0:n,r.__hasExternalTextures=!0},this.setRenderTargetFramebuffer=function(e,t){const n=pe.get(e);n.__webglFramebuffer=t,n.__useDefaultFramebuffer=void 0===t};const tt=Ie.createFramebuffer();this.setRenderTarget=function(e,t=0,n=0){w=e,P=t,U=n;let r=!0,i=null,a=!1,o=!1;if(e){const s=pe.get(e);if(void 0!==s.__useDefaultFramebuffer)de.bindFramebuffer(Ie.FRAMEBUFFER,null),r=!1;else if(void 0===s.__webglFramebuffer)me.setupRenderTarget(e);else if(s.__hasExternalTextures)me.rebindTextures(e,pe.get(e.texture).__webglTexture,pe.get(e.depthTexture).__webglTexture);else if(e.depthBuffer){const t=e.depthTexture;if(s.__boundDepthTexture!==t){if(null!==t&&pe.has(t)&&(e.width!==t.image.width||e.height!==t.image.height))throw new Error("WebGLRenderTarget: Attached DepthTexture is initialized to the incorrect size.");me.setupDepthRenderbuffer(e)}}const l=e.texture;(l.isData3DTexture||l.isDataArrayTexture||l.isCompressedArrayTexture)&&(o=!0);const c=pe.get(e).__webglFramebuffer;e.isWebGLCubeRenderTarget?(i=Array.isArray(c[t])?c[t][n]:c[t],a=!0):i=e.samples>0&&!1===me.useMultisampledRTT(e)?pe.get(e).__webglMultisampledFramebuffer:Array.isArray(c)?c[n]:c,O.copy(e.viewport),B.copy(e.scissor),G=e.scissorTest}else O.copy(q).multiplyScalar(Y).floor(),B.copy(Z).multiplyScalar(Y).floor(),G=$;0!==n&&(i=tt);if(de.bindFramebuffer(Ie.FRAMEBUFFER,i)&&r&&de.drawBuffers(e,i),de.viewport(O),de.scissor(B),de.setScissorTest(G),a){const r=pe.get(e.texture);Ie.framebufferTexture2D(Ie.FRAMEBUFFER,Ie.COLOR_ATTACHMENT0,Ie.TEXTURE_CUBE_MAP_POSITIVE_X+t,r.__webglTexture,n)}else if(o){const r=pe.get(e.texture),i=t;Ie.framebufferTextureLayer(Ie.FRAMEBUFFER,Ie.COLOR_ATTACHMENT0,r.__webglTexture,n,i)}else if(null!==e&&0!==n){const t=pe.get(e.texture);Ie.framebufferTexture2D(Ie.FRAMEBUFFER,Ie.COLOR_ATTACHMENT0,Ie.TEXTURE_2D,t.__webglTexture,n)}y=-1},this.readRenderTargetPixels=function(e,t,n,r,i,a,o){if(!e||!e.isWebGLRenderTarget)return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let s=pe.get(e).__webglFramebuffer;if(e.isWebGLCubeRenderTarget&&void 0!==o&&(s=s[o]),s){de.bindFramebuffer(Ie.FRAMEBUFFER,s);try{const o=e.texture,s=o.format,l=o.type;if(!ce.textureFormatReadable(s))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.");if(!ce.textureTypeReadable(l))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.");t>=0&&t<=e.width-r&&n>=0&&n<=e.height-i&&Ie.readPixels(t,n,r,i,De.convert(s),De.convert(l),a)}finally{const e=null!==w?pe.get(w).__webglFramebuffer:null;de.bindFramebuffer(Ie.FRAMEBUFFER,e)}}},this.readRenderTargetPixelsAsync=async function(e,t,n,r,i,a,o){if(!e||!e.isWebGLRenderTarget)throw new Error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let s=pe.get(e).__webglFramebuffer;if(e.isWebGLCubeRenderTarget&&void 0!==o&&(s=s[o]),s){if(t>=0&&t<=e.width-r&&n>=0&&n<=e.height-i){de.bindFramebuffer(Ie.FRAMEBUFFER,s);const o=e.texture,l=o.format,c=o.type;if(!ce.textureFormatReadable(l))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format.");if(!ce.textureTypeReadable(c))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type.");const d=Ie.createBuffer();Ie.bindBuffer(Ie.PIXEL_PACK_BUFFER,d),Ie.bufferData(Ie.PIXEL_PACK_BUFFER,a.byteLength,Ie.STREAM_READ),Ie.readPixels(t,n,r,i,De.convert(l),De.convert(c),0);const u=null!==w?pe.get(w).__webglFramebuffer:null;de.bindFramebuffer(Ie.FRAMEBUFFER,u);const f=Ie.fenceSync(Ie.SYNC_GPU_COMMANDS_COMPLETE,0);return Ie.flush(),await Cn(Ie,f,4),Ie.bindBuffer(Ie.PIXEL_PACK_BUFFER,d),Ie.getBufferSubData(Ie.PIXEL_PACK_BUFFER,0,a),Ie.deleteBuffer(d),Ie.deleteSync(f),a}throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: requested read bounds are out of range.")}},this.copyFramebufferToTexture=function(e,t=null,n=0){const r=Math.pow(2,-n),i=Math.floor(e.image.width*r),a=Math.floor(e.image.height*r),o=null!==t?t.x:0,s=null!==t?t.y:0;me.setTexture2D(e,0),Ie.copyTexSubImage2D(Ie.TEXTURE_2D,n,0,0,o,s,i,a),de.unbindTexture()};const nt=Ie.createFramebuffer(),rt=Ie.createFramebuffer();this.copyTextureToTexture=function(e,t,n=null,r=null,i=0,a=null){let o,s,l,c,d,u,f,p,m;null===a&&(0!==i?(H("WebGLRenderer: copyTextureToTexture function signature has changed to support src and dst mipmap levels."),a=i,i=0):a=0);const h=e.isCompressedTexture?e.mipmaps[a]:e.image;if(null!==n)o=n.max.x-n.min.x,s=n.max.y-n.min.y,l=n.isBox3?n.max.z-n.min.z:1,c=n.min.x,d=n.min.y,u=n.isBox3?n.min.z:0;else{const t=Math.pow(2,-i);o=Math.floor(h.width*t),s=Math.floor(h.height*t),l=e.isDataArrayTexture?h.depth:e.isData3DTexture?Math.floor(h.depth*t):1,c=0,d=0,u=0}null!==r?(f=r.x,p=r.y,m=r.z):(f=0,p=0,m=0);const _=De.convert(t.format),g=De.convert(t.type);let v;t.isData3DTexture?(me.setTexture3D(t,0),v=Ie.TEXTURE_3D):t.isDataArrayTexture||t.isCompressedArrayTexture?(me.setTexture2DArray(t,0),v=Ie.TEXTURE_2D_ARRAY):(me.setTexture2D(t,0),v=Ie.TEXTURE_2D),Ie.pixelStorei(Ie.UNPACK_FLIP_Y_WEBGL,t.flipY),Ie.pixelStorei(Ie.UNPACK_PREMULTIPLY_ALPHA_WEBGL,t.premultiplyAlpha),Ie.pixelStorei(Ie.UNPACK_ALIGNMENT,t.unpackAlignment);const E=Ie.getParameter(Ie.UNPACK_ROW_LENGTH),S=Ie.getParameter(Ie.UNPACK_IMAGE_HEIGHT),T=Ie.getParameter(Ie.UNPACK_SKIP_PIXELS),M=Ie.getParameter(Ie.UNPACK_SKIP_ROWS),x=Ie.getParameter(Ie.UNPACK_SKIP_IMAGES);Ie.pixelStorei(Ie.UNPACK_ROW_LENGTH,h.width),Ie.pixelStorei(Ie.UNPACK_IMAGE_HEIGHT,h.height),Ie.pixelStorei(Ie.UNPACK_SKIP_PIXELS,c),Ie.pixelStorei(Ie.UNPACK_SKIP_ROWS,d),Ie.pixelStorei(Ie.UNPACK_SKIP_IMAGES,u);const R=e.isDataArrayTexture||e.isData3DTexture,A=t.isDataArrayTexture||t.isData3DTexture;if(e.isDepthTexture){const n=pe.get(e),r=pe.get(t),h=pe.get(n.__renderTarget),_=pe.get(r.__renderTarget);de.bindFramebuffer(Ie.READ_FRAMEBUFFER,h.__webglFramebuffer),de.bindFramebuffer(Ie.DRAW_FRAMEBUFFER,_.__webglFramebuffer);for(let n=0;n} - */ this.occludedResolveCache = new Map(); - } - /** - * Initializes the backend so it is ready for usage. - * - * @async - * @param {Renderer} renderer - The renderer. - * @return {Promise} A Promise that resolves when the backend has been initialized. - */ async init( renderer ) { - await super.init( renderer ); - - // - const parameters = this.parameters; - - // create the device if it is not passed with parameters - let device; if ( parameters.device === undefined ) { - - const adapterOptions = { - powerPreference: parameters.powerPreference - }; - + const adapterOptions = { powerPreference: parameters.powerPreference }; const adapter = ( typeof navigator !== 'undefined' ) ? await navigator.gpu.requestAdapter( adapterOptions ) : null; - if ( adapter === null ) { - - throw new Error( 'WebGPUBackend: Unable to create WebGPU adapter.' ); - - } - - // feature support + if ( adapter === null ) throw new Error( 'WebGPUBackend: Unable to create WebGPU adapter.' ); const features = Object.values( GPUFeatureName ); + const supportedFeatures = features.filter( name => adapter.features.has( name ) ); - const supportedFeatures = []; - - for ( const name of features ) { - - if ( adapter.features.has( name ) ) { - - supportedFeatures.push( name ); - - } - - } - - const deviceDescriptor = { - requiredFeatures: supportedFeatures, - requiredLimits: parameters.requiredLimits - }; - - device = await adapter.requestDevice( deviceDescriptor ); - + device = await adapter.requestDevice({ requiredFeatures: supportedFeatures, requiredLimits: parameters.requiredLimits }); } else { - device = parameters.device; - } device.lost.then( ( info ) => { - - const deviceLossInfo = { + renderer.onDeviceLost({ api: 'WebGPU', message: info.message || 'Unknown reason', reason: info.reason || null, originalEvent: info - }; - - renderer.onDeviceLost( deviceLossInfo ); - - } ); - - const context = ( parameters.context !== undefined ) ? parameters.context : renderer.domElement.getContext( 'webgpu' ); + }); + }); + const context = parameters.context !== undefined ? parameters.context : renderer.domElement.getContext( 'webgpu' ); this.device = device; this.context = context; - const alphaMode = parameters.alpha ? 'premultiplied' : 'opaque'; - this.trackTimestamp = this.trackTimestamp && this.hasFeature( GPUFeatureName.TimestampQuery ); - this.context.configure( { + this.context.configure({ device: this.device, format: this.utils.getPreferredCanvasFormat(), usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC, alphaMode: alphaMode - } ); + }); - this.updateSize(); + if (typeof window !== 'undefined' && 'checkWebGPUState' in window) { + checkWebGPUState(); + } + this.updateSize(); } - /** - * The coordinate system of the backend. - * - * @type {number} - * @readonly - */ get coordinateSystem() { - return WebGPUCoordinateSystem; - } /** @@ -71272,3 +71107,4 @@ class ClippingGroup extends Group { } export { ACESFilmicToneMapping, AONode, AddEquation, AddOperation, AdditiveBlending, AgXToneMapping, AlphaFormat, AlwaysCompare, AlwaysDepth, AlwaysStencilFunc, AmbientLight, AmbientLightNode, AnalyticLightNode, ArrayCamera, ArrayElementNode, ArrayNode, AssignNode, AttributeNode, BackSide, BasicEnvironmentNode, BasicShadowMap, BatchNode, BoxGeometry, BufferAttribute, BufferAttributeNode, BufferGeometry, BufferNode, BumpMapNode, BundleGroup, BypassNode, ByteType, CacheNode, Camera, CineonToneMapping, ClampToEdgeWrapping, ClippingGroup, CodeNode, Color, ColorManagement, ColorSpaceNode, ComputeNode, ConstNode, ContextNode, ConvertNode, CubeCamera, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeTextureNode, CubeUVReflectionMapping, CullFaceBack, CullFaceFront, CullFaceNone, CustomBlending, CylinderGeometry, DataArrayTexture, DataTexture, DebugNode, DecrementStencilOp, DecrementWrapStencilOp, DepthFormat, DepthStencilFormat, DepthTexture, DirectionalLight, DirectionalLightNode, DoubleSide, DstAlphaFactor, DstColorFactor, DynamicDrawUsage, EnvironmentNode, EqualCompare, EqualDepth, EqualStencilFunc, EquirectUVNode, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, ExpressionNode, FileLoader, Float16BufferAttribute, Float32BufferAttribute, FloatType, FramebufferTexture, FrontFacingNode, FrontSide, Frustum, FunctionCallNode, FunctionNode, FunctionOverloadingNode, GLSLNodeParser, GreaterCompare, GreaterDepth, GreaterEqualCompare, GreaterEqualDepth, GreaterEqualStencilFunc, GreaterStencilFunc, Group, HalfFloatType, HemisphereLight, HemisphereLightNode, IESSpotLight, IESSpotLightNode, IncrementStencilOp, IncrementWrapStencilOp, IndexNode, IndirectStorageBufferAttribute, InstanceNode, InstancedBufferAttribute, InstancedInterleavedBuffer, InstancedMeshNode, IntType, InterleavedBuffer, InterleavedBufferAttribute, InvertStencilOp, IrradianceNode, JoinNode, KeepStencilOp, LessCompare, LessDepth, LessEqualCompare, LessEqualDepth, LessEqualStencilFunc, LessStencilFunc, LightProbe, LightProbeNode, Lighting, LightingContextNode, LightingModel, LightingNode, LightsNode, Line2NodeMaterial, LineBasicMaterial, LineBasicNodeMaterial, LineDashedMaterial, LineDashedNodeMaterial, LinearFilter, LinearMipMapLinearFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, LinearSRGBColorSpace, LinearToneMapping, Loader, LoopNode, LuminanceAlphaFormat, LuminanceFormat, MRTNode, MatcapUVNode, Material, MaterialLoader, MaterialNode, MaterialReferenceNode, MathUtils, Matrix2, Matrix3, Matrix4, MaxEquation, MaxMipLevelNode, MemberNode, Mesh, MeshBasicMaterial, MeshBasicNodeMaterial, MeshLambertMaterial, MeshLambertNodeMaterial, MeshMatcapMaterial, MeshMatcapNodeMaterial, MeshNormalMaterial, MeshNormalNodeMaterial, MeshPhongMaterial, MeshPhongNodeMaterial, MeshPhysicalMaterial, MeshPhysicalNodeMaterial, MeshSSSNodeMaterial, MeshStandardMaterial, MeshStandardNodeMaterial, MeshToonMaterial, MeshToonNodeMaterial, MinEquation, MirroredRepeatWrapping, MixOperation, ModelNode, MorphNode, MultiplyBlending, MultiplyOperation, NearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NeutralToneMapping, NeverCompare, NeverDepth, NeverStencilFunc, NoBlending, NoColorSpace, NoToneMapping, Node, NodeAccess, NodeAttribute, NodeBuilder, NodeCache, NodeCode, NodeFrame, NodeFunctionInput, NodeLoader, NodeMaterial, NodeMaterialLoader, NodeMaterialObserver, NodeObjectLoader, NodeShaderStage, NodeType, NodeUniform, NodeUpdateType, NodeUtils, NodeVar, NodeVarying, NormalBlending, NormalMapNode, NotEqualCompare, NotEqualDepth, NotEqualStencilFunc, Object3D, Object3DNode, ObjectLoader, ObjectSpaceNormalMap, OneFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OrthographicCamera, OutputStructNode, PCFShadowMap, PMREMGenerator, PMREMNode, ParameterNode, PassNode, PerspectiveCamera, PhongLightingModel, PhysicalLightingModel, Plane, PlaneGeometry, PointLight, PointLightNode, PointUVNode, PointsMaterial, PointsNodeMaterial, PostProcessing, PosterizeNode, PropertyNode, QuadMesh, Quaternion, RED_GREEN_RGTC2_Format, RED_RGTC1_Format, REVISION, RGBAFormat, RGBAIntegerFormat, RGBA_ASTC_10x10_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_BPTC_Format, RGBA_ETC2_EAC_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGBFormat, RGBIntegerFormat, RGB_ETC1_Format, RGB_ETC2_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGB_S3TC_DXT1_Format, RGFormat, RGIntegerFormat, RTTNode, RangeNode, RectAreaLight, RectAreaLightNode, RedFormat, RedIntegerFormat, ReferenceNode, ReflectorNode, ReinhardToneMapping, RemapNode, RenderOutputNode, RenderTarget, RendererReferenceNode, RendererUtils, RepeatWrapping, ReplaceStencilOp, ReverseSubtractEquation, RotateNode, SIGNED_RED_GREEN_RGTC2_Format, SIGNED_RED_RGTC1_Format, SRGBColorSpace, SRGBTransfer, Scene, SceneNode, ScreenNode, ScriptableNode, ScriptableValueNode, SetNode, ShadowBaseNode, ShadowMaterial, ShadowNode, ShadowNodeMaterial, ShortType, SkinningNode, Sphere, SphereGeometry, SplitNode, SpotLight, SpotLightNode, SpriteMaterial, SpriteNodeMaterial, SpriteSheetUVNode, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, StackNode, StaticDrawUsage, StorageArrayElementNode, StorageBufferAttribute, StorageBufferNode, StorageInstancedBufferAttribute, StorageTexture, StorageTextureNode, StructNode, StructTypeNode, SubtractEquation, SubtractiveBlending, TSL, TangentSpaceNormalMap, TempNode, Texture, Texture3DNode, TextureNode, TextureSizeNode, ToneMappingNode, ToonOutlinePassNode, TriplanarTexturesNode, UVMapping, Uint16BufferAttribute, Uint32BufferAttribute, UniformArrayNode, UniformGroupNode, UniformNode, UnsignedByteType, UnsignedInt248Type, UnsignedInt5999Type, UnsignedIntType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShortType, UserDataNode, VSMShadowMap, VarNode, VaryingNode, Vector2, Vector3, Vector4, VertexColorNode, ViewportDepthNode, ViewportDepthTextureNode, ViewportSharedTextureNode, ViewportTextureNode, VolumeNodeMaterial, WebGLCoordinateSystem, WebGLCubeRenderTarget, WebGPUCoordinateSystem, WebGPURenderer, WebXRController, ZeroFactor, ZeroStencilOp, createCanvasElement, defaultBuildStages, defaultShaderStages, shaderStages, vectorComponents }; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhyZWUud2ViZ3B1LmpzIiwic291cmNlcyI6WyIuLi9zcmMvbWF0ZXJpYWxzL25vZGVzL21hbmFnZXIvTm9kZU1hdGVyaWFsT2JzZXJ2ZXIuanMiLCIuLi9zcmMvbm9kZXMvY29yZS9Ob2RlVXRpbHMuanMiLCIuLi9zcmMvbm9kZXMvY29yZS9jb25zdGFudHMuanMiLCIuLi9zcmMvbm9kZXMvY29yZS9Ob2RlLmpzIiwiLi4vc3JjL25vZGVzL3V0aWxzL0FycmF5RWxlbWVudE5vZGUuanMiLCIuLi9zcmMvbm9kZXMvdXRpbHMvQ29udmVydE5vZGUuanMiLCIuLi9zcmMvbm9kZXMvY29yZS9UZW1wTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy91dGlscy9Kb2luTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy91dGlscy9TcGxpdE5vZGUuanMiLCIuLi9zcmMvbm9kZXMvdXRpbHMvU2V0Tm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy91dGlscy9GbGlwTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9jb3JlL0lucHV0Tm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9jb3JlL0NvbnN0Tm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy91dGlscy9NZW1iZXJOb2RlLmpzIiwiLi4vc3JjL25vZGVzL3RzbC9UU0xDb3JlLmpzIiwiLi4vc3JjL25vZGVzL2NvcmUvQXJyYXlOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2NvcmUvVW5pZm9ybUdyb3VwTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9jb3JlL1VuaWZvcm1Ob2RlLmpzIiwiLi4vc3JjL25vZGVzL2NvcmUvUHJvcGVydHlOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2NvcmUvQXNzaWduTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9jb2RlL0Z1bmN0aW9uQ2FsbE5vZGUuanMiLCIuLi9zcmMvbm9kZXMvbWF0aC9PcGVyYXRvck5vZGUuanMiLCIuLi9zcmMvbm9kZXMvbWF0aC9NYXRoTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9tYXRoL0NvbmRpdGlvbmFsTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9jb3JlL0NvbnRleHROb2RlLmpzIiwiLi4vc3JjL25vZGVzL2NvcmUvVmFyTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9jb3JlL1ZhcnlpbmdOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2Rpc3BsYXkvQ29sb3JTcGFjZUZ1bmN0aW9ucy5qcyIsIi4uL3NyYy9ub2Rlcy9kaXNwbGF5L0NvbG9yU3BhY2VOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2FjY2Vzc29ycy9SZWZlcmVuY2VCYXNlTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9hY2Nlc3NvcnMvUmVuZGVyZXJSZWZlcmVuY2VOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2Rpc3BsYXkvVG9uZU1hcHBpbmdOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2FjY2Vzc29ycy9CdWZmZXJBdHRyaWJ1dGVOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2dwZ3B1L0NvbXB1dGVOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2NvcmUvQ2FjaGVOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2NvcmUvQnlwYXNzTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy91dGlscy9SZW1hcE5vZGUuanMiLCIuLi9zcmMvbm9kZXMvY29kZS9FeHByZXNzaW9uTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy91dGlscy9EaXNjYXJkLmpzIiwiLi4vc3JjL25vZGVzL2Rpc3BsYXkvUmVuZGVyT3V0cHV0Tm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy91dGlscy9EZWJ1Z05vZGUuanMiLCIuLi9zcmMvbm9kZXMvdHNsL1RTTEJhc2UuanMiLCIuLi9zcmMvbm9kZXMvY29yZS9BdHRyaWJ1dGVOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2FjY2Vzc29ycy9VVi5qcyIsIi4uL3NyYy9ub2Rlcy9hY2Nlc3NvcnMvVGV4dHVyZVNpemVOb2RlLmpzIiwiLi4vc3JjL25vZGVzL3V0aWxzL01heE1pcExldmVsTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9hY2Nlc3NvcnMvVGV4dHVyZU5vZGUuanMiLCIuLi9zcmMvbm9kZXMvYWNjZXNzb3JzL0J1ZmZlck5vZGUuanMiLCIuLi9zcmMvbm9kZXMvYWNjZXNzb3JzL1VuaWZvcm1BcnJheU5vZGUuanMiLCIuLi9zcmMvbm9kZXMvYWNjZXNzb3JzL0NhbWVyYS5qcyIsIi4uL3NyYy9ub2Rlcy9hY2Nlc3NvcnMvT2JqZWN0M0ROb2RlLmpzIiwiLi4vc3JjL25vZGVzL2FjY2Vzc29ycy9Nb2RlbE5vZGUuanMiLCIuLi9zcmMvbm9kZXMvYWNjZXNzb3JzL1Bvc2l0aW9uLmpzIiwiLi4vc3JjL25vZGVzL2Rpc3BsYXkvRnJvbnRGYWNpbmdOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2FjY2Vzc29ycy9Ob3JtYWwuanMiLCIuLi9zcmMvbm9kZXMvYWNjZXNzb3JzL01hdGVyaWFsUHJvcGVydGllcy5qcyIsIi4uL3NyYy9ub2Rlcy9hY2Nlc3NvcnMvUmVmbGVjdFZlY3Rvci5qcyIsIi4uL3NyYy9ub2Rlcy9hY2Nlc3NvcnMvQ3ViZVRleHR1cmVOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2FjY2Vzc29ycy9SZWZlcmVuY2VOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2FjY2Vzc29ycy9NYXRlcmlhbFJlZmVyZW5jZU5vZGUuanMiLCIuLi9zcmMvbm9kZXMvYWNjZXNzb3JzL1RhbmdlbnQuanMiLCIuLi9zcmMvbm9kZXMvYWNjZXNzb3JzL0JpdGFuZ2VudC5qcyIsIi4uL3NyYy9ub2Rlcy9hY2Nlc3NvcnMvQWNjZXNzb3JzVXRpbHMuanMiLCIuLi9zcmMvbm9kZXMvZGlzcGxheS9Ob3JtYWxNYXBOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2Rpc3BsYXkvQnVtcE1hcE5vZGUuanMiLCIuLi9zcmMvbm9kZXMvYWNjZXNzb3JzL01hdGVyaWFsTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9hY2Nlc3NvcnMvTW9kZWxWaWV3UHJvamVjdGlvbk5vZGUuanMiLCIuLi9zcmMvbm9kZXMvY29yZS9JbmRleE5vZGUuanMiLCIuLi9zcmMvbm9kZXMvYWNjZXNzb3JzL0luc3RhbmNlTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9hY2Nlc3NvcnMvSW5zdGFuY2VkTWVzaE5vZGUuanMiLCIuLi9zcmMvbm9kZXMvYWNjZXNzb3JzL0JhdGNoTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy91dGlscy9TdG9yYWdlQXJyYXlFbGVtZW50Tm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9hY2Nlc3NvcnMvU3RvcmFnZUJ1ZmZlck5vZGUuanMiLCIuLi9zcmMvbm9kZXMvYWNjZXNzb3JzL1NraW5uaW5nTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy91dGlscy9Mb29wTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9hY2Nlc3NvcnMvTW9ycGhOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2xpZ2h0aW5nL0xpZ2h0aW5nTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9saWdodGluZy9BT05vZGUuanMiLCIuLi9zcmMvbm9kZXMvbGlnaHRpbmcvTGlnaHRpbmdDb250ZXh0Tm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9saWdodGluZy9JcnJhZGlhbmNlTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9kaXNwbGF5L1NjcmVlbk5vZGUuanMiLCIuLi9zcmMvbm9kZXMvZGlzcGxheS9WaWV3cG9ydFRleHR1cmVOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2Rpc3BsYXkvVmlld3BvcnREZXB0aFRleHR1cmVOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2Rpc3BsYXkvVmlld3BvcnREZXB0aE5vZGUuanMiLCIuLi9zcmMvbm9kZXMvYWNjZXNzb3JzL0J1aWx0aW5Ob2RlLmpzIiwiLi4vc3JjL25vZGVzL2FjY2Vzc29ycy9DbGlwcGluZ05vZGUuanMiLCIuLi9zcmMvbm9kZXMvZnVuY3Rpb25zL21hdGVyaWFsL2dldEFscGhhSGFzaFRocmVzaG9sZC5qcyIsIi4uL3NyYy9tYXRlcmlhbHMvbm9kZXMvTm9kZU1hdGVyaWFsLmpzIiwiLi4vc3JjL21hdGVyaWFscy9ub2Rlcy9MaW5lQmFzaWNOb2RlTWF0ZXJpYWwuanMiLCIuLi9zcmMvbWF0ZXJpYWxzL25vZGVzL0xpbmVEYXNoZWROb2RlTWF0ZXJpYWwuanMiLCIuLi9zcmMvbm9kZXMvZGlzcGxheS9WaWV3cG9ydFNoYXJlZFRleHR1cmVOb2RlLmpzIiwiLi4vc3JjL21hdGVyaWFscy9ub2Rlcy9MaW5lMk5vZGVNYXRlcmlhbC5qcyIsIi4uL3NyYy9ub2Rlcy91dGlscy9QYWNraW5nLmpzIiwiLi4vc3JjL21hdGVyaWFscy9ub2Rlcy9NZXNoTm9ybWFsTm9kZU1hdGVyaWFsLmpzIiwiLi4vc3JjL25vZGVzL3V0aWxzL0VxdWlyZWN0VVZOb2RlLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9jb21tb24vQ3ViZVJlbmRlclRhcmdldC5qcyIsIi4uL3NyYy9ub2Rlcy91dGlscy9DdWJlTWFwTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9saWdodGluZy9CYXNpY0Vudmlyb25tZW50Tm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9saWdodGluZy9CYXNpY0xpZ2h0TWFwTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9jb3JlL0xpZ2h0aW5nTW9kZWwuanMiLCIuLi9zcmMvbm9kZXMvZnVuY3Rpb25zL0Jhc2ljTGlnaHRpbmdNb2RlbC5qcyIsIi4uL3NyYy9tYXRlcmlhbHMvbm9kZXMvTWVzaEJhc2ljTm9kZU1hdGVyaWFsLmpzIiwiLi4vc3JjL25vZGVzL2Z1bmN0aW9ucy9CU0RGL0ZfU2NobGljay5qcyIsIi4uL3NyYy9ub2Rlcy9mdW5jdGlvbnMvQlNERi9CUkRGX0xhbWJlcnQuanMiLCIuLi9zcmMvbm9kZXMvZnVuY3Rpb25zL1Bob25nTGlnaHRpbmdNb2RlbC5qcyIsIi4uL3NyYy9tYXRlcmlhbHMvbm9kZXMvTWVzaExhbWJlcnROb2RlTWF0ZXJpYWwuanMiLCIuLi9zcmMvbWF0ZXJpYWxzL25vZGVzL01lc2hQaG9uZ05vZGVNYXRlcmlhbC5qcyIsIi4uL3NyYy9ub2Rlcy9mdW5jdGlvbnMvbWF0ZXJpYWwvZ2V0R2VvbWV0cnlSb3VnaG5lc3MuanMiLCIuLi9zcmMvbm9kZXMvZnVuY3Rpb25zL21hdGVyaWFsL2dldFJvdWdobmVzcy5qcyIsIi4uL3NyYy9ub2Rlcy9mdW5jdGlvbnMvQlNERi9WX0dHWF9TbWl0aENvcnJlbGF0ZWQuanMiLCIuLi9zcmMvbm9kZXMvZnVuY3Rpb25zL0JTREYvVl9HR1hfU21pdGhDb3JyZWxhdGVkX0FuaXNvdHJvcGljLmpzIiwiLi4vc3JjL25vZGVzL2Z1bmN0aW9ucy9CU0RGL0RfR0dYLmpzIiwiLi4vc3JjL25vZGVzL2Z1bmN0aW9ucy9CU0RGL0RfR0dYX0FuaXNvdHJvcGljLmpzIiwiLi4vc3JjL25vZGVzL2Z1bmN0aW9ucy9CU0RGL0JSREZfR0dYLmpzIiwiLi4vc3JjL25vZGVzL2Z1bmN0aW9ucy9CU0RGL0RGR0FwcHJveC5qcyIsIi4uL3NyYy9ub2Rlcy9mdW5jdGlvbnMvQlNERi9FbnZpcm9ubWVudEJSREYuanMiLCIuLi9zcmMvbm9kZXMvZnVuY3Rpb25zL0JTREYvU2NobGlja190b19GMC5qcyIsIi4uL3NyYy9ub2Rlcy9mdW5jdGlvbnMvQlNERi9CUkRGX1NoZWVuLmpzIiwiLi4vc3JjL25vZGVzL2Z1bmN0aW9ucy9CU0RGL0xUQy5qcyIsIi4uL3NyYy9ub2Rlcy9hY2Nlc3NvcnMvVGV4dHVyZUJpY3ViaWMuanMiLCIuLi9zcmMvbm9kZXMvZnVuY3Rpb25zL1BoeXNpY2FsTGlnaHRpbmdNb2RlbC5qcyIsIi4uL3NyYy9ub2Rlcy9wbXJlbS9QTVJFTVV0aWxzLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9jb21tb24vZXh0cmFzL1BNUkVNR2VuZXJhdG9yLmpzIiwiLi4vc3JjL25vZGVzL3BtcmVtL1BNUkVNTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9saWdodGluZy9FbnZpcm9ubWVudE5vZGUuanMiLCIuLi9zcmMvbWF0ZXJpYWxzL25vZGVzL01lc2hTdGFuZGFyZE5vZGVNYXRlcmlhbC5qcyIsIi4uL3NyYy9tYXRlcmlhbHMvbm9kZXMvTWVzaFBoeXNpY2FsTm9kZU1hdGVyaWFsLmpzIiwiLi4vc3JjL21hdGVyaWFscy9ub2Rlcy9NZXNoU1NTTm9kZU1hdGVyaWFsLmpzIiwiLi4vc3JjL25vZGVzL2Z1bmN0aW9ucy9Ub29uTGlnaHRpbmdNb2RlbC5qcyIsIi4uL3NyYy9tYXRlcmlhbHMvbm9kZXMvTWVzaFRvb25Ob2RlTWF0ZXJpYWwuanMiLCIuLi9zcmMvbm9kZXMvdXRpbHMvTWF0Y2FwVVZOb2RlLmpzIiwiLi4vc3JjL21hdGVyaWFscy9ub2Rlcy9NZXNoTWF0Y2FwTm9kZU1hdGVyaWFsLmpzIiwiLi4vc3JjL25vZGVzL3V0aWxzL1JvdGF0ZU5vZGUuanMiLCIuLi9zcmMvbWF0ZXJpYWxzL25vZGVzL1Nwcml0ZU5vZGVNYXRlcmlhbC5qcyIsIi4uL3NyYy9tYXRlcmlhbHMvbm9kZXMvUG9pbnRzTm9kZU1hdGVyaWFsLmpzIiwiLi4vc3JjL25vZGVzL2Z1bmN0aW9ucy9TaGFkb3dNYXNrTW9kZWwuanMiLCIuLi9zcmMvbWF0ZXJpYWxzL25vZGVzL1NoYWRvd05vZGVNYXRlcmlhbC5qcyIsIi4uL3NyYy9ub2Rlcy9mdW5jdGlvbnMvVm9sdW1ldHJpY0xpZ2h0aW5nTW9kZWwuanMiLCIuLi9zcmMvbWF0ZXJpYWxzL25vZGVzL1ZvbHVtZU5vZGVNYXRlcmlhbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvY29tbW9uL0FuaW1hdGlvbi5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvY29tbW9uL0NoYWluTWFwLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9jb21tb24vUmVuZGVyT2JqZWN0LmpzIiwiLi4vc3JjL3JlbmRlcmVycy9jb21tb24vUmVuZGVyT2JqZWN0cy5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvY29tbW9uL0RhdGFNYXAuanMiLCIuLi9zcmMvcmVuZGVyZXJzL2NvbW1vbi9Db25zdGFudHMuanMiLCIuLi9zcmMvcmVuZGVyZXJzL2NvbW1vbi9BdHRyaWJ1dGVzLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9jb21tb24vR2VvbWV0cmllcy5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvY29tbW9uL0luZm8uanMiLCIuLi9zcmMvcmVuZGVyZXJzL2NvbW1vbi9QaXBlbGluZS5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvY29tbW9uL1JlbmRlclBpcGVsaW5lLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9jb21tb24vQ29tcHV0ZVBpcGVsaW5lLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9jb21tb24vUHJvZ3JhbW1hYmxlU3RhZ2UuanMiLCIuLi9zcmMvcmVuZGVyZXJzL2NvbW1vbi9QaXBlbGluZXMuanMiLCIuLi9zcmMvcmVuZGVyZXJzL2NvbW1vbi9CaW5kaW5ncy5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvY29tbW9uL1JlbmRlckxpc3QuanMiLCIuLi9zcmMvcmVuZGVyZXJzL2NvbW1vbi9SZW5kZXJMaXN0cy5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvY29tbW9uL1JlbmRlckNvbnRleHQuanMiLCIuLi9zcmMvcmVuZGVyZXJzL2NvbW1vbi9SZW5kZXJDb250ZXh0cy5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvY29tbW9uL1RleHR1cmVzLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9jb21tb24vQ29sb3I0LmpzIiwiLi4vc3JjL25vZGVzL2NvcmUvUGFyYW1ldGVyTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9jb3JlL1N0YWNrTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9jb3JlL1N0cnVjdFR5cGVOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2NvcmUvU3RydWN0Tm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9jb3JlL091dHB1dFN0cnVjdE5vZGUuanMiLCIuLi9zcmMvbm9kZXMvY29yZS9NUlROb2RlLmpzIiwiLi4vc3JjL25vZGVzL21hdGgvSGFzaC5qcyIsIi4uL3NyYy9ub2Rlcy9tYXRoL01hdGhVdGlscy5qcyIsIi4uL3NyYy9ub2Rlcy9tYXRoL1RyaU5vaXNlM0QuanMiLCIuLi9zcmMvbm9kZXMvdXRpbHMvRnVuY3Rpb25PdmVybG9hZGluZ05vZGUuanMiLCIuLi9zcmMvbm9kZXMvdXRpbHMvVGltZXIuanMiLCIuLi9zcmMvbm9kZXMvdXRpbHMvT3NjaWxsYXRvcnMuanMiLCIuLi9zcmMvbm9kZXMvdXRpbHMvVVZVdGlscy5qcyIsIi4uL3NyYy9ub2Rlcy91dGlscy9TcHJpdGVVdGlscy5qcyIsIi4uL3NyYy9ub2Rlcy91dGlscy9WaWV3cG9ydFV0aWxzLmpzIiwiLi4vc3JjL25vZGVzL3V0aWxzL1Nwcml0ZVNoZWV0VVZOb2RlLmpzIiwiLi4vc3JjL25vZGVzL3V0aWxzL1RyaXBsYW5hclRleHR1cmVzTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy91dGlscy9SZWZsZWN0b3JOb2RlLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9jb21tb24vUXVhZE1lc2guanMiLCIuLi9zcmMvbm9kZXMvdXRpbHMvUlRUTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy91dGlscy9Qb3N0UHJvY2Vzc2luZ1V0aWxzLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9jb21tb24vU3RvcmFnZUluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZS5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvY29tbW9uL1N0b3JhZ2VCdWZmZXJBdHRyaWJ1dGUuanMiLCIuLi9zcmMvbm9kZXMvYWNjZXNzb3JzL0FycmF5cy5qcyIsIi4uL3NyYy9ub2Rlcy9hY2Nlc3NvcnMvVmVydGV4Q29sb3JOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2FjY2Vzc29ycy9Qb2ludFVWTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9hY2Nlc3NvcnMvU2NlbmVOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2FjY2Vzc29ycy9TdG9yYWdlVGV4dHVyZU5vZGUuanMiLCIuLi9zcmMvbm9kZXMvYWNjZXNzb3JzL1RleHR1cmUzRE5vZGUuanMiLCIuLi9zcmMvbm9kZXMvYWNjZXNzb3JzL1VzZXJEYXRhTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9hY2Nlc3NvcnMvVmVsb2NpdHlOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2Rpc3BsYXkvQmxlbmRNb2Rlcy5qcyIsIi4uL3NyYy9ub2Rlcy9kaXNwbGF5L0NvbG9yQWRqdXN0bWVudC5qcyIsIi4uL3NyYy9ub2Rlcy9kaXNwbGF5L1Bvc3Rlcml6ZU5vZGUuanMiLCIuLi9zcmMvbm9kZXMvZGlzcGxheS9QYXNzTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9kaXNwbGF5L1Rvb25PdXRsaW5lUGFzc05vZGUuanMiLCIuLi9zcmMvbm9kZXMvZGlzcGxheS9Ub25lTWFwcGluZ0Z1bmN0aW9ucy5qcyIsIi4uL3NyYy9ub2Rlcy9jb2RlL0NvZGVOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2NvZGUvRnVuY3Rpb25Ob2RlLmpzIiwiLi4vc3JjL25vZGVzL2NvZGUvU2NyaXB0YWJsZVZhbHVlTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9jb2RlL1NjcmlwdGFibGVOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2ZvZy9Gb2cuanMiLCIuLi9zcmMvbm9kZXMvZ2VvbWV0cnkvUmFuZ2VOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2dwZ3B1L0NvbXB1dGVCdWlsdGluTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9ncGdwdS9CYXJyaWVyTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9ncGdwdS9Xb3JrZ3JvdXBJbmZvTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9ncGdwdS9BdG9taWNGdW5jdGlvbk5vZGUuanMiLCIuLi9zcmMvbm9kZXMvYWNjZXNzb3JzL0xpZ2h0cy5qcyIsIi4uL3NyYy9ub2Rlcy9saWdodGluZy9MaWdodHNOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2xpZ2h0aW5nL1NoYWRvd0Jhc2VOb2RlLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9jb21tb24vUmVuZGVyZXJVdGlscy5qcyIsIi4uL3NyYy9ub2Rlcy9saWdodGluZy9TaGFkb3dOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2xpZ2h0aW5nL1BvaW50U2hhZG93Tm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9saWdodGluZy9BbmFseXRpY0xpZ2h0Tm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9saWdodGluZy9MaWdodFV0aWxzLmpzIiwiLi4vc3JjL25vZGVzL2xpZ2h0aW5nL1BvaW50TGlnaHROb2RlLmpzIiwiLi4vc3JjL25vZGVzL3Byb2NlZHVyYWwvQ2hlY2tlci5qcyIsIi4uL3NyYy9ub2Rlcy9zaGFwZXMvU2hhcGVzLmpzIiwiLi4vc3JjL25vZGVzL21hdGVyaWFseC9saWIvbXhfbm9pc2UuanMiLCIuLi9zcmMvbm9kZXMvbWF0ZXJpYWx4L2xpYi9teF9oc3YuanMiLCIuLi9zcmMvbm9kZXMvbWF0ZXJpYWx4L2xpYi9teF90cmFuc2Zvcm1fY29sb3IuanMiLCIuLi9zcmMvbm9kZXMvbWF0ZXJpYWx4L01hdGVyaWFsWE5vZGVzLmpzIiwiLi4vc3JjL25vZGVzL2Z1bmN0aW9ucy9tYXRlcmlhbC9nZXRQYXJhbGxheENvcnJlY3ROb3JtYWwuanMiLCIuLi9zcmMvbm9kZXMvZnVuY3Rpb25zL21hdGVyaWFsL2dldFNoSXJyYWRpYW5jZUF0LmpzIiwiLi4vc3JjL25vZGVzL1RTTC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvY29tbW9uL0JhY2tncm91bmQuanMiLCIuLi9zcmMvcmVuZGVyZXJzL2NvbW1vbi9CaW5kR3JvdXAuanMiLCIuLi9zcmMvcmVuZGVyZXJzL2NvbW1vbi9ub2Rlcy9Ob2RlQnVpbGRlclN0YXRlLmpzIiwiLi4vc3JjL25vZGVzL2NvcmUvTm9kZUF0dHJpYnV0ZS5qcyIsIi4uL3NyYy9ub2Rlcy9jb3JlL05vZGVVbmlmb3JtLmpzIiwiLi4vc3JjL25vZGVzL2NvcmUvTm9kZVZhci5qcyIsIi4uL3NyYy9ub2Rlcy9jb3JlL05vZGVWYXJ5aW5nLmpzIiwiLi4vc3JjL25vZGVzL2NvcmUvTm9kZUNvZGUuanMiLCIuLi9zcmMvbm9kZXMvY29yZS9Ob2RlQ2FjaGUuanMiLCIuLi9zcmMvbm9kZXMvY29yZS9TdHJ1Y3RUeXBlLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9jb21tb24vVW5pZm9ybS5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvY29tbW9uL25vZGVzL05vZGVVbmlmb3JtLmpzIiwiLi4vc3JjL25vZGVzL2NvcmUvTm9kZUJ1aWxkZXIuanMiLCIuLi9zcmMvbm9kZXMvY29yZS9Ob2RlRnJhbWUuanMiLCIuLi9zcmMvbm9kZXMvY29yZS9Ob2RlRnVuY3Rpb25JbnB1dC5qcyIsIi4uL3NyYy9ub2Rlcy9saWdodGluZy9EaXJlY3Rpb25hbExpZ2h0Tm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9saWdodGluZy9SZWN0QXJlYUxpZ2h0Tm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9saWdodGluZy9TcG90TGlnaHROb2RlLmpzIiwiLi4vc3JjL25vZGVzL2xpZ2h0aW5nL0lFU1Nwb3RMaWdodE5vZGUuanMiLCIuLi9zcmMvbm9kZXMvbGlnaHRpbmcvQW1iaWVudExpZ2h0Tm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9saWdodGluZy9IZW1pc3BoZXJlTGlnaHROb2RlLmpzIiwiLi4vc3JjL25vZGVzL2xpZ2h0aW5nL0xpZ2h0UHJvYmVOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2NvcmUvTm9kZVBhcnNlci5qcyIsIi4uL3NyYy9ub2Rlcy9jb3JlL05vZGVGdW5jdGlvbi5qcyIsIi4uL3NyYy9ub2Rlcy9wYXJzZXJzL0dMU0xOb2RlRnVuY3Rpb24uanMiLCIuLi9zcmMvbm9kZXMvcGFyc2Vycy9HTFNMTm9kZVBhcnNlci5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvY29tbW9uL25vZGVzL05vZGVzLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9jb21tb24vQ2xpcHBpbmdDb250ZXh0LmpzIiwiLi4vc3JjL3JlbmRlcmVycy9jb21tb24vUmVuZGVyQnVuZGxlLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9jb21tb24vUmVuZGVyQnVuZGxlcy5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvY29tbW9uL25vZGVzL05vZGVMaWJyYXJ5LmpzIiwiLi4vc3JjL3JlbmRlcmVycy9jb21tb24vTGlnaHRpbmcuanMiLCIuLi9zcmMvcmVuZGVyZXJzL2NvbW1vbi9YUlJlbmRlclRhcmdldC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvY29tbW9uL1hSTWFuYWdlci5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvY29tbW9uL1JlbmRlcmVyLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9jb21tb24vQmluZGluZy5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvY29tbW9uL0J1ZmZlclV0aWxzLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9jb21tb24vQnVmZmVyLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9jb21tb24vVW5pZm9ybUJ1ZmZlci5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvY29tbW9uL25vZGVzL05vZGVVbmlmb3JtQnVmZmVyLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9jb21tb24vVW5pZm9ybXNHcm91cC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvY29tbW9uL25vZGVzL05vZGVVbmlmb3Jtc0dyb3VwLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9jb21tb24vU2FtcGxlZFRleHR1cmUuanMiLCIuLi9zcmMvcmVuZGVyZXJzL2NvbW1vbi9ub2Rlcy9Ob2RlU2FtcGxlZFRleHR1cmUuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYmdsLWZhbGxiYWNrL25vZGVzL0dMU0xOb2RlQnVpbGRlci5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvY29tbW9uL0JhY2tlbmQuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYmdsLWZhbGxiYWNrL3V0aWxzL1dlYkdMQXR0cmlidXRlVXRpbHMuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYmdsLWZhbGxiYWNrL3V0aWxzL1dlYkdMU3RhdGUuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYmdsLWZhbGxiYWNrL3V0aWxzL1dlYkdMVXRpbHMuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYmdsLWZhbGxiYWNrL3V0aWxzL1dlYkdMVGV4dHVyZVV0aWxzLmpzIiwiLi4vc3JjL3JlbmRlcmVycy93ZWJnbC1mYWxsYmFjay91dGlscy9XZWJHTEV4dGVuc2lvbnMuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYmdsLWZhbGxiYWNrL3V0aWxzL1dlYkdMQ2FwYWJpbGl0aWVzLmpzIiwiLi4vc3JjL3JlbmRlcmVycy93ZWJnbC1mYWxsYmFjay91dGlscy9XZWJHTENvbnN0YW50cy5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2ViZ2wtZmFsbGJhY2svV2ViR0xCdWZmZXJSZW5kZXJlci5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvY29tbW9uL1RpbWVzdGFtcFF1ZXJ5UG9vbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2ViZ2wtZmFsbGJhY2svdXRpbHMvV2ViR0xUaW1lc3RhbXBRdWVyeVBvb2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYmdsLWZhbGxiYWNrL1dlYkdMQmFja2VuZC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2ViZ3B1L3V0aWxzL1dlYkdQVUNvbnN0YW50cy5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvY29tbW9uL1NhbXBsZXIuanMiLCIuLi9zcmMvcmVuZGVyZXJzL2NvbW1vbi9ub2Rlcy9Ob2RlU2FtcGxlci5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvY29tbW9uL1N0b3JhZ2VCdWZmZXIuanMiLCIuLi9zcmMvcmVuZGVyZXJzL2NvbW1vbi9ub2Rlcy9Ob2RlU3RvcmFnZUJ1ZmZlci5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2ViZ3B1L3V0aWxzL1dlYkdQVVRleHR1cmVQYXNzVXRpbHMuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYmdwdS91dGlscy9XZWJHUFVUZXh0dXJlVXRpbHMuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYmdwdS9ub2Rlcy9XR1NMTm9kZUZ1bmN0aW9uLmpzIiwiLi4vc3JjL3JlbmRlcmVycy93ZWJncHUvbm9kZXMvV0dTTE5vZGVQYXJzZXIuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYmdwdS9ub2Rlcy9XR1NMTm9kZUJ1aWxkZXIuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYmdwdS91dGlscy9XZWJHUFVVdGlscy5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2ViZ3B1L3V0aWxzL1dlYkdQVUF0dHJpYnV0ZVV0aWxzLmpzIiwiLi4vc3JjL3JlbmRlcmVycy93ZWJncHUvdXRpbHMvV2ViR1BVQmluZGluZ1V0aWxzLmpzIiwiLi4vc3JjL3JlbmRlcmVycy93ZWJncHUvdXRpbHMvV2ViR1BVUGlwZWxpbmVVdGlscy5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2ViZ3B1L3V0aWxzL1dlYkdQVVRpbWVzdGFtcFF1ZXJ5UG9vbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2ViZ3B1L1dlYkdQVUJhY2tlbmQuanMiLCIuLi9zcmMvbGlnaHRzL3dlYmdwdS9JRVNTcG90TGlnaHQuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYmdwdS9ub2Rlcy9TdGFuZGFyZE5vZGVMaWJyYXJ5LmpzIiwiLi4vc3JjL3JlbmRlcmVycy93ZWJncHUvV2ViR1BVUmVuZGVyZXIuanMiLCIuLi9zcmMvcmVuZGVyZXJzL2NvbW1vbi9CdW5kbGVHcm91cC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvY29tbW9uL1Bvc3RQcm9jZXNzaW5nLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9jb21tb24vU3RvcmFnZVRleHR1cmUuanMiLCIuLi9zcmMvcmVuZGVyZXJzL2NvbW1vbi9JbmRpcmVjdFN0b3JhZ2VCdWZmZXJBdHRyaWJ1dGUuanMiLCIuLi9zcmMvbG9hZGVycy9ub2Rlcy9Ob2RlTG9hZGVyLmpzIiwiLi4vc3JjL2xvYWRlcnMvbm9kZXMvTm9kZU1hdGVyaWFsTG9hZGVyLmpzIiwiLi4vc3JjL2xvYWRlcnMvbm9kZXMvTm9kZU9iamVjdExvYWRlci5qcyIsIi4uL3NyYy9vYmplY3RzL0NsaXBwaW5nR3JvdXAuanMiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgcmVmcmVzaFVuaWZvcm1zID0gW1xyXG5cdCdhbHBoYU1hcCcsXHJcblx0J2FscGhhVGVzdCcsXHJcblx0J2FuaXNvdHJvcHknLFxyXG5cdCdhbmlzb3Ryb3B5TWFwJyxcclxuXHQnYW5pc290cm9weVJvdGF0aW9uJyxcclxuXHQnYW9NYXAnLFxyXG5cdCdhdHRlbnVhdGlvbkNvbG9yJyxcclxuXHQnYXR0ZW51YXRpb25EaXN0YW5jZScsXHJcblx0J2J1bXBNYXAnLFxyXG5cdCdjbGVhcmNvYXQnLFxyXG5cdCdjbGVhcmNvYXRNYXAnLFxyXG5cdCdjbGVhcmNvYXROb3JtYWxNYXAnLFxyXG5cdCdjbGVhcmNvYXROb3JtYWxTY2FsZScsXHJcblx0J2NsZWFyY29hdFJvdWdobmVzcycsXHJcblx0J2NvbG9yJyxcclxuXHQnZGlzcGVyc2lvbicsXHJcblx0J2Rpc3BsYWNlbWVudE1hcCcsXHJcblx0J2VtaXNzaXZlJyxcclxuXHQnZW1pc3NpdmVNYXAnLFxyXG5cdCdlbnZNYXAnLFxyXG5cdCdncmFkaWVudE1hcCcsXHJcblx0J2lvcicsXHJcblx0J2lyaWRlc2NlbmNlJyxcclxuXHQnaXJpZGVzY2VuY2VJT1InLFxyXG5cdCdpcmlkZXNjZW5jZU1hcCcsXHJcblx0J2lyaWRlc2NlbmNlVGhpY2tuZXNzTWFwJyxcclxuXHQnbGlnaHRNYXAnLFxyXG5cdCdtYXAnLFxyXG5cdCdtYXRjYXAnLFxyXG5cdCdtZXRhbG5lc3MnLFxyXG5cdCdtZXRhbG5lc3NNYXAnLFxyXG5cdCdub3JtYWxNYXAnLFxyXG5cdCdub3JtYWxTY2FsZScsXHJcblx0J29wYWNpdHknLFxyXG5cdCdyb3VnaG5lc3MnLFxyXG5cdCdyb3VnaG5lc3NNYXAnLFxyXG5cdCdzaGVlbicsXHJcblx0J3NoZWVuQ29sb3InLFxyXG5cdCdzaGVlbkNvbG9yTWFwJyxcclxuXHQnc2hlZW5Sb3VnaG5lc3NNYXAnLFxyXG5cdCdzaGluaW5lc3MnLFxyXG5cdCdzcGVjdWxhcicsXHJcblx0J3NwZWN1bGFyQ29sb3InLFxyXG5cdCdzcGVjdWxhckNvbG9yTWFwJyxcclxuXHQnc3BlY3VsYXJJbnRlbnNpdHknLFxyXG5cdCdzcGVjdWxhckludGVuc2l0eU1hcCcsXHJcblx0J3NwZWN1bGFyTWFwJyxcclxuXHQndGhpY2tuZXNzJyxcclxuXHQndHJhbnNtaXNzaW9uJyxcclxuXHQndHJhbnNtaXNzaW9uTWFwJ1xyXG5dO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgY2xhc3MgaXMgdXNlZCBieSB7QGxpbmsgV2ViR1BVUmVuZGVyZXJ9IGFzIG1hbmFnZW1lbnQgY29tcG9uZW50LlxyXG4gKiBJdCdzIHByaW1hcnkgcHVycG9zZSBpcyB0byBkZXRlcm1pbmUgd2hldGhlciByZW5kZXIgb2JqZWN0cyByZXF1aXJlIGFcclxuICogcmVmcmVzaCByaWdodCBiZWZvcmUgdGhleSBhcmUgZ29pbmcgdG8gYmUgcmVuZGVyZWQgb3Igbm90LlxyXG4gKi9cclxuY2xhc3MgTm9kZU1hdGVyaWFsT2JzZXJ2ZXIge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG5vZGUgbWF0ZXJpYWwgb2JzZXJ2ZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIG5vZGUgYnVpbGRlci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggYnVpbGRlciApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgbm9kZSBtYXRlcmlhbCBjYW4gYmUgdXNlZCBieSBtb3JlIHRoYW4gb25lIHJlbmRlciBvYmplY3Qgc28gdGhlXHJcblx0XHQgKiBtb25pdG9yIG11c3QgbWFpbnRhaW4gYSBsaXN0IG9mIHJlbmRlciBvYmplY3RzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtXZWFrTWFwPFJlbmRlck9iamVjdCxPYmplY3Q+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJlbmRlck9iamVjdHMgPSBuZXcgV2Vha01hcCgpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgbWF0ZXJpYWwgdXNlcyBub2RlIG9iamVjdHMgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmhhc05vZGUgPSB0aGlzLmNvbnRhaW5zTm9kZSggYnVpbGRlciApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgbm9kZSBidWlsZGVyJ3MgM0Qgb2JqZWN0IGlzIGFuaW1hdGVkIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5oYXNBbmltYXRpb24gPSBidWlsZGVyLm9iamVjdC5pc1NraW5uZWRNZXNoID09PSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBsaXN0IG9mIGFsbCBwb3NzaWJsZSBtYXRlcmlhbCB1bmlmb3Jtc1xyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJlZnJlc2hVbmlmb3JtcyA9IHJlZnJlc2hVbmlmb3JtcztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvbGRzIHRoZSBjdXJyZW50IHJlbmRlciBJRCBmcm9tIHRoZSBub2RlIGZyYW1lLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVuZGVySWQgPSAwO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBnaXZlbiByZW5kZXIgb2JqZWN0IGlzIHZlcmlmaWVkIGZvciB0aGUgZmlyc3QgdGltZSBvZiB0aGlzIG9ic2VydmVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSZW5kZXJPYmplY3R9IHJlbmRlck9iamVjdCAtIFRoZSByZW5kZXIgb2JqZWN0LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGdpdmVuIHJlbmRlciBvYmplY3QgaXMgdmVyaWZpZWQgZm9yIHRoZSBmaXJzdCB0aW1lIG9mIHRoaXMgb2JzZXJ2ZXIuXHJcblx0ICovXHJcblx0Zmlyc3RJbml0aWFsaXphdGlvbiggcmVuZGVyT2JqZWN0ICkge1xyXG5cclxuXHRcdGNvbnN0IGhhc0luaXRpYWxpemVkID0gdGhpcy5yZW5kZXJPYmplY3RzLmhhcyggcmVuZGVyT2JqZWN0ICk7XHJcblxyXG5cdFx0aWYgKCBoYXNJbml0aWFsaXplZCA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmdldFJlbmRlck9iamVjdERhdGEoIHJlbmRlck9iamVjdCApO1xyXG5cclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBmYWxzZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIG1vbml0b3JpbmcgZGF0YSBmb3IgdGhlIGdpdmVuIHJlbmRlciBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JlbmRlck9iamVjdH0gcmVuZGVyT2JqZWN0IC0gVGhlIHJlbmRlciBvYmplY3QuXHJcblx0ICogQHJldHVybiB7T2JqZWN0fSBUaGUgbW9uaXRvcmluZyBkYXRhLlxyXG5cdCAqL1xyXG5cdGdldFJlbmRlck9iamVjdERhdGEoIHJlbmRlck9iamVjdCApIHtcclxuXHJcblx0XHRsZXQgZGF0YSA9IHRoaXMucmVuZGVyT2JqZWN0cy5nZXQoIHJlbmRlck9iamVjdCApO1xyXG5cclxuXHRcdGlmICggZGF0YSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Y29uc3QgeyBnZW9tZXRyeSwgbWF0ZXJpYWwsIG9iamVjdCB9ID0gcmVuZGVyT2JqZWN0O1xyXG5cclxuXHRcdFx0ZGF0YSA9IHtcclxuXHRcdFx0XHRtYXRlcmlhbDogdGhpcy5nZXRNYXRlcmlhbERhdGEoIG1hdGVyaWFsICksXHJcblx0XHRcdFx0Z2VvbWV0cnk6IHtcclxuXHRcdFx0XHRcdGlkOiBnZW9tZXRyeS5pZCxcclxuXHRcdFx0XHRcdGF0dHJpYnV0ZXM6IHRoaXMuZ2V0QXR0cmlidXRlc0RhdGEoIGdlb21ldHJ5LmF0dHJpYnV0ZXMgKSxcclxuXHRcdFx0XHRcdGluZGV4VmVyc2lvbjogZ2VvbWV0cnkuaW5kZXggPyBnZW9tZXRyeS5pbmRleC52ZXJzaW9uIDogbnVsbCxcclxuXHRcdFx0XHRcdGRyYXdSYW5nZTogeyBzdGFydDogZ2VvbWV0cnkuZHJhd1JhbmdlLnN0YXJ0LCBjb3VudDogZ2VvbWV0cnkuZHJhd1JhbmdlLmNvdW50IH1cclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdHdvcmxkTWF0cml4OiBvYmplY3QubWF0cml4V29ybGQuY2xvbmUoKVxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0aWYgKCBvYmplY3QuY2VudGVyICkge1xyXG5cclxuXHRcdFx0XHRkYXRhLmNlbnRlciA9IG9iamVjdC5jZW50ZXIuY2xvbmUoKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggb2JqZWN0Lm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyApIHtcclxuXHJcblx0XHRcdFx0ZGF0YS5tb3JwaFRhcmdldEluZmx1ZW5jZXMgPSBvYmplY3QubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnNsaWNlKCk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHJlbmRlck9iamVjdC5idW5kbGUgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdGRhdGEudmVyc2lvbiA9IHJlbmRlck9iamVjdC5idW5kbGUudmVyc2lvbjtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggZGF0YS5tYXRlcmlhbC50cmFuc21pc3Npb24gPiAwICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IHJlbmRlck9iamVjdC5jb250ZXh0O1xyXG5cclxuXHRcdFx0XHRkYXRhLmJ1ZmZlcldpZHRoID0gd2lkdGg7XHJcblx0XHRcdFx0ZGF0YS5idWZmZXJIZWlnaHQgPSBoZWlnaHQ7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0aGlzLnJlbmRlck9iamVjdHMuc2V0KCByZW5kZXJPYmplY3QsIGRhdGEgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGRhdGE7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhbiBhdHRyaWJ1dGUgZGF0YSBzdHJ1Y3R1cmUgaG9sZGluZyB0aGUgYXR0cmlidXRlcyB2ZXJzaW9ucyBmb3JcclxuXHQgKiBtb25pdG9yaW5nLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGF0dHJpYnV0ZXMgLSBUaGUgZ2VvbWV0cnkgYXR0cmlidXRlcy5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3R9IEFuIG9iamVjdCBmb3IgbW9uaXRvcmluZyB0aGUgdmVyc2lvbnMgb2YgYXR0cmlidXRlcy5cclxuXHQgKi9cclxuXHRnZXRBdHRyaWJ1dGVzRGF0YSggYXR0cmlidXRlcyApIHtcclxuXHJcblx0XHRjb25zdCBhdHRyaWJ1dGVzRGF0YSA9IHt9O1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IG5hbWUgaW4gYXR0cmlidXRlcyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbIG5hbWUgXTtcclxuXHJcblx0XHRcdGF0dHJpYnV0ZXNEYXRhWyBuYW1lIF0gPSB7XHJcblx0XHRcdFx0dmVyc2lvbjogYXR0cmlidXRlLnZlcnNpb25cclxuXHRcdFx0fTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGF0dHJpYnV0ZXNEYXRhO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBub2RlIGJ1aWxkZXIncyBtYXRlcmlhbCB1c2VzXHJcblx0ICogbm9kZSBwcm9wZXJ0aWVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBub2RlIGJ1aWxkZXIncyBtYXRlcmlhbCB1c2VzIG5vZGUgcHJvcGVydGllcyBvciBub3QuXHJcblx0ICovXHJcblx0Y29udGFpbnNOb2RlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IG1hdGVyaWFsID0gYnVpbGRlci5tYXRlcmlhbDtcclxuXHJcblx0XHRmb3IgKCBjb25zdCBwcm9wZXJ0eSBpbiBtYXRlcmlhbCApIHtcclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWxbIHByb3BlcnR5IF0gJiYgbWF0ZXJpYWxbIHByb3BlcnR5IF0uaXNOb2RlIClcclxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBidWlsZGVyLnJlbmRlcmVyLm5vZGVzLm1vZGVsVmlld01hdHJpeCAhPT0gbnVsbCB8fCBidWlsZGVyLnJlbmRlcmVyLm5vZGVzLm1vZGVsTm9ybWFsVmlld01hdHJpeCAhPT0gbnVsbCApXHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cclxuXHRcdHJldHVybiBmYWxzZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbWF0ZXJpYWwgZGF0YSBzdHJ1Y3R1cmUgaG9sZGluZyB0aGUgbWF0ZXJpYWwgcHJvcGVydHkgdmFsdWVzIGZvclxyXG5cdCAqIG1vbml0b3JpbmcuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdGVyaWFsfSBtYXRlcmlhbCAtIFRoZSBtYXRlcmlhbC5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3R9IEFuIG9iamVjdCBmb3IgbW9uaXRvcmluZyBtYXRlcmlhbCBwcm9wZXJ0aWVzLlxyXG5cdCAqL1xyXG5cdGdldE1hdGVyaWFsRGF0YSggbWF0ZXJpYWwgKSB7XHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IHt9O1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IHByb3BlcnR5IG9mIHRoaXMucmVmcmVzaFVuaWZvcm1zICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdmFsdWUgPSBtYXRlcmlhbFsgcHJvcGVydHkgXTtcclxuXHJcblx0XHRcdGlmICggdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCApIGNvbnRpbnVlO1xyXG5cclxuXHRcdFx0aWYgKCB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlLmNsb25lICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggdmFsdWUuaXNUZXh0dXJlID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRcdGRhdGFbIHByb3BlcnR5IF0gPSB7IGlkOiB2YWx1ZS5pZCwgdmVyc2lvbjogdmFsdWUudmVyc2lvbiB9O1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdGRhdGFbIHByb3BlcnR5IF0gPSB2YWx1ZS5jbG9uZSgpO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRkYXRhWyBwcm9wZXJ0eSBdID0gdmFsdWU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBkYXRhO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBnaXZlbiByZW5kZXIgb2JqZWN0IGhhcyBub3QgY2hhbmdlZCBpdHMgc3RhdGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JlbmRlck9iamVjdH0gcmVuZGVyT2JqZWN0IC0gVGhlIHJlbmRlciBvYmplY3QuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZ2l2ZW4gcmVuZGVyIG9iamVjdCBoYXMgY2hhbmdlZCBpdHMgc3RhdGUgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGVxdWFscyggcmVuZGVyT2JqZWN0ICkge1xyXG5cclxuXHRcdGNvbnN0IHsgb2JqZWN0LCBtYXRlcmlhbCwgZ2VvbWV0cnkgfSA9IHJlbmRlck9iamVjdDtcclxuXHJcblx0XHRjb25zdCByZW5kZXJPYmplY3REYXRhID0gdGhpcy5nZXRSZW5kZXJPYmplY3REYXRhKCByZW5kZXJPYmplY3QgKTtcclxuXHJcblx0XHQvLyB3b3JsZCBtYXRyaXhcclxuXHJcblx0XHRpZiAoIHJlbmRlck9iamVjdERhdGEud29ybGRNYXRyaXguZXF1YWxzKCBvYmplY3QubWF0cml4V29ybGQgKSAhPT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdHJlbmRlck9iamVjdERhdGEud29ybGRNYXRyaXguY29weSggb2JqZWN0Lm1hdHJpeFdvcmxkICk7XHJcblxyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIG1hdGVyaWFsXHJcblxyXG5cdFx0Y29uc3QgbWF0ZXJpYWxEYXRhID0gcmVuZGVyT2JqZWN0RGF0YS5tYXRlcmlhbDtcclxuXHJcblx0XHRmb3IgKCBjb25zdCBwcm9wZXJ0eSBpbiBtYXRlcmlhbERhdGEgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB2YWx1ZSA9IG1hdGVyaWFsRGF0YVsgcHJvcGVydHkgXTtcclxuXHRcdFx0Y29uc3QgbXRsVmFsdWUgPSBtYXRlcmlhbFsgcHJvcGVydHkgXTtcclxuXHJcblx0XHRcdGlmICggdmFsdWUuZXF1YWxzICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggdmFsdWUuZXF1YWxzKCBtdGxWYWx1ZSApID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdFx0XHR2YWx1ZS5jb3B5KCBtdGxWYWx1ZSApO1xyXG5cclxuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggbXRsVmFsdWUuaXNUZXh0dXJlID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIHZhbHVlLmlkICE9PSBtdGxWYWx1ZS5pZCB8fCB2YWx1ZS52ZXJzaW9uICE9PSBtdGxWYWx1ZS52ZXJzaW9uICkge1xyXG5cclxuXHRcdFx0XHRcdHZhbHVlLmlkID0gbXRsVmFsdWUuaWQ7XHJcblx0XHRcdFx0XHR2YWx1ZS52ZXJzaW9uID0gbXRsVmFsdWUudmVyc2lvbjtcclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIHZhbHVlICE9PSBtdGxWYWx1ZSApIHtcclxuXHJcblx0XHRcdFx0bWF0ZXJpYWxEYXRhWyBwcm9wZXJ0eSBdID0gbXRsVmFsdWU7XHJcblxyXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBtYXRlcmlhbERhdGEudHJhbnNtaXNzaW9uID4gMCApIHtcclxuXHJcblx0XHRcdGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gcmVuZGVyT2JqZWN0LmNvbnRleHQ7XHJcblxyXG5cdFx0XHRpZiAoIHJlbmRlck9iamVjdERhdGEuYnVmZmVyV2lkdGggIT09IHdpZHRoIHx8IHJlbmRlck9iamVjdERhdGEuYnVmZmVySGVpZ2h0ICE9PSBoZWlnaHQgKSB7XHJcblxyXG5cdFx0XHRcdHJlbmRlck9iamVjdERhdGEuYnVmZmVyV2lkdGggPSB3aWR0aDtcclxuXHRcdFx0XHRyZW5kZXJPYmplY3REYXRhLmJ1ZmZlckhlaWdodCA9IGhlaWdodDtcclxuXHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBnZW9tZXRyeVxyXG5cclxuXHRcdGNvbnN0IHN0b3JlZEdlb21ldHJ5RGF0YSA9IHJlbmRlck9iamVjdERhdGEuZ2VvbWV0cnk7XHJcblx0XHRjb25zdCBhdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlcztcclxuXHRcdGNvbnN0IHN0b3JlZEF0dHJpYnV0ZXMgPSBzdG9yZWRHZW9tZXRyeURhdGEuYXR0cmlidXRlcztcclxuXHJcblx0XHRjb25zdCBzdG9yZWRBdHRyaWJ1dGVOYW1lcyA9IE9iamVjdC5rZXlzKCBzdG9yZWRBdHRyaWJ1dGVzICk7XHJcblx0XHRjb25zdCBjdXJyZW50QXR0cmlidXRlTmFtZXMgPSBPYmplY3Qua2V5cyggYXR0cmlidXRlcyApO1xyXG5cclxuXHRcdGlmICggc3RvcmVkR2VvbWV0cnlEYXRhLmlkICE9PSBnZW9tZXRyeS5pZCApIHtcclxuXHJcblx0XHRcdHN0b3JlZEdlb21ldHJ5RGF0YS5pZCA9IGdlb21ldHJ5LmlkO1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggc3RvcmVkQXR0cmlidXRlTmFtZXMubGVuZ3RoICE9PSBjdXJyZW50QXR0cmlidXRlTmFtZXMubGVuZ3RoICkge1xyXG5cclxuXHRcdFx0cmVuZGVyT2JqZWN0RGF0YS5nZW9tZXRyeS5hdHRyaWJ1dGVzID0gdGhpcy5nZXRBdHRyaWJ1dGVzRGF0YSggYXR0cmlidXRlcyApO1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGNvbXBhcmUgZWFjaCBhdHRyaWJ1dGVcclxuXHJcblx0XHRmb3IgKCBjb25zdCBuYW1lIG9mIHN0b3JlZEF0dHJpYnV0ZU5hbWVzICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgc3RvcmVkQXR0cmlidXRlRGF0YSA9IHN0b3JlZEF0dHJpYnV0ZXNbIG5hbWUgXTtcclxuXHRcdFx0Y29uc3QgYXR0cmlidXRlID0gYXR0cmlidXRlc1sgbmFtZSBdO1xyXG5cclxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0Ly8gYXR0cmlidXRlIHdhcyByZW1vdmVkXHJcblx0XHRcdFx0ZGVsZXRlIHN0b3JlZEF0dHJpYnV0ZXNbIG5hbWUgXTtcclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHN0b3JlZEF0dHJpYnV0ZURhdGEudmVyc2lvbiAhPT0gYXR0cmlidXRlLnZlcnNpb24gKSB7XHJcblxyXG5cdFx0XHRcdHN0b3JlZEF0dHJpYnV0ZURhdGEudmVyc2lvbiA9IGF0dHJpYnV0ZS52ZXJzaW9uO1xyXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gY2hlY2sgaW5kZXhcclxuXHJcblx0XHRjb25zdCBpbmRleCA9IGdlb21ldHJ5LmluZGV4O1xyXG5cdFx0Y29uc3Qgc3RvcmVkSW5kZXhWZXJzaW9uID0gc3RvcmVkR2VvbWV0cnlEYXRhLmluZGV4VmVyc2lvbjtcclxuXHRcdGNvbnN0IGN1cnJlbnRJbmRleFZlcnNpb24gPSBpbmRleCA/IGluZGV4LnZlcnNpb24gOiBudWxsO1xyXG5cclxuXHRcdGlmICggc3RvcmVkSW5kZXhWZXJzaW9uICE9PSBjdXJyZW50SW5kZXhWZXJzaW9uICkge1xyXG5cclxuXHRcdFx0c3RvcmVkR2VvbWV0cnlEYXRhLmluZGV4VmVyc2lvbiA9IGN1cnJlbnRJbmRleFZlcnNpb247XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gY2hlY2sgZHJhd1JhbmdlXHJcblxyXG5cdFx0aWYgKCBzdG9yZWRHZW9tZXRyeURhdGEuZHJhd1JhbmdlLnN0YXJ0ICE9PSBnZW9tZXRyeS5kcmF3UmFuZ2Uuc3RhcnQgfHwgc3RvcmVkR2VvbWV0cnlEYXRhLmRyYXdSYW5nZS5jb3VudCAhPT0gZ2VvbWV0cnkuZHJhd1JhbmdlLmNvdW50ICkge1xyXG5cclxuXHRcdFx0c3RvcmVkR2VvbWV0cnlEYXRhLmRyYXdSYW5nZS5zdGFydCA9IGdlb21ldHJ5LmRyYXdSYW5nZS5zdGFydDtcclxuXHRcdFx0c3RvcmVkR2VvbWV0cnlEYXRhLmRyYXdSYW5nZS5jb3VudCA9IGdlb21ldHJ5LmRyYXdSYW5nZS5jb3VudDtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBtb3JwaCB0YXJnZXRzXHJcblxyXG5cdFx0aWYgKCByZW5kZXJPYmplY3REYXRhLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyApIHtcclxuXHJcblx0XHRcdGxldCBtb3JwaENoYW5nZWQgPSBmYWxzZTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHJlbmRlck9iamVjdERhdGEubW9ycGhUYXJnZXRJbmZsdWVuY2VzLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0aWYgKCByZW5kZXJPYmplY3REYXRhLm1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgaSBdICE9PSBvYmplY3QubW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBpIF0gKSB7XHJcblxyXG5cdFx0XHRcdFx0bW9ycGhDaGFuZ2VkID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBtb3JwaENoYW5nZWQgKSByZXR1cm4gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gY2VudGVyXHJcblxyXG5cdFx0aWYgKCByZW5kZXJPYmplY3REYXRhLmNlbnRlciApIHtcclxuXHJcblx0XHRcdGlmICggcmVuZGVyT2JqZWN0RGF0YS5jZW50ZXIuZXF1YWxzKCBvYmplY3QuY2VudGVyICkgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0XHRyZW5kZXJPYmplY3REYXRhLmNlbnRlci5jb3B5KCBvYmplY3QuY2VudGVyICk7XHJcblxyXG5cdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBidW5kbGVcclxuXHJcblx0XHRpZiAoIHJlbmRlck9iamVjdC5idW5kbGUgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRyZW5kZXJPYmplY3REYXRhLnZlcnNpb24gPSByZW5kZXJPYmplY3QuYnVuZGxlLnZlcnNpb247XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gcmVuZGVyIG9iamVjdCByZXF1aXJlcyBhIHJlZnJlc2guXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JlbmRlck9iamVjdH0gcmVuZGVyT2JqZWN0IC0gVGhlIHJlbmRlciBvYmplY3QuXHJcblx0ICogQHBhcmFtIHtOb2RlRnJhbWV9IG5vZGVGcmFtZSAtIFRoZSBjdXJyZW50IG5vZGUgZnJhbWUuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZ2l2ZW4gcmVuZGVyIG9iamVjdCByZXF1aXJlcyBhIHJlZnJlc2ggb3Igbm90LlxyXG5cdCAqL1xyXG5cdG5lZWRzUmVmcmVzaCggcmVuZGVyT2JqZWN0LCBub2RlRnJhbWUgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmhhc05vZGUgfHwgdGhpcy5oYXNBbmltYXRpb24gfHwgdGhpcy5maXJzdEluaXRpYWxpemF0aW9uKCByZW5kZXJPYmplY3QgKSApXHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cclxuXHRcdGNvbnN0IHsgcmVuZGVySWQgfSA9IG5vZGVGcmFtZTtcclxuXHJcblx0XHRpZiAoIHRoaXMucmVuZGVySWQgIT09IHJlbmRlcklkICkge1xyXG5cclxuXHRcdFx0dGhpcy5yZW5kZXJJZCA9IHJlbmRlcklkO1xyXG5cclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGlzU3RhdGljID0gcmVuZGVyT2JqZWN0Lm9iamVjdC5zdGF0aWMgPT09IHRydWU7XHJcblx0XHRjb25zdCBpc0J1bmRsZSA9IHJlbmRlck9iamVjdC5idW5kbGUgIT09IG51bGwgJiYgcmVuZGVyT2JqZWN0LmJ1bmRsZS5zdGF0aWMgPT09IHRydWUgJiYgdGhpcy5nZXRSZW5kZXJPYmplY3REYXRhKCByZW5kZXJPYmplY3QgKS52ZXJzaW9uID09PSByZW5kZXJPYmplY3QuYnVuZGxlLnZlcnNpb247XHJcblxyXG5cdFx0aWYgKCBpc1N0YXRpYyB8fCBpc0J1bmRsZSApXHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHJcblx0XHRjb25zdCBub3RFcXVhbCA9IHRoaXMuZXF1YWxzKCByZW5kZXJPYmplY3QgKSAhPT0gdHJ1ZTtcclxuXHJcblx0XHRyZXR1cm4gbm90RXF1YWw7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IE5vZGVNYXRlcmlhbE9ic2VydmVyO1xyXG4iLCJpbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uLy4uL21hdGgvQ29sb3IuanMnO1xyXG5pbXBvcnQgeyBNYXRyaXgyIH0gZnJvbSAnLi4vLi4vbWF0aC9NYXRyaXgyLmpzJztcclxuaW1wb3J0IHsgTWF0cml4MyB9IGZyb20gJy4uLy4uL21hdGgvTWF0cml4My5qcyc7XHJcbmltcG9ydCB7IE1hdHJpeDQgfSBmcm9tICcuLi8uLi9tYXRoL01hdHJpeDQuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IyLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjQgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjQuanMnO1xyXG5cclxuLy8gY3lyYjUzIChjKSAyMDE4IGJyeWMgKGdpdGh1Yi5jb20vYnJ5YykuIExpY2Vuc2U6IFB1YmxpYyBkb21haW4uIEF0dHJpYnV0aW9uIGFwcHJlY2lhdGVkLlxyXG4vLyBBIGZhc3QgYW5kIHNpbXBsZSA2NC1iaXQgKG9yIDUzLWJpdCkgc3RyaW5nIGhhc2ggZnVuY3Rpb24gd2l0aCBkZWNlbnQgY29sbGlzaW9uIHJlc2lzdGFuY2UuXHJcbi8vIExhcmdlbHkgaW5zcGlyZWQgYnkgTXVybXVySGFzaDIvMywgYnV0IHdpdGggYSBmb2N1cyBvbiBzcGVlZC9zaW1wbGljaXR5LlxyXG4vLyBTZWUgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNzYxNjQ2MS9nZW5lcmF0ZS1hLWhhc2gtZnJvbS1zdHJpbmctaW4tamF2YXNjcmlwdC81MjE3MTQ4MCM1MjE3MTQ4MFxyXG4vLyBodHRwczovL2dpdGh1Yi5jb20vYnJ5Yy9jb2RlL2Jsb2IvbWFzdGVyL2pzaGFzaC9leHBlcmltZW50YWwvY3lyYjUzLmpzXHJcbmZ1bmN0aW9uIGN5cmI1MyggdmFsdWUsIHNlZWQgPSAwICkge1xyXG5cclxuXHRsZXQgaDEgPSAweGRlYWRiZWVmIF4gc2VlZCwgaDIgPSAweDQxYzZjZTU3IF4gc2VlZDtcclxuXHJcblx0aWYgKCB2YWx1ZSBpbnN0YW5jZW9mIEFycmF5ICkge1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgdmFsOyBpIDwgdmFsdWUubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0dmFsID0gdmFsdWVbIGkgXTtcclxuXHRcdFx0aDEgPSBNYXRoLmltdWwoIGgxIF4gdmFsLCAyNjU0NDM1NzYxICk7XHJcblx0XHRcdGgyID0gTWF0aC5pbXVsKCBoMiBeIHZhbCwgMTU5NzMzNDY3NyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fSBlbHNlIHtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGNoOyBpIDwgdmFsdWUubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y2ggPSB2YWx1ZS5jaGFyQ29kZUF0KCBpICk7XHJcblx0XHRcdGgxID0gTWF0aC5pbXVsKCBoMSBeIGNoLCAyNjU0NDM1NzYxICk7XHJcblx0XHRcdGgyID0gTWF0aC5pbXVsKCBoMiBeIGNoLCAxNTk3MzM0Njc3ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGgxID0gTWF0aC5pbXVsKCBoMSBeICggaDEgPj4+IDE2ICksIDIyNDY4MjI1MDcgKTtcclxuXHRoMSBePSBNYXRoLmltdWwoIGgyIF4gKCBoMiA+Pj4gMTMgKSwgMzI2NjQ4OTkwOSApO1xyXG5cdGgyID0gTWF0aC5pbXVsKCBoMiBeICggaDIgPj4+IDE2ICksIDIyNDY4MjI1MDcgKTtcclxuXHRoMiBePSBNYXRoLmltdWwoIGgxIF4gKCBoMSA+Pj4gMTMgKSwgMzI2NjQ4OTkwOSApO1xyXG5cclxuXHRyZXR1cm4gNDI5NDk2NzI5NiAqICggMjA5NzE1MSAmIGgyICkgKyAoIGgxID4+PiAwICk7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQ29tcHV0ZXMgYSBoYXNoIGZvciB0aGUgZ2l2ZW4gc3RyaW5nLlxyXG4gKlxyXG4gKiBAbWV0aG9kXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgLSBUaGUgc3RyaW5nIHRvIGJlIGhhc2hlZC5cclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgaGFzaC5cclxuICovXHJcbmV4cG9ydCBjb25zdCBoYXNoU3RyaW5nID0gKCBzdHIgKSA9PiBjeXJiNTMoIHN0ciApO1xyXG5cclxuLyoqXHJcbiAqIENvbXB1dGVzIGEgaGFzaCBmb3IgdGhlIGdpdmVuIGFycmF5LlxyXG4gKlxyXG4gKiBAbWV0aG9kXHJcbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gYXJyYXkgLSBUaGUgYXJyYXkgdG8gYmUgaGFzaGVkLlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBoYXNoLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGhhc2hBcnJheSA9ICggYXJyYXkgKSA9PiBjeXJiNTMoIGFycmF5ICk7XHJcblxyXG4vKipcclxuICogQ29tcHV0ZXMgYSBoYXNoIGZvciB0aGUgZ2l2ZW4gbGlzdCBvZiBwYXJhbWV0ZXJzLlxyXG4gKlxyXG4gKiBAbWV0aG9kXHJcbiAqIEBwYXJhbSB7Li4ubnVtYmVyfSBwYXJhbXMgLSBBIGxpc3Qgb2YgcGFyYW1ldGVycy5cclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgaGFzaC5cclxuICovXHJcbmV4cG9ydCBjb25zdCBoYXNoID0gKCAuLi5wYXJhbXMgKSA9PiBjeXJiNTMoIHBhcmFtcyApO1xyXG5cclxuLyoqXHJcbiAqIENvbXB1dGVzIGEgY2FjaGUga2V5IGZvciB0aGUgZ2l2ZW4gbm9kZS5cclxuICpcclxuICogQG1ldGhvZFxyXG4gKiBAcGFyYW0ge09iamVjdHxOb2RlfSBvYmplY3QgLSBUaGUgb2JqZWN0IHRvIGJlIGhhc2hlZC5cclxuICogQHBhcmFtIHtib29sZWFufSBbZm9yY2U9ZmFsc2VdIC0gV2hldGhlciB0byBmb3JjZSBhIGNhY2hlIGtleSBjb21wdXRhdGlvbiBvciBub3QuXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGhhc2guXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2FjaGVLZXkoIG9iamVjdCwgZm9yY2UgPSBmYWxzZSApIHtcclxuXHJcblx0Y29uc3QgdmFsdWVzID0gW107XHJcblxyXG5cdGlmICggb2JqZWN0LmlzTm9kZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHR2YWx1ZXMucHVzaCggb2JqZWN0LmlkICk7XHJcblx0XHRvYmplY3QgPSBvYmplY3QuZ2V0U2VsZigpO1xyXG5cclxuXHR9XHJcblxyXG5cdGZvciAoIGNvbnN0IHsgcHJvcGVydHksIGNoaWxkTm9kZSB9IG9mIGdldE5vZGVDaGlsZHJlbiggb2JqZWN0ICkgKSB7XHJcblxyXG5cdFx0dmFsdWVzLnB1c2goIGN5cmI1MyggcHJvcGVydHkuc2xpY2UoIDAsIC0gNCApICksIGNoaWxkTm9kZS5nZXRDYWNoZUtleSggZm9yY2UgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiBjeXJiNTMoIHZhbHVlcyApO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFRoaXMgZ2VuZXJhdG9yIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGl0ZXJhdGUgb3ZlciB0aGUgbm9kZSBjaGlsZHJlblxyXG4gKiBvZiB0aGUgZ2l2ZW4gb2JqZWN0LlxyXG4gKlxyXG4gKiBAZ2VuZXJhdG9yXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBub2RlIC0gVGhlIG9iamVjdCB0byBiZSBoYXNoZWQuXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3RvSlNPTj1mYWxzZV0gLSBXaGV0aGVyIHRvIHJldHVybiBKU09OIG9yIG5vdC5cclxuICogQHlpZWxkcyB7T2JqZWN0fSBBIHJlc3VsdCBub2RlIGhvbGRpbmcgdGhlIHByb3BlcnR5LCBpbmRleCAoaWYgYXZhaWxhYmxlKSBhbmQgdGhlIGNoaWxkIG5vZGUuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24qIGdldE5vZGVDaGlsZHJlbiggbm9kZSwgdG9KU09OID0gZmFsc2UgKSB7XHJcblxyXG5cdGZvciAoIGNvbnN0IHByb3BlcnR5IGluIG5vZGUgKSB7XHJcblxyXG5cdFx0Ly8gSWdub3JlIHByaXZhdGUgcHJvcGVydGllcy5cclxuXHRcdGlmICggcHJvcGVydHkuc3RhcnRzV2l0aCggJ18nICkgPT09IHRydWUgKSBjb250aW51ZTtcclxuXHJcblx0XHRjb25zdCBvYmplY3QgPSBub2RlWyBwcm9wZXJ0eSBdO1xyXG5cclxuXHRcdGlmICggQXJyYXkuaXNBcnJheSggb2JqZWN0ICkgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBvYmplY3QubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBjaGlsZCA9IG9iamVjdFsgaSBdO1xyXG5cclxuXHRcdFx0XHRpZiAoIGNoaWxkICYmICggY2hpbGQuaXNOb2RlID09PSB0cnVlIHx8IHRvSlNPTiAmJiB0eXBlb2YgY2hpbGQudG9KU09OID09PSAnZnVuY3Rpb24nICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0eWllbGQgeyBwcm9wZXJ0eSwgaW5kZXg6IGksIGNoaWxkTm9kZTogY2hpbGQgfTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSBpZiAoIG9iamVjdCAmJiBvYmplY3QuaXNOb2RlID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0eWllbGQgeyBwcm9wZXJ0eSwgY2hpbGROb2RlOiBvYmplY3QgfTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyApIHtcclxuXHJcblx0XHRcdGZvciAoIGNvbnN0IHN1YlByb3BlcnR5IGluIG9iamVjdCApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgY2hpbGQgPSBvYmplY3RbIHN1YlByb3BlcnR5IF07XHJcblxyXG5cdFx0XHRcdGlmICggY2hpbGQgJiYgKCBjaGlsZC5pc05vZGUgPT09IHRydWUgfHwgdG9KU09OICYmIHR5cGVvZiBjaGlsZC50b0pTT04gPT09ICdmdW5jdGlvbicgKSApIHtcclxuXHJcblx0XHRcdFx0XHR5aWVsZCB7IHByb3BlcnR5LCBpbmRleDogc3ViUHJvcGVydHksIGNoaWxkTm9kZTogY2hpbGQgfTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuY29uc3QgdHlwZUZyb21MZW5ndGggPSAvKkBfX1BVUkVfXyovIG5ldyBNYXAoIFtcclxuXHRbIDEsICdmbG9hdCcgXSxcclxuXHRbIDIsICd2ZWMyJyBdLFxyXG5cdFsgMywgJ3ZlYzMnIF0sXHJcblx0WyA0LCAndmVjNCcgXSxcclxuXHRbIDksICdtYXQzJyBdLFxyXG5cdFsgMTYsICdtYXQ0JyBdXHJcbl0gKTtcclxuXHJcbmNvbnN0IGRhdGFGcm9tT2JqZWN0ID0gLypAX19QVVJFX18qLyBuZXcgV2Vha01hcCgpO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIGRhdGEgdHlwZSBmb3IgdGhlIGdpdmVuIHRoZSBsZW5ndGguXHJcbiAqXHJcbiAqIEBtZXRob2RcclxuICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCAtIFRoZSBsZW5ndGguXHJcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGRhdGEgdHlwZS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRUeXBlRnJvbUxlbmd0aCggbGVuZ3RoICkge1xyXG5cclxuXHRyZXR1cm4gdHlwZUZyb21MZW5ndGguZ2V0KCBsZW5ndGggKTtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSB0eXBlZCBhcnJheSBmb3IgdGhlIGdpdmVuIGRhdGEgdHlwZS5cclxuICpcclxuICogQG1ldGhvZFxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSBkYXRhIHR5cGUuXHJcbiAqIEByZXR1cm4ge1R5cGVkQXJyYXl9IFRoZSB0eXBlZCBhcnJheS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRUeXBlZEFycmF5RnJvbVR5cGUoIHR5cGUgKSB7XHJcblxyXG5cdC8vIEhhbmRsZSBjb21wb25lbnQgdHlwZSBmb3IgdmVjdG9ycyBhbmQgbWF0cmljZXNcclxuXHRpZiAoIC9baXVdP3ZlY1xcZC8udGVzdCggdHlwZSApICkge1xyXG5cclxuXHRcdC8vIEhhbmRsZSBpbnQgdmVjdG9yc1xyXG5cdFx0aWYgKCB0eXBlLnN0YXJ0c1dpdGgoICdpdmVjJyApICkgcmV0dXJuIEludDMyQXJyYXk7XHJcblx0XHQvLyBIYW5kbGUgdWludCB2ZWN0b3JzXHJcblx0XHRpZiAoIHR5cGUuc3RhcnRzV2l0aCggJ3V2ZWMnICkgKSByZXR1cm4gVWludDMyQXJyYXk7XHJcblx0XHQvLyBEZWZhdWx0IHRvIGZsb2F0IHZlY3RvcnNcclxuXHRcdHJldHVybiBGbG9hdDMyQXJyYXk7XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gSGFuZGxlIG1hdHJpY2VzIChhbHdheXMgZmxvYXQpXHJcblx0aWYgKCAvbWF0XFxkLy50ZXN0KCB0eXBlICkgKSByZXR1cm4gRmxvYXQzMkFycmF5O1xyXG5cclxuXHQvLyBCYXNpYyB0eXBlc1xyXG5cdGlmICggL2Zsb2F0Ly50ZXN0KCB0eXBlICkgKSByZXR1cm4gRmxvYXQzMkFycmF5O1xyXG5cdGlmICggL3VpbnQvLnRlc3QoIHR5cGUgKSApIHJldHVybiBVaW50MzJBcnJheTtcclxuXHRpZiAoIC9pbnQvLnRlc3QoIHR5cGUgKSApIHJldHVybiBJbnQzMkFycmF5O1xyXG5cclxuXHR0aHJvdyBuZXcgRXJyb3IoIGBUSFJFRS5Ob2RlVXRpbHM6IFVuc3VwcG9ydGVkIHR5cGU6ICR7dHlwZX1gICk7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgbGVuZ3RoIGZvciB0aGUgZ2l2ZW4gZGF0YSB0eXBlLlxyXG4gKlxyXG4gKiBAbWV0aG9kXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIGRhdGEgdHlwZS5cclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgbGVuZ3RoLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldExlbmd0aEZyb21UeXBlKCB0eXBlICkge1xyXG5cclxuXHRpZiAoIC9mbG9hdHxpbnR8dWludC8udGVzdCggdHlwZSApICkgcmV0dXJuIDE7XHJcblx0aWYgKCAvdmVjMi8udGVzdCggdHlwZSApICkgcmV0dXJuIDI7XHJcblx0aWYgKCAvdmVjMy8udGVzdCggdHlwZSApICkgcmV0dXJuIDM7XHJcblx0aWYgKCAvdmVjNC8udGVzdCggdHlwZSApICkgcmV0dXJuIDQ7XHJcblx0aWYgKCAvbWF0Mi8udGVzdCggdHlwZSApICkgcmV0dXJuIDQ7XHJcblx0aWYgKCAvbWF0My8udGVzdCggdHlwZSApICkgcmV0dXJuIDk7XHJcblx0aWYgKCAvbWF0NC8udGVzdCggdHlwZSApICkgcmV0dXJuIDE2O1xyXG5cclxuXHRjb25zb2xlLmVycm9yKCAnVEhSRUUuVFNMOiBVbnN1cHBvcnRlZCB0eXBlOicsIHR5cGUgKTtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBkYXRhIHR5cGUgZm9yIHRoZSBnaXZlbiB2YWx1ZS5cclxuICpcclxuICogQG1ldGhvZFxyXG4gKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBUaGUgdmFsdWUuXHJcbiAqIEByZXR1cm4gez9zdHJpbmd9IFRoZSBkYXRhIHR5cGUuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmFsdWVUeXBlKCB2YWx1ZSApIHtcclxuXHJcblx0aWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsICkgcmV0dXJuIG51bGw7XHJcblxyXG5cdGNvbnN0IHR5cGVPZiA9IHR5cGVvZiB2YWx1ZTtcclxuXHJcblx0aWYgKCB2YWx1ZS5pc05vZGUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0cmV0dXJuICdub2RlJztcclxuXHJcblx0fSBlbHNlIGlmICggdHlwZU9mID09PSAnbnVtYmVyJyApIHtcclxuXHJcblx0XHRyZXR1cm4gJ2Zsb2F0JztcclxuXHJcblx0fSBlbHNlIGlmICggdHlwZU9mID09PSAnYm9vbGVhbicgKSB7XHJcblxyXG5cdFx0cmV0dXJuICdib29sJztcclxuXHJcblx0fSBlbHNlIGlmICggdHlwZU9mID09PSAnc3RyaW5nJyApIHtcclxuXHJcblx0XHRyZXR1cm4gJ3N0cmluZyc7XHJcblxyXG5cdH0gZWxzZSBpZiAoIHR5cGVPZiA9PT0gJ2Z1bmN0aW9uJyApIHtcclxuXHJcblx0XHRyZXR1cm4gJ3NoYWRlcic7XHJcblxyXG5cdH0gZWxzZSBpZiAoIHZhbHVlLmlzVmVjdG9yMiA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRyZXR1cm4gJ3ZlYzInO1xyXG5cclxuXHR9IGVsc2UgaWYgKCB2YWx1ZS5pc1ZlY3RvcjMgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0cmV0dXJuICd2ZWMzJztcclxuXHJcblx0fSBlbHNlIGlmICggdmFsdWUuaXNWZWN0b3I0ID09PSB0cnVlICkge1xyXG5cclxuXHRcdHJldHVybiAndmVjNCc7XHJcblxyXG5cdH0gZWxzZSBpZiAoIHZhbHVlLmlzTWF0cml4MiA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRyZXR1cm4gJ21hdDInO1xyXG5cclxuXHR9IGVsc2UgaWYgKCB2YWx1ZS5pc01hdHJpeDMgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0cmV0dXJuICdtYXQzJztcclxuXHJcblx0fSBlbHNlIGlmICggdmFsdWUuaXNNYXRyaXg0ID09PSB0cnVlICkge1xyXG5cclxuXHRcdHJldHVybiAnbWF0NCc7XHJcblxyXG5cdH0gZWxzZSBpZiAoIHZhbHVlLmlzQ29sb3IgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0cmV0dXJuICdjb2xvcic7XHJcblxyXG5cdH0gZWxzZSBpZiAoIHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuICdBcnJheUJ1ZmZlcic7XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIG51bGw7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgdmFsdWUvb2JqZWN0IGZvciB0aGUgZ2l2ZW4gZGF0YSB0eXBlIGFuZCBwYXJhbWV0ZXJzLlxyXG4gKlxyXG4gKiBAbWV0aG9kXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIGdpdmVuIHR5cGUuXHJcbiAqIEBwYXJhbSB7Li4uYW55fSBwYXJhbXMgLSBBIHBhcmFtZXRlciBsaXN0LlxyXG4gKiBAcmV0dXJuIHthbnl9IFRoZSB2YWx1ZS9vYmplY3QuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmFsdWVGcm9tVHlwZSggdHlwZSwgLi4ucGFyYW1zICkge1xyXG5cclxuXHRjb25zdCBsYXN0NCA9IHR5cGUgPyB0eXBlLnNsaWNlKCAtIDQgKSA6IHVuZGVmaW5lZDtcclxuXHJcblx0aWYgKCBwYXJhbXMubGVuZ3RoID09PSAxICkgeyAvLyBlbnN1cmUgc2FtZSBiZWhhdmlvdXIgYXMgaW4gTm9kZUJ1aWxkZXIuZm9ybWF0KClcclxuXHJcblx0XHRpZiAoIGxhc3Q0ID09PSAndmVjMicgKSBwYXJhbXMgPSBbIHBhcmFtc1sgMCBdLCBwYXJhbXNbIDAgXSBdO1xyXG5cdFx0ZWxzZSBpZiAoIGxhc3Q0ID09PSAndmVjMycgKSBwYXJhbXMgPSBbIHBhcmFtc1sgMCBdLCBwYXJhbXNbIDAgXSwgcGFyYW1zWyAwIF0gXTtcclxuXHRcdGVsc2UgaWYgKCBsYXN0NCA9PT0gJ3ZlYzQnICkgcGFyYW1zID0gWyBwYXJhbXNbIDAgXSwgcGFyYW1zWyAwIF0sIHBhcmFtc1sgMCBdLCBwYXJhbXNbIDAgXSBdO1xyXG5cclxuXHR9XHJcblxyXG5cdGlmICggdHlwZSA9PT0gJ2NvbG9yJyApIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IENvbG9yKCAuLi5wYXJhbXMgKTtcclxuXHJcblx0fSBlbHNlIGlmICggbGFzdDQgPT09ICd2ZWMyJyApIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IFZlY3RvcjIoIC4uLnBhcmFtcyApO1xyXG5cclxuXHR9IGVsc2UgaWYgKCBsYXN0NCA9PT0gJ3ZlYzMnICkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgVmVjdG9yMyggLi4ucGFyYW1zICk7XHJcblxyXG5cdH0gZWxzZSBpZiAoIGxhc3Q0ID09PSAndmVjNCcgKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBWZWN0b3I0KCAuLi5wYXJhbXMgKTtcclxuXHJcblx0fSBlbHNlIGlmICggbGFzdDQgPT09ICdtYXQyJyApIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IE1hdHJpeDIoIC4uLnBhcmFtcyApO1xyXG5cclxuXHR9IGVsc2UgaWYgKCBsYXN0NCA9PT0gJ21hdDMnICkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgTWF0cml4MyggLi4ucGFyYW1zICk7XHJcblxyXG5cdH0gZWxzZSBpZiAoIGxhc3Q0ID09PSAnbWF0NCcgKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBNYXRyaXg0KCAuLi5wYXJhbXMgKTtcclxuXHJcblx0fSBlbHNlIGlmICggdHlwZSA9PT0gJ2Jvb2wnICkge1xyXG5cclxuXHRcdHJldHVybiBwYXJhbXNbIDAgXSB8fCBmYWxzZTtcclxuXHJcblx0fSBlbHNlIGlmICggKCB0eXBlID09PSAnZmxvYXQnICkgfHwgKCB0eXBlID09PSAnaW50JyApIHx8ICggdHlwZSA9PT0gJ3VpbnQnICkgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHBhcmFtc1sgMCBdIHx8IDA7XHJcblxyXG5cdH0gZWxzZSBpZiAoIHR5cGUgPT09ICdzdHJpbmcnICkge1xyXG5cclxuXHRcdHJldHVybiBwYXJhbXNbIDAgXSB8fCAnJztcclxuXHJcblx0fSBlbHNlIGlmICggdHlwZSA9PT0gJ0FycmF5QnVmZmVyJyApIHtcclxuXHJcblx0XHRyZXR1cm4gYmFzZTY0VG9BcnJheUJ1ZmZlciggcGFyYW1zWyAwIF0gKTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gbnVsbDtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXRzIHRoZSBvYmplY3QgZGF0YSB0aGF0IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBkaWZmZXJlbnQgcmVuZGVyaW5nIHN0ZXBzLlxyXG4gKlxyXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IC0gVGhlIG9iamVjdCB0byBnZXQgdGhlIGRhdGEgZm9yLlxyXG4gKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBvYmplY3QgZGF0YS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXREYXRhRnJvbU9iamVjdCggb2JqZWN0ICkge1xyXG5cclxuXHRsZXQgZGF0YSA9IGRhdGFGcm9tT2JqZWN0LmdldCggb2JqZWN0ICk7XHJcblxyXG5cdGlmICggZGF0YSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdGRhdGEgPSB7fTtcclxuXHRcdGRhdGFGcm9tT2JqZWN0LnNldCggb2JqZWN0LCBkYXRhICk7XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIGRhdGE7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQ29udmVydHMgdGhlIGdpdmVuIGFycmF5IGJ1ZmZlciB0byBhIEJhc2U2NCBzdHJpbmcuXHJcbiAqXHJcbiAqIEBtZXRob2RcclxuICogQHBhcmFtIHtBcnJheUJ1ZmZlcn0gYXJyYXlCdWZmZXIgLSBUaGUgYXJyYXkgYnVmZmVyLlxyXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBCYXNlNjQgc3RyaW5nLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGFycmF5QnVmZmVyVG9CYXNlNjQoIGFycmF5QnVmZmVyICkge1xyXG5cclxuXHRsZXQgY2hhcnMgPSAnJztcclxuXHJcblx0Y29uc3QgYXJyYXkgPSBuZXcgVWludDhBcnJheSggYXJyYXlCdWZmZXIgKTtcclxuXHJcblx0Zm9yICggbGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdGNoYXJzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoIGFycmF5WyBpIF0gKTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gYnRvYSggY2hhcnMgKTtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gQmFzZTY0IHN0cmluZyB0byBhbiBhcnJheSBidWZmZXIuXHJcbiAqXHJcbiAqIEBtZXRob2RcclxuICogQHBhcmFtIHtzdHJpbmd9IGJhc2U2NCAtIFRoZSBCYXNlNjQgc3RyaW5nLlxyXG4gKiBAcmV0dXJuIHtBcnJheUJ1ZmZlcn0gVGhlIGFycmF5IGJ1ZmZlci5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBiYXNlNjRUb0FycmF5QnVmZmVyKCBiYXNlNjQgKSB7XHJcblxyXG5cdHJldHVybiBVaW50OEFycmF5LmZyb20oIGF0b2IoIGJhc2U2NCApLCBjID0+IGMuY2hhckNvZGVBdCggMCApICkuYnVmZmVyO1xyXG5cclxufVxyXG4iLCIvKipcclxuICogUG9zc2libGUgc2hhZGVyIHN0YWdlcy5cclxuICpcclxuICogQHByb3BlcnR5IHtzdHJpbmd9IFZFUlRFWCBUaGUgdmVydGV4IHNoYWRlciBzdGFnZS5cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IEZSQUdNRU5UIFRoZSBmcmFnbWVudCBzaGFkZXIgc3RhZ2UuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTm9kZVNoYWRlclN0YWdlID0ge1xyXG5cdFZFUlRFWDogJ3ZlcnRleCcsXHJcblx0RlJBR01FTlQ6ICdmcmFnbWVudCdcclxufTtcclxuXHJcbi8qKlxyXG4gKiBVcGRhdGUgdHlwZXMgb2YgYSBub2RlLlxyXG4gKlxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTk9ORSBUaGUgdXBkYXRlIG1ldGhvZCBpcyBub3QgZXhlY3V0ZWQuXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBGUkFNRSBUaGUgdXBkYXRlIG1ldGhvZCBpcyBleGVjdXRlZCBwZXIgZnJhbWUuXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSRU5ERVIgVGhlIHVwZGF0ZSBtZXRob2QgaXMgZXhlY3V0ZWQgcGVyIHJlbmRlci4gQSBmcmFtZSBtaWdodCBiZSBwcm9kdWNlZCBieSBtdWx0aXBsZSByZW5kZXIgY2FsbHMgc28gdGhpcyB2YWx1ZSBhbGxvd3MgbW9yZSBkZXRhaWxlZCB1cGRhdGVzIHRoYW4gRlJBTUUuXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBPQkpFQ1QgVGhlIHVwZGF0ZSBtZXRob2QgaXMgZXhlY3V0ZWQgcGVyIHtAbGluayBPYmplY3QzRH0gdGhhdCB1c2VzIHRoZSBub2RlIGZvciByZW5kZXJpbmcuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTm9kZVVwZGF0ZVR5cGUgPSB7XHJcblx0Tk9ORTogJ25vbmUnLFxyXG5cdEZSQU1FOiAnZnJhbWUnLFxyXG5cdFJFTkRFUjogJ3JlbmRlcicsXHJcblx0T0JKRUNUOiAnb2JqZWN0J1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIERhdGEgdHlwZXMgb2YgYSBub2RlLlxyXG4gKlxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQk9PTEVBTiBCb29sZWFuIHR5cGUuXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBJTlRFR0VSIEludGVnZXIgdHlwZS5cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IEZMT0FUIEZsb2F0IHR5cGUuXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBWRUNUT1IyIFR3by1kaW1lbnNpb25hbCB2ZWN0b3IgdHlwZS5cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IFZFQ1RPUjMgVGhyZWUtZGltZW5zaW9uYWwgdmVjdG9yIHR5cGUuXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBWRUNUT1I0IEZvdXItZGltZW5zaW9uYWwgdmVjdG9yIHR5cGUuXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBNQVRSSVgyIDJ4MiBtYXRyaXggdHlwZS5cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IE1BVFJJWDMgM3gzIG1hdHJpeCB0eXBlLlxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTUFUUklYNCA0eDQgbWF0cml4IHR5cGUuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTm9kZVR5cGUgPSB7XHJcblx0Qk9PTEVBTjogJ2Jvb2wnLFxyXG5cdElOVEVHRVI6ICdpbnQnLFxyXG5cdEZMT0FUOiAnZmxvYXQnLFxyXG5cdFZFQ1RPUjI6ICd2ZWMyJyxcclxuXHRWRUNUT1IzOiAndmVjMycsXHJcblx0VkVDVE9SNDogJ3ZlYzQnLFxyXG5cdE1BVFJJWDI6ICdtYXQyJyxcclxuXHRNQVRSSVgzOiAnbWF0MycsXHJcblx0TUFUUklYNDogJ21hdDQnXHJcbn07XHJcblxyXG4vKipcclxuICogQWNjZXNzIHR5cGVzIG9mIGEgbm9kZS4gVGhlc2UgYXJlIHJlbGV2YW50IGZvciBjb21wdXRlIGFuZCBzdG9yYWdlIHVzYWdlLlxyXG4gKlxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUkVBRF9PTkxZIFJlYWQtb25seSBhY2Nlc3NcclxuICogQHByb3BlcnR5IHtzdHJpbmd9IFdSSVRFX09OTFkgV3JpdGUtb25seSBhY2Nlc3MuXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSRUFEX1dSSVRFIFJlYWQgYW5kIHdyaXRlIGFjY2Vzcy5cclxuICovXHJcbmV4cG9ydCBjb25zdCBOb2RlQWNjZXNzID0ge1xyXG5cdFJFQURfT05MWTogJ3JlYWRPbmx5JyxcclxuXHRXUklURV9PTkxZOiAnd3JpdGVPbmx5JyxcclxuXHRSRUFEX1dSSVRFOiAncmVhZFdyaXRlJyxcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBkZWZhdWx0U2hhZGVyU3RhZ2VzID0gWyAnZnJhZ21lbnQnLCAndmVydGV4JyBdO1xyXG5leHBvcnQgY29uc3QgZGVmYXVsdEJ1aWxkU3RhZ2VzID0gWyAnc2V0dXAnLCAnYW5hbHl6ZScsICdnZW5lcmF0ZScgXTtcclxuZXhwb3J0IGNvbnN0IHNoYWRlclN0YWdlcyA9IFsgLi4uZGVmYXVsdFNoYWRlclN0YWdlcywgJ2NvbXB1dGUnIF07XHJcbmV4cG9ydCBjb25zdCB2ZWN0b3JDb21wb25lbnRzID0gWyAneCcsICd5JywgJ3onLCAndycgXTtcclxuIiwiaW1wb3J0IHsgTm9kZVVwZGF0ZVR5cGUgfSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IGdldE5vZGVDaGlsZHJlbiwgZ2V0Q2FjaGVLZXksIGhhc2ggfSBmcm9tICcuL05vZGVVdGlscy5qcyc7XHJcblxyXG5pbXBvcnQgeyBFdmVudERpc3BhdGNoZXIgfSBmcm9tICcuLi8uLi9jb3JlL0V2ZW50RGlzcGF0Y2hlci5qcyc7XHJcbmltcG9ydCB7IE1hdGhVdGlscyB9IGZyb20gJy4uLy4uL21hdGgvTWF0aFV0aWxzLmpzJztcclxuXHJcbmxldCBfbm9kZUlkID0gMDtcclxuXHJcbi8qKlxyXG4gKiBCYXNlIGNsYXNzIGZvciBhbGwgbm9kZXMuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBFdmVudERpc3BhdGNoZXJcclxuICovXHJcbmNsYXNzIE5vZGUgZXh0ZW5kcyBFdmVudERpc3BhdGNoZXIge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gez9zdHJpbmd9IG5vZGVUeXBlIC0gVGhlIG5vZGUgdHlwZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggbm9kZVR5cGUgPSBudWxsICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbm9kZSB0eXBlLiBUaGlzIHJlcHJlc2VudHMgdGhlIHJlc3VsdCB0eXBlIG9mIHRoZSBub2RlIChlLmcuIGBmbG9hdGAgb3IgYHZlYzNgKS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P3N0cmluZ31cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub2RlVHlwZSA9IG5vZGVUeXBlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHVwZGF0ZSB0eXBlIG9mIHRoZSBub2RlJ3Mge0BsaW5rIE5vZGUjdXBkYXRlfSBtZXRob2QuIFBvc3NpYmxlIHZhbHVlcyBhcmUgbGlzdGVkIGluIHtAbGluayBOb2RlVXBkYXRlVHlwZX0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqIEBkZWZhdWx0ICdub25lJ1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVwZGF0ZVR5cGUgPSBOb2RlVXBkYXRlVHlwZS5OT05FO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHVwZGF0ZSB0eXBlIG9mIHRoZSBub2RlJ3Mge0BsaW5rIE5vZGUjdXBkYXRlQmVmb3JlfSBtZXRob2QuIFBvc3NpYmxlIHZhbHVlcyBhcmUgbGlzdGVkIGluIHtAbGluayBOb2RlVXBkYXRlVHlwZX0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqIEBkZWZhdWx0ICdub25lJ1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVwZGF0ZUJlZm9yZVR5cGUgPSBOb2RlVXBkYXRlVHlwZS5OT05FO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHVwZGF0ZSB0eXBlIG9mIHRoZSBub2RlJ3Mge0BsaW5rIE5vZGUjdXBkYXRlQWZ0ZXJ9IG1ldGhvZC4gUG9zc2libGUgdmFsdWVzIGFyZSBsaXN0ZWQgaW4ge0BsaW5rIE5vZGVVcGRhdGVUeXBlfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICogQGRlZmF1bHQgJ25vbmUnXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXBkYXRlQWZ0ZXJUeXBlID0gTm9kZVVwZGF0ZVR5cGUuTk9ORTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBVVUlEIG9mIHRoZSBub2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51dWlkID0gTWF0aFV0aWxzLmdlbmVyYXRlVVVJRCgpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHZlcnNpb24gb2YgdGhlIG5vZGUuIFRoZSB2ZXJzaW9uIGF1dG9tYXRpY2FsbHkgaXMgaW5jcmVhc2VkIHdoZW4ge0BsaW5rIE5vZGUjbmVlZHNVcGRhdGV9IGlzIHNldCB0byBgdHJ1ZWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnZlcnNpb24gPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGlzIG5vZGUgaXMgZ2xvYmFsIG9yIG5vdC4gVGhpcyBwcm9wZXJ0eSBpcyByZWxldmFudCBmb3IgdGhlIGludGVybmFsXHJcblx0XHQgKiBub2RlIGNhY2hpbmcgc3lzdGVtLiBBbGwgbm9kZXMgd2hpY2ggc2hvdWxkIGJlIGRlY2xhcmVkIGp1c3Qgb25jZSBzaG91bGRcclxuXHRcdCAqIHNldCB0aGlzIGZsYWcgdG8gYHRydWVgIChhIHR5cGljYWwgZXhhbXBsZSBpcyB7QGxpbmsgQXR0cmlidXRlTm9kZX0pLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nbG9iYWwgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNOb2RlID0gdHJ1ZTtcclxuXHJcblx0XHQvLyBwcml2YXRlXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY2FjaGUga2V5IG9mIHRoaXMgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUgez9udW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX2NhY2hlS2V5ID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjYWNoZSBrZXkgJ3MgdmVyc2lvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fY2FjaGVLZXlWZXJzaW9uID0gMDtcclxuXHJcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsICdpZCcsIHsgdmFsdWU6IF9ub2RlSWQgKysgfSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldCB0aGlzIHByb3BlcnR5IHRvIGB0cnVlYCB3aGVuIHRoZSBub2RlIHNob3VsZCBiZSByZWdlbmVyYXRlZC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0ICogQHBhcmFtIHtib29sZWFufSB2YWx1ZVxyXG5cdCAqL1xyXG5cdHNldCBuZWVkc1VwZGF0ZSggdmFsdWUgKSB7XHJcblxyXG5cdFx0aWYgKCB2YWx1ZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdHRoaXMudmVyc2lvbiArKztcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIHR5cGUgb2YgdGhlIGNsYXNzLiBUaGUgdmFsdWUgaXMgdXN1YWxseSB0aGUgY29uc3RydWN0b3IgbmFtZS5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtzdHJpbmd9XHJcbiBcdCAqIEByZWFkb25seVxyXG5cdCAqL1xyXG5cdGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLnR5cGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29udmVuaWVudCBtZXRob2QgZm9yIGRlZmluaW5nIHtAbGluayBOb2RlI3VwZGF0ZX0uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayAtIFRoZSB1cGRhdGUgbWV0aG9kLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB1cGRhdGVUeXBlIC0gVGhlIHVwZGF0ZSB0eXBlLlxyXG5cdCAqIEByZXR1cm4ge05vZGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbm9kZS5cclxuXHQgKi9cclxuXHRvblVwZGF0ZSggY2FsbGJhY2ssIHVwZGF0ZVR5cGUgKSB7XHJcblxyXG5cdFx0dGhpcy51cGRhdGVUeXBlID0gdXBkYXRlVHlwZTtcclxuXHRcdHRoaXMudXBkYXRlID0gY2FsbGJhY2suYmluZCggdGhpcy5nZXRTZWxmKCkgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb252ZW5pZW50IG1ldGhvZCBmb3IgZGVmaW5pbmcge0BsaW5rIE5vZGUjdXBkYXRlfS4gU2ltaWxhciB0byB7QGxpbmsgTm9kZSNvblVwZGF0ZX0sIGJ1dFxyXG5cdCAqIHRoaXMgbWV0aG9kIGF1dG9tYXRpY2FsbHkgc2V0cyB0aGUgdXBkYXRlIHR5cGUgdG8gYEZSQU1FYC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIC0gVGhlIHVwZGF0ZSBtZXRob2QuXHJcblx0ICogQHJldHVybiB7Tm9kZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBub2RlLlxyXG5cdCAqL1xyXG5cdG9uRnJhbWVVcGRhdGUoIGNhbGxiYWNrICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm9uVXBkYXRlKCBjYWxsYmFjaywgTm9kZVVwZGF0ZVR5cGUuRlJBTUUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb252ZW5pZW50IG1ldGhvZCBmb3IgZGVmaW5pbmcge0BsaW5rIE5vZGUjdXBkYXRlfS4gU2ltaWxhciB0byB7QGxpbmsgTm9kZSNvblVwZGF0ZX0sIGJ1dFxyXG5cdCAqIHRoaXMgbWV0aG9kIGF1dG9tYXRpY2FsbHkgc2V0cyB0aGUgdXBkYXRlIHR5cGUgdG8gYFJFTkRFUmAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayAtIFRoZSB1cGRhdGUgbWV0aG9kLlxyXG5cdCAqIEByZXR1cm4ge05vZGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbm9kZS5cclxuXHQgKi9cclxuXHRvblJlbmRlclVwZGF0ZSggY2FsbGJhY2sgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMub25VcGRhdGUoIGNhbGxiYWNrLCBOb2RlVXBkYXRlVHlwZS5SRU5ERVIgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb252ZW5pZW50IG1ldGhvZCBmb3IgZGVmaW5pbmcge0BsaW5rIE5vZGUjdXBkYXRlfS4gU2ltaWxhciB0byB7QGxpbmsgTm9kZSNvblVwZGF0ZX0sIGJ1dFxyXG5cdCAqIHRoaXMgbWV0aG9kIGF1dG9tYXRpY2FsbHkgc2V0cyB0aGUgdXBkYXRlIHR5cGUgdG8gYE9CSkVDVGAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayAtIFRoZSB1cGRhdGUgbWV0aG9kLlxyXG5cdCAqIEByZXR1cm4ge05vZGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbm9kZS5cclxuXHQgKi9cclxuXHRvbk9iamVjdFVwZGF0ZSggY2FsbGJhY2sgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMub25VcGRhdGUoIGNhbGxiYWNrLCBOb2RlVXBkYXRlVHlwZS5PQkpFQ1QgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb252ZW5pZW50IG1ldGhvZCBmb3IgZGVmaW5pbmcge0BsaW5rIE5vZGUjdXBkYXRlUmVmZXJlbmNlfS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIC0gVGhlIHVwZGF0ZSBtZXRob2QuXHJcblx0ICogQHJldHVybiB7Tm9kZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBub2RlLlxyXG5cdCAqL1xyXG5cdG9uUmVmZXJlbmNlKCBjYWxsYmFjayApIHtcclxuXHJcblx0XHR0aGlzLnVwZGF0ZVJlZmVyZW5jZSA9IGNhbGxiYWNrLmJpbmQoIHRoaXMuZ2V0U2VsZigpICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGB0aGlzYCByZWZlcmVuY2UgbWlnaHQgcG9pbnQgdG8gYSBQcm94eSBzbyB0aGlzIG1ldGhvZCBjYW4gYmUgdXNlZFxyXG5cdCAqIHRvIGdldCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBhY3R1YWwgbm9kZSBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge05vZGV9IEEgcmVmZXJlbmNlIHRvIHRoZSBub2RlLlxyXG5cdCAqL1xyXG5cdGdldFNlbGYoKSB7XHJcblxyXG5cdFx0Ly8gUmV0dXJucyBub24tbm9kZSBvYmplY3QuXHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuc2VsZiB8fCB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE5vZGVzIG1pZ2h0IHJlZmVyIHRvIG90aGVyIG9iamVjdHMgbGlrZSBtYXRlcmlhbHMuIFRoaXMgbWV0aG9kIGFsbG93cyB0byBkeW5hbWljYWxseSB1cGRhdGUgdGhlIHJlZmVyZW5jZVxyXG5cdCAqIHRvIHN1Y2ggb2JqZWN0cyBiYXNlZCBvbiBhIGdpdmVuIHN0YXRlIChlLmcuIHRoZSBjdXJyZW50IG5vZGUgZnJhbWUgb3IgYnVpbGRlcikuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge2FueX0gc3RhdGUgLSBUaGlzIG1ldGhvZCBjYW4gYmUgaW52b2NhdGVkIGluIGRpZmZlcmVudCBjb250ZXh0cyBzbyBgc3RhdGVgIGNhbiByZWZlciB0byBhbnkgb2JqZWN0IHR5cGUuXHJcblx0ICogQHJldHVybiB7YW55fSBUaGUgdXBkYXRlZCByZWZlcmVuY2UuXHJcblx0ICovXHJcblx0dXBkYXRlUmVmZXJlbmNlKCAvKnN0YXRlKi8gKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQnkgZGVmYXVsdCB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUge0BsaW5rIE5vZGUjZ2xvYmFsfSBmbGFnLiBUaGlzIG1ldGhvZFxyXG5cdCAqIGNhbiBiZSBvdmVyd3JpdHRlbiBpbiBkZXJpdmVkIGNsYXNzZXMgaWYgYW4gYW5hbHl0aWNhbCB3YXkgaXMgcmVxdWlyZWQgdG8gZGV0ZXJtaW5lIHRoZVxyXG5cdCAqIGdsb2JhbCBzdGF0dXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyBub2RlIGlzIGdsb2JhbCBvciBub3QuXHJcblx0ICovXHJcblx0aXNHbG9iYWwoIC8qYnVpbGRlciovICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmdsb2JhbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZW5lcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBpdGVyYXRlIG92ZXIgdGhlIGNoaWxkIG5vZGVzLlxyXG5cdCAqXHJcblx0ICogQGdlbmVyYXRvclxyXG5cdCAqIEB5aWVsZHMge05vZGV9IEEgY2hpbGQgbm9kZS5cclxuXHQgKi9cclxuXHQqIGdldENoaWxkcmVuKCkge1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IHsgY2hpbGROb2RlIH0gb2YgZ2V0Tm9kZUNoaWxkcmVuKCB0aGlzICkgKSB7XHJcblxyXG5cdFx0XHR5aWVsZCBjaGlsZE5vZGU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENhbGxpbmcgdGhpcyBtZXRob2QgZGlzcGF0Y2hlcyB0aGUgYGRpc3Bvc2VgIGV2ZW50LiBUaGlzIGV2ZW50IGNhbiBiZSB1c2VkXHJcblx0ICogdG8gcmVnaXN0ZXIgZXZlbnQgbGlzdGVuZXJzIGZvciBjbGVhbiB1cCB0YXNrcy5cclxuXHQgKi9cclxuXHRkaXNwb3NlKCkge1xyXG5cclxuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnZGlzcG9zZScgfSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENhbGxiYWNrIGZvciB7QGxpbmsgTm9kZSN0cmF2ZXJzZX0uXHJcblx0ICpcclxuXHQgKiBAY2FsbGJhY2sgdHJhdmVyc2VDYWxsYmFja1xyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFRoZSBjdXJyZW50IG5vZGUuXHJcblx0ICovXHJcblxyXG5cdC8qKlxyXG5cdCAqIENhbiBiZSB1c2VkIHRvIHRyYXZlcnNlIHRocm91Z2ggdGhlIG5vZGUncyBoaWVyYXJjaHkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3RyYXZlcnNlQ2FsbGJhY2t9IGNhbGxiYWNrIC0gQSBjYWxsYmFjayB0aGF0IGlzIGV4ZWN1dGVkIHBlciBub2RlLlxyXG5cdCAqL1xyXG5cdHRyYXZlcnNlKCBjYWxsYmFjayApIHtcclxuXHJcblx0XHRjYWxsYmFjayggdGhpcyApO1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IGNoaWxkTm9kZSBvZiB0aGlzLmdldENoaWxkcmVuKCkgKSB7XHJcblxyXG5cdFx0XHRjaGlsZE5vZGUudHJhdmVyc2UoIGNhbGxiYWNrICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGNhY2hlIGtleSBmb3IgdGhpcyBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbZm9yY2U9ZmFsc2VdIC0gV2hlbiBzZXQgdG8gYHRydWVgLCBhIHJlY29tcHV0YXRpb24gb2YgdGhlIGNhY2hlIGtleSBpcyBmb3JjZWQuXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgY2FjaGUga2V5IG9mIHRoZSBub2RlLlxyXG5cdCAqL1xyXG5cdGdldENhY2hlS2V5KCBmb3JjZSA9IGZhbHNlICkge1xyXG5cclxuXHRcdGZvcmNlID0gZm9yY2UgfHwgdGhpcy52ZXJzaW9uICE9PSB0aGlzLl9jYWNoZUtleVZlcnNpb247XHJcblxyXG5cdFx0aWYgKCBmb3JjZSA9PT0gdHJ1ZSB8fCB0aGlzLl9jYWNoZUtleSA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuX2NhY2hlS2V5ID0gaGFzaCggZ2V0Q2FjaGVLZXkoIHRoaXMsIGZvcmNlICksIHRoaXMuY3VzdG9tQ2FjaGVLZXkoKSApO1xyXG5cdFx0XHR0aGlzLl9jYWNoZUtleVZlcnNpb24gPSB0aGlzLnZlcnNpb247XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzLl9jYWNoZUtleTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZW5lcmF0ZSBhIGN1c3RvbSBjYWNoZSBrZXkgZm9yIHRoaXMgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGNhY2hlIGtleSBvZiB0aGUgbm9kZS5cclxuXHQgKi9cclxuXHRjdXN0b21DYWNoZUtleSgpIHtcclxuXHJcblx0XHRyZXR1cm4gMDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSByZWZlcmVuY2VzIHRvIHRoaXMgbm9kZSB3aGljaCBpcyBieSBkZWZhdWx0IGB0aGlzYC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge05vZGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbm9kZS5cclxuXHQgKi9cclxuXHRnZXRTY29wZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBoYXNoIG9mIHRoZSBub2RlIHdoaWNoIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlIG5vZGUuIEJ5IGRlZmF1bHQgaXQnc1xyXG5cdCAqIHRoZSB7QGxpbmsgTm9kZSN1dWlkfSBob3dldmVyIGRlcml2ZWQgbm9kZSBjbGFzc2VzIG1pZ2h0IGhhdmUgdG8gb3ZlcndyaXRlIHRoaXMgbWV0aG9kXHJcblx0ICogZGVwZW5kaW5nIG9uIHRoZWlyIGltcGxlbWVudGF0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBoYXNoLlxyXG5cdCAqL1xyXG5cdGdldEhhc2goIC8qYnVpbGRlciovICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnV1aWQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgdXBkYXRlIHR5cGUgb2Yge0BsaW5rIE5vZGUjdXBkYXRlfS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge05vZGVVcGRhdGVUeXBlfSBUaGUgdXBkYXRlIHR5cGUuXHJcblx0ICovXHJcblx0Z2V0VXBkYXRlVHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy51cGRhdGVUeXBlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHVwZGF0ZSB0eXBlIG9mIHtAbGluayBOb2RlI3VwZGF0ZUJlZm9yZX0uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtOb2RlVXBkYXRlVHlwZX0gVGhlIHVwZGF0ZSB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldFVwZGF0ZUJlZm9yZVR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMudXBkYXRlQmVmb3JlVHlwZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSB1cGRhdGUgdHlwZSBvZiB7QGxpbmsgTm9kZSN1cGRhdGVBZnRlcn0uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtOb2RlVXBkYXRlVHlwZX0gVGhlIHVwZGF0ZSB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldFVwZGF0ZUFmdGVyVHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy51cGRhdGVBZnRlclR5cGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2VydGFpbiB0eXBlcyBhcmUgY29tcG9zZWQgb2YgbXVsdGlwbGUgZWxlbWVudHMuIEZvciBleGFtcGxlIGEgYHZlYzNgXHJcblx0ICogaXMgY29tcG9zZWQgb2YgdGhyZWUgYGZsb2F0YCB2YWx1ZXMuIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHR5cGUgb2ZcclxuXHQgKiB0aGVzZSBlbGVtZW50cy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgdHlwZSBvZiB0aGUgbm9kZS5cclxuXHQgKi9cclxuXHRnZXRFbGVtZW50VHlwZSggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCB0eXBlID0gdGhpcy5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cdFx0Y29uc3QgZWxlbWVudFR5cGUgPSBidWlsZGVyLmdldEVsZW1lbnRUeXBlKCB0eXBlICk7XHJcblxyXG5cdFx0cmV0dXJuIGVsZW1lbnRUeXBlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIG5vZGUgbWVtYmVyIHR5cGUgZm9yIHRoZSBnaXZlbiBuYW1lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBtZW1iZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgdHlwZSBvZiB0aGUgbm9kZS5cclxuXHQgKi9cclxuXHRnZXRNZW1iZXJUeXBlKCAvKmJ1aWxkZXIsIG5hbWUqLyApIHtcclxuXHJcblx0XHRyZXR1cm4gJ3ZvaWQnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIG5vZGUncyB0eXBlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB0eXBlIG9mIHRoZSBub2RlLlxyXG5cdCAqL1xyXG5cdGdldE5vZGVUeXBlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IG5vZGVQcm9wZXJ0aWVzID0gYnVpbGRlci5nZXROb2RlUHJvcGVydGllcyggdGhpcyApO1xyXG5cclxuXHRcdGlmICggbm9kZVByb3BlcnRpZXMub3V0cHV0Tm9kZSApIHtcclxuXHJcblx0XHRcdHJldHVybiBub2RlUHJvcGVydGllcy5vdXRwdXROb2RlLmdldE5vZGVUeXBlKCBidWlsZGVyICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzLm5vZGVUeXBlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgZHVyaW5nIHRoZSBidWlsZCBwcm9jZXNzIG9mIGEgbm9kZSBhbmQgZW5zdXJlc1xyXG5cdCAqIGVxdWFsIG5vZGVzIGFyZSBub3QgYnVpbHQgbXVsdGlwbGUgdGltZXMgYnV0IGp1c3Qgb25jZS4gRm9yIGV4YW1wbGUgaWZcclxuXHQgKiBgYXR0cmlidXRlKCAndXYnIClgIGlzIHVzZWQgbXVsdGlwbGUgdGltZXMgYnkgdGhlIHVzZXIsIHRoZSBidWlsZFxyXG5cdCAqIHByb2Nlc3MgbWFrZXMgc3VyZSB0byBwcm9jZXNzIGp1c3QgdGhlIGZpcnN0IG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge05vZGV9IFRoZSBzaGFyZWQgbm9kZSBpZiBwb3NzaWJsZS4gT3RoZXJ3aXNlIGB0aGlzYCBpcyByZXR1cm5lZC5cclxuXHQgKi9cclxuXHRnZXRTaGFyZWQoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgaGFzaCA9IHRoaXMuZ2V0SGFzaCggYnVpbGRlciApO1xyXG5cdFx0Y29uc3Qgbm9kZUZyb21IYXNoID0gYnVpbGRlci5nZXROb2RlRnJvbUhhc2goIGhhc2ggKTtcclxuXHJcblx0XHRyZXR1cm4gbm9kZUZyb21IYXNoIHx8IHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVwcmVzZW50cyB0aGUgc2V0dXAgc3RhZ2Ugd2hpY2ggaXMgdGhlIGZpcnN0IHN0ZXAgb2YgdGhlIGJ1aWxkIHByb2Nlc3MsIHNlZSB7QGxpbmsgTm9kZSNidWlsZH0gbWV0aG9kLlxyXG5cdCAqIFRoaXMgbWV0aG9kIGlzIG9mdGVuIG92ZXJ3cml0dGVuIGluIGRlcml2ZWQgbW9kdWxlcyB0byBwcmVwYXJlIHRoZSBub2RlIHdoaWNoIGlzIHVzZWQgYXMgdGhlIG91dHB1dC9yZXN1bHQuXHJcblx0ICogVGhlIG91dHB1dCBub2RlIG11c3QgYmUgcmV0dXJuZWQgaW4gdGhlIGByZXR1cm5gIHN0YXRlbWVudC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7P05vZGV9IFRoZSBvdXRwdXQgbm9kZS5cclxuXHQgKi9cclxuXHRzZXR1cCggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCBub2RlUHJvcGVydGllcyA9IGJ1aWxkZXIuZ2V0Tm9kZVByb3BlcnRpZXMoIHRoaXMgKTtcclxuXHJcblx0XHRsZXQgaW5kZXggPSAwO1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IGNoaWxkTm9kZSBvZiB0aGlzLmdldENoaWxkcmVuKCkgKSB7XHJcblxyXG5cdFx0XHRub2RlUHJvcGVydGllc1sgJ25vZGUnICsgaW5kZXggKysgXSA9IGNoaWxkTm9kZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gcmV0dXJuIGEgb3V0cHV0Tm9kZSBpZiBleGlzdHMgb3IgbnVsbFxyXG5cclxuXHRcdHJldHVybiBub2RlUHJvcGVydGllcy5vdXRwdXROb2RlIHx8IG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVwcmVzZW50cyB0aGUgYW5hbHl6ZSBzdGFnZSB3aGljaCBpcyB0aGUgc2Vjb25kIHN0ZXAgb2YgdGhlIGJ1aWxkIHByb2Nlc3MsIHNlZSB7QGxpbmsgTm9kZSNidWlsZH0gbWV0aG9kLlxyXG5cdCAqIFRoaXMgc3RhZ2UgYW5hbHl6ZXMgdGhlIG5vZGUgaGllcmFyY2h5IGFuZCBlbnN1cmVzIGRlc2NlbmRlbnQgbm9kZXMgYXJlIGJ1aWx0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKi9cclxuXHRhbmFseXplKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IHVzYWdlQ291bnQgPSBidWlsZGVyLmluY3JlYXNlVXNhZ2UoIHRoaXMgKTtcclxuXHJcblx0XHRpZiAoIHVzYWdlQ291bnQgPT09IDEgKSB7XHJcblxyXG5cdFx0XHQvLyBub2RlIGZsb3cgY2hpbGRyZW5cclxuXHJcblx0XHRcdGNvbnN0IG5vZGVQcm9wZXJ0aWVzID0gYnVpbGRlci5nZXROb2RlUHJvcGVydGllcyggdGhpcyApO1xyXG5cclxuXHRcdFx0Zm9yICggY29uc3QgY2hpbGROb2RlIG9mIE9iamVjdC52YWx1ZXMoIG5vZGVQcm9wZXJ0aWVzICkgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggY2hpbGROb2RlICYmIGNoaWxkTm9kZS5pc05vZGUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y2hpbGROb2RlLmJ1aWxkKCBidWlsZGVyICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVwcmVzZW50cyB0aGUgZ2VuZXJhdGUgc3RhZ2Ugd2hpY2ggaXMgdGhlIHRoaXJkIHN0ZXAgb2YgdGhlIGJ1aWxkIHByb2Nlc3MsIHNlZSB7QGxpbmsgTm9kZSNidWlsZH0gbWV0aG9kLlxyXG5cdCAqIFRoaXMgc3RhdGUgYnVpbGRzIHRoZSBvdXRwdXQgbm9kZSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0aW5nIHNoYWRlciBzdHJpbmcuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEBwYXJhbSB7P3N0cmluZ30gb3V0cHV0IC0gQ2FuIGJlIHVzZWQgdG8gZGVmaW5lIHRoZSBvdXRwdXQgdHlwZS5cclxuXHQgKiBAcmV0dXJuIHs/c3RyaW5nfSBUaGUgZ2VuZXJhdGVkIHNoYWRlciBzdHJpbmcuXHJcblx0ICovXHJcblx0Z2VuZXJhdGUoIGJ1aWxkZXIsIG91dHB1dCApIHtcclxuXHJcblx0XHRjb25zdCB7IG91dHB1dE5vZGUgfSA9IGJ1aWxkZXIuZ2V0Tm9kZVByb3BlcnRpZXMoIHRoaXMgKTtcclxuXHJcblx0XHRpZiAoIG91dHB1dE5vZGUgJiYgb3V0cHV0Tm9kZS5pc05vZGUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gb3V0cHV0Tm9kZS5idWlsZCggYnVpbGRlciwgb3V0cHV0ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBtZXRob2QgY2FuIGJlIGltcGxlbWVudGVkIHRvIHVwZGF0ZSB0aGUgbm9kZSdzIGludGVybmFsIHN0YXRlIGJlZm9yZSBpdCBpcyB1c2VkIHRvIHJlbmRlciBhbiBvYmplY3QuXHJcblx0ICogVGhlIHtAbGluayBOb2RlI3VwZGF0ZUJlZm9yZVR5cGV9IHByb3BlcnR5IGRlZmluZXMgaG93IG9mdGVuIHRoZSB1cGRhdGUgaXMgZXhlY3V0ZWQuXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcGFyYW0ge05vZGVGcmFtZX0gZnJhbWUgLSBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBub2RlIGZyYW1lLlxyXG5cdCAqIEByZXR1cm4gez9ib29sZWFufSBBbiBvcHRpb25hbCBib29sIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGltcGxlbWVudGF0aW9uIGFjdHVhbGx5IHBlcmZvcm1lZCBhbiB1cGRhdGUgb3Igbm90IChlLmcuIGR1ZSB0byBjYWNoaW5nKS5cclxuXHQgKi9cclxuXHR1cGRhdGVCZWZvcmUoIC8qZnJhbWUqLyApIHtcclxuXHJcblx0XHRjb25zb2xlLndhcm4oICdBYnN0cmFjdCBmdW5jdGlvbi4nICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIG1ldGhvZCBjYW4gYmUgaW1wbGVtZW50ZWQgdG8gdXBkYXRlIHRoZSBub2RlJ3MgaW50ZXJuYWwgc3RhdGUgYWZ0ZXIgaXQgd2FzIHVzZWQgdG8gcmVuZGVyIGFuIG9iamVjdC5cclxuXHQgKiBUaGUge0BsaW5rIE5vZGUjdXBkYXRlQWZ0ZXJUeXBlfSBwcm9wZXJ0eSBkZWZpbmVzIGhvdyBvZnRlbiB0aGUgdXBkYXRlIGlzIGV4ZWN1dGVkLlxyXG5cdCAqXHJcblx0ICogQGFic3RyYWN0XHJcblx0ICogQHBhcmFtIHtOb2RlRnJhbWV9IGZyYW1lIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgbm9kZSBmcmFtZS5cclxuXHQgKiBAcmV0dXJuIHs/Ym9vbGVhbn0gQW4gb3B0aW9uYWwgYm9vbCB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBpbXBsZW1lbnRhdGlvbiBhY3R1YWxseSBwZXJmb3JtZWQgYW4gdXBkYXRlIG9yIG5vdCAoZS5nLiBkdWUgdG8gY2FjaGluZykuXHJcblx0ICovXHJcblx0dXBkYXRlQWZ0ZXIoIC8qZnJhbWUqLyApIHtcclxuXHJcblx0XHRjb25zb2xlLndhcm4oICdBYnN0cmFjdCBmdW5jdGlvbi4nICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIG1ldGhvZCBjYW4gYmUgaW1wbGVtZW50ZWQgdG8gdXBkYXRlIHRoZSBub2RlJ3MgaW50ZXJuYWwgc3RhdGUgd2hlbiBpdCBpcyB1c2VkIHRvIHJlbmRlciBhbiBvYmplY3QuXHJcblx0ICogVGhlIHtAbGluayBOb2RlI3VwZGF0ZVR5cGV9IHByb3BlcnR5IGRlZmluZXMgaG93IG9mdGVuIHRoZSB1cGRhdGUgaXMgZXhlY3V0ZWQuXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcGFyYW0ge05vZGVGcmFtZX0gZnJhbWUgLSBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBub2RlIGZyYW1lLlxyXG5cdCAqIEByZXR1cm4gez9ib29sZWFufSBBbiBvcHRpb25hbCBib29sIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGltcGxlbWVudGF0aW9uIGFjdHVhbGx5IHBlcmZvcm1lZCBhbiB1cGRhdGUgb3Igbm90IChlLmcuIGR1ZSB0byBjYWNoaW5nKS5cclxuXHQgKi9cclxuXHR1cGRhdGUoIC8qZnJhbWUqLyApIHtcclxuXHJcblx0XHRjb25zb2xlLndhcm4oICdBYnN0cmFjdCBmdW5jdGlvbi4nICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgcGVyZm9ybXMgdGhlIGJ1aWxkIG9mIGEgbm9kZS4gVGhlIGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGFzIHdlbGwgYXMgaXRzIHJldHVybiB2YWx1ZSBkZXBlbmRcclxuXHQgKiBvbiB0aGUgY3VycmVudCBidWlsZCBzdGFnZSAoc2V0dXAsIGFuYWx5emUgb3IgZ2VuZXJhdGUpLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcGFyYW0gez9zdHJpbmd9IG91dHB1dCAtIENhbiBiZSB1c2VkIHRvIGRlZmluZSB0aGUgb3V0cHV0IHR5cGUuXHJcblx0ICogQHJldHVybiB7P3N0cmluZ30gV2hlbiB0aGlzIG1ldGhvZCBpcyBleGVjdXRlZCBpbiB0aGUgc2V0dXAgb3IgYW5hbHl6ZSBzdGFnZSwgYG51bGxgIGlzIHJldHVybmVkLiBJbiB0aGUgZ2VuZXJhdGUgc3RhZ2UsIHRoZSBnZW5lcmF0ZWQgc2hhZGVyIHN0cmluZy5cclxuXHQgKi9cclxuXHRidWlsZCggYnVpbGRlciwgb3V0cHV0ID0gbnVsbCApIHtcclxuXHJcblx0XHRjb25zdCByZWZOb2RlID0gdGhpcy5nZXRTaGFyZWQoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRpZiAoIHRoaXMgIT09IHJlZk5vZGUgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gcmVmTm9kZS5idWlsZCggYnVpbGRlciwgb3V0cHV0ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGJ1aWxkZXIuYWRkTm9kZSggdGhpcyApO1xyXG5cdFx0YnVpbGRlci5hZGRDaGFpbiggdGhpcyApO1xyXG5cclxuXHRcdC8qIEJ1aWxkIHN0YWdlcyBleHBlY3RlZCByZXN1bHRzOlxyXG5cdFx0XHQtIFwic2V0dXBcIlx0XHQtPiBOb2RlXHJcblx0XHRcdC0gXCJhbmFseXplXCJcdFx0LT4gbnVsbFxyXG5cdFx0XHQtIFwiZ2VuZXJhdGVcIlx0LT4gU3RyaW5nXHJcblx0XHQqL1xyXG5cdFx0bGV0IHJlc3VsdCA9IG51bGw7XHJcblxyXG5cdFx0Y29uc3QgYnVpbGRTdGFnZSA9IGJ1aWxkZXIuZ2V0QnVpbGRTdGFnZSgpO1xyXG5cclxuXHRcdGlmICggYnVpbGRTdGFnZSA9PT0gJ3NldHVwJyApIHtcclxuXHJcblx0XHRcdHRoaXMudXBkYXRlUmVmZXJlbmNlKCBidWlsZGVyICk7XHJcblxyXG5cdFx0XHRjb25zdCBwcm9wZXJ0aWVzID0gYnVpbGRlci5nZXROb2RlUHJvcGVydGllcyggdGhpcyApO1xyXG5cclxuXHRcdFx0aWYgKCBwcm9wZXJ0aWVzLmluaXRpYWxpemVkICE9PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHQvL2NvbnN0IHN0YWNrTm9kZXNCZWZvcmVTZXR1cCA9IGJ1aWxkZXIuc3RhY2subm9kZXMubGVuZ3RoO1xyXG5cclxuXHRcdFx0XHRwcm9wZXJ0aWVzLmluaXRpYWxpemVkID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0Y29uc3Qgb3V0cHV0Tm9kZSA9IHRoaXMuc2V0dXAoIGJ1aWxkZXIgKTsgLy8gcmV0dXJuIGEgbm9kZSBvciBudWxsXHJcblx0XHRcdFx0Y29uc3QgaXNOb2RlT3V0cHV0ID0gb3V0cHV0Tm9kZSAmJiBvdXRwdXROb2RlLmlzTm9kZSA9PT0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0LyppZiAoIGlzTm9kZU91dHB1dCAmJiBidWlsZGVyLnN0YWNrLm5vZGVzLmxlbmd0aCAhPT0gc3RhY2tOb2Rlc0JlZm9yZVNldHVwICkge1xyXG5cclxuXHRcdFx0XHRcdC8vICEhIG5vIG91dHB1dE5vZGUgISFcclxuXHRcdFx0XHRcdC8vb3V0cHV0Tm9kZSA9IGJ1aWxkZXIuc3RhY2s7XHJcblxyXG5cdFx0XHRcdH0qL1xyXG5cclxuXHRcdFx0XHRmb3IgKCBjb25zdCBjaGlsZE5vZGUgb2YgT2JqZWN0LnZhbHVlcyggcHJvcGVydGllcyApICkge1xyXG5cclxuXHRcdFx0XHRcdGlmICggY2hpbGROb2RlICYmIGNoaWxkTm9kZS5pc05vZGUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjaGlsZE5vZGUuYnVpbGQoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKCBpc05vZGVPdXRwdXQgKSB7XHJcblxyXG5cdFx0XHRcdFx0b3V0cHV0Tm9kZS5idWlsZCggYnVpbGRlciApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHByb3BlcnRpZXMub3V0cHV0Tm9kZSA9IG91dHB1dE5vZGU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmICggYnVpbGRTdGFnZSA9PT0gJ2FuYWx5emUnICkge1xyXG5cclxuXHRcdFx0dGhpcy5hbmFseXplKCBidWlsZGVyICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggYnVpbGRTdGFnZSA9PT0gJ2dlbmVyYXRlJyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGlzR2VuZXJhdGVPbmNlID0gdGhpcy5nZW5lcmF0ZS5sZW5ndGggPT09IDE7XHJcblxyXG5cdFx0XHRpZiAoIGlzR2VuZXJhdGVPbmNlICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB0eXBlID0gdGhpcy5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cdFx0XHRcdGNvbnN0IG5vZGVEYXRhID0gYnVpbGRlci5nZXREYXRhRnJvbU5vZGUoIHRoaXMgKTtcclxuXHJcblx0XHRcdFx0cmVzdWx0ID0gbm9kZURhdGEuc25pcHBldDtcclxuXHJcblx0XHRcdFx0aWYgKCByZXN1bHQgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIG5vZGVEYXRhLmdlbmVyYXRlZCA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdFx0bm9kZURhdGEuZ2VuZXJhdGVkID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0XHRcdHJlc3VsdCA9IHRoaXMuZ2VuZXJhdGUoIGJ1aWxkZXIgKSB8fCAnJztcclxuXHJcblx0XHRcdFx0XHRcdG5vZGVEYXRhLnNuaXBwZXQgPSByZXN1bHQ7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk5vZGU6IFJlY3Vyc2lvbiBkZXRlY3RlZC4nLCB0aGlzICk7XHJcblxyXG5cdFx0XHRcdFx0XHRyZXN1bHQgPSAnJztcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIG5vZGVEYXRhLmZsb3dDb2RlcyAhPT0gdW5kZWZpbmVkICYmIGJ1aWxkZXIuY29udGV4dC5ub2RlQmxvY2sgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRidWlsZGVyLmFkZEZsb3dDb2RlSGllcmFyY2h5KCB0aGlzLCBidWlsZGVyLmNvbnRleHQubm9kZUJsb2NrICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0cmVzdWx0ID0gYnVpbGRlci5mb3JtYXQoIHJlc3VsdCwgdHlwZSwgb3V0cHV0ICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRyZXN1bHQgPSB0aGlzLmdlbmVyYXRlKCBidWlsZGVyLCBvdXRwdXQgKSB8fCAnJztcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0YnVpbGRlci5yZW1vdmVDaGFpbiggdGhpcyApO1xyXG5cdFx0YnVpbGRlci5hZGRTZXF1ZW50aWFsTm9kZSggdGhpcyApO1xyXG5cclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgY2hpbGQgbm9kZXMgYXMgYSBKU09OIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0FycmF5PE9iamVjdD59IEFuIGl0ZXJhYmxlIGxpc3Qgb2Ygc2VyaWFsaXplZCBjaGlsZCBvYmplY3RzIGFzIEpTT04uXHJcblx0ICovXHJcblx0Z2V0U2VyaWFsaXplQ2hpbGRyZW4oKSB7XHJcblxyXG5cdFx0cmV0dXJuIGdldE5vZGVDaGlsZHJlbiggdGhpcyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNlcmlhbGl6ZXMgdGhlIG5vZGUgdG8gSlNPTi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBqc29uIC0gVGhlIG91dHB1dCBKU09OIG9iamVjdC5cclxuXHQgKi9cclxuXHRzZXJpYWxpemUoIGpzb24gKSB7XHJcblxyXG5cdFx0Y29uc3Qgbm9kZUNoaWxkcmVuID0gdGhpcy5nZXRTZXJpYWxpemVDaGlsZHJlbigpO1xyXG5cclxuXHRcdGNvbnN0IGlucHV0Tm9kZXMgPSB7fTtcclxuXHJcblx0XHRmb3IgKCBjb25zdCB7IHByb3BlcnR5LCBpbmRleCwgY2hpbGROb2RlIH0gb2Ygbm9kZUNoaWxkcmVuICkge1xyXG5cclxuXHRcdFx0aWYgKCBpbmRleCAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIGlucHV0Tm9kZXNbIHByb3BlcnR5IF0gPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRpbnB1dE5vZGVzWyBwcm9wZXJ0eSBdID0gTnVtYmVyLmlzSW50ZWdlciggaW5kZXggKSA/IFtdIDoge307XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aW5wdXROb2Rlc1sgcHJvcGVydHkgXVsgaW5kZXggXSA9IGNoaWxkTm9kZS50b0pTT04oIGpzb24ubWV0YSApLnV1aWQ7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRpbnB1dE5vZGVzWyBwcm9wZXJ0eSBdID0gY2hpbGROb2RlLnRvSlNPTigganNvbi5tZXRhICkudXVpZDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBPYmplY3Qua2V5cyggaW5wdXROb2RlcyApLmxlbmd0aCA+IDAgKSB7XHJcblxyXG5cdFx0XHRqc29uLmlucHV0Tm9kZXMgPSBpbnB1dE5vZGVzO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZXNlcmlhbGl6ZXMgdGhlIG5vZGUgZnJvbSB0aGUgZ2l2ZW4gSlNPTi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBqc29uIC0gVGhlIEpTT04gb2JqZWN0LlxyXG5cdCAqL1xyXG5cdGRlc2VyaWFsaXplKCBqc29uICkge1xyXG5cclxuXHRcdGlmICgganNvbi5pbnB1dE5vZGVzICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBub2RlcyA9IGpzb24ubWV0YS5ub2RlcztcclxuXHJcblx0XHRcdGZvciAoIGNvbnN0IHByb3BlcnR5IGluIGpzb24uaW5wdXROb2RlcyApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBqc29uLmlucHV0Tm9kZXNbIHByb3BlcnR5IF0gKSApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBpbnB1dEFycmF5ID0gW107XHJcblxyXG5cdFx0XHRcdFx0Zm9yICggY29uc3QgdXVpZCBvZiBqc29uLmlucHV0Tm9kZXNbIHByb3BlcnR5IF0gKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRpbnB1dEFycmF5LnB1c2goIG5vZGVzWyB1dWlkIF0gKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0dGhpc1sgcHJvcGVydHkgXSA9IGlucHV0QXJyYXk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIHR5cGVvZiBqc29uLmlucHV0Tm9kZXNbIHByb3BlcnR5IF0gPT09ICdvYmplY3QnICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGlucHV0T2JqZWN0ID0ge307XHJcblxyXG5cdFx0XHRcdFx0Zm9yICggY29uc3Qgc3ViUHJvcGVydHkgaW4ganNvbi5pbnB1dE5vZGVzWyBwcm9wZXJ0eSBdICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgdXVpZCA9IGpzb24uaW5wdXROb2Rlc1sgcHJvcGVydHkgXVsgc3ViUHJvcGVydHkgXTtcclxuXHJcblx0XHRcdFx0XHRcdGlucHV0T2JqZWN0WyBzdWJQcm9wZXJ0eSBdID0gbm9kZXNbIHV1aWQgXTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0dGhpc1sgcHJvcGVydHkgXSA9IGlucHV0T2JqZWN0O1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHV1aWQgPSBqc29uLmlucHV0Tm9kZXNbIHByb3BlcnR5IF07XHJcblxyXG5cdFx0XHRcdFx0dGhpc1sgcHJvcGVydHkgXSA9IG5vZGVzWyB1dWlkIF07XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2VyaWFsaXplcyB0aGUgbm9kZSBpbnRvIHRoZSB0aHJlZS5qcyBKU09OIE9iamVjdC9TY2VuZSBmb3JtYXQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gez9PYmplY3R9IG1ldGEgLSBBbiBvcHRpb25hbCBKU09OIG9iamVjdCB0aGF0IGFscmVhZHkgaG9sZHMgc2VyaWFsaXplZCBkYXRhIGZyb20gb3RoZXIgc2NlbmUgb2JqZWN0cy5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBzZXJpYWxpemVkIG5vZGUuXHJcblx0ICovXHJcblx0dG9KU09OKCBtZXRhICkge1xyXG5cclxuXHRcdGNvbnN0IHsgdXVpZCwgdHlwZSB9ID0gdGhpcztcclxuXHRcdGNvbnN0IGlzUm9vdCA9ICggbWV0YSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBtZXRhID09PSAnc3RyaW5nJyApO1xyXG5cclxuXHRcdGlmICggaXNSb290ICkge1xyXG5cclxuXHRcdFx0bWV0YSA9IHtcclxuXHRcdFx0XHR0ZXh0dXJlczoge30sXHJcblx0XHRcdFx0aW1hZ2VzOiB7fSxcclxuXHRcdFx0XHRub2Rlczoge31cclxuXHRcdFx0fTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gc2VyaWFsaXplXHJcblxyXG5cdFx0bGV0IGRhdGEgPSBtZXRhLm5vZGVzWyB1dWlkIF07XHJcblxyXG5cdFx0aWYgKCBkYXRhID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRkYXRhID0ge1xyXG5cdFx0XHRcdHV1aWQsXHJcblx0XHRcdFx0dHlwZSxcclxuXHRcdFx0XHRtZXRhLFxyXG5cdFx0XHRcdG1ldGFkYXRhOiB7XHJcblx0XHRcdFx0XHR2ZXJzaW9uOiA0LjYsXHJcblx0XHRcdFx0XHR0eXBlOiAnTm9kZScsXHJcblx0XHRcdFx0XHRnZW5lcmF0b3I6ICdOb2RlLnRvSlNPTidcclxuXHRcdFx0XHR9XHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHRpZiAoIGlzUm9vdCAhPT0gdHJ1ZSApIG1ldGEubm9kZXNbIGRhdGEudXVpZCBdID0gZGF0YTtcclxuXHJcblx0XHRcdHRoaXMuc2VyaWFsaXplKCBkYXRhICk7XHJcblxyXG5cdFx0XHRkZWxldGUgZGF0YS5tZXRhO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBUT0RPOiBDb3BpZWQgZnJvbSBPYmplY3QzRC50b0pTT05cclxuXHJcblx0XHRmdW5jdGlvbiBleHRyYWN0RnJvbUNhY2hlKCBjYWNoZSApIHtcclxuXHJcblx0XHRcdGNvbnN0IHZhbHVlcyA9IFtdO1xyXG5cclxuXHRcdFx0Zm9yICggY29uc3Qga2V5IGluIGNhY2hlICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBkYXRhID0gY2FjaGVbIGtleSBdO1xyXG5cdFx0XHRcdGRlbGV0ZSBkYXRhLm1ldGFkYXRhO1xyXG5cdFx0XHRcdHZhbHVlcy5wdXNoKCBkYXRhICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gdmFsdWVzO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGlzUm9vdCApIHtcclxuXHJcblx0XHRcdGNvbnN0IHRleHR1cmVzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS50ZXh0dXJlcyApO1xyXG5cdFx0XHRjb25zdCBpbWFnZXMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLmltYWdlcyApO1xyXG5cdFx0XHRjb25zdCBub2RlcyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEubm9kZXMgKTtcclxuXHJcblx0XHRcdGlmICggdGV4dHVyZXMubGVuZ3RoID4gMCApIGRhdGEudGV4dHVyZXMgPSB0ZXh0dXJlcztcclxuXHRcdFx0aWYgKCBpbWFnZXMubGVuZ3RoID4gMCApIGRhdGEuaW1hZ2VzID0gaW1hZ2VzO1xyXG5cdFx0XHRpZiAoIG5vZGVzLmxlbmd0aCA+IDAgKSBkYXRhLm5vZGVzID0gbm9kZXM7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBkYXRhO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBOb2RlO1xyXG4iLCJpbXBvcnQgTm9kZSBmcm9tICcuLi9jb3JlL05vZGUuanMnO1xyXG5cclxuLyoqXHJcbiAqIEJhc2UgY2xhc3MgZm9yIHJlcHJlc2VudGluZyBlbGVtZW50IGFjY2VzcyBvbiBhbiBhcnJheS1saWtlXHJcbiAqIG5vZGUgZGF0YSBzdHJ1Y3R1cmVzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTm9kZVxyXG4gKi9cclxuY2xhc3MgQXJyYXlFbGVtZW50Tm9kZSBleHRlbmRzIE5vZGUgeyAvLyBAVE9ETzogSWYgZXh0ZW5kaW5nIGZyb20gVGVtcE5vZGUgaXQgYnJlYWtzIHdlYmdwdV9jb21wdXRlXHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ0FycmF5RWxlbWVudE5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYW4gYXJyYXkgZWxlbWVudCBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIGFycmF5LWxpa2Ugbm9kZS5cclxuXHQgKiBAcGFyYW0ge05vZGV9IGluZGV4Tm9kZSAtIFRoZSBpbmRleCBub2RlIHRoYXQgZGVmaW5lcyB0aGUgZWxlbWVudCBhY2Nlc3MuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5vZGUsIGluZGV4Tm9kZSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGFycmF5LWxpa2Ugbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub2RlID0gbm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBpbmRleCBub2RlIHRoYXQgZGVmaW5lcyB0aGUgZWxlbWVudCBhY2Nlc3MuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaW5kZXhOb2RlID0gaW5kZXhOb2RlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0FycmF5RWxlbWVudE5vZGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGlzIG92ZXJ3cml0dGVuIHNpbmNlIHRoZSBub2RlIHR5cGUgaXMgaW5mZXJyZWQgZnJvbSB0aGUgYXJyYXktbGlrZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBub2RlIHR5cGUuXHJcblx0ICovXHJcblx0Z2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubm9kZS5nZXRFbGVtZW50VHlwZSggYnVpbGRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdGdlbmVyYXRlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IGluZGV4VHlwZSA9IHRoaXMuaW5kZXhOb2RlLmdldE5vZGVUeXBlKCBidWlsZGVyICk7XHJcblxyXG5cdFx0Y29uc3Qgbm9kZVNuaXBwZXQgPSB0aGlzLm5vZGUuYnVpbGQoIGJ1aWxkZXIgKTtcclxuXHRcdGNvbnN0IGluZGV4U25pcHBldCA9IHRoaXMuaW5kZXhOb2RlLmJ1aWxkKCBidWlsZGVyLCAhIGJ1aWxkZXIuaXNWZWN0b3IoIGluZGV4VHlwZSApICYmIGJ1aWxkZXIuaXNJbnRlZ2VyKCBpbmRleFR5cGUgKSA/IGluZGV4VHlwZSA6ICd1aW50JyApO1xyXG5cclxuXHRcdHJldHVybiBgJHsgbm9kZVNuaXBwZXQgfVsgJHsgaW5kZXhTbmlwcGV0IH0gXWA7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEFycmF5RWxlbWVudE5vZGU7XHJcbiIsImltcG9ydCBOb2RlIGZyb20gJy4uL2NvcmUvTm9kZS5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBtb2R1bGUgaXMgcGFydCBvZiB0aGUgVFNMIGNvcmUgYW5kIHVzdWFsbHkgbm90IHVzZWQgaW4gYXBwIGxldmVsIGNvZGUuXHJcbiAqIEl0IHJlcHJlc2VudHMgYSBjb252ZXJ0IG9wZXJhdGlvbiBkdXJpbmcgdGhlIHNoYWRlciBnZW5lcmF0aW9uIHByb2Nlc3NcclxuICogbWVhbmluZyBpdCBjb252ZXJ0cyB0aGUgZGF0YSB0eXBlIG9mIGEgbm9kZSB0byBhIHRhcmdldCBkYXRhIHR5cGUuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBOb2RlXHJcbiAqL1xyXG5jbGFzcyBDb252ZXJ0Tm9kZSBleHRlbmRzIE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdDb252ZXJ0Tm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBjb252ZXJ0IG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBUaGUgbm9kZSB3aGljaCB0eXBlIHNob3VsZCBiZSBjb252ZXJ0ZWQuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGNvbnZlcnRUbyAtIFRoZSB0YXJnZXQgbm9kZSB0eXBlLiBNdWx0aXBsZSB0eXBlcyBjYW4gYmUgZGVmaW5lZCBieSBzZXBhcmF0aW5nIHRoZW0gd2l0aCBhIGB8YCBzaWduLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBub2RlLCBjb252ZXJ0VG8gKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBub2RlIHdoaWNoIHR5cGUgc2hvdWxkIGJlIGNvbnZlcnRlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub2RlID0gbm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB0YXJnZXQgbm9kZSB0eXBlLiBNdWx0aXBsZSB0eXBlcyBjYW4gYmUgZGVmaW5lZCBieSBzZXBhcmF0aW5nIHRoZW0gd2l0aCBhIGB8YCBzaWduLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29udmVydFRvID0gY29udmVydFRvO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGlzIG92ZXJ3cml0dGVuIHNpbmNlIHRoZSBpbXBsZW1lbnRhdGlvbiB0cmllcyB0byBpbmZlciB0aGUgYmVzdFxyXG5cdCAqIG1hdGNoaW5nIHR5cGUgZnJvbSB0aGUge0BsaW5rIENvbnZlcnROb2RlI2NvbnZlcnRUb30gcHJvcGVydHkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG5vZGUgdHlwZS5cclxuXHQgKi9cclxuXHRnZXROb2RlVHlwZSggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCByZXF1ZXN0VHlwZSA9IHRoaXMubm9kZS5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cclxuXHRcdGxldCBjb252ZXJ0VG8gPSBudWxsO1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IG92ZXJsb2FkaW5nVHlwZSBvZiB0aGlzLmNvbnZlcnRUby5zcGxpdCggJ3wnICkgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGNvbnZlcnRUbyA9PT0gbnVsbCB8fCBidWlsZGVyLmdldFR5cGVMZW5ndGgoIHJlcXVlc3RUeXBlICkgPT09IGJ1aWxkZXIuZ2V0VHlwZUxlbmd0aCggb3ZlcmxvYWRpbmdUeXBlICkgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnZlcnRUbyA9IG92ZXJsb2FkaW5nVHlwZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGNvbnZlcnRUbztcclxuXHJcblx0fVxyXG5cclxuXHRzZXJpYWxpemUoIGRhdGEgKSB7XHJcblxyXG5cdFx0c3VwZXIuc2VyaWFsaXplKCBkYXRhICk7XHJcblxyXG5cdFx0ZGF0YS5jb252ZXJ0VG8gPSB0aGlzLmNvbnZlcnRUbztcclxuXHJcblx0fVxyXG5cclxuXHRkZXNlcmlhbGl6ZSggZGF0YSApIHtcclxuXHJcblx0XHRzdXBlci5kZXNlcmlhbGl6ZSggZGF0YSApO1xyXG5cclxuXHRcdHRoaXMuY29udmVydFRvID0gZGF0YS5jb252ZXJ0VG87XHJcblxyXG5cdH1cclxuXHJcblx0Z2VuZXJhdGUoIGJ1aWxkZXIsIG91dHB1dCApIHtcclxuXHJcblx0XHRjb25zdCBub2RlID0gdGhpcy5ub2RlO1xyXG5cdFx0Y29uc3QgdHlwZSA9IHRoaXMuZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRjb25zdCBzbmlwcGV0ID0gbm9kZS5idWlsZCggYnVpbGRlciwgdHlwZSApO1xyXG5cclxuXHRcdHJldHVybiBidWlsZGVyLmZvcm1hdCggc25pcHBldCwgdHlwZSwgb3V0cHV0ICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IENvbnZlcnROb2RlO1xyXG4iLCJpbXBvcnQgTm9kZSBmcm9tICcuL05vZGUuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgbW9kdWxlIHVzZXMgY2FjaGUgbWFuYWdlbWVudCB0byBjcmVhdGUgdGVtcG9yYXJ5IHZhcmlhYmxlc1xyXG4gKiBpZiB0aGUgbm9kZSBpcyB1c2VkIG1vcmUgdGhhbiBvbmNlIHRvIHByZXZlbnQgZHVwbGljYXRlIGNhbGN1bGF0aW9ucy5cclxuICpcclxuICogVGhlIGNsYXNzIGFjdHMgYXMgYSBiYXNlIGNsYXNzIGZvciBtYW55IG90aGVyIG5vZGVzIHR5cGVzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTm9kZVxyXG4gKi9cclxuY2xhc3MgVGVtcE5vZGUgZXh0ZW5kcyBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnVGVtcE5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSB0ZW1wIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gez9zdHJpbmd9IG5vZGVUeXBlIC0gVGhlIG5vZGUgdHlwZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggbm9kZVR5cGUgPSBudWxsICkge1xyXG5cclxuXHRcdHN1cGVyKCBub2RlVHlwZSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1RlbXBOb2RlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBXaGV0aGVyIHRoaXMgbm9kZSBpcyB1c2VkIG1vcmUgdGhhbiBvbmNlIGluIGNvbnRleHQgb2Ygb3RoZXIgbm9kZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBBIGZsYWcgdGhhdCBpbmRpY2F0ZXMgaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBkZXBlbmRlbmN5IHRvIG90aGVyIG5vZGVzLlxyXG5cdCAqL1xyXG5cdGhhc0RlcGVuZGVuY2llcyggYnVpbGRlciApIHtcclxuXHJcblx0XHRyZXR1cm4gYnVpbGRlci5nZXREYXRhRnJvbU5vZGUoIHRoaXMgKS51c2FnZUNvdW50ID4gMTtcclxuXHJcblx0fVxyXG5cclxuXHRidWlsZCggYnVpbGRlciwgb3V0cHV0ICkge1xyXG5cclxuXHRcdGNvbnN0IGJ1aWxkU3RhZ2UgPSBidWlsZGVyLmdldEJ1aWxkU3RhZ2UoKTtcclxuXHJcblx0XHRpZiAoIGJ1aWxkU3RhZ2UgPT09ICdnZW5lcmF0ZScgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB0eXBlID0gYnVpbGRlci5nZXRWZWN0b3JUeXBlKCB0aGlzLmdldE5vZGVUeXBlKCBidWlsZGVyLCBvdXRwdXQgKSApO1xyXG5cdFx0XHRjb25zdCBub2RlRGF0YSA9IGJ1aWxkZXIuZ2V0RGF0YUZyb21Ob2RlKCB0aGlzICk7XHJcblxyXG5cdFx0XHRpZiAoIG5vZGVEYXRhLnByb3BlcnR5TmFtZSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gYnVpbGRlci5mb3JtYXQoIG5vZGVEYXRhLnByb3BlcnR5TmFtZSwgdHlwZSwgb3V0cHV0ICk7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCB0eXBlICE9PSAndm9pZCcgJiYgb3V0cHV0ICE9PSAndm9pZCcgJiYgdGhpcy5oYXNEZXBlbmRlbmNpZXMoIGJ1aWxkZXIgKSApIHtcclxuXHJcblx0XHRcdFx0Y29uc3Qgc25pcHBldCA9IHN1cGVyLmJ1aWxkKCBidWlsZGVyLCB0eXBlICk7XHJcblxyXG5cdFx0XHRcdGNvbnN0IG5vZGVWYXIgPSBidWlsZGVyLmdldFZhckZyb21Ob2RlKCB0aGlzLCBudWxsLCB0eXBlICk7XHJcblx0XHRcdFx0Y29uc3QgcHJvcGVydHlOYW1lID0gYnVpbGRlci5nZXRQcm9wZXJ0eU5hbWUoIG5vZGVWYXIgKTtcclxuXHJcblx0XHRcdFx0YnVpbGRlci5hZGRMaW5lRmxvd0NvZGUoIGAkeyBwcm9wZXJ0eU5hbWUgfSA9ICR7IHNuaXBwZXQgfWAsIHRoaXMgKTtcclxuXHJcblx0XHRcdFx0bm9kZURhdGEuc25pcHBldCA9IHNuaXBwZXQ7XHJcblx0XHRcdFx0bm9kZURhdGEucHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lO1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gYnVpbGRlci5mb3JtYXQoIG5vZGVEYXRhLnByb3BlcnR5TmFtZSwgdHlwZSwgb3V0cHV0ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBzdXBlci5idWlsZCggYnVpbGRlciwgb3V0cHV0ICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFRlbXBOb2RlO1xyXG4iLCJpbXBvcnQgVGVtcE5vZGUgZnJvbSAnLi4vY29yZS9UZW1wTm9kZS5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBtb2R1bGUgaXMgcGFydCBvZiB0aGUgVFNMIGNvcmUgYW5kIHVzdWFsbHkgbm90IHVzZWQgaW4gYXBwIGxldmVsIGNvZGUuXHJcbiAqIEl0IHJlcHJlc2VudHMgYSBqb2luIG9wZXJhdGlvbiBkdXJpbmcgdGhlIHNoYWRlciBnZW5lcmF0aW9uIHByb2Nlc3MuXHJcbiAqIEZvciBleGFtcGxlIGluIGNhbiBjb21wb3NlL2pvaW4gdHdvIHNpbmdsZSBmbG9hdHMgaW50byBhIGB2ZWMyYCB0eXBlLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgVGVtcE5vZGVcclxuICovXHJcbmNsYXNzIEpvaW5Ob2RlIGV4dGVuZHMgVGVtcE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdKb2luTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBqb2luIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PE5vZGU+fSBub2RlcyAtIEFuIGFycmF5IG9mIG5vZGVzIHRoYXQgc2hvdWxkIGJlIGpvaW5lZC5cclxuXHQgKiBAcGFyYW0gez9zdHJpbmd9IFtub2RlVHlwZT1udWxsXSAtIFRoZSBub2RlIHR5cGUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5vZGVzID0gW10sIG5vZGVUeXBlID0gbnVsbCApIHtcclxuXHJcblx0XHRzdXBlciggbm9kZVR5cGUgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIGFycmF5IG9mIG5vZGVzIHRoYXQgc2hvdWxkIGJlIGpvaW5lZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8Tm9kZT59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9kZXMgPSBub2RlcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyBvdmVyd3JpdHRlbiBzaW5jZSB0aGUgbm9kZSB0eXBlIG11c3QgYmUgaW5mZXJyZWQgZnJvbSB0aGVcclxuXHQgKiBqb2luZWQgZGF0YSBsZW5ndGggaWYgbm90IGV4cGxpY2l0bHkgZGVmaW5lZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgbm9kZSB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldE5vZGVUeXBlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5ub2RlVHlwZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHJldHVybiBidWlsZGVyLmdldFZlY3RvclR5cGUoIHRoaXMubm9kZVR5cGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGJ1aWxkZXIuZ2V0VHlwZUZyb21MZW5ndGgoIHRoaXMubm9kZXMucmVkdWNlKCAoIGNvdW50LCBjdXIgKSA9PiBjb3VudCArIGJ1aWxkZXIuZ2V0VHlwZUxlbmd0aCggY3VyLmdldE5vZGVUeXBlKCBidWlsZGVyICkgKSwgMCApICk7XHJcblxyXG5cdH1cclxuXHJcblx0Z2VuZXJhdGUoIGJ1aWxkZXIsIG91dHB1dCApIHtcclxuXHJcblx0XHRjb25zdCB0eXBlID0gdGhpcy5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cdFx0Y29uc3QgbWF4TGVuZ3RoID0gYnVpbGRlci5nZXRUeXBlTGVuZ3RoKCB0eXBlICk7XHJcblxyXG5cdFx0Y29uc3Qgbm9kZXMgPSB0aGlzLm5vZGVzO1xyXG5cclxuXHRcdGNvbnN0IHByaW1pdGl2ZVR5cGUgPSBidWlsZGVyLmdldENvbXBvbmVudFR5cGUoIHR5cGUgKTtcclxuXHJcblx0XHRjb25zdCBzbmlwcGV0VmFsdWVzID0gW107XHJcblxyXG5cdFx0bGV0IGxlbmd0aCA9IDA7XHJcblxyXG5cdFx0Zm9yICggY29uc3QgaW5wdXQgb2Ygbm9kZXMgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGxlbmd0aCA+PSBtYXhMZW5ndGggKSB7XHJcblxyXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoIGBUSFJFRS5UU0w6IExlbmd0aCBvZiBwYXJhbWV0ZXJzIGV4Y2VlZHMgbWF4aW11bSBsZW5ndGggb2YgZnVuY3Rpb24gJyR7IHR5cGUgfSgpJyB0eXBlLmAgKTtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGxldCBpbnB1dFR5cGUgPSBpbnB1dC5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cdFx0XHRsZXQgaW5wdXRUeXBlTGVuZ3RoID0gYnVpbGRlci5nZXRUeXBlTGVuZ3RoKCBpbnB1dFR5cGUgKTtcclxuXHRcdFx0bGV0IGlucHV0U25pcHBldDtcclxuXHJcblx0XHRcdGlmICggbGVuZ3RoICsgaW5wdXRUeXBlTGVuZ3RoID4gbWF4TGVuZ3RoICkge1xyXG5cclxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCBgVEhSRUUuVFNMOiBMZW5ndGggb2YgJyR7IHR5cGUgfSgpJyBkYXRhIGV4Y2VlZHMgbWF4aW11bSBsZW5ndGggb2Ygb3V0cHV0IHR5cGUuYCApO1xyXG5cclxuXHRcdFx0XHRpbnB1dFR5cGVMZW5ndGggPSBtYXhMZW5ndGggLSBsZW5ndGg7XHJcblx0XHRcdFx0aW5wdXRUeXBlID0gYnVpbGRlci5nZXRUeXBlRnJvbUxlbmd0aCggaW5wdXRUeXBlTGVuZ3RoICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRsZW5ndGggKz0gaW5wdXRUeXBlTGVuZ3RoO1xyXG5cdFx0XHRpbnB1dFNuaXBwZXQgPSBpbnB1dC5idWlsZCggYnVpbGRlciwgaW5wdXRUeXBlICk7XHJcblxyXG5cdFx0XHRjb25zdCBpbnB1dFByaW1pdGl2ZVR5cGUgPSBidWlsZGVyLmdldENvbXBvbmVudFR5cGUoIGlucHV0VHlwZSApO1xyXG5cclxuXHRcdFx0aWYgKCBpbnB1dFByaW1pdGl2ZVR5cGUgIT09IHByaW1pdGl2ZVR5cGUgKSB7XHJcblxyXG5cdFx0XHRcdGlucHV0U25pcHBldCA9IGJ1aWxkZXIuZm9ybWF0KCBpbnB1dFNuaXBwZXQsIGlucHV0UHJpbWl0aXZlVHlwZSwgcHJpbWl0aXZlVHlwZSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0c25pcHBldFZhbHVlcy5wdXNoKCBpbnB1dFNuaXBwZXQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3Qgc25pcHBldCA9IGAkeyBidWlsZGVyLmdldFR5cGUoIHR5cGUgKSB9KCAkeyBzbmlwcGV0VmFsdWVzLmpvaW4oICcsICcgKSB9IClgO1xyXG5cclxuXHRcdHJldHVybiBidWlsZGVyLmZvcm1hdCggc25pcHBldCwgdHlwZSwgb3V0cHV0ICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEpvaW5Ob2RlO1xyXG4iLCJpbXBvcnQgTm9kZSBmcm9tICcuLi9jb3JlL05vZGUuanMnO1xyXG5pbXBvcnQgeyB2ZWN0b3JDb21wb25lbnRzIH0gZnJvbSAnLi4vY29yZS9jb25zdGFudHMuanMnO1xyXG5cclxuY29uc3QgX3N0cmluZ1ZlY3RvckNvbXBvbmVudHMgPSB2ZWN0b3JDb21wb25lbnRzLmpvaW4oICcnICk7XHJcblxyXG4vKipcclxuICogVGhpcyBtb2R1bGUgaXMgcGFydCBvZiB0aGUgVFNMIGNvcmUgYW5kIHVzdWFsbHkgbm90IHVzZWQgaW4gYXBwIGxldmVsIGNvZGUuXHJcbiAqIGBTcGxpdE5vZGVgIHJlcHJlc2VudHMgYSBwcm9wZXJ0eSBhY2Nlc3Mgb3BlcmF0aW9uIHdoaWNoIG1lYW5zIGl0IGlzXHJcbiAqIHVzZWQgdG8gaW1wbGVtZW50IGFueSBgLnh5endgLCBgLnJnYmFgIGFuZCBgc3RwcWAgdXNhZ2Ugb24gbm9kZSBvYmplY3RzLlxyXG4gKiBGb3IgZXhhbXBsZTpcclxuICogYGBganNcclxuICogY29uc3QgcmVkVmFsdWUgPSBjb2xvci5yO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVcclxuICovXHJcbmNsYXNzIFNwbGl0Tm9kZSBleHRlbmRzIE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdTcGxpdE5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc3BsaXQgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFRoZSBub2RlIHRoYXQgc2hvdWxkIGJlIGFjY2Vzc2VkLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbY29tcG9uZW50cz0neCddIC0gVGhlIGNvbXBvbmVudHMgdGhhdCBzaG91bGQgYmUgYWNjZXNzZWQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5vZGUsIGNvbXBvbmVudHMgPSAneCcgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBub2RlIHRoYXQgc2hvdWxkIGJlIGFjY2Vzc2VkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vZGUgPSBub2RlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNvbXBvbmVudHMgdGhhdCBzaG91bGQgYmUgYWNjZXNzZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb21wb25lbnRzID0gY29tcG9uZW50cztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNTcGxpdE5vZGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHZlY3RvciBsZW5ndGggd2hpY2ggaXMgY29tcHV0ZWQgYmFzZWQgb24gdGhlIHJlcXVlc3RlZCBjb21wb25lbnRzLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgdmVjdG9yIGxlbmd0aC5cclxuXHQgKi9cclxuXHRnZXRWZWN0b3JMZW5ndGgoKSB7XHJcblxyXG5cdFx0bGV0IHZlY3Rvckxlbmd0aCA9IHRoaXMuY29tcG9uZW50cy5sZW5ndGg7XHJcblxyXG5cdFx0Zm9yICggY29uc3QgYyBvZiB0aGlzLmNvbXBvbmVudHMgKSB7XHJcblxyXG5cdFx0XHR2ZWN0b3JMZW5ndGggPSBNYXRoLm1heCggdmVjdG9yQ29tcG9uZW50cy5pbmRleE9mKCBjICkgKyAxLCB2ZWN0b3JMZW5ndGggKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHZlY3Rvckxlbmd0aDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBjb21wb25lbnQgdHlwZSBvZiB0aGUgbm9kZSdzIHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGNvbXBvbmVudCB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldENvbXBvbmVudFR5cGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIGJ1aWxkZXIuZ2V0Q29tcG9uZW50VHlwZSggdGhpcy5ub2RlLmdldE5vZGVUeXBlKCBidWlsZGVyICkgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyBvdmVyd3JpdHRlbiBzaW5jZSB0aGUgbm9kZSB0eXBlIGlzIGluZmVycmVkIGZyb20gcmVxdWVzdGVkIGNvbXBvbmVudHMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG5vZGUgdHlwZS5cclxuXHQgKi9cclxuXHRnZXROb2RlVHlwZSggYnVpbGRlciApIHtcclxuXHJcblx0XHRyZXR1cm4gYnVpbGRlci5nZXRUeXBlRnJvbUxlbmd0aCggdGhpcy5jb21wb25lbnRzLmxlbmd0aCwgdGhpcy5nZXRDb21wb25lbnRUeXBlKCBidWlsZGVyICkgKTtcclxuXHJcblx0fVxyXG5cclxuXHRnZW5lcmF0ZSggYnVpbGRlciwgb3V0cHV0ICkge1xyXG5cclxuXHRcdGNvbnN0IG5vZGUgPSB0aGlzLm5vZGU7XHJcblx0XHRjb25zdCBub2RlVHlwZUxlbmd0aCA9IGJ1aWxkZXIuZ2V0VHlwZUxlbmd0aCggbm9kZS5nZXROb2RlVHlwZSggYnVpbGRlciApICk7XHJcblxyXG5cdFx0bGV0IHNuaXBwZXQgPSBudWxsO1xyXG5cclxuXHRcdGlmICggbm9kZVR5cGVMZW5ndGggPiAxICkge1xyXG5cclxuXHRcdFx0bGV0IHR5cGUgPSBudWxsO1xyXG5cclxuXHRcdFx0Y29uc3QgY29tcG9uZW50c0xlbmd0aCA9IHRoaXMuZ2V0VmVjdG9yTGVuZ3RoKCk7XHJcblxyXG5cdFx0XHRpZiAoIGNvbXBvbmVudHNMZW5ndGggPj0gbm9kZVR5cGVMZW5ndGggKSB7XHJcblxyXG5cdFx0XHRcdC8vIG5lZWRlZCBleHBhbmQgdGhlIGlucHV0IG5vZGVcclxuXHJcblx0XHRcdFx0dHlwZSA9IGJ1aWxkZXIuZ2V0VHlwZUZyb21MZW5ndGgoIHRoaXMuZ2V0VmVjdG9yTGVuZ3RoKCksIHRoaXMuZ2V0Q29tcG9uZW50VHlwZSggYnVpbGRlciApICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBub2RlU25pcHBldCA9IG5vZGUuYnVpbGQoIGJ1aWxkZXIsIHR5cGUgKTtcclxuXHJcblx0XHRcdGlmICggdGhpcy5jb21wb25lbnRzLmxlbmd0aCA9PT0gbm9kZVR5cGVMZW5ndGggJiYgdGhpcy5jb21wb25lbnRzID09PSBfc3RyaW5nVmVjdG9yQ29tcG9uZW50cy5zbGljZSggMCwgdGhpcy5jb21wb25lbnRzLmxlbmd0aCApICkge1xyXG5cclxuXHRcdFx0XHQvLyB1bm5lY2Vzc2FyeSBzd2l6emxlXHJcblxyXG5cdFx0XHRcdHNuaXBwZXQgPSBidWlsZGVyLmZvcm1hdCggbm9kZVNuaXBwZXQsIHR5cGUsIG91dHB1dCApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0c25pcHBldCA9IGJ1aWxkZXIuZm9ybWF0KCBgJHtub2RlU25pcHBldH0uJHt0aGlzLmNvbXBvbmVudHN9YCwgdGhpcy5nZXROb2RlVHlwZSggYnVpbGRlciApLCBvdXRwdXQgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Ly8gaWdub3JlIC5jb21wb25lbnRzIGlmIC5ub2RlIHJldHVybnMgZmxvYXQvaW50ZWdlclxyXG5cclxuXHRcdFx0c25pcHBldCA9IG5vZGUuYnVpbGQoIGJ1aWxkZXIsIG91dHB1dCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gc25pcHBldDtcclxuXHJcblx0fVxyXG5cclxuXHRzZXJpYWxpemUoIGRhdGEgKSB7XHJcblxyXG5cdFx0c3VwZXIuc2VyaWFsaXplKCBkYXRhICk7XHJcblxyXG5cdFx0ZGF0YS5jb21wb25lbnRzID0gdGhpcy5jb21wb25lbnRzO1xyXG5cclxuXHR9XHJcblxyXG5cdGRlc2VyaWFsaXplKCBkYXRhICkge1xyXG5cclxuXHRcdHN1cGVyLmRlc2VyaWFsaXplKCBkYXRhICk7XHJcblxyXG5cdFx0dGhpcy5jb21wb25lbnRzID0gZGF0YS5jb21wb25lbnRzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTcGxpdE5vZGU7XHJcbiIsImltcG9ydCBUZW1wTm9kZSBmcm9tICcuLi9jb3JlL1RlbXBOb2RlLmpzJztcclxuaW1wb3J0IHsgdmVjdG9yQ29tcG9uZW50cyB9IGZyb20gJy4uL2NvcmUvY29uc3RhbnRzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIG1vZHVsZSBpcyBwYXJ0IG9mIHRoZSBUU0wgY29yZSBhbmQgdXN1YWxseSBub3QgdXNlZCBpbiBhcHAgbGV2ZWwgY29kZS5cclxuICogYFNldE5vZGVgIHJlcHJlc2VudHMgYSBzZXQgb3BlcmF0aW9uIHdoaWNoIG1lYW5zIGl0IGlzIHVzZWQgdG8gaW1wbGVtZW50IGFueVxyXG4gKiBgc2V0WFlaVygpYCwgYHNldFJHQkEoKWAgYW5kIGBzZXRTVFBRKClgIG1ldGhvZCBpbnZvY2F0aW9ucyBvbiBub2RlIG9iamVjdHMuXHJcbiAqIEZvciBleGFtcGxlOlxyXG4gKiBgYGBqc1xyXG4gKiBtYXRlcmlhbExpbmUuY29sb3JOb2RlID0gY29sb3IoIDAsIDAsIDAgKS5zZXRSKCBmbG9hdCggMSApICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgVGVtcE5vZGVcclxuICovXHJcbmNsYXNzIFNldE5vZGUgZXh0ZW5kcyBUZW1wTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ1NldE5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc2V0IG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV9IHNvdXJjZU5vZGUgLSBUaGUgbm9kZSB0aGF0IHNob3VsZCBiZSB1cGRhdGVkLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBjb21wb25lbnRzIC0gVGhlIGNvbXBvbmVudHMgdGhhdCBzaG91bGQgYmUgdXBkYXRlZC5cclxuXHQgKiBAcGFyYW0ge05vZGV9IHRhcmdldE5vZGUgLSBUaGUgdmFsdWUgbm9kZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggc291cmNlTm9kZSwgY29tcG9uZW50cywgdGFyZ2V0Tm9kZSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG5vZGUgdGhhdCBzaG91bGQgYmUgdXBkYXRlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zb3VyY2VOb2RlID0gc291cmNlTm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjb21wb25lbnRzIHRoYXQgc2hvdWxkIGJlIHVwZGF0ZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb21wb25lbnRzID0gY29tcG9uZW50cztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB2YWx1ZSBub2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRhcmdldE5vZGUgPSB0YXJnZXROb2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGlzIG92ZXJ3cml0dGVuIHNpbmNlIHRoZSBub2RlIHR5cGUgaXMgaW5mZXJyZWQgZnJvbSB7QGxpbmsgU2V0Tm9kZSNzb3VyY2VOb2RlfS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgbm9kZSB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldE5vZGVUeXBlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnNvdXJjZU5vZGUuZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHRnZW5lcmF0ZSggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCB7IHNvdXJjZU5vZGUsIGNvbXBvbmVudHMsIHRhcmdldE5vZGUgfSA9IHRoaXM7XHJcblxyXG5cdFx0Y29uc3Qgc291cmNlVHlwZSA9IHRoaXMuZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRjb25zdCBjb21wb25lbnRUeXBlID0gYnVpbGRlci5nZXRDb21wb25lbnRUeXBlKCB0YXJnZXROb2RlLmdldE5vZGVUeXBlKCBidWlsZGVyICkgKTtcclxuXHRcdGNvbnN0IHRhcmdldFR5cGUgPSBidWlsZGVyLmdldFR5cGVGcm9tTGVuZ3RoKCBjb21wb25lbnRzLmxlbmd0aCwgY29tcG9uZW50VHlwZSApO1xyXG5cclxuXHRcdGNvbnN0IHRhcmdldFNuaXBwZXQgPSB0YXJnZXROb2RlLmJ1aWxkKCBidWlsZGVyLCB0YXJnZXRUeXBlICk7XHJcblx0XHRjb25zdCBzb3VyY2VTbmlwcGV0ID0gc291cmNlTm9kZS5idWlsZCggYnVpbGRlciwgc291cmNlVHlwZSApO1xyXG5cclxuXHRcdGNvbnN0IGxlbmd0aCA9IGJ1aWxkZXIuZ2V0VHlwZUxlbmd0aCggc291cmNlVHlwZSApO1xyXG5cdFx0Y29uc3Qgc25pcHBldFZhbHVlcyA9IFtdO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGNvbXBvbmVudCA9IHZlY3RvckNvbXBvbmVudHNbIGkgXTtcclxuXHJcblx0XHRcdGlmICggY29tcG9uZW50ID09PSBjb21wb25lbnRzWyAwIF0gKSB7XHJcblxyXG5cdFx0XHRcdHNuaXBwZXRWYWx1ZXMucHVzaCggdGFyZ2V0U25pcHBldCApO1xyXG5cclxuXHRcdFx0XHRpICs9IGNvbXBvbmVudHMubGVuZ3RoIC0gMTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHNuaXBwZXRWYWx1ZXMucHVzaCggc291cmNlU25pcHBldCArICcuJyArIGNvbXBvbmVudCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gYCR7IGJ1aWxkZXIuZ2V0VHlwZSggc291cmNlVHlwZSApIH0oICR7IHNuaXBwZXRWYWx1ZXMuam9pbiggJywgJyApIH0gKWA7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFNldE5vZGU7XHJcbiIsImltcG9ydCBUZW1wTm9kZSBmcm9tICcuLi9jb3JlL1RlbXBOb2RlLmpzJztcclxuaW1wb3J0IHsgdmVjdG9yQ29tcG9uZW50cyB9IGZyb20gJy4uL2NvcmUvY29uc3RhbnRzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIG1vZHVsZSBpcyBwYXJ0IG9mIHRoZSBUU0wgY29yZSBhbmQgdXN1YWxseSBub3QgdXNlZCBpbiBhcHAgbGV2ZWwgY29kZS5cclxuICogSXQgcmVwcmVzZW50cyBhIGZsaXAgb3BlcmF0aW9uIGR1cmluZyB0aGUgc2hhZGVyIGdlbmVyYXRpb24gcHJvY2Vzc1xyXG4gKiBtZWFuaW5nIGl0IGZsaXBzIG5vcm1hbGl6ZWQgdmFsdWVzIHdpdGggdGhlIGZvbGxvd2luZyBmb3JtdWxhOlxyXG4gKiBgYGBcclxuICogeCA9IDEgLSB4O1xyXG4gKiBgYGBcclxuICogYEZsaXBOb2RlYCBpcyBpbnRlcm5hbGx5IHVzZWQgdG8gaW1wbGVtZW50IGFueSBgZmxpcFhZWlcoKWAsIGBmbGlwUkdCQSgpYCBhbmRcclxuICogYGZsaXBTVFBRKClgIG1ldGhvZCBpbnZvY2F0aW9ucyBvbiBub2RlIG9iamVjdHMuIEZvciBleGFtcGxlOlxyXG4gKiBgYGBqc1xyXG4gKiB1dk5vZGUgPSB1dk5vZGUuZmxpcFkoKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBUZW1wTm9kZVxyXG4gKi9cclxuY2xhc3MgRmxpcE5vZGUgZXh0ZW5kcyBUZW1wTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ0ZsaXBOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGZsaXAgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gc291cmNlTm9kZSAtIFRoZSBub2RlIHdoaWNoIGNvbXBvbmVudChzKSBzaG91bGQgYmUgZmxpcHBlZC5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gY29tcG9uZW50cyAtIFRoZSBjb21wb25lbnRzIHRoYXQgc2hvdWxkIGJlIGZsaXBwZWQgZS5nLiBgJ3gnYCBvciBgJ3h5J2AuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHNvdXJjZU5vZGUsIGNvbXBvbmVudHMgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBub2RlIHdoaWNoIGNvbXBvbmVudChzKSBzaG91bGQgYmUgZmxpcHBlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zb3VyY2VOb2RlID0gc291cmNlTm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjb21wb25lbnRzIHRoYXQgc2hvdWxkIGJlIGZsaXBwZWQgZS5nLiBgJ3gnYCBvciBgJ3h5J2AuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb21wb25lbnRzID0gY29tcG9uZW50cztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyBvdmVyd3JpdHRlbiBzaW5jZSB0aGUgbm9kZSB0eXBlIGlzIGluZmVycmVkIGZyb20gdGhlIHNvdXJjZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBub2RlIHR5cGUuXHJcblx0ICovXHJcblx0Z2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuc291cmNlTm9kZS5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdGdlbmVyYXRlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IHsgY29tcG9uZW50cywgc291cmNlTm9kZSB9ID0gdGhpcztcclxuXHJcblx0XHRjb25zdCBzb3VyY2VUeXBlID0gdGhpcy5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cdFx0Y29uc3Qgc291cmNlU25pcHBldCA9IHNvdXJjZU5vZGUuYnVpbGQoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRjb25zdCBzb3VyY2VDYWNoZSA9IGJ1aWxkZXIuZ2V0VmFyRnJvbU5vZGUoIHRoaXMgKTtcclxuXHRcdGNvbnN0IHNvdXJjZVByb3BlcnR5ID0gYnVpbGRlci5nZXRQcm9wZXJ0eU5hbWUoIHNvdXJjZUNhY2hlICk7XHJcblxyXG5cdFx0YnVpbGRlci5hZGRMaW5lRmxvd0NvZGUoIHNvdXJjZVByb3BlcnR5ICsgJyA9ICcgKyBzb3VyY2VTbmlwcGV0LCB0aGlzICk7XHJcblxyXG5cdFx0Y29uc3QgbGVuZ3RoID0gYnVpbGRlci5nZXRUeXBlTGVuZ3RoKCBzb3VyY2VUeXBlICk7XHJcblx0XHRjb25zdCBzbmlwcGV0VmFsdWVzID0gW107XHJcblxyXG5cdFx0bGV0IGNvbXBvbmVudEluZGV4ID0gMDtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBjb21wb25lbnQgPSB2ZWN0b3JDb21wb25lbnRzWyBpIF07XHJcblxyXG5cdFx0XHRpZiAoIGNvbXBvbmVudCA9PT0gY29tcG9uZW50c1sgY29tcG9uZW50SW5kZXggXSApIHtcclxuXHJcblx0XHRcdFx0c25pcHBldFZhbHVlcy5wdXNoKCAnMS4wIC0gJyArICggc291cmNlUHJvcGVydHkgKyAnLicgKyBjb21wb25lbnQgKSApO1xyXG5cclxuXHRcdFx0XHRjb21wb25lbnRJbmRleCArKztcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHNuaXBwZXRWYWx1ZXMucHVzaCggc291cmNlUHJvcGVydHkgKyAnLicgKyBjb21wb25lbnQgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGAkeyBidWlsZGVyLmdldFR5cGUoIHNvdXJjZVR5cGUgKSB9KCAkeyBzbmlwcGV0VmFsdWVzLmpvaW4oICcsICcgKSB9IClgO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBGbGlwTm9kZTtcclxuIiwiaW1wb3J0IE5vZGUgZnJvbSAnLi9Ob2RlLmpzJztcclxuaW1wb3J0IHsgZ2V0VmFsdWVUeXBlLCBnZXRWYWx1ZUZyb21UeXBlLCBhcnJheUJ1ZmZlclRvQmFzZTY0IH0gZnJvbSAnLi9Ob2RlVXRpbHMuanMnO1xyXG5cclxuLyoqXHJcbiAqIEJhc2UgY2xhc3MgZm9yIHJlcHJlc2VudGluZyBkYXRhIGlucHV0IG5vZGVzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTm9kZVxyXG4gKi9cclxuY2xhc3MgSW5wdXROb2RlIGV4dGVuZHMgTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ0lucHV0Tm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBpbnB1dCBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHthbnl9IHZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoaXMgbm9kZS4gVGhpcyBjYW4gYmUgYW55IEpTIHByaW1pdGl2ZSwgZnVuY3Rpb25zLCBhcnJheSBidWZmZXJzIG9yIGV2ZW4gdGhyZWUuanMgb2JqZWN0cyAodmVjdG9yLCBtYXRyaWNlcywgY29sb3JzKS5cclxuXHQgKiBAcGFyYW0gez9zdHJpbmd9IG5vZGVUeXBlIC0gVGhlIG5vZGUgdHlwZS4gSWYgbm8gZXhwbGljaXQgdHlwZSBpcyBkZWZpbmVkLCB0aGUgbm9kZSB0cmllcyB0byBkZXJpdmUgdGhlIHR5cGUgZnJvbSBpdHMgdmFsdWUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHZhbHVlLCBub2RlVHlwZSA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5vZGVUeXBlICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzSW5wdXROb2RlID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB2YWx1ZSBvZiB0aGlzIG5vZGUuIFRoaXMgY2FuIGJlIGFueSBKUyBwcmltaXRpdmUsIGZ1bmN0aW9ucywgYXJyYXkgYnVmZmVycyBvciBldmVuIHRocmVlLmpzIG9iamVjdHMgKHZlY3RvciwgbWF0cmljZXMsIGNvbG9ycykuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2FueX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52YWx1ZSA9IHZhbHVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHByZWNpc2lvbiBvZiB0aGUgdmFsdWUgaW4gdGhlIHNoYWRlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7PygnbG93J3wnbWVkaXVtJ3wnaGlnaCcpfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnByZWNpc2lvbiA9IG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0Tm9kZVR5cGUoIC8qYnVpbGRlciovICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5ub2RlVHlwZSA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHJldHVybiBnZXRWYWx1ZVR5cGUoIHRoaXMudmFsdWUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubm9kZVR5cGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgaW5wdXQgdHlwZSBvZiB0aGUgbm9kZSB3aGljaCBpcyBieSBkZWZhdWx0IHRoZSBub2RlIHR5cGUuIERlcml2ZWQgbW9kdWxlc1xyXG5cdCAqIG1pZ2h0IG92ZXJ3cml0ZSB0aGlzIG1ldGhvZCBhbmQgdXNlIGEgZml4ZWQgdHlwZSBvciBjb21wdXRlIG9uZSBhbmFseXRpY2FsbHkuXHJcblx0ICpcclxuXHQgKiBBIHR5cGljYWwgZXhhbXBsZSBmb3IgZGlmZmVyZW50IGlucHV0IGFuZCBub2RlIHR5cGVzIGFyZSB0ZXh0dXJlcy4gVGhlIGlucHV0IHR5cGUgb2YgYVxyXG5cdCAqIG5vcm1hbCBSR0JBIHRleHR1cmUgaXMgYHRleHR1cmVgIHdoZXJlYXMgaXRzIG5vZGUgdHlwZSBpcyBgdmVjNGAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGlucHV0IHR5cGUuXHJcblx0ICovXHJcblx0Z2V0SW5wdXRUeXBlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmdldE5vZGVUeXBlKCBidWlsZGVyICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgcHJlY2lzaW9uIHRvIHRoZSBnaXZlbiB2YWx1ZS4gVGhlIG1ldGhvZCBjYW4gYmVcclxuXHQgKiBvdmVyd3JpdHRlbiBpbiBkZXJpdmVkIGNsYXNzZXMgaWYgdGhlIGZpbmFsIHByZWNpc2lvbiBtdXN0IGJlIGNvbXB1dGVkXHJcblx0ICogYW5hbHl0aWNhbGx5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHsoJ2xvdyd8J21lZGl1bSd8J2hpZ2gnKX0gcHJlY2lzaW9uIC0gVGhlIHByZWNpc2lvbiBvZiB0aGUgaW5wdXQgdmFsdWUgaW4gdGhlIHNoYWRlci5cclxuXHQgKiBAcmV0dXJuIHtJbnB1dE5vZGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbm9kZS5cclxuXHQgKi9cclxuXHRzZXRQcmVjaXNpb24oIHByZWNpc2lvbiApIHtcclxuXHJcblx0XHR0aGlzLnByZWNpc2lvbiA9IHByZWNpc2lvbjtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHRzZXJpYWxpemUoIGRhdGEgKSB7XHJcblxyXG5cdFx0c3VwZXIuc2VyaWFsaXplKCBkYXRhICk7XHJcblxyXG5cdFx0ZGF0YS52YWx1ZSA9IHRoaXMudmFsdWU7XHJcblxyXG5cdFx0aWYgKCB0aGlzLnZhbHVlICYmIHRoaXMudmFsdWUudG9BcnJheSApIGRhdGEudmFsdWUgPSB0aGlzLnZhbHVlLnRvQXJyYXkoKTtcclxuXHJcblx0XHRkYXRhLnZhbHVlVHlwZSA9IGdldFZhbHVlVHlwZSggdGhpcy52YWx1ZSApO1xyXG5cdFx0ZGF0YS5ub2RlVHlwZSA9IHRoaXMubm9kZVR5cGU7XHJcblxyXG5cdFx0aWYgKCBkYXRhLnZhbHVlVHlwZSA9PT0gJ0FycmF5QnVmZmVyJyApIGRhdGEudmFsdWUgPSBhcnJheUJ1ZmZlclRvQmFzZTY0KCBkYXRhLnZhbHVlICk7XHJcblxyXG5cdFx0ZGF0YS5wcmVjaXNpb24gPSB0aGlzLnByZWNpc2lvbjtcclxuXHJcblx0fVxyXG5cclxuXHRkZXNlcmlhbGl6ZSggZGF0YSApIHtcclxuXHJcblx0XHRzdXBlci5kZXNlcmlhbGl6ZSggZGF0YSApO1xyXG5cclxuXHRcdHRoaXMubm9kZVR5cGUgPSBkYXRhLm5vZGVUeXBlO1xyXG5cdFx0dGhpcy52YWx1ZSA9IEFycmF5LmlzQXJyYXkoIGRhdGEudmFsdWUgKSA/IGdldFZhbHVlRnJvbVR5cGUoIGRhdGEudmFsdWVUeXBlLCAuLi5kYXRhLnZhbHVlICkgOiBkYXRhLnZhbHVlO1xyXG5cclxuXHRcdHRoaXMucHJlY2lzaW9uID0gZGF0YS5wcmVjaXNpb24gfHwgbnVsbDtcclxuXHJcblx0XHRpZiAoIHRoaXMudmFsdWUgJiYgdGhpcy52YWx1ZS5mcm9tQXJyYXkgKSB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5mcm9tQXJyYXkoIGRhdGEudmFsdWUgKTtcclxuXHJcblx0fVxyXG5cclxuXHRnZW5lcmF0ZSggLypidWlsZGVyLCBvdXRwdXQqLyApIHtcclxuXHJcblx0XHRjb25zb2xlLndhcm4oICdBYnN0cmFjdCBmdW5jdGlvbi4nICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IElucHV0Tm9kZTtcclxuIiwiaW1wb3J0IElucHV0Tm9kZSBmcm9tICcuL0lucHV0Tm9kZS5qcyc7XHJcblxyXG5jb25zdCBfcmVnTnVtID0gL2Zsb2F0fHU/aW50LztcclxuXHJcbi8qKlxyXG4gKiBDbGFzcyBmb3IgcmVwcmVzZW50aW5nIGEgY29uc3RhbnQgdmFsdWUgaW4gdGhlIHNoYWRlci5cclxuICpcclxuICogQGF1Z21lbnRzIElucHV0Tm9kZVxyXG4gKi9cclxuY2xhc3MgQ29uc3ROb2RlIGV4dGVuZHMgSW5wdXROb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnQ29uc3ROb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGlucHV0IG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBUaGUgdmFsdWUgb2YgdGhpcyBub2RlLiBVc3VhbGx5IGEgSlMgcHJpbWl0aXZlIG9yIHRocmVlLmpzIG9iamVjdCAodmVjdG9yLCBtYXRyaXgsIGNvbG9yKS5cclxuXHQgKiBAcGFyYW0gez9zdHJpbmd9IG5vZGVUeXBlIC0gVGhlIG5vZGUgdHlwZS4gSWYgbm8gZXhwbGljaXQgdHlwZSBpcyBkZWZpbmVkLCB0aGUgbm9kZSB0cmllcyB0byBkZXJpdmUgdGhlIHR5cGUgZnJvbSBpdHMgdmFsdWUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHZhbHVlLCBub2RlVHlwZSA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoIHZhbHVlLCBub2RlVHlwZSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0NvbnN0Tm9kZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2VuZXJhdGVzIHRoZSBzaGFkZXIgc3RyaW5nIG9mIHRoZSB2YWx1ZSB3aXRoIHRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgZ2VuZXJhdGVkIHZhbHVlIGFzIGEgc2hhZGVyIHN0cmluZy5cclxuXHQgKi9cclxuXHRnZW5lcmF0ZUNvbnN0KCBidWlsZGVyICkge1xyXG5cclxuXHRcdHJldHVybiBidWlsZGVyLmdlbmVyYXRlQ29uc3QoIHRoaXMuZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKSwgdGhpcy52YWx1ZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdGdlbmVyYXRlKCBidWlsZGVyLCBvdXRwdXQgKSB7XHJcblxyXG5cdFx0Y29uc3QgdHlwZSA9IHRoaXMuZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRpZiAoIF9yZWdOdW0udGVzdCggdHlwZSApICYmIF9yZWdOdW0udGVzdCggb3V0cHV0ICkgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gYnVpbGRlci5nZW5lcmF0ZUNvbnN0KCBvdXRwdXQsIHRoaXMudmFsdWUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGJ1aWxkZXIuZm9ybWF0KCB0aGlzLmdlbmVyYXRlQ29uc3QoIGJ1aWxkZXIgKSwgdHlwZSwgb3V0cHV0ICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IENvbnN0Tm9kZTtcclxuIiwiaW1wb3J0IE5vZGUgZnJvbSAnLi4vY29yZS9Ob2RlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBCYXNlIGNsYXNzIGZvciByZXByZXNlbnRpbmcgbWVtYmVyIGFjY2VzcyBvbiBhbiBvYmplY3QtbGlrZVxyXG4gKiBub2RlIGRhdGEgc3RydWN0dXJlcy5cclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVcclxuICovXHJcbmNsYXNzIE1lbWJlck5vZGUgZXh0ZW5kcyBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnTWVtYmVyTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhbiBhcnJheSBlbGVtZW50IG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBUaGUgYXJyYXktbGlrZSBub2RlLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSBuYW1lLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBub2RlLCBwcm9wZXJ0eSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGFycmF5LWxpa2Ugbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub2RlID0gbm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBwcm9wZXJ0eSBuYW1lLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzTWVtYmVyTm9kZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubm9kZS5nZXRNZW1iZXJUeXBlKCBidWlsZGVyLCB0aGlzLnByb3BlcnR5ICk7XHJcblxyXG5cdH1cclxuXHJcblx0Z2VuZXJhdGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgcHJvcGVydHlOYW1lID0gdGhpcy5ub2RlLmJ1aWxkKCBidWlsZGVyICk7XHJcblxyXG5cdFx0cmV0dXJuIHByb3BlcnR5TmFtZSArICcuJyArIHRoaXMucHJvcGVydHk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IE1lbWJlck5vZGU7XHJcbiIsImltcG9ydCBOb2RlIGZyb20gJy4uL2NvcmUvTm9kZS5qcyc7XHJcbmltcG9ydCBBcnJheUVsZW1lbnROb2RlIGZyb20gJy4uL3V0aWxzL0FycmF5RWxlbWVudE5vZGUuanMnO1xyXG5pbXBvcnQgQ29udmVydE5vZGUgZnJvbSAnLi4vdXRpbHMvQ29udmVydE5vZGUuanMnO1xyXG5pbXBvcnQgSm9pbk5vZGUgZnJvbSAnLi4vdXRpbHMvSm9pbk5vZGUuanMnO1xyXG5pbXBvcnQgU3BsaXROb2RlIGZyb20gJy4uL3V0aWxzL1NwbGl0Tm9kZS5qcyc7XHJcbmltcG9ydCBTZXROb2RlIGZyb20gJy4uL3V0aWxzL1NldE5vZGUuanMnO1xyXG5pbXBvcnQgRmxpcE5vZGUgZnJvbSAnLi4vdXRpbHMvRmxpcE5vZGUuanMnO1xyXG5pbXBvcnQgQ29uc3ROb2RlIGZyb20gJy4uL2NvcmUvQ29uc3ROb2RlLmpzJztcclxuaW1wb3J0IE1lbWJlck5vZGUgZnJvbSAnLi4vdXRpbHMvTWVtYmVyTm9kZS5qcyc7XHJcbmltcG9ydCB7IGdldFZhbHVlRnJvbVR5cGUsIGdldFZhbHVlVHlwZSB9IGZyb20gJy4uL2NvcmUvTm9kZVV0aWxzLmpzJztcclxuXHJcbmxldCBjdXJyZW50U3RhY2sgPSBudWxsO1xyXG5cclxuY29uc3QgTm9kZUVsZW1lbnRzID0gbmV3IE1hcCgpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZE1ldGhvZENoYWluaW5nKCBuYW1lLCBub2RlRWxlbWVudCApIHtcclxuXHJcblx0aWYgKCBOb2RlRWxlbWVudHMuaGFzKCBuYW1lICkgKSB7XHJcblxyXG5cdFx0Y29uc29sZS53YXJuKCBgVEhSRUUuVFNMOiBSZWRlZmluaXRpb24gb2YgbWV0aG9kIGNoYWluaW5nICckeyBuYW1lIH0nLmAgKTtcclxuXHRcdHJldHVybjtcclxuXHJcblx0fVxyXG5cclxuXHRpZiAoIHR5cGVvZiBub2RlRWxlbWVudCAhPT0gJ2Z1bmN0aW9uJyApIHRocm93IG5ldyBFcnJvciggYFRIUkVFLlRTTDogTm9kZSBlbGVtZW50ICR7IG5hbWUgfSBpcyBub3QgYSBmdW5jdGlvbmAgKTtcclxuXHJcblx0Tm9kZUVsZW1lbnRzLnNldCggbmFtZSwgbm9kZUVsZW1lbnQgKTtcclxuXHJcbn1cclxuXHJcbmNvbnN0IHBhcnNlU3dpenpsZSA9ICggcHJvcHMgKSA9PiBwcm9wcy5yZXBsYWNlKCAvcnxzL2csICd4JyApLnJlcGxhY2UoIC9nfHQvZywgJ3knICkucmVwbGFjZSggL2J8cC9nLCAneicgKS5yZXBsYWNlKCAvYXxxL2csICd3JyApO1xyXG5jb25zdCBwYXJzZVN3aXp6bGVBbmRTb3J0ID0gKCBwcm9wcyApID0+IHBhcnNlU3dpenpsZSggcHJvcHMgKS5zcGxpdCggJycgKS5zb3J0KCkuam9pbiggJycgKTtcclxuXHJcbmNvbnN0IHNoYWRlck5vZGVIYW5kbGVyID0ge1xyXG5cclxuXHRzZXR1cCggTm9kZUNsb3N1cmUsIHBhcmFtcyApIHtcclxuXHJcblx0XHRjb25zdCBpbnB1dHMgPSBwYXJhbXMuc2hpZnQoKTtcclxuXHJcblx0XHRyZXR1cm4gTm9kZUNsb3N1cmUoIG5vZGVPYmplY3RzKCBpbnB1dHMgKSwgLi4ucGFyYW1zICk7XHJcblxyXG5cdH0sXHJcblxyXG5cdGdldCggbm9kZSwgcHJvcCwgbm9kZU9iaiApIHtcclxuXHJcblx0XHRpZiAoIHR5cGVvZiBwcm9wID09PSAnc3RyaW5nJyAmJiBub2RlWyBwcm9wIF0gPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGlmICggbm9kZS5pc1N0YWNrTm9kZSAhPT0gdHJ1ZSAmJiBwcm9wID09PSAnYXNzaWduJyApIHtcclxuXHJcblx0XHRcdFx0cmV0dXJuICggLi4ucGFyYW1zICkgPT4ge1xyXG5cclxuXHRcdFx0XHRcdGN1cnJlbnRTdGFjay5hc3NpZ24oIG5vZGVPYmosIC4uLnBhcmFtcyApO1xyXG5cclxuXHRcdFx0XHRcdHJldHVybiBub2RlT2JqO1xyXG5cclxuXHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggTm9kZUVsZW1lbnRzLmhhcyggcHJvcCApICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBub2RlRWxlbWVudCA9IE5vZGVFbGVtZW50cy5nZXQoIHByb3AgKTtcclxuXHJcblx0XHRcdFx0cmV0dXJuIG5vZGUuaXNTdGFja05vZGUgPyAoIC4uLnBhcmFtcyApID0+IG5vZGVPYmouYWRkKCBub2RlRWxlbWVudCggLi4ucGFyYW1zICkgKSA6ICggLi4ucGFyYW1zICkgPT4gbm9kZUVsZW1lbnQoIG5vZGVPYmosIC4uLnBhcmFtcyApO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggcHJvcCA9PT0gJ3NlbGYnICkge1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gbm9kZTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIHByb3AuZW5kc1dpdGgoICdBc3NpZ24nICkgJiYgTm9kZUVsZW1lbnRzLmhhcyggcHJvcC5zbGljZSggMCwgcHJvcC5sZW5ndGggLSAnQXNzaWduJy5sZW5ndGggKSApICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBub2RlRWxlbWVudCA9IE5vZGVFbGVtZW50cy5nZXQoIHByb3Auc2xpY2UoIDAsIHByb3AubGVuZ3RoIC0gJ0Fzc2lnbicubGVuZ3RoICkgKTtcclxuXHJcblx0XHRcdFx0cmV0dXJuIG5vZGUuaXNTdGFja05vZGUgPyAoIC4uLnBhcmFtcyApID0+IG5vZGVPYmouYXNzaWduKCBwYXJhbXNbIDAgXSwgbm9kZUVsZW1lbnQoIC4uLnBhcmFtcyApICkgOiAoIC4uLnBhcmFtcyApID0+IG5vZGVPYmouYXNzaWduKCBub2RlRWxlbWVudCggbm9kZU9iaiwgLi4ucGFyYW1zICkgKTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIC9eW3h5endyZ2Jhc3RwcV17MSw0fSQvLnRlc3QoIHByb3AgKSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0Ly8gYWNjZXNzaW5nIHByb3BlcnRpZXMgKCBzd2l6emxlIClcclxuXHJcblx0XHRcdFx0cHJvcCA9IHBhcnNlU3dpenpsZSggcHJvcCApO1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gbm9kZU9iamVjdCggbmV3IFNwbGl0Tm9kZSggbm9kZU9iaiwgcHJvcCApICk7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCAvXnNldFtYWVpXUkdCQVNUUFFdezEsNH0kLy50ZXN0KCBwcm9wICkgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdC8vIHNldCBwcm9wZXJ0aWVzICggc3dpenpsZSApIGFuZCBzb3J0IHRvIHh5encgc2VxdWVuY2VcclxuXHJcblx0XHRcdFx0cHJvcCA9IHBhcnNlU3dpenpsZUFuZFNvcnQoIHByb3Auc2xpY2UoIDMgKS50b0xvd2VyQ2FzZSgpICk7XHJcblxyXG5cdFx0XHRcdHJldHVybiAoIHZhbHVlICkgPT4gbm9kZU9iamVjdCggbmV3IFNldE5vZGUoIG5vZGUsIHByb3AsIHZhbHVlICkgKTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIC9eZmxpcFtYWVpXUkdCQVNUUFFdezEsNH0kLy50ZXN0KCBwcm9wICkgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdC8vIHNldCBwcm9wZXJ0aWVzICggc3dpenpsZSApIGFuZCBzb3J0IHRvIHh5encgc2VxdWVuY2VcclxuXHJcblx0XHRcdFx0cHJvcCA9IHBhcnNlU3dpenpsZUFuZFNvcnQoIHByb3Auc2xpY2UoIDQgKS50b0xvd2VyQ2FzZSgpICk7XHJcblxyXG5cdFx0XHRcdHJldHVybiAoKSA9PiBub2RlT2JqZWN0KCBuZXcgRmxpcE5vZGUoIG5vZGVPYmplY3QoIG5vZGUgKSwgcHJvcCApICk7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBwcm9wID09PSAnd2lkdGgnIHx8IHByb3AgPT09ICdoZWlnaHQnIHx8IHByb3AgPT09ICdkZXB0aCcgKSB7XHJcblxyXG5cdFx0XHRcdC8vIGFjY2Vzc2luZyBwcm9wZXJ0eVxyXG5cclxuXHRcdFx0XHRpZiAoIHByb3AgPT09ICd3aWR0aCcgKSBwcm9wID0gJ3gnO1xyXG5cdFx0XHRcdGVsc2UgaWYgKCBwcm9wID09PSAnaGVpZ2h0JyApIHByb3AgPSAneSc7XHJcblx0XHRcdFx0ZWxzZSBpZiAoIHByb3AgPT09ICdkZXB0aCcgKSBwcm9wID0gJ3onO1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gbm9kZU9iamVjdCggbmV3IFNwbGl0Tm9kZSggbm9kZSwgcHJvcCApICk7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCAvXlxcZCskLy50ZXN0KCBwcm9wICkgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdC8vIGFjY2Vzc2luZyBhcnJheVxyXG5cclxuXHRcdFx0XHRyZXR1cm4gbm9kZU9iamVjdCggbmV3IEFycmF5RWxlbWVudE5vZGUoIG5vZGVPYmosIG5ldyBDb25zdE5vZGUoIE51bWJlciggcHJvcCApLCAndWludCcgKSApICk7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCAvXmdldCQvLnRlc3QoIHByb3AgKSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0Ly8gYWNjZXNzaW5nIHByb3BlcnRpZXNcclxuXHJcblx0XHRcdFx0cmV0dXJuICggdmFsdWUgKSA9PiBub2RlT2JqZWN0KCBuZXcgTWVtYmVyTm9kZSggbm9kZU9iaiwgdmFsdWUgKSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gUmVmbGVjdC5nZXQoIG5vZGUsIHByb3AsIG5vZGVPYmogKTtcclxuXHJcblx0fSxcclxuXHJcblx0c2V0KCBub2RlLCBwcm9wLCB2YWx1ZSwgbm9kZU9iaiApIHtcclxuXHJcblx0XHRpZiAoIHR5cGVvZiBwcm9wID09PSAnc3RyaW5nJyAmJiBub2RlWyBwcm9wIF0gPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdC8vIHNldHRpbmcgcHJvcGVydGllc1xyXG5cclxuXHRcdFx0aWYgKCAvXlt4eXp3cmdiYXN0cHFdezEsNH0kLy50ZXN0KCBwcm9wICkgPT09IHRydWUgfHwgcHJvcCA9PT0gJ3dpZHRoJyB8fCBwcm9wID09PSAnaGVpZ2h0JyB8fCBwcm9wID09PSAnZGVwdGgnIHx8IC9eXFxkKyQvLnRlc3QoIHByb3AgKSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0bm9kZU9ialsgcHJvcCBdLmFzc2lnbiggdmFsdWUgKTtcclxuXHJcblx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBSZWZsZWN0LnNldCggbm9kZSwgcHJvcCwgdmFsdWUsIG5vZGVPYmogKTtcclxuXHJcblx0fVxyXG5cclxufTtcclxuXHJcbmNvbnN0IG5vZGVPYmplY3RzQ2FjaGVNYXAgPSBuZXcgV2Vha01hcCgpO1xyXG5jb25zdCBub2RlQnVpbGRlckZ1bmN0aW9uc0NhY2hlTWFwID0gbmV3IFdlYWtNYXAoKTtcclxuXHJcbmNvbnN0IFNoYWRlck5vZGVPYmplY3QgPSBmdW5jdGlvbiAoIG9iaiwgYWx0VHlwZSA9IG51bGwgKSB7XHJcblxyXG5cdGNvbnN0IHR5cGUgPSBnZXRWYWx1ZVR5cGUoIG9iaiApO1xyXG5cclxuXHRpZiAoIHR5cGUgPT09ICdub2RlJyApIHtcclxuXHJcblx0XHRsZXQgbm9kZU9iamVjdCA9IG5vZGVPYmplY3RzQ2FjaGVNYXAuZ2V0KCBvYmogKTtcclxuXHJcblx0XHRpZiAoIG5vZGVPYmplY3QgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdG5vZGVPYmplY3QgPSBuZXcgUHJveHkoIG9iaiwgc2hhZGVyTm9kZUhhbmRsZXIgKTtcclxuXHJcblx0XHRcdG5vZGVPYmplY3RzQ2FjaGVNYXAuc2V0KCBvYmosIG5vZGVPYmplY3QgKTtcclxuXHRcdFx0bm9kZU9iamVjdHNDYWNoZU1hcC5zZXQoIG5vZGVPYmplY3QsIG5vZGVPYmplY3QgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG5vZGVPYmplY3Q7XHJcblxyXG5cdH0gZWxzZSBpZiAoICggYWx0VHlwZSA9PT0gbnVsbCAmJiAoIHR5cGUgPT09ICdmbG9hdCcgfHwgdHlwZSA9PT0gJ2Jvb2xlYW4nICkgKSB8fCAoIHR5cGUgJiYgdHlwZSAhPT0gJ3NoYWRlcicgJiYgdHlwZSAhPT0gJ3N0cmluZycgKSApIHtcclxuXHJcblx0XHRyZXR1cm4gbm9kZU9iamVjdCggZ2V0Q29uc3ROb2RlKCBvYmosIGFsdFR5cGUgKSApO1xyXG5cclxuXHR9IGVsc2UgaWYgKCB0eXBlID09PSAnc2hhZGVyJyApIHtcclxuXHJcblx0XHRyZXR1cm4gRm4oIG9iaiApO1xyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiBvYmo7XHJcblxyXG59O1xyXG5cclxuY29uc3QgU2hhZGVyTm9kZU9iamVjdHMgPSBmdW5jdGlvbiAoIG9iamVjdHMsIGFsdFR5cGUgPSBudWxsICkge1xyXG5cclxuXHRmb3IgKCBjb25zdCBuYW1lIGluIG9iamVjdHMgKSB7XHJcblxyXG5cdFx0b2JqZWN0c1sgbmFtZSBdID0gbm9kZU9iamVjdCggb2JqZWN0c1sgbmFtZSBdLCBhbHRUeXBlICk7XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIG9iamVjdHM7XHJcblxyXG59O1xyXG5cclxuY29uc3QgU2hhZGVyTm9kZUFycmF5ID0gZnVuY3Rpb24gKCBhcnJheSwgYWx0VHlwZSA9IG51bGwgKSB7XHJcblxyXG5cdGNvbnN0IGxlbiA9IGFycmF5Lmxlbmd0aDtcclxuXHJcblx0Zm9yICggbGV0IGkgPSAwOyBpIDwgbGVuOyBpICsrICkge1xyXG5cclxuXHRcdGFycmF5WyBpIF0gPSBub2RlT2JqZWN0KCBhcnJheVsgaSBdLCBhbHRUeXBlICk7XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIGFycmF5O1xyXG5cclxufTtcclxuXHJcbmNvbnN0IFNoYWRlck5vZGVQcm94eSA9IGZ1bmN0aW9uICggTm9kZUNsYXNzLCBzY29wZSA9IG51bGwsIGZhY3RvciA9IG51bGwsIHNldHRpbmdzID0gbnVsbCApIHtcclxuXHJcblx0Y29uc3QgYXNzaWduTm9kZSA9ICggbm9kZSApID0+IG5vZGVPYmplY3QoIHNldHRpbmdzICE9PSBudWxsID8gT2JqZWN0LmFzc2lnbiggbm9kZSwgc2V0dGluZ3MgKSA6IG5vZGUgKTtcclxuXHJcblx0bGV0IGZuLCBuYW1lID0gc2NvcGUsIG1pblBhcmFtcywgbWF4UGFyYW1zO1xyXG5cclxuXHRmdW5jdGlvbiB2ZXJpZnlQYXJhbXNMaW1pdCggcGFyYW1zICkge1xyXG5cclxuXHRcdGxldCB0c2xOYW1lO1xyXG5cclxuXHRcdGlmICggbmFtZSApIHRzbE5hbWUgPSAvW2Etel0vaS50ZXN0KCBuYW1lICkgPyBuYW1lICsgJygpJyA6IG5hbWU7XHJcblx0XHRlbHNlIHRzbE5hbWUgPSBOb2RlQ2xhc3MudHlwZTtcclxuXHJcblx0XHRpZiAoIG1pblBhcmFtcyAhPT0gdW5kZWZpbmVkICYmIHBhcmFtcy5sZW5ndGggPCBtaW5QYXJhbXMgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLmVycm9yKCBgVEhSRUUuVFNMOiBcIiR7IHRzbE5hbWUgfVwiIHBhcmFtZXRlciBsZW5ndGggaXMgbGVzcyB0aGFuIG1pbmltdW0gcmVxdWlyZWQuYCApO1xyXG5cclxuXHRcdFx0cmV0dXJuIHBhcmFtcy5jb25jYXQoIG5ldyBBcnJheSggbWluUGFyYW1zIC0gcGFyYW1zLmxlbmd0aCApLmZpbGwoIDAgKSApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIG1heFBhcmFtcyAhPT0gdW5kZWZpbmVkICYmIHBhcmFtcy5sZW5ndGggPiBtYXhQYXJhbXMgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLmVycm9yKCBgVEhSRUUuVFNMOiBcIiR7IHRzbE5hbWUgfVwiIHBhcmFtZXRlciBsZW5ndGggZXhjZWVkcyBsaW1pdC5gICk7XHJcblxyXG5cdFx0XHRyZXR1cm4gcGFyYW1zLnNsaWNlKCAwLCBtYXhQYXJhbXMgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHBhcmFtcztcclxuXHJcblx0fVxyXG5cclxuXHRpZiAoIHNjb3BlID09PSBudWxsICkge1xyXG5cclxuXHRcdGZuID0gKCAuLi5wYXJhbXMgKSA9PiB7XHJcblxyXG5cdFx0XHRyZXR1cm4gYXNzaWduTm9kZSggbmV3IE5vZGVDbGFzcyggLi4ubm9kZUFycmF5KCB2ZXJpZnlQYXJhbXNMaW1pdCggcGFyYW1zICkgKSApICk7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0fSBlbHNlIGlmICggZmFjdG9yICE9PSBudWxsICkge1xyXG5cclxuXHRcdGZhY3RvciA9IG5vZGVPYmplY3QoIGZhY3RvciApO1xyXG5cclxuXHRcdGZuID0gKCAuLi5wYXJhbXMgKSA9PiB7XHJcblxyXG5cdFx0XHRyZXR1cm4gYXNzaWduTm9kZSggbmV3IE5vZGVDbGFzcyggc2NvcGUsIC4uLm5vZGVBcnJheSggdmVyaWZ5UGFyYW1zTGltaXQoIHBhcmFtcyApICksIGZhY3RvciApICk7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0fSBlbHNlIHtcclxuXHJcblx0XHRmbiA9ICggLi4ucGFyYW1zICkgPT4ge1xyXG5cclxuXHRcdFx0cmV0dXJuIGFzc2lnbk5vZGUoIG5ldyBOb2RlQ2xhc3MoIHNjb3BlLCAuLi5ub2RlQXJyYXkoIHZlcmlmeVBhcmFtc0xpbWl0KCBwYXJhbXMgKSApICkgKTtcclxuXHJcblx0XHR9O1xyXG5cclxuXHR9XHJcblxyXG5cdGZuLnNldFBhcmFtZXRlckxlbmd0aCA9ICggLi4ucGFyYW1zICkgPT4ge1xyXG5cclxuXHRcdGlmICggcGFyYW1zLmxlbmd0aCA9PT0gMSApIG1pblBhcmFtcyA9IG1heFBhcmFtcyA9IHBhcmFtc1sgMCBdO1xyXG5cdFx0ZWxzZSBpZiAoIHBhcmFtcy5sZW5ndGggPT09IDIgKSBbIG1pblBhcmFtcywgbWF4UGFyYW1zIF0gPSBwYXJhbXM7XHJcblxyXG5cdFx0cmV0dXJuIGZuO1xyXG5cclxuXHR9O1xyXG5cclxuXHRmbi5zZXROYW1lID0gKCB2YWx1ZSApID0+IHtcclxuXHJcblx0XHRuYW1lID0gdmFsdWU7XHJcblxyXG5cdFx0cmV0dXJuIGZuO1xyXG5cclxuXHR9O1xyXG5cclxuXHRyZXR1cm4gZm47XHJcblxyXG59O1xyXG5cclxuY29uc3QgU2hhZGVyTm9kZUltbXV0YWJsZSA9IGZ1bmN0aW9uICggTm9kZUNsYXNzLCAuLi5wYXJhbXMgKSB7XHJcblxyXG5cdHJldHVybiBub2RlT2JqZWN0KCBuZXcgTm9kZUNsYXNzKCAuLi5ub2RlQXJyYXkoIHBhcmFtcyApICkgKTtcclxuXHJcbn07XHJcblxyXG5jbGFzcyBTaGFkZXJDYWxsTm9kZUludGVybmFsIGV4dGVuZHMgTm9kZSB7XHJcblxyXG5cdGNvbnN0cnVjdG9yKCBzaGFkZXJOb2RlLCBpbnB1dE5vZGVzICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0dGhpcy5zaGFkZXJOb2RlID0gc2hhZGVyTm9kZTtcclxuXHRcdHRoaXMuaW5wdXROb2RlcyA9IGlucHV0Tm9kZXM7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuc2hhZGVyTm9kZS5ub2RlVHlwZSB8fCB0aGlzLmdldE91dHB1dE5vZGUoIGJ1aWxkZXIgKS5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdGdldE1lbWJlclR5cGUoIGJ1aWxkZXIsIG5hbWUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZ2V0T3V0cHV0Tm9kZSggYnVpbGRlciApLmdldE1lbWJlclR5cGUoIGJ1aWxkZXIsIG5hbWUgKTtcclxuXHJcblx0fVxyXG5cclxuXHRjYWxsKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IHsgc2hhZGVyTm9kZSwgaW5wdXROb2RlcyB9ID0gdGhpcztcclxuXHJcblx0XHRjb25zdCBwcm9wZXJ0aWVzID0gYnVpbGRlci5nZXROb2RlUHJvcGVydGllcyggc2hhZGVyTm9kZSApO1xyXG5cdFx0aWYgKCBwcm9wZXJ0aWVzLm9uY2VPdXRwdXQgKSByZXR1cm4gcHJvcGVydGllcy5vbmNlT3V0cHV0O1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0bGV0IHJlc3VsdCA9IG51bGw7XHJcblxyXG5cdFx0aWYgKCBzaGFkZXJOb2RlLmxheW91dCApIHtcclxuXHJcblx0XHRcdGxldCBmdW5jdGlvbk5vZGVzQ2FjaGVNYXAgPSBub2RlQnVpbGRlckZ1bmN0aW9uc0NhY2hlTWFwLmdldCggYnVpbGRlci5jb25zdHJ1Y3RvciApO1xyXG5cclxuXHRcdFx0aWYgKCBmdW5jdGlvbk5vZGVzQ2FjaGVNYXAgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0ZnVuY3Rpb25Ob2Rlc0NhY2hlTWFwID0gbmV3IFdlYWtNYXAoKTtcclxuXHJcblx0XHRcdFx0bm9kZUJ1aWxkZXJGdW5jdGlvbnNDYWNoZU1hcC5zZXQoIGJ1aWxkZXIuY29uc3RydWN0b3IsIGZ1bmN0aW9uTm9kZXNDYWNoZU1hcCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0bGV0IGZ1bmN0aW9uTm9kZSA9IGZ1bmN0aW9uTm9kZXNDYWNoZU1hcC5nZXQoIHNoYWRlck5vZGUgKTtcclxuXHJcblx0XHRcdGlmICggZnVuY3Rpb25Ob2RlID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGZ1bmN0aW9uTm9kZSA9IG5vZGVPYmplY3QoIGJ1aWxkZXIuYnVpbGRGdW5jdGlvbk5vZGUoIHNoYWRlck5vZGUgKSApO1xyXG5cclxuXHRcdFx0XHRmdW5jdGlvbk5vZGVzQ2FjaGVNYXAuc2V0KCBzaGFkZXJOb2RlLCBmdW5jdGlvbk5vZGUgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGJ1aWxkZXIuYWRkSW5jbHVkZSggZnVuY3Rpb25Ob2RlICk7XHJcblxyXG5cdFx0XHRyZXN1bHQgPSBub2RlT2JqZWN0KCBmdW5jdGlvbk5vZGUuY2FsbCggaW5wdXROb2RlcyApICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGNvbnN0IGpzRnVuYyA9IHNoYWRlck5vZGUuanNGdW5jO1xyXG5cdFx0XHRjb25zdCBvdXRwdXROb2RlID0gaW5wdXROb2RlcyAhPT0gbnVsbCB8fCBqc0Z1bmMubGVuZ3RoID4gMSA/IGpzRnVuYyggaW5wdXROb2RlcyB8fCBbXSwgYnVpbGRlciApIDoganNGdW5jKCBidWlsZGVyICk7XHJcblxyXG5cdFx0XHRyZXN1bHQgPSBub2RlT2JqZWN0KCBvdXRwdXROb2RlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggc2hhZGVyTm9kZS5vbmNlICkge1xyXG5cclxuXHRcdFx0cHJvcGVydGllcy5vbmNlT3V0cHV0ID0gcmVzdWx0O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cclxuXHR9XHJcblxyXG5cdGdldE91dHB1dE5vZGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgcHJvcGVydGllcyA9IGJ1aWxkZXIuZ2V0Tm9kZVByb3BlcnRpZXMoIHRoaXMgKTtcclxuXHJcblx0XHRpZiAoIHByb3BlcnRpZXMub3V0cHV0Tm9kZSA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHByb3BlcnRpZXMub3V0cHV0Tm9kZSA9IHRoaXMuc2V0dXBPdXRwdXQoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHByb3BlcnRpZXMub3V0cHV0Tm9kZTtcclxuXHJcblx0fVxyXG5cclxuXHRzZXR1cCggYnVpbGRlciApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5nZXRPdXRwdXROb2RlKCBidWlsZGVyICk7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXBPdXRwdXQoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0YnVpbGRlci5hZGRTdGFjaygpO1xyXG5cclxuXHRcdGJ1aWxkZXIuc3RhY2sub3V0cHV0Tm9kZSA9IHRoaXMuY2FsbCggYnVpbGRlciApO1xyXG5cclxuXHRcdHJldHVybiBidWlsZGVyLnJlbW92ZVN0YWNrKCk7XHJcblxyXG5cdH1cclxuXHJcblx0Z2VuZXJhdGUoIGJ1aWxkZXIsIG91dHB1dCApIHtcclxuXHJcblx0XHRjb25zdCBvdXRwdXROb2RlID0gdGhpcy5nZXRPdXRwdXROb2RlKCBidWlsZGVyICk7XHJcblxyXG5cdFx0cmV0dXJuIG91dHB1dE5vZGUuYnVpbGQoIGJ1aWxkZXIsIG91dHB1dCApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5jbGFzcyBTaGFkZXJOb2RlSW50ZXJuYWwgZXh0ZW5kcyBOb2RlIHtcclxuXHJcblx0Y29uc3RydWN0b3IoIGpzRnVuYywgbm9kZVR5cGUgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5vZGVUeXBlICk7XHJcblxyXG5cdFx0dGhpcy5qc0Z1bmMgPSBqc0Z1bmM7XHJcblx0XHR0aGlzLmxheW91dCA9IG51bGw7XHJcblxyXG5cdFx0dGhpcy5nbG9iYWwgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMub25jZSA9IGZhbHNlO1xyXG5cclxuXHR9XHJcblxyXG5cdHNldExheW91dCggbGF5b3V0ICkge1xyXG5cclxuXHRcdHRoaXMubGF5b3V0ID0gbGF5b3V0O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdGNhbGwoIGlucHV0cyA9IG51bGwgKSB7XHJcblxyXG5cdFx0bm9kZU9iamVjdHMoIGlucHV0cyApO1xyXG5cclxuXHRcdHJldHVybiBub2RlT2JqZWN0KCBuZXcgU2hhZGVyQ2FsbE5vZGVJbnRlcm5hbCggdGhpcywgaW5wdXRzICkgKTtcclxuXHJcblx0fVxyXG5cclxuXHRzZXR1cCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5jYWxsKCk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmNvbnN0IGJvb2xzID0gWyBmYWxzZSwgdHJ1ZSBdO1xyXG5jb25zdCB1aW50cyA9IFsgMCwgMSwgMiwgMyBdO1xyXG5jb25zdCBpbnRzID0gWyAtIDEsIC0gMiBdO1xyXG5jb25zdCBmbG9hdHMgPSBbIDAuNSwgMS41LCAxIC8gMywgMWUtNiwgMWU2LCBNYXRoLlBJLCBNYXRoLlBJICogMiwgMSAvIE1hdGguUEksIDIgLyBNYXRoLlBJLCAxIC8gKCBNYXRoLlBJICogMiApLCBNYXRoLlBJIC8gMiBdO1xyXG5cclxuY29uc3QgYm9vbHNDYWNoZU1hcCA9IG5ldyBNYXAoKTtcclxuZm9yICggY29uc3QgYm9vbCBvZiBib29scyApIGJvb2xzQ2FjaGVNYXAuc2V0KCBib29sLCBuZXcgQ29uc3ROb2RlKCBib29sICkgKTtcclxuXHJcbmNvbnN0IHVpbnRzQ2FjaGVNYXAgPSBuZXcgTWFwKCk7XHJcbmZvciAoIGNvbnN0IHVpbnQgb2YgdWludHMgKSB1aW50c0NhY2hlTWFwLnNldCggdWludCwgbmV3IENvbnN0Tm9kZSggdWludCwgJ3VpbnQnICkgKTtcclxuXHJcbmNvbnN0IGludHNDYWNoZU1hcCA9IG5ldyBNYXAoIFsgLi4udWludHNDYWNoZU1hcCBdLm1hcCggZWwgPT4gbmV3IENvbnN0Tm9kZSggZWwudmFsdWUsICdpbnQnICkgKSApO1xyXG5mb3IgKCBjb25zdCBpbnQgb2YgaW50cyApIGludHNDYWNoZU1hcC5zZXQoIGludCwgbmV3IENvbnN0Tm9kZSggaW50LCAnaW50JyApICk7XHJcblxyXG5jb25zdCBmbG9hdHNDYWNoZU1hcCA9IG5ldyBNYXAoIFsgLi4uaW50c0NhY2hlTWFwIF0ubWFwKCBlbCA9PiBuZXcgQ29uc3ROb2RlKCBlbC52YWx1ZSApICkgKTtcclxuZm9yICggY29uc3QgZmxvYXQgb2YgZmxvYXRzICkgZmxvYXRzQ2FjaGVNYXAuc2V0KCBmbG9hdCwgbmV3IENvbnN0Tm9kZSggZmxvYXQgKSApO1xyXG5mb3IgKCBjb25zdCBmbG9hdCBvZiBmbG9hdHMgKSBmbG9hdHNDYWNoZU1hcC5zZXQoIC0gZmxvYXQsIG5ldyBDb25zdE5vZGUoIC0gZmxvYXQgKSApO1xyXG5cclxuY29uc3QgY2FjaGVNYXBzID0geyBib29sOiBib29sc0NhY2hlTWFwLCB1aW50OiB1aW50c0NhY2hlTWFwLCBpbnRzOiBpbnRzQ2FjaGVNYXAsIGZsb2F0OiBmbG9hdHNDYWNoZU1hcCB9O1xyXG5cclxuY29uc3QgY29uc3ROb2Rlc0NhY2hlTWFwID0gbmV3IE1hcCggWyAuLi5ib29sc0NhY2hlTWFwLCAuLi5mbG9hdHNDYWNoZU1hcCBdICk7XHJcblxyXG5jb25zdCBnZXRDb25zdE5vZGUgPSAoIHZhbHVlLCB0eXBlICkgPT4ge1xyXG5cclxuXHRpZiAoIGNvbnN0Tm9kZXNDYWNoZU1hcC5oYXMoIHZhbHVlICkgKSB7XHJcblxyXG5cdFx0cmV0dXJuIGNvbnN0Tm9kZXNDYWNoZU1hcC5nZXQoIHZhbHVlICk7XHJcblxyXG5cdH0gZWxzZSBpZiAoIHZhbHVlLmlzTm9kZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRyZXR1cm4gdmFsdWU7XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBDb25zdE5vZGUoIHZhbHVlLCB0eXBlICk7XHJcblxyXG5cdH1cclxuXHJcbn07XHJcblxyXG5jb25zdCBzYWZlR2V0Tm9kZVR5cGUgPSAoIG5vZGUgKSA9PiB7XHJcblxyXG5cdHRyeSB7XHJcblxyXG5cdFx0cmV0dXJuIG5vZGUuZ2V0Tm9kZVR5cGUoKTtcclxuXHJcblx0fSBjYXRjaCAoIF8gKSB7XHJcblxyXG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcclxuXHJcblx0fVxyXG5cclxufTtcclxuXHJcbmNvbnN0IENvbnZlcnRUeXBlID0gZnVuY3Rpb24gKCB0eXBlLCBjYWNoZU1hcCA9IG51bGwgKSB7XHJcblxyXG5cdHJldHVybiAoIC4uLnBhcmFtcyApID0+IHtcclxuXHJcblx0XHRpZiAoIHBhcmFtcy5sZW5ndGggPT09IDAgfHwgKCAhIFsgJ2Jvb2wnLCAnZmxvYXQnLCAnaW50JywgJ3VpbnQnIF0uaW5jbHVkZXMoIHR5cGUgKSAmJiBwYXJhbXMuZXZlcnkoIHBhcmFtID0+IHR5cGVvZiBwYXJhbSAhPT0gJ29iamVjdCcgKSApICkge1xyXG5cclxuXHRcdFx0cGFyYW1zID0gWyBnZXRWYWx1ZUZyb21UeXBlKCB0eXBlLCAuLi5wYXJhbXMgKSBdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHBhcmFtcy5sZW5ndGggPT09IDEgJiYgY2FjaGVNYXAgIT09IG51bGwgJiYgY2FjaGVNYXAuaGFzKCBwYXJhbXNbIDAgXSApICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIG5vZGVPYmplY3QoIGNhY2hlTWFwLmdldCggcGFyYW1zWyAwIF0gKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHBhcmFtcy5sZW5ndGggPT09IDEgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBub2RlID0gZ2V0Q29uc3ROb2RlKCBwYXJhbXNbIDAgXSwgdHlwZSApO1xyXG5cdFx0XHRpZiAoIHNhZmVHZXROb2RlVHlwZSggbm9kZSApID09PSB0eXBlICkgcmV0dXJuIG5vZGVPYmplY3QoIG5vZGUgKTtcclxuXHRcdFx0cmV0dXJuIG5vZGVPYmplY3QoIG5ldyBDb252ZXJ0Tm9kZSggbm9kZSwgdHlwZSApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IG5vZGVzID0gcGFyYW1zLm1hcCggcGFyYW0gPT4gZ2V0Q29uc3ROb2RlKCBwYXJhbSApICk7XHJcblx0XHRyZXR1cm4gbm9kZU9iamVjdCggbmV3IEpvaW5Ob2RlKCBub2RlcywgdHlwZSApICk7XHJcblxyXG5cdH07XHJcblxyXG59O1xyXG5cclxuLy8gZXhwb3J0c1xyXG5cclxuZXhwb3J0IGNvbnN0IGRlZmluZWQgPSAoIHYgKSA9PiB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPT0gbnVsbCA/IHYudmFsdWUgOiB2OyAvLyBUT0RPOiByZW1vdmUgYm9vbGVhbiBjb252ZXJzaW9uIGFuZCBkZWZpbmVkIGZ1bmN0aW9uXHJcblxyXG4vLyB1dGlsc1xyXG5cclxuZXhwb3J0IGNvbnN0IGdldENvbnN0Tm9kZVR5cGUgPSAoIHZhbHVlICkgPT4gKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsICkgPyAoIHZhbHVlLm5vZGVUeXBlIHx8IHZhbHVlLmNvbnZlcnRUbyB8fCAoIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6IG51bGwgKSApIDogbnVsbDtcclxuXHJcbi8vIHNoYWRlciBub2RlIGJhc2VcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBTaGFkZXJOb2RlKCBqc0Z1bmMsIG5vZGVUeXBlICkge1xyXG5cclxuXHRyZXR1cm4gbmV3IFByb3h5KCBuZXcgU2hhZGVyTm9kZUludGVybmFsKCBqc0Z1bmMsIG5vZGVUeXBlICksIHNoYWRlck5vZGVIYW5kbGVyICk7XHJcblxyXG59XHJcblxyXG5leHBvcnQgY29uc3Qgbm9kZU9iamVjdCA9ICggdmFsLCBhbHRUeXBlID0gbnVsbCApID0+IC8qIG5ldyAqLyBTaGFkZXJOb2RlT2JqZWN0KCB2YWwsIGFsdFR5cGUgKTtcclxuZXhwb3J0IGNvbnN0IG5vZGVPYmplY3RzID0gKCB2YWwsIGFsdFR5cGUgPSBudWxsICkgPT4gbmV3IFNoYWRlck5vZGVPYmplY3RzKCB2YWwsIGFsdFR5cGUgKTtcclxuZXhwb3J0IGNvbnN0IG5vZGVBcnJheSA9ICggdmFsLCBhbHRUeXBlID0gbnVsbCApID0+IG5ldyBTaGFkZXJOb2RlQXJyYXkoIHZhbCwgYWx0VHlwZSApO1xyXG5leHBvcnQgY29uc3Qgbm9kZVByb3h5ID0gKCAuLi5wYXJhbXMgKSA9PiBuZXcgU2hhZGVyTm9kZVByb3h5KCAuLi5wYXJhbXMgKTtcclxuZXhwb3J0IGNvbnN0IG5vZGVJbW11dGFibGUgPSAoIC4uLnBhcmFtcyApID0+IG5ldyBTaGFkZXJOb2RlSW1tdXRhYmxlKCAuLi5wYXJhbXMgKTtcclxuXHJcbmxldCBmbklkID0gMDtcclxuXHJcbmV4cG9ydCBjb25zdCBGbiA9ICgganNGdW5jLCBsYXlvdXQgPSBudWxsICkgPT4ge1xyXG5cclxuXHRsZXQgbm9kZVR5cGUgPSBudWxsO1xyXG5cclxuXHRpZiAoIGxheW91dCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRpZiAoIHR5cGVvZiBsYXlvdXQgPT09ICdvYmplY3QnICkge1xyXG5cclxuXHRcdFx0bm9kZVR5cGUgPSBsYXlvdXQucmV0dXJuO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRpZiAoIHR5cGVvZiBsYXlvdXQgPT09ICdzdHJpbmcnICkge1xyXG5cclxuXHRcdFx0XHRub2RlVHlwZSA9IGxheW91dDtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5UU0w6IEludmFsaWQgbGF5b3V0IHR5cGUuJyApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0bGF5b3V0ID0gbnVsbDtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0Y29uc3Qgc2hhZGVyTm9kZSA9IG5ldyBTaGFkZXJOb2RlKCBqc0Z1bmMsIG5vZGVUeXBlICk7XHJcblxyXG5cdGNvbnN0IGZuID0gKCAuLi5wYXJhbXMgKSA9PiB7XHJcblxyXG5cdFx0bGV0IGlucHV0cztcclxuXHJcblx0XHRub2RlT2JqZWN0cyggcGFyYW1zICk7XHJcblxyXG5cdFx0aWYgKCBwYXJhbXNbIDAgXSAmJiBwYXJhbXNbIDAgXS5pc05vZGUgKSB7XHJcblxyXG5cdFx0XHRpbnB1dHMgPSBbIC4uLnBhcmFtcyBdO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRpbnB1dHMgPSBwYXJhbXNbIDAgXTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHNoYWRlck5vZGUuY2FsbCggaW5wdXRzICk7XHJcblxyXG5cdH07XHJcblxyXG5cdGZuLnNoYWRlck5vZGUgPSBzaGFkZXJOb2RlO1xyXG5cclxuXHRmbi5zZXRMYXlvdXQgPSAoIGxheW91dCApID0+IHtcclxuXHJcblx0XHRzaGFkZXJOb2RlLnNldExheW91dCggbGF5b3V0ICk7XHJcblxyXG5cdFx0cmV0dXJuIGZuO1xyXG5cclxuXHR9O1xyXG5cclxuXHRmbi5vbmNlID0gKCkgPT4ge1xyXG5cclxuXHRcdHNoYWRlck5vZGUub25jZSA9IHRydWU7XHJcblxyXG5cdFx0cmV0dXJuIGZuO1xyXG5cclxuXHR9O1xyXG5cclxuXHRpZiAoIGxheW91dCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRpZiAoIHR5cGVvZiBsYXlvdXQuaW5wdXRzICE9PSAnb2JqZWN0JyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGZ1bGxMYXlvdXQgPSB7XHJcblx0XHRcdFx0bmFtZTogJ2ZuJyArIGZuSWQgKyssXHJcblx0XHRcdFx0dHlwZTogbm9kZVR5cGUsXHJcblx0XHRcdFx0aW5wdXRzOiBbXVxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0Zm9yICggY29uc3QgbmFtZSBpbiBsYXlvdXQgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggbmFtZSA9PT0gJ3JldHVybicgKSBjb250aW51ZTtcclxuXHJcblx0XHRcdFx0ZnVsbExheW91dC5pbnB1dHMucHVzaCgge1xyXG5cdFx0XHRcdFx0bmFtZTogbmFtZSxcclxuXHRcdFx0XHRcdHR5cGU6IGxheW91dFsgbmFtZSBdXHJcblx0XHRcdFx0fSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0bGF5b3V0ID0gZnVsbExheW91dDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Zm4uc2V0TGF5b3V0KCBsYXlvdXQgKTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gZm47XHJcblxyXG59O1xyXG5cclxuLyoqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBkZXByZWNhdGVkIHNpbmNlIHIxNjguIFVzZSB7QGxpbmsgRm59IGluc3RlYWQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7Li4uYW55fSBwYXJhbXNcclxuICogQHJldHVybnMge0Z1bmN0aW9ufVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHRzbEZuID0gKCAuLi5wYXJhbXMgKSA9PiB7IC8vIEBkZXByZWNhdGVkLCByMTY4XHJcblxyXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlRTTDogdHNsRm4oKSBoYXMgYmVlbiByZW5hbWVkIHRvIEZuKCkuJyApO1xyXG5cdHJldHVybiBGbiggLi4ucGFyYW1zICk7XHJcblxyXG59O1xyXG5cclxuLy9cclxuXHJcbmFkZE1ldGhvZENoYWluaW5nKCAndG9HbG9iYWwnLCAoIG5vZGUgKSA9PiB7XHJcblxyXG5cdG5vZGUuZ2xvYmFsID0gdHJ1ZTtcclxuXHJcblx0cmV0dXJuIG5vZGU7XHJcblxyXG59ICk7XHJcblxyXG4vL1xyXG5cclxuZXhwb3J0IGNvbnN0IHNldEN1cnJlbnRTdGFjayA9ICggc3RhY2sgKSA9PiB7XHJcblxyXG5cdGlmICggY3VycmVudFN0YWNrID09PSBzdGFjayApIHtcclxuXHJcblx0XHQvL3Rocm93IG5ldyBFcnJvciggJ1N0YWNrIGFscmVhZHkgZGVmaW5lZC4nICk7XHJcblxyXG5cdH1cclxuXHJcblx0Y3VycmVudFN0YWNrID0gc3RhY2s7XHJcblxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGdldEN1cnJlbnRTdGFjayA9ICgpID0+IGN1cnJlbnRTdGFjaztcclxuXHJcbmV4cG9ydCBjb25zdCBJZiA9ICggLi4ucGFyYW1zICkgPT4gY3VycmVudFN0YWNrLklmKCAuLi5wYXJhbXMgKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhcHBlbmQoIG5vZGUgKSB7XHJcblxyXG5cdGlmICggY3VycmVudFN0YWNrICkgY3VycmVudFN0YWNrLmFkZCggbm9kZSApO1xyXG5cclxuXHRyZXR1cm4gbm9kZTtcclxuXHJcbn1cclxuXHJcbmFkZE1ldGhvZENoYWluaW5nKCAnYXBwZW5kJywgYXBwZW5kICk7XHJcblxyXG4vLyB0eXBlc1xyXG5cclxuZXhwb3J0IGNvbnN0IGNvbG9yID0gbmV3IENvbnZlcnRUeXBlKCAnY29sb3InICk7XHJcblxyXG5leHBvcnQgY29uc3QgZmxvYXQgPSBuZXcgQ29udmVydFR5cGUoICdmbG9hdCcsIGNhY2hlTWFwcy5mbG9hdCApO1xyXG5leHBvcnQgY29uc3QgaW50ID0gbmV3IENvbnZlcnRUeXBlKCAnaW50JywgY2FjaGVNYXBzLmludHMgKTtcclxuZXhwb3J0IGNvbnN0IHVpbnQgPSBuZXcgQ29udmVydFR5cGUoICd1aW50JywgY2FjaGVNYXBzLnVpbnQgKTtcclxuZXhwb3J0IGNvbnN0IGJvb2wgPSBuZXcgQ29udmVydFR5cGUoICdib29sJywgY2FjaGVNYXBzLmJvb2wgKTtcclxuXHJcbmV4cG9ydCBjb25zdCB2ZWMyID0gbmV3IENvbnZlcnRUeXBlKCAndmVjMicgKTtcclxuZXhwb3J0IGNvbnN0IGl2ZWMyID0gbmV3IENvbnZlcnRUeXBlKCAnaXZlYzInICk7XHJcbmV4cG9ydCBjb25zdCB1dmVjMiA9IG5ldyBDb252ZXJ0VHlwZSggJ3V2ZWMyJyApO1xyXG5leHBvcnQgY29uc3QgYnZlYzIgPSBuZXcgQ29udmVydFR5cGUoICdidmVjMicgKTtcclxuXHJcbmV4cG9ydCBjb25zdCB2ZWMzID0gbmV3IENvbnZlcnRUeXBlKCAndmVjMycgKTtcclxuZXhwb3J0IGNvbnN0IGl2ZWMzID0gbmV3IENvbnZlcnRUeXBlKCAnaXZlYzMnICk7XHJcbmV4cG9ydCBjb25zdCB1dmVjMyA9IG5ldyBDb252ZXJ0VHlwZSggJ3V2ZWMzJyApO1xyXG5leHBvcnQgY29uc3QgYnZlYzMgPSBuZXcgQ29udmVydFR5cGUoICdidmVjMycgKTtcclxuXHJcbmV4cG9ydCBjb25zdCB2ZWM0ID0gbmV3IENvbnZlcnRUeXBlKCAndmVjNCcgKTtcclxuZXhwb3J0IGNvbnN0IGl2ZWM0ID0gbmV3IENvbnZlcnRUeXBlKCAnaXZlYzQnICk7XHJcbmV4cG9ydCBjb25zdCB1dmVjNCA9IG5ldyBDb252ZXJ0VHlwZSggJ3V2ZWM0JyApO1xyXG5leHBvcnQgY29uc3QgYnZlYzQgPSBuZXcgQ29udmVydFR5cGUoICdidmVjNCcgKTtcclxuXHJcbmV4cG9ydCBjb25zdCBtYXQyID0gbmV3IENvbnZlcnRUeXBlKCAnbWF0MicgKTtcclxuZXhwb3J0IGNvbnN0IG1hdDMgPSBuZXcgQ29udmVydFR5cGUoICdtYXQzJyApO1xyXG5leHBvcnQgY29uc3QgbWF0NCA9IG5ldyBDb252ZXJ0VHlwZSggJ21hdDQnICk7XHJcblxyXG5leHBvcnQgY29uc3Qgc3RyaW5nID0gKCB2YWx1ZSA9ICcnICkgPT4gbm9kZU9iamVjdCggbmV3IENvbnN0Tm9kZSggdmFsdWUsICdzdHJpbmcnICkgKTtcclxuZXhwb3J0IGNvbnN0IGFycmF5QnVmZmVyID0gKCB2YWx1ZSApID0+IG5vZGVPYmplY3QoIG5ldyBDb25zdE5vZGUoIHZhbHVlLCAnQXJyYXlCdWZmZXInICkgKTtcclxuXHJcbmFkZE1ldGhvZENoYWluaW5nKCAndG9Db2xvcicsIGNvbG9yICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAndG9GbG9hdCcsIGZsb2F0ICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAndG9JbnQnLCBpbnQgKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICd0b1VpbnQnLCB1aW50ICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAndG9Cb29sJywgYm9vbCApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ3RvVmVjMicsIHZlYzIgKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICd0b0lWZWMyJywgaXZlYzIgKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICd0b1VWZWMyJywgdXZlYzIgKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICd0b0JWZWMyJywgYnZlYzIgKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICd0b1ZlYzMnLCB2ZWMzICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAndG9JVmVjMycsIGl2ZWMzICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAndG9VVmVjMycsIHV2ZWMzICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAndG9CVmVjMycsIGJ2ZWMzICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAndG9WZWM0JywgdmVjNCApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ3RvSVZlYzQnLCBpdmVjNCApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ3RvVVZlYzQnLCB1dmVjNCApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ3RvQlZlYzQnLCBidmVjNCApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ3RvTWF0MicsIG1hdDIgKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICd0b01hdDMnLCBtYXQzICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAndG9NYXQ0JywgbWF0NCApO1xyXG5cclxuLy8gYmFzaWMgbm9kZXNcclxuXHJcbmV4cG9ydCBjb25zdCBlbGVtZW50ID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIEFycmF5RWxlbWVudE5vZGUgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDIgKTtcclxuZXhwb3J0IGNvbnN0IGNvbnZlcnQgPSAoIG5vZGUsIHR5cGVzICkgPT4gbm9kZU9iamVjdCggbmV3IENvbnZlcnROb2RlKCBub2RlT2JqZWN0KCBub2RlICksIHR5cGVzICkgKTtcclxuZXhwb3J0IGNvbnN0IHNwbGl0ID0gKCBub2RlLCBjaGFubmVscyApID0+IG5vZGVPYmplY3QoIG5ldyBTcGxpdE5vZGUoIG5vZGVPYmplY3QoIG5vZGUgKSwgY2hhbm5lbHMgKSApO1xyXG5cclxuYWRkTWV0aG9kQ2hhaW5pbmcoICdlbGVtZW50JywgZWxlbWVudCApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ2NvbnZlcnQnLCBjb252ZXJ0ICk7XHJcbiIsImltcG9ydCBUZW1wTm9kZSBmcm9tICcuL1RlbXBOb2RlLmpzJztcclxuaW1wb3J0IHsgYWRkTWV0aG9kQ2hhaW5pbmcsIG5vZGVPYmplY3QgfSBmcm9tICcuLi90c2wvVFNMQ29yZS5qcyc7XHJcblxyXG4vKipcclxuICogQXJyYXlOb2RlIHJlcHJlc2VudHMgYSBjb2xsZWN0aW9uIG9mIG5vZGVzLCB0eXBpY2FsbHkgY3JlYXRlZCB1c2luZyB0aGUge0BsaW5rIGFycmF5fSBmdW5jdGlvbi5cclxuICogYGBganNcclxuICogY29uc3QgY29sb3JzID0gYXJyYXkoIFtcclxuICogXHR2ZWMzKCAxLCAwLCAwICksXHJcbiAqIFx0dmVjMyggMCwgMSwgMCApLFxyXG4gKiBcdHZlYzMoIDAsIDAsIDEgKVxyXG4gKiBdICk7XHJcbiAqXHJcbiAqIGNvbnN0IHJlZENvbG9yID0gdGludENvbG9ycy5lbGVtZW50KCAwICk7XHJcbiAqXHJcbiAqIEBhdWdtZW50cyBUZW1wTm9kZVxyXG4gKi9cclxuY2xhc3MgQXJyYXlOb2RlIGV4dGVuZHMgVGVtcE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdBcnJheU5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYXJyYXkgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7P3N0cmluZ30gbm9kZVR5cGUgLSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBlbGVtZW50cy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gY291bnQgLSBTaXplIG9mIHRoZSBhcnJheS5cclxuXHQgKiBAcGFyYW0gez9BcnJheTxOb2RlPn0gW3ZhbHVlcz1udWxsXSAtIEFycmF5IGRlZmF1bHQgdmFsdWVzLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBub2RlVHlwZSwgY291bnQsIHZhbHVlcyA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5vZGVUeXBlICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBcnJheSBzaXplLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY291bnQgPSBjb3VudDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFycmF5IGRlZmF1bHQgdmFsdWVzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/QXJyYXk8Tm9kZT59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudmFsdWVzID0gdmFsdWVzO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0FycmF5Tm9kZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgbm9kZSdzIHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHR5cGUgb2YgdGhlIG5vZGUuXHJcblx0ICovXHJcblx0Z2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5vZGVUeXBlID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5ub2RlVHlwZSA9IHRoaXMudmFsdWVzWyAwIF0uZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubm9kZVR5cGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgbm9kZSdzIHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHR5cGUgb2YgdGhlIG5vZGUuXHJcblx0ICovXHJcblx0Z2V0RWxlbWVudFR5cGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBidWlsZHMgdGhlIG91dHB1dCBub2RlIGFuZCByZXR1cm5zIHRoZSByZXN1bHRpbmcgYXJyYXkgYXMgYSBzaGFkZXIgc3RyaW5nLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBnZW5lcmF0ZWQgc2hhZGVyIHN0cmluZy5cclxuXHQgKi9cclxuXHRnZW5lcmF0ZSggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCB0eXBlID0gdGhpcy5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cclxuXHRcdHJldHVybiBidWlsZGVyLmdlbmVyYXRlQXJyYXkoIHR5cGUsIHRoaXMuY291bnQsIHRoaXMudmFsdWVzICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEFycmF5Tm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGFuIGFycmF5IG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfEFycmF5PE5vZGU+fSBub2RlVHlwZU9yVmFsdWVzIC0gQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBlbGVtZW50IHR5cGUgKGUuZy4sICd2ZWMzJylcclxuICogb3IgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZGVmYXVsdCB2YWx1ZXMgKGUuZy4sIFsgdmVjMygpIF0pLlxyXG4gKiBAcGFyYW0gez9udW1iZXJ9IFtjb3VudF0gLSBTaXplIG9mIHRoZSBhcnJheS5cclxuICogQHJldHVybnMge0FycmF5Tm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBhcnJheSA9ICggLi4ucGFyYW1zICkgPT4ge1xyXG5cclxuXHRsZXQgbm9kZTtcclxuXHJcblx0aWYgKCBwYXJhbXMubGVuZ3RoID09PSAxICkge1xyXG5cclxuXHRcdGNvbnN0IHZhbHVlcyA9IHBhcmFtc1sgMCBdO1xyXG5cclxuXHRcdG5vZGUgPSBuZXcgQXJyYXlOb2RlKCBudWxsLCB2YWx1ZXMubGVuZ3RoLCB2YWx1ZXMgKTtcclxuXHJcblx0fSBlbHNlIHtcclxuXHJcblx0XHRjb25zdCBub2RlVHlwZSA9IHBhcmFtc1sgMCBdO1xyXG5cdFx0Y29uc3QgY291bnQgPSBwYXJhbXNbIDEgXTtcclxuXHJcblx0XHRub2RlID0gbmV3IEFycmF5Tm9kZSggbm9kZVR5cGUsIGNvdW50ICk7XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIG5vZGVPYmplY3QoIG5vZGUgKTtcclxuXHJcbn07XHJcblxyXG5hZGRNZXRob2RDaGFpbmluZyggJ3RvQXJyYXknLCAoIG5vZGUsIGNvdW50ICkgPT4gYXJyYXkoIEFycmF5KCBjb3VudCApLmZpbGwoIG5vZGUgKSApICk7XHJcbiIsImltcG9ydCBOb2RlIGZyb20gJy4vTm9kZS5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBub2RlIGNhbiBiZSB1c2VkIHRvIGdyb3VwIHNpbmdsZSBpbnN0YW5jZXMgb2Yge0BsaW5rIFVuaWZvcm1Ob2RlfVxyXG4gKiBhbmQgbWFuYWdlIHRoZW0gYXMgYSB1bmlmb3JtIGJ1ZmZlci5cclxuICpcclxuICogSW4gbW9zdCBjYXNlcywgdGhlIHByZWRlZmluZWQgbm9kZXMgYG9iamVjdEdyb3VwYCwgYHJlbmRlckdyb3VwYCBhbmQgYGZyYW1lR3JvdXBgXHJcbiAqIHdpbGwgYmUgdXNlZCB3aGVuIGRlZmluaW5nIHRoZSB7QGxpbmsgVW5pZm9ybU5vZGUjZ3JvdXBOb2RlfSBwcm9wZXJ0eS5cclxuICpcclxuICogLSBgb2JqZWN0R3JvdXBgOiBVbmlmb3JtIGJ1ZmZlciBwZXIgb2JqZWN0LlxyXG4gKiAtIGByZW5kZXJHcm91cGA6IFNoYXJlZCB1bmlmb3JtIGJ1ZmZlciwgdXBkYXRlZCBvbmNlIHBlciByZW5kZXIgY2FsbC5cclxuICogLSBgZnJhbWVHcm91cGA6IFNoYXJlZCB1bmlmb3JtIGJ1ZmZlciwgdXBkYXRlZCBvbmNlIHBlciBmcmFtZS5cclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVcclxuICovXHJcbmNsYXNzIFVuaWZvcm1Hcm91cE5vZGUgZXh0ZW5kcyBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnVW5pZm9ybUdyb3VwTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB1bmlmb3JtIGdyb3VwIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB1bmlmb3JtIGdyb3VwIG5vZGUuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbc2hhcmVkPWZhbHNlXSAtIFdoZXRoZXIgdGhpcyB1bmlmb3JtIGdyb3VwIG5vZGUgaXMgc2hhcmVkIG9yIG5vdC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW29yZGVyPTFdIC0gSW5mbHVlbmNlcyB0aGUgaW50ZXJuYWwgc29ydGluZy5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbmFtZSwgc2hhcmVkID0gZmFsc2UsIG9yZGVyID0gMSApIHtcclxuXHJcblx0XHRzdXBlciggJ3N0cmluZycgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBuYW1lIG9mIHRoZSB1bmlmb3JtIGdyb3VwIG5vZGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5uYW1lID0gbmFtZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhpcyB1bmlmb3JtIGdyb3VwIG5vZGUgaXMgc2hhcmVkIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2hhcmVkID0gc2hhcmVkO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSW5mbHVlbmNlcyB0aGUgaW50ZXJuYWwgc29ydGluZy5cclxuXHRcdCAqIFRPRE86IEFkZCBkZXRhaWxzIHdoZW4gdGhpcyBwcm9wZXJ0eSBzaG91bGQgYmUgY2hhbmdlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm9yZGVyID0gb3JkZXI7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzVW5pZm9ybUdyb3VwID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHRzZXJpYWxpemUoIGRhdGEgKSB7XHJcblxyXG5cdFx0c3VwZXIuc2VyaWFsaXplKCBkYXRhICk7XHJcblxyXG5cdFx0ZGF0YS5uYW1lID0gdGhpcy5uYW1lO1xyXG5cdFx0ZGF0YS52ZXJzaW9uID0gdGhpcy52ZXJzaW9uO1xyXG5cdFx0ZGF0YS5zaGFyZWQgPSB0aGlzLnNoYXJlZDtcclxuXHJcblx0fVxyXG5cclxuXHRkZXNlcmlhbGl6ZSggZGF0YSApIHtcclxuXHJcblx0XHRzdXBlci5kZXNlcmlhbGl6ZSggZGF0YSApO1xyXG5cclxuXHRcdHRoaXMubmFtZSA9IGRhdGEubmFtZTtcclxuXHRcdHRoaXMudmVyc2lvbiA9IGRhdGEudmVyc2lvbjtcclxuXHRcdHRoaXMuc2hhcmVkID0gZGF0YS5zaGFyZWQ7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFVuaWZvcm1Hcm91cE5vZGU7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIHVuaWZvcm0gZ3JvdXAgbm9kZSB3aXRoIHRoZSBnaXZlbiBuYW1lLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB1bmlmb3JtIGdyb3VwIG5vZGUuXHJcbiAqIEByZXR1cm5zIHtVbmlmb3JtR3JvdXBOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHVuaWZvcm1Hcm91cCA9ICggbmFtZSApID0+IG5ldyBVbmlmb3JtR3JvdXBOb2RlKCBuYW1lICk7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIHNoYXJlZCB1bmlmb3JtIGdyb3VwIG5vZGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgb3JkZXIuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHVuaWZvcm0gZ3JvdXAgbm9kZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtvcmRlcj0wXSAtIEluZmx1ZW5jZXMgdGhlIGludGVybmFsIHNvcnRpbmcuXHJcbiAqIEByZXR1cm5zIHtVbmlmb3JtR3JvdXBOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHNoYXJlZFVuaWZvcm1Hcm91cCA9ICggbmFtZSwgb3JkZXIgPSAwICkgPT4gbmV3IFVuaWZvcm1Hcm91cE5vZGUoIG5hbWUsIHRydWUsIG9yZGVyICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgYSBzaGFyZWQgdW5pZm9ybSBncm91cCBub2RlIHdoaWNoIGlzIHVwZGF0ZWQgb25jZSBwZXIgZnJhbWUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1VuaWZvcm1Hcm91cE5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZnJhbWVHcm91cCA9IC8qQF9fUFVSRV9fKi8gc2hhcmVkVW5pZm9ybUdyb3VwKCAnZnJhbWUnICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgYSBzaGFyZWQgdW5pZm9ybSBncm91cCBub2RlIHdoaWNoIGlzIHVwZGF0ZWQgb25jZSBwZXIgcmVuZGVyLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtVbmlmb3JtR3JvdXBOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHJlbmRlckdyb3VwID0gLypAX19QVVJFX18qLyBzaGFyZWRVbmlmb3JtR3JvdXAoICdyZW5kZXInICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgYSB1bmlmb3JtIGdyb3VwIG5vZGUgd2hpY2ggaXMgdXBkYXRlZCBvbmNlIHBlciBvYmplY3QuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1VuaWZvcm1Hcm91cE5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgb2JqZWN0R3JvdXAgPSAvKkBfX1BVUkVfXyovIHVuaWZvcm1Hcm91cCggJ29iamVjdCcgKTtcclxuIiwiaW1wb3J0IElucHV0Tm9kZSBmcm9tICcuL0lucHV0Tm9kZS5qcyc7XHJcbmltcG9ydCB7IG9iamVjdEdyb3VwIH0gZnJvbSAnLi9Vbmlmb3JtR3JvdXBOb2RlLmpzJztcclxuaW1wb3J0IHsgbm9kZU9iamVjdCwgZ2V0Q29uc3ROb2RlVHlwZSB9IGZyb20gJy4uL3RzbC9UU0xDb3JlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBDbGFzcyBmb3IgcmVwcmVzZW50aW5nIGEgdW5pZm9ybS5cclxuICpcclxuICogQGF1Z21lbnRzIElucHV0Tm9kZVxyXG4gKi9cclxuY2xhc3MgVW5pZm9ybU5vZGUgZXh0ZW5kcyBJbnB1dE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdVbmlmb3JtTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB1bmlmb3JtIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBUaGUgdmFsdWUgb2YgdGhpcyBub2RlLiBVc3VhbGx5IGEgSlMgcHJpbWl0aXZlIG9yIHRocmVlLmpzIG9iamVjdCAodmVjdG9yLCBtYXRyaXgsIGNvbG9yLCB0ZXh0dXJlKS5cclxuXHQgKiBAcGFyYW0gez9zdHJpbmd9IG5vZGVUeXBlIC0gVGhlIG5vZGUgdHlwZS4gSWYgbm8gZXhwbGljaXQgdHlwZSBpcyBkZWZpbmVkLCB0aGUgbm9kZSB0cmllcyB0byBkZXJpdmUgdGhlIHR5cGUgZnJvbSBpdHMgdmFsdWUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHZhbHVlLCBub2RlVHlwZSA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoIHZhbHVlLCBub2RlVHlwZSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1VuaWZvcm1Ob2RlID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBuYW1lIG9yIGxhYmVsIG9mIHRoZSB1bmlmb3JtLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKiBAZGVmYXVsdCAnJ1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5hbWUgPSAnJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB1bmlmb3JtIGdyb3VwIG9mIHRoaXMgdW5pZm9ybS4gQnkgZGVmYXVsdCwgdW5pZm9ybXMgYXJlXHJcblx0XHQgKiBtYW5hZ2VkIHBlciBvYmplY3QgYnV0IHRoZXkgbWlnaHQgYmVsb25nIHRvIGEgc2hhcmVkIGdyb3VwXHJcblx0XHQgKiB3aGljaCBpcyB1cGRhdGVkIHBlciBmcmFtZSBvciByZW5kZXIgY2FsbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VW5pZm9ybUdyb3VwTm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ncm91cE5vZGUgPSBvYmplY3RHcm91cDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB7QGxpbmsgVW5pZm9ybU5vZGUjbmFtZX0gcHJvcGVydHkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB1bmlmb3JtLlxyXG5cdCAqIEByZXR1cm4ge1VuaWZvcm1Ob2RlfSBBIHJlZmVyZW5jZSB0byB0aGlzIG5vZGUuXHJcblx0ICovXHJcblx0bGFiZWwoIG5hbWUgKSB7XHJcblxyXG5cdFx0dGhpcy5uYW1lID0gbmFtZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB7QGxpbmsgVW5pZm9ybU5vZGUjZ3JvdXBOb2RlfSBwcm9wZXJ0eS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VW5pZm9ybUdyb3VwTm9kZX0gZ3JvdXAgLSBUaGUgdW5pZm9ybSBncm91cC5cclxuXHQgKiBAcmV0dXJuIHtVbmlmb3JtTm9kZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBub2RlLlxyXG5cdCAqL1xyXG5cdHNldEdyb3VwKCBncm91cCApIHtcclxuXHJcblx0XHR0aGlzLmdyb3VwTm9kZSA9IGdyb3VwO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHtAbGluayBVbmlmb3JtTm9kZSNncm91cE5vZGV9LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7VW5pZm9ybUdyb3VwTm9kZX0gVGhlIHVuaWZvcm0gZ3JvdXAuXHJcblx0ICovXHJcblx0Z2V0R3JvdXAoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZ3JvdXBOb2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEJ5IGRlZmF1bHQsIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHJlc3VsdCBvZiB7QGxpbmsgTm9kZSNnZXRIYXNofSBidXQgZGVyaXZlZFxyXG5cdCAqIGNsYXNzZXMgbWlnaHQgb3ZlcndyaXRlIHRoaXMgbWV0aG9kIHdpdGggYSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHVuaWZvcm0gaGFzaC5cclxuXHQgKi9cclxuXHRnZXRVbmlmb3JtSGFzaCggYnVpbGRlciApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5nZXRIYXNoKCBidWlsZGVyICk7XHJcblxyXG5cdH1cclxuXHJcblx0b25VcGRhdGUoIGNhbGxiYWNrLCB1cGRhdGVUeXBlICkge1xyXG5cclxuXHRcdGNvbnN0IHNlbGYgPSB0aGlzLmdldFNlbGYoKTtcclxuXHJcblx0XHRjYWxsYmFjayA9IGNhbGxiYWNrLmJpbmQoIHNlbGYgKTtcclxuXHJcblx0XHRyZXR1cm4gc3VwZXIub25VcGRhdGUoICggZnJhbWUgKSA9PiB7XHJcblxyXG5cdFx0XHRjb25zdCB2YWx1ZSA9IGNhbGxiYWNrKCBmcmFtZSwgc2VsZiApO1xyXG5cclxuXHRcdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLnZhbHVlID0gdmFsdWU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdCBcdH0sIHVwZGF0ZVR5cGUgKTtcclxuXHJcblx0fVxyXG5cclxuXHRnZW5lcmF0ZSggYnVpbGRlciwgb3V0cHV0ICkge1xyXG5cclxuXHRcdGNvbnN0IHR5cGUgPSB0aGlzLmdldE5vZGVUeXBlKCBidWlsZGVyICk7XHJcblxyXG5cdFx0Y29uc3QgaGFzaCA9IHRoaXMuZ2V0VW5pZm9ybUhhc2goIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRsZXQgc2hhcmVkTm9kZSA9IGJ1aWxkZXIuZ2V0Tm9kZUZyb21IYXNoKCBoYXNoICk7XHJcblxyXG5cdFx0aWYgKCBzaGFyZWROb2RlID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRidWlsZGVyLnNldEhhc2hOb2RlKCB0aGlzLCBoYXNoICk7XHJcblxyXG5cdFx0XHRzaGFyZWROb2RlID0gdGhpcztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3Qgc2hhcmVkTm9kZVR5cGUgPSBzaGFyZWROb2RlLmdldElucHV0VHlwZSggYnVpbGRlciApO1xyXG5cclxuXHRcdGNvbnN0IG5vZGVVbmlmb3JtID0gYnVpbGRlci5nZXRVbmlmb3JtRnJvbU5vZGUoIHNoYXJlZE5vZGUsIHNoYXJlZE5vZGVUeXBlLCBidWlsZGVyLnNoYWRlclN0YWdlLCB0aGlzLm5hbWUgfHwgYnVpbGRlci5jb250ZXh0LmxhYmVsICk7XHJcblx0XHRjb25zdCBwcm9wZXJ0eU5hbWUgPSBidWlsZGVyLmdldFByb3BlcnR5TmFtZSggbm9kZVVuaWZvcm0gKTtcclxuXHJcblx0XHRpZiAoIGJ1aWxkZXIuY29udGV4dC5sYWJlbCAhPT0gdW5kZWZpbmVkICkgZGVsZXRlIGJ1aWxkZXIuY29udGV4dC5sYWJlbDtcclxuXHJcblx0XHRyZXR1cm4gYnVpbGRlci5mb3JtYXQoIHByb3BlcnR5TmFtZSwgdHlwZSwgb3V0cHV0ICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFVuaWZvcm1Ob2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSB1bmlmb3JtIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7YW55fSBhcmcxIC0gVGhlIHZhbHVlIG9mIHRoaXMgbm9kZS4gVXN1YWxseSBhIEpTIHByaW1pdGl2ZSBvciB0aHJlZS5qcyBvYmplY3QgKHZlY3RvciwgbWF0cml4LCBjb2xvciwgdGV4dHVyZSkuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJnMl0gLSBUaGUgbm9kZSB0eXBlLiBJZiBubyBleHBsaWNpdCB0eXBlIGlzIGRlZmluZWQsIHRoZSBub2RlIHRyaWVzIHRvIGRlcml2ZSB0aGUgdHlwZSBmcm9tIGl0cyB2YWx1ZS5cclxuICogQHJldHVybnMge1VuaWZvcm1Ob2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHVuaWZvcm0gPSAoIGFyZzEsIGFyZzIgKSA9PiB7XHJcblxyXG5cdGNvbnN0IG5vZGVUeXBlID0gZ2V0Q29uc3ROb2RlVHlwZSggYXJnMiB8fCBhcmcxICk7XHJcblxyXG5cdC8vIEBUT0RPOiBnZXQgQ29uc3ROb2RlIGZyb20gLnRyYXZlcnNlKCkgaW4gdGhlIGZ1dHVyZVxyXG5cdGNvbnN0IHZhbHVlID0gKCBhcmcxICYmIGFyZzEuaXNOb2RlID09PSB0cnVlICkgPyAoIGFyZzEubm9kZSAmJiBhcmcxLm5vZGUudmFsdWUgKSB8fCBhcmcxLnZhbHVlIDogYXJnMTtcclxuXHJcblx0cmV0dXJuIG5vZGVPYmplY3QoIG5ldyBVbmlmb3JtTm9kZSggdmFsdWUsIG5vZGVUeXBlICkgKTtcclxuXHJcbn07XHJcbiIsImltcG9ydCBOb2RlIGZyb20gJy4vTm9kZS5qcyc7XHJcbmltcG9ydCB7IG5vZGVJbW11dGFibGUsIG5vZGVPYmplY3QgfSBmcm9tICcuLi90c2wvVFNMQ29yZS5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgc2hhZGVyIHByb3BlcnR5LiBJdCBjYW4gYmUgdXNlZFxyXG4gKiB0byBleHBsaWNpdGx5IGRlZmluZSBhIHByb3BlcnR5IGFuZCBhc3NpZ24gYSB2YWx1ZSB0byBpdC5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgdGhyZXNob2xkID0gcHJvcGVydHkoICdmbG9hdCcsICd0aHJlc2hvbGQnICkuYXNzaWduKCBUSFJFU0hPTEQgKTtcclxuICpgYGBcclxuICogYFByb3BlcnR5Tm9kZWAgaXMgdXNlZCBieSB0aGUgZW5naW5lIHRvIHByZWRlZmluZWQgY29tbW9uIG1hdGVyaWFsIHByb3BlcnRpZXNcclxuICogZm9yIFRTTCBjb2RlLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTm9kZVxyXG4gKi9cclxuY2xhc3MgUHJvcGVydHlOb2RlIGV4dGVuZHMgTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ1Byb3BlcnR5Tm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBwcm9wZXJ0eSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5vZGVUeXBlIC0gVGhlIHR5cGUgb2YgdGhlIG5vZGUuXHJcblx0ICogQHBhcmFtIHs/c3RyaW5nfSBbbmFtZT1udWxsXSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBpbiB0aGUgc2hhZGVyLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Zhcnlpbmc9ZmFsc2VdIC0gV2hldGhlciB0aGlzIHByb3BlcnR5IGlzIGEgdmFyeWluZyBvciBub3QuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5vZGVUeXBlLCBuYW1lID0gbnVsbCwgdmFyeWluZyA9IGZhbHNlICkge1xyXG5cclxuXHRcdHN1cGVyKCBub2RlVHlwZSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGluIHRoZSBzaGFkZXIuIElmIG5vIG5hbWUgaXMgZGVmaW5lZCxcclxuXHRcdCAqIHRoZSBub2RlIHN5c3RlbSBhdXRvLWdlbmVyYXRlcyBvbmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9zdHJpbmd9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubmFtZSA9IG5hbWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoaXMgcHJvcGVydHkgaXMgYSB2YXJ5aW5nIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudmFyeWluZyA9IHZhcnlpbmc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzUHJvcGVydHlOb2RlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHRnZXRIYXNoKCBidWlsZGVyICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm5hbWUgfHwgc3VwZXIuZ2V0SGFzaCggYnVpbGRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBtZXRob2QgaXMgb3ZlcndyaXR0ZW4gc28gaXQgYWx3YXlzIHJldHVybnMgYHRydWVgLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoaXMgbm9kZSBpcyBnbG9iYWwgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGlzR2xvYmFsKCAvKmJ1aWxkZXIqLyApIHtcclxuXHJcblx0XHRyZXR1cm4gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHRnZW5lcmF0ZSggYnVpbGRlciApIHtcclxuXHJcblx0XHRsZXQgbm9kZVZhcjtcclxuXHJcblx0XHRpZiAoIHRoaXMudmFyeWluZyA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdG5vZGVWYXIgPSBidWlsZGVyLmdldFZhcnlpbmdGcm9tTm9kZSggdGhpcywgdGhpcy5uYW1lICk7XHJcblx0XHRcdG5vZGVWYXIubmVlZHNJbnRlcnBvbGF0aW9uID0gdHJ1ZTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0bm9kZVZhciA9IGJ1aWxkZXIuZ2V0VmFyRnJvbU5vZGUoIHRoaXMsIHRoaXMubmFtZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gYnVpbGRlci5nZXRQcm9wZXJ0eU5hbWUoIG5vZGVWYXIgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUHJvcGVydHlOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSBwcm9wZXJ0eSBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSB0eXBlIG9mIHRoZSBub2RlLlxyXG4gKiBAcGFyYW0gez9zdHJpbmd9IFtuYW1lPW51bGxdIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGluIHRoZSBzaGFkZXIuXHJcbiAqIEByZXR1cm5zIHtQcm9wZXJ0eU5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcHJvcGVydHkgPSAoIHR5cGUsIG5hbWUgKSA9PiBub2RlT2JqZWN0KCBuZXcgUHJvcGVydHlOb2RlKCB0eXBlLCBuYW1lICkgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgdmFyeWluZyBwcm9wZXJ0eSBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSB0eXBlIG9mIHRoZSBub2RlLlxyXG4gKiBAcGFyYW0gez9zdHJpbmd9IFtuYW1lPW51bGxdIC0gVGhlIG5hbWUgb2YgdGhlIHZhcnlpbmcgaW4gdGhlIHNoYWRlci5cclxuICogQHJldHVybnMge1Byb3BlcnR5Tm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCB2YXJ5aW5nUHJvcGVydHkgPSAoIHR5cGUsIG5hbWUgKSA9PiBub2RlT2JqZWN0KCBuZXcgUHJvcGVydHlOb2RlKCB0eXBlLCBuYW1lLCB0cnVlICkgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgc2hhZGVyIHZhcmlhYmxlIGBEaWZmdXNlQ29sb3JgLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtQcm9wZXJ0eU5vZGU8dmVjND59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZGlmZnVzZUNvbG9yID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBQcm9wZXJ0eU5vZGUsICd2ZWM0JywgJ0RpZmZ1c2VDb2xvcicgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgc2hhZGVyIHZhcmlhYmxlIGBFbWlzc2l2ZUNvbG9yYC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7UHJvcGVydHlOb2RlPHZlYzM+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGVtaXNzaXZlID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBQcm9wZXJ0eU5vZGUsICd2ZWMzJywgJ0VtaXNzaXZlQ29sb3InICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHNoYWRlciB2YXJpYWJsZSBgUm91Z2huZXNzYC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7UHJvcGVydHlOb2RlPGZsb2F0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCByb3VnaG5lc3MgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIFByb3BlcnR5Tm9kZSwgJ2Zsb2F0JywgJ1JvdWdobmVzcycgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgc2hhZGVyIHZhcmlhYmxlIGBNZXRhbG5lc3NgLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtQcm9wZXJ0eU5vZGU8ZmxvYXQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG1ldGFsbmVzcyA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggUHJvcGVydHlOb2RlLCAnZmxvYXQnLCAnTWV0YWxuZXNzJyApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBzaGFkZXIgdmFyaWFibGUgYENsZWFyY29hdGAuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1Byb3BlcnR5Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgY2xlYXJjb2F0ID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBQcm9wZXJ0eU5vZGUsICdmbG9hdCcsICdDbGVhcmNvYXQnICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHNoYWRlciB2YXJpYWJsZSBgQ2xlYXJjb2F0Um91Z2huZXNzYC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7UHJvcGVydHlOb2RlPGZsb2F0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBjbGVhcmNvYXRSb3VnaG5lc3MgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIFByb3BlcnR5Tm9kZSwgJ2Zsb2F0JywgJ0NsZWFyY29hdFJvdWdobmVzcycgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgc2hhZGVyIHZhcmlhYmxlIGBTaGVlbmAuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1Byb3BlcnR5Tm9kZTx2ZWMzPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBzaGVlbiA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggUHJvcGVydHlOb2RlLCAndmVjMycsICdTaGVlbicgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgc2hhZGVyIHZhcmlhYmxlIGBTaGVlblJvdWdobmVzc2AuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1Byb3BlcnR5Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgc2hlZW5Sb3VnaG5lc3MgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIFByb3BlcnR5Tm9kZSwgJ2Zsb2F0JywgJ1NoZWVuUm91Z2huZXNzJyApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBzaGFkZXIgdmFyaWFibGUgYElyaWRlc2NlbmNlYC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7UHJvcGVydHlOb2RlPGZsb2F0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBpcmlkZXNjZW5jZSA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggUHJvcGVydHlOb2RlLCAnZmxvYXQnLCAnSXJpZGVzY2VuY2UnICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHNoYWRlciB2YXJpYWJsZSBgSXJpZGVzY2VuY2VJT1JgLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtQcm9wZXJ0eU5vZGU8ZmxvYXQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGlyaWRlc2NlbmNlSU9SID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBQcm9wZXJ0eU5vZGUsICdmbG9hdCcsICdJcmlkZXNjZW5jZUlPUicgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgc2hhZGVyIHZhcmlhYmxlIGBJcmlkZXNjZW5jZVRoaWNrbmVzc2AuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1Byb3BlcnR5Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgaXJpZGVzY2VuY2VUaGlja25lc3MgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIFByb3BlcnR5Tm9kZSwgJ2Zsb2F0JywgJ0lyaWRlc2NlbmNlVGhpY2tuZXNzJyApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBzaGFkZXIgdmFyaWFibGUgYEFscGhhVGAuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1Byb3BlcnR5Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYWxwaGFUID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBQcm9wZXJ0eU5vZGUsICdmbG9hdCcsICdBbHBoYVQnICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHNoYWRlciB2YXJpYWJsZSBgQW5pc290cm9weWAuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1Byb3BlcnR5Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYW5pc290cm9weSA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggUHJvcGVydHlOb2RlLCAnZmxvYXQnLCAnQW5pc290cm9weScgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgc2hhZGVyIHZhcmlhYmxlIGBBbmlzb3Ryb3B5VGAuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1Byb3BlcnR5Tm9kZTx2ZWMzPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBhbmlzb3Ryb3B5VCA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggUHJvcGVydHlOb2RlLCAndmVjMycsICdBbmlzb3Ryb3B5VCcgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgc2hhZGVyIHZhcmlhYmxlIGBBbmlzb3Ryb3B5QmAuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1Byb3BlcnR5Tm9kZTx2ZWMzPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBhbmlzb3Ryb3B5QiA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggUHJvcGVydHlOb2RlLCAndmVjMycsICdBbmlzb3Ryb3B5QicgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgc2hhZGVyIHZhcmlhYmxlIGBTcGVjdWxhckNvbG9yYC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7UHJvcGVydHlOb2RlPGNvbG9yPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBzcGVjdWxhckNvbG9yID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBQcm9wZXJ0eU5vZGUsICdjb2xvcicsICdTcGVjdWxhckNvbG9yJyApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBzaGFkZXIgdmFyaWFibGUgYFNwZWN1bGFyRjkwYC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7UHJvcGVydHlOb2RlPGZsb2F0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBzcGVjdWxhckY5MCA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggUHJvcGVydHlOb2RlLCAnZmxvYXQnLCAnU3BlY3VsYXJGOTAnICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHNoYWRlciB2YXJpYWJsZSBgU2hpbmluZXNzYC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7UHJvcGVydHlOb2RlPGZsb2F0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBzaGluaW5lc3MgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIFByb3BlcnR5Tm9kZSwgJ2Zsb2F0JywgJ1NoaW5pbmVzcycgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgc2hhZGVyIHZhcmlhYmxlIGBPdXRwdXRgLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtQcm9wZXJ0eU5vZGU8dmVjND59XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgb3V0cHV0ID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBQcm9wZXJ0eU5vZGUsICd2ZWM0JywgJ091dHB1dCcgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgc2hhZGVyIHZhcmlhYmxlIGBkYXNoU2l6ZWAuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1Byb3BlcnR5Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZGFzaFNpemUgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIFByb3BlcnR5Tm9kZSwgJ2Zsb2F0JywgJ2Rhc2hTaXplJyApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBzaGFkZXIgdmFyaWFibGUgYGdhcFNpemVgLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtQcm9wZXJ0eU5vZGU8ZmxvYXQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGdhcFNpemUgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIFByb3BlcnR5Tm9kZSwgJ2Zsb2F0JywgJ2dhcFNpemUnICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHNoYWRlciB2YXJpYWJsZSBgcG9pbnRXaWR0aGAuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1Byb3BlcnR5Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcG9pbnRXaWR0aCA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggUHJvcGVydHlOb2RlLCAnZmxvYXQnLCAncG9pbnRXaWR0aCcgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgc2hhZGVyIHZhcmlhYmxlIGBJT1JgLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtQcm9wZXJ0eU5vZGU8ZmxvYXQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGlvciA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggUHJvcGVydHlOb2RlLCAnZmxvYXQnLCAnSU9SJyApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBzaGFkZXIgdmFyaWFibGUgYFRyYW5zbWlzc2lvbmAuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1Byb3BlcnR5Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdHJhbnNtaXNzaW9uID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBQcm9wZXJ0eU5vZGUsICdmbG9hdCcsICdUcmFuc21pc3Npb24nICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHNoYWRlciB2YXJpYWJsZSBgVGhpY2tuZXNzYC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7UHJvcGVydHlOb2RlPGZsb2F0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCB0aGlja25lc3MgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIFByb3BlcnR5Tm9kZSwgJ2Zsb2F0JywgJ1RoaWNrbmVzcycgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgc2hhZGVyIHZhcmlhYmxlIGBBdHRlbnVhdGlvbkRpc3RhbmNlYC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7UHJvcGVydHlOb2RlPGZsb2F0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBhdHRlbnVhdGlvbkRpc3RhbmNlID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBQcm9wZXJ0eU5vZGUsICdmbG9hdCcsICdBdHRlbnVhdGlvbkRpc3RhbmNlJyApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBzaGFkZXIgdmFyaWFibGUgYEF0dGVudWF0aW9uQ29sb3JgLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtQcm9wZXJ0eU5vZGU8Y29sb3I+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGF0dGVudWF0aW9uQ29sb3IgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIFByb3BlcnR5Tm9kZSwgJ2NvbG9yJywgJ0F0dGVudWF0aW9uQ29sb3InICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHNoYWRlciB2YXJpYWJsZSBgRGlzcGVyc2lvbmAuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1Byb3BlcnR5Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZGlzcGVyc2lvbiA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggUHJvcGVydHlOb2RlLCAnZmxvYXQnLCAnRGlzcGVyc2lvbicgKTtcclxuIiwiaW1wb3J0IFRlbXBOb2RlIGZyb20gJy4uL2NvcmUvVGVtcE5vZGUuanMnO1xyXG5pbXBvcnQgeyBhZGRNZXRob2RDaGFpbmluZywgbm9kZVByb3h5IH0gZnJvbSAnLi4vdHNsL1RTTENvcmUuanMnO1xyXG5pbXBvcnQgeyB2ZWN0b3JDb21wb25lbnRzIH0gZnJvbSAnLi4vY29yZS9jb25zdGFudHMuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRoZXNlIG5vZGUgcmVwcmVzZW50cyBhbiBhc3NpZ24gb3BlcmF0aW9uLiBNZWFuaW5nIGEgbm9kZSBpcyBhc3NpZ25lZFxyXG4gKiB0byBhbm90aGVyIG5vZGUuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBUZW1wTm9kZVxyXG4gKi9cclxuY2xhc3MgQXNzaWduTm9kZSBleHRlbmRzIFRlbXBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnQXNzaWduTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBhc3NpZ24gbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0Tm9kZSAtIFRoZSB0YXJnZXQgbm9kZS5cclxuXHQgKiBAcGFyYW0ge05vZGV9IHNvdXJjZU5vZGUgLSBUaGUgc291cmNlIHR5cGUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHRhcmdldE5vZGUsIHNvdXJjZU5vZGUgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB0YXJnZXQgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50YXJnZXROb2RlID0gdGFyZ2V0Tm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBzb3VyY2Ugbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zb3VyY2VOb2RlID0gc291cmNlTm9kZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBXaGV0aGVyIHRoaXMgbm9kZSBpcyB1c2VkIG1vcmUgdGhhbiBvbmNlIGluIGNvbnRleHQgb2Ygb3RoZXIgbm9kZXMuIFRoaXMgbWV0aG9kXHJcblx0ICogaXMgb3ZlcndyaXR0ZW4gc2luY2UgaXQgYWx3YXlzIHJldHVybnMgYGZhbHNlYCAoYXNzaWducyBhcmUgdW5pcXVlKS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IEEgZmxhZyB0aGF0IGluZGljYXRlcyBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGRlcGVuZGVuY3kgdG8gb3RoZXIgbm9kZXMuIEFsd2F5cyBgZmFsc2VgLlxyXG5cdCAqL1xyXG5cdGhhc0RlcGVuZGVuY2llcygpIHtcclxuXHJcblx0XHRyZXR1cm4gZmFsc2U7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0Tm9kZVR5cGUoIGJ1aWxkZXIsIG91dHB1dCApIHtcclxuXHJcblx0XHRyZXR1cm4gb3V0cHV0ICE9PSAndm9pZCcgPyB0aGlzLnRhcmdldE5vZGUuZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKSA6ICd2b2lkJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBXaGV0aGVyIGEgc3BsaXQgaXMgcmVxdWlyZWQgd2hlbiBhc3NpZ25pbmcgc291cmNlIHRvIHRhcmdldC4gVGhpcyBjYW4gaGFwcGVuIHdoZW4gdGhlIGNvbXBvbmVudCBsZW5ndGggb2ZcclxuXHQgKiB0YXJnZXQgYW5kIHNvdXJjZSBkYXRhIHR5cGUgZG9lcyBub3QgbWF0Y2guXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgYSBzcGxpdCBpcyByZXF1aXJlZCB3aGVuIGFzc2lnbmluZyBzb3VyY2UgdG8gdGFyZ2V0LlxyXG5cdCAqL1xyXG5cdG5lZWRzU3BsaXRBc3NpZ24oIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyB0YXJnZXROb2RlIH0gPSB0aGlzO1xyXG5cclxuXHRcdGlmICggYnVpbGRlci5pc0F2YWlsYWJsZSggJ3N3aXp6bGVBc3NpZ24nICkgPT09IGZhbHNlICYmIHRhcmdldE5vZGUuaXNTcGxpdE5vZGUgJiYgdGFyZ2V0Tm9kZS5jb21wb25lbnRzLmxlbmd0aCA+IDEgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB0YXJnZXRMZW5ndGggPSBidWlsZGVyLmdldFR5cGVMZW5ndGgoIHRhcmdldE5vZGUubm9kZS5nZXROb2RlVHlwZSggYnVpbGRlciApICk7XHJcblx0XHRcdGNvbnN0IGFzc2lnbkRpZmZlcmVudFZlY3RvciA9IHZlY3RvckNvbXBvbmVudHMuam9pbiggJycgKS5zbGljZSggMCwgdGFyZ2V0TGVuZ3RoICkgIT09IHRhcmdldE5vZGUuY29tcG9uZW50cztcclxuXHJcblx0XHRcdHJldHVybiBhc3NpZ25EaWZmZXJlbnRWZWN0b3I7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBmYWxzZTtcclxuXHJcblx0fVxyXG5cclxuXHRnZW5lcmF0ZSggYnVpbGRlciwgb3V0cHV0ICkge1xyXG5cclxuXHRcdGNvbnN0IHsgdGFyZ2V0Tm9kZSwgc291cmNlTm9kZSB9ID0gdGhpcztcclxuXHJcblx0XHRjb25zdCBuZWVkc1NwbGl0QXNzaWduID0gdGhpcy5uZWVkc1NwbGl0QXNzaWduKCBidWlsZGVyICk7XHJcblxyXG5cdFx0Y29uc3QgdGFyZ2V0VHlwZSA9IHRhcmdldE5vZGUuZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRjb25zdCB0YXJnZXQgPSB0YXJnZXROb2RlLmNvbnRleHQoIHsgYXNzaWduOiB0cnVlIH0gKS5idWlsZCggYnVpbGRlciApO1xyXG5cdFx0Y29uc3Qgc291cmNlID0gc291cmNlTm9kZS5idWlsZCggYnVpbGRlciwgdGFyZ2V0VHlwZSApO1xyXG5cclxuXHRcdGNvbnN0IHNvdXJjZVR5cGUgPSBzb3VyY2VOb2RlLmdldE5vZGVUeXBlKCBidWlsZGVyICk7XHJcblxyXG5cdFx0Y29uc3Qgbm9kZURhdGEgPSBidWlsZGVyLmdldERhdGFGcm9tTm9kZSggdGhpcyApO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0bGV0IHNuaXBwZXQ7XHJcblxyXG5cdFx0aWYgKCBub2RlRGF0YS5pbml0aWFsaXplZCA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdGlmICggb3V0cHV0ICE9PSAndm9pZCcgKSB7XHJcblxyXG5cdFx0XHRcdHNuaXBwZXQgPSB0YXJnZXQ7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmICggbmVlZHNTcGxpdEFzc2lnbiApIHtcclxuXHJcblx0XHRcdGNvbnN0IHNvdXJjZVZhciA9IGJ1aWxkZXIuZ2V0VmFyRnJvbU5vZGUoIHRoaXMsIG51bGwsIHRhcmdldFR5cGUgKTtcclxuXHRcdFx0Y29uc3Qgc291cmNlUHJvcGVydHkgPSBidWlsZGVyLmdldFByb3BlcnR5TmFtZSggc291cmNlVmFyICk7XHJcblxyXG5cdFx0XHRidWlsZGVyLmFkZExpbmVGbG93Q29kZSggYCR7IHNvdXJjZVByb3BlcnR5IH0gPSAkeyBzb3VyY2UgfWAsIHRoaXMgKTtcclxuXHJcblx0XHRcdGNvbnN0IHRhcmdldFJvb3QgPSB0YXJnZXROb2RlLm5vZGUuY29udGV4dCggeyBhc3NpZ246IHRydWUgfSApLmJ1aWxkKCBidWlsZGVyICk7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB0YXJnZXROb2RlLmNvbXBvbmVudHMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBjb21wb25lbnQgPSB0YXJnZXROb2RlLmNvbXBvbmVudHNbIGkgXTtcclxuXHJcblx0XHRcdFx0YnVpbGRlci5hZGRMaW5lRmxvd0NvZGUoIGAkeyB0YXJnZXRSb290IH0uJHsgY29tcG9uZW50IH0gPSAkeyBzb3VyY2VQcm9wZXJ0eSB9WyAkeyBpIH0gXWAsIHRoaXMgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggb3V0cHV0ICE9PSAndm9pZCcgKSB7XHJcblxyXG5cdFx0XHRcdHNuaXBwZXQgPSB0YXJnZXQ7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHNuaXBwZXQgPSBgJHsgdGFyZ2V0IH0gPSAkeyBzb3VyY2UgfWA7XHJcblxyXG5cdFx0XHRpZiAoIG91dHB1dCA9PT0gJ3ZvaWQnIHx8IHNvdXJjZVR5cGUgPT09ICd2b2lkJyApIHtcclxuXHJcblx0XHRcdFx0YnVpbGRlci5hZGRMaW5lRmxvd0NvZGUoIHNuaXBwZXQsIHRoaXMgKTtcclxuXHJcblx0XHRcdFx0aWYgKCBvdXRwdXQgIT09ICd2b2lkJyApIHtcclxuXHJcblx0XHRcdFx0XHRzbmlwcGV0ID0gdGFyZ2V0O1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdG5vZGVEYXRhLmluaXRpYWxpemVkID0gdHJ1ZTtcclxuXHJcblx0XHRyZXR1cm4gYnVpbGRlci5mb3JtYXQoIHNuaXBwZXQsIHRhcmdldFR5cGUsIG91dHB1dCApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBBc3NpZ25Ob2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYW4gYXNzaWduIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0Tm9kZSAtIFRoZSB0YXJnZXQgbm9kZS5cclxuICogQHBhcmFtIHtOb2RlfSBzb3VyY2VOb2RlIC0gVGhlIHNvdXJjZSB0eXBlLlxyXG4gKiBAcmV0dXJucyB7QXNzaWduTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBhc3NpZ24gPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggQXNzaWduTm9kZSApLnNldFBhcmFtZXRlckxlbmd0aCggMiApO1xyXG5cclxuYWRkTWV0aG9kQ2hhaW5pbmcoICdhc3NpZ24nLCBhc3NpZ24gKTtcclxuIiwiaW1wb3J0IFRlbXBOb2RlIGZyb20gJy4uL2NvcmUvVGVtcE5vZGUuanMnO1xyXG5pbXBvcnQgeyBhZGRNZXRob2RDaGFpbmluZywgbm9kZUFycmF5LCBub2RlT2JqZWN0LCBub2RlT2JqZWN0cywgZmxvYXQgfSBmcm9tICcuLi90c2wvVFNMQ29yZS5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBtb2R1bGUgcmVwcmVzZW50cyB0aGUgY2FsbCBvZiBhIHtAbGluayBGdW5jdGlvbk5vZGV9LiBEZXZlbG9wZXJzIGFyZSB1c3VhbGx5IG5vdCBjb25mcm9udGVkXHJcbiAqIHdpdGggdGhpcyBtb2R1bGUgc2luY2UgdGhleSB1c2UgdGhlIHByZWRlZmluZWQgVFNMIHN5bnRheCBgd2dzbEZuYCBhbmQgYGdsc2xGbmAgd2hpY2ggZW5jYXBzdWxhdGVcclxuICogdGhpcyBsb2dpYy5cclxuICpcclxuICogQGF1Z21lbnRzIFRlbXBOb2RlXHJcbiAqL1xyXG5jbGFzcyBGdW5jdGlvbkNhbGxOb2RlIGV4dGVuZHMgVGVtcE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdGdW5jdGlvbkNhbGxOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGZ1bmN0aW9uIGNhbGwgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7P0Z1bmN0aW9uTm9kZX0gZnVuY3Rpb25Ob2RlIC0gVGhlIGZ1bmN0aW9uIG5vZGUuXHJcblx0ICogQHBhcmFtIHtPYmplY3Q8c3RyaW5nLCBOb2RlPn0gW3BhcmFtZXRlcnM9e31dIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmdW5jdGlvbiBjYWxsLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBmdW5jdGlvbk5vZGUgPSBudWxsLCBwYXJhbWV0ZXJzID0ge30gKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBmdW5jdGlvbiBub2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/RnVuY3Rpb25Ob2RlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZ1bmN0aW9uTm9kZSA9IGZ1bmN0aW9uTm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBmdW5jdGlvbiBjYWxsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLCBOb2RlPn1cclxuXHRcdCAqIEBkZWZhdWx0IHt9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgcGFyYW1ldGVycyBvZiB0aGUgZnVuY3Rpb24gY2FsbCBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3Q8c3RyaW5nLCBOb2RlPn0gcGFyYW1ldGVycyAtIFRoZSBwYXJhbWV0ZXJzIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtGdW5jdGlvbkNhbGxOb2RlfSBBIHJlZmVyZW5jZSB0byB0aGlzIG5vZGUuXHJcblx0ICovXHJcblx0c2V0UGFyYW1ldGVycyggcGFyYW1ldGVycyApIHtcclxuXHJcblx0XHR0aGlzLnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIGZ1bmN0aW9uIGNhbGwgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge09iamVjdDxzdHJpbmcsIE5vZGU+fSBUaGUgcGFyYW1ldGVycyBvZiB0aGlzIG5vZGUuXHJcblx0ICovXHJcblx0Z2V0UGFyYW1ldGVycygpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5wYXJhbWV0ZXJzO1xyXG5cclxuXHR9XHJcblxyXG5cdGdldE5vZGVUeXBlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmZ1bmN0aW9uTm9kZS5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdGdlbmVyYXRlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IHBhcmFtcyA9IFtdO1xyXG5cclxuXHRcdGNvbnN0IGZ1bmN0aW9uTm9kZSA9IHRoaXMuZnVuY3Rpb25Ob2RlO1xyXG5cclxuXHRcdGNvbnN0IGlucHV0cyA9IGZ1bmN0aW9uTm9kZS5nZXRJbnB1dHMoIGJ1aWxkZXIgKTtcclxuXHRcdGNvbnN0IHBhcmFtZXRlcnMgPSB0aGlzLnBhcmFtZXRlcnM7XHJcblxyXG5cdFx0Y29uc3QgZ2VuZXJhdGVJbnB1dCA9ICggbm9kZSwgaW5wdXROb2RlICkgPT4ge1xyXG5cclxuXHRcdFx0Y29uc3QgdHlwZSA9IGlucHV0Tm9kZS50eXBlO1xyXG5cdFx0XHRjb25zdCBwb2ludGVyID0gdHlwZSA9PT0gJ3BvaW50ZXInO1xyXG5cclxuXHRcdFx0bGV0IG91dHB1dDtcclxuXHJcblx0XHRcdGlmICggcG9pbnRlciApIG91dHB1dCA9ICcmJyArIG5vZGUuYnVpbGQoIGJ1aWxkZXIgKTtcclxuXHRcdFx0ZWxzZSBvdXRwdXQgPSBub2RlLmJ1aWxkKCBidWlsZGVyLCB0eXBlICk7XHJcblxyXG5cdFx0XHRyZXR1cm4gb3V0cHV0O1xyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCBwYXJhbWV0ZXJzICkgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHBhcmFtZXRlcnMubGVuZ3RoID4gaW5wdXRzLmxlbmd0aCApIHtcclxuXHJcblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlRTTDogVGhlIG51bWJlciBvZiBwcm92aWRlZCBwYXJhbWV0ZXJzIGV4Y2VlZHMgdGhlIGV4cGVjdGVkIG51bWJlciBvZiBpbnB1dHMgaW4gXFwnRm4oKVxcJy4nICk7XHJcblxyXG5cdFx0XHRcdHBhcmFtZXRlcnMubGVuZ3RoID0gaW5wdXRzLmxlbmd0aDtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIHBhcmFtZXRlcnMubGVuZ3RoIDwgaW5wdXRzLmxlbmd0aCApIHtcclxuXHJcblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlRTTDogVGhlIG51bWJlciBvZiBwcm92aWRlZCBwYXJhbWV0ZXJzIGlzIGxlc3MgdGhhbiB0aGUgZXhwZWN0ZWQgbnVtYmVyIG9mIGlucHV0cyBpbiBcXCdGbigpXFwnLicgKTtcclxuXHJcblx0XHRcdFx0d2hpbGUgKCBwYXJhbWV0ZXJzLmxlbmd0aCA8IGlucHV0cy5sZW5ndGggKSB7XHJcblxyXG5cdFx0XHRcdFx0cGFyYW1ldGVycy5wdXNoKCBmbG9hdCggMCApICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHBhcmFtZXRlcnMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRwYXJhbXMucHVzaCggZ2VuZXJhdGVJbnB1dCggcGFyYW1ldGVyc1sgaSBdLCBpbnB1dHNbIGkgXSApICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGZvciAoIGNvbnN0IGlucHV0Tm9kZSBvZiBpbnB1dHMgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IG5vZGUgPSBwYXJhbWV0ZXJzWyBpbnB1dE5vZGUubmFtZSBdO1xyXG5cclxuXHRcdFx0XHRpZiAoIG5vZGUgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRwYXJhbXMucHVzaCggZ2VuZXJhdGVJbnB1dCggbm9kZSwgaW5wdXROb2RlICkgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCBgVEhSRUUuVFNMOiBJbnB1dCAnJHsgaW5wdXROb2RlLm5hbWUgfScgbm90IGZvdW5kIGluIFxcJ0ZuKClcXCcuYCApO1xyXG5cclxuXHRcdFx0XHRcdHBhcmFtcy5wdXNoKCBnZW5lcmF0ZUlucHV0KCBmbG9hdCggMCApLCBpbnB1dE5vZGUgKSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGZ1bmN0aW9uTmFtZSA9IGZ1bmN0aW9uTm9kZS5idWlsZCggYnVpbGRlciwgJ3Byb3BlcnR5JyApO1xyXG5cclxuXHRcdHJldHVybiBgJHsgZnVuY3Rpb25OYW1lIH0oICR7IHBhcmFtcy5qb2luKCAnLCAnICkgfSApYDtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgRnVuY3Rpb25DYWxsTm9kZTtcclxuXHJcbmV4cG9ydCBjb25zdCBjYWxsID0gKCBmdW5jLCAuLi5wYXJhbXMgKSA9PiB7XHJcblxyXG5cdHBhcmFtcyA9IHBhcmFtcy5sZW5ndGggPiAxIHx8ICggcGFyYW1zWyAwIF0gJiYgcGFyYW1zWyAwIF0uaXNOb2RlID09PSB0cnVlICkgPyBub2RlQXJyYXkoIHBhcmFtcyApIDogbm9kZU9iamVjdHMoIHBhcmFtc1sgMCBdICk7XHJcblxyXG5cdHJldHVybiBub2RlT2JqZWN0KCBuZXcgRnVuY3Rpb25DYWxsTm9kZSggbm9kZU9iamVjdCggZnVuYyApLCBwYXJhbXMgKSApO1xyXG5cclxufTtcclxuXHJcbmFkZE1ldGhvZENoYWluaW5nKCAnY2FsbCcsIGNhbGwgKTtcclxuIiwiaW1wb3J0IHsgV2ViR0xDb29yZGluYXRlU3lzdGVtIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IFRlbXBOb2RlIGZyb20gJy4uL2NvcmUvVGVtcE5vZGUuanMnO1xyXG5pbXBvcnQgeyBhZGRNZXRob2RDaGFpbmluZywgaW50LCBub2RlUHJveHkgfSBmcm9tICcuLi90c2wvVFNMQ29yZS5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBub2RlIHJlcHJlc2VudHMgYmFzaWMgbWF0aGVtYXRpY2FsIGFuZCBsb2dpY2FsIG9wZXJhdGlvbnMgbGlrZSBhZGRpdGlvbixcclxuICogc3VidHJhY3Rpb24gb3IgY29tcGFyaXNvbnMgKGUuZy4gYGVxdWFsKClgKS5cclxuICpcclxuICogQGF1Z21lbnRzIFRlbXBOb2RlXHJcbiAqL1xyXG5jbGFzcyBPcGVyYXRvck5vZGUgZXh0ZW5kcyBUZW1wTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ09wZXJhdG9yTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBvcGVyYXRvciBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG9wIC0gVGhlIG9wZXJhdG9yLlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gYU5vZGUgLSBUaGUgZmlyc3QgaW5wdXQuXHJcblx0ICogQHBhcmFtIHtOb2RlfSBiTm9kZSAtIFRoZSBzZWNvbmQgaW5wdXQuXHJcblx0ICogQHBhcmFtIHsuLi5Ob2RlfSBwYXJhbXMgLSBBZGRpdGlvbmFsIGlucHV0IHBhcmFtZXRlcnMuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG9wLCBhTm9kZSwgYk5vZGUsIC4uLnBhcmFtcyApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdGlmICggcGFyYW1zLmxlbmd0aCA+IDAgKSB7XHJcblxyXG5cdFx0XHRsZXQgZmluYWxPcCA9IG5ldyBPcGVyYXRvck5vZGUoIG9wLCBhTm9kZSwgYk5vZGUgKTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGggLSAxOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRmaW5hbE9wID0gbmV3IE9wZXJhdG9yTm9kZSggb3AsIGZpbmFsT3AsIHBhcmFtc1sgaSBdICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRhTm9kZSA9IGZpbmFsT3A7XHJcblx0XHRcdGJOb2RlID0gcGFyYW1zWyBwYXJhbXMubGVuZ3RoIC0gMSBdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBvcGVyYXRvci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm9wID0gb3A7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZmlyc3QgaW5wdXQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYU5vZGUgPSBhTm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBzZWNvbmQgaW5wdXQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYk5vZGUgPSBiTm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNPcGVyYXRvck5vZGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGlzIG92ZXJ3cml0dGVuIHNpbmNlIHRoZSBub2RlIHR5cGUgaXMgaW5mZXJyZWQgZnJvbSB0aGUgb3BlcmF0b3JcclxuXHQgKiBhbmQgdGhlIGlucHV0IG5vZGUgdHlwZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBvdXRwdXQgLSBUaGUgY3VycmVudCBvdXRwdXQgc3RyaW5nLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG5vZGUgdHlwZS5cclxuXHQgKi9cclxuXHRnZXROb2RlVHlwZSggYnVpbGRlciwgb3V0cHV0ICkge1xyXG5cclxuXHRcdGNvbnN0IG9wID0gdGhpcy5vcDtcclxuXHJcblx0XHRjb25zdCBhTm9kZSA9IHRoaXMuYU5vZGU7XHJcblx0XHRjb25zdCBiTm9kZSA9IHRoaXMuYk5vZGU7XHJcblxyXG5cdFx0Y29uc3QgdHlwZUEgPSBhTm9kZS5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cdFx0Y29uc3QgdHlwZUIgPSB0eXBlb2YgYk5vZGUgIT09ICd1bmRlZmluZWQnID8gYk5vZGUuZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKSA6IG51bGw7XHJcblxyXG5cdFx0aWYgKCB0eXBlQSA9PT0gJ3ZvaWQnIHx8IHR5cGVCID09PSAndm9pZCcgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gJ3ZvaWQnO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIG9wID09PSAnJScgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gdHlwZUE7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggb3AgPT09ICd+JyB8fCBvcCA9PT0gJyYnIHx8IG9wID09PSAnfCcgfHwgb3AgPT09ICdeJyB8fCBvcCA9PT0gJz4+JyB8fCBvcCA9PT0gJzw8JyApIHtcclxuXHJcblx0XHRcdHJldHVybiBidWlsZGVyLmdldEludGVnZXJUeXBlKCB0eXBlQSApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIG9wID09PSAnIScgfHwgb3AgPT09ICc9PScgfHwgb3AgPT09ICchPScgfHwgb3AgPT09ICcmJicgfHwgb3AgPT09ICd8fCcgfHwgb3AgPT09ICdeXicgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gJ2Jvb2wnO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIG9wID09PSAnPCcgfHwgb3AgPT09ICc+JyB8fCBvcCA9PT0gJzw9JyB8fCBvcCA9PT0gJz49JyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHR5cGVMZW5ndGggPSBvdXRwdXQgPyBidWlsZGVyLmdldFR5cGVMZW5ndGgoIG91dHB1dCApIDogTWF0aC5tYXgoIGJ1aWxkZXIuZ2V0VHlwZUxlbmd0aCggdHlwZUEgKSwgYnVpbGRlci5nZXRUeXBlTGVuZ3RoKCB0eXBlQiApICk7XHJcblxyXG5cdFx0XHRyZXR1cm4gdHlwZUxlbmd0aCA+IDEgPyBgYnZlYyR7IHR5cGVMZW5ndGggfWAgOiAnYm9vbCc7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdC8vIEhhbmRsZSBtYXRyaXggb3BlcmF0aW9uc1xyXG5cclxuXHRcdFx0aWYgKCBidWlsZGVyLmlzTWF0cml4KCB0eXBlQSApICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIHR5cGVCID09PSAnZmxvYXQnICkge1xyXG5cclxuXHRcdFx0XHRcdHJldHVybiB0eXBlQTsgLy8gbWF0cml4ICogc2NhbGFyID0gbWF0cml4XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGJ1aWxkZXIuaXNWZWN0b3IoIHR5cGVCICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIGJ1aWxkZXIuZ2V0VmVjdG9yRnJvbU1hdHJpeCggdHlwZUEgKTsgLy8gbWF0cml4ICogdmVjdG9yXHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGJ1aWxkZXIuaXNNYXRyaXgoIHR5cGVCICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIHR5cGVBOyAvLyBtYXRyaXggKiBtYXRyaXhcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggYnVpbGRlci5pc01hdHJpeCggdHlwZUIgKSApIHtcclxuXHJcblx0XHRcdFx0aWYgKCB0eXBlQSA9PT0gJ2Zsb2F0JyApIHtcclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gdHlwZUI7IC8vIHNjYWxhciAqIG1hdHJpeCA9IG1hdHJpeFxyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCBidWlsZGVyLmlzVmVjdG9yKCB0eXBlQSApICkge1xyXG5cclxuXHRcdFx0XHRcdHJldHVybiBidWlsZGVyLmdldFZlY3RvckZyb21NYXRyaXgoIHR5cGVCICk7IC8vIHZlY3RvciAqIG1hdHJpeFxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBIYW5kbGUgbm9uLW1hdHJpeCBjYXNlc1xyXG5cclxuXHRcdFx0aWYgKCBidWlsZGVyLmdldFR5cGVMZW5ndGgoIHR5cGVCICkgPiBidWlsZGVyLmdldFR5cGVMZW5ndGgoIHR5cGVBICkgKSB7XHJcblxyXG5cdFx0XHRcdC8vIGFueXR5cGUgeCBhbnl0eXBlOiB1c2UgdGhlIGdyZWF0ZXIgbGVuZ3RoIHZlY3RvclxyXG5cclxuXHRcdFx0XHRyZXR1cm4gdHlwZUI7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gdHlwZUE7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGdlbmVyYXRlKCBidWlsZGVyLCBvdXRwdXQgKSB7XHJcblxyXG5cdFx0Y29uc3Qgb3AgPSB0aGlzLm9wO1xyXG5cclxuXHRcdGNvbnN0IGFOb2RlID0gdGhpcy5hTm9kZTtcclxuXHRcdGNvbnN0IGJOb2RlID0gdGhpcy5iTm9kZTtcclxuXHJcblx0XHRjb25zdCB0eXBlID0gdGhpcy5nZXROb2RlVHlwZSggYnVpbGRlciwgb3V0cHV0ICk7XHJcblxyXG5cdFx0bGV0IHR5cGVBID0gbnVsbDtcclxuXHRcdGxldCB0eXBlQiA9IG51bGw7XHJcblxyXG5cdFx0aWYgKCB0eXBlICE9PSAndm9pZCcgKSB7XHJcblxyXG5cdFx0XHR0eXBlQSA9IGFOb2RlLmdldE5vZGVUeXBlKCBidWlsZGVyICk7XHJcblx0XHRcdHR5cGVCID0gdHlwZW9mIGJOb2RlICE9PSAndW5kZWZpbmVkJyA/IGJOb2RlLmdldE5vZGVUeXBlKCBidWlsZGVyICkgOiBudWxsO1xyXG5cclxuXHRcdFx0aWYgKCBvcCA9PT0gJzwnIHx8IG9wID09PSAnPicgfHwgb3AgPT09ICc8PScgfHwgb3AgPT09ICc+PScgfHwgb3AgPT09ICc9PScgfHwgb3AgPT09ICchPScgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggYnVpbGRlci5pc1ZlY3RvciggdHlwZUEgKSApIHtcclxuXHJcblx0XHRcdFx0XHR0eXBlQiA9IHR5cGVBO1xyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCB0eXBlQSAhPT0gdHlwZUIgKSB7XHJcblxyXG5cdFx0XHRcdFx0dHlwZUEgPSB0eXBlQiA9ICdmbG9hdCc7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIG9wID09PSAnPj4nIHx8IG9wID09PSAnPDwnICkge1xyXG5cclxuXHRcdFx0XHR0eXBlQSA9IHR5cGU7XHJcblx0XHRcdFx0dHlwZUIgPSBidWlsZGVyLmNoYW5nZUNvbXBvbmVudFR5cGUoIHR5cGVCLCAndWludCcgKTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIG9wID09PSAnJScgKSB7XHJcblxyXG5cdFx0XHRcdHR5cGVBID0gdHlwZTtcclxuXHRcdFx0XHR0eXBlQiA9IGJ1aWxkZXIuaXNJbnRlZ2VyKCB0eXBlQSApICYmIGJ1aWxkZXIuaXNJbnRlZ2VyKCB0eXBlQiApID8gdHlwZUIgOiB0eXBlQTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGJ1aWxkZXIuaXNNYXRyaXgoIHR5cGVBICkgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggdHlwZUIgPT09ICdmbG9hdCcgKSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gS2VlcCBtYXRyaXggdHlwZSBmb3IgdHlwZUEsIGJ1dCBlbnN1cmUgdHlwZUIgc3RheXMgZmxvYXRcclxuXHJcblx0XHRcdFx0XHR0eXBlQiA9ICdmbG9hdCc7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGJ1aWxkZXIuaXNWZWN0b3IoIHR5cGVCICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gbWF0cml4IHggdmVjdG9yXHJcblx0XHRcdFx0XHR0eXBlQiA9IGJ1aWxkZXIuZ2V0VmVjdG9yRnJvbU1hdHJpeCggdHlwZUEgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggYnVpbGRlci5pc01hdHJpeCggdHlwZUIgKSApIHtcclxuXHJcblx0XHRcdFx0XHQvLyBtYXRyaXggeCBtYXRyaXggLSBrZWVwIGJvdGggdHlwZXNcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHR0eXBlQSA9IHR5cGVCID0gdHlwZTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggYnVpbGRlci5pc01hdHJpeCggdHlwZUIgKSApIHtcclxuXHJcblx0XHRcdFx0aWYgKCB0eXBlQSA9PT0gJ2Zsb2F0JyApIHtcclxuXHJcblx0XHRcdFx0XHQvLyBLZWVwIG1hdHJpeCB0eXBlIGZvciB0eXBlQiwgYnV0IGVuc3VyZSB0eXBlQSBzdGF5cyBmbG9hdFxyXG5cclxuXHRcdFx0XHRcdHR5cGVBID0gJ2Zsb2F0JztcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggYnVpbGRlci5pc1ZlY3RvciggdHlwZUEgKSApIHtcclxuXHJcblx0XHRcdFx0XHQvLyB2ZWN0b3IgeCBtYXRyaXhcclxuXHJcblx0XHRcdFx0XHR0eXBlQSA9IGJ1aWxkZXIuZ2V0VmVjdG9yRnJvbU1hdHJpeCggdHlwZUIgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHR0eXBlQSA9IHR5cGVCID0gdHlwZTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0Ly8gYW55dHlwZSB4IGFueXR5cGVcclxuXHJcblx0XHRcdFx0dHlwZUEgPSB0eXBlQiA9IHR5cGU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHR5cGVBID0gdHlwZUIgPSB0eXBlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBhID0gYU5vZGUuYnVpbGQoIGJ1aWxkZXIsIHR5cGVBICk7XHJcblx0XHRjb25zdCBiID0gdHlwZW9mIGJOb2RlICE9PSAndW5kZWZpbmVkJyA/IGJOb2RlLmJ1aWxkKCBidWlsZGVyLCB0eXBlQiApIDogbnVsbDtcclxuXHJcblx0XHRjb25zdCBvdXRwdXRMZW5ndGggPSBidWlsZGVyLmdldFR5cGVMZW5ndGgoIG91dHB1dCApO1xyXG5cdFx0Y29uc3QgZm5PcFNuaXBwZXQgPSBidWlsZGVyLmdldEZ1bmN0aW9uT3BlcmF0b3IoIG9wICk7XHJcblxyXG5cdFx0aWYgKCBvdXRwdXQgIT09ICd2b2lkJyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGlzR0xTTCA9IGJ1aWxkZXIucmVuZGVyZXIuY29vcmRpbmF0ZVN5c3RlbSA9PT0gV2ViR0xDb29yZGluYXRlU3lzdGVtO1xyXG5cclxuXHRcdFx0aWYgKCBvcCA9PT0gJz09JyApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBpc0dMU0wgKSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBvdXRwdXRMZW5ndGggPiAxICkge1xyXG5cclxuXHRcdFx0XHRcdFx0cmV0dXJuIGJ1aWxkZXIuZm9ybWF0KCBgJHsgYnVpbGRlci5nZXRNZXRob2QoICdlcXVhbCcsIG91dHB1dCApIH0oICR7IGEgfSwgJHsgYiB9IClgLCB0eXBlLCBvdXRwdXQgKTtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0cmV0dXJuIGJ1aWxkZXIuZm9ybWF0KCBgKCAkeyBhIH0gJHsgb3AgfSAkeyBiIH0gKWAsIHR5cGUsIG91dHB1dCApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHQvLyBXR1NMXHJcblxyXG5cdFx0XHRcdFx0aWYgKCBvdXRwdXRMZW5ndGggPiAxIHx8ICEgYnVpbGRlci5pc1ZlY3RvciggdHlwZUEgKSApIHtcclxuXHJcblx0XHRcdFx0XHRcdHJldHVybiBidWlsZGVyLmZvcm1hdCggYCggJHsgYSB9ID09ICR7IGIgfSApYCwgdHlwZSwgb3V0cHV0ICk7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdHJldHVybiBidWlsZGVyLmZvcm1hdCggYGFsbCggJHsgYSB9ID09ICR7IGIgfSApYCwgdHlwZSwgb3V0cHV0ICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBvcCA9PT0gJzwnICYmIG91dHB1dExlbmd0aCA+IDEgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggaXNHTFNMICkge1xyXG5cclxuXHRcdFx0XHRcdHJldHVybiBidWlsZGVyLmZvcm1hdCggYCR7IGJ1aWxkZXIuZ2V0TWV0aG9kKCAnbGVzc1RoYW4nLCBvdXRwdXQgKSB9KCAkeyBhIH0sICR7IGIgfSApYCwgdHlwZSwgb3V0cHV0ICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gV0dTTFxyXG5cclxuXHRcdFx0XHRcdHJldHVybiBidWlsZGVyLmZvcm1hdCggYCggJHsgYSB9IDwgJHsgYiB9IClgLCB0eXBlLCBvdXRwdXQgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggb3AgPT09ICc8PScgJiYgb3V0cHV0TGVuZ3RoID4gMSApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBpc0dMU0wgKSB7XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIGJ1aWxkZXIuZm9ybWF0KCBgJHsgYnVpbGRlci5nZXRNZXRob2QoICdsZXNzVGhhbkVxdWFsJywgb3V0cHV0ICkgfSggJHsgYSB9LCAkeyBiIH0gKWAsIHR5cGUsIG91dHB1dCApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdC8vIFdHU0xcclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gYnVpbGRlci5mb3JtYXQoIGAoICR7IGEgfSA8PSAkeyBiIH0gKWAsIHR5cGUsIG91dHB1dCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBvcCA9PT0gJz4nICYmIG91dHB1dExlbmd0aCA+IDEgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggaXNHTFNMICkge1xyXG5cclxuXHRcdFx0XHRcdHJldHVybiBidWlsZGVyLmZvcm1hdCggYCR7IGJ1aWxkZXIuZ2V0TWV0aG9kKCAnZ3JlYXRlclRoYW4nLCBvdXRwdXQgKSB9KCAkeyBhIH0sICR7IGIgfSApYCwgdHlwZSwgb3V0cHV0ICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gV0dTTFxyXG5cclxuXHRcdFx0XHRcdHJldHVybiBidWlsZGVyLmZvcm1hdCggYCggJHsgYSB9ID4gJHsgYiB9IClgLCB0eXBlLCBvdXRwdXQgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggb3AgPT09ICc+PScgJiYgb3V0cHV0TGVuZ3RoID4gMSApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBpc0dMU0wgKSB7XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIGJ1aWxkZXIuZm9ybWF0KCBgJHsgYnVpbGRlci5nZXRNZXRob2QoICdncmVhdGVyVGhhbkVxdWFsJywgb3V0cHV0ICkgfSggJHsgYSB9LCAkeyBiIH0gKWAsIHR5cGUsIG91dHB1dCApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdC8vIFdHU0xcclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gYnVpbGRlci5mb3JtYXQoIGAoICR7IGEgfSA+PSAkeyBiIH0gKWAsIHR5cGUsIG91dHB1dCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBvcCA9PT0gJyUnICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIGJ1aWxkZXIuaXNJbnRlZ2VyKCB0eXBlQiApICkge1xyXG5cclxuXHRcdFx0XHRcdHJldHVybiBidWlsZGVyLmZvcm1hdCggYCggJHsgYSB9ICUgJHsgYiB9IClgLCB0eXBlLCBvdXRwdXQgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gYnVpbGRlci5mb3JtYXQoIGAkeyBidWlsZGVyLmdldE1ldGhvZCggJ21vZCcsIHR5cGUgKSB9KCAkeyBhIH0sICR7IGIgfSApYCwgdHlwZSwgb3V0cHV0ICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIG9wID09PSAnIScgfHwgb3AgPT09ICd+JyApIHtcclxuXHJcblx0XHRcdFx0cmV0dXJuIGJ1aWxkZXIuZm9ybWF0KCBgKCR7b3B9JHthfSlgLCB0eXBlQSwgb3V0cHV0ICk7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBmbk9wU25pcHBldCApIHtcclxuXHJcblx0XHRcdFx0cmV0dXJuIGJ1aWxkZXIuZm9ybWF0KCBgJHsgZm5PcFNuaXBwZXQgfSggJHsgYSB9LCAkeyBiIH0gKWAsIHR5cGUsIG91dHB1dCApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0Ly8gSGFuZGxlIG1hdHJpeCBvcGVyYXRpb25zXHJcblxyXG5cdFx0XHRcdGlmICggYnVpbGRlci5pc01hdHJpeCggdHlwZUEgKSAmJiB0eXBlQiA9PT0gJ2Zsb2F0JyApIHtcclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gYnVpbGRlci5mb3JtYXQoIGAoICR7IGIgfSAkeyBvcCB9ICR7IGEgfSApYCwgdHlwZSwgb3V0cHV0ICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIHR5cGVBID09PSAnZmxvYXQnICYmIGJ1aWxkZXIuaXNNYXRyaXgoIHR5cGVCICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIGJ1aWxkZXIuZm9ybWF0KCBgJHsgYSB9ICR7IG9wIH0gJHsgYiB9YCwgdHlwZSwgb3V0cHV0ICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0bGV0IHNuaXBwZXQgPSBgKCAkeyBhIH0gJHsgb3AgfSAkeyBiIH0gKWA7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCAhIGlzR0xTTCAmJiB0eXBlID09PSAnYm9vbCcgJiYgYnVpbGRlci5pc1ZlY3RvciggdHlwZUEgKSAmJiBidWlsZGVyLmlzVmVjdG9yKCB0eXBlQiApICkge1xyXG5cclxuXHRcdFx0XHRcdFx0c25pcHBldCA9IGBhbGwkeyBzbmlwcGV0IH1gO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gYnVpbGRlci5mb3JtYXQoIHNuaXBwZXQsIHR5cGUsIG91dHB1dCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmICggdHlwZUEgIT09ICd2b2lkJyApIHtcclxuXHJcblx0XHRcdGlmICggZm5PcFNuaXBwZXQgKSB7XHJcblxyXG5cdFx0XHRcdHJldHVybiBidWlsZGVyLmZvcm1hdCggYCR7IGZuT3BTbmlwcGV0IH0oICR7IGEgfSwgJHsgYiB9IClgLCB0eXBlLCBvdXRwdXQgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGlmICggYnVpbGRlci5pc01hdHJpeCggdHlwZUEgKSAmJiB0eXBlQiA9PT0gJ2Zsb2F0JyApIHtcclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gYnVpbGRlci5mb3JtYXQoIGAkeyBiIH0gJHsgb3AgfSAkeyBhIH1gLCB0eXBlLCBvdXRwdXQgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gYnVpbGRlci5mb3JtYXQoIGAkeyBhIH0gJHsgb3AgfSAkeyBiIH1gLCB0eXBlLCBvdXRwdXQgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRzZXJpYWxpemUoIGRhdGEgKSB7XHJcblxyXG5cdFx0c3VwZXIuc2VyaWFsaXplKCBkYXRhICk7XHJcblxyXG5cdFx0ZGF0YS5vcCA9IHRoaXMub3A7XHJcblxyXG5cdH1cclxuXHJcblx0ZGVzZXJpYWxpemUoIGRhdGEgKSB7XHJcblxyXG5cdFx0c3VwZXIuZGVzZXJpYWxpemUoIGRhdGEgKTtcclxuXHJcblx0XHR0aGlzLm9wID0gZGF0YS5vcDtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgT3BlcmF0b3JOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIGFkZGl0aW9uIG9mIHR3byBvciBtb3JlIHZhbHVlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IGEgLSBUaGUgZmlyc3QgaW5wdXQuXHJcbiAqIEBwYXJhbSB7Tm9kZX0gYiAtIFRoZSBzZWNvbmQgaW5wdXQuXHJcbiAqIEBwYXJhbSB7Li4uTm9kZX0gcGFyYW1zIC0gQWRkaXRpb25hbCBpbnB1dCBwYXJhbWV0ZXJzLlxyXG4gKiBAcmV0dXJucyB7T3BlcmF0b3JOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGFkZCA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBPcGVyYXRvck5vZGUsICcrJyApLnNldFBhcmFtZXRlckxlbmd0aCggMiwgSW5maW5pdHkgKS5zZXROYW1lKCAnYWRkJyApO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIHN1YnRyYWN0aW9uIG9mIHR3byBvciBtb3JlIHZhbHVlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IGEgLSBUaGUgZmlyc3QgaW5wdXQuXHJcbiAqIEBwYXJhbSB7Tm9kZX0gYiAtIFRoZSBzZWNvbmQgaW5wdXQuXHJcbiAqIEBwYXJhbSB7Li4uTm9kZX0gcGFyYW1zIC0gQWRkaXRpb25hbCBpbnB1dCBwYXJhbWV0ZXJzLlxyXG4gKiBAcmV0dXJucyB7T3BlcmF0b3JOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHN1YiA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBPcGVyYXRvck5vZGUsICctJyApLnNldFBhcmFtZXRlckxlbmd0aCggMiwgSW5maW5pdHkgKS5zZXROYW1lKCAnc3ViJyApO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIG11bHRpcGxpY2F0aW9uIG9mIHR3byBvciBtb3JlIHZhbHVlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IGEgLSBUaGUgZmlyc3QgaW5wdXQuXHJcbiAqIEBwYXJhbSB7Tm9kZX0gYiAtIFRoZSBzZWNvbmQgaW5wdXQuXHJcbiAqIEBwYXJhbSB7Li4uTm9kZX0gcGFyYW1zIC0gQWRkaXRpb25hbCBpbnB1dCBwYXJhbWV0ZXJzLlxyXG4gKiBAcmV0dXJucyB7T3BlcmF0b3JOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG11bCA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBPcGVyYXRvck5vZGUsICcqJyApLnNldFBhcmFtZXRlckxlbmd0aCggMiwgSW5maW5pdHkgKS5zZXROYW1lKCAnbXVsJyApO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIGRpdmlzaW9uIG9mIHR3byBvciBtb3JlIHZhbHVlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IGEgLSBUaGUgZmlyc3QgaW5wdXQuXHJcbiAqIEBwYXJhbSB7Tm9kZX0gYiAtIFRoZSBzZWNvbmQgaW5wdXQuXHJcbiAqIEBwYXJhbSB7Li4uTm9kZX0gcGFyYW1zIC0gQWRkaXRpb25hbCBpbnB1dCBwYXJhbWV0ZXJzLlxyXG4gKiBAcmV0dXJucyB7T3BlcmF0b3JOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGRpdiA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBPcGVyYXRvck5vZGUsICcvJyApLnNldFBhcmFtZXRlckxlbmd0aCggMiwgSW5maW5pdHkgKS5zZXROYW1lKCAnZGl2JyApO1xyXG5cclxuLyoqXHJcbiAqIENvbXB1dGVzIHRoZSByZW1haW5kZXIgb2YgZGl2aWRpbmcgdGhlIGZpcnN0IG5vZGUgYnkgdGhlIHNlY29uZCBvbmUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZX0gYSAtIFRoZSBmaXJzdCBpbnB1dC5cclxuICogQHBhcmFtIHtOb2RlfSBiIC0gVGhlIHNlY29uZCBpbnB1dC5cclxuICogQHJldHVybnMge09wZXJhdG9yTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBtb2QgPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggT3BlcmF0b3JOb2RlLCAnJScgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDIgKS5zZXROYW1lKCAnbW9kJyApO1xyXG5cclxuLyoqXHJcbiAqIENoZWNrcyBpZiB0d28gbm9kZXMgYXJlIGVxdWFsLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IGEgLSBUaGUgZmlyc3QgaW5wdXQuXHJcbiAqIEBwYXJhbSB7Tm9kZX0gYiAtIFRoZSBzZWNvbmQgaW5wdXQuXHJcbiAqIEByZXR1cm5zIHtPcGVyYXRvck5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZXF1YWwgPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggT3BlcmF0b3JOb2RlLCAnPT0nICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAyICkuc2V0TmFtZSggJ2VxdWFsJyApO1xyXG5cclxuLyoqXHJcbiAqIENoZWNrcyBpZiB0d28gbm9kZXMgYXJlIG5vdCBlcXVhbC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlfSBhIC0gVGhlIGZpcnN0IGlucHV0LlxyXG4gKiBAcGFyYW0ge05vZGV9IGIgLSBUaGUgc2Vjb25kIGlucHV0LlxyXG4gKiBAcmV0dXJucyB7T3BlcmF0b3JOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG5vdEVxdWFsID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE9wZXJhdG9yTm9kZSwgJyE9JyApLnNldFBhcmFtZXRlckxlbmd0aCggMiApLnNldE5hbWUoICdub3RFcXVhbCcgKTtcclxuXHJcbi8qKlxyXG4gKiBDaGVja3MgaWYgdGhlIGZpcnN0IG5vZGUgaXMgbGVzcyB0aGFuIHRoZSBzZWNvbmQuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZX0gYSAtIFRoZSBmaXJzdCBpbnB1dC5cclxuICogQHBhcmFtIHtOb2RlfSBiIC0gVGhlIHNlY29uZCBpbnB1dC5cclxuICogQHJldHVybnMge09wZXJhdG9yTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBsZXNzVGhhbiA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBPcGVyYXRvck5vZGUsICc8JyApLnNldFBhcmFtZXRlckxlbmd0aCggMiApLnNldE5hbWUoICdsZXNzVGhhbicgKTtcclxuXHJcbi8qKlxyXG4gKiBDaGVja3MgaWYgdGhlIGZpcnN0IG5vZGUgaXMgZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZX0gYSAtIFRoZSBmaXJzdCBpbnB1dC5cclxuICogQHBhcmFtIHtOb2RlfSBiIC0gVGhlIHNlY29uZCBpbnB1dC5cclxuICogQHJldHVybnMge09wZXJhdG9yTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBncmVhdGVyVGhhbiA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBPcGVyYXRvck5vZGUsICc+JyApLnNldFBhcmFtZXRlckxlbmd0aCggMiApLnNldE5hbWUoICdncmVhdGVyVGhhbicgKTtcclxuXHJcbi8qKlxyXG4gKiBDaGVja3MgaWYgdGhlIGZpcnN0IG5vZGUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzZWNvbmQuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZX0gYSAtIFRoZSBmaXJzdCBpbnB1dC5cclxuICogQHBhcmFtIHtOb2RlfSBiIC0gVGhlIHNlY29uZCBpbnB1dC5cclxuICogQHJldHVybnMge09wZXJhdG9yTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBsZXNzVGhhbkVxdWFsID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE9wZXJhdG9yTm9kZSwgJzw9JyApLnNldFBhcmFtZXRlckxlbmd0aCggMiApLnNldE5hbWUoICdsZXNzVGhhbkVxdWFsJyApO1xyXG5cclxuLyoqXHJcbiAqIENoZWNrcyBpZiB0aGUgZmlyc3Qgbm9kZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNlY29uZC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlfSBhIC0gVGhlIGZpcnN0IGlucHV0LlxyXG4gKiBAcGFyYW0ge05vZGV9IGIgLSBUaGUgc2Vjb25kIGlucHV0LlxyXG4gKiBAcmV0dXJucyB7T3BlcmF0b3JOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGdyZWF0ZXJUaGFuRXF1YWwgPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggT3BlcmF0b3JOb2RlLCAnPj0nICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAyICkuc2V0TmFtZSggJ2dyZWF0ZXJUaGFuRXF1YWwnICk7XHJcblxyXG4vKipcclxuICogUGVyZm9ybXMgYSBsb2dpY2FsIEFORCBvcGVyYXRpb24gb24gbXVsdGlwbGUgbm9kZXMuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Li4uTm9kZX0gbm9kZXMgLSBUaGUgaW5wdXQgbm9kZXMgdG8gYmUgY29tYmluZWQgdXNpbmcgQU5ELlxyXG4gKiBAcmV0dXJucyB7T3BlcmF0b3JOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGFuZCA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBPcGVyYXRvck5vZGUsICcmJicgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDIsIEluZmluaXR5ICkuc2V0TmFtZSggJ2FuZCcgKTtcclxuXHJcbi8qKlxyXG4gKiBQZXJmb3JtcyBhIGxvZ2ljYWwgT1Igb3BlcmF0aW9uIG9uIG11bHRpcGxlIG5vZGVzLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0gey4uLk5vZGV9IG5vZGVzIC0gVGhlIGlucHV0IG5vZGVzIHRvIGJlIGNvbWJpbmVkIHVzaW5nIE9SLlxyXG4gKiBAcmV0dXJucyB7T3BlcmF0b3JOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG9yID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE9wZXJhdG9yTm9kZSwgJ3x8JyApLnNldFBhcmFtZXRlckxlbmd0aCggMiwgSW5maW5pdHkgKS5zZXROYW1lKCAnb3InICk7XHJcblxyXG4vKipcclxuICogUGVyZm9ybXMgbG9naWNhbCBOT1Qgb24gYSBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IHZhbHVlIC0gVGhlIHZhbHVlLlxyXG4gKiBAcmV0dXJucyB7T3BlcmF0b3JOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG5vdCA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBPcGVyYXRvck5vZGUsICchJyApLnNldFBhcmFtZXRlckxlbmd0aCggMSApLnNldE5hbWUoICdub3QnICk7XHJcblxyXG4vKipcclxuICogUGVyZm9ybXMgbG9naWNhbCBYT1Igb24gdHdvIG5vZGVzLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IGEgLSBUaGUgZmlyc3QgaW5wdXQuXHJcbiAqIEBwYXJhbSB7Tm9kZX0gYiAtIFRoZSBzZWNvbmQgaW5wdXQuXHJcbiAqIEByZXR1cm5zIHtPcGVyYXRvck5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgeG9yID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE9wZXJhdG9yTm9kZSwgJ15eJyApLnNldFBhcmFtZXRlckxlbmd0aCggMiApLnNldE5hbWUoICd4b3InICk7XHJcblxyXG4vKipcclxuICogUGVyZm9ybXMgYml0d2lzZSBBTkQgb24gdHdvIG5vZGVzLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IGEgLSBUaGUgZmlyc3QgaW5wdXQuXHJcbiAqIEBwYXJhbSB7Tm9kZX0gYiAtIFRoZSBzZWNvbmQgaW5wdXQuXHJcbiAqIEByZXR1cm5zIHtPcGVyYXRvck5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYml0QW5kID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE9wZXJhdG9yTm9kZSwgJyYnICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAyICkuc2V0TmFtZSggJ2JpdEFuZCcgKTtcclxuXHJcbi8qKlxyXG4gKiBQZXJmb3JtcyBiaXR3aXNlIE5PVCBvbiBhIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZX0gYSAtIFRoZSBmaXJzdCBpbnB1dC5cclxuICogQHBhcmFtIHtOb2RlfSBiIC0gVGhlIHNlY29uZCBpbnB1dC5cclxuICogQHJldHVybnMge09wZXJhdG9yTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBiaXROb3QgPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggT3BlcmF0b3JOb2RlLCAnficgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDIgKS5zZXROYW1lKCAnYml0Tm90JyApO1xyXG5cclxuLyoqXHJcbiAqIFBlcmZvcm1zIGJpdHdpc2UgT1Igb24gdHdvIG5vZGVzLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IGEgLSBUaGUgZmlyc3QgaW5wdXQuXHJcbiAqIEBwYXJhbSB7Tm9kZX0gYiAtIFRoZSBzZWNvbmQgaW5wdXQuXHJcbiAqIEByZXR1cm5zIHtPcGVyYXRvck5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYml0T3IgPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggT3BlcmF0b3JOb2RlLCAnfCcgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDIgKS5zZXROYW1lKCAnYml0T3InICk7XHJcblxyXG4vKipcclxuICogUGVyZm9ybXMgYml0d2lzZSBYT1Igb24gdHdvIG5vZGVzLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IGEgLSBUaGUgZmlyc3QgaW5wdXQuXHJcbiAqIEBwYXJhbSB7Tm9kZX0gYiAtIFRoZSBzZWNvbmQgaW5wdXQuXHJcbiAqIEByZXR1cm5zIHtPcGVyYXRvck5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYml0WG9yID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE9wZXJhdG9yTm9kZSwgJ14nICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAyICkuc2V0TmFtZSggJ2JpdFhvcicgKTtcclxuXHJcbi8qKlxyXG4gKiBTaGlmdHMgYSBub2RlIHRvIHRoZSBsZWZ0LlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IGEgLSBUaGUgbm9kZSB0byBzaGlmdC5cclxuICogQHBhcmFtIHtOb2RlfSBiIC0gVGhlIHZhbHVlIHRvIHNoaWZ0LlxyXG4gKiBAcmV0dXJucyB7T3BlcmF0b3JOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHNoaWZ0TGVmdCA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBPcGVyYXRvck5vZGUsICc8PCcgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDIgKS5zZXROYW1lKCAnc2hpZnRMZWZ0JyApO1xyXG5cclxuLyoqXHJcbiAqIFNoaWZ0cyBhIG5vZGUgdG8gdGhlIHJpZ2h0LlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IGEgLSBUaGUgbm9kZSB0byBzaGlmdC5cclxuICogQHBhcmFtIHtOb2RlfSBiIC0gVGhlIHZhbHVlIHRvIHNoaWZ0LlxyXG4gKiBAcmV0dXJucyB7T3BlcmF0b3JOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHNoaWZ0UmlnaHQgPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggT3BlcmF0b3JOb2RlLCAnPj4nICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAyICkuc2V0TmFtZSggJ3NoaWZ0UmlnaHQnICk7XHJcblxyXG5hZGRNZXRob2RDaGFpbmluZyggJ2FkZCcsIGFkZCApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ3N1YicsIHN1YiApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ211bCcsIG11bCApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ2RpdicsIGRpdiApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ21vZCcsIG1vZCApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ2VxdWFsJywgZXF1YWwgKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICdub3RFcXVhbCcsIG5vdEVxdWFsICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAnbGVzc1RoYW4nLCBsZXNzVGhhbiApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ2dyZWF0ZXJUaGFuJywgZ3JlYXRlclRoYW4gKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICdsZXNzVGhhbkVxdWFsJywgbGVzc1RoYW5FcXVhbCApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ2dyZWF0ZXJUaGFuRXF1YWwnLCBncmVhdGVyVGhhbkVxdWFsICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAnYW5kJywgYW5kICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAnb3InLCBvciApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ25vdCcsIG5vdCApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ3hvcicsIHhvciApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ2JpdEFuZCcsIGJpdEFuZCApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ2JpdE5vdCcsIGJpdE5vdCApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ2JpdE9yJywgYml0T3IgKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICdiaXRYb3InLCBiaXRYb3IgKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICdzaGlmdExlZnQnLCBzaGlmdExlZnQgKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICdzaGlmdFJpZ2h0Jywgc2hpZnRSaWdodCApO1xyXG5cclxuLyoqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBkZXByZWNhdGVkIHNpbmNlIHIxNjguIFVzZSB7QGxpbmsgbW9kfSBpbnN0ZWFkLlxyXG4gKlxyXG4gKiBAcGFyYW0ge05vZGV9IGEgLSBUaGUgZmlyc3QgaW5wdXQuXHJcbiAqIEBwYXJhbSB7Tm9kZX0gYiAtIFRoZSBzZWNvbmQgaW5wdXQuXHJcbiAqIEByZXR1cm5zIHtPcGVyYXRvck5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcmVtYWluZGVyID0gKCBhLCBiICkgPT4geyAvLyBAZGVwcmVjYXRlZCwgcjE2OFxyXG5cclxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5UU0w6IFwicmVtYWluZGVyKClcIiBpcyBkZXByZWNhdGVkLiBVc2UgXCJtb2QoIGludCggLi4uICkgKVwiIGluc3RlYWQuJyApO1xyXG5cdHJldHVybiBtb2QoIGEsIGIgKTtcclxuXHJcbn07XHJcblxyXG4vKipcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQGRlcHJlY2F0ZWQgc2luY2UgcjE3NS4gVXNlIHtAbGluayBtb2R9IGluc3RlYWQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7Tm9kZX0gYSAtIFRoZSBmaXJzdCBpbnB1dC5cclxuICogQHBhcmFtIHtOb2RlfSBiIC0gVGhlIHNlY29uZCBpbnB1dC5cclxuICogQHJldHVybnMge09wZXJhdG9yTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBtb2RJbnQgPSAoIGEsIGIgKSA9PiB7IC8vIEBkZXByZWNhdGVkLCByMTc1XHJcblxyXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlRTTDogXCJtb2RJbnQoKVwiIGlzIGRlcHJlY2F0ZWQuIFVzZSBcIm1vZCggaW50KCAuLi4gKSApXCIgaW5zdGVhZC4nICk7XHJcblx0cmV0dXJuIG1vZCggaW50KCBhICksIGludCggYiApICk7XHJcblxyXG59O1xyXG5cclxuYWRkTWV0aG9kQ2hhaW5pbmcoICdyZW1haW5kZXInLCByZW1haW5kZXIgKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICdtb2RJbnQnLCBtb2RJbnQgKTtcclxuIiwiaW1wb3J0IFRlbXBOb2RlIGZyb20gJy4uL2NvcmUvVGVtcE5vZGUuanMnO1xyXG5pbXBvcnQgeyBzdWIsIG11bCwgZGl2LCBtb2QsIGVxdWFsIH0gZnJvbSAnLi9PcGVyYXRvck5vZGUuanMnO1xyXG5pbXBvcnQgeyBhZGRNZXRob2RDaGFpbmluZywgbm9kZU9iamVjdCwgbm9kZVByb3h5LCBmbG9hdCwgdmVjMiwgdmVjMywgdmVjNCwgRm4gfSBmcm9tICcuLi90c2wvVFNMQ29yZS5qcyc7XHJcbmltcG9ydCB7IFdlYkdMQ29vcmRpbmF0ZVN5c3RlbSwgV2ViR1BVQ29vcmRpbmF0ZVN5c3RlbSB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBub2RlIHJlcHJlc2VudHMgYSB2YXJpZXR5IG9mIG1hdGhlbWF0aWNhbCBtZXRob2RzIGF2YWlsYWJsZSBpbiBzaGFkZXJzLlxyXG4gKiBUaGV5IGFyZSBkaXZpZGVkIGludG8gdGhyZWUgY2F0ZWdvcmllczpcclxuICpcclxuICogLSBNZXRob2RzIHdpdGggb25lIGlucHV0IGxpa2UgYHNpbmAsIGBjb3NgIG9yIGBub3JtYWxpemVgLlxyXG4gKiAtIE1ldGhvZHMgd2l0aCB0d28gaW5wdXRzIGxpa2UgYGRvdGAsIGBjcm9zc2Agb3IgYHBvd2AuXHJcbiAqIC0gTWV0aG9kcyB3aXRoIHRocmVlIGlucHV0cyBsaWtlIGBtaXhgLCBgY2xhbXBgIG9yIGBzbW9vdGhzdGVwYC5cclxuICpcclxuICogQGF1Z21lbnRzIFRlbXBOb2RlXHJcbiAqL1xyXG5jbGFzcyBNYXRoTm9kZSBleHRlbmRzIFRlbXBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnTWF0aE5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbWF0aCBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZCAtIFRoZSBtZXRob2QgbmFtZS5cclxuXHQgKiBAcGFyYW0ge05vZGV9IGFOb2RlIC0gVGhlIGZpcnN0IGlucHV0LlxyXG5cdCAqIEBwYXJhbSB7P05vZGV9IFtiTm9kZT1udWxsXSAtIFRoZSBzZWNvbmQgaW5wdXQuXHJcblx0ICogQHBhcmFtIHs/Tm9kZX0gW2NOb2RlPW51bGxdIC0gVGhlIHRoaXJkIGlucHV0LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBtZXRob2QsIGFOb2RlLCBiTm9kZSA9IG51bGwsIGNOb2RlID0gbnVsbCApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8vIEFsbG93IHRoZSBtYXgoKSBhbmQgbWluKCkgZnVuY3Rpb25zIHRvIHRha2UgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBhcmd1bWVudHMuXHJcblxyXG5cdFx0aWYgKCAoIG1ldGhvZCA9PT0gTWF0aE5vZGUuTUFYIHx8IG1ldGhvZCA9PT0gTWF0aE5vZGUuTUlOICkgJiYgYXJndW1lbnRzLmxlbmd0aCA+IDMgKSB7XHJcblxyXG5cdFx0XHRsZXQgZmluYWxPcCA9IG5ldyBNYXRoTm9kZSggbWV0aG9kLCBhTm9kZSwgYk5vZGUgKTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMjsgaSA8IGFyZ3VtZW50cy5sZW5ndGggLSAxOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRmaW5hbE9wID0gbmV3IE1hdGhOb2RlKCBtZXRob2QsIGZpbmFsT3AsIGFyZ3VtZW50c1sgaSBdICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRhTm9kZSA9IGZpbmFsT3A7XHJcblx0XHRcdGJOb2RlID0gYXJndW1lbnRzWyBhcmd1bWVudHMubGVuZ3RoIC0gMSBdO1xyXG5cdFx0XHRjTm9kZSA9IG51bGw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG1ldGhvZCBuYW1lLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWV0aG9kID0gbWV0aG9kO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGZpcnN0IGlucHV0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFOb2RlID0gYU5vZGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc2Vjb25kIGlucHV0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Tm9kZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5iTm9kZSA9IGJOb2RlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHRoaXJkIGlucHV0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Tm9kZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jTm9kZSA9IGNOb2RlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc01hdGhOb2RlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgaW5wdXQgdHlwZSBpcyBpbmZlcnJlZCBmcm9tIHRoZSBub2RlIHR5cGVzIG9mIHRoZSBpbnB1dCBub2Rlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgaW5wdXQgdHlwZS5cclxuXHQgKi9cclxuXHRnZXRJbnB1dFR5cGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgYVR5cGUgPSB0aGlzLmFOb2RlLmdldE5vZGVUeXBlKCBidWlsZGVyICk7XHJcblx0XHRjb25zdCBiVHlwZSA9IHRoaXMuYk5vZGUgPyB0aGlzLmJOb2RlLmdldE5vZGVUeXBlKCBidWlsZGVyICkgOiBudWxsO1xyXG5cdFx0Y29uc3QgY1R5cGUgPSB0aGlzLmNOb2RlID8gdGhpcy5jTm9kZS5nZXROb2RlVHlwZSggYnVpbGRlciApIDogbnVsbDtcclxuXHJcblx0XHRjb25zdCBhTGVuID0gYnVpbGRlci5pc01hdHJpeCggYVR5cGUgKSA/IDAgOiBidWlsZGVyLmdldFR5cGVMZW5ndGgoIGFUeXBlICk7XHJcblx0XHRjb25zdCBiTGVuID0gYnVpbGRlci5pc01hdHJpeCggYlR5cGUgKSA/IDAgOiBidWlsZGVyLmdldFR5cGVMZW5ndGgoIGJUeXBlICk7XHJcblx0XHRjb25zdCBjTGVuID0gYnVpbGRlci5pc01hdHJpeCggY1R5cGUgKSA/IDAgOiBidWlsZGVyLmdldFR5cGVMZW5ndGgoIGNUeXBlICk7XHJcblxyXG5cdFx0aWYgKCBhTGVuID4gYkxlbiAmJiBhTGVuID4gY0xlbiApIHtcclxuXHJcblx0XHRcdHJldHVybiBhVHlwZTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBiTGVuID4gY0xlbiApIHtcclxuXHJcblx0XHRcdHJldHVybiBiVHlwZTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBjTGVuID4gYUxlbiApIHtcclxuXHJcblx0XHRcdHJldHVybiBjVHlwZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGFUeXBlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBzZWxlY3RlZCBtZXRob2QgYXMgd2VsbCBhcyB0aGUgaW5wdXQgdHlwZSBkZXRlcm1pbmUgdGhlIG5vZGUgdHlwZSBvZiB0aGlzIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG5vZGUgdHlwZS5cclxuXHQgKi9cclxuXHRnZXROb2RlVHlwZSggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCBtZXRob2QgPSB0aGlzLm1ldGhvZDtcclxuXHJcblx0XHRpZiAoIG1ldGhvZCA9PT0gTWF0aE5vZGUuTEVOR1RIIHx8IG1ldGhvZCA9PT0gTWF0aE5vZGUuRElTVEFOQ0UgfHwgbWV0aG9kID09PSBNYXRoTm9kZS5ET1QgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gJ2Zsb2F0JztcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBtZXRob2QgPT09IE1hdGhOb2RlLkNST1NTICkge1xyXG5cclxuXHRcdFx0cmV0dXJuICd2ZWMzJztcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBtZXRob2QgPT09IE1hdGhOb2RlLkFMTCB8fCBtZXRob2QgPT09IE1hdGhOb2RlLkFOWSApIHtcclxuXHJcblx0XHRcdHJldHVybiAnYm9vbCc7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggbWV0aG9kID09PSBNYXRoTm9kZS5FUVVBTFMgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gYnVpbGRlci5jaGFuZ2VDb21wb25lbnRUeXBlKCB0aGlzLmFOb2RlLmdldE5vZGVUeXBlKCBidWlsZGVyICksICdib29sJyApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gdGhpcy5nZXRJbnB1dFR5cGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0Z2VuZXJhdGUoIGJ1aWxkZXIsIG91dHB1dCApIHtcclxuXHJcblx0XHRsZXQgbWV0aG9kID0gdGhpcy5tZXRob2Q7XHJcblxyXG5cdFx0Y29uc3QgdHlwZSA9IHRoaXMuZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKTtcclxuXHRcdGNvbnN0IGlucHV0VHlwZSA9IHRoaXMuZ2V0SW5wdXRUeXBlKCBidWlsZGVyICk7XHJcblxyXG5cdFx0Y29uc3QgYSA9IHRoaXMuYU5vZGU7XHJcblx0XHRjb25zdCBiID0gdGhpcy5iTm9kZTtcclxuXHRcdGNvbnN0IGMgPSB0aGlzLmNOb2RlO1xyXG5cclxuXHRcdGNvbnN0IGNvb3JkaW5hdGVTeXN0ZW0gPSBidWlsZGVyLnJlbmRlcmVyLmNvb3JkaW5hdGVTeXN0ZW07XHJcblxyXG5cdFx0aWYgKCBtZXRob2QgPT09IE1hdGhOb2RlLlRSQU5TRk9STV9ESVJFQ1RJT04gKSB7XHJcblxyXG5cdFx0XHQvLyBkaXIgY2FuIGJlIGVpdGhlciBhIGRpcmVjdGlvbiB2ZWN0b3Igb3IgYSBub3JtYWwgdmVjdG9yXHJcblx0XHRcdC8vIHVwcGVyLWxlZnQgM3gzIG9mIG1hdHJpeCBpcyBhc3N1bWVkIHRvIGJlIG9ydGhvZ29uYWxcclxuXHJcblx0XHRcdGxldCB0QSA9IGE7XHJcblx0XHRcdGxldCB0QiA9IGI7XHJcblxyXG5cdFx0XHRpZiAoIGJ1aWxkZXIuaXNNYXRyaXgoIHRBLmdldE5vZGVUeXBlKCBidWlsZGVyICkgKSApIHtcclxuXHJcblx0XHRcdFx0dEIgPSB2ZWM0KCB2ZWMzKCB0QiApLCAwLjAgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHRBID0gdmVjNCggdmVjMyggdEEgKSwgMC4wICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBtdWxOb2RlID0gbXVsKCB0QSwgdEIgKS54eXo7XHJcblxyXG5cdFx0XHRyZXR1cm4gbm9ybWFsaXplKCBtdWxOb2RlICkuYnVpbGQoIGJ1aWxkZXIsIG91dHB1dCApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIG1ldGhvZCA9PT0gTWF0aE5vZGUuTkVHQVRFICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIGJ1aWxkZXIuZm9ybWF0KCAnKCAtICcgKyBhLmJ1aWxkKCBidWlsZGVyLCBpbnB1dFR5cGUgKSArICcgKScsIHR5cGUsIG91dHB1dCApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIG1ldGhvZCA9PT0gTWF0aE5vZGUuT05FX01JTlVTICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIHN1YiggMS4wLCBhICkuYnVpbGQoIGJ1aWxkZXIsIG91dHB1dCApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIG1ldGhvZCA9PT0gTWF0aE5vZGUuUkVDSVBST0NBTCApIHtcclxuXHJcblx0XHRcdHJldHVybiBkaXYoIDEuMCwgYSApLmJ1aWxkKCBidWlsZGVyLCBvdXRwdXQgKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBtZXRob2QgPT09IE1hdGhOb2RlLkRJRkZFUkVOQ0UgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gYWJzKCBzdWIoIGEsIGIgKSApLmJ1aWxkKCBidWlsZGVyLCBvdXRwdXQgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc3QgcGFyYW1zID0gW107XHJcblxyXG5cdFx0XHRpZiAoIG1ldGhvZCA9PT0gTWF0aE5vZGUuQ1JPU1MgKSB7XHJcblxyXG5cdFx0XHRcdHBhcmFtcy5wdXNoKFxyXG5cdFx0XHRcdFx0YS5idWlsZCggYnVpbGRlciwgdHlwZSApLFxyXG5cdFx0XHRcdFx0Yi5idWlsZCggYnVpbGRlciwgdHlwZSApXHJcblx0XHRcdFx0KTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGNvb3JkaW5hdGVTeXN0ZW0gPT09IFdlYkdMQ29vcmRpbmF0ZVN5c3RlbSAmJiBtZXRob2QgPT09IE1hdGhOb2RlLlNURVAgKSB7XHJcblxyXG5cdFx0XHRcdHBhcmFtcy5wdXNoKFxyXG5cdFx0XHRcdFx0YS5idWlsZCggYnVpbGRlciwgYnVpbGRlci5nZXRUeXBlTGVuZ3RoKCBhLmdldE5vZGVUeXBlKCBidWlsZGVyICkgKSA9PT0gMSA/ICdmbG9hdCcgOiBpbnB1dFR5cGUgKSxcclxuXHRcdFx0XHRcdGIuYnVpbGQoIGJ1aWxkZXIsIGlucHV0VHlwZSApXHJcblx0XHRcdFx0KTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGNvb3JkaW5hdGVTeXN0ZW0gPT09IFdlYkdMQ29vcmRpbmF0ZVN5c3RlbSAmJiAoIG1ldGhvZCA9PT0gTWF0aE5vZGUuTUlOIHx8IG1ldGhvZCA9PT0gTWF0aE5vZGUuTUFYICkgKSB7XHJcblxyXG5cdFx0XHRcdHBhcmFtcy5wdXNoKFxyXG5cdFx0XHRcdFx0YS5idWlsZCggYnVpbGRlciwgaW5wdXRUeXBlICksXHJcblx0XHRcdFx0XHRiLmJ1aWxkKCBidWlsZGVyLCBidWlsZGVyLmdldFR5cGVMZW5ndGgoIGIuZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKSApID09PSAxID8gJ2Zsb2F0JyA6IGlucHV0VHlwZSApXHJcblx0XHRcdFx0KTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIG1ldGhvZCA9PT0gTWF0aE5vZGUuUkVGUkFDVCApIHtcclxuXHJcblx0XHRcdFx0cGFyYW1zLnB1c2goXHJcblx0XHRcdFx0XHRhLmJ1aWxkKCBidWlsZGVyLCBpbnB1dFR5cGUgKSxcclxuXHRcdFx0XHRcdGIuYnVpbGQoIGJ1aWxkZXIsIGlucHV0VHlwZSApLFxyXG5cdFx0XHRcdFx0Yy5idWlsZCggYnVpbGRlciwgJ2Zsb2F0JyApXHJcblx0XHRcdFx0KTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIG1ldGhvZCA9PT0gTWF0aE5vZGUuTUlYICkge1xyXG5cclxuXHRcdFx0XHRwYXJhbXMucHVzaChcclxuXHRcdFx0XHRcdGEuYnVpbGQoIGJ1aWxkZXIsIGlucHV0VHlwZSApLFxyXG5cdFx0XHRcdFx0Yi5idWlsZCggYnVpbGRlciwgaW5wdXRUeXBlICksXHJcblx0XHRcdFx0XHRjLmJ1aWxkKCBidWlsZGVyLCBidWlsZGVyLmdldFR5cGVMZW5ndGgoIGMuZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKSApID09PSAxID8gJ2Zsb2F0JyA6IGlucHV0VHlwZSApXHJcblx0XHRcdFx0KTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGlmICggY29vcmRpbmF0ZVN5c3RlbSA9PT0gV2ViR1BVQ29vcmRpbmF0ZVN5c3RlbSAmJiBtZXRob2QgPT09IE1hdGhOb2RlLkFUQU4gJiYgYiAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHRtZXRob2QgPSAnYXRhbjInO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHBhcmFtcy5wdXNoKCBhLmJ1aWxkKCBidWlsZGVyLCBpbnB1dFR5cGUgKSApO1xyXG5cdFx0XHRcdGlmICggYiAhPT0gbnVsbCApIHBhcmFtcy5wdXNoKCBiLmJ1aWxkKCBidWlsZGVyLCBpbnB1dFR5cGUgKSApO1xyXG5cdFx0XHRcdGlmICggYyAhPT0gbnVsbCApIHBhcmFtcy5wdXNoKCBjLmJ1aWxkKCBidWlsZGVyLCBpbnB1dFR5cGUgKSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIGJ1aWxkZXIuZm9ybWF0KCBgJHsgYnVpbGRlci5nZXRNZXRob2QoIG1ldGhvZCwgdHlwZSApIH0oICR7cGFyYW1zLmpvaW4oICcsICcgKX0gKWAsIHR5cGUsIG91dHB1dCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRzZXJpYWxpemUoIGRhdGEgKSB7XHJcblxyXG5cdFx0c3VwZXIuc2VyaWFsaXplKCBkYXRhICk7XHJcblxyXG5cdFx0ZGF0YS5tZXRob2QgPSB0aGlzLm1ldGhvZDtcclxuXHJcblx0fVxyXG5cclxuXHRkZXNlcmlhbGl6ZSggZGF0YSApIHtcclxuXHJcblx0XHRzdXBlci5kZXNlcmlhbGl6ZSggZGF0YSApO1xyXG5cclxuXHRcdHRoaXMubWV0aG9kID0gZGF0YS5tZXRob2Q7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8vIDEgaW5wdXRcclxuXHJcbk1hdGhOb2RlLkFMTCA9ICdhbGwnO1xyXG5NYXRoTm9kZS5BTlkgPSAnYW55JztcclxuXHJcbk1hdGhOb2RlLlJBRElBTlMgPSAncmFkaWFucyc7XHJcbk1hdGhOb2RlLkRFR1JFRVMgPSAnZGVncmVlcyc7XHJcbk1hdGhOb2RlLkVYUCA9ICdleHAnO1xyXG5NYXRoTm9kZS5FWFAyID0gJ2V4cDInO1xyXG5NYXRoTm9kZS5MT0cgPSAnbG9nJztcclxuTWF0aE5vZGUuTE9HMiA9ICdsb2cyJztcclxuTWF0aE5vZGUuU1FSVCA9ICdzcXJ0JztcclxuTWF0aE5vZGUuSU5WRVJTRV9TUVJUID0gJ2ludmVyc2VzcXJ0JztcclxuTWF0aE5vZGUuRkxPT1IgPSAnZmxvb3InO1xyXG5NYXRoTm9kZS5DRUlMID0gJ2NlaWwnO1xyXG5NYXRoTm9kZS5OT1JNQUxJWkUgPSAnbm9ybWFsaXplJztcclxuTWF0aE5vZGUuRlJBQ1QgPSAnZnJhY3QnO1xyXG5NYXRoTm9kZS5TSU4gPSAnc2luJztcclxuTWF0aE5vZGUuQ09TID0gJ2Nvcyc7XHJcbk1hdGhOb2RlLlRBTiA9ICd0YW4nO1xyXG5NYXRoTm9kZS5BU0lOID0gJ2FzaW4nO1xyXG5NYXRoTm9kZS5BQ09TID0gJ2Fjb3MnO1xyXG5NYXRoTm9kZS5BVEFOID0gJ2F0YW4nO1xyXG5NYXRoTm9kZS5BQlMgPSAnYWJzJztcclxuTWF0aE5vZGUuU0lHTiA9ICdzaWduJztcclxuTWF0aE5vZGUuTEVOR1RIID0gJ2xlbmd0aCc7XHJcbk1hdGhOb2RlLk5FR0FURSA9ICduZWdhdGUnO1xyXG5NYXRoTm9kZS5PTkVfTUlOVVMgPSAnb25lTWludXMnO1xyXG5NYXRoTm9kZS5ERkRYID0gJ2RGZHgnO1xyXG5NYXRoTm9kZS5ERkRZID0gJ2RGZHknO1xyXG5NYXRoTm9kZS5ST1VORCA9ICdyb3VuZCc7XHJcbk1hdGhOb2RlLlJFQ0lQUk9DQUwgPSAncmVjaXByb2NhbCc7XHJcbk1hdGhOb2RlLlRSVU5DID0gJ3RydW5jJztcclxuTWF0aE5vZGUuRldJRFRIID0gJ2Z3aWR0aCc7XHJcbk1hdGhOb2RlLlRSQU5TUE9TRSA9ICd0cmFuc3Bvc2UnO1xyXG5cclxuLy8gMiBpbnB1dHNcclxuXHJcbk1hdGhOb2RlLkJJVENBU1QgPSAnYml0Y2FzdCc7XHJcbk1hdGhOb2RlLkVRVUFMUyA9ICdlcXVhbHMnO1xyXG5NYXRoTm9kZS5NSU4gPSAnbWluJztcclxuTWF0aE5vZGUuTUFYID0gJ21heCc7XHJcbk1hdGhOb2RlLlNURVAgPSAnc3RlcCc7XHJcbk1hdGhOb2RlLlJFRkxFQ1QgPSAncmVmbGVjdCc7XHJcbk1hdGhOb2RlLkRJU1RBTkNFID0gJ2Rpc3RhbmNlJztcclxuTWF0aE5vZGUuRElGRkVSRU5DRSA9ICdkaWZmZXJlbmNlJztcclxuTWF0aE5vZGUuRE9UID0gJ2RvdCc7XHJcbk1hdGhOb2RlLkNST1NTID0gJ2Nyb3NzJztcclxuTWF0aE5vZGUuUE9XID0gJ3Bvdyc7XHJcbk1hdGhOb2RlLlRSQU5TRk9STV9ESVJFQ1RJT04gPSAndHJhbnNmb3JtRGlyZWN0aW9uJztcclxuXHJcbi8vIDMgaW5wdXRzXHJcblxyXG5NYXRoTm9kZS5NSVggPSAnbWl4JztcclxuTWF0aE5vZGUuQ0xBTVAgPSAnY2xhbXAnO1xyXG5NYXRoTm9kZS5SRUZSQUNUID0gJ3JlZnJhY3QnO1xyXG5NYXRoTm9kZS5TTU9PVEhTVEVQID0gJ3Ntb290aHN0ZXAnO1xyXG5NYXRoTm9kZS5GQUNFRk9SV0FSRCA9ICdmYWNlZm9yd2FyZCc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBNYXRoTm9kZTtcclxuXHJcbi8vIDEgaW5wdXRzXHJcblxyXG4vKipcclxuICogQSBzbWFsbCB2YWx1ZSB1c2VkIHRvIGhhbmRsZSBmbG9hdGluZy1wb2ludCBwcmVjaXNpb24gZXJyb3JzLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtOb2RlPGZsb2F0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBFUFNJTE9OID0gLypAX19QVVJFX18qLyBmbG9hdCggMWUtNiApO1xyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgaW5maW5pdHkuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8ZmxvYXQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IElORklOSVRZID0gLypAX19QVVJFX18qLyBmbG9hdCggMWU2ICk7XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyBQSS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUEkgPSAvKkBfX1BVUkVfXyovIGZsb2F0KCBNYXRoLlBJICk7XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyBQSSAqIDIuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8ZmxvYXQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFBJMiA9IC8qQF9fUFVSRV9fKi8gZmxvYXQoIE1hdGguUEkgKiAyICk7XHJcblxyXG4vKipcclxuICogUmV0dXJucyBgdHJ1ZWAgaWYgYWxsIGNvbXBvbmVudHMgb2YgYHhgIGFyZSBgdHJ1ZWAuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZSB8IG51bWJlcn0geCAtIFRoZSBwYXJhbWV0ZXIuXHJcbiAqIEByZXR1cm5zIHtOb2RlPGJvb2w+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGFsbCA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBNYXRoTm9kZSwgTWF0aE5vZGUuQUxMICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAxICk7XHJcblxyXG4vKipcclxuICogUmV0dXJucyBgdHJ1ZWAgaWYgYW55IGNvbXBvbmVudHMgb2YgYHhgIGFyZSBgdHJ1ZWAuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZSB8IG51bWJlcn0geCAtIFRoZSBwYXJhbWV0ZXIuXHJcbiAqIEByZXR1cm5zIHtOb2RlPGJvb2w+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGFueSA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBNYXRoTm9kZSwgTWF0aE5vZGUuQU5ZICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAxICk7XHJcblxyXG4vKipcclxuICogQ29udmVydHMgYSBxdWFudGl0eSBpbiBkZWdyZWVzIHRvIHJhZGlhbnMuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZSB8IG51bWJlcn0geCAtIFRoZSBpbnB1dCBpbiBkZWdyZWVzLlxyXG4gKiBAcmV0dXJucyB7Tm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCByYWRpYW5zID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE1hdGhOb2RlLCBNYXRoTm9kZS5SQURJQU5TICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAxICk7XHJcblxyXG4vKipcclxuICogQ29udmVydCBhIHF1YW50aXR5IGluIHJhZGlhbnMgdG8gZGVncmVlcy5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlIHwgbnVtYmVyfSB4IC0gVGhlIGlucHV0IGluIHJhZGlhbnMuXHJcbiAqIEByZXR1cm5zIHtOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGRlZ3JlZXMgPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggTWF0aE5vZGUsIE1hdGhOb2RlLkRFR1JFRVMgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDEgKTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBuYXR1cmFsIGV4cG9uZW50aWF0aW9uIG9mIHRoZSBwYXJhbWV0ZXIuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZSB8IG51bWJlcn0geCAtIFRoZSBwYXJhbWV0ZXIuXHJcbiAqIEByZXR1cm5zIHtOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGV4cCA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBNYXRoTm9kZSwgTWF0aE5vZGUuRVhQICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAxICk7XHJcblxyXG4vKipcclxuICogUmV0dXJucyAyIHJhaXNlZCB0byB0aGUgcG93ZXIgb2YgdGhlIHBhcmFtZXRlci5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlIHwgbnVtYmVyfSB4IC0gVGhlIHBhcmFtZXRlci5cclxuICogQHJldHVybnMge05vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZXhwMiA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBNYXRoTm9kZSwgTWF0aE5vZGUuRVhQMiApLnNldFBhcmFtZXRlckxlbmd0aCggMSApO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIG5hdHVyYWwgbG9nYXJpdGhtIG9mIHRoZSBwYXJhbWV0ZXIuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZSB8IG51bWJlcn0geCAtIFRoZSBwYXJhbWV0ZXIuXHJcbiAqIEByZXR1cm5zIHtOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGxvZyA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBNYXRoTm9kZSwgTWF0aE5vZGUuTE9HICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAxICk7XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgYmFzZSAyIGxvZ2FyaXRobSBvZiB0aGUgcGFyYW1ldGVyLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGUgfCBudW1iZXJ9IHggLSBUaGUgcGFyYW1ldGVyLlxyXG4gKiBAcmV0dXJucyB7Tm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBsb2cyID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE1hdGhOb2RlLCBNYXRoTm9kZS5MT0cyICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAxICk7XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgc3F1YXJlIHJvb3Qgb2YgdGhlIHBhcmFtZXRlci5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlIHwgbnVtYmVyfSB4IC0gVGhlIHBhcmFtZXRlci5cclxuICogQHJldHVybnMge05vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgc3FydCA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBNYXRoTm9kZSwgTWF0aE5vZGUuU1FSVCApLnNldFBhcmFtZXRlckxlbmd0aCggMSApO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIGludmVyc2Ugb2YgdGhlIHNxdWFyZSByb290IG9mIHRoZSBwYXJhbWV0ZXIuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZSB8IG51bWJlcn0geCAtIFRoZSBwYXJhbWV0ZXIuXHJcbiAqIEByZXR1cm5zIHtOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGludmVyc2VTcXJ0ID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE1hdGhOb2RlLCBNYXRoTm9kZS5JTlZFUlNFX1NRUlQgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDEgKTtcclxuXHJcbi8qKlxyXG4gKiBGaW5kcyB0aGUgbmVhcmVzdCBpbnRlZ2VyIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgcGFyYW1ldGVyLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGUgfCBudW1iZXJ9IHggLSBUaGUgcGFyYW1ldGVyLlxyXG4gKiBAcmV0dXJucyB7Tm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBmbG9vciA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBNYXRoTm9kZSwgTWF0aE5vZGUuRkxPT1IgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDEgKTtcclxuXHJcbi8qKlxyXG4gKiBGaW5kcyB0aGUgbmVhcmVzdCBpbnRlZ2VyIHRoYXQgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwYXJhbWV0ZXIuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZSB8IG51bWJlcn0geCAtIFRoZSBwYXJhbWV0ZXIuXHJcbiAqIEByZXR1cm5zIHtOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGNlaWwgPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggTWF0aE5vZGUsIE1hdGhOb2RlLkNFSUwgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDEgKTtcclxuXHJcbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSB1bml0IHZlY3RvciBpbiB0aGUgc2FtZSBkaXJlY3Rpb24gYXMgdGhlIG9yaWdpbmFsIHZlY3Rvci5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlfSB4IC0gVGhlIGlucHV0IHZlY3Rvci5cclxuICogQHJldHVybnMge05vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgbm9ybWFsaXplID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE1hdGhOb2RlLCBNYXRoTm9kZS5OT1JNQUxJWkUgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDEgKTtcclxuXHJcbi8qKlxyXG4gKiBDb21wdXRlcyB0aGUgZnJhY3Rpb25hbCBwYXJ0IG9mIHRoZSBwYXJhbWV0ZXIuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZSB8IG51bWJlcn0geCAtIFRoZSBwYXJhbWV0ZXIuXHJcbiAqIEByZXR1cm5zIHtOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGZyYWN0ID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE1hdGhOb2RlLCBNYXRoTm9kZS5GUkFDVCApLnNldFBhcmFtZXRlckxlbmd0aCggMSApO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIHNpbmUgb2YgdGhlIHBhcmFtZXRlci5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlIHwgbnVtYmVyfSB4IC0gVGhlIHBhcmFtZXRlci5cclxuICogQHJldHVybnMge05vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgc2luID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE1hdGhOb2RlLCBNYXRoTm9kZS5TSU4gKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDEgKTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBjb3NpbmUgb2YgdGhlIHBhcmFtZXRlci5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlIHwgbnVtYmVyfSB4IC0gVGhlIHBhcmFtZXRlci5cclxuICogQHJldHVybnMge05vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgY29zID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE1hdGhOb2RlLCBNYXRoTm9kZS5DT1MgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDEgKTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSB0YW5nZW50IG9mIHRoZSBwYXJhbWV0ZXIuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZSB8IG51bWJlcn0geCAtIFRoZSBwYXJhbWV0ZXIuXHJcbiAqIEByZXR1cm5zIHtOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHRhbiA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBNYXRoTm9kZSwgTWF0aE5vZGUuVEFOICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAxICk7XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgYXJjc2luZSBvZiB0aGUgcGFyYW1ldGVyLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGUgfCBudW1iZXJ9IHggLSBUaGUgcGFyYW1ldGVyLlxyXG4gKiBAcmV0dXJucyB7Tm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBhc2luID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE1hdGhOb2RlLCBNYXRoTm9kZS5BU0lOICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAxICk7XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgYXJjY29zaW5lIG9mIHRoZSBwYXJhbWV0ZXIuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZSB8IG51bWJlcn0geCAtIFRoZSBwYXJhbWV0ZXIuXHJcbiAqIEByZXR1cm5zIHtOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGFjb3MgPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggTWF0aE5vZGUsIE1hdGhOb2RlLkFDT1MgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDEgKTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBhcmMtdGFuZ2VudCBvZiB0aGUgcGFyYW1ldGVyLlxyXG4gKiBJZiB0d28gcGFyYW1ldGVycyBhcmUgcHJvdmlkZWQsIHRoZSByZXN1bHQgaXMgYGF0YW4yKHkveClgLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGUgfCBudW1iZXJ9IHkgLSBUaGUgeSBwYXJhbWV0ZXIuXHJcbiAqIEBwYXJhbSB7PyhOb2RlIHwgbnVtYmVyKX0geCAtIFRoZSB4IHBhcmFtZXRlci5cclxuICogQHJldHVybnMge05vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYXRhbiA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBNYXRoTm9kZSwgTWF0aE5vZGUuQVRBTiApLnNldFBhcmFtZXRlckxlbmd0aCggMSwgMiApO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZSB8IG51bWJlcn0geCAtIFRoZSBwYXJhbWV0ZXIuXHJcbiAqIEByZXR1cm5zIHtOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGFicyA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBNYXRoTm9kZSwgTWF0aE5vZGUuQUJTICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAxICk7XHJcblxyXG4vKipcclxuICogRXh0cmFjdHMgdGhlIHNpZ24gb2YgdGhlIHBhcmFtZXRlci5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlIHwgbnVtYmVyfSB4IC0gVGhlIHBhcmFtZXRlci5cclxuICogQHJldHVybnMge05vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgc2lnbiA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBNYXRoTm9kZSwgTWF0aE5vZGUuU0lHTiApLnNldFBhcmFtZXRlckxlbmd0aCggMSApO1xyXG5cclxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGxlbmd0aCBvZiBhIHZlY3Rvci5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlfSB4IC0gVGhlIHBhcmFtZXRlci5cclxuICogQHJldHVybnMge05vZGU8ZmxvYXQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGxlbmd0aCA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBNYXRoTm9kZSwgTWF0aE5vZGUuTEVOR1RIICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAxICk7XHJcblxyXG4vKipcclxuICogTmVnYXRlcyB0aGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlciAoLXgpLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGUgfCBudW1iZXJ9IHggLSBUaGUgcGFyYW1ldGVyLlxyXG4gKiBAcmV0dXJucyB7Tm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBuZWdhdGUgPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggTWF0aE5vZGUsIE1hdGhOb2RlLk5FR0FURSApLnNldFBhcmFtZXRlckxlbmd0aCggMSApO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybiBgMWAgbWludXMgdGhlIHBhcmFtZXRlci5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlIHwgbnVtYmVyfSB4IC0gVGhlIHBhcmFtZXRlci5cclxuICogQHJldHVybnMge05vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgb25lTWludXMgPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggTWF0aE5vZGUsIE1hdGhOb2RlLk9ORV9NSU5VUyApLnNldFBhcmFtZXRlckxlbmd0aCggMSApO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIHBhcnRpYWwgZGVyaXZhdGl2ZSBvZiB0aGUgcGFyYW1ldGVyIHdpdGggcmVzcGVjdCB0byB4LlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGUgfCBudW1iZXJ9IHggLSBUaGUgcGFyYW1ldGVyLlxyXG4gKiBAcmV0dXJucyB7Tm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBkRmR4ID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE1hdGhOb2RlLCBNYXRoTm9kZS5ERkRYICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAxICk7XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgcGFydGlhbCBkZXJpdmF0aXZlIG9mIHRoZSBwYXJhbWV0ZXIgd2l0aCByZXNwZWN0IHRvIHkuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZSB8IG51bWJlcn0geCAtIFRoZSBwYXJhbWV0ZXIuXHJcbiAqIEByZXR1cm5zIHtOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGRGZHkgPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggTWF0aE5vZGUsIE1hdGhOb2RlLkRGRFkgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDEgKTtcclxuXHJcbi8qKlxyXG4gKiBSb3VuZHMgdGhlIHBhcmFtZXRlciB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGUgfCBudW1iZXJ9IHggLSBUaGUgcGFyYW1ldGVyLlxyXG4gKiBAcmV0dXJucyB7Tm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCByb3VuZCA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBNYXRoTm9kZSwgTWF0aE5vZGUuUk9VTkQgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDEgKTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSByZWNpcHJvY2FsIG9mIHRoZSBwYXJhbWV0ZXIgYCgxL3gpYC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlIHwgbnVtYmVyfSB4IC0gVGhlIHBhcmFtZXRlci5cclxuICogQHJldHVybnMge05vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcmVjaXByb2NhbCA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBNYXRoTm9kZSwgTWF0aE5vZGUuUkVDSVBST0NBTCApLnNldFBhcmFtZXRlckxlbmd0aCggMSApO1xyXG5cclxuLyoqXHJcbiAqIFRydW5jYXRlcyB0aGUgcGFyYW1ldGVyLCByZW1vdmluZyB0aGUgZnJhY3Rpb25hbCBwYXJ0LlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGUgfCBudW1iZXJ9IHggLSBUaGUgcGFyYW1ldGVyLlxyXG4gKiBAcmV0dXJucyB7Tm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCB0cnVuYyA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBNYXRoTm9kZSwgTWF0aE5vZGUuVFJVTkMgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDEgKTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBzdW0gb2YgdGhlIGFic29sdXRlIGRlcml2YXRpdmVzIGluIHggYW5kIHkuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZSB8IG51bWJlcn0geCAtIFRoZSBwYXJhbWV0ZXIuXHJcbiAqIEByZXR1cm5zIHtOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGZ3aWR0aCA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBNYXRoTm9kZSwgTWF0aE5vZGUuRldJRFRIICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAxICk7XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgdHJhbnNwb3NlIG9mIGEgbWF0cml4LlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGU8bWF0MnxtYXQzfG1hdDQ+fSB4IC0gVGhlIHBhcmFtZXRlci5cclxuICogQHJldHVybnMge05vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdHJhbnNwb3NlID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE1hdGhOb2RlLCBNYXRoTm9kZS5UUkFOU1BPU0UgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDEgKTtcclxuXHJcbi8vIDIgaW5wdXRzXHJcblxyXG4vKipcclxuICogUmVpbnRlcnByZXQgdGhlIGJpdCByZXByZXNlbnRhdGlvbiBvZiBhIHZhbHVlIGluIG9uZSB0eXBlIGFzIGEgdmFsdWUgaW4gYW5vdGhlciB0eXBlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGUgfCBudW1iZXJ9IHggLSBUaGUgcGFyYW1ldGVyLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30geSAtIFRoZSBuZXcgdHlwZS5cclxuICogQHJldHVybnMge05vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYml0Y2FzdCA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBNYXRoTm9kZSwgTWF0aE5vZGUuQklUQ0FTVCApLnNldFBhcmFtZXRlckxlbmd0aCggMiApO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYHRydWVgIGlmIGB4YCBlcXVhbHMgYHlgLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGUgfCBudW1iZXJ9IHggLSBUaGUgZmlyc3QgcGFyYW1ldGVyLlxyXG4gKiBAcGFyYW0ge05vZGUgfCBudW1iZXJ9IHkgLSBUaGUgc2Vjb25kIHBhcmFtZXRlci5cclxuICogQGRlcHJlY2F0ZWQgc2luY2UgcjE3NS4gVXNlIHtAbGluayBlcXVhbH0gaW5zdGVhZC5cclxuICogQHJldHVybnMge05vZGU8Ym9vbD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZXF1YWxzID0gKCB4LCB5ICkgPT4geyAvLyBAZGVwcmVjYXRlZCwgcjE3MlxyXG5cclxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5UU0w6IFwiZXF1YWxzXCIgaXMgZGVwcmVjYXRlZC4gVXNlIFwiZXF1YWxcIiBpbnNpZGUgYSB2ZWN0b3IgaW5zdGVhZCwgbGlrZTogXCJidmVjKiggZXF1YWwoIC4uLiApIClcIicgKTtcclxuXHRyZXR1cm4gZXF1YWwoIHgsIHkgKTtcclxuXHJcbn07XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgbGVhc3Qgb2YgdGhlIGdpdmVuIHZhbHVlcy5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHsuLi4oTm9kZSB8IG51bWJlcil9IHZhbHVlcyAtIFRoZSB2YWx1ZXMgdG8gY29tcGFyZS5cclxuICogQHJldHVybnMge05vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbWluID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE1hdGhOb2RlLCBNYXRoTm9kZS5NSU4gKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDIsIEluZmluaXR5ICk7XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgZ3JlYXRlc3Qgb2YgdGhlIGdpdmVuIHZhbHVlcy5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHsuLi4oTm9kZSB8IG51bWJlcil9IHZhbHVlcyAtIFRoZSB2YWx1ZXMgdG8gY29tcGFyZS5cclxuICogQHJldHVybnMge05vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbWF4ID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE1hdGhOb2RlLCBNYXRoTm9kZS5NQVggKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDIsIEluZmluaXR5ICk7XHJcblxyXG4vKipcclxuICogR2VuZXJhdGUgYSBzdGVwIGZ1bmN0aW9uIGJ5IGNvbXBhcmluZyB0d28gdmFsdWVzLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGUgfCBudW1iZXJ9IHggLSBUaGUgeSBwYXJhbWV0ZXIuXHJcbiAqIEBwYXJhbSB7Tm9kZSB8IG51bWJlcn0geSAtIFRoZSB4IHBhcmFtZXRlci5cclxuICogQHJldHVybnMge05vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgc3RlcCA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBNYXRoTm9kZSwgTWF0aE5vZGUuU1RFUCApLnNldFBhcmFtZXRlckxlbmd0aCggMiApO1xyXG5cclxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIHJlZmxlY3Rpb24gZGlyZWN0aW9uIGZvciBhbiBpbmNpZGVudCB2ZWN0b3IuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMyfHZlYzN8dmVjND59IEkgLSBUaGUgaW5jaWRlbnQgdmVjdG9yLlxyXG4gKiBAcGFyYW0ge05vZGU8dmVjMnx2ZWMzfHZlYzQ+fSBOIC0gVGhlIG5vcm1hbCB2ZWN0b3IuXHJcbiAqIEByZXR1cm5zIHtOb2RlPHZlYzJ8dmVjM3x2ZWM0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCByZWZsZWN0ID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE1hdGhOb2RlLCBNYXRoTm9kZS5SRUZMRUNUICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAyICk7XHJcblxyXG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0d28gcG9pbnRzLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGU8dmVjMnx2ZWMzfHZlYzQ+fSB4IC0gVGhlIGZpcnN0IHBvaW50LlxyXG4gKiBAcGFyYW0ge05vZGU8dmVjMnx2ZWMzfHZlYzQ+fSB5IC0gVGhlIHNlY29uZCBwb2ludC5cclxuICogQHJldHVybnMge05vZGU8ZmxvYXQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGRpc3RhbmNlID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE1hdGhOb2RlLCBNYXRoTm9kZS5ESVNUQU5DRSApLnNldFBhcmFtZXRlckxlbmd0aCggMiApO1xyXG5cclxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGFic29sdXRlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gdmFsdWVzLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGUgfCBudW1iZXJ9IHggLSBUaGUgZmlyc3QgcGFyYW1ldGVyLlxyXG4gKiBAcGFyYW0ge05vZGUgfCBudW1iZXJ9IHkgLSBUaGUgc2Vjb25kIHBhcmFtZXRlci5cclxuICogQHJldHVybnMge05vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZGlmZmVyZW5jZSA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBNYXRoTm9kZSwgTWF0aE5vZGUuRElGRkVSRU5DRSApLnNldFBhcmFtZXRlckxlbmd0aCggMiApO1xyXG5cclxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGRvdCBwcm9kdWN0IG9mIHR3byB2ZWN0b3JzLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGU8dmVjMnx2ZWMzfHZlYzQ+fSB4IC0gVGhlIGZpcnN0IHZlY3Rvci5cclxuICogQHBhcmFtIHtOb2RlPHZlYzJ8dmVjM3x2ZWM0Pn0geSAtIFRoZSBzZWNvbmQgdmVjdG9yLlxyXG4gKiBAcmV0dXJucyB7Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZG90ID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE1hdGhOb2RlLCBNYXRoTm9kZS5ET1QgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDIgKTtcclxuXHJcbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBjcm9zcyBwcm9kdWN0IG9mIHR3byB2ZWN0b3JzLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGU8dmVjMnx2ZWMzfHZlYzQ+fSB4IC0gVGhlIGZpcnN0IHZlY3Rvci5cclxuICogQHBhcmFtIHtOb2RlPHZlYzJ8dmVjM3x2ZWM0Pn0geSAtIFRoZSBzZWNvbmQgdmVjdG9yLlxyXG4gKiBAcmV0dXJucyB7Tm9kZTx2ZWMyfHZlYzN8dmVjND59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgY3Jvc3MgPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggTWF0aE5vZGUsIE1hdGhOb2RlLkNST1NTICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAyICk7XHJcblxyXG4vKipcclxuICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgcGFyYW1ldGVyIHJhaXNlZCB0byB0aGUgcG93ZXIgb2YgdGhlIHNlY29uZCBvbmUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZSB8IG51bWJlcn0geCAtIFRoZSBmaXJzdCBwYXJhbWV0ZXIuXHJcbiAqIEBwYXJhbSB7Tm9kZSB8IG51bWJlcn0geSAtIFRoZSBzZWNvbmQgcGFyYW1ldGVyLlxyXG4gKiBAcmV0dXJucyB7Tm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBwb3cgPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggTWF0aE5vZGUsIE1hdGhOb2RlLlBPVyApLnNldFBhcmFtZXRlckxlbmd0aCggMiApO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIHNxdWFyZSBvZiB0aGUgcGFyYW1ldGVyLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGUgfCBudW1iZXJ9IHggLSBUaGUgZmlyc3QgcGFyYW1ldGVyLlxyXG4gKiBAcmV0dXJucyB7Tm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBwb3cyID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE1hdGhOb2RlLCBNYXRoTm9kZS5QT1csIDIgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDEgKTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBjdWJlIG9mIHRoZSBwYXJhbWV0ZXIuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZSB8IG51bWJlcn0geCAtIFRoZSBmaXJzdCBwYXJhbWV0ZXIuXHJcbiAqIEByZXR1cm5zIHtOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHBvdzMgPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggTWF0aE5vZGUsIE1hdGhOb2RlLlBPVywgMyApLnNldFBhcmFtZXRlckxlbmd0aCggMSApO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIGZvdXJ0aCBwb3dlciBvZiB0aGUgcGFyYW1ldGVyLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGUgfCBudW1iZXJ9IHggLSBUaGUgZmlyc3QgcGFyYW1ldGVyLlxyXG4gKiBAcmV0dXJucyB7Tm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBwb3c0ID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE1hdGhOb2RlLCBNYXRoTm9kZS5QT1csIDQgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDEgKTtcclxuXHJcbi8qKlxyXG4gKiBUcmFuc2Zvcm1zIHRoZSBkaXJlY3Rpb24gb2YgYSB2ZWN0b3IgYnkgYSBtYXRyaXggYW5kIHRoZW4gbm9ybWFsaXplcyB0aGUgcmVzdWx0LlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGU8dmVjMnx2ZWMzfHZlYzQ+fSBkaXJlY3Rpb24gLSBUaGUgZGlyZWN0aW9uIHZlY3Rvci5cclxuICogQHBhcmFtIHtOb2RlPG1hdDJ8bWF0M3xtYXQ0Pn0gbWF0cml4IC0gVGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC5cclxuICogQHJldHVybnMge05vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdHJhbnNmb3JtRGlyZWN0aW9uID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE1hdGhOb2RlLCBNYXRoTm9kZS5UUkFOU0ZPUk1fRElSRUNUSU9OICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAyICk7XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgY3ViZSByb290IG9mIGEgbnVtYmVyLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGUgfCBudW1iZXJ9IGEgLSBUaGUgZmlyc3QgcGFyYW1ldGVyLlxyXG4gKiBAcmV0dXJucyB7Tm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBjYnJ0ID0gKCBhICkgPT4gbXVsKCBzaWduKCBhICksIHBvdyggYWJzKCBhICksIDEuMCAvIDMuMCApICk7XHJcblxyXG4vKipcclxuICogQ2FsY3VsYXRlIHRoZSBzcXVhcmVkIGxlbmd0aCBvZiBhIHZlY3Rvci5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlPHZlYzJ8dmVjM3x2ZWM0Pn0gYSAtIFRoZSB2ZWN0b3IuXHJcbiAqIEByZXR1cm5zIHtOb2RlPGZsb2F0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBsZW5ndGhTcSA9ICggYSApID0+IGRvdCggYSwgYSApO1xyXG5cclxuLyoqXHJcbiAqIExpbmVhcmx5IGludGVycG9sYXRlcyBiZXR3ZWVuIHR3byB2YWx1ZXMuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZSB8IG51bWJlcn0gYSAtIFRoZSBmaXJzdCBwYXJhbWV0ZXIuXHJcbiAqIEBwYXJhbSB7Tm9kZSB8IG51bWJlcn0gYiAtIFRoZSBzZWNvbmQgcGFyYW1ldGVyLlxyXG4gKiBAcGFyYW0ge05vZGUgfCBudW1iZXJ9IHQgLSBUaGUgaW50ZXJwb2xhdGlvbiB2YWx1ZS5cclxuICogQHJldHVybnMge05vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbWl4ID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE1hdGhOb2RlLCBNYXRoTm9kZS5NSVggKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDMgKTtcclxuXHJcbi8qKlxyXG4gKiBDb25zdHJhaW5zIGEgdmFsdWUgdG8gbGllIGJldHdlZW4gdHdvIGZ1cnRoZXIgdmFsdWVzLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGUgfCBudW1iZXJ9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNvbnN0cmFpbi5cclxuICogQHBhcmFtIHtOb2RlIHwgbnVtYmVyfSBbbG93PTBdIC0gVGhlIGxvd2VyIGJvdW5kLlxyXG4gKiBAcGFyYW0ge05vZGUgfCBudW1iZXJ9IFtoaWdoPTFdIC0gVGhlIHVwcGVyIGJvdW5kLlxyXG4gKiBAcmV0dXJucyB7Tm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBjbGFtcCA9ICggdmFsdWUsIGxvdyA9IDAsIGhpZ2ggPSAxICkgPT4gbm9kZU9iamVjdCggbmV3IE1hdGhOb2RlKCBNYXRoTm9kZS5DTEFNUCwgbm9kZU9iamVjdCggdmFsdWUgKSwgbm9kZU9iamVjdCggbG93ICksIG5vZGVPYmplY3QoIGhpZ2ggKSApICk7XHJcblxyXG4vKipcclxuICogQ29uc3RyYWlucyBhIHZhbHVlIGJldHdlZW4gYDBgIGFuZCBgMWAuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZSB8IG51bWJlcn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY29uc3RyYWluLlxyXG4gKiBAcmV0dXJucyB7Tm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBzYXR1cmF0ZSA9ICggdmFsdWUgKSA9PiBjbGFtcCggdmFsdWUgKTtcclxuXHJcbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSByZWZyYWN0aW9uIGRpcmVjdGlvbiBmb3IgYW4gaW5jaWRlbnQgdmVjdG9yLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGU8dmVjMnx2ZWMzfHZlYzQ+fSBJIC0gVGhlIGluY2lkZW50IHZlY3Rvci5cclxuICogQHBhcmFtIHtOb2RlPHZlYzJ8dmVjM3x2ZWM0Pn0gTiAtIFRoZSBub3JtYWwgdmVjdG9yLlxyXG4gKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSBldGEgLSBUaGUgcmF0aW8gb2YgaW5kaWNlcyBvZiByZWZyYWN0aW9uLlxyXG4gKiBAcmV0dXJucyB7Tm9kZTx2ZWMyfHZlYzN8dmVjND59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcmVmcmFjdCA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBNYXRoTm9kZSwgTWF0aE5vZGUuUkVGUkFDVCApLnNldFBhcmFtZXRlckxlbmd0aCggMyApO1xyXG5cclxuLyoqXHJcbiAqIFBlcmZvcm1zIGEgSGVybWl0ZSBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdHdvIHZhbHVlcy5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlIHwgbnVtYmVyfSBsb3cgLSBUaGUgdmFsdWUgb2YgdGhlIGxvd2VyIGVkZ2Ugb2YgdGhlIEhlcm1pdGUgZnVuY3Rpb24uXHJcbiAqIEBwYXJhbSB7Tm9kZSB8IG51bWJlcn0gaGlnaCAtIFRoZSB2YWx1ZSBvZiB0aGUgdXBwZXIgZWRnZSBvZiB0aGUgSGVybWl0ZSBmdW5jdGlvbi5cclxuICogQHBhcmFtIHtOb2RlIHwgbnVtYmVyfSB4IC0gVGhlIHNvdXJjZSB2YWx1ZSBmb3IgaW50ZXJwb2xhdGlvbi5cclxuICogQHJldHVybnMge05vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgc21vb3Roc3RlcCA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBNYXRoTm9kZSwgTWF0aE5vZGUuU01PT1RIU1RFUCApLnNldFBhcmFtZXRlckxlbmd0aCggMyApO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSB2ZWN0b3IgcG9pbnRpbmcgaW4gdGhlIHNhbWUgZGlyZWN0aW9uIGFzIGFub3RoZXIuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMyfHZlYzN8dmVjND59IE4gLSBUaGUgdmVjdG9yIHRvIG9yaWVudC5cclxuICogQHBhcmFtIHtOb2RlPHZlYzJ8dmVjM3x2ZWM0Pn0gSSAtIFRoZSBpbmNpZGVudCB2ZWN0b3IuXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMyfHZlYzN8dmVjND59IE5yZWYgLSBUaGUgcmVmZXJlbmNlIHZlY3Rvci5cclxuICogQHJldHVybnMge05vZGU8dmVjMnx2ZWMzfHZlYzQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGZhY2VGb3J3YXJkID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE1hdGhOb2RlLCBNYXRoTm9kZS5GQUNFRk9SV0FSRCApLnNldFBhcmFtZXRlckxlbmd0aCggMyApO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSByYW5kb20gdmFsdWUgZm9yIHRoZSBnaXZlbiB1di5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlPHZlYzI+fSB1diAtIFRoZSB1diBub2RlLlxyXG4gKiBAcmV0dXJucyB7Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcmFuZCA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyB1diBdICkgPT4ge1xyXG5cclxuXHRjb25zdCBhID0gMTIuOTg5OCwgYiA9IDc4LjIzMywgYyA9IDQzNzU4LjU0NTM7XHJcblx0Y29uc3QgZHQgPSBkb3QoIHV2Lnh5LCB2ZWMyKCBhLCBiICkgKSwgc24gPSBtb2QoIGR0LCBQSSApO1xyXG5cclxuXHRyZXR1cm4gZnJhY3QoIHNpbiggc24gKS5tdWwoIGMgKSApO1xyXG5cclxufSApO1xyXG5cclxuLyoqXHJcbiAqIEFsaWFzIGZvciBgbWl4KClgIHdpdGggYSBkaWZmZXJlbnQgcGFyYW1ldGVyIG9yZGVyLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGUgfCBudW1iZXJ9IHQgLSBUaGUgaW50ZXJwb2xhdGlvbiB2YWx1ZS5cclxuICogQHBhcmFtIHtOb2RlIHwgbnVtYmVyfSBlMSAtIFRoZSBmaXJzdCBwYXJhbWV0ZXIuXHJcbiAqIEBwYXJhbSB7Tm9kZSB8IG51bWJlcn0gZTIgLSBUaGUgc2Vjb25kIHBhcmFtZXRlci5cclxuICogQHJldHVybnMge05vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbWl4RWxlbWVudCA9ICggdCwgZTEsIGUyICkgPT4gbWl4KCBlMSwgZTIsIHQgKTtcclxuXHJcbi8qKlxyXG4gKiBBbGlhcyBmb3IgYHNtb290aHN0ZXAoKWAgd2l0aCBhIGRpZmZlcmVudCBwYXJhbWV0ZXIgb3JkZXIuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZSB8IG51bWJlcn0geCAtIFRoZSBzb3VyY2UgdmFsdWUgZm9yIGludGVycG9sYXRpb24uXHJcbiAqIEBwYXJhbSB7Tm9kZSB8IG51bWJlcn0gbG93IC0gVGhlIHZhbHVlIG9mIHRoZSBsb3dlciBlZGdlIG9mIHRoZSBIZXJtaXRlIGZ1bmN0aW9uLlxyXG4gKiBAcGFyYW0ge05vZGUgfCBudW1iZXJ9IGhpZ2ggLSBUaGUgdmFsdWUgb2YgdGhlIHVwcGVyIGVkZ2Ugb2YgdGhlIEhlcm1pdGUgZnVuY3Rpb24uXHJcbiAqIEByZXR1cm5zIHtOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHNtb290aHN0ZXBFbGVtZW50ID0gKCB4LCBsb3csIGhpZ2ggKSA9PiBzbW9vdGhzdGVwKCBsb3csIGhpZ2gsIHggKTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBhcmMtdGFuZ2VudCBvZiB0aGUgcXVvdGllbnQgb2YgaXRzIHBhcmFtZXRlcnMuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBkZXByZWNhdGVkIHNpbmNlIHIxNzIuIFVzZSB7QGxpbmsgYXRhbn0gaW5zdGVhZC5cclxuICpcclxuICogQHBhcmFtIHtOb2RlIHwgbnVtYmVyfSB5IC0gVGhlIHkgcGFyYW1ldGVyLlxyXG4gKiBAcGFyYW0ge05vZGUgfCBudW1iZXJ9IHggLSBUaGUgeCBwYXJhbWV0ZXIuXHJcbiAqIEByZXR1cm5zIHtOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGF0YW4yID0gKCB5LCB4ICkgPT4geyAvLyBAZGVwcmVjYXRlZCwgcjE3MlxyXG5cclxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5UU0w6IFwiYXRhbjJcIiBpcyBvdmVybG9hZGVkLiBVc2UgXCJhdGFuXCIgaW5zdGVhZC4nICk7XHJcblx0cmV0dXJuIGF0YW4oIHksIHggKTtcclxuXHJcbn07XHJcblxyXG4vLyBHTFNMIGFsaWFzIGZ1bmN0aW9uXHJcblxyXG5leHBvcnQgY29uc3QgZmFjZWZvcndhcmQgPSBmYWNlRm9yd2FyZDtcclxuZXhwb3J0IGNvbnN0IGludmVyc2VzcXJ0ID0gaW52ZXJzZVNxcnQ7XHJcblxyXG4vLyBNZXRob2QgY2hhaW5pbmdcclxuXHJcbmFkZE1ldGhvZENoYWluaW5nKCAnYWxsJywgYWxsICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAnYW55JywgYW55ICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAnZXF1YWxzJywgZXF1YWxzICk7XHJcblxyXG5hZGRNZXRob2RDaGFpbmluZyggJ3JhZGlhbnMnLCByYWRpYW5zICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAnZGVncmVlcycsIGRlZ3JlZXMgKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICdleHAnLCBleHAgKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICdleHAyJywgZXhwMiApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ2xvZycsIGxvZyApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ2xvZzInLCBsb2cyICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAnc3FydCcsIHNxcnQgKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICdpbnZlcnNlU3FydCcsIGludmVyc2VTcXJ0ICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAnZmxvb3InLCBmbG9vciApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ2NlaWwnLCBjZWlsICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAnbm9ybWFsaXplJywgbm9ybWFsaXplICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAnZnJhY3QnLCBmcmFjdCApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ3NpbicsIHNpbiApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ2NvcycsIGNvcyApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ3RhbicsIHRhbiApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ2FzaW4nLCBhc2luICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAnYWNvcycsIGFjb3MgKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICdhdGFuJywgYXRhbiApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ2FicycsIGFicyApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ3NpZ24nLCBzaWduICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAnbGVuZ3RoJywgbGVuZ3RoICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAnbGVuZ3RoU3EnLCBsZW5ndGhTcSApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ25lZ2F0ZScsIG5lZ2F0ZSApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ29uZU1pbnVzJywgb25lTWludXMgKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICdkRmR4JywgZEZkeCApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ2RGZHknLCBkRmR5ICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAncm91bmQnLCByb3VuZCApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ3JlY2lwcm9jYWwnLCByZWNpcHJvY2FsICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAndHJ1bmMnLCB0cnVuYyApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ2Z3aWR0aCcsIGZ3aWR0aCApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ2F0YW4yJywgYXRhbjIgKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICdtaW4nLCBtaW4gKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICdtYXgnLCBtYXggKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICdzdGVwJywgc3RlcCApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ3JlZmxlY3QnLCByZWZsZWN0ICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAnZGlzdGFuY2UnLCBkaXN0YW5jZSApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ2RvdCcsIGRvdCApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ2Nyb3NzJywgY3Jvc3MgKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICdwb3cnLCBwb3cgKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICdwb3cyJywgcG93MiApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ3BvdzMnLCBwb3czICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAncG93NCcsIHBvdzQgKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICd0cmFuc2Zvcm1EaXJlY3Rpb24nLCB0cmFuc2Zvcm1EaXJlY3Rpb24gKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICdtaXgnLCBtaXhFbGVtZW50ICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAnY2xhbXAnLCBjbGFtcCApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ3JlZnJhY3QnLCByZWZyYWN0ICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAnc21vb3Roc3RlcCcsIHNtb290aHN0ZXBFbGVtZW50ICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAnZmFjZUZvcndhcmQnLCBmYWNlRm9yd2FyZCApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ2RpZmZlcmVuY2UnLCBkaWZmZXJlbmNlICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAnc2F0dXJhdGUnLCBzYXR1cmF0ZSApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ2NicnQnLCBjYnJ0ICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAndHJhbnNwb3NlJywgdHJhbnNwb3NlICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAncmFuZCcsIHJhbmQgKTtcclxuIiwiaW1wb3J0IE5vZGUgZnJvbSAnLi4vY29yZS9Ob2RlLmpzJztcclxuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICcuLi9jb3JlL1Byb3BlcnR5Tm9kZS5qcyc7XHJcbmltcG9ydCB7IGFkZE1ldGhvZENoYWluaW5nLCBub2RlUHJveHkgfSBmcm9tICcuLi90c2wvVFNMQ29yZS5qcyc7XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyBhIGxvZ2ljYWwgYGlmL2Vsc2VgIHN0YXRlbWVudC4gQ2FuIGJlIHVzZWQgYXMgYW4gYWx0ZXJuYXRpdmVcclxuICogdG8gdGhlIGBJZigpYC9gRWxzZSgpYCBzeW50YXguXHJcbiAqXHJcbiAqIFRoZSBjb3JyZXNwb25kaW5nIFRTTCBgc2VsZWN0KClgIGxvb2tzIGxpa2Ugc286XHJcbiAqIGBgYGpzXHJcbiAqIHZlbG9jaXR5ID0gcG9zaXRpb24uZ3JlYXRlclRoYW5FcXVhbCggbGltaXQgKS5zZWxlY3QoIHZlbG9jaXR5Lm5lZ2F0ZSgpLCB2ZWxvY2l0eSApO1xyXG4gKiBgYGBcclxuICogVGhlIGBzZWxlY3QoKWAgbWV0aG9kIGlzIGNhbGxlZCBpbiBhIGNoYWluaW5nIGZhc2hpb24gb24gYSBjb25kaXRpb24uIFRoZSBwYXJhbWV0ZXIgbm9kZXMgb2YgYHNlbGVjdCgpYFxyXG4gKiBkZXRlcm1pbmUgdGhlIG91dGNvbWUgb2YgdGhlIGVudGlyZSBzdGF0ZW1lbnQuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBOb2RlXHJcbiAqL1xyXG5jbGFzcyBDb25kaXRpb25hbE5vZGUgZXh0ZW5kcyBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnQ29uZGl0aW9uYWxOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGNvbmRpdGlvbmFsIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV9IGNvbmROb2RlIC0gVGhlIG5vZGUgdGhhdCBkZWZpbmVzIHRoZSBjb25kaXRpb24uXHJcblx0ICogQHBhcmFtIHtOb2RlfSBpZk5vZGUgLSBUaGUgbm9kZSB0aGF0IGlzIGV2YWx1YXRlIHdoZW4gdGhlIGNvbmRpdGlvbiBlbmRzIHVwIGB0cnVlYC5cclxuXHQgKiBAcGFyYW0gez9Ob2RlfSBbZWxzZU5vZGU9bnVsbF0gLSBUaGUgbm9kZSB0aGF0IGlzIGV2YWx1YXRlIHdoZW4gdGhlIGNvbmRpdGlvbiBlbmRzIHVwIGBmYWxzZWAuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGNvbmROb2RlLCBpZk5vZGUsIGVsc2VOb2RlID0gbnVsbCApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG5vZGUgdGhhdCBkZWZpbmVzIHRoZSBjb25kaXRpb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29uZE5vZGUgPSBjb25kTm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBub2RlIHRoYXQgaXMgZXZhbHVhdGUgd2hlbiB0aGUgY29uZGl0aW9uIGVuZHMgdXAgYHRydWVgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlmTm9kZSA9IGlmTm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBub2RlIHRoYXQgaXMgZXZhbHVhdGUgd2hlbiB0aGUgY29uZGl0aW9uIGVuZHMgdXAgYGZhbHNlYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZWxzZU5vZGUgPSBlbHNlTm9kZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyBvdmVyd3JpdHRlbiBzaW5jZSB0aGUgbm9kZSB0eXBlIGlzIGluZmVycmVkIGZyb20gdGhlIGlmL2Vsc2VcclxuXHQgKiBub2Rlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgbm9kZSB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldE5vZGVUeXBlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IHsgaWZOb2RlLCBlbHNlTm9kZSB9ID0gYnVpbGRlci5nZXROb2RlUHJvcGVydGllcyggdGhpcyApO1xyXG5cclxuXHRcdGlmICggaWZOb2RlID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHQvLyBmYWxsYmFjayBzZXR1cFxyXG5cclxuXHRcdFx0dGhpcy5zZXR1cCggYnVpbGRlciApO1xyXG5cclxuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgaWZUeXBlID0gaWZOb2RlLmdldE5vZGVUeXBlKCBidWlsZGVyICk7XHJcblxyXG5cdFx0aWYgKCBlbHNlTm9kZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGVsc2VUeXBlID0gZWxzZU5vZGUuZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRcdGlmICggYnVpbGRlci5nZXRUeXBlTGVuZ3RoKCBlbHNlVHlwZSApID4gYnVpbGRlci5nZXRUeXBlTGVuZ3RoKCBpZlR5cGUgKSApIHtcclxuXHJcblx0XHRcdFx0cmV0dXJuIGVsc2VUeXBlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gaWZUeXBlO1xyXG5cclxuXHR9XHJcblxyXG5cdHNldHVwKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IGNvbmROb2RlID0gdGhpcy5jb25kTm9kZS5jYWNoZSgpO1xyXG5cdFx0Y29uc3QgaWZOb2RlID0gdGhpcy5pZk5vZGUuY2FjaGUoKTtcclxuXHRcdGNvbnN0IGVsc2VOb2RlID0gdGhpcy5lbHNlTm9kZSA/IHRoaXMuZWxzZU5vZGUuY2FjaGUoKSA6IG51bGw7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCBjdXJyZW50Tm9kZUJsb2NrID0gYnVpbGRlci5jb250ZXh0Lm5vZGVCbG9jaztcclxuXHJcblx0XHRidWlsZGVyLmdldERhdGFGcm9tTm9kZSggaWZOb2RlICkucGFyZW50Tm9kZUJsb2NrID0gY3VycmVudE5vZGVCbG9jaztcclxuXHRcdGlmICggZWxzZU5vZGUgIT09IG51bGwgKSBidWlsZGVyLmdldERhdGFGcm9tTm9kZSggZWxzZU5vZGUgKS5wYXJlbnROb2RlQmxvY2sgPSBjdXJyZW50Tm9kZUJsb2NrO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0Y29uc3QgcHJvcGVydGllcyA9IGJ1aWxkZXIuZ2V0Tm9kZVByb3BlcnRpZXMoIHRoaXMgKTtcclxuXHRcdHByb3BlcnRpZXMuY29uZE5vZGUgPSBjb25kTm9kZTtcclxuXHRcdHByb3BlcnRpZXMuaWZOb2RlID0gaWZOb2RlLmNvbnRleHQoIHsgbm9kZUJsb2NrOiBpZk5vZGUgfSApO1xyXG5cdFx0cHJvcGVydGllcy5lbHNlTm9kZSA9IGVsc2VOb2RlID8gZWxzZU5vZGUuY29udGV4dCggeyBub2RlQmxvY2s6IGVsc2VOb2RlIH0gKSA6IG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0Z2VuZXJhdGUoIGJ1aWxkZXIsIG91dHB1dCApIHtcclxuXHJcblx0XHRjb25zdCB0eXBlID0gdGhpcy5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cclxuXHRcdGNvbnN0IG5vZGVEYXRhID0gYnVpbGRlci5nZXREYXRhRnJvbU5vZGUoIHRoaXMgKTtcclxuXHJcblx0XHRpZiAoIG5vZGVEYXRhLm5vZGVQcm9wZXJ0eSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIG5vZGVEYXRhLm5vZGVQcm9wZXJ0eTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgeyBjb25kTm9kZSwgaWZOb2RlLCBlbHNlTm9kZSB9ID0gYnVpbGRlci5nZXROb2RlUHJvcGVydGllcyggdGhpcyApO1xyXG5cclxuXHRcdGNvbnN0IGZ1bmN0aW9uTm9kZSA9IGJ1aWxkZXIuY3VycmVudEZ1bmN0aW9uTm9kZTtcclxuXHRcdGNvbnN0IG5lZWRzT3V0cHV0ID0gb3V0cHV0ICE9PSAndm9pZCc7XHJcblx0XHRjb25zdCBub2RlUHJvcGVydHkgPSBuZWVkc091dHB1dCA/IHByb3BlcnR5KCB0eXBlICkuYnVpbGQoIGJ1aWxkZXIgKSA6ICcnO1xyXG5cclxuXHRcdG5vZGVEYXRhLm5vZGVQcm9wZXJ0eSA9IG5vZGVQcm9wZXJ0eTtcclxuXHJcblx0XHRjb25zdCBub2RlU25pcHBldCA9IGNvbmROb2RlLmJ1aWxkKCBidWlsZGVyLCAnYm9vbCcgKTtcclxuXHJcblx0XHRidWlsZGVyLmFkZEZsb3dDb2RlKCBgXFxuJHsgYnVpbGRlci50YWIgfWlmICggJHsgbm9kZVNuaXBwZXQgfSApIHtcXG5cXG5gICkuYWRkRmxvd1RhYigpO1xyXG5cclxuXHRcdGxldCBpZlNuaXBwZXQgPSBpZk5vZGUuYnVpbGQoIGJ1aWxkZXIsIHR5cGUgKTtcclxuXHJcblx0XHRpZiAoIGlmU25pcHBldCApIHtcclxuXHJcblx0XHRcdGlmICggbmVlZHNPdXRwdXQgKSB7XHJcblxyXG5cdFx0XHRcdGlmU25pcHBldCA9IG5vZGVQcm9wZXJ0eSArICcgPSAnICsgaWZTbmlwcGV0ICsgJzsnO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0aWZTbmlwcGV0ID0gJ3JldHVybiAnICsgaWZTbmlwcGV0ICsgJzsnO1xyXG5cclxuXHRcdFx0XHRpZiAoIGZ1bmN0aW9uTm9kZSA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5UU0w6IFJldHVybiBzdGF0ZW1lbnQgdXNlZCBpbiBhbiBpbmxpbmUgXFwnRm4oKVxcJy4gRGVmaW5lIGEgbGF5b3V0IHN0cnVjdCB0byBhbGxvdyByZXR1cm4gdmFsdWVzLicgKTtcclxuXHJcblx0XHRcdFx0XHRpZlNuaXBwZXQgPSAnLy8gJyArIGlmU25pcHBldDtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRidWlsZGVyLnJlbW92ZUZsb3dUYWIoKS5hZGRGbG93Q29kZSggYnVpbGRlci50YWIgKyAnXFx0JyArIGlmU25pcHBldCArICdcXG5cXG4nICsgYnVpbGRlci50YWIgKyAnfScgKTtcclxuXHJcblx0XHRpZiAoIGVsc2VOb2RlICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0YnVpbGRlci5hZGRGbG93Q29kZSggJyBlbHNlIHtcXG5cXG4nICkuYWRkRmxvd1RhYigpO1xyXG5cclxuXHRcdFx0bGV0IGVsc2VTbmlwcGV0ID0gZWxzZU5vZGUuYnVpbGQoIGJ1aWxkZXIsIHR5cGUgKTtcclxuXHJcblx0XHRcdGlmICggZWxzZVNuaXBwZXQgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggbmVlZHNPdXRwdXQgKSB7XHJcblxyXG5cdFx0XHRcdFx0ZWxzZVNuaXBwZXQgPSBub2RlUHJvcGVydHkgKyAnID0gJyArIGVsc2VTbmlwcGV0ICsgJzsnO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdGVsc2VTbmlwcGV0ID0gJ3JldHVybiAnICsgZWxzZVNuaXBwZXQgKyAnOyc7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBmdW5jdGlvbk5vZGUgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5UU0w6IFJldHVybiBzdGF0ZW1lbnQgdXNlZCBpbiBhbiBpbmxpbmUgXFwnRm4oKVxcJy4gRGVmaW5lIGEgbGF5b3V0IHN0cnVjdCB0byBhbGxvdyByZXR1cm4gdmFsdWVzLicgKTtcclxuXHJcblx0XHRcdFx0XHRcdGVsc2VTbmlwcGV0ID0gJy8vICcgKyBlbHNlU25pcHBldDtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGJ1aWxkZXIucmVtb3ZlRmxvd1RhYigpLmFkZEZsb3dDb2RlKCBidWlsZGVyLnRhYiArICdcXHQnICsgZWxzZVNuaXBwZXQgKyAnXFxuXFxuJyArIGJ1aWxkZXIudGFiICsgJ31cXG5cXG4nICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGJ1aWxkZXIuYWRkRmxvd0NvZGUoICdcXG5cXG4nICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBidWlsZGVyLmZvcm1hdCggbm9kZVByb3BlcnR5LCB0eXBlLCBvdXRwdXQgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQ29uZGl0aW9uYWxOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSBjb25kaXRpb25hbCBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IGNvbmROb2RlIC0gVGhlIG5vZGUgdGhhdCBkZWZpbmVzIHRoZSBjb25kaXRpb24uXHJcbiAqIEBwYXJhbSB7Tm9kZX0gaWZOb2RlIC0gVGhlIG5vZGUgdGhhdCBpcyBldmFsdWF0ZSB3aGVuIHRoZSBjb25kaXRpb24gZW5kcyB1cCBgdHJ1ZWAuXHJcbiAqIEBwYXJhbSB7P05vZGV9IFtlbHNlTm9kZT1udWxsXSAtIFRoZSBub2RlIHRoYXQgaXMgZXZhbHVhdGUgd2hlbiB0aGUgY29uZGl0aW9uIGVuZHMgdXAgYGZhbHNlYC5cclxuICogQHJldHVybnMge0NvbmRpdGlvbmFsTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBzZWxlY3QgPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggQ29uZGl0aW9uYWxOb2RlICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAyLCAzICk7XHJcblxyXG5hZGRNZXRob2RDaGFpbmluZyggJ3NlbGVjdCcsIHNlbGVjdCApO1xyXG5cclxuLy8gRGVwcmVjYXRlZFxyXG5cclxuLyoqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBkZXByZWNhdGVkIHNpbmNlIHIxNjguIFVzZSB7QGxpbmsgc2VsZWN0fSBpbnN0ZWFkLlxyXG4gKlxyXG4gKiBAcGFyYW0gey4uLmFueX0gcGFyYW1zXHJcbiAqIEByZXR1cm5zIHtDb25kaXRpb25hbE5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgY29uZCA9ICggLi4ucGFyYW1zICkgPT4geyAvLyBAZGVwcmVjYXRlZCwgcjE2OFxyXG5cclxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5UU0w6IGNvbmQoKSBoYXMgYmVlbiByZW5hbWVkIHRvIHNlbGVjdCgpLicgKTtcclxuXHRyZXR1cm4gc2VsZWN0KCAuLi5wYXJhbXMgKTtcclxuXHJcbn07XHJcblxyXG5hZGRNZXRob2RDaGFpbmluZyggJ2NvbmQnLCBjb25kICk7XHJcbiIsImltcG9ydCBOb2RlIGZyb20gJy4vTm9kZS5qcyc7XHJcbmltcG9ydCB7IGFkZE1ldGhvZENoYWluaW5nLCBub2RlUHJveHkgfSBmcm9tICcuLi90c2wvVFNMQ29yZS5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBub2RlIGNhbiBiZSB1c2VkIGFzIGEgY29udGV4dCBtYW5hZ2VtZW50IGNvbXBvbmVudCBmb3IgYW5vdGhlciBub2RlLlxyXG4gKiB7QGxpbmsgTm9kZUJ1aWxkZXJ9IHBlcmZvcm1zIGl0cyBub2RlIGJ1aWxkaW5nIHByb2Nlc3MgaW4gYSBzcGVjaWZpYyBjb250ZXh0IGFuZFxyXG4gKiB0aGlzIG5vZGUgYWxsb3dzIHRoZSBtb2RpZnkgdGhlIGNvbnRleHQuIEEgdHlwaWNhbCB1c2UgY2FzZSBpcyB0byBvdmVyd3JpdGUgYGdldFVWKClgIGUuZy46XHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqbm9kZS5jb250ZXh0KCB7IGdldFVWOiAoKSA9PiBjdXN0b21Db29yZCB9ICk7XHJcbiAqYGBgXHJcbiAqIEBhdWdtZW50cyBOb2RlXHJcbiAqL1xyXG5jbGFzcyBDb250ZXh0Tm9kZSBleHRlbmRzIE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdDb250ZXh0Tm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBjb250ZXh0IG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBUaGUgbm9kZSB3aG9zZSBjb250ZXh0IHNob3VsZCBiZSBtb2RpZmllZC5cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW3ZhbHVlPXt9XSAtIFRoZSBtb2RpZmllZCBjb250ZXh0IGRhdGEuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5vZGUsIHZhbHVlID0ge30gKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNDb250ZXh0Tm9kZSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbm9kZSB3aG9zZSBjb250ZXh0IHNob3VsZCBiZSBtb2RpZmllZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub2RlID0gbm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBtb2RpZmllZCBjb250ZXh0IGRhdGEuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqIEBkZWZhdWx0IHt9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudmFsdWUgPSB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyBvdmVyd3JpdHRlbiB0byBlbnN1cmUgaXQgcmV0dXJucyB0aGUgcmVmZXJlbmNlIHRvIHtAbGluayBDb250ZXh0Tm9kZSNub2RlfS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge05vZGV9IEEgcmVmZXJlbmNlIHRvIHtAbGluayBDb250ZXh0Tm9kZSNub2RlfS5cclxuXHQgKi9cclxuXHRnZXRTY29wZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5ub2RlLmdldFNjb3BlKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgaXMgb3ZlcndyaXR0ZW4gdG8gZW5zdXJlIGl0IHJldHVybnMgdGhlIHR5cGUgb2Yge0BsaW5rIENvbnRleHROb2RlI25vZGV9LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBub2RlIHR5cGUuXHJcblx0ICovXHJcblx0Z2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubm9kZS5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdGFuYWx5emUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0dGhpcy5ub2RlLmJ1aWxkKCBidWlsZGVyICk7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXAoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgcHJldmlvdXNDb250ZXh0ID0gYnVpbGRlci5nZXRDb250ZXh0KCk7XHJcblxyXG5cdFx0YnVpbGRlci5zZXRDb250ZXh0KCB7IC4uLmJ1aWxkZXIuY29udGV4dCwgLi4udGhpcy52YWx1ZSB9ICk7XHJcblxyXG5cdFx0Y29uc3Qgbm9kZSA9IHRoaXMubm9kZS5idWlsZCggYnVpbGRlciApO1xyXG5cclxuXHRcdGJ1aWxkZXIuc2V0Q29udGV4dCggcHJldmlvdXNDb250ZXh0ICk7XHJcblxyXG5cdFx0cmV0dXJuIG5vZGU7XHJcblxyXG5cdH1cclxuXHJcblx0Z2VuZXJhdGUoIGJ1aWxkZXIsIG91dHB1dCApIHtcclxuXHJcblx0XHRjb25zdCBwcmV2aW91c0NvbnRleHQgPSBidWlsZGVyLmdldENvbnRleHQoKTtcclxuXHJcblx0XHRidWlsZGVyLnNldENvbnRleHQoIHsgLi4uYnVpbGRlci5jb250ZXh0LCAuLi50aGlzLnZhbHVlIH0gKTtcclxuXHJcblx0XHRjb25zdCBzbmlwcGV0ID0gdGhpcy5ub2RlLmJ1aWxkKCBidWlsZGVyLCBvdXRwdXQgKTtcclxuXHJcblx0XHRidWlsZGVyLnNldENvbnRleHQoIHByZXZpb3VzQ29udGV4dCApO1xyXG5cclxuXHRcdHJldHVybiBzbmlwcGV0O1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBDb250ZXh0Tm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgY29udGV4dCBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBUaGUgbm9kZSB3aG9zZSBjb250ZXh0IHNob3VsZCBiZSBtb2RpZmllZC5cclxuICogQHBhcmFtIHtPYmplY3R9IFt2YWx1ZT17fV0gLSBUaGUgbW9kaWZpZWQgY29udGV4dCBkYXRhLlxyXG4gKiBAcmV0dXJucyB7Q29udGV4dE5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgY29udGV4dCA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBDb250ZXh0Tm9kZSApLnNldFBhcmFtZXRlckxlbmd0aCggMSwgMiApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgZGVmaW5pbmcgYSBsYWJlbCBjb250ZXh0IHZhbHVlIGZvciBhIGdpdmVuIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFRoZSBub2RlIHdob3NlIGNvbnRleHQgc2hvdWxkIGJlIG1vZGlmaWVkLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lL2xhYmVsIHRvIHNldC5cclxuICogQHJldHVybnMge0NvbnRleHROb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGxhYmVsID0gKCBub2RlLCBuYW1lICkgPT4gY29udGV4dCggbm9kZSwgeyBsYWJlbDogbmFtZSB9ICk7XHJcblxyXG5hZGRNZXRob2RDaGFpbmluZyggJ2NvbnRleHQnLCBjb250ZXh0ICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAnbGFiZWwnLCBsYWJlbCApO1xyXG4iLCJpbXBvcnQgTm9kZSBmcm9tICcuL05vZGUuanMnO1xyXG5pbXBvcnQgeyBhZGRNZXRob2RDaGFpbmluZywgbm9kZVByb3h5IH0gZnJvbSAnLi4vdHNsL1RTTENvcmUuanMnO1xyXG5cclxuLyoqXHJcbiAqIENsYXNzIGZvciByZXByZXNlbnRpbmcgc2hhZGVyIHZhcmlhYmxlcyBhcyBub2Rlcy4gVmFyaWFibGVzIGFyZSBjcmVhdGVkIGZyb21cclxuICogZXhpc3Rpbmcgbm9kZXMgbGlrZSB0aGUgZm9sbG93aW5nOlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBkZXB0aCA9IHNhbXBsZURlcHRoKCB1dk5vZGUgKS50b1ZhciggJ2RlcHRoJyApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVcclxuICovXHJcbmNsYXNzIFZhck5vZGUgZXh0ZW5kcyBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnVmFyTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB2YXJpYWJsZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIG5vZGUgZm9yIHdoaWNoIGEgdmFyaWFibGUgc2hvdWxkIGJlIGNyZWF0ZWQuXHJcblx0ICogQHBhcmFtIHs/c3RyaW5nfSBbbmFtZT1udWxsXSAtIFRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSBpbiB0aGUgc2hhZGVyLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JlYWRPbmx5PWZhbHNlXSAtIFRoZSByZWFkLW9ubHkgZmxhZy5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggbm9kZSwgbmFtZSA9IG51bGwsIHJlYWRPbmx5ID0gZmFsc2UgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBub2RlIGZvciB3aGljaCBhIHZhcmlhYmxlIHNob3VsZCBiZSBjcmVhdGVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vZGUgPSBub2RlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIGluIHRoZSBzaGFkZXIuIElmIG5vIG5hbWUgaXMgZGVmaW5lZCxcclxuXHRcdCAqIHRoZSBub2RlIHN5c3RlbSBhdXRvLWdlbmVyYXRlcyBvbmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9zdHJpbmd9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubmFtZSA9IG5hbWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBgVmFyTm9kZWAgc2V0cyB0aGlzIHByb3BlcnR5IHRvIGB0cnVlYCBieSBkZWZhdWx0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdsb2JhbCA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzVmFyTm9kZSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKlxyXG5cdFx0ICogVGhlIHJlYWQtb25seSBmbGFnLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yZWFkT25seSA9IHJlYWRPbmx5O1xyXG5cclxuXHR9XHJcblxyXG5cdGdldE1lbWJlclR5cGUoIGJ1aWxkZXIsIG5hbWUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubm9kZS5nZXRNZW1iZXJUeXBlKCBidWlsZGVyLCBuYW1lICk7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0RWxlbWVudFR5cGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubm9kZS5nZXRFbGVtZW50VHlwZSggYnVpbGRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdGdldE5vZGVUeXBlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm5vZGUuZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHRnZW5lcmF0ZSggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCB7IG5vZGUsIG5hbWUsIHJlYWRPbmx5IH0gPSB0aGlzO1xyXG5cdFx0Y29uc3QgeyByZW5kZXJlciB9ID0gYnVpbGRlcjtcclxuXHJcblx0XHRjb25zdCBpc1dlYkdQVUJhY2tlbmQgPSByZW5kZXJlci5iYWNrZW5kLmlzV2ViR1BVQmFja2VuZCA9PT0gdHJ1ZTtcclxuXHJcblx0XHRsZXQgaXNEZXRlcm1pbmlzdGljID0gZmFsc2U7XHJcblx0XHRsZXQgc2hvdWxkVHJlYXRBc1JlYWRPbmx5ID0gZmFsc2U7XHJcblxyXG5cdFx0aWYgKCByZWFkT25seSApIHtcclxuXHJcblx0XHRcdGlzRGV0ZXJtaW5pc3RpYyA9IGJ1aWxkZXIuaXNEZXRlcm1pbmlzdGljKCBub2RlICk7XHJcblxyXG5cdFx0XHRzaG91bGRUcmVhdEFzUmVhZE9ubHkgPSBpc1dlYkdQVUJhY2tlbmQgPyByZWFkT25seSA6IGlzRGV0ZXJtaW5pc3RpYztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgdmVjdG9yVHlwZSA9IGJ1aWxkZXIuZ2V0VmVjdG9yVHlwZSggdGhpcy5nZXROb2RlVHlwZSggYnVpbGRlciApICk7XHJcblx0XHRjb25zdCBzbmlwcGV0ID0gbm9kZS5idWlsZCggYnVpbGRlciwgdmVjdG9yVHlwZSApO1xyXG5cclxuXHRcdGNvbnN0IG5vZGVWYXIgPSBidWlsZGVyLmdldFZhckZyb21Ob2RlKCB0aGlzLCBuYW1lLCB2ZWN0b3JUeXBlLCB1bmRlZmluZWQsIHNob3VsZFRyZWF0QXNSZWFkT25seSApO1xyXG5cclxuXHRcdGNvbnN0IHByb3BlcnR5TmFtZSA9IGJ1aWxkZXIuZ2V0UHJvcGVydHlOYW1lKCBub2RlVmFyICk7XHJcblxyXG5cdFx0bGV0IGRlY2xhcmF0aW9uUHJlZml4ID0gcHJvcGVydHlOYW1lO1xyXG5cclxuXHRcdGlmICggc2hvdWxkVHJlYXRBc1JlYWRPbmx5ICkge1xyXG5cclxuXHRcdFx0aWYgKCBpc1dlYkdQVUJhY2tlbmQgKSB7XHJcblxyXG5cdFx0XHRcdGRlY2xhcmF0aW9uUHJlZml4ID0gaXNEZXRlcm1pbmlzdGljXHJcblx0XHRcdFx0XHQ/IGBjb25zdCAkeyBwcm9wZXJ0eU5hbWUgfWBcclxuXHRcdFx0XHRcdDogYGxldCAkeyBwcm9wZXJ0eU5hbWUgfWA7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRjb25zdCBjb3VudCA9IGJ1aWxkZXIuZ2V0QXJyYXlDb3VudCggbm9kZSApO1xyXG5cclxuXHRcdFx0XHRkZWNsYXJhdGlvblByZWZpeCA9IGBjb25zdCAkeyBidWlsZGVyLmdldFZhciggbm9kZVZhci50eXBlLCBwcm9wZXJ0eU5hbWUsIGNvdW50ICkgfWA7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGJ1aWxkZXIuYWRkTGluZUZsb3dDb2RlKCBgJHsgZGVjbGFyYXRpb25QcmVmaXggfSA9ICR7IHNuaXBwZXQgfWAsIHRoaXMgKTtcclxuXHJcblx0XHRyZXR1cm4gcHJvcGVydHlOYW1lO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBWYXJOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSB2YXIgbm9kZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIG5vZGUgZm9yIHdoaWNoIGEgdmFyaWFibGUgc2hvdWxkIGJlIGNyZWF0ZWQuXHJcbiAqIEBwYXJhbSB7P3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSBpbiB0aGUgc2hhZGVyLlxyXG4gKiBAcmV0dXJucyB7VmFyTm9kZX1cclxuICovXHJcbmNvbnN0IGNyZWF0ZVZhciA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBWYXJOb2RlICk7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIHZhciBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBUaGUgbm9kZSBmb3Igd2hpY2ggYSB2YXJpYWJsZSBzaG91bGQgYmUgY3JlYXRlZC5cclxuICogQHBhcmFtIHs/c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIGluIHRoZSBzaGFkZXIuXHJcbiAqIEByZXR1cm5zIHtWYXJOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFZhciA9ICggbm9kZSwgbmFtZSA9IG51bGwgKSA9PiBjcmVhdGVWYXIoIG5vZGUsIG5hbWUgKS5hcHBlbmQoKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgY29uc3Qgbm9kZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIG5vZGUgZm9yIHdoaWNoIGEgY29uc3RhbnQgc2hvdWxkIGJlIGNyZWF0ZWQuXHJcbiAqIEBwYXJhbSB7P3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBjb25zdGFudCBpbiB0aGUgc2hhZGVyLlxyXG4gKiBAcmV0dXJucyB7VmFyTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBDb25zdCA9ICggbm9kZSwgbmFtZSA9IG51bGwgKSA9PiBjcmVhdGVWYXIoIG5vZGUsIG5hbWUsIHRydWUgKS5hcHBlbmQoKTtcclxuXHJcbi8vIE1ldGhvZCBjaGFpbmluZ1xyXG5cclxuYWRkTWV0aG9kQ2hhaW5pbmcoICd0b1ZhcicsIFZhciApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ3RvQ29uc3QnLCBDb25zdCApO1xyXG5cclxuLy8gRGVwcmVjYXRlZFxyXG5cclxuLyoqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBkZXByZWNhdGVkIHNpbmNlIHIxNzAuIFVzZSBgVmFyKCBub2RlIClgIG9yIGBub2RlLnRvVmFyKClgIGluc3RlYWQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7YW55fSBub2RlXHJcbiAqIEByZXR1cm5zIHtWYXJOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHRlbXAgPSAoIG5vZGUgKSA9PiB7IC8vIEBkZXByZWNhdGVkLCByMTcwXHJcblxyXG5cdGNvbnNvbGUud2FybiggJ1RTTDogXCJ0ZW1wKCBub2RlIClcIiBpcyBkZXByZWNhdGVkLiBVc2UgXCJWYXIoIG5vZGUgKVwiIG9yIFwibm9kZS50b1ZhcigpXCIgaW5zdGVhZC4nICk7XHJcblxyXG5cdHJldHVybiBjcmVhdGVWYXIoIG5vZGUgKTtcclxuXHJcbn07XHJcblxyXG5hZGRNZXRob2RDaGFpbmluZyggJ3RlbXAnLCB0ZW1wICk7XHJcblxyXG4iLCJpbXBvcnQgTm9kZSBmcm9tICcuL05vZGUuanMnO1xyXG5pbXBvcnQgeyBOb2RlU2hhZGVyU3RhZ2UgfSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IGFkZE1ldGhvZENoYWluaW5nLCBub2RlUHJveHkgfSBmcm9tICcuLi90c2wvVFNMQ29yZS5qcyc7XHJcblxyXG4vKipcclxuICogQ2xhc3MgZm9yIHJlcHJlc2VudGluZyBzaGFkZXIgdmFyeWluZ3MgYXMgbm9kZXMuIFZhcnlpbmdzIGFyZSBjcmVhdGUgZnJvbVxyXG4gKiBleGlzdGluZyBub2RlcyBsaWtlIHRoZSBmb2xsb3dpbmc6XHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IHBvc2l0aW9uTG9jYWwgPSBwb3NpdGlvbkdlb21ldHJ5LnRvVmFyeWluZyggJ3ZQb3NpdGlvbkxvY2FsJyApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVcclxuICovXHJcbmNsYXNzIFZhcnlpbmdOb2RlIGV4dGVuZHMgTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ1ZhcnlpbmdOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHZhcnlpbmcgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFRoZSBub2RlIGZvciB3aGljaCBhIHZhcnlpbmcgc2hvdWxkIGJlIGNyZWF0ZWQuXHJcblx0ICogQHBhcmFtIHs/c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHZhcnlpbmcgaW4gdGhlIHNoYWRlci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggbm9kZSwgbmFtZSA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBub2RlIGZvciB3aGljaCBhIHZhcnlpbmcgc2hvdWxkIGJlIGNyZWF0ZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9kZSA9IG5vZGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbmFtZSBvZiB0aGUgdmFyeWluZyBpbiB0aGUgc2hhZGVyLiBJZiBubyBuYW1lIGlzIGRlZmluZWQsXHJcblx0XHQgKiB0aGUgbm9kZSBzeXN0ZW0gYXV0by1nZW5lcmF0ZXMgb25lLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/c3RyaW5nfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5hbWUgPSBuYW1lO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1ZhcnlpbmdOb2RlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgbWV0aG9kIGlzIG92ZXJ3cml0dGVuIHNvIGl0IGFsd2F5cyByZXR1cm5zIGB0cnVlYC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGlzIG5vZGUgaXMgZ2xvYmFsIG9yIG5vdC5cclxuXHQgKi9cclxuXHRpc0dsb2JhbCggLypidWlsZGVyKi8gKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0SGFzaCggYnVpbGRlciApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5uYW1lIHx8IHN1cGVyLmdldEhhc2goIGJ1aWxkZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHRnZXROb2RlVHlwZSggYnVpbGRlciApIHtcclxuXHJcblx0XHQvLyBWYXJ5aW5nTm9kZSBpcyBhdXRvIHR5cGVcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5ub2RlLmdldE5vZGVUeXBlKCBidWlsZGVyICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgcGVyZm9ybXMgdGhlIHNldHVwIG9mIGEgdmFyeWluZyBub2RlIHdpdGggdGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtOb2RlVmFyeWluZ30gVGhlIG5vZGUgdmFyeWluZyBmcm9tIHRoZSBub2RlIGJ1aWxkZXIuXHJcblx0ICovXHJcblx0c2V0dXBWYXJ5aW5nKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IHByb3BlcnRpZXMgPSBidWlsZGVyLmdldE5vZGVQcm9wZXJ0aWVzKCB0aGlzICk7XHJcblxyXG5cdFx0bGV0IHZhcnlpbmcgPSBwcm9wZXJ0aWVzLnZhcnlpbmc7XHJcblxyXG5cdFx0aWYgKCB2YXJ5aW5nID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBuYW1lID0gdGhpcy5uYW1lO1xyXG5cdFx0XHRjb25zdCB0eXBlID0gdGhpcy5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cclxuXHRcdFx0cHJvcGVydGllcy52YXJ5aW5nID0gdmFyeWluZyA9IGJ1aWxkZXIuZ2V0VmFyeWluZ0Zyb21Ob2RlKCB0aGlzLCBuYW1lLCB0eXBlICk7XHJcblx0XHRcdHByb3BlcnRpZXMubm9kZSA9IHRoaXMubm9kZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gdGhpcyBwcm9wZXJ0eSBjYW4gYmUgdXNlZCB0byBjaGVjayBpZiB0aGUgdmFyeWluZyBjYW4gYmUgb3B0aW1pemVkIGZvciBhIHZhcmlhYmxlXHJcblx0XHR2YXJ5aW5nLm5lZWRzSW50ZXJwb2xhdGlvbiB8fCAoIHZhcnlpbmcubmVlZHNJbnRlcnBvbGF0aW9uID0gKCBidWlsZGVyLnNoYWRlclN0YWdlID09PSAnZnJhZ21lbnQnICkgKTtcclxuXHJcblx0XHRyZXR1cm4gdmFyeWluZztcclxuXHJcblx0fVxyXG5cclxuXHRzZXR1cCggYnVpbGRlciApIHtcclxuXHJcblx0XHR0aGlzLnNldHVwVmFyeWluZyggYnVpbGRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdGFuYWx5emUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0dGhpcy5zZXR1cFZhcnlpbmcoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5ub2RlLmFuYWx5emUoIGJ1aWxkZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHRnZW5lcmF0ZSggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCBwcm9wZXJ0aWVzID0gYnVpbGRlci5nZXROb2RlUHJvcGVydGllcyggdGhpcyApO1xyXG5cdFx0Y29uc3QgdmFyeWluZyA9IHRoaXMuc2V0dXBWYXJ5aW5nKCBidWlsZGVyICk7XHJcblxyXG5cdFx0Y29uc3QgbmVlZHNSZWFzc2lnbiA9IGJ1aWxkZXIuc2hhZGVyU3RhZ2UgPT09ICdmcmFnbWVudCcgJiYgcHJvcGVydGllcy5yZWFzc2lnblBvc2l0aW9uID09PSB0cnVlICYmIGJ1aWxkZXIuY29udGV4dC5uZWVkc1Bvc2l0aW9uUmVhc3NpZ247XHJcblxyXG5cdFx0aWYgKCBwcm9wZXJ0aWVzLnByb3BlcnR5TmFtZSA9PT0gdW5kZWZpbmVkIHx8IG5lZWRzUmVhc3NpZ24gKSB7XHJcblxyXG5cdFx0XHRjb25zdCB0eXBlID0gdGhpcy5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cdFx0XHRjb25zdCBwcm9wZXJ0eU5hbWUgPSBidWlsZGVyLmdldFByb3BlcnR5TmFtZSggdmFyeWluZywgTm9kZVNoYWRlclN0YWdlLlZFUlRFWCApO1xyXG5cclxuXHRcdFx0Ly8gZm9yY2Ugbm9kZSBydW4gaW4gdmVydGV4IHN0YWdlXHJcblx0XHRcdGJ1aWxkZXIuZmxvd05vZGVGcm9tU2hhZGVyU3RhZ2UoIE5vZGVTaGFkZXJTdGFnZS5WRVJURVgsIHRoaXMubm9kZSwgdHlwZSwgcHJvcGVydHlOYW1lICk7XHJcblxyXG5cdFx0XHRwcm9wZXJ0aWVzLnByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTtcclxuXHJcblx0XHRcdGlmICggbmVlZHNSZWFzc2lnbiApIHtcclxuXHJcblx0XHRcdFx0Ly8gb25jZSByZWFzc2lnbiB2YXJ5aW5nIGluIGZyYWdtZW50IHN0YWdlXHJcblx0XHRcdFx0cHJvcGVydGllcy5yZWFzc2lnblBvc2l0aW9uID0gZmFsc2U7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBwcm9wZXJ0aWVzLnJlYXNzaWduUG9zaXRpb24gPT09IHVuZGVmaW5lZCAmJiBidWlsZGVyLmNvbnRleHQuaXNQb3NpdGlvbk5vZGVJbnB1dCApIHtcclxuXHJcblx0XHRcdFx0cHJvcGVydGllcy5yZWFzc2lnblBvc2l0aW9uID0gdHJ1ZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGJ1aWxkZXIuZ2V0UHJvcGVydHlOYW1lKCB2YXJ5aW5nICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFZhcnlpbmdOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSB2YXJ5aW5nIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFRoZSBub2RlIGZvciB3aGljaCBhIHZhcnlpbmcgc2hvdWxkIGJlIGNyZWF0ZWQuXHJcbiAqIEBwYXJhbSB7P3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB2YXJ5aW5nIGluIHRoZSBzaGFkZXIuXHJcbiAqIEByZXR1cm5zIHtWYXJ5aW5nTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCB2YXJ5aW5nID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIFZhcnlpbmdOb2RlICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAxLCAyICk7XHJcblxyXG4vKipcclxuICogQ29tcHV0ZXMgYSBub2RlIGluIHRoZSB2ZXJ0ZXggc3RhZ2UuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFRoZSBub2RlIHdoaWNoIHNob3VsZCBiZSBleGVjdXRlZCBpbiB0aGUgdmVydGV4IHN0YWdlLlxyXG4gKiBAcmV0dXJucyB7VmFyeWluZ05vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdmVydGV4U3RhZ2UgPSAoIG5vZGUgKSA9PiB2YXJ5aW5nKCBub2RlICk7XHJcblxyXG5hZGRNZXRob2RDaGFpbmluZyggJ3RvVmFyeWluZycsIHZhcnlpbmcgKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICd0b1ZlcnRleFN0YWdlJywgdmVydGV4U3RhZ2UgKTtcclxuXHJcbi8vIERlcHJlY2F0ZWRcclxuXHJcbmFkZE1ldGhvZENoYWluaW5nKCAndmFyeWluZycsICggLi4ucGFyYW1zICkgPT4geyAvLyBAZGVwcmVjYXRlZCwgcjE3M1xyXG5cclxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5UU0w6IC52YXJ5aW5nKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAudG9WYXJ5aW5nKCkuJyApO1xyXG5cdHJldHVybiB2YXJ5aW5nKCAuLi5wYXJhbXMgKTtcclxuXHJcbn0gKTtcclxuXHJcbmFkZE1ldGhvZENoYWluaW5nKCAndmVydGV4U3RhZ2UnLCAoIC4uLnBhcmFtcyApID0+IHsgLy8gQGRlcHJlY2F0ZWQsIHIxNzNcclxuXHJcblx0Y29uc29sZS53YXJuKCAnVEhSRUUuVFNMOiAudmVydGV4U3RhZ2UoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC50b1ZlcnRleFN0YWdlKCkuJyApO1xyXG5cdHJldHVybiB2YXJ5aW5nKCAuLi5wYXJhbXMgKTtcclxuXHJcbn0gKTtcclxuIiwiaW1wb3J0IHsgbWl4IH0gZnJvbSAnLi4vbWF0aC9NYXRoTm9kZS5qcyc7XHJcbmltcG9ydCB7IEZuIH0gZnJvbSAnLi4vdHNsL1RTTENvcmUuanMnO1xyXG5cclxuLyoqXHJcbiAqIENvbnZlcnRzIHRoZSBnaXZlbiBjb2xvciB2YWx1ZSBmcm9tIHNSR0IgdG8gbGluZWFyLXNSR0IgY29sb3Igc3BhY2UuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMzPn0gY29sb3IgLSBUaGUgc1JHQiBjb2xvci5cclxuICogQHJldHVybiB7Tm9kZTx2ZWMzPn0gVGhlIGxpbmVhci1zUkdCIGNvbG9yLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHNSR0JUcmFuc2ZlckVPVEYgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgY29sb3IgXSApID0+IHtcclxuXHJcblx0Y29uc3QgYSA9IGNvbG9yLm11bCggMC45NDc4NjcyOTg2ICkuYWRkKCAwLjA1MjEzMjcwMTQgKS5wb3coIDIuNCApO1xyXG5cdGNvbnN0IGIgPSBjb2xvci5tdWwoIDAuMDc3Mzk5MzgwOCApO1xyXG5cdGNvbnN0IGZhY3RvciA9IGNvbG9yLmxlc3NUaGFuRXF1YWwoIDAuMDQwNDUgKTtcclxuXHJcblx0Y29uc3QgcmdiUmVzdWx0ID0gbWl4KCBhLCBiLCBmYWN0b3IgKTtcclxuXHJcblx0cmV0dXJuIHJnYlJlc3VsdDtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnc1JHQlRyYW5zZmVyRU9URicsXHJcblx0dHlwZTogJ3ZlYzMnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAnY29sb3InLCB0eXBlOiAndmVjMycgfVxyXG5cdF1cclxufSApO1xyXG5cclxuLyoqXHJcbiAqIENvbnZlcnRzIHRoZSBnaXZlbiBjb2xvciB2YWx1ZSBmcm9tIGxpbmVhci1zUkdCIHRvIHNSR0IgY29sb3Igc3BhY2UuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMzPn0gY29sb3IgLSBUaGUgbGluZWFyLXNSR0IgY29sb3IuXHJcbiAqIEByZXR1cm4ge05vZGU8dmVjMz59IFRoZSBzUkdCIGNvbG9yLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHNSR0JUcmFuc2Zlck9FVEYgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgY29sb3IgXSApID0+IHtcclxuXHJcblx0Y29uc3QgYSA9IGNvbG9yLnBvdyggMC40MTY2NiApLm11bCggMS4wNTUgKS5zdWIoIDAuMDU1ICk7XHJcblx0Y29uc3QgYiA9IGNvbG9yLm11bCggMTIuOTIgKTtcclxuXHRjb25zdCBmYWN0b3IgPSBjb2xvci5sZXNzVGhhbkVxdWFsKCAwLjAwMzEzMDggKTtcclxuXHJcblx0Y29uc3QgcmdiUmVzdWx0ID0gbWl4KCBhLCBiLCBmYWN0b3IgKTtcclxuXHJcblx0cmV0dXJuIHJnYlJlc3VsdDtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnc1JHQlRyYW5zZmVyT0VURicsXHJcblx0dHlwZTogJ3ZlYzMnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAnY29sb3InLCB0eXBlOiAndmVjMycgfVxyXG5cdF1cclxufSApO1xyXG4iLCJpbXBvcnQgVGVtcE5vZGUgZnJvbSAnLi4vY29yZS9UZW1wTm9kZS5qcyc7XHJcbmltcG9ydCB7IGFkZE1ldGhvZENoYWluaW5nLCBtYXQzLCBub2RlT2JqZWN0LCB2ZWM0IH0gZnJvbSAnLi4vdHNsL1RTTENvcmUuanMnO1xyXG5cclxuaW1wb3J0IHsgU1JHQlRyYW5zZmVyIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgQ29sb3JNYW5hZ2VtZW50IH0gZnJvbSAnLi4vLi4vbWF0aC9Db2xvck1hbmFnZW1lbnQuanMnO1xyXG5pbXBvcnQgeyBzUkdCVHJhbnNmZXJFT1RGLCBzUkdCVHJhbnNmZXJPRVRGIH0gZnJvbSAnLi9Db2xvclNwYWNlRnVuY3Rpb25zLmpzJztcclxuaW1wb3J0IHsgTWF0cml4MyB9IGZyb20gJy4uLy4uL21hdGgvTWF0cml4My5qcyc7XHJcblxyXG5jb25zdCBXT1JLSU5HX0NPTE9SX1NQQUNFID0gJ1dvcmtpbmdDb2xvclNwYWNlJztcclxuY29uc3QgT1VUUFVUX0NPTE9SX1NQQUNFID0gJ091dHB1dENvbG9yU3BhY2UnO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgbm9kZSByZXByZXNlbnRzIGEgY29sb3Igc3BhY2UgY29udmVyc2lvbi4gTWVhbmluZyBpdCBjb252ZXJ0c1xyXG4gKiBhIGNvbG9yIHZhbHVlIGZyb20gYSBzb3VyY2UgdG8gYSB0YXJnZXQgY29sb3Igc3BhY2UuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBUZW1wTm9kZVxyXG4gKi9cclxuY2xhc3MgQ29sb3JTcGFjZU5vZGUgZXh0ZW5kcyBUZW1wTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ0NvbG9yU3BhY2VOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGNvbG9yIHNwYWNlIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV9IGNvbG9yTm9kZSAtIFJlcHJlc2VudHMgdGhlIGNvbG9yIHRvIGNvbnZlcnQuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSAtIFRoZSBzb3VyY2UgY29sb3Igc3BhY2UuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHRhcmdldCAtIFRoZSB0YXJnZXQgY29sb3Igc3BhY2UuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGNvbG9yTm9kZSwgc291cmNlLCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0c3VwZXIoICd2ZWM0JyApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVwcmVzZW50cyB0aGUgY29sb3IgdG8gY29udmVydC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb2xvck5vZGUgPSBjb2xvck5vZGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc291cmNlIGNvbG9yIHNwYWNlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc291cmNlID0gc291cmNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHRhcmdldCBjb2xvciBzcGFjZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRhcmdldCA9IHRhcmdldDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCByZXNvbHZlcyB0aGUgY29uc3RhbnRzIGBXT1JLSU5HX0NPTE9SX1NQQUNFYCBhbmRcclxuXHQgKiBgT1VUUFVUX0NPTE9SX1NQQUNFYCBiYXNlZCBvbiB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIG9mIHRoZVxyXG5cdCAqIGNvbG9yIG1hbmFnZW1lbnQgYW5kIHJlbmRlcmVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gY29sb3JTcGFjZSAtIFRoZSBjb2xvciBzcGFjZSB0byByZXNvbHZlLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHJlc29sdmVkIGNvbG9yIHNwYWNlLlxyXG5cdCAqL1xyXG5cdHJlc29sdmVDb2xvclNwYWNlKCBidWlsZGVyLCBjb2xvclNwYWNlICkge1xyXG5cclxuXHRcdGlmICggY29sb3JTcGFjZSA9PT0gV09SS0lOR19DT0xPUl9TUEFDRSApIHtcclxuXHJcblx0XHRcdHJldHVybiBDb2xvck1hbmFnZW1lbnQud29ya2luZ0NvbG9yU3BhY2U7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggY29sb3JTcGFjZSA9PT0gT1VUUFVUX0NPTE9SX1NQQUNFICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIGJ1aWxkZXIuY29udGV4dC5vdXRwdXRDb2xvclNwYWNlIHx8IGJ1aWxkZXIucmVuZGVyZXIub3V0cHV0Q29sb3JTcGFjZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGNvbG9yU3BhY2U7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXAoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBjb2xvck5vZGUgfSA9IHRoaXM7XHJcblxyXG5cdFx0Y29uc3Qgc291cmNlID0gdGhpcy5yZXNvbHZlQ29sb3JTcGFjZSggYnVpbGRlciwgdGhpcy5zb3VyY2UgKTtcclxuXHRcdGNvbnN0IHRhcmdldCA9IHRoaXMucmVzb2x2ZUNvbG9yU3BhY2UoIGJ1aWxkZXIsIHRoaXMudGFyZ2V0ICk7XHJcblxyXG5cdFx0bGV0IG91dHB1dE5vZGUgPSBjb2xvck5vZGU7XHJcblxyXG5cdFx0aWYgKCBDb2xvck1hbmFnZW1lbnQuZW5hYmxlZCA9PT0gZmFsc2UgfHwgc291cmNlID09PSB0YXJnZXQgfHwgISBzb3VyY2UgfHwgISB0YXJnZXQgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gb3V0cHV0Tm9kZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBDb2xvck1hbmFnZW1lbnQuZ2V0VHJhbnNmZXIoIHNvdXJjZSApID09PSBTUkdCVHJhbnNmZXIgKSB7XHJcblxyXG5cdFx0XHRvdXRwdXROb2RlID0gdmVjNCggc1JHQlRyYW5zZmVyRU9URiggb3V0cHV0Tm9kZS5yZ2IgKSwgb3V0cHV0Tm9kZS5hICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggQ29sb3JNYW5hZ2VtZW50LmdldFByaW1hcmllcyggc291cmNlICkgIT09IENvbG9yTWFuYWdlbWVudC5nZXRQcmltYXJpZXMoIHRhcmdldCApICkge1xyXG5cclxuXHRcdFx0b3V0cHV0Tm9kZSA9IHZlYzQoXHJcblx0XHRcdFx0bWF0MyggQ29sb3JNYW5hZ2VtZW50Ll9nZXRNYXRyaXgoIG5ldyBNYXRyaXgzKCksIHNvdXJjZSwgdGFyZ2V0ICkgKS5tdWwoIG91dHB1dE5vZGUucmdiICksXHJcblx0XHRcdFx0b3V0cHV0Tm9kZS5hXHJcblx0XHRcdCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggQ29sb3JNYW5hZ2VtZW50LmdldFRyYW5zZmVyKCB0YXJnZXQgKSA9PT0gU1JHQlRyYW5zZmVyICkge1xyXG5cclxuXHRcdFx0b3V0cHV0Tm9kZSA9IHZlYzQoIHNSR0JUcmFuc2Zlck9FVEYoIG91dHB1dE5vZGUucmdiICksIG91dHB1dE5vZGUuYSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gb3V0cHV0Tm9kZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQ29sb3JTcGFjZU5vZGU7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjb252ZXJ0aW5nIGEgZ2l2ZW4gY29sb3Igbm9kZSB0byB0aGUgY3VycmVudCBvdXRwdXQgY29sb3Igc3BhY2UuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFJlcHJlc2VudHMgdGhlIG5vZGUgdG8gY29udmVydC5cclxuICogQHJldHVybnMge0NvbG9yU3BhY2VOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHRvT3V0cHV0Q29sb3JTcGFjZSA9ICggbm9kZSApID0+IG5vZGVPYmplY3QoIG5ldyBDb2xvclNwYWNlTm9kZSggbm9kZU9iamVjdCggbm9kZSApLCBXT1JLSU5HX0NPTE9SX1NQQUNFLCBPVVRQVVRfQ09MT1JfU1BBQ0UgKSApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY29udmVydGluZyBhIGdpdmVuIGNvbG9yIG5vZGUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBjb2xvciBzcGFjZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlfSBub2RlIC0gUmVwcmVzZW50cyB0aGUgbm9kZSB0byBjb252ZXJ0LlxyXG4gKiBAcmV0dXJucyB7Q29sb3JTcGFjZU5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdG9Xb3JraW5nQ29sb3JTcGFjZSA9ICggbm9kZSApID0+IG5vZGVPYmplY3QoIG5ldyBDb2xvclNwYWNlTm9kZSggbm9kZU9iamVjdCggbm9kZSApLCBPVVRQVVRfQ09MT1JfU1BBQ0UsIFdPUktJTkdfQ09MT1JfU1BBQ0UgKSApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY29udmVydGluZyBhIGdpdmVuIGNvbG9yIG5vZGUgZnJvbSB0aGUgY3VycmVudCB3b3JraW5nIGNvbG9yIHNwYWNlIHRvIHRoZSBnaXZlbiBjb2xvciBzcGFjZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlfSBub2RlIC0gUmVwcmVzZW50cyB0aGUgbm9kZSB0byBjb252ZXJ0LlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gY29sb3JTcGFjZSAtIFRoZSB0YXJnZXQgY29sb3Igc3BhY2UuXHJcbiAqIEByZXR1cm5zIHtDb2xvclNwYWNlTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCB3b3JraW5nVG9Db2xvclNwYWNlID0gKCBub2RlLCBjb2xvclNwYWNlICkgPT4gbm9kZU9iamVjdCggbmV3IENvbG9yU3BhY2VOb2RlKCBub2RlT2JqZWN0KCBub2RlICksIFdPUktJTkdfQ09MT1JfU1BBQ0UsIGNvbG9yU3BhY2UgKSApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY29udmVydGluZyBhIGdpdmVuIGNvbG9yIG5vZGUgZnJvbSB0aGUgZ2l2ZW4gY29sb3Igc3BhY2UgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBjb2xvciBzcGFjZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlfSBub2RlIC0gUmVwcmVzZW50cyB0aGUgbm9kZSB0byBjb252ZXJ0LlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gY29sb3JTcGFjZSAtIFRoZSBzb3VyY2UgY29sb3Igc3BhY2UuXHJcbiAqIEByZXR1cm5zIHtDb2xvclNwYWNlTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBjb2xvclNwYWNlVG9Xb3JraW5nID0gKCBub2RlLCBjb2xvclNwYWNlICkgPT4gbm9kZU9iamVjdCggbmV3IENvbG9yU3BhY2VOb2RlKCBub2RlT2JqZWN0KCBub2RlICksIGNvbG9yU3BhY2UsIFdPUktJTkdfQ09MT1JfU1BBQ0UgKSApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY29udmVydGluZyBhIGdpdmVuIGNvbG9yIG5vZGUgZnJvbSBvbmUgY29sb3Igc3BhY2UgdG8gYW5vdGhlciBvbmUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFJlcHJlc2VudHMgdGhlIG5vZGUgdG8gY29udmVydC5cclxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZUNvbG9yU3BhY2UgLSBUaGUgc291cmNlIGNvbG9yIHNwYWNlLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFyZ2V0Q29sb3JTcGFjZSAtIFRoZSB0YXJnZXQgY29sb3Igc3BhY2UuXHJcbiAqIEByZXR1cm5zIHtDb2xvclNwYWNlTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBjb252ZXJ0Q29sb3JTcGFjZSA9ICggbm9kZSwgc291cmNlQ29sb3JTcGFjZSwgdGFyZ2V0Q29sb3JTcGFjZSApID0+IG5vZGVPYmplY3QoIG5ldyBDb2xvclNwYWNlTm9kZSggbm9kZU9iamVjdCggbm9kZSApLCBzb3VyY2VDb2xvclNwYWNlLCB0YXJnZXRDb2xvclNwYWNlICkgKTtcclxuXHJcbmFkZE1ldGhvZENoYWluaW5nKCAndG9PdXRwdXRDb2xvclNwYWNlJywgdG9PdXRwdXRDb2xvclNwYWNlICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAndG9Xb3JraW5nQ29sb3JTcGFjZScsIHRvV29ya2luZ0NvbG9yU3BhY2UgKTtcclxuXHJcbmFkZE1ldGhvZENoYWluaW5nKCAnd29ya2luZ1RvQ29sb3JTcGFjZScsIHdvcmtpbmdUb0NvbG9yU3BhY2UgKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICdjb2xvclNwYWNlVG9Xb3JraW5nJywgY29sb3JTcGFjZVRvV29ya2luZyApO1xyXG4iLCJpbXBvcnQgTm9kZSBmcm9tICcuLi9jb3JlL05vZGUuanMnO1xyXG5pbXBvcnQgeyBOb2RlVXBkYXRlVHlwZSB9IGZyb20gJy4uL2NvcmUvY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgdW5pZm9ybSB9IGZyb20gJy4uL2NvcmUvVW5pZm9ybU5vZGUuanMnO1xyXG5pbXBvcnQgeyBub2RlT2JqZWN0IH0gZnJvbSAnLi4vdHNsL1RTTENvcmUuanMnO1xyXG5pbXBvcnQgQXJyYXlFbGVtZW50Tm9kZSBmcm9tICcuLi91dGlscy9BcnJheUVsZW1lbnROb2RlLmpzJztcclxuXHJcbi8vIFRPRE86IEF2b2lkIGR1cGxpY2F0ZWQgY29kZSBhbmQgdWVzIG9ubHkgUmVmZXJlbmNlQmFzZU5vZGUgb3IgUmVmZXJlbmNlTm9kZVxyXG5cclxuLyoqXHJcbiAqIFRoaXMgY2xhc3MgaXMgb25seSByZWxldmFudCBpZiB0aGUgcmVmZXJlbmNlZCBwcm9wZXJ0eSBpcyBhcnJheS1saWtlLlxyXG4gKiBJbiB0aGlzIGNhc2UsIGBSZWZlcmVuY2VFbGVtZW50Tm9kZWAgYWxsb3dzIHRvIHJlZmVyIHRvIGEgc3BlY2lmaWNcclxuICogZWxlbWVudCBpbnNpZGUgdGhlIGRhdGEgc3RydWN0dXJlIHZpYSBhbiBpbmRleC5cclxuICpcclxuICogQGF1Z21lbnRzIEFycmF5RWxlbWVudE5vZGVcclxuICovXHJcbmNsYXNzIFJlZmVyZW5jZUVsZW1lbnROb2RlIGV4dGVuZHMgQXJyYXlFbGVtZW50Tm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ1JlZmVyZW5jZUVsZW1lbnROb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHJlZmVyZW5jZSBlbGVtZW50IG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JlZmVyZW5jZUJhc2VOb2RlfSByZWZlcmVuY2VOb2RlIC0gVGhlIHJlZmVyZW5jZSBub2RlLlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gaW5kZXhOb2RlIC0gVGhlIGluZGV4IG5vZGUgdGhhdCBkZWZpbmVzIHRoZSBlbGVtZW50IGFjY2Vzcy5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcmVmZXJlbmNlTm9kZSwgaW5kZXhOb2RlICkge1xyXG5cclxuXHRcdHN1cGVyKCByZWZlcmVuY2VOb2RlLCBpbmRleE5vZGUgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNpbWlsYXIgdG8ge0BsaW5rIFJlZmVyZW5jZUJhc2VOb2RlI3JlZmVyZW5jZX0sIGFuIGFkZGl0aW9uYWxcclxuXHRcdCAqIHByb3BlcnR5IHJlZmVyZW5jZXMgdG8gdGhlIGN1cnJlbnQgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1JlZmVyZW5jZUJhc2VOb2RlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJlZmVyZW5jZU5vZGUgPSByZWZlcmVuY2VOb2RlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1JlZmVyZW5jZUVsZW1lbnROb2RlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyBvdmVyd3JpdHRlbiBzaW5jZSB0aGUgbm9kZSB0eXBlIGlzIGluZmVycmVkIGZyb21cclxuXHQgKiB0aGUgdW5pZm9ybSB0eXBlIG9mIHRoZSByZWZlcmVuY2Ugbm9kZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG5vZGUgdHlwZS5cclxuXHQgKi9cclxuXHRnZXROb2RlVHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5yZWZlcmVuY2VOb2RlLnVuaWZvcm1UeXBlO1xyXG5cclxuXHR9XHJcblxyXG5cdGdlbmVyYXRlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IHNuaXBwZXQgPSBzdXBlci5nZW5lcmF0ZSggYnVpbGRlciApO1xyXG5cdFx0Y29uc3QgYXJyYXlUeXBlID0gdGhpcy5yZWZlcmVuY2VOb2RlLmdldE5vZGVUeXBlKCk7XHJcblx0XHRjb25zdCBlbGVtZW50VHlwZSA9IHRoaXMuZ2V0Tm9kZVR5cGUoKTtcclxuXHJcblx0XHRyZXR1cm4gYnVpbGRlci5mb3JtYXQoIHNuaXBwZXQsIGFycmF5VHlwZSwgZWxlbWVudFR5cGUgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIEJhc2UgY2xhc3MgZm9yIG5vZGVzIHdoaWNoIGVzdGFibGlzaGVzIGEgcmVmZXJlbmNlIHRvIGEgcHJvcGVydHkgb2YgYW5vdGhlciBvYmplY3QuXHJcbiAqIEluIHRoaXMgd2F5LCB0aGUgdmFsdWUgb2YgdGhlIG5vZGUgaXMgYXV0b21hdGljYWxseSBsaW5rZWQgdG8gdGhlIHZhbHVlIG9mXHJcbiAqIHJlZmVyZW5jZWQgb2JqZWN0LiBSZWZlcmVuY2Ugbm9kZXMgaW50ZXJuYWxseSByZXByZXNlbnQgdGhlIGxpbmtlZCB2YWx1ZVxyXG4gKiBhcyBhIHVuaWZvcm0uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBOb2RlXHJcbiAqL1xyXG5jbGFzcyBSZWZlcmVuY2VCYXNlTm9kZSBleHRlbmRzIE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdSZWZlcmVuY2VCYXNlTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyByZWZlcmVuY2UgYmFzZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoZSBub2RlIHJlZmVycyB0by5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdW5pZm9ybVR5cGUgLSBUaGUgdW5pZm9ybSB0eXBlIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBwcm9wZXJ0eSB2YWx1ZS5cclxuXHQgKiBAcGFyYW0gez9PYmplY3R9IFtvYmplY3Q9bnVsbF0gLSBUaGUgb2JqZWN0IHRoZSBwcm9wZXJ0eSBiZWxvbmdzIHRvLlxyXG5cdCAqIEBwYXJhbSB7P251bWJlcn0gW2NvdW50PW51bGxdIC0gV2hlbiB0aGUgbGlua2VkIHByb3BlcnR5IGlzIGFuIGFycmF5LWxpa2UsIHRoaXMgcGFyYW1ldGVyIGRlZmluZXMgaXRzIGxlbmd0aC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcHJvcGVydHksIHVuaWZvcm1UeXBlLCBvYmplY3QgPSBudWxsLCBjb3VudCA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGUgbm9kZSByZWZlcnMgdG8uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHVuaWZvcm0gdHlwZSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgcHJvcGVydHkgdmFsdWUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51bmlmb3JtVHlwZSA9IHVuaWZvcm1UeXBlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG9iamVjdCB0aGUgcHJvcGVydHkgYmVsb25ncyB0by5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P09iamVjdH1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5vYmplY3QgPSBvYmplY3Q7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGVuIHRoZSBsaW5rZWQgcHJvcGVydHkgaXMgYW4gYXJyYXksIHRoaXMgcGFyYW1ldGVyIGRlZmluZXMgaXRzIGxlbmd0aC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb3VudCA9IGNvdW50O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHByb3BlcnR5IG5hbWUgbWlnaHQgaGF2ZSBkb3RzIHNvIG5lc3RlZCBwcm9wZXJ0aWVzIGNhbiBiZSByZWZlcnJlZC5cclxuXHRcdCAqIFRoZSBoaWVyYXJjaHkgb2YgdGhlIG5hbWVzIGlzIHN0b3JlZCBpbnNpZGUgdGhpcyBhcnJheS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydHkuc3BsaXQoICcuJyApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUG9pbnRzIHRvIHRoZSBjdXJyZW50IHJlZmVycmVkIG9iamVjdC4gVGhpcyBwcm9wZXJ0eSBleGlzdHMgbmV4dCB0byB7QGxpbmsgUmVmZXJlbmNlTm9kZSNvYmplY3R9XHJcblx0XHQgKiBzaW5jZSB0aGUgZmluYWwgcmVmZXJlbmNlIG1pZ2h0IGJlIHVwZGF0ZWQgZnJvbSBjYWxsaW5nIGNvZGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9PYmplY3R9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVmZXJlbmNlID0gb2JqZWN0O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHVuaWZvcm0gbm9kZSB0aGF0IGhvbGRzIHRoZSB2YWx1ZSBvZiB0aGUgcmVmZXJlbmNlIG5vZGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1VuaWZvcm1Ob2RlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vZGUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHVuaWZvcm0gZ3JvdXAgb2YgdGhlIGludGVybmFsIHVuaWZvcm0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1VuaWZvcm1Hcm91cE5vZGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ3JvdXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogT3ZlcndyaXR0ZW4gc2luY2UgcmVmZXJlbmNlIG5vZGVzIGFyZSB1cGRhdGVkIHBlciBvYmplY3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqIEBkZWZhdWx0ICdvYmplY3QnXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXBkYXRlVHlwZSA9IE5vZGVVcGRhdGVUeXBlLk9CSkVDVDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB1bmlmb3JtIGdyb3VwIGZvciB0aGlzIHJlZmVyZW5jZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtVbmlmb3JtR3JvdXBOb2RlfSBncm91cCAtIFRoZSB1bmlmb3JtIGdyb3VwIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtSZWZlcmVuY2VCYXNlTm9kZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBub2RlLlxyXG5cdCAqL1xyXG5cdHNldEdyb3VwKCBncm91cCApIHtcclxuXHJcblx0XHR0aGlzLmdyb3VwID0gZ3JvdXA7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogV2hlbiB0aGUgcmVmZXJyZWQgcHJvcGVydHkgaXMgYXJyYXktbGlrZSwgdGhpcyBtZXRob2QgY2FuIGJlIHVzZWRcclxuXHQgKiB0byBhY2Nlc3MgZWxlbWVudHMgdmlhIGFuIGluZGV4IG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0luZGV4Tm9kZX0gaW5kZXhOb2RlIC0gaW5kZXhOb2RlLlxyXG5cdCAqIEByZXR1cm4ge1JlZmVyZW5jZUVsZW1lbnROb2RlfSBBIHJlZmVyZW5jZSB0byBhbiBlbGVtZW50LlxyXG5cdCAqL1xyXG5cdGVsZW1lbnQoIGluZGV4Tm9kZSApIHtcclxuXHJcblx0XHRyZXR1cm4gbm9kZU9iamVjdCggbmV3IFJlZmVyZW5jZUVsZW1lbnROb2RlKCB0aGlzLCBub2RlT2JqZWN0KCBpbmRleE5vZGUgKSApICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgbm9kZSB0eXBlIHdoaWNoIGF1dG9tYXRpY2FsbHkgZGVmaW5lcyB0aGUgaW50ZXJuYWxcclxuXHQgKiB1bmlmb3JtIHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdW5pZm9ybVR5cGUgLSBUaGUgdHlwZSB0byBzZXQuXHJcblx0ICovXHJcblx0c2V0Tm9kZVR5cGUoIHVuaWZvcm1UeXBlICkge1xyXG5cclxuXHRcdGNvbnN0IG5vZGUgPSB1bmlmb3JtKCBudWxsLCB1bmlmb3JtVHlwZSApLmdldFNlbGYoKTtcclxuXHJcblx0XHRpZiAoIHRoaXMuZ3JvdXAgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRub2RlLnNldEdyb3VwKCB0aGlzLmdyb3VwICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMubm9kZSA9IG5vZGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgaXMgb3ZlcndyaXR0ZW4gc2luY2UgdGhlIG5vZGUgdHlwZSBpcyBpbmZlcnJlZCBmcm9tXHJcblx0ICogdGhlIHR5cGUgb2YgdGhlIHJlZmVyZW5jZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBub2RlIHR5cGUuXHJcblx0ICovXHJcblx0Z2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5vZGUgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnVwZGF0ZVJlZmVyZW5jZSggYnVpbGRlciApO1xyXG5cdFx0XHR0aGlzLnVwZGF0ZVZhbHVlKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzLm5vZGUuZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZSBmcm9tIHRoZSBnaXZlbiByZWZlcnJlZCBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdD10aGlzLnJlZmVyZW5jZV0gLSBUaGUgb2JqZWN0IHRvIHJldHJpZXZlIHRoZSBwcm9wZXJ0eSB2YWx1ZSBmcm9tLlxyXG5cdCAqIEByZXR1cm4ge2FueX0gVGhlIHZhbHVlLlxyXG5cdCAqL1xyXG5cdGdldFZhbHVlRnJvbVJlZmVyZW5jZSggb2JqZWN0ID0gdGhpcy5yZWZlcmVuY2UgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBwcm9wZXJ0aWVzIH0gPSB0aGlzO1xyXG5cclxuXHRcdGxldCB2YWx1ZSA9IG9iamVjdFsgcHJvcGVydGllc1sgMCBdIF07XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAxOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHR2YWx1ZSA9IHZhbHVlWyBwcm9wZXJ0aWVzWyBpIF0gXTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFsbG93cyB0byB1cGRhdGUgdGhlIHJlZmVyZW5jZSBiYXNlZCBvbiB0aGUgZ2l2ZW4gc3RhdGUuIFRoZSBzdGF0ZSBpcyBvbmx5XHJcblx0ICogZXZhbHVhdGVkIHtAbGluayBSZWZlcmVuY2VCYXNlTm9kZSNvYmplY3R9IGlzIG5vdCBzZXQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geyhOb2RlRnJhbWV8Tm9kZUJ1aWxkZXIpfSBzdGF0ZSAtIFRoZSBjdXJyZW50IHN0YXRlLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdH0gVGhlIHVwZGF0ZWQgcmVmZXJlbmNlLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZVJlZmVyZW5jZSggc3RhdGUgKSB7XHJcblxyXG5cdFx0dGhpcy5yZWZlcmVuY2UgPSB0aGlzLm9iamVjdCAhPT0gbnVsbCA/IHRoaXMub2JqZWN0IDogc3RhdGUub2JqZWN0O1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnJlZmVyZW5jZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgb3V0cHV0IG9mIHRoZSByZWZlcmVuY2Ugbm9kZSBpcyB0aGUgaW50ZXJuYWwgdW5pZm9ybSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7VW5pZm9ybU5vZGV9IFRoZSBvdXRwdXQgbm9kZS5cclxuXHQgKi9cclxuXHRzZXR1cCgpIHtcclxuXHJcblx0XHR0aGlzLnVwZGF0ZVZhbHVlKCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubm9kZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBPdmVyd3JpdHRlbiB0byB0byB1cGRhdGUgdGhlIGludGVybmFsIHVuaWZvcm0gdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVGcmFtZX0gZnJhbWUgLSBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBub2RlIGZyYW1lLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZSggLypmcmFtZSovICkge1xyXG5cclxuXHRcdHRoaXMudXBkYXRlVmFsdWUoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXRyaWV2ZXMgdGhlIHZhbHVlIGZyb20gdGhlIHJlZmVycmVkIG9iamVjdCBwcm9wZXJ0eSBhbmQgdXNlcyBpdFxyXG5cdCAqIHRvIHVwZGF0ZWQgdGhlIGludGVybmFsIHVuaWZvcm0uXHJcblx0ICovXHJcblx0dXBkYXRlVmFsdWUoKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5vZGUgPT09IG51bGwgKSB0aGlzLnNldE5vZGVUeXBlKCB0aGlzLnVuaWZvcm1UeXBlICk7XHJcblxyXG5cdFx0Y29uc3QgdmFsdWUgPSB0aGlzLmdldFZhbHVlRnJvbVJlZmVyZW5jZSgpO1xyXG5cclxuXHRcdGlmICggQXJyYXkuaXNBcnJheSggdmFsdWUgKSApIHtcclxuXHJcblx0XHRcdHRoaXMubm9kZS5hcnJheSA9IHZhbHVlO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR0aGlzLm5vZGUudmFsdWUgPSB2YWx1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFJlZmVyZW5jZUJhc2VOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSByZWZlcmVuY2UgYmFzZSBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGUgbm9kZSByZWZlcnMgdG8uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIHVuaWZvcm0gdHlwZSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgcHJvcGVydHkgdmFsdWUuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgLSBUaGUgb2JqZWN0IHRoZSBwcm9wZXJ0eSBiZWxvbmdzIHRvLlxyXG4gKiBAcmV0dXJucyB7UmVmZXJlbmNlQmFzZU5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcmVmZXJlbmNlID0gKCBuYW1lLCB0eXBlLCBvYmplY3QgKSA9PiBub2RlT2JqZWN0KCBuZXcgUmVmZXJlbmNlQmFzZU5vZGUoIG5hbWUsIHR5cGUsIG9iamVjdCApICk7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIHJlZmVyZW5jZSBiYXNlIG5vZGUuIFVzZSB0aGlzIGZ1bmN0aW9uIGlmIHlvdSB3YW50IG5lZWQgYSByZWZlcmVuY2VcclxuICogdG8gYW4gYXJyYXktbGlrZSBwcm9wZXJ0eSB0aGF0IHNob3VsZCBiZSByZXByZXNlbnRlZCBhcyBhIHVuaWZvcm0gYnVmZmVyLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGUgbm9kZSByZWZlcnMgdG8uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIHVuaWZvcm0gdHlwZSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgcHJvcGVydHkgdmFsdWUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudCAtIFRoZSBudW1iZXIgb2YgdmFsdWUgaW5zaWRlIHRoZSBhcnJheS1saWtlIG9iamVjdC5cclxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIC0gQW4gYXJyYXktbGlrZSBvYmplY3QgdGhlIHByb3BlcnR5IGJlbG9uZ3MgdG8uXHJcbiAqIEByZXR1cm5zIHtSZWZlcmVuY2VCYXNlTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCByZWZlcmVuY2VCdWZmZXIgPSAoIG5hbWUsIHR5cGUsIGNvdW50LCBvYmplY3QgKSA9PiBub2RlT2JqZWN0KCBuZXcgUmVmZXJlbmNlQmFzZU5vZGUoIG5hbWUsIHR5cGUsIG9iamVjdCwgY291bnQgKSApO1xyXG4iLCJpbXBvcnQgUmVmZXJlbmNlQmFzZU5vZGUgZnJvbSAnLi9SZWZlcmVuY2VCYXNlTm9kZS5qcyc7XHJcbmltcG9ydCB7IG5vZGVPYmplY3QgfSBmcm9tICcuLi90c2wvVFNMQ29yZS5qcyc7XHJcbmltcG9ydCB7IHJlbmRlckdyb3VwIH0gZnJvbSAnLi4vY29yZS9Vbmlmb3JtR3JvdXBOb2RlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIG5vZGUgaXMgYSBzcGVjaWFsIHR5cGUgb2YgcmVmZXJlbmNlIG5vZGUgd2hpY2ggaXMgaW50ZW5kZWRcclxuICogZm9yIGxpbmtpbmcgcmVuZGVyZXIgcHJvcGVydGllcyB3aXRoIG5vZGUgdmFsdWVzLlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBleHBvc3VyZU5vZGUgPSByZW5kZXJlclJlZmVyZW5jZSggJ3RvbmVNYXBwaW5nRXhwb3N1cmUnLCAnZmxvYXQnLCByZW5kZXJlciApO1xyXG4gKiBgYGBcclxuICogV2hlbiBjaGFuZ2luZyBgcmVuZGVyZXIudG9uZU1hcHBpbmdFeHBvc3VyZWAsIHRoZSBub2RlIHZhbHVlIG9mIGBleHBvc3VyZU5vZGVgIHdpbGxcclxuICogYXV0b21hdGljYWxseSBiZSB1cGRhdGVkLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgUmVmZXJlbmNlQmFzZU5vZGVcclxuICovXHJcbmNsYXNzIFJlbmRlcmVyUmVmZXJlbmNlTm9kZSBleHRlbmRzIFJlZmVyZW5jZUJhc2VOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnUmVuZGVyZXJSZWZlcmVuY2VOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHJlbmRlcmVyIHJlZmVyZW5jZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoZSBub2RlIHJlZmVycyB0by5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gaW5wdXRUeXBlIC0gVGhlIHVuaWZvcm0gdHlwZSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgcHJvcGVydHkgdmFsdWUuXHJcblx0ICogQHBhcmFtIHs/UmVuZGVyZXJ9IFtyZW5kZXJlcj1udWxsXSAtIFRoZSByZW5kZXJlciB0aGUgcHJvcGVydHkgYmVsb25ncyB0by4gV2hlbiBubyByZW5kZXJlciBpcyBzZXQsXHJcblx0ICogdGhlIG5vZGUgcmVmZXJzIHRvIHRoZSByZW5kZXJlciBvZiB0aGUgY3VycmVudCBzdGF0ZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcHJvcGVydHksIGlucHV0VHlwZSwgcmVuZGVyZXIgPSBudWxsICkge1xyXG5cclxuXHRcdHN1cGVyKCBwcm9wZXJ0eSwgaW5wdXRUeXBlLCByZW5kZXJlciApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJlbmRlcmVyIHRoZSBwcm9wZXJ0eSBiZWxvbmdzIHRvLiBXaGVuIG5vIHJlbmRlcmVyIGlzIHNldCxcclxuXHRcdCAqIHRoZSBub2RlIHJlZmVycyB0byB0aGUgcmVuZGVyZXIgb2YgdGhlIGN1cnJlbnQgc3RhdGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9SZW5kZXJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xyXG5cclxuXHRcdHRoaXMuc2V0R3JvdXAoIHJlbmRlckdyb3VwICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgcmVmZXJlbmNlIGJhc2VkIG9uIHRoZSBnaXZlbiBzdGF0ZS4gVGhlIHN0YXRlIGlzIG9ubHkgZXZhbHVhdGVkXHJcblx0ICoge0BsaW5rIFJlbmRlcmVyUmVmZXJlbmNlTm9kZSNyZW5kZXJlcn0gaXMgbm90IHNldC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7KE5vZGVGcmFtZXxOb2RlQnVpbGRlcil9IHN0YXRlIC0gVGhlIGN1cnJlbnQgc3RhdGUuXHJcblx0ICogQHJldHVybiB7T2JqZWN0fSBUaGUgdXBkYXRlZCByZWZlcmVuY2UuXHJcblx0ICovXHJcblx0dXBkYXRlUmVmZXJlbmNlKCBzdGF0ZSApIHtcclxuXHJcblx0XHR0aGlzLnJlZmVyZW5jZSA9IHRoaXMucmVuZGVyZXIgIT09IG51bGwgPyB0aGlzLnJlbmRlcmVyIDogc3RhdGUucmVuZGVyZXI7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMucmVmZXJlbmNlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBSZW5kZXJlclJlZmVyZW5jZU5vZGU7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIHJlbmRlcmVyIHJlZmVyZW5jZSBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGUgbm9kZSByZWZlcnMgdG8uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIHVuaWZvcm0gdHlwZSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgcHJvcGVydHkgdmFsdWUuXHJcbiAqIEBwYXJhbSB7P1JlbmRlcmVyfSBbcmVuZGVyZXI9bnVsbF0gLSBUaGUgcmVuZGVyZXIgdGhlIHByb3BlcnR5IGJlbG9uZ3MgdG8uIFdoZW4gbm8gcmVuZGVyZXIgaXMgc2V0LFxyXG4gKiB0aGUgbm9kZSByZWZlcnMgdG8gdGhlIHJlbmRlcmVyIG9mIHRoZSBjdXJyZW50IHN0YXRlLlxyXG4gKiBAcmV0dXJucyB7UmVuZGVyZXJSZWZlcmVuY2VOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHJlbmRlcmVyUmVmZXJlbmNlID0gKCBuYW1lLCB0eXBlLCByZW5kZXJlciA9IG51bGwgKSA9PiBub2RlT2JqZWN0KCBuZXcgUmVuZGVyZXJSZWZlcmVuY2VOb2RlKCBuYW1lLCB0eXBlLCByZW5kZXJlciApICk7XHJcbiIsImltcG9ydCBUZW1wTm9kZSBmcm9tICcuLi9jb3JlL1RlbXBOb2RlLmpzJztcclxuaW1wb3J0IHsgYWRkTWV0aG9kQ2hhaW5pbmcsIG5vZGVPYmplY3QsIHZlYzQgfSBmcm9tICcuLi90c2wvVFNMQ29yZS5qcyc7XHJcbmltcG9ydCB7IHJlbmRlcmVyUmVmZXJlbmNlIH0gZnJvbSAnLi4vYWNjZXNzb3JzL1JlbmRlcmVyUmVmZXJlbmNlTm9kZS5qcyc7XHJcblxyXG5pbXBvcnQgeyBOb1RvbmVNYXBwaW5nIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgaGFzaCB9IGZyb20gJy4uL2NvcmUvTm9kZVV0aWxzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIG5vZGUgcmVwcmVzZW50cyBhIHRvbmUgbWFwcGluZyBvcGVyYXRpb24uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBUZW1wTm9kZVxyXG4gKi9cclxuY2xhc3MgVG9uZU1hcHBpbmdOb2RlIGV4dGVuZHMgVGVtcE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdUb25lTWFwcGluZ05vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgdG9uZSBtYXBwaW5nIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdG9uZU1hcHBpbmcgLSBUaGUgdG9uZSBtYXBwaW5nIHR5cGUuXHJcblx0ICogQHBhcmFtIHtOb2RlfSBleHBvc3VyZU5vZGUgLSBUaGUgdG9uZSBtYXBwaW5nIGV4cG9zdXJlLlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gW2NvbG9yTm9kZT1udWxsXSAtIFRoZSBjb2xvciBub2RlIHRvIHByb2Nlc3MuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHRvbmVNYXBwaW5nLCBleHBvc3VyZU5vZGUgPSB0b25lTWFwcGluZ0V4cG9zdXJlLCBjb2xvck5vZGUgPSBudWxsICkge1xyXG5cclxuXHRcdHN1cGVyKCAndmVjMycgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB0b25lIG1hcHBpbmcgdHlwZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRvbmVNYXBwaW5nID0gdG9uZU1hcHBpbmc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdG9uZSBtYXBwaW5nIGV4cG9zdXJlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmV4cG9zdXJlTm9kZSA9IGV4cG9zdXJlTm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlcHJlc2VudHMgdGhlIGNvbG9yIHRvIHByb2Nlc3MuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvbG9yTm9kZSA9IGNvbG9yTm9kZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBPdmVyd3JpdGVzIHRoZSBkZWZhdWx0IGBjdXN0b21DYWNoZUtleSgpYCBpbXBsZW1lbnRhdGlvbiBieSBpbmNsdWRpbmcgdGhlIHRvbmVcclxuXHQgKiBtYXBwaW5nIHR5cGUgaW50byB0aGUgY2FjaGUga2V5LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgaGFzaC5cclxuXHQgKi9cclxuXHRjdXN0b21DYWNoZUtleSgpIHtcclxuXHJcblx0XHRyZXR1cm4gaGFzaCggdGhpcy50b25lTWFwcGluZyApO1xyXG5cclxuXHR9XHJcblxyXG5cdHNldHVwKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IGNvbG9yTm9kZSA9IHRoaXMuY29sb3JOb2RlIHx8IGJ1aWxkZXIuY29udGV4dC5jb2xvcjtcclxuXHRcdGNvbnN0IHRvbmVNYXBwaW5nID0gdGhpcy50b25lTWFwcGluZztcclxuXHJcblx0XHRpZiAoIHRvbmVNYXBwaW5nID09PSBOb1RvbmVNYXBwaW5nICkgcmV0dXJuIGNvbG9yTm9kZTtcclxuXHJcblx0XHRsZXQgb3V0cHV0Tm9kZSA9IG51bGw7XHJcblxyXG5cdFx0Y29uc3QgdG9uZU1hcHBpbmdGbiA9IGJ1aWxkZXIucmVuZGVyZXIubGlicmFyeS5nZXRUb25lTWFwcGluZ0Z1bmN0aW9uKCB0b25lTWFwcGluZyApO1xyXG5cclxuXHRcdGlmICggdG9uZU1hcHBpbmdGbiAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdG91dHB1dE5vZGUgPSB2ZWM0KCB0b25lTWFwcGluZ0ZuKCBjb2xvck5vZGUucmdiLCB0aGlzLmV4cG9zdXJlTm9kZSApLCBjb2xvck5vZGUuYSApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVG9uZU1hcHBpbmdOb2RlOiBVbnN1cHBvcnRlZCBUb25lIE1hcHBpbmcgY29uZmlndXJhdGlvbi4nLCB0b25lTWFwcGluZyApO1xyXG5cclxuXHRcdFx0b3V0cHV0Tm9kZSA9IGNvbG9yTm9kZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG91dHB1dE5vZGU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFRvbmVNYXBwaW5nTm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgdG9uZSBtYXBwaW5nIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBtYXBwaW5nIC0gVGhlIHRvbmUgbWFwcGluZyB0eXBlLlxyXG4gKiBAcGFyYW0ge05vZGU8ZmxvYXQ+IHwgbnVtYmVyfSBleHBvc3VyZSAtIFRoZSB0b25lIG1hcHBpbmcgZXhwb3N1cmUuXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMzPiB8IENvbG9yfSBjb2xvciAtIFRoZSBjb2xvciBub2RlIHRvIHByb2Nlc3MuXHJcbiAqIEByZXR1cm5zIHtUb25lTWFwcGluZ05vZGU8dmVjMz59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdG9uZU1hcHBpbmcgPSAoIG1hcHBpbmcsIGV4cG9zdXJlLCBjb2xvciApID0+IG5vZGVPYmplY3QoIG5ldyBUb25lTWFwcGluZ05vZGUoIG1hcHBpbmcsIG5vZGVPYmplY3QoIGV4cG9zdXJlICksIG5vZGVPYmplY3QoIGNvbG9yICkgKSApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBnbG9iYWwgdG9uZSBtYXBwaW5nIGV4cG9zdXJlIG9mIHRoZSByZW5kZXJlci5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7UmVuZGVyZXJSZWZlcmVuY2VOb2RlPHZlYzM+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHRvbmVNYXBwaW5nRXhwb3N1cmUgPSAvKkBfX1BVUkVfXyovIHJlbmRlcmVyUmVmZXJlbmNlKCAndG9uZU1hcHBpbmdFeHBvc3VyZScsICdmbG9hdCcgKTtcclxuXHJcbmFkZE1ldGhvZENoYWluaW5nKCAndG9uZU1hcHBpbmcnLCAoIGNvbG9yLCBtYXBwaW5nLCBleHBvc3VyZSApID0+IHRvbmVNYXBwaW5nKCBtYXBwaW5nLCBleHBvc3VyZSwgY29sb3IgKSApO1xyXG4iLCJpbXBvcnQgSW5wdXROb2RlIGZyb20gJy4uL2NvcmUvSW5wdXROb2RlLmpzJztcclxuaW1wb3J0IHsgbm9kZU9iamVjdCwgYWRkTWV0aG9kQ2hhaW5pbmcgfSBmcm9tICcuLi90c2wvVFNMQ29yZS5qcyc7XHJcbmltcG9ydCB7IHZhcnlpbmcgfSBmcm9tICcuLi9jb3JlL1ZhcnlpbmdOb2RlLmpzJztcclxuXHJcbmltcG9ydCB7IEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vLi4vY29yZS9JbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcbmltcG9ydCB7IEludGVybGVhdmVkQnVmZmVyIH0gZnJvbSAnLi4vLi4vY29yZS9JbnRlcmxlYXZlZEJ1ZmZlci5qcyc7XHJcbmltcG9ydCB7IFN0YXRpY0RyYXdVc2FnZSwgRHluYW1pY0RyYXdVc2FnZSB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcblxyXG4vKipcclxuICogSW4gZWFybGllciBgdGhyZWUuanNgIHZlcnNpb25zIGl0IHdhcyBvbmx5IHBvc3NpYmxlIHRvIGRlZmluZSBhdHRyaWJ1dGUgZGF0YVxyXG4gKiBvbiBnZW9tZXRyeSBsZXZlbC4gV2l0aCBgQnVmZmVyQXR0cmlidXRlTm9kZWAsIGl0IGlzIGFsc28gcG9zc2libGUgdG8gZG8gdGhpc1xyXG4gKiBvbiB0aGUgbm9kZSBsZXZlbC5cclxuICogYGBganNcclxuICogY29uc3QgZ2VvbWV0cnkgPSBuZXcgVEhSRUUuUGxhbmVHZW9tZXRyeSgpO1xyXG4gKiBjb25zdCBwb3NpdGlvbkF0dHJpYnV0ZSA9IGdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJyApO1xyXG4gKlxyXG4gKiBjb25zdCBjb2xvcnMgPSBbXTtcclxuICogZm9yICggbGV0IGkgPSAwOyBpIDwgcG9zaXRpb24uY291bnQ7IGkgKysgKSB7XHJcbiAqIFx0Y29sb3JzLnB1c2goIDEsIDAsIDAgKTtcclxuICogfVxyXG4gKlxyXG4gKiBtYXRlcmlhbC5jb2xvck5vZGUgPSBidWZmZXJBdHRyaWJ1dGUoIG5ldyBUSFJFRS5GbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBjb2xvcnMsIDMgKSApO1xyXG4gKiBgYGBcclxuICogVGhpcyBuZXcgYXBwcm9hY2ggaXMgZXNwZWNpYWxseSBpbnRlcmVzdGluZyB3aGVuIGdlb21ldHJ5IGRhdGEgYXJlIGdlbmVyYXRlZCB2aWFcclxuICogY29tcHV0ZSBzaGFkZXJzLiBUaGUgYmVsb3cgbGluZSBjb252ZXJ0cyBhIHN0b3JhZ2UgYnVmZmVyIGludG8gYW4gYXR0cmlidXRlIG5vZGUuXHJcbiAqIGBgYGpzXHJcbiAqIG1hdGVyaWFsLnBvc2l0aW9uTm9kZSA9IHBvc2l0aW9uQnVmZmVyLnRvQXR0cmlidXRlKCk7XHJcbiAqIGBgYFxyXG4gKiBAYXVnbWVudHMgSW5wdXROb2RlXHJcbiAqL1xyXG5jbGFzcyBCdWZmZXJBdHRyaWJ1dGVOb2RlIGV4dGVuZHMgSW5wdXROb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnQnVmZmVyQXR0cmlidXRlTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBidWZmZXIgYXR0cmlidXRlIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0J1ZmZlckF0dHJpYnV0ZXxJbnRlcmxlYXZlZEJ1ZmZlcnxUeXBlZEFycmF5fSB2YWx1ZSAtIFRoZSBhdHRyaWJ1dGUgZGF0YS5cclxuXHQgKiBAcGFyYW0gez9zdHJpbmd9IFtidWZmZXJUeXBlPW51bGxdIC0gVGhlIGJ1ZmZlciB0eXBlIChlLmcuIGAndmVjMydgKS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2J1ZmZlclN0cmlkZT0wXSAtIFRoZSBidWZmZXIgc3RyaWRlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbYnVmZmVyT2Zmc2V0PTBdIC0gVGhlIGJ1ZmZlciBvZmZzZXQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHZhbHVlLCBidWZmZXJUeXBlID0gbnVsbCwgYnVmZmVyU3RyaWRlID0gMCwgYnVmZmVyT2Zmc2V0ID0gMCApIHtcclxuXHJcblx0XHRzdXBlciggdmFsdWUsIGJ1ZmZlclR5cGUgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNCdWZmZXJOb2RlID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBidWZmZXIgdHlwZSAoZS5nLiBgJ3ZlYzMnYCkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9zdHJpbmd9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYnVmZmVyVHlwZSA9IGJ1ZmZlclR5cGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYnVmZmVyIHN0cmlkZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJ1ZmZlclN0cmlkZSA9IGJ1ZmZlclN0cmlkZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBidWZmZXIgb2Zmc2V0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYnVmZmVyT2Zmc2V0ID0gYnVmZmVyT2Zmc2V0O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHVzYWdlIHByb3BlcnR5LiBTZXQgdGhpcyB0byBgVEhSRUUuRHluYW1pY0RyYXdVc2FnZWAgdmlhIGAuc2V0VXNhZ2UoKWAsXHJcblx0XHQgKiBpZiB5b3UgYXJlIHBsYW5uaW5nIHRvIHVwZGF0ZSB0aGUgYXR0cmlidXRlIGRhdGEgcGVyIGZyYW1lLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCBTdGF0aWNEcmF3VXNhZ2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51c2FnZSA9IFN0YXRpY0RyYXdVc2FnZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIGF0dHJpYnV0ZSBpcyBpbnN0YW5jZWQgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pbnN0YW5jZWQgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIHRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/QnVmZmVyQXR0cmlidXRlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmF0dHJpYnV0ZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBgQnVmZmVyQXR0cmlidXRlTm9kZWAgc2V0cyB0aGlzIHByb3BlcnR5IHRvIGB0cnVlYCBieSBkZWZhdWx0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdsb2JhbCA9IHRydWU7XHJcblxyXG5cdFx0aWYgKCB2YWx1ZSAmJiB2YWx1ZS5pc0J1ZmZlckF0dHJpYnV0ZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdHRoaXMuYXR0cmlidXRlID0gdmFsdWU7XHJcblx0XHRcdHRoaXMudXNhZ2UgPSB2YWx1ZS51c2FnZTtcclxuXHRcdFx0dGhpcy5pbnN0YW5jZWQgPSB2YWx1ZS5pc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgaXMgb3ZlcndyaXR0ZW4gc2luY2UgdGhlIGF0dHJpYnV0ZSBkYXRhIG1pZ2h0IGJlIHNoYXJlZFxyXG5cdCAqIGFuZCB0aHVzIHRoZSBoYXNoIHNob3VsZCBiZSBzaGFyZWQgYXMgd2VsbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgaGFzaC5cclxuXHQgKi9cclxuXHRnZXRIYXNoKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5idWZmZXJTdHJpZGUgPT09IDAgJiYgdGhpcy5idWZmZXJPZmZzZXQgPT09IDAgKSB7XHJcblxyXG5cdFx0XHRsZXQgYnVmZmVyRGF0YSA9IGJ1aWxkZXIuZ2xvYmFsQ2FjaGUuZ2V0RGF0YSggdGhpcy52YWx1ZSApO1xyXG5cclxuXHRcdFx0aWYgKCBidWZmZXJEYXRhID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGJ1ZmZlckRhdGEgPSB7XHJcblx0XHRcdFx0XHRub2RlOiB0aGlzXHJcblx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0YnVpbGRlci5nbG9iYWxDYWNoZS5zZXREYXRhKCB0aGlzLnZhbHVlLCBidWZmZXJEYXRhICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gYnVmZmVyRGF0YS5ub2RlLnV1aWQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzLnV1aWQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgaXMgb3ZlcndyaXR0ZW4gc2luY2UgdGhlIG5vZGUgdHlwZSBpcyBpbmZlcnJlZCBmcm9tXHJcblx0ICogdGhlIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG5vZGUgdHlwZS5cclxuXHQgKi9cclxuXHRnZXROb2RlVHlwZSggYnVpbGRlciApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuYnVmZmVyVHlwZSA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuYnVmZmVyVHlwZSA9IGJ1aWxkZXIuZ2V0VHlwZUZyb21BdHRyaWJ1dGUoIHRoaXMuYXR0cmlidXRlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzLmJ1ZmZlclR5cGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVwZW5kaW5nIG9uIHdoaWNoIHZhbHVlIHdhcyBwYXNzZWQgdG8gdGhlIG5vZGUsIGBzZXR1cCgpYCBiZWhhdmVzXHJcblx0ICogZGlmZmVyZW50bHkuIElmIG5vIGluc3RhbmNlIG9mIGBCdWZmZXJBdHRyaWJ1dGVgIHdhcyBwYXNzZWQsIHRoZSBtZXRob2RcclxuXHQgKiBjcmVhdGVzIGFuIGludGVybmFsIGF0dHJpYnV0ZSBhbmQgY29uZmlndXJlcyBpdCByZXNwZWN0aXZlbHkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqL1xyXG5cdHNldHVwKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5hdHRyaWJ1dGUgIT09IG51bGwgKSByZXR1cm47XHJcblxyXG5cdFx0Y29uc3QgdHlwZSA9IHRoaXMuZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKTtcclxuXHRcdGNvbnN0IGFycmF5ID0gdGhpcy52YWx1ZTtcclxuXHRcdGNvbnN0IGl0ZW1TaXplID0gYnVpbGRlci5nZXRUeXBlTGVuZ3RoKCB0eXBlICk7XHJcblx0XHRjb25zdCBzdHJpZGUgPSB0aGlzLmJ1ZmZlclN0cmlkZSB8fCBpdGVtU2l6ZTtcclxuXHRcdGNvbnN0IG9mZnNldCA9IHRoaXMuYnVmZmVyT2Zmc2V0O1xyXG5cclxuXHRcdGNvbnN0IGJ1ZmZlciA9IGFycmF5LmlzSW50ZXJsZWF2ZWRCdWZmZXIgPT09IHRydWUgPyBhcnJheSA6IG5ldyBJbnRlcmxlYXZlZEJ1ZmZlciggYXJyYXksIHN0cmlkZSApO1xyXG5cdFx0Y29uc3QgYnVmZmVyQXR0cmlidXRlID0gbmV3IEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKCBidWZmZXIsIGl0ZW1TaXplLCBvZmZzZXQgKTtcclxuXHJcblx0XHRidWZmZXIuc2V0VXNhZ2UoIHRoaXMudXNhZ2UgKTtcclxuXHJcblx0XHR0aGlzLmF0dHJpYnV0ZSA9IGJ1ZmZlckF0dHJpYnV0ZTtcclxuXHRcdHRoaXMuYXR0cmlidXRlLmlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlID0gdGhpcy5pbnN0YW5jZWQ7IC8vIEBUT0RPOiBBZGQgYSBwb3NzaWJsZTogSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGVcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZW5lcmF0ZXMgdGhlIGNvZGUgc25pcHBldCBvZiB0aGUgYnVmZmVyIGF0dHJpYnV0ZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBnZW5lcmF0ZWQgY29kZSBzbmlwcGV0LlxyXG5cdCAqL1xyXG5cdGdlbmVyYXRlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IG5vZGVUeXBlID0gdGhpcy5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cclxuXHRcdGNvbnN0IG5vZGVBdHRyaWJ1dGUgPSBidWlsZGVyLmdldEJ1ZmZlckF0dHJpYnV0ZUZyb21Ob2RlKCB0aGlzLCBub2RlVHlwZSApO1xyXG5cdFx0Y29uc3QgcHJvcGVydHlOYW1lID0gYnVpbGRlci5nZXRQcm9wZXJ0eU5hbWUoIG5vZGVBdHRyaWJ1dGUgKTtcclxuXHJcblx0XHRsZXQgb3V0cHV0ID0gbnVsbDtcclxuXHJcblx0XHRpZiAoIGJ1aWxkZXIuc2hhZGVyU3RhZ2UgPT09ICd2ZXJ0ZXgnIHx8IGJ1aWxkZXIuc2hhZGVyU3RhZ2UgPT09ICdjb21wdXRlJyApIHtcclxuXHJcblx0XHRcdHRoaXMubmFtZSA9IHByb3BlcnR5TmFtZTtcclxuXHJcblx0XHRcdG91dHB1dCA9IHByb3BlcnR5TmFtZTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc3Qgbm9kZVZhcnlpbmcgPSB2YXJ5aW5nKCB0aGlzICk7XHJcblxyXG5cdFx0XHRvdXRwdXQgPSBub2RlVmFyeWluZy5idWlsZCggYnVpbGRlciwgbm9kZVR5cGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG91dHB1dDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBPdmVyd3JpdGVzIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRvIHJldHVybiBhIGZpeGVkIHZhbHVlIGAnYnVmZmVyQXR0cmlidXRlJ2AuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGlucHV0IHR5cGUuXHJcblx0ICovXHJcblx0Z2V0SW5wdXRUeXBlKCAvKmJ1aWxkZXIqLyApIHtcclxuXHJcblx0XHRyZXR1cm4gJ2J1ZmZlckF0dHJpYnV0ZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgYHVzYWdlYCBwcm9wZXJ0eSB0byB0aGUgZ2l2ZW4gdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgdXNhZ2UgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge0J1ZmZlckF0dHJpYnV0ZU5vZGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbm9kZS5cclxuXHQgKi9cclxuXHRzZXRVc2FnZSggdmFsdWUgKSB7XHJcblxyXG5cdFx0dGhpcy51c2FnZSA9IHZhbHVlO1xyXG5cclxuXHRcdGlmICggdGhpcy5hdHRyaWJ1dGUgJiYgdGhpcy5hdHRyaWJ1dGUuaXNCdWZmZXJBdHRyaWJ1dGUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmF0dHJpYnV0ZS51c2FnZSA9IHZhbHVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBgaW5zdGFuY2VkYCBwcm9wZXJ0eSB0byB0aGUgZ2l2ZW4gdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbHVlIC0gVGhlIHZhbHVlIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtCdWZmZXJBdHRyaWJ1dGVOb2RlfSBBIHJlZmVyZW5jZSB0byB0aGlzIG5vZGUuXHJcblx0ICovXHJcblx0c2V0SW5zdGFuY2VkKCB2YWx1ZSApIHtcclxuXHJcblx0XHR0aGlzLmluc3RhbmNlZCA9IHZhbHVlO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBCdWZmZXJBdHRyaWJ1dGVOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSBidWZmZXIgYXR0cmlidXRlIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7QnVmZmVyQXR0cmlidXRlfEludGVybGVhdmVkQnVmZmVyfFR5cGVkQXJyYXl9IGFycmF5IC0gVGhlIGF0dHJpYnV0ZSBkYXRhLlxyXG4gKiBAcGFyYW0gez9zdHJpbmd9IFt0eXBlPW51bGxdIC0gVGhlIGJ1ZmZlciB0eXBlIChlLmcuIGAndmVjMydgKS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtzdHJpZGU9MF0gLSBUaGUgYnVmZmVyIHN0cmlkZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXQ9MF0gLSBUaGUgYnVmZmVyIG9mZnNldC5cclxuICogQHJldHVybnMge0J1ZmZlckF0dHJpYnV0ZU5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYnVmZmVyQXR0cmlidXRlID0gKCBhcnJheSwgdHlwZSA9IG51bGwsIHN0cmlkZSA9IDAsIG9mZnNldCA9IDAgKSA9PiBub2RlT2JqZWN0KCBuZXcgQnVmZmVyQXR0cmlidXRlTm9kZSggYXJyYXksIHR5cGUsIHN0cmlkZSwgb2Zmc2V0ICkgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgYnVmZmVyIGF0dHJpYnV0ZSBub2RlIGJ1dCB3aXRoIGR5bmFtaWMgZHJhdyB1c2FnZS5cclxuICogVXNlIHRoaXMgZnVuY3Rpb24gaWYgYXR0cmlidXRlIGRhdGEgYXJlIHVwZGF0ZWQgcGVyIGZyYW1lLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge0J1ZmZlckF0dHJpYnV0ZXxJbnRlcmxlYXZlZEJ1ZmZlcnxUeXBlZEFycmF5fSBhcnJheSAtIFRoZSBhdHRyaWJ1dGUgZGF0YS5cclxuICogQHBhcmFtIHs/c3RyaW5nfSBbdHlwZT1udWxsXSAtIFRoZSBidWZmZXIgdHlwZSAoZS5nLiBgJ3ZlYzMnYCkuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RyaWRlPTBdIC0gVGhlIGJ1ZmZlciBzdHJpZGUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0PTBdIC0gVGhlIGJ1ZmZlciBvZmZzZXQuXHJcbiAqIEByZXR1cm5zIHtCdWZmZXJBdHRyaWJ1dGVOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGR5bmFtaWNCdWZmZXJBdHRyaWJ1dGUgPSAoIGFycmF5LCB0eXBlID0gbnVsbCwgc3RyaWRlID0gMCwgb2Zmc2V0ID0gMCApID0+IGJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIHR5cGUsIHN0cmlkZSwgb2Zmc2V0ICkuc2V0VXNhZ2UoIER5bmFtaWNEcmF3VXNhZ2UgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgYnVmZmVyIGF0dHJpYnV0ZSBub2RlIGJ1dCB3aXRoIGVuYWJsZWQgaW5zdGFuY2luZ1xyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge0J1ZmZlckF0dHJpYnV0ZXxJbnRlcmxlYXZlZEJ1ZmZlcnxUeXBlZEFycmF5fSBhcnJheSAtIFRoZSBhdHRyaWJ1dGUgZGF0YS5cclxuICogQHBhcmFtIHs/c3RyaW5nfSBbdHlwZT1udWxsXSAtIFRoZSBidWZmZXIgdHlwZSAoZS5nLiBgJ3ZlYzMnYCkuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RyaWRlPTBdIC0gVGhlIGJ1ZmZlciBzdHJpZGUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0PTBdIC0gVGhlIGJ1ZmZlciBvZmZzZXQuXHJcbiAqIEByZXR1cm5zIHtCdWZmZXJBdHRyaWJ1dGVOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSA9ICggYXJyYXksIHR5cGUgPSBudWxsLCBzdHJpZGUgPSAwLCBvZmZzZXQgPSAwICkgPT4gYnVmZmVyQXR0cmlidXRlKCBhcnJheSwgdHlwZSwgc3RyaWRlLCBvZmZzZXQgKS5zZXRJbnN0YW5jZWQoIHRydWUgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgYnVmZmVyIGF0dHJpYnV0ZSBub2RlIGJ1dCB3aXRoIGR5bmFtaWMgZHJhdyB1c2FnZSBhbmQgZW5hYmxlZCBpbnN0YW5jaW5nXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7QnVmZmVyQXR0cmlidXRlfEludGVybGVhdmVkQnVmZmVyfFR5cGVkQXJyYXl9IGFycmF5IC0gVGhlIGF0dHJpYnV0ZSBkYXRhLlxyXG4gKiBAcGFyYW0gez9zdHJpbmd9IFt0eXBlPW51bGxdIC0gVGhlIGJ1ZmZlciB0eXBlIChlLmcuIGAndmVjMydgKS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtzdHJpZGU9MF0gLSBUaGUgYnVmZmVyIHN0cmlkZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXQ9MF0gLSBUaGUgYnVmZmVyIG9mZnNldC5cclxuICogQHJldHVybnMge0J1ZmZlckF0dHJpYnV0ZU5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgaW5zdGFuY2VkRHluYW1pY0J1ZmZlckF0dHJpYnV0ZSA9ICggYXJyYXksIHR5cGUgPSBudWxsLCBzdHJpZGUgPSAwLCBvZmZzZXQgPSAwICkgPT4gZHluYW1pY0J1ZmZlckF0dHJpYnV0ZSggYXJyYXksIHR5cGUsIHN0cmlkZSwgb2Zmc2V0ICkuc2V0SW5zdGFuY2VkKCB0cnVlICk7XHJcblxyXG5hZGRNZXRob2RDaGFpbmluZyggJ3RvQXR0cmlidXRlJywgKCBidWZmZXJOb2RlICkgPT4gYnVmZmVyQXR0cmlidXRlKCBidWZmZXJOb2RlLnZhbHVlICkgKTtcclxuIiwiaW1wb3J0IE5vZGUgZnJvbSAnLi4vY29yZS9Ob2RlLmpzJztcclxuaW1wb3J0IHsgTm9kZVVwZGF0ZVR5cGUgfSBmcm9tICcuLi9jb3JlL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IGFkZE1ldGhvZENoYWluaW5nLCBub2RlT2JqZWN0IH0gZnJvbSAnLi4vdHNsL1RTTENvcmUuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRPRE9cclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVcclxuICovXHJcbmNsYXNzIENvbXB1dGVOb2RlIGV4dGVuZHMgTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ0NvbXB1dGVOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGNvbXB1dGUgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gY29tcHV0ZU5vZGUgLSBUT0RPXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGNvdW50IC0gVE9ETy5cclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IFt3b3JrZ3JvdXBTaXplPVs2NF1dIC0gVE9ETy5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggY29tcHV0ZU5vZGUsIGNvdW50LCB3b3JrZ3JvdXBTaXplID0gWyA2NCBdICkge1xyXG5cclxuXHRcdHN1cGVyKCAndm9pZCcgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNDb21wdXRlTm9kZSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUT0RPXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29tcHV0ZU5vZGUgPSBjb21wdXRlTm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRPRE9cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvdW50ID0gY291bnQ7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUT0RPXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PG51bWJlcj59XHJcblx0XHQgKiBAZGVmYXVsdCBbNjRdXHJcblx0XHQgKi9cclxuXHRcdHRoaXMud29ya2dyb3VwU2l6ZSA9IHdvcmtncm91cFNpemU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUT0RPXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kaXNwYXRjaENvdW50ID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRPRE9cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnZlcnNpb24gPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG5hbWUgb3IgbGFiZWwgb2YgdGhlIHVuaWZvcm0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqIEBkZWZhdWx0ICcnXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubmFtZSA9ICcnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGB1cGRhdGVCZWZvcmVUeXBlYCBpcyBzZXQgdG8gYE5vZGVVcGRhdGVUeXBlLk9CSkVDVGAgc2luY2Uge0BsaW5rIENvbXB1dGVOb2RlI3VwZGF0ZUJlZm9yZX1cclxuXHRcdCAqIGlzIGV4ZWN1dGVkIG9uY2UgcGVyIG9iamVjdCBieSBkZWZhdWx0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKiBAZGVmYXVsdCAnb2JqZWN0J1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVwZGF0ZUJlZm9yZVR5cGUgPSBOb2RlVXBkYXRlVHlwZS5PQkpFQ1Q7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUT0RPXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9GdW5jdGlvbn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5vbkluaXRGdW5jdGlvbiA9IG51bGw7XHJcblxyXG5cdFx0dGhpcy51cGRhdGVEaXNwYXRjaENvdW50KCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRXhlY3V0ZXMgdGhlIGBkaXNwb3NlYCBldmVudCBmb3IgdGhpcyBub2RlLlxyXG5cdCAqL1xyXG5cdGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdkaXNwb3NlJyB9ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUge0BsaW5rIENvbXB1dGVOb2RlI25hbWV9IHByb3BlcnR5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdW5pZm9ybS5cclxuXHQgKiBAcmV0dXJuIHtDb21wdXRlTm9kZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBub2RlLlxyXG5cdCAqL1xyXG5cdGxhYmVsKCBuYW1lICkge1xyXG5cclxuXHRcdHRoaXMubmFtZSA9IG5hbWU7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVE9ET1xyXG5cdCAqL1xyXG5cdHVwZGF0ZURpc3BhdGNoQ291bnQoKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBjb3VudCwgd29ya2dyb3VwU2l6ZSB9ID0gdGhpcztcclxuXHJcblx0XHRsZXQgc2l6ZSA9IHdvcmtncm91cFNpemVbIDAgXTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDE7IGkgPCB3b3JrZ3JvdXBTaXplLmxlbmd0aDsgaSArKyApXHJcblx0XHRcdHNpemUgKj0gd29ya2dyb3VwU2l6ZVsgaSBdO1xyXG5cclxuXHRcdHRoaXMuZGlzcGF0Y2hDb3VudCA9IE1hdGguY2VpbCggY291bnQgLyBzaXplICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVE9ET1xyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgLSBUT0RPLlxyXG5cdCAqIEByZXR1cm4ge0NvbXB1dGVOb2RlfSBBIHJlZmVyZW5jZSB0byB0aGlzIG5vZGUuXHJcblx0ICovXHJcblx0b25Jbml0KCBjYWxsYmFjayApIHtcclxuXHJcblx0XHR0aGlzLm9uSW5pdEZ1bmN0aW9uID0gY2FsbGJhY2s7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIG1ldGhvZCBleGVjdXRlIHRoZSBjb21wdXRlIGZvciB0aGlzIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVGcmFtZX0gZnJhbWUgLSBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBub2RlIGZyYW1lLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZUJlZm9yZSggeyByZW5kZXJlciB9ICkge1xyXG5cclxuXHRcdHJlbmRlcmVyLmNvbXB1dGUoIHRoaXMgKTtcclxuXHJcblx0fVxyXG5cclxuXHRzZXR1cCggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCByZXN1bHQgPSB0aGlzLmNvbXB1dGVOb2RlLnNldHVwKCBidWlsZGVyICk7XHJcblxyXG5cdFx0aWYgKCByZXN1bHQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBwcm9wZXJ0aWVzID0gYnVpbGRlci5nZXROb2RlUHJvcGVydGllcyggdGhpcyApO1xyXG5cdFx0XHRwcm9wZXJ0aWVzLm91dHB1dENvbXB1dGVOb2RlID0gcmVzdWx0Lm91dHB1dE5vZGU7XHJcblxyXG5cdFx0XHRyZXN1bHQub3V0cHV0Tm9kZSA9IG51bGw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblxyXG5cdH1cclxuXHJcblx0Z2VuZXJhdGUoIGJ1aWxkZXIsIG91dHB1dCApIHtcclxuXHJcblx0XHRjb25zdCB7IHNoYWRlclN0YWdlIH0gPSBidWlsZGVyO1xyXG5cclxuXHRcdGlmICggc2hhZGVyU3RhZ2UgPT09ICdjb21wdXRlJyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHNuaXBwZXQgPSB0aGlzLmNvbXB1dGVOb2RlLmJ1aWxkKCBidWlsZGVyLCAndm9pZCcgKTtcclxuXHJcblx0XHRcdGlmICggc25pcHBldCAhPT0gJycgKSB7XHJcblxyXG5cdFx0XHRcdGJ1aWxkZXIuYWRkTGluZUZsb3dDb2RlKCBzbmlwcGV0LCB0aGlzICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGNvbnN0IHByb3BlcnRpZXMgPSBidWlsZGVyLmdldE5vZGVQcm9wZXJ0aWVzKCB0aGlzICk7XHJcblx0XHRcdGNvbnN0IG91dHB1dENvbXB1dGVOb2RlID0gcHJvcGVydGllcy5vdXRwdXRDb21wdXRlTm9kZTtcclxuXHJcblx0XHRcdGlmICggb3V0cHV0Q29tcHV0ZU5vZGUgKSB7XHJcblxyXG5cdFx0XHRcdHJldHVybiBvdXRwdXRDb21wdXRlTm9kZS5idWlsZCggYnVpbGRlciwgb3V0cHV0ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBDb21wdXRlTm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgY29tcHV0ZSBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBUT0RPXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudCAtIFRPRE8uXHJcbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gW3dvcmtncm91cFNpemU9WzY0XV0gLSBUT0RPLlxyXG4gKiBAcmV0dXJucyB7QXRvbWljRnVuY3Rpb25Ob2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGNvbXB1dGUgPSAoIG5vZGUsIGNvdW50LCB3b3JrZ3JvdXBTaXplICkgPT4gbm9kZU9iamVjdCggbmV3IENvbXB1dGVOb2RlKCBub2RlT2JqZWN0KCBub2RlICksIGNvdW50LCB3b3JrZ3JvdXBTaXplICkgKTtcclxuXHJcbmFkZE1ldGhvZENoYWluaW5nKCAnY29tcHV0ZScsIGNvbXB1dGUgKTtcclxuIiwiaW1wb3J0IE5vZGUgZnJvbSAnLi9Ob2RlLmpzJztcclxuaW1wb3J0IHsgYWRkTWV0aG9kQ2hhaW5pbmcsIG5vZGVPYmplY3QgfSBmcm9tICcuLi90c2wvVFNMQ29yZS5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBub2RlIGNhbiBiZSB1c2VkIGFzIGEgY2FjaGUgbWFuYWdlbWVudCBjb21wb25lbnQgZm9yIGFub3RoZXIgbm9kZS5cclxuICogQ2FjaGluZyBpcyBpbiBnZW5lcmFsIHVzZWQgYnkgZGVmYXVsdCBpbiB7QGxpbmsgTm9kZUJ1aWxkZXJ9IGJ1dCB0aGlzIG5vZGVcclxuICogYWxsb3dzIHRoZSB1c2FnZSBvZiBhIHNoYXJlZCBwYXJlbnQgY2FjaGUgZHVyaW5nIHRoZSBidWlsZCBwcm9jZXNzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTm9kZVxyXG4gKi9cclxuY2xhc3MgQ2FjaGVOb2RlIGV4dGVuZHMgTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ0NhY2hlTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBjYWNoZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIG5vZGUgdGhhdCBzaG91bGQgYmUgY2FjaGVkLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BhcmVudD10cnVlXSAtIFdoZXRoZXIgdGhpcyBub2RlIHJlZmVycyB0byBhIHNoYXJlZCBwYXJlbnQgY2FjaGUgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBub2RlLCBwYXJlbnQgPSB0cnVlICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbm9kZSB0aGF0IHNob3VsZCBiZSBjYWNoZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9kZSA9IG5vZGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoaXMgbm9kZSByZWZlcnMgdG8gYSBzaGFyZWQgcGFyZW50IGNhY2hlIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wYXJlbnQgPSBwYXJlbnQ7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzQ2FjaGVOb2RlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHRnZXROb2RlVHlwZSggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCBwcmV2aW91c0NhY2hlID0gYnVpbGRlci5nZXRDYWNoZSgpO1xyXG5cdFx0Y29uc3QgY2FjaGUgPSBidWlsZGVyLmdldENhY2hlRnJvbU5vZGUoIHRoaXMsIHRoaXMucGFyZW50ICk7XHJcblxyXG5cdFx0YnVpbGRlci5zZXRDYWNoZSggY2FjaGUgKTtcclxuXHJcblx0XHRjb25zdCBub2RlVHlwZSA9IHRoaXMubm9kZS5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cclxuXHRcdGJ1aWxkZXIuc2V0Q2FjaGUoIHByZXZpb3VzQ2FjaGUgKTtcclxuXHJcblx0XHRyZXR1cm4gbm9kZVR5cGU7XHJcblxyXG5cdH1cclxuXHJcblx0YnVpbGQoIGJ1aWxkZXIsIC4uLnBhcmFtcyApIHtcclxuXHJcblx0XHRjb25zdCBwcmV2aW91c0NhY2hlID0gYnVpbGRlci5nZXRDYWNoZSgpO1xyXG5cdFx0Y29uc3QgY2FjaGUgPSBidWlsZGVyLmdldENhY2hlRnJvbU5vZGUoIHRoaXMsIHRoaXMucGFyZW50ICk7XHJcblxyXG5cdFx0YnVpbGRlci5zZXRDYWNoZSggY2FjaGUgKTtcclxuXHJcblx0XHRjb25zdCBkYXRhID0gdGhpcy5ub2RlLmJ1aWxkKCBidWlsZGVyLCAuLi5wYXJhbXMgKTtcclxuXHJcblx0XHRidWlsZGVyLnNldENhY2hlKCBwcmV2aW91c0NhY2hlICk7XHJcblxyXG5cdFx0cmV0dXJuIGRhdGE7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IENhY2hlTm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgY2FjaGUgbm9kZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIG5vZGUgdGhhdCBzaG91bGQgYmUgY2FjaGVkLlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwYXJlbnRdIC0gV2hldGhlciB0aGlzIG5vZGUgcmVmZXJzIHRvIGEgc2hhcmVkIHBhcmVudCBjYWNoZSBvciBub3QuXHJcbiAqIEByZXR1cm5zIHtDYWNoZU5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgY2FjaGUgPSAoIG5vZGUsIHBhcmVudCApID0+IG5vZGVPYmplY3QoIG5ldyBDYWNoZU5vZGUoIG5vZGVPYmplY3QoIG5vZGUgKSwgcGFyZW50ICkgKTtcclxuXHJcbmFkZE1ldGhvZENoYWluaW5nKCAnY2FjaGUnLCBjYWNoZSApO1xyXG4iLCJpbXBvcnQgTm9kZSBmcm9tICcuL05vZGUuanMnO1xyXG5pbXBvcnQgeyBhZGRNZXRob2RDaGFpbmluZywgbm9kZVByb3h5IH0gZnJvbSAnLi4vdHNsL1RTTENvcmUuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRoZSBjbGFzcyBnZW5lcmF0ZXMgdGhlIGNvZGUgb2YgYSBnaXZlbiBub2RlIGJ1dCByZXR1cm5zIGFub3RoZXIgbm9kZSBpbiB0aGUgb3V0cHV0LlxyXG4gKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGNhbGwgYSBtZXRob2Qgb3Igbm9kZSB0aGF0IGRvZXMgbm90IHJldHVybiBhIHZhbHVlLCBpLmUuXHJcbiAqIHR5cGUgYHZvaWRgIG9uIGFuIGlucHV0IHdoZXJlIHJldHVybmluZyBhIHZhbHVlIGlzIHJlcXVpcmVkLiBFeGFtcGxlOlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBtYXRlcmlhbC5jb2xvck5vZGUgPSBteUNvbG9yLmJ5cGFzcyggcnVuVm9pZEZuKCkgKVxyXG4gKmBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTm9kZVxyXG4gKi9cclxuY2xhc3MgQnlwYXNzTm9kZSBleHRlbmRzIE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdCeXBhc3NOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGJ5cGFzcyBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlfSBvdXRwdXROb2RlIC0gVGhlIG91dHB1dCBub2RlLlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gY2FsbE5vZGUgLSBUaGUgY2FsbCBub2RlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBvdXRwdXROb2RlLCBjYWxsTm9kZSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0J5cGFzc05vZGUgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG91dHB1dCBub2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm91dHB1dE5vZGUgPSBvdXRwdXROb2RlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNhbGwgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jYWxsTm9kZSA9IGNhbGxOb2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdGdldE5vZGVUeXBlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm91dHB1dE5vZGUuZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHRnZW5lcmF0ZSggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCBzbmlwcGV0ID0gdGhpcy5jYWxsTm9kZS5idWlsZCggYnVpbGRlciwgJ3ZvaWQnICk7XHJcblxyXG5cdFx0aWYgKCBzbmlwcGV0ICE9PSAnJyApIHtcclxuXHJcblx0XHRcdGJ1aWxkZXIuYWRkTGluZUZsb3dDb2RlKCBzbmlwcGV0LCB0aGlzICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzLm91dHB1dE5vZGUuYnVpbGQoIGJ1aWxkZXIgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQnlwYXNzTm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgYnlwYXNzIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZX0gb3V0cHV0Tm9kZSAtIFRoZSBvdXRwdXQgbm9kZS5cclxuICogQHBhcmFtIHtOb2RlfSBjYWxsTm9kZSAtIFRoZSBjYWxsIG5vZGUuXHJcbiAqIEByZXR1cm5zIHtCeXBhc3NOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGJ5cGFzcyA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBCeXBhc3NOb2RlICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAyICk7XHJcblxyXG5hZGRNZXRob2RDaGFpbmluZyggJ2J5cGFzcycsIGJ5cGFzcyApO1xyXG4iLCJpbXBvcnQgTm9kZSBmcm9tICcuLi9jb3JlL05vZGUuanMnO1xyXG5pbXBvcnQgeyBmbG9hdCwgYWRkTWV0aG9kQ2hhaW5pbmcsIG5vZGVQcm94eSB9IGZyb20gJy4uL3RzbC9UU0xDb3JlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIG5vZGUgYWxsb3dzIHRvIHJlbWFwIGEgbm9kZSB2YWx1ZSBmcm9tIG9uZSByYW5nZSBpbnRvIGFub3RoZXIuIEUuZyBhIHZhbHVlIG9mXHJcbiAqIGAwLjRgIGluIHRoZSByYW5nZSBgWyAwLjMsIDAuNSBdYCBzaG91bGQgYmUgcmVtYXBwZWQgaW50byB0aGUgbm9ybWFsaXplZCByYW5nZSBgWyAwLCAxIF1gLlxyXG4gKiBgUmVtYXBOb2RlYCB0YWtlcyBjYXJlIG9mIHRoYXQgYW5kIGNvbnZlcnRzIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiBgMC40YCB0byBgMC41YC5cclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVcclxuICovXHJcbmNsYXNzIFJlbWFwTm9kZSBleHRlbmRzIE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdSZW1hcE5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcmVtYXAgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFRoZSBub2RlIHRoYXQgc2hvdWxkIGJlIHJlbWFwcGVkLlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gaW5Mb3dOb2RlIC0gVGhlIHNvdXJjZSBvciBjdXJyZW50IGxvd2VyIGJvdW5kIG9mIHRoZSByYW5nZS5cclxuXHQgKiBAcGFyYW0ge05vZGV9IGluSGlnaE5vZGUgLSBUaGUgc291cmNlIG9yIGN1cnJlbnQgdXBwZXIgYm91bmQgb2YgdGhlIHJhbmdlLlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gW291dExvd05vZGU9ZmxvYXQoMCldIC0gVGhlIHRhcmdldCBsb3dlciBib3VuZCBvZiB0aGUgcmFuZ2UuXHJcblx0ICogQHBhcmFtIHtOb2RlfSBbb3V0SGlnaE5vZGU9ZmxvYXQoMSldIC0gVGhlIHRhcmdldCB1cHBlciBib3VuZCBvZiB0aGUgcmFuZ2UuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5vZGUsIGluTG93Tm9kZSwgaW5IaWdoTm9kZSwgb3V0TG93Tm9kZSA9IGZsb2F0KCAwICksIG91dEhpZ2hOb2RlID0gZmxvYXQoIDEgKSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG5vZGUgdGhhdCBzaG91bGQgYmUgcmVtYXBwZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9kZSA9IG5vZGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc291cmNlIG9yIGN1cnJlbnQgbG93ZXIgYm91bmQgb2YgdGhlIHJhbmdlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmluTG93Tm9kZSA9IGluTG93Tm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBzb3VyY2Ugb3IgY3VycmVudCB1cHBlciBib3VuZCBvZiB0aGUgcmFuZ2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaW5IaWdoTm9kZSA9IGluSGlnaE5vZGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdGFyZ2V0IGxvd2VyIGJvdW5kIG9mIHRoZSByYW5nZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZX1cclxuXHRcdCAqIEBkZWZhdWx0IGZsb2F0KDApXHJcblx0XHQgKi9cclxuXHRcdHRoaXMub3V0TG93Tm9kZSA9IG91dExvd05vZGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdGFyZ2V0IHVwcGVyIGJvdW5kIG9mIHRoZSByYW5nZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZX1cclxuXHRcdCAqIEBkZWZhdWx0IGZsb2F0KDEpXHJcblx0XHQgKi9cclxuXHRcdHRoaXMub3V0SGlnaE5vZGUgPSBvdXRIaWdoTm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIG5vZGUgdmFsdWUgc2hvdWxkIGJlIGNsYW1wZWQgYmVmb3JlXHJcblx0XHQgKiByZW1hcHBpbmcgaXQgdG8gdGhlIHRhcmdldCByYW5nZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kb0NsYW1wID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHRzZXR1cCgpIHtcclxuXHJcblx0XHRjb25zdCB7IG5vZGUsIGluTG93Tm9kZSwgaW5IaWdoTm9kZSwgb3V0TG93Tm9kZSwgb3V0SGlnaE5vZGUsIGRvQ2xhbXAgfSA9IHRoaXM7XHJcblxyXG5cdFx0bGV0IHQgPSBub2RlLnN1YiggaW5Mb3dOb2RlICkuZGl2KCBpbkhpZ2hOb2RlLnN1YiggaW5Mb3dOb2RlICkgKTtcclxuXHJcblx0XHRpZiAoIGRvQ2xhbXAgPT09IHRydWUgKSB0ID0gdC5jbGFtcCgpO1xyXG5cclxuXHRcdHJldHVybiB0Lm11bCggb3V0SGlnaE5vZGUuc3ViKCBvdXRMb3dOb2RlICkgKS5hZGQoIG91dExvd05vZGUgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUmVtYXBOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSByZW1hcCBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBUaGUgbm9kZSB0aGF0IHNob3VsZCBiZSByZW1hcHBlZC5cclxuICogQHBhcmFtIHtOb2RlfSBpbkxvd05vZGUgLSBUaGUgc291cmNlIG9yIGN1cnJlbnQgbG93ZXIgYm91bmQgb2YgdGhlIHJhbmdlLlxyXG4gKiBAcGFyYW0ge05vZGV9IGluSGlnaE5vZGUgLSBUaGUgc291cmNlIG9yIGN1cnJlbnQgdXBwZXIgYm91bmQgb2YgdGhlIHJhbmdlLlxyXG4gKiBAcGFyYW0gez9Ob2RlfSBbb3V0TG93Tm9kZT1mbG9hdCgwKV0gLSBUaGUgdGFyZ2V0IGxvd2VyIGJvdW5kIG9mIHRoZSByYW5nZS5cclxuICogQHBhcmFtIHs/Tm9kZX0gW291dEhpZ2hOb2RlPWZsb2F0KDEpXSAtIFRoZSB0YXJnZXQgdXBwZXIgYm91bmQgb2YgdGhlIHJhbmdlLlxyXG4gKiBAcmV0dXJucyB7UmVtYXBOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHJlbWFwID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIFJlbWFwTm9kZSwgbnVsbCwgbnVsbCwgeyBkb0NsYW1wOiBmYWxzZSB9ICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAzLCA1ICk7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIHJlbWFwIG5vZGUsIGJ1dCB3aXRoIGVuYWJsZWQgY2xhbXBpbmcuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFRoZSBub2RlIHRoYXQgc2hvdWxkIGJlIHJlbWFwcGVkLlxyXG4gKiBAcGFyYW0ge05vZGV9IGluTG93Tm9kZSAtIFRoZSBzb3VyY2Ugb3IgY3VycmVudCBsb3dlciBib3VuZCBvZiB0aGUgcmFuZ2UuXHJcbiAqIEBwYXJhbSB7Tm9kZX0gaW5IaWdoTm9kZSAtIFRoZSBzb3VyY2Ugb3IgY3VycmVudCB1cHBlciBib3VuZCBvZiB0aGUgcmFuZ2UuXHJcbiAqIEBwYXJhbSB7P05vZGV9IFtvdXRMb3dOb2RlPWZsb2F0KDApXSAtIFRoZSB0YXJnZXQgbG93ZXIgYm91bmQgb2YgdGhlIHJhbmdlLlxyXG4gKiBAcGFyYW0gez9Ob2RlfSBbb3V0SGlnaE5vZGU9ZmxvYXQoMSldIC0gVGhlIHRhcmdldCB1cHBlciBib3VuZCBvZiB0aGUgcmFuZ2UuXHJcbiAqIEByZXR1cm5zIHtSZW1hcE5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcmVtYXBDbGFtcCA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBSZW1hcE5vZGUgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDMsIDUgKTtcclxuXHJcbmFkZE1ldGhvZENoYWluaW5nKCAncmVtYXAnLCByZW1hcCApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ3JlbWFwQ2xhbXAnLCByZW1hcENsYW1wICk7XHJcbiIsImltcG9ydCBOb2RlIGZyb20gJy4uL2NvcmUvTm9kZS5qcyc7XHJcbmltcG9ydCB7IG5vZGVQcm94eSB9IGZyb20gJy4uL3RzbC9UU0xDb3JlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBiYXNpYyBleHByZXNzaW9ucyBpbiBzaGFkZXIgY29kZS5cclxuICogQmFzaWMgZXhhbXBsZXMgZm9yIHRoYXQgYXJlIGByZXR1cm5gLCBgY29udGludWVgIG9yIGBkaXNjYXJkYCBzdGF0ZW1lbnRzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTm9kZVxyXG4gKi9cclxuY2xhc3MgRXhwcmVzc2lvbk5vZGUgZXh0ZW5kcyBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnRXhwcmVzc2lvbk5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgZXhwcmVzc2lvbiBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtzbmlwcGV0PScnXSAtIFRoZSBuYXRpdmUgY29kZSBzbmlwcGV0LlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbbm9kZVR5cGU9J3ZvaWQnXSAtIFRoZSBub2RlIHR5cGUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHNuaXBwZXQgPSAnJywgbm9kZVR5cGUgPSAndm9pZCcgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5vZGVUeXBlICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbmF0aXZlIGNvZGUgc25pcHBldC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICogQGRlZmF1bHQgJydcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zbmlwcGV0ID0gc25pcHBldDtcclxuXHJcblx0fVxyXG5cclxuXHRnZW5lcmF0ZSggYnVpbGRlciwgb3V0cHV0ICkge1xyXG5cclxuXHRcdGNvbnN0IHR5cGUgPSB0aGlzLmdldE5vZGVUeXBlKCBidWlsZGVyICk7XHJcblx0XHRjb25zdCBzbmlwcGV0ID0gdGhpcy5zbmlwcGV0O1xyXG5cclxuXHRcdGlmICggdHlwZSA9PT0gJ3ZvaWQnICkge1xyXG5cclxuXHRcdFx0YnVpbGRlci5hZGRMaW5lRmxvd0NvZGUoIHNuaXBwZXQsIHRoaXMgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0cmV0dXJuIGJ1aWxkZXIuZm9ybWF0KCBzbmlwcGV0LCB0eXBlLCBvdXRwdXQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEV4cHJlc3Npb25Ob2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYW4gZXhwcmVzc2lvbiBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW3NuaXBwZXRdIC0gVGhlIG5hdGl2ZSBjb2RlIHNuaXBwZXQuXHJcbiAqIEBwYXJhbSB7P3N0cmluZ30gW25vZGVUeXBlPSd2b2lkJ10gLSBUaGUgbm9kZSB0eXBlLlxyXG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbk5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZXhwcmVzc2lvbiA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBFeHByZXNzaW9uTm9kZSApLnNldFBhcmFtZXRlckxlbmd0aCggMSwgMiApO1xyXG4iLCJpbXBvcnQgeyBzZWxlY3QgfSBmcm9tICcuLi9tYXRoL0NvbmRpdGlvbmFsTm9kZS5qcyc7XHJcbmltcG9ydCB7IGV4cHJlc3Npb24gfSBmcm9tICcuLi9jb2RlL0V4cHJlc3Npb25Ob2RlLmpzJztcclxuaW1wb3J0IHsgYWRkTWV0aG9kQ2hhaW5pbmcgfSBmcm9tICcuLi90c2wvVFNMQ29yZS5qcyc7XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyBhIGBkaXNjYXJkYCBzaGFkZXIgb3BlcmF0aW9uIGluIFRTTC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHs/Q29uZGl0aW9uYWxOb2RlfSBjb25kaXRpb25hbCAtIEFuIG9wdGlvbmFsIGNvbmRpdGlvbmFsIG5vZGUuIEl0IGFsbG93cyB0byBkZWNpZGUgd2hldGhlciB0aGUgZGlzY2FyZCBzaG91bGQgYmUgZXhlY3V0ZWQgb3Igbm90LlxyXG4gKiBAcmV0dXJuIHtOb2RlfSBUaGUgYGRpc2NhcmRgIGV4cHJlc3Npb24uXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgRGlzY2FyZCA9ICggY29uZGl0aW9uYWwgKSA9PiAoIGNvbmRpdGlvbmFsID8gc2VsZWN0KCBjb25kaXRpb25hbCwgZXhwcmVzc2lvbiggJ2Rpc2NhcmQnICkgKSA6IGV4cHJlc3Npb24oICdkaXNjYXJkJyApICkuYXBwZW5kKCk7XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyBhIGByZXR1cm5gIHNoYWRlciBvcGVyYXRpb24gaW4gVFNMLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcmV0dXJuIHtFeHByZXNzaW9uTm9kZX0gVGhlIGByZXR1cm5gIGV4cHJlc3Npb24uXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUmV0dXJuID0gKCkgPT4gZXhwcmVzc2lvbiggJ3JldHVybicgKS5hcHBlbmQoKTtcclxuXHJcbmFkZE1ldGhvZENoYWluaW5nKCAnZGlzY2FyZCcsIERpc2NhcmQgKTtcclxuIiwiaW1wb3J0IFRlbXBOb2RlIGZyb20gJy4uL2NvcmUvVGVtcE5vZGUuanMnO1xyXG5pbXBvcnQgeyBhZGRNZXRob2RDaGFpbmluZywgbm9kZU9iamVjdCB9IGZyb20gJy4uL3RzbC9UU0xDb3JlLmpzJztcclxuXHJcbmltcG9ydCB7IE5vQ29sb3JTcGFjZSwgTm9Ub25lTWFwcGluZyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IENvbG9yTWFuYWdlbWVudCB9IGZyb20gJy4uLy4uL21hdGgvQ29sb3JNYW5hZ2VtZW50LmpzJztcclxuXHJcbi8qKlxyXG4gKiBOb3JtYWxseSwgdG9uZSBtYXBwaW5nIGFuZCBjb2xvciBjb252ZXJzaW9uIGhhcHBlbnMgYXV0b21hdGljYWxseVxyXG4gKiBiZWZvcmUgb3V0cHV0dGluZyBwaXhlbCB0b28gdGhlIGRlZmF1bHQgKHNjcmVlbikgZnJhbWVidWZmZXIuIEluIGNlcnRhaW5cclxuICogcG9zdCBwcm9jZXNzaW5nIHNldHVwcyB0aGlzIGhhcHBlbnMgdG8gbGF0ZSBiZWNhdXNlIGNlcnRhaW4gZWZmZWN0c1xyXG4gKiByZXF1aXJlIGUuZy4gc1JHQiBpbnB1dC4gRm9yIHN1Y2ggc2NlbmFyaW9zLCBgUmVuZGVyT3V0cHV0Tm9kZWAgY2FuIGJlIHVzZWRcclxuICogdG8gYXBwbHkgdG9uZSBtYXBwaW5nIGFuZCBjb2xvciBzcGFjZSBjb252ZXJzaW9uIGF0IGFuIGFyYml0cmFyeSBwb2ludFxyXG4gKiBpbiB0aGUgZWZmZWN0IGNoYWluLlxyXG4gKlxyXG4gKiBXaGVuIGFwcGx5aW5nIHRvbmUgbWFwcGluZyBhbmQgY29sb3Igc3BhY2UgY29udmVyc2lvbiBtYW51YWxseSB3aXRoIHRoaXMgbm9kZSxcclxuICogeW91IGhhdmUgdG8gc2V0IHtAbGluayBQb3N0UHJvY2Vzc2luZyNvdXRwdXRDb2xvclRyYW5zZm9ybX0gdG8gYGZhbHNlYC5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgcG9zdFByb2Nlc3NpbmcgPSBuZXcgUG9zdFByb2Nlc3NpbmcoIHJlbmRlcmVyICk7XHJcbiAqIHBvc3RQcm9jZXNzaW5nLm91dHB1dENvbG9yVHJhbnNmb3JtID0gZmFsc2U7XHJcbiAqXHJcbiAqIGNvbnN0IHNjZW5lUGFzcyA9IHBhc3MoIHNjZW5lLCBjYW1lcmEgKTtcclxuICogY29uc3Qgb3V0cHV0UGFzcyA9IHJlbmRlck91dHB1dCggc2NlbmVQYXNzICk7XHJcbiAqXHJcbiAqIHBvc3RQcm9jZXNzaW5nLm91dHB1dE5vZGUgPSBvdXRwdXRQYXNzO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIFRlbXBOb2RlXHJcbiAqL1xyXG5jbGFzcyBSZW5kZXJPdXRwdXROb2RlIGV4dGVuZHMgVGVtcE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdSZW5kZXJPdXRwdXROb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHJlbmRlciBvdXRwdXQgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gY29sb3JOb2RlIC0gVGhlIGNvbG9yIG5vZGUgdG8gcHJvY2Vzcy5cclxuXHQgKiBAcGFyYW0gez9udW1iZXJ9IHRvbmVNYXBwaW5nIC0gVGhlIHRvbmUgbWFwcGluZyB0eXBlLlxyXG5cdCAqIEBwYXJhbSB7P3N0cmluZ30gb3V0cHV0Q29sb3JTcGFjZSAtIFRoZSBvdXRwdXQgY29sb3Igc3BhY2UuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGNvbG9yTm9kZSwgdG9uZU1hcHBpbmcsIG91dHB1dENvbG9yU3BhY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIoICd2ZWM0JyApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNvbG9yIG5vZGUgdG8gcHJvY2Vzcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb2xvck5vZGUgPSBjb2xvck5vZGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdG9uZSBtYXBwaW5nIHR5cGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9udW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudG9uZU1hcHBpbmcgPSB0b25lTWFwcGluZztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBvdXRwdXQgY29sb3Igc3BhY2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9zdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMub3V0cHV0Q29sb3JTcGFjZSA9IG91dHB1dENvbG9yU3BhY2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzUmVuZGVyT3V0cHV0Tm9kZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXAoIHsgY29udGV4dCB9ICkge1xyXG5cclxuXHRcdGxldCBvdXRwdXROb2RlID0gdGhpcy5jb2xvck5vZGUgfHwgY29udGV4dC5jb2xvcjtcclxuXHJcblx0XHQvLyB0b25lIG1hcHBpbmdcclxuXHJcblx0XHRjb25zdCB0b25lTWFwcGluZyA9ICggdGhpcy50b25lTWFwcGluZyAhPT0gbnVsbCA/IHRoaXMudG9uZU1hcHBpbmcgOiBjb250ZXh0LnRvbmVNYXBwaW5nICkgfHwgTm9Ub25lTWFwcGluZztcclxuXHRcdGNvbnN0IG91dHB1dENvbG9yU3BhY2UgPSAoIHRoaXMub3V0cHV0Q29sb3JTcGFjZSAhPT0gbnVsbCA/IHRoaXMub3V0cHV0Q29sb3JTcGFjZSA6IGNvbnRleHQub3V0cHV0Q29sb3JTcGFjZSApIHx8IE5vQ29sb3JTcGFjZTtcclxuXHJcblx0XHRpZiAoIHRvbmVNYXBwaW5nICE9PSBOb1RvbmVNYXBwaW5nICkge1xyXG5cclxuXHRcdFx0b3V0cHV0Tm9kZSA9IG91dHB1dE5vZGUudG9uZU1hcHBpbmcoIHRvbmVNYXBwaW5nICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIHdvcmtpbmcgdG8gb3V0cHV0IGNvbG9yIHNwYWNlXHJcblxyXG5cdFx0aWYgKCBvdXRwdXRDb2xvclNwYWNlICE9PSBOb0NvbG9yU3BhY2UgJiYgb3V0cHV0Q29sb3JTcGFjZSAhPT0gQ29sb3JNYW5hZ2VtZW50LndvcmtpbmdDb2xvclNwYWNlICkge1xyXG5cclxuXHRcdFx0b3V0cHV0Tm9kZSA9IG91dHB1dE5vZGUud29ya2luZ1RvQ29sb3JTcGFjZSggb3V0cHV0Q29sb3JTcGFjZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gb3V0cHV0Tm9kZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUmVuZGVyT3V0cHV0Tm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgcG9zdGVyaXplIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZX0gY29sb3IgLSBUaGUgY29sb3Igbm9kZSB0byBwcm9jZXNzLlxyXG4gKiBAcGFyYW0gez9udW1iZXJ9IFt0b25lTWFwcGluZz1udWxsXSAtIFRoZSB0b25lIG1hcHBpbmcgdHlwZS5cclxuICogQHBhcmFtIHs/c3RyaW5nfSBbb3V0cHV0Q29sb3JTcGFjZT1udWxsXSAtIFRoZSBvdXRwdXQgY29sb3Igc3BhY2UuXHJcbiAqIEByZXR1cm5zIHtSZW5kZXJPdXRwdXROb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHJlbmRlck91dHB1dCA9ICggY29sb3IsIHRvbmVNYXBwaW5nID0gbnVsbCwgb3V0cHV0Q29sb3JTcGFjZSA9IG51bGwgKSA9PiBub2RlT2JqZWN0KCBuZXcgUmVuZGVyT3V0cHV0Tm9kZSggbm9kZU9iamVjdCggY29sb3IgKSwgdG9uZU1hcHBpbmcsIG91dHB1dENvbG9yU3BhY2UgKSApO1xyXG5cclxuYWRkTWV0aG9kQ2hhaW5pbmcoICdyZW5kZXJPdXRwdXQnLCByZW5kZXJPdXRwdXQgKTtcclxuIiwiaW1wb3J0IFRlbXBOb2RlIGZyb20gJy4uL2NvcmUvVGVtcE5vZGUuanMnO1xyXG5pbXBvcnQgeyBhZGRNZXRob2RDaGFpbmluZywgbm9kZU9iamVjdCB9IGZyb20gJy4uL3RzbC9UU0xDb3JlLmpzJztcclxuXHJcbmNsYXNzIERlYnVnTm9kZSBleHRlbmRzIFRlbXBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnRGVidWdOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHRjb25zdHJ1Y3Rvciggbm9kZSwgY2FsbGJhY2sgPSBudWxsICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0dGhpcy5ub2RlID0gbm9kZTtcclxuXHRcdHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcclxuXHJcblx0fVxyXG5cclxuXHRnZXROb2RlVHlwZSggYnVpbGRlciApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5ub2RlLmdldE5vZGVUeXBlKCBidWlsZGVyICk7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXAoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubm9kZS5idWlsZCggYnVpbGRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdGFuYWx5emUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubm9kZS5idWlsZCggYnVpbGRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdGdlbmVyYXRlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IGNhbGxiYWNrID0gdGhpcy5jYWxsYmFjaztcclxuXHRcdGNvbnN0IHNuaXBwZXQgPSB0aGlzLm5vZGUuYnVpbGQoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRsZXQgY29kZSA9ICcnO1xyXG5cdFx0Y29kZSArPSAnLy8gIy0tLSBUU0wgRGVidWcgLS0tI1xcbic7XHJcblx0XHRjb2RlICs9IGJ1aWxkZXIuZmxvdy5jb2RlLnJlcGxhY2UoIC9eXFx0L21nLCAnJyApICsgJ1xcbic7XHJcblx0XHRjb2RlICs9ICcvKiAuLi4gKi8gJyArIHNuaXBwZXQgKyAnIC8qIC4uLiAqL1xcbic7XHJcblx0XHRjb2RlICs9ICcvLyAjLS0tLS0tLS0tLS0tLS0tLS0jXFxuJztcclxuXHJcblx0XHRpZiAoIGNhbGxiYWNrICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0Y2FsbGJhY2soIGNvZGUgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc29sZS5sb2coIGNvZGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHNuaXBwZXQ7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IERlYnVnTm9kZTtcclxuXHJcbmV4cG9ydCBjb25zdCBkZWJ1ZyA9ICggbm9kZSwgY2FsbGJhY2sgPSBudWxsICkgPT4gbm9kZU9iamVjdCggbmV3IERlYnVnTm9kZSggbm9kZU9iamVjdCggbm9kZSApLCBjYWxsYmFjayApICk7XHJcblxyXG5hZGRNZXRob2RDaGFpbmluZyggJ2RlYnVnJywgZGVidWcgKTtcclxuIiwiLy8gTm9uLVBVUkUgZXhwb3J0cyBsaXN0LCBzaWRlLWVmZmVjdHMgYXJlIHJlcXVpcmVkIGhlcmUuXHJcbi8vIFRTTCBCYXNlIFN5bnRheFxyXG5cclxuZXhwb3J0ICogZnJvbSAnLi9UU0xDb3JlLmpzJzsgLy8gZmxvYXQoKSwgdmVjMigpLCB2ZWMzKCksIHZlYzQoKSwgbWF0MygpLCBtYXQ0KCksIEZuKCksIElmKCksIGVsZW1lbnQoKSwgbm9kZU9iamVjdCgpLCBub2RlUHJveHkoKSwgLi4uXHJcbmV4cG9ydCAqIGZyb20gJy4uL2NvcmUvQXJyYXlOb2RlLmpzJzsgLy8gYXJyYXkoKSwgLnRvQXJyYXkoKVxyXG5leHBvcnQgKiBmcm9tICcuLi9jb3JlL1VuaWZvcm1Ob2RlLmpzJzsgLy8gdW5pZm9ybSgpXHJcbmV4cG9ydCAqIGZyb20gJy4uL2NvcmUvUHJvcGVydHlOb2RlLmpzJzsgLy8gcHJvcGVydHkoKSAgPC0+IFRPRE86IFNlcGFyYXRlIE1hdGVyaWFsIFByb3BlcnRpZXMgaW4gb3RoZXIgZmlsZVxyXG5leHBvcnQgKiBmcm9tICcuLi9jb3JlL0Fzc2lnbk5vZGUuanMnOyAvLyAuYXNzaWduKClcclxuZXhwb3J0ICogZnJvbSAnLi4vY29kZS9GdW5jdGlvbkNhbGxOb2RlLmpzJzsgLy8gLmNhbGwoKVxyXG5leHBvcnQgKiBmcm9tICcuLi9tYXRoL09wZXJhdG9yTm9kZS5qcyc7IC8vIC5hZGQoKSwgLnN1YigpLCAuLi5cclxuZXhwb3J0ICogZnJvbSAnLi4vbWF0aC9NYXRoTm9kZS5qcyc7IC8vIGFicygpLCBmbG9vcigpLCAuLi5cclxuZXhwb3J0ICogZnJvbSAnLi4vbWF0aC9Db25kaXRpb25hbE5vZGUuanMnOyAvLyBzZWxlY3QoKSwgLi4uXHJcbmV4cG9ydCAqIGZyb20gJy4uL2NvcmUvQ29udGV4dE5vZGUuanMnOyAvLyAuY29udGV4dCgpXHJcbmV4cG9ydCAqIGZyb20gJy4uL2NvcmUvVmFyTm9kZS5qcyc7IC8vIC52YXIoKSAtPiBUT0RPOiBNYXliZSByZW5hbWUgLnRvVmFyKCkgLT4gLnZhcigpXHJcbmV4cG9ydCAqIGZyb20gJy4uL2NvcmUvVmFyeWluZ05vZGUuanMnOyAvLyB2YXJ5aW5nKCksIHZlcnRleFN0YWdlKClcclxuZXhwb3J0ICogZnJvbSAnLi4vZGlzcGxheS9Db2xvclNwYWNlTm9kZS5qcyc7IC8vIC50b0NvbG9yU3BhY2UoKVxyXG5leHBvcnQgKiBmcm9tICcuLi9kaXNwbGF5L1RvbmVNYXBwaW5nTm9kZS5qcyc7IC8vIC50b1RvbmVNYXBwaW5nKClcclxuZXhwb3J0ICogZnJvbSAnLi4vYWNjZXNzb3JzL0J1ZmZlckF0dHJpYnV0ZU5vZGUuanMnOyAvLyAudG9BdHRyaWJ1dGUoKVxyXG5leHBvcnQgKiBmcm9tICcuLi9ncGdwdS9Db21wdXRlTm9kZS5qcyc7IC8vIC5jb21wdXRlKClcclxuZXhwb3J0ICogZnJvbSAnLi4vY29yZS9DYWNoZU5vZGUuanMnOyAvLyAuY2FjaGUoKVxyXG5leHBvcnQgKiBmcm9tICcuLi9jb3JlL0J5cGFzc05vZGUuanMnOyAvLyAuYnlwYXNzKClcclxuZXhwb3J0ICogZnJvbSAnLi4vdXRpbHMvUmVtYXBOb2RlLmpzJzsgLy8gLnJlbWFwKCksIC5yZW1hcENsYW1wKClcclxuZXhwb3J0ICogZnJvbSAnLi4vY29kZS9FeHByZXNzaW9uTm9kZS5qcyc7IC8vIGV4cHJlc3Npb24oKVxyXG5leHBvcnQgKiBmcm9tICcuLi91dGlscy9EaXNjYXJkLmpzJzsgLy8gRGlzY2FyZCgpLCBSZXR1cm4oKVxyXG5leHBvcnQgKiBmcm9tICcuLi9kaXNwbGF5L1JlbmRlck91dHB1dE5vZGUuanMnOyAvLyAucmVuZGVyT3V0cHV0KClcclxuZXhwb3J0ICogZnJvbSAnLi4vdXRpbHMvRGVidWdOb2RlLmpzJzsgLy8gZGVidWcoKVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZE5vZGVFbGVtZW50KCBuYW1lLyosIG5vZGVFbGVtZW50Ki8gKSB7XHJcblxyXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlRTTDogQWRkTm9kZUVsZW1lbnQgaGFzIGJlZW4gcmVtb3ZlZCBpbiBmYXZvciBvZiB0cmVlLXNoYWtpbmcuIFRyeWluZyBhZGQnLCBuYW1lICk7XHJcblxyXG59XHJcbiIsImltcG9ydCBOb2RlIGZyb20gJy4vTm9kZS5qcyc7XHJcbmltcG9ydCB7IG5vZGVPYmplY3QsIHZhcnlpbmcgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcblxyXG4vKipcclxuICogQmFzZSBjbGFzcyBmb3IgcmVwcmVzZW50aW5nIHNoYWRlciBhdHRyaWJ1dGVzIGFzIG5vZGVzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTm9kZVxyXG4gKi9cclxuY2xhc3MgQXR0cmlidXRlTm9kZSBleHRlbmRzIE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdBdHRyaWJ1dGVOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGF0dHJpYnV0ZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLlxyXG5cdCAqIEBwYXJhbSB7P3N0cmluZ30gbm9kZVR5cGUgLSBUaGUgbm9kZSB0eXBlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBhdHRyaWJ1dGVOYW1lLCBub2RlVHlwZSA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5vZGVUeXBlICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBgQXR0cmlidXRlTm9kZWAgc2V0cyB0aGlzIHByb3BlcnR5IHRvIGB0cnVlYCBieSBkZWZhdWx0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdsb2JhbCA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy5fYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZU5hbWU7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0SGFzaCggYnVpbGRlciApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVOYW1lKCBidWlsZGVyICk7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0bGV0IG5vZGVUeXBlID0gdGhpcy5ub2RlVHlwZTtcclxuXHJcblx0XHRpZiAoIG5vZGVUeXBlID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYXR0cmlidXRlTmFtZSA9IHRoaXMuZ2V0QXR0cmlidXRlTmFtZSggYnVpbGRlciApO1xyXG5cclxuXHRcdFx0aWYgKCBidWlsZGVyLmhhc0dlb21ldHJ5QXR0cmlidXRlKCBhdHRyaWJ1dGVOYW1lICkgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGF0dHJpYnV0ZSA9IGJ1aWxkZXIuZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCBhdHRyaWJ1dGVOYW1lICk7XHJcblxyXG5cdFx0XHRcdG5vZGVUeXBlID0gYnVpbGRlci5nZXRUeXBlRnJvbUF0dHJpYnV0ZSggYXR0cmlidXRlICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRub2RlVHlwZSA9ICdmbG9hdCc7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBub2RlVHlwZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBhdHRyaWJ1dGUgbmFtZSB0byB0aGUgZ2l2ZW4gdmFsdWUuIFRoZSBtZXRob2QgY2FuIGJlXHJcblx0ICogb3ZlcndyaXR0ZW4gaW4gZGVyaXZlZCBjbGFzc2VzIGlmIHRoZSBmaW5hbCBuYW1lIG11c3QgYmUgY29tcHV0ZWRcclxuXHQgKiBhbmFseXRpY2FsbHkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuXHJcblx0ICogQHJldHVybiB7QXR0cmlidXRlTm9kZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBub2RlLlxyXG5cdCAqL1xyXG5cdHNldEF0dHJpYnV0ZU5hbWUoIGF0dHJpYnV0ZU5hbWUgKSB7XHJcblxyXG5cdFx0dGhpcy5fYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZU5hbWU7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgYXR0cmlidXRlIG5hbWUgb2YgdGhpcyBub2RlLiBUaGUgbWV0aG9kIGNhbiBiZVxyXG5cdCAqIG92ZXJ3cml0dGVuIGluIGRlcml2ZWQgY2xhc3NlcyBpZiB0aGUgZmluYWwgbmFtZSBtdXN0IGJlIGNvbXB1dGVkXHJcblx0ICogYW5hbHl0aWNhbGx5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBhdHRyaWJ1dGUgbmFtZS5cclxuXHQgKi9cclxuXHRnZXRBdHRyaWJ1dGVOYW1lKCAvKmJ1aWxkZXIqLyApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fYXR0cmlidXRlTmFtZTtcclxuXHJcblx0fVxyXG5cclxuXHRnZW5lcmF0ZSggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCBhdHRyaWJ1dGVOYW1lID0gdGhpcy5nZXRBdHRyaWJ1dGVOYW1lKCBidWlsZGVyICk7XHJcblx0XHRjb25zdCBub2RlVHlwZSA9IHRoaXMuZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKTtcclxuXHRcdGNvbnN0IGdlb21ldHJ5QXR0cmlidXRlID0gYnVpbGRlci5oYXNHZW9tZXRyeUF0dHJpYnV0ZSggYXR0cmlidXRlTmFtZSApO1xyXG5cclxuXHRcdGlmICggZ2VvbWV0cnlBdHRyaWJ1dGUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBhdHRyaWJ1dGUgPSBidWlsZGVyLmdlb21ldHJ5LmdldEF0dHJpYnV0ZSggYXR0cmlidXRlTmFtZSApO1xyXG5cdFx0XHRjb25zdCBhdHRyaWJ1dGVUeXBlID0gYnVpbGRlci5nZXRUeXBlRnJvbUF0dHJpYnV0ZSggYXR0cmlidXRlICk7XHJcblxyXG5cdFx0XHRjb25zdCBub2RlQXR0cmlidXRlID0gYnVpbGRlci5nZXRBdHRyaWJ1dGUoIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVR5cGUgKTtcclxuXHJcblx0XHRcdGlmICggYnVpbGRlci5zaGFkZXJTdGFnZSA9PT0gJ3ZlcnRleCcgKSB7XHJcblxyXG5cdFx0XHRcdHJldHVybiBidWlsZGVyLmZvcm1hdCggbm9kZUF0dHJpYnV0ZS5uYW1lLCBhdHRyaWJ1dGVUeXBlLCBub2RlVHlwZSApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0Y29uc3Qgbm9kZVZhcnlpbmcgPSB2YXJ5aW5nKCB0aGlzICk7XHJcblxyXG5cdFx0XHRcdHJldHVybiBub2RlVmFyeWluZy5idWlsZCggYnVpbGRlciwgbm9kZVR5cGUgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc29sZS53YXJuKCBgQXR0cmlidXRlTm9kZTogVmVydGV4IGF0dHJpYnV0ZSBcIiR7IGF0dHJpYnV0ZU5hbWUgfVwiIG5vdCBmb3VuZCBvbiBnZW9tZXRyeS5gICk7XHJcblxyXG5cdFx0XHRyZXR1cm4gYnVpbGRlci5nZW5lcmF0ZUNvbnN0KCBub2RlVHlwZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRzZXJpYWxpemUoIGRhdGEgKSB7XHJcblxyXG5cdFx0c3VwZXIuc2VyaWFsaXplKCBkYXRhICk7XHJcblxyXG5cdFx0ZGF0YS5nbG9iYWwgPSB0aGlzLmdsb2JhbDtcclxuXHRcdGRhdGEuX2F0dHJpYnV0ZU5hbWUgPSB0aGlzLl9hdHRyaWJ1dGVOYW1lO1xyXG5cclxuXHR9XHJcblxyXG5cdGRlc2VyaWFsaXplKCBkYXRhICkge1xyXG5cclxuXHRcdHN1cGVyLmRlc2VyaWFsaXplKCBkYXRhICk7XHJcblxyXG5cdFx0dGhpcy5nbG9iYWwgPSBkYXRhLmdsb2JhbDtcclxuXHRcdHRoaXMuX2F0dHJpYnV0ZU5hbWUgPSBkYXRhLl9hdHRyaWJ1dGVOYW1lO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBBdHRyaWJ1dGVOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYW4gYXR0cmlidXRlIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS5cclxuICogQHBhcmFtIHtzdHJpbmd9IFtub2RlVHlwZV0gLSBUaGUgbm9kZSB0eXBlLlxyXG4gKiBAcmV0dXJucyB7QXR0cmlidXRlTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBhdHRyaWJ1dGUgPSAoIG5hbWUsIG5vZGVUeXBlICkgPT4gbm9kZU9iamVjdCggbmV3IEF0dHJpYnV0ZU5vZGUoIG5hbWUsIG5vZGVUeXBlICkgKTtcclxuIiwiaW1wb3J0IHsgYXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9BdHRyaWJ1dGVOb2RlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGFuIHV2IGF0dHJpYnV0ZSBub2RlIHdpdGggdGhlIGdpdmVuIGluZGV4LlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge251bWJlcn0gW2luZGV4PTBdIC0gVGhlIHV2IGluZGV4LlxyXG4gKiBAcmV0dXJuIHtBdHRyaWJ1dGVOb2RlPHZlYzI+fSBUaGUgdXYgYXR0cmlidXRlIG5vZGUuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdXYgPSAoIGluZGV4ID0gMCApID0+IGF0dHJpYnV0ZSggJ3V2JyArICggaW5kZXggPiAwID8gaW5kZXggOiAnJyApLCAndmVjMicgKTtcclxuIiwiaW1wb3J0IE5vZGUgZnJvbSAnLi4vY29yZS9Ob2RlLmpzJztcclxuaW1wb3J0IHsgbm9kZVByb3h5IH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgbm9kZSB0aGF0IHJlcHJlc2VudHMgdGhlIGRpbWVuc2lvbnMgb2YgYSB0ZXh0dXJlLiBUaGUgdGV4dHVyZSBzaXplIGlzXHJcbiAqIHJldHJpZXZlZCBpbiB0aGUgc2hhZGVyIHZpYSBidWlsdC1pbiBzaGFkZXIgZnVuY3Rpb25zIGxpa2UgYHRleHR1cmVEaW1lbnNpb25zKClgXHJcbiAqIG9yIGB0ZXh0dXJlU2l6ZSgpYC5cclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVcclxuICovXHJcbmNsYXNzIFRleHR1cmVTaXplTm9kZSBleHRlbmRzIE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdUZXh0dXJlU2l6ZU5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgdGV4dHVyZSBzaXplIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmVOb2RlfSB0ZXh0dXJlTm9kZSAtIEEgdGV4dHVyZSBub2RlIHdoaWNoIHNpemUgc2hvdWxkIGJlIHJldHJpZXZlZC5cclxuXHQgKiBAcGFyYW0gez9Ob2RlPGludD59IFtsZXZlbE5vZGU9bnVsbF0gLSBBIGxldmVsIG5vZGUgd2hpY2ggZGVmaW5lcyB0aGUgcmVxdWVzdGVkIG1pcC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggdGV4dHVyZU5vZGUsIGxldmVsTm9kZSA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoICd1dmVjMicgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNUZXh0dXJlU2l6ZU5vZGUgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSB0ZXh0dXJlIG5vZGUgd2hpY2ggc2l6ZSBzaG91bGQgYmUgcmV0cmlldmVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtUZXh0dXJlTm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50ZXh0dXJlTm9kZSA9IHRleHR1cmVOb2RlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBsZXZlbCBub2RlIHdoaWNoIGRlZmluZXMgdGhlIHJlcXVlc3RlZCBtaXAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGU8aW50Pn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5sZXZlbE5vZGUgPSBsZXZlbE5vZGU7XHJcblxyXG5cdH1cclxuXHJcblx0Z2VuZXJhdGUoIGJ1aWxkZXIsIG91dHB1dCApIHtcclxuXHJcblx0XHRjb25zdCB0ZXh0dXJlUHJvcGVydHkgPSB0aGlzLnRleHR1cmVOb2RlLmJ1aWxkKCBidWlsZGVyLCAncHJvcGVydHknICk7XHJcblx0XHRjb25zdCBsZXZlbCA9IHRoaXMubGV2ZWxOb2RlID09PSBudWxsID8gJzAnIDogdGhpcy5sZXZlbE5vZGUuYnVpbGQoIGJ1aWxkZXIsICdpbnQnICk7XHJcblxyXG5cdFx0cmV0dXJuIGJ1aWxkZXIuZm9ybWF0KCBgJHsgYnVpbGRlci5nZXRNZXRob2QoICd0ZXh0dXJlRGltZW5zaW9ucycgKSB9KCAkeyB0ZXh0dXJlUHJvcGVydHkgfSwgJHsgbGV2ZWwgfSApYCwgdGhpcy5nZXROb2RlVHlwZSggYnVpbGRlciApLCBvdXRwdXQgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgVGV4dHVyZVNpemVOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSB0ZXh0dXJlIHNpemUgbm9kZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtUZXh0dXJlTm9kZX0gdGV4dHVyZU5vZGUgLSBBIHRleHR1cmUgbm9kZSB3aGljaCBzaXplIHNob3VsZCBiZSByZXRyaWV2ZWQuXHJcbiAqIEBwYXJhbSB7P05vZGU8aW50Pn0gW2xldmVsTm9kZT1udWxsXSAtIEEgbGV2ZWwgbm9kZSB3aGljaCBkZWZpbmVzIHRoZSByZXF1ZXN0ZWQgbWlwLlxyXG4gKiBAcmV0dXJucyB7VGV4dHVyZVNpemVOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHRleHR1cmVTaXplID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIFRleHR1cmVTaXplTm9kZSApLnNldFBhcmFtZXRlckxlbmd0aCggMSwgMiApO1xyXG4iLCJpbXBvcnQgVW5pZm9ybU5vZGUgZnJvbSAnLi4vY29yZS9Vbmlmb3JtTm9kZS5qcyc7XHJcbmltcG9ydCB7IE5vZGVVcGRhdGVUeXBlIH0gZnJvbSAnLi4vY29yZS9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBub2RlUHJveHkgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcblxyXG4vKipcclxuICogQSBzcGVjaWFsIHR5cGUgb2YgdW5pZm9ybSBub2RlIHRoYXQgY29tcHV0ZXMgdGhlXHJcbiAqIG1heGltdW0gbWlwbWFwIGxldmVsIGZvciBhIGdpdmVuIHRleHR1cmUgbm9kZS5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgbGV2ZWwgPSBtYXhNaXBMZXZlbCggdGV4dHVyZU5vZGUgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBVbmlmb3JtTm9kZVxyXG4gKi9cclxuY2xhc3MgTWF4TWlwTGV2ZWxOb2RlIGV4dGVuZHMgVW5pZm9ybU5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdNYXhNaXBMZXZlbE5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbWF4IG1pcCBsZXZlbCBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlTm9kZX0gdGV4dHVyZU5vZGUgLSBUaGUgdGV4dHVyZSBub2RlIHRvIGNvbXB1dGUgdGhlIG1heCBtaXAgbGV2ZWwgZm9yLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCB0ZXh0dXJlTm9kZSApIHtcclxuXHJcblx0XHRzdXBlciggMCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHRleHR1cmUgbm9kZSB0byBjb21wdXRlIHRoZSBtYXggbWlwIGxldmVsIGZvci5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge1RleHR1cmVOb2RlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl90ZXh0dXJlTm9kZSA9IHRleHR1cmVOb2RlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGB1cGRhdGVUeXBlYCBpcyBzZXQgdG8gYE5vZGVVcGRhdGVUeXBlLkZSQU1FYCBzaW5jZSB0aGUgbm9kZSB1cGRhdGVzXHJcblx0XHQgKiB0aGUgdGV4dHVyZSBvbmNlIHBlciBmcmFtZSBpbiBpdHMge0BsaW5rIE1heE1pcExldmVsTm9kZSN1cGRhdGV9IG1ldGhvZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICogQGRlZmF1bHQgJ2ZyYW1lJ1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVwZGF0ZVR5cGUgPSBOb2RlVXBkYXRlVHlwZS5GUkFNRTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgdGV4dHVyZSBub2RlIHRvIGNvbXB1dGUgdGhlIG1heCBtaXAgbGV2ZWwgZm9yLlxyXG5cdCAqXHJcblx0ICogQHJlYWRvbmx5XHJcblx0ICogQHR5cGUge1RleHR1cmVOb2RlfVxyXG5cdCAqL1xyXG5cdGdldCB0ZXh0dXJlTm9kZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fdGV4dHVyZU5vZGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBAcmVhZG9ubHlcclxuXHQgKiBAdHlwZSB7VGV4dHVyZX1cclxuXHQgKi9cclxuXHRnZXQgdGV4dHVyZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fdGV4dHVyZU5vZGUudmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0dXBkYXRlKCkge1xyXG5cclxuXHRcdGNvbnN0IHRleHR1cmUgPSB0aGlzLnRleHR1cmU7XHJcblx0XHRjb25zdCBpbWFnZXMgPSB0ZXh0dXJlLmltYWdlcztcclxuXHRcdGNvbnN0IGltYWdlID0gKCBpbWFnZXMgJiYgaW1hZ2VzLmxlbmd0aCA+IDAgKSA/ICggKCBpbWFnZXNbIDAgXSAmJiBpbWFnZXNbIDAgXS5pbWFnZSApIHx8IGltYWdlc1sgMCBdICkgOiB0ZXh0dXJlLmltYWdlO1xyXG5cclxuXHRcdGlmICggaW1hZ2UgJiYgaW1hZ2Uud2lkdGggIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gaW1hZ2U7XHJcblxyXG5cdFx0XHR0aGlzLnZhbHVlID0gTWF0aC5sb2cyKCBNYXRoLm1heCggd2lkdGgsIGhlaWdodCApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBNYXhNaXBMZXZlbE5vZGU7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIG1heCBtaXAgbGV2ZWwgbm9kZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtUZXh0dXJlTm9kZX0gdGV4dHVyZU5vZGUgLSBUaGUgdGV4dHVyZSBub2RlIHRvIGNvbXB1dGUgdGhlIG1heCBtaXAgbGV2ZWwgZm9yLlxyXG4gKiBAcmV0dXJucyB7TWF4TWlwTGV2ZWxOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG1heE1pcExldmVsID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE1heE1pcExldmVsTm9kZSApLnNldFBhcmFtZXRlckxlbmd0aCggMSApO1xyXG4iLCJpbXBvcnQgVW5pZm9ybU5vZGUsIHsgdW5pZm9ybSB9IGZyb20gJy4uL2NvcmUvVW5pZm9ybU5vZGUuanMnO1xyXG5pbXBvcnQgeyB1diB9IGZyb20gJy4vVVYuanMnO1xyXG5pbXBvcnQgeyB0ZXh0dXJlU2l6ZSB9IGZyb20gJy4vVGV4dHVyZVNpemVOb2RlLmpzJztcclxuaW1wb3J0IHsgY29sb3JTcGFjZVRvV29ya2luZyB9IGZyb20gJy4uL2Rpc3BsYXkvQ29sb3JTcGFjZU5vZGUuanMnO1xyXG5pbXBvcnQgeyBleHByZXNzaW9uIH0gZnJvbSAnLi4vY29kZS9FeHByZXNzaW9uTm9kZS5qcyc7XHJcbmltcG9ydCB7IG1heE1pcExldmVsIH0gZnJvbSAnLi4vdXRpbHMvTWF4TWlwTGV2ZWxOb2RlLmpzJztcclxuaW1wb3J0IHsgbm9kZVByb3h5LCB2ZWMzLCBub2RlT2JqZWN0LCBpbnQgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcbmltcG9ydCB7IE5vZGVVcGRhdGVUeXBlIH0gZnJvbSAnLi4vY29yZS9jb25zdGFudHMuanMnO1xyXG5cclxuaW1wb3J0IHsgSW50VHlwZSwgTmVhcmVzdEZpbHRlciwgVW5zaWduZWRJbnRUeXBlIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIHR5cGUgb2YgdW5pZm9ybSBub2RlIHJlcHJlc2VudHMgYSAyRCB0ZXh0dXJlLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgVW5pZm9ybU5vZGVcclxuICovXHJcbmNsYXNzIFRleHR1cmVOb2RlIGV4dGVuZHMgVW5pZm9ybU5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdUZXh0dXJlTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB0ZXh0dXJlIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHZhbHVlIC0gVGhlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHs/Tm9kZTx2ZWMyfHZlYzM+fSBbdXZOb2RlPW51bGxdIC0gVGhlIHV2IG5vZGUuXHJcblx0ICogQHBhcmFtIHs/Tm9kZTxpbnQ+fSBbbGV2ZWxOb2RlPW51bGxdIC0gVGhlIGxldmVsIG5vZGUuXHJcblx0ICogQHBhcmFtIHs/Tm9kZTxmbG9hdD59IFtiaWFzTm9kZT1udWxsXSAtIFRoZSBiaWFzIG5vZGUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHZhbHVlLCB1dk5vZGUgPSBudWxsLCBsZXZlbE5vZGUgPSBudWxsLCBiaWFzTm9kZSA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoIHZhbHVlICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzVGV4dHVyZU5vZGUgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVwcmVzZW50cyB0aGUgdGV4dHVyZSBjb29yZGluYXRlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGU8dmVjMnx2ZWMzPn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51dk5vZGUgPSB1dk5vZGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXByZXNlbnRzIHRoZSBtaXAgbGV2ZWwgdGhhdCBzaG91bGQgYmUgc2VsZWN0ZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPGludD59XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGV2ZWxOb2RlID0gbGV2ZWxOb2RlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVwcmVzZW50cyB0aGUgYmlhcyB0byBiZSBhcHBsaWVkIGR1cmluZyBsZXZlbC1vZi1kZXRhaWwgY29tcHV0YXRpb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPGZsb2F0Pn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5iaWFzTm9kZSA9IGJpYXNOb2RlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVwcmVzZW50cyBhIHJlZmVyZW5jZSB2YWx1ZSBhIHRleHR1cmUgc2FtcGxlIGlzIGNvbXBhcmVkIHRvLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Tm9kZTxmbG9hdD59XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29tcGFyZU5vZGUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hlbiB1c2luZyB0ZXh0dXJlIGFycmF5cywgdGhlIGRlcHRoIG5vZGUgZGVmaW5lcyB0aGUgbGF5ZXIgdG8gc2VsZWN0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Tm9kZTxpbnQ+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRlcHRoTm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGVuIGRlZmluZWQsIGEgdGV4dHVyZSBpcyBzYW1wbGVkIHVzaW5nIGV4cGxpY2l0IGdyYWRpZW50cy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P0FycmF5PE5vZGU8dmVjMj4+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdyYWROb2RlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGV4dHVyZSB2YWx1ZXMgc2hvdWxkIGJlIHNhbXBsZWQgb3IgZmV0Y2hlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zYW1wbGVyID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIHV2IHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBzaG91bGQgYmVcclxuXHRcdCAqIGF1dG9tYXRpY2FsbHkgdXBkYXRlZCBvciBub3QuIFVzZSBgc2V0VXBkYXRlTWF0cml4KClgXHJcblx0XHQgKiBpZiB5b3Ugd2FudCB0byBjaGFuZ2UgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXBkYXRlTWF0cml4ID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBCeSBkZWZhdWx0IHRoZSBgdXBkYXRlKClgIG1ldGhvZCBpcyBub3QgZXhlY3V0ZWQuIGBzZXRVcGRhdGVNYXRyaXgoKWBcclxuXHRcdCAqIHNldHMgdGhlIHZhbHVlIHRvIGBmcmFtZWAgd2hlbiB0aGUgdXYgdHJhbnNmb3JtYXRpb24gbWF0cml4IHNob3VsZFxyXG5cdFx0ICogYXV0b21hdGljYWxseSBiZSB1cGRhdGVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKiBAZGVmYXVsdCAnbm9uZSdcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51cGRhdGVUeXBlID0gTm9kZVVwZGF0ZVR5cGUuTk9ORTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByZWZlcmVuY2Ugbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVmZXJlbmNlTm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdGV4dHVyZSB2YWx1ZSBpcyBzdG9yZWQgaW4gYSBwcml2YXRlIHByb3BlcnR5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7VGV4dHVyZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fdmFsdWUgPSB2YWx1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB1bmlmb3JtIG5vZGUgdGhhdCByZXByZXNlbnRzIHRoZSB1diB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHs/VW5pZm9ybU5vZGU8bWF0Mz59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX21hdHJpeFVuaWZvcm0gPSBudWxsO1xyXG5cclxuXHRcdHRoaXMuc2V0VXBkYXRlTWF0cml4KCB1dk5vZGUgPT09IG51bGwgKTtcclxuXHJcblx0fVxyXG5cclxuXHRzZXQgdmFsdWUoIHZhbHVlICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5yZWZlcmVuY2VOb2RlICkge1xyXG5cclxuXHRcdFx0dGhpcy5yZWZlcmVuY2VOb2RlLnZhbHVlID0gdmFsdWU7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHRoaXMuX3ZhbHVlID0gdmFsdWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSB0ZXh0dXJlIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge1RleHR1cmV9XHJcblx0ICovXHJcblx0Z2V0IHZhbHVlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnJlZmVyZW5jZU5vZGUgPyB0aGlzLnJlZmVyZW5jZU5vZGUudmFsdWUgOiB0aGlzLl92YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBPdmVyd3JpdHRlbiBzaW5jZSB0aGUgdW5pZm9ybSBoYXNoIGlzIGRlZmluZWQgYnkgdGhlIHRleHR1cmUncyBVVUlELlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB1bmlmb3JtIGhhc2guXHJcblx0ICovXHJcblx0Z2V0VW5pZm9ybUhhc2goIC8qYnVpbGRlciovICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnZhbHVlLnV1aWQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogT3ZlcndyaXR0ZW4gc2luY2UgdGhlIG5vZGUgdHlwZSBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0ZXh0dXJlIHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG5vZGUgdHlwZS5cclxuXHQgKi9cclxuXHRnZXROb2RlVHlwZSggLypidWlsZGVyKi8gKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLnZhbHVlLmlzRGVwdGhUZXh0dXJlID09PSB0cnVlICkgcmV0dXJuICdmbG9hdCc7XHJcblxyXG5cdFx0aWYgKCB0aGlzLnZhbHVlLnR5cGUgPT09IFVuc2lnbmVkSW50VHlwZSApIHtcclxuXHJcblx0XHRcdHJldHVybiAndXZlYzQnO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHRoaXMudmFsdWUudHlwZSA9PT0gSW50VHlwZSApIHtcclxuXHJcblx0XHRcdHJldHVybiAnaXZlYzQnO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gJ3ZlYzQnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE92ZXJ3cml0ZXMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gcmV0dXJuIGEgZml4ZWQgdmFsdWUgYCd0ZXh0dXJlJ2AuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGlucHV0IHR5cGUuXHJcblx0ICovXHJcblx0Z2V0SW5wdXRUeXBlKCAvKmJ1aWxkZXIqLyApIHtcclxuXHJcblx0XHRyZXR1cm4gJ3RleHR1cmUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBkZWZhdWx0IHV2cyBiYXNlZCBvbiB0aGUgY3VycmVudCB0ZXh0dXJlJ3MgY2hhbm5lbC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0F0dHJpYnV0ZU5vZGU8dmVjMj59IFRoZSBkZWZhdWx0IHV2cy5cclxuXHQgKi9cclxuXHRnZXREZWZhdWx0VVYoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHV2KCB0aGlzLnZhbHVlLmNoYW5uZWwgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBPdmVyd3JpdHRlbiB0byBhbHdheXMgcmV0dXJuIHRoZSB0ZXh0dXJlIHJlZmVyZW5jZSBvZiB0aGUgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7YW55fSBzdGF0ZSAtIFRoaXMgbWV0aG9kIGNhbiBiZSBpbnZvY2F0ZWQgaW4gZGlmZmVyZW50IGNvbnRleHRzIHNvIGBzdGF0ZWAgY2FuIHJlZmVyIHRvIGFueSBvYmplY3QgdHlwZS5cclxuXHQgKiBAcmV0dXJuIHtUZXh0dXJlfSBUaGUgdGV4dHVyZSByZWZlcmVuY2UuXHJcblx0ICovXHJcblx0dXBkYXRlUmVmZXJlbmNlKCAvKnN0YXRlKi8gKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMudmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVHJhbnNmb3JtcyB0aGUgZ2l2ZW4gdXYgbm9kZSB3aXRoIHRoZSB0ZXh0dXJlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gdXZOb2RlIC0gVGhlIHV2IG5vZGUgdG8gdHJhbnNmb3JtLlxyXG5cdCAqIEByZXR1cm4ge05vZGV9IFRoZSB0cmFuc2Zvcm1lZCB1diBub2RlLlxyXG5cdCAqL1xyXG5cdGdldFRyYW5zZm9ybWVkVVYoIHV2Tm9kZSApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuX21hdHJpeFVuaWZvcm0gPT09IG51bGwgKSB0aGlzLl9tYXRyaXhVbmlmb3JtID0gdW5pZm9ybSggdGhpcy52YWx1ZS5tYXRyaXggKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fbWF0cml4VW5pZm9ybS5tdWwoIHZlYzMoIHV2Tm9kZSwgMSApICkueHk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVmaW5lcyB3aGV0aGVyIHRoZSB1diB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggc2hvdWxkIGF1dG9tYXRpY2FsbHkgYmUgdXBkYXRlZCBvciBub3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbHVlIC0gVGhlIHVwZGF0ZSB0b2dnbGUuXHJcblx0ICogQHJldHVybiB7VGV4dHVyZU5vZGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbm9kZS5cclxuXHQgKi9cclxuXHRzZXRVcGRhdGVNYXRyaXgoIHZhbHVlICkge1xyXG5cclxuXHRcdHRoaXMudXBkYXRlTWF0cml4ID0gdmFsdWU7XHJcblx0XHR0aGlzLnVwZGF0ZVR5cGUgPSB2YWx1ZSA/IE5vZGVVcGRhdGVUeXBlLlJFTkRFUiA6IE5vZGVVcGRhdGVUeXBlLk5PTkU7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0dXBzIHRoZSB1diBub2RlLiBEZXBlbmRpbmcgb24gdGhlIGJhY2tlbmQgYXMgd2VsbCBhcyB0ZXh0dXJlJ3MgaW1hZ2UgYW5kIHR5cGUsIGl0IG1pZ2h0IGJlIG5lY2Vzc2FyeVxyXG5cdCAqIHRvIG1vZGlmeSB0aGUgdXYgbm9kZSBmb3IgY29ycmVjdCBzYW1wbGluZy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHBhcmFtIHtOb2RlfSB1dk5vZGUgLSBUaGUgdXYgbm9kZSB0byBzZXR1cC5cclxuXHQgKiBAcmV0dXJuIHtOb2RlfSBUaGUgdXBkYXRlZCB1diBub2RlLlxyXG5cdCAqL1xyXG5cdHNldHVwVVYoIGJ1aWxkZXIsIHV2Tm9kZSApIHtcclxuXHJcblx0XHRjb25zdCB0ZXh0dXJlID0gdGhpcy52YWx1ZTtcclxuXHJcblx0XHRpZiAoIGJ1aWxkZXIuaXNGbGlwWSgpICYmICggKCB0ZXh0dXJlLmltYWdlIGluc3RhbmNlb2YgSW1hZ2VCaXRtYXAgJiYgdGV4dHVyZS5mbGlwWSA9PT0gdHJ1ZSApIHx8IHRleHR1cmUuaXNSZW5kZXJUYXJnZXRUZXh0dXJlID09PSB0cnVlIHx8IHRleHR1cmUuaXNGcmFtZWJ1ZmZlclRleHR1cmUgPT09IHRydWUgfHwgdGV4dHVyZS5pc0RlcHRoVGV4dHVyZSA9PT0gdHJ1ZSApICkge1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLnNhbXBsZXIgKSB7XHJcblxyXG5cdFx0XHRcdHV2Tm9kZSA9IHV2Tm9kZS5mbGlwWSgpO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0dXZOb2RlID0gdXZOb2RlLnNldFkoIGludCggdGV4dHVyZVNpemUoIHRoaXMsIHRoaXMubGV2ZWxOb2RlICkueSApLnN1YiggdXZOb2RlLnkgKS5zdWIoIDEgKSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdXZOb2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHVwcyB0ZXh0dXJlIG5vZGUgYnkgcHJlcGFyaW5nIHRoZSBpbnRlcm5hbCBub2RlcyBmb3IgY29kZSBnZW5lcmF0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKi9cclxuXHRzZXR1cCggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCBwcm9wZXJ0aWVzID0gYnVpbGRlci5nZXROb2RlUHJvcGVydGllcyggdGhpcyApO1xyXG5cdFx0cHJvcGVydGllcy5yZWZlcmVuY2VOb2RlID0gdGhpcy5yZWZlcmVuY2VOb2RlO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZSA9IHRoaXMudmFsdWU7XHJcblxyXG5cdFx0aWYgKCAhIHRleHR1cmUgfHwgdGV4dHVyZS5pc1RleHR1cmUgIT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5UU0w6IGB0ZXh0dXJlKCB2YWx1ZSApYCBmdW5jdGlvbiBleHBlY3RzIGEgdmFsaWQgaW5zdGFuY2Ugb2YgVEhSRUUuVGV4dHVyZSgpLicgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRsZXQgdXZOb2RlID0gdGhpcy51dk5vZGU7XHJcblxyXG5cdFx0aWYgKCAoIHV2Tm9kZSA9PT0gbnVsbCB8fCBidWlsZGVyLmNvbnRleHQuZm9yY2VVVkNvbnRleHQgPT09IHRydWUgKSAmJiBidWlsZGVyLmNvbnRleHQuZ2V0VVYgKSB7XHJcblxyXG5cdFx0XHR1dk5vZGUgPSBidWlsZGVyLmNvbnRleHQuZ2V0VVYoIHRoaXMgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCAhIHV2Tm9kZSApIHV2Tm9kZSA9IHRoaXMuZ2V0RGVmYXVsdFVWKCk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLnVwZGF0ZU1hdHJpeCA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdHV2Tm9kZSA9IHRoaXMuZ2V0VHJhbnNmb3JtZWRVViggdXZOb2RlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHV2Tm9kZSA9IHRoaXMuc2V0dXBVViggYnVpbGRlciwgdXZOb2RlICk7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRsZXQgbGV2ZWxOb2RlID0gdGhpcy5sZXZlbE5vZGU7XHJcblxyXG5cdFx0aWYgKCBsZXZlbE5vZGUgPT09IG51bGwgJiYgYnVpbGRlci5jb250ZXh0LmdldFRleHR1cmVMZXZlbCApIHtcclxuXHJcblx0XHRcdGxldmVsTm9kZSA9IGJ1aWxkZXIuY29udGV4dC5nZXRUZXh0dXJlTGV2ZWwoIHRoaXMgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRwcm9wZXJ0aWVzLnV2Tm9kZSA9IHV2Tm9kZTtcclxuXHRcdHByb3BlcnRpZXMubGV2ZWxOb2RlID0gbGV2ZWxOb2RlO1xyXG5cdFx0cHJvcGVydGllcy5iaWFzTm9kZSA9IHRoaXMuYmlhc05vZGU7XHJcblx0XHRwcm9wZXJ0aWVzLmNvbXBhcmVOb2RlID0gdGhpcy5jb21wYXJlTm9kZTtcclxuXHRcdHByb3BlcnRpZXMuZ3JhZE5vZGUgPSB0aGlzLmdyYWROb2RlO1xyXG5cdFx0cHJvcGVydGllcy5kZXB0aE5vZGUgPSB0aGlzLmRlcHRoTm9kZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZW5lcmF0ZXMgdGhlIHV2IGNvZGUgc25pcHBldC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHBhcmFtIHtOb2RlfSB1dk5vZGUgLSBUaGUgdXYgbm9kZSB0byBnZW5lcmF0ZSBjb2RlIGZvci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBnZW5lcmF0ZWQgY29kZSBzbmlwcGV0LlxyXG5cdCAqL1xyXG5cdGdlbmVyYXRlVVYoIGJ1aWxkZXIsIHV2Tm9kZSApIHtcclxuXHJcblx0XHRyZXR1cm4gdXZOb2RlLmJ1aWxkKCBidWlsZGVyLCB0aGlzLnNhbXBsZXIgPT09IHRydWUgPyAndmVjMicgOiAnaXZlYzInICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2VuZXJhdGVzIHRoZSBzbmlwcGV0IGZvciB0aGUgdGV4dHVyZSBzYW1wbGluZy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHRleHR1cmVQcm9wZXJ0eSAtIFRoZSB0ZXh0dXJlIHByb3BlcnR5LlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB1dlNuaXBwZXQgLSBUaGUgdXYgc25pcHBldC5cclxuXHQgKiBAcGFyYW0gez9zdHJpbmd9IGxldmVsU25pcHBldCAtIFRoZSBsZXZlbCBzbmlwcGV0LlxyXG5cdCAqIEBwYXJhbSB7P3N0cmluZ30gYmlhc1NuaXBwZXQgLSBUaGUgYmlhcyBzbmlwcGV0LlxyXG5cdCAqIEBwYXJhbSB7P3N0cmluZ30gZGVwdGhTbmlwcGV0IC0gVGhlIGRlcHRoIHNuaXBwZXQuXHJcblx0ICogQHBhcmFtIHs/c3RyaW5nfSBjb21wYXJlU25pcHBldCAtIFRoZSBjb21wYXJlIHNuaXBwZXQuXHJcblx0ICogQHBhcmFtIHs/QXJyYXk8c3RyaW5nPn0gZ3JhZFNuaXBwZXQgLSBUaGUgZ3JhZCBzbmlwcGV0LlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGdlbmVyYXRlZCBjb2RlIHNuaXBwZXQuXHJcblx0ICovXHJcblx0Z2VuZXJhdGVTbmlwcGV0KCBidWlsZGVyLCB0ZXh0dXJlUHJvcGVydHksIHV2U25pcHBldCwgbGV2ZWxTbmlwcGV0LCBiaWFzU25pcHBldCwgZGVwdGhTbmlwcGV0LCBjb21wYXJlU25pcHBldCwgZ3JhZFNuaXBwZXQgKSB7XHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZSA9IHRoaXMudmFsdWU7XHJcblxyXG5cdFx0bGV0IHNuaXBwZXQ7XHJcblxyXG5cdFx0aWYgKCBsZXZlbFNuaXBwZXQgKSB7XHJcblxyXG5cdFx0XHRzbmlwcGV0ID0gYnVpbGRlci5nZW5lcmF0ZVRleHR1cmVMZXZlbCggdGV4dHVyZSwgdGV4dHVyZVByb3BlcnR5LCB1dlNuaXBwZXQsIGxldmVsU25pcHBldCwgZGVwdGhTbmlwcGV0ICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggYmlhc1NuaXBwZXQgKSB7XHJcblxyXG5cdFx0XHRzbmlwcGV0ID0gYnVpbGRlci5nZW5lcmF0ZVRleHR1cmVCaWFzKCB0ZXh0dXJlLCB0ZXh0dXJlUHJvcGVydHksIHV2U25pcHBldCwgYmlhc1NuaXBwZXQsIGRlcHRoU25pcHBldCApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGdyYWRTbmlwcGV0ICkge1xyXG5cclxuXHRcdFx0c25pcHBldCA9IGJ1aWxkZXIuZ2VuZXJhdGVUZXh0dXJlR3JhZCggdGV4dHVyZSwgdGV4dHVyZVByb3BlcnR5LCB1dlNuaXBwZXQsIGdyYWRTbmlwcGV0LCBkZXB0aFNuaXBwZXQgKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBjb21wYXJlU25pcHBldCApIHtcclxuXHJcblx0XHRcdHNuaXBwZXQgPSBidWlsZGVyLmdlbmVyYXRlVGV4dHVyZUNvbXBhcmUoIHRleHR1cmUsIHRleHR1cmVQcm9wZXJ0eSwgdXZTbmlwcGV0LCBjb21wYXJlU25pcHBldCwgZGVwdGhTbmlwcGV0ICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggdGhpcy5zYW1wbGVyID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdHNuaXBwZXQgPSBidWlsZGVyLmdlbmVyYXRlVGV4dHVyZUxvYWQoIHRleHR1cmUsIHRleHR1cmVQcm9wZXJ0eSwgdXZTbmlwcGV0LCBkZXB0aFNuaXBwZXQgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0c25pcHBldCA9IGJ1aWxkZXIuZ2VuZXJhdGVUZXh0dXJlKCB0ZXh0dXJlLCB0ZXh0dXJlUHJvcGVydHksIHV2U25pcHBldCwgZGVwdGhTbmlwcGV0ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBzbmlwcGV0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyB0aGUgY29kZSBzbmlwcGV0IG9mIHRoZSB0ZXh0dXJlIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBvdXRwdXQgLSBUaGUgY3VycmVudCBvdXRwdXQuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgZ2VuZXJhdGVkIGNvZGUgc25pcHBldC5cclxuXHQgKi9cclxuXHRnZW5lcmF0ZSggYnVpbGRlciwgb3V0cHV0ICkge1xyXG5cclxuXHRcdGNvbnN0IHRleHR1cmUgPSB0aGlzLnZhbHVlO1xyXG5cclxuXHRcdGNvbnN0IHByb3BlcnRpZXMgPSBidWlsZGVyLmdldE5vZGVQcm9wZXJ0aWVzKCB0aGlzICk7XHJcblx0XHRjb25zdCB0ZXh0dXJlUHJvcGVydHkgPSBzdXBlci5nZW5lcmF0ZSggYnVpbGRlciwgJ3Byb3BlcnR5JyApO1xyXG5cclxuXHRcdGlmICggL15zYW1wbGVyLy50ZXN0KCBvdXRwdXQgKSApIHtcclxuXHJcblx0XHRcdHJldHVybiB0ZXh0dXJlUHJvcGVydHkgKyAnX3NhbXBsZXInO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGJ1aWxkZXIuaXNSZWZlcmVuY2UoIG91dHB1dCApICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIHRleHR1cmVQcm9wZXJ0eTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc3Qgbm9kZURhdGEgPSBidWlsZGVyLmdldERhdGFGcm9tTm9kZSggdGhpcyApO1xyXG5cclxuXHRcdFx0bGV0IHByb3BlcnR5TmFtZSA9IG5vZGVEYXRhLnByb3BlcnR5TmFtZTtcclxuXHJcblx0XHRcdGlmICggcHJvcGVydHlOYW1lID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHsgdXZOb2RlLCBsZXZlbE5vZGUsIGJpYXNOb2RlLCBjb21wYXJlTm9kZSwgZGVwdGhOb2RlLCBncmFkTm9kZSB9ID0gcHJvcGVydGllcztcclxuXHJcblx0XHRcdFx0Y29uc3QgdXZTbmlwcGV0ID0gdGhpcy5nZW5lcmF0ZVVWKCBidWlsZGVyLCB1dk5vZGUgKTtcclxuXHRcdFx0XHRjb25zdCBsZXZlbFNuaXBwZXQgPSBsZXZlbE5vZGUgPyBsZXZlbE5vZGUuYnVpbGQoIGJ1aWxkZXIsICdmbG9hdCcgKSA6IG51bGw7XHJcblx0XHRcdFx0Y29uc3QgYmlhc1NuaXBwZXQgPSBiaWFzTm9kZSA/IGJpYXNOb2RlLmJ1aWxkKCBidWlsZGVyLCAnZmxvYXQnICkgOiBudWxsO1xyXG5cdFx0XHRcdGNvbnN0IGRlcHRoU25pcHBldCA9IGRlcHRoTm9kZSA/IGRlcHRoTm9kZS5idWlsZCggYnVpbGRlciwgJ2ludCcgKSA6IG51bGw7XHJcblx0XHRcdFx0Y29uc3QgY29tcGFyZVNuaXBwZXQgPSBjb21wYXJlTm9kZSA/IGNvbXBhcmVOb2RlLmJ1aWxkKCBidWlsZGVyLCAnZmxvYXQnICkgOiBudWxsO1xyXG5cdFx0XHRcdGNvbnN0IGdyYWRTbmlwcGV0ID0gZ3JhZE5vZGUgPyBbIGdyYWROb2RlWyAwIF0uYnVpbGQoIGJ1aWxkZXIsICd2ZWMyJyApLCBncmFkTm9kZVsgMSBdLmJ1aWxkKCBidWlsZGVyLCAndmVjMicgKSBdIDogbnVsbDtcclxuXHJcblx0XHRcdFx0Y29uc3Qgbm9kZVZhciA9IGJ1aWxkZXIuZ2V0VmFyRnJvbU5vZGUoIHRoaXMgKTtcclxuXHJcblx0XHRcdFx0cHJvcGVydHlOYW1lID0gYnVpbGRlci5nZXRQcm9wZXJ0eU5hbWUoIG5vZGVWYXIgKTtcclxuXHJcblx0XHRcdFx0Y29uc3Qgc25pcHBldCA9IHRoaXMuZ2VuZXJhdGVTbmlwcGV0KCBidWlsZGVyLCB0ZXh0dXJlUHJvcGVydHksIHV2U25pcHBldCwgbGV2ZWxTbmlwcGV0LCBiaWFzU25pcHBldCwgZGVwdGhTbmlwcGV0LCBjb21wYXJlU25pcHBldCwgZ3JhZFNuaXBwZXQgKTtcclxuXHJcblx0XHRcdFx0YnVpbGRlci5hZGRMaW5lRmxvd0NvZGUoIGAke3Byb3BlcnR5TmFtZX0gPSAke3NuaXBwZXR9YCwgdGhpcyApO1xyXG5cclxuXHRcdFx0XHRub2RlRGF0YS5zbmlwcGV0ID0gc25pcHBldDtcclxuXHRcdFx0XHRub2RlRGF0YS5wcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRsZXQgc25pcHBldCA9IHByb3BlcnR5TmFtZTtcclxuXHRcdFx0Y29uc3Qgbm9kZVR5cGUgPSB0aGlzLmdldE5vZGVUeXBlKCBidWlsZGVyICk7XHJcblxyXG5cdFx0XHRpZiAoIGJ1aWxkZXIubmVlZHNUb1dvcmtpbmdDb2xvclNwYWNlKCB0ZXh0dXJlICkgKSB7XHJcblxyXG5cdFx0XHRcdHNuaXBwZXQgPSBjb2xvclNwYWNlVG9Xb3JraW5nKCBleHByZXNzaW9uKCBzbmlwcGV0LCBub2RlVHlwZSApLCB0ZXh0dXJlLmNvbG9yU3BhY2UgKS5zZXR1cCggYnVpbGRlciApLmJ1aWxkKCBidWlsZGVyLCBub2RlVHlwZSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIGJ1aWxkZXIuZm9ybWF0KCBzbmlwcGV0LCBub2RlVHlwZSwgb3V0cHV0ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHNhbXBsZXIgdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbHVlIC0gVGhlIHNhbXBsZXIgdmFsdWUgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge1RleHR1cmVOb2RlfSBBIHJlZmVyZW5jZSB0byB0aGlzIHRleHR1cmUgbm9kZS5cclxuXHQgKi9cclxuXHRzZXRTYW1wbGVyKCB2YWx1ZSApIHtcclxuXHJcblx0XHR0aGlzLnNhbXBsZXIgPSB2YWx1ZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBzYW1wbGVyIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gVGhlIHNhbXBsZXIgdmFsdWUuXHJcblx0ICovXHJcblx0Z2V0U2FtcGxlcigpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5zYW1wbGVyO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vIEBUT0RPOiBNb3ZlIHRvIFRTTFxyXG5cclxuXHQvKipcclxuXHQgKiBAZnVuY3Rpb25cclxuXHQgKiBAZGVwcmVjYXRlZCBzaW5jZSByMTcyLiBVc2Uge0BsaW5rIFRleHR1cmVOb2RlI3NhbXBsZX0gaW5zdGVhZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gdXZOb2RlIC0gVGhlIHV2IG5vZGUuXHJcblx0ICogQHJldHVybiB7VGV4dHVyZU5vZGV9IEEgdGV4dHVyZSBub2RlIHJlcHJlc2VudGluZyB0aGUgdGV4dHVyZSBzYW1wbGUuXHJcblx0ICovXHJcblx0dXYoIHV2Tm9kZSApIHsgLy8gQGRlcHJlY2F0ZWQsIHIxNzJcclxuXHJcblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5UZXh0dXJlTm9kZTogLnV2KCkgaGFzIGJlZW4gcmVuYW1lZC4gVXNlIC5zYW1wbGUoKSBpbnN0ZWFkLicgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5zYW1wbGUoIHV2Tm9kZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNhbXBsZXMgdGhlIHRleHR1cmUgd2l0aCB0aGUgZ2l2ZW4gdXYgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gdXZOb2RlIC0gVGhlIHV2IG5vZGUuXHJcblx0ICogQHJldHVybiB7VGV4dHVyZU5vZGV9IEEgdGV4dHVyZSBub2RlIHJlcHJlc2VudGluZyB0aGUgdGV4dHVyZSBzYW1wbGUuXHJcblx0ICovXHJcblx0c2FtcGxlKCB1dk5vZGUgKSB7XHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZU5vZGUgPSB0aGlzLmNsb25lKCk7XHJcblx0XHR0ZXh0dXJlTm9kZS51dk5vZGUgPSBub2RlT2JqZWN0KCB1dk5vZGUgKTtcclxuXHRcdHRleHR1cmVOb2RlLnJlZmVyZW5jZU5vZGUgPSB0aGlzLmdldFNlbGYoKTtcclxuXHJcblx0XHRyZXR1cm4gbm9kZU9iamVjdCggdGV4dHVyZU5vZGUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTYW1wbGVzIGEgYmx1cnJlZCB2ZXJzaW9uIG9mIHRoZSB0ZXh0dXJlIGJ5IGRlZmluaW5nIGFuIGludGVybmFsIGJpYXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSBhbW91bnROb2RlIC0gSG93IGJsdXJyZWQgdGhlIHRleHR1cmUgc2hvdWxkIGJlLlxyXG5cdCAqIEByZXR1cm4ge1RleHR1cmVOb2RlfSBBIHRleHR1cmUgbm9kZSByZXByZXNlbnRpbmcgdGhlIHRleHR1cmUgc2FtcGxlLlxyXG5cdCAqL1xyXG5cdGJsdXIoIGFtb3VudE5vZGUgKSB7XHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZU5vZGUgPSB0aGlzLmNsb25lKCk7XHJcblx0XHR0ZXh0dXJlTm9kZS5iaWFzTm9kZSA9IG5vZGVPYmplY3QoIGFtb3VudE5vZGUgKS5tdWwoIG1heE1pcExldmVsKCB0ZXh0dXJlTm9kZSApICk7XHJcblx0XHR0ZXh0dXJlTm9kZS5yZWZlcmVuY2VOb2RlID0gdGhpcy5nZXRTZWxmKCk7XHJcblxyXG5cdFx0Y29uc3QgbWFwID0gdGV4dHVyZU5vZGUudmFsdWU7XHJcblxyXG5cdFx0aWYgKCBtYXAgJiYgbWFwLmdlbmVyYXRlTWlwbWFwcyA9PT0gZmFsc2UgfHwgbWFwLm1pbkZpbHRlciA9PT0gTmVhcmVzdEZpbHRlciB8fCBtYXAubWFnRmlsdGVyID09PSBOZWFyZXN0RmlsdGVyICkge1xyXG5cclxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVFNMOiB0ZXh0dXJlKCkuYmx1cigpIHJlcXVpcmVzIG1pcG1hcHMgYW5kIHNhbXBsaW5nLiBVc2UgLmdlbmVyYXRlTWlwbWFwcz10cnVlIGFuZCAubWluRmlsdGVyLy5tYWdGaWx0ZXI9VEhSRUUuTGluZWFyRmlsdGVyIGluIHRoZSBUZXh0dXJlLicgKTtcclxuXHJcblx0XHRcdHRleHR1cmVOb2RlLmJpYXNOb2RlID0gbnVsbDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG5vZGVPYmplY3QoIHRleHR1cmVOb2RlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2FtcGxlcyBhIHNwZWNpZmljIG1pcCBvZiB0aGUgdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZTxpbnQ+fSBsZXZlbE5vZGUgLSBUaGUgbWlwIGxldmVsIHRvIHNhbXBsZS5cclxuXHQgKiBAcmV0dXJuIHtUZXh0dXJlTm9kZX0gQSB0ZXh0dXJlIG5vZGUgcmVwcmVzZW50aW5nIHRoZSB0ZXh0dXJlIHNhbXBsZS5cclxuXHQgKi9cclxuXHRsZXZlbCggbGV2ZWxOb2RlICkge1xyXG5cclxuXHRcdGNvbnN0IHRleHR1cmVOb2RlID0gdGhpcy5jbG9uZSgpO1xyXG5cdFx0dGV4dHVyZU5vZGUubGV2ZWxOb2RlID0gbm9kZU9iamVjdCggbGV2ZWxOb2RlICk7XHJcblx0XHR0ZXh0dXJlTm9kZS5yZWZlcmVuY2VOb2RlID0gdGhpcy5nZXRTZWxmKCk7XHJcblxyXG5cdFx0cmV0dXJuIG5vZGVPYmplY3QoIHRleHR1cmVOb2RlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgdGV4dHVyZSBzaXplIG9mIHRoZSByZXF1ZXN0ZWQgbGV2ZWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGU8aW50Pn0gbGV2ZWxOb2RlIC0gVGhlIGxldmVsIHRvIGNvbXB1dGUgdGhlIHNpemUgZm9yLlxyXG5cdCAqIEByZXR1cm4ge1RleHR1cmVTaXplTm9kZX0gVGhlIHRleHR1cmUgc2l6ZS5cclxuXHQgKi9cclxuXHRzaXplKCBsZXZlbE5vZGUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRleHR1cmVTaXplKCB0aGlzLCBsZXZlbE5vZGUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTYW1wbGVzIHRoZSB0ZXh0dXJlIHdpdGggdGhlIGdpdmVuIGJpYXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSBiaWFzTm9kZSAtIFRoZSBiaWFzIG5vZGUuXHJcblx0ICogQHJldHVybiB7VGV4dHVyZU5vZGV9IEEgdGV4dHVyZSBub2RlIHJlcHJlc2VudGluZyB0aGUgdGV4dHVyZSBzYW1wbGUuXHJcblx0ICovXHJcblx0YmlhcyggYmlhc05vZGUgKSB7XHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZU5vZGUgPSB0aGlzLmNsb25lKCk7XHJcblx0XHR0ZXh0dXJlTm9kZS5iaWFzTm9kZSA9IG5vZGVPYmplY3QoIGJpYXNOb2RlICk7XHJcblx0XHR0ZXh0dXJlTm9kZS5yZWZlcmVuY2VOb2RlID0gdGhpcy5nZXRTZWxmKCk7XHJcblxyXG5cdFx0cmV0dXJuIG5vZGVPYmplY3QoIHRleHR1cmVOb2RlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2FtcGxlcyB0aGUgdGV4dHVyZSBieSBleGVjdXRpbmcgYSBjb21wYXJlIG9wZXJhdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZTxmbG9hdD59IGNvbXBhcmVOb2RlIC0gVGhlIG5vZGUgdGhhdCBkZWZpbmVzIHRoZSBjb21wYXJlIHZhbHVlLlxyXG5cdCAqIEByZXR1cm4ge1RleHR1cmVOb2RlfSBBIHRleHR1cmUgbm9kZSByZXByZXNlbnRpbmcgdGhlIHRleHR1cmUgc2FtcGxlLlxyXG5cdCAqL1xyXG5cdGNvbXBhcmUoIGNvbXBhcmVOb2RlICkge1xyXG5cclxuXHRcdGNvbnN0IHRleHR1cmVOb2RlID0gdGhpcy5jbG9uZSgpO1xyXG5cdFx0dGV4dHVyZU5vZGUuY29tcGFyZU5vZGUgPSBub2RlT2JqZWN0KCBjb21wYXJlTm9kZSApO1xyXG5cdFx0dGV4dHVyZU5vZGUucmVmZXJlbmNlTm9kZSA9IHRoaXMuZ2V0U2VsZigpO1xyXG5cclxuXHRcdHJldHVybiBub2RlT2JqZWN0KCB0ZXh0dXJlTm9kZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNhbXBsZXMgdGhlIHRleHR1cmUgdXNpbmcgYW4gZXhwbGljaXQgZ3JhZGllbnQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGU8dmVjMj59IGdyYWROb2RlWCAtIFRoZSBncmFkWCBub2RlLlxyXG5cdCAqIEBwYXJhbSB7Tm9kZTx2ZWMyPn0gZ3JhZE5vZGVZIC0gVGhlIGdyYWRZIG5vZGUuXHJcblx0ICogQHJldHVybiB7VGV4dHVyZU5vZGV9IEEgdGV4dHVyZSBub2RlIHJlcHJlc2VudGluZyB0aGUgdGV4dHVyZSBzYW1wbGUuXHJcblx0ICovXHJcblx0Z3JhZCggZ3JhZE5vZGVYLCBncmFkTm9kZVkgKSB7XHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZU5vZGUgPSB0aGlzLmNsb25lKCk7XHJcblx0XHR0ZXh0dXJlTm9kZS5ncmFkTm9kZSA9IFsgbm9kZU9iamVjdCggZ3JhZE5vZGVYICksIG5vZGVPYmplY3QoIGdyYWROb2RlWSApIF07XHJcblx0XHR0ZXh0dXJlTm9kZS5yZWZlcmVuY2VOb2RlID0gdGhpcy5nZXRTZWxmKCk7XHJcblxyXG5cdFx0cmV0dXJuIG5vZGVPYmplY3QoIHRleHR1cmVOb2RlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2FtcGxlcyB0aGUgdGV4dHVyZSBieSBkZWZpbmluZyBhIGRlcHRoIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGU8aW50Pn0gZGVwdGhOb2RlIC0gVGhlIGRlcHRoIG5vZGUuXHJcblx0ICogQHJldHVybiB7VGV4dHVyZU5vZGV9IEEgdGV4dHVyZSBub2RlIHJlcHJlc2VudGluZyB0aGUgdGV4dHVyZSBzYW1wbGUuXHJcblx0ICovXHJcblx0ZGVwdGgoIGRlcHRoTm9kZSApIHtcclxuXHJcblx0XHRjb25zdCB0ZXh0dXJlTm9kZSA9IHRoaXMuY2xvbmUoKTtcclxuXHRcdHRleHR1cmVOb2RlLmRlcHRoTm9kZSA9IG5vZGVPYmplY3QoIGRlcHRoTm9kZSApO1xyXG5cdFx0dGV4dHVyZU5vZGUucmVmZXJlbmNlTm9kZSA9IHRoaXMuZ2V0U2VsZigpO1xyXG5cclxuXHRcdHJldHVybiBub2RlT2JqZWN0KCB0ZXh0dXJlTm9kZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vIC0tXHJcblxyXG5cdHNlcmlhbGl6ZSggZGF0YSApIHtcclxuXHJcblx0XHRzdXBlci5zZXJpYWxpemUoIGRhdGEgKTtcclxuXHJcblx0XHRkYXRhLnZhbHVlID0gdGhpcy52YWx1ZS50b0pTT04oIGRhdGEubWV0YSApLnV1aWQ7XHJcblx0XHRkYXRhLnNhbXBsZXIgPSB0aGlzLnNhbXBsZXI7XHJcblx0XHRkYXRhLnVwZGF0ZU1hdHJpeCA9IHRoaXMudXBkYXRlTWF0cml4O1xyXG5cdFx0ZGF0YS51cGRhdGVUeXBlID0gdGhpcy51cGRhdGVUeXBlO1xyXG5cclxuXHR9XHJcblxyXG5cdGRlc2VyaWFsaXplKCBkYXRhICkge1xyXG5cclxuXHRcdHN1cGVyLmRlc2VyaWFsaXplKCBkYXRhICk7XHJcblxyXG5cdFx0dGhpcy52YWx1ZSA9IGRhdGEubWV0YS50ZXh0dXJlc1sgZGF0YS52YWx1ZSBdO1xyXG5cdFx0dGhpcy5zYW1wbGVyID0gZGF0YS5zYW1wbGVyO1xyXG5cdFx0dGhpcy51cGRhdGVNYXRyaXggPSBkYXRhLnVwZGF0ZU1hdHJpeDtcclxuXHRcdHRoaXMudXBkYXRlVHlwZSA9IGRhdGEudXBkYXRlVHlwZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgdXBkYXRlIGlzIHVzZWQgdG8gaW1wbGVtZW50IHRoZSB1cGRhdGUgb2YgdGhlIHV2IHRyYW5zZm9ybWF0aW9uIG1hdHJpeC5cclxuXHQgKi9cclxuXHR1cGRhdGUoKSB7XHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZSA9IHRoaXMudmFsdWU7XHJcblx0XHRjb25zdCBtYXRyaXhVbmlmb3JtID0gdGhpcy5fbWF0cml4VW5pZm9ybTtcclxuXHJcblx0XHRpZiAoIG1hdHJpeFVuaWZvcm0gIT09IG51bGwgKSBtYXRyaXhVbmlmb3JtLnZhbHVlID0gdGV4dHVyZS5tYXRyaXg7XHJcblxyXG5cdFx0aWYgKCB0ZXh0dXJlLm1hdHJpeEF1dG9VcGRhdGUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHR0ZXh0dXJlLnVwZGF0ZU1hdHJpeCgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDbG9uZXMgdGhlIHRleHR1cmUgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1RleHR1cmVOb2RlfSBUaGUgY2xvbmVkIHRleHR1cmUgbm9kZS5cclxuXHQgKi9cclxuXHRjbG9uZSgpIHtcclxuXHJcblx0XHRjb25zdCBuZXdOb2RlID0gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMudmFsdWUsIHRoaXMudXZOb2RlLCB0aGlzLmxldmVsTm9kZSwgdGhpcy5iaWFzTm9kZSApO1xyXG5cdFx0bmV3Tm9kZS5zYW1wbGVyID0gdGhpcy5zYW1wbGVyO1xyXG5cclxuXHRcdHJldHVybiBuZXdOb2RlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBUZXh0dXJlTm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgdGV4dHVyZSBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge1RleHR1cmV9IHZhbHVlIC0gVGhlIHRleHR1cmUuXHJcbiAqIEBwYXJhbSB7P05vZGU8dmVjMnx2ZWMzPn0gW3V2Tm9kZT1udWxsXSAtIFRoZSB1diBub2RlLlxyXG4gKiBAcGFyYW0gez9Ob2RlPGludD59IFtsZXZlbE5vZGU9bnVsbF0gLSBUaGUgbGV2ZWwgbm9kZS5cclxuICogQHBhcmFtIHs/Tm9kZTxmbG9hdD59IFtiaWFzTm9kZT1udWxsXSAtIFRoZSBiaWFzIG5vZGUuXHJcbiAqIEByZXR1cm5zIHtUZXh0dXJlTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCB0ZXh0dXJlID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIFRleHR1cmVOb2RlICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAxLCA0ICk7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIHRleHR1cmUgbm9kZSB0aGF0IGZldGNoZXMvbG9hZHMgdGV4ZWxzIHdpdGhvdXQgaW50ZXJwb2xhdGlvbi5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtUZXh0dXJlfSB2YWx1ZSAtIFRoZSB0ZXh0dXJlLlxyXG4gKiBAcGFyYW0gez9Ob2RlPHZlYzJ8dmVjMz59IFt1dk5vZGU9bnVsbF0gLSBUaGUgdXYgbm9kZS5cclxuICogQHBhcmFtIHs/Tm9kZTxpbnQ+fSBbbGV2ZWxOb2RlPW51bGxdIC0gVGhlIGxldmVsIG5vZGUuXHJcbiAqIEBwYXJhbSB7P05vZGU8ZmxvYXQ+fSBbYmlhc05vZGU9bnVsbF0gLSBUaGUgYmlhcyBub2RlLlxyXG4gKiBAcmV0dXJucyB7VGV4dHVyZU5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdGV4dHVyZUxvYWQgPSAoIC4uLnBhcmFtcyApID0+IHRleHR1cmUoIC4uLnBhcmFtcyApLnNldFNhbXBsZXIoIGZhbHNlICk7XHJcblxyXG4vL2V4cG9ydCBjb25zdCB0ZXh0dXJlTGV2ZWwgPSAoIHZhbHVlLCB1diwgbGV2ZWwgKSA9PiB0ZXh0dXJlKCB2YWx1ZSwgdXYgKS5sZXZlbCggbGV2ZWwgKTtcclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyBhIHRleHR1cmUgb3IgdGV4dHVyZSBub2RlIHRvIGEgc2FtcGxlci5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtUZXh0dXJlTm9kZXxUZXh0dXJlfSB2YWx1ZSAtIFRoZSB0ZXh0dXJlIG9yIHRleHR1cmUgbm9kZSB0byBjb252ZXJ0LlxyXG4gKiBAcmV0dXJucyB7Tm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBzYW1wbGVyID0gKCB2YWx1ZSApID0+ICggdmFsdWUuaXNOb2RlID09PSB0cnVlID8gdmFsdWUgOiB0ZXh0dXJlKCB2YWx1ZSApICkuY29udmVydCggJ3NhbXBsZXInICk7XHJcblxyXG4vKipcclxuICogQ29udmVydHMgYSB0ZXh0dXJlIG9yIHRleHR1cmUgbm9kZSB0byBhIHNhbXBsZXIgY29tcGFyaXNvbi5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtUZXh0dXJlTm9kZXxUZXh0dXJlfSB2YWx1ZSAtIFRoZSB0ZXh0dXJlIG9yIHRleHR1cmUgbm9kZSB0byBjb252ZXJ0LlxyXG4gKiBAcmV0dXJucyB7Tm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBzYW1wbGVyQ29tcGFyaXNvbiA9ICggdmFsdWUgKSA9PiAoIHZhbHVlLmlzTm9kZSA9PT0gdHJ1ZSA/IHZhbHVlIDogdGV4dHVyZSggdmFsdWUgKSApLmNvbnZlcnQoICdzYW1wbGVyQ29tcGFyaXNvbicgKTtcclxuIiwiaW1wb3J0IFVuaWZvcm1Ob2RlIGZyb20gJy4uL2NvcmUvVW5pZm9ybU5vZGUuanMnO1xyXG5pbXBvcnQgeyBub2RlT2JqZWN0IH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgc3BlY2lhbCB0eXBlIG9mIHVuaWZvcm0gbm9kZSB3aGljaCByZXByZXNlbnRzIGFycmF5LWxpa2UgZGF0YVxyXG4gKiBhcyB1bmlmb3JtIGJ1ZmZlcnMuIFRoZSBhY2Nlc3MgdXN1YWxseSBoYXBwZW5zIHZpYSBgZWxlbWVudCgpYFxyXG4gKiB3aGljaCByZXR1cm5zIGFuIGluc3RhbmNlIG9mIHtAbGluayBBcnJheUVsZW1lbnROb2RlfS4gRm9yIGV4YW1wbGU6XHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGJ1ZmZlck5vZGUgPSBidWZmZXIoIGFycmF5LCAnbWF0NCcsIGNvdW50ICk7XHJcbiAqIGNvbnN0IG1hdHJpeE5vZGUgPSBidWZmZXJOb2RlLmVsZW1lbnQoIGluZGV4ICk7IC8vIGFjY2VzcyBhIG1hdHJpeCBmcm9tIHRoZSBidWZmZXJcclxuICogYGBgXHJcbiAqIEluIGdlbmVyYWwsIGl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgbW9yZSBtYW5hZ2VkIHtAbGluayBVbmlmb3JtQXJyYXlOb2RlfVxyXG4gKiBzaW5jZSBpdCBoYW5kbGVzIG1vcmUgaW5wdXQgdHlwZXMgYW5kIGF1dG9tYXRpY2FsbHkgY2FyZXMgYWJvdXQgYnVmZmVyIHBhZGRpbmdzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgVW5pZm9ybU5vZGVcclxuICovXHJcbmNsYXNzIEJ1ZmZlck5vZGUgZXh0ZW5kcyBVbmlmb3JtTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ0J1ZmZlck5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYnVmZmVyIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IHZhbHVlIC0gQXJyYXktbGlrZSBidWZmZXIgZGF0YS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gYnVmZmVyVHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGJ1ZmZlci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2J1ZmZlckNvdW50PTBdIC0gVGhlIGNvdW50IG9mIGJ1ZmZlciBlbGVtZW50cy5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggdmFsdWUsIGJ1ZmZlclR5cGUsIGJ1ZmZlckNvdW50ID0gMCApIHtcclxuXHJcblx0XHRzdXBlciggdmFsdWUsIGJ1ZmZlclR5cGUgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNCdWZmZXJOb2RlID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGJ1ZmZlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJ1ZmZlclR5cGUgPSBidWZmZXJUeXBlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHVuaWZvcm0gbm9kZSB0aGF0IGhvbGRzIHRoZSB2YWx1ZSBvZiB0aGUgcmVmZXJlbmNlIG5vZGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5idWZmZXJDb3VudCA9IGJ1ZmZlckNvdW50O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGJ1ZmZlciBlbGVtZW50cy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgZWxlbWVudCB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldEVsZW1lbnRUeXBlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmdldE5vZGVUeXBlKCBidWlsZGVyICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogT3ZlcndyaXRlcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byByZXR1cm4gYSBmaXhlZCB2YWx1ZSBgJ2J1ZmZlcidgLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBpbnB1dCB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldElucHV0VHlwZSggLypidWlsZGVyKi8gKSB7XHJcblxyXG5cdFx0cmV0dXJuICdidWZmZXInO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBCdWZmZXJOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSBidWZmZXIgbm9kZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtBcnJheX0gdmFsdWUgLSBBcnJheS1saWtlIGJ1ZmZlciBkYXRhLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgYSBidWZmZXIgZWxlbWVudC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGNvdW50IC0gVGhlIGNvdW50IG9mIGJ1ZmZlciBlbGVtZW50cy5cclxuICogQHJldHVybnMge0J1ZmZlck5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYnVmZmVyID0gKCB2YWx1ZSwgdHlwZSwgY291bnQgKSA9PiBub2RlT2JqZWN0KCBuZXcgQnVmZmVyTm9kZSggdmFsdWUsIHR5cGUsIGNvdW50ICkgKTtcclxuIiwiaW1wb3J0IHsgbm9kZU9iamVjdCB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuaW1wb3J0IHsgTm9kZVVwZGF0ZVR5cGUgfSBmcm9tICcuLi9jb3JlL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IGdldFZhbHVlVHlwZSB9IGZyb20gJy4uL2NvcmUvTm9kZVV0aWxzLmpzJztcclxuaW1wb3J0IEFycmF5RWxlbWVudE5vZGUgZnJvbSAnLi4vdXRpbHMvQXJyYXlFbGVtZW50Tm9kZS5qcyc7XHJcbmltcG9ydCBCdWZmZXJOb2RlIGZyb20gJy4vQnVmZmVyTm9kZS5qcyc7XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyB0aGUgZWxlbWVudCBhY2Nlc3Mgb24gdW5pZm9ybSBhcnJheSBub2Rlcy5cclxuICpcclxuICogQGF1Z21lbnRzIEFycmF5RWxlbWVudE5vZGVcclxuICovXHJcbmNsYXNzIFVuaWZvcm1BcnJheUVsZW1lbnROb2RlIGV4dGVuZHMgQXJyYXlFbGVtZW50Tm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ1VuaWZvcm1BcnJheUVsZW1lbnROb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGJ1ZmZlciBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtVbmlmb3JtQXJyYXlOb2RlfSB1bmlmb3JtQXJyYXlOb2RlIC0gVGhlIHVuaWZvcm0gYXJyYXkgbm9kZSB0byBhY2Nlc3MuXHJcblx0ICogQHBhcmFtIHtJbmRleE5vZGV9IGluZGV4Tm9kZSAtIFRoZSBpbmRleCBkYXRhIHRoYXQgZGVmaW5lIHRoZSBwb3NpdGlvbiBvZiB0aGUgYWNjZXNzZWQgZWxlbWVudCBpbiB0aGUgYXJyYXkuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHVuaWZvcm1BcnJheU5vZGUsIGluZGV4Tm9kZSApIHtcclxuXHJcblx0XHRzdXBlciggdW5pZm9ybUFycmF5Tm9kZSwgaW5kZXhOb2RlICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzQXJyYXlCdWZmZXJFbGVtZW50Tm9kZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0Z2VuZXJhdGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3Qgc25pcHBldCA9IHN1cGVyLmdlbmVyYXRlKCBidWlsZGVyICk7XHJcblx0XHRjb25zdCB0eXBlID0gdGhpcy5nZXROb2RlVHlwZSgpO1xyXG5cdFx0Y29uc3QgcGFkZGVkVHlwZSA9IHRoaXMubm9kZS5nZXRQYWRkZWRUeXBlKCk7XHJcblxyXG5cdFx0cmV0dXJuIGJ1aWxkZXIuZm9ybWF0KCBzbmlwcGV0LCBwYWRkZWRUeXBlLCB0eXBlICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTaW1pbGFyIHRvIHtAbGluayBCdWZmZXJOb2RlfSB0aGlzIG1vZHVsZSByZXByZXNlbnRzIGFycmF5LWxpa2UgZGF0YSBhc1xyXG4gKiB1bmlmb3JtIGJ1ZmZlcnMuIFVubGlrZSB7QGxpbmsgQnVmZmVyTm9kZX0sIGl0IGNhbiBoYW5kbGUgbW9yZSBjb21tb25cclxuICogZGF0YSB0eXBlcyBpbiB0aGUgYXJyYXkgKGUuZyBgdGhyZWUuanNgIHByaW1pdGl2ZXMpIGFuZCBhdXRvbWF0aWNhbGx5XHJcbiAqIG1hbmFnZSBidWZmZXIgcGFkZGluZy4gSXQgc2hvdWxkIGJlIHRoZSBmaXJzdCBjaG9pY2Ugd2hlbiB3b3JraW5nIHdpdGhcclxuICogdW5pZm9ybXMgYnVmZmVycy5cclxuICogYGBganNcclxuICogY29uc3QgdGludENvbG9ycyA9IHVuaWZvcm1BcnJheSggW1xyXG4gKiBcdG5ldyBDb2xvciggMSwgMCwgMCApLFxyXG4gKiBcdG5ldyBDb2xvciggMCwgMSwgMCApLFxyXG4gKiBcdG5ldyBDb2xvciggMCwgMCwgMSApXHJcbiAqIF0sICdjb2xvcicgKTtcclxuICpcclxuICogY29uc3QgcmVkQ29sb3IgPSB0aW50Q29sb3JzLmVsZW1lbnQoIDAgKTtcclxuICpcclxuICogQGF1Z21lbnRzIEJ1ZmZlck5vZGVcclxuICovXHJcbmNsYXNzIFVuaWZvcm1BcnJheU5vZGUgZXh0ZW5kcyBCdWZmZXJOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnVW5pZm9ybUFycmF5Tm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB1bmlmb3JtIGFycmF5IG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PGFueT59IHZhbHVlIC0gQXJyYXkgaG9sZGluZyB0aGUgYnVmZmVyIGRhdGEuXHJcblx0ICogQHBhcmFtIHs/c3RyaW5nfSBbZWxlbWVudFR5cGU9bnVsbF0gLSBUaGUgZGF0YSB0eXBlIG9mIGEgYnVmZmVyIGVsZW1lbnQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHZhbHVlLCBlbGVtZW50VHlwZSA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG51bGwgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFycmF5IGhvbGRpbmcgdGhlIGJ1ZmZlciBkYXRhLiBVbmxpa2Uge0BsaW5rIEJ1ZmZlck5vZGV9LCB0aGUgYXJyYXkgY2FuXHJcblx0XHQgKiBob2xkIG51bWJlciBwcmltaXRpdmVzIGFzIHdlbGwgYXMgdGhyZWUuanMgb2JqZWN0cyBsaWtlIHZlY3RvcnMsIG1hdHJpY2VzXHJcblx0XHQgKiBvciBjb2xvcnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PGFueT59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYXJyYXkgPSB2YWx1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBkYXRhIHR5cGUgb2YgYW4gYXJyYXkgZWxlbWVudC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmVsZW1lbnRUeXBlID0gZWxlbWVudFR5cGUgPT09IG51bGwgPyBnZXRWYWx1ZVR5cGUoIHZhbHVlWyAwIF0gKSA6IGVsZW1lbnRUeXBlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHBhZGRlZCB0eXBlLiBVbmlmb3JtIGJ1ZmZlcnMgbXVzdCBjb25mb3JtIHRvIGEgY2VydGFpbiBidWZmZXIgbGF5b3V0XHJcblx0XHQgKiBzbyBhIHNlcGFyYXRlIHR5cGUgaXMgY29tcHV0ZWQgdG8gZW5zdXJlIGNvcnJlY3QgYnVmZmVyIHNpemUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wYWRkZWRUeXBlID0gdGhpcy5nZXRQYWRkZWRUeXBlKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBPdmVyd3JpdHRlbiBzaW5jZSB1bmlmb3JtIGFycmF5IG5vZGVzIGFyZSB1cGRhdGVkIHBlciByZW5kZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqIEBkZWZhdWx0ICdyZW5kZXInXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXBkYXRlVHlwZSA9IE5vZGVVcGRhdGVUeXBlLlJFTkRFUjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNBcnJheUJ1ZmZlck5vZGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGlzIG92ZXJ3cml0dGVuIHNpbmNlIHRoZSBub2RlIHR5cGUgaXMgaW5mZXJyZWQgZnJvbSB0aGVcclxuXHQgKiB7QGxpbmsgVW5pZm9ybUFycmF5Tm9kZSNwYWRkZWRUeXBlfS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgbm9kZSB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldE5vZGVUeXBlKCAvKmJ1aWxkZXIqLyApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5wYWRkZWRUeXBlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGFycmF5IGVsZW1lbnRzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBlbGVtZW50IHR5cGUuXHJcblx0ICovXHJcblx0Z2V0RWxlbWVudFR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZWxlbWVudFR5cGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgcGFkZGVkIHR5cGUgYmFzZWQgb24gdGhlIGVsZW1lbnQgdHlwZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHBhZGRlZCB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldFBhZGRlZFR5cGUoKSB7XHJcblxyXG5cdFx0Y29uc3QgZWxlbWVudFR5cGUgPSB0aGlzLmVsZW1lbnRUeXBlO1xyXG5cclxuXHRcdGxldCBwYWRkZWRUeXBlID0gJ3ZlYzQnO1xyXG5cclxuXHRcdGlmICggZWxlbWVudFR5cGUgPT09ICdtYXQyJyApIHtcclxuXHJcblx0XHRcdHBhZGRlZFR5cGUgPSAnbWF0Mic7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggL21hdC8udGVzdCggZWxlbWVudFR5cGUgKSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdHBhZGRlZFR5cGUgPSAnbWF0NCc7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggZWxlbWVudFR5cGUuY2hhckF0KCAwICkgPT09ICdpJyApIHtcclxuXHJcblx0XHRcdHBhZGRlZFR5cGUgPSAnaXZlYzQnO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGVsZW1lbnRUeXBlLmNoYXJBdCggMCApID09PSAndScgKSB7XHJcblxyXG5cdFx0XHRwYWRkZWRUeXBlID0gJ3V2ZWM0JztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHBhZGRlZFR5cGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIHVwZGF0ZSBtYWtlcyBzdXJlIHRvIGNvcnJlY3RseSB0cmFuc2ZlciB0aGUgZGF0YSBmcm9tIHRoZSAoY29tcGxleCkgb2JqZWN0c1xyXG5cdCAqIGluIHRoZSBhcnJheSB0byB0aGUgaW50ZXJuYWwsIGNvcnJlY3RseSBwYWRkZWQgdmFsdWUgYnVmZmVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlRnJhbWV9IGZyYW1lIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgbm9kZSBmcmFtZS5cclxuXHQgKi9cclxuXHR1cGRhdGUoIC8qZnJhbWUqLyApIHtcclxuXHJcblx0XHRjb25zdCB7IGFycmF5LCB2YWx1ZSB9ID0gdGhpcztcclxuXHJcblx0XHRjb25zdCBlbGVtZW50VHlwZSA9IHRoaXMuZWxlbWVudFR5cGU7XHJcblxyXG5cdFx0aWYgKCBlbGVtZW50VHlwZSA9PT0gJ2Zsb2F0JyB8fCBlbGVtZW50VHlwZSA9PT0gJ2ludCcgfHwgZWxlbWVudFR5cGUgPT09ICd1aW50JyApIHtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgaW5kZXggPSBpICogNDtcclxuXHJcblx0XHRcdFx0dmFsdWVbIGluZGV4IF0gPSBhcnJheVsgaSBdO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGVsZW1lbnRUeXBlID09PSAnY29sb3InICkge1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBpbmRleCA9IGkgKiA0O1xyXG5cdFx0XHRcdGNvbnN0IHZlY3RvciA9IGFycmF5WyBpIF07XHJcblxyXG5cdFx0XHRcdHZhbHVlWyBpbmRleCBdID0gdmVjdG9yLnI7XHJcblx0XHRcdFx0dmFsdWVbIGluZGV4ICsgMSBdID0gdmVjdG9yLmc7XHJcblx0XHRcdFx0dmFsdWVbIGluZGV4ICsgMiBdID0gdmVjdG9yLmIgfHwgMDtcclxuXHRcdFx0XHQvL3ZhbHVlWyBpbmRleCArIDMgXSA9IHZlY3Rvci5hIHx8IDA7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmICggZWxlbWVudFR5cGUgPT09ICdtYXQyJyApIHtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgaW5kZXggPSBpICogNDtcclxuXHRcdFx0XHRjb25zdCBtYXRyaXggPSBhcnJheVsgaSBdO1xyXG5cclxuXHRcdFx0XHR2YWx1ZVsgaW5kZXggXSA9IG1hdHJpeC5lbGVtZW50c1sgMCBdO1xyXG5cdFx0XHRcdHZhbHVlWyBpbmRleCArIDEgXSA9IG1hdHJpeC5lbGVtZW50c1sgMSBdO1xyXG5cdFx0XHRcdHZhbHVlWyBpbmRleCArIDIgXSA9IG1hdHJpeC5lbGVtZW50c1sgMiBdO1xyXG5cdFx0XHRcdHZhbHVlWyBpbmRleCArIDMgXSA9IG1hdHJpeC5lbGVtZW50c1sgMyBdO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGVsZW1lbnRUeXBlID09PSAnbWF0MycgKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGluZGV4ID0gaSAqIDE2O1xyXG5cdFx0XHRcdGNvbnN0IG1hdHJpeCA9IGFycmF5WyBpIF07XHJcblxyXG5cdFx0XHRcdHZhbHVlWyBpbmRleCBdID0gbWF0cml4LmVsZW1lbnRzWyAwIF07XHJcblx0XHRcdFx0dmFsdWVbIGluZGV4ICsgMSBdID0gbWF0cml4LmVsZW1lbnRzWyAxIF07XHJcblx0XHRcdFx0dmFsdWVbIGluZGV4ICsgMiBdID0gbWF0cml4LmVsZW1lbnRzWyAyIF07XHJcblxyXG5cdFx0XHRcdHZhbHVlWyBpbmRleCArIDQgXSA9IG1hdHJpeC5lbGVtZW50c1sgMyBdO1xyXG5cdFx0XHRcdHZhbHVlWyBpbmRleCArIDUgXSA9IG1hdHJpeC5lbGVtZW50c1sgNCBdO1xyXG5cdFx0XHRcdHZhbHVlWyBpbmRleCArIDYgXSA9IG1hdHJpeC5lbGVtZW50c1sgNSBdO1xyXG5cclxuXHRcdFx0XHR2YWx1ZVsgaW5kZXggKyA4IF0gPSBtYXRyaXguZWxlbWVudHNbIDYgXTtcclxuXHRcdFx0XHR2YWx1ZVsgaW5kZXggKyA5IF0gPSBtYXRyaXguZWxlbWVudHNbIDcgXTtcclxuXHRcdFx0XHR2YWx1ZVsgaW5kZXggKyAxMCBdID0gbWF0cml4LmVsZW1lbnRzWyA4IF07XHJcblxyXG5cdFx0XHRcdHZhbHVlWyBpbmRleCArIDE1IF0gPSAxO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGVsZW1lbnRUeXBlID09PSAnbWF0NCcgKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGluZGV4ID0gaSAqIDE2O1xyXG5cdFx0XHRcdGNvbnN0IG1hdHJpeCA9IGFycmF5WyBpIF07XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IG1hdHJpeC5lbGVtZW50cy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0dmFsdWVbIGluZGV4ICsgaSBdID0gbWF0cml4LmVsZW1lbnRzWyBpIF07XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBpbmRleCA9IGkgKiA0O1xyXG5cdFx0XHRcdGNvbnN0IHZlY3RvciA9IGFycmF5WyBpIF07XHJcblxyXG5cdFx0XHRcdHZhbHVlWyBpbmRleCBdID0gdmVjdG9yLng7XHJcblx0XHRcdFx0dmFsdWVbIGluZGV4ICsgMSBdID0gdmVjdG9yLnk7XHJcblx0XHRcdFx0dmFsdWVbIGluZGV4ICsgMiBdID0gdmVjdG9yLnogfHwgMDtcclxuXHRcdFx0XHR2YWx1ZVsgaW5kZXggKyAzIF0gPSB2ZWN0b3IudyB8fCAwO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJbXBsZW1lbnQgdGhlIHZhbHVlIGJ1ZmZlciBjcmVhdGlvbiBiYXNlZCBvbiB0aGUgYXJyYXkgZGF0YS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7bnVsbH1cclxuXHQgKi9cclxuXHRzZXR1cCggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCBsZW5ndGggPSB0aGlzLmFycmF5Lmxlbmd0aDtcclxuXHRcdGNvbnN0IGVsZW1lbnRUeXBlID0gdGhpcy5lbGVtZW50VHlwZTtcclxuXHJcblx0XHRsZXQgYXJyYXlUeXBlID0gRmxvYXQzMkFycmF5O1xyXG5cclxuXHRcdGNvbnN0IHBhZGRlZFR5cGUgPSB0aGlzLnBhZGRlZFR5cGU7XHJcblx0XHRjb25zdCBwYWRkZWRFbGVtZW50TGVuZ3RoID0gYnVpbGRlci5nZXRUeXBlTGVuZ3RoKCBwYWRkZWRUeXBlICk7XHJcblxyXG5cdFx0aWYgKCBlbGVtZW50VHlwZS5jaGFyQXQoIDAgKSA9PT0gJ2knICkgYXJyYXlUeXBlID0gSW50MzJBcnJheTtcclxuXHRcdGlmICggZWxlbWVudFR5cGUuY2hhckF0KCAwICkgPT09ICd1JyApIGFycmF5VHlwZSA9IFVpbnQzMkFycmF5O1xyXG5cclxuXHRcdHRoaXMudmFsdWUgPSBuZXcgYXJyYXlUeXBlKCBsZW5ndGggKiBwYWRkZWRFbGVtZW50TGVuZ3RoICk7XHJcblx0XHR0aGlzLmJ1ZmZlckNvdW50ID0gbGVuZ3RoO1xyXG5cdFx0dGhpcy5idWZmZXJUeXBlID0gcGFkZGVkVHlwZTtcclxuXHJcblx0XHRyZXR1cm4gc3VwZXIuc2V0dXAoIGJ1aWxkZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBPdmVyd3JpdGVzIHRoZSBkZWZhdWx0IGBlbGVtZW50KClgIG1ldGhvZCB0byBwcm92aWRlIGVsZW1lbnQgYWNjZXNzXHJcblx0ICogYmFzZWQgb24ge0BsaW5rIFVuaWZvcm1BcnJheU5vZGV9LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtJbmRleE5vZGV9IGluZGV4Tm9kZSAtIFRoZSBpbmRleCBub2RlLlxyXG5cdCAqIEByZXR1cm4ge1VuaWZvcm1BcnJheUVsZW1lbnROb2RlfVxyXG5cdCAqL1xyXG5cdGVsZW1lbnQoIGluZGV4Tm9kZSApIHtcclxuXHJcblx0XHRyZXR1cm4gbm9kZU9iamVjdCggbmV3IFVuaWZvcm1BcnJheUVsZW1lbnROb2RlKCB0aGlzLCBub2RlT2JqZWN0KCBpbmRleE5vZGUgKSApICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFVuaWZvcm1BcnJheU5vZGU7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhbiB1bmlmb3JtIGFycmF5IG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7QXJyYXk8YW55Pn0gdmFsdWVzIC0gQXJyYXktbGlrZSBkYXRhLlxyXG4gKiBAcGFyYW0gez9zdHJpbmd9IFtub2RlVHlwZV0gLSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBhcnJheSBlbGVtZW50cy5cclxuICogQHJldHVybnMge1VuaWZvcm1BcnJheU5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdW5pZm9ybUFycmF5ID0gKCB2YWx1ZXMsIG5vZGVUeXBlICkgPT4gbm9kZU9iamVjdCggbmV3IFVuaWZvcm1BcnJheU5vZGUoIHZhbHVlcywgbm9kZVR5cGUgKSApO1xyXG5cclxuLyoqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBkZXByZWNhdGVkIHNpbmNlIHIxNjguIFVzZSB7QGxpbmsgdW5pZm9ybUFycmF5fSBpbnN0ZWFkLlxyXG4gKlxyXG4gKiBAcGFyYW0ge0FycmF5PGFueT59IHZhbHVlcyAtIEFycmF5LWxpa2UgZGF0YS5cclxuICogQHBhcmFtIHtzdHJpbmd9IG5vZGVUeXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUgYXJyYXkgZWxlbWVudHMuXHJcbiAqIEByZXR1cm5zIHtVbmlmb3JtQXJyYXlOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHVuaWZvcm1zID0gKCB2YWx1ZXMsIG5vZGVUeXBlICkgPT4geyAvLyBAZGVwcmVjYXRlZCwgcjE2OFxyXG5cclxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5UU0w6IHVuaWZvcm1zKCkgaGFzIGJlZW4gcmVuYW1lZCB0byB1bmlmb3JtQXJyYXkoKS4nICk7XHJcblx0cmV0dXJuIG5vZGVPYmplY3QoIG5ldyBVbmlmb3JtQXJyYXlOb2RlKCB2YWx1ZXMsIG5vZGVUeXBlICkgKTtcclxuXHJcbn07XHJcbiIsImltcG9ydCB7IHVuaWZvcm0gfSBmcm9tICcuLi9jb3JlL1VuaWZvcm1Ob2RlLmpzJztcclxuaW1wb3J0IHsgcmVuZGVyR3JvdXAsIHNoYXJlZFVuaWZvcm1Hcm91cCB9IGZyb20gJy4uL2NvcmUvVW5pZm9ybUdyb3VwTm9kZS5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBGbiB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuaW1wb3J0IHsgdW5pZm9ybUFycmF5IH0gZnJvbSAnLi9Vbmlmb3JtQXJyYXlOb2RlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgY3VycmVudCBgaW5kZXhgIHZhbHVlIG9mIHRoZSBjYW1lcmEgaWYgdXNlZCBBcnJheUNhbWVyYS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7VW5pZm9ybU5vZGU8dWludD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgY2FtZXJhSW5kZXggPSAvKkBfX1BVUkVfXyovIHVuaWZvcm0oIDAsICd1aW50JyApLnNldEdyb3VwKCBzaGFyZWRVbmlmb3JtR3JvdXAoICdjYW1lcmFJbmRleCcgKSApLnRvVmFyeWluZyggJ3ZfY2FtZXJhSW5kZXgnICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGBuZWFyYCB2YWx1ZSBvZiB0aGUgY2FtZXJhIHVzZWQgZm9yIHRoZSBjdXJyZW50IHJlbmRlci5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7VW5pZm9ybU5vZGU8ZmxvYXQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGNhbWVyYU5lYXIgPSAvKkBfX1BVUkVfXyovIHVuaWZvcm0oICdmbG9hdCcgKS5sYWJlbCggJ2NhbWVyYU5lYXInICkuc2V0R3JvdXAoIHJlbmRlckdyb3VwICkub25SZW5kZXJVcGRhdGUoICggeyBjYW1lcmEgfSApID0+IGNhbWVyYS5uZWFyICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGBmYXJgIHZhbHVlIG9mIHRoZSBjYW1lcmEgdXNlZCBmb3IgdGhlIGN1cnJlbnQgcmVuZGVyLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtVbmlmb3JtTm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgY2FtZXJhRmFyID0gLypAX19QVVJFX18qLyB1bmlmb3JtKCAnZmxvYXQnICkubGFiZWwoICdjYW1lcmFGYXInICkuc2V0R3JvdXAoIHJlbmRlckdyb3VwICkub25SZW5kZXJVcGRhdGUoICggeyBjYW1lcmEgfSApID0+IGNhbWVyYS5mYXIgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgcHJvamVjdGlvbiBtYXRyaXggb2YgdGhlIGNhbWVyYSB1c2VkIGZvciB0aGUgY3VycmVudCByZW5kZXIuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1VuaWZvcm1Ob2RlPG1hdDQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGNhbWVyYVByb2plY3Rpb25NYXRyaXggPSAvKkBfX1BVUkVfXyovICggRm4oICggeyBjYW1lcmEgfSApID0+IHtcclxuXHJcblx0bGV0IGNhbWVyYVByb2plY3Rpb25NYXRyaXg7XHJcblxyXG5cdGlmICggY2FtZXJhLmlzQXJyYXlDYW1lcmEgJiYgY2FtZXJhLmNhbWVyYXMubGVuZ3RoID4gMCApIHtcclxuXHJcblx0XHRjb25zdCBtYXRyaWNlcyA9IFtdO1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IHN1YkNhbWVyYSBvZiBjYW1lcmEuY2FtZXJhcyApIHtcclxuXHJcblx0XHRcdG1hdHJpY2VzLnB1c2goIHN1YkNhbWVyYS5wcm9qZWN0aW9uTWF0cml4ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGNhbWVyYVByb2plY3Rpb25NYXRyaWNlcyA9IHVuaWZvcm1BcnJheSggbWF0cmljZXMgKS5zZXRHcm91cCggcmVuZGVyR3JvdXAgKS5sYWJlbCggJ2NhbWVyYVByb2plY3Rpb25NYXRyaWNlcycgKTtcclxuXHJcblx0XHRjYW1lcmFQcm9qZWN0aW9uTWF0cml4ID0gY2FtZXJhUHJvamVjdGlvbk1hdHJpY2VzLmVsZW1lbnQoIGNhbWVyYUluZGV4ICkudG9WYXIoICdjYW1lcmFQcm9qZWN0aW9uTWF0cml4JyApO1xyXG5cclxuXHR9IGVsc2Uge1xyXG5cclxuXHRcdGNhbWVyYVByb2plY3Rpb25NYXRyaXggPSB1bmlmb3JtKCAnbWF0NCcgKS5sYWJlbCggJ2NhbWVyYVByb2plY3Rpb25NYXRyaXgnICkuc2V0R3JvdXAoIHJlbmRlckdyb3VwICkub25SZW5kZXJVcGRhdGUoICggeyBjYW1lcmEgfSApID0+IGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4ICk7XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIGNhbWVyYVByb2plY3Rpb25NYXRyaXg7XHJcblxyXG59ICkub25jZSgpICkoKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgaW52ZXJzZSBwcm9qZWN0aW9uIG1hdHJpeCBvZiB0aGUgY2FtZXJhIHVzZWQgZm9yIHRoZSBjdXJyZW50IHJlbmRlci5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7VW5pZm9ybU5vZGU8bWF0ND59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgY2FtZXJhUHJvamVjdGlvbk1hdHJpeEludmVyc2UgPSAvKkBfX1BVUkVfXyovIHVuaWZvcm0oICdtYXQ0JyApLmxhYmVsKCAnY2FtZXJhUHJvamVjdGlvbk1hdHJpeEludmVyc2UnICkuc2V0R3JvdXAoIHJlbmRlckdyb3VwICkub25SZW5kZXJVcGRhdGUoICggeyBjYW1lcmEgfSApID0+IGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSB2aWV3IG1hdHJpeCBvZiB0aGUgY2FtZXJhIHVzZWQgZm9yIHRoZSBjdXJyZW50IHJlbmRlci5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7VW5pZm9ybU5vZGU8bWF0ND59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgY2FtZXJhVmlld01hdHJpeCA9IC8qQF9fUFVSRV9fKi8gKCBGbiggKCB7IGNhbWVyYSB9ICkgPT4ge1xyXG5cclxuXHRsZXQgY2FtZXJhVmlld01hdHJpeDtcclxuXHJcblx0aWYgKCBjYW1lcmEuaXNBcnJheUNhbWVyYSAmJiBjYW1lcmEuY2FtZXJhcy5sZW5ndGggPiAwICkge1xyXG5cclxuXHRcdGNvbnN0IG1hdHJpY2VzID0gW107XHJcblxyXG5cdFx0Zm9yICggY29uc3Qgc3ViQ2FtZXJhIG9mIGNhbWVyYS5jYW1lcmFzICkge1xyXG5cclxuXHRcdFx0bWF0cmljZXMucHVzaCggc3ViQ2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBjYW1lcmFWaWV3TWF0cmljZXMgPSB1bmlmb3JtQXJyYXkoIG1hdHJpY2VzICkuc2V0R3JvdXAoIHJlbmRlckdyb3VwICkubGFiZWwoICdjYW1lcmFWaWV3TWF0cmljZXMnICk7XHJcblxyXG5cdFx0Y2FtZXJhVmlld01hdHJpeCA9IGNhbWVyYVZpZXdNYXRyaWNlcy5lbGVtZW50KCBjYW1lcmFJbmRleCApLnRvVmFyKCAnY2FtZXJhVmlld01hdHJpeCcgKTtcclxuXHJcblx0fSBlbHNlIHtcclxuXHJcblx0XHRjYW1lcmFWaWV3TWF0cml4ID0gdW5pZm9ybSggJ21hdDQnICkubGFiZWwoICdjYW1lcmFWaWV3TWF0cml4JyApLnNldEdyb3VwKCByZW5kZXJHcm91cCApLm9uUmVuZGVyVXBkYXRlKCAoIHsgY2FtZXJhIH0gKSA9PiBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlICk7XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIGNhbWVyYVZpZXdNYXRyaXg7XHJcblxyXG59ICkub25jZSgpICkoKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgd29ybGQgbWF0cml4IG9mIHRoZSBjYW1lcmEgdXNlZCBmb3IgdGhlIGN1cnJlbnQgcmVuZGVyLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtVbmlmb3JtTm9kZTxtYXQ0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBjYW1lcmFXb3JsZE1hdHJpeCA9IC8qQF9fUFVSRV9fKi8gdW5pZm9ybSggJ21hdDQnICkubGFiZWwoICdjYW1lcmFXb3JsZE1hdHJpeCcgKS5zZXRHcm91cCggcmVuZGVyR3JvdXAgKS5vblJlbmRlclVwZGF0ZSggKCB7IGNhbWVyYSB9ICkgPT4gY2FtZXJhLm1hdHJpeFdvcmxkICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIG5vcm1hbCBtYXRyaXggb2YgdGhlIGNhbWVyYSB1c2VkIGZvciB0aGUgY3VycmVudCByZW5kZXIuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1VuaWZvcm1Ob2RlPG1hdDM+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGNhbWVyYU5vcm1hbE1hdHJpeCA9IC8qQF9fUFVSRV9fKi8gdW5pZm9ybSggJ21hdDMnICkubGFiZWwoICdjYW1lcmFOb3JtYWxNYXRyaXgnICkuc2V0R3JvdXAoIHJlbmRlckdyb3VwICkub25SZW5kZXJVcGRhdGUoICggeyBjYW1lcmEgfSApID0+IGNhbWVyYS5ub3JtYWxNYXRyaXggKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgcG9zaXRpb24gaW4gd29ybGQgc3BhY2Ugb2YgdGhlIGNhbWVyYSB1c2VkIGZvciB0aGUgY3VycmVudCByZW5kZXIuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1VuaWZvcm1Ob2RlPHZlYzM+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGNhbWVyYVBvc2l0aW9uID0gLypAX19QVVJFX18qLyB1bmlmb3JtKCBuZXcgVmVjdG9yMygpICkubGFiZWwoICdjYW1lcmFQb3NpdGlvbicgKS5zZXRHcm91cCggcmVuZGVyR3JvdXAgKS5vblJlbmRlclVwZGF0ZSggKCB7IGNhbWVyYSB9LCBzZWxmICkgPT4gc2VsZi52YWx1ZS5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGNhbWVyYS5tYXRyaXhXb3JsZCApICk7XHJcbiIsImltcG9ydCBOb2RlIGZyb20gJy4uL2NvcmUvTm9kZS5qcyc7XHJcbmltcG9ydCB7IE5vZGVVcGRhdGVUeXBlIH0gZnJvbSAnLi4vY29yZS9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgVW5pZm9ybU5vZGUgZnJvbSAnLi4vY29yZS9Vbmlmb3JtTm9kZS5qcyc7XHJcbmltcG9ydCB7IG5vZGVQcm94eSB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcbmltcG9ydCB7IFNwaGVyZSB9IGZyb20gJy4uLy4uL21hdGgvU3BoZXJlLmpzJztcclxuXHJcbmNvbnN0IF9zcGhlcmUgPSAvKkBfX1BVUkVfXyovIG5ldyBTcGhlcmUoKTtcclxuXHJcbi8qKlxyXG4gKiBUaGlzIG5vZGUgY2FuIGJlIHVzZWQgdG8gYWNjZXNzIHRyYW5zZm9ybWF0aW9uIHJlbGF0ZWQgbWV0cmljcyBvZiAzRCBvYmplY3RzLlxyXG4gKiBEZXBlbmRpbmcgb24gdGhlIHNlbGVjdGVkIHNjb3BlLCBhIGRpZmZlcmVudCBtZXRyaWMgaXMgcmVwcmVzZW50ZWQgYXMgYSB1bmlmb3JtXHJcbiAqIGluIHRoZSBzaGFkZXIuIFRoZSBmb2xsb3dpbmcgc2NvcGVzIGFyZSBzdXBwb3J0ZWQ6XHJcbiAqXHJcbiAqIC0gYFBPU0lUSU9OYDogVGhlIG9iamVjdCdzIHBvc2l0aW9uIGluIHdvcmxkIHNwYWNlLlxyXG4gKiAtIGBWSUVXX1BPU0lUSU9OYDogVGhlIG9iamVjdCdzIHBvc2l0aW9uIGluIHZpZXcvY2FtZXJhIHNwYWNlLlxyXG4gKiAtIGBESVJFQ1RJT05gOiBUaGUgb2JqZWN0J3MgZGlyZWN0aW9uIGluIHdvcmxkIHNwYWNlLlxyXG4gKiAtIGBTQ0FMRWA6IFRoZSBvYmplY3QncyBzY2FsZSBpbiB3b3JsZCBzcGFjZS5cclxuICogLSBgV09STERfTUFUUklYYDogVGhlIG9iamVjdCdzIG1hdHJpeCBpbiB3b3JsZCBzcGFjZS5cclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVcclxuICovXHJcbmNsYXNzIE9iamVjdDNETm9kZSBleHRlbmRzIE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdPYmplY3QzRE5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgb2JqZWN0IDNEIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geygncG9zaXRpb24nfCd2aWV3UG9zaXRpb24nfCdkaXJlY3Rpb24nfCdzY2FsZSd8J3dvcmxkTWF0cml4Jyl9IHNjb3BlIC0gVGhlIG5vZGUgcmVwcmVzZW50cyBhIGRpZmZlcmVudCB0eXBlIG9mIHRyYW5zZm9ybWF0aW9uIGRlcGVuZGluZyBvbiB0aGUgc2NvcGUuXHJcblx0ICogQHBhcmFtIHs/T2JqZWN0M0R9IFtvYmplY3QzZD1udWxsXSAtIFRoZSAzRCBvYmplY3QuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHNjb3BlLCBvYmplY3QzZCA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBub2RlIHJlcG9ydHMgYSBkaWZmZXJlbnQgdHlwZSBvZiB0cmFuc2Zvcm1hdGlvbiBkZXBlbmRpbmcgb24gdGhlIHNjb3BlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoJ3Bvc2l0aW9uJ3wndmlld1Bvc2l0aW9uJ3wnZGlyZWN0aW9uJ3wnc2NhbGUnfCd3b3JsZE1hdHJpeCcpfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNjb3BlID0gc2NvcGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgM0Qgb2JqZWN0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/T2JqZWN0M0R9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMub2JqZWN0M2QgPSBvYmplY3QzZDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIE92ZXJ3cml0dGVuIHNpbmNlIHRoaXMgdHlwZSBvZiBub2RlIGlzIHVwZGF0ZWQgcGVyIG9iamVjdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICogQGRlZmF1bHQgJ29iamVjdCdcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51cGRhdGVUeXBlID0gTm9kZVVwZGF0ZVR5cGUuT0JKRUNUO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG9sZHMgdGhlIHZhbHVlIG9mIHRoZSBub2RlIGFzIGEgdW5pZm9ybS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge1VuaWZvcm1Ob2RlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl91bmlmb3JtTm9kZSA9IG5ldyBVbmlmb3JtTm9kZSggbnVsbCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE92ZXJ3cml0dGVuIHNpbmNlIHRoZSBub2RlIHR5cGUgaXMgaW5mZXJyZWQgZnJvbSB0aGUgc2NvcGUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBub2RlIHR5cGUuXHJcblx0ICovXHJcblx0Z2V0Tm9kZVR5cGUoKSB7XHJcblxyXG5cdFx0Y29uc3Qgc2NvcGUgPSB0aGlzLnNjb3BlO1xyXG5cclxuXHRcdGlmICggc2NvcGUgPT09IE9iamVjdDNETm9kZS5XT1JMRF9NQVRSSVggKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gJ21hdDQnO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHNjb3BlID09PSBPYmplY3QzRE5vZGUuUE9TSVRJT04gfHwgc2NvcGUgPT09IE9iamVjdDNETm9kZS5WSUVXX1BPU0lUSU9OIHx8IHNjb3BlID09PSBPYmplY3QzRE5vZGUuRElSRUNUSU9OIHx8IHNjb3BlID09PSBPYmplY3QzRE5vZGUuU0NBTEUgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gJ3ZlYzMnO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHNjb3BlID09PSBPYmplY3QzRE5vZGUuUkFESVVTICkge1xyXG5cclxuXHRcdFx0cmV0dXJuICdmbG9hdCc7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIHVuaWZvcm0gdmFsdWUgZGVwZW5kaW5nIG9uIHRoZSBzY29wZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUZyYW1lfSBmcmFtZSAtIFRoZSBjdXJyZW50IG5vZGUgZnJhbWUuXHJcblx0ICovXHJcblx0dXBkYXRlKCBmcmFtZSApIHtcclxuXHJcblx0XHRjb25zdCBvYmplY3QgPSB0aGlzLm9iamVjdDNkO1xyXG5cdFx0Y29uc3QgdW5pZm9ybU5vZGUgPSB0aGlzLl91bmlmb3JtTm9kZTtcclxuXHRcdGNvbnN0IHNjb3BlID0gdGhpcy5zY29wZTtcclxuXHJcblx0XHRpZiAoIHNjb3BlID09PSBPYmplY3QzRE5vZGUuV09STERfTUFUUklYICkge1xyXG5cclxuXHRcdFx0dW5pZm9ybU5vZGUudmFsdWUgPSBvYmplY3QubWF0cml4V29ybGQ7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggc2NvcGUgPT09IE9iamVjdDNETm9kZS5QT1NJVElPTiApIHtcclxuXHJcblx0XHRcdHVuaWZvcm1Ob2RlLnZhbHVlID0gdW5pZm9ybU5vZGUudmFsdWUgfHwgbmV3IFZlY3RvcjMoKTtcclxuXHJcblx0XHRcdHVuaWZvcm1Ob2RlLnZhbHVlLnNldEZyb21NYXRyaXhQb3NpdGlvbiggb2JqZWN0Lm1hdHJpeFdvcmxkICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggc2NvcGUgPT09IE9iamVjdDNETm9kZS5TQ0FMRSApIHtcclxuXHJcblx0XHRcdHVuaWZvcm1Ob2RlLnZhbHVlID0gdW5pZm9ybU5vZGUudmFsdWUgfHwgbmV3IFZlY3RvcjMoKTtcclxuXHJcblx0XHRcdHVuaWZvcm1Ob2RlLnZhbHVlLnNldEZyb21NYXRyaXhTY2FsZSggb2JqZWN0Lm1hdHJpeFdvcmxkICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggc2NvcGUgPT09IE9iamVjdDNETm9kZS5ESVJFQ1RJT04gKSB7XHJcblxyXG5cdFx0XHR1bmlmb3JtTm9kZS52YWx1ZSA9IHVuaWZvcm1Ob2RlLnZhbHVlIHx8IG5ldyBWZWN0b3IzKCk7XHJcblxyXG5cdFx0XHRvYmplY3QuZ2V0V29ybGREaXJlY3Rpb24oIHVuaWZvcm1Ob2RlLnZhbHVlICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggc2NvcGUgPT09IE9iamVjdDNETm9kZS5WSUVXX1BPU0lUSU9OICkge1xyXG5cclxuXHRcdFx0Y29uc3QgY2FtZXJhID0gZnJhbWUuY2FtZXJhO1xyXG5cclxuXHRcdFx0dW5pZm9ybU5vZGUudmFsdWUgPSB1bmlmb3JtTm9kZS52YWx1ZSB8fCBuZXcgVmVjdG9yMygpO1xyXG5cdFx0XHR1bmlmb3JtTm9kZS52YWx1ZS5zZXRGcm9tTWF0cml4UG9zaXRpb24oIG9iamVjdC5tYXRyaXhXb3JsZCApO1xyXG5cclxuXHRcdFx0dW5pZm9ybU5vZGUudmFsdWUuYXBwbHlNYXRyaXg0KCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggc2NvcGUgPT09IE9iamVjdDNETm9kZS5SQURJVVMgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBnZW9tZXRyeSA9IGZyYW1lLm9iamVjdC5nZW9tZXRyeTtcclxuXHJcblx0XHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSBnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcclxuXHJcblx0XHRcdF9zcGhlcmUuY29weSggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgKS5hcHBseU1hdHJpeDQoIG9iamVjdC5tYXRyaXhXb3JsZCApO1xyXG5cclxuXHRcdFx0dW5pZm9ybU5vZGUudmFsdWUgPSBfc3BoZXJlLnJhZGl1cztcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2VuZXJhdGVzIHRoZSBjb2RlIHNuaXBwZXQgb2YgdGhlIHVuaWZvcm0gbm9kZS4gVGhlIG5vZGUgdHlwZSBvZiB0aGUgdW5pZm9ybVxyXG5cdCAqIG5vZGUgYWxzbyBkZXBlbmRzIG9uIHRoZSBzZWxlY3RlZCBzY29wZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgZ2VuZXJhdGVkIGNvZGUgc25pcHBldC5cclxuXHQgKi9cclxuXHRnZW5lcmF0ZSggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCBzY29wZSA9IHRoaXMuc2NvcGU7XHJcblxyXG5cdFx0aWYgKCBzY29wZSA9PT0gT2JqZWN0M0ROb2RlLldPUkxEX01BVFJJWCApIHtcclxuXHJcblx0XHRcdHRoaXMuX3VuaWZvcm1Ob2RlLm5vZGVUeXBlID0gJ21hdDQnO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHNjb3BlID09PSBPYmplY3QzRE5vZGUuUE9TSVRJT04gfHwgc2NvcGUgPT09IE9iamVjdDNETm9kZS5WSUVXX1BPU0lUSU9OIHx8IHNjb3BlID09PSBPYmplY3QzRE5vZGUuRElSRUNUSU9OIHx8IHNjb3BlID09PSBPYmplY3QzRE5vZGUuU0NBTEUgKSB7XHJcblxyXG5cdFx0XHR0aGlzLl91bmlmb3JtTm9kZS5ub2RlVHlwZSA9ICd2ZWMzJztcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBzY29wZSA9PT0gT2JqZWN0M0ROb2RlLlJBRElVUyApIHtcclxuXHJcblx0XHRcdHRoaXMuX3VuaWZvcm1Ob2RlLm5vZGVUeXBlID0gJ2Zsb2F0JztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX3VuaWZvcm1Ob2RlLmJ1aWxkKCBidWlsZGVyICk7XHJcblxyXG5cdH1cclxuXHJcblx0c2VyaWFsaXplKCBkYXRhICkge1xyXG5cclxuXHRcdHN1cGVyLnNlcmlhbGl6ZSggZGF0YSApO1xyXG5cclxuXHRcdGRhdGEuc2NvcGUgPSB0aGlzLnNjb3BlO1xyXG5cclxuXHR9XHJcblxyXG5cdGRlc2VyaWFsaXplKCBkYXRhICkge1xyXG5cclxuXHRcdHN1cGVyLmRlc2VyaWFsaXplKCBkYXRhICk7XHJcblxyXG5cdFx0dGhpcy5zY29wZSA9IGRhdGEuc2NvcGU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbk9iamVjdDNETm9kZS5XT1JMRF9NQVRSSVggPSAnd29ybGRNYXRyaXgnO1xyXG5PYmplY3QzRE5vZGUuUE9TSVRJT04gPSAncG9zaXRpb24nO1xyXG5PYmplY3QzRE5vZGUuU0NBTEUgPSAnc2NhbGUnO1xyXG5PYmplY3QzRE5vZGUuVklFV19QT1NJVElPTiA9ICd2aWV3UG9zaXRpb24nO1xyXG5PYmplY3QzRE5vZGUuRElSRUNUSU9OID0gJ2RpcmVjdGlvbic7XHJcbk9iamVjdDNETm9kZS5SQURJVVMgPSAncmFkaXVzJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IE9iamVjdDNETm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGFuIG9iamVjdCAzRCBub2RlIHRoYXQgcmVwcmVzZW50cyB0aGUgb2JqZWN0J3MgZGlyZWN0aW9uIGluIHdvcmxkIHNwYWNlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0gez9PYmplY3QzRH0gW29iamVjdDNkXSAtIFRoZSAzRCBvYmplY3QuXHJcbiAqIEByZXR1cm5zIHtPYmplY3QzRE5vZGU8dmVjMz59XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgb2JqZWN0RGlyZWN0aW9uID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE9iamVjdDNETm9kZSwgT2JqZWN0M0ROb2RlLkRJUkVDVElPTiApLnNldFBhcmFtZXRlckxlbmd0aCggMSApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYW4gb2JqZWN0IDNEIG5vZGUgdGhhdCByZXByZXNlbnRzIHRoZSBvYmplY3QncyB3b3JsZCBtYXRyaXguXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7P09iamVjdDNEfSBbb2JqZWN0M2RdIC0gVGhlIDNEIG9iamVjdC5cclxuICogQHJldHVybnMge09iamVjdDNETm9kZTxtYXQ0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBvYmplY3RXb3JsZE1hdHJpeCA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBPYmplY3QzRE5vZGUsIE9iamVjdDNETm9kZS5XT1JMRF9NQVRSSVggKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDEgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGFuIG9iamVjdCAzRCBub2RlIHRoYXQgcmVwcmVzZW50cyB0aGUgb2JqZWN0J3MgcG9zaXRpb24gaW4gd29ybGQgc3BhY2UuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7P09iamVjdDNEfSBbb2JqZWN0M2RdIC0gVGhlIDNEIG9iamVjdC5cclxuICogQHJldHVybnMge09iamVjdDNETm9kZTx2ZWMzPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBvYmplY3RQb3NpdGlvbiA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBPYmplY3QzRE5vZGUsIE9iamVjdDNETm9kZS5QT1NJVElPTiApLnNldFBhcmFtZXRlckxlbmd0aCggMSApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYW4gb2JqZWN0IDNEIG5vZGUgdGhhdCByZXByZXNlbnRzIHRoZSBvYmplY3QncyBzY2FsZSBpbiB3b3JsZCBzcGFjZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHs/T2JqZWN0M0R9IFtvYmplY3QzZF0gLSBUaGUgM0Qgb2JqZWN0LlxyXG4gKiBAcmV0dXJucyB7T2JqZWN0M0ROb2RlPHZlYzM+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG9iamVjdFNjYWxlID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE9iamVjdDNETm9kZSwgT2JqZWN0M0ROb2RlLlNDQUxFICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAxICk7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhbiBvYmplY3QgM0Qgbm9kZSB0aGF0IHJlcHJlc2VudHMgdGhlIG9iamVjdCdzIHBvc2l0aW9uIGluIHZpZXcvY2FtZXJhIHNwYWNlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0gez9PYmplY3QzRH0gW29iamVjdDNkXSAtIFRoZSAzRCBvYmplY3QuXHJcbiAqIEByZXR1cm5zIHtPYmplY3QzRE5vZGU8dmVjMz59XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgb2JqZWN0Vmlld1Bvc2l0aW9uID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE9iamVjdDNETm9kZSwgT2JqZWN0M0ROb2RlLlZJRVdfUE9TSVRJT04gKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDEgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGFuIG9iamVjdCAzRCBub2RlIHRoYXQgcmVwcmVzZW50cyB0aGUgb2JqZWN0J3MgcmFkaXVzLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0gez9PYmplY3QzRH0gW29iamVjdDNkXSAtIFRoZSAzRCBvYmplY3QuXHJcbiAqIEByZXR1cm5zIHtPYmplY3QzRE5vZGU8dmVjMz59XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgb2JqZWN0UmFkaXVzID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE9iamVjdDNETm9kZSwgT2JqZWN0M0ROb2RlLlJBRElVUyApLnNldFBhcmFtZXRlckxlbmd0aCggMSApO1xyXG4iLCJpbXBvcnQgT2JqZWN0M0ROb2RlIGZyb20gJy4vT2JqZWN0M0ROb2RlLmpzJztcclxuaW1wb3J0IHsgRm4sIG5vZGVJbW11dGFibGUgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcbmltcG9ydCB7IHVuaWZvcm0gfSBmcm9tICcuLi9jb3JlL1VuaWZvcm1Ob2RlLmpzJztcclxuXHJcbmltcG9ydCB7IE1hdHJpeDQgfSBmcm9tICcuLi8uLi9tYXRoL01hdHJpeDQuanMnO1xyXG5pbXBvcnQgeyBjYW1lcmFWaWV3TWF0cml4IH0gZnJvbSAnLi9DYW1lcmEuanMnO1xyXG5pbXBvcnQgeyBNYXRyaXgzIH0gZnJvbSAnLi4vLi4vbWF0aC9NYXRyaXgzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIHR5cGUgb2Ygbm9kZSBpcyBhIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYE9iamVjdDNETm9kZWBcclxuICogd2l0aCBsYXJnZXIgc2V0IG9mIG1vZGVsIHJlbGF0ZWQgbWV0cmljcy4gVW5saWtlIGBPYmplY3QzRE5vZGVgLFxyXG4gKiBgTW9kZWxOb2RlYCBleHRyYWN0cyB0aGUgcmVmZXJlbmNlIHRvIHRoZSAzRCBvYmplY3QgZnJvbSB0aGVcclxuICogY3VycmVudCBub2RlIGZyYW1lIHN0YXRlLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgT2JqZWN0M0ROb2RlXHJcbiAqL1xyXG5jbGFzcyBNb2RlbE5vZGUgZXh0ZW5kcyBPYmplY3QzRE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdNb2RlbE5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgb2JqZWN0IG1vZGVsIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geygncG9zaXRpb24nfCd2aWV3UG9zaXRpb24nfCdkaXJlY3Rpb24nfCdzY2FsZSd8J3dvcmxkTWF0cml4Jyl9IHNjb3BlIC0gVGhlIG5vZGUgcmVwcmVzZW50cyBhIGRpZmZlcmVudCB0eXBlIG9mIHRyYW5zZm9ybWF0aW9uIGRlcGVuZGluZyBvbiB0aGUgc2NvcGUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHNjb3BlICkge1xyXG5cclxuXHRcdHN1cGVyKCBzY29wZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEV4dHJhY3RzIHRoZSBtb2RlbCByZWZlcmVuY2UgZnJvbSB0aGUgZnJhbWUgc3RhdGUgYW5kIHRoZW5cclxuXHQgKiB1cGRhdGVzIHRoZSB1bmlmb3JtIHZhbHVlIGRlcGVuZGluZyBvbiB0aGUgc2NvcGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVGcmFtZX0gZnJhbWUgLSBUaGUgY3VycmVudCBub2RlIGZyYW1lLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZSggZnJhbWUgKSB7XHJcblxyXG5cdFx0dGhpcy5vYmplY3QzZCA9IGZyYW1lLm9iamVjdDtcclxuXHJcblx0XHRzdXBlci51cGRhdGUoIGZyYW1lICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IE1vZGVsTm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgb2JqZWN0J3MgZGlyZWN0aW9uIGluIHdvcmxkIHNwYWNlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtNb2RlbE5vZGU8dmVjMz59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbW9kZWxEaXJlY3Rpb24gPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIE1vZGVsTm9kZSwgTW9kZWxOb2RlLkRJUkVDVElPTiApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBvYmplY3QncyB3b3JsZCBtYXRyaXguXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge01vZGVsTm9kZTxtYXQ0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBtb2RlbFdvcmxkTWF0cml4ID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBNb2RlbE5vZGUsIE1vZGVsTm9kZS5XT1JMRF9NQVRSSVggKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgb2JqZWN0J3MgcG9zaXRpb24gaW4gd29ybGQgc3BhY2UuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge01vZGVsTm9kZTx2ZWMzPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBtb2RlbFBvc2l0aW9uID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBNb2RlbE5vZGUsIE1vZGVsTm9kZS5QT1NJVElPTiApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBvYmplY3QncyBzY2FsZSBpbiB3b3JsZCBzcGFjZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7TW9kZWxOb2RlPHZlYzM+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG1vZGVsU2NhbGUgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIE1vZGVsTm9kZSwgTW9kZWxOb2RlLlNDQUxFICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIG9iamVjdCdzIHBvc2l0aW9uIGluIHZpZXcvY2FtZXJhIHNwYWNlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtNb2RlbE5vZGU8dmVjMz59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbW9kZWxWaWV3UG9zaXRpb24gPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIE1vZGVsTm9kZSwgTW9kZWxOb2RlLlZJRVdfUE9TSVRJT04gKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgb2JqZWN0J3MgcmFkaXVzLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtNb2RlbE5vZGU8ZmxvYXQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG1vZGVsUmFkaXVzID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBNb2RlbE5vZGUsIE1vZGVsTm9kZS5SQURJVVMgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgb2JqZWN0J3Mgbm9ybWFsIG1hdHJpeC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7VW5pZm9ybU5vZGU8bWF0Mz59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbW9kZWxOb3JtYWxNYXRyaXggPSAvKkBfX1BVUkVfXyovIHVuaWZvcm0oIG5ldyBNYXRyaXgzKCkgKS5vbk9iamVjdFVwZGF0ZSggKCB7IG9iamVjdCB9LCBzZWxmICkgPT4gc2VsZi52YWx1ZS5nZXROb3JtYWxNYXRyaXgoIG9iamVjdC5tYXRyaXhXb3JsZCApICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIG9iamVjdCdzIGludmVyc2Ugd29ybGQgbWF0cml4LlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtVbmlmb3JtTm9kZTxtYXQ0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBtb2RlbFdvcmxkTWF0cml4SW52ZXJzZSA9IC8qQF9fUFVSRV9fKi8gdW5pZm9ybSggbmV3IE1hdHJpeDQoKSApLm9uT2JqZWN0VXBkYXRlKCAoIHsgb2JqZWN0IH0sIHNlbGYgKSA9PiBzZWxmLnZhbHVlLmNvcHkoIG9iamVjdC5tYXRyaXhXb3JsZCApLmludmVydCgpICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIG9iamVjdCdzIG1vZGVsIHZpZXcgbWF0cml4LlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtOb2RlPG1hdDQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG1vZGVsVmlld01hdHJpeCA9IC8qQF9fUFVSRV9fKi8gKCBGbiggKCBidWlsZGVyICkgPT4ge1xyXG5cclxuXHRyZXR1cm4gYnVpbGRlci5yZW5kZXJlci5ub2Rlcy5tb2RlbFZpZXdNYXRyaXggfHwgbWVkaXVtcE1vZGVsVmlld01hdHJpeDtcclxuXHJcbn0gKS5vbmNlKCkgKSgpLnRvVmFyKCAnbW9kZWxWaWV3TWF0cml4JyApO1xyXG5cclxuLy8gR1BVIFByZWNpc2lvblxyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBvYmplY3QncyBtb2RlbCB2aWV3IGluIGBtZWRpdW1wYCBwcmVjaXNpb24uXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8bWF0ND59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbWVkaXVtcE1vZGVsVmlld01hdHJpeCA9IC8qQF9fUFVSRV9fKi8gY2FtZXJhVmlld01hdHJpeC5tdWwoIG1vZGVsV29ybGRNYXRyaXggKTtcclxuXHJcbi8vIENQVSBQcmVjaXNpb25cclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgb2JqZWN0J3MgbW9kZWwgdmlldyBpbiBgaGlnaHBgIHByZWNpc2lvblxyXG4gKiB3aGljaCBpcyBhY2hpZXZlZCBieSBjb21wdXRpbmcgdGhlIG1hdHJpeCBpbiBKUyBhbmQgbm90IGluIHRoZSBzaGFkZXIuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8bWF0ND59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgaGlnaHBNb2RlbFZpZXdNYXRyaXggPSAvKkBfX1BVUkVfXyovICggRm4oICggYnVpbGRlciApID0+IHtcclxuXHJcblx0YnVpbGRlci5jb250ZXh0LmlzSGlnaFByZWNpc2lvbk1vZGVsVmlld01hdHJpeCA9IHRydWU7XHJcblxyXG5cdHJldHVybiB1bmlmb3JtKCAnbWF0NCcgKS5vbk9iamVjdFVwZGF0ZSggKCB7IG9iamVjdCwgY2FtZXJhIH0gKSA9PiB7XHJcblxyXG5cdFx0cmV0dXJuIG9iamVjdC5tb2RlbFZpZXdNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSwgb2JqZWN0Lm1hdHJpeFdvcmxkICk7XHJcblxyXG5cdH0gKTtcclxuXHJcbn0gKS5vbmNlKCkgKSgpLnRvVmFyKCAnaGlnaHBNb2RlbFZpZXdNYXRyaXgnICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIG9iamVjdCdzIG1vZGVsIG5vcm1hbCB2aWV3IGluIGBoaWdocGAgcHJlY2lzaW9uXHJcbiAqIHdoaWNoIGlzIGFjaGlldmVkIGJ5IGNvbXB1dGluZyB0aGUgbWF0cml4IGluIEpTIGFuZCBub3QgaW4gdGhlIHNoYWRlci5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTxtYXQzPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBoaWdocE1vZGVsTm9ybWFsVmlld01hdHJpeCA9IC8qQF9fUFVSRV9fKi8gKCBGbiggKCBidWlsZGVyICkgPT4ge1xyXG5cclxuXHRjb25zdCBpc0hpZ2hQcmVjaXNpb25Nb2RlbFZpZXdNYXRyaXggPSBidWlsZGVyLmNvbnRleHQuaXNIaWdoUHJlY2lzaW9uTW9kZWxWaWV3TWF0cml4O1xyXG5cclxuXHRyZXR1cm4gdW5pZm9ybSggJ21hdDMnICkub25PYmplY3RVcGRhdGUoICggeyBvYmplY3QsIGNhbWVyYSB9ICkgPT4ge1xyXG5cclxuXHRcdGlmICggaXNIaWdoUHJlY2lzaW9uTW9kZWxWaWV3TWF0cml4ICE9PSB0cnVlICkge1xyXG5cclxuXHRcdFx0b2JqZWN0Lm1vZGVsVmlld01hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlLCBvYmplY3QubWF0cml4V29ybGQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG9iamVjdC5ub3JtYWxNYXRyaXguZ2V0Tm9ybWFsTWF0cml4KCBvYmplY3QubW9kZWxWaWV3TWF0cml4ICk7XHJcblxyXG5cdH0gKTtcclxuXHJcbn0gKS5vbmNlKCkgKSgpLnRvVmFyKCAnaGlnaHBNb2RlbE5vcm1hbFZpZXdNYXRyaXgnICk7XHJcbiIsImltcG9ydCB7IGF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvQXR0cmlidXRlTm9kZS5qcyc7XHJcbmltcG9ydCB7IEZuIH0gZnJvbSAnLi4vdHNsL1RTTENvcmUuanMnO1xyXG5pbXBvcnQgeyBtb2RlbFdvcmxkTWF0cml4IH0gZnJvbSAnLi9Nb2RlbE5vZGUuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBwb3NpdGlvbiBhdHRyaWJ1dGUgb2YgdGhlIGN1cnJlbnQgcmVuZGVyZWQgb2JqZWN0LlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtBdHRyaWJ1dGVOb2RlPHZlYzM+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHBvc2l0aW9uR2VvbWV0cnkgPSAvKkBfX1BVUkVfXyovIGF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgJ3ZlYzMnICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHZlcnRleCBwb3NpdGlvbiBpbiBsb2NhbCBzcGFjZSBvZiB0aGUgY3VycmVudCByZW5kZXJlZCBvYmplY3QuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge0F0dHJpYnV0ZU5vZGU8dmVjMz59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcG9zaXRpb25Mb2NhbCA9IC8qQF9fUFVSRV9fKi8gcG9zaXRpb25HZW9tZXRyeS50b1ZhcnlpbmcoICdwb3NpdGlvbkxvY2FsJyApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBwcmV2aW91cyB2ZXJ0ZXggcG9zaXRpb24gaW4gbG9jYWwgc3BhY2Ugb2YgdGhlIGN1cnJlbnQgcmVuZGVyZWQgb2JqZWN0LlxyXG4gKiBVc2VkIGluIGNvbnRleHQgb2Yge0BsaW5rIFZlbG9jaXR5Tm9kZX0gZm9yIHJlbmRlcmluZyBtb3Rpb24gdmVjdG9ycy5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7QXR0cmlidXRlTm9kZTx2ZWMzPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBwb3NpdGlvblByZXZpb3VzID0gLypAX19QVVJFX18qLyBwb3NpdGlvbkdlb21ldHJ5LnRvVmFyeWluZyggJ3Bvc2l0aW9uUHJldmlvdXMnICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHZlcnRleCBwb3NpdGlvbiBpbiB3b3JsZCBzcGFjZSBvZiB0aGUgY3VycmVudCByZW5kZXJlZCBvYmplY3QuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1ZhcnlpbmdOb2RlPHZlYzM+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHBvc2l0aW9uV29ybGQgPSAvKkBfX1BVUkVfXyovIG1vZGVsV29ybGRNYXRyaXgubXVsKCBwb3NpdGlvbkxvY2FsICkueHl6LnRvVmFyeWluZyggJ3ZfcG9zaXRpb25Xb3JsZCcgKS5jb250ZXh0KCB7IG5lZWRzUG9zaXRpb25SZWFzc2lnbjogdHJ1ZSB9ICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHBvc2l0aW9uIHdvcmxkIGRpcmVjdGlvbiBvZiB0aGUgY3VycmVudCByZW5kZXJlZCBvYmplY3QuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8dmVjMz59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcG9zaXRpb25Xb3JsZERpcmVjdGlvbiA9IC8qQF9fUFVSRV9fKi8gcG9zaXRpb25Mb2NhbC50cmFuc2Zvcm1EaXJlY3Rpb24oIG1vZGVsV29ybGRNYXRyaXggKS50b1ZhcnlpbmcoICd2X3Bvc2l0aW9uV29ybGREaXJlY3Rpb24nICkubm9ybWFsaXplKCkudG9WYXIoICdwb3NpdGlvbldvcmxkRGlyZWN0aW9uJyApLmNvbnRleHQoIHsgbmVlZHNQb3NpdGlvblJlYXNzaWduOiB0cnVlIH0gKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgdmVydGV4IHBvc2l0aW9uIGluIHZpZXcgc3BhY2Ugb2YgdGhlIGN1cnJlbnQgcmVuZGVyZWQgb2JqZWN0LlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtWYXJ5aW5nTm9kZTx2ZWMzPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBwb3NpdGlvblZpZXcgPSAvKkBfX1BVUkVfXyovICggRm4oICggYnVpbGRlciApID0+IHtcclxuXHJcblx0cmV0dXJuIGJ1aWxkZXIuY29udGV4dC5zZXR1cFBvc2l0aW9uVmlldygpO1xyXG5cclxufSwgJ3ZlYzMnICkub25jZSgpICkoKS50b1ZhcnlpbmcoICd2X3Bvc2l0aW9uVmlldycgKS5jb250ZXh0KCB7IG5lZWRzUG9zaXRpb25SZWFzc2lnbjogdHJ1ZSB9ICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHBvc2l0aW9uIHZpZXcgZGlyZWN0aW9uIG9mIHRoZSBjdXJyZW50IHJlbmRlcmVkIG9iamVjdC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7VmFyeWluZ05vZGU8dmVjMz59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcG9zaXRpb25WaWV3RGlyZWN0aW9uID0gLypAX19QVVJFX18qLyBwb3NpdGlvblZpZXcubmVnYXRlKCkudG9WYXJ5aW5nKCAndl9wb3NpdGlvblZpZXdEaXJlY3Rpb24nICkubm9ybWFsaXplKCkudG9WYXIoICdwb3NpdGlvblZpZXdEaXJlY3Rpb24nICk7XHJcbiIsImltcG9ydCBOb2RlIGZyb20gJy4uL2NvcmUvTm9kZS5qcyc7XHJcbmltcG9ydCB7IG5vZGVJbW11dGFibGUsIGZsb2F0IH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5cclxuaW1wb3J0IHsgQmFja1NpZGUsIFdlYkdMQ29vcmRpbmF0ZVN5c3RlbSB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBub2RlIGNhbiBiZSB1c2VkIHRvIGV2YWx1YXRlIHdoZXRoZXIgYSBwcmltaXRpdmUgaXMgZnJvbnQgb3IgYmFjayBmYWNpbmcuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBOb2RlXHJcbiAqL1xyXG5jbGFzcyBGcm9udEZhY2luZ05vZGUgZXh0ZW5kcyBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnRnJvbnRGYWNpbmdOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGZyb250IGZhY2luZyBub2RlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cclxuXHRcdHN1cGVyKCAnYm9vbCcgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNGcm9udEZhY2luZ05vZGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdGdlbmVyYXRlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IHsgcmVuZGVyZXIsIG1hdGVyaWFsIH0gPSBidWlsZGVyO1xyXG5cclxuXHRcdGlmICggcmVuZGVyZXIuY29vcmRpbmF0ZVN5c3RlbSA9PT0gV2ViR0xDb29yZGluYXRlU3lzdGVtICkge1xyXG5cclxuXHRcdFx0aWYgKCBtYXRlcmlhbC5zaWRlID09PSBCYWNrU2lkZSApIHtcclxuXHJcblx0XHRcdFx0cmV0dXJuICdmYWxzZSc7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBidWlsZGVyLmdldEZyb250RmFjaW5nKCk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEZyb250RmFjaW5nTm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB3aGV0aGVyIGEgcHJpbWl0aXZlIGlzIGZyb250IG9yIGJhY2sgZmFjaW5nXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge0Zyb250RmFjaW5nTm9kZTxib29sPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBmcm9udEZhY2luZyA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggRnJvbnRGYWNpbmdOb2RlICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGZyb250IGZhY2luZyBzdGF0dXMgYXMgYSBudW1iZXIgaW5zdGVhZCBvZiBhIGJvb2wuXHJcbiAqIGAxYCBtZWFucyBmcm9udCBmYWNpbmcsIGAtMWAgbWVhbnMgYmFjayBmYWNpbmcuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8ZmxvYXQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGZhY2VEaXJlY3Rpb24gPSAvKkBfX1BVUkVfXyovIGZsb2F0KCBmcm9udEZhY2luZyApLm11bCggMi4wICkuc3ViKCAxLjAgKTtcclxuIiwiaW1wb3J0IHsgYXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9BdHRyaWJ1dGVOb2RlLmpzJztcclxuaW1wb3J0IHsgY2FtZXJhVmlld01hdHJpeCB9IGZyb20gJy4vQ2FtZXJhLmpzJztcclxuaW1wb3J0IHsgbW9kZWxOb3JtYWxNYXRyaXgsIG1vZGVsV29ybGRNYXRyaXggfSBmcm9tICcuL01vZGVsTm9kZS5qcyc7XHJcbmltcG9ydCB7IG1hdDMsIHZlYzMsIEZuLCB2YXJ5aW5nIH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5pbXBvcnQgeyBwb3NpdGlvblZpZXcgfSBmcm9tICcuL1Bvc2l0aW9uLmpzJztcclxuaW1wb3J0IHsgZmFjZURpcmVjdGlvbiB9IGZyb20gJy4uL2Rpc3BsYXkvRnJvbnRGYWNpbmdOb2RlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgbm9ybWFsIGF0dHJpYnV0ZSBvZiB0aGUgY3VycmVudCByZW5kZXJlZCBvYmplY3QuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8dmVjMz59XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgbm9ybWFsR2VvbWV0cnkgPSAvKkBfX1BVUkVfXyovIGF0dHJpYnV0ZSggJ25vcm1hbCcsICd2ZWMzJyApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSB2ZXJ0ZXggbm9ybWFsIGluIGxvY2FsIHNwYWNlIG9mIHRoZSBjdXJyZW50IHJlbmRlcmVkIG9iamVjdC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTx2ZWMzPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBub3JtYWxMb2NhbCA9IC8qQF9fUFVSRV9fKi8gKCBGbiggKCBidWlsZGVyICkgPT4ge1xyXG5cclxuXHRpZiAoIGJ1aWxkZXIuZ2VvbWV0cnkuaGFzQXR0cmlidXRlKCAnbm9ybWFsJyApID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5UU0w6IFZlcnRleCBhdHRyaWJ1dGUgXCJub3JtYWxcIiBub3QgZm91bmQgb24gZ2VvbWV0cnkuJyApO1xyXG5cclxuXHRcdHJldHVybiB2ZWMzKCAwLCAxLCAwICk7XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIG5vcm1hbEdlb21ldHJ5O1xyXG5cclxufSwgJ3ZlYzMnICkub25jZSgpICkoKS50b1ZhciggJ25vcm1hbExvY2FsJyApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBmbGF0IHZlcnRleCBub3JtYWwgaW4gdmlldyBzcGFjZSBvZiB0aGUgY3VycmVudCByZW5kZXJlZCBvYmplY3QuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8dmVjMz59XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgbm9ybWFsRmxhdCA9IC8qQF9fUFVSRV9fKi8gcG9zaXRpb25WaWV3LmRGZHgoKS5jcm9zcyggcG9zaXRpb25WaWV3LmRGZHkoKSApLm5vcm1hbGl6ZSgpLnRvVmFyKCAnbm9ybWFsRmxhdCcgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgdmVydGV4IG5vcm1hbCBpbiB2aWV3IHNwYWNlIG9mIHRoZSBjdXJyZW50IHJlbmRlcmVkIG9iamVjdC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTx2ZWMzPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBub3JtYWxWaWV3ID0gLypAX19QVVJFX18qLyAoIEZuKCAoIGJ1aWxkZXIgKSA9PiB7XHJcblxyXG5cdGxldCBub2RlO1xyXG5cclxuXHRpZiAoIGJ1aWxkZXIubWF0ZXJpYWwuZmxhdFNoYWRpbmcgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0bm9kZSA9IG5vcm1hbEZsYXQ7XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0bm9kZSA9IHZhcnlpbmcoIHRyYW5zZm9ybU5vcm1hbFRvVmlldyggbm9ybWFsTG9jYWwgKSwgJ3Zfbm9ybWFsVmlldycgKS5ub3JtYWxpemUoKTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gbm9kZTtcclxuXHJcbn0sICd2ZWMzJyApLm9uY2UoKSApKCkudG9WYXIoICdub3JtYWxWaWV3JyApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSB2ZXJ0ZXggbm9ybWFsIGluIHdvcmxkIHNwYWNlIG9mIHRoZSBjdXJyZW50IHJlbmRlcmVkIG9iamVjdC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTx2ZWMzPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBub3JtYWxXb3JsZCA9IC8qQF9fUFVSRV9fKi8gdmFyeWluZyggbm9ybWFsVmlldy50cmFuc2Zvcm1EaXJlY3Rpb24oIGNhbWVyYVZpZXdNYXRyaXggKSwgJ3Zfbm9ybWFsV29ybGQnICkubm9ybWFsaXplKCkudG9WYXIoICdub3JtYWxXb3JsZCcgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgdHJhbnNmb3JtZWQgdmVydGV4IG5vcm1hbCBpbiB2aWV3IHNwYWNlIG9mIHRoZSBjdXJyZW50IHJlbmRlcmVkIG9iamVjdC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTx2ZWMzPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCB0cmFuc2Zvcm1lZE5vcm1hbFZpZXcgPSAvKkBfX1BVUkVfXyovICggRm4oICggYnVpbGRlciApID0+IHtcclxuXHJcblx0Ly8gVXNlIGdldFVWIGNvbnRleHQgdG8gYXZvaWQgc2lkZSBlZmZlY3RzIGZyb20gbm9kZXMgb3ZlcndyaXRpbmcgZ2V0VVYgaW4gdGhlIGNvbnRleHQgKGUuZy4gRW52aXJvbm1lbnROb2RlKVxyXG5cclxuXHRyZXR1cm4gYnVpbGRlci5jb250ZXh0LnNldHVwTm9ybWFsKCkuY29udGV4dCggeyBnZXRVVjogbnVsbCB9ICk7XHJcblxyXG59LCAndmVjMycgKS5vbmNlKCkgKSgpLm11bCggZmFjZURpcmVjdGlvbiApLnRvVmFyKCAndHJhbnNmb3JtZWROb3JtYWxWaWV3JyApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSB0cmFuc2Zvcm1lZCB2ZXJ0ZXggbm9ybWFsIGluIHdvcmxkIHNwYWNlIG9mIHRoZSBjdXJyZW50IHJlbmRlcmVkIG9iamVjdC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTx2ZWMzPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCB0cmFuc2Zvcm1lZE5vcm1hbFdvcmxkID0gLypAX19QVVJFX18qLyB0cmFuc2Zvcm1lZE5vcm1hbFZpZXcudHJhbnNmb3JtRGlyZWN0aW9uKCBjYW1lcmFWaWV3TWF0cml4ICkudG9WYXIoICd0cmFuc2Zvcm1lZE5vcm1hbFdvcmxkJyApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSB0cmFuc2Zvcm1lZCBjbGVhcmNvYXQgdmVydGV4IG5vcm1hbCBpbiB2aWV3IHNwYWNlIG9mIHRoZSBjdXJyZW50IHJlbmRlcmVkIG9iamVjdC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTx2ZWMzPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCB0cmFuc2Zvcm1lZENsZWFyY29hdE5vcm1hbFZpZXcgPSAvKkBfX1BVUkVfXyovICggRm4oICggYnVpbGRlciApID0+IHtcclxuXHJcblx0Ly8gVXNlIGdldFVWIGNvbnRleHQgdG8gYXZvaWQgc2lkZSBlZmZlY3RzIGZyb20gbm9kZXMgb3ZlcndyaXRpbmcgZ2V0VVYgaW4gdGhlIGNvbnRleHQgKGUuZy4gRW52aXJvbm1lbnROb2RlKVxyXG5cclxuXHRyZXR1cm4gYnVpbGRlci5jb250ZXh0LnNldHVwQ2xlYXJjb2F0Tm9ybWFsKCkuY29udGV4dCggeyBnZXRVVjogbnVsbCB9ICk7XHJcblxyXG59LCAndmVjMycgKS5vbmNlKCkgKSgpLm11bCggZmFjZURpcmVjdGlvbiApLnRvVmFyKCAndHJhbnNmb3JtZWRDbGVhcmNvYXROb3JtYWxWaWV3JyApO1xyXG5cclxuLyoqXHJcbiAqIFRyYW5zZm9ybXMgdGhlIG5vcm1hbCB3aXRoIHRoZSBnaXZlbiBtYXRyaXguXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMzPn0gbm9ybWFsIC0gVGhlIG5vcm1hbC5cclxuICogQHBhcmFtIHtOb2RlPG1hdDM+fSBbbWF0cml4PW1vZGVsV29ybGRNYXRyaXhdIC0gVGhlIG1hdHJpeC5cclxuICogQHJldHVybiB7Tm9kZTx2ZWMzPn0gVGhlIHRyYW5zZm9ybWVkIG5vcm1hbC5cclxuICovXHJcbmV4cG9ydCBjb25zdCB0cmFuc2Zvcm1Ob3JtYWwgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgbm9ybWFsLCBtYXRyaXggPSBtb2RlbFdvcmxkTWF0cml4IF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IG0gPSBtYXQzKCBtYXRyaXggKTtcclxuXHJcblx0Y29uc3QgdHJhbnNmb3JtZWROb3JtYWwgPSBub3JtYWwuZGl2KCB2ZWMzKCBtWyAwIF0uZG90KCBtWyAwIF0gKSwgbVsgMSBdLmRvdCggbVsgMSBdICksIG1bIDIgXS5kb3QoIG1bIDIgXSApICkgKTtcclxuXHJcblx0cmV0dXJuIG0ubXVsKCB0cmFuc2Zvcm1lZE5vcm1hbCApLnh5ejtcclxuXHJcbn0gKTtcclxuXHJcbi8qKlxyXG4gKiBUcmFuc2Zvcm1zIHRoZSBnaXZlbiBub3JtYWwgZnJvbSBsb2NhbCB0byB2aWV3IHNwYWNlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGU8dmVjMz59IG5vcm1hbCAtIFRoZSBub3JtYWwuXHJcbiAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcbiAqIEByZXR1cm4ge05vZGU8dmVjMz59IFRoZSB0cmFuc2Zvcm1lZCBub3JtYWwuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdHJhbnNmb3JtTm9ybWFsVG9WaWV3ID0gLypAX19QVVJFX18qLyBGbiggKCBbIG5vcm1hbCBdLCBidWlsZGVyICkgPT4ge1xyXG5cclxuXHRjb25zdCBtb2RlbE5vcm1hbFZpZXdNYXRyaXggPSBidWlsZGVyLnJlbmRlcmVyLm5vZGVzLm1vZGVsTm9ybWFsVmlld01hdHJpeDtcclxuXHJcblx0aWYgKCBtb2RlbE5vcm1hbFZpZXdNYXRyaXggIT09IG51bGwgKSB7XHJcblxyXG5cdFx0cmV0dXJuIG1vZGVsTm9ybWFsVmlld01hdHJpeC50cmFuc2Zvcm1EaXJlY3Rpb24oIG5vcm1hbCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vXHJcblxyXG5cdGNvbnN0IHRyYW5zZm9ybWVkTm9ybWFsID0gbW9kZWxOb3JtYWxNYXRyaXgubXVsKCBub3JtYWwgKTtcclxuXHJcblx0cmV0dXJuIGNhbWVyYVZpZXdNYXRyaXgudHJhbnNmb3JtRGlyZWN0aW9uKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xyXG5cclxufSApO1xyXG4iLCJpbXBvcnQgeyBFdWxlciB9IGZyb20gJy4uLy4uL21hdGgvRXVsZXIuanMnO1xyXG5pbXBvcnQgeyBNYXRyaXg0IH0gZnJvbSAnLi4vLi4vbWF0aC9NYXRyaXg0LmpzJztcclxuaW1wb3J0IHsgdW5pZm9ybSB9IGZyb20gJy4uL2NvcmUvVW5pZm9ybU5vZGUuanMnO1xyXG5cclxuY29uc3QgX2UxID0gLypAX19QVVJFX18qLyBuZXcgRXVsZXIoKTtcclxuY29uc3QgX20xID0gLypAX19QVVJFX18qLyBuZXcgTWF0cml4NCgpO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSByZWZyYWN0aW9uIHJhdGlvIG9mIHRoZSBtYXRlcmlhbCB1c2VkIGZvciByZW5kZXJpbmcgdGhlIGN1cnJlbnQgb2JqZWN0LlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtVbmlmb3JtTm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbWF0ZXJpYWxSZWZyYWN0aW9uUmF0aW8gPSAvKkBfX1BVUkVfXyovIHVuaWZvcm0oIDAgKS5vblJlZmVyZW5jZSggKCB7IG1hdGVyaWFsIH0gKSA9PiBtYXRlcmlhbCApLm9uT2JqZWN0VXBkYXRlKCAoIHsgbWF0ZXJpYWwgfSApID0+IG1hdGVyaWFsLnJlZnJhY3Rpb25SYXRpbyApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBpbnRlbnNpdHkgb2YgZW52aXJvbm1lbnQgbWFwcyBvZiBQQlIgbWF0ZXJpYWxzLlxyXG4gKiBXaGVuIGBtYXRlcmlhbC5lbnZNYXBgIGlzIHNldCwgdGhlIHZhbHVlIGlzIGBtYXRlcmlhbC5lbnZNYXBJbnRlbnNpdHlgIG90aGVyd2lzZSBgc2NlbmUuZW52aXJvbm1lbnRJbnRlbnNpdHlgLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtOb2RlPGZsb2F0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBtYXRlcmlhbEVudkludGVuc2l0eSA9IC8qQF9fUFVSRV9fKi8gdW5pZm9ybSggMSApLm9uUmVmZXJlbmNlKCAoIHsgbWF0ZXJpYWwgfSApID0+IG1hdGVyaWFsICkub25PYmplY3RVcGRhdGUoIGZ1bmN0aW9uICggeyBtYXRlcmlhbCwgc2NlbmUgfSApIHtcclxuXHJcblx0cmV0dXJuIG1hdGVyaWFsLmVudk1hcCA/IG1hdGVyaWFsLmVudk1hcEludGVuc2l0eSA6IHNjZW5lLmVudmlyb25tZW50SW50ZW5zaXR5O1xyXG5cclxufSApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSByb3RhdGlvbiBvZiBlbnZpcm9ubWVudCBtYXBzLlxyXG4gKiBXaGVuIGBtYXRlcmlhbC5lbnZNYXBgIGlzIHNldCwgdGhlIHZhbHVlIGlzIGBtYXRlcmlhbC5lbnZNYXBSb3RhdGlvbmAuIGBzY2VuZS5lbnZpcm9ubWVudFJvdGF0aW9uYCBjb250cm9scyB0aGVcclxuICogcm90YXRpb24gb2YgYHNjZW5lLmVudmlyb25tZW50YCBpbnN0ZWFkLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtOb2RlPG1hdDQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG1hdGVyaWFsRW52Um90YXRpb24gPSAvKkBfX1BVUkVfXyovIHVuaWZvcm0oIG5ldyBNYXRyaXg0KCkgKS5vblJlZmVyZW5jZSggZnVuY3Rpb24gKCBmcmFtZSApIHtcclxuXHJcblx0cmV0dXJuIGZyYW1lLm1hdGVyaWFsO1xyXG5cclxufSApLm9uT2JqZWN0VXBkYXRlKCBmdW5jdGlvbiAoIHsgbWF0ZXJpYWwsIHNjZW5lIH0gKSB7XHJcblxyXG5cdGNvbnN0IHJvdGF0aW9uID0gKCBzY2VuZS5lbnZpcm9ubWVudCAhPT0gbnVsbCAmJiBtYXRlcmlhbC5lbnZNYXAgPT09IG51bGwgKSA/IHNjZW5lLmVudmlyb25tZW50Um90YXRpb24gOiBtYXRlcmlhbC5lbnZNYXBSb3RhdGlvbjtcclxuXHJcblx0aWYgKCByb3RhdGlvbiApIHtcclxuXHJcblx0XHRfZTEuY29weSggcm90YXRpb24gKTtcclxuXHJcblx0XHRfbTEubWFrZVJvdGF0aW9uRnJvbUV1bGVyKCBfZTEgKTtcclxuXHJcblx0fSBlbHNlIHtcclxuXHJcblx0XHRfbTEuaWRlbnRpdHkoKTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gX20xO1xyXG5cclxufSApO1xyXG4iLCJpbXBvcnQgeyBjYW1lcmFWaWV3TWF0cml4IH0gZnJvbSAnLi9DYW1lcmEuanMnO1xyXG5pbXBvcnQgeyB0cmFuc2Zvcm1lZE5vcm1hbFZpZXcgfSBmcm9tICcuL05vcm1hbC5qcyc7XHJcbmltcG9ydCB7IHBvc2l0aW9uVmlld0RpcmVjdGlvbiB9IGZyb20gJy4vUG9zaXRpb24uanMnO1xyXG5pbXBvcnQgeyBtYXRlcmlhbFJlZnJhY3Rpb25SYXRpbyB9IGZyb20gJy4vTWF0ZXJpYWxQcm9wZXJ0aWVzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGUgcmVmbGVjdCB2ZWN0b3IgaW4gdmlldyBzcGFjZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTx2ZWMzPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCByZWZsZWN0VmlldyA9IC8qQF9fUFVSRV9fKi8gcG9zaXRpb25WaWV3RGlyZWN0aW9uLm5lZ2F0ZSgpLnJlZmxlY3QoIHRyYW5zZm9ybWVkTm9ybWFsVmlldyApO1xyXG5cclxuLyoqXHJcbiAqIFRoZSByZWZyYWN0IHZlY3RvciBpbiB2aWV3IHNwYWNlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtOb2RlPHZlYzM+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHJlZnJhY3RWaWV3ID0gLypAX19QVVJFX18qLyBwb3NpdGlvblZpZXdEaXJlY3Rpb24ubmVnYXRlKCkucmVmcmFjdCggdHJhbnNmb3JtZWROb3JtYWxWaWV3LCBtYXRlcmlhbFJlZnJhY3Rpb25SYXRpbyApO1xyXG5cclxuLyoqXHJcbiAqIFVzZWQgZm9yIHNhbXBsaW5nIGN1YmUgbWFwcyB3aGVuIHVzaW5nIGN1YmUgcmVmbGVjdGlvbiBtYXBwaW5nLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtOb2RlPHZlYzM+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHJlZmxlY3RWZWN0b3IgPSAvKkBfX1BVUkVfXyovIHJlZmxlY3RWaWV3LnRyYW5zZm9ybURpcmVjdGlvbiggY2FtZXJhVmlld01hdHJpeCApLnRvVmFyKCAncmVmbGVjdFZlY3RvcicgKTtcclxuXHJcbi8qKlxyXG4gKiBVc2VkIGZvciBzYW1wbGluZyBjdWJlIG1hcHMgd2hlbiB1c2luZyBjdWJlIHJlZnJhY3Rpb24gbWFwcGluZy5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTx2ZWMzPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCByZWZyYWN0VmVjdG9yID0gLypAX19QVVJFX18qLyByZWZyYWN0Vmlldy50cmFuc2Zvcm1EaXJlY3Rpb24oIGNhbWVyYVZpZXdNYXRyaXggKS50b1ZhciggJ3JlZmxlY3RWZWN0b3InICk7XHJcbiIsImltcG9ydCBUZXh0dXJlTm9kZSBmcm9tICcuL1RleHR1cmVOb2RlLmpzJztcclxuaW1wb3J0IHsgcmVmbGVjdFZlY3RvciwgcmVmcmFjdFZlY3RvciB9IGZyb20gJy4vUmVmbGVjdFZlY3Rvci5qcyc7XHJcbmltcG9ydCB7IG5vZGVQcm94eSwgdmVjMyB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbmltcG9ydCB7IEN1YmVSZWZsZWN0aW9uTWFwcGluZywgQ3ViZVJlZnJhY3Rpb25NYXBwaW5nLCBXZWJHUFVDb29yZGluYXRlU3lzdGVtIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgbWF0ZXJpYWxFbnZSb3RhdGlvbiB9IGZyb20gJy4vTWF0ZXJpYWxQcm9wZXJ0aWVzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIHR5cGUgb2YgdW5pZm9ybSBub2RlIHJlcHJlc2VudHMgYSBjdWJlIHRleHR1cmUuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBUZXh0dXJlTm9kZVxyXG4gKi9cclxuY2xhc3MgQ3ViZVRleHR1cmVOb2RlIGV4dGVuZHMgVGV4dHVyZU5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdDdWJlVGV4dHVyZU5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgY3ViZSB0ZXh0dXJlIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0N1YmVUZXh0dXJlfSB2YWx1ZSAtIFRoZSBjdWJlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHs/Tm9kZTx2ZWMzPn0gW3V2Tm9kZT1udWxsXSAtIFRoZSB1diBub2RlLlxyXG5cdCAqIEBwYXJhbSB7P05vZGU8aW50Pn0gW2xldmVsTm9kZT1udWxsXSAtIFRoZSBsZXZlbCBub2RlLlxyXG5cdCAqIEBwYXJhbSB7P05vZGU8ZmxvYXQ+fSBbYmlhc05vZGU9bnVsbF0gLSBUaGUgYmlhcyBub2RlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCB2YWx1ZSwgdXZOb2RlID0gbnVsbCwgbGV2ZWxOb2RlID0gbnVsbCwgYmlhc05vZGUgPSBudWxsICkge1xyXG5cclxuXHRcdHN1cGVyKCB2YWx1ZSwgdXZOb2RlLCBsZXZlbE5vZGUsIGJpYXNOb2RlICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzQ3ViZVRleHR1cmVOb2RlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBPdmVyd3JpdGVzIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRvIHJldHVybiBhIGZpeGVkIHZhbHVlIGAnY3ViZVRleHR1cmUnYC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgaW5wdXQgdHlwZS5cclxuXHQgKi9cclxuXHRnZXRJbnB1dFR5cGUoIC8qYnVpbGRlciovICkge1xyXG5cclxuXHRcdHJldHVybiAnY3ViZVRleHR1cmUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBkZWZhdWx0IHV2cyBiYXNlZCBvbiB0aGUgbWFwcGluZyB0eXBlIG9mIHRoZSBjdWJlIHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtOb2RlPHZlYzM+fSBUaGUgZGVmYXVsdCB1diBhdHRyaWJ1dGUuXHJcblx0ICovXHJcblx0Z2V0RGVmYXVsdFVWKCkge1xyXG5cclxuXHRcdGNvbnN0IHRleHR1cmUgPSB0aGlzLnZhbHVlO1xyXG5cclxuXHRcdGlmICggdGV4dHVyZS5tYXBwaW5nID09PSBDdWJlUmVmbGVjdGlvbk1hcHBpbmcgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gcmVmbGVjdFZlY3RvcjtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCB0ZXh0dXJlLm1hcHBpbmcgPT09IEN1YmVSZWZyYWN0aW9uTWFwcGluZyApIHtcclxuXHJcblx0XHRcdHJldHVybiByZWZyYWN0VmVjdG9yO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuQ3ViZVRleHR1cmVOb2RlOiBNYXBwaW5nIFwiJXNcIiBub3Qgc3VwcG9ydGVkLicsIHRleHR1cmUubWFwcGluZyApO1xyXG5cclxuXHRcdFx0cmV0dXJuIHZlYzMoIDAsIDAsIDAgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogT3ZlcndyaXR0ZW4gd2l0aCBhbiBlbXB0eSBpbXBsZW1lbnRhdGlvbiBzaW5jZSB0aGUgYHVwZGF0ZU1hdHJpeGAgZmxhZyBpcyBpZ25vcmVkXHJcblx0ICogZm9yIGN1YmUgdGV4dHVyZXMuIFRoZSB1diB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggaXMgbm90IGFwcGxpZWQgdG8gY3ViZSB0ZXh0dXJlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsdWUgLSBUaGUgdXBkYXRlIHRvZ2dsZS5cclxuXHQgKi9cclxuXHRzZXRVcGRhdGVNYXRyaXgoIC8qdXBkYXRlTWF0cml4Ki8gKSB7IH0gLy8gSWdub3JlIC51cGRhdGVNYXRyaXggZm9yIEN1YmVUZXh0dXJlTm9kZVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXR1cHMgdGhlIHV2IG5vZGUuIERlcGVuZGluZyBvbiB0aGUgYmFja2VuZCBhcyB3ZWxsIGFzIHRoZSB0ZXh0dXJlIHR5cGUsIGl0IG1pZ2h0IGJlIG5lY2Vzc2FyeVxyXG5cdCAqIHRvIG1vZGlmeSB0aGUgdXYgbm9kZSBmb3IgY29ycmVjdCBzYW1wbGluZy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHBhcmFtIHtOb2RlfSB1dk5vZGUgLSBUaGUgdXYgbm9kZSB0byBzZXR1cC5cclxuXHQgKiBAcmV0dXJuIHtOb2RlfSBUaGUgdXBkYXRlZCB1diBub2RlLlxyXG5cdCAqL1xyXG5cdHNldHVwVVYoIGJ1aWxkZXIsIHV2Tm9kZSApIHtcclxuXHJcblx0XHRjb25zdCB0ZXh0dXJlID0gdGhpcy52YWx1ZTtcclxuXHJcblx0XHRpZiAoIGJ1aWxkZXIucmVuZGVyZXIuY29vcmRpbmF0ZVN5c3RlbSA9PT0gV2ViR1BVQ29vcmRpbmF0ZVN5c3RlbSB8fCAhIHRleHR1cmUuaXNSZW5kZXJUYXJnZXRUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0dXZOb2RlID0gdmVjMyggdXZOb2RlLngubmVnYXRlKCksIHV2Tm9kZS55eiApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbWF0ZXJpYWxFbnZSb3RhdGlvbi5tdWwoIHV2Tm9kZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyB0aGUgdXYgY29kZSBzbmlwcGV0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcGFyYW0ge05vZGV9IGN1YmVVViAtIFRoZSB1diBub2RlIHRvIGdlbmVyYXRlIGNvZGUgZm9yLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGdlbmVyYXRlZCBjb2RlIHNuaXBwZXQuXHJcblx0ICovXHJcblx0Z2VuZXJhdGVVViggYnVpbGRlciwgY3ViZVVWICkge1xyXG5cclxuXHRcdHJldHVybiBjdWJlVVYuYnVpbGQoIGJ1aWxkZXIsICd2ZWMzJyApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBDdWJlVGV4dHVyZU5vZGU7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIGN1YmUgdGV4dHVyZSBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge0N1YmVUZXh0dXJlfSB2YWx1ZSAtIFRoZSBjdWJlIHRleHR1cmUuXHJcbiAqIEBwYXJhbSB7P05vZGU8dmVjMz59IFt1dk5vZGU9bnVsbF0gLSBUaGUgdXYgbm9kZS5cclxuICogQHBhcmFtIHs/Tm9kZTxpbnQ+fSBbbGV2ZWxOb2RlPW51bGxdIC0gVGhlIGxldmVsIG5vZGUuXHJcbiAqIEBwYXJhbSB7P05vZGU8ZmxvYXQ+fSBbYmlhc05vZGU9bnVsbF0gLSBUaGUgYmlhcyBub2RlLlxyXG4gKiBAcmV0dXJucyB7Q3ViZVRleHR1cmVOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGN1YmVUZXh0dXJlID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIEN1YmVUZXh0dXJlTm9kZSApLnNldFBhcmFtZXRlckxlbmd0aCggMSwgNCApLnNldE5hbWUoICdjdWJlVGV4dHVyZScgKTtcclxuIiwiaW1wb3J0IE5vZGUgZnJvbSAnLi4vY29yZS9Ob2RlLmpzJztcclxuaW1wb3J0IHsgTm9kZVVwZGF0ZVR5cGUgfSBmcm9tICcuLi9jb3JlL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IHVuaWZvcm0gfSBmcm9tICcuLi9jb3JlL1VuaWZvcm1Ob2RlLmpzJztcclxuaW1wb3J0IHsgdGV4dHVyZSB9IGZyb20gJy4vVGV4dHVyZU5vZGUuanMnO1xyXG5pbXBvcnQgeyBjdWJlVGV4dHVyZSB9IGZyb20gJy4vQ3ViZVRleHR1cmVOb2RlLmpzJztcclxuaW1wb3J0IHsgYnVmZmVyIH0gZnJvbSAnLi9CdWZmZXJOb2RlLmpzJztcclxuaW1wb3J0IHsgbm9kZU9iamVjdCB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuaW1wb3J0IHsgdW5pZm9ybUFycmF5IH0gZnJvbSAnLi9Vbmlmb3JtQXJyYXlOb2RlLmpzJztcclxuaW1wb3J0IEFycmF5RWxlbWVudE5vZGUgZnJvbSAnLi4vdXRpbHMvQXJyYXlFbGVtZW50Tm9kZS5qcyc7XHJcblxyXG4vLyBUT0RPOiBBdm9pZCBkdXBsaWNhdGVkIGNvZGUgYW5kIHVlcyBvbmx5IFJlZmVyZW5jZUJhc2VOb2RlIG9yIFJlZmVyZW5jZU5vZGVcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGNsYXNzIGlzIG9ubHkgcmVsZXZhbnQgaWYgdGhlIHJlZmVyZW5jZWQgcHJvcGVydHkgaXMgYXJyYXktbGlrZS5cclxuICogSW4gdGhpcyBjYXNlLCBgUmVmZXJlbmNlRWxlbWVudE5vZGVgIGFsbG93cyB0byByZWZlciB0byBhIHNwZWNpZmljXHJcbiAqIGVsZW1lbnQgaW5zaWRlIHRoZSBkYXRhIHN0cnVjdHVyZSB2aWEgYW4gaW5kZXguXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBBcnJheUVsZW1lbnROb2RlXHJcbiAqL1xyXG5jbGFzcyBSZWZlcmVuY2VFbGVtZW50Tm9kZSBleHRlbmRzIEFycmF5RWxlbWVudE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdSZWZlcmVuY2VFbGVtZW50Tm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyByZWZlcmVuY2UgZWxlbWVudCBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHs/UmVmZXJlbmNlTm9kZX0gcmVmZXJlbmNlTm9kZSAtIFRoZSByZWZlcmVuY2Ugbm9kZS5cclxuXHQgKiBAcGFyYW0ge05vZGV9IGluZGV4Tm9kZSAtIFRoZSBpbmRleCBub2RlIHRoYXQgZGVmaW5lcyB0aGUgZWxlbWVudCBhY2Nlc3MuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHJlZmVyZW5jZU5vZGUsIGluZGV4Tm9kZSApIHtcclxuXHJcblx0XHRzdXBlciggcmVmZXJlbmNlTm9kZSwgaW5kZXhOb2RlICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTaW1pbGFyIHRvIHtAbGluayBSZWZlcmVuY2VOb2RlI3JlZmVyZW5jZX0sIGFuIGFkZGl0aW9uYWxcclxuXHRcdCAqIHByb3BlcnR5IHJlZmVyZW5jZXMgdG8gdGhlIGN1cnJlbnQgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1JlZmVyZW5jZU5vZGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVmZXJlbmNlTm9kZSA9IHJlZmVyZW5jZU5vZGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzUmVmZXJlbmNlRWxlbWVudE5vZGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGlzIG92ZXJ3cml0dGVuIHNpbmNlIHRoZSBub2RlIHR5cGUgaXMgaW5mZXJyZWQgZnJvbVxyXG5cdCAqIHRoZSB1bmlmb3JtIHR5cGUgb2YgdGhlIHJlZmVyZW5jZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgbm9kZSB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldE5vZGVUeXBlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnJlZmVyZW5jZU5vZGUudW5pZm9ybVR5cGU7XHJcblxyXG5cdH1cclxuXHJcblx0Z2VuZXJhdGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3Qgc25pcHBldCA9IHN1cGVyLmdlbmVyYXRlKCBidWlsZGVyICk7XHJcblx0XHRjb25zdCBhcnJheVR5cGUgPSB0aGlzLnJlZmVyZW5jZU5vZGUuZ2V0Tm9kZVR5cGUoKTtcclxuXHRcdGNvbnN0IGVsZW1lbnRUeXBlID0gdGhpcy5nZXROb2RlVHlwZSgpO1xyXG5cclxuXHRcdHJldHVybiBidWlsZGVyLmZvcm1hdCggc25pcHBldCwgYXJyYXlUeXBlLCBlbGVtZW50VHlwZSApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogVGhpcyB0eXBlIG9mIG5vZGUgZXN0YWJsaXNoZXMgYSByZWZlcmVuY2UgdG8gYSBwcm9wZXJ0eSBvZiBhbm90aGVyIG9iamVjdC5cclxuICogSW4gdGhpcyB3YXksIHRoZSB2YWx1ZSBvZiB0aGUgbm9kZSBpcyBhdXRvbWF0aWNhbGx5IGxpbmtlZCB0byB0aGUgdmFsdWUgb2ZcclxuICogcmVmZXJlbmNlZCBvYmplY3QuIFJlZmVyZW5jZSBub2RlcyBpbnRlcm5hbGx5IHJlcHJlc2VudCB0aGUgbGlua2VkIHZhbHVlXHJcbiAqIGFzIGEgdW5pZm9ybS5cclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVcclxuICovXHJcbmNsYXNzIFJlZmVyZW5jZU5vZGUgZXh0ZW5kcyBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnUmVmZXJlbmNlTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyByZWZlcmVuY2Ugbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGUgbm9kZSByZWZlcnMgdG8uXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHVuaWZvcm1UeXBlIC0gVGhlIHVuaWZvcm0gdHlwZSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgcHJvcGVydHkgdmFsdWUuXHJcblx0ICogQHBhcmFtIHs/T2JqZWN0fSBbb2JqZWN0PW51bGxdIC0gVGhlIG9iamVjdCB0aGUgcHJvcGVydHkgYmVsb25ncyB0by5cclxuXHQgKiBAcGFyYW0gez9udW1iZXJ9IFtjb3VudD1udWxsXSAtIFdoZW4gdGhlIGxpbmtlZCBwcm9wZXJ0eSBpcyBhbiBhcnJheS1saWtlLCB0aGlzIHBhcmFtZXRlciBkZWZpbmVzIGl0cyBsZW5ndGguXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHByb3BlcnR5LCB1bmlmb3JtVHlwZSwgb2JqZWN0ID0gbnVsbCwgY291bnQgPSBudWxsICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhlIG5vZGUgcmVmZXJzIHRvLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB1bmlmb3JtIHR5cGUgdGhhdCBzaG91bGQgYmUgdXNlZCB0byByZXByZXNlbnQgdGhlIHByb3BlcnR5IHZhbHVlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudW5pZm9ybVR5cGUgPSB1bmlmb3JtVHlwZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBvYmplY3QgdGhlIHByb3BlcnR5IGJlbG9uZ3MgdG8uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9PYmplY3R9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMub2JqZWN0ID0gb2JqZWN0O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hlbiB0aGUgbGlua2VkIHByb3BlcnR5IGlzIGFuIGFycmF5LCB0aGlzIHBhcmFtZXRlciBkZWZpbmVzIGl0cyBsZW5ndGguXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9udW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY291bnQgPSBjb3VudDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBwcm9wZXJ0eSBuYW1lIG1pZ2h0IGhhdmUgZG90cyBzbyBuZXN0ZWQgcHJvcGVydGllcyBjYW4gYmUgcmVmZXJyZWQuXHJcblx0XHQgKiBUaGUgaGllcmFyY2h5IG9mIHRoZSBuYW1lcyBpcyBzdG9yZWQgaW5zaWRlIHRoaXMgYXJyYXkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PHN0cmluZz59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucHJvcGVydGllcyA9IHByb3BlcnR5LnNwbGl0KCAnLicgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFBvaW50cyB0byB0aGUgY3VycmVudCByZWZlcnJlZCBvYmplY3QuIFRoaXMgcHJvcGVydHkgZXhpc3RzIG5leHQgdG8ge0BsaW5rIFJlZmVyZW5jZU5vZGUjb2JqZWN0fVxyXG5cdFx0ICogc2luY2UgdGhlIGZpbmFsIHJlZmVyZW5jZSBtaWdodCBiZSB1cGRhdGVkIGZyb20gY2FsbGluZyBjb2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/T2JqZWN0fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJlZmVyZW5jZSA9IG9iamVjdDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB1bmlmb3JtIG5vZGUgdGhhdCBob2xkcyB0aGUgdmFsdWUgb2YgdGhlIHJlZmVyZW5jZSBub2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtVbmlmb3JtTm9kZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub2RlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB1bmlmb3JtIGdyb3VwIG9mIHRoZSBpbnRlcm5hbCB1bmlmb3JtLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtVbmlmb3JtR3JvdXBOb2RlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdyb3VwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIG9wdGlvbmFsIGxhYmVsIG9mIHRoZSBpbnRlcm5hbCB1bmlmb3JtIG5vZGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9zdHJpbmd9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubmFtZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBPdmVyd3JpdHRlbiBzaW5jZSByZWZlcmVuY2Ugbm9kZXMgYXJlIHVwZGF0ZWQgcGVyIG9iamVjdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICogQGRlZmF1bHQgJ29iamVjdCdcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51cGRhdGVUeXBlID0gTm9kZVVwZGF0ZVR5cGUuT0JKRUNUO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdoZW4gdGhlIHJlZmVycmVkIHByb3BlcnR5IGlzIGFycmF5LWxpa2UsIHRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkXHJcblx0ICogdG8gYWNjZXNzIGVsZW1lbnRzIHZpYSBhbiBpbmRleCBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtJbmRleE5vZGV9IGluZGV4Tm9kZSAtIGluZGV4Tm9kZS5cclxuXHQgKiBAcmV0dXJuIHtSZWZlcmVuY2VFbGVtZW50Tm9kZX0gQSByZWZlcmVuY2UgdG8gYW4gZWxlbWVudC5cclxuXHQgKi9cclxuXHRlbGVtZW50KCBpbmRleE5vZGUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5vZGVPYmplY3QoIG5ldyBSZWZlcmVuY2VFbGVtZW50Tm9kZSggdGhpcywgbm9kZU9iamVjdCggaW5kZXhOb2RlICkgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHVuaWZvcm0gZ3JvdXAgZm9yIHRoaXMgcmVmZXJlbmNlIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1VuaWZvcm1Hcm91cE5vZGV9IGdyb3VwIC0gVGhlIHVuaWZvcm0gZ3JvdXAgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge1JlZmVyZW5jZU5vZGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbm9kZS5cclxuXHQgKi9cclxuXHRzZXRHcm91cCggZ3JvdXAgKSB7XHJcblxyXG5cdFx0dGhpcy5ncm91cCA9IGdyb3VwO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGxhYmVsIGZvciB0aGUgaW50ZXJuYWwgdW5pZm9ybS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIGxhYmVsIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtSZWZlcmVuY2VOb2RlfSBBIHJlZmVyZW5jZSB0byB0aGlzIG5vZGUuXHJcblx0ICovXHJcblx0bGFiZWwoIG5hbWUgKSB7XHJcblxyXG5cdFx0dGhpcy5uYW1lID0gbmFtZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBub2RlIHR5cGUgd2hpY2ggYXV0b21hdGljYWxseSBkZWZpbmVzIHRoZSBpbnRlcm5hbFxyXG5cdCAqIHVuaWZvcm0gdHlwZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB1bmlmb3JtVHlwZSAtIFRoZSB0eXBlIHRvIHNldC5cclxuXHQgKi9cclxuXHRzZXROb2RlVHlwZSggdW5pZm9ybVR5cGUgKSB7XHJcblxyXG5cdFx0bGV0IG5vZGUgPSBudWxsO1xyXG5cclxuXHRcdGlmICggdGhpcy5jb3VudCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdG5vZGUgPSBidWZmZXIoIG51bGwsIHVuaWZvcm1UeXBlLCB0aGlzLmNvdW50ICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggQXJyYXkuaXNBcnJheSggdGhpcy5nZXRWYWx1ZUZyb21SZWZlcmVuY2UoKSApICkge1xyXG5cclxuXHRcdFx0bm9kZSA9IHVuaWZvcm1BcnJheSggbnVsbCwgdW5pZm9ybVR5cGUgKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCB1bmlmb3JtVHlwZSA9PT0gJ3RleHR1cmUnICkge1xyXG5cclxuXHRcdFx0bm9kZSA9IHRleHR1cmUoIG51bGwgKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCB1bmlmb3JtVHlwZSA9PT0gJ2N1YmVUZXh0dXJlJyApIHtcclxuXHJcblx0XHRcdG5vZGUgPSBjdWJlVGV4dHVyZSggbnVsbCApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRub2RlID0gdW5pZm9ybSggbnVsbCwgdW5pZm9ybVR5cGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aGlzLmdyb3VwICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0bm9kZS5zZXRHcm91cCggdGhpcy5ncm91cCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMubmFtZSAhPT0gbnVsbCApIG5vZGUubGFiZWwoIHRoaXMubmFtZSApO1xyXG5cclxuXHRcdHRoaXMubm9kZSA9IG5vZGUuZ2V0U2VsZigpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGlzIG92ZXJ3cml0dGVuIHNpbmNlIHRoZSBub2RlIHR5cGUgaXMgaW5mZXJyZWQgZnJvbVxyXG5cdCAqIHRoZSB0eXBlIG9mIHRoZSByZWZlcmVuY2Ugbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgbm9kZSB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldE5vZGVUeXBlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5ub2RlID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy51cGRhdGVSZWZlcmVuY2UoIGJ1aWxkZXIgKTtcclxuXHRcdFx0dGhpcy51cGRhdGVWYWx1ZSgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcy5ub2RlLmdldE5vZGVUeXBlKCBidWlsZGVyICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUgZnJvbSB0aGUgZ2l2ZW4gcmVmZXJyZWQgb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9dGhpcy5yZWZlcmVuY2VdIC0gVGhlIG9iamVjdCB0byByZXRyaWV2ZSB0aGUgcHJvcGVydHkgdmFsdWUgZnJvbS5cclxuXHQgKiBAcmV0dXJuIHthbnl9IFRoZSB2YWx1ZS5cclxuXHQgKi9cclxuXHRnZXRWYWx1ZUZyb21SZWZlcmVuY2UoIG9iamVjdCA9IHRoaXMucmVmZXJlbmNlICkge1xyXG5cclxuXHRcdGNvbnN0IHsgcHJvcGVydGllcyB9ID0gdGhpcztcclxuXHJcblx0XHRsZXQgdmFsdWUgPSBvYmplY3RbIHByb3BlcnRpZXNbIDAgXSBdO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMTsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0dmFsdWUgPSB2YWx1ZVsgcHJvcGVydGllc1sgaSBdIF07XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBbGxvd3MgdG8gdXBkYXRlIHRoZSByZWZlcmVuY2UgYmFzZWQgb24gdGhlIGdpdmVuIHN0YXRlLiBUaGUgc3RhdGUgaXMgb25seVxyXG5cdCAqIGV2YWx1YXRlZCB7QGxpbmsgUmVmZXJlbmNlTm9kZSNvYmplY3R9IGlzIG5vdCBzZXQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geyhOb2RlRnJhbWV8Tm9kZUJ1aWxkZXIpfSBzdGF0ZSAtIFRoZSBjdXJyZW50IHN0YXRlLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdH0gVGhlIHVwZGF0ZWQgcmVmZXJlbmNlLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZVJlZmVyZW5jZSggc3RhdGUgKSB7XHJcblxyXG5cdFx0dGhpcy5yZWZlcmVuY2UgPSB0aGlzLm9iamVjdCAhPT0gbnVsbCA/IHRoaXMub2JqZWN0IDogc3RhdGUub2JqZWN0O1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnJlZmVyZW5jZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgb3V0cHV0IG9mIHRoZSByZWZlcmVuY2Ugbm9kZSBpcyB0aGUgaW50ZXJuYWwgdW5pZm9ybSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtVbmlmb3JtTm9kZX0gVGhlIG91dHB1dCBub2RlLlxyXG5cdCAqL1xyXG5cdHNldHVwKCAvKiBidWlsZGVyICovICkge1xyXG5cclxuXHRcdHRoaXMudXBkYXRlVmFsdWUoKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5ub2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE92ZXJ3cml0dGVuIHRvIHRvIHVwZGF0ZSB0aGUgaW50ZXJuYWwgdW5pZm9ybSB2YWx1ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUZyYW1lfSBmcmFtZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IG5vZGUgZnJhbWUuXHJcblx0ICovXHJcblx0dXBkYXRlKCAvKmZyYW1lKi8gKSB7XHJcblxyXG5cdFx0dGhpcy51cGRhdGVWYWx1ZSgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHJpZXZlcyB0aGUgdmFsdWUgZnJvbSB0aGUgcmVmZXJyZWQgb2JqZWN0IHByb3BlcnR5IGFuZCB1c2VzIGl0XHJcblx0ICogdG8gdXBkYXRlZCB0aGUgaW50ZXJuYWwgdW5pZm9ybS5cclxuXHQgKi9cclxuXHR1cGRhdGVWYWx1ZSgpIHtcclxuXHJcblx0XHRpZiAoIHRoaXMubm9kZSA9PT0gbnVsbCApIHRoaXMuc2V0Tm9kZVR5cGUoIHRoaXMudW5pZm9ybVR5cGUgKTtcclxuXHJcblx0XHRjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWVGcm9tUmVmZXJlbmNlKCk7XHJcblxyXG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCB2YWx1ZSApICkge1xyXG5cclxuXHRcdFx0dGhpcy5ub2RlLmFycmF5ID0gdmFsdWU7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHRoaXMubm9kZS52YWx1ZSA9IHZhbHVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUmVmZXJlbmNlTm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgcmVmZXJlbmNlIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoZSBub2RlIHJlZmVycyB0by5cclxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBUaGUgdW5pZm9ybSB0eXBlIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBwcm9wZXJ0eSB2YWx1ZS5cclxuICogQHBhcmFtIHs/T2JqZWN0fSBbb2JqZWN0XSAtIFRoZSBvYmplY3QgdGhlIHByb3BlcnR5IGJlbG9uZ3MgdG8uXHJcbiAqIEByZXR1cm5zIHtSZWZlcmVuY2VOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHJlZmVyZW5jZSA9ICggbmFtZSwgdHlwZSwgb2JqZWN0ICkgPT4gbm9kZU9iamVjdCggbmV3IFJlZmVyZW5jZU5vZGUoIG5hbWUsIHR5cGUsIG9iamVjdCApICk7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIHJlZmVyZW5jZSBub2RlLiBVc2UgdGhpcyBmdW5jdGlvbiBpZiB5b3Ugd2FudCBuZWVkIGEgcmVmZXJlbmNlXHJcbiAqIHRvIGFuIGFycmF5LWxpa2UgcHJvcGVydHkgdGhhdCBzaG91bGQgYmUgcmVwcmVzZW50ZWQgYXMgYSB1bmlmb3JtIGJ1ZmZlci5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhlIG5vZGUgcmVmZXJzIHRvLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSB1bmlmb3JtIHR5cGUgdGhhdCBzaG91bGQgYmUgdXNlZCB0byByZXByZXNlbnQgdGhlIHByb3BlcnR5IHZhbHVlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gY291bnQgLSBUaGUgbnVtYmVyIG9mIHZhbHVlIGluc2lkZSB0aGUgYXJyYXktbGlrZSBvYmplY3QuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgLSBBbiBhcnJheS1saWtlIG9iamVjdCB0aGUgcHJvcGVydHkgYmVsb25ncyB0by5cclxuICogQHJldHVybnMge1JlZmVyZW5jZU5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcmVmZXJlbmNlQnVmZmVyID0gKCBuYW1lLCB0eXBlLCBjb3VudCwgb2JqZWN0ICkgPT4gbm9kZU9iamVjdCggbmV3IFJlZmVyZW5jZU5vZGUoIG5hbWUsIHR5cGUsIG9iamVjdCwgY291bnQgKSApO1xyXG4iLCJpbXBvcnQgUmVmZXJlbmNlTm9kZSBmcm9tICcuL1JlZmVyZW5jZU5vZGUuanMnO1xyXG5pbXBvcnQgeyBub2RlT2JqZWN0IH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgbm9kZSBpcyBhIHNwZWNpYWwgdHlwZSBvZiByZWZlcmVuY2Ugbm9kZSB3aGljaCBpcyBpbnRlbmRlZFxyXG4gKiBmb3IgbGlua2luZyBtYXRlcmlhbCBwcm9wZXJ0aWVzIHdpdGggbm9kZSB2YWx1ZXMuXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IG9wYWNpdHlOb2RlID0gbWF0ZXJpYWxSZWZlcmVuY2UoICdvcGFjaXR5JywgJ2Zsb2F0JywgbWF0ZXJpYWwgKTtcclxuICogYGBgXHJcbiAqIFdoZW4gY2hhbmdpbmcgYG1hdGVyaWFsLm9wYWNpdHlgLCB0aGUgbm9kZSB2YWx1ZSBvZiBgb3BhY2l0eU5vZGVgIHdpbGxcclxuICogYXV0b21hdGljYWxseSBiZSB1cGRhdGVkLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgUmVmZXJlbmNlTm9kZVxyXG4gKi9cclxuY2xhc3MgTWF0ZXJpYWxSZWZlcmVuY2VOb2RlIGV4dGVuZHMgUmVmZXJlbmNlTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ01hdGVyaWFsUmVmZXJlbmNlTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBtYXRlcmlhbCByZWZlcmVuY2Ugbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGUgbm9kZSByZWZlcnMgdG8uXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGlucHV0VHlwZSAtIFRoZSB1bmlmb3JtIHR5cGUgdGhhdCBzaG91bGQgYmUgdXNlZCB0byByZXByZXNlbnQgdGhlIHByb3BlcnR5IHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7P01hdGVyaWFsfSBbbWF0ZXJpYWw9bnVsbF0gLSBUaGUgbWF0ZXJpYWwgdGhlIHByb3BlcnR5IGJlbG9uZ3MgdG8uIFdoZW4gbm8gbWF0ZXJpYWwgaXMgc2V0LFxyXG5cdCAqIHRoZSBub2RlIHJlZmVycyB0byB0aGUgbWF0ZXJpYWwgb2YgdGhlIGN1cnJlbnQgcmVuZGVyZWQgb2JqZWN0LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwcm9wZXJ0eSwgaW5wdXRUeXBlLCBtYXRlcmlhbCA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoIHByb3BlcnR5LCBpbnB1dFR5cGUsIG1hdGVyaWFsICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbWF0ZXJpYWwgdGhlIHByb3BlcnR5IGJlbG9uZ3MgdG8uIFdoZW4gbm8gbWF0ZXJpYWwgaXMgc2V0LFxyXG5cdFx0ICogdGhlIG5vZGUgcmVmZXJzIHRvIHRoZSBtYXRlcmlhbCBvZiB0aGUgY3VycmVudCByZW5kZXJlZCBvYmplY3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9NYXRlcmlhbH1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tYXRlcmlhbCA9IG1hdGVyaWFsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc01hdGVyaWFsUmVmZXJlbmNlTm9kZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgcmVmZXJlbmNlIGJhc2VkIG9uIHRoZSBnaXZlbiBzdGF0ZS4gVGhlIHN0YXRlIGlzIG9ubHkgZXZhbHVhdGVkXHJcblx0ICoge0BsaW5rIE1hdGVyaWFsUmVmZXJlbmNlTm9kZSNtYXRlcmlhbH0gaXMgbm90IHNldC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7KE5vZGVGcmFtZXxOb2RlQnVpbGRlcil9IHN0YXRlIC0gVGhlIGN1cnJlbnQgc3RhdGUuXHJcblx0ICogQHJldHVybiB7T2JqZWN0fSBUaGUgdXBkYXRlZCByZWZlcmVuY2UuXHJcblx0ICovXHJcblx0dXBkYXRlUmVmZXJlbmNlKCBzdGF0ZSApIHtcclxuXHJcblx0XHR0aGlzLnJlZmVyZW5jZSA9IHRoaXMubWF0ZXJpYWwgIT09IG51bGwgPyB0aGlzLm1hdGVyaWFsIDogc3RhdGUubWF0ZXJpYWw7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMucmVmZXJlbmNlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBNYXRlcmlhbFJlZmVyZW5jZU5vZGU7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIG1hdGVyaWFsIHJlZmVyZW5jZSBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGUgbm9kZSByZWZlcnMgdG8uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIHVuaWZvcm0gdHlwZSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgcHJvcGVydHkgdmFsdWUuXHJcbiAqIEBwYXJhbSB7P01hdGVyaWFsfSBbbWF0ZXJpYWw9bnVsbF0gLSBUaGUgbWF0ZXJpYWwgdGhlIHByb3BlcnR5IGJlbG9uZ3MgdG8uXHJcbiAqIFdoZW4gbm8gbWF0ZXJpYWwgaXMgc2V0LCB0aGUgbm9kZSByZWZlcnMgdG8gdGhlIG1hdGVyaWFsIG9mIHRoZSBjdXJyZW50IHJlbmRlcmVkIG9iamVjdC5cclxuICogQHJldHVybnMge01hdGVyaWFsUmVmZXJlbmNlTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBtYXRlcmlhbFJlZmVyZW5jZSA9ICggbmFtZSwgdHlwZSwgbWF0ZXJpYWwgPSBudWxsICkgPT4gbm9kZU9iamVjdCggbmV3IE1hdGVyaWFsUmVmZXJlbmNlTm9kZSggbmFtZSwgdHlwZSwgbWF0ZXJpYWwgKSApO1xyXG4iLCJpbXBvcnQgeyBhdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0F0dHJpYnV0ZU5vZGUuanMnO1xyXG5pbXBvcnQgeyBjYW1lcmFWaWV3TWF0cml4IH0gZnJvbSAnLi9DYW1lcmEuanMnO1xyXG5pbXBvcnQgeyBtb2RlbFZpZXdNYXRyaXggfSBmcm9tICcuL01vZGVsTm9kZS5qcyc7XHJcbmltcG9ydCB7IEZuLCB2ZWM0IH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSB0YW5nZW50IGF0dHJpYnV0ZSBvZiB0aGUgY3VycmVudCByZW5kZXJlZCBvYmplY3QuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8dmVjND59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdGFuZ2VudEdlb21ldHJ5ID0gLypAX19QVVJFX18qLyBGbiggKCBidWlsZGVyICkgPT4ge1xyXG5cclxuXHRpZiAoIGJ1aWxkZXIuZ2VvbWV0cnkuaGFzQXR0cmlidXRlKCAndGFuZ2VudCcgKSA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0YnVpbGRlci5nZW9tZXRyeS5jb21wdXRlVGFuZ2VudHMoKTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gYXR0cmlidXRlKCAndGFuZ2VudCcsICd2ZWM0JyApO1xyXG5cclxufSApKCk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHZlcnRleCB0YW5nZW50IGluIGxvY2FsIHNwYWNlIG9mIHRoZSBjdXJyZW50IHJlbmRlcmVkIG9iamVjdC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTx2ZWMzPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCB0YW5nZW50TG9jYWwgPSAvKkBfX1BVUkVfXyovIHRhbmdlbnRHZW9tZXRyeS54eXoudG9WYXIoICd0YW5nZW50TG9jYWwnICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHZlcnRleCB0YW5nZW50IGluIHZpZXcgc3BhY2Ugb2YgdGhlIGN1cnJlbnQgcmVuZGVyZWQgb2JqZWN0LlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtOb2RlPHZlYzM+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHRhbmdlbnRWaWV3ID0gLypAX19QVVJFX18qLyBtb2RlbFZpZXdNYXRyaXgubXVsKCB2ZWM0KCB0YW5nZW50TG9jYWwsIDAgKSApLnh5ei50b1ZhcnlpbmcoICd2X3RhbmdlbnRWaWV3JyApLm5vcm1hbGl6ZSgpLnRvVmFyKCAndGFuZ2VudFZpZXcnICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHZlcnRleCB0YW5nZW50IGluIHdvcmxkIHNwYWNlIG9mIHRoZSBjdXJyZW50IHJlbmRlcmVkIG9iamVjdC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTx2ZWMzPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCB0YW5nZW50V29ybGQgPSAvKkBfX1BVUkVfXyovIHRhbmdlbnRWaWV3LnRyYW5zZm9ybURpcmVjdGlvbiggY2FtZXJhVmlld01hdHJpeCApLnRvVmFyeWluZyggJ3ZfdGFuZ2VudFdvcmxkJyApLm5vcm1hbGl6ZSgpLnRvVmFyKCAndGFuZ2VudFdvcmxkJyApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSB0cmFuc2Zvcm1lZCB2ZXJ0ZXggdGFuZ2VudCBpbiB2aWV3IHNwYWNlIG9mIHRoZSBjdXJyZW50IHJlbmRlcmVkIG9iamVjdC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTx2ZWMzPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCB0cmFuc2Zvcm1lZFRhbmdlbnRWaWV3ID0gLypAX19QVVJFX18qLyB0YW5nZW50Vmlldy50b1ZhciggJ3RyYW5zZm9ybWVkVGFuZ2VudFZpZXcnICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHRyYW5zZm9ybWVkIHZlcnRleCB0YW5nZW50IGluIHdvcmxkIHNwYWNlIG9mIHRoZSBjdXJyZW50IHJlbmRlcmVkIG9iamVjdC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTx2ZWMzPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCB0cmFuc2Zvcm1lZFRhbmdlbnRXb3JsZCA9IC8qQF9fUFVSRV9fKi8gdHJhbnNmb3JtZWRUYW5nZW50Vmlldy50cmFuc2Zvcm1EaXJlY3Rpb24oIGNhbWVyYVZpZXdNYXRyaXggKS5ub3JtYWxpemUoKS50b1ZhciggJ3RyYW5zZm9ybWVkVGFuZ2VudFdvcmxkJyApO1xyXG4iLCJpbXBvcnQgeyB2YXJ5aW5nIH0gZnJvbSAnLi4vY29yZS9WYXJ5aW5nTm9kZS5qcyc7XHJcbmltcG9ydCB7IGNhbWVyYVZpZXdNYXRyaXggfSBmcm9tICcuL0NhbWVyYS5qcyc7XHJcbmltcG9ydCB7IG5vcm1hbEdlb21ldHJ5LCBub3JtYWxMb2NhbCwgbm9ybWFsVmlldywgbm9ybWFsV29ybGQsIHRyYW5zZm9ybWVkTm9ybWFsVmlldyB9IGZyb20gJy4vTm9ybWFsLmpzJztcclxuaW1wb3J0IHsgdGFuZ2VudEdlb21ldHJ5LCB0YW5nZW50TG9jYWwsIHRhbmdlbnRWaWV3LCB0YW5nZW50V29ybGQsIHRyYW5zZm9ybWVkVGFuZ2VudFZpZXcgfSBmcm9tICcuL1RhbmdlbnQuanMnO1xyXG5cclxuY29uc3QgZ2V0Qml0YW5nZW50ID0gKCBjcm9zc05vcm1hbFRhbmdlbnQgKSA9PiBjcm9zc05vcm1hbFRhbmdlbnQubXVsKCB0YW5nZW50R2VvbWV0cnkudyApLnh5ejtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgYml0YW5nZW50IGF0dHJpYnV0ZSBvZiB0aGUgY3VycmVudCByZW5kZXJlZCBvYmplY3QuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8dmVjMz59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYml0YW5nZW50R2VvbWV0cnkgPSAvKkBfX1BVUkVfXyovIHZhcnlpbmcoIGdldEJpdGFuZ2VudCggbm9ybWFsR2VvbWV0cnkuY3Jvc3MoIHRhbmdlbnRHZW9tZXRyeSApICksICd2X2JpdGFuZ2VudEdlb21ldHJ5JyApLm5vcm1hbGl6ZSgpLnRvVmFyKCAnYml0YW5nZW50R2VvbWV0cnknICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHZlcnRleCBiaXRhbmdlbnQgaW4gbG9jYWwgc3BhY2Ugb2YgdGhlIGN1cnJlbnQgcmVuZGVyZWQgb2JqZWN0LlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtOb2RlPHZlYzM+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGJpdGFuZ2VudExvY2FsID0gLypAX19QVVJFX18qLyB2YXJ5aW5nKCBnZXRCaXRhbmdlbnQoIG5vcm1hbExvY2FsLmNyb3NzKCB0YW5nZW50TG9jYWwgKSApLCAndl9iaXRhbmdlbnRMb2NhbCcgKS5ub3JtYWxpemUoKS50b1ZhciggJ2JpdGFuZ2VudExvY2FsJyApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSB2ZXJ0ZXggYml0YW5nZW50IGluIHZpZXcgc3BhY2Ugb2YgdGhlIGN1cnJlbnQgcmVuZGVyZWQgb2JqZWN0LlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtOb2RlPHZlYzQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGJpdGFuZ2VudFZpZXcgPSAvKkBfX1BVUkVfXyovIHZhcnlpbmcoIGdldEJpdGFuZ2VudCggbm9ybWFsVmlldy5jcm9zcyggdGFuZ2VudFZpZXcgKSApLCAndl9iaXRhbmdlbnRWaWV3JyApLm5vcm1hbGl6ZSgpLnRvVmFyKCAnYml0YW5nZW50VmlldycgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgdmVydGV4IGJpdGFuZ2VudCBpbiB3b3JsZCBzcGFjZSBvZiB0aGUgY3VycmVudCByZW5kZXJlZCBvYmplY3QuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8dmVjND59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYml0YW5nZW50V29ybGQgPSAvKkBfX1BVUkVfXyovIHZhcnlpbmcoIGdldEJpdGFuZ2VudCggbm9ybWFsV29ybGQuY3Jvc3MoIHRhbmdlbnRXb3JsZCApICksICd2X2JpdGFuZ2VudFdvcmxkJyApLm5vcm1hbGl6ZSgpLnRvVmFyKCAnYml0YW5nZW50V29ybGQnICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHRyYW5zZm9ybWVkIHZlcnRleCBiaXRhbmdlbnQgaW4gdmlldyBzcGFjZSBvZiB0aGUgY3VycmVudCByZW5kZXJlZCBvYmplY3QuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8dmVjND59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdHJhbnNmb3JtZWRCaXRhbmdlbnRWaWV3ID0gLypAX19QVVJFX18qLyBnZXRCaXRhbmdlbnQoIHRyYW5zZm9ybWVkTm9ybWFsVmlldy5jcm9zcyggdHJhbnNmb3JtZWRUYW5nZW50VmlldyApICkubm9ybWFsaXplKCkudG9WYXIoICd0cmFuc2Zvcm1lZEJpdGFuZ2VudFZpZXcnICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHRyYW5zZm9ybWVkIHZlcnRleCBiaXRhbmdlbnQgaW4gd29ybGQgc3BhY2Ugb2YgdGhlIGN1cnJlbnQgcmVuZGVyZWQgb2JqZWN0LlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtOb2RlPHZlYzQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHRyYW5zZm9ybWVkQml0YW5nZW50V29ybGQgPSAvKkBfX1BVUkVfXyovIHRyYW5zZm9ybWVkQml0YW5nZW50Vmlldy50cmFuc2Zvcm1EaXJlY3Rpb24oIGNhbWVyYVZpZXdNYXRyaXggKS5ub3JtYWxpemUoKS50b1ZhciggJ3RyYW5zZm9ybWVkQml0YW5nZW50V29ybGQnICk7XHJcbiIsImltcG9ydCB7IGJpdGFuZ2VudFZpZXcgfSBmcm9tICcuL0JpdGFuZ2VudC5qcyc7XHJcbmltcG9ydCB7IG5vcm1hbFZpZXcsIHRyYW5zZm9ybWVkTm9ybWFsVmlldyB9IGZyb20gJy4vTm9ybWFsLmpzJztcclxuaW1wb3J0IHsgdGFuZ2VudFZpZXcgfSBmcm9tICcuL1RhbmdlbnQuanMnO1xyXG5pbXBvcnQgeyBtYXQzIH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5pbXBvcnQgeyBtaXggfSBmcm9tICcuLi9tYXRoL01hdGhOb2RlLmpzJztcclxuaW1wb3J0IHsgYW5pc290cm9weSwgYW5pc290cm9weUIsIHJvdWdobmVzcyB9IGZyb20gJy4uL2NvcmUvUHJvcGVydHlOb2RlLmpzJztcclxuaW1wb3J0IHsgcG9zaXRpb25WaWV3RGlyZWN0aW9uIH0gZnJvbSAnLi9Qb3NpdGlvbi5qcyc7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIFRCTiBtYXRyaXggaW4gdmlldyBzcGFjZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTxtYXQzPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBUQk5WaWV3TWF0cml4ID0gLypAX19QVVJFX18qLyBtYXQzKCB0YW5nZW50VmlldywgYml0YW5nZW50Vmlldywgbm9ybWFsVmlldyApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBwYXJhbGxheCBkaXJlY3Rpb24uXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8bWF0Mz59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcGFyYWxsYXhEaXJlY3Rpb24gPSAvKkBfX1BVUkVfXyovIHBvc2l0aW9uVmlld0RpcmVjdGlvbi5tdWwoIFRCTlZpZXdNYXRyaXggKS8qLm5vcm1hbGl6ZSgpKi87XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjb21wdXRpbmcgcGFyYWxsYXggdXYgY29vcmRpbmF0ZXMuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMyPn0gdXYgLSBBIHV2IG5vZGUuXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMyPn0gc2NhbGUgLSBBIHNjYWxlIG5vZGUuXHJcbiAqIEByZXR1cm5zIHtOb2RlPHZlYzI+fSBQYXJhbGxheCB1diBjb29yZGluYXRlcy5cclxuICovXHJcbmV4cG9ydCBjb25zdCBwYXJhbGxheFVWID0gKCB1diwgc2NhbGUgKSA9PiB1di5zdWIoIHBhcmFsbGF4RGlyZWN0aW9uLm11bCggc2NhbGUgKSApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY29tcHV0aW5nIGJlbnQgbm9ybWFscy5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHJldHVybnMge05vZGU8dmVjMz59IEJlbnQgbm9ybWFscy5cclxuICovXHJcbmV4cG9ydCBjb25zdCB0cmFuc2Zvcm1lZEJlbnROb3JtYWxWaWV3ID0gLypAX19QVVJFX18qLyAoICgpID0+IHtcclxuXHJcblx0Ly8gaHR0cHM6Ly9nb29nbGUuZ2l0aHViLmlvL2ZpbGFtZW50L0ZpbGFtZW50Lm1kLmh0bWwjbGlnaHRpbmcvaW1hZ2ViYXNlZGxpZ2h0cy9hbmlzb3Ryb3B5XHJcblxyXG5cdGxldCBiZW50Tm9ybWFsID0gYW5pc290cm9weUIuY3Jvc3MoIHBvc2l0aW9uVmlld0RpcmVjdGlvbiApO1xyXG5cdGJlbnROb3JtYWwgPSBiZW50Tm9ybWFsLmNyb3NzKCBhbmlzb3Ryb3B5QiApLm5vcm1hbGl6ZSgpO1xyXG5cdGJlbnROb3JtYWwgPSBtaXgoIGJlbnROb3JtYWwsIHRyYW5zZm9ybWVkTm9ybWFsVmlldywgYW5pc290cm9weS5tdWwoIHJvdWdobmVzcy5vbmVNaW51cygpICkub25lTWludXMoKS5wb3cyKCkucG93MigpICkubm9ybWFsaXplKCk7XHJcblxyXG5cdHJldHVybiBiZW50Tm9ybWFsO1xyXG5cclxuXHJcbn0gKSgpO1xyXG4iLCJpbXBvcnQgVGVtcE5vZGUgZnJvbSAnLi4vY29yZS9UZW1wTm9kZS5qcyc7XHJcbmltcG9ydCB7IGFkZCB9IGZyb20gJy4uL21hdGgvT3BlcmF0b3JOb2RlLmpzJztcclxuXHJcbmltcG9ydCB7IG5vcm1hbFZpZXcsIHRyYW5zZm9ybU5vcm1hbFRvVmlldyB9IGZyb20gJy4uL2FjY2Vzc29ycy9Ob3JtYWwuanMnO1xyXG5pbXBvcnQgeyBwb3NpdGlvblZpZXcgfSBmcm9tICcuLi9hY2Nlc3NvcnMvUG9zaXRpb24uanMnO1xyXG5pbXBvcnQgeyBUQk5WaWV3TWF0cml4IH0gZnJvbSAnLi4vYWNjZXNzb3JzL0FjY2Vzc29yc1V0aWxzLmpzJztcclxuaW1wb3J0IHsgdXYgfSBmcm9tICcuLi9hY2Nlc3NvcnMvVVYuanMnO1xyXG5pbXBvcnQgeyBmYWNlRGlyZWN0aW9uIH0gZnJvbSAnLi9Gcm9udEZhY2luZ05vZGUuanMnO1xyXG5pbXBvcnQgeyBGbiwgbm9kZVByb3h5LCB2ZWMzIH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5cclxuaW1wb3J0IHsgVGFuZ2VudFNwYWNlTm9ybWFsTWFwLCBPYmplY3RTcGFjZU5vcm1hbE1hcCB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcblxyXG4vLyBOb3JtYWwgTWFwcGluZyBXaXRob3V0IFByZWNvbXB1dGVkIFRhbmdlbnRzXHJcbi8vIGh0dHA6Ly93d3cudGhldGVudGhwbGFuZXQuZGUvYXJjaGl2ZXMvMTE4MFxyXG5cclxuY29uc3QgcGVydHVyYk5vcm1hbDJBcmIgPSAvKkBfX1BVUkVfXyovIEZuKCAoIGlucHV0cyApID0+IHtcclxuXHJcblx0Y29uc3QgeyBleWVfcG9zLCBzdXJmX25vcm0sIG1hcE4sIHV2IH0gPSBpbnB1dHM7XHJcblxyXG5cdGNvbnN0IHEwID0gZXllX3Bvcy5kRmR4KCk7XHJcblx0Y29uc3QgcTEgPSBleWVfcG9zLmRGZHkoKTtcclxuXHRjb25zdCBzdDAgPSB1di5kRmR4KCk7XHJcblx0Y29uc3Qgc3QxID0gdXYuZEZkeSgpO1xyXG5cclxuXHRjb25zdCBOID0gc3VyZl9ub3JtOyAvLyBub3JtYWxpemVkXHJcblxyXG5cdGNvbnN0IHExcGVycCA9IHExLmNyb3NzKCBOICk7XHJcblx0Y29uc3QgcTBwZXJwID0gTi5jcm9zcyggcTAgKTtcclxuXHJcblx0Y29uc3QgVCA9IHExcGVycC5tdWwoIHN0MC54ICkuYWRkKCBxMHBlcnAubXVsKCBzdDEueCApICk7XHJcblx0Y29uc3QgQiA9IHExcGVycC5tdWwoIHN0MC55ICkuYWRkKCBxMHBlcnAubXVsKCBzdDEueSApICk7XHJcblxyXG5cdGNvbnN0IGRldCA9IFQuZG90KCBUICkubWF4KCBCLmRvdCggQiApICk7XHJcblx0Y29uc3Qgc2NhbGUgPSBmYWNlRGlyZWN0aW9uLm11bCggZGV0LmludmVyc2VTcXJ0KCkgKTtcclxuXHJcblx0cmV0dXJuIGFkZCggVC5tdWwoIG1hcE4ueCwgc2NhbGUgKSwgQi5tdWwoIG1hcE4ueSwgc2NhbGUgKSwgTi5tdWwoIG1hcE4ueiApICkubm9ybWFsaXplKCk7XHJcblxyXG59ICk7XHJcblxyXG4vKipcclxuICogVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCBmb3IgYXBwbHlpbmcgbm9ybWFscyBtYXBzIHRvIG1hdGVyaWFscy5cclxuICpcclxuICogYGBganNcclxuICogbWF0ZXJpYWwubm9ybWFsTm9kZSA9IG5vcm1hbE1hcCggdGV4dHVyZSggbm9ybWFsVGV4ICkgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBUZW1wTm9kZVxyXG4gKi9cclxuY2xhc3MgTm9ybWFsTWFwTm9kZSBleHRlbmRzIFRlbXBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnTm9ybWFsTWFwTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBub3JtYWwgbWFwIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGU8dmVjMz59IG5vZGUgLSBSZXByZXNlbnRzIHRoZSBub3JtYWwgbWFwIGRhdGEuXHJcblx0ICogQHBhcmFtIHs/Tm9kZTx2ZWMyPn0gW3NjYWxlTm9kZT1udWxsXSAtIENvbnRyb2xzIHRoZSBpbnRlbnNpdHkgb2YgdGhlIGVmZmVjdC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggbm9kZSwgc2NhbGVOb2RlID0gbnVsbCApIHtcclxuXHJcblx0XHRzdXBlciggJ3ZlYzMnICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXByZXNlbnRzIHRoZSBub3JtYWwgbWFwIGRhdGEuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGU8dmVjMz59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9kZSA9IG5vZGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDb250cm9scyB0aGUgaW50ZW5zaXR5IG9mIHRoZSBlZmZlY3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPHZlYzI+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNjYWxlTm9kZSA9IHNjYWxlTm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBub3JtYWwgbWFwIHR5cGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeyhUYW5nZW50U3BhY2VOb3JtYWxNYXB8T2JqZWN0U3BhY2VOb3JtYWxNYXApfVxyXG5cdFx0ICogQGRlZmF1bHQgVGFuZ2VudFNwYWNlTm9ybWFsTWFwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9ybWFsTWFwVHlwZSA9IFRhbmdlbnRTcGFjZU5vcm1hbE1hcDtcclxuXHJcblx0fVxyXG5cclxuXHRzZXR1cCggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCB7IG5vcm1hbE1hcFR5cGUsIHNjYWxlTm9kZSB9ID0gdGhpcztcclxuXHJcblx0XHRsZXQgbm9ybWFsTWFwID0gdGhpcy5ub2RlLm11bCggMi4wICkuc3ViKCAxLjAgKTtcclxuXHJcblx0XHRpZiAoIHNjYWxlTm9kZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdG5vcm1hbE1hcCA9IHZlYzMoIG5vcm1hbE1hcC54eS5tdWwoIHNjYWxlTm9kZSApLCBub3JtYWxNYXAueiApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRsZXQgb3V0cHV0Tm9kZSA9IG51bGw7XHJcblxyXG5cdFx0aWYgKCBub3JtYWxNYXBUeXBlID09PSBPYmplY3RTcGFjZU5vcm1hbE1hcCApIHtcclxuXHJcblx0XHRcdG91dHB1dE5vZGUgPSB0cmFuc2Zvcm1Ob3JtYWxUb1ZpZXcoIG5vcm1hbE1hcCApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIG5vcm1hbE1hcFR5cGUgPT09IFRhbmdlbnRTcGFjZU5vcm1hbE1hcCApIHtcclxuXHJcblx0XHRcdGNvbnN0IHRhbmdlbnQgPSBidWlsZGVyLmhhc0dlb21ldHJ5QXR0cmlidXRlKCAndGFuZ2VudCcgKTtcclxuXHJcblx0XHRcdGlmICggdGFuZ2VudCA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0b3V0cHV0Tm9kZSA9IFRCTlZpZXdNYXRyaXgubXVsKCBub3JtYWxNYXAgKS5ub3JtYWxpemUoKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdG91dHB1dE5vZGUgPSBwZXJ0dXJiTm9ybWFsMkFyYigge1xyXG5cdFx0XHRcdFx0ZXllX3BvczogcG9zaXRpb25WaWV3LFxyXG5cdFx0XHRcdFx0c3VyZl9ub3JtOiBub3JtYWxWaWV3LFxyXG5cdFx0XHRcdFx0bWFwTjogbm9ybWFsTWFwLFxyXG5cdFx0XHRcdFx0dXY6IHV2KClcclxuXHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBvdXRwdXROb2RlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBOb3JtYWxNYXBOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSBub3JtYWwgbWFwIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMzPn0gbm9kZSAtIFJlcHJlc2VudHMgdGhlIG5vcm1hbCBtYXAgZGF0YS5cclxuICogQHBhcmFtIHs/Tm9kZTx2ZWMyPn0gW3NjYWxlTm9kZT1udWxsXSAtIENvbnRyb2xzIHRoZSBpbnRlbnNpdHkgb2YgdGhlIGVmZmVjdC5cclxuICogQHJldHVybnMge05vcm1hbE1hcE5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgbm9ybWFsTWFwID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE5vcm1hbE1hcE5vZGUgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDEsIDIgKTtcclxuIiwiaW1wb3J0IFRlbXBOb2RlIGZyb20gJy4uL2NvcmUvVGVtcE5vZGUuanMnO1xyXG5pbXBvcnQgeyB1diB9IGZyb20gJy4uL2FjY2Vzc29ycy9VVi5qcyc7XHJcbmltcG9ydCB7IG5vcm1hbFZpZXcgfSBmcm9tICcuLi9hY2Nlc3NvcnMvTm9ybWFsLmpzJztcclxuaW1wb3J0IHsgcG9zaXRpb25WaWV3IH0gZnJvbSAnLi4vYWNjZXNzb3JzL1Bvc2l0aW9uLmpzJztcclxuaW1wb3J0IHsgZmFjZURpcmVjdGlvbiB9IGZyb20gJy4vRnJvbnRGYWNpbmdOb2RlLmpzJztcclxuaW1wb3J0IHsgRm4sIG5vZGVQcm94eSwgZmxvYXQsIHZlYzIgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcblxyXG4vLyBCdW1wIE1hcHBpbmcgVW5wYXJhbWV0cml6ZWQgU3VyZmFjZXMgb24gdGhlIEdQVSBieSBNb3J0ZW4gUy4gTWlra2Vsc2VuXHJcbi8vIGh0dHBzOi8vbW1pa2suZ2l0aHViLmlvL3BhcGVyczNkL21tX3NmZ3JhZF9idW1wLnBkZlxyXG5cclxuY29uc3QgZEhkeHlfZndkID0gRm4oICggeyB0ZXh0dXJlTm9kZSwgYnVtcFNjYWxlIH0gKSA9PiB7XHJcblxyXG5cdC8vIEl0J3MgdXNlZCB0byBwcmVzZXJ2ZSB0aGUgc2FtZSBUZXh0dXJlTm9kZSBpbnN0YW5jZVxyXG5cdGNvbnN0IHNhbXBsZVRleHR1cmUgPSAoIGNhbGxiYWNrICkgPT4gdGV4dHVyZU5vZGUuY2FjaGUoKS5jb250ZXh0KCB7IGdldFVWOiAoIHRleE5vZGUgKSA9PiBjYWxsYmFjayggdGV4Tm9kZS51dk5vZGUgfHwgdXYoKSApLCBmb3JjZVVWQ29udGV4dDogdHJ1ZSB9ICk7XHJcblxyXG5cdGNvbnN0IEhsbCA9IGZsb2F0KCBzYW1wbGVUZXh0dXJlKCAoIHV2Tm9kZSApID0+IHV2Tm9kZSApICk7XHJcblxyXG5cdHJldHVybiB2ZWMyKFxyXG5cdFx0ZmxvYXQoIHNhbXBsZVRleHR1cmUoICggdXZOb2RlICkgPT4gdXZOb2RlLmFkZCggdXZOb2RlLmRGZHgoKSApICkgKS5zdWIoIEhsbCApLFxyXG5cdFx0ZmxvYXQoIHNhbXBsZVRleHR1cmUoICggdXZOb2RlICkgPT4gdXZOb2RlLmFkZCggdXZOb2RlLmRGZHkoKSApICkgKS5zdWIoIEhsbCApXHJcblx0KS5tdWwoIGJ1bXBTY2FsZSApO1xyXG5cclxufSApO1xyXG5cclxuLy8gRXZhbHVhdGUgdGhlIGRlcml2YXRpdmUgb2YgdGhlIGhlaWdodCB3LnIudC4gc2NyZWVuLXNwYWNlIHVzaW5nIGZvcndhcmQgZGlmZmVyZW5jaW5nIChsaXN0aW5nIDIpXHJcblxyXG5jb25zdCBwZXJ0dXJiTm9ybWFsQXJiID0gRm4oICggaW5wdXRzICkgPT4ge1xyXG5cclxuXHRjb25zdCB7IHN1cmZfcG9zLCBzdXJmX25vcm0sIGRIZHh5IH0gPSBpbnB1dHM7XHJcblxyXG5cdC8vIG5vcm1hbGl6ZSBpcyBkb25lIHRvIGVuc3VyZSB0aGF0IHRoZSBidW1wIG1hcCBsb29rcyB0aGUgc2FtZSByZWdhcmRsZXNzIG9mIHRoZSB0ZXh0dXJlJ3Mgc2NhbGVcclxuXHRjb25zdCB2U2lnbWFYID0gc3VyZl9wb3MuZEZkeCgpLm5vcm1hbGl6ZSgpO1xyXG5cdGNvbnN0IHZTaWdtYVkgPSBzdXJmX3Bvcy5kRmR5KCkubm9ybWFsaXplKCk7XHJcblx0Y29uc3Qgdk4gPSBzdXJmX25vcm07IC8vIG5vcm1hbGl6ZWRcclxuXHJcblx0Y29uc3QgUjEgPSB2U2lnbWFZLmNyb3NzKCB2TiApO1xyXG5cdGNvbnN0IFIyID0gdk4uY3Jvc3MoIHZTaWdtYVggKTtcclxuXHJcblx0Y29uc3QgZkRldCA9IHZTaWdtYVguZG90KCBSMSApLm11bCggZmFjZURpcmVjdGlvbiApO1xyXG5cclxuXHRjb25zdCB2R3JhZCA9IGZEZXQuc2lnbigpLm11bCggZEhkeHkueC5tdWwoIFIxICkuYWRkKCBkSGR4eS55Lm11bCggUjIgKSApICk7XHJcblxyXG5cdHJldHVybiBmRGV0LmFicygpLm11bCggc3VyZl9ub3JtICkuc3ViKCB2R3JhZCApLm5vcm1hbGl6ZSgpO1xyXG5cclxufSApO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgZm9yIGFwcGx5aW5nIGJ1bXAgbWFwcyB0byBtYXRlcmlhbHMuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIG1hdGVyaWFsLm5vcm1hbE5vZGUgPSBidW1wTWFwKCB0ZXh0dXJlKCBidW1wVGV4ICkgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBUZW1wTm9kZVxyXG4gKi9cclxuY2xhc3MgQnVtcE1hcE5vZGUgZXh0ZW5kcyBUZW1wTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ0J1bXBNYXBOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGJ1bXAgbWFwIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSB0ZXh0dXJlTm9kZSAtIFJlcHJlc2VudHMgdGhlIGJ1bXAgbWFwIGRhdGEuXHJcblx0ICogQHBhcmFtIHs/Tm9kZTxmbG9hdD59IFtzY2FsZU5vZGU9bnVsbF0gLSBDb250cm9scyB0aGUgaW50ZW5zaXR5IG9mIHRoZSBidW1wIGVmZmVjdC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggdGV4dHVyZU5vZGUsIHNjYWxlTm9kZSA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoICd2ZWMzJyApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVwcmVzZW50cyB0aGUgYnVtcCBtYXAgZGF0YS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZTxmbG9hdD59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudGV4dHVyZU5vZGUgPSB0ZXh0dXJlTm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENvbnRyb2xzIHRoZSBpbnRlbnNpdHkgb2YgdGhlIGJ1bXAgZWZmZWN0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Tm9kZTxmbG9hdD59XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2NhbGVOb2RlID0gc2NhbGVOb2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdHNldHVwKCkge1xyXG5cclxuXHRcdGNvbnN0IGJ1bXBTY2FsZSA9IHRoaXMuc2NhbGVOb2RlICE9PSBudWxsID8gdGhpcy5zY2FsZU5vZGUgOiAxO1xyXG5cdFx0Y29uc3QgZEhkeHkgPSBkSGR4eV9md2QoIHsgdGV4dHVyZU5vZGU6IHRoaXMudGV4dHVyZU5vZGUsIGJ1bXBTY2FsZSB9ICk7XHJcblxyXG5cdFx0cmV0dXJuIHBlcnR1cmJOb3JtYWxBcmIoIHtcclxuXHRcdFx0c3VyZl9wb3M6IHBvc2l0aW9uVmlldyxcclxuXHRcdFx0c3VyZl9ub3JtOiBub3JtYWxWaWV3LFxyXG5cdFx0XHRkSGR4eVxyXG5cdFx0fSApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBCdW1wTWFwTm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgYnVtcCBtYXAgbm9kZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlPGZsb2F0Pn0gdGV4dHVyZU5vZGUgLSBSZXByZXNlbnRzIHRoZSBidW1wIG1hcCBkYXRhLlxyXG4gKiBAcGFyYW0gez9Ob2RlPGZsb2F0Pn0gW3NjYWxlTm9kZT1udWxsXSAtIENvbnRyb2xzIHRoZSBpbnRlbnNpdHkgb2YgdGhlIGJ1bXAgZWZmZWN0LlxyXG4gKiBAcmV0dXJucyB7QnVtcE1hcE5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYnVtcE1hcCA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBCdW1wTWFwTm9kZSApLnNldFBhcmFtZXRlckxlbmd0aCggMSwgMiApO1xyXG4iLCJpbXBvcnQgTm9kZSBmcm9tICcuLi9jb3JlL05vZGUuanMnO1xyXG5pbXBvcnQgeyByZWZlcmVuY2UgfSBmcm9tICcuL1JlZmVyZW5jZU5vZGUuanMnO1xyXG5pbXBvcnQgeyBtYXRlcmlhbFJlZmVyZW5jZSB9IGZyb20gJy4vTWF0ZXJpYWxSZWZlcmVuY2VOb2RlLmpzJztcclxuaW1wb3J0IHsgbm9ybWFsVmlldyB9IGZyb20gJy4vTm9ybWFsLmpzJztcclxuaW1wb3J0IHsgbm9kZUltbXV0YWJsZSwgZmxvYXQsIHZlYzIsIHZlYzMsIG1hdDIgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcbmltcG9ydCB7IHVuaWZvcm0gfSBmcm9tICcuLi9jb3JlL1VuaWZvcm1Ob2RlLmpzJztcclxuaW1wb3J0IHsgbm9ybWFsTWFwIH0gZnJvbSAnLi4vZGlzcGxheS9Ob3JtYWxNYXBOb2RlLmpzJztcclxuaW1wb3J0IHsgYnVtcE1hcCB9IGZyb20gJy4uL2Rpc3BsYXkvQnVtcE1hcE5vZGUuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IyLmpzJztcclxuXHJcbmNvbnN0IF9wcm9wZXJ0eUNhY2hlID0gbmV3IE1hcCgpO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgY2xhc3Mgc2hvdWxkIHNpbXBsaWZ5IHRoZSBub2RlIGFjY2VzcyB0byBtYXRlcmlhbCBwcm9wZXJ0aWVzLlxyXG4gKiBJdCBpbnRlcm5hbCB1c2VzIHJlZmVyZW5jZSBub2RlcyB0byBtYWtlIHN1cmUgIGNoYW5nZXMgdG8gbWF0ZXJpYWxcclxuICogcHJvcGVydGllcyBhcmUgYXV0b21hdGljYWxseSByZWZsZWN0ZWQgdG8gcHJlZGVmaW5lZCBUU0wgb2JqZWN0c1xyXG4gKiBsaWtlIGUuZy4gYG1hdGVyaWFsQ29sb3JgLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTm9kZVxyXG4gKi9cclxuY2xhc3MgTWF0ZXJpYWxOb2RlIGV4dGVuZHMgTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ01hdGVyaWFsTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBtYXRlcmlhbCBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNjb3BlIC0gVGhlIHNjb3BlIGRlZmluZXMgd2hhdCBraW5kIG9mIG1hdGVyaWFsIHByb3BlcnR5IGlzIHJlZmVycmVkIGJ5IHRoZSBub2RlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBzY29wZSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHNjb3BlIGRlZmluZXMgd2hhdCBtYXRlcmlhbCBwcm9wZXJ0eSBpcyByZWZlcnJlZCBieSB0aGUgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNjb3BlID0gc2NvcGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIGNhY2hlZCByZWZlcmVuY2Ugbm9kZSBmb3IgdGhlIGdpdmVuIHByb3BlcnR5IGFuZCB0eXBlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IC0gVGhlIG5hbWUgb2YgdGhlIG1hdGVyaWFsIHByb3BlcnR5LlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIHVuaWZvcm0gdHlwZSBvZiB0aGUgcHJvcGVydHkuXHJcblx0ICogQHJldHVybiB7TWF0ZXJpYWxSZWZlcmVuY2VOb2RlfSBBIG1hdGVyaWFsIHJlZmVyZW5jZSBub2RlIHJlcHJlc2VudGluZyB0aGUgcHJvcGVydHkgYWNjZXNzLlxyXG5cdCAqL1xyXG5cdGdldENhY2hlKCBwcm9wZXJ0eSwgdHlwZSApIHtcclxuXHJcblx0XHRsZXQgbm9kZSA9IF9wcm9wZXJ0eUNhY2hlLmdldCggcHJvcGVydHkgKTtcclxuXHJcblx0XHRpZiAoIG5vZGUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdG5vZGUgPSBtYXRlcmlhbFJlZmVyZW5jZSggcHJvcGVydHksIHR5cGUgKTtcclxuXHJcblx0XHRcdF9wcm9wZXJ0eUNhY2hlLnNldCggcHJvcGVydHksIG5vZGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG5vZGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIGZsb2F0LXR5cGVkIG1hdGVyaWFsIHJlZmVyZW5jZSBub2RlIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkgbmFtZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSAtIFRoZSBuYW1lIG9mIHRoZSBtYXRlcmlhbCBwcm9wZXJ0eS5cclxuXHQgKiBAcmV0dXJuIHtNYXRlcmlhbFJlZmVyZW5jZU5vZGU8ZmxvYXQ+fSBBIG1hdGVyaWFsIHJlZmVyZW5jZSBub2RlIHJlcHJlc2VudGluZyB0aGUgcHJvcGVydHkgYWNjZXNzLlxyXG5cdCAqL1xyXG5cdGdldEZsb2F0KCBwcm9wZXJ0eSApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5nZXRDYWNoZSggcHJvcGVydHksICdmbG9hdCcgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgY29sb3ItdHlwZWQgbWF0ZXJpYWwgcmVmZXJlbmNlIG5vZGUgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eSBuYW1lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IC0gVGhlIG5hbWUgb2YgdGhlIG1hdGVyaWFsIHByb3BlcnR5LlxyXG5cdCAqIEByZXR1cm4ge01hdGVyaWFsUmVmZXJlbmNlTm9kZTxjb2xvcj59IEEgbWF0ZXJpYWwgcmVmZXJlbmNlIG5vZGUgcmVwcmVzZW50aW5nIHRoZSBwcm9wZXJ0eSBhY2Nlc3MuXHJcblx0ICovXHJcblx0Z2V0Q29sb3IoIHByb3BlcnR5ICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmdldENhY2hlKCBwcm9wZXJ0eSwgJ2NvbG9yJyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSB0ZXh0dXJlLXR5cGVkIG1hdGVyaWFsIHJlZmVyZW5jZSBub2RlIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkgbmFtZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSAtIFRoZSBuYW1lIG9mIHRoZSBtYXRlcmlhbCBwcm9wZXJ0eS5cclxuXHQgKiBAcmV0dXJuIHtNYXRlcmlhbFJlZmVyZW5jZU5vZGV9IEEgbWF0ZXJpYWwgcmVmZXJlbmNlIG5vZGUgcmVwcmVzZW50aW5nIHRoZSBwcm9wZXJ0eSBhY2Nlc3MuXHJcblx0ICovXHJcblx0Z2V0VGV4dHVyZSggcHJvcGVydHkgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZ2V0Q2FjaGUoIHByb3BlcnR5ID09PSAnbWFwJyA/ICdtYXAnIDogcHJvcGVydHkgKyAnTWFwJywgJ3RleHR1cmUnICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIG5vZGUgc2V0dXAgaXMgZG9uZSBkZXBlbmRpbmcgb24gdGhlIHNlbGVjdGVkIHNjb3BlLiBNdWx0aXBsZSBtYXRlcmlhbCBwcm9wZXJ0aWVzXHJcblx0ICogbWlnaHQgYmUgZ3JvdXBlZCBpbnRvIGEgc2luZ2xlIG5vZGUgY29tcG9zaXRpb24gaWYgdGhleSBsb2dpY2FsbHkgYmVsb25nIHRvZ2V0aGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtOb2RlfSBUaGUgbm9kZSByZXByZXNlbnRpbmcgdGhlIHNlbGVjdGVkIHNjb3BlLlxyXG5cdCAqL1xyXG5cdHNldHVwKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IG1hdGVyaWFsID0gYnVpbGRlci5jb250ZXh0Lm1hdGVyaWFsO1xyXG5cdFx0Y29uc3Qgc2NvcGUgPSB0aGlzLnNjb3BlO1xyXG5cclxuXHRcdGxldCBub2RlID0gbnVsbDtcclxuXHJcblx0XHRpZiAoIHNjb3BlID09PSBNYXRlcmlhbE5vZGUuQ09MT1IgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBjb2xvck5vZGUgPSBtYXRlcmlhbC5jb2xvciAhPT0gdW5kZWZpbmVkID8gdGhpcy5nZXRDb2xvciggc2NvcGUgKSA6IHZlYzMoKTtcclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWwubWFwICYmIG1hdGVyaWFsLm1hcC5pc1RleHR1cmUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdG5vZGUgPSBjb2xvck5vZGUubXVsKCB0aGlzLmdldFRleHR1cmUoICdtYXAnICkgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdG5vZGUgPSBjb2xvck5vZGU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmICggc2NvcGUgPT09IE1hdGVyaWFsTm9kZS5PUEFDSVRZICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgb3BhY2l0eU5vZGUgPSB0aGlzLmdldEZsb2F0KCBzY29wZSApO1xyXG5cclxuXHRcdFx0aWYgKCBtYXRlcmlhbC5hbHBoYU1hcCAmJiBtYXRlcmlhbC5hbHBoYU1hcC5pc1RleHR1cmUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdG5vZGUgPSBvcGFjaXR5Tm9kZS5tdWwoIHRoaXMuZ2V0VGV4dHVyZSggJ2FscGhhJyApICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRub2RlID0gb3BhY2l0eU5vZGU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmICggc2NvcGUgPT09IE1hdGVyaWFsTm9kZS5TUEVDVUxBUl9TVFJFTkdUSCApIHtcclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWwuc3BlY3VsYXJNYXAgJiYgbWF0ZXJpYWwuc3BlY3VsYXJNYXAuaXNUZXh0dXJlID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRub2RlID0gdGhpcy5nZXRUZXh0dXJlKCAnc3BlY3VsYXInICkucjtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdG5vZGUgPSBmbG9hdCggMSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHNjb3BlID09PSBNYXRlcmlhbE5vZGUuU1BFQ1VMQVJfSU5URU5TSVRZICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgc3BlY3VsYXJJbnRlbnNpdHlOb2RlID0gdGhpcy5nZXRGbG9hdCggc2NvcGUgKTtcclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWwuc3BlY3VsYXJJbnRlbnNpdHlNYXAgJiYgbWF0ZXJpYWwuc3BlY3VsYXJJbnRlbnNpdHlNYXAuaXNUZXh0dXJlID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRub2RlID0gc3BlY3VsYXJJbnRlbnNpdHlOb2RlLm11bCggdGhpcy5nZXRUZXh0dXJlKCBzY29wZSApLmEgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdG5vZGUgPSBzcGVjdWxhckludGVuc2l0eU5vZGU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmICggc2NvcGUgPT09IE1hdGVyaWFsTm9kZS5TUEVDVUxBUl9DT0xPUiApIHtcclxuXHJcblx0XHRcdGNvbnN0IHNwZWN1bGFyQ29sb3JOb2RlID0gdGhpcy5nZXRDb2xvciggc2NvcGUgKTtcclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWwuc3BlY3VsYXJDb2xvck1hcCAmJiBtYXRlcmlhbC5zcGVjdWxhckNvbG9yTWFwLmlzVGV4dHVyZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0bm9kZSA9IHNwZWN1bGFyQ29sb3JOb2RlLm11bCggdGhpcy5nZXRUZXh0dXJlKCBzY29wZSApLnJnYiApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0bm9kZSA9IHNwZWN1bGFyQ29sb3JOb2RlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHNjb3BlID09PSBNYXRlcmlhbE5vZGUuUk9VR0hORVNTICkgeyAvLyBUT0RPOiBjbGVhbnVwIHNpbWlsYXIgYnJhbmNoZXNcclxuXHJcblx0XHRcdGNvbnN0IHJvdWdobmVzc05vZGUgPSB0aGlzLmdldEZsb2F0KCBzY29wZSApO1xyXG5cclxuXHRcdFx0aWYgKCBtYXRlcmlhbC5yb3VnaG5lc3NNYXAgJiYgbWF0ZXJpYWwucm91Z2huZXNzTWFwLmlzVGV4dHVyZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0bm9kZSA9IHJvdWdobmVzc05vZGUubXVsKCB0aGlzLmdldFRleHR1cmUoIHNjb3BlICkuZyApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0bm9kZSA9IHJvdWdobmVzc05vZGU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmICggc2NvcGUgPT09IE1hdGVyaWFsTm9kZS5NRVRBTE5FU1MgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBtZXRhbG5lc3NOb2RlID0gdGhpcy5nZXRGbG9hdCggc2NvcGUgKTtcclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWwubWV0YWxuZXNzTWFwICYmIG1hdGVyaWFsLm1ldGFsbmVzc01hcC5pc1RleHR1cmUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdG5vZGUgPSBtZXRhbG5lc3NOb2RlLm11bCggdGhpcy5nZXRUZXh0dXJlKCBzY29wZSApLmIgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdG5vZGUgPSBtZXRhbG5lc3NOb2RlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHNjb3BlID09PSBNYXRlcmlhbE5vZGUuRU1JU1NJVkUgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBlbWlzc2l2ZUludGVuc2l0eU5vZGUgPSB0aGlzLmdldEZsb2F0KCAnZW1pc3NpdmVJbnRlbnNpdHknICk7XHJcblx0XHRcdGNvbnN0IGVtaXNzaXZlTm9kZSA9IHRoaXMuZ2V0Q29sb3IoIHNjb3BlICkubXVsKCBlbWlzc2l2ZUludGVuc2l0eU5vZGUgKTtcclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWwuZW1pc3NpdmVNYXAgJiYgbWF0ZXJpYWwuZW1pc3NpdmVNYXAuaXNUZXh0dXJlID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRub2RlID0gZW1pc3NpdmVOb2RlLm11bCggdGhpcy5nZXRUZXh0dXJlKCBzY29wZSApICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRub2RlID0gZW1pc3NpdmVOb2RlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHNjb3BlID09PSBNYXRlcmlhbE5vZGUuTk9STUFMICkge1xyXG5cclxuXHRcdFx0aWYgKCBtYXRlcmlhbC5ub3JtYWxNYXAgKSB7XHJcblxyXG5cdFx0XHRcdG5vZGUgPSBub3JtYWxNYXAoIHRoaXMuZ2V0VGV4dHVyZSggJ25vcm1hbCcgKSwgdGhpcy5nZXRDYWNoZSggJ25vcm1hbFNjYWxlJywgJ3ZlYzInICkgKTtcclxuXHRcdFx0XHRub2RlLm5vcm1hbE1hcFR5cGUgPSBtYXRlcmlhbC5ub3JtYWxNYXBUeXBlO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuYnVtcE1hcCApIHtcclxuXHJcblx0XHRcdFx0bm9kZSA9IGJ1bXBNYXAoIHRoaXMuZ2V0VGV4dHVyZSggJ2J1bXAnICkuciwgdGhpcy5nZXRGbG9hdCggJ2J1bXBTY2FsZScgKSApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0bm9kZSA9IG5vcm1hbFZpZXc7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmICggc2NvcGUgPT09IE1hdGVyaWFsTm9kZS5DTEVBUkNPQVQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBjbGVhcmNvYXROb2RlID0gdGhpcy5nZXRGbG9hdCggc2NvcGUgKTtcclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWwuY2xlYXJjb2F0TWFwICYmIG1hdGVyaWFsLmNsZWFyY29hdE1hcC5pc1RleHR1cmUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdG5vZGUgPSBjbGVhcmNvYXROb2RlLm11bCggdGhpcy5nZXRUZXh0dXJlKCBzY29wZSApLnIgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdG5vZGUgPSBjbGVhcmNvYXROb2RlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHNjb3BlID09PSBNYXRlcmlhbE5vZGUuQ0xFQVJDT0FUX1JPVUdITkVTUyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGNsZWFyY29hdFJvdWdobmVzc05vZGUgPSB0aGlzLmdldEZsb2F0KCBzY29wZSApO1xyXG5cclxuXHRcdFx0aWYgKCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3NNYXAgJiYgbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzTWFwLmlzVGV4dHVyZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0bm9kZSA9IGNsZWFyY29hdFJvdWdobmVzc05vZGUubXVsKCB0aGlzLmdldFRleHR1cmUoIHNjb3BlICkuciApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0bm9kZSA9IGNsZWFyY29hdFJvdWdobmVzc05vZGU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmICggc2NvcGUgPT09IE1hdGVyaWFsTm9kZS5DTEVBUkNPQVRfTk9STUFMICkge1xyXG5cclxuXHRcdFx0aWYgKCBtYXRlcmlhbC5jbGVhcmNvYXROb3JtYWxNYXAgKSB7XHJcblxyXG5cdFx0XHRcdG5vZGUgPSBub3JtYWxNYXAoIHRoaXMuZ2V0VGV4dHVyZSggc2NvcGUgKSwgdGhpcy5nZXRDYWNoZSggc2NvcGUgKyAnU2NhbGUnLCAndmVjMicgKSApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0bm9kZSA9IG5vcm1hbFZpZXc7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmICggc2NvcGUgPT09IE1hdGVyaWFsTm9kZS5TSEVFTiApIHtcclxuXHJcblx0XHRcdGNvbnN0IHNoZWVuTm9kZSA9IHRoaXMuZ2V0Q29sb3IoICdzaGVlbkNvbG9yJyApLm11bCggdGhpcy5nZXRGbG9hdCggJ3NoZWVuJyApICk7IC8vIE1vdmUgdGhpcyBtdWwoKSB0byBDUFVcclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWwuc2hlZW5Db2xvck1hcCAmJiBtYXRlcmlhbC5zaGVlbkNvbG9yTWFwLmlzVGV4dHVyZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0bm9kZSA9IHNoZWVuTm9kZS5tdWwoIHRoaXMuZ2V0VGV4dHVyZSggJ3NoZWVuQ29sb3InICkucmdiICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRub2RlID0gc2hlZW5Ob2RlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHNjb3BlID09PSBNYXRlcmlhbE5vZGUuU0hFRU5fUk9VR0hORVNTICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgc2hlZW5Sb3VnaG5lc3NOb2RlID0gdGhpcy5nZXRGbG9hdCggc2NvcGUgKTtcclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWwuc2hlZW5Sb3VnaG5lc3NNYXAgJiYgbWF0ZXJpYWwuc2hlZW5Sb3VnaG5lc3NNYXAuaXNUZXh0dXJlID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRub2RlID0gc2hlZW5Sb3VnaG5lc3NOb2RlLm11bCggdGhpcy5nZXRUZXh0dXJlKCBzY29wZSApLmEgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdG5vZGUgPSBzaGVlblJvdWdobmVzc05vZGU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRub2RlID0gbm9kZS5jbGFtcCggMC4wNywgMS4wICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggc2NvcGUgPT09IE1hdGVyaWFsTm9kZS5BTklTT1RST1BZICkge1xyXG5cclxuXHRcdFx0aWYgKCBtYXRlcmlhbC5hbmlzb3Ryb3B5TWFwICYmIG1hdGVyaWFsLmFuaXNvdHJvcHlNYXAuaXNUZXh0dXJlID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBhbmlzb3Ryb3B5UG9sYXIgPSB0aGlzLmdldFRleHR1cmUoIHNjb3BlICk7XHJcblx0XHRcdFx0Y29uc3QgYW5pc290cm9weU1hdCA9IG1hdDIoIG1hdGVyaWFsQW5pc290cm9weVZlY3Rvci54LCBtYXRlcmlhbEFuaXNvdHJvcHlWZWN0b3IueSwgbWF0ZXJpYWxBbmlzb3Ryb3B5VmVjdG9yLnkubmVnYXRlKCksIG1hdGVyaWFsQW5pc290cm9weVZlY3Rvci54ICk7XHJcblxyXG5cdFx0XHRcdG5vZGUgPSBhbmlzb3Ryb3B5TWF0Lm11bCggYW5pc290cm9weVBvbGFyLnJnLm11bCggMi4wICkuc3ViKCB2ZWMyKCAxLjAgKSApLm5vcm1hbGl6ZSgpLm11bCggYW5pc290cm9weVBvbGFyLmIgKSApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0bm9kZSA9IG1hdGVyaWFsQW5pc290cm9weVZlY3RvcjtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2UgaWYgKCBzY29wZSA9PT0gTWF0ZXJpYWxOb2RlLklSSURFU0NFTkNFX1RISUNLTkVTUyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGlyaWRlc2NlbmNlVGhpY2tuZXNzTWF4aW11bSA9IHJlZmVyZW5jZSggJzEnLCAnZmxvYXQnLCBtYXRlcmlhbC5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlICk7XHJcblxyXG5cdFx0XHRpZiAoIG1hdGVyaWFsLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBpcmlkZXNjZW5jZVRoaWNrbmVzc01pbmltdW0gPSByZWZlcmVuY2UoICcwJywgJ2Zsb2F0JywgbWF0ZXJpYWwuaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZSApO1xyXG5cclxuXHRcdFx0XHRub2RlID0gaXJpZGVzY2VuY2VUaGlja25lc3NNYXhpbXVtLnN1YiggaXJpZGVzY2VuY2VUaGlja25lc3NNaW5pbXVtICkubXVsKCB0aGlzLmdldFRleHR1cmUoIHNjb3BlICkuZyApLmFkZCggaXJpZGVzY2VuY2VUaGlja25lc3NNaW5pbXVtICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRub2RlID0gaXJpZGVzY2VuY2VUaGlja25lc3NNYXhpbXVtO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHNjb3BlID09PSBNYXRlcmlhbE5vZGUuVFJBTlNNSVNTSU9OICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdHJhbnNtaXNzaW9uTm9kZSA9IHRoaXMuZ2V0RmxvYXQoIHNjb3BlICk7XHJcblxyXG5cdFx0XHRpZiAoIG1hdGVyaWFsLnRyYW5zbWlzc2lvbk1hcCApIHtcclxuXHJcblx0XHRcdFx0bm9kZSA9IHRyYW5zbWlzc2lvbk5vZGUubXVsKCB0aGlzLmdldFRleHR1cmUoIHNjb3BlICkuciApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0bm9kZSA9IHRyYW5zbWlzc2lvbk5vZGU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmICggc2NvcGUgPT09IE1hdGVyaWFsTm9kZS5USElDS05FU1MgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB0aGlja25lc3NOb2RlID0gdGhpcy5nZXRGbG9hdCggc2NvcGUgKTtcclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWwudGhpY2tuZXNzTWFwICkge1xyXG5cclxuXHRcdFx0XHRub2RlID0gdGhpY2tuZXNzTm9kZS5tdWwoIHRoaXMuZ2V0VGV4dHVyZSggc2NvcGUgKS5nICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRub2RlID0gdGhpY2tuZXNzTm9kZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2UgaWYgKCBzY29wZSA9PT0gTWF0ZXJpYWxOb2RlLklPUiApIHtcclxuXHJcblx0XHRcdG5vZGUgPSB0aGlzLmdldEZsb2F0KCBzY29wZSApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHNjb3BlID09PSBNYXRlcmlhbE5vZGUuTElHSFRfTUFQICkge1xyXG5cclxuXHRcdFx0bm9kZSA9IHRoaXMuZ2V0VGV4dHVyZSggc2NvcGUgKS5yZ2IubXVsKCB0aGlzLmdldEZsb2F0KCAnbGlnaHRNYXBJbnRlbnNpdHknICkgKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBzY29wZSA9PT0gTWF0ZXJpYWxOb2RlLkFPICkge1xyXG5cclxuXHRcdFx0bm9kZSA9IHRoaXMuZ2V0VGV4dHVyZSggc2NvcGUgKS5yLnN1YiggMS4wICkubXVsKCB0aGlzLmdldEZsb2F0KCAnYW9NYXBJbnRlbnNpdHknICkgKS5hZGQoIDEuMCApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRjb25zdCBvdXRwdXRUeXBlID0gdGhpcy5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cclxuXHRcdFx0bm9kZSA9IHRoaXMuZ2V0Q2FjaGUoIHNjb3BlLCBvdXRwdXRUeXBlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBub2RlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5NYXRlcmlhbE5vZGUuQUxQSEFfVEVTVCA9ICdhbHBoYVRlc3QnO1xyXG5NYXRlcmlhbE5vZGUuQ09MT1IgPSAnY29sb3InO1xyXG5NYXRlcmlhbE5vZGUuT1BBQ0lUWSA9ICdvcGFjaXR5JztcclxuTWF0ZXJpYWxOb2RlLlNISU5JTkVTUyA9ICdzaGluaW5lc3MnO1xyXG5NYXRlcmlhbE5vZGUuU1BFQ1VMQVIgPSAnc3BlY3VsYXInO1xyXG5NYXRlcmlhbE5vZGUuU1BFQ1VMQVJfU1RSRU5HVEggPSAnc3BlY3VsYXJTdHJlbmd0aCc7XHJcbk1hdGVyaWFsTm9kZS5TUEVDVUxBUl9JTlRFTlNJVFkgPSAnc3BlY3VsYXJJbnRlbnNpdHknO1xyXG5NYXRlcmlhbE5vZGUuU1BFQ1VMQVJfQ09MT1IgPSAnc3BlY3VsYXJDb2xvcic7XHJcbk1hdGVyaWFsTm9kZS5SRUZMRUNUSVZJVFkgPSAncmVmbGVjdGl2aXR5JztcclxuTWF0ZXJpYWxOb2RlLlJPVUdITkVTUyA9ICdyb3VnaG5lc3MnO1xyXG5NYXRlcmlhbE5vZGUuTUVUQUxORVNTID0gJ21ldGFsbmVzcyc7XHJcbk1hdGVyaWFsTm9kZS5OT1JNQUwgPSAnbm9ybWFsJztcclxuTWF0ZXJpYWxOb2RlLkNMRUFSQ09BVCA9ICdjbGVhcmNvYXQnO1xyXG5NYXRlcmlhbE5vZGUuQ0xFQVJDT0FUX1JPVUdITkVTUyA9ICdjbGVhcmNvYXRSb3VnaG5lc3MnO1xyXG5NYXRlcmlhbE5vZGUuQ0xFQVJDT0FUX05PUk1BTCA9ICdjbGVhcmNvYXROb3JtYWwnO1xyXG5NYXRlcmlhbE5vZGUuRU1JU1NJVkUgPSAnZW1pc3NpdmUnO1xyXG5NYXRlcmlhbE5vZGUuUk9UQVRJT04gPSAncm90YXRpb24nO1xyXG5NYXRlcmlhbE5vZGUuU0hFRU4gPSAnc2hlZW4nO1xyXG5NYXRlcmlhbE5vZGUuU0hFRU5fUk9VR0hORVNTID0gJ3NoZWVuUm91Z2huZXNzJztcclxuTWF0ZXJpYWxOb2RlLkFOSVNPVFJPUFkgPSAnYW5pc290cm9weSc7XHJcbk1hdGVyaWFsTm9kZS5JUklERVNDRU5DRSA9ICdpcmlkZXNjZW5jZSc7XHJcbk1hdGVyaWFsTm9kZS5JUklERVNDRU5DRV9JT1IgPSAnaXJpZGVzY2VuY2VJT1InO1xyXG5NYXRlcmlhbE5vZGUuSVJJREVTQ0VOQ0VfVEhJQ0tORVNTID0gJ2lyaWRlc2NlbmNlVGhpY2tuZXNzJztcclxuTWF0ZXJpYWxOb2RlLklPUiA9ICdpb3InO1xyXG5NYXRlcmlhbE5vZGUuVFJBTlNNSVNTSU9OID0gJ3RyYW5zbWlzc2lvbic7XHJcbk1hdGVyaWFsTm9kZS5USElDS05FU1MgPSAndGhpY2tuZXNzJztcclxuTWF0ZXJpYWxOb2RlLkFUVEVOVUFUSU9OX0RJU1RBTkNFID0gJ2F0dGVudWF0aW9uRGlzdGFuY2UnO1xyXG5NYXRlcmlhbE5vZGUuQVRURU5VQVRJT05fQ09MT1IgPSAnYXR0ZW51YXRpb25Db2xvcic7XHJcbk1hdGVyaWFsTm9kZS5MSU5FX1NDQUxFID0gJ3NjYWxlJztcclxuTWF0ZXJpYWxOb2RlLkxJTkVfREFTSF9TSVpFID0gJ2Rhc2hTaXplJztcclxuTWF0ZXJpYWxOb2RlLkxJTkVfR0FQX1NJWkUgPSAnZ2FwU2l6ZSc7XHJcbk1hdGVyaWFsTm9kZS5MSU5FX1dJRFRIID0gJ2xpbmV3aWR0aCc7XHJcbk1hdGVyaWFsTm9kZS5MSU5FX0RBU0hfT0ZGU0VUID0gJ2Rhc2hPZmZzZXQnO1xyXG5NYXRlcmlhbE5vZGUuUE9JTlRfU0laRSA9ICdzaXplJztcclxuTWF0ZXJpYWxOb2RlLkRJU1BFUlNJT04gPSAnZGlzcGVyc2lvbic7XHJcbk1hdGVyaWFsTm9kZS5MSUdIVF9NQVAgPSAnbGlnaHQnO1xyXG5NYXRlcmlhbE5vZGUuQU8gPSAnYW8nO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgTWF0ZXJpYWxOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIGFscGhhIHRlc3Qgb2YgdGhlIGN1cnJlbnQgbWF0ZXJpYWwuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8ZmxvYXQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG1hdGVyaWFsQWxwaGFUZXN0ID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBNYXRlcmlhbE5vZGUsIE1hdGVyaWFsTm9kZS5BTFBIQV9URVNUICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGRpZmZ1c2UgY29sb3Igb2YgdGhlIGN1cnJlbnQgbWF0ZXJpYWwuXHJcbiAqIFRoZSB2YWx1ZSBpcyBjb21wb3NlZCB2aWEgYGNvbG9yYCAqIGBtYXBgLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtOb2RlPHZlYzM+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG1hdGVyaWFsQ29sb3IgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIE1hdGVyaWFsTm9kZSwgTWF0ZXJpYWxOb2RlLkNPTE9SICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHNoaW5pbmVzcyBvZiB0aGUgY3VycmVudCBtYXRlcmlhbC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbWF0ZXJpYWxTaGluaW5lc3MgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIE1hdGVyaWFsTm9kZSwgTWF0ZXJpYWxOb2RlLlNISU5JTkVTUyApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBlbWlzc2l2ZSBjb2xvciBvZiB0aGUgY3VycmVudCBtYXRlcmlhbC5cclxuICogVGhlIHZhbHVlIGlzIGNvbXBvc2VkIHZpYSBgZW1pc3NpdmVgICogYGVtaXNzaXZlSW50ZW5zaXR5YCAqIGBlbWlzc2l2ZU1hcGAuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8dmVjMz59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbWF0ZXJpYWxFbWlzc2l2ZSA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggTWF0ZXJpYWxOb2RlLCBNYXRlcmlhbE5vZGUuRU1JU1NJVkUgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgb3BhY2l0eSBvZiB0aGUgY3VycmVudCBtYXRlcmlhbC5cclxuICogVGhlIHZhbHVlIGlzIGNvbXBvc2VkIHZpYSBgb3BhY2l0eWAgKiBgYWxwaGFNYXBgLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtOb2RlPGZsb2F0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBtYXRlcmlhbE9wYWNpdHkgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIE1hdGVyaWFsTm9kZSwgTWF0ZXJpYWxOb2RlLk9QQUNJVFkgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgc3BlY3VsYXIgb2YgdGhlIGN1cnJlbnQgbWF0ZXJpYWwuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8dmVjMz59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbWF0ZXJpYWxTcGVjdWxhciA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggTWF0ZXJpYWxOb2RlLCBNYXRlcmlhbE5vZGUuU1BFQ1VMQVIgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgc3BlY3VsYXIgaW50ZW5zaXR5IG9mIHRoZSBjdXJyZW50IG1hdGVyaWFsLlxyXG4gKiBUaGUgdmFsdWUgaXMgY29tcG9zZWQgdmlhIGBzcGVjdWxhckludGVuc2l0eWAgKiBgc3BlY3VsYXJNYXAuYWAuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8ZmxvYXQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG1hdGVyaWFsU3BlY3VsYXJJbnRlbnNpdHkgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIE1hdGVyaWFsTm9kZSwgTWF0ZXJpYWxOb2RlLlNQRUNVTEFSX0lOVEVOU0lUWSApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBzcGVjdWxhciBjb2xvciBvZiB0aGUgY3VycmVudCBtYXRlcmlhbC5cclxuICogVGhlIHZhbHVlIGlzIGNvbXBvc2VkIHZpYSBgc3BlY3VsYXJDb2xvcmAgKiBgc3BlY3VsYXJNYXAucmdiYC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTx2ZWMzPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBtYXRlcmlhbFNwZWN1bGFyQ29sb3IgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIE1hdGVyaWFsTm9kZSwgTWF0ZXJpYWxOb2RlLlNQRUNVTEFSX0NPTE9SICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHNwZWN1bGFyIHN0cmVuZ3RoIG9mIHRoZSBjdXJyZW50IG1hdGVyaWFsLlxyXG4gKiBUaGUgdmFsdWUgaXMgY29tcG9zZWQgdmlhIGBzcGVjdWxhck1hcC5yYC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbWF0ZXJpYWxTcGVjdWxhclN0cmVuZ3RoID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBNYXRlcmlhbE5vZGUsIE1hdGVyaWFsTm9kZS5TUEVDVUxBUl9TVFJFTkdUSCApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSByZWZsZWN0aXZpdHkgb2YgdGhlIGN1cnJlbnQgbWF0ZXJpYWwuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8ZmxvYXQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG1hdGVyaWFsUmVmbGVjdGl2aXR5ID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBNYXRlcmlhbE5vZGUsIE1hdGVyaWFsTm9kZS5SRUZMRUNUSVZJVFkgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgcm91Z2huZXNzIG9mIHRoZSBjdXJyZW50IG1hdGVyaWFsLlxyXG4gKiBUaGUgdmFsdWUgaXMgY29tcG9zZWQgdmlhIGByb3VnaG5lc3NgICogYHJvdWdobmVzc01hcC5nYC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbWF0ZXJpYWxSb3VnaG5lc3MgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIE1hdGVyaWFsTm9kZSwgTWF0ZXJpYWxOb2RlLlJPVUdITkVTUyApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBtZXRhbG5lc3Mgb2YgdGhlIGN1cnJlbnQgbWF0ZXJpYWwuXHJcbiAqIFRoZSB2YWx1ZSBpcyBjb21wb3NlZCB2aWEgYG1ldGFsbmVzc2AgKiBgbWV0YWxuZXNzTWFwLmJgLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtOb2RlPGZsb2F0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBtYXRlcmlhbE1ldGFsbmVzcyA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggTWF0ZXJpYWxOb2RlLCBNYXRlcmlhbE5vZGUuTUVUQUxORVNTICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIG5vcm1hbCBvZiB0aGUgY3VycmVudCBtYXRlcmlhbC5cclxuICogVGhlIHZhbHVlIHdpbGwgYmUgZWl0aGVyIGBub3JtYWxNYXBgICogYG5vcm1hbFNjYWxlYCwgYGJ1bXBNYXBgICogYGJ1bXBTY2FsZWAgb3IgYG5vcm1hbFZpZXdgLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtOb2RlPHZlYzM+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG1hdGVyaWFsTm9ybWFsID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBNYXRlcmlhbE5vZGUsIE1hdGVyaWFsTm9kZS5OT1JNQUwgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgY2xlYXJjb2F0IG9mIHRoZSBjdXJyZW50IG1hdGVyaWFsLlxyXG4gKiBUaGUgdmFsdWUgaXMgY29tcG9zZWQgdmlhIGBjbGVhcmNvYXRgICogYGNsZWFyY29hdE1hcC5yYFxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtOb2RlPGZsb2F0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBtYXRlcmlhbENsZWFyY29hdCA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggTWF0ZXJpYWxOb2RlLCBNYXRlcmlhbE5vZGUuQ0xFQVJDT0FUICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGNsZWFyY29hdCByb3VnaG5lc3Mgb2YgdGhlIGN1cnJlbnQgbWF0ZXJpYWwuXHJcbiAqIFRoZSB2YWx1ZSBpcyBjb21wb3NlZCB2aWEgYGNsZWFyY29hdFJvdWdobmVzc2AgKiBgY2xlYXJjb2F0Um91Z2huZXNzTWFwLnJgLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtOb2RlPGZsb2F0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBtYXRlcmlhbENsZWFyY29hdFJvdWdobmVzcyA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggTWF0ZXJpYWxOb2RlLCBNYXRlcmlhbE5vZGUuQ0xFQVJDT0FUX1JPVUdITkVTUyApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBjbGVhcmNvYXQgbm9ybWFsIG9mIHRoZSBjdXJyZW50IG1hdGVyaWFsLlxyXG4gKiBUaGUgdmFsdWUgd2lsbCBiZSBlaXRoZXIgYGNsZWFyY29hdE5vcm1hbE1hcGAgb3IgYG5vcm1hbFZpZXdgLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtOb2RlPHZlYzM+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG1hdGVyaWFsQ2xlYXJjb2F0Tm9ybWFsID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBNYXRlcmlhbE5vZGUsIE1hdGVyaWFsTm9kZS5DTEVBUkNPQVRfTk9STUFMICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHJvdGF0aW9uIG9mIHRoZSBjdXJyZW50IHNwcml0ZSBtYXRlcmlhbC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbWF0ZXJpYWxSb3RhdGlvbiA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggTWF0ZXJpYWxOb2RlLCBNYXRlcmlhbE5vZGUuUk9UQVRJT04gKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgc2hlZW4gY29sb3Igb2YgdGhlIGN1cnJlbnQgbWF0ZXJpYWwuXHJcbiAqIFRoZSB2YWx1ZSBpcyBjb21wb3NlZCB2aWEgYHNoZWVuYCAqIGBzaGVlbkNvbG9yYCAqIGBzaGVlbkNvbG9yTWFwYC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTx2ZWMzPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBtYXRlcmlhbFNoZWVuID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBNYXRlcmlhbE5vZGUsIE1hdGVyaWFsTm9kZS5TSEVFTiApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBzaGVlbiByb3VnaG5lc3Mgb2YgdGhlIGN1cnJlbnQgbWF0ZXJpYWwuXHJcbiAqIFRoZSB2YWx1ZSBpcyBjb21wb3NlZCB2aWEgYHNoZWVuUm91Z2huZXNzYCAqIGBzaGVlblJvdWdobmVzc01hcC5hYC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbWF0ZXJpYWxTaGVlblJvdWdobmVzcyA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggTWF0ZXJpYWxOb2RlLCBNYXRlcmlhbE5vZGUuU0hFRU5fUk9VR0hORVNTICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGFuaXNvdHJvcHkgb2YgdGhlIGN1cnJlbnQgbWF0ZXJpYWwuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8dmVjMj59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbWF0ZXJpYWxBbmlzb3Ryb3B5ID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBNYXRlcmlhbE5vZGUsIE1hdGVyaWFsTm9kZS5BTklTT1RST1BZICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGlyaWRlc2NlbmNlIG9mIHRoZSBjdXJyZW50IG1hdGVyaWFsLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtOb2RlPGZsb2F0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBtYXRlcmlhbElyaWRlc2NlbmNlID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBNYXRlcmlhbE5vZGUsIE1hdGVyaWFsTm9kZS5JUklERVNDRU5DRSApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBpcmlkZXNjZW5jZSBJT1Igb2YgdGhlIGN1cnJlbnQgbWF0ZXJpYWwuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8ZmxvYXQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG1hdGVyaWFsSXJpZGVzY2VuY2VJT1IgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIE1hdGVyaWFsTm9kZSwgTWF0ZXJpYWxOb2RlLklSSURFU0NFTkNFX0lPUiApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBpcmlkZXNjZW5jZSB0aGlja25lc3Mgb2YgdGhlIGN1cnJlbnQgbWF0ZXJpYWwuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8ZmxvYXQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG1hdGVyaWFsSXJpZGVzY2VuY2VUaGlja25lc3MgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIE1hdGVyaWFsTm9kZSwgTWF0ZXJpYWxOb2RlLklSSURFU0NFTkNFX1RISUNLTkVTUyApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSB0cmFuc21pc3Npb24gb2YgdGhlIGN1cnJlbnQgbWF0ZXJpYWwuXHJcbiAqIFRoZSB2YWx1ZSBpcyBjb21wb3NlZCB2aWEgYHRyYW5zbWlzc2lvbmAgKiBgdHJhbnNtaXNzaW9uTWFwLnJgLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtOb2RlPGZsb2F0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBtYXRlcmlhbFRyYW5zbWlzc2lvbiA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggTWF0ZXJpYWxOb2RlLCBNYXRlcmlhbE5vZGUuVFJBTlNNSVNTSU9OICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHRoaWNrbmVzcyBvZiB0aGUgY3VycmVudCBtYXRlcmlhbC5cclxuICogVGhlIHZhbHVlIGlzIGNvbXBvc2VkIHZpYSBgdGhpY2tuZXNzYCAqIGB0aGlja25lc3NNYXAuZ2AuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8ZmxvYXQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG1hdGVyaWFsVGhpY2tuZXNzID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBNYXRlcmlhbE5vZGUsIE1hdGVyaWFsTm9kZS5USElDS05FU1MgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgSU9SIG9mIHRoZSBjdXJyZW50IG1hdGVyaWFsLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtOb2RlPGZsb2F0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBtYXRlcmlhbElPUiA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggTWF0ZXJpYWxOb2RlLCBNYXRlcmlhbE5vZGUuSU9SICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGF0dGVudWF0aW9uIGRpc3RhbmNlIG9mIHRoZSBjdXJyZW50IG1hdGVyaWFsLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtOb2RlPGZsb2F0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBtYXRlcmlhbEF0dGVudWF0aW9uRGlzdGFuY2UgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIE1hdGVyaWFsTm9kZSwgTWF0ZXJpYWxOb2RlLkFUVEVOVUFUSU9OX0RJU1RBTkNFICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGF0dGVudWF0aW9uIGNvbG9yIG9mIHRoZSBjdXJyZW50IG1hdGVyaWFsLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtOb2RlPHZlYzM+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG1hdGVyaWFsQXR0ZW51YXRpb25Db2xvciA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggTWF0ZXJpYWxOb2RlLCBNYXRlcmlhbE5vZGUuQVRURU5VQVRJT05fQ09MT1IgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgc2NhbGUgb2YgdGhlIGN1cnJlbnQgZGFzaGVkIGxpbmUgbWF0ZXJpYWwuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8ZmxvYXQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG1hdGVyaWFsTGluZVNjYWxlID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBNYXRlcmlhbE5vZGUsIE1hdGVyaWFsTm9kZS5MSU5FX1NDQUxFICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGRhc2ggc2l6ZSBvZiB0aGUgY3VycmVudCBkYXNoZWQgbGluZSBtYXRlcmlhbC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbWF0ZXJpYWxMaW5lRGFzaFNpemUgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIE1hdGVyaWFsTm9kZSwgTWF0ZXJpYWxOb2RlLkxJTkVfREFTSF9TSVpFICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGdhcCBzaXplIG9mIHRoZSBjdXJyZW50IGRhc2hlZCBsaW5lIG1hdGVyaWFsLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtOb2RlPGZsb2F0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBtYXRlcmlhbExpbmVHYXBTaXplID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBNYXRlcmlhbE5vZGUsIE1hdGVyaWFsTm9kZS5MSU5FX0dBUF9TSVpFICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGxpbmUgd2lkdGggb2YgdGhlIGN1cnJlbnQgbGluZSBtYXRlcmlhbC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbWF0ZXJpYWxMaW5lV2lkdGggPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIE1hdGVyaWFsTm9kZSwgTWF0ZXJpYWxOb2RlLkxJTkVfV0lEVEggKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgZGFzaCBvZmZzZXQgb2YgdGhlIGN1cnJlbnQgbGluZSBtYXRlcmlhbC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbWF0ZXJpYWxMaW5lRGFzaE9mZnNldCA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggTWF0ZXJpYWxOb2RlLCBNYXRlcmlhbE5vZGUuTElORV9EQVNIX09GRlNFVCApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBwb2ludCBzaXplIG9mIHRoZSBjdXJyZW50IHBvaW50cyBtYXRlcmlhbC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbWF0ZXJpYWxQb2ludFNpemUgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIE1hdGVyaWFsTm9kZSwgTWF0ZXJpYWxOb2RlLlBPSU5UX1NJWkUgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgZGlzcGVyc2lvbiBvZiB0aGUgY3VycmVudCBtYXRlcmlhbC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbWF0ZXJpYWxEaXNwZXJzaW9uID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBNYXRlcmlhbE5vZGUsIE1hdGVyaWFsTm9kZS5ESVNQRVJTSU9OICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGxpZ2h0IG1hcCBvZiB0aGUgY3VycmVudCBtYXRlcmlhbC5cclxuICogVGhlIHZhbHVlIGlzIGNvbXBvc2VkIHZpYSBgbGlnaHRNYXBJbnRlbnNpdHlgICogYGxpZ2h0TWFwLnJnYmAuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8dmVjMz59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbWF0ZXJpYWxMaWdodE1hcCA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggTWF0ZXJpYWxOb2RlLCBNYXRlcmlhbE5vZGUuTElHSFRfTUFQICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGFtYmllbnQgb2NjbHVzaW9uIG1hcCBvZiB0aGUgY3VycmVudCBtYXRlcmlhbC5cclxuICogVGhlIHZhbHVlIGlzIGNvbXBvc2VkIHZpYSBgYW9NYXAucmAgLSAxICogYGFvTWFwSW50ZW5zaXR5YCArIDEuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8ZmxvYXQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG1hdGVyaWFsQU8gPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIE1hdGVyaWFsTm9kZSwgTWF0ZXJpYWxOb2RlLkFPICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGFuaXNvdHJvcHkgdmVjdG9yIG9mIHRoZSBjdXJyZW50IG1hdGVyaWFsLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtOb2RlPHZlYzI+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG1hdGVyaWFsQW5pc290cm9weVZlY3RvciA9IC8qQF9fUFVSRV9fKi8gdW5pZm9ybSggbmV3IFZlY3RvcjIoKSApLm9uUmVmZXJlbmNlKCBmdW5jdGlvbiAoIGZyYW1lICkge1xyXG5cclxuXHRyZXR1cm4gZnJhbWUubWF0ZXJpYWw7XHJcblxyXG59ICkub25SZW5kZXJVcGRhdGUoIGZ1bmN0aW9uICggeyBtYXRlcmlhbCB9ICkge1xyXG5cclxuXHR0aGlzLnZhbHVlLnNldCggbWF0ZXJpYWwuYW5pc290cm9weSAqIE1hdGguY29zKCBtYXRlcmlhbC5hbmlzb3Ryb3B5Um90YXRpb24gKSwgbWF0ZXJpYWwuYW5pc290cm9weSAqIE1hdGguc2luKCBtYXRlcmlhbC5hbmlzb3Ryb3B5Um90YXRpb24gKSApO1xyXG5cclxufSApO1xyXG4iLCJpbXBvcnQgeyBGbiB9IGZyb20gJy4uL3RzbC9UU0xDb3JlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgcG9zaXRpb24gaW4gY2xpcCBzcGFjZSBhZnRlciB0aGUgbW9kZWwtdmlldy1wcm9qZWN0aW9uIHRyYW5zZm9ybSBvZiB0aGUgY3VycmVudCByZW5kZXJlZCBvYmplY3QuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1ZhcnlpbmdOb2RlPHZlYzQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG1vZGVsVmlld1Byb2plY3Rpb24gPSAvKkBfX1BVUkVfXyovICggRm4oICggYnVpbGRlciApID0+IHtcclxuXHJcblx0cmV0dXJuIGJ1aWxkZXIuY29udGV4dC5zZXR1cE1vZGVsVmlld1Byb2plY3Rpb24oKTtcclxuXHJcbn0sICd2ZWM0JyApLm9uY2UoKSApKCkudG9WYXJ5aW5nKCAndl9tb2RlbFZpZXdQcm9qZWN0aW9uJyApO1xyXG4iLCJpbXBvcnQgTm9kZSBmcm9tICcuL05vZGUuanMnO1xyXG5pbXBvcnQgeyBub2RlSW1tdXRhYmxlLCB2YXJ5aW5nIH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBzaGFkZXIgaW5kaWNlcyBvZiBkaWZmZXJlbnQgdHlwZXMuIFRoZSBmb2xsb3dpbmcgcHJlZGVmaW5lZCBub2RlXHJcbiAqIG9iamVjdHMgY292ZXIgZnJlcXVlbnQgdXNlIGNhc2VzOlxyXG4gKlxyXG4gKiAtIGB2ZXJ0ZXhJbmRleGA6IFRoZSBpbmRleCBvZiBhIHZlcnRleCB3aXRoaW4gYSBtZXNoLlxyXG4gKiAtIGBpbnN0YW5jZUluZGV4YDogVGhlIGluZGV4IG9mIGVpdGhlciBhIG1lc2ggaW5zdGFuY2Ugb3IgYW4gaW52b2NhdGlvbiBvZiBhIGNvbXB1dGUgc2hhZGVyLlxyXG4gKiAtIGBkcmF3SW5kZXhgOiBUaGUgaW5kZXggb2YgYSBkcmF3IGNhbGwuXHJcbiAqIC0gYGludm9jYXRpb25Mb2NhbEluZGV4YDogVGhlIGluZGV4IG9mIGEgY29tcHV0ZSBpbnZvY2F0aW9uIHdpdGhpbiB0aGUgc2NvcGUgb2YgYSB3b3JrZ3JvdXAgbG9hZC5cclxuICogLSBgaW52b2NhdGlvblN1Ymdyb3VwSW5kZXhgOiBUaGUgaW5kZXggb2YgYSBjb21wdXRlIGludm9jYXRpb24gd2l0aGluIHRoZSBzY29wZSBvZiBhIHN1Ymdyb3VwLlxyXG4gKiAtIGBzdWJncm91cEluZGV4YDogVGhlIGluZGV4IG9mIHRoZSBzdWJncm91cCB0aGUgY3VycmVudCBjb21wdXRlIGludm9jYXRpb24gYmVsb25ncyB0by5cclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVcclxuICovXHJcbmNsYXNzIEluZGV4Tm9kZSBleHRlbmRzIE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdJbmRleE5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgaW5kZXggbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7KCd2ZXJ0ZXgnfCdpbnN0YW5jZSd8J3N1Ymdyb3VwJ3wnaW52b2NhdGlvbkxvY2FsJ3wnaW52b2NhdGlvblN1Ymdyb3VwJ3wnZHJhdycpfSBzY29wZSAtIFRoZSBzY29wZSBvZiB0aGUgaW5kZXggbm9kZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggc2NvcGUgKSB7XHJcblxyXG5cdFx0c3VwZXIoICd1aW50JyApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHNjb3BlIG9mIHRoZSBpbmRleCBub2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2NvcGUgPSBzY29wZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNJbmRleE5vZGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdGdlbmVyYXRlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IG5vZGVUeXBlID0gdGhpcy5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cdFx0Y29uc3Qgc2NvcGUgPSB0aGlzLnNjb3BlO1xyXG5cclxuXHRcdGxldCBwcm9wZXJ0eU5hbWU7XHJcblxyXG5cdFx0aWYgKCBzY29wZSA9PT0gSW5kZXhOb2RlLlZFUlRFWCApIHtcclxuXHJcblx0XHRcdHByb3BlcnR5TmFtZSA9IGJ1aWxkZXIuZ2V0VmVydGV4SW5kZXgoKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBzY29wZSA9PT0gSW5kZXhOb2RlLklOU1RBTkNFICkge1xyXG5cclxuXHRcdFx0cHJvcGVydHlOYW1lID0gYnVpbGRlci5nZXRJbnN0YW5jZUluZGV4KCk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggc2NvcGUgPT09IEluZGV4Tm9kZS5EUkFXICkge1xyXG5cclxuXHRcdFx0cHJvcGVydHlOYW1lID0gYnVpbGRlci5nZXREcmF3SW5kZXgoKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBzY29wZSA9PT0gSW5kZXhOb2RlLklOVk9DQVRJT05fTE9DQUwgKSB7XHJcblxyXG5cdFx0XHRwcm9wZXJ0eU5hbWUgPSBidWlsZGVyLmdldEludm9jYXRpb25Mb2NhbEluZGV4KCk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggc2NvcGUgPT09IEluZGV4Tm9kZS5JTlZPQ0FUSU9OX1NVQkdST1VQICkge1xyXG5cclxuXHRcdFx0cHJvcGVydHlOYW1lID0gYnVpbGRlci5nZXRJbnZvY2F0aW9uU3ViZ3JvdXBJbmRleCgpO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHNjb3BlID09PSBJbmRleE5vZGUuU1VCR1JPVVAgKSB7XHJcblxyXG5cdFx0XHRwcm9wZXJ0eU5hbWUgPSBidWlsZGVyLmdldFN1Ymdyb3VwSW5kZXgoKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuSW5kZXhOb2RlOiBVbmtub3duIHNjb3BlOiAnICsgc2NvcGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0bGV0IG91dHB1dDtcclxuXHJcblx0XHRpZiAoIGJ1aWxkZXIuc2hhZGVyU3RhZ2UgPT09ICd2ZXJ0ZXgnIHx8IGJ1aWxkZXIuc2hhZGVyU3RhZ2UgPT09ICdjb21wdXRlJyApIHtcclxuXHJcblx0XHRcdG91dHB1dCA9IHByb3BlcnR5TmFtZTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc3Qgbm9kZVZhcnlpbmcgPSB2YXJ5aW5nKCB0aGlzICk7XHJcblxyXG5cdFx0XHRvdXRwdXQgPSBub2RlVmFyeWluZy5idWlsZCggYnVpbGRlciwgbm9kZVR5cGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG91dHB1dDtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuSW5kZXhOb2RlLlZFUlRFWCA9ICd2ZXJ0ZXgnO1xyXG5JbmRleE5vZGUuSU5TVEFOQ0UgPSAnaW5zdGFuY2UnO1xyXG5JbmRleE5vZGUuU1VCR1JPVVAgPSAnc3ViZ3JvdXAnO1xyXG5JbmRleE5vZGUuSU5WT0NBVElPTl9MT0NBTCA9ICdpbnZvY2F0aW9uTG9jYWwnO1xyXG5JbmRleE5vZGUuSU5WT0NBVElPTl9TVUJHUk9VUCA9ICdpbnZvY2F0aW9uU3ViZ3JvdXAnO1xyXG5JbmRleE5vZGUuRFJBVyA9ICdkcmF3JztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IEluZGV4Tm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgaW5kZXggb2YgYSB2ZXJ0ZXggd2l0aGluIGEgbWVzaC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7SW5kZXhOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHZlcnRleEluZGV4ID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBJbmRleE5vZGUsIEluZGV4Tm9kZS5WRVJURVggKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgaW5kZXggb2YgZWl0aGVyIGEgbWVzaCBpbnN0YW5jZSBvciBhbiBpbnZvY2F0aW9uIG9mIGEgY29tcHV0ZSBzaGFkZXIuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge0luZGV4Tm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBpbnN0YW5jZUluZGV4ID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBJbmRleE5vZGUsIEluZGV4Tm9kZS5JTlNUQU5DRSApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBpbmRleCBvZiB0aGUgc3ViZ3JvdXAgdGhlIGN1cnJlbnQgY29tcHV0ZSBpbnZvY2F0aW9uIGJlbG9uZ3MgdG8uXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge0luZGV4Tm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBzdWJncm91cEluZGV4ID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBJbmRleE5vZGUsIEluZGV4Tm9kZS5TVUJHUk9VUCApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBpbmRleCBvZiBhIGNvbXB1dGUgaW52b2NhdGlvbiB3aXRoaW4gdGhlIHNjb3BlIG9mIGEgc3ViZ3JvdXAuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge0luZGV4Tm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBpbnZvY2F0aW9uU3ViZ3JvdXBJbmRleCA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggSW5kZXhOb2RlLCBJbmRleE5vZGUuSU5WT0NBVElPTl9TVUJHUk9VUCApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBpbmRleCBvZiBhIGNvbXB1dGUgaW52b2NhdGlvbiB3aXRoaW4gdGhlIHNjb3BlIG9mIGEgd29ya2dyb3VwIGxvYWQuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge0luZGV4Tm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBpbnZvY2F0aW9uTG9jYWxJbmRleCA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggSW5kZXhOb2RlLCBJbmRleE5vZGUuSU5WT0NBVElPTl9MT0NBTCApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBpbmRleCBvZiBhIGRyYXcgY2FsbC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7SW5kZXhOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGRyYXdJbmRleCA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggSW5kZXhOb2RlLCBJbmRleE5vZGUuRFJBVyApO1xyXG4iLCJpbXBvcnQgTm9kZSBmcm9tICcuLi9jb3JlL05vZGUuanMnO1xyXG5pbXBvcnQgeyB2YXJ5aW5nUHJvcGVydHkgfSBmcm9tICcuLi9jb3JlL1Byb3BlcnR5Tm9kZS5qcyc7XHJcbmltcG9ydCB7IGluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSwgaW5zdGFuY2VkRHluYW1pY0J1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4vQnVmZmVyQXR0cmlidXRlTm9kZS5qcyc7XHJcbmltcG9ydCB7IG5vcm1hbExvY2FsLCB0cmFuc2Zvcm1Ob3JtYWwgfSBmcm9tICcuL05vcm1hbC5qcyc7XHJcbmltcG9ydCB7IHBvc2l0aW9uTG9jYWwgfSBmcm9tICcuL1Bvc2l0aW9uLmpzJztcclxuaW1wb3J0IHsgbm9kZVByb3h5LCB2ZWMzLCBtYXQ0IH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5pbXBvcnQgeyBOb2RlVXBkYXRlVHlwZSB9IGZyb20gJy4uL2NvcmUvY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgYnVmZmVyIH0gZnJvbSAnLi4vYWNjZXNzb3JzL0J1ZmZlck5vZGUuanMnO1xyXG5pbXBvcnQgeyBpbnN0YW5jZUluZGV4IH0gZnJvbSAnLi4vY29yZS9JbmRleE5vZGUuanMnO1xyXG5cclxuaW1wb3J0IHsgSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIgfSBmcm9tICcuLi8uLi9jb3JlL0luc3RhbmNlZEludGVybGVhdmVkQnVmZmVyLmpzJztcclxuaW1wb3J0IHsgSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vLi4vY29yZS9JbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5pbXBvcnQgeyBEeW5hbWljRHJhd1VzYWdlIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIG5vZGUgaW1wbGVtZW50cyB0aGUgdmVydGV4IHNoYWRlciBsb2dpYyB3aGljaCBpcyByZXF1aXJlZFxyXG4gKiB3aGVuIHJlbmRlcmluZyAzRCBvYmplY3RzIHZpYSBpbnN0YW5jaW5nLiBUaGUgY29kZSBtYWtlcyBzdXJlXHJcbiAqIHZlcnRleCBwb3NpdGlvbnMsIG5vcm1hbHMgYW5kIGNvbG9ycyBjYW4gYmUgbW9kaWZpZWQgdmlhIGluc3RhbmNlZFxyXG4gKiBkYXRhLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTm9kZVxyXG4gKi9cclxuY2xhc3MgSW5zdGFuY2VOb2RlIGV4dGVuZHMgTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ0luc3RhbmNlTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGNvdW50IC0gVGhlIG51bWJlciBvZiBpbnN0YW5jZXMuXHJcblx0ICogQHBhcmFtIHtJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGV9IGluc3RhbmNlTWF0cml4IC0gSW5zdGFuY2VkIGJ1ZmZlciBhdHRyaWJ1dGUgcmVwcmVzZW50aW5nIHRoZSBpbnN0YW5jZSB0cmFuc2Zvcm1hdGlvbnMuXHJcblx0ICogQHBhcmFtIHtJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGV9IGluc3RhbmNlQ29sb3IgLSBJbnN0YW5jZWQgYnVmZmVyIGF0dHJpYnV0ZSByZXByZXNlbnRpbmcgdGhlIGluc3RhbmNlIGNvbG9ycy5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggY291bnQsIGluc3RhbmNlTWF0cml4LCBpbnN0YW5jZUNvbG9yICkge1xyXG5cclxuXHRcdHN1cGVyKCAndm9pZCcgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBudW1iZXIgb2YgaW5zdGFuY2VzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY291bnQgPSBjb3VudDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEluc3RhbmNlZCBidWZmZXIgYXR0cmlidXRlIHJlcHJlc2VudGluZyB0aGUgdHJhbnNmb3JtYXRpb24gb2YgaW5zdGFuY2VzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaW5zdGFuY2VNYXRyaXggPSBpbnN0YW5jZU1hdHJpeDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEluc3RhbmNlZCBidWZmZXIgYXR0cmlidXRlIHJlcHJlc2VudGluZyB0aGUgY29sb3Igb2YgaW5zdGFuY2VzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaW5zdGFuY2VDb2xvciA9IGluc3RhbmNlQ29sb3I7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbm9kZSB0aGF0IHJlcHJlc2VudHMgdGhlIGluc3RhbmNlIG1hdHJpeCBkYXRhLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Tm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pbnN0YW5jZU1hdHJpeE5vZGUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG5vZGUgdGhhdCByZXByZXNlbnRzIHRoZSBpbnN0YW5jZSBjb2xvciBkYXRhLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Tm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pbnN0YW5jZUNvbG9yTm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdXBkYXRlIHR5cGUgaXMgc2V0IHRvIGBmcmFtZWAgc2luY2UgYW4gdXBkYXRlXHJcblx0XHQgKiBvZiBpbnN0YW5jZWQgYnVmZmVyIGRhdGEgbXVzdCBiZSBjaGVja2VkIHBlciBmcmFtZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICogQGRlZmF1bHQgJ2ZyYW1lJ1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVwZGF0ZVR5cGUgPSBOb2RlVXBkYXRlVHlwZS5GUkFNRTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIGEgYnVmZmVyIHRoYXQgaXMgdXNlZCBieSBgaW5zdGFuY2VNYXRyaXhOb2RlYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P0luc3RhbmNlZEludGVybGVhdmVkQnVmZmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJ1ZmZlciA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZSB0byBhIGJ1ZmZlciB0aGF0IGlzIHVzZWQgYnkgYGluc3RhbmNlQ29sb3JOb2RlYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5idWZmZXJDb2xvciA9IG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0dXBzIHRoZSBpbnRlcm5hbCBidWZmZXJzIGFuZCBub2RlcyBhbmQgYXNzaWducyB0aGUgdHJhbnNmb3JtZWQgdmVydGV4IGRhdGFcclxuXHQgKiB0byBwcmVkZWZpbmVkIG5vZGUgdmFyaWFibGVzIGZvciBhY2N1bXVsYXRpb24uIFRoYXQgZm9sbG93cyB0aGUgc2FtZSBwYXR0ZXJuc1xyXG5cdCAqIGxpa2Ugd2l0aCBtb3JwaCBhbmQgc2tpbm5pbmcgbm9kZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqL1xyXG5cdHNldHVwKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IHsgY291bnQsIGluc3RhbmNlTWF0cml4LCBpbnN0YW5jZUNvbG9yIH0gPSB0aGlzO1xyXG5cclxuXHRcdGxldCB7IGluc3RhbmNlTWF0cml4Tm9kZSwgaW5zdGFuY2VDb2xvck5vZGUgfSA9IHRoaXM7XHJcblxyXG5cdFx0aWYgKCBpbnN0YW5jZU1hdHJpeE5vZGUgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHQvLyBCb3RoIFdlYkdQVSBhbmQgV2ViR0wgYmFja2VuZHMgaGF2ZSBVQk8gbWF4IGxpbWl0ZWQgdG8gNjRrYi4gTWF0cml4IGNvdW50IG51bWJlciBiaWdnZXIgdGhhbiAxMDAwICggMTYgKiA0ICogMTAwMCA9IDY0a2IgKSB3aWxsIGZhbGxiYWNrIHRvIGF0dHJpYnV0ZS5cclxuXHJcblx0XHRcdGlmICggY291bnQgPD0gMTAwMCApIHtcclxuXHJcblx0XHRcdFx0aW5zdGFuY2VNYXRyaXhOb2RlID0gYnVmZmVyKCBpbnN0YW5jZU1hdHJpeC5hcnJheSwgJ21hdDQnLCBNYXRoLm1heCggY291bnQsIDEgKSApLmVsZW1lbnQoIGluc3RhbmNlSW5kZXggKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGJ1ZmZlciA9IG5ldyBJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlciggaW5zdGFuY2VNYXRyaXguYXJyYXksIDE2LCAxICk7XHJcblxyXG5cdFx0XHRcdHRoaXMuYnVmZmVyID0gYnVmZmVyO1xyXG5cclxuXHRcdFx0XHRjb25zdCBidWZmZXJGbiA9IGluc3RhbmNlTWF0cml4LnVzYWdlID09PSBEeW5hbWljRHJhd1VzYWdlID8gaW5zdGFuY2VkRHluYW1pY0J1ZmZlckF0dHJpYnV0ZSA6IGluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZTtcclxuXHJcblx0XHRcdFx0Y29uc3QgaW5zdGFuY2VCdWZmZXJzID0gW1xyXG5cdFx0XHRcdFx0Ly8gRi5TaWduYXR1cmUgLT4gYnVmZmVyQXR0cmlidXRlKCBhcnJheSwgdHlwZSwgc3RyaWRlLCBvZmZzZXQgKVxyXG5cdFx0XHRcdFx0YnVmZmVyRm4oIGJ1ZmZlciwgJ3ZlYzQnLCAxNiwgMCApLFxyXG5cdFx0XHRcdFx0YnVmZmVyRm4oIGJ1ZmZlciwgJ3ZlYzQnLCAxNiwgNCApLFxyXG5cdFx0XHRcdFx0YnVmZmVyRm4oIGJ1ZmZlciwgJ3ZlYzQnLCAxNiwgOCApLFxyXG5cdFx0XHRcdFx0YnVmZmVyRm4oIGJ1ZmZlciwgJ3ZlYzQnLCAxNiwgMTIgKVxyXG5cdFx0XHRcdF07XHJcblxyXG5cdFx0XHRcdGluc3RhbmNlTWF0cml4Tm9kZSA9IG1hdDQoIC4uLmluc3RhbmNlQnVmZmVycyApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5pbnN0YW5jZU1hdHJpeE5vZGUgPSBpbnN0YW5jZU1hdHJpeE5vZGU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggaW5zdGFuY2VDb2xvciAmJiBpbnN0YW5jZUNvbG9yTm9kZSA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGJ1ZmZlciA9IG5ldyBJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUoIGluc3RhbmNlQ29sb3IuYXJyYXksIDMgKTtcclxuXHJcblx0XHRcdGNvbnN0IGJ1ZmZlckZuID0gaW5zdGFuY2VDb2xvci51c2FnZSA9PT0gRHluYW1pY0RyYXdVc2FnZSA/IGluc3RhbmNlZER5bmFtaWNCdWZmZXJBdHRyaWJ1dGUgOiBpbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU7XHJcblxyXG5cdFx0XHR0aGlzLmJ1ZmZlckNvbG9yID0gYnVmZmVyO1xyXG5cclxuXHRcdFx0aW5zdGFuY2VDb2xvck5vZGUgPSB2ZWMzKCBidWZmZXJGbiggYnVmZmVyLCAndmVjMycsIDMsIDAgKSApO1xyXG5cclxuXHRcdFx0dGhpcy5pbnN0YW5jZUNvbG9yTm9kZSA9IGluc3RhbmNlQ29sb3JOb2RlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBQT1NJVElPTlxyXG5cclxuXHRcdGNvbnN0IGluc3RhbmNlUG9zaXRpb24gPSBpbnN0YW5jZU1hdHJpeE5vZGUubXVsKCBwb3NpdGlvbkxvY2FsICkueHl6O1xyXG5cdFx0cG9zaXRpb25Mb2NhbC5hc3NpZ24oIGluc3RhbmNlUG9zaXRpb24gKTtcclxuXHJcblx0XHQvLyBOT1JNQUxcclxuXHJcblx0XHRpZiAoIGJ1aWxkZXIuaGFzR2VvbWV0cnlBdHRyaWJ1dGUoICdub3JtYWwnICkgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBpbnN0YW5jZU5vcm1hbCA9IHRyYW5zZm9ybU5vcm1hbCggbm9ybWFsTG9jYWwsIGluc3RhbmNlTWF0cml4Tm9kZSApO1xyXG5cclxuXHRcdFx0Ly8gQVNTSUdOU1xyXG5cclxuXHRcdFx0bm9ybWFsTG9jYWwuYXNzaWduKCBpbnN0YW5jZU5vcm1hbCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBDT0xPUlxyXG5cclxuXHRcdGlmICggdGhpcy5pbnN0YW5jZUNvbG9yTm9kZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHZhcnlpbmdQcm9wZXJ0eSggJ3ZlYzMnLCAndkluc3RhbmNlQ29sb3InICkuYXNzaWduKCB0aGlzLmluc3RhbmNlQ29sb3JOb2RlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENoZWNrcyBpZiB0aGUgaW50ZXJuYWwgYnVmZmVycyByZXF1aXJlZCBhbiB1cGRhdGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVGcmFtZX0gZnJhbWUgLSBUaGUgY3VycmVudCBub2RlIGZyYW1lLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZSggLypmcmFtZSovICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5pbnN0YW5jZU1hdHJpeC51c2FnZSAhPT0gRHluYW1pY0RyYXdVc2FnZSAmJiB0aGlzLmJ1ZmZlciAhPT0gbnVsbCAmJiB0aGlzLmluc3RhbmNlTWF0cml4LnZlcnNpb24gIT09IHRoaXMuYnVmZmVyLnZlcnNpb24gKSB7XHJcblxyXG5cdFx0XHR0aGlzLmJ1ZmZlci52ZXJzaW9uID0gdGhpcy5pbnN0YW5jZU1hdHJpeC52ZXJzaW9uO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMuaW5zdGFuY2VDb2xvciAmJiB0aGlzLmluc3RhbmNlQ29sb3IudXNhZ2UgIT09IER5bmFtaWNEcmF3VXNhZ2UgJiYgdGhpcy5idWZmZXJDb2xvciAhPT0gbnVsbCAmJiB0aGlzLmluc3RhbmNlQ29sb3IudmVyc2lvbiAhPT0gdGhpcy5idWZmZXJDb2xvci52ZXJzaW9uICkge1xyXG5cclxuXHRcdFx0dGhpcy5idWZmZXJDb2xvci52ZXJzaW9uID0gdGhpcy5pbnN0YW5jZUNvbG9yLnZlcnNpb247XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBJbnN0YW5jZU5vZGU7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhbiBpbnN0YW5jZSBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge251bWJlcn0gY291bnQgLSBUaGUgbnVtYmVyIG9mIGluc3RhbmNlcy5cclxuICogQHBhcmFtIHtJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGV9IGluc3RhbmNlTWF0cml4IC0gSW5zdGFuY2VkIGJ1ZmZlciBhdHRyaWJ1dGUgcmVwcmVzZW50aW5nIHRoZSBpbnN0YW5jZSB0cmFuc2Zvcm1hdGlvbnMuXHJcbiAqIEBwYXJhbSB7SW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlfSBpbnN0YW5jZUNvbG9yIC0gSW5zdGFuY2VkIGJ1ZmZlciBhdHRyaWJ1dGUgcmVwcmVzZW50aW5nIHRoZSBpbnN0YW5jZSBjb2xvcnMuXHJcbiAqIEByZXR1cm5zIHtJbnN0YW5jZU5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgaW5zdGFuY2UgPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggSW5zdGFuY2VOb2RlICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAzICk7XHJcbiIsImltcG9ydCBJbnN0YW5jZU5vZGUgZnJvbSAnLi9JbnN0YW5jZU5vZGUuanMnO1xyXG5pbXBvcnQgeyBub2RlUHJveHkgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBpcyBhIHNwZWNpYWwgdmVyc2lvbiBvZiBgSW5zdGFuY2VOb2RlYCB3aGljaCByZXF1aXJlcyB0aGUgdXNhZ2Ugb2Yge0BsaW5rIEluc3RhbmNlZE1lc2h9LlxyXG4gKiBJdCBhbGxvd3MgYW4gZWFzaWVyIHNldHVwIG9mIHRoZSBpbnN0YW5jZSBub2RlLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgSW5zdGFuY2VOb2RlXHJcbiAqL1xyXG5jbGFzcyBJbnN0YW5jZWRNZXNoTm9kZSBleHRlbmRzIEluc3RhbmNlTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ0luc3RhbmNlZE1lc2hOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlZCBtZXNoIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0luc3RhbmNlZE1lc2h9IGluc3RhbmNlZE1lc2ggLSBUaGUgaW5zdGFuY2VkIG1lc2guXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGluc3RhbmNlZE1lc2ggKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBjb3VudCwgaW5zdGFuY2VNYXRyaXgsIGluc3RhbmNlQ29sb3IgfSA9IGluc3RhbmNlZE1lc2g7XHJcblxyXG5cdFx0c3VwZXIoIGNvdW50LCBpbnN0YW5jZU1hdHJpeCwgaW5zdGFuY2VDb2xvciApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIGluc3RhbmNlZCBtZXNoLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtJbnN0YW5jZWRNZXNofVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmluc3RhbmNlZE1lc2ggPSBpbnN0YW5jZWRNZXNoO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBJbnN0YW5jZWRNZXNoTm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGFuIGluc3RhbmNlZCBtZXNoIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7SW5zdGFuY2VkTWVzaH0gaW5zdGFuY2VkTWVzaCAtIFRoZSBpbnN0YW5jZWRNZXNoLlxyXG4gKiBAcmV0dXJucyB7SW5zdGFuY2VkTWVzaE5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgaW5zdGFuY2VkTWVzaCA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBJbnN0YW5jZWRNZXNoTm9kZSApLnNldFBhcmFtZXRlckxlbmd0aCggMSApO1xyXG4iLCJpbXBvcnQgTm9kZSBmcm9tICcuLi9jb3JlL05vZGUuanMnO1xyXG5pbXBvcnQgeyBub3JtYWxMb2NhbCB9IGZyb20gJy4vTm9ybWFsLmpzJztcclxuaW1wb3J0IHsgcG9zaXRpb25Mb2NhbCB9IGZyb20gJy4vUG9zaXRpb24uanMnO1xyXG5pbXBvcnQgeyBub2RlUHJveHksIHZlYzMsIG1hdDMsIG1hdDQsIGludCwgaXZlYzIsIGZsb2F0LCBGbiB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuaW1wb3J0IHsgdGV4dHVyZUxvYWQgfSBmcm9tICcuL1RleHR1cmVOb2RlLmpzJztcclxuaW1wb3J0IHsgdGV4dHVyZVNpemUgfSBmcm9tICcuL1RleHR1cmVTaXplTm9kZS5qcyc7XHJcbmltcG9ydCB7IHRhbmdlbnRMb2NhbCB9IGZyb20gJy4vVGFuZ2VudC5qcyc7XHJcbmltcG9ydCB7IGluc3RhbmNlSW5kZXgsIGRyYXdJbmRleCB9IGZyb20gJy4uL2NvcmUvSW5kZXhOb2RlLmpzJztcclxuaW1wb3J0IHsgdmFyeWluZ1Byb3BlcnR5IH0gZnJvbSAnLi4vY29yZS9Qcm9wZXJ0eU5vZGUuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgbm9kZSBpbXBsZW1lbnRzIHRoZSB2ZXJ0ZXggc2hhZGVyIGxvZ2ljIHdoaWNoIGlzIHJlcXVpcmVkXHJcbiAqIHdoZW4gcmVuZGVyaW5nIDNEIG9iamVjdHMgdmlhIGJhdGNoaW5nLiBgQmF0Y2hOb2RlYCBtdXN0IGJlIHVzZWRcclxuICogd2l0aCBpbnN0YW5jZXMgb2Yge0BsaW5rIEJhdGNoZWRNZXNofS5cclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVcclxuICovXHJcbmNsYXNzIEJhdGNoTm9kZSBleHRlbmRzIE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdCYXRjaE5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYmF0Y2ggbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QmF0Y2hlZE1lc2h9IGJhdGNoTWVzaCAtIEEgcmVmZXJlbmNlIHRvIGJhdGNoZWQgbWVzaC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggYmF0Y2hNZXNoICkge1xyXG5cclxuXHRcdHN1cGVyKCAndm9pZCcgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIGJhdGNoZWQgbWVzaC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QmF0Y2hlZE1lc2h9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYmF0Y2hNZXNoID0gYmF0Y2hNZXNoO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGJhdGNoaW5nIGluZGV4IG5vZGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9JbmRleE5vZGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYmF0Y2hpbmdJZE5vZGUgPSBudWxsO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHVwcyB0aGUgaW50ZXJuYWwgYnVmZmVycyBhbmQgbm9kZXMgYW5kIGFzc2lnbnMgdGhlIHRyYW5zZm9ybWVkIHZlcnRleCBkYXRhXHJcblx0ICogdG8gcHJlZGVmaW5lZCBub2RlIHZhcmlhYmxlcyBmb3IgYWNjdW11bGF0aW9uLiBUaGF0IGZvbGxvd3MgdGhlIHNhbWUgcGF0dGVybnNcclxuXHQgKiBsaWtlIHdpdGggbW9ycGggYW5kIHNraW5uaW5nIG5vZGVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKi9cclxuXHRzZXR1cCggYnVpbGRlciApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuYmF0Y2hpbmdJZE5vZGUgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGJ1aWxkZXIuZ2V0RHJhd0luZGV4KCkgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdHRoaXMuYmF0Y2hpbmdJZE5vZGUgPSBpbnN0YW5jZUluZGV4O1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0dGhpcy5iYXRjaGluZ0lkTm9kZSA9IGRyYXdJbmRleDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgZ2V0SW5kaXJlY3RJbmRleCA9IEZuKCAoIFsgaWQgXSApID0+IHtcclxuXHJcblx0XHRcdGNvbnN0IHNpemUgPSBpbnQoIHRleHR1cmVTaXplKCB0ZXh0dXJlTG9hZCggdGhpcy5iYXRjaE1lc2guX2luZGlyZWN0VGV4dHVyZSApLCAwICkueCApO1xyXG5cdFx0XHRjb25zdCB4ID0gaW50KCBpZCApLm1vZCggc2l6ZSApO1xyXG5cdFx0XHRjb25zdCB5ID0gaW50KCBpZCApLmRpdiggc2l6ZSApO1xyXG5cdFx0XHRyZXR1cm4gdGV4dHVyZUxvYWQoIHRoaXMuYmF0Y2hNZXNoLl9pbmRpcmVjdFRleHR1cmUsIGl2ZWMyKCB4LCB5ICkgKS54O1xyXG5cclxuXHRcdH0gKS5zZXRMYXlvdXQoIHtcclxuXHRcdFx0bmFtZTogJ2dldEluZGlyZWN0SW5kZXgnLFxyXG5cdFx0XHR0eXBlOiAndWludCcsXHJcblx0XHRcdGlucHV0czogW1xyXG5cdFx0XHRcdHsgbmFtZTogJ2lkJywgdHlwZTogJ2ludCcgfVxyXG5cdFx0XHRdXHJcblx0XHR9ICk7XHJcblxyXG5cdFx0Y29uc3QgaW5kaXJlY3RJZCA9IGdldEluZGlyZWN0SW5kZXgoIGludCggdGhpcy5iYXRjaGluZ0lkTm9kZSApICk7XHJcblxyXG5cdFx0Y29uc3QgbWF0cmljZXNUZXh0dXJlID0gdGhpcy5iYXRjaE1lc2guX21hdHJpY2VzVGV4dHVyZTtcclxuXHJcblx0XHRjb25zdCBzaXplID0gaW50KCB0ZXh0dXJlU2l6ZSggdGV4dHVyZUxvYWQoIG1hdHJpY2VzVGV4dHVyZSApLCAwICkueCApO1xyXG5cdFx0Y29uc3QgaiA9IGZsb2F0KCBpbmRpcmVjdElkICkubXVsKCA0ICkudG9JbnQoKS50b1ZhcigpO1xyXG5cclxuXHRcdGNvbnN0IHggPSBqLm1vZCggc2l6ZSApO1xyXG5cdFx0Y29uc3QgeSA9IGouZGl2KCBzaXplICk7XHJcblx0XHRjb25zdCBiYXRjaGluZ01hdHJpeCA9IG1hdDQoXHJcblx0XHRcdHRleHR1cmVMb2FkKCBtYXRyaWNlc1RleHR1cmUsIGl2ZWMyKCB4LCB5ICkgKSxcclxuXHRcdFx0dGV4dHVyZUxvYWQoIG1hdHJpY2VzVGV4dHVyZSwgaXZlYzIoIHguYWRkKCAxICksIHkgKSApLFxyXG5cdFx0XHR0ZXh0dXJlTG9hZCggbWF0cmljZXNUZXh0dXJlLCBpdmVjMiggeC5hZGQoIDIgKSwgeSApICksXHJcblx0XHRcdHRleHR1cmVMb2FkKCBtYXRyaWNlc1RleHR1cmUsIGl2ZWMyKCB4LmFkZCggMyApLCB5ICkgKVxyXG5cdFx0KTtcclxuXHJcblxyXG5cdFx0Y29uc3QgY29sb3JzVGV4dHVyZSA9IHRoaXMuYmF0Y2hNZXNoLl9jb2xvcnNUZXh0dXJlO1xyXG5cclxuXHRcdGlmICggY29sb3JzVGV4dHVyZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGdldEJhdGNoaW5nQ29sb3IgPSBGbiggKCBbIGlkIF0gKSA9PiB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHNpemUgPSBpbnQoIHRleHR1cmVTaXplKCB0ZXh0dXJlTG9hZCggY29sb3JzVGV4dHVyZSApLCAwICkueCApO1xyXG5cdFx0XHRcdGNvbnN0IGogPSBpZDtcclxuXHRcdFx0XHRjb25zdCB4ID0gai5tb2QoIHNpemUgKTtcclxuXHRcdFx0XHRjb25zdCB5ID0gai5kaXYoIHNpemUgKTtcclxuXHRcdFx0XHRyZXR1cm4gdGV4dHVyZUxvYWQoIGNvbG9yc1RleHR1cmUsIGl2ZWMyKCB4LCB5ICkgKS5yZ2I7XHJcblxyXG5cdFx0XHR9ICkuc2V0TGF5b3V0KCB7XHJcblx0XHRcdFx0bmFtZTogJ2dldEJhdGNoaW5nQ29sb3InLFxyXG5cdFx0XHRcdHR5cGU6ICd2ZWMzJyxcclxuXHRcdFx0XHRpbnB1dHM6IFtcclxuXHRcdFx0XHRcdHsgbmFtZTogJ2lkJywgdHlwZTogJ2ludCcgfVxyXG5cdFx0XHRcdF1cclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdFx0Y29uc3QgY29sb3IgPSBnZXRCYXRjaGluZ0NvbG9yKCBpbmRpcmVjdElkICk7XHJcblxyXG5cdFx0XHR2YXJ5aW5nUHJvcGVydHkoICd2ZWMzJywgJ3ZCYXRjaENvbG9yJyApLmFzc2lnbiggY29sb3IgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgYm0gPSBtYXQzKCBiYXRjaGluZ01hdHJpeCApO1xyXG5cclxuXHRcdHBvc2l0aW9uTG9jYWwuYXNzaWduKCBiYXRjaGluZ01hdHJpeC5tdWwoIHBvc2l0aW9uTG9jYWwgKSApO1xyXG5cclxuXHRcdGNvbnN0IHRyYW5zZm9ybWVkTm9ybWFsID0gbm9ybWFsTG9jYWwuZGl2KCB2ZWMzKCBibVsgMCBdLmRvdCggYm1bIDAgXSApLCBibVsgMSBdLmRvdCggYm1bIDEgXSApLCBibVsgMiBdLmRvdCggYm1bIDIgXSApICkgKTtcclxuXHJcblx0XHRjb25zdCBiYXRjaGluZ05vcm1hbCA9IGJtLm11bCggdHJhbnNmb3JtZWROb3JtYWwgKS54eXo7XHJcblxyXG5cdFx0bm9ybWFsTG9jYWwuYXNzaWduKCBiYXRjaGluZ05vcm1hbCApO1xyXG5cclxuXHRcdGlmICggYnVpbGRlci5oYXNHZW9tZXRyeUF0dHJpYnV0ZSggJ3RhbmdlbnQnICkgKSB7XHJcblxyXG5cdFx0XHR0YW5nZW50TG9jYWwubXVsQXNzaWduKCBibSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQmF0Y2hOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSBiYXRjaCBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge0JhdGNoZWRNZXNofSBiYXRjaE1lc2ggLSBBIHJlZmVyZW5jZSB0byBiYXRjaGVkIG1lc2guXHJcbiAqIEByZXR1cm5zIHtCYXRjaE5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYmF0Y2ggPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggQmF0Y2hOb2RlICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAxICk7XHJcbiIsImltcG9ydCB7IG5vZGVQcm94eSB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuaW1wb3J0IEFycmF5RWxlbWVudE5vZGUgZnJvbSAnLi9BcnJheUVsZW1lbnROb2RlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGNsYXNzIGVuYWJsZXMgZWxlbWVudCBhY2Nlc3Mgb24gaW5zdGFuY2VzIG9mIHtAbGluayBTdG9yYWdlQnVmZmVyTm9kZX0uXHJcbiAqIEluIG1vc3QgY2FzZXMsIGl0IGlzIGluZGlyZWN0bHkgdXNlZCB3aGVuIGFjY2Vzc2luZyBlbGVtZW50cyB3aXRoIHRoZVxyXG4gKiB7QGxpbmsgU3RvcmFnZUJ1ZmZlck5vZGUjZWxlbWVudH0gbWV0aG9kLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBwb3NpdGlvbiA9IHBvc2l0aW9uU3RvcmFnZS5lbGVtZW50KCBpbnN0YW5jZUluZGV4ICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQXJyYXlFbGVtZW50Tm9kZVxyXG4gKi9cclxuY2xhc3MgU3RvcmFnZUFycmF5RWxlbWVudE5vZGUgZXh0ZW5kcyBBcnJheUVsZW1lbnROb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnU3RvcmFnZUFycmF5RWxlbWVudE5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgc3RvcmFnZSBidWZmZXIgZWxlbWVudCBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTdG9yYWdlQnVmZmVyTm9kZX0gc3RvcmFnZUJ1ZmZlck5vZGUgLSBUaGUgc3RvcmFnZSBidWZmZXIgbm9kZS5cclxuXHQgKiBAcGFyYW0ge05vZGV9IGluZGV4Tm9kZSAtIFRoZSBpbmRleCBub2RlIHRoYXQgZGVmaW5lcyB0aGUgZWxlbWVudCBhY2Nlc3MuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHN0b3JhZ2VCdWZmZXJOb2RlLCBpbmRleE5vZGUgKSB7XHJcblxyXG5cdFx0c3VwZXIoIHN0b3JhZ2VCdWZmZXJOb2RlLCBpbmRleE5vZGUgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNTdG9yYWdlQXJyYXlFbGVtZW50Tm9kZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIHN0b3JhZ2UgYnVmZmVyIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV9IHZhbHVlXHJcblx0ICogQHR5cGUge1N0b3JhZ2VCdWZmZXJOb2RlfVxyXG5cdCAqL1xyXG5cdHNldCBzdG9yYWdlQnVmZmVyTm9kZSggdmFsdWUgKSB7XHJcblxyXG5cdFx0dGhpcy5ub2RlID0gdmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0IHN0b3JhZ2VCdWZmZXJOb2RlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm5vZGU7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0TWVtYmVyVHlwZSggYnVpbGRlciwgbmFtZSApIHtcclxuXHJcblx0XHRjb25zdCBzdHJ1Y3RUeXBlTm9kZSA9IHRoaXMuc3RvcmFnZUJ1ZmZlck5vZGUuc3RydWN0VHlwZU5vZGU7XHJcblxyXG5cdFx0aWYgKCBzdHJ1Y3RUeXBlTm9kZSApIHtcclxuXHJcblx0XHRcdHJldHVybiBzdHJ1Y3RUeXBlTm9kZS5nZXRNZW1iZXJUeXBlKCBidWlsZGVyLCBuYW1lICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiAndm9pZCc7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXAoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0aWYgKCBidWlsZGVyLmlzQXZhaWxhYmxlKCAnc3RvcmFnZUJ1ZmZlcicgKSA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMubm9kZS5pc1BCTyA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0YnVpbGRlci5zZXR1cFBCTyggdGhpcy5ub2RlICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBzdXBlci5zZXR1cCggYnVpbGRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdGdlbmVyYXRlKCBidWlsZGVyLCBvdXRwdXQgKSB7XHJcblxyXG5cdFx0bGV0IHNuaXBwZXQ7XHJcblxyXG5cdFx0Y29uc3QgaXNBc3NpZ25Db250ZXh0ID0gYnVpbGRlci5jb250ZXh0LmFzc2lnbjtcclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGlmICggYnVpbGRlci5pc0F2YWlsYWJsZSggJ3N0b3JhZ2VCdWZmZXInICkgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLm5vZGUuaXNQQk8gPT09IHRydWUgJiYgaXNBc3NpZ25Db250ZXh0ICE9PSB0cnVlICYmICggdGhpcy5ub2RlLnZhbHVlLmlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlIHx8IGJ1aWxkZXIuc2hhZGVyU3RhZ2UgIT09ICdjb21wdXRlJyApICkge1xyXG5cclxuXHRcdFx0XHRzbmlwcGV0ID0gYnVpbGRlci5nZW5lcmF0ZVBCTyggdGhpcyApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0c25pcHBldCA9IHRoaXMubm9kZS5idWlsZCggYnVpbGRlciApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRzbmlwcGV0ID0gc3VwZXIuZ2VuZXJhdGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBpc0Fzc2lnbkNvbnRleHQgIT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB0eXBlID0gdGhpcy5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cclxuXHRcdFx0c25pcHBldCA9IGJ1aWxkZXIuZm9ybWF0KCBzbmlwcGV0LCB0eXBlLCBvdXRwdXQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHNuaXBwZXQ7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFN0b3JhZ2VBcnJheUVsZW1lbnROb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSBzdG9yYWdlIGVsZW1lbnQgbm9kZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtTdG9yYWdlQnVmZmVyTm9kZX0gc3RvcmFnZUJ1ZmZlck5vZGUgLSBUaGUgc3RvcmFnZSBidWZmZXIgbm9kZS5cclxuICogQHBhcmFtIHtOb2RlfSBpbmRleE5vZGUgLSBUaGUgaW5kZXggbm9kZSB0aGF0IGRlZmluZXMgdGhlIGVsZW1lbnQgYWNjZXNzLlxyXG4gKiBAcmV0dXJucyB7U3RvcmFnZUFycmF5RWxlbWVudE5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgc3RvcmFnZUVsZW1lbnQgPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggU3RvcmFnZUFycmF5RWxlbWVudE5vZGUgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDIgKTtcclxuIiwiaW1wb3J0IEJ1ZmZlck5vZGUgZnJvbSAnLi9CdWZmZXJOb2RlLmpzJztcclxuaW1wb3J0IHsgYnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi9CdWZmZXJBdHRyaWJ1dGVOb2RlLmpzJztcclxuaW1wb3J0IHsgbm9kZU9iamVjdCwgdmFyeWluZyB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuaW1wb3J0IHsgc3RvcmFnZUVsZW1lbnQgfSBmcm9tICcuLi91dGlscy9TdG9yYWdlQXJyYXlFbGVtZW50Tm9kZS5qcyc7XHJcbmltcG9ydCB7IE5vZGVBY2Nlc3MgfSBmcm9tICcuLi9jb3JlL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IGdldFR5cGVGcm9tTGVuZ3RoIH0gZnJvbSAnLi4vY29yZS9Ob2RlVXRpbHMuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgbm9kZSBpcyB1c2VkIGluIGNvbnRleHQgb2YgY29tcHV0ZSBzaGFkZXJzIGFuZCBhbGxvd3MgdG8gZGVmaW5lIGFcclxuICogc3RvcmFnZSBidWZmZXIgZm9yIGRhdGEuIEEgdHlwaWNhbCB3b3JrZmxvdyBpcyB0byBjcmVhdGUgaW5zdGFuY2VzIG9mXHJcbiAqIHRoaXMgbm9kZSB3aXRoIHRoZSBjb252ZW5pZW5jZSBmdW5jdGlvbnMgYGF0dHJpYnV0ZUFycmF5KClgIG9yIGBpbnN0YW5jZWRBcnJheSgpYCxcclxuICogc2V0dXAgdXAgYSBjb21wdXRlIHNoYWRlciB0aGF0IHdyaXRlcyBpbnRvIHRoZSBidWZmZXJzIGFuZCB0aGVuIGNvbnZlcnRcclxuICogdGhlIHN0b3JhZ2UgYnVmZmVycyB0byBhdHRyaWJ1dGUgbm9kZXMgZm9yIHJlbmRlcmluZy5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgcG9zaXRpb25CdWZmZXIgPSBpbnN0YW5jZWRBcnJheSggcGFydGljbGVDb3VudCwgJ3ZlYzMnICk7IC8vIHRoZSBzdG9yYWdlIGJ1ZmZlciBub2RlXHJcbiAqXHJcbiAqIGNvbnN0IGNvbXB1dGVJbml0ID0gRm4oICgpID0+IHsgLy8gdGhlIGNvbXB1dGUgc2hhZGVyXHJcbiAqXHJcbiAqIFx0Y29uc3QgcG9zaXRpb24gPSBwb3NpdGlvbkJ1ZmZlci5lbGVtZW50KCBpbnN0YW5jZUluZGV4ICk7XHJcbiAqXHJcbiAqIFx0Ly8gY29tcHV0ZSBwb3NpdGlvbiBkYXRhXHJcbiAqXHJcbiAqIFx0cG9zaXRpb24ueCA9IDE7XHJcbiAqIFx0cG9zaXRpb24ueSA9IDE7XHJcbiAqIFx0cG9zaXRpb24ueiA9IDE7XHJcbiAqXHJcbiAqIH0gKSgpLmNvbXB1dGUoIHBhcnRpY2xlQ291bnQgKTtcclxuICpcclxuICogY29uc3QgcGFydGljbGVNYXRlcmlhbCA9IG5ldyBUSFJFRS5TcHJpdGVOb2RlTWF0ZXJpYWwoKTtcclxuICogcGFydGljbGVNYXRlcmlhbC5wb3NpdGlvbk5vZGUgPSBwb3NpdGlvbkJ1ZmZlci50b0F0dHJpYnV0ZSgpO1xyXG4gKlxyXG4gKiByZW5kZXJlci5jb21wdXRlQXN5bmMoIGNvbXB1dGVJbml0ICk7XHJcbiAqXHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQnVmZmVyTm9kZVxyXG4gKi9cclxuY2xhc3MgU3RvcmFnZUJ1ZmZlck5vZGUgZXh0ZW5kcyBCdWZmZXJOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnU3RvcmFnZUJ1ZmZlck5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc3RvcmFnZSBidWZmZXIgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7U3RvcmFnZUJ1ZmZlckF0dHJpYnV0ZXxTdG9yYWdlSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlfEJ1ZmZlckF0dHJpYnV0ZX0gdmFsdWUgLSBUaGUgYnVmZmVyIGRhdGEuXHJcblx0ICogQHBhcmFtIHs/KHN0cmluZ3xTdHJ1Y3QpfSBbYnVmZmVyVHlwZT1udWxsXSAtIFRoZSBidWZmZXIgdHlwZSAoZS5nLiBgJ3ZlYzMnYCkuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtidWZmZXJDb3VudD0wXSAtIFRoZSBidWZmZXIgY291bnQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHZhbHVlLCBidWZmZXJUeXBlID0gbnVsbCwgYnVmZmVyQ291bnQgPSAwICkge1xyXG5cclxuXHRcdGxldCBub2RlVHlwZSwgc3RydWN0VHlwZU5vZGUgPSBudWxsO1xyXG5cclxuXHRcdGlmICggYnVmZmVyVHlwZSAmJiBidWZmZXJUeXBlLmlzU3RydWN0ICkge1xyXG5cclxuXHRcdFx0bm9kZVR5cGUgPSAnc3RydWN0JztcclxuXHRcdFx0c3RydWN0VHlwZU5vZGUgPSBidWZmZXJUeXBlLmxheW91dDtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBidWZmZXJUeXBlID09PSBudWxsICYmICggdmFsdWUuaXNTdG9yYWdlQnVmZmVyQXR0cmlidXRlIHx8IHZhbHVlLmlzU3RvcmFnZUluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSApICkge1xyXG5cclxuXHRcdFx0bm9kZVR5cGUgPSBnZXRUeXBlRnJvbUxlbmd0aCggdmFsdWUuaXRlbVNpemUgKTtcclxuXHRcdFx0YnVmZmVyQ291bnQgPSB2YWx1ZS5jb3VudDtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0bm9kZVR5cGUgPSBidWZmZXJUeXBlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRzdXBlciggdmFsdWUsIG5vZGVUeXBlLCBidWZmZXJDb3VudCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1N0b3JhZ2VCdWZmZXJOb2RlID0gdHJ1ZTtcclxuXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYnVmZmVyIHN0cnVjdCB0eXBlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/U3RydWN0VHlwZU5vZGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc3RydWN0VHlwZU5vZGUgPSBzdHJ1Y3RUeXBlTm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBhY2Nlc3MgdHlwZSBvZiB0aGUgdGV4dHVyZSBub2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKiBAZGVmYXVsdCAncmVhZFdyaXRlJ1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFjY2VzcyA9IE5vZGVBY2Nlc3MuUkVBRF9XUklURTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIG5vZGUgaXMgYXRvbWljIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNBdG9taWMgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIG5vZGUgcmVwcmVzZW50cyBhIFBCTyBvciBub3QuXHJcblx0XHQgKiBPbmx5IHJlbGV2YW50IGZvciBXZWJHTC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNQQk8gPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIHRoZSBpbnRlcm5hbCBidWZmZXIgYXR0cmlidXRlIG5vZGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9CdWZmZXJBdHRyaWJ1dGVOb2RlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9hdHRyaWJ1dGUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIGludGVybmFsIHZhcnlpbmcgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1ZhcnlpbmdOb2RlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl92YXJ5aW5nID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIGBTdG9yYWdlQnVmZmVyTm9kZWAgc2V0cyB0aGlzIHByb3BlcnR5IHRvIGB0cnVlYCBieSBkZWZhdWx0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdsb2JhbCA9IHRydWU7XHJcblxyXG5cdFx0aWYgKCB2YWx1ZS5pc1N0b3JhZ2VCdWZmZXJBdHRyaWJ1dGUgIT09IHRydWUgJiYgdmFsdWUuaXNTdG9yYWdlSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlICE9PSB0cnVlICkge1xyXG5cclxuXHRcdFx0Ly8gVE9ETzogSW1wcm92ZSBpdCwgcG9zc2libHkgYWRkaW5nIGEgbmV3IHByb3BlcnR5IHRvIHRoZSBCdWZmZXJBdHRyaWJ1dGUgdG8gaWRlbnRpZnkgaXQgYXMgYSBzdG9yYWdlIGJ1ZmZlciByZWFkLW9ubHkgYXR0cmlidXRlIGluIFJlbmRlcmVyXHJcblxyXG5cdFx0XHRpZiAoIHZhbHVlLmlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlICkgdmFsdWUuaXNTdG9yYWdlSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlID0gdHJ1ZTtcclxuXHRcdFx0ZWxzZSB2YWx1ZS5pc1N0b3JhZ2VCdWZmZXJBdHRyaWJ1dGUgPSB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyBvdmVyd3JpdHRlbiBzaW5jZSB0aGUgYnVmZmVyIGRhdGEgbWlnaHQgYmUgc2hhcmVkXHJcblx0ICogYW5kIHRodXMgdGhlIGhhc2ggc2hvdWxkIGJlIHNoYXJlZCBhcyB3ZWxsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBoYXNoLlxyXG5cdCAqL1xyXG5cdGdldEhhc2goIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmJ1ZmZlckNvdW50ID09PSAwICkge1xyXG5cclxuXHRcdFx0bGV0IGJ1ZmZlckRhdGEgPSBidWlsZGVyLmdsb2JhbENhY2hlLmdldERhdGEoIHRoaXMudmFsdWUgKTtcclxuXHJcblx0XHRcdGlmICggYnVmZmVyRGF0YSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRidWZmZXJEYXRhID0ge1xyXG5cdFx0XHRcdFx0bm9kZTogdGhpc1xyXG5cdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdGJ1aWxkZXIuZ2xvYmFsQ2FjaGUuc2V0RGF0YSggdGhpcy52YWx1ZSwgYnVmZmVyRGF0YSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIGJ1ZmZlckRhdGEubm9kZS51dWlkO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcy51dWlkO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE92ZXJ3cml0ZXMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gcmV0dXJuIGEgZml4ZWQgdmFsdWUgYCdpbmRpcmVjdFN0b3JhZ2VCdWZmZXInYCBvciBgJ3N0b3JhZ2VCdWZmZXInYC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgaW5wdXQgdHlwZS5cclxuXHQgKi9cclxuXHRnZXRJbnB1dFR5cGUoIC8qYnVpbGRlciovICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnZhbHVlLmlzSW5kaXJlY3RTdG9yYWdlQnVmZmVyQXR0cmlidXRlID8gJ2luZGlyZWN0U3RvcmFnZUJ1ZmZlcicgOiAnc3RvcmFnZUJ1ZmZlcic7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRW5hYmxlcyBlbGVtZW50IGFjY2VzcyB3aXRoIHRoZSBnaXZlbiBpbmRleCBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtJbmRleE5vZGV9IGluZGV4Tm9kZSAtIFRoZSBpbmRleCBub2RlLlxyXG5cdCAqIEByZXR1cm4ge1N0b3JhZ2VBcnJheUVsZW1lbnROb2RlfSBBIG5vZGUgcmVwcmVzZW50aW5nIHRoZSBlbGVtZW50IGFjY2Vzcy5cclxuXHQgKi9cclxuXHRlbGVtZW50KCBpbmRleE5vZGUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHN0b3JhZ2VFbGVtZW50KCB0aGlzLCBpbmRleE5vZGUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWZpbmVzIHdoZXRoZXIgdGhpcyBub2RlIGlzIGEgUEJPIG9yIG5vdC4gT25seSByZWxldmFudCBmb3IgV2ViR0wuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbHVlIC0gVGhlIHZhbHVlIHNvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtTdG9yYWdlQnVmZmVyTm9kZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBub2RlLlxyXG5cdCAqL1xyXG5cdHNldFBCTyggdmFsdWUgKSB7XHJcblxyXG5cdFx0dGhpcy5pc1BCTyA9IHZhbHVlO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGBpc1BCT2AgdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBub2RlIHJlcHJlc2VudHMgYSBQQk8gb3Igbm90LlxyXG5cdCAqL1xyXG5cdGdldFBCTygpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5pc1BCTztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWZpbmVzIHRoZSBub2RlIGFjY2Vzcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFRoZSBub2RlIGFjY2Vzcy5cclxuXHQgKiBAcmV0dXJuIHtTdG9yYWdlQnVmZmVyTm9kZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBub2RlLlxyXG5cdCAqL1xyXG5cdHNldEFjY2VzcyggdmFsdWUgKSB7XHJcblxyXG5cdFx0dGhpcy5hY2Nlc3MgPSB2YWx1ZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGNvbmZpZ3VyaW5nIGEgcmVhZC1vbmx5IG5vZGUgYWNjZXNzLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7U3RvcmFnZUJ1ZmZlck5vZGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbm9kZS5cclxuXHQgKi9cclxuXHR0b1JlYWRPbmx5KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnNldEFjY2VzcyggTm9kZUFjY2Vzcy5SRUFEX09OTFkgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWZpbmVzIHdoZXRoZXIgdGhlIG5vZGUgaXMgYXRvbWljIG9yIG5vdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsdWUgLSBUaGUgYXRvbWljIGZsYWcuXHJcblx0ICogQHJldHVybiB7U3RvcmFnZUJ1ZmZlck5vZGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbm9kZS5cclxuXHQgKi9cclxuXHRzZXRBdG9taWMoIHZhbHVlICkge1xyXG5cclxuXHRcdHRoaXMuaXNBdG9taWMgPSB2YWx1ZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIG1ha2luZyB0aGlzIG5vZGUgYXRvbWljLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7U3RvcmFnZUJ1ZmZlck5vZGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbm9kZS5cclxuXHQgKi9cclxuXHR0b0F0b21pYygpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5zZXRBdG9taWMoIHRydWUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGF0dHJpYnV0ZSBkYXRhIGZvciB0aGlzIHN0b3JhZ2UgYnVmZmVyIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHt7YXR0cmlidXRlOiBCdWZmZXJBdHRyaWJ1dGVOb2RlLCB2YXJ5aW5nOiBWYXJ5aW5nTm9kZX19IFRoZSBhdHRyaWJ1dGUgZGF0YS5cclxuXHQgKi9cclxuXHRnZXRBdHRyaWJ1dGVEYXRhKCkge1xyXG5cclxuXHRcdGlmICggdGhpcy5fYXR0cmlidXRlID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5fYXR0cmlidXRlID0gYnVmZmVyQXR0cmlidXRlKCB0aGlzLnZhbHVlICk7XHJcblx0XHRcdHRoaXMuX3ZhcnlpbmcgPSB2YXJ5aW5nKCB0aGlzLl9hdHRyaWJ1dGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHtcclxuXHRcdFx0YXR0cmlidXRlOiB0aGlzLl9hdHRyaWJ1dGUsXHJcblx0XHRcdHZhcnlpbmc6IHRoaXMuX3ZhcnlpbmdcclxuXHRcdH07XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgaXMgb3ZlcndyaXR0ZW4gc2luY2UgdGhlIG5vZGUgdHlwZSBmcm9tIHRoZSBhdmFpbGFiaWxpdHkgb2Ygc3RvcmFnZSBidWZmZXJzXHJcblx0ICogYW5kIHRoZSBhdHRyaWJ1dGUgZGF0YS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgbm9kZSB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldE5vZGVUeXBlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5zdHJ1Y3RUeXBlTm9kZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHJldHVybiB0aGlzLnN0cnVjdFR5cGVOb2RlLmdldE5vZGVUeXBlKCBidWlsZGVyICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggYnVpbGRlci5pc0F2YWlsYWJsZSggJ3N0b3JhZ2VCdWZmZXInICkgfHwgYnVpbGRlci5pc0F2YWlsYWJsZSggJ2luZGlyZWN0U3RvcmFnZUJ1ZmZlcicgKSApIHtcclxuXHJcblx0XHRcdHJldHVybiBzdXBlci5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCB7IGF0dHJpYnV0ZSB9ID0gdGhpcy5nZXRBdHRyaWJ1dGVEYXRhKCk7XHJcblxyXG5cdFx0cmV0dXJuIGF0dHJpYnV0ZS5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyB0aGUgY29kZSBzbmlwcGV0IG9mIHRoZSBzdG9yYWdlIGJ1ZmZlciBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBnZW5lcmF0ZWQgY29kZSBzbmlwcGV0LlxyXG5cdCAqL1xyXG5cdGdlbmVyYXRlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5zdHJ1Y3RUeXBlTm9kZSAhPT0gbnVsbCApIHRoaXMuc3RydWN0VHlwZU5vZGUuYnVpbGQoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRpZiAoIGJ1aWxkZXIuaXNBdmFpbGFibGUoICdzdG9yYWdlQnVmZmVyJyApIHx8IGJ1aWxkZXIuaXNBdmFpbGFibGUoICdpbmRpcmVjdFN0b3JhZ2VCdWZmZXInICkgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gc3VwZXIuZ2VuZXJhdGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgeyBhdHRyaWJ1dGUsIHZhcnlpbmcgfSA9IHRoaXMuZ2V0QXR0cmlidXRlRGF0YSgpO1xyXG5cclxuXHRcdGNvbnN0IG91dHB1dCA9IHZhcnlpbmcuYnVpbGQoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRidWlsZGVyLnJlZ2lzdGVyVHJhbnNmb3JtKCBvdXRwdXQsIGF0dHJpYnV0ZSApO1xyXG5cclxuXHRcdHJldHVybiBvdXRwdXQ7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFN0b3JhZ2VCdWZmZXJOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSBzdG9yYWdlIGJ1ZmZlciBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge1N0b3JhZ2VCdWZmZXJBdHRyaWJ1dGV8U3RvcmFnZUluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZXxCdWZmZXJBdHRyaWJ1dGV9IHZhbHVlIC0gVGhlIGJ1ZmZlciBkYXRhLlxyXG4gKiBAcGFyYW0gez8oc3RyaW5nfFN0cnVjdCl9IFt0eXBlPW51bGxdIC0gVGhlIGJ1ZmZlciB0eXBlIChlLmcuIGAndmVjMydgKS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtjb3VudD0wXSAtIFRoZSBidWZmZXIgY291bnQuXHJcbiAqIEByZXR1cm5zIHtTdG9yYWdlQnVmZmVyTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBzdG9yYWdlID0gKCB2YWx1ZSwgdHlwZSA9IG51bGwsIGNvdW50ID0gMCApID0+IG5vZGVPYmplY3QoIG5ldyBTdG9yYWdlQnVmZmVyTm9kZSggdmFsdWUsIHR5cGUsIGNvdW50ICkgKTtcclxuXHJcbi8qKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAZGVwcmVjYXRlZCBzaW5jZSByMTcxLiBVc2UgYHN0b3JhZ2UoKS5zZXRQQk8oIHRydWUgKWAgaW5zdGVhZC5cclxuICpcclxuICogQHBhcmFtIHtTdG9yYWdlQnVmZmVyQXR0cmlidXRlfFN0b3JhZ2VJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGV8QnVmZmVyQXR0cmlidXRlfSB2YWx1ZSAtIFRoZSBidWZmZXIgZGF0YS5cclxuICogQHBhcmFtIHs/c3RyaW5nfSB0eXBlIC0gVGhlIGJ1ZmZlciB0eXBlIChlLmcuIGAndmVjMydgKS5cclxuICogQHBhcmFtIHtudW1iZXJ9IGNvdW50IC0gVGhlIGJ1ZmZlciBjb3VudC5cclxuICogQHJldHVybnMge1N0b3JhZ2VCdWZmZXJOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHN0b3JhZ2VPYmplY3QgPSAoIHZhbHVlLCB0eXBlLCBjb3VudCApID0+IHsgLy8gQGRlcHJlY2F0ZWQsIHIxNzFcclxuXHJcblx0Y29uc29sZS53YXJuKCAnVEhSRUUuVFNMOiBcInN0b3JhZ2VPYmplY3QoKVwiIGlzIGRlcHJlY2F0ZWQuIFVzZSBcInN0b3JhZ2UoKS5zZXRQQk8oIHRydWUgKVwiIGluc3RlYWQuJyApO1xyXG5cclxuXHRyZXR1cm4gc3RvcmFnZSggdmFsdWUsIHR5cGUsIGNvdW50ICkuc2V0UEJPKCB0cnVlICk7XHJcblxyXG59O1xyXG4iLCJpbXBvcnQgTm9kZSBmcm9tICcuLi9jb3JlL05vZGUuanMnO1xyXG5pbXBvcnQgeyBOb2RlVXBkYXRlVHlwZSB9IGZyb20gJy4uL2NvcmUvY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgbm9kZU9iamVjdCB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuaW1wb3J0IHsgYXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9BdHRyaWJ1dGVOb2RlLmpzJztcclxuaW1wb3J0IHsgcmVmZXJlbmNlLCByZWZlcmVuY2VCdWZmZXIgfSBmcm9tICcuL1JlZmVyZW5jZU5vZGUuanMnO1xyXG5pbXBvcnQgeyBhZGQgfSBmcm9tICcuLi9tYXRoL09wZXJhdG9yTm9kZS5qcyc7XHJcbmltcG9ydCB7IG5vcm1hbExvY2FsIH0gZnJvbSAnLi9Ob3JtYWwuanMnO1xyXG5pbXBvcnQgeyBwb3NpdGlvbkxvY2FsLCBwb3NpdGlvblByZXZpb3VzIH0gZnJvbSAnLi9Qb3NpdGlvbi5qcyc7XHJcbmltcG9ydCB7IHRhbmdlbnRMb2NhbCB9IGZyb20gJy4vVGFuZ2VudC5qcyc7XHJcbmltcG9ydCB7IHVuaWZvcm0gfSBmcm9tICcuLi9jb3JlL1VuaWZvcm1Ob2RlLmpzJztcclxuaW1wb3J0IHsgYnVmZmVyIH0gZnJvbSAnLi9CdWZmZXJOb2RlLmpzJztcclxuaW1wb3J0IHsgZ2V0RGF0YUZyb21PYmplY3QgfSBmcm9tICcuLi9jb3JlL05vZGVVdGlscy5qcyc7XHJcbmltcG9ydCB7IHN0b3JhZ2UgfSBmcm9tICcuL1N0b3JhZ2VCdWZmZXJOb2RlLmpzJztcclxuaW1wb3J0IHsgSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vLi4vY29yZS9JbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5pbXBvcnQgeyBpbnN0YW5jZUluZGV4IH0gZnJvbSAnLi4vY29yZS9JbmRleE5vZGUuanMnO1xyXG5cclxuY29uc3QgX2ZyYW1lSWQgPSBuZXcgV2Vha01hcCgpO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgbm9kZSBpbXBsZW1lbnRzIHRoZSB2ZXJ0ZXggdHJhbnNmb3JtYXRpb24gc2hhZGVyIGxvZ2ljIHdoaWNoIGlzIHJlcXVpcmVkXHJcbiAqIGZvciBza2lubmluZy9za2VsZXRhbCBhbmltYXRpb24uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBOb2RlXHJcbiAqL1xyXG5jbGFzcyBTa2lubmluZ05vZGUgZXh0ZW5kcyBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnU2tpbm5pbmdOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHNraW5uaW5nIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1NraW5uZWRNZXNofSBza2lubmVkTWVzaCAtIFRoZSBza2lubmVkIG1lc2guXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHNraW5uZWRNZXNoICkge1xyXG5cclxuXHRcdHN1cGVyKCAndm9pZCcgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBza2lubmVkIG1lc2guXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1NraW5uZWRNZXNofVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNraW5uZWRNZXNoID0gc2tpbm5lZE1lc2g7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdXBkYXRlIHR5cGUgb3ZlcndyaXR0ZW4gc2luY2Ugc2tpbm5pbmcgbm9kZXMgYXJlIHVwZGF0ZWQgcGVyIG9iamVjdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVwZGF0ZVR5cGUgPSBOb2RlVXBkYXRlVHlwZS5PQkpFQ1Q7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBza2luIGluZGV4IGF0dHJpYnV0ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXR0cmlidXRlTm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5za2luSW5kZXhOb2RlID0gYXR0cmlidXRlKCAnc2tpbkluZGV4JywgJ3V2ZWM0JyApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHNraW4gd2VpZ2h0IGF0dHJpYnV0ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXR0cmlidXRlTm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5za2luV2VpZ2h0Tm9kZSA9IGF0dHJpYnV0ZSggJ3NraW5XZWlnaHQnLCAndmVjNCcgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBiaW5kIG1hdHJpeCBub2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlPG1hdDQ+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJpbmRNYXRyaXhOb2RlID0gcmVmZXJlbmNlKCAnYmluZE1hdHJpeCcsICdtYXQ0JyApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGJpbmQgbWF0cml4IGludmVyc2Ugbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZTxtYXQ0Pn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5iaW5kTWF0cml4SW52ZXJzZU5vZGUgPSByZWZlcmVuY2UoICdiaW5kTWF0cml4SW52ZXJzZScsICdtYXQ0JyApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGJpbmQgbWF0cmljZXMgYXMgYSB1bmlmb3JtIGJ1ZmZlciBub2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJvbmVNYXRyaWNlc05vZGUgPSByZWZlcmVuY2VCdWZmZXIoICdza2VsZXRvbi5ib25lTWF0cmljZXMnLCAnbWF0NCcsIHNraW5uZWRNZXNoLnNrZWxldG9uLmJvbmVzLmxlbmd0aCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGN1cnJlbnQgdmVydGV4IHBvc2l0aW9uIGluIGxvY2FsIHNwYWNlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlPHZlYzM+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBvc2l0aW9uTm9kZSA9IHBvc2l0aW9uTG9jYWw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcmVzdWx0IG9mIHZlcnRleCBwb3NpdGlvbiBpbiBsb2NhbCBzcGFjZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZTx2ZWMzPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50b1Bvc2l0aW9uTm9kZSA9IHBvc2l0aW9uTG9jYWw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcHJldmlvdXMgYmluZCBtYXRyaWNlcyBhcyBhIHVuaWZvcm0gYnVmZmVyIG5vZGUuXHJcblx0XHQgKiBSZXF1aXJlZCBmb3IgY29tcHV0aW5nIG1vdGlvbiB2ZWN0b3JzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Tm9kZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wcmV2aW91c0JvbmVNYXRyaWNlc05vZGUgPSBudWxsO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRyYW5zZm9ybXMgdGhlIGdpdmVuIHZlcnRleCBwb3NpdGlvbiB2aWEgc2tpbm5pbmcuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV9IFtib25lTWF0cmljZXM9dGhpcy5ib25lTWF0cmljZXNOb2RlXSAtIFRoZSBib25lIG1hdHJpY2VzXHJcblx0ICogQHBhcmFtIHtOb2RlPHZlYzM+fSBbcG9zaXRpb249dGhpcy5wb3NpdGlvbk5vZGVdIC0gVGhlIHZlcnRleCBwb3NpdGlvbiBpbiBsb2NhbCBzcGFjZS5cclxuXHQgKiBAcmV0dXJuIHtOb2RlPHZlYzM+fSBUaGUgdHJhbnNmb3JtZWQgdmVydGV4IHBvc2l0aW9uLlxyXG5cdCAqL1xyXG5cdGdldFNraW5uZWRQb3NpdGlvbiggYm9uZU1hdHJpY2VzID0gdGhpcy5ib25lTWF0cmljZXNOb2RlLCBwb3NpdGlvbiA9IHRoaXMucG9zaXRpb25Ob2RlICkge1xyXG5cclxuXHRcdGNvbnN0IHsgc2tpbkluZGV4Tm9kZSwgc2tpbldlaWdodE5vZGUsIGJpbmRNYXRyaXhOb2RlLCBiaW5kTWF0cml4SW52ZXJzZU5vZGUgfSA9IHRoaXM7XHJcblxyXG5cdFx0Y29uc3QgYm9uZU1hdFggPSBib25lTWF0cmljZXMuZWxlbWVudCggc2tpbkluZGV4Tm9kZS54ICk7XHJcblx0XHRjb25zdCBib25lTWF0WSA9IGJvbmVNYXRyaWNlcy5lbGVtZW50KCBza2luSW5kZXhOb2RlLnkgKTtcclxuXHRcdGNvbnN0IGJvbmVNYXRaID0gYm9uZU1hdHJpY2VzLmVsZW1lbnQoIHNraW5JbmRleE5vZGUueiApO1xyXG5cdFx0Y29uc3QgYm9uZU1hdFcgPSBib25lTWF0cmljZXMuZWxlbWVudCggc2tpbkluZGV4Tm9kZS53ICk7XHJcblxyXG5cdFx0Ly8gUE9TSVRJT05cclxuXHJcblx0XHRjb25zdCBza2luVmVydGV4ID0gYmluZE1hdHJpeE5vZGUubXVsKCBwb3NpdGlvbiApO1xyXG5cclxuXHRcdGNvbnN0IHNraW5uZWQgPSBhZGQoXHJcblx0XHRcdGJvbmVNYXRYLm11bCggc2tpbldlaWdodE5vZGUueCApLm11bCggc2tpblZlcnRleCApLFxyXG5cdFx0XHRib25lTWF0WS5tdWwoIHNraW5XZWlnaHROb2RlLnkgKS5tdWwoIHNraW5WZXJ0ZXggKSxcclxuXHRcdFx0Ym9uZU1hdFoubXVsKCBza2luV2VpZ2h0Tm9kZS56ICkubXVsKCBza2luVmVydGV4ICksXHJcblx0XHRcdGJvbmVNYXRXLm11bCggc2tpbldlaWdodE5vZGUudyApLm11bCggc2tpblZlcnRleCApXHJcblx0XHQpO1xyXG5cclxuXHRcdHJldHVybiBiaW5kTWF0cml4SW52ZXJzZU5vZGUubXVsKCBza2lubmVkICkueHl6O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRyYW5zZm9ybXMgdGhlIGdpdmVuIHZlcnRleCBub3JtYWwgdmlhIHNraW5uaW5nLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlfSBbYm9uZU1hdHJpY2VzPXRoaXMuYm9uZU1hdHJpY2VzTm9kZV0gLSBUaGUgYm9uZSBtYXRyaWNlc1xyXG5cdCAqIEBwYXJhbSB7Tm9kZTx2ZWMzPn0gW25vcm1hbD1ub3JtYWxMb2NhbF0gLSBUaGUgdmVydGV4IG5vcm1hbCBpbiBsb2NhbCBzcGFjZS5cclxuXHQgKiBAcmV0dXJuIHtOb2RlPHZlYzM+fSBUaGUgdHJhbnNmb3JtZWQgdmVydGV4IG5vcm1hbC5cclxuXHQgKi9cclxuXHRnZXRTa2lubmVkTm9ybWFsKCBib25lTWF0cmljZXMgPSB0aGlzLmJvbmVNYXRyaWNlc05vZGUsIG5vcm1hbCA9IG5vcm1hbExvY2FsICkge1xyXG5cclxuXHRcdGNvbnN0IHsgc2tpbkluZGV4Tm9kZSwgc2tpbldlaWdodE5vZGUsIGJpbmRNYXRyaXhOb2RlLCBiaW5kTWF0cml4SW52ZXJzZU5vZGUgfSA9IHRoaXM7XHJcblxyXG5cdFx0Y29uc3QgYm9uZU1hdFggPSBib25lTWF0cmljZXMuZWxlbWVudCggc2tpbkluZGV4Tm9kZS54ICk7XHJcblx0XHRjb25zdCBib25lTWF0WSA9IGJvbmVNYXRyaWNlcy5lbGVtZW50KCBza2luSW5kZXhOb2RlLnkgKTtcclxuXHRcdGNvbnN0IGJvbmVNYXRaID0gYm9uZU1hdHJpY2VzLmVsZW1lbnQoIHNraW5JbmRleE5vZGUueiApO1xyXG5cdFx0Y29uc3QgYm9uZU1hdFcgPSBib25lTWF0cmljZXMuZWxlbWVudCggc2tpbkluZGV4Tm9kZS53ICk7XHJcblxyXG5cdFx0Ly8gTk9STUFMXHJcblxyXG5cdFx0bGV0IHNraW5NYXRyaXggPSBhZGQoXHJcblx0XHRcdHNraW5XZWlnaHROb2RlLngubXVsKCBib25lTWF0WCApLFxyXG5cdFx0XHRza2luV2VpZ2h0Tm9kZS55Lm11bCggYm9uZU1hdFkgKSxcclxuXHRcdFx0c2tpbldlaWdodE5vZGUuei5tdWwoIGJvbmVNYXRaICksXHJcblx0XHRcdHNraW5XZWlnaHROb2RlLncubXVsKCBib25lTWF0VyApXHJcblx0XHQpO1xyXG5cclxuXHRcdHNraW5NYXRyaXggPSBiaW5kTWF0cml4SW52ZXJzZU5vZGUubXVsKCBza2luTWF0cml4ICkubXVsKCBiaW5kTWF0cml4Tm9kZSApO1xyXG5cclxuXHRcdHJldHVybiBza2luTWF0cml4LnRyYW5zZm9ybURpcmVjdGlvbiggbm9ybWFsICkueHl6O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRyYW5zZm9ybXMgdGhlIGdpdmVuIHZlcnRleCBub3JtYWwgdmlhIHNraW5uaW5nLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtOb2RlPHZlYzM+fSBUaGUgc2tpbm5lZCBwb3NpdGlvbiBmcm9tIHRoZSBwcmV2aW91cyBmcmFtZS5cclxuXHQgKi9cclxuXHRnZXRQcmV2aW91c1NraW5uZWRQb3NpdGlvbiggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCBza2lubmVkTWVzaCA9IGJ1aWxkZXIub2JqZWN0O1xyXG5cclxuXHRcdGlmICggdGhpcy5wcmV2aW91c0JvbmVNYXRyaWNlc05vZGUgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRza2lubmVkTWVzaC5za2VsZXRvbi5wcmV2aW91c0JvbmVNYXRyaWNlcyA9IG5ldyBGbG9hdDMyQXJyYXkoIHNraW5uZWRNZXNoLnNrZWxldG9uLmJvbmVNYXRyaWNlcyApO1xyXG5cclxuXHRcdFx0dGhpcy5wcmV2aW91c0JvbmVNYXRyaWNlc05vZGUgPSByZWZlcmVuY2VCdWZmZXIoICdza2VsZXRvbi5wcmV2aW91c0JvbmVNYXRyaWNlcycsICdtYXQ0Jywgc2tpbm5lZE1lc2guc2tlbGV0b24uYm9uZXMubGVuZ3RoICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzLmdldFNraW5uZWRQb3NpdGlvbiggdGhpcy5wcmV2aW91c0JvbmVNYXRyaWNlc05vZGUsIHBvc2l0aW9uUHJldmlvdXMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiBib25lIG1hdHJpY2VzIGZyb20gdGhlIHByZXZpb3VzIGZyYW1lIGFyZSByZXF1aXJlZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciBib25lIG1hdHJpY2VzIGZyb20gdGhlIHByZXZpb3VzIGZyYW1lIGFyZSByZXF1aXJlZCBvciBub3QuXHJcblx0ICovXHJcblx0bmVlZHNQcmV2aW91c0JvbmVNYXRyaWNlcyggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCBtcnQgPSBidWlsZGVyLnJlbmRlcmVyLmdldE1SVCgpO1xyXG5cclxuXHRcdHJldHVybiAoIG1ydCAmJiBtcnQuaGFzKCAndmVsb2NpdHknICkgKSB8fCBnZXREYXRhRnJvbU9iamVjdCggYnVpbGRlci5vYmplY3QgKS51c2VWZWxvY2l0eSA9PT0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXR1cHMgdGhlIHNraW5uaW5nIG5vZGUgYnkgYXNzaWduaW5nIHRoZSB0cmFuc2Zvcm1lZCB2ZXJ0ZXggZGF0YSB0byBwcmVkZWZpbmVkIG5vZGUgdmFyaWFibGVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtOb2RlPHZlYzM+fSBUaGUgdHJhbnNmb3JtZWQgdmVydGV4IHBvc2l0aW9uLlxyXG5cdCAqL1xyXG5cdHNldHVwKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5uZWVkc1ByZXZpb3VzQm9uZU1hdHJpY2VzKCBidWlsZGVyICkgKSB7XHJcblxyXG5cdFx0XHRwb3NpdGlvblByZXZpb3VzLmFzc2lnbiggdGhpcy5nZXRQcmV2aW91c1NraW5uZWRQb3NpdGlvbiggYnVpbGRlciApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHNraW5Qb3NpdGlvbiA9IHRoaXMuZ2V0U2tpbm5lZFBvc2l0aW9uKCk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLnRvUG9zaXRpb25Ob2RlICkgdGhpcy50b1Bvc2l0aW9uTm9kZS5hc3NpZ24oIHNraW5Qb3NpdGlvbiApO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0aWYgKCBidWlsZGVyLmhhc0dlb21ldHJ5QXR0cmlidXRlKCAnbm9ybWFsJyApICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgc2tpbk5vcm1hbCA9IHRoaXMuZ2V0U2tpbm5lZE5vcm1hbCgpO1xyXG5cclxuXHRcdFx0bm9ybWFsTG9jYWwuYXNzaWduKCBza2luTm9ybWFsICk7XHJcblxyXG5cdFx0XHRpZiAoIGJ1aWxkZXIuaGFzR2VvbWV0cnlBdHRyaWJ1dGUoICd0YW5nZW50JyApICkge1xyXG5cclxuXHRcdFx0XHR0YW5nZW50TG9jYWwuYXNzaWduKCBza2luTm9ybWFsICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBza2luUG9zaXRpb247XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2VuZXJhdGVzIHRoZSBjb2RlIHNuaXBwZXQgb2YgdGhlIHNraW5uaW5nIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBvdXRwdXQgLSBUaGUgY3VycmVudCBvdXRwdXQuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgZ2VuZXJhdGVkIGNvZGUgc25pcHBldC5cclxuXHQgKi9cclxuXHRnZW5lcmF0ZSggYnVpbGRlciwgb3V0cHV0ICkge1xyXG5cclxuXHRcdGlmICggb3V0cHV0ICE9PSAndm9pZCcgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gc3VwZXIuZ2VuZXJhdGUoIGJ1aWxkZXIsIG91dHB1dCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoZSBzdGF0ZSBvZiB0aGUgc2tpbm5lZCBtZXNoIGJ5IHVwZGF0aW5nIHRoZSBza2VsZXRvbiBvbmNlIHBlciBmcmFtZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUZyYW1lfSBmcmFtZSAtIFRoZSBjdXJyZW50IG5vZGUgZnJhbWUuXHJcblx0ICovXHJcblx0dXBkYXRlKCBmcmFtZSApIHtcclxuXHJcblx0XHRjb25zdCBza2VsZXRvbiA9IGZyYW1lLm9iamVjdCAmJiBmcmFtZS5vYmplY3Quc2tlbGV0b24gPyBmcmFtZS5vYmplY3Quc2tlbGV0b24gOiB0aGlzLnNraW5uZWRNZXNoLnNrZWxldG9uO1xyXG5cclxuXHRcdGlmICggX2ZyYW1lSWQuZ2V0KCBza2VsZXRvbiApID09PSBmcmFtZS5mcmFtZUlkICkgcmV0dXJuO1xyXG5cclxuXHRcdF9mcmFtZUlkLnNldCggc2tlbGV0b24sIGZyYW1lLmZyYW1lSWQgKTtcclxuXHJcblx0XHRpZiAoIHRoaXMucHJldmlvdXNCb25lTWF0cmljZXNOb2RlICE9PSBudWxsICkgc2tlbGV0b24ucHJldmlvdXNCb25lTWF0cmljZXMuc2V0KCBza2VsZXRvbi5ib25lTWF0cmljZXMgKTtcclxuXHJcblx0XHRza2VsZXRvbi51cGRhdGUoKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgU2tpbm5pbmdOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSBza2lubmluZyBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge1NraW5uZWRNZXNofSBza2lubmVkTWVzaCAtIFRoZSBza2lubmVkIG1lc2guXHJcbiAqIEByZXR1cm5zIHtTa2lubmluZ05vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgc2tpbm5pbmcgPSAoIHNraW5uZWRNZXNoICkgPT4gbm9kZU9iamVjdCggbmV3IFNraW5uaW5nTm9kZSggc2tpbm5lZE1lc2ggKSApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY29tcHV0aW5nIHNraW5uaW5nLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge1NraW5uZWRNZXNofSBza2lubmVkTWVzaCAtIFRoZSBza2lubmVkIG1lc2guXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMzPn0gW3RvUG9zaXRpb249bnVsbF0gLSBUaGUgdGFyZ2V0IHBvc2l0aW9uLlxyXG4gKiBAcmV0dXJucyB7U2tpbm5pbmdOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGNvbXB1dGVTa2lubmluZyA9ICggc2tpbm5lZE1lc2gsIHRvUG9zaXRpb24gPSBudWxsICkgPT4ge1xyXG5cclxuXHRjb25zdCBub2RlID0gbmV3IFNraW5uaW5nTm9kZSggc2tpbm5lZE1lc2ggKTtcclxuXHRub2RlLnBvc2l0aW9uTm9kZSA9IHN0b3JhZ2UoIG5ldyBJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUoIHNraW5uZWRNZXNoLmdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJyApLmFycmF5LCAzICksICd2ZWMzJyApLnNldFBCTyggdHJ1ZSApLnRvUmVhZE9ubHkoKS5lbGVtZW50KCBpbnN0YW5jZUluZGV4ICkudG9WYXIoKTtcclxuXHRub2RlLnNraW5JbmRleE5vZGUgPSBzdG9yYWdlKCBuZXcgSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlKCBuZXcgVWludDMyQXJyYXkoIHNraW5uZWRNZXNoLmdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ3NraW5JbmRleCcgKS5hcnJheSApLCA0ICksICd1dmVjNCcgKS5zZXRQQk8oIHRydWUgKS50b1JlYWRPbmx5KCkuZWxlbWVudCggaW5zdGFuY2VJbmRleCApLnRvVmFyKCk7XHJcblx0bm9kZS5za2luV2VpZ2h0Tm9kZSA9IHN0b3JhZ2UoIG5ldyBJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUoIHNraW5uZWRNZXNoLmdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ3NraW5XZWlnaHQnICkuYXJyYXksIDQgKSwgJ3ZlYzQnICkuc2V0UEJPKCB0cnVlICkudG9SZWFkT25seSgpLmVsZW1lbnQoIGluc3RhbmNlSW5kZXggKS50b1ZhcigpO1xyXG5cdG5vZGUuYmluZE1hdHJpeE5vZGUgPSB1bmlmb3JtKCBza2lubmVkTWVzaC5iaW5kTWF0cml4LCAnbWF0NCcgKTtcclxuXHRub2RlLmJpbmRNYXRyaXhJbnZlcnNlTm9kZSA9IHVuaWZvcm0oIHNraW5uZWRNZXNoLmJpbmRNYXRyaXhJbnZlcnNlLCAnbWF0NCcgKTtcclxuXHRub2RlLmJvbmVNYXRyaWNlc05vZGUgPSBidWZmZXIoIHNraW5uZWRNZXNoLnNrZWxldG9uLmJvbmVNYXRyaWNlcywgJ21hdDQnLCBza2lubmVkTWVzaC5za2VsZXRvbi5ib25lcy5sZW5ndGggKTtcclxuXHRub2RlLnRvUG9zaXRpb25Ob2RlID0gdG9Qb3NpdGlvbjtcclxuXHJcblx0cmV0dXJuIG5vZGVPYmplY3QoIG5vZGUgKTtcclxuXHJcbn07XHJcbiIsImltcG9ydCBOb2RlIGZyb20gJy4uL2NvcmUvTm9kZS5qcyc7XHJcbmltcG9ydCB7IGV4cHJlc3Npb24gfSBmcm9tICcuLi9jb2RlL0V4cHJlc3Npb25Ob2RlLmpzJztcclxuaW1wb3J0IHsgbm9kZU9iamVjdCwgbm9kZUFycmF5IH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgbW9kdWxlIG9mZmVycyBhIHZhcmlldHkgb2Ygd2F5cyB0byBpbXBsZW1lbnQgbG9vcHMgaW4gVFNMLiBJbiBpdCdzIGJhc2ljIGZvcm0gaXQnczpcclxuICogYGBganNcclxuICogTG9vcCggY291bnQsICggeyBpIH0gKSA9PiB7XHJcbiAqXHJcbiAqIH0gKTtcclxuICogYGBgXHJcbiAqIEhvd2V2ZXIsIGl0IGlzIGFsc28gcG9zc2libGUgdG8gZGVmaW5lIGEgc3RhcnQgYW5kIGVuZCByYW5nZXMsIGRhdGEgdHlwZXMgYW5kIGxvb3AgY29uZGl0aW9uczpcclxuICogYGBganNcclxuICogTG9vcCggeyBzdGFydDogaW50KCAwICksIGVuZDogaW50KCAxMCApLCB0eXBlOiAnaW50JywgY29uZGl0aW9uOiAnPCcgfSwgKCB7IGkgfSApID0+IHtcclxuICpcclxuICogfSApO1xyXG4gKmBgYFxyXG4gKiBOZXN0ZWQgbG9vcHMgY2FuIGJlIGRlZmluZWQgaW4gYSBjb21wYWN0ZWQgZm9ybTpcclxuICogYGBganNcclxuICogTG9vcCggMTAsIDUsICggeyBpLCBqIH0gKSA9PiB7XHJcbiAqXHJcbiAqIH0gKTtcclxuICogYGBgXHJcbiAqIExvb3BzIHRoYXQgc2hvdWxkIHJ1biBiYWNrd2FyZHMgY2FuIGJlIGRlZmluZWQgbGlrZSBzbzpcclxuICogYGBganNcclxuICogTG9vcCggeyBzdGFydDogMTAgfSwgKCkgPT4ge30gKTtcclxuICogYGBgXHJcbiAqIEl0IGlzIHBvc3NpYmxlIHRvIGV4ZWN1dGUgd2l0aCBib29sZWFuIHZhbHVlcywgc2ltaWxhciB0byB0aGUgYHdoaWxlYCBzeW50YXguXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IHZhbHVlID0gZmxvYXQoIDAgKS50b1ZhcigpO1xyXG4gKlxyXG4gKiBMb29wKCB2YWx1ZS5sZXNzVGhhbiggMTAgKSwgKCkgPT4ge1xyXG4gKlxyXG4gKiBcdHZhbHVlLmFkZEFzc2lnbiggMSApO1xyXG4gKlxyXG4gKiB9ICk7XHJcbiAqIGBgYFxyXG4gKiBUaGUgbW9kdWxlIGFsc28gcHJvdmlkZXMgYEJyZWFrKClgIGFuZCBgQ29udGludWUoKWAgVFNMIGV4cHJlc3Npb24gZm9yIGxvb3AgY29udHJvbC5cclxuICogQGF1Z21lbnRzIE5vZGVcclxuICovXHJcbmNsYXNzIExvb3BOb2RlIGV4dGVuZHMgTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ0xvb3BOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGxvb3Agbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8YW55Pn0gcGFyYW1zIC0gRGVwZW5kaW5nIG9uIHRoZSBsb29wIHR5cGUsIGFycmF5IGhvbGRzIGRpZmZlcmVudCBwYXJhbWV0ZXJpemF0aW9uIHZhbHVlcyBmb3IgdGhlIGxvb3AuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHBhcmFtcyA9IFtdICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0dGhpcy5wYXJhbXMgPSBwYXJhbXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIGxvb3AgdmFyaWFibGUgbmFtZSBiYXNlZCBvbiBhbiBpbmRleC4gVGhlIHBhdHRlcm4gaXNcclxuXHQgKiBgMGAgPSBgaWAsIGAxYD0gYGpgLCBgMmA9IGBrYCBhbmQgc28gb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXguXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgbG9vcCB2YXJpYWJsZSBuYW1lLlxyXG5cdCAqL1xyXG5cdGdldFZhck5hbWUoIGluZGV4ICkge1xyXG5cclxuXHRcdHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKCAnaScuY2hhckNvZGVBdCggMCApICsgaW5kZXggKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHByb3BlcnRpZXMgYWJvdXQgdGhpcyBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBub2RlIHByb3BlcnRpZXMuXHJcblx0ICovXHJcblx0Z2V0UHJvcGVydGllcyggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCBwcm9wZXJ0aWVzID0gYnVpbGRlci5nZXROb2RlUHJvcGVydGllcyggdGhpcyApO1xyXG5cclxuXHRcdGlmICggcHJvcGVydGllcy5zdGFja05vZGUgIT09IHVuZGVmaW5lZCApIHJldHVybiBwcm9wZXJ0aWVzO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0Y29uc3QgaW5wdXRzID0ge307XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gdGhpcy5wYXJhbXMubGVuZ3RoIC0gMTsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBwYXJhbSA9IHRoaXMucGFyYW1zWyBpIF07XHJcblxyXG5cdFx0XHRjb25zdCBuYW1lID0gKCBwYXJhbS5pc05vZGUgIT09IHRydWUgJiYgcGFyYW0ubmFtZSApIHx8IHRoaXMuZ2V0VmFyTmFtZSggaSApO1xyXG5cdFx0XHRjb25zdCB0eXBlID0gKCBwYXJhbS5pc05vZGUgIT09IHRydWUgJiYgcGFyYW0udHlwZSApIHx8ICdpbnQnO1xyXG5cclxuXHRcdFx0aW5wdXRzWyBuYW1lIF0gPSBleHByZXNzaW9uKCBuYW1lLCB0eXBlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHN0YWNrID0gYnVpbGRlci5hZGRTdGFjaygpOyAvLyBUT0RPOiBjYWNoZSgpIGl0XHJcblxyXG5cdFx0cHJvcGVydGllcy5yZXR1cm5zTm9kZSA9IHRoaXMucGFyYW1zWyB0aGlzLnBhcmFtcy5sZW5ndGggLSAxIF0oIGlucHV0cywgc3RhY2ssIGJ1aWxkZXIgKTtcclxuXHRcdHByb3BlcnRpZXMuc3RhY2tOb2RlID0gc3RhY2s7XHJcblxyXG5cdFx0YnVpbGRlci5yZW1vdmVTdGFjaygpO1xyXG5cclxuXHRcdHJldHVybiBwcm9wZXJ0aWVzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGlzIG92ZXJ3cml0dGVuIHNpbmNlIHRoZSBub2RlIHR5cGUgaXMgaW5mZXJyZWQgYmFzZWQgb24gdGhlIGxvb3AgY29uZmlndXJhdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgbm9kZSB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldE5vZGVUeXBlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IHsgcmV0dXJuc05vZGUgfSA9IHRoaXMuZ2V0UHJvcGVydGllcyggYnVpbGRlciApO1xyXG5cclxuXHRcdHJldHVybiByZXR1cm5zTm9kZSA/IHJldHVybnNOb2RlLmdldE5vZGVUeXBlKCBidWlsZGVyICkgOiAndm9pZCc7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXAoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Ly8gc2V0dXAgcHJvcGVydGllc1xyXG5cclxuXHRcdHRoaXMuZ2V0UHJvcGVydGllcyggYnVpbGRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdGdlbmVyYXRlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IHByb3BlcnRpZXMgPSB0aGlzLmdldFByb3BlcnRpZXMoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRjb25zdCBwYXJhbXMgPSB0aGlzLnBhcmFtcztcclxuXHRcdGNvbnN0IHN0YWNrTm9kZSA9IHByb3BlcnRpZXMuc3RhY2tOb2RlO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHBhcmFtcy5sZW5ndGggLSAxOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHBhcmFtID0gcGFyYW1zWyBpIF07XHJcblxyXG5cdFx0XHRsZXQgaXNXaGlsZSA9IGZhbHNlLCBzdGFydCA9IG51bGwsIGVuZCA9IG51bGwsIG5hbWUgPSBudWxsLCB0eXBlID0gbnVsbCwgY29uZGl0aW9uID0gbnVsbCwgdXBkYXRlID0gbnVsbDtcclxuXHJcblx0XHRcdGlmICggcGFyYW0uaXNOb2RlICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIHBhcmFtLmdldE5vZGVUeXBlKCBidWlsZGVyICkgPT09ICdib29sJyApIHtcclxuXHJcblx0XHRcdFx0XHRpc1doaWxlID0gdHJ1ZTtcclxuXHRcdFx0XHRcdHR5cGUgPSAnYm9vbCc7XHJcblx0XHRcdFx0XHRlbmQgPSBwYXJhbS5idWlsZCggYnVpbGRlciwgdHlwZSApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdHR5cGUgPSAnaW50JztcclxuXHRcdFx0XHRcdG5hbWUgPSB0aGlzLmdldFZhck5hbWUoIGkgKTtcclxuXHRcdFx0XHRcdHN0YXJ0ID0gJzAnO1xyXG5cdFx0XHRcdFx0ZW5kID0gcGFyYW0uYnVpbGQoIGJ1aWxkZXIsIHR5cGUgKTtcclxuXHRcdFx0XHRcdGNvbmRpdGlvbiA9ICc8JztcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0dHlwZSA9IHBhcmFtLnR5cGUgfHwgJ2ludCc7XHJcblx0XHRcdFx0bmFtZSA9IHBhcmFtLm5hbWUgfHwgdGhpcy5nZXRWYXJOYW1lKCBpICk7XHJcblx0XHRcdFx0c3RhcnQgPSBwYXJhbS5zdGFydDtcclxuXHRcdFx0XHRlbmQgPSBwYXJhbS5lbmQ7XHJcblx0XHRcdFx0Y29uZGl0aW9uID0gcGFyYW0uY29uZGl0aW9uO1xyXG5cdFx0XHRcdHVwZGF0ZSA9IHBhcmFtLnVwZGF0ZTtcclxuXHJcblx0XHRcdFx0aWYgKCB0eXBlb2Ygc3RhcnQgPT09ICdudW1iZXInICkgc3RhcnQgPSBidWlsZGVyLmdlbmVyYXRlQ29uc3QoIHR5cGUsIHN0YXJ0ICk7XHJcblx0XHRcdFx0ZWxzZSBpZiAoIHN0YXJ0ICYmIHN0YXJ0LmlzTm9kZSApIHN0YXJ0ID0gc3RhcnQuYnVpbGQoIGJ1aWxkZXIsIHR5cGUgKTtcclxuXHJcblx0XHRcdFx0aWYgKCB0eXBlb2YgZW5kID09PSAnbnVtYmVyJyApIGVuZCA9IGJ1aWxkZXIuZ2VuZXJhdGVDb25zdCggdHlwZSwgZW5kICk7XHJcblx0XHRcdFx0ZWxzZSBpZiAoIGVuZCAmJiBlbmQuaXNOb2RlICkgZW5kID0gZW5kLmJ1aWxkKCBidWlsZGVyLCB0eXBlICk7XHJcblxyXG5cdFx0XHRcdGlmICggc3RhcnQgIT09IHVuZGVmaW5lZCAmJiBlbmQgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRzdGFydCA9IHN0YXJ0ICsgJyAtIDEnO1xyXG5cdFx0XHRcdFx0ZW5kID0gJzAnO1xyXG5cdFx0XHRcdFx0Y29uZGl0aW9uID0gJz49JztcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggZW5kICE9PSB1bmRlZmluZWQgJiYgc3RhcnQgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRzdGFydCA9ICcwJztcclxuXHRcdFx0XHRcdGNvbmRpdGlvbiA9ICc8JztcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoIGNvbmRpdGlvbiA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdGlmICggTnVtYmVyKCBzdGFydCApID4gTnVtYmVyKCBlbmQgKSApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbiA9ICc+PSc7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbiA9ICc8JztcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGxldCBsb29wU25pcHBldDtcclxuXHJcblx0XHRcdGlmICggaXNXaGlsZSApIHtcclxuXHJcblx0XHRcdFx0bG9vcFNuaXBwZXQgPSBgd2hpbGUgKCAkeyBlbmQgfSApYDtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGludGVybmFsUGFyYW0gPSB7IHN0YXJ0LCBlbmQsIGNvbmRpdGlvbiB9O1xyXG5cclxuXHRcdFx0XHQvL1xyXG5cclxuXHRcdFx0XHRjb25zdCBzdGFydFNuaXBwZXQgPSBpbnRlcm5hbFBhcmFtLnN0YXJ0O1xyXG5cdFx0XHRcdGNvbnN0IGVuZFNuaXBwZXQgPSBpbnRlcm5hbFBhcmFtLmVuZDtcclxuXHJcblx0XHRcdFx0bGV0IGRlY2xhcmF0aW9uU25pcHBldCA9ICcnO1xyXG5cdFx0XHRcdGxldCBjb25kaXRpb25hbFNuaXBwZXQgPSAnJztcclxuXHRcdFx0XHRsZXQgdXBkYXRlU25pcHBldCA9ICcnO1xyXG5cclxuXHRcdFx0XHRpZiAoICEgdXBkYXRlICkge1xyXG5cclxuXHRcdFx0XHRcdGlmICggdHlwZSA9PT0gJ2ludCcgfHwgdHlwZSA9PT0gJ3VpbnQnICkge1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCBjb25kaXRpb24uaW5jbHVkZXMoICc8JyApICkgdXBkYXRlID0gJysrJztcclxuXHRcdFx0XHRcdFx0ZWxzZSB1cGRhdGUgPSAnLS0nO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIGNvbmRpdGlvbi5pbmNsdWRlcyggJzwnICkgKSB1cGRhdGUgPSAnKz0gMS4nO1xyXG5cdFx0XHRcdFx0XHRlbHNlIHVwZGF0ZSA9ICctPSAxLic7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGRlY2xhcmF0aW9uU25pcHBldCArPSBidWlsZGVyLmdldFZhciggdHlwZSwgbmFtZSApICsgJyA9ICcgKyBzdGFydFNuaXBwZXQ7XHJcblxyXG5cdFx0XHRcdGNvbmRpdGlvbmFsU25pcHBldCArPSBuYW1lICsgJyAnICsgY29uZGl0aW9uICsgJyAnICsgZW5kU25pcHBldDtcclxuXHRcdFx0XHR1cGRhdGVTbmlwcGV0ICs9IG5hbWUgKyAnICcgKyB1cGRhdGU7XHJcblxyXG5cdFx0XHRcdGxvb3BTbmlwcGV0ID0gYGZvciAoICR7IGRlY2xhcmF0aW9uU25pcHBldCB9OyAkeyBjb25kaXRpb25hbFNuaXBwZXQgfTsgJHsgdXBkYXRlU25pcHBldCB9IClgO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0YnVpbGRlci5hZGRGbG93Q29kZSggKCBpID09PSAwID8gJ1xcbicgOiAnJyApICsgYnVpbGRlci50YWIgKyBsb29wU25pcHBldCArICcge1xcblxcbicgKS5hZGRGbG93VGFiKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHN0YWNrU25pcHBldCA9IHN0YWNrTm9kZS5idWlsZCggYnVpbGRlciwgJ3ZvaWQnICk7XHJcblxyXG5cdFx0Y29uc3QgcmV0dXJuc1NuaXBwZXQgPSBwcm9wZXJ0aWVzLnJldHVybnNOb2RlID8gcHJvcGVydGllcy5yZXR1cm5zTm9kZS5idWlsZCggYnVpbGRlciApIDogJyc7XHJcblxyXG5cdFx0YnVpbGRlci5yZW1vdmVGbG93VGFiKCkuYWRkRmxvd0NvZGUoICdcXG4nICsgYnVpbGRlci50YWIgKyBzdGFja1NuaXBwZXQgKTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSB0aGlzLnBhcmFtcy5sZW5ndGggLSAxOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGJ1aWxkZXIuYWRkRmxvd0NvZGUoICggaSA9PT0gMCA/ICcnIDogYnVpbGRlci50YWIgKSArICd9XFxuXFxuJyApLnJlbW92ZUZsb3dUYWIoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0YnVpbGRlci5hZGRGbG93VGFiKCk7XHJcblxyXG5cdFx0cmV0dXJuIHJldHVybnNTbmlwcGV0O1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBMb29wTm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgbG9vcCBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0gey4uLmFueX0gcGFyYW1zIC0gQSBsaXN0IG9mIHBhcmFtZXRlcnMuXHJcbiAqIEByZXR1cm5zIHtMb29wTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBMb29wID0gKCAuLi5wYXJhbXMgKSA9PiBub2RlT2JqZWN0KCBuZXcgTG9vcE5vZGUoIG5vZGVBcnJheSggcGFyYW1zLCAnaW50JyApICkgKS5hcHBlbmQoKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgYENvbnRpbnVlKClgIGV4cHJlc3Npb24uXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBDb250aW51ZSA9ICgpID0+IGV4cHJlc3Npb24oICdjb250aW51ZScgKS5hcHBlbmQoKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgYEJyZWFrKClgIGV4cHJlc3Npb24uXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBCcmVhayA9ICgpID0+IGV4cHJlc3Npb24oICdicmVhaycgKS5hcHBlbmQoKTtcclxuXHJcbi8vIERlcHJlY2F0ZWRcclxuXHJcbi8qKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAZGVwcmVjYXRlZCBzaW5jZSByMTY4LiBVc2Uge0BsaW5rIExvb3B9IGluc3RlYWQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7Li4uYW55fSBwYXJhbXNcclxuICogQHJldHVybnMge0xvb3BOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGxvb3AgPSAoIC4uLnBhcmFtcyApID0+IHsgLy8gQGRlcHJlY2F0ZWQsIHIxNjhcclxuXHJcblx0Y29uc29sZS53YXJuKCAnVEhSRUUuVFNMOiBsb29wKCkgaGFzIGJlZW4gcmVuYW1lZCB0byBMb29wKCkuJyApO1xyXG5cdHJldHVybiBMb29wKCAuLi5wYXJhbXMgKTtcclxuXHJcbn07XHJcbiIsImltcG9ydCBOb2RlIGZyb20gJy4uL2NvcmUvTm9kZS5qcyc7XHJcbmltcG9ydCB7IE5vZGVVcGRhdGVUeXBlIH0gZnJvbSAnLi4vY29yZS9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBmbG9hdCwgbm9kZVByb3h5LCBGbiwgaXZlYzIsIGludCwgSWYgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcbmltcG9ydCB7IHVuaWZvcm0gfSBmcm9tICcuLi9jb3JlL1VuaWZvcm1Ob2RlLmpzJztcclxuaW1wb3J0IHsgcmVmZXJlbmNlIH0gZnJvbSAnLi9SZWZlcmVuY2VOb2RlLmpzJztcclxuaW1wb3J0IHsgcG9zaXRpb25Mb2NhbCB9IGZyb20gJy4vUG9zaXRpb24uanMnO1xyXG5pbXBvcnQgeyBub3JtYWxMb2NhbCB9IGZyb20gJy4vTm9ybWFsLmpzJztcclxuaW1wb3J0IHsgdGV4dHVyZUxvYWQgfSBmcm9tICcuL1RleHR1cmVOb2RlLmpzJztcclxuaW1wb3J0IHsgaW5zdGFuY2VJbmRleCwgdmVydGV4SW5kZXggfSBmcm9tICcuLi9jb3JlL0luZGV4Tm9kZS5qcyc7XHJcbmltcG9ydCB7IExvb3AgfSBmcm9tICcuLi91dGlscy9Mb29wTm9kZS5qcyc7XHJcblxyXG5pbXBvcnQgeyBEYXRhQXJyYXlUZXh0dXJlIH0gZnJvbSAnLi4vLi4vdGV4dHVyZXMvRGF0YUFycmF5VGV4dHVyZS5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjIuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3I0IH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3I0LmpzJztcclxuaW1wb3J0IHsgRmxvYXRUeXBlIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzLmpzJztcclxuXHJcbmNvbnN0IF9tb3JwaFRleHR1cmVzID0gLypAX19QVVJFX18qLyBuZXcgV2Vha01hcCgpO1xyXG5jb25zdCBfbW9ycGhWZWM0ID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yNCgpO1xyXG5cclxuY29uc3QgZ2V0TW9ycGggPSAvKkBfX1BVUkVfXyovIEZuKCAoIHsgYnVmZmVyTWFwLCBpbmZsdWVuY2UsIHN0cmlkZSwgd2lkdGgsIGRlcHRoLCBvZmZzZXQgfSApID0+IHtcclxuXHJcblx0Y29uc3QgdGV4ZWxJbmRleCA9IGludCggdmVydGV4SW5kZXggKS5tdWwoIHN0cmlkZSApLmFkZCggb2Zmc2V0ICk7XHJcblxyXG5cdGNvbnN0IHkgPSB0ZXhlbEluZGV4LmRpdiggd2lkdGggKTtcclxuXHRjb25zdCB4ID0gdGV4ZWxJbmRleC5zdWIoIHkubXVsKCB3aWR0aCApICk7XHJcblxyXG5cdGNvbnN0IGJ1ZmZlckF0dHJpYiA9IHRleHR1cmVMb2FkKCBidWZmZXJNYXAsIGl2ZWMyKCB4LCB5ICkgKS5kZXB0aCggZGVwdGggKS54eXo7XHJcblxyXG5cdHJldHVybiBidWZmZXJBdHRyaWIubXVsKCBpbmZsdWVuY2UgKTtcclxuXHJcbn0gKTtcclxuXHJcbmZ1bmN0aW9uIGdldEVudHJ5KCBnZW9tZXRyeSApIHtcclxuXHJcblx0Y29uc3QgaGFzTW9ycGhQb3NpdGlvbiA9IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbiAhPT0gdW5kZWZpbmVkO1xyXG5cdGNvbnN0IGhhc01vcnBoTm9ybWFscyA9IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5ub3JtYWwgIT09IHVuZGVmaW5lZDtcclxuXHRjb25zdCBoYXNNb3JwaENvbG9ycyA9IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5jb2xvciAhPT0gdW5kZWZpbmVkO1xyXG5cclxuXHQvLyBpbnN0ZWFkIG9mIHVzaW5nIGF0dHJpYnV0ZXMsIHRoZSBXZWJHTCAyIGNvZGUgcGF0aCBlbmNvZGVzIG1vcnBoIHRhcmdldHNcclxuXHQvLyBpbnRvIGFuIGFycmF5IG9mIGRhdGEgdGV4dHVyZXMuIEVhY2ggbGF5ZXIgcmVwcmVzZW50cyBhIHNpbmdsZSBtb3JwaCB0YXJnZXQuXHJcblxyXG5cdGNvbnN0IG1vcnBoQXR0cmlidXRlID0gZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uIHx8IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5ub3JtYWwgfHwgZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLmNvbG9yO1xyXG5cdGNvbnN0IG1vcnBoVGFyZ2V0c0NvdW50ID0gKCBtb3JwaEF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkgPyBtb3JwaEF0dHJpYnV0ZS5sZW5ndGggOiAwO1xyXG5cclxuXHRsZXQgZW50cnkgPSBfbW9ycGhUZXh0dXJlcy5nZXQoIGdlb21ldHJ5ICk7XHJcblxyXG5cdGlmICggZW50cnkgPT09IHVuZGVmaW5lZCB8fCBlbnRyeS5jb3VudCAhPT0gbW9ycGhUYXJnZXRzQ291bnQgKSB7XHJcblxyXG5cdFx0aWYgKCBlbnRyeSAhPT0gdW5kZWZpbmVkICkgZW50cnkudGV4dHVyZS5kaXNwb3NlKCk7XHJcblxyXG5cdFx0Y29uc3QgbW9ycGhUYXJnZXRzID0gZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uIHx8IFtdO1xyXG5cdFx0Y29uc3QgbW9ycGhOb3JtYWxzID0gZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbCB8fCBbXTtcclxuXHRcdGNvbnN0IG1vcnBoQ29sb3JzID0gZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLmNvbG9yIHx8IFtdO1xyXG5cclxuXHRcdGxldCB2ZXJ0ZXhEYXRhQ291bnQgPSAwO1xyXG5cclxuXHRcdGlmICggaGFzTW9ycGhQb3NpdGlvbiA9PT0gdHJ1ZSApIHZlcnRleERhdGFDb3VudCA9IDE7XHJcblx0XHRpZiAoIGhhc01vcnBoTm9ybWFscyA9PT0gdHJ1ZSApIHZlcnRleERhdGFDb3VudCA9IDI7XHJcblx0XHRpZiAoIGhhc01vcnBoQ29sb3JzID09PSB0cnVlICkgdmVydGV4RGF0YUNvdW50ID0gMztcclxuXHJcblx0XHRsZXQgd2lkdGggPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50ICogdmVydGV4RGF0YUNvdW50O1xyXG5cdFx0bGV0IGhlaWdodCA9IDE7XHJcblxyXG5cdFx0Y29uc3QgbWF4VGV4dHVyZVNpemUgPSA0MDk2OyAvLyBAVE9ETzogVXNlICdjYXBhYmlsaXRpZXMubWF4VGV4dHVyZVNpemUnXHJcblxyXG5cdFx0aWYgKCB3aWR0aCA+IG1heFRleHR1cmVTaXplICkge1xyXG5cclxuXHRcdFx0aGVpZ2h0ID0gTWF0aC5jZWlsKCB3aWR0aCAvIG1heFRleHR1cmVTaXplICk7XHJcblx0XHRcdHdpZHRoID0gbWF4VGV4dHVyZVNpemU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGJ1ZmZlciA9IG5ldyBGbG9hdDMyQXJyYXkoIHdpZHRoICogaGVpZ2h0ICogNCAqIG1vcnBoVGFyZ2V0c0NvdW50ICk7XHJcblxyXG5cdFx0Y29uc3QgYnVmZmVyVGV4dHVyZSA9IG5ldyBEYXRhQXJyYXlUZXh0dXJlKCBidWZmZXIsIHdpZHRoLCBoZWlnaHQsIG1vcnBoVGFyZ2V0c0NvdW50ICk7XHJcblx0XHRidWZmZXJUZXh0dXJlLnR5cGUgPSBGbG9hdFR5cGU7XHJcblx0XHRidWZmZXJUZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHQvLyBmaWxsIGJ1ZmZlclxyXG5cclxuXHRcdGNvbnN0IHZlcnRleERhdGFTdHJpZGUgPSB2ZXJ0ZXhEYXRhQ291bnQgKiA0O1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IG1vcnBoVGFyZ2V0c0NvdW50OyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgbW9ycGhUYXJnZXQgPSBtb3JwaFRhcmdldHNbIGkgXTtcclxuXHRcdFx0Y29uc3QgbW9ycGhOb3JtYWwgPSBtb3JwaE5vcm1hbHNbIGkgXTtcclxuXHRcdFx0Y29uc3QgbW9ycGhDb2xvciA9IG1vcnBoQ29sb3JzWyBpIF07XHJcblxyXG5cdFx0XHRjb25zdCBvZmZzZXQgPSB3aWR0aCAqIGhlaWdodCAqIDQgKiBpO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGogPSAwOyBqIDwgbW9ycGhUYXJnZXQuY291bnQ7IGogKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHN0cmlkZSA9IGogKiB2ZXJ0ZXhEYXRhU3RyaWRlO1xyXG5cclxuXHRcdFx0XHRpZiAoIGhhc01vcnBoUG9zaXRpb24gPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0X21vcnBoVmVjNC5mcm9tQnVmZmVyQXR0cmlidXRlKCBtb3JwaFRhcmdldCwgaiApO1xyXG5cclxuXHRcdFx0XHRcdGJ1ZmZlclsgb2Zmc2V0ICsgc3RyaWRlICsgMCBdID0gX21vcnBoVmVjNC54O1xyXG5cdFx0XHRcdFx0YnVmZmVyWyBvZmZzZXQgKyBzdHJpZGUgKyAxIF0gPSBfbW9ycGhWZWM0Lnk7XHJcblx0XHRcdFx0XHRidWZmZXJbIG9mZnNldCArIHN0cmlkZSArIDIgXSA9IF9tb3JwaFZlYzQuejtcclxuXHRcdFx0XHRcdGJ1ZmZlclsgb2Zmc2V0ICsgc3RyaWRlICsgMyBdID0gMDtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoIGhhc01vcnBoTm9ybWFscyA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0XHRfbW9ycGhWZWM0LmZyb21CdWZmZXJBdHRyaWJ1dGUoIG1vcnBoTm9ybWFsLCBqICk7XHJcblxyXG5cdFx0XHRcdFx0YnVmZmVyWyBvZmZzZXQgKyBzdHJpZGUgKyA0IF0gPSBfbW9ycGhWZWM0Lng7XHJcblx0XHRcdFx0XHRidWZmZXJbIG9mZnNldCArIHN0cmlkZSArIDUgXSA9IF9tb3JwaFZlYzQueTtcclxuXHRcdFx0XHRcdGJ1ZmZlclsgb2Zmc2V0ICsgc3RyaWRlICsgNiBdID0gX21vcnBoVmVjNC56O1xyXG5cdFx0XHRcdFx0YnVmZmVyWyBvZmZzZXQgKyBzdHJpZGUgKyA3IF0gPSAwO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICggaGFzTW9ycGhDb2xvcnMgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0X21vcnBoVmVjNC5mcm9tQnVmZmVyQXR0cmlidXRlKCBtb3JwaENvbG9yLCBqICk7XHJcblxyXG5cdFx0XHRcdFx0YnVmZmVyWyBvZmZzZXQgKyBzdHJpZGUgKyA4IF0gPSBfbW9ycGhWZWM0Lng7XHJcblx0XHRcdFx0XHRidWZmZXJbIG9mZnNldCArIHN0cmlkZSArIDkgXSA9IF9tb3JwaFZlYzQueTtcclxuXHRcdFx0XHRcdGJ1ZmZlclsgb2Zmc2V0ICsgc3RyaWRlICsgMTAgXSA9IF9tb3JwaFZlYzQuejtcclxuXHRcdFx0XHRcdGJ1ZmZlclsgb2Zmc2V0ICsgc3RyaWRlICsgMTEgXSA9ICggbW9ycGhDb2xvci5pdGVtU2l6ZSA9PT0gNCApID8gX21vcnBoVmVjNC53IDogMTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRlbnRyeSA9IHtcclxuXHRcdFx0Y291bnQ6IG1vcnBoVGFyZ2V0c0NvdW50LFxyXG5cdFx0XHR0ZXh0dXJlOiBidWZmZXJUZXh0dXJlLFxyXG5cdFx0XHRzdHJpZGU6IHZlcnRleERhdGFDb3VudCxcclxuXHRcdFx0c2l6ZTogbmV3IFZlY3RvcjIoIHdpZHRoLCBoZWlnaHQgKVxyXG5cdFx0fTtcclxuXHJcblx0XHRfbW9ycGhUZXh0dXJlcy5zZXQoIGdlb21ldHJ5LCBlbnRyeSApO1xyXG5cclxuXHRcdGZ1bmN0aW9uIGRpc3Bvc2VUZXh0dXJlKCkge1xyXG5cclxuXHRcdFx0YnVmZmVyVGV4dHVyZS5kaXNwb3NlKCk7XHJcblxyXG5cdFx0XHRfbW9ycGhUZXh0dXJlcy5kZWxldGUoIGdlb21ldHJ5ICk7XHJcblxyXG5cdFx0XHRnZW9tZXRyeS5yZW1vdmVFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIGRpc3Bvc2VUZXh0dXJlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGdlb21ldHJ5LmFkZEV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgZGlzcG9zZVRleHR1cmUgKTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gZW50cnk7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogVGhpcyBub2RlIGltcGxlbWVudHMgdGhlIHZlcnRleCB0cmFuc2Zvcm1hdGlvbiBzaGFkZXIgbG9naWMgd2hpY2ggaXMgcmVxdWlyZWRcclxuICogZm9yIG1vcnBoIHRhcmdldCBhbmltYXRpb24uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBOb2RlXHJcbiAqL1xyXG5jbGFzcyBNb3JwaE5vZGUgZXh0ZW5kcyBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnTW9ycGhOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG1vcnBoIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01lc2h9IG1lc2ggLSBUaGUgbWVzaCBob2xkaW5nIHRoZSBtb3JwaCB0YXJnZXRzLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBtZXNoICkge1xyXG5cclxuXHRcdHN1cGVyKCAndm9pZCcgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBtZXNoIGhvbGRpbmcgdGhlIG1vcnBoIHRhcmdldHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge01lc2h9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWVzaCA9IG1lc2g7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHVuaWZvcm0gbm9kZSB3aGljaCByZXByZXNlbnRzIHRoZSBtb3JwaCBiYXNlIGluZmx1ZW5jZSB2YWx1ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VW5pZm9ybU5vZGU8ZmxvYXQ+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1vcnBoQmFzZUluZmx1ZW5jZSA9IHVuaWZvcm0oIDEgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB1cGRhdGUgdHlwZSBvdmVyd3JpdHRlbiBzaW5jZSBtb3JwaCBub2RlcyBhcmUgdXBkYXRlZCBwZXIgb2JqZWN0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXBkYXRlVHlwZSA9IE5vZGVVcGRhdGVUeXBlLk9CSkVDVDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXR1cHMgdGhlIG1vcnBoIG5vZGUgYnkgYXNzaWduaW5nIHRoZSB0cmFuc2Zvcm1lZCB2ZXJ0ZXggZGF0YSB0byBwcmVkZWZpbmVkIG5vZGUgdmFyaWFibGVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKi9cclxuXHRzZXR1cCggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCB7IGdlb21ldHJ5IH0gPSBidWlsZGVyO1xyXG5cclxuXHRcdGNvbnN0IGhhc01vcnBoUG9zaXRpb24gPSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24gIT09IHVuZGVmaW5lZDtcclxuXHRcdGNvbnN0IGhhc01vcnBoTm9ybWFscyA9IGdlb21ldHJ5Lmhhc0F0dHJpYnV0ZSggJ25vcm1hbCcgKSAmJiBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMubm9ybWFsICE9PSB1bmRlZmluZWQ7XHJcblxyXG5cdFx0Y29uc3QgbW9ycGhBdHRyaWJ1dGUgPSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24gfHwgZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbCB8fCBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMuY29sb3I7XHJcblx0XHRjb25zdCBtb3JwaFRhcmdldHNDb3VudCA9ICggbW9ycGhBdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApID8gbW9ycGhBdHRyaWJ1dGUubGVuZ3RoIDogMDtcclxuXHJcblx0XHQvLyBub2Rlc1xyXG5cclxuXHRcdGNvbnN0IHsgdGV4dHVyZTogYnVmZmVyTWFwLCBzdHJpZGUsIHNpemUgfSA9IGdldEVudHJ5KCBnZW9tZXRyeSApO1xyXG5cclxuXHRcdGlmICggaGFzTW9ycGhQb3NpdGlvbiA9PT0gdHJ1ZSApIHBvc2l0aW9uTG9jYWwubXVsQXNzaWduKCB0aGlzLm1vcnBoQmFzZUluZmx1ZW5jZSApO1xyXG5cdFx0aWYgKCBoYXNNb3JwaE5vcm1hbHMgPT09IHRydWUgKSBub3JtYWxMb2NhbC5tdWxBc3NpZ24oIHRoaXMubW9ycGhCYXNlSW5mbHVlbmNlICk7XHJcblxyXG5cdFx0Y29uc3Qgd2lkdGggPSBpbnQoIHNpemUud2lkdGggKTtcclxuXHJcblx0XHRMb29wKCBtb3JwaFRhcmdldHNDb3VudCwgKCB7IGkgfSApID0+IHtcclxuXHJcblx0XHRcdGNvbnN0IGluZmx1ZW5jZSA9IGZsb2F0KCAwICkudG9WYXIoKTtcclxuXHJcblx0XHRcdGlmICggdGhpcy5tZXNoLmNvdW50ID4gMSAmJiAoIHRoaXMubWVzaC5tb3JwaFRleHR1cmUgIT09IG51bGwgJiYgdGhpcy5tZXNoLm1vcnBoVGV4dHVyZSAhPT0gdW5kZWZpbmVkICkgKSB7XHJcblxyXG5cdFx0XHRcdGluZmx1ZW5jZS5hc3NpZ24oIHRleHR1cmVMb2FkKCB0aGlzLm1lc2gubW9ycGhUZXh0dXJlLCBpdmVjMiggaW50KCBpICkuYWRkKCAxICksIGludCggaW5zdGFuY2VJbmRleCApICkgKS5yICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRpbmZsdWVuY2UuYXNzaWduKCByZWZlcmVuY2UoICdtb3JwaFRhcmdldEluZmx1ZW5jZXMnLCAnZmxvYXQnICkuZWxlbWVudCggaSApLnRvVmFyKCkgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdElmKCBpbmZsdWVuY2Uubm90RXF1YWwoIDAgKSwgKCkgPT4ge1xyXG5cclxuXHRcdFx0XHRpZiAoIGhhc01vcnBoUG9zaXRpb24gPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0cG9zaXRpb25Mb2NhbC5hZGRBc3NpZ24oIGdldE1vcnBoKCB7XHJcblx0XHRcdFx0XHRcdGJ1ZmZlck1hcCxcclxuXHRcdFx0XHRcdFx0aW5mbHVlbmNlLFxyXG5cdFx0XHRcdFx0XHRzdHJpZGUsXHJcblx0XHRcdFx0XHRcdHdpZHRoLFxyXG5cdFx0XHRcdFx0XHRkZXB0aDogaSxcclxuXHRcdFx0XHRcdFx0b2Zmc2V0OiBpbnQoIDAgKVxyXG5cdFx0XHRcdFx0fSApICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKCBoYXNNb3JwaE5vcm1hbHMgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0bm9ybWFsTG9jYWwuYWRkQXNzaWduKCBnZXRNb3JwaCgge1xyXG5cdFx0XHRcdFx0XHRidWZmZXJNYXAsXHJcblx0XHRcdFx0XHRcdGluZmx1ZW5jZSxcclxuXHRcdFx0XHRcdFx0c3RyaWRlLFxyXG5cdFx0XHRcdFx0XHR3aWR0aCxcclxuXHRcdFx0XHRcdFx0ZGVwdGg6IGksXHJcblx0XHRcdFx0XHRcdG9mZnNldDogaW50KCAxIClcclxuXHRcdFx0XHRcdH0gKSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0fSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIHN0YXRlIG9mIHRoZSBtb3JwaGVkIG1lc2ggYnkgdXBkYXRpbmcgdGhlIGJhc2UgaW5mbHVlbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlRnJhbWV9IGZyYW1lIC0gVGhlIGN1cnJlbnQgbm9kZSBmcmFtZS5cclxuXHQgKi9cclxuXHR1cGRhdGUoIC8qZnJhbWUqLyApIHtcclxuXHJcblx0XHRjb25zdCBtb3JwaEJhc2VJbmZsdWVuY2UgPSB0aGlzLm1vcnBoQmFzZUluZmx1ZW5jZTtcclxuXHJcblx0XHRpZiAoIHRoaXMubWVzaC5nZW9tZXRyeS5tb3JwaFRhcmdldHNSZWxhdGl2ZSApIHtcclxuXHJcblx0XHRcdG1vcnBoQmFzZUluZmx1ZW5jZS52YWx1ZSA9IDE7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdG1vcnBoQmFzZUluZmx1ZW5jZS52YWx1ZSA9IDEgLSB0aGlzLm1lc2gubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnJlZHVjZSggKCBhLCBiICkgPT4gYSArIGIsIDAgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IE1vcnBoTm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgbW9ycGggbm9kZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtNZXNofSBtZXNoIC0gVGhlIG1lc2ggaG9sZGluZyB0aGUgbW9ycGggdGFyZ2V0cy5cclxuICogQHJldHVybnMge01vcnBoTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBtb3JwaFJlZmVyZW5jZSA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBNb3JwaE5vZGUgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDEgKTtcclxuIiwiaW1wb3J0IE5vZGUgZnJvbSAnLi4vY29yZS9Ob2RlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBCYXNlIGNsYXNzIGZvciBsaWdodGluZyBub2Rlcy5cclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVcclxuICovXHJcbmNsYXNzIExpZ2h0aW5nTm9kZSBleHRlbmRzIE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdMaWdodGluZ05vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbGlnaHRpbmcgbm9kZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHJcblx0XHRzdXBlciggJ3ZlYzMnICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzTGlnaHRpbmdOb2RlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTGlnaHRpbmdOb2RlO1xyXG4iLCJpbXBvcnQgTGlnaHRpbmdOb2RlIGZyb20gJy4vTGlnaHRpbmdOb2RlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIGdlbmVyaWMgY2xhc3MgdGhhdCBjYW4gYmUgdXNlZCBieSBub2RlcyB3aGljaCBjb250cmlidXRlXHJcbiAqIGFtYmllbnQgb2NjbHVzaW9uIHRvIHRoZSBzY2VuZS4gRS5nLiBhbiBhbWJpZW50IG9jY2x1c2lvbiBtYXBcclxuICogbm9kZSBjYW4gYmUgdXNlZCBhcyBpbnB1dCBmb3IgdGhpcyBtb2R1bGUuIFVzZWQgaW4ge0BsaW5rIE5vZGVNYXRlcmlhbH0uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBMaWdodGluZ05vZGVcclxuICovXHJcbmNsYXNzIEFPTm9kZSBleHRlbmRzIExpZ2h0aW5nTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ0FPTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBBTyBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHs/Tm9kZTxmbG9hdD59IFthb05vZGU9bnVsbF0gLSBUaGUgYW1iaWVudCBvY2NsdXNpb24gbm9kZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggYW9Ob2RlID0gbnVsbCApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGFtYmllbnQgb2NjbHVzaW9uIG5vZGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPGZsb2F0Pn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hb05vZGUgPSBhb05vZGU7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXAoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0YnVpbGRlci5jb250ZXh0LmFtYmllbnRPY2NsdXNpb24ubXVsQXNzaWduKCB0aGlzLmFvTm9kZSApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBBT05vZGU7XHJcbiIsImltcG9ydCBDb250ZXh0Tm9kZSBmcm9tICcuLi9jb3JlL0NvbnRleHROb2RlLmpzJztcclxuaW1wb3J0IHsgbm9kZVByb3h5LCBmbG9hdCwgdmVjMyB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBgTGlnaHRpbmdDb250ZXh0Tm9kZWAgcmVwcmVzZW50cyBhbiBleHRlbnNpb24gb2YgdGhlIHtAbGluayBDb250ZXh0Tm9kZX0gbW9kdWxlXHJcbiAqIGJ5IGFkZGluZyBsaWdodGluZyBzcGVjaWZpYyBjb250ZXh0IGRhdGEuIEl0IHJlcHJlc2VudHMgdGhlIHJ1bnRpbWUgY29udGV4dCBvZlxyXG4gKiB7QGxpbmsgTGlnaHRzTm9kZX0uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBDb250ZXh0Tm9kZVxyXG4gKi9cclxuY2xhc3MgTGlnaHRpbmdDb250ZXh0Tm9kZSBleHRlbmRzIENvbnRleHROb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnTGlnaHRpbmdDb250ZXh0Tm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBsaWdodGluZyBjb250ZXh0IG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0xpZ2h0c05vZGV9IGxpZ2h0c05vZGUgLSBUaGUgbGlnaHRzIG5vZGUuXHJcblx0ICogQHBhcmFtIHs/TGlnaHRpbmdNb2RlbH0gW2xpZ2h0aW5nTW9kZWw9bnVsbF0gLSBUaGUgY3VycmVudCBsaWdodGluZyBtb2RlbC5cclxuXHQgKiBAcGFyYW0gez9Ob2RlPHZlYzM+fSBbYmFja2Ryb3BOb2RlPW51bGxdIC0gQSBiYWNrZHJvcCBub2RlLlxyXG5cdCAqIEBwYXJhbSB7P05vZGU8ZmxvYXQ+fSBbYmFja2Ryb3BBbHBoYU5vZGU9bnVsbF0gLSBBIGJhY2tkcm9wIGFscGhhIG5vZGUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGxpZ2h0c05vZGUsIGxpZ2h0aW5nTW9kZWwgPSBudWxsLCBiYWNrZHJvcE5vZGUgPSBudWxsLCBiYWNrZHJvcEFscGhhTm9kZSA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoIGxpZ2h0c05vZGUgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjdXJyZW50IGxpZ2h0aW5nIG1vZGVsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/TGlnaHRpbmdNb2RlbH1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5saWdodGluZ01vZGVsID0gbGlnaHRpbmdNb2RlbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgYmFja2Ryb3Agbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGU8dmVjMz59XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYmFja2Ryb3BOb2RlID0gYmFja2Ryb3BOb2RlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBiYWNrZHJvcCBhbHBoYSBub2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Tm9kZTxmbG9hdD59XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYmFja2Ryb3BBbHBoYU5vZGUgPSBiYWNrZHJvcEFscGhhTm9kZTtcclxuXHJcblx0XHR0aGlzLl92YWx1ZSA9IG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIGxpZ2h0aW5nIGNvbnRleHQgb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7e1xyXG5cdCAqIHJhZGlhbmNlOiBOb2RlPHZlYzM+LFxyXG5cdCAqIGlycmFkaWFuY2U6IE5vZGU8dmVjMz4sXHJcblx0ICogaWJsSXJyYWRpYW5jZTogTm9kZTx2ZWMzPixcclxuXHQgKiBhbWJpZW50T2NjbHVzaW9uOiBOb2RlPGZsb2F0PixcclxuXHQgKiByZWZsZWN0ZWRMaWdodDoge2RpcmVjdERpZmZ1c2U6IE5vZGU8dmVjMz4sIGRpcmVjdFNwZWN1bGFyOiBOb2RlPHZlYzM+LCBpbmRpcmVjdERpZmZ1c2U6IE5vZGU8dmVjMz4sIGluZGlyZWN0U3BlY3VsYXI6IE5vZGU8dmVjMz59LFxyXG5cdCAqIGJhY2tkcm9wOiBOb2RlPHZlYzM+LFxyXG5cdCAqIGJhY2tkcm9wQWxwaGE6IE5vZGU8ZmxvYXQ+XHJcblx0ICogfX0gVGhlIGxpZ2h0aW5nIGNvbnRleHQgb2JqZWN0LlxyXG5cdCAqL1xyXG5cdGdldENvbnRleHQoKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBiYWNrZHJvcE5vZGUsIGJhY2tkcm9wQWxwaGFOb2RlIH0gPSB0aGlzO1xyXG5cclxuXHRcdGNvbnN0IGRpcmVjdERpZmZ1c2UgPSB2ZWMzKCkudG9WYXIoICdkaXJlY3REaWZmdXNlJyApLFxyXG5cdFx0XHRkaXJlY3RTcGVjdWxhciA9IHZlYzMoKS50b1ZhciggJ2RpcmVjdFNwZWN1bGFyJyApLFxyXG5cdFx0XHRpbmRpcmVjdERpZmZ1c2UgPSB2ZWMzKCkudG9WYXIoICdpbmRpcmVjdERpZmZ1c2UnICksXHJcblx0XHRcdGluZGlyZWN0U3BlY3VsYXIgPSB2ZWMzKCkudG9WYXIoICdpbmRpcmVjdFNwZWN1bGFyJyApO1xyXG5cclxuXHRcdGNvbnN0IHJlZmxlY3RlZExpZ2h0ID0ge1xyXG5cdFx0XHRkaXJlY3REaWZmdXNlLFxyXG5cdFx0XHRkaXJlY3RTcGVjdWxhcixcclxuXHRcdFx0aW5kaXJlY3REaWZmdXNlLFxyXG5cdFx0XHRpbmRpcmVjdFNwZWN1bGFyXHJcblx0XHR9O1xyXG5cclxuXHRcdGNvbnN0IGNvbnRleHQgPSB7XHJcblx0XHRcdHJhZGlhbmNlOiB2ZWMzKCkudG9WYXIoICdyYWRpYW5jZScgKSxcclxuXHRcdFx0aXJyYWRpYW5jZTogdmVjMygpLnRvVmFyKCAnaXJyYWRpYW5jZScgKSxcclxuXHRcdFx0aWJsSXJyYWRpYW5jZTogdmVjMygpLnRvVmFyKCAnaWJsSXJyYWRpYW5jZScgKSxcclxuXHRcdFx0YW1iaWVudE9jY2x1c2lvbjogZmxvYXQoIDEgKS50b1ZhciggJ2FtYmllbnRPY2NsdXNpb24nICksXHJcblx0XHRcdHJlZmxlY3RlZExpZ2h0LFxyXG5cdFx0XHRiYWNrZHJvcDogYmFja2Ryb3BOb2RlLFxyXG5cdFx0XHRiYWNrZHJvcEFscGhhOiBiYWNrZHJvcEFscGhhTm9kZVxyXG5cdFx0fTtcclxuXHJcblx0XHRyZXR1cm4gY29udGV4dDtcclxuXHJcblx0fVxyXG5cclxuXHRzZXR1cCggYnVpbGRlciApIHtcclxuXHJcblx0XHR0aGlzLnZhbHVlID0gdGhpcy5fdmFsdWUgfHwgKCB0aGlzLl92YWx1ZSA9IHRoaXMuZ2V0Q29udGV4dCgpICk7XHJcblx0XHR0aGlzLnZhbHVlLmxpZ2h0aW5nTW9kZWwgPSB0aGlzLmxpZ2h0aW5nTW9kZWwgfHwgYnVpbGRlci5jb250ZXh0LmxpZ2h0aW5nTW9kZWw7XHJcblxyXG5cdFx0cmV0dXJuIHN1cGVyLnNldHVwKCBidWlsZGVyICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IExpZ2h0aW5nQ29udGV4dE5vZGU7XHJcblxyXG5leHBvcnQgY29uc3QgbGlnaHRpbmdDb250ZXh0ID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIExpZ2h0aW5nQ29udGV4dE5vZGUgKTtcclxuIiwiaW1wb3J0IExpZ2h0aW5nTm9kZSBmcm9tICcuL0xpZ2h0aW5nTm9kZS5qcyc7XHJcblxyXG4vKipcclxuICogQSBnZW5lcmljIGNsYXNzIHRoYXQgY2FuIGJlIHVzZWQgYnkgbm9kZXMgd2hpY2ggY29udHJpYnV0ZVxyXG4gKiBpcnJhZGlhbmNlIHRvIHRoZSBzY2VuZS4gRS5nLiBhIGxpZ2h0IG1hcCBub2RlIGNhbiBiZSB1c2VkXHJcbiAqIGFzIGlucHV0IGZvciB0aGlzIG1vZHVsZS4gVXNlZCBpbiB7QGxpbmsgTm9kZU1hdGVyaWFsfS5cclxuICpcclxuICogQGF1Z21lbnRzIExpZ2h0aW5nTm9kZVxyXG4gKi9cclxuY2xhc3MgSXJyYWRpYW5jZU5vZGUgZXh0ZW5kcyBMaWdodGluZ05vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdJcnJhZGlhbmNlTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBpcnJhZGlhbmNlIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGU8dmVjMz59IG5vZGUgLSBBIG5vZGUgY29udHJpYnV0aW5nIGlycmFkaWFuY2UuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5vZGUgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgbm9kZSBjb250cmlidXRpbmcgaXJyYWRpYW5jZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZTx2ZWMzPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub2RlID0gbm9kZTtcclxuXHJcblx0fVxyXG5cclxuXHRzZXR1cCggYnVpbGRlciApIHtcclxuXHJcblx0XHRidWlsZGVyLmNvbnRleHQuaXJyYWRpYW5jZS5hZGRBc3NpZ24oIHRoaXMubm9kZSApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBJcnJhZGlhbmNlTm9kZTtcclxuIiwiaW1wb3J0IE5vZGUgZnJvbSAnLi4vY29yZS9Ob2RlLmpzJztcclxuaW1wb3J0IHsgTm9kZVVwZGF0ZVR5cGUgfSBmcm9tICcuLi9jb3JlL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IHVuaWZvcm0gfSBmcm9tICcuLi9jb3JlL1VuaWZvcm1Ob2RlLmpzJztcclxuaW1wb3J0IHsgRm4sIG5vZGVJbW11dGFibGUsIHZlYzIgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcblxyXG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IyLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yNCB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yNC5qcyc7XHJcblxyXG5sZXQgc2NyZWVuU2l6ZVZlYywgdmlld3BvcnRWZWM7XHJcblxyXG4vKipcclxuICogVGhpcyBub2RlIHByb3ZpZGVzIGEgY29sbGVjdGlvbiBvZiBzY3JlZW4gcmVsYXRlZCBtZXRyaWNzLlxyXG4gKiBEZXBlbmRpbmcgb24ge0BsaW5rIFNjcmVlbk5vZGUjc2NvcGV9LCB0aGUgbm9kZXMgY2FuIHJlcHJlc2VudFxyXG4gKiByZXNvbHV0aW9uIG9yIHZpZXdwb3J0IGRhdGEgYXMgd2VsbCBhcyBmcmFnbWVudCBvciB1diBjb29yZGluYXRlcy5cclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVcclxuICovXHJcbmNsYXNzIFNjcmVlbk5vZGUgZXh0ZW5kcyBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnU2NyZWVuTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBzY3JlZW4gbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7KCdjb29yZGluYXRlJ3wndmlld3BvcnQnfCdzaXplJ3wndXYnKX0gc2NvcGUgLSBUaGUgbm9kZSdzIHNjb3BlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBzY29wZSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG5vZGUgcmVwcmVzZW50cyBkaWZmZXJlbnQgbWV0cmljIGRlcGVuZGluZyBvbiB3aGljaCBzY29wZSBpcyBzZWxlY3RlZC5cclxuXHRcdCAqXHJcblx0XHQgKiAtIGBTY3JlZW5Ob2RlLkNPT1JESU5BVEVgOiBXaW5kb3ctcmVsYXRpdmUgY29vcmRpbmF0ZXMgb2YgdGhlIGN1cnJlbnQgZnJhZ21lbnQgYWNjb3JkaW5nIHRvIFdlYkdQVSBzdGFuZGFyZHMuXHJcblx0XHQgKiAtIGBTY3JlZW5Ob2RlLlZJRVdQT1JUYDogVGhlIGN1cnJlbnQgdmlld3BvcnQgZGVmaW5lZCBhcyBhIGZvdXItZGltZW5zaW9uYWwgdmVjdG9yLlxyXG5cdFx0ICogLSBgU2NyZWVuTm9kZS5TSVpFYDogVGhlIGRpbWVuc2lvbnMgb2YgdGhlIGN1cnJlbnQgYm91bmQgZnJhbWVidWZmZXIuXHJcblx0XHQgKiAtIGBTY3JlZW5Ob2RlLlVWYDogTm9ybWFsaXplZCBjb29yZGluYXRlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KCdjb29yZGluYXRlJ3wndmlld3BvcnQnfCdzaXplJ3wndXYnKX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zY29wZSA9IHNjb3BlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1ZpZXdwb3J0Tm9kZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgaXMgb3ZlcndyaXR0ZW4gc2luY2UgdGhlIG5vZGUgdHlwZSBkZXBlbmRzIG9uIHRoZSBzZWxlY3RlZCBzY29wZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4geygndmVjMid8J3ZlYzQnKX0gVGhlIG5vZGUgdHlwZS5cclxuXHQgKi9cclxuXHRnZXROb2RlVHlwZSgpIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuc2NvcGUgPT09IFNjcmVlbk5vZGUuVklFV1BPUlQgKSByZXR1cm4gJ3ZlYzQnO1xyXG5cdFx0ZWxzZSByZXR1cm4gJ3ZlYzInO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGlzIG92ZXJ3cml0dGVuIHNpbmNlIHRoZSBub2RlJ3MgdXBkYXRlIHR5cGUgZGVwZW5kcyBvbiB0aGUgc2VsZWN0ZWQgc2NvcGUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtOb2RlVXBkYXRlVHlwZX0gVGhlIHVwZGF0ZSB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldFVwZGF0ZVR5cGUoKSB7XHJcblxyXG5cdFx0bGV0IHVwZGF0ZVR5cGUgPSBOb2RlVXBkYXRlVHlwZS5OT05FO1xyXG5cclxuXHRcdGlmICggdGhpcy5zY29wZSA9PT0gU2NyZWVuTm9kZS5TSVpFIHx8IHRoaXMuc2NvcGUgPT09IFNjcmVlbk5vZGUuVklFV1BPUlQgKSB7XHJcblxyXG5cdFx0XHR1cGRhdGVUeXBlID0gTm9kZVVwZGF0ZVR5cGUuUkVOREVSO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnVwZGF0ZVR5cGUgPSB1cGRhdGVUeXBlO1xyXG5cclxuXHRcdHJldHVybiB1cGRhdGVUeXBlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIGBTY3JlZW5Ob2RlYCBpbXBsZW1lbnRzIHtAbGluayBOb2RlI3VwZGF0ZX0gdG8gcmV0cmlldmUgdmlld3BvcnQgYW5kIHNpemUgaW5mb3JtYXRpb25cclxuXHQgKiBmcm9tIHRoZSBjdXJyZW50IHJlbmRlcmVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlRnJhbWV9IGZyYW1lIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgbm9kZSBmcmFtZS5cclxuXHQgKi9cclxuXHR1cGRhdGUoIHsgcmVuZGVyZXIgfSApIHtcclxuXHJcblx0XHRjb25zdCByZW5kZXJUYXJnZXQgPSByZW5kZXJlci5nZXRSZW5kZXJUYXJnZXQoKTtcclxuXHJcblx0XHRpZiAoIHRoaXMuc2NvcGUgPT09IFNjcmVlbk5vZGUuVklFV1BPUlQgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHJlbmRlclRhcmdldCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0dmlld3BvcnRWZWMuY29weSggcmVuZGVyVGFyZ2V0LnZpZXdwb3J0ICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRyZW5kZXJlci5nZXRWaWV3cG9ydCggdmlld3BvcnRWZWMgKTtcclxuXHJcblx0XHRcdFx0dmlld3BvcnRWZWMubXVsdGlwbHlTY2FsYXIoIHJlbmRlcmVyLmdldFBpeGVsUmF0aW8oKSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRpZiAoIHJlbmRlclRhcmdldCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0c2NyZWVuU2l6ZVZlYy53aWR0aCA9IHJlbmRlclRhcmdldC53aWR0aDtcclxuXHRcdFx0XHRzY3JlZW5TaXplVmVjLmhlaWdodCA9IHJlbmRlclRhcmdldC5oZWlnaHQ7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRyZW5kZXJlci5nZXREcmF3aW5nQnVmZmVyU2l6ZSggc2NyZWVuU2l6ZVZlYyApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRzZXR1cCggLypidWlsZGVyKi8gKSB7XHJcblxyXG5cdFx0Y29uc3Qgc2NvcGUgPSB0aGlzLnNjb3BlO1xyXG5cclxuXHRcdGxldCBvdXRwdXQgPSBudWxsO1xyXG5cclxuXHRcdGlmICggc2NvcGUgPT09IFNjcmVlbk5vZGUuU0laRSApIHtcclxuXHJcblx0XHRcdG91dHB1dCA9IHVuaWZvcm0oIHNjcmVlblNpemVWZWMgfHwgKCBzY3JlZW5TaXplVmVjID0gbmV3IFZlY3RvcjIoKSApICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggc2NvcGUgPT09IFNjcmVlbk5vZGUuVklFV1BPUlQgKSB7XHJcblxyXG5cdFx0XHRvdXRwdXQgPSB1bmlmb3JtKCB2aWV3cG9ydFZlYyB8fCAoIHZpZXdwb3J0VmVjID0gbmV3IFZlY3RvcjQoKSApICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdG91dHB1dCA9IHZlYzIoIHNjcmVlbkNvb3JkaW5hdGUuZGl2KCBzY3JlZW5TaXplICkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG91dHB1dDtcclxuXHJcblx0fVxyXG5cclxuXHRnZW5lcmF0ZSggYnVpbGRlciApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuc2NvcGUgPT09IFNjcmVlbk5vZGUuQ09PUkRJTkFURSApIHtcclxuXHJcblx0XHRcdGxldCBjb29yZCA9IGJ1aWxkZXIuZ2V0RnJhZ0Nvb3JkKCk7XHJcblxyXG5cdFx0XHRpZiAoIGJ1aWxkZXIuaXNGbGlwWSgpICkge1xyXG5cclxuXHRcdFx0XHQvLyBmb2xsb3cgd2ViZ3B1IHN0YW5kYXJkc1xyXG5cclxuXHRcdFx0XHRjb25zdCBzaXplID0gYnVpbGRlci5nZXROb2RlUHJvcGVydGllcyggc2NyZWVuU2l6ZSApLm91dHB1dE5vZGUuYnVpbGQoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRcdFx0Y29vcmQgPSBgJHsgYnVpbGRlci5nZXRUeXBlKCAndmVjMicgKSB9KCAkeyBjb29yZCB9LngsICR7IHNpemUgfS55IC0gJHsgY29vcmQgfS55IClgO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIGNvb3JkO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gc3VwZXIuZ2VuZXJhdGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuU2NyZWVuTm9kZS5DT09SRElOQVRFID0gJ2Nvb3JkaW5hdGUnO1xyXG5TY3JlZW5Ob2RlLlZJRVdQT1JUID0gJ3ZpZXdwb3J0JztcclxuU2NyZWVuTm9kZS5TSVpFID0gJ3NpemUnO1xyXG5TY3JlZW5Ob2RlLlVWID0gJ3V2JztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IFNjcmVlbk5vZGU7XHJcblxyXG4vLyBTY3JlZW5cclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyBub3JtYWxpemVkIHNjcmVlbiBjb29yZGluYXRlcywgdW5pdGxlc3MgaW4gYFswLCAxXWAuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1NjcmVlbk5vZGU8dmVjMj59XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgc2NyZWVuVVYgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIFNjcmVlbk5vZGUsIFNjcmVlbk5vZGUuVVYgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgc2NyZWVuIHJlc29sdXRpb24gaW4gcGh5c2ljYWwgcGl4ZWwgdW5pdHMuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1NjcmVlbk5vZGU8dmVjMj59XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgc2NyZWVuU2l6ZSA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggU2NyZWVuTm9kZSwgU2NyZWVuTm9kZS5TSVpFICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGN1cnJlbnQgYHhgL2B5YCBwaXhlbCBwb3NpdGlvbiBvbiB0aGUgc2NyZWVuIGluIHBoeXNpY2FsIHBpeGVsIHVuaXRzLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtTY3JlZW5Ob2RlPHZlYzI+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHNjcmVlbkNvb3JkaW5hdGUgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIFNjcmVlbk5vZGUsIFNjcmVlbk5vZGUuQ09PUkRJTkFURSApO1xyXG5cclxuLy8gVmlld3BvcnRcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgdmlld3BvcnQgcmVjdGFuZ2xlIGFzIGB4YCwgYHlgLCBgd2lkdGhgIGFuZCBgaGVpZ2h0YCBpbiBwaHlzaWNhbCBwaXhlbCB1bml0cy5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7U2NyZWVuTm9kZTx2ZWM0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCB2aWV3cG9ydCA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggU2NyZWVuTm9kZSwgU2NyZWVuTm9kZS5WSUVXUE9SVCApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSB2aWV3cG9ydCByZXNvbHV0aW9uIGluIHBoeXNpY2FsIHBpeGVsIHVuaXRzLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtTY3JlZW5Ob2RlPHZlYzI+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHZpZXdwb3J0U2l6ZSA9IHZpZXdwb3J0Lnp3O1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBjdXJyZW50IGB4YC9geWAgcGl4ZWwgcG9zaXRpb24gb24gdGhlIHZpZXdwb3J0IGluIHBoeXNpY2FsIHBpeGVsIHVuaXRzLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtTY3JlZW5Ob2RlPHZlYzI+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHZpZXdwb3J0Q29vcmRpbmF0ZSA9IC8qQF9fUFVSRV9fKi8gc2NyZWVuQ29vcmRpbmF0ZS5zdWIoIHZpZXdwb3J0Lnh5ICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgbm9ybWFsaXplZCB2aWV3cG9ydCBjb29yZGluYXRlcywgdW5pdGxlc3MgaW4gYFswLCAxXWAuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1NjcmVlbk5vZGU8dmVjMj59XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgdmlld3BvcnRVViA9IC8qQF9fUFVSRV9fKi8gdmlld3BvcnRDb29yZGluYXRlLmRpdiggdmlld3BvcnRTaXplICk7XHJcblxyXG4vLyBEZXByZWNhdGVkXHJcblxyXG4vKipcclxuICogQGRlcHJlY2F0ZWQgc2luY2UgcjE2OS4gVXNlIHtAbGluayBzY3JlZW5TaXplfSBpbnN0ZWFkLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHZpZXdwb3J0UmVzb2x1dGlvbiA9IC8qQF9fUFVSRV9fKi8gKCBGbiggKCkgPT4geyAvLyBAZGVwcmVjYXRlZCwgcjE2OVxyXG5cclxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5UU0w6IFwidmlld3BvcnRSZXNvbHV0aW9uXCIgaXMgZGVwcmVjYXRlZC4gVXNlIFwic2NyZWVuU2l6ZVwiIGluc3RlYWQuJyApO1xyXG5cclxuXHRyZXR1cm4gc2NyZWVuU2l6ZTtcclxuXHJcbn0sICd2ZWMyJyApLm9uY2UoKSApKCk7XHJcblxyXG4vKipcclxuICogQHRzbFxyXG4gKiBAZGVwcmVjYXRlZCBzaW5jZSByMTY4LiBVc2Uge0BsaW5rIHNjcmVlblVWfSBpbnN0ZWFkLlxyXG4gKiBAdHlwZSB7Tm9kZTx2ZWMyPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCB2aWV3cG9ydFRvcExlZnQgPSAvKkBfX1BVUkVfXyovICggRm4oICgpID0+IHsgLy8gQGRlcHJlY2F0ZWQsIHIxNjhcclxuXHJcblx0Y29uc29sZS53YXJuKCAnVEhSRUUuVFNMOiBcInZpZXdwb3J0VG9wTGVmdFwiIGlzIGRlcHJlY2F0ZWQuIFVzZSBcInNjcmVlblVWXCIgaW5zdGVhZC4nICk7XHJcblxyXG5cdHJldHVybiBzY3JlZW5VVjtcclxuXHJcbn0sICd2ZWMyJyApLm9uY2UoKSApKCk7XHJcblxyXG4vKipcclxuICogQHRzbFxyXG4gKiBAZGVwcmVjYXRlZCBzaW5jZSByMTY4LiBVc2UgYHNjcmVlblVWLmZsaXBZKClgIGluc3RlYWQuXHJcbiAqIEB0eXBlIHtOb2RlPHZlYzI+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHZpZXdwb3J0Qm90dG9tTGVmdCA9IC8qQF9fUFVSRV9fKi8gKCBGbiggKCkgPT4geyAvLyBAZGVwcmVjYXRlZCwgcjE2OFxyXG5cclxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5UU0w6IFwidmlld3BvcnRCb3R0b21MZWZ0XCIgaXMgZGVwcmVjYXRlZC4gVXNlIFwic2NyZWVuVVYuZmxpcFkoKVwiIGluc3RlYWQuJyApO1xyXG5cclxuXHRyZXR1cm4gc2NyZWVuVVYuZmxpcFkoKTtcclxuXHJcbn0sICd2ZWMyJyApLm9uY2UoKSApKCk7XHJcbiIsImltcG9ydCBUZXh0dXJlTm9kZSBmcm9tICcuLi9hY2Nlc3NvcnMvVGV4dHVyZU5vZGUuanMnO1xyXG5pbXBvcnQgeyBOb2RlVXBkYXRlVHlwZSB9IGZyb20gJy4uL2NvcmUvY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgbm9kZVByb3h5IH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5pbXBvcnQgeyBzY3JlZW5VViB9IGZyb20gJy4vU2NyZWVuTm9kZS5qcyc7XHJcblxyXG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IyLmpzJztcclxuaW1wb3J0IHsgRnJhbWVidWZmZXJUZXh0dXJlIH0gZnJvbSAnLi4vLi4vdGV4dHVyZXMvRnJhbWVidWZmZXJUZXh0dXJlLmpzJztcclxuaW1wb3J0IHsgTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzLmpzJztcclxuXHJcbmNvbnN0IF9zaXplID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMigpO1xyXG5cclxuLyoqXHJcbiAqIEEgc3BlY2lhbCB0eXBlIG9mIHRleHR1cmUgbm9kZSB3aGljaCByZXByZXNlbnRzIHRoZSBkYXRhIG9mIHRoZSBjdXJyZW50IHZpZXdwb3J0XHJcbiAqIGFzIGEgdGV4dHVyZS4gVGhlIG1vZHVsZSBleHRyYWN0cyBkYXRhIGZyb20gdGhlIGN1cnJlbnQgYm91bmQgZnJhbWVidWZmZXIgd2l0aFxyXG4gKiBhIGNvcHkgb3BlcmF0aW9uIHNvIG5vIGV4dHJhIHJlbmRlciBwYXNzIGlzIHJlcXVpcmVkIHRvIHByb2R1Y2UgdGhlIHRleHR1cmUgZGF0YVxyXG4gKiAod2hpY2ggaXMgZ29vZCBmb3IgcGVyZm9ybWFuY2UpLiBgVmlld3BvcnRUZXh0dXJlTm9kZWAgY2FuIGJlIHVzZWQgYXMgYW4gaW5wdXQgZm9yIGFcclxuICogdmFyaWV0eSBvZiBlZmZlY3RzIGxpa2UgcmVmcmFjdGl2ZSBvciB0cmFuc21pc3NpdmUgbWF0ZXJpYWxzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgVGV4dHVyZU5vZGVcclxuICovXHJcbmNsYXNzIFZpZXdwb3J0VGV4dHVyZU5vZGUgZXh0ZW5kcyBUZXh0dXJlTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ1ZpZXdwb3J0VGV4dHVyZU5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgdmlld3BvcnQgdGV4dHVyZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlfSBbdXZOb2RlPXNjcmVlblVWXSAtIFRoZSB1diBub2RlLlxyXG5cdCAqIEBwYXJhbSB7P05vZGV9IFtsZXZlbE5vZGU9bnVsbF0gLSBUaGUgbGV2ZWwgbm9kZS5cclxuXHQgKiBAcGFyYW0gez9UZXh0dXJlfSBbZnJhbWVidWZmZXJUZXh0dXJlPW51bGxdIC0gQSBmcmFtZWJ1ZmZlciB0ZXh0dXJlIGhvbGRpbmcgdGhlIHZpZXdwb3J0IGRhdGEuIElmIG5vdCBwcm92aWRlZCwgYSBmcmFtZWJ1ZmZlciB0ZXh0dXJlIGlzIGNyZWF0ZWQgYXV0b21hdGljYWxseS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggdXZOb2RlID0gc2NyZWVuVVYsIGxldmVsTm9kZSA9IG51bGwsIGZyYW1lYnVmZmVyVGV4dHVyZSA9IG51bGwgKSB7XHJcblxyXG5cdFx0aWYgKCBmcmFtZWJ1ZmZlclRleHR1cmUgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRmcmFtZWJ1ZmZlclRleHR1cmUgPSBuZXcgRnJhbWVidWZmZXJUZXh0dXJlKCk7XHJcblx0XHRcdGZyYW1lYnVmZmVyVGV4dHVyZS5taW5GaWx0ZXIgPSBMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXI7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHN1cGVyKCBmcmFtZWJ1ZmZlclRleHR1cmUsIHV2Tm9kZSwgbGV2ZWxOb2RlICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRvIGdlbmVyYXRlIG1pcG1hcHMgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNPdXRwdXRUZXh0dXJlTm9kZSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYHVwZGF0ZUJlZm9yZVR5cGVgIGlzIHNldCB0byBgTm9kZVVwZGF0ZVR5cGUuRlJBTUVgIHNpbmNlIHRoZSBub2RlIHJlbmRlcnMgdGhlXHJcblx0XHQgKiBzY2VuZSBvbmNlIHBlciBmcmFtZSBpbiBpdHMge0BsaW5rIFZpZXdwb3J0VGV4dHVyZU5vZGUjdXBkYXRlQmVmb3JlfSBtZXRob2QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqIEBkZWZhdWx0ICdmcmFtZSdcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51cGRhdGVCZWZvcmVUeXBlID0gTm9kZVVwZGF0ZVR5cGUuRlJBTUU7XHJcblxyXG5cdH1cclxuXHJcblx0dXBkYXRlQmVmb3JlKCBmcmFtZSApIHtcclxuXHJcblx0XHRjb25zdCByZW5kZXJlciA9IGZyYW1lLnJlbmRlcmVyO1xyXG5cdFx0cmVuZGVyZXIuZ2V0RHJhd2luZ0J1ZmZlclNpemUoIF9zaXplICk7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCBmcmFtZWJ1ZmZlclRleHR1cmUgPSB0aGlzLnZhbHVlO1xyXG5cclxuXHRcdGlmICggZnJhbWVidWZmZXJUZXh0dXJlLmltYWdlLndpZHRoICE9PSBfc2l6ZS53aWR0aCB8fCBmcmFtZWJ1ZmZlclRleHR1cmUuaW1hZ2UuaGVpZ2h0ICE9PSBfc2l6ZS5oZWlnaHQgKSB7XHJcblxyXG5cdFx0XHRmcmFtZWJ1ZmZlclRleHR1cmUuaW1hZ2Uud2lkdGggPSBfc2l6ZS53aWR0aDtcclxuXHRcdFx0ZnJhbWVidWZmZXJUZXh0dXJlLmltYWdlLmhlaWdodCA9IF9zaXplLmhlaWdodDtcclxuXHRcdFx0ZnJhbWVidWZmZXJUZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCBjdXJyZW50R2VuZXJhdGVNaXBtYXBzID0gZnJhbWVidWZmZXJUZXh0dXJlLmdlbmVyYXRlTWlwbWFwcztcclxuXHRcdGZyYW1lYnVmZmVyVGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSB0aGlzLmdlbmVyYXRlTWlwbWFwcztcclxuXHJcblx0XHRyZW5kZXJlci5jb3B5RnJhbWVidWZmZXJUb1RleHR1cmUoIGZyYW1lYnVmZmVyVGV4dHVyZSApO1xyXG5cclxuXHRcdGZyYW1lYnVmZmVyVGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBjdXJyZW50R2VuZXJhdGVNaXBtYXBzO1xyXG5cclxuXHR9XHJcblxyXG5cdGNsb25lKCkge1xyXG5cclxuXHRcdGNvbnN0IHZpZXdwb3J0VGV4dHVyZU5vZGUgPSBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy51dk5vZGUsIHRoaXMubGV2ZWxOb2RlLCB0aGlzLnZhbHVlICk7XHJcblx0XHR2aWV3cG9ydFRleHR1cmVOb2RlLmdlbmVyYXRlTWlwbWFwcyA9IHRoaXMuZ2VuZXJhdGVNaXBtYXBzO1xyXG5cclxuXHRcdHJldHVybiB2aWV3cG9ydFRleHR1cmVOb2RlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBWaWV3cG9ydFRleHR1cmVOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSB2aWV3cG9ydCB0ZXh0dXJlIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7P05vZGV9IFt1dk5vZGU9c2NyZWVuVVZdIC0gVGhlIHV2IG5vZGUuXHJcbiAqIEBwYXJhbSB7P05vZGV9IFtsZXZlbE5vZGU9bnVsbF0gLSBUaGUgbGV2ZWwgbm9kZS5cclxuICogQHBhcmFtIHs/VGV4dHVyZX0gW2ZyYW1lYnVmZmVyVGV4dHVyZT1udWxsXSAtIEEgZnJhbWVidWZmZXIgdGV4dHVyZSBob2xkaW5nIHRoZSB2aWV3cG9ydCBkYXRhLiBJZiBub3QgcHJvdmlkZWQsIGEgZnJhbWVidWZmZXIgdGV4dHVyZSBpcyBjcmVhdGVkIGF1dG9tYXRpY2FsbHkuXHJcbiAqIEByZXR1cm5zIHtWaWV3cG9ydFRleHR1cmVOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHZpZXdwb3J0VGV4dHVyZSA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBWaWV3cG9ydFRleHR1cmVOb2RlICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAwLCAzICk7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIHZpZXdwb3J0IHRleHR1cmUgbm9kZSB3aXRoIGVuYWJsZWQgbWlwbWFwIGdlbmVyYXRpb24uXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7P05vZGV9IFt1dk5vZGU9c2NyZWVuVVZdIC0gVGhlIHV2IG5vZGUuXHJcbiAqIEBwYXJhbSB7P05vZGV9IFtsZXZlbE5vZGU9bnVsbF0gLSBUaGUgbGV2ZWwgbm9kZS5cclxuICogQHBhcmFtIHs/VGV4dHVyZX0gW2ZyYW1lYnVmZmVyVGV4dHVyZT1udWxsXSAtIEEgZnJhbWVidWZmZXIgdGV4dHVyZSBob2xkaW5nIHRoZSB2aWV3cG9ydCBkYXRhLiBJZiBub3QgcHJvdmlkZWQsIGEgZnJhbWVidWZmZXIgdGV4dHVyZSBpcyBjcmVhdGVkIGF1dG9tYXRpY2FsbHkuXHJcbiAqIEByZXR1cm5zIHtWaWV3cG9ydFRleHR1cmVOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHZpZXdwb3J0TWlwVGV4dHVyZSA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBWaWV3cG9ydFRleHR1cmVOb2RlLCBudWxsLCBudWxsLCB7IGdlbmVyYXRlTWlwbWFwczogdHJ1ZSB9ICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAwLCAzICk7XHJcbiIsImltcG9ydCBWaWV3cG9ydFRleHR1cmVOb2RlIGZyb20gJy4vVmlld3BvcnRUZXh0dXJlTm9kZS5qcyc7XHJcbmltcG9ydCB7IG5vZGVQcm94eSB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuaW1wb3J0IHsgc2NyZWVuVVYgfSBmcm9tICcuL1NjcmVlbk5vZGUuanMnO1xyXG5cclxuaW1wb3J0IHsgRGVwdGhUZXh0dXJlIH0gZnJvbSAnLi4vLi4vdGV4dHVyZXMvRGVwdGhUZXh0dXJlLmpzJztcclxuXHJcbmxldCBzaGFyZWREZXB0aGJ1ZmZlciA9IG51bGw7XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyB0aGUgZGVwdGggb2YgdGhlIGN1cnJlbnQgdmlld3BvcnQgYXMgYSB0ZXh0dXJlLiBUaGlzIG1vZHVsZVxyXG4gKiBjYW4gYmUgdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIHZpZXdwb3J0IHRleHR1cmUgdG8gYWNoaWV2ZSBlZmZlY3RzXHJcbiAqIHRoYXQgcmVxdWlyZSBkZXB0aCBldmFsdWF0aW9uLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgVmlld3BvcnRUZXh0dXJlTm9kZVxyXG4gKi9cclxuY2xhc3MgVmlld3BvcnREZXB0aFRleHR1cmVOb2RlIGV4dGVuZHMgVmlld3BvcnRUZXh0dXJlTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ1ZpZXdwb3J0RGVwdGhUZXh0dXJlTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB2aWV3cG9ydCBkZXB0aCB0ZXh0dXJlIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV9IFt1dk5vZGU9c2NyZWVuVVZdIC0gVGhlIHV2IG5vZGUuXHJcblx0ICogQHBhcmFtIHs/Tm9kZX0gW2xldmVsTm9kZT1udWxsXSAtIFRoZSBsZXZlbCBub2RlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCB1dk5vZGUgPSBzY3JlZW5VViwgbGV2ZWxOb2RlID0gbnVsbCApIHtcclxuXHJcblx0XHRpZiAoIHNoYXJlZERlcHRoYnVmZmVyID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0c2hhcmVkRGVwdGhidWZmZXIgPSBuZXcgRGVwdGhUZXh0dXJlKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHN1cGVyKCB1dk5vZGUsIGxldmVsTm9kZSwgc2hhcmVkRGVwdGhidWZmZXIgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgVmlld3BvcnREZXB0aFRleHR1cmVOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgYSB2aWV3cG9ydCBkZXB0aCB0ZXh0dXJlIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7P05vZGV9IFt1dk5vZGU9c2NyZWVuVVZdIC0gVGhlIHV2IG5vZGUuXHJcbiAqIEBwYXJhbSB7P05vZGV9IFtsZXZlbE5vZGU9bnVsbF0gLSBUaGUgbGV2ZWwgbm9kZS5cclxuICogQHJldHVybnMge1ZpZXdwb3J0RGVwdGhUZXh0dXJlTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCB2aWV3cG9ydERlcHRoVGV4dHVyZSA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBWaWV3cG9ydERlcHRoVGV4dHVyZU5vZGUgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDAsIDIgKTtcclxuIiwiaW1wb3J0IE5vZGUgZnJvbSAnLi4vY29yZS9Ob2RlLmpzJztcclxuaW1wb3J0IHsgZmxvYXQsIGxvZywgbG9nMiwgbm9kZUltbXV0YWJsZSwgbm9kZVByb3h5IH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5pbXBvcnQgeyBjYW1lcmFOZWFyLCBjYW1lcmFGYXIgfSBmcm9tICcuLi9hY2Nlc3NvcnMvQ2FtZXJhLmpzJztcclxuaW1wb3J0IHsgcG9zaXRpb25WaWV3IH0gZnJvbSAnLi4vYWNjZXNzb3JzL1Bvc2l0aW9uLmpzJztcclxuaW1wb3J0IHsgdmlld3BvcnREZXB0aFRleHR1cmUgfSBmcm9tICcuL1ZpZXdwb3J0RGVwdGhUZXh0dXJlTm9kZS5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBub2RlIG9mZmVycyBhIGNvbGxlY3Rpb24gb2YgZmVhdHVyZXMgaW4gY29udGV4dCBvZiB0aGUgZGVwdGggbG9naWMgaW4gdGhlIGZyYWdtZW50IHNoYWRlci5cclxuICogRGVwZW5kaW5nIG9uIHtAbGluayBWaWV3cG9ydERlcHRoTm9kZSNzY29wZX0sIGl0IGNhbiBiZSB1c2VkIHRvIGRlZmluZSBhIGRlcHRoIHZhbHVlIGZvciB0aGUgY3VycmVudFxyXG4gKiBmcmFnbWVudCBvciBmb3IgZGVwdGggZXZhbHVhdGlvbiBwdXJwb3Nlcy5cclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVcclxuICovXHJcbmNsYXNzIFZpZXdwb3J0RGVwdGhOb2RlIGV4dGVuZHMgTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ1ZpZXdwb3J0RGVwdGhOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHZpZXdwb3J0IGRlcHRoIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geygnZGVwdGgnfCdkZXB0aEJhc2UnfCdsaW5lYXJEZXB0aCcpfSBzY29wZSAtIFRoZSBub2RlJ3Mgc2NvcGUuXHJcblx0ICogQHBhcmFtIHs/Tm9kZX0gW3ZhbHVlTm9kZT1udWxsXSAtIFRoZSB2YWx1ZSBub2RlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBzY29wZSwgdmFsdWVOb2RlID0gbnVsbCApIHtcclxuXHJcblx0XHRzdXBlciggJ2Zsb2F0JyApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG5vZGUgYmVoYXZlcyBkaWZmZXJlbnRseSBkZXBlbmRpbmcgb24gd2hpY2ggc2NvcGUgaXMgc2VsZWN0ZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogLSBgVmlld3BvcnREZXB0aE5vZGUuREVQVEhfQkFTRWA6IEFsbG93cyB0byBkZWZpbmUgYSB2YWx1ZSBmb3IgdGhlIGN1cnJlbnQgZnJhZ21lbnQncyBkZXB0aC5cclxuXHRcdCAqIC0gYFZpZXdwb3J0RGVwdGhOb2RlLkRFUFRIYDogUmVwcmVzZW50cyB0aGUgZGVwdGggdmFsdWUgZm9yIHRoZSBjdXJyZW50IGZyYWdtZW50IChgdmFsdWVOb2RlYCBpcyBpZ25vcmVkKS5cclxuXHRcdCAqIC0gYFZpZXdwb3J0RGVwdGhOb2RlLkxJTkVBUl9ERVBUSGA6IFJlcHJlc2VudHMgdGhlIGxpbmVhciAob3J0aG9ncmFwaGljKSBkZXB0aCB2YWx1ZSBvZiB0aGUgY3VycmVudCBmcmFnbWVudC5cclxuXHRcdCAqIElmIGEgYHZhbHVlTm9kZWAgaXMgc2V0LCB0aGUgc2NvcGUgY2FuIGJlIHVzZWQgdG8gY29udmVydCBwZXJzcGVjdGl2ZSBkZXB0aCBkYXRhIHRvIGxpbmVhciBkYXRhLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoJ2RlcHRoJ3wnZGVwdGhCYXNlJ3wnbGluZWFyRGVwdGgnKX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zY29wZSA9IHNjb3BlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQ2FuIGJlIHVzZWQgdG8gZGVmaW5lIGEgY3VzdG9tIGRlcHRoIHZhbHVlLlxyXG5cdFx0ICogVGhlIHByb3BlcnR5IGlzIGlnbm9yZWQgaW4gdGhlIGBWaWV3cG9ydERlcHRoTm9kZS5ERVBUSGAgc2NvcGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnZhbHVlTm9kZSA9IHZhbHVlTm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNWaWV3cG9ydERlcHRoTm9kZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0Z2VuZXJhdGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBzY29wZSB9ID0gdGhpcztcclxuXHJcblx0XHRpZiAoIHNjb3BlID09PSBWaWV3cG9ydERlcHRoTm9kZS5ERVBUSF9CQVNFICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIGJ1aWxkZXIuZ2V0RnJhZ0RlcHRoKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBzdXBlci5nZW5lcmF0ZSggYnVpbGRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdHNldHVwKCB7IGNhbWVyYSB9ICkge1xyXG5cclxuXHRcdGNvbnN0IHsgc2NvcGUgfSA9IHRoaXM7XHJcblx0XHRjb25zdCB2YWx1ZSA9IHRoaXMudmFsdWVOb2RlO1xyXG5cclxuXHRcdGxldCBub2RlID0gbnVsbDtcclxuXHJcblx0XHRpZiAoIHNjb3BlID09PSBWaWV3cG9ydERlcHRoTm9kZS5ERVBUSF9CQVNFICkge1xyXG5cclxuXHRcdFx0aWYgKCB2YWx1ZSAhPT0gbnVsbCApIHtcclxuXHJcbiBcdFx0XHRcdG5vZGUgPSBkZXB0aEJhc2UoKS5hc3NpZ24oIHZhbHVlICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmICggc2NvcGUgPT09IFZpZXdwb3J0RGVwdGhOb2RlLkRFUFRIICkge1xyXG5cclxuXHRcdFx0aWYgKCBjYW1lcmEuaXNQZXJzcGVjdGl2ZUNhbWVyYSApIHtcclxuXHJcblx0XHRcdFx0bm9kZSA9IHZpZXdaVG9QZXJzcGVjdGl2ZURlcHRoKCBwb3NpdGlvblZpZXcueiwgY2FtZXJhTmVhciwgY2FtZXJhRmFyICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRub2RlID0gdmlld1pUb09ydGhvZ3JhcGhpY0RlcHRoKCBwb3NpdGlvblZpZXcueiwgY2FtZXJhTmVhciwgY2FtZXJhRmFyICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmICggc2NvcGUgPT09IFZpZXdwb3J0RGVwdGhOb2RlLkxJTkVBUl9ERVBUSCApIHtcclxuXHJcblx0XHRcdGlmICggdmFsdWUgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggY2FtZXJhLmlzUGVyc3BlY3RpdmVDYW1lcmEgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3Qgdmlld1ogPSBwZXJzcGVjdGl2ZURlcHRoVG9WaWV3WiggdmFsdWUsIGNhbWVyYU5lYXIsIGNhbWVyYUZhciApO1xyXG5cclxuXHRcdFx0XHRcdG5vZGUgPSB2aWV3WlRvT3J0aG9ncmFwaGljRGVwdGgoIHZpZXdaLCBjYW1lcmFOZWFyLCBjYW1lcmFGYXIgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRub2RlID0gdmFsdWU7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdG5vZGUgPSB2aWV3WlRvT3J0aG9ncmFwaGljRGVwdGgoIHBvc2l0aW9uVmlldy56LCBjYW1lcmFOZWFyLCBjYW1lcmFGYXIgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG5vZGU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblZpZXdwb3J0RGVwdGhOb2RlLkRFUFRIX0JBU0UgPSAnZGVwdGhCYXNlJztcclxuVmlld3BvcnREZXB0aE5vZGUuREVQVEggPSAnZGVwdGgnO1xyXG5WaWV3cG9ydERlcHRoTm9kZS5MSU5FQVJfREVQVEggPSAnbGluZWFyRGVwdGgnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgVmlld3BvcnREZXB0aE5vZGU7XHJcblxyXG4vLyBOT1RFOiB2aWV3WiwgdGhlIHotY29vcmRpbmF0ZSBpbiBjYW1lcmEgc3BhY2UsIGlzIG5lZ2F0aXZlIGZvciBwb2ludHMgaW4gZnJvbnQgb2YgdGhlIGNhbWVyYVxyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY29udmVydGluZyBhIHZpZXdaIHZhbHVlIHRvIGFuIG9ydGhvZ3JhcGhpYyBkZXB0aCB2YWx1ZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlPGZsb2F0Pn0gdmlld1ogLSBUaGUgdmlld1ogbm9kZS5cclxuICogQHBhcmFtIHtOb2RlPGZsb2F0Pn0gbmVhciAtIFRoZSBjYW1lcmEncyBuZWFyIHZhbHVlLlxyXG4gKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSBmYXIgLSBUaGUgY2FtZXJhJ3MgZmFyIHZhbHVlLlxyXG4gKiBAcmV0dXJucyB7Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgdmlld1pUb09ydGhvZ3JhcGhpY0RlcHRoID0gKCB2aWV3WiwgbmVhciwgZmFyICkgPT4gdmlld1ouYWRkKCBuZWFyICkuZGl2KCBuZWFyLnN1YiggZmFyICkgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNvbnZlcnRpbmcgYW4gb3J0aG9ncmFwaGljIGRlcHRoIHZhbHVlIHRvIGEgdmlld1ogdmFsdWUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTxmbG9hdD59IGRlcHRoIC0gVGhlIG9ydGhvZ3JhcGhpYyBkZXB0aC5cclxuICogQHBhcmFtIHtOb2RlPGZsb2F0Pn0gbmVhciAtIFRoZSBjYW1lcmEncyBuZWFyIHZhbHVlLlxyXG4gKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSBmYXIgLSBUaGUgY2FtZXJhJ3MgZmFyIHZhbHVlLlxyXG4gKiBAcmV0dXJucyB7Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgb3J0aG9ncmFwaGljRGVwdGhUb1ZpZXdaID0gKCBkZXB0aCwgbmVhciwgZmFyICkgPT4gbmVhci5zdWIoIGZhciApLm11bCggZGVwdGggKS5zdWIoIG5lYXIgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNvbnZlcnRpbmcgYSB2aWV3WiB2YWx1ZSB0byBhIHBlcnNwZWN0aXZlIGRlcHRoIHZhbHVlLlxyXG4gKlxyXG4gKiBOb3RlOiB7bGluayBodHRwczovL3R3aXR0ZXIuY29tL2dvbm5hdmlzL3N0YXR1cy8xMzc3MTgzNzg2OTQ5OTU5NjgyfS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlPGZsb2F0Pn0gdmlld1ogLSBUaGUgdmlld1ogbm9kZS5cclxuICogQHBhcmFtIHtOb2RlPGZsb2F0Pn0gbmVhciAtIFRoZSBjYW1lcmEncyBuZWFyIHZhbHVlLlxyXG4gKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSBmYXIgLSBUaGUgY2FtZXJhJ3MgZmFyIHZhbHVlLlxyXG4gKiBAcmV0dXJucyB7Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgdmlld1pUb1BlcnNwZWN0aXZlRGVwdGggPSAoIHZpZXdaLCBuZWFyLCBmYXIgKSA9PiBuZWFyLmFkZCggdmlld1ogKS5tdWwoIGZhciApLmRpdiggZmFyLnN1YiggbmVhciApLm11bCggdmlld1ogKSApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY29udmVydGluZyBhIHBlcnNwZWN0aXZlIGRlcHRoIHZhbHVlIHRvIGEgdmlld1ogdmFsdWUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTxmbG9hdD59IGRlcHRoIC0gVGhlIHBlcnNwZWN0aXZlIGRlcHRoLlxyXG4gKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSBuZWFyIC0gVGhlIGNhbWVyYSdzIG5lYXIgdmFsdWUuXHJcbiAqIEBwYXJhbSB7Tm9kZTxmbG9hdD59IGZhciAtIFRoZSBjYW1lcmEncyBmYXIgdmFsdWUuXHJcbiAqIEByZXR1cm5zIHtOb2RlPGZsb2F0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBwZXJzcGVjdGl2ZURlcHRoVG9WaWV3WiA9ICggZGVwdGgsIG5lYXIsIGZhciApID0+IG5lYXIubXVsKCBmYXIgKS5kaXYoIGZhci5zdWIoIG5lYXIgKS5tdWwoIGRlcHRoICkuc3ViKCBmYXIgKSApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY29udmVydGluZyBhIHZpZXdaIHZhbHVlIHRvIGEgbG9nYXJpdGhtaWMgZGVwdGggdmFsdWUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTxmbG9hdD59IHZpZXdaIC0gVGhlIHZpZXdaIG5vZGUuXHJcbiAqIEBwYXJhbSB7Tm9kZTxmbG9hdD59IG5lYXIgLSBUaGUgY2FtZXJhJ3MgbmVhciB2YWx1ZS5cclxuICogQHBhcmFtIHtOb2RlPGZsb2F0Pn0gZmFyIC0gVGhlIGNhbWVyYSdzIGZhciB2YWx1ZS5cclxuICogQHJldHVybnMge05vZGU8ZmxvYXQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHZpZXdaVG9Mb2dhcml0aG1pY0RlcHRoID0gKCB2aWV3WiwgbmVhciwgZmFyICkgPT4ge1xyXG5cclxuXHQvLyBOT1RFOiB2aWV3WiBtdXN0IGJlIG5lZ2F0aXZlLS1zZWUgZXhwbGFuYXRpb24gYXQgdGhlIGVuZCBvZiB0aGlzIGNvbW1lbnQgYmxvY2suXHJcblx0Ly8gVGhlIGZpbmFsIGxvZ2FyaXRobWljIGRlcHRoIGZvcm11bGEgdXNlZCBoZXJlIGlzIGFkYXB0ZWQgZnJvbSBvbmUgZGVzY3JpYmVkIGluIGFuXHJcblx0Ly8gYXJ0aWNsZSBieSBUaGF0Y2hlciBVbHJpY2ggKHNlZSBodHRwOi8vdHVscmljaC5jb20vZ2Vla3N0dWZmL2xvZ19kZXB0aF9idWZmZXIudHh0KSxcclxuXHQvLyB3aGljaCB3YXMgYW4gaW1wcm92ZW1lbnQgdXBvbiBhbiBlYXJsaWVyIGZvcm11bGEgb25lIGRlc2NyaWJlZCBpbiBhblxyXG5cdC8vIE91dGVycmEgYXJ0aWNsZSAoaHR0cHM6Ly9vdXRlcnJhLmJsb2dzcG90LmNvbS8yMDA5LzA4L2xvZ2FyaXRobWljLXotYnVmZmVyLmh0bWwpLlxyXG5cdC8vIFVscmljaCdzIGZvcm11bGEgaXMgdGhlIGZvbGxvd2luZzpcclxuXHQvLyAgICAgeiA9IEsgKiBsb2coIHcgLyBjYW1lcmFOZWFyICkgLyBsb2coIGNhbWVyYUZhciAvIGNhbWVyYU5lYXIgKVxyXG5cdC8vICAgICB3aGVyZSBLID0gMl5rIC0gMSwgYW5kIGsgaXMgdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBkZXB0aCBidWZmZXIuXHJcblx0Ly8gVGhlIE91dGVycmEgdmFyaWFudCBpZ25vcmVkIHRoZSBjYW1lcmEgbmVhciBwbGFuZSAoaXQgYXNzdW1lZCBpdCB3YXMgMCkgYW5kIGluc3RlYWRcclxuXHQvLyBvcHRlZCBmb3IgYSBcIkMtY29uc3RhbnRcIiBmb3IgcmVzb2x1dGlvbiBhZGp1c3RtZW50IG9mIG9iamVjdHMgbmVhciB0aGUgY2FtZXJhLlxyXG5cdC8vIE91dGVycmEgc3RhdGVzOiBcIk5vdGljZSB0aGF0IHRoZSAnQycgdmFyaWFudCBkb2VzbuKAmXQgdXNlIGEgbmVhciBwbGFuZSBkaXN0YW5jZSwgaXQgaGFzIGl0XHJcblx0Ly8gc2V0IGF0IDBcIiAocXVvdGUgZnJvbSBodHRwczovL291dGVycmEuYmxvZ3Nwb3QuY29tLzIwMTIvMTEvbWF4aW1pemluZy1kZXB0aC1idWZmZXItcmFuZ2UtYW5kLmh0bWwpLlxyXG5cdC8vIFVscmljaCdzIHZhcmlhbnQgaGFzIHRoZSBiZW5lZml0IG9mIGNvbnN0YW50IHJlbGF0aXZlIHByZWNpc2lvbiBvdmVyIHRoZSB3aG9sZSBuZWFyLWZhciByYW5nZS5cclxuXHQvLyBJdCB3YXMgZGViYXRlZCBoZXJlIHdoZXRoZXIgT3V0ZXJyYSdzIFwiQy1jb25zdGFudFwiIG9yIFVscmljaCdzIFwibmVhciBwbGFuZVwiIHZhcmlhbnQgc2hvdWxkXHJcblx0Ly8gYmUgdXNlZCwgYW5kIHVsdGltYXRlbHkgVWxyaWNoJ3MgXCJuZWFyIHBsYW5lXCIgdmVyc2lvbiB3YXMgY2hvc2VuLlxyXG5cdC8vIE91dGVycmEgZXZlbnR1YWxseSBtYWRlIGFub3RoZXIgaW1wcm92ZW1lbnQgdG8gdGhlaXIgb3JpZ2luYWwgXCJDLWNvbnN0YW50XCIgdmFyaWFudCxcclxuXHQvLyBidXQgaXQgc3RpbGwgZG9lcyBub3QgaW5jb3Jwb3JhdGUgdGhlIGNhbWVyYSBuZWFyIHBsYW5lIChmb3IgdGhpcyB2ZXJzaW9uLFxyXG5cdC8vIHNlZSBodHRwczovL291dGVycmEuYmxvZ3Nwb3QuY29tLzIwMTMvMDcvbG9nYXJpdGhtaWMtZGVwdGgtYnVmZmVyLW9wdGltaXphdGlvbnMuaHRtbCkuXHJcblx0Ly8gSGVyZSB3ZSBtYWtlIDQgY2hhbmdlcyB0byBVbHJpY2gncyBmb3JtdWxhOlxyXG5cdC8vIDEuIENsYW1wIHRoZSBjYW1lcmEgbmVhciBwbGFuZSBzbyB3ZSBkb24ndCBkaXZpZGUgYnkgMC5cclxuXHQvLyAyLiBVc2UgbG9nMiBpbnN0ZWFkIG9mIGxvZyB0byBhdm9pZCBhbiBleHRyYSBtdWx0aXBseSAoc2hhZGVycyBpbXBsZW1lbnQgbG9nIHVzaW5nIGxvZzIpLlxyXG5cdC8vIDMuIEFzc3VtZSBLIGlzIDEgKEsgPSBtYXhpbXVtIHZhbHVlIGluIGRlcHRoIGJ1ZmZlcjsgc2VlIFVscmljaCdzIGZvcm11bGEgYWJvdmUpLlxyXG5cdC8vIDQuIFRvIG1haW50YWluIGNvbnNpc3RlbmN5IHdpdGggdGhlIGZ1bmN0aW9ucyBcInZpZXdaVG9PcnRob2dyYXBoaWNEZXB0aFwiIGFuZCBcInZpZXdaVG9QZXJzcGVjdGl2ZURlcHRoXCIsXHJcblx0Ly8gICAgd2UgbW9kaWZ5IHRoZSBmb3JtdWxhIGhlcmUgdG8gdXNlICd2aWV3WicgaW5zdGVhZCBvZiAndycuIFRoZSBvdGhlciBmdW5jdGlvbnMgZXhwZWN0IGEgbmVnYXRpdmUgdmlld1osXHJcblx0Ly8gICAgc28gd2UgZG8gdGhlIHNhbWUgaGVyZSwgaGVuY2UgdGhlICd2aWV3Wi5uZWdhdGUoKScgY2FsbC5cclxuXHQvLyBGb3IgdmlzdWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgZGVwdGggY3VydmUsIHNlZSBodHRwczovL3d3dy5kZXNtb3MuY29tL2NhbGN1bGF0b3IvdXlxazB2ZXgxdVxyXG5cdG5lYXIgPSBuZWFyLm1heCggMWUtNiApLnRvVmFyKCk7XHJcblx0Y29uc3QgbnVtZXJhdG9yID0gbG9nMiggdmlld1oubmVnYXRlKCkuZGl2KCBuZWFyICkgKTtcclxuXHRjb25zdCBkZW5vbWluYXRvciA9IGxvZzIoIGZhci5kaXYoIG5lYXIgKSApO1xyXG5cdHJldHVybiBudW1lcmF0b3IuZGl2KCBkZW5vbWluYXRvciApO1xyXG5cclxufTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNvbnZlcnRpbmcgYSBsb2dhcml0aG1pYyBkZXB0aCB2YWx1ZSB0byBhIHZpZXdaIHZhbHVlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSBkZXB0aCAtIFRoZSBsb2dhcml0aG1pYyBkZXB0aC5cclxuICogQHBhcmFtIHtOb2RlPGZsb2F0Pn0gbmVhciAtIFRoZSBjYW1lcmEncyBuZWFyIHZhbHVlLlxyXG4gKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSBmYXIgLSBUaGUgY2FtZXJhJ3MgZmFyIHZhbHVlLlxyXG4gKiBAcmV0dXJucyB7Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbG9nYXJpdGhtaWNEZXB0aFRvVmlld1ogPSAoIGRlcHRoLCBuZWFyLCBmYXIgKSA9PiB7XHJcblxyXG5cdC8vIE5PVEU6IHdlIGFkZCBhICduZWdhdGUoKScgY2FsbCB0byB0aGUgcmV0dXJuIHZhbHVlIGhlcmUgdG8gbWFpbnRhaW4gY29uc2lzdGVuY3kgd2l0aFxyXG5cdC8vIHRoZSBmdW5jdGlvbnMgXCJvcnRob2dyYXBoaWNEZXB0aFRvVmlld1pcIiBhbmQgXCJwZXJzcGVjdGl2ZURlcHRoVG9WaWV3WlwiICh0aGV5IHJldHVyblxyXG5cdC8vIGEgbmVnYXRpdmUgdmlld1opLlxyXG5cdGNvbnN0IGV4cG9uZW50ID0gZGVwdGgubXVsKCBsb2coIGZhci5kaXYoIG5lYXIgKSApICk7XHJcblx0cmV0dXJuIGZsb2F0KCBNYXRoLkUgKS5wb3coIGV4cG9uZW50ICkubXVsKCBuZWFyICkubmVnYXRlKCk7XHJcblxyXG59O1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgZGVmaW5pbmcgYSB2YWx1ZSBmb3IgdGhlIGN1cnJlbnQgZnJhZ21lbnQncyBkZXB0aC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlPGZsb2F0Pn0gdmFsdWUgLSBUaGUgZGVwdGggdmFsdWUgdG8gc2V0LlxyXG4gKiBAcmV0dXJucyB7Vmlld3BvcnREZXB0aE5vZGU8ZmxvYXQ+fVxyXG4gKi9cclxuY29uc3QgZGVwdGhCYXNlID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIFZpZXdwb3J0RGVwdGhOb2RlLCBWaWV3cG9ydERlcHRoTm9kZS5ERVBUSF9CQVNFICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGRlcHRoIHZhbHVlIGZvciB0aGUgY3VycmVudCBmcmFnbWVudC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Vmlld3BvcnREZXB0aE5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZGVwdGggPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIFZpZXdwb3J0RGVwdGhOb2RlLCBWaWV3cG9ydERlcHRoTm9kZS5ERVBUSCApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY29udmVydGluZyBhIHBlcnNwZWN0aXZlIGRlcHRoIHZhbHVlIHRvIGxpbmVhciBkZXB0aC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHs/Tm9kZTxmbG9hdD59IFt2YWx1ZT1udWxsXSAtIFRoZSBwZXJzcGVjdGl2ZSBkZXB0aC4gSWYgYG51bGxgIGlzIHByb3ZpZGVkLCB0aGUgY3VycmVudCBmcmFnbWVudCdzIGRlcHRoIGlzIHVzZWQuXHJcbiAqIEByZXR1cm5zIHtWaWV3cG9ydERlcHRoTm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbGluZWFyRGVwdGggPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggVmlld3BvcnREZXB0aE5vZGUsIFZpZXdwb3J0RGVwdGhOb2RlLkxJTkVBUl9ERVBUSCApLnNldFBhcmFtZXRlckxlbmd0aCggMCwgMSApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBsaW5lYXIgKG9ydGhvZ3JhcGhpYykgZGVwdGggdmFsdWUgb2YgdGhlIGN1cnJlbnQgZnJhZ21lbnRcclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Vmlld3BvcnREZXB0aE5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgdmlld3BvcnRMaW5lYXJEZXB0aCA9IC8qQF9fUFVSRV9fKi8gbGluZWFyRGVwdGgoIHZpZXdwb3J0RGVwdGhUZXh0dXJlKCkgKTtcclxuXHJcbmRlcHRoLmFzc2lnbiA9ICggdmFsdWUgKSA9PiBkZXB0aEJhc2UoIHZhbHVlICk7XHJcbiIsImltcG9ydCBOb2RlIGZyb20gJy4uL2NvcmUvTm9kZS5qcyc7XHJcbmltcG9ydCB7IG5vZGVQcm94eSB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGUgbm9kZSBhbGxvd3MgdG8gc2V0IHZhbHVlcyBmb3IgYnVpbHQtaW4gc2hhZGVyIHZhcmlhYmxlcy4gVGhhdCBpc1xyXG4gKiByZXF1aXJlZCBmb3IgZmVhdHVyZXMgbGlrZSBoYXJkd2FyZS1hY2NlbGVyYXRlZCB2ZXJ0ZXggY2xpcHBpbmcuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBOb2RlXHJcbiAqL1xyXG5jbGFzcyBCdWlsdGluTm9kZSBleHRlbmRzIE5vZGUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGJ1aWx0aW4gbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGJ1aWx0LWluIHNoYWRlciB2YXJpYWJsZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbmFtZSApIHtcclxuXHJcblx0XHRzdXBlciggJ2Zsb2F0JyApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG5hbWUgb2YgdGhlIGJ1aWx0LWluIHNoYWRlciB2YXJpYWJsZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5hbWUgPSBuYW1lO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0J1aWx0aW5Ob2RlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZW5lcmF0ZXMgdGhlIGNvZGUgc25pcHBldCBvZiB0aGUgYnVpbHRpbiBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBnZW5lcmF0ZWQgY29kZSBzbmlwcGV0LlxyXG5cdCAqL1xyXG5cdGdlbmVyYXRlKCAvKiBidWlsZGVyICovICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm5hbWU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEJ1aWx0aW5Ob2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSBidWlsdGluIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGJ1aWx0LWluIHNoYWRlciB2YXJpYWJsZS5cclxuICogQHJldHVybnMge0J1aWx0aW5Ob2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGJ1aWx0aW4gPSBub2RlUHJveHkoIEJ1aWx0aW5Ob2RlICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAxICk7XHJcbiIsIlxyXG5pbXBvcnQgTm9kZSBmcm9tICcuLi9jb3JlL05vZGUuanMnO1xyXG5pbXBvcnQgeyBub2RlT2JqZWN0LCBGbiwgYm9vbCwgZmxvYXQgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcbmltcG9ydCB7IHBvc2l0aW9uVmlldyB9IGZyb20gJy4vUG9zaXRpb24uanMnO1xyXG5pbXBvcnQgeyBkaWZmdXNlQ29sb3IgfSBmcm9tICcuLi9jb3JlL1Byb3BlcnR5Tm9kZS5qcyc7XHJcbmltcG9ydCB7IExvb3AgfSBmcm9tICcuLi91dGlscy9Mb29wTm9kZS5qcyc7XHJcbmltcG9ydCB7IHNtb290aHN0ZXAgfSBmcm9tICcuLi9tYXRoL01hdGhOb2RlLmpzJztcclxuaW1wb3J0IHsgdW5pZm9ybUFycmF5IH0gZnJvbSAnLi9Vbmlmb3JtQXJyYXlOb2RlLmpzJztcclxuaW1wb3J0IHsgYnVpbHRpbiB9IGZyb20gJy4vQnVpbHRpbk5vZGUuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgbm9kZSBpcyB1c2VkIGluIHtAbGluayBOb2RlTWF0ZXJpYWx9IHRvIHNldHVwIHRoZSBjbGlwcGluZ1xyXG4gKiB3aGljaCBjYW4gaGFwcGVuIGhhcmR3YXJlLWFjY2VsZXJhdGVkIChpZiBzdXBwb3J0ZWQpIGFuZCBvcHRpb25hbGx5XHJcbiAqIHVzZSBhbHBoYS10by1jb3ZlcmFnZSBmb3IgYW50aS1hbGlhc2luZyBjbGlwcGVkIGVkZ2VzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTm9kZVxyXG4gKi9cclxuY2xhc3MgQ2xpcHBpbmdOb2RlIGV4dGVuZHMgTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ0NsaXBwaW5nTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBjbGlwcGluZyBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHsoJ2RlZmF1bHQnfCdoYXJkd2FyZSd8J2FscGhhVG9Db3ZlcmFnZScpfSBbc2NvcGU9J2RlZmF1bHQnXSAtIFRoZSBub2RlJ3Mgc2NvcGUuIFNpbWlsYXIgdG8gb3RoZXIgbm9kZXMsXHJcblx0ICogdGhlIHNlbGVjdGVkIHNjb3BlIGluZmx1ZW5jZXMgdGhlIGJlaGF2aW9yIG9mIHRoZSBub2RlIGFuZCB3aGF0IHR5cGUgb2YgY29kZSBpcyBnZW5lcmF0ZWQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHNjb3BlID0gQ2xpcHBpbmdOb2RlLkRFRkFVTFQgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBub2RlJ3Mgc2NvcGUuIFNpbWlsYXIgdG8gb3RoZXIgbm9kZXMsIHRoZSBzZWxlY3RlZCBzY29wZSBpbmZsdWVuY2VzXHJcblx0XHQgKiB0aGUgYmVoYXZpb3Igb2YgdGhlIG5vZGUgYW5kIHdoYXQgdHlwZSBvZiBjb2RlIGlzIGdlbmVyYXRlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KCdkZWZhdWx0J3wnaGFyZHdhcmUnfCdhbHBoYVRvQ292ZXJhZ2UnKX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zY29wZSA9IHNjb3BlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHVwcyB0aGUgbm9kZSBkZXBlbmRpbmcgb24gdGhlIHNlbGVjdGVkIHNjb3BlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtOb2RlfSBUaGUgcmVzdWx0IG5vZGUuXHJcblx0ICovXHJcblx0c2V0dXAoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0c3VwZXIuc2V0dXAoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRjb25zdCBjbGlwcGluZ0NvbnRleHQgPSBidWlsZGVyLmNsaXBwaW5nQ29udGV4dDtcclxuXHRcdGNvbnN0IHsgaW50ZXJzZWN0aW9uUGxhbmVzLCB1bmlvblBsYW5lcyB9ID0gY2xpcHBpbmdDb250ZXh0O1xyXG5cclxuXHRcdHRoaXMuaGFyZHdhcmVDbGlwcGluZyA9IGJ1aWxkZXIubWF0ZXJpYWwuaGFyZHdhcmVDbGlwcGluZztcclxuXHJcblx0XHRpZiAoIHRoaXMuc2NvcGUgPT09IENsaXBwaW5nTm9kZS5BTFBIQV9UT19DT1ZFUkFHRSApIHtcclxuXHJcblx0XHRcdHJldHVybiB0aGlzLnNldHVwQWxwaGFUb0NvdmVyYWdlKCBpbnRlcnNlY3Rpb25QbGFuZXMsIHVuaW9uUGxhbmVzICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggdGhpcy5zY29wZSA9PT0gQ2xpcHBpbmdOb2RlLkhBUkRXQVJFICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIHRoaXMuc2V0dXBIYXJkd2FyZUNsaXBwaW5nKCB1bmlvblBsYW5lcywgYnVpbGRlciApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gdGhpcy5zZXR1cERlZmF1bHQoIGludGVyc2VjdGlvblBsYW5lcywgdW5pb25QbGFuZXMgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0dXBzIGFscGhhIHRvIGNvdmVyYWdlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxWZWN0b3I0Pn0gaW50ZXJzZWN0aW9uUGxhbmVzIC0gVGhlIGludGVyc2VjdGlvbiBwbGFuZXMuXHJcblx0ICogQHBhcmFtIHtBcnJheTxWZWN0b3I0Pn0gdW5pb25QbGFuZXMgLSBUaGUgdW5pb24gcGxhbmVzLlxyXG5cdCAqIEByZXR1cm4ge05vZGV9IFRoZSByZXN1bHQgbm9kZS5cclxuXHQgKi9cclxuXHRzZXR1cEFscGhhVG9Db3ZlcmFnZSggaW50ZXJzZWN0aW9uUGxhbmVzLCB1bmlvblBsYW5lcyApIHtcclxuXHJcblx0XHRyZXR1cm4gRm4oICgpID0+IHtcclxuXHJcblx0XHRcdGNvbnN0IGRpc3RhbmNlVG9QbGFuZSA9IGZsb2F0KCkudG9WYXIoICdkaXN0YW5jZVRvUGxhbmUnICk7XHJcblx0XHRcdGNvbnN0IGRpc3RhbmNlR3JhZGllbnQgPSBmbG9hdCgpLnRvVmFyKCAnZGlzdGFuY2VUb0dyYWRpZW50JyApO1xyXG5cclxuXHRcdFx0Y29uc3QgY2xpcE9wYWNpdHkgPSBmbG9hdCggMSApLnRvVmFyKCAnY2xpcE9wYWNpdHknICk7XHJcblxyXG5cdFx0XHRjb25zdCBudW1VbmlvblBsYW5lcyA9IHVuaW9uUGxhbmVzLmxlbmd0aDtcclxuXHJcblx0XHRcdGlmICggdGhpcy5oYXJkd2FyZUNsaXBwaW5nID09PSBmYWxzZSAmJiBudW1VbmlvblBsYW5lcyA+IDAgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGNsaXBwaW5nUGxhbmVzID0gdW5pZm9ybUFycmF5KCB1bmlvblBsYW5lcyApO1xyXG5cclxuXHRcdFx0XHRMb29wKCBudW1VbmlvblBsYW5lcywgKCB7IGkgfSApID0+IHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBwbGFuZSA9IGNsaXBwaW5nUGxhbmVzLmVsZW1lbnQoIGkgKTtcclxuXHJcblx0XHRcdFx0XHRkaXN0YW5jZVRvUGxhbmUuYXNzaWduKCBwb3NpdGlvblZpZXcuZG90KCBwbGFuZS54eXogKS5uZWdhdGUoKS5hZGQoIHBsYW5lLncgKSApO1xyXG5cdFx0XHRcdFx0ZGlzdGFuY2VHcmFkaWVudC5hc3NpZ24oIGRpc3RhbmNlVG9QbGFuZS5md2lkdGgoKS5kaXYoIDIuMCApICk7XHJcblxyXG5cdFx0XHRcdFx0Y2xpcE9wYWNpdHkubXVsQXNzaWduKCBzbW9vdGhzdGVwKCBkaXN0YW5jZUdyYWRpZW50Lm5lZ2F0ZSgpLCBkaXN0YW5jZUdyYWRpZW50LCBkaXN0YW5jZVRvUGxhbmUgKSApO1xyXG5cclxuXHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBudW1JbnRlcnNlY3Rpb25QbGFuZXMgPSBpbnRlcnNlY3Rpb25QbGFuZXMubGVuZ3RoO1xyXG5cclxuXHRcdFx0aWYgKCBudW1JbnRlcnNlY3Rpb25QbGFuZXMgPiAwICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBjbGlwcGluZ1BsYW5lcyA9IHVuaWZvcm1BcnJheSggaW50ZXJzZWN0aW9uUGxhbmVzICk7XHJcblx0XHRcdFx0Y29uc3QgaW50ZXJzZWN0aW9uQ2xpcE9wYWNpdHkgPSBmbG9hdCggMSApLnRvVmFyKCAnaW50ZXJzZWN0aW9uQ2xpcE9wYWNpdHknICk7XHJcblxyXG5cdFx0XHRcdExvb3AoIG51bUludGVyc2VjdGlvblBsYW5lcywgKCB7IGkgfSApID0+IHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBwbGFuZSA9IGNsaXBwaW5nUGxhbmVzLmVsZW1lbnQoIGkgKTtcclxuXHJcblx0XHRcdFx0XHRkaXN0YW5jZVRvUGxhbmUuYXNzaWduKCBwb3NpdGlvblZpZXcuZG90KCBwbGFuZS54eXogKS5uZWdhdGUoKS5hZGQoIHBsYW5lLncgKSApO1xyXG5cdFx0XHRcdFx0ZGlzdGFuY2VHcmFkaWVudC5hc3NpZ24oIGRpc3RhbmNlVG9QbGFuZS5md2lkdGgoKS5kaXYoIDIuMCApICk7XHJcblxyXG5cdFx0XHRcdFx0aW50ZXJzZWN0aW9uQ2xpcE9wYWNpdHkubXVsQXNzaWduKCBzbW9vdGhzdGVwKCBkaXN0YW5jZUdyYWRpZW50Lm5lZ2F0ZSgpLCBkaXN0YW5jZUdyYWRpZW50LCBkaXN0YW5jZVRvUGxhbmUgKS5vbmVNaW51cygpICk7XHJcblxyXG5cdFx0XHRcdH0gKTtcclxuXHJcblx0XHRcdFx0Y2xpcE9wYWNpdHkubXVsQXNzaWduKCBpbnRlcnNlY3Rpb25DbGlwT3BhY2l0eS5vbmVNaW51cygpICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRkaWZmdXNlQ29sb3IuYS5tdWxBc3NpZ24oIGNsaXBPcGFjaXR5ICk7XHJcblxyXG5cdFx0XHRkaWZmdXNlQ29sb3IuYS5lcXVhbCggMC4wICkuZGlzY2FyZCgpO1xyXG5cclxuXHRcdH0gKSgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHVwcyB0aGUgZGVmYXVsdCBjbGlwcGluZy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8VmVjdG9yND59IGludGVyc2VjdGlvblBsYW5lcyAtIFRoZSBpbnRlcnNlY3Rpb24gcGxhbmVzLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8VmVjdG9yND59IHVuaW9uUGxhbmVzIC0gVGhlIHVuaW9uIHBsYW5lcy5cclxuXHQgKiBAcmV0dXJuIHtOb2RlfSBUaGUgcmVzdWx0IG5vZGUuXHJcblx0ICovXHJcblx0c2V0dXBEZWZhdWx0KCBpbnRlcnNlY3Rpb25QbGFuZXMsIHVuaW9uUGxhbmVzICkge1xyXG5cclxuXHRcdHJldHVybiBGbiggKCkgPT4ge1xyXG5cclxuXHRcdFx0Y29uc3QgbnVtVW5pb25QbGFuZXMgPSB1bmlvblBsYW5lcy5sZW5ndGg7XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMuaGFyZHdhcmVDbGlwcGluZyA9PT0gZmFsc2UgJiYgbnVtVW5pb25QbGFuZXMgPiAwICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBjbGlwcGluZ1BsYW5lcyA9IHVuaWZvcm1BcnJheSggdW5pb25QbGFuZXMgKTtcclxuXHJcblx0XHRcdFx0TG9vcCggbnVtVW5pb25QbGFuZXMsICggeyBpIH0gKSA9PiB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgcGxhbmUgPSBjbGlwcGluZ1BsYW5lcy5lbGVtZW50KCBpICk7XHJcblx0XHRcdFx0XHRwb3NpdGlvblZpZXcuZG90KCBwbGFuZS54eXogKS5ncmVhdGVyVGhhbiggcGxhbmUudyApLmRpc2NhcmQoKTtcclxuXHJcblx0XHRcdFx0fSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgbnVtSW50ZXJzZWN0aW9uUGxhbmVzID0gaW50ZXJzZWN0aW9uUGxhbmVzLmxlbmd0aDtcclxuXHJcblx0XHRcdGlmICggbnVtSW50ZXJzZWN0aW9uUGxhbmVzID4gMCApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgY2xpcHBpbmdQbGFuZXMgPSB1bmlmb3JtQXJyYXkoIGludGVyc2VjdGlvblBsYW5lcyApO1xyXG5cdFx0XHRcdGNvbnN0IGNsaXBwZWQgPSBib29sKCB0cnVlICkudG9WYXIoICdjbGlwcGVkJyApO1xyXG5cclxuXHRcdFx0XHRMb29wKCBudW1JbnRlcnNlY3Rpb25QbGFuZXMsICggeyBpIH0gKSA9PiB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgcGxhbmUgPSBjbGlwcGluZ1BsYW5lcy5lbGVtZW50KCBpICk7XHJcblx0XHRcdFx0XHRjbGlwcGVkLmFzc2lnbiggcG9zaXRpb25WaWV3LmRvdCggcGxhbmUueHl6ICkuZ3JlYXRlclRoYW4oIHBsYW5lLncgKS5hbmQoIGNsaXBwZWQgKSApO1xyXG5cclxuXHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRcdGNsaXBwZWQuZGlzY2FyZCgpO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gKSgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHVwcyBoYXJkd2FyZSBjbGlwcGluZy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8VmVjdG9yND59IHVuaW9uUGxhbmVzIC0gVGhlIHVuaW9uIHBsYW5lcy5cclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge05vZGV9IFRoZSByZXN1bHQgbm9kZS5cclxuXHQgKi9cclxuXHRzZXR1cEhhcmR3YXJlQ2xpcHBpbmcoIHVuaW9uUGxhbmVzLCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IG51bVVuaW9uUGxhbmVzID0gdW5pb25QbGFuZXMubGVuZ3RoO1xyXG5cclxuXHRcdGJ1aWxkZXIuZW5hYmxlSGFyZHdhcmVDbGlwcGluZyggbnVtVW5pb25QbGFuZXMgKTtcclxuXHJcblx0XHRyZXR1cm4gRm4oICgpID0+IHtcclxuXHJcblx0XHRcdGNvbnN0IGNsaXBwaW5nUGxhbmVzID0gdW5pZm9ybUFycmF5KCB1bmlvblBsYW5lcyApO1xyXG5cdFx0XHRjb25zdCBod19jbGlwX2Rpc3RhbmNlcyA9IGJ1aWx0aW4oIGJ1aWxkZXIuZ2V0Q2xpcERpc3RhbmNlKCkgKTtcclxuXHJcblx0XHRcdExvb3AoIG51bVVuaW9uUGxhbmVzLCAoIHsgaSB9ICkgPT4ge1xyXG5cclxuXHRcdFx0XHRjb25zdCBwbGFuZSA9IGNsaXBwaW5nUGxhbmVzLmVsZW1lbnQoIGkgKTtcclxuXHJcblx0XHRcdFx0Y29uc3QgZGlzdGFuY2UgPSBwb3NpdGlvblZpZXcuZG90KCBwbGFuZS54eXogKS5zdWIoIHBsYW5lLncgKS5uZWdhdGUoKTtcclxuXHRcdFx0XHRod19jbGlwX2Rpc3RhbmNlcy5lbGVtZW50KCBpICkuYXNzaWduKCBkaXN0YW5jZSApO1xyXG5cclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdH0gKSgpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5DbGlwcGluZ05vZGUuQUxQSEFfVE9fQ09WRVJBR0UgPSAnYWxwaGFUb0NvdmVyYWdlJztcclxuQ2xpcHBpbmdOb2RlLkRFRkFVTFQgPSAnZGVmYXVsdCc7XHJcbkNsaXBwaW5nTm9kZS5IQVJEV0FSRSA9ICdoYXJkd2FyZSc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBDbGlwcGluZ05vZGU7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBzZXR0aW5nIHVwIHRoZSBkZWZhdWx0IGNsaXBwaW5nIGxvZ2ljLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcmV0dXJucyB7Q2xpcHBpbmdOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGNsaXBwaW5nID0gKCkgPT4gbm9kZU9iamVjdCggbmV3IENsaXBwaW5nTm9kZSgpICk7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBzZXR0aW5nIHVwIGFscGhhIHRvIGNvdmVyYWdlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcmV0dXJucyB7Q2xpcHBpbmdOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGNsaXBwaW5nQWxwaGEgPSAoKSA9PiBub2RlT2JqZWN0KCBuZXcgQ2xpcHBpbmdOb2RlKCBDbGlwcGluZ05vZGUuQUxQSEFfVE9fQ09WRVJBR0UgKSApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3Igc2V0dGluZyB1cCBoYXJkd2FyZS1iYXNlZCBjbGlwcGluZy5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHJldHVybnMge0NsaXBwaW5nTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBoYXJkd2FyZUNsaXBwaW5nID0gKCkgPT4gbm9kZU9iamVjdCggbmV3IENsaXBwaW5nTm9kZSggQ2xpcHBpbmdOb2RlLkhBUkRXQVJFICkgKTtcclxuIiwiaW1wb3J0IHsgYWJzLCBhZGQsIGNlaWwsIGNsYW1wLCBkRmR4LCBkRmR5LCBleHAyLCBmbG9hdCwgZmxvb3IsIEZuLCBmcmFjdCwgbGVuZ3RoLCBsb2cyLCBtYXgsIG1pbiwgbXVsLCBzaW4sIHN1YiwgdmVjMiwgdmVjMyB9IGZyb20gJy4uLy4uL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbi8vIFNlZTogaHR0cHM6Ly9jYXN1YWwtZWZmZWN0cy5jb20vcmVzZWFyY2gvV3ltYW4yMDE3SGFzaGVkL2luZGV4Lmh0bWxcclxuXHJcbmNvbnN0IEFMUEhBX0hBU0hfU0NBTEUgPSAwLjA1OyAvLyBEZXJpdmVkIGZyb20gdHJpYWxzIG9ubHksIGFuZCBtYXkgYmUgY2hhbmdlZC5cclxuXHJcbmNvbnN0IGhhc2gyRCA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyB2YWx1ZSBdICkgPT4ge1xyXG5cclxuXHRyZXR1cm4gZnJhY3QoIG11bCggMS4wZTQsIHNpbiggbXVsKCAxNy4wLCB2YWx1ZS54ICkuYWRkKCBtdWwoIDAuMSwgdmFsdWUueSApICkgKSApLm11bCggYWRkKCAwLjEsIGFicyggc2luKCBtdWwoIDEzLjAsIHZhbHVlLnkgKS5hZGQoIHZhbHVlLnggKSApICkgKSApICk7XHJcblxyXG59ICk7XHJcblxyXG5jb25zdCBoYXNoM0QgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgdmFsdWUgXSApID0+IHtcclxuXHJcblx0cmV0dXJuIGhhc2gyRCggdmVjMiggaGFzaDJEKCB2YWx1ZS54eSApLCB2YWx1ZS56ICkgKTtcclxuXHJcbn0gKTtcclxuXHJcbmNvbnN0IGdldEFscGhhSGFzaFRocmVzaG9sZCA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyBwb3NpdGlvbiBdICkgPT4ge1xyXG5cclxuXHQvLyBGaW5kIHRoZSBkaXNjcmV0aXplZCBkZXJpdmF0aXZlcyBvZiBvdXIgY29vcmRpbmF0ZXNcclxuXHRjb25zdCBtYXhEZXJpdiA9IG1heChcclxuXHRcdGxlbmd0aCggZEZkeCggcG9zaXRpb24ueHl6ICkgKSxcclxuXHRcdGxlbmd0aCggZEZkeSggcG9zaXRpb24ueHl6ICkgKVxyXG5cdCk7XHJcblxyXG5cdGNvbnN0IHBpeFNjYWxlID0gZmxvYXQoIDEgKS5kaXYoIGZsb2F0KCBBTFBIQV9IQVNIX1NDQUxFICkubXVsKCBtYXhEZXJpdiApICkudG9WYXIoICdwaXhTY2FsZScgKTtcclxuXHJcblx0Ly8gRmluZCB0d28gbmVhcmVzdCBsb2ctZGlzY3JldGl6ZWQgbm9pc2Ugc2NhbGVzXHJcblx0Y29uc3QgcGl4U2NhbGVzID0gdmVjMihcclxuXHRcdGV4cDIoIGZsb29yKCBsb2cyKCBwaXhTY2FsZSApICkgKSxcclxuXHRcdGV4cDIoIGNlaWwoIGxvZzIoIHBpeFNjYWxlICkgKSApXHJcblx0KTtcclxuXHJcblx0Ly8gQ29tcHV0ZSBhbHBoYSB0aHJlc2hvbGRzIGF0IG91ciB0d28gbm9pc2Ugc2NhbGVzXHJcblx0Y29uc3QgYWxwaGEgPSB2ZWMyKFxyXG5cdFx0aGFzaDNEKCBmbG9vciggcGl4U2NhbGVzLngubXVsKCBwb3NpdGlvbi54eXogKSApICksXHJcblx0XHRoYXNoM0QoIGZsb29yKCBwaXhTY2FsZXMueS5tdWwoIHBvc2l0aW9uLnh5eiApICkgKSxcclxuXHQpO1xyXG5cclxuXHQvLyBGYWN0b3IgdG8gaW50ZXJwb2xhdGUgbGVycCB3aXRoXHJcblx0Y29uc3QgbGVycEZhY3RvciA9IGZyYWN0KCBsb2cyKCBwaXhTY2FsZSApICk7XHJcblxyXG5cdC8vIEludGVycG9sYXRlIGFscGhhIHRocmVzaG9sZCBmcm9tIG5vaXNlIGF0IHR3byBzY2FsZXNcclxuXHRjb25zdCB4ID0gYWRkKCBtdWwoIGxlcnBGYWN0b3Iub25lTWludXMoKSwgYWxwaGEueCApLCBtdWwoIGxlcnBGYWN0b3IsIGFscGhhLnkgKSApO1xyXG5cclxuXHQvLyBQYXNzIGludG8gQ0RGIHRvIGNvbXB1dGUgdW5pZm9ybWx5IGRpc3RyaWIgdGhyZXNob2xkXHJcblx0Y29uc3QgYSA9IG1pbiggbGVycEZhY3RvciwgbGVycEZhY3Rvci5vbmVNaW51cygpICk7XHJcblx0Y29uc3QgY2FzZXMgPSB2ZWMzKFxyXG5cdFx0eC5tdWwoIHggKS5kaXYoIG11bCggMi4wLCBhICkubXVsKCBzdWIoIDEuMCwgYSApICkgKSxcclxuXHRcdHguc3ViKCBtdWwoIDAuNSwgYSApICkuZGl2KCBzdWIoIDEuMCwgYSApICksXHJcblx0XHRzdWIoIDEuMCwgc3ViKCAxLjAsIHggKS5tdWwoIHN1YiggMS4wLCB4ICkgKS5kaXYoIG11bCggMi4wLCBhICkubXVsKCBzdWIoIDEuMCwgYSApICkgKSApICk7XHJcblxyXG5cdC8vIEZpbmQgb3VyIGZpbmFsLCB1bmlmb3JtbHkgZGlzdHJpYnV0ZWQgYWxwaGEgdGhyZXNob2xkICjOsc+EKVxyXG5cdGNvbnN0IHRocmVzaG9sZCA9IHgubGVzc1RoYW4oIGEub25lTWludXMoKSApLnNlbGVjdCggeC5sZXNzVGhhbiggYSApLnNlbGVjdCggY2FzZXMueCwgY2FzZXMueSApLCBjYXNlcy56ICk7XHJcblxyXG5cdC8vIEF2b2lkcyDOsc+EID09IDAuIENvdWxkIGFsc28gZG8gzrHPhCA9MS3Osc+EXHJcblx0cmV0dXJuIGNsYW1wKCB0aHJlc2hvbGQsIDEuMGUtNiwgMS4wICk7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ2dldEFscGhhSGFzaFRocmVzaG9sZCcsXHJcblx0dHlwZTogJ2Zsb2F0JyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ3Bvc2l0aW9uJywgdHlwZTogJ3ZlYzMnIH1cclxuXHRdXHJcbn0gKTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGdldEFscGhhSGFzaFRocmVzaG9sZDtcclxuIiwiaW1wb3J0IHsgTWF0ZXJpYWwgfSBmcm9tICcuLi9NYXRlcmlhbC5qcyc7XHJcbmltcG9ydCB7IE5vcm1hbEJsZW5kaW5nIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzLmpzJztcclxuXHJcbmltcG9ydCB7IGdldE5vZGVDaGlsZHJlbiwgZ2V0Q2FjaGVLZXkgfSBmcm9tICcuLi8uLi9ub2Rlcy9jb3JlL05vZGVVdGlscy5qcyc7XHJcbmltcG9ydCB7IGF0dHJpYnV0ZSB9IGZyb20gJy4uLy4uL25vZGVzL2NvcmUvQXR0cmlidXRlTm9kZS5qcyc7XHJcbmltcG9ydCB7IG91dHB1dCwgZGlmZnVzZUNvbG9yLCBlbWlzc2l2ZSwgdmFyeWluZ1Byb3BlcnR5IH0gZnJvbSAnLi4vLi4vbm9kZXMvY29yZS9Qcm9wZXJ0eU5vZGUuanMnO1xyXG5pbXBvcnQgeyBtYXRlcmlhbEFscGhhVGVzdCwgbWF0ZXJpYWxDb2xvciwgbWF0ZXJpYWxPcGFjaXR5LCBtYXRlcmlhbEVtaXNzaXZlLCBtYXRlcmlhbE5vcm1hbCwgbWF0ZXJpYWxMaWdodE1hcCwgbWF0ZXJpYWxBTyB9IGZyb20gJy4uLy4uL25vZGVzL2FjY2Vzc29ycy9NYXRlcmlhbE5vZGUuanMnO1xyXG5pbXBvcnQgeyBtb2RlbFZpZXdQcm9qZWN0aW9uIH0gZnJvbSAnLi4vLi4vbm9kZXMvYWNjZXNzb3JzL01vZGVsVmlld1Byb2plY3Rpb25Ob2RlLmpzJztcclxuaW1wb3J0IHsgbm9ybWFsTG9jYWwgfSBmcm9tICcuLi8uLi9ub2Rlcy9hY2Nlc3NvcnMvTm9ybWFsLmpzJztcclxuaW1wb3J0IHsgaW5zdGFuY2VkTWVzaCB9IGZyb20gJy4uLy4uL25vZGVzL2FjY2Vzc29ycy9JbnN0YW5jZWRNZXNoTm9kZS5qcyc7XHJcbmltcG9ydCB7IGJhdGNoIH0gZnJvbSAnLi4vLi4vbm9kZXMvYWNjZXNzb3JzL0JhdGNoTm9kZS5qcyc7XHJcbmltcG9ydCB7IG1hdGVyaWFsUmVmZXJlbmNlIH0gZnJvbSAnLi4vLi4vbm9kZXMvYWNjZXNzb3JzL01hdGVyaWFsUmVmZXJlbmNlTm9kZS5qcyc7XHJcbmltcG9ydCB7IHBvc2l0aW9uTG9jYWwsIHBvc2l0aW9uVmlldyB9IGZyb20gJy4uLy4uL25vZGVzL2FjY2Vzc29ycy9Qb3NpdGlvbi5qcyc7XHJcbmltcG9ydCB7IHNraW5uaW5nIH0gZnJvbSAnLi4vLi4vbm9kZXMvYWNjZXNzb3JzL1NraW5uaW5nTm9kZS5qcyc7XHJcbmltcG9ydCB7IG1vcnBoUmVmZXJlbmNlIH0gZnJvbSAnLi4vLi4vbm9kZXMvYWNjZXNzb3JzL01vcnBoTm9kZS5qcyc7XHJcbmltcG9ydCB7IG1peCB9IGZyb20gJy4uLy4uL25vZGVzL21hdGgvTWF0aE5vZGUuanMnO1xyXG5pbXBvcnQgeyBmbG9hdCwgdmVjMywgdmVjNCB9IGZyb20gJy4uLy4uL25vZGVzL3RzbC9UU0xCYXNlLmpzJztcclxuaW1wb3J0IEFPTm9kZSBmcm9tICcuLi8uLi9ub2Rlcy9saWdodGluZy9BT05vZGUuanMnO1xyXG5pbXBvcnQgeyBsaWdodGluZ0NvbnRleHQgfSBmcm9tICcuLi8uLi9ub2Rlcy9saWdodGluZy9MaWdodGluZ0NvbnRleHROb2RlLmpzJztcclxuaW1wb3J0IElycmFkaWFuY2VOb2RlIGZyb20gJy4uLy4uL25vZGVzL2xpZ2h0aW5nL0lycmFkaWFuY2VOb2RlLmpzJztcclxuaW1wb3J0IHsgZGVwdGgsIHZpZXdaVG9Mb2dhcml0aG1pY0RlcHRoLCB2aWV3WlRvT3J0aG9ncmFwaGljRGVwdGggfSBmcm9tICcuLi8uLi9ub2Rlcy9kaXNwbGF5L1ZpZXdwb3J0RGVwdGhOb2RlLmpzJztcclxuaW1wb3J0IHsgY2FtZXJhRmFyLCBjYW1lcmFOZWFyLCBjYW1lcmFQcm9qZWN0aW9uTWF0cml4IH0gZnJvbSAnLi4vLi4vbm9kZXMvYWNjZXNzb3JzL0NhbWVyYS5qcyc7XHJcbmltcG9ydCB7IGNsaXBwaW5nLCBjbGlwcGluZ0FscGhhLCBoYXJkd2FyZUNsaXBwaW5nIH0gZnJvbSAnLi4vLi4vbm9kZXMvYWNjZXNzb3JzL0NsaXBwaW5nTm9kZS5qcyc7XHJcbmltcG9ydCBOb2RlTWF0ZXJpYWxPYnNlcnZlciBmcm9tICcuL21hbmFnZXIvTm9kZU1hdGVyaWFsT2JzZXJ2ZXIuanMnO1xyXG5pbXBvcnQgZ2V0QWxwaGFIYXNoVGhyZXNob2xkIGZyb20gJy4uLy4uL25vZGVzL2Z1bmN0aW9ucy9tYXRlcmlhbC9nZXRBbHBoYUhhc2hUaHJlc2hvbGQuanMnO1xyXG5pbXBvcnQgeyBtb2RlbFZpZXdNYXRyaXggfSBmcm9tICcuLi8uLi9ub2Rlcy9hY2Nlc3NvcnMvTW9kZWxOb2RlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBCYXNlIGNsYXNzIGZvciBhbGwgbm9kZSBtYXRlcmlhbHMuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBNYXRlcmlhbFxyXG4gKi9cclxuY2xhc3MgTm9kZU1hdGVyaWFsIGV4dGVuZHMgTWF0ZXJpYWwge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdOb2RlTWF0ZXJpYWwnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlcHJlc2VudHMgdGhlIHR5cGUgb2YgdGhlIG5vZGUgbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdCAqL1xyXG5cdGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLnR5cGU7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0IHR5cGUoIF92YWx1ZSApIHsgLyogKi8gfVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG5vZGUgbWF0ZXJpYWwuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNOb2RlTWF0ZXJpYWwgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGlzIG1hdGVyaWFsIGlzIGFmZmVjdGVkIGJ5IGZvZyBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZm9nID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhpcyBtYXRlcmlhbCBpcyBhZmZlY3RlZCBieSBsaWdodHMgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5saWdodHMgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhpcyBtYXRlcmlhbCB1c2VzIGhhcmR3YXJlIGNsaXBwaW5nIG9yIG5vdC5cclxuXHRcdCAqIFRoaXMgcHJvcGVydHkgaXMgbWFuYWdlZCBieSB0aGUgZW5naW5lIGFuZCBzaG91bGQgbm90IGJlXHJcblx0XHQgKiBtb2RpZmllZCBieSBhcHBzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5oYXJkd2FyZUNsaXBwaW5nID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBOb2RlIG1hdGVyaWFscyB3aGljaCBzZXQgdGhlaXIgYGxpZ2h0c2AgcHJvcGVydHkgdG8gYHRydWVgXHJcblx0XHQgKiBhcmUgYWZmZWN0ZWQgYnkgYWxsIGxpZ2h0cyBvZiB0aGUgc2NlbmUuIFNvbWV0aW1lcyBzZWxlY3RpdmVcclxuXHRcdCAqIGxpZ2h0aW5nIGlzIHdhbnRlZCB3aGljaCBtZWFucyBvbmx5IF9zb21lXyBsaWdodHMgaW4gdGhlIHNjZW5lXHJcblx0XHQgKiBhZmZlY3QgYSBtYXRlcmlhbC4gVGhpcyBjYW4gYmUgYWNoaWV2ZWQgYnkgY3JlYXRpbmcgYW4gaW5zdGFuY2VcclxuXHRcdCAqIG9mIHtAbGluayBMaWdodHNOb2RlfSB3aXRoIGEgbGlzdCBvZiBzZWxlY3RpdmVcclxuXHRcdCAqIGxpZ2h0cyBhbmQgYXNzaWduIHRoZSBub2RlIHRvIHRoaXMgcHJvcGVydHkuXHJcblx0XHQgKlxyXG5cdFx0ICogYGBganNcclxuXHRcdCAqIGNvbnN0IGN1c3RvbUxpZ2h0c05vZGUgPSBsaWdodHMoIFsgbGlnaHQxLCBsaWdodDIgXSApO1xyXG5cdFx0ICogbWF0ZXJpYWwubGlnaHRzTm9kZSA9IGN1c3RvbUxpZ2h0c05vZGU7XHJcblx0XHQgKiBgYGBcclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P0xpZ2h0c05vZGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGlnaHRzTm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZW52aXJvbm1lbnQgb2Ygbm9kZSBtYXRlcmlhbHMgY2FuIGJlIGRlZmluZWQgYnkgYW4gZW52aXJvbm1lbnRcclxuXHRcdCAqIG1hcCBhc3NpZ25lZCB0byB0aGUgYGVudk1hcGAgcHJvcGVydHkgb3IgYnkgYFNjZW5lLmVudmlyb25tZW50YFxyXG5cdFx0ICogaWYgdGhlIG5vZGUgbWF0ZXJpYWwgaXMgYSBQQlIgbWF0ZXJpYWwuIFRoaXMgbm9kZSBwcm9wZXJ0eSBhbGxvd3MgdG8gb3ZlcndyaXRlXHJcblx0XHQgKiB0aGUgZGVmYXVsdCBiZWhhdmlvciBhbmQgZGVmaW5lIHRoZSBlbnZpcm9ubWVudCB3aXRoIGEgY3VzdG9tIG5vZGUuXHJcblx0XHQgKlxyXG5cdFx0ICogYGBganNcclxuXHRcdCAqIG1hdGVyaWFsLmVudk5vZGUgPSBwbXJlbVRleHR1cmUoIHJlbmRlclRhcmdldC50ZXh0dXJlICk7XHJcblx0XHQgKiBgYGBcclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGU8dmVjMz59XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZW52Tm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbGlnaHRpbmcgb2Ygbm9kZSBtYXRlcmlhbHMgbWlnaHQgYmUgaW5mbHVlbmNlZCBieSBhbWJpZW50IG9jY2x1c2lvbi5cclxuXHRcdCAqIFRoZSBkZWZhdWx0IEFPIGlzIGluZmVycmVkIGZyb20gYW4gYW1iaWVudCBvY2NsdXNpb24gbWFwIGFzc2lnbmVkIHRvIGBhb01hcGBcclxuXHRcdCAqIGFuZCB0aGUgcmVzcGVjdGl2ZSBgYW9NYXBJbnRlbnNpdHlgLiBUaGlzIG5vZGUgcHJvcGVydHkgYWxsb3dzIHRvIG92ZXJ3cml0ZVxyXG5cdFx0ICogdGhlIGRlZmF1bHQgYW5kIGRlZmluZSB0aGUgYW1iaWVudCBvY2NsdXNpb24gd2l0aCBhIGN1c3RvbSBub2RlIGluc3RlYWQuXHJcblx0XHQgKlxyXG5cdFx0ICogSWYgeW91IGRvbid0IHdhbnQgdG8gb3ZlcndyaXRlIHRoZSBkaWZmdXNlIGNvbG9yIGJ1dCBtb2RpZnkgdGhlIGV4aXN0aW5nXHJcblx0XHQgKiB2YWx1ZXMgaW5zdGVhZCwgdXNlIHtAbGluayBtYXRlcmlhbEFPfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGU8ZmxvYXQ+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFvTm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZGlmZnVzZSBjb2xvciBvZiBub2RlIG1hdGVyaWFscyBpcyBieSBkZWZhdWx0IGluZmVycmVkIGZyb20gdGhlXHJcblx0XHQgKiBgY29sb3JgIGFuZCBgbWFwYCBwcm9wZXJ0aWVzLiBUaGlzIG5vZGUgcHJvcGVydHkgYWxsb3dzIHRvIG92ZXJ3cml0ZSB0aGUgZGVmYXVsdFxyXG5cdFx0ICogYW5kIGRlZmluZSB0aGUgZGlmZnVzZSBjb2xvciB3aXRoIGEgbm9kZSBpbnN0ZWFkLlxyXG5cdFx0ICpcclxuXHRcdCAqIGBgYGpzXHJcblx0XHQgKiBtYXRlcmlhbC5jb2xvck5vZGUgPSBjb2xvciggMHhmZjAwMDAgKTsgLy8gZGVmaW5lIHJlZCBjb2xvclxyXG5cdFx0ICogYGBgXHJcblx0XHQgKlxyXG5cdFx0ICogSWYgeW91IGRvbid0IHdhbnQgdG8gb3ZlcndyaXRlIHRoZSBkaWZmdXNlIGNvbG9yIGJ1dCBtb2RpZnkgdGhlIGV4aXN0aW5nXHJcblx0XHQgKiB2YWx1ZXMgaW5zdGVhZCwgdXNlIHtAbGluayBtYXRlcmlhbENvbG9yfS5cclxuXHRcdCAqXHJcblx0XHQgKiBgYGBqc1xyXG5cdFx0ICogbWF0ZXJpYWwuY29sb3JOb2RlID0gbWF0ZXJpYWxDb2xvci5tdWwoIGNvbG9yKCAweGZmMDAwMCApICk7IC8vIGdpdmUgZGlmZnVzZSBjb2xvcnMgYSByZWQgdGludFxyXG5cdFx0ICogYGBgXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPHZlYzM+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvbG9yTm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbm9ybWFscyBvZiBub2RlIG1hdGVyaWFscyBhcmUgYnkgZGVmYXVsdCBpbmZlcnJlZCBmcm9tIHRoZSBgbm9ybWFsTWFwYC9gbm9ybWFsU2NhbGVgXHJcblx0XHQgKiBvciBgYnVtcE1hcGAvYGJ1bXBTY2FsZWAgcHJvcGVydGllcy4gVGhpcyBub2RlIHByb3BlcnR5IGFsbG93cyB0byBvdmVyd3JpdGUgdGhlIGRlZmF1bHRcclxuXHRcdCAqIGFuZCBkZWZpbmUgdGhlIG5vcm1hbHMgd2l0aCBhIG5vZGUgaW5zdGVhZC5cclxuXHRcdCAqXHJcblx0XHQgKiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBvdmVyd3JpdGUgdGhlIG5vcm1hbHMgYnV0IG1vZGlmeSB0aGUgZXhpc3RpbmcgdmFsdWVzIGluc3RlYWQsXHJcblx0XHQgKiB1c2Uge0BsaW5rIG1hdGVyaWFsTm9ybWFsfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGU8dmVjMz59XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9ybWFsTm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgb3BhY2l0eSBvZiBub2RlIG1hdGVyaWFscyBpcyBieSBkZWZhdWx0IGluZmVycmVkIGZyb20gdGhlIGBvcGFjaXR5YFxyXG5cdFx0ICogYW5kIGBhbHBoYU1hcGAgcHJvcGVydGllcy4gVGhpcyBub2RlIHByb3BlcnR5IGFsbG93cyB0byBvdmVyd3JpdGUgdGhlIGRlZmF1bHRcclxuXHRcdCAqIGFuZCBkZWZpbmUgdGhlIG9wYWNpdHkgd2l0aCBhIG5vZGUgaW5zdGVhZC5cclxuXHRcdCAqXHJcblx0XHQgKiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBvdmVyd3JpdGUgdGhlIG5vcm1hbHMgYnV0IG1vZGlmeSB0aGUgZXhpc3RpbmdcclxuXHRcdCAqIHZhbHVlIGluc3RlYWQsIHVzZSB7QGxpbmsgbWF0ZXJpYWxPcGFjaXR5fS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGU8ZmxvYXQ+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm9wYWNpdHlOb2RlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgbm9kZSBjYW4gYmUgdXNlZCB0byB0byBpbXBsZW1lbnQgYSB2YXJpZXR5IG9mIGZpbHRlci1saWtlIGVmZmVjdHMuIFRoZSBpZGVhIGlzXHJcblx0XHQgKiB0byBzdG9yZSB0aGUgY3VycmVudCByZW5kZXJpbmcgaW50byBhIHRleHR1cmUgZS5nLiB2aWEgYHZpZXdwb3J0U2hhcmVkVGV4dHVyZSgpYCwgdXNlIGl0XHJcblx0XHQgKiB0byBjcmVhdGUgYW4gYXJiaXRyYXJ5IGVmZmVjdCBhbmQgdGhlbiBhc3NpZ24gdGhlIG5vZGUgY29tcG9zaXRpb24gdG8gdGhpcyBwcm9wZXJ0eS5cclxuXHRcdCAqIEV2ZXJ5dGhpbmcgYmVoaW5kIHRoZSBvYmplY3QgdXNpbmcgdGhpcyBtYXRlcmlhbCB3aWxsIG5vdyBiZSBhZmZlY3RlZCBieSBhIGZpbHRlci5cclxuXHRcdCAqXHJcblx0XHQgKiBgYGBqc1xyXG5cdFx0ICogY29uc3QgbWF0ZXJpYWwgPSBuZXcgTm9kZU1hdGVyaWFsKClcclxuXHRcdCAqIG1hdGVyaWFsLnRyYW5zcGFyZW50ID0gdHJ1ZTtcclxuXHRcdCAqXHJcblx0XHQgKiAvLyBldmVyeXRoaW5nIGJlaGluZCB0aGUgb2JqZWN0IHdpbGwgYmUgbW9ub2Nocm9tYXRpY1xyXG5cdFx0ICogbWF0ZXJpYWwuYmFja2Ryb3BOb2RlID0gc2F0dXJhdGlvbiggdmlld3BvcnRTaGFyZWRUZXh0dXJlKCkucmdiLCAwICk7XHJcblx0XHQgKiBgYGBcclxuXHRcdCAqXHJcblx0XHQgKiBCYWNrZHJvcCBjb21wdXRhdGlvbnMgYXJlIHBhcnQgb2YgdGhlIGxpZ2h0aW5nIHNvIG9ubHkgbGl0IG1hdGVyaWFscyBjYW4gdXNlIHRoaXMgcHJvcGVydHkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPHZlYzM+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJhY2tkcm9wTm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIG5vZGUgYWxsb3dzIHRvIG1vZHVsYXRlIHRoZSBpbmZsdWVuY2Ugb2YgYGJhY2tkcm9wTm9kZWAgdG8gdGhlIG91dGdvaW5nIGxpZ2h0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Tm9kZTxmbG9hdD59XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYmFja2Ryb3BBbHBoYU5vZGUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGFscGhhIHRlc3Qgb2Ygbm9kZSBtYXRlcmlhbHMgaXMgYnkgZGVmYXVsdCBpbmZlcnJlZCBmcm9tIHRoZSBgYWxwaGFUZXN0YFxyXG5cdFx0ICogcHJvcGVydHkuIFRoaXMgbm9kZSBwcm9wZXJ0eSBhbGxvd3MgdG8gb3ZlcndyaXRlIHRoZSBkZWZhdWx0IGFuZCBkZWZpbmUgdGhlXHJcblx0XHQgKiBhbHBoYSB0ZXN0IHdpdGggYSBub2RlIGluc3RlYWQuXHJcblx0XHQgKlxyXG5cdFx0ICogSWYgeW91IGRvbid0IHdhbnQgdG8gb3ZlcndyaXRlIHRoZSBhbHBoYSB0ZXN0IGJ1dCBtb2RpZnkgdGhlIGV4aXN0aW5nXHJcblx0XHQgKiB2YWx1ZSBpbnN0ZWFkLCB1c2Uge0BsaW5rIG1hdGVyaWFsQWxwaGFUZXN0fS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGU8ZmxvYXQ+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFscGhhVGVzdE5vZGUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGxvY2FsIHZlcnRleCBwb3NpdGlvbnMgYXJlIGNvbXB1dGVkIGJhc2VkIG9uIG11bHRpcGxlIGZhY3RvcnMgbGlrZSB0aGVcclxuXHRcdCAqIGF0dHJpYnV0ZSBkYXRhLCBtb3JwaGluZyBvciBza2lubmluZy4gVGhpcyBub2RlIHByb3BlcnR5IGFsbG93cyB0byBvdmVyd3JpdGVcclxuXHRcdCAqIHRoZSBkZWZhdWx0IGFuZCBkZWZpbmUgbG9jYWwgdmVydGV4IHBvc2l0aW9ucyB3aXRoIG5vZGVzIGluc3RlYWQuXHJcblx0XHQgKlxyXG5cdFx0ICogSWYgeW91IGRvbid0IHdhbnQgdG8gb3ZlcndyaXRlIHRoZSB2ZXJ0ZXggcG9zaXRpb25zIGJ1dCBtb2RpZnkgdGhlIGV4aXN0aW5nXHJcblx0XHQgKiB2YWx1ZXMgaW5zdGVhZCwgdXNlIHtAbGluayBwb3NpdGlvbkxvY2FsfS5cclxuXHRcdCAqXHJcblx0XHQgKmBgYGpzXHJcblx0XHQgKiBtYXRlcmlhbC5wb3NpdGlvbk5vZGUgPSBwb3NpdGlvbkxvY2FsLmFkZCggZGlzcGxhY2UgKTtcclxuXHRcdCAqIGBgYFxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Tm9kZTx2ZWMzPn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wb3NpdGlvbk5vZGUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBub2RlIHByb3BlcnR5IGlzIGludGVuZGVkIGZvciBsb2dpYyB3aGljaCBtb2RpZmllcyBnZW9tZXRyeSBkYXRhIG9uY2Ugb3IgcGVyIGFuaW1hdGlvbiBzdGVwLlxyXG5cdFx0ICogQXBwcyB1c3VhbGx5IHBsYWNlIHN1Y2ggbG9naWMgcmFuZG9tbHkgaW4gaW5pdGlhbGl6YXRpb24gcm91dGluZXMgb3IgaW4gdGhlIGFuaW1hdGlvbiBsb29wLlxyXG5cdFx0ICogYGdlb21ldHJ5Tm9kZWAgaXMgaW50ZW5kZWQgYXMgYSBkZWRpY2F0ZWQgQVBJIHNvIHRoZXJlIGlzIGFuIGludGVuZGVkIHNwb3Qgd2hlcmUgZ2VvbWV0cnkgbW9kaWZpY2F0aW9uc1xyXG5cdFx0ICogY2FuIGJlIGltcGxlbWVudGVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIFRoZSBpZGVhIGlzIHRvIGFzc2lnbiBhIGBGbmAgZGVmaW5pdGlvbiB0aGF0IGhvbGRzIHRoZSBnZW9tZXRyeSBtb2RpZmljYXRpb24gbG9naWMuIEEgdHlwaWNhbCBleGFtcGxlXHJcblx0XHQgKiB3b3VsZCBiZSBhIEdQVSBiYXNlZCBwYXJ0aWNsZSBzeXN0ZW0gdGhhdCBwcm92aWRlcyBhIG5vZGUgbWF0ZXJpYWwgZm9yIHVzYWdlIG9uIGFwcCBsZXZlbC4gVGhlIHBhcnRpY2xlXHJcblx0XHQgKiBzaW11bGF0aW9uIHdvdWxkIGJlIGltcGxlbWVudGVkIGFzIGNvbXB1dGUgc2hhZGVycyBhbmQgbWFuYWdlZCBpbnNpZGUgYSBgRm5gIGZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIGlzXHJcblx0XHQgKiBldmVudHVhbGx5IGFzc2lnbmVkIHRvIGBnZW9tZXRyeU5vZGVgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/RnVuY3Rpb259XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ2VvbWV0cnlOb2RlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFsbG93cyB0byBvdmVyd3JpdGUgZGVwdGggdmFsdWVzIGluIHRoZSBmcmFnbWVudCBzaGFkZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPGZsb2F0Pn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kZXB0aE5vZGUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQWxsb3dzIHRvIG92ZXJ3cml0ZSB0aGUgcG9zaXRpb24gdXNlZCBmb3Igc2hhZG93IG1hcCByZW5kZXJpbmcgd2hpY2hcclxuXHRcdCAqIGlzIGJ5IGRlZmF1bHQge0BsaW5rIHBvc2l0aW9uV29ybGR9LCB0aGUgdmVydGV4IHBvc2l0aW9uXHJcblx0XHQgKiBpbiB3b3JsZCBzcGFjZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGU8ZmxvYXQ+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNoYWRvd1Bvc2l0aW9uTm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIG5vZGUgY2FuIGJlIHVzZWQgdG8gaW5mbHVlbmNlIGhvdyBhbiBvYmplY3QgdXNpbmcgdGhpcyBub2RlIG1hdGVyaWFsXHJcblx0XHQgKiByZWNlaXZlIHNoYWRvd3MuXHJcblx0XHQgKlxyXG5cdFx0ICogYGBganNcclxuXHRcdCAqIGNvbnN0IHRvdGFsU2hhZG93cyA9IGZsb2F0KCAxICkudG9WYXIoKTtcclxuXHRcdCAqIG1hdGVyaWFsLnJlY2VpdmVkU2hhZG93Tm9kZSA9IEZuKCAoIFsgc2hhZG93IF0gKSA9PiB7XHJcblx0XHQgKiBcdHRvdGFsU2hhZG93cy5tdWxBc3NpZ24oIHNoYWRvdyApO1xyXG5cdFx0ICogXHQvL3JldHVybiBmbG9hdCggMSApOyAvLyBieXBhc3MgcmVjZWl2ZWQgc2hhZG93c1xyXG5cdFx0ICogXHRyZXR1cm4gc2hhZG93Lm1peCggY29sb3IoIDB4ZmYwMDAwICksIDEgKTsgLy8gbW9kaWZ5IHNoYWRvdyBjb2xvclxyXG5cdFx0ICogfSApO1xyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/KEZ1bmN0aW9ufEZ1bmN0aW9uTm9kZTx2ZWM0Pil9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVjZWl2ZWRTaGFkb3dOb2RlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgbm9kZSBjYW4gYmUgdXNlZCB0byBpbmZsdWVuY2UgaG93IGFuIG9iamVjdCB1c2luZyB0aGlzIG5vZGUgbWF0ZXJpYWxcclxuXHRcdCAqIGNhc3RzIHNoYWRvd3MuIFRvIGFwcGx5IGEgY29sb3IgdG8gc2hhZG93cywgeW91IGNhbiBzaW1wbHkgZG86XHJcblx0XHQgKlxyXG5cdFx0ICogYGBganNcclxuXHRcdCAqIG1hdGVyaWFsLmNhc3RTaGFkb3dOb2RlID0gdmVjNCggMSwgMCwgMCwgMSApO1xyXG5cdFx0ICogYGBgXHJcblx0XHQgKlxyXG5cdFx0ICogV2hpY2ggY2FuIGJlIG5pY2UgdG8gZmFrZSBjb2xvcmVkIHNoYWRvd3Mgb2Ygc2VtaS10cmFuc3BhcmVudCBvYmplY3RzLiBJdFxyXG5cdFx0ICogaXMgYWxzbyBjb21tb24gdG8gdXNlIHRoZSBwcm9wZXJ0eSB3aXRoIGBGbmAgZnVuY3Rpb24gc28gY2hlY2tzIGFyZSBwZXJmb3JtZWRcclxuXHRcdCAqIHBlciBmcmFnbWVudC5cclxuXHRcdCAqXHJcblx0XHQgKiBgYGBqc1xyXG5cdFx0ICogbWF0ZXJpYWxDdXN0b21TaGFkb3cuY2FzdFNoYWRvd05vZGUgPSBGbiggKCkgPT4ge1xyXG5cdFx0ICogXHRoYXNoKCB2ZXJ0ZXhJbmRleCApLmdyZWF0ZXJUaGFuKCAwLjUgKS5kaXNjYXJkKCk7XHJcblx0XHQgKiBcdHJldHVybiBtYXRlcmlhbENvbG9yO1xyXG5cdFx0ICogfSApKCk7XHJcblx0XHQgKiAgYGBgXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPHZlYzQ+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNhc3RTaGFkb3dOb2RlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgbm9kZSBjYW4gYmUgdXNlZCB0byBkZWZpbmUgdGhlIGZpbmFsIG91dHB1dCBvZiB0aGUgbWF0ZXJpYWwuXHJcblx0XHQgKlxyXG5cdFx0ICogVE9ETzogRXhwbGFpbiB0aGUgZGlmZmVyZW5jZXMgdG8gYGZyYWdtZW50Tm9kZWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPHZlYzQ+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm91dHB1dE5vZGUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogTVJUIGNvbmZpZ3VyYXRpb24gaXMgZG9uZSBvbiByZW5kZXJlciBvciBwYXNzIGxldmVsLiBUaGlzIG5vZGUgYWxsb3dzIHRvXHJcblx0XHQgKiBvdmVyd3JpdGUgd2hhdCB2YWx1ZXMgYXJlIHdyaXR0ZW4gaW50byBNUlQgdGFyZ2V0cyBvbiBtYXRlcmlhbCBsZXZlbC4gVGhpc1xyXG5cdFx0ICogY2FuIGJlIHVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nIHNlbGVjdGl2ZSBGWCBmZWF0dXJlcyB0aGF0IHNob3VsZCBvbmx5IGFmZmVjdFxyXG5cdFx0ICogc3BlY2lmaWMgb2JqZWN0cy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P01SVE5vZGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubXJ0Tm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIG5vZGUgcHJvcGVydHkgY2FuIGJlIHVzZWQgaWYgeW91IG5lZWQgY29tcGxldGUgZnJlZWRvbSBpbiBpbXBsZW1lbnRpbmdcclxuXHRcdCAqIHRoZSBmcmFnbWVudCBzaGFkZXIuIEFzc2lnbmluZyBhIG5vZGUgd2lsbCByZXBsYWNlIHRoZSBidWlsdC1pbiBtYXRlcmlhbFxyXG5cdFx0ICogbG9naWMgdXNlZCBpbiB0aGUgZnJhZ21lbnQgc3RhZ2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPHZlYzQ+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZyYWdtZW50Tm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIG5vZGUgcHJvcGVydHkgY2FuIGJlIHVzZWQgaWYgeW91IG5lZWQgY29tcGxldGUgZnJlZWRvbSBpbiBpbXBsZW1lbnRpbmdcclxuXHRcdCAqIHRoZSB2ZXJ0ZXggc2hhZGVyLiBBc3NpZ25pbmcgYSBub2RlIHdpbGwgcmVwbGFjZSB0aGUgYnVpbHQtaW4gbWF0ZXJpYWwgbG9naWNcclxuXHRcdCAqIHVzZWQgaW4gdGhlIHZlcnRleCBzdGFnZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGU8dmVjND59XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudmVydGV4Tm9kZSA9IG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWxsb3dzIHRvIGRlZmluZSBhIGN1c3RvbSBjYWNoZSBrZXkgdGhhdCBpbmZsdWVuY2UgdGhlIG1hdGVyaWFsIGtleSBjb21wdXRhdGlvblxyXG5cdCAqIGZvciByZW5kZXIgb2JqZWN0cy5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGN1c3RvbSBjYWNoZSBrZXkuXHJcblx0ICovXHJcblx0Y3VzdG9tUHJvZ3JhbUNhY2hlS2V5KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnR5cGUgKyBnZXRDYWNoZUtleSggdGhpcyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEJ1aWxkcyB0aGlzIG1hdGVyaWFsIHdpdGggdGhlIGdpdmVuIG5vZGUgYnVpbGRlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICovXHJcblx0YnVpbGQoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0dGhpcy5zZXR1cCggYnVpbGRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHVwcyBhIG5vZGUgbWF0ZXJpYWwgb2JzZXJ2ZXIgd2l0aCB0aGUgZ2l2ZW4gYnVpbGRlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7Tm9kZU1hdGVyaWFsT2JzZXJ2ZXJ9IFRoZSBub2RlIG1hdGVyaWFsIG9ic2VydmVyLlxyXG5cdCAqL1xyXG5cdHNldHVwT2JzZXJ2ZXIoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBOb2RlTWF0ZXJpYWxPYnNlcnZlciggYnVpbGRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHVwcyB0aGUgdmVydGV4IGFuZCBmcmFnbWVudCBzdGFnZSBvZiB0aGlzIG5vZGUgbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqL1xyXG5cdHNldHVwKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGJ1aWxkZXIuY29udGV4dC5zZXR1cE5vcm1hbCA9ICgpID0+IHRoaXMuc2V0dXBOb3JtYWwoIGJ1aWxkZXIgKTtcclxuXHRcdGJ1aWxkZXIuY29udGV4dC5zZXR1cFBvc2l0aW9uVmlldyA9ICgpID0+IHRoaXMuc2V0dXBQb3NpdGlvblZpZXcoIGJ1aWxkZXIgKTtcclxuXHRcdGJ1aWxkZXIuY29udGV4dC5zZXR1cE1vZGVsVmlld1Byb2plY3Rpb24gPSAoKSA9PiB0aGlzLnNldHVwTW9kZWxWaWV3UHJvamVjdGlvbiggYnVpbGRlciApO1xyXG5cclxuXHRcdGNvbnN0IHJlbmRlcmVyID0gYnVpbGRlci5yZW5kZXJlcjtcclxuXHRcdGNvbnN0IHJlbmRlclRhcmdldCA9IHJlbmRlcmVyLmdldFJlbmRlclRhcmdldCgpO1xyXG5cclxuXHRcdC8vIDwgVkVSVEVYIFNUQUdFID5cclxuXHJcblx0XHRidWlsZGVyLmFkZFN0YWNrKCk7XHJcblxyXG5cdFx0Y29uc3QgdmVydGV4Tm9kZSA9IHRoaXMudmVydGV4Tm9kZSB8fCB0aGlzLnNldHVwVmVydGV4KCBidWlsZGVyICk7XHJcblxyXG5cdFx0YnVpbGRlci5zdGFjay5vdXRwdXROb2RlID0gdmVydGV4Tm9kZTtcclxuXHJcblx0XHR0aGlzLnNldHVwSGFyZHdhcmVDbGlwcGluZyggYnVpbGRlciApO1xyXG5cclxuXHRcdGlmICggdGhpcy5nZW9tZXRyeU5vZGUgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRidWlsZGVyLnN0YWNrLm91dHB1dE5vZGUgPSBidWlsZGVyLnN0YWNrLm91dHB1dE5vZGUuYnlwYXNzKCB0aGlzLmdlb21ldHJ5Tm9kZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRidWlsZGVyLmFkZEZsb3coICd2ZXJ0ZXgnLCBidWlsZGVyLnJlbW92ZVN0YWNrKCkgKTtcclxuXHJcblx0XHQvLyA8IEZSQUdNRU5UIFNUQUdFID5cclxuXHJcblx0XHRidWlsZGVyLmFkZFN0YWNrKCk7XHJcblxyXG5cdFx0bGV0IHJlc3VsdE5vZGU7XHJcblxyXG5cdFx0Y29uc3QgY2xpcHBpbmdOb2RlID0gdGhpcy5zZXR1cENsaXBwaW5nKCBidWlsZGVyICk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmRlcHRoV3JpdGUgPT09IHRydWUgfHwgdGhpcy5kZXB0aFRlc3QgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHQvLyBvbmx5IHdyaXRlIGRlcHRoIGlmIGRlcHRoIGJ1ZmZlciBpcyBjb25maWd1cmVkXHJcblxyXG5cdFx0XHRpZiAoIHJlbmRlclRhcmdldCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0aWYgKCByZW5kZXJUYXJnZXQuZGVwdGhCdWZmZXIgPT09IHRydWUgKSB0aGlzLnNldHVwRGVwdGgoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGlmICggcmVuZGVyZXIuZGVwdGggPT09IHRydWUgKSB0aGlzLnNldHVwRGVwdGgoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aGlzLmZyYWdtZW50Tm9kZSA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuc2V0dXBEaWZmdXNlQ29sb3IoIGJ1aWxkZXIgKTtcclxuXHRcdFx0dGhpcy5zZXR1cFZhcmlhbnRzKCBidWlsZGVyICk7XHJcblxyXG5cdFx0XHRjb25zdCBvdXRnb2luZ0xpZ2h0Tm9kZSA9IHRoaXMuc2V0dXBMaWdodGluZyggYnVpbGRlciApO1xyXG5cclxuXHRcdFx0aWYgKCBjbGlwcGluZ05vZGUgIT09IG51bGwgKSBidWlsZGVyLnN0YWNrLmFkZCggY2xpcHBpbmdOb2RlICk7XHJcblxyXG5cdFx0XHQvLyBmb3JjZSB1bnNpZ25lZCBmbG9hdHMgLSB1c2VmdWwgZm9yIFJlbmRlclRhcmdldHNcclxuXHJcblx0XHRcdGNvbnN0IGJhc2ljT3V0cHV0ID0gdmVjNCggb3V0Z29pbmdMaWdodE5vZGUsIGRpZmZ1c2VDb2xvci5hICkubWF4KCAwICk7XHJcblxyXG5cdFx0XHRyZXN1bHROb2RlID0gdGhpcy5zZXR1cE91dHB1dCggYnVpbGRlciwgYmFzaWNPdXRwdXQgKTtcclxuXHJcblx0XHRcdC8vIE9VVFBVVCBOT0RFXHJcblxyXG5cdFx0XHRvdXRwdXQuYXNzaWduKCByZXN1bHROb2RlICk7XHJcblxyXG5cdFx0XHQvL1xyXG5cclxuXHRcdFx0Y29uc3QgaXNDdXN0b21PdXRwdXQgPSB0aGlzLm91dHB1dE5vZGUgIT09IG51bGw7XHJcblxyXG5cdFx0XHRpZiAoIGlzQ3VzdG9tT3V0cHV0ICkgcmVzdWx0Tm9kZSA9IHRoaXMub3V0cHV0Tm9kZTtcclxuXHJcblx0XHRcdC8vIE1SVFxyXG5cclxuXHRcdFx0aWYgKCByZW5kZXJUYXJnZXQgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IG1ydCA9IHJlbmRlcmVyLmdldE1SVCgpO1xyXG5cdFx0XHRcdGNvbnN0IG1hdGVyaWFsTVJUID0gdGhpcy5tcnROb2RlO1xyXG5cclxuXHRcdFx0XHRpZiAoIG1ydCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGlzQ3VzdG9tT3V0cHV0ICkgb3V0cHV0LmFzc2lnbiggcmVzdWx0Tm9kZSApO1xyXG5cclxuXHRcdFx0XHRcdHJlc3VsdE5vZGUgPSBtcnQ7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBtYXRlcmlhbE1SVCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHRcdHJlc3VsdE5vZGUgPSBtcnQubWVyZ2UoIG1hdGVyaWFsTVJUICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbE1SVCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHRyZXN1bHROb2RlID0gbWF0ZXJpYWxNUlQ7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0bGV0IGZyYWdtZW50Tm9kZSA9IHRoaXMuZnJhZ21lbnROb2RlO1xyXG5cclxuXHRcdFx0aWYgKCBmcmFnbWVudE5vZGUuaXNPdXRwdXRTdHJ1Y3ROb2RlICE9PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRmcmFnbWVudE5vZGUgPSB2ZWM0KCBmcmFnbWVudE5vZGUgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJlc3VsdE5vZGUgPSB0aGlzLnNldHVwT3V0cHV0KCBidWlsZGVyLCBmcmFnbWVudE5vZGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0YnVpbGRlci5zdGFjay5vdXRwdXROb2RlID0gcmVzdWx0Tm9kZTtcclxuXHJcblx0XHRidWlsZGVyLmFkZEZsb3coICdmcmFnbWVudCcsIGJ1aWxkZXIucmVtb3ZlU3RhY2soKSApO1xyXG5cclxuXHRcdC8vIDwgT0JTRVJWRVIgPlxyXG5cclxuXHRcdGJ1aWxkZXIub2JzZXJ2ZXIgPSB0aGlzLnNldHVwT2JzZXJ2ZXIoIGJ1aWxkZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXR1cHMgdGhlIGNsaXBwaW5nIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge0NsaXBwaW5nTm9kZX0gVGhlIGNsaXBwaW5nIG5vZGUuXHJcblx0ICovXHJcblx0c2V0dXBDbGlwcGluZyggYnVpbGRlciApIHtcclxuXHJcblx0XHRpZiAoIGJ1aWxkZXIuY2xpcHBpbmdDb250ZXh0ID09PSBudWxsICkgcmV0dXJuIG51bGw7XHJcblxyXG5cdFx0Y29uc3QgeyB1bmlvblBsYW5lcywgaW50ZXJzZWN0aW9uUGxhbmVzIH0gPSBidWlsZGVyLmNsaXBwaW5nQ29udGV4dDtcclxuXHJcblx0XHRsZXQgcmVzdWx0ID0gbnVsbDtcclxuXHJcblx0XHRpZiAoIHVuaW9uUGxhbmVzLmxlbmd0aCA+IDAgfHwgaW50ZXJzZWN0aW9uUGxhbmVzLmxlbmd0aCA+IDAgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBzYW1wbGVzID0gYnVpbGRlci5yZW5kZXJlci5zYW1wbGVzO1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLmFscGhhVG9Db3ZlcmFnZSAmJiBzYW1wbGVzID4gMSApIHtcclxuXHJcblx0XHRcdFx0Ly8gdG8gYmUgYWRkZWQgdG8gZmxvdyB3aGVuIHRoZSBjb2xvci9hbHBoYSB2YWx1ZSBoYXMgYmVlbiBkZXRlcm1pbmVkXHJcblx0XHRcdFx0cmVzdWx0ID0gY2xpcHBpbmdBbHBoYSgpO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0YnVpbGRlci5zdGFjay5hZGQoIGNsaXBwaW5nKCkgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXR1cHMgdGhlIGhhcmR3YXJlIGNsaXBwaW5nIGlmIGF2YWlsYWJsZSBvbiB0aGUgY3VycmVudCBkZXZpY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqL1xyXG5cdHNldHVwSGFyZHdhcmVDbGlwcGluZyggYnVpbGRlciApIHtcclxuXHJcblx0XHR0aGlzLmhhcmR3YXJlQ2xpcHBpbmcgPSBmYWxzZTtcclxuXHJcblx0XHRpZiAoIGJ1aWxkZXIuY2xpcHBpbmdDb250ZXh0ID09PSBudWxsICkgcmV0dXJuO1xyXG5cclxuXHRcdGNvbnN0IGNhbmRpZGF0ZUNvdW50ID0gYnVpbGRlci5jbGlwcGluZ0NvbnRleHQudW5pb25QbGFuZXMubGVuZ3RoO1xyXG5cclxuXHRcdC8vIDggcGxhbmVzIHN1cHBvcnRlZCBieSBXZWJHTCBBTkdMRV9jbGlwX2N1bGxfZGlzdGFuY2UgYW5kIFdlYkdQVSBjbGlwLWRpc3RhbmNlc1xyXG5cclxuXHRcdGlmICggY2FuZGlkYXRlQ291bnQgPiAwICYmIGNhbmRpZGF0ZUNvdW50IDw9IDggJiYgYnVpbGRlci5pc0F2YWlsYWJsZSggJ2NsaXBEaXN0YW5jZScgKSApIHtcclxuXHJcblx0XHRcdGJ1aWxkZXIuc3RhY2suYWRkKCBoYXJkd2FyZUNsaXBwaW5nKCkgKTtcclxuXHJcblx0XHRcdHRoaXMuaGFyZHdhcmVDbGlwcGluZyA9IHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXR1cHMgdGhlIGRlcHRoIG9mIHRoaXMgbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqL1xyXG5cdHNldHVwRGVwdGgoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyByZW5kZXJlciwgY2FtZXJhIH0gPSBidWlsZGVyO1xyXG5cclxuXHRcdC8vIERlcHRoXHJcblxyXG5cdFx0bGV0IGRlcHRoTm9kZSA9IHRoaXMuZGVwdGhOb2RlO1xyXG5cclxuXHRcdGlmICggZGVwdGhOb2RlID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0Y29uc3QgbXJ0ID0gcmVuZGVyZXIuZ2V0TVJUKCk7XHJcblxyXG5cdFx0XHRpZiAoIG1ydCAmJiBtcnQuaGFzKCAnZGVwdGgnICkgKSB7XHJcblxyXG5cdFx0XHRcdGRlcHRoTm9kZSA9IG1ydC5nZXQoICdkZXB0aCcgKTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIHJlbmRlcmVyLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggY2FtZXJhLmlzUGVyc3BlY3RpdmVDYW1lcmEgKSB7XHJcblxyXG5cdFx0XHRcdFx0ZGVwdGhOb2RlID0gdmlld1pUb0xvZ2FyaXRobWljRGVwdGgoIHBvc2l0aW9uVmlldy56LCBjYW1lcmFOZWFyLCBjYW1lcmFGYXIgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRkZXB0aE5vZGUgPSB2aWV3WlRvT3J0aG9ncmFwaGljRGVwdGgoIHBvc2l0aW9uVmlldy56LCBjYW1lcmFOZWFyLCBjYW1lcmFGYXIgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGRlcHRoTm9kZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGRlcHRoLmFzc2lnbiggZGVwdGhOb2RlICkuYXBwZW5kKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHVwcyB0aGUgcG9zaXRpb24gbm9kZSBpbiB2aWV3IHNwYWNlLiBUaGlzIG1ldGhvZCBleGlzdHNcclxuXHQgKiBzbyBkZXJpdmVkIG5vZGUgbWF0ZXJpYWxzIGNhbiBtb2RpZnkgdGhlIGltcGxlbWVudGF0aW9uIGUuZy4gc3ByaXRlIG1hdGVyaWFscy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7Tm9kZTx2ZWMzPn0gVGhlIHBvc2l0aW9uIGluIHZpZXcgc3BhY2UuXHJcblx0ICovXHJcblx0c2V0dXBQb3NpdGlvblZpZXcoIC8qYnVpbGRlciovICkge1xyXG5cclxuXHRcdHJldHVybiBtb2RlbFZpZXdNYXRyaXgubXVsKCBwb3NpdGlvbkxvY2FsICkueHl6O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHVwcyB0aGUgcG9zaXRpb24gaW4gY2xpcCBzcGFjZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7Tm9kZTx2ZWM0Pn0gVGhlIHBvc2l0aW9uIGluIHZpZXcgc3BhY2UuXHJcblx0ICovXHJcblx0c2V0dXBNb2RlbFZpZXdQcm9qZWN0aW9uKCAvKmJ1aWxkZXIqLyApIHtcclxuXHJcblx0XHRyZXR1cm4gY2FtZXJhUHJvamVjdGlvbk1hdHJpeC5tdWwoIHBvc2l0aW9uVmlldyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHVwcyB0aGUgbG9naWMgZm9yIHRoZSB2ZXJ0ZXggc3RhZ2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge05vZGU8dmVjND59IFRoZSBwb3NpdGlvbiBpbiBjbGlwIHNwYWNlLlxyXG5cdCAqL1xyXG5cdHNldHVwVmVydGV4KCBidWlsZGVyICkge1xyXG5cclxuXHRcdGJ1aWxkZXIuYWRkU3RhY2soKTtcclxuXHJcblx0XHR0aGlzLnNldHVwUG9zaXRpb24oIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRidWlsZGVyLmNvbnRleHQudmVydGV4ID0gYnVpbGRlci5yZW1vdmVTdGFjaygpO1xyXG5cclxuXHRcdHJldHVybiBtb2RlbFZpZXdQcm9qZWN0aW9uO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHVwcyB0aGUgY29tcHV0YXRpb24gb2YgdGhlIHBvc2l0aW9uIGluIGxvY2FsIHNwYWNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtOb2RlPHZlYzM+fSBUaGUgcG9zaXRpb24gaW4gbG9jYWwgc3BhY2UuXHJcblx0ICovXHJcblx0c2V0dXBQb3NpdGlvbiggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCB7IG9iamVjdCwgZ2VvbWV0cnkgfSA9IGJ1aWxkZXI7XHJcblxyXG5cdFx0aWYgKCBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24gfHwgZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbCB8fCBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMuY29sb3IgKSB7XHJcblxyXG5cdFx0XHRtb3JwaFJlZmVyZW5jZSggb2JqZWN0ICkuYXBwZW5kKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggb2JqZWN0LmlzU2tpbm5lZE1lc2ggPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRza2lubmluZyggb2JqZWN0ICkuYXBwZW5kKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy5kaXNwbGFjZW1lbnRNYXAgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBkaXNwbGFjZW1lbnRNYXAgPSBtYXRlcmlhbFJlZmVyZW5jZSggJ2Rpc3BsYWNlbWVudE1hcCcsICd0ZXh0dXJlJyApO1xyXG5cdFx0XHRjb25zdCBkaXNwbGFjZW1lbnRTY2FsZSA9IG1hdGVyaWFsUmVmZXJlbmNlKCAnZGlzcGxhY2VtZW50U2NhbGUnLCAnZmxvYXQnICk7XHJcblx0XHRcdGNvbnN0IGRpc3BsYWNlbWVudEJpYXMgPSBtYXRlcmlhbFJlZmVyZW5jZSggJ2Rpc3BsYWNlbWVudEJpYXMnLCAnZmxvYXQnICk7XHJcblxyXG5cdFx0XHRwb3NpdGlvbkxvY2FsLmFkZEFzc2lnbiggbm9ybWFsTG9jYWwubm9ybWFsaXplKCkubXVsKCAoIGRpc3BsYWNlbWVudE1hcC54Lm11bCggZGlzcGxhY2VtZW50U2NhbGUgKS5hZGQoIGRpc3BsYWNlbWVudEJpYXMgKSApICkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBvYmplY3QuaXNCYXRjaGVkTWVzaCApIHtcclxuXHJcblx0XHRcdGJhdGNoKCBvYmplY3QgKS5hcHBlbmQoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCAoIG9iamVjdC5pc0luc3RhbmNlZE1lc2ggJiYgb2JqZWN0Lmluc3RhbmNlTWF0cml4ICYmIG9iamVjdC5pbnN0YW5jZU1hdHJpeC5pc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSA9PT0gdHJ1ZSApICkge1xyXG5cclxuXHRcdFx0aW5zdGFuY2VkTWVzaCggb2JqZWN0ICkuYXBwZW5kKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy5wb3NpdGlvbk5vZGUgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRwb3NpdGlvbkxvY2FsLmFzc2lnbiggdGhpcy5wb3NpdGlvbk5vZGUuY29udGV4dCggeyBpc1Bvc2l0aW9uTm9kZUlucHV0OiB0cnVlIH0gKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcG9zaXRpb25Mb2NhbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXR1cHMgdGhlIGNvbXB1dGF0aW9uIG9mIHRoZSBtYXRlcmlhbCdzIGRpZmZ1c2UgY29sb3IuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyR2VvbWV0cnl9IGdlb21ldHJ5IC0gVGhlIGdlb21ldHJ5LlxyXG5cdCAqL1xyXG5cdHNldHVwRGlmZnVzZUNvbG9yKCB7IG9iamVjdCwgZ2VvbWV0cnkgfSApIHtcclxuXHJcblx0XHRsZXQgY29sb3JOb2RlID0gdGhpcy5jb2xvck5vZGUgPyB2ZWM0KCB0aGlzLmNvbG9yTm9kZSApIDogbWF0ZXJpYWxDb2xvcjtcclxuXHJcblx0XHQvLyBWRVJURVggQ09MT1JTXHJcblxyXG5cdFx0aWYgKCB0aGlzLnZlcnRleENvbG9ycyA9PT0gdHJ1ZSAmJiBnZW9tZXRyeS5oYXNBdHRyaWJ1dGUoICdjb2xvcicgKSApIHtcclxuXHJcblx0XHRcdGNvbG9yTm9kZSA9IHZlYzQoIGNvbG9yTm9kZS54eXoubXVsKCBhdHRyaWJ1dGUoICdjb2xvcicsICd2ZWMzJyApICksIGNvbG9yTm9kZS5hICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEluc3RhbmNlZCBjb2xvcnNcclxuXHJcblx0XHRpZiAoIG9iamVjdC5pbnN0YW5jZUNvbG9yICkge1xyXG5cclxuXHRcdFx0Y29uc3QgaW5zdGFuY2VDb2xvciA9IHZhcnlpbmdQcm9wZXJ0eSggJ3ZlYzMnLCAndkluc3RhbmNlQ29sb3InICk7XHJcblxyXG5cdFx0XHRjb2xvck5vZGUgPSBpbnN0YW5jZUNvbG9yLm11bCggY29sb3JOb2RlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggb2JqZWN0LmlzQmF0Y2hlZE1lc2ggJiYgb2JqZWN0Ll9jb2xvcnNUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYmF0Y2hDb2xvciA9IHZhcnlpbmdQcm9wZXJ0eSggJ3ZlYzMnLCAndkJhdGNoQ29sb3InICk7XHJcblxyXG5cdFx0XHRjb2xvck5vZGUgPSBiYXRjaENvbG9yLm11bCggY29sb3JOb2RlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHJcblx0XHQvLyBDT0xPUlxyXG5cclxuXHRcdGRpZmZ1c2VDb2xvci5hc3NpZ24oIGNvbG9yTm9kZSApO1xyXG5cclxuXHRcdC8vIE9QQUNJVFlcclxuXHJcblx0XHRjb25zdCBvcGFjaXR5Tm9kZSA9IHRoaXMub3BhY2l0eU5vZGUgPyBmbG9hdCggdGhpcy5vcGFjaXR5Tm9kZSApIDogbWF0ZXJpYWxPcGFjaXR5O1xyXG5cdFx0ZGlmZnVzZUNvbG9yLmEuYXNzaWduKCBkaWZmdXNlQ29sb3IuYS5tdWwoIG9wYWNpdHlOb2RlICkgKTtcclxuXHJcblx0XHQvLyBBTFBIQSBURVNUXHJcblxyXG5cdFx0aWYgKCB0aGlzLmFscGhhVGVzdE5vZGUgIT09IG51bGwgfHwgdGhpcy5hbHBoYVRlc3QgPiAwICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYWxwaGFUZXN0Tm9kZSA9IHRoaXMuYWxwaGFUZXN0Tm9kZSAhPT0gbnVsbCA/IGZsb2F0KCB0aGlzLmFscGhhVGVzdE5vZGUgKSA6IG1hdGVyaWFsQWxwaGFUZXN0O1xyXG5cclxuXHRcdFx0ZGlmZnVzZUNvbG9yLmEubGVzc1RoYW5FcXVhbCggYWxwaGFUZXN0Tm9kZSApLmRpc2NhcmQoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQUxQSEEgSEFTSFxyXG5cclxuXHRcdGlmICggdGhpcy5hbHBoYUhhc2ggPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRkaWZmdXNlQ29sb3IuYS5sZXNzVGhhbiggZ2V0QWxwaGFIYXNoVGhyZXNob2xkKCBwb3NpdGlvbkxvY2FsICkgKS5kaXNjYXJkKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy50cmFuc3BhcmVudCA9PT0gZmFsc2UgJiYgdGhpcy5ibGVuZGluZyA9PT0gTm9ybWFsQmxlbmRpbmcgJiYgdGhpcy5hbHBoYVRvQ292ZXJhZ2UgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0ZGlmZnVzZUNvbG9yLmEuYXNzaWduKCAxLjAgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWJzdHJhY3QgaW50ZXJmYWNlIG1ldGhvZCB0aGF0IGNhbiBiZSBpbXBsZW1lbnRlZCBieSBkZXJpdmVkIG1hdGVyaWFsc1xyXG5cdCAqIHRvIHNldHVwIG1hdGVyaWFsLXNwZWNpZmljIG5vZGUgdmFyaWFibGVzLlxyXG5cdCAqXHJcblx0ICogQGFic3RyYWN0XHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKi9cclxuXHRzZXR1cFZhcmlhbnRzKCAvKmJ1aWxkZXIqLyApIHtcclxuXHJcblx0XHQvLyBJbnRlcmZhY2UgZnVuY3Rpb24uXHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0dXBzIHRoZSBvdXRnb2luZyBsaWdodCBub2RlIHZhcmlhYmxlXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtOb2RlPHZlYzM+fSBUaGUgb3V0Z29pbmcgbGlnaHQgbm9kZS5cclxuXHQgKi9cclxuXHRzZXR1cE91dGdvaW5nTGlnaHQoKSB7XHJcblxyXG5cdFx0cmV0dXJuICggdGhpcy5saWdodHMgPT09IHRydWUgKSA/IHZlYzMoIDAgKSA6IGRpZmZ1c2VDb2xvci5yZ2I7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0dXBzIHRoZSBub3JtYWwgbm9kZSBmcm9tIHRoZSBtYXRlcmlhbC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge05vZGU8dmVjMz59IFRoZSBub3JtYWwgbm9kZS5cclxuXHQgKi9cclxuXHRzZXR1cE5vcm1hbCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5ub3JtYWxOb2RlID8gdmVjMyggdGhpcy5ub3JtYWxOb2RlICkgOiBtYXRlcmlhbE5vcm1hbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXR1cHMgdGhlIGVudmlyb25tZW50IG5vZGUgZnJvbSB0aGUgbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge05vZGU8dmVjND59IFRoZSBlbnZpcm9ubWVudCBub2RlLlxyXG5cdCAqL1xyXG5cdHNldHVwRW52aXJvbm1lbnQoIC8qYnVpbGRlciovICkge1xyXG5cclxuXHRcdGxldCBub2RlID0gbnVsbDtcclxuXHJcblx0XHRpZiAoIHRoaXMuZW52Tm9kZSApIHtcclxuXHJcblx0XHRcdG5vZGUgPSB0aGlzLmVudk5vZGU7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggdGhpcy5lbnZNYXAgKSB7XHJcblxyXG5cdFx0XHRub2RlID0gdGhpcy5lbnZNYXAuaXNDdWJlVGV4dHVyZSA/IG1hdGVyaWFsUmVmZXJlbmNlKCAnZW52TWFwJywgJ2N1YmVUZXh0dXJlJyApIDogbWF0ZXJpYWxSZWZlcmVuY2UoICdlbnZNYXAnLCAndGV4dHVyZScgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG5vZGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0dXBzIHRoZSBsaWdodCBtYXAgbm9kZSBmcm9tIHRoZSBtYXRlcmlhbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7Tm9kZTx2ZWMzPn0gVGhlIGxpZ2h0IG1hcCBub2RlLlxyXG5cdCAqL1xyXG5cdHNldHVwTGlnaHRNYXAoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0bGV0IG5vZGUgPSBudWxsO1xyXG5cclxuXHRcdGlmICggYnVpbGRlci5tYXRlcmlhbC5saWdodE1hcCApIHtcclxuXHJcblx0XHRcdG5vZGUgPSBuZXcgSXJyYWRpYW5jZU5vZGUoIG1hdGVyaWFsTGlnaHRNYXAgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG5vZGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0dXBzIHRoZSBsaWdodHMgbm9kZSBiYXNlZCBvbiB0aGUgc2NlbmUsIGVudmlyb25tZW50IGFuZCBtYXRlcmlhbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7TGlnaHRzTm9kZX0gVGhlIGxpZ2h0cyBub2RlLlxyXG5cdCAqL1xyXG5cdHNldHVwTGlnaHRzKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IG1hdGVyaWFsTGlnaHRzTm9kZSA9IFtdO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0Y29uc3QgZW52Tm9kZSA9IHRoaXMuc2V0dXBFbnZpcm9ubWVudCggYnVpbGRlciApO1xyXG5cclxuXHRcdGlmICggZW52Tm9kZSAmJiBlbnZOb2RlLmlzTGlnaHRpbmdOb2RlICkge1xyXG5cclxuXHRcdFx0bWF0ZXJpYWxMaWdodHNOb2RlLnB1c2goIGVudk5vZGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgbGlnaHRNYXBOb2RlID0gdGhpcy5zZXR1cExpZ2h0TWFwKCBidWlsZGVyICk7XHJcblxyXG5cdFx0aWYgKCBsaWdodE1hcE5vZGUgJiYgbGlnaHRNYXBOb2RlLmlzTGlnaHRpbmdOb2RlICkge1xyXG5cclxuXHRcdFx0bWF0ZXJpYWxMaWdodHNOb2RlLnB1c2goIGxpZ2h0TWFwTm9kZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMuYW9Ob2RlICE9PSBudWxsIHx8IGJ1aWxkZXIubWF0ZXJpYWwuYW9NYXAgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBhb05vZGUgPSB0aGlzLmFvTm9kZSAhPT0gbnVsbCA/IHRoaXMuYW9Ob2RlIDogbWF0ZXJpYWxBTztcclxuXHJcblx0XHRcdG1hdGVyaWFsTGlnaHRzTm9kZS5wdXNoKCBuZXcgQU9Ob2RlKCBhb05vZGUgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRsZXQgbGlnaHRzTiA9IHRoaXMubGlnaHRzTm9kZSB8fCBidWlsZGVyLmxpZ2h0c05vZGU7XHJcblxyXG5cdFx0aWYgKCBtYXRlcmlhbExpZ2h0c05vZGUubGVuZ3RoID4gMCApIHtcclxuXHJcblx0XHRcdGxpZ2h0c04gPSBidWlsZGVyLnJlbmRlcmVyLmxpZ2h0aW5nLmNyZWF0ZU5vZGUoIFsgLi4ubGlnaHRzTi5nZXRMaWdodHMoKSwgLi4ubWF0ZXJpYWxMaWdodHNOb2RlIF0gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGxpZ2h0c047XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5IG1vc3QgZGVyaXZlZCBtYXRlcmlhbHNcclxuXHQgKiBzaW5jZSBpdCBkZWZpbmVzIHRoZSBtYXRlcmlhbCdzIGxpZ2h0aW5nIG1vZGVsLlxyXG5cdCAqXHJcblx0ICogQGFic3RyYWN0XHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtMaWdodGluZ01vZGVsfSBUaGUgbGlnaHRpbmcgbW9kZWwuXHJcblx0ICovXHJcblx0c2V0dXBMaWdodGluZ01vZGVsKCAvKmJ1aWxkZXIqLyApIHtcclxuXHJcblx0XHQvLyBJbnRlcmZhY2UgZnVuY3Rpb24uXHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0dXBzIHRoZSBvdXRnb2luZyBsaWdodCBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtOb2RlPHZlYzM+fSBUaGUgb3V0Z29pbmcgbGlnaHQgbm9kZS5cclxuXHQgKi9cclxuXHRzZXR1cExpZ2h0aW5nKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IHsgbWF0ZXJpYWwgfSA9IGJ1aWxkZXI7XHJcblx0XHRjb25zdCB7IGJhY2tkcm9wTm9kZSwgYmFja2Ryb3BBbHBoYU5vZGUsIGVtaXNzaXZlTm9kZSB9ID0gdGhpcztcclxuXHJcblx0XHQvLyBPVVRHT0lORyBMSUdIVFxyXG5cclxuXHRcdGNvbnN0IGxpZ2h0cyA9IHRoaXMubGlnaHRzID09PSB0cnVlIHx8IHRoaXMubGlnaHRzTm9kZSAhPT0gbnVsbDtcclxuXHJcblx0XHRjb25zdCBsaWdodHNOb2RlID0gbGlnaHRzID8gdGhpcy5zZXR1cExpZ2h0cyggYnVpbGRlciApIDogbnVsbDtcclxuXHJcblx0XHRsZXQgb3V0Z29pbmdMaWdodE5vZGUgPSB0aGlzLnNldHVwT3V0Z29pbmdMaWdodCggYnVpbGRlciApO1xyXG5cclxuXHRcdGlmICggbGlnaHRzTm9kZSAmJiBsaWdodHNOb2RlLmdldFNjb3BlKCkuaGFzTGlnaHRzICkge1xyXG5cclxuXHRcdFx0Y29uc3QgbGlnaHRpbmdNb2RlbCA9IHRoaXMuc2V0dXBMaWdodGluZ01vZGVsKCBidWlsZGVyICkgfHwgbnVsbDtcclxuXHJcblx0XHRcdG91dGdvaW5nTGlnaHROb2RlID0gbGlnaHRpbmdDb250ZXh0KCBsaWdodHNOb2RlLCBsaWdodGluZ01vZGVsLCBiYWNrZHJvcE5vZGUsIGJhY2tkcm9wQWxwaGFOb2RlICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggYmFja2Ryb3BOb2RlICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0b3V0Z29pbmdMaWdodE5vZGUgPSB2ZWMzKCBiYWNrZHJvcEFscGhhTm9kZSAhPT0gbnVsbCA/IG1peCggb3V0Z29pbmdMaWdodE5vZGUsIGJhY2tkcm9wTm9kZSwgYmFja2Ryb3BBbHBoYU5vZGUgKSA6IGJhY2tkcm9wTm9kZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBFTUlTU0lWRVxyXG5cclxuXHRcdGlmICggKCBlbWlzc2l2ZU5vZGUgJiYgZW1pc3NpdmVOb2RlLmlzTm9kZSA9PT0gdHJ1ZSApIHx8ICggbWF0ZXJpYWwuZW1pc3NpdmUgJiYgbWF0ZXJpYWwuZW1pc3NpdmUuaXNDb2xvciA9PT0gdHJ1ZSApICkge1xyXG5cclxuXHRcdFx0ZW1pc3NpdmUuYXNzaWduKCB2ZWMzKCBlbWlzc2l2ZU5vZGUgPyBlbWlzc2l2ZU5vZGUgOiBtYXRlcmlhbEVtaXNzaXZlICkgKTtcclxuXHJcblx0XHRcdG91dGdvaW5nTGlnaHROb2RlID0gb3V0Z29pbmdMaWdodE5vZGUuYWRkKCBlbWlzc2l2ZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gb3V0Z29pbmdMaWdodE5vZGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0dXAgdGhlIGZvZy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHBhcmFtIHtOb2RlPHZlYzQ+fSBvdXRwdXROb2RlIC0gVGhlIGV4aXN0aW5nIG91dHB1dCBub2RlLlxyXG5cdCAqIEByZXR1cm4ge05vZGU8dmVjND59IFRoZSBvdXRwdXQgbm9kZS5cclxuXHQgKi9cclxuXHRzZXR1cEZvZyggYnVpbGRlciwgb3V0cHV0Tm9kZSApIHtcclxuXHJcblx0XHRjb25zdCBmb2dOb2RlID0gYnVpbGRlci5mb2dOb2RlO1xyXG5cclxuXHRcdGlmICggZm9nTm9kZSApIHtcclxuXHJcblx0XHRcdG91dHB1dC5hc3NpZ24oIG91dHB1dE5vZGUgKTtcclxuXHJcblx0XHRcdG91dHB1dE5vZGUgPSB2ZWM0KCBmb2dOb2RlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBvdXRwdXROb2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHVwcyB0aGUgb3V0cHV0IG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEBwYXJhbSB7Tm9kZTx2ZWM0Pn0gb3V0cHV0Tm9kZSAtIFRoZSBleGlzdGluZyBvdXRwdXQgbm9kZS5cclxuXHQgKiBAcmV0dXJuIHtOb2RlPHZlYzQ+fSBUaGUgb3V0cHV0IG5vZGUuXHJcblx0ICovXHJcblx0c2V0dXBPdXRwdXQoIGJ1aWxkZXIsIG91dHB1dE5vZGUgKSB7XHJcblxyXG5cdFx0Ly8gRk9HXHJcblxyXG5cdFx0aWYgKCB0aGlzLmZvZyA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdG91dHB1dE5vZGUgPSB0aGlzLnNldHVwRm9nKCBidWlsZGVyLCBvdXRwdXROb2RlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBvdXRwdXROb2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE1vc3QgY2xhc3NpYyBtYXRlcmlhbCB0eXBlcyBoYXZlIGEgbm9kZSBwZW5kYW50IGUuZy4gZm9yIGBNZXNoQmFzaWNNYXRlcmlhbGBcclxuXHQgKiB0aGVyZSBpcyBgTWVzaEJhc2ljTm9kZU1hdGVyaWFsYC4gVGhpcyB1dGlsaXR5IG1ldGhvZCBpcyBpbnRlbmRlZCBmb3JcclxuXHQgKiBkZWZpbmluZyBhbGwgbWF0ZXJpYWwgcHJvcGVydGllcyBvZiB0aGUgY2xhc3NpYyB0eXBlIGluIHRoZSBub2RlIHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdGVyaWFsfSBtYXRlcmlhbCAtIFRoZSBtYXRlcmlhbCB0byBjb3B5IHByb3BlcnRpZXMgd2l0aCB0aGVpciB2YWx1ZXMgdG8gdGhpcyBub2RlIG1hdGVyaWFsLlxyXG5cdCAqL1xyXG5cdHNldERlZmF1bHRWYWx1ZXMoIG1hdGVyaWFsICkge1xyXG5cclxuXHRcdC8vIFRoaXMgYXBwcm9hY2ggaXMgdG8gcmV1c2UgdGhlIG5hdGl2ZSByZWZyZXNoVW5pZm9ybXMqXHJcblx0XHQvLyBhbmQgdHVybiBhdmFpbGFibGUgdGhlIHVzZSBvZiBmZWF0dXJlcyBsaWtlIHRyYW5zbWlzc2lvbiBhbmQgZW52aXJvbm1lbnQgaW4gY29yZVxyXG5cclxuXHRcdGZvciAoIGNvbnN0IHByb3BlcnR5IGluIG1hdGVyaWFsICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdmFsdWUgPSBtYXRlcmlhbFsgcHJvcGVydHkgXTtcclxuXHJcblx0XHRcdGlmICggdGhpc1sgcHJvcGVydHkgXSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHR0aGlzWyBwcm9wZXJ0eSBdID0gdmFsdWU7XHJcblxyXG5cdFx0XHRcdGlmICggdmFsdWUgJiYgdmFsdWUuY2xvbmUgKSB0aGlzWyBwcm9wZXJ0eSBdID0gdmFsdWUuY2xvbmUoKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgZGVzY3JpcHRvcnMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyggbWF0ZXJpYWwuY29uc3RydWN0b3IucHJvdG90eXBlICk7XHJcblxyXG5cdFx0Zm9yICggY29uc3Qga2V5IGluIGRlc2NyaXB0b3JzICkge1xyXG5cclxuXHRcdFx0aWYgKCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKCB0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwga2V5ICkgPT09IHVuZGVmaW5lZCAmJlxyXG5cdFx0XHQgICAgIGRlc2NyaXB0b3JzWyBrZXkgXS5nZXQgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwga2V5LCBkZXNjcmlwdG9yc1sga2V5IF0gKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2VyaWFsaXplcyB0aGlzIG1hdGVyaWFsIHRvIEpTT04uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gez8oT2JqZWN0fHN0cmluZyl9IG1ldGEgLSBUaGUgbWV0YSBpbmZvcm1hdGlvbiBmb3Igc2VyaWFsaXphdGlvbi5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBzZXJpYWxpemVkIG5vZGUuXHJcblx0ICovXHJcblx0dG9KU09OKCBtZXRhICkge1xyXG5cclxuXHRcdGNvbnN0IGlzUm9vdCA9ICggbWV0YSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBtZXRhID09PSAnc3RyaW5nJyApO1xyXG5cclxuXHRcdGlmICggaXNSb290ICkge1xyXG5cclxuXHRcdFx0bWV0YSA9IHtcclxuXHRcdFx0XHR0ZXh0dXJlczoge30sXHJcblx0XHRcdFx0aW1hZ2VzOiB7fSxcclxuXHRcdFx0XHRub2Rlczoge31cclxuXHRcdFx0fTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IE1hdGVyaWFsLnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcywgbWV0YSApO1xyXG5cdFx0Y29uc3Qgbm9kZUNoaWxkcmVuID0gZ2V0Tm9kZUNoaWxkcmVuKCB0aGlzICk7XHJcblxyXG5cdFx0ZGF0YS5pbnB1dE5vZGVzID0ge307XHJcblxyXG5cdFx0Zm9yICggY29uc3QgeyBwcm9wZXJ0eSwgY2hpbGROb2RlIH0gb2Ygbm9kZUNoaWxkcmVuICkge1xyXG5cclxuXHRcdFx0ZGF0YS5pbnB1dE5vZGVzWyBwcm9wZXJ0eSBdID0gY2hpbGROb2RlLnRvSlNPTiggbWV0YSApLnV1aWQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFRPRE86IENvcGllZCBmcm9tIE9iamVjdDNELnRvSlNPTlxyXG5cclxuXHRcdGZ1bmN0aW9uIGV4dHJhY3RGcm9tQ2FjaGUoIGNhY2hlICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdmFsdWVzID0gW107XHJcblxyXG5cdFx0XHRmb3IgKCBjb25zdCBrZXkgaW4gY2FjaGUgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGRhdGEgPSBjYWNoZVsga2V5IF07XHJcblx0XHRcdFx0ZGVsZXRlIGRhdGEubWV0YWRhdGE7XHJcblx0XHRcdFx0dmFsdWVzLnB1c2goIGRhdGEgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiB2YWx1ZXM7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggaXNSb290ICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdGV4dHVyZXMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLnRleHR1cmVzICk7XHJcblx0XHRcdGNvbnN0IGltYWdlcyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEuaW1hZ2VzICk7XHJcblx0XHRcdGNvbnN0IG5vZGVzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS5ub2RlcyApO1xyXG5cclxuXHRcdFx0aWYgKCB0ZXh0dXJlcy5sZW5ndGggPiAwICkgZGF0YS50ZXh0dXJlcyA9IHRleHR1cmVzO1xyXG5cdFx0XHRpZiAoIGltYWdlcy5sZW5ndGggPiAwICkgZGF0YS5pbWFnZXMgPSBpbWFnZXM7XHJcblx0XHRcdGlmICggbm9kZXMubGVuZ3RoID4gMCApIGRhdGEubm9kZXMgPSBub2RlcztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGRhdGE7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29waWVzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBub2RlIG1hdGVyaWFsIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVNYXRlcmlhbH0gc291cmNlIC0gVGhlIG1hdGVyaWFsIHRvIGNvcHkuXHJcblx0ICogQHJldHVybiB7Tm9kZU1hdGVyaWFsfSBBIHJlZmVyZW5jZSB0byB0aGlzIG5vZGUgbWF0ZXJpYWwuXHJcblx0ICovXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHRoaXMubGlnaHRzTm9kZSA9IHNvdXJjZS5saWdodHNOb2RlO1xyXG5cdFx0dGhpcy5lbnZOb2RlID0gc291cmNlLmVudk5vZGU7XHJcblxyXG5cdFx0dGhpcy5jb2xvck5vZGUgPSBzb3VyY2UuY29sb3JOb2RlO1xyXG5cdFx0dGhpcy5ub3JtYWxOb2RlID0gc291cmNlLm5vcm1hbE5vZGU7XHJcblx0XHR0aGlzLm9wYWNpdHlOb2RlID0gc291cmNlLm9wYWNpdHlOb2RlO1xyXG5cdFx0dGhpcy5iYWNrZHJvcE5vZGUgPSBzb3VyY2UuYmFja2Ryb3BOb2RlO1xyXG5cdFx0dGhpcy5iYWNrZHJvcEFscGhhTm9kZSA9IHNvdXJjZS5iYWNrZHJvcEFscGhhTm9kZTtcclxuXHRcdHRoaXMuYWxwaGFUZXN0Tm9kZSA9IHNvdXJjZS5hbHBoYVRlc3ROb2RlO1xyXG5cclxuXHRcdHRoaXMucG9zaXRpb25Ob2RlID0gc291cmNlLnBvc2l0aW9uTm9kZTtcclxuXHRcdHRoaXMuZ2VvbWV0cnlOb2RlID0gc291cmNlLmdlb21ldHJ5Tm9kZTtcclxuXHJcblx0XHR0aGlzLmRlcHRoTm9kZSA9IHNvdXJjZS5kZXB0aE5vZGU7XHJcblx0XHR0aGlzLnNoYWRvd1Bvc2l0aW9uTm9kZSA9IHNvdXJjZS5zaGFkb3dQb3NpdGlvbk5vZGU7XHJcblx0XHR0aGlzLnJlY2VpdmVkU2hhZG93Tm9kZSA9IHNvdXJjZS5yZWNlaXZlZFNoYWRvd05vZGU7XHJcblx0XHR0aGlzLmNhc3RTaGFkb3dOb2RlID0gc291cmNlLmNhc3RTaGFkb3dOb2RlO1xyXG5cclxuXHRcdHRoaXMub3V0cHV0Tm9kZSA9IHNvdXJjZS5vdXRwdXROb2RlO1xyXG5cdFx0dGhpcy5tcnROb2RlID0gc291cmNlLm1ydE5vZGU7XHJcblxyXG5cdFx0dGhpcy5mcmFnbWVudE5vZGUgPSBzb3VyY2UuZnJhZ21lbnROb2RlO1xyXG5cdFx0dGhpcy52ZXJ0ZXhOb2RlID0gc291cmNlLnZlcnRleE5vZGU7XHJcblxyXG5cdFx0cmV0dXJuIHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBOb2RlTWF0ZXJpYWw7XHJcbiIsImltcG9ydCBOb2RlTWF0ZXJpYWwgZnJvbSAnLi9Ob2RlTWF0ZXJpYWwuanMnO1xyXG5cclxuaW1wb3J0IHsgTGluZUJhc2ljTWF0ZXJpYWwgfSBmcm9tICcuLi9MaW5lQmFzaWNNYXRlcmlhbC5qcyc7XHJcblxyXG5jb25zdCBfZGVmYXVsdFZhbHVlcyA9IC8qQF9fUFVSRV9fKi8gbmV3IExpbmVCYXNpY01hdGVyaWFsKCk7XHJcblxyXG4vKipcclxuICogTm9kZSBtYXRlcmlhbCB2ZXJzaW9uIG9mIHtAbGluayBMaW5lQmFzaWNNYXRlcmlhbH0uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBOb2RlTWF0ZXJpYWxcclxuICovXHJcbmNsYXNzIExpbmVCYXNpY05vZGVNYXRlcmlhbCBleHRlbmRzIE5vZGVNYXRlcmlhbCB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ0xpbmVCYXNpY05vZGVNYXRlcmlhbCc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBsaW5lIGJhc2ljIG5vZGUgbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtZXRlcnNdIC0gVGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwYXJhbWV0ZXJzICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzTGluZUJhc2ljTm9kZU1hdGVyaWFsID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnNldERlZmF1bHRWYWx1ZXMoIF9kZWZhdWx0VmFsdWVzICk7XHJcblxyXG5cdFx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTGluZUJhc2ljTm9kZU1hdGVyaWFsO1xyXG4iLCJpbXBvcnQgTm9kZU1hdGVyaWFsIGZyb20gJy4vTm9kZU1hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgYXR0cmlidXRlIH0gZnJvbSAnLi4vLi4vbm9kZXMvY29yZS9BdHRyaWJ1dGVOb2RlLmpzJztcclxuaW1wb3J0IHsgbWF0ZXJpYWxMaW5lRGFzaE9mZnNldCwgbWF0ZXJpYWxMaW5lRGFzaFNpemUsIG1hdGVyaWFsTGluZUdhcFNpemUsIG1hdGVyaWFsTGluZVNjYWxlIH0gZnJvbSAnLi4vLi4vbm9kZXMvYWNjZXNzb3JzL01hdGVyaWFsTm9kZS5qcyc7XHJcbmltcG9ydCB7IGRhc2hTaXplLCBnYXBTaXplIH0gZnJvbSAnLi4vLi4vbm9kZXMvY29yZS9Qcm9wZXJ0eU5vZGUuanMnO1xyXG5pbXBvcnQgeyB2YXJ5aW5nLCBmbG9hdCB9IGZyb20gJy4uLy4uL25vZGVzL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbmltcG9ydCB7IExpbmVEYXNoZWRNYXRlcmlhbCB9IGZyb20gJy4uL0xpbmVEYXNoZWRNYXRlcmlhbC5qcyc7XHJcblxyXG5jb25zdCBfZGVmYXVsdFZhbHVlcyA9IC8qQF9fUFVSRV9fKi8gbmV3IExpbmVEYXNoZWRNYXRlcmlhbCgpO1xyXG5cclxuLyoqXHJcbiAqIE5vZGUgbWF0ZXJpYWwgdmVyc2lvbiBvZiAge0BsaW5rIExpbmVEYXNoZWRNYXRlcmlhbH0uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBOb2RlTWF0ZXJpYWxcclxuICovXHJcbmNsYXNzIExpbmVEYXNoZWROb2RlTWF0ZXJpYWwgZXh0ZW5kcyBOb2RlTWF0ZXJpYWwge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdMaW5lRGFzaGVkTm9kZU1hdGVyaWFsJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGxpbmUgZGFzaGVkIG5vZGUgbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtZXRlcnNdIC0gVGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwYXJhbWV0ZXJzICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzTGluZURhc2hlZE5vZGVNYXRlcmlhbCA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy5zZXREZWZhdWx0VmFsdWVzKCBfZGVmYXVsdFZhbHVlcyApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGRhc2ggb2Zmc2V0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGFzaE9mZnNldCA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgb2Zmc2V0IG9mIGRhc2ggbWF0ZXJpYWxzIGlzIGJ5IGRlZmF1bHQgaW5mZXJyZWQgZnJvbSB0aGUgYGRhc2hPZmZzZXRgXHJcblx0XHQgKiBwcm9wZXJ0eS4gVGhpcyBub2RlIHByb3BlcnR5IGFsbG93cyB0byBvdmVyd3JpdGUgdGhlIGRlZmF1bHRcclxuXHRcdCAqIGFuZCBkZWZpbmUgdGhlIG9mZnNldCB3aXRoIGEgbm9kZSBpbnN0ZWFkLlxyXG5cdFx0ICpcclxuXHRcdCAqIElmIHlvdSBkb24ndCB3YW50IHRvIG92ZXJ3cml0ZSB0aGUgb2Zmc2V0IGJ1dCBtb2RpZnkgdGhlIGV4aXN0aW5nXHJcblx0XHQgKiB2YWx1ZSBpbnN0ZWFkLCB1c2Uge0BsaW5rIG1hdGVyaWFsTGluZURhc2hPZmZzZXR9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Tm9kZTxmbG9hdD59XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMub2Zmc2V0Tm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc2NhbGUgb2YgZGFzaCBtYXRlcmlhbHMgaXMgYnkgZGVmYXVsdCBpbmZlcnJlZCBmcm9tIHRoZSBgc2NhbGVgXHJcblx0XHQgKiBwcm9wZXJ0eS4gVGhpcyBub2RlIHByb3BlcnR5IGFsbG93cyB0byBvdmVyd3JpdGUgdGhlIGRlZmF1bHRcclxuXHRcdCAqIGFuZCBkZWZpbmUgdGhlIHNjYWxlIHdpdGggYSBub2RlIGluc3RlYWQuXHJcblx0XHQgKlxyXG5cdFx0ICogSWYgeW91IGRvbid0IHdhbnQgdG8gb3ZlcndyaXRlIHRoZSBzY2FsZSBidXQgbW9kaWZ5IHRoZSBleGlzdGluZ1xyXG5cdFx0ICogdmFsdWUgaW5zdGVhZCwgdXNlIHtAbGluayBtYXRlcmlhbExpbmVTY2FsZX0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPGZsb2F0Pn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kYXNoU2NhbGVOb2RlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBkYXNoIHNpemUgb2YgZGFzaCBtYXRlcmlhbHMgaXMgYnkgZGVmYXVsdCBpbmZlcnJlZCBmcm9tIHRoZSBgZGFzaFNpemVgXHJcblx0XHQgKiBwcm9wZXJ0eS4gVGhpcyBub2RlIHByb3BlcnR5IGFsbG93cyB0byBvdmVyd3JpdGUgdGhlIGRlZmF1bHRcclxuXHRcdCAqIGFuZCBkZWZpbmUgdGhlIGRhc2ggc2l6ZSB3aXRoIGEgbm9kZSBpbnN0ZWFkLlxyXG5cdFx0ICpcclxuXHRcdCAqIElmIHlvdSBkb24ndCB3YW50IHRvIG92ZXJ3cml0ZSB0aGUgZGFzaCBzaXplIGJ1dCBtb2RpZnkgdGhlIGV4aXN0aW5nXHJcblx0XHQgKiB2YWx1ZSBpbnN0ZWFkLCB1c2Uge0BsaW5rIG1hdGVyaWFsTGluZURhc2hTaXplfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGU8ZmxvYXQ+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRhc2hTaXplTm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZ2FwIHNpemUgb2YgZGFzaCBtYXRlcmlhbHMgaXMgYnkgZGVmYXVsdCBpbmZlcnJlZCBmcm9tIHRoZSBgZ2FwU2l6ZWBcclxuXHRcdCAqIHByb3BlcnR5LiBUaGlzIG5vZGUgcHJvcGVydHkgYWxsb3dzIHRvIG92ZXJ3cml0ZSB0aGUgZGVmYXVsdFxyXG5cdFx0ICogYW5kIGRlZmluZSB0aGUgZ2FwIHNpemUgd2l0aCBhIG5vZGUgaW5zdGVhZC5cclxuXHRcdCAqXHJcblx0XHQgKiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBvdmVyd3JpdGUgdGhlIGdhcCBzaXplIGJ1dCBtb2RpZnkgdGhlIGV4aXN0aW5nXHJcblx0XHQgKiB2YWx1ZSBpbnN0ZWFkLCB1c2Uge0BsaW5rIG1hdGVyaWFsTGluZUdhcFNpemV9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Tm9kZTxmbG9hdD59XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ2FwU2l6ZU5vZGUgPSBudWxsO1xyXG5cclxuXHRcdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0dXBzIHRoZSBkYXNoIHNwZWNpZmljIG5vZGUgdmFyaWFibGVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKi9cclxuXHRzZXR1cFZhcmlhbnRzKCAvKiBidWlsZGVyICovICkge1xyXG5cclxuXHRcdGNvbnN0IG9mZnNldE5vZGUgPSB0aGlzLm9mZnNldE5vZGUgPyBmbG9hdCggdGhpcy5vZmZzZXROb2RlICkgOiBtYXRlcmlhbExpbmVEYXNoT2Zmc2V0O1xyXG5cdFx0Y29uc3QgZGFzaFNjYWxlTm9kZSA9IHRoaXMuZGFzaFNjYWxlTm9kZSA/IGZsb2F0KCB0aGlzLmRhc2hTY2FsZU5vZGUgKSA6IG1hdGVyaWFsTGluZVNjYWxlO1xyXG5cdFx0Y29uc3QgZGFzaFNpemVOb2RlID0gdGhpcy5kYXNoU2l6ZU5vZGUgPyBmbG9hdCggdGhpcy5kYXNoU2l6ZU5vZGUgKSA6IG1hdGVyaWFsTGluZURhc2hTaXplO1xyXG5cdFx0Y29uc3QgZ2FwU2l6ZU5vZGUgPSB0aGlzLmdhcFNpemVOb2RlID8gZmxvYXQoIHRoaXMuZ2FwU2l6ZU5vZGUgKSA6IG1hdGVyaWFsTGluZUdhcFNpemU7XHJcblxyXG5cdFx0ZGFzaFNpemUuYXNzaWduKCBkYXNoU2l6ZU5vZGUgKTtcclxuXHRcdGdhcFNpemUuYXNzaWduKCBnYXBTaXplTm9kZSApO1xyXG5cclxuXHRcdGNvbnN0IHZMaW5lRGlzdGFuY2UgPSB2YXJ5aW5nKCBhdHRyaWJ1dGUoICdsaW5lRGlzdGFuY2UnICkubXVsKCBkYXNoU2NhbGVOb2RlICkgKTtcclxuXHRcdGNvbnN0IHZMaW5lRGlzdGFuY2VPZmZzZXQgPSBvZmZzZXROb2RlID8gdkxpbmVEaXN0YW5jZS5hZGQoIG9mZnNldE5vZGUgKSA6IHZMaW5lRGlzdGFuY2U7XHJcblxyXG5cdFx0dkxpbmVEaXN0YW5jZU9mZnNldC5tb2QoIGRhc2hTaXplLmFkZCggZ2FwU2l6ZSApICkuZ3JlYXRlclRoYW4oIGRhc2hTaXplICkuZGlzY2FyZCgpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBMaW5lRGFzaGVkTm9kZU1hdGVyaWFsO1xyXG4iLCJpbXBvcnQgVmlld3BvcnRUZXh0dXJlTm9kZSBmcm9tICcuL1ZpZXdwb3J0VGV4dHVyZU5vZGUuanMnO1xyXG5pbXBvcnQgeyBub2RlUHJveHkgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcbmltcG9ydCB7IHNjcmVlblVWIH0gZnJvbSAnLi9TY3JlZW5Ob2RlLmpzJztcclxuXHJcbmltcG9ydCB7IEZyYW1lYnVmZmVyVGV4dHVyZSB9IGZyb20gJy4uLy4uL3RleHR1cmVzL0ZyYW1lYnVmZmVyVGV4dHVyZS5qcyc7XHJcblxyXG5sZXQgX3NoYXJlZEZyYW1lYnVmZmVyID0gbnVsbDtcclxuXHJcbi8qKlxyXG4gKiBgVmlld3BvcnRUZXh0dXJlTm9kZWAgY3JlYXRlcyBhbiBpbnRlcm5hbCB0ZXh0dXJlIGZvciBlYWNoIG5vZGUgaW5zdGFuY2UuIFRoaXMgbW9kdWxlXHJcbiAqIHNoYXJlcyBhIHRleHR1cmUgYWNyb3NzIGFsbCBpbnN0YW5jZXMgb2YgYFZpZXdwb3J0U2hhcmVkVGV4dHVyZU5vZGVgLiBJdCBzaG91bGRcclxuICogYmUgdGhlIGZpcnN0IGNob2ljZSB3aGVuIHVzaW5nIGRhdGEgb2YgdGhlIGRlZmF1bHQvc2NyZWVuIGZyYW1lYnVmZmVyIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgVmlld3BvcnRUZXh0dXJlTm9kZVxyXG4gKi9cclxuY2xhc3MgVmlld3BvcnRTaGFyZWRUZXh0dXJlTm9kZSBleHRlbmRzIFZpZXdwb3J0VGV4dHVyZU5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdWaWV3cG9ydFNoYXJlZFRleHR1cmVOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHZpZXdwb3J0IHNoYXJlZCB0ZXh0dXJlIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV9IFt1dk5vZGU9c2NyZWVuVVZdIC0gVGhlIHV2IG5vZGUuXHJcblx0ICogQHBhcmFtIHs/Tm9kZX0gW2xldmVsTm9kZT1udWxsXSAtIFRoZSBsZXZlbCBub2RlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCB1dk5vZGUgPSBzY3JlZW5VViwgbGV2ZWxOb2RlID0gbnVsbCApIHtcclxuXHJcblx0XHRpZiAoIF9zaGFyZWRGcmFtZWJ1ZmZlciA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdF9zaGFyZWRGcmFtZWJ1ZmZlciA9IG5ldyBGcmFtZWJ1ZmZlclRleHR1cmUoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0c3VwZXIoIHV2Tm9kZSwgbGV2ZWxOb2RlLCBfc2hhcmVkRnJhbWVidWZmZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHR1cGRhdGVSZWZlcmVuY2UoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFZpZXdwb3J0U2hhcmVkVGV4dHVyZU5vZGU7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIHNoYXJlZCB2aWV3cG9ydCB0ZXh0dXJlIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7P05vZGV9IFt1dk5vZGU9c2NyZWVuVVZdIC0gVGhlIHV2IG5vZGUuXHJcbiAqIEBwYXJhbSB7P05vZGV9IFtsZXZlbE5vZGU9bnVsbF0gLSBUaGUgbGV2ZWwgbm9kZS5cclxuICogQHJldHVybnMge1ZpZXdwb3J0U2hhcmVkVGV4dHVyZU5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgdmlld3BvcnRTaGFyZWRUZXh0dXJlID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIFZpZXdwb3J0U2hhcmVkVGV4dHVyZU5vZGUgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDAsIDIgKTtcclxuIiwiaW1wb3J0IE5vZGVNYXRlcmlhbCBmcm9tICcuL05vZGVNYXRlcmlhbC5qcyc7XHJcbmltcG9ydCB7IGRhc2hTaXplLCBnYXBTaXplLCB2YXJ5aW5nUHJvcGVydHkgfSBmcm9tICcuLi8uLi9ub2Rlcy9jb3JlL1Byb3BlcnR5Tm9kZS5qcyc7XHJcbmltcG9ydCB7IGF0dHJpYnV0ZSB9IGZyb20gJy4uLy4uL25vZGVzL2NvcmUvQXR0cmlidXRlTm9kZS5qcyc7XHJcbmltcG9ydCB7IGNhbWVyYVByb2plY3Rpb25NYXRyaXggfSBmcm9tICcuLi8uLi9ub2Rlcy9hY2Nlc3NvcnMvQ2FtZXJhLmpzJztcclxuaW1wb3J0IHsgbWF0ZXJpYWxDb2xvciwgbWF0ZXJpYWxMaW5lU2NhbGUsIG1hdGVyaWFsTGluZURhc2hTaXplLCBtYXRlcmlhbExpbmVHYXBTaXplLCBtYXRlcmlhbExpbmVEYXNoT2Zmc2V0LCBtYXRlcmlhbExpbmVXaWR0aCwgbWF0ZXJpYWxPcGFjaXR5IH0gZnJvbSAnLi4vLi4vbm9kZXMvYWNjZXNzb3JzL01hdGVyaWFsTm9kZS5qcyc7XHJcbmltcG9ydCB7IG1vZGVsVmlld01hdHJpeCB9IGZyb20gJy4uLy4uL25vZGVzL2FjY2Vzc29ycy9Nb2RlbE5vZGUuanMnO1xyXG5pbXBvcnQgeyBwb3NpdGlvbkdlb21ldHJ5IH0gZnJvbSAnLi4vLi4vbm9kZXMvYWNjZXNzb3JzL1Bvc2l0aW9uLmpzJztcclxuaW1wb3J0IHsgbWl4LCBzbW9vdGhzdGVwIH0gZnJvbSAnLi4vLi4vbm9kZXMvbWF0aC9NYXRoTm9kZS5qcyc7XHJcbmltcG9ydCB7IEZuLCBmbG9hdCwgdmVjMiwgdmVjMywgdmVjNCwgSWYgfSBmcm9tICcuLi8uLi9ub2Rlcy90c2wvVFNMQmFzZS5qcyc7XHJcbmltcG9ydCB7IHV2IH0gZnJvbSAnLi4vLi4vbm9kZXMvYWNjZXNzb3JzL1VWLmpzJztcclxuaW1wb3J0IHsgdmlld3BvcnQgfSBmcm9tICcuLi8uLi9ub2Rlcy9kaXNwbGF5L1NjcmVlbk5vZGUuanMnO1xyXG5pbXBvcnQgeyB2aWV3cG9ydFNoYXJlZFRleHR1cmUgfSBmcm9tICcuLi8uLi9ub2Rlcy9kaXNwbGF5L1ZpZXdwb3J0U2hhcmVkVGV4dHVyZU5vZGUuanMnO1xyXG5cclxuaW1wb3J0IHsgTGluZURhc2hlZE1hdGVyaWFsIH0gZnJvbSAnLi4vTGluZURhc2hlZE1hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgTm9CbGVuZGluZyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcblxyXG5jb25zdCBfZGVmYXVsdFZhbHVlcyA9IC8qQF9fUFVSRV9fKi8gbmV3IExpbmVEYXNoZWRNYXRlcmlhbCgpO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgbm9kZSBtYXRlcmlhbCBjYW4gYmUgdXNlZCB0byByZW5kZXIgbGluZXMgd2l0aCBhIHNpemUgbGFyZ2VyIHRoYW4gb25lXHJcbiAqIGJ5IHJlcHJlc2VudGluZyB0aGVtIGFzIGluc3RhbmNlZCBtZXNoZXMuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBOb2RlTWF0ZXJpYWxcclxuICovXHJcbmNsYXNzIExpbmUyTm9kZU1hdGVyaWFsIGV4dGVuZHMgTm9kZU1hdGVyaWFsIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnTGluZTJOb2RlTWF0ZXJpYWwnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbm9kZSBtYXRlcmlhbCBmb3Igd2lkZSBsaW5lIHJlbmRlcmluZy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1ldGVycz17fV0gLSBUaGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHBhcmFtZXRlcnMgPSB7fSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0xpbmUyTm9kZU1hdGVyaWFsID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnNldERlZmF1bHRWYWx1ZXMoIF9kZWZhdWx0VmFsdWVzICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHZlcnRleCBjb2xvcnMgc2hvdWxkIGJlIHVzZWQgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51c2VDb2xvciA9IHBhcmFtZXRlcnMudmVydGV4Q29sb3JzO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGRhc2ggb2Zmc2V0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGFzaE9mZnNldCA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbGluZSB3aWR0aC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxpbmVXaWR0aCA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIHRoZSBsaW5lcyBjb2xvci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGU8dmVjMz59XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGluZUNvbG9yTm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIHRoZSBvZmZzZXQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPGZsb2F0Pn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5vZmZzZXROb2RlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgdGhlIGRhc2ggc2NhbGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPGZsb2F0Pn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kYXNoU2NhbGVOb2RlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgdGhlIGRhc2ggc2l6ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGU8ZmxvYXQ+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRhc2hTaXplTm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIHRoZSBnYXAgc2l6ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGU8ZmxvYXQ+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdhcFNpemVOb2RlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEJsZW5kaW5nIGlzIHNldCB0byBgTm9CbGVuZGluZ2Agc2luY2UgdHJhbnNwYXJlbmN5XHJcblx0XHQgKiBpcyBub3Qgc3VwcG9ydGVkLCB5ZXQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ibGVuZGluZyA9IE5vQmxlbmRpbmc7XHJcblxyXG5cdFx0dGhpcy5fdXNlRGFzaCA9IHBhcmFtZXRlcnMuZGFzaGVkO1xyXG5cdFx0dGhpcy5fdXNlQWxwaGFUb0NvdmVyYWdlID0gdHJ1ZTtcclxuXHRcdHRoaXMuX3VzZVdvcmxkVW5pdHMgPSBmYWxzZTtcclxuXHJcblx0XHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHVwcyB0aGUgdmVydGV4IGFuZCBmcmFnbWVudCBzdGFnZSBvZiB0aGlzIG5vZGUgbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqL1xyXG5cdHNldHVwKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IHsgcmVuZGVyZXIgfSA9IGJ1aWxkZXI7XHJcblxyXG5cdFx0Y29uc3QgdXNlQWxwaGFUb0NvdmVyYWdlID0gdGhpcy5fdXNlQWxwaGFUb0NvdmVyYWdlO1xyXG5cdFx0Y29uc3QgdXNlQ29sb3IgPSB0aGlzLnVzZUNvbG9yO1xyXG5cdFx0Y29uc3QgdXNlRGFzaCA9IHRoaXMuX3VzZURhc2g7XHJcblx0XHRjb25zdCB1c2VXb3JsZFVuaXRzID0gdGhpcy5fdXNlV29ybGRVbml0cztcclxuXHJcblx0XHRjb25zdCB0cmltU2VnbWVudCA9IEZuKCAoIHsgc3RhcnQsIGVuZCB9ICkgPT4ge1xyXG5cclxuXHRcdFx0Y29uc3QgYSA9IGNhbWVyYVByb2plY3Rpb25NYXRyaXguZWxlbWVudCggMiApLmVsZW1lbnQoIDIgKTsgLy8gM25kIGVudHJ5IGluIDN0aCBjb2x1bW5cclxuXHRcdFx0Y29uc3QgYiA9IGNhbWVyYVByb2plY3Rpb25NYXRyaXguZWxlbWVudCggMyApLmVsZW1lbnQoIDIgKTsgLy8gM25kIGVudHJ5IGluIDR0aCBjb2x1bW5cclxuXHRcdFx0Y29uc3QgbmVhckVzdGltYXRlID0gYi5tdWwoIC0gMC41ICkuZGl2KCBhICk7XHJcblxyXG5cdFx0XHRjb25zdCBhbHBoYSA9IG5lYXJFc3RpbWF0ZS5zdWIoIHN0YXJ0LnogKS5kaXYoIGVuZC56LnN1Yiggc3RhcnQueiApICk7XHJcblxyXG5cdFx0XHRyZXR1cm4gdmVjNCggbWl4KCBzdGFydC54eXosIGVuZC54eXosIGFscGhhICksIGVuZC53ICk7XHJcblxyXG5cdFx0fSApLnNldExheW91dCgge1xyXG5cdFx0XHRuYW1lOiAndHJpbVNlZ21lbnQnLFxyXG5cdFx0XHR0eXBlOiAndmVjNCcsXHJcblx0XHRcdGlucHV0czogW1xyXG5cdFx0XHRcdHsgbmFtZTogJ3N0YXJ0JywgdHlwZTogJ3ZlYzQnIH0sXHJcblx0XHRcdFx0eyBuYW1lOiAnZW5kJywgdHlwZTogJ3ZlYzQnIH1cclxuXHRcdFx0XVxyXG5cdFx0fSApO1xyXG5cclxuXHRcdHRoaXMudmVydGV4Tm9kZSA9IEZuKCAoKSA9PiB7XHJcblxyXG5cdFx0XHRjb25zdCBpbnN0YW5jZVN0YXJ0ID0gYXR0cmlidXRlKCAnaW5zdGFuY2VTdGFydCcgKTtcclxuXHRcdFx0Y29uc3QgaW5zdGFuY2VFbmQgPSBhdHRyaWJ1dGUoICdpbnN0YW5jZUVuZCcgKTtcclxuXHJcblx0XHRcdC8vIGNhbWVyYSBzcGFjZVxyXG5cclxuXHRcdFx0Y29uc3Qgc3RhcnQgPSB2ZWM0KCBtb2RlbFZpZXdNYXRyaXgubXVsKCB2ZWM0KCBpbnN0YW5jZVN0YXJ0LCAxLjAgKSApICkudG9WYXIoICdzdGFydCcgKTtcclxuXHRcdFx0Y29uc3QgZW5kID0gdmVjNCggbW9kZWxWaWV3TWF0cml4Lm11bCggdmVjNCggaW5zdGFuY2VFbmQsIDEuMCApICkgKS50b1ZhciggJ2VuZCcgKTtcclxuXHJcblx0XHRcdGlmICggdXNlRGFzaCApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgZGFzaFNjYWxlTm9kZSA9IHRoaXMuZGFzaFNjYWxlTm9kZSA/IGZsb2F0KCB0aGlzLmRhc2hTY2FsZU5vZGUgKSA6IG1hdGVyaWFsTGluZVNjYWxlO1xyXG5cdFx0XHRcdGNvbnN0IG9mZnNldE5vZGUgPSB0aGlzLm9mZnNldE5vZGUgPyBmbG9hdCggdGhpcy5vZmZzZXROb2RlICkgOiBtYXRlcmlhbExpbmVEYXNoT2Zmc2V0O1xyXG5cclxuXHRcdFx0XHRjb25zdCBpbnN0YW5jZURpc3RhbmNlU3RhcnQgPSBhdHRyaWJ1dGUoICdpbnN0YW5jZURpc3RhbmNlU3RhcnQnICk7XHJcblx0XHRcdFx0Y29uc3QgaW5zdGFuY2VEaXN0YW5jZUVuZCA9IGF0dHJpYnV0ZSggJ2luc3RhbmNlRGlzdGFuY2VFbmQnICk7XHJcblxyXG5cdFx0XHRcdGxldCBsaW5lRGlzdGFuY2UgPSBwb3NpdGlvbkdlb21ldHJ5LnkubGVzc1RoYW4oIDAuNSApLnNlbGVjdCggZGFzaFNjYWxlTm9kZS5tdWwoIGluc3RhbmNlRGlzdGFuY2VTdGFydCApLCBkYXNoU2NhbGVOb2RlLm11bCggaW5zdGFuY2VEaXN0YW5jZUVuZCApICk7XHJcblx0XHRcdFx0bGluZURpc3RhbmNlID0gbGluZURpc3RhbmNlLmFkZCggb2Zmc2V0Tm9kZSApO1xyXG5cclxuXHRcdFx0XHR2YXJ5aW5nUHJvcGVydHkoICdmbG9hdCcsICdsaW5lRGlzdGFuY2UnICkuYXNzaWduKCBsaW5lRGlzdGFuY2UgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggdXNlV29ybGRVbml0cyApIHtcclxuXHJcblx0XHRcdFx0dmFyeWluZ1Byb3BlcnR5KCAndmVjMycsICd3b3JsZFN0YXJ0JyApLmFzc2lnbiggc3RhcnQueHl6ICk7XHJcblx0XHRcdFx0dmFyeWluZ1Byb3BlcnR5KCAndmVjMycsICd3b3JsZEVuZCcgKS5hc3NpZ24oIGVuZC54eXogKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IGFzcGVjdCA9IHZpZXdwb3J0LnouZGl2KCB2aWV3cG9ydC53ICk7XHJcblxyXG5cdFx0XHQvLyBzcGVjaWFsIGNhc2UgZm9yIHBlcnNwZWN0aXZlIHByb2plY3Rpb24sIGFuZCBzZWdtZW50cyB0aGF0IHRlcm1pbmF0ZSBlaXRoZXIgaW4sIG9yIGJlaGluZCwgdGhlIGNhbWVyYSBwbGFuZVxyXG5cdFx0XHQvLyBjbGVhcmx5IHRoZSBncHUgZmlybXdhcmUgaGFzIGEgd2F5IG9mIGFkZHJlc3NpbmcgdGhpcyBpc3N1ZSB3aGVuIHByb2plY3RpbmcgaW50byBuZGMgc3BhY2VcclxuXHRcdFx0Ly8gYnV0IHdlIG5lZWQgdG8gcGVyZm9ybSBuZGMtc3BhY2UgY2FsY3VsYXRpb25zIGluIHRoZSBzaGFkZXIsIHNvIHdlIG11c3QgYWRkcmVzcyB0aGlzIGlzc3VlIGRpcmVjdGx5XHJcblx0XHRcdC8vIHBlcmhhcHMgdGhlcmUgaXMgYSBtb3JlIGVsZWdhbnQgc29sdXRpb24gLS0gV2VzdExhbmdsZXlcclxuXHJcblx0XHRcdGNvbnN0IHBlcnNwZWN0aXZlID0gY2FtZXJhUHJvamVjdGlvbk1hdHJpeC5lbGVtZW50KCAyICkuZWxlbWVudCggMyApLmVxdWFsKCAtIDEuMCApOyAvLyA0dGggZW50cnkgaW4gdGhlIDNyZCBjb2x1bW5cclxuXHJcblx0XHRcdElmKCBwZXJzcGVjdGl2ZSwgKCkgPT4ge1xyXG5cclxuXHRcdFx0XHRJZiggc3RhcnQuei5sZXNzVGhhbiggMC4wICkuYW5kKCBlbmQuei5ncmVhdGVyVGhhbiggMC4wICkgKSwgKCkgPT4ge1xyXG5cclxuXHRcdFx0XHRcdGVuZC5hc3NpZ24oIHRyaW1TZWdtZW50KCB7IHN0YXJ0OiBzdGFydCwgZW5kOiBlbmQgfSApICk7XHJcblxyXG5cdFx0XHRcdH0gKS5FbHNlSWYoIGVuZC56Lmxlc3NUaGFuKCAwLjAgKS5hbmQoIHN0YXJ0LnouZ3JlYXRlclRoYW5FcXVhbCggMC4wICkgKSwgKCkgPT4ge1xyXG5cclxuXHRcdFx0XHRcdHN0YXJ0LmFzc2lnbiggdHJpbVNlZ21lbnQoIHsgc3RhcnQ6IGVuZCwgZW5kOiBzdGFydCB9ICkgKTtcclxuXHJcblx0XHRcdCBcdH0gKTtcclxuXHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHRcdC8vIGNsaXAgc3BhY2VcclxuXHRcdFx0Y29uc3QgY2xpcFN0YXJ0ID0gY2FtZXJhUHJvamVjdGlvbk1hdHJpeC5tdWwoIHN0YXJ0ICk7XHJcblx0XHRcdGNvbnN0IGNsaXBFbmQgPSBjYW1lcmFQcm9qZWN0aW9uTWF0cml4Lm11bCggZW5kICk7XHJcblxyXG5cdFx0XHQvLyBuZGMgc3BhY2VcclxuXHRcdFx0Y29uc3QgbmRjU3RhcnQgPSBjbGlwU3RhcnQueHl6LmRpdiggY2xpcFN0YXJ0LncgKTtcclxuXHRcdFx0Y29uc3QgbmRjRW5kID0gY2xpcEVuZC54eXouZGl2KCBjbGlwRW5kLncgKTtcclxuXHJcblx0XHRcdC8vIGRpcmVjdGlvblxyXG5cdFx0XHRjb25zdCBkaXIgPSBuZGNFbmQueHkuc3ViKCBuZGNTdGFydC54eSApLnRvVmFyKCk7XHJcblxyXG5cdFx0XHQvLyBhY2NvdW50IGZvciBjbGlwLXNwYWNlIGFzcGVjdCByYXRpb1xyXG5cdFx0XHRkaXIueC5hc3NpZ24oIGRpci54Lm11bCggYXNwZWN0ICkgKTtcclxuXHRcdFx0ZGlyLmFzc2lnbiggZGlyLm5vcm1hbGl6ZSgpICk7XHJcblxyXG5cdFx0XHRjb25zdCBjbGlwID0gdmVjNCgpLnRvVmFyKCk7XHJcblxyXG5cdFx0XHRpZiAoIHVzZVdvcmxkVW5pdHMgKSB7XHJcblxyXG5cdFx0XHRcdC8vIGdldCB0aGUgb2Zmc2V0IGRpcmVjdGlvbiBhcyBwZXJwZW5kaWN1bGFyIHRvIHRoZSB2aWV3IHZlY3RvclxyXG5cclxuXHRcdFx0XHRjb25zdCB3b3JsZERpciA9IGVuZC54eXouc3ViKCBzdGFydC54eXogKS5ub3JtYWxpemUoKTtcclxuXHRcdFx0XHRjb25zdCB0bXBGd2QgPSBtaXgoIHN0YXJ0Lnh5eiwgZW5kLnh5eiwgMC41ICkubm9ybWFsaXplKCk7XHJcblx0XHRcdFx0Y29uc3Qgd29ybGRVcCA9IHdvcmxkRGlyLmNyb3NzKCB0bXBGd2QgKS5ub3JtYWxpemUoKTtcclxuXHRcdFx0XHRjb25zdCB3b3JsZEZ3ZCA9IHdvcmxkRGlyLmNyb3NzKCB3b3JsZFVwICk7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHdvcmxkUG9zID0gdmFyeWluZ1Byb3BlcnR5KCAndmVjNCcsICd3b3JsZFBvcycgKTtcclxuXHJcblx0XHRcdFx0d29ybGRQb3MuYXNzaWduKCBwb3NpdGlvbkdlb21ldHJ5LnkubGVzc1RoYW4oIDAuNSApLnNlbGVjdCggc3RhcnQsIGVuZCApICk7XHJcblxyXG5cdFx0XHRcdC8vIGhlaWdodCBvZmZzZXRcclxuXHRcdFx0XHRjb25zdCBodyA9IG1hdGVyaWFsTGluZVdpZHRoLm11bCggMC41ICk7XHJcblx0XHRcdFx0d29ybGRQb3MuYWRkQXNzaWduKCB2ZWM0KCBwb3NpdGlvbkdlb21ldHJ5LngubGVzc1RoYW4oIDAuMCApLnNlbGVjdCggd29ybGRVcC5tdWwoIGh3ICksIHdvcmxkVXAubXVsKCBodyApLm5lZ2F0ZSgpICksIDAgKSApO1xyXG5cclxuXHRcdFx0XHQvLyBkb24ndCBleHRlbmQgdGhlIGxpbmUgaWYgd2UncmUgcmVuZGVyaW5nIGRhc2hlcyBiZWNhdXNlIHdlXHJcblx0XHRcdFx0Ly8gd29uJ3QgYmUgcmVuZGVyaW5nIHRoZSBlbmRjYXBzXHJcblx0XHRcdFx0aWYgKCAhIHVzZURhc2ggKSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gY2FwIGV4dGVuc2lvblxyXG5cdFx0XHRcdFx0d29ybGRQb3MuYWRkQXNzaWduKCB2ZWM0KCBwb3NpdGlvbkdlb21ldHJ5LnkubGVzc1RoYW4oIDAuNSApLnNlbGVjdCggd29ybGREaXIubXVsKCBodyApLm5lZ2F0ZSgpLCB3b3JsZERpci5tdWwoIGh3ICkgKSwgMCApICk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gYWRkIHdpZHRoIHRvIHRoZSBib3hcclxuXHRcdFx0XHRcdHdvcmxkUG9zLmFkZEFzc2lnbiggdmVjNCggd29ybGRGd2QubXVsKCBodyApLCAwICkgKTtcclxuXHJcblx0XHRcdFx0XHQvLyBlbmRjYXBzXHJcblx0XHRcdFx0XHRJZiggcG9zaXRpb25HZW9tZXRyeS55LmdyZWF0ZXJUaGFuKCAxLjAgKS5vciggcG9zaXRpb25HZW9tZXRyeS55Lmxlc3NUaGFuKCAwLjAgKSApLCAoKSA9PiB7XHJcblxyXG5cdFx0XHRcdFx0XHR3b3JsZFBvcy5zdWJBc3NpZ24oIHZlYzQoIHdvcmxkRndkLm11bCggMi4wICkubXVsKCBodyApLCAwICkgKTtcclxuXHJcblx0XHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Ly8gcHJvamVjdCB0aGUgd29ybGRwb3NcclxuXHRcdFx0XHRjbGlwLmFzc2lnbiggY2FtZXJhUHJvamVjdGlvbk1hdHJpeC5tdWwoIHdvcmxkUG9zICkgKTtcclxuXHJcblx0XHRcdFx0Ly8gc2hpZnQgdGhlIGRlcHRoIG9mIHRoZSBwcm9qZWN0ZWQgcG9pbnRzIHNvIHRoZSBsaW5lXHJcblx0XHRcdFx0Ly8gc2VnbWVudHMgb3ZlcmxhcCBuZWF0bHlcclxuXHRcdFx0XHRjb25zdCBjbGlwUG9zZSA9IHZlYzMoKS50b1ZhcigpO1xyXG5cclxuXHRcdFx0XHRjbGlwUG9zZS5hc3NpZ24oIHBvc2l0aW9uR2VvbWV0cnkueS5sZXNzVGhhbiggMC41ICkuc2VsZWN0KCBuZGNTdGFydCwgbmRjRW5kICkgKTtcclxuXHRcdFx0XHRjbGlwLnouYXNzaWduKCBjbGlwUG9zZS56Lm11bCggY2xpcC53ICkgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IG9mZnNldCA9IHZlYzIoIGRpci55LCBkaXIueC5uZWdhdGUoKSApLnRvVmFyKCAnb2Zmc2V0JyApO1xyXG5cclxuXHRcdFx0XHQvLyB1bmRvIGFzcGVjdCByYXRpbyBhZGp1c3RtZW50XHJcblx0XHRcdFx0ZGlyLnguYXNzaWduKCBkaXIueC5kaXYoIGFzcGVjdCApICk7XHJcblx0XHRcdFx0b2Zmc2V0LnguYXNzaWduKCBvZmZzZXQueC5kaXYoIGFzcGVjdCApICk7XHJcblxyXG5cdFx0XHRcdC8vIHNpZ24gZmxpcFxyXG5cdFx0XHRcdG9mZnNldC5hc3NpZ24oIHBvc2l0aW9uR2VvbWV0cnkueC5sZXNzVGhhbiggMC4wICkuc2VsZWN0KCBvZmZzZXQubmVnYXRlKCksIG9mZnNldCApICk7XHJcblxyXG5cdFx0XHRcdC8vIGVuZGNhcHNcclxuXHRcdFx0XHRJZiggcG9zaXRpb25HZW9tZXRyeS55Lmxlc3NUaGFuKCAwLjAgKSwgKCkgPT4ge1xyXG5cclxuXHRcdFx0XHRcdG9mZnNldC5hc3NpZ24oIG9mZnNldC5zdWIoIGRpciApICk7XHJcblxyXG5cdFx0XHRcdH0gKS5FbHNlSWYoIHBvc2l0aW9uR2VvbWV0cnkueS5ncmVhdGVyVGhhbiggMS4wICksICgpID0+IHtcclxuXHJcblx0XHRcdFx0XHRvZmZzZXQuYXNzaWduKCBvZmZzZXQuYWRkKCBkaXIgKSApO1xyXG5cclxuXHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRcdC8vIGFkanVzdCBmb3IgbGluZXdpZHRoXHJcblx0XHRcdFx0b2Zmc2V0LmFzc2lnbiggb2Zmc2V0Lm11bCggbWF0ZXJpYWxMaW5lV2lkdGggKSApO1xyXG5cclxuXHRcdFx0XHQvLyBhZGp1c3QgZm9yIGNsaXAtc3BhY2UgdG8gc2NyZWVuLXNwYWNlIGNvbnZlcnNpb24gLy8gbWF5YmUgcmVzb2x1dGlvbiBzaG91bGQgYmUgYmFzZWQgb24gdmlld3BvcnQgLi4uXHJcblx0XHRcdFx0b2Zmc2V0LmFzc2lnbiggb2Zmc2V0LmRpdiggdmlld3BvcnQudyApICk7XHJcblxyXG5cdFx0XHRcdC8vIHNlbGVjdCBlbmRcclxuXHRcdFx0XHRjbGlwLmFzc2lnbiggcG9zaXRpb25HZW9tZXRyeS55Lmxlc3NUaGFuKCAwLjUgKS5zZWxlY3QoIGNsaXBTdGFydCwgY2xpcEVuZCApICk7XHJcblxyXG5cdFx0XHRcdC8vIGJhY2sgdG8gY2xpcCBzcGFjZVxyXG5cdFx0XHRcdG9mZnNldC5hc3NpZ24oIG9mZnNldC5tdWwoIGNsaXAudyApICk7XHJcblxyXG5cdFx0XHRcdGNsaXAuYXNzaWduKCBjbGlwLmFkZCggdmVjNCggb2Zmc2V0LCAwLCAwICkgKSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIGNsaXA7XHJcblxyXG5cdFx0fSApKCk7XHJcblxyXG5cdFx0Y29uc3QgY2xvc2VzdExpbmVUb0xpbmUgPSBGbiggKCB7IHAxLCBwMiwgcDMsIHA0IH0gKSA9PiB7XHJcblxyXG5cdFx0XHRjb25zdCBwMTMgPSBwMS5zdWIoIHAzICk7XHJcblx0XHRcdGNvbnN0IHA0MyA9IHA0LnN1YiggcDMgKTtcclxuXHJcblx0XHRcdGNvbnN0IHAyMSA9IHAyLnN1YiggcDEgKTtcclxuXHJcblx0XHRcdGNvbnN0IGQxMzQzID0gcDEzLmRvdCggcDQzICk7XHJcblx0XHRcdGNvbnN0IGQ0MzIxID0gcDQzLmRvdCggcDIxICk7XHJcblx0XHRcdGNvbnN0IGQxMzIxID0gcDEzLmRvdCggcDIxICk7XHJcblx0XHRcdGNvbnN0IGQ0MzQzID0gcDQzLmRvdCggcDQzICk7XHJcblx0XHRcdGNvbnN0IGQyMTIxID0gcDIxLmRvdCggcDIxICk7XHJcblxyXG5cdFx0XHRjb25zdCBkZW5vbSA9IGQyMTIxLm11bCggZDQzNDMgKS5zdWIoIGQ0MzIxLm11bCggZDQzMjEgKSApO1xyXG5cdFx0XHRjb25zdCBudW1lciA9IGQxMzQzLm11bCggZDQzMjEgKS5zdWIoIGQxMzIxLm11bCggZDQzNDMgKSApO1xyXG5cclxuXHRcdFx0Y29uc3QgbXVhID0gbnVtZXIuZGl2KCBkZW5vbSApLmNsYW1wKCk7XHJcblx0XHRcdGNvbnN0IG11YiA9IGQxMzQzLmFkZCggZDQzMjEubXVsKCBtdWEgKSApLmRpdiggZDQzNDMgKS5jbGFtcCgpO1xyXG5cclxuXHRcdFx0cmV0dXJuIHZlYzIoIG11YSwgbXViICk7XHJcblxyXG5cdFx0fSApO1xyXG5cclxuXHRcdHRoaXMuY29sb3JOb2RlID0gRm4oICgpID0+IHtcclxuXHJcblx0XHRcdGNvbnN0IHZVdiA9IHV2KCk7XHJcblxyXG5cdFx0XHRpZiAoIHVzZURhc2ggKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGRhc2hTaXplTm9kZSA9IHRoaXMuZGFzaFNpemVOb2RlID8gZmxvYXQoIHRoaXMuZGFzaFNpemVOb2RlICkgOiBtYXRlcmlhbExpbmVEYXNoU2l6ZTtcclxuXHRcdFx0XHRjb25zdCBnYXBTaXplTm9kZSA9IHRoaXMuZ2FwU2l6ZU5vZGUgPyBmbG9hdCggdGhpcy5nYXBTaXplTm9kZSApIDogbWF0ZXJpYWxMaW5lR2FwU2l6ZTtcclxuXHJcblx0XHRcdFx0ZGFzaFNpemUuYXNzaWduKCBkYXNoU2l6ZU5vZGUgKTtcclxuXHRcdFx0XHRnYXBTaXplLmFzc2lnbiggZ2FwU2l6ZU5vZGUgKTtcclxuXHJcblx0XHRcdFx0Y29uc3QgdkxpbmVEaXN0YW5jZSA9IHZhcnlpbmdQcm9wZXJ0eSggJ2Zsb2F0JywgJ2xpbmVEaXN0YW5jZScgKTtcclxuXHJcblx0XHRcdFx0dlV2LnkubGVzc1RoYW4oIC0gMS4wICkub3IoIHZVdi55LmdyZWF0ZXJUaGFuKCAxLjAgKSApLmRpc2NhcmQoKTsgLy8gZGlzY2FyZCBlbmRjYXBzXHJcblx0XHRcdFx0dkxpbmVEaXN0YW5jZS5tb2QoIGRhc2hTaXplLmFkZCggZ2FwU2l6ZSApICkuZ3JlYXRlclRoYW4oIGRhc2hTaXplICkuZGlzY2FyZCgpOyAvLyB0b2RvIC0gRklYXHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBhbHBoYSA9IGZsb2F0KCAxICkudG9WYXIoICdhbHBoYScgKTtcclxuXHJcblx0XHRcdGlmICggdXNlV29ybGRVbml0cyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3Qgd29ybGRTdGFydCA9IHZhcnlpbmdQcm9wZXJ0eSggJ3ZlYzMnLCAnd29ybGRTdGFydCcgKTtcclxuXHRcdFx0XHRjb25zdCB3b3JsZEVuZCA9IHZhcnlpbmdQcm9wZXJ0eSggJ3ZlYzMnLCAnd29ybGRFbmQnICk7XHJcblxyXG5cdFx0XHRcdC8vIEZpbmQgdGhlIGNsb3Nlc3QgcG9pbnRzIG9uIHRoZSB2aWV3IHJheSBhbmQgdGhlIGxpbmUgc2VnbWVudFxyXG5cdFx0XHRcdGNvbnN0IHJheUVuZCA9IHZhcnlpbmdQcm9wZXJ0eSggJ3ZlYzQnLCAnd29ybGRQb3MnICkueHl6Lm5vcm1hbGl6ZSgpLm11bCggMWU1ICk7XHJcblx0XHRcdFx0Y29uc3QgbGluZURpciA9IHdvcmxkRW5kLnN1Yiggd29ybGRTdGFydCApO1xyXG5cdFx0XHRcdGNvbnN0IHBhcmFtcyA9IGNsb3Nlc3RMaW5lVG9MaW5lKCB7IHAxOiB3b3JsZFN0YXJ0LCBwMjogd29ybGRFbmQsIHAzOiB2ZWMzKCAwLjAsIDAuMCwgMC4wICksIHA0OiByYXlFbmQgfSApO1xyXG5cclxuXHRcdFx0XHRjb25zdCBwMSA9IHdvcmxkU3RhcnQuYWRkKCBsaW5lRGlyLm11bCggcGFyYW1zLnggKSApO1xyXG5cdFx0XHRcdGNvbnN0IHAyID0gcmF5RW5kLm11bCggcGFyYW1zLnkgKTtcclxuXHRcdFx0XHRjb25zdCBkZWx0YSA9IHAxLnN1YiggcDIgKTtcclxuXHRcdFx0XHRjb25zdCBsZW4gPSBkZWx0YS5sZW5ndGgoKTtcclxuXHRcdFx0XHRjb25zdCBub3JtID0gbGVuLmRpdiggbWF0ZXJpYWxMaW5lV2lkdGggKTtcclxuXHJcblx0XHRcdFx0aWYgKCAhIHVzZURhc2ggKSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCB1c2VBbHBoYVRvQ292ZXJhZ2UgJiYgcmVuZGVyZXIuc2FtcGxlcyA+IDEgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCBkbm9ybSA9IG5vcm0uZndpZHRoKCk7XHJcblx0XHRcdFx0XHRcdGFscGhhLmFzc2lnbiggc21vb3Roc3RlcCggZG5vcm0ubmVnYXRlKCkuYWRkKCAwLjUgKSwgZG5vcm0uYWRkKCAwLjUgKSwgbm9ybSApLm9uZU1pbnVzKCkgKTtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0bm9ybS5ncmVhdGVyVGhhbiggMC41ICkuZGlzY2FyZCgpO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0Ly8gcm91bmQgZW5kY2Fwc1xyXG5cclxuXHRcdFx0XHRpZiAoIHVzZUFscGhhVG9Db3ZlcmFnZSAmJiByZW5kZXJlci5zYW1wbGVzID4gMSApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBhID0gdlV2Lng7XHJcblx0XHRcdFx0XHRjb25zdCBiID0gdlV2LnkuZ3JlYXRlclRoYW4oIDAuMCApLnNlbGVjdCggdlV2Lnkuc3ViKCAxLjAgKSwgdlV2LnkuYWRkKCAxLjAgKSApO1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGxlbjIgPSBhLm11bCggYSApLmFkZCggYi5tdWwoIGIgKSApO1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGRsZW4gPSBmbG9hdCggbGVuMi5md2lkdGgoKSApLnRvVmFyKCAnZGxlbicgKTtcclxuXHJcblx0XHRcdFx0XHRJZiggdlV2LnkuYWJzKCkuZ3JlYXRlclRoYW4oIDEuMCApLCAoKSA9PiB7XHJcblxyXG5cdFx0XHRcdFx0XHRhbHBoYS5hc3NpZ24oIHNtb290aHN0ZXAoIGRsZW4ub25lTWludXMoKSwgZGxlbi5hZGQoIDEgKSwgbGVuMiApLm9uZU1pbnVzKCkgKTtcclxuXHJcblx0XHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0SWYoIHZVdi55LmFicygpLmdyZWF0ZXJUaGFuKCAxLjAgKSwgKCkgPT4ge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgYSA9IHZVdi54O1xyXG5cdFx0XHRcdFx0XHRjb25zdCBiID0gdlV2LnkuZ3JlYXRlclRoYW4oIDAuMCApLnNlbGVjdCggdlV2Lnkuc3ViKCAxLjAgKSwgdlV2LnkuYWRkKCAxLjAgKSApO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBsZW4yID0gYS5tdWwoIGEgKS5hZGQoIGIubXVsKCBiICkgKTtcclxuXHJcblx0XHRcdFx0XHRcdGxlbjIuZ3JlYXRlclRoYW4oIDEuMCApLmRpc2NhcmQoKTtcclxuXHJcblx0XHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGxldCBsaW5lQ29sb3JOb2RlO1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLmxpbmVDb2xvck5vZGUgKSB7XHJcblxyXG5cdFx0XHRcdGxpbmVDb2xvck5vZGUgPSB0aGlzLmxpbmVDb2xvck5vZGU7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRpZiAoIHVzZUNvbG9yICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGluc3RhbmNlQ29sb3JTdGFydCA9IGF0dHJpYnV0ZSggJ2luc3RhbmNlQ29sb3JTdGFydCcgKTtcclxuXHRcdFx0XHRcdGNvbnN0IGluc3RhbmNlQ29sb3JFbmQgPSBhdHRyaWJ1dGUoICdpbnN0YW5jZUNvbG9yRW5kJyApO1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGluc3RhbmNlQ29sb3IgPSBwb3NpdGlvbkdlb21ldHJ5LnkubGVzc1RoYW4oIDAuNSApLnNlbGVjdCggaW5zdGFuY2VDb2xvclN0YXJ0LCBpbnN0YW5jZUNvbG9yRW5kICk7XHJcblxyXG5cdFx0XHRcdFx0bGluZUNvbG9yTm9kZSA9IGluc3RhbmNlQ29sb3IubXVsKCBtYXRlcmlhbENvbG9yICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0bGluZUNvbG9yTm9kZSA9IG1hdGVyaWFsQ29sb3I7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiB2ZWM0KCBsaW5lQ29sb3JOb2RlLCBhbHBoYSApO1xyXG5cclxuXHRcdH0gKSgpO1xyXG5cclxuXHRcdGlmICggdGhpcy50cmFuc3BhcmVudCApIHtcclxuXHJcblx0XHRcdGNvbnN0IG9wYWNpdHlOb2RlID0gdGhpcy5vcGFjaXR5Tm9kZSA/IGZsb2F0KCB0aGlzLm9wYWNpdHlOb2RlICkgOiBtYXRlcmlhbE9wYWNpdHk7XHJcblxyXG5cdFx0XHR0aGlzLm91dHB1dE5vZGUgPSB2ZWM0KCB0aGlzLmNvbG9yTm9kZS5yZ2IubXVsKCBvcGFjaXR5Tm9kZSApLmFkZCggdmlld3BvcnRTaGFyZWRUZXh0dXJlKCkucmdiLm11bCggb3BhY2l0eU5vZGUub25lTWludXMoKSApICksIHRoaXMuY29sb3JOb2RlLmEgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0c3VwZXIuc2V0dXAoIGJ1aWxkZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBXaGV0aGVyIHRoZSBsaW5lcyBzaG91bGQgc2l6ZWQgaW4gd29ybGQgdW5pdHMgb3Igbm90LlxyXG5cdCAqIFdoZW4gc2V0IHRvIGBmYWxzZWAgdGhlIHVuaXQgaXMgcGl4ZWwuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdCAqL1xyXG5cdGdldCB3b3JsZFVuaXRzKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl91c2VXb3JsZFVuaXRzO1xyXG5cclxuXHR9XHJcblxyXG5cdHNldCB3b3JsZFVuaXRzKCB2YWx1ZSApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuX3VzZVdvcmxkVW5pdHMgIT09IHZhbHVlICkge1xyXG5cclxuXHRcdFx0dGhpcy5fdXNlV29ybGRVbml0cyA9IHZhbHVlO1xyXG5cdFx0XHR0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogV2hldGhlciB0aGUgbGluZXMgc2hvdWxkIGJlIGRhc2hlZCBvciBub3QuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdCAqL1xyXG5cdGdldCBkYXNoZWQoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX3VzZURhc2g7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0IGRhc2hlZCggdmFsdWUgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl91c2VEYXNoICE9PSB2YWx1ZSApIHtcclxuXHJcblx0XHRcdHRoaXMuX3VzZURhc2ggPSB2YWx1ZTtcclxuXHRcdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdoZXRoZXIgYWxwaGEgdG8gY292ZXJhZ2Ugc2hvdWxkIGJlIHVzZWQgb3Igbm90LlxyXG5cdCAqXHJcblx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdCAqL1xyXG5cdGdldCBhbHBoYVRvQ292ZXJhZ2UoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX3VzZUFscGhhVG9Db3ZlcmFnZTtcclxuXHJcblx0fVxyXG5cclxuXHRzZXQgYWxwaGFUb0NvdmVyYWdlKCB2YWx1ZSApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuX3VzZUFscGhhVG9Db3ZlcmFnZSAhPT0gdmFsdWUgKSB7XHJcblxyXG5cdFx0XHR0aGlzLl91c2VBbHBoYVRvQ292ZXJhZ2UgPSB2YWx1ZTtcclxuXHRcdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBMaW5lMk5vZGVNYXRlcmlhbDtcclxuIiwiaW1wb3J0IHsgbm9kZU9iamVjdCB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBQYWNrcyBhIGRpcmVjdGlvbiB2ZWN0b3IgaW50byBhIGNvbG9yIHZhbHVlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGU8dmVjMz59IG5vZGUgLSBUaGUgZGlyZWN0aW9uIHRvIHBhY2suXHJcbiAqIEByZXR1cm4ge05vZGU8dmVjMz59IFRoZSBjb2xvci5cclxuICovXHJcbmV4cG9ydCBjb25zdCBkaXJlY3Rpb25Ub0NvbG9yID0gKCBub2RlICkgPT4gbm9kZU9iamVjdCggbm9kZSApLm11bCggMC41ICkuYWRkKCAwLjUgKTtcclxuXHJcbi8qKlxyXG4gKiBVbnBhY2tzIGEgY29sb3IgdmFsdWUgaW50byBhIGRpcmVjdGlvbiB2ZWN0b3IuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMzPn0gbm9kZSAtIFRoZSBjb2xvciB0byB1bnBhY2suXHJcbiAqIEByZXR1cm4ge05vZGU8dmVjMz59IFRoZSBkaXJlY3Rpb24uXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgY29sb3JUb0RpcmVjdGlvbiA9ICggbm9kZSApID0+IG5vZGVPYmplY3QoIG5vZGUgKS5tdWwoIDIuMCApLnN1YiggMSApO1xyXG4iLCJpbXBvcnQgTm9kZU1hdGVyaWFsIGZyb20gJy4vTm9kZU1hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgZGlmZnVzZUNvbG9yIH0gZnJvbSAnLi4vLi4vbm9kZXMvY29yZS9Qcm9wZXJ0eU5vZGUuanMnO1xyXG5pbXBvcnQgeyBkaXJlY3Rpb25Ub0NvbG9yIH0gZnJvbSAnLi4vLi4vbm9kZXMvdXRpbHMvUGFja2luZy5qcyc7XHJcbmltcG9ydCB7IG1hdGVyaWFsT3BhY2l0eSB9IGZyb20gJy4uLy4uL25vZGVzL2FjY2Vzc29ycy9NYXRlcmlhbE5vZGUuanMnO1xyXG5pbXBvcnQgeyB0cmFuc2Zvcm1lZE5vcm1hbFZpZXcgfSBmcm9tICcuLi8uLi9ub2Rlcy9hY2Nlc3NvcnMvTm9ybWFsLmpzJztcclxuaW1wb3J0IHsgY29sb3JTcGFjZVRvV29ya2luZyB9IGZyb20gJy4uLy4uL25vZGVzL2Rpc3BsYXkvQ29sb3JTcGFjZU5vZGUuanMnO1xyXG5pbXBvcnQgeyBmbG9hdCwgdmVjNCB9IGZyb20gJy4uLy4uL25vZGVzL3RzbC9UU0xCYXNlLmpzJztcclxuaW1wb3J0IHsgU1JHQkNvbG9yU3BhY2UgfSBmcm9tICcuLi8uLi9jb25zdGFudHMuanMnO1xyXG5cclxuaW1wb3J0IHsgTWVzaE5vcm1hbE1hdGVyaWFsIH0gZnJvbSAnLi4vTWVzaE5vcm1hbE1hdGVyaWFsLmpzJztcclxuXHJcbmNvbnN0IF9kZWZhdWx0VmFsdWVzID0gLypAX19QVVJFX18qLyBuZXcgTWVzaE5vcm1hbE1hdGVyaWFsKCk7XHJcblxyXG4vKipcclxuICogTm9kZSBtYXRlcmlhbCB2ZXJzaW9uIG9mIHtAbGluayBNZXNoTm9ybWFsTWF0ZXJpYWx9LlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTm9kZU1hdGVyaWFsXHJcbiAqL1xyXG5jbGFzcyBNZXNoTm9ybWFsTm9kZU1hdGVyaWFsIGV4dGVuZHMgTm9kZU1hdGVyaWFsIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnTWVzaE5vcm1hbE5vZGVNYXRlcmlhbCc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBtZXNoIG5vcm1hbCBub2RlIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbWV0ZXJzXSAtIFRoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVycyApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc01lc2hOb3JtYWxOb2RlTWF0ZXJpYWwgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMuc2V0RGVmYXVsdFZhbHVlcyggX2RlZmF1bHRWYWx1ZXMgKTtcclxuXHJcblx0XHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE92ZXJ3cml0ZXMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gYnkgY29tcHV0aW5nIHRoZSBkaWZmdXNlIGNvbG9yXHJcblx0ICogYmFzZWQgb24gdGhlIG5vcm1hbCBkYXRhLlxyXG5cdCAqL1xyXG5cdHNldHVwRGlmZnVzZUNvbG9yKCkge1xyXG5cclxuXHRcdGNvbnN0IG9wYWNpdHlOb2RlID0gdGhpcy5vcGFjaXR5Tm9kZSA/IGZsb2F0KCB0aGlzLm9wYWNpdHlOb2RlICkgOiBtYXRlcmlhbE9wYWNpdHk7XHJcblxyXG5cdFx0Ly8gQnkgY29udmVudGlvbiwgYSBub3JtYWwgcGFja2VkIHRvIFJHQiBpcyBpbiBzUkdCIGNvbG9yIHNwYWNlLiBDb252ZXJ0IGl0IHRvIHdvcmtpbmcgY29sb3Igc3BhY2UuXHJcblxyXG5cdFx0ZGlmZnVzZUNvbG9yLmFzc2lnbiggY29sb3JTcGFjZVRvV29ya2luZyggdmVjNCggZGlyZWN0aW9uVG9Db2xvciggdHJhbnNmb3JtZWROb3JtYWxWaWV3ICksIG9wYWNpdHlOb2RlICksIFNSR0JDb2xvclNwYWNlICkgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTWVzaE5vcm1hbE5vZGVNYXRlcmlhbDtcclxuIiwiaW1wb3J0IFRlbXBOb2RlIGZyb20gJy4uL2NvcmUvVGVtcE5vZGUuanMnO1xyXG5pbXBvcnQgeyBwb3NpdGlvbldvcmxkRGlyZWN0aW9uIH0gZnJvbSAnLi4vYWNjZXNzb3JzL1Bvc2l0aW9uLmpzJztcclxuaW1wb3J0IHsgbm9kZVByb3h5LCB2ZWMyIH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5cclxuLyoqXHJcbiAqIENhbiBiZSB1c2VkIHRvIGNvbXB1dGUgdGV4dHVyZSBjb29yZGluYXRlcyBmb3IgcHJvamVjdGluZyBhblxyXG4gKiBlcXVpcmVjdGFuZ3VsYXIgdGV4dHVyZSBvbnRvIGEgbWVzaCBmb3IgdXNpbmcgaXQgYXMgdGhlIHNjZW5lJ3NcclxuICogYmFja2dyb3VuZC5cclxuICpcclxuICogYGBganNcclxuICogc2NlbmUuYmFja2dyb3VuZE5vZGUgPSB0ZXh0dXJlKCBlcXVpcmVjdFRleHR1cmUsIGVxdWlyZWN0VVYoKSApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIFRlbXBOb2RlXHJcbiAqL1xyXG5jbGFzcyBFcXVpcmVjdFVWTm9kZSBleHRlbmRzIFRlbXBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnRXF1aXJlY3RVVk5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgZXF1aXJlY3QgdXYgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZTx2ZWMzPn0gW2Rpck5vZGU9cG9zaXRpb25Xb3JsZERpcmVjdGlvbl0gLSBBIGRpcmVjdGlvbiB2ZWN0b3IgZm9yIHNhbXBsaW5nIHdoaWNoIGlzIGJ5IGRlZmF1bHQgYHBvc2l0aW9uV29ybGREaXJlY3Rpb25gLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBkaXJOb2RlID0gcG9zaXRpb25Xb3JsZERpcmVjdGlvbiApIHtcclxuXHJcblx0XHRzdXBlciggJ3ZlYzInICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGRpcmVjdGlvbiB2ZWN0b3IgZm9yIHNhbXBsaW5nIHdoeSBpcyBieSBkZWZhdWx0IGBwb3NpdGlvbldvcmxkRGlyZWN0aW9uYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZTx2ZWMzPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kaXJOb2RlID0gZGlyTm9kZTtcclxuXHJcblx0fVxyXG5cclxuXHRzZXR1cCgpIHtcclxuXHJcblx0XHRjb25zdCBkaXIgPSB0aGlzLmRpck5vZGU7XHJcblxyXG5cdFx0Y29uc3QgdSA9IGRpci56LmF0YW4oIGRpci54ICkubXVsKCAxIC8gKCBNYXRoLlBJICogMiApICkuYWRkKCAwLjUgKTtcclxuXHRcdGNvbnN0IHYgPSBkaXIueS5jbGFtcCggLSAxLjAsIDEuMCApLmFzaW4oKS5tdWwoIDEgLyBNYXRoLlBJICkuYWRkKCAwLjUgKTtcclxuXHJcblx0XHRyZXR1cm4gdmVjMiggdSwgdiApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBFcXVpcmVjdFVWTm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGFuIGVxdWlyZWN0IHV2IG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7P05vZGU8dmVjMz59IFtkaXJOb2RlPXBvc2l0aW9uV29ybGREaXJlY3Rpb25dIC0gQSBkaXJlY3Rpb24gdmVjdG9yIGZvciBzYW1wbGluZyB3aGljaCBpcyBieSBkZWZhdWx0IGBwb3NpdGlvbldvcmxkRGlyZWN0aW9uYC5cclxuICogQHJldHVybnMge0VxdWlyZWN0VVZOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGVxdWlyZWN0VVYgPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggRXF1aXJlY3RVVk5vZGUgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDAsIDEgKTtcclxuIiwiaW1wb3J0IHsgZXF1aXJlY3RVViB9IGZyb20gJy4uLy4uL25vZGVzL3V0aWxzL0VxdWlyZWN0VVZOb2RlLmpzJztcclxuaW1wb3J0IHsgdGV4dHVyZSBhcyBUU0xfVGV4dHVyZSB9IGZyb20gJy4uLy4uL25vZGVzL2FjY2Vzc29ycy9UZXh0dXJlTm9kZS5qcyc7XHJcbmltcG9ydCB7IHBvc2l0aW9uV29ybGREaXJlY3Rpb24gfSBmcm9tICcuLi8uLi9ub2Rlcy9hY2Nlc3NvcnMvUG9zaXRpb24uanMnO1xyXG5pbXBvcnQgTm9kZU1hdGVyaWFsIGZyb20gJy4uLy4uL21hdGVyaWFscy9ub2Rlcy9Ob2RlTWF0ZXJpYWwuanMnO1xyXG5cclxuaW1wb3J0IHsgV2ViR0xDdWJlUmVuZGVyVGFyZ2V0IH0gZnJvbSAnLi4vLi4vcmVuZGVyZXJzL1dlYkdMQ3ViZVJlbmRlclRhcmdldC5qcyc7XHJcbmltcG9ydCB7IFNjZW5lIH0gZnJvbSAnLi4vLi4vc2NlbmVzL1NjZW5lLmpzJztcclxuaW1wb3J0IHsgQ3ViZUNhbWVyYSB9IGZyb20gJy4uLy4uL2NhbWVyYXMvQ3ViZUNhbWVyYS5qcyc7XHJcbmltcG9ydCB7IEJveEdlb21ldHJ5IH0gZnJvbSAnLi4vLi4vZ2VvbWV0cmllcy9Cb3hHZW9tZXRyeS5qcyc7XHJcbmltcG9ydCB7IE1lc2ggfSBmcm9tICcuLi8uLi9vYmplY3RzL01lc2guanMnO1xyXG5pbXBvcnQgeyBCYWNrU2lkZSwgTm9CbGVuZGluZywgTGluZWFyRmlsdGVyLCBMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXIgfSBmcm9tICcuLi8uLi9jb25zdGFudHMuanMnO1xyXG5cclxuLy8gQFRPRE86IENvbnNpZGVyIHJlbmFtZSBXZWJHTEN1YmVSZW5kZXJUYXJnZXQgdG8ganVzdCBDdWJlUmVuZGVyVGFyZ2V0XHJcblxyXG4vKipcclxuICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgY3ViZSByZW5kZXIgdGFyZ2V0LiBJdCBpcyBhIHNwZWNpYWwgdmVyc2lvblxyXG4gKiBvZiBgV2ViR0xDdWJlUmVuZGVyVGFyZ2V0YCB3aGljaCBpcyBjb21wYXRpYmxlIHdpdGggYFdlYkdQVVJlbmRlcmVyYC5cclxuICpcclxuICogQGF1Z21lbnRzIFdlYkdMQ3ViZVJlbmRlclRhcmdldFxyXG4gKi9cclxuY2xhc3MgQ3ViZVJlbmRlclRhcmdldCBleHRlbmRzIFdlYkdMQ3ViZVJlbmRlclRhcmdldCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgY3ViZSByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtzaXplPTFdIC0gVGhlIHNpemUgb2YgdGhlIHJlbmRlciB0YXJnZXQuXHJcblx0ICogQHBhcmFtIHtSZW5kZXJUYXJnZXR+T3B0aW9uc30gW29wdGlvbnNdIC0gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBzaXplID0gMSwgb3B0aW9ucyA9IHt9ICkge1xyXG5cclxuXHRcdHN1cGVyKCBzaXplLCBvcHRpb25zICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzQ3ViZVJlbmRlclRhcmdldCA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29udmVydHMgdGhlIGdpdmVuIGVxdWlyZWN0YW5ndWxhciB0ZXh0dXJlIHRvIGEgY3ViZSBtYXAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgZXF1aXJlY3Rhbmd1bGFyIHRleHR1cmUuXHJcblx0ICogQHJldHVybiB7Q3ViZVJlbmRlclRhcmdldH0gQSByZWZlcmVuY2UgdG8gdGhpcyBjdWJlIHJlbmRlciB0YXJnZXQuXHJcblx0ICovXHJcblx0ZnJvbUVxdWlyZWN0YW5ndWxhclRleHR1cmUoIHJlbmRlcmVyLCB0ZXh0dXJlICkge1xyXG5cclxuXHRcdGNvbnN0IGN1cnJlbnRNaW5GaWx0ZXIgPSB0ZXh0dXJlLm1pbkZpbHRlcjtcclxuXHRcdGNvbnN0IGN1cnJlbnRHZW5lcmF0ZU1pcG1hcHMgPSB0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcztcclxuXHJcblx0XHR0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50ZXh0dXJlLnR5cGUgPSB0ZXh0dXJlLnR5cGU7XHJcblx0XHR0aGlzLnRleHR1cmUuY29sb3JTcGFjZSA9IHRleHR1cmUuY29sb3JTcGFjZTtcclxuXHJcblx0XHR0aGlzLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gdGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM7XHJcblx0XHR0aGlzLnRleHR1cmUubWluRmlsdGVyID0gdGV4dHVyZS5taW5GaWx0ZXI7XHJcblx0XHR0aGlzLnRleHR1cmUubWFnRmlsdGVyID0gdGV4dHVyZS5tYWdGaWx0ZXI7XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSBuZXcgQm94R2VvbWV0cnkoIDUsIDUsIDUgKTtcclxuXHJcblx0XHRjb25zdCB1dk5vZGUgPSBlcXVpcmVjdFVWKCBwb3NpdGlvbldvcmxkRGlyZWN0aW9uICk7XHJcblxyXG5cdFx0Y29uc3QgbWF0ZXJpYWwgPSBuZXcgTm9kZU1hdGVyaWFsKCk7XHJcblx0XHRtYXRlcmlhbC5jb2xvck5vZGUgPSBUU0xfVGV4dHVyZSggdGV4dHVyZSwgdXZOb2RlLCAwICk7XHJcblx0XHRtYXRlcmlhbC5zaWRlID0gQmFja1NpZGU7XHJcblx0XHRtYXRlcmlhbC5ibGVuZGluZyA9IE5vQmxlbmRpbmc7XHJcblxyXG5cdFx0Y29uc3QgbWVzaCA9IG5ldyBNZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuXHJcblx0XHRjb25zdCBzY2VuZSA9IG5ldyBTY2VuZSgpO1xyXG5cdFx0c2NlbmUuYWRkKCBtZXNoICk7XHJcblxyXG5cdFx0Ly8gQXZvaWQgYmx1cnJlZCBwb2xlc1xyXG5cdFx0aWYgKCB0ZXh0dXJlLm1pbkZpbHRlciA9PT0gTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyICkgdGV4dHVyZS5taW5GaWx0ZXIgPSBMaW5lYXJGaWx0ZXI7XHJcblxyXG5cdFx0Y29uc3QgY2FtZXJhID0gbmV3IEN1YmVDYW1lcmEoIDEsIDEwLCB0aGlzICk7XHJcblxyXG5cdFx0Y29uc3QgY3VycmVudE1SVCA9IHJlbmRlcmVyLmdldE1SVCgpO1xyXG5cdFx0cmVuZGVyZXIuc2V0TVJUKCBudWxsICk7XHJcblxyXG5cdFx0Y2FtZXJhLnVwZGF0ZSggcmVuZGVyZXIsIHNjZW5lICk7XHJcblxyXG5cdFx0cmVuZGVyZXIuc2V0TVJUKCBjdXJyZW50TVJUICk7XHJcblxyXG5cdFx0dGV4dHVyZS5taW5GaWx0ZXIgPSBjdXJyZW50TWluRmlsdGVyO1xyXG5cdFx0dGV4dHVyZS5jdXJyZW50R2VuZXJhdGVNaXBtYXBzID0gY3VycmVudEdlbmVyYXRlTWlwbWFwcztcclxuXHJcblx0XHRtZXNoLmdlb21ldHJ5LmRpc3Bvc2UoKTtcclxuXHRcdG1lc2gubWF0ZXJpYWwuZGlzcG9zZSgpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBDdWJlUmVuZGVyVGFyZ2V0O1xyXG4iLCJpbXBvcnQgVGVtcE5vZGUgZnJvbSAnLi4vY29yZS9UZW1wTm9kZS5qcyc7XHJcbmltcG9ydCB7IE5vZGVVcGRhdGVUeXBlIH0gZnJvbSAnLi4vY29yZS9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBub2RlUHJveHkgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcbmltcG9ydCB7IEN1YmVUZXh0dXJlIH0gZnJvbSAnLi4vLi4vdGV4dHVyZXMvQ3ViZVRleHR1cmUuanMnO1xyXG5pbXBvcnQgeyBjdWJlVGV4dHVyZSB9IGZyb20gJy4uL2FjY2Vzc29ycy9DdWJlVGV4dHVyZU5vZGUuanMnO1xyXG5pbXBvcnQgQ3ViZVJlbmRlclRhcmdldCBmcm9tICcuLi8uLi9yZW5kZXJlcnMvY29tbW9uL0N1YmVSZW5kZXJUYXJnZXQuanMnO1xyXG5pbXBvcnQgeyBDdWJlUmVmbGVjdGlvbk1hcHBpbmcsIEN1YmVSZWZyYWN0aW9uTWFwcGluZywgRXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmcsIEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzLmpzJztcclxuXHJcbmNvbnN0IF9jYWNoZSA9IG5ldyBXZWFrTWFwKCk7XHJcblxyXG4vKipcclxuICogVGhpcyBub2RlIGNhbiBiZSB1c2VkIHRvIGF1dG9tYXRpY2FsbHkgY29udmVydCBlbnZpcm9ubWVudCBtYXBzIGluIHRoZVxyXG4gKiBlcXVpcmVjdGFuZ3VsYXIgZm9ybWF0IGludG8gdGhlIGN1YmUgbWFwIGZvcm1hdC5cclxuICpcclxuICogQGF1Z21lbnRzIFRlbXBOb2RlXHJcbiAqL1xyXG5jbGFzcyBDdWJlTWFwTm9kZSBleHRlbmRzIFRlbXBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnQ3ViZU1hcE5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgY3ViZSBtYXAgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gZW52Tm9kZSAtIFRoZSBub2RlIHJlcHJlc2VudGluZyB0aGUgZW52aXJvbm1lbnQgbWFwLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBlbnZOb2RlICkge1xyXG5cclxuXHRcdHN1cGVyKCAndmVjMycgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBub2RlIHJlcHJlc2VudGluZyB0aGUgZW52aXJvbm1lbnQgbWFwLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmVudk5vZGUgPSBlbnZOb2RlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIGludGVybmFsIGN1YmUgdGV4dHVyZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUgez9DdWJlVGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fY3ViZVRleHR1cmUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIGludGVybmFsIGN1YmUgdGV4dHVyZSBub2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7Q3ViZVRleHR1cmVOb2RlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9jdWJlVGV4dHVyZU5vZGUgPSBjdWJlVGV4dHVyZSggbnVsbCApO1xyXG5cclxuXHRcdGNvbnN0IGRlZmF1bHRUZXh0dXJlID0gbmV3IEN1YmVUZXh0dXJlKCk7XHJcblx0XHRkZWZhdWx0VGV4dHVyZS5pc1JlbmRlclRhcmdldFRleHR1cmUgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBkZWZhdWx0IGN1YmUgdGV4dHVyZSB0aGF0IGFjdHMgYXMgYSBwbGFjZWhvbGRlci5cclxuXHRcdCAqIEl0IGlzIHVzZWQgd2hlbiB0aGUgY29udmVyc2lvbiBmcm9tIGVxdWlyZWN0YW5ndWxhciB0byBjdWJlXHJcblx0XHQgKiBtYXAgaGFzIG5vdCBmaW5pc2hlZCB5ZXQgZm9yIGEgZ2l2ZW4gdGV4dHVyZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge0N1YmVUZXh0dXJlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9kZWZhdWx0VGV4dHVyZSA9IGRlZmF1bHRUZXh0dXJlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGB1cGRhdGVCZWZvcmVUeXBlYCBpcyBzZXQgdG8gYE5vZGVVcGRhdGVUeXBlLlJFTkRFUmAgc2luY2UgdGhlIG5vZGUgdXBkYXRlc1xyXG5cdFx0ICogdGhlIHRleHR1cmUgb25jZSBwZXIgcmVuZGVyIGluIGl0cyB7QGxpbmsgQ3ViZU1hcE5vZGUjdXBkYXRlQmVmb3JlfSBtZXRob2QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqIEBkZWZhdWx0ICdyZW5kZXInXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXBkYXRlQmVmb3JlVHlwZSA9IE5vZGVVcGRhdGVUeXBlLlJFTkRFUjtcclxuXHJcblx0fVxyXG5cclxuXHR1cGRhdGVCZWZvcmUoIGZyYW1lICkge1xyXG5cclxuXHRcdGNvbnN0IHsgcmVuZGVyZXIsIG1hdGVyaWFsIH0gPSBmcmFtZTtcclxuXHJcblx0XHRjb25zdCBlbnZOb2RlID0gdGhpcy5lbnZOb2RlO1xyXG5cclxuXHRcdGlmICggZW52Tm9kZS5pc1RleHR1cmVOb2RlIHx8IGVudk5vZGUuaXNNYXRlcmlhbFJlZmVyZW5jZU5vZGUgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB0ZXh0dXJlID0gKCBlbnZOb2RlLmlzVGV4dHVyZU5vZGUgKSA/IGVudk5vZGUudmFsdWUgOiBtYXRlcmlhbFsgZW52Tm9kZS5wcm9wZXJ0eSBdO1xyXG5cclxuXHRcdFx0aWYgKCB0ZXh0dXJlICYmIHRleHR1cmUuaXNUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBtYXBwaW5nID0gdGV4dHVyZS5tYXBwaW5nO1xyXG5cclxuXHRcdFx0XHRpZiAoIG1hcHBpbmcgPT09IEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nIHx8IG1hcHBpbmcgPT09IEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nICkge1xyXG5cclxuXHRcdFx0XHRcdC8vIGNoZWNrIGZvciBjb252ZXJ0ZWQgY3ViZW1hcCBtYXBcclxuXHJcblx0XHRcdFx0XHRpZiAoIF9jYWNoZS5oYXMoIHRleHR1cmUgKSApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnN0IGN1YmVNYXAgPSBfY2FjaGUuZ2V0KCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0XHRcdFx0XHRtYXBUZXh0dXJlTWFwcGluZyggY3ViZU1hcCwgdGV4dHVyZS5tYXBwaW5nICk7XHJcblx0XHRcdFx0XHRcdHRoaXMuX2N1YmVUZXh0dXJlID0gY3ViZU1hcDtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0Ly8gY3JlYXRlIGN1YmUgbWFwIGZyb20gZXF1aXJlY3Rhbmd1bGFyIG1hcFxyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgaW1hZ2UgPSB0ZXh0dXJlLmltYWdlO1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCBpc0VxdWlyZWN0YW5ndWxhck1hcFJlYWR5KCBpbWFnZSApICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRjb25zdCByZW5kZXJUYXJnZXQgPSBuZXcgQ3ViZVJlbmRlclRhcmdldCggaW1hZ2UuaGVpZ2h0ICk7XHJcblx0XHRcdFx0XHRcdFx0cmVuZGVyVGFyZ2V0LmZyb21FcXVpcmVjdGFuZ3VsYXJUZXh0dXJlKCByZW5kZXJlciwgdGV4dHVyZSApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRtYXBUZXh0dXJlTWFwcGluZyggcmVuZGVyVGFyZ2V0LnRleHR1cmUsIHRleHR1cmUubWFwcGluZyApO1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMuX2N1YmVUZXh0dXJlID0gcmVuZGVyVGFyZ2V0LnRleHR1cmU7XHJcblxyXG5cdFx0XHRcdFx0XHRcdF9jYWNoZS5zZXQoIHRleHR1cmUsIHJlbmRlclRhcmdldC50ZXh0dXJlICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdHRleHR1cmUuYWRkRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvblRleHR1cmVEaXNwb3NlICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0XHQvLyBkZWZhdWx0IGN1YmUgdGV4dHVyZSBhcyBmYWxsYmFjayB3aGVuIGVxdWlyZWN0YW5ndWxhciB0ZXh0dXJlIGlzIG5vdCB5ZXQgbG9hZGVkXHJcblxyXG5cdFx0XHRcdFx0XHRcdHRoaXMuX2N1YmVUZXh0dXJlID0gdGhpcy5fZGVmYXVsdFRleHR1cmU7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8vXHJcblxyXG5cdFx0XHRcdFx0dGhpcy5fY3ViZVRleHR1cmVOb2RlLnZhbHVlID0gdGhpcy5fY3ViZVRleHR1cmU7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gZW52Tm9kZSBhbHJlYWR5IHJlZmVycyB0byBhIGN1YmUgbWFwXHJcblxyXG5cdFx0XHRcdFx0dGhpcy5fY3ViZVRleHR1cmVOb2RlID0gdGhpcy5lbnZOb2RlO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdHNldHVwKCBidWlsZGVyICkge1xyXG5cclxuXHRcdHRoaXMudXBkYXRlQmVmb3JlKCBidWlsZGVyICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX2N1YmVUZXh0dXJlTm9kZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQ3ViZU1hcE5vZGU7XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBlcXVpcmVjdGFuZ3VsYXIgaW1hZ2UgaGFzIGJlZW4gZnVsbHkgbG9hZGVkXHJcbiAqIGFuZCBpcyByZWFkeSBmb3IgZnVydGhlciBwcm9jZXNzaW5nLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAcGFyYW0ge0ltYWdlfSBpbWFnZSAtIFRoZSBlcXVpcmVjdGFuZ3VsYXIgaW1hZ2UgdG8gY2hlY2suXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGltYWdlIGlzIHJlYWR5IG9yIG5vdC5cclxuICovXHJcbmZ1bmN0aW9uIGlzRXF1aXJlY3Rhbmd1bGFyTWFwUmVhZHkoIGltYWdlICkge1xyXG5cclxuXHRpZiAoIGltYWdlID09PSBudWxsIHx8IGltYWdlID09PSB1bmRlZmluZWQgKSByZXR1cm4gZmFsc2U7XHJcblxyXG5cdHJldHVybiBpbWFnZS5oZWlnaHQgPiAwO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFRoaXMgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgd2hlbiBgZGlzcG9zZSgpYCBpcyBjYWxsZWQgb24gdGhlIGVxdWlyZWN0YW5ndWxhclxyXG4gKiB0ZXh0dXJlLiBJbiB0aGlzIGNhc2UsIHRoZSBnZW5lcmF0ZWQgY3ViZSBtYXAgd2l0aCBpdHMgcmVuZGVyIHRhcmdldFxyXG4gKiBpcyBkZWxldGVkIGFzIHdlbGwuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBldmVudCAtIFRoZSBldmVudCBvYmplY3QuXHJcbiAqL1xyXG5mdW5jdGlvbiBvblRleHR1cmVEaXNwb3NlKCBldmVudCApIHtcclxuXHJcblx0Y29uc3QgdGV4dHVyZSA9IGV2ZW50LnRhcmdldDtcclxuXHJcblx0dGV4dHVyZS5yZW1vdmVFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uVGV4dHVyZURpc3Bvc2UgKTtcclxuXHJcblx0Y29uc3QgcmVuZGVyVGFyZ2V0ID0gX2NhY2hlLmdldCggdGV4dHVyZSApO1xyXG5cclxuXHRpZiAoIHJlbmRlclRhcmdldCAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdF9jYWNoZS5kZWxldGUoIHRleHR1cmUgKTtcclxuXHJcblx0XHRyZW5kZXJUYXJnZXQuZGlzcG9zZSgpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogVGhpcyBmdW5jdGlvbiBtYWtlcyBzdXJlIHRoZSBnZW5lcmF0ZWQgY3ViZSBtYXAgdXNlcyB0aGUgY29ycmVjdFxyXG4gKiB0ZXh0dXJlIG1hcHBpbmcgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZXF1aXJlY3Rhbmd1bGFyIG9yaWdpbmFsLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgY3ViZSB0ZXh0dXJlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gbWFwcGluZyAtIFRoZSBvcmlnaW5hbCB0ZXh0dXJlIG1hcHBpbmcuXHJcbiAqL1xyXG5mdW5jdGlvbiBtYXBUZXh0dXJlTWFwcGluZyggdGV4dHVyZSwgbWFwcGluZyApIHtcclxuXHJcblx0aWYgKCBtYXBwaW5nID09PSBFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZyApIHtcclxuXHJcblx0XHR0ZXh0dXJlLm1hcHBpbmcgPSBDdWJlUmVmbGVjdGlvbk1hcHBpbmc7XHJcblxyXG5cdH0gZWxzZSBpZiAoIG1hcHBpbmcgPT09IEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nICkge1xyXG5cclxuXHRcdHRleHR1cmUubWFwcGluZyA9IEN1YmVSZWZyYWN0aW9uTWFwcGluZztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSBjdWJlIG1hcCBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IGVudk5vZGUgLSBUaGUgbm9kZSByZXByZXNlbnRpbmcgdGhlIGVudmlyb25tZW50IG1hcC5cclxuICogQHJldHVybnMge0N1YmVNYXBOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGN1YmVNYXBOb2RlID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIEN1YmVNYXBOb2RlICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAxICk7XHJcbiIsImltcG9ydCBMaWdodGluZ05vZGUgZnJvbSAnLi9MaWdodGluZ05vZGUuanMnO1xyXG5pbXBvcnQgeyBjdWJlTWFwTm9kZSB9IGZyb20gJy4uL3V0aWxzL0N1YmVNYXBOb2RlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIGEgYmFzaWMgbW9kZWwgZm9yIEltYWdlLWJhc2VkIGxpZ2h0aW5nIChJQkwpLiBUaGUgZW52aXJvbm1lbnRcclxuICogaXMgZGVmaW5lZCB2aWEgZW52aXJvbm1lbnQgbWFwcyBpbiB0aGUgZXF1aXJlY3Rhbmd1bGFyIG9yIGN1YmUgbWFwIGZvcm1hdC5cclxuICogYEJhc2ljRW52aXJvbm1lbnROb2RlYCBpcyBpbnRlbmRlZCBmb3Igbm9uLVBCUiBtYXRlcmlhbHMgbGlrZSB7QGxpbmsgTWVzaEJhc2ljTm9kZU1hdGVyaWFsfVxyXG4gKiBvciB7QGxpbmsgTWVzaFBob25nTm9kZU1hdGVyaWFsfS5cclxuICpcclxuICogQGF1Z21lbnRzIExpZ2h0aW5nTm9kZVxyXG4gKi9cclxuY2xhc3MgQmFzaWNFbnZpcm9ubWVudE5vZGUgZXh0ZW5kcyBMaWdodGluZ05vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdCYXNpY0Vudmlyb25tZW50Tm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBiYXNpYyBlbnZpcm9ubWVudCBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlfSBbZW52Tm9kZT1udWxsXSAtIEEgbm9kZSByZXByZXNlbnRpbmcgdGhlIGVudmlyb25tZW50LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBlbnZOb2RlID0gbnVsbCApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBub2RlIHJlcHJlc2VudGluZyB0aGUgZW52aXJvbm1lbnQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZW52Tm9kZSA9IGVudk5vZGU7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXAoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Ly8gZW52aXJvbm1lbnQgcHJvcGVydHkgaXMgdXNlZCBpbiB0aGUgZmluaXNoKCkgbWV0aG9kIG9mIEJhc2ljTGlnaHRpbmdNb2RlbFxyXG5cclxuXHRcdGJ1aWxkZXIuY29udGV4dC5lbnZpcm9ubWVudCA9IGN1YmVNYXBOb2RlKCB0aGlzLmVudk5vZGUgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQmFzaWNFbnZpcm9ubWVudE5vZGU7XHJcbiIsImltcG9ydCBMaWdodGluZ05vZGUgZnJvbSAnLi9MaWdodGluZ05vZGUuanMnO1xyXG5pbXBvcnQgeyBmbG9hdCB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIHNwZWNpZmljIHZlcnNpb24gb2Yge0BsaW5rIElycmFkaWFuY2VOb2RlfSB0aGF0IGlzIG9ubHkgcmVsZXZhbnRcclxuICogZm9yIHtAbGluayBNZXNoQmFzaWNOb2RlTWF0ZXJpYWx9LiBTaW5jZSB0aGUgbWF0ZXJpYWwgaXMgdW5saXQsIGl0XHJcbiAqIHJlcXVpcmVzIGEgc3BlY2lhbCBzY2FsaW5nIGZhY3RvciBmb3IgdGhlIGxpZ2h0IG1hcC5cclxuICpcclxuICogQGF1Z21lbnRzIExpZ2h0aW5nTm9kZVxyXG4gKi9cclxuY2xhc3MgQmFzaWNMaWdodE1hcE5vZGUgZXh0ZW5kcyBMaWdodGluZ05vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdCYXNpY0xpZ2h0TWFwTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBiYXNpYyBsaWdodCBtYXAgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7P05vZGU8dmVjMz59IFtsaWdodE1hcE5vZGU9bnVsbF0gLSBUaGUgbGlnaHQgbWFwIG5vZGUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGxpZ2h0TWFwTm9kZSA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBsaWdodCBtYXAgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGU8dmVjMz59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGlnaHRNYXBOb2RlID0gbGlnaHRNYXBOb2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdHNldHVwKCBidWlsZGVyICkge1xyXG5cclxuXHRcdC8vIGlycmFkaWFuY2VMaWdodE1hcCBwcm9wZXJ0eSBpcyB1c2VkIGluIHRoZSBpbmRpcmVjdERpZmZ1c2UoKSBtZXRob2Qgb2YgQmFzaWNMaWdodGluZ01vZGVsXHJcblxyXG5cdFx0Y29uc3QgUkVDSVBST0NBTF9QSSA9IGZsb2F0KCAxIC8gTWF0aC5QSSApO1xyXG5cclxuXHRcdGJ1aWxkZXIuY29udGV4dC5pcnJhZGlhbmNlTGlnaHRNYXAgPSB0aGlzLmxpZ2h0TWFwTm9kZS5tdWwoIFJFQ0lQUk9DQUxfUEkgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQmFzaWNMaWdodE1hcE5vZGU7XHJcbiIsIi8qKlxyXG4gKiBBYnN0cmFjdCBjbGFzcyBmb3IgaW1wbGVtZW50aW5nIGxpZ2h0aW5nIG1vZGVscy4gVGhlIG1vZHVsZSBkZWZpbmVzXHJcbiAqIG11bHRpcGxlIG1ldGhvZHMgdGhhdCBjb25jcmV0ZSBsaWdodGluZyBtb2RlbHMgY2FuIGltcGxlbWVudC4gVGhlc2VcclxuICogbWV0aG9kcyBhcmUgZXhlY3V0ZWQgYXQgZGlmZmVyZW50IHBvaW50cyBkdXJpbmcgdGhlIGxpZ2h0IGV2YWx1YXRpb25cclxuICogcHJvY2Vzcy5cclxuICovXHJcbmNsYXNzIExpZ2h0aW5nTW9kZWwge1xyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3Igc2V0dGluZyB1cCBsaWdodGluZyBtb2RlbCBhbmQgY29udGV4dCBkYXRhXHJcblx0ICogd2hpY2ggYXJlIGxhdGVyIHVzZWQgaW4gdGhlIGV2YWx1YXRpb24gcHJvY2Vzcy5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICovXHJcblx0c3RhcnQoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Ly8gbGlnaHRzICggZGlyZWN0IClcclxuXHJcblx0XHRidWlsZGVyLmxpZ2h0c05vZGUuc2V0dXBMaWdodHMoIGJ1aWxkZXIsIGJ1aWxkZXIubGlnaHRzTm9kZS5nZXRMaWdodE5vZGVzKCBidWlsZGVyICkgKTtcclxuXHJcblx0XHQvLyBpbmRpcmVjdFxyXG5cclxuXHRcdHRoaXMuaW5kaXJlY3QoIGJ1aWxkZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgZXhlY3V0aW5nIGZpbmFsIHRhc2tzIGxpa2UgZmluYWwgdXBkYXRlc1xyXG5cdCAqIHRvIHRoZSBvdXRnb2luZyBsaWdodC5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICovXHJcblx0ZmluaXNoKCAvKmJ1aWxkZXIqLyApIHsgfVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgaW1wbGVtZW50aW5nIHRoZSBkaXJlY3QgbGlnaHQgdGVybSBhbmRcclxuXHQgKiBleGVjdXRlZCBkdXJpbmcgdGhlIGJ1aWxkIHByb2Nlc3Mgb2YgZGlyZWN0aW9uYWwsIHBvaW50IGFuZCBzcG90IGxpZ2h0IG5vZGVzLlxyXG5cdCAqXHJcblx0ICogQGFic3RyYWN0XHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGxpZ2h0RGF0YSAtIFRoZSBsaWdodCBkYXRhLlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICovXHJcblx0ZGlyZWN0KCAvKmxpZ2h0RGF0YSwgYnVpbGRlciovICkgeyB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciBpbXBsZW1lbnRpbmcgdGhlIGRpcmVjdCBsaWdodCB0ZXJtIGZvclxyXG5cdCAqIHJlY3QgYXJlYSBsaWdodCBub2Rlcy5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBsaWdodERhdGEgLSBUaGUgbGlnaHQgZGF0YS5cclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqL1xyXG5cdGRpcmVjdFJlY3RBcmVhKCAvKmxpZ2h0RGF0YSwgYnVpbGRlciovICkge31cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIGltcGxlbWVudGluZyB0aGUgaW5kaXJlY3QgbGlnaHQgdGVybS5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICovXHJcblx0aW5kaXJlY3QoIC8qYnVpbGRlciovICkgeyB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciBpbXBsZW1lbnRpbmcgdGhlIGFtYmllbnQgb2NjbHVzaW9uIHRlcm0uXHJcblx0ICogVW5saWtlIG90aGVyIG1ldGhvZHMsIHRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIG1hbnVhbGx5IGJ5IHRoZSBsaWdodGluZ1xyXG5cdCAqIG1vZGVsIGluIGl0cyBpbmRpcmVjdCB0ZXJtLlxyXG5cdCAqXHJcblx0ICogQGFic3RyYWN0XHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKi9cclxuXHRhbWJpZW50T2NjbHVzaW9uKCAvKmlucHV0LCBzdGFjaywgYnVpbGRlciovICkgeyB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBMaWdodGluZ01vZGVsO1xyXG4iLCJpbXBvcnQgTGlnaHRpbmdNb2RlbCBmcm9tICcuLi9jb3JlL0xpZ2h0aW5nTW9kZWwuanMnO1xyXG5pbXBvcnQgeyBkaWZmdXNlQ29sb3IgfSBmcm9tICcuLi9jb3JlL1Byb3BlcnR5Tm9kZS5qcyc7XHJcbmltcG9ydCB7IE11bHRpcGx5T3BlcmF0aW9uLCBNaXhPcGVyYXRpb24sIEFkZE9wZXJhdGlvbiB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IG1hdGVyaWFsU3BlY3VsYXJTdHJlbmd0aCwgbWF0ZXJpYWxSZWZsZWN0aXZpdHkgfSBmcm9tICcuLi9hY2Nlc3NvcnMvTWF0ZXJpYWxOb2RlLmpzJztcclxuaW1wb3J0IHsgbWl4IH0gZnJvbSAnLi4vbWF0aC9NYXRoTm9kZS5qcyc7XHJcbmltcG9ydCB7IHZlYzQgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyB0aGUgbGlnaHRpbmcgbW9kZWwgZm9yIHVubGl0IG1hdGVyaWFscy4gVGhlIG9ubHkgbGlnaHQgY29udHJpYnV0aW9uXHJcbiAqIGlzIGJha2VkIGluZGlyZWN0IGxpZ2h0aW5nIG1vZHVsYXRlZCB3aXRoIGFtYmllbnQgb2NjbHVzaW9uIGFuZCB0aGUgbWF0ZXJpYWwnc1xyXG4gKiBkaWZmdXNlIGNvbG9yLiBFbnZpcm9ubWVudCBtYXBwaW5nIGlzIHN1cHBvcnRlZC4gVXNlZCBpbiB7QGxpbmsgTWVzaEJhc2ljTm9kZU1hdGVyaWFsfS5cclxuICpcclxuICogQGF1Z21lbnRzIExpZ2h0aW5nTW9kZWxcclxuICovXHJcbmNsYXNzIEJhc2ljTGlnaHRpbmdNb2RlbCBleHRlbmRzIExpZ2h0aW5nTW9kZWwge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGJhc2ljIGxpZ2h0aW5nIG1vZGVsLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW1wbGVtZW50cyB0aGUgYmFrZWQgaW5kaXJlY3QgbGlnaHRpbmcgd2l0aCBpdHMgbW9kdWxhdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICovXHJcblx0aW5kaXJlY3QoIHsgY29udGV4dCB9ICkge1xyXG5cclxuXHRcdGNvbnN0IGFtYmllbnRPY2NsdXNpb24gPSBjb250ZXh0LmFtYmllbnRPY2NsdXNpb247XHJcblx0XHRjb25zdCByZWZsZWN0ZWRMaWdodCA9IGNvbnRleHQucmVmbGVjdGVkTGlnaHQ7XHJcblx0XHRjb25zdCBpcnJhZGlhbmNlTGlnaHRNYXAgPSBjb250ZXh0LmlycmFkaWFuY2VMaWdodE1hcDtcclxuXHJcblx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UuYXNzaWduKCB2ZWM0KCAwLjAgKSApO1xyXG5cclxuXHRcdC8vIGFjY3VtdWxhdGlvbiAoYmFrZWQgaW5kaXJlY3QgbGlnaHRpbmcgb25seSlcclxuXHJcblx0XHRpZiAoIGlycmFkaWFuY2VMaWdodE1hcCApIHtcclxuXHJcblx0XHRcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZS5hZGRBc3NpZ24oIGlycmFkaWFuY2VMaWdodE1hcCApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UuYWRkQXNzaWduKCB2ZWM0KCAxLjAsIDEuMCwgMS4wLCAwLjAgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBtb2R1bGF0aW9uXHJcblxyXG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlLm11bEFzc2lnbiggYW1iaWVudE9jY2x1c2lvbiApO1xyXG5cclxuXHRcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZS5tdWxBc3NpZ24oIGRpZmZ1c2VDb2xvci5yZ2IgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJbXBsZW1lbnRzIHRoZSBlbnZpcm9ubWVudCBtYXBwaW5nLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKi9cclxuXHRmaW5pc2goIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBtYXRlcmlhbCwgY29udGV4dCB9ID0gYnVpbGRlcjtcclxuXHJcblx0XHRjb25zdCBvdXRnb2luZ0xpZ2h0ID0gY29udGV4dC5vdXRnb2luZ0xpZ2h0O1xyXG5cdFx0Y29uc3QgZW52Tm9kZSA9IGJ1aWxkZXIuY29udGV4dC5lbnZpcm9ubWVudDtcclxuXHJcblx0XHRpZiAoIGVudk5vZGUgKSB7XHJcblxyXG5cdFx0XHRzd2l0Y2ggKCBtYXRlcmlhbC5jb21iaW5lICkge1xyXG5cclxuXHRcdFx0XHRjYXNlIE11bHRpcGx5T3BlcmF0aW9uOlxyXG5cdFx0XHRcdFx0b3V0Z29pbmdMaWdodC5yZ2IuYXNzaWduKCBtaXgoIG91dGdvaW5nTGlnaHQucmdiLCBvdXRnb2luZ0xpZ2h0LnJnYi5tdWwoIGVudk5vZGUucmdiICksIG1hdGVyaWFsU3BlY3VsYXJTdHJlbmd0aC5tdWwoIG1hdGVyaWFsUmVmbGVjdGl2aXR5ICkgKSApO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdGNhc2UgTWl4T3BlcmF0aW9uOlxyXG5cdFx0XHRcdFx0b3V0Z29pbmdMaWdodC5yZ2IuYXNzaWduKCBtaXgoIG91dGdvaW5nTGlnaHQucmdiLCBlbnZOb2RlLnJnYiwgbWF0ZXJpYWxTcGVjdWxhclN0cmVuZ3RoLm11bCggbWF0ZXJpYWxSZWZsZWN0aXZpdHkgKSApICk7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0Y2FzZSBBZGRPcGVyYXRpb246XHJcblx0XHRcdFx0XHRvdXRnb2luZ0xpZ2h0LnJnYi5hZGRBc3NpZ24oIGVudk5vZGUucmdiLm11bCggbWF0ZXJpYWxTcGVjdWxhclN0cmVuZ3RoLm11bCggbWF0ZXJpYWxSZWZsZWN0aXZpdHkgKSApICk7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJhc2ljTGlnaHRpbmdNb2RlbDogVW5zdXBwb3J0ZWQgLmNvbWJpbmUgdmFsdWU6JywgbWF0ZXJpYWwuY29tYmluZSApO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBCYXNpY0xpZ2h0aW5nTW9kZWw7XHJcbiIsImltcG9ydCBOb2RlTWF0ZXJpYWwgZnJvbSAnLi9Ob2RlTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyBtYXRlcmlhbExpZ2h0TWFwIH0gZnJvbSAnLi4vLi4vbm9kZXMvYWNjZXNzb3JzL01hdGVyaWFsTm9kZS5qcyc7XHJcbmltcG9ydCBCYXNpY0Vudmlyb25tZW50Tm9kZSBmcm9tICcuLi8uLi9ub2Rlcy9saWdodGluZy9CYXNpY0Vudmlyb25tZW50Tm9kZS5qcyc7XHJcbmltcG9ydCBCYXNpY0xpZ2h0TWFwTm9kZSBmcm9tICcuLi8uLi9ub2Rlcy9saWdodGluZy9CYXNpY0xpZ2h0TWFwTm9kZS5qcyc7XHJcbmltcG9ydCBCYXNpY0xpZ2h0aW5nTW9kZWwgZnJvbSAnLi4vLi4vbm9kZXMvZnVuY3Rpb25zL0Jhc2ljTGlnaHRpbmdNb2RlbC5qcyc7XHJcbmltcG9ydCB7IG5vcm1hbFZpZXcgfSBmcm9tICcuLi8uLi9ub2Rlcy9hY2Nlc3NvcnMvTm9ybWFsLmpzJztcclxuaW1wb3J0IHsgZGlmZnVzZUNvbG9yIH0gZnJvbSAnLi4vLi4vbm9kZXMvY29yZS9Qcm9wZXJ0eU5vZGUuanMnO1xyXG5cclxuaW1wb3J0IHsgTWVzaEJhc2ljTWF0ZXJpYWwgfSBmcm9tICcuLi9NZXNoQmFzaWNNYXRlcmlhbC5qcyc7XHJcblxyXG5jb25zdCBfZGVmYXVsdFZhbHVlcyA9IC8qQF9fUFVSRV9fKi8gbmV3IE1lc2hCYXNpY01hdGVyaWFsKCk7XHJcblxyXG4vKipcclxuICogTm9kZSBtYXRlcmlhbCB2ZXJzaW9uIG9mIHtAbGluayBNZXNoQmFzaWNNYXRlcmlhbH0uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBOb2RlTWF0ZXJpYWxcclxuICovXHJcbmNsYXNzIE1lc2hCYXNpY05vZGVNYXRlcmlhbCBleHRlbmRzIE5vZGVNYXRlcmlhbCB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ01lc2hCYXNpY05vZGVNYXRlcmlhbCc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBtZXNoIGJhc2ljIG5vZGUgbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtZXRlcnNdIC0gVGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwYXJhbWV0ZXJzICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzTWVzaEJhc2ljTm9kZU1hdGVyaWFsID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFsdGhvdWdoIHRoZSBiYXNpYyBtYXRlcmlhbCBpcyBieSBkZWZpbml0aW9uIHVubGl0LCB3ZSBzZXRcclxuXHRcdCAqIHRoaXMgcHJvcGVydHkgdG8gYHRydWVgIHNpbmNlIHdlIHVzZSBhIGxpZ2h0aW5nIG1vZGVsIHRvIGNvbXB1dGVcclxuXHRcdCAqIHRoZSBvdXRnb2luZyBsaWdodCBvZiB0aGUgZnJhZ21lbnQgc2hhZGVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxpZ2h0cyA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy5zZXREZWZhdWx0VmFsdWVzKCBfZGVmYXVsdFZhbHVlcyApO1xyXG5cclxuXHRcdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQmFzaWMgbWF0ZXJpYWxzIGFyZSBub3QgYWZmZWN0ZWQgYnkgbm9ybWFsIGFuZCBidW1wIG1hcHMgc28gd2VcclxuXHQgKiByZXR1cm4gYnkgZGVmYXVsdCB7QGxpbmsgbm9ybWFsVmlld30uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtOb2RlPHZlYzM+fSBUaGUgbm9ybWFsIG5vZGUuXHJcblx0ICovXHJcblx0c2V0dXBOb3JtYWwoKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5vcm1hbFZpZXc7IC8vIHNlZSAjMjg4MzlcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBPdmVyd3JpdHRlbiBzaW5jZSB0aGlzIHR5cGUgb2YgbWF0ZXJpYWwgdXNlcyB7QGxpbmsgQmFzaWNFbnZpcm9ubWVudE5vZGV9XHJcblx0ICogdG8gaW1wbGVtZW50IHRoZSBkZWZhdWx0IGVudmlyb25tZW50IG1hcHBpbmcuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4gez9CYXNpY0Vudmlyb25tZW50Tm9kZTx2ZWMzPn0gVGhlIGVudmlyb25tZW50IG5vZGUuXHJcblx0ICovXHJcblx0c2V0dXBFbnZpcm9ubWVudCggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCBlbnZOb2RlID0gc3VwZXIuc2V0dXBFbnZpcm9ubWVudCggYnVpbGRlciApO1xyXG5cclxuXHRcdHJldHVybiBlbnZOb2RlID8gbmV3IEJhc2ljRW52aXJvbm1lbnROb2RlKCBlbnZOb2RlICkgOiBudWxsO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIG11c3QgYmUgb3ZlcndyaXR0ZW4gc2luY2UgbGlnaHQgbWFwcyBhcmUgZXZhbHVhdGVkXHJcblx0ICogd2l0aCBhIHNwZWNpYWwgc2NhbGluZyBmYWN0b3IgZm9yIGJhc2ljIG1hdGVyaWFscy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7P0Jhc2ljTGlnaHRNYXBOb2RlPHZlYzM+fSBUaGUgbGlnaHQgbWFwIG5vZGUuXHJcblx0ICovXHJcblx0c2V0dXBMaWdodE1hcCggYnVpbGRlciApIHtcclxuXHJcblx0XHRsZXQgbm9kZSA9IG51bGw7XHJcblxyXG5cdFx0aWYgKCBidWlsZGVyLm1hdGVyaWFsLmxpZ2h0TWFwICkge1xyXG5cclxuXHRcdFx0bm9kZSA9IG5ldyBCYXNpY0xpZ2h0TWFwTm9kZSggbWF0ZXJpYWxMaWdodE1hcCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbm9kZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgbWF0ZXJpYWwgb3ZlcndyaXRlcyB0aGlzIG1ldGhvZCBiZWNhdXNlIGBsaWdodHNgIGlzIHNldCB0byBgdHJ1ZWAgYnV0XHJcblx0ICogd2Ugc3RpbGwgd2FudCB0byByZXR1cm4gdGhlIGRpZmZ1c2UgY29sb3IgYXMgdGhlIG91dGdvaW5nIGxpZ2h0LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Tm9kZTx2ZWMzPn0gVGhlIG91dGdvaW5nIGxpZ2h0IG5vZGUuXHJcblx0ICovXHJcblx0c2V0dXBPdXRnb2luZ0xpZ2h0KCkge1xyXG5cclxuXHRcdHJldHVybiBkaWZmdXNlQ29sb3IucmdiO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHVwcyB0aGUgbGlnaHRpbmcgbW9kZWwuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtCYXNpY0xpZ2h0aW5nTW9kZWx9IFRoZSBsaWdodGluZyBtb2RlbC5cclxuXHQgKi9cclxuXHRzZXR1cExpZ2h0aW5nTW9kZWwoKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBCYXNpY0xpZ2h0aW5nTW9kZWwoKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTWVzaEJhc2ljTm9kZU1hdGVyaWFsO1xyXG4iLCJpbXBvcnQgeyBGbiB9IGZyb20gJy4uLy4uL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbmNvbnN0IEZfU2NobGljayA9IC8qQF9fUFVSRV9fKi8gRm4oICggeyBmMCwgZjkwLCBkb3RWSCB9ICkgPT4ge1xyXG5cclxuXHQvLyBPcmlnaW5hbCBhcHByb3hpbWF0aW9uIGJ5IENocmlzdG9waGUgU2NobGljayAnOTRcclxuXHQvLyBmbG9hdCBmcmVzbmVsID0gcG93KCAxLjAgLSBkb3RWSCwgNS4wICk7XHJcblxyXG5cdC8vIE9wdGltaXplZCB2YXJpYW50IChwcmVzZW50ZWQgYnkgRXBpYyBhdCBTSUdHUkFQSCAnMTMpXHJcblx0Ly8gaHR0cHM6Ly9jZG4yLnVucmVhbGVuZ2luZS5jb20vUmVzb3VyY2VzL2ZpbGVzLzIwMTNTaWdncmFwaFByZXNlbnRhdGlvbnNOb3Rlcy0yNjkxNTczOC5wZGZcclxuXHRjb25zdCBmcmVzbmVsID0gZG90VkgubXVsKCAtIDUuNTU0NzMgKS5zdWIoIDYuOTgzMTYgKS5tdWwoIGRvdFZIICkuZXhwMigpO1xyXG5cclxuXHRyZXR1cm4gZjAubXVsKCBmcmVzbmVsLm9uZU1pbnVzKCkgKS5hZGQoIGY5MC5tdWwoIGZyZXNuZWwgKSApO1xyXG5cclxufSApOyAvLyB2YWxpZGF0ZWRcclxuXHJcbmV4cG9ydCBkZWZhdWx0IEZfU2NobGljaztcclxuIiwiaW1wb3J0IHsgRm4gfSBmcm9tICcuLi8uLi90c2wvVFNMQmFzZS5qcyc7XHJcblxyXG5jb25zdCBCUkRGX0xhbWJlcnQgPSAvKkBfX1BVUkVfXyovIEZuKCAoIGlucHV0cyApID0+IHtcclxuXHJcblx0cmV0dXJuIGlucHV0cy5kaWZmdXNlQ29sb3IubXVsKCAxIC8gTWF0aC5QSSApOyAvLyBwdW5jdHVhbCBsaWdodFxyXG5cclxufSApOyAvLyB2YWxpZGF0ZWRcclxuXHJcbmV4cG9ydCBkZWZhdWx0IEJSREZfTGFtYmVydDtcclxuIiwiaW1wb3J0IEJhc2ljTGlnaHRpbmdNb2RlbCBmcm9tICcuL0Jhc2ljTGlnaHRpbmdNb2RlbC5qcyc7XHJcbmltcG9ydCBGX1NjaGxpY2sgZnJvbSAnLi9CU0RGL0ZfU2NobGljay5qcyc7XHJcbmltcG9ydCBCUkRGX0xhbWJlcnQgZnJvbSAnLi9CU0RGL0JSREZfTGFtYmVydC5qcyc7XHJcbmltcG9ydCB7IGRpZmZ1c2VDb2xvciwgc2hpbmluZXNzLCBzcGVjdWxhckNvbG9yIH0gZnJvbSAnLi4vY29yZS9Qcm9wZXJ0eU5vZGUuanMnO1xyXG5pbXBvcnQgeyB0cmFuc2Zvcm1lZE5vcm1hbFZpZXcgfSBmcm9tICcuLi9hY2Nlc3NvcnMvTm9ybWFsLmpzJztcclxuaW1wb3J0IHsgbWF0ZXJpYWxTcGVjdWxhclN0cmVuZ3RoIH0gZnJvbSAnLi4vYWNjZXNzb3JzL01hdGVyaWFsTm9kZS5qcyc7XHJcbmltcG9ydCB7IHBvc2l0aW9uVmlld0RpcmVjdGlvbiB9IGZyb20gJy4uL2FjY2Vzc29ycy9Qb3NpdGlvbi5qcyc7XHJcbmltcG9ydCB7IEZuLCBmbG9hdCB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbmNvbnN0IEdfQmxpbm5QaG9uZ19JbXBsaWNpdCA9ICgpID0+IGZsb2F0KCAwLjI1ICk7XHJcblxyXG5jb25zdCBEX0JsaW5uUGhvbmcgPSAvKkBfX1BVUkVfXyovIEZuKCAoIHsgZG90TkggfSApID0+IHtcclxuXHJcblx0cmV0dXJuIHNoaW5pbmVzcy5tdWwoIGZsb2F0KCAwLjUgKSApLmFkZCggMS4wICkubXVsKCBmbG9hdCggMSAvIE1hdGguUEkgKSApLm11bCggZG90TkgucG93KCBzaGluaW5lc3MgKSApO1xyXG5cclxufSApO1xyXG5cclxuY29uc3QgQlJERl9CbGlublBob25nID0gLypAX19QVVJFX18qLyBGbiggKCB7IGxpZ2h0RGlyZWN0aW9uIH0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IGhhbGZEaXIgPSBsaWdodERpcmVjdGlvbi5hZGQoIHBvc2l0aW9uVmlld0RpcmVjdGlvbiApLm5vcm1hbGl6ZSgpO1xyXG5cclxuXHRjb25zdCBkb3ROSCA9IHRyYW5zZm9ybWVkTm9ybWFsVmlldy5kb3QoIGhhbGZEaXIgKS5jbGFtcCgpO1xyXG5cdGNvbnN0IGRvdFZIID0gcG9zaXRpb25WaWV3RGlyZWN0aW9uLmRvdCggaGFsZkRpciApLmNsYW1wKCk7XHJcblxyXG5cdGNvbnN0IEYgPSBGX1NjaGxpY2soIHsgZjA6IHNwZWN1bGFyQ29sb3IsIGY5MDogMS4wLCBkb3RWSCB9ICk7XHJcblx0Y29uc3QgRyA9IEdfQmxpbm5QaG9uZ19JbXBsaWNpdCgpO1xyXG5cdGNvbnN0IEQgPSBEX0JsaW5uUGhvbmcoIHsgZG90TkggfSApO1xyXG5cclxuXHRyZXR1cm4gRi5tdWwoIEcgKS5tdWwoIEQgKTtcclxuXHJcbn0gKTtcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIHRoZSBsaWdodGluZyBtb2RlbCBmb3IgYSBwaG9uZyBtYXRlcmlhbC4gVXNlZCBpbiB7QGxpbmsgTWVzaFBob25nTm9kZU1hdGVyaWFsfS5cclxuICpcclxuICogQGF1Z21lbnRzIEJhc2ljTGlnaHRpbmdNb2RlbFxyXG4gKi9cclxuY2xhc3MgUGhvbmdMaWdodGluZ01vZGVsIGV4dGVuZHMgQmFzaWNMaWdodGluZ01vZGVsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBwaG9uZyBsaWdodGluZyBtb2RlbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW3NwZWN1bGFyPXRydWVdIC0gV2hldGhlciBzcGVjdWxhciBpcyBzdXBwb3J0ZWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBzcGVjdWxhciA9IHRydWUgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgc3BlY3VsYXIgaXMgc3VwcG9ydGVkIG9yIG5vdC4gU2V0IHRoaXMgdG8gYGZhbHNlYCBpZiB5b3UgYXJlXHJcblx0XHQgKiBsb29raW5nIGZvciBhIExhbWJlcnQtbGlrZSBtYXRlcmlhbCBtZWFuaW5nIGEgbWF0ZXJpYWwgZm9yIG5vbi1zaGlueVxyXG5cdFx0ICogc3VyZmFjZXMsIHdpdGhvdXQgc3BlY3VsYXIgaGlnaGxpZ2h0cy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zcGVjdWxhciA9IHNwZWN1bGFyO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEltcGxlbWVudHMgdGhlIGRpcmVjdCBsaWdodGluZy4gVGhlIHNwZWN1bGFyIHBvcnRpb24gaXMgb3B0aW9uYWwgYW4gY2FuIGJlIGNvbnRyb2xsZWRcclxuXHQgKiB3aXRoIHRoZSB7QGxpbmsgUGhvbmdMaWdodGluZ01vZGVsI3NwZWN1bGFyfSBmbGFnLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGxpZ2h0RGF0YSAtIFRoZSBsaWdodCBkYXRhLlxyXG5cdCAqL1xyXG5cdGRpcmVjdCggeyBsaWdodERpcmVjdGlvbiwgbGlnaHRDb2xvciwgcmVmbGVjdGVkTGlnaHQgfSApIHtcclxuXHJcblx0XHRjb25zdCBkb3ROTCA9IHRyYW5zZm9ybWVkTm9ybWFsVmlldy5kb3QoIGxpZ2h0RGlyZWN0aW9uICkuY2xhbXAoKTtcclxuXHRcdGNvbnN0IGlycmFkaWFuY2UgPSBkb3ROTC5tdWwoIGxpZ2h0Q29sb3IgKTtcclxuXHJcblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlLmFkZEFzc2lnbiggaXJyYWRpYW5jZS5tdWwoIEJSREZfTGFtYmVydCggeyBkaWZmdXNlQ29sb3I6IGRpZmZ1c2VDb2xvci5yZ2IgfSApICkgKTtcclxuXHJcblx0XHRpZiAoIHRoaXMuc3BlY3VsYXIgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhci5hZGRBc3NpZ24oIGlycmFkaWFuY2UubXVsKCBCUkRGX0JsaW5uUGhvbmcoIHsgbGlnaHREaXJlY3Rpb24gfSApICkubXVsKCBtYXRlcmlhbFNwZWN1bGFyU3RyZW5ndGggKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJbXBsZW1lbnRzIHRoZSBpbmRpcmVjdCBsaWdodGluZy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICovXHJcblx0aW5kaXJlY3QoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBhbWJpZW50T2NjbHVzaW9uLCBpcnJhZGlhbmNlLCByZWZsZWN0ZWRMaWdodCB9ID0gYnVpbGRlci5jb250ZXh0O1xyXG5cclxuXHRcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZS5hZGRBc3NpZ24oIGlycmFkaWFuY2UubXVsKCBCUkRGX0xhbWJlcnQoIHsgZGlmZnVzZUNvbG9yIH0gKSApICk7XHJcblxyXG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlLm11bEFzc2lnbiggYW1iaWVudE9jY2x1c2lvbiApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBQaG9uZ0xpZ2h0aW5nTW9kZWw7XHJcbiIsImltcG9ydCBOb2RlTWF0ZXJpYWwgZnJvbSAnLi9Ob2RlTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgQmFzaWNFbnZpcm9ubWVudE5vZGUgZnJvbSAnLi4vLi4vbm9kZXMvbGlnaHRpbmcvQmFzaWNFbnZpcm9ubWVudE5vZGUuanMnO1xyXG5pbXBvcnQgUGhvbmdMaWdodGluZ01vZGVsIGZyb20gJy4uLy4uL25vZGVzL2Z1bmN0aW9ucy9QaG9uZ0xpZ2h0aW5nTW9kZWwuanMnO1xyXG5cclxuaW1wb3J0IHsgTWVzaExhbWJlcnRNYXRlcmlhbCB9IGZyb20gJy4uL01lc2hMYW1iZXJ0TWF0ZXJpYWwuanMnO1xyXG5cclxuY29uc3QgX2RlZmF1bHRWYWx1ZXMgPSAvKkBfX1BVUkVfXyovIG5ldyBNZXNoTGFtYmVydE1hdGVyaWFsKCk7XHJcblxyXG4vKipcclxuICogTm9kZSBtYXRlcmlhbCB2ZXJzaW9uIG9mIHtAbGluayBNZXNoTGFtYmVydE1hdGVyaWFsfS5cclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVNYXRlcmlhbFxyXG4gKi9cclxuY2xhc3MgTWVzaExhbWJlcnROb2RlTWF0ZXJpYWwgZXh0ZW5kcyBOb2RlTWF0ZXJpYWwge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdNZXNoTGFtYmVydE5vZGVNYXRlcmlhbCc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBtZXNoIGxhbWJlcnQgbm9kZSBtYXRlcmlhbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1ldGVyc10gLSBUaGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHBhcmFtZXRlcnMgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNNZXNoTGFtYmVydE5vZGVNYXRlcmlhbCA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTZXQgdG8gYHRydWVgIGJlY2F1c2UgbGFtYmVydCBtYXRlcmlhbHMgcmVhY3Qgb24gbGlnaHRzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxpZ2h0cyA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy5zZXREZWZhdWx0VmFsdWVzKCBfZGVmYXVsdFZhbHVlcyApO1xyXG5cclxuXHRcdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogT3ZlcndyaXR0ZW4gc2luY2UgdGhpcyB0eXBlIG9mIG1hdGVyaWFsIHVzZXMge0BsaW5rIEJhc2ljRW52aXJvbm1lbnROb2RlfVxyXG5cdCAqIHRvIGltcGxlbWVudCB0aGUgZGVmYXVsdCBlbnZpcm9ubWVudCBtYXBwaW5nLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHs/QmFzaWNFbnZpcm9ubWVudE5vZGU8dmVjMz59IFRoZSBlbnZpcm9ubWVudCBub2RlLlxyXG5cdCAqL1xyXG5cdHNldHVwRW52aXJvbm1lbnQoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgZW52Tm9kZSA9IHN1cGVyLnNldHVwRW52aXJvbm1lbnQoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRyZXR1cm4gZW52Tm9kZSA/IG5ldyBCYXNpY0Vudmlyb25tZW50Tm9kZSggZW52Tm9kZSApIDogbnVsbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXR1cHMgdGhlIGxpZ2h0aW5nIG1vZGVsLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7UGhvbmdMaWdodGluZ01vZGVsfSBUaGUgbGlnaHRpbmcgbW9kZWwuXHJcblx0ICovXHJcblx0c2V0dXBMaWdodGluZ01vZGVsKCAvKmJ1aWxkZXIqLyApIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IFBob25nTGlnaHRpbmdNb2RlbCggZmFsc2UgKTsgLy8gKCBzcGVjdWxhciApIC0+IGZvcmNlIGxhbWJlcnRcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTWVzaExhbWJlcnROb2RlTWF0ZXJpYWw7XHJcbiIsImltcG9ydCBOb2RlTWF0ZXJpYWwgZnJvbSAnLi9Ob2RlTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyBzaGluaW5lc3MsIHNwZWN1bGFyQ29sb3IgfSBmcm9tICcuLi8uLi9ub2Rlcy9jb3JlL1Byb3BlcnR5Tm9kZS5qcyc7XHJcbmltcG9ydCB7IG1hdGVyaWFsU2hpbmluZXNzLCBtYXRlcmlhbFNwZWN1bGFyIH0gZnJvbSAnLi4vLi4vbm9kZXMvYWNjZXNzb3JzL01hdGVyaWFsTm9kZS5qcyc7XHJcbmltcG9ydCB7IGZsb2F0IH0gZnJvbSAnLi4vLi4vbm9kZXMvdHNsL1RTTEJhc2UuanMnO1xyXG5pbXBvcnQgQmFzaWNFbnZpcm9ubWVudE5vZGUgZnJvbSAnLi4vLi4vbm9kZXMvbGlnaHRpbmcvQmFzaWNFbnZpcm9ubWVudE5vZGUuanMnO1xyXG5pbXBvcnQgUGhvbmdMaWdodGluZ01vZGVsIGZyb20gJy4uLy4uL25vZGVzL2Z1bmN0aW9ucy9QaG9uZ0xpZ2h0aW5nTW9kZWwuanMnO1xyXG5cclxuaW1wb3J0IHsgTWVzaFBob25nTWF0ZXJpYWwgfSBmcm9tICcuLi9NZXNoUGhvbmdNYXRlcmlhbC5qcyc7XHJcblxyXG5jb25zdCBfZGVmYXVsdFZhbHVlcyA9IC8qQF9fUFVSRV9fKi8gbmV3IE1lc2hQaG9uZ01hdGVyaWFsKCk7XHJcblxyXG4vKipcclxuICogTm9kZSBtYXRlcmlhbCB2ZXJzaW9uIG9mIHtAbGluayBNZXNoUGhvbmdNYXRlcmlhbH0uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBOb2RlTWF0ZXJpYWxcclxuICovXHJcbmNsYXNzIE1lc2hQaG9uZ05vZGVNYXRlcmlhbCBleHRlbmRzIE5vZGVNYXRlcmlhbCB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ01lc2hQaG9uZ05vZGVNYXRlcmlhbCc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBtZXNoIGxhbWJlcnQgbm9kZSBtYXRlcmlhbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1ldGVyc10gLSBUaGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHBhcmFtZXRlcnMgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNNZXNoUGhvbmdOb2RlTWF0ZXJpYWwgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU2V0IHRvIGB0cnVlYCBiZWNhdXNlIHBob25nIG1hdGVyaWFscyByZWFjdCBvbiBsaWdodHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGlnaHRzID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBzaGluaW5lc3Mgb2YgcGhvbmcgbWF0ZXJpYWxzIGlzIGJ5IGRlZmF1bHQgaW5mZXJyZWQgZnJvbSB0aGUgYHNoaW5pbmVzc2BcclxuXHRcdCAqIHByb3BlcnR5LiBUaGlzIG5vZGUgcHJvcGVydHkgYWxsb3dzIHRvIG92ZXJ3cml0ZSB0aGUgZGVmYXVsdFxyXG5cdFx0ICogYW5kIGRlZmluZSB0aGUgc2hpbmluZXNzIHdpdGggYSBub2RlIGluc3RlYWQuXHJcblx0XHQgKlxyXG5cdFx0ICogSWYgeW91IGRvbid0IHdhbnQgdG8gb3ZlcndyaXRlIHRoZSBzaGluaW5lc3MgYnV0IG1vZGlmeSB0aGUgZXhpc3RpbmdcclxuXHRcdCAqIHZhbHVlIGluc3RlYWQsIHVzZSB7QGxpbmsgbWF0ZXJpYWxTaGluaW5lc3N9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Tm9kZTxmbG9hdD59XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2hpbmluZXNzTm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc3BlY3VsYXIgY29sb3Igb2YgcGhvbmcgbWF0ZXJpYWxzIGlzIGJ5IGRlZmF1bHQgaW5mZXJyZWQgZnJvbSB0aGVcclxuXHRcdCAqIGBzcGVjdWxhcmAgcHJvcGVydHkuIFRoaXMgbm9kZSBwcm9wZXJ0eSBhbGxvd3MgdG8gb3ZlcndyaXRlIHRoZSBkZWZhdWx0XHJcblx0XHQgKiBhbmQgZGVmaW5lIHRoZSBzcGVjdWxhciBjb2xvciB3aXRoIGEgbm9kZSBpbnN0ZWFkLlxyXG5cdFx0ICpcclxuXHRcdCAqIElmIHlvdSBkb24ndCB3YW50IHRvIG92ZXJ3cml0ZSB0aGUgc3BlY3VsYXIgY29sb3IgYnV0IG1vZGlmeSB0aGUgZXhpc3RpbmdcclxuXHRcdCAqIHZhbHVlIGluc3RlYWQsIHVzZSB7QGxpbmsgbWF0ZXJpYWxTcGVjdWxhcn0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPHZlYzM+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNwZWN1bGFyTm9kZSA9IG51bGw7XHJcblxyXG5cdFx0dGhpcy5zZXREZWZhdWx0VmFsdWVzKCBfZGVmYXVsdFZhbHVlcyApO1xyXG5cclxuXHRcdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogT3ZlcndyaXR0ZW4gc2luY2UgdGhpcyB0eXBlIG9mIG1hdGVyaWFsIHVzZXMge0BsaW5rIEJhc2ljRW52aXJvbm1lbnROb2RlfVxyXG5cdCAqIHRvIGltcGxlbWVudCB0aGUgZGVmYXVsdCBlbnZpcm9ubWVudCBtYXBwaW5nLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHs/QmFzaWNFbnZpcm9ubWVudE5vZGU8dmVjMz59IFRoZSBlbnZpcm9ubWVudCBub2RlLlxyXG5cdCAqL1xyXG5cdHNldHVwRW52aXJvbm1lbnQoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgZW52Tm9kZSA9IHN1cGVyLnNldHVwRW52aXJvbm1lbnQoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRyZXR1cm4gZW52Tm9kZSA/IG5ldyBCYXNpY0Vudmlyb25tZW50Tm9kZSggZW52Tm9kZSApIDogbnVsbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXR1cHMgdGhlIGxpZ2h0aW5nIG1vZGVsLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7UGhvbmdMaWdodGluZ01vZGVsfSBUaGUgbGlnaHRpbmcgbW9kZWwuXHJcblx0ICovXHJcblx0c2V0dXBMaWdodGluZ01vZGVsKCAvKmJ1aWxkZXIqLyApIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IFBob25nTGlnaHRpbmdNb2RlbCgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHVwcyB0aGUgcGhvbmcgc3BlY2lmaWMgbm9kZSB2YXJpYWJsZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqL1xyXG5cdHNldHVwVmFyaWFudHMoIC8qYnVpbGRlciovICkge1xyXG5cclxuXHRcdC8vIFNISU5JTkVTU1xyXG5cclxuXHRcdGNvbnN0IHNoaW5pbmVzc05vZGUgPSAoIHRoaXMuc2hpbmluZXNzTm9kZSA/IGZsb2F0KCB0aGlzLnNoaW5pbmVzc05vZGUgKSA6IG1hdGVyaWFsU2hpbmluZXNzICkubWF4KCAxZS00ICk7IC8vIHRvIHByZXZlbnQgcG93KCAwLjAsIDAuMCApXHJcblxyXG5cdFx0c2hpbmluZXNzLmFzc2lnbiggc2hpbmluZXNzTm9kZSApO1xyXG5cclxuXHRcdC8vIFNQRUNVTEFSIENPTE9SXHJcblxyXG5cdFx0Y29uc3Qgc3BlY3VsYXJOb2RlID0gdGhpcy5zcGVjdWxhck5vZGUgfHwgbWF0ZXJpYWxTcGVjdWxhcjtcclxuXHJcblx0XHRzcGVjdWxhckNvbG9yLmFzc2lnbiggc3BlY3VsYXJOb2RlICk7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHRoaXMuc2hpbmluZXNzTm9kZSA9IHNvdXJjZS5zaGluaW5lc3NOb2RlO1xyXG5cdFx0dGhpcy5zcGVjdWxhck5vZGUgPSBzb3VyY2Uuc3BlY3VsYXJOb2RlO1xyXG5cclxuXHRcdHJldHVybiBzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTWVzaFBob25nTm9kZU1hdGVyaWFsO1xyXG4iLCJpbXBvcnQgeyBub3JtYWxWaWV3IH0gZnJvbSAnLi4vLi4vYWNjZXNzb3JzL05vcm1hbC5qcyc7XHJcbmltcG9ydCB7IGZsb2F0LCBGbiB9IGZyb20gJy4uLy4uL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbmNvbnN0IGdldEdlb21ldHJ5Um91Z2huZXNzID0gLypAX19QVVJFX18qLyBGbiggKCBidWlsZGVyICkgPT4ge1xyXG5cclxuXHRpZiAoIGJ1aWxkZXIuZ2VvbWV0cnkuaGFzQXR0cmlidXRlKCAnbm9ybWFsJyApID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRyZXR1cm4gZmxvYXQoIDAgKTtcclxuXHJcblx0fVxyXG5cclxuXHRjb25zdCBkeHkgPSBub3JtYWxWaWV3LmRGZHgoKS5hYnMoKS5tYXgoIG5vcm1hbFZpZXcuZEZkeSgpLmFicygpICk7XHJcblx0Y29uc3QgZ2VvbWV0cnlSb3VnaG5lc3MgPSBkeHkueC5tYXgoIGR4eS55ICkubWF4KCBkeHkueiApO1xyXG5cclxuXHRyZXR1cm4gZ2VvbWV0cnlSb3VnaG5lc3M7XHJcblxyXG59ICk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBnZXRHZW9tZXRyeVJvdWdobmVzcztcclxuIiwiaW1wb3J0IGdldEdlb21ldHJ5Um91Z2huZXNzIGZyb20gJy4vZ2V0R2VvbWV0cnlSb3VnaG5lc3MuanMnO1xyXG5pbXBvcnQgeyBGbiB9IGZyb20gJy4uLy4uL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbmNvbnN0IGdldFJvdWdobmVzcyA9IC8qQF9fUFVSRV9fKi8gRm4oICggaW5wdXRzICkgPT4ge1xyXG5cclxuXHRjb25zdCB7IHJvdWdobmVzcyB9ID0gaW5wdXRzO1xyXG5cclxuXHRjb25zdCBnZW9tZXRyeVJvdWdobmVzcyA9IGdldEdlb21ldHJ5Um91Z2huZXNzKCk7XHJcblxyXG5cdGxldCByb3VnaG5lc3NGYWN0b3IgPSByb3VnaG5lc3MubWF4KCAwLjA1MjUgKTsgLy8gMC4wNTI1IGNvcnJlc3BvbmRzIHRvIHRoZSBiYXNlIG1pcCBvZiBhIDI1NiBjdWJlbWFwLlxyXG5cdHJvdWdobmVzc0ZhY3RvciA9IHJvdWdobmVzc0ZhY3Rvci5hZGQoIGdlb21ldHJ5Um91Z2huZXNzICk7XHJcblx0cm91Z2huZXNzRmFjdG9yID0gcm91Z2huZXNzRmFjdG9yLm1pbiggMS4wICk7XHJcblxyXG5cdHJldHVybiByb3VnaG5lc3NGYWN0b3I7XHJcblxyXG59ICk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBnZXRSb3VnaG5lc3M7XHJcbiIsImltcG9ydCB7IGRpdiB9IGZyb20gJy4uLy4uL21hdGgvT3BlcmF0b3JOb2RlLmpzJztcclxuaW1wb3J0IHsgRVBTSUxPTiB9IGZyb20gJy4uLy4uL21hdGgvTWF0aE5vZGUuanMnO1xyXG5pbXBvcnQgeyBGbiB9IGZyb20gJy4uLy4uL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbi8vIE1vdmluZyBGcm9zdGJpdGUgdG8gUGh5c2ljYWxseSBCYXNlZCBSZW5kZXJpbmcgMy4wIC0gcGFnZSAxMiwgbGlzdGluZyAyXHJcbi8vIGh0dHBzOi8vc2VibGFnYXJkZS5maWxlcy53b3JkcHJlc3MuY29tLzIwMTUvMDcvY291cnNlX25vdGVzX21vdmluZ19mcm9zdGJpdGVfdG9fcGJyX3YzMi5wZGZcclxuY29uc3QgVl9HR1hfU21pdGhDb3JyZWxhdGVkID0gLypAX19QVVJFX18qLyBGbiggKCB7IGFscGhhLCBkb3ROTCwgZG90TlYgfSApID0+IHtcclxuXHJcblx0Y29uc3QgYTIgPSBhbHBoYS5wb3cyKCk7XHJcblxyXG5cdGNvbnN0IGd2ID0gZG90TkwubXVsKCBhMi5hZGQoIGEyLm9uZU1pbnVzKCkubXVsKCBkb3ROVi5wb3cyKCkgKSApLnNxcnQoKSApO1xyXG5cdGNvbnN0IGdsID0gZG90TlYubXVsKCBhMi5hZGQoIGEyLm9uZU1pbnVzKCkubXVsKCBkb3ROTC5wb3cyKCkgKSApLnNxcnQoKSApO1xyXG5cclxuXHRyZXR1cm4gZGl2KCAwLjUsIGd2LmFkZCggZ2wgKS5tYXgoIEVQU0lMT04gKSApO1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdWX0dHWF9TbWl0aENvcnJlbGF0ZWQnLFxyXG5cdHR5cGU6ICdmbG9hdCcsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICdhbHBoYScsIHR5cGU6ICdmbG9hdCcgfSxcclxuXHRcdHsgbmFtZTogJ2RvdE5MJywgdHlwZTogJ2Zsb2F0JyB9LFxyXG5cdFx0eyBuYW1lOiAnZG90TlYnLCB0eXBlOiAnZmxvYXQnIH1cclxuXHRdXHJcbn0gKTsgLy8gdmFsaWRhdGVkXHJcblxyXG5leHBvcnQgZGVmYXVsdCBWX0dHWF9TbWl0aENvcnJlbGF0ZWQ7XHJcbiIsImltcG9ydCB7IGRpdiB9IGZyb20gJy4uLy4uL21hdGgvT3BlcmF0b3JOb2RlLmpzJztcclxuaW1wb3J0IHsgRm4sIHZlYzMgfSBmcm9tICcuLi8uLi90c2wvVFNMQmFzZS5qcyc7XHJcblxyXG4vLyBodHRwczovL2dvb2dsZS5naXRodWIuaW8vZmlsYW1lbnQvRmlsYW1lbnQubWQuaHRtbCNtYXRlcmlhbHN5c3RlbS9hbmlzb3Ryb3BpY21vZGVsL2FuaXNvdHJvcGljc3BlY3VsYXJicmRmXHJcblxyXG5jb25zdCBWX0dHWF9TbWl0aENvcnJlbGF0ZWRfQW5pc290cm9waWMgPSAvKkBfX1BVUkVfXyovIEZuKCAoIHsgYWxwaGFULCBhbHBoYUIsIGRvdFRWLCBkb3RCViwgZG90VEwsIGRvdEJMLCBkb3ROViwgZG90TkwgfSApID0+IHtcclxuXHJcblx0Y29uc3QgZ3YgPSBkb3ROTC5tdWwoIHZlYzMoIGFscGhhVC5tdWwoIGRvdFRWICksIGFscGhhQi5tdWwoIGRvdEJWICksIGRvdE5WICkubGVuZ3RoKCkgKTtcclxuXHRjb25zdCBnbCA9IGRvdE5WLm11bCggdmVjMyggYWxwaGFULm11bCggZG90VEwgKSwgYWxwaGFCLm11bCggZG90QkwgKSwgZG90TkwgKS5sZW5ndGgoKSApO1xyXG5cdGNvbnN0IHYgPSBkaXYoIDAuNSwgZ3YuYWRkKCBnbCApICk7XHJcblxyXG5cdHJldHVybiB2LnNhdHVyYXRlKCk7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ1ZfR0dYX1NtaXRoQ29ycmVsYXRlZF9Bbmlzb3Ryb3BpYycsXHJcblx0dHlwZTogJ2Zsb2F0JyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ2FscGhhVCcsIHR5cGU6ICdmbG9hdCcsIHF1YWxpZmllcjogJ2luJyB9LFxyXG5cdFx0eyBuYW1lOiAnYWxwaGFCJywgdHlwZTogJ2Zsb2F0JywgcXVhbGlmaWVyOiAnaW4nIH0sXHJcblx0XHR7IG5hbWU6ICdkb3RUVicsIHR5cGU6ICdmbG9hdCcsIHF1YWxpZmllcjogJ2luJyB9LFxyXG5cdFx0eyBuYW1lOiAnZG90QlYnLCB0eXBlOiAnZmxvYXQnLCBxdWFsaWZpZXI6ICdpbicgfSxcclxuXHRcdHsgbmFtZTogJ2RvdFRMJywgdHlwZTogJ2Zsb2F0JywgcXVhbGlmaWVyOiAnaW4nIH0sXHJcblx0XHR7IG5hbWU6ICdkb3RCTCcsIHR5cGU6ICdmbG9hdCcsIHF1YWxpZmllcjogJ2luJyB9LFxyXG5cdFx0eyBuYW1lOiAnZG90TlYnLCB0eXBlOiAnZmxvYXQnLCBxdWFsaWZpZXI6ICdpbicgfSxcclxuXHRcdHsgbmFtZTogJ2RvdE5MJywgdHlwZTogJ2Zsb2F0JywgcXVhbGlmaWVyOiAnaW4nIH1cclxuXHRdXHJcbn0gKTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IFZfR0dYX1NtaXRoQ29ycmVsYXRlZF9Bbmlzb3Ryb3BpYztcclxuIiwiaW1wb3J0IHsgRm4gfSBmcm9tICcuLi8uLi90c2wvVFNMQmFzZS5qcyc7XHJcblxyXG4vLyBNaWNyb2ZhY2V0IE1vZGVscyBmb3IgUmVmcmFjdGlvbiB0aHJvdWdoIFJvdWdoIFN1cmZhY2VzIC0gZXF1YXRpb24gKDMzKVxyXG4vLyBodHRwOi8vZ3JhcGhpY3JhbnRzLmJsb2dzcG90LmNvbS8yMDEzLzA4L3NwZWN1bGFyLWJyZGYtcmVmZXJlbmNlLmh0bWxcclxuLy8gYWxwaGEgaXMgXCJyb3VnaG5lc3Mgc3F1YXJlZFwiIGluIERpc25leeKAmXMgcmVwYXJhbWV0ZXJpemF0aW9uXHJcbmNvbnN0IERfR0dYID0gLypAX19QVVJFX18qLyBGbiggKCB7IGFscGhhLCBkb3ROSCB9ICkgPT4ge1xyXG5cclxuXHRjb25zdCBhMiA9IGFscGhhLnBvdzIoKTtcclxuXHJcblx0Y29uc3QgZGVub20gPSBkb3ROSC5wb3cyKCkubXVsKCBhMi5vbmVNaW51cygpICkub25lTWludXMoKTsgLy8gYXZvaWQgYWxwaGEgPSAwIHdpdGggZG90TkggPSAxXHJcblxyXG5cdHJldHVybiBhMi5kaXYoIGRlbm9tLnBvdzIoKSApLm11bCggMSAvIE1hdGguUEkgKTtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnRF9HR1gnLFxyXG5cdHR5cGU6ICdmbG9hdCcsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICdhbHBoYScsIHR5cGU6ICdmbG9hdCcgfSxcclxuXHRcdHsgbmFtZTogJ2RvdE5IJywgdHlwZTogJ2Zsb2F0JyB9XHJcblx0XVxyXG59ICk7IC8vIHZhbGlkYXRlZFxyXG5cclxuZXhwb3J0IGRlZmF1bHQgRF9HR1g7XHJcbiIsImltcG9ydCB7IEZuLCBmbG9hdCwgdmVjMyB9IGZyb20gJy4uLy4uL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbmNvbnN0IFJFQ0lQUk9DQUxfUEkgPSAvKkBfX1BVUkVfXyovIGZsb2F0KCAxIC8gTWF0aC5QSSApO1xyXG5cclxuLy8gaHR0cHM6Ly9nb29nbGUuZ2l0aHViLmlvL2ZpbGFtZW50L0ZpbGFtZW50Lm1kLmh0bWwjbWF0ZXJpYWxzeXN0ZW0vYW5pc290cm9waWNtb2RlbC9hbmlzb3Ryb3BpY3NwZWN1bGFyYnJkZlxyXG5cclxuY29uc3QgRF9HR1hfQW5pc290cm9waWMgPSAvKkBfX1BVUkVfXyovIEZuKCAoIHsgYWxwaGFULCBhbHBoYUIsIGRvdE5ILCBkb3RUSCwgZG90QkggfSApID0+IHtcclxuXHJcblx0Y29uc3QgYTIgPSBhbHBoYVQubXVsKCBhbHBoYUIgKTtcclxuXHRjb25zdCB2ID0gdmVjMyggYWxwaGFCLm11bCggZG90VEggKSwgYWxwaGFULm11bCggZG90QkggKSwgYTIubXVsKCBkb3ROSCApICk7XHJcblx0Y29uc3QgdjIgPSB2LmRvdCggdiApO1xyXG5cdGNvbnN0IHcyID0gYTIuZGl2KCB2MiApO1xyXG5cclxuXHRyZXR1cm4gUkVDSVBST0NBTF9QSS5tdWwoIGEyLm11bCggdzIucG93MigpICkgKTtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnRF9HR1hfQW5pc290cm9waWMnLFxyXG5cdHR5cGU6ICdmbG9hdCcsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICdhbHBoYVQnLCB0eXBlOiAnZmxvYXQnLCBxdWFsaWZpZXI6ICdpbicgfSxcclxuXHRcdHsgbmFtZTogJ2FscGhhQicsIHR5cGU6ICdmbG9hdCcsIHF1YWxpZmllcjogJ2luJyB9LFxyXG5cdFx0eyBuYW1lOiAnZG90TkgnLCB0eXBlOiAnZmxvYXQnLCBxdWFsaWZpZXI6ICdpbicgfSxcclxuXHRcdHsgbmFtZTogJ2RvdFRIJywgdHlwZTogJ2Zsb2F0JywgcXVhbGlmaWVyOiAnaW4nIH0sXHJcblx0XHR7IG5hbWU6ICdkb3RCSCcsIHR5cGU6ICdmbG9hdCcsIHF1YWxpZmllcjogJ2luJyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBEX0dHWF9Bbmlzb3Ryb3BpYztcclxuIiwiaW1wb3J0IEZfU2NobGljayBmcm9tICcuL0ZfU2NobGljay5qcyc7XHJcbmltcG9ydCBWX0dHWF9TbWl0aENvcnJlbGF0ZWQgZnJvbSAnLi9WX0dHWF9TbWl0aENvcnJlbGF0ZWQuanMnO1xyXG5pbXBvcnQgVl9HR1hfU21pdGhDb3JyZWxhdGVkX0FuaXNvdHJvcGljIGZyb20gJy4vVl9HR1hfU21pdGhDb3JyZWxhdGVkX0FuaXNvdHJvcGljLmpzJztcclxuaW1wb3J0IERfR0dYIGZyb20gJy4vRF9HR1guanMnO1xyXG5pbXBvcnQgRF9HR1hfQW5pc290cm9waWMgZnJvbSAnLi9EX0dHWF9Bbmlzb3Ryb3BpYy5qcyc7XHJcbmltcG9ydCB7IHRyYW5zZm9ybWVkTm9ybWFsVmlldyB9IGZyb20gJy4uLy4uL2FjY2Vzc29ycy9Ob3JtYWwuanMnO1xyXG5pbXBvcnQgeyBwb3NpdGlvblZpZXdEaXJlY3Rpb24gfSBmcm9tICcuLi8uLi9hY2Nlc3NvcnMvUG9zaXRpb24uanMnO1xyXG5pbXBvcnQgeyBpcmlkZXNjZW5jZSwgYWxwaGFULCBhbmlzb3Ryb3B5VCwgYW5pc290cm9weUIgfSBmcm9tICcuLi8uLi9jb3JlL1Byb3BlcnR5Tm9kZS5qcyc7XHJcbmltcG9ydCB7IEZuLCBkZWZpbmVkIH0gZnJvbSAnLi4vLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5cclxuLy8gR0dYIERpc3RyaWJ1dGlvbiwgU2NobGljayBGcmVzbmVsLCBHR1hfU21pdGhDb3JyZWxhdGVkIFZpc2liaWxpdHlcclxuY29uc3QgQlJERl9HR1ggPSAvKkBfX1BVUkVfXyovIEZuKCAoIGlucHV0cyApID0+IHtcclxuXHJcblx0Y29uc3QgeyBsaWdodERpcmVjdGlvbiwgZjAsIGY5MCwgcm91Z2huZXNzLCBmLCBVU0VfSVJJREVTQ0VOQ0UsIFVTRV9BTklTT1RST1BZIH0gPSBpbnB1dHM7XHJcblxyXG5cdGNvbnN0IG5vcm1hbFZpZXcgPSBpbnB1dHMubm9ybWFsVmlldyB8fCB0cmFuc2Zvcm1lZE5vcm1hbFZpZXc7XHJcblxyXG5cdGNvbnN0IGFscGhhID0gcm91Z2huZXNzLnBvdzIoKTsgLy8gVUU0J3Mgcm91Z2huZXNzXHJcblxyXG5cdGNvbnN0IGhhbGZEaXIgPSBsaWdodERpcmVjdGlvbi5hZGQoIHBvc2l0aW9uVmlld0RpcmVjdGlvbiApLm5vcm1hbGl6ZSgpO1xyXG5cclxuXHRjb25zdCBkb3ROTCA9IG5vcm1hbFZpZXcuZG90KCBsaWdodERpcmVjdGlvbiApLmNsYW1wKCk7XHJcblx0Y29uc3QgZG90TlYgPSBub3JtYWxWaWV3LmRvdCggcG9zaXRpb25WaWV3RGlyZWN0aW9uICkuY2xhbXAoKTsgLy8gQCBUT0RPOiBNb3ZlIHRvIGNvcmUgZG90TlZcclxuXHRjb25zdCBkb3ROSCA9IG5vcm1hbFZpZXcuZG90KCBoYWxmRGlyICkuY2xhbXAoKTtcclxuXHRjb25zdCBkb3RWSCA9IHBvc2l0aW9uVmlld0RpcmVjdGlvbi5kb3QoIGhhbGZEaXIgKS5jbGFtcCgpO1xyXG5cclxuXHRsZXQgRiA9IEZfU2NobGljayggeyBmMCwgZjkwLCBkb3RWSCB9ICk7XHJcblx0bGV0IFYsIEQ7XHJcblxyXG5cdGlmICggZGVmaW5lZCggVVNFX0lSSURFU0NFTkNFICkgKSB7XHJcblxyXG5cdFx0RiA9IGlyaWRlc2NlbmNlLm1peCggRiwgZiApO1xyXG5cclxuXHR9XHJcblxyXG5cdGlmICggZGVmaW5lZCggVVNFX0FOSVNPVFJPUFkgKSApIHtcclxuXHJcblx0XHRjb25zdCBkb3RUTCA9IGFuaXNvdHJvcHlULmRvdCggbGlnaHREaXJlY3Rpb24gKTtcclxuXHRcdGNvbnN0IGRvdFRWID0gYW5pc290cm9weVQuZG90KCBwb3NpdGlvblZpZXdEaXJlY3Rpb24gKTtcclxuXHRcdGNvbnN0IGRvdFRIID0gYW5pc290cm9weVQuZG90KCBoYWxmRGlyICk7XHJcblx0XHRjb25zdCBkb3RCTCA9IGFuaXNvdHJvcHlCLmRvdCggbGlnaHREaXJlY3Rpb24gKTtcclxuXHRcdGNvbnN0IGRvdEJWID0gYW5pc290cm9weUIuZG90KCBwb3NpdGlvblZpZXdEaXJlY3Rpb24gKTtcclxuXHRcdGNvbnN0IGRvdEJIID0gYW5pc290cm9weUIuZG90KCBoYWxmRGlyICk7XHJcblxyXG5cdFx0ViA9IFZfR0dYX1NtaXRoQ29ycmVsYXRlZF9Bbmlzb3Ryb3BpYyggeyBhbHBoYVQsIGFscGhhQjogYWxwaGEsIGRvdFRWLCBkb3RCViwgZG90VEwsIGRvdEJMLCBkb3ROViwgZG90TkwgfSApO1xyXG5cdFx0RCA9IERfR0dYX0FuaXNvdHJvcGljKCB7IGFscGhhVCwgYWxwaGFCOiBhbHBoYSwgZG90TkgsIGRvdFRILCBkb3RCSCB9ICk7XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0ViA9IFZfR0dYX1NtaXRoQ29ycmVsYXRlZCggeyBhbHBoYSwgZG90TkwsIGRvdE5WIH0gKTtcclxuXHRcdEQgPSBEX0dHWCggeyBhbHBoYSwgZG90TkggfSApO1xyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiBGLm11bCggViApLm11bCggRCApO1xyXG5cclxufSApOyAvLyB2YWxpZGF0ZWRcclxuXHJcbmV4cG9ydCBkZWZhdWx0IEJSREZfR0dYO1xyXG4iLCJpbXBvcnQgeyBGbiwgdmVjMiwgdmVjNCB9IGZyb20gJy4uLy4uL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbi8vIEFuYWx5dGljYWwgYXBwcm94aW1hdGlvbiBvZiB0aGUgREZHIExVVCwgb25lIGhhbGYgb2YgdGhlXHJcbi8vIHNwbGl0LXN1bSBhcHByb3hpbWF0aW9uIHVzZWQgaW4gaW5kaXJlY3Qgc3BlY3VsYXIgbGlnaHRpbmcuXHJcbi8vIHZpYSAnZW52aXJvbm1lbnRCUkRGJyBmcm9tIFwiUGh5c2ljYWxseSBCYXNlZCBTaGFkaW5nIG9uIE1vYmlsZVwiXHJcbi8vIGh0dHBzOi8vd3d3LnVucmVhbGVuZ2luZS5jb20vYmxvZy9waHlzaWNhbGx5LWJhc2VkLXNoYWRpbmctb24tbW9iaWxlXHJcbmNvbnN0IERGR0FwcHJveCA9IC8qQF9fUFVSRV9fKi8gRm4oICggeyByb3VnaG5lc3MsIGRvdE5WIH0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IGMwID0gdmVjNCggLSAxLCAtIDAuMDI3NSwgLSAwLjU3MiwgMC4wMjIgKTtcclxuXHJcblx0Y29uc3QgYzEgPSB2ZWM0KCAxLCAwLjA0MjUsIDEuMDQsIC0gMC4wNCApO1xyXG5cclxuXHRjb25zdCByID0gcm91Z2huZXNzLm11bCggYzAgKS5hZGQoIGMxICk7XHJcblxyXG5cdGNvbnN0IGEwMDQgPSByLngubXVsKCByLnggKS5taW4oIGRvdE5WLm11bCggLSA5LjI4ICkuZXhwMigpICkubXVsKCByLnggKS5hZGQoIHIueSApO1xyXG5cclxuXHRjb25zdCBmYWIgPSB2ZWMyKCAtIDEuMDQsIDEuMDQgKS5tdWwoIGEwMDQgKS5hZGQoIHIuencgKTtcclxuXHJcblx0cmV0dXJuIGZhYjtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnREZHQXBwcm94JyxcclxuXHR0eXBlOiAndmVjMicsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICdyb3VnaG5lc3MnLCB0eXBlOiAnZmxvYXQnIH0sXHJcblx0XHR7IG5hbWU6ICdkb3ROVicsIHR5cGU6ICd2ZWMzJyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBERkdBcHByb3g7XHJcbiIsImltcG9ydCBERkdBcHByb3ggZnJvbSAnLi9ERkdBcHByb3guanMnO1xyXG5pbXBvcnQgeyBGbiB9IGZyb20gJy4uLy4uL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbmNvbnN0IEVudmlyb25tZW50QlJERiA9IC8qQF9fUFVSRV9fKi8gRm4oICggaW5wdXRzICkgPT4ge1xyXG5cclxuXHRjb25zdCB7IGRvdE5WLCBzcGVjdWxhckNvbG9yLCBzcGVjdWxhckY5MCwgcm91Z2huZXNzIH0gPSBpbnB1dHM7XHJcblxyXG5cdGNvbnN0IGZhYiA9IERGR0FwcHJveCggeyBkb3ROViwgcm91Z2huZXNzIH0gKTtcclxuXHRyZXR1cm4gc3BlY3VsYXJDb2xvci5tdWwoIGZhYi54ICkuYWRkKCBzcGVjdWxhckY5MC5tdWwoIGZhYi55ICkgKTtcclxuXHJcbn0gKTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IEVudmlyb25tZW50QlJERjtcclxuIiwiaW1wb3J0IHsgRm4sIHZlYzMgfSBmcm9tICcuLi8uLi90c2wvVFNMQmFzZS5qcyc7XHJcblxyXG5jb25zdCBTY2hsaWNrX3RvX0YwID0gLypAX19QVVJFX18qLyBGbiggKCB7IGYsIGY5MCwgZG90VkggfSApID0+IHtcclxuXHJcblx0Y29uc3QgeCA9IGRvdFZILm9uZU1pbnVzKCkuc2F0dXJhdGUoKTtcclxuXHRjb25zdCB4MiA9IHgubXVsKCB4ICk7XHJcblx0Y29uc3QgeDUgPSB4Lm11bCggeDIsIHgyICkuY2xhbXAoIDAsIC45OTk5ICk7XHJcblxyXG5cdHJldHVybiBmLnN1YiggdmVjMyggZjkwICkubXVsKCB4NSApICkuZGl2KCB4NS5vbmVNaW51cygpICk7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ1NjaGxpY2tfdG9fRjAnLFxyXG5cdHR5cGU6ICd2ZWMzJyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ2YnLCB0eXBlOiAndmVjMycgfSxcclxuXHRcdHsgbmFtZTogJ2Y5MCcsIHR5cGU6ICdmbG9hdCcgfSxcclxuXHRcdHsgbmFtZTogJ2RvdFZIJywgdHlwZTogJ2Zsb2F0JyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTY2hsaWNrX3RvX0YwO1xyXG4iLCJpbXBvcnQgeyB0cmFuc2Zvcm1lZE5vcm1hbFZpZXcgfSBmcm9tICcuLi8uLi9hY2Nlc3NvcnMvTm9ybWFsLmpzJztcclxuaW1wb3J0IHsgcG9zaXRpb25WaWV3RGlyZWN0aW9uIH0gZnJvbSAnLi4vLi4vYWNjZXNzb3JzL1Bvc2l0aW9uLmpzJztcclxuaW1wb3J0IHsgc2hlZW4sIHNoZWVuUm91Z2huZXNzIH0gZnJvbSAnLi4vLi4vY29yZS9Qcm9wZXJ0eU5vZGUuanMnO1xyXG5pbXBvcnQgeyBGbiwgZmxvYXQgfSBmcm9tICcuLi8uLi90c2wvVFNMQmFzZS5qcyc7XHJcblxyXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2ZpbGFtZW50L2Jsb2IvbWFzdGVyL3NoYWRlcnMvc3JjL2JyZGYuZnNcclxuY29uc3QgRF9DaGFybGllID0gLypAX19QVVJFX18qLyBGbiggKCB7IHJvdWdobmVzcywgZG90TkggfSApID0+IHtcclxuXHJcblx0Y29uc3QgYWxwaGEgPSByb3VnaG5lc3MucG93MigpO1xyXG5cclxuXHQvLyBFc3RldmV6IGFuZCBLdWxsYSAyMDE3LCBcIlByb2R1Y3Rpb24gRnJpZW5kbHkgTWljcm9mYWNldCBTaGVlbiBCUkRGXCJcclxuXHRjb25zdCBpbnZBbHBoYSA9IGZsb2F0KCAxLjAgKS5kaXYoIGFscGhhICk7XHJcblx0Y29uc3QgY29zMmggPSBkb3ROSC5wb3cyKCk7XHJcblx0Y29uc3Qgc2luMmggPSBjb3MyaC5vbmVNaW51cygpLm1heCggMC4wMDc4MTI1ICk7IC8vIDJeKC0xNC8yKSwgc28gc2luMmheMiA+IDAgaW4gZnAxNlxyXG5cclxuXHRyZXR1cm4gZmxvYXQoIDIuMCApLmFkZCggaW52QWxwaGEgKS5tdWwoIHNpbjJoLnBvdyggaW52QWxwaGEubXVsKCAwLjUgKSApICkuZGl2KCAyLjAgKiBNYXRoLlBJICk7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ0RfQ2hhcmxpZScsXHJcblx0dHlwZTogJ2Zsb2F0JyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ3JvdWdobmVzcycsIHR5cGU6ICdmbG9hdCcgfSxcclxuXHRcdHsgbmFtZTogJ2RvdE5IJywgdHlwZTogJ2Zsb2F0JyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2ZpbGFtZW50L2Jsb2IvbWFzdGVyL3NoYWRlcnMvc3JjL2JyZGYuZnNcclxuY29uc3QgVl9OZXViZWx0ID0gLypAX19QVVJFX18qLyBGbiggKCB7IGRvdE5WLCBkb3ROTCB9ICkgPT4ge1xyXG5cclxuXHQvLyBOZXViZWx0IGFuZCBQZXR0aW5lbyAyMDEzLCBcIkNyYWZ0aW5nIGEgTmV4dC1nZW4gTWF0ZXJpYWwgUGlwZWxpbmUgZm9yIFRoZSBPcmRlcjogMTg4NlwiXHJcblx0cmV0dXJuIGZsb2F0KCAxLjAgKS5kaXYoIGZsb2F0KCA0LjAgKS5tdWwoIGRvdE5MLmFkZCggZG90TlYgKS5zdWIoIGRvdE5MLm11bCggZG90TlYgKSApICkgKTtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnVl9OZXViZWx0JyxcclxuXHR0eXBlOiAnZmxvYXQnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAnZG90TlYnLCB0eXBlOiAnZmxvYXQnIH0sXHJcblx0XHR7IG5hbWU6ICdkb3ROTCcsIHR5cGU6ICdmbG9hdCcgfVxyXG5cdF1cclxufSApO1xyXG5cclxuY29uc3QgQlJERl9TaGVlbiA9IC8qQF9fUFVSRV9fKi8gRm4oICggeyBsaWdodERpcmVjdGlvbiB9ICkgPT4ge1xyXG5cclxuXHRjb25zdCBoYWxmRGlyID0gbGlnaHREaXJlY3Rpb24uYWRkKCBwb3NpdGlvblZpZXdEaXJlY3Rpb24gKS5ub3JtYWxpemUoKTtcclxuXHJcblx0Y29uc3QgZG90TkwgPSB0cmFuc2Zvcm1lZE5vcm1hbFZpZXcuZG90KCBsaWdodERpcmVjdGlvbiApLmNsYW1wKCk7XHJcblx0Y29uc3QgZG90TlYgPSB0cmFuc2Zvcm1lZE5vcm1hbFZpZXcuZG90KCBwb3NpdGlvblZpZXdEaXJlY3Rpb24gKS5jbGFtcCgpO1xyXG5cdGNvbnN0IGRvdE5IID0gdHJhbnNmb3JtZWROb3JtYWxWaWV3LmRvdCggaGFsZkRpciApLmNsYW1wKCk7XHJcblxyXG5cdGNvbnN0IEQgPSBEX0NoYXJsaWUoIHsgcm91Z2huZXNzOiBzaGVlblJvdWdobmVzcywgZG90TkggfSApO1xyXG5cdGNvbnN0IFYgPSBWX05ldWJlbHQoIHsgZG90TlYsIGRvdE5MIH0gKTtcclxuXHJcblx0cmV0dXJuIHNoZWVuLm11bCggRCApLm11bCggViApO1xyXG5cclxufSApO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgQlJERl9TaGVlbjtcclxuIiwiaW1wb3J0IHsgRm4sIElmLCBtYXQzLCB2ZWMyLCB2ZWMzIH0gZnJvbSAnLi4vLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5pbXBvcnQgeyBtYXggfSBmcm9tICcuLi8uLi9tYXRoL01hdGhOb2RlLmpzJztcclxuXHJcbi8vIFJlY3QgQXJlYSBMaWdodFxyXG5cclxuLy8gUmVhbC1UaW1lIFBvbHlnb25hbC1MaWdodCBTaGFkaW5nIHdpdGggTGluZWFybHkgVHJhbnNmb3JtZWQgQ29zaW5lc1xyXG4vLyBieSBFcmljIEhlaXR6LCBKb25hdGhhbiBEdXB1eSwgU3RlcGhlbiBIaWxsIGFuZCBEYXZpZCBOZXViZWx0XHJcbi8vIGNvZGU6IGh0dHBzOi8vZ2l0aHViLmNvbS9zZWxmc2hhZG93L2x0Y19jb2RlL1xyXG5cclxuY29uc3QgTFRDX1V2ID0gLypAX19QVVJFX18qLyBGbiggKCB7IE4sIFYsIHJvdWdobmVzcyB9ICkgPT4ge1xyXG5cclxuXHRjb25zdCBMVVRfU0laRSA9IDY0LjA7XHJcblx0Y29uc3QgTFVUX1NDQUxFID0gKCBMVVRfU0laRSAtIDEuMCApIC8gTFVUX1NJWkU7XHJcblx0Y29uc3QgTFVUX0JJQVMgPSAwLjUgLyBMVVRfU0laRTtcclxuXHJcblx0Y29uc3QgZG90TlYgPSBOLmRvdCggViApLnNhdHVyYXRlKCk7XHJcblxyXG5cdC8vIHRleHR1cmUgcGFyYW1ldGVyaXplZCBieSBzcXJ0KCBHR1ggYWxwaGEgKSBhbmQgc3FydCggMSAtIGNvcyggdGhldGEgKSApXHJcblx0Y29uc3QgdXYgPSB2ZWMyKCByb3VnaG5lc3MsIGRvdE5WLm9uZU1pbnVzKCkuc3FydCgpICk7XHJcblxyXG5cdHV2LmFzc2lnbiggdXYubXVsKCBMVVRfU0NBTEUgKS5hZGQoIExVVF9CSUFTICkgKTtcclxuXHJcblx0cmV0dXJuIHV2O1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdMVENfVXYnLFxyXG5cdHR5cGU6ICd2ZWMyJyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ04nLCB0eXBlOiAndmVjMycgfSxcclxuXHRcdHsgbmFtZTogJ1YnLCB0eXBlOiAndmVjMycgfSxcclxuXHRcdHsgbmFtZTogJ3JvdWdobmVzcycsIHR5cGU6ICdmbG9hdCcgfVxyXG5cdF1cclxufSApO1xyXG5cclxuY29uc3QgTFRDX0NsaXBwZWRTcGhlcmVGb3JtRmFjdG9yID0gLypAX19QVVJFX18qLyBGbiggKCB7IGYgfSApID0+IHtcclxuXHJcblx0Ly8gUmVhbC1UaW1lIEFyZWEgTGlnaHRpbmc6IGEgSm91cm5leSBmcm9tIFJlc2VhcmNoIHRvIFByb2R1Y3Rpb24gKHAuMTAyKVxyXG5cdC8vIEFuIGFwcHJveGltYXRpb24gb2YgdGhlIGZvcm0gZmFjdG9yIG9mIGEgaG9yaXpvbi1jbGlwcGVkIHJlY3RhbmdsZS5cclxuXHJcblx0Y29uc3QgbCA9IGYubGVuZ3RoKCk7XHJcblxyXG5cdHJldHVybiBtYXgoIGwubXVsKCBsICkuYWRkKCBmLnogKS5kaXYoIGwuYWRkKCAxLjAgKSApLCAwICk7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ0xUQ19DbGlwcGVkU3BoZXJlRm9ybUZhY3RvcicsXHJcblx0dHlwZTogJ2Zsb2F0JyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ2YnLCB0eXBlOiAndmVjMycgfVxyXG5cdF1cclxufSApO1xyXG5cclxuY29uc3QgTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yID0gLypAX19QVVJFX18qLyBGbiggKCB7IHYxLCB2MiB9ICkgPT4ge1xyXG5cclxuXHRjb25zdCB4ID0gdjEuZG90KCB2MiApO1xyXG5cdGNvbnN0IHkgPSB4LmFicygpLnRvVmFyKCk7XHJcblxyXG5cdC8vIHJhdGlvbmFsIHBvbHlub21pYWwgYXBwcm94aW1hdGlvbiB0byB0aGV0YSAvIHNpbiggdGhldGEgKSAvIDJQSVxyXG5cdGNvbnN0IGEgPSB5Lm11bCggMC4wMTQ1MjA2ICkuYWRkKCAwLjQ5NjUxNTUgKS5tdWwoIHkgKS5hZGQoIDAuODU0Mzk4NSApLnRvVmFyKCk7XHJcblx0Y29uc3QgYiA9IHkuYWRkKCA0LjE2MTY3MjQgKS5tdWwoIHkgKS5hZGQoIDMuNDE3NTk0MCApLnRvVmFyKCk7XHJcblx0Y29uc3QgdiA9IGEuZGl2KCBiICk7XHJcblxyXG5cdGNvbnN0IHRoZXRhX3NpbnRoZXRhID0geC5ncmVhdGVyVGhhbiggMC4wICkuc2VsZWN0KCB2LCBtYXgoIHgubXVsKCB4ICkub25lTWludXMoKSwgMWUtNyApLmludmVyc2VTcXJ0KCkubXVsKCAwLjUgKS5zdWIoIHYgKSApO1xyXG5cclxuXHRyZXR1cm4gdjEuY3Jvc3MoIHYyICkubXVsKCB0aGV0YV9zaW50aGV0YSApO1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdMVENfRWRnZVZlY3RvckZvcm1GYWN0b3InLFxyXG5cdHR5cGU6ICd2ZWMzJyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ3YxJywgdHlwZTogJ3ZlYzMnIH0sXHJcblx0XHR7IG5hbWU6ICd2MicsIHR5cGU6ICd2ZWMzJyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5jb25zdCBMVENfRXZhbHVhdGUgPSAvKkBfX1BVUkVfXyovIEZuKCAoIHsgTiwgViwgUCwgbUludiwgcDAsIHAxLCBwMiwgcDMgfSApID0+IHtcclxuXHJcblx0Ly8gYmFpbCBpZiBwb2ludCBpcyBvbiBiYWNrIHNpZGUgb2YgcGxhbmUgb2YgbGlnaHRcclxuXHQvLyBhc3N1bWVzIGNjdyB3aW5kaW5nIG9yZGVyIG9mIGxpZ2h0IHZlcnRpY2VzXHJcblx0Y29uc3QgdjEgPSBwMS5zdWIoIHAwICkudG9WYXIoKTtcclxuXHRjb25zdCB2MiA9IHAzLnN1YiggcDAgKS50b1ZhcigpO1xyXG5cclxuXHRjb25zdCBsaWdodE5vcm1hbCA9IHYxLmNyb3NzKCB2MiApO1xyXG5cdGNvbnN0IHJlc3VsdCA9IHZlYzMoKS50b1ZhcigpO1xyXG5cclxuXHRJZiggbGlnaHROb3JtYWwuZG90KCBQLnN1YiggcDAgKSApLmdyZWF0ZXJUaGFuRXF1YWwoIDAuMCApLCAoKSA9PiB7XHJcblxyXG5cdFx0Ly8gY29uc3RydWN0IG9ydGhvbm9ybWFsIGJhc2lzIGFyb3VuZCBOXHJcblx0XHRjb25zdCBUMSA9IFYuc3ViKCBOLm11bCggVi5kb3QoIE4gKSApICkubm9ybWFsaXplKCk7XHJcblx0XHRjb25zdCBUMiA9IE4uY3Jvc3MoIFQxICkubmVnYXRlKCk7IC8vIG5lZ2F0ZWQgZnJvbSBwYXBlcjsgcG9zc2libHkgZHVlIHRvIGEgZGlmZmVyZW50IGhhbmRlZG5lc3Mgb2Ygd29ybGQgY29vcmRpbmF0ZSBzeXN0ZW1cclxuXHJcblx0XHQvLyBjb21wdXRlIHRyYW5zZm9ybVxyXG5cdFx0Y29uc3QgbWF0ID0gbUludi5tdWwoIG1hdDMoIFQxLCBUMiwgTiApLnRyYW5zcG9zZSgpICkudG9WYXIoKTtcclxuXHJcblx0XHQvLyB0cmFuc2Zvcm0gcmVjdFxyXG5cdFx0Ly8gJiBwcm9qZWN0IHJlY3Qgb250byBzcGhlcmVcclxuXHRcdGNvbnN0IGNvb3JkczAgPSBtYXQubXVsKCBwMC5zdWIoIFAgKSApLm5vcm1hbGl6ZSgpLnRvVmFyKCk7XHJcblx0XHRjb25zdCBjb29yZHMxID0gbWF0Lm11bCggcDEuc3ViKCBQICkgKS5ub3JtYWxpemUoKS50b1ZhcigpO1xyXG5cdFx0Y29uc3QgY29vcmRzMiA9IG1hdC5tdWwoIHAyLnN1YiggUCApICkubm9ybWFsaXplKCkudG9WYXIoKTtcclxuXHRcdGNvbnN0IGNvb3JkczMgPSBtYXQubXVsKCBwMy5zdWIoIFAgKSApLm5vcm1hbGl6ZSgpLnRvVmFyKCk7XHJcblxyXG5cdFx0Ly8gY2FsY3VsYXRlIHZlY3RvciBmb3JtIGZhY3RvclxyXG5cdFx0Y29uc3QgdmVjdG9yRm9ybUZhY3RvciA9IHZlYzMoIDAgKS50b1ZhcigpO1xyXG5cdFx0dmVjdG9yRm9ybUZhY3Rvci5hZGRBc3NpZ24oIExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggeyB2MTogY29vcmRzMCwgdjI6IGNvb3JkczEgfSApICk7XHJcblx0XHR2ZWN0b3JGb3JtRmFjdG9yLmFkZEFzc2lnbiggTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCB7IHYxOiBjb29yZHMxLCB2MjogY29vcmRzMiB9ICkgKTtcclxuXHRcdHZlY3RvckZvcm1GYWN0b3IuYWRkQXNzaWduKCBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIHsgdjE6IGNvb3JkczIsIHYyOiBjb29yZHMzIH0gKSApO1xyXG5cdFx0dmVjdG9yRm9ybUZhY3Rvci5hZGRBc3NpZ24oIExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggeyB2MTogY29vcmRzMywgdjI6IGNvb3JkczAgfSApICk7XHJcblxyXG5cdFx0Ly8gYWRqdXN0IGZvciBob3Jpem9uIGNsaXBwaW5nXHJcblx0XHRyZXN1bHQuYXNzaWduKCB2ZWMzKCBMVENfQ2xpcHBlZFNwaGVyZUZvcm1GYWN0b3IoIHsgZjogdmVjdG9yRm9ybUZhY3RvciB9ICkgKSApO1xyXG5cclxuXHR9ICk7XHJcblxyXG5cdHJldHVybiByZXN1bHQ7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ0xUQ19FdmFsdWF0ZScsXHJcblx0dHlwZTogJ3ZlYzMnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAnTicsIHR5cGU6ICd2ZWMzJyB9LFxyXG5cdFx0eyBuYW1lOiAnVicsIHR5cGU6ICd2ZWMzJyB9LFxyXG5cdFx0eyBuYW1lOiAnUCcsIHR5cGU6ICd2ZWMzJyB9LFxyXG5cdFx0eyBuYW1lOiAnbUludicsIHR5cGU6ICdtYXQzJyB9LFxyXG5cdFx0eyBuYW1lOiAncDAnLCB0eXBlOiAndmVjMycgfSxcclxuXHRcdHsgbmFtZTogJ3AxJywgdHlwZTogJ3ZlYzMnIH0sXHJcblx0XHR7IG5hbWU6ICdwMicsIHR5cGU6ICd2ZWMzJyB9LFxyXG5cdFx0eyBuYW1lOiAncDMnLCB0eXBlOiAndmVjMycgfVxyXG5cdF1cclxufSApO1xyXG5cclxuY29uc3QgTFRDX0V2YWx1YXRlX1ZvbHVtZSA9IC8qQF9fUFVSRV9fKi8gRm4oICggeyBQLCBwMCwgcDEsIHAyLCBwMyB9ICkgPT4ge1xyXG5cclxuXHQvLyBiYWlsIGlmIHBvaW50IGlzIG9uIGJhY2sgc2lkZSBvZiBwbGFuZSBvZiBsaWdodFxyXG5cdC8vIGFzc3VtZXMgY2N3IHdpbmRpbmcgb3JkZXIgb2YgbGlnaHQgdmVydGljZXNcclxuXHRjb25zdCB2MSA9IHAxLnN1YiggcDAgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHYyID0gcDMuc3ViKCBwMCApLnRvVmFyKCk7XHJcblxyXG5cdGNvbnN0IGxpZ2h0Tm9ybWFsID0gdjEuY3Jvc3MoIHYyICk7XHJcblx0Y29uc3QgcmVzdWx0ID0gdmVjMygpLnRvVmFyKCk7XHJcblxyXG5cdElmKCBsaWdodE5vcm1hbC5kb3QoIFAuc3ViKCBwMCApICkuZ3JlYXRlclRoYW5FcXVhbCggMC4wICksICgpID0+IHtcclxuXHJcblx0XHQvLyB0cmFuc2Zvcm0gcmVjdFxyXG5cdFx0Ly8gJiBwcm9qZWN0IHJlY3Qgb250byBzcGhlcmVcclxuXHRcdGNvbnN0IGNvb3JkczAgPSBwMC5zdWIoIFAgKS5ub3JtYWxpemUoKS50b1ZhcigpO1xyXG5cdFx0Y29uc3QgY29vcmRzMSA9IHAxLnN1YiggUCApLm5vcm1hbGl6ZSgpLnRvVmFyKCk7XHJcblx0XHRjb25zdCBjb29yZHMyID0gcDIuc3ViKCBQICkubm9ybWFsaXplKCkudG9WYXIoKTtcclxuXHRcdGNvbnN0IGNvb3JkczMgPSBwMy5zdWIoIFAgKS5ub3JtYWxpemUoKS50b1ZhcigpO1xyXG5cclxuXHRcdC8vIGNhbGN1bGF0ZSB2ZWN0b3IgZm9ybSBmYWN0b3JcclxuXHRcdGNvbnN0IHZlY3RvckZvcm1GYWN0b3IgPSB2ZWMzKCAwICkudG9WYXIoKTtcclxuXHRcdHZlY3RvckZvcm1GYWN0b3IuYWRkQXNzaWduKCBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIHsgdjE6IGNvb3JkczAsIHYyOiBjb29yZHMxIH0gKSApO1xyXG5cdFx0dmVjdG9yRm9ybUZhY3Rvci5hZGRBc3NpZ24oIExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggeyB2MTogY29vcmRzMSwgdjI6IGNvb3JkczIgfSApICk7XHJcblx0XHR2ZWN0b3JGb3JtRmFjdG9yLmFkZEFzc2lnbiggTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCB7IHYxOiBjb29yZHMyLCB2MjogY29vcmRzMyB9ICkgKTtcclxuXHRcdHZlY3RvckZvcm1GYWN0b3IuYWRkQXNzaWduKCBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIHsgdjE6IGNvb3JkczMsIHYyOiBjb29yZHMwIH0gKSApO1xyXG5cclxuXHRcdC8vIGFkanVzdCBmb3IgaG9yaXpvbiBjbGlwcGluZ1xyXG5cdFx0cmVzdWx0LmFzc2lnbiggdmVjMyggTFRDX0NsaXBwZWRTcGhlcmVGb3JtRmFjdG9yKCB7IGY6IHZlY3RvckZvcm1GYWN0b3IuYWJzKCkgfSApICkgKTtcclxuXHJcblx0fSApO1xyXG5cclxuXHRyZXR1cm4gcmVzdWx0O1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdMVENfRXZhbHVhdGUnLFxyXG5cdHR5cGU6ICd2ZWMzJyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ1AnLCB0eXBlOiAndmVjMycgfSxcclxuXHRcdHsgbmFtZTogJ3AwJywgdHlwZTogJ3ZlYzMnIH0sXHJcblx0XHR7IG5hbWU6ICdwMScsIHR5cGU6ICd2ZWMzJyB9LFxyXG5cdFx0eyBuYW1lOiAncDInLCB0eXBlOiAndmVjMycgfSxcclxuXHRcdHsgbmFtZTogJ3AzJywgdHlwZTogJ3ZlYzMnIH1cclxuXHRdXHJcbn0gKTtcclxuXHJcbmV4cG9ydCB7IExUQ19FdmFsdWF0ZSwgTFRDX0V2YWx1YXRlX1ZvbHVtZSwgTFRDX1V2IH07XHJcbiIsImltcG9ydCB7IGFkZCwgbXVsLCBkaXYgfSBmcm9tICcuLi9tYXRoL09wZXJhdG9yTm9kZS5qcyc7XHJcbmltcG9ydCB7IGZsb29yLCBjZWlsLCBmcmFjdCwgcG93IH0gZnJvbSAnLi4vbWF0aC9NYXRoTm9kZS5qcyc7XHJcbmltcG9ydCB7IEZuLCBmbG9hdCwgdmVjMiwgdmVjNCwgaW50IH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5cclxuLy8gTWlwcGVkIEJpY3ViaWMgVGV4dHVyZSBGaWx0ZXJpbmcgYnkgTjhcclxuLy8gaHR0cHM6Ly93d3cuc2hhZGVydG95LmNvbS92aWV3L0RsMlNEV1xyXG5cclxuY29uc3QgYkMgPSAxLjAgLyA2LjA7XHJcblxyXG5jb25zdCB3MCA9ICggYSApID0+IG11bCggYkMsIG11bCggYSwgbXVsKCBhLCBhLm5lZ2F0ZSgpLmFkZCggMy4wICkgKS5zdWIoIDMuMCApICkuYWRkKCAxLjAgKSApO1xyXG5cclxuY29uc3QgdzEgPSAoIGEgKSA9PiBtdWwoIGJDLCBtdWwoIGEsIG11bCggYSwgbXVsKCAzLjAsIGEgKS5zdWIoIDYuMCApICkgKS5hZGQoIDQuMCApICk7XHJcblxyXG5jb25zdCB3MiA9ICggYSApID0+IG11bCggYkMsIG11bCggYSwgbXVsKCBhLCBtdWwoIC0gMy4wLCBhICkuYWRkKCAzLjAgKSApLmFkZCggMy4wICkgKS5hZGQoIDEuMCApICk7XHJcblxyXG5jb25zdCB3MyA9ICggYSApID0+IG11bCggYkMsIHBvdyggYSwgMyApICk7XHJcblxyXG5jb25zdCBnMCA9ICggYSApID0+IHcwKCBhICkuYWRkKCB3MSggYSApICk7XHJcblxyXG5jb25zdCBnMSA9ICggYSApID0+IHcyKCBhICkuYWRkKCB3MyggYSApICk7XHJcblxyXG4vLyBoMCBhbmQgaDEgYXJlIHRoZSB0d28gb2Zmc2V0IGZ1bmN0aW9uc1xyXG5jb25zdCBoMCA9ICggYSApID0+IGFkZCggLSAxLjAsIHcxKCBhICkuZGl2KCB3MCggYSApLmFkZCggdzEoIGEgKSApICkgKTtcclxuXHJcbmNvbnN0IGgxID0gKCBhICkgPT4gYWRkKCAxLjAsIHczKCBhICkuZGl2KCB3MiggYSApLmFkZCggdzMoIGEgKSApICkgKTtcclxuXHJcbmNvbnN0IGJpY3ViaWMgPSAoIHRleHR1cmVOb2RlLCB0ZXhlbFNpemUsIGxvZCApID0+IHtcclxuXHJcblx0Y29uc3QgdXYgPSB0ZXh0dXJlTm9kZS51dk5vZGU7XHJcblx0Y29uc3QgdXZTY2FsZWQgPSBtdWwoIHV2LCB0ZXhlbFNpemUuencgKS5hZGQoIDAuNSApO1xyXG5cclxuXHRjb25zdCBpdXYgPSBmbG9vciggdXZTY2FsZWQgKTtcclxuXHRjb25zdCBmdXYgPSBmcmFjdCggdXZTY2FsZWQgKTtcclxuXHJcblx0Y29uc3QgZzB4ID0gZzAoIGZ1di54ICk7XHJcblx0Y29uc3QgZzF4ID0gZzEoIGZ1di54ICk7XHJcblx0Y29uc3QgaDB4ID0gaDAoIGZ1di54ICk7XHJcblx0Y29uc3QgaDF4ID0gaDEoIGZ1di54ICk7XHJcblx0Y29uc3QgaDB5ID0gaDAoIGZ1di55ICk7XHJcblx0Y29uc3QgaDF5ID0gaDEoIGZ1di55ICk7XHJcblxyXG5cdGNvbnN0IHAwID0gdmVjMiggaXV2LnguYWRkKCBoMHggKSwgaXV2LnkuYWRkKCBoMHkgKSApLnN1YiggMC41ICkubXVsKCB0ZXhlbFNpemUueHkgKTtcclxuXHRjb25zdCBwMSA9IHZlYzIoIGl1di54LmFkZCggaDF4ICksIGl1di55LmFkZCggaDB5ICkgKS5zdWIoIDAuNSApLm11bCggdGV4ZWxTaXplLnh5ICk7XHJcblx0Y29uc3QgcDIgPSB2ZWMyKCBpdXYueC5hZGQoIGgweCApLCBpdXYueS5hZGQoIGgxeSApICkuc3ViKCAwLjUgKS5tdWwoIHRleGVsU2l6ZS54eSApO1xyXG5cdGNvbnN0IHAzID0gdmVjMiggaXV2LnguYWRkKCBoMXggKSwgaXV2LnkuYWRkKCBoMXkgKSApLnN1YiggMC41ICkubXVsKCB0ZXhlbFNpemUueHkgKTtcclxuXHJcblx0Y29uc3QgYSA9IGcwKCBmdXYueSApLm11bCggYWRkKCBnMHgubXVsKCB0ZXh0dXJlTm9kZS5zYW1wbGUoIHAwICkubGV2ZWwoIGxvZCApICksIGcxeC5tdWwoIHRleHR1cmVOb2RlLnNhbXBsZSggcDEgKS5sZXZlbCggbG9kICkgKSApICk7XHJcblx0Y29uc3QgYiA9IGcxKCBmdXYueSApLm11bCggYWRkKCBnMHgubXVsKCB0ZXh0dXJlTm9kZS5zYW1wbGUoIHAyICkubGV2ZWwoIGxvZCApICksIGcxeC5tdWwoIHRleHR1cmVOb2RlLnNhbXBsZSggcDMgKS5sZXZlbCggbG9kICkgKSApICk7XHJcblxyXG5cdHJldHVybiBhLmFkZCggYiApO1xyXG5cclxufTtcclxuXHJcbi8qKlxyXG4gKiBBcHBsaWVzIG1pcHBlZCBiaWN1YmljIHRleHR1cmUgZmlsdGVyaW5nIHRvIHRoZSBnaXZlbiB0ZXh0dXJlIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7VGV4dHVyZU5vZGV9IHRleHR1cmVOb2RlIC0gVGhlIHRleHR1cmUgbm9kZSB0aGF0IHNob3VsZCBiZSBmaWx0ZXJlZC5cclxuICogQHBhcmFtIHtOb2RlPGZsb2F0Pn0gW2xvZE5vZGU9ZmxvYXQoMyldIC0gRGVmaW5lcyB0aGUgTE9EIHRvIHNhbXBsZSBmcm9tLlxyXG4gKiBAcmV0dXJuIHtOb2RlfSBUaGUgZmlsdGVyZWQgdGV4dHVyZSBzYW1wbGUuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdGV4dHVyZUJpY3ViaWMgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgdGV4dHVyZU5vZGUsIGxvZE5vZGUgPSBmbG9hdCggMyApIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IGZMb2RTaXplID0gdmVjMiggdGV4dHVyZU5vZGUuc2l6ZSggaW50KCBsb2ROb2RlICkgKSApO1xyXG5cdGNvbnN0IGNMb2RTaXplID0gdmVjMiggdGV4dHVyZU5vZGUuc2l6ZSggaW50KCBsb2ROb2RlLmFkZCggMS4wICkgKSApICk7XHJcblx0Y29uc3QgZkxvZFNpemVJbnYgPSBkaXYoIDEuMCwgZkxvZFNpemUgKTtcclxuXHRjb25zdCBjTG9kU2l6ZUludiA9IGRpdiggMS4wLCBjTG9kU2l6ZSApO1xyXG5cdGNvbnN0IGZTYW1wbGUgPSBiaWN1YmljKCB0ZXh0dXJlTm9kZSwgdmVjNCggZkxvZFNpemVJbnYsIGZMb2RTaXplICksIGZsb29yKCBsb2ROb2RlICkgKTtcclxuXHRjb25zdCBjU2FtcGxlID0gYmljdWJpYyggdGV4dHVyZU5vZGUsIHZlYzQoIGNMb2RTaXplSW52LCBjTG9kU2l6ZSApLCBjZWlsKCBsb2ROb2RlICkgKTtcclxuXHJcblx0cmV0dXJuIGZyYWN0KCBsb2ROb2RlICkubWl4KCBmU2FtcGxlLCBjU2FtcGxlICk7XHJcblxyXG59ICk7XHJcbiIsImltcG9ydCBCUkRGX0xhbWJlcnQgZnJvbSAnLi9CU0RGL0JSREZfTGFtYmVydC5qcyc7XHJcbmltcG9ydCBCUkRGX0dHWCBmcm9tICcuL0JTREYvQlJERl9HR1guanMnO1xyXG5pbXBvcnQgREZHQXBwcm94IGZyb20gJy4vQlNERi9ERkdBcHByb3guanMnO1xyXG5pbXBvcnQgRW52aXJvbm1lbnRCUkRGIGZyb20gJy4vQlNERi9FbnZpcm9ubWVudEJSREYuanMnO1xyXG5pbXBvcnQgRl9TY2hsaWNrIGZyb20gJy4vQlNERi9GX1NjaGxpY2suanMnO1xyXG5pbXBvcnQgU2NobGlja190b19GMCBmcm9tICcuL0JTREYvU2NobGlja190b19GMC5qcyc7XHJcbmltcG9ydCBCUkRGX1NoZWVuIGZyb20gJy4vQlNERi9CUkRGX1NoZWVuLmpzJztcclxuaW1wb3J0IHsgTFRDX0V2YWx1YXRlLCBMVENfVXYgfSBmcm9tICcuL0JTREYvTFRDLmpzJztcclxuaW1wb3J0IExpZ2h0aW5nTW9kZWwgZnJvbSAnLi4vY29yZS9MaWdodGluZ01vZGVsLmpzJztcclxuaW1wb3J0IHsgZGlmZnVzZUNvbG9yLCBzcGVjdWxhckNvbG9yLCBzcGVjdWxhckY5MCwgcm91Z2huZXNzLCBjbGVhcmNvYXQsIGNsZWFyY29hdFJvdWdobmVzcywgc2hlZW4sIHNoZWVuUm91Z2huZXNzLCBpcmlkZXNjZW5jZSwgaXJpZGVzY2VuY2VJT1IsIGlyaWRlc2NlbmNlVGhpY2tuZXNzLCBpb3IsIHRoaWNrbmVzcywgdHJhbnNtaXNzaW9uLCBhdHRlbnVhdGlvbkRpc3RhbmNlLCBhdHRlbnVhdGlvbkNvbG9yLCBkaXNwZXJzaW9uIH0gZnJvbSAnLi4vY29yZS9Qcm9wZXJ0eU5vZGUuanMnO1xyXG5pbXBvcnQgeyB0cmFuc2Zvcm1lZE5vcm1hbFZpZXcsIHRyYW5zZm9ybWVkQ2xlYXJjb2F0Tm9ybWFsVmlldywgdHJhbnNmb3JtZWROb3JtYWxXb3JsZCB9IGZyb20gJy4uL2FjY2Vzc29ycy9Ob3JtYWwuanMnO1xyXG5pbXBvcnQgeyBwb3NpdGlvblZpZXdEaXJlY3Rpb24sIHBvc2l0aW9uVmlldywgcG9zaXRpb25Xb3JsZCB9IGZyb20gJy4uL2FjY2Vzc29ycy9Qb3NpdGlvbi5qcyc7XHJcbmltcG9ydCB7IEZuLCBmbG9hdCwgdmVjMiwgdmVjMywgdmVjNCwgbWF0MywgSWYgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcbmltcG9ydCB7IHNlbGVjdCB9IGZyb20gJy4uL21hdGgvQ29uZGl0aW9uYWxOb2RlLmpzJztcclxuaW1wb3J0IHsgbWl4LCBub3JtYWxpemUsIHJlZnJhY3QsIGxlbmd0aCwgY2xhbXAsIGxvZzIsIGxvZywgZXhwLCBzbW9vdGhzdGVwIH0gZnJvbSAnLi4vbWF0aC9NYXRoTm9kZS5qcyc7XHJcbmltcG9ydCB7IGRpdiB9IGZyb20gJy4uL21hdGgvT3BlcmF0b3JOb2RlLmpzJztcclxuaW1wb3J0IHsgY2FtZXJhUG9zaXRpb24sIGNhbWVyYVByb2plY3Rpb25NYXRyaXgsIGNhbWVyYVZpZXdNYXRyaXggfSBmcm9tICcuLi9hY2Nlc3NvcnMvQ2FtZXJhLmpzJztcclxuaW1wb3J0IHsgbW9kZWxXb3JsZE1hdHJpeCB9IGZyb20gJy4uL2FjY2Vzc29ycy9Nb2RlbE5vZGUuanMnO1xyXG5pbXBvcnQgeyBzY3JlZW5TaXplIH0gZnJvbSAnLi4vZGlzcGxheS9TY3JlZW5Ob2RlLmpzJztcclxuaW1wb3J0IHsgdmlld3BvcnRNaXBUZXh0dXJlIH0gZnJvbSAnLi4vZGlzcGxheS9WaWV3cG9ydFRleHR1cmVOb2RlLmpzJztcclxuaW1wb3J0IHsgdGV4dHVyZUJpY3ViaWMgfSBmcm9tICcuLi9hY2Nlc3NvcnMvVGV4dHVyZUJpY3ViaWMuanMnO1xyXG5pbXBvcnQgeyBMb29wIH0gZnJvbSAnLi4vdXRpbHMvTG9vcE5vZGUuanMnO1xyXG5pbXBvcnQgeyBCYWNrU2lkZSB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcblxyXG4vL1xyXG4vLyBUcmFuc21pc3Npb25cclxuLy9cclxuXHJcbmNvbnN0IGdldFZvbHVtZVRyYW5zbWlzc2lvblJheSA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyBuLCB2LCB0aGlja25lc3MsIGlvciwgbW9kZWxNYXRyaXggXSApID0+IHtcclxuXHJcblx0Ly8gRGlyZWN0aW9uIG9mIHJlZnJhY3RlZCBsaWdodC5cclxuXHRjb25zdCByZWZyYWN0aW9uVmVjdG9yID0gdmVjMyggcmVmcmFjdCggdi5uZWdhdGUoKSwgbm9ybWFsaXplKCBuICksIGRpdiggMS4wLCBpb3IgKSApICk7XHJcblxyXG5cdC8vIENvbXB1dGUgcm90YXRpb24taW5kZXBlbmRlbnQgc2NhbGluZyBvZiB0aGUgbW9kZWwgbWF0cml4LlxyXG5cdGNvbnN0IG1vZGVsU2NhbGUgPSB2ZWMzKFxyXG5cdFx0bGVuZ3RoKCBtb2RlbE1hdHJpeFsgMCBdLnh5eiApLFxyXG5cdFx0bGVuZ3RoKCBtb2RlbE1hdHJpeFsgMSBdLnh5eiApLFxyXG5cdFx0bGVuZ3RoKCBtb2RlbE1hdHJpeFsgMiBdLnh5eiApXHJcblx0KTtcclxuXHJcblx0Ly8gVGhlIHRoaWNrbmVzcyBpcyBzcGVjaWZpZWQgaW4gbG9jYWwgc3BhY2UuXHJcblx0cmV0dXJuIG5vcm1hbGl6ZSggcmVmcmFjdGlvblZlY3RvciApLm11bCggdGhpY2tuZXNzLm11bCggbW9kZWxTY2FsZSApICk7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ2dldFZvbHVtZVRyYW5zbWlzc2lvblJheScsXHJcblx0dHlwZTogJ3ZlYzMnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAnbicsIHR5cGU6ICd2ZWMzJyB9LFxyXG5cdFx0eyBuYW1lOiAndicsIHR5cGU6ICd2ZWMzJyB9LFxyXG5cdFx0eyBuYW1lOiAndGhpY2tuZXNzJywgdHlwZTogJ2Zsb2F0JyB9LFxyXG5cdFx0eyBuYW1lOiAnaW9yJywgdHlwZTogJ2Zsb2F0JyB9LFxyXG5cdFx0eyBuYW1lOiAnbW9kZWxNYXRyaXgnLCB0eXBlOiAnbWF0NCcgfVxyXG5cdF1cclxufSApO1xyXG5cclxuY29uc3QgYXBwbHlJb3JUb1JvdWdobmVzcyA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyByb3VnaG5lc3MsIGlvciBdICkgPT4ge1xyXG5cclxuXHQvLyBTY2FsZSByb3VnaG5lc3Mgd2l0aCBJT1Igc28gdGhhdCBhbiBJT1Igb2YgMS4wIHJlc3VsdHMgaW4gbm8gbWljcm9mYWNldCByZWZyYWN0aW9uIGFuZFxyXG5cdC8vIGFuIElPUiBvZiAxLjUgcmVzdWx0cyBpbiB0aGUgZGVmYXVsdCBhbW91bnQgb2YgbWljcm9mYWNldCByZWZyYWN0aW9uLlxyXG5cdHJldHVybiByb3VnaG5lc3MubXVsKCBjbGFtcCggaW9yLm11bCggMi4wICkuc3ViKCAyLjAgKSwgMC4wLCAxLjAgKSApO1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdhcHBseUlvclRvUm91Z2huZXNzJyxcclxuXHR0eXBlOiAnZmxvYXQnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAncm91Z2huZXNzJywgdHlwZTogJ2Zsb2F0JyB9LFxyXG5cdFx0eyBuYW1lOiAnaW9yJywgdHlwZTogJ2Zsb2F0JyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5jb25zdCB2aWV3cG9ydEJhY2tTaWRlVGV4dHVyZSA9IC8qQF9fUFVSRV9fKi8gdmlld3BvcnRNaXBUZXh0dXJlKCk7XHJcbmNvbnN0IHZpZXdwb3J0RnJvbnRTaWRlVGV4dHVyZSA9IC8qQF9fUFVSRV9fKi8gdmlld3BvcnRNaXBUZXh0dXJlKCk7XHJcblxyXG5jb25zdCBnZXRUcmFuc21pc3Npb25TYW1wbGUgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgZnJhZ0Nvb3JkLCByb3VnaG5lc3MsIGlvciBdLCB7IG1hdGVyaWFsIH0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IHZUZXh0dXJlID0gbWF0ZXJpYWwuc2lkZSA9PT0gQmFja1NpZGUgPyB2aWV3cG9ydEJhY2tTaWRlVGV4dHVyZSA6IHZpZXdwb3J0RnJvbnRTaWRlVGV4dHVyZTtcclxuXHJcblx0Y29uc3QgdHJhbnNtaXNzaW9uU2FtcGxlID0gdlRleHR1cmUuc2FtcGxlKCBmcmFnQ29vcmQgKTtcclxuXHQvL2NvbnN0IHRyYW5zbWlzc2lvblNhbXBsZSA9IHZpZXdwb3J0TWlwVGV4dHVyZSggZnJhZ0Nvb3JkICk7XHJcblxyXG5cdGNvbnN0IGxvZCA9IGxvZzIoIHNjcmVlblNpemUueCApLm11bCggYXBwbHlJb3JUb1JvdWdobmVzcyggcm91Z2huZXNzLCBpb3IgKSApO1xyXG5cclxuXHRyZXR1cm4gdGV4dHVyZUJpY3ViaWMoIHRyYW5zbWlzc2lvblNhbXBsZSwgbG9kICk7XHJcblxyXG59ICk7XHJcblxyXG5jb25zdCB2b2x1bWVBdHRlbnVhdGlvbiA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyB0cmFuc21pc3Npb25EaXN0YW5jZSwgYXR0ZW51YXRpb25Db2xvciwgYXR0ZW51YXRpb25EaXN0YW5jZSBdICkgPT4ge1xyXG5cclxuXHRJZiggYXR0ZW51YXRpb25EaXN0YW5jZS5ub3RFcXVhbCggMCApLCAoKSA9PiB7XHJcblxyXG5cdFx0Ly8gQ29tcHV0ZSBsaWdodCBhdHRlbnVhdGlvbiB1c2luZyBCZWVyJ3MgbGF3LlxyXG5cdFx0Y29uc3QgYXR0ZW51YXRpb25Db2VmZmljaWVudCA9IGxvZyggYXR0ZW51YXRpb25Db2xvciApLm5lZ2F0ZSgpLmRpdiggYXR0ZW51YXRpb25EaXN0YW5jZSApO1xyXG5cdFx0Y29uc3QgdHJhbnNtaXR0YW5jZSA9IGV4cCggYXR0ZW51YXRpb25Db2VmZmljaWVudC5uZWdhdGUoKS5tdWwoIHRyYW5zbWlzc2lvbkRpc3RhbmNlICkgKTtcclxuXHJcblx0XHRyZXR1cm4gdHJhbnNtaXR0YW5jZTtcclxuXHJcblx0fSApO1xyXG5cclxuXHQvLyBBdHRlbnVhdGlvbiBkaXN0YW5jZSBpcyAr4oieLCBpLmUuIHRoZSB0cmFuc21pdHRlZCBjb2xvciBpcyBub3QgYXR0ZW51YXRlZCBhdCBhbGwuXHJcblx0cmV0dXJuIHZlYzMoIDEuMCApO1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICd2b2x1bWVBdHRlbnVhdGlvbicsXHJcblx0dHlwZTogJ3ZlYzMnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAndHJhbnNtaXNzaW9uRGlzdGFuY2UnLCB0eXBlOiAnZmxvYXQnIH0sXHJcblx0XHR7IG5hbWU6ICdhdHRlbnVhdGlvbkNvbG9yJywgdHlwZTogJ3ZlYzMnIH0sXHJcblx0XHR7IG5hbWU6ICdhdHRlbnVhdGlvbkRpc3RhbmNlJywgdHlwZTogJ2Zsb2F0JyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5jb25zdCBnZXRJQkxWb2x1bWVSZWZyYWN0aW9uID0gLypAX19QVVJFX18qLyBGbiggKCBbIG4sIHYsIHJvdWdobmVzcywgZGlmZnVzZUNvbG9yLCBzcGVjdWxhckNvbG9yLCBzcGVjdWxhckY5MCwgcG9zaXRpb24sIG1vZGVsTWF0cml4LCB2aWV3TWF0cml4LCBwcm9qTWF0cml4LCBpb3IsIHRoaWNrbmVzcywgYXR0ZW51YXRpb25Db2xvciwgYXR0ZW51YXRpb25EaXN0YW5jZSwgZGlzcGVyc2lvbiBdICkgPT4ge1xyXG5cclxuXHRsZXQgdHJhbnNtaXR0ZWRMaWdodCwgdHJhbnNtaXR0YW5jZTtcclxuXHJcblx0aWYgKCBkaXNwZXJzaW9uICkge1xyXG5cclxuXHRcdHRyYW5zbWl0dGVkTGlnaHQgPSB2ZWM0KCkudG9WYXIoKTtcclxuXHRcdHRyYW5zbWl0dGFuY2UgPSB2ZWMzKCkudG9WYXIoKTtcclxuXHJcblx0XHRjb25zdCBoYWxmU3ByZWFkID0gaW9yLnN1YiggMS4wICkubXVsKCBkaXNwZXJzaW9uLm11bCggMC4wMjUgKSApO1xyXG5cdFx0Y29uc3QgaW9ycyA9IHZlYzMoIGlvci5zdWIoIGhhbGZTcHJlYWQgKSwgaW9yLCBpb3IuYWRkKCBoYWxmU3ByZWFkICkgKTtcclxuXHJcblx0XHRMb29wKCB7IHN0YXJ0OiAwLCBlbmQ6IDMgfSwgKCB7IGkgfSApID0+IHtcclxuXHJcblx0XHRcdGNvbnN0IGlvciA9IGlvcnMuZWxlbWVudCggaSApO1xyXG5cclxuXHRcdFx0Y29uc3QgdHJhbnNtaXNzaW9uUmF5ID0gZ2V0Vm9sdW1lVHJhbnNtaXNzaW9uUmF5KCBuLCB2LCB0aGlja25lc3MsIGlvciwgbW9kZWxNYXRyaXggKTtcclxuXHRcdFx0Y29uc3QgcmVmcmFjdGVkUmF5RXhpdCA9IHBvc2l0aW9uLmFkZCggdHJhbnNtaXNzaW9uUmF5ICk7XHJcblxyXG5cdFx0XHQvLyBQcm9qZWN0IHJlZnJhY3RlZCB2ZWN0b3Igb24gdGhlIGZyYW1lYnVmZmVyLCB3aGlsZSBtYXBwaW5nIHRvIG5vcm1hbGl6ZWQgZGV2aWNlIGNvb3JkaW5hdGVzLlxyXG5cdFx0XHRjb25zdCBuZGNQb3MgPSBwcm9qTWF0cml4Lm11bCggdmlld01hdHJpeC5tdWwoIHZlYzQoIHJlZnJhY3RlZFJheUV4aXQsIDEuMCApICkgKTtcclxuXHRcdFx0Y29uc3QgcmVmcmFjdGlvbkNvb3JkcyA9IHZlYzIoIG5kY1Bvcy54eS5kaXYoIG5kY1Bvcy53ICkgKS50b1ZhcigpO1xyXG5cdFx0XHRyZWZyYWN0aW9uQ29vcmRzLmFkZEFzc2lnbiggMS4wICk7XHJcblx0XHRcdHJlZnJhY3Rpb25Db29yZHMuZGl2QXNzaWduKCAyLjAgKTtcclxuXHRcdFx0cmVmcmFjdGlvbkNvb3Jkcy5hc3NpZ24oIHZlYzIoIHJlZnJhY3Rpb25Db29yZHMueCwgcmVmcmFjdGlvbkNvb3Jkcy55Lm9uZU1pbnVzKCkgKSApOyAvLyB3ZWJncHVcclxuXHJcblx0XHRcdC8vIFNhbXBsZSBmcmFtZWJ1ZmZlciB0byBnZXQgcGl4ZWwgdGhlIHJlZnJhY3RlZCByYXkgaGl0cy5cclxuXHRcdFx0Y29uc3QgdHJhbnNtaXNzaW9uU2FtcGxlID0gZ2V0VHJhbnNtaXNzaW9uU2FtcGxlKCByZWZyYWN0aW9uQ29vcmRzLCByb3VnaG5lc3MsIGlvciApO1xyXG5cclxuXHRcdFx0dHJhbnNtaXR0ZWRMaWdodC5lbGVtZW50KCBpICkuYXNzaWduKCB0cmFuc21pc3Npb25TYW1wbGUuZWxlbWVudCggaSApICk7XHJcblx0XHRcdHRyYW5zbWl0dGVkTGlnaHQuYS5hZGRBc3NpZ24oIHRyYW5zbWlzc2lvblNhbXBsZS5hICk7XHJcblxyXG5cdFx0XHR0cmFuc21pdHRhbmNlLmVsZW1lbnQoIGkgKS5hc3NpZ24oIGRpZmZ1c2VDb2xvci5lbGVtZW50KCBpICkubXVsKCB2b2x1bWVBdHRlbnVhdGlvbiggbGVuZ3RoKCB0cmFuc21pc3Npb25SYXkgKSwgYXR0ZW51YXRpb25Db2xvciwgYXR0ZW51YXRpb25EaXN0YW5jZSApLmVsZW1lbnQoIGkgKSApICk7XHJcblxyXG5cdFx0fSApO1xyXG5cclxuXHRcdHRyYW5zbWl0dGVkTGlnaHQuYS5kaXZBc3NpZ24oIDMuMCApO1xyXG5cclxuXHR9IGVsc2Uge1xyXG5cclxuXHRcdGNvbnN0IHRyYW5zbWlzc2lvblJheSA9IGdldFZvbHVtZVRyYW5zbWlzc2lvblJheSggbiwgdiwgdGhpY2tuZXNzLCBpb3IsIG1vZGVsTWF0cml4ICk7XHJcblx0XHRjb25zdCByZWZyYWN0ZWRSYXlFeGl0ID0gcG9zaXRpb24uYWRkKCB0cmFuc21pc3Npb25SYXkgKTtcclxuXHJcblx0XHQvLyBQcm9qZWN0IHJlZnJhY3RlZCB2ZWN0b3Igb24gdGhlIGZyYW1lYnVmZmVyLCB3aGlsZSBtYXBwaW5nIHRvIG5vcm1hbGl6ZWQgZGV2aWNlIGNvb3JkaW5hdGVzLlxyXG5cdFx0Y29uc3QgbmRjUG9zID0gcHJvak1hdHJpeC5tdWwoIHZpZXdNYXRyaXgubXVsKCB2ZWM0KCByZWZyYWN0ZWRSYXlFeGl0LCAxLjAgKSApICk7XHJcblx0XHRjb25zdCByZWZyYWN0aW9uQ29vcmRzID0gdmVjMiggbmRjUG9zLnh5LmRpdiggbmRjUG9zLncgKSApLnRvVmFyKCk7XHJcblx0XHRyZWZyYWN0aW9uQ29vcmRzLmFkZEFzc2lnbiggMS4wICk7XHJcblx0XHRyZWZyYWN0aW9uQ29vcmRzLmRpdkFzc2lnbiggMi4wICk7XHJcblx0XHRyZWZyYWN0aW9uQ29vcmRzLmFzc2lnbiggdmVjMiggcmVmcmFjdGlvbkNvb3Jkcy54LCByZWZyYWN0aW9uQ29vcmRzLnkub25lTWludXMoKSApICk7IC8vIHdlYmdwdVxyXG5cclxuXHRcdC8vIFNhbXBsZSBmcmFtZWJ1ZmZlciB0byBnZXQgcGl4ZWwgdGhlIHJlZnJhY3RlZCByYXkgaGl0cy5cclxuXHRcdHRyYW5zbWl0dGVkTGlnaHQgPSBnZXRUcmFuc21pc3Npb25TYW1wbGUoIHJlZnJhY3Rpb25Db29yZHMsIHJvdWdobmVzcywgaW9yICk7XHJcblx0XHR0cmFuc21pdHRhbmNlID0gZGlmZnVzZUNvbG9yLm11bCggdm9sdW1lQXR0ZW51YXRpb24oIGxlbmd0aCggdHJhbnNtaXNzaW9uUmF5ICksIGF0dGVudWF0aW9uQ29sb3IsIGF0dGVudWF0aW9uRGlzdGFuY2UgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvbnN0IGF0dGVudWF0ZWRDb2xvciA9IHRyYW5zbWl0dGFuY2UucmdiLm11bCggdHJhbnNtaXR0ZWRMaWdodC5yZ2IgKTtcclxuXHRjb25zdCBkb3ROViA9IG4uZG90KCB2ICkuY2xhbXAoKTtcclxuXHJcblx0Ly8gR2V0IHRoZSBzcGVjdWxhciBjb21wb25lbnQuXHJcblx0Y29uc3QgRiA9IHZlYzMoIEVudmlyb25tZW50QlJERiggeyAvLyBuLCB2LCBzcGVjdWxhckNvbG9yLCBzcGVjdWxhckY5MCwgcm91Z2huZXNzXHJcblx0XHRkb3ROVixcclxuXHRcdHNwZWN1bGFyQ29sb3IsXHJcblx0XHRzcGVjdWxhckY5MCxcclxuXHRcdHJvdWdobmVzc1xyXG5cdH0gKSApO1xyXG5cclxuXHQvLyBBcyBsZXNzIGxpZ2h0IGlzIHRyYW5zbWl0dGVkLCB0aGUgb3BhY2l0eSBzaG91bGQgYmUgaW5jcmVhc2VkLiBUaGlzIHNpbXBsZSBhcHByb3hpbWF0aW9uIGRvZXMgYSBkZWNlbnQgam9iXHJcblx0Ly8gb2YgbW9kdWxhdGluZyBhIENTUyBiYWNrZ3JvdW5kLCBhbmQgaGFzIG5vIGVmZmVjdCB3aGVuIHRoZSBidWZmZXIgaXMgb3BhcXVlLCBkdWUgdG8gYSBzb2xpZCBvYmplY3Qgb3IgY2xlYXIgY29sb3IuXHJcblx0Y29uc3QgdHJhbnNtaXR0YW5jZUZhY3RvciA9IHRyYW5zbWl0dGFuY2Uuci5hZGQoIHRyYW5zbWl0dGFuY2UuZywgdHJhbnNtaXR0YW5jZS5iICkuZGl2KCAzLjAgKTtcclxuXHJcblx0cmV0dXJuIHZlYzQoIEYub25lTWludXMoKS5tdWwoIGF0dGVudWF0ZWRDb2xvciApLCB0cmFuc21pdHRlZExpZ2h0LmEub25lTWludXMoKS5tdWwoIHRyYW5zbWl0dGFuY2VGYWN0b3IgKS5vbmVNaW51cygpICk7XHJcblxyXG59ICk7XHJcblxyXG4vL1xyXG4vLyBJcmlkZXNjZW5jZVxyXG4vL1xyXG5cclxuLy8gWFlaIHRvIGxpbmVhci1zUkdCIGNvbG9yIHNwYWNlXHJcbmNvbnN0IFhZWl9UT19SRUM3MDkgPSAvKkBfX1BVUkVfXyovIG1hdDMoXHJcblx0My4yNDA0NTQyLCAtIDAuOTY5MjY2MCwgMC4wNTU2NDM0LFxyXG5cdC0gMS41MzcxMzg1LCAxLjg3NjAxMDgsIC0gMC4yMDQwMjU5LFxyXG5cdC0gMC40OTg1MzE0LCAwLjA0MTU1NjAsIDEuMDU3MjI1MlxyXG4pO1xyXG5cclxuLy8gQXNzdW1lIGFpciBpbnRlcmZhY2UgZm9yIHRvcFxyXG4vLyBOb3RlOiBXZSBkb24ndCBoYW5kbGUgdGhlIGNhc2UgZnJlc25lbDAgPT0gMVxyXG5jb25zdCBGcmVzbmVsMFRvSW9yID0gKCBmcmVzbmVsMCApID0+IHtcclxuXHJcblx0Y29uc3Qgc3FydEYwID0gZnJlc25lbDAuc3FydCgpO1xyXG5cdHJldHVybiB2ZWMzKCAxLjAgKS5hZGQoIHNxcnRGMCApLmRpdiggdmVjMyggMS4wICkuc3ViKCBzcXJ0RjAgKSApO1xyXG5cclxufTtcclxuXHJcbi8vIGlvciBpcyBhIHZhbHVlIGJldHdlZW4gMS4wIGFuZCAzLjAuIDEuMCBpcyBhaXIgaW50ZXJmYWNlXHJcbmNvbnN0IElvclRvRnJlc25lbDAgPSAoIHRyYW5zbWl0dGVkSW9yLCBpbmNpZGVudElvciApID0+IHtcclxuXHJcblx0cmV0dXJuIHRyYW5zbWl0dGVkSW9yLnN1YiggaW5jaWRlbnRJb3IgKS5kaXYoIHRyYW5zbWl0dGVkSW9yLmFkZCggaW5jaWRlbnRJb3IgKSApLnBvdzIoKTtcclxuXHJcbn07XHJcblxyXG4vLyBGcmVzbmVsIGVxdWF0aW9ucyBmb3IgZGllbGVjdHJpYy9kaWVsZWN0cmljIGludGVyZmFjZXMuXHJcbi8vIFJlZjogaHR0cHM6Ly9iZWxjb3VyLmdpdGh1Yi5pby9ibG9nL3Jlc2VhcmNoLzIwMTcvMDUvMDEvYnJkZi10aGluLWZpbG0uaHRtbFxyXG4vLyBFdmFsdWF0aW9uIFhZWiBzZW5zaXRpdml0eSBjdXJ2ZXMgaW4gRm91cmllciBzcGFjZVxyXG5jb25zdCBldmFsU2Vuc2l0aXZpdHkgPSAoIE9QRCwgc2hpZnQgKSA9PiB7XHJcblxyXG5cdGNvbnN0IHBoYXNlID0gT1BELm11bCggMi4wICogTWF0aC5QSSAqIDEuMGUtOSApO1xyXG5cdGNvbnN0IHZhbCA9IHZlYzMoIDUuNDg1NmUtMTMsIDQuNDIwMWUtMTMsIDUuMjQ4MWUtMTMgKTtcclxuXHRjb25zdCBwb3MgPSB2ZWMzKCAxLjY4MTBlKzA2LCAxLjc5NTNlKzA2LCAyLjIwODRlKzA2ICk7XHJcblx0Y29uc3QgVkFSID0gdmVjMyggNC4zMjc4ZSswOSwgOS4zMDQ2ZSswOSwgNi42MTIxZSswOSApO1xyXG5cclxuXHRjb25zdCB4ID0gZmxvYXQoIDkuNzQ3MGUtMTQgKiBNYXRoLnNxcnQoIDIuMCAqIE1hdGguUEkgKiA0LjUyODJlKzA5ICkgKS5tdWwoIHBoYXNlLm11bCggMi4yMzk5ZSswNiApLmFkZCggc2hpZnQueCApLmNvcygpICkubXVsKCBwaGFzZS5wb3cyKCkubXVsKCAtIDQuNTI4MmUrMDkgKS5leHAoKSApO1xyXG5cclxuXHRsZXQgeHl6ID0gdmFsLm11bCggVkFSLm11bCggMi4wICogTWF0aC5QSSApLnNxcnQoKSApLm11bCggcG9zLm11bCggcGhhc2UgKS5hZGQoIHNoaWZ0ICkuY29zKCkgKS5tdWwoIHBoYXNlLnBvdzIoKS5uZWdhdGUoKS5tdWwoIFZBUiApLmV4cCgpICk7XHJcblx0eHl6ID0gdmVjMyggeHl6LnguYWRkKCB4ICksIHh5ei55LCB4eXoueiApLmRpdiggMS4wNjg1ZS03ICk7XHJcblxyXG5cdGNvbnN0IHJnYiA9IFhZWl9UT19SRUM3MDkubXVsKCB4eXogKTtcclxuXHJcblx0cmV0dXJuIHJnYjtcclxuXHJcbn07XHJcblxyXG5jb25zdCBldmFsSXJpZGVzY2VuY2UgPSAvKkBfX1BVUkVfXyovIEZuKCAoIHsgb3V0c2lkZUlPUiwgZXRhMiwgY29zVGhldGExLCB0aGluRmlsbVRoaWNrbmVzcywgYmFzZUYwIH0gKSA9PiB7XHJcblxyXG5cdC8vIEZvcmNlIGlyaWRlc2NlbmNlSU9SIC0+IG91dHNpZGVJT1Igd2hlbiB0aGluRmlsbVRoaWNrbmVzcyAtPiAwLjBcclxuXHRjb25zdCBpcmlkZXNjZW5jZUlPUiA9IG1peCggb3V0c2lkZUlPUiwgZXRhMiwgc21vb3Roc3RlcCggMC4wLCAwLjAzLCB0aGluRmlsbVRoaWNrbmVzcyApICk7XHJcblx0Ly8gRXZhbHVhdGUgdGhlIGNvc1RoZXRhIG9uIHRoZSBiYXNlIGxheWVyIChTbmVsbCBsYXcpXHJcblx0Y29uc3Qgc2luVGhldGEyU3EgPSBvdXRzaWRlSU9SLmRpdiggaXJpZGVzY2VuY2VJT1IgKS5wb3cyKCkubXVsKCBjb3NUaGV0YTEucG93MigpLm9uZU1pbnVzKCkgKTtcclxuXHJcblx0Ly8gSGFuZGxlIFRJUjpcclxuXHRjb25zdCBjb3NUaGV0YTJTcSA9IHNpblRoZXRhMlNxLm9uZU1pbnVzKCk7XHJcblxyXG5cdElmKCBjb3NUaGV0YTJTcS5sZXNzVGhhbiggMCApLCAoKSA9PiB7XHJcblxyXG5cdFx0cmV0dXJuIHZlYzMoIDEuMCApO1xyXG5cclxuXHR9ICk7XHJcblxyXG5cdGNvbnN0IGNvc1RoZXRhMiA9IGNvc1RoZXRhMlNxLnNxcnQoKTtcclxuXHJcblx0Ly8gRmlyc3QgaW50ZXJmYWNlXHJcblx0Y29uc3QgUjAgPSBJb3JUb0ZyZXNuZWwwKCBpcmlkZXNjZW5jZUlPUiwgb3V0c2lkZUlPUiApO1xyXG5cdGNvbnN0IFIxMiA9IEZfU2NobGljayggeyBmMDogUjAsIGY5MDogMS4wLCBkb3RWSDogY29zVGhldGExIH0gKTtcclxuXHQvL2NvbnN0IFIyMSA9IFIxMjtcclxuXHRjb25zdCBUMTIxID0gUjEyLm9uZU1pbnVzKCk7XHJcblx0Y29uc3QgcGhpMTIgPSBpcmlkZXNjZW5jZUlPUi5sZXNzVGhhbiggb3V0c2lkZUlPUiApLnNlbGVjdCggTWF0aC5QSSwgMC4wICk7XHJcblx0Y29uc3QgcGhpMjEgPSBmbG9hdCggTWF0aC5QSSApLnN1YiggcGhpMTIgKTtcclxuXHJcblx0Ly8gU2Vjb25kIGludGVyZmFjZVxyXG5cdGNvbnN0IGJhc2VJT1IgPSBGcmVzbmVsMFRvSW9yKCBiYXNlRjAuY2xhbXAoIDAuMCwgMC45OTk5ICkgKTsgLy8gZ3VhcmQgYWdhaW5zdCAxLjBcclxuXHRjb25zdCBSMSA9IElvclRvRnJlc25lbDAoIGJhc2VJT1IsIGlyaWRlc2NlbmNlSU9SLnRvVmVjMygpICk7XHJcblx0Y29uc3QgUjIzID0gRl9TY2hsaWNrKCB7IGYwOiBSMSwgZjkwOiAxLjAsIGRvdFZIOiBjb3NUaGV0YTIgfSApO1xyXG5cdGNvbnN0IHBoaTIzID0gdmVjMyhcclxuXHRcdGJhc2VJT1IueC5sZXNzVGhhbiggaXJpZGVzY2VuY2VJT1IgKS5zZWxlY3QoIE1hdGguUEksIDAuMCApLFxyXG5cdFx0YmFzZUlPUi55Lmxlc3NUaGFuKCBpcmlkZXNjZW5jZUlPUiApLnNlbGVjdCggTWF0aC5QSSwgMC4wICksXHJcblx0XHRiYXNlSU9SLnoubGVzc1RoYW4oIGlyaWRlc2NlbmNlSU9SICkuc2VsZWN0KCBNYXRoLlBJLCAwLjAgKVxyXG5cdCk7XHJcblxyXG5cdC8vIFBoYXNlIHNoaWZ0XHJcblx0Y29uc3QgT1BEID0gaXJpZGVzY2VuY2VJT1IubXVsKCB0aGluRmlsbVRoaWNrbmVzcywgY29zVGhldGEyLCAyLjAgKTtcclxuXHRjb25zdCBwaGkgPSB2ZWMzKCBwaGkyMSApLmFkZCggcGhpMjMgKTtcclxuXHJcblx0Ly8gQ29tcG91bmQgdGVybXNcclxuXHRjb25zdCBSMTIzID0gUjEyLm11bCggUjIzICkuY2xhbXAoIDFlLTUsIDAuOTk5OSApO1xyXG5cdGNvbnN0IHIxMjMgPSBSMTIzLnNxcnQoKTtcclxuXHRjb25zdCBScyA9IFQxMjEucG93MigpLm11bCggUjIzICkuZGl2KCB2ZWMzKCAxLjAgKS5zdWIoIFIxMjMgKSApO1xyXG5cclxuXHQvLyBSZWZsZWN0YW5jZSB0ZXJtIGZvciBtID0gMCAoREMgdGVybSBhbXBsaXR1ZGUpXHJcblx0Y29uc3QgQzAgPSBSMTIuYWRkKCBScyApO1xyXG5cdGNvbnN0IEkgPSBDMC50b1ZhcigpO1xyXG5cclxuXHQvLyBSZWZsZWN0YW5jZSB0ZXJtIGZvciBtID4gMCAocGFpcnMgb2YgZGlyYWNzKVxyXG5cdGNvbnN0IENtID0gUnMuc3ViKCBUMTIxICkudG9WYXIoKTtcclxuXHJcblx0TG9vcCggeyBzdGFydDogMSwgZW5kOiAyLCBjb25kaXRpb246ICc8PScsIG5hbWU6ICdtJyB9LCAoIHsgbSB9ICkgPT4ge1xyXG5cclxuXHRcdENtLm11bEFzc2lnbiggcjEyMyApO1xyXG5cdFx0Y29uc3QgU20gPSBldmFsU2Vuc2l0aXZpdHkoIGZsb2F0KCBtICkubXVsKCBPUEQgKSwgZmxvYXQoIG0gKS5tdWwoIHBoaSApICkubXVsKCAyLjAgKTtcclxuXHRcdEkuYWRkQXNzaWduKCBDbS5tdWwoIFNtICkgKTtcclxuXHJcblx0fSApO1xyXG5cclxuXHQvLyBTaW5jZSBvdXQgb2YgZ2FtdXQgY29sb3JzIG1pZ2h0IGJlIHByb2R1Y2VkLCBuZWdhdGl2ZSBjb2xvciB2YWx1ZXMgYXJlIGNsYW1wZWQgdG8gMC5cclxuXHRyZXR1cm4gSS5tYXgoIHZlYzMoIDAuMCApICk7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ2V2YWxJcmlkZXNjZW5jZScsXHJcblx0dHlwZTogJ3ZlYzMnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAnb3V0c2lkZUlPUicsIHR5cGU6ICdmbG9hdCcgfSxcclxuXHRcdHsgbmFtZTogJ2V0YTInLCB0eXBlOiAnZmxvYXQnIH0sXHJcblx0XHR7IG5hbWU6ICdjb3NUaGV0YTEnLCB0eXBlOiAnZmxvYXQnIH0sXHJcblx0XHR7IG5hbWU6ICd0aGluRmlsbVRoaWNrbmVzcycsIHR5cGU6ICdmbG9hdCcgfSxcclxuXHRcdHsgbmFtZTogJ2Jhc2VGMCcsIHR5cGU6ICd2ZWMzJyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG4vL1xyXG4vL1x0U2hlZW5cclxuLy9cclxuXHJcbi8vIFRoaXMgaXMgYSBjdXJ2ZS1maXQgYXBwcm94aW1hdGlvbiB0byB0aGUgXCJDaGFybGllIHNoZWVuXCIgQlJERiBpbnRlZ3JhdGVkIG92ZXIgdGhlIGhlbWlzcGhlcmUgZnJvbVxyXG4vLyBFc3RldmV6IGFuZCBLdWxsYSAyMDE3LCBcIlByb2R1Y3Rpb24gRnJpZW5kbHkgTWljcm9mYWNldCBTaGVlbiBCUkRGXCIuIFRoZSBhbmFseXNpcyBjYW4gYmUgZm91bmRcclxuLy8gaW4gdGhlIFNoZWVuIHNlY3Rpb24gb2YgaHR0cHM6Ly9kcml2ZS5nb29nbGUuY29tL2ZpbGUvZC8xVDBEMVZTeVI0QWxscUlKVFFBcmFFSXpqbGI1aDRGS0gvdmlldz91c3A9c2hhcmluZ1xyXG5jb25zdCBJQkxTaGVlbkJSREYgPSAvKkBfX1BVUkVfXyovIEZuKCAoIHsgbm9ybWFsLCB2aWV3RGlyLCByb3VnaG5lc3MgfSApID0+IHtcclxuXHJcblx0Y29uc3QgZG90TlYgPSBub3JtYWwuZG90KCB2aWV3RGlyICkuc2F0dXJhdGUoKTtcclxuXHJcblx0Y29uc3QgcjIgPSByb3VnaG5lc3MucG93MigpO1xyXG5cclxuXHRjb25zdCBhID0gc2VsZWN0KFxyXG5cdFx0cm91Z2huZXNzLmxlc3NUaGFuKCAwLjI1ICksXHJcblx0XHRmbG9hdCggLSAzMzkuMiApLm11bCggcjIgKS5hZGQoIGZsb2F0KCAxNjEuNCApLm11bCggcm91Z2huZXNzICkgKS5zdWIoIDI1LjkgKSxcclxuXHRcdGZsb2F0KCAtIDguNDggKS5tdWwoIHIyICkuYWRkKCBmbG9hdCggMTQuMyApLm11bCggcm91Z2huZXNzICkgKS5zdWIoIDkuOTUgKVxyXG5cdCk7XHJcblxyXG5cdGNvbnN0IGIgPSBzZWxlY3QoXHJcblx0XHRyb3VnaG5lc3MubGVzc1RoYW4oIDAuMjUgKSxcclxuXHRcdGZsb2F0KCA0NC4wICkubXVsKCByMiApLnN1YiggZmxvYXQoIDIzLjcgKS5tdWwoIHJvdWdobmVzcyApICkuYWRkKCAzLjI2ICksXHJcblx0XHRmbG9hdCggMS45NyApLm11bCggcjIgKS5zdWIoIGZsb2F0KCAzLjI3ICkubXVsKCByb3VnaG5lc3MgKSApLmFkZCggMC43MiApXHJcblx0KTtcclxuXHJcblx0Y29uc3QgREcgPSBzZWxlY3QoIHJvdWdobmVzcy5sZXNzVGhhbiggMC4yNSApLCAwLjAsIGZsb2F0KCAwLjEgKS5tdWwoIHJvdWdobmVzcyApLnN1YiggMC4wMjUgKSApLmFkZCggYS5tdWwoIGRvdE5WICkuYWRkKCBiICkuZXhwKCkgKTtcclxuXHJcblx0cmV0dXJuIERHLm11bCggMS4wIC8gTWF0aC5QSSApLnNhdHVyYXRlKCk7XHJcblxyXG59ICk7XHJcblxyXG5jb25zdCBjbGVhcmNvYXRGMCA9IHZlYzMoIDAuMDQgKTtcclxuY29uc3QgY2xlYXJjb2F0RjkwID0gZmxvYXQoIDEgKTtcclxuXHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyB0aGUgbGlnaHRpbmcgbW9kZWwgZm9yIGEgUEJSIG1hdGVyaWFsLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTGlnaHRpbmdNb2RlbFxyXG4gKi9cclxuY2xhc3MgUGh5c2ljYWxMaWdodGluZ01vZGVsIGV4dGVuZHMgTGlnaHRpbmdNb2RlbCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcGh5c2ljYWwgbGlnaHRpbmcgbW9kZWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtjbGVhcmNvYXQ9ZmFsc2VdIC0gV2hldGhlciBjbGVhcmNvYXQgaXMgc3VwcG9ydGVkIG9yIG5vdC5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtzaGVlbj1mYWxzZV0gLSBXaGV0aGVyIHNoZWVuIGlzIHN1cHBvcnRlZCBvciBub3QuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbaXJpZGVzY2VuY2U9ZmFsc2VdIC0gV2hldGhlciBpcmlkZXNjZW5jZSBpcyBzdXBwb3J0ZWQgb3Igbm90LlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FuaXNvdHJvcHk9ZmFsc2VdIC0gV2hldGhlciBhbmlzb3Ryb3B5IGlzIHN1cHBvcnRlZCBvciBub3QuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbdHJhbnNtaXNzaW9uPWZhbHNlXSAtIFdoZXRoZXIgdHJhbnNtaXNzaW9uIGlzIHN1cHBvcnRlZCBvciBub3QuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbZGlzcGVyc2lvbj1mYWxzZV0gLSBXaGV0aGVyIGRpc3BlcnNpb24gaXMgc3VwcG9ydGVkIG9yIG5vdC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggY2xlYXJjb2F0ID0gZmFsc2UsIHNoZWVuID0gZmFsc2UsIGlyaWRlc2NlbmNlID0gZmFsc2UsIGFuaXNvdHJvcHkgPSBmYWxzZSwgdHJhbnNtaXNzaW9uID0gZmFsc2UsIGRpc3BlcnNpb24gPSBmYWxzZSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciBjbGVhcmNvYXQgaXMgc3VwcG9ydGVkIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2xlYXJjb2F0ID0gY2xlYXJjb2F0O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciBzaGVlbiBpcyBzdXBwb3J0ZWQgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zaGVlbiA9IHNoZWVuO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciBpcmlkZXNjZW5jZSBpcyBzdXBwb3J0ZWQgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pcmlkZXNjZW5jZSA9IGlyaWRlc2NlbmNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciBhbmlzb3Ryb3B5IGlzIHN1cHBvcnRlZCBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFuaXNvdHJvcHkgPSBhbmlzb3Ryb3B5O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0cmFuc21pc3Npb24gaXMgc3VwcG9ydGVkIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudHJhbnNtaXNzaW9uID0gdHJhbnNtaXNzaW9uO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciBkaXNwZXJzaW9uIGlzIHN1cHBvcnRlZCBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRpc3BlcnNpb24gPSBkaXNwZXJzaW9uO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNsZWFyIGNvYXQgcmFkaWFuY2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNsZWFyY29hdFJhZGlhbmNlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjbGVhciBjb2F0IHNwZWN1bGFyIGRpcmVjdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2xlYXJjb2F0U3BlY3VsYXJEaXJlY3QgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNsZWFyIGNvYXQgc3BlY3VsYXIgaW5kaXJlY3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNsZWFyY29hdFNwZWN1bGFySW5kaXJlY3QgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHNoZWVuIHNwZWN1bGFyIGRpcmVjdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2hlZW5TcGVjdWxhckRpcmVjdCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc2hlZW4gc3BlY3VsYXIgaW5kaXJlY3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNoZWVuU3BlY3VsYXJJbmRpcmVjdCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgaXJpZGVzY2VuY2UgRnJlc25lbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXJpZGVzY2VuY2VGcmVzbmVsID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBpcmlkZXNjZW5jZSBGMC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXJpZGVzY2VuY2VGMCA9IG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVwZW5kaW5nIG9uIHdoYXQgZmVhdHVyZXMgYXJlIHJlcXVlc3RlZCwgdGhlIG1ldGhvZCBwcmVwYXJlcyBjZXJ0YWluIG5vZGUgdmFyaWFibGVzXHJcblx0ICogd2hpY2ggYXJlIGxhdGVyIHVzZWQgZm9yIGxpZ2h0aW5nIGNvbXB1dGF0aW9ucy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICovXHJcblx0c3RhcnQoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmNsZWFyY29hdCA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdHRoaXMuY2xlYXJjb2F0UmFkaWFuY2UgPSB2ZWMzKCkudG9WYXIoICdjbGVhcmNvYXRSYWRpYW5jZScgKTtcclxuXHRcdFx0dGhpcy5jbGVhcmNvYXRTcGVjdWxhckRpcmVjdCA9IHZlYzMoKS50b1ZhciggJ2NsZWFyY29hdFNwZWN1bGFyRGlyZWN0JyApO1xyXG5cdFx0XHR0aGlzLmNsZWFyY29hdFNwZWN1bGFySW5kaXJlY3QgPSB2ZWMzKCkudG9WYXIoICdjbGVhcmNvYXRTcGVjdWxhckluZGlyZWN0JyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMuc2hlZW4gPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnNoZWVuU3BlY3VsYXJEaXJlY3QgPSB2ZWMzKCkudG9WYXIoICdzaGVlblNwZWN1bGFyRGlyZWN0JyApO1xyXG5cdFx0XHR0aGlzLnNoZWVuU3BlY3VsYXJJbmRpcmVjdCA9IHZlYzMoKS50b1ZhciggJ3NoZWVuU3BlY3VsYXJJbmRpcmVjdCcgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aGlzLmlyaWRlc2NlbmNlID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0Y29uc3QgZG90TlZpID0gdHJhbnNmb3JtZWROb3JtYWxWaWV3LmRvdCggcG9zaXRpb25WaWV3RGlyZWN0aW9uICkuY2xhbXAoKTtcclxuXHJcblx0XHRcdHRoaXMuaXJpZGVzY2VuY2VGcmVzbmVsID0gZXZhbElyaWRlc2NlbmNlKCB7XHJcblx0XHRcdFx0b3V0c2lkZUlPUjogZmxvYXQoIDEuMCApLFxyXG5cdFx0XHRcdGV0YTI6IGlyaWRlc2NlbmNlSU9SLFxyXG5cdFx0XHRcdGNvc1RoZXRhMTogZG90TlZpLFxyXG5cdFx0XHRcdHRoaW5GaWxtVGhpY2tuZXNzOiBpcmlkZXNjZW5jZVRoaWNrbmVzcyxcclxuXHRcdFx0XHRiYXNlRjA6IHNwZWN1bGFyQ29sb3JcclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdFx0dGhpcy5pcmlkZXNjZW5jZUYwID0gU2NobGlja190b19GMCggeyBmOiB0aGlzLmlyaWRlc2NlbmNlRnJlc25lbCwgZjkwOiAxLjAsIGRvdFZIOiBkb3ROVmkgfSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMudHJhbnNtaXNzaW9uID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0Y29uc3QgcG9zaXRpb24gPSBwb3NpdGlvbldvcmxkO1xyXG5cdFx0XHRjb25zdCB2ID0gY2FtZXJhUG9zaXRpb24uc3ViKCBwb3NpdGlvbldvcmxkICkubm9ybWFsaXplKCk7IC8vIFRPRE86IENyZWF0ZSBOb2RlIGZvciB0aGlzLCBzYW1lIGlzc3VlIGluIE1hdGVyaWFsWFxyXG5cdFx0XHRjb25zdCBuID0gdHJhbnNmb3JtZWROb3JtYWxXb3JsZDtcclxuXHJcblx0XHRcdGNvbnN0IGNvbnRleHQgPSBidWlsZGVyLmNvbnRleHQ7XHJcblxyXG5cdFx0XHRjb250ZXh0LmJhY2tkcm9wID0gZ2V0SUJMVm9sdW1lUmVmcmFjdGlvbihcclxuXHRcdFx0XHRuLFxyXG5cdFx0XHRcdHYsXHJcblx0XHRcdFx0cm91Z2huZXNzLFxyXG5cdFx0XHRcdGRpZmZ1c2VDb2xvcixcclxuXHRcdFx0XHRzcGVjdWxhckNvbG9yLFxyXG5cdFx0XHRcdHNwZWN1bGFyRjkwLCAvLyBzcGVjdWxhckY5MFxyXG5cdFx0XHRcdHBvc2l0aW9uLCAvLyBwb3NpdGlvbldvcmxkXHJcblx0XHRcdFx0bW9kZWxXb3JsZE1hdHJpeCwgLy8gbW9kZWxNYXRyaXhcclxuXHRcdFx0XHRjYW1lcmFWaWV3TWF0cml4LCAvLyB2aWV3TWF0cml4XHJcblx0XHRcdFx0Y2FtZXJhUHJvamVjdGlvbk1hdHJpeCwgLy8gcHJvak1hdHJpeFxyXG5cdFx0XHRcdGlvcixcclxuXHRcdFx0XHR0aGlja25lc3MsXHJcblx0XHRcdFx0YXR0ZW51YXRpb25Db2xvcixcclxuXHRcdFx0XHRhdHRlbnVhdGlvbkRpc3RhbmNlLFxyXG5cdFx0XHRcdHRoaXMuZGlzcGVyc2lvbiA/IGRpc3BlcnNpb24gOiBudWxsXHJcblx0XHRcdCk7XHJcblxyXG5cdFx0XHRjb250ZXh0LmJhY2tkcm9wQWxwaGEgPSB0cmFuc21pc3Npb247XHJcblxyXG5cdFx0XHRkaWZmdXNlQ29sb3IuYS5tdWxBc3NpZ24oIG1peCggMSwgY29udGV4dC5iYWNrZHJvcC5hLCB0cmFuc21pc3Npb24gKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRzdXBlci5zdGFydCggYnVpbGRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vIEZkZXotQWfDvGVyYSdzIFwiTXVsdGlwbGUtU2NhdHRlcmluZyBNaWNyb2ZhY2V0IE1vZGVsIGZvciBSZWFsLVRpbWUgSW1hZ2UgQmFzZWQgTGlnaHRpbmdcIlxyXG5cdC8vIEFwcHJveGltYXRlcyBtdWx0aS1zY2F0dGVyaW5nIGluIG9yZGVyIHRvIHByZXNlcnZlIGVuZXJneS5cclxuXHQvLyBodHRwOi8vd3d3LmpjZ3Qub3JnL3B1Ymxpc2hlZC8wMDA4LzAxLzAzL1xyXG5cclxuXHRjb21wdXRlTXVsdGlzY2F0dGVyaW5nKCBzaW5nbGVTY2F0dGVyLCBtdWx0aVNjYXR0ZXIsIHNwZWN1bGFyRjkwICkge1xyXG5cclxuXHRcdGNvbnN0IGRvdE5WID0gdHJhbnNmb3JtZWROb3JtYWxWaWV3LmRvdCggcG9zaXRpb25WaWV3RGlyZWN0aW9uICkuY2xhbXAoKTsgLy8gQCBUT0RPOiBNb3ZlIHRvIGNvcmUgZG90TlZcclxuXHJcblx0XHRjb25zdCBmYWIgPSBERkdBcHByb3goIHsgcm91Z2huZXNzLCBkb3ROViB9ICk7XHJcblxyXG5cdFx0Y29uc3QgRnIgPSB0aGlzLmlyaWRlc2NlbmNlRjAgPyBpcmlkZXNjZW5jZS5taXgoIHNwZWN1bGFyQ29sb3IsIHRoaXMuaXJpZGVzY2VuY2VGMCApIDogc3BlY3VsYXJDb2xvcjtcclxuXHJcblx0XHRjb25zdCBGc3NFc3MgPSBGci5tdWwoIGZhYi54ICkuYWRkKCBzcGVjdWxhckY5MC5tdWwoIGZhYi55ICkgKTtcclxuXHJcblx0XHRjb25zdCBFc3MgPSBmYWIueC5hZGQoIGZhYi55ICk7XHJcblx0XHRjb25zdCBFbXMgPSBFc3Mub25lTWludXMoKTtcclxuXHJcblx0XHRjb25zdCBGYXZnID0gc3BlY3VsYXJDb2xvci5hZGQoIHNwZWN1bGFyQ29sb3Iub25lTWludXMoKS5tdWwoIDAuMDQ3NjE5ICkgKTsgLy8gMS8yMVxyXG5cdFx0Y29uc3QgRm1zID0gRnNzRXNzLm11bCggRmF2ZyApLmRpdiggRW1zLm11bCggRmF2ZyApLm9uZU1pbnVzKCkgKTtcclxuXHJcblx0XHRzaW5nbGVTY2F0dGVyLmFkZEFzc2lnbiggRnNzRXNzICk7XHJcblx0XHRtdWx0aVNjYXR0ZXIuYWRkQXNzaWduKCBGbXMubXVsKCBFbXMgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEltcGxlbWVudHMgdGhlIGRpcmVjdCBsaWdodC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBsaWdodERhdGEgLSBUaGUgbGlnaHQgZGF0YS5cclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqL1xyXG5cdGRpcmVjdCggeyBsaWdodERpcmVjdGlvbiwgbGlnaHRDb2xvciwgcmVmbGVjdGVkTGlnaHQgfSApIHtcclxuXHJcblx0XHRjb25zdCBkb3ROTCA9IHRyYW5zZm9ybWVkTm9ybWFsVmlldy5kb3QoIGxpZ2h0RGlyZWN0aW9uICkuY2xhbXAoKTtcclxuXHRcdGNvbnN0IGlycmFkaWFuY2UgPSBkb3ROTC5tdWwoIGxpZ2h0Q29sb3IgKTtcclxuXHJcblx0XHRpZiAoIHRoaXMuc2hlZW4gPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnNoZWVuU3BlY3VsYXJEaXJlY3QuYWRkQXNzaWduKCBpcnJhZGlhbmNlLm11bCggQlJERl9TaGVlbiggeyBsaWdodERpcmVjdGlvbiB9ICkgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMuY2xlYXJjb2F0ID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0Y29uc3QgZG90TkxjYyA9IHRyYW5zZm9ybWVkQ2xlYXJjb2F0Tm9ybWFsVmlldy5kb3QoIGxpZ2h0RGlyZWN0aW9uICkuY2xhbXAoKTtcclxuXHRcdFx0Y29uc3QgY2NJcnJhZGlhbmNlID0gZG90TkxjYy5tdWwoIGxpZ2h0Q29sb3IgKTtcclxuXHJcblx0XHRcdHRoaXMuY2xlYXJjb2F0U3BlY3VsYXJEaXJlY3QuYWRkQXNzaWduKCBjY0lycmFkaWFuY2UubXVsKCBCUkRGX0dHWCggeyBsaWdodERpcmVjdGlvbiwgZjA6IGNsZWFyY29hdEYwLCBmOTA6IGNsZWFyY29hdEY5MCwgcm91Z2huZXNzOiBjbGVhcmNvYXRSb3VnaG5lc3MsIG5vcm1hbFZpZXc6IHRyYW5zZm9ybWVkQ2xlYXJjb2F0Tm9ybWFsVmlldyB9ICkgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlLmFkZEFzc2lnbiggaXJyYWRpYW5jZS5tdWwoIEJSREZfTGFtYmVydCggeyBkaWZmdXNlQ29sb3I6IGRpZmZ1c2VDb2xvci5yZ2IgfSApICkgKTtcclxuXHJcblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhci5hZGRBc3NpZ24oIGlycmFkaWFuY2UubXVsKCBCUkRGX0dHWCggeyBsaWdodERpcmVjdGlvbiwgZjA6IHNwZWN1bGFyQ29sb3IsIGY5MDogMSwgcm91Z2huZXNzLCBpcmlkZXNjZW5jZTogdGhpcy5pcmlkZXNjZW5jZSwgZjogdGhpcy5pcmlkZXNjZW5jZUZyZXNuZWwsIFVTRV9JUklERVNDRU5DRTogdGhpcy5pcmlkZXNjZW5jZSwgVVNFX0FOSVNPVFJPUFk6IHRoaXMuYW5pc290cm9weSB9ICkgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciBpbXBsZW1lbnRpbmcgdGhlIGRpcmVjdCBsaWdodCB0ZXJtIGZvclxyXG5cdCAqIHJlY3QgYXJlYSBsaWdodCBub2Rlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dCAtIFRoZSBpbnB1dCBkYXRhLlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICovXHJcblx0ZGlyZWN0UmVjdEFyZWEoIHsgbGlnaHRDb2xvciwgbGlnaHRQb3NpdGlvbiwgaGFsZldpZHRoLCBoYWxmSGVpZ2h0LCByZWZsZWN0ZWRMaWdodCwgbHRjXzEsIGx0Y18yIH0gKSB7XHJcblxyXG5cdFx0Y29uc3QgcDAgPSBsaWdodFBvc2l0aW9uLmFkZCggaGFsZldpZHRoICkuc3ViKCBoYWxmSGVpZ2h0ICk7IC8vIGNvdW50ZXJjbG9ja3dpc2U7IGxpZ2h0IHNoaW5lcyBpbiBsb2NhbCBuZWcgeiBkaXJlY3Rpb25cclxuXHRcdGNvbnN0IHAxID0gbGlnaHRQb3NpdGlvbi5zdWIoIGhhbGZXaWR0aCApLnN1YiggaGFsZkhlaWdodCApO1xyXG5cdFx0Y29uc3QgcDIgPSBsaWdodFBvc2l0aW9uLnN1YiggaGFsZldpZHRoICkuYWRkKCBoYWxmSGVpZ2h0ICk7XHJcblx0XHRjb25zdCBwMyA9IGxpZ2h0UG9zaXRpb24uYWRkKCBoYWxmV2lkdGggKS5hZGQoIGhhbGZIZWlnaHQgKTtcclxuXHJcblx0XHRjb25zdCBOID0gdHJhbnNmb3JtZWROb3JtYWxWaWV3O1xyXG5cdFx0Y29uc3QgViA9IHBvc2l0aW9uVmlld0RpcmVjdGlvbjtcclxuXHRcdGNvbnN0IFAgPSBwb3NpdGlvblZpZXcudG9WYXIoKTtcclxuXHJcblx0XHRjb25zdCB1diA9IExUQ19VdiggeyBOLCBWLCByb3VnaG5lc3MgfSApO1xyXG5cclxuXHRcdGNvbnN0IHQxID0gbHRjXzEuc2FtcGxlKCB1diApLnRvVmFyKCk7XHJcblx0XHRjb25zdCB0MiA9IGx0Y18yLnNhbXBsZSggdXYgKS50b1ZhcigpO1xyXG5cclxuXHRcdGNvbnN0IG1JbnYgPSBtYXQzKFxyXG5cdFx0XHR2ZWMzKCB0MS54LCAwLCB0MS55ICksXHJcblx0XHRcdHZlYzMoIDAsIDEsIDAgKSxcclxuXHRcdFx0dmVjMyggdDEueiwgMCwgdDEudyApXHJcblx0XHQpLnRvVmFyKCk7XHJcblxyXG5cdFx0Ly8gTFRDIEZyZXNuZWwgQXBwcm94aW1hdGlvbiBieSBTdGVwaGVuIEhpbGxcclxuXHRcdC8vIGh0dHA6Ly9ibG9nLnNlbGZzaGFkb3cuY29tL3B1YmxpY2F0aW9ucy9zMjAxNi1hZHZhbmNlcy9zMjAxNl9sdGNfZnJlc25lbC5wZGZcclxuXHRcdGNvbnN0IGZyZXNuZWwgPSBzcGVjdWxhckNvbG9yLm11bCggdDIueCApLmFkZCggc3BlY3VsYXJDb2xvci5vbmVNaW51cygpLm11bCggdDIueSApICkudG9WYXIoKTtcclxuXHJcblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhci5hZGRBc3NpZ24oIGxpZ2h0Q29sb3IubXVsKCBmcmVzbmVsICkubXVsKCBMVENfRXZhbHVhdGUoIHsgTiwgViwgUCwgbUludiwgcDAsIHAxLCBwMiwgcDMgfSApICkgKTtcclxuXHJcblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlLmFkZEFzc2lnbiggbGlnaHRDb2xvci5tdWwoIGRpZmZ1c2VDb2xvciApLm11bCggTFRDX0V2YWx1YXRlKCB7IE4sIFYsIFAsIG1JbnY6IG1hdDMoIDEsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDEgKSwgcDAsIHAxLCBwMiwgcDMgfSApICkgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJbXBsZW1lbnRzIHRoZSBpbmRpcmVjdCBsaWdodGluZy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICovXHJcblx0aW5kaXJlY3QoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0dGhpcy5pbmRpcmVjdERpZmZ1c2UoIGJ1aWxkZXIgKTtcclxuXHRcdHRoaXMuaW5kaXJlY3RTcGVjdWxhciggYnVpbGRlciApO1xyXG5cdFx0dGhpcy5hbWJpZW50T2NjbHVzaW9uKCBidWlsZGVyICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW1wbGVtZW50cyB0aGUgaW5kaXJlY3QgZGlmZnVzZSB0ZXJtLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKi9cclxuXHRpbmRpcmVjdERpZmZ1c2UoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBpcnJhZGlhbmNlLCByZWZsZWN0ZWRMaWdodCB9ID0gYnVpbGRlci5jb250ZXh0O1xyXG5cclxuXHRcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZS5hZGRBc3NpZ24oIGlycmFkaWFuY2UubXVsKCBCUkRGX0xhbWJlcnQoIHsgZGlmZnVzZUNvbG9yIH0gKSApICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW1wbGVtZW50cyB0aGUgaW5kaXJlY3Qgc3BlY3VsYXIgdGVybS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICovXHJcblx0aW5kaXJlY3RTcGVjdWxhciggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCB7IHJhZGlhbmNlLCBpYmxJcnJhZGlhbmNlLCByZWZsZWN0ZWRMaWdodCB9ID0gYnVpbGRlci5jb250ZXh0O1xyXG5cclxuXHRcdGlmICggdGhpcy5zaGVlbiA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdHRoaXMuc2hlZW5TcGVjdWxhckluZGlyZWN0LmFkZEFzc2lnbiggaWJsSXJyYWRpYW5jZS5tdWwoXHJcblx0XHRcdFx0c2hlZW4sXHJcblx0XHRcdFx0SUJMU2hlZW5CUkRGKCB7XHJcblx0XHRcdFx0XHRub3JtYWw6IHRyYW5zZm9ybWVkTm9ybWFsVmlldyxcclxuXHRcdFx0XHRcdHZpZXdEaXI6IHBvc2l0aW9uVmlld0RpcmVjdGlvbixcclxuXHRcdFx0XHRcdHJvdWdobmVzczogc2hlZW5Sb3VnaG5lc3NcclxuXHRcdFx0XHR9IClcclxuXHRcdFx0KSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMuY2xlYXJjb2F0ID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0Y29uc3QgZG90TlZjYyA9IHRyYW5zZm9ybWVkQ2xlYXJjb2F0Tm9ybWFsVmlldy5kb3QoIHBvc2l0aW9uVmlld0RpcmVjdGlvbiApLmNsYW1wKCk7XHJcblxyXG5cdFx0XHRjb25zdCBjbGVhcmNvYXRFbnYgPSBFbnZpcm9ubWVudEJSREYoIHtcclxuXHRcdFx0XHRkb3ROVjogZG90TlZjYyxcclxuXHRcdFx0XHRzcGVjdWxhckNvbG9yOiBjbGVhcmNvYXRGMCxcclxuXHRcdFx0XHRzcGVjdWxhckY5MDogY2xlYXJjb2F0RjkwLFxyXG5cdFx0XHRcdHJvdWdobmVzczogY2xlYXJjb2F0Um91Z2huZXNzXHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHRcdHRoaXMuY2xlYXJjb2F0U3BlY3VsYXJJbmRpcmVjdC5hZGRBc3NpZ24oIHRoaXMuY2xlYXJjb2F0UmFkaWFuY2UubXVsKCBjbGVhcmNvYXRFbnYgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBCb3RoIGluZGlyZWN0IHNwZWN1bGFyIGFuZCBpbmRpcmVjdCBkaWZmdXNlIGxpZ2h0IGFjY3VtdWxhdGUgaGVyZVxyXG5cclxuXHRcdGNvbnN0IHNpbmdsZVNjYXR0ZXJpbmcgPSB2ZWMzKCkudG9WYXIoICdzaW5nbGVTY2F0dGVyaW5nJyApO1xyXG5cdFx0Y29uc3QgbXVsdGlTY2F0dGVyaW5nID0gdmVjMygpLnRvVmFyKCAnbXVsdGlTY2F0dGVyaW5nJyApO1xyXG5cdFx0Y29uc3QgY29zaW5lV2VpZ2h0ZWRJcnJhZGlhbmNlID0gaWJsSXJyYWRpYW5jZS5tdWwoIDEgLyBNYXRoLlBJICk7XHJcblxyXG5cdFx0dGhpcy5jb21wdXRlTXVsdGlzY2F0dGVyaW5nKCBzaW5nbGVTY2F0dGVyaW5nLCBtdWx0aVNjYXR0ZXJpbmcsIHNwZWN1bGFyRjkwICk7XHJcblxyXG5cdFx0Y29uc3QgdG90YWxTY2F0dGVyaW5nID0gc2luZ2xlU2NhdHRlcmluZy5hZGQoIG11bHRpU2NhdHRlcmluZyApO1xyXG5cclxuXHRcdGNvbnN0IGRpZmZ1c2UgPSBkaWZmdXNlQ29sb3IubXVsKCB0b3RhbFNjYXR0ZXJpbmcuci5tYXgoIHRvdGFsU2NhdHRlcmluZy5nICkubWF4KCB0b3RhbFNjYXR0ZXJpbmcuYiApLm9uZU1pbnVzKCkgKTtcclxuXHJcblx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyLmFkZEFzc2lnbiggcmFkaWFuY2UubXVsKCBzaW5nbGVTY2F0dGVyaW5nICkgKTtcclxuXHRcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIuYWRkQXNzaWduKCBtdWx0aVNjYXR0ZXJpbmcubXVsKCBjb3NpbmVXZWlnaHRlZElycmFkaWFuY2UgKSApO1xyXG5cclxuXHRcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZS5hZGRBc3NpZ24oIGRpZmZ1c2UubXVsKCBjb3NpbmVXZWlnaHRlZElycmFkaWFuY2UgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEltcGxlbWVudHMgdGhlIGFtYmllbnQgb2NjbHVzaW9uIHRlcm0uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqL1xyXG5cdGFtYmllbnRPY2NsdXNpb24oIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBhbWJpZW50T2NjbHVzaW9uLCByZWZsZWN0ZWRMaWdodCB9ID0gYnVpbGRlci5jb250ZXh0O1xyXG5cclxuXHRcdGNvbnN0IGRvdE5WID0gdHJhbnNmb3JtZWROb3JtYWxWaWV3LmRvdCggcG9zaXRpb25WaWV3RGlyZWN0aW9uICkuY2xhbXAoKTsgLy8gQCBUT0RPOiBNb3ZlIHRvIGNvcmUgZG90TlZcclxuXHJcblx0XHRjb25zdCBhb05WID0gZG90TlYuYWRkKCBhbWJpZW50T2NjbHVzaW9uICk7XHJcblx0XHRjb25zdCBhb0V4cCA9IHJvdWdobmVzcy5tdWwoIC0gMTYuMCApLm9uZU1pbnVzKCkubmVnYXRlKCkuZXhwMigpO1xyXG5cclxuXHRcdGNvbnN0IGFvTm9kZSA9IGFtYmllbnRPY2NsdXNpb24uc3ViKCBhb05WLnBvdyggYW9FeHAgKS5vbmVNaW51cygpICkuY2xhbXAoKTtcclxuXHJcblx0XHRpZiAoIHRoaXMuY2xlYXJjb2F0ID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0dGhpcy5jbGVhcmNvYXRTcGVjdWxhckluZGlyZWN0Lm11bEFzc2lnbiggYW1iaWVudE9jY2x1c2lvbiApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMuc2hlZW4gPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnNoZWVuU3BlY3VsYXJJbmRpcmVjdC5tdWxBc3NpZ24oIGFtYmllbnRPY2NsdXNpb24gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlLm11bEFzc2lnbiggYW1iaWVudE9jY2x1c2lvbiApO1xyXG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhci5tdWxBc3NpZ24oIGFvTm9kZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVzZWQgZm9yIGZpbmFsIGxpZ2h0aW5nIGFjY3VtdWxhdGlvbnMgZGVwZW5kaW5nIG9uIHRoZSByZXF1ZXN0ZWQgZmVhdHVyZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqL1xyXG5cdGZpbmlzaCggeyBjb250ZXh0IH0gKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBvdXRnb2luZ0xpZ2h0IH0gPSBjb250ZXh0O1xyXG5cclxuXHRcdGlmICggdGhpcy5jbGVhcmNvYXQgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBkb3ROVmNjID0gdHJhbnNmb3JtZWRDbGVhcmNvYXROb3JtYWxWaWV3LmRvdCggcG9zaXRpb25WaWV3RGlyZWN0aW9uICkuY2xhbXAoKTtcclxuXHJcblx0XHRcdGNvbnN0IEZjYyA9IEZfU2NobGljaygge1xyXG5cdFx0XHRcdGRvdFZIOiBkb3ROVmNjLFxyXG5cdFx0XHRcdGYwOiBjbGVhcmNvYXRGMCxcclxuXHRcdFx0XHRmOTA6IGNsZWFyY29hdEY5MFxyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRjb25zdCBjbGVhcmNvYXRMaWdodCA9IG91dGdvaW5nTGlnaHQubXVsKCBjbGVhcmNvYXQubXVsKCBGY2MgKS5vbmVNaW51cygpICkuYWRkKCB0aGlzLmNsZWFyY29hdFNwZWN1bGFyRGlyZWN0LmFkZCggdGhpcy5jbGVhcmNvYXRTcGVjdWxhckluZGlyZWN0ICkubXVsKCBjbGVhcmNvYXQgKSApO1xyXG5cclxuXHRcdFx0b3V0Z29pbmdMaWdodC5hc3NpZ24oIGNsZWFyY29hdExpZ2h0ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy5zaGVlbiA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdGNvbnN0IHNoZWVuRW5lcmd5Q29tcCA9IHNoZWVuLnIubWF4KCBzaGVlbi5nICkubWF4KCBzaGVlbi5iICkubXVsKCAwLjE1NyApLm9uZU1pbnVzKCk7XHJcblx0XHRcdGNvbnN0IHNoZWVuTGlnaHQgPSBvdXRnb2luZ0xpZ2h0Lm11bCggc2hlZW5FbmVyZ3lDb21wICkuYWRkKCB0aGlzLnNoZWVuU3BlY3VsYXJEaXJlY3QsIHRoaXMuc2hlZW5TcGVjdWxhckluZGlyZWN0ICk7XHJcblxyXG5cdFx0XHRvdXRnb2luZ0xpZ2h0LmFzc2lnbiggc2hlZW5MaWdodCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUGh5c2ljYWxMaWdodGluZ01vZGVsO1xyXG4iLCJpbXBvcnQgeyBGbiwgaW50LCBmbG9hdCwgdmVjMiwgdmVjMywgdmVjNCwgSWYgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcbmltcG9ydCB7IGNvcywgc2luLCBhYnMsIG1heCwgZXhwMiwgbG9nMiwgY2xhbXAsIGZyYWN0LCBtaXgsIGZsb29yLCBub3JtYWxpemUsIGNyb3NzIH0gZnJvbSAnLi4vbWF0aC9NYXRoTm9kZS5qcyc7XHJcbmltcG9ydCB7IG11bCB9IGZyb20gJy4uL21hdGgvT3BlcmF0b3JOb2RlLmpzJztcclxuaW1wb3J0IHsgc2VsZWN0IH0gZnJvbSAnLi4vbWF0aC9Db25kaXRpb25hbE5vZGUuanMnO1xyXG5pbXBvcnQgeyBMb29wLCBCcmVhayB9IGZyb20gJy4uL3V0aWxzL0xvb3BOb2RlLmpzJztcclxuXHJcbi8vIFRoZXNlIGRlZmluZXMgbXVzdCBtYXRjaCB3aXRoIFBNUkVNR2VuZXJhdG9yXHJcblxyXG5jb25zdCBjdWJlVVZfcjAgPSAvKkBfX1BVUkVfXyovIGZsb2F0KCAxLjAgKTtcclxuY29uc3QgY3ViZVVWX20wID0gLypAX19QVVJFX18qLyBmbG9hdCggLSAyLjAgKTtcclxuY29uc3QgY3ViZVVWX3IxID0gLypAX19QVVJFX18qLyBmbG9hdCggMC44ICk7XHJcbmNvbnN0IGN1YmVVVl9tMSA9IC8qQF9fUFVSRV9fKi8gZmxvYXQoIC0gMS4wICk7XHJcbmNvbnN0IGN1YmVVVl9yNCA9IC8qQF9fUFVSRV9fKi8gZmxvYXQoIDAuNCApO1xyXG5jb25zdCBjdWJlVVZfbTQgPSAvKkBfX1BVUkVfXyovIGZsb2F0KCAyLjAgKTtcclxuY29uc3QgY3ViZVVWX3I1ID0gLypAX19QVVJFX18qLyBmbG9hdCggMC4zMDUgKTtcclxuY29uc3QgY3ViZVVWX201ID0gLypAX19QVVJFX18qLyBmbG9hdCggMy4wICk7XHJcbmNvbnN0IGN1YmVVVl9yNiA9IC8qQF9fUFVSRV9fKi8gZmxvYXQoIDAuMjEgKTtcclxuY29uc3QgY3ViZVVWX202ID0gLypAX19QVVJFX18qLyBmbG9hdCggNC4wICk7XHJcblxyXG5jb25zdCBjdWJlVVZfbWluTWlwTGV2ZWwgPSAvKkBfX1BVUkVfXyovIGZsb2F0KCA0LjAgKTtcclxuY29uc3QgY3ViZVVWX21pblRpbGVTaXplID0gLypAX19QVVJFX18qLyBmbG9hdCggMTYuMCApO1xyXG5cclxuLy8gVGhlc2Ugc2hhZGVyIGZ1bmN0aW9ucyBjb252ZXJ0IGJldHdlZW4gdGhlIFVWIGNvb3JkaW5hdGVzIG9mIGEgc2luZ2xlIGZhY2Ugb2ZcclxuLy8gYSBjdWJlbWFwLCB0aGUgMC01IGludGVnZXIgaW5kZXggb2YgYSBjdWJlIGZhY2UsIGFuZCB0aGUgZGlyZWN0aW9uIHZlY3RvciBmb3JcclxuLy8gc2FtcGxpbmcgYSB0ZXh0dXJlQ3ViZSAobm90IGdlbmVyYWxseSBub3JtYWxpemVkICkuXHJcblxyXG5jb25zdCBnZXRGYWNlID0gLypAX19QVVJFX18qLyBGbiggKCBbIGRpcmVjdGlvbiBdICkgPT4ge1xyXG5cclxuXHRjb25zdCBhYnNEaXJlY3Rpb24gPSB2ZWMzKCBhYnMoIGRpcmVjdGlvbiApICkudG9WYXIoKTtcclxuXHRjb25zdCBmYWNlID0gZmxvYXQoIC0gMS4wICkudG9WYXIoKTtcclxuXHJcblx0SWYoIGFic0RpcmVjdGlvbi54LmdyZWF0ZXJUaGFuKCBhYnNEaXJlY3Rpb24ueiApLCAoKSA9PiB7XHJcblxyXG5cdFx0SWYoIGFic0RpcmVjdGlvbi54LmdyZWF0ZXJUaGFuKCBhYnNEaXJlY3Rpb24ueSApLCAoKSA9PiB7XHJcblxyXG5cdFx0XHRmYWNlLmFzc2lnbiggc2VsZWN0KCBkaXJlY3Rpb24ueC5ncmVhdGVyVGhhbiggMC4wICksIDAuMCwgMy4wICkgKTtcclxuXHJcblx0XHR9ICkuRWxzZSggKCkgPT4ge1xyXG5cclxuXHRcdFx0ZmFjZS5hc3NpZ24oIHNlbGVjdCggZGlyZWN0aW9uLnkuZ3JlYXRlclRoYW4oIDAuMCApLCAxLjAsIDQuMCApICk7XHJcblxyXG5cdFx0fSApO1xyXG5cclxuXHR9ICkuRWxzZSggKCkgPT4ge1xyXG5cclxuXHRcdElmKCBhYnNEaXJlY3Rpb24uei5ncmVhdGVyVGhhbiggYWJzRGlyZWN0aW9uLnkgKSwgKCkgPT4ge1xyXG5cclxuXHRcdFx0ZmFjZS5hc3NpZ24oIHNlbGVjdCggZGlyZWN0aW9uLnouZ3JlYXRlclRoYW4oIDAuMCApLCAyLjAsIDUuMCApICk7XHJcblxyXG5cdFx0fSApLkVsc2UoICgpID0+IHtcclxuXHJcblx0XHRcdGZhY2UuYXNzaWduKCBzZWxlY3QoIGRpcmVjdGlvbi55LmdyZWF0ZXJUaGFuKCAwLjAgKSwgMS4wLCA0LjAgKSApO1xyXG5cclxuXHRcdH0gKTtcclxuXHJcblx0fSApO1xyXG5cclxuXHRyZXR1cm4gZmFjZTtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnZ2V0RmFjZScsXHJcblx0dHlwZTogJ2Zsb2F0JyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ2RpcmVjdGlvbicsIHR5cGU6ICd2ZWMzJyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG4vLyBSSCBjb29yZGluYXRlIHN5c3RlbTsgUE1SRU0gZmFjZS1pbmRleGluZyBjb252ZW50aW9uXHJcbmNvbnN0IGdldFVWID0gLypAX19QVVJFX18qLyBGbiggKCBbIGRpcmVjdGlvbiwgZmFjZSBdICkgPT4ge1xyXG5cclxuXHRjb25zdCB1diA9IHZlYzIoKS50b1ZhcigpO1xyXG5cclxuXHRJZiggZmFjZS5lcXVhbCggMC4wICksICgpID0+IHtcclxuXHJcblx0XHR1di5hc3NpZ24oIHZlYzIoIGRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueSApLmRpdiggYWJzKCBkaXJlY3Rpb24ueCApICkgKTsgLy8gcG9zIHhcclxuXHJcblx0fSApLkVsc2VJZiggZmFjZS5lcXVhbCggMS4wICksICgpID0+IHtcclxuXHJcblx0XHR1di5hc3NpZ24oIHZlYzIoIGRpcmVjdGlvbi54Lm5lZ2F0ZSgpLCBkaXJlY3Rpb24uei5uZWdhdGUoKSApLmRpdiggYWJzKCBkaXJlY3Rpb24ueSApICkgKTsgLy8gcG9zIHlcclxuXHJcblx0fSApLkVsc2VJZiggZmFjZS5lcXVhbCggMi4wICksICgpID0+IHtcclxuXHJcblx0XHR1di5hc3NpZ24oIHZlYzIoIGRpcmVjdGlvbi54Lm5lZ2F0ZSgpLCBkaXJlY3Rpb24ueSApLmRpdiggYWJzKCBkaXJlY3Rpb24ueiApICkgKTsgLy8gcG9zIHpcclxuXHJcblx0fSApLkVsc2VJZiggZmFjZS5lcXVhbCggMy4wICksICgpID0+IHtcclxuXHJcblx0XHR1di5hc3NpZ24oIHZlYzIoIGRpcmVjdGlvbi56Lm5lZ2F0ZSgpLCBkaXJlY3Rpb24ueSApLmRpdiggYWJzKCBkaXJlY3Rpb24ueCApICkgKTsgLy8gbmVnIHhcclxuXHJcblx0fSApLkVsc2VJZiggZmFjZS5lcXVhbCggNC4wICksICgpID0+IHtcclxuXHJcblx0XHR1di5hc3NpZ24oIHZlYzIoIGRpcmVjdGlvbi54Lm5lZ2F0ZSgpLCBkaXJlY3Rpb24ueiApLmRpdiggYWJzKCBkaXJlY3Rpb24ueSApICkgKTsgLy8gbmVnIHlcclxuXHJcblx0fSApLkVsc2UoICgpID0+IHtcclxuXHJcblx0XHR1di5hc3NpZ24oIHZlYzIoIGRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueSApLmRpdiggYWJzKCBkaXJlY3Rpb24ueiApICkgKTsgLy8gbmVnIHpcclxuXHJcblx0fSApO1xyXG5cclxuXHRyZXR1cm4gbXVsKCAwLjUsIHV2LmFkZCggMS4wICkgKTtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnZ2V0VVYnLFxyXG5cdHR5cGU6ICd2ZWMyJyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ2RpcmVjdGlvbicsIHR5cGU6ICd2ZWMzJyB9LFxyXG5cdFx0eyBuYW1lOiAnZmFjZScsIHR5cGU6ICdmbG9hdCcgfVxyXG5cdF1cclxufSApO1xyXG5cclxuY29uc3Qgcm91Z2huZXNzVG9NaXAgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgcm91Z2huZXNzIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IG1pcCA9IGZsb2F0KCAwLjAgKS50b1ZhcigpO1xyXG5cclxuXHRJZiggcm91Z2huZXNzLmdyZWF0ZXJUaGFuRXF1YWwoIGN1YmVVVl9yMSApLCAoKSA9PiB7XHJcblxyXG5cdFx0bWlwLmFzc2lnbiggY3ViZVVWX3IwLnN1Yiggcm91Z2huZXNzICkubXVsKCBjdWJlVVZfbTEuc3ViKCBjdWJlVVZfbTAgKSApLmRpdiggY3ViZVVWX3IwLnN1YiggY3ViZVVWX3IxICkgKS5hZGQoIGN1YmVVVl9tMCApICk7XHJcblxyXG5cdH0gKS5FbHNlSWYoIHJvdWdobmVzcy5ncmVhdGVyVGhhbkVxdWFsKCBjdWJlVVZfcjQgKSwgKCkgPT4ge1xyXG5cclxuXHRcdG1pcC5hc3NpZ24oIGN1YmVVVl9yMS5zdWIoIHJvdWdobmVzcyApLm11bCggY3ViZVVWX200LnN1YiggY3ViZVVWX20xICkgKS5kaXYoIGN1YmVVVl9yMS5zdWIoIGN1YmVVVl9yNCApICkuYWRkKCBjdWJlVVZfbTEgKSApO1xyXG5cclxuXHR9ICkuRWxzZUlmKCByb3VnaG5lc3MuZ3JlYXRlclRoYW5FcXVhbCggY3ViZVVWX3I1ICksICgpID0+IHtcclxuXHJcblx0XHRtaXAuYXNzaWduKCBjdWJlVVZfcjQuc3ViKCByb3VnaG5lc3MgKS5tdWwoIGN1YmVVVl9tNS5zdWIoIGN1YmVVVl9tNCApICkuZGl2KCBjdWJlVVZfcjQuc3ViKCBjdWJlVVZfcjUgKSApLmFkZCggY3ViZVVWX200ICkgKTtcclxuXHJcblx0fSApLkVsc2VJZiggcm91Z2huZXNzLmdyZWF0ZXJUaGFuRXF1YWwoIGN1YmVVVl9yNiApLCAoKSA9PiB7XHJcblxyXG5cdFx0bWlwLmFzc2lnbiggY3ViZVVWX3I1LnN1Yiggcm91Z2huZXNzICkubXVsKCBjdWJlVVZfbTYuc3ViKCBjdWJlVVZfbTUgKSApLmRpdiggY3ViZVVWX3I1LnN1YiggY3ViZVVWX3I2ICkgKS5hZGQoIGN1YmVVVl9tNSApICk7XHJcblxyXG5cdH0gKS5FbHNlKCAoKSA9PiB7XHJcblxyXG5cdFx0bWlwLmFzc2lnbiggZmxvYXQoIC0gMi4wICkubXVsKCBsb2cyKCBtdWwoIDEuMTYsIHJvdWdobmVzcyApICkgKSApOyAvLyAxLjE2ID0gMS43OV4wLjI1XHJcblxyXG5cdH0gKTtcclxuXHJcblx0cmV0dXJuIG1pcDtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAncm91Z2huZXNzVG9NaXAnLFxyXG5cdHR5cGU6ICdmbG9hdCcsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICdyb3VnaG5lc3MnLCB0eXBlOiAnZmxvYXQnIH1cclxuXHRdXHJcbn0gKTtcclxuXHJcbi8vIFJIIGNvb3JkaW5hdGUgc3lzdGVtOyBQTVJFTSBmYWNlLWluZGV4aW5nIGNvbnZlbnRpb25cclxuZXhwb3J0IGNvbnN0IGdldERpcmVjdGlvbiA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyB1dl9pbW11dGFibGUsIGZhY2UgXSApID0+IHtcclxuXHJcblx0Y29uc3QgdXYgPSB1dl9pbW11dGFibGUudG9WYXIoKTtcclxuXHR1di5hc3NpZ24oIG11bCggMi4wLCB1diApLnN1YiggMS4wICkgKTtcclxuXHRjb25zdCBkaXJlY3Rpb24gPSB2ZWMzKCB1diwgMS4wICkudG9WYXIoKTtcclxuXHJcblx0SWYoIGZhY2UuZXF1YWwoIDAuMCApLCAoKSA9PiB7XHJcblxyXG5cdFx0ZGlyZWN0aW9uLmFzc2lnbiggZGlyZWN0aW9uLnp5eCApOyAvLyAoIDEsIHYsIHUgKSBwb3MgeFxyXG5cclxuXHR9ICkuRWxzZUlmKCBmYWNlLmVxdWFsKCAxLjAgKSwgKCkgPT4ge1xyXG5cclxuXHRcdGRpcmVjdGlvbi5hc3NpZ24oIGRpcmVjdGlvbi54enkgKTtcclxuXHRcdGRpcmVjdGlvbi54ei5tdWxBc3NpZ24oIC0gMS4wICk7IC8vICggLXUsIDEsIC12ICkgcG9zIHlcclxuXHJcblx0fSApLkVsc2VJZiggZmFjZS5lcXVhbCggMi4wICksICgpID0+IHtcclxuXHJcblx0XHRkaXJlY3Rpb24ueC5tdWxBc3NpZ24oIC0gMS4wICk7IC8vICggLXUsIHYsIDEgKSBwb3MgelxyXG5cclxuXHR9ICkuRWxzZUlmKCBmYWNlLmVxdWFsKCAzLjAgKSwgKCkgPT4ge1xyXG5cclxuXHRcdGRpcmVjdGlvbi5hc3NpZ24oIGRpcmVjdGlvbi56eXggKTtcclxuXHRcdGRpcmVjdGlvbi54ei5tdWxBc3NpZ24oIC0gMS4wICk7IC8vICggLTEsIHYsIC11ICkgbmVnIHhcclxuXHJcblx0fSApLkVsc2VJZiggZmFjZS5lcXVhbCggNC4wICksICgpID0+IHtcclxuXHJcblx0XHRkaXJlY3Rpb24uYXNzaWduKCBkaXJlY3Rpb24ueHp5ICk7XHJcblx0XHRkaXJlY3Rpb24ueHkubXVsQXNzaWduKCAtIDEuMCApOyAvLyAoIC11LCAtMSwgdiApIG5lZyB5XHJcblxyXG5cdH0gKS5FbHNlSWYoIGZhY2UuZXF1YWwoIDUuMCApLCAoKSA9PiB7XHJcblxyXG5cdFx0ZGlyZWN0aW9uLnoubXVsQXNzaWduKCAtIDEuMCApOyAvLyAoIHUsIHYsIC0xICkgbmVnIHpTXHJcblxyXG5cdH0gKTtcclxuXHJcblx0cmV0dXJuIGRpcmVjdGlvbjtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnZ2V0RGlyZWN0aW9uJyxcclxuXHR0eXBlOiAndmVjMycsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICd1dicsIHR5cGU6ICd2ZWMyJyB9LFxyXG5cdFx0eyBuYW1lOiAnZmFjZScsIHR5cGU6ICdmbG9hdCcgfVxyXG5cdF1cclxufSApO1xyXG5cclxuLy9cclxuXHJcbmV4cG9ydCBjb25zdCB0ZXh0dXJlQ3ViZVVWID0gLypAX19QVVJFX18qLyBGbiggKCBbIGVudk1hcCwgc2FtcGxlRGlyX2ltbXV0YWJsZSwgcm91Z2huZXNzX2ltbXV0YWJsZSwgQ1VCRVVWX1RFWEVMX1dJRFRILCBDVUJFVVZfVEVYRUxfSEVJR0hULCBDVUJFVVZfTUFYX01JUCBdICkgPT4ge1xyXG5cclxuXHRjb25zdCByb3VnaG5lc3MgPSBmbG9hdCggcm91Z2huZXNzX2ltbXV0YWJsZSApO1xyXG5cdGNvbnN0IHNhbXBsZURpciA9IHZlYzMoIHNhbXBsZURpcl9pbW11dGFibGUgKTtcclxuXHJcblx0Y29uc3QgbWlwID0gY2xhbXAoIHJvdWdobmVzc1RvTWlwKCByb3VnaG5lc3MgKSwgY3ViZVVWX20wLCBDVUJFVVZfTUFYX01JUCApO1xyXG5cdGNvbnN0IG1pcEYgPSBmcmFjdCggbWlwICk7XHJcblx0Y29uc3QgbWlwSW50ID0gZmxvb3IoIG1pcCApO1xyXG5cdGNvbnN0IGNvbG9yMCA9IHZlYzMoIGJpbGluZWFyQ3ViZVVWKCBlbnZNYXAsIHNhbXBsZURpciwgbWlwSW50LCBDVUJFVVZfVEVYRUxfV0lEVEgsIENVQkVVVl9URVhFTF9IRUlHSFQsIENVQkVVVl9NQVhfTUlQICkgKS50b1ZhcigpO1xyXG5cclxuXHRJZiggbWlwRi5ub3RFcXVhbCggMC4wICksICgpID0+IHtcclxuXHJcblx0XHRjb25zdCBjb2xvcjEgPSB2ZWMzKCBiaWxpbmVhckN1YmVVViggZW52TWFwLCBzYW1wbGVEaXIsIG1pcEludC5hZGQoIDEuMCApLCBDVUJFVVZfVEVYRUxfV0lEVEgsIENVQkVVVl9URVhFTF9IRUlHSFQsIENVQkVVVl9NQVhfTUlQICkgKS50b1ZhcigpO1xyXG5cclxuXHRcdGNvbG9yMC5hc3NpZ24oIG1peCggY29sb3IwLCBjb2xvcjEsIG1pcEYgKSApO1xyXG5cclxuXHR9ICk7XHJcblxyXG5cdHJldHVybiBjb2xvcjA7XHJcblxyXG59ICk7XHJcblxyXG5jb25zdCBiaWxpbmVhckN1YmVVViA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyBlbnZNYXAsIGRpcmVjdGlvbl9pbW11dGFibGUsIG1pcEludF9pbW11dGFibGUsIENVQkVVVl9URVhFTF9XSURUSCwgQ1VCRVVWX1RFWEVMX0hFSUdIVCwgQ1VCRVVWX01BWF9NSVAgXSApID0+IHtcclxuXHJcblx0Y29uc3QgbWlwSW50ID0gZmxvYXQoIG1pcEludF9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IGRpcmVjdGlvbiA9IHZlYzMoIGRpcmVjdGlvbl9pbW11dGFibGUgKTtcclxuXHRjb25zdCBmYWNlID0gZmxvYXQoIGdldEZhY2UoIGRpcmVjdGlvbiApICkudG9WYXIoKTtcclxuXHRjb25zdCBmaWx0ZXJJbnQgPSBmbG9hdCggbWF4KCBjdWJlVVZfbWluTWlwTGV2ZWwuc3ViKCBtaXBJbnQgKSwgMC4wICkgKS50b1ZhcigpO1xyXG5cdG1pcEludC5hc3NpZ24oIG1heCggbWlwSW50LCBjdWJlVVZfbWluTWlwTGV2ZWwgKSApO1xyXG5cdGNvbnN0IGZhY2VTaXplID0gZmxvYXQoIGV4cDIoIG1pcEludCApICkudG9WYXIoKTtcclxuXHRjb25zdCB1diA9IHZlYzIoIGdldFVWKCBkaXJlY3Rpb24sIGZhY2UgKS5tdWwoIGZhY2VTaXplLnN1YiggMi4wICkgKS5hZGQoIDEuMCApICkudG9WYXIoKTtcclxuXHJcblx0SWYoIGZhY2UuZ3JlYXRlclRoYW4oIDIuMCApLCAoKSA9PiB7XHJcblxyXG5cdFx0dXYueS5hZGRBc3NpZ24oIGZhY2VTaXplICk7XHJcblx0XHRmYWNlLnN1YkFzc2lnbiggMy4wICk7XHJcblxyXG5cdH0gKTtcclxuXHJcblx0dXYueC5hZGRBc3NpZ24oIGZhY2UubXVsKCBmYWNlU2l6ZSApICk7XHJcblx0dXYueC5hZGRBc3NpZ24oIGZpbHRlckludC5tdWwoIG11bCggMy4wLCBjdWJlVVZfbWluVGlsZVNpemUgKSApICk7XHJcblx0dXYueS5hZGRBc3NpZ24oIG11bCggNC4wLCBleHAyKCBDVUJFVVZfTUFYX01JUCApLnN1YiggZmFjZVNpemUgKSApICk7XHJcblx0dXYueC5tdWxBc3NpZ24oIENVQkVVVl9URVhFTF9XSURUSCApO1xyXG5cdHV2LnkubXVsQXNzaWduKCBDVUJFVVZfVEVYRUxfSEVJR0hUICk7XHJcblxyXG5cdHJldHVybiBlbnZNYXAuc2FtcGxlKCB1diApLmdyYWQoIHZlYzIoKSwgdmVjMigpICk7IC8vIGRpc2FibGUgYW5pc290cm9waWMgZmlsdGVyaW5nXHJcblxyXG59ICk7XHJcblxyXG5jb25zdCBnZXRTYW1wbGUgPSAvKkBfX1BVUkVfXyovIEZuKCAoIHsgZW52TWFwLCBtaXBJbnQsIG91dHB1dERpcmVjdGlvbiwgdGhldGEsIGF4aXMsIENVQkVVVl9URVhFTF9XSURUSCwgQ1VCRVVWX1RFWEVMX0hFSUdIVCwgQ1VCRVVWX01BWF9NSVAgfSApID0+IHtcclxuXHJcblx0Y29uc3QgY29zVGhldGEgPSBjb3MoIHRoZXRhICk7XHJcblxyXG5cdC8vIFJvZHJpZ3VlcycgYXhpcy1hbmdsZSByb3RhdGlvblxyXG5cdGNvbnN0IHNhbXBsZURpcmVjdGlvbiA9IG91dHB1dERpcmVjdGlvbi5tdWwoIGNvc1RoZXRhIClcclxuXHRcdC5hZGQoIGF4aXMuY3Jvc3MoIG91dHB1dERpcmVjdGlvbiApLm11bCggc2luKCB0aGV0YSApICkgKVxyXG5cdFx0LmFkZCggYXhpcy5tdWwoIGF4aXMuZG90KCBvdXRwdXREaXJlY3Rpb24gKS5tdWwoIGNvc1RoZXRhLm9uZU1pbnVzKCkgKSApICk7XHJcblxyXG5cdHJldHVybiBiaWxpbmVhckN1YmVVViggZW52TWFwLCBzYW1wbGVEaXJlY3Rpb24sIG1pcEludCwgQ1VCRVVWX1RFWEVMX1dJRFRILCBDVUJFVVZfVEVYRUxfSEVJR0hULCBDVUJFVVZfTUFYX01JUCApO1xyXG5cclxufSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IGJsdXIgPSAvKkBfX1BVUkVfXyovIEZuKCAoIHsgbiwgbGF0aXR1ZGluYWwsIHBvbGVBeGlzLCBvdXRwdXREaXJlY3Rpb24sIHdlaWdodHMsIHNhbXBsZXMsIGRUaGV0YSwgbWlwSW50LCBlbnZNYXAsIENVQkVVVl9URVhFTF9XSURUSCwgQ1VCRVVWX1RFWEVMX0hFSUdIVCwgQ1VCRVVWX01BWF9NSVAgfSApID0+IHtcclxuXHJcblx0Y29uc3QgYXhpcyA9IHZlYzMoIHNlbGVjdCggbGF0aXR1ZGluYWwsIHBvbGVBeGlzLCBjcm9zcyggcG9sZUF4aXMsIG91dHB1dERpcmVjdGlvbiApICkgKS50b1ZhcigpO1xyXG5cclxuXHRJZiggYXhpcy5lcXVhbCggdmVjMyggMC4wICkgKSwgKCkgPT4ge1xyXG5cclxuXHRcdGF4aXMuYXNzaWduKCB2ZWMzKCBvdXRwdXREaXJlY3Rpb24ueiwgMC4wLCBvdXRwdXREaXJlY3Rpb24ueC5uZWdhdGUoKSApICk7XHJcblxyXG5cdH0gKTtcclxuXHJcblx0YXhpcy5hc3NpZ24oIG5vcm1hbGl6ZSggYXhpcyApICk7XHJcblxyXG5cdGNvbnN0IGdsX0ZyYWdDb2xvciA9IHZlYzMoKS50b1ZhcigpO1xyXG5cdGdsX0ZyYWdDb2xvci5hZGRBc3NpZ24oIHdlaWdodHMuZWxlbWVudCggMCApLm11bCggZ2V0U2FtcGxlKCB7IHRoZXRhOiAwLjAsIGF4aXMsIG91dHB1dERpcmVjdGlvbiwgbWlwSW50LCBlbnZNYXAsIENVQkVVVl9URVhFTF9XSURUSCwgQ1VCRVVWX1RFWEVMX0hFSUdIVCwgQ1VCRVVWX01BWF9NSVAgfSApICkgKTtcclxuXHJcblx0TG9vcCggeyBzdGFydDogaW50KCAxICksIGVuZDogbiB9LCAoIHsgaSB9ICkgPT4ge1xyXG5cclxuXHRcdElmKCBpLmdyZWF0ZXJUaGFuRXF1YWwoIHNhbXBsZXMgKSwgKCkgPT4ge1xyXG5cclxuXHRcdFx0QnJlYWsoKTtcclxuXHJcblx0XHR9ICk7XHJcblxyXG5cdFx0Y29uc3QgdGhldGEgPSBmbG9hdCggZFRoZXRhLm11bCggZmxvYXQoIGkgKSApICkudG9WYXIoKTtcclxuXHRcdGdsX0ZyYWdDb2xvci5hZGRBc3NpZ24oIHdlaWdodHMuZWxlbWVudCggaSApLm11bCggZ2V0U2FtcGxlKCB7IHRoZXRhOiB0aGV0YS5tdWwoIC0gMS4wICksIGF4aXMsIG91dHB1dERpcmVjdGlvbiwgbWlwSW50LCBlbnZNYXAsIENVQkVVVl9URVhFTF9XSURUSCwgQ1VCRVVWX1RFWEVMX0hFSUdIVCwgQ1VCRVVWX01BWF9NSVAgfSApICkgKTtcclxuXHRcdGdsX0ZyYWdDb2xvci5hZGRBc3NpZ24oIHdlaWdodHMuZWxlbWVudCggaSApLm11bCggZ2V0U2FtcGxlKCB7IHRoZXRhLCBheGlzLCBvdXRwdXREaXJlY3Rpb24sIG1pcEludCwgZW52TWFwLCBDVUJFVVZfVEVYRUxfV0lEVEgsIENVQkVVVl9URVhFTF9IRUlHSFQsIENVQkVVVl9NQVhfTUlQIH0gKSApICk7XHJcblxyXG5cdH0gKTtcclxuXHJcblx0cmV0dXJuIHZlYzQoIGdsX0ZyYWdDb2xvciwgMSApO1xyXG5cclxufSApO1xyXG4iLCJpbXBvcnQgTm9kZU1hdGVyaWFsIGZyb20gJy4uLy4uLy4uL21hdGVyaWFscy9ub2Rlcy9Ob2RlTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyBnZXREaXJlY3Rpb24sIGJsdXIgfSBmcm9tICcuLi8uLi8uLi9ub2Rlcy9wbXJlbS9QTVJFTVV0aWxzLmpzJztcclxuaW1wb3J0IHsgZXF1aXJlY3RVViB9IGZyb20gJy4uLy4uLy4uL25vZGVzL3V0aWxzL0VxdWlyZWN0VVZOb2RlLmpzJztcclxuaW1wb3J0IHsgdW5pZm9ybSB9IGZyb20gJy4uLy4uLy4uL25vZGVzL2NvcmUvVW5pZm9ybU5vZGUuanMnO1xyXG5pbXBvcnQgeyB1bmlmb3JtQXJyYXkgfSBmcm9tICcuLi8uLi8uLi9ub2Rlcy9hY2Nlc3NvcnMvVW5pZm9ybUFycmF5Tm9kZS5qcyc7XHJcbmltcG9ydCB7IHRleHR1cmUgfSBmcm9tICcuLi8uLi8uLi9ub2Rlcy9hY2Nlc3NvcnMvVGV4dHVyZU5vZGUuanMnO1xyXG5pbXBvcnQgeyBjdWJlVGV4dHVyZSB9IGZyb20gJy4uLy4uLy4uL25vZGVzL2FjY2Vzc29ycy9DdWJlVGV4dHVyZU5vZGUuanMnO1xyXG5pbXBvcnQgeyBmbG9hdCwgdmVjMyB9IGZyb20gJy4uLy4uLy4uL25vZGVzL3RzbC9UU0xCYXNlLmpzJztcclxuaW1wb3J0IHsgdXYgfSBmcm9tICcuLi8uLi8uLi9ub2Rlcy9hY2Nlc3NvcnMvVVYuanMnO1xyXG5pbXBvcnQgeyBhdHRyaWJ1dGUgfSBmcm9tICcuLi8uLi8uLi9ub2Rlcy9jb3JlL0F0dHJpYnV0ZU5vZGUuanMnO1xyXG5cclxuaW1wb3J0IHsgT3J0aG9ncmFwaGljQ2FtZXJhIH0gZnJvbSAnLi4vLi4vLi4vY2FtZXJhcy9PcnRob2dyYXBoaWNDYW1lcmEuanMnO1xyXG5pbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uLy4uLy4uL21hdGgvQ29sb3IuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vLi4vLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi8uLi8uLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcclxuaW1wb3J0IHsgQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5pbXBvcnQgeyBSZW5kZXJUYXJnZXQgfSBmcm9tICcuLi8uLi8uLi9jb3JlL1JlbmRlclRhcmdldC5qcyc7XHJcbmltcG9ydCB7IE1lc2ggfSBmcm9tICcuLi8uLi8uLi9vYmplY3RzL01lc2guanMnO1xyXG5pbXBvcnQgeyBQZXJzcGVjdGl2ZUNhbWVyYSB9IGZyb20gJy4uLy4uLy4uL2NhbWVyYXMvUGVyc3BlY3RpdmVDYW1lcmEuanMnO1xyXG5pbXBvcnQgeyBNZXNoQmFzaWNNYXRlcmlhbCB9IGZyb20gJy4uLy4uLy4uL21hdGVyaWFscy9NZXNoQmFzaWNNYXRlcmlhbC5qcyc7XHJcbmltcG9ydCB7IEJveEdlb21ldHJ5IH0gZnJvbSAnLi4vLi4vLi4vZ2VvbWV0cmllcy9Cb3hHZW9tZXRyeS5qcyc7XHJcbmltcG9ydCB7XHJcblx0Q3ViZVJlZmxlY3Rpb25NYXBwaW5nLFxyXG5cdEN1YmVSZWZyYWN0aW9uTWFwcGluZyxcclxuXHRDdWJlVVZSZWZsZWN0aW9uTWFwcGluZyxcclxuXHRMaW5lYXJGaWx0ZXIsXHJcblx0Tm9CbGVuZGluZyxcclxuXHRSR0JBRm9ybWF0LFxyXG5cdEhhbGZGbG9hdFR5cGUsXHJcblx0QmFja1NpZGUsXHJcblx0TGluZWFyU1JHQkNvbG9yU3BhY2VcclxufSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMuanMnO1xyXG5cclxuY29uc3QgTE9EX01JTiA9IDQ7XHJcblxyXG4vLyBUaGUgc3RhbmRhcmQgZGV2aWF0aW9ucyAocmFkaWFucykgYXNzb2NpYXRlZCB3aXRoIHRoZSBleHRyYSBtaXBzLiBUaGVzZSBhcmVcclxuLy8gY2hvc2VuIHRvIGFwcHJveGltYXRlIGEgVHJvd2JyaWRnZS1SZWl0eiBkaXN0cmlidXRpb24gZnVuY3Rpb24gdGltZXMgdGhlXHJcbi8vIGdlb21ldHJpYyBzaGFkb3dpbmcgZnVuY3Rpb24uIFRoZXNlIHNpZ21hIHZhbHVlcyBzcXVhcmVkIG11c3QgbWF0Y2ggdGhlXHJcbi8vIHZhcmlhbmNlICNkZWZpbmVzIGluIGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudC5nbHNsLmpzLlxyXG5jb25zdCBFWFRSQV9MT0RfU0lHTUEgPSBbIDAuMTI1LCAwLjIxNSwgMC4zNSwgMC40NDYsIDAuNTI2LCAwLjU4MiBdO1xyXG5cclxuLy8gVGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBibHVyIGZvciBsb29wLiBTbWFsbGVyIHNpZ21hcyB3aWxsIHVzZSBmZXdlclxyXG4vLyBzYW1wbGVzIGFuZCBleGl0IGVhcmx5LCBidXQgbm90IHJlY29tcGlsZSB0aGUgc2hhZGVyLlxyXG5jb25zdCBNQVhfU0FNUExFUyA9IDIwO1xyXG5cclxuY29uc3QgX2ZsYXRDYW1lcmEgPSAvKkBfX1BVUkVfXyovIG5ldyBPcnRob2dyYXBoaWNDYW1lcmEoIC0gMSwgMSwgMSwgLSAxLCAwLCAxICk7XHJcbmNvbnN0IF9jdWJlQ2FtZXJhID0gLypAX19QVVJFX18qLyBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIDkwLCAxICk7XHJcbmNvbnN0IF9jbGVhckNvbG9yID0gLypAX19QVVJFX18qLyBuZXcgQ29sb3IoKTtcclxubGV0IF9vbGRUYXJnZXQgPSBudWxsO1xyXG5sZXQgX29sZEFjdGl2ZUN1YmVGYWNlID0gMDtcclxubGV0IF9vbGRBY3RpdmVNaXBtYXBMZXZlbCA9IDA7XHJcblxyXG4vLyBHb2xkZW4gUmF0aW9cclxuY29uc3QgUEhJID0gKCAxICsgTWF0aC5zcXJ0KCA1ICkgKSAvIDI7XHJcbmNvbnN0IElOVl9QSEkgPSAxIC8gUEhJO1xyXG5cclxuLy8gVmVydGljZXMgb2YgYSBkb2RlY2FoZWRyb24gKGV4Y2VwdCB0aGUgb3Bwb3NpdGVzLCB3aGljaCByZXByZXNlbnQgdGhlXHJcbi8vIHNhbWUgYXhpcyksIHVzZWQgYXMgYXhpcyBkaXJlY3Rpb25zIGV2ZW5seSBzcHJlYWQgb24gYSBzcGhlcmUuXHJcbmNvbnN0IF9heGlzRGlyZWN0aW9ucyA9IFtcclxuXHQvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCAtIFBISSwgSU5WX1BISSwgMCApLFxyXG5cdC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoIFBISSwgSU5WX1BISSwgMCApLFxyXG5cdC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoIC0gSU5WX1BISSwgMCwgUEhJICksXHJcblx0LypAX19QVVJFX18qLyBuZXcgVmVjdG9yMyggSU5WX1BISSwgMCwgUEhJICksXHJcblx0LypAX19QVVJFX18qLyBuZXcgVmVjdG9yMyggMCwgUEhJLCAtIElOVl9QSEkgKSxcclxuXHQvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCAwLCBQSEksIElOVl9QSEkgKSxcclxuXHQvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCAtIDEsIDEsIC0gMSApLFxyXG5cdC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoIDEsIDEsIC0gMSApLFxyXG5cdC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoIC0gMSwgMSwgMSApLFxyXG5cdC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoIDEsIDEsIDEgKVxyXG5dO1xyXG5cclxuY29uc3QgX29yaWdpbiA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuXHJcbi8vIG1hcHMgYmx1ciBtYXRlcmlhbHMgdG8gdGhlaXIgdW5pZm9ybXMgZGljdGlvbmFyeVxyXG5cclxuY29uc3QgX3VuaWZvcm1zTWFwID0gbmV3IFdlYWtNYXAoKTtcclxuXHJcbi8vIFdlYkdQVSBGYWNlIGluZGljZXNcclxuY29uc3QgX2ZhY2VMaWIgPSBbXHJcblx0MywgMSwgNSxcclxuXHQwLCA0LCAyXHJcbl07XHJcblxyXG5jb25zdCBfZGlyZWN0aW9uID0gLypAX19QVVJFX18qLyBnZXREaXJlY3Rpb24oIHV2KCksIGF0dHJpYnV0ZSggJ2ZhY2VJbmRleCcgKSApLm5vcm1hbGl6ZSgpO1xyXG5jb25zdCBfb3V0cHV0RGlyZWN0aW9uID0gLypAX19QVVJFX18qLyB2ZWMzKCBfZGlyZWN0aW9uLngsIF9kaXJlY3Rpb24ueSwgX2RpcmVjdGlvbi56ICk7XHJcblxyXG4vKipcclxuICogVGhpcyBjbGFzcyBnZW5lcmF0ZXMgYSBQcmVmaWx0ZXJlZCwgTWlwbWFwcGVkIFJhZGlhbmNlIEVudmlyb25tZW50IE1hcFxyXG4gKiAoUE1SRU0pIGZyb20gYSBjdWJlTWFwIGVudmlyb25tZW50IHRleHR1cmUuIFRoaXMgYWxsb3dzIGRpZmZlcmVudCBsZXZlbHMgb2ZcclxuICogYmx1ciB0byBiZSBxdWlja2x5IGFjY2Vzc2VkIGJhc2VkIG9uIG1hdGVyaWFsIHJvdWdobmVzcy4gSXQgaXMgcGFja2VkIGludG8gYVxyXG4gKiBzcGVjaWFsIEN1YmVVViBmb3JtYXQgdGhhdCBhbGxvd3MgdXMgdG8gcGVyZm9ybSBjdXN0b20gaW50ZXJwb2xhdGlvbiBzbyB0aGF0XHJcbiAqIHdlIGNhbiBzdXBwb3J0IG5vbmxpbmVhciBmb3JtYXRzIHN1Y2ggYXMgUkdCRS4gVW5saWtlIGEgdHJhZGl0aW9uYWwgbWlwbWFwXHJcbiAqIGNoYWluLCBpdCBvbmx5IGdvZXMgZG93biB0byB0aGUgTE9EX01JTiBsZXZlbCAoYWJvdmUpLCBhbmQgdGhlbiBjcmVhdGVzIGV4dHJhXHJcbiAqIGV2ZW4gbW9yZSBmaWx0ZXJlZCAnbWlwcycgYXQgdGhlIHNhbWUgTE9EX01JTiByZXNvbHV0aW9uLCBhc3NvY2lhdGVkIHdpdGhcclxuICogaGlnaGVyIHJvdWdobmVzcyBsZXZlbHMuIEluIHRoaXMgd2F5IHdlIG1haW50YWluIHJlc29sdXRpb24gdG8gc21vb3RobHlcclxuICogaW50ZXJwb2xhdGUgZGlmZnVzZSBsaWdodGluZyB3aGlsZSBsaW1pdGluZyBzYW1wbGluZyBjb21wdXRhdGlvbi5cclxuICpcclxuICogUGFwZXI6IEZhc3QsIEFjY3VyYXRlIEltYWdlLUJhc2VkIExpZ2h0aW5nOlxyXG4gKiB7QGxpbmsgaHR0cHM6Ly9kcml2ZS5nb29nbGUuY29tL2ZpbGUvZC8xNXk4cl9VcEtsVTlTdlY0SUxiMEMzcUNQZWNTOHB2THovdmlld31cclxuKi9cclxuY2xhc3MgUE1SRU1HZW5lcmF0b3Ige1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IFBNUkVNIGdlbmVyYXRvci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCByZW5kZXJlciApIHtcclxuXHJcblx0XHR0aGlzLl9yZW5kZXJlciA9IHJlbmRlcmVyO1xyXG5cdFx0dGhpcy5fcGluZ1BvbmdSZW5kZXJUYXJnZXQgPSBudWxsO1xyXG5cclxuXHRcdHRoaXMuX2xvZE1heCA9IDA7XHJcblx0XHR0aGlzLl9jdWJlU2l6ZSA9IDA7XHJcblx0XHR0aGlzLl9sb2RQbGFuZXMgPSBbXTtcclxuXHRcdHRoaXMuX3NpemVMb2RzID0gW107XHJcblx0XHR0aGlzLl9zaWdtYXMgPSBbXTtcclxuXHRcdHRoaXMuX2xvZE1lc2hlcyA9IFtdO1xyXG5cclxuXHRcdHRoaXMuX2JsdXJNYXRlcmlhbCA9IG51bGw7XHJcblx0XHR0aGlzLl9jdWJlbWFwTWF0ZXJpYWwgPSBudWxsO1xyXG5cdFx0dGhpcy5fZXF1aXJlY3RNYXRlcmlhbCA9IG51bGw7XHJcblx0XHR0aGlzLl9iYWNrZ3JvdW5kQm94ID0gbnVsbDtcclxuXHJcblx0fVxyXG5cclxuXHRnZXQgX2hhc0luaXRpYWxpemVkKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9yZW5kZXJlci5oYXNJbml0aWFsaXplZCgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyBhIFBNUkVNIGZyb20gYSBzdXBwbGllZCBTY2VuZSwgd2hpY2ggY2FuIGJlIGZhc3RlciB0aGFuIHVzaW5nIGFuXHJcblx0ICogaW1hZ2UgaWYgbmV0d29ya2luZyBiYW5kd2lkdGggaXMgbG93LiBPcHRpb25hbCBzaWdtYSBzcGVjaWZpZXMgYSBibHVyIHJhZGl1c1xyXG5cdCAqIGluIHJhZGlhbnMgdG8gYmUgYXBwbGllZCB0byB0aGUgc2NlbmUgYmVmb3JlIFBNUkVNIGdlbmVyYXRpb24uIE9wdGlvbmFsIG5lYXJcclxuXHQgKiBhbmQgZmFyIHBsYW5lcyBlbnN1cmUgdGhlIHNjZW5lIGlzIHJlbmRlcmVkIGluIGl0cyBlbnRpcmV0eS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7U2NlbmV9IHNjZW5lIC0gVGhlIHNjZW5lIHRvIGJlIGNhcHR1cmVkLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbc2lnbWE9MF0gLSBUaGUgYmx1ciByYWRpdXMgaW4gcmFkaWFucy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW25lYXI9MC4xXSAtIFRoZSBuZWFyIHBsYW5lIGRpc3RhbmNlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZmFyPTEwMF0gLSBUaGUgZmFyIHBsYW5lIGRpc3RhbmNlLlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gLSBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5zaXplPTI1Nl0gLSBUaGUgdGV4dHVyZSBzaXplIG9mIHRoZSBQTVJFTS5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IFtvcHRpb25zLnJlbmRlclRhcmdldD1vcmlnaW5dIC0gVGhlIHBvc2l0aW9uIG9mIHRoZSBpbnRlcm5hbCBjdWJlIGNhbWVyYSB0aGF0IHJlbmRlcnMgdGhlIHNjZW5lLlxyXG5cdCAqIEBwYXJhbSB7P1JlbmRlclRhcmdldH0gW29wdGlvbnMucmVuZGVyVGFyZ2V0PW51bGxdIC0gVGhlIHJlbmRlciB0YXJnZXQgdG8gdXNlLlxyXG5cdCAqIEByZXR1cm4ge1JlbmRlclRhcmdldH0gVGhlIHJlc3VsdGluZyBQTVJFTS5cclxuXHQgKiBAc2VlIHtAbGluayBQTVJFTUdlbmVyYXRvciNmcm9tU2NlbmVBc3luY31cclxuXHQgKi9cclxuXHRmcm9tU2NlbmUoIHNjZW5lLCBzaWdtYSA9IDAsIG5lYXIgPSAwLjEsIGZhciA9IDEwMCwgb3B0aW9ucyA9IHt9ICkge1xyXG5cclxuXHRcdGNvbnN0IHtcclxuXHRcdFx0c2l6ZSA9IDI1NixcclxuXHRcdFx0cG9zaXRpb24gPSBfb3JpZ2luLFxyXG5cdFx0XHRyZW5kZXJUYXJnZXQgPSBudWxsLFxyXG5cdFx0fSA9IG9wdGlvbnM7XHJcblxyXG5cdFx0dGhpcy5fc2V0U2l6ZSggc2l6ZSApO1xyXG5cclxuXHRcdGlmICggdGhpcy5faGFzSW5pdGlhbGl6ZWQgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUE1SRU1HZW5lcmF0b3I6IC5mcm9tU2NlbmUoKSBjYWxsZWQgYmVmb3JlIHRoZSBiYWNrZW5kIGlzIGluaXRpYWxpemVkLiBUcnkgdXNpbmcgLmZyb21TY2VuZUFzeW5jKCkgaW5zdGVhZC4nICk7XHJcblxyXG5cdFx0XHRjb25zdCBjdWJlVVZSZW5kZXJUYXJnZXQgPSByZW5kZXJUYXJnZXQgfHwgdGhpcy5fYWxsb2NhdGVUYXJnZXRzKCk7XHJcblxyXG5cdFx0XHRvcHRpb25zLnJlbmRlclRhcmdldCA9IGN1YmVVVlJlbmRlclRhcmdldDtcclxuXHJcblx0XHRcdHRoaXMuZnJvbVNjZW5lQXN5bmMoIHNjZW5lLCBzaWdtYSwgbmVhciwgZmFyLCBvcHRpb25zICk7XHJcblxyXG5cdFx0XHRyZXR1cm4gY3ViZVVWUmVuZGVyVGFyZ2V0O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRfb2xkVGFyZ2V0ID0gdGhpcy5fcmVuZGVyZXIuZ2V0UmVuZGVyVGFyZ2V0KCk7XHJcblx0XHRfb2xkQWN0aXZlQ3ViZUZhY2UgPSB0aGlzLl9yZW5kZXJlci5nZXRBY3RpdmVDdWJlRmFjZSgpO1xyXG5cdFx0X29sZEFjdGl2ZU1pcG1hcExldmVsID0gdGhpcy5fcmVuZGVyZXIuZ2V0QWN0aXZlTWlwbWFwTGV2ZWwoKTtcclxuXHJcblx0XHRjb25zdCBjdWJlVVZSZW5kZXJUYXJnZXQgPSByZW5kZXJUYXJnZXQgfHwgdGhpcy5fYWxsb2NhdGVUYXJnZXRzKCk7XHJcblx0XHRjdWJlVVZSZW5kZXJUYXJnZXQuZGVwdGhCdWZmZXIgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMuX3NjZW5lVG9DdWJlVVYoIHNjZW5lLCBuZWFyLCBmYXIsIGN1YmVVVlJlbmRlclRhcmdldCwgcG9zaXRpb24gKTtcclxuXHJcblx0XHRpZiAoIHNpZ21hID4gMCApIHtcclxuXHJcblx0XHRcdHRoaXMuX2JsdXIoIGN1YmVVVlJlbmRlclRhcmdldCwgMCwgMCwgc2lnbWEgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5fYXBwbHlQTVJFTSggY3ViZVVWUmVuZGVyVGFyZ2V0ICk7XHJcblxyXG5cdFx0dGhpcy5fY2xlYW51cCggY3ViZVVWUmVuZGVyVGFyZ2V0ICk7XHJcblxyXG5cdFx0cmV0dXJuIGN1YmVVVlJlbmRlclRhcmdldDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZW5lcmF0ZXMgYSBQTVJFTSBmcm9tIGEgc3VwcGxpZWQgU2NlbmUsIHdoaWNoIGNhbiBiZSBmYXN0ZXIgdGhhbiB1c2luZyBhblxyXG5cdCAqIGltYWdlIGlmIG5ldHdvcmtpbmcgYmFuZHdpZHRoIGlzIGxvdy4gT3B0aW9uYWwgc2lnbWEgc3BlY2lmaWVzIGEgYmx1ciByYWRpdXNcclxuXHQgKiBpbiByYWRpYW5zIHRvIGJlIGFwcGxpZWQgdG8gdGhlIHNjZW5lIGJlZm9yZSBQTVJFTSBnZW5lcmF0aW9uLiBPcHRpb25hbCBuZWFyXHJcblx0ICogYW5kIGZhciBwbGFuZXMgZW5zdXJlIHRoZSBzY2VuZSBpcyByZW5kZXJlZCBpbiBpdHMgZW50aXJldHkgKHRoZSBjdWJlQ2FtZXJhXHJcblx0ICogaXMgcGxhY2VkIGF0IHRoZSBvcmlnaW4pLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTY2VuZX0gc2NlbmUgLSBUaGUgc2NlbmUgdG8gYmUgY2FwdHVyZWQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtzaWdtYT0wXSAtIFRoZSBibHVyIHJhZGl1cyBpbiByYWRpYW5zLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbmVhcj0wLjFdIC0gVGhlIG5lYXIgcGxhbmUgZGlzdGFuY2UuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtmYXI9MTAwXSAtIFRoZSBmYXIgcGxhbmUgZGlzdGFuY2UuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSAtIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLnNpemU9MjU2XSAtIFRoZSB0ZXh0dXJlIHNpemUgb2YgdGhlIFBNUkVNLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gW29wdGlvbnMucG9zaXRpb249b3JpZ2luXSAtIFRoZSBwb3NpdGlvbiBvZiB0aGUgaW50ZXJuYWwgY3ViZSBjYW1lcmEgdGhhdCByZW5kZXJzIHRoZSBzY2VuZS5cclxuXHQgKiBAcGFyYW0gez9SZW5kZXJUYXJnZXR9IFtvcHRpb25zLnJlbmRlclRhcmdldD1udWxsXSAtIFRoZSByZW5kZXIgdGFyZ2V0IHRvIHVzZS5cclxuXHQgKiBAcmV0dXJuIHtQcm9taXNlPFJlbmRlclRhcmdldD59IEEgUHJvbWlzZSB0aGF0IHJlc29sdmUgd2l0aCB0aGUgUE1SRU0gd2hlbiB0aGUgZ2VuZXJhdGlvbiBoYXMgYmVlbiBmaW5pc2hlZC5cclxuXHQgKiBAc2VlIHtAbGluayBQTVJFTUdlbmVyYXRvciNmcm9tU2NlbmV9XHJcblx0ICovXHJcblx0YXN5bmMgZnJvbVNjZW5lQXN5bmMoIHNjZW5lLCBzaWdtYSA9IDAsIG5lYXIgPSAwLjEsIGZhciA9IDEwMCwgb3B0aW9ucyA9IHt9ICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5faGFzSW5pdGlhbGl6ZWQgPT09IGZhbHNlICkgYXdhaXQgdGhpcy5fcmVuZGVyZXIuaW5pdCgpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmZyb21TY2VuZSggc2NlbmUsIHNpZ21hLCBuZWFyLCBmYXIsIG9wdGlvbnMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZW5lcmF0ZXMgYSBQTVJFTSBmcm9tIGFuIGVxdWlyZWN0YW5ndWxhciB0ZXh0dXJlLCB3aGljaCBjYW4gYmUgZWl0aGVyIExEUlxyXG5cdCAqIG9yIEhEUi4gVGhlIGlkZWFsIGlucHV0IGltYWdlIHNpemUgaXMgMWsgKDEwMjQgeCA1MTIpLFxyXG5cdCAqIGFzIHRoaXMgbWF0Y2hlcyBiZXN0IHdpdGggdGhlIDI1NiB4IDI1NiBjdWJlbWFwIG91dHB1dC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gZXF1aXJlY3Rhbmd1bGFyIC0gVGhlIGVxdWlyZWN0YW5ndWxhciB0ZXh0dXJlIHRvIGJlIGNvbnZlcnRlZC5cclxuXHQgKiBAcGFyYW0gez9SZW5kZXJUYXJnZXR9IFtyZW5kZXJUYXJnZXQ9bnVsbF0gLSBUaGUgcmVuZGVyIHRhcmdldCB0byB1c2UuXHJcblx0ICogQHJldHVybiB7UmVuZGVyVGFyZ2V0fSBUaGUgcmVzdWx0aW5nIFBNUkVNLlxyXG5cdCAqIEBzZWUge0BsaW5rIFBNUkVNR2VuZXJhdG9yI2Zyb21FcXVpcmVjdGFuZ3VsYXJBc3luY31cclxuXHQgKi9cclxuXHRmcm9tRXF1aXJlY3Rhbmd1bGFyKCBlcXVpcmVjdGFuZ3VsYXIsIHJlbmRlclRhcmdldCA9IG51bGwgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9oYXNJbml0aWFsaXplZCA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5QTVJFTUdlbmVyYXRvcjogLmZyb21FcXVpcmVjdGFuZ3VsYXIoKSBjYWxsZWQgYmVmb3JlIHRoZSBiYWNrZW5kIGlzIGluaXRpYWxpemVkLiBUcnkgdXNpbmcgLmZyb21FcXVpcmVjdGFuZ3VsYXJBc3luYygpIGluc3RlYWQuJyApO1xyXG5cclxuXHRcdFx0dGhpcy5fc2V0U2l6ZUZyb21UZXh0dXJlKCBlcXVpcmVjdGFuZ3VsYXIgKTtcclxuXHJcblx0XHRcdGNvbnN0IGN1YmVVVlJlbmRlclRhcmdldCA9IHJlbmRlclRhcmdldCB8fCB0aGlzLl9hbGxvY2F0ZVRhcmdldHMoKTtcclxuXHJcblx0XHRcdHRoaXMuZnJvbUVxdWlyZWN0YW5ndWxhckFzeW5jKCBlcXVpcmVjdGFuZ3VsYXIsIGN1YmVVVlJlbmRlclRhcmdldCApO1xyXG5cclxuXHRcdFx0cmV0dXJuIGN1YmVVVlJlbmRlclRhcmdldDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX2Zyb21UZXh0dXJlKCBlcXVpcmVjdGFuZ3VsYXIsIHJlbmRlclRhcmdldCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyBhIFBNUkVNIGZyb20gYW4gZXF1aXJlY3Rhbmd1bGFyIHRleHR1cmUsIHdoaWNoIGNhbiBiZSBlaXRoZXIgTERSXHJcblx0ICogb3IgSERSLiBUaGUgaWRlYWwgaW5wdXQgaW1hZ2Ugc2l6ZSBpcyAxayAoMTAyNCB4IDUxMiksXHJcblx0ICogYXMgdGhpcyBtYXRjaGVzIGJlc3Qgd2l0aCB0aGUgMjU2IHggMjU2IGN1YmVtYXAgb3V0cHV0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSBlcXVpcmVjdGFuZ3VsYXIgLSBUaGUgZXF1aXJlY3Rhbmd1bGFyIHRleHR1cmUgdG8gYmUgY29udmVydGVkLlxyXG5cdCAqIEBwYXJhbSB7P1JlbmRlclRhcmdldH0gW3JlbmRlclRhcmdldD1udWxsXSAtIFRoZSByZW5kZXIgdGFyZ2V0IHRvIHVzZS5cclxuXHQgKiBAcmV0dXJuIHtQcm9taXNlPFJlbmRlclRhcmdldD59IFRoZSByZXN1bHRpbmcgUE1SRU0uXHJcblx0ICogQHNlZSB7QGxpbmsgUE1SRU1HZW5lcmF0b3IjZnJvbUVxdWlyZWN0YW5ndWxhcn1cclxuXHQgKi9cclxuXHRhc3luYyBmcm9tRXF1aXJlY3Rhbmd1bGFyQXN5bmMoIGVxdWlyZWN0YW5ndWxhciwgcmVuZGVyVGFyZ2V0ID0gbnVsbCApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuX2hhc0luaXRpYWxpemVkID09PSBmYWxzZSApIGF3YWl0IHRoaXMuX3JlbmRlcmVyLmluaXQoKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fZnJvbVRleHR1cmUoIGVxdWlyZWN0YW5ndWxhciwgcmVuZGVyVGFyZ2V0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2VuZXJhdGVzIGEgUE1SRU0gZnJvbSBhbiBjdWJlbWFwIHRleHR1cmUsIHdoaWNoIGNhbiBiZSBlaXRoZXIgTERSXHJcblx0ICogb3IgSERSLiBUaGUgaWRlYWwgaW5wdXQgY3ViZSBzaXplIGlzIDI1NiB4IDI1NixcclxuXHQgKiBhcyB0aGlzIG1hdGNoZXMgYmVzdCB3aXRoIHRoZSAyNTYgeCAyNTYgY3ViZW1hcCBvdXRwdXQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IGN1YmVtYXAgLSBUaGUgY3ViZW1hcCB0ZXh0dXJlIHRvIGJlIGNvbnZlcnRlZC5cclxuXHQgKiBAcGFyYW0gez9SZW5kZXJUYXJnZXR9IFtyZW5kZXJUYXJnZXQ9bnVsbF0gLSBUaGUgcmVuZGVyIHRhcmdldCB0byB1c2UuXHJcblx0ICogQHJldHVybiB7UmVuZGVyVGFyZ2V0fSBUaGUgcmVzdWx0aW5nIFBNUkVNLlxyXG5cdCAqIEBzZWUge0BsaW5rIFBNUkVNR2VuZXJhdG9yI2Zyb21DdWJlbWFwQXN5bmN9XHJcblx0ICovXHJcblx0ZnJvbUN1YmVtYXAoIGN1YmVtYXAsIHJlbmRlclRhcmdldCA9IG51bGwgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9oYXNJbml0aWFsaXplZCA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5QTVJFTUdlbmVyYXRvcjogLmZyb21DdWJlbWFwKCkgY2FsbGVkIGJlZm9yZSB0aGUgYmFja2VuZCBpcyBpbml0aWFsaXplZC4gVHJ5IHVzaW5nIC5mcm9tQ3ViZW1hcEFzeW5jKCkgaW5zdGVhZC4nICk7XHJcblxyXG5cdFx0XHR0aGlzLl9zZXRTaXplRnJvbVRleHR1cmUoIGN1YmVtYXAgKTtcclxuXHJcblx0XHRcdGNvbnN0IGN1YmVVVlJlbmRlclRhcmdldCA9IHJlbmRlclRhcmdldCB8fCB0aGlzLl9hbGxvY2F0ZVRhcmdldHMoKTtcclxuXHJcblx0XHRcdHRoaXMuZnJvbUN1YmVtYXBBc3luYyggY3ViZW1hcCwgcmVuZGVyVGFyZ2V0ICk7XHJcblxyXG5cdFx0XHRyZXR1cm4gY3ViZVVWUmVuZGVyVGFyZ2V0O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fZnJvbVRleHR1cmUoIGN1YmVtYXAsIHJlbmRlclRhcmdldCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyBhIFBNUkVNIGZyb20gYW4gY3ViZW1hcCB0ZXh0dXJlLCB3aGljaCBjYW4gYmUgZWl0aGVyIExEUlxyXG5cdCAqIG9yIEhEUi4gVGhlIGlkZWFsIGlucHV0IGN1YmUgc2l6ZSBpcyAyNTYgeCAyNTYsXHJcblx0ICogd2l0aCB0aGUgMjU2IHggMjU2IGN1YmVtYXAgb3V0cHV0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSBjdWJlbWFwIC0gVGhlIGN1YmVtYXAgdGV4dHVyZSB0byBiZSBjb252ZXJ0ZWQuXHJcblx0ICogQHBhcmFtIHs/UmVuZGVyVGFyZ2V0fSBbcmVuZGVyVGFyZ2V0PW51bGxdIC0gVGhlIHJlbmRlciB0YXJnZXQgdG8gdXNlLlxyXG5cdCAqIEByZXR1cm4ge1Byb21pc2U8UmVuZGVyVGFyZ2V0Pn0gVGhlIHJlc3VsdGluZyBQTVJFTS5cclxuXHQgKiBAc2VlIHtAbGluayBQTVJFTUdlbmVyYXRvciNmcm9tQ3ViZW1hcH1cclxuXHQgKi9cclxuXHRhc3luYyBmcm9tQ3ViZW1hcEFzeW5jKCBjdWJlbWFwLCByZW5kZXJUYXJnZXQgPSBudWxsICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5faGFzSW5pdGlhbGl6ZWQgPT09IGZhbHNlICkgYXdhaXQgdGhpcy5fcmVuZGVyZXIuaW5pdCgpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9mcm9tVGV4dHVyZSggY3ViZW1hcCwgcmVuZGVyVGFyZ2V0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUHJlLWNvbXBpbGVzIHRoZSBjdWJlbWFwIHNoYWRlci4gWW91IGNhbiBnZXQgZmFzdGVyIHN0YXJ0LXVwIGJ5IGludm9raW5nIHRoaXMgbWV0aG9kIGR1cmluZ1xyXG5cdCAqIHlvdXIgdGV4dHVyZSdzIG5ldHdvcmsgZmV0Y2ggZm9yIGluY3JlYXNlZCBjb25jdXJyZW5jeS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfVxyXG5cdCAqL1xyXG5cdGFzeW5jIGNvbXBpbGVDdWJlbWFwU2hhZGVyKCkge1xyXG5cclxuXHRcdGlmICggdGhpcy5fY3ViZW1hcE1hdGVyaWFsID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5fY3ViZW1hcE1hdGVyaWFsID0gX2dldEN1YmVtYXBNYXRlcmlhbCgpO1xyXG5cdFx0XHRhd2FpdCB0aGlzLl9jb21waWxlTWF0ZXJpYWwoIHRoaXMuX2N1YmVtYXBNYXRlcmlhbCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQcmUtY29tcGlsZXMgdGhlIGVxdWlyZWN0YW5ndWxhciBzaGFkZXIuIFlvdSBjYW4gZ2V0IGZhc3RlciBzdGFydC11cCBieSBpbnZva2luZyB0aGlzIG1ldGhvZCBkdXJpbmdcclxuXHQgKiB5b3VyIHRleHR1cmUncyBuZXR3b3JrIGZldGNoIGZvciBpbmNyZWFzZWQgY29uY3VycmVuY3kuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX1cclxuXHQgKi9cclxuXHRhc3luYyBjb21waWxlRXF1aXJlY3Rhbmd1bGFyU2hhZGVyKCkge1xyXG5cclxuXHRcdGlmICggdGhpcy5fZXF1aXJlY3RNYXRlcmlhbCA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuX2VxdWlyZWN0TWF0ZXJpYWwgPSBfZ2V0RXF1aXJlY3RNYXRlcmlhbCgpO1xyXG5cdFx0XHRhd2FpdCB0aGlzLl9jb21waWxlTWF0ZXJpYWwoIHRoaXMuX2VxdWlyZWN0TWF0ZXJpYWwgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGlzcG9zZXMgb2YgdGhlIFBNUkVNR2VuZXJhdG9yJ3MgaW50ZXJuYWwgbWVtb3J5LiBOb3RlIHRoYXQgUE1SRU1HZW5lcmF0b3IgaXMgYSBzdGF0aWMgY2xhc3MsXHJcblx0ICogc28geW91IHNob3VsZCBub3QgbmVlZCBtb3JlIHRoYW4gb25lIFBNUkVNR2VuZXJhdG9yIG9iamVjdC4gSWYgeW91IGRvLCBjYWxsaW5nIGRpc3Bvc2UoKSBvblxyXG5cdCAqIG9uZSBvZiB0aGVtIHdpbGwgY2F1c2UgYW55IG90aGVycyB0byBhbHNvIGJlY29tZSB1bnVzYWJsZS5cclxuXHQgKi9cclxuXHRkaXNwb3NlKCkge1xyXG5cclxuXHRcdHRoaXMuX2Rpc3Bvc2UoKTtcclxuXHJcblx0XHRpZiAoIHRoaXMuX2N1YmVtYXBNYXRlcmlhbCAhPT0gbnVsbCApIHRoaXMuX2N1YmVtYXBNYXRlcmlhbC5kaXNwb3NlKCk7XHJcblx0XHRpZiAoIHRoaXMuX2VxdWlyZWN0TWF0ZXJpYWwgIT09IG51bGwgKSB0aGlzLl9lcXVpcmVjdE1hdGVyaWFsLmRpc3Bvc2UoKTtcclxuXHRcdGlmICggdGhpcy5fYmFja2dyb3VuZEJveCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuX2JhY2tncm91bmRCb3guZ2VvbWV0cnkuZGlzcG9zZSgpO1xyXG5cdFx0XHR0aGlzLl9iYWNrZ3JvdW5kQm94Lm1hdGVyaWFsLmRpc3Bvc2UoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gcHJpdmF0ZSBpbnRlcmZhY2VcclxuXHJcblx0X3NldFNpemVGcm9tVGV4dHVyZSggdGV4dHVyZSApIHtcclxuXHJcblx0XHRpZiAoIHRleHR1cmUubWFwcGluZyA9PT0gQ3ViZVJlZmxlY3Rpb25NYXBwaW5nIHx8IHRleHR1cmUubWFwcGluZyA9PT0gQ3ViZVJlZnJhY3Rpb25NYXBwaW5nICkge1xyXG5cclxuXHRcdFx0dGhpcy5fc2V0U2l6ZSggdGV4dHVyZS5pbWFnZS5sZW5ndGggPT09IDAgPyAxNiA6ICggdGV4dHVyZS5pbWFnZVsgMCBdLndpZHRoIHx8IHRleHR1cmUuaW1hZ2VbIDAgXS5pbWFnZS53aWR0aCApICk7XHJcblxyXG5cdFx0fSBlbHNlIHsgLy8gRXF1aXJlY3Rhbmd1bGFyXHJcblxyXG5cdFx0XHR0aGlzLl9zZXRTaXplKCB0ZXh0dXJlLmltYWdlLndpZHRoIC8gNCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRfc2V0U2l6ZSggY3ViZVNpemUgKSB7XHJcblxyXG5cdFx0dGhpcy5fbG9kTWF4ID0gTWF0aC5mbG9vciggTWF0aC5sb2cyKCBjdWJlU2l6ZSApICk7XHJcblx0XHR0aGlzLl9jdWJlU2l6ZSA9IE1hdGgucG93KCAyLCB0aGlzLl9sb2RNYXggKTtcclxuXHJcblx0fVxyXG5cclxuXHRfZGlzcG9zZSgpIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuX2JsdXJNYXRlcmlhbCAhPT0gbnVsbCApIHRoaXMuX2JsdXJNYXRlcmlhbC5kaXNwb3NlKCk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9waW5nUG9uZ1JlbmRlclRhcmdldCAhPT0gbnVsbCApIHRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0LmRpc3Bvc2UoKTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB0aGlzLl9sb2RQbGFuZXMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0dGhpcy5fbG9kUGxhbmVzWyBpIF0uZGlzcG9zZSgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRfY2xlYW51cCggb3V0cHV0VGFyZ2V0ICkge1xyXG5cclxuXHRcdHRoaXMuX3JlbmRlcmVyLnNldFJlbmRlclRhcmdldCggX29sZFRhcmdldCwgX29sZEFjdGl2ZUN1YmVGYWNlLCBfb2xkQWN0aXZlTWlwbWFwTGV2ZWwgKTtcclxuXHRcdG91dHB1dFRhcmdldC5zY2lzc29yVGVzdCA9IGZhbHNlO1xyXG5cdFx0X3NldFZpZXdwb3J0KCBvdXRwdXRUYXJnZXQsIDAsIDAsIG91dHB1dFRhcmdldC53aWR0aCwgb3V0cHV0VGFyZ2V0LmhlaWdodCApO1xyXG5cclxuXHR9XHJcblxyXG5cdF9mcm9tVGV4dHVyZSggdGV4dHVyZSwgcmVuZGVyVGFyZ2V0ICkge1xyXG5cclxuXHRcdHRoaXMuX3NldFNpemVGcm9tVGV4dHVyZSggdGV4dHVyZSApO1xyXG5cclxuXHRcdF9vbGRUYXJnZXQgPSB0aGlzLl9yZW5kZXJlci5nZXRSZW5kZXJUYXJnZXQoKTtcclxuXHRcdF9vbGRBY3RpdmVDdWJlRmFjZSA9IHRoaXMuX3JlbmRlcmVyLmdldEFjdGl2ZUN1YmVGYWNlKCk7XHJcblx0XHRfb2xkQWN0aXZlTWlwbWFwTGV2ZWwgPSB0aGlzLl9yZW5kZXJlci5nZXRBY3RpdmVNaXBtYXBMZXZlbCgpO1xyXG5cclxuXHRcdGNvbnN0IGN1YmVVVlJlbmRlclRhcmdldCA9IHJlbmRlclRhcmdldCB8fCB0aGlzLl9hbGxvY2F0ZVRhcmdldHMoKTtcclxuXHRcdHRoaXMuX3RleHR1cmVUb0N1YmVVViggdGV4dHVyZSwgY3ViZVVWUmVuZGVyVGFyZ2V0ICk7XHJcblx0XHR0aGlzLl9hcHBseVBNUkVNKCBjdWJlVVZSZW5kZXJUYXJnZXQgKTtcclxuXHRcdHRoaXMuX2NsZWFudXAoIGN1YmVVVlJlbmRlclRhcmdldCApO1xyXG5cclxuXHRcdHJldHVybiBjdWJlVVZSZW5kZXJUYXJnZXQ7XHJcblxyXG5cdH1cclxuXHJcblx0X2FsbG9jYXRlVGFyZ2V0cygpIHtcclxuXHJcblx0XHRjb25zdCB3aWR0aCA9IDMgKiBNYXRoLm1heCggdGhpcy5fY3ViZVNpemUsIDE2ICogNyApO1xyXG5cdFx0Y29uc3QgaGVpZ2h0ID0gNCAqIHRoaXMuX2N1YmVTaXplO1xyXG5cclxuXHRcdGNvbnN0IHBhcmFtcyA9IHtcclxuXHRcdFx0bWFnRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXHJcblx0XHRcdG1pbkZpbHRlcjogTGluZWFyRmlsdGVyLFxyXG5cdFx0XHRnZW5lcmF0ZU1pcG1hcHM6IGZhbHNlLFxyXG5cdFx0XHR0eXBlOiBIYWxmRmxvYXRUeXBlLFxyXG5cdFx0XHRmb3JtYXQ6IFJHQkFGb3JtYXQsXHJcblx0XHRcdGNvbG9yU3BhY2U6IExpbmVhclNSR0JDb2xvclNwYWNlLFxyXG5cdFx0XHQvL2RlcHRoQnVmZmVyOiBmYWxzZVxyXG5cdFx0fTtcclxuXHJcblx0XHRjb25zdCBjdWJlVVZSZW5kZXJUYXJnZXQgPSBfY3JlYXRlUmVuZGVyVGFyZ2V0KCB3aWR0aCwgaGVpZ2h0LCBwYXJhbXMgKTtcclxuXHJcblx0XHRpZiAoIHRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0ID09PSBudWxsIHx8IHRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0LndpZHRoICE9PSB3aWR0aCB8fCB0aGlzLl9waW5nUG9uZ1JlbmRlclRhcmdldC5oZWlnaHQgIT09IGhlaWdodCApIHtcclxuXHJcblx0XHRcdGlmICggdGhpcy5fcGluZ1BvbmdSZW5kZXJUYXJnZXQgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdHRoaXMuX2Rpc3Bvc2UoKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0ID0gX2NyZWF0ZVJlbmRlclRhcmdldCggd2lkdGgsIGhlaWdodCwgcGFyYW1zICk7XHJcblxyXG5cdFx0XHRjb25zdCB7IF9sb2RNYXggfSA9IHRoaXM7XHJcblx0XHRcdCggeyBzaXplTG9kczogdGhpcy5fc2l6ZUxvZHMsIGxvZFBsYW5lczogdGhpcy5fbG9kUGxhbmVzLCBzaWdtYXM6IHRoaXMuX3NpZ21hcywgbG9kTWVzaGVzOiB0aGlzLl9sb2RNZXNoZXMgfSA9IF9jcmVhdGVQbGFuZXMoIF9sb2RNYXggKSApO1xyXG5cclxuXHRcdFx0dGhpcy5fYmx1ck1hdGVyaWFsID0gX2dldEJsdXJTaGFkZXIoIF9sb2RNYXgsIHdpZHRoLCBoZWlnaHQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGN1YmVVVlJlbmRlclRhcmdldDtcclxuXHJcblx0fVxyXG5cclxuXHRhc3luYyBfY29tcGlsZU1hdGVyaWFsKCBtYXRlcmlhbCApIHtcclxuXHJcblx0XHRjb25zdCB0bXBNZXNoID0gbmV3IE1lc2goIHRoaXMuX2xvZFBsYW5lc1sgMCBdLCBtYXRlcmlhbCApO1xyXG5cdFx0YXdhaXQgdGhpcy5fcmVuZGVyZXIuY29tcGlsZSggdG1wTWVzaCwgX2ZsYXRDYW1lcmEgKTtcclxuXHJcblx0fVxyXG5cclxuXHRfc2NlbmVUb0N1YmVVViggc2NlbmUsIG5lYXIsIGZhciwgY3ViZVVWUmVuZGVyVGFyZ2V0LCBwb3NpdGlvbiApIHtcclxuXHJcblx0XHRjb25zdCBjdWJlQ2FtZXJhID0gX2N1YmVDYW1lcmE7XHJcblx0XHRjdWJlQ2FtZXJhLm5lYXIgPSBuZWFyO1xyXG5cdFx0Y3ViZUNhbWVyYS5mYXIgPSBmYXI7XHJcblxyXG5cdFx0Ly8gcHgsIHB5LCBweiwgbngsIG55LCBuelxyXG5cdFx0Y29uc3QgdXBTaWduID0gWyAxLCAxLCAxLCAxLCAtIDEsIDEgXTtcclxuXHRcdGNvbnN0IGZvcndhcmRTaWduID0gWyAxLCAtIDEsIDEsIC0gMSwgMSwgLSAxIF07XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyZXIgPSB0aGlzLl9yZW5kZXJlcjtcclxuXHJcblx0XHRjb25zdCBvcmlnaW5hbEF1dG9DbGVhciA9IHJlbmRlcmVyLmF1dG9DbGVhcjtcclxuXHJcblx0XHRyZW5kZXJlci5nZXRDbGVhckNvbG9yKCBfY2xlYXJDb2xvciApO1xyXG5cclxuXHRcdHJlbmRlcmVyLmF1dG9DbGVhciA9IGZhbHNlO1xyXG5cclxuXHRcdGxldCBiYWNrZ3JvdW5kQm94ID0gdGhpcy5fYmFja2dyb3VuZEJveDtcclxuXHJcblx0XHRpZiAoIGJhY2tncm91bmRCb3ggPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBiYWNrZ3JvdW5kTWF0ZXJpYWwgPSBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoIHtcclxuXHRcdFx0XHRuYW1lOiAnUE1SRU0uQmFja2dyb3VuZCcsXHJcblx0XHRcdFx0c2lkZTogQmFja1NpZGUsXHJcblx0XHRcdFx0ZGVwdGhXcml0ZTogZmFsc2UsXHJcblx0XHRcdFx0ZGVwdGhUZXN0OiBmYWxzZVxyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRiYWNrZ3JvdW5kQm94ID0gbmV3IE1lc2goIG5ldyBCb3hHZW9tZXRyeSgpLCBiYWNrZ3JvdW5kTWF0ZXJpYWwgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0bGV0IHVzZVNvbGlkQ29sb3IgPSBmYWxzZTtcclxuXHRcdGNvbnN0IGJhY2tncm91bmQgPSBzY2VuZS5iYWNrZ3JvdW5kO1xyXG5cclxuXHRcdGlmICggYmFja2dyb3VuZCApIHtcclxuXHJcblx0XHRcdGlmICggYmFja2dyb3VuZC5pc0NvbG9yICkge1xyXG5cclxuXHRcdFx0XHRiYWNrZ3JvdW5kQm94Lm1hdGVyaWFsLmNvbG9yLmNvcHkoIGJhY2tncm91bmQgKTtcclxuXHRcdFx0XHRzY2VuZS5iYWNrZ3JvdW5kID0gbnVsbDtcclxuXHRcdFx0XHR1c2VTb2xpZENvbG9yID0gdHJ1ZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0YmFja2dyb3VuZEJveC5tYXRlcmlhbC5jb2xvci5jb3B5KCBfY2xlYXJDb2xvciApO1xyXG5cdFx0XHR1c2VTb2xpZENvbG9yID0gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCBjdWJlVVZSZW5kZXJUYXJnZXQgKTtcclxuXHJcblx0XHRyZW5kZXJlci5jbGVhcigpO1xyXG5cclxuXHRcdGlmICggdXNlU29saWRDb2xvciApIHtcclxuXHJcblx0XHRcdHJlbmRlcmVyLnJlbmRlciggYmFja2dyb3VuZEJveCwgY3ViZUNhbWVyYSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCA2OyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgY29sID0gaSAlIDM7XHJcblxyXG5cdFx0XHRpZiAoIGNvbCA9PT0gMCApIHtcclxuXHJcblx0XHRcdFx0Y3ViZUNhbWVyYS51cC5zZXQoIDAsIHVwU2lnblsgaSBdLCAwICk7XHJcblx0XHRcdFx0Y3ViZUNhbWVyYS5wb3NpdGlvbi5zZXQoIHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHBvc2l0aW9uLnogKTtcclxuXHRcdFx0XHRjdWJlQ2FtZXJhLmxvb2tBdCggcG9zaXRpb24ueCArIGZvcndhcmRTaWduWyBpIF0sIHBvc2l0aW9uLnksIHBvc2l0aW9uLnogKTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGNvbCA9PT0gMSApIHtcclxuXHJcblx0XHRcdFx0Y3ViZUNhbWVyYS51cC5zZXQoIDAsIDAsIHVwU2lnblsgaSBdICk7XHJcblx0XHRcdFx0Y3ViZUNhbWVyYS5wb3NpdGlvbi5zZXQoIHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHBvc2l0aW9uLnogKTtcclxuXHRcdFx0XHRjdWJlQ2FtZXJhLmxvb2tBdCggcG9zaXRpb24ueCwgcG9zaXRpb24ueSArIGZvcndhcmRTaWduWyBpIF0sIHBvc2l0aW9uLnogKTtcclxuXHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRjdWJlQ2FtZXJhLnVwLnNldCggMCwgdXBTaWduWyBpIF0sIDAgKTtcclxuXHRcdFx0XHRjdWJlQ2FtZXJhLnBvc2l0aW9uLnNldCggcG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24ueiApO1xyXG5cdFx0XHRcdGN1YmVDYW1lcmEubG9va0F0KCBwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56ICsgZm9yd2FyZFNpZ25bIGkgXSApO1xyXG5cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IHNpemUgPSB0aGlzLl9jdWJlU2l6ZTtcclxuXHJcblx0XHRcdF9zZXRWaWV3cG9ydCggY3ViZVVWUmVuZGVyVGFyZ2V0LCBjb2wgKiBzaXplLCBpID4gMiA/IHNpemUgOiAwLCBzaXplLCBzaXplICk7XHJcblxyXG5cdFx0XHRyZW5kZXJlci5yZW5kZXIoIHNjZW5lLCBjdWJlQ2FtZXJhICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJlbmRlcmVyLmF1dG9DbGVhciA9IG9yaWdpbmFsQXV0b0NsZWFyO1xyXG5cdFx0c2NlbmUuYmFja2dyb3VuZCA9IGJhY2tncm91bmQ7XHJcblxyXG5cdH1cclxuXHJcblx0X3RleHR1cmVUb0N1YmVVViggdGV4dHVyZSwgY3ViZVVWUmVuZGVyVGFyZ2V0ICkge1xyXG5cclxuXHRcdGNvbnN0IHJlbmRlcmVyID0gdGhpcy5fcmVuZGVyZXI7XHJcblxyXG5cdFx0Y29uc3QgaXNDdWJlVGV4dHVyZSA9ICggdGV4dHVyZS5tYXBwaW5nID09PSBDdWJlUmVmbGVjdGlvbk1hcHBpbmcgfHwgdGV4dHVyZS5tYXBwaW5nID09PSBDdWJlUmVmcmFjdGlvbk1hcHBpbmcgKTtcclxuXHJcblx0XHRpZiAoIGlzQ3ViZVRleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMuX2N1YmVtYXBNYXRlcmlhbCA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5fY3ViZW1hcE1hdGVyaWFsID0gX2dldEN1YmVtYXBNYXRlcmlhbCggdGV4dHVyZSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMuX2VxdWlyZWN0TWF0ZXJpYWwgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdHRoaXMuX2VxdWlyZWN0TWF0ZXJpYWwgPSBfZ2V0RXF1aXJlY3RNYXRlcmlhbCggdGV4dHVyZSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBtYXRlcmlhbCA9IGlzQ3ViZVRleHR1cmUgPyB0aGlzLl9jdWJlbWFwTWF0ZXJpYWwgOiB0aGlzLl9lcXVpcmVjdE1hdGVyaWFsO1xyXG5cdFx0bWF0ZXJpYWwuZnJhZ21lbnROb2RlLnZhbHVlID0gdGV4dHVyZTtcclxuXHJcblx0XHRjb25zdCBtZXNoID0gdGhpcy5fbG9kTWVzaGVzWyAwIF07XHJcblx0XHRtZXNoLm1hdGVyaWFsID0gbWF0ZXJpYWw7XHJcblxyXG5cdFx0Y29uc3Qgc2l6ZSA9IHRoaXMuX2N1YmVTaXplO1xyXG5cclxuXHRcdF9zZXRWaWV3cG9ydCggY3ViZVVWUmVuZGVyVGFyZ2V0LCAwLCAwLCAzICogc2l6ZSwgMiAqIHNpemUgKTtcclxuXHJcblx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIGN1YmVVVlJlbmRlclRhcmdldCApO1xyXG5cdFx0cmVuZGVyZXIucmVuZGVyKCBtZXNoLCBfZmxhdENhbWVyYSApO1xyXG5cclxuXHR9XHJcblxyXG5cdF9hcHBseVBNUkVNKCBjdWJlVVZSZW5kZXJUYXJnZXQgKSB7XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyZXIgPSB0aGlzLl9yZW5kZXJlcjtcclxuXHRcdGNvbnN0IGF1dG9DbGVhciA9IHJlbmRlcmVyLmF1dG9DbGVhcjtcclxuXHRcdHJlbmRlcmVyLmF1dG9DbGVhciA9IGZhbHNlO1xyXG5cdFx0Y29uc3QgbiA9IHRoaXMuX2xvZFBsYW5lcy5sZW5ndGg7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAxOyBpIDwgbjsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHNpZ21hID0gTWF0aC5zcXJ0KCB0aGlzLl9zaWdtYXNbIGkgXSAqIHRoaXMuX3NpZ21hc1sgaSBdIC0gdGhpcy5fc2lnbWFzWyBpIC0gMSBdICogdGhpcy5fc2lnbWFzWyBpIC0gMSBdICk7XHJcblxyXG5cdFx0XHRjb25zdCBwb2xlQXhpcyA9IF9heGlzRGlyZWN0aW9uc1sgKCBuIC0gaSAtIDEgKSAlIF9heGlzRGlyZWN0aW9ucy5sZW5ndGggXTtcclxuXHJcblx0XHRcdHRoaXMuX2JsdXIoIGN1YmVVVlJlbmRlclRhcmdldCwgaSAtIDEsIGksIHNpZ21hLCBwb2xlQXhpcyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZW5kZXJlci5hdXRvQ2xlYXIgPSBhdXRvQ2xlYXI7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBpcyBhIHR3by1wYXNzIEdhdXNzaWFuIGJsdXIgZm9yIGEgY3ViZW1hcC4gTm9ybWFsbHkgdGhpcyBpcyBkb25lXHJcblx0ICogdmVydGljYWxseSBhbmQgaG9yaXpvbnRhbGx5LCBidXQgdGhpcyBicmVha3MgZG93biBvbiBhIGN1YmUuIEhlcmUgd2UgYXBwbHlcclxuXHQgKiB0aGUgYmx1ciBsYXRpdHVkaW5hbGx5IChhcm91bmQgdGhlIHBvbGVzKSwgYW5kIHRoZW4gbG9uZ2l0dWRpbmFsbHkgKHRvd2FyZHNcclxuXHQgKiB0aGUgcG9sZXMpIHRvIGFwcHJveGltYXRlIHRoZSBvcnRob2dvbmFsbHktc2VwYXJhYmxlIGJsdXIuIEl0IGlzIGxlYXN0XHJcblx0ICogYWNjdXJhdGUgYXQgdGhlIHBvbGVzLCBidXQgc3RpbGwgZG9lcyBhIGRlY2VudCBqb2IuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyVGFyZ2V0fSBjdWJlVVZSZW5kZXJUYXJnZXQgLSBUaGUgY3ViZW1hcCByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBsb2RJbiAtIFRoZSBpbnB1dCBsZXZlbC1vZi1kZXRhaWwuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGxvZE91dCAtIFRoZSBvdXRwdXQgbGV2ZWwtb2YtZGV0YWlsLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzaWdtYSAtIFRoZSBibHVyIHJhZGl1cyBpbiByYWRpYW5zLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gW3BvbGVBeGlzXSAtIFRoZSBwb2xlIGF4aXMuXHJcblx0ICovXHJcblx0X2JsdXIoIGN1YmVVVlJlbmRlclRhcmdldCwgbG9kSW4sIGxvZE91dCwgc2lnbWEsIHBvbGVBeGlzICkge1xyXG5cclxuXHRcdGNvbnN0IHBpbmdQb25nUmVuZGVyVGFyZ2V0ID0gdGhpcy5fcGluZ1BvbmdSZW5kZXJUYXJnZXQ7XHJcblxyXG5cdFx0dGhpcy5faGFsZkJsdXIoXHJcblx0XHRcdGN1YmVVVlJlbmRlclRhcmdldCxcclxuXHRcdFx0cGluZ1BvbmdSZW5kZXJUYXJnZXQsXHJcblx0XHRcdGxvZEluLFxyXG5cdFx0XHRsb2RPdXQsXHJcblx0XHRcdHNpZ21hLFxyXG5cdFx0XHQnbGF0aXR1ZGluYWwnLFxyXG5cdFx0XHRwb2xlQXhpcyApO1xyXG5cclxuXHRcdHRoaXMuX2hhbGZCbHVyKFxyXG5cdFx0XHRwaW5nUG9uZ1JlbmRlclRhcmdldCxcclxuXHRcdFx0Y3ViZVVWUmVuZGVyVGFyZ2V0LFxyXG5cdFx0XHRsb2RPdXQsXHJcblx0XHRcdGxvZE91dCxcclxuXHRcdFx0c2lnbWEsXHJcblx0XHRcdCdsb25naXR1ZGluYWwnLFxyXG5cdFx0XHRwb2xlQXhpcyApO1xyXG5cclxuXHR9XHJcblxyXG5cdF9oYWxmQmx1ciggdGFyZ2V0SW4sIHRhcmdldE91dCwgbG9kSW4sIGxvZE91dCwgc2lnbWFSYWRpYW5zLCBkaXJlY3Rpb24sIHBvbGVBeGlzICkge1xyXG5cclxuXHRcdGNvbnN0IHJlbmRlcmVyID0gdGhpcy5fcmVuZGVyZXI7XHJcblx0XHRjb25zdCBibHVyTWF0ZXJpYWwgPSB0aGlzLl9ibHVyTWF0ZXJpYWw7XHJcblxyXG5cdFx0aWYgKCBkaXJlY3Rpb24gIT09ICdsYXRpdHVkaW5hbCcgJiYgZGlyZWN0aW9uICE9PSAnbG9uZ2l0dWRpbmFsJyApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoICdibHVyIGRpcmVjdGlvbiBtdXN0IGJlIGVpdGhlciBsYXRpdHVkaW5hbCBvciBsb25naXR1ZGluYWwhJyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBOdW1iZXIgb2Ygc3RhbmRhcmQgZGV2aWF0aW9ucyBhdCB3aGljaCB0byBjdXQgb2ZmIHRoZSBkaXNjcmV0ZSBhcHByb3hpbWF0aW9uLlxyXG5cdFx0Y29uc3QgU1RBTkRBUkRfREVWSUFUSU9OUyA9IDM7XHJcblxyXG5cdFx0Y29uc3QgYmx1ck1lc2ggPSB0aGlzLl9sb2RNZXNoZXNbIGxvZE91dCBdO1xyXG5cdFx0Ymx1ck1lc2gubWF0ZXJpYWwgPSBibHVyTWF0ZXJpYWw7XHJcblxyXG5cdFx0Y29uc3QgYmx1clVuaWZvcm1zID0gX3VuaWZvcm1zTWFwLmdldCggYmx1ck1hdGVyaWFsICk7XHJcblxyXG5cdFx0Y29uc3QgcGl4ZWxzID0gdGhpcy5fc2l6ZUxvZHNbIGxvZEluIF0gLSAxO1xyXG5cdFx0Y29uc3QgcmFkaWFuc1BlclBpeGVsID0gaXNGaW5pdGUoIHNpZ21hUmFkaWFucyApID8gTWF0aC5QSSAvICggMiAqIHBpeGVscyApIDogMiAqIE1hdGguUEkgLyAoIDIgKiBNQVhfU0FNUExFUyAtIDEgKTtcclxuXHRcdGNvbnN0IHNpZ21hUGl4ZWxzID0gc2lnbWFSYWRpYW5zIC8gcmFkaWFuc1BlclBpeGVsO1xyXG5cdFx0Y29uc3Qgc2FtcGxlcyA9IGlzRmluaXRlKCBzaWdtYVJhZGlhbnMgKSA/IDEgKyBNYXRoLmZsb29yKCBTVEFOREFSRF9ERVZJQVRJT05TICogc2lnbWFQaXhlbHMgKSA6IE1BWF9TQU1QTEVTO1xyXG5cclxuXHRcdGlmICggc2FtcGxlcyA+IE1BWF9TQU1QTEVTICkge1xyXG5cclxuXHRcdFx0Y29uc29sZS53YXJuKCBgc2lnbWFSYWRpYW5zLCAke1xyXG5cdFx0XHRcdHNpZ21hUmFkaWFuc30sIGlzIHRvbyBsYXJnZSBhbmQgd2lsbCBjbGlwLCBhcyBpdCByZXF1ZXN0ZWQgJHtcclxuXHRcdFx0XHRzYW1wbGVzfSBzYW1wbGVzIHdoZW4gdGhlIG1heGltdW0gaXMgc2V0IHRvICR7TUFYX1NBTVBMRVN9YCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCB3ZWlnaHRzID0gW107XHJcblx0XHRsZXQgc3VtID0gMDtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBNQVhfU0FNUExFUzsgKysgaSApIHtcclxuXHJcblx0XHRcdGNvbnN0IHggPSBpIC8gc2lnbWFQaXhlbHM7XHJcblx0XHRcdGNvbnN0IHdlaWdodCA9IE1hdGguZXhwKCAtIHggKiB4IC8gMiApO1xyXG5cdFx0XHR3ZWlnaHRzLnB1c2goIHdlaWdodCApO1xyXG5cclxuXHRcdFx0aWYgKCBpID09PSAwICkge1xyXG5cclxuXHRcdFx0XHRzdW0gKz0gd2VpZ2h0O1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggaSA8IHNhbXBsZXMgKSB7XHJcblxyXG5cdFx0XHRcdHN1bSArPSAyICogd2VpZ2h0O1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB3ZWlnaHRzLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdHdlaWdodHNbIGkgXSA9IHdlaWdodHNbIGkgXSAvIHN1bTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGFyZ2V0SW4udGV4dHVyZS5mcmFtZSA9ICggdGFyZ2V0SW4udGV4dHVyZS5mcmFtZSB8fCAwICkgKyAxO1xyXG5cclxuXHRcdGJsdXJVbmlmb3Jtcy5lbnZNYXAudmFsdWUgPSB0YXJnZXRJbi50ZXh0dXJlO1xyXG5cdFx0Ymx1clVuaWZvcm1zLnNhbXBsZXMudmFsdWUgPSBzYW1wbGVzO1xyXG5cdFx0Ymx1clVuaWZvcm1zLndlaWdodHMuYXJyYXkgPSB3ZWlnaHRzO1xyXG5cdFx0Ymx1clVuaWZvcm1zLmxhdGl0dWRpbmFsLnZhbHVlID0gZGlyZWN0aW9uID09PSAnbGF0aXR1ZGluYWwnID8gMSA6IDA7XHJcblxyXG5cdFx0aWYgKCBwb2xlQXhpcyApIHtcclxuXHJcblx0XHRcdGJsdXJVbmlmb3Jtcy5wb2xlQXhpcy52YWx1ZSA9IHBvbGVBeGlzO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCB7IF9sb2RNYXggfSA9IHRoaXM7XHJcblx0XHRibHVyVW5pZm9ybXMuZFRoZXRhLnZhbHVlID0gcmFkaWFuc1BlclBpeGVsO1xyXG5cdFx0Ymx1clVuaWZvcm1zLm1pcEludC52YWx1ZSA9IF9sb2RNYXggLSBsb2RJbjtcclxuXHJcblx0XHRjb25zdCBvdXRwdXRTaXplID0gdGhpcy5fc2l6ZUxvZHNbIGxvZE91dCBdO1xyXG5cdFx0Y29uc3QgeCA9IDMgKiBvdXRwdXRTaXplICogKCBsb2RPdXQgPiBfbG9kTWF4IC0gTE9EX01JTiA/IGxvZE91dCAtIF9sb2RNYXggKyBMT0RfTUlOIDogMCApO1xyXG5cdFx0Y29uc3QgeSA9IDQgKiAoIHRoaXMuX2N1YmVTaXplIC0gb3V0cHV0U2l6ZSApO1xyXG5cclxuXHRcdF9zZXRWaWV3cG9ydCggdGFyZ2V0T3V0LCB4LCB5LCAzICogb3V0cHV0U2l6ZSwgMiAqIG91dHB1dFNpemUgKTtcclxuXHRcdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggdGFyZ2V0T3V0ICk7XHJcblx0XHRyZW5kZXJlci5yZW5kZXIoIGJsdXJNZXNoLCBfZmxhdENhbWVyYSApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBfY3JlYXRlUGxhbmVzKCBsb2RNYXggKSB7XHJcblxyXG5cdGNvbnN0IGxvZFBsYW5lcyA9IFtdO1xyXG5cdGNvbnN0IHNpemVMb2RzID0gW107XHJcblx0Y29uc3Qgc2lnbWFzID0gW107XHJcblx0Y29uc3QgbG9kTWVzaGVzID0gW107XHJcblxyXG5cdGxldCBsb2QgPSBsb2RNYXg7XHJcblxyXG5cdGNvbnN0IHRvdGFsTG9kcyA9IGxvZE1heCAtIExPRF9NSU4gKyAxICsgRVhUUkFfTE9EX1NJR01BLmxlbmd0aDtcclxuXHJcblx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdG90YWxMb2RzOyBpICsrICkge1xyXG5cclxuXHRcdGNvbnN0IHNpemVMb2QgPSBNYXRoLnBvdyggMiwgbG9kICk7XHJcblx0XHRzaXplTG9kcy5wdXNoKCBzaXplTG9kICk7XHJcblx0XHRsZXQgc2lnbWEgPSAxLjAgLyBzaXplTG9kO1xyXG5cclxuXHRcdGlmICggaSA+IGxvZE1heCAtIExPRF9NSU4gKSB7XHJcblxyXG5cdFx0XHRzaWdtYSA9IEVYVFJBX0xPRF9TSUdNQVsgaSAtIGxvZE1heCArIExPRF9NSU4gLSAxIF07XHJcblxyXG5cdFx0fSBlbHNlIGlmICggaSA9PT0gMCApIHtcclxuXHJcblx0XHRcdHNpZ21hID0gMDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0c2lnbWFzLnB1c2goIHNpZ21hICk7XHJcblxyXG5cdFx0Y29uc3QgdGV4ZWxTaXplID0gMS4wIC8gKCBzaXplTG9kIC0gMiApO1xyXG5cdFx0Y29uc3QgbWluID0gLSB0ZXhlbFNpemU7XHJcblx0XHRjb25zdCBtYXggPSAxICsgdGV4ZWxTaXplO1xyXG5cdFx0Y29uc3QgdXYxID0gWyBtaW4sIG1pbiwgbWF4LCBtaW4sIG1heCwgbWF4LCBtaW4sIG1pbiwgbWF4LCBtYXgsIG1pbiwgbWF4IF07XHJcblxyXG5cdFx0Y29uc3QgY3ViZUZhY2VzID0gNjtcclxuXHRcdGNvbnN0IHZlcnRpY2VzID0gNjtcclxuXHRcdGNvbnN0IHBvc2l0aW9uU2l6ZSA9IDM7XHJcblx0XHRjb25zdCB1dlNpemUgPSAyO1xyXG5cdFx0Y29uc3QgZmFjZUluZGV4U2l6ZSA9IDE7XHJcblxyXG5cdFx0Y29uc3QgcG9zaXRpb24gPSBuZXcgRmxvYXQzMkFycmF5KCBwb3NpdGlvblNpemUgKiB2ZXJ0aWNlcyAqIGN1YmVGYWNlcyApO1xyXG5cdFx0Y29uc3QgdXYgPSBuZXcgRmxvYXQzMkFycmF5KCB1dlNpemUgKiB2ZXJ0aWNlcyAqIGN1YmVGYWNlcyApO1xyXG5cdFx0Y29uc3QgZmFjZUluZGV4ID0gbmV3IEZsb2F0MzJBcnJheSggZmFjZUluZGV4U2l6ZSAqIHZlcnRpY2VzICogY3ViZUZhY2VzICk7XHJcblxyXG5cdFx0Zm9yICggbGV0IGZhY2UgPSAwOyBmYWNlIDwgY3ViZUZhY2VzOyBmYWNlICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgeCA9ICggZmFjZSAlIDMgKSAqIDIgLyAzIC0gMTtcclxuXHRcdFx0Y29uc3QgeSA9IGZhY2UgPiAyID8gMCA6IC0gMTtcclxuXHRcdFx0Y29uc3QgY29vcmRpbmF0ZXMgPSBbXHJcblx0XHRcdFx0eCwgeSwgMCxcclxuXHRcdFx0XHR4ICsgMiAvIDMsIHksIDAsXHJcblx0XHRcdFx0eCArIDIgLyAzLCB5ICsgMSwgMCxcclxuXHRcdFx0XHR4LCB5LCAwLFxyXG5cdFx0XHRcdHggKyAyIC8gMywgeSArIDEsIDAsXHJcblx0XHRcdFx0eCwgeSArIDEsIDBcclxuXHRcdFx0XTtcclxuXHJcblx0XHRcdGNvbnN0IGZhY2VJZHggPSBfZmFjZUxpYlsgZmFjZSBdO1xyXG5cdFx0XHRwb3NpdGlvbi5zZXQoIGNvb3JkaW5hdGVzLCBwb3NpdGlvblNpemUgKiB2ZXJ0aWNlcyAqIGZhY2VJZHggKTtcclxuXHRcdFx0dXYuc2V0KCB1djEsIHV2U2l6ZSAqIHZlcnRpY2VzICogZmFjZUlkeCApO1xyXG5cdFx0XHRjb25zdCBmaWxsID0gWyBmYWNlSWR4LCBmYWNlSWR4LCBmYWNlSWR4LCBmYWNlSWR4LCBmYWNlSWR4LCBmYWNlSWR4IF07XHJcblx0XHRcdGZhY2VJbmRleC5zZXQoIGZpbGwsIGZhY2VJbmRleFNpemUgKiB2ZXJ0aWNlcyAqIGZhY2VJZHggKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgcGxhbmVzID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XHJcblx0XHRwbGFuZXMuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgcG9zaXRpb25TaXplICkgKTtcclxuXHRcdHBsYW5lcy5zZXRBdHRyaWJ1dGUoICd1dicsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIHV2LCB1dlNpemUgKSApO1xyXG5cdFx0cGxhbmVzLnNldEF0dHJpYnV0ZSggJ2ZhY2VJbmRleCcsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIGZhY2VJbmRleCwgZmFjZUluZGV4U2l6ZSApICk7XHJcblx0XHRsb2RQbGFuZXMucHVzaCggcGxhbmVzICk7XHJcblx0XHRsb2RNZXNoZXMucHVzaCggbmV3IE1lc2goIHBsYW5lcywgbnVsbCApICk7XHJcblxyXG5cdFx0aWYgKCBsb2QgPiBMT0RfTUlOICkge1xyXG5cclxuXHRcdFx0bG9kIC0tO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4geyBsb2RQbGFuZXMsIHNpemVMb2RzLCBzaWdtYXMsIGxvZE1lc2hlcyB9O1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gX2NyZWF0ZVJlbmRlclRhcmdldCggd2lkdGgsIGhlaWdodCwgcGFyYW1zICkge1xyXG5cclxuXHRjb25zdCBjdWJlVVZSZW5kZXJUYXJnZXQgPSBuZXcgUmVuZGVyVGFyZ2V0KCB3aWR0aCwgaGVpZ2h0LCBwYXJhbXMgKTtcclxuXHRjdWJlVVZSZW5kZXJUYXJnZXQudGV4dHVyZS5tYXBwaW5nID0gQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmc7XHJcblx0Y3ViZVVWUmVuZGVyVGFyZ2V0LnRleHR1cmUubmFtZSA9ICdQTVJFTS5jdWJlVXYnO1xyXG5cdGN1YmVVVlJlbmRlclRhcmdldC50ZXh0dXJlLmlzUE1SRU1UZXh0dXJlID0gdHJ1ZTtcclxuXHRjdWJlVVZSZW5kZXJUYXJnZXQuc2Npc3NvclRlc3QgPSB0cnVlO1xyXG5cdHJldHVybiBjdWJlVVZSZW5kZXJUYXJnZXQ7XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBfc2V0Vmlld3BvcnQoIHRhcmdldCwgeCwgeSwgd2lkdGgsIGhlaWdodCApIHtcclxuXHJcblx0dGFyZ2V0LnZpZXdwb3J0LnNldCggeCwgeSwgd2lkdGgsIGhlaWdodCApO1xyXG5cdHRhcmdldC5zY2lzc29yLnNldCggeCwgeSwgd2lkdGgsIGhlaWdodCApO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gX2dldE1hdGVyaWFsKCB0eXBlICkge1xyXG5cclxuXHRjb25zdCBtYXRlcmlhbCA9IG5ldyBOb2RlTWF0ZXJpYWwoKTtcclxuXHRtYXRlcmlhbC5kZXB0aFRlc3QgPSBmYWxzZTtcclxuXHRtYXRlcmlhbC5kZXB0aFdyaXRlID0gZmFsc2U7XHJcblx0bWF0ZXJpYWwuYmxlbmRpbmcgPSBOb0JsZW5kaW5nO1xyXG5cdG1hdGVyaWFsLm5hbWUgPSBgUE1SRU1fJHsgdHlwZSB9YDtcclxuXHJcblx0cmV0dXJuIG1hdGVyaWFsO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gX2dldEJsdXJTaGFkZXIoIGxvZE1heCwgd2lkdGgsIGhlaWdodCApIHtcclxuXHJcblx0Y29uc3Qgd2VpZ2h0cyA9IHVuaWZvcm1BcnJheSggbmV3IEFycmF5KCBNQVhfU0FNUExFUyApLmZpbGwoIDAgKSApO1xyXG5cdGNvbnN0IHBvbGVBeGlzID0gdW5pZm9ybSggbmV3IFZlY3RvcjMoIDAsIDEsIDAgKSApO1xyXG5cdGNvbnN0IGRUaGV0YSA9IHVuaWZvcm0oIDAgKTtcclxuXHRjb25zdCBuID0gZmxvYXQoIE1BWF9TQU1QTEVTICk7XHJcblx0Y29uc3QgbGF0aXR1ZGluYWwgPSB1bmlmb3JtKCAwICk7IC8vIGZhbHNlLCBib29sXHJcblx0Y29uc3Qgc2FtcGxlcyA9IHVuaWZvcm0oIDEgKTsgLy8gaW50XHJcblx0Y29uc3QgZW52TWFwID0gdGV4dHVyZSggbnVsbCApO1xyXG5cdGNvbnN0IG1pcEludCA9IHVuaWZvcm0oIDAgKTsgLy8gaW50XHJcblx0Y29uc3QgQ1VCRVVWX1RFWEVMX1dJRFRIID0gZmxvYXQoIDEgLyB3aWR0aCApO1xyXG5cdGNvbnN0IENVQkVVVl9URVhFTF9IRUlHSFQgPSBmbG9hdCggMSAvIGhlaWdodCApO1xyXG5cdGNvbnN0IENVQkVVVl9NQVhfTUlQID0gZmxvYXQoIGxvZE1heCApO1xyXG5cclxuXHRjb25zdCBtYXRlcmlhbFVuaWZvcm1zID0ge1xyXG5cdFx0bixcclxuXHRcdGxhdGl0dWRpbmFsLFxyXG5cdFx0d2VpZ2h0cyxcclxuXHRcdHBvbGVBeGlzLFxyXG5cdFx0b3V0cHV0RGlyZWN0aW9uOiBfb3V0cHV0RGlyZWN0aW9uLFxyXG5cdFx0ZFRoZXRhLFxyXG5cdFx0c2FtcGxlcyxcclxuXHRcdGVudk1hcCxcclxuXHRcdG1pcEludCxcclxuXHRcdENVQkVVVl9URVhFTF9XSURUSCxcclxuXHRcdENVQkVVVl9URVhFTF9IRUlHSFQsXHJcblx0XHRDVUJFVVZfTUFYX01JUFxyXG5cdH07XHJcblxyXG5cdGNvbnN0IG1hdGVyaWFsID0gX2dldE1hdGVyaWFsKCAnYmx1cicgKTtcclxuXHRtYXRlcmlhbC5mcmFnbWVudE5vZGUgPSBibHVyKCB7IC4uLm1hdGVyaWFsVW5pZm9ybXMsIGxhdGl0dWRpbmFsOiBsYXRpdHVkaW5hbC5lcXVhbCggMSApIH0gKTtcclxuXHJcblx0X3VuaWZvcm1zTWFwLnNldCggbWF0ZXJpYWwsIG1hdGVyaWFsVW5pZm9ybXMgKTtcclxuXHJcblx0cmV0dXJuIG1hdGVyaWFsO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gX2dldEN1YmVtYXBNYXRlcmlhbCggZW52VGV4dHVyZSApIHtcclxuXHJcblx0Y29uc3QgbWF0ZXJpYWwgPSBfZ2V0TWF0ZXJpYWwoICdjdWJlbWFwJyApO1xyXG5cdG1hdGVyaWFsLmZyYWdtZW50Tm9kZSA9IGN1YmVUZXh0dXJlKCBlbnZUZXh0dXJlLCBfb3V0cHV0RGlyZWN0aW9uICk7XHJcblxyXG5cdHJldHVybiBtYXRlcmlhbDtcclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIF9nZXRFcXVpcmVjdE1hdGVyaWFsKCBlbnZUZXh0dXJlICkge1xyXG5cclxuXHRjb25zdCBtYXRlcmlhbCA9IF9nZXRNYXRlcmlhbCggJ2VxdWlyZWN0JyApO1xyXG5cdG1hdGVyaWFsLmZyYWdtZW50Tm9kZSA9IHRleHR1cmUoIGVudlRleHR1cmUsIGVxdWlyZWN0VVYoIF9vdXRwdXREaXJlY3Rpb24gKSwgMCApO1xyXG5cclxuXHRyZXR1cm4gbWF0ZXJpYWw7XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBQTVJFTUdlbmVyYXRvcjtcclxuIiwiaW1wb3J0IFRlbXBOb2RlIGZyb20gJy4uL2NvcmUvVGVtcE5vZGUuanMnO1xyXG5pbXBvcnQgeyB0ZXh0dXJlIH0gZnJvbSAnLi4vYWNjZXNzb3JzL1RleHR1cmVOb2RlLmpzJztcclxuaW1wb3J0IHsgdGV4dHVyZUN1YmVVViB9IGZyb20gJy4vUE1SRU1VdGlscy5qcyc7XHJcbmltcG9ydCB7IHVuaWZvcm0gfSBmcm9tICcuLi9jb3JlL1VuaWZvcm1Ob2RlLmpzJztcclxuaW1wb3J0IHsgTm9kZVVwZGF0ZVR5cGUgfSBmcm9tICcuLi9jb3JlL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IG5vZGVQcm94eSwgdmVjMyB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbmltcG9ydCB7IFRleHR1cmUgfSBmcm9tICcuLi8uLi90ZXh0dXJlcy9UZXh0dXJlLmpzJztcclxuaW1wb3J0IFBNUkVNR2VuZXJhdG9yIGZyb20gJy4uLy4uL3JlbmRlcmVycy9jb21tb24vZXh0cmFzL1BNUkVNR2VuZXJhdG9yLmpzJztcclxuaW1wb3J0IHsgbWF0ZXJpYWxFbnZSb3RhdGlvbiB9IGZyb20gJy4uL2FjY2Vzc29ycy9NYXRlcmlhbFByb3BlcnRpZXMuanMnO1xyXG5cclxuY29uc3QgX2NhY2hlID0gbmV3IFdlYWtNYXAoKTtcclxuXHJcbi8qKlxyXG4gKiBHZW5lcmF0ZXMgdGhlIGN1YmVVViBzaXplIGJhc2VkIG9uIHRoZSBnaXZlbiBpbWFnZSBoZWlnaHQuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbWFnZUhlaWdodCAtIFRoZSBpbWFnZSBoZWlnaHQuXHJcbiAqIEByZXR1cm4ge3t0ZXhlbFdpZHRoOiBudW1iZXIsdGV4ZWxIZWlnaHQ6IG51bWJlciwgbWF4TWlwOiBudW1iZXJ9fSBUaGUgcmVzdWx0IG9iamVjdC5cclxuICovXHJcbmZ1bmN0aW9uIF9nZW5lcmF0ZUN1YmVVVlNpemUoIGltYWdlSGVpZ2h0ICkge1xyXG5cclxuXHRjb25zdCBtYXhNaXAgPSBNYXRoLmxvZzIoIGltYWdlSGVpZ2h0ICkgLSAyO1xyXG5cclxuXHRjb25zdCB0ZXhlbEhlaWdodCA9IDEuMCAvIGltYWdlSGVpZ2h0O1xyXG5cclxuXHRjb25zdCB0ZXhlbFdpZHRoID0gMS4wIC8gKCAzICogTWF0aC5tYXgoIE1hdGgucG93KCAyLCBtYXhNaXAgKSwgNyAqIDE2ICkgKTtcclxuXHJcblx0cmV0dXJuIHsgdGV4ZWxXaWR0aCwgdGV4ZWxIZWlnaHQsIG1heE1pcCB9O1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIEdlbmVyYXRlcyBhIFBNUkVNIGZyb20gdGhlIGdpdmVuIHRleHR1cmUuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlIHRvIGNyZWF0ZSB0aGUgUE1SRU0gZm9yLlxyXG4gKiBAcGFyYW0ge1JlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuICogQHBhcmFtIHtQTVJFTUdlbmVyYXRvcn0gZ2VuZXJhdG9yIC0gVGhlIFBNUkVNIGdlbmVyYXRvci5cclxuICogQHJldHVybiB7P1RleHR1cmV9IFRoZSBQTVJFTS5cclxuICovXHJcbmZ1bmN0aW9uIF9nZXRQTVJFTUZyb21UZXh0dXJlKCB0ZXh0dXJlLCByZW5kZXJlciwgZ2VuZXJhdG9yICkge1xyXG5cclxuXHRjb25zdCBjYWNoZSA9IF9nZXRDYWNoZSggcmVuZGVyZXIgKTtcclxuXHJcblx0bGV0IGNhY2hlVGV4dHVyZSA9IGNhY2hlLmdldCggdGV4dHVyZSApO1xyXG5cclxuXHRjb25zdCBwbXJlbVZlcnNpb24gPSBjYWNoZVRleHR1cmUgIT09IHVuZGVmaW5lZCA/IGNhY2hlVGV4dHVyZS5wbXJlbVZlcnNpb24gOiAtIDE7XHJcblxyXG5cdGlmICggcG1yZW1WZXJzaW9uICE9PSB0ZXh0dXJlLnBtcmVtVmVyc2lvbiApIHtcclxuXHJcblx0XHRjb25zdCBpbWFnZSA9IHRleHR1cmUuaW1hZ2U7XHJcblxyXG5cdFx0aWYgKCB0ZXh0dXJlLmlzQ3ViZVRleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGlzQ3ViZU1hcFJlYWR5KCBpbWFnZSApICkge1xyXG5cclxuXHRcdFx0XHRjYWNoZVRleHR1cmUgPSBnZW5lcmF0b3IuZnJvbUN1YmVtYXAoIHRleHR1cmUsIGNhY2hlVGV4dHVyZSApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0cmV0dXJuIG51bGw7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRpZiAoIGlzRXF1aXJlY3Rhbmd1bGFyTWFwUmVhZHkoIGltYWdlICkgKSB7XHJcblxyXG5cdFx0XHRcdGNhY2hlVGV4dHVyZSA9IGdlbmVyYXRvci5mcm9tRXF1aXJlY3Rhbmd1bGFyKCB0ZXh0dXJlLCBjYWNoZVRleHR1cmUgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHJldHVybiBudWxsO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjYWNoZVRleHR1cmUucG1yZW1WZXJzaW9uID0gdGV4dHVyZS5wbXJlbVZlcnNpb247XHJcblxyXG5cdFx0Y2FjaGUuc2V0KCB0ZXh0dXJlLCBjYWNoZVRleHR1cmUgKTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gY2FjaGVUZXh0dXJlLnRleHR1cmU7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIGNhY2hlIHRoYXQgc3RvcmVzIGdlbmVyYXRlZCBQTVJFTXMgZm9yIHRoZSByZXNwZWN0aXZlIHRleHR1cmVzLlxyXG4gKiBBIGNhY2hlIG11c3QgYmUgbWFpbnRhaW5lZCBwZXIgcmVuZGVyZXIgc2luY2UgUE1SRU1zIGFyZSByZW5kZXIgdGFyZ2V0IHRleHR1cmVzXHJcbiAqIHdoaWNoIGNhbid0IGJlIHNoYXJlZCBhY3Jvc3MgcmVuZGVyIGNvbnRleHRzLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAcGFyYW0ge1JlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuICogQHJldHVybiB7V2Vha01hcDxUZXh0dXJlLCBUZXh0dXJlPn0gVGhlIFBNUkVNIGNhY2hlLlxyXG4gKi9cclxuZnVuY3Rpb24gX2dldENhY2hlKCByZW5kZXJlciApIHtcclxuXHJcblx0bGV0IHJlbmRlcmVyQ2FjaGUgPSBfY2FjaGUuZ2V0KCByZW5kZXJlciApO1xyXG5cclxuXHRpZiAoIHJlbmRlcmVyQ2FjaGUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRyZW5kZXJlckNhY2hlID0gbmV3IFdlYWtNYXAoKTtcclxuXHRcdF9jYWNoZS5zZXQoIHJlbmRlcmVyLCByZW5kZXJlckNhY2hlICk7XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIHJlbmRlcmVyQ2FjaGU7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogVGhpcyBub2RlIHJlcHJlc2VudHMgYSBQTVJFTSB3aGljaCBpcyBhIHNwZWNpYWwgdHlwZSBvZiBwcmVwcm9jZXNzZWRcclxuICogZW52aXJvbm1lbnQgbWFwIGludGVuZGVkIGZvciBQQlIgbWF0ZXJpYWxzLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBtYXRlcmlhbCA9IG5ldyBNZXNoU3RhbmRhcmROb2RlTWF0ZXJpYWwoKTtcclxuICogbWF0ZXJpYWwuZW52Tm9kZSA9IHBtcmVtVGV4dHVyZSggZW52TWFwICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgVGVtcE5vZGVcclxuICovXHJcbmNsYXNzIFBNUkVNTm9kZSBleHRlbmRzIFRlbXBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnUE1SRU1Ob2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGZ1bmN0aW9uIG92ZXJsb2FkaW5nIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHZhbHVlIC0gVGhlIGlucHV0IHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtOb2RlPHZlYzI+fSBbdXZOb2RlPW51bGxdIC0gVGhlIHV2IG5vZGUuXHJcblx0ICogQHBhcmFtIHtOb2RlPGZsb2F0Pn0gW2xldmVsTm9kZT1udWxsXSAtIFRoZSBsZXZlbCBub2RlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCB2YWx1ZSwgdXZOb2RlID0gbnVsbCwgbGV2ZWxOb2RlID0gbnVsbCApIHtcclxuXHJcblx0XHRzdXBlciggJ3ZlYzMnICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZWZlcmVuY2UgdG8gdGhlIGlucHV0IHRleHR1cmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHtUZXh0dXJlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl92YWx1ZSA9IHZhbHVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVmZXJlbmNlIHRvIHRoZSBnZW5lcmF0ZWQgUE1SRU0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHtUZXh0dXJlIHwgbnVsbH1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fcG1yZW0gPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogIFRoZSB1diBub2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlPHZlYzI+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnV2Tm9kZSA9IHV2Tm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqICBUaGUgbGV2ZWwgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZTxmbG9hdD59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGV2ZWxOb2RlID0gbGV2ZWxOb2RlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVmZXJlbmNlIHRvIGEgUE1SRU0gZ2VuZXJhdG9yLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7P1BNUkVNR2VuZXJhdG9yfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9nZW5lcmF0b3IgPSBudWxsO1xyXG5cclxuXHRcdGNvbnN0IGRlZmF1bHRUZXh0dXJlID0gbmV3IFRleHR1cmUoKTtcclxuXHRcdGRlZmF1bHRUZXh0dXJlLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdGV4dHVyZSBub2RlIGhvbGRpbmcgdGhlIGdlbmVyYXRlZCBQTVJFTS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge1RleHR1cmVOb2RlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl90ZXh0dXJlID0gdGV4dHVyZSggZGVmYXVsdFRleHR1cmUgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgdW5pZm9ybSByZXByZXNlbnRpbmcgdGhlIFBNUkVNJ3Mgd2lkdGguXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHtVbmlmb3JtTm9kZTxmbG9hdD59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX3dpZHRoID0gdW5pZm9ybSggMCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSB1bmlmb3JtIHJlcHJlc2VudGluZyB0aGUgUE1SRU0ncyBoZWlnaHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHtVbmlmb3JtTm9kZTxmbG9hdD59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX2hlaWdodCA9IHVuaWZvcm0oIDAgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgdW5pZm9ybSByZXByZXNlbnRpbmcgdGhlIFBNUkVNJ3MgbWF4IE1pcC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge1VuaWZvcm1Ob2RlPGZsb2F0Pn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fbWF4TWlwID0gdW5pZm9ybSggMCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGB1cGRhdGVCZWZvcmVUeXBlYCBpcyBzZXQgdG8gYE5vZGVVcGRhdGVUeXBlLlJFTkRFUmAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqIEBkZWZhdWx0ICdyZW5kZXInXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXBkYXRlQmVmb3JlVHlwZSA9IE5vZGVVcGRhdGVUeXBlLlJFTkRFUjtcclxuXHJcblx0fVxyXG5cclxuXHRzZXQgdmFsdWUoIHZhbHVlICkge1xyXG5cclxuXHRcdHRoaXMuX3ZhbHVlID0gdmFsdWU7XHJcblx0XHR0aGlzLl9wbXJlbSA9IG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIG5vZGUncyB0ZXh0dXJlIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge1RleHR1cmV9XHJcblx0ICovXHJcblx0Z2V0IHZhbHVlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl92YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVc2VzIHRoZSBnaXZlbiBQTVJFTSB0ZXh0dXJlIHRvIHVwZGF0ZSBpbnRlcm5hbCB2YWx1ZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgUE1SRU0gdGV4dHVyZS5cclxuXHQgKi9cclxuXHR1cGRhdGVGcm9tVGV4dHVyZSggdGV4dHVyZSApIHtcclxuXHJcblx0XHRjb25zdCBjdWJlVVZTaXplID0gX2dlbmVyYXRlQ3ViZVVWU2l6ZSggdGV4dHVyZS5pbWFnZS5oZWlnaHQgKTtcclxuXHJcblx0XHR0aGlzLl90ZXh0dXJlLnZhbHVlID0gdGV4dHVyZTtcclxuXHRcdHRoaXMuX3dpZHRoLnZhbHVlID0gY3ViZVVWU2l6ZS50ZXhlbFdpZHRoO1xyXG5cdFx0dGhpcy5faGVpZ2h0LnZhbHVlID0gY3ViZVVWU2l6ZS50ZXhlbEhlaWdodDtcclxuXHRcdHRoaXMuX21heE1pcC52YWx1ZSA9IGN1YmVVVlNpemUubWF4TWlwO1xyXG5cclxuXHR9XHJcblxyXG5cdHVwZGF0ZUJlZm9yZSggZnJhbWUgKSB7XHJcblxyXG5cdFx0bGV0IHBtcmVtID0gdGhpcy5fcG1yZW07XHJcblxyXG5cdFx0Y29uc3QgcG1yZW1WZXJzaW9uID0gcG1yZW0gPyBwbXJlbS5wbXJlbVZlcnNpb24gOiAtIDE7XHJcblx0XHRjb25zdCB0ZXh0dXJlID0gdGhpcy5fdmFsdWU7XHJcblxyXG5cdFx0aWYgKCBwbXJlbVZlcnNpb24gIT09IHRleHR1cmUucG1yZW1WZXJzaW9uICkge1xyXG5cclxuXHRcdFx0aWYgKCB0ZXh0dXJlLmlzUE1SRU1UZXh0dXJlID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRwbXJlbSA9IHRleHR1cmU7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRwbXJlbSA9IF9nZXRQTVJFTUZyb21UZXh0dXJlKCB0ZXh0dXJlLCBmcmFtZS5yZW5kZXJlciwgdGhpcy5fZ2VuZXJhdG9yICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHBtcmVtICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLl9wbXJlbSA9IHBtcmVtO1xyXG5cclxuXHRcdFx0XHR0aGlzLnVwZGF0ZUZyb21UZXh0dXJlKCBwbXJlbSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRzZXR1cCggYnVpbGRlciApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuX2dlbmVyYXRvciA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuX2dlbmVyYXRvciA9IG5ldyBQTVJFTUdlbmVyYXRvciggYnVpbGRlci5yZW5kZXJlciApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnVwZGF0ZUJlZm9yZSggYnVpbGRlciApO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0bGV0IHV2Tm9kZSA9IHRoaXMudXZOb2RlO1xyXG5cclxuXHRcdGlmICggdXZOb2RlID09PSBudWxsICYmIGJ1aWxkZXIuY29udGV4dC5nZXRVViApIHtcclxuXHJcblx0XHRcdHV2Tm9kZSA9IGJ1aWxkZXIuY29udGV4dC5nZXRVViggdGhpcyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdHV2Tm9kZSA9IG1hdGVyaWFsRW52Um90YXRpb24ubXVsKCB2ZWMzKCB1dk5vZGUueCwgdXZOb2RlLnkubmVnYXRlKCksIHV2Tm9kZS56ICkgKTtcclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGxldCBsZXZlbE5vZGUgPSB0aGlzLmxldmVsTm9kZTtcclxuXHJcblx0XHRpZiAoIGxldmVsTm9kZSA9PT0gbnVsbCAmJiBidWlsZGVyLmNvbnRleHQuZ2V0VGV4dHVyZUxldmVsICkge1xyXG5cclxuXHRcdFx0bGV2ZWxOb2RlID0gYnVpbGRlci5jb250ZXh0LmdldFRleHR1cmVMZXZlbCggdGhpcyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdHJldHVybiB0ZXh0dXJlQ3ViZVVWKCB0aGlzLl90ZXh0dXJlLCB1dk5vZGUsIGxldmVsTm9kZSwgdGhpcy5fd2lkdGgsIHRoaXMuX2hlaWdodCwgdGhpcy5fbWF4TWlwICk7XHJcblxyXG5cdH1cclxuXHJcblx0ZGlzcG9zZSgpIHtcclxuXHJcblx0XHRzdXBlci5kaXNwb3NlKCk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9nZW5lcmF0b3IgIT09IG51bGwgKSB0aGlzLl9nZW5lcmF0b3IuZGlzcG9zZSgpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBQTVJFTU5vZGU7XHJcblxyXG4vKipcclxuICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIGN1YmUgbWFwIGltYWdlIGhhcyBiZWVuIGZ1bGx5IGxvYWRlZC5cclxuICpcclxuICogQHByaXZhdGVcclxuICogQHBhcmFtIHs/QXJyYXk8KEltYWdlfE9iamVjdCk+fSBbaW1hZ2VdIC0gVGhlIGN1YmUgbWFwIGltYWdlLlxyXG4gKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBnaXZlbiBjdWJlIG1hcCBpcyByZWFkeSBvciBub3QuXHJcbiAqL1xyXG5mdW5jdGlvbiBpc0N1YmVNYXBSZWFkeSggaW1hZ2UgKSB7XHJcblxyXG5cdGlmICggaW1hZ2UgPT09IG51bGwgfHwgaW1hZ2UgPT09IHVuZGVmaW5lZCApIHJldHVybiBmYWxzZTtcclxuXHJcblx0bGV0IGNvdW50ID0gMDtcclxuXHRjb25zdCBsZW5ndGggPSA2O1xyXG5cclxuXHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0aWYgKCBpbWFnZVsgaSBdICE9PSB1bmRlZmluZWQgKSBjb3VudCArKztcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gY291bnQgPT09IGxlbmd0aDtcclxuXHJcblxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIGVxdWlyZWN0YW5ndWxhciBpbWFnZSBoYXMgYmVlbiBmdWxseSBsb2FkZWQuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBwYXJhbSB7KEltYWdlfE9iamVjdCl9IGltYWdlIC0gVGhlIGVxdWlyZWN0YW5ndWxhciBpbWFnZS5cclxuICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZ2l2ZW4gY3ViZSBtYXAgaXMgcmVhZHkgb3Igbm90LlxyXG4gKi9cclxuZnVuY3Rpb24gaXNFcXVpcmVjdGFuZ3VsYXJNYXBSZWFkeSggaW1hZ2UgKSB7XHJcblxyXG5cdGlmICggaW1hZ2UgPT09IG51bGwgfHwgaW1hZ2UgPT09IHVuZGVmaW5lZCApIHJldHVybiBmYWxzZTtcclxuXHJcblx0cmV0dXJuIGltYWdlLmhlaWdodCA+IDA7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIFBNUkVNIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7VGV4dHVyZX0gdmFsdWUgLSBUaGUgaW5wdXQgdGV4dHVyZS5cclxuICogQHBhcmFtIHs/Tm9kZTx2ZWMyPn0gW3V2Tm9kZT1udWxsXSAtIFRoZSB1diBub2RlLlxyXG4gKiBAcGFyYW0gez9Ob2RlPGZsb2F0Pn0gW2xldmVsTm9kZT1udWxsXSAtIFRoZSBsZXZlbCBub2RlLlxyXG4gKiBAcmV0dXJucyB7UE1SRU1Ob2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHBtcmVtVGV4dHVyZSA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBQTVJFTU5vZGUgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDEsIDMgKTtcclxuIiwiaW1wb3J0IExpZ2h0aW5nTm9kZSBmcm9tICcuL0xpZ2h0aW5nTm9kZS5qcyc7XHJcbmltcG9ydCB7IGNhY2hlIH0gZnJvbSAnLi4vY29yZS9DYWNoZU5vZGUuanMnO1xyXG5pbXBvcnQgeyByb3VnaG5lc3MsIGNsZWFyY29hdFJvdWdobmVzcyB9IGZyb20gJy4uL2NvcmUvUHJvcGVydHlOb2RlLmpzJztcclxuaW1wb3J0IHsgY2FtZXJhVmlld01hdHJpeCB9IGZyb20gJy4uL2FjY2Vzc29ycy9DYW1lcmEuanMnO1xyXG5pbXBvcnQgeyB0cmFuc2Zvcm1lZENsZWFyY29hdE5vcm1hbFZpZXcsIHRyYW5zZm9ybWVkTm9ybWFsVmlldywgdHJhbnNmb3JtZWROb3JtYWxXb3JsZCB9IGZyb20gJy4uL2FjY2Vzc29ycy9Ob3JtYWwuanMnO1xyXG5pbXBvcnQgeyBwb3NpdGlvblZpZXdEaXJlY3Rpb24gfSBmcm9tICcuLi9hY2Nlc3NvcnMvUG9zaXRpb24uanMnO1xyXG5pbXBvcnQgeyBmbG9hdCB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuaW1wb3J0IHsgdHJhbnNmb3JtZWRCZW50Tm9ybWFsVmlldyB9IGZyb20gJy4uL2FjY2Vzc29ycy9BY2Nlc3NvcnNVdGlscy5qcyc7XHJcbmltcG9ydCB7IHBtcmVtVGV4dHVyZSB9IGZyb20gJy4uL3BtcmVtL1BNUkVNTm9kZS5qcyc7XHJcbmltcG9ydCB7IG1hdGVyaWFsRW52SW50ZW5zaXR5IH0gZnJvbSAnLi4vYWNjZXNzb3JzL01hdGVyaWFsUHJvcGVydGllcy5qcyc7XHJcblxyXG5jb25zdCBfZW52Tm9kZUNhY2hlID0gbmV3IFdlYWtNYXAoKTtcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIGEgcGh5c2ljYWwgbW9kZWwgZm9yIEltYWdlLWJhc2VkIGxpZ2h0aW5nIChJQkwpLiBUaGUgZW52aXJvbm1lbnRcclxuICogaXMgZGVmaW5lZCB2aWEgZW52aXJvbm1lbnQgbWFwcyBpbiB0aGUgZXF1aXJlY3Rhbmd1bGFyLCBjdWJlIG1hcCBvciBjdWJlVVYgKFBNUkVNKSBmb3JtYXQuXHJcbiAqIGBFbnZpcm9ubWVudE5vZGVgIGlzIGludGVuZGVkIGZvciBQQlIgbWF0ZXJpYWxzIGxpa2Uge0BsaW5rIE1lc2hTdGFuZGFyZE5vZGVNYXRlcmlhbH0uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBMaWdodGluZ05vZGVcclxuICovXHJcbmNsYXNzIEVudmlyb25tZW50Tm9kZSBleHRlbmRzIExpZ2h0aW5nTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ0Vudmlyb25tZW50Tm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBlbnZpcm9ubWVudCBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlfSBbZW52Tm9kZT1udWxsXSAtIEEgbm9kZSByZXByZXNlbnRpbmcgdGhlIGVudmlyb25tZW50LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBlbnZOb2RlID0gbnVsbCApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBub2RlIHJlcHJlc2VudGluZyB0aGUgZW52aXJvbm1lbnQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmVudk5vZGUgPSBlbnZOb2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdHNldHVwKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IHsgbWF0ZXJpYWwgfSA9IGJ1aWxkZXI7XHJcblxyXG5cdFx0bGV0IGVudk5vZGUgPSB0aGlzLmVudk5vZGU7XHJcblxyXG5cdFx0aWYgKCBlbnZOb2RlLmlzVGV4dHVyZU5vZGUgfHwgZW52Tm9kZS5pc01hdGVyaWFsUmVmZXJlbmNlTm9kZSApIHtcclxuXHJcblx0XHRcdGNvbnN0IHZhbHVlID0gKCBlbnZOb2RlLmlzVGV4dHVyZU5vZGUgKSA/IGVudk5vZGUudmFsdWUgOiBtYXRlcmlhbFsgZW52Tm9kZS5wcm9wZXJ0eSBdO1xyXG5cclxuXHRcdFx0bGV0IGNhY2hlRW52Tm9kZSA9IF9lbnZOb2RlQ2FjaGUuZ2V0KCB2YWx1ZSApO1xyXG5cclxuXHRcdFx0aWYgKCBjYWNoZUVudk5vZGUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0Y2FjaGVFbnZOb2RlID0gcG1yZW1UZXh0dXJlKCB2YWx1ZSApO1xyXG5cclxuXHRcdFx0XHRfZW52Tm9kZUNhY2hlLnNldCggdmFsdWUsIGNhY2hlRW52Tm9kZSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZW52Tm9kZVx0PSBjYWNoZUVudk5vZGU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0Y29uc3QgdXNlQW5pc290cm9weSA9IG1hdGVyaWFsLnVzZUFuaXNvdHJvcHkgPT09IHRydWUgfHwgbWF0ZXJpYWwuYW5pc290cm9weSA+IDA7XHJcblx0XHRjb25zdCByYWRpYW5jZU5vcm1hbFZpZXcgPSB1c2VBbmlzb3Ryb3B5ID8gdHJhbnNmb3JtZWRCZW50Tm9ybWFsVmlldyA6IHRyYW5zZm9ybWVkTm9ybWFsVmlldztcclxuXHJcblx0XHRjb25zdCByYWRpYW5jZSA9IGVudk5vZGUuY29udGV4dCggY3JlYXRlUmFkaWFuY2VDb250ZXh0KCByb3VnaG5lc3MsIHJhZGlhbmNlTm9ybWFsVmlldyApICkubXVsKCBtYXRlcmlhbEVudkludGVuc2l0eSApO1xyXG5cdFx0Y29uc3QgaXJyYWRpYW5jZSA9IGVudk5vZGUuY29udGV4dCggY3JlYXRlSXJyYWRpYW5jZUNvbnRleHQoIHRyYW5zZm9ybWVkTm9ybWFsV29ybGQgKSApLm11bCggTWF0aC5QSSApLm11bCggbWF0ZXJpYWxFbnZJbnRlbnNpdHkgKTtcclxuXHJcblx0XHRjb25zdCBpc29sYXRlUmFkaWFuY2UgPSBjYWNoZSggcmFkaWFuY2UgKTtcclxuXHRcdGNvbnN0IGlzb2xhdGVJcnJhZGlhbmNlID0gY2FjaGUoIGlycmFkaWFuY2UgKTtcclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGJ1aWxkZXIuY29udGV4dC5yYWRpYW5jZS5hZGRBc3NpZ24oIGlzb2xhdGVSYWRpYW5jZSApO1xyXG5cclxuXHRcdGJ1aWxkZXIuY29udGV4dC5pYmxJcnJhZGlhbmNlLmFkZEFzc2lnbiggaXNvbGF0ZUlycmFkaWFuY2UgKTtcclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGNvbnN0IGNsZWFyY29hdFJhZGlhbmNlID0gYnVpbGRlci5jb250ZXh0LmxpZ2h0aW5nTW9kZWwuY2xlYXJjb2F0UmFkaWFuY2U7XHJcblxyXG5cdFx0aWYgKCBjbGVhcmNvYXRSYWRpYW5jZSApIHtcclxuXHJcblx0XHRcdGNvbnN0IGNsZWFyY29hdFJhZGlhbmNlQ29udGV4dCA9IGVudk5vZGUuY29udGV4dCggY3JlYXRlUmFkaWFuY2VDb250ZXh0KCBjbGVhcmNvYXRSb3VnaG5lc3MsIHRyYW5zZm9ybWVkQ2xlYXJjb2F0Tm9ybWFsVmlldyApICkubXVsKCBtYXRlcmlhbEVudkludGVuc2l0eSApO1xyXG5cdFx0XHRjb25zdCBpc29sYXRlQ2xlYXJjb2F0UmFkaWFuY2UgPSBjYWNoZSggY2xlYXJjb2F0UmFkaWFuY2VDb250ZXh0ICk7XHJcblxyXG5cdFx0XHRjbGVhcmNvYXRSYWRpYW5jZS5hZGRBc3NpZ24oIGlzb2xhdGVDbGVhcmNvYXRSYWRpYW5jZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgRW52aXJvbm1lbnROb2RlO1xyXG5cclxuY29uc3QgY3JlYXRlUmFkaWFuY2VDb250ZXh0ID0gKCByb3VnaG5lc3NOb2RlLCBub3JtYWxWaWV3Tm9kZSApID0+IHtcclxuXHJcblx0bGV0IHJlZmxlY3RWZWMgPSBudWxsO1xyXG5cclxuXHRyZXR1cm4ge1xyXG5cdFx0Z2V0VVY6ICgpID0+IHtcclxuXHJcblx0XHRcdGlmICggcmVmbGVjdFZlYyA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0cmVmbGVjdFZlYyA9IHBvc2l0aW9uVmlld0RpcmVjdGlvbi5uZWdhdGUoKS5yZWZsZWN0KCBub3JtYWxWaWV3Tm9kZSApO1xyXG5cclxuXHRcdFx0XHQvLyBNaXhpbmcgdGhlIHJlZmxlY3Rpb24gd2l0aCB0aGUgbm9ybWFsIGlzIG1vcmUgYWNjdXJhdGUgYW5kIGtlZXBzIHJvdWdoIG9iamVjdHMgZnJvbSBnYXRoZXJpbmcgbGlnaHQgZnJvbSBiZWhpbmQgdGhlaXIgdGFuZ2VudCBwbGFuZS5cclxuXHRcdFx0XHRyZWZsZWN0VmVjID0gcm91Z2huZXNzTm9kZS5tdWwoIHJvdWdobmVzc05vZGUgKS5taXgoIHJlZmxlY3RWZWMsIG5vcm1hbFZpZXdOb2RlICkubm9ybWFsaXplKCk7XHJcblxyXG5cdFx0XHRcdHJlZmxlY3RWZWMgPSByZWZsZWN0VmVjLnRyYW5zZm9ybURpcmVjdGlvbiggY2FtZXJhVmlld01hdHJpeCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIHJlZmxlY3RWZWM7XHJcblxyXG5cdFx0fSxcclxuXHRcdGdldFRleHR1cmVMZXZlbDogKCkgPT4ge1xyXG5cclxuXHRcdFx0cmV0dXJuIHJvdWdobmVzc05vZGU7XHJcblxyXG5cdFx0fVxyXG5cdH07XHJcblxyXG59O1xyXG5cclxuY29uc3QgY3JlYXRlSXJyYWRpYW5jZUNvbnRleHQgPSAoIG5vcm1hbFdvcmxkTm9kZSApID0+IHtcclxuXHJcblx0cmV0dXJuIHtcclxuXHRcdGdldFVWOiAoKSA9PiB7XHJcblxyXG5cdFx0XHRyZXR1cm4gbm9ybWFsV29ybGROb2RlO1xyXG5cclxuXHRcdH0sXHJcblx0XHRnZXRUZXh0dXJlTGV2ZWw6ICgpID0+IHtcclxuXHJcblx0XHRcdHJldHVybiBmbG9hdCggMS4wICk7XHJcblxyXG5cdFx0fVxyXG5cdH07XHJcblxyXG59O1xyXG4iLCJpbXBvcnQgTm9kZU1hdGVyaWFsIGZyb20gJy4vTm9kZU1hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgZGlmZnVzZUNvbG9yLCBtZXRhbG5lc3MsIHJvdWdobmVzcywgc3BlY3VsYXJDb2xvciwgc3BlY3VsYXJGOTAgfSBmcm9tICcuLi8uLi9ub2Rlcy9jb3JlL1Byb3BlcnR5Tm9kZS5qcyc7XHJcbmltcG9ydCB7IG1peCB9IGZyb20gJy4uLy4uL25vZGVzL21hdGgvTWF0aE5vZGUuanMnO1xyXG5pbXBvcnQgeyBtYXRlcmlhbFJvdWdobmVzcywgbWF0ZXJpYWxNZXRhbG5lc3MgfSBmcm9tICcuLi8uLi9ub2Rlcy9hY2Nlc3NvcnMvTWF0ZXJpYWxOb2RlLmpzJztcclxuaW1wb3J0IGdldFJvdWdobmVzcyBmcm9tICcuLi8uLi9ub2Rlcy9mdW5jdGlvbnMvbWF0ZXJpYWwvZ2V0Um91Z2huZXNzLmpzJztcclxuaW1wb3J0IFBoeXNpY2FsTGlnaHRpbmdNb2RlbCBmcm9tICcuLi8uLi9ub2Rlcy9mdW5jdGlvbnMvUGh5c2ljYWxMaWdodGluZ01vZGVsLmpzJztcclxuaW1wb3J0IEVudmlyb25tZW50Tm9kZSBmcm9tICcuLi8uLi9ub2Rlcy9saWdodGluZy9FbnZpcm9ubWVudE5vZGUuanMnO1xyXG5pbXBvcnQgeyBmbG9hdCwgdmVjMywgdmVjNCB9IGZyb20gJy4uLy4uL25vZGVzL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbmltcG9ydCB7IE1lc2hTdGFuZGFyZE1hdGVyaWFsIH0gZnJvbSAnLi4vTWVzaFN0YW5kYXJkTWF0ZXJpYWwuanMnO1xyXG5cclxuY29uc3QgX2RlZmF1bHRWYWx1ZXMgPSAvKkBfX1BVUkVfXyovIG5ldyBNZXNoU3RhbmRhcmRNYXRlcmlhbCgpO1xyXG5cclxuLyoqXHJcbiAqIE5vZGUgbWF0ZXJpYWwgdmVyc2lvbiBvZiB7QGxpbmsgTWVzaFN0YW5kYXJkTWF0ZXJpYWx9LlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTm9kZU1hdGVyaWFsXHJcbiAqL1xyXG5jbGFzcyBNZXNoU3RhbmRhcmROb2RlTWF0ZXJpYWwgZXh0ZW5kcyBOb2RlTWF0ZXJpYWwge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdNZXNoU3RhbmRhcmROb2RlTWF0ZXJpYWwnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbWVzaCBzdGFuZGFyZCBub2RlIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbWV0ZXJzXSAtIFRoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVycyApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc01lc2hTdGFuZGFyZE5vZGVNYXRlcmlhbCA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTZXQgdG8gYHRydWVgIGJlY2F1c2Ugc3RhbmRhcmQgbWF0ZXJpYWxzIHJlYWN0IG9uIGxpZ2h0cy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5saWdodHMgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGVtaXNzaXZlIGNvbG9yIG9mIHN0YW5kYXJkIG1hdGVyaWFscyBpcyBieSBkZWZhdWx0IGluZmVycmVkIGZyb20gdGhlIGBlbWlzc2l2ZWAsXHJcblx0XHQgKiBgZW1pc3NpdmVJbnRlbnNpdHlgIGFuZCBgZW1pc3NpdmVNYXBgIHByb3BlcnRpZXMuIFRoaXMgbm9kZSBwcm9wZXJ0eSBhbGxvd3MgdG9cclxuXHRcdCAqIG92ZXJ3cml0ZSB0aGUgZGVmYXVsdCBhbmQgZGVmaW5lIHRoZSBlbWlzc2l2ZSBjb2xvciB3aXRoIGEgbm9kZSBpbnN0ZWFkLlxyXG5cdFx0ICpcclxuXHRcdCAqIElmIHlvdSBkb24ndCB3YW50IHRvIG92ZXJ3cml0ZSB0aGUgZW1pc3NpdmUgY29sb3IgYnV0IG1vZGlmeSB0aGUgZXhpc3RpbmdcclxuXHRcdCAqIHZhbHVlIGluc3RlYWQsIHVzZSB7QGxpbmsgbWF0ZXJpYWxFbWlzc2l2ZX0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPHZlYzM+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmVtaXNzaXZlTm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbWV0YWxuZXNzIG9mIHN0YW5kYXJkIG1hdGVyaWFscyBpcyBieSBkZWZhdWx0IGluZmVycmVkIGZyb20gdGhlIGBtZXRhbG5lc3NgLFxyXG5cdFx0ICogYW5kIGBtZXRhbG5lc3NNYXBgIHByb3BlcnRpZXMuIFRoaXMgbm9kZSBwcm9wZXJ0eSBhbGxvd3MgdG9cclxuXHRcdCAqIG92ZXJ3cml0ZSB0aGUgZGVmYXVsdCBhbmQgZGVmaW5lIHRoZSBtZXRhbG5lc3Mgd2l0aCBhIG5vZGUgaW5zdGVhZC5cclxuXHRcdCAqXHJcblx0XHQgKiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBvdmVyd3JpdGUgdGhlIG1ldGFsbmVzcyBidXQgbW9kaWZ5IHRoZSBleGlzdGluZ1xyXG5cdFx0ICogdmFsdWUgaW5zdGVhZCwgdXNlIHtAbGluayBtYXRlcmlhbE1ldGFsbmVzc30uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPGZsb2F0Pn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tZXRhbG5lc3NOb2RlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByb3VnaG5lc3Mgb2Ygc3RhbmRhcmQgbWF0ZXJpYWxzIGlzIGJ5IGRlZmF1bHQgaW5mZXJyZWQgZnJvbSB0aGUgYHJvdWdobmVzc2AsXHJcblx0XHQgKiBhbmQgYHJvdWdobmVzc01hcGAgcHJvcGVydGllcy4gVGhpcyBub2RlIHByb3BlcnR5IGFsbG93cyB0b1xyXG5cdFx0ICogb3ZlcndyaXRlIHRoZSBkZWZhdWx0IGFuZCBkZWZpbmUgdGhlIHJvdWdobmVzcyB3aXRoIGEgbm9kZSBpbnN0ZWFkLlxyXG5cdFx0ICpcclxuXHRcdCAqIElmIHlvdSBkb24ndCB3YW50IHRvIG92ZXJ3cml0ZSB0aGUgcm91Z2huZXNzIGJ1dCBtb2RpZnkgdGhlIGV4aXN0aW5nXHJcblx0XHQgKiB2YWx1ZSBpbnN0ZWFkLCB1c2Uge0BsaW5rIG1hdGVyaWFsUm91Z2huZXNzfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGU8ZmxvYXQ+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJvdWdobmVzc05vZGUgPSBudWxsO1xyXG5cclxuXHRcdHRoaXMuc2V0RGVmYXVsdFZhbHVlcyggX2RlZmF1bHRWYWx1ZXMgKTtcclxuXHJcblx0XHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE92ZXJ3cml0dGVuIHNpbmNlIHRoaXMgdHlwZSBvZiBtYXRlcmlhbCB1c2VzIHtAbGluayBFbnZpcm9ubWVudE5vZGV9XHJcblx0ICogdG8gaW1wbGVtZW50IHRoZSBQQlIgKFBNUkVNIGJhc2VkKSBlbnZpcm9ubWVudCBtYXBwaW5nLiBCZXNpZGVzLCB0aGVcclxuXHQgKiBtZXRob2QgaG9ub3JzIGBTY2VuZS5lbnZpcm9ubWVudGAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4gez9FbnZpcm9ubWVudE5vZGU8dmVjMz59IFRoZSBlbnZpcm9ubWVudCBub2RlLlxyXG5cdCAqL1xyXG5cdHNldHVwRW52aXJvbm1lbnQoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0bGV0IGVudk5vZGUgPSBzdXBlci5zZXR1cEVudmlyb25tZW50KCBidWlsZGVyICk7XHJcblxyXG5cdFx0aWYgKCBlbnZOb2RlID09PSBudWxsICYmIGJ1aWxkZXIuZW52aXJvbm1lbnROb2RlICkge1xyXG5cclxuXHRcdFx0ZW52Tm9kZSA9IGJ1aWxkZXIuZW52aXJvbm1lbnROb2RlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZW52Tm9kZSA/IG5ldyBFbnZpcm9ubWVudE5vZGUoIGVudk5vZGUgKSA6IG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0dXBzIHRoZSBsaWdodGluZyBtb2RlbC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1BoeXNpY2FsTGlnaHRpbmdNb2RlbH0gVGhlIGxpZ2h0aW5nIG1vZGVsLlxyXG5cdCAqL1xyXG5cdHNldHVwTGlnaHRpbmdNb2RlbCggLypidWlsZGVyKi8gKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBQaHlzaWNhbExpZ2h0aW5nTW9kZWwoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXR1cHMgdGhlIHNwZWN1bGFyIHJlbGF0ZWQgbm9kZSB2YXJpYWJsZXMuXHJcblx0ICovXHJcblx0c2V0dXBTcGVjdWxhcigpIHtcclxuXHJcblx0XHRjb25zdCBzcGVjdWxhckNvbG9yTm9kZSA9IG1peCggdmVjMyggMC4wNCApLCBkaWZmdXNlQ29sb3IucmdiLCBtZXRhbG5lc3MgKTtcclxuXHJcblx0XHRzcGVjdWxhckNvbG9yLmFzc2lnbiggc3BlY3VsYXJDb2xvck5vZGUgKTtcclxuXHRcdHNwZWN1bGFyRjkwLmFzc2lnbiggMS4wICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0dXBzIHRoZSBzdGFuZGFyZCBzcGVjaWZpYyBub2RlIHZhcmlhYmxlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICovXHJcblx0c2V0dXBWYXJpYW50cygpIHtcclxuXHJcblx0XHQvLyBNRVRBTE5FU1NcclxuXHJcblx0XHRjb25zdCBtZXRhbG5lc3NOb2RlID0gdGhpcy5tZXRhbG5lc3NOb2RlID8gZmxvYXQoIHRoaXMubWV0YWxuZXNzTm9kZSApIDogbWF0ZXJpYWxNZXRhbG5lc3M7XHJcblxyXG5cdFx0bWV0YWxuZXNzLmFzc2lnbiggbWV0YWxuZXNzTm9kZSApO1xyXG5cclxuXHRcdC8vIFJPVUdITkVTU1xyXG5cclxuXHRcdGxldCByb3VnaG5lc3NOb2RlID0gdGhpcy5yb3VnaG5lc3NOb2RlID8gZmxvYXQoIHRoaXMucm91Z2huZXNzTm9kZSApIDogbWF0ZXJpYWxSb3VnaG5lc3M7XHJcblx0XHRyb3VnaG5lc3NOb2RlID0gZ2V0Um91Z2huZXNzKCB7IHJvdWdobmVzczogcm91Z2huZXNzTm9kZSB9ICk7XHJcblxyXG5cdFx0cm91Z2huZXNzLmFzc2lnbiggcm91Z2huZXNzTm9kZSApO1xyXG5cclxuXHRcdC8vIFNQRUNVTEFSIENPTE9SXHJcblxyXG5cdFx0dGhpcy5zZXR1cFNwZWN1bGFyKCk7XHJcblxyXG5cdFx0Ly8gRElGRlVTRSBDT0xPUlxyXG5cclxuXHRcdGRpZmZ1c2VDb2xvci5hc3NpZ24oIHZlYzQoIGRpZmZ1c2VDb2xvci5yZ2IubXVsKCBtZXRhbG5lc3NOb2RlLm9uZU1pbnVzKCkgKSwgZGlmZnVzZUNvbG9yLmEgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHR0aGlzLmVtaXNzaXZlTm9kZSA9IHNvdXJjZS5lbWlzc2l2ZU5vZGU7XHJcblxyXG5cdFx0dGhpcy5tZXRhbG5lc3NOb2RlID0gc291cmNlLm1ldGFsbmVzc05vZGU7XHJcblx0XHR0aGlzLnJvdWdobmVzc05vZGUgPSBzb3VyY2Uucm91Z2huZXNzTm9kZTtcclxuXHJcblx0XHRyZXR1cm4gc3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IE1lc2hTdGFuZGFyZE5vZGVNYXRlcmlhbDtcclxuIiwiaW1wb3J0IHsgY2xlYXJjb2F0LCBjbGVhcmNvYXRSb3VnaG5lc3MsIHNoZWVuLCBzaGVlblJvdWdobmVzcywgaXJpZGVzY2VuY2UsIGlyaWRlc2NlbmNlSU9SLCBpcmlkZXNjZW5jZVRoaWNrbmVzcywgc3BlY3VsYXJDb2xvciwgc3BlY3VsYXJGOTAsIGRpZmZ1c2VDb2xvciwgbWV0YWxuZXNzLCByb3VnaG5lc3MsIGFuaXNvdHJvcHksIGFscGhhVCwgYW5pc290cm9weVQsIGFuaXNvdHJvcHlCLCBpb3IsIHRyYW5zbWlzc2lvbiwgdGhpY2tuZXNzLCBhdHRlbnVhdGlvbkRpc3RhbmNlLCBhdHRlbnVhdGlvbkNvbG9yLCBkaXNwZXJzaW9uIH0gZnJvbSAnLi4vLi4vbm9kZXMvY29yZS9Qcm9wZXJ0eU5vZGUuanMnO1xyXG5pbXBvcnQgeyBtYXRlcmlhbENsZWFyY29hdCwgbWF0ZXJpYWxDbGVhcmNvYXRSb3VnaG5lc3MsIG1hdGVyaWFsQ2xlYXJjb2F0Tm9ybWFsLCBtYXRlcmlhbFNoZWVuLCBtYXRlcmlhbFNoZWVuUm91Z2huZXNzLCBtYXRlcmlhbElyaWRlc2NlbmNlLCBtYXRlcmlhbElyaWRlc2NlbmNlSU9SLCBtYXRlcmlhbElyaWRlc2NlbmNlVGhpY2tuZXNzLCBtYXRlcmlhbFNwZWN1bGFySW50ZW5zaXR5LCBtYXRlcmlhbFNwZWN1bGFyQ29sb3IsIG1hdGVyaWFsQW5pc290cm9weSwgbWF0ZXJpYWxJT1IsIG1hdGVyaWFsVHJhbnNtaXNzaW9uLCBtYXRlcmlhbFRoaWNrbmVzcywgbWF0ZXJpYWxBdHRlbnVhdGlvbkRpc3RhbmNlLCBtYXRlcmlhbEF0dGVudWF0aW9uQ29sb3IsIG1hdGVyaWFsRGlzcGVyc2lvbiB9IGZyb20gJy4uLy4uL25vZGVzL2FjY2Vzc29ycy9NYXRlcmlhbE5vZGUuanMnO1xyXG5pbXBvcnQgeyBmbG9hdCwgdmVjMiwgdmVjMywgSWYgfSBmcm9tICcuLi8uLi9ub2Rlcy90c2wvVFNMQmFzZS5qcyc7XHJcbmltcG9ydCBnZXRSb3VnaG5lc3MgZnJvbSAnLi4vLi4vbm9kZXMvZnVuY3Rpb25zL21hdGVyaWFsL2dldFJvdWdobmVzcy5qcyc7XHJcbmltcG9ydCB7IFRCTlZpZXdNYXRyaXggfSBmcm9tICcuLi8uLi9ub2Rlcy9hY2Nlc3NvcnMvQWNjZXNzb3JzVXRpbHMuanMnO1xyXG5pbXBvcnQgUGh5c2ljYWxMaWdodGluZ01vZGVsIGZyb20gJy4uLy4uL25vZGVzL2Z1bmN0aW9ucy9QaHlzaWNhbExpZ2h0aW5nTW9kZWwuanMnO1xyXG5pbXBvcnQgTWVzaFN0YW5kYXJkTm9kZU1hdGVyaWFsIGZyb20gJy4vTWVzaFN0YW5kYXJkTm9kZU1hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgbWl4LCBwb3cyLCBtaW4gfSBmcm9tICcuLi8uLi9ub2Rlcy9tYXRoL01hdGhOb2RlLmpzJztcclxuXHJcbmltcG9ydCB7IE1lc2hQaHlzaWNhbE1hdGVyaWFsIH0gZnJvbSAnLi4vTWVzaFBoeXNpY2FsTWF0ZXJpYWwuanMnO1xyXG5cclxuY29uc3QgX2RlZmF1bHRWYWx1ZXMgPSAvKkBfX1BVUkVfXyovIG5ldyBNZXNoUGh5c2ljYWxNYXRlcmlhbCgpO1xyXG5cclxuLyoqXHJcbiAqIE5vZGUgbWF0ZXJpYWwgdmVyc2lvbiBvZiB7QGxpbmsgTWVzaFBoeXNpY2FsTWF0ZXJpYWx9LlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTWVzaFN0YW5kYXJkTm9kZU1hdGVyaWFsXHJcbiAqL1xyXG5jbGFzcyBNZXNoUGh5c2ljYWxOb2RlTWF0ZXJpYWwgZXh0ZW5kcyBNZXNoU3RhbmRhcmROb2RlTWF0ZXJpYWwge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdNZXNoUGh5c2ljYWxOb2RlTWF0ZXJpYWwnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbWVzaCBwaHlzaWNhbCBub2RlIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbWV0ZXJzXSAtIFRoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVycyApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc01lc2hQaHlzaWNhbE5vZGVNYXRlcmlhbCA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY2xlYXJjb2F0IG9mIHBoeXNpY2FsIG1hdGVyaWFscyBpcyBieSBkZWZhdWx0IGluZmVycmVkIGZyb20gdGhlIGBjbGVhcmNvYXRgXHJcblx0XHQgKiBhbmQgYGNsZWFyY29hdE1hcGAgcHJvcGVydGllcy4gVGhpcyBub2RlIHByb3BlcnR5IGFsbG93cyB0byBvdmVyd3JpdGUgdGhlIGRlZmF1bHRcclxuXHRcdCAqIGFuZCBkZWZpbmUgdGhlIGNsZWFyY29hdCB3aXRoIGEgbm9kZSBpbnN0ZWFkLlxyXG5cdFx0ICpcclxuXHRcdCAqIElmIHlvdSBkb24ndCB3YW50IHRvIG92ZXJ3cml0ZSB0aGUgY2xlYXJjb2F0IGJ1dCBtb2RpZnkgdGhlIGV4aXN0aW5nXHJcblx0XHQgKiB2YWx1ZSBpbnN0ZWFkLCB1c2Uge0BsaW5rIG1hdGVyaWFsQ2xlYXJjb2F0fS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGU8ZmxvYXQ+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNsZWFyY29hdE5vZGUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNsZWFyY29hdCByb3VnaG5lc3Mgb2YgcGh5c2ljYWwgbWF0ZXJpYWxzIGlzIGJ5IGRlZmF1bHQgaW5mZXJyZWQgZnJvbSB0aGUgYGNsZWFyY29hdFJvdWdobmVzc2BcclxuXHRcdCAqIGFuZCBgY2xlYXJjb2F0Um91Z2huZXNzTWFwYCBwcm9wZXJ0aWVzLiBUaGlzIG5vZGUgcHJvcGVydHkgYWxsb3dzIHRvIG92ZXJ3cml0ZSB0aGUgZGVmYXVsdFxyXG5cdFx0ICogYW5kIGRlZmluZSB0aGUgY2xlYXJjb2F0IHJvdWdobmVzcyB3aXRoIGEgbm9kZSBpbnN0ZWFkLlxyXG5cdFx0ICpcclxuXHRcdCAqIElmIHlvdSBkb24ndCB3YW50IHRvIG92ZXJ3cml0ZSB0aGUgY2xlYXJjb2F0IHJvdWdobmVzcyBidXQgbW9kaWZ5IHRoZSBleGlzdGluZ1xyXG5cdFx0ICogdmFsdWUgaW5zdGVhZCwgdXNlIHtAbGluayBtYXRlcmlhbENsZWFyY29hdFJvdWdobmVzc30uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPGZsb2F0Pn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3NOb2RlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjbGVhcmNvYXQgbm9ybWFsIG9mIHBoeXNpY2FsIG1hdGVyaWFscyBpcyBieSBkZWZhdWx0IGluZmVycmVkIGZyb20gdGhlIGBjbGVhcmNvYXROb3JtYWxNYXBgXHJcblx0XHQgKiBwcm9wZXJ0eS4gVGhpcyBub2RlIHByb3BlcnR5IGFsbG93cyB0byBvdmVyd3JpdGUgdGhlIGRlZmF1bHRcclxuXHRcdCAqIGFuZCBkZWZpbmUgdGhlIGNsZWFyY29hdCBub3JtYWwgd2l0aCBhIG5vZGUgaW5zdGVhZC5cclxuXHRcdCAqXHJcblx0XHQgKiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBvdmVyd3JpdGUgdGhlIGNsZWFyY29hdCBub3JtYWwgYnV0IG1vZGlmeSB0aGUgZXhpc3RpbmdcclxuXHRcdCAqIHZhbHVlIGluc3RlYWQsIHVzZSB7QGxpbmsgbWF0ZXJpYWxDbGVhcmNvYXROb3JtYWx9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Tm9kZTx2ZWMzPn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jbGVhcmNvYXROb3JtYWxOb2RlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBzaGVlbiBvZiBwaHlzaWNhbCBtYXRlcmlhbHMgaXMgYnkgZGVmYXVsdCBpbmZlcnJlZCBmcm9tIHRoZSBgc2hlZW5gLCBgc2hlZW5Db2xvcmBcclxuXHRcdCAqIGFuZCBgc2hlZW5Db2xvck1hcGAgcHJvcGVydGllcy4gVGhpcyBub2RlIHByb3BlcnR5IGFsbG93cyB0byBvdmVyd3JpdGUgdGhlIGRlZmF1bHRcclxuXHRcdCAqIGFuZCBkZWZpbmUgdGhlIHNoZWVuIHdpdGggYSBub2RlIGluc3RlYWQuXHJcblx0XHQgKlxyXG5cdFx0ICogSWYgeW91IGRvbid0IHdhbnQgdG8gb3ZlcndyaXRlIHRoZSBzaGVlbiBidXQgbW9kaWZ5IHRoZSBleGlzdGluZ1xyXG5cdFx0ICogdmFsdWUgaW5zdGVhZCwgdXNlIHtAbGluayBtYXRlcmlhbFNoZWVufS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGU8dmVjMz59XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2hlZW5Ob2RlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBzaGVlbiByb3VnaG5lc3Mgb2YgcGh5c2ljYWwgbWF0ZXJpYWxzIGlzIGJ5IGRlZmF1bHQgaW5mZXJyZWQgZnJvbSB0aGUgYHNoZWVuUm91Z2huZXNzYCBhbmRcclxuXHRcdCAqIGBzaGVlblJvdWdobmVzc01hcGAgcHJvcGVydGllcy4gVGhpcyBub2RlIHByb3BlcnR5IGFsbG93cyB0byBvdmVyd3JpdGUgdGhlIGRlZmF1bHRcclxuXHRcdCAqIGFuZCBkZWZpbmUgdGhlIHNoZWVuIHJvdWdobmVzcyB3aXRoIGEgbm9kZSBpbnN0ZWFkLlxyXG5cdFx0ICpcclxuXHRcdCAqIElmIHlvdSBkb24ndCB3YW50IHRvIG92ZXJ3cml0ZSB0aGUgc2hlZW4gcm91Z2huZXNzIGJ1dCBtb2RpZnkgdGhlIGV4aXN0aW5nXHJcblx0XHQgKiB2YWx1ZSBpbnN0ZWFkLCB1c2Uge0BsaW5rIG1hdGVyaWFsU2hlZW5Sb3VnaG5lc3N9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Tm9kZTxmbG9hdD59XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2hlZW5Sb3VnaG5lc3NOb2RlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBpcmlkZXNjZW5jZSBvZiBwaHlzaWNhbCBtYXRlcmlhbHMgaXMgYnkgZGVmYXVsdCBpbmZlcnJlZCBmcm9tIHRoZSBgaXJpZGVzY2VuY2VgXHJcblx0XHQgKiBwcm9wZXJ0eS4gVGhpcyBub2RlIHByb3BlcnR5IGFsbG93cyB0byBvdmVyd3JpdGUgdGhlIGRlZmF1bHRcclxuXHRcdCAqIGFuZCBkZWZpbmUgdGhlIGlyaWRlc2NlbmNlIHdpdGggYSBub2RlIGluc3RlYWQuXHJcblx0XHQgKlxyXG5cdFx0ICogSWYgeW91IGRvbid0IHdhbnQgdG8gb3ZlcndyaXRlIHRoZSBpcmlkZXNjZW5jZSBidXQgbW9kaWZ5IHRoZSBleGlzdGluZ1xyXG5cdFx0ICogdmFsdWUgaW5zdGVhZCwgdXNlIHtAbGluayBtYXRlcmlhbElyaWRlc2NlbmNlfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGU8ZmxvYXQ+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlyaWRlc2NlbmNlTm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgaXJpZGVzY2VuY2UgSU9SIG9mIHBoeXNpY2FsIG1hdGVyaWFscyBpcyBieSBkZWZhdWx0IGluZmVycmVkIGZyb20gdGhlIGBpcmlkZXNjZW5jZUlPUmBcclxuXHRcdCAqIHByb3BlcnR5LiBUaGlzIG5vZGUgcHJvcGVydHkgYWxsb3dzIHRvIG92ZXJ3cml0ZSB0aGUgZGVmYXVsdFxyXG5cdFx0ICogYW5kIGRlZmluZSB0aGUgaXJpZGVzY2VuY2UgSU9SIHdpdGggYSBub2RlIGluc3RlYWQuXHJcblx0XHQgKlxyXG5cdFx0ICogSWYgeW91IGRvbid0IHdhbnQgdG8gb3ZlcndyaXRlIHRoZSBpcmlkZXNjZW5jZSBJT1IgYnV0IG1vZGlmeSB0aGUgZXhpc3RpbmdcclxuXHRcdCAqIHZhbHVlIGluc3RlYWQsIHVzZSB7QGxpbmsgbWF0ZXJpYWxJcmlkZXNjZW5jZUlPUn0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPGZsb2F0Pn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pcmlkZXNjZW5jZUlPUk5vZGUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGlyaWRlc2NlbmNlIHRoaWNrbmVzcyBvZiBwaHlzaWNhbCBtYXRlcmlhbHMgaXMgYnkgZGVmYXVsdCBpbmZlcnJlZCBmcm9tIHRoZSBgaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZWBcclxuXHRcdCAqIGFuZCBgaXJpZGVzY2VuY2VUaGlja25lc3NNYXBgIHByb3BlcnRpZXMuIFRoaXMgbm9kZSBwcm9wZXJ0eSBhbGxvd3MgdG8gb3ZlcndyaXRlIHRoZSBkZWZhdWx0XHJcblx0XHQgKiBhbmQgZGVmaW5lIHRoZSBpcmlkZXNjZW5jZSB0aGlja25lc3Mgd2l0aCBhIG5vZGUgaW5zdGVhZC5cclxuXHRcdCAqXHJcblx0XHQgKiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBvdmVyd3JpdGUgdGhlIGlyaWRlc2NlbmNlIHRoaWNrbmVzcyBidXQgbW9kaWZ5IHRoZSBleGlzdGluZ1xyXG5cdFx0ICogdmFsdWUgaW5zdGVhZCwgdXNlIHtAbGluayBtYXRlcmlhbElyaWRlc2NlbmNlVGhpY2tuZXNzfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGU8ZmxvYXQ+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlyaWRlc2NlbmNlVGhpY2tuZXNzTm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc3BlY3VsYXIgaW50ZW5zaXR5IG9mIHBoeXNpY2FsIG1hdGVyaWFscyBpcyBieSBkZWZhdWx0IGluZmVycmVkIGZyb20gdGhlIGBzcGVjdWxhckludGVuc2l0eWBcclxuXHRcdCAqIGFuZCBgc3BlY3VsYXJJbnRlbnNpdHlNYXBgIHByb3BlcnRpZXMuIFRoaXMgbm9kZSBwcm9wZXJ0eSBhbGxvd3MgdG8gb3ZlcndyaXRlIHRoZSBkZWZhdWx0XHJcblx0XHQgKiBhbmQgZGVmaW5lIHRoZSBzcGVjdWxhciBpbnRlbnNpdHkgd2l0aCBhIG5vZGUgaW5zdGVhZC5cclxuXHRcdCAqXHJcblx0XHQgKiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBvdmVyd3JpdGUgdGhlIHNwZWN1bGFyIGludGVuc2l0eSBidXQgbW9kaWZ5IHRoZSBleGlzdGluZ1xyXG5cdFx0ICogdmFsdWUgaW5zdGVhZCwgdXNlIHtAbGluayBtYXRlcmlhbFNwZWN1bGFySW50ZW5zaXR5fS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGU8ZmxvYXQ+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNwZWN1bGFySW50ZW5zaXR5Tm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc3BlY3VsYXIgY29sb3Igb2YgcGh5c2ljYWwgbWF0ZXJpYWxzIGlzIGJ5IGRlZmF1bHQgaW5mZXJyZWQgZnJvbSB0aGUgYHNwZWN1bGFyQ29sb3JgXHJcblx0XHQgKiBhbmQgYHNwZWN1bGFyQ29sb3JNYXBgIHByb3BlcnRpZXMuIFRoaXMgbm9kZSBwcm9wZXJ0eSBhbGxvd3MgdG8gb3ZlcndyaXRlIHRoZSBkZWZhdWx0XHJcblx0XHQgKiBhbmQgZGVmaW5lIHRoZSBzcGVjdWxhciBjb2xvciB3aXRoIGEgbm9kZSBpbnN0ZWFkLlxyXG5cdFx0ICpcclxuXHRcdCAqIElmIHlvdSBkb24ndCB3YW50IHRvIG92ZXJ3cml0ZSB0aGUgc3BlY3VsYXIgY29sb3IgYnV0IG1vZGlmeSB0aGUgZXhpc3RpbmdcclxuXHRcdCAqIHZhbHVlIGluc3RlYWQsIHVzZSB7QGxpbmsgbWF0ZXJpYWxTcGVjdWxhckNvbG9yfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGU8dmVjMz59XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc3BlY3VsYXJDb2xvck5vZGUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGlvciBvZiBwaHlzaWNhbCBtYXRlcmlhbHMgaXMgYnkgZGVmYXVsdCBpbmZlcnJlZCBmcm9tIHRoZSBgaW9yYFxyXG5cdFx0ICogcHJvcGVydHkuIFRoaXMgbm9kZSBwcm9wZXJ0eSBhbGxvd3MgdG8gb3ZlcndyaXRlIHRoZSBkZWZhdWx0XHJcblx0XHQgKiBhbmQgZGVmaW5lIHRoZSBpb3Igd2l0aCBhIG5vZGUgaW5zdGVhZC5cclxuXHRcdCAqXHJcblx0XHQgKiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBvdmVyd3JpdGUgdGhlIGlvciBidXQgbW9kaWZ5IHRoZSBleGlzdGluZ1xyXG5cdFx0ICogdmFsdWUgaW5zdGVhZCwgdXNlIHtAbGluayBtYXRlcmlhbElPUn0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPGZsb2F0Pn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pb3JOb2RlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB0cmFuc21pc3Npb24gb2YgcGh5c2ljYWwgbWF0ZXJpYWxzIGlzIGJ5IGRlZmF1bHQgaW5mZXJyZWQgZnJvbSB0aGUgYHRyYW5zbWlzc2lvbmAgYW5kXHJcblx0XHQgKiBgdHJhbnNtaXNzaW9uTWFwYCBwcm9wZXJ0aWVzLiBUaGlzIG5vZGUgcHJvcGVydHkgYWxsb3dzIHRvIG92ZXJ3cml0ZSB0aGUgZGVmYXVsdFxyXG5cdFx0ICogYW5kIGRlZmluZSB0aGUgdHJhbnNtaXNzaW9uIHdpdGggYSBub2RlIGluc3RlYWQuXHJcblx0XHQgKlxyXG5cdFx0ICogSWYgeW91IGRvbid0IHdhbnQgdG8gb3ZlcndyaXRlIHRoZSB0cmFuc21pc3Npb24gYnV0IG1vZGlmeSB0aGUgZXhpc3RpbmdcclxuXHRcdCAqIHZhbHVlIGluc3RlYWQsIHVzZSB7QGxpbmsgbWF0ZXJpYWxUcmFuc21pc3Npb259LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Tm9kZTxmbG9hdD59XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudHJhbnNtaXNzaW9uTm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdGhpY2tuZXNzIG9mIHBoeXNpY2FsIG1hdGVyaWFscyBpcyBieSBkZWZhdWx0IGluZmVycmVkIGZyb20gdGhlIGB0aGlja25lc3NgIGFuZFxyXG5cdFx0ICogYHRoaWNrbmVzc01hcGAgcHJvcGVydGllcy4gVGhpcyBub2RlIHByb3BlcnR5IGFsbG93cyB0byBvdmVyd3JpdGUgdGhlIGRlZmF1bHRcclxuXHRcdCAqIGFuZCBkZWZpbmUgdGhlIHRoaWNrbmVzcyB3aXRoIGEgbm9kZSBpbnN0ZWFkLlxyXG5cdFx0ICpcclxuXHRcdCAqIElmIHlvdSBkb24ndCB3YW50IHRvIG92ZXJ3cml0ZSB0aGUgdGhpY2tuZXNzIGJ1dCBtb2RpZnkgdGhlIGV4aXN0aW5nXHJcblx0XHQgKiB2YWx1ZSBpbnN0ZWFkLCB1c2Uge0BsaW5rIG1hdGVyaWFsVGhpY2tuZXNzfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGU8ZmxvYXQ+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRoaWNrbmVzc05vZGUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGF0dGVudWF0aW9uIGRpc3RhbmNlIG9mIHBoeXNpY2FsIG1hdGVyaWFscyBpcyBieSBkZWZhdWx0IGluZmVycmVkIGZyb20gdGhlXHJcblx0XHQgKiBgYXR0ZW51YXRpb25EaXN0YW5jZWAgcHJvcGVydHkuIFRoaXMgbm9kZSBwcm9wZXJ0eSBhbGxvd3MgdG8gb3ZlcndyaXRlIHRoZSBkZWZhdWx0XHJcblx0XHQgKiBhbmQgZGVmaW5lIHRoZSBhdHRlbnVhdGlvbiBkaXN0YW5jZSB3aXRoIGEgbm9kZSBpbnN0ZWFkLlxyXG5cdFx0ICpcclxuXHRcdCAqIElmIHlvdSBkb24ndCB3YW50IHRvIG92ZXJ3cml0ZSB0aGUgYXR0ZW51YXRpb24gZGlzdGFuY2UgYnV0IG1vZGlmeSB0aGUgZXhpc3RpbmdcclxuXHRcdCAqIHZhbHVlIGluc3RlYWQsIHVzZSB7QGxpbmsgbWF0ZXJpYWxBdHRlbnVhdGlvbkRpc3RhbmNlfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGU8ZmxvYXQ+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmF0dGVudWF0aW9uRGlzdGFuY2VOb2RlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBhdHRlbnVhdGlvbiBjb2xvciBvZiBwaHlzaWNhbCBtYXRlcmlhbHMgaXMgYnkgZGVmYXVsdCBpbmZlcnJlZCBmcm9tIHRoZVxyXG5cdFx0ICogYGF0dGVudWF0aW9uQ29sb3JgIHByb3BlcnR5LiBUaGlzIG5vZGUgcHJvcGVydHkgYWxsb3dzIHRvIG92ZXJ3cml0ZSB0aGUgZGVmYXVsdFxyXG5cdFx0ICogYW5kIGRlZmluZSB0aGUgYXR0ZW51YXRpb24gY29sb3Igd2l0aCBhIG5vZGUgaW5zdGVhZC5cclxuXHRcdCAqXHJcblx0XHQgKiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBvdmVyd3JpdGUgdGhlIGF0dGVudWF0aW9uIGNvbG9yIGJ1dCBtb2RpZnkgdGhlIGV4aXN0aW5nXHJcblx0XHQgKiB2YWx1ZSBpbnN0ZWFkLCB1c2Uge0BsaW5rIG1hdGVyaWFsQXR0ZW51YXRpb25Db2xvcn0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPHZlYzM+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmF0dGVudWF0aW9uQ29sb3JOb2RlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBkaXNwZXJzaW9uIG9mIHBoeXNpY2FsIG1hdGVyaWFscyBpcyBieSBkZWZhdWx0IGluZmVycmVkIGZyb20gdGhlXHJcblx0XHQgKiBgZGlzcGVyc2lvbmAgcHJvcGVydHkuIFRoaXMgbm9kZSBwcm9wZXJ0eSBhbGxvd3MgdG8gb3ZlcndyaXRlIHRoZSBkZWZhdWx0XHJcblx0XHQgKiBhbmQgZGVmaW5lIHRoZSBkaXNwZXJzaW9uIHdpdGggYSBub2RlIGluc3RlYWQuXHJcblx0XHQgKlxyXG5cdFx0ICogSWYgeW91IGRvbid0IHdhbnQgdG8gb3ZlcndyaXRlIHRoZSBkaXNwZXJzaW9uIGJ1dCBtb2RpZnkgdGhlIGV4aXN0aW5nXHJcblx0XHQgKiB2YWx1ZSBpbnN0ZWFkLCB1c2Uge0BsaW5rIG1hdGVyaWFsRGlzcGVyc2lvbn0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPGZsb2F0Pn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kaXNwZXJzaW9uTm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYW5pc290cm9weSBvZiBwaHlzaWNhbCBtYXRlcmlhbHMgaXMgYnkgZGVmYXVsdCBpbmZlcnJlZCBmcm9tIHRoZVxyXG5cdFx0ICogYGFuaXNvdHJvcHlgIHByb3BlcnR5LiBUaGlzIG5vZGUgcHJvcGVydHkgYWxsb3dzIHRvIG92ZXJ3cml0ZSB0aGUgZGVmYXVsdFxyXG5cdFx0ICogYW5kIGRlZmluZSB0aGUgYW5pc290cm9weSB3aXRoIGEgbm9kZSBpbnN0ZWFkLlxyXG5cdFx0ICpcclxuXHRcdCAqIElmIHlvdSBkb24ndCB3YW50IHRvIG92ZXJ3cml0ZSB0aGUgYW5pc290cm9weSBidXQgbW9kaWZ5IHRoZSBleGlzdGluZ1xyXG5cdFx0ICogdmFsdWUgaW5zdGVhZCwgdXNlIHtAbGluayBtYXRlcmlhbEFuaXNvdHJvcHl9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Tm9kZTxmbG9hdD59XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYW5pc290cm9weU5vZGUgPSBudWxsO1xyXG5cclxuXHRcdHRoaXMuc2V0RGVmYXVsdFZhbHVlcyggX2RlZmF1bHRWYWx1ZXMgKTtcclxuXHJcblx0XHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdoZXRoZXIgdGhlIGxpZ2h0aW5nIG1vZGVsIHNob3VsZCB1c2UgY2xlYXJjb2F0IG9yIG5vdC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdCAqIEBkZWZhdWx0IHRydWVcclxuXHQgKi9cclxuXHRnZXQgdXNlQ2xlYXJjb2F0KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmNsZWFyY29hdCA+IDAgfHwgdGhpcy5jbGVhcmNvYXROb2RlICE9PSBudWxsO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdoZXRoZXIgdGhlIGxpZ2h0aW5nIG1vZGVsIHNob3VsZCB1c2UgaXJpZGVzY2VuY2Ugb3Igbm90LlxyXG5cdCAqXHJcblx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdCAqL1xyXG5cdGdldCB1c2VJcmlkZXNjZW5jZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5pcmlkZXNjZW5jZSA+IDAgfHwgdGhpcy5pcmlkZXNjZW5jZU5vZGUgIT09IG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogV2hldGhlciB0aGUgbGlnaHRpbmcgbW9kZWwgc2hvdWxkIHVzZSBzaGVlbiBvciBub3QuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0ICovXHJcblx0Z2V0IHVzZVNoZWVuKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnNoZWVuID4gMCB8fCB0aGlzLnNoZWVuTm9kZSAhPT0gbnVsbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBXaGV0aGVyIHRoZSBsaWdodGluZyBtb2RlbCBzaG91bGQgdXNlIGFuaXNvdHJvcHkgb3Igbm90LlxyXG5cdCAqXHJcblx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdCAqL1xyXG5cdGdldCB1c2VBbmlzb3Ryb3B5KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmFuaXNvdHJvcHkgPiAwIHx8IHRoaXMuYW5pc290cm9weU5vZGUgIT09IG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogV2hldGhlciB0aGUgbGlnaHRpbmcgbW9kZWwgc2hvdWxkIHVzZSB0cmFuc21pc3Npb24gb3Igbm90LlxyXG5cdCAqXHJcblx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdCAqL1xyXG5cdGdldCB1c2VUcmFuc21pc3Npb24oKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMudHJhbnNtaXNzaW9uID4gMCB8fCB0aGlzLnRyYW5zbWlzc2lvbk5vZGUgIT09IG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogV2hldGhlciB0aGUgbGlnaHRpbmcgbW9kZWwgc2hvdWxkIHVzZSBkaXNwZXJzaW9uIG9yIG5vdC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdCAqIEBkZWZhdWx0IHRydWVcclxuXHQgKi9cclxuXHRnZXQgdXNlRGlzcGVyc2lvbigpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5kaXNwZXJzaW9uID4gMCB8fCB0aGlzLmRpc3BlcnNpb25Ob2RlICE9PSBudWxsO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHVwcyB0aGUgc3BlY3VsYXIgcmVsYXRlZCBub2RlIHZhcmlhYmxlcy5cclxuXHQgKi9cclxuXHRzZXR1cFNwZWN1bGFyKCkge1xyXG5cclxuXHRcdGNvbnN0IGlvck5vZGUgPSB0aGlzLmlvck5vZGUgPyBmbG9hdCggdGhpcy5pb3JOb2RlICkgOiBtYXRlcmlhbElPUjtcclxuXHJcblx0XHRpb3IuYXNzaWduKCBpb3JOb2RlICk7XHJcblx0XHRzcGVjdWxhckNvbG9yLmFzc2lnbiggbWl4KCBtaW4oIHBvdzIoIGlvci5zdWIoIDEuMCApLmRpdiggaW9yLmFkZCggMS4wICkgKSApLm11bCggbWF0ZXJpYWxTcGVjdWxhckNvbG9yICksIHZlYzMoIDEuMCApICkubXVsKCBtYXRlcmlhbFNwZWN1bGFySW50ZW5zaXR5ICksIGRpZmZ1c2VDb2xvci5yZ2IsIG1ldGFsbmVzcyApICk7XHJcblx0XHRzcGVjdWxhckY5MC5hc3NpZ24oIG1peCggbWF0ZXJpYWxTcGVjdWxhckludGVuc2l0eSwgMS4wLCBtZXRhbG5lc3MgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHVwcyB0aGUgbGlnaHRpbmcgbW9kZWwuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtQaHlzaWNhbExpZ2h0aW5nTW9kZWx9IFRoZSBsaWdodGluZyBtb2RlbC5cclxuXHQgKi9cclxuXHRzZXR1cExpZ2h0aW5nTW9kZWwoIC8qYnVpbGRlciovICkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgUGh5c2ljYWxMaWdodGluZ01vZGVsKCB0aGlzLnVzZUNsZWFyY29hdCwgdGhpcy51c2VTaGVlbiwgdGhpcy51c2VJcmlkZXNjZW5jZSwgdGhpcy51c2VBbmlzb3Ryb3B5LCB0aGlzLnVzZVRyYW5zbWlzc2lvbiwgdGhpcy51c2VEaXNwZXJzaW9uICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0dXBzIHRoZSBwaHlzaWNhbCBzcGVjaWZpYyBub2RlIHZhcmlhYmxlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICovXHJcblx0c2V0dXBWYXJpYW50cyggYnVpbGRlciApIHtcclxuXHJcblx0XHRzdXBlci5zZXR1cFZhcmlhbnRzKCBidWlsZGVyICk7XHJcblxyXG5cdFx0Ly8gQ0xFQVJDT0FUXHJcblxyXG5cdFx0aWYgKCB0aGlzLnVzZUNsZWFyY29hdCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGNsZWFyY29hdE5vZGUgPSB0aGlzLmNsZWFyY29hdE5vZGUgPyBmbG9hdCggdGhpcy5jbGVhcmNvYXROb2RlICkgOiBtYXRlcmlhbENsZWFyY29hdDtcclxuXHRcdFx0Y29uc3QgY2xlYXJjb2F0Um91Z2huZXNzTm9kZSA9IHRoaXMuY2xlYXJjb2F0Um91Z2huZXNzTm9kZSA/IGZsb2F0KCB0aGlzLmNsZWFyY29hdFJvdWdobmVzc05vZGUgKSA6IG1hdGVyaWFsQ2xlYXJjb2F0Um91Z2huZXNzO1xyXG5cclxuXHRcdFx0Y2xlYXJjb2F0LmFzc2lnbiggY2xlYXJjb2F0Tm9kZSApO1xyXG5cdFx0XHRjbGVhcmNvYXRSb3VnaG5lc3MuYXNzaWduKCBnZXRSb3VnaG5lc3MoIHsgcm91Z2huZXNzOiBjbGVhcmNvYXRSb3VnaG5lc3NOb2RlIH0gKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBTSEVFTlxyXG5cclxuXHRcdGlmICggdGhpcy51c2VTaGVlbiApIHtcclxuXHJcblx0XHRcdGNvbnN0IHNoZWVuTm9kZSA9IHRoaXMuc2hlZW5Ob2RlID8gdmVjMyggdGhpcy5zaGVlbk5vZGUgKSA6IG1hdGVyaWFsU2hlZW47XHJcblx0XHRcdGNvbnN0IHNoZWVuUm91Z2huZXNzTm9kZSA9IHRoaXMuc2hlZW5Sb3VnaG5lc3NOb2RlID8gZmxvYXQoIHRoaXMuc2hlZW5Sb3VnaG5lc3NOb2RlICkgOiBtYXRlcmlhbFNoZWVuUm91Z2huZXNzO1xyXG5cclxuXHRcdFx0c2hlZW4uYXNzaWduKCBzaGVlbk5vZGUgKTtcclxuXHRcdFx0c2hlZW5Sb3VnaG5lc3MuYXNzaWduKCBzaGVlblJvdWdobmVzc05vZGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gSVJJREVTQ0VOQ0VcclxuXHJcblx0XHRpZiAoIHRoaXMudXNlSXJpZGVzY2VuY2UgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBpcmlkZXNjZW5jZU5vZGUgPSB0aGlzLmlyaWRlc2NlbmNlTm9kZSA/IGZsb2F0KCB0aGlzLmlyaWRlc2NlbmNlTm9kZSApIDogbWF0ZXJpYWxJcmlkZXNjZW5jZTtcclxuXHRcdFx0Y29uc3QgaXJpZGVzY2VuY2VJT1JOb2RlID0gdGhpcy5pcmlkZXNjZW5jZUlPUk5vZGUgPyBmbG9hdCggdGhpcy5pcmlkZXNjZW5jZUlPUk5vZGUgKSA6IG1hdGVyaWFsSXJpZGVzY2VuY2VJT1I7XHJcblx0XHRcdGNvbnN0IGlyaWRlc2NlbmNlVGhpY2tuZXNzTm9kZSA9IHRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NOb2RlID8gZmxvYXQoIHRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NOb2RlICkgOiBtYXRlcmlhbElyaWRlc2NlbmNlVGhpY2tuZXNzO1xyXG5cclxuXHRcdFx0aXJpZGVzY2VuY2UuYXNzaWduKCBpcmlkZXNjZW5jZU5vZGUgKTtcclxuXHRcdFx0aXJpZGVzY2VuY2VJT1IuYXNzaWduKCBpcmlkZXNjZW5jZUlPUk5vZGUgKTtcclxuXHRcdFx0aXJpZGVzY2VuY2VUaGlja25lc3MuYXNzaWduKCBpcmlkZXNjZW5jZVRoaWNrbmVzc05vZGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQU5JU09UUk9QWVxyXG5cclxuXHRcdGlmICggdGhpcy51c2VBbmlzb3Ryb3B5ICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYW5pc290cm9weVYgPSAoIHRoaXMuYW5pc290cm9weU5vZGUgPyB2ZWMyKCB0aGlzLmFuaXNvdHJvcHlOb2RlICkgOiBtYXRlcmlhbEFuaXNvdHJvcHkgKS50b1ZhcigpO1xyXG5cclxuXHRcdFx0YW5pc290cm9weS5hc3NpZ24oIGFuaXNvdHJvcHlWLmxlbmd0aCgpICk7XHJcblxyXG5cdFx0XHRJZiggYW5pc290cm9weS5lcXVhbCggMC4wICksICgpID0+IHtcclxuXHJcblx0XHRcdFx0YW5pc290cm9weVYuYXNzaWduKCB2ZWMyKCAxLjAsIDAuMCApICk7XHJcblxyXG5cdFx0XHR9ICkuRWxzZSggKCkgPT4ge1xyXG5cclxuXHRcdFx0XHRhbmlzb3Ryb3B5Vi5kaXZBc3NpZ24oIHZlYzIoIGFuaXNvdHJvcHkgKSApO1xyXG5cdFx0XHRcdGFuaXNvdHJvcHkuYXNzaWduKCBhbmlzb3Ryb3B5LnNhdHVyYXRlKCkgKTtcclxuXHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHRcdC8vIFJvdWdobmVzcyBhbG9uZyB0aGUgYW5pc290cm9weSBiaXRhbmdlbnQgaXMgdGhlIG1hdGVyaWFsIHJvdWdobmVzcywgd2hpbGUgdGhlIHRhbmdlbnQgcm91Z2huZXNzIGluY3JlYXNlcyB3aXRoIGFuaXNvdHJvcHkuXHJcblx0XHRcdGFscGhhVC5hc3NpZ24oIGFuaXNvdHJvcHkucG93MigpLm1peCggcm91Z2huZXNzLnBvdzIoKSwgMS4wICkgKTtcclxuXHJcblx0XHRcdGFuaXNvdHJvcHlULmFzc2lnbiggVEJOVmlld01hdHJpeFsgMCBdLm11bCggYW5pc290cm9weVYueCApLmFkZCggVEJOVmlld01hdHJpeFsgMSBdLm11bCggYW5pc290cm9weVYueSApICkgKTtcclxuXHRcdFx0YW5pc290cm9weUIuYXNzaWduKCBUQk5WaWV3TWF0cml4WyAxIF0ubXVsKCBhbmlzb3Ryb3B5Vi54ICkuc3ViKCBUQk5WaWV3TWF0cml4WyAwIF0ubXVsKCBhbmlzb3Ryb3B5Vi55ICkgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBUUkFOU01JU1NJT05cclxuXHJcblx0XHRpZiAoIHRoaXMudXNlVHJhbnNtaXNzaW9uICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdHJhbnNtaXNzaW9uTm9kZSA9IHRoaXMudHJhbnNtaXNzaW9uTm9kZSA/IGZsb2F0KCB0aGlzLnRyYW5zbWlzc2lvbk5vZGUgKSA6IG1hdGVyaWFsVHJhbnNtaXNzaW9uO1xyXG5cdFx0XHRjb25zdCB0aGlja25lc3NOb2RlID0gdGhpcy50aGlja25lc3NOb2RlID8gZmxvYXQoIHRoaXMudGhpY2tuZXNzTm9kZSApIDogbWF0ZXJpYWxUaGlja25lc3M7XHJcblx0XHRcdGNvbnN0IGF0dGVudWF0aW9uRGlzdGFuY2VOb2RlID0gdGhpcy5hdHRlbnVhdGlvbkRpc3RhbmNlTm9kZSA/IGZsb2F0KCB0aGlzLmF0dGVudWF0aW9uRGlzdGFuY2VOb2RlICkgOiBtYXRlcmlhbEF0dGVudWF0aW9uRGlzdGFuY2U7XHJcblx0XHRcdGNvbnN0IGF0dGVudWF0aW9uQ29sb3JOb2RlID0gdGhpcy5hdHRlbnVhdGlvbkNvbG9yTm9kZSA/IHZlYzMoIHRoaXMuYXR0ZW51YXRpb25Db2xvck5vZGUgKSA6IG1hdGVyaWFsQXR0ZW51YXRpb25Db2xvcjtcclxuXHJcblx0XHRcdHRyYW5zbWlzc2lvbi5hc3NpZ24oIHRyYW5zbWlzc2lvbk5vZGUgKTtcclxuXHRcdFx0dGhpY2tuZXNzLmFzc2lnbiggdGhpY2tuZXNzTm9kZSApO1xyXG5cdFx0XHRhdHRlbnVhdGlvbkRpc3RhbmNlLmFzc2lnbiggYXR0ZW51YXRpb25EaXN0YW5jZU5vZGUgKTtcclxuXHRcdFx0YXR0ZW51YXRpb25Db2xvci5hc3NpZ24oIGF0dGVudWF0aW9uQ29sb3JOb2RlICk7XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMudXNlRGlzcGVyc2lvbiApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgZGlzcGVyc2lvbk5vZGUgPSB0aGlzLmRpc3BlcnNpb25Ob2RlID8gZmxvYXQoIHRoaXMuZGlzcGVyc2lvbk5vZGUgKSA6IG1hdGVyaWFsRGlzcGVyc2lvbjtcclxuXHJcblx0XHRcdFx0ZGlzcGVyc2lvbi5hc3NpZ24oIGRpc3BlcnNpb25Ob2RlICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHVwcyB0aGUgY2xlYXJjb2F0IG5vcm1hbCBub2RlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Tm9kZTx2ZWMzPn0gVGhlIGNsZWFyY29hdCBub3JtYWwuXHJcblx0ICovXHJcblx0c2V0dXBDbGVhcmNvYXROb3JtYWwoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuY2xlYXJjb2F0Tm9ybWFsTm9kZSA/IHZlYzMoIHRoaXMuY2xlYXJjb2F0Tm9ybWFsTm9kZSApIDogbWF0ZXJpYWxDbGVhcmNvYXROb3JtYWw7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXAoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0YnVpbGRlci5jb250ZXh0LnNldHVwQ2xlYXJjb2F0Tm9ybWFsID0gKCkgPT4gdGhpcy5zZXR1cENsZWFyY29hdE5vcm1hbCggYnVpbGRlciApO1xyXG5cclxuXHRcdHN1cGVyLnNldHVwKCBidWlsZGVyICk7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHRoaXMuY2xlYXJjb2F0Tm9kZSA9IHNvdXJjZS5jbGVhcmNvYXROb2RlO1xyXG5cdFx0dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3NOb2RlID0gc291cmNlLmNsZWFyY29hdFJvdWdobmVzc05vZGU7XHJcblx0XHR0aGlzLmNsZWFyY29hdE5vcm1hbE5vZGUgPSBzb3VyY2UuY2xlYXJjb2F0Tm9ybWFsTm9kZTtcclxuXHJcblx0XHR0aGlzLnNoZWVuTm9kZSA9IHNvdXJjZS5zaGVlbk5vZGU7XHJcblx0XHR0aGlzLnNoZWVuUm91Z2huZXNzTm9kZSA9IHNvdXJjZS5zaGVlblJvdWdobmVzc05vZGU7XHJcblxyXG5cdFx0dGhpcy5pcmlkZXNjZW5jZU5vZGUgPSBzb3VyY2UuaXJpZGVzY2VuY2VOb2RlO1xyXG5cdFx0dGhpcy5pcmlkZXNjZW5jZUlPUk5vZGUgPSBzb3VyY2UuaXJpZGVzY2VuY2VJT1JOb2RlO1xyXG5cdFx0dGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc05vZGUgPSBzb3VyY2UuaXJpZGVzY2VuY2VUaGlja25lc3NOb2RlO1xyXG5cclxuXHRcdHRoaXMuc3BlY3VsYXJJbnRlbnNpdHlOb2RlID0gc291cmNlLnNwZWN1bGFySW50ZW5zaXR5Tm9kZTtcclxuXHRcdHRoaXMuc3BlY3VsYXJDb2xvck5vZGUgPSBzb3VyY2Uuc3BlY3VsYXJDb2xvck5vZGU7XHJcblxyXG5cdFx0dGhpcy50cmFuc21pc3Npb25Ob2RlID0gc291cmNlLnRyYW5zbWlzc2lvbk5vZGU7XHJcblx0XHR0aGlzLnRoaWNrbmVzc05vZGUgPSBzb3VyY2UudGhpY2tuZXNzTm9kZTtcclxuXHRcdHRoaXMuYXR0ZW51YXRpb25EaXN0YW5jZU5vZGUgPSBzb3VyY2UuYXR0ZW51YXRpb25EaXN0YW5jZU5vZGU7XHJcblx0XHR0aGlzLmF0dGVudWF0aW9uQ29sb3JOb2RlID0gc291cmNlLmF0dGVudWF0aW9uQ29sb3JOb2RlO1xyXG5cdFx0dGhpcy5kaXNwZXJzaW9uTm9kZSA9IHNvdXJjZS5kaXNwZXJzaW9uTm9kZTtcclxuXHJcblx0XHR0aGlzLmFuaXNvdHJvcHlOb2RlID0gc291cmNlLmFuaXNvdHJvcHlOb2RlO1xyXG5cclxuXHRcdHJldHVybiBzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTWVzaFBoeXNpY2FsTm9kZU1hdGVyaWFsO1xyXG4iLCJpbXBvcnQgTWVzaFBoeXNpY2FsTm9kZU1hdGVyaWFsIGZyb20gJy4vTWVzaFBoeXNpY2FsTm9kZU1hdGVyaWFsLmpzJztcclxuaW1wb3J0IFBoeXNpY2FsTGlnaHRpbmdNb2RlbCBmcm9tICcuLi8uLi9ub2Rlcy9mdW5jdGlvbnMvUGh5c2ljYWxMaWdodGluZ01vZGVsLmpzJztcclxuaW1wb3J0IHsgdHJhbnNmb3JtZWROb3JtYWxWaWV3IH0gZnJvbSAnLi4vLi4vbm9kZXMvYWNjZXNzb3JzL05vcm1hbC5qcyc7XHJcbmltcG9ydCB7IHBvc2l0aW9uVmlld0RpcmVjdGlvbiB9IGZyb20gJy4uLy4uL25vZGVzL2FjY2Vzc29ycy9Qb3NpdGlvbi5qcyc7XHJcbmltcG9ydCB7IGZsb2F0LCB2ZWMzIH0gZnJvbSAnLi4vLi4vbm9kZXMvdHNsL1RTTEJhc2UuanMnO1xyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgdGhlIGxpZ2h0aW5nIG1vZGVsIGZvciB7QGxpbmsgTWVzaFNTU05vZGVNYXRlcmlhbH0uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBQaHlzaWNhbExpZ2h0aW5nTW9kZWxcclxuICovXHJcbmNsYXNzIFNTU0xpZ2h0aW5nTW9kZWwgZXh0ZW5kcyBQaHlzaWNhbExpZ2h0aW5nTW9kZWwge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHBoeXNpY2FsIGxpZ2h0aW5nIG1vZGVsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbY2xlYXJjb2F0PWZhbHNlXSAtIFdoZXRoZXIgY2xlYXJjb2F0IGlzIHN1cHBvcnRlZCBvciBub3QuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbc2hlZW49ZmFsc2VdIC0gV2hldGhlciBzaGVlbiBpcyBzdXBwb3J0ZWQgb3Igbm90LlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lyaWRlc2NlbmNlPWZhbHNlXSAtIFdoZXRoZXIgaXJpZGVzY2VuY2UgaXMgc3VwcG9ydGVkIG9yIG5vdC5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFthbmlzb3Ryb3B5PWZhbHNlXSAtIFdoZXRoZXIgYW5pc290cm9weSBpcyBzdXBwb3J0ZWQgb3Igbm90LlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW3RyYW5zbWlzc2lvbj1mYWxzZV0gLSBXaGV0aGVyIHRyYW5zbWlzc2lvbiBpcyBzdXBwb3J0ZWQgb3Igbm90LlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Rpc3BlcnNpb249ZmFsc2VdIC0gV2hldGhlciBkaXNwZXJzaW9uIGlzIHN1cHBvcnRlZCBvciBub3QuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbc3NzPWZhbHNlXSAtIFdoZXRoZXIgU1NTIGlzIHN1cHBvcnRlZCBvciBub3QuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGNsZWFyY29hdCA9IGZhbHNlLCBzaGVlbiA9IGZhbHNlLCBpcmlkZXNjZW5jZSA9IGZhbHNlLCBhbmlzb3Ryb3B5ID0gZmFsc2UsIHRyYW5zbWlzc2lvbiA9IGZhbHNlLCBkaXNwZXJzaW9uID0gZmFsc2UsIHNzcyA9IGZhbHNlICkge1xyXG5cclxuXHRcdHN1cGVyKCBjbGVhcmNvYXQsIHNoZWVuLCBpcmlkZXNjZW5jZSwgYW5pc290cm9weSwgdHJhbnNtaXNzaW9uLCBkaXNwZXJzaW9uICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSBsaWdodGluZyBtb2RlbCBzaG91bGQgdXNlIFNTUyBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVzZVNTUyA9IHNzcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFeHRlbmRzIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHdpdGggYSBTU1MgdGVybS5cclxuXHQgKlxyXG5cdCAqIFJlZmVyZW5jZTogW0FwcHJveGltYXRpbmcgVHJhbnNsdWNlbmN5IGZvciBhIEZhc3QsIENoZWFwIGFuZCBDb252aW5jaW5nIFN1YnN1cmZhY2UgU2NhdHRlcmluZyBMb29rXXtAbGluayBodHRwczovL2NvbGluYmFycmVicmlzZWJvaXMuY29tLzIwMTEvMDMvMDcvZ2RjLTIwMTEtYXBwcm94aW1hdGluZy10cmFuc2x1Y2VuY3ktZm9yLWEtZmFzdC1jaGVhcC1hbmQtY29udmluY2luZy1zdWJzdXJmYWNlLXNjYXR0ZXJpbmctbG9vay99XHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gaW5wdXQgLSBUaGUgaW5wdXQgZGF0YS5cclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqL1xyXG5cdGRpcmVjdCggeyBsaWdodERpcmVjdGlvbiwgbGlnaHRDb2xvciwgcmVmbGVjdGVkTGlnaHQgfSwgYnVpbGRlciApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMudXNlU1NTID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0Y29uc3QgbWF0ZXJpYWwgPSBidWlsZGVyLm1hdGVyaWFsO1xyXG5cclxuXHRcdFx0Y29uc3QgeyB0aGlja25lc3NDb2xvck5vZGUsIHRoaWNrbmVzc0Rpc3RvcnRpb25Ob2RlLCB0aGlja25lc3NBbWJpZW50Tm9kZSwgdGhpY2tuZXNzQXR0ZW51YXRpb25Ob2RlLCB0aGlja25lc3NQb3dlck5vZGUsIHRoaWNrbmVzc1NjYWxlTm9kZSB9ID0gbWF0ZXJpYWw7XHJcblxyXG5cdFx0XHRjb25zdCBzY2F0dGVyaW5nSGFsZiA9IGxpZ2h0RGlyZWN0aW9uLmFkZCggdHJhbnNmb3JtZWROb3JtYWxWaWV3Lm11bCggdGhpY2tuZXNzRGlzdG9ydGlvbk5vZGUgKSApLm5vcm1hbGl6ZSgpO1xyXG5cdFx0XHRjb25zdCBzY2F0dGVyaW5nRG90ID0gZmxvYXQoIHBvc2l0aW9uVmlld0RpcmVjdGlvbi5kb3QoIHNjYXR0ZXJpbmdIYWxmLm5lZ2F0ZSgpICkuc2F0dXJhdGUoKS5wb3coIHRoaWNrbmVzc1Bvd2VyTm9kZSApLm11bCggdGhpY2tuZXNzU2NhbGVOb2RlICkgKTtcclxuXHRcdFx0Y29uc3Qgc2NhdHRlcmluZ0lsbHUgPSB2ZWMzKCBzY2F0dGVyaW5nRG90LmFkZCggdGhpY2tuZXNzQW1iaWVudE5vZGUgKS5tdWwoIHRoaWNrbmVzc0NvbG9yTm9kZSApICk7XHJcblxyXG5cdFx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlLmFkZEFzc2lnbiggc2NhdHRlcmluZ0lsbHUubXVsKCB0aGlja25lc3NBdHRlbnVhdGlvbk5vZGUubXVsKCBsaWdodENvbG9yICkgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRzdXBlci5kaXJlY3QoIHsgbGlnaHREaXJlY3Rpb24sIGxpZ2h0Q29sb3IsIHJlZmxlY3RlZExpZ2h0IH0sIGJ1aWxkZXIgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFRoaXMgbm9kZSBtYXRlcmlhbCBpcyBhbiBleHBlcmltZW50YWwgZXh0ZW5zaW9uIG9mIHtAbGluayBNZXNoUGh5c2ljYWxOb2RlTWF0ZXJpYWx9XHJcbiAqIHRoYXQgaW1wbGVtZW50cyBhIFN1YnN1cmZhY2Ugc2NhdHRlcmluZyAoU1NTKSB0ZXJtLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTWVzaFBoeXNpY2FsTm9kZU1hdGVyaWFsXHJcbiAqL1xyXG5jbGFzcyBNZXNoU1NTTm9kZU1hdGVyaWFsIGV4dGVuZHMgTWVzaFBoeXNpY2FsTm9kZU1hdGVyaWFsIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnTWVzaFNTU05vZGVNYXRlcmlhbCc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBtZXNoIFNTUyBub2RlIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbWV0ZXJzXSAtIFRoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVycyApIHtcclxuXHJcblx0XHRzdXBlciggcGFyYW1ldGVycyApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVwcmVzZW50cyB0aGUgdGhpY2tuZXNzIGNvbG9yLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Tm9kZTx2ZWMzPn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50aGlja25lc3NDb2xvck5vZGUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVwcmVzZW50cyB0aGUgZGlzdG9ydGlvbiBmYWN0b3IuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPGZsb2F0Pn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50aGlja25lc3NEaXN0b3J0aW9uTm9kZSA9IGZsb2F0KCAwLjEgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlcHJlc2VudHMgdGhlIHRoaWNrbmVzcyBhbWJpZW50IGZhY3Rvci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGU8ZmxvYXQ+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRoaWNrbmVzc0FtYmllbnROb2RlID0gZmxvYXQoIDAuMCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVwcmVzZW50cyB0aGUgdGhpY2tuZXNzIGF0dGVudWF0aW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Tm9kZTxmbG9hdD59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudGhpY2tuZXNzQXR0ZW51YXRpb25Ob2RlID0gZmxvYXQoIC4xICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXByZXNlbnRzIHRoZSB0aGlja25lc3MgcG93ZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPGZsb2F0Pn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50aGlja25lc3NQb3dlck5vZGUgPSBmbG9hdCggMi4wICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXByZXNlbnRzIHRoZSB0aGlja25lc3Mgc2NhbGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPGZsb2F0Pn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50aGlja25lc3NTY2FsZU5vZGUgPSBmbG9hdCggMTAuMCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdoZXRoZXIgdGhlIGxpZ2h0aW5nIG1vZGVsIHNob3VsZCB1c2UgU1NTIG9yIG5vdC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdCAqIEBkZWZhdWx0IHRydWVcclxuXHQgKi9cclxuXHRnZXQgdXNlU1NTKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnRoaWNrbmVzc0NvbG9yTm9kZSAhPT0gbnVsbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXR1cHMgdGhlIGxpZ2h0aW5nIG1vZGVsLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7U1NTTGlnaHRpbmdNb2RlbH0gVGhlIGxpZ2h0aW5nIG1vZGVsLlxyXG5cdCAqL1xyXG5cdHNldHVwTGlnaHRpbmdNb2RlbCggLypidWlsZGVyKi8gKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBTU1NMaWdodGluZ01vZGVsKCB0aGlzLnVzZUNsZWFyY29hdCwgdGhpcy51c2VTaGVlbiwgdGhpcy51c2VJcmlkZXNjZW5jZSwgdGhpcy51c2VBbmlzb3Ryb3B5LCB0aGlzLnVzZVRyYW5zbWlzc2lvbiwgdGhpcy51c2VEaXNwZXJzaW9uLCB0aGlzLnVzZVNTUyApO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHR0aGlzLnRoaWNrbmVzc0NvbG9yTm9kZSA9IHNvdXJjZS50aGlja25lc3NDb2xvck5vZGU7XHJcblx0XHR0aGlzLnRoaWNrbmVzc0Rpc3RvcnRpb25Ob2RlID0gc291cmNlLnRoaWNrbmVzc0Rpc3RvcnRpb25Ob2RlO1xyXG5cdFx0dGhpcy50aGlja25lc3NBbWJpZW50Tm9kZSA9IHNvdXJjZS50aGlja25lc3NBbWJpZW50Tm9kZTtcclxuXHRcdHRoaXMudGhpY2tuZXNzQXR0ZW51YXRpb25Ob2RlID0gc291cmNlLnRoaWNrbmVzc0F0dGVudWF0aW9uTm9kZTtcclxuXHRcdHRoaXMudGhpY2tuZXNzUG93ZXJOb2RlID0gc291cmNlLnRoaWNrbmVzc1Bvd2VyTm9kZTtcclxuXHRcdHRoaXMudGhpY2tuZXNzU2NhbGVOb2RlID0gc291cmNlLnRoaWNrbmVzc1NjYWxlTm9kZTtcclxuXHJcblx0XHRyZXR1cm4gc3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IE1lc2hTU1NOb2RlTWF0ZXJpYWw7XHJcbiIsImltcG9ydCBMaWdodGluZ01vZGVsIGZyb20gJy4uL2NvcmUvTGlnaHRpbmdNb2RlbC5qcyc7XHJcbmltcG9ydCBCUkRGX0xhbWJlcnQgZnJvbSAnLi9CU0RGL0JSREZfTGFtYmVydC5qcyc7XHJcbmltcG9ydCB7IGRpZmZ1c2VDb2xvciB9IGZyb20gJy4uL2NvcmUvUHJvcGVydHlOb2RlLmpzJztcclxuaW1wb3J0IHsgbm9ybWFsR2VvbWV0cnkgfSBmcm9tICcuLi9hY2Nlc3NvcnMvTm9ybWFsLmpzJztcclxuaW1wb3J0IHsgRm4sIGZsb2F0LCB2ZWMyLCB2ZWMzIH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5pbXBvcnQgeyBtaXgsIHNtb290aHN0ZXAgfSBmcm9tICcuLi9tYXRoL01hdGhOb2RlLmpzJztcclxuaW1wb3J0IHsgbWF0ZXJpYWxSZWZlcmVuY2UgfSBmcm9tICcuLi9hY2Nlc3NvcnMvTWF0ZXJpYWxSZWZlcmVuY2VOb2RlLmpzJztcclxuXHJcbmNvbnN0IGdldEdyYWRpZW50SXJyYWRpYW5jZSA9IC8qQF9fUFVSRV9fKi8gRm4oICggeyBub3JtYWwsIGxpZ2h0RGlyZWN0aW9uLCBidWlsZGVyIH0gKSA9PiB7XHJcblxyXG5cdC8vIGRvdE5MIHdpbGwgYmUgZnJvbSAtMS4wIHRvIDEuMFxyXG5cdGNvbnN0IGRvdE5MID0gbm9ybWFsLmRvdCggbGlnaHREaXJlY3Rpb24gKTtcclxuXHRjb25zdCBjb29yZCA9IHZlYzIoIGRvdE5MLm11bCggMC41ICkuYWRkKCAwLjUgKSwgMC4wICk7XHJcblxyXG5cdGlmICggYnVpbGRlci5tYXRlcmlhbC5ncmFkaWVudE1hcCApIHtcclxuXHJcblx0XHRjb25zdCBncmFkaWVudE1hcCA9IG1hdGVyaWFsUmVmZXJlbmNlKCAnZ3JhZGllbnRNYXAnLCAndGV4dHVyZScgKS5jb250ZXh0KCB7IGdldFVWOiAoKSA9PiBjb29yZCB9ICk7XHJcblxyXG5cdFx0cmV0dXJuIHZlYzMoIGdyYWRpZW50TWFwLnIgKTtcclxuXHJcblx0fSBlbHNlIHtcclxuXHJcblx0XHRjb25zdCBmdyA9IGNvb3JkLmZ3aWR0aCgpLm11bCggMC41ICk7XHJcblxyXG5cdFx0cmV0dXJuIG1peCggdmVjMyggMC43ICksIHZlYzMoIDEuMCApLCBzbW9vdGhzdGVwKCBmbG9hdCggMC43ICkuc3ViKCBmdy54ICksIGZsb2F0KCAwLjcgKS5hZGQoIGZ3LnggKSwgY29vcmQueCApICk7XHJcblxyXG5cdH1cclxuXHJcbn0gKTtcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIHRoZSBsaWdodGluZyBtb2RlbCBmb3IgYSB0b29uIG1hdGVyaWFsLiBVc2VkIGluIHtAbGluayBNZXNoVG9vbk5vZGVNYXRlcmlhbH0uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBMaWdodGluZ01vZGVsXHJcbiAqL1xyXG5jbGFzcyBUb29uTGlnaHRpbmdNb2RlbCBleHRlbmRzIExpZ2h0aW5nTW9kZWwge1xyXG5cclxuXHQvKipcclxuXHQgKiBJbXBsZW1lbnRzIHRoZSBkaXJlY3QgbGlnaHRpbmcuIEluc3RlYWQgb2YgdXNpbmcgYSBjb252ZW50aW9uYWwgc21vb3RoIGlycmFkaWFuY2UsIHRoZSBpcnJhZGlhbmNlIGlzXHJcblx0ICogcmVkdWNlZCB0byBhIHNtYWxsIG51bWJlciBvZiBkaXNjcmV0ZSBzaGFkZXMgdG8gY3JlYXRlIGEgY29taWMtbGlrZSwgZmxhdCBsb29rLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGxpZ2h0RGF0YSAtIFRoZSBsaWdodCBkYXRhLlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICovXHJcblx0ZGlyZWN0KCB7IGxpZ2h0RGlyZWN0aW9uLCBsaWdodENvbG9yLCByZWZsZWN0ZWRMaWdodCB9LCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IGlycmFkaWFuY2UgPSBnZXRHcmFkaWVudElycmFkaWFuY2UoIHsgbm9ybWFsOiBub3JtYWxHZW9tZXRyeSwgbGlnaHREaXJlY3Rpb24sIGJ1aWxkZXIgfSApLm11bCggbGlnaHRDb2xvciApO1xyXG5cclxuXHRcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UuYWRkQXNzaWduKCBpcnJhZGlhbmNlLm11bCggQlJERl9MYW1iZXJ0KCB7IGRpZmZ1c2VDb2xvcjogZGlmZnVzZUNvbG9yLnJnYiB9ICkgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEltcGxlbWVudHMgdGhlIGluZGlyZWN0IGxpZ2h0aW5nLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKi9cclxuXHRpbmRpcmVjdCggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCB7IGFtYmllbnRPY2NsdXNpb24sIGlycmFkaWFuY2UsIHJlZmxlY3RlZExpZ2h0IH0gPSBidWlsZGVyLmNvbnRleHQ7XHJcblxyXG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlLmFkZEFzc2lnbiggaXJyYWRpYW5jZS5tdWwoIEJSREZfTGFtYmVydCggeyBkaWZmdXNlQ29sb3IgfSApICkgKTtcclxuXHJcblx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UubXVsQXNzaWduKCBhbWJpZW50T2NjbHVzaW9uICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFRvb25MaWdodGluZ01vZGVsO1xyXG4iLCJpbXBvcnQgTm9kZU1hdGVyaWFsIGZyb20gJy4vTm9kZU1hdGVyaWFsLmpzJztcclxuaW1wb3J0IFRvb25MaWdodGluZ01vZGVsIGZyb20gJy4uLy4uL25vZGVzL2Z1bmN0aW9ucy9Ub29uTGlnaHRpbmdNb2RlbC5qcyc7XHJcblxyXG5pbXBvcnQgeyBNZXNoVG9vbk1hdGVyaWFsIH0gZnJvbSAnLi4vTWVzaFRvb25NYXRlcmlhbC5qcyc7XHJcblxyXG5jb25zdCBfZGVmYXVsdFZhbHVlcyA9IC8qQF9fUFVSRV9fKi8gbmV3IE1lc2hUb29uTWF0ZXJpYWwoKTtcclxuXHJcbi8qKlxyXG4gKiBOb2RlIG1hdGVyaWFsIHZlcnNpb24gb2Yge0BsaW5rIE1lc2hUb29uTWF0ZXJpYWx9LlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTm9kZU1hdGVyaWFsXHJcbiAqL1xyXG5jbGFzcyBNZXNoVG9vbk5vZGVNYXRlcmlhbCBleHRlbmRzIE5vZGVNYXRlcmlhbCB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ01lc2hUb29uTm9kZU1hdGVyaWFsJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG1lc2ggdG9vbiBub2RlIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbWV0ZXJzXSAtIFRoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVycyApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc01lc2hUb29uTm9kZU1hdGVyaWFsID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNldCB0byBgdHJ1ZWAgYmVjYXVzZSB0b29uIG1hdGVyaWFscyByZWFjdCBvbiBsaWdodHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGlnaHRzID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnNldERlZmF1bHRWYWx1ZXMoIF9kZWZhdWx0VmFsdWVzICk7XHJcblxyXG5cdFx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXR1cHMgdGhlIGxpZ2h0aW5nIG1vZGVsLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7VG9vbkxpZ2h0aW5nTW9kZWx9IFRoZSBsaWdodGluZyBtb2RlbC5cclxuXHQgKi9cclxuXHRzZXR1cExpZ2h0aW5nTW9kZWwoIC8qYnVpbGRlciovICkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgVG9vbkxpZ2h0aW5nTW9kZWwoKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTWVzaFRvb25Ob2RlTWF0ZXJpYWw7XHJcbiIsImltcG9ydCBUZW1wTm9kZSBmcm9tICcuLi9jb3JlL1RlbXBOb2RlLmpzJztcclxuaW1wb3J0IHsgdHJhbnNmb3JtZWROb3JtYWxWaWV3IH0gZnJvbSAnLi4vYWNjZXNzb3JzL05vcm1hbC5qcyc7XHJcbmltcG9ydCB7IHBvc2l0aW9uVmlld0RpcmVjdGlvbiB9IGZyb20gJy4uL2FjY2Vzc29ycy9Qb3NpdGlvbi5qcyc7XHJcbmltcG9ydCB7IG5vZGVJbW11dGFibGUsIHZlYzIsIHZlYzMgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcblxyXG4vKipcclxuICogQ2FuIGJlIHVzZWQgdG8gY29tcHV0ZSB0ZXh0dXJlIGNvb3JkaW5hdGVzIGZvciBwcm9qZWN0aW5nIGFcclxuICogbWF0Y2FwIG9udG8gYSBtZXNoLiBVc2VkIGJ5IHtAbGluayBNZXNoTWF0Y2FwTm9kZU1hdGVyaWFsfS5cclxuICpcclxuICogQGF1Z21lbnRzIFRlbXBOb2RlXHJcbiAqL1xyXG5jbGFzcyBNYXRjYXBVVk5vZGUgZXh0ZW5kcyBUZW1wTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ01hdGNhcFVWTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBtYXRjYXAgdXYgbm9kZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHJcblx0XHRzdXBlciggJ3ZlYzInICk7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXAoKSB7XHJcblxyXG5cdFx0Y29uc3QgeCA9IHZlYzMoIHBvc2l0aW9uVmlld0RpcmVjdGlvbi56LCAwLCBwb3NpdGlvblZpZXdEaXJlY3Rpb24ueC5uZWdhdGUoKSApLm5vcm1hbGl6ZSgpO1xyXG5cdFx0Y29uc3QgeSA9IHBvc2l0aW9uVmlld0RpcmVjdGlvbi5jcm9zcyggeCApO1xyXG5cclxuXHRcdHJldHVybiB2ZWMyKCB4LmRvdCggdHJhbnNmb3JtZWROb3JtYWxWaWV3ICksIHkuZG90KCB0cmFuc2Zvcm1lZE5vcm1hbFZpZXcgKSApLm11bCggMC40OTUgKS5hZGQoIDAuNSApOyAvLyAwLjQ5NSB0byByZW1vdmUgYXJ0aWZhY3RzIGNhdXNlZCBieSB1bmRlcnNpemVkIG1hdGNhcCBkaXNrc1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBNYXRjYXBVVk5vZGU7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIG1hdGNhcCB1diBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcmV0dXJucyB7TWF0Y2FwVVZOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG1hdGNhcFVWID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBNYXRjYXBVVk5vZGUgKTtcclxuIiwiaW1wb3J0IE5vZGVNYXRlcmlhbCBmcm9tICcuL05vZGVNYXRlcmlhbC5qcyc7XHJcbmltcG9ydCB7IG1hdGVyaWFsUmVmZXJlbmNlIH0gZnJvbSAnLi4vLi4vbm9kZXMvYWNjZXNzb3JzL01hdGVyaWFsUmVmZXJlbmNlTm9kZS5qcyc7XHJcbmltcG9ydCB7IGRpZmZ1c2VDb2xvciB9IGZyb20gJy4uLy4uL25vZGVzL2NvcmUvUHJvcGVydHlOb2RlLmpzJztcclxuaW1wb3J0IHsgdmVjMyB9IGZyb20gJy4uLy4uL25vZGVzL3RzbC9UU0xCYXNlLmpzJztcclxuaW1wb3J0IHsgbWl4IH0gZnJvbSAnLi4vLi4vbm9kZXMvbWF0aC9NYXRoTm9kZS5qcyc7XHJcbmltcG9ydCB7IG1hdGNhcFVWIH0gZnJvbSAnLi4vLi4vbm9kZXMvdXRpbHMvTWF0Y2FwVVZOb2RlLmpzJztcclxuXHJcbmltcG9ydCB7IE1lc2hNYXRjYXBNYXRlcmlhbCB9IGZyb20gJy4uL01lc2hNYXRjYXBNYXRlcmlhbC5qcyc7XHJcblxyXG5jb25zdCBfZGVmYXVsdFZhbHVlcyA9IC8qQF9fUFVSRV9fKi8gbmV3IE1lc2hNYXRjYXBNYXRlcmlhbCgpO1xyXG5cclxuLyoqXHJcbiAqIE5vZGUgbWF0ZXJpYWwgdmVyc2lvbiBvZiB7QGxpbmsgTWVzaE1hdGNhcE1hdGVyaWFsfS5cclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVNYXRlcmlhbFxyXG4gKi9cclxuY2xhc3MgTWVzaE1hdGNhcE5vZGVNYXRlcmlhbCBleHRlbmRzIE5vZGVNYXRlcmlhbCB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ01lc2hNYXRjYXBOb2RlTWF0ZXJpYWwnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbWVzaCBub3JtYWwgbm9kZSBtYXRlcmlhbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1ldGVyc10gLSBUaGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHBhcmFtZXRlcnMgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNNZXNoTWF0Y2FwTm9kZU1hdGVyaWFsID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnNldERlZmF1bHRWYWx1ZXMoIF9kZWZhdWx0VmFsdWVzICk7XHJcblxyXG5cdFx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXR1cHMgdGhlIG1hdGNhcCBzcGVjaWZpYyBub2RlIHZhcmlhYmxlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICovXHJcblx0c2V0dXBWYXJpYW50cyggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCB1diA9IG1hdGNhcFVWO1xyXG5cclxuXHRcdGxldCBtYXRjYXBDb2xvcjtcclxuXHJcblx0XHRpZiAoIGJ1aWxkZXIubWF0ZXJpYWwubWF0Y2FwICkge1xyXG5cclxuXHRcdFx0bWF0Y2FwQ29sb3IgPSBtYXRlcmlhbFJlZmVyZW5jZSggJ21hdGNhcCcsICd0ZXh0dXJlJyApLmNvbnRleHQoIHsgZ2V0VVY6ICgpID0+IHV2IH0gKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0bWF0Y2FwQ29sb3IgPSB2ZWMzKCBtaXgoIDAuMiwgMC44LCB1di55ICkgKTsgLy8gZGVmYXVsdCBpZiBtYXRjYXAgaXMgbWlzc2luZ1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRkaWZmdXNlQ29sb3IucmdiLm11bEFzc2lnbiggbWF0Y2FwQ29sb3IucmdiICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgZGVmYXVsdCBNZXNoTWF0Y2FwTm9kZU1hdGVyaWFsO1xyXG4iLCJpbXBvcnQgVGVtcE5vZGUgZnJvbSAnLi4vY29yZS9UZW1wTm9kZS5qcyc7XHJcbmltcG9ydCB7IG5vZGVQcm94eSwgdmVjNCwgbWF0MiwgbWF0NCB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuaW1wb3J0IHsgY29zLCBzaW4gfSBmcm9tICcuLi9tYXRoL01hdGhOb2RlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBcHBsaWVzIGEgcm90YXRpb24gdG8gdGhlIGdpdmVuIHBvc2l0aW9uIG5vZGUuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBUZW1wTm9kZVxyXG4gKi9cclxuY2xhc3MgUm90YXRlTm9kZSBleHRlbmRzIFRlbXBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnUm90YXRlTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyByb3RhdGUgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gcG9zaXRpb25Ob2RlIC0gVGhlIHBvc2l0aW9uIG5vZGUuXHJcblx0ICogQHBhcmFtIHtOb2RlfSByb3RhdGlvbk5vZGUgLSBSZXByZXNlbnRzIHRoZSByb3RhdGlvbiB0aGF0IGlzIGFwcGxpZWQgdG8gdGhlIHBvc2l0aW9uIG5vZGUuIERlcGVuZGluZ1xyXG5cdCAqIG9uIHdoZXRoZXIgdGhlIHBvc2l0aW9uIGRhdGEgYXJlIDJEIG9yIDNELCB0aGUgcm90YXRpb24gaXMgZXhwcmVzc2VkIGEgc2luZ2xlIGZsb2F0IHZhbHVlIG9yIGFuIEV1bGVyIHZhbHVlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwb3NpdGlvbk5vZGUsIHJvdGF0aW9uTm9kZSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHBvc2l0aW9uIG5vZGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucG9zaXRpb25Ob2RlID0gcG9zaXRpb25Ob2RlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogIFJlcHJlc2VudHMgdGhlIHJvdGF0aW9uIHRoYXQgaXMgYXBwbGllZCB0byB0aGUgcG9zaXRpb24gbm9kZS5cclxuXHRcdCAqICBEZXBlbmRpbmcgb24gd2hldGhlciB0aGUgcG9zaXRpb24gZGF0YSBhcmUgMkQgb3IgM0QsIHRoZSByb3RhdGlvbiBpcyBleHByZXNzZWQgYSBzaW5nbGUgZmxvYXQgdmFsdWUgb3IgYW4gRXVsZXIgdmFsdWUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucm90YXRpb25Ob2RlID0gcm90YXRpb25Ob2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSB0eXBlIG9mIHRoZSB7QGxpbmsgUm90YXRlTm9kZSNwb3NpdGlvbk5vZGV9IGRlZmluZXMgdGhlIG5vZGUncyB0eXBlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBub2RlJ3MgdHlwZS5cclxuXHQgKi9cclxuXHRnZXROb2RlVHlwZSggYnVpbGRlciApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5wb3NpdGlvbk5vZGUuZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHRzZXR1cCggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCB7IHJvdGF0aW9uTm9kZSwgcG9zaXRpb25Ob2RlIH0gPSB0aGlzO1xyXG5cclxuXHRcdGNvbnN0IG5vZGVUeXBlID0gdGhpcy5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cclxuXHRcdGlmICggbm9kZVR5cGUgPT09ICd2ZWMyJyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGNvc0FuZ2xlID0gcm90YXRpb25Ob2RlLmNvcygpO1xyXG5cdFx0XHRjb25zdCBzaW5BbmdsZSA9IHJvdGF0aW9uTm9kZS5zaW4oKTtcclxuXHJcblx0XHRcdGNvbnN0IHJvdGF0aW9uTWF0cml4ID0gbWF0MihcclxuXHRcdFx0XHRjb3NBbmdsZSwgc2luQW5nbGUsXHJcblx0XHRcdFx0c2luQW5nbGUubmVnYXRlKCksIGNvc0FuZ2xlXHJcblx0XHRcdCk7XHJcblxyXG5cdFx0XHRyZXR1cm4gcm90YXRpb25NYXRyaXgubXVsKCBwb3NpdGlvbk5vZGUgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc3Qgcm90YXRpb24gPSByb3RhdGlvbk5vZGU7XHJcblx0XHRcdGNvbnN0IHJvdGF0aW9uWE1hdHJpeCA9IG1hdDQoIHZlYzQoIDEuMCwgMC4wLCAwLjAsIDAuMCApLCB2ZWM0KCAwLjAsIGNvcyggcm90YXRpb24ueCApLCBzaW4oIHJvdGF0aW9uLnggKS5uZWdhdGUoKSwgMC4wICksIHZlYzQoIDAuMCwgc2luKCByb3RhdGlvbi54ICksIGNvcyggcm90YXRpb24ueCApLCAwLjAgKSwgdmVjNCggMC4wLCAwLjAsIDAuMCwgMS4wICkgKTtcclxuXHRcdFx0Y29uc3Qgcm90YXRpb25ZTWF0cml4ID0gbWF0NCggdmVjNCggY29zKCByb3RhdGlvbi55ICksIDAuMCwgc2luKCByb3RhdGlvbi55ICksIDAuMCApLCB2ZWM0KCAwLjAsIDEuMCwgMC4wLCAwLjAgKSwgdmVjNCggc2luKCByb3RhdGlvbi55ICkubmVnYXRlKCksIDAuMCwgY29zKCByb3RhdGlvbi55ICksIDAuMCApLCB2ZWM0KCAwLjAsIDAuMCwgMC4wLCAxLjAgKSApO1xyXG5cdFx0XHRjb25zdCByb3RhdGlvblpNYXRyaXggPSBtYXQ0KCB2ZWM0KCBjb3MoIHJvdGF0aW9uLnogKSwgc2luKCByb3RhdGlvbi56ICkubmVnYXRlKCksIDAuMCwgMC4wICksIHZlYzQoIHNpbiggcm90YXRpb24ueiApLCBjb3MoIHJvdGF0aW9uLnogKSwgMC4wLCAwLjAgKSwgdmVjNCggMC4wLCAwLjAsIDEuMCwgMC4wICksIHZlYzQoIDAuMCwgMC4wLCAwLjAsIDEuMCApICk7XHJcblxyXG5cdFx0XHRyZXR1cm4gcm90YXRpb25YTWF0cml4Lm11bCggcm90YXRpb25ZTWF0cml4ICkubXVsKCByb3RhdGlvblpNYXRyaXggKS5tdWwoIHZlYzQoIHBvc2l0aW9uTm9kZSwgMS4wICkgKS54eXo7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBSb3RhdGVOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSByb3RhdGUgbm9kZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlfSBwb3NpdGlvbk5vZGUgLSBUaGUgcG9zaXRpb24gbm9kZS5cclxuICogQHBhcmFtIHtOb2RlfSByb3RhdGlvbk5vZGUgLSBSZXByZXNlbnRzIHRoZSByb3RhdGlvbiB0aGF0IGlzIGFwcGxpZWQgdG8gdGhlIHBvc2l0aW9uIG5vZGUuIERlcGVuZGluZ1xyXG4gKiBvbiB3aGV0aGVyIHRoZSBwb3NpdGlvbiBkYXRhIGFyZSAyRCBvciAzRCwgdGhlIHJvdGF0aW9uIGlzIGV4cHJlc3NlZCBhIHNpbmdsZSBmbG9hdCB2YWx1ZSBvciBhbiBFdWxlciB2YWx1ZS5cclxuICogQHJldHVybnMge1JvdGF0ZU5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgcm90YXRlID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIFJvdGF0ZU5vZGUgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDIgKTtcclxuIiwiaW1wb3J0IE5vZGVNYXRlcmlhbCBmcm9tICcuL05vZGVNYXRlcmlhbC5qcyc7XHJcbmltcG9ydCB7IGNhbWVyYVByb2plY3Rpb25NYXRyaXggfSBmcm9tICcuLi8uLi9ub2Rlcy9hY2Nlc3NvcnMvQ2FtZXJhLmpzJztcclxuaW1wb3J0IHsgbWF0ZXJpYWxSb3RhdGlvbiB9IGZyb20gJy4uLy4uL25vZGVzL2FjY2Vzc29ycy9NYXRlcmlhbE5vZGUuanMnO1xyXG5pbXBvcnQgeyBtb2RlbFZpZXdNYXRyaXgsIG1vZGVsV29ybGRNYXRyaXggfSBmcm9tICcuLi8uLi9ub2Rlcy9hY2Nlc3NvcnMvTW9kZWxOb2RlLmpzJztcclxuaW1wb3J0IHsgcG9zaXRpb25HZW9tZXRyeSB9IGZyb20gJy4uLy4uL25vZGVzL2FjY2Vzc29ycy9Qb3NpdGlvbi5qcyc7XHJcbmltcG9ydCB7IHJvdGF0ZSB9IGZyb20gJy4uLy4uL25vZGVzL3V0aWxzL1JvdGF0ZU5vZGUuanMnO1xyXG5pbXBvcnQgeyBmbG9hdCwgdmVjMiwgdmVjMywgdmVjNCB9IGZyb20gJy4uLy4uL25vZGVzL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbmltcG9ydCB7IFNwcml0ZU1hdGVyaWFsIH0gZnJvbSAnLi4vU3ByaXRlTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyByZWZlcmVuY2UgfSBmcm9tICcuLi8uLi9ub2Rlcy9hY2Nlc3NvcnMvUmVmZXJlbmNlQmFzZU5vZGUuanMnO1xyXG5cclxuY29uc3QgX2RlZmF1bHRWYWx1ZXMgPSAvKkBfX1BVUkVfXyovIG5ldyBTcHJpdGVNYXRlcmlhbCgpO1xyXG5cclxuLyoqXHJcbiAqIE5vZGUgbWF0ZXJpYWwgdmVyc2lvbiBvZiB7QGxpbmsgU3ByaXRlTWF0ZXJpYWx9LlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTm9kZU1hdGVyaWFsXHJcbiAqL1xyXG5jbGFzcyBTcHJpdGVOb2RlTWF0ZXJpYWwgZXh0ZW5kcyBOb2RlTWF0ZXJpYWwge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdTcHJpdGVOb2RlTWF0ZXJpYWwnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc3ByaXRlIG5vZGUgbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtZXRlcnNdIC0gVGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwYXJhbWV0ZXJzICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzU3ByaXRlTm9kZU1hdGVyaWFsID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLl91c2VTaXplQXR0ZW51YXRpb24gPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBwcm9wZXJ0eSBtYWtlcyBpdCBwb3NzaWJsZSB0byBkZWZpbmUgdGhlIHBvc2l0aW9uIG9mIHRoZSBzcHJpdGUgd2l0aCBhXHJcblx0XHQgKiBub2RlLiBUaGF0IGNhbiBiZSB1c2VmdWwgd2hlbiB0aGUgbWF0ZXJpYWwgaXMgdXNlZCB3aXRoIGluc3RhbmNlZCByZW5kZXJpbmdcclxuXHRcdCAqIGFuZCBub2RlIGRhdGEgYXJlIGRlZmluZWQgd2l0aCBhbiBpbnN0YW5jZWQgYXR0cmlidXRlIG5vZGU6XHJcblx0XHQgKiBgYGBqc1xyXG5cdFx0ICogY29uc3QgcG9zaXRpb25BdHRyaWJ1dGUgPSBuZXcgSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlKCBuZXcgRmxvYXQzMkFycmF5KCBwb3NpdGlvbnMgKSwgMyApO1xyXG5cdFx0ICogbWF0ZXJpYWwucG9zaXRpb25Ob2RlID0gaW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbkF0dHJpYnV0ZSApO1xyXG5cdFx0ICogYGBgXHJcblx0XHQgKiBBbm90aGVyIHBvc3NpYmlsaXR5IGlzIHRvIGNvbXB1dGUgdGhlIGluc3RhbmNlZCBkYXRhIHdpdGggYSBjb21wdXRlIHNoYWRlcjpcclxuXHRcdCAqIGBgYGpzXHJcblx0XHQgKiBjb25zdCBwb3NpdGlvbkJ1ZmZlciA9IGluc3RhbmNlZEFycmF5KCBwYXJ0aWNsZUNvdW50LCAndmVjMycgKTtcclxuXHRcdCAqIHBhcnRpY2xlTWF0ZXJpYWwucG9zaXRpb25Ob2RlID0gcG9zaXRpb25CdWZmZXIudG9BdHRyaWJ1dGUoKTtcclxuXHRcdCAqIGBgYFxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Tm9kZTx2ZWMyPn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wb3NpdGlvbk5vZGUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJvdGF0aW9uIG9mIHNwcml0ZSBtYXRlcmlhbHMgaXMgYnkgZGVmYXVsdCBpbmZlcnJlZCBmcm9tIHRoZSBgcm90YXRpb25gLFxyXG5cdFx0ICogcHJvcGVydHkuIFRoaXMgbm9kZSBwcm9wZXJ0eSBhbGxvd3MgdG8gb3ZlcndyaXRlIHRoZSBkZWZhdWx0IGFuZCBkZWZpbmVcclxuXHRcdCAqIHRoZSByb3RhdGlvbiB3aXRoIGEgbm9kZSBpbnN0ZWFkLlxyXG5cdFx0ICpcclxuXHRcdCAqIElmIHlvdSBkb24ndCB3YW50IHRvIG92ZXJ3cml0ZSB0aGUgcm90YXRpb24gYnV0IG1vZGlmeSB0aGUgZXhpc3RpbmdcclxuXHRcdCAqIHZhbHVlIGluc3RlYWQsIHVzZSB7QGxpbmsgbWF0ZXJpYWxSb3RhdGlvbn0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPGZsb2F0Pn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yb3RhdGlvbk5vZGUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBub2RlIHByb3BlcnR5IHByb3ZpZGVzIGFuIGFkZGl0aW9uYWwgd2F5IHRvIHNjYWxlIHNwcml0ZXMgbmV4dCB0b1xyXG5cdFx0ICogYE9iamVjdDNELnNjYWxlYC4gVGhlIHNjYWxlIHRyYW5zZm9ybWF0aW9uIGJhc2VkIGluIGBPYmplY3QzRC5zY2FsZWBcclxuXHRcdCAqIGlzIG11bHRpcGxpZWQgd2l0aCB0aGUgc2NhbGUgdmFsdWUgb2YgdGhpcyBub2RlIGluIHRoZSB2ZXJ0ZXggc2hhZGVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Tm9kZTx2ZWMyPn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zY2FsZU5vZGUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSW4gU3ByaXRlcywgdGhlIHRyYW5zcGFyZW50IHByb3BlcnR5IGlzIGVuYWJsZWQgYnkgZGVmYXVsdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50cmFuc3BhcmVudCA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy5zZXREZWZhdWx0VmFsdWVzKCBfZGVmYXVsdFZhbHVlcyApO1xyXG5cclxuXHRcdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0dXBzIHRoZSBwb3NpdGlvbiBub2RlIGluIHZpZXcgc3BhY2UuIFRoaXMgbWV0aG9kIGltcGxlbWVudHNcclxuXHQgKiB0aGUgc3ByaXRlIHNwZWNpZmljIHZlcnRleCBzaGFkZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge05vZGU8dmVjMz59IFRoZSBwb3NpdGlvbiBpbiB2aWV3IHNwYWNlLlxyXG5cdCAqL1xyXG5cdHNldHVwUG9zaXRpb25WaWV3KCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IHsgb2JqZWN0LCBjYW1lcmEgfSA9IGJ1aWxkZXI7XHJcblxyXG5cdFx0Y29uc3Qgc2l6ZUF0dGVudWF0aW9uID0gdGhpcy5zaXplQXR0ZW51YXRpb247XHJcblxyXG5cdFx0Y29uc3QgeyBwb3NpdGlvbk5vZGUsIHJvdGF0aW9uTm9kZSwgc2NhbGVOb2RlIH0gPSB0aGlzO1xyXG5cclxuXHRcdGNvbnN0IG12UG9zaXRpb24gPSBtb2RlbFZpZXdNYXRyaXgubXVsKCB2ZWMzKCBwb3NpdGlvbk5vZGUgfHwgMCApICk7XHJcblxyXG5cdFx0bGV0IHNjYWxlID0gdmVjMiggbW9kZWxXb3JsZE1hdHJpeFsgMCBdLnh5ei5sZW5ndGgoKSwgbW9kZWxXb3JsZE1hdHJpeFsgMSBdLnh5ei5sZW5ndGgoKSApO1xyXG5cclxuXHRcdGlmICggc2NhbGVOb2RlICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0c2NhbGUgPSBzY2FsZS5tdWwoIHZlYzIoIHNjYWxlTm9kZSApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggc2l6ZUF0dGVudWF0aW9uID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdGlmICggY2FtZXJhLmlzUGVyc3BlY3RpdmVDYW1lcmEgKSB7XHJcblxyXG5cdFx0XHRcdHNjYWxlID0gc2NhbGUubXVsKCBtdlBvc2l0aW9uLnoubmVnYXRlKCkgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IG9ydGhvU2NhbGUgPSBmbG9hdCggMi4wICkuZGl2KCBjYW1lcmFQcm9qZWN0aW9uTWF0cml4LmVsZW1lbnQoIDEgKS5lbGVtZW50KCAxICkgKTtcclxuXHRcdFx0XHRzY2FsZSA9IHNjYWxlLm11bCggb3J0aG9TY2FsZS5tdWwoIDIgKSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRsZXQgYWxpZ25lZFBvc2l0aW9uID0gcG9zaXRpb25HZW9tZXRyeS54eTtcclxuXHJcblx0XHRpZiAoIG9iamVjdC5jZW50ZXIgJiYgb2JqZWN0LmNlbnRlci5pc1ZlY3RvcjIgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBjZW50ZXIgPSByZWZlcmVuY2UoICdjZW50ZXInLCAndmVjMicsIG9iamVjdCApO1xyXG5cclxuXHRcdFx0YWxpZ25lZFBvc2l0aW9uID0gYWxpZ25lZFBvc2l0aW9uLnN1YiggY2VudGVyLnN1YiggMC41ICkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0YWxpZ25lZFBvc2l0aW9uID0gYWxpZ25lZFBvc2l0aW9uLm11bCggc2NhbGUgKTtcclxuXHJcblx0XHRjb25zdCByb3RhdGlvbiA9IGZsb2F0KCByb3RhdGlvbk5vZGUgfHwgbWF0ZXJpYWxSb3RhdGlvbiApO1xyXG5cclxuXHRcdGNvbnN0IHJvdGF0ZWRQb3NpdGlvbiA9IHJvdGF0ZSggYWxpZ25lZFBvc2l0aW9uLCByb3RhdGlvbiApO1xyXG5cclxuXHRcdHJldHVybiB2ZWM0KCBtdlBvc2l0aW9uLnh5LmFkZCggcm90YXRlZFBvc2l0aW9uICksIG12UG9zaXRpb24uencgKTtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0dGhpcy5wb3NpdGlvbk5vZGUgPSBzb3VyY2UucG9zaXRpb25Ob2RlO1xyXG5cdFx0dGhpcy5yb3RhdGlvbk5vZGUgPSBzb3VyY2Uucm90YXRpb25Ob2RlO1xyXG5cdFx0dGhpcy5zY2FsZU5vZGUgPSBzb3VyY2Uuc2NhbGVOb2RlO1xyXG5cclxuXHRcdHJldHVybiBzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBXaGV0aGVyIHRvIHVzZSBzaXplIGF0dGVudWF0aW9uIG9yIG5vdC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdCAqIEBkZWZhdWx0IHRydWVcclxuXHQgKi9cclxuXHRnZXQgc2l6ZUF0dGVudWF0aW9uKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl91c2VTaXplQXR0ZW51YXRpb247XHJcblxyXG5cdH1cclxuXHJcblx0c2V0IHNpemVBdHRlbnVhdGlvbiggdmFsdWUgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl91c2VTaXplQXR0ZW51YXRpb24gIT09IHZhbHVlICkge1xyXG5cclxuXHRcdFx0dGhpcy5fdXNlU2l6ZUF0dGVudWF0aW9uID0gdmFsdWU7XHJcblx0XHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgU3ByaXRlTm9kZU1hdGVyaWFsO1xyXG4iLCJpbXBvcnQgU3ByaXRlTm9kZU1hdGVyaWFsIGZyb20gJy4vU3ByaXRlTm9kZU1hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgdmlld3BvcnQgfSBmcm9tICcuLi8uLi9ub2Rlcy9kaXNwbGF5L1NjcmVlbk5vZGUuanMnO1xyXG5pbXBvcnQgeyBwb3NpdGlvbkdlb21ldHJ5LCBwb3NpdGlvbkxvY2FsLCBwb3NpdGlvblZpZXcgfSBmcm9tICcuLi8uLi9ub2Rlcy9hY2Nlc3NvcnMvUG9zaXRpb24uanMnO1xyXG5pbXBvcnQgeyBtb2RlbFZpZXdNYXRyaXggfSBmcm9tICcuLi8uLi9ub2Rlcy9hY2Nlc3NvcnMvTW9kZWxOb2RlLmpzJztcclxuaW1wb3J0IHsgbWF0ZXJpYWxQb2ludFNpemUgfSBmcm9tICcuLi8uLi9ub2Rlcy9hY2Nlc3NvcnMvTWF0ZXJpYWxOb2RlLmpzJztcclxuaW1wb3J0IHsgcm90YXRlIH0gZnJvbSAnLi4vLi4vbm9kZXMvdXRpbHMvUm90YXRlTm9kZS5qcyc7XHJcbmltcG9ydCB7IGZsb2F0LCB2ZWMyLCB2ZWMzLCB2ZWM0IH0gZnJvbSAnLi4vLi4vbm9kZXMvdHNsL1RTTEJhc2UuanMnO1xyXG5cclxuaW1wb3J0IHsgUG9pbnRzTWF0ZXJpYWwgfSBmcm9tICcuLi9Qb2ludHNNYXRlcmlhbC5qcyc7XHJcblxyXG5jb25zdCBfZGVmYXVsdFZhbHVlcyA9IC8qQF9fUFVSRV9fKi8gbmV3IFBvaW50c01hdGVyaWFsKCk7XHJcblxyXG4vKipcclxuICogTm9kZSBtYXRlcmlhbCB2ZXJzaW9uIG9mIHtAbGluayBQb2ludHNNYXRlcmlhbH0uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBTcHJpdGVOb2RlTWF0ZXJpYWxcclxuICovXHJcbmNsYXNzIFBvaW50c05vZGVNYXRlcmlhbCBleHRlbmRzIFNwcml0ZU5vZGVNYXRlcmlhbCB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ1BvaW50c05vZGVNYXRlcmlhbCc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBwb2ludHMgbm9kZSBtYXRlcmlhbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1ldGVyc10gLSBUaGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHBhcmFtZXRlcnMgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgbm9kZSBwcm9wZXJ0eSBwcm92aWRlcyBhbiBhZGRpdGlvbmFsIHdheSB0byBzZXQgdGhlIHBvaW50IHNpemUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPHZlYzI+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNpemVOb2RlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNQb2ludHNOb2RlTWF0ZXJpYWwgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMuc2V0RGVmYXVsdFZhbHVlcyggX2RlZmF1bHRWYWx1ZXMgKTtcclxuXHJcblx0XHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xyXG5cclxuXHR9XHJcblxyXG5cdHNldHVwUG9zaXRpb25WaWV3KCkge1xyXG5cclxuXHRcdGNvbnN0IHsgcG9zaXRpb25Ob2RlIH0gPSB0aGlzO1xyXG5cclxuXHRcdHJldHVybiBtb2RlbFZpZXdNYXRyaXgubXVsKCB2ZWMzKCBwb3NpdGlvbk5vZGUgfHwgcG9zaXRpb25Mb2NhbCApICkueHl6O1xyXG5cclxuXHR9XHJcblxyXG5cdHNldHVwVmVydGV4KCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IG12cCA9IHN1cGVyLnNldHVwVmVydGV4KCBidWlsZGVyICk7XHJcblxyXG5cdFx0Ly8gc2tpcCBmdXJ0aGVyIHByb2Nlc3NpbmcgaWYgdGhlIG1hdGVyaWFsIGlzIG5vdCBhIG5vZGUgbWF0ZXJpYWxcclxuXHJcblx0XHRpZiAoIGJ1aWxkZXIubWF0ZXJpYWwuaXNOb2RlTWF0ZXJpYWwgIT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gbXZwO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBuZGMgc3BhY2VcclxuXHJcblx0XHRjb25zdCB7IHJvdGF0aW9uTm9kZSwgc2NhbGVOb2RlLCBzaXplTm9kZSB9ID0gdGhpcztcclxuXHJcblx0XHRjb25zdCBhbGlnbmVkUG9zaXRpb24gPSBwb3NpdGlvbkdlb21ldHJ5Lnh5LnRvVmFyKCk7XHJcblx0XHRjb25zdCBhc3BlY3QgPSB2aWV3cG9ydC56LmRpdiggdmlld3BvcnQudyApO1xyXG5cclxuXHRcdC8vIHJvdGF0aW9uXHJcblxyXG5cdFx0aWYgKCByb3RhdGlvbk5vZGUgJiYgcm90YXRpb25Ob2RlLmlzTm9kZSApIHtcclxuXHJcblx0XHRcdGNvbnN0IHJvdGF0aW9uID0gZmxvYXQoIHJvdGF0aW9uTm9kZSApO1xyXG5cclxuXHRcdFx0YWxpZ25lZFBvc2l0aW9uLmFzc2lnbiggcm90YXRlKCBhbGlnbmVkUG9zaXRpb24sIHJvdGF0aW9uICkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gcG9pbnQgc2l6ZVxyXG5cclxuXHRcdGxldCBwb2ludFNpemUgPSBzaXplTm9kZSAhPT0gbnVsbCA/IHZlYzIoIHNpemVOb2RlICkgOiBtYXRlcmlhbFBvaW50U2l6ZTtcclxuXHJcblx0XHRpZiAoIHRoaXMuc2l6ZUF0dGVudWF0aW9uID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0cG9pbnRTaXplID0gcG9pbnRTaXplLm11bCggcG9pbnRTaXplLmRpdiggcG9zaXRpb25WaWV3LnoubmVnYXRlKCkgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBzY2FsZVxyXG5cclxuXHRcdGlmICggc2NhbGVOb2RlICYmIHNjYWxlTm9kZS5pc05vZGUgKSB7XHJcblxyXG5cdFx0XHRwb2ludFNpemUgPSBwb2ludFNpemUubXVsKCB2ZWMyKCBzY2FsZU5vZGUgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRhbGlnbmVkUG9zaXRpb24ubXVsQXNzaWduKCBwb2ludFNpemUubXVsKCAyICkgKTtcclxuXHJcblx0XHRhbGlnbmVkUG9zaXRpb24uYXNzaWduKCBhbGlnbmVkUG9zaXRpb24uZGl2KCB2aWV3cG9ydC56ICkgKTtcclxuXHRcdGFsaWduZWRQb3NpdGlvbi55LmFzc2lnbiggYWxpZ25lZFBvc2l0aW9uLnkubXVsKCBhc3BlY3QgKSApO1xyXG5cclxuXHRcdC8vIGJhY2sgdG8gY2xpcCBzcGFjZVxyXG5cdFx0YWxpZ25lZFBvc2l0aW9uLmFzc2lnbiggYWxpZ25lZFBvc2l0aW9uLm11bCggbXZwLncgKSApO1xyXG5cclxuXHRcdC8vY2xpcFBvcy54eSArPSBvZmZzZXQ7XHJcblx0XHRtdnAuYWRkQXNzaWduKCB2ZWM0KCBhbGlnbmVkUG9zaXRpb24sIDAsIDAgKSApO1xyXG5cclxuXHRcdHJldHVybiBtdnA7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogV2hldGhlciBhbHBoYSB0byBjb3ZlcmFnZSBzaG91bGQgYmUgdXNlZCBvciBub3QuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0ICovXHJcblx0Z2V0IGFscGhhVG9Db3ZlcmFnZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fdXNlQWxwaGFUb0NvdmVyYWdlO1xyXG5cclxuXHR9XHJcblxyXG5cdHNldCBhbHBoYVRvQ292ZXJhZ2UoIHZhbHVlICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5fdXNlQWxwaGFUb0NvdmVyYWdlICE9PSB2YWx1ZSApIHtcclxuXHJcblx0XHRcdHRoaXMuX3VzZUFscGhhVG9Db3ZlcmFnZSA9IHZhbHVlO1xyXG5cdFx0XHR0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFBvaW50c05vZGVNYXRlcmlhbDtcclxuIiwiaW1wb3J0IExpZ2h0aW5nTW9kZWwgZnJvbSAnLi4vY29yZS9MaWdodGluZ01vZGVsLmpzJztcclxuaW1wb3J0IHsgZGlmZnVzZUNvbG9yIH0gZnJvbSAnLi4vY29yZS9Qcm9wZXJ0eU5vZGUuanMnO1xyXG5pbXBvcnQgeyBmbG9hdCB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIGxpZ2h0aW5nIG1vZGVsIGZvciBhIHNoYWRvdyBtYXRlcmlhbC4gVXNlZCBpbiB7QGxpbmsgU2hhZG93Tm9kZU1hdGVyaWFsfS5cclxuICpcclxuICogQGF1Z21lbnRzIExpZ2h0aW5nTW9kZWxcclxuICovXHJcbmNsYXNzIFNoYWRvd01hc2tNb2RlbCBleHRlbmRzIExpZ2h0aW5nTW9kZWwge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHNoYWRvdyBtYXNrIG1vZGVsLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc2hhZG93IG1hc2sgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zaGFkb3dOb2RlID0gZmxvYXQoIDEgKS50b1ZhciggJ3NoYWRvd01hc2snICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogT25seSB1c2VkIHRvIHNhdmUgdGhlIHNoYWRvdyBtYXNrLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGlucHV0IC0gVGhlIGlucHV0IGRhdGEuXHJcblx0ICovXHJcblx0ZGlyZWN0KCB7IGxpZ2h0Tm9kZSB9ICkge1xyXG5cclxuXHRcdHRoaXMuc2hhZG93Tm9kZS5tdWxBc3NpZ24oIGxpZ2h0Tm9kZS5zaGFkb3dOb2RlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXNlcyB0aGUgc2hhZG93IG1hc2sgdG8gcHJvZHVjZSB0aGUgZmluYWwgY29sb3IuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqL1xyXG5cdGZpbmlzaCggeyBjb250ZXh0IH0gKSB7XHJcblxyXG5cdFx0ZGlmZnVzZUNvbG9yLmEubXVsQXNzaWduKCB0aGlzLnNoYWRvd05vZGUub25lTWludXMoKSApO1xyXG5cclxuXHRcdGNvbnRleHQub3V0Z29pbmdMaWdodC5yZ2IuYXNzaWduKCBkaWZmdXNlQ29sb3IucmdiICk7IC8vIFRPRE86IE9wdGltaXplIExpZ2h0c05vZGUgdG8gYXZvaWQgdGhpcyBhc3NpZ25tZW50XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFNoYWRvd01hc2tNb2RlbDtcclxuIiwiaW1wb3J0IE5vZGVNYXRlcmlhbCBmcm9tICcuL05vZGVNYXRlcmlhbC5qcyc7XHJcbmltcG9ydCBTaGFkb3dNYXNrTW9kZWwgZnJvbSAnLi4vLi4vbm9kZXMvZnVuY3Rpb25zL1NoYWRvd01hc2tNb2RlbC5qcyc7XHJcblxyXG5pbXBvcnQgeyBTaGFkb3dNYXRlcmlhbCB9IGZyb20gJy4uL1NoYWRvd01hdGVyaWFsLmpzJztcclxuXHJcbmNvbnN0IF9kZWZhdWx0VmFsdWVzID0gLypAX19QVVJFX18qLyBuZXcgU2hhZG93TWF0ZXJpYWwoKTtcclxuXHJcbi8qKlxyXG4gKiBOb2RlIG1hdGVyaWFsIHZlcnNpb24gb2Yge0BsaW5rIFNoYWRvd01hdGVyaWFsfS5cclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVNYXRlcmlhbFxyXG4gKi9cclxuY2xhc3MgU2hhZG93Tm9kZU1hdGVyaWFsIGV4dGVuZHMgTm9kZU1hdGVyaWFsIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnU2hhZG93Tm9kZU1hdGVyaWFsJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHNoYWRvdyBub2RlIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbWV0ZXJzXSAtIFRoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVycyApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1NoYWRvd05vZGVNYXRlcmlhbCA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTZXQgdG8gYHRydWVgIGJlY2F1c2Ugc28gaXQncyBwb3NzaWJsZSB0byBpbXBsZW1lbnRcclxuXHRcdCAqIHRoZSBzaGFkb3cgbWFzayBlZmZlY3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGlnaHRzID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIE92ZXJ3cml0dGVuIHNpbmNlIHNoYWRvdyBtYXRlcmlhbHMgYXJlIHRyYW5zcGFyZW50XHJcblx0XHQgKiBieSBkZWZhdWx0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRyYW5zcGFyZW50ID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnNldERlZmF1bHRWYWx1ZXMoIF9kZWZhdWx0VmFsdWVzICk7XHJcblxyXG5cdFx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXR1cHMgdGhlIGxpZ2h0aW5nIG1vZGVsLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7U2hhZG93TWFza01vZGVsfSBUaGUgbGlnaHRpbmcgbW9kZWwuXHJcblx0ICovXHJcblx0c2V0dXBMaWdodGluZ01vZGVsKCAvKmJ1aWxkZXIqLyApIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IFNoYWRvd01hc2tNb2RlbCgpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTaGFkb3dOb2RlTWF0ZXJpYWw7XHJcbiIsImltcG9ydCBMaWdodGluZ01vZGVsIGZyb20gJy4uL2NvcmUvTGlnaHRpbmdNb2RlbC5qcyc7XHJcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnLi4vY29yZS9Qcm9wZXJ0eU5vZGUuanMnO1xyXG5pbXBvcnQgeyBmbG9hdCwgSWYsIHVuaWZvcm0sIHZlYzMsIHZlYzQgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcbmltcG9ydCB7IHBvc2l0aW9uV29ybGQgfSBmcm9tICcuLi9hY2Nlc3NvcnMvUG9zaXRpb24uanMnO1xyXG5pbXBvcnQgeyBjYW1lcmFGYXIsIGNhbWVyYU5lYXIsIGNhbWVyYVBvc2l0aW9uLCBjYW1lcmFWaWV3TWF0cml4IH0gZnJvbSAnLi4vYWNjZXNzb3JzL0NhbWVyYS5qcyc7XHJcbmltcG9ydCB7IExvb3AgfSBmcm9tICcuLi91dGlscy9Mb29wTm9kZS5qcyc7XHJcbmltcG9ydCB7IGxpbmVhckRlcHRoLCB2aWV3WlRvUGVyc3BlY3RpdmVEZXB0aCB9IGZyb20gJy4uL2Rpc3BsYXkvVmlld3BvcnREZXB0aE5vZGUuanMnO1xyXG5pbXBvcnQgeyBtb2RlbFJhZGl1cyB9IGZyb20gJy4uL2FjY2Vzc29ycy9Nb2RlbE5vZGUuanMnO1xyXG5pbXBvcnQgeyBMVENfRXZhbHVhdGVfVm9sdW1lIH0gZnJvbSAnLi9CU0RGL0xUQy5qcyc7XHJcblxyXG5jb25zdCBzY2F0dGVyaW5nRGVuc2l0eSA9IHByb3BlcnR5KCAndmVjMycgKTtcclxuY29uc3QgbGluZWFyRGVwdGhSYXkgPSBwcm9wZXJ0eSggJ3ZlYzMnICk7XHJcbmNvbnN0IG91dGdvaW5nUmF5TGlnaHQgPSBwcm9wZXJ0eSggJ3ZlYzMnICk7XHJcblxyXG4vKipcclxuICogVm9sdW1ldHJpY0xpZ2h0aW5nTW9kZWwgY2xhc3MgZXh0ZW5kcyB0aGUgTGlnaHRpbmdNb2RlbCB0byBpbXBsZW1lbnQgdm9sdW1ldHJpYyBsaWdodGluZyBlZmZlY3RzLlxyXG4gKiBUaGlzIG1vZGVsIGNhbGN1bGF0ZXMgdGhlIHNjYXR0ZXJpbmcgYW5kIHRyYW5zbWl0dGFuY2Ugb2YgbGlnaHQgdGhyb3VnaCBhIHZvbHVtZXRyaWMgbWVkaXVtLlxyXG4gKiBJdCBkeW5hbWljYWxseSBhZGp1c3RzIHRoZSBkaXJlY3Rpb24gb2YgdGhlIHJheSBiYXNlZCBvbiB0aGUgY2FtZXJhIGFuZCBvYmplY3QgcG9zaXRpb25zLlxyXG4gKiBUaGUgbW9kZWwgc3VwcG9ydHMgY3VzdG9tIHNjYXR0ZXJpbmcgYW5kIGRlcHRoIG5vZGVzIHRvIGVuaGFuY2UgdGhlIGxpZ2h0aW5nIGVmZmVjdHMuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBMaWdodGluZ01vZGVsXHJcbiAqL1xyXG5jbGFzcyBWb2x1bWV0cmljTGlnaHRpbmdNb2RlbCBleHRlbmRzIExpZ2h0aW5nTW9kZWwge1xyXG5cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHR9XHJcblxyXG5cdHN0YXJ0KCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IHsgbWF0ZXJpYWwsIGNvbnRleHQgfSA9IGJ1aWxkZXI7XHJcblxyXG5cdFx0Y29uc3Qgc3RhcnRQb3MgPSBwcm9wZXJ0eSggJ3ZlYzMnICk7XHJcblx0XHRjb25zdCBlbmRQb3MgPSBwcm9wZXJ0eSggJ3ZlYzMnICk7XHJcblxyXG5cdFx0Ly8gVGhpcyBhcHByb2FjaCBkeW5hbWljYWxseSBjaGFuZ2VzIHRoZSBkaXJlY3Rpb24gb2YgdGhlIHJheSxcclxuXHRcdC8vIHByaW9yaXRpemluZyB0aGUgcmF5IGZyb20gdGhlIGNhbWVyYSB0byB0aGUgb2JqZWN0IGlmIGl0IGlzIGluc2lkZSB0aGUgbWVzaCwgYW5kIGZyb20gdGhlIG9iamVjdCB0byB0aGUgY2FtZXJhIGlmIGl0IGlzIGZhciBhd2F5LlxyXG5cclxuXHRcdElmKCBjYW1lcmFQb3NpdGlvbi5zdWIoIHBvc2l0aW9uV29ybGQgKS5sZW5ndGgoKS5ncmVhdGVyVGhhbiggbW9kZWxSYWRpdXMubXVsKCAyICkgKSwgKCkgPT4ge1xyXG5cclxuXHRcdFx0c3RhcnRQb3MuYXNzaWduKCBjYW1lcmFQb3NpdGlvbiApO1xyXG5cdFx0XHRlbmRQb3MuYXNzaWduKCBwb3NpdGlvbldvcmxkICk7XHJcblxyXG5cdFx0fSApLkVsc2UoICgpID0+IHtcclxuXHJcblx0XHRcdHN0YXJ0UG9zLmFzc2lnbiggcG9zaXRpb25Xb3JsZCApO1xyXG5cdFx0XHRlbmRQb3MuYXNzaWduKCBjYW1lcmFQb3NpdGlvbiApO1xyXG5cclxuXHRcdH0gKTtcclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGNvbnN0IHZpZXdWZWN0b3IgPSBlbmRQb3Muc3ViKCBzdGFydFBvcyApO1xyXG5cclxuXHRcdGNvbnN0IHN0ZXBzID0gdW5pZm9ybSggJ2ludCcgKS5vblJlbmRlclVwZGF0ZSggKCB7IG1hdGVyaWFsIH0gKSA9PiBtYXRlcmlhbC5zdGVwcyApO1xyXG5cdFx0Y29uc3Qgc3RlcFNpemUgPSB2aWV3VmVjdG9yLmxlbmd0aCgpLmRpdiggc3RlcHMgKS50b1ZhcigpO1xyXG5cclxuXHRcdGNvbnN0IHJheURpciA9IHZpZXdWZWN0b3Iubm9ybWFsaXplKCkudG9WYXIoKTsgLy8gVE9ETzogdG9WYXIoKSBzaG91bGQgYmUgYXV0b21hdGljIGhlcmUgKCBpbiBsb29wIClcclxuXHJcblx0XHRjb25zdCBkaXN0VHJhdmVsbGVkID0gZmxvYXQoIDAuMCApLnRvVmFyKCk7XHJcblx0XHRjb25zdCB0cmFuc21pdHRhbmNlID0gdmVjMyggMSApLnRvVmFyKCk7XHJcblxyXG5cdFx0aWYgKCBtYXRlcmlhbC5vZmZzZXROb2RlICkge1xyXG5cclxuXHRcdFx0Ly8gcmVkdWNlIGJhbmRpbmdcclxuXHJcblx0XHRcdGRpc3RUcmF2ZWxsZWQuYWRkQXNzaWduKCBtYXRlcmlhbC5vZmZzZXROb2RlLm11bCggc3RlcFNpemUgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRMb29wKCBzdGVwcywgKCkgPT4ge1xyXG5cclxuXHRcdFx0Y29uc3QgcG9zaXRpb25SYXkgPSBzdGFydFBvcy5hZGQoIHJheURpci5tdWwoIGRpc3RUcmF2ZWxsZWQgKSApO1xyXG5cdFx0XHRjb25zdCBwb3NpdGlvblZpZXdSYXkgPSBjYW1lcmFWaWV3TWF0cml4Lm11bCggdmVjNCggcG9zaXRpb25SYXksIDEgKSApLnh5ejtcclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWwuZGVwdGhOb2RlICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRsaW5lYXJEZXB0aFJheS5hc3NpZ24oIGxpbmVhckRlcHRoKCB2aWV3WlRvUGVyc3BlY3RpdmVEZXB0aCggcG9zaXRpb25WaWV3UmF5LnosIGNhbWVyYU5lYXIsIGNhbWVyYUZhciApICkgKTtcclxuXHJcblx0XHRcdFx0Y29udGV4dC5zY2VuZURlcHRoTm9kZSA9IGxpbmVhckRlcHRoKCBtYXRlcmlhbC5kZXB0aE5vZGUgKS50b1ZhcigpO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29udGV4dC5wb3NpdGlvbldvcmxkID0gcG9zaXRpb25SYXk7XHJcblx0XHRcdGNvbnRleHQuc2hhZG93UG9zaXRpb25Xb3JsZCA9IHBvc2l0aW9uUmF5O1xyXG5cdFx0XHRjb250ZXh0LnBvc2l0aW9uVmlldyA9IHBvc2l0aW9uVmlld1JheTtcclxuXHJcblx0XHRcdHNjYXR0ZXJpbmdEZW5zaXR5LmFzc2lnbiggMCApO1xyXG5cclxuXHRcdFx0bGV0IHNjYXR0ZXJpbmdOb2RlO1xyXG5cclxuXHRcdFx0aWYgKCBtYXRlcmlhbC5zY2F0dGVyaW5nTm9kZSApIHtcclxuXHJcblx0XHRcdFx0c2NhdHRlcmluZ05vZGUgPSBtYXRlcmlhbC5zY2F0dGVyaW5nTm9kZSgge1xyXG5cdFx0XHRcdFx0cG9zaXRpb25SYXlcclxuXHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRzdXBlci5zdGFydCggYnVpbGRlciApO1xyXG5cclxuXHRcdFx0aWYgKCBzY2F0dGVyaW5nTm9kZSApIHtcclxuXHJcblx0XHRcdFx0c2NhdHRlcmluZ0RlbnNpdHkubXVsQXNzaWduKCBzY2F0dGVyaW5nTm9kZSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gYmVlcidzIGxhd1xyXG5cclxuXHRcdFx0Y29uc3QgZmFsbG9mZiA9IHNjYXR0ZXJpbmdEZW5zaXR5Lm11bCggLjAxICkubmVnYXRlKCkubXVsKCBzdGVwU2l6ZSApLmV4cCgpO1xyXG5cdFx0XHR0cmFuc21pdHRhbmNlLm11bEFzc2lnbiggZmFsbG9mZiApO1xyXG5cclxuXHRcdFx0Ly8gbW92ZSBhbG9uZyB0aGUgcmF5XHJcblxyXG5cdFx0XHRkaXN0VHJhdmVsbGVkLmFkZEFzc2lnbiggc3RlcFNpemUgKTtcclxuXHJcblx0XHR9ICk7XHJcblxyXG5cdFx0b3V0Z29pbmdSYXlMaWdodC5hZGRBc3NpZ24oIHRyYW5zbWl0dGFuY2Uuc2F0dXJhdGUoKS5vbmVNaW51cygpICk7XHJcblxyXG5cdH1cclxuXHJcblx0c2NhdHRlcmluZ0xpZ2h0KCBsaWdodENvbG9yLCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IHNjZW5lRGVwdGhOb2RlID0gYnVpbGRlci5jb250ZXh0LnNjZW5lRGVwdGhOb2RlO1xyXG5cclxuXHRcdGlmICggc2NlbmVEZXB0aE5vZGUgKSB7XHJcblxyXG5cdFx0XHRJZiggc2NlbmVEZXB0aE5vZGUuZ3JlYXRlclRoYW5FcXVhbCggbGluZWFyRGVwdGhSYXkgKSwgKCkgPT4ge1xyXG5cclxuXHRcdFx0XHRzY2F0dGVyaW5nRGVuc2l0eS5hZGRBc3NpZ24oIGxpZ2h0Q29sb3IgKTtcclxuXHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0c2NhdHRlcmluZ0RlbnNpdHkuYWRkQXNzaWduKCBsaWdodENvbG9yICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGRpcmVjdCggeyBsaWdodE5vZGUsIGxpZ2h0Q29sb3IgfSwgYnVpbGRlciApIHtcclxuXHJcblx0XHQvLyBJZ25vcmUgbGlnaHRzIHdpdGggaW5maW5pdGUgZGlzdGFuY2VcclxuXHJcblx0XHRpZiAoIGxpZ2h0Tm9kZS5saWdodC5kaXN0YW5jZSA9PT0gdW5kZWZpbmVkICkgcmV0dXJuO1xyXG5cclxuXHRcdC8vIFRPRE86IFdlIG5lZWQgYSB2aWV3cG9ydE9wYXF1ZSooKSAoIG91dHB1dCwgZGVwdGggKSB0byBmaXQgd2l0aCBtb2Rlcm4gcmVuZGVyaW5nIGFwcHJvYWNoZXNcclxuXHJcblx0XHRjb25zdCBkaXJlY3RMaWdodCA9IGxpZ2h0Q29sb3IueHl6LnRvVmFyKCk7XHJcblx0XHRkaXJlY3RMaWdodC5tdWxBc3NpZ24oIGxpZ2h0Tm9kZS5zaGFkb3dOb2RlICk7IC8vIGl0IG5vIHNob3VsZCBiZSBuZWNlc3NhcnkgaWYgdXNlZCBpbiB0aGUgc2FtZSByZW5kZXIgcGFzc1xyXG5cclxuXHRcdHRoaXMuc2NhdHRlcmluZ0xpZ2h0KCBkaXJlY3RMaWdodCwgYnVpbGRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdGRpcmVjdFJlY3RBcmVhKCB7IGxpZ2h0Q29sb3IsIGxpZ2h0UG9zaXRpb24sIGhhbGZXaWR0aCwgaGFsZkhlaWdodCB9LCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IHAwID0gbGlnaHRQb3NpdGlvbi5hZGQoIGhhbGZXaWR0aCApLnN1YiggaGFsZkhlaWdodCApOyAvLyBjb3VudGVyY2xvY2t3aXNlOyBsaWdodCBzaGluZXMgaW4gbG9jYWwgbmVnIHogZGlyZWN0aW9uXHJcblx0XHRjb25zdCBwMSA9IGxpZ2h0UG9zaXRpb24uc3ViKCBoYWxmV2lkdGggKS5zdWIoIGhhbGZIZWlnaHQgKTtcclxuXHRcdGNvbnN0IHAyID0gbGlnaHRQb3NpdGlvbi5zdWIoIGhhbGZXaWR0aCApLmFkZCggaGFsZkhlaWdodCApO1xyXG5cdFx0Y29uc3QgcDMgPSBsaWdodFBvc2l0aW9uLmFkZCggaGFsZldpZHRoICkuYWRkKCBoYWxmSGVpZ2h0ICk7XHJcblxyXG5cdFx0Y29uc3QgUCA9IGJ1aWxkZXIuY29udGV4dC5wb3NpdGlvblZpZXc7XHJcblxyXG5cdFx0Y29uc3QgZGlyZWN0TGlnaHQgPSBsaWdodENvbG9yLnh5ei5tdWwoIExUQ19FdmFsdWF0ZV9Wb2x1bWUoIHsgUCwgcDAsIHAxLCBwMiwgcDMgfSApICkucG93KCAxLjUgKTtcclxuXHJcblx0XHR0aGlzLnNjYXR0ZXJpbmdMaWdodCggZGlyZWN0TGlnaHQsIGJ1aWxkZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHRmaW5pc2goIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0YnVpbGRlci5jb250ZXh0Lm91dGdvaW5nTGlnaHQuYXNzaWduKCBvdXRnb2luZ1JheUxpZ2h0ICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFZvbHVtZXRyaWNMaWdodGluZ01vZGVsO1xyXG4iLCJpbXBvcnQgTm9kZU1hdGVyaWFsIGZyb20gJy4vTm9kZU1hdGVyaWFsLmpzJztcclxuaW1wb3J0IFZvbHVtZXRyaWNMaWdodGluZ01vZGVsIGZyb20gJy4uLy4uL25vZGVzL2Z1bmN0aW9ucy9Wb2x1bWV0cmljTGlnaHRpbmdNb2RlbC5qcyc7XHJcbmltcG9ydCB7IEJhY2tTaWRlIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBWb2x1bWUgbm9kZSBtYXRlcmlhbC5cclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVNYXRlcmlhbFxyXG4gKi9cclxuY2xhc3MgVm9sdW1lTm9kZU1hdGVyaWFsIGV4dGVuZHMgTm9kZU1hdGVyaWFsIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnVm9sdW1lTm9kZU1hdGVyaWFsJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHZvbHVtZSBub2RlIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbWV0ZXJzXSAtIFRoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVycyApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1ZvbHVtZU5vZGVNYXRlcmlhbCA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBOdW1iZXIgb2Ygc3RlcHMgdXNlZCBmb3IgcmF5bWFyY2hpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDI1XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc3RlcHMgPSAyNTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIE9mZnNldHMgdGhlIGRpc3RhbmNlIGEgcmF5IGhhcyBiZWVuIHRyYXZlbGVkIHRocm91Z2ggYSB2b2x1bWUuXHJcblx0XHQgKiBDYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgZGl0aGVyaW5nIHRvIHJlZHVjZSBiYW5kaW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlPGZsb2F0Pn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5vZmZzZXROb2RlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIE5vZGUgdXNlZCBmb3Igc2NhdHRlcmluZyBjYWxjdWxhdGlvbnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0Z1bmN0aW9ufEZ1bmN0aW9uTm9kZTx2ZWM0Pn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zY2F0dGVyaW5nTm9kZSA9IG51bGw7XHJcblxyXG5cdFx0dGhpcy5saWdodHMgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudHJhbnNwYXJlbnQgPSB0cnVlO1xyXG5cdFx0dGhpcy5zaWRlID0gQmFja1NpZGU7XHJcblxyXG5cdFx0dGhpcy5kZXB0aFRlc3QgPSBmYWxzZTtcclxuXHRcdHRoaXMuZGVwdGhXcml0ZSA9IGZhbHNlO1xyXG5cclxuXHRcdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXBMaWdodGluZ01vZGVsKCkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgVm9sdW1ldHJpY0xpZ2h0aW5nTW9kZWwoKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgVm9sdW1lTm9kZU1hdGVyaWFsO1xyXG4iLCJcclxuLyoqXHJcbiAqIFRoaXMgbW9kdWxlIG1hbmFnZXMgdGhlIGludGVybmFsIGFuaW1hdGlvbiBsb29wIG9mIHRoZSByZW5kZXJlci5cclxuICpcclxuICogQHByaXZhdGVcclxuICovXHJcbmNsYXNzIEFuaW1hdGlvbiB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYW5pbWF0aW9uIGxvb3AgbWFuYWdlbWVudCBjb21wb25lbnQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVzfSBub2RlcyAtIFJlbmRlcmVyIGNvbXBvbmVudCBmb3IgbWFuYWdpbmcgbm9kZXMgcmVsYXRlZCBsb2dpYy5cclxuXHQgKiBAcGFyYW0ge0luZm99IGluZm8gLSBSZW5kZXJlciBjb21wb25lbnQgZm9yIG1hbmFnaW5nIG1ldHJpY3MgYW5kIG1vbml0b3JpbmcgZGF0YS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggbm9kZXMsIGluZm8gKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZW5kZXJlciBjb21wb25lbnQgZm9yIG1hbmFnaW5nIG5vZGVzIHJlbGF0ZWQgbG9naWMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGVzfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vZGVzID0gbm9kZXM7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZW5kZXJlciBjb21wb25lbnQgZm9yIG1hbmFnaW5nIG1ldHJpY3MgYW5kIG1vbml0b3JpbmcgZGF0YS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7SW5mb31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pbmZvID0gaW5mbztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIHRoZSBjb250ZXh0IGZyb20gYHJlcXVlc3RBbmltYXRpb25GcmFtZSgpYCBjYW5cclxuXHRcdCAqIGJlIGNhbGxlZCAodXN1YWxseSBgd2luZG93YCkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1dpbmRvd3xYUlNlc3Npb259XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX2NvbnRleHQgPSBzZWxmO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHVzZXItZGVmaW5lZCBhbmltYXRpb24gbG9vcC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P0Z1bmN0aW9ufVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9hbmltYXRpb25Mb29wID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByZXF1ZXN0SWQgd2hpY2ggaXMgcmV0dXJuZWQgZnJvbSB0aGUgYHJlcXVlc3RBbmltYXRpb25GcmFtZSgpYCBjYWxsLlxyXG5cdFx0ICogQ2FuIGJlIHVzZWQgdG8gY2FuY2VsIHRoZSBzdG9wIHRoZSBhbmltYXRpb24gbG9vcC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fcmVxdWVzdElkID0gbnVsbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTdGFydHMgdGhlIGludGVybmFsIGFuaW1hdGlvbiBsb29wLlxyXG5cdCAqL1xyXG5cdHN0YXJ0KCkge1xyXG5cclxuXHRcdGNvbnN0IHVwZGF0ZSA9ICggdGltZSwgeHJGcmFtZSApID0+IHtcclxuXHJcblx0XHRcdHRoaXMuX3JlcXVlc3RJZCA9IHRoaXMuX2NvbnRleHQucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCB1cGRhdGUgKTtcclxuXHJcblx0XHRcdGlmICggdGhpcy5pbmZvLmF1dG9SZXNldCA9PT0gdHJ1ZSApIHRoaXMuaW5mby5yZXNldCgpO1xyXG5cclxuXHRcdFx0dGhpcy5ub2Rlcy5ub2RlRnJhbWUudXBkYXRlKCk7XHJcblxyXG5cdFx0XHR0aGlzLmluZm8uZnJhbWUgPSB0aGlzLm5vZGVzLm5vZGVGcmFtZS5mcmFtZUlkO1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLl9hbmltYXRpb25Mb29wICE9PSBudWxsICkgdGhpcy5fYW5pbWF0aW9uTG9vcCggdGltZSwgeHJGcmFtZSApO1xyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0dXBkYXRlKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3RvcHMgdGhlIGludGVybmFsIGFuaW1hdGlvbiBsb29wLlxyXG5cdCAqL1xyXG5cdHN0b3AoKSB7XHJcblxyXG5cdFx0dGhpcy5fY29udGV4dC5jYW5jZWxBbmltYXRpb25GcmFtZSggdGhpcy5fcmVxdWVzdElkICk7XHJcblxyXG5cdFx0dGhpcy5fcmVxdWVzdElkID0gbnVsbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSB1c2VyLWxldmVsIGFuaW1hdGlvbiBsb29wLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7P0Z1bmN0aW9ufSBUaGUgYW5pbWF0aW9uIGxvb3AuXHJcblx0ICovXHJcblx0Z2V0QW5pbWF0aW9uTG9vcCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fYW5pbWF0aW9uTG9vcDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWZpbmVzIHRoZSB1c2VyLWxldmVsIGFuaW1hdGlvbiBsb29wLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHs/RnVuY3Rpb259IGNhbGxiYWNrIC0gVGhlIGFuaW1hdGlvbiBsb29wLlxyXG5cdCAqL1xyXG5cdHNldEFuaW1hdGlvbkxvb3AoIGNhbGxiYWNrICkge1xyXG5cclxuXHRcdHRoaXMuX2FuaW1hdGlvbkxvb3AgPSBjYWxsYmFjaztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBhbmltYXRpb24gY29udGV4dC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1dpbmRvd3xYUlNlc3Npb259IFRoZSBhbmltYXRpb24gY29udGV4dC5cclxuXHQgKi9cclxuXHRnZXRDb250ZXh0KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9jb250ZXh0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgdGhlIGNvbnRleHQgaW4gd2hpY2ggYHJlcXVlc3RBbmltYXRpb25GcmFtZSgpYCBpcyBleGVjdXRlZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7V2luZG93fFhSU2Vzc2lvbn0gY29udGV4dCAtIFRoZSBjb250ZXh0IHRvIHNldC5cclxuXHQgKi9cclxuXHRzZXRDb250ZXh0KCBjb250ZXh0ICkge1xyXG5cclxuXHRcdHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZyZWVzIGFsbCBpbnRlcm5hbCByZXNvdXJjZXMgYW5kIHN0b3BzIHRoZSBhbmltYXRpb24gbG9vcC5cclxuXHQgKi9cclxuXHRkaXNwb3NlKCkge1xyXG5cclxuXHRcdHRoaXMuc3RvcCgpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBBbmltYXRpb247XHJcbiIsIi8qKlxyXG4gKiBEYXRhIHN0cnVjdHVyZSBmb3IgdGhlIHJlbmRlcmVyLiBJdCBhbGxvd3MgZGVmaW5pbmcgdmFsdWVzXHJcbiAqIHdpdGggY2hhaW5lZCwgaGllcmFyY2hpY2FsIGtleXMuIEtleXMgYXJlIG1lYW50IHRvIGJlXHJcbiAqIG9iamVjdHMgc2luY2UgdGhlIG1vZHVsZSBpbnRlcm5hbGx5IHdvcmtzIHdpdGggV2VhayBNYXBzXHJcbiAqIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuY2xhc3MgQ2hhaW5NYXAge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IENoYWluIE1hcC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByb290IFdlYWsgTWFwLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtXZWFrTWFwfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLndlYWtNYXAgPSBuZXcgV2Vha01hcCgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gYXJyYXkgb2Yga2V5cy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8T2JqZWN0Pn0ga2V5cyAtIExpc3Qgb2Yga2V5cy5cclxuXHQgKiBAcmV0dXJuIHthbnl9IFRoZSB2YWx1ZS4gUmV0dXJucyBgdW5kZWZpbmVkYCBpZiBubyB2YWx1ZSB3YXMgZm91bmQuXHJcblx0ICovXHJcblx0Z2V0KCBrZXlzICkge1xyXG5cclxuXHRcdGxldCBtYXAgPSB0aGlzLndlYWtNYXA7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGggLSAxOyBpICsrICkge1xyXG5cclxuXHRcdFx0bWFwID0gbWFwLmdldCgga2V5c1sgaSBdICk7XHJcblxyXG5cdFx0XHRpZiAoIG1hcCA9PT0gdW5kZWZpbmVkICkgcmV0dXJuIHVuZGVmaW5lZDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG1hcC5nZXQoIGtleXNbIGtleXMubGVuZ3RoIC0gMSBdICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBrZXlzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxPYmplY3Q+fSBrZXlzIC0gTGlzdCBvZiBrZXlzLlxyXG5cdCAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBzZXQuXHJcblx0ICogQHJldHVybiB7Q2hhaW5NYXB9IEEgcmVmZXJlbmNlIHRvIHRoaXMgQ2hhaW4gTWFwLlxyXG5cdCAqL1xyXG5cdHNldCgga2V5cywgdmFsdWUgKSB7XHJcblxyXG5cdFx0bGV0IG1hcCA9IHRoaXMud2Vha01hcDtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aCAtIDE7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBrZXkgPSBrZXlzWyBpIF07XHJcblxyXG5cdFx0XHRpZiAoIG1hcC5oYXMoIGtleSApID09PSBmYWxzZSApIG1hcC5zZXQoIGtleSwgbmV3IFdlYWtNYXAoKSApO1xyXG5cclxuXHRcdFx0bWFwID0gbWFwLmdldCgga2V5ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdG1hcC5zZXQoIGtleXNbIGtleXMubGVuZ3RoIC0gMSBdLCB2YWx1ZSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlbGV0ZXMgYSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGtleXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PE9iamVjdD59IGtleXMgLSBUaGUga2V5cy5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWUgaGFzIGJlZW4gcmVtb3ZlZCBzdWNjZXNzZnVsbHkgYW5kIGBmYWxzZWAgaWYgdGhlIHZhbHVlIGhhcyBub3QgYmUgZm91bmQuXHJcblx0ICovXHJcblx0ZGVsZXRlKCBrZXlzICkge1xyXG5cclxuXHRcdGxldCBtYXAgPSB0aGlzLndlYWtNYXA7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGggLSAxOyBpICsrICkge1xyXG5cclxuXHRcdFx0bWFwID0gbWFwLmdldCgga2V5c1sgaSBdICk7XHJcblxyXG5cdFx0XHRpZiAoIG1hcCA9PT0gdW5kZWZpbmVkICkgcmV0dXJuIGZhbHNlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbWFwLmRlbGV0ZSgga2V5c1sga2V5cy5sZW5ndGggLSAxIF0gKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQ2hhaW5NYXA7XHJcbiIsImltcG9ydCB7IGhhc2gsIGhhc2hTdHJpbmcgfSBmcm9tICcuLi8uLi9ub2Rlcy9jb3JlL05vZGVVdGlscy5qcyc7XHJcblxyXG5sZXQgX2lkID0gMDtcclxuXHJcbmZ1bmN0aW9uIGdldEtleXMoIG9iaiApIHtcclxuXHJcblx0Y29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKCBvYmogKTtcclxuXHJcblx0bGV0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKCBvYmogKTtcclxuXHJcblx0d2hpbGUgKCBwcm90byApIHtcclxuXHJcblx0XHRjb25zdCBkZXNjcmlwdG9ycyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKCBwcm90byApO1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IGtleSBpbiBkZXNjcmlwdG9ycyApIHtcclxuXHJcblx0XHRcdGlmICggZGVzY3JpcHRvcnNbIGtleSBdICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yc1sga2V5IF07XHJcblxyXG5cdFx0XHRcdGlmICggZGVzY3JpcHRvciAmJiB0eXBlb2YgZGVzY3JpcHRvci5nZXQgPT09ICdmdW5jdGlvbicgKSB7XHJcblxyXG5cdFx0XHRcdFx0a2V5cy5wdXNoKCBrZXkgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiggcHJvdG8gKTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4ga2V5cztcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBIHJlbmRlciBvYmplY3QgaXMgdGhlIHJlbmRlcmVyJ3MgcmVwcmVzZW50YXRpb24gb2Ygc2luZ2xlIGVudGl0eSB0aGF0IGdldHMgZHJhd25cclxuICogd2l0aCBhIGRyYXcgY29tbWFuZC4gVGhlcmUgaXMgbm8gdW5pcXVlIG1hcHBpbmcgb2YgcmVuZGVyIG9iamVjdHMgdG8gM0Qgb2JqZWN0cyBpbiB0aGVcclxuICogc2NlbmUgc2luY2UgcmVuZGVyIG9iamVjdHMgYWxzbyBkZXBlbmQgZnJvbSB0aGUgdXNlZCBtYXRlcmlhbCwgdGhlIGN1cnJlbnQgcmVuZGVyIGNvbnRleHRcclxuICogYW5kIHRoZSBjdXJyZW50IHNjZW5lJ3MgbGlnaHRpbmcuXHJcbiAqXHJcbiAqIEluIGdlbmVyYWwsIHRoZSBiYXNpYyBwcm9jZXNzIG9mIHRoZSByZW5kZXJlciBpczpcclxuICpcclxuICogLSBBbmFseXplIHRoZSAzRCBvYmplY3RzIGluIHRoZSBzY2VuZSBhbmQgZ2VuZXJhdGUgcmVuZGVyIGxpc3RzIGNvbnRhaW5pbmcgcmVuZGVyIGl0ZW1zLlxyXG4gKiAtIFByb2Nlc3MgdGhlIHJlbmRlciBsaXN0cyBieSBjYWxsaW5nIG9uZSBvciBtb3JlIHJlbmRlciBjb21tYW5kcyBmb3IgZWFjaCByZW5kZXIgaXRlbS5cclxuICogLSBGb3IgZWFjaCByZW5kZXIgY29tbWFuZCwgcmVxdWVzdCBhIHJlbmRlciBvYmplY3QgYW5kIHBlcmZvcm0gdGhlIGRyYXcuXHJcbiAqXHJcbiAqIFRoZSBtb2R1bGUgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIHRvIGdldCBkYXRhIHJlcXVpcmVkIGZvciB0aGUgZHJhdyBjb21tYW5kIGxpa2UgdGhlIGFjdHVhbFxyXG4gKiBkcmF3IHBhcmFtZXRlcnMgb3IgdmVydGV4IGJ1ZmZlcnMuIEl0IGFsc28gaG9sZHMgYSBzZXJpZXMgb2YgY2FjaGluZyByZWxhdGVkIG1ldGhvZHMgc2luY2VcclxuICogY3JlYXRpbmcgcmVuZGVyIG9iamVjdHMgc2hvdWxkIG9ubHkgYmUgZG9uZSB3aGVuIG5lY2Vzc2FyeS5cclxuICpcclxuICogQHByaXZhdGVcclxuICovXHJcbmNsYXNzIFJlbmRlck9iamVjdCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcmVuZGVyIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZXN9IG5vZGVzIC0gUmVuZGVyZXIgY29tcG9uZW50IGZvciBtYW5hZ2luZyBub2RlcyByZWxhdGVkIGxvZ2ljLlxyXG5cdCAqIEBwYXJhbSB7R2VvbWV0cmllc30gZ2VvbWV0cmllcyAtIFJlbmRlcmVyIGNvbXBvbmVudCBmb3IgbWFuYWdpbmcgZ2VvbWV0cmllcy5cclxuXHQgKiBAcGFyYW0ge1JlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcGFyYW0ge09iamVjdDNEfSBvYmplY3QgLSBUaGUgM0Qgb2JqZWN0LlxyXG5cdCAqIEBwYXJhbSB7TWF0ZXJpYWx9IG1hdGVyaWFsIC0gVGhlIDNEIG9iamVjdCdzIG1hdGVyaWFsLlxyXG5cdCAqIEBwYXJhbSB7U2NlbmV9IHNjZW5lIC0gVGhlIHNjZW5lIHRoZSAzRCBvYmplY3QgYmVsb25ncyB0by5cclxuXHQgKiBAcGFyYW0ge0NhbWVyYX0gY2FtZXJhIC0gVGhlIGNhbWVyYSB0aGUgb2JqZWN0IHNob3VsZCBiZSByZW5kZXJlZCB3aXRoLlxyXG5cdCAqIEBwYXJhbSB7TGlnaHRzTm9kZX0gbGlnaHRzTm9kZSAtIFRoZSBsaWdodHMgbm9kZS5cclxuXHQgKiBAcGFyYW0ge1JlbmRlckNvbnRleHR9IHJlbmRlckNvbnRleHQgLSBUaGUgcmVuZGVyIGNvbnRleHQuXHJcblx0ICogQHBhcmFtIHtDbGlwcGluZ0NvbnRleHR9IGNsaXBwaW5nQ29udGV4dCAtIFRoZSBjbGlwcGluZyBjb250ZXh0LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBub2RlcywgZ2VvbWV0cmllcywgcmVuZGVyZXIsIG9iamVjdCwgbWF0ZXJpYWwsIHNjZW5lLCBjYW1lcmEsIGxpZ2h0c05vZGUsIHJlbmRlckNvbnRleHQsIGNsaXBwaW5nQ29udGV4dCApIHtcclxuXHJcblx0XHR0aGlzLmlkID0gX2lkICsrO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVuZGVyZXIgY29tcG9uZW50IGZvciBtYW5hZ2luZyBub2RlcyByZWxhdGVkIGxvZ2ljLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2Rlc31cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX25vZGVzID0gbm9kZXM7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZW5kZXJlciBjb21wb25lbnQgZm9yIG1hbmFnaW5nIGdlb21ldHJpZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0dlb21ldHJpZXN9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9nZW9tZXRyaWVzID0gZ2VvbWV0cmllcztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByZW5kZXJlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7UmVuZGVyZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSAzRCBvYmplY3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdDNEfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm9iamVjdCA9IG9iamVjdDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSAzRCBvYmplY3QncyBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7TWF0ZXJpYWx9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWF0ZXJpYWwgPSBtYXRlcmlhbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBzY2VuZSB0aGUgM0Qgb2JqZWN0IGJlbG9uZ3MgdG8uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1NjZW5lfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNjZW5lID0gc2NlbmU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY2FtZXJhIHRoZSAzRCBvYmplY3Qgc2hvdWxkIGJlIHJlbmRlcmVkIHdpdGguXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0NhbWVyYX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jYW1lcmEgPSBjYW1lcmE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbGlnaHRzIG5vZGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0xpZ2h0c05vZGV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGlnaHRzTm9kZSA9IGxpZ2h0c05vZGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcmVuZGVyIGNvbnRleHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1JlbmRlckNvbnRleHR9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29udGV4dCA9IHJlbmRlckNvbnRleHQ7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgM0Qgb2JqZWN0J3MgZ2VvbWV0cnkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0J1ZmZlckdlb21ldHJ5fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdlb21ldHJ5ID0gb2JqZWN0Lmdlb21ldHJ5O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJlbmRlciBvYmplY3QncyB2ZXJzaW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudmVyc2lvbiA9IG1hdGVyaWFsLnZlcnNpb247XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZHJhdyByYW5nZSBvZiB0aGUgZ2VvbWV0cnkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9PYmplY3R9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZHJhd1JhbmdlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIGFycmF5IGhvbGRpbmcgdGhlIGJ1ZmZlciBhdHRyaWJ1dGVzXHJcblx0XHQgKiBvZiB0aGUgcmVuZGVyIG9iamVjdC4gVGhpcyBlbnRhaWxzIGF0dHJpYnV0ZVxyXG5cdFx0ICogZGVmaW5pdGlvbnMgb24gZ2VvbWV0cnkgYW5kIG5vZGUgbGV2ZWwuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9BcnJheTxCdWZmZXJBdHRyaWJ1dGU+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmF0dHJpYnV0ZXMgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gYSByZW5kZXIgcGlwZWxpbmUgdGhlIHJlbmRlclxyXG5cdFx0ICogb2JqZWN0IGlzIHByb2Nlc3NlZCB3aXRoLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtSZW5kZXJQaXBlbGluZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5waXBlbGluZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBPbmx5IHJlbGV2YW50IGZvciBvYmplY3RzIHVzaW5nXHJcblx0XHQgKiBtdWx0aXBsZSBtYXRlcmlhbHMuIFRoaXMgcmVwcmVzZW50cyBhIGdyb3VwIGVudHJ5XHJcblx0XHQgKiBmcm9tIHRoZSByZXNwZWN0aXZlIGBCdWZmZXJHZW9tZXRyeWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez97c3RhcnQ6IG51bWJlciwgY291bnQ6IG51bWJlcn19XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ3JvdXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQW4gYXJyYXkgaG9sZGluZyB0aGUgdmVydGV4IGJ1ZmZlcnMgd2hpY2ggY2FuXHJcblx0XHQgKiBiZSBidWZmZXIgYXR0cmlidXRlcyBidXQgYWxzbyBpbnRlcmxlYXZlZCBidWZmZXJzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/QXJyYXk8QnVmZmVyQXR0cmlidXRlfEludGVybGVhdmVkQnVmZmVyPn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52ZXJ0ZXhCdWZmZXJzID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZHJhdyBjb21tYW5kLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/T2JqZWN0fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRyYXdQYXJhbXMgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSWYgdGhpcyByZW5kZXIgb2JqZWN0IGlzIHVzZWQgaW5zaWRlIGEgcmVuZGVyIGJ1bmRsZSxcclxuXHRcdCAqIHRoaXMgcHJvcGVydHkgcG9pbnRzIHRvIHRoZSByZXNwZWN0aXZlIGJ1bmRsZSBncm91cC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P0J1bmRsZUdyb3VwfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJ1bmRsZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY2xpcHBpbmcgY29udGV4dC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Q2xpcHBpbmdDb250ZXh0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNsaXBwaW5nQ29udGV4dCA9IGNsaXBwaW5nQ29udGV4dDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjbGlwcGluZyBjb250ZXh0J3MgY2FjaGUga2V5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2xpcHBpbmdDb250ZXh0Q2FjaGVLZXkgPSBjbGlwcGluZ0NvbnRleHQgIT09IG51bGwgPyBjbGlwcGluZ0NvbnRleHQuY2FjaGVLZXkgOiAnJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBpbml0aWFsIG5vZGUgY2FjaGUga2V5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaW5pdGlhbE5vZGVzQ2FjaGVLZXkgPSB0aGlzLmdldER5bmFtaWNDYWNoZUtleSgpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGluaXRpYWwgY2FjaGUga2V5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaW5pdGlhbENhY2hlS2V5ID0gdGhpcy5nZXRDYWNoZUtleSgpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG5vZGUgYnVpbGRlciBzdGF0ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGVCdWlsZGVyU3RhdGV9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9ub2RlQnVpbGRlclN0YXRlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIGFycmF5IG9mIGJpbmRpbmdzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/QXJyYXk8QmluZEdyb3VwPn1cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX2JpbmRpbmdzID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlZmVyZW5jZSB0byB0aGUgbm9kZSBtYXRlcmlhbCBvYnNlcnZlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGVNYXRlcmlhbE9ic2VydmVyfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fbW9uaXRvciA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBldmVudCBsaXN0ZW5lciB3aGljaCBpcyBkZWZpbmVkIGJ5IGBSZW5kZXJPYmplY3RzYC4gSXQgcGVyZm9ybXNcclxuXHRcdCAqIGNsZWFuIHVwIHRhc2tzIHdoZW4gYGRpc3Bvc2UoKWAgb24gdGhpcyByZW5kZXIgb2JqZWN0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEBtZXRob2RcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5vbkRpc3Bvc2UgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1JlbmRlck9iamVjdCA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBldmVudCBsaXN0ZW5lciB3aGljaCBpcyBleGVjdXRlZCB3aGVuIGBkaXNwb3NlKClgIGlzIGNhbGxlZCBvblxyXG5cdFx0ICogdGhlIHJlbmRlciBvYmplY3QncyBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAbWV0aG9kXHJcblx0XHQgKi9cclxuXHRcdHRoaXMub25NYXRlcmlhbERpc3Bvc2UgPSAoKSA9PiB7XHJcblxyXG5cdFx0XHR0aGlzLmRpc3Bvc2UoKTtcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdHRoaXMubWF0ZXJpYWwuYWRkRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCB0aGlzLm9uTWF0ZXJpYWxEaXNwb3NlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgY2xpcHBpbmcgY29udGV4dC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Q2xpcHBpbmdDb250ZXh0fSBjb250ZXh0IC0gVGhlIGNsaXBwaW5nIGNvbnRleHQgdG8gc2V0LlxyXG5cdCAqL1xyXG5cdHVwZGF0ZUNsaXBwaW5nKCBjb250ZXh0ICkge1xyXG5cclxuXHRcdHRoaXMuY2xpcHBpbmdDb250ZXh0ID0gY29udGV4dDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBXaGV0aGVyIHRoZSBjbGlwcGluZyByZXF1aXJlcyBhbiB1cGRhdGUgb3Igbm90LlxyXG5cdCAqXHJcblx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0ICogQHJlYWRvbmx5XHJcblx0ICovXHJcblx0Z2V0IGNsaXBwaW5nTmVlZHNVcGRhdGUoKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmNsaXBwaW5nQ29udGV4dCA9PT0gbnVsbCB8fCB0aGlzLmNsaXBwaW5nQ29udGV4dC5jYWNoZUtleSA9PT0gdGhpcy5jbGlwcGluZ0NvbnRleHRDYWNoZUtleSApIHJldHVybiBmYWxzZTtcclxuXHJcblx0XHR0aGlzLmNsaXBwaW5nQ29udGV4dENhY2hlS2V5ID0gdGhpcy5jbGlwcGluZ0NvbnRleHQuY2FjaGVLZXk7XHJcblxyXG5cdFx0cmV0dXJuIHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIG51bWJlciBvZiBjbGlwcGluZyBwbGFuZXMgZGVmaW5lZCBpbiBjb250ZXh0IG9mIGhhcmR3YXJlIGNsaXBwaW5nLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge251bWJlcn1cclxuXHQgKiBAcmVhZG9ubHlcclxuXHQgKi9cclxuXHRnZXQgaGFyZHdhcmVDbGlwcGluZ1BsYW5lcygpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5tYXRlcmlhbC5oYXJkd2FyZUNsaXBwaW5nID09PSB0cnVlID8gdGhpcy5jbGlwcGluZ0NvbnRleHQudW5pb25DbGlwcGluZ0NvdW50IDogMDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBub2RlIGJ1aWxkZXIgc3RhdGUgb2YgdGhpcyByZW5kZXIgb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Tm9kZUJ1aWxkZXJTdGF0ZX0gVGhlIG5vZGUgYnVpbGRlciBzdGF0ZS5cclxuXHQgKi9cclxuXHRnZXROb2RlQnVpbGRlclN0YXRlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9ub2RlQnVpbGRlclN0YXRlIHx8ICggdGhpcy5fbm9kZUJ1aWxkZXJTdGF0ZSA9IHRoaXMuX25vZGVzLmdldEZvclJlbmRlciggdGhpcyApICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgbm9kZSBtYXRlcmlhbCBvYnNlcnZlciBvZiB0aGlzIHJlbmRlciBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtOb2RlTWF0ZXJpYWxPYnNlcnZlcn0gVGhlIG5vZGUgbWF0ZXJpYWwgb2JzZXJ2ZXIuXHJcblx0ICovXHJcblx0Z2V0TW9uaXRvcigpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fbW9uaXRvciB8fCAoIHRoaXMuX21vbml0b3IgPSB0aGlzLmdldE5vZGVCdWlsZGVyU3RhdGUoKS5vYnNlcnZlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYW4gYXJyYXkgb2YgYmluZCBncm91cHMgb2YgdGhpcyByZW5kZXIgb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7QXJyYXk8QmluZEdyb3VwPn0gVGhlIGJpbmRpbmdzLlxyXG5cdCAqL1xyXG5cdGdldEJpbmRpbmdzKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9iaW5kaW5ncyB8fCAoIHRoaXMuX2JpbmRpbmdzID0gdGhpcy5nZXROb2RlQnVpbGRlclN0YXRlKCkuY3JlYXRlQmluZGluZ3MoKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBiaW5kaW5nIGdyb3VwIGJ5IGdyb3VwIG5hbWUgb2YgdGhpcyByZW5kZXIgb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgYmluZGluZyBncm91cC5cclxuXHQgKiBAcmV0dXJuIHs/QmluZEdyb3VwfSBUaGUgYmluZGluZ3MuXHJcblx0ICovXHJcblx0Z2V0QmluZGluZ0dyb3VwKCBuYW1lICkge1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IGJpbmRpbmdHcm91cCBvZiB0aGlzLmdldEJpbmRpbmdzKCkgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGJpbmRpbmdHcm91cC5uYW1lID09PSBuYW1lICkge1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gYmluZGluZ0dyb3VwO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgcmVuZGVyIG9iamVjdCdzIGdlb21ldHJ5LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7P0J1ZmZlckF0dHJpYnV0ZX0gVGhlIGluZGV4LiBSZXR1cm5zIGBudWxsYCBmb3Igbm9uLWluZGV4ZWQgZ2VvbWV0cmllcy5cclxuXHQgKi9cclxuXHRnZXRJbmRleCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fZ2VvbWV0cmllcy5nZXRJbmRleCggdGhpcyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGluZGlyZWN0IGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHs/QnVmZmVyQXR0cmlidXRlfSBUaGUgaW5kaXJlY3QgYXR0cmlidXRlLiBgbnVsbGAgaWYgbm8gaW5kaXJlY3QgZHJhd2luZyBpcyB1c2VkLlxyXG5cdCAqL1xyXG5cdGdldEluZGlyZWN0KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9nZW9tZXRyaWVzLmdldEluZGlyZWN0KCB0aGlzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhbiBhcnJheSB0aGF0IGFjdHMgYXMgYSBrZXkgZm9yIGlkZW50aWZ5aW5nIHRoZSByZW5kZXIgb2JqZWN0IGluIGEgY2hhaW4gbWFwLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7QXJyYXk8T2JqZWN0Pn0gQW4gYXJyYXkgd2l0aCBvYmplY3QgcmVmZXJlbmNlcy5cclxuXHQgKi9cclxuXHRnZXRDaGFpbkFycmF5KCkge1xyXG5cclxuXHRcdHJldHVybiBbIHRoaXMub2JqZWN0LCB0aGlzLm1hdGVyaWFsLCB0aGlzLmNvbnRleHQsIHRoaXMubGlnaHRzTm9kZSBdO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgd2hlbiB0aGUgZ2VvbWV0cnkgb2YgYSAzRCBvYmplY3QgaGFzIGJlZW4gZXhjaGFuZ2VkIGFuZCB0aGVcclxuXHQgKiByZXNwZWN0aXZlIHJlbmRlciBvYmplY3Qgbm93IHJlcXVpcmVzIGFuIHVwZGF0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyR2VvbWV0cnl9IGdlb21ldHJ5IC0gVGhlIGdlb21ldHJ5IHRvIHNldC5cclxuXHQgKi9cclxuXHRzZXRHZW9tZXRyeSggZ2VvbWV0cnkgKSB7XHJcblxyXG5cdFx0dGhpcy5nZW9tZXRyeSA9IGdlb21ldHJ5O1xyXG5cdFx0dGhpcy5hdHRyaWJ1dGVzID0gbnVsbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBidWZmZXIgYXR0cmlidXRlcyBvZiB0aGUgcmVuZGVyIG9iamVjdC4gVGhlIHJldHVybmVkIGFycmF5IGhvbGRzXHJcblx0ICogYXR0cmlidXRlIGRlZmluaXRpb25zIG9uIGdlb21ldHJ5IGFuZCBub2RlIGxldmVsLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7QXJyYXk8QnVmZmVyQXR0cmlidXRlPn0gQW4gYXJyYXkgd2l0aCBidWZmZXIgYXR0cmlidXRlcy5cclxuXHQgKi9cclxuXHRnZXRBdHRyaWJ1dGVzKCkge1xyXG5cclxuXHRcdGlmICggdGhpcy5hdHRyaWJ1dGVzICE9PSBudWxsICkgcmV0dXJuIHRoaXMuYXR0cmlidXRlcztcclxuXHJcblx0XHRjb25zdCBub2RlQXR0cmlidXRlcyA9IHRoaXMuZ2V0Tm9kZUJ1aWxkZXJTdGF0ZSgpLm5vZGVBdHRyaWJ1dGVzO1xyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xyXG5cclxuXHRcdGNvbnN0IGF0dHJpYnV0ZXMgPSBbXTtcclxuXHRcdGNvbnN0IHZlcnRleEJ1ZmZlcnMgPSBuZXcgU2V0KCk7XHJcblxyXG5cdFx0Zm9yICggY29uc3Qgbm9kZUF0dHJpYnV0ZSBvZiBub2RlQXR0cmlidXRlcyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGF0dHJpYnV0ZSA9IG5vZGVBdHRyaWJ1dGUubm9kZSAmJiBub2RlQXR0cmlidXRlLm5vZGUuYXR0cmlidXRlID8gbm9kZUF0dHJpYnV0ZS5ub2RlLmF0dHJpYnV0ZSA6IGdlb21ldHJ5LmdldEF0dHJpYnV0ZSggbm9kZUF0dHJpYnV0ZS5uYW1lICk7XHJcblxyXG5cdFx0XHRpZiAoIGF0dHJpYnV0ZSA9PT0gdW5kZWZpbmVkICkgY29udGludWU7XHJcblxyXG5cdFx0XHRhdHRyaWJ1dGVzLnB1c2goIGF0dHJpYnV0ZSApO1xyXG5cclxuXHRcdFx0Y29uc3QgYnVmZmVyQXR0cmlidXRlID0gYXR0cmlidXRlLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgPyBhdHRyaWJ1dGUuZGF0YSA6IGF0dHJpYnV0ZTtcclxuXHRcdFx0dmVydGV4QnVmZmVycy5hZGQoIGJ1ZmZlckF0dHJpYnV0ZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzO1xyXG5cdFx0dGhpcy52ZXJ0ZXhCdWZmZXJzID0gQXJyYXkuZnJvbSggdmVydGV4QnVmZmVycy52YWx1ZXMoKSApO1xyXG5cclxuXHRcdHJldHVybiBhdHRyaWJ1dGVzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHZlcnRleCBidWZmZXJzIG9mIHRoZSByZW5kZXIgb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7QXJyYXk8QnVmZmVyQXR0cmlidXRlfEludGVybGVhdmVkQnVmZmVyPn0gQW4gYXJyYXkgd2l0aCBidWZmZXIgYXR0cmlidXRlIG9yIGludGVybGVhdmVkIGJ1ZmZlcnMuXHJcblx0ICovXHJcblx0Z2V0VmVydGV4QnVmZmVycygpIHtcclxuXHJcblx0XHRpZiAoIHRoaXMudmVydGV4QnVmZmVycyA9PT0gbnVsbCApIHRoaXMuZ2V0QXR0cmlidXRlcygpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnZlcnRleEJ1ZmZlcnM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgZHJhdyBwYXJhbWV0ZXJzIGZvciB0aGUgcmVuZGVyIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4gez97dmVydGV4Q291bnQ6IG51bWJlciwgZmlyc3RWZXJ0ZXg6IG51bWJlciwgaW5zdGFuY2VDb3VudDogbnVtYmVyLCBmaXJzdEluc3RhbmNlOiBudW1iZXJ9fSBUaGUgZHJhdyBwYXJhbWV0ZXJzLlxyXG5cdCAqL1xyXG5cdGdldERyYXdQYXJhbWV0ZXJzKCkge1xyXG5cclxuXHRcdGNvbnN0IHsgb2JqZWN0LCBtYXRlcmlhbCwgZ2VvbWV0cnksIGdyb3VwLCBkcmF3UmFuZ2UgfSA9IHRoaXM7XHJcblxyXG5cdFx0Y29uc3QgZHJhd1BhcmFtcyA9IHRoaXMuZHJhd1BhcmFtcyB8fCAoIHRoaXMuZHJhd1BhcmFtcyA9IHtcclxuXHRcdFx0dmVydGV4Q291bnQ6IDAsXHJcblx0XHRcdGZpcnN0VmVydGV4OiAwLFxyXG5cdFx0XHRpbnN0YW5jZUNvdW50OiAwLFxyXG5cdFx0XHRmaXJzdEluc3RhbmNlOiAwXHJcblx0XHR9ICk7XHJcblxyXG5cdFx0Y29uc3QgaW5kZXggPSB0aGlzLmdldEluZGV4KCk7XHJcblx0XHRjb25zdCBoYXNJbmRleCA9ICggaW5kZXggIT09IG51bGwgKTtcclxuXHRcdGNvbnN0IGluc3RhbmNlQ291bnQgPSBnZW9tZXRyeS5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5ID8gZ2VvbWV0cnkuaW5zdGFuY2VDb3VudCA6ICggb2JqZWN0LmNvdW50ID4gMSA/IG9iamVjdC5jb3VudCA6IDEgKTtcclxuXHJcblx0XHRpZiAoIGluc3RhbmNlQ291bnQgPT09IDAgKSByZXR1cm4gbnVsbDtcclxuXHJcblx0XHRkcmF3UGFyYW1zLmluc3RhbmNlQ291bnQgPSBpbnN0YW5jZUNvdW50O1xyXG5cclxuXHRcdGlmICggb2JqZWN0LmlzQmF0Y2hlZE1lc2ggPT09IHRydWUgKSByZXR1cm4gZHJhd1BhcmFtcztcclxuXHJcblx0XHRsZXQgcmFuZ2VGYWN0b3IgPSAxO1xyXG5cclxuXHRcdGlmICggbWF0ZXJpYWwud2lyZWZyYW1lID09PSB0cnVlICYmICEgb2JqZWN0LmlzUG9pbnRzICYmICEgb2JqZWN0LmlzTGluZVNlZ21lbnRzICYmICEgb2JqZWN0LmlzTGluZSAmJiAhIG9iamVjdC5pc0xpbmVMb29wICkge1xyXG5cclxuXHRcdFx0cmFuZ2VGYWN0b3IgPSAyO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRsZXQgZmlyc3RWZXJ0ZXggPSBkcmF3UmFuZ2Uuc3RhcnQgKiByYW5nZUZhY3RvcjtcclxuXHRcdGxldCBsYXN0VmVydGV4ID0gKCBkcmF3UmFuZ2Uuc3RhcnQgKyBkcmF3UmFuZ2UuY291bnQgKSAqIHJhbmdlRmFjdG9yO1xyXG5cclxuXHRcdGlmICggZ3JvdXAgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRmaXJzdFZlcnRleCA9IE1hdGgubWF4KCBmaXJzdFZlcnRleCwgZ3JvdXAuc3RhcnQgKiByYW5nZUZhY3RvciApO1xyXG5cdFx0XHRsYXN0VmVydGV4ID0gTWF0aC5taW4oIGxhc3RWZXJ0ZXgsICggZ3JvdXAuc3RhcnQgKyBncm91cC5jb3VudCApICogcmFuZ2VGYWN0b3IgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgcG9zaXRpb24gPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xyXG5cdFx0bGV0IGl0ZW1Db3VudCA9IEluZmluaXR5O1xyXG5cclxuXHRcdGlmICggaGFzSW5kZXggKSB7XHJcblxyXG5cdFx0XHRpdGVtQ291bnQgPSBpbmRleC5jb3VudDtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBwb3NpdGlvbiAhPT0gdW5kZWZpbmVkICYmIHBvc2l0aW9uICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0aXRlbUNvdW50ID0gcG9zaXRpb24uY291bnQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZpcnN0VmVydGV4ID0gTWF0aC5tYXgoIGZpcnN0VmVydGV4LCAwICk7XHJcblx0XHRsYXN0VmVydGV4ID0gTWF0aC5taW4oIGxhc3RWZXJ0ZXgsIGl0ZW1Db3VudCApO1xyXG5cclxuXHRcdGNvbnN0IGNvdW50ID0gbGFzdFZlcnRleCAtIGZpcnN0VmVydGV4O1xyXG5cclxuXHRcdGlmICggY291bnQgPCAwIHx8IGNvdW50ID09PSBJbmZpbml0eSApIHJldHVybiBudWxsO1xyXG5cclxuXHRcdGRyYXdQYXJhbXMudmVydGV4Q291bnQgPSBjb3VudDtcclxuXHRcdGRyYXdQYXJhbXMuZmlyc3RWZXJ0ZXggPSBmaXJzdFZlcnRleDtcclxuXHJcblx0XHRyZXR1cm4gZHJhd1BhcmFtcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSByZW5kZXIgb2JqZWN0J3MgZ2VvbWV0cnkgY2FjaGUga2V5LlxyXG5cdCAqXHJcblx0ICogVGhlIGdlb21ldHJ5IGNhY2hlIGtleSBpcyBwYXJ0IG9mIHRoZSBtYXRlcmlhbCBjYWNoZSBrZXkuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBnZW9tZXRyeSBjYWNoZSBrZXkuXHJcblx0ICovXHJcblx0Z2V0R2VvbWV0cnlDYWNoZUtleSgpIHtcclxuXHJcblx0XHRjb25zdCB7IGdlb21ldHJ5IH0gPSB0aGlzO1xyXG5cclxuXHRcdGxldCBjYWNoZUtleSA9ICcnO1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoIGdlb21ldHJ5LmF0dHJpYnV0ZXMgKS5zb3J0KCkgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBhdHRyaWJ1dGUgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzWyBuYW1lIF07XHJcblxyXG5cdFx0XHRjYWNoZUtleSArPSBuYW1lICsgJywnO1xyXG5cclxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUuZGF0YSApIGNhY2hlS2V5ICs9IGF0dHJpYnV0ZS5kYXRhLnN0cmlkZSArICcsJztcclxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUub2Zmc2V0ICkgY2FjaGVLZXkgKz0gYXR0cmlidXRlLm9mZnNldCArICcsJztcclxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUuaXRlbVNpemUgKSBjYWNoZUtleSArPSBhdHRyaWJ1dGUuaXRlbVNpemUgKyAnLCc7XHJcblx0XHRcdGlmICggYXR0cmlidXRlLm5vcm1hbGl6ZWQgKSBjYWNoZUtleSArPSAnbiwnO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBzdHJ1Y3R1cmFsIGVxdWFsaXR5IGlzbid0IHN1ZmZpY2llbnQgZm9yIG1vcnBoIHRhcmdldHMgc2luY2UgdGhlXHJcblx0XHQvLyBkYXRhIGFyZSBtYWludGFpbmVkIGluIHRleHR1cmVzLiBvbmx5IGlmIHRoZSB0YXJnZXRzIGFyZSBhbGwgZXF1YWxcclxuXHRcdC8vIHRoZSB0ZXh0dXJlIGFuZCB0aHVzIHRoZSBpbnN0YW5jZSBvZiBgTW9ycGhOb2RlYCBjYW4gYmUgc2hhcmVkLlxyXG5cclxuXHRcdGZvciAoIGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoIGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcyApLnNvcnQoKSApIHtcclxuXHJcblx0XHRcdGNvbnN0IHRhcmdldHMgPSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXNbIG5hbWUgXTtcclxuXHJcblx0XHRcdGNhY2hlS2V5ICs9ICdtb3JwaC0nICsgbmFtZSArICcsJztcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHRhcmdldHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgYXR0cmlidXRlID0gdGFyZ2V0c1sgaSBdO1xyXG5cclxuXHRcdFx0XHRjYWNoZUtleSArPSBhdHRyaWJ1dGUuaWQgKyAnLCc7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggZ2VvbWV0cnkuaW5kZXggKSB7XHJcblxyXG5cdFx0XHRjYWNoZUtleSArPSAnaW5kZXgsJztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGNhY2hlS2V5O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHJlbmRlciBvYmplY3QncyBtYXRlcmlhbCBjYWNoZSBrZXkuXHJcblx0ICpcclxuXHQgKiBUaGUgbWF0ZXJpYWwgY2FjaGUga2V5IGlzIHBhcnQgb2YgdGhlIHJlbmRlciBvYmplY3QgY2FjaGUga2V5LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgbWF0ZXJpYWwgY2FjaGUga2V5LlxyXG5cdCAqL1xyXG5cdGdldE1hdGVyaWFsQ2FjaGVLZXkoKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBvYmplY3QsIG1hdGVyaWFsIH0gPSB0aGlzO1xyXG5cclxuXHRcdGxldCBjYWNoZUtleSA9IG1hdGVyaWFsLmN1c3RvbVByb2dyYW1DYWNoZUtleSgpO1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IHByb3BlcnR5IG9mIGdldEtleXMoIG1hdGVyaWFsICkgKSB7XHJcblxyXG5cdFx0XHRpZiAoIC9eKGlzW0EtWl18Xyl8Xih2aXNpYmxlfHZlcnNpb258dXVpZHxuYW1lfG9wYWNpdHl8dXNlckRhdGEpJC8udGVzdCggcHJvcGVydHkgKSApIGNvbnRpbnVlO1xyXG5cclxuXHRcdFx0Y29uc3QgdmFsdWUgPSBtYXRlcmlhbFsgcHJvcGVydHkgXTtcclxuXHJcblx0XHRcdGxldCB2YWx1ZUtleTtcclxuXHJcblx0XHRcdGlmICggdmFsdWUgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdC8vIHNvbWUgbWF0ZXJpYWwgdmFsdWVzIHJlcXVpcmUgYSBmb3JtYXR0aW5nXHJcblxyXG5cdFx0XHRcdGNvbnN0IHR5cGUgPSB0eXBlb2YgdmFsdWU7XHJcblxyXG5cdFx0XHRcdGlmICggdHlwZSA9PT0gJ251bWJlcicgKSB7XHJcblxyXG5cdFx0XHRcdFx0dmFsdWVLZXkgPSB2YWx1ZSAhPT0gMCA/ICcxJyA6ICcwJzsgLy8gQ29udmVydCB0byBvbi9vZmYsIGltcG9ydGFudCBmb3IgY2xlYXJjb2F0LCB0cmFuc21pc3Npb24sIGV0Y1xyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCB0eXBlID09PSAnb2JqZWN0JyApIHtcclxuXHJcblx0XHRcdFx0XHR2YWx1ZUtleSA9ICd7JztcclxuXHJcblx0XHRcdFx0XHRpZiAoIHZhbHVlLmlzVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdHZhbHVlS2V5ICs9IHZhbHVlLm1hcHBpbmc7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHZhbHVlS2V5ICs9ICd9JztcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHR2YWx1ZUtleSA9IFN0cmluZyggdmFsdWUgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0dmFsdWVLZXkgPSBTdHJpbmcoIHZhbHVlICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjYWNoZUtleSArPSAvKnByb3BlcnR5ICsgJzonICsqLyB2YWx1ZUtleSArICcsJztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y2FjaGVLZXkgKz0gdGhpcy5jbGlwcGluZ0NvbnRleHRDYWNoZUtleSArICcsJztcclxuXHJcblx0XHRpZiAoIG9iamVjdC5nZW9tZXRyeSApIHtcclxuXHJcblx0XHRcdGNhY2hlS2V5ICs9IHRoaXMuZ2V0R2VvbWV0cnlDYWNoZUtleSgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIG9iamVjdC5za2VsZXRvbiApIHtcclxuXHJcblx0XHRcdGNhY2hlS2V5ICs9IG9iamVjdC5za2VsZXRvbi5ib25lcy5sZW5ndGggKyAnLCc7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggb2JqZWN0LmlzQmF0Y2hlZE1lc2ggKSB7XHJcblxyXG5cdFx0XHRjYWNoZUtleSArPSBvYmplY3QuX21hdHJpY2VzVGV4dHVyZS51dWlkICsgJywnO1xyXG5cclxuXHRcdFx0aWYgKCBvYmplY3QuX2NvbG9yc1RleHR1cmUgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdGNhY2hlS2V5ICs9IG9iamVjdC5fY29sb3JzVGV4dHVyZS51dWlkICsgJywnO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIG9iamVjdC5jb3VudCA+IDEgKSB7XHJcblxyXG5cdFx0XHQvLyBUT0RPOiBodHRwczovL2dpdGh1Yi5jb20vbXJkb29iL3RocmVlLmpzL3B1bGwvMjkwNjYjaXNzdWVjb21tZW50LTIyNjk0MDA4NTBcclxuXHJcblx0XHRcdGNhY2hlS2V5ICs9IG9iamVjdC51dWlkICsgJywnO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjYWNoZUtleSArPSBvYmplY3QucmVjZWl2ZVNoYWRvdyArICcsJztcclxuXHJcblx0XHRyZXR1cm4gaGFzaFN0cmluZyggY2FjaGVLZXkgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBXaGV0aGVyIHRoZSBnZW9tZXRyeSByZXF1aXJlcyBhbiB1cGRhdGUgb3Igbm90LlxyXG5cdCAqXHJcblx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0ICogQHJlYWRvbmx5XHJcblx0ICovXHJcblx0Z2V0IG5lZWRzR2VvbWV0cnlVcGRhdGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZ2VvbWV0cnkuaWQgIT09IHRoaXMub2JqZWN0Lmdlb21ldHJ5LmlkO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdoZXRoZXIgdGhlIHJlbmRlciBvYmplY3QgcmVxdWlyZXMgYW4gdXBkYXRlIG9yIG5vdC5cclxuXHQgKlxyXG5cdCAqIE5vdGU6IFRoZXJlIGFyZSB0d28gZGlzdGluY3QgcGxhY2VzIHdoZXJlIHJlbmRlciBvYmplY3RzIGFyZSBjaGVja2VkIGZvciBhbiB1cGRhdGUuXHJcblx0ICpcclxuXHQgKiAxLiBJbiBgUmVuZGVyT2JqZWN0cy5nZXQoKWAgd2hpY2ggaXMgZXhlY3V0ZWQgd2hlbiB0aGUgcmVuZGVyIG9iamVjdCBpcyByZXF1ZXN0LiBUaGlzXHJcblx0ICogbWV0aG9kIGNoZWNrcyB0aGUgYG5lZWRzVXBkYXRlYCBmbGFnIGFuZCByZWNyZWF0ZXMgdGhlIHJlbmRlciBvYmplY3QgaWYgbmVjZXNzYXJ5LlxyXG5cdCAqIDIuIEluIGBSZW5kZXJlci5fcmVuZGVyT2JqZWN0RGlyZWN0KClgIHJpZ2h0IGFmdGVyIGdldHRpbmcgdGhlIHJlbmRlciBvYmplY3QgdmlhXHJcblx0ICogYFJlbmRlck9iamVjdHMuZ2V0KClgLiBUaGUgcmVuZGVyIG9iamVjdCdzIE5vZGVNYXRlcmlhbE9ic2VydmVyIGlzIHRoZW4gdXNlZCB0byBkZXRlY3RcclxuXHQgKiBhIG5lZWQgZm9yIGEgcmVmcmVzaCBkdWUgdG8gbWF0ZXJpYWwsIGdlb21ldHJ5IG9yIG9iamVjdCByZWxhdGVkIHZhbHVlIGNoYW5nZXMuXHJcblx0ICpcclxuXHQgKiBUT0RPOiBJbnZlc3RpZ2F0ZSBpZiBpdCdzIHBvc3NpYmxlIHRvIG1lcmdlIGJvdGggc3RlcHMgc28gdGhlcmUgaXMgb25seSBhIHNpbmdsZSBwbGFjZVxyXG5cdCAqIHRoYXQgcGVyZm9ybXMgdGhlICduZWVkc1VwZGF0ZScgY2hlY2suXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHQgKiBAcmVhZG9ubHlcclxuXHQgKi9cclxuXHRnZXQgbmVlZHNVcGRhdGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIC8qdGhpcy5vYmplY3Quc3RhdGljICE9PSB0cnVlICYmKi8gKCB0aGlzLmluaXRpYWxOb2Rlc0NhY2hlS2V5ICE9PSB0aGlzLmdldER5bmFtaWNDYWNoZUtleSgpIHx8IHRoaXMuY2xpcHBpbmdOZWVkc1VwZGF0ZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGR5bmFtaWMgY2FjaGUga2V5IHdoaWNoIHJlcHJlc2VudHMgYSBrZXkgdGhhdCBpcyBjb21wdXRlZCBwZXIgZHJhdyBjb21tYW5kLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgY2FjaGUga2V5LlxyXG5cdCAqL1xyXG5cdGdldER5bmFtaWNDYWNoZUtleSgpIHtcclxuXHJcblx0XHRsZXQgY2FjaGVLZXkgPSAwO1xyXG5cclxuXHRcdC8vIGBOb2Rlcy5nZXRDYWNoZUtleSgpYCByZXR1cm5zIGFuIGVudmlyb25tZW50IGNhY2hlIGtleSB3aGljaCBpcyBub3QgcmVsZXZhbnQgd2hlblxyXG5cdFx0Ly8gdGhlIHJlbmRlcmVyIGlzIGluc2lkZSBhIHNoYWRvdyBwYXNzLlxyXG5cclxuXHRcdGlmICggdGhpcy5tYXRlcmlhbC5pc1NoYWRvd1Bhc3NNYXRlcmlhbCAhPT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdGNhY2hlS2V5ID0gdGhpcy5fbm9kZXMuZ2V0Q2FjaGVLZXkoIHRoaXMuc2NlbmUsIHRoaXMubGlnaHRzTm9kZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMuY2FtZXJhLmlzQXJyYXlDYW1lcmEgKSB7XHJcblxyXG5cdFx0XHRjYWNoZUtleSA9IGhhc2goIGNhY2hlS2V5LCB0aGlzLmNhbWVyYS5jYW1lcmFzLmxlbmd0aCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMub2JqZWN0LnJlY2VpdmVTaGFkb3cgKSB7XHJcblxyXG5cdFx0XHRjYWNoZUtleSA9IGhhc2goIGNhY2hlS2V5LCAxICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBjYWNoZUtleTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSByZW5kZXIgb2JqZWN0J3MgY2FjaGUga2V5LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgY2FjaGUga2V5LlxyXG5cdCAqL1xyXG5cdGdldENhY2hlS2V5KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmdldE1hdGVyaWFsQ2FjaGVLZXkoKSArIHRoaXMuZ2V0RHluYW1pY0NhY2hlS2V5KCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRnJlZXMgaW50ZXJuYWwgcmVzb3VyY2VzLlxyXG5cdCAqL1xyXG5cdGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0dGhpcy5tYXRlcmlhbC5yZW1vdmVFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIHRoaXMub25NYXRlcmlhbERpc3Bvc2UgKTtcclxuXHJcblx0XHR0aGlzLm9uRGlzcG9zZSgpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBSZW5kZXJPYmplY3Q7XHJcbiIsImltcG9ydCBDaGFpbk1hcCBmcm9tICcuL0NoYWluTWFwLmpzJztcclxuaW1wb3J0IFJlbmRlck9iamVjdCBmcm9tICcuL1JlbmRlck9iamVjdC5qcyc7XHJcblxyXG5jb25zdCBfY2hhaW5LZXlzID0gW107XHJcblxyXG4vKipcclxuICogVGhpcyBtb2R1bGUgbWFuYWdlcyB0aGUgcmVuZGVyIG9iamVjdHMgb2YgdGhlIHJlbmRlcmVyLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuY2xhc3MgUmVuZGVyT2JqZWN0cyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcmVuZGVyIG9iamVjdCBtYW5hZ2VtZW50IGNvbXBvbmVudC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7Tm9kZXN9IG5vZGVzIC0gUmVuZGVyZXIgY29tcG9uZW50IGZvciBtYW5hZ2luZyBub2RlcyByZWxhdGVkIGxvZ2ljLlxyXG5cdCAqIEBwYXJhbSB7R2VvbWV0cmllc30gZ2VvbWV0cmllcyAtIFJlbmRlcmVyIGNvbXBvbmVudCBmb3IgbWFuYWdpbmcgZ2VvbWV0cmllcy5cclxuXHQgKiBAcGFyYW0ge1BpcGVsaW5lc30gcGlwZWxpbmVzIC0gUmVuZGVyZXIgY29tcG9uZW50IGZvciBtYW5hZ2luZyBwaXBlbGluZXMuXHJcblx0ICogQHBhcmFtIHtCaW5kaW5nc30gYmluZGluZ3MgLSBSZW5kZXJlciBjb21wb25lbnQgZm9yIG1hbmFnaW5nIGJpbmRpbmdzLlxyXG5cdCAqIEBwYXJhbSB7SW5mb30gaW5mbyAtIFJlbmRlcmVyIGNvbXBvbmVudCBmb3IgbWFuYWdpbmcgbWV0cmljcyBhbmQgbW9uaXRvcmluZyBkYXRhLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCByZW5kZXJlciwgbm9kZXMsIGdlb21ldHJpZXMsIHBpcGVsaW5lcywgYmluZGluZ3MsIGluZm8gKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcmVuZGVyZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1JlbmRlcmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZW5kZXJlciBjb21wb25lbnQgZm9yIG1hbmFnaW5nIG5vZGVzIHJlbGF0ZWQgbG9naWMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGVzfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vZGVzID0gbm9kZXM7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZW5kZXJlciBjb21wb25lbnQgZm9yIG1hbmFnaW5nIGdlb21ldHJpZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0dlb21ldHJpZXN9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ2VvbWV0cmllcyA9IGdlb21ldHJpZXM7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZW5kZXJlciBjb21wb25lbnQgZm9yIG1hbmFnaW5nIHBpcGVsaW5lcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7UGlwZWxpbmVzfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBpcGVsaW5lcyA9IHBpcGVsaW5lcztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlbmRlcmVyIGNvbXBvbmVudCBmb3IgbWFuYWdpbmcgYmluZGluZ3MuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0JpbmRpbmdzfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJpbmRpbmdzID0gYmluZGluZ3M7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZW5kZXJlciBjb21wb25lbnQgZm9yIG1hbmFnaW5nIG1ldHJpY3MgYW5kIG1vbml0b3JpbmcgZGF0YS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7SW5mb31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pbmZvID0gaW5mbztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgZGljdGlvbmFyeSB0aGF0IG1hbmFnZXMgcmVuZGVyIGNvbnRleHRzIGluIGNoYWluIG1hcHNcclxuXHRcdCAqIGZvciBlYWNoIHBhc3MgSUQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdDxzdHJpbmcsQ2hhaW5NYXA+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNoYWluTWFwcyA9IHt9O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSByZW5kZXIgb2JqZWN0IGZvciB0aGUgZ2l2ZW4gb2JqZWN0IGFuZCBzdGF0ZSBkYXRhLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3QzRH0gb2JqZWN0IC0gVGhlIDNEIG9iamVjdC5cclxuXHQgKiBAcGFyYW0ge01hdGVyaWFsfSBtYXRlcmlhbCAtIFRoZSAzRCBvYmplY3QncyBtYXRlcmlhbC5cclxuXHQgKiBAcGFyYW0ge1NjZW5lfSBzY2VuZSAtIFRoZSBzY2VuZSB0aGUgM0Qgb2JqZWN0IGJlbG9uZ3MgdG8uXHJcblx0ICogQHBhcmFtIHtDYW1lcmF9IGNhbWVyYSAtIFRoZSBjYW1lcmEgdGhlIDNEIG9iamVjdCBzaG91bGQgYmUgcmVuZGVyZWQgd2l0aC5cclxuXHQgKiBAcGFyYW0ge0xpZ2h0c05vZGV9IGxpZ2h0c05vZGUgLSBUaGUgbGlnaHRzIG5vZGUuXHJcblx0ICogQHBhcmFtIHtSZW5kZXJDb250ZXh0fSByZW5kZXJDb250ZXh0IC0gVGhlIHJlbmRlciBjb250ZXh0LlxyXG5cdCAqIEBwYXJhbSB7Q2xpcHBpbmdDb250ZXh0fSBjbGlwcGluZ0NvbnRleHQgLSBUaGUgY2xpcHBpbmcgY29udGV4dC5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW3Bhc3NJZF0gLSBBbiBvcHRpb25hbCBJRCBmb3IgaWRlbnRpZnlpbmcgdGhlIHBhc3MuXHJcblx0ICogQHJldHVybiB7UmVuZGVyT2JqZWN0fSBUaGUgcmVuZGVyIG9iamVjdC5cclxuXHQgKi9cclxuXHRnZXQoIG9iamVjdCwgbWF0ZXJpYWwsIHNjZW5lLCBjYW1lcmEsIGxpZ2h0c05vZGUsIHJlbmRlckNvbnRleHQsIGNsaXBwaW5nQ29udGV4dCwgcGFzc0lkICkge1xyXG5cclxuXHRcdGNvbnN0IGNoYWluTWFwID0gdGhpcy5nZXRDaGFpbk1hcCggcGFzc0lkICk7XHJcblxyXG5cdFx0Ly8gcmV1c2UgY2hhaW5BcnJheVxyXG5cdFx0X2NoYWluS2V5c1sgMCBdID0gb2JqZWN0O1xyXG5cdFx0X2NoYWluS2V5c1sgMSBdID0gbWF0ZXJpYWw7XHJcblx0XHRfY2hhaW5LZXlzWyAyIF0gPSByZW5kZXJDb250ZXh0O1xyXG5cdFx0X2NoYWluS2V5c1sgMyBdID0gbGlnaHRzTm9kZTtcclxuXHJcblx0XHRsZXQgcmVuZGVyT2JqZWN0ID0gY2hhaW5NYXAuZ2V0KCBfY2hhaW5LZXlzICk7XHJcblxyXG5cdFx0aWYgKCByZW5kZXJPYmplY3QgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHJlbmRlck9iamVjdCA9IHRoaXMuY3JlYXRlUmVuZGVyT2JqZWN0KCB0aGlzLm5vZGVzLCB0aGlzLmdlb21ldHJpZXMsIHRoaXMucmVuZGVyZXIsIG9iamVjdCwgbWF0ZXJpYWwsIHNjZW5lLCBjYW1lcmEsIGxpZ2h0c05vZGUsIHJlbmRlckNvbnRleHQsIGNsaXBwaW5nQ29udGV4dCwgcGFzc0lkICk7XHJcblxyXG5cdFx0XHRjaGFpbk1hcC5zZXQoIF9jaGFpbktleXMsIHJlbmRlck9iamVjdCApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRyZW5kZXJPYmplY3QudXBkYXRlQ2xpcHBpbmcoIGNsaXBwaW5nQ29udGV4dCApO1xyXG5cclxuXHRcdFx0aWYgKCByZW5kZXJPYmplY3QubmVlZHNHZW9tZXRyeVVwZGF0ZSApIHtcclxuXHJcblx0XHRcdFx0cmVuZGVyT2JqZWN0LnNldEdlb21ldHJ5KCBvYmplY3QuZ2VvbWV0cnkgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggcmVuZGVyT2JqZWN0LnZlcnNpb24gIT09IG1hdGVyaWFsLnZlcnNpb24gfHwgcmVuZGVyT2JqZWN0Lm5lZWRzVXBkYXRlICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIHJlbmRlck9iamVjdC5pbml0aWFsQ2FjaGVLZXkgIT09IHJlbmRlck9iamVjdC5nZXRDYWNoZUtleSgpICkge1xyXG5cclxuXHRcdFx0XHRcdHJlbmRlck9iamVjdC5kaXNwb3NlKCk7XHJcblxyXG5cdFx0XHRcdFx0cmVuZGVyT2JqZWN0ID0gdGhpcy5nZXQoIG9iamVjdCwgbWF0ZXJpYWwsIHNjZW5lLCBjYW1lcmEsIGxpZ2h0c05vZGUsIHJlbmRlckNvbnRleHQsIGNsaXBwaW5nQ29udGV4dCwgcGFzc0lkICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0cmVuZGVyT2JqZWN0LnZlcnNpb24gPSBtYXRlcmlhbC52ZXJzaW9uO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdF9jaGFpbktleXMubGVuZ3RoID0gMDtcclxuXHJcblx0XHRyZXR1cm4gcmVuZGVyT2JqZWN0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBjaGFpbiBtYXAgZm9yIHRoZSBnaXZlbiBwYXNzIElELlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtwYXNzSWQ9J2RlZmF1bHQnXSAtIFRoZSBwYXNzIElELlxyXG5cdCAqIEByZXR1cm4ge0NoYWluTWFwfSBUaGUgY2hhaW4gbWFwLlxyXG5cdCAqL1xyXG5cdGdldENoYWluTWFwKCBwYXNzSWQgPSAnZGVmYXVsdCcgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuY2hhaW5NYXBzWyBwYXNzSWQgXSB8fCAoIHRoaXMuY2hhaW5NYXBzWyBwYXNzSWQgXSA9IG5ldyBDaGFpbk1hcCgpICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRnJlZXMgaW50ZXJuYWwgcmVzb3VyY2VzLlxyXG5cdCAqL1xyXG5cdGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0dGhpcy5jaGFpbk1hcHMgPSB7fTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGYWN0b3J5IG1ldGhvZCBmb3IgY3JlYXRpbmcgcmVuZGVyIG9iamVjdHMgd2l0aCB0aGUgZ2l2ZW4gbGlzdCBvZiBwYXJhbWV0ZXJzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2Rlc30gbm9kZXMgLSBSZW5kZXJlciBjb21wb25lbnQgZm9yIG1hbmFnaW5nIG5vZGVzIHJlbGF0ZWQgbG9naWMuXHJcblx0ICogQHBhcmFtIHtHZW9tZXRyaWVzfSBnZW9tZXRyaWVzIC0gUmVuZGVyZXIgY29tcG9uZW50IGZvciBtYW5hZ2luZyBnZW9tZXRyaWVzLlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0M0R9IG9iamVjdCAtIFRoZSAzRCBvYmplY3QuXHJcblx0ICogQHBhcmFtIHtNYXRlcmlhbH0gbWF0ZXJpYWwgLSBUaGUgb2JqZWN0J3MgbWF0ZXJpYWwuXHJcblx0ICogQHBhcmFtIHtTY2VuZX0gc2NlbmUgLSBUaGUgc2NlbmUgdGhlIDNEIG9iamVjdCBiZWxvbmdzIHRvLlxyXG5cdCAqIEBwYXJhbSB7Q2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIHRoZSBvYmplY3Qgc2hvdWxkIGJlIHJlbmRlcmVkIHdpdGguXHJcblx0ICogQHBhcmFtIHtMaWdodHNOb2RlfSBsaWdodHNOb2RlIC0gVGhlIGxpZ2h0cyBub2RlLlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyQ29udGV4dH0gcmVuZGVyQ29udGV4dCAtIFRoZSByZW5kZXIgY29udGV4dC5cclxuXHQgKiBAcGFyYW0ge0NsaXBwaW5nQ29udGV4dH0gY2xpcHBpbmdDb250ZXh0IC0gVGhlIGNsaXBwaW5nIGNvbnRleHQuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtwYXNzSWRdIC0gQW4gb3B0aW9uYWwgSUQgZm9yIGlkZW50aWZ5aW5nIHRoZSBwYXNzLlxyXG5cdCAqIEByZXR1cm4ge1JlbmRlck9iamVjdH0gVGhlIHJlbmRlciBvYmplY3QuXHJcblx0ICovXHJcblx0Y3JlYXRlUmVuZGVyT2JqZWN0KCBub2RlcywgZ2VvbWV0cmllcywgcmVuZGVyZXIsIG9iamVjdCwgbWF0ZXJpYWwsIHNjZW5lLCBjYW1lcmEsIGxpZ2h0c05vZGUsIHJlbmRlckNvbnRleHQsIGNsaXBwaW5nQ29udGV4dCwgcGFzc0lkICkge1xyXG5cclxuXHRcdGNvbnN0IGNoYWluTWFwID0gdGhpcy5nZXRDaGFpbk1hcCggcGFzc0lkICk7XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyT2JqZWN0ID0gbmV3IFJlbmRlck9iamVjdCggbm9kZXMsIGdlb21ldHJpZXMsIHJlbmRlcmVyLCBvYmplY3QsIG1hdGVyaWFsLCBzY2VuZSwgY2FtZXJhLCBsaWdodHNOb2RlLCByZW5kZXJDb250ZXh0LCBjbGlwcGluZ0NvbnRleHQgKTtcclxuXHJcblx0XHRyZW5kZXJPYmplY3Qub25EaXNwb3NlID0gKCkgPT4ge1xyXG5cclxuXHRcdFx0dGhpcy5waXBlbGluZXMuZGVsZXRlKCByZW5kZXJPYmplY3QgKTtcclxuXHRcdFx0dGhpcy5iaW5kaW5ncy5kZWxldGUoIHJlbmRlck9iamVjdCApO1xyXG5cdFx0XHR0aGlzLm5vZGVzLmRlbGV0ZSggcmVuZGVyT2JqZWN0ICk7XHJcblxyXG5cdFx0XHRjaGFpbk1hcC5kZWxldGUoIHJlbmRlck9iamVjdC5nZXRDaGFpbkFycmF5KCkgKTtcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdHJldHVybiByZW5kZXJPYmplY3Q7XHJcblxyXG5cdH1cclxuXHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBSZW5kZXJPYmplY3RzO1xyXG4iLCIvKipcclxuICogRGF0YSBzdHJ1Y3R1cmUgZm9yIHRoZSByZW5kZXJlci4gSXQgaXMgaW50ZW5kZWQgdG8gbWFuYWdlXHJcbiAqIGRhdGEgb2Ygb2JqZWN0cyBpbiBkaWN0aW9uYXJpZXMuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5jbGFzcyBEYXRhTWFwIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBkYXRhIG1hcC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIGBEYXRhTWFwYCBpbnRlcm5hbGx5IHVzZXMgYSB3ZWFrIG1hcFxyXG5cdFx0ICogdG8gbWFuYWdlIGl0cyBkYXRhLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtXZWFrTWFwfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRhdGEgPSBuZXcgV2Vha01hcCgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGRpY3Rpb25hcnkgZm9yIHRoZSBnaXZlbiBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IC0gVGhlIG9iamVjdC5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBkaWN0aW9uYXJ5LlxyXG5cdCAqL1xyXG5cdGdldCggb2JqZWN0ICkge1xyXG5cclxuXHRcdGxldCBtYXAgPSB0aGlzLmRhdGEuZ2V0KCBvYmplY3QgKTtcclxuXHJcblx0XHRpZiAoIG1hcCA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0bWFwID0ge307XHJcblx0XHRcdHRoaXMuZGF0YS5zZXQoIG9iamVjdCwgbWFwICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBtYXA7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVsZXRlcyB0aGUgZGljdGlvbmFyeSBmb3IgdGhlIGdpdmVuIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgLSBUaGUgb2JqZWN0LlxyXG5cdCAqIEByZXR1cm4gez9PYmplY3R9IFRoZSBkZWxldGVkIGRpY3Rpb25hcnkuXHJcblx0ICovXHJcblx0ZGVsZXRlKCBvYmplY3QgKSB7XHJcblxyXG5cdFx0bGV0IG1hcCA9IG51bGw7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmRhdGEuaGFzKCBvYmplY3QgKSApIHtcclxuXHJcblx0XHRcdG1hcCA9IHRoaXMuZGF0YS5nZXQoIG9iamVjdCApO1xyXG5cclxuXHRcdFx0dGhpcy5kYXRhLmRlbGV0ZSggb2JqZWN0ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBtYXA7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIG9iamVjdCBoYXMgYSBkaWN0aW9uYXJ5IGRlZmluZWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IC0gVGhlIG9iamVjdCB0byB0ZXN0LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgYSBkaWN0aW9uYXJ5IGlzIGRlZmluZWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGhhcyggb2JqZWN0ICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmRhdGEuaGFzKCBvYmplY3QgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGcmVlcyBpbnRlcm5hbCByZXNvdXJjZXMuXHJcblx0ICovXHJcblx0ZGlzcG9zZSgpIHtcclxuXHJcblx0XHR0aGlzLmRhdGEgPSBuZXcgV2Vha01hcCgpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBEYXRhTWFwO1xyXG4iLCJleHBvcnQgY29uc3QgQXR0cmlidXRlVHlwZSA9IHtcclxuXHRWRVJURVg6IDEsXHJcblx0SU5ERVg6IDIsXHJcblx0U1RPUkFHRTogMyxcclxuXHRJTkRJUkVDVDogNFxyXG59O1xyXG5cclxuLy8gc2l6ZSBvZiBhIGNodW5rIGluIGJ5dGVzIChTVEQxNDAgbGF5b3V0KVxyXG5cclxuZXhwb3J0IGNvbnN0IEdQVV9DSFVOS19CWVRFUyA9IDE2O1xyXG5cclxuLy8gQFRPRE86IE1vdmUgdG8gc3JjL2NvbnN0YW50cy5qc1xyXG5cclxuZXhwb3J0IGNvbnN0IEJsZW5kQ29sb3JGYWN0b3IgPSAyMTE7XHJcbmV4cG9ydCBjb25zdCBPbmVNaW51c0JsZW5kQ29sb3JGYWN0b3IgPSAyMTI7XHJcbiIsImltcG9ydCBEYXRhTWFwIGZyb20gJy4vRGF0YU1hcC5qcyc7XHJcbmltcG9ydCB7IEF0dHJpYnV0ZVR5cGUgfSBmcm9tICcuL0NvbnN0YW50cy5qcyc7XHJcblxyXG5pbXBvcnQgeyBEeW5hbWljRHJhd1VzYWdlIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIHJlbmRlcmVyIG1vZHVsZSBtYW5hZ2VzIGdlb21ldHJ5IGF0dHJpYnV0ZXMuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBhdWdtZW50cyBEYXRhTWFwXHJcbiAqL1xyXG5jbGFzcyBBdHRyaWJ1dGVzIGV4dGVuZHMgRGF0YU1hcCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYXR0cmlidXRlIG1hbmFnZW1lbnQgY29tcG9uZW50LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCYWNrZW5kfSBiYWNrZW5kIC0gVGhlIHJlbmRlcmVyJ3MgYmFja2VuZC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggYmFja2VuZCApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJlbmRlcmVyJ3MgYmFja2VuZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QmFja2VuZH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5iYWNrZW5kID0gYmFja2VuZDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWxldGVzIHRoZSBkYXRhIGZvciB0aGUgZ2l2ZW4gYXR0cmlidXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCdWZmZXJBdHRyaWJ1dGV9IGF0dHJpYnV0ZSAtIFRoZSBhdHRyaWJ1dGUuXHJcblx0ICogQHJldHVybiB7T2JqZWN0fG51bGx9IFRoZSBkZWxldGVkIGF0dHJpYnV0ZSBkYXRhLlxyXG5cdCAqL1xyXG5cdGRlbGV0ZSggYXR0cmlidXRlICkge1xyXG5cclxuXHRcdGNvbnN0IGF0dHJpYnV0ZURhdGEgPSBzdXBlci5kZWxldGUoIGF0dHJpYnV0ZSApO1xyXG5cclxuXHRcdGlmICggYXR0cmlidXRlRGF0YSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuYmFja2VuZC5kZXN0cm95QXR0cmlidXRlKCBhdHRyaWJ1dGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGF0dHJpYnV0ZURhdGE7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgZ2l2ZW4gYXR0cmlidXRlLiBUaGlzIG1ldGhvZCBjcmVhdGVzIGF0dHJpYnV0ZSBidWZmZXJzXHJcblx0ICogZm9yIG5ldyBhdHRyaWJ1dGVzIGFuZCB1cGRhdGVzIGRhdGEgZm9yIGV4aXN0aW5nIG9uZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0J1ZmZlckF0dHJpYnV0ZX0gYXR0cmlidXRlIC0gVGhlIGF0dHJpYnV0ZSB0byB1cGRhdGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHR5cGUgLSBUaGUgYXR0cmlidXRlIHR5cGUuXHJcblx0ICovXHJcblx0dXBkYXRlKCBhdHRyaWJ1dGUsIHR5cGUgKSB7XHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IHRoaXMuZ2V0KCBhdHRyaWJ1dGUgKTtcclxuXHJcblx0XHRpZiAoIGRhdGEudmVyc2lvbiA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0aWYgKCB0eXBlID09PSBBdHRyaWJ1dGVUeXBlLlZFUlRFWCApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5iYWNrZW5kLmNyZWF0ZUF0dHJpYnV0ZSggYXR0cmlidXRlICk7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCB0eXBlID09PSBBdHRyaWJ1dGVUeXBlLklOREVYICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLmJhY2tlbmQuY3JlYXRlSW5kZXhBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggdHlwZSA9PT0gQXR0cmlidXRlVHlwZS5TVE9SQUdFICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLmJhY2tlbmQuY3JlYXRlU3RvcmFnZUF0dHJpYnV0ZSggYXR0cmlidXRlICk7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCB0eXBlID09PSBBdHRyaWJ1dGVUeXBlLklORElSRUNUICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLmJhY2tlbmQuY3JlYXRlSW5kaXJlY3RTdG9yYWdlQXR0cmlidXRlKCBhdHRyaWJ1dGUgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGRhdGEudmVyc2lvbiA9IHRoaXMuX2dldEJ1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlICkudmVyc2lvbjtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc3QgYnVmZmVyQXR0cmlidXRlID0gdGhpcy5fZ2V0QnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUgKTtcclxuXHJcblx0XHRcdGlmICggZGF0YS52ZXJzaW9uIDwgYnVmZmVyQXR0cmlidXRlLnZlcnNpb24gfHwgYnVmZmVyQXR0cmlidXRlLnVzYWdlID09PSBEeW5hbWljRHJhd1VzYWdlICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLmJhY2tlbmQudXBkYXRlQXR0cmlidXRlKCBhdHRyaWJ1dGUgKTtcclxuXHJcblx0XHRcdFx0ZGF0YS52ZXJzaW9uID0gYnVmZmVyQXR0cmlidXRlLnZlcnNpb247XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFV0aWxpdHkgbWV0aG9kIGZvciBoYW5kbGluZyBpbnRlcmxlYXZlZCBidWZmZXIgYXR0cmlidXRlcyBjb3JyZWN0bHkuXHJcblx0ICogVG8gcHJvY2VzcyB0aGVtLCB0aGVpciBgSW50ZXJsZWF2ZWRCdWZmZXJgIGlzIHJldHVybmVkLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCdWZmZXJBdHRyaWJ1dGV9IGF0dHJpYnV0ZSAtIFRoZSBhdHRyaWJ1dGUuXHJcblx0ICogQHJldHVybiB7QnVmZmVyQXR0cmlidXRlfEludGVybGVhdmVkQnVmZmVyfVxyXG5cdCAqL1xyXG5cdF9nZXRCdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApIHtcclxuXHJcblx0XHRpZiAoIGF0dHJpYnV0ZS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlICkgYXR0cmlidXRlID0gYXR0cmlidXRlLmRhdGE7XHJcblxyXG5cdFx0cmV0dXJuIGF0dHJpYnV0ZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQXR0cmlidXRlcztcclxuIiwiaW1wb3J0IERhdGFNYXAgZnJvbSAnLi9EYXRhTWFwLmpzJztcclxuaW1wb3J0IHsgQXR0cmlidXRlVHlwZSB9IGZyb20gJy4vQ29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgYXJyYXlOZWVkc1VpbnQzMiB9IGZyb20gJy4uLy4uL3V0aWxzLmpzJztcclxuXHJcbmltcG9ydCB7IFVpbnQxNkJ1ZmZlckF0dHJpYnV0ZSwgVWludDMyQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIHdpcmVmcmFtZSB2ZXJzaW9uIGZvciB0aGUgZ2l2ZW4gZ2VvbWV0cnkuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge0J1ZmZlckdlb21ldHJ5fSBnZW9tZXRyeSAtIFRoZSBnZW9tZXRyeS5cclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgdmVyc2lvbi5cclxuICovXHJcbmZ1bmN0aW9uIGdldFdpcmVmcmFtZVZlcnNpb24oIGdlb21ldHJ5ICkge1xyXG5cclxuXHRyZXR1cm4gKCBnZW9tZXRyeS5pbmRleCAhPT0gbnVsbCApID8gZ2VvbWV0cnkuaW5kZXgudmVyc2lvbiA6IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24udmVyc2lvbjtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgd2lyZWZyYW1lIGluZGV4IGF0dHJpYnV0ZSBmb3IgdGhlIGdpdmVuIGdlb21ldHJ5LlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtCdWZmZXJHZW9tZXRyeX0gZ2VvbWV0cnkgLSBUaGUgZ2VvbWV0cnkuXHJcbiAqIEByZXR1cm4ge0J1ZmZlckF0dHJpYnV0ZX0gVGhlIHdpcmVmcmFtZSBpbmRleCBhdHRyaWJ1dGUuXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRXaXJlZnJhbWVJbmRleCggZ2VvbWV0cnkgKSB7XHJcblxyXG5cdGNvbnN0IGluZGljZXMgPSBbXTtcclxuXHJcblx0Y29uc3QgZ2VvbWV0cnlJbmRleCA9IGdlb21ldHJ5LmluZGV4O1xyXG5cdGNvbnN0IGdlb21ldHJ5UG9zaXRpb24gPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xyXG5cclxuXHRpZiAoIGdlb21ldHJ5SW5kZXggIT09IG51bGwgKSB7XHJcblxyXG5cdFx0Y29uc3QgYXJyYXkgPSBnZW9tZXRyeUluZGV4LmFycmF5O1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGw7IGkgKz0gMyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGEgPSBhcnJheVsgaSArIDAgXTtcclxuXHRcdFx0Y29uc3QgYiA9IGFycmF5WyBpICsgMSBdO1xyXG5cdFx0XHRjb25zdCBjID0gYXJyYXlbIGkgKyAyIF07XHJcblxyXG5cdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGIsIGMsIGMsIGEgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0Y29uc3QgYXJyYXkgPSBnZW9tZXRyeVBvc2l0aW9uLmFycmF5O1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9ICggYXJyYXkubGVuZ3RoIC8gMyApIC0gMTsgaSA8IGw7IGkgKz0gMyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGEgPSBpICsgMDtcclxuXHRcdFx0Y29uc3QgYiA9IGkgKyAxO1xyXG5cdFx0XHRjb25zdCBjID0gaSArIDI7XHJcblxyXG5cdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGIsIGMsIGMsIGEgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0Y29uc3QgYXR0cmlidXRlID0gbmV3ICggYXJyYXlOZWVkc1VpbnQzMiggaW5kaWNlcyApID8gVWludDMyQnVmZmVyQXR0cmlidXRlIDogVWludDE2QnVmZmVyQXR0cmlidXRlICkoIGluZGljZXMsIDEgKTtcclxuXHRhdHRyaWJ1dGUudmVyc2lvbiA9IGdldFdpcmVmcmFtZVZlcnNpb24oIGdlb21ldHJ5ICk7XHJcblxyXG5cdHJldHVybiBhdHRyaWJ1dGU7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogVGhpcyByZW5kZXJlciBtb2R1bGUgbWFuYWdlcyBnZW9tZXRyaWVzLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAYXVnbWVudHMgRGF0YU1hcFxyXG4gKi9cclxuY2xhc3MgR2VvbWV0cmllcyBleHRlbmRzIERhdGFNYXAge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGdlb21ldHJ5IG1hbmFnZW1lbnQgY29tcG9uZW50LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBdHRyaWJ1dGVzfSBhdHRyaWJ1dGVzIC0gUmVuZGVyZXIgY29tcG9uZW50IGZvciBtYW5hZ2luZyBhdHRyaWJ1dGVzLlxyXG5cdCAqIEBwYXJhbSB7SW5mb30gaW5mbyAtIFJlbmRlcmVyIGNvbXBvbmVudCBmb3IgbWFuYWdpbmcgbWV0cmljcyBhbmQgbW9uaXRvcmluZyBkYXRhLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBhdHRyaWJ1dGVzLCBpbmZvICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZW5kZXJlciBjb21wb25lbnQgZm9yIG1hbmFnaW5nIGF0dHJpYnV0ZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0F0dHJpYnV0ZXN9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZW5kZXJlciBjb21wb25lbnQgZm9yIG1hbmFnaW5nIG1ldHJpY3MgYW5kIG1vbml0b3JpbmcgZGF0YS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7SW5mb31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pbmZvID0gaW5mbztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdlYWsgTWFwIGZvciBtYW5hZ2luZyBhdHRyaWJ1dGVzIGZvciB3aXJlZnJhbWUgcmVuZGVyaW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtXZWFrTWFwPEJ1ZmZlckdlb21ldHJ5LEJ1ZmZlckF0dHJpYnV0ZT59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMud2lyZWZyYW1lcyA9IG5ldyBXZWFrTWFwKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIFdlYWsgTWFwIGlzIHVzZWQgdG8gbWFrZSBzdXJlIGJ1ZmZlciBhdHRyaWJ1dGVzIGFyZVxyXG5cdFx0ICogdXBkYXRlZCBvbmx5IG9uY2UgcGVyIHJlbmRlciBjYWxsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtXZWFrTWFwPEJ1ZmZlckF0dHJpYnV0ZSxudW1iZXI+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmF0dHJpYnV0ZUNhbGwgPSBuZXcgV2Vha01hcCgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBnaXZlbiByZW5kZXIgb2JqZWN0IGhhcyBhbiBpbml0aWFsaXplZCBnZW9tZXRyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyT2JqZWN0fSByZW5kZXJPYmplY3QgLSBUaGUgcmVuZGVyIG9iamVjdC5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIGlmIHRoZSBnaXZlbiByZW5kZXIgb2JqZWN0IGhhcyBhbiBpbml0aWFsaXplZCBnZW9tZXRyeSBvciBub3QuXHJcblx0ICovXHJcblx0aGFzKCByZW5kZXJPYmplY3QgKSB7XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSByZW5kZXJPYmplY3QuZ2VvbWV0cnk7XHJcblxyXG5cdFx0cmV0dXJuIHN1cGVyLmhhcyggZ2VvbWV0cnkgKSAmJiB0aGlzLmdldCggZ2VvbWV0cnkgKS5pbml0aWFsaXplZCA9PT0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQcmVwYXJlcyB0aGUgZ2VvbWV0cnkgb2YgdGhlIGdpdmVuIHJlbmRlciBvYmplY3QgZm9yIHJlbmRlcmluZy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyT2JqZWN0fSByZW5kZXJPYmplY3QgLSBUaGUgcmVuZGVyIG9iamVjdC5cclxuXHQgKi9cclxuXHR1cGRhdGVGb3JSZW5kZXIoIHJlbmRlck9iamVjdCApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuaGFzKCByZW5kZXJPYmplY3QgKSA9PT0gZmFsc2UgKSB0aGlzLmluaXRHZW9tZXRyeSggcmVuZGVyT2JqZWN0ICk7XHJcblxyXG5cdFx0dGhpcy51cGRhdGVBdHRyaWJ1dGVzKCByZW5kZXJPYmplY3QgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJbml0aWFsaXplcyB0aGUgZ2VvbWV0cnkgb2YgdGhlIGdpdmVuIHJlbmRlciBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JlbmRlck9iamVjdH0gcmVuZGVyT2JqZWN0IC0gVGhlIHJlbmRlciBvYmplY3QuXHJcblx0ICovXHJcblx0aW5pdEdlb21ldHJ5KCByZW5kZXJPYmplY3QgKSB7XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSByZW5kZXJPYmplY3QuZ2VvbWV0cnk7XHJcblx0XHRjb25zdCBnZW9tZXRyeURhdGEgPSB0aGlzLmdldCggZ2VvbWV0cnkgKTtcclxuXHJcblx0XHRnZW9tZXRyeURhdGEuaW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMuaW5mby5tZW1vcnkuZ2VvbWV0cmllcyArKztcclxuXHJcblx0XHRjb25zdCBvbkRpc3Bvc2UgPSAoKSA9PiB7XHJcblxyXG5cdFx0XHR0aGlzLmluZm8ubWVtb3J5Lmdlb21ldHJpZXMgLS07XHJcblxyXG5cdFx0XHRjb25zdCBpbmRleCA9IGdlb21ldHJ5LmluZGV4O1xyXG5cdFx0XHRjb25zdCBnZW9tZXRyeUF0dHJpYnV0ZXMgPSByZW5kZXJPYmplY3QuZ2V0QXR0cmlidXRlcygpO1xyXG5cclxuXHRcdFx0aWYgKCBpbmRleCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5hdHRyaWJ1dGVzLmRlbGV0ZSggaW5kZXggKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGZvciAoIGNvbnN0IGdlb21ldHJ5QXR0cmlidXRlIG9mIGdlb21ldHJ5QXR0cmlidXRlcyApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5hdHRyaWJ1dGVzLmRlbGV0ZSggZ2VvbWV0cnlBdHRyaWJ1dGUgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IHdpcmVmcmFtZUF0dHJpYnV0ZSA9IHRoaXMud2lyZWZyYW1lcy5nZXQoIGdlb21ldHJ5ICk7XHJcblxyXG5cdFx0XHRpZiAoIHdpcmVmcmFtZUF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLmF0dHJpYnV0ZXMuZGVsZXRlKCB3aXJlZnJhbWVBdHRyaWJ1dGUgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGdlb21ldHJ5LnJlbW92ZUV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25EaXNwb3NlICk7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHRnZW9tZXRyeS5hZGRFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uRGlzcG9zZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIGdlb21ldHJ5IGF0dHJpYnV0ZXMgb2YgdGhlIGdpdmVuIHJlbmRlciBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JlbmRlck9iamVjdH0gcmVuZGVyT2JqZWN0IC0gVGhlIHJlbmRlciBvYmplY3QuXHJcblx0ICovXHJcblx0dXBkYXRlQXR0cmlidXRlcyggcmVuZGVyT2JqZWN0ICkge1xyXG5cclxuXHRcdC8vIGF0dHJpYnV0ZXNcclxuXHJcblx0XHRjb25zdCBhdHRyaWJ1dGVzID0gcmVuZGVyT2JqZWN0LmdldEF0dHJpYnV0ZXMoKTtcclxuXHJcblx0XHRmb3IgKCBjb25zdCBhdHRyaWJ1dGUgb2YgYXR0cmlidXRlcyApIHtcclxuXHJcblx0XHRcdGlmICggYXR0cmlidXRlLmlzU3RvcmFnZUJ1ZmZlckF0dHJpYnV0ZSB8fCBhdHRyaWJ1dGUuaXNTdG9yYWdlSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLnVwZGF0ZUF0dHJpYnV0ZSggYXR0cmlidXRlLCBBdHRyaWJ1dGVUeXBlLlNUT1JBR0UgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHRoaXMudXBkYXRlQXR0cmlidXRlKCBhdHRyaWJ1dGUsIEF0dHJpYnV0ZVR5cGUuVkVSVEVYICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGluZGV4ZXNcclxuXHJcblx0XHRjb25zdCBpbmRleCA9IHRoaXMuZ2V0SW5kZXgoIHJlbmRlck9iamVjdCApO1xyXG5cclxuXHRcdGlmICggaW5kZXggIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnVwZGF0ZUF0dHJpYnV0ZSggaW5kZXgsIEF0dHJpYnV0ZVR5cGUuSU5ERVggKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gaW5kaXJlY3RcclxuXHJcblx0XHRjb25zdCBpbmRpcmVjdCA9IHJlbmRlck9iamVjdC5nZW9tZXRyeS5pbmRpcmVjdDtcclxuXHJcblx0XHRpZiAoIGluZGlyZWN0ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy51cGRhdGVBdHRyaWJ1dGUoIGluZGlyZWN0LCBBdHRyaWJ1dGVUeXBlLklORElSRUNUICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIGdpdmVuIGF0dHJpYnV0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyQXR0cmlidXRlfSBhdHRyaWJ1dGUgLSBUaGUgYXR0cmlidXRlIHRvIHVwZGF0ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdHlwZSAtIFRoZSBhdHRyaWJ1dGUgdHlwZS5cclxuXHQgKi9cclxuXHR1cGRhdGVBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgdHlwZSApIHtcclxuXHJcblx0XHRjb25zdCBjYWxsSWQgPSB0aGlzLmluZm8ucmVuZGVyLmNhbGxzO1xyXG5cclxuXHRcdGlmICggISBhdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApIHtcclxuXHJcblx0XHRcdGlmICggdGhpcy5hdHRyaWJ1dGVDYWxsLmdldCggYXR0cmlidXRlICkgIT09IGNhbGxJZCApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5hdHRyaWJ1dGVzLnVwZGF0ZSggYXR0cmlidXRlLCB0eXBlICk7XHJcblxyXG5cdFx0XHRcdHRoaXMuYXR0cmlidXRlQ2FsbC5zZXQoIGF0dHJpYnV0ZSwgY2FsbElkICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGlmICggdGhpcy5hdHRyaWJ1dGVDYWxsLmdldCggYXR0cmlidXRlICkgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5hdHRyaWJ1dGVzLnVwZGF0ZSggYXR0cmlidXRlLCB0eXBlICk7XHJcblxyXG5cdFx0XHRcdHRoaXMuYXR0cmlidXRlQ2FsbC5zZXQoIGF0dHJpYnV0ZSwgY2FsbElkICk7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCB0aGlzLmF0dHJpYnV0ZUNhbGwuZ2V0KCBhdHRyaWJ1dGUuZGF0YSApICE9PSBjYWxsSWQgKSB7XHJcblxyXG5cdFx0XHRcdHRoaXMuYXR0cmlidXRlcy51cGRhdGUoIGF0dHJpYnV0ZSwgdHlwZSApO1xyXG5cclxuXHRcdFx0XHR0aGlzLmF0dHJpYnV0ZUNhbGwuc2V0KCBhdHRyaWJ1dGUuZGF0YSwgY2FsbElkICk7XHJcblxyXG5cdFx0XHRcdHRoaXMuYXR0cmlidXRlQ2FsbC5zZXQoIGF0dHJpYnV0ZSwgY2FsbElkICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGluZGlyZWN0IGJ1ZmZlciBhdHRyaWJ1dGUgb2YgdGhlIGdpdmVuIHJlbmRlciBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JlbmRlck9iamVjdH0gcmVuZGVyT2JqZWN0IC0gVGhlIHJlbmRlciBvYmplY3QuXHJcblx0ICogQHJldHVybiB7P0J1ZmZlckF0dHJpYnV0ZX0gVGhlIGluZGlyZWN0IGF0dHJpYnV0ZS4gYG51bGxgIGlmIG5vIGluZGlyZWN0IGRyYXdpbmcgaXMgdXNlZC5cclxuXHQgKi9cclxuXHRnZXRJbmRpcmVjdCggcmVuZGVyT2JqZWN0ICkge1xyXG5cclxuXHRcdHJldHVybiByZW5kZXJPYmplY3QuZ2VvbWV0cnkuaW5kaXJlY3Q7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGdpdmVuIHJlbmRlciBvYmplY3QncyBnZW9tZXRyeS4gVGhpcyBpcyBpbXBsZW1lbnRlZFxyXG5cdCAqIGluIGEgbWV0aG9kIHRvIHJldHVybiBhIHdpcmVmcmFtZSBpbmRleCBpZiBuZWNlc3NhcnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JlbmRlck9iamVjdH0gcmVuZGVyT2JqZWN0IC0gVGhlIHJlbmRlciBvYmplY3QuXHJcblx0ICogQHJldHVybiB7P0J1ZmZlckF0dHJpYnV0ZX0gVGhlIGluZGV4LiBSZXR1cm5zIGBudWxsYCBmb3Igbm9uLWluZGV4ZWQgZ2VvbWV0cmllcy5cclxuXHQgKi9cclxuXHRnZXRJbmRleCggcmVuZGVyT2JqZWN0ICkge1xyXG5cclxuXHRcdGNvbnN0IHsgZ2VvbWV0cnksIG1hdGVyaWFsIH0gPSByZW5kZXJPYmplY3Q7XHJcblxyXG5cdFx0bGV0IGluZGV4ID0gZ2VvbWV0cnkuaW5kZXg7XHJcblxyXG5cdFx0aWYgKCBtYXRlcmlhbC53aXJlZnJhbWUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB3aXJlZnJhbWVzID0gdGhpcy53aXJlZnJhbWVzO1xyXG5cclxuXHRcdFx0bGV0IHdpcmVmcmFtZUF0dHJpYnV0ZSA9IHdpcmVmcmFtZXMuZ2V0KCBnZW9tZXRyeSApO1xyXG5cclxuXHRcdFx0aWYgKCB3aXJlZnJhbWVBdHRyaWJ1dGUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0d2lyZWZyYW1lQXR0cmlidXRlID0gZ2V0V2lyZWZyYW1lSW5kZXgoIGdlb21ldHJ5ICk7XHJcblxyXG5cdFx0XHRcdHdpcmVmcmFtZXMuc2V0KCBnZW9tZXRyeSwgd2lyZWZyYW1lQXR0cmlidXRlICk7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCB3aXJlZnJhbWVBdHRyaWJ1dGUudmVyc2lvbiAhPT0gZ2V0V2lyZWZyYW1lVmVyc2lvbiggZ2VvbWV0cnkgKSApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5hdHRyaWJ1dGVzLmRlbGV0ZSggd2lyZWZyYW1lQXR0cmlidXRlICk7XHJcblxyXG5cdFx0XHRcdHdpcmVmcmFtZUF0dHJpYnV0ZSA9IGdldFdpcmVmcmFtZUluZGV4KCBnZW9tZXRyeSApO1xyXG5cclxuXHRcdFx0XHR3aXJlZnJhbWVzLnNldCggZ2VvbWV0cnksIHdpcmVmcmFtZUF0dHJpYnV0ZSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aW5kZXggPSB3aXJlZnJhbWVBdHRyaWJ1dGU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBpbmRleDtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgR2VvbWV0cmllcztcclxuIiwiLyoqXHJcbiAqIFRoaXMgcmVuZGVyZXIgbW9kdWxlIHByb3ZpZGVzIGEgc2VyaWVzIG9mIHN0YXRpc3RpY2FsIGluZm9ybWF0aW9uXHJcbiAqIGFib3V0IHRoZSBHUFUgbWVtb3J5IGFuZCB0aGUgcmVuZGVyaW5nIHByb2Nlc3MuIFVzZWZ1bCBmb3IgZGVidWdnaW5nXHJcbiAqIGFuZCBtb25pdG9yaW5nLlxyXG4gKi9cclxuY2xhc3MgSW5mbyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgaW5mbyBjb21wb25lbnQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIGZyYW1lIHJlbGF0ZWQgbWV0cmljcyBzaG91bGQgYXV0b21hdGljYWxseVxyXG5cdFx0ICogYmUgcmVzZXR0ZWQgb3Igbm90LiBUaGlzIHByb3BlcnR5IHNob3VsZCBiZSBzZXQgdG8gYGZhbHNlYFxyXG5cdFx0ICogYnkgYXBwcyB3aGljaCBtYW5hZ2UgdGhlaXIgb3duIGFuaW1hdGlvbiBsb29wLiBUaGV5IG11c3RcclxuXHRcdCAqIHRoZW4gY2FsbCBgcmVuZGVyZXIuaW5mby5yZXNldCgpYCBvbmNlIHBlciBmcmFtZSBtYW51YWxseS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hdXRvUmVzZXQgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGN1cnJlbnQgZnJhbWUgSUQuIFRoaXMgSUQgaXMgbWFuYWdlZFxyXG5cdFx0ICogYnkgYE5vZGVGcmFtZWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZyYW1lID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBudW1iZXIgb2YgcmVuZGVyIGNhbGxzIHNpbmNlIHRoZVxyXG5cdFx0ICogYXBwIGhhcyBiZWVuIHN0YXJ0ZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNhbGxzID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlbmRlciByZWxhdGVkIG1ldHJpY3MuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQHByb3BlcnR5IHtudW1iZXJ9IGNhbGxzIC0gVGhlIG51bWJlciBvZiByZW5kZXIgY2FsbHMgc2luY2UgdGhlIGFwcCBoYXMgYmVlbiBzdGFydGVkLlxyXG5cdFx0ICogQHByb3BlcnR5IHtudW1iZXJ9IGZyYW1lQ2FsbHMgLSBUaGUgbnVtYmVyIG9mIHJlbmRlciBjYWxscyBvZiB0aGUgY3VycmVudCBmcmFtZS5cclxuXHRcdCAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBkcmF3Q2FsbHMgLSBUaGUgbnVtYmVyIG9mIGRyYXcgY2FsbHMgb2YgdGhlIGN1cnJlbnQgZnJhbWUuXHJcblx0XHQgKiBAcHJvcGVydHkge251bWJlcn0gdHJpYW5nbGVzIC0gVGhlIG51bWJlciBvZiByZW5kZXJlZCB0cmlhbmdsZSBwcmltaXRpdmVzIG9mIHRoZSBjdXJyZW50IGZyYW1lLlxyXG5cdFx0ICogQHByb3BlcnR5IHtudW1iZXJ9IHBvaW50cyAtIFRoZSBudW1iZXIgb2YgcmVuZGVyZWQgcG9pbnQgcHJpbWl0aXZlcyBvZiB0aGUgY3VycmVudCBmcmFtZS5cclxuXHRcdCAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsaW5lcyAtIFRoZSBudW1iZXIgb2YgcmVuZGVyZWQgbGluZSBwcmltaXRpdmVzIG9mIHRoZSBjdXJyZW50IGZyYW1lLlxyXG5cdFx0ICogQHByb3BlcnR5IHtudW1iZXJ9IHRpbWVzdGFtcCAtIFRoZSB0aW1lc3RhbXAgb2YgdGhlIGZyYW1lIHdoZW4gdXNpbmcgYHJlbmRlcmVyLnJlbmRlckFzeW5jKClgLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJlbmRlciA9IHtcclxuXHRcdFx0Y2FsbHM6IDAsXHJcblx0XHRcdGZyYW1lQ2FsbHM6IDAsXHJcblx0XHRcdGRyYXdDYWxsczogMCxcclxuXHRcdFx0dHJpYW5nbGVzOiAwLFxyXG5cdFx0XHRwb2ludHM6IDAsXHJcblx0XHRcdGxpbmVzOiAwLFxyXG5cdFx0XHR0aW1lc3RhbXA6IDAsXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQ29tcHV0ZSByZWxhdGVkIG1ldHJpY3MuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQHByb3BlcnR5IHtudW1iZXJ9IGNhbGxzIC0gVGhlIG51bWJlciBvZiBjb21wdXRlIGNhbGxzIHNpbmNlIHRoZSBhcHAgaGFzIGJlZW4gc3RhcnRlZC5cclxuXHRcdCAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBmcmFtZUNhbGxzIC0gVGhlIG51bWJlciBvZiBjb21wdXRlIGNhbGxzIG9mIHRoZSBjdXJyZW50IGZyYW1lLlxyXG5cdFx0ICogQHByb3BlcnR5IHtudW1iZXJ9IHRpbWVzdGFtcCAtIFRoZSB0aW1lc3RhbXAgb2YgdGhlIGZyYW1lIHdoZW4gdXNpbmcgYHJlbmRlcmVyLmNvbXB1dGVBc3luYygpYC5cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb21wdXRlID0ge1xyXG5cdFx0XHRjYWxsczogMCxcclxuXHRcdFx0ZnJhbWVDYWxsczogMCxcclxuXHRcdFx0dGltZXN0YW1wOiAwXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogTWVtb3J5IHJlbGF0ZWQgbWV0cmljcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAcHJvcGVydHkge251bWJlcn0gZ2VvbWV0cmllcyAtIFRoZSBudW1iZXIgb2YgYWN0aXZlIGdlb21ldHJpZXMuXHJcblx0XHQgKiBAcHJvcGVydHkge251bWJlcn0gZnJhbWVDYWxscyAtIFRoZSBudW1iZXIgb2YgYWN0aXZlIHRleHR1cmVzLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1lbW9yeSA9IHtcclxuXHRcdFx0Z2VvbWV0cmllczogMCxcclxuXHRcdFx0dGV4dHVyZXM6IDBcclxuXHRcdH07XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGV4ZWN1dGVkIHBlciBkcmF3IGNhbGwgYW5kIHVwZGF0ZXMgdGhlIGNvcnJlc3BvbmRpbmcgbWV0cmljcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0M0R9IG9iamVjdCAtIFRoZSAzRCBvYmplY3QgdGhhdCBpcyBnb2luZyB0byBiZSByZW5kZXJlZC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gY291bnQgLSBUaGUgdmVydGV4IG9yIGluZGV4IGNvdW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbnN0YW5jZUNvdW50IC0gVGhlIGluc3RhbmNlIGNvdW50LlxyXG5cdCAqL1xyXG5cdHVwZGF0ZSggb2JqZWN0LCBjb3VudCwgaW5zdGFuY2VDb3VudCApIHtcclxuXHJcblx0XHR0aGlzLnJlbmRlci5kcmF3Q2FsbHMgKys7XHJcblxyXG5cdFx0aWYgKCBvYmplY3QuaXNNZXNoIHx8IG9iamVjdC5pc1Nwcml0ZSApIHtcclxuXHJcblx0XHRcdHRoaXMucmVuZGVyLnRyaWFuZ2xlcyArPSBpbnN0YW5jZUNvdW50ICogKCBjb3VudCAvIDMgKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBvYmplY3QuaXNQb2ludHMgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnJlbmRlci5wb2ludHMgKz0gaW5zdGFuY2VDb3VudCAqIGNvdW50O1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc0xpbmVTZWdtZW50cyApIHtcclxuXHJcblx0XHRcdHRoaXMucmVuZGVyLmxpbmVzICs9IGluc3RhbmNlQ291bnQgKiAoIGNvdW50IC8gMiApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc0xpbmUgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnJlbmRlci5saW5lcyArPSBpbnN0YW5jZUNvdW50ICogKCBjb3VudCAtIDEgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdQVUluZm86IFVua25vd24gb2JqZWN0IHR5cGUuJyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXNldHMgZnJhbWUgcmVsYXRlZCBtZXRyaWNzLlxyXG5cdCAqL1xyXG5cdHJlc2V0KCkge1xyXG5cclxuXHRcdHRoaXMucmVuZGVyLmRyYXdDYWxscyA9IDA7XHJcblx0XHR0aGlzLnJlbmRlci5mcmFtZUNhbGxzID0gMDtcclxuXHRcdHRoaXMuY29tcHV0ZS5mcmFtZUNhbGxzID0gMDtcclxuXHJcblx0XHR0aGlzLnJlbmRlci50cmlhbmdsZXMgPSAwO1xyXG5cdFx0dGhpcy5yZW5kZXIucG9pbnRzID0gMDtcclxuXHRcdHRoaXMucmVuZGVyLmxpbmVzID0gMDtcclxuXHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUGVyZm9ybXMgYSBjb21wbGV0ZSByZXNldCBvZiB0aGUgb2JqZWN0LlxyXG5cdCAqL1xyXG5cdGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0dGhpcy5yZXNldCgpO1xyXG5cclxuXHRcdHRoaXMuY2FsbHMgPSAwO1xyXG5cclxuXHRcdHRoaXMucmVuZGVyLmNhbGxzID0gMDtcclxuXHRcdHRoaXMuY29tcHV0ZS5jYWxscyA9IDA7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXIudGltZXN0YW1wID0gMDtcclxuXHRcdHRoaXMuY29tcHV0ZS50aW1lc3RhbXAgPSAwO1xyXG5cdFx0dGhpcy5tZW1vcnkuZ2VvbWV0cmllcyA9IDA7XHJcblx0XHR0aGlzLm1lbW9yeS50ZXh0dXJlcyA9IDA7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgZGVmYXVsdCBJbmZvO1xyXG4iLCIvKipcclxuICogQWJzdHJhY3QgY2xhc3MgZm9yIHJlcHJlc2VudGluZyBwaXBlbGluZXMuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBhYnN0cmFjdFxyXG4gKi9cclxuY2xhc3MgUGlwZWxpbmUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHBpcGVsaW5lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGNhY2hlS2V5IC0gVGhlIHBpcGVsaW5lJ3MgY2FjaGUga2V5LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBjYWNoZUtleSApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBwaXBlbGluZSdzIGNhY2hlIGtleS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNhY2hlS2V5ID0gY2FjaGVLZXk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3cgb2Z0ZW4gdGhlIHBpcGVsaW5lIGlzIGN1cnJlbnRseSBpbiB1c2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51c2VkVGltZXMgPSAwO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBQaXBlbGluZTtcclxuIiwiaW1wb3J0IFBpcGVsaW5lIGZyb20gJy4vUGlwZWxpbmUuanMnO1xyXG5cclxuLyoqXHJcbiAqIENsYXNzIGZvciByZXByZXNlbnRpbmcgcmVuZGVyIHBpcGVsaW5lcy5cclxuICpcclxuICogQHByaXZhdGVcclxuICogQGF1Z21lbnRzIFBpcGVsaW5lXHJcbiAqL1xyXG5jbGFzcyBSZW5kZXJQaXBlbGluZSBleHRlbmRzIFBpcGVsaW5lIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyByZW5kZXIgcGlwZWxpbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gY2FjaGVLZXkgLSBUaGUgcGlwZWxpbmUncyBjYWNoZSBrZXkuXHJcblx0ICogQHBhcmFtIHtQcm9ncmFtbWFibGVTdGFnZX0gdmVydGV4UHJvZ3JhbSAtIFRoZSBwaXBlbGluZSdzIHZlcnRleCBzaGFkZXIuXHJcblx0ICogQHBhcmFtIHtQcm9ncmFtbWFibGVTdGFnZX0gZnJhZ21lbnRQcm9ncmFtIC0gVGhlIHBpcGVsaW5lJ3MgZnJhZ21lbnQgc2hhZGVyLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBjYWNoZUtleSwgdmVydGV4UHJvZ3JhbSwgZnJhZ21lbnRQcm9ncmFtICkge1xyXG5cclxuXHRcdHN1cGVyKCBjYWNoZUtleSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHBpcGVsaW5lJ3MgdmVydGV4IHNoYWRlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7UHJvZ3JhbW1hYmxlU3RhZ2V9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudmVydGV4UHJvZ3JhbSA9IHZlcnRleFByb2dyYW07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcGlwZWxpbmUncyBmcmFnbWVudCBzaGFkZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1Byb2dyYW1tYWJsZVN0YWdlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZyYWdtZW50UHJvZ3JhbSA9IGZyYWdtZW50UHJvZ3JhbTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUmVuZGVyUGlwZWxpbmU7XHJcbiIsImltcG9ydCBQaXBlbGluZSBmcm9tICcuL1BpcGVsaW5lLmpzJztcclxuXHJcbi8qKlxyXG4gKiBDbGFzcyBmb3IgcmVwcmVzZW50aW5nIGNvbXB1dGUgcGlwZWxpbmVzLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAYXVnbWVudHMgUGlwZWxpbmVcclxuICovXHJcbmNsYXNzIENvbXB1dGVQaXBlbGluZSBleHRlbmRzIFBpcGVsaW5lIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyByZW5kZXIgcGlwZWxpbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gY2FjaGVLZXkgLSBUaGUgcGlwZWxpbmUncyBjYWNoZSBrZXkuXHJcblx0ICogQHBhcmFtIHtQcm9ncmFtbWFibGVTdGFnZX0gY29tcHV0ZVByb2dyYW0gLSBUaGUgcGlwZWxpbmUncyBjb21wdXRlIHNoYWRlci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggY2FjaGVLZXksIGNvbXB1dGVQcm9ncmFtICkge1xyXG5cclxuXHRcdHN1cGVyKCBjYWNoZUtleSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHBpcGVsaW5lJ3MgY29tcHV0ZSBzaGFkZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1Byb2dyYW1tYWJsZVN0YWdlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvbXB1dGVQcm9ncmFtID0gY29tcHV0ZVByb2dyYW07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzQ29tcHV0ZVBpcGVsaW5lID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQ29tcHV0ZVBpcGVsaW5lO1xyXG4iLCJsZXQgX2lkID0gMDtcclxuXHJcbi8qKlxyXG4gKiBDbGFzcyBmb3IgcmVwcmVzZW50aW5nIHByb2dyYW1tYWJsZSBzdGFnZXMgd2hpY2ggYXJlIHZlcnRleCxcclxuICogZnJhZ21lbnQgb3IgY29tcHV0ZSBzaGFkZXJzLiBVbmxpa2UgZml4ZWQtZnVuY3Rpb24gc3RhdGVzIChsaWtlIGJsZW5kaW5nKSxcclxuICogdGhleSByZXByZXNlbnQgdGhlIHByb2dyYW1tYWJsZSBwYXJ0IG9mIGEgcGlwZWxpbmUuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5jbGFzcyBQcm9ncmFtbWFibGVTdGFnZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcHJvZ3JhbW1hYmxlIHN0YWdlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGNvZGUgLSBUaGUgc2hhZGVyIGNvZGUuXHJcblx0ICogQHBhcmFtIHsoJ3ZlcnRleCd8J2ZyYWdtZW50J3wnY29tcHV0ZScpfSBzdGFnZSAtIFRoZSB0eXBlIG9mIHN0YWdlLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHNoYWRlci5cclxuXHQgKiBAcGFyYW0gez9BcnJheTxPYmplY3Q+fSBbdHJhbnNmb3Jtcz1udWxsXSAtIFRoZSB0cmFuc2Zvcm1zIChvbmx5IHJlbGV2YW50IGZvciBjb21wdXRlIHN0YWdlcyB3aXRoIFdlYkdMIDIgd2hpY2ggdXNlcyBUcmFuc2Zvcm0gRmVlZGJhY2spLlxyXG5cdCAqIEBwYXJhbSB7P0FycmF5PE9iamVjdD59IFthdHRyaWJ1dGVzPW51bGxdIC0gVGhlIGF0dHJpYnV0ZXMgKG9ubHkgcmVsZXZhbnQgZm9yIGNvbXB1dGUgc3RhZ2VzIHdpdGggV2ViR0wgMiB3aGljaCB1c2VzIFRyYW5zZm9ybSBGZWVkYmFjaykuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGNvZGUsIHN0YWdlLCBuYW1lLCB0cmFuc2Zvcm1zID0gbnVsbCwgYXR0cmlidXRlcyA9IG51bGwgKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgaWQgb2YgdGhlIHByb2dyYW1tYWJsZSBzdGFnZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlkID0gX2lkICsrO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHNoYWRlciBjb2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29kZSA9IGNvZGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdHlwZSBvZiBzdGFnZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnN0YWdlID0gc3RhZ2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbmFtZSBvZiB0aGUgc3RhZ2UuXHJcblx0XHQgKiBUaGlzIGlzIHVzZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5hbWUgPSBuYW1lO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHRyYW5zZm9ybXMgKG9ubHkgcmVsZXZhbnQgZm9yIGNvbXB1dGUgc3RhZ2VzIHdpdGggV2ViR0wgMiB3aGljaCB1c2VzIFRyYW5zZm9ybSBGZWVkYmFjaykuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9BcnJheTxPYmplY3Q+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRyYW5zZm9ybXMgPSB0cmFuc2Zvcm1zO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGF0dHJpYnV0ZXMgKG9ubHkgcmVsZXZhbnQgZm9yIGNvbXB1dGUgc3RhZ2VzIHdpdGggV2ViR0wgMiB3aGljaCB1c2VzIFRyYW5zZm9ybSBGZWVkYmFjaykuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9BcnJheTxPYmplY3Q+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG93IG9mdGVuIHRoZSBwcm9ncmFtbWFibGUgc3RhZ2UgaXMgY3VycmVudGx5IGluIHVzZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVzZWRUaW1lcyA9IDA7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFByb2dyYW1tYWJsZVN0YWdlO1xyXG4iLCJpbXBvcnQgRGF0YU1hcCBmcm9tICcuL0RhdGFNYXAuanMnO1xyXG5pbXBvcnQgUmVuZGVyUGlwZWxpbmUgZnJvbSAnLi9SZW5kZXJQaXBlbGluZS5qcyc7XHJcbmltcG9ydCBDb21wdXRlUGlwZWxpbmUgZnJvbSAnLi9Db21wdXRlUGlwZWxpbmUuanMnO1xyXG5pbXBvcnQgUHJvZ3JhbW1hYmxlU3RhZ2UgZnJvbSAnLi9Qcm9ncmFtbWFibGVTdGFnZS5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyByZW5kZXJlciBtb2R1bGUgbWFuYWdlcyB0aGUgcGlwZWxpbmVzIG9mIHRoZSByZW5kZXJlci5cclxuICpcclxuICogQHByaXZhdGVcclxuICogQGF1Z21lbnRzIERhdGFNYXBcclxuICovXHJcbmNsYXNzIFBpcGVsaW5lcyBleHRlbmRzIERhdGFNYXAge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHBpcGVsaW5lIG1hbmFnZW1lbnQgY29tcG9uZW50LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCYWNrZW5kfSBiYWNrZW5kIC0gVGhlIHJlbmRlcmVyJ3MgYmFja2VuZC5cclxuXHQgKiBAcGFyYW0ge05vZGVzfSBub2RlcyAtIFJlbmRlcmVyIGNvbXBvbmVudCBmb3IgbWFuYWdpbmcgbm9kZXMgcmVsYXRlZCBsb2dpYy5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggYmFja2VuZCwgbm9kZXMgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByZW5kZXJlcidzIGJhY2tlbmQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0JhY2tlbmR9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYmFja2VuZCA9IGJhY2tlbmQ7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZW5kZXJlciBjb21wb25lbnQgZm9yIG1hbmFnaW5nIG5vZGVzIHJlbGF0ZWQgbG9naWMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGVzfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vZGVzID0gbm9kZXM7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZXMgdG8gdGhlIGJpbmRpbmdzIG1hbmFnZW1lbnQgY29tcG9uZW50LlxyXG5cdFx0ICogVGhpcyByZWZlcmVuY2Ugd2lsbCBiZSBzZXQgaW5zaWRlIHRoZSBgQmluZGluZ3NgXHJcblx0XHQgKiBjb25zdHJ1Y3Rvci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P0JpbmRpbmdzfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJpbmRpbmdzID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEludGVybmFsIGNhY2hlIGZvciBtYWludGFpbmluZyBwaXBlbGluZXMuXHJcblx0XHQgKiBUaGUga2V5IG9mIHRoZSBtYXAgaXMgYSBjYWNoZSBrZXksIHRoZSB2YWx1ZSB0aGUgcGlwZWxpbmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge01hcDxzdHJpbmcsUGlwZWxpbmU+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNhY2hlcyA9IG5ldyBNYXAoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZGljdGlvbmFyeSBtYWludGFpbnMgZm9yIGVhY2ggc2hhZGVyIHN0YWdlIHR5cGUgKHZlcnRleCxcclxuXHRcdCAqIGZyYWdtZW50IGFuZCBjb21wdXRlKSB0aGUgcHJvZ3JhbW1hYmxlIHN0YWdlIG9iamVjdHMgd2hpY2hcclxuXHRcdCAqIHJlcHJlc2VudCB0aGUgYWN0dWFsIHNoYWRlciBjb2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLE1hcD59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucHJvZ3JhbXMgPSB7XHJcblx0XHRcdHZlcnRleDogbmV3IE1hcCgpLFxyXG5cdFx0XHRmcmFnbWVudDogbmV3IE1hcCgpLFxyXG5cdFx0XHRjb21wdXRlOiBuZXcgTWFwKClcclxuXHRcdH07XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIGNvbXB1dGUgcGlwZWxpbmUgZm9yIHRoZSBnaXZlbiBjb21wdXRlIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV9IGNvbXB1dGVOb2RlIC0gVGhlIGNvbXB1dGUgbm9kZS5cclxuXHQgKiBAcGFyYW0ge0FycmF5PEJpbmRHcm91cD59IGJpbmRpbmdzIC0gVGhlIGJpbmRpbmdzLlxyXG5cdCAqIEByZXR1cm4ge0NvbXB1dGVQaXBlbGluZX0gVGhlIGNvbXB1dGUgcGlwZWxpbmUuXHJcblx0ICovXHJcblx0Z2V0Rm9yQ29tcHV0ZSggY29tcHV0ZU5vZGUsIGJpbmRpbmdzICkge1xyXG5cclxuXHRcdGNvbnN0IHsgYmFja2VuZCB9ID0gdGhpcztcclxuXHJcblx0XHRjb25zdCBkYXRhID0gdGhpcy5nZXQoIGNvbXB1dGVOb2RlICk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9uZWVkc0NvbXB1dGVVcGRhdGUoIGNvbXB1dGVOb2RlICkgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBwcmV2aW91c1BpcGVsaW5lID0gZGF0YS5waXBlbGluZTtcclxuXHJcblx0XHRcdGlmICggcHJldmlvdXNQaXBlbGluZSApIHtcclxuXHJcblx0XHRcdFx0cHJldmlvdXNQaXBlbGluZS51c2VkVGltZXMgLS07XHJcblx0XHRcdFx0cHJldmlvdXNQaXBlbGluZS5jb21wdXRlUHJvZ3JhbS51c2VkVGltZXMgLS07XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBnZXQgc2hhZGVyXHJcblxyXG5cdFx0XHRjb25zdCBub2RlQnVpbGRlclN0YXRlID0gdGhpcy5ub2Rlcy5nZXRGb3JDb21wdXRlKCBjb21wdXRlTm9kZSApO1xyXG5cclxuXHRcdFx0Ly8gcHJvZ3JhbW1hYmxlIHN0YWdlXHJcblxyXG5cdFx0XHRsZXQgc3RhZ2VDb21wdXRlID0gdGhpcy5wcm9ncmFtcy5jb21wdXRlLmdldCggbm9kZUJ1aWxkZXJTdGF0ZS5jb21wdXRlU2hhZGVyICk7XHJcblxyXG5cdFx0XHRpZiAoIHN0YWdlQ29tcHV0ZSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIHByZXZpb3VzUGlwZWxpbmUgJiYgcHJldmlvdXNQaXBlbGluZS5jb21wdXRlUHJvZ3JhbS51c2VkVGltZXMgPT09IDAgKSB0aGlzLl9yZWxlYXNlUHJvZ3JhbSggcHJldmlvdXNQaXBlbGluZS5jb21wdXRlUHJvZ3JhbSApO1xyXG5cclxuXHRcdFx0XHRzdGFnZUNvbXB1dGUgPSBuZXcgUHJvZ3JhbW1hYmxlU3RhZ2UoIG5vZGVCdWlsZGVyU3RhdGUuY29tcHV0ZVNoYWRlciwgJ2NvbXB1dGUnLCBjb21wdXRlTm9kZS5uYW1lLCBub2RlQnVpbGRlclN0YXRlLnRyYW5zZm9ybXMsIG5vZGVCdWlsZGVyU3RhdGUubm9kZUF0dHJpYnV0ZXMgKTtcclxuXHRcdFx0XHR0aGlzLnByb2dyYW1zLmNvbXB1dGUuc2V0KCBub2RlQnVpbGRlclN0YXRlLmNvbXB1dGVTaGFkZXIsIHN0YWdlQ29tcHV0ZSApO1xyXG5cclxuXHRcdFx0XHRiYWNrZW5kLmNyZWF0ZVByb2dyYW0oIHN0YWdlQ29tcHV0ZSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gZGV0ZXJtaW5lIGNvbXB1dGUgcGlwZWxpbmVcclxuXHJcblx0XHRcdGNvbnN0IGNhY2hlS2V5ID0gdGhpcy5fZ2V0Q29tcHV0ZUNhY2hlS2V5KCBjb21wdXRlTm9kZSwgc3RhZ2VDb21wdXRlICk7XHJcblxyXG5cdFx0XHRsZXQgcGlwZWxpbmUgPSB0aGlzLmNhY2hlcy5nZXQoIGNhY2hlS2V5ICk7XHJcblxyXG5cdFx0XHRpZiAoIHBpcGVsaW5lID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggcHJldmlvdXNQaXBlbGluZSAmJiBwcmV2aW91c1BpcGVsaW5lLnVzZWRUaW1lcyA9PT0gMCApIHRoaXMuX3JlbGVhc2VQaXBlbGluZSggcHJldmlvdXNQaXBlbGluZSApO1xyXG5cclxuXHRcdFx0XHRwaXBlbGluZSA9IHRoaXMuX2dldENvbXB1dGVQaXBlbGluZSggY29tcHV0ZU5vZGUsIHN0YWdlQ29tcHV0ZSwgY2FjaGVLZXksIGJpbmRpbmdzICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBrZWVwIHRyYWNrIG9mIGFsbCB1c2VkIHRpbWVzXHJcblxyXG5cdFx0XHRwaXBlbGluZS51c2VkVGltZXMgKys7XHJcblx0XHRcdHN0YWdlQ29tcHV0ZS51c2VkVGltZXMgKys7XHJcblxyXG5cdFx0XHQvL1xyXG5cclxuXHRcdFx0ZGF0YS52ZXJzaW9uID0gY29tcHV0ZU5vZGUudmVyc2lvbjtcclxuXHRcdFx0ZGF0YS5waXBlbGluZSA9IHBpcGVsaW5lO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZGF0YS5waXBlbGluZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgcmVuZGVyIHBpcGVsaW5lIGZvciB0aGUgZ2l2ZW4gcmVuZGVyIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyT2JqZWN0fSByZW5kZXJPYmplY3QgLSBUaGUgcmVuZGVyIG9iamVjdC5cclxuXHQgKiBAcGFyYW0gez9BcnJheTxQcm9taXNlPn0gW3Byb21pc2VzPW51bGxdIC0gQW4gYXJyYXkgb2YgY29tcGlsYXRpb24gcHJvbWlzZXMgd2hpY2ggaXMgb25seSByZWxldmFudCBpbiBjb250ZXh0IG9mIGBSZW5kZXJlci5jb21waWxlQXN5bmMoKWAuXHJcblx0ICogQHJldHVybiB7UmVuZGVyUGlwZWxpbmV9IFRoZSByZW5kZXIgcGlwZWxpbmUuXHJcblx0ICovXHJcblx0Z2V0Rm9yUmVuZGVyKCByZW5kZXJPYmplY3QsIHByb21pc2VzID0gbnVsbCApIHtcclxuXHJcblx0XHRjb25zdCB7IGJhY2tlbmQgfSA9IHRoaXM7XHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IHRoaXMuZ2V0KCByZW5kZXJPYmplY3QgKTtcclxuXHJcblx0XHRpZiAoIHRoaXMuX25lZWRzUmVuZGVyVXBkYXRlKCByZW5kZXJPYmplY3QgKSApIHtcclxuXHJcblx0XHRcdGNvbnN0IHByZXZpb3VzUGlwZWxpbmUgPSBkYXRhLnBpcGVsaW5lO1xyXG5cclxuXHRcdFx0aWYgKCBwcmV2aW91c1BpcGVsaW5lICkge1xyXG5cclxuXHRcdFx0XHRwcmV2aW91c1BpcGVsaW5lLnVzZWRUaW1lcyAtLTtcclxuXHRcdFx0XHRwcmV2aW91c1BpcGVsaW5lLnZlcnRleFByb2dyYW0udXNlZFRpbWVzIC0tO1xyXG5cdFx0XHRcdHByZXZpb3VzUGlwZWxpbmUuZnJhZ21lbnRQcm9ncmFtLnVzZWRUaW1lcyAtLTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIGdldCBzaGFkZXJcclxuXHJcblx0XHRcdGNvbnN0IG5vZGVCdWlsZGVyU3RhdGUgPSByZW5kZXJPYmplY3QuZ2V0Tm9kZUJ1aWxkZXJTdGF0ZSgpO1xyXG5cclxuXHRcdFx0Y29uc3QgbmFtZSA9IHJlbmRlck9iamVjdC5tYXRlcmlhbCA/IHJlbmRlck9iamVjdC5tYXRlcmlhbC5uYW1lIDogJyc7XHJcblxyXG5cdFx0XHQvLyBwcm9ncmFtbWFibGUgc3RhZ2VzXHJcblxyXG5cdFx0XHRsZXQgc3RhZ2VWZXJ0ZXggPSB0aGlzLnByb2dyYW1zLnZlcnRleC5nZXQoIG5vZGVCdWlsZGVyU3RhdGUudmVydGV4U2hhZGVyICk7XHJcblxyXG5cdFx0XHRpZiAoIHN0YWdlVmVydGV4ID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggcHJldmlvdXNQaXBlbGluZSAmJiBwcmV2aW91c1BpcGVsaW5lLnZlcnRleFByb2dyYW0udXNlZFRpbWVzID09PSAwICkgdGhpcy5fcmVsZWFzZVByb2dyYW0oIHByZXZpb3VzUGlwZWxpbmUudmVydGV4UHJvZ3JhbSApO1xyXG5cclxuXHRcdFx0XHRzdGFnZVZlcnRleCA9IG5ldyBQcm9ncmFtbWFibGVTdGFnZSggbm9kZUJ1aWxkZXJTdGF0ZS52ZXJ0ZXhTaGFkZXIsICd2ZXJ0ZXgnLCBuYW1lICk7XHJcblx0XHRcdFx0dGhpcy5wcm9ncmFtcy52ZXJ0ZXguc2V0KCBub2RlQnVpbGRlclN0YXRlLnZlcnRleFNoYWRlciwgc3RhZ2VWZXJ0ZXggKTtcclxuXHJcblx0XHRcdFx0YmFja2VuZC5jcmVhdGVQcm9ncmFtKCBzdGFnZVZlcnRleCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0bGV0IHN0YWdlRnJhZ21lbnQgPSB0aGlzLnByb2dyYW1zLmZyYWdtZW50LmdldCggbm9kZUJ1aWxkZXJTdGF0ZS5mcmFnbWVudFNoYWRlciApO1xyXG5cclxuXHRcdFx0aWYgKCBzdGFnZUZyYWdtZW50ID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggcHJldmlvdXNQaXBlbGluZSAmJiBwcmV2aW91c1BpcGVsaW5lLmZyYWdtZW50UHJvZ3JhbS51c2VkVGltZXMgPT09IDAgKSB0aGlzLl9yZWxlYXNlUHJvZ3JhbSggcHJldmlvdXNQaXBlbGluZS5mcmFnbWVudFByb2dyYW0gKTtcclxuXHJcblx0XHRcdFx0c3RhZ2VGcmFnbWVudCA9IG5ldyBQcm9ncmFtbWFibGVTdGFnZSggbm9kZUJ1aWxkZXJTdGF0ZS5mcmFnbWVudFNoYWRlciwgJ2ZyYWdtZW50JywgbmFtZSApO1xyXG5cdFx0XHRcdHRoaXMucHJvZ3JhbXMuZnJhZ21lbnQuc2V0KCBub2RlQnVpbGRlclN0YXRlLmZyYWdtZW50U2hhZGVyLCBzdGFnZUZyYWdtZW50ICk7XHJcblxyXG5cdFx0XHRcdGJhY2tlbmQuY3JlYXRlUHJvZ3JhbSggc3RhZ2VGcmFnbWVudCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gZGV0ZXJtaW5lIHJlbmRlciBwaXBlbGluZVxyXG5cclxuXHRcdFx0Y29uc3QgY2FjaGVLZXkgPSB0aGlzLl9nZXRSZW5kZXJDYWNoZUtleSggcmVuZGVyT2JqZWN0LCBzdGFnZVZlcnRleCwgc3RhZ2VGcmFnbWVudCApO1xyXG5cclxuXHRcdFx0bGV0IHBpcGVsaW5lID0gdGhpcy5jYWNoZXMuZ2V0KCBjYWNoZUtleSApO1xyXG5cclxuXHRcdFx0aWYgKCBwaXBlbGluZSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIHByZXZpb3VzUGlwZWxpbmUgJiYgcHJldmlvdXNQaXBlbGluZS51c2VkVGltZXMgPT09IDAgKSB0aGlzLl9yZWxlYXNlUGlwZWxpbmUoIHByZXZpb3VzUGlwZWxpbmUgKTtcclxuXHJcblx0XHRcdFx0cGlwZWxpbmUgPSB0aGlzLl9nZXRSZW5kZXJQaXBlbGluZSggcmVuZGVyT2JqZWN0LCBzdGFnZVZlcnRleCwgc3RhZ2VGcmFnbWVudCwgY2FjaGVLZXksIHByb21pc2VzICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRyZW5kZXJPYmplY3QucGlwZWxpbmUgPSBwaXBlbGluZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIGtlZXAgdHJhY2sgb2YgYWxsIHVzZWQgdGltZXNcclxuXHJcblx0XHRcdHBpcGVsaW5lLnVzZWRUaW1lcyArKztcclxuXHRcdFx0c3RhZ2VWZXJ0ZXgudXNlZFRpbWVzICsrO1xyXG5cdFx0XHRzdGFnZUZyYWdtZW50LnVzZWRUaW1lcyArKztcclxuXHJcblx0XHRcdC8vXHJcblxyXG5cdFx0XHRkYXRhLnBpcGVsaW5lID0gcGlwZWxpbmU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBkYXRhLnBpcGVsaW5lO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlbGV0ZXMgdGhlIHBpcGVsaW5lIGZvciB0aGUgZ2l2ZW4gcmVuZGVyIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyT2JqZWN0fSBvYmplY3QgLSBUaGUgcmVuZGVyIG9iamVjdC5cclxuXHQgKiBAcmV0dXJuIHs/T2JqZWN0fSBUaGUgZGVsZXRlZCBkaWN0aW9uYXJ5LlxyXG5cdCAqL1xyXG5cdGRlbGV0ZSggb2JqZWN0ICkge1xyXG5cclxuXHRcdGNvbnN0IHBpcGVsaW5lID0gdGhpcy5nZXQoIG9iamVjdCApLnBpcGVsaW5lO1xyXG5cclxuXHRcdGlmICggcGlwZWxpbmUgKSB7XHJcblxyXG5cdFx0XHQvLyBwaXBlbGluZVxyXG5cclxuXHRcdFx0cGlwZWxpbmUudXNlZFRpbWVzIC0tO1xyXG5cclxuXHRcdFx0aWYgKCBwaXBlbGluZS51c2VkVGltZXMgPT09IDAgKSB0aGlzLl9yZWxlYXNlUGlwZWxpbmUoIHBpcGVsaW5lICk7XHJcblxyXG5cdFx0XHQvLyBwcm9ncmFtc1xyXG5cclxuXHRcdFx0aWYgKCBwaXBlbGluZS5pc0NvbXB1dGVQaXBlbGluZSApIHtcclxuXHJcblx0XHRcdFx0cGlwZWxpbmUuY29tcHV0ZVByb2dyYW0udXNlZFRpbWVzIC0tO1xyXG5cclxuXHRcdFx0XHRpZiAoIHBpcGVsaW5lLmNvbXB1dGVQcm9ncmFtLnVzZWRUaW1lcyA9PT0gMCApIHRoaXMuX3JlbGVhc2VQcm9ncmFtKCBwaXBlbGluZS5jb21wdXRlUHJvZ3JhbSApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0cGlwZWxpbmUuZnJhZ21lbnRQcm9ncmFtLnVzZWRUaW1lcyAtLTtcclxuXHRcdFx0XHRwaXBlbGluZS52ZXJ0ZXhQcm9ncmFtLnVzZWRUaW1lcyAtLTtcclxuXHJcblx0XHRcdFx0aWYgKCBwaXBlbGluZS52ZXJ0ZXhQcm9ncmFtLnVzZWRUaW1lcyA9PT0gMCApIHRoaXMuX3JlbGVhc2VQcm9ncmFtKCBwaXBlbGluZS52ZXJ0ZXhQcm9ncmFtICk7XHJcblx0XHRcdFx0aWYgKCBwaXBlbGluZS5mcmFnbWVudFByb2dyYW0udXNlZFRpbWVzID09PSAwICkgdGhpcy5fcmVsZWFzZVByb2dyYW0oIHBpcGVsaW5lLmZyYWdtZW50UHJvZ3JhbSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gc3VwZXIuZGVsZXRlKCBvYmplY3QgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGcmVlcyBpbnRlcm5hbCByZXNvdXJjZXMuXHJcblx0ICovXHJcblx0ZGlzcG9zZSgpIHtcclxuXHJcblx0XHRzdXBlci5kaXNwb3NlKCk7XHJcblxyXG5cdFx0dGhpcy5jYWNoZXMgPSBuZXcgTWFwKCk7XHJcblx0XHR0aGlzLnByb2dyYW1zID0ge1xyXG5cdFx0XHR2ZXJ0ZXg6IG5ldyBNYXAoKSxcclxuXHRcdFx0ZnJhZ21lbnQ6IG5ldyBNYXAoKSxcclxuXHRcdFx0Y29tcHV0ZTogbmV3IE1hcCgpXHJcblx0XHR9O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIHBpcGVsaW5lIGZvciB0aGUgZ2l2ZW4gcmVuZGVyIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyT2JqZWN0fSByZW5kZXJPYmplY3QgLSBUaGUgcmVuZGVyIG9iamVjdC5cclxuXHQgKi9cclxuXHR1cGRhdGVGb3JSZW5kZXIoIHJlbmRlck9iamVjdCApIHtcclxuXHJcblx0XHR0aGlzLmdldEZvclJlbmRlciggcmVuZGVyT2JqZWN0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIGNvbXB1dGUgcGlwZWxpbmUgZm9yIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge05vZGV9IGNvbXB1dGVOb2RlIC0gVGhlIGNvbXB1dGUgbm9kZS5cclxuXHQgKiBAcGFyYW0ge1Byb2dyYW1tYWJsZVN0YWdlfSBzdGFnZUNvbXB1dGUgLSBUaGUgcHJvZ3JhbW1hYmxlIHN0YWdlIHJlcHJlc2VudGluZyB0aGUgY29tcHV0ZSBzaGFkZXIuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGNhY2hlS2V5IC0gVGhlIGNhY2hlIGtleS5cclxuXHQgKiBAcGFyYW0ge0FycmF5PEJpbmRHcm91cD59IGJpbmRpbmdzIC0gVGhlIGJpbmRpbmdzLlxyXG5cdCAqIEByZXR1cm4ge0NvbXB1dGVQaXBlbGluZX0gVGhlIGNvbXB1dGUgcGlwZWxpbmUuXHJcblx0ICovXHJcblx0X2dldENvbXB1dGVQaXBlbGluZSggY29tcHV0ZU5vZGUsIHN0YWdlQ29tcHV0ZSwgY2FjaGVLZXksIGJpbmRpbmdzICkge1xyXG5cclxuXHRcdC8vIGNoZWNrIGZvciBleGlzdGluZyBwaXBlbGluZVxyXG5cclxuXHRcdGNhY2hlS2V5ID0gY2FjaGVLZXkgfHwgdGhpcy5fZ2V0Q29tcHV0ZUNhY2hlS2V5KCBjb21wdXRlTm9kZSwgc3RhZ2VDb21wdXRlICk7XHJcblxyXG5cdFx0bGV0IHBpcGVsaW5lID0gdGhpcy5jYWNoZXMuZ2V0KCBjYWNoZUtleSApO1xyXG5cclxuXHRcdGlmICggcGlwZWxpbmUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHBpcGVsaW5lID0gbmV3IENvbXB1dGVQaXBlbGluZSggY2FjaGVLZXksIHN0YWdlQ29tcHV0ZSApO1xyXG5cclxuXHRcdFx0dGhpcy5jYWNoZXMuc2V0KCBjYWNoZUtleSwgcGlwZWxpbmUgKTtcclxuXHJcblx0XHRcdHRoaXMuYmFja2VuZC5jcmVhdGVDb21wdXRlUGlwZWxpbmUoIHBpcGVsaW5lLCBiaW5kaW5ncyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcGlwZWxpbmU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIHJlbmRlciBwaXBlbGluZSBmb3IgdGhlIGdpdmVuIHBhcmFtZXRlcnMuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyT2JqZWN0fSByZW5kZXJPYmplY3QgLSBUaGUgcmVuZGVyIG9iamVjdC5cclxuXHQgKiBAcGFyYW0ge1Byb2dyYW1tYWJsZVN0YWdlfSBzdGFnZVZlcnRleCAtIFRoZSBwcm9ncmFtbWFibGUgc3RhZ2UgcmVwcmVzZW50aW5nIHRoZSB2ZXJ0ZXggc2hhZGVyLlxyXG5cdCAqIEBwYXJhbSB7UHJvZ3JhbW1hYmxlU3RhZ2V9IHN0YWdlRnJhZ21lbnQgLSBUaGUgcHJvZ3JhbW1hYmxlIHN0YWdlIHJlcHJlc2VudGluZyB0aGUgZnJhZ21lbnQgc2hhZGVyLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBjYWNoZUtleSAtIFRoZSBjYWNoZSBrZXkuXHJcblx0ICogQHBhcmFtIHs/QXJyYXk8UHJvbWlzZT59IHByb21pc2VzIC0gQW4gYXJyYXkgb2YgY29tcGlsYXRpb24gcHJvbWlzZXMgd2hpY2ggaXMgb25seSByZWxldmFudCBpbiBjb250ZXh0IG9mIGBSZW5kZXJlci5jb21waWxlQXN5bmMoKWAuXHJcblx0ICogQHJldHVybiB7Q29tcHV0ZVBpcGVsaW5lfSBUaGUgY29tcHV0ZSBwaXBlbGluZS5cclxuXHQgKi9cclxuXHRfZ2V0UmVuZGVyUGlwZWxpbmUoIHJlbmRlck9iamVjdCwgc3RhZ2VWZXJ0ZXgsIHN0YWdlRnJhZ21lbnQsIGNhY2hlS2V5LCBwcm9taXNlcyApIHtcclxuXHJcblx0XHQvLyBjaGVjayBmb3IgZXhpc3RpbmcgcGlwZWxpbmVcclxuXHJcblx0XHRjYWNoZUtleSA9IGNhY2hlS2V5IHx8IHRoaXMuX2dldFJlbmRlckNhY2hlS2V5KCByZW5kZXJPYmplY3QsIHN0YWdlVmVydGV4LCBzdGFnZUZyYWdtZW50ICk7XHJcblxyXG5cdFx0bGV0IHBpcGVsaW5lID0gdGhpcy5jYWNoZXMuZ2V0KCBjYWNoZUtleSApO1xyXG5cclxuXHRcdGlmICggcGlwZWxpbmUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHBpcGVsaW5lID0gbmV3IFJlbmRlclBpcGVsaW5lKCBjYWNoZUtleSwgc3RhZ2VWZXJ0ZXgsIHN0YWdlRnJhZ21lbnQgKTtcclxuXHJcblx0XHRcdHRoaXMuY2FjaGVzLnNldCggY2FjaGVLZXksIHBpcGVsaW5lICk7XHJcblxyXG5cdFx0XHRyZW5kZXJPYmplY3QucGlwZWxpbmUgPSBwaXBlbGluZTtcclxuXHJcblx0XHRcdC8vIFRoZSBgcHJvbWlzZXNgIGFycmF5IGlzIGBudWxsYCBieSBkZWZhdWx0IGFuZCBvbmx5IHNldCB0byBhbiBlbXB0eSBhcnJheSB3aGVuXHJcblx0XHRcdC8vIGBSZW5kZXJlci5jb21waWxlQXN5bmMoKWAgaXMgdXNlZC4gVGhlIG5leHQgY2FsbCBhY3R1YWxseSBmaWxscyB0aGUgYXJyYXkgd2l0aFxyXG5cdFx0XHQvLyBwZW5kaW5nIHByb21pc2VzIHRoYXQgcmVzb2x2ZSB3aGVuIHRoZSByZW5kZXIgcGlwZWxpbmVzIGFyZSByZWFkeSBmb3IgcmVuZGVyaW5nLlxyXG5cclxuXHRcdFx0dGhpcy5iYWNrZW5kLmNyZWF0ZVJlbmRlclBpcGVsaW5lKCByZW5kZXJPYmplY3QsIHByb21pc2VzICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBwaXBlbGluZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyBhIGNhY2hlIGtleSByZXByZXNlbnRpbmcgYSBjb21wdXRlIHBpcGVsaW5lLlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge05vZGV9IGNvbXB1dGVOb2RlIC0gVGhlIGNvbXB1dGUgbm9kZS5cclxuXHQgKiBAcGFyYW0ge1Byb2dyYW1tYWJsZVN0YWdlfSBzdGFnZUNvbXB1dGUgLSBUaGUgcHJvZ3JhbW1hYmxlIHN0YWdlIHJlcHJlc2VudGluZyB0aGUgY29tcHV0ZSBzaGFkZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgY2FjaGUga2V5LlxyXG5cdCAqL1xyXG5cdF9nZXRDb21wdXRlQ2FjaGVLZXkoIGNvbXB1dGVOb2RlLCBzdGFnZUNvbXB1dGUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIGNvbXB1dGVOb2RlLmlkICsgJywnICsgc3RhZ2VDb21wdXRlLmlkO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIGEgY2FjaGUga2V5IHJlcHJlc2VudGluZyBhIHJlbmRlciBwaXBlbGluZS5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtSZW5kZXJPYmplY3R9IHJlbmRlck9iamVjdCAtIFRoZSByZW5kZXIgb2JqZWN0LlxyXG5cdCAqIEBwYXJhbSB7UHJvZ3JhbW1hYmxlU3RhZ2V9IHN0YWdlVmVydGV4IC0gVGhlIHByb2dyYW1tYWJsZSBzdGFnZSByZXByZXNlbnRpbmcgdGhlIHZlcnRleCBzaGFkZXIuXHJcblx0ICogQHBhcmFtIHtQcm9ncmFtbWFibGVTdGFnZX0gc3RhZ2VGcmFnbWVudCAtIFRoZSBwcm9ncmFtbWFibGUgc3RhZ2UgcmVwcmVzZW50aW5nIHRoZSBmcmFnbWVudCBzaGFkZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgY2FjaGUga2V5LlxyXG5cdCAqL1xyXG5cdF9nZXRSZW5kZXJDYWNoZUtleSggcmVuZGVyT2JqZWN0LCBzdGFnZVZlcnRleCwgc3RhZ2VGcmFnbWVudCApIHtcclxuXHJcblx0XHRyZXR1cm4gc3RhZ2VWZXJ0ZXguaWQgKyAnLCcgKyBzdGFnZUZyYWdtZW50LmlkICsgJywnICsgdGhpcy5iYWNrZW5kLmdldFJlbmRlckNhY2hlS2V5KCByZW5kZXJPYmplY3QgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZWxlYXNlcyB0aGUgZ2l2ZW4gcGlwZWxpbmUuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7UGlwZWxpbmV9IHBpcGVsaW5lIC0gVGhlIHBpcGVsaW5lIHRvIHJlbGVhc2UuXHJcblx0ICovXHJcblx0X3JlbGVhc2VQaXBlbGluZSggcGlwZWxpbmUgKSB7XHJcblxyXG5cdFx0dGhpcy5jYWNoZXMuZGVsZXRlKCBwaXBlbGluZS5jYWNoZUtleSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbGVhc2VzIHRoZSBzaGFkZXIgcHJvZ3JhbS5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IHByb2dyYW0gLSBUaGUgc2hhZGVyIHByb2dyYW0gdG8gcmVsZWFzZS5cclxuXHQgKi9cclxuXHRfcmVsZWFzZVByb2dyYW0oIHByb2dyYW0gKSB7XHJcblxyXG5cdFx0Y29uc3QgY29kZSA9IHByb2dyYW0uY29kZTtcclxuXHRcdGNvbnN0IHN0YWdlID0gcHJvZ3JhbS5zdGFnZTtcclxuXHJcblx0XHR0aGlzLnByb2dyYW1zWyBzdGFnZSBdLmRlbGV0ZSggY29kZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBjb21wdXRlIHBpcGVsaW5lIGZvciB0aGUgZ2l2ZW4gY29tcHV0ZSBub2RlIHJlcXVpcmVzIGFuIHVwZGF0ZS5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtOb2RlfSBjb21wdXRlTm9kZSAtIFRoZSBjb21wdXRlIG5vZGUuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgY29tcHV0ZSBwaXBlbGluZSBmb3IgdGhlIGdpdmVuIGNvbXB1dGUgbm9kZSByZXF1aXJlcyBhbiB1cGRhdGUgb3Igbm90LlxyXG5cdCAqL1xyXG5cdF9uZWVkc0NvbXB1dGVVcGRhdGUoIGNvbXB1dGVOb2RlICkge1xyXG5cclxuXHRcdGNvbnN0IGRhdGEgPSB0aGlzLmdldCggY29tcHV0ZU5vZGUgKTtcclxuXHJcblx0XHRyZXR1cm4gZGF0YS5waXBlbGluZSA9PT0gdW5kZWZpbmVkIHx8IGRhdGEudmVyc2lvbiAhPT0gY29tcHV0ZU5vZGUudmVyc2lvbjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgcmVuZGVyIHBpcGVsaW5lIGZvciB0aGUgZ2l2ZW4gcmVuZGVyIG9iamVjdCByZXF1aXJlcyBhbiB1cGRhdGUuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyT2JqZWN0fSByZW5kZXJPYmplY3QgLSBUaGUgcmVuZGVyIG9iamVjdC5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSByZW5kZXIgb2JqZWN0IGZvciB0aGUgZ2l2ZW4gcmVuZGVyIG9iamVjdCByZXF1aXJlcyBhbiB1cGRhdGUgb3Igbm90LlxyXG5cdCAqL1xyXG5cdF9uZWVkc1JlbmRlclVwZGF0ZSggcmVuZGVyT2JqZWN0ICkge1xyXG5cclxuXHRcdGNvbnN0IGRhdGEgPSB0aGlzLmdldCggcmVuZGVyT2JqZWN0ICk7XHJcblxyXG5cdFx0cmV0dXJuIGRhdGEucGlwZWxpbmUgPT09IHVuZGVmaW5lZCB8fCB0aGlzLmJhY2tlbmQubmVlZHNSZW5kZXJVcGRhdGUoIHJlbmRlck9iamVjdCApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBQaXBlbGluZXM7XHJcbiIsImltcG9ydCBEYXRhTWFwIGZyb20gJy4vRGF0YU1hcC5qcyc7XHJcbmltcG9ydCB7IEF0dHJpYnV0ZVR5cGUgfSBmcm9tICcuL0NvbnN0YW50cy5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyByZW5kZXJlciBtb2R1bGUgbWFuYWdlcyB0aGUgYmluZGluZ3Mgb2YgdGhlIHJlbmRlcmVyLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAYXVnbWVudHMgRGF0YU1hcFxyXG4gKi9cclxuY2xhc3MgQmluZGluZ3MgZXh0ZW5kcyBEYXRhTWFwIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBiaW5kaW5ncyBtYW5hZ2VtZW50IGNvbXBvbmVudC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QmFja2VuZH0gYmFja2VuZCAtIFRoZSByZW5kZXJlcidzIGJhY2tlbmQuXHJcblx0ICogQHBhcmFtIHtOb2Rlc30gbm9kZXMgLSBSZW5kZXJlciBjb21wb25lbnQgZm9yIG1hbmFnaW5nIG5vZGVzIHJlbGF0ZWQgbG9naWMuXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlc30gdGV4dHVyZXMgLSBSZW5kZXJlciBjb21wb25lbnQgZm9yIG1hbmFnaW5nIHRleHR1cmVzLlxyXG5cdCAqIEBwYXJhbSB7QXR0cmlidXRlc30gYXR0cmlidXRlcyAtIFJlbmRlcmVyIGNvbXBvbmVudCBmb3IgbWFuYWdpbmcgYXR0cmlidXRlcy5cclxuXHQgKiBAcGFyYW0ge1BpcGVsaW5lc30gcGlwZWxpbmVzIC0gUmVuZGVyZXIgY29tcG9uZW50IGZvciBtYW5hZ2luZyBwaXBlbGluZXMuXHJcblx0ICogQHBhcmFtIHtJbmZvfSBpbmZvIC0gUmVuZGVyZXIgY29tcG9uZW50IGZvciBtYW5hZ2luZyBtZXRyaWNzIGFuZCBtb25pdG9yaW5nIGRhdGEuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGJhY2tlbmQsIG5vZGVzLCB0ZXh0dXJlcywgYXR0cmlidXRlcywgcGlwZWxpbmVzLCBpbmZvICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcmVuZGVyZXIncyBiYWNrZW5kLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtCYWNrZW5kfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJhY2tlbmQgPSBiYWNrZW5kO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVuZGVyZXIgY29tcG9uZW50IGZvciBtYW5hZ2luZyB0ZXh0dXJlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VGV4dHVyZXN9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudGV4dHVyZXMgPSB0ZXh0dXJlcztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlbmRlcmVyIGNvbXBvbmVudCBmb3IgbWFuYWdpbmcgcGlwZWxpbmVzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtQaXBlbGluZXN9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucGlwZWxpbmVzID0gcGlwZWxpbmVzO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVuZGVyZXIgY29tcG9uZW50IGZvciBtYW5hZ2luZyBhdHRyaWJ1dGVzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBdHRyaWJ1dGVzfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVuZGVyZXIgY29tcG9uZW50IGZvciBtYW5hZ2luZyBub2RlcyByZWxhdGVkIGxvZ2ljLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2Rlc31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub2RlcyA9IG5vZGVzO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVuZGVyZXIgY29tcG9uZW50IGZvciBtYW5hZ2luZyBtZXRyaWNzIGFuZCBtb25pdG9yaW5nIGRhdGEuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0luZm99XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaW5mbyA9IGluZm87XHJcblxyXG5cdFx0dGhpcy5waXBlbGluZXMuYmluZGluZ3MgPSB0aGlzOyAvLyBhc3NpZ24gYmluZGluZ3MgdG8gcGlwZWxpbmVzXHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgYmluZCBncm91cHMgZm9yIHRoZSBnaXZlbiByZW5kZXIgb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSZW5kZXJPYmplY3R9IHJlbmRlck9iamVjdCAtIFRoZSByZW5kZXIgb2JqZWN0LlxyXG5cdCAqIEByZXR1cm4ge0FycmF5PEJpbmRHcm91cD59IFRoZSBiaW5kIGdyb3Vwcy5cclxuXHQgKi9cclxuXHRnZXRGb3JSZW5kZXIoIHJlbmRlck9iamVjdCApIHtcclxuXHJcblx0XHRjb25zdCBiaW5kaW5ncyA9IHJlbmRlck9iamVjdC5nZXRCaW5kaW5ncygpO1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IGJpbmRHcm91cCBvZiBiaW5kaW5ncyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGdyb3VwRGF0YSA9IHRoaXMuZ2V0KCBiaW5kR3JvdXAgKTtcclxuXHJcblx0XHRcdGlmICggZ3JvdXBEYXRhLmJpbmRHcm91cCA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHQvLyBlYWNoIG9iamVjdCBkZWZpbmVzIGFuIGFycmF5IG9mIGJpbmRpbmdzICh1Ym9zLCB0ZXh0dXJlcywgc2FtcGxlcnMgZXRjLilcclxuXHJcblx0XHRcdFx0dGhpcy5faW5pdCggYmluZEdyb3VwICk7XHJcblxyXG5cdFx0XHRcdHRoaXMuYmFja2VuZC5jcmVhdGVCaW5kaW5ncyggYmluZEdyb3VwLCBiaW5kaW5ncywgMCApO1xyXG5cclxuXHRcdFx0XHRncm91cERhdGEuYmluZEdyb3VwID0gYmluZEdyb3VwO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gYmluZGluZ3M7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgYmluZCBncm91cHMgZm9yIHRoZSBnaXZlbiBjb21wdXRlIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV9IGNvbXB1dGVOb2RlIC0gVGhlIGNvbXB1dGUgbm9kZS5cclxuXHQgKiBAcmV0dXJuIHtBcnJheTxCaW5kR3JvdXA+fSBUaGUgYmluZCBncm91cHMuXHJcblx0ICovXHJcblx0Z2V0Rm9yQ29tcHV0ZSggY29tcHV0ZU5vZGUgKSB7XHJcblxyXG5cdFx0Y29uc3QgYmluZGluZ3MgPSB0aGlzLm5vZGVzLmdldEZvckNvbXB1dGUoIGNvbXB1dGVOb2RlICkuYmluZGluZ3M7XHJcblxyXG5cdFx0Zm9yICggY29uc3QgYmluZEdyb3VwIG9mIGJpbmRpbmdzICkge1xyXG5cclxuXHRcdFx0Y29uc3QgZ3JvdXBEYXRhID0gdGhpcy5nZXQoIGJpbmRHcm91cCApO1xyXG5cclxuXHRcdFx0aWYgKCBncm91cERhdGEuYmluZEdyb3VwID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdHRoaXMuX2luaXQoIGJpbmRHcm91cCApO1xyXG5cclxuXHRcdFx0XHR0aGlzLmJhY2tlbmQuY3JlYXRlQmluZGluZ3MoIGJpbmRHcm91cCwgYmluZGluZ3MsIDAgKTtcclxuXHJcblx0XHRcdFx0Z3JvdXBEYXRhLmJpbmRHcm91cCA9IGJpbmRHcm91cDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGJpbmRpbmdzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIGJpbmRpbmdzIGZvciB0aGUgZ2l2ZW4gY29tcHV0ZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlfSBjb21wdXRlTm9kZSAtIFRoZSBjb21wdXRlIG5vZGUuXHJcblx0ICovXHJcblx0dXBkYXRlRm9yQ29tcHV0ZSggY29tcHV0ZU5vZGUgKSB7XHJcblxyXG5cdFx0dGhpcy5fdXBkYXRlQmluZGluZ3MoIHRoaXMuZ2V0Rm9yQ29tcHV0ZSggY29tcHV0ZU5vZGUgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIGJpbmRpbmdzIGZvciB0aGUgZ2l2ZW4gcmVuZGVyIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyT2JqZWN0fSByZW5kZXJPYmplY3QgLSBUaGUgcmVuZGVyIG9iamVjdC5cclxuXHQgKi9cclxuXHR1cGRhdGVGb3JSZW5kZXIoIHJlbmRlck9iamVjdCApIHtcclxuXHJcblx0XHR0aGlzLl91cGRhdGVCaW5kaW5ncyggdGhpcy5nZXRGb3JSZW5kZXIoIHJlbmRlck9iamVjdCApICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgZ2l2ZW4gYXJyYXkgb2YgYmluZGluZ3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PEJpbmRHcm91cD59IGJpbmRpbmdzIC0gVGhlIGJpbmQgZ3JvdXBzLlxyXG5cdCAqL1xyXG5cdF91cGRhdGVCaW5kaW5ncyggYmluZGluZ3MgKSB7XHJcblxyXG5cdFx0Zm9yICggY29uc3QgYmluZEdyb3VwIG9mIGJpbmRpbmdzICkge1xyXG5cclxuXHRcdFx0dGhpcy5fdXBkYXRlKCBiaW5kR3JvdXAsIGJpbmRpbmdzICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEluaXRpYWxpemVzIHRoZSBnaXZlbiBiaW5kIGdyb3VwLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCaW5kR3JvdXB9IGJpbmRHcm91cCAtIFRoZSBiaW5kIGdyb3VwIHRvIGluaXRpYWxpemUuXHJcblx0ICovXHJcblx0X2luaXQoIGJpbmRHcm91cCApIHtcclxuXHJcblx0XHRmb3IgKCBjb25zdCBiaW5kaW5nIG9mIGJpbmRHcm91cC5iaW5kaW5ncyApIHtcclxuXHJcblx0XHRcdGlmICggYmluZGluZy5pc1NhbXBsZWRUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLnRleHR1cmVzLnVwZGF0ZVRleHR1cmUoIGJpbmRpbmcudGV4dHVyZSApO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggYmluZGluZy5pc1N0b3JhZ2VCdWZmZXIgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGF0dHJpYnV0ZSA9IGJpbmRpbmcuYXR0cmlidXRlO1xyXG5cdFx0XHRcdGNvbnN0IGF0dHJpYnV0ZVR5cGUgPSBhdHRyaWJ1dGUuaXNJbmRpcmVjdFN0b3JhZ2VCdWZmZXJBdHRyaWJ1dGUgPyBBdHRyaWJ1dGVUeXBlLklORElSRUNUIDogQXR0cmlidXRlVHlwZS5TVE9SQUdFO1xyXG5cclxuXHRcdFx0XHR0aGlzLmF0dHJpYnV0ZXMudXBkYXRlKCBhdHRyaWJ1dGUsIGF0dHJpYnV0ZVR5cGUgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgZ2l2ZW4gYmluZCBncm91cC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QmluZEdyb3VwfSBiaW5kR3JvdXAgLSBUaGUgYmluZCBncm91cCB0byB1cGRhdGUuXHJcblx0ICogQHBhcmFtIHtBcnJheTxCaW5kR3JvdXA+fSBiaW5kaW5ncyAtIFRoZSBiaW5kIGdyb3Vwcy5cclxuXHQgKi9cclxuXHRfdXBkYXRlKCBiaW5kR3JvdXAsIGJpbmRpbmdzICkge1xyXG5cclxuXHRcdGNvbnN0IHsgYmFja2VuZCB9ID0gdGhpcztcclxuXHJcblx0XHRsZXQgbmVlZHNCaW5kaW5nc1VwZGF0ZSA9IGZhbHNlO1xyXG5cdFx0bGV0IGNhY2hlQmluZGluZ3MgPSB0cnVlO1xyXG5cdFx0bGV0IGNhY2hlSW5kZXggPSAwO1xyXG5cdFx0bGV0IHZlcnNpb24gPSAwO1xyXG5cclxuXHRcdC8vIGl0ZXJhdGUgb3ZlciBhbGwgYmluZGluZ3MgYW5kIGNoZWNrIGlmIGJ1ZmZlciB1cGRhdGVzIG9yIGEgbmV3IGJpbmRpbmcgZ3JvdXAgaXMgcmVxdWlyZWRcclxuXHJcblx0XHRmb3IgKCBjb25zdCBiaW5kaW5nIG9mIGJpbmRHcm91cC5iaW5kaW5ncyApIHtcclxuXHJcblx0XHRcdGlmICggYmluZGluZy5pc05vZGVVbmlmb3Jtc0dyb3VwICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB1cGRhdGVkID0gdGhpcy5ub2Rlcy51cGRhdGVHcm91cCggYmluZGluZyApO1xyXG5cclxuXHRcdFx0XHQvLyBldmVyeSB1bmlmb3JtcyBncm91cCBpcyBhIHVuaWZvcm0gYnVmZmVyLiBTbyBpZiBubyB1cGRhdGUgaXMgcmVxdWlyZWQsXHJcblx0XHRcdFx0Ly8gd2UgbW92ZSBvbmUgd2l0aCB0aGUgbmV4dCBiaW5kaW5nLiBPdGhlcndpc2UgdGhlIG5leHQgaWYgYmxvY2sgd2lsbCB1cGRhdGUgdGhlIGdyb3VwLlxyXG5cclxuXHRcdFx0XHRpZiAoIHVwZGF0ZWQgPT09IGZhbHNlICkgY29udGludWU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIGJpbmRpbmcuaXNTdG9yYWdlQnVmZmVyICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBhdHRyaWJ1dGUgPSBiaW5kaW5nLmF0dHJpYnV0ZTtcclxuXHRcdFx0XHRjb25zdCBhdHRyaWJ1dGVUeXBlID0gYXR0cmlidXRlLmlzSW5kaXJlY3RTdG9yYWdlQnVmZmVyQXR0cmlidXRlID8gQXR0cmlidXRlVHlwZS5JTkRJUkVDVCA6IEF0dHJpYnV0ZVR5cGUuU1RPUkFHRTtcclxuXHJcblx0XHRcdFx0dGhpcy5hdHRyaWJ1dGVzLnVwZGF0ZSggYXR0cmlidXRlLCBhdHRyaWJ1dGVUeXBlICk7XHJcblxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBiaW5kaW5nLmlzVW5pZm9ybUJ1ZmZlciApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgdXBkYXRlZCA9IGJpbmRpbmcudXBkYXRlKCk7XHJcblxyXG5cdFx0XHRcdGlmICggdXBkYXRlZCApIHtcclxuXHJcblx0XHRcdFx0XHRiYWNrZW5kLnVwZGF0ZUJpbmRpbmcoIGJpbmRpbmcgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggYmluZGluZy5pc1NhbXBsZXIgKSB7XHJcblxyXG5cdFx0XHRcdGJpbmRpbmcudXBkYXRlKCk7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBiaW5kaW5nLmlzU2FtcGxlZFRleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHRleHR1cmVzVGV4dHVyZURhdGEgPSB0aGlzLnRleHR1cmVzLmdldCggYmluZGluZy50ZXh0dXJlICk7XHJcblxyXG5cdFx0XHRcdGlmICggYmluZGluZy5uZWVkc0JpbmRpbmdzVXBkYXRlKCB0ZXh0dXJlc1RleHR1cmVEYXRhLmdlbmVyYXRpb24gKSApIG5lZWRzQmluZGluZ3NVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHRjb25zdCB1cGRhdGVkID0gYmluZGluZy51cGRhdGUoKTtcclxuXHJcblx0XHRcdFx0Y29uc3QgdGV4dHVyZSA9IGJpbmRpbmcudGV4dHVyZTtcclxuXHJcblx0XHRcdFx0aWYgKCB1cGRhdGVkICkge1xyXG5cclxuXHRcdFx0XHRcdHRoaXMudGV4dHVyZXMudXBkYXRlVGV4dHVyZSggdGV4dHVyZSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGNvbnN0IHRleHR1cmVEYXRhID0gYmFja2VuZC5nZXQoIHRleHR1cmUgKTtcclxuXHJcblx0XHRcdFx0aWYgKCB0ZXh0dXJlRGF0YS5leHRlcm5hbFRleHR1cmUgIT09IHVuZGVmaW5lZCB8fCB0ZXh0dXJlc1RleHR1cmVEYXRhLmlzRGVmYXVsdFRleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y2FjaGVCaW5kaW5ncyA9IGZhbHNlO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdGNhY2hlSW5kZXggPSBjYWNoZUluZGV4ICogMTAgKyB0ZXh0dXJlLmlkO1xyXG5cdFx0XHRcdFx0dmVyc2lvbiArPSB0ZXh0dXJlLnZlcnNpb247XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKCBiYWNrZW5kLmlzV2ViR1BVQmFja2VuZCA9PT0gdHJ1ZSAmJiB0ZXh0dXJlRGF0YS50ZXh0dXJlID09PSB1bmRlZmluZWQgJiYgdGV4dHVyZURhdGEuZXh0ZXJuYWxUZXh0dXJlID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gVE9ETzogUmVtb3ZlIHRoaXMgb25jZSB3ZSBmb3VuZCB3aHkgdXBkYXRlZCA9PT0gZmFsc2UgaXNuJ3QgYm91bmQgdG8gYSB0ZXh0dXJlIGluIHRoZSBXZWJHUFUgYmFja2VuZFxyXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ0JpbmRpbmdzLl91cGRhdGU6IGJpbmRpbmcgc2hvdWxkIGJlIGF2YWlsYWJsZTonLCBiaW5kaW5nLCB1cGRhdGVkLCB0ZXh0dXJlLCBiaW5kaW5nLnRleHR1cmVOb2RlLnZhbHVlLCBuZWVkc0JpbmRpbmdzVXBkYXRlICk7XHJcblxyXG5cdFx0XHRcdFx0dGhpcy50ZXh0dXJlcy51cGRhdGVUZXh0dXJlKCB0ZXh0dXJlICk7XHJcblx0XHRcdFx0XHRuZWVkc0JpbmRpbmdzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoIHRleHR1cmUuaXNTdG9yYWdlVGV4dHVyZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCB0ZXh0dXJlRGF0YSA9IHRoaXMuZ2V0KCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBiaW5kaW5nLnN0b3JlID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0dGV4dHVyZURhdGEubmVlZHNNaXBtYXAgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIHRoaXMudGV4dHVyZXMubmVlZHNNaXBtYXBzKCB0ZXh0dXJlICkgJiYgdGV4dHVyZURhdGEubmVlZHNNaXBtYXAgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHR0aGlzLmJhY2tlbmQuZ2VuZXJhdGVNaXBtYXBzKCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0XHRcdFx0XHR0ZXh0dXJlRGF0YS5uZWVkc01pcG1hcCA9IGZhbHNlO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIG5lZWRzQmluZGluZ3NVcGRhdGUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmJhY2tlbmQudXBkYXRlQmluZGluZ3MoIGJpbmRHcm91cCwgYmluZGluZ3MsIGNhY2hlQmluZGluZ3MgPyBjYWNoZUluZGV4IDogMCwgdmVyc2lvbiApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQmluZGluZ3M7XHJcbiIsImltcG9ydCB7IERvdWJsZVNpZGUgfSBmcm9tICcuLi8uLi9jb25zdGFudHMuanMnO1xyXG5cclxuLyoqXHJcbiAqIERlZmF1bHQgc29ydGluZyBmdW5jdGlvbiBmb3Igb3BhcXVlIHJlbmRlciBpdGVtcy5cclxuICpcclxuICogQHByaXZhdGVcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBhIC0gVGhlIGZpcnN0IHJlbmRlciBpdGVtLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gYiAtIFRoZSBzZWNvbmQgcmVuZGVyIGl0ZW0uXHJcbiAqIEByZXR1cm4ge251bWJlcn0gQSBudW1lcmljIHZhbHVlIHdoaWNoIGRlZmluZXMgdGhlIHNvcnQgb3JkZXIuXHJcbiAqL1xyXG5mdW5jdGlvbiBwYWludGVyU29ydFN0YWJsZSggYSwgYiApIHtcclxuXHJcblx0aWYgKCBhLmdyb3VwT3JkZXIgIT09IGIuZ3JvdXBPcmRlciApIHtcclxuXHJcblx0XHRyZXR1cm4gYS5ncm91cE9yZGVyIC0gYi5ncm91cE9yZGVyO1xyXG5cclxuXHR9IGVsc2UgaWYgKCBhLnJlbmRlck9yZGVyICE9PSBiLnJlbmRlck9yZGVyICkge1xyXG5cclxuXHRcdHJldHVybiBhLnJlbmRlck9yZGVyIC0gYi5yZW5kZXJPcmRlcjtcclxuXHJcblx0fSBlbHNlIGlmICggYS5tYXRlcmlhbC5pZCAhPT0gYi5tYXRlcmlhbC5pZCApIHtcclxuXHJcblx0XHRyZXR1cm4gYS5tYXRlcmlhbC5pZCAtIGIubWF0ZXJpYWwuaWQ7XHJcblxyXG5cdH0gZWxzZSBpZiAoIGEueiAhPT0gYi56ICkge1xyXG5cclxuXHRcdHJldHVybiBhLnogLSBiLno7XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0cmV0dXJuIGEuaWQgLSBiLmlkO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogRGVmYXVsdCBzb3J0aW5nIGZ1bmN0aW9uIGZvciB0cmFuc3BhcmVudCByZW5kZXIgaXRlbXMuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge09iamVjdH0gYSAtIFRoZSBmaXJzdCByZW5kZXIgaXRlbS5cclxuICogQHBhcmFtIHtPYmplY3R9IGIgLSBUaGUgc2Vjb25kIHJlbmRlciBpdGVtLlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IEEgbnVtZXJpYyB2YWx1ZSB3aGljaCBkZWZpbmVzIHRoZSBzb3J0IG9yZGVyLlxyXG4gKi9cclxuZnVuY3Rpb24gcmV2ZXJzZVBhaW50ZXJTb3J0U3RhYmxlKCBhLCBiICkge1xyXG5cclxuXHRpZiAoIGEuZ3JvdXBPcmRlciAhPT0gYi5ncm91cE9yZGVyICkge1xyXG5cclxuXHRcdHJldHVybiBhLmdyb3VwT3JkZXIgLSBiLmdyb3VwT3JkZXI7XHJcblxyXG5cdH0gZWxzZSBpZiAoIGEucmVuZGVyT3JkZXIgIT09IGIucmVuZGVyT3JkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIGEucmVuZGVyT3JkZXIgLSBiLnJlbmRlck9yZGVyO1xyXG5cclxuXHR9IGVsc2UgaWYgKCBhLnogIT09IGIueiApIHtcclxuXHJcblx0XHRyZXR1cm4gYi56IC0gYS56O1xyXG5cclxuXHR9IGVsc2Uge1xyXG5cclxuXHRcdHJldHVybiBhLmlkIC0gYi5pZDtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBnaXZlbiB0cmFuc3BhcmVudCBtYXRlcmlhbCByZXF1aXJlcyBhIGRvdWJsZSBwYXNzLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtNYXRlcmlhbH0gbWF0ZXJpYWwgLSBUaGUgdHJhbnNwYXJlbnQgbWF0ZXJpYWwuXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGdpdmVuIG1hdGVyaWFsIHJlcXVpcmVzIGEgZG91YmxlIHBhc3Mgb3Igbm90LlxyXG4gKi9cclxuZnVuY3Rpb24gbmVlZHNEb3VibGVQYXNzKCBtYXRlcmlhbCApIHtcclxuXHJcblx0Y29uc3QgaGFzVHJhbnNtaXNzaW9uID0gbWF0ZXJpYWwudHJhbnNtaXNzaW9uID4gMCB8fCBtYXRlcmlhbC50cmFuc21pc3Npb25Ob2RlO1xyXG5cclxuXHRyZXR1cm4gaGFzVHJhbnNtaXNzaW9uICYmIG1hdGVyaWFsLnNpZGUgPT09IERvdWJsZVNpZGUgJiYgbWF0ZXJpYWwuZm9yY2VTaW5nbGVQYXNzID09PSBmYWxzZTtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBXaGVuIHRoZSByZW5kZXJlciBhbmFseXplcyB0aGUgc2NlbmUgYXQgdGhlIGJlZ2lubmluZyBvZiBhIHJlbmRlciBjYWxsLFxyXG4gKiBpdCBzdG9yZXMgM0Qgb2JqZWN0IGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcgaW4gcmVuZGVyIGxpc3RzLiBEZXBlbmRpbmcgb24gdGhlXHJcbiAqIHByb3BlcnRpZXMgb2YgYSAzRCBvYmplY3RzIChsaWtlIHRoZWlyIHRyYW5zZm9ybWF0aW9uIG9yIG1hdGVyaWFsIHN0YXRlKSwgdGhlXHJcbiAqIG9iamVjdHMgYXJlIG1haW50YWluZWQgaW4gb3JkZXJlZCBsaXN0cyBmb3IgdGhlIGFjdHVhbCByZW5kZXJpbmcuXHJcbiAqXHJcbiAqIFJlbmRlciBsaXN0cyBhcmUgdW5pcXVlIHBlciBzY2VuZSBhbmQgY2FtZXJhIGNvbWJpbmF0aW9uLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAYXVnbWVudHMgUGlwZWxpbmVcclxuICovXHJcbmNsYXNzIFJlbmRlckxpc3Qge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgcmVuZGVyIGxpc3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0xpZ2h0aW5nfSBsaWdodGluZyAtIFRoZSBsaWdodGluZyBtYW5hZ2VtZW50IGNvbXBvbmVudC5cclxuXHQgKiBAcGFyYW0ge1NjZW5lfSBzY2VuZSAtIFRoZSBzY2VuZS5cclxuXHQgKiBAcGFyYW0ge0NhbWVyYX0gY2FtZXJhIC0gVGhlIGNhbWVyYSB0aGUgc2NlbmUgaXMgcmVuZGVyZWQgd2l0aC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbGlnaHRpbmcsIHNjZW5lLCBjYW1lcmEgKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiAzRCBvYmplY3RzIGFyZSB0cmFuc2Zvcm1lZCBpbnRvIHJlbmRlciBpdGVtcyBhbmQgc3RvcmVkIGluIHRoaXMgYXJyYXkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PE9iamVjdD59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVuZGVySXRlbXMgPSBbXTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjdXJyZW50IHJlbmRlciBpdGVtcyBpbmRleC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJlbmRlckl0ZW1zSW5kZXggPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBsaXN0IHdpdGggb3BhcXVlIHJlbmRlciBpdGVtcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8T2JqZWN0Pn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5vcGFxdWUgPSBbXTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgbGlzdCB3aXRoIHRyYW5zcGFyZW50IHJlbmRlciBpdGVtcyB3aGljaCByZXF1aXJlXHJcblx0XHQgKiBkb3VibGUgcGFzcyByZW5kZXJpbmcgKGUuZy4gdHJhbnNtaXNzaXZlIG9iamVjdHMpLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxPYmplY3Q+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRyYW5zcGFyZW50RG91YmxlUGFzcyA9IFtdO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBsaXN0IHdpdGggdHJhbnNwYXJlbnQgcmVuZGVyIGl0ZW1zLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxPYmplY3Q+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRyYW5zcGFyZW50ID0gW107XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGxpc3Qgd2l0aCB0cmFuc3BhcmVudCByZW5kZXIgYnVuZGxlIGRhdGEuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PE9iamVjdD59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYnVuZGxlcyA9IFtdO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJlbmRlciBsaXN0J3MgbGlnaHRzIG5vZGUuIFRoaXMgbm9kZSBpcyBsYXRlclxyXG5cdFx0ICogcmVsZXZhbnQgZm9yIHRoZSBhY3R1YWwgYW5hbHl0aWNhbCBsaWdodCBub2RlcyB3aGljaFxyXG5cdFx0ICogY29tcHV0ZSB0aGUgc2NlbmUncyBsaWdodGluZyBpbiB0aGUgc2hhZGVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtMaWdodHNOb2RlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxpZ2h0c05vZGUgPSBsaWdodGluZy5nZXROb2RlKCBzY2VuZSwgY2FtZXJhICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc2NlbmUncyBsaWdodHMgc3RvcmVkIGluIGFuIGFycmF5LiBUaGlzIGFycmF5XHJcblx0XHQgKiBpcyB1c2VkIHRvIHNldHVwIHRoZSBsaWdodHMgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8TGlnaHQ+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxpZ2h0c0FycmF5ID0gW107XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc2NlbmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1NjZW5lfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNjZW5lID0gc2NlbmU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY2FtZXJhIHRoZSBzY2VuZSBpcyByZW5kZXJlZCB3aXRoLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtDYW1lcmF9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2FtZXJhID0gY2FtZXJhO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG93IG1hbnkgb2JqZWN0cyBwZXJmb3JtIG9jY2x1c2lvbiBxdWVyeSB0ZXN0cy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm9jY2x1c2lvblF1ZXJ5Q291bnQgPSAwO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCByaWdodCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgcmVuZGVyIGNhbGxcclxuXHQgKiBiZWZvcmUgdGhlIHNjZW5lIGlzIGFuYWx5emVkLiBJdCBwcmVwYXJlcyB0aGUgaW50ZXJuYWwgZGF0YVxyXG5cdCAqIHN0cnVjdHVyZXMgZm9yIHRoZSB1cGNvbWluZyByZW5kZXIgbGlzdHMgZ2VuZXJhdGlvbi5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1JlbmRlckxpc3R9IEEgcmVmZXJlbmNlIHRvIHRoaXMgcmVuZGVyIGxpc3QuXHJcblx0ICovXHJcblx0YmVnaW4oKSB7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJJdGVtc0luZGV4ID0gMDtcclxuXHJcblx0XHR0aGlzLm9wYXF1ZS5sZW5ndGggPSAwO1xyXG5cdFx0dGhpcy50cmFuc3BhcmVudERvdWJsZVBhc3MubGVuZ3RoID0gMDtcclxuXHRcdHRoaXMudHJhbnNwYXJlbnQubGVuZ3RoID0gMDtcclxuXHRcdHRoaXMuYnVuZGxlcy5sZW5ndGggPSAwO1xyXG5cclxuXHRcdHRoaXMubGlnaHRzQXJyYXkubGVuZ3RoID0gMDtcclxuXHJcblx0XHR0aGlzLm9jY2x1c2lvblF1ZXJ5Q291bnQgPSAwO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSByZW5kZXIgaXRlbSBmb3IgdGhlIGdpdmluZyByZW5kZXIgaXRlbSBzdGF0ZS4gVGhlIHN0YXRlIGlzIGRlZmluZWRcclxuXHQgKiBieSBhIHNlcmllcyBvZiBvYmplY3QtcmVsYXRlZCBwYXJhbWV0ZXJzLlxyXG5cdCAqXHJcblx0ICogVGhlIG1ldGhvZCBhdm9pZHMgb2JqZWN0IGNyZWF0aW9uIGJ5IGhvbGRpbmcgcmVuZGVyIGl0ZW1zIGFuZCByZXVzaW5nIHRoZW0gaW5cclxuXHQgKiBzdWJzZXF1ZW50IHJlbmRlciBjYWxscyAoanVzdCB3aXRoIGRpZmZlcmVudCBwcm9wZXJ0eSB2YWx1ZXMpLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3QzRH0gb2JqZWN0IC0gVGhlIDNEIG9iamVjdC5cclxuXHQgKiBAcGFyYW0ge0J1ZmZlckdlb21ldHJ5fSBnZW9tZXRyeSAtIFRoZSAzRCBvYmplY3QncyBnZW9tZXRyeS5cclxuXHQgKiBAcGFyYW0ge01hdGVyaWFsfSBtYXRlcmlhbCAtIFRoZSAzRCBvYmplY3QncyBtYXRlcmlhbC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZ3JvdXBPcmRlciAtIFRoZSBjdXJyZW50IGdyb3VwIG9yZGVyLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB6IC0gVGggM0Qgb2JqZWN0J3MgZGVwdGggdmFsdWUgKHogdmFsdWUgaW4gY2xpcCBzcGFjZSkuXHJcblx0ICogQHBhcmFtIHs/bnVtYmVyfSBncm91cCAtIHs/T2JqZWN0fSBncm91cCAtIE9ubHkgcmVsZXZhbnQgZm9yIG9iamVjdHMgdXNpbmcgbXVsdGlwbGUgbWF0ZXJpYWxzLiBUaGlzIHJlcHJlc2VudHMgYSBncm91cCBlbnRyeSBmcm9tIHRoZSByZXNwZWN0aXZlIGBCdWZmZXJHZW9tZXRyeWAuXHJcblx0ICogQHBhcmFtIHtDbGlwcGluZ0NvbnRleHR9IGNsaXBwaW5nQ29udGV4dCAtIFRoZSBjdXJyZW50IGNsaXBwaW5nIGNvbnRleHQuXHJcblx0ICogQHJldHVybiB7T2JqZWN0fSBUaGUgcmVuZGVyIGl0ZW0uXHJcblx0ICovXHJcblx0Z2V0TmV4dFJlbmRlckl0ZW0oIG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cE9yZGVyLCB6LCBncm91cCwgY2xpcHBpbmdDb250ZXh0ICkge1xyXG5cclxuXHRcdGxldCByZW5kZXJJdGVtID0gdGhpcy5yZW5kZXJJdGVtc1sgdGhpcy5yZW5kZXJJdGVtc0luZGV4IF07XHJcblxyXG5cdFx0aWYgKCByZW5kZXJJdGVtID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRyZW5kZXJJdGVtID0ge1xyXG5cdFx0XHRcdGlkOiBvYmplY3QuaWQsXHJcblx0XHRcdFx0b2JqZWN0OiBvYmplY3QsXHJcblx0XHRcdFx0Z2VvbWV0cnk6IGdlb21ldHJ5LFxyXG5cdFx0XHRcdG1hdGVyaWFsOiBtYXRlcmlhbCxcclxuXHRcdFx0XHRncm91cE9yZGVyOiBncm91cE9yZGVyLFxyXG5cdFx0XHRcdHJlbmRlck9yZGVyOiBvYmplY3QucmVuZGVyT3JkZXIsXHJcblx0XHRcdFx0ejogeixcclxuXHRcdFx0XHRncm91cDogZ3JvdXAsXHJcblx0XHRcdFx0Y2xpcHBpbmdDb250ZXh0OiBjbGlwcGluZ0NvbnRleHRcclxuXHRcdFx0fTtcclxuXHJcblx0XHRcdHRoaXMucmVuZGVySXRlbXNbIHRoaXMucmVuZGVySXRlbXNJbmRleCBdID0gcmVuZGVySXRlbTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0cmVuZGVySXRlbS5pZCA9IG9iamVjdC5pZDtcclxuXHRcdFx0cmVuZGVySXRlbS5vYmplY3QgPSBvYmplY3Q7XHJcblx0XHRcdHJlbmRlckl0ZW0uZ2VvbWV0cnkgPSBnZW9tZXRyeTtcclxuXHRcdFx0cmVuZGVySXRlbS5tYXRlcmlhbCA9IG1hdGVyaWFsO1xyXG5cdFx0XHRyZW5kZXJJdGVtLmdyb3VwT3JkZXIgPSBncm91cE9yZGVyO1xyXG5cdFx0XHRyZW5kZXJJdGVtLnJlbmRlck9yZGVyID0gb2JqZWN0LnJlbmRlck9yZGVyO1xyXG5cdFx0XHRyZW5kZXJJdGVtLnogPSB6O1xyXG5cdFx0XHRyZW5kZXJJdGVtLmdyb3VwID0gZ3JvdXA7XHJcblx0XHRcdHJlbmRlckl0ZW0uY2xpcHBpbmdDb250ZXh0ID0gY2xpcHBpbmdDb250ZXh0O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnJlbmRlckl0ZW1zSW5kZXggKys7XHJcblxyXG5cdFx0cmV0dXJuIHJlbmRlckl0ZW07XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUHVzaGVzIHRoZSBnaXZlbiBvYmplY3QgYXMgYSByZW5kZXIgaXRlbSB0byB0aGUgaW50ZXJuYWwgcmVuZGVyIGxpc3RzLlxyXG5cdCAqIFRoZSBzZWxlY3RlZCBsaXN0cyBkZXBlbmQgb24gdGhlIG9iamVjdCBwcm9wZXJ0aWVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3QzRH0gb2JqZWN0IC0gVGhlIDNEIG9iamVjdC5cclxuXHQgKiBAcGFyYW0ge0J1ZmZlckdlb21ldHJ5fSBnZW9tZXRyeSAtIFRoZSAzRCBvYmplY3QncyBnZW9tZXRyeS5cclxuXHQgKiBAcGFyYW0ge01hdGVyaWFsfSBtYXRlcmlhbCAtIFRoZSAzRCBvYmplY3QncyBtYXRlcmlhbC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZ3JvdXBPcmRlciAtIFRoZSBjdXJyZW50IGdyb3VwIG9yZGVyLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB6IC0gVGggM0Qgb2JqZWN0J3MgZGVwdGggdmFsdWUgKHogdmFsdWUgaW4gY2xpcCBzcGFjZSkuXHJcblx0ICogQHBhcmFtIHs/bnVtYmVyfSBncm91cCAtIHs/T2JqZWN0fSBncm91cCAtIE9ubHkgcmVsZXZhbnQgZm9yIG9iamVjdHMgdXNpbmcgbXVsdGlwbGUgbWF0ZXJpYWxzLiBUaGlzIHJlcHJlc2VudHMgYSBncm91cCBlbnRyeSBmcm9tIHRoZSByZXNwZWN0aXZlIGBCdWZmZXJHZW9tZXRyeWAuXHJcblx0ICogQHBhcmFtIHtDbGlwcGluZ0NvbnRleHR9IGNsaXBwaW5nQ29udGV4dCAtIFRoZSBjdXJyZW50IGNsaXBwaW5nIGNvbnRleHQuXHJcblx0ICovXHJcblx0cHVzaCggb2JqZWN0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwT3JkZXIsIHosIGdyb3VwLCBjbGlwcGluZ0NvbnRleHQgKSB7XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVySXRlbSA9IHRoaXMuZ2V0TmV4dFJlbmRlckl0ZW0oIG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cE9yZGVyLCB6LCBncm91cCwgY2xpcHBpbmdDb250ZXh0ICk7XHJcblxyXG5cdFx0aWYgKCBvYmplY3Qub2NjbHVzaW9uVGVzdCA9PT0gdHJ1ZSApIHRoaXMub2NjbHVzaW9uUXVlcnlDb3VudCArKztcclxuXHJcblx0XHRpZiAoIG1hdGVyaWFsLnRyYW5zcGFyZW50ID09PSB0cnVlIHx8IG1hdGVyaWFsLnRyYW5zbWlzc2lvbiA+IDAgKSB7XHJcblxyXG5cdFx0XHRpZiAoIG5lZWRzRG91YmxlUGFzcyggbWF0ZXJpYWwgKSApIHRoaXMudHJhbnNwYXJlbnREb3VibGVQYXNzLnB1c2goIHJlbmRlckl0ZW0gKTtcclxuXHJcblx0XHRcdHRoaXMudHJhbnNwYXJlbnQucHVzaCggcmVuZGVySXRlbSApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR0aGlzLm9wYXF1ZS5wdXNoKCByZW5kZXJJdGVtICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEluc2VydHMgdGhlIGdpdmVuIG9iamVjdCBhcyBhIHJlbmRlciBpdGVtIGF0IHRoZSBzdGFydCBvZiB0aGUgaW50ZXJuYWwgcmVuZGVyIGxpc3RzLlxyXG5cdCAqIFRoZSBzZWxlY3RlZCBsaXN0cyBkZXBlbmQgb24gdGhlIG9iamVjdCBwcm9wZXJ0aWVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3QzRH0gb2JqZWN0IC0gVGhlIDNEIG9iamVjdC5cclxuXHQgKiBAcGFyYW0ge0J1ZmZlckdlb21ldHJ5fSBnZW9tZXRyeSAtIFRoZSAzRCBvYmplY3QncyBnZW9tZXRyeS5cclxuXHQgKiBAcGFyYW0ge01hdGVyaWFsfSBtYXRlcmlhbCAtIFRoZSAzRCBvYmplY3QncyBtYXRlcmlhbC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZ3JvdXBPcmRlciAtIFRoZSBjdXJyZW50IGdyb3VwIG9yZGVyLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB6IC0gVGggM0Qgb2JqZWN0J3MgZGVwdGggdmFsdWUgKHogdmFsdWUgaW4gY2xpcCBzcGFjZSkuXHJcblx0ICogQHBhcmFtIHs/bnVtYmVyfSBncm91cCAtIHs/T2JqZWN0fSBncm91cCAtIE9ubHkgcmVsZXZhbnQgZm9yIG9iamVjdHMgdXNpbmcgbXVsdGlwbGUgbWF0ZXJpYWxzLiBUaGlzIHJlcHJlc2VudHMgYSBncm91cCBlbnRyeSBmcm9tIHRoZSByZXNwZWN0aXZlIGBCdWZmZXJHZW9tZXRyeWAuXHJcblx0ICogQHBhcmFtIHtDbGlwcGluZ0NvbnRleHR9IGNsaXBwaW5nQ29udGV4dCAtIFRoZSBjdXJyZW50IGNsaXBwaW5nIGNvbnRleHQuXHJcblx0ICovXHJcblx0dW5zaGlmdCggb2JqZWN0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwT3JkZXIsIHosIGdyb3VwLCBjbGlwcGluZ0NvbnRleHQgKSB7XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVySXRlbSA9IHRoaXMuZ2V0TmV4dFJlbmRlckl0ZW0oIG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cE9yZGVyLCB6LCBncm91cCwgY2xpcHBpbmdDb250ZXh0ICk7XHJcblxyXG5cdFx0aWYgKCBtYXRlcmlhbC50cmFuc3BhcmVudCA9PT0gdHJ1ZSB8fCBtYXRlcmlhbC50cmFuc21pc3Npb24gPiAwICkge1xyXG5cclxuXHRcdFx0aWYgKCBuZWVkc0RvdWJsZVBhc3MoIG1hdGVyaWFsICkgKSB0aGlzLnRyYW5zcGFyZW50RG91YmxlUGFzcy51bnNoaWZ0KCByZW5kZXJJdGVtICk7XHJcblxyXG5cdFx0XHR0aGlzLnRyYW5zcGFyZW50LnVuc2hpZnQoIHJlbmRlckl0ZW0gKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGhpcy5vcGFxdWUudW5zaGlmdCggcmVuZGVySXRlbSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQdXNoZXMgcmVuZGVyIGJ1bmRsZSBncm91cCBkYXRhIGludG8gdGhlIHJlbmRlciBsaXN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGdyb3VwIC0gQnVuZGxlIGdyb3VwIGRhdGEuXHJcblx0ICovXHJcblx0cHVzaEJ1bmRsZSggZ3JvdXAgKSB7XHJcblxyXG5cdFx0dGhpcy5idW5kbGVzLnB1c2goIGdyb3VwICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUHVzaGVzIGEgbGlnaHQgaW50byB0aGUgcmVuZGVyIGxpc3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0xpZ2h0fSBsaWdodCAtIFRoZSBsaWdodC5cclxuXHQgKi9cclxuXHRwdXNoTGlnaHQoIGxpZ2h0ICkge1xyXG5cclxuXHRcdHRoaXMubGlnaHRzQXJyYXkucHVzaCggbGlnaHQgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTb3J0cyB0aGUgaW50ZXJuYWwgcmVuZGVyIGxpc3RzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHs/ZnVuY3Rpb24oYW55LCBhbnkpOiBudW1iZXJ9IGN1c3RvbU9wYXF1ZVNvcnQgLSBBIGN1c3RvbSBzb3J0IGZ1bmN0aW9uIGZvciBvcGFxdWUgb2JqZWN0cy5cclxuXHQgKiBAcGFyYW0gez9mdW5jdGlvbihhbnksIGFueSk6IG51bWJlcn0gY3VzdG9tVHJhbnNwYXJlbnRTb3J0IC0gIEEgY3VzdG9tIHNvcnQgZnVuY3Rpb24gZm9yIHRyYW5zcGFyZW50IG9iamVjdHMuXHJcblx0ICovXHJcblx0c29ydCggY3VzdG9tT3BhcXVlU29ydCwgY3VzdG9tVHJhbnNwYXJlbnRTb3J0ICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5vcGFxdWUubGVuZ3RoID4gMSApIHRoaXMub3BhcXVlLnNvcnQoIGN1c3RvbU9wYXF1ZVNvcnQgfHwgcGFpbnRlclNvcnRTdGFibGUgKTtcclxuXHRcdGlmICggdGhpcy50cmFuc3BhcmVudERvdWJsZVBhc3MubGVuZ3RoID4gMSApIHRoaXMudHJhbnNwYXJlbnREb3VibGVQYXNzLnNvcnQoIGN1c3RvbVRyYW5zcGFyZW50U29ydCB8fCByZXZlcnNlUGFpbnRlclNvcnRTdGFibGUgKTtcclxuXHRcdGlmICggdGhpcy50cmFuc3BhcmVudC5sZW5ndGggPiAxICkgdGhpcy50cmFuc3BhcmVudC5zb3J0KCBjdXN0b21UcmFuc3BhcmVudFNvcnQgfHwgcmV2ZXJzZVBhaW50ZXJTb3J0U3RhYmxlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgcGVyZm9ybXMgZmluYWxpemluZyB0YXNrcyByaWdodCBhZnRlciB0aGUgcmVuZGVyIGxpc3RzXHJcblx0ICogaGF2ZSBiZWVuIGdlbmVyYXRlZC5cclxuXHQgKi9cclxuXHRmaW5pc2goKSB7XHJcblxyXG5cdFx0Ly8gdXBkYXRlIGxpZ2h0c1xyXG5cclxuXHRcdHRoaXMubGlnaHRzTm9kZS5zZXRMaWdodHMoIHRoaXMubGlnaHRzQXJyYXkgKTtcclxuXHJcblx0XHQvLyBDbGVhciByZWZlcmVuY2VzIGZyb20gaW5hY3RpdmUgcmVuZGVySXRlbXMgaW4gdGhlIGxpc3RcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IHRoaXMucmVuZGVySXRlbXNJbmRleCwgaWwgPSB0aGlzLnJlbmRlckl0ZW1zLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgcmVuZGVySXRlbSA9IHRoaXMucmVuZGVySXRlbXNbIGkgXTtcclxuXHJcblx0XHRcdGlmICggcmVuZGVySXRlbS5pZCA9PT0gbnVsbCApIGJyZWFrO1xyXG5cclxuXHRcdFx0cmVuZGVySXRlbS5pZCA9IG51bGw7XHJcblx0XHRcdHJlbmRlckl0ZW0ub2JqZWN0ID0gbnVsbDtcclxuXHRcdFx0cmVuZGVySXRlbS5nZW9tZXRyeSA9IG51bGw7XHJcblx0XHRcdHJlbmRlckl0ZW0ubWF0ZXJpYWwgPSBudWxsO1xyXG5cdFx0XHRyZW5kZXJJdGVtLmdyb3VwT3JkZXIgPSBudWxsO1xyXG5cdFx0XHRyZW5kZXJJdGVtLnJlbmRlck9yZGVyID0gbnVsbDtcclxuXHRcdFx0cmVuZGVySXRlbS56ID0gbnVsbDtcclxuXHRcdFx0cmVuZGVySXRlbS5ncm91cCA9IG51bGw7XHJcblx0XHRcdHJlbmRlckl0ZW0uY2xpcHBpbmdDb250ZXh0ID0gbnVsbDtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFJlbmRlckxpc3Q7XHJcbiIsImltcG9ydCBDaGFpbk1hcCBmcm9tICcuL0NoYWluTWFwLmpzJztcclxuaW1wb3J0IFJlbmRlckxpc3QgZnJvbSAnLi9SZW5kZXJMaXN0LmpzJztcclxuXHJcbmNvbnN0IF9jaGFpbktleXMgPSBbXTtcclxuXHJcbi8qKlxyXG4gKiBUaGlzIHJlbmRlcmVyIG1vZHVsZSBtYW5hZ2VzIHRoZSByZW5kZXIgbGlzdHMgd2hpY2ggYXJlIHVuaXF1ZVxyXG4gKiBwZXIgc2NlbmUgYW5kIGNhbWVyYSBjb21iaW5hdGlvbi5cclxuICpcclxuICogQHByaXZhdGVcclxuICovXHJcbmNsYXNzIFJlbmRlckxpc3RzIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIHJlbmRlciBsaXN0cyBtYW5hZ2VtZW50IGNvbXBvbmVudC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TGlnaHRpbmd9IGxpZ2h0aW5nIC0gVGhlIGxpZ2h0aW5nIG1hbmFnZW1lbnQgY29tcG9uZW50LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBsaWdodGluZyApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBsaWdodGluZyBtYW5hZ2VtZW50IGNvbXBvbmVudC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7TGlnaHRpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGlnaHRpbmcgPSBsaWdodGluZztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBpbnRlcm5hbCBjaGFpbiBtYXAgd2hpY2ggaG9sZHMgdGhlIHJlbmRlciBsaXN0cy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Q2hhaW5NYXB9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGlzdHMgPSBuZXcgQ2hhaW5NYXAoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgcmVuZGVyIGxpc3QgZm9yIHRoZSBnaXZlbiBzY2VuZSBhbmQgY2FtZXJhLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTY2VuZX0gc2NlbmUgLSBUaGUgc2NlbmUuXHJcblx0ICogQHBhcmFtIHtDYW1lcmF9IGNhbWVyYSAtIFRoZSBjYW1lcmEuXHJcblx0ICogQHJldHVybiB7UmVuZGVyTGlzdH0gVGhlIHJlbmRlciBsaXN0LlxyXG5cdCAqL1xyXG5cdGdldCggc2NlbmUsIGNhbWVyYSApIHtcclxuXHJcblx0XHRjb25zdCBsaXN0cyA9IHRoaXMubGlzdHM7XHJcblxyXG5cdFx0X2NoYWluS2V5c1sgMCBdID0gc2NlbmU7XHJcblx0XHRfY2hhaW5LZXlzWyAxIF0gPSBjYW1lcmE7XHJcblxyXG5cdFx0bGV0IGxpc3QgPSBsaXN0cy5nZXQoIF9jaGFpbktleXMgKTtcclxuXHJcblx0XHRpZiAoIGxpc3QgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGxpc3QgPSBuZXcgUmVuZGVyTGlzdCggdGhpcy5saWdodGluZywgc2NlbmUsIGNhbWVyYSApO1xyXG5cdFx0XHRsaXN0cy5zZXQoIF9jaGFpbktleXMsIGxpc3QgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0X2NoYWluS2V5cy5sZW5ndGggPSAwO1xyXG5cclxuXHRcdHJldHVybiBsaXN0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZyZWVzIGFsbCBpbnRlcm5hbCByZXNvdXJjZXMuXHJcblx0ICovXHJcblx0ZGlzcG9zZSgpIHtcclxuXHJcblx0XHR0aGlzLmxpc3RzID0gbmV3IENoYWluTWFwKCk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFJlbmRlckxpc3RzO1xyXG4iLCJpbXBvcnQgeyBWZWN0b3I0IH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3I0LmpzJztcclxuaW1wb3J0IHsgaGFzaEFycmF5IH0gZnJvbSAnLi4vLi4vbm9kZXMvY29yZS9Ob2RlVXRpbHMuanMnO1xyXG5cclxubGV0IF9pZCA9IDA7XHJcblxyXG4vKipcclxuICogQW55IHJlbmRlciBvciBjb21wdXRlIGNvbW1hbmQgaXMgZXhlY3V0ZWQgaW4gYSBzcGVjaWZpYyBjb250ZXh0IHRoYXQgZGVmaW5lc1xyXG4gKiB0aGUgc3RhdGUgb2YgdGhlIHJlbmRlcmVyIGFuZCBpdHMgYmFja2VuZC4gVHlwaWNhbCBleGFtcGxlcyBmb3Igc3VjaCBjb250ZXh0XHJcbiAqIGRhdGEgYXJlIHRoZSBjdXJyZW50IGNsZWFyIHZhbHVlcyBvciBkYXRhIGZyb20gdGhlIGFjdGl2ZSBmcmFtZWJ1ZmZlci4gVGhpc1xyXG4gKiBtb2R1bGUgaXMgdXNlZCB0byByZXByZXNlbnQgdGhlc2UgY29udGV4dHMgYXMgb2JqZWN0cy5cclxuICpcclxuICogQHByaXZhdGVcclxuICovXHJcbmNsYXNzIFJlbmRlckNvbnRleHQge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHJlbmRlciBjb250ZXh0LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNvbnRleHQncyBJRC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlkID0gX2lkICsrO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgY3VycmVudCBhY3RpdmUgZnJhbWVidWZmZXIgaGFzIGEgY29sb3IgYXR0YWNobWVudC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb2xvciA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSBjb2xvciBhdHRhY2htZW50IHNob3VsZCBiZSBjbGVhcmVkIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jbGVhckNvbG9yID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjbGVhciBjb2xvciB2YWx1ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNsZWFyQ29sb3JWYWx1ZSA9IHsgcjogMCwgZzogMCwgYjogMCwgYTogMSB9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgY3VycmVudCBhY3RpdmUgZnJhbWVidWZmZXIgaGFzIGEgZGVwdGggYXR0YWNobWVudC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kZXB0aCA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSBkZXB0aCBhdHRhY2htZW50IHNob3VsZCBiZSBjbGVhcmVkIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jbGVhckRlcHRoID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjbGVhciBkZXB0aCB2YWx1ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNsZWFyRGVwdGhWYWx1ZSA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSBjdXJyZW50IGFjdGl2ZSBmcmFtZWJ1ZmZlciBoYXMgYSBzdGVuY2lsIGF0dGFjaG1lbnQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnN0ZW5jaWwgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIHN0ZW5jaWwgYXR0YWNobWVudCBzaG91bGQgYmUgY2xlYXJlZCBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2xlYXJTdGVuY2lsID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjbGVhciBzdGVuY2lsIHZhbHVlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2xlYXJTdGVuY2lsVmFsdWUgPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQnkgZGVmYXVsdCB0aGUgdmlld3BvcnQgZW5jbG9zZXMgdGhlIGVudGlyZSBmcmFtZWJ1ZmZlciBJZiBhIHNtYWxsZXJcclxuXHRcdCAqIHZpZXdwb3J0IGlzIG1hbnVhbGx5IGRlZmluZWQsIHRoaXMgcHJvcGVydHkgaXMgdG8gYHRydWVgIGJ5IHRoZSByZW5kZXJlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudmlld3BvcnQgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB2aWV3cG9ydCB2YWx1ZS4gVGhpcyB2YWx1ZSBpcyBpbiBwaHlzaWNhbCBwaXhlbHMgbWVhbmluZyBpdCBpbmNvcnBvcmF0ZXNcclxuXHRcdCAqIHRoZSByZW5kZXJlcidzIHBpeGVsIHJhdGlvLiBUaGUgdmlld3BvcnQgcHJvcGVydHkgb2YgcmVuZGVyIHRhcmdldHMgb3JcclxuXHRcdCAqIHRoZSByZW5kZXJlciBpcyBpbiBsb2dpY2FsIHBpeGVscy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yNH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52aWV3cG9ydFZhbHVlID0gbmV3IFZlY3RvcjQoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZW4gdGhlIHNjaXNzb3IgdGVzdCBpcyBhY3RpdmUgYW5kIHNjaXNzb3IgcmVjdGFuZ2xlIHNtYWxsZXIgdGhhbiB0aGVcclxuXHRcdCAqIGZyYW1lYnVmZmVycyBkaW1lbnNpb25zLCB0aGlzIHByb3BlcnR5IGlzIHRvIGB0cnVlYCBieSB0aGUgcmVuZGVyZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNjaXNzb3IgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBzY2lzc29yIHJlY3RhbmdsZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yNH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zY2lzc29yVmFsdWUgPSBuZXcgVmVjdG9yNCgpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGFjdGl2ZSByZW5kZXIgdGFyZ2V0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/UmVuZGVyVGFyZ2V0fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJlbmRlclRhcmdldCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdGV4dHVyZXMgb2YgdGhlIGFjdGl2ZSByZW5kZXIgdGFyZ2V0LlxyXG5cdFx0ICogYG51bGxgIHdoZW4gbm8gcmVuZGVyIHRhcmdldCBpcyBzZXQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9BcnJheTxUZXh0dXJlPn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50ZXh0dXJlcyA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZGVwdGggdGV4dHVyZSBvZiB0aGUgYWN0aXZlIHJlbmRlciB0YXJnZXQuXHJcblx0XHQgKiBgbnVsbGAgd2hlbiBubyByZW5kZXIgdGFyZ2V0IGlzIHNldC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P0RlcHRoVGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kZXB0aFRleHR1cmUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGFjdGl2ZSBjdWJlIGZhY2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hY3RpdmVDdWJlRmFjZSA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYWN0aXZlIG1pcG1hcCBsZXZlbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFjdGl2ZU1pcG1hcExldmVsID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBudW1iZXIgb2YgTVNBQSBzYW1wbGVzLiBUaGlzIHZhbHVlIGlzIGFsd2F5cyBgMWAgd2hlblxyXG5cdFx0ICogTVNBQSBpc24ndCB1c2VkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2FtcGxlQ291bnQgPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGFjdGl2ZSByZW5kZXIgdGFyZ2V0J3Mgd2lkdGggaW4gcGh5c2ljYWwgcGl4ZWxzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMud2lkdGggPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGFjdGl2ZSByZW5kZXIgdGFyZ2V0J3MgaGVpZ2h0IGluIHBoeXNpY2FsIHBpeGVscy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmhlaWdodCA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgb2NjbHVzaW9uIHF1ZXJ5IGNvdW50LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMub2NjbHVzaW9uUXVlcnlDb3VudCA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY3VycmVudCBjbGlwcGluZyBjb250ZXh0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Q2xpcHBpbmdDb250ZXh0fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNsaXBwaW5nQ29udGV4dCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzUmVuZGVyQ29udGV4dCA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgY2FjaGUga2V5IG9mIHRoaXMgcmVuZGVyIGNvbnRleHQuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBjYWNoZSBrZXkuXHJcblx0ICovXHJcblx0Z2V0Q2FjaGVLZXkoKSB7XHJcblxyXG5cdFx0cmV0dXJuIGdldENhY2hlS2V5KCB0aGlzICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb21wdXRlcyBhIGNhY2hlIGtleSBmb3IgdGhlIGdpdmVuIHJlbmRlciBjb250ZXh0LiBUaGlzIGtleVxyXG4gKiBzaG91bGQgaWRlbnRpZnkgdGhlIHJlbmRlciB0YXJnZXQgc3RhdGUgc28gaXQgaXMgcG9zc2libGUgdG9cclxuICogY29uZmlndXJlIHRoZSBjb3JyZWN0IGF0dGFjaG1lbnRzIGluIHRoZSByZXNwZWN0aXZlIGJhY2tlbmQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVuZGVyQ29udGV4dH0gcmVuZGVyQ29udGV4dCAtIFRoZSByZW5kZXIgY29udGV4dC5cclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgY2FjaGUga2V5LlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldENhY2hlS2V5KCByZW5kZXJDb250ZXh0ICkge1xyXG5cclxuXHRjb25zdCB7IHRleHR1cmVzLCBhY3RpdmVDdWJlRmFjZSB9ID0gcmVuZGVyQ29udGV4dDtcclxuXHJcblx0Y29uc3QgdmFsdWVzID0gWyBhY3RpdmVDdWJlRmFjZSBdO1xyXG5cclxuXHRmb3IgKCBjb25zdCB0ZXh0dXJlIG9mIHRleHR1cmVzICkge1xyXG5cclxuXHRcdHZhbHVlcy5wdXNoKCB0ZXh0dXJlLmlkICk7XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIGhhc2hBcnJheSggdmFsdWVzICk7XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBSZW5kZXJDb250ZXh0O1xyXG4iLCJpbXBvcnQgQ2hhaW5NYXAgZnJvbSAnLi9DaGFpbk1hcC5qcyc7XHJcbmltcG9ydCBSZW5kZXJDb250ZXh0IGZyb20gJy4vUmVuZGVyQ29udGV4dC5qcyc7XHJcbmltcG9ydCB7IFNjZW5lIH0gZnJvbSAnLi4vLi4vc2NlbmVzL1NjZW5lLmpzJztcclxuaW1wb3J0IHsgQ2FtZXJhIH0gZnJvbSAnLi4vLi4vY2FtZXJhcy9DYW1lcmEuanMnO1xyXG5cclxuY29uc3QgX2NoYWluS2V5cyA9IFtdO1xyXG5jb25zdCBfZGVmYXVsdFNjZW5lID0gLypAX19QVVJFX18qLyBuZXcgU2NlbmUoKTtcclxuY29uc3QgX2RlZmF1bHRDYW1lcmEgPSAvKkBfX1BVUkVfXyovIG5ldyBDYW1lcmEoKTtcclxuXHJcbi8qKlxyXG4gKiBUaGlzIG1vZHVsZSBtYW5hZ2VzIHRoZSByZW5kZXIgY29udGV4dHMgb2YgdGhlIHJlbmRlcmVyLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuY2xhc3MgUmVuZGVyQ29udGV4dHMge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHJlbmRlciBjb250ZXh0IG1hbmFnZW1lbnQgY29tcG9uZW50LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBkaWN0aW9uYXJ5IHRoYXQgbWFuYWdlcyByZW5kZXIgY29udGV4dHMgaW4gY2hhaW4gbWFwc1xyXG5cdFx0ICogZm9yIGVhY2ggYXR0YWNobWVudCBzdGF0ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0PHN0cmluZyxDaGFpbk1hcD59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2hhaW5NYXBzID0ge307XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIHJlbmRlciBjb250ZXh0IGZvciB0aGUgZ2l2ZW4gc2NlbmUsIGNhbWVyYSBhbmQgcmVuZGVyIHRhcmdldC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7U2NlbmV9IHNjZW5lIC0gVGhlIHNjZW5lLlxyXG5cdCAqIEBwYXJhbSB7Q2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIHRoYXQgaXMgdXNlZCB0byByZW5kZXIgdGhlIHNjZW5lLlxyXG5cdCAqIEBwYXJhbSB7P1JlbmRlclRhcmdldH0gW3JlbmRlclRhcmdldD1udWxsXSAtIFRoZSBhY3RpdmUgcmVuZGVyIHRhcmdldC5cclxuXHQgKiBAcmV0dXJuIHtSZW5kZXJDb250ZXh0fSBUaGUgcmVuZGVyIGNvbnRleHQuXHJcblx0ICovXHJcblx0Z2V0KCBzY2VuZSwgY2FtZXJhLCByZW5kZXJUYXJnZXQgPSBudWxsICkge1xyXG5cclxuXHRcdF9jaGFpbktleXNbIDAgXSA9IHNjZW5lO1xyXG5cdFx0X2NoYWluS2V5c1sgMSBdID0gY2FtZXJhO1xyXG5cclxuXHRcdGxldCBhdHRhY2htZW50U3RhdGU7XHJcblxyXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRhdHRhY2htZW50U3RhdGUgPSAnZGVmYXVsdCc7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGNvbnN0IGZvcm1hdCA9IHJlbmRlclRhcmdldC50ZXh0dXJlLmZvcm1hdDtcclxuXHRcdFx0Y29uc3QgY291bnQgPSByZW5kZXJUYXJnZXQudGV4dHVyZXMubGVuZ3RoO1xyXG5cclxuXHRcdFx0YXR0YWNobWVudFN0YXRlID0gYCR7IGNvdW50IH06JHsgZm9ybWF0IH06JHsgcmVuZGVyVGFyZ2V0LnNhbXBsZXMgfTokeyByZW5kZXJUYXJnZXQuZGVwdGhCdWZmZXIgfTokeyByZW5kZXJUYXJnZXQuc3RlbmNpbEJ1ZmZlciB9YDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgY2hhaW5NYXAgPSB0aGlzLl9nZXRDaGFpbk1hcCggYXR0YWNobWVudFN0YXRlICk7XHJcblxyXG5cdFx0bGV0IHJlbmRlclN0YXRlID0gY2hhaW5NYXAuZ2V0KCBfY2hhaW5LZXlzICk7XHJcblxyXG5cdFx0aWYgKCByZW5kZXJTdGF0ZSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0cmVuZGVyU3RhdGUgPSBuZXcgUmVuZGVyQ29udGV4dCgpO1xyXG5cclxuXHRcdFx0Y2hhaW5NYXAuc2V0KCBfY2hhaW5LZXlzLCByZW5kZXJTdGF0ZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRfY2hhaW5LZXlzLmxlbmd0aCA9IDA7XHJcblxyXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQgIT09IG51bGwgKSByZW5kZXJTdGF0ZS5zYW1wbGVDb3VudCA9IHJlbmRlclRhcmdldC5zYW1wbGVzID09PSAwID8gMSA6IHJlbmRlclRhcmdldC5zYW1wbGVzO1xyXG5cclxuXHRcdHJldHVybiByZW5kZXJTdGF0ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgcmVuZGVyIGNvbnRleHQgaW50ZW5kZWQgZm9yIGNsZWFyIG9wZXJhdGlvbnMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gez9SZW5kZXJUYXJnZXR9IFtyZW5kZXJUYXJnZXQ9bnVsbF0gLSBUaGUgYWN0aXZlIHJlbmRlciB0YXJnZXQuXHJcblx0ICogQHJldHVybiB7UmVuZGVyQ29udGV4dH0gVGhlIHJlbmRlciBjb250ZXh0LlxyXG5cdCAqL1xyXG5cdGdldEZvckNsZWFyKCByZW5kZXJUYXJnZXQgPSBudWxsICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmdldCggX2RlZmF1bHRTY2VuZSwgX2RlZmF1bHRDYW1lcmEsIHJlbmRlclRhcmdldCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBjaGFpbiBtYXAgZm9yIHRoZSBnaXZlbiBhdHRhY2htZW50IHN0YXRlLlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gYXR0YWNobWVudFN0YXRlIC0gVGhlIGF0dGFjaG1lbnQgc3RhdGUuXHJcblx0ICogQHJldHVybiB7Q2hhaW5NYXB9IFRoZSBjaGFpbiBtYXAuXHJcblx0ICovXHJcblx0X2dldENoYWluTWFwKCBhdHRhY2htZW50U3RhdGUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuY2hhaW5NYXBzWyBhdHRhY2htZW50U3RhdGUgXSB8fCAoIHRoaXMuY2hhaW5NYXBzWyBhdHRhY2htZW50U3RhdGUgXSA9IG5ldyBDaGFpbk1hcCgpICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRnJlZXMgaW50ZXJuYWwgcmVzb3VyY2VzLlxyXG5cdCAqL1xyXG5cdGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0dGhpcy5jaGFpbk1hcHMgPSB7fTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUmVuZGVyQ29udGV4dHM7XHJcbiIsImltcG9ydCBEYXRhTWFwIGZyb20gJy4vRGF0YU1hcC5qcyc7XHJcblxyXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuaW1wb3J0IHsgRGVwdGhUZXh0dXJlIH0gZnJvbSAnLi4vLi4vdGV4dHVyZXMvRGVwdGhUZXh0dXJlLmpzJztcclxuaW1wb3J0IHsgRGVwdGhTdGVuY2lsRm9ybWF0LCBEZXB0aEZvcm1hdCwgVW5zaWduZWRJbnRUeXBlLCBVbnNpZ25lZEludDI0OFR5cGUsIEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nLCBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZywgQ3ViZVJlZmxlY3Rpb25NYXBwaW5nLCBDdWJlUmVmcmFjdGlvbk1hcHBpbmcsIFVuc2lnbmVkQnl0ZVR5cGUgfSBmcm9tICcuLi8uLi9jb25zdGFudHMuanMnO1xyXG5cclxuY29uc3QgX3NpemUgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcblxyXG4vKipcclxuICogVGhpcyBtb2R1bGUgbWFuYWdlcyB0aGUgdGV4dHVyZXMgb2YgdGhlIHJlbmRlcmVyLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAYXVnbWVudHMgRGF0YU1hcFxyXG4gKi9cclxuY2xhc3MgVGV4dHVyZXMgZXh0ZW5kcyBEYXRhTWFwIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB0ZXh0dXJlIG1hbmFnZW1lbnQgY29tcG9uZW50LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcblx0ICogQHBhcmFtIHtCYWNrZW5kfSBiYWNrZW5kIC0gVGhlIHJlbmRlcmVyJ3MgYmFja2VuZC5cclxuXHQgKiBAcGFyYW0ge0luZm99IGluZm8gLSBSZW5kZXJlciBjb21wb25lbnQgZm9yIG1hbmFnaW5nIG1ldHJpY3MgYW5kIG1vbml0b3JpbmcgZGF0YS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcmVuZGVyZXIsIGJhY2tlbmQsIGluZm8gKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByZW5kZXJlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7UmVuZGVyZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBiYWNrZW5kLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtCYWNrZW5kfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJhY2tlbmQgPSBiYWNrZW5kO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVuZGVyZXIgY29tcG9uZW50IGZvciBtYW5hZ2luZyBtZXRyaWNzIGFuZCBtb25pdG9yaW5nIGRhdGEuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0luZm99XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaW5mbyA9IGluZm87XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgZ2l2ZW4gcmVuZGVyIHRhcmdldC4gQmFzZWQgb24gdGhlIGdpdmVuIHJlbmRlciB0YXJnZXQgY29uZmlndXJhdGlvbixcclxuXHQgKiBpdCB1cGRhdGVzIHRoZSB0ZXh0dXJlIHN0YXRlcyByZXByZXNlbnRpbmcgdGhlIGF0dGFjaG1lbnRzIG9mIHRoZSBmcmFtZWJ1ZmZlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyVGFyZ2V0fSByZW5kZXJUYXJnZXQgLSBUaGUgcmVuZGVyIHRhcmdldCB0byB1cGRhdGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFthY3RpdmVNaXBtYXBMZXZlbD0wXSAtIFRoZSBhY3RpdmUgbWlwbWFwIGxldmVsLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZVJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0LCBhY3RpdmVNaXBtYXBMZXZlbCA9IDAgKSB7XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyVGFyZ2V0RGF0YSA9IHRoaXMuZ2V0KCByZW5kZXJUYXJnZXQgKTtcclxuXHJcblx0XHRjb25zdCBzYW1wbGVDb3VudCA9IHJlbmRlclRhcmdldC5zYW1wbGVzID09PSAwID8gMSA6IHJlbmRlclRhcmdldC5zYW1wbGVzO1xyXG5cdFx0Y29uc3QgZGVwdGhUZXh0dXJlTWlwcyA9IHJlbmRlclRhcmdldERhdGEuZGVwdGhUZXh0dXJlTWlwcyB8fCAoIHJlbmRlclRhcmdldERhdGEuZGVwdGhUZXh0dXJlTWlwcyA9IHt9ICk7XHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZXMgPSByZW5kZXJUYXJnZXQudGV4dHVyZXM7XHJcblxyXG5cdFx0Y29uc3Qgc2l6ZSA9IHRoaXMuZ2V0U2l6ZSggdGV4dHVyZXNbIDAgXSApO1xyXG5cclxuXHRcdGNvbnN0IG1pcFdpZHRoID0gc2l6ZS53aWR0aCA+PiBhY3RpdmVNaXBtYXBMZXZlbDtcclxuXHRcdGNvbnN0IG1pcEhlaWdodCA9IHNpemUuaGVpZ2h0ID4+IGFjdGl2ZU1pcG1hcExldmVsO1xyXG5cclxuXHRcdGxldCBkZXB0aFRleHR1cmUgPSByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlIHx8IGRlcHRoVGV4dHVyZU1pcHNbIGFjdGl2ZU1pcG1hcExldmVsIF07XHJcblx0XHRjb25zdCB1c2VEZXB0aFRleHR1cmUgPSByZW5kZXJUYXJnZXQuZGVwdGhCdWZmZXIgPT09IHRydWUgfHwgcmVuZGVyVGFyZ2V0LnN0ZW5jaWxCdWZmZXIgPT09IHRydWU7XHJcblxyXG5cdFx0bGV0IHRleHR1cmVOZWVkc1VwZGF0ZSA9IGZhbHNlO1xyXG5cclxuXHRcdGlmICggZGVwdGhUZXh0dXJlID09PSB1bmRlZmluZWQgJiYgdXNlRGVwdGhUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0ZGVwdGhUZXh0dXJlID0gbmV3IERlcHRoVGV4dHVyZSgpO1xyXG5cdFx0XHRkZXB0aFRleHR1cmUuZm9ybWF0ID0gcmVuZGVyVGFyZ2V0LnN0ZW5jaWxCdWZmZXIgPyBEZXB0aFN0ZW5jaWxGb3JtYXQgOiBEZXB0aEZvcm1hdDtcclxuXHRcdFx0ZGVwdGhUZXh0dXJlLnR5cGUgPSByZW5kZXJUYXJnZXQuc3RlbmNpbEJ1ZmZlciA/IFVuc2lnbmVkSW50MjQ4VHlwZSA6IFVuc2lnbmVkSW50VHlwZTsgLy8gRmxvYXRUeXBlXHJcblx0XHRcdGRlcHRoVGV4dHVyZS5pbWFnZS53aWR0aCA9IG1pcFdpZHRoO1xyXG5cdFx0XHRkZXB0aFRleHR1cmUuaW1hZ2UuaGVpZ2h0ID0gbWlwSGVpZ2h0O1xyXG5cclxuXHRcdFx0ZGVwdGhUZXh0dXJlTWlwc1sgYWN0aXZlTWlwbWFwTGV2ZWwgXSA9IGRlcHRoVGV4dHVyZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCByZW5kZXJUYXJnZXREYXRhLndpZHRoICE9PSBzaXplLndpZHRoIHx8IHNpemUuaGVpZ2h0ICE9PSByZW5kZXJUYXJnZXREYXRhLmhlaWdodCApIHtcclxuXHJcblx0XHRcdHRleHR1cmVOZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0XHRpZiAoIGRlcHRoVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0ZGVwdGhUZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHRcdFx0XHRkZXB0aFRleHR1cmUuaW1hZ2Uud2lkdGggPSBtaXBXaWR0aDtcclxuXHRcdFx0XHRkZXB0aFRleHR1cmUuaW1hZ2UuaGVpZ2h0ID0gbWlwSGVpZ2h0O1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZW5kZXJUYXJnZXREYXRhLndpZHRoID0gc2l6ZS53aWR0aDtcclxuXHRcdHJlbmRlclRhcmdldERhdGEuaGVpZ2h0ID0gc2l6ZS5oZWlnaHQ7XHJcblx0XHRyZW5kZXJUYXJnZXREYXRhLnRleHR1cmVzID0gdGV4dHVyZXM7XHJcblx0XHRyZW5kZXJUYXJnZXREYXRhLmRlcHRoVGV4dHVyZSA9IGRlcHRoVGV4dHVyZSB8fCBudWxsO1xyXG5cdFx0cmVuZGVyVGFyZ2V0RGF0YS5kZXB0aCA9IHJlbmRlclRhcmdldC5kZXB0aEJ1ZmZlcjtcclxuXHRcdHJlbmRlclRhcmdldERhdGEuc3RlbmNpbCA9IHJlbmRlclRhcmdldC5zdGVuY2lsQnVmZmVyO1xyXG5cdFx0cmVuZGVyVGFyZ2V0RGF0YS5yZW5kZXJUYXJnZXQgPSByZW5kZXJUYXJnZXQ7XHJcblxyXG5cdFx0aWYgKCByZW5kZXJUYXJnZXREYXRhLnNhbXBsZUNvdW50ICE9PSBzYW1wbGVDb3VudCApIHtcclxuXHJcblx0XHRcdHRleHR1cmVOZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0XHRpZiAoIGRlcHRoVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0ZGVwdGhUZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJlbmRlclRhcmdldERhdGEuc2FtcGxlQ291bnQgPSBzYW1wbGVDb3VudDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly9cclxuXHJcblxyXG5cdFx0Y29uc3Qgb3B0aW9ucyA9IHsgc2FtcGxlQ291bnQgfTtcclxuXHJcblx0XHQvLyBYUiByZW5kZXIgdGFyZ2V0cyByZXF1aXJlIG5vIHRleHR1cmUgdXBkYXRlc1xyXG5cclxuXHRcdGlmICggcmVuZGVyVGFyZ2V0LmlzWFJSZW5kZXJUYXJnZXQgIT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB0ZXh0dXJlcy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHRleHR1cmUgPSB0ZXh0dXJlc1sgaSBdO1xyXG5cclxuXHRcdFx0XHRpZiAoIHRleHR1cmVOZWVkc1VwZGF0ZSApIHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHR0aGlzLnVwZGF0ZVRleHR1cmUoIHRleHR1cmUsIG9wdGlvbnMgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggZGVwdGhUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLnVwZGF0ZVRleHR1cmUoIGRlcHRoVGV4dHVyZSwgb3B0aW9ucyApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBkaXNwb3NlIGhhbmRsZXJcclxuXHJcblx0XHRpZiAoIHJlbmRlclRhcmdldERhdGEuaW5pdGlhbGl6ZWQgIT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRyZW5kZXJUYXJnZXREYXRhLmluaXRpYWxpemVkID0gdHJ1ZTtcclxuXHJcblx0XHRcdC8vIGRpc3Bvc2VcclxuXHJcblx0XHRcdGNvbnN0IG9uRGlzcG9zZSA9ICgpID0+IHtcclxuXHJcblx0XHRcdFx0cmVuZGVyVGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25EaXNwb3NlICk7XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHRleHR1cmVzLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHR0aGlzLl9kZXN0cm95VGV4dHVyZSggdGV4dHVyZXNbIGkgXSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICggZGVwdGhUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0XHRcdHRoaXMuX2Rlc3Ryb3lUZXh0dXJlKCBkZXB0aFRleHR1cmUgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR0aGlzLmRlbGV0ZSggcmVuZGVyVGFyZ2V0ICk7XHJcblxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0cmVuZGVyVGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25EaXNwb3NlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIGdpdmVuIHRleHR1cmUuIERlcGVuZGluZyBvbiB0aGUgdGV4dHVyZSBzdGF0ZSwgdGhpcyBtZXRob2RcclxuXHQgKiB0cmlnZ2VycyB0aGUgdXBsb2FkIG9mIHRleHR1cmUgZGF0YSB0byB0aGUgR1BVIG1lbW9yeS4gSWYgdGhlIHRleHR1cmUgZGF0YSBhcmVcclxuXHQgKiBub3QgeWV0IHJlYWR5IGZvciB0aGUgdXBsb2FkLCBpdCB1c2VzIGRlZmF1bHQgdGV4dHVyZSBkYXRhIGZvciBhcyBhIHBsYWNlaG9sZGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUgdG8gdXBkYXRlLlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gLSBUaGUgb3B0aW9ucy5cclxuXHQgKi9cclxuXHR1cGRhdGVUZXh0dXJlKCB0ZXh0dXJlLCBvcHRpb25zID0ge30gKSB7XHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZURhdGEgPSB0aGlzLmdldCggdGV4dHVyZSApO1xyXG5cdFx0aWYgKCB0ZXh0dXJlRGF0YS5pbml0aWFsaXplZCA9PT0gdHJ1ZSAmJiB0ZXh0dXJlRGF0YS52ZXJzaW9uID09PSB0ZXh0dXJlLnZlcnNpb24gKSByZXR1cm47XHJcblxyXG5cdFx0Y29uc3QgaXNSZW5kZXJUYXJnZXQgPSB0ZXh0dXJlLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSB8fCB0ZXh0dXJlLmlzRGVwdGhUZXh0dXJlIHx8IHRleHR1cmUuaXNGcmFtZWJ1ZmZlclRleHR1cmU7XHJcblx0XHRjb25zdCBiYWNrZW5kID0gdGhpcy5iYWNrZW5kO1xyXG5cclxuXHRcdGlmICggaXNSZW5kZXJUYXJnZXQgJiYgdGV4dHVyZURhdGEuaW5pdGlhbGl6ZWQgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHQvLyBpdCdzIGFuIHVwZGF0ZVxyXG5cclxuXHRcdFx0YmFja2VuZC5kZXN0cm95U2FtcGxlciggdGV4dHVyZSApO1xyXG5cdFx0XHRiYWNrZW5kLmRlc3Ryb3lUZXh0dXJlKCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0aWYgKCB0ZXh0dXJlLmlzRnJhbWVidWZmZXJUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0Y29uc3QgcmVuZGVyVGFyZ2V0ID0gdGhpcy5yZW5kZXJlci5nZXRSZW5kZXJUYXJnZXQoKTtcclxuXHJcblx0XHRcdGlmICggcmVuZGVyVGFyZ2V0ICkge1xyXG5cclxuXHRcdFx0XHR0ZXh0dXJlLnR5cGUgPSByZW5kZXJUYXJnZXQudGV4dHVyZS50eXBlO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0dGV4dHVyZS50eXBlID0gVW5zaWduZWRCeXRlVHlwZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCB7IHdpZHRoLCBoZWlnaHQsIGRlcHRoIH0gPSB0aGlzLmdldFNpemUoIHRleHR1cmUgKTtcclxuXHJcblx0XHRvcHRpb25zLndpZHRoID0gd2lkdGg7XHJcblx0XHRvcHRpb25zLmhlaWdodCA9IGhlaWdodDtcclxuXHRcdG9wdGlvbnMuZGVwdGggPSBkZXB0aDtcclxuXHRcdG9wdGlvbnMubmVlZHNNaXBtYXBzID0gdGhpcy5uZWVkc01pcG1hcHMoIHRleHR1cmUgKTtcclxuXHRcdG9wdGlvbnMubGV2ZWxzID0gb3B0aW9ucy5uZWVkc01pcG1hcHMgPyB0aGlzLmdldE1pcExldmVscyggdGV4dHVyZSwgd2lkdGgsIGhlaWdodCApIDogMTtcclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGlmICggaXNSZW5kZXJUYXJnZXQgfHwgdGV4dHVyZS5pc1N0b3JhZ2VUZXh0dXJlID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0YmFja2VuZC5jcmVhdGVTYW1wbGVyKCB0ZXh0dXJlICk7XHJcblx0XHRcdGJhY2tlbmQuY3JlYXRlVGV4dHVyZSggdGV4dHVyZSwgb3B0aW9ucyApO1xyXG5cclxuXHRcdFx0dGV4dHVyZURhdGEuZ2VuZXJhdGlvbiA9IHRleHR1cmUudmVyc2lvbjtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc3QgbmVlZHNDcmVhdGUgPSB0ZXh0dXJlRGF0YS5pbml0aWFsaXplZCAhPT0gdHJ1ZTtcclxuXHJcblx0XHRcdGlmICggbmVlZHNDcmVhdGUgKSBiYWNrZW5kLmNyZWF0ZVNhbXBsZXIoIHRleHR1cmUgKTtcclxuXHJcblx0XHRcdGlmICggdGV4dHVyZS52ZXJzaW9uID4gMCApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgaW1hZ2UgPSB0ZXh0dXJlLmltYWdlO1xyXG5cclxuXHRcdFx0XHRpZiAoIGltYWdlID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUmVuZGVyZXI6IFRleHR1cmUgbWFya2VkIGZvciB1cGRhdGUgYnV0IGltYWdlIGlzIHVuZGVmaW5lZC4nICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGltYWdlLmNvbXBsZXRlID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5SZW5kZXJlcjogVGV4dHVyZSBtYXJrZWQgZm9yIHVwZGF0ZSBidXQgaW1hZ2UgaXMgaW5jb21wbGV0ZS4nICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCB0ZXh0dXJlLmltYWdlcyApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnN0IGltYWdlcyA9IFtdO1xyXG5cclxuXHRcdFx0XHRcdFx0Zm9yICggY29uc3QgaW1hZ2Ugb2YgdGV4dHVyZS5pbWFnZXMgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGltYWdlcy5wdXNoKCBpbWFnZSApO1xyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0b3B0aW9ucy5pbWFnZXMgPSBpbWFnZXM7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdG9wdGlvbnMuaW1hZ2UgPSBpbWFnZTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aWYgKCB0ZXh0dXJlRGF0YS5pc0RlZmF1bHRUZXh0dXJlID09PSB1bmRlZmluZWQgfHwgdGV4dHVyZURhdGEuaXNEZWZhdWx0VGV4dHVyZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdGJhY2tlbmQuY3JlYXRlVGV4dHVyZSggdGV4dHVyZSwgb3B0aW9ucyApO1xyXG5cclxuXHRcdFx0XHRcdFx0dGV4dHVyZURhdGEuaXNEZWZhdWx0VGV4dHVyZSA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0XHR0ZXh0dXJlRGF0YS5nZW5lcmF0aW9uID0gdGV4dHVyZS52ZXJzaW9uO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRpZiAoIHRleHR1cmUuc291cmNlLmRhdGFSZWFkeSA9PT0gdHJ1ZSApIGJhY2tlbmQudXBkYXRlVGV4dHVyZSggdGV4dHVyZSwgb3B0aW9ucyApO1xyXG5cclxuXHRcdFx0XHRcdGlmICggb3B0aW9ucy5uZWVkc01pcG1hcHMgJiYgdGV4dHVyZS5taXBtYXBzLmxlbmd0aCA9PT0gMCApIGJhY2tlbmQuZ2VuZXJhdGVNaXBtYXBzKCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdC8vIGFzeW5jIHVwZGF0ZVxyXG5cclxuXHRcdFx0XHRiYWNrZW5kLmNyZWF0ZURlZmF1bHRUZXh0dXJlKCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0XHRcdHRleHR1cmVEYXRhLmlzRGVmYXVsdFRleHR1cmUgPSB0cnVlO1xyXG5cdFx0XHRcdHRleHR1cmVEYXRhLmdlbmVyYXRpb24gPSB0ZXh0dXJlLnZlcnNpb247XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGRpc3Bvc2UgaGFuZGxlclxyXG5cclxuXHRcdGlmICggdGV4dHVyZURhdGEuaW5pdGlhbGl6ZWQgIT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHR0ZXh0dXJlRGF0YS5pbml0aWFsaXplZCA9IHRydWU7XHJcblx0XHRcdHRleHR1cmVEYXRhLmdlbmVyYXRpb24gPSB0ZXh0dXJlLnZlcnNpb247XHJcblxyXG5cdFx0XHQvL1xyXG5cclxuXHRcdFx0dGhpcy5pbmZvLm1lbW9yeS50ZXh0dXJlcyArKztcclxuXHJcblx0XHRcdC8vIGRpc3Bvc2VcclxuXHJcblx0XHRcdGNvbnN0IG9uRGlzcG9zZSA9ICgpID0+IHtcclxuXHJcblx0XHRcdFx0dGV4dHVyZS5yZW1vdmVFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uRGlzcG9zZSApO1xyXG5cclxuXHRcdFx0XHR0aGlzLl9kZXN0cm95VGV4dHVyZSggdGV4dHVyZSApO1xyXG5cclxuXHRcdFx0XHR0aGlzLmluZm8ubWVtb3J5LnRleHR1cmVzIC0tO1xyXG5cclxuXHRcdFx0fTtcclxuXHJcblx0XHRcdHRleHR1cmUuYWRkRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvbkRpc3Bvc2UgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHR0ZXh0dXJlRGF0YS52ZXJzaW9uID0gdGV4dHVyZS52ZXJzaW9uO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSBzaXplIG9mIHRoZSBnaXZlbiB0ZXh0dXJlIGFuZCB3cml0ZXMgdGhlIHJlc3VsdFxyXG5cdCAqIGludG8gdGhlIHRhcmdldCB2ZWN0b3IuIFRoaXMgdmVjdG9yIGlzIGFsc28gcmV0dXJuZWQgYnkgdGhlXHJcblx0ICogbWV0aG9kLlxyXG5cdCAqXHJcblx0ICogSWYgbm8gdGV4dHVyZSBkYXRhIGFyZSBhdmFpbGFibGUgZm9yIHRoZSBjb21wdXRlIHlldCwgdGhlIG1ldGhvZFxyXG5cdCAqIHJldHVybnMgZGVmYXVsdCBzaXplIHZhbHVlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlIHRvIGNvbXB1dGUgdGhlIHNpemUgZm9yLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdGFyZ2V0IC0gVGhlIHRhcmdldCB2ZWN0b3IuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gVGhlIHRhcmdldCB2ZWN0b3IuXHJcblx0ICovXHJcblx0Z2V0U2l6ZSggdGV4dHVyZSwgdGFyZ2V0ID0gX3NpemUgKSB7XHJcblxyXG5cdFx0bGV0IGltYWdlID0gdGV4dHVyZS5pbWFnZXMgPyB0ZXh0dXJlLmltYWdlc1sgMCBdIDogdGV4dHVyZS5pbWFnZTtcclxuXHJcblx0XHRpZiAoIGltYWdlICkge1xyXG5cclxuXHRcdFx0aWYgKCBpbWFnZS5pbWFnZSAhPT0gdW5kZWZpbmVkICkgaW1hZ2UgPSBpbWFnZS5pbWFnZTtcclxuXHJcblx0XHRcdHRhcmdldC53aWR0aCA9IGltYWdlLndpZHRoIHx8IDE7XHJcblx0XHRcdHRhcmdldC5oZWlnaHQgPSBpbWFnZS5oZWlnaHQgfHwgMTtcclxuXHRcdFx0dGFyZ2V0LmRlcHRoID0gdGV4dHVyZS5pc0N1YmVUZXh0dXJlID8gNiA6ICggaW1hZ2UuZGVwdGggfHwgMSApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR0YXJnZXQud2lkdGggPSB0YXJnZXQuaGVpZ2h0ID0gdGFyZ2V0LmRlcHRoID0gMTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRhcmdldDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB0aGUgbnVtYmVyIG9mIG1pcG1hcCBsZXZlbHMgZm9yIHRoZSBnaXZlbiB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIHRleHR1cmUncyB3aWR0aC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gVGhlIHRleHR1cmUncyBoZWlnaHQuXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgbnVtYmVyIG9mIG1pcG1hcCBsZXZlbHMuXHJcblx0ICovXHJcblx0Z2V0TWlwTGV2ZWxzKCB0ZXh0dXJlLCB3aWR0aCwgaGVpZ2h0ICkge1xyXG5cclxuXHRcdGxldCBtaXBMZXZlbENvdW50O1xyXG5cclxuXHRcdGlmICggdGV4dHVyZS5pc0NvbXByZXNzZWRUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0aWYgKCB0ZXh0dXJlLm1pcG1hcHMgKSB7XHJcblxyXG5cdFx0XHRcdG1pcExldmVsQ291bnQgPSB0ZXh0dXJlLm1pcG1hcHMubGVuZ3RoO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0bWlwTGV2ZWxDb3VudCA9IDE7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdG1pcExldmVsQ291bnQgPSBNYXRoLmZsb29yKCBNYXRoLmxvZzIoIE1hdGgubWF4KCB3aWR0aCwgaGVpZ2h0ICkgKSApICsgMTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG1pcExldmVsQ291bnQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIHRleHR1cmUgcmVxdWlyZXMgbWlwbWFwcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlLlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgbWlwbWFwcyBhcmUgcmVxdWlyZWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdG5lZWRzTWlwbWFwcyggdGV4dHVyZSApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5pc0Vudmlyb25tZW50VGV4dHVyZSggdGV4dHVyZSApIHx8IHRleHR1cmUuaXNDb21wcmVzc2VkVGV4dHVyZSA9PT0gdHJ1ZSB8fCB0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gdGV4dHVyZSBpcyBhbiBlbnZpcm9ubWVudCBtYXAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZS5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBnaXZlbiB0ZXh0dXJlIGlzIGFuIGVudmlyb25tZW50IG1hcCBvciBub3QuXHJcblx0ICovXHJcblx0aXNFbnZpcm9ubWVudFRleHR1cmUoIHRleHR1cmUgKSB7XHJcblxyXG5cdFx0Y29uc3QgbWFwcGluZyA9IHRleHR1cmUubWFwcGluZztcclxuXHJcblx0XHRyZXR1cm4gKCBtYXBwaW5nID09PSBFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZyB8fCBtYXBwaW5nID09PSBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZyApIHx8ICggbWFwcGluZyA9PT0gQ3ViZVJlZmxlY3Rpb25NYXBwaW5nIHx8IG1hcHBpbmcgPT09IEN1YmVSZWZyYWN0aW9uTWFwcGluZyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZyZWVzIGludGVybmFsIHJlc291cmNlIHdoZW4gdGhlIGdpdmVuIHRleHR1cmUgaXNuJ3RcclxuXHQgKiByZXF1aXJlZCBhbnltb3JlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUgdG8gZGVzdHJveS5cclxuXHQgKi9cclxuXHRfZGVzdHJveVRleHR1cmUoIHRleHR1cmUgKSB7XHJcblxyXG5cdFx0dGhpcy5iYWNrZW5kLmRlc3Ryb3lTYW1wbGVyKCB0ZXh0dXJlICk7XHJcblx0XHR0aGlzLmJhY2tlbmQuZGVzdHJveVRleHR1cmUoIHRleHR1cmUgKTtcclxuXHJcblx0XHR0aGlzLmRlbGV0ZSggdGV4dHVyZSApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBUZXh0dXJlcztcclxuIiwiaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi8uLi9tYXRoL0NvbG9yLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIGZvdXItY29tcG9uZW50IHZlcnNpb24gb2Yge0BsaW5rIENvbG9yfSB3aGljaCBpcyBpbnRlcm5hbGx5XHJcbiAqIHVzZWQgYnkgdGhlIHJlbmRlcmVyIHRvIHJlcHJlc2VudHMgY2xlYXIgY29sb3Igd2l0aCBhbHBoYSBhc1xyXG4gKiBvbmUgb2JqZWN0LlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAYXVnbWVudHMgQ29sb3JcclxuICovXHJcbmNsYXNzIENvbG9yNCBleHRlbmRzIENvbG9yIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBmb3VyLWNvbXBvbmVudCBjb2xvci5cclxuXHQgKiBZb3UgY2FuIGFsc28gcGFzcyBhIHNpbmdsZSBUSFJFRS5Db2xvciwgaGV4IG9yXHJcblx0ICogc3RyaW5nIGFyZ3VtZW50IHRvIHRoaXMgY29uc3RydWN0b3IuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IFtyPTFdIC0gVGhlIHJlZCB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2c9MV0gLSBUaGUgZ3JlZW4gdmFsdWUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtiPTFdIC0gVGhlIGJsdWUgdmFsdWUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFthPTFdIC0gVGhlIGFscGhhIHZhbHVlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCByLCBnLCBiLCBhID0gMSApIHtcclxuXHJcblx0XHRzdXBlciggciwgZywgYiApO1xyXG5cclxuXHRcdHRoaXMuYSA9IGE7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogT3ZlcndyaXRlcyB0aGUgZGVmYXVsdCB0byBob25vciBhbHBoYS5cclxuXHQgKiBZb3UgY2FuIGFsc28gcGFzcyBhIHNpbmdsZSBUSFJFRS5Db2xvciwgaGV4IG9yXHJcblx0ICogc3RyaW5nIGFyZ3VtZW50IHRvIHRoaXMgbWV0aG9kLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfENvbG9yfSByIC0gVGhlIHJlZCB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZyAtIFRoZSBncmVlbiB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYiAtIFRoZSBibHVlIHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbYT0xXSAtIFRoZSBhbHBoYSB2YWx1ZS5cclxuXHQgKiBAcmV0dXJuIHtDb2xvcjR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgb2JqZWN0LlxyXG5cdCAqL1xyXG5cdHNldCggciwgZywgYiwgYSA9IDEgKSB7XHJcblxyXG5cdFx0dGhpcy5hID0gYTtcclxuXHJcblx0XHRyZXR1cm4gc3VwZXIuc2V0KCByLCBnLCBiICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogT3ZlcndyaXRlcyB0aGUgZGVmYXVsdCB0byBob25vciBhbHBoYS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Q29sb3I0fSBjb2xvciAtIFRoZSBjb2xvciB0byBjb3B5LlxyXG5cdCAqIEByZXR1cm4ge0NvbG9yNH0gQSByZWZlcmVuY2UgdG8gdGhpcyBvYmplY3QuXHJcblx0ICovXHJcblx0Y29weSggY29sb3IgKSB7XHJcblxyXG5cdFx0aWYgKCBjb2xvci5hICE9PSB1bmRlZmluZWQgKSB0aGlzLmEgPSBjb2xvci5hO1xyXG5cclxuXHRcdHJldHVybiBzdXBlci5jb3B5KCBjb2xvciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE92ZXJ3cml0ZXMgdGhlIGRlZmF1bHQgdG8gaG9ub3IgYWxwaGEuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtDb2xvcjR9IFRoZSBjbG9uZWQgY29sb3IuXHJcblx0ICovXHJcblx0Y2xvbmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLnIsIHRoaXMuZywgdGhpcy5iLCB0aGlzLmEgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQ29sb3I0O1xyXG4iLCJpbXBvcnQgeyBub2RlT2JqZWN0IH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5pbXBvcnQgUHJvcGVydHlOb2RlIGZyb20gJy4vUHJvcGVydHlOb2RlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBTcGVjaWFsIHZlcnNpb24gb2Yge0BsaW5rIFByb3BlcnR5Tm9kZX0gd2hpY2ggaXMgdXNlZCBmb3IgcGFyYW1ldGVycy5cclxuICpcclxuICogQGF1Z21lbnRzIFByb3BlcnR5Tm9kZVxyXG4gKi9cclxuY2xhc3MgUGFyYW1ldGVyTm9kZSBleHRlbmRzIFByb3BlcnR5Tm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ1BhcmFtZXRlck5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcGFyYW1ldGVyIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbm9kZVR5cGUgLSBUaGUgdHlwZSBvZiB0aGUgbm9kZS5cclxuXHQgKiBAcGFyYW0gez9zdHJpbmd9IFtuYW1lPW51bGxdIC0gVGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciBpbiB0aGUgc2hhZGVyLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBub2RlVHlwZSwgbmFtZSA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5vZGVUeXBlLCBuYW1lICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzUGFyYW1ldGVyTm9kZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0SGFzaCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy51dWlkO1xyXG5cclxuXHR9XHJcblxyXG5cdGdlbmVyYXRlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm5hbWU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFBhcmFtZXRlck5vZGU7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIHBhcmFtZXRlciBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSB0eXBlIG9mIHRoZSBub2RlLlxyXG4gKiBAcGFyYW0gez9zdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIGluIHRoZSBzaGFkZXIuXHJcbiAqIEByZXR1cm5zIHtQYXJhbWV0ZXJOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHBhcmFtZXRlciA9ICggdHlwZSwgbmFtZSApID0+IG5vZGVPYmplY3QoIG5ldyBQYXJhbWV0ZXJOb2RlKCB0eXBlLCBuYW1lICkgKTtcclxuIiwiaW1wb3J0IE5vZGUgZnJvbSAnLi9Ob2RlLmpzJztcclxuaW1wb3J0IHsgc2VsZWN0IH0gZnJvbSAnLi4vbWF0aC9Db25kaXRpb25hbE5vZGUuanMnO1xyXG5pbXBvcnQgeyBTaGFkZXJOb2RlLCBub2RlUHJveHksIGdldEN1cnJlbnRTdGFjaywgc2V0Q3VycmVudFN0YWNrIH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5cclxuLyoqXHJcbiAqIFN0YWNrIGlzIGEgaGVscGVyIGZvciBOb2RlcyB0aGF0IG5lZWQgdG8gcHJvZHVjZSBzdGFjay1iYXNlZCBjb2RlIGluc3RlYWQgb2YgY29udGludW91cyBmbG93LlxyXG4gKiBUaGV5IGFyZSB1c3VhbGx5IG5lZWRlZCBpbiBjYXNlcyBsaWtlIGBJZmAsIGBFbHNlYC5cclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVcclxuICovXHJcbmNsYXNzIFN0YWNrTm9kZSBleHRlbmRzIE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdTdGFja05vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc3RhY2sgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7P1N0YWNrTm9kZX0gW3BhcmVudD1udWxsXSAtIFRoZSBwYXJlbnQgc3RhY2sgbm9kZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcGFyZW50ID0gbnVsbCApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogTGlzdCBvZiBub2Rlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8Tm9kZT59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9kZXMgPSBbXTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBvdXRwdXQgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMub3V0cHV0Tm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcGFyZW50IHN0YWNrIG5vZGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9TdGFja05vZGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucGFyZW50ID0gcGFyZW50O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGN1cnJlbnQgY29uZGl0aW9uYWwgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge0NvbmRpdGlvbmFsTm9kZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fY3VycmVudENvbmQgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1N0YWNrTm9kZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMub3V0cHV0Tm9kZSA/IHRoaXMub3V0cHV0Tm9kZS5nZXROb2RlVHlwZSggYnVpbGRlciApIDogJ3ZvaWQnO1xyXG5cclxuXHR9XHJcblxyXG5cdGdldE1lbWJlclR5cGUoIGJ1aWxkZXIsIG5hbWUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMub3V0cHV0Tm9kZSA/IHRoaXMub3V0cHV0Tm9kZS5nZXRNZW1iZXJUeXBlKCBidWlsZGVyLCBuYW1lICkgOiAndm9pZCc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyBhIG5vZGUgdG8gdGhpcyBzdGFjay5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFRoZSBub2RlIHRvIGFkZC5cclxuXHQgKiBAcmV0dXJuIHtTdGFja05vZGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgc3RhY2sgbm9kZS5cclxuXHQgKi9cclxuXHRhZGQoIG5vZGUgKSB7XHJcblxyXG5cdFx0dGhpcy5ub2Rlcy5wdXNoKCBub2RlICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVwcmVzZW50IGFuIGBpZmAgc3RhdGVtZW50IGluIFRTTC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gYm9vbE5vZGUgLSBSZXByZXNlbnRzIHRoZSBjb25kaXRpb24uXHJcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gbWV0aG9kIC0gVFNMIGNvZGUgd2hpY2ggaXMgZXhlY3V0ZWQgaWYgdGhlIGNvbmRpdGlvbiBldmFsdWF0ZXMgdG8gYHRydWVgLlxyXG5cdCAqIEByZXR1cm4ge1N0YWNrTm9kZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBzdGFjayBub2RlLlxyXG5cdCAqL1xyXG5cdElmKCBib29sTm9kZSwgbWV0aG9kICkge1xyXG5cclxuXHRcdGNvbnN0IG1ldGhvZE5vZGUgPSBuZXcgU2hhZGVyTm9kZSggbWV0aG9kICk7XHJcblx0XHR0aGlzLl9jdXJyZW50Q29uZCA9IHNlbGVjdCggYm9vbE5vZGUsIG1ldGhvZE5vZGUgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5hZGQoIHRoaXMuX2N1cnJlbnRDb25kICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVwcmVzZW50IGFuIGBlbHNlaWZgIHN0YXRlbWVudCBpbiBUU0wuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV9IGJvb2xOb2RlIC0gUmVwcmVzZW50cyB0aGUgY29uZGl0aW9uLlxyXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IG1ldGhvZCAtIFRTTCBjb2RlIHdoaWNoIGlzIGV4ZWN1dGVkIGlmIHRoZSBjb25kaXRpb24gZXZhbHVhdGVzIHRvIGB0cnVlYC5cclxuXHQgKiBAcmV0dXJuIHtTdGFja05vZGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgc3RhY2sgbm9kZS5cclxuXHQgKi9cclxuXHRFbHNlSWYoIGJvb2xOb2RlLCBtZXRob2QgKSB7XHJcblxyXG5cdFx0Y29uc3QgbWV0aG9kTm9kZSA9IG5ldyBTaGFkZXJOb2RlKCBtZXRob2QgKTtcclxuXHRcdGNvbnN0IGlmTm9kZSA9IHNlbGVjdCggYm9vbE5vZGUsIG1ldGhvZE5vZGUgKTtcclxuXHJcblx0XHR0aGlzLl9jdXJyZW50Q29uZC5lbHNlTm9kZSA9IGlmTm9kZTtcclxuXHRcdHRoaXMuX2N1cnJlbnRDb25kID0gaWZOb2RlO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlcHJlc2VudCBhbiBgZWxzZWAgc3RhdGVtZW50IGluIFRTTC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IG1ldGhvZCAtIFRTTCBjb2RlIHdoaWNoIGlzIGV4ZWN1dGVkIGluIHRoZSBgZWxzZWAgY2FzZS5cclxuXHQgKiBAcmV0dXJuIHtTdGFja05vZGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgc3RhY2sgbm9kZS5cclxuXHQgKi9cclxuXHRFbHNlKCBtZXRob2QgKSB7XHJcblxyXG5cdFx0dGhpcy5fY3VycmVudENvbmQuZWxzZU5vZGUgPSBuZXcgU2hhZGVyTm9kZSggbWV0aG9kICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0YnVpbGQoIGJ1aWxkZXIsIC4uLnBhcmFtcyApIHtcclxuXHJcblx0XHRjb25zdCBwcmV2aW91c1N0YWNrID0gZ2V0Q3VycmVudFN0YWNrKCk7XHJcblxyXG5cdFx0c2V0Q3VycmVudFN0YWNrKCB0aGlzICk7XHJcblxyXG5cdFx0Zm9yICggY29uc3Qgbm9kZSBvZiB0aGlzLm5vZGVzICkge1xyXG5cclxuXHRcdFx0bm9kZS5idWlsZCggYnVpbGRlciwgJ3ZvaWQnICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHNldEN1cnJlbnRTdGFjayggcHJldmlvdXNTdGFjayApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm91dHB1dE5vZGUgPyB0aGlzLm91dHB1dE5vZGUuYnVpbGQoIGJ1aWxkZXIsIC4uLnBhcmFtcyApIDogc3VwZXIuYnVpbGQoIGJ1aWxkZXIsIC4uLnBhcmFtcyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vIERlcHJlY2F0ZWRcclxuXHJcblx0LyoqXHJcblx0ICogQGZ1bmN0aW9uXHJcblx0ICogQGRlcHJlY2F0ZWQgc2luY2UgcjE2OC4gVXNlIHtAbGluayBTdGFja05vZGUjRWxzZX0gaW5zdGVhZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Li4uYW55fSBwYXJhbXNcclxuXHQgKiBAcmV0dXJucyB7U3RhY2tOb2RlfVxyXG5cdCAqL1xyXG5cdGVsc2UoIC4uLnBhcmFtcyApIHsgLy8gQGRlcHJlY2F0ZWQsIHIxNjhcclxuXHJcblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5UU0w6IC5lbHNlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuRWxzZSgpLicgKTtcclxuXHRcdHJldHVybiB0aGlzLkVsc2UoIC4uLnBhcmFtcyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEBkZXByZWNhdGVkIHNpbmNlIHIxNjguIFVzZSB7QGxpbmsgU3RhY2tOb2RlI0Vsc2VJZn0gaW5zdGVhZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Li4uYW55fSBwYXJhbXNcclxuXHQgKiBAcmV0dXJucyB7U3RhY2tOb2RlfVxyXG5cdCAqL1xyXG5cdGVsc2VpZiggLi4ucGFyYW1zICkgeyAvLyBAZGVwcmVjYXRlZCwgcjE2OFxyXG5cclxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlRTTDogLmVsc2VpZigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLkVsc2VJZigpLicgKTtcclxuXHRcdHJldHVybiB0aGlzLkVsc2VJZiggLi4ucGFyYW1zICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFN0YWNrTm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgc3RhY2sgbm9kZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHs/U3RhY2tOb2RlfSBbcGFyZW50PW51bGxdIC0gVGhlIHBhcmVudCBzdGFjayBub2RlLlxyXG4gKiBAcmV0dXJucyB7U3RhY2tOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHN0YWNrID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIFN0YWNrTm9kZSApLnNldFBhcmFtZXRlckxlbmd0aCggMCwgMSApO1xyXG4iLCJcclxuaW1wb3J0IE5vZGUgZnJvbSAnLi9Ob2RlLmpzJztcclxuaW1wb3J0IHsgZ2V0TGVuZ3RoRnJvbVR5cGUgfSBmcm9tICcuL05vZGVVdGlscy5qcyc7XHJcblxyXG4vKipcclxuICogR2VuZXJhdGVzIGEgbGF5b3V0IGZvciBzdHJ1Y3QgbWVtYmVycy5cclxuICogVGhpcyBmdW5jdGlvbiB0YWtlcyBhbiBvYmplY3QgcmVwcmVzZW50aW5nIHN0cnVjdCBtZW1iZXJzIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIG1lbWJlciBsYXlvdXRzLlxyXG4gKiBFYWNoIG1lbWJlciBsYXlvdXQgaW5jbHVkZXMgdGhlIG1lbWJlcidzIG5hbWUsIHR5cGUsIGFuZCB3aGV0aGVyIGl0IGlzIGF0b21pYy5cclxuICpcclxuICogQHBhcmFtIHtPYmplY3QuPHN0cmluZywgc3RyaW5nfE9iamVjdD59IG1lbWJlcnMgLSBBbiBvYmplY3Qgd2hlcmUga2V5cyBhcmUgbWVtYmVyIG5hbWVzIGFuZCB2YWx1ZXMgYXJlIGVpdGhlciB0eXBlcyAoYXMgc3RyaW5ncykgb3Igb2JqZWN0cyB3aXRoIHR5cGUgYW5kIGF0b21pYyBwcm9wZXJ0aWVzLlxyXG4gKiBAcmV0dXJucyB7QXJyYXkuPHtuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZywgYXRvbWljOiBib29sZWFufT59IEFuIGFycmF5IG9mIG1lbWJlciBsYXlvdXRzLlxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0TWVtYmVyc0xheW91dCggbWVtYmVycyApIHtcclxuXHJcblx0cmV0dXJuIE9iamVjdC5lbnRyaWVzKCBtZW1iZXJzICkubWFwKCAoIFsgbmFtZSwgdmFsdWUgXSApID0+IHtcclxuXHJcblx0XHRpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4geyBuYW1lLCB0eXBlOiB2YWx1ZSwgYXRvbWljOiBmYWxzZSB9O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4geyBuYW1lLCB0eXBlOiB2YWx1ZS50eXBlLCBhdG9taWM6IHZhbHVlLmF0b21pYyB8fCBmYWxzZSB9O1xyXG5cclxuXHR9ICk7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyBhIHN0cnVjdCB0eXBlIG5vZGUgaW4gdGhlIG5vZGUtYmFzZWQgc3lzdGVtLlxyXG4gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gZGVmaW5lIGFuZCBtYW5hZ2UgdGhlIGxheW91dCBhbmQgdHlwZXMgb2Ygc3RydWN0IG1lbWJlcnMuXHJcbiAqIEl0IGV4dGVuZHMgdGhlIGJhc2UgTm9kZSBjbGFzcyBhbmQgcHJvdmlkZXMgbWV0aG9kcyB0byBnZXQgdGhlIGxlbmd0aCBvZiB0aGUgc3RydWN0LFxyXG4gKiByZXRyaWV2ZSBtZW1iZXIgdHlwZXMsIGFuZCBnZW5lcmF0ZSB0aGUgc3RydWN0IHR5cGUgZm9yIGEgYnVpbGRlci5cclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVcclxuICovXHJcbmNsYXNzIFN0cnVjdFR5cGVOb2RlIGV4dGVuZHMgTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ1N0cnVjdFR5cGVOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFN0cnVjdFR5cGVOb2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IG1lbWJlcnNMYXlvdXQgLSBUaGUgbGF5b3V0IG9mIHRoZSBtZW1iZXJzIGZvciB0aGUgc3RydWN0LlxyXG5cdCAqIEBwYXJhbSB7P3N0cmluZ30gW25hbWU9bnVsbF0gLSBUaGUgb3B0aW9uYWwgbmFtZSBvZiB0aGUgc3RydWN0LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBtZW1iZXJzTGF5b3V0LCBuYW1lID0gbnVsbCApIHtcclxuXHJcblx0XHRzdXBlciggJ3N0cnVjdCcgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBsYXlvdXQgb2YgdGhlIG1lbWJlcnMgZm9yIHRoZSBzdHJ1Y3RcclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXkuPHtuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZywgYXRvbWljOiBib29sZWFufT59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWVtYmVyc0xheW91dCA9IGdldE1lbWJlcnNMYXlvdXQoIG1lbWJlcnNMYXlvdXQgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBuYW1lIG9mIHRoZSBzdHJ1Y3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9zdHJpbmd9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubmFtZSA9IG5hbWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzU3RydWN0TGF5b3V0Tm9kZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJ1Y3QuXHJcblx0ICogVGhlIGxlbmd0aCBpcyBjYWxjdWxhdGVkIGJ5IHN1bW1pbmcgdGhlIGxlbmd0aHMgb2YgdGhlIHN0cnVjdCdzIG1lbWJlcnMuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgbGVuZ3RoIG9mIHRoZSBzdHJ1Y3QuXHJcblx0ICovXHJcblx0Z2V0TGVuZ3RoKCkge1xyXG5cclxuXHRcdGxldCBsZW5ndGggPSAwO1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IG1lbWJlciBvZiB0aGlzLm1lbWJlcnNMYXlvdXQgKSB7XHJcblxyXG5cdFx0XHRsZW5ndGggKz0gZ2V0TGVuZ3RoRnJvbVR5cGUoIG1lbWJlci50eXBlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBsZW5ndGg7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0TWVtYmVyVHlwZSggYnVpbGRlciwgbmFtZSApIHtcclxuXHJcblx0XHRjb25zdCBtZW1iZXIgPSB0aGlzLm1lbWJlcnNMYXlvdXQuZmluZCggbSA9PiBtLm5hbWUgPT09IG5hbWUgKTtcclxuXHJcblx0XHRyZXR1cm4gbWVtYmVyID8gbWVtYmVyLnR5cGUgOiAndm9pZCc7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3Qgc3RydWN0VHlwZSA9IGJ1aWxkZXIuZ2V0U3RydWN0VHlwZUZyb21Ob2RlKCB0aGlzLCB0aGlzLm1lbWJlcnNMYXlvdXQsIHRoaXMubmFtZSApO1xyXG5cclxuXHRcdHJldHVybiBzdHJ1Y3RUeXBlLm5hbWU7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXAoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0YnVpbGRlci5hZGRJbmNsdWRlKCB0aGlzICk7XHJcblxyXG5cdH1cclxuXHJcblx0Z2VuZXJhdGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgU3RydWN0VHlwZU5vZGU7XHJcbiIsImltcG9ydCBOb2RlIGZyb20gJy4vTm9kZS5qcyc7XHJcbmltcG9ydCBTdHJ1Y3RUeXBlTm9kZSBmcm9tICcuL1N0cnVjdFR5cGVOb2RlLmpzJztcclxuaW1wb3J0IHsgbm9kZU9iamVjdCB9IGZyb20gJy4uL3RzbC9UU0xDb3JlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBTdHJ1Y3ROb2RlIGFsbG93cyB0byBjcmVhdGUgY3VzdG9tIHN0cnVjdHVyZXMgd2l0aCBtdWx0aXBsZSBtZW1iZXJzLlxyXG4gKiBUaGlzIGNhbiBhbHNvIGJlIHVzZWQgdG8gZGVmaW5lIHN0cnVjdHVyZXMgaW4gYXR0cmlidXRlIGFuZCB1bmlmb3JtIGRhdGEuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIC8vIERlZmluZSBhIGN1c3RvbSBzdHJ1Y3RcclxuICogY29uc3QgQm91bmRpbmdCb3ggPSBzdHJ1Y3QoIHsgbWluOiAndmVjMycsIG1heDogJ3ZlYzMnIH0gKTtcclxuICpcclxuICogLy8gQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzdHJ1Y3RcclxuICogY29uc3QgYmIgPSBCb3VuZGluZ0JveCggdmVjMyggMCApLCB2ZWMzKCAxICkgKTsgLy8gc3R5bGUgMVxyXG4gKiBjb25zdCBiYiA9IEJvdW5kaW5nQm94KCB7IG1pbjogdmVjMyggMCApLCBtYXg6IHZlYzMoIDEgKSB9ICk7IC8vIHN0eWxlIDJcclxuICpcclxuICogLy8gQWNjZXNzIHRoZSBzdHJ1Y3QgbWVtYmVyc1xyXG4gKiBjb25zdCBtaW4gPSBiYi5nZXQoICdtaW4nICk7XHJcbiAqXHJcbiAqIC8vIEFzc2lnbiBhIG5ldyB2YWx1ZSB0byBhIG1lbWJlclxyXG4gKiBtaW4uYXNzaWduKCB2ZWMzKCkgKTtcclxuICogYGBgXHJcbiAqIEBhdWdtZW50cyBOb2RlXHJcbiAqL1xyXG5jbGFzcyBTdHJ1Y3ROb2RlIGV4dGVuZHMgTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ1N0cnVjdE5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvbnN0cnVjdG9yKCBzdHJ1Y3RMYXlvdXROb2RlLCB2YWx1ZXMgKSB7XHJcblxyXG5cdFx0c3VwZXIoICd2ZWMzJyApO1xyXG5cclxuXHRcdHRoaXMuc3RydWN0TGF5b3V0Tm9kZSA9IHN0cnVjdExheW91dE5vZGU7XHJcblx0XHR0aGlzLnZhbHVlcyA9IHZhbHVlcztcclxuXHJcblx0XHR0aGlzLmlzU3RydWN0Tm9kZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuc3RydWN0TGF5b3V0Tm9kZS5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdGdldE1lbWJlclR5cGUoIGJ1aWxkZXIsIG5hbWUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuc3RydWN0TGF5b3V0Tm9kZS5nZXRNZW1iZXJUeXBlKCBidWlsZGVyLCBuYW1lICk7XHJcblxyXG5cdH1cclxuXHJcblx0Z2VuZXJhdGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3Qgbm9kZVZhciA9IGJ1aWxkZXIuZ2V0VmFyRnJvbU5vZGUoIHRoaXMgKTtcclxuXHRcdGNvbnN0IHN0cnVjdFR5cGUgPSBub2RlVmFyLnR5cGU7XHJcblx0XHRjb25zdCBwcm9wZXJ0eU5hbWUgPSBidWlsZGVyLmdldFByb3BlcnR5TmFtZSggbm9kZVZhciApO1xyXG5cclxuXHRcdGJ1aWxkZXIuYWRkTGluZUZsb3dDb2RlKCBgJHsgcHJvcGVydHlOYW1lIH0gPSAkeyBidWlsZGVyLmdlbmVyYXRlU3RydWN0KCBzdHJ1Y3RUeXBlLCB0aGlzLnN0cnVjdExheW91dE5vZGUubWVtYmVyc0xheW91dCwgdGhpcy52YWx1ZXMgKSB9YCwgdGhpcyApO1xyXG5cclxuXHRcdHJldHVybiBub2RlVmFyLm5hbWU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFN0cnVjdE5vZGU7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIHN0cnVjdCBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge09iamVjdH0gbWVtYmVyc0xheW91dCAtIFRoZSBsYXlvdXQgb2YgdGhlIHN0cnVjdCBtZW1iZXJzLlxyXG4gKiBAcGFyYW0gez9zdHJpbmd9IFtuYW1lPW51bGxdIC0gVGhlIG5hbWUgb2YgdGhlIHN0cnVjdC5cclxuICogQHJldHVybnMge0Z1bmN0aW9ufSBUaGUgc3RydWN0IGZ1bmN0aW9uLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHN0cnVjdCA9ICggbWVtYmVyc0xheW91dCwgbmFtZSA9IG51bGwgKSA9PiB7XHJcblxyXG5cdGNvbnN0IHN0cnVjdExheW91dCA9IG5ldyBTdHJ1Y3RUeXBlTm9kZSggbWVtYmVyc0xheW91dCwgbmFtZSApO1xyXG5cclxuXHRjb25zdCBzdHJ1Y3QgPSAoIC4uLnBhcmFtcyApID0+IHtcclxuXHJcblx0XHRsZXQgdmFsdWVzID0gbnVsbDtcclxuXHJcblx0XHRpZiAoIHBhcmFtcy5sZW5ndGggPiAwICkge1xyXG5cclxuXHRcdFx0aWYgKCBwYXJhbXNbIDAgXS5pc05vZGUgKSB7XHJcblxyXG5cdFx0XHRcdHZhbHVlcyA9IHt9O1xyXG5cclxuXHRcdFx0XHRjb25zdCBuYW1lcyA9IE9iamVjdC5rZXlzKCBtZW1iZXJzTGF5b3V0ICk7XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0dmFsdWVzWyBuYW1lc1sgaSBdIF0gPSBwYXJhbXNbIGkgXTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0dmFsdWVzID0gcGFyYW1zWyAwIF07XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBub2RlT2JqZWN0KCBuZXcgU3RydWN0Tm9kZSggc3RydWN0TGF5b3V0LCB2YWx1ZXMgKSApO1xyXG5cclxuXHR9O1xyXG5cclxuXHRzdHJ1Y3QubGF5b3V0ID0gc3RydWN0TGF5b3V0O1xyXG5cdHN0cnVjdC5pc1N0cnVjdCA9IHRydWU7XHJcblxyXG5cdHJldHVybiBzdHJ1Y3Q7XHJcblxyXG59O1xyXG4iLCJpbXBvcnQgTm9kZSBmcm9tICcuL05vZGUuanMnO1xyXG5pbXBvcnQgeyBub2RlUHJveHkgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBub2RlIGNhbiBiZSB1c2VkIHRvIGRlZmluZSBtdWx0aXBsZSBvdXRwdXRzIGluIGEgc2hhZGVyIHByb2dyYW1zLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTm9kZVxyXG4gKi9cclxuY2xhc3MgT3V0cHV0U3RydWN0Tm9kZSBleHRlbmRzIE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdPdXRwdXRTdHJ1Y3ROb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG91dHB1dCBzdHJ1Y3Qgbm9kZS4gVGhlIGNvbnN0cnVjdG9yIGNhbiBiZSBpbnZva2VkIHdpdGggYW5cclxuXHQgKiBhcmJpdHJhcnkgbnVtYmVyIG9mIG5vZGVzIHJlcHJlc2VudGluZyB0aGUgbWVtYmVycy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Li4uTm9kZX0gbWVtYmVycyAtIEEgcGFyYW1ldGVyIGxpc3Qgb2Ygbm9kZXMuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIC4uLm1lbWJlcnMgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIGFycmF5IG9mIG5vZGVzIHdoaWNoIGRlZmluZXMgdGhlIG91dHB1dC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8Tm9kZT59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWVtYmVycyA9IG1lbWJlcnM7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzT3V0cHV0U3RydWN0Tm9kZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgcHJvcGVydGllcyA9IGJ1aWxkZXIuZ2V0Tm9kZVByb3BlcnRpZXMoIHRoaXMgKTtcclxuXHJcblx0XHRpZiAoIHByb3BlcnRpZXMubWVtYmVyc0xheW91dCA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Y29uc3QgbWVtYmVycyA9IHRoaXMubWVtYmVycztcclxuXHRcdFx0Y29uc3QgbWVtYmVyc0xheW91dCA9IFtdO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IG5hbWUgPSAnbScgKyBpO1xyXG5cdFx0XHRcdGNvbnN0IHR5cGUgPSBtZW1iZXJzWyBpIF0uZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRcdFx0bWVtYmVyc0xheW91dC5wdXNoKCB7IG5hbWUsIHR5cGUsIGluZGV4OiBpIH0gKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHByb3BlcnRpZXMubWVtYmVyc0xheW91dCA9IG1lbWJlcnNMYXlvdXQ7XHJcblx0XHRcdHByb3BlcnRpZXMuc3RydWN0VHlwZSA9IGJ1aWxkZXIuZ2V0T3V0cHV0U3RydWN0VHlwZUZyb21Ob2RlKCB0aGlzLCBwcm9wZXJ0aWVzLm1lbWJlcnNMYXlvdXQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHByb3BlcnRpZXMuc3RydWN0VHlwZS5uYW1lO1xyXG5cclxuXHR9XHJcblxyXG5cdGdlbmVyYXRlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IHByb3BlcnR5TmFtZSA9IGJ1aWxkZXIuZ2V0T3V0cHV0U3RydWN0TmFtZSgpO1xyXG5cdFx0Y29uc3QgbWVtYmVycyA9IHRoaXMubWVtYmVycztcclxuXHJcblx0XHRjb25zdCBzdHJ1Y3RQcmVmaXggPSBwcm9wZXJ0eU5hbWUgIT09ICcnID8gcHJvcGVydHlOYW1lICsgJy4nIDogJyc7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBzbmlwcGV0ID0gbWVtYmVyc1sgaSBdLmJ1aWxkKCBidWlsZGVyICk7XHJcblxyXG5cdFx0XHRidWlsZGVyLmFkZExpbmVGbG93Q29kZSggYCR7IHN0cnVjdFByZWZpeCB9bSR7IGkgfSA9ICR7IHNuaXBwZXQgfWAsIHRoaXMgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHByb3BlcnR5TmFtZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgT3V0cHV0U3RydWN0Tm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGFuIG91dHB1dCBzdHJ1Y3Qgbm9kZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHsuLi5Ob2RlfSBtZW1iZXJzIC0gQSBwYXJhbWV0ZXIgbGlzdCBvZiBub2Rlcy5cclxuICogQHJldHVybnMge091dHB1dFN0cnVjdE5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgb3V0cHV0U3RydWN0ID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE91dHB1dFN0cnVjdE5vZGUgKTtcclxuIiwiaW1wb3J0IE91dHB1dFN0cnVjdE5vZGUgZnJvbSAnLi9PdXRwdXRTdHJ1Y3ROb2RlLmpzJztcclxuaW1wb3J0IHsgbm9kZVByb3h5LCB2ZWM0IH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIE1SVCB0ZXh0dXJlIGluZGV4IGZvciB0aGUgZ2l2ZW4gbmFtZS5cclxuICpcclxuICogQHBhcmFtIHtBcnJheTxUZXh0dXJlPn0gdGV4dHVyZXMgLSBUaGUgdGV4dHVyZXMgb2YgYSBNUlQtY29uZmlndXJlZCByZW5kZXIgdGFyZ2V0LlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBNUlQgdGV4dHVyZSB3aGljaCBpbmRleCBpcyByZXF1ZXN0ZWQuXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIHRleHR1cmUgaW5kZXguXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGV4dHVyZUluZGV4KCB0ZXh0dXJlcywgbmFtZSApIHtcclxuXHJcblx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdGV4dHVyZXMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdGlmICggdGV4dHVyZXNbIGkgXS5uYW1lID09PSBuYW1lICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIGk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiAtIDE7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogVGhpcyBub2RlIGNhbiBiZSB1c2VkIHNldHVwIGEgTVJUIGNvbnRleHQgZm9yIHJlbmRlcmluZy4gQSB0eXBpY2FsIE1SVCBzZXR1cCBmb3JcclxuICogcG9zdC1wcm9jZXNzaW5nIGlzIHNob3duIGJlbG93OlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBtcnROb2RlID0gbXJ0KCB7XHJcbiAqICAgb3V0cHV0OiBvdXRwdXQsXHJcbiAqICAgbm9ybWFsOiBub3JtYWxWaWV3XHJcbiAqIH0gKSApO1xyXG4gKiBgYGBcclxuICogVGhlIE1SVCBvdXRwdXQgaXMgZGVmaW5lZCBhcyBhIGRpY3Rpb25hcnkuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBPdXRwdXRTdHJ1Y3ROb2RlXHJcbiAqL1xyXG5jbGFzcyBNUlROb2RlIGV4dGVuZHMgT3V0cHV0U3RydWN0Tm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ01SVE5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgb3V0cHV0IHN0cnVjdCBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3Q8c3RyaW5nLCBOb2RlPn0gb3V0cHV0Tm9kZXMgLSBUaGUgTVJUIG91dHB1dHMuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG91dHB1dE5vZGVzICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGRpY3Rpb25hcnkgcmVwcmVzZW50aW5nIHRoZSBNUlQgb3V0cHV0cy4gVGhlIGtleVxyXG5cdFx0ICogaXMgdGhlIG5hbWUgb2YgdGhlIG91dHB1dCwgdGhlIHZhbHVlIHRoZSBub2RlIHdoaWNoIHByb2R1Y2VzXHJcblx0XHQgKiB0aGUgb3V0cHV0IHJlc3VsdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0PHN0cmluZywgTm9kZT59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMub3V0cHV0Tm9kZXMgPSBvdXRwdXROb2RlcztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNNUlROb2RlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgTVJUIG5vZGUgaGFzIGFuIG91dHB1dCB3aXRoIHRoZSBnaXZlbiBuYW1lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgb3V0cHV0LlxyXG5cdCAqIEByZXR1cm4ge05vZGVCdWlsZGVyfSBXaGV0aGVyIHRoZSBNUlQgbm9kZSBoYXMgYW4gb3V0cHV0IGZvciB0aGUgZ2l2ZW4gbmFtZSBvciBub3QuXHJcblx0ICovXHJcblx0aGFzKCBuYW1lICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm91dHB1dE5vZGVzWyBuYW1lIF0gIT09IHVuZGVmaW5lZDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBvdXRwdXQgbm9kZSBmb3IgdGhlIGdpdmVuIG5hbWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBvdXRwdXQuXHJcblx0ICogQHJldHVybiB7Tm9kZX0gVGhlIG91dHB1dCBub2RlLlxyXG5cdCAqL1xyXG5cdGdldCggbmFtZSApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5vdXRwdXROb2Rlc1sgbmFtZSBdO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE1lcmdlcyB0aGUgb3V0cHV0cyBvZiB0aGUgZ2l2ZW4gTVJUIG5vZGUgd2l0aCB0aGUgb3V0cHV0cyBvZiB0aGlzIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01SVE5vZGV9IG1ydE5vZGUgLSBUaGUgTVJUIHRvIG1lcmdlLlxyXG5cdCAqIEByZXR1cm4ge01SVE5vZGV9IEEgbmV3IE1SVCBub2RlIHdpdGggbWVyZ2VkIG91dHB1dHMuLlxyXG5cdCAqL1xyXG5cdG1lcmdlKCBtcnROb2RlICkge1xyXG5cclxuXHRcdGNvbnN0IG91dHB1dHMgPSB7IC4uLnRoaXMub3V0cHV0Tm9kZXMsIC4uLm1ydE5vZGUub3V0cHV0Tm9kZXMgfTtcclxuXHJcblx0XHRyZXR1cm4gbXJ0KCBvdXRwdXRzICk7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXAoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3Qgb3V0cHV0Tm9kZXMgPSB0aGlzLm91dHB1dE5vZGVzO1xyXG5cdFx0Y29uc3QgbXJ0ID0gYnVpbGRlci5yZW5kZXJlci5nZXRSZW5kZXJUYXJnZXQoKTtcclxuXHJcblx0XHRjb25zdCBtZW1iZXJzID0gW107XHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZXMgPSBtcnQudGV4dHVyZXM7XHJcblxyXG5cdFx0Zm9yICggY29uc3QgbmFtZSBpbiBvdXRwdXROb2RlcyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGluZGV4ID0gZ2V0VGV4dHVyZUluZGV4KCB0ZXh0dXJlcywgbmFtZSApO1xyXG5cclxuXHRcdFx0bWVtYmVyc1sgaW5kZXggXSA9IHZlYzQoIG91dHB1dE5vZGVzWyBuYW1lIF0gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5tZW1iZXJzID0gbWVtYmVycztcclxuXHJcblx0XHRyZXR1cm4gc3VwZXIuc2V0dXAoIGJ1aWxkZXIgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTVJUTm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgTVJUIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7T2JqZWN0PHN0cmluZywgTm9kZT59IG91dHB1dE5vZGVzIC0gVGhlIE1SVCBvdXRwdXRzLlxyXG4gKiBAcmV0dXJucyB7TVJUTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBtcnQgPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggTVJUTm9kZSApO1xyXG4iLCJpbXBvcnQgeyBGbiB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBHZW5lcmF0ZXMgYSBoYXNoIHZhbHVlIGluIHRoZSByYW5nZSBgWzAsIDFdYCBmcm9tIHRoZSBnaXZlbiBzZWVkLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSBzZWVkIC0gVGhlIHNlZWQuXHJcbiAqIEByZXR1cm4ge05vZGU8ZmxvYXQ+fSBUaGUgaGFzaCB2YWx1ZS5cclxuICovXHJcbmV4cG9ydCBjb25zdCBoYXNoID0gLypAX19QVVJFX18qLyBGbiggKCBbIHNlZWQgXSApID0+IHtcclxuXHJcblx0Ly8gVGFrZW4gZnJvbSBodHRwczovL3d3dy5zaGFkZXJ0b3kuY29tL3ZpZXcvWGxHY1JoLCBvcmlnaW5hbGx5IGZyb20gcGNnLXJhbmRvbS5vcmdcclxuXHJcblx0Y29uc3Qgc3RhdGUgPSBzZWVkLnRvVWludCgpLm11bCggNzQ3Nzk2NDA1ICkuYWRkKCAyODkxMzM2NDUzICk7XHJcblx0Y29uc3Qgd29yZCA9IHN0YXRlLnNoaWZ0UmlnaHQoIHN0YXRlLnNoaWZ0UmlnaHQoIDI4ICkuYWRkKCA0ICkgKS5iaXRYb3IoIHN0YXRlICkubXVsKCAyNzc4MDM3MzcgKTtcclxuXHRjb25zdCByZXN1bHQgPSB3b3JkLnNoaWZ0UmlnaHQoIDIyICkuYml0WG9yKCB3b3JkICk7XHJcblxyXG5cdHJldHVybiByZXN1bHQudG9GbG9hdCgpLm11bCggMSAvIDIgKiogMzIgKTsgLy8gQ29udmVydCB0byByYW5nZSBbMCwgMSlcclxuXHJcbn0gKTtcclxuIiwiaW1wb3J0IHsgc3ViLCBtdWwsIGRpdiwgYWRkIH0gZnJvbSAnLi9PcGVyYXRvck5vZGUuanMnO1xyXG5pbXBvcnQgeyBQSSwgcG93LCBzaW4gfSBmcm9tICcuL01hdGhOb2RlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIGZ1bmN0aW9uIHRoYXQgcmVtYXBzIHRoZSBgWzAsMV1gIGludGVydmFsIGludG8gdGhlIGBbMCwxXWAgaW50ZXJ2YWwuXHJcbiAqIFRoZSBjb3JuZXJzIGFyZSBtYXBwZWQgdG8gYDBgIGFuZCB0aGUgY2VudGVyIHRvIGAxYC5cclxuICogUmVmZXJlbmNlOiB7QGxpbmsgaHR0cHM6Ly9pcXVpbGV6bGVzLm9yZy9hcnRpY2xlcy9mdW5jdGlvbnMvfS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlPGZsb2F0Pn0geCAtIFRoZSB2YWx1ZSB0byByZW1hcC5cclxuICogQHBhcmFtIHtOb2RlPGZsb2F0Pn0gayAtIEFsbG93cyB0byBjb250cm9sIHRoZSByZW1hcHBpbmcgZnVuY3Rpb25zIHNoYXBlIGJ5IHJpc2luZyB0aGUgcGFyYWJvbGEgdG8gYSBwb3dlciBga2AuXHJcbiAqIEByZXR1cm4ge05vZGU8ZmxvYXQ+fSBUaGUgcmVtYXBwZWQgdmFsdWUuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcGFyYWJvbGEgPSAoIHgsIGsgKSA9PiBwb3coIG11bCggNC4wLCB4Lm11bCggc3ViKCAxLjAsIHggKSApICksIGsgKTtcclxuXHJcbi8qKlxyXG4gKiBBIGZ1bmN0aW9uIHRoYXQgcmVtYXBzIHRoZSBgWzAsMV1gIGludGVydmFsIGludG8gdGhlIGBbMCwxXWAgaW50ZXJ2YWwuXHJcbiAqIEV4cGFuZHMgdGhlIHNpZGVzIGFuZCBjb21wcmVzc2VzIHRoZSBjZW50ZXIsIGFuZCBrZWVwcyBgMC41YCBtYXBwZWQgdG8gYDAuNWAuXHJcbiAqIFJlZmVyZW5jZToge0BsaW5rIGh0dHBzOi8vaXF1aWxlemxlcy5vcmcvYXJ0aWNsZXMvZnVuY3Rpb25zL30uXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTxmbG9hdD59IHggLSBUaGUgdmFsdWUgdG8gcmVtYXAuXHJcbiAqIEBwYXJhbSB7Tm9kZTxmbG9hdD59IGsgLSBgaz0xYCBpcyB0aGUgaWRlbnRpdHkgY3VydmUsYGs8MWAgcHJvZHVjZXMgdGhlIGNsYXNzaWMgYGdhaW4oKWAgc2hhcGUsIGFuZCBgaz4xYCBwcm9kdWNlcyBcInNcIiBzaGFwZWQgY3VydmVzLlxyXG4gKiBAcmV0dXJuIHtOb2RlPGZsb2F0Pn0gVGhlIHJlbWFwcGVkIHZhbHVlLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGdhaW4gPSAoIHgsIGsgKSA9PiB4Lmxlc3NUaGFuKCAwLjUgKSA/IHBhcmFib2xhKCB4Lm11bCggMi4wICksIGsgKS5kaXYoIDIuMCApIDogc3ViKCAxLjAsIHBhcmFib2xhKCBtdWwoIHN1YiggMS4wLCB4ICksIDIuMCApLCBrICkuZGl2KCAyLjAgKSApO1xyXG5cclxuLyoqXHJcbiAqIEEgZnVuY3Rpb24gdGhhdCByZW1hcHMgdGhlIGBbMCwxXWAgaW50ZXJ2YWwgaW50byB0aGUgYFswLDFdYCBpbnRlcnZhbC5cclxuICogQSBnZW5lcmFsaXphdGlvbiBvZiB0aGUgYHBhcmFib2xhKClgLiBLZWVwcyB0aGUgY29ybmVycyBtYXBwZWQgdG8gMCBidXQgYWxsb3dzIHRoZSBjb250cm9sIG9mIHRoZSBzaGFwZSBvbmUgZWl0aGVyIHNpZGUgb2YgdGhlIGN1cnZlLlxyXG4gKiBSZWZlcmVuY2U6IHtAbGluayBodHRwczovL2lxdWlsZXpsZXMub3JnL2FydGljbGVzL2Z1bmN0aW9ucy99LlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSB4IC0gVGhlIHZhbHVlIHRvIHJlbWFwLlxyXG4gKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSBhIC0gRmlyc3QgY29udHJvbCBwYXJhbWV0ZXIuXHJcbiAqIEBwYXJhbSB7Tm9kZTxmbG9hdD59IGIgLSBTZWNvbmQgY29udHJvbCBwYXJhbWV0ZXIuXHJcbiAqIEByZXR1cm4ge05vZGU8ZmxvYXQ+fSBUaGUgcmVtYXBwZWQgdmFsdWUuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcGN1cnZlID0gKCB4LCBhLCBiICkgPT4gcG93KCBkaXYoIHBvdyggeCwgYSApLCBhZGQoIHBvdyggeCwgYSApLCBwb3coIHN1YiggMS4wLCB4ICksIGIgKSApICksIDEuMCAvIGEgKTtcclxuXHJcbi8qKlxyXG4gKiBBIHBoYXNlIHNoaWZ0ZWQgc2ludXMgY3VydmUgdGhhdCBzdGFydHMgYXQgemVybyBhbmQgZW5kcyBhdCB6ZXJvLCB3aXRoIGJvdW5jaW5nIGJlaGF2aW9yLlxyXG4gKiBSZWZlcmVuY2U6IHtAbGluayBodHRwczovL2lxdWlsZXpsZXMub3JnL2FydGljbGVzL2Z1bmN0aW9ucy99LlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSB4IC0gVGhlIHZhbHVlIHRvIGNvbXB1dGUgdGhlIHNpbiBmb3IuXHJcbiAqIEBwYXJhbSB7Tm9kZTxmbG9hdD59IGsgLSBDb250cm9scyB0aGUgYW1vdW50IG9mIGJvdW5jZXMuXHJcbiAqIEByZXR1cm4ge05vZGU8ZmxvYXQ+fSBUaGUgcmVzdWx0IHZhbHVlLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHNpbmMgPSAoIHgsIGsgKSA9PiBzaW4oIFBJLm11bCggay5tdWwoIHggKS5zdWIoIDEuMCApICkgKS5kaXYoIFBJLm11bCggay5tdWwoIHggKS5zdWIoIDEuMCApICkgKTtcclxuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL2NhYmJpYm8vZ2xzbC10cmktbm9pc2UtM2RcclxuXHJcbmltcG9ydCB7IExvb3AgfSBmcm9tICcuLi91dGlscy9Mb29wTm9kZS5qcyc7XHJcbmltcG9ydCB7IGZsb2F0LCB2ZWMzLCBGbiB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbmNvbnN0IHRyaSA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyB4IF0gKSA9PiB7XHJcblxyXG5cdHJldHVybiB4LmZyYWN0KCkuc3ViKCAuNSApLmFicygpO1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICd0cmknLFxyXG5cdHR5cGU6ICdmbG9hdCcsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICd4JywgdHlwZTogJ2Zsb2F0JyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5jb25zdCB0cmkzID0gLypAX19QVVJFX18qLyBGbiggKCBbIHAgXSApID0+IHtcclxuXHJcblx0cmV0dXJuIHZlYzMoIHRyaSggcC56LmFkZCggdHJpKCBwLnkubXVsKCAxLiApICkgKSApLCB0cmkoIHAuei5hZGQoIHRyaSggcC54Lm11bCggMS4gKSApICkgKSwgdHJpKCBwLnkuYWRkKCB0cmkoIHAueC5tdWwoIDEuICkgKSApICkgKTtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAndHJpMycsXHJcblx0dHlwZTogJ3ZlYzMnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAncCcsIHR5cGU6ICd2ZWMzJyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG4vKipcclxuICogR2VuZXJhdGVzIGEgbm9pc2UgdmFsdWUgZnJvbSB0aGUgZ2l2ZW4gcG9zaXRpb24sIHNwZWVkIGFuZCB0aW1lIHBhcmFtZXRlcnMuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMzPn0gcG9zaXRpb24gLSBUaGUgcG9zaXRpb24uXHJcbiAqIEBwYXJhbSB7Tm9kZTxmbG9hdD59IHNwZWVkIC0gVGhlIHNwZWVkLlxyXG4gKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSB0aW1lIC0gVGhlIHRpbWUuXHJcbiAqIEByZXR1cm4ge05vZGU8ZmxvYXQ+fSBUaGUgZ2VuZXJhdGVkIG5vaXNlLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHRyaU5vaXNlM0QgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgcG9zaXRpb24sIHNwZWVkLCB0aW1lIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IHAgPSB2ZWMzKCBwb3NpdGlvbiApLnRvVmFyKCk7XHJcblx0Y29uc3QgeiA9IGZsb2F0KCAxLjQgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHJ6ID0gZmxvYXQoIDAuMCApLnRvVmFyKCk7XHJcblx0Y29uc3QgYnAgPSB2ZWMzKCBwICkudG9WYXIoKTtcclxuXHJcblx0TG9vcCggeyBzdGFydDogZmxvYXQoIDAuMCApLCBlbmQ6IGZsb2F0KCAzLjAgKSwgdHlwZTogJ2Zsb2F0JywgY29uZGl0aW9uOiAnPD0nIH0sICgpID0+IHtcclxuXHJcblx0XHRjb25zdCBkZyA9IHZlYzMoIHRyaTMoIGJwLm11bCggMi4wICkgKSApLnRvVmFyKCk7XHJcblx0XHRwLmFkZEFzc2lnbiggZGcuYWRkKCB0aW1lLm11bCggZmxvYXQoIDAuMSApLm11bCggc3BlZWQgKSApICkgKTtcclxuXHRcdGJwLm11bEFzc2lnbiggMS44ICk7XHJcblx0XHR6Lm11bEFzc2lnbiggMS41ICk7XHJcblx0XHRwLm11bEFzc2lnbiggMS4yICk7XHJcblxyXG5cdFx0Y29uc3QgdCA9IGZsb2F0KCB0cmkoIHAuei5hZGQoIHRyaSggcC54LmFkZCggdHJpKCBwLnkgKSApICkgKSApICkudG9WYXIoKTtcclxuXHRcdHJ6LmFkZEFzc2lnbiggdC5kaXYoIHogKSApO1xyXG5cdFx0YnAuYWRkQXNzaWduKCAwLjE0ICk7XHJcblxyXG5cdH0gKTtcclxuXHJcblx0cmV0dXJuIHJ6O1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICd0cmlOb2lzZTNEJyxcclxuXHR0eXBlOiAnZmxvYXQnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAncG9zaXRpb24nLCB0eXBlOiAndmVjMycgfSxcclxuXHRcdHsgbmFtZTogJ3NwZWVkJywgdHlwZTogJ2Zsb2F0JyB9LFxyXG5cdFx0eyBuYW1lOiAndGltZScsIHR5cGU6ICdmbG9hdCcgfVxyXG5cdF1cclxufSApO1xyXG4iLCJpbXBvcnQgTm9kZSBmcm9tICcuLi9jb3JlL05vZGUuanMnO1xyXG5pbXBvcnQgeyBub2RlUHJveHkgfSBmcm9tICcuLi90c2wvVFNMQ29yZS5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBjbGFzcyBhbGxvd3MgdG8gZGVmaW5lIG11bHRpcGxlIG92ZXJsb2FkZWQgdmVyc2lvbnNcclxuICogb2YgdGhlIHNhbWUgZnVuY3Rpb24uIERlcGVuZGluZyBvbiB0aGUgcGFyYW1ldGVycyBvZiB0aGUgZnVuY3Rpb25cclxuICogY2FsbCwgdGhlIG5vZGUgcGlja3MgdGhlIGJlc3QtZml0IG92ZXJsb2FkZWQgdmVyc2lvbi5cclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVcclxuICovXHJcbmNsYXNzIEZ1bmN0aW9uT3ZlcmxvYWRpbmdOb2RlIGV4dGVuZHMgTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ0Z1bmN0aW9uT3ZlcmxvYWRpbmdOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGZ1bmN0aW9uIG92ZXJsb2FkaW5nIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PEZ1bmN0aW9uPn0gZnVuY3Rpb25Ob2RlcyAtIEFycmF5IG9mIGBGbmAgZnVuY3Rpb24gZGVmaW5pdGlvbnMuXHJcblx0ICogQHBhcmFtIHsuLi5Ob2RlfSBwYXJhbWV0ZXJzTm9kZXMgLSBBIGxpc3Qgb2YgcGFyYW1ldGVyIG5vZGVzLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBmdW5jdGlvbk5vZGVzID0gW10sIC4uLnBhcmFtZXRlcnNOb2RlcyApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQXJyYXkgb2YgYEZuYCBmdW5jdGlvbiBkZWZpbml0aW9ucy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8RnVuY3Rpb24+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZ1bmN0aW9uTm9kZXMgPSBmdW5jdGlvbk5vZGVzO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBsaXN0IG9mIHBhcmFtZXRlciBub2Rlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8Tm9kZT59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucGFyYW1ldGVyc05vZGVzID0gcGFyYW1ldGVyc05vZGVzO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHNlbGVjdGVkIG92ZXJsb2FkZWQgZnVuY3Rpb24gY2FsbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge1NoYWRlckNhbGxOb2RlSW50ZXJuYWx9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX2NhbmRpZGF0ZUZuQ2FsbCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIG5vZGUgaXMgbWFya2VkIGFzIGdsb2JhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nbG9iYWwgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGlzIG92ZXJ3cml0dGVuIHNpbmNlIHRoZSBub2RlIHR5cGUgaXMgaW5mZXJyZWQgZnJvbVxyXG5cdCAqIHRoZSBmdW5jdGlvbidzIHJldHVybiB0eXBlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBub2RlIHR5cGUuXHJcblx0ICovXHJcblx0Z2V0Tm9kZVR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZnVuY3Rpb25Ob2Rlc1sgMCBdLnNoYWRlck5vZGUubGF5b3V0LnR5cGU7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXAoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgcGFyYW1zID0gdGhpcy5wYXJhbWV0ZXJzTm9kZXM7XHJcblxyXG5cdFx0bGV0IGNhbmRpZGF0ZUZuQ2FsbCA9IHRoaXMuX2NhbmRpZGF0ZUZuQ2FsbDtcclxuXHJcblx0XHRpZiAoIGNhbmRpZGF0ZUZuQ2FsbCA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGxldCBjYW5kaWRhdGVGbiA9IG51bGw7XHJcblx0XHRcdGxldCBjYW5kaWRhdGVTY29yZSA9IC0gMTtcclxuXHJcblx0XHRcdGZvciAoIGNvbnN0IGZ1bmN0aW9uTm9kZSBvZiB0aGlzLmZ1bmN0aW9uTm9kZXMgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHNoYWRlck5vZGUgPSBmdW5jdGlvbk5vZGUuc2hhZGVyTm9kZTtcclxuXHRcdFx0XHRjb25zdCBsYXlvdXQgPSBzaGFkZXJOb2RlLmxheW91dDtcclxuXHJcblx0XHRcdFx0aWYgKCBsYXlvdXQgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnRnVuY3Rpb25PdmVybG9hZGluZ05vZGU6IEZ1bmN0aW9uTm9kZSBtdXN0IGJlIGEgbGF5b3V0LicgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRjb25zdCBpbnB1dHMgPSBsYXlvdXQuaW5wdXRzO1xyXG5cclxuXHRcdFx0XHRpZiAoIHBhcmFtcy5sZW5ndGggPT09IGlucHV0cy5sZW5ndGggKSB7XHJcblxyXG5cdFx0XHRcdFx0bGV0IHNjb3JlID0gMDtcclxuXHJcblx0XHRcdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgcGFyYW0gPSBwYXJhbXNbIGkgXTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgaW5wdXQgPSBpbnB1dHNbIGkgXTtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggcGFyYW0uZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKSA9PT0gaW5wdXQudHlwZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0c2NvcmUgKys7XHJcblxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRzY29yZSA9IDA7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGlmICggc2NvcmUgPiBjYW5kaWRhdGVTY29yZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNhbmRpZGF0ZUZuID0gZnVuY3Rpb25Ob2RlO1xyXG5cdFx0XHRcdFx0XHRjYW5kaWRhdGVTY29yZSA9IHNjb3JlO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5fY2FuZGlkYXRlRm5DYWxsID0gY2FuZGlkYXRlRm5DYWxsID0gY2FuZGlkYXRlRm4oIC4uLnBhcmFtcyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gY2FuZGlkYXRlRm5DYWxsO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBGdW5jdGlvbk92ZXJsb2FkaW5nTm9kZTtcclxuXHJcbmNvbnN0IG92ZXJsb2FkaW5nQmFzZUZuID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIEZ1bmN0aW9uT3ZlcmxvYWRpbmdOb2RlICk7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIGZ1bmN0aW9uIG92ZXJsb2FkaW5nIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7QXJyYXk8RnVuY3Rpb24+fSBmdW5jdGlvbk5vZGVzIC0gQXJyYXkgb2YgYEZuYCBmdW5jdGlvbiBkZWZpbml0aW9ucy5cclxuICogQHJldHVybnMge0Z1bmN0aW9uT3ZlcmxvYWRpbmdOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG92ZXJsb2FkaW5nRm4gPSAoIGZ1bmN0aW9uTm9kZXMgKSA9PiAoIC4uLnBhcmFtcyApID0+IG92ZXJsb2FkaW5nQmFzZUZuKCBmdW5jdGlvbk5vZGVzLCAuLi5wYXJhbXMgKTtcclxuIiwiaW1wb3J0IHsgcmVuZGVyR3JvdXAgfSBmcm9tICcuLi9jb3JlL1VuaWZvcm1Hcm91cE5vZGUuanMnO1xyXG5pbXBvcnQgeyB1bmlmb3JtIH0gZnJvbSAnLi4vY29yZS9Vbmlmb3JtTm9kZS5qcyc7XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyB0aGUgZWxhcHNlZCB0aW1lIGluIHNlY29uZHMuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1VuaWZvcm1Ob2RlPGZsb2F0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCB0aW1lID0gLypAX19QVVJFX18qLyB1bmlmb3JtKCAwICkuc2V0R3JvdXAoIHJlbmRlckdyb3VwICkub25SZW5kZXJVcGRhdGUoICggZnJhbWUgKSA9PiBmcmFtZS50aW1lICk7XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyB0aGUgZGVsdGEgdGltZSBpbiBzZWNvbmRzLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtVbmlmb3JtTm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZGVsdGFUaW1lID0gLypAX19QVVJFX18qLyB1bmlmb3JtKCAwICkuc2V0R3JvdXAoIHJlbmRlckdyb3VwICkub25SZW5kZXJVcGRhdGUoICggZnJhbWUgKSA9PiBmcmFtZS5kZWx0YVRpbWUgKTtcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIHRoZSBjdXJyZW50IGZyYW1lIElELlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtVbmlmb3JtTm9kZTx1aW50Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBmcmFtZUlkID0gLypAX19QVVJFX18qLyB1bmlmb3JtKCAwLCAndWludCcgKS5zZXRHcm91cCggcmVuZGVyR3JvdXAgKS5vblJlbmRlclVwZGF0ZSggKCBmcmFtZSApID0+IGZyYW1lLmZyYW1lSWQgKTtcclxuXHJcbi8vIERlcHJlY2F0ZWRcclxuXHJcbi8qKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAZGVwcmVjYXRlZCBzaW5jZSByMTcwLiBVc2Uge0BsaW5rIHRpbWV9IGluc3RlYWQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbdGltZVNjYWxlPTFdIC0gVGhlIHRpbWUgc2NhbGUuXHJcbiAqIEByZXR1cm5zIHtVbmlmb3JtTm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdGltZXJMb2NhbCA9ICggdGltZVNjYWxlID0gMSApID0+IHsgLy8gQGRlcHJlY2F0ZWQsIHIxNzBcclxuXHJcblx0Y29uc29sZS53YXJuKCAnVFNMOiB0aW1lckxvY2FsKCkgaXMgZGVwcmVjYXRlZC4gVXNlIFwidGltZVwiIGluc3RlYWQuJyApO1xyXG5cdHJldHVybiB0aW1lLm11bCggdGltZVNjYWxlICk7XHJcblxyXG59O1xyXG5cclxuLyoqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBkZXByZWNhdGVkIHNpbmNlIHIxNzAuIFVzZSB7QGxpbmsgdGltZX0gaW5zdGVhZC5cclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IFt0aW1lU2NhbGU9MV0gLSBUaGUgdGltZSBzY2FsZS5cclxuICogQHJldHVybnMge1VuaWZvcm1Ob2RlPGZsb2F0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCB0aW1lckdsb2JhbCA9ICggdGltZVNjYWxlID0gMSApID0+IHsgLy8gQGRlcHJlY2F0ZWQsIHIxNzBcclxuXHJcblx0Y29uc29sZS53YXJuKCAnVFNMOiB0aW1lckdsb2JhbCgpIGlzIGRlcHJlY2F0ZWQuIFVzZSBcInRpbWVcIiBpbnN0ZWFkLicgKTtcclxuXHRyZXR1cm4gdGltZS5tdWwoIHRpbWVTY2FsZSApO1xyXG5cclxufTtcclxuXHJcbi8qKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAZGVwcmVjYXRlZCBzaW5jZSByMTcwLiBVc2Uge0BsaW5rIGRlbHRhVGltZX0gaW5zdGVhZC5cclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IFt0aW1lU2NhbGU9MV0gLSBUaGUgdGltZSBzY2FsZS5cclxuICogQHJldHVybnMge1VuaWZvcm1Ob2RlPGZsb2F0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCB0aW1lckRlbHRhID0gKCB0aW1lU2NhbGUgPSAxICkgPT4geyAvLyBAZGVwcmVjYXRlZCwgcjE3MFxyXG5cclxuXHRjb25zb2xlLndhcm4oICdUU0w6IHRpbWVyRGVsdGEoKSBpcyBkZXByZWNhdGVkLiBVc2UgXCJkZWx0YVRpbWVcIiBpbnN0ZWFkLicgKTtcclxuXHRyZXR1cm4gZGVsdGFUaW1lLm11bCggdGltZVNjYWxlICk7XHJcblxyXG59O1xyXG4iLCJpbXBvcnQgeyB0aW1lIH0gZnJvbSAnLi9UaW1lci5qcyc7XHJcblxyXG4vKipcclxuICogR2VuZXJhdGVzIGEgc2luZSB3YXZlIG9zY2lsbGF0aW9uIGJhc2VkIG9uIGEgdGltZXIuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTxmbG9hdD59IHQgLSBUaGUgdGltZXIgdG8gZ2VuZXJhdGUgdGhlIG9zY2lsbGF0aW9uIHdpdGguXHJcbiAqIEByZXR1cm4ge05vZGU8ZmxvYXQ+fSBUaGUgb3NjaWxsYXRpb24gbm9kZS5cclxuICovXHJcbmV4cG9ydCBjb25zdCBvc2NTaW5lID0gKCB0ID0gdGltZSApID0+IHQuYWRkKCAwLjc1ICkubXVsKCBNYXRoLlBJICogMiApLnNpbigpLm11bCggMC41ICkuYWRkKCAwLjUgKTtcclxuXHJcbi8qKlxyXG4gKiBHZW5lcmF0ZXMgYSBzcXVhcmUgd2F2ZSBvc2NpbGxhdGlvbiBiYXNlZCBvbiBhIHRpbWVyLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSB0IC0gVGhlIHRpbWVyIHRvIGdlbmVyYXRlIHRoZSBvc2NpbGxhdGlvbiB3aXRoLlxyXG4gKiBAcmV0dXJuIHtOb2RlPGZsb2F0Pn0gVGhlIG9zY2lsbGF0aW9uIG5vZGUuXHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgb3NjU3F1YXJlID0gKCB0ID0gdGltZSApID0+IHQuZnJhY3QoKS5yb3VuZCgpO1xyXG5cclxuLyoqXHJcbiAqIEdlbmVyYXRlcyBhIHRyaWFuZ2xlIHdhdmUgb3NjaWxsYXRpb24gYmFzZWQgb24gYSB0aW1lci5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlPGZsb2F0Pn0gdCAtIFRoZSB0aW1lciB0byBnZW5lcmF0ZSB0aGUgb3NjaWxsYXRpb24gd2l0aC5cclxuICogQHJldHVybiB7Tm9kZTxmbG9hdD59IFRoZSBvc2NpbGxhdGlvbiBub2RlLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG9zY1RyaWFuZ2xlID0gKCB0ID0gdGltZSApID0+IHQuYWRkKCAwLjUgKS5mcmFjdCgpLm11bCggMiApLnN1YiggMSApLmFicygpO1xyXG5cclxuLyoqXHJcbiAqIEdlbmVyYXRlcyBhIHNhd3Rvb3RoIHdhdmUgb3NjaWxsYXRpb24gYmFzZWQgb24gYSB0aW1lci5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlPGZsb2F0Pn0gdCAtIFRoZSB0aW1lciB0byBnZW5lcmF0ZSB0aGUgb3NjaWxsYXRpb24gd2l0aC5cclxuICogQHJldHVybiB7Tm9kZTxmbG9hdD59IFRoZSBvc2NpbGxhdGlvbiBub2RlLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG9zY1Nhd3Rvb3RoID0gKCB0ID0gdGltZSApID0+IHQuZnJhY3QoKTtcclxuIiwiaW1wb3J0IHsgRm4sIHZlYzIgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcbmltcG9ydCB7IHJvdGF0ZSB9IGZyb20gJy4vUm90YXRlTm9kZS5qcyc7XHJcblxyXG4vKipcclxuICogUm90YXRlcyB0aGUgZ2l2ZW4gdXYgY29vcmRpbmF0ZXMgYXJvdW5kIGEgY2VudGVyIHBvaW50XHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMyPn0gdXYgLSBUaGUgdXYgY29vcmRpbmF0ZXMuXHJcbiAqIEBwYXJhbSB7Tm9kZTxmbG9hdD59IHJvdGF0aW9uIC0gVGhlIHJvdGF0aW9uIGRlZmluZWQgaW4gcmFkaWFucy5cclxuICogQHBhcmFtIHtOb2RlPHZlYzI+fSBjZW50ZXIgLSBUaGUgY2VudGVyIG9mIHJvdGF0aW9uXHJcbiAqIEByZXR1cm4ge05vZGU8dmVjMj59IFRoZSByb3RhdGVkIHV2IGNvb3JkaW5hdGVzLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHJvdGF0ZVVWID0gLypAX19QVVJFX18qLyBGbiggKCBbIHV2LCByb3RhdGlvbiwgY2VudGVyID0gdmVjMiggMC41ICkgXSApID0+IHtcclxuXHJcblx0cmV0dXJuIHJvdGF0ZSggdXYuc3ViKCBjZW50ZXIgKSwgcm90YXRpb24gKS5hZGQoIGNlbnRlciApO1xyXG5cclxufSApO1xyXG5cclxuLyoqXHJcbiAqIEFwcGxpZXMgYSBzcGhlcmljYWwgd2FycGluZyBlZmZlY3QgdG8gdGhlIGdpdmVuIHV2IGNvb3JkaW5hdGVzLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGU8dmVjMj59IHV2IC0gVGhlIHV2IGNvb3JkaW5hdGVzLlxyXG4gKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSBzdHJlbmd0aCAtIFRoZSBzdHJlbmd0aCBvZiB0aGUgZWZmZWN0LlxyXG4gKiBAcGFyYW0ge05vZGU8dmVjMj59IGNlbnRlciAtIFRoZSBjZW50ZXIgcG9pbnRcclxuICogQHJldHVybiB7Tm9kZTx2ZWMyPn0gVGhlIHVwZGF0ZWQgdXYgY29vcmRpbmF0ZXMuXHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgc3BoZXJpemVVViA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyB1diwgc3RyZW5ndGgsIGNlbnRlciA9IHZlYzIoIDAuNSApIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IGRlbHRhID0gdXYuc3ViKCBjZW50ZXIgKTtcclxuXHRjb25zdCBkZWx0YTIgPSBkZWx0YS5kb3QoIGRlbHRhICk7XHJcblx0Y29uc3QgZGVsdGE0ID0gZGVsdGEyLm11bCggZGVsdGEyICk7XHJcblx0Y29uc3QgZGVsdGFPZmZzZXQgPSBkZWx0YTQubXVsKCBzdHJlbmd0aCApO1xyXG5cclxuXHRyZXR1cm4gdXYuYWRkKCBkZWx0YS5tdWwoIGRlbHRhT2Zmc2V0ICkgKTtcclxuXHJcbn0gKTtcclxuIiwiaW1wb3J0IHsgbW9kZWxXb3JsZE1hdHJpeCB9IGZyb20gJy4uL2FjY2Vzc29ycy9Nb2RlbE5vZGUuanMnO1xyXG5pbXBvcnQgeyBjYW1lcmFWaWV3TWF0cml4LCBjYW1lcmFQcm9qZWN0aW9uTWF0cml4IH0gZnJvbSAnLi4vYWNjZXNzb3JzL0NhbWVyYS5qcyc7XHJcbmltcG9ydCB7IHBvc2l0aW9uTG9jYWwgfSBmcm9tICcuLi9hY2Nlc3NvcnMvUG9zaXRpb24uanMnO1xyXG5pbXBvcnQgeyBGbiwgZGVmaW5lZCB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGFjaGlldmUgYSBiaWxsYm9hcmRpbmcgYmVoYXZpb3IgZm9yIGZsYXQgbWVzaGVzLiBUaGF0IG1lYW5zIHRoZXkgYXJlXHJcbiAqIG9yaWVudGVkIGFsd2F5cyB0b3dhcmRzIHRoZSBjYW1lcmEuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIG1hdGVyaWFsLnZlcnRleE5vZGUgPSBiaWxsYm9hcmRpbmcoKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgLSBUaGUgY29uZmlndXJhdGlvbiBvYmplY3QuXHJcbiAqIEBwYXJhbSB7P05vZGU8dmVjMz59IFtjb25maWcucG9zaXRpb249bnVsbF0gLSBDYW4gYmUgdXNlZCB0byBkZWZpbmUgdGhlIHZlcnRleCBwb3NpdGlvbnMgaW4gd29ybGQgc3BhY2UuXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NvbmZpZy5ob3Jpem9udGFsPXRydWVdIC0gV2hldGhlciB0byBmb2xsb3cgdGhlIGNhbWVyYSByb3RhdGlvbiBob3Jpem9udGFsbHkgb3Igbm90LlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtjb25maWcudmVydGljYWw9ZmFsc2VdIC0gV2hldGhlciB0byBmb2xsb3cgdGhlIGNhbWVyYSByb3RhdGlvbiB2ZXJ0aWNhbGx5IG9yIG5vdC5cclxuICogQHJldHVybiB7Tm9kZTx2ZWMzPn0gVGhlIHVwZGF0ZWQgdmVydGV4IHBvc2l0aW9uIGluIGNsaXAgc3BhY2UuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYmlsbGJvYXJkaW5nID0gLypAX19QVVJFX18qLyBGbiggKCB7IHBvc2l0aW9uID0gbnVsbCwgaG9yaXpvbnRhbCA9IHRydWUsIHZlcnRpY2FsID0gZmFsc2UgfSApID0+IHtcclxuXHJcblx0bGV0IHdvcmxkTWF0cml4O1xyXG5cclxuXHRpZiAoIHBvc2l0aW9uICE9PSBudWxsICkge1xyXG5cclxuXHRcdHdvcmxkTWF0cml4ID0gbW9kZWxXb3JsZE1hdHJpeC50b1ZhcigpO1xyXG5cdFx0d29ybGRNYXRyaXhbIDMgXVsgMCBdID0gcG9zaXRpb24ueDtcclxuXHRcdHdvcmxkTWF0cml4WyAzIF1bIDEgXSA9IHBvc2l0aW9uLnk7XHJcblx0XHR3b3JsZE1hdHJpeFsgMyBdWyAyIF0gPSBwb3NpdGlvbi56O1xyXG5cclxuXHR9IGVsc2Uge1xyXG5cclxuXHRcdHdvcmxkTWF0cml4ID0gbW9kZWxXb3JsZE1hdHJpeDtcclxuXHJcblx0fVxyXG5cclxuXHRjb25zdCBtb2RlbFZpZXdNYXRyaXggPSBjYW1lcmFWaWV3TWF0cml4Lm11bCggd29ybGRNYXRyaXggKTtcclxuXHJcblx0aWYgKCBkZWZpbmVkKCBob3Jpem9udGFsICkgKSB7XHJcblxyXG5cdFx0bW9kZWxWaWV3TWF0cml4WyAwIF1bIDAgXSA9IG1vZGVsV29ybGRNYXRyaXhbIDAgXS5sZW5ndGgoKTtcclxuXHRcdG1vZGVsVmlld01hdHJpeFsgMCBdWyAxIF0gPSAwO1xyXG5cdFx0bW9kZWxWaWV3TWF0cml4WyAwIF1bIDIgXSA9IDA7XHJcblxyXG5cdH1cclxuXHJcblx0aWYgKCBkZWZpbmVkKCB2ZXJ0aWNhbCApICkge1xyXG5cclxuXHRcdG1vZGVsVmlld01hdHJpeFsgMSBdWyAwIF0gPSAwO1xyXG5cdFx0bW9kZWxWaWV3TWF0cml4WyAxIF1bIDEgXSA9IG1vZGVsV29ybGRNYXRyaXhbIDEgXS5sZW5ndGgoKTtcclxuXHRcdG1vZGVsVmlld01hdHJpeFsgMSBdWyAyIF0gPSAwO1xyXG5cclxuXHR9XHJcblxyXG5cdG1vZGVsVmlld01hdHJpeFsgMiBdWyAwIF0gPSAwO1xyXG5cdG1vZGVsVmlld01hdHJpeFsgMiBdWyAxIF0gPSAwO1xyXG5cdG1vZGVsVmlld01hdHJpeFsgMiBdWyAyIF0gPSAxO1xyXG5cclxuXHRyZXR1cm4gY2FtZXJhUHJvamVjdGlvbk1hdHJpeC5tdWwoIG1vZGVsVmlld01hdHJpeCApLm11bCggcG9zaXRpb25Mb2NhbCApO1xyXG5cclxufSApO1xyXG4iLCJpbXBvcnQgeyBGbiB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuaW1wb3J0IHsgc2NyZWVuVVYgfSBmcm9tICcuLi9kaXNwbGF5L1NjcmVlbk5vZGUuanMnO1xyXG5pbXBvcnQgeyB2aWV3cG9ydERlcHRoVGV4dHVyZSB9IGZyb20gJy4uL2Rpc3BsYXkvVmlld3BvcnREZXB0aFRleHR1cmVOb2RlLmpzJztcclxuaW1wb3J0IHsgbGluZWFyRGVwdGggfSBmcm9tICcuLi9kaXNwbGF5L1ZpZXdwb3J0RGVwdGhOb2RlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIHNwZWNpYWwgdmVyc2lvbiBvZiBhIHNjcmVlbiB1diBmdW5jdGlvbiB0aGF0IGludm9sdmVzIGEgZGVwdGggY29tcGFyaXNvblxyXG4gKiB3aGVuIGNvbXB1dGluZyB0aGUgZmluYWwgdXZzLiBUaGUgZnVuY3Rpb24gbWl0aWdhdGVzIHZpc3VhbCBlcnJvcnMgd2hlblxyXG4gKiB1c2luZyB2aWV3cG9ydCB0ZXh0dXJlIG5vZGVzIGZvciByZWZyYWN0aW9uIHB1cnBvc2VzLiBXaXRob3V0IHRoaXMgZnVuY3Rpb25cclxuICogb2JqZWN0cyBpbiBmcm9udCBvZiBhIHJlZnJhY3RpdmUgc3VyZmFjZSBtaWdodCBhcHBlYXIgb24gdGhlIHJlZnJhY3RpdmUgc3VyZmFjZVxyXG4gKiB3aGljaCBpcyBpbmNvcnJlY3QuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7P05vZGU8dmVjMj59IHV2IC0gT3B0aW9uYWwgdXYgY29vcmRpbmF0ZXMuIEJ5IGRlZmF1bHQgYHNjcmVlblVWYCBpcyB1c2VkLlxyXG4gKiBAcmV0dXJuIHtOb2RlPHZlYzI+fSBUaGUgdXBkYXRlIHV2IGNvb3JkaW5hdGVzLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHZpZXdwb3J0U2FmZVVWID0gLypAX19QVVJFX18qLyBGbiggKCBbIHV2ID0gbnVsbCBdICkgPT4ge1xyXG5cclxuXHRjb25zdCBkZXB0aCA9IGxpbmVhckRlcHRoKCk7XHJcblx0Y29uc3QgZGVwdGhEaWZmID0gbGluZWFyRGVwdGgoIHZpZXdwb3J0RGVwdGhUZXh0dXJlKCB1diApICkuc3ViKCBkZXB0aCApO1xyXG5cdGNvbnN0IGZpbmFsVVYgPSBkZXB0aERpZmYubGVzc1RoYW4oIDAgKS5zZWxlY3QoIHNjcmVlblVWLCB1diApO1xyXG5cclxuXHRyZXR1cm4gZmluYWxVVjtcclxuXHJcbn0gKTtcclxuIiwiaW1wb3J0IE5vZGUgZnJvbSAnLi4vY29yZS9Ob2RlLmpzJztcclxuaW1wb3J0IHsgdXYgfSBmcm9tICcuLi9hY2Nlc3NvcnMvVVYuanMnO1xyXG5pbXBvcnQgeyBub2RlUHJveHksIGZsb2F0LCB2ZWMyIH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5cclxuLyoqXHJcbiAqIENhbiBiZSB1c2VkIHRvIGNvbXB1dGUgdGV4dHVyZSBjb29yZGluYXRlcyBmb3IgYW5pbWF0ZWQgc3ByaXRlIHNoZWV0cy5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgdXZOb2RlID0gc3ByaXRlc2hlZXRVViggdmVjMiggNiwgNiApLCB1digpLCB0aW1lLm11bCggYW5pbWF0aW9uU3BlZWQgKSApO1xyXG4gKlxyXG4gKiBtYXRlcmlhbC5jb2xvck5vZGUgPSB0ZXh0dXJlKCBzcHJpdGVTaGVldCwgdXZOb2RlICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTm9kZVxyXG4gKi9cclxuY2xhc3MgU3ByaXRlU2hlZXRVVk5vZGUgZXh0ZW5kcyBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnU3ByaXRlU2hlZXRVVk5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc3ByaXRlIHNoZWV0IHV2IG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGU8dmVjMj59IGNvdW50Tm9kZSAtIFRoZSBub2RlIHRoYXQgZGVmaW5lcyB0aGUgbnVtYmVyIG9mIHNwcml0ZXMgaW4gdGhlIHggYW5kIHkgZGlyZWN0aW9uIChlLmcgNng2KS5cclxuXHQgKiBAcGFyYW0ge05vZGU8dmVjMj59IFt1dk5vZGU9dXYoKV0gLSBUaGUgdXYgbm9kZS5cclxuXHQgKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSBbZnJhbWVOb2RlPWZsb2F0KCldIC0gVGhlIG5vZGUgdGhhdCBkZWZpbmVzIHRoZSBjdXJyZW50IGZyYW1lL3Nwcml0ZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggY291bnROb2RlLCB1dk5vZGUgPSB1digpLCBmcmFtZU5vZGUgPSBmbG9hdCggMCApICkge1xyXG5cclxuXHRcdHN1cGVyKCAndmVjMicgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBub2RlIHRoYXQgZGVmaW5lcyB0aGUgbnVtYmVyIG9mIHNwcml0ZXMgaW4gdGhlIHggYW5kIHkgZGlyZWN0aW9uIChlLmcgNng2KS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZTx2ZWMyPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb3VudE5vZGUgPSBjb3VudE5vZGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdXYgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZTx2ZWMyPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51dk5vZGUgPSB1dk5vZGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbm9kZSB0aGF0IGRlZmluZXMgdGhlIGN1cnJlbnQgZnJhbWUvc3ByaXRlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlPGZsb2F0Pn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5mcmFtZU5vZGUgPSBmcmFtZU5vZGU7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXAoKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBmcmFtZU5vZGUsIHV2Tm9kZSwgY291bnROb2RlIH0gPSB0aGlzO1xyXG5cclxuXHRcdGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gY291bnROb2RlO1xyXG5cclxuXHRcdGNvbnN0IGZyYW1lTnVtID0gZnJhbWVOb2RlLm1vZCggd2lkdGgubXVsKCBoZWlnaHQgKSApLmZsb29yKCk7XHJcblxyXG5cdFx0Y29uc3QgY29sdW1uID0gZnJhbWVOdW0ubW9kKCB3aWR0aCApO1xyXG5cdFx0Y29uc3Qgcm93ID0gaGVpZ2h0LnN1YiggZnJhbWVOdW0uYWRkKCAxICkuZGl2KCB3aWR0aCApLmNlaWwoKSApO1xyXG5cclxuXHRcdGNvbnN0IHNjYWxlID0gY291bnROb2RlLnJlY2lwcm9jYWwoKTtcclxuXHRcdGNvbnN0IHV2RnJhbWVPZmZzZXQgPSB2ZWMyKCBjb2x1bW4sIHJvdyApO1xyXG5cclxuXHRcdHJldHVybiB1dk5vZGUuYWRkKCB1dkZyYW1lT2Zmc2V0ICkubXVsKCBzY2FsZSApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTcHJpdGVTaGVldFVWTm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgc3ByaXRlIHNoZWV0IHV2IG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMyPn0gY291bnROb2RlIC0gVGhlIG5vZGUgdGhhdCBkZWZpbmVzIHRoZSBudW1iZXIgb2Ygc3ByaXRlcyBpbiB0aGUgeCBhbmQgeSBkaXJlY3Rpb24gKGUuZyA2eDYpLlxyXG4gKiBAcGFyYW0gez9Ob2RlPHZlYzI+fSBbdXZOb2RlPXV2KCldIC0gVGhlIHV2IG5vZGUuXHJcbiAqIEBwYXJhbSB7P05vZGU8ZmxvYXQ+fSBbZnJhbWVOb2RlPWZsb2F0KCldIC0gVGhlIG5vZGUgdGhhdCBkZWZpbmVzIHRoZSBjdXJyZW50IGZyYW1lL3Nwcml0ZS5cclxuICogQHJldHVybnMge1Nwcml0ZVNoZWV0VVZOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHNwcml0ZXNoZWV0VVYgPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggU3ByaXRlU2hlZXRVVk5vZGUgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDMgKTtcclxuIiwiaW1wb3J0IE5vZGUgZnJvbSAnLi4vY29yZS9Ob2RlLmpzJztcclxuaW1wb3J0IHsgYWRkIH0gZnJvbSAnLi4vbWF0aC9PcGVyYXRvck5vZGUuanMnO1xyXG5pbXBvcnQgeyBub3JtYWxMb2NhbCB9IGZyb20gJy4uL2FjY2Vzc29ycy9Ob3JtYWwuanMnO1xyXG5pbXBvcnQgeyBwb3NpdGlvbkxvY2FsIH0gZnJvbSAnLi4vYWNjZXNzb3JzL1Bvc2l0aW9uLmpzJztcclxuaW1wb3J0IHsgdGV4dHVyZSB9IGZyb20gJy4uL2FjY2Vzc29ycy9UZXh0dXJlTm9kZS5qcyc7XHJcbmltcG9ydCB7IG5vZGVQcm94eSwgZmxvYXQsIHZlYzMgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcblxyXG4vKipcclxuICogQ2FuIGJlIHVzZWQgZm9yIHRyaXBsYW5hciB0ZXh0dXJlIG1hcHBpbmcuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIG1hdGVyaWFsLmNvbG9yTm9kZSA9IHRyaXBsYW5hclRleHR1cmUoIHRleHR1cmUoIGRpZmZ1c2VNYXAgKSApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVcclxuICovXHJcbmNsYXNzIFRyaXBsYW5hclRleHR1cmVzTm9kZSBleHRlbmRzIE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdUcmlwbGFuYXJUZXh0dXJlc05vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgdHJpcGxhbmFyIHRleHR1cmVzIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV9IHRleHR1cmVYTm9kZSAtIEZpcnN0IHRleHR1cmUgbm9kZS5cclxuXHQgKiBAcGFyYW0gez9Ob2RlfSBbdGV4dHVyZVlOb2RlPW51bGxdIC0gU2Vjb25kIHRleHR1cmUgbm9kZS4gV2hlbiBub3Qgc2V0LCB0aGUgc2hhZGVyIHdpbGwgc2FtcGxlIGZyb20gYHRleHR1cmVYTm9kZWAgaW5zdGVhZC5cclxuXHQgKiBAcGFyYW0gez9Ob2RlfSBbdGV4dHVyZVpOb2RlPW51bGxdIC0gVGhpcmQgdGV4dHVyZSBub2RlLiBXaGVuIG5vdCBzZXQsIHRoZSBzaGFkZXIgd2lsbCBzYW1wbGUgZnJvbSBgdGV4dHVyZVhOb2RlYCBpbnN0ZWFkLlxyXG5cdCAqIEBwYXJhbSB7P05vZGU8ZmxvYXQ+fSBbc2NhbGVOb2RlPWZsb2F0KDEpXSAtIFRoZSBzY2FsZSBub2RlLlxyXG5cdCAqIEBwYXJhbSB7P05vZGU8dmVjMz59IFtwb3NpdGlvbk5vZGU9cG9zaXRpb25Mb2NhbF0gLSBWZXJ0ZXggcG9zaXRpb25zIGluIGxvY2FsIHNwYWNlLlxyXG5cdCAqIEBwYXJhbSB7P05vZGU8dmVjMz59IFtub3JtYWxOb2RlPW5vcm1hbExvY2FsXSAtIE5vcm1hbHMgaW4gbG9jYWwgc3BhY2UuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHRleHR1cmVYTm9kZSwgdGV4dHVyZVlOb2RlID0gbnVsbCwgdGV4dHVyZVpOb2RlID0gbnVsbCwgc2NhbGVOb2RlID0gZmxvYXQoIDEgKSwgcG9zaXRpb25Ob2RlID0gcG9zaXRpb25Mb2NhbCwgbm9ybWFsTm9kZSA9IG5vcm1hbExvY2FsICkge1xyXG5cclxuXHRcdHN1cGVyKCAndmVjNCcgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEZpcnN0IHRleHR1cmUgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50ZXh0dXJlWE5vZGUgPSB0ZXh0dXJlWE5vZGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTZWNvbmQgdGV4dHVyZSBub2RlLiBXaGVuIG5vdCBzZXQsIHRoZSBzaGFkZXIgd2lsbCBzYW1wbGUgZnJvbSBgdGV4dHVyZVhOb2RlYCBpbnN0ZWFkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Tm9kZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50ZXh0dXJlWU5vZGUgPSB0ZXh0dXJlWU5vZGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlyZCB0ZXh0dXJlIG5vZGUuIFdoZW4gbm90IHNldCwgdGhlIHNoYWRlciB3aWxsIHNhbXBsZSBmcm9tIGB0ZXh0dXJlWE5vZGVgIGluc3RlYWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRleHR1cmVaTm9kZSA9IHRleHR1cmVaTm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBzY2FsZSBub2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlPGZsb2F0Pn1cclxuXHRcdCAqIEBkZWZhdWx0IGZsb2F0KDEpXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2NhbGVOb2RlID0gc2NhbGVOb2RlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVmVydGV4IHBvc2l0aW9ucyBpbiBsb2NhbCBzcGFjZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZTx2ZWMzPn1cclxuXHRcdCAqIEBkZWZhdWx0IHBvc2l0aW9uTG9jYWxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wb3NpdGlvbk5vZGUgPSBwb3NpdGlvbk5vZGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBOb3JtYWxzIGluIGxvY2FsIHNwYWNlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlPHZlYzM+fVxyXG5cdFx0ICogQGRlZmF1bHQgbm9ybWFsTG9jYWxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub3JtYWxOb2RlID0gbm9ybWFsTm9kZTtcclxuXHJcblx0fVxyXG5cclxuXHRzZXR1cCgpIHtcclxuXHJcblx0XHRjb25zdCB7IHRleHR1cmVYTm9kZSwgdGV4dHVyZVlOb2RlLCB0ZXh0dXJlWk5vZGUsIHNjYWxlTm9kZSwgcG9zaXRpb25Ob2RlLCBub3JtYWxOb2RlIH0gPSB0aGlzO1xyXG5cclxuXHRcdC8vIFJlZjogaHR0cHM6Ly9naXRodWIuY29tL2tlaWppcm8vU3RhbmRhcmRUcmlwbGFuYXJcclxuXHJcblx0XHQvLyBCbGVuZGluZyBmYWN0b3Igb2YgdHJpcGxhbmFyIG1hcHBpbmdcclxuXHRcdGxldCBiZiA9IG5vcm1hbE5vZGUuYWJzKCkubm9ybWFsaXplKCk7XHJcblx0XHRiZiA9IGJmLmRpdiggYmYuZG90KCB2ZWMzKCAxLjAgKSApICk7XHJcblxyXG5cdFx0Ly8gVHJpcGxhbmFyIG1hcHBpbmdcclxuXHRcdGNvbnN0IHR4ID0gcG9zaXRpb25Ob2RlLnl6Lm11bCggc2NhbGVOb2RlICk7XHJcblx0XHRjb25zdCB0eSA9IHBvc2l0aW9uTm9kZS56eC5tdWwoIHNjYWxlTm9kZSApO1xyXG5cdFx0Y29uc3QgdHogPSBwb3NpdGlvbk5vZGUueHkubXVsKCBzY2FsZU5vZGUgKTtcclxuXHJcblx0XHQvLyBCYXNlIGNvbG9yXHJcblx0XHRjb25zdCB0ZXh0dXJlWCA9IHRleHR1cmVYTm9kZS52YWx1ZTtcclxuXHRcdGNvbnN0IHRleHR1cmVZID0gdGV4dHVyZVlOb2RlICE9PSBudWxsID8gdGV4dHVyZVlOb2RlLnZhbHVlIDogdGV4dHVyZVg7XHJcblx0XHRjb25zdCB0ZXh0dXJlWiA9IHRleHR1cmVaTm9kZSAhPT0gbnVsbCA/IHRleHR1cmVaTm9kZS52YWx1ZSA6IHRleHR1cmVYO1xyXG5cclxuXHRcdGNvbnN0IGN4ID0gdGV4dHVyZSggdGV4dHVyZVgsIHR4ICkubXVsKCBiZi54ICk7XHJcblx0XHRjb25zdCBjeSA9IHRleHR1cmUoIHRleHR1cmVZLCB0eSApLm11bCggYmYueSApO1xyXG5cdFx0Y29uc3QgY3ogPSB0ZXh0dXJlKCB0ZXh0dXJlWiwgdHogKS5tdWwoIGJmLnogKTtcclxuXHJcblx0XHRyZXR1cm4gYWRkKCBjeCwgY3ksIGN6ICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFRyaXBsYW5hclRleHR1cmVzTm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgdHJpcGxhbmFyIHRleHR1cmVzIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZX0gdGV4dHVyZVhOb2RlIC0gRmlyc3QgdGV4dHVyZSBub2RlLlxyXG4gKiBAcGFyYW0gez9Ob2RlfSBbdGV4dHVyZVlOb2RlPW51bGxdIC0gU2Vjb25kIHRleHR1cmUgbm9kZS4gV2hlbiBub3Qgc2V0LCB0aGUgc2hhZGVyIHdpbGwgc2FtcGxlIGZyb20gYHRleHR1cmVYTm9kZWAgaW5zdGVhZC5cclxuICogQHBhcmFtIHs/Tm9kZX0gW3RleHR1cmVaTm9kZT1udWxsXSAtIFRoaXJkIHRleHR1cmUgbm9kZS4gV2hlbiBub3Qgc2V0LCB0aGUgc2hhZGVyIHdpbGwgc2FtcGxlIGZyb20gYHRleHR1cmVYTm9kZWAgaW5zdGVhZC5cclxuICogQHBhcmFtIHs/Tm9kZTxmbG9hdD59IFtzY2FsZU5vZGU9ZmxvYXQoMSldIC0gVGhlIHNjYWxlIG5vZGUuXHJcbiAqIEBwYXJhbSB7P05vZGU8dmVjMz59IFtwb3NpdGlvbk5vZGU9cG9zaXRpb25Mb2NhbF0gLSBWZXJ0ZXggcG9zaXRpb25zIGluIGxvY2FsIHNwYWNlLlxyXG4gKiBAcGFyYW0gez9Ob2RlPHZlYzM+fSBbbm9ybWFsTm9kZT1ub3JtYWxMb2NhbF0gLSBOb3JtYWxzIGluIGxvY2FsIHNwYWNlLlxyXG4gKiBAcmV0dXJucyB7VHJpcGxhbmFyVGV4dHVyZXNOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHRyaXBsYW5hclRleHR1cmVzID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIFRyaXBsYW5hclRleHR1cmVzTm9kZSApLnNldFBhcmFtZXRlckxlbmd0aCggMSwgNiApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSB0cmlwbGFuYXIgdGV4dHVyZXMgbm9kZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlfSB0ZXh0dXJlWE5vZGUgLSBGaXJzdCB0ZXh0dXJlIG5vZGUuXHJcbiAqIEBwYXJhbSB7P05vZGV9IFt0ZXh0dXJlWU5vZGU9bnVsbF0gLSBTZWNvbmQgdGV4dHVyZSBub2RlLiBXaGVuIG5vdCBzZXQsIHRoZSBzaGFkZXIgd2lsbCBzYW1wbGUgZnJvbSBgdGV4dHVyZVhOb2RlYCBpbnN0ZWFkLlxyXG4gKiBAcGFyYW0gez9Ob2RlfSBbdGV4dHVyZVpOb2RlPW51bGxdIC0gVGhpcmQgdGV4dHVyZSBub2RlLiBXaGVuIG5vdCBzZXQsIHRoZSBzaGFkZXIgd2lsbCBzYW1wbGUgZnJvbSBgdGV4dHVyZVhOb2RlYCBpbnN0ZWFkLlxyXG4gKiBAcGFyYW0gez9Ob2RlPGZsb2F0Pn0gW3NjYWxlTm9kZT1mbG9hdCgxKV0gLSBUaGUgc2NhbGUgbm9kZS5cclxuICogQHBhcmFtIHs/Tm9kZTx2ZWMzPn0gW3Bvc2l0aW9uTm9kZT1wb3NpdGlvbkxvY2FsXSAtIFZlcnRleCBwb3NpdGlvbnMgaW4gbG9jYWwgc3BhY2UuXHJcbiAqIEBwYXJhbSB7P05vZGU8dmVjMz59IFtub3JtYWxOb2RlPW5vcm1hbExvY2FsXSAtIE5vcm1hbHMgaW4gbG9jYWwgc3BhY2UuXHJcbiAqIEByZXR1cm5zIHtUcmlwbGFuYXJUZXh0dXJlc05vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdHJpcGxhbmFyVGV4dHVyZSA9ICggLi4ucGFyYW1zICkgPT4gdHJpcGxhbmFyVGV4dHVyZXMoIC4uLnBhcmFtcyApO1xyXG4iLCJpbXBvcnQgTm9kZSBmcm9tICcuLi9jb3JlL05vZGUuanMnO1xyXG5pbXBvcnQgVGV4dHVyZU5vZGUgZnJvbSAnLi4vYWNjZXNzb3JzL1RleHR1cmVOb2RlLmpzJztcclxuaW1wb3J0IHsgbm9kZU9iamVjdCB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuaW1wb3J0IHsgTm9kZVVwZGF0ZVR5cGUgfSBmcm9tICcuLi9jb3JlL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IHNjcmVlblVWIH0gZnJvbSAnLi4vZGlzcGxheS9TY3JlZW5Ob2RlLmpzJztcclxuXHJcbmltcG9ydCB7IEhhbGZGbG9hdFR5cGUsIExpbmVhck1pcE1hcExpbmVhckZpbHRlciwgV2ViR1BVQ29vcmRpbmF0ZVN5c3RlbSB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IFBsYW5lIH0gZnJvbSAnLi4vLi4vbWF0aC9QbGFuZS5qcyc7XHJcbmltcG9ydCB7IE9iamVjdDNEIH0gZnJvbSAnLi4vLi4vY29yZS9PYmplY3QzRC5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjIuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yNCB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yNC5qcyc7XHJcbmltcG9ydCB7IE1hdHJpeDQgfSBmcm9tICcuLi8uLi9tYXRoL01hdHJpeDQuanMnO1xyXG5pbXBvcnQgeyBSZW5kZXJUYXJnZXQgfSBmcm9tICcuLi8uLi9jb3JlL1JlbmRlclRhcmdldC5qcyc7XHJcbmltcG9ydCB7IERlcHRoVGV4dHVyZSB9IGZyb20gJy4uLy4uL3RleHR1cmVzL0RlcHRoVGV4dHVyZS5qcyc7XHJcblxyXG5jb25zdCBfcmVmbGVjdG9yUGxhbmUgPSBuZXcgUGxhbmUoKTtcclxuY29uc3QgX25vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF9yZWZsZWN0b3JXb3JsZFBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX2NhbWVyYVdvcmxkUG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfcm90YXRpb25NYXRyaXggPSBuZXcgTWF0cml4NCgpO1xyXG5jb25zdCBfbG9va0F0UG9zaXRpb24gPSBuZXcgVmVjdG9yMyggMCwgMCwgLSAxICk7XHJcbmNvbnN0IGNsaXBQbGFuZSA9IG5ldyBWZWN0b3I0KCk7XHJcblxyXG5jb25zdCBfdmlldyA9IG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF90YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfcSA9IG5ldyBWZWN0b3I0KCk7XHJcblxyXG5jb25zdCBfc2l6ZSA9IG5ldyBWZWN0b3IyKCk7XHJcblxyXG5jb25zdCBfZGVmYXVsdFJUID0gbmV3IFJlbmRlclRhcmdldCgpO1xyXG5jb25zdCBfZGVmYXVsdFVWID0gc2NyZWVuVVYuZmxpcFgoKTtcclxuXHJcbl9kZWZhdWx0UlQuZGVwdGhUZXh0dXJlID0gbmV3IERlcHRoVGV4dHVyZSggMSwgMSApO1xyXG5cclxubGV0IF9pblJlZmxlY3RvciA9IGZhbHNlO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgbm9kZSBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgbWlycm9yLWxpa2UgZmxhdCByZWZsZWN0aXZlIHN1cmZhY2VzLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBncm91bmRSZWZsZWN0b3IgPSByZWZsZWN0b3IoKTtcclxuICogbWF0ZXJpYWwuY29sb3JOb2RlID0gZ3JvdW5kUmVmbGVjdG9yO1xyXG4gKlxyXG4gKiBjb25zdCBwbGFuZSA9IG5ldyBNZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuICogcGxhbmUuYWRkKCBncm91bmRSZWZsZWN0b3IudGFyZ2V0ICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgVGV4dHVyZU5vZGVcclxuICovXHJcbmNsYXNzIFJlZmxlY3Rvck5vZGUgZXh0ZW5kcyBUZXh0dXJlTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ1JlZmxlY3Rvck5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcmVmbGVjdG9yIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtZXRlcnM9e31dIC0gQW4gb2JqZWN0IGhvbGRpbmcgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0M0R9IFtwYXJhbWV0ZXJzLnRhcmdldD1uZXcgT2JqZWN0M0QoKV0gLSBUaGUgM0Qgb2JqZWN0IHRoZSByZWZsZWN0b3IgaXMgbGlua2VkIHRvLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbcGFyYW1ldGVycy5yZXNvbHV0aW9uPTFdIC0gVGhlIHJlc29sdXRpb24gc2NhbGUuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbcGFyYW1ldGVycy5nZW5lcmF0ZU1pcG1hcHM9ZmFsc2VdIC0gV2hldGhlciBtaXBtYXBzIHNob3VsZCBiZSBnZW5lcmF0ZWQgb3Igbm90LlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BhcmFtZXRlcnMuYm91bmNlcz10cnVlXSAtIFdoZXRoZXIgcmVmbGVjdG9ycyBjYW4gcmVuZGVyIG90aGVyIHJlZmxlY3RvciBub2RlcyBvciBub3QuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbcGFyYW1ldGVycy5kZXB0aD1mYWxzZV0gLSBXaGV0aGVyIGRlcHRoIGRhdGEgc2hvdWxkIGJlIGdlbmVyYXRlZCBvciBub3QuXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlTm9kZX0gW3BhcmFtZXRlcnMuZGVmYXVsdFRleHR1cmVdIC0gVGhlIGRlZmF1bHQgdGV4dHVyZSBub2RlLlxyXG5cdCAqIEBwYXJhbSB7UmVmbGVjdG9yQmFzZU5vZGV9IFtwYXJhbWV0ZXJzLnJlZmxlY3Rvcl0gLSBUaGUgcmVmbGVjdG9yIGJhc2Ugbm9kZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVycyA9IHt9ICkge1xyXG5cclxuXHRcdHN1cGVyKCBwYXJhbWV0ZXJzLmRlZmF1bHRUZXh0dXJlIHx8IF9kZWZhdWx0UlQudGV4dHVyZSwgX2RlZmF1bHRVViApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIGludGVybmFsIHJlZmxlY3RvciBiYXNlIG5vZGUgd2hpY2ggaG9sZHMgdGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge1JlZmxlY3RvckJhc2VOb2RlfVxyXG5cdFx0ICogQGRlZmF1bHQgUmVmbGVjdG9yQmFzZU5vZGVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fcmVmbGVjdG9yQmFzZU5vZGUgPSBwYXJhbWV0ZXJzLnJlZmxlY3RvciB8fCBuZXcgUmVmbGVjdG9yQmFzZU5vZGUoIHRoaXMsIHBhcmFtZXRlcnMgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIHRoZSBpbnRlcm5hbCBkZXB0aCBub2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7P05vZGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX2RlcHRoTm9kZSA9IG51bGw7XHJcblxyXG5cdFx0dGhpcy5zZXRVcGRhdGVNYXRyaXgoIGZhbHNlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQSByZWZlcmVuY2UgdG8gdGhlIGludGVybmFsIHJlZmxlY3RvciBub2RlLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge1JlZmxlY3RvckJhc2VOb2RlfVxyXG5cdCAqL1xyXG5cdGdldCByZWZsZWN0b3IoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX3JlZmxlY3RvckJhc2VOb2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEEgcmVmZXJlbmNlIHRvIDNEIG9iamVjdCB0aGUgcmVmbGVjdG9yIGlzIGxpbmtlZCB0by5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtPYmplY3QzRH1cclxuXHQgKi9cclxuXHRnZXQgdGFyZ2V0KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9yZWZsZWN0b3JCYXNlTm9kZS50YXJnZXQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIG5vZGUgcmVwcmVzZW50aW5nIHRoZSBtaXJyb3IncyBkZXB0aC4gVGhhdCBjYW4gYmUgdXNlZFxyXG5cdCAqIHRvIGltcGxlbWVudCBtb3JlIGFkdmFuY2VkIHJlZmxlY3Rpb24gZWZmZWN0cyBsaWtlIGRpc3RhbmNlIGF0dGVudWF0aW9uLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Tm9kZX0gVGhlIGRlcHRoIG5vZGUuXHJcblx0ICovXHJcblx0Z2V0RGVwdGhOb2RlKCkge1xyXG5cclxuXHRcdGlmICggdGhpcy5fZGVwdGhOb2RlID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLl9yZWZsZWN0b3JCYXNlTm9kZS5kZXB0aCAhPT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuUmVmbGVjdG9yTm9kZTogRGVwdGggbm9kZSBjYW4gb25seSBiZSByZXF1ZXN0ZWQgd2hlbiB0aGUgcmVmbGVjdG9yIGlzIGNyZWF0ZWQgd2l0aCB7IGRlcHRoOiB0cnVlIH0uICcgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuX2RlcHRoTm9kZSA9IG5vZGVPYmplY3QoIG5ldyBSZWZsZWN0b3JOb2RlKCB7XHJcblx0XHRcdFx0ZGVmYXVsdFRleHR1cmU6IF9kZWZhdWx0UlQuZGVwdGhUZXh0dXJlLFxyXG5cdFx0XHRcdHJlZmxlY3RvcjogdGhpcy5fcmVmbGVjdG9yQmFzZU5vZGVcclxuXHRcdFx0fSApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzLl9kZXB0aE5vZGU7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXAoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Ly8gaWdub3JlIGlmIHVzZWQgaW4gcG9zdC1wcm9jZXNzaW5nXHJcblx0XHRpZiAoICEgYnVpbGRlci5vYmplY3QuaXNRdWFkTWVzaCApIHRoaXMuX3JlZmxlY3RvckJhc2VOb2RlLmJ1aWxkKCBidWlsZGVyICk7XHJcblxyXG5cdFx0cmV0dXJuIHN1cGVyLnNldHVwKCBidWlsZGVyICk7XHJcblxyXG5cdH1cclxuXHJcblx0Y2xvbmUoKSB7XHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZSA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLnJlZmxlY3Rvck5vZGUgKTtcclxuXHRcdHRleHR1cmUuX3JlZmxlY3RvckJhc2VOb2RlID0gdGhpcy5fcmVmbGVjdG9yQmFzZU5vZGU7XHJcblxyXG5cdFx0cmV0dXJuIHRleHR1cmU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBIb2xkcyB0aGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSByZWZsZWN0b3IuXHJcbiAqXHJcbiAqIFRPRE86IEV4cGxhaW4gd2h5IGBSZWZsZWN0b3JCYXNlTm9kZWAuIE9yaWdpbmFsbHkgdGhlIGVudGlyZSBsb2dpYyB3YXMgaW1wbGVtZW50ZWRcclxuICogaW4gYFJlZmxlY3Rvck5vZGVgLCBzZWUgIzI5NjE5LlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAYXVnbWVudHMgTm9kZVxyXG4gKi9cclxuY2xhc3MgUmVmbGVjdG9yQmFzZU5vZGUgZXh0ZW5kcyBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnUmVmbGVjdG9yQmFzZU5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcmVmbGVjdG9yIGJhc2Ugbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZU5vZGV9IHRleHR1cmVOb2RlIC0gUmVwcmVzZW50cyB0aGUgcmVuZGVyZWQgcmVmbGVjdGlvbnMgYXMgYSB0ZXh0dXJlIG5vZGUuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbWV0ZXJzPXt9XSAtIEFuIG9iamVjdCBob2xkaW5nIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy5cclxuXHQgKiBAcGFyYW0ge09iamVjdDNEfSBbcGFyYW1ldGVycy50YXJnZXQ9bmV3IE9iamVjdDNEKCldIC0gVGhlIDNEIG9iamVjdCB0aGUgcmVmbGVjdG9yIGlzIGxpbmtlZCB0by5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3BhcmFtZXRlcnMucmVzb2x1dGlvbj0xXSAtIFRoZSByZXNvbHV0aW9uIHNjYWxlLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BhcmFtZXRlcnMuZ2VuZXJhdGVNaXBtYXBzPWZhbHNlXSAtIFdoZXRoZXIgbWlwbWFwcyBzaG91bGQgYmUgZ2VuZXJhdGVkIG9yIG5vdC5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtwYXJhbWV0ZXJzLmJvdW5jZXM9dHJ1ZV0gLSBXaGV0aGVyIHJlZmxlY3RvcnMgY2FuIHJlbmRlciBvdGhlciByZWZsZWN0b3Igbm9kZXMgb3Igbm90LlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BhcmFtZXRlcnMuZGVwdGg9ZmFsc2VdIC0gV2hldGhlciBkZXB0aCBkYXRhIHNob3VsZCBiZSBnZW5lcmF0ZWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCB0ZXh0dXJlTm9kZSwgcGFyYW1ldGVycyA9IHt9ICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0Y29uc3Qge1xyXG5cdFx0XHR0YXJnZXQgPSBuZXcgT2JqZWN0M0QoKSxcclxuXHRcdFx0cmVzb2x1dGlvbiA9IDEsXHJcblx0XHRcdGdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlLFxyXG5cdFx0XHRib3VuY2VzID0gdHJ1ZSxcclxuXHRcdFx0ZGVwdGggPSBmYWxzZVxyXG5cdFx0fSA9IHBhcmFtZXRlcnM7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXByZXNlbnRzIHRoZSByZW5kZXJlZCByZWZsZWN0aW9ucyBhcyBhIHRleHR1cmUgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VGV4dHVyZU5vZGV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudGV4dHVyZU5vZGUgPSB0ZXh0dXJlTm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSAzRCBvYmplY3QgdGhlIHJlZmxlY3RvciBpcyBsaW5rZWQgdG8uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdDNEfVxyXG5cdFx0ICogQGRlZmF1bHQge25ldyBPYmplY3QzRCgpfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRhcmdldCA9IHRhcmdldDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByZXNvbHV0aW9uIHNjYWxlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCB7MX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yZXNvbHV0aW9uID0gcmVzb2x1dGlvbjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgbWlwbWFwcyBzaG91bGQgYmUgZ2VuZXJhdGVkIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHtmYWxzZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSBnZW5lcmF0ZU1pcG1hcHM7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHJlZmxlY3RvcnMgY2FuIHJlbmRlciBvdGhlciByZWZsZWN0b3Igbm9kZXMgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQge3RydWV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYm91bmNlcyA9IGJvdW5jZXM7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIGRlcHRoIGRhdGEgc2hvdWxkIGJlIGdlbmVyYXRlZCBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB7ZmFsc2V9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGVwdGggPSBkZXB0aDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBgdXBkYXRlQmVmb3JlVHlwZWAgaXMgc2V0IHRvIGBOb2RlVXBkYXRlVHlwZS5SRU5ERVJgIHdoZW4ge0BsaW5rIFJlZmxlY3RvckJhc2VOb2RlI2JvdW5jZXN9XHJcblx0XHQgKiBpcyBgdHJ1ZWAuIE90aGVyd2lzZSBpdCdzIGBOb2RlVXBkYXRlVHlwZS5GUkFNRWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqIEBkZWZhdWx0ICdyZW5kZXInXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXBkYXRlQmVmb3JlVHlwZSA9IGJvdW5jZXMgPyBOb2RlVXBkYXRlVHlwZS5SRU5ERVIgOiBOb2RlVXBkYXRlVHlwZS5GUkFNRTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdlYWsgbWFwIGZvciBtYW5hZ2luZyB2aXJ0dWFsIGNhbWVyYXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1dlYWtNYXA8Q2FtZXJhLCBDYW1lcmE+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnZpcnR1YWxDYW1lcmFzID0gbmV3IFdlYWtNYXAoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdlYWsgbWFwIGZvciBtYW5hZ2luZyByZW5kZXIgdGFyZ2V0cy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2Vha01hcDxDYW1lcmEsIFJlbmRlclRhcmdldD59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0cyA9IG5ldyBXZWFrTWFwKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBGb3JjZSByZW5kZXIgZXZlbiBpZiByZWZsZWN0b3IgaXMgZmFjaW5nIGF3YXkgZnJvbSBjYW1lcmEuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB7ZmFsc2V9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZm9yY2VVcGRhdGUgPSBmYWxzZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoZSByZXNvbHV0aW9uIG9mIHRoZSBpbnRlcm5hbCByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge1JlbmRlclRhcmdldH0gcmVuZGVyVGFyZ2V0IC0gVGhlIHJlbmRlciB0YXJnZXQgdG8gcmVzaXplLlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyIHRoYXQgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIG5ldyBzaXplLlxyXG5cdCAqL1xyXG5cdF91cGRhdGVSZXNvbHV0aW9uKCByZW5kZXJUYXJnZXQsIHJlbmRlcmVyICkge1xyXG5cclxuXHRcdGNvbnN0IHJlc29sdXRpb24gPSB0aGlzLnJlc29sdXRpb247XHJcblxyXG5cdFx0cmVuZGVyZXIuZ2V0RHJhd2luZ0J1ZmZlclNpemUoIF9zaXplICk7XHJcblxyXG5cdFx0cmVuZGVyVGFyZ2V0LnNldFNpemUoIE1hdGgucm91bmQoIF9zaXplLndpZHRoICogcmVzb2x1dGlvbiApLCBNYXRoLnJvdW5kKCBfc2l6ZS5oZWlnaHQgKiByZXNvbHV0aW9uICkgKTtcclxuXHJcblx0fVxyXG5cclxuXHRzZXR1cCggYnVpbGRlciApIHtcclxuXHJcblx0XHR0aGlzLl91cGRhdGVSZXNvbHV0aW9uKCBfZGVmYXVsdFJULCBidWlsZGVyLnJlbmRlcmVyICk7XHJcblxyXG5cdFx0cmV0dXJuIHN1cGVyLnNldHVwKCBidWlsZGVyICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIHZpcnR1YWwgY2FtZXJhIGZvciB0aGUgZ2l2ZW4gY2FtZXJhLiBUaGUgdmlydHVhbCBjYW1lcmEgaXMgdXNlZCB0b1xyXG5cdCAqIHJlbmRlciB0aGUgc2NlbmUgZnJvbSB0aGUgcmVmbGVjdG9yJ3MgdmlldyBzbyBjb3JyZWN0IHJlZmxlY3Rpb25zIGNhbiBiZSBwcm9kdWNlZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Q2FtZXJhfSBjYW1lcmEgLSBUaGUgc2NlbmUncyBjYW1lcmEuXHJcblx0ICogQHJldHVybiB7Q2FtZXJhfSBUaGUgY29ycmVzcG9uZGluZyB2aXJ0dWFsIGNhbWVyYS5cclxuXHQgKi9cclxuXHRnZXRWaXJ0dWFsQ2FtZXJhKCBjYW1lcmEgKSB7XHJcblxyXG5cdFx0bGV0IHZpcnR1YWxDYW1lcmEgPSB0aGlzLnZpcnR1YWxDYW1lcmFzLmdldCggY2FtZXJhICk7XHJcblxyXG5cdFx0aWYgKCB2aXJ0dWFsQ2FtZXJhID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHR2aXJ0dWFsQ2FtZXJhID0gY2FtZXJhLmNsb25lKCk7XHJcblxyXG5cdFx0XHR0aGlzLnZpcnR1YWxDYW1lcmFzLnNldCggY2FtZXJhLCB2aXJ0dWFsQ2FtZXJhICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB2aXJ0dWFsQ2FtZXJhO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSByZW5kZXIgdGFyZ2V0IGZvciB0aGUgZ2l2ZW4gY2FtZXJhLiBUaGUgcmVmbGVjdGlvbnMgYXJlIHJlbmRlcmVkXHJcblx0ICogaW50byB0aGlzIHJlbmRlciB0YXJnZXQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0NhbWVyYX0gY2FtZXJhIC0gVGhlIHNjZW5lJ3MgY2FtZXJhLlxyXG5cdCAqIEByZXR1cm4ge1JlbmRlclRhcmdldH0gVGhlIHJlbmRlciB0YXJnZXQuXHJcblx0ICovXHJcblx0Z2V0UmVuZGVyVGFyZ2V0KCBjYW1lcmEgKSB7XHJcblxyXG5cdFx0bGV0IHJlbmRlclRhcmdldCA9IHRoaXMucmVuZGVyVGFyZ2V0cy5nZXQoIGNhbWVyYSApO1xyXG5cclxuXHRcdGlmICggcmVuZGVyVGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRyZW5kZXJUYXJnZXQgPSBuZXcgUmVuZGVyVGFyZ2V0KCAwLCAwLCB7IHR5cGU6IEhhbGZGbG9hdFR5cGUgfSApO1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLmdlbmVyYXRlTWlwbWFwcyA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0cmVuZGVyVGFyZ2V0LnRleHR1cmUubWluRmlsdGVyID0gTGluZWFyTWlwTWFwTGluZWFyRmlsdGVyO1xyXG5cdFx0XHRcdHJlbmRlclRhcmdldC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IHRydWU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMuZGVwdGggPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUgPSBuZXcgRGVwdGhUZXh0dXJlKCk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0aGlzLnJlbmRlclRhcmdldHMuc2V0KCBjYW1lcmEsIHJlbmRlclRhcmdldCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcmVuZGVyVGFyZ2V0O1xyXG5cclxuXHR9XHJcblxyXG5cdHVwZGF0ZUJlZm9yZSggZnJhbWUgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmJvdW5jZXMgPT09IGZhbHNlICYmIF9pblJlZmxlY3RvciApIHJldHVybiBmYWxzZTtcclxuXHJcblx0XHRfaW5SZWZsZWN0b3IgPSB0cnVlO1xyXG5cclxuXHRcdGNvbnN0IHsgc2NlbmUsIGNhbWVyYSwgcmVuZGVyZXIsIG1hdGVyaWFsIH0gPSBmcmFtZTtcclxuXHRcdGNvbnN0IHsgdGFyZ2V0IH0gPSB0aGlzO1xyXG5cclxuXHRcdGNvbnN0IHZpcnR1YWxDYW1lcmEgPSB0aGlzLmdldFZpcnR1YWxDYW1lcmEoIGNhbWVyYSApO1xyXG5cdFx0Y29uc3QgcmVuZGVyVGFyZ2V0ID0gdGhpcy5nZXRSZW5kZXJUYXJnZXQoIHZpcnR1YWxDYW1lcmEgKTtcclxuXHJcblx0XHRyZW5kZXJlci5nZXREcmF3aW5nQnVmZmVyU2l6ZSggX3NpemUgKTtcclxuXHJcblx0XHR0aGlzLl91cGRhdGVSZXNvbHV0aW9uKCByZW5kZXJUYXJnZXQsIHJlbmRlcmVyICk7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRfcmVmbGVjdG9yV29ybGRQb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRhcmdldC5tYXRyaXhXb3JsZCApO1xyXG5cdFx0X2NhbWVyYVdvcmxkUG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBjYW1lcmEubWF0cml4V29ybGQgKTtcclxuXHJcblx0XHRfcm90YXRpb25NYXRyaXguZXh0cmFjdFJvdGF0aW9uKCB0YXJnZXQubWF0cml4V29ybGQgKTtcclxuXHJcblx0XHRfbm9ybWFsLnNldCggMCwgMCwgMSApO1xyXG5cdFx0X25vcm1hbC5hcHBseU1hdHJpeDQoIF9yb3RhdGlvbk1hdHJpeCApO1xyXG5cclxuXHRcdF92aWV3LnN1YlZlY3RvcnMoIF9yZWZsZWN0b3JXb3JsZFBvc2l0aW9uLCBfY2FtZXJhV29ybGRQb3NpdGlvbiApO1xyXG5cclxuXHRcdC8vIEF2b2lkIHJlbmRlcmluZyB3aGVuIHJlZmxlY3RvciBpcyBmYWNpbmcgYXdheSB1bmxlc3MgZm9yY2luZyBhbiB1cGRhdGVcclxuXHRcdGNvbnN0IGlzRmFjaW5nQXdheSA9IF92aWV3LmRvdCggX25vcm1hbCApID4gMDtcclxuXHJcblx0XHRpZiAoIGlzRmFjaW5nQXdheSA9PT0gdHJ1ZSAmJiB0aGlzLmZvcmNlVXBkYXRlID09PSBmYWxzZSApIHJldHVybjtcclxuXHJcblx0XHRfdmlldy5yZWZsZWN0KCBfbm9ybWFsICkubmVnYXRlKCk7XHJcblx0XHRfdmlldy5hZGQoIF9yZWZsZWN0b3JXb3JsZFBvc2l0aW9uICk7XHJcblxyXG5cdFx0X3JvdGF0aW9uTWF0cml4LmV4dHJhY3RSb3RhdGlvbiggY2FtZXJhLm1hdHJpeFdvcmxkICk7XHJcblxyXG5cdFx0X2xvb2tBdFBvc2l0aW9uLnNldCggMCwgMCwgLSAxICk7XHJcblx0XHRfbG9va0F0UG9zaXRpb24uYXBwbHlNYXRyaXg0KCBfcm90YXRpb25NYXRyaXggKTtcclxuXHRcdF9sb29rQXRQb3NpdGlvbi5hZGQoIF9jYW1lcmFXb3JsZFBvc2l0aW9uICk7XHJcblxyXG5cdFx0X3RhcmdldC5zdWJWZWN0b3JzKCBfcmVmbGVjdG9yV29ybGRQb3NpdGlvbiwgX2xvb2tBdFBvc2l0aW9uICk7XHJcblx0XHRfdGFyZ2V0LnJlZmxlY3QoIF9ub3JtYWwgKS5uZWdhdGUoKTtcclxuXHRcdF90YXJnZXQuYWRkKCBfcmVmbGVjdG9yV29ybGRQb3NpdGlvbiApO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0dmlydHVhbENhbWVyYS5jb29yZGluYXRlU3lzdGVtID0gY2FtZXJhLmNvb3JkaW5hdGVTeXN0ZW07XHJcblx0XHR2aXJ0dWFsQ2FtZXJhLnBvc2l0aW9uLmNvcHkoIF92aWV3ICk7XHJcblx0XHR2aXJ0dWFsQ2FtZXJhLnVwLnNldCggMCwgMSwgMCApO1xyXG5cdFx0dmlydHVhbENhbWVyYS51cC5hcHBseU1hdHJpeDQoIF9yb3RhdGlvbk1hdHJpeCApO1xyXG5cdFx0dmlydHVhbENhbWVyYS51cC5yZWZsZWN0KCBfbm9ybWFsICk7XHJcblx0XHR2aXJ0dWFsQ2FtZXJhLmxvb2tBdCggX3RhcmdldCApO1xyXG5cclxuXHRcdHZpcnR1YWxDYW1lcmEubmVhciA9IGNhbWVyYS5uZWFyO1xyXG5cdFx0dmlydHVhbENhbWVyYS5mYXIgPSBjYW1lcmEuZmFyO1xyXG5cclxuXHRcdHZpcnR1YWxDYW1lcmEudXBkYXRlTWF0cml4V29ybGQoKTtcclxuXHRcdHZpcnR1YWxDYW1lcmEucHJvamVjdGlvbk1hdHJpeC5jb3B5KCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeCApO1xyXG5cclxuXHRcdC8vIE5vdyB1cGRhdGUgcHJvamVjdGlvbiBtYXRyaXggd2l0aCBuZXcgY2xpcCBwbGFuZSwgaW1wbGVtZW50aW5nIGNvZGUgZnJvbTogaHR0cDovL3d3dy50ZXJhdGhvbi5jb20vY29kZS9vYmxpcXVlLmh0bWxcclxuXHRcdC8vIFBhcGVyIGV4cGxhaW5pbmcgdGhpcyB0ZWNobmlxdWU6IGh0dHA6Ly93d3cudGVyYXRob24uY29tL2xlbmd5ZWwvTGVuZ3llbC1PYmxpcXVlLnBkZlxyXG5cdFx0X3JlZmxlY3RvclBsYW5lLnNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50KCBfbm9ybWFsLCBfcmVmbGVjdG9yV29ybGRQb3NpdGlvbiApO1xyXG5cdFx0X3JlZmxlY3RvclBsYW5lLmFwcGx5TWF0cml4NCggdmlydHVhbENhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UgKTtcclxuXHJcblx0XHRjbGlwUGxhbmUuc2V0KCBfcmVmbGVjdG9yUGxhbmUubm9ybWFsLngsIF9yZWZsZWN0b3JQbGFuZS5ub3JtYWwueSwgX3JlZmxlY3RvclBsYW5lLm5vcm1hbC56LCBfcmVmbGVjdG9yUGxhbmUuY29uc3RhbnQgKTtcclxuXHJcblx0XHRjb25zdCBwcm9qZWN0aW9uTWF0cml4ID0gdmlydHVhbENhbWVyYS5wcm9qZWN0aW9uTWF0cml4O1xyXG5cclxuXHRcdF9xLnggPSAoIE1hdGguc2lnbiggY2xpcFBsYW5lLnggKSArIHByb2plY3Rpb25NYXRyaXguZWxlbWVudHNbIDggXSApIC8gcHJvamVjdGlvbk1hdHJpeC5lbGVtZW50c1sgMCBdO1xyXG5cdFx0X3EueSA9ICggTWF0aC5zaWduKCBjbGlwUGxhbmUueSApICsgcHJvamVjdGlvbk1hdHJpeC5lbGVtZW50c1sgOSBdICkgLyBwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWyA1IF07XHJcblx0XHRfcS56ID0gLSAxLjA7XHJcblx0XHRfcS53ID0gKCAxLjAgKyBwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWyAxMCBdICkgLyBwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWyAxNCBdO1xyXG5cclxuXHRcdC8vIENhbGN1bGF0ZSB0aGUgc2NhbGVkIHBsYW5lIHZlY3RvclxyXG5cdFx0Y2xpcFBsYW5lLm11bHRpcGx5U2NhbGFyKCAxLjAgLyBjbGlwUGxhbmUuZG90KCBfcSApICk7XHJcblxyXG5cdFx0Y29uc3QgY2xpcEJpYXMgPSAwO1xyXG5cclxuXHRcdC8vIFJlcGxhY2luZyB0aGUgdGhpcmQgcm93IG9mIHRoZSBwcm9qZWN0aW9uIG1hdHJpeFxyXG5cdFx0cHJvamVjdGlvbk1hdHJpeC5lbGVtZW50c1sgMiBdID0gY2xpcFBsYW5lLng7XHJcblx0XHRwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWyA2IF0gPSBjbGlwUGxhbmUueTtcclxuXHRcdHByb2plY3Rpb25NYXRyaXguZWxlbWVudHNbIDEwIF0gPSAoIHJlbmRlcmVyLmNvb3JkaW5hdGVTeXN0ZW0gPT09IFdlYkdQVUNvb3JkaW5hdGVTeXN0ZW0gKSA/ICggY2xpcFBsYW5lLnogLSBjbGlwQmlhcyApIDogKCBjbGlwUGxhbmUueiArIDEuMCAtIGNsaXBCaWFzICk7XHJcblx0XHRwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWyAxNCBdID0gY2xpcFBsYW5lLnc7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHR0aGlzLnRleHR1cmVOb2RlLnZhbHVlID0gcmVuZGVyVGFyZ2V0LnRleHR1cmU7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmRlcHRoID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0dGhpcy50ZXh0dXJlTm9kZS5nZXREZXB0aE5vZGUoKS52YWx1ZSA9IHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdG1hdGVyaWFsLnZpc2libGUgPSBmYWxzZTtcclxuXHJcblx0XHRjb25zdCBjdXJyZW50UmVuZGVyVGFyZ2V0ID0gcmVuZGVyZXIuZ2V0UmVuZGVyVGFyZ2V0KCk7XHJcblx0XHRjb25zdCBjdXJyZW50TVJUID0gcmVuZGVyZXIuZ2V0TVJUKCk7XHJcblx0XHRjb25zdCBjdXJyZW50QXV0b0NsZWFyID0gcmVuZGVyZXIuYXV0b0NsZWFyO1xyXG5cclxuXHRcdHJlbmRlcmVyLnNldE1SVCggbnVsbCApO1xyXG5cdFx0cmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQgKTtcclxuXHRcdHJlbmRlcmVyLmF1dG9DbGVhciA9IHRydWU7XHJcblxyXG5cdFx0cmVuZGVyZXIucmVuZGVyKCBzY2VuZSwgdmlydHVhbENhbWVyYSApO1xyXG5cclxuXHRcdHJlbmRlcmVyLnNldE1SVCggY3VycmVudE1SVCApO1xyXG5cdFx0cmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCBjdXJyZW50UmVuZGVyVGFyZ2V0ICk7XHJcblx0XHRyZW5kZXJlci5hdXRvQ2xlYXIgPSBjdXJyZW50QXV0b0NsZWFyO1xyXG5cclxuXHRcdG1hdGVyaWFsLnZpc2libGUgPSB0cnVlO1xyXG5cclxuXHRcdF9pblJlZmxlY3RvciA9IGZhbHNlO1xyXG5cclxuXHRcdHRoaXMuZm9yY2VVcGRhdGUgPSBmYWxzZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSByZWZsZWN0b3Igbm9kZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbWV0ZXJzPXt9XSAtIEFuIG9iamVjdCBob2xkaW5nIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy5cclxuICogQHBhcmFtIHtPYmplY3QzRH0gW3BhcmFtZXRlcnMudGFyZ2V0PW5ldyBPYmplY3QzRCgpXSAtIFRoZSAzRCBvYmplY3QgdGhlIHJlZmxlY3RvciBpcyBsaW5rZWQgdG8uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbcGFyYW1ldGVycy5yZXNvbHV0aW9uPTFdIC0gVGhlIHJlc29sdXRpb24gc2NhbGUuXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BhcmFtZXRlcnMuZ2VuZXJhdGVNaXBtYXBzPWZhbHNlXSAtIFdoZXRoZXIgbWlwbWFwcyBzaG91bGQgYmUgZ2VuZXJhdGVkIG9yIG5vdC5cclxuICogQHBhcmFtIHtib29sZWFufSBbcGFyYW1ldGVycy5ib3VuY2VzPXRydWVdIC0gV2hldGhlciByZWZsZWN0b3JzIGNhbiByZW5kZXIgb3RoZXIgcmVmbGVjdG9yIG5vZGVzIG9yIG5vdC5cclxuICogQHBhcmFtIHtib29sZWFufSBbcGFyYW1ldGVycy5kZXB0aD1mYWxzZV0gLSBXaGV0aGVyIGRlcHRoIGRhdGEgc2hvdWxkIGJlIGdlbmVyYXRlZCBvciBub3QuXHJcbiAqIEBwYXJhbSB7VGV4dHVyZU5vZGV9IFtwYXJhbWV0ZXJzLmRlZmF1bHRUZXh0dXJlXSAtIFRoZSBkZWZhdWx0IHRleHR1cmUgbm9kZS5cclxuICogQHBhcmFtIHtSZWZsZWN0b3JCYXNlTm9kZX0gW3BhcmFtZXRlcnMucmVmbGVjdG9yXSAtIFRoZSByZWZsZWN0b3IgYmFzZSBub2RlLlxyXG4gKiBAcmV0dXJucyB7UmVmbGVjdG9yTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCByZWZsZWN0b3IgPSAoIHBhcmFtZXRlcnMgKSA9PiBub2RlT2JqZWN0KCBuZXcgUmVmbGVjdG9yTm9kZSggcGFyYW1ldGVycyApICk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBSZWZsZWN0b3JOb2RlO1xyXG4iLCJpbXBvcnQgeyBCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4uLy4uL2NvcmUvQnVmZmVyR2VvbWV0cnkuanMnO1xyXG5pbXBvcnQgeyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5pbXBvcnQgeyBNZXNoIH0gZnJvbSAnLi4vLi4vb2JqZWN0cy9NZXNoLmpzJztcclxuaW1wb3J0IHsgT3J0aG9ncmFwaGljQ2FtZXJhIH0gZnJvbSAnLi4vLi4vY2FtZXJhcy9PcnRob2dyYXBoaWNDYW1lcmEuanMnO1xyXG5cclxuY29uc3QgX2NhbWVyYSA9IC8qQF9fUFVSRV9fKi8gbmV3IE9ydGhvZ3JhcGhpY0NhbWVyYSggLSAxLCAxLCAxLCAtIDEsIDAsIDEgKTtcclxuXHJcbi8qKlxyXG4gKiBUaGUgcHVycG9zZSBvZiB0aGlzIHNwZWNpYWwgZ2VvbWV0cnkgaXMgdG8gZmlsbCB0aGUgZW50aXJlIHZpZXdwb3J0IHdpdGggYSBzaW5nbGUgdHJpYW5nbGUuXHJcbiAqXHJcbiAqIFJlZmVyZW5jZToge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9tcmRvb2IvdGhyZWUuanMvcHVsbC8yMTM1OH1cclxuICpcclxuICogQHByaXZhdGVcclxuICogQGF1Z21lbnRzIEJ1ZmZlckdlb21ldHJ5XHJcbiAqL1xyXG5jbGFzcyBRdWFkR2VvbWV0cnkgZXh0ZW5kcyBCdWZmZXJHZW9tZXRyeSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcXVhZCBnZW9tZXRyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ZsaXBZPWZhbHNlXSAtIFdoZXRoZXIgdGhlIHV2IGNvb3JkaW5hdGVzIHNob3VsZCBiZSBmbGlwcGVkIGFsb25nIHRoZSB2ZXJ0aWNhbCBheGlzIG9yIG5vdC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggZmxpcFkgPSBmYWxzZSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdGNvbnN0IHV2ID0gZmxpcFkgPT09IGZhbHNlID8gWyAwLCAtIDEsIDAsIDEsIDIsIDEgXSA6IFsgMCwgMiwgMCwgMCwgMiwgMCBdO1xyXG5cclxuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggWyAtIDEsIDMsIDAsIC0gMSwgLSAxLCAwLCAzLCAtIDEsIDAgXSwgMyApICk7XHJcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2LCAyICkgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuY29uc3QgX2dlb21ldHJ5ID0gLypAX19QVVJFX18qLyBuZXcgUXVhZEdlb21ldHJ5KCk7XHJcblxyXG5cclxuLyoqXHJcbiAqIFRoaXMgbW9kdWxlIGlzIGEgaGVscGVyIGZvciBwYXNzZXMgd2hpY2ggbmVlZCB0byByZW5kZXIgYSBmdWxsXHJcbiAqIHNjcmVlbiBlZmZlY3Qgd2hpY2ggaXMgcXVpdGUgY29tbW9uIGluIGNvbnRleHQgb2YgcG9zdCBwcm9jZXNzaW5nLlxyXG4gKlxyXG4gKiBUaGUgaW50ZW5kZWQgdXNhZ2UgaXMgdG8gcmV1c2UgYSBzaW5nbGUgcXVhZCBtZXNoIGZvciByZW5kZXJpbmdcclxuICogc3Vic2VxdWVudCBwYXNzZXMgYnkganVzdCByZWFzc2lnbmluZyB0aGUgYG1hdGVyaWFsYCByZWZlcmVuY2UuXHJcbiAqXHJcbiAqIE5vdGU6IFRoaXMgbW9kdWxlIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBgV2ViR1BVUmVuZGVyZXJgLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTWVzaFxyXG4gKi9cclxuY2xhc3MgUXVhZE1lc2ggZXh0ZW5kcyBNZXNoIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBxdWFkIG1lc2guXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gez9NYXRlcmlhbH0gW21hdGVyaWFsPW51bGxdIC0gVGhlIG1hdGVyaWFsIHRvIHJlbmRlciB0aGUgcXVhZCBtZXNoIHdpdGguXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG1hdGVyaWFsID0gbnVsbCApIHtcclxuXHJcblx0XHRzdXBlciggX2dlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNhbWVyYSB0byByZW5kZXIgdGhlIHF1YWQgbWVzaCB3aXRoLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPcnRob2dyYXBoaWNDYW1lcmF9XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jYW1lcmEgPSBfY2FtZXJhO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1F1YWRNZXNoID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBc3luYyB2ZXJzaW9uIG9mIGByZW5kZXIoKWAuXHJcblx0ICpcclxuXHQgKiBAYXN5bmNcclxuXHQgKiBAcGFyYW0ge1JlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcmV0dXJuIHtQcm9taXNlfSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSByZW5kZXIgaGFzIGJlZW4gZmluaXNoZWQuXHJcblx0ICovXHJcblx0YXN5bmMgcmVuZGVyQXN5bmMoIHJlbmRlcmVyICkge1xyXG5cclxuXHRcdHJldHVybiByZW5kZXJlci5yZW5kZXJBc3luYyggdGhpcywgX2NhbWVyYSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbmRlcnMgdGhlIHF1YWQgbWVzaFxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcblx0ICovXHJcblx0cmVuZGVyKCByZW5kZXJlciApIHtcclxuXHJcblx0XHRyZW5kZXJlci5yZW5kZXIoIHRoaXMsIF9jYW1lcmEgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUXVhZE1lc2g7XHJcbiIsImltcG9ydCB7IG5vZGVPYmplY3QgfSBmcm9tICcuLi90c2wvVFNMQ29yZS5qcyc7XHJcbmltcG9ydCBUZXh0dXJlTm9kZSBmcm9tICcuLi9hY2Nlc3NvcnMvVGV4dHVyZU5vZGUuanMnO1xyXG5pbXBvcnQgeyBOb2RlVXBkYXRlVHlwZSB9IGZyb20gJy4uL2NvcmUvY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgdXYgfSBmcm9tICcuLi9hY2Nlc3NvcnMvVVYuanMnO1xyXG5pbXBvcnQgTm9kZU1hdGVyaWFsIGZyb20gJy4uLy4uL21hdGVyaWFscy9ub2Rlcy9Ob2RlTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgUXVhZE1lc2ggZnJvbSAnLi4vLi4vcmVuZGVyZXJzL2NvbW1vbi9RdWFkTWVzaC5qcyc7XHJcblxyXG5pbXBvcnQgeyBSZW5kZXJUYXJnZXQgfSBmcm9tICcuLi8uLi9jb3JlL1JlbmRlclRhcmdldC5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjIuanMnO1xyXG5pbXBvcnQgeyBIYWxmRmxvYXRUeXBlIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzLmpzJztcclxuXHJcbmNvbnN0IF9zaXplID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMigpO1xyXG5cclxuLyoqXHJcbiAqIGBSVFROb2RlYCB0YWtlcyBhbm90aGVyIG5vZGUgYW5kIHVzZXMgaXQgd2l0aCBhIGBRdWFkTWVzaGAgdG8gcmVuZGVyIGludG8gYSB0ZXh0dXJlIChSVFQpLlxyXG4gKiBUaGlzIG1vZHVsZSBpcyBlc3BlY2lhbGx5IHJlbGV2YW50IGluIGNvbnRleHQgb2YgcG9zdCBwcm9jZXNzaW5nIHdoZXJlIGNlcnRhaW4gbm9kZXMgcmVxdWlyZVxyXG4gKiB0ZXh0dXJlIGlucHV0IGZvciB0aGVpciBlZmZlY3RzLiBXaXRoIHRoZSBoZWxwZXIgZnVuY3Rpb24gYGNvbnZlcnRUb1RleHR1cmUoKWAgd2hpY2ggaXMgYmFzZWRcclxuICogb24gdGhpcyBtb2R1bGUsIHRoZSBub2RlIHN5c3RlbSBjYW4gYXV0b21hdGljYWxseSBlbnN1cmUgdGV4dHVyZSBpbnB1dCBpZiByZXF1aXJlZC5cclxuICpcclxuICogQGF1Z21lbnRzIFRleHR1cmVOb2RlXHJcbiAqL1xyXG5jbGFzcyBSVFROb2RlIGV4dGVuZHMgVGV4dHVyZU5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdSVFROb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IFJUVCBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIG5vZGUgdG8gcmVuZGVyIGEgdGV4dHVyZSB3aXRoLlxyXG5cdCAqIEBwYXJhbSB7P251bWJlcn0gW3dpZHRoPW51bGxdIC0gVGhlIHdpZHRoIG9mIHRoZSBpbnRlcm5hbCByZW5kZXIgdGFyZ2V0LiBJZiBub3Qgd2lkdGggaXMgYXBwbGllZCwgdGhlIHJlbmRlciB0YXJnZXQgaXMgYXV0b21hdGljYWxseSByZXNpemVkLlxyXG5cdCAqIEBwYXJhbSB7P251bWJlcn0gW2hlaWdodD1udWxsXSAtIFRoZSBoZWlnaHQgb2YgdGhlIGludGVybmFsIHJlbmRlciB0YXJnZXQuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt0eXBlOkhhbGZGbG9hdFR5cGV9XSAtIFRoZSBvcHRpb25zIGZvciB0aGUgaW50ZXJuYWwgcmVuZGVyIHRhcmdldC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggbm9kZSwgd2lkdGggPSBudWxsLCBoZWlnaHQgPSBudWxsLCBvcHRpb25zID0geyB0eXBlOiBIYWxmRmxvYXRUeXBlIH0gKSB7XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyVGFyZ2V0ID0gbmV3IFJlbmRlclRhcmdldCggd2lkdGgsIGhlaWdodCwgb3B0aW9ucyApO1xyXG5cclxuXHRcdHN1cGVyKCByZW5kZXJUYXJnZXQudGV4dHVyZSwgdXYoKSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG5vZGUgdG8gcmVuZGVyIGEgdGV4dHVyZSB3aXRoLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vZGUgPSBub2RlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHdpZHRoIG9mIHRoZSBpbnRlcm5hbCByZW5kZXIgdGFyZ2V0LlxyXG5cdFx0ICogSWYgbm90IHdpZHRoIGlzIGFwcGxpZWQsIHRoZSByZW5kZXIgdGFyZ2V0IGlzIGF1dG9tYXRpY2FsbHkgcmVzaXplZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy53aWR0aCA9IHdpZHRoO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGhlaWdodCBvZiB0aGUgaW50ZXJuYWwgcmVuZGVyIHRhcmdldC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5oZWlnaHQgPSBoZWlnaHQ7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcGl4ZWwgcmF0aW9cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBpeGVsUmF0aW8gPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJlbmRlciB0YXJnZXRcclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7UmVuZGVyVGFyZ2V0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJlbmRlclRhcmdldCA9IHJlbmRlclRhcmdldDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIHRleHR1cmUgcmVxdWlyZXMgYW4gdXBkYXRlIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50ZXh0dXJlTmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgdGV4dHVyZSBzaG91bGQgYXV0b21hdGljYWxseSBiZSB1cGRhdGVkIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hdXRvVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBub2RlIHdoaWNoIGlzIHVzZWQgd2l0aCB0aGUgcXVhZCBtZXNoIGZvciBSVFQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHtOb2RlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9ydHROb2RlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBpbnRlcm5hbCBxdWFkIG1lc2ggZm9yIFJUVC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge1F1YWRNZXNofVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9xdWFkTWVzaCA9IG5ldyBRdWFkTWVzaCggbmV3IE5vZGVNYXRlcmlhbCgpICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYHVwZGF0ZUJlZm9yZVR5cGVgIGlzIHNldCB0byBgTm9kZVVwZGF0ZVR5cGUuUkVOREVSYCBzaW5jZSB0aGUgbm9kZSB1cGRhdGVzXHJcblx0XHQgKiB0aGUgdGV4dHVyZSBvbmNlIHBlciByZW5kZXIgaW4gaXRzIHtAbGluayBSVFROb2RlI3VwZGF0ZUJlZm9yZX0gbWV0aG9kLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKiBAZGVmYXVsdCAncmVuZGVyJ1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVwZGF0ZUJlZm9yZVR5cGUgPSBOb2RlVXBkYXRlVHlwZS5SRU5ERVI7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogV2hldGhlciB0aGUgaW50ZXJuYWwgcmVuZGVyIHRhcmdldCBzaG91bGQgYXV0b21hdGljYWxseSBiZSByZXNpemVkIG9yIG5vdC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdCAqIEByZWFkb25seVxyXG5cdCAqIEBkZWZhdWx0IHRydWVcclxuXHQgKi9cclxuXHRnZXQgYXV0b1NpemUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMud2lkdGggPT09IG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXAoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0dGhpcy5fcnR0Tm9kZSA9IHRoaXMubm9kZS5jb250ZXh0KCBidWlsZGVyLmdldFNoYXJlZENvbnRleHQoKSApO1xyXG5cdFx0dGhpcy5fcXVhZE1lc2gubWF0ZXJpYWwubmFtZSA9ICdSVFQnO1xyXG5cdFx0dGhpcy5fcXVhZE1lc2gubWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdHJldHVybiBzdXBlci5zZXR1cCggYnVpbGRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHNpemUgb2YgdGhlIGludGVybmFsIHJlbmRlciB0YXJnZXRcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCB0byBzZXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSB3aWR0aCB0byBzZXQuXHJcblx0ICovXHJcblx0c2V0U2l6ZSggd2lkdGgsIGhlaWdodCApIHtcclxuXHJcblx0XHR0aGlzLndpZHRoID0gd2lkdGg7XHJcblx0XHR0aGlzLmhlaWdodCA9IGhlaWdodDtcclxuXHJcblx0XHRjb25zdCBlZmZlY3RpdmVXaWR0aCA9IHdpZHRoICogdGhpcy5waXhlbFJhdGlvO1xyXG5cdFx0Y29uc3QgZWZmZWN0aXZlSGVpZ2h0ID0gaGVpZ2h0ICogdGhpcy5waXhlbFJhdGlvO1xyXG5cclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0LnNldFNpemUoIGVmZmVjdGl2ZVdpZHRoLCBlZmZlY3RpdmVIZWlnaHQgKTtcclxuXHJcblx0XHR0aGlzLnRleHR1cmVOZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgcGl4ZWwgcmF0aW8uIFRoaXMgd2lsbCBhbHNvIHJlc2l6ZSB0aGUgcmVuZGVyIHRhcmdldC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBwaXhlbFJhdGlvIC0gVGhlIHBpeGVsIHJhdGlvIHRvIHNldC5cclxuXHQgKi9cclxuXHRzZXRQaXhlbFJhdGlvKCBwaXhlbFJhdGlvICkge1xyXG5cclxuXHRcdHRoaXMucGl4ZWxSYXRpbyA9IHBpeGVsUmF0aW87XHJcblxyXG5cdFx0dGhpcy5zZXRTaXplKCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCApO1xyXG5cclxuXHR9XHJcblxyXG5cdHVwZGF0ZUJlZm9yZSggeyByZW5kZXJlciB9ICkge1xyXG5cclxuXHRcdGlmICggdGhpcy50ZXh0dXJlTmVlZHNVcGRhdGUgPT09IGZhbHNlICYmIHRoaXMuYXV0b1VwZGF0ZSA9PT0gZmFsc2UgKSByZXR1cm47XHJcblxyXG5cdFx0dGhpcy50ZXh0dXJlTmVlZHNVcGRhdGUgPSBmYWxzZTtcclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGlmICggdGhpcy5hdXRvU2l6ZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdHRoaXMucGl4ZWxSYXRpbyA9IHJlbmRlcmVyLmdldFBpeGVsUmF0aW8oKTtcclxuXHJcblx0XHRcdGNvbnN0IHNpemUgPSByZW5kZXJlci5nZXRTaXplKCBfc2l6ZSApO1xyXG5cclxuXHRcdFx0dGhpcy5zZXRTaXplKCBzaXplLndpZHRoLCBzaXplLmhlaWdodCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdHRoaXMuX3F1YWRNZXNoLm1hdGVyaWFsLmZyYWdtZW50Tm9kZSA9IHRoaXMuX3J0dE5vZGU7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCBjdXJyZW50UmVuZGVyVGFyZ2V0ID0gcmVuZGVyZXIuZ2V0UmVuZGVyVGFyZ2V0KCk7XHJcblxyXG5cdFx0cmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCB0aGlzLnJlbmRlclRhcmdldCApO1xyXG5cclxuXHRcdHRoaXMuX3F1YWRNZXNoLnJlbmRlciggcmVuZGVyZXIgKTtcclxuXHJcblx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIGN1cnJlbnRSZW5kZXJUYXJnZXQgKTtcclxuXHJcblx0fVxyXG5cclxuXHRjbG9uZSgpIHtcclxuXHJcblx0XHRjb25zdCBuZXdOb2RlID0gbmV3IFRleHR1cmVOb2RlKCB0aGlzLnZhbHVlLCB0aGlzLnV2Tm9kZSwgdGhpcy5sZXZlbE5vZGUgKTtcclxuXHRcdG5ld05vZGUuc2FtcGxlciA9IHRoaXMuc2FtcGxlcjtcclxuXHRcdG5ld05vZGUucmVmZXJlbmNlTm9kZSA9IHRoaXM7XHJcblxyXG5cdFx0cmV0dXJuIG5ld05vZGU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFJUVE5vZGU7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIFJUVCBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBUaGUgbm9kZSB0byByZW5kZXIgYSB0ZXh0dXJlIHdpdGguXHJcbiAqIEBwYXJhbSB7P251bWJlcn0gW3dpZHRoPW51bGxdIC0gVGhlIHdpZHRoIG9mIHRoZSBpbnRlcm5hbCByZW5kZXIgdGFyZ2V0LiBJZiBub3Qgd2lkdGggaXMgYXBwbGllZCwgdGhlIHJlbmRlciB0YXJnZXQgaXMgYXV0b21hdGljYWxseSByZXNpemVkLlxyXG4gKiBAcGFyYW0gez9udW1iZXJ9IFtoZWlnaHQ9bnVsbF0gLSBUaGUgaGVpZ2h0IG9mIHRoZSBpbnRlcm5hbCByZW5kZXIgdGFyZ2V0LlxyXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e3R5cGU6SGFsZkZsb2F0VHlwZX1dIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBpbnRlcm5hbCByZW5kZXIgdGFyZ2V0LlxyXG4gKiBAcmV0dXJucyB7UlRUTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBydHQgPSAoIG5vZGUsIC4uLnBhcmFtcyApID0+IG5vZGVPYmplY3QoIG5ldyBSVFROb2RlKCBub2RlT2JqZWN0KCBub2RlICksIC4uLnBhcmFtcyApICk7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjb252ZXJ0aW5nIG5vZGVzIHRvIHRleHR1cmVzIG5vZGVzLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBUaGUgbm9kZSB0byByZW5kZXIgYSB0ZXh0dXJlIHdpdGguXHJcbiAqIEBwYXJhbSB7P251bWJlcn0gW3dpZHRoPW51bGxdIC0gVGhlIHdpZHRoIG9mIHRoZSBpbnRlcm5hbCByZW5kZXIgdGFyZ2V0LiBJZiBub3Qgd2lkdGggaXMgYXBwbGllZCwgdGhlIHJlbmRlciB0YXJnZXQgaXMgYXV0b21hdGljYWxseSByZXNpemVkLlxyXG4gKiBAcGFyYW0gez9udW1iZXJ9IFtoZWlnaHQ9bnVsbF0gLSBUaGUgaGVpZ2h0IG9mIHRoZSBpbnRlcm5hbCByZW5kZXIgdGFyZ2V0LlxyXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e3R5cGU6SGFsZkZsb2F0VHlwZX1dIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBpbnRlcm5hbCByZW5kZXIgdGFyZ2V0LlxyXG4gKiBAcmV0dXJucyB7UlRUTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBjb252ZXJ0VG9UZXh0dXJlID0gKCBub2RlLCAuLi5wYXJhbXMgKSA9PiB7XHJcblxyXG5cdGlmICggbm9kZS5pc1RleHR1cmVOb2RlICkgcmV0dXJuIG5vZGU7XHJcblx0aWYgKCBub2RlLmlzUGFzc05vZGUgKSByZXR1cm4gbm9kZS5nZXRUZXh0dXJlTm9kZSgpO1xyXG5cclxuXHRyZXR1cm4gcnR0KCBub2RlLCAuLi5wYXJhbXMgKTtcclxuXHJcbn07XHJcbiIsImltcG9ydCB7IGFicywgY3Jvc3MsIGZsb2F0LCBGbiwgbm9ybWFsaXplLCBpdmVjMiwgc3ViLCB2ZWMyLCB2ZWMzLCB2ZWM0IH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5pbXBvcnQgeyB0ZXh0dXJlU2l6ZSB9IGZyb20gJy4uL2FjY2Vzc29ycy9UZXh0dXJlU2l6ZU5vZGUuanMnO1xyXG5pbXBvcnQgeyB0ZXh0dXJlTG9hZCB9IGZyb20gJy4uL2FjY2Vzc29ycy9UZXh0dXJlTm9kZS5qcyc7XHJcbmltcG9ydCB7IFdlYkdQVUNvb3JkaW5hdGVTeXN0ZW0gfSBmcm9tICcuLi8uLi9jb25zdGFudHMuanMnO1xyXG5cclxuLyoqXHJcbiAqIENvbXB1dGVzIGEgcG9zaXRpb24gaW4gdmlldyBzcGFjZSBiYXNlZCBvbiBhIGZyYWdtZW50J3Mgc2NyZWVuIHBvc2l0aW9uIGV4cHJlc3NlZCBhcyB1diBjb29yZGluYXRlcywgdGhlIGZyYWdtZW50c1xyXG4gKiBkZXB0aCB2YWx1ZSBhbmQgdGhlIGNhbWVyYSdzIGludmVyc2UgcHJvamVjdGlvbiBtYXRyaXguXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMyPn0gc2NyZWVuUG9zaXRpb24gLSBUaGUgZnJhZ21lbnQncyBzY3JlZW4gcG9zaXRpb24gZXhwcmVzc2VkIGFzIHV2IGNvb3JkaW5hdGVzLlxyXG4gKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSBkZXB0aCAtIFRoZSBmcmFnbWVudCdzIGRlcHRoIHZhbHVlLlxyXG4gKiBAcGFyYW0ge05vZGU8bWF0ND59IHByb2plY3Rpb25NYXRyaXhJbnZlcnNlIC0gVGhlIGNhbWVyYSdzIGludmVyc2UgcHJvamVjdGlvbiBtYXRyaXguXHJcbiAqIEByZXR1cm4ge05vZGU8dmVjMz59IFRoZSBmcmFnbWVudHMgcG9zaXRpb24gaW4gdmlldyBzcGFjZS5cclxuICovXHJcbmV4cG9ydCBjb25zdCBnZXRWaWV3UG9zaXRpb24gPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgc2NyZWVuUG9zaXRpb24sIGRlcHRoLCBwcm9qZWN0aW9uTWF0cml4SW52ZXJzZSBdLCBidWlsZGVyICkgPT4ge1xyXG5cclxuXHRsZXQgY2xpcFNwYWNlUG9zaXRpb247XHJcblxyXG5cdGlmICggYnVpbGRlci5yZW5kZXJlci5jb29yZGluYXRlU3lzdGVtID09PSBXZWJHUFVDb29yZGluYXRlU3lzdGVtICkge1xyXG5cclxuXHRcdHNjcmVlblBvc2l0aW9uID0gdmVjMiggc2NyZWVuUG9zaXRpb24ueCwgc2NyZWVuUG9zaXRpb24ueS5vbmVNaW51cygpICkubXVsKCAyLjAgKS5zdWIoIDEuMCApO1xyXG5cdFx0Y2xpcFNwYWNlUG9zaXRpb24gPSB2ZWM0KCB2ZWMzKCBzY3JlZW5Qb3NpdGlvbiwgZGVwdGggKSwgMS4wICk7XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0Y2xpcFNwYWNlUG9zaXRpb24gPSB2ZWM0KCB2ZWMzKCBzY3JlZW5Qb3NpdGlvbi54LCBzY3JlZW5Qb3NpdGlvbi55Lm9uZU1pbnVzKCksIGRlcHRoICkubXVsKCAyLjAgKS5zdWIoIDEuMCApLCAxLjAgKTtcclxuXHJcblx0fVxyXG5cclxuXHRjb25zdCB2aWV3U3BhY2VQb3NpdGlvbiA9IHZlYzQoIHByb2plY3Rpb25NYXRyaXhJbnZlcnNlLm11bCggY2xpcFNwYWNlUG9zaXRpb24gKSApO1xyXG5cclxuXHRyZXR1cm4gdmlld1NwYWNlUG9zaXRpb24ueHl6LmRpdiggdmlld1NwYWNlUG9zaXRpb24udyApO1xyXG5cclxufSApO1xyXG5cclxuLyoqXHJcbiAqIENvbXB1dGVzIGEgc2NyZWVuIHBvc2l0aW9uIGV4cHJlc3NlZCBhcyB1diBjb29yZGluYXRlcyBiYXNlZCBvbiBhIGZyYWdtZW50J3MgcG9zaXRpb24gaW4gdmlldyBzcGFjZVxyXG4gKiBhbmQgdGhlIGNhbWVyYSdzIHByb2plY3Rpb24gbWF0cml4XHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMzPn0gdmlld1Bvc2l0aW9uIC0gVGhlIGZyYWdtZW50cyBwb3NpdGlvbiBpbiB2aWV3IHNwYWNlLlxyXG4gKiBAcGFyYW0ge05vZGU8bWF0ND59IHByb2plY3Rpb25NYXRyaXggLSBUaGUgY2FtZXJhJ3MgcHJvamVjdGlvbiBtYXRyaXguXHJcbiAqIEByZXR1cm4ge05vZGU8dmVjMj59IFRoZSBmcmFnbWVudCdzIHNjcmVlbiBwb3NpdGlvbiBleHByZXNzZWQgYXMgdXYgY29vcmRpbmF0ZXMuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZ2V0U2NyZWVuUG9zaXRpb24gPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgdmlld1Bvc2l0aW9uLCBwcm9qZWN0aW9uTWF0cml4IF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IHNhbXBsZUNsaXBQb3MgPSBwcm9qZWN0aW9uTWF0cml4Lm11bCggdmVjNCggdmlld1Bvc2l0aW9uLCAxLjAgKSApO1xyXG5cdGNvbnN0IHNhbXBsZVV2ID0gc2FtcGxlQ2xpcFBvcy54eS5kaXYoIHNhbXBsZUNsaXBQb3MudyApLm11bCggMC41ICkuYWRkKCAwLjUgKS50b1ZhcigpO1xyXG5cdHJldHVybiB2ZWMyKCBzYW1wbGVVdi54LCBzYW1wbGVVdi55Lm9uZU1pbnVzKCkgKTtcclxuXHJcbn0gKTtcclxuXHJcbi8qKlxyXG4gKiBDb21wdXRlcyBhIG5vcm1hbCB2ZWN0b3IgYmFzZWQgb24gZGVwdGggZGF0YS4gQ2FuIGJlIHVzZWQgYXMgYSBmYWxsYmFjayB3aGVuIG5vIG5vcm1hbCByZW5kZXJcclxuICogdGFyZ2V0IGlzIGF2YWlsYWJsZSBvciBpZiBmbGF0IHN1cmZhY2Ugbm9ybWFscyBhcmUgcmVxdWlyZWQuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMyPn0gdXYgLSBUaGUgdGV4dHVyZSBjb29yZGluYXRlLlxyXG4gKiBAcGFyYW0ge0RlcHRoVGV4dHVyZX0gZGVwdGhUZXh0dXJlIC0gVGhlIGRlcHRoIHRleHR1cmUuXHJcbiAqIEBwYXJhbSB7Tm9kZTxtYXQ0Pn0gcHJvamVjdGlvbk1hdHJpeEludmVyc2UgLSBUaGUgY2FtZXJhJ3MgaW52ZXJzZSBwcm9qZWN0aW9uIG1hdHJpeC5cclxuICogQHJldHVybiB7Tm9kZTx2ZWMzPn0gVGhlIGNvbXB1dGVkIG5vcm1hbCB2ZWN0b3IuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZ2V0Tm9ybWFsRnJvbURlcHRoID0gLypAX19QVVJFX18qLyBGbiggKCBbIHV2LCBkZXB0aFRleHR1cmUsIHByb2plY3Rpb25NYXRyaXhJbnZlcnNlIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IHNpemUgPSB0ZXh0dXJlU2l6ZSggdGV4dHVyZUxvYWQoIGRlcHRoVGV4dHVyZSApICk7XHJcblx0Y29uc3QgcCA9IGl2ZWMyKCB1di5tdWwoIHNpemUgKSApLnRvVmFyKCk7XHJcblxyXG5cdGNvbnN0IGMwID0gdGV4dHVyZUxvYWQoIGRlcHRoVGV4dHVyZSwgcCApLnRvVmFyKCk7XHJcblxyXG5cdGNvbnN0IGwyID0gdGV4dHVyZUxvYWQoIGRlcHRoVGV4dHVyZSwgcC5zdWIoIGl2ZWMyKCAyLCAwICkgKSApLnRvVmFyKCk7XHJcblx0Y29uc3QgbDEgPSB0ZXh0dXJlTG9hZCggZGVwdGhUZXh0dXJlLCBwLnN1YiggaXZlYzIoIDEsIDAgKSApICkudG9WYXIoKTtcclxuXHRjb25zdCByMSA9IHRleHR1cmVMb2FkKCBkZXB0aFRleHR1cmUsIHAuYWRkKCBpdmVjMiggMSwgMCApICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHIyID0gdGV4dHVyZUxvYWQoIGRlcHRoVGV4dHVyZSwgcC5hZGQoIGl2ZWMyKCAyLCAwICkgKSApLnRvVmFyKCk7XHJcblx0Y29uc3QgYjIgPSB0ZXh0dXJlTG9hZCggZGVwdGhUZXh0dXJlLCBwLmFkZCggaXZlYzIoIDAsIDIgKSApICkudG9WYXIoKTtcclxuXHRjb25zdCBiMSA9IHRleHR1cmVMb2FkKCBkZXB0aFRleHR1cmUsIHAuYWRkKCBpdmVjMiggMCwgMSApICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHQxID0gdGV4dHVyZUxvYWQoIGRlcHRoVGV4dHVyZSwgcC5zdWIoIGl2ZWMyKCAwLCAxICkgKSApLnRvVmFyKCk7XHJcblx0Y29uc3QgdDIgPSB0ZXh0dXJlTG9hZCggZGVwdGhUZXh0dXJlLCBwLnN1YiggaXZlYzIoIDAsIDIgKSApICkudG9WYXIoKTtcclxuXHJcblx0Y29uc3QgZGwgPSBhYnMoIHN1YiggZmxvYXQoIDIgKS5tdWwoIGwxICkuc3ViKCBsMiApLCBjMCApICkudG9WYXIoKTtcclxuXHRjb25zdCBkciA9IGFicyggc3ViKCBmbG9hdCggMiApLm11bCggcjEgKS5zdWIoIHIyICksIGMwICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IGRiID0gYWJzKCBzdWIoIGZsb2F0KCAyICkubXVsKCBiMSApLnN1YiggYjIgKSwgYzAgKSApLnRvVmFyKCk7XHJcblx0Y29uc3QgZHQgPSBhYnMoIHN1YiggZmxvYXQoIDIgKS5tdWwoIHQxICkuc3ViKCB0MiApLCBjMCApICkudG9WYXIoKTtcclxuXHJcblx0Y29uc3QgY2UgPSBnZXRWaWV3UG9zaXRpb24oIHV2LCBjMCwgcHJvamVjdGlvbk1hdHJpeEludmVyc2UgKS50b1ZhcigpO1xyXG5cclxuXHRjb25zdCBkcGR4ID0gZGwubGVzc1RoYW4oIGRyICkuc2VsZWN0KCBjZS5zdWIoIGdldFZpZXdQb3NpdGlvbiggdXYuc3ViKCB2ZWMyKCBmbG9hdCggMSApLmRpdiggc2l6ZS54ICksIDAgKSApLCBsMSwgcHJvamVjdGlvbk1hdHJpeEludmVyc2UgKSApLCBjZS5uZWdhdGUoKS5hZGQoIGdldFZpZXdQb3NpdGlvbiggdXYuYWRkKCB2ZWMyKCBmbG9hdCggMSApLmRpdiggc2l6ZS54ICksIDAgKSApLCByMSwgcHJvamVjdGlvbk1hdHJpeEludmVyc2UgKSApICk7XHJcblx0Y29uc3QgZHBkeSA9IGRiLmxlc3NUaGFuKCBkdCApLnNlbGVjdCggY2Uuc3ViKCBnZXRWaWV3UG9zaXRpb24oIHV2LmFkZCggdmVjMiggMCwgZmxvYXQoIDEgKS5kaXYoIHNpemUueSApICkgKSwgYjEsIHByb2plY3Rpb25NYXRyaXhJbnZlcnNlICkgKSwgY2UubmVnYXRlKCkuYWRkKCBnZXRWaWV3UG9zaXRpb24oIHV2LnN1YiggdmVjMiggMCwgZmxvYXQoIDEgKS5kaXYoIHNpemUueSApICkgKSwgdDEsIHByb2plY3Rpb25NYXRyaXhJbnZlcnNlICkgKSApO1xyXG5cclxuXHRyZXR1cm4gbm9ybWFsaXplKCBjcm9zcyggZHBkeCwgZHBkeSApICk7XHJcblxyXG59ICk7XHJcbiIsImltcG9ydCB7IEluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uLy4uL2NvcmUvSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIHNwZWNpYWwgdHlwZSBvZiBpbnN0YW5jZWQgYnVmZmVyIGF0dHJpYnV0ZSBpcyBpbnRlbmRlZCBmb3IgY29tcHV0ZSBzaGFkZXJzLlxyXG4gKiBJbiBlYXJsaWVyIHRocmVlLmpzIHZlcnNpb25zIGl0IHdhcyBvbmx5IHBvc3NpYmxlIHRvIHVwZGF0ZSBhdHRyaWJ1dGUgZGF0YVxyXG4gKiBvbiB0aGUgQ1BVIHZpYSBKYXZhU2NyaXB0IGFuZCB0aGVuIHVwbG9hZCB0aGUgZGF0YSB0byB0aGUgR1BVLiBXaXRoIHRoZVxyXG4gKiBuZXcgbWF0ZXJpYWwgc3lzdGVtIGFuZCByZW5kZXJlciBpdCBpcyBub3cgcG9zc2libGUgdG8gdXNlIGNvbXB1dGUgc2hhZGVyc1xyXG4gKiB0byBjb21wdXRlIHRoZSBkYXRhIGZvciBhbiBhdHRyaWJ1dGUgbW9yZSBlZmZpY2llbnRseSBvbiB0aGUgR1BVLlxyXG4gKlxyXG4gKiBUaGUgaWRlYSBpcyB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbmQgcHJvdmlkZSBpdCBhcyBhbiBpbnB1dFxyXG4gKiB0byB7QGxpbmsgU3RvcmFnZUJ1ZmZlck5vZGV9LlxyXG4gKlxyXG4gKiBOb3RlOiBUaGlzIHR5cGUgb2YgYnVmZmVyIGF0dHJpYnV0ZSBjYW4gb25seSBiZSB1c2VkIHdpdGggYFdlYkdQVVJlbmRlcmVyYC5cclxuICpcclxuICogQGF1Z21lbnRzIEluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZVxyXG4gKi9cclxuY2xhc3MgU3RvcmFnZUluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSBleHRlbmRzIEluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc3RvcmFnZSBpbnN0YW5jZWQgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfFR5cGVkQXJyYXl9IGNvdW50IC0gVGhlIGl0ZW0gY291bnQuIEl0IGlzIGFsc28gdmFsaWQgdG8gcGFzcyBhIHR5cGVkIGFycmF5IGFzIGFuIGFyZ3VtZW50LlxyXG5cdCAqIFRoZSBzdWJzZXF1ZW50IHBhcmFtZXRlcnMgYXJlIHRoZW4gb2Jzb2xldGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGl0ZW1TaXplIC0gVGhlIGl0ZW0gc2l6ZS5cclxuXHQgKiBAcGFyYW0ge1R5cGVkQXJyYXkuY29uc3RydWN0b3J9IFt0eXBlQ2xhc3M9RmxvYXQzMkFycmF5XSAtIEEgdHlwZWQgYXJyYXkgY29uc3RydWN0b3IuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGNvdW50LCBpdGVtU2l6ZSwgdHlwZUNsYXNzID0gRmxvYXQzMkFycmF5ICkge1xyXG5cclxuXHRcdGNvbnN0IGFycmF5ID0gQXJyYXlCdWZmZXIuaXNWaWV3KCBjb3VudCApID8gY291bnQgOiBuZXcgdHlwZUNsYXNzKCBjb3VudCAqIGl0ZW1TaXplICk7XHJcblxyXG5cdFx0c3VwZXIoIGFycmF5LCBpdGVtU2l6ZSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1N0b3JhZ2VJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTdG9yYWdlSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlO1xyXG4iLCJpbXBvcnQgeyBCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi8uLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBzcGVjaWFsIHR5cGUgb2YgYnVmZmVyIGF0dHJpYnV0ZSBpcyBpbnRlbmRlZCBmb3IgY29tcHV0ZSBzaGFkZXJzLlxyXG4gKiBJbiBlYXJsaWVyIHRocmVlLmpzIHZlcnNpb25zIGl0IHdhcyBvbmx5IHBvc3NpYmxlIHRvIHVwZGF0ZSBhdHRyaWJ1dGUgZGF0YVxyXG4gKiBvbiB0aGUgQ1BVIHZpYSBKYXZhU2NyaXB0IGFuZCB0aGVuIHVwbG9hZCB0aGUgZGF0YSB0byB0aGUgR1BVLiBXaXRoIHRoZVxyXG4gKiBuZXcgbWF0ZXJpYWwgc3lzdGVtIGFuZCByZW5kZXJlciBpdCBpcyBub3cgcG9zc2libGUgdG8gdXNlIGNvbXB1dGUgc2hhZGVyc1xyXG4gKiB0byBjb21wdXRlIHRoZSBkYXRhIGZvciBhbiBhdHRyaWJ1dGUgbW9yZSBlZmZpY2llbnRseSBvbiB0aGUgR1BVLlxyXG4gKlxyXG4gKiBUaGUgaWRlYSBpcyB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbmQgcHJvdmlkZSBpdCBhcyBhbiBpbnB1dFxyXG4gKiB0byB7QGxpbmsgU3RvcmFnZUJ1ZmZlck5vZGV9LlxyXG4gKlxyXG4gKiBOb3RlOiBUaGlzIHR5cGUgb2YgYnVmZmVyIGF0dHJpYnV0ZSBjYW4gb25seSBiZSB1c2VkIHdpdGggYFdlYkdQVVJlbmRlcmVyYC5cclxuICpcclxuICogQGF1Z21lbnRzIEJ1ZmZlckF0dHJpYnV0ZVxyXG4gKi9cclxuY2xhc3MgU3RvcmFnZUJ1ZmZlckF0dHJpYnV0ZSBleHRlbmRzIEJ1ZmZlckF0dHJpYnV0ZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc3RvcmFnZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ8VHlwZWRBcnJheX0gY291bnQgLSBUaGUgaXRlbSBjb3VudC4gSXQgaXMgYWxzbyB2YWxpZCB0byBwYXNzIGEgdHlwZWQgYXJyYXkgYXMgYW4gYXJndW1lbnQuXHJcblx0ICogVGhlIHN1YnNlcXVlbnQgcGFyYW1ldGVycyBhcmUgdGhlbiBvYnNvbGV0ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaXRlbVNpemUgLSBUaGUgaXRlbSBzaXplLlxyXG5cdCAqIEBwYXJhbSB7VHlwZWRBcnJheS5jb25zdHJ1Y3Rvcn0gW3R5cGVDbGFzcz1GbG9hdDMyQXJyYXldIC0gQSB0eXBlZCBhcnJheSBjb25zdHJ1Y3Rvci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggY291bnQsIGl0ZW1TaXplLCB0eXBlQ2xhc3MgPSBGbG9hdDMyQXJyYXkgKSB7XHJcblxyXG5cdFx0Y29uc3QgYXJyYXkgPSBBcnJheUJ1ZmZlci5pc1ZpZXcoIGNvdW50ICkgPyBjb3VudCA6IG5ldyB0eXBlQ2xhc3MoIGNvdW50ICogaXRlbVNpemUgKTtcclxuXHJcblx0XHRzdXBlciggYXJyYXksIGl0ZW1TaXplICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzU3RvcmFnZUJ1ZmZlckF0dHJpYnV0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFN0b3JhZ2VCdWZmZXJBdHRyaWJ1dGU7XHJcbiIsImltcG9ydCBTdG9yYWdlSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlIGZyb20gJy4uLy4uL3JlbmRlcmVycy9jb21tb24vU3RvcmFnZUluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcbmltcG9ydCBTdG9yYWdlQnVmZmVyQXR0cmlidXRlIGZyb20gJy4uLy4uL3JlbmRlcmVycy9jb21tb24vU3RvcmFnZUJ1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcbmltcG9ydCB7IHN0b3JhZ2UgfSBmcm9tICcuL1N0b3JhZ2VCdWZmZXJOb2RlLmpzJztcclxuaW1wb3J0IHsgZ2V0TGVuZ3RoRnJvbVR5cGUsIGdldFR5cGVkQXJyYXlGcm9tVHlwZSB9IGZyb20gJy4uL2NvcmUvTm9kZVV0aWxzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgc3RvcmFnZSBidWZmZXIgbm9kZSB3aXRoIGEgY29uZmlndXJlZCBgU3RvcmFnZUJ1ZmZlckF0dHJpYnV0ZWAuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfFR5cGVkQXJyYXl9IGNvdW50IC0gVGhlIGRhdGEgY291bnQuIEl0IGlzIGFsc28gdmFsaWQgdG8gcGFzcyBhIHR5cGVkIGFycmF5IGFzIGFuIGFyZ3VtZW50LlxyXG4gKiBAcGFyYW0ge3N0cmluZ3xTdHJ1Y3R9IFt0eXBlPSdmbG9hdCddIC0gVGhlIGRhdGEgdHlwZS5cclxuICogQHJldHVybnMge1N0b3JhZ2VCdWZmZXJOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGF0dHJpYnV0ZUFycmF5ID0gKCBjb3VudCwgdHlwZSA9ICdmbG9hdCcgKSA9PiB7XHJcblxyXG5cdGxldCBpdGVtU2l6ZSwgdHlwZWRBcnJheTtcclxuXHJcblx0aWYgKCB0eXBlLmlzU3RydWN0ID09PSB0cnVlICkge1xyXG5cclxuXHRcdGl0ZW1TaXplID0gdHlwZS5sYXlvdXQuZ2V0TGVuZ3RoKCk7XHJcblx0XHR0eXBlZEFycmF5ID0gZ2V0VHlwZWRBcnJheUZyb21UeXBlKCAnZmxvYXQnICk7XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0aXRlbVNpemUgPSBnZXRMZW5ndGhGcm9tVHlwZSggdHlwZSApO1xyXG5cdFx0dHlwZWRBcnJheSA9IGdldFR5cGVkQXJyYXlGcm9tVHlwZSggdHlwZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvbnN0IGJ1ZmZlciA9IG5ldyBTdG9yYWdlQnVmZmVyQXR0cmlidXRlKCBjb3VudCwgaXRlbVNpemUsIHR5cGVkQXJyYXkgKTtcclxuXHRjb25zdCBub2RlID0gc3RvcmFnZSggYnVmZmVyLCB0eXBlLCBjb3VudCApO1xyXG5cclxuXHRyZXR1cm4gbm9kZTtcclxuXHJcbn07XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIHN0b3JhZ2UgYnVmZmVyIG5vZGUgd2l0aCBhIGNvbmZpZ3VyZWQgYFN0b3JhZ2VJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGVgLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge251bWJlcnxUeXBlZEFycmF5fSBjb3VudCAtIFRoZSBkYXRhIGNvdW50LiBJdCBpcyBhbHNvIHZhbGlkIHRvIHBhc3MgYSB0eXBlZCBhcnJheSBhcyBhbiBhcmd1bWVudC5cclxuICogQHBhcmFtIHtzdHJpbmd8U3RydWN0fSBbdHlwZT0nZmxvYXQnXSAtIFRoZSBkYXRhIHR5cGUuXHJcbiAqIEByZXR1cm5zIHtTdG9yYWdlQnVmZmVyTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBpbnN0YW5jZWRBcnJheSA9ICggY291bnQsIHR5cGUgPSAnZmxvYXQnICkgPT4ge1xyXG5cclxuXHRsZXQgaXRlbVNpemUsIHR5cGVkQXJyYXk7XHJcblxyXG5cdGlmICggdHlwZS5pc1N0cnVjdCA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRpdGVtU2l6ZSA9IHR5cGUubGF5b3V0LmdldExlbmd0aCgpO1xyXG5cdFx0dHlwZWRBcnJheSA9IGdldFR5cGVkQXJyYXlGcm9tVHlwZSggJ2Zsb2F0JyApO1xyXG5cclxuXHR9IGVsc2Uge1xyXG5cclxuXHRcdGl0ZW1TaXplID0gZ2V0TGVuZ3RoRnJvbVR5cGUoIHR5cGUgKTtcclxuXHRcdHR5cGVkQXJyYXkgPSBnZXRUeXBlZEFycmF5RnJvbVR5cGUoIHR5cGUgKTtcclxuXHJcblx0fVxyXG5cclxuXHRjb25zdCBidWZmZXIgPSBuZXcgU3RvcmFnZUluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSggY291bnQsIGl0ZW1TaXplLCB0eXBlZEFycmF5ICk7XHJcblx0Y29uc3Qgbm9kZSA9IHN0b3JhZ2UoIGJ1ZmZlciwgdHlwZSwgY291bnQgKTtcclxuXHJcblx0cmV0dXJuIG5vZGU7XHJcblxyXG59O1xyXG4iLCJpbXBvcnQgQXR0cmlidXRlTm9kZSBmcm9tICcuLi9jb3JlL0F0dHJpYnV0ZU5vZGUuanMnO1xyXG5pbXBvcnQgeyBub2RlT2JqZWN0IH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3I0IH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3I0LmpzJztcclxuXHJcbi8qKlxyXG4gKiBBbiBhdHRyaWJ1dGUgbm9kZSBmb3IgcmVwcmVzZW50aW5nIHZlcnRleCBjb2xvcnMuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBBdHRyaWJ1dGVOb2RlXHJcbiAqL1xyXG5jbGFzcyBWZXJ0ZXhDb2xvck5vZGUgZXh0ZW5kcyBBdHRyaWJ1dGVOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnVmVydGV4Q29sb3JOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHZlcnRleCBjb2xvciBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtpbmRleD0wXSAtIFRoZSBhdHRyaWJ1dGUgaW5kZXguXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGluZGV4ID0gMCApIHtcclxuXHJcblx0XHRzdXBlciggbnVsbCwgJ3ZlYzQnICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzVmVydGV4Q29sb3JOb2RlID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBhdHRyaWJ1dGUgaW5kZXggdG8gZW5hYmxlIG1vcmUgdGhhbiBvbmUgc2V0cyBvZiB2ZXJ0ZXggY29sb3JzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaW5kZXggPSBpbmRleDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBPdmVyd3JpdGVzIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGJ5IGhvbm9yaW5nIHRoZSBhdHRyaWJ1dGUgaW5kZXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGF0dHJpYnV0ZSBuYW1lLlxyXG5cdCAqL1xyXG5cdGdldEF0dHJpYnV0ZU5hbWUoIC8qYnVpbGRlciovICkge1xyXG5cclxuXHRcdGNvbnN0IGluZGV4ID0gdGhpcy5pbmRleDtcclxuXHJcblx0XHRyZXR1cm4gJ2NvbG9yJyArICggaW5kZXggPiAwID8gaW5kZXggOiAnJyApO1xyXG5cclxuXHR9XHJcblxyXG5cdGdlbmVyYXRlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IGF0dHJpYnV0ZU5hbWUgPSB0aGlzLmdldEF0dHJpYnV0ZU5hbWUoIGJ1aWxkZXIgKTtcclxuXHRcdGNvbnN0IGdlb21ldHJ5QXR0cmlidXRlID0gYnVpbGRlci5oYXNHZW9tZXRyeUF0dHJpYnV0ZSggYXR0cmlidXRlTmFtZSApO1xyXG5cclxuXHRcdGxldCByZXN1bHQ7XHJcblxyXG5cdFx0aWYgKCBnZW9tZXRyeUF0dHJpYnV0ZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdHJlc3VsdCA9IHN1cGVyLmdlbmVyYXRlKCBidWlsZGVyICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdC8vIFZlcnRleCBjb2xvciBmYWxsYmFjayBzaG91bGQgYmUgd2hpdGVcclxuXHRcdFx0cmVzdWx0ID0gYnVpbGRlci5nZW5lcmF0ZUNvbnN0KCB0aGlzLm5vZGVUeXBlLCBuZXcgVmVjdG9yNCggMSwgMSwgMSwgMSApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblxyXG5cdH1cclxuXHJcblx0c2VyaWFsaXplKCBkYXRhICkge1xyXG5cclxuXHRcdHN1cGVyLnNlcmlhbGl6ZSggZGF0YSApO1xyXG5cclxuXHRcdGRhdGEuaW5kZXggPSB0aGlzLmluZGV4O1xyXG5cclxuXHR9XHJcblxyXG5cdGRlc2VyaWFsaXplKCBkYXRhICkge1xyXG5cclxuXHRcdHN1cGVyLmRlc2VyaWFsaXplKCBkYXRhICk7XHJcblxyXG5cdFx0dGhpcy5pbmRleCA9IGRhdGEuaW5kZXg7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFZlcnRleENvbG9yTm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgcmVmZXJlbmNlIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBhdHRyaWJ1dGUgaW5kZXguXHJcbiAqIEByZXR1cm5zIHtWZXJ0ZXhDb2xvck5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdmVydGV4Q29sb3IgPSAoIGluZGV4ICkgPT4gbm9kZU9iamVjdCggbmV3IFZlcnRleENvbG9yTm9kZSggaW5kZXggKSApO1xyXG4iLCJpbXBvcnQgTm9kZSBmcm9tICcuLi9jb3JlL05vZGUuanMnO1xyXG5pbXBvcnQgeyBub2RlSW1tdXRhYmxlIH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgbm9kZSBmb3IgcmVwcmVzZW50aW5nIHRoZSB1diBjb29yZGluYXRlcyBvZiBwb2ludHMuXHJcbiAqXHJcbiAqIENhbiBvbmx5IGJlIHVzZWQgd2l0aCBhIFdlYkdMIGJhY2tlbmQuIEluIFdlYkdQVSwgcG9pbnRcclxuICogcHJpbWl0aXZlcyBhbHdheXMgaGF2ZSB0aGUgc2l6ZSBvZiBvbmUgcGl4ZWwgYW5kIGNhbiB0aHVzXHJcbiAqIGNhbid0IGJlIHVzZWQgYXMgc3ByaXRlLWxpa2Ugb2JqZWN0cyB0aGF0IGRpc3BsYXkgdGV4dHVyZXMuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBOb2RlXHJcbiAqL1xyXG5jbGFzcyBQb2ludFVWTm9kZSBleHRlbmRzIE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdQb2ludFVWTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBwb2ludCB1diBub2RlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cclxuXHRcdHN1cGVyKCAndmVjMicgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNQb2ludFVWTm9kZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0Z2VuZXJhdGUoIC8qYnVpbGRlciovICkge1xyXG5cclxuXHRcdHJldHVybiAndmVjMiggZ2xfUG9pbnRDb29yZC54LCAxLjAgLSBnbF9Qb2ludENvb3JkLnkgKSc7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFBvaW50VVZOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSB1diBjb29yZGluYXRlcyBvZiBwb2ludHMuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1BvaW50VVZOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHBvaW50VVYgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIFBvaW50VVZOb2RlICk7XHJcbiIsImltcG9ydCB7IFVWTWFwcGluZyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IEV1bGVyIH0gZnJvbSAnLi4vLi4vbWF0aC9FdWxlci5qcyc7XHJcbmltcG9ydCB7IE1hdHJpeDQgfSBmcm9tICcuLi8uLi9tYXRoL01hdHJpeDQuanMnO1xyXG5pbXBvcnQgTm9kZSBmcm9tICcuLi9jb3JlL05vZGUuanMnO1xyXG5pbXBvcnQgeyByZW5kZXJHcm91cCB9IGZyb20gJy4uL2NvcmUvVW5pZm9ybUdyb3VwTm9kZS5qcyc7XHJcbmltcG9ydCB7IG5vZGVJbW11dGFibGUsIHVuaWZvcm0gfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcbmltcG9ydCB7IHJlZmVyZW5jZSB9IGZyb20gJy4vUmVmZXJlbmNlTm9kZS5qcyc7XHJcblxyXG5jb25zdCBfZTEgPSAvKkBfX1BVUkVfXyovIG5ldyBFdWxlcigpO1xyXG5jb25zdCBfbTEgPSAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXg0KCk7XHJcblxyXG4vKipcclxuICogVGhpcyBtb2R1bGUgYWxsb3dzIGFjY2VzcyB0byBhIGNvbGxlY3Rpb24gb2Ygc2NlbmUgcHJvcGVydGllcy4gVGhlIGZvbGxvd2luZyBwcmVkZWZpbmVkIFRTTCBvYmplY3RzXHJcbiAqIGFyZSBhdmFpbGFibGUgZm9yIGVhc2llciB1c2U6XHJcbiAqXHJcbiAqIC0gYGJhY2tncm91bmRCbHVycmluZXNzYDogQSBub2RlIHRoYXQgcmVwcmVzZW50cyB0aGUgc2NlbmUncyBiYWNrZ3JvdW5kIGJsdXJyaW5lc3MuXHJcbiAqIC0gYGJhY2tncm91bmRJbnRlbnNpdHlgOiBBIG5vZGUgdGhhdCByZXByZXNlbnRzIHRoZSBzY2VuZSdzIGJhY2tncm91bmQgaW50ZW5zaXR5LlxyXG4gKiAtIGBiYWNrZ3JvdW5kUm90YXRpb25gOiBBIG5vZGUgdGhhdCByZXByZXNlbnRzIHRoZSBzY2VuZSdzIGJhY2tncm91bmQgcm90YXRpb24uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBOb2RlXHJcbiAqL1xyXG5jbGFzcyBTY2VuZU5vZGUgZXh0ZW5kcyBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnU2NlbmVOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHNjZW5lIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geygnYmFja2dyb3VuZEJsdXJyaW5lc3MnfCdiYWNrZ3JvdW5kSW50ZW5zaXR5J3wnYmFja2dyb3VuZFJvdGF0aW9uJyl9IHNjb3BlIC0gVGhlIHNjb3BlIGRlZmluZXMgdGhlIHR5cGUgb2Ygc2NlbmUgcHJvcGVydHkgdGhhdCBpcyBhY2Nlc3NlZC5cclxuXHQgKiBAcGFyYW0gez9TY2VuZX0gW3NjZW5lPW51bGxdIC0gQSByZWZlcmVuY2UgdG8gdGhlIHNjZW5lLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBzY29wZSA9IFNjZW5lTm9kZS5CQUNLR1JPVU5EX0JMVVJSSU5FU1MsIHNjZW5lID0gbnVsbCApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHNjb3BlIGRlZmluZXMgdGhlIHR5cGUgb2Ygc2NlbmUgcHJvcGVydHkgdGhhdCBpcyBhY2Nlc3NlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KCdiYWNrZ3JvdW5kQmx1cnJpbmVzcyd8J2JhY2tncm91bmRJbnRlbnNpdHknfCdiYWNrZ3JvdW5kUm90YXRpb24nKX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zY29wZSA9IHNjb3BlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIHNjZW5lIHRoYXQgaXMgZ29pbmcgdG8gYmUgYWNjZXNzZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9TY2VuZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zY2VuZSA9IHNjZW5lO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlcGVuZGluZyBvbiB0aGUgc2NvcGUsIHRoZSBtZXRob2QgcmV0dXJucyBhIGRpZmZlcmVudCB0eXBlIG9mIG5vZGUgdGhhdCByZXByZXNlbnRzXHJcblx0ICogdGhlIHJlc3BlY3RpdmUgc2NlbmUgcHJvcGVydHkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge05vZGV9IFRoZSBvdXRwdXQgbm9kZS5cclxuXHQgKi9cclxuXHRzZXR1cCggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCBzY29wZSA9IHRoaXMuc2NvcGU7XHJcblx0XHRjb25zdCBzY2VuZSA9IHRoaXMuc2NlbmUgIT09IG51bGwgPyB0aGlzLnNjZW5lIDogYnVpbGRlci5zY2VuZTtcclxuXHJcblx0XHRsZXQgb3V0cHV0O1xyXG5cclxuXHRcdGlmICggc2NvcGUgPT09IFNjZW5lTm9kZS5CQUNLR1JPVU5EX0JMVVJSSU5FU1MgKSB7XHJcblxyXG5cdFx0XHRvdXRwdXQgPSByZWZlcmVuY2UoICdiYWNrZ3JvdW5kQmx1cnJpbmVzcycsICdmbG9hdCcsIHNjZW5lICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggc2NvcGUgPT09IFNjZW5lTm9kZS5CQUNLR1JPVU5EX0lOVEVOU0lUWSApIHtcclxuXHJcblx0XHRcdG91dHB1dCA9IHJlZmVyZW5jZSggJ2JhY2tncm91bmRJbnRlbnNpdHknLCAnZmxvYXQnLCBzY2VuZSApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHNjb3BlID09PSBTY2VuZU5vZGUuQkFDS0dST1VORF9ST1RBVElPTiApIHtcclxuXHJcblx0XHRcdG91dHB1dCA9IHVuaWZvcm0oICdtYXQ0JyApLmxhYmVsKCAnYmFja2dyb3VuZFJvdGF0aW9uJyApLnNldEdyb3VwKCByZW5kZXJHcm91cCApLm9uUmVuZGVyVXBkYXRlKCAoKSA9PiB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGJhY2tncm91bmQgPSBzY2VuZS5iYWNrZ3JvdW5kO1xyXG5cclxuXHRcdFx0XHRpZiAoIGJhY2tncm91bmQgIT09IG51bGwgJiYgYmFja2dyb3VuZC5pc1RleHR1cmUgJiYgYmFja2dyb3VuZC5tYXBwaW5nICE9PSBVVk1hcHBpbmcgKSB7XHJcblxyXG5cdFx0XHRcdFx0X2UxLmNvcHkoIHNjZW5lLmJhY2tncm91bmRSb3RhdGlvbiApO1xyXG5cclxuXHRcdFx0XHRcdC8vIGFjY29tbW9kYXRlIGxlZnQtaGFuZGVkIGZyYW1lXHJcblx0XHRcdFx0XHRfZTEueCAqPSAtIDE7IF9lMS55ICo9IC0gMTsgX2UxLnogKj0gLSAxO1xyXG5cclxuXHRcdFx0XHRcdF9tMS5tYWtlUm90YXRpb25Gcm9tRXVsZXIoIF9lMSApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdF9tMS5pZGVudGl0eSgpO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHJldHVybiBfbTE7XHJcblxyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5TY2VuZU5vZGU6IFVua25vd24gc2NvcGU6Jywgc2NvcGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG91dHB1dDtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuU2NlbmVOb2RlLkJBQ0tHUk9VTkRfQkxVUlJJTkVTUyA9ICdiYWNrZ3JvdW5kQmx1cnJpbmVzcyc7XHJcblNjZW5lTm9kZS5CQUNLR1JPVU5EX0lOVEVOU0lUWSA9ICdiYWNrZ3JvdW5kSW50ZW5zaXR5JztcclxuU2NlbmVOb2RlLkJBQ0tHUk9VTkRfUk9UQVRJT04gPSAnYmFja2dyb3VuZFJvdGF0aW9uJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IFNjZW5lTm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgc2NlbmUncyBiYWNrZ3JvdW5kIGJsdXJyaW5lc3MuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1NjZW5lTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBiYWNrZ3JvdW5kQmx1cnJpbmVzcyA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggU2NlbmVOb2RlLCBTY2VuZU5vZGUuQkFDS0dST1VORF9CTFVSUklORVNTICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHNjZW5lJ3MgYmFja2dyb3VuZCBpbnRlbnNpdHkuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1NjZW5lTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBiYWNrZ3JvdW5kSW50ZW5zaXR5ID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBTY2VuZU5vZGUsIFNjZW5lTm9kZS5CQUNLR1JPVU5EX0lOVEVOU0lUWSApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBzY2VuZSdzIGJhY2tncm91bmQgcm90YXRpb24uXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1NjZW5lTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBiYWNrZ3JvdW5kUm90YXRpb24gPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIFNjZW5lTm9kZSwgU2NlbmVOb2RlLkJBQ0tHUk9VTkRfUk9UQVRJT04gKTtcclxuIiwiaW1wb3J0IFRleHR1cmVOb2RlIGZyb20gJy4vVGV4dHVyZU5vZGUuanMnO1xyXG5pbXBvcnQgeyBub2RlUHJveHkgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcbmltcG9ydCB7IE5vZGVBY2Nlc3MgfSBmcm9tICcuLi9jb3JlL2NvbnN0YW50cy5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBzcGVjaWFsIHZlcnNpb24gb2YgYSB0ZXh0dXJlIG5vZGUgY2FuIGJlIHVzZWQgdG9cclxuICogd3JpdGUgZGF0YSBpbnRvIGEgc3RvcmFnZSB0ZXh0dXJlIHdpdGggYSBjb21wdXRlIHNoYWRlci5cclxuICpcclxuICogYGBganNcclxuICogY29uc3Qgc3RvcmFnZVRleHR1cmUgPSBuZXcgVEhSRUUuU3RvcmFnZVRleHR1cmUoIHdpZHRoLCBoZWlnaHQgKTtcclxuICpcclxuICogY29uc3QgY29tcHV0ZVRleHR1cmUgPSBGbiggKCB7IHN0b3JhZ2VUZXh0dXJlIH0gKSA9PiB7XHJcbiAqXHJcbiAqIFx0Y29uc3QgcG9zWCA9IGluc3RhbmNlSW5kZXgubW9kKCB3aWR0aCApO1xyXG4gKiBcdGNvbnN0IHBvc1kgPSBpbnN0YW5jZUluZGV4LmRpdiggd2lkdGggKTtcclxuICogXHRjb25zdCBpbmRleFVWID0gdXZlYzIoIHBvc1gsIHBvc1kgKTtcclxuICpcclxuICogXHQvLyBnZW5lcmF0ZSBSR0IgdmFsdWVzXHJcbiAqXHJcbiAqIFx0Y29uc3QgciA9IDE7XHJcbiAqIFx0Y29uc3QgZyA9IDE7XHJcbiAqIFx0Y29uc3QgYiA9IDE7XHJcbiAqXHJcbiAqIFx0dGV4dHVyZVN0b3JlKCBzdG9yYWdlVGV4dHVyZSwgaW5kZXhVViwgdmVjNCggciwgZywgYiwgMSApICkudG9Xcml0ZU9ubHkoKTtcclxuICpcclxuICogfSApO1xyXG4gKlxyXG4gKiBjb25zdCBjb21wdXRlTm9kZSA9IGNvbXB1dGVUZXh0dXJlKCB7IHN0b3JhZ2VUZXh0dXJlIH0gKS5jb21wdXRlKCB3aWR0aCAqIGhlaWdodCApO1xyXG4gKiByZW5kZXJlci5jb21wdXRlQXN5bmMoIGNvbXB1dGVOb2RlICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBUaGlzIG5vZGUgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIGEgV2ViR1BVIGJhY2tlbmQuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBUZXh0dXJlTm9kZVxyXG4gKi9cclxuY2xhc3MgU3RvcmFnZVRleHR1cmVOb2RlIGV4dGVuZHMgVGV4dHVyZU5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdTdG9yYWdlVGV4dHVyZU5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc3RvcmFnZSB0ZXh0dXJlIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1N0b3JhZ2VUZXh0dXJlfSB2YWx1ZSAtIFRoZSBzdG9yYWdlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtOb2RlPHZlYzJ8dmVjMz59IHV2Tm9kZSAtIFRoZSB1diBub2RlLlxyXG5cdCAqIEBwYXJhbSB7P05vZGV9IFtzdG9yZU5vZGU9bnVsbF0gLSBUaGUgdmFsdWUgbm9kZSB0aGF0IHNob3VsZCBiZSBzdG9yZWQgaW4gdGhlIHRleHR1cmUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHZhbHVlLCB1dk5vZGUsIHN0b3JlTm9kZSA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoIHZhbHVlLCB1dk5vZGUgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB2YWx1ZSBub2RlIHRoYXQgc2hvdWxkIGJlIHN0b3JlZCBpbiB0aGUgdGV4dHVyZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc3RvcmVOb2RlID0gc3RvcmVOb2RlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1N0b3JhZ2VUZXh0dXJlTm9kZSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYWNjZXNzIHR5cGUgb2YgdGhlIHRleHR1cmUgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICogQGRlZmF1bHQgJ3dyaXRlT25seSdcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hY2Nlc3MgPSBOb2RlQWNjZXNzLldSSVRFX09OTFk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogT3ZlcndyaXRlcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byByZXR1cm4gYSBmaXhlZCB2YWx1ZSBgJ3N0b3JhZ2VUZXh0dXJlJ2AuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGlucHV0IHR5cGUuXHJcblx0ICovXHJcblx0Z2V0SW5wdXRUeXBlKCAvKmJ1aWxkZXIqLyApIHtcclxuXHJcblx0XHRyZXR1cm4gJ3N0b3JhZ2VUZXh0dXJlJztcclxuXHJcblx0fVxyXG5cclxuXHRzZXR1cCggYnVpbGRlciApIHtcclxuXHJcblx0XHRzdXBlci5zZXR1cCggYnVpbGRlciApO1xyXG5cclxuXHRcdGNvbnN0IHByb3BlcnRpZXMgPSBidWlsZGVyLmdldE5vZGVQcm9wZXJ0aWVzKCB0aGlzICk7XHJcblx0XHRwcm9wZXJ0aWVzLnN0b3JlTm9kZSA9IHRoaXMuc3RvcmVOb2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgdGhlIG5vZGUgYWNjZXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gVGhlIG5vZGUgYWNjZXNzLlxyXG5cdCAqIEByZXR1cm4ge1N0b3JhZ2VUZXh0dXJlTm9kZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBub2RlLlxyXG5cdCAqL1xyXG5cdHNldEFjY2VzcyggdmFsdWUgKSB7XHJcblxyXG5cdFx0dGhpcy5hY2Nlc3MgPSB2YWx1ZTtcclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyB0aGUgY29kZSBzbmlwcGV0IG9mIHRoZSBzdG9yYWdlIG5vZGUuIElmIG5vIGBzdG9yZU5vZGVgXHJcblx0ICogaXMgZGVmaW5lZCwgdGhlIHRleHR1cmUgbm9kZSBpcyBnZW5lcmF0ZWQgYXMgbm9ybWFsIHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBvdXRwdXQgLSBUaGUgY3VycmVudCBvdXRwdXQuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgZ2VuZXJhdGVkIGNvZGUgc25pcHBldC5cclxuXHQgKi9cclxuXHRnZW5lcmF0ZSggYnVpbGRlciwgb3V0cHV0ICkge1xyXG5cclxuXHRcdGxldCBzbmlwcGV0O1xyXG5cclxuXHRcdGlmICggdGhpcy5zdG9yZU5vZGUgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRzbmlwcGV0ID0gdGhpcy5nZW5lcmF0ZVN0b3JlKCBidWlsZGVyICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHNuaXBwZXQgPSBzdXBlci5nZW5lcmF0ZSggYnVpbGRlciwgb3V0cHV0ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBzbmlwcGV0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgY29uZmlndXJpbmcgYSByZWFkL3dyaXRlIG5vZGUgYWNjZXNzLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7U3RvcmFnZVRleHR1cmVOb2RlfSBBIHJlZmVyZW5jZSB0byB0aGlzIG5vZGUuXHJcblx0ICovXHJcblx0dG9SZWFkV3JpdGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuc2V0QWNjZXNzKCBOb2RlQWNjZXNzLlJFQURfV1JJVEUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGNvbmZpZ3VyaW5nIGEgcmVhZC1vbmx5IG5vZGUgYWNjZXNzLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7U3RvcmFnZVRleHR1cmVOb2RlfSBBIHJlZmVyZW5jZSB0byB0aGlzIG5vZGUuXHJcblx0ICovXHJcblx0dG9SZWFkT25seSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5zZXRBY2Nlc3MoIE5vZGVBY2Nlc3MuUkVBRF9PTkxZICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBjb25maWd1cmluZyBhIHdyaXRlLW9ubHkgbm9kZSBhY2Nlc3MuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtTdG9yYWdlVGV4dHVyZU5vZGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbm9kZS5cclxuXHQgKi9cclxuXHR0b1dyaXRlT25seSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5zZXRBY2Nlc3MoIE5vZGVBY2Nlc3MuV1JJVEVfT05MWSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyB0aGUgY29kZSBzbmlwcGV0IG9mIHRoZSBzdG9yYWdlIHRleHR1cmUgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICovXHJcblx0Z2VuZXJhdGVTdG9yZSggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCBwcm9wZXJ0aWVzID0gYnVpbGRlci5nZXROb2RlUHJvcGVydGllcyggdGhpcyApO1xyXG5cclxuXHRcdGNvbnN0IHsgdXZOb2RlLCBzdG9yZU5vZGUgfSA9IHByb3BlcnRpZXM7XHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZVByb3BlcnR5ID0gc3VwZXIuZ2VuZXJhdGUoIGJ1aWxkZXIsICdwcm9wZXJ0eScgKTtcclxuXHRcdGNvbnN0IHV2U25pcHBldCA9IHV2Tm9kZS5idWlsZCggYnVpbGRlciwgJ3V2ZWMyJyApO1xyXG5cdFx0Y29uc3Qgc3RvcmVTbmlwcGV0ID0gc3RvcmVOb2RlLmJ1aWxkKCBidWlsZGVyLCAndmVjNCcgKTtcclxuXHJcblx0XHRjb25zdCBzbmlwcGV0ID0gYnVpbGRlci5nZW5lcmF0ZVRleHR1cmVTdG9yZSggYnVpbGRlciwgdGV4dHVyZVByb3BlcnR5LCB1dlNuaXBwZXQsIHN0b3JlU25pcHBldCApO1xyXG5cclxuXHRcdGJ1aWxkZXIuYWRkTGluZUZsb3dDb2RlKCBzbmlwcGV0LCB0aGlzICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFN0b3JhZ2VUZXh0dXJlTm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgc3RvcmFnZSB0ZXh0dXJlIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7U3RvcmFnZVRleHR1cmV9IHZhbHVlIC0gVGhlIHN0b3JhZ2UgdGV4dHVyZS5cclxuICogQHBhcmFtIHs/Tm9kZTx2ZWMyfHZlYzM+fSB1dk5vZGUgLSBUaGUgdXYgbm9kZS5cclxuICogQHBhcmFtIHs/Tm9kZX0gW3N0b3JlTm9kZT1udWxsXSAtIFRoZSB2YWx1ZSBub2RlIHRoYXQgc2hvdWxkIGJlIHN0b3JlZCBpbiB0aGUgdGV4dHVyZS5cclxuICogQHJldHVybnMge1N0b3JhZ2VUZXh0dXJlTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBzdG9yYWdlVGV4dHVyZSA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBTdG9yYWdlVGV4dHVyZU5vZGUgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDEsIDMgKTtcclxuXHJcblxyXG4vKipcclxuICogVE9ETzogRXhwbGFpbiBkaWZmZXJlbmNlIHRvIGBzdG9yYWdlVGV4dHVyZSgpYC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtTdG9yYWdlVGV4dHVyZX0gdmFsdWUgLSBUaGUgc3RvcmFnZSB0ZXh0dXJlLlxyXG4gKiBAcGFyYW0ge05vZGU8dmVjMnx2ZWMzPn0gdXZOb2RlIC0gVGhlIHV2IG5vZGUuXHJcbiAqIEBwYXJhbSB7P05vZGV9IFtzdG9yZU5vZGU9bnVsbF0gLSBUaGUgdmFsdWUgbm9kZSB0aGF0IHNob3VsZCBiZSBzdG9yZWQgaW4gdGhlIHRleHR1cmUuXHJcbiAqIEByZXR1cm5zIHtTdG9yYWdlVGV4dHVyZU5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdGV4dHVyZVN0b3JlID0gKCB2YWx1ZSwgdXZOb2RlLCBzdG9yZU5vZGUgKSA9PiB7XHJcblxyXG5cdGNvbnN0IG5vZGUgPSBzdG9yYWdlVGV4dHVyZSggdmFsdWUsIHV2Tm9kZSwgc3RvcmVOb2RlICk7XHJcblxyXG5cdGlmICggc3RvcmVOb2RlICE9PSBudWxsICkgbm9kZS5hcHBlbmQoKTtcclxuXHJcblx0cmV0dXJuIG5vZGU7XHJcblxyXG59O1xyXG4iLCJpbXBvcnQgVGV4dHVyZU5vZGUgZnJvbSAnLi9UZXh0dXJlTm9kZS5qcyc7XHJcbmltcG9ydCB7IG5vZGVQcm94eSwgdmVjMywgRm4sIElmLCBpbnQgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcbmltcG9ydCB7IHRleHR1cmVTaXplIH0gZnJvbSAnLi9UZXh0dXJlU2l6ZU5vZGUuanMnO1xyXG5cclxuY29uc3Qgbm9ybWFsID0gRm4oICggeyB0ZXh0dXJlLCB1diB9ICkgPT4ge1xyXG5cclxuXHRjb25zdCBlcHNpbG9uID0gMC4wMDAxO1xyXG5cclxuXHRjb25zdCByZXQgPSB2ZWMzKCkudG9WYXIoKTtcclxuXHJcblx0SWYoIHV2LngubGVzc1RoYW4oIGVwc2lsb24gKSwgKCkgPT4ge1xyXG5cclxuXHRcdHJldC5hc3NpZ24oIHZlYzMoIDEsIDAsIDAgKSApO1xyXG5cclxuXHR9ICkuRWxzZUlmKCB1di55Lmxlc3NUaGFuKCBlcHNpbG9uICksICgpID0+IHtcclxuXHJcblx0XHRyZXQuYXNzaWduKCB2ZWMzKCAwLCAxLCAwICkgKTtcclxuXHJcblx0fSApLkVsc2VJZiggdXYuei5sZXNzVGhhbiggZXBzaWxvbiApLCAoKSA9PiB7XHJcblxyXG5cdFx0cmV0LmFzc2lnbiggdmVjMyggMCwgMCwgMSApICk7XHJcblxyXG5cdH0gKS5FbHNlSWYoIHV2LnguZ3JlYXRlclRoYW4oIDEgLSBlcHNpbG9uICksICgpID0+IHtcclxuXHJcblx0XHRyZXQuYXNzaWduKCB2ZWMzKCAtIDEsIDAsIDAgKSApO1xyXG5cclxuXHR9ICkuRWxzZUlmKCB1di55LmdyZWF0ZXJUaGFuKCAxIC0gZXBzaWxvbiApLCAoKSA9PiB7XHJcblxyXG5cdFx0cmV0LmFzc2lnbiggdmVjMyggMCwgLSAxLCAwICkgKTtcclxuXHJcblx0fSApLkVsc2VJZiggdXYuei5ncmVhdGVyVGhhbiggMSAtIGVwc2lsb24gKSwgKCkgPT4ge1xyXG5cclxuXHRcdHJldC5hc3NpZ24oIHZlYzMoIDAsIDAsIC0gMSApICk7XHJcblxyXG5cdH0gKS5FbHNlKCAoKSA9PiB7XHJcblxyXG5cdFx0Y29uc3Qgc3RlcCA9IDAuMDE7XHJcblxyXG5cdFx0Y29uc3QgeCA9IHRleHR1cmUuc2FtcGxlKCB1di5hZGQoIHZlYzMoIC0gc3RlcCwgMC4wLCAwLjAgKSApICkuci5zdWIoIHRleHR1cmUuc2FtcGxlKCB1di5hZGQoIHZlYzMoIHN0ZXAsIDAuMCwgMC4wICkgKSApLnIgKTtcclxuXHRcdGNvbnN0IHkgPSB0ZXh0dXJlLnNhbXBsZSggdXYuYWRkKCB2ZWMzKCAwLjAsIC0gc3RlcCwgMC4wICkgKSApLnIuc3ViKCB0ZXh0dXJlLnNhbXBsZSggdXYuYWRkKCB2ZWMzKCAwLjAsIHN0ZXAsIDAuMCApICkgKS5yICk7XHJcblx0XHRjb25zdCB6ID0gdGV4dHVyZS5zYW1wbGUoIHV2LmFkZCggdmVjMyggMC4wLCAwLjAsIC0gc3RlcCApICkgKS5yLnN1YiggdGV4dHVyZS5zYW1wbGUoIHV2LmFkZCggdmVjMyggMC4wLCAwLjAsIHN0ZXAgKSApICkuciApO1xyXG5cclxuXHRcdHJldC5hc3NpZ24oIHZlYzMoIHgsIHksIHogKSApO1xyXG5cclxuXHR9ICk7XHJcblxyXG5cdHJldHVybiByZXQubm9ybWFsaXplKCk7XHJcblxyXG59ICk7XHJcblxyXG4vKipcclxuICogVGhpcyB0eXBlIG9mIHVuaWZvcm0gbm9kZSByZXByZXNlbnRzIGEgM0QgdGV4dHVyZS5cclxuICpcclxuICogQGF1Z21lbnRzIFRleHR1cmVOb2RlXHJcbiAqL1xyXG5jbGFzcyBUZXh0dXJlM0ROb2RlIGV4dGVuZHMgVGV4dHVyZU5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdUZXh0dXJlM0ROb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IDNEIHRleHR1cmUgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7RGF0YTNEVGV4dHVyZX0gdmFsdWUgLSBUaGUgM0QgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0gez9Ob2RlPHZlYzJ8dmVjMz59IFt1dk5vZGU9bnVsbF0gLSBUaGUgdXYgbm9kZS5cclxuXHQgKiBAcGFyYW0gez9Ob2RlPGludD59IFtsZXZlbE5vZGU9bnVsbF0gLSBUaGUgbGV2ZWwgbm9kZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggdmFsdWUsIHV2Tm9kZSA9IG51bGwsIGxldmVsTm9kZSA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoIHZhbHVlLCB1dk5vZGUsIGxldmVsTm9kZSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1RleHR1cmUzRE5vZGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE92ZXJ3cml0ZXMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gcmV0dXJuIGEgZml4ZWQgdmFsdWUgYCd0ZXh0dXJlM0QnYC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgaW5wdXQgdHlwZS5cclxuXHQgKi9cclxuXHRnZXRJbnB1dFR5cGUoIC8qYnVpbGRlciovICkge1xyXG5cclxuXHRcdHJldHVybiAndGV4dHVyZTNEJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgZGVmYXVsdCB1diBub2RlIHdoaWNoIGlzIGluIGNvbnRleHQgb2YgM0QgdGV4dHVyZXMgYSB0aHJlZS1kaW1lbnNpb25hbFxyXG5cdCAqIHV2IG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtOb2RlPHZlYzM+fSBUaGUgZGVmYXVsdCB1diBub2RlLlxyXG5cdCAqL1xyXG5cdGdldERlZmF1bHRVVigpIHtcclxuXHJcblx0XHRyZXR1cm4gdmVjMyggMC41LCAwLjUsIDAuNSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE92ZXJ3cml0dGVuIHdpdGggYW4gZW1wdHkgaW1wbGVtZW50YXRpb24gc2luY2UgdGhlIGB1cGRhdGVNYXRyaXhgIGZsYWcgaXMgaWdub3JlZFxyXG5cdCAqIGZvciAzRCB0ZXh0dXJlcy4gVGhlIHV2IHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBpcyBub3QgYXBwbGllZCB0byAzRCB0ZXh0dXJlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsdWUgLSBUaGUgdXBkYXRlIHRvZ2dsZS5cclxuXHQgKi9cclxuXHRzZXRVcGRhdGVNYXRyaXgoIC8qdmFsdWUqLyApIHsgfSAvLyBJZ25vcmUgLnVwZGF0ZU1hdHJpeCBmb3IgM2QgVGV4dHVyZU5vZGVcclxuXHJcblx0LyoqXHJcblx0ICogT3ZlcndyaXRlcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byByZXR1cm4gdGhlIHVubW9kaWZpZWQgdXYgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHBhcmFtIHtOb2RlfSB1dk5vZGUgLSBUaGUgdXYgbm9kZSB0byBzZXR1cC5cclxuXHQgKiBAcmV0dXJuIHtOb2RlfSBUaGUgdW5tb2RpZmllZCB1diBub2RlLlxyXG5cdCAqL1xyXG5cdHNldHVwVVYoIGJ1aWxkZXIsIHV2Tm9kZSApIHtcclxuXHJcblx0XHRjb25zdCB0ZXh0dXJlID0gdGhpcy52YWx1ZTtcclxuXHJcblx0XHRpZiAoIGJ1aWxkZXIuaXNGbGlwWSgpICYmICggdGV4dHVyZS5pc1JlbmRlclRhcmdldFRleHR1cmUgPT09IHRydWUgfHwgdGV4dHVyZS5pc0ZyYW1lYnVmZmVyVGV4dHVyZSA9PT0gdHJ1ZSApICkge1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLnNhbXBsZXIgKSB7XHJcblxyXG5cdFx0XHRcdHV2Tm9kZSA9IHV2Tm9kZS5mbGlwWSgpO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0dXZOb2RlID0gdXZOb2RlLnNldFkoIGludCggdGV4dHVyZVNpemUoIHRoaXMsIHRoaXMubGV2ZWxOb2RlICkueSApLnN1YiggdXZOb2RlLnkgKS5zdWIoIDEgKSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdXZOb2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyB0aGUgdXYgY29kZSBzbmlwcGV0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcGFyYW0ge05vZGV9IHV2Tm9kZSAtIFRoZSB1diBub2RlIHRvIGdlbmVyYXRlIGNvZGUgZm9yLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGdlbmVyYXRlZCBjb2RlIHNuaXBwZXQuXHJcblx0ICovXHJcblx0Z2VuZXJhdGVVViggYnVpbGRlciwgdXZOb2RlICkge1xyXG5cclxuXHRcdHJldHVybiB1dk5vZGUuYnVpbGQoIGJ1aWxkZXIsICd2ZWMzJyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRPRE8uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGU8dmVjMz59IHV2Tm9kZSAtIFRoZSB1diBub2RlIC5cclxuXHQgKiBAcmV0dXJuIHtOb2RlPHZlYzM+fSBUT0RPLlxyXG5cdCAqL1xyXG5cdG5vcm1hbCggdXZOb2RlICkge1xyXG5cclxuXHRcdHJldHVybiBub3JtYWwoIHsgdGV4dHVyZTogdGhpcywgdXY6IHV2Tm9kZSB9ICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFRleHR1cmUzRE5vZGU7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIDNEIHRleHR1cmUgbm9kZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtEYXRhM0RUZXh0dXJlfSB2YWx1ZSAtIFRoZSAzRCB0ZXh0dXJlLlxyXG4gKiBAcGFyYW0gez9Ob2RlPHZlYzJ8dmVjMz59IFt1dk5vZGU9bnVsbF0gLSBUaGUgdXYgbm9kZS5cclxuICogQHBhcmFtIHs/Tm9kZTxpbnQ+fSBbbGV2ZWxOb2RlPW51bGxdIC0gVGhlIGxldmVsIG5vZGUuXHJcbiAqIEByZXR1cm5zIHtUZXh0dXJlM0ROb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHRleHR1cmUzRCA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBUZXh0dXJlM0ROb2RlICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAxLCAzICk7XHJcbiIsImltcG9ydCBSZWZlcmVuY2VOb2RlIGZyb20gJy4vUmVmZXJlbmNlTm9kZS5qcyc7XHJcbmltcG9ydCB7IG5vZGVPYmplY3QgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcblxyXG4vKipcclxuICogQSBzcGVjaWFsIHR5cGUgb2YgcmVmZXJlbmNlIG5vZGUgdGhhdCBhbGxvd3MgdG8gbGluayB2YWx1ZXMgaW5cclxuICogYHVzZXJEYXRhYCBmaWVsZHMgdG8gbm9kZSBvYmplY3RzLlxyXG4gKiBgYGBqc1xyXG4gKiBzcHJpdGUudXNlckRhdGEucm90YXRpb24gPSAxOyAvLyBzdG9yZXMgaW5kaXZpZHVhbCByb3RhdGlvbiBwZXIgc3ByaXRlXHJcbiAqXHJcbiAqIGNvbnN0IG1hdGVyaWFsID0gbmV3IFRIUkVFLlNwcml0ZU5vZGVNYXRlcmlhbCgpO1xyXG4gKiBtYXRlcmlhbC5yb3RhdGlvbk5vZGUgPSB1c2VyRGF0YSggJ3JvdGF0aW9uJywgJ2Zsb2F0JyApO1xyXG4gKiBgYGBcclxuICogU2luY2UgYFVzZXJEYXRhTm9kZWAgaXMgZXh0ZW5kZWQgZnJvbSB7QGxpbmsgUmVmZXJlbmNlTm9kZX0sIHRoZSBub2RlIHZhbHVlXHJcbiAqIHdpbGwgYXV0b21hdGljYWxseSBiZSB1cGRhdGVkIHdoZW4gdGhlIGByb3RhdGlvbmAgdXNlciBkYXRhIGZpZWxkIGNoYW5nZXMuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBSZWZlcmVuY2VOb2RlXHJcbiAqL1xyXG5jbGFzcyBVc2VyRGF0YU5vZGUgZXh0ZW5kcyBSZWZlcmVuY2VOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnVXNlckRhdGFOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHVzZXIgZGF0YSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IG5hbWUgdGhhdCBzaG91bGQgYmUgcmVmZXJlbmNlZCBieSB0aGUgbm9kZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gaW5wdXRUeXBlIC0gVGhlIG5vZGUgZGF0YSB0eXBlIG9mIHRoZSByZWZlcmVuY2UuXHJcblx0ICogQHBhcmFtIHs/T2JqZWN0fSBbdXNlckRhdGE9bnVsbF0gLSBBIHJlZmVyZW5jZSB0byB0aGUgYHVzZXJEYXRhYCBvYmplY3QuIElmIG5vdCBwcm92aWRlZCwgdGhlIGB1c2VyRGF0YWAgcHJvcGVydHkgb2YgdGhlIDNEIG9iamVjdCB0aGF0IHVzZXMgdGhlIG5vZGUgbWF0ZXJpYWwgaXMgZXZhbHVhdGVkLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwcm9wZXJ0eSwgaW5wdXRUeXBlLCB1c2VyRGF0YSA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoIHByb3BlcnR5LCBpbnB1dFR5cGUsIHVzZXJEYXRhICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZSB0byB0aGUgYHVzZXJEYXRhYCBvYmplY3QuIElmIG5vdCBwcm92aWRlZCwgdGhlIGB1c2VyRGF0YWBcclxuXHRcdCAqIHByb3BlcnR5IG9mIHRoZSAzRCBvYmplY3QgdGhhdCB1c2VzIHRoZSBub2RlIG1hdGVyaWFsIGlzIGV2YWx1YXRlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P09iamVjdH1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51c2VyRGF0YSA9IHVzZXJEYXRhO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE92ZXJ3cml0dGVuIHRvIG1ha2Ugc3VyZSB7QGxpbmsgUmVmZXJlbmNlTm9kZSNyZWZlcmVuY2V9IHBvaW50cyB0byB0aGUgY29ycmVjdFxyXG5cdCAqIGB1c2VyRGF0YWAgZmllbGQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geyhOb2RlRnJhbWV8Tm9kZUJ1aWxkZXIpfSBzdGF0ZSAtIFRoZSBjdXJyZW50IHN0YXRlIHRvIGV2YWx1YXRlLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdH0gQSByZWZlcmVuY2UgdG8gdGhlIGB1c2VyRGF0YWAgZmllbGQuXHJcblx0ICovXHJcblx0dXBkYXRlUmVmZXJlbmNlKCBzdGF0ZSApIHtcclxuXHJcblx0XHR0aGlzLnJlZmVyZW5jZSA9IHRoaXMudXNlckRhdGEgIT09IG51bGwgPyB0aGlzLnVzZXJEYXRhIDogc3RhdGUub2JqZWN0LnVzZXJEYXRhO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnJlZmVyZW5jZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgVXNlckRhdGFOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSB1c2VyIGRhdGEgbm9kZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgcHJvcGVydHkgbmFtZSB0aGF0IHNob3VsZCBiZSByZWZlcmVuY2VkIGJ5IHRoZSBub2RlLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5wdXRUeXBlIC0gVGhlIG5vZGUgZGF0YSB0eXBlIG9mIHRoZSByZWZlcmVuY2UuXHJcbiAqIEBwYXJhbSB7P09iamVjdH0gdXNlckRhdGEgLSBBIHJlZmVyZW5jZSB0byB0aGUgYHVzZXJEYXRhYCBvYmplY3QuIElmIG5vdCBwcm92aWRlZCwgdGhlIGB1c2VyRGF0YWAgcHJvcGVydHkgb2YgdGhlIDNEIG9iamVjdCB0aGF0IHVzZXMgdGhlIG5vZGUgbWF0ZXJpYWwgaXMgZXZhbHVhdGVkLlxyXG4gKiBAcmV0dXJucyB7VXNlckRhdGFOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHVzZXJEYXRhID0gKCBuYW1lLCBpbnB1dFR5cGUsIHVzZXJEYXRhICkgPT4gbm9kZU9iamVjdCggbmV3IFVzZXJEYXRhTm9kZSggbmFtZSwgaW5wdXRUeXBlLCB1c2VyRGF0YSApICk7XHJcbiIsImltcG9ydCBUZW1wTm9kZSBmcm9tICcuLi9jb3JlL1RlbXBOb2RlLmpzJztcclxuaW1wb3J0IHsgbW9kZWxWaWV3TWF0cml4IH0gZnJvbSAnLi9Nb2RlbE5vZGUuanMnO1xyXG5pbXBvcnQgeyBwb3NpdGlvbkxvY2FsLCBwb3NpdGlvblByZXZpb3VzIH0gZnJvbSAnLi9Qb3NpdGlvbi5qcyc7XHJcbmltcG9ydCB7IG5vZGVJbW11dGFibGUgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcbmltcG9ydCB7IE5vZGVVcGRhdGVUeXBlIH0gZnJvbSAnLi4vY29yZS9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBNYXRyaXg0IH0gZnJvbSAnLi4vLi4vbWF0aC9NYXRyaXg0LmpzJztcclxuaW1wb3J0IHsgdW5pZm9ybSB9IGZyb20gJy4uL2NvcmUvVW5pZm9ybU5vZGUuanMnO1xyXG5pbXBvcnQgeyBzdWIgfSBmcm9tICcuLi9tYXRoL09wZXJhdG9yTm9kZS5qcyc7XHJcbmltcG9ydCB7IGNhbWVyYVByb2plY3Rpb25NYXRyaXggfSBmcm9tICcuL0NhbWVyYS5qcyc7XHJcbmltcG9ydCB7IHJlbmRlckdyb3VwIH0gZnJvbSAnLi4vY29yZS9Vbmlmb3JtR3JvdXBOb2RlLmpzJztcclxuXHJcbmNvbnN0IF9vYmplY3REYXRhID0gbmV3IFdlYWtNYXAoKTtcclxuXHJcbi8qKlxyXG4gKiBBIG5vZGUgZm9yIHJlcHJlc2VudGluZyBtb3Rpb24gb3IgdmVsb2NpdHkgdmVjdG9ycy4gRm91bmRhdGlvblxyXG4gKiBmb3IgYWR2YW5jZWQgcG9zdCBwcm9jZXNzaW5nIGVmZmVjdHMgbGlrZSBtb3Rpb24gYmx1ciBvciBUUkFBLlxyXG4gKlxyXG4gKiBUaGUgbm9kZSBrZWVwcyB0cmFjayBvZiB0aGUgbW9kZWwsIHZpZXcgYW5kIHByb2plY3Rpb24gbWF0cmljZXNcclxuICogb2YgdGhlIHByZXZpb3VzIGZyYW1lIGFuZCB1c2VzIHRoZW0gdG8gY29tcHV0ZSBvZmZzZXRzIGluIE5EQyBzcGFjZS5cclxuICogVGhlc2Ugb2Zmc2V0cyByZXByZXNlbnQgdGhlIGZpbmFsIHZlbG9jaXR5LlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgVGVtcE5vZGVcclxuICovXHJcbmNsYXNzIFZlbG9jaXR5Tm9kZSBleHRlbmRzIFRlbXBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnVmVsb2NpdHlOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHZlcnRleCBjb2xvciBub2RlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cclxuXHRcdHN1cGVyKCAndmVjMicgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjdXJyZW50IHByb2plY3Rpb24gbWF0cml4LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/TWF0cml4NH1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wcm9qZWN0aW9uTWF0cml4ID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIE92ZXJ3cml0dGVuIHNpbmNlIHZlbG9jaXR5IG5vZGVzIGFyZSB1cGRhdGVkIHBlciBvYmplY3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqIEBkZWZhdWx0ICdvYmplY3QnXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXBkYXRlVHlwZSA9IE5vZGVVcGRhdGVUeXBlLk9CSkVDVDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIE92ZXJ3cml0dGVuIHNpbmNlIHZlbG9jaXR5IG5vZGVzIHNhdmUgZGF0YSBhZnRlciB0aGUgdXBkYXRlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKiBAZGVmYXVsdCAnb2JqZWN0J1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVwZGF0ZUFmdGVyVHlwZSA9IE5vZGVVcGRhdGVUeXBlLk9CSkVDVDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFVuaWZvcm0gbm9kZSByZXByZXNlbnRpbmcgdGhlIHByZXZpb3VzIG1vZGVsIG1hdHJpeCBpbiB3b3JsZCBzcGFjZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VW5pZm9ybU5vZGU8bWF0ND59XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucHJldmlvdXNNb2RlbFdvcmxkTWF0cml4ID0gdW5pZm9ybSggbmV3IE1hdHJpeDQoKSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVW5pZm9ybSBub2RlIHJlcHJlc2VudGluZyB0aGUgcHJldmlvdXMgcHJvamVjdGlvbiBtYXRyaXguXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1VuaWZvcm1Ob2RlPG1hdDQ+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnByZXZpb3VzUHJvamVjdGlvbk1hdHJpeCA9IHVuaWZvcm0oIG5ldyBNYXRyaXg0KCkgKS5zZXRHcm91cCggcmVuZGVyR3JvdXAgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFVuaWZvcm0gbm9kZSByZXByZXNlbnRpbmcgdGhlIHByZXZpb3VzIHZpZXcgbWF0cml4LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtVbmlmb3JtTm9kZTxtYXQ0Pn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wcmV2aW91c0NhbWVyYVZpZXdNYXRyaXggPSB1bmlmb3JtKCBuZXcgTWF0cml4NCgpICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZ2l2ZW4gcHJvamVjdGlvbiBtYXRyaXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDR9IHByb2plY3Rpb25NYXRyaXggLSBUaGUgcHJvamVjdGlvbiBtYXRyaXggdG8gc2V0LlxyXG5cdCAqL1xyXG5cdHNldFByb2plY3Rpb25NYXRyaXgoIHByb2plY3Rpb25NYXRyaXggKSB7XHJcblxyXG5cdFx0dGhpcy5wcm9qZWN0aW9uTWF0cml4ID0gcHJvamVjdGlvbk1hdHJpeDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHZlbG9jaXR5IHNwZWNpZmljIHVuaWZvcm1zLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlRnJhbWV9IGZyYW1lIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgbm9kZSBmcmFtZS5cclxuXHQgKi9cclxuXHR1cGRhdGUoIHsgZnJhbWVJZCwgY2FtZXJhLCBvYmplY3QgfSApIHtcclxuXHJcblx0XHRjb25zdCBwcmV2aW91c01vZGVsTWF0cml4ID0gZ2V0UHJldmlvdXNNYXRyaXgoIG9iamVjdCApO1xyXG5cclxuXHRcdHRoaXMucHJldmlvdXNNb2RlbFdvcmxkTWF0cml4LnZhbHVlLmNvcHkoIHByZXZpb3VzTW9kZWxNYXRyaXggKTtcclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGNvbnN0IGNhbWVyYURhdGEgPSBnZXREYXRhKCBjYW1lcmEgKTtcclxuXHJcblx0XHRpZiAoIGNhbWVyYURhdGEuZnJhbWVJZCAhPT0gZnJhbWVJZCApIHtcclxuXHJcblx0XHRcdGNhbWVyYURhdGEuZnJhbWVJZCA9IGZyYW1lSWQ7XHJcblxyXG5cdFx0XHRpZiAoIGNhbWVyYURhdGEucHJldmlvdXNQcm9qZWN0aW9uTWF0cml4ID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGNhbWVyYURhdGEucHJldmlvdXNQcm9qZWN0aW9uTWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcclxuXHRcdFx0XHRjYW1lcmFEYXRhLnByZXZpb3VzQ2FtZXJhVmlld01hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XHJcblxyXG5cdFx0XHRcdGNhbWVyYURhdGEuY3VycmVudFByb2plY3Rpb25NYXRyaXggPSBuZXcgTWF0cml4NCgpO1xyXG5cdFx0XHRcdGNhbWVyYURhdGEuY3VycmVudENhbWVyYVZpZXdNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xyXG5cclxuXHRcdFx0XHRjYW1lcmFEYXRhLnByZXZpb3VzUHJvamVjdGlvbk1hdHJpeC5jb3B5KCB0aGlzLnByb2plY3Rpb25NYXRyaXggfHwgY2FtZXJhLnByb2plY3Rpb25NYXRyaXggKTtcclxuXHRcdFx0XHRjYW1lcmFEYXRhLnByZXZpb3VzQ2FtZXJhVmlld01hdHJpeC5jb3B5KCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRjYW1lcmFEYXRhLnByZXZpb3VzUHJvamVjdGlvbk1hdHJpeC5jb3B5KCBjYW1lcmFEYXRhLmN1cnJlbnRQcm9qZWN0aW9uTWF0cml4ICk7XHJcblx0XHRcdFx0Y2FtZXJhRGF0YS5wcmV2aW91c0NhbWVyYVZpZXdNYXRyaXguY29weSggY2FtZXJhRGF0YS5jdXJyZW50Q2FtZXJhVmlld01hdHJpeCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y2FtZXJhRGF0YS5jdXJyZW50UHJvamVjdGlvbk1hdHJpeC5jb3B5KCB0aGlzLnByb2plY3Rpb25NYXRyaXggfHwgY2FtZXJhLnByb2plY3Rpb25NYXRyaXggKTtcclxuXHRcdFx0Y2FtZXJhRGF0YS5jdXJyZW50Q2FtZXJhVmlld01hdHJpeC5jb3B5KCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlICk7XHJcblxyXG5cdFx0XHR0aGlzLnByZXZpb3VzUHJvamVjdGlvbk1hdHJpeC52YWx1ZS5jb3B5KCBjYW1lcmFEYXRhLnByZXZpb3VzUHJvamVjdGlvbk1hdHJpeCApO1xyXG5cdFx0XHR0aGlzLnByZXZpb3VzQ2FtZXJhVmlld01hdHJpeC52YWx1ZS5jb3B5KCBjYW1lcmFEYXRhLnByZXZpb3VzQ2FtZXJhVmlld01hdHJpeCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBPdmVyd3JpdHRlbiB0byB1cGRhdGVkIHZlbG9jaXR5IHNwZWNpZmljIHVuaWZvcm1zLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlRnJhbWV9IGZyYW1lIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgbm9kZSBmcmFtZS5cclxuXHQgKi9cclxuXHR1cGRhdGVBZnRlciggeyBvYmplY3QgfSApIHtcclxuXHJcblx0XHRnZXRQcmV2aW91c01hdHJpeCggb2JqZWN0ICkuY29weSggb2JqZWN0Lm1hdHJpeFdvcmxkICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW1wbGVtZW50cyB0aGUgdmVsb2NpdHkgY29tcHV0YXRpb24gYmFzZWQgb24gdGhlIHByZXZpb3VzIGFuZCBjdXJyZW50IHZlcnRleCBkYXRhLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtOb2RlPHZlYzI+fSBUaGUgbW90aW9uIHZlY3Rvci5cclxuXHQgKi9cclxuXHRzZXR1cCggLypidWlsZGVyKi8gKSB7XHJcblxyXG5cdFx0Y29uc3QgcHJvamVjdGlvbk1hdHJpeCA9ICggdGhpcy5wcm9qZWN0aW9uTWF0cml4ID09PSBudWxsICkgPyBjYW1lcmFQcm9qZWN0aW9uTWF0cml4IDogdW5pZm9ybSggdGhpcy5wcm9qZWN0aW9uTWF0cml4ICk7XHJcblxyXG5cdFx0Y29uc3QgcHJldmlvdXNNb2RlbFZpZXdNYXRyaXggPSB0aGlzLnByZXZpb3VzQ2FtZXJhVmlld01hdHJpeC5tdWwoIHRoaXMucHJldmlvdXNNb2RlbFdvcmxkTWF0cml4ICk7XHJcblxyXG5cdFx0Y29uc3QgY2xpcFBvc2l0aW9uQ3VycmVudCA9IHByb2plY3Rpb25NYXRyaXgubXVsKCBtb2RlbFZpZXdNYXRyaXggKS5tdWwoIHBvc2l0aW9uTG9jYWwgKTtcclxuXHRcdGNvbnN0IGNsaXBQb3NpdGlvblByZXZpb3VzID0gdGhpcy5wcmV2aW91c1Byb2plY3Rpb25NYXRyaXgubXVsKCBwcmV2aW91c01vZGVsVmlld01hdHJpeCApLm11bCggcG9zaXRpb25QcmV2aW91cyApO1xyXG5cclxuXHRcdGNvbnN0IG5kY1Bvc2l0aW9uQ3VycmVudCA9IGNsaXBQb3NpdGlvbkN1cnJlbnQueHkuZGl2KCBjbGlwUG9zaXRpb25DdXJyZW50LncgKTtcclxuXHRcdGNvbnN0IG5kY1Bvc2l0aW9uUHJldmlvdXMgPSBjbGlwUG9zaXRpb25QcmV2aW91cy54eS5kaXYoIGNsaXBQb3NpdGlvblByZXZpb3VzLncgKTtcclxuXHJcblx0XHRjb25zdCB2ZWxvY2l0eSA9IHN1YiggbmRjUG9zaXRpb25DdXJyZW50LCBuZGNQb3NpdGlvblByZXZpb3VzICk7XHJcblxyXG5cdFx0cmV0dXJuIHZlbG9jaXR5O1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBnZXREYXRhKCBvYmplY3QgKSB7XHJcblxyXG5cdGxldCBvYmplY3REYXRhID0gX29iamVjdERhdGEuZ2V0KCBvYmplY3QgKTtcclxuXHJcblx0aWYgKCBvYmplY3REYXRhID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0b2JqZWN0RGF0YSA9IHt9O1xyXG5cdFx0X29iamVjdERhdGEuc2V0KCBvYmplY3QsIG9iamVjdERhdGEgKTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gb2JqZWN0RGF0YTtcclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldFByZXZpb3VzTWF0cml4KCBvYmplY3QsIGluZGV4ID0gMCApIHtcclxuXHJcblx0Y29uc3Qgb2JqZWN0RGF0YSA9IGdldERhdGEoIG9iamVjdCApO1xyXG5cclxuXHRsZXQgbWF0cml4ID0gb2JqZWN0RGF0YVsgaW5kZXggXTtcclxuXHJcblx0aWYgKCBtYXRyaXggPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRvYmplY3REYXRhWyBpbmRleCBdID0gbWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gbWF0cml4O1xyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgVmVsb2NpdHlOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSB2ZWxvY2l0eSBvZiBhIHJlbmRlciBwYXNzLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtWZWxvY2l0eU5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdmVsb2NpdHkgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIFZlbG9jaXR5Tm9kZSApO1xyXG4iLCJpbXBvcnQgeyBGbiwgdmVjNCB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuaW1wb3J0IHsgbWl4LCBtaW4sIHN0ZXAgfSBmcm9tICcuLi9tYXRoL01hdGhOb2RlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIGEgXCJDb2xvciBCdXJuXCIgYmxlbmQgbW9kZS5cclxuICpcclxuICogSXQncyBkZXNpZ25lZCB0byBkYXJrZW4gdGhlIGJhc2UgbGF5ZXIncyBjb2xvcnMgYmFzZWQgb24gdGhlIGNvbG9yIG9mIHRoZSBibGVuZCBsYXllci5cclxuICogSXQgc2lnbmlmaWNhbnRseSBpbmNyZWFzZXMgdGhlIGNvbnRyYXN0IG9mIHRoZSBiYXNlIGxheWVyLCBtYWtpbmcgdGhlIGNvbG9ycyBtb3JlIHZpYnJhbnQgYW5kIHNhdHVyYXRlZC5cclxuICogVGhlIGRhcmtlciB0aGUgY29sb3IgaW4gdGhlIGJsZW5kIGxheWVyLCB0aGUgc3Ryb25nZXIgdGhlIGRhcmtlbmluZyBhbmQgY29udHJhc3QgZWZmZWN0IG9uIHRoZSBiYXNlIGxheWVyLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGU8dmVjMz59IGJhc2UgLSBUaGUgYmFzZSBjb2xvci5cclxuICogQHBhcmFtIHtOb2RlPHZlYzM+fSBibGVuZCAtIFRoZSBibGVuZCBjb2xvci4gQSB3aGl0ZSAoI2ZmZmZmZikgYmxlbmQgY29sb3IgZG9lcyBub3QgYWx0ZXIgdGhlIGJhc2UgY29sb3IuXHJcbiAqIEByZXR1cm4ge05vZGU8dmVjMz59IFRoZSByZXN1bHQuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYmxlbmRCdXJuID0gLypAX19QVVJFX18qLyBGbiggKCBbIGJhc2UsIGJsZW5kIF0gKSA9PiB7XHJcblxyXG5cdHJldHVybiBtaW4oIDEuMCwgYmFzZS5vbmVNaW51cygpLmRpdiggYmxlbmQgKSApLm9uZU1pbnVzKCk7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ2JsZW5kQnVybicsXHJcblx0dHlwZTogJ3ZlYzMnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAnYmFzZScsIHR5cGU6ICd2ZWMzJyB9LFxyXG5cdFx0eyBuYW1lOiAnYmxlbmQnLCB0eXBlOiAndmVjMycgfVxyXG5cdF1cclxufSApO1xyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgYSBcIkNvbG9yIERvZGdlXCIgYmxlbmQgbW9kZS5cclxuICpcclxuICogSXQncyBkZXNpZ25lZCB0byBsaWdodGVuIHRoZSBiYXNlIGxheWVyJ3MgY29sb3JzIGJhc2VkIG9uIHRoZSBjb2xvciBvZiB0aGUgYmxlbmQgbGF5ZXIuXHJcbiAqIEl0IHNpZ25pZmljYW50bHkgaW5jcmVhc2VzIHRoZSBicmlnaHRuZXNzIG9mIHRoZSBiYXNlIGxheWVyLCBtYWtpbmcgdGhlIGNvbG9ycyBsaWdodGVyIGFuZCBtb3JlIHZpYnJhbnQuXHJcbiAqIFRoZSBicmlnaHRlciB0aGUgY29sb3IgaW4gdGhlIGJsZW5kIGxheWVyLCB0aGUgc3Ryb25nZXIgdGhlIGxpZ2h0ZW5pbmcgYW5kIGNvbnRyYXN0IGVmZmVjdCBvbiB0aGUgYmFzZSBsYXllci5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlPHZlYzM+fSBiYXNlIC0gVGhlIGJhc2UgY29sb3IuXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMzPn0gYmxlbmQgLSBUaGUgYmxlbmQgY29sb3IuIEEgYmxhY2sgKCMwMDAwMDApIGJsZW5kIGNvbG9yIGRvZXMgbm90IGFsdGVyIHRoZSBiYXNlIGNvbG9yLlxyXG4gKiBAcmV0dXJuIHtOb2RlPHZlYzM+fSBUaGUgcmVzdWx0LlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGJsZW5kRG9kZ2UgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgYmFzZSwgYmxlbmQgXSApID0+IHtcclxuXHJcblx0cmV0dXJuIG1pbiggYmFzZS5kaXYoIGJsZW5kLm9uZU1pbnVzKCkgKSwgMS4wICk7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ2JsZW5kRG9kZ2UnLFxyXG5cdHR5cGU6ICd2ZWMzJyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ2Jhc2UnLCB0eXBlOiAndmVjMycgfSxcclxuXHRcdHsgbmFtZTogJ2JsZW5kJywgdHlwZTogJ3ZlYzMnIH1cclxuXHRdXHJcbn0gKTtcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIGEgXCJTY3JlZW5cIiBibGVuZCBtb2RlLlxyXG4gKlxyXG4gKiBTaW1pbGFyIHRvIGBibGVuZERvZGdlKClgLCB0aGlzIG1vZGUgYWxzbyBsaWdodGVucyB0aGUgYmFzZSBsYXllcidzIGNvbG9ycyBiYXNlZCBvbiB0aGUgY29sb3Igb2YgdGhlIGJsZW5kIGxheWVyLlxyXG4gKiBUaGUgXCJTY3JlZW5cIiBibGVuZCBtb2RlIGlzIGJldHRlciBmb3IgZ2VuZXJhbCBicmlnaHRlbmluZyB3aGVyZWFzIHRoZSBcIkRvZGdlXCIgcmVzdWx0cyBpbiBtb3JlIHN1YnRsZSBhbmQgbnVhbmNlZFxyXG4gKiBlZmZlY3RzLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGU8dmVjMz59IGJhc2UgLSBUaGUgYmFzZSBjb2xvci5cclxuICogQHBhcmFtIHtOb2RlPHZlYzM+fSBibGVuZCAtIFRoZSBibGVuZCBjb2xvci4gQSBibGFjayAoIzAwMDAwMCkgYmxlbmQgY29sb3IgZG9lcyBub3QgYWx0ZXIgdGhlIGJhc2UgY29sb3IuXHJcbiAqIEByZXR1cm4ge05vZGU8dmVjMz59IFRoZSByZXN1bHQuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYmxlbmRTY3JlZW4gPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgYmFzZSwgYmxlbmQgXSApID0+IHtcclxuXHJcblx0cmV0dXJuIGJhc2Uub25lTWludXMoKS5tdWwoIGJsZW5kLm9uZU1pbnVzKCkgKS5vbmVNaW51cygpO1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdibGVuZFNjcmVlbicsXHJcblx0dHlwZTogJ3ZlYzMnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAnYmFzZScsIHR5cGU6ICd2ZWMzJyB9LFxyXG5cdFx0eyBuYW1lOiAnYmxlbmQnLCB0eXBlOiAndmVjMycgfVxyXG5cdF1cclxufSApO1xyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgYSBcIk92ZXJsYXlcIiBibGVuZCBtb2RlLlxyXG4gKlxyXG4gKiBJdCdzIGRlc2lnbmVkIHRvIGluY3JlYXNlIHRoZSBjb250cmFzdCBvZiB0aGUgYmFzZSBsYXllciBiYXNlZCBvbiB0aGUgY29sb3Igb2YgdGhlIGJsZW5kIGxheWVyLlxyXG4gKiBJdCBhbXBsaWZpZXMgdGhlIGV4aXN0aW5nIGNvbG9ycyBhbmQgY29udHJhc3QgaW4gdGhlIGJhc2UgbGF5ZXIsIG1ha2luZyBsaWdodGVyIGFyZWFzIGxpZ2h0ZXIgYW5kIGRhcmtlciBhcmVhcyBkYXJrZXIuXHJcbiAqIFRoZSBjb2xvciBvZiB0aGUgYmxlbmQgbGF5ZXIgc2lnbmlmaWNhbnRseSBpbmZsdWVuY2VzIHRoZSByZXN1bHRpbmcgY29udHJhc3QgYW5kIGNvbG9yIHNoaWZ0IGluIHRoZSBiYXNlIGxheWVyLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGU8dmVjMz59IGJhc2UgLSBUaGUgYmFzZSBjb2xvci5cclxuICogQHBhcmFtIHtOb2RlPHZlYzM+fSBibGVuZCAtIFRoZSBibGVuZCBjb2xvclxyXG4gKiBAcmV0dXJuIHtOb2RlPHZlYzM+fSBUaGUgcmVzdWx0LlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGJsZW5kT3ZlcmxheSA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyBiYXNlLCBibGVuZCBdICkgPT4ge1xyXG5cclxuXHRyZXR1cm4gbWl4KCBiYXNlLm11bCggMi4wICkubXVsKCBibGVuZCApLCBiYXNlLm9uZU1pbnVzKCkubXVsKCAyLjAgKS5tdWwoIGJsZW5kLm9uZU1pbnVzKCkgKS5vbmVNaW51cygpLCBzdGVwKCAwLjUsIGJhc2UgKSApO1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdibGVuZE92ZXJsYXknLFxyXG5cdHR5cGU6ICd2ZWMzJyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ2Jhc2UnLCB0eXBlOiAndmVjMycgfSxcclxuXHRcdHsgbmFtZTogJ2JsZW5kJywgdHlwZTogJ3ZlYzMnIH1cclxuXHRdXHJcbn0gKTtcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGZ1bmN0aW9uIGJsZW5kcyB0d28gY29sb3IgYmFzZWQgb24gdGhlaXIgYWxwaGEgdmFsdWVzIGJ5IHJlcGxpY2F0aW5nIHRoZSBiZWhhdmlvciBvZiBgVEhSRUUuTm9ybWFsQmxlbmRpbmdgLlxyXG4gKiBJdCBhc3N1bWVzIGJvdGggaW5wdXQgY29sb3JzIGhhdmUgbm9uLXByZW11bHRpcGxpZWQgYWxwaGEuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWM0Pn0gYmFzZSAtIFRoZSBiYXNlIGNvbG9yLlxyXG4gKiBAcGFyYW0ge05vZGU8dmVjND59IGJsZW5kIC0gVGhlIGJsZW5kIGNvbG9yXHJcbiAqIEByZXR1cm4ge05vZGU8dmVjND59IFRoZSByZXN1bHQuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYmxlbmRDb2xvciA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyBiYXNlLCBibGVuZCBdICkgPT4ge1xyXG5cclxuXHRjb25zdCBvdXRBbHBoYSA9IGJsZW5kLmEuYWRkKCBiYXNlLmEubXVsKCBibGVuZC5hLm9uZU1pbnVzKCkgKSApO1xyXG5cclxuXHRyZXR1cm4gdmVjNCggYmxlbmQucmdiLm11bCggYmxlbmQuYSApLmFkZCggYmFzZS5yZ2IubXVsKCBiYXNlLmEgKS5tdWwoIGJsZW5kLmEub25lTWludXMoKSApICkuZGl2KCBvdXRBbHBoYSApLCBvdXRBbHBoYSApO1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdibGVuZENvbG9yJyxcclxuXHR0eXBlOiAndmVjNCcsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICdiYXNlJywgdHlwZTogJ3ZlYzQnIH0sXHJcblx0XHR7IG5hbWU6ICdibGVuZCcsIHR5cGU6ICd2ZWM0JyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG4vLyBEZXByZWNhdGVkXHJcblxyXG4vKipcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQGRlcHJlY2F0ZWQgc2luY2UgcjE3MS4gVXNlIHtAbGluayBibGVuZEJ1cm59IGluc3RlYWQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7Li4uYW55fSBwYXJhbXNcclxuICogQHJldHVybnMge0Z1bmN0aW9ufVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGJ1cm4gPSAoIC4uLnBhcmFtcyApID0+IHsgLy8gQGRlcHJlY2F0ZWQsIHIxNzFcclxuXHJcblx0Y29uc29sZS53YXJuKCAnVEhSRUUuVFNMOiBcImJ1cm5cIiBoYXMgYmVlbiByZW5hbWVkLiBVc2UgXCJibGVuZEJ1cm5cIiBpbnN0ZWFkLicgKTtcclxuXHRyZXR1cm4gYmxlbmRCdXJuKCBwYXJhbXMgKTtcclxuXHJcbn07XHJcblxyXG4vKipcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQGRlcHJlY2F0ZWQgc2luY2UgcjE3MS4gVXNlIHtAbGluayBibGVuZERvZGdlfSBpbnN0ZWFkLlxyXG4gKlxyXG4gKiBAcGFyYW0gey4uLmFueX0gcGFyYW1zXHJcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBkb2RnZSA9ICggLi4ucGFyYW1zICkgPT4geyAvLyBAZGVwcmVjYXRlZCwgcjE3MVxyXG5cclxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5UU0w6IFwiZG9kZ2VcIiBoYXMgYmVlbiByZW5hbWVkLiBVc2UgXCJibGVuZERvZGdlXCIgaW5zdGVhZC4nICk7XHJcblx0cmV0dXJuIGJsZW5kRG9kZ2UoIHBhcmFtcyApO1xyXG5cclxufTtcclxuXHJcbi8qKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAZGVwcmVjYXRlZCBzaW5jZSByMTcxLiBVc2Uge0BsaW5rIGJsZW5kU2NyZWVufSBpbnN0ZWFkLlxyXG4gKlxyXG4gKiBAcGFyYW0gey4uLmFueX0gcGFyYW1zXHJcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBzY3JlZW4gPSAoIC4uLnBhcmFtcyApID0+IHsgLy8gQGRlcHJlY2F0ZWQsIHIxNzFcclxuXHJcblx0Y29uc29sZS53YXJuKCAnVEhSRUUuVFNMOiBcInNjcmVlblwiIGhhcyBiZWVuIHJlbmFtZWQuIFVzZSBcImJsZW5kU2NyZWVuXCIgaW5zdGVhZC4nICk7XHJcblx0cmV0dXJuIGJsZW5kU2NyZWVuKCBwYXJhbXMgKTtcclxuXHJcbn07XHJcblxyXG4vKipcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQGRlcHJlY2F0ZWQgc2luY2UgcjE3MS4gVXNlIHtAbGluayBibGVuZE92ZXJsYXl9IGluc3RlYWQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7Li4uYW55fSBwYXJhbXNcclxuICogQHJldHVybnMge0Z1bmN0aW9ufVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG92ZXJsYXkgPSAoIC4uLnBhcmFtcyApID0+IHsgLy8gQGRlcHJlY2F0ZWQsIHIxNzFcclxuXHJcblx0Y29uc29sZS53YXJuKCAnVEhSRUUuVFNMOiBcIm92ZXJsYXlcIiBoYXMgYmVlbiByZW5hbWVkLiBVc2UgXCJibGVuZE92ZXJsYXlcIiBpbnN0ZWFkLicgKTtcclxuXHRyZXR1cm4gYmxlbmRPdmVybGF5KCBwYXJhbXMgKTtcclxuXHJcbn07XHJcbiIsImltcG9ydCB7IGRvdCwgbWF4LCBtaXggfSBmcm9tICcuLi9tYXRoL01hdGhOb2RlLmpzJztcclxuaW1wb3J0IHsgYWRkIH0gZnJvbSAnLi4vbWF0aC9PcGVyYXRvck5vZGUuanMnO1xyXG5pbXBvcnQgeyBGbiwgSWYsIGZsb2F0LCB2ZWMzLCB2ZWM0IH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5pbXBvcnQgeyBDb2xvck1hbmFnZW1lbnQgfSBmcm9tICcuLi8uLi9tYXRoL0NvbG9yTWFuYWdlbWVudC5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBMaW5lYXJTUkdCQ29sb3JTcGFjZSB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcblxyXG4vKipcclxuICogQ29tcHV0ZXMgYSBncmF5c2NhbGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBSR0IgY29sb3IgdmFsdWUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMzPn0gY29sb3IgLSBUaGUgY29sb3IgdmFsdWUgdG8gY29tcHV0ZSB0aGUgZ3JheXNjYWxlIGZvci5cclxuICogQHJldHVybiB7Tm9kZTx2ZWMzPn0gVGhlIGdyYXlzY2FsZSBjb2xvci5cclxuICovXHJcbmV4cG9ydCBjb25zdCBncmF5c2NhbGUgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgY29sb3IgXSApID0+IHtcclxuXHJcblx0cmV0dXJuIGx1bWluYW5jZSggY29sb3IucmdiICk7XHJcblxyXG59ICk7XHJcblxyXG4vKipcclxuICogU3VwZXItc2F0dXJhdGVzIG9yIGRlc2F0dXJhdGVzIHRoZSBnaXZlbiBSR0IgY29sb3IuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMzPn0gY29sb3IgLSBUaGUgaW5wdXQgY29sb3IuXHJcbiAqIEBwYXJhbSB7Tm9kZTxmbG9hdD59IFthZGp1c3RtZW50PTFdIC0gU3BlY2lmaWVzIHRoZSBhbW91bnQgb2YgdGhlIGNvbnZlcnNpb24uIEEgdmFsdWUgdW5kZXIgYDFgIGRlc2F0dXJhdGVzIHRoZSBjb2xvciwgYSB2YWx1ZSBvdmVyIGAxYCBzdXBlci1zYXR1cmF0ZXMgaXQuXHJcbiAqIEByZXR1cm4ge05vZGU8dmVjMz59IFRoZSBzYXR1cmF0ZWQgY29sb3IuXHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgc2F0dXJhdGlvbiA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyBjb2xvciwgYWRqdXN0bWVudCA9IGZsb2F0KCAxICkgXSApID0+IHtcclxuXHJcblx0cmV0dXJuIGFkanVzdG1lbnQubWl4KCBsdW1pbmFuY2UoIGNvbG9yLnJnYiApLCBjb2xvci5yZ2IgKTtcclxuXHJcbn0gKTtcclxuXHJcbi8qKlxyXG4gKiBTZWxlY3RpdmVseSBlbmhhbmNlIHRoZSBpbnRlbnNpdHkgb2YgbGVzcyBzYXR1cmF0ZWQgUkdCIGNvbG9ycy4gQ2FuIHJlc3VsdFxyXG4gKiBpbiBhIG1vcmUgbmF0dXJhbCBhbmQgdmlzdWFsbHkgYXBwZWFsaW5nIGltYWdlIHdpdGggZW5oYW5jZWQgY29sb3IgZGVwdGhcclxuICogY29tcGFyZWQgdG8ge0BsaW5rIENvbG9yQWRqdXN0bWVudCNzYXR1cmF0aW9ufS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlPHZlYzM+fSBjb2xvciAtIFRoZSBpbnB1dCBjb2xvci5cclxuICogQHBhcmFtIHtOb2RlPGZsb2F0Pn0gW2FkanVzdG1lbnQ9MV0gLSBDb250cm9scyB0aGUgaW50ZW5zaXR5IG9mIHRoZSB2aWJyYW5jZSBlZmZlY3QuXHJcbiAqIEByZXR1cm4ge05vZGU8dmVjMz59IFRoZSB1cGRhdGVkIGNvbG9yLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHZpYnJhbmNlID0gLypAX19QVVJFX18qLyBGbiggKCBbIGNvbG9yLCBhZGp1c3RtZW50ID0gZmxvYXQoIDEgKSBdICkgPT4ge1xyXG5cclxuXHRjb25zdCBhdmVyYWdlID0gYWRkKCBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iICkuZGl2KCAzLjAgKTtcclxuXHJcblx0Y29uc3QgbXggPSBjb2xvci5yLm1heCggY29sb3IuZy5tYXgoIGNvbG9yLmIgKSApO1xyXG5cdGNvbnN0IGFtdCA9IG14LnN1YiggYXZlcmFnZSApLm11bCggYWRqdXN0bWVudCApLm11bCggLSAzLjAgKTtcclxuXHJcblx0cmV0dXJuIG1peCggY29sb3IucmdiLCBteCwgYW10ICk7XHJcblxyXG59ICk7XHJcblxyXG4vKipcclxuICogVXBkYXRlcyB0aGUgaHVlIGNvbXBvbmVudCBvZiB0aGUgZ2l2ZW4gUkdCIGNvbG9yIHdoaWxlIHByZXNlcnZpbmcgaXRzIGx1bWluYW5jZSBhbmQgc2F0dXJhdGlvbi5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlPHZlYzM+fSBjb2xvciAtIFRoZSBpbnB1dCBjb2xvci5cclxuICogQHBhcmFtIHtOb2RlPGZsb2F0Pn0gW2FkanVzdG1lbnQ9MV0gLSBEZWZpbmVzIHRoZSBkZWdyZWUgb2YgaHVlIHJvdGF0aW9uIGluIHJhZGlhbnMuIEEgcG9zaXRpdmUgdmFsdWUgcm90YXRlcyB0aGUgaHVlIGNsb2Nrd2lzZSwgd2hpbGUgYSBuZWdhdGl2ZSB2YWx1ZSByb3RhdGVzIGl0IGNvdW50ZXJjbG9ja3dpc2UuXHJcbiAqIEByZXR1cm4ge05vZGU8dmVjMz59IFRoZSB1cGRhdGVkIGNvbG9yLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGh1ZSA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyBjb2xvciwgYWRqdXN0bWVudCA9IGZsb2F0KCAxICkgXSApID0+IHtcclxuXHJcblx0Y29uc3QgayA9IHZlYzMoIDAuNTc3MzUsIDAuNTc3MzUsIDAuNTc3MzUgKTtcclxuXHJcblx0Y29uc3QgY29zQW5nbGUgPSBhZGp1c3RtZW50LmNvcygpO1xyXG5cclxuXHRyZXR1cm4gdmVjMyggY29sb3IucmdiLm11bCggY29zQW5nbGUgKS5hZGQoIGsuY3Jvc3MoIGNvbG9yLnJnYiApLm11bCggYWRqdXN0bWVudC5zaW4oKSApLmFkZCggay5tdWwoIGRvdCggaywgY29sb3IucmdiICkubXVsKCBjb3NBbmdsZS5vbmVNaW51cygpICkgKSApICkgKTtcclxuXHJcbn0gKTtcclxuXHJcbi8qKlxyXG4gKiBDb21wdXRlcyB0aGUgbHVtaW5hbmNlIGZvciB0aGUgZ2l2ZW4gUkdCIGNvbG9yIHZhbHVlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGU8dmVjMz59IGNvbG9yIC0gVGhlIGNvbG9yIHZhbHVlIHRvIGNvbXB1dGUgdGhlIGx1bWluYW5jZSBmb3IuXHJcbiAqIEBwYXJhbSB7P05vZGU8dmVjMz59IGx1bWluYW5jZUNvZWZmaWNpZW50cyAtIFRoZSBsdW1pbmFuY2UgY29lZmZpY2llbnRzLiBCeSBkZWZhdWx0IHByZWRlZmluZWQgdmFsdWVzIG9mIHRoZSBjdXJyZW50IHdvcmtpbmcgY29sb3Igc3BhY2UgYXJlIHVzZWQuXHJcbiAqIEByZXR1cm4ge05vZGU8dmVjMz59IFRoZSBsdW1pbmFuY2UuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbHVtaW5hbmNlID0gKFxyXG5cdGNvbG9yLFxyXG5cdGx1bWluYW5jZUNvZWZmaWNpZW50cyA9IHZlYzMoIENvbG9yTWFuYWdlbWVudC5nZXRMdW1pbmFuY2VDb2VmZmljaWVudHMoIG5ldyBWZWN0b3IzKCkgKSApXHJcbikgPT4gZG90KCBjb2xvciwgbHVtaW5hbmNlQ29lZmZpY2llbnRzICk7XHJcblxyXG4vKipcclxuICogQ29sb3IgRGVjaXNpb24gTGlzdCAoQ0RMKSB2MS4yXHJcbiAqXHJcbiAqIENvbXBhY3QgcmVwcmVzZW50YXRpb24gb2YgY29sb3IgZ3JhZGluZyBpbmZvcm1hdGlvbiwgZGVmaW5lZCBieSBzbG9wZSwgb2Zmc2V0LCBwb3dlciwgYW5kXHJcbiAqIHNhdHVyYXRpb24uIFRoZSBDREwgc2hvdWxkIGJlIHR5cGljYWxseSBiZSBnaXZlbiBpbnB1dCBpbiBhIGxvZyBzcGFjZSAoc3VjaCBhcyBMb2dDLCBBQ0VTY2MsXHJcbiAqIG9yIEFnWCBMb2cpLCBhbmQgd2lsbCByZXR1cm4gb3V0cHV0IGluIHRoZSBzYW1lIHNwYWNlLiBPdXRwdXQgbWF5IHJlcXVpcmUgY2xhbXBpbmcgPj0wLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGU8dmVjND59IGNvbG9yIElucHV0ICgtSW5maW5pdHkgPCBpbnB1dCA8ICtJbmZpbml0eSlcclxuICogQHBhcmFtIHtOb2RlPHZlYzM+fSBzbG9wZSBTbG9wZSAoMCDiiaQgc2xvcGUgPCArSW5maW5pdHkpXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMzPn0gb2Zmc2V0IE9mZnNldCAoLUluZmluaXR5IDwgb2Zmc2V0IDwgK0luZmluaXR5OyB0eXBpY2FsbHkgLTEgPCBvZmZzZXQgPCAxKVxyXG4gKiBAcGFyYW0ge05vZGU8dmVjMz59IHBvd2VyIFBvd2VyICgwIDwgcG93ZXIgPCArSW5maW5pdHkpXHJcbiAqIEBwYXJhbSB7Tm9kZTxmbG9hdD59IHNhdHVyYXRpb24gU2F0dXJhdGlvbiAoMCDiiaQgc2F0dXJhdGlvbiA8ICtJbmZpbml0eTsgdHlwaWNhbGx5IDAg4omkIHNhdHVyYXRpb24gPCA0KVxyXG4gKiBAcGFyYW0ge05vZGU8dmVjMz59IGx1bWluYW5jZUNvZWZmaWNpZW50cyBMdW1pbmFuY2UgY29lZmZpY2llbnRzIGZvciBzYXR1cmF0aW9uIHRlcm0sIHR5cGljYWxseSBSZWMuIDcwOVxyXG4gKiBAcmV0dXJuIHtOb2RlPHZlYzQ+fSBPdXRwdXQsIC1JbmZpbml0eSA8IG91dHB1dCA8ICtJbmZpbml0eVxyXG4gKlxyXG4gKiBSZWZlcmVuY2VzOlxyXG4gKiAtIEFTQyBDREwgdjEuMlxyXG4gKiAtIHtAbGluayBodHRwczovL2JsZW5kZXIuc3RhY2tleGNoYW5nZS5jb20vYS81NTIzOS80MzkzMH1cclxuICogLSB7QGxpbmsgaHR0cHM6Ly9kb2NzLmFjZXNjZW50cmFsLmNvbS9zcGVjaWZpY2F0aW9ucy9hY2VzY2MvfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGNkbCA9IC8qQF9fUFVSRV9fKi8gRm4oICggW1xyXG5cdGNvbG9yLFxyXG5cdHNsb3BlID0gdmVjMyggMSApLFxyXG5cdG9mZnNldCA9IHZlYzMoIDAgKSxcclxuXHRwb3dlciA9IHZlYzMoIDEgKSxcclxuXHRzYXR1cmF0aW9uID0gZmxvYXQoIDEgKSxcclxuXHQvLyBBU0MgQ0RMIHYxLjIgZXhwbGljaXRseSByZXF1aXJlcyBSZWMuIDcwOSBsdW1pbmFuY2UgY29lZmZpY2llbnRzLlxyXG5cdGx1bWluYW5jZUNvZWZmaWNpZW50cyA9IHZlYzMoIENvbG9yTWFuYWdlbWVudC5nZXRMdW1pbmFuY2VDb2VmZmljaWVudHMoIG5ldyBWZWN0b3IzKCksIExpbmVhclNSR0JDb2xvclNwYWNlICkgKVxyXG5dICkgPT4ge1xyXG5cclxuXHQvLyBOT1RFOiBUaGUgQVNDIENETCB2MS4yIGRlZmluZXMgYSBbMCwgMV0gY2xhbXAgb24gdGhlIHNsb3BlK29mZnNldCB0ZXJtLCBhbmQgYW5vdGhlciBvbiB0aGVcclxuXHQvLyBzYXR1cmF0aW9uIHRlcm0uIFBlciB0aGUgQUNFU2NjIHNwZWNpZmljYXRpb24gYW5kIEZpbGFtZW50LCBsaW1pdHMgbWF5IGJlIG9taXR0ZWQgdG8gc3VwcG9ydFxyXG5cdC8vIHZhbHVlcyBvdXRzaWRlIFswLCAxXSwgcmVxdWlyaW5nIGEgd29ya2Fyb3VuZCBmb3IgbmVnYXRpdmUgdmFsdWVzIGluIHRoZSBwb3dlciBleHByZXNzaW9uLlxyXG5cclxuXHRjb25zdCBsdW1hID0gY29sb3IucmdiLmRvdCggdmVjMyggbHVtaW5hbmNlQ29lZmZpY2llbnRzICkgKTtcclxuXHJcblx0Y29uc3QgdiA9IG1heCggY29sb3IucmdiLm11bCggc2xvcGUgKS5hZGQoIG9mZnNldCApLCAwLjAgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHB2ID0gdi5wb3coIHBvd2VyICkudG9WYXIoKTtcclxuXHJcblx0SWYoIHYuci5ncmVhdGVyVGhhbiggMC4wICksICgpID0+IHsgdi5yLmFzc2lnbiggcHYuciApOyB9ICk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcclxuXHRJZiggdi5nLmdyZWF0ZXJUaGFuKCAwLjAgKSwgKCkgPT4geyB2LmcuYXNzaWduKCBwdi5nICk7IH0gKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxyXG5cdElmKCB2LmIuZ3JlYXRlclRoYW4oIDAuMCApLCAoKSA9PiB7IHYuYi5hc3NpZ24oIHB2LmIgKTsgfSApOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXHJcblxyXG5cdHYuYXNzaWduKCBsdW1hLmFkZCggdi5zdWIoIGx1bWEgKS5tdWwoIHNhdHVyYXRpb24gKSApICk7XHJcblxyXG5cdHJldHVybiB2ZWM0KCB2LnJnYiwgY29sb3IuYSApO1xyXG5cclxufSApO1xyXG4iLCJpbXBvcnQgVGVtcE5vZGUgZnJvbSAnLi4vY29yZS9UZW1wTm9kZS5qcyc7XHJcbmltcG9ydCB7IG5vZGVQcm94eSB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIGEgcG9zdGVyaXplIGVmZmVjdCB3aGljaCByZWR1Y2VzIHRoZSBudW1iZXIgb2YgY29sb3JzXHJcbiAqIGluIGFuIGltYWdlLCByZXN1bHRpbmcgaW4gYSBtb3JlIGJsb2NreSBhbmQgc3R5bGl6ZWQgYXBwZWFyYW5jZS5cclxuICpcclxuICogQGF1Z21lbnRzIFRlbXBOb2RlXHJcbiAqL1xyXG5jbGFzcyBQb3N0ZXJpemVOb2RlIGV4dGVuZHMgVGVtcE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdQb3N0ZXJpemVOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHBvc3Rlcml6ZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlfSBzb3VyY2VOb2RlIC0gVGhlIGlucHV0IGNvbG9yLlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gc3RlcHNOb2RlIC0gQ29udHJvbHMgdGhlIGludGVuc2l0eSBvZiB0aGUgcG9zdGVyaXphdGlvbiBlZmZlY3QuIEEgbG93ZXIgbnVtYmVyIHJlc3VsdHMgaW4gYSBtb3JlIGJsb2NreSBhcHBlYXJhbmNlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBzb3VyY2VOb2RlLCBzdGVwc05vZGUgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBpbnB1dCBjb2xvci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zb3VyY2VOb2RlID0gc291cmNlTm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENvbnRyb2xzIHRoZSBpbnRlbnNpdHkgb2YgdGhlIHBvc3Rlcml6YXRpb24gZWZmZWN0LiBBIGxvd2VyIG51bWJlciByZXN1bHRzIGluIGEgbW9yZSBibG9ja3kgYXBwZWFyYW5jZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zdGVwc05vZGUgPSBzdGVwc05vZGU7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXAoKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBzb3VyY2VOb2RlLCBzdGVwc05vZGUgfSA9IHRoaXM7XHJcblxyXG5cdFx0cmV0dXJuIHNvdXJjZU5vZGUubXVsKCBzdGVwc05vZGUgKS5mbG9vcigpLmRpdiggc3RlcHNOb2RlICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFBvc3Rlcml6ZU5vZGU7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIHBvc3Rlcml6ZSBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IHNvdXJjZU5vZGUgLSBUaGUgaW5wdXQgY29sb3IuXHJcbiAqIEBwYXJhbSB7Tm9kZX0gc3RlcHNOb2RlIC0gQ29udHJvbHMgdGhlIGludGVuc2l0eSBvZiB0aGUgcG9zdGVyaXphdGlvbiBlZmZlY3QuIEEgbG93ZXIgbnVtYmVyIHJlc3VsdHMgaW4gYSBtb3JlIGJsb2NreSBhcHBlYXJhbmNlLlxyXG4gKiBAcmV0dXJucyB7UG9zdGVyaXplTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBwb3N0ZXJpemUgPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggUG9zdGVyaXplTm9kZSApLnNldFBhcmFtZXRlckxlbmd0aCggMiApO1xyXG4iLCJpbXBvcnQgVGVtcE5vZGUgZnJvbSAnLi4vY29yZS9UZW1wTm9kZS5qcyc7XHJcbmltcG9ydCB7IGRlZmF1bHQgYXMgVGV4dHVyZU5vZGUvKiwgdGV4dHVyZSovIH0gZnJvbSAnLi4vYWNjZXNzb3JzL1RleHR1cmVOb2RlLmpzJztcclxuaW1wb3J0IHsgTm9kZVVwZGF0ZVR5cGUgfSBmcm9tICcuLi9jb3JlL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IG5vZGVPYmplY3QgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcbmltcG9ydCB7IHVuaWZvcm0gfSBmcm9tICcuLi9jb3JlL1VuaWZvcm1Ob2RlLmpzJztcclxuaW1wb3J0IHsgdmlld1pUb09ydGhvZ3JhcGhpY0RlcHRoLCBwZXJzcGVjdGl2ZURlcHRoVG9WaWV3WiB9IGZyb20gJy4vVmlld3BvcnREZXB0aE5vZGUuanMnO1xyXG5cclxuaW1wb3J0IHsgSGFsZkZsb2F0VHlwZS8qLCBGbG9hdFR5cGUqLyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjIuanMnO1xyXG5pbXBvcnQgeyBEZXB0aFRleHR1cmUgfSBmcm9tICcuLi8uLi90ZXh0dXJlcy9EZXB0aFRleHR1cmUuanMnO1xyXG5pbXBvcnQgeyBSZW5kZXJUYXJnZXQgfSBmcm9tICcuLi8uLi9jb3JlL1JlbmRlclRhcmdldC5qcyc7XHJcblxyXG5jb25zdCBfc2l6ZSA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjIoKTtcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIHRoZSB0ZXh0dXJlIG9mIGEgcGFzcyBub2RlLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgVGV4dHVyZU5vZGVcclxuICovXHJcbmNsYXNzIFBhc3NUZXh0dXJlTm9kZSBleHRlbmRzIFRleHR1cmVOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnUGFzc1RleHR1cmVOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHBhc3MgdGV4dHVyZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtQYXNzTm9kZX0gcGFzc05vZGUgLSBUaGUgcGFzcyBub2RlLlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSBvdXRwdXQgdGV4dHVyZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcGFzc05vZGUsIHRleHR1cmUgKSB7XHJcblxyXG5cdFx0c3VwZXIoIHRleHR1cmUgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIHRoZSBwYXNzIG5vZGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1Bhc3NOb2RlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBhc3NOb2RlID0gcGFzc05vZGU7XHJcblxyXG5cdFx0dGhpcy5zZXRVcGRhdGVNYXRyaXgoIGZhbHNlICk7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXAoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0aWYgKCBidWlsZGVyLm9iamVjdC5pc1F1YWRNZXNoICkgdGhpcy5wYXNzTm9kZS5idWlsZCggYnVpbGRlciApO1xyXG5cclxuXHRcdHJldHVybiBzdXBlci5zZXR1cCggYnVpbGRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdGNsb25lKCkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5wYXNzTm9kZSwgdGhpcy52YWx1ZSApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQW4gZXh0ZW5zaW9uIG9mIGBQYXNzVGV4dHVyZU5vZGVgIHdoaWNoIGFsbG93cyB0byBtYW5hZ2UgbW9yZSB0aGFuIG9uZVxyXG4gKiBpbnRlcm5hbCB0ZXh0dXJlLiBSZWxldmFudCBmb3IgdGhlIGBnZXRQcmV2aW91c1RleHR1cmUoKWAgcmVsYXRlZCBBUEkuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBQYXNzVGV4dHVyZU5vZGVcclxuICovXHJcbmNsYXNzIFBhc3NNdWx0aXBsZVRleHR1cmVOb2RlIGV4dGVuZHMgUGFzc1RleHR1cmVOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnUGFzc011bHRpcGxlVGV4dHVyZU5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcGFzcyB0ZXh0dXJlIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1Bhc3NOb2RlfSBwYXNzTm9kZSAtIFRoZSBwYXNzIG5vZGUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHRleHR1cmVOYW1lIC0gVGhlIG91dHB1dCB0ZXh0dXJlIG5hbWUuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbcHJldmlvdXNUZXh0dXJlPWZhbHNlXSAtIFdoZXRoZXIgcHJldmlvdXMgZnJhbWUgZGF0YSBzaG91bGQgYmUgdXNlZCBvciBub3QuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHBhc3NOb2RlLCB0ZXh0dXJlTmFtZSwgcHJldmlvdXNUZXh0dXJlID0gZmFsc2UgKSB7XHJcblxyXG5cdFx0Ly8gbnVsbCBpcyBwYXNzZWQgdG8gdGhlIHN1cGVyIGNhbGwgc2luY2UgdGhpcyBjbGFzcyBkb2VzIG5vdFxyXG5cdFx0Ly8gdXNlIGFuIGV4dGVybmFsIHRleHR1cmUgZm9yIHJlbmRlcmluZyBwYXNzIGRhdGEgaW50by4gSW5zdGVhZFxyXG5cdFx0Ly8gdGhlIHRleHR1cmUgaXMgbWFuYWdlZCBieSB0aGUgcGFzcyBub2RlIGl0c2VsZlxyXG5cclxuXHRcdHN1cGVyKCBwYXNzTm9kZSwgbnVsbCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG91dHB1dCB0ZXh0dXJlIG5hbWUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50ZXh0dXJlTmFtZSA9IHRleHR1cmVOYW1lO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciBwcmV2aW91cyBmcmFtZSBkYXRhIHNob3VsZCBiZSB1c2VkIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wcmV2aW91c1RleHR1cmUgPSBwcmV2aW91c1RleHR1cmU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgdGV4dHVyZSByZWZlcmVuY2Ugb2YgdGhpcyBub2RlLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZVRleHR1cmUoKSB7XHJcblxyXG5cdFx0dGhpcy52YWx1ZSA9IHRoaXMucHJldmlvdXNUZXh0dXJlID8gdGhpcy5wYXNzTm9kZS5nZXRQcmV2aW91c1RleHR1cmUoIHRoaXMudGV4dHVyZU5hbWUgKSA6IHRoaXMucGFzc05vZGUuZ2V0VGV4dHVyZSggdGhpcy50ZXh0dXJlTmFtZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdHNldHVwKCBidWlsZGVyICkge1xyXG5cclxuXHRcdHRoaXMudXBkYXRlVGV4dHVyZSgpO1xyXG5cclxuXHRcdHJldHVybiBzdXBlci5zZXR1cCggYnVpbGRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdGNsb25lKCkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5wYXNzTm9kZSwgdGhpcy50ZXh0dXJlTmFtZSwgdGhpcy5wcmV2aW91c1RleHR1cmUgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgYSByZW5kZXIgcGFzcyAoc29tZXRpbWVzIGNhbGxlZCBiZWF1dHkgcGFzcykgaW4gY29udGV4dCBvZiBwb3N0IHByb2Nlc3NpbmcuXHJcbiAqIFRoaXMgcGFzcyBwcm9kdWNlcyBhIHJlbmRlciBmb3IgdGhlIGdpdmVuIHNjZW5lIGFuZCBjYW1lcmEgYW5kIGNhbiBwcm92aWRlIG11bHRpcGxlIG91dHB1dHNcclxuICogdmlhIE1SVCBmb3IgZnVydGhlciBwcm9jZXNzaW5nLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBwb3N0UHJvY2Vzc2luZyA9IG5ldyBQb3N0UHJvY2Vzc2luZyggcmVuZGVyZXIgKTtcclxuICpcclxuICogY29uc3Qgc2NlbmVQYXNzID0gcGFzcyggc2NlbmUsIGNhbWVyYSApO1xyXG4gKlxyXG4gKiBwb3N0UHJvY2Vzc2luZy5vdXRwdXROb2RlID0gc2NlbmVQYXNzO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIFRlbXBOb2RlXHJcbiAqL1xyXG5jbGFzcyBQYXNzTm9kZSBleHRlbmRzIFRlbXBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnUGFzc05vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcGFzcyBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHsoJ2NvbG9yJ3wnZGVwdGgnKX0gc2NvcGUgLSBUaGUgc2NvcGUgb2YgdGhlIHBhc3MuIFRoZSBzY29wZSBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIG5vZGUgb3V0cHV0cyBjb2xvciBvciBkZXB0aC5cclxuXHQgKiBAcGFyYW0ge1NjZW5lfSBzY2VuZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBzY2VuZS5cclxuXHQgKiBAcGFyYW0ge0NhbWVyYX0gY2FtZXJhIC0gQSByZWZlcmVuY2UgdG8gdGhlIGNhbWVyYS5cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIHRoZSBpbnRlcm5hbCByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBzY29wZSwgc2NlbmUsIGNhbWVyYSwgb3B0aW9ucyA9IHt9ICkge1xyXG5cclxuXHRcdHN1cGVyKCAndmVjNCcgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBzY29wZSBvZiB0aGUgcGFzcy4gVGhlIHNjb3BlIGRldGVybWluZXMgd2hldGhlciB0aGUgbm9kZSBvdXRwdXRzIGNvbG9yIG9yIGRlcHRoLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoJ2NvbG9yJ3wnZGVwdGgnKX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zY29wZSA9IHNjb3BlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIHNjZW5lLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtTY2VuZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zY2VuZSA9IHNjZW5lO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIGNhbWVyYS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Q2FtZXJhfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNhbWVyYSA9IGNhbWVyYTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIE9wdGlvbnMgZm9yIHRoZSBpbnRlcm5hbCByZW5kZXIgdGFyZ2V0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcGFzcydzIHBpeGVsIHJhdGlvLiBXaWxsIGJlIGtlcHQgYXV0b21hdGljYWxseSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgcmVuZGVyZXIncyBwaXhlbCByYXRpby5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fcGl4ZWxSYXRpbyA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcGFzcydzIHBpeGVsIHdpZHRoLiBXaWxsIGJlIGtlcHQgYXV0b21hdGljYWxseSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgcmVuZGVyZXIncyB3aWR0aC5cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl93aWR0aCA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcGFzcydzIHBpeGVsIGhlaWdodC4gV2lsbCBiZSBrZXB0IGF1dG9tYXRpY2FsbHkga2VwdCBpbiBzeW5jIHdpdGggdGhlIHJlbmRlcmVyJ3MgaGVpZ2h0LlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX2hlaWdodCA9IDE7XHJcblxyXG5cdFx0Y29uc3QgZGVwdGhUZXh0dXJlID0gbmV3IERlcHRoVGV4dHVyZSgpO1xyXG5cdFx0ZGVwdGhUZXh0dXJlLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSA9IHRydWU7XHJcblx0XHQvL2RlcHRoVGV4dHVyZS50eXBlID0gRmxvYXRUeXBlO1xyXG5cdFx0ZGVwdGhUZXh0dXJlLm5hbWUgPSAnZGVwdGgnO1xyXG5cclxuXHRcdGNvbnN0IHJlbmRlclRhcmdldCA9IG5ldyBSZW5kZXJUYXJnZXQoIHRoaXMuX3dpZHRoICogdGhpcy5fcGl4ZWxSYXRpbywgdGhpcy5faGVpZ2h0ICogdGhpcy5fcGl4ZWxSYXRpbywgeyB0eXBlOiBIYWxmRmxvYXRUeXBlLCAuLi5vcHRpb25zLCB9ICk7XHJcblx0XHRyZW5kZXJUYXJnZXQudGV4dHVyZS5uYW1lID0gJ291dHB1dCc7XHJcblx0XHRyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlID0gZGVwdGhUZXh0dXJlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHBhc3MncyByZW5kZXIgdGFyZ2V0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtSZW5kZXJUYXJnZXR9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0ID0gcmVuZGVyVGFyZ2V0O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBkaWN0aW9uYXJ5IGhvbGRpbmcgdGhlIGludGVybmFsIHJlc3VsdCB0ZXh0dXJlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge09iamVjdDxzdHJpbmcsIFRleHR1cmU+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl90ZXh0dXJlcyA9IHtcclxuXHRcdFx0b3V0cHV0OiByZW5kZXJUYXJnZXQudGV4dHVyZSxcclxuXHRcdFx0ZGVwdGg6IGRlcHRoVGV4dHVyZVxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgZGljdGlvbmFyeSBob2xkaW5nIHRoZSBpbnRlcm5hbCB0ZXh0dXJlIG5vZGVzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0PHN0cmluZywgVGV4dHVyZU5vZGU+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl90ZXh0dXJlTm9kZXMgPSB7fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgZGljdGlvbmFyeSBob2xkaW5nIHRoZSBpbnRlcm5hbCBkZXB0aCBub2Rlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fbGluZWFyRGVwdGhOb2RlcyA9IHt9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBkaWN0aW9uYXJ5IGhvbGRpbmcgdGhlIGludGVybmFsIHZpZXdaIG5vZGVzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl92aWV3Wk5vZGVzID0ge307XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGRpY3Rpb25hcnkgaG9sZGluZyB0aGUgdGV4dHVyZSBkYXRhIG9mIHRoZSBwcmV2aW91cyBmcmFtZS5cclxuXHRcdCAqIFVzZWQgZm9yIGNvbXB1dGluZyB2ZWxvY2l0eS9tb3Rpb24gdmVjdG9ycy5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge09iamVjdDxzdHJpbmcsIFRleHR1cmU+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9wcmV2aW91c1RleHR1cmVzID0ge307XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGRpY3Rpb25hcnkgaG9sZGluZyB0aGUgdGV4dHVyZSBub2RlcyBvZiB0aGUgcHJldmlvdXMgZnJhbWUuXHJcblx0XHQgKiBVc2VkIGZvciBjb21wdXRpbmcgdmVsb2NpdHkvbW90aW9uIHZlY3RvcnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLCBUZXh0dXJlTm9kZT59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX3ByZXZpb3VzVGV4dHVyZU5vZGVzID0ge307XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYG5lYXJgIHByb3BlcnR5IG9mIHRoZSBjYW1lcmEgYXMgYSB1bmlmb3JtLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7VW5pZm9ybU5vZGV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX2NhbWVyYU5lYXIgPSB1bmlmb3JtKCAwICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYGZhcmAgcHJvcGVydHkgb2YgdGhlIGNhbWVyYSBhcyBhIHVuaWZvcm0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHtVbmlmb3JtTm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fY2FtZXJhRmFyID0gdW5pZm9ybSggMCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBNUlQgbm9kZSBjb25maWd1cmluZyB0aGUgTVJUIHNldHRpbmdzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7P01SVE5vZGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX21ydCA9IG51bGw7XHJcblxyXG5cdFx0dGhpcy5fbGF5ZXJzID0gbnVsbDtcclxuXHJcblx0XHR0aGlzLl9yZXNvbHV0aW9uID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNQYXNzTm9kZSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYHVwZGF0ZUJlZm9yZVR5cGVgIGlzIHNldCB0byBgTm9kZVVwZGF0ZVR5cGUuRlJBTUVgIHNpbmNlIHRoZSBub2RlIHJlbmRlcnMgdGhlXHJcblx0XHQgKiBzY2VuZSBvbmNlIHBlciBmcmFtZSBpbiBpdHMge0BsaW5rIFBhc3NOb2RlI3VwZGF0ZUJlZm9yZX0gbWV0aG9kLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKiBAZGVmYXVsdCAnZnJhbWUnXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXBkYXRlQmVmb3JlVHlwZSA9IE5vZGVVcGRhdGVUeXBlLkZSQU1FO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHJlc29sdXRpb24gZm9yIHRoZSBwYXNzLlxyXG5cdCAqIFRoZSByZXNvbHV0aW9uIGlzIGEgZmFjdG9yIHRoYXQgaXMgbXVsdGlwbGllZCB3aXRoIHRoZSByZW5kZXJlcidzIHdpZHRoIGFuZCBoZWlnaHQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvbiAtIFRoZSByZXNvbHV0aW9uIHRvIHNldC4gQSB2YWx1ZSBvZiBgMWAgbWVhbnMgZnVsbCByZXNvbHV0aW9uLlxyXG5cdCAqIEByZXR1cm4ge1Bhc3NOb2RlfSBBIHJlZmVyZW5jZSB0byB0aGlzIHBhc3MuXHJcblx0ICovXHJcblx0c2V0UmVzb2x1dGlvbiggcmVzb2x1dGlvbiApIHtcclxuXHJcblx0XHR0aGlzLl9yZXNvbHV0aW9uID0gcmVzb2x1dGlvbjtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZXRzIHRoZSBjdXJyZW50IHJlc29sdXRpb24gb2YgdGhlIHBhc3MuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBjdXJyZW50IHJlc29sdXRpb24uIEEgdmFsdWUgb2YgYDFgIG1lYW5zIGZ1bGwgcmVzb2x1dGlvbi5cclxuXHQgKiBAZGVmYXVsdCAxXHJcblx0ICovXHJcblx0Z2V0UmVzb2x1dGlvbigpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fcmVzb2x1dGlvbjtcclxuXHJcblx0fVxyXG5cclxuXHRzZXRMYXllcnMoIGxheWVycyApIHtcclxuXHJcblx0XHR0aGlzLl9sYXllcnMgPSBsYXllcnM7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0TGF5ZXJzKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9sYXllcnM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZ2l2ZW4gTVJUIG5vZGUgdG8gc2V0dXAgTVJUIGZvciB0aGlzIHBhc3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01SVE5vZGV9IG1ydCAtIFRoZSBNUlQgb2JqZWN0LlxyXG5cdCAqIEByZXR1cm4ge1Bhc3NOb2RlfSBBIHJlZmVyZW5jZSB0byB0aGlzIHBhc3MuXHJcblx0ICovXHJcblx0c2V0TVJUKCBtcnQgKSB7XHJcblxyXG5cdFx0dGhpcy5fbXJ0ID0gbXJ0O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGN1cnJlbnQgTVJUIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtNUlROb2RlfSBUaGUgY3VycmVudCBNUlQgbm9kZS5cclxuXHQgKi9cclxuXHRnZXRNUlQoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX21ydDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgbWV0aG9kIGlzIG92ZXJ3cml0dGVuIHNvIGl0IGFsd2F5cyByZXR1cm5zIGB0cnVlYC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyBub2RlIGlzIGdsb2JhbCBvciBub3QuXHJcblx0ICovXHJcblx0aXNHbG9iYWwoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgdGV4dHVyZSBmb3IgdGhlIGdpdmVuIG91dHB1dCBuYW1lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgb3V0cHV0IG5hbWUgdG8gZ2V0IHRoZSB0ZXh0dXJlIGZvci5cclxuXHQgKiBAcmV0dXJuIHtUZXh0dXJlfSBUaGUgdGV4dHVyZS5cclxuXHQgKi9cclxuXHRnZXRUZXh0dXJlKCBuYW1lICkge1xyXG5cclxuXHRcdGxldCB0ZXh0dXJlID0gdGhpcy5fdGV4dHVyZXNbIG5hbWUgXTtcclxuXHJcblx0XHRpZiAoIHRleHR1cmUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGNvbnN0IHJlZlRleHR1cmUgPSB0aGlzLnJlbmRlclRhcmdldC50ZXh0dXJlO1xyXG5cclxuXHRcdFx0dGV4dHVyZSA9IHJlZlRleHR1cmUuY2xvbmUoKTtcclxuXHRcdFx0dGV4dHVyZS5uYW1lID0gbmFtZTtcclxuXHJcblx0XHRcdHRoaXMuX3RleHR1cmVzWyBuYW1lIF0gPSB0ZXh0dXJlO1xyXG5cclxuXHRcdFx0dGhpcy5yZW5kZXJUYXJnZXQudGV4dHVyZXMucHVzaCggdGV4dHVyZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGV4dHVyZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSB0ZXh0dXJlIGhvbGRpbmcgdGhlIGRhdGEgb2YgdGhlIHByZXZpb3VzIGZyYW1lIGZvciB0aGUgZ2l2ZW4gb3V0cHV0IG5hbWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBvdXRwdXQgbmFtZSB0byBnZXQgdGhlIHRleHR1cmUgZm9yLlxyXG5cdCAqIEByZXR1cm4ge1RleHR1cmV9IFRoZSB0ZXh0dXJlIGhvbGRpbmcgdGhlIGRhdGEgb2YgdGhlIHByZXZpb3VzIGZyYW1lLlxyXG5cdCAqL1xyXG5cdGdldFByZXZpb3VzVGV4dHVyZSggbmFtZSApIHtcclxuXHJcblx0XHRsZXQgdGV4dHVyZSA9IHRoaXMuX3ByZXZpb3VzVGV4dHVyZXNbIG5hbWUgXTtcclxuXHJcblx0XHRpZiAoIHRleHR1cmUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHRleHR1cmUgPSB0aGlzLmdldFRleHR1cmUoIG5hbWUgKS5jbG9uZSgpO1xyXG5cclxuXHRcdFx0dGhpcy5fcHJldmlvdXNUZXh0dXJlc1sgbmFtZSBdID0gdGV4dHVyZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRleHR1cmU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3dpdGNoZXMgY3VycmVudCBhbmQgcHJldmlvdXMgdGV4dHVyZXMgZm9yIHRoZSBnaXZlbiBvdXRwdXQgbmFtZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG91dHB1dCBuYW1lLlxyXG5cdCAqL1xyXG5cdHRvZ2dsZVRleHR1cmUoIG5hbWUgKSB7XHJcblxyXG5cdFx0Y29uc3QgcHJldlRleHR1cmUgPSB0aGlzLl9wcmV2aW91c1RleHR1cmVzWyBuYW1lIF07XHJcblxyXG5cdFx0aWYgKCBwcmV2VGV4dHVyZSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdGV4dHVyZSA9IHRoaXMuX3RleHR1cmVzWyBuYW1lIF07XHJcblxyXG5cdFx0XHRjb25zdCBpbmRleCA9IHRoaXMucmVuZGVyVGFyZ2V0LnRleHR1cmVzLmluZGV4T2YoIHRleHR1cmUgKTtcclxuXHRcdFx0dGhpcy5yZW5kZXJUYXJnZXQudGV4dHVyZXNbIGluZGV4IF0gPSBwcmV2VGV4dHVyZTtcclxuXHJcblx0XHRcdHRoaXMuX3RleHR1cmVzWyBuYW1lIF0gPSBwcmV2VGV4dHVyZTtcclxuXHRcdFx0dGhpcy5fcHJldmlvdXNUZXh0dXJlc1sgbmFtZSBdID0gdGV4dHVyZTtcclxuXHJcblx0XHRcdHRoaXMuX3RleHR1cmVOb2Rlc1sgbmFtZSBdLnVwZGF0ZVRleHR1cmUoKTtcclxuXHRcdFx0dGhpcy5fcHJldmlvdXNUZXh0dXJlTm9kZXNbIG5hbWUgXS51cGRhdGVUZXh0dXJlKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHRleHR1cmUgbm9kZSBmb3IgdGhlIGdpdmVuIG91dHB1dCBuYW1lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lPSdvdXRwdXQnXSAtIFRoZSBvdXRwdXQgbmFtZSB0byBnZXQgdGhlIHRleHR1cmUgbm9kZSBmb3IuXHJcblx0ICogQHJldHVybiB7VGV4dHVyZU5vZGV9IFRoZSB0ZXh0dXJlIG5vZGUuXHJcblx0ICovXHJcblx0Z2V0VGV4dHVyZU5vZGUoIG5hbWUgPSAnb3V0cHV0JyApIHtcclxuXHJcblx0XHRsZXQgdGV4dHVyZU5vZGUgPSB0aGlzLl90ZXh0dXJlTm9kZXNbIG5hbWUgXTtcclxuXHJcblx0XHRpZiAoIHRleHR1cmVOb2RlID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHR0ZXh0dXJlTm9kZSA9IG5vZGVPYmplY3QoIG5ldyBQYXNzTXVsdGlwbGVUZXh0dXJlTm9kZSggdGhpcywgbmFtZSApICk7XHJcblx0XHRcdHRleHR1cmVOb2RlLnVwZGF0ZVRleHR1cmUoKTtcclxuXHRcdFx0dGhpcy5fdGV4dHVyZU5vZGVzWyBuYW1lIF0gPSB0ZXh0dXJlTm9kZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRleHR1cmVOb2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHByZXZpb3VzIHRleHR1cmUgbm9kZSBmb3IgdGhlIGdpdmVuIG91dHB1dCBuYW1lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lPSdvdXRwdXQnXSAtIFRoZSBvdXRwdXQgbmFtZSB0byBnZXQgdGhlIHByZXZpb3VzIHRleHR1cmUgbm9kZSBmb3IuXHJcblx0ICogQHJldHVybiB7VGV4dHVyZU5vZGV9IFRoZSBwcmV2aW91cyB0ZXh0dXJlIG5vZGUuXHJcblx0ICovXHJcblx0Z2V0UHJldmlvdXNUZXh0dXJlTm9kZSggbmFtZSA9ICdvdXRwdXQnICkge1xyXG5cclxuXHRcdGxldCB0ZXh0dXJlTm9kZSA9IHRoaXMuX3ByZXZpb3VzVGV4dHVyZU5vZGVzWyBuYW1lIF07XHJcblxyXG5cdFx0aWYgKCB0ZXh0dXJlTm9kZSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLl90ZXh0dXJlTm9kZXNbIG5hbWUgXSA9PT0gdW5kZWZpbmVkICkgdGhpcy5nZXRUZXh0dXJlTm9kZSggbmFtZSApO1xyXG5cclxuXHRcdFx0dGV4dHVyZU5vZGUgPSBub2RlT2JqZWN0KCBuZXcgUGFzc011bHRpcGxlVGV4dHVyZU5vZGUoIHRoaXMsIG5hbWUsIHRydWUgKSApO1xyXG5cdFx0XHR0ZXh0dXJlTm9kZS51cGRhdGVUZXh0dXJlKCk7XHJcblx0XHRcdHRoaXMuX3ByZXZpb3VzVGV4dHVyZU5vZGVzWyBuYW1lIF0gPSB0ZXh0dXJlTm9kZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRleHR1cmVOb2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSB2aWV3WiBub2RlIG9mIHRoaXMgcGFzcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZT0nZGVwdGgnXSAtIFRoZSBvdXRwdXQgbmFtZSB0byBnZXQgdGhlIHZpZXdaIG5vZGUgZm9yLiBJbiBtb3N0IGNhc2VzIHRoZSBkZWZhdWx0IGAnZGVwdGgnYCBjYW4gYmUgdXNlZCBob3dldmVyIHRoZSBwYXJhbWV0ZXIgZXhpc3RzIGZvciBjdXN0b20gZGVwdGggb3V0cHV0cy5cclxuXHQgKiBAcmV0dXJuIHtOb2RlfSBUaGUgdmlld1ogbm9kZS5cclxuXHQgKi9cclxuXHRnZXRWaWV3Wk5vZGUoIG5hbWUgPSAnZGVwdGgnICkge1xyXG5cclxuXHRcdGxldCB2aWV3Wk5vZGUgPSB0aGlzLl92aWV3Wk5vZGVzWyBuYW1lIF07XHJcblxyXG5cdFx0aWYgKCB2aWV3Wk5vZGUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGNhbWVyYU5lYXIgPSB0aGlzLl9jYW1lcmFOZWFyO1xyXG5cdFx0XHRjb25zdCBjYW1lcmFGYXIgPSB0aGlzLl9jYW1lcmFGYXI7XHJcblxyXG5cdFx0XHR0aGlzLl92aWV3Wk5vZGVzWyBuYW1lIF0gPSB2aWV3Wk5vZGUgPSBwZXJzcGVjdGl2ZURlcHRoVG9WaWV3WiggdGhpcy5nZXRUZXh0dXJlTm9kZSggbmFtZSApLCBjYW1lcmFOZWFyLCBjYW1lcmFGYXIgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHZpZXdaTm9kZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbGluZWFyIGRlcHRoIG5vZGUgb2YgdGhpcyBwYXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lPSdkZXB0aCddIC0gVGhlIG91dHB1dCBuYW1lIHRvIGdldCB0aGUgbGluZWFyIGRlcHRoIG5vZGUgZm9yLiBJbiBtb3N0IGNhc2VzIHRoZSBkZWZhdWx0IGAnZGVwdGgnYCBjYW4gYmUgdXNlZCBob3dldmVyIHRoZSBwYXJhbWV0ZXIgZXhpc3RzIGZvciBjdXN0b20gZGVwdGggb3V0cHV0cy5cclxuXHQgKiBAcmV0dXJuIHtOb2RlfSBUaGUgbGluZWFyIGRlcHRoIG5vZGUuXHJcblx0ICovXHJcblx0Z2V0TGluZWFyRGVwdGhOb2RlKCBuYW1lID0gJ2RlcHRoJyApIHtcclxuXHJcblx0XHRsZXQgbGluZWFyRGVwdGhOb2RlID0gdGhpcy5fbGluZWFyRGVwdGhOb2Rlc1sgbmFtZSBdO1xyXG5cclxuXHRcdGlmICggbGluZWFyRGVwdGhOb2RlID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBjYW1lcmFOZWFyID0gdGhpcy5fY2FtZXJhTmVhcjtcclxuXHRcdFx0Y29uc3QgY2FtZXJhRmFyID0gdGhpcy5fY2FtZXJhRmFyO1xyXG5cdFx0XHRjb25zdCB2aWV3Wk5vZGUgPSB0aGlzLmdldFZpZXdaTm9kZSggbmFtZSApO1xyXG5cclxuXHRcdFx0Ly8gVE9ETzoganVzdCBpZiAoIGJ1aWxkZXIuY2FtZXJhLmlzUGVyc3BlY3RpdmVDYW1lcmEgKVxyXG5cclxuXHRcdFx0dGhpcy5fbGluZWFyRGVwdGhOb2Rlc1sgbmFtZSBdID0gbGluZWFyRGVwdGhOb2RlID0gdmlld1pUb09ydGhvZ3JhcGhpY0RlcHRoKCB2aWV3Wk5vZGUsIGNhbWVyYU5lYXIsIGNhbWVyYUZhciApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbGluZWFyRGVwdGhOb2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdHNldHVwKCB7IHJlbmRlcmVyIH0gKSB7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXQuc2FtcGxlcyA9IHRoaXMub3B0aW9ucy5zYW1wbGVzID09PSB1bmRlZmluZWQgPyByZW5kZXJlci5zYW1wbGVzIDogdGhpcy5vcHRpb25zLnNhbXBsZXM7XHJcblxyXG5cdFx0Ly8gVE9ETzogRGlzYWJsZSBNU0FBIGZvciBXZWJHTCBiYWNrZW5kIGZvciBub3dcclxuXHRcdGlmICggcmVuZGVyZXIuYmFja2VuZC5pc1dlYkdMQmFja2VuZCA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdHRoaXMucmVuZGVyVGFyZ2V0LnNhbXBsZXMgPSAwO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnJlbmRlclRhcmdldC50ZXh0dXJlLnR5cGUgPSByZW5kZXJlci5nZXRDb2xvckJ1ZmZlclR5cGUoKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5zY29wZSA9PT0gUGFzc05vZGUuQ09MT1IgPyB0aGlzLmdldFRleHR1cmVOb2RlKCkgOiB0aGlzLmdldExpbmVhckRlcHRoTm9kZSgpO1xyXG5cclxuXHR9XHJcblxyXG5cdHVwZGF0ZUJlZm9yZSggZnJhbWUgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyByZW5kZXJlciB9ID0gZnJhbWU7XHJcblx0XHRjb25zdCB7IHNjZW5lIH0gPSB0aGlzO1xyXG5cclxuXHRcdGxldCBjYW1lcmE7XHJcblx0XHRsZXQgcGl4ZWxSYXRpbztcclxuXHJcblx0XHRjb25zdCBvdXRwdXRSZW5kZXJUYXJnZXQgPSByZW5kZXJlci5nZXRPdXRwdXRSZW5kZXJUYXJnZXQoKTtcclxuXHJcblx0XHRpZiAoIG91dHB1dFJlbmRlclRhcmdldCAmJiBvdXRwdXRSZW5kZXJUYXJnZXQuaXNYUlJlbmRlclRhcmdldCA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdHBpeGVsUmF0aW8gPSAxO1xyXG5cdFx0XHRjYW1lcmEgPSByZW5kZXJlci54ci5nZXRDYW1lcmEoKTtcclxuXHJcblx0XHRcdHJlbmRlcmVyLnhyLnVwZGF0ZUNhbWVyYSggY2FtZXJhICk7XHJcblxyXG5cdFx0XHRfc2l6ZS5zZXQoIG91dHB1dFJlbmRlclRhcmdldC53aWR0aCwgb3V0cHV0UmVuZGVyVGFyZ2V0LmhlaWdodCApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRjYW1lcmEgPSB0aGlzLmNhbWVyYTtcclxuXHRcdFx0cGl4ZWxSYXRpbyA9IHJlbmRlcmVyLmdldFBpeGVsUmF0aW8oKTtcclxuXHJcblx0XHRcdHJlbmRlcmVyLmdldFNpemUoIF9zaXplICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuX3BpeGVsUmF0aW8gPSBwaXhlbFJhdGlvO1xyXG5cclxuXHRcdHRoaXMuc2V0U2l6ZSggX3NpemUud2lkdGgsIF9zaXplLmhlaWdodCApO1xyXG5cclxuXHRcdGNvbnN0IGN1cnJlbnRSZW5kZXJUYXJnZXQgPSByZW5kZXJlci5nZXRSZW5kZXJUYXJnZXQoKTtcclxuXHRcdGNvbnN0IGN1cnJlbnRNUlQgPSByZW5kZXJlci5nZXRNUlQoKTtcclxuXHRcdGNvbnN0IGN1cnJlbnRNYXNrID0gY2FtZXJhLmxheWVycy5tYXNrO1xyXG5cclxuXHRcdHRoaXMuX2NhbWVyYU5lYXIudmFsdWUgPSBjYW1lcmEubmVhcjtcclxuXHRcdHRoaXMuX2NhbWVyYUZhci52YWx1ZSA9IGNhbWVyYS5mYXI7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9sYXllcnMgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRjYW1lcmEubGF5ZXJzLm1hc2sgPSB0aGlzLl9sYXllcnMubWFzaztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Zm9yICggY29uc3QgbmFtZSBpbiB0aGlzLl9wcmV2aW91c1RleHR1cmVzICkge1xyXG5cclxuXHRcdFx0dGhpcy50b2dnbGVUZXh0dXJlKCBuYW1lICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggdGhpcy5yZW5kZXJUYXJnZXQgKTtcclxuXHRcdHJlbmRlcmVyLnNldE1SVCggdGhpcy5fbXJ0ICk7XHJcblxyXG5cdFx0cmVuZGVyZXIucmVuZGVyKCBzY2VuZSwgY2FtZXJhICk7XHJcblxyXG5cdFx0cmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCBjdXJyZW50UmVuZGVyVGFyZ2V0ICk7XHJcblx0XHRyZW5kZXJlci5zZXRNUlQoIGN1cnJlbnRNUlQgKTtcclxuXHJcblx0XHRjYW1lcmEubGF5ZXJzLm1hc2sgPSBjdXJyZW50TWFzaztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBzaXplIG9mIHRoZSBwYXNzJ3MgcmVuZGVyIHRhcmdldC4gSG9ub3JzIHRoZSBwaXhlbCByYXRpby5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCB0byBzZXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgdG8gc2V0LlxyXG5cdCAqL1xyXG5cdHNldFNpemUoIHdpZHRoLCBoZWlnaHQgKSB7XHJcblxyXG5cdFx0dGhpcy5fd2lkdGggPSB3aWR0aDtcclxuXHRcdHRoaXMuX2hlaWdodCA9IGhlaWdodDtcclxuXHJcblx0XHRjb25zdCBlZmZlY3RpdmVXaWR0aCA9IHRoaXMuX3dpZHRoICogdGhpcy5fcGl4ZWxSYXRpbyAqIHRoaXMuX3Jlc29sdXRpb247XHJcblx0XHRjb25zdCBlZmZlY3RpdmVIZWlnaHQgPSB0aGlzLl9oZWlnaHQgKiB0aGlzLl9waXhlbFJhdGlvICogdGhpcy5fcmVzb2x1dGlvbjtcclxuXHJcblx0XHR0aGlzLnJlbmRlclRhcmdldC5zZXRTaXplKCBlZmZlY3RpdmVXaWR0aCwgZWZmZWN0aXZlSGVpZ2h0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgcGl4ZWwgcmF0aW8gdGhlIHBhc3MncyByZW5kZXIgdGFyZ2V0IGFuZCB1cGRhdGVzIHRoZSBzaXplLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHBpeGVsUmF0aW8gLSBUaGUgcGl4ZWwgcmF0aW8gdG8gc2V0LlxyXG5cdCAqL1xyXG5cdHNldFBpeGVsUmF0aW8oIHBpeGVsUmF0aW8gKSB7XHJcblxyXG5cdFx0dGhpcy5fcGl4ZWxSYXRpbyA9IHBpeGVsUmF0aW87XHJcblxyXG5cdFx0dGhpcy5zZXRTaXplKCB0aGlzLl93aWR0aCwgdGhpcy5faGVpZ2h0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRnJlZXMgaW50ZXJuYWwgcmVzb3VyY2VzLiBTaG91bGQgYmUgY2FsbGVkIHdoZW4gdGhlIG5vZGUgaXMgbm8gbG9uZ2VyIGluIHVzZS5cclxuXHQgKi9cclxuXHRkaXNwb3NlKCkge1xyXG5cclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0LmRpc3Bvc2UoKTtcclxuXHJcblx0fVxyXG5cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAc3RhdGljXHJcbiAqIEB0eXBlIHsnY29sb3InfVxyXG4gKiBAZGVmYXVsdCAnY29sb3InXHJcbiAqL1xyXG5QYXNzTm9kZS5DT0xPUiA9ICdjb2xvcic7XHJcblxyXG4vKipcclxuICogQHN0YXRpY1xyXG4gKiBAdHlwZSB7J2RlcHRoJ31cclxuICogQGRlZmF1bHQgJ2RlcHRoJ1xyXG4gKi9cclxuUGFzc05vZGUuREVQVEggPSAnZGVwdGgnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgUGFzc05vZGU7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIHBhc3Mgbm9kZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtTY2VuZX0gc2NlbmUgLSBBIHJlZmVyZW5jZSB0byB0aGUgc2NlbmUuXHJcbiAqIEBwYXJhbSB7Q2FtZXJhfSBjYW1lcmEgLSBBIHJlZmVyZW5jZSB0byB0aGUgY2FtZXJhLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIHRoZSBpbnRlcm5hbCByZW5kZXIgdGFyZ2V0LlxyXG4gKiBAcmV0dXJucyB7UGFzc05vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcGFzcyA9ICggc2NlbmUsIGNhbWVyYSwgb3B0aW9ucyApID0+IG5vZGVPYmplY3QoIG5ldyBQYXNzTm9kZSggUGFzc05vZGUuQ09MT1IsIHNjZW5lLCBjYW1lcmEsIG9wdGlvbnMgKSApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSBwYXNzIHRleHR1cmUgbm9kZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtQYXNzTm9kZX0gcGFzcyAtIFRoZSBwYXNzIG5vZGUuXHJcbiAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSBvdXRwdXQgdGV4dHVyZS5cclxuICogQHJldHVybnMge1Bhc3NUZXh0dXJlTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBwYXNzVGV4dHVyZSA9ICggcGFzcywgdGV4dHVyZSApID0+IG5vZGVPYmplY3QoIG5ldyBQYXNzVGV4dHVyZU5vZGUoIHBhc3MsIHRleHR1cmUgKSApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSBkZXB0aCBwYXNzIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7U2NlbmV9IHNjZW5lIC0gQSByZWZlcmVuY2UgdG8gdGhlIHNjZW5lLlxyXG4gKiBAcGFyYW0ge0NhbWVyYX0gY2FtZXJhIC0gQSByZWZlcmVuY2UgdG8gdGhlIGNhbWVyYS5cclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBPcHRpb25zIGZvciB0aGUgaW50ZXJuYWwgcmVuZGVyIHRhcmdldC5cclxuICogQHJldHVybnMge1Bhc3NOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGRlcHRoUGFzcyA9ICggc2NlbmUsIGNhbWVyYSwgb3B0aW9ucyApID0+IG5vZGVPYmplY3QoIG5ldyBQYXNzTm9kZSggUGFzc05vZGUuREVQVEgsIHNjZW5lLCBjYW1lcmEsIG9wdGlvbnMgKSApO1xyXG4iLCJpbXBvcnQgeyBmbG9hdCwgbm9kZU9iamVjdCwgbm9ybWFsaXplLCB2ZWM0IH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5pbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uLy4uL21hdGgvQ29sb3IuanMnO1xyXG5pbXBvcnQgTm9kZU1hdGVyaWFsIGZyb20gJy4uLy4uL21hdGVyaWFscy9ub2Rlcy9Ob2RlTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyBjYW1lcmFQcm9qZWN0aW9uTWF0cml4IH0gZnJvbSAnLi4vLi4vbm9kZXMvYWNjZXNzb3JzL0NhbWVyYS5qcyc7XHJcbmltcG9ydCB7IG1vZGVsVmlld01hdHJpeCB9IGZyb20gJy4uLy4uL25vZGVzL2FjY2Vzc29ycy9Nb2RlbE5vZGUuanMnO1xyXG5pbXBvcnQgeyBwb3NpdGlvbkxvY2FsIH0gZnJvbSAnLi4vLi4vbm9kZXMvYWNjZXNzb3JzL1Bvc2l0aW9uLmpzJztcclxuaW1wb3J0IHsgbm9ybWFsTG9jYWwgfSBmcm9tICcuLi8uLi9ub2Rlcy9hY2Nlc3NvcnMvTm9ybWFsLmpzJztcclxuaW1wb3J0IHsgQmFja1NpZGUgfSBmcm9tICcuLi8uLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgUGFzc05vZGUgZnJvbSAnLi9QYXNzTm9kZS5qcyc7XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyBhIHJlbmRlciBwYXNzIGZvciBwcm9kdWNpbmcgYSB0b29uIG91dGxpbmUgZWZmZWN0IG9uIGNvbXBhdGlibGUgb2JqZWN0cy5cclxuICogT25seSAzRCBvYmplY3RzIHdpdGggbWF0ZXJpYWxzIG9mIHR5cGUgYE1lc2hUb29uTWF0ZXJpYWxgIGFuZCBgTWVzaFRvb25Ob2RlTWF0ZXJpYWxgXHJcbiAqIHdpbGwgcmVjZWl2ZSB0aGUgb3V0bGluZS5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgcG9zdFByb2Nlc3NpbmcgPSBuZXcgUG9zdFByb2Nlc3NpbmcoIHJlbmRlcmVyICk7XHJcbiAqXHJcbiAqIGNvbnN0IHNjZW5lUGFzcyA9IHRvb25PdXRsaW5lUGFzcyggc2NlbmUsIGNhbWVyYSApO1xyXG4gKlxyXG4gKiBwb3N0UHJvY2Vzc2luZy5vdXRwdXROb2RlID0gc2NlbmVQYXNzO1xyXG4gKiBgYGBcclxuICogQGF1Z21lbnRzIFBhc3NOb2RlXHJcbiAqL1xyXG5jbGFzcyBUb29uT3V0bGluZVBhc3NOb2RlIGV4dGVuZHMgUGFzc05vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdUb29uT3V0bGluZVBhc3NOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG91dGxpbmUgcGFzcyBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTY2VuZX0gc2NlbmUgLSBBIHJlZmVyZW5jZSB0byB0aGUgc2NlbmUuXHJcblx0ICogQHBhcmFtIHtDYW1lcmF9IGNhbWVyYSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBjYW1lcmEuXHJcblx0ICogQHBhcmFtIHtOb2RlfSBjb2xvck5vZGUgLSBEZWZpbmVzIHRoZSBvdXRsaW5lJ3MgY29sb3IuXHJcblx0ICogQHBhcmFtIHtOb2RlfSB0aGlja25lc3NOb2RlIC0gRGVmaW5lcyB0aGUgb3V0bGluZSdzIHRoaWNrbmVzcy5cclxuXHQgKiBAcGFyYW0ge05vZGV9IGFscGhhTm9kZSAtIERlZmluZXMgdGhlIG91dGxpbmUncyBhbHBoYS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggc2NlbmUsIGNhbWVyYSwgY29sb3JOb2RlLCB0aGlja25lc3NOb2RlLCBhbHBoYU5vZGUgKSB7XHJcblxyXG5cdFx0c3VwZXIoIFBhc3NOb2RlLkNPTE9SLCBzY2VuZSwgY2FtZXJhICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIHRoZSBvdXRsaW5lJ3MgY29sb3IuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29sb3JOb2RlID0gY29sb3JOb2RlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyB0aGUgb3V0bGluZSdzIHRoaWNrbmVzcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50aGlja25lc3NOb2RlID0gdGhpY2tuZXNzTm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgdGhlIG91dGxpbmUncyBhbHBoYS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hbHBoYU5vZGUgPSBhbHBoYU5vZGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBpbnRlcm5hbCBtYXRlcmlhbCBjYWNoZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge1dlYWtNYXA8TWF0ZXJpYWwsIE5vZGVNYXRlcmlhbD59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX21hdGVyaWFsQ2FjaGUgPSBuZXcgV2Vha01hcCgpO1xyXG5cclxuXHR9XHJcblxyXG5cdHVwZGF0ZUJlZm9yZSggZnJhbWUgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyByZW5kZXJlciB9ID0gZnJhbWU7XHJcblxyXG5cdFx0Y29uc3QgY3VycmVudFJlbmRlck9iamVjdEZ1bmN0aW9uID0gcmVuZGVyZXIuZ2V0UmVuZGVyT2JqZWN0RnVuY3Rpb24oKTtcclxuXHJcblx0XHRyZW5kZXJlci5zZXRSZW5kZXJPYmplY3RGdW5jdGlvbiggKCBvYmplY3QsIHNjZW5lLCBjYW1lcmEsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXAsIGxpZ2h0c05vZGUsIGNsaXBwaW5nQ29udGV4dCApID0+IHtcclxuXHJcblx0XHRcdC8vIG9ubHkgcmVuZGVyIG91dGxpbmUgZm9yIHN1cHBvcnRlZCBtYXRlcmlhbHNcclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWwuaXNNZXNoVG9vbk1hdGVyaWFsIHx8IG1hdGVyaWFsLmlzTWVzaFRvb25Ob2RlTWF0ZXJpYWwgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggbWF0ZXJpYWwud2lyZWZyYW1lID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBvdXRsaW5lTWF0ZXJpYWwgPSB0aGlzLl9nZXRPdXRsaW5lTWF0ZXJpYWwoIG1hdGVyaWFsICk7XHJcblx0XHRcdFx0XHRyZW5kZXJlci5yZW5kZXJPYmplY3QoIG9iamVjdCwgc2NlbmUsIGNhbWVyYSwgZ2VvbWV0cnksIG91dGxpbmVNYXRlcmlhbCwgZ3JvdXAsIGxpZ2h0c05vZGUsIGNsaXBwaW5nQ29udGV4dCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBkZWZhdWx0XHJcblxyXG5cdFx0XHRyZW5kZXJlci5yZW5kZXJPYmplY3QoIG9iamVjdCwgc2NlbmUsIGNhbWVyYSwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cCwgbGlnaHRzTm9kZSwgY2xpcHBpbmdDb250ZXh0ICk7XHJcblxyXG5cdFx0fSApO1xyXG5cclxuXHRcdHN1cGVyLnVwZGF0ZUJlZm9yZSggZnJhbWUgKTtcclxuXHJcblx0XHRyZW5kZXJlci5zZXRSZW5kZXJPYmplY3RGdW5jdGlvbiggY3VycmVudFJlbmRlck9iamVjdEZ1bmN0aW9uICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyB0aGUgbWF0ZXJpYWwgdXNlZCBmb3Igb3V0bGluZSByZW5kZXJpbmcuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEByZXR1cm4ge05vZGVNYXRlcmlhbH0gVGhlIG91dGxpbmUgbWF0ZXJpYWwuXHJcblx0ICovXHJcblx0X2NyZWF0ZU1hdGVyaWFsKCkge1xyXG5cclxuXHRcdGNvbnN0IG1hdGVyaWFsID0gbmV3IE5vZGVNYXRlcmlhbCgpO1xyXG5cdFx0bWF0ZXJpYWwuaXNNZXNoVG9vbk91dGxpbmVNYXRlcmlhbCA9IHRydWU7XHJcblx0XHRtYXRlcmlhbC5uYW1lID0gJ1Rvb25fT3V0bGluZSc7XHJcblx0XHRtYXRlcmlhbC5zaWRlID0gQmFja1NpZGU7XHJcblxyXG5cdFx0Ly8gdmVydGV4IG5vZGVcclxuXHJcblx0XHRjb25zdCBvdXRsaW5lTm9ybWFsID0gbm9ybWFsTG9jYWwubmVnYXRlKCk7XHJcblx0XHRjb25zdCBtdnAgPSBjYW1lcmFQcm9qZWN0aW9uTWF0cml4Lm11bCggbW9kZWxWaWV3TWF0cml4ICk7XHJcblxyXG5cdFx0Y29uc3QgcmF0aW8gPSBmbG9hdCggMS4wICk7IC8vIFRPRE86IHN1cHBvcnQgb3V0bGluZSB0aGlja25lc3MgcmF0aW8gZm9yIGVhY2ggdmVydGV4XHJcblx0XHRjb25zdCBwb3MgPSBtdnAubXVsKCB2ZWM0KCBwb3NpdGlvbkxvY2FsLCAxLjAgKSApO1xyXG5cdFx0Y29uc3QgcG9zMiA9IG12cC5tdWwoIHZlYzQoIHBvc2l0aW9uTG9jYWwuYWRkKCBvdXRsaW5lTm9ybWFsICksIDEuMCApICk7XHJcblx0XHRjb25zdCBub3JtID0gbm9ybWFsaXplKCBwb3Muc3ViKCBwb3MyICkgKTsgLy8gTk9URTogc3VidHJhY3QgcG9zMiBmcm9tIHBvcyBiZWNhdXNlIEJhY2tTaWRlIG9iamVjdE5vcm1hbCBpcyBuZWdhdGl2ZVxyXG5cclxuXHRcdG1hdGVyaWFsLnZlcnRleE5vZGUgPSBwb3MuYWRkKCBub3JtLm11bCggdGhpcy50aGlja25lc3NOb2RlICkubXVsKCBwb3MudyApLm11bCggcmF0aW8gKSApO1xyXG5cclxuXHRcdC8vIGNvbG9yIG5vZGVcclxuXHJcblx0XHRtYXRlcmlhbC5jb2xvck5vZGUgPSB2ZWM0KCB0aGlzLmNvbG9yTm9kZSwgdGhpcy5hbHBoYU5vZGUgKTtcclxuXHJcblx0XHRyZXR1cm4gbWF0ZXJpYWw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRm9yIHRoZSBnaXZlbiB0b29uIG1hdGVyaWFsLCB0aGlzIG1ldGhvZCByZXR1cm5zIGEgY29ycmVzcG9uZGluZ1xyXG5cdCAqIG91dGxpbmUgbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7KE1lc2hUb29uTWF0ZXJpYWx8TWVzaFRvb25Ob2RlTWF0ZXJpYWwpfSBvcmlnaW5hbE1hdGVyaWFsIC0gVGhlIHRvb24gbWF0ZXJpYWwuXHJcblx0ICogQHJldHVybiB7Tm9kZU1hdGVyaWFsfSBUaGUgb3V0bGluZSBtYXRlcmlhbC5cclxuXHQgKi9cclxuXHRfZ2V0T3V0bGluZU1hdGVyaWFsKCBvcmlnaW5hbE1hdGVyaWFsICkge1xyXG5cclxuXHRcdGxldCBvdXRsaW5lTWF0ZXJpYWwgPSB0aGlzLl9tYXRlcmlhbENhY2hlLmdldCggb3JpZ2luYWxNYXRlcmlhbCApO1xyXG5cclxuXHRcdGlmICggb3V0bGluZU1hdGVyaWFsID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRvdXRsaW5lTWF0ZXJpYWwgPSB0aGlzLl9jcmVhdGVNYXRlcmlhbCgpO1xyXG5cclxuXHRcdFx0dGhpcy5fbWF0ZXJpYWxDYWNoZS5zZXQoIG9yaWdpbmFsTWF0ZXJpYWwsIG91dGxpbmVNYXRlcmlhbCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gb3V0bGluZU1hdGVyaWFsO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBUb29uT3V0bGluZVBhc3NOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSB0b29uIG91dGxpbmUgcGFzcyBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge1NjZW5lfSBzY2VuZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBzY2VuZS5cclxuICogQHBhcmFtIHtDYW1lcmF9IGNhbWVyYSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBjYW1lcmEuXHJcbiAqIEBwYXJhbSB7Q29sb3J9IGNvbG9yIC0gRGVmaW5lcyB0aGUgb3V0bGluZSdzIGNvbG9yLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3RoaWNrbmVzcz0wLjAwM10gLSBEZWZpbmVzIHRoZSBvdXRsaW5lJ3MgdGhpY2tuZXNzLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW2FscGhhPTFdIC0gRGVmaW5lcyB0aGUgb3V0bGluZSdzIGFscGhhLlxyXG4gKiBAcmV0dXJucyB7VG9vbk91dGxpbmVQYXNzTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCB0b29uT3V0bGluZVBhc3MgPSAoIHNjZW5lLCBjYW1lcmEsIGNvbG9yID0gbmV3IENvbG9yKCAwLCAwLCAwICksIHRoaWNrbmVzcyA9IDAuMDAzLCBhbHBoYSA9IDEgKSA9PiBub2RlT2JqZWN0KCBuZXcgVG9vbk91dGxpbmVQYXNzTm9kZSggc2NlbmUsIGNhbWVyYSwgbm9kZU9iamVjdCggY29sb3IgKSwgbm9kZU9iamVjdCggdGhpY2tuZXNzICksIG5vZGVPYmplY3QoIGFscGhhICkgKSApO1xyXG4iLCJpbXBvcnQgeyBGbiwgZmxvYXQsIG1hdDMsIHZlYzMsIElmIH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5pbXBvcnQgeyBzZWxlY3QgfSBmcm9tICcuLi9tYXRoL0NvbmRpdGlvbmFsTm9kZS5qcyc7XHJcbmltcG9ydCB7IGNsYW1wLCBsb2cyLCBtYXgsIG1pbiwgcG93LCBtaXggfSBmcm9tICcuLi9tYXRoL01hdGhOb2RlLmpzJztcclxuaW1wb3J0IHsgbXVsLCBzdWIsIGRpdiB9IGZyb20gJy4uL21hdGgvT3BlcmF0b3JOb2RlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBMaW5lYXIgdG9uZSBtYXBwaW5nLCBleHBvc3VyZSBvbmx5LlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGU8dmVjMz59IGNvbG9yIC0gVGhlIGNvbG9yIHRoYXQgc2hvdWxkIGJlIHRvbmUgbWFwcGVkLlxyXG4gKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSBleHBvc3VyZSAtIFRoZSBleHBvc3VyZS5cclxuICogQHJldHVybiB7Tm9kZTx2ZWMzPn0gVGhlIHRvbmUgbWFwcGVkIGNvbG9yLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGxpbmVhclRvbmVNYXBwaW5nID0gLypAX19QVVJFX18qLyBGbiggKCBbIGNvbG9yLCBleHBvc3VyZSBdICkgPT4ge1xyXG5cclxuXHRyZXR1cm4gY29sb3IubXVsKCBleHBvc3VyZSApLmNsYW1wKCk7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ2xpbmVhclRvbmVNYXBwaW5nJyxcclxuXHR0eXBlOiAndmVjMycsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICdjb2xvcicsIHR5cGU6ICd2ZWMzJyB9LFxyXG5cdFx0eyBuYW1lOiAnZXhwb3N1cmUnLCB0eXBlOiAnZmxvYXQnIH1cclxuXHRdXHJcbn0gKTtcclxuXHJcbi8qKlxyXG4gKiBSZWluaGFyZCB0b25lIG1hcHBpbmcuXHJcbiAqXHJcbiAqIFJlZmVyZW5jZToge0BsaW5rIGh0dHBzOi8vd3d3LmNzLnV0YWguZWR1L2RvY3MvdGVjaHJlcG9ydHMvMjAwMi9wZGYvVVVDUy0wMi0wMDEucGRmfVxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGU8dmVjMz59IGNvbG9yIC0gVGhlIGNvbG9yIHRoYXQgc2hvdWxkIGJlIHRvbmUgbWFwcGVkLlxyXG4gKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSBleHBvc3VyZSAtIFRoZSBleHBvc3VyZS5cclxuICogQHJldHVybiB7Tm9kZTx2ZWMzPn0gVGhlIHRvbmUgbWFwcGVkIGNvbG9yLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHJlaW5oYXJkVG9uZU1hcHBpbmcgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgY29sb3IsIGV4cG9zdXJlIF0gKSA9PiB7XHJcblxyXG5cdGNvbG9yID0gY29sb3IubXVsKCBleHBvc3VyZSApO1xyXG5cclxuXHRyZXR1cm4gY29sb3IuZGl2KCBjb2xvci5hZGQoIDEuMCApICkuY2xhbXAoKTtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAncmVpbmhhcmRUb25lTWFwcGluZycsXHJcblx0dHlwZTogJ3ZlYzMnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAnY29sb3InLCB0eXBlOiAndmVjMycgfSxcclxuXHRcdHsgbmFtZTogJ2V4cG9zdXJlJywgdHlwZTogJ2Zsb2F0JyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG4vKipcclxuICogQ2luZW9uIHRvbmUgbWFwcGluZy5cclxuICpcclxuICogUmVmZXJlbmNlOiB7QGxpbmsgaHR0cDovL2ZpbG1pY3dvcmxkcy5jb20vYmxvZy9maWxtaWMtdG9uZW1hcHBpbmctb3BlcmF0b3JzL31cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlPHZlYzM+fSBjb2xvciAtIFRoZSBjb2xvciB0aGF0IHNob3VsZCBiZSB0b25lIG1hcHBlZC5cclxuICogQHBhcmFtIHtOb2RlPGZsb2F0Pn0gZXhwb3N1cmUgLSBUaGUgZXhwb3N1cmUuXHJcbiAqIEByZXR1cm4ge05vZGU8dmVjMz59IFRoZSB0b25lIG1hcHBlZCBjb2xvci5cclxuICovXHJcbmV4cG9ydCBjb25zdCBjaW5lb25Ub25lTWFwcGluZyA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyBjb2xvciwgZXhwb3N1cmUgXSApID0+IHtcclxuXHJcblx0Ly8gZmlsbWljIG9wZXJhdG9yIGJ5IEppbSBIZWpsIGFuZCBSaWNoYXJkIEJ1cmdlc3MtRGF3c29uXHJcblx0Y29sb3IgPSBjb2xvci5tdWwoIGV4cG9zdXJlICk7XHJcblx0Y29sb3IgPSBjb2xvci5zdWIoIDAuMDA0ICkubWF4KCAwLjAgKTtcclxuXHJcblx0Y29uc3QgYSA9IGNvbG9yLm11bCggY29sb3IubXVsKCA2LjIgKS5hZGQoIDAuNSApICk7XHJcblx0Y29uc3QgYiA9IGNvbG9yLm11bCggY29sb3IubXVsKCA2LjIgKS5hZGQoIDEuNyApICkuYWRkKCAwLjA2ICk7XHJcblxyXG5cdHJldHVybiBhLmRpdiggYiApLnBvdyggMi4yICk7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ2NpbmVvblRvbmVNYXBwaW5nJyxcclxuXHR0eXBlOiAndmVjMycsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICdjb2xvcicsIHR5cGU6ICd2ZWMzJyB9LFxyXG5cdFx0eyBuYW1lOiAnZXhwb3N1cmUnLCB0eXBlOiAnZmxvYXQnIH1cclxuXHRdXHJcbn0gKTtcclxuXHJcbi8vIHNvdXJjZTogaHR0cHM6Ly9naXRodWIuY29tL3NlbGZzaGFkb3cvbHRjX2NvZGUvYmxvYi9tYXN0ZXIvd2ViZ2wvc2hhZGVycy9sdGMvbHRjX2JsaXQuZnNcclxuXHJcbmNvbnN0IFJSVEFuZE9EVEZpdCA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyBjb2xvciBdICkgPT4ge1xyXG5cclxuXHRjb25zdCBhID0gY29sb3IubXVsKCBjb2xvci5hZGQoIDAuMDI0NTc4NiApICkuc3ViKCAwLjAwMDA5MDUzNyApO1xyXG5cdGNvbnN0IGIgPSBjb2xvci5tdWwoIGNvbG9yLmFkZCggMC40MzI5NTEwICkubXVsKCAwLjk4MzcyOSApICkuYWRkKCAwLjIzODA4MSApO1xyXG5cclxuXHRyZXR1cm4gYS5kaXYoIGIgKTtcclxuXHJcbn0gKTtcclxuXHJcbi8qKlxyXG4gKiBBQ0VTRmlsbWljIHRvbmUgbWFwcGluZy5cclxuICpcclxuICogUmVmZXJlbmNlOiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL3NlbGZzaGFkb3cvbHRjX2NvZGUvYmxvYi9tYXN0ZXIvd2ViZ2wvc2hhZGVycy9sdGMvbHRjX2JsaXQuZnN9XHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMzPn0gY29sb3IgLSBUaGUgY29sb3IgdGhhdCBzaG91bGQgYmUgdG9uZSBtYXBwZWQuXHJcbiAqIEBwYXJhbSB7Tm9kZTxmbG9hdD59IGV4cG9zdXJlIC0gVGhlIGV4cG9zdXJlLlxyXG4gKiBAcmV0dXJuIHtOb2RlPHZlYzM+fSBUaGUgdG9uZSBtYXBwZWQgY29sb3IuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYWNlc0ZpbG1pY1RvbmVNYXBwaW5nID0gLypAX19QVVJFX18qLyBGbiggKCBbIGNvbG9yLCBleHBvc3VyZSBdICkgPT4ge1xyXG5cclxuXHQvLyBzUkdCID0+IFhZWiA9PiBENjVfMl9ENjAgPT4gQVAxID0+IFJSVF9TQVRcclxuXHRjb25zdCBBQ0VTSW5wdXRNYXQgPSBtYXQzKFxyXG5cdFx0MC41OTcxOSwgMC4zNTQ1OCwgMC4wNDgyMyxcclxuXHRcdDAuMDc2MDAsIDAuOTA4MzQsIDAuMDE1NjYsXHJcblx0XHQwLjAyODQwLCAwLjEzMzgzLCAwLjgzNzc3XHJcblx0KTtcclxuXHJcblx0Ly8gT0RUX1NBVCA9PiBYWVogPT4gRDYwXzJfRDY1ID0+IHNSR0JcclxuXHRjb25zdCBBQ0VTT3V0cHV0TWF0ID0gbWF0MyhcclxuXHRcdDEuNjA0NzUsIC0gMC41MzEwOCwgLSAwLjA3MzY3LFxyXG5cdFx0LSAwLjEwMjA4LCAxLjEwODEzLCAtIDAuMDA2MDUsXHJcblx0XHQtIDAuMDAzMjcsIC0gMC4wNzI3NiwgMS4wNzYwMlxyXG5cdCk7XHJcblxyXG5cdGNvbG9yID0gY29sb3IubXVsKCBleHBvc3VyZSApLmRpdiggMC42ICk7XHJcblxyXG5cdGNvbG9yID0gQUNFU0lucHV0TWF0Lm11bCggY29sb3IgKTtcclxuXHJcblx0Ly8gQXBwbHkgUlJUIGFuZCBPRFRcclxuXHRjb2xvciA9IFJSVEFuZE9EVEZpdCggY29sb3IgKTtcclxuXHJcblx0Y29sb3IgPSBBQ0VTT3V0cHV0TWF0Lm11bCggY29sb3IgKTtcclxuXHJcblx0Ly8gQ2xhbXAgdG8gWzAsIDFdXHJcblx0cmV0dXJuIGNvbG9yLmNsYW1wKCk7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ2FjZXNGaWxtaWNUb25lTWFwcGluZycsXHJcblx0dHlwZTogJ3ZlYzMnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAnY29sb3InLCB0eXBlOiAndmVjMycgfSxcclxuXHRcdHsgbmFtZTogJ2V4cG9zdXJlJywgdHlwZTogJ2Zsb2F0JyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5jb25zdCBMSU5FQVJfUkVDMjAyMF9UT19MSU5FQVJfU1JHQiA9IC8qQF9fUFVSRV9fKi8gbWF0MyggdmVjMyggMS42NjA1LCAtIDAuMTI0NiwgLSAwLjAxODIgKSwgdmVjMyggLSAwLjU4NzYsIDEuMTMyOSwgLSAwLjEwMDYgKSwgdmVjMyggLSAwLjA3MjgsIC0gMC4wMDgzLCAxLjExODcgKSApO1xyXG5jb25zdCBMSU5FQVJfU1JHQl9UT19MSU5FQVJfUkVDMjAyMCA9IC8qQF9fUFVSRV9fKi8gbWF0MyggdmVjMyggMC42Mjc0LCAwLjA2OTEsIDAuMDE2NCApLCB2ZWMzKCAwLjMyOTMsIDAuOTE5NSwgMC4wODgwICksIHZlYzMoIDAuMDQzMywgMC4wMTEzLCAwLjg5NTYgKSApO1xyXG5cclxuY29uc3QgYWd4RGVmYXVsdENvbnRyYXN0QXBwcm94ID0gLypAX19QVVJFX18qLyBGbiggKCBbIHhfaW1tdXRhYmxlIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IHggPSB2ZWMzKCB4X2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgeDIgPSB2ZWMzKCB4Lm11bCggeCApICkudG9WYXIoKTtcclxuXHRjb25zdCB4NCA9IHZlYzMoIHgyLm11bCggeDIgKSApLnRvVmFyKCk7XHJcblxyXG5cdHJldHVybiBmbG9hdCggMTUuNSApLm11bCggeDQubXVsKCB4MiApICkuc3ViKCBtdWwoIDQwLjE0LCB4NC5tdWwoIHggKSApICkuYWRkKCBtdWwoIDMxLjk2LCB4NCApLnN1YiggbXVsKCA2Ljg2OCwgeDIubXVsKCB4ICkgKSApLmFkZCggbXVsKCAwLjQyOTgsIHgyICkuYWRkKCBtdWwoIDAuMTE5MSwgeCApLnN1YiggMC4wMDIzMiApICkgKSApO1xyXG5cclxufSApO1xyXG5cclxuLyoqXHJcbiAqIEFnWCB0b25lIG1hcHBpbmcuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMzPn0gY29sb3IgLSBUaGUgY29sb3IgdGhhdCBzaG91bGQgYmUgdG9uZSBtYXBwZWQuXHJcbiAqIEBwYXJhbSB7Tm9kZTxmbG9hdD59IGV4cG9zdXJlIC0gVGhlIGV4cG9zdXJlLlxyXG4gKiBAcmV0dXJuIHtOb2RlPHZlYzM+fSBUaGUgdG9uZSBtYXBwZWQgY29sb3IuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYWd4VG9uZU1hcHBpbmcgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgY29sb3IsIGV4cG9zdXJlIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IGNvbG9ydG9uZSA9IHZlYzMoIGNvbG9yICkudG9WYXIoKTtcclxuXHRjb25zdCBBZ1hJbnNldE1hdHJpeCA9IG1hdDMoIHZlYzMoIDAuODU2NjI3MTUzMzE1OTgzLCAwLjEzNzMxODk3MjkyOTg0NywgMC4xMTE4OTgyMTI5OTk5NSApLCB2ZWMzKCAwLjA5NTEyMTI0MDUzODE1ODgsIDAuNzYxMjQxOTkwNjAyNTkxLCAwLjA3Njc5OTQxODYwMzE5MDMgKSwgdmVjMyggMC4wNDgyNTE2MDYxNDU4NTgzLCAwLjEwMTQzOTAzNjQ2NzU2MiwgMC44MTEzMDIzNjgzOTY4NTkgKSApO1xyXG5cdGNvbnN0IEFnWE91dHNldE1hdHJpeCA9IG1hdDMoIHZlYzMoIDEuMTI3MTAwNTgxODE0NDM2OCwgLSAwLjE0MTMyOTc2MzQ5ODQzODMsIC0gMC4xNDEzMjk3NjM0OTg0MzgyNiApLCB2ZWMzKCAtIDAuMTEwNjA2NjQzMDk2NjAzMjMsIDEuMTU3ODIzNzAyMjE2MjcyLCAtIDAuMTEwNjA2NjQzMDk2NjAyOTQgKSwgdmVjMyggLSAwLjAxNjQ5MzkzODcxNzgzNDU3MywgLSAwLjAxNjQ5MzkzODcxNzgzNDI1NywgMS4yNTE5MzY0MDY1OTUwNDA1ICkgKTtcclxuXHRjb25zdCBBZ3hNaW5FdiA9IGZsb2F0KCAtIDEyLjQ3MzkzICk7XHJcblx0Y29uc3QgQWd4TWF4RXYgPSBmbG9hdCggNC4wMjYwNjkgKTtcclxuXHRjb2xvcnRvbmUubXVsQXNzaWduKCBleHBvc3VyZSApO1xyXG5cdGNvbG9ydG9uZS5hc3NpZ24oIExJTkVBUl9TUkdCX1RPX0xJTkVBUl9SRUMyMDIwLm11bCggY29sb3J0b25lICkgKTtcclxuXHRjb2xvcnRvbmUuYXNzaWduKCBBZ1hJbnNldE1hdHJpeC5tdWwoIGNvbG9ydG9uZSApICk7XHJcblx0Y29sb3J0b25lLmFzc2lnbiggbWF4KCBjb2xvcnRvbmUsIDFlLTEwICkgKTtcclxuXHRjb2xvcnRvbmUuYXNzaWduKCBsb2cyKCBjb2xvcnRvbmUgKSApO1xyXG5cdGNvbG9ydG9uZS5hc3NpZ24oIGNvbG9ydG9uZS5zdWIoIEFneE1pbkV2ICkuZGl2KCBBZ3hNYXhFdi5zdWIoIEFneE1pbkV2ICkgKSApO1xyXG5cdGNvbG9ydG9uZS5hc3NpZ24oIGNsYW1wKCBjb2xvcnRvbmUsIDAuMCwgMS4wICkgKTtcclxuXHRjb2xvcnRvbmUuYXNzaWduKCBhZ3hEZWZhdWx0Q29udHJhc3RBcHByb3goIGNvbG9ydG9uZSApICk7XHJcblx0Y29sb3J0b25lLmFzc2lnbiggQWdYT3V0c2V0TWF0cml4Lm11bCggY29sb3J0b25lICkgKTtcclxuXHRjb2xvcnRvbmUuYXNzaWduKCBwb3coIG1heCggdmVjMyggMC4wICksIGNvbG9ydG9uZSApLCB2ZWMzKCAyLjIgKSApICk7XHJcblx0Y29sb3J0b25lLmFzc2lnbiggTElORUFSX1JFQzIwMjBfVE9fTElORUFSX1NSR0IubXVsKCBjb2xvcnRvbmUgKSApO1xyXG5cdGNvbG9ydG9uZS5hc3NpZ24oIGNsYW1wKCBjb2xvcnRvbmUsIDAuMCwgMS4wICkgKTtcclxuXHJcblx0cmV0dXJuIGNvbG9ydG9uZTtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnYWd4VG9uZU1hcHBpbmcnLFxyXG5cdHR5cGU6ICd2ZWMzJyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ2NvbG9yJywgdHlwZTogJ3ZlYzMnIH0sXHJcblx0XHR7IG5hbWU6ICdleHBvc3VyZScsIHR5cGU6ICdmbG9hdCcgfVxyXG5cdF1cclxufSApO1xyXG5cclxuLyoqXHJcbiAqIE5ldXRyYWwgdG9uZSBtYXBwaW5nLlxyXG4gKlxyXG4gKiBSZWZlcmVuY2U6IHtAbGluayBodHRwczovL21vZGVsdmlld2VyLmRldi9leGFtcGxlcy90b25lLW1hcHBpbmd9XHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMzPn0gY29sb3IgLSBUaGUgY29sb3IgdGhhdCBzaG91bGQgYmUgdG9uZSBtYXBwZWQuXHJcbiAqIEBwYXJhbSB7Tm9kZTxmbG9hdD59IGV4cG9zdXJlIC0gVGhlIGV4cG9zdXJlLlxyXG4gKiBAcmV0dXJuIHtOb2RlPHZlYzM+fSBUaGUgdG9uZSBtYXBwZWQgY29sb3IuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbmV1dHJhbFRvbmVNYXBwaW5nID0gLypAX19QVVJFX18qLyBGbiggKCBbIGNvbG9yLCBleHBvc3VyZSBdICkgPT4ge1xyXG5cclxuXHRjb25zdCBTdGFydENvbXByZXNzaW9uID0gZmxvYXQoIDAuOCAtIDAuMDQgKTtcclxuXHRjb25zdCBEZXNhdHVyYXRpb24gPSBmbG9hdCggMC4xNSApO1xyXG5cclxuXHRjb2xvciA9IGNvbG9yLm11bCggZXhwb3N1cmUgKTtcclxuXHJcblx0Y29uc3QgeCA9IG1pbiggY29sb3IuciwgbWluKCBjb2xvci5nLCBjb2xvci5iICkgKTtcclxuXHRjb25zdCBvZmZzZXQgPSBzZWxlY3QoIHgubGVzc1RoYW4oIDAuMDggKSwgeC5zdWIoIG11bCggNi4yNSwgeC5tdWwoIHggKSApICksIDAuMDQgKTtcclxuXHJcblx0Y29sb3Iuc3ViQXNzaWduKCBvZmZzZXQgKTtcclxuXHJcblx0Y29uc3QgcGVhayA9IG1heCggY29sb3IuciwgbWF4KCBjb2xvci5nLCBjb2xvci5iICkgKTtcclxuXHJcblx0SWYoIHBlYWsubGVzc1RoYW4oIFN0YXJ0Q29tcHJlc3Npb24gKSwgKCkgPT4ge1xyXG5cclxuXHRcdHJldHVybiBjb2xvcjtcclxuXHJcblx0fSApO1xyXG5cclxuXHRjb25zdCBkID0gc3ViKCAxLCBTdGFydENvbXByZXNzaW9uICk7XHJcblx0Y29uc3QgbmV3UGVhayA9IHN1YiggMSwgZC5tdWwoIGQgKS5kaXYoIHBlYWsuYWRkKCBkLnN1YiggU3RhcnRDb21wcmVzc2lvbiApICkgKSApO1xyXG5cdGNvbG9yLm11bEFzc2lnbiggbmV3UGVhay5kaXYoIHBlYWsgKSApO1xyXG5cdGNvbnN0IGcgPSBzdWIoIDEsIGRpdiggMSwgRGVzYXR1cmF0aW9uLm11bCggcGVhay5zdWIoIG5ld1BlYWsgKSApLmFkZCggMSApICkgKTtcclxuXHJcblx0cmV0dXJuIG1peCggY29sb3IsIHZlYzMoIG5ld1BlYWsgKSwgZyApO1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICduZXV0cmFsVG9uZU1hcHBpbmcnLFxyXG5cdHR5cGU6ICd2ZWMzJyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ2NvbG9yJywgdHlwZTogJ3ZlYzMnIH0sXHJcblx0XHR7IG5hbWU6ICdleHBvc3VyZScsIHR5cGU6ICdmbG9hdCcgfVxyXG5cdF1cclxufSApO1xyXG4iLCJpbXBvcnQgTm9kZSBmcm9tICcuLi9jb3JlL05vZGUuanMnO1xyXG5pbXBvcnQgeyBub2RlUHJveHkgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBjbGFzcyByZXByZXNlbnRzIG5hdGl2ZSBjb2RlIHNlY3Rpb25zLiBJdCBpcyB0aGUgYmFzZVxyXG4gKiBjbGFzcyBmb3IgbW9kdWxlcyBsaWtlIHtAbGluayBGdW5jdGlvbk5vZGV9IHdoaWNoIGFsbG93cyB0byBpbXBsZW1lbnRcclxuICogZnVuY3Rpb25zIHdpdGggbmF0aXZlIHNoYWRlciBsYW5ndWFnZXMuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBOb2RlXHJcbiAqL1xyXG5jbGFzcyBDb2RlTm9kZSBleHRlbmRzIE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdDb2RlTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBjb2RlIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW2NvZGU9JyddIC0gVGhlIG5hdGl2ZSBjb2RlLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8Tm9kZT59IFtpbmNsdWRlcz1bXV0gLSBBbiBhcnJheSBvZiBpbmNsdWRlcy5cclxuXHQgKiBAcGFyYW0geygnanMnfCd3Z3NsJ3wnZ2xzbCcpfSBbbGFuZ3VhZ2U9JyddIC0gVGhlIHVzZWQgbGFuZ3VhZ2UuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGNvZGUgPSAnJywgaW5jbHVkZXMgPSBbXSwgbGFuZ3VhZ2UgPSAnJyApIHtcclxuXHJcblx0XHRzdXBlciggJ2NvZGUnICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzQ29kZU5vZGUgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG5hdGl2ZSBjb2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKiBAZGVmYXVsdCAnJ1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvZGUgPSBjb2RlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQW4gYXJyYXkgb2YgaW5jbHVkZXNcclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8Tm9kZT59XHJcblx0XHQgKiBAZGVmYXVsdCBbXVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmluY2x1ZGVzID0gaW5jbHVkZXM7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdXNlZCBsYW5ndWFnZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KCdqcyd8J3dnc2wnfCdnbHNsJyl9XHJcblx0XHQgKiBAZGVmYXVsdCAnJ1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxhbmd1YWdlID0gbGFuZ3VhZ2U7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIG1ldGhvZCBpcyBvdmVyd3JpdHRlbiBzbyBpdCBhbHdheXMgcmV0dXJucyBgdHJ1ZWAuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoaXMgbm9kZSBpcyBnbG9iYWwgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGlzR2xvYmFsKCkge1xyXG5cclxuXHRcdHJldHVybiB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGluY2x1ZGVzIG9mIHRoaXMgY29kZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxOb2RlPn0gaW5jbHVkZXMgLSBUaGUgaW5jbHVkZXMgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge0NvZGVOb2RlfSBBIHJlZmVyZW5jZSB0byB0aGlzIG5vZGUuXHJcblx0ICovXHJcblx0c2V0SW5jbHVkZXMoIGluY2x1ZGVzICkge1xyXG5cclxuXHRcdHRoaXMuaW5jbHVkZXMgPSBpbmNsdWRlcztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBpbmNsdWRlcyBvZiB0aGlzIGNvZGUgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7QXJyYXk8Tm9kZT59IFRoZSBpbmNsdWRlcy5cclxuXHQgKi9cclxuXHRnZXRJbmNsdWRlcyggLypidWlsZGVyKi8gKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuaW5jbHVkZXM7XHJcblxyXG5cdH1cclxuXHJcblx0Z2VuZXJhdGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgaW5jbHVkZXMgPSB0aGlzLmdldEluY2x1ZGVzKCBidWlsZGVyICk7XHJcblxyXG5cdFx0Zm9yICggY29uc3QgaW5jbHVkZSBvZiBpbmNsdWRlcyApIHtcclxuXHJcblx0XHRcdGluY2x1ZGUuYnVpbGQoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3Qgbm9kZUNvZGUgPSBidWlsZGVyLmdldENvZGVGcm9tTm9kZSggdGhpcywgdGhpcy5nZXROb2RlVHlwZSggYnVpbGRlciApICk7XHJcblx0XHRub2RlQ29kZS5jb2RlID0gdGhpcy5jb2RlO1xyXG5cclxuXHRcdHJldHVybiBub2RlQ29kZS5jb2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdHNlcmlhbGl6ZSggZGF0YSApIHtcclxuXHJcblx0XHRzdXBlci5zZXJpYWxpemUoIGRhdGEgKTtcclxuXHJcblx0XHRkYXRhLmNvZGUgPSB0aGlzLmNvZGU7XHJcblx0XHRkYXRhLmxhbmd1YWdlID0gdGhpcy5sYW5ndWFnZTtcclxuXHJcblx0fVxyXG5cclxuXHRkZXNlcmlhbGl6ZSggZGF0YSApIHtcclxuXHJcblx0XHRzdXBlci5kZXNlcmlhbGl6ZSggZGF0YSApO1xyXG5cclxuXHRcdHRoaXMuY29kZSA9IGRhdGEuY29kZTtcclxuXHRcdHRoaXMubGFuZ3VhZ2UgPSBkYXRhLmxhbmd1YWdlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBDb2RlTm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgY29kZSBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NvZGVdIC0gVGhlIG5hdGl2ZSBjb2RlLlxyXG4gKiBAcGFyYW0gez9BcnJheTxOb2RlPn0gW2luY2x1ZGVzPVtdXSAtIEFuIGFycmF5IG9mIGluY2x1ZGVzLlxyXG4gKiBAcGFyYW0gez8oJ2pzJ3wnd2dzbCd8J2dsc2wnKX0gW2xhbmd1YWdlPScnXSAtIFRoZSB1c2VkIGxhbmd1YWdlLlxyXG4gKiBAcmV0dXJucyB7Q29kZU5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgY29kZSA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBDb2RlTm9kZSApLnNldFBhcmFtZXRlckxlbmd0aCggMSwgMyApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSBKUyBjb2RlIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBzcmMgLSBUaGUgbmF0aXZlIGNvZGUuXHJcbiAqIEBwYXJhbSB7QXJyYXk8Tm9kZT59IGluY2x1ZGVzIC0gQW4gYXJyYXkgb2YgaW5jbHVkZXMuXHJcbiAqIEByZXR1cm5zIHtDb2RlTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBqcyA9ICggc3JjLCBpbmNsdWRlcyApID0+IGNvZGUoIHNyYywgaW5jbHVkZXMsICdqcycgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgV0dTTCBjb2RlIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBzcmMgLSBUaGUgbmF0aXZlIGNvZGUuXHJcbiAqIEBwYXJhbSB7QXJyYXk8Tm9kZT59IGluY2x1ZGVzIC0gQW4gYXJyYXkgb2YgaW5jbHVkZXMuXHJcbiAqIEByZXR1cm5zIHtDb2RlTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCB3Z3NsID0gKCBzcmMsIGluY2x1ZGVzICkgPT4gY29kZSggc3JjLCBpbmNsdWRlcywgJ3dnc2wnICk7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIEdMU0wgY29kZSBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge3N0cmluZ30gc3JjIC0gVGhlIG5hdGl2ZSBjb2RlLlxyXG4gKiBAcGFyYW0ge0FycmF5PE5vZGU+fSBpbmNsdWRlcyAtIEFuIGFycmF5IG9mIGluY2x1ZGVzLlxyXG4gKiBAcmV0dXJucyB7Q29kZU5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZ2xzbCA9ICggc3JjLCBpbmNsdWRlcyApID0+IGNvZGUoIHNyYywgaW5jbHVkZXMsICdnbHNsJyApO1xyXG4iLCJpbXBvcnQgQ29kZU5vZGUgZnJvbSAnLi9Db2RlTm9kZS5qcyc7XHJcbmltcG9ydCB7IG5vZGVPYmplY3QgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgbmF0aXZlIHNoYWRlciBmdW5jdGlvbi4gSXQgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50XHJcbiAqIGNlcnRhaW4gYXNwZWN0cyBvZiBhIG5vZGUgbWF0ZXJpYWwgd2l0aCBuYXRpdmUgc2hhZGVyIGNvZGUuIFRoZXJlIGFyZSB0d28gcHJlZGVmaW5lZFxyXG4gKiBUU0wgZnVuY3Rpb25zIGZvciBlYXNpZXIgdXNhZ2UuXHJcbiAqXHJcbiAqIC0gYHdnc2xGbmA6IENyZWF0ZXMgYSBXR1NMIGZ1bmN0aW9uIG5vZGUuXHJcbiAqIC0gYGdsc2xGbmA6IENyZWF0ZXMgYSBHTFNMIGZ1bmN0aW9uIG5vZGUuXHJcbiAqXHJcbiAqIEEgYmFzaWMgZXhhbXBsZSB3aXRoIG9uZSBpbmNsdWRlIGxvb2tzIGxpa2Ugc286XHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGRlc2F0dXJhdGVXR1NMRm4gPSB3Z3NsRm4oIGBcclxuICpcdGZuIGRlc2F0dXJhdGUoIGNvbG9yOnZlYzM8ZjMyPiApIC0+IHZlYzM8ZjMyPiB7XHJcbiAqXHRcdGxldCBsdW0gPSB2ZWMzPGYzMj4oIDAuMjk5LCAwLjU4NywgMC4xMTQgKTtcclxuICpcdFx0cmV0dXJuIHZlYzM8ZjMyPiggZG90KCBsdW0sIGNvbG9yICkgKTtcclxuICpcdH1gXHJcbiAqKTtcclxuICogY29uc3Qgc29tZVdHU0xGbiA9IHdnc2xGbiggYFxyXG4gKlx0Zm4gc29tZUZuKCBjb2xvcjp2ZWMzPGYzMj4gKSAtPiB2ZWMzPGYzMj4ge1xyXG4gKiBcdFx0cmV0dXJuIGRlc2F0dXJhdGUoIGNvbG9yICk7XHJcbiAqIFx0fVxyXG4gKiBgLCBbIGRlc2F0dXJhdGVXR1NMRm4gXSApO1xyXG4gKiBtYXRlcmlhbC5jb2xvck5vZGUgPSBzb21lV0dTTEZuKCB7IGNvbG9yOiB0ZXh0dXJlKCBtYXAgKSB9ICk7XHJcbiAqYGBgXHJcbiAqIEBhdWdtZW50cyBDb2RlTm9kZVxyXG4gKi9cclxuY2xhc3MgRnVuY3Rpb25Ob2RlIGV4dGVuZHMgQ29kZU5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdGdW5jdGlvbk5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgZnVuY3Rpb24gbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbY29kZT0nJ10gLSBUaGUgbmF0aXZlIGNvZGUuXHJcblx0ICogQHBhcmFtIHtBcnJheTxOb2RlPn0gW2luY2x1ZGVzPVtdXSAtIEFuIGFycmF5IG9mIGluY2x1ZGVzLlxyXG5cdCAqIEBwYXJhbSB7KCdqcyd8J3dnc2wnfCdnbHNsJyl9IFtsYW5ndWFnZT0nJ10gLSBUaGUgdXNlZCBsYW5ndWFnZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggY29kZSA9ICcnLCBpbmNsdWRlcyA9IFtdLCBsYW5ndWFnZSA9ICcnICkge1xyXG5cclxuXHRcdHN1cGVyKCBjb2RlLCBpbmNsdWRlcywgbGFuZ3VhZ2UgKTtcclxuXHJcblx0fVxyXG5cclxuXHRnZXROb2RlVHlwZSggYnVpbGRlciApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5nZXROb2RlRnVuY3Rpb24oIGJ1aWxkZXIgKS50eXBlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGlucHV0cyBvZiB0aGlzIGZ1bmN0aW9uIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge0FycmF5PE5vZGVGdW5jdGlvbklucHV0Pn0gVGhlIGlucHV0cy5cclxuXHQgKi9cclxuXHRnZXRJbnB1dHMoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZ2V0Tm9kZUZ1bmN0aW9uKCBidWlsZGVyICkuaW5wdXRzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIG5vZGUgZnVuY3Rpb24gZm9yIHRoaXMgZnVuY3Rpb24gbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7Tm9kZUZ1bmN0aW9ufSBUaGUgbm9kZSBmdW5jdGlvbi5cclxuXHQgKi9cclxuXHRnZXROb2RlRnVuY3Rpb24oIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3Qgbm9kZURhdGEgPSBidWlsZGVyLmdldERhdGFGcm9tTm9kZSggdGhpcyApO1xyXG5cclxuXHRcdGxldCBub2RlRnVuY3Rpb24gPSBub2RlRGF0YS5ub2RlRnVuY3Rpb247XHJcblxyXG5cdFx0aWYgKCBub2RlRnVuY3Rpb24gPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdG5vZGVGdW5jdGlvbiA9IGJ1aWxkZXIucGFyc2VyLnBhcnNlRnVuY3Rpb24oIHRoaXMuY29kZSApO1xyXG5cclxuXHRcdFx0bm9kZURhdGEubm9kZUZ1bmN0aW9uID0gbm9kZUZ1bmN0aW9uO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbm9kZUZ1bmN0aW9uO1xyXG5cclxuXHR9XHJcblxyXG5cdGdlbmVyYXRlKCBidWlsZGVyLCBvdXRwdXQgKSB7XHJcblxyXG5cdFx0c3VwZXIuZ2VuZXJhdGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRjb25zdCBub2RlRnVuY3Rpb24gPSB0aGlzLmdldE5vZGVGdW5jdGlvbiggYnVpbGRlciApO1xyXG5cclxuXHRcdGNvbnN0IG5hbWUgPSBub2RlRnVuY3Rpb24ubmFtZTtcclxuXHRcdGNvbnN0IHR5cGUgPSBub2RlRnVuY3Rpb24udHlwZTtcclxuXHJcblx0XHRjb25zdCBub2RlQ29kZSA9IGJ1aWxkZXIuZ2V0Q29kZUZyb21Ob2RlKCB0aGlzLCB0eXBlICk7XHJcblxyXG5cdFx0aWYgKCBuYW1lICE9PSAnJyApIHtcclxuXHJcblx0XHRcdC8vIHVzZSBhIGN1c3RvbSBwcm9wZXJ0eSBuYW1lXHJcblxyXG5cdFx0XHRub2RlQ29kZS5uYW1lID0gbmFtZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgcHJvcGVydHlOYW1lID0gYnVpbGRlci5nZXRQcm9wZXJ0eU5hbWUoIG5vZGVDb2RlICk7XHJcblxyXG5cdFx0Y29uc3QgY29kZSA9IHRoaXMuZ2V0Tm9kZUZ1bmN0aW9uKCBidWlsZGVyICkuZ2V0Q29kZSggcHJvcGVydHlOYW1lICk7XHJcblxyXG5cdFx0bm9kZUNvZGUuY29kZSA9IGNvZGUgKyAnXFxuJztcclxuXHJcblx0XHRpZiAoIG91dHB1dCA9PT0gJ3Byb3BlcnR5JyApIHtcclxuXHJcblx0XHRcdHJldHVybiBwcm9wZXJ0eU5hbWU7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHJldHVybiBidWlsZGVyLmZvcm1hdCggYCR7IHByb3BlcnR5TmFtZSB9KClgLCB0eXBlLCBvdXRwdXQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEZ1bmN0aW9uTm9kZTtcclxuXHJcbmNvbnN0IG5hdGl2ZUZuID0gKCBjb2RlLCBpbmNsdWRlcyA9IFtdLCBsYW5ndWFnZSA9ICcnICkgPT4ge1xyXG5cclxuXHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBpbmNsdWRlcy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0Y29uc3QgaW5jbHVkZSA9IGluY2x1ZGVzWyBpIF07XHJcblxyXG5cdFx0Ly8gVFNMIEZ1bmN0aW9uOiBnbHNsRm4sIHdnc2xGblxyXG5cclxuXHRcdGlmICggdHlwZW9mIGluY2x1ZGUgPT09ICdmdW5jdGlvbicgKSB7XHJcblxyXG5cdFx0XHRpbmNsdWRlc1sgaSBdID0gaW5jbHVkZS5mdW5jdGlvbk5vZGU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGNvbnN0IGZ1bmN0aW9uTm9kZSA9IG5vZGVPYmplY3QoIG5ldyBGdW5jdGlvbk5vZGUoIGNvZGUsIGluY2x1ZGVzLCBsYW5ndWFnZSApICk7XHJcblxyXG5cdGNvbnN0IGZuID0gKCAuLi5wYXJhbXMgKSA9PiBmdW5jdGlvbk5vZGUuY2FsbCggLi4ucGFyYW1zICk7XHJcblx0Zm4uZnVuY3Rpb25Ob2RlID0gZnVuY3Rpb25Ob2RlO1xyXG5cclxuXHRyZXR1cm4gZm47XHJcblxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGdsc2xGbiA9ICggY29kZSwgaW5jbHVkZXMgKSA9PiBuYXRpdmVGbiggY29kZSwgaW5jbHVkZXMsICdnbHNsJyApO1xyXG5leHBvcnQgY29uc3Qgd2dzbEZuID0gKCBjb2RlLCBpbmNsdWRlcyApID0+IG5hdGl2ZUZuKCBjb2RlLCBpbmNsdWRlcywgJ3dnc2wnICk7XHJcbiIsImltcG9ydCBOb2RlIGZyb20gJy4uL2NvcmUvTm9kZS5qcyc7XHJcbmltcG9ydCB7IGFycmF5QnVmZmVyVG9CYXNlNjQsIGJhc2U2NFRvQXJyYXlCdWZmZXIgfSBmcm9tICcuLi9jb3JlL05vZGVVdGlscy5qcyc7XHJcbmltcG9ydCB7IG5vZGVQcm94eSwgZmxvYXQgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcblxyXG5pbXBvcnQgeyBFdmVudERpc3BhdGNoZXIgfSBmcm9tICcuLi8uLi9jb3JlL0V2ZW50RGlzcGF0Y2hlci5qcyc7XHJcblxyXG4vKipcclxuICogYFNjcmlwdGFibGVOb2RlYCB1c2VzIHRoaXMgY2xhc3MgdG8gbWFuYWdlIHNjcmlwdCBpbnB1dHMgYW5kIG91dHB1dHMuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBOb2RlXHJcbiAqL1xyXG5jbGFzcyBTY3JpcHRhYmxlVmFsdWVOb2RlIGV4dGVuZHMgTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ1NjcmlwdGFibGVWYWx1ZU5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc2NyaXB0YWJsZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHthbnl9IFt2YWx1ZT1udWxsXSAtIFRoZSB2YWx1ZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggdmFsdWUgPSBudWxsICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZSB0byB0aGUgdmFsdWUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fdmFsdWUgPSB2YWx1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBgX3ZhbHVlYCwgdGhpcyBwcm9wZXJ0eSBtaWdodCBjYWNoZSBwYXJzZWQgZGF0YS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9jYWNoZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBJZiB0aGlzIG5vZGUgcmVwcmVzZW50cyBhbiBpbnB1dCwgdGhpcyBwcm9wZXJ0eSByZXByZXNlbnRzIHRoZSBpbnB1dCB0eXBlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/c3RyaW5nfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlucHV0VHlwZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBJZiB0aGlzIG5vZGUgcmVwcmVzZW50cyBhbiBvdXRwdXQsIHRoaXMgcHJvcGVydHkgcmVwcmVzZW50cyB0aGUgb3V0cHV0IHR5cGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9zdHJpbmd9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMub3V0cHV0VHlwZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBldmVudCBkaXNwYXRjaGVyIGZvciBtYW5hZ2luZyBldmVudHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0V2ZW50RGlzcGF0Y2hlcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ldmVudHMgPSBuZXcgRXZlbnREaXNwYXRjaGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzU2NyaXB0YWJsZVZhbHVlTm9kZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogV2hldGhlciB0aGlzIG5vZGUgcmVwcmVzZW50cyBhbiBvdXRwdXQgb3Igbm90LlxyXG5cdCAqXHJcblx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0ICogQHJlYWRvbmx5XHJcblx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdCAqL1xyXG5cdGdldCBpc1NjcmlwdGFibGVPdXRwdXROb2RlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm91dHB1dFR5cGUgIT09IG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0IHZhbHVlKCB2YWwgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl92YWx1ZSA9PT0gdmFsICkgcmV0dXJuO1xyXG5cclxuXHRcdGlmICggdGhpcy5fY2FjaGUgJiYgdGhpcy5pbnB1dFR5cGUgPT09ICdVUkwnICYmIHRoaXMudmFsdWUudmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciApIHtcclxuXHJcblx0XHRcdFVSTC5yZXZva2VPYmplY3RVUkwoIHRoaXMuX2NhY2hlICk7XHJcblxyXG5cdFx0XHR0aGlzLl9jYWNoZSA9IG51bGw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuX3ZhbHVlID0gdmFsO1xyXG5cclxuXHRcdHRoaXMuZXZlbnRzLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2NoYW5nZScgfSApO1xyXG5cclxuXHRcdHRoaXMucmVmcmVzaCgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBub2RlJ3MgdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7YW55fVxyXG5cdCAqL1xyXG5cdGdldCB2YWx1ZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fdmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGlzcGF0Y2hlcyB0aGUgYHJlZnJlc2hgIGV2ZW50LlxyXG5cdCAqL1xyXG5cdHJlZnJlc2goKSB7XHJcblxyXG5cdFx0dGhpcy5ldmVudHMuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAncmVmcmVzaCcgfSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBgdmFsdWVgIHByb3BlcnR5IHVzdWFsbHkgcmVwcmVzZW50cyBhIG5vZGUgb3IgZXZlbiBiaW5hcnkgZGF0YSBpbiBmb3JtIG9mIGFycmF5IGJ1ZmZlcnMuXHJcblx0ICogSW4gdGhpcyBjYXNlLCB0aGlzIG1ldGhvZCB0cmllcyB0byByZXR1cm4gdGhlIGFjdHVhbCB2YWx1ZSBiZWhpbmQgdGhlIGNvbXBsZXggdHlwZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge2FueX0gVGhlIHZhbHVlLlxyXG5cdCAqL1xyXG5cdGdldFZhbHVlKCkge1xyXG5cclxuXHRcdGNvbnN0IHZhbHVlID0gdGhpcy52YWx1ZTtcclxuXHJcblx0XHRpZiAoIHZhbHVlICYmIHRoaXMuX2NhY2hlID09PSBudWxsICYmIHRoaXMuaW5wdXRUeXBlID09PSAnVVJMJyAmJiB2YWx1ZS52YWx1ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyICkge1xyXG5cclxuXHRcdFx0dGhpcy5fY2FjaGUgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKCBuZXcgQmxvYiggWyB2YWx1ZS52YWx1ZSBdICkgKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCB2YWx1ZSAmJiB2YWx1ZS52YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIChcclxuXHRcdFx0KCAoIHRoaXMuaW5wdXRUeXBlID09PSAnVVJMJyB8fCB0aGlzLmlucHV0VHlwZSA9PT0gJ1N0cmluZycgKSAmJiB0eXBlb2YgdmFsdWUudmFsdWUgPT09ICdzdHJpbmcnICkgfHxcclxuXHRcdFx0KCB0aGlzLmlucHV0VHlwZSA9PT0gJ051bWJlcicgJiYgdHlwZW9mIHZhbHVlLnZhbHVlID09PSAnbnVtYmVyJyApIHx8XHJcblx0XHRcdCggdGhpcy5pbnB1dFR5cGUgPT09ICdWZWN0b3IyJyAmJiB2YWx1ZS52YWx1ZS5pc1ZlY3RvcjIgKSB8fFxyXG5cdFx0XHQoIHRoaXMuaW5wdXRUeXBlID09PSAnVmVjdG9yMycgJiYgdmFsdWUudmFsdWUuaXNWZWN0b3IzICkgfHxcclxuXHRcdFx0KCB0aGlzLmlucHV0VHlwZSA9PT0gJ1ZlY3RvcjQnICYmIHZhbHVlLnZhbHVlLmlzVmVjdG9yNCApIHx8XHJcblx0XHRcdCggdGhpcy5pbnB1dFR5cGUgPT09ICdDb2xvcicgJiYgdmFsdWUudmFsdWUuaXNDb2xvciApIHx8XHJcblx0XHRcdCggdGhpcy5pbnB1dFR5cGUgPT09ICdNYXRyaXgzJyAmJiB2YWx1ZS52YWx1ZS5pc01hdHJpeDMgKSB8fFxyXG5cdFx0XHQoIHRoaXMuaW5wdXRUeXBlID09PSAnTWF0cml4NCcgJiYgdmFsdWUudmFsdWUuaXNNYXRyaXg0IClcclxuXHRcdCkgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gdmFsdWUudmFsdWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzLl9jYWNoZSB8fCB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBPdmVyd3JpdHRlbiBzaW5jZSB0aGUgbm9kZSB0eXBlIGlzIGluZmVycmVkIGZyb20gdGhlIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBub2RlIHR5cGUuXHJcblx0ICovXHJcblx0Z2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMudmFsdWUgJiYgdGhpcy52YWx1ZS5pc05vZGUgPyB0aGlzLnZhbHVlLmdldE5vZGVUeXBlKCBidWlsZGVyICkgOiAnZmxvYXQnO1xyXG5cclxuXHR9XHJcblxyXG5cdHNldHVwKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnZhbHVlICYmIHRoaXMudmFsdWUuaXNOb2RlID8gdGhpcy52YWx1ZSA6IGZsb2F0KCk7XHJcblxyXG5cdH1cclxuXHJcblx0c2VyaWFsaXplKCBkYXRhICkge1xyXG5cclxuXHRcdHN1cGVyLnNlcmlhbGl6ZSggZGF0YSApO1xyXG5cclxuXHRcdGlmICggdGhpcy52YWx1ZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGlmICggdGhpcy5pbnB1dFR5cGUgPT09ICdBcnJheUJ1ZmZlcicgKSB7XHJcblxyXG5cdFx0XHRcdGRhdGEudmFsdWUgPSBhcnJheUJ1ZmZlclRvQmFzZTY0KCB0aGlzLnZhbHVlICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRkYXRhLnZhbHVlID0gdGhpcy52YWx1ZSA/IHRoaXMudmFsdWUudG9KU09OKCBkYXRhLm1ldGEgKS51dWlkIDogbnVsbDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0ZGF0YS52YWx1ZSA9IG51bGw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGRhdGEuaW5wdXRUeXBlID0gdGhpcy5pbnB1dFR5cGU7XHJcblx0XHRkYXRhLm91dHB1dFR5cGUgPSB0aGlzLm91dHB1dFR5cGU7XHJcblxyXG5cdH1cclxuXHJcblx0ZGVzZXJpYWxpemUoIGRhdGEgKSB7XHJcblxyXG5cdFx0c3VwZXIuZGVzZXJpYWxpemUoIGRhdGEgKTtcclxuXHJcblx0XHRsZXQgdmFsdWUgPSBudWxsO1xyXG5cclxuXHRcdGlmICggZGF0YS52YWx1ZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGlmICggZGF0YS5pbnB1dFR5cGUgPT09ICdBcnJheUJ1ZmZlcicgKSB7XHJcblxyXG5cdFx0XHRcdHZhbHVlID0gYmFzZTY0VG9BcnJheUJ1ZmZlciggZGF0YS52YWx1ZSApO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggZGF0YS5pbnB1dFR5cGUgPT09ICdUZXh0dXJlJyApIHtcclxuXHJcblx0XHRcdFx0dmFsdWUgPSBkYXRhLm1ldGEudGV4dHVyZXNbIGRhdGEudmFsdWUgXTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHZhbHVlID0gZGF0YS5tZXRhLm5vZGVzWyBkYXRhLnZhbHVlIF0gfHwgbnVsbDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy52YWx1ZSA9IHZhbHVlO1xyXG5cclxuXHRcdHRoaXMuaW5wdXRUeXBlID0gZGF0YS5pbnB1dFR5cGU7XHJcblx0XHR0aGlzLm91dHB1dFR5cGUgPSBkYXRhLm91dHB1dFR5cGU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFNjcmlwdGFibGVWYWx1ZU5vZGU7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIHNjcmlwdGFibGUgdmFsdWUgbm9kZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHthbnl9IFt2YWx1ZV0gLSBUaGUgdmFsdWUuXHJcbiAqIEByZXR1cm5zIHtTY3JpcHRhYmxlVmFsdWVOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHNjcmlwdGFibGVWYWx1ZSA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBTY3JpcHRhYmxlVmFsdWVOb2RlICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAxICk7XHJcbiIsImltcG9ydCBOb2RlIGZyb20gJy4uL2NvcmUvTm9kZS5qcyc7XHJcbmltcG9ydCB7IHNjcmlwdGFibGVWYWx1ZSB9IGZyb20gJy4vU2NyaXB0YWJsZVZhbHVlTm9kZS5qcyc7XHJcbmltcG9ydCB7IG5vZGVQcm94eSwgZmxvYXQgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcbmltcG9ydCB7IGhhc2hBcnJheSwgaGFzaFN0cmluZyB9IGZyb20gJy4uL2NvcmUvTm9kZVV0aWxzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIE1hcC1saWtlIGRhdGEgc3RydWN0dXJlIGZvciBtYW5hZ2luZyByZXNvdXJjZXMgb2Ygc2NyaXB0YWJsZSBub2Rlcy5cclxuICpcclxuICogQGF1Z21lbnRzIE1hcFxyXG4gKi9cclxuY2xhc3MgUmVzb3VyY2VzIGV4dGVuZHMgTWFwIHtcclxuXHJcblx0Z2V0KCBrZXksIGNhbGxiYWNrID0gbnVsbCwgLi4ucGFyYW1zICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5oYXMoIGtleSApICkgcmV0dXJuIHN1cGVyLmdldCgga2V5ICk7XHJcblxyXG5cdFx0aWYgKCBjYWxsYmFjayAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGNvbnN0IHZhbHVlID0gY2FsbGJhY2soIC4uLnBhcmFtcyApO1xyXG5cdFx0XHR0aGlzLnNldCgga2V5LCB2YWx1ZSApO1xyXG5cdFx0XHRyZXR1cm4gdmFsdWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5jbGFzcyBQYXJhbWV0ZXJzIHtcclxuXHJcblx0Y29uc3RydWN0b3IoIHNjcmlwdGFibGVOb2RlICkge1xyXG5cclxuXHRcdHRoaXMuc2NyaXB0YWJsZU5vZGUgPSBzY3JpcHRhYmxlTm9kZTtcclxuXHJcblx0fVxyXG5cclxuXHRnZXQgcGFyYW1ldGVycygpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5zY3JpcHRhYmxlTm9kZS5wYXJhbWV0ZXJzO1xyXG5cclxuXHR9XHJcblxyXG5cdGdldCBsYXlvdXQoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuc2NyaXB0YWJsZU5vZGUuZ2V0TGF5b3V0KCk7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0SW5wdXRMYXlvdXQoIGlkICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnNjcmlwdGFibGVOb2RlLmdldElucHV0TGF5b3V0KCBpZCApO1xyXG5cclxuXHR9XHJcblxyXG5cdGdldCggbmFtZSApIHtcclxuXHJcblx0XHRjb25zdCBwYXJhbSA9IHRoaXMucGFyYW1ldGVyc1sgbmFtZSBdO1xyXG5cdFx0Y29uc3QgdmFsdWUgPSBwYXJhbSA/IHBhcmFtLmdldFZhbHVlKCkgOiBudWxsO1xyXG5cclxuXHRcdHJldHVybiB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIERlZmluZXMgdGhlIHJlc291cmNlcyAoZS5nLiBuYW1lc3BhY2VzKSBvZiBzY3JpcHRhYmxlIG5vZGVzLlxyXG4gKlxyXG4gKiBAdHlwZSB7UmVzb3VyY2VzfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFNjcmlwdGFibGVOb2RlUmVzb3VyY2VzID0gbmV3IFJlc291cmNlcygpO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgdHlwZSBvZiBub2RlIGFsbG93cyB0byBpbXBsZW1lbnQgbm9kZXMgd2l0aCBjdXN0b20gc2NyaXB0cy4gVGhlIHNjcmlwdFxyXG4gKiBzZWN0aW9uIGlzIHJlcHJlc2VudGVkIGFzIGFuIGluc3RhbmNlIG9mIGBDb2RlTm9kZWAgd3JpdHRlbiB3aXRoIEphdmFTY3JpcHQuXHJcbiAqIFRoZSBzY3JpcHQgaXRzZWxmIG11c3QgYWRoZXJlIHRvIGEgc3BlY2lmaWMgc3RydWN0dXJlLlxyXG4gKlxyXG4gKiAtIG1haW4oKTogRXhlY3V0ZWQgb25jZSBieSBkZWZhdWx0IGFuZCBldmVyeSB0aW1lIGBub2RlLm5lZWRzVXBkYXRlYCBpcyBzZXQuXHJcbiAqIC0gbGF5b3V0OiBUaGUgbGF5b3V0IG9iamVjdCBkZWZpbmVzIHRoZSBzY3JpcHQncyBpbnRlcmZhY2UgKGlucHV0cyBhbmQgb3V0cHV0cykuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIFNjcmlwdGFibGVOb2RlUmVzb3VyY2VzLnNldCggJ1RTTCcsIFRTTCApO1xyXG4gKlxyXG4gKiBjb25zdCBzY3JpcHRhYmxlTm9kZSA9IHNjcmlwdGFibGUoIGpzKCBgXHJcbiAqIFx0bGF5b3V0ID0ge1xyXG4gKiBcdFx0b3V0cHV0VHlwZTogJ25vZGUnLFxyXG4gKiBcdFx0ZWxlbWVudHM6IFtcclxuICogXHRcdFx0eyBuYW1lOiAnc291cmNlJywgaW5wdXRUeXBlOiAnbm9kZScgfSxcclxuICogXHRcdF1cclxuICogXHR9O1xyXG4gKlxyXG4gKiBcdGNvbnN0IHsgbXVsLCBvc2NTaW5lIH0gPSBUU0w7XHJcbiAqXHJcbiAqIFx0ZnVuY3Rpb24gbWFpbigpIHtcclxuICogXHRcdGNvbnN0IHNvdXJjZSA9IHBhcmFtZXRlcnMuZ2V0KCAnc291cmNlJyApIHx8IGZsb2F0KCk7XHJcbiAqIFx0XHRyZXR1cm4gbXVsKCBzb3VyY2UsIG9zY1NpbmUoKSApICk7XHJcbiAqIFx0fVxyXG4gKlxyXG4gKiBgICkgKTtcclxuICpcclxuICogc2NyaXB0YWJsZU5vZGUuc2V0UGFyYW1ldGVyKCAnc291cmNlJywgY29sb3IoIDEsIDAsIDAgKSApO1xyXG4gKlxyXG4gKiBjb25zdCBtYXRlcmlhbCA9IG5ldyBUSFJFRS5NZXNoQmFzaWNOb2RlTWF0ZXJpYWwoKTtcclxuICogbWF0ZXJpYWwuY29sb3JOb2RlID0gc2NyaXB0YWJsZU5vZGU7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTm9kZVxyXG4gKi9cclxuY2xhc3MgU2NyaXB0YWJsZU5vZGUgZXh0ZW5kcyBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnU2NyaXB0YWJsZU5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc2NyaXB0YWJsZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHs/Q29kZU5vZGV9IFtjb2RlTm9kZT1udWxsXSAtIFRoZSBjb2RlIG5vZGUuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbWV0ZXJzPXt9XSAtIFRoZSBwYXJhbWV0ZXJzIGRlZmluaXRpb24uXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGNvZGVOb2RlID0gbnVsbCwgcGFyYW1ldGVycyA9IHt9ICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY29kZSBub2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Q29kZU5vZGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29kZU5vZGUgPSBjb2RlTm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBwYXJhbWV0ZXJzIGRlZmluaXRpb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqIEBkZWZhdWx0IHt9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7XHJcblxyXG5cdFx0dGhpcy5fbG9jYWwgPSBuZXcgUmVzb3VyY2VzKCk7XHJcblx0XHR0aGlzLl9vdXRwdXQgPSBzY3JpcHRhYmxlVmFsdWUoIG51bGwgKTtcclxuXHRcdHRoaXMuX291dHB1dHMgPSB7fTtcclxuXHRcdHRoaXMuX3NvdXJjZSA9IHRoaXMuc291cmNlO1xyXG5cdFx0dGhpcy5fbWV0aG9kID0gbnVsbDtcclxuXHRcdHRoaXMuX29iamVjdCA9IG51bGw7XHJcblx0XHR0aGlzLl92YWx1ZSA9IG51bGw7XHJcblx0XHR0aGlzLl9uZWVkc091dHB1dFVwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy5vblJlZnJlc2ggPSB0aGlzLm9uUmVmcmVzaC5iaW5kKCB0aGlzICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzU2NyaXB0YWJsZU5vZGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBzb3VyY2UgY29kZSBvZiB0aGUgc2NyaXB0YWJsZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge3N0cmluZ31cclxuXHQgKi9cclxuXHRnZXQgc291cmNlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmNvZGVOb2RlID8gdGhpcy5jb2RlTm9kZS5jb2RlIDogJyc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgcmVmZXJlbmNlIG9mIGEgbG9jYWwgc2NyaXB0IHZhcmlhYmxlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgdmFyaWFibGUgbmFtZS5cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gdmFsdWUgLSBUaGUgcmVmZXJlbmNlIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtSZXNvdXJjZXN9IFRoZSByZXNvdXJjZSBtYXBcclxuXHQgKi9cclxuXHRzZXRMb2NhbCggbmFtZSwgdmFsdWUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX2xvY2FsLnNldCggbmFtZSwgdmFsdWUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIGxvY2FsIHNjcmlwdCB2YXJpYWJsZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIHZhcmlhYmxlIG5hbWUuXHJcblx0ICogQHJldHVybiB7T2JqZWN0fSBUaGUgdmFsdWUuXHJcblx0ICovXHJcblx0Z2V0TG9jYWwoIG5hbWUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX2xvY2FsLmdldCggbmFtZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEV2ZW50IGxpc3RlbmVyIGZvciB0aGUgYHJlZnJlc2hgIGV2ZW50LlxyXG5cdCAqL1xyXG5cdG9uUmVmcmVzaCgpIHtcclxuXHJcblx0XHR0aGlzLl9yZWZyZXNoKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhbiBpbnB1dCBmcm9tIHRoZSBsYXlvdXQgd2l0aCB0aGUgZ2l2ZW4gaWQvbmFtZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIFRoZSBpZC9uYW1lIG9mIHRoZSBpbnB1dC5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBlbGVtZW50IGVudHJ5LlxyXG5cdCAqL1xyXG5cdGdldElucHV0TGF5b3V0KCBpZCApIHtcclxuXHJcblx0XHRmb3IgKCBjb25zdCBlbGVtZW50IG9mIHRoaXMuZ2V0TGF5b3V0KCkgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGVsZW1lbnQuaW5wdXRUeXBlICYmICggZWxlbWVudC5pZCA9PT0gaWQgfHwgZWxlbWVudC5uYW1lID09PSBpZCApICkge1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gZWxlbWVudDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhbiBvdXRwdXQgZnJvbSB0aGUgbGF5b3V0IHdpdGggdGhlIGdpdmVuIGlkL25hbWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBUaGUgaWQvbmFtZSBvZiB0aGUgb3V0cHV0LlxyXG5cdCAqIEByZXR1cm4ge09iamVjdH0gVGhlIGVsZW1lbnQgZW50cnkuXHJcblx0ICovXHJcblx0Z2V0T3V0cHV0TGF5b3V0KCBpZCApIHtcclxuXHJcblx0XHRmb3IgKCBjb25zdCBlbGVtZW50IG9mIHRoaXMuZ2V0TGF5b3V0KCkgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGVsZW1lbnQub3V0cHV0VHlwZSAmJiAoIGVsZW1lbnQuaWQgPT09IGlkIHx8IGVsZW1lbnQubmFtZSA9PT0gaWQgKSApIHtcclxuXHJcblx0XHRcdFx0cmV0dXJuIGVsZW1lbnQ7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgYSBzY3JpcHQgb3V0cHV0IGZvciB0aGUgZ2l2ZW4gbmFtZSBhbmQgdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBvdXRwdXQuXHJcblx0ICogQHBhcmFtIHtOb2RlfSB2YWx1ZSAtIFRoZSBub2RlIHZhbHVlLlxyXG5cdCAqIEByZXR1cm4ge1NjcmlwdGFibGVOb2RlfSBBIHJlZmVyZW5jZSB0byB0aGlzIG5vZGUuXHJcblx0ICovXHJcblx0c2V0T3V0cHV0KCBuYW1lLCB2YWx1ZSApIHtcclxuXHJcblx0XHRjb25zdCBvdXRwdXRzID0gdGhpcy5fb3V0cHV0cztcclxuXHJcblx0XHRpZiAoIG91dHB1dHNbIG5hbWUgXSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0b3V0cHV0c1sgbmFtZSBdID0gc2NyaXB0YWJsZVZhbHVlKCB2YWx1ZSApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRvdXRwdXRzWyBuYW1lIF0udmFsdWUgPSB2YWx1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIHNjcmlwdCBvdXRwdXQgZm9yIHRoZSBnaXZlbiBuYW1lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgb3V0cHV0LlxyXG5cdCAqIEByZXR1cm4ge1NjcmlwdGFibGVWYWx1ZU5vZGV9IFRoZSBub2RlIHZhbHVlLlxyXG5cdCAqL1xyXG5cdGdldE91dHB1dCggbmFtZSApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fb3V0cHV0c1sgbmFtZSBdO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBwYXJhbWV0ZXIgZm9yIHRoZSBnaXZlbiBuYW1lXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIuXHJcblx0ICogQHJldHVybiB7U2NyaXB0YWJsZVZhbHVlTm9kZX0gVGhlIG5vZGUgdmFsdWUuXHJcblx0ICovXHJcblx0Z2V0UGFyYW1ldGVyKCBuYW1lICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnBhcmFtZXRlcnNbIG5hbWUgXTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIGEgdmFsdWUgZm9yIHRoZSBnaXZlbiBwYXJhbWV0ZXIgbmFtZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIHBhcmFtZXRlciBuYW1lLlxyXG5cdCAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIFRoZSBwYXJhbWV0ZXIgdmFsdWUuXHJcblx0ICogQHJldHVybiB7U2NyaXB0YWJsZU5vZGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbm9kZS5cclxuXHQgKi9cclxuXHRzZXRQYXJhbWV0ZXIoIG5hbWUsIHZhbHVlICkge1xyXG5cclxuXHRcdGNvbnN0IHBhcmFtZXRlcnMgPSB0aGlzLnBhcmFtZXRlcnM7XHJcblxyXG5cdFx0aWYgKCB2YWx1ZSAmJiB2YWx1ZS5pc1NjcmlwdGFibGVOb2RlICkge1xyXG5cclxuXHRcdFx0dGhpcy5kZWxldGVQYXJhbWV0ZXIoIG5hbWUgKTtcclxuXHJcblx0XHRcdHBhcmFtZXRlcnNbIG5hbWUgXSA9IHZhbHVlO1xyXG5cdFx0XHRwYXJhbWV0ZXJzWyBuYW1lIF0uZ2V0RGVmYXVsdE91dHB1dCgpLmV2ZW50cy5hZGRFdmVudExpc3RlbmVyKCAncmVmcmVzaCcsIHRoaXMub25SZWZyZXNoICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggdmFsdWUgJiYgdmFsdWUuaXNTY3JpcHRhYmxlVmFsdWVOb2RlICkge1xyXG5cclxuXHRcdFx0dGhpcy5kZWxldGVQYXJhbWV0ZXIoIG5hbWUgKTtcclxuXHJcblx0XHRcdHBhcmFtZXRlcnNbIG5hbWUgXSA9IHZhbHVlO1xyXG5cdFx0XHRwYXJhbWV0ZXJzWyBuYW1lIF0uZXZlbnRzLmFkZEV2ZW50TGlzdGVuZXIoICdyZWZyZXNoJywgdGhpcy5vblJlZnJlc2ggKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBwYXJhbWV0ZXJzWyBuYW1lIF0gPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHBhcmFtZXRlcnNbIG5hbWUgXSA9IHNjcmlwdGFibGVWYWx1ZSggdmFsdWUgKTtcclxuXHRcdFx0cGFyYW1ldGVyc1sgbmFtZSBdLmV2ZW50cy5hZGRFdmVudExpc3RlbmVyKCAncmVmcmVzaCcsIHRoaXMub25SZWZyZXNoICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHBhcmFtZXRlcnNbIG5hbWUgXS52YWx1ZSA9IHZhbHVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGlzIG5vZGUgd2hpY2ggaXMgdGhlIHZhbHVlIG9mXHJcblx0ICogdGhlIGRlZmF1bHQgb3V0cHV0LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Tm9kZX0gVGhlIHZhbHVlLlxyXG5cdCAqL1xyXG5cdGdldFZhbHVlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmdldERlZmF1bHRPdXRwdXQoKS5nZXRWYWx1ZSgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlbGV0ZXMgYSBwYXJhbWV0ZXIgZnJvbSB0aGUgc2NyaXB0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgcGFyYW1ldGVyIHRvIHJlbW92ZS5cclxuXHQgKiBAcmV0dXJuIHtTY3JpcHRhYmxlTm9kZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBub2RlLlxyXG5cdCAqL1xyXG5cdGRlbGV0ZVBhcmFtZXRlciggbmFtZSApIHtcclxuXHJcblx0XHRsZXQgdmFsdWVOb2RlID0gdGhpcy5wYXJhbWV0ZXJzWyBuYW1lIF07XHJcblxyXG5cdFx0aWYgKCB2YWx1ZU5vZGUgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHZhbHVlTm9kZS5pc1NjcmlwdGFibGVOb2RlICkgdmFsdWVOb2RlID0gdmFsdWVOb2RlLmdldERlZmF1bHRPdXRwdXQoKTtcclxuXHJcblx0XHRcdHZhbHVlTm9kZS5ldmVudHMucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3JlZnJlc2gnLCB0aGlzLm9uUmVmcmVzaCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWxldGVzIGFsbCBwYXJhbWV0ZXJzIGZyb20gdGhlIHNjcmlwdC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1NjcmlwdGFibGVOb2RlfSBBIHJlZmVyZW5jZSB0byB0aGlzIG5vZGUuXHJcblx0ICovXHJcblx0Y2xlYXJQYXJhbWV0ZXJzKCkge1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoIHRoaXMucGFyYW1ldGVycyApICkge1xyXG5cclxuXHRcdFx0dGhpcy5kZWxldGVQYXJhbWV0ZXIoIG5hbWUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2FsbHMgYSBmdW5jdGlvbiBmcm9tIHRoZSBzY3JpcHQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBmdW5jdGlvbiBuYW1lLlxyXG5cdCAqIEBwYXJhbSB7Li4uYW55fSBwYXJhbXMgLSBBIGxpc3Qgb2YgcGFyYW1ldGVycy5cclxuXHQgKiBAcmV0dXJuIHthbnl9IFRoZSByZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwuXHJcblx0ICovXHJcblx0Y2FsbCggbmFtZSwgLi4ucGFyYW1zICkge1xyXG5cclxuXHRcdGNvbnN0IG9iamVjdCA9IHRoaXMuZ2V0T2JqZWN0KCk7XHJcblx0XHRjb25zdCBtZXRob2QgPSBvYmplY3RbIG5hbWUgXTtcclxuXHJcblx0XHRpZiAoIHR5cGVvZiBtZXRob2QgPT09ICdmdW5jdGlvbicgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gbWV0aG9kKCAuLi5wYXJhbXMgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQXN5bmNocm9ub3VzbHkgY2FsbHMgYSBmdW5jdGlvbiBmcm9tIHRoZSBzY3JpcHQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBmdW5jdGlvbiBuYW1lLlxyXG5cdCAqIEBwYXJhbSB7Li4uYW55fSBwYXJhbXMgLSBBIGxpc3Qgb2YgcGFyYW1ldGVycy5cclxuXHQgKiBAcmV0dXJuIHtQcm9taXNlPGFueT59IFRoZSByZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwuXHJcblx0ICovXHJcblx0YXN5bmMgY2FsbEFzeW5jKCBuYW1lLCAuLi5wYXJhbXMgKSB7XHJcblxyXG5cdFx0Y29uc3Qgb2JqZWN0ID0gdGhpcy5nZXRPYmplY3QoKTtcclxuXHRcdGNvbnN0IG1ldGhvZCA9IG9iamVjdFsgbmFtZSBdO1xyXG5cclxuXHRcdGlmICggdHlwZW9mIG1ldGhvZCA9PT0gJ2Z1bmN0aW9uJyApIHtcclxuXHJcblx0XHRcdHJldHVybiBtZXRob2QuY29uc3RydWN0b3IubmFtZSA9PT0gJ0FzeW5jRnVuY3Rpb24nID8gYXdhaXQgbWV0aG9kKCAuLi5wYXJhbXMgKSA6IG1ldGhvZCggLi4ucGFyYW1zICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE92ZXJ3cml0dGVuIHNpbmNlIHRoZSBub2RlIHR5cGVzIGlzIGluZmVycmVkIGZyb20gdGhlIHNjcmlwdCdzIG91dHB1dC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXJcclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBub2RlIHR5cGUuXHJcblx0ICovXHJcblx0Z2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZ2V0RGVmYXVsdE91dHB1dE5vZGUoKS5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlZnJlc2hlcyB0aGUgc2NyaXB0IG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gez9zdHJpbmd9IFtvdXRwdXQ9bnVsbF0gLSBBbiBvcHRpb25hbCBvdXRwdXQuXHJcblx0ICovXHJcblx0cmVmcmVzaCggb3V0cHV0ID0gbnVsbCApIHtcclxuXHJcblx0XHRpZiAoIG91dHB1dCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuZ2V0T3V0cHV0KCBvdXRwdXQgKS5yZWZyZXNoKCk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHRoaXMuX3JlZnJlc2goKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhbiBvYmplY3QgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNjcmlwdC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge09iamVjdH0gVGhlIHJlc3VsdCBvYmplY3QuXHJcblx0ICovXHJcblx0Z2V0T2JqZWN0KCkge1xyXG5cclxuXHRcdGlmICggdGhpcy5uZWVkc1VwZGF0ZSApIHRoaXMuZGlzcG9zZSgpO1xyXG5cdFx0aWYgKCB0aGlzLl9vYmplY3QgIT09IG51bGwgKSByZXR1cm4gdGhpcy5fb2JqZWN0O1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0Y29uc3QgcmVmcmVzaCA9ICgpID0+IHRoaXMucmVmcmVzaCgpO1xyXG5cdFx0Y29uc3Qgc2V0T3V0cHV0ID0gKCBpZCwgdmFsdWUgKSA9PiB0aGlzLnNldE91dHB1dCggaWQsIHZhbHVlICk7XHJcblxyXG5cdFx0Y29uc3QgcGFyYW1ldGVycyA9IG5ldyBQYXJhbWV0ZXJzKCB0aGlzICk7XHJcblxyXG5cdFx0Y29uc3QgVEhSRUUgPSBTY3JpcHRhYmxlTm9kZVJlc291cmNlcy5nZXQoICdUSFJFRScgKTtcclxuXHRcdGNvbnN0IFRTTCA9IFNjcmlwdGFibGVOb2RlUmVzb3VyY2VzLmdldCggJ1RTTCcgKTtcclxuXHJcblx0XHRjb25zdCBtZXRob2QgPSB0aGlzLmdldE1ldGhvZCgpO1xyXG5cdFx0Y29uc3QgcGFyYW1zID0gWyBwYXJhbWV0ZXJzLCB0aGlzLl9sb2NhbCwgU2NyaXB0YWJsZU5vZGVSZXNvdXJjZXMsIHJlZnJlc2gsIHNldE91dHB1dCwgVEhSRUUsIFRTTCBdO1xyXG5cclxuXHRcdHRoaXMuX29iamVjdCA9IG1ldGhvZCggLi4ucGFyYW1zICk7XHJcblxyXG5cdFx0Y29uc3QgbGF5b3V0ID0gdGhpcy5fb2JqZWN0LmxheW91dDtcclxuXHJcblx0XHRpZiAoIGxheW91dCApIHtcclxuXHJcblx0XHRcdGlmICggbGF5b3V0LmNhY2hlID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5fbG9jYWwuY2xlYXIoKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIGRlZmF1bHQgb3V0cHV0XHJcblx0XHRcdHRoaXMuX291dHB1dC5vdXRwdXRUeXBlID0gbGF5b3V0Lm91dHB1dFR5cGUgfHwgbnVsbDtcclxuXHJcblx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggbGF5b3V0LmVsZW1lbnRzICkgKSB7XHJcblxyXG5cdFx0XHRcdGZvciAoIGNvbnN0IGVsZW1lbnQgb2YgbGF5b3V0LmVsZW1lbnRzICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGlkID0gZWxlbWVudC5pZCB8fCBlbGVtZW50Lm5hbWU7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBlbGVtZW50LmlucHV0VHlwZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggdGhpcy5nZXRQYXJhbWV0ZXIoIGlkICkgPT09IHVuZGVmaW5lZCApIHRoaXMuc2V0UGFyYW1ldGVyKCBpZCwgbnVsbCApO1xyXG5cclxuXHRcdFx0XHRcdFx0dGhpcy5nZXRQYXJhbWV0ZXIoIGlkICkuaW5wdXRUeXBlID0gZWxlbWVudC5pbnB1dFR5cGU7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGlmICggZWxlbWVudC5vdXRwdXRUeXBlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCB0aGlzLmdldE91dHB1dCggaWQgKSA9PT0gdW5kZWZpbmVkICkgdGhpcy5zZXRPdXRwdXQoIGlkLCBudWxsICk7XHJcblxyXG5cdFx0XHRcdFx0XHR0aGlzLmdldE91dHB1dCggaWQgKS5vdXRwdXRUeXBlID0gZWxlbWVudC5vdXRwdXRUeXBlO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fb2JqZWN0O1xyXG5cclxuXHR9XHJcblxyXG5cdGRlc2VyaWFsaXplKCBkYXRhICkge1xyXG5cclxuXHRcdHN1cGVyLmRlc2VyaWFsaXplKCBkYXRhICk7XHJcblxyXG5cdFx0Zm9yICggY29uc3QgbmFtZSBpbiB0aGlzLnBhcmFtZXRlcnMgKSB7XHJcblxyXG5cdFx0XHRsZXQgdmFsdWVOb2RlID0gdGhpcy5wYXJhbWV0ZXJzWyBuYW1lIF07XHJcblxyXG5cdFx0XHRpZiAoIHZhbHVlTm9kZS5pc1NjcmlwdGFibGVOb2RlICkgdmFsdWVOb2RlID0gdmFsdWVOb2RlLmdldERlZmF1bHRPdXRwdXQoKTtcclxuXHJcblx0XHRcdHZhbHVlTm9kZS5ldmVudHMuYWRkRXZlbnRMaXN0ZW5lciggJ3JlZnJlc2gnLCB0aGlzLm9uUmVmcmVzaCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBsYXlvdXQgb2YgdGhlIHNjcmlwdC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge09iamVjdH0gVGhlIHNjcmlwdCdzIGxheW91dC5cclxuXHQgKi9cclxuXHRnZXRMYXlvdXQoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZ2V0T2JqZWN0KCkubGF5b3V0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgZGVmYXVsdCBub2RlIG91dHB1dCBvZiB0aGUgc2NyaXB0LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Tm9kZX0gVGhlIGRlZmF1bHQgbm9kZSBvdXRwdXQuXHJcblx0ICovXHJcblx0Z2V0RGVmYXVsdE91dHB1dE5vZGUoKSB7XHJcblxyXG5cdFx0Y29uc3Qgb3V0cHV0ID0gdGhpcy5nZXREZWZhdWx0T3V0cHV0KCkudmFsdWU7XHJcblxyXG5cdFx0aWYgKCBvdXRwdXQgJiYgb3V0cHV0LmlzTm9kZSApIHtcclxuXHJcblx0XHRcdHJldHVybiBvdXRwdXQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBmbG9hdCgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgZGVmYXVsdCBvdXRwdXQgb2YgdGhlIHNjcmlwdC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1NjcmlwdGFibGVWYWx1ZU5vZGV9IFRoZSBkZWZhdWx0IG91dHB1dC5cclxuXHQgKi9cclxuXHRnZXREZWZhdWx0T3V0cHV0KClcdHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fZXhlYygpLl9vdXRwdXQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIGZ1bmN0aW9uIGNyZWF0ZWQgZnJvbSB0aGUgbm9kZSdzIHNjcmlwdC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgZnVuY3Rpb24gcmVwcmVzZW50aW5nIHRoZSBub2RlJ3MgY29kZS5cclxuXHQgKi9cclxuXHRnZXRNZXRob2QoKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5lZWRzVXBkYXRlICkgdGhpcy5kaXNwb3NlKCk7XHJcblx0XHRpZiAoIHRoaXMuX21ldGhvZCAhPT0gbnVsbCApIHJldHVybiB0aGlzLl9tZXRob2Q7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCBwYXJhbWV0ZXJzUHJvcHMgPSBbICdwYXJhbWV0ZXJzJywgJ2xvY2FsJywgJ2dsb2JhbCcsICdyZWZyZXNoJywgJ3NldE91dHB1dCcsICdUSFJFRScsICdUU0wnIF07XHJcblx0XHRjb25zdCBpbnRlcmZhY2VQcm9wcyA9IFsgJ2xheW91dCcsICdpbml0JywgJ21haW4nLCAnZGlzcG9zZScgXTtcclxuXHJcblx0XHRjb25zdCBwcm9wZXJ0aWVzID0gaW50ZXJmYWNlUHJvcHMuam9pbiggJywgJyApO1xyXG5cdFx0Y29uc3QgZGVjbGFyYXRpb25zID0gJ3ZhciAnICsgcHJvcGVydGllcyArICc7IHZhciBvdXRwdXQgPSB7fTtcXG4nO1xyXG5cdFx0Y29uc3QgcmV0dXJucyA9ICdcXG5yZXR1cm4geyAuLi5vdXRwdXQsICcgKyBwcm9wZXJ0aWVzICsgJyB9Oyc7XHJcblxyXG5cdFx0Y29uc3QgY29kZSA9IGRlY2xhcmF0aW9ucyArIHRoaXMuY29kZU5vZGUuY29kZSArIHJldHVybnM7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHR0aGlzLl9tZXRob2QgPSBuZXcgRnVuY3Rpb24oIC4uLnBhcmFtZXRlcnNQcm9wcywgY29kZSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9tZXRob2Q7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRnJlZXMgYWxsIGludGVybmFsIHJlc291cmNlcy5cclxuXHQgKi9cclxuXHRkaXNwb3NlKCkge1xyXG5cclxuXHRcdGlmICggdGhpcy5fbWV0aG9kID09PSBudWxsICkgcmV0dXJuO1xyXG5cclxuXHRcdGlmICggdGhpcy5fb2JqZWN0ICYmIHR5cGVvZiB0aGlzLl9vYmplY3QuZGlzcG9zZSA9PT0gJ2Z1bmN0aW9uJyApIHtcclxuXHJcblx0XHRcdHRoaXMuX29iamVjdC5kaXNwb3NlKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuX21ldGhvZCA9IG51bGw7XHJcblx0XHR0aGlzLl9vYmplY3QgPSBudWxsO1xyXG5cdFx0dGhpcy5fc291cmNlID0gbnVsbDtcclxuXHRcdHRoaXMuX3ZhbHVlID0gbnVsbDtcclxuXHRcdHRoaXMuX25lZWRzT3V0cHV0VXBkYXRlID0gdHJ1ZTtcclxuXHRcdHRoaXMuX291dHB1dC52YWx1ZSA9IG51bGw7XHJcblx0XHR0aGlzLl9vdXRwdXRzID0ge307XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXAoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZ2V0RGVmYXVsdE91dHB1dE5vZGUoKTtcclxuXHJcblx0fVxyXG5cclxuXHRnZXRDYWNoZUtleSggZm9yY2UgKSB7XHJcblxyXG5cdFx0Y29uc3QgdmFsdWVzID0gWyBoYXNoU3RyaW5nKCB0aGlzLnNvdXJjZSApLCB0aGlzLmdldERlZmF1bHRPdXRwdXROb2RlKCkuZ2V0Q2FjaGVLZXkoIGZvcmNlICkgXTtcclxuXHJcblx0XHRmb3IgKCBjb25zdCBwYXJhbSBpbiB0aGlzLnBhcmFtZXRlcnMgKSB7XHJcblxyXG5cdFx0XHR2YWx1ZXMucHVzaCggdGhpcy5wYXJhbWV0ZXJzWyBwYXJhbSBdLmdldENhY2hlS2V5KCBmb3JjZSApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBoYXNoQXJyYXkoIHZhbHVlcyApO1xyXG5cclxuXHR9XHJcblxyXG5cdHNldCBuZWVkc1VwZGF0ZSggdmFsdWUgKSB7XHJcblxyXG5cdFx0aWYgKCB2YWx1ZSA9PT0gdHJ1ZSApIHRoaXMuZGlzcG9zZSgpO1xyXG5cclxuXHR9XHJcblxyXG5cdGdldCBuZWVkc1VwZGF0ZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5zb3VyY2UgIT09IHRoaXMuX3NvdXJjZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFeGVjdXRlcyB0aGUgYG1haW5gIGZ1bmN0aW9uIG9mIHRoZSBzY3JpcHQuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEByZXR1cm4ge1NjcmlwdGFibGVOb2RlfSBBIHJlZmVyZW5jZSB0byB0aGlzIG5vZGUuXHJcblx0ICovXHJcblx0X2V4ZWMoKVx0e1xyXG5cclxuXHRcdGlmICggdGhpcy5jb2RlTm9kZSA9PT0gbnVsbCApIHJldHVybiB0aGlzO1xyXG5cclxuXHRcdGlmICggdGhpcy5fbmVlZHNPdXRwdXRVcGRhdGUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHR0aGlzLl92YWx1ZSA9IHRoaXMuY2FsbCggJ21haW4nICk7XHJcblxyXG5cdFx0XHR0aGlzLl9uZWVkc091dHB1dFVwZGF0ZSA9IGZhbHNlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLl9vdXRwdXQudmFsdWUgPSB0aGlzLl92YWx1ZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFeGVjdXRlcyB0aGUgcmVmcmVzaC5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICovXHJcblx0X3JlZnJlc2goKSB7XHJcblxyXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy5fZXhlYygpO1xyXG5cclxuXHRcdHRoaXMuX291dHB1dC5yZWZyZXNoKCk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFNjcmlwdGFibGVOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSBzY3JpcHRhYmxlIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Q29kZU5vZGV9IFtjb2RlTm9kZV0gLSBUaGUgY29kZSBub2RlLlxyXG4gKiBAcGFyYW0gez9PYmplY3R9IFtwYXJhbWV0ZXJzPXt9XSAtIFRoZSBwYXJhbWV0ZXJzIGRlZmluaXRpb24uXHJcbiAqIEByZXR1cm5zIHtTY3JpcHRhYmxlTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBzY3JpcHRhYmxlID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIFNjcmlwdGFibGVOb2RlICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAxLCAyICk7XHJcbiIsImltcG9ydCB7IHBvc2l0aW9uVmlldyB9IGZyb20gJy4uL2FjY2Vzc29ycy9Qb3NpdGlvbi5qcyc7XHJcbmltcG9ydCB7IHNtb290aHN0ZXAgfSBmcm9tICcuLi9tYXRoL01hdGhOb2RlLmpzJztcclxuaW1wb3J0IHsgRm4sIG91dHB1dCwgdmVjNCB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgbm9kZSB0aGF0IHJlcHJlc2VudHMgdGhlIGB6YCBjb29yZGluYXRlIGluIHZpZXcgc3BhY2VcclxuICogZm9yIHRoZSBjdXJyZW50IGZyYWdtZW50LiBJdCdzIGEgZGlmZmVyZW50IHJlcHJlc2VudGF0aW9uIG9mIHRoZVxyXG4gKiBkZWZhdWx0IGRlcHRoIHZhbHVlLlxyXG4gKlxyXG4gKiBUaGlzIHZhbHVlIGNhbiBiZSBwYXJ0IG9mIGEgY29tcHV0YXRpb24gdGhhdCBkZWZpbmVzIGhvdyB0aGUgZm9nXHJcbiAqIGRlbnNpdHkgaW5jcmVhc2VzIHdoZW4gbW92aW5nIGF3YXkgZnJvbSB0aGUgY2FtZXJhLlxyXG4gKlxyXG4gKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG4gKiBAcmV0dXJuIHtOb2RlfSBUaGUgdmlld1ogbm9kZS5cclxuICovXHJcbmZ1bmN0aW9uIGdldFZpZXdaTm9kZSggYnVpbGRlciApIHtcclxuXHJcblx0bGV0IHZpZXdaO1xyXG5cclxuXHRjb25zdCBnZXRWaWV3WiA9IGJ1aWxkZXIuY29udGV4dC5nZXRWaWV3WjtcclxuXHJcblx0aWYgKCBnZXRWaWV3WiAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdHZpZXdaID0gZ2V0Vmlld1ooIHRoaXMgKTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gKCB2aWV3WiB8fCBwb3NpdGlvblZpZXcueiApLm5lZ2F0ZSgpO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIENvbnN0cnVjdHMgYSBuZXcgcmFuZ2UgZmFjdG9yIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZX0gbmVhciAtIERlZmluZXMgdGhlIG5lYXIgdmFsdWUuXHJcbiAqIEBwYXJhbSB7Tm9kZX0gZmFyIC0gRGVmaW5lcyB0aGUgZmFyIHZhbHVlLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHJhbmdlRm9nRmFjdG9yID0gRm4oICggWyBuZWFyLCBmYXIgXSwgYnVpbGRlciApID0+IHtcclxuXHJcblx0Y29uc3Qgdmlld1ogPSBnZXRWaWV3Wk5vZGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0cmV0dXJuIHNtb290aHN0ZXAoIG5lYXIsIGZhciwgdmlld1ogKTtcclxuXHJcbn0gKTtcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIGFuIGV4cG9uZW50aWFsIHNxdWFyZWQgZm9nLiBUaGlzIHR5cGUgb2YgZm9nIGdpdmVzXHJcbiAqIGEgY2xlYXIgdmlldyBuZWFyIHRoZSBjYW1lcmEgYW5kIGEgZmFzdGVyIHRoYW4gZXhwb25lbnRpYWxseVxyXG4gKiBkZW5zZW5pbmcgZm9nIGZhcnRoZXIgZnJvbSB0aGUgY2FtZXJhLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IGRlbnNpdHkgLSBEZWZpbmVzIHRoZSBmb2cgZGVuc2l0eS5cclxuICovXHJcbmV4cG9ydCBjb25zdCBkZW5zaXR5Rm9nRmFjdG9yID0gRm4oICggWyBkZW5zaXR5IF0sIGJ1aWxkZXIgKSA9PiB7XHJcblxyXG5cdGNvbnN0IHZpZXdaID0gZ2V0Vmlld1pOb2RlKCBidWlsZGVyICk7XHJcblxyXG5cdHJldHVybiBkZW5zaXR5Lm11bCggZGVuc2l0eSwgdmlld1osIHZpZXdaICkubmVnYXRlKCkuZXhwKCkub25lTWludXMoKTtcclxuXHJcbn0gKTtcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIHRvIGNvbmZpZ3VyZSBhIGZvZyBmb3IgdGhlIHNjZW5lLlxyXG4gKiBOb2RlcyBvZiB0aGlzIHR5cGUgYXJlIGFzc2lnbmVkIHRvIGBTY2VuZS5mb2dOb2RlYC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlfSBjb2xvciAtIERlZmluZXMgdGhlIGNvbG9yIG9mIHRoZSBmb2cuXHJcbiAqIEBwYXJhbSB7Tm9kZX0gZmFjdG9yIC0gRGVmaW5lcyBob3cgdGhlIGZvZyBpcyBmYWN0b3JlZCBpbiB0aGUgc2NlbmUuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZm9nID0gRm4oICggWyBjb2xvciwgZmFjdG9yIF0gKSA9PiB7XHJcblxyXG5cdHJldHVybiB2ZWM0KCBmYWN0b3IudG9GbG9hdCgpLm1peCggb3V0cHV0LnJnYiwgY29sb3IudG9WZWMzKCkgKSwgb3V0cHV0LmEgKTtcclxuXHJcbn0gKTtcclxuXHJcbi8vIERlcHJlY2F0ZWRcclxuXHJcbi8qKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAZGVwcmVjYXRlZCBzaW5jZSByMTcxLiBVc2UgYGZvZyggY29sb3IsIHJhbmdlRm9nRmFjdG9yKCBuZWFyLCBmYXIgKSApYCBpbnN0ZWFkLlxyXG4gKlxyXG4gKiBAcGFyYW0ge05vZGV9IGNvbG9yXHJcbiAqIEBwYXJhbSB7Tm9kZX0gbmVhclxyXG4gKiBAcGFyYW0ge05vZGV9IGZhclxyXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcmFuZ2VGb2coIGNvbG9yLCBuZWFyLCBmYXIgKSB7IC8vIEBkZXByZWNhdGVkLCByMTcxXHJcblxyXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlRTTDogXCJyYW5nZUZvZyggY29sb3IsIG5lYXIsIGZhciApXCIgaXMgZGVwcmVjYXRlZC4gVXNlIFwiZm9nKCBjb2xvciwgcmFuZ2VGb2dGYWN0b3IoIG5lYXIsIGZhciApIClcIiBpbnN0ZWFkLicgKTtcclxuXHRyZXR1cm4gZm9nKCBjb2xvciwgcmFuZ2VGb2dGYWN0b3IoIG5lYXIsIGZhciApICk7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQGRlcHJlY2F0ZWQgc2luY2UgcjE3MS4gVXNlIGBmb2coIGNvbG9yLCBkZW5zaXR5Rm9nRmFjdG9yKCBkZW5zaXR5ICkgKWAgaW5zdGVhZC5cclxuICpcclxuICogQHBhcmFtIHtOb2RlfSBjb2xvclxyXG4gKiBAcGFyYW0ge05vZGV9IGRlbnNpdHlcclxuICogQHJldHVybnMge0Z1bmN0aW9ufVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGRlbnNpdHlGb2coIGNvbG9yLCBkZW5zaXR5ICkgeyAvLyBAZGVwcmVjYXRlZCwgcjE3MVxyXG5cclxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5UU0w6IFwiZGVuc2l0eUZvZyggY29sb3IsIGRlbnNpdHkgKVwiIGlzIGRlcHJlY2F0ZWQuIFVzZSBcImZvZyggY29sb3IsIGRlbnNpdHlGb2dGYWN0b3IoIGRlbnNpdHkgKSApXCIgaW5zdGVhZC4nICk7XHJcblx0cmV0dXJuIGZvZyggY29sb3IsIGRlbnNpdHlGb2dGYWN0b3IoIGRlbnNpdHkgKSApO1xyXG5cclxufVxyXG4iLCJpbXBvcnQgTm9kZSBmcm9tICcuLi9jb3JlL05vZGUuanMnO1xyXG5pbXBvcnQgeyBnZXRWYWx1ZVR5cGUgfSBmcm9tICcuLi9jb3JlL05vZGVVdGlscy5qcyc7XHJcbmltcG9ydCB7IGJ1ZmZlciB9IGZyb20gJy4uL2FjY2Vzc29ycy9CdWZmZXJOb2RlLmpzJztcclxuaW1wb3J0IHsgaW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vYWNjZXNzb3JzL0J1ZmZlckF0dHJpYnV0ZU5vZGUuanMnO1xyXG5pbXBvcnQgeyBpbnN0YW5jZUluZGV4IH0gZnJvbSAnLi4vY29yZS9JbmRleE5vZGUuanMnO1xyXG5pbXBvcnQgeyBub2RlUHJveHksIGZsb2F0IH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5cclxuaW1wb3J0IHsgVmVjdG9yNCB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yNC5qcyc7XHJcbmltcG9ydCB7IE1hdGhVdGlscyB9IGZyb20gJy4uLy4uL21hdGgvTWF0aFV0aWxzLmpzJztcclxuaW1wb3J0IHsgSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vLi4vY29yZS9JbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5cclxubGV0IG1pbiA9IG51bGw7XHJcbmxldCBtYXggPSBudWxsO1xyXG5cclxuLyoqXHJcbiAqIGBSYW5nZU5vZGVgIGdlbmVyYXRlcyByYW5kb20gaW5zdGFuY2VkIGF0dHJpYnV0ZSBkYXRhIGluIGEgZGVmaW5lZCByYW5nZS5cclxuICogQW4gZXhlbXBsYXJ5IHVzZSBjYXNlIGZvciB0aGlzIHV0aWxpdHkgbm9kZSBpcyB0byBnZW5lcmF0ZSByYW5kb20gcGVyLWluc3RhbmNlXHJcbiAqIGNvbG9yczpcclxuICogYGBganNcclxuICogY29uc3QgbWF0ZXJpYWwgPSBuZXcgTWVzaEJhc2ljTm9kZU1hdGVyaWFsKCk7XHJcbiAqIG1hdGVyaWFsLmNvbG9yTm9kZSA9IHJhbmdlKCBuZXcgQ29sb3IoIDB4MDAwMDAwICksIG5ldyBDb2xvciggMHhGRkZGRkYgKSApO1xyXG4gKiBjb25zdCBtZXNoID0gbmV3IEluc3RhbmNlZE1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCwgY291bnQgKTtcclxuICogYGBgXHJcbiAqIEBhdWdtZW50cyBOb2RlXHJcbiAqL1xyXG5jbGFzcyBSYW5nZU5vZGUgZXh0ZW5kcyBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnUmFuZ2VOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHJhbmdlIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGU8YW55Pn0gW21pbk5vZGU9ZmxvYXQoKV0gLSBBIG5vZGUgZGVmaW5pbmcgdGhlIGxvd2VyIGJvdW5kIG9mIHRoZSByYW5nZS5cclxuXHQgKiBAcGFyYW0ge05vZGU8YW55Pn0gW21heE5vZGU9ZmxvYXQoKV0gLSBBIG5vZGUgZGVmaW5pbmcgdGhlIHVwcGVyIGJvdW5kIG9mIHRoZSByYW5nZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbWluTm9kZSA9IGZsb2F0KCksIG1heE5vZGUgPSBmbG9hdCgpICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiAgQSBub2RlIGRlZmluaW5nIHRoZSBsb3dlciBib3VuZCBvZiB0aGUgcmFuZ2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGU8YW55Pn1cclxuXHRcdCAqIEBkZWZhdWx0IGZsb2F0KClcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5taW5Ob2RlID0gbWluTm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqICBBIG5vZGUgZGVmaW5pbmcgdGhlIHVwcGVyIGJvdW5kIG9mIHRoZSByYW5nZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZTxhbnk+fVxyXG5cdFx0ICogQGRlZmF1bHQgZmxvYXQoKVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1heE5vZGUgPSBtYXhOb2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHZlY3RvciBsZW5ndGggd2hpY2ggaXMgY29tcHV0ZWQgYmFzZWQgb24gdGhlIHJhbmdlIGRlZmluaXRpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIHZlY3RvciBsZW5ndGguXHJcblx0ICovXHJcblx0Z2V0VmVjdG9yTGVuZ3RoKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IG1pbkxlbmd0aCA9IGJ1aWxkZXIuZ2V0VHlwZUxlbmd0aCggZ2V0VmFsdWVUeXBlKCB0aGlzLm1pbk5vZGUudmFsdWUgKSApO1xyXG5cdFx0Y29uc3QgbWF4TGVuZ3RoID0gYnVpbGRlci5nZXRUeXBlTGVuZ3RoKCBnZXRWYWx1ZVR5cGUoIHRoaXMubWF4Tm9kZS52YWx1ZSApICk7XHJcblxyXG5cdFx0cmV0dXJuIG1pbkxlbmd0aCA+IG1heExlbmd0aCA/IG1pbkxlbmd0aCA6IG1heExlbmd0aDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyBvdmVyd3JpdHRlbiBzaW5jZSB0aGUgbm9kZSB0eXBlIGlzIGluZmVycmVkIGZyb20gcmFuZ2UgZGVmaW5pdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgbm9kZSB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldE5vZGVUeXBlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdHJldHVybiBidWlsZGVyLm9iamVjdC5jb3VudCA+IDEgPyBidWlsZGVyLmdldFR5cGVGcm9tTGVuZ3RoKCB0aGlzLmdldFZlY3Rvckxlbmd0aCggYnVpbGRlciApICkgOiAnZmxvYXQnO1xyXG5cclxuXHR9XHJcblxyXG5cdHNldHVwKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IG9iamVjdCA9IGJ1aWxkZXIub2JqZWN0O1xyXG5cclxuXHRcdGxldCBvdXRwdXQgPSBudWxsO1xyXG5cclxuXHRcdGlmICggb2JqZWN0LmNvdW50ID4gMSApIHtcclxuXHJcblx0XHRcdGNvbnN0IG1pblZhbHVlID0gdGhpcy5taW5Ob2RlLnZhbHVlO1xyXG5cdFx0XHRjb25zdCBtYXhWYWx1ZSA9IHRoaXMubWF4Tm9kZS52YWx1ZTtcclxuXHJcblx0XHRcdGNvbnN0IG1pbkxlbmd0aCA9IGJ1aWxkZXIuZ2V0VHlwZUxlbmd0aCggZ2V0VmFsdWVUeXBlKCBtaW5WYWx1ZSApICk7XHJcblx0XHRcdGNvbnN0IG1heExlbmd0aCA9IGJ1aWxkZXIuZ2V0VHlwZUxlbmd0aCggZ2V0VmFsdWVUeXBlKCBtYXhWYWx1ZSApICk7XHJcblxyXG5cdFx0XHRtaW4gPSBtaW4gfHwgbmV3IFZlY3RvcjQoKTtcclxuXHRcdFx0bWF4ID0gbWF4IHx8IG5ldyBWZWN0b3I0KCk7XHJcblxyXG5cdFx0XHRtaW4uc2V0U2NhbGFyKCAwICk7XHJcblx0XHRcdG1heC5zZXRTY2FsYXIoIDAgKTtcclxuXHJcblx0XHRcdGlmICggbWluTGVuZ3RoID09PSAxICkgbWluLnNldFNjYWxhciggbWluVmFsdWUgKTtcclxuXHRcdFx0ZWxzZSBpZiAoIG1pblZhbHVlLmlzQ29sb3IgKSBtaW4uc2V0KCBtaW5WYWx1ZS5yLCBtaW5WYWx1ZS5nLCBtaW5WYWx1ZS5iLCAxICk7XHJcblx0XHRcdGVsc2UgbWluLnNldCggbWluVmFsdWUueCwgbWluVmFsdWUueSwgbWluVmFsdWUueiB8fCAwLCBtaW5WYWx1ZS53IHx8IDAgKTtcclxuXHJcblx0XHRcdGlmICggbWF4TGVuZ3RoID09PSAxICkgbWF4LnNldFNjYWxhciggbWF4VmFsdWUgKTtcclxuXHRcdFx0ZWxzZSBpZiAoIG1heFZhbHVlLmlzQ29sb3IgKSBtYXguc2V0KCBtYXhWYWx1ZS5yLCBtYXhWYWx1ZS5nLCBtYXhWYWx1ZS5iLCAxICk7XHJcblx0XHRcdGVsc2UgbWF4LnNldCggbWF4VmFsdWUueCwgbWF4VmFsdWUueSwgbWF4VmFsdWUueiB8fCAwLCBtYXhWYWx1ZS53IHx8IDAgKTtcclxuXHJcblx0XHRcdGNvbnN0IHN0cmlkZSA9IDQ7XHJcblxyXG5cdFx0XHRjb25zdCBsZW5ndGggPSBzdHJpZGUgKiBvYmplY3QuY291bnQ7XHJcblx0XHRcdGNvbnN0IGFycmF5ID0gbmV3IEZsb2F0MzJBcnJheSggbGVuZ3RoICk7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGluZGV4ID0gaSAlIHN0cmlkZTtcclxuXHJcblx0XHRcdFx0Y29uc3QgbWluRWxlbWVudFZhbHVlID0gbWluLmdldENvbXBvbmVudCggaW5kZXggKTtcclxuXHRcdFx0XHRjb25zdCBtYXhFbGVtZW50VmFsdWUgPSBtYXguZ2V0Q29tcG9uZW50KCBpbmRleCApO1xyXG5cclxuXHRcdFx0XHRhcnJheVsgaSBdID0gTWF0aFV0aWxzLmxlcnAoIG1pbkVsZW1lbnRWYWx1ZSwgbWF4RWxlbWVudFZhbHVlLCBNYXRoLnJhbmRvbSgpICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBub2RlVHlwZSA9IHRoaXMuZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRcdGlmICggb2JqZWN0LmNvdW50IDw9IDQwOTYgKSB7XHJcblxyXG5cdFx0XHRcdG91dHB1dCA9IGJ1ZmZlciggYXJyYXksICd2ZWM0Jywgb2JqZWN0LmNvdW50ICkuZWxlbWVudCggaW5zdGFuY2VJbmRleCApLmNvbnZlcnQoIG5vZGVUeXBlICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHQvLyBUT0RPOiBJbXByb3ZlIGFub255bW91cyBidWZmZXIgYXR0cmlidXRlIGNyZWF0aW9uIHJlbW92aW5nIHRoaXMgcGFydFxyXG5cdFx0XHRcdGNvbnN0IGJ1ZmZlckF0dHJpYnV0ZSA9IG5ldyBJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCA0ICk7XHJcblx0XHRcdFx0YnVpbGRlci5nZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdfX3JhbmdlJyArIHRoaXMuaWQsIGJ1ZmZlckF0dHJpYnV0ZSApO1xyXG5cclxuXHRcdFx0XHRvdXRwdXQgPSBpbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUoIGJ1ZmZlckF0dHJpYnV0ZSApLmNvbnZlcnQoIG5vZGVUeXBlICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdG91dHB1dCA9IGZsb2F0KCAwICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBvdXRwdXQ7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFJhbmdlTm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgcmFuZ2Ugbm9kZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlPGFueT59IFttaW5Ob2RlPWZsb2F0KCldIC0gQSBub2RlIGRlZmluaW5nIHRoZSBsb3dlciBib3VuZCBvZiB0aGUgcmFuZ2UuXHJcbiAqIEBwYXJhbSB7Tm9kZTxhbnk+fSBbbWF4Tm9kZT1mbG9hdCgpXSAtIEEgbm9kZSBkZWZpbmluZyB0aGUgdXBwZXIgYm91bmQgb2YgdGhlIHJhbmdlLlxyXG4gKiBAcmV0dXJucyB7UmFuZ2VOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHJhbmdlID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIFJhbmdlTm9kZSApLnNldFBhcmFtZXRlckxlbmd0aCggMiApO1xyXG4iLCJpbXBvcnQgTm9kZSBmcm9tICcuLi9jb3JlL05vZGUuanMnO1xyXG5pbXBvcnQgeyBub2RlT2JqZWN0IH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5cclxuLyoqXHJcbiAqIGBDb21wdXRlQnVpbHRpbk5vZGVgIHJlcHJlc2VudHMgYSBjb21wdXRlLXNjb3BlIGJ1aWx0aW4gdmFsdWUgdGhhdCBleHBvc2UgaW5mb3JtYXRpb25cclxuICogYWJvdXQgdGhlIGN1cnJlbnRseSBydW5uaW5nIGRpc3BhdGNoIGFuZC9vciB0aGUgZGV2aWNlIGl0IGlzIHJ1bm5pbmcgb24uXHJcbiAqXHJcbiAqIFRoaXMgbm9kZSBjYW4gb25seSBiZSB1c2VkIHdpdGggYSBXZWJHUFUgYmFja2VuZC5cclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVcclxuICovXHJcbmNsYXNzIENvbXB1dGVCdWlsdGluTm9kZSBleHRlbmRzIE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdDb21wdXRlQnVpbHRpbk5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgY29tcHV0ZSBidWlsdGluIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gYnVpbHRpbk5hbWUgLSBUaGUgYnVpbHQtaW4gbmFtZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbm9kZVR5cGUgLSBUaGUgbm9kZSB0eXBlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBidWlsdGluTmFtZSwgbm9kZVR5cGUgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5vZGVUeXBlICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYnVpbHQtaW4gbmFtZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fYnVpbHRpbk5hbWUgPSBidWlsdGluTmFtZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyBvdmVyd3JpdHRlbiBzaW5jZSBoYXNoIGlzIGRlcml2ZWQgZnJvbSB0aGUgYnVpbHQtaW4gbmFtZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgaGFzaC5cclxuXHQgKi9cclxuXHRnZXRIYXNoKCBidWlsZGVyICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmdldEJ1aWx0aW5OYW1lKCBidWlsZGVyICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgaXMgb3ZlcndyaXR0ZW4gc2luY2UgdGhlIG5vZGUgdHlwZSBpcyBzaW1wbHkgZGVyaXZlZCBmcm9tIGBub2RlVHlwZWAuLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBub2RlIHR5cGUuXHJcblx0ICovXHJcblx0Z2V0Tm9kZVR5cGUoIC8qYnVpbGRlciovICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm5vZGVUeXBlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGJ1aWx0aW4gbmFtZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBidWlsdGluTmFtZSAtIFRoZSBidWlsdC1pbiBuYW1lLlxyXG5cdCAqIEByZXR1cm4ge0NvbXB1dGVCdWlsdGluTm9kZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBub2RlLlxyXG5cdCAqL1xyXG5cdHNldEJ1aWx0aW5OYW1lKCBidWlsdGluTmFtZSApIHtcclxuXHJcblx0XHR0aGlzLl9idWlsdGluTmFtZSA9IGJ1aWx0aW5OYW1lO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGJ1aWx0aW4gbmFtZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgYnVpbHRpbiBuYW1lLlxyXG5cdCAqL1xyXG5cdGdldEJ1aWx0aW5OYW1lKCAvKmJ1aWxkZXIqLyApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fYnVpbHRpbk5hbWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogV2hldGhlciB0aGUgY3VycmVudCBub2RlIGJ1aWxkZXIgaGFzIHRoZSBidWlsdGluIG9yIG5vdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgYnVpbGRlciBoYXMgdGhlIGJ1aWx0aW4gb3Igbm90LlxyXG5cdCAqL1xyXG5cdGhhc0J1aWx0aW4oIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIGJ1aWxkZXIuaGFzQnVpbHRpbiggdGhpcy5fYnVpbHRpbk5hbWUgKTtcclxuXHJcblx0fVxyXG5cclxuXHRnZW5lcmF0ZSggYnVpbGRlciwgb3V0cHV0ICkge1xyXG5cclxuXHRcdGNvbnN0IGJ1aWx0aW5OYW1lID0gdGhpcy5nZXRCdWlsdGluTmFtZSggYnVpbGRlciApO1xyXG5cdFx0Y29uc3Qgbm9kZVR5cGUgPSB0aGlzLmdldE5vZGVUeXBlKCBidWlsZGVyICk7XHJcblxyXG5cdFx0aWYgKCBidWlsZGVyLnNoYWRlclN0YWdlID09PSAnY29tcHV0ZScgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gYnVpbGRlci5mb3JtYXQoIGJ1aWx0aW5OYW1lLCBub2RlVHlwZSwgb3V0cHV0ICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGNvbnNvbGUud2FybiggYENvbXB1dGVCdWlsdGluTm9kZTogQ29tcHV0ZSBidWlsdC1pbiB2YWx1ZSAke2J1aWx0aW5OYW1lfSBjYW4gbm90IGJlIGFjY2Vzc2VkIGluIHRoZSAke2J1aWxkZXIuc2hhZGVyU3RhZ2V9IHN0YWdlYCApO1xyXG5cdFx0XHRyZXR1cm4gYnVpbGRlci5nZW5lcmF0ZUNvbnN0KCBub2RlVHlwZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRzZXJpYWxpemUoIGRhdGEgKSB7XHJcblxyXG5cdFx0c3VwZXIuc2VyaWFsaXplKCBkYXRhICk7XHJcblxyXG5cdFx0ZGF0YS5nbG9iYWwgPSB0aGlzLmdsb2JhbDtcclxuXHRcdGRhdGEuX2J1aWx0aW5OYW1lID0gdGhpcy5fYnVpbHRpbk5hbWU7XHJcblxyXG5cdH1cclxuXHJcblx0ZGVzZXJpYWxpemUoIGRhdGEgKSB7XHJcblxyXG5cdFx0c3VwZXIuZGVzZXJpYWxpemUoIGRhdGEgKTtcclxuXHJcblx0XHR0aGlzLmdsb2JhbCA9IGRhdGEuZ2xvYmFsO1xyXG5cdFx0dGhpcy5fYnVpbHRpbk5hbWUgPSBkYXRhLl9idWlsdGluTmFtZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQ29tcHV0ZUJ1aWx0aW5Ob2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSBjb21wdXRlIGJ1aWx0aW4gbm9kZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgYnVpbHQtaW4gbmFtZS5cclxuICogQHBhcmFtIHtzdHJpbmd9IG5vZGVUeXBlIC0gVGhlIG5vZGUgdHlwZS5cclxuICogQHJldHVybnMge0NvbXB1dGVCdWlsdGluTm9kZX1cclxuICovXHJcbmNvbnN0IGNvbXB1dGVCdWlsdGluID0gKCBuYW1lLCBub2RlVHlwZSApID0+IG5vZGVPYmplY3QoIG5ldyBDb21wdXRlQnVpbHRpbk5vZGUoIG5hbWUsIG5vZGVUeXBlICkgKTtcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIHRoZSBudW1iZXIgb2Ygd29ya2dyb3VwcyBkaXNwYXRjaGVkIGJ5IHRoZSBjb21wdXRlIHNoYWRlci5cclxuICogYGBganNcclxuICogLy8gUnVuIDUxMiBpbnZvY2F0aW9ucy90aHJlYWRzIHdpdGggYSB3b3JrZ3JvdXAgc2l6ZSBvZiAxMjguXHJcbiAqIGNvbnN0IGNvbXB1dGVGbiA9IEZuKCgpID0+IHtcclxuICpcclxuICogICAgIC8vIG51bVdvcmtncm91cHMueCA9IDRcclxuICogICAgIHN0b3JhZ2VCdWZmZXIuZWxlbWVudCgwKS5hc3NpZ24obnVtV29ya2dyb3Vwcy54KVxyXG4gKlxyXG4gKiB9KSgpLmNvbXB1dGUoNTEyLCBbMTI4XSk7XHJcbiAqXHJcbiAqIC8vIFJ1biA1MTIgaW52b2NhdGlvbnMvdGhyZWFkcyB3aXRoIHRoZSBkZWZhdWx0IHdvcmtncm91cCBzaXplIG9mIDY0LlxyXG4gKiBjb25zdCBjb21wdXRlRm4gPSBGbigoKSA9PiB7XHJcbiAqXHJcbiAqICAgICAvLyBudW1Xb3JrZ3JvdXBzLnggPSA4XHJcbiAqICAgICBzdG9yYWdlQnVmZmVyLmVsZW1lbnQoMCkuYXNzaWduKG51bVdvcmtncm91cHMueClcclxuICpcclxuICogfSkoKS5jb21wdXRlKDUxMik7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtDb21wdXRlQnVpbHRpbk5vZGU8dXZlYzM+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG51bVdvcmtncm91cHMgPSAvKkBfX1BVUkVfXyovIGNvbXB1dGVCdWlsdGluKCAnbnVtV29ya2dyb3VwcycsICd1dmVjMycgKTtcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIHRoZSAzLWRpbWVuc2lvbmFsIGluZGV4IG9mIHRoZSB3b3JrZ3JvdXAgdGhlIGN1cnJlbnQgY29tcHV0ZSBpbnZvY2F0aW9uIGJlbG9uZ3MgdG8uXHJcbiAqIGBgYGpzXHJcbiAqIC8vIEV4ZWN1dGUgMTIgY29tcHV0ZSB0aHJlYWRzIHdpdGggYSB3b3JrZ3JvdXAgc2l6ZSBvZiAzLlxyXG4gKiBjb25zdCBjb21wdXRlRm4gPSBGbiggKCkgPT4ge1xyXG4gKlxyXG4gKiBcdElmKCB3b3JrZ3JvdXBJZC54Lm1vZCggMiApLmVxdWFsKCAwICksICgpID0+IHtcclxuICpcclxuICogXHRcdHN0b3JhZ2VCdWZmZXIuZWxlbWVudCggaW5zdGFuY2VJbmRleCApLmFzc2lnbiggaW5zdGFuY2VJbmRleCApO1xyXG4gKlxyXG4gKiBcdH0gKS5FbHNlKCAoKSA9PiB7XHJcbiAqXHJcbiAqIFx0XHRzdG9yYWdlQnVmZmVyLmVsZW1lbnQoIGluc3RhbmNlSW5kZXggKS5hc3NpZ24oIDAgKTtcclxuICpcclxuICogXHR9ICk7XHJcbiAqXHJcbiAqIH0gKSgpLmNvbXB1dGUoIDEyLCBbIDMgXSApO1xyXG4gKlxyXG4gKiAvLyB3b3JrZ3JvdXBJZC54ID0gIFswLCAwLCAwLCAxLCAxLCAxLCAyLCAyLCAyLCAzLCAzLCAzXTtcclxuICogLy8gQnVmZmVyIE91dHB1dCA9ICBbMCwgMSwgMiwgMCwgMCwgMCwgNiwgNywgOCwgMCwgMCwgMF07XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtDb21wdXRlQnVpbHRpbk5vZGU8dXZlYzM+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHdvcmtncm91cElkID0gLypAX19QVVJFX18qLyBjb21wdXRlQnVpbHRpbiggJ3dvcmtncm91cElkJywgJ3V2ZWMzJyApO1xyXG5cclxuLyoqXHJcbiAqIEEgbm9uLWxpbmVhcml6ZWQgMy1kaW1lbnNpb25hbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgY3VycmVudCBpbnZvY2F0aW9uJ3MgcG9zaXRpb24gd2l0aGluIGEgM0QgZ2xvYmFsIGdyaWQuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge0NvbXB1dGVCdWlsdGluTm9kZTx1dmVjMz59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZ2xvYmFsSWQgPSAvKkBfX1BVUkVfXyovIGNvbXB1dGVCdWlsdGluKCAnZ2xvYmFsSWQnLCAndXZlYzMnICk7XHJcbi8qKlxyXG4gKiBBIG5vbi1saW5lYXJpemVkIDMtZGltZW5zaW9uYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGN1cnJlbnQgaW52b2NhdGlvbidzIHBvc2l0aW9uIHdpdGhpbiBhIDNEIHdvcmtncm91cCBncmlkLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtDb21wdXRlQnVpbHRpbk5vZGU8dXZlYzM+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGxvY2FsSWQgPSAvKkBfX1BVUkVfXyovIGNvbXB1dGVCdWlsdGluKCAnbG9jYWxJZCcsICd1dmVjMycgKTtcclxuXHJcbi8qKlxyXG4gKiBBIGRldmljZSBkZXBlbmRlbnQgdmFyaWFibGUgdGhhdCBleHBvc2VzIHRoZSBzaXplIG9mIHRoZSBjdXJyZW50IGludm9jYXRpb24ncyBzdWJncm91cC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Q29tcHV0ZUJ1aWx0aW5Ob2RlPHVpbnQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHN1Ymdyb3VwU2l6ZSA9IC8qQF9fUFVSRV9fKi8gY29tcHV0ZUJ1aWx0aW4oICdzdWJncm91cFNpemUnLCAndWludCcgKTtcclxuXHJcbiIsImltcG9ydCBOb2RlIGZyb20gJy4uL2NvcmUvTm9kZS5qcyc7XHJcbmltcG9ydCB7IG5vZGVQcm94eSB9IGZyb20gJy4uL3RzbC9UU0xDb3JlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIGEgR1BVIGNvbnRyb2wgYmFycmllciB0aGF0IHN5bmNocm9uaXplcyBjb21wdXRlIG9wZXJhdGlvbnMgd2l0aGluIGEgZ2l2ZW4gc2NvcGUuXHJcbiAqXHJcbiAqIFRoaXMgbm9kZSBjYW4gb25seSBiZSB1c2VkIHdpdGggYSBXZWJHUFUgYmFja2VuZC5cclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVcclxuICovXHJcbmNsYXNzIEJhcnJpZXJOb2RlIGV4dGVuZHMgTm9kZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYmFycmllciBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNjb3BlIC0gVGhlIHNjb3BlIGRlZmluZXMgdGhlIGJlaGF2aW9yIG9mIHRoZSBub2RlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBzY29wZSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdHRoaXMuc2NvcGUgPSBzY29wZTtcclxuXHJcblx0fVxyXG5cclxuXHRnZW5lcmF0ZSggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCB7IHNjb3BlIH0gPSB0aGlzO1xyXG5cdFx0Y29uc3QgeyByZW5kZXJlciB9ID0gYnVpbGRlcjtcclxuXHJcblx0XHRpZiAoIHJlbmRlcmVyLmJhY2tlbmQuaXNXZWJHTEJhY2tlbmQgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRidWlsZGVyLmFkZEZsb3dDb2RlKCBgXFx0Ly8gJHtzY29wZX1CYXJyaWVyIFxcbmAgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0YnVpbGRlci5hZGRMaW5lRmxvd0NvZGUoIGAke3Njb3BlfUJhcnJpZXIoKWAsIHRoaXMgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEJhcnJpZXJOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSBiYXJyaWVyIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBzY29wZSAtIFRoZSBzY29wZSBkZWZpbmVzIHRoZSBiZWhhdmlvciBvZiB0aGUgbm9kZS4uXHJcbiAqIEByZXR1cm5zIHtCYXJyaWVyTm9kZX1cclxuICovXHJcbmNvbnN0IGJhcnJpZXIgPSBub2RlUHJveHkoIEJhcnJpZXJOb2RlICk7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIHdvcmtncm91cCBiYXJyaWVyLiBBbGwgY29tcHV0ZSBzaGFkZXJcclxuICogaW52b2NhdGlvbnMgbXVzdCB3YWl0IGZvciBlYWNoIGludm9jYXRpb24gd2l0aGluIGEgd29ya2dyb3VwIHRvXHJcbiAqIGNvbXBsZXRlIGJlZm9yZSB0aGUgYmFycmllciBjYW4gYmUgc3VycGFzc2VkLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcmV0dXJucyB7QmFycmllck5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgd29ya2dyb3VwQmFycmllciA9ICgpID0+IGJhcnJpZXIoICd3b3JrZ3JvdXAnICkuYXBwZW5kKCk7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIHN0b3JhZ2UgYmFycmllci4gQWxsIGludm9jYXRpb25zIG11c3RcclxuICogd2FpdCBmb3IgZWFjaCBhY2Nlc3MgdG8gdmFyaWFibGVzIHdpdGhpbiB0aGUgJ3N0b3JhZ2UnIGFkZHJlc3Mgc3BhY2VcclxuICogdG8gY29tcGxldGUgYmVmb3JlIHRoZSBiYXJyaWVyIGNhbiBiZSBwYXNzZWQuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEByZXR1cm5zIHtCYXJyaWVyTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBzdG9yYWdlQmFycmllciA9ICgpID0+IGJhcnJpZXIoICdzdG9yYWdlJyApLmFwcGVuZCgpO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSB0ZXh0dXJlIGJhcnJpZXIuIEFsbCBpbnZvY2F0aW9ucyBtdXN0XHJcbiAqIHdhaXQgZm9yIGVhY2ggYWNjZXNzIHRvIHZhcmlhYmxlcyB3aXRoaW4gdGhlICd0ZXh0dXJlJyBhZGRyZXNzIHNwYWNlXHJcbiAqIHRvIGNvbXBsZXRlIGJlZm9yZSB0aGUgYmFycmllciBjYW4gYmUgcGFzc2VkLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcmV0dXJucyB7QmFycmllck5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdGV4dHVyZUJhcnJpZXIgPSAoKSA9PiBiYXJyaWVyKCAndGV4dHVyZScgKS5hcHBlbmQoKTtcclxuXHJcbiIsImltcG9ydCBBcnJheUVsZW1lbnROb2RlIGZyb20gJy4uL3V0aWxzL0FycmF5RWxlbWVudE5vZGUuanMnO1xyXG5pbXBvcnQgeyBub2RlT2JqZWN0IH0gZnJvbSAnLi4vdHNsL1RTTENvcmUuanMnO1xyXG5pbXBvcnQgTm9kZSBmcm9tICcuLi9jb3JlL05vZGUuanMnO1xyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgYW4gZWxlbWVudCBvZiBhICd3b3JrZ3JvdXAnIHNjb3BlZCBidWZmZXIuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBBcnJheUVsZW1lbnROb2RlXHJcbiAqL1xyXG5jbGFzcyBXb3JrZ3JvdXBJbmZvRWxlbWVudE5vZGUgZXh0ZW5kcyBBcnJheUVsZW1lbnROb2RlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB3b3JrZ3JvdXAgaW5mbyBlbGVtZW50IG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV9IHdvcmtncm91cEluZm9Ob2RlIC0gVGhlIHdvcmtncm91cCBpbmZvIG5vZGUuXHJcblx0ICogQHBhcmFtIHtOb2RlfSBpbmRleE5vZGUgLSBUaGUgaW5kZXggbm9kZSB0aGF0IGRlZmluZXMgdGhlIGVsZW1lbnQgYWNjZXNzLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCB3b3JrZ3JvdXBJbmZvTm9kZSwgaW5kZXhOb2RlICkge1xyXG5cclxuXHRcdHN1cGVyKCB3b3JrZ3JvdXBJbmZvTm9kZSwgaW5kZXhOb2RlICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzV29ya2dyb3VwSW5mb0VsZW1lbnROb2RlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHRnZW5lcmF0ZSggYnVpbGRlciwgb3V0cHV0ICkge1xyXG5cclxuXHRcdGxldCBzbmlwcGV0O1xyXG5cclxuXHRcdGNvbnN0IGlzQXNzaWduQ29udGV4dCA9IGJ1aWxkZXIuY29udGV4dC5hc3NpZ247XHJcblx0XHRzbmlwcGV0ID0gc3VwZXIuZ2VuZXJhdGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRpZiAoIGlzQXNzaWduQ29udGV4dCAhPT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdGNvbnN0IHR5cGUgPSB0aGlzLmdldE5vZGVUeXBlKCBidWlsZGVyICk7XHJcblxyXG5cdFx0XHRzbmlwcGV0ID0gYnVpbGRlci5mb3JtYXQoIHNuaXBwZXQsIHR5cGUsIG91dHB1dCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBUT0RPOiBQb3NzaWJseSBhY3RpdmF0ZSBjbGlwIGRpc3RhbmNlIGluZGV4IG9uIGluZGV4IGFjY2VzcyByYXRoZXIgdGhhbiBmcm9tIGNsaXBwaW5nIGNvbnRleHRcclxuXHJcblx0XHRyZXR1cm4gc25pcHBldDtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIEEgbm9kZSBhbGxvd2luZyB0aGUgdXNlciB0byBjcmVhdGUgYSAnd29ya2dyb3VwJyBzY29wZWQgYnVmZmVyIHdpdGhpbiB0aGVcclxuICogY29udGV4dCBvZiBhIGNvbXB1dGUgc2hhZGVyLiBUeXBpY2FsbHksIHdvcmtncm91cCBzY29wZWQgYnVmZmVycyBhcmVcclxuICogY3JlYXRlZCB0byBob2xkIGRhdGEgdGhhdCBpcyB0cmFuc2ZlcnJlZCBmcm9tIGEgZ2xvYmFsIHN0b3JhZ2Ugc2NvcGUgaW50b1xyXG4gKiBhIGxvY2FsIHdvcmtncm91cCBzY29wZS4gRm9yIGludm9jYXRpb25zIHdpdGhpbiBhIHdvcmtncm91cCwgZGF0YVxyXG4gKiBhY2Nlc3Mgc3BlZWRzIG9uICd3b3JrZ3JvdXAnIHNjb3BlZCBidWZmZXJzIGNhbiBiZSBzaWduaWZpY2FudGx5IGZhc3RlclxyXG4gKiB0aGFuIHNpbWlsYXIgYWNjZXNzIG9wZXJhdGlvbnMgb24gZ2xvYmFsbHkgYWNjZXNzaWJsZSBzdG9yYWdlIGJ1ZmZlcnMuXHJcbiAqXHJcbiAqIFRoaXMgbm9kZSBjYW4gb25seSBiZSB1c2VkIHdpdGggYSBXZWJHUFUgYmFja2VuZC5cclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVcclxuICovXHJcbmNsYXNzIFdvcmtncm91cEluZm9Ob2RlIGV4dGVuZHMgTm9kZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYnVmZmVyIHNjb3BlZCB0byB0eXBlIHNjb3BlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNjb3BlIC0gVE9ETy5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gYnVmZmVyVHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgYSAnd29ya2dyb3VwJyBzY29wZWQgYnVmZmVyIGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtidWZmZXJDb3VudD0wXSAtIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGJ1ZmZlci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggc2NvcGUsIGJ1ZmZlclR5cGUsIGJ1ZmZlckNvdW50ID0gMCApIHtcclxuXHJcblx0XHRzdXBlciggYnVmZmVyVHlwZSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGJ1ZmZlciB0eXBlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYnVmZmVyVHlwZSA9IGJ1ZmZlclR5cGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYnVmZmVyIGNvdW50LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYnVmZmVyQ291bnQgPSBidWZmZXJDb3VudDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNXb3JrZ3JvdXBJbmZvTm9kZSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZGF0YSB0eXBlIG9mIHRoZSBhcnJheSBidWZmZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5lbGVtZW50VHlwZSA9IGJ1ZmZlclR5cGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUT0RPLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2NvcGUgPSBzY29wZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBuYW1lL2xhYmVsIG9mIHRoaXMgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge1dvcmtncm91cEluZm9Ob2RlfSBBIHJlZmVyZW5jZSB0byB0aGlzIG5vZGUuXHJcblx0ICovXHJcblx0bGFiZWwoIG5hbWUgKSB7XHJcblxyXG5cdFx0dGhpcy5uYW1lID0gbmFtZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBzY29wZSBvZiB0aGlzIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc2NvcGUgLSBUaGUgc2NvcGUgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge1dvcmtncm91cEluZm9Ob2RlfSBBIHJlZmVyZW5jZSB0byB0aGlzIG5vZGUuXHJcblx0ICovXHJcblx0c2V0U2NvcGUoIHNjb3BlICkge1xyXG5cclxuXHRcdHRoaXMuc2NvcGUgPSBzY29wZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGRhdGEgdHlwZSBvZiB0aGUgYXJyYXkgYnVmZmVyLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgZWxlbWVudCB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldEVsZW1lbnRUeXBlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmVsZW1lbnRUeXBlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE92ZXJ3cml0ZXMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2luY2UgdGhlIGlucHV0IHR5cGVcclxuXHQgKiBpcyBpbmZlcnJlZCBmcm9tIHRoZSBzY29wZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgaW5wdXQgdHlwZS5cclxuXHQgKi9cclxuXHRnZXRJbnB1dFR5cGUoIC8qYnVpbGRlciovICkge1xyXG5cclxuXHRcdHJldHVybiBgJHt0aGlzLnNjb3BlfUFycmF5YDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgZWxlbWVudHMgdmlhIGFuIGluZGV4IG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0luZGV4Tm9kZX0gaW5kZXhOb2RlIC0gaW5kZXhOb2RlLlxyXG5cdCAqIEByZXR1cm4ge1dvcmtncm91cEluZm9FbGVtZW50Tm9kZX0gQSByZWZlcmVuY2UgdG8gYW4gZWxlbWVudC5cclxuXHQgKi9cclxuXHRlbGVtZW50KCBpbmRleE5vZGUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5vZGVPYmplY3QoIG5ldyBXb3JrZ3JvdXBJbmZvRWxlbWVudE5vZGUoIHRoaXMsIGluZGV4Tm9kZSApICk7XHJcblxyXG5cdH1cclxuXHJcblx0Z2VuZXJhdGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIGJ1aWxkZXIuZ2V0U2NvcGVkQXJyYXkoIHRoaXMubmFtZSB8fCBgJHt0aGlzLnNjb3BlfUFycmF5XyR7dGhpcy5pZH1gLCB0aGlzLnNjb3BlLnRvTG93ZXJDYXNlKCksIHRoaXMuYnVmZmVyVHlwZSwgdGhpcy5idWZmZXJDb3VudCApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBXb3JrZ3JvdXBJbmZvTm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgd29ya2dyb3VwIGluZm8gbm9kZS5cclxuICogQ3JlYXRlcyBhIG5ldyAnd29ya2dyb3VwJyBzY29wZWQgYXJyYXkgYnVmZmVyLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgYSAnd29ya2dyb3VwJyBzY29wZWQgYnVmZmVyIGVsZW1lbnQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbY291bnQ9MF0gLSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBidWZmZXIuXHJcbiAqIEByZXR1cm5zIHtXb3JrZ3JvdXBJbmZvTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCB3b3JrZ3JvdXBBcnJheSA9ICggdHlwZSwgY291bnQgKSA9PiBub2RlT2JqZWN0KCBuZXcgV29ya2dyb3VwSW5mb05vZGUoICdXb3JrZ3JvdXAnLCB0eXBlLCBjb3VudCApICk7XHJcblxyXG5cclxuIiwiaW1wb3J0IFRlbXBOb2RlIGZyb20gJy4uL2NvcmUvVGVtcE5vZGUuanMnO1xyXG5pbXBvcnQgeyBub2RlUHJveHkgfSBmcm9tICcuLi90c2wvVFNMQ29yZS5qcyc7XHJcblxyXG4vKipcclxuICogYEF0b21pY0Z1bmN0aW9uTm9kZWAgcmVwcmVzZW50cyBhbnkgZnVuY3Rpb24gdGhhdCBjYW4gb3BlcmF0ZSBvbiBhdG9taWMgdmFyaWFibGUgdHlwZXNcclxuICogd2l0aGluIGEgc2hhZGVyLiBJbiBhbiBhdG9taWMgZnVuY3Rpb24sIGFueSBtb2RpZmljYXRpb24gdG8gYW4gYXRvbWljIHZhcmlhYmxlIHdpbGxcclxuICogb2NjdXIgYXMgYW4gaW5kaXZpc2libGUgc3RlcCB3aXRoIGEgZGVmaW5lZCBvcmRlciByZWxhdGl2ZSB0byBvdGhlciBtb2RpZmljYXRpb25zLlxyXG4gKiBBY2NvcmRpbmdseSwgZXZlbiBpZiBtdWx0aXBsZSBhdG9taWMgZnVuY3Rpb25zIGFyZSBtb2RpZnlpbmcgYW4gYXRvbWljIHZhcmlhYmxlIGF0IG9uY2VcclxuICogYXRvbWljIG9wZXJhdGlvbnMgd2lsbCBub3QgaW50ZXJmZXJlIHdpdGggZWFjaCBvdGhlci5cclxuICpcclxuICogVGhpcyBub2RlIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBhIFdlYkdQVSBiYWNrZW5kLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgVGVtcE5vZGVcclxuICovXHJcbmNsYXNzIEF0b21pY0Z1bmN0aW9uTm9kZSBleHRlbmRzIFRlbXBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnQXRvbWljRnVuY3Rpb25Ob2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGF0b21pYyBmdW5jdGlvbiBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZCAtIFRoZSBzaWduYXR1cmUgb2YgdGhlIGF0b21pYyBmdW5jdGlvbiB0byBjb25zdHJ1Y3QuXHJcblx0ICogQHBhcmFtIHtOb2RlfSBwb2ludGVyTm9kZSAtIEFuIGF0b21pYyB2YXJpYWJsZSBvciBlbGVtZW50IG9mIGFuIGF0b21pYyBidWZmZXIuXHJcblx0ICogQHBhcmFtIHtOb2RlfSB2YWx1ZU5vZGUgLSBUaGUgdmFsdWUgdGhhdCBtdXRhdGVzIHRoZSBhdG9taWMgdmFyaWFibGUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG1ldGhvZCwgcG9pbnRlck5vZGUsIHZhbHVlTm9kZSApIHtcclxuXHJcblx0XHRzdXBlciggJ3VpbnQnICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc2lnbmF0dXJlIG9mIHRoZSBhdG9taWMgZnVuY3Rpb24gdG8gY29uc3RydWN0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWV0aG9kID0gbWV0aG9kO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQW4gYXRvbWljIHZhcmlhYmxlIG9yIGVsZW1lbnQgb2YgYW4gYXRvbWljIGJ1ZmZlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wb2ludGVyTm9kZSA9IHBvaW50ZXJOb2RlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSB2YWx1ZSB0aGF0IG1vZGlmaWVzIHRoZSBhdG9taWMgdmFyaWFibGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudmFsdWVOb2RlID0gdmFsdWVOb2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE92ZXJ3cml0ZXMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gcmV0dXJuIHRoZSB0eXBlIG9mXHJcblx0ICogdGhlIHBvaW50ZXIgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgaW5wdXQgdHlwZS5cclxuXHQgKi9cclxuXHRnZXRJbnB1dFR5cGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMucG9pbnRlck5vZGUuZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBPdmVyd3JpdHRlbiBzaW5jZSB0aGUgbm9kZSB0eXBlIGlzIGluZmVycmVkIGZyb20gdGhlIGlucHV0IHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG5vZGUgdHlwZS5cclxuXHQgKi9cclxuXHRnZXROb2RlVHlwZSggYnVpbGRlciApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5nZXRJbnB1dFR5cGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHRnZW5lcmF0ZSggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCBtZXRob2QgPSB0aGlzLm1ldGhvZDtcclxuXHJcblx0XHRjb25zdCB0eXBlID0gdGhpcy5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cdFx0Y29uc3QgaW5wdXRUeXBlID0gdGhpcy5nZXRJbnB1dFR5cGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRjb25zdCBhID0gdGhpcy5wb2ludGVyTm9kZTtcclxuXHRcdGNvbnN0IGIgPSB0aGlzLnZhbHVlTm9kZTtcclxuXHJcblx0XHRjb25zdCBwYXJhbXMgPSBbXTtcclxuXHJcblx0XHRwYXJhbXMucHVzaCggYCYkeyBhLmJ1aWxkKCBidWlsZGVyLCBpbnB1dFR5cGUgKSB9YCApO1xyXG5cclxuXHRcdGlmICggYiAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHBhcmFtcy5wdXNoKCBiLmJ1aWxkKCBidWlsZGVyLCBpbnB1dFR5cGUgKSApO1xyXG5cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgbWV0aG9kU25pcHBldCA9IGAkeyBidWlsZGVyLmdldE1ldGhvZCggbWV0aG9kLCB0eXBlICkgfSggJHsgcGFyYW1zLmpvaW4oICcsICcgKSB9IClgO1xyXG5cclxuXHRcdGlmICggYiAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGJ1aWxkZXIuYWRkTGluZUZsb3dDb2RlKCBtZXRob2RTbmlwcGV0LCB0aGlzICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBtZXRob2RTbmlwcGV0O1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5BdG9taWNGdW5jdGlvbk5vZGUuQVRPTUlDX0xPQUQgPSAnYXRvbWljTG9hZCc7XHJcbkF0b21pY0Z1bmN0aW9uTm9kZS5BVE9NSUNfU1RPUkUgPSAnYXRvbWljU3RvcmUnO1xyXG5BdG9taWNGdW5jdGlvbk5vZGUuQVRPTUlDX0FERCA9ICdhdG9taWNBZGQnO1xyXG5BdG9taWNGdW5jdGlvbk5vZGUuQVRPTUlDX1NVQiA9ICdhdG9taWNTdWInO1xyXG5BdG9taWNGdW5jdGlvbk5vZGUuQVRPTUlDX01BWCA9ICdhdG9taWNNYXgnO1xyXG5BdG9taWNGdW5jdGlvbk5vZGUuQVRPTUlDX01JTiA9ICdhdG9taWNNaW4nO1xyXG5BdG9taWNGdW5jdGlvbk5vZGUuQVRPTUlDX0FORCA9ICdhdG9taWNBbmQnO1xyXG5BdG9taWNGdW5jdGlvbk5vZGUuQVRPTUlDX09SID0gJ2F0b21pY09yJztcclxuQXRvbWljRnVuY3Rpb25Ob2RlLkFUT01JQ19YT1IgPSAnYXRvbWljWG9yJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IEF0b21pY0Z1bmN0aW9uTm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGFuIGF0b21pYyBmdW5jdGlvbiBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kIC0gVGhlIHNpZ25hdHVyZSBvZiB0aGUgYXRvbWljIGZ1bmN0aW9uIHRvIGNvbnN0cnVjdC5cclxuICogQHBhcmFtIHtOb2RlfSBwb2ludGVyTm9kZSAtIEFuIGF0b21pYyB2YXJpYWJsZSBvciBlbGVtZW50IG9mIGFuIGF0b21pYyBidWZmZXIuXHJcbiAqIEBwYXJhbSB7Tm9kZX0gdmFsdWVOb2RlIC0gVGhlIHZhbHVlIHRoYXQgbXV0YXRlcyB0aGUgYXRvbWljIHZhcmlhYmxlLlxyXG4gKiBAcmV0dXJucyB7QXRvbWljRnVuY3Rpb25Ob2RlfVxyXG4gKi9cclxuY29uc3QgYXRvbWljTm9kZSA9IG5vZGVQcm94eSggQXRvbWljRnVuY3Rpb25Ob2RlICk7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBhcHBlbmRpbmcgYW4gYXRvbWljIGZ1bmN0aW9uIGNhbGwgaW50byB0aGUgcHJvZ3JhbW1hdGljIGZsb3cgb2YgYSBjb21wdXRlIHNoYWRlci5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZCAtIFRoZSBzaWduYXR1cmUgb2YgdGhlIGF0b21pYyBmdW5jdGlvbiB0byBjb25zdHJ1Y3QuXHJcbiAqIEBwYXJhbSB7Tm9kZX0gcG9pbnRlck5vZGUgLSBBbiBhdG9taWMgdmFyaWFibGUgb3IgZWxlbWVudCBvZiBhbiBhdG9taWMgYnVmZmVyLlxyXG4gKiBAcGFyYW0ge05vZGV9IHZhbHVlTm9kZSAtIFRoZSB2YWx1ZSB0aGF0IG11dGF0ZXMgdGhlIGF0b21pYyB2YXJpYWJsZS5cclxuICogQHJldHVybnMge0F0b21pY0Z1bmN0aW9uTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBhdG9taWNGdW5jID0gKCBtZXRob2QsIHBvaW50ZXJOb2RlLCB2YWx1ZU5vZGUgKSA9PiB7XHJcblxyXG5cdGNvbnN0IG5vZGUgPSBhdG9taWNOb2RlKCBtZXRob2QsIHBvaW50ZXJOb2RlLCB2YWx1ZU5vZGUgKTtcclxuXHRub2RlLmFwcGVuZCgpO1xyXG5cclxuXHRyZXR1cm4gbm9kZTtcclxuXHJcbn07XHJcblxyXG4vKipcclxuICogTG9hZHMgdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgYXRvbWljIHZhcmlhYmxlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IHBvaW50ZXJOb2RlIC0gQW4gYXRvbWljIHZhcmlhYmxlIG9yIGVsZW1lbnQgb2YgYW4gYXRvbWljIGJ1ZmZlci5cclxuICogQHJldHVybnMge0F0b21pY0Z1bmN0aW9uTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBhdG9taWNMb2FkID0gKCBwb2ludGVyTm9kZSApID0+IGF0b21pY0Z1bmMoIEF0b21pY0Z1bmN0aW9uTm9kZS5BVE9NSUNfTE9BRCwgcG9pbnRlck5vZGUsIG51bGwgKTtcclxuXHJcbi8qKlxyXG4gKiBTdG9yZXMgYSB2YWx1ZSBpbiB0aGUgYXRvbWljIHZhcmlhYmxlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IHBvaW50ZXJOb2RlIC0gQW4gYXRvbWljIHZhcmlhYmxlIG9yIGVsZW1lbnQgb2YgYW4gYXRvbWljIGJ1ZmZlci5cclxuICogQHBhcmFtIHtOb2RlfSB2YWx1ZU5vZGUgLSBUaGUgdmFsdWUgdGhhdCBtdXRhdGVzIHRoZSBhdG9taWMgdmFyaWFibGUuXHJcbiAqIEByZXR1cm5zIHtBdG9taWNGdW5jdGlvbk5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYXRvbWljU3RvcmUgPSAoIHBvaW50ZXJOb2RlLCB2YWx1ZU5vZGUgKSA9PiBhdG9taWNGdW5jKCBBdG9taWNGdW5jdGlvbk5vZGUuQVRPTUlDX1NUT1JFLCBwb2ludGVyTm9kZSwgdmFsdWVOb2RlICk7XHJcblxyXG4vKipcclxuICogSW5jcmVtZW50cyB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBhdG9taWMgdmFyaWFibGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZX0gcG9pbnRlck5vZGUgLSBBbiBhdG9taWMgdmFyaWFibGUgb3IgZWxlbWVudCBvZiBhbiBhdG9taWMgYnVmZmVyLlxyXG4gKiBAcGFyYW0ge05vZGV9IHZhbHVlTm9kZSAtIFRoZSB2YWx1ZSB0aGF0IG11dGF0ZXMgdGhlIGF0b21pYyB2YXJpYWJsZS5cclxuICogQHJldHVybnMge0F0b21pY0Z1bmN0aW9uTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBhdG9taWNBZGQgPSAoIHBvaW50ZXJOb2RlLCB2YWx1ZU5vZGUgKSA9PiBhdG9taWNGdW5jKCBBdG9taWNGdW5jdGlvbk5vZGUuQVRPTUlDX0FERCwgcG9pbnRlck5vZGUsIHZhbHVlTm9kZSApO1xyXG5cclxuLyoqXHJcbiAqIERlY3JlbWVudHMgdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgYXRvbWljIHZhcmlhYmxlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IHBvaW50ZXJOb2RlIC0gQW4gYXRvbWljIHZhcmlhYmxlIG9yIGVsZW1lbnQgb2YgYW4gYXRvbWljIGJ1ZmZlci5cclxuICogQHBhcmFtIHtOb2RlfSB2YWx1ZU5vZGUgLSBUaGUgdmFsdWUgdGhhdCBtdXRhdGVzIHRoZSBhdG9taWMgdmFyaWFibGUuXHJcbiAqIEByZXR1cm5zIHtBdG9taWNGdW5jdGlvbk5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYXRvbWljU3ViID0gKCBwb2ludGVyTm9kZSwgdmFsdWVOb2RlICkgPT4gYXRvbWljRnVuYyggQXRvbWljRnVuY3Rpb25Ob2RlLkFUT01JQ19TVUIsIHBvaW50ZXJOb2RlLCB2YWx1ZU5vZGUgKTtcclxuXHJcbi8qKlxyXG4gKiBTdG9yZXMgaW4gYW4gYXRvbWljIHZhcmlhYmxlIHRoZSBtYXhpbXVtIGJldHdlZW4gaXRzIGN1cnJlbnQgdmFsdWUgYW5kIGEgcGFyYW1ldGVyLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IHBvaW50ZXJOb2RlIC0gQW4gYXRvbWljIHZhcmlhYmxlIG9yIGVsZW1lbnQgb2YgYW4gYXRvbWljIGJ1ZmZlci5cclxuICogQHBhcmFtIHtOb2RlfSB2YWx1ZU5vZGUgLSBUaGUgdmFsdWUgdGhhdCBtdXRhdGVzIHRoZSBhdG9taWMgdmFyaWFibGUuXHJcbiAqIEByZXR1cm5zIHtBdG9taWNGdW5jdGlvbk5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYXRvbWljTWF4ID0gKCBwb2ludGVyTm9kZSwgdmFsdWVOb2RlICkgPT4gYXRvbWljRnVuYyggQXRvbWljRnVuY3Rpb25Ob2RlLkFUT01JQ19NQVgsIHBvaW50ZXJOb2RlLCB2YWx1ZU5vZGUgKTtcclxuXHJcbi8qKlxyXG4gKiBTdG9yZXMgaW4gYW4gYXRvbWljIHZhcmlhYmxlIHRoZSBtaW5pbXVtIGJldHdlZW4gaXRzIGN1cnJlbnQgdmFsdWUgYW5kIGEgcGFyYW1ldGVyLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IHBvaW50ZXJOb2RlIC0gQW4gYXRvbWljIHZhcmlhYmxlIG9yIGVsZW1lbnQgb2YgYW4gYXRvbWljIGJ1ZmZlci5cclxuICogQHBhcmFtIHtOb2RlfSB2YWx1ZU5vZGUgLSBUaGUgdmFsdWUgdGhhdCBtdXRhdGVzIHRoZSBhdG9taWMgdmFyaWFibGUuXHJcbiAqIEByZXR1cm5zIHtBdG9taWNGdW5jdGlvbk5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYXRvbWljTWluID0gKCBwb2ludGVyTm9kZSwgdmFsdWVOb2RlICkgPT4gYXRvbWljRnVuYyggQXRvbWljRnVuY3Rpb25Ob2RlLkFUT01JQ19NSU4sIHBvaW50ZXJOb2RlLCB2YWx1ZU5vZGUgKTtcclxuXHJcbi8qKlxyXG4gKiBTdG9yZXMgaW4gYW4gYXRvbWljIHZhcmlhYmxlIHRoZSBiaXR3aXNlIEFORCBvZiBpdHMgdmFsdWUgd2l0aCBhIHBhcmFtZXRlci5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlfSBwb2ludGVyTm9kZSAtIEFuIGF0b21pYyB2YXJpYWJsZSBvciBlbGVtZW50IG9mIGFuIGF0b21pYyBidWZmZXIuXHJcbiAqIEBwYXJhbSB7Tm9kZX0gdmFsdWVOb2RlIC0gVGhlIHZhbHVlIHRoYXQgbXV0YXRlcyB0aGUgYXRvbWljIHZhcmlhYmxlLlxyXG4gKiBAcmV0dXJucyB7QXRvbWljRnVuY3Rpb25Ob2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGF0b21pY0FuZCA9ICggcG9pbnRlck5vZGUsIHZhbHVlTm9kZSApID0+IGF0b21pY0Z1bmMoIEF0b21pY0Z1bmN0aW9uTm9kZS5BVE9NSUNfQU5ELCBwb2ludGVyTm9kZSwgdmFsdWVOb2RlICk7XHJcblxyXG4vKipcclxuICogU3RvcmVzIGluIGFuIGF0b21pYyB2YXJpYWJsZSB0aGUgYml0d2lzZSBPUiBvZiBpdHMgdmFsdWUgd2l0aCBhIHBhcmFtZXRlci5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlfSBwb2ludGVyTm9kZSAtIEFuIGF0b21pYyB2YXJpYWJsZSBvciBlbGVtZW50IG9mIGFuIGF0b21pYyBidWZmZXIuXHJcbiAqIEBwYXJhbSB7Tm9kZX0gdmFsdWVOb2RlIC0gVGhlIHZhbHVlIHRoYXQgbXV0YXRlcyB0aGUgYXRvbWljIHZhcmlhYmxlLlxyXG4gKiBAcmV0dXJucyB7QXRvbWljRnVuY3Rpb25Ob2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGF0b21pY09yID0gKCBwb2ludGVyTm9kZSwgdmFsdWVOb2RlICkgPT4gYXRvbWljRnVuYyggQXRvbWljRnVuY3Rpb25Ob2RlLkFUT01JQ19PUiwgcG9pbnRlck5vZGUsIHZhbHVlTm9kZSApO1xyXG5cclxuLyoqXHJcbiAqIFN0b3JlcyBpbiBhbiBhdG9taWMgdmFyaWFibGUgdGhlIGJpdHdpc2UgWE9SIG9mIGl0cyB2YWx1ZSB3aXRoIGEgcGFyYW1ldGVyLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IHBvaW50ZXJOb2RlIC0gQW4gYXRvbWljIHZhcmlhYmxlIG9yIGVsZW1lbnQgb2YgYW4gYXRvbWljIGJ1ZmZlci5cclxuICogQHBhcmFtIHtOb2RlfSB2YWx1ZU5vZGUgLSBUaGUgdmFsdWUgdGhhdCBtdXRhdGVzIHRoZSBhdG9taWMgdmFyaWFibGUuXHJcbiAqIEByZXR1cm5zIHtBdG9taWNGdW5jdGlvbk5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYXRvbWljWG9yID0gKCBwb2ludGVyTm9kZSwgdmFsdWVOb2RlICkgPT4gYXRvbWljRnVuYyggQXRvbWljRnVuY3Rpb25Ob2RlLkFUT01JQ19YT1IsIHBvaW50ZXJOb2RlLCB2YWx1ZU5vZGUgKTtcclxuIiwiaW1wb3J0IHsgdW5pZm9ybSB9IGZyb20gJy4uL2NvcmUvVW5pZm9ybU5vZGUuanMnO1xyXG5pbXBvcnQgeyByZW5kZXJHcm91cCB9IGZyb20gJy4uL2NvcmUvVW5pZm9ybUdyb3VwTm9kZS5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBjYW1lcmFWaWV3TWF0cml4IH0gZnJvbSAnLi9DYW1lcmEuanMnO1xyXG5pbXBvcnQgeyBwb3NpdGlvbldvcmxkIH0gZnJvbSAnLi9Qb3NpdGlvbi5qcyc7XHJcblxyXG5sZXQgdW5pZm9ybXNMaWI7XHJcblxyXG5mdW5jdGlvbiBnZXRMaWdodERhdGEoIGxpZ2h0ICkge1xyXG5cclxuXHR1bmlmb3Jtc0xpYiA9IHVuaWZvcm1zTGliIHx8IG5ldyBXZWFrTWFwKCk7XHJcblxyXG5cdGxldCB1bmlmb3JtcyA9IHVuaWZvcm1zTGliLmdldCggbGlnaHQgKTtcclxuXHJcblx0aWYgKCB1bmlmb3JtcyA9PT0gdW5kZWZpbmVkICkgdW5pZm9ybXNMaWIuc2V0KCBsaWdodCwgdW5pZm9ybXMgPSB7fSApO1xyXG5cclxuXHRyZXR1cm4gdW5pZm9ybXM7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBnZXR0aW5nIGEgc2hhZG93IG1hdHJpeCB1bmlmb3JtIG5vZGUgZm9yIHRoZSBnaXZlbiBsaWdodC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtMaWdodH0gbGlnaHQgLVRoZSBsaWdodCBzb3VyY2UuXHJcbiAqIEByZXR1cm5zIHtVbmlmb3JtTm9kZTxtYXQ0Pn0gVGhlIHNoYWRvdyBtYXRyaXggdW5pZm9ybSBub2RlLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGxpZ2h0U2hhZG93TWF0cml4KCBsaWdodCApIHtcclxuXHJcblx0Y29uc3QgZGF0YSA9IGdldExpZ2h0RGF0YSggbGlnaHQgKTtcclxuXHJcblx0cmV0dXJuIGRhdGEuc2hhZG93TWF0cml4IHx8ICggZGF0YS5zaGFkb3dNYXRyaXggPSB1bmlmb3JtKCAnbWF0NCcgKS5zZXRHcm91cCggcmVuZGVyR3JvdXAgKS5vblJlbmRlclVwZGF0ZSggKCkgPT4ge1xyXG5cclxuXHRcdGlmICggbGlnaHQuY2FzdFNoYWRvdyAhPT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdGxpZ2h0LnNoYWRvdy51cGRhdGVNYXRyaWNlcyggbGlnaHQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGxpZ2h0LnNoYWRvdy5tYXRyaXg7XHJcblxyXG5cdH0gKSApO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgZ2V0dGluZyBwcm9qZWN0ZWQgdXYgY29vcmRpbmF0ZXMgZm9yIHRoZSBnaXZlbiBsaWdodC5cclxuICogUmVsZXZhbnQgd2hlbiB1c2luZyBtYXBzIHdpdGggc3BvdCBsaWdodHMuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7TGlnaHR9IGxpZ2h0IC1UaGUgbGlnaHQgc291cmNlLlxyXG4gKiBAcGFyYW0ge05vZGU8dmVjMz59IFtwb3NpdGlvbj1wb3NpdGlvbldvcmxkXSAtVGhlIHBvc2l0aW9uIHRvIHByb2plY3QuXHJcbiAqIEByZXR1cm5zIHtOb2RlPHZlYzM+fSBUaGUgcHJvamVjdGVkIHV2cy5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBsaWdodFByb2plY3Rpb25VViggbGlnaHQsIHBvc2l0aW9uID0gcG9zaXRpb25Xb3JsZCApIHtcclxuXHJcblx0Y29uc3Qgc3BvdExpZ2h0Q29vcmQgPSBsaWdodFNoYWRvd01hdHJpeCggbGlnaHQgKS5tdWwoIHBvc2l0aW9uICk7XHJcblx0Y29uc3QgcHJvamVjdGlvblVWID0gc3BvdExpZ2h0Q29vcmQueHl6LmRpdiggc3BvdExpZ2h0Q29vcmQudyApO1xyXG5cclxuXHRyZXR1cm4gcHJvamVjdGlvblVWO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgZ2V0dGluZyB0aGUgcG9zaXRpb24gaW4gd29ybGQgc3BhY2UgZm9yIHRoZSBnaXZlbiBsaWdodC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtMaWdodH0gbGlnaHQgLVRoZSBsaWdodCBzb3VyY2UuXHJcbiAqIEByZXR1cm5zIHtVbmlmb3JtTm9kZTx2ZWMzPn0gVGhlIGxpZ2h0J3MgcG9zaXRpb24gaW4gd29ybGQgc3BhY2UuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gbGlnaHRQb3NpdGlvbiggbGlnaHQgKSB7XHJcblxyXG5cdGNvbnN0IGRhdGEgPSBnZXRMaWdodERhdGEoIGxpZ2h0ICk7XHJcblxyXG5cdHJldHVybiBkYXRhLnBvc2l0aW9uIHx8ICggZGF0YS5wb3NpdGlvbiA9IHVuaWZvcm0oIG5ldyBWZWN0b3IzKCkgKS5zZXRHcm91cCggcmVuZGVyR3JvdXAgKS5vblJlbmRlclVwZGF0ZSggKCBfLCBzZWxmICkgPT4gc2VsZi52YWx1ZS5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICkgKSApO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgZ2V0dGluZyB0aGUgbGlnaHQgdGFyZ2V0IHBvc2l0aW9uIGluIHdvcmxkIHNwYWNlIGZvciB0aGUgZ2l2ZW4gbGlnaHQuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7TGlnaHR9IGxpZ2h0IC1UaGUgbGlnaHQgc291cmNlLlxyXG4gKiBAcmV0dXJucyB7VW5pZm9ybU5vZGU8dmVjMz59IFRoZSBsaWdodCB0YXJnZXQgcG9zaXRpb24gaW4gd29ybGQgc3BhY2UuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gbGlnaHRUYXJnZXRQb3NpdGlvbiggbGlnaHQgKSB7XHJcblxyXG5cdGNvbnN0IGRhdGEgPSBnZXRMaWdodERhdGEoIGxpZ2h0ICk7XHJcblxyXG5cdHJldHVybiBkYXRhLnRhcmdldFBvc2l0aW9uIHx8ICggZGF0YS50YXJnZXRQb3NpdGlvbiA9IHVuaWZvcm0oIG5ldyBWZWN0b3IzKCkgKS5zZXRHcm91cCggcmVuZGVyR3JvdXAgKS5vblJlbmRlclVwZGF0ZSggKCBfLCBzZWxmICkgPT4gc2VsZi52YWx1ZS5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCApICkgKTtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGdldHRpbmcgdGhlIHBvc2l0aW9uIGluIHZpZXcgc3BhY2UgZm9yIHRoZSBnaXZlbiBsaWdodC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtMaWdodH0gbGlnaHQgLSBUaGUgbGlnaHQgc291cmNlLlxyXG4gKiBAcmV0dXJucyB7VW5pZm9ybU5vZGU8dmVjMz59IFRoZSBsaWdodCdzIHBvc2l0aW9uIGluIHZpZXcgc3BhY2UuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gbGlnaHRWaWV3UG9zaXRpb24oIGxpZ2h0ICkge1xyXG5cclxuXHRjb25zdCBkYXRhID0gZ2V0TGlnaHREYXRhKCBsaWdodCApO1xyXG5cclxuXHRyZXR1cm4gZGF0YS52aWV3UG9zaXRpb24gfHwgKCBkYXRhLnZpZXdQb3NpdGlvbiA9IHVuaWZvcm0oIG5ldyBWZWN0b3IzKCkgKS5zZXRHcm91cCggcmVuZGVyR3JvdXAgKS5vblJlbmRlclVwZGF0ZSggKCB7IGNhbWVyYSB9LCBzZWxmICkgPT4ge1xyXG5cclxuXHRcdHNlbGYudmFsdWUgPSBzZWxmLnZhbHVlIHx8IG5ldyBWZWN0b3IzKCk7XHJcblx0XHRzZWxmLnZhbHVlLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTtcclxuXHJcblx0XHRzZWxmLnZhbHVlLmFwcGx5TWF0cml4NCggY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSApO1xyXG5cclxuXHR9ICkgKTtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGdldHRpbmcgdGhlIGxpZ2h0IHRhcmdldCBkaXJlY3Rpb24gZm9yIHRoZSBnaXZlbiBsaWdodC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtMaWdodH0gbGlnaHQgLVRoZSBsaWdodCBzb3VyY2UuXHJcbiAqIEByZXR1cm5zIHtOb2RlPHZlYzM+fSBUaGUgbGlnaHQncyB0YXJnZXQgZGlyZWN0aW9uLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGxpZ2h0VGFyZ2V0RGlyZWN0aW9uID0gKCBsaWdodCApID0+IGNhbWVyYVZpZXdNYXRyaXgudHJhbnNmb3JtRGlyZWN0aW9uKCBsaWdodFBvc2l0aW9uKCBsaWdodCApLnN1YiggbGlnaHRUYXJnZXRQb3NpdGlvbiggbGlnaHQgKSApICk7XHJcbiIsImltcG9ydCBOb2RlIGZyb20gJy4uL2NvcmUvTm9kZS5qcyc7XHJcbmltcG9ydCB7IG5vZGVPYmplY3QsIHZlYzMgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcbmltcG9ydCB7IGhhc2hBcnJheSB9IGZyb20gJy4uL2NvcmUvTm9kZVV0aWxzLmpzJztcclxuXHJcbmNvbnN0IHNvcnRMaWdodHMgPSAoIGxpZ2h0cyApID0+IHtcclxuXHJcblx0cmV0dXJuIGxpZ2h0cy5zb3J0KCAoIGEsIGIgKSA9PiBhLmlkIC0gYi5pZCApO1xyXG5cclxufTtcclxuXHJcbmNvbnN0IGdldExpZ2h0Tm9kZUJ5SWQgPSAoIGlkLCBsaWdodE5vZGVzICkgPT4ge1xyXG5cclxuXHRmb3IgKCBjb25zdCBsaWdodE5vZGUgb2YgbGlnaHROb2RlcyApIHtcclxuXHJcblx0XHRpZiAoIGxpZ2h0Tm9kZS5pc0FuYWx5dGljTGlnaHROb2RlICYmIGxpZ2h0Tm9kZS5saWdodC5pZCA9PT0gaWQgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gbGlnaHROb2RlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gbnVsbDtcclxuXHJcbn07XHJcblxyXG5jb25zdCBfbGlnaHRzTm9kZVJlZiA9IC8qQF9fUFVSRV9fKi8gbmV3IFdlYWtNYXAoKTtcclxuXHJcbi8qKlxyXG4gKiBUaGlzIG5vZGUgcmVwcmVzZW50cyB0aGUgc2NlbmUncyBsaWdodGluZyBhbmQgbWFuYWdlcyB0aGUgbGlnaHRpbmcgbW9kZWwncyBsaWZlIGN5Y2xlXHJcbiAqIGZvciB0aGUgY3VycmVudCBidWlsZCAzRCBvYmplY3QuIEl0IGlzIHJlc3BvbnNpYmxlIGZvciBjb21wdXRpbmcgdGhlIHRvdGFsIG91dGdvaW5nXHJcbiAqIGxpZ2h0IGluIGEgZ2l2ZW4gbGlnaHRpbmcgY29udGV4dC5cclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVcclxuICovXHJcbmNsYXNzIExpZ2h0c05vZGUgZXh0ZW5kcyBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnTGlnaHRzTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBsaWdodHMgbm9kZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHJcblx0XHRzdXBlciggJ3ZlYzMnICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIG5vZGUgcmVwcmVzZW50aW5nIHRoZSB0b3RhbCBkaWZmdXNlIGxpZ2h0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlPHZlYzM+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRvdGFsRGlmZnVzZU5vZGUgPSB2ZWMzKCkudG9WYXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgbm9kZSByZXByZXNlbnRpbmcgdGhlIHRvdGFsIHNwZWN1bGFyIGxpZ2h0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlPHZlYzM+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRvdGFsU3BlY3VsYXJOb2RlID0gdmVjMygpLnRvVmFyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIG5vZGUgcmVwcmVzZW50aW5nIHRoZSBvdXRnb2luZyBsaWdodC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZTx2ZWMzPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5vdXRnb2luZ0xpZ2h0Tm9kZSA9IHZlYzMoKS50b1ZhcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQW4gYXJyYXkgcmVwcmVzZW50aW5nIHRoZSBsaWdodHMgaW4gdGhlIHNjZW5lLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8TGlnaHQ+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9saWdodHMgPSBbXTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEZvciBlYWNoIGxpZ2h0IGluIHRoZSBzY2VuZSwgdGhpcyBub2RlIHdpbGwgY3JlYXRlIGFcclxuXHRcdCAqIGNvcnJlc3BvbmRpbmcgbGlnaHQgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUgez9BcnJheTxMaWdodGluZ05vZGU+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9saWdodE5vZGVzID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgaGFzaCBmb3IgaWRlbnRpZnlpbmcgdGhlIGN1cnJlbnQgbGlnaHQgbm9kZXMgc2V0dXAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHs/c3RyaW5nfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9saWdodE5vZGVzSGFzaCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBgTGlnaHRzTm9kZWAgc2V0cyB0aGlzIHByb3BlcnR5IHRvIGB0cnVlYCBieSBkZWZhdWx0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdsb2JhbCA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogT3ZlcndyaXRlcyB0aGUgZGVmYXVsdCB7QGxpbmsgTm9kZSNjdXN0b21DYWNoZUtleX0gaW1wbGVtZW50YXRpb24gYnkgaW5jbHVkaW5nIHRoZVxyXG5cdCAqIGxpZ2h0IElEcyBpbnRvIHRoZSBjYWNoZSBrZXkuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBjdXN0b20gY2FjaGUga2V5LlxyXG5cdCAqL1xyXG5cdGN1c3RvbUNhY2hlS2V5KCkge1xyXG5cclxuXHRcdGNvbnN0IGxpZ2h0SURzID0gW107XHJcblx0XHRjb25zdCBsaWdodHMgPSB0aGlzLl9saWdodHM7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgbGlnaHRzLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdGxpZ2h0SURzLnB1c2goIGxpZ2h0c1sgaSBdLmlkICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBoYXNoQXJyYXkoIGxpZ2h0SURzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgYSBoYXNoIHZhbHVlIGZvciBpZGVudGlmeWluZyB0aGUgY3VycmVudCBsaWdodCBub2RlcyBzZXR1cC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgY29tcHV0ZWQgaGFzaC5cclxuXHQgKi9cclxuXHRnZXRIYXNoKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5fbGlnaHROb2Rlc0hhc2ggPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMuX2xpZ2h0Tm9kZXMgPT09IG51bGwgKSB0aGlzLnNldHVwTGlnaHRzTm9kZSggYnVpbGRlciApO1xyXG5cclxuXHRcdFx0Y29uc3QgaGFzaCA9IFtdO1xyXG5cclxuXHRcdFx0Zm9yICggY29uc3QgbGlnaHROb2RlIG9mIHRoaXMuX2xpZ2h0Tm9kZXMgKSB7XHJcblxyXG5cdFx0XHRcdGhhc2gucHVzaCggbGlnaHROb2RlLmdldFNlbGYoKS5nZXRIYXNoKCkgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuX2xpZ2h0Tm9kZXNIYXNoID0gJ2xpZ2h0cy0nICsgaGFzaC5qb2luKCAnLCcgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX2xpZ2h0Tm9kZXNIYXNoO1xyXG5cclxuXHR9XHJcblxyXG5cdGFuYWx5emUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgcHJvcGVydGllcyA9IGJ1aWxkZXIuZ2V0RGF0YUZyb21Ob2RlKCB0aGlzICk7XHJcblxyXG5cdFx0Zm9yICggY29uc3Qgbm9kZSBvZiBwcm9wZXJ0aWVzLm5vZGVzICkge1xyXG5cclxuXHRcdFx0bm9kZS5idWlsZCggYnVpbGRlciApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGxpZ2h0aW5nIG5vZGVzIGZvciBlYWNoIHNjZW5lIGxpZ2h0LiBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGZ1cnRoZXJcclxuXHQgKiBwcm9jZXNzIGxpZ2h0cyBpbiB0aGUgbm9kZSBzeXN0ZW0uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqL1xyXG5cdHNldHVwTGlnaHRzTm9kZSggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCBsaWdodE5vZGVzID0gW107XHJcblxyXG5cdFx0Y29uc3QgcHJldmlvdXNMaWdodE5vZGVzID0gdGhpcy5fbGlnaHROb2RlcztcclxuXHJcblx0XHRjb25zdCBsaWdodHMgPSBzb3J0TGlnaHRzKCB0aGlzLl9saWdodHMgKTtcclxuXHRcdGNvbnN0IG5vZGVMaWJyYXJ5ID0gYnVpbGRlci5yZW5kZXJlci5saWJyYXJ5O1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IGxpZ2h0IG9mIGxpZ2h0cyApIHtcclxuXHJcblx0XHRcdGlmICggbGlnaHQuaXNOb2RlICkge1xyXG5cclxuXHRcdFx0XHRsaWdodE5vZGVzLnB1c2goIG5vZGVPYmplY3QoIGxpZ2h0ICkgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGxldCBsaWdodE5vZGUgPSBudWxsO1xyXG5cclxuXHRcdFx0XHRpZiAoIHByZXZpb3VzTGlnaHROb2RlcyAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHRsaWdodE5vZGUgPSBnZXRMaWdodE5vZGVCeUlkKCBsaWdodC5pZCwgcHJldmlvdXNMaWdodE5vZGVzICk7IC8vIHJldXNlIGV4aXN0aW5nIGxpZ2h0IG5vZGVcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoIGxpZ2h0Tm9kZSA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHQvLyBmaW5kIHRoZSBjb3JyZXNwb25kaW5nIG5vZGUgdHlwZSBmb3IgYSBnaXZlbiBsaWdodFxyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGxpZ2h0Tm9kZUNsYXNzID0gbm9kZUxpYnJhcnkuZ2V0TGlnaHROb2RlQ2xhc3MoIGxpZ2h0LmNvbnN0cnVjdG9yICk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBsaWdodE5vZGVDbGFzcyA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnNvbGUud2FybiggYExpZ2h0c05vZGUuc2V0dXBOb2RlTGlnaHRzOiBMaWdodCBub2RlIG5vdCBmb3VuZCBmb3IgJHsgbGlnaHQuY29uc3RydWN0b3IubmFtZSB9YCApO1xyXG5cdFx0XHRcdFx0XHRjb250aW51ZTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0bGV0IGxpZ2h0Tm9kZSA9IG51bGw7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCAhIF9saWdodHNOb2RlUmVmLmhhcyggbGlnaHQgKSApIHtcclxuXHJcblx0XHRcdFx0XHRcdGxpZ2h0Tm9kZSA9IG5vZGVPYmplY3QoIG5ldyBsaWdodE5vZGVDbGFzcyggbGlnaHQgKSApO1xyXG5cdFx0XHRcdFx0XHRfbGlnaHRzTm9kZVJlZi5zZXQoIGxpZ2h0LCBsaWdodE5vZGUgKTtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0bGlnaHROb2RlID0gX2xpZ2h0c05vZGVSZWYuZ2V0KCBsaWdodCApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRsaWdodE5vZGVzLnB1c2goIGxpZ2h0Tm9kZSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuX2xpZ2h0Tm9kZXMgPSBsaWdodE5vZGVzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdXAgYSBkaXJlY3QgbGlnaHQgaW4gdGhlIGxpZ2h0aW5nIG1vZGVsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGJ1aWxkZXIgLSBUaGUgYnVpbGRlciBvYmplY3QgY29udGFpbmluZyB0aGUgY29udGV4dCBhbmQgc3RhY2suXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGxpZ2h0Tm9kZSAtIFRoZSBsaWdodCBub2RlLlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBsaWdodERhdGEgLSBUaGUgbGlnaHQgb2JqZWN0IGNvbnRhaW5pbmcgY29sb3IgYW5kIGRpcmVjdGlvbiBwcm9wZXJ0aWVzLlxyXG5cdCAqL1xyXG5cdHNldHVwRGlyZWN0TGlnaHQoIGJ1aWxkZXIsIGxpZ2h0Tm9kZSwgbGlnaHREYXRhICkge1xyXG5cclxuXHRcdGNvbnN0IHsgbGlnaHRpbmdNb2RlbCwgcmVmbGVjdGVkTGlnaHQgfSA9IGJ1aWxkZXIuY29udGV4dDtcclxuXHJcblx0XHRsaWdodGluZ01vZGVsLmRpcmVjdCgge1xyXG5cdFx0XHQuLi5saWdodERhdGEsXHJcblx0XHRcdGxpZ2h0Tm9kZSxcclxuXHRcdFx0cmVmbGVjdGVkTGlnaHRcclxuXHRcdH0sIGJ1aWxkZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHRzZXR1cERpcmVjdFJlY3RBcmVhTGlnaHQoIGJ1aWxkZXIsIGxpZ2h0Tm9kZSwgbGlnaHREYXRhICkge1xyXG5cclxuXHRcdGNvbnN0IHsgbGlnaHRpbmdNb2RlbCwgcmVmbGVjdGVkTGlnaHQgfSA9IGJ1aWxkZXIuY29udGV4dDtcclxuXHJcblx0XHRsaWdodGluZ01vZGVsLmRpcmVjdFJlY3RBcmVhKCB7XHJcblx0XHRcdC4uLmxpZ2h0RGF0YSxcclxuXHRcdFx0bGlnaHROb2RlLFxyXG5cdFx0XHRyZWZsZWN0ZWRMaWdodFxyXG5cdFx0fSwgYnVpbGRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHVwcyB0aGUgaW50ZXJuYWwgbGlnaHRzIGJ5IGJ1aWxkaW5nIGFsbCByZXNwZWN0aXZlXHJcblx0ICogbGlnaHQgbm9kZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8TGlnaHRpbmdOb2RlPn0gbGlnaHROb2RlcyAtIEFuIGFycmF5IG9mIGxpZ2h0aW5nIG5vZGVzLlxyXG5cdCAqL1xyXG5cdHNldHVwTGlnaHRzKCBidWlsZGVyLCBsaWdodE5vZGVzICkge1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IGxpZ2h0Tm9kZSBvZiBsaWdodE5vZGVzICkge1xyXG5cclxuXHRcdFx0bGlnaHROb2RlLmJ1aWxkKCBidWlsZGVyICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGdldExpZ2h0Tm9kZXMoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9saWdodE5vZGVzID09PSBudWxsICkgdGhpcy5zZXR1cExpZ2h0c05vZGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fbGlnaHROb2RlcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgaW1wbGVtZW50YXRpb24gbWFrZXMgc3VyZSB0aGF0IGZvciBlYWNoIGxpZ2h0IGluIHRoZSBzY2VuZVxyXG5cdCAqIHRoZXJlIGlzIGEgY29ycmVzcG9uZGluZyBsaWdodCBub2RlLiBCeSBidWlsZGluZyB0aGUgbGlnaHQgbm9kZXNcclxuXHQgKiBhbmQgZXZhbHVhdGluZyB0aGUgbGlnaHRpbmcgbW9kZWwgdGhlIG91dGdvaW5nIGxpZ2h0IGlzIGNvbXB1dGVkLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtOb2RlPHZlYzM+fSBBIG5vZGUgcmVwcmVzZW50aW5nIHRoZSBvdXRnb2luZyBsaWdodC5cclxuXHQgKi9cclxuXHRzZXR1cCggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCBjdXJyZW50TGlnaHRzTm9kZSA9IGJ1aWxkZXIubGlnaHRzTm9kZTtcclxuXHJcblx0XHRidWlsZGVyLmxpZ2h0c05vZGUgPSB0aGlzO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0bGV0IG91dGdvaW5nTGlnaHROb2RlID0gdGhpcy5vdXRnb2luZ0xpZ2h0Tm9kZTtcclxuXHJcblx0XHRjb25zdCBjb250ZXh0ID0gYnVpbGRlci5jb250ZXh0O1xyXG5cdFx0Y29uc3QgbGlnaHRpbmdNb2RlbCA9IGNvbnRleHQubGlnaHRpbmdNb2RlbDtcclxuXHJcblx0XHRjb25zdCBwcm9wZXJ0aWVzID0gYnVpbGRlci5nZXREYXRhRnJvbU5vZGUoIHRoaXMgKTtcclxuXHJcblx0XHRpZiAoIGxpZ2h0aW5nTW9kZWwgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB7IHRvdGFsRGlmZnVzZU5vZGUsIHRvdGFsU3BlY3VsYXJOb2RlIH0gPSB0aGlzO1xyXG5cclxuXHRcdFx0Y29udGV4dC5vdXRnb2luZ0xpZ2h0ID0gb3V0Z29pbmdMaWdodE5vZGU7XHJcblxyXG5cdFx0XHRjb25zdCBzdGFjayA9IGJ1aWxkZXIuYWRkU3RhY2soKTtcclxuXHJcblx0XHRcdC8vXHJcblxyXG5cdFx0XHRwcm9wZXJ0aWVzLm5vZGVzID0gc3RhY2subm9kZXM7XHJcblxyXG5cdFx0XHQvL1xyXG5cclxuXHRcdFx0bGlnaHRpbmdNb2RlbC5zdGFydCggYnVpbGRlciApO1xyXG5cclxuXHRcdFx0Ly9cclxuXHJcblx0XHRcdGNvbnN0IHsgYmFja2Ryb3AsIGJhY2tkcm9wQWxwaGEgfSA9IGNvbnRleHQ7XHJcblx0XHRcdGNvbnN0IHsgZGlyZWN0RGlmZnVzZSwgZGlyZWN0U3BlY3VsYXIsIGluZGlyZWN0RGlmZnVzZSwgaW5kaXJlY3RTcGVjdWxhciB9ID0gY29udGV4dC5yZWZsZWN0ZWRMaWdodDtcclxuXHJcblx0XHRcdGxldCB0b3RhbERpZmZ1c2UgPSBkaXJlY3REaWZmdXNlLmFkZCggaW5kaXJlY3REaWZmdXNlICk7XHJcblxyXG5cdFx0XHRpZiAoIGJhY2tkcm9wICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIGJhY2tkcm9wQWxwaGEgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdFx0dG90YWxEaWZmdXNlID0gdmVjMyggYmFja2Ryb3BBbHBoYS5taXgoIHRvdGFsRGlmZnVzZSwgYmFja2Ryb3AgKSApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdHRvdGFsRGlmZnVzZSA9IHZlYzMoIGJhY2tkcm9wICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Y29udGV4dC5tYXRlcmlhbC50cmFuc3BhcmVudCA9IHRydWU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0b3RhbERpZmZ1c2VOb2RlLmFzc2lnbiggdG90YWxEaWZmdXNlICk7XHJcblx0XHRcdHRvdGFsU3BlY3VsYXJOb2RlLmFzc2lnbiggZGlyZWN0U3BlY3VsYXIuYWRkKCBpbmRpcmVjdFNwZWN1bGFyICkgKTtcclxuXHJcblx0XHRcdG91dGdvaW5nTGlnaHROb2RlLmFzc2lnbiggdG90YWxEaWZmdXNlTm9kZS5hZGQoIHRvdGFsU3BlY3VsYXJOb2RlICkgKTtcclxuXHJcblx0XHRcdC8vXHJcblxyXG5cdFx0XHRsaWdodGluZ01vZGVsLmZpbmlzaCggYnVpbGRlciApO1xyXG5cclxuXHRcdFx0Ly9cclxuXHJcblx0XHRcdG91dGdvaW5nTGlnaHROb2RlID0gb3V0Z29pbmdMaWdodE5vZGUuYnlwYXNzKCBidWlsZGVyLnJlbW92ZVN0YWNrKCkgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0cHJvcGVydGllcy5ub2RlcyA9IFtdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGJ1aWxkZXIubGlnaHRzTm9kZSA9IGN1cnJlbnRMaWdodHNOb2RlO1xyXG5cclxuXHRcdHJldHVybiBvdXRnb2luZ0xpZ2h0Tm9kZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25maWd1cmVzIHRoaXMgbm9kZSB3aXRoIGFuIGFycmF5IG9mIGxpZ2h0cy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8TGlnaHQ+fSBsaWdodHMgLSBBbiBhcnJheSBvZiBsaWdodHMuXHJcblx0ICogQHJldHVybiB7TGlnaHRzTm9kZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBub2RlLlxyXG5cdCAqL1xyXG5cdHNldExpZ2h0cyggbGlnaHRzICkge1xyXG5cclxuXHRcdHRoaXMuX2xpZ2h0cyA9IGxpZ2h0cztcclxuXHJcblx0XHR0aGlzLl9saWdodE5vZGVzID0gbnVsbDtcclxuXHRcdHRoaXMuX2xpZ2h0Tm9kZXNIYXNoID0gbnVsbDtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHRoZSBzY2VuZSdzIGxpZ2h0cy5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0FycmF5PExpZ2h0Pn0gVGhlIHNjZW5lJ3MgbGlnaHRzLlxyXG5cdCAqL1xyXG5cdGdldExpZ2h0cygpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fbGlnaHRzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdoZXRoZXIgdGhlIHNjZW5lIGhhcyBsaWdodHMgb3Igbm90LlxyXG5cdCAqXHJcblx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0ICovXHJcblx0Z2V0IGhhc0xpZ2h0cygpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fbGlnaHRzLmxlbmd0aCA+IDA7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IExpZ2h0c05vZGU7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhbiBpbnN0YW5jZSBvZiBgTGlnaHRzTm9kZWAgYW5kIGNvbmZpZ3VyaW5nXHJcbiAqIGl0IHdpdGggdGhlIGdpdmVuIGFycmF5IG9mIGxpZ2h0cy5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtBcnJheTxMaWdodD59IGxpZ2h0cyAtIEFuIGFycmF5IG9mIGxpZ2h0cy5cclxuICogQHJldHVybiB7TGlnaHRzTm9kZX0gVGhlIGNyZWF0ZWQgbGlnaHRzIG5vZGUuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbGlnaHRzID0gKCBsaWdodHMgPSBbXSApID0+IG5vZGVPYmplY3QoIG5ldyBMaWdodHNOb2RlKCkgKS5zZXRMaWdodHMoIGxpZ2h0cyApO1xyXG4iLCJpbXBvcnQgTm9kZSBmcm9tICcuLi9jb3JlL05vZGUuanMnO1xyXG5pbXBvcnQgeyBOb2RlVXBkYXRlVHlwZSB9IGZyb20gJy4uL2NvcmUvY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcbmltcG9ydCB7IHBvc2l0aW9uV29ybGQgfSBmcm9tICcuLi9hY2Nlc3NvcnMvUG9zaXRpb24uanMnO1xyXG5cclxuLyoqXHJcbiAqIEJhc2UgY2xhc3MgZm9yIGFsbCBzaGFkb3cgbm9kZXMuXHJcbiAqXHJcbiAqIFNoYWRvdyBub2RlcyBlbmNhcHN1bGF0ZSBzaGFkb3cgcmVsYXRlZCBsb2dpYyBhbmQgYXJlIGFsd2F5cyBjb3VwbGVkIHRvIGxpZ2h0aW5nIG5vZGVzLlxyXG4gKiBMaWdodGluZyBub2RlcyBtaWdodCBzaGFyZSB0aGUgc2FtZSBzaGFkb3cgbm9kZSB0eXBlIG9yIHVzZSBzcGVjaWZpYyBvbmVzIGRlcGVuZGluZyBvblxyXG4gKiB0aGVpciByZXF1aXJlbWVudHMuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBOb2RlXHJcbiAqL1xyXG5jbGFzcyBTaGFkb3dCYXNlTm9kZSBleHRlbmRzIE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdTaGFkb3dCYXNlTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBzaGFkb3cgYmFzZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtMaWdodH0gbGlnaHQgLSBUaGUgc2hhZG93IGNhc3RpbmcgbGlnaHQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGxpZ2h0ICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc2hhZG93IGNhc3RpbmcgbGlnaHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0xpZ2h0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxpZ2h0ID0gbGlnaHQ7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBPdmVyd3JpdHRlbiBzaW5jZSBzaGFkb3dzIGFyZSB1cGRhdGVkIGJ5IGRlZmF1bHQgcGVyIHJlbmRlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICogQGRlZmF1bHQgJ3JlbmRlcidcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51cGRhdGVCZWZvcmVUeXBlID0gTm9kZVVwZGF0ZVR5cGUuUkVOREVSO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1NoYWRvd0Jhc2VOb2RlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXR1cHMgdGhlIHNoYWRvdyBwb3NpdGlvbiBub2RlIHdoaWNoIGlzIGJ5IGRlZmF1bHQgdGhlIHByZWRlZmluZWQgVFNMIG5vZGUgb2JqZWN0IGBzaGFkb3dQb3NpdGlvbldvcmxkYC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IG9iamVjdCAtIEEgY29uZmlndXJhdGlvbiBvYmplY3QgdGhhdCBtdXN0IGF0IGxlYXN0IGhvbGQgYSBtYXRlcmlhbCByZWZlcmVuY2UuXHJcblx0ICovXHJcblx0c2V0dXBTaGFkb3dQb3NpdGlvbiggeyBjb250ZXh0LCBtYXRlcmlhbCB9ICkge1xyXG5cclxuXHRcdC8vIFVzZSBhc3NpZ24gaW5zaWRlIGFuIEZuKClcclxuXHJcblx0XHRzaGFkb3dQb3NpdGlvbldvcmxkLmFzc2lnbiggbWF0ZXJpYWwuc2hhZG93UG9zaXRpb25Ob2RlIHx8IGNvbnRleHQuc2hhZG93UG9zaXRpb25Xb3JsZCB8fCBwb3NpdGlvbldvcmxkICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2FuIGJlIGNhbGxlZCB3aGVuIHRoZSBzaGFkb3cgaXNuJ3QgcmVxdWlyZWQgYW55bW9yZS4gVGhhdCBjYW4gaGFwcGVuIHdoZW5cclxuXHQgKiBhIGxpZ2h0aW5nIG5vZGUgc3RvcHMgY2FzdGluZyBzaGFkb3dzIGJ5IHNldHRpbmcge0BsaW5rIE9iamVjdDNEI2Nhc3RTaGFkb3d9XHJcblx0ICogdG8gYGZhbHNlYC5cclxuXHQgKi9cclxuXHRkaXNwb3NlKCkge1xyXG5cclxuXHRcdHRoaXMudXBkYXRlQmVmb3JlVHlwZSA9IE5vZGVVcGRhdGVUeXBlLk5PTkU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgdmVydGV4IHBvc2l0aW9uIGluIHdvcmxkIHNwYWNlIGR1cmluZyB0aGUgc2hhZG93IHBhc3MuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8dmVjMz59XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgc2hhZG93UG9zaXRpb25Xb3JsZCA9IC8qQF9fUFVSRV9fKi8gcHJvcGVydHkoICd2ZWMzJywgJ3NoYWRvd1Bvc2l0aW9uV29ybGQnICk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTaGFkb3dCYXNlTm9kZTtcclxuIiwiaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi8uLi9tYXRoL0NvbG9yLmpzJztcclxuXHJcbi8qKlxyXG4gKiBTYXZlcyB0aGUgc3RhdGUgb2YgdGhlIGdpdmVuIHJlbmRlcmVyIGFuZCBzdG9yZXMgaXQgaW50byB0aGUgZ2l2ZW4gc3RhdGUgb2JqZWN0LlxyXG4gKlxyXG4gKiBJZiBub3Qgc3RhdGUgb2JqZWN0IGlzIHByb3ZpZGVkLCB0aGUgZnVuY3Rpb24gY3JlYXRlcyBvbmUuXHJcbiAqXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge1JlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuICogQHBhcmFtIHtPYmplY3R9IFtzdGF0ZT17fV0gLSBUaGUgc3RhdGUuXHJcbiAqIEByZXR1cm4ge09iamVjdH0gVGhlIHN0YXRlLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHNhdmVSZW5kZXJlclN0YXRlKCByZW5kZXJlciwgc3RhdGUgPSB7fSApIHtcclxuXHJcblx0c3RhdGUudG9uZU1hcHBpbmcgPSByZW5kZXJlci50b25lTWFwcGluZztcclxuXHRzdGF0ZS50b25lTWFwcGluZ0V4cG9zdXJlID0gcmVuZGVyZXIudG9uZU1hcHBpbmdFeHBvc3VyZTtcclxuXHRzdGF0ZS5vdXRwdXRDb2xvclNwYWNlID0gcmVuZGVyZXIub3V0cHV0Q29sb3JTcGFjZTtcclxuXHRzdGF0ZS5yZW5kZXJUYXJnZXQgPSByZW5kZXJlci5nZXRSZW5kZXJUYXJnZXQoKTtcclxuXHRzdGF0ZS5hY3RpdmVDdWJlRmFjZSA9IHJlbmRlcmVyLmdldEFjdGl2ZUN1YmVGYWNlKCk7XHJcblx0c3RhdGUuYWN0aXZlTWlwbWFwTGV2ZWwgPSByZW5kZXJlci5nZXRBY3RpdmVNaXBtYXBMZXZlbCgpO1xyXG5cdHN0YXRlLnJlbmRlck9iamVjdEZ1bmN0aW9uID0gcmVuZGVyZXIuZ2V0UmVuZGVyT2JqZWN0RnVuY3Rpb24oKTtcclxuXHRzdGF0ZS5waXhlbFJhdGlvID0gcmVuZGVyZXIuZ2V0UGl4ZWxSYXRpbygpO1xyXG5cdHN0YXRlLm1ydCA9IHJlbmRlcmVyLmdldE1SVCgpO1xyXG5cdHN0YXRlLmNsZWFyQ29sb3IgPSByZW5kZXJlci5nZXRDbGVhckNvbG9yKCBzdGF0ZS5jbGVhckNvbG9yIHx8IG5ldyBDb2xvcigpICk7XHJcblx0c3RhdGUuY2xlYXJBbHBoYSA9IHJlbmRlcmVyLmdldENsZWFyQWxwaGEoKTtcclxuXHRzdGF0ZS5hdXRvQ2xlYXIgPSByZW5kZXJlci5hdXRvQ2xlYXI7XHJcblx0c3RhdGUuc2Npc3NvclRlc3QgPSByZW5kZXJlci5nZXRTY2lzc29yVGVzdCgpO1xyXG5cclxuXHRyZXR1cm4gc3RhdGU7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogU2F2ZXMgdGhlIHN0YXRlIG9mIHRoZSBnaXZlbiByZW5kZXJlciBhbmQgc3RvcmVzIGl0IGludG8gdGhlIGdpdmVuIHN0YXRlIG9iamVjdC5cclxuICogQmVzaWRlcywgdGhlIGZ1bmN0aW9uIGFsc28gcmVzZXRzIHRoZSBzdGF0ZSBvZiB0aGUgcmVuZGVyZXIgdG8gaXRzIGRlZmF1bHQgdmFsdWVzLlxyXG4gKlxyXG4gKiBJZiBub3Qgc3RhdGUgb2JqZWN0IGlzIHByb3ZpZGVkLCB0aGUgZnVuY3Rpb24gY3JlYXRlcyBvbmUuXHJcbiAqXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge1JlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuICogQHBhcmFtIHtPYmplY3R9IFtzdGF0ZT17fV0gLSBUaGUgc3RhdGUuXHJcbiAqIEByZXR1cm4ge09iamVjdH0gVGhlIHN0YXRlLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0UmVuZGVyZXJTdGF0ZSggcmVuZGVyZXIsIHN0YXRlICkge1xyXG5cclxuXHRzdGF0ZSA9IHNhdmVSZW5kZXJlclN0YXRlKCByZW5kZXJlciwgc3RhdGUgKTtcclxuXHJcblx0cmVuZGVyZXIuc2V0TVJUKCBudWxsICk7XHJcblx0cmVuZGVyZXIuc2V0UmVuZGVyT2JqZWN0RnVuY3Rpb24oIG51bGwgKTtcclxuXHRyZW5kZXJlci5zZXRDbGVhckNvbG9yKCAweDAwMDAwMCwgMSApO1xyXG5cdHJlbmRlcmVyLmF1dG9DbGVhciA9IHRydWU7XHJcblxyXG5cdHJldHVybiBzdGF0ZTtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXN0b3JlcyB0aGUgc3RhdGUgb2YgdGhlIGdpdmVuIHJlbmRlcmVyIGZyb20gdGhlIGdpdmVuIHN0YXRlIG9iamVjdC5cclxuICpcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7UmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhdGUgLSBUaGUgc3RhdGUgdG8gcmVzdG9yZS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiByZXN0b3JlUmVuZGVyZXJTdGF0ZSggcmVuZGVyZXIsIHN0YXRlICkge1xyXG5cclxuXHRyZW5kZXJlci50b25lTWFwcGluZyA9IHN0YXRlLnRvbmVNYXBwaW5nO1xyXG5cdHJlbmRlcmVyLnRvbmVNYXBwaW5nRXhwb3N1cmUgPSBzdGF0ZS50b25lTWFwcGluZ0V4cG9zdXJlO1xyXG5cdHJlbmRlcmVyLm91dHB1dENvbG9yU3BhY2UgPSBzdGF0ZS5vdXRwdXRDb2xvclNwYWNlO1xyXG5cdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggc3RhdGUucmVuZGVyVGFyZ2V0LCBzdGF0ZS5hY3RpdmVDdWJlRmFjZSwgc3RhdGUuYWN0aXZlTWlwbWFwTGV2ZWwgKTtcclxuXHRyZW5kZXJlci5zZXRSZW5kZXJPYmplY3RGdW5jdGlvbiggc3RhdGUucmVuZGVyT2JqZWN0RnVuY3Rpb24gKTtcclxuXHRyZW5kZXJlci5zZXRQaXhlbFJhdGlvKCBzdGF0ZS5waXhlbFJhdGlvICk7XHJcblx0cmVuZGVyZXIuc2V0TVJUKCBzdGF0ZS5tcnQgKTtcclxuXHRyZW5kZXJlci5zZXRDbGVhckNvbG9yKCBzdGF0ZS5jbGVhckNvbG9yLCBzdGF0ZS5jbGVhckFscGhhICk7XHJcblx0cmVuZGVyZXIuYXV0b0NsZWFyID0gc3RhdGUuYXV0b0NsZWFyO1xyXG5cdHJlbmRlcmVyLnNldFNjaXNzb3JUZXN0KCBzdGF0ZS5zY2lzc29yVGVzdCApO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFNhdmVzIHRoZSBzdGF0ZSBvZiB0aGUgZ2l2ZW4gc2NlbmUgYW5kIHN0b3JlcyBpdCBpbnRvIHRoZSBnaXZlbiBzdGF0ZSBvYmplY3QuXHJcbiAqXHJcbiAqIElmIG5vdCBzdGF0ZSBvYmplY3QgaXMgcHJvdmlkZWQsIHRoZSBmdW5jdGlvbiBjcmVhdGVzIG9uZS5cclxuICpcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7U2NlbmV9IHNjZW5lIC0gVGhlIHNjZW5lLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gW3N0YXRlPXt9XSAtIFRoZSBzdGF0ZS5cclxuICogQHJldHVybiB7T2JqZWN0fSBUaGUgc3RhdGUuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gc2F2ZVNjZW5lU3RhdGUoIHNjZW5lLCBzdGF0ZSA9IHt9ICkge1xyXG5cclxuXHRzdGF0ZS5iYWNrZ3JvdW5kID0gc2NlbmUuYmFja2dyb3VuZDtcclxuXHRzdGF0ZS5iYWNrZ3JvdW5kTm9kZSA9IHNjZW5lLmJhY2tncm91bmROb2RlO1xyXG5cdHN0YXRlLm92ZXJyaWRlTWF0ZXJpYWwgPSBzY2VuZS5vdmVycmlkZU1hdGVyaWFsO1xyXG5cclxuXHRyZXR1cm4gc3RhdGU7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogU2F2ZXMgdGhlIHN0YXRlIG9mIHRoZSBnaXZlbiBzY2VuZSBhbmQgc3RvcmVzIGl0IGludG8gdGhlIGdpdmVuIHN0YXRlIG9iamVjdC5cclxuICogQmVzaWRlcywgdGhlIGZ1bmN0aW9uIGFsc28gcmVzZXRzIHRoZSBzdGF0ZSBvZiB0aGUgc2NlbmUgdG8gaXRzIGRlZmF1bHQgdmFsdWVzLlxyXG4gKlxyXG4gKiBJZiBub3Qgc3RhdGUgb2JqZWN0IGlzIHByb3ZpZGVkLCB0aGUgZnVuY3Rpb24gY3JlYXRlcyBvbmUuXHJcbiAqXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge1NjZW5lfSBzY2VuZSAtIFRoZSBzY2VuZS5cclxuICogQHBhcmFtIHtPYmplY3R9IFtzdGF0ZT17fV0gLSBUaGUgc3RhdGUuXHJcbiAqIEByZXR1cm4ge09iamVjdH0gVGhlIHN0YXRlLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0U2NlbmVTdGF0ZSggc2NlbmUsIHN0YXRlICkge1xyXG5cclxuXHRzdGF0ZSA9IHNhdmVTY2VuZVN0YXRlKCBzY2VuZSwgc3RhdGUgKTtcclxuXHJcblx0c2NlbmUuYmFja2dyb3VuZCA9IG51bGw7XHJcblx0c2NlbmUuYmFja2dyb3VuZE5vZGUgPSBudWxsO1xyXG5cdHNjZW5lLm92ZXJyaWRlTWF0ZXJpYWwgPSBudWxsO1xyXG5cclxuXHRyZXR1cm4gc3RhdGU7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogUmVzdG9yZXMgdGhlIHN0YXRlIG9mIHRoZSBnaXZlbiBzY2VuZSBmcm9tIHRoZSBnaXZlbiBzdGF0ZSBvYmplY3QuXHJcbiAqXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge1NjZW5lfSBzY2VuZSAtIFRoZSBzY2VuZS5cclxuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlIC0gVGhlIHN0YXRlIHRvIHJlc3RvcmUuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcmVzdG9yZVNjZW5lU3RhdGUoIHNjZW5lLCBzdGF0ZSApIHtcclxuXHJcblx0c2NlbmUuYmFja2dyb3VuZCA9IHN0YXRlLmJhY2tncm91bmQ7XHJcblx0c2NlbmUuYmFja2dyb3VuZE5vZGUgPSBzdGF0ZS5iYWNrZ3JvdW5kTm9kZTtcclxuXHRzY2VuZS5vdmVycmlkZU1hdGVyaWFsID0gc3RhdGUub3ZlcnJpZGVNYXRlcmlhbDtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTYXZlcyB0aGUgc3RhdGUgb2YgdGhlIGdpdmVuIHJlbmRlcmVyIGFuZCBzY2VuZSBhbmQgc3RvcmVzIGl0IGludG8gdGhlIGdpdmVuIHN0YXRlIG9iamVjdC5cclxuICpcclxuICogSWYgbm90IHN0YXRlIG9iamVjdCBpcyBwcm92aWRlZCwgdGhlIGZ1bmN0aW9uIGNyZWF0ZXMgb25lLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcbiAqIEBwYXJhbSB7U2NlbmV9IHNjZW5lIC0gVGhlIHNjZW5lLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gW3N0YXRlPXt9XSAtIFRoZSBzdGF0ZS5cclxuICogQHJldHVybiB7T2JqZWN0fSBUaGUgc3RhdGUuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gc2F2ZVJlbmRlcmVyQW5kU2NlbmVTdGF0ZSggcmVuZGVyZXIsIHNjZW5lLCBzdGF0ZSA9IHt9ICkge1xyXG5cclxuXHRzdGF0ZSA9IHNhdmVSZW5kZXJlclN0YXRlKCByZW5kZXJlciwgc3RhdGUgKTtcclxuXHRzdGF0ZSA9IHNhdmVTY2VuZVN0YXRlKCBzY2VuZSwgc3RhdGUgKTtcclxuXHJcblx0cmV0dXJuIHN0YXRlO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFNhdmVzIHRoZSBzdGF0ZSBvZiB0aGUgZ2l2ZW4gcmVuZGVyZXIgYW5kIHNjZW5lIGFuZCBzdG9yZXMgaXQgaW50byB0aGUgZ2l2ZW4gc3RhdGUgb2JqZWN0LlxyXG4gKiBCZXNpZGVzLCB0aGUgZnVuY3Rpb24gYWxzbyByZXNldHMgdGhlIHN0YXRlIG9mIHRoZSByZW5kZXJlciBhbmQgc2NlbmUgdG8gaXRzIGRlZmF1bHQgdmFsdWVzLlxyXG4gKlxyXG4gKiBJZiBub3Qgc3RhdGUgb2JqZWN0IGlzIHByb3ZpZGVkLCB0aGUgZnVuY3Rpb24gY3JlYXRlcyBvbmUuXHJcbiAqXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge1JlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuICogQHBhcmFtIHtTY2VuZX0gc2NlbmUgLSBUaGUgc2NlbmUuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhdGU9e31dIC0gVGhlIHN0YXRlLlxyXG4gKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBzdGF0ZS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiByZXNldFJlbmRlcmVyQW5kU2NlbmVTdGF0ZSggcmVuZGVyZXIsIHNjZW5lLCBzdGF0ZSApIHtcclxuXHJcblx0c3RhdGUgPSByZXNldFJlbmRlcmVyU3RhdGUoIHJlbmRlcmVyLCBzdGF0ZSApO1xyXG5cdHN0YXRlID0gcmVzZXRTY2VuZVN0YXRlKCBzY2VuZSwgc3RhdGUgKTtcclxuXHJcblx0cmV0dXJuIHN0YXRlO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFJlc3RvcmVzIHRoZSBzdGF0ZSBvZiB0aGUgZ2l2ZW4gcmVuZGVyZXIgYW5kIHNjZW5lIGZyb20gdGhlIGdpdmVuIHN0YXRlIG9iamVjdC5cclxuICpcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7UmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG4gKiBAcGFyYW0ge1NjZW5lfSBzY2VuZSAtIFRoZSBzY2VuZS5cclxuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlIC0gVGhlIHN0YXRlIHRvIHJlc3RvcmUuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcmVzdG9yZVJlbmRlcmVyQW5kU2NlbmVTdGF0ZSggcmVuZGVyZXIsIHNjZW5lLCBzdGF0ZSApIHtcclxuXHJcblx0cmVzdG9yZVJlbmRlcmVyU3RhdGUoIHJlbmRlcmVyLCBzdGF0ZSApO1xyXG5cdHJlc3RvcmVTY2VuZVN0YXRlKCBzY2VuZSwgc3RhdGUgKTtcclxuXHJcbn1cclxuIiwiaW1wb3J0IFNoYWRvd0Jhc2VOb2RlLCB7IHNoYWRvd1Bvc2l0aW9uV29ybGQgfSBmcm9tICcuL1NoYWRvd0Jhc2VOb2RlLmpzJztcclxuaW1wb3J0IHsgZmxvYXQsIHZlYzIsIHZlYzMsIHZlYzQsIElmLCBpbnQsIEZuLCBub2RlT2JqZWN0IH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5pbXBvcnQgeyByZWZlcmVuY2UgfSBmcm9tICcuLi9hY2Nlc3NvcnMvUmVmZXJlbmNlTm9kZS5qcyc7XHJcbmltcG9ydCB7IHRleHR1cmUgfSBmcm9tICcuLi9hY2Nlc3NvcnMvVGV4dHVyZU5vZGUuanMnO1xyXG5pbXBvcnQgeyBwb3NpdGlvbldvcmxkIH0gZnJvbSAnLi4vYWNjZXNzb3JzL1Bvc2l0aW9uLmpzJztcclxuaW1wb3J0IHsgdHJhbnNmb3JtZWROb3JtYWxXb3JsZCB9IGZyb20gJy4uL2FjY2Vzc29ycy9Ob3JtYWwuanMnO1xyXG5pbXBvcnQgeyBtaXgsIGZyYWN0LCBzdGVwLCBtYXgsIGNsYW1wLCBzcXJ0IH0gZnJvbSAnLi4vbWF0aC9NYXRoTm9kZS5qcyc7XHJcbmltcG9ydCB7IGFkZCwgc3ViIH0gZnJvbSAnLi4vbWF0aC9PcGVyYXRvck5vZGUuanMnO1xyXG5pbXBvcnQgeyBEZXB0aFRleHR1cmUgfSBmcm9tICcuLi8uLi90ZXh0dXJlcy9EZXB0aFRleHR1cmUuanMnO1xyXG5pbXBvcnQgTm9kZU1hdGVyaWFsIGZyb20gJy4uLy4uL21hdGVyaWFscy9ub2Rlcy9Ob2RlTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgUXVhZE1lc2ggZnJvbSAnLi4vLi4vcmVuZGVyZXJzL2NvbW1vbi9RdWFkTWVzaC5qcyc7XHJcbmltcG9ydCB7IExvb3AgfSBmcm9tICcuLi91dGlscy9Mb29wTm9kZS5qcyc7XHJcbmltcG9ydCB7IHNjcmVlbkNvb3JkaW5hdGUgfSBmcm9tICcuLi9kaXNwbGF5L1NjcmVlbk5vZGUuanMnO1xyXG5pbXBvcnQgeyBIYWxmRmxvYXRUeXBlLCBMZXNzQ29tcGFyZSwgUkdGb3JtYXQsIFZTTVNoYWRvd01hcCwgV2ViR1BVQ29vcmRpbmF0ZVN5c3RlbSB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IHJlbmRlckdyb3VwIH0gZnJvbSAnLi4vY29yZS9Vbmlmb3JtR3JvdXBOb2RlLmpzJztcclxuaW1wb3J0IHsgdmlld1pUb0xvZ2FyaXRobWljRGVwdGggfSBmcm9tICcuLi9kaXNwbGF5L1ZpZXdwb3J0RGVwdGhOb2RlLmpzJztcclxuaW1wb3J0IHsgb2JqZWN0UG9zaXRpb24gfSBmcm9tICcuLi9hY2Nlc3NvcnMvT2JqZWN0M0ROb2RlLmpzJztcclxuaW1wb3J0IHsgbGlnaHRTaGFkb3dNYXRyaXggfSBmcm9tICcuLi9hY2Nlc3NvcnMvTGlnaHRzLmpzJztcclxuaW1wb3J0IHsgcmVzZXRSZW5kZXJlckFuZFNjZW5lU3RhdGUsIHJlc3RvcmVSZW5kZXJlckFuZFNjZW5lU3RhdGUgfSBmcm9tICcuLi8uLi9yZW5kZXJlcnMvY29tbW9uL1JlbmRlcmVyVXRpbHMuanMnO1xyXG5pbXBvcnQgeyBnZXREYXRhRnJvbU9iamVjdCB9IGZyb20gJy4uL2NvcmUvTm9kZVV0aWxzLmpzJztcclxuXHJcbmNvbnN0IHNoYWRvd01hdGVyaWFsTGliID0gLypAX19QVVJFX18qLyBuZXcgV2Vha01hcCgpO1xyXG5jb25zdCBsaW5lYXJEaXN0YW5jZSA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyBwb3NpdGlvbiwgY2FtZXJhTmVhciwgY2FtZXJhRmFyIF0gKSA9PiB7XHJcblxyXG5cdGxldCBkaXN0ID0gcG9zaXRpb25Xb3JsZC5zdWIoIHBvc2l0aW9uICkubGVuZ3RoKCk7XHJcblx0ZGlzdCA9IGRpc3Quc3ViKCBjYW1lcmFOZWFyICkuZGl2KCBjYW1lcmFGYXIuc3ViKCBjYW1lcmFOZWFyICkgKTtcclxuXHRkaXN0ID0gZGlzdC5zYXR1cmF0ZSgpOyAvLyBjbGFtcCB0byBbIDAsIDEgXVxyXG5cclxuXHRyZXR1cm4gZGlzdDtcclxuXHJcbn0gKTtcclxuXHJcbmNvbnN0IGxpbmVhclNoYWRvd0Rpc3RhbmNlID0gKCBsaWdodCApID0+IHtcclxuXHJcblx0Y29uc3QgY2FtZXJhID0gbGlnaHQuc2hhZG93LmNhbWVyYTtcclxuXHJcblx0Y29uc3QgbmVhckRpc3RhbmNlID0gcmVmZXJlbmNlKCAnbmVhcicsICdmbG9hdCcsIGNhbWVyYSApLnNldEdyb3VwKCByZW5kZXJHcm91cCApO1xyXG5cdGNvbnN0IGZhckRpc3RhbmNlID0gcmVmZXJlbmNlKCAnZmFyJywgJ2Zsb2F0JywgY2FtZXJhICkuc2V0R3JvdXAoIHJlbmRlckdyb3VwICk7XHJcblxyXG5cdGNvbnN0IHJlZmVyZW5jZVBvc2l0aW9uID0gb2JqZWN0UG9zaXRpb24oIGxpZ2h0ICk7XHJcblxyXG5cdHJldHVybiBsaW5lYXJEaXN0YW5jZSggcmVmZXJlbmNlUG9zaXRpb24sIG5lYXJEaXN0YW5jZSwgZmFyRGlzdGFuY2UgKTtcclxuXHJcbn07XHJcblxyXG5jb25zdCBnZXRTaGFkb3dNYXRlcmlhbCA9ICggbGlnaHQgKSA9PiB7XHJcblxyXG5cdGxldCBtYXRlcmlhbCA9IHNoYWRvd01hdGVyaWFsTGliLmdldCggbGlnaHQgKTtcclxuXHJcblx0aWYgKCBtYXRlcmlhbCA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdGNvbnN0IGRlcHRoTm9kZSA9IGxpZ2h0LmlzUG9pbnRMaWdodCA/IGxpbmVhclNoYWRvd0Rpc3RhbmNlKCBsaWdodCApIDogbnVsbDtcclxuXHJcblx0XHRtYXRlcmlhbCA9IG5ldyBOb2RlTWF0ZXJpYWwoKTtcclxuXHRcdG1hdGVyaWFsLmNvbG9yTm9kZSA9IHZlYzQoIDAsIDAsIDAsIDEgKTtcclxuXHRcdG1hdGVyaWFsLmRlcHRoTm9kZSA9IGRlcHRoTm9kZTtcclxuXHRcdG1hdGVyaWFsLmlzU2hhZG93UGFzc01hdGVyaWFsID0gdHJ1ZTsgLy8gVXNlIHRvIGF2b2lkIG90aGVyIG92ZXJyaWRlTWF0ZXJpYWwgb3ZlcnJpZGUgbWF0ZXJpYWwuY29sb3JOb2RlIHVuaW50ZW50aW9uYWxseSB3aGVuIHVzaW5nIG1hdGVyaWFsLnNoYWRvd05vZGVcclxuXHRcdG1hdGVyaWFsLm5hbWUgPSAnU2hhZG93TWF0ZXJpYWwnO1xyXG5cdFx0bWF0ZXJpYWwuZm9nID0gZmFsc2U7XHJcblxyXG5cdFx0c2hhZG93TWF0ZXJpYWxMaWIuc2V0KCBsaWdodCwgbWF0ZXJpYWwgKTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gbWF0ZXJpYWw7XHJcblxyXG59O1xyXG5cclxuLyoqXHJcbiAqIEEgc2hhZG93IGZpbHRlcmluZyBmdW5jdGlvbiBwZXJmb3JtaW5nIGJhc2ljIGZpbHRlcmluZy4gVGhpcyBpcyBpbiBmYWN0IGFuIHVuZmlsdGVyZWQgdmVyc2lvbiBvZiB0aGUgc2hhZG93IG1hcFxyXG4gKiB3aXRoIGEgYmluYXJ5IGBbMCwxXWAgcmVzdWx0LlxyXG4gKlxyXG4gKiBAbWV0aG9kXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dHMgLSBUaGUgaW5wdXQgcGFyYW1ldGVyIG9iamVjdC5cclxuICogQHBhcmFtIHtEZXB0aFRleHR1cmV9IGlucHV0cy5kZXB0aFRleHR1cmUgLSBBIHJlZmVyZW5jZSB0byB0aGUgc2hhZG93IG1hcCdzIHRleHR1cmUgZGF0YS5cclxuICogQHBhcmFtIHtOb2RlPHZlYzM+fSBpbnB1dHMuc2hhZG93Q29vcmQgLSBUaGUgc2hhZG93IGNvb3JkaW5hdGVzLlxyXG4gKiBAcmV0dXJuIHtOb2RlPGZsb2F0Pn0gVGhlIGZpbHRlcmluZyByZXN1bHQuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgQmFzaWNTaGFkb3dGaWx0ZXIgPSAvKkBfX1BVUkVfXyovIEZuKCAoIHsgZGVwdGhUZXh0dXJlLCBzaGFkb3dDb29yZCB9ICkgPT4ge1xyXG5cclxuXHRyZXR1cm4gdGV4dHVyZSggZGVwdGhUZXh0dXJlLCBzaGFkb3dDb29yZC54eSApLmNvbXBhcmUoIHNoYWRvd0Nvb3JkLnogKTtcclxuXHJcbn0gKTtcclxuXHJcbi8qKlxyXG4gKiBBIHNoYWRvdyBmaWx0ZXJpbmcgZnVuY3Rpb24gcGVyZm9ybWluZyBQQ0YgZmlsdGVyaW5nLlxyXG4gKlxyXG4gKiBAbWV0aG9kXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dHMgLSBUaGUgaW5wdXQgcGFyYW1ldGVyIG9iamVjdC5cclxuICogQHBhcmFtIHtEZXB0aFRleHR1cmV9IGlucHV0cy5kZXB0aFRleHR1cmUgLSBBIHJlZmVyZW5jZSB0byB0aGUgc2hhZG93IG1hcCdzIHRleHR1cmUgZGF0YS5cclxuICogQHBhcmFtIHtOb2RlPHZlYzM+fSBpbnB1dHMuc2hhZG93Q29vcmQgLSBUaGUgc2hhZG93IGNvb3JkaW5hdGVzLlxyXG4gKiBAcGFyYW0ge0xpZ2h0U2hhZG93fSBpbnB1dHMuc2hhZG93IC0gVGhlIGxpZ2h0IHNoYWRvdy5cclxuICogQHJldHVybiB7Tm9kZTxmbG9hdD59IFRoZSBmaWx0ZXJpbmcgcmVzdWx0LlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFBDRlNoYWRvd0ZpbHRlciA9IC8qQF9fUFVSRV9fKi8gRm4oICggeyBkZXB0aFRleHR1cmUsIHNoYWRvd0Nvb3JkLCBzaGFkb3cgfSApID0+IHtcclxuXHJcblx0Y29uc3QgZGVwdGhDb21wYXJlID0gKCB1diwgY29tcGFyZSApID0+IHRleHR1cmUoIGRlcHRoVGV4dHVyZSwgdXYgKS5jb21wYXJlKCBjb21wYXJlICk7XHJcblxyXG5cdGNvbnN0IG1hcFNpemUgPSByZWZlcmVuY2UoICdtYXBTaXplJywgJ3ZlYzInLCBzaGFkb3cgKS5zZXRHcm91cCggcmVuZGVyR3JvdXAgKTtcclxuXHRjb25zdCByYWRpdXMgPSByZWZlcmVuY2UoICdyYWRpdXMnLCAnZmxvYXQnLCBzaGFkb3cgKS5zZXRHcm91cCggcmVuZGVyR3JvdXAgKTtcclxuXHJcblx0Y29uc3QgdGV4ZWxTaXplID0gdmVjMiggMSApLmRpdiggbWFwU2l6ZSApO1xyXG5cdGNvbnN0IGR4MCA9IHRleGVsU2l6ZS54Lm5lZ2F0ZSgpLm11bCggcmFkaXVzICk7XHJcblx0Y29uc3QgZHkwID0gdGV4ZWxTaXplLnkubmVnYXRlKCkubXVsKCByYWRpdXMgKTtcclxuXHRjb25zdCBkeDEgPSB0ZXhlbFNpemUueC5tdWwoIHJhZGl1cyApO1xyXG5cdGNvbnN0IGR5MSA9IHRleGVsU2l6ZS55Lm11bCggcmFkaXVzICk7XHJcblx0Y29uc3QgZHgyID0gZHgwLmRpdiggMiApO1xyXG5cdGNvbnN0IGR5MiA9IGR5MC5kaXYoIDIgKTtcclxuXHRjb25zdCBkeDMgPSBkeDEuZGl2KCAyICk7XHJcblx0Y29uc3QgZHkzID0gZHkxLmRpdiggMiApO1xyXG5cclxuXHRyZXR1cm4gYWRkKFxyXG5cdFx0ZGVwdGhDb21wYXJlKCBzaGFkb3dDb29yZC54eS5hZGQoIHZlYzIoIGR4MCwgZHkwICkgKSwgc2hhZG93Q29vcmQueiApLFxyXG5cdFx0ZGVwdGhDb21wYXJlKCBzaGFkb3dDb29yZC54eS5hZGQoIHZlYzIoIDAsIGR5MCApICksIHNoYWRvd0Nvb3JkLnogKSxcclxuXHRcdGRlcHRoQ29tcGFyZSggc2hhZG93Q29vcmQueHkuYWRkKCB2ZWMyKCBkeDEsIGR5MCApICksIHNoYWRvd0Nvb3JkLnogKSxcclxuXHRcdGRlcHRoQ29tcGFyZSggc2hhZG93Q29vcmQueHkuYWRkKCB2ZWMyKCBkeDIsIGR5MiApICksIHNoYWRvd0Nvb3JkLnogKSxcclxuXHRcdGRlcHRoQ29tcGFyZSggc2hhZG93Q29vcmQueHkuYWRkKCB2ZWMyKCAwLCBkeTIgKSApLCBzaGFkb3dDb29yZC56ICksXHJcblx0XHRkZXB0aENvbXBhcmUoIHNoYWRvd0Nvb3JkLnh5LmFkZCggdmVjMiggZHgzLCBkeTIgKSApLCBzaGFkb3dDb29yZC56ICksXHJcblx0XHRkZXB0aENvbXBhcmUoIHNoYWRvd0Nvb3JkLnh5LmFkZCggdmVjMiggZHgwLCAwICkgKSwgc2hhZG93Q29vcmQueiApLFxyXG5cdFx0ZGVwdGhDb21wYXJlKCBzaGFkb3dDb29yZC54eS5hZGQoIHZlYzIoIGR4MiwgMCApICksIHNoYWRvd0Nvb3JkLnogKSxcclxuXHRcdGRlcHRoQ29tcGFyZSggc2hhZG93Q29vcmQueHksIHNoYWRvd0Nvb3JkLnogKSxcclxuXHRcdGRlcHRoQ29tcGFyZSggc2hhZG93Q29vcmQueHkuYWRkKCB2ZWMyKCBkeDMsIDAgKSApLCBzaGFkb3dDb29yZC56ICksXHJcblx0XHRkZXB0aENvbXBhcmUoIHNoYWRvd0Nvb3JkLnh5LmFkZCggdmVjMiggZHgxLCAwICkgKSwgc2hhZG93Q29vcmQueiApLFxyXG5cdFx0ZGVwdGhDb21wYXJlKCBzaGFkb3dDb29yZC54eS5hZGQoIHZlYzIoIGR4MiwgZHkzICkgKSwgc2hhZG93Q29vcmQueiApLFxyXG5cdFx0ZGVwdGhDb21wYXJlKCBzaGFkb3dDb29yZC54eS5hZGQoIHZlYzIoIDAsIGR5MyApICksIHNoYWRvd0Nvb3JkLnogKSxcclxuXHRcdGRlcHRoQ29tcGFyZSggc2hhZG93Q29vcmQueHkuYWRkKCB2ZWMyKCBkeDMsIGR5MyApICksIHNoYWRvd0Nvb3JkLnogKSxcclxuXHRcdGRlcHRoQ29tcGFyZSggc2hhZG93Q29vcmQueHkuYWRkKCB2ZWMyKCBkeDAsIGR5MSApICksIHNoYWRvd0Nvb3JkLnogKSxcclxuXHRcdGRlcHRoQ29tcGFyZSggc2hhZG93Q29vcmQueHkuYWRkKCB2ZWMyKCAwLCBkeTEgKSApLCBzaGFkb3dDb29yZC56ICksXHJcblx0XHRkZXB0aENvbXBhcmUoIHNoYWRvd0Nvb3JkLnh5LmFkZCggdmVjMiggZHgxLCBkeTEgKSApLCBzaGFkb3dDb29yZC56IClcclxuXHQpLm11bCggMSAvIDE3ICk7XHJcblxyXG59ICk7XHJcblxyXG4vKipcclxuICogQSBzaGFkb3cgZmlsdGVyaW5nIGZ1bmN0aW9uIHBlcmZvcm1pbmcgUENGIHNvZnQgZmlsdGVyaW5nLlxyXG4gKlxyXG4gKiBAbWV0aG9kXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dHMgLSBUaGUgaW5wdXQgcGFyYW1ldGVyIG9iamVjdC5cclxuICogQHBhcmFtIHtEZXB0aFRleHR1cmV9IGlucHV0cy5kZXB0aFRleHR1cmUgLSBBIHJlZmVyZW5jZSB0byB0aGUgc2hhZG93IG1hcCdzIHRleHR1cmUgZGF0YS5cclxuICogQHBhcmFtIHtOb2RlPHZlYzM+fSBpbnB1dHMuc2hhZG93Q29vcmQgLSBUaGUgc2hhZG93IGNvb3JkaW5hdGVzLlxyXG4gKiBAcGFyYW0ge0xpZ2h0U2hhZG93fSBpbnB1dHMuc2hhZG93IC0gVGhlIGxpZ2h0IHNoYWRvdy5cclxuICogQHJldHVybiB7Tm9kZTxmbG9hdD59IFRoZSBmaWx0ZXJpbmcgcmVzdWx0LlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFBDRlNvZnRTaGFkb3dGaWx0ZXIgPSAvKkBfX1BVUkVfXyovIEZuKCAoIHsgZGVwdGhUZXh0dXJlLCBzaGFkb3dDb29yZCwgc2hhZG93IH0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IGRlcHRoQ29tcGFyZSA9ICggdXYsIGNvbXBhcmUgKSA9PiB0ZXh0dXJlKCBkZXB0aFRleHR1cmUsIHV2ICkuY29tcGFyZSggY29tcGFyZSApO1xyXG5cclxuXHRjb25zdCBtYXBTaXplID0gcmVmZXJlbmNlKCAnbWFwU2l6ZScsICd2ZWMyJywgc2hhZG93ICkuc2V0R3JvdXAoIHJlbmRlckdyb3VwICk7XHJcblxyXG5cdGNvbnN0IHRleGVsU2l6ZSA9IHZlYzIoIDEgKS5kaXYoIG1hcFNpemUgKTtcclxuXHRjb25zdCBkeCA9IHRleGVsU2l6ZS54O1xyXG5cdGNvbnN0IGR5ID0gdGV4ZWxTaXplLnk7XHJcblxyXG5cdGNvbnN0IHV2ID0gc2hhZG93Q29vcmQueHk7XHJcblx0Y29uc3QgZiA9IGZyYWN0KCB1di5tdWwoIG1hcFNpemUgKS5hZGQoIDAuNSApICk7XHJcblx0dXYuc3ViQXNzaWduKCBmLm11bCggdGV4ZWxTaXplICkgKTtcclxuXHJcblx0cmV0dXJuIGFkZChcclxuXHRcdGRlcHRoQ29tcGFyZSggdXYsIHNoYWRvd0Nvb3JkLnogKSxcclxuXHRcdGRlcHRoQ29tcGFyZSggdXYuYWRkKCB2ZWMyKCBkeCwgMCApICksIHNoYWRvd0Nvb3JkLnogKSxcclxuXHRcdGRlcHRoQ29tcGFyZSggdXYuYWRkKCB2ZWMyKCAwLCBkeSApICksIHNoYWRvd0Nvb3JkLnogKSxcclxuXHRcdGRlcHRoQ29tcGFyZSggdXYuYWRkKCB0ZXhlbFNpemUgKSwgc2hhZG93Q29vcmQueiApLFxyXG5cdFx0bWl4KFxyXG5cdFx0XHRkZXB0aENvbXBhcmUoIHV2LmFkZCggdmVjMiggZHgubmVnYXRlKCksIDAgKSApLCBzaGFkb3dDb29yZC56ICksXHJcblx0XHRcdGRlcHRoQ29tcGFyZSggdXYuYWRkKCB2ZWMyKCBkeC5tdWwoIDIgKSwgMCApICksIHNoYWRvd0Nvb3JkLnogKSxcclxuXHRcdFx0Zi54XHJcblx0XHQpLFxyXG5cdFx0bWl4KFxyXG5cdFx0XHRkZXB0aENvbXBhcmUoIHV2LmFkZCggdmVjMiggZHgubmVnYXRlKCksIGR5ICkgKSwgc2hhZG93Q29vcmQueiApLFxyXG5cdFx0XHRkZXB0aENvbXBhcmUoIHV2LmFkZCggdmVjMiggZHgubXVsKCAyICksIGR5ICkgKSwgc2hhZG93Q29vcmQueiApLFxyXG5cdFx0XHRmLnhcclxuXHRcdCksXHJcblx0XHRtaXgoXHJcblx0XHRcdGRlcHRoQ29tcGFyZSggdXYuYWRkKCB2ZWMyKCAwLCBkeS5uZWdhdGUoKSApICksIHNoYWRvd0Nvb3JkLnogKSxcclxuXHRcdFx0ZGVwdGhDb21wYXJlKCB1di5hZGQoIHZlYzIoIDAsIGR5Lm11bCggMiApICkgKSwgc2hhZG93Q29vcmQueiApLFxyXG5cdFx0XHRmLnlcclxuXHRcdCksXHJcblx0XHRtaXgoXHJcblx0XHRcdGRlcHRoQ29tcGFyZSggdXYuYWRkKCB2ZWMyKCBkeCwgZHkubmVnYXRlKCkgKSApLCBzaGFkb3dDb29yZC56ICksXHJcblx0XHRcdGRlcHRoQ29tcGFyZSggdXYuYWRkKCB2ZWMyKCBkeCwgZHkubXVsKCAyICkgKSApLCBzaGFkb3dDb29yZC56ICksXHJcblx0XHRcdGYueVxyXG5cdFx0KSxcclxuXHRcdG1peChcclxuXHRcdFx0bWl4KFxyXG5cdFx0XHRcdGRlcHRoQ29tcGFyZSggdXYuYWRkKCB2ZWMyKCBkeC5uZWdhdGUoKSwgZHkubmVnYXRlKCkgKSApLCBzaGFkb3dDb29yZC56ICksXHJcblx0XHRcdFx0ZGVwdGhDb21wYXJlKCB1di5hZGQoIHZlYzIoIGR4Lm11bCggMiApLCBkeS5uZWdhdGUoKSApICksIHNoYWRvd0Nvb3JkLnogKSxcclxuXHRcdFx0XHRmLnhcclxuXHRcdFx0KSxcclxuXHRcdFx0bWl4KFxyXG5cdFx0XHRcdGRlcHRoQ29tcGFyZSggdXYuYWRkKCB2ZWMyKCBkeC5uZWdhdGUoKSwgZHkubXVsKCAyICkgKSApLCBzaGFkb3dDb29yZC56ICksXHJcblx0XHRcdFx0ZGVwdGhDb21wYXJlKCB1di5hZGQoIHZlYzIoIGR4Lm11bCggMiApLCBkeS5tdWwoIDIgKSApICksIHNoYWRvd0Nvb3JkLnogKSxcclxuXHRcdFx0XHRmLnhcclxuXHRcdFx0KSxcclxuXHRcdFx0Zi55XHJcblx0XHQpXHJcblx0KS5tdWwoIDEgLyA5ICk7XHJcblxyXG59ICk7XHJcblxyXG4vKipcclxuICogQSBzaGFkb3cgZmlsdGVyaW5nIGZ1bmN0aW9uIHBlcmZvcm1pbmcgVlNNIGZpbHRlcmluZy5cclxuICpcclxuICogQG1ldGhvZFxyXG4gKiBAcGFyYW0ge09iamVjdH0gaW5wdXRzIC0gVGhlIGlucHV0IHBhcmFtZXRlciBvYmplY3QuXHJcbiAqIEBwYXJhbSB7RGVwdGhUZXh0dXJlfSBpbnB1dHMuZGVwdGhUZXh0dXJlIC0gQSByZWZlcmVuY2UgdG8gdGhlIHNoYWRvdyBtYXAncyB0ZXh0dXJlIGRhdGEuXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMzPn0gaW5wdXRzLnNoYWRvd0Nvb3JkIC0gVGhlIHNoYWRvdyBjb29yZGluYXRlcy5cclxuICogQHJldHVybiB7Tm9kZTxmbG9hdD59IFRoZSBmaWx0ZXJpbmcgcmVzdWx0LlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFZTTVNoYWRvd0ZpbHRlciA9IC8qQF9fUFVSRV9fKi8gRm4oICggeyBkZXB0aFRleHR1cmUsIHNoYWRvd0Nvb3JkIH0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IG9jY2x1c2lvbiA9IGZsb2F0KCAxICkudG9WYXIoKTtcclxuXHJcblx0Y29uc3QgZGlzdHJpYnV0aW9uID0gdGV4dHVyZSggZGVwdGhUZXh0dXJlICkuc2FtcGxlKCBzaGFkb3dDb29yZC54eSApLnJnO1xyXG5cclxuXHRjb25zdCBoYXJkU2hhZG93ID0gc3RlcCggc2hhZG93Q29vcmQueiwgZGlzdHJpYnV0aW9uLnggKTtcclxuXHJcblx0SWYoIGhhcmRTaGFkb3cubm90RXF1YWwoIGZsb2F0KCAxLjAgKSApLCAoKSA9PiB7XHJcblxyXG5cdFx0Y29uc3QgZGlzdGFuY2UgPSBzaGFkb3dDb29yZC56LnN1YiggZGlzdHJpYnV0aW9uLnggKTtcclxuXHRcdGNvbnN0IHZhcmlhbmNlID0gbWF4KCAwLCBkaXN0cmlidXRpb24ueS5tdWwoIGRpc3RyaWJ1dGlvbi55ICkgKTtcclxuXHRcdGxldCBzb2Z0bmVzc1Byb2JhYmlsaXR5ID0gdmFyaWFuY2UuZGl2KCB2YXJpYW5jZS5hZGQoIGRpc3RhbmNlLm11bCggZGlzdGFuY2UgKSApICk7IC8vIENoZWJleXNoZXZzIGluZXF1YWxpdHlcclxuXHRcdHNvZnRuZXNzUHJvYmFiaWxpdHkgPSBjbGFtcCggc3ViKCBzb2Z0bmVzc1Byb2JhYmlsaXR5LCAwLjMgKS5kaXYoIDAuOTUgLSAwLjMgKSApO1xyXG5cdFx0b2NjbHVzaW9uLmFzc2lnbiggY2xhbXAoIG1heCggaGFyZFNoYWRvdywgc29mdG5lc3NQcm9iYWJpbGl0eSApICkgKTtcclxuXHJcblx0fSApO1xyXG5cclxuXHRyZXR1cm4gb2NjbHVzaW9uO1xyXG5cclxufSApO1xyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgdGhlIHNoYWRlciBjb2RlIGZvciB0aGUgZmlyc3QgVlNNIHJlbmRlciBwYXNzLlxyXG4gKlxyXG4gKiBAbWV0aG9kXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dHMgLSBUaGUgaW5wdXQgcGFyYW1ldGVyIG9iamVjdC5cclxuICogQHBhcmFtIHtOb2RlPGZsb2F0Pn0gaW5wdXRzLnNhbXBsZXMgLSBUaGUgbnVtYmVyIG9mIHNhbXBsZXNcclxuICogQHBhcmFtIHtOb2RlPGZsb2F0Pn0gaW5wdXRzLnJhZGl1cyAtIFRoZSByYWRpdXMuXHJcbiAqIEBwYXJhbSB7Tm9kZTxmbG9hdD59IGlucHV0cy5zaXplIC0gVGhlIHNpemUuXHJcbiAqIEBwYXJhbSB7VGV4dHVyZU5vZGV9IGlucHV0cy5zaGFkb3dQYXNzIC0gQSByZWZlcmVuY2UgdG8gdGhlIHJlbmRlciB0YXJnZXQncyBkZXB0aCBkYXRhLlxyXG4gKiBAcmV0dXJuIHtOb2RlPHZlYzI+fSBUaGUgVlNNIG91dHB1dC5cclxuICovXHJcbmNvbnN0IFZTTVBhc3NWZXJ0aWNhbCA9IC8qQF9fUFVSRV9fKi8gRm4oICggeyBzYW1wbGVzLCByYWRpdXMsIHNpemUsIHNoYWRvd1Bhc3MgfSApID0+IHtcclxuXHJcblx0Y29uc3QgbWVhbiA9IGZsb2F0KCAwICkudG9WYXIoKTtcclxuXHRjb25zdCBzcXVhcmVkTWVhbiA9IGZsb2F0KCAwICkudG9WYXIoKTtcclxuXHJcblx0Y29uc3QgdXZTdHJpZGUgPSBzYW1wbGVzLmxlc3NUaGFuRXF1YWwoIGZsb2F0KCAxICkgKS5zZWxlY3QoIGZsb2F0KCAwICksIGZsb2F0KCAyICkuZGl2KCBzYW1wbGVzLnN1YiggMSApICkgKTtcclxuXHRjb25zdCB1dlN0YXJ0ID0gc2FtcGxlcy5sZXNzVGhhbkVxdWFsKCBmbG9hdCggMSApICkuc2VsZWN0KCBmbG9hdCggMCApLCBmbG9hdCggLSAxICkgKTtcclxuXHJcblx0TG9vcCggeyBzdGFydDogaW50KCAwICksIGVuZDogaW50KCBzYW1wbGVzICksIHR5cGU6ICdpbnQnLCBjb25kaXRpb246ICc8JyB9LCAoIHsgaSB9ICkgPT4ge1xyXG5cclxuXHRcdGNvbnN0IHV2T2Zmc2V0ID0gdXZTdGFydC5hZGQoIGZsb2F0KCBpICkubXVsKCB1dlN0cmlkZSApICk7XHJcblxyXG5cdFx0Y29uc3QgZGVwdGggPSBzaGFkb3dQYXNzLnNhbXBsZSggYWRkKCBzY3JlZW5Db29yZGluYXRlLnh5LCB2ZWMyKCAwLCB1dk9mZnNldCApLm11bCggcmFkaXVzICkgKS5kaXYoIHNpemUgKSApLng7XHJcblx0XHRtZWFuLmFkZEFzc2lnbiggZGVwdGggKTtcclxuXHRcdHNxdWFyZWRNZWFuLmFkZEFzc2lnbiggZGVwdGgubXVsKCBkZXB0aCApICk7XHJcblxyXG5cdH0gKTtcclxuXHJcblx0bWVhbi5kaXZBc3NpZ24oIHNhbXBsZXMgKTtcclxuXHRzcXVhcmVkTWVhbi5kaXZBc3NpZ24oIHNhbXBsZXMgKTtcclxuXHJcblx0Y29uc3Qgc3RkX2RldiA9IHNxcnQoIHNxdWFyZWRNZWFuLnN1YiggbWVhbi5tdWwoIG1lYW4gKSApICk7XHJcblx0cmV0dXJuIHZlYzIoIG1lYW4sIHN0ZF9kZXYgKTtcclxuXHJcbn0gKTtcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIHRoZSBzaGFkZXIgY29kZSBmb3IgdGhlIHNlY29uZCBWU00gcmVuZGVyIHBhc3MuXHJcbiAqXHJcbiAqIEBtZXRob2RcclxuICogQHBhcmFtIHtPYmplY3R9IGlucHV0cyAtIFRoZSBpbnB1dCBwYXJhbWV0ZXIgb2JqZWN0LlxyXG4gKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSBpbnB1dHMuc2FtcGxlcyAtIFRoZSBudW1iZXIgb2Ygc2FtcGxlc1xyXG4gKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSBpbnB1dHMucmFkaXVzIC0gVGhlIHJhZGl1cy5cclxuICogQHBhcmFtIHtOb2RlPGZsb2F0Pn0gaW5wdXRzLnNpemUgLSBUaGUgc2l6ZS5cclxuICogQHBhcmFtIHtUZXh0dXJlTm9kZX0gaW5wdXRzLnNoYWRvd1Bhc3MgLSBUaGUgcmVzdWx0IG9mIHRoZSBmaXJzdCBWU00gcmVuZGVyIHBhc3MuXHJcbiAqIEByZXR1cm4ge05vZGU8dmVjMj59IFRoZSBWU00gb3V0cHV0LlxyXG4gKi9cclxuY29uc3QgVlNNUGFzc0hvcml6b250YWwgPSAvKkBfX1BVUkVfXyovIEZuKCAoIHsgc2FtcGxlcywgcmFkaXVzLCBzaXplLCBzaGFkb3dQYXNzIH0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IG1lYW4gPSBmbG9hdCggMCApLnRvVmFyKCk7XHJcblx0Y29uc3Qgc3F1YXJlZE1lYW4gPSBmbG9hdCggMCApLnRvVmFyKCk7XHJcblxyXG5cdGNvbnN0IHV2U3RyaWRlID0gc2FtcGxlcy5sZXNzVGhhbkVxdWFsKCBmbG9hdCggMSApICkuc2VsZWN0KCBmbG9hdCggMCApLCBmbG9hdCggMiApLmRpdiggc2FtcGxlcy5zdWIoIDEgKSApICk7XHJcblx0Y29uc3QgdXZTdGFydCA9IHNhbXBsZXMubGVzc1RoYW5FcXVhbCggZmxvYXQoIDEgKSApLnNlbGVjdCggZmxvYXQoIDAgKSwgZmxvYXQoIC0gMSApICk7XHJcblxyXG5cdExvb3AoIHsgc3RhcnQ6IGludCggMCApLCBlbmQ6IGludCggc2FtcGxlcyApLCB0eXBlOiAnaW50JywgY29uZGl0aW9uOiAnPCcgfSwgKCB7IGkgfSApID0+IHtcclxuXHJcblx0XHRjb25zdCB1dk9mZnNldCA9IHV2U3RhcnQuYWRkKCBmbG9hdCggaSApLm11bCggdXZTdHJpZGUgKSApO1xyXG5cclxuXHRcdGNvbnN0IGRpc3RyaWJ1dGlvbiA9IHNoYWRvd1Bhc3Muc2FtcGxlKCBhZGQoIHNjcmVlbkNvb3JkaW5hdGUueHksIHZlYzIoIHV2T2Zmc2V0LCAwICkubXVsKCByYWRpdXMgKSApLmRpdiggc2l6ZSApICk7XHJcblx0XHRtZWFuLmFkZEFzc2lnbiggZGlzdHJpYnV0aW9uLnggKTtcclxuXHRcdHNxdWFyZWRNZWFuLmFkZEFzc2lnbiggYWRkKCBkaXN0cmlidXRpb24ueS5tdWwoIGRpc3RyaWJ1dGlvbi55ICksIGRpc3RyaWJ1dGlvbi54Lm11bCggZGlzdHJpYnV0aW9uLnggKSApICk7XHJcblxyXG5cdH0gKTtcclxuXHJcblx0bWVhbi5kaXZBc3NpZ24oIHNhbXBsZXMgKTtcclxuXHRzcXVhcmVkTWVhbi5kaXZBc3NpZ24oIHNhbXBsZXMgKTtcclxuXHJcblx0Y29uc3Qgc3RkX2RldiA9IHNxcnQoIHNxdWFyZWRNZWFuLnN1YiggbWVhbi5tdWwoIG1lYW4gKSApICk7XHJcblx0cmV0dXJuIHZlYzIoIG1lYW4sIHN0ZF9kZXYgKTtcclxuXHJcbn0gKTtcclxuXHJcbmNvbnN0IF9zaGFkb3dGaWx0ZXJMaWIgPSBbIEJhc2ljU2hhZG93RmlsdGVyLCBQQ0ZTaGFkb3dGaWx0ZXIsIFBDRlNvZnRTaGFkb3dGaWx0ZXIsIFZTTVNoYWRvd0ZpbHRlciBdO1xyXG5cclxuLy9cclxuXHJcbmxldCBfcmVuZGVyZXJTdGF0ZTtcclxuY29uc3QgX3F1YWRNZXNoID0gLypAX19QVVJFX18qLyBuZXcgUXVhZE1lc2goKTtcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIHRoZSBkZWZhdWx0IHNoYWRvdyBpbXBsZW1lbnRhdGlvbiBmb3IgbGlnaHRpbmcgbm9kZXMuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBTaGFkb3dCYXNlTm9kZVxyXG4gKi9cclxuY2xhc3MgU2hhZG93Tm9kZSBleHRlbmRzIFNoYWRvd0Jhc2VOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnU2hhZG93Tm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBzaGFkb3cgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TGlnaHR9IGxpZ2h0IC0gVGhlIHNoYWRvdyBjYXN0aW5nIGxpZ2h0LlxyXG5cdCAqIEBwYXJhbSB7P0xpZ2h0U2hhZG93fSBbc2hhZG93PW51bGxdIC0gQW4gb3B0aW9uYWwgbGlnaHQgc2hhZG93LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBsaWdodCwgc2hhZG93ID0gbnVsbCApIHtcclxuXHJcblx0XHRzdXBlciggbGlnaHQgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBsaWdodCBzaGFkb3cgd2hpY2ggZGVmaW5lcyB0aGUgcHJvcGVydGllcyBsaWdodCdzXHJcblx0XHQgKiBzaGFkb3cuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9MaWdodFNoYWRvd31cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zaGFkb3cgPSBzaGFkb3cgfHwgbGlnaHQuc2hhZG93O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIHNoYWRvdyBtYXAgd2hpY2ggaXMgYSByZW5kZXIgdGFyZ2V0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/UmVuZGVyVGFyZ2V0fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNoYWRvd01hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBPbmx5IHJlbGV2YW50IGZvciBWU00gc2hhZG93cy4gUmVuZGVyIHRhcmdldCBmb3IgdGhlXHJcblx0XHQgKiBmaXJzdCBWU00gcmVuZGVyIHBhc3MuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9SZW5kZXJUYXJnZXR9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudnNtU2hhZG93TWFwVmVydGljYWwgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogT25seSByZWxldmFudCBmb3IgVlNNIHNoYWRvd3MuIFJlbmRlciB0YXJnZXQgZm9yIHRoZVxyXG5cdFx0ICogc2Vjb25kIFZTTSByZW5kZXIgcGFzcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1JlbmRlclRhcmdldH1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52c21TaGFkb3dNYXBIb3Jpem9udGFsID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIE9ubHkgcmVsZXZhbnQgZm9yIFZTTSBzaGFkb3dzLiBOb2RlIG1hdGVyaWFsIHdoaWNoXHJcblx0XHQgKiBpcyB1c2VkIHRvIHJlbmRlciB0aGUgZmlyc3QgVlNNIHBhc3MuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlTWF0ZXJpYWx9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudnNtTWF0ZXJpYWxWZXJ0aWNhbCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBPbmx5IHJlbGV2YW50IGZvciBWU00gc2hhZG93cy4gTm9kZSBtYXRlcmlhbCB3aGljaFxyXG5cdFx0ICogaXMgdXNlZCB0byByZW5kZXIgdGhlIHNlY29uZCBWU00gcGFzcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGVNYXRlcmlhbH1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52c21NYXRlcmlhbEhvcml6b250YWwgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIG91dHB1dCBub2RlIHdoaWNoIGRlZmluZXMgdGhlXHJcblx0XHQgKiBmaW5hbCByZXN1bHQgb2YgdGhpcyBzaGFkb3cgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGV9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9ub2RlID0gbnVsbDtcclxuXHJcblx0XHR0aGlzLl9jYW1lcmFGcmFtZUlkID0gbmV3IFdlYWtNYXAoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNTaGFkb3dOb2RlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXR1cHMgdGhlIHNoYWRvdyBmaWx0ZXJpbmcuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dHMgLSBBIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHRoYXQgZGVmaW5lcyB0aGUgc2hhZG93IGZpbHRlcmluZy5cclxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpbnB1dHMuZmlsdGVyRm4gLSBUaGlzIGZ1bmN0aW9uIGRlZmluZXMgdGhlIGZpbHRlcmluZyB0eXBlIG9mIHRoZSBzaGFkb3cgbWFwIGUuZy4gUENGLlxyXG5cdCAqIEBwYXJhbSB7RGVwdGhUZXh0dXJlfSBpbnB1dHMuZGVwdGhUZXh0dXJlIC0gQSByZWZlcmVuY2UgdG8gdGhlIHNoYWRvdyBtYXAncyB0ZXh0dXJlIGRhdGEuXHJcblx0ICogQHBhcmFtIHtOb2RlPHZlYzM+fSBpbnB1dHMuc2hhZG93Q29vcmQgLSBTaGFkb3cgY29vcmRpbmF0ZXMgd2hpY2ggYXJlIHVzZWQgdG8gc2FtcGxlIGZyb20gdGhlIHNoYWRvdyBtYXAuXHJcblx0ICogQHBhcmFtIHtMaWdodFNoYWRvd30gaW5wdXRzLnNoYWRvdyAtIFRoZSBsaWdodCBzaGFkb3cuXHJcblx0ICogQHJldHVybiB7Tm9kZTxmbG9hdD59IFRoZSByZXN1bHQgbm9kZSBvZiB0aGUgc2hhZG93IGZpbHRlcmluZy5cclxuXHQgKi9cclxuXHRzZXR1cFNoYWRvd0ZpbHRlciggYnVpbGRlciwgeyBmaWx0ZXJGbiwgZGVwdGhUZXh0dXJlLCBzaGFkb3dDb29yZCwgc2hhZG93IH0gKSB7XHJcblxyXG5cdFx0Y29uc3QgZnJ1c3R1bVRlc3QgPSBzaGFkb3dDb29yZC54LmdyZWF0ZXJUaGFuRXF1YWwoIDAgKVxyXG5cdFx0XHQuYW5kKCBzaGFkb3dDb29yZC54Lmxlc3NUaGFuRXF1YWwoIDEgKSApXHJcblx0XHRcdC5hbmQoIHNoYWRvd0Nvb3JkLnkuZ3JlYXRlclRoYW5FcXVhbCggMCApIClcclxuXHRcdFx0LmFuZCggc2hhZG93Q29vcmQueS5sZXNzVGhhbkVxdWFsKCAxICkgKVxyXG5cdFx0XHQuYW5kKCBzaGFkb3dDb29yZC56Lmxlc3NUaGFuRXF1YWwoIDEgKSApO1xyXG5cclxuXHRcdGNvbnN0IHNoYWRvd05vZGUgPSBmaWx0ZXJGbiggeyBkZXB0aFRleHR1cmUsIHNoYWRvd0Nvb3JkLCBzaGFkb3cgfSApO1xyXG5cclxuXHRcdHJldHVybiBmcnVzdHVtVGVzdC5zZWxlY3QoIHNoYWRvd05vZGUsIGZsb2F0KCAxICkgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXR1cHMgdGhlIHNoYWRvdyBjb29yZGluYXRlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHBhcmFtIHtOb2RlPHZlYzM+fSBzaGFkb3dQb3NpdGlvbiAtIEEgbm9kZSByZXByZXNlbnRpbmcgdGhlIHNoYWRvdyBwb3NpdGlvbi5cclxuXHQgKiBAcmV0dXJuIHtOb2RlPHZlYzM+fSBUaGUgc2hhZG93IGNvb3JkaW5hdGVzLlxyXG5cdCAqL1xyXG5cdHNldHVwU2hhZG93Q29vcmQoIGJ1aWxkZXIsIHNoYWRvd1Bvc2l0aW9uICkge1xyXG5cclxuXHRcdGNvbnN0IHsgc2hhZG93IH0gPSB0aGlzO1xyXG5cdFx0Y29uc3QgeyByZW5kZXJlciB9ID0gYnVpbGRlcjtcclxuXHJcblx0XHRjb25zdCBiaWFzID0gcmVmZXJlbmNlKCAnYmlhcycsICdmbG9hdCcsIHNoYWRvdyApLnNldEdyb3VwKCByZW5kZXJHcm91cCApO1xyXG5cclxuXHRcdGxldCBzaGFkb3dDb29yZCA9IHNoYWRvd1Bvc2l0aW9uO1xyXG5cdFx0bGV0IGNvb3JkWjtcclxuXHJcblx0XHRpZiAoIHNoYWRvdy5jYW1lcmEuaXNPcnRob2dyYXBoaWNDYW1lcmEgfHwgcmVuZGVyZXIubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciAhPT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdHNoYWRvd0Nvb3JkID0gc2hhZG93Q29vcmQueHl6LmRpdiggc2hhZG93Q29vcmQudyApO1xyXG5cclxuXHRcdFx0Y29vcmRaID0gc2hhZG93Q29vcmQuejtcclxuXHJcblx0XHRcdGlmICggcmVuZGVyZXIuY29vcmRpbmF0ZVN5c3RlbSA9PT0gV2ViR1BVQ29vcmRpbmF0ZVN5c3RlbSApIHtcclxuXHJcblx0XHRcdFx0Y29vcmRaID0gY29vcmRaLm11bCggMiApLnN1YiggMSApOyAvLyBXZWJHUFU6IENvbnZlcnNpb24gWyAwLCAxIF0gdG8gWyAtIDEsIDEgXVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRjb25zdCB3ID0gc2hhZG93Q29vcmQudztcclxuXHRcdFx0c2hhZG93Q29vcmQgPSBzaGFkb3dDb29yZC54eS5kaXYoIHcgKTsgLy8gPC0tIE9ubHkgZGl2aWRlIFgvWSBjb29yZHMgc2luY2Ugd2UgZG9uJ3QgbmVlZCBaXHJcblxyXG5cdFx0XHQvLyBUaGUgbm9ybWFsbHkgYXZhaWxhYmxlIFwiY2FtZXJhTmVhclwiIGFuZCBcImNhbWVyYUZhclwiIG5vZGVzIGNhbm5vdCBiZSB1c2VkIGhlcmUgYmVjYXVzZSB0aGV5IGRvIG5vdCBnZXRcclxuXHRcdFx0Ly8gdXBkYXRlZCB0byB1c2UgdGhlIHNoYWRvdyBjYW1lcmEuIFNvLCB3ZSBoYXZlIHRvIGRlY2xhcmUgb3VyIG93biBcImxvY2FsXCIgb25lcyBoZXJlLlxyXG5cdFx0XHQvLyBUT0RPOiBIb3cgZG8gd2UgZ2V0IHRoZSBjYW1lcmFOZWFyL2NhbWVyYUZhciBub2RlcyB0byB1c2UgdGhlIHNoYWRvdyBjYW1lcmEgc28gd2UgZG9uJ3QgaGF2ZSB0byBkZWNsYXJlIGxvY2FsIG9uZXMgaGVyZT9cclxuXHRcdFx0Y29uc3QgY2FtZXJhTmVhckxvY2FsID0gcmVmZXJlbmNlKCAnbmVhcicsICdmbG9hdCcsIHNoYWRvdy5jYW1lcmEgKS5zZXRHcm91cCggcmVuZGVyR3JvdXAgKTtcclxuXHRcdFx0Y29uc3QgY2FtZXJhRmFyTG9jYWwgPSByZWZlcmVuY2UoICdmYXInLCAnZmxvYXQnLCBzaGFkb3cuY2FtZXJhICkuc2V0R3JvdXAoIHJlbmRlckdyb3VwICk7XHJcblxyXG5cdFx0XHRjb29yZFogPSB2aWV3WlRvTG9nYXJpdGhtaWNEZXB0aCggdy5uZWdhdGUoKSwgY2FtZXJhTmVhckxvY2FsLCBjYW1lcmFGYXJMb2NhbCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRzaGFkb3dDb29yZCA9IHZlYzMoXHJcblx0XHRcdHNoYWRvd0Nvb3JkLngsXHJcblx0XHRcdHNoYWRvd0Nvb3JkLnkub25lTWludXMoKSwgLy8gZm9sbG93IHdlYmdwdSBzdGFuZGFyZHNcclxuXHRcdFx0Y29vcmRaLmFkZCggYmlhcyApXHJcblx0XHQpO1xyXG5cclxuXHRcdHJldHVybiBzaGFkb3dDb29yZDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBzaGFkb3cgZmlsdGVyaW5nIGZ1bmN0aW9uIGZvciB0aGUgZ2l2ZW4gc2hhZG93IHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdHlwZSAtIFRoZSBzaGFkb3cgdHlwZS5cclxuXHQgKiBAcmV0dXJuIHtGdW5jdGlvbn0gVGhlIGZpbHRlcmluZyBmdW5jdGlvbi5cclxuXHQgKi9cclxuXHRnZXRTaGFkb3dGaWx0ZXJGbiggdHlwZSApIHtcclxuXHJcblx0XHRyZXR1cm4gX3NoYWRvd0ZpbHRlckxpYlsgdHlwZSBdO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHVwcyB0aGUgc2hhZG93IG91dHB1dCBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtOb2RlPHZlYzM+fSBUaGUgc2hhZG93IG91dHB1dCBub2RlLlxyXG5cdCAqL1xyXG5cdHNldHVwU2hhZG93KCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IHsgcmVuZGVyZXIgfSA9IGJ1aWxkZXI7XHJcblxyXG5cdFx0Y29uc3QgeyBsaWdodCwgc2hhZG93IH0gPSB0aGlzO1xyXG5cclxuXHRcdGNvbnN0IHNoYWRvd01hcFR5cGUgPSByZW5kZXJlci5zaGFkb3dNYXAudHlwZTtcclxuXHJcblx0XHRjb25zdCBkZXB0aFRleHR1cmUgPSBuZXcgRGVwdGhUZXh0dXJlKCBzaGFkb3cubWFwU2l6ZS53aWR0aCwgc2hhZG93Lm1hcFNpemUuaGVpZ2h0ICk7XHJcblx0XHRkZXB0aFRleHR1cmUuY29tcGFyZUZ1bmN0aW9uID0gTGVzc0NvbXBhcmU7XHJcblxyXG5cdFx0Y29uc3Qgc2hhZG93TWFwID0gYnVpbGRlci5jcmVhdGVSZW5kZXJUYXJnZXQoIHNoYWRvdy5tYXBTaXplLndpZHRoLCBzaGFkb3cubWFwU2l6ZS5oZWlnaHQgKTtcclxuXHRcdHNoYWRvd01hcC5kZXB0aFRleHR1cmUgPSBkZXB0aFRleHR1cmU7XHJcblxyXG5cdFx0c2hhZG93LmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XHJcblxyXG5cdFx0Ly8gVlNNXHJcblxyXG5cdFx0aWYgKCBzaGFkb3dNYXBUeXBlID09PSBWU01TaGFkb3dNYXAgKSB7XHJcblxyXG5cdFx0XHRkZXB0aFRleHR1cmUuY29tcGFyZUZ1bmN0aW9uID0gbnVsbDsgLy8gVlNNIGRvZXMgbm90IHVzZSB0ZXh0dXJlU2FtcGxlQ29tcGFyZSgpL3RleHR1cmUyRENvbXBhcmUoKVxyXG5cclxuXHRcdFx0dGhpcy52c21TaGFkb3dNYXBWZXJ0aWNhbCA9IGJ1aWxkZXIuY3JlYXRlUmVuZGVyVGFyZ2V0KCBzaGFkb3cubWFwU2l6ZS53aWR0aCwgc2hhZG93Lm1hcFNpemUuaGVpZ2h0LCB7IGZvcm1hdDogUkdGb3JtYXQsIHR5cGU6IEhhbGZGbG9hdFR5cGUgfSApO1xyXG5cdFx0XHR0aGlzLnZzbVNoYWRvd01hcEhvcml6b250YWwgPSBidWlsZGVyLmNyZWF0ZVJlbmRlclRhcmdldCggc2hhZG93Lm1hcFNpemUud2lkdGgsIHNoYWRvdy5tYXBTaXplLmhlaWdodCwgeyBmb3JtYXQ6IFJHRm9ybWF0LCB0eXBlOiBIYWxmRmxvYXRUeXBlIH0gKTtcclxuXHJcblx0XHRcdGNvbnN0IHNoYWRvd1Bhc3NWZXJ0aWNhbCA9IHRleHR1cmUoIGRlcHRoVGV4dHVyZSApO1xyXG5cdFx0XHRjb25zdCBzaGFkb3dQYXNzSG9yaXpvbnRhbCA9IHRleHR1cmUoIHRoaXMudnNtU2hhZG93TWFwVmVydGljYWwudGV4dHVyZSApO1xyXG5cclxuXHRcdFx0Y29uc3Qgc2FtcGxlcyA9IHJlZmVyZW5jZSggJ2JsdXJTYW1wbGVzJywgJ2Zsb2F0Jywgc2hhZG93ICkuc2V0R3JvdXAoIHJlbmRlckdyb3VwICk7XHJcblx0XHRcdGNvbnN0IHJhZGl1cyA9IHJlZmVyZW5jZSggJ3JhZGl1cycsICdmbG9hdCcsIHNoYWRvdyApLnNldEdyb3VwKCByZW5kZXJHcm91cCApO1xyXG5cdFx0XHRjb25zdCBzaXplID0gcmVmZXJlbmNlKCAnbWFwU2l6ZScsICd2ZWMyJywgc2hhZG93ICkuc2V0R3JvdXAoIHJlbmRlckdyb3VwICk7XHJcblxyXG5cdFx0XHRsZXQgbWF0ZXJpYWwgPSB0aGlzLnZzbU1hdGVyaWFsVmVydGljYWwgfHwgKCB0aGlzLnZzbU1hdGVyaWFsVmVydGljYWwgPSBuZXcgTm9kZU1hdGVyaWFsKCkgKTtcclxuXHRcdFx0bWF0ZXJpYWwuZnJhZ21lbnROb2RlID0gVlNNUGFzc1ZlcnRpY2FsKCB7IHNhbXBsZXMsIHJhZGl1cywgc2l6ZSwgc2hhZG93UGFzczogc2hhZG93UGFzc1ZlcnRpY2FsIH0gKS5jb250ZXh0KCBidWlsZGVyLmdldFNoYXJlZENvbnRleHQoKSApO1xyXG5cdFx0XHRtYXRlcmlhbC5uYW1lID0gJ1ZTTVZlcnRpY2FsJztcclxuXHJcblx0XHRcdG1hdGVyaWFsID0gdGhpcy52c21NYXRlcmlhbEhvcml6b250YWwgfHwgKCB0aGlzLnZzbU1hdGVyaWFsSG9yaXpvbnRhbCA9IG5ldyBOb2RlTWF0ZXJpYWwoKSApO1xyXG5cdFx0XHRtYXRlcmlhbC5mcmFnbWVudE5vZGUgPSBWU01QYXNzSG9yaXpvbnRhbCggeyBzYW1wbGVzLCByYWRpdXMsIHNpemUsIHNoYWRvd1Bhc3M6IHNoYWRvd1Bhc3NIb3Jpem9udGFsIH0gKS5jb250ZXh0KCBidWlsZGVyLmdldFNoYXJlZENvbnRleHQoKSApO1xyXG5cdFx0XHRtYXRlcmlhbC5uYW1lID0gJ1ZTTUhvcml6b250YWwnO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGNvbnN0IHNoYWRvd0ludGVuc2l0eSA9IHJlZmVyZW5jZSggJ2ludGVuc2l0eScsICdmbG9hdCcsIHNoYWRvdyApLnNldEdyb3VwKCByZW5kZXJHcm91cCApO1xyXG5cdFx0Y29uc3Qgbm9ybWFsQmlhcyA9IHJlZmVyZW5jZSggJ25vcm1hbEJpYXMnLCAnZmxvYXQnLCBzaGFkb3cgKS5zZXRHcm91cCggcmVuZGVyR3JvdXAgKTtcclxuXHJcblx0XHRjb25zdCBzaGFkb3dQb3NpdGlvbiA9IGxpZ2h0U2hhZG93TWF0cml4KCBsaWdodCApLm11bCggc2hhZG93UG9zaXRpb25Xb3JsZC5hZGQoIHRyYW5zZm9ybWVkTm9ybWFsV29ybGQubXVsKCBub3JtYWxCaWFzICkgKSApO1xyXG5cdFx0Y29uc3Qgc2hhZG93Q29vcmQgPSB0aGlzLnNldHVwU2hhZG93Q29vcmQoIGJ1aWxkZXIsIHNoYWRvd1Bvc2l0aW9uICk7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCBmaWx0ZXJGbiA9IHNoYWRvdy5maWx0ZXJOb2RlIHx8IHRoaXMuZ2V0U2hhZG93RmlsdGVyRm4oIHJlbmRlcmVyLnNoYWRvd01hcC50eXBlICkgfHwgbnVsbDtcclxuXHJcblx0XHRpZiAoIGZpbHRlckZuID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuV2ViR1BVUmVuZGVyZXI6IFNoYWRvdyBtYXAgdHlwZSBub3Qgc3VwcG9ydGVkIHlldC4nICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHNoYWRvd0RlcHRoVGV4dHVyZSA9ICggc2hhZG93TWFwVHlwZSA9PT0gVlNNU2hhZG93TWFwICkgPyB0aGlzLnZzbVNoYWRvd01hcEhvcml6b250YWwudGV4dHVyZSA6IGRlcHRoVGV4dHVyZTtcclxuXHJcblx0XHRjb25zdCBzaGFkb3dOb2RlID0gdGhpcy5zZXR1cFNoYWRvd0ZpbHRlciggYnVpbGRlciwgeyBmaWx0ZXJGbiwgc2hhZG93VGV4dHVyZTogc2hhZG93TWFwLnRleHR1cmUsIGRlcHRoVGV4dHVyZTogc2hhZG93RGVwdGhUZXh0dXJlLCBzaGFkb3dDb29yZCwgc2hhZG93IH0gKTtcclxuXHJcblx0XHRjb25zdCBzaGFkb3dDb2xvciA9IHRleHR1cmUoIHNoYWRvd01hcC50ZXh0dXJlLCBzaGFkb3dDb29yZCApO1xyXG5cdFx0Y29uc3Qgc2hhZG93T3V0cHV0ID0gbWl4KCAxLCBzaGFkb3dOb2RlLnJnYi5taXgoIHNoYWRvd0NvbG9yLCAxICksIHNoYWRvd0ludGVuc2l0eS5tdWwoIHNoYWRvd0NvbG9yLmEgKSApLnRvVmFyKCk7XHJcblxyXG5cdFx0dGhpcy5zaGFkb3dNYXAgPSBzaGFkb3dNYXA7XHJcblx0XHR0aGlzLnNoYWRvdy5tYXAgPSBzaGFkb3dNYXA7XHJcblxyXG5cdFx0cmV0dXJuIHNoYWRvd091dHB1dDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgaW1wbGVtZW50YXRpb24gcGVyZm9ybXMgdGhlIHNldHVwIG9mIHRoZSBvdXRwdXQgbm9kZS4gQW4gb3V0cHV0IGlzIG9ubHlcclxuXHQgKiBwcm9kdWNlcyBpZiBzaGFkb3cgbWFwcGluZyBpcyBnbG9iYWxseSBlbmFibGVkIGluIHRoZSByZW5kZXJlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7U2hhZGVyQ2FsbE5vZGVJbnRlcm5hbH0gVGhlIG91dHB1dCBub2RlLlxyXG5cdCAqL1xyXG5cdHNldHVwKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGlmICggYnVpbGRlci5yZW5kZXJlci5zaGFkb3dNYXAuZW5hYmxlZCA9PT0gZmFsc2UgKSByZXR1cm47XHJcblxyXG5cdFx0cmV0dXJuIEZuKCAoKSA9PiB7XHJcblxyXG5cdFx0XHRsZXQgbm9kZSA9IHRoaXMuX25vZGU7XHJcblxyXG5cdFx0XHR0aGlzLnNldHVwU2hhZG93UG9zaXRpb24oIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRcdGlmICggbm9kZSA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5fbm9kZSA9IG5vZGUgPSB0aGlzLnNldHVwU2hhZG93KCBidWlsZGVyICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIGJ1aWxkZXIubWF0ZXJpYWwuc2hhZG93Tm9kZSApIHsgLy8gQGRlcHJlY2F0ZWQsIHIxNzFcclxuXHJcblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTm9kZU1hdGVyaWFsOiBcIi5zaGFkb3dOb2RlXCIgaXMgZGVwcmVjYXRlZC4gVXNlIFwiLmNhc3RTaGFkb3dOb2RlXCIgaW5zdGVhZC4nICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIGJ1aWxkZXIubWF0ZXJpYWwucmVjZWl2ZWRTaGFkb3dOb2RlICkge1xyXG5cclxuXHRcdFx0XHRub2RlID0gYnVpbGRlci5tYXRlcmlhbC5yZWNlaXZlZFNoYWRvd05vZGUoIG5vZGUgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBub2RlO1xyXG5cclxuXHRcdH0gKSgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbmRlcnMgdGhlIHNoYWRvdy4gVGhlIGxvZ2ljIG9mIHRoaXMgZnVuY3Rpb24gY291bGQgYmUgaW5jbHVkZWRcclxuXHQgKiBpbnRvIHtAbGluayBTaGFkb3dOb2RlI3VwZGF0ZVNoYWRvd30gaG93ZXZlciBtb3JlIHNwZWNpYWxpemVkIHNoYWRvd1xyXG5cdCAqIG5vZGVzIG1pZ2h0IHJlcXVpcmUgYSBjdXN0b20gc2hhZG93IG1hcCByZW5kZXJpbmcuIEJ5IGhhdmluZyBhXHJcblx0ICogZGVkaWNhdGVkIG1ldGhvZCwgaXQncyBlYXNpZXIgdG8gb3ZlcndyaXRlIHRoZSBkZWZhdWx0IGJlaGF2aW9yLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlRnJhbWV9IGZyYW1lIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgbm9kZSBmcmFtZS5cclxuXHQgKi9cclxuXHRyZW5kZXJTaGFkb3coIGZyYW1lICkge1xyXG5cclxuXHRcdGNvbnN0IHsgc2hhZG93LCBzaGFkb3dNYXAsIGxpZ2h0IH0gPSB0aGlzO1xyXG5cdFx0Y29uc3QgeyByZW5kZXJlciwgc2NlbmUgfSA9IGZyYW1lO1xyXG5cclxuXHRcdHNoYWRvdy51cGRhdGVNYXRyaWNlcyggbGlnaHQgKTtcclxuXHJcblx0XHRzaGFkb3dNYXAuc2V0U2l6ZSggc2hhZG93Lm1hcFNpemUud2lkdGgsIHNoYWRvdy5tYXBTaXplLmhlaWdodCApO1xyXG5cclxuXHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIHNoYWRvdy5jYW1lcmEgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoZSBzaGFkb3cuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVGcmFtZX0gZnJhbWUgLSBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBub2RlIGZyYW1lLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZVNoYWRvdyggZnJhbWUgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBzaGFkb3dNYXAsIGxpZ2h0LCBzaGFkb3cgfSA9IHRoaXM7XHJcblx0XHRjb25zdCB7IHJlbmRlcmVyLCBzY2VuZSwgY2FtZXJhIH0gPSBmcmFtZTtcclxuXHJcblx0XHRjb25zdCBzaGFkb3dUeXBlID0gcmVuZGVyZXIuc2hhZG93TWFwLnR5cGU7XHJcblxyXG5cdFx0Y29uc3QgZGVwdGhWZXJzaW9uID0gc2hhZG93TWFwLmRlcHRoVGV4dHVyZS52ZXJzaW9uO1xyXG5cdFx0dGhpcy5fZGVwdGhWZXJzaW9uQ2FjaGVkID0gZGVwdGhWZXJzaW9uO1xyXG5cclxuXHRcdHNoYWRvdy5jYW1lcmEubGF5ZXJzLm1hc2sgPSBjYW1lcmEubGF5ZXJzLm1hc2s7XHJcblxyXG5cdFx0Y29uc3QgY3VycmVudFJlbmRlck9iamVjdEZ1bmN0aW9uID0gcmVuZGVyZXIuZ2V0UmVuZGVyT2JqZWN0RnVuY3Rpb24oKTtcclxuXHJcblx0XHRjb25zdCBjdXJyZW50TVJUID0gcmVuZGVyZXIuZ2V0TVJUKCk7XHJcblx0XHRjb25zdCB1c2VWZWxvY2l0eSA9IGN1cnJlbnRNUlQgPyBjdXJyZW50TVJULmhhcyggJ3ZlbG9jaXR5JyApIDogZmFsc2U7XHJcblxyXG5cdFx0X3JlbmRlcmVyU3RhdGUgPSByZXNldFJlbmRlcmVyQW5kU2NlbmVTdGF0ZSggcmVuZGVyZXIsIHNjZW5lLCBfcmVuZGVyZXJTdGF0ZSApO1xyXG5cclxuXHRcdHNjZW5lLm92ZXJyaWRlTWF0ZXJpYWwgPSBnZXRTaGFkb3dNYXRlcmlhbCggbGlnaHQgKTtcclxuXHJcblx0XHRyZW5kZXJlci5zZXRSZW5kZXJPYmplY3RGdW5jdGlvbiggKCBvYmplY3QsIHNjZW5lLCBfY2FtZXJhLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwLCAuLi5wYXJhbXMgKSA9PiB7XHJcblxyXG5cdFx0XHRpZiAoIG9iamVjdC5jYXN0U2hhZG93ID09PSB0cnVlIHx8ICggb2JqZWN0LnJlY2VpdmVTaGFkb3cgJiYgc2hhZG93VHlwZSA9PT0gVlNNU2hhZG93TWFwICkgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggdXNlVmVsb2NpdHkgKSB7XHJcblxyXG5cdFx0XHRcdFx0Z2V0RGF0YUZyb21PYmplY3QoIG9iamVjdCApLnVzZVZlbG9jaXR5ID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRvYmplY3Qub25CZWZvcmVTaGFkb3coIHJlbmRlcmVyLCBvYmplY3QsIGNhbWVyYSwgc2hhZG93LmNhbWVyYSwgZ2VvbWV0cnksIHNjZW5lLm92ZXJyaWRlTWF0ZXJpYWwsIGdyb3VwICk7XHJcblxyXG5cdFx0XHRcdHJlbmRlcmVyLnJlbmRlck9iamVjdCggb2JqZWN0LCBzY2VuZSwgX2NhbWVyYSwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cCwgLi4ucGFyYW1zICk7XHJcblxyXG5cdFx0XHRcdG9iamVjdC5vbkFmdGVyU2hhZG93KCByZW5kZXJlciwgb2JqZWN0LCBjYW1lcmEsIHNoYWRvdy5jYW1lcmEsIGdlb21ldHJ5LCBzY2VuZS5vdmVycmlkZU1hdGVyaWFsLCBncm91cCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gKTtcclxuXHJcblx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHNoYWRvd01hcCApO1xyXG5cclxuXHRcdHRoaXMucmVuZGVyU2hhZG93KCBmcmFtZSApO1xyXG5cclxuXHRcdHJlbmRlcmVyLnNldFJlbmRlck9iamVjdEZ1bmN0aW9uKCBjdXJyZW50UmVuZGVyT2JqZWN0RnVuY3Rpb24gKTtcclxuXHJcblx0XHQvLyB2c20gYmx1ciBwYXNzXHJcblxyXG5cdFx0aWYgKCBsaWdodC5pc1BvaW50TGlnaHQgIT09IHRydWUgJiYgc2hhZG93VHlwZSA9PT0gVlNNU2hhZG93TWFwICkge1xyXG5cclxuXHRcdFx0dGhpcy52c21QYXNzKCByZW5kZXJlciApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXN0b3JlUmVuZGVyZXJBbmRTY2VuZVN0YXRlKCByZW5kZXJlciwgc2NlbmUsIF9yZW5kZXJlclN0YXRlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRm9yIFZTTSBhZGRpdGlvbmFsIHJlbmRlciBwYXNzZXMgYXJlIHJlcXVpcmVkLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSZW5kZXJlcn0gcmVuZGVyZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCByZW5kZXJlci5cclxuXHQgKi9cclxuXHR2c21QYXNzKCByZW5kZXJlciApIHtcclxuXHJcblx0XHRjb25zdCB7IHNoYWRvdyB9ID0gdGhpcztcclxuXHJcblx0XHR0aGlzLnZzbVNoYWRvd01hcFZlcnRpY2FsLnNldFNpemUoIHNoYWRvdy5tYXBTaXplLndpZHRoLCBzaGFkb3cubWFwU2l6ZS5oZWlnaHQgKTtcclxuXHRcdHRoaXMudnNtU2hhZG93TWFwSG9yaXpvbnRhbC5zZXRTaXplKCBzaGFkb3cubWFwU2l6ZS53aWR0aCwgc2hhZG93Lm1hcFNpemUuaGVpZ2h0ICk7XHJcblxyXG5cdFx0cmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCB0aGlzLnZzbVNoYWRvd01hcFZlcnRpY2FsICk7XHJcblx0XHRfcXVhZE1lc2gubWF0ZXJpYWwgPSB0aGlzLnZzbU1hdGVyaWFsVmVydGljYWw7XHJcblx0XHRfcXVhZE1lc2gucmVuZGVyKCByZW5kZXJlciApO1xyXG5cclxuXHRcdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggdGhpcy52c21TaGFkb3dNYXBIb3Jpem9udGFsICk7XHJcblx0XHRfcXVhZE1lc2gubWF0ZXJpYWwgPSB0aGlzLnZzbU1hdGVyaWFsSG9yaXpvbnRhbDtcclxuXHRcdF9xdWFkTWVzaC5yZW5kZXIoIHJlbmRlcmVyICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRnJlZXMgdGhlIGludGVybmFsIHJlc291cmNlcyBvZiB0aGlzIHNoYWRvdyBub2RlLlxyXG5cdCAqL1xyXG5cdGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0dGhpcy5zaGFkb3dNYXAuZGlzcG9zZSgpO1xyXG5cdFx0dGhpcy5zaGFkb3dNYXAgPSBudWxsO1xyXG5cclxuXHRcdGlmICggdGhpcy52c21TaGFkb3dNYXBWZXJ0aWNhbCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMudnNtU2hhZG93TWFwVmVydGljYWwuZGlzcG9zZSgpO1xyXG5cdFx0XHR0aGlzLnZzbVNoYWRvd01hcFZlcnRpY2FsID0gbnVsbDtcclxuXHJcblx0XHRcdHRoaXMudnNtTWF0ZXJpYWxWZXJ0aWNhbC5kaXNwb3NlKCk7XHJcblx0XHRcdHRoaXMudnNtTWF0ZXJpYWxWZXJ0aWNhbCA9IG51bGw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy52c21TaGFkb3dNYXBIb3Jpem9udGFsICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy52c21TaGFkb3dNYXBIb3Jpem9udGFsLmRpc3Bvc2UoKTtcclxuXHRcdFx0dGhpcy52c21TaGFkb3dNYXBIb3Jpem9udGFsID0gbnVsbDtcclxuXHJcblx0XHRcdHRoaXMudnNtTWF0ZXJpYWxIb3Jpem9udGFsLmRpc3Bvc2UoKTtcclxuXHRcdFx0dGhpcy52c21NYXRlcmlhbEhvcml6b250YWwgPSBudWxsO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRzdXBlci5kaXNwb3NlKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGltcGxlbWVudGF0aW9uIHBlcmZvcm1zIHRoZSB1cGRhdGUgb2YgdGhlIHNoYWRvdyBtYXAgaWYgbmVjZXNzYXJ5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlRnJhbWV9IGZyYW1lIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgbm9kZSBmcmFtZS5cclxuXHQgKi9cclxuXHR1cGRhdGVCZWZvcmUoIGZyYW1lICkge1xyXG5cclxuXHRcdGNvbnN0IHsgc2hhZG93IH0gPSB0aGlzO1xyXG5cclxuXHRcdGxldCBuZWVkc1VwZGF0ZSA9IHNoYWRvdy5uZWVkc1VwZGF0ZSB8fCBzaGFkb3cuYXV0b1VwZGF0ZTtcclxuXHJcblx0XHRpZiAoIG5lZWRzVXBkYXRlICkge1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLl9jYW1lcmFGcmFtZUlkWyBmcmFtZS5jYW1lcmEgXSA9PT0gZnJhbWUuZnJhbWVJZCApIHtcclxuXHJcblx0XHRcdFx0bmVlZHNVcGRhdGUgPSBmYWxzZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuX2NhbWVyYUZyYW1lSWRbIGZyYW1lLmNhbWVyYSBdID0gZnJhbWUuZnJhbWVJZDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBuZWVkc1VwZGF0ZSApIHtcclxuXHJcblx0XHRcdHRoaXMudXBkYXRlU2hhZG93KCBmcmFtZSApO1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLnNoYWRvd01hcC5kZXB0aFRleHR1cmUudmVyc2lvbiA9PT0gdGhpcy5fZGVwdGhWZXJzaW9uQ2FjaGVkICkge1xyXG5cclxuXHRcdFx0XHRzaGFkb3cubmVlZHNVcGRhdGUgPSBmYWxzZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFNoYWRvd05vZGU7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhbiBpbnN0YW5jZSBvZiBgU2hhZG93Tm9kZWAuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7TGlnaHR9IGxpZ2h0IC0gVGhlIHNoYWRvdyBjYXN0aW5nIGxpZ2h0LlxyXG4gKiBAcGFyYW0gez9MaWdodFNoYWRvd30gW3NoYWRvd10gLSBUaGUgbGlnaHQgc2hhZG93LlxyXG4gKiBAcmV0dXJuIHtTaGFkb3dOb2RlfSBUaGUgY3JlYXRlZCBzaGFkb3cgbm9kZS5cclxuICovXHJcbmV4cG9ydCBjb25zdCBzaGFkb3cgPSAoIGxpZ2h0LCBzaGFkb3cgKSA9PiBub2RlT2JqZWN0KCBuZXcgU2hhZG93Tm9kZSggbGlnaHQsIHNoYWRvdyApICk7XHJcbiIsImltcG9ydCBTaGFkb3dOb2RlIGZyb20gJy4vU2hhZG93Tm9kZS5qcyc7XHJcbmltcG9ydCB7IHVuaWZvcm0gfSBmcm9tICcuLi9jb3JlL1VuaWZvcm1Ob2RlLmpzJztcclxuaW1wb3J0IHsgZmxvYXQsIHZlYzIsIElmLCBGbiwgbm9kZU9iamVjdCB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuaW1wb3J0IHsgcmVmZXJlbmNlIH0gZnJvbSAnLi4vYWNjZXNzb3JzL1JlZmVyZW5jZU5vZGUuanMnO1xyXG5pbXBvcnQgeyB0ZXh0dXJlIH0gZnJvbSAnLi4vYWNjZXNzb3JzL1RleHR1cmVOb2RlLmpzJztcclxuaW1wb3J0IHsgbWF4LCBhYnMsIHNpZ24gfSBmcm9tICcuLi9tYXRoL01hdGhOb2RlLmpzJztcclxuaW1wb3J0IHsgc3ViLCBkaXYgfSBmcm9tICcuLi9tYXRoL09wZXJhdG9yTm9kZS5qcyc7XHJcbmltcG9ydCB7IHJlbmRlckdyb3VwIH0gZnJvbSAnLi4vY29yZS9Vbmlmb3JtR3JvdXBOb2RlLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMi5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjQgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjQuanMnO1xyXG5pbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uLy4uL21hdGgvQ29sb3IuanMnO1xyXG5pbXBvcnQgeyBCYXNpY1NoYWRvd01hcCB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcblxyXG5jb25zdCBfY2xlYXJDb2xvciA9IC8qQF9fUFVSRV9fKi8gbmV3IENvbG9yKCk7XHJcblxyXG4vLyBjdWJlVG9VVigpIG1hcHMgYSAzRCBkaXJlY3Rpb24gdmVjdG9yIHN1aXRhYmxlIGZvciBjdWJlIHRleHR1cmUgbWFwcGluZyB0byBhIDJEXHJcbi8vIHZlY3RvciBzdWl0YWJsZSBmb3IgMkQgdGV4dHVyZSBtYXBwaW5nLiBUaGlzIGNvZGUgdXNlcyB0aGUgZm9sbG93aW5nIGxheW91dCBmb3IgdGhlXHJcbi8vIDJEIHRleHR1cmU6XHJcbi8vXHJcbi8vIHh6WFpcclxuLy8gIHkgWVxyXG4vL1xyXG4vLyBZIC0gUG9zaXRpdmUgeSBkaXJlY3Rpb25cclxuLy8geSAtIE5lZ2F0aXZlIHkgZGlyZWN0aW9uXHJcbi8vIFggLSBQb3NpdGl2ZSB4IGRpcmVjdGlvblxyXG4vLyB4IC0gTmVnYXRpdmUgeCBkaXJlY3Rpb25cclxuLy8gWiAtIFBvc2l0aXZlIHogZGlyZWN0aW9uXHJcbi8vIHogLSBOZWdhdGl2ZSB6IGRpcmVjdGlvblxyXG4vL1xyXG4vLyBTb3VyY2UgYW5kIHRlc3QgYmVkOlxyXG4vLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS90c2Nody9kYTEwYzQzYzQ2N2NlOGFmZDBjNFxyXG5cclxuZXhwb3J0IGNvbnN0IGN1YmVUb1VWID0gLypAX19QVVJFX18qLyBGbiggKCBbIHBvcywgdGV4ZWxTaXplWSBdICkgPT4ge1xyXG5cclxuXHRjb25zdCB2ID0gcG9zLnRvVmFyKCk7XHJcblxyXG5cdC8vIE51bWJlciBvZiB0ZXhlbHMgdG8gYXZvaWQgYXQgdGhlIGVkZ2Ugb2YgZWFjaCBzcXVhcmVcclxuXHJcblx0Y29uc3QgYWJzViA9IGFicyggdiApO1xyXG5cclxuXHQvLyBJbnRlcnNlY3QgdW5pdCBjdWJlXHJcblxyXG5cdGNvbnN0IHNjYWxlVG9DdWJlID0gZGl2KCAxLjAsIG1heCggYWJzVi54LCBtYXgoIGFic1YueSwgYWJzVi56ICkgKSApO1xyXG5cdGFic1YubXVsQXNzaWduKCBzY2FsZVRvQ3ViZSApO1xyXG5cclxuXHQvLyBBcHBseSBzY2FsZSB0byBhdm9pZCBzZWFtc1xyXG5cclxuXHQvLyB0d28gdGV4ZWxzIGxlc3MgcGVyIHNxdWFyZSAob25lIHRleGVsIHdpbGwgZG8gZm9yIE5FQVJFU1QpXHJcblx0di5tdWxBc3NpZ24oIHNjYWxlVG9DdWJlLm11bCggdGV4ZWxTaXplWS5tdWwoIDIgKS5vbmVNaW51cygpICkgKTtcclxuXHJcblx0Ly8gVW53cmFwXHJcblxyXG5cdC8vIHNwYWNlOiAtMSAuLi4gMSByYW5nZSBmb3IgZWFjaCBzcXVhcmVcclxuXHQvL1xyXG5cdC8vICNYIyNcdFx0ZGltICAgIDo9ICggNCAsIDIgKVxyXG5cdC8vICAjICNcdFx0Y2VudGVyIDo9ICggMSAsIDEgKVxyXG5cclxuXHRjb25zdCBwbGFuYXIgPSB2ZWMyKCB2Lnh5ICkudG9WYXIoKTtcclxuXHJcblx0Y29uc3QgYWxtb3N0QVRleGVsID0gdGV4ZWxTaXplWS5tdWwoIDEuNSApO1xyXG5cdGNvbnN0IGFsbW9zdE9uZSA9IGFsbW9zdEFUZXhlbC5vbmVNaW51cygpO1xyXG5cclxuXHRJZiggYWJzVi56LmdyZWF0ZXJUaGFuRXF1YWwoIGFsbW9zdE9uZSApLCAoKSA9PiB7XHJcblxyXG5cdFx0SWYoIHYuei5ncmVhdGVyVGhhbiggMC4wICksICgpID0+IHtcclxuXHJcblx0XHRcdHBsYW5hci54LmFzc2lnbiggc3ViKCA0LjAsIHYueCApICk7XHJcblxyXG5cdFx0fSApO1xyXG5cclxuXHR9ICkuRWxzZUlmKCBhYnNWLnguZ3JlYXRlclRoYW5FcXVhbCggYWxtb3N0T25lICksICgpID0+IHtcclxuXHJcblx0XHRjb25zdCBzaWduWCA9IHNpZ24oIHYueCApO1xyXG5cdFx0cGxhbmFyLnguYXNzaWduKCB2LnoubXVsKCBzaWduWCApLmFkZCggc2lnblgubXVsKCAyLjAgKSApICk7XHJcblxyXG5cdH0gKS5FbHNlSWYoIGFic1YueS5ncmVhdGVyVGhhbkVxdWFsKCBhbG1vc3RPbmUgKSwgKCkgPT4ge1xyXG5cclxuXHRcdGNvbnN0IHNpZ25ZID0gc2lnbiggdi55ICk7XHJcblx0XHRwbGFuYXIueC5hc3NpZ24oIHYueC5hZGQoIHNpZ25ZLm11bCggMi4wICkgKS5hZGQoIDIuMCApICk7XHJcblx0XHRwbGFuYXIueS5hc3NpZ24oIHYuei5tdWwoIHNpZ25ZICkuc3ViKCAyLjAgKSApO1xyXG5cclxuXHR9ICk7XHJcblxyXG5cdC8vIFRyYW5zZm9ybSB0byBVViBzcGFjZVxyXG5cclxuXHQvLyBzY2FsZSA6PSAwLjUgLyBkaW1cclxuXHQvLyB0cmFuc2xhdGUgOj0gKCBjZW50ZXIgKyAwLjUgKSAvIGRpbVxyXG5cdHJldHVybiB2ZWMyKCAwLjEyNSwgMC4yNSApLm11bCggcGxhbmFyICkuYWRkKCB2ZWMyKCAwLjM3NSwgMC43NSApICkuZmxpcFkoKTtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnY3ViZVRvVVYnLFxyXG5cdHR5cGU6ICd2ZWMyJyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ3BvcycsIHR5cGU6ICd2ZWMzJyB9LFxyXG5cdFx0eyBuYW1lOiAndGV4ZWxTaXplWScsIHR5cGU6ICdmbG9hdCcgfVxyXG5cdF1cclxufSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IEJhc2ljUG9pbnRTaGFkb3dGaWx0ZXIgPSAvKkBfX1BVUkVfXyovIEZuKCAoIHsgZGVwdGhUZXh0dXJlLCBiZDNELCBkcCwgdGV4ZWxTaXplIH0gKSA9PiB7XHJcblxyXG5cdHJldHVybiB0ZXh0dXJlKCBkZXB0aFRleHR1cmUsIGN1YmVUb1VWKCBiZDNELCB0ZXhlbFNpemUueSApICkuY29tcGFyZSggZHAgKTtcclxuXHJcbn0gKTtcclxuXHJcbmV4cG9ydCBjb25zdCBQb2ludFNoYWRvd0ZpbHRlciA9IC8qQF9fUFVSRV9fKi8gRm4oICggeyBkZXB0aFRleHR1cmUsIGJkM0QsIGRwLCB0ZXhlbFNpemUsIHNoYWRvdyB9ICkgPT4ge1xyXG5cclxuXHRjb25zdCByYWRpdXMgPSByZWZlcmVuY2UoICdyYWRpdXMnLCAnZmxvYXQnLCBzaGFkb3cgKS5zZXRHcm91cCggcmVuZGVyR3JvdXAgKTtcclxuXHRjb25zdCBvZmZzZXQgPSB2ZWMyKCAtIDEuMCwgMS4wICkubXVsKCByYWRpdXMgKS5tdWwoIHRleGVsU2l6ZS55ICk7XHJcblxyXG5cdHJldHVybiB0ZXh0dXJlKCBkZXB0aFRleHR1cmUsIGN1YmVUb1VWKCBiZDNELmFkZCggb2Zmc2V0Lnh5eSApLCB0ZXhlbFNpemUueSApICkuY29tcGFyZSggZHAgKVxyXG5cdFx0LmFkZCggdGV4dHVyZSggZGVwdGhUZXh0dXJlLCBjdWJlVG9VViggYmQzRC5hZGQoIG9mZnNldC55eXkgKSwgdGV4ZWxTaXplLnkgKSApLmNvbXBhcmUoIGRwICkgKVxyXG5cdFx0LmFkZCggdGV4dHVyZSggZGVwdGhUZXh0dXJlLCBjdWJlVG9VViggYmQzRC5hZGQoIG9mZnNldC54eXggKSwgdGV4ZWxTaXplLnkgKSApLmNvbXBhcmUoIGRwICkgKVxyXG5cdFx0LmFkZCggdGV4dHVyZSggZGVwdGhUZXh0dXJlLCBjdWJlVG9VViggYmQzRC5hZGQoIG9mZnNldC55eXggKSwgdGV4ZWxTaXplLnkgKSApLmNvbXBhcmUoIGRwICkgKVxyXG5cdFx0LmFkZCggdGV4dHVyZSggZGVwdGhUZXh0dXJlLCBjdWJlVG9VViggYmQzRCwgdGV4ZWxTaXplLnkgKSApLmNvbXBhcmUoIGRwICkgKVxyXG5cdFx0LmFkZCggdGV4dHVyZSggZGVwdGhUZXh0dXJlLCBjdWJlVG9VViggYmQzRC5hZGQoIG9mZnNldC54eHkgKSwgdGV4ZWxTaXplLnkgKSApLmNvbXBhcmUoIGRwICkgKVxyXG5cdFx0LmFkZCggdGV4dHVyZSggZGVwdGhUZXh0dXJlLCBjdWJlVG9VViggYmQzRC5hZGQoIG9mZnNldC55eHkgKSwgdGV4ZWxTaXplLnkgKSApLmNvbXBhcmUoIGRwICkgKVxyXG5cdFx0LmFkZCggdGV4dHVyZSggZGVwdGhUZXh0dXJlLCBjdWJlVG9VViggYmQzRC5hZGQoIG9mZnNldC54eHggKSwgdGV4ZWxTaXplLnkgKSApLmNvbXBhcmUoIGRwICkgKVxyXG5cdFx0LmFkZCggdGV4dHVyZSggZGVwdGhUZXh0dXJlLCBjdWJlVG9VViggYmQzRC5hZGQoIG9mZnNldC55eHggKSwgdGV4ZWxTaXplLnkgKSApLmNvbXBhcmUoIGRwICkgKVxyXG5cdFx0Lm11bCggMS4wIC8gOS4wICk7XHJcblxyXG59ICk7XHJcblxyXG5jb25zdCBwb2ludFNoYWRvd0ZpbHRlciA9IC8qQF9fUFVSRV9fKi8gRm4oICggeyBmaWx0ZXJGbiwgZGVwdGhUZXh0dXJlLCBzaGFkb3dDb29yZCwgc2hhZG93IH0gKSA9PiB7XHJcblxyXG5cdC8vIGZvciBwb2ludCBsaWdodHMsIHRoZSB1bmlmb3JtIEB2U2hhZG93Q29vcmQgaXMgcmUtcHVycG9zZWQgdG8gaG9sZFxyXG5cdC8vIHRoZSB2ZWN0b3IgZnJvbSB0aGUgbGlnaHQgdG8gdGhlIHdvcmxkLXNwYWNlIHBvc2l0aW9uIG9mIHRoZSBmcmFnbWVudC5cclxuXHRjb25zdCBsaWdodFRvUG9zaXRpb24gPSBzaGFkb3dDb29yZC54eXoudG9WYXIoKTtcclxuXHRjb25zdCBsaWdodFRvUG9zaXRpb25MZW5ndGggPSBsaWdodFRvUG9zaXRpb24ubGVuZ3RoKCk7XHJcblxyXG5cdGNvbnN0IGNhbWVyYU5lYXJMb2NhbCA9IHVuaWZvcm0oICdmbG9hdCcgKS5zZXRHcm91cCggcmVuZGVyR3JvdXAgKS5vblJlbmRlclVwZGF0ZSggKCkgPT4gc2hhZG93LmNhbWVyYS5uZWFyICk7XHJcblx0Y29uc3QgY2FtZXJhRmFyTG9jYWwgPSB1bmlmb3JtKCAnZmxvYXQnICkuc2V0R3JvdXAoIHJlbmRlckdyb3VwICkub25SZW5kZXJVcGRhdGUoICgpID0+IHNoYWRvdy5jYW1lcmEuZmFyICk7XHJcblx0Y29uc3QgYmlhcyA9IHJlZmVyZW5jZSggJ2JpYXMnLCAnZmxvYXQnLCBzaGFkb3cgKS5zZXRHcm91cCggcmVuZGVyR3JvdXAgKTtcclxuXHRjb25zdCBtYXBTaXplID0gdW5pZm9ybSggc2hhZG93Lm1hcFNpemUgKS5zZXRHcm91cCggcmVuZGVyR3JvdXAgKTtcclxuXHJcblx0Y29uc3QgcmVzdWx0ID0gZmxvYXQoIDEuMCApLnRvVmFyKCk7XHJcblxyXG5cdElmKCBsaWdodFRvUG9zaXRpb25MZW5ndGguc3ViKCBjYW1lcmFGYXJMb2NhbCApLmxlc3NUaGFuRXF1YWwoIDAuMCApLmFuZCggbGlnaHRUb1Bvc2l0aW9uTGVuZ3RoLnN1YiggY2FtZXJhTmVhckxvY2FsICkuZ3JlYXRlclRoYW5FcXVhbCggMC4wICkgKSwgKCkgPT4ge1xyXG5cclxuXHRcdC8vIGRwID0gbm9ybWFsaXplZCBkaXN0YW5jZSBmcm9tIGxpZ2h0IHRvIGZyYWdtZW50IHBvc2l0aW9uXHJcblx0XHRjb25zdCBkcCA9IGxpZ2h0VG9Qb3NpdGlvbkxlbmd0aC5zdWIoIGNhbWVyYU5lYXJMb2NhbCApLmRpdiggY2FtZXJhRmFyTG9jYWwuc3ViKCBjYW1lcmFOZWFyTG9jYWwgKSApLnRvVmFyKCk7IC8vIG5lZWQgdG8gY2xhbXA/XHJcblx0XHRkcC5hZGRBc3NpZ24oIGJpYXMgKTtcclxuXHJcblx0XHQvLyBiZDNEID0gYmFzZSBkaXJlY3Rpb24gM0RcclxuXHRcdGNvbnN0IGJkM0QgPSBsaWdodFRvUG9zaXRpb24ubm9ybWFsaXplKCk7XHJcblx0XHRjb25zdCB0ZXhlbFNpemUgPSB2ZWMyKCAxLjAgKS5kaXYoIG1hcFNpemUubXVsKCB2ZWMyKCA0LjAsIDIuMCApICkgKTtcclxuXHJcblx0XHQvLyBwZXJjZW50YWdlLWNsb3NlciBmaWx0ZXJpbmdcclxuXHRcdHJlc3VsdC5hc3NpZ24oIGZpbHRlckZuKCB7IGRlcHRoVGV4dHVyZSwgYmQzRCwgZHAsIHRleGVsU2l6ZSwgc2hhZG93IH0gKSApO1xyXG5cclxuXHR9ICk7XHJcblxyXG5cdHJldHVybiByZXN1bHQ7XHJcblxyXG59ICk7XHJcblxyXG5jb25zdCBfdmlld3BvcnQgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3I0KCk7XHJcbmNvbnN0IF92aWV3cG9ydFNpemUgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IyKCk7XHJcbmNvbnN0IF9zaGFkb3dNYXBTaXplID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMigpO1xyXG5cclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIHRoZSBzaGFkb3cgaW1wbGVtZW50YXRpb24gZm9yIHBvaW50IGxpZ2h0IG5vZGVzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgU2hhZG93Tm9kZVxyXG4gKi9cclxuY2xhc3MgUG9pbnRTaGFkb3dOb2RlIGV4dGVuZHMgU2hhZG93Tm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ1BvaW50U2hhZG93Tm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBwb2ludCBzaGFkb3cgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UG9pbnRMaWdodH0gbGlnaHQgLSBUaGUgc2hhZG93IGNhc3RpbmcgcG9pbnQgbGlnaHQuXHJcblx0ICogQHBhcmFtIHs/UG9pbnRMaWdodFNoYWRvd30gW3NoYWRvdz1udWxsXSAtIEFuIG9wdGlvbmFsIHBvaW50IGxpZ2h0IHNoYWRvdy5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbGlnaHQsIHNoYWRvdyA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoIGxpZ2h0LCBzaGFkb3cgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBPdmVyd3JpdGVzIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRvIHJldHVybiBwb2ludCBsaWdodCBzaGFkb3cgc3BlY2lmaWNcclxuXHQgKiBmaWx0ZXJpbmcgZnVuY3Rpb25zLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHR5cGUgLSBUaGUgc2hhZG93IHR5cGUuXHJcblx0ICogQHJldHVybiB7RnVuY3Rpb259IFRoZSBmaWx0ZXJpbmcgZnVuY3Rpb24uXHJcblx0ICovXHJcblx0Z2V0U2hhZG93RmlsdGVyRm4oIHR5cGUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHR5cGUgPT09IEJhc2ljU2hhZG93TWFwID8gQmFzaWNQb2ludFNoYWRvd0ZpbHRlciA6IFBvaW50U2hhZG93RmlsdGVyO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE92ZXJ3cml0ZXMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc28gdGhlIHVuYWx0ZXJlZCBzaGFkb3cgcG9zaXRpb24gaXMgdXNlZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHBhcmFtIHtOb2RlPHZlYzM+fSBzaGFkb3dQb3NpdGlvbiAtIEEgbm9kZSByZXByZXNlbnRpbmcgdGhlIHNoYWRvdyBwb3NpdGlvbi5cclxuXHQgKiBAcmV0dXJuIHtOb2RlPHZlYzM+fSBUaGUgc2hhZG93IGNvb3JkaW5hdGVzLlxyXG5cdCAqL1xyXG5cdHNldHVwU2hhZG93Q29vcmQoIGJ1aWxkZXIsIHNoYWRvd1Bvc2l0aW9uICkge1xyXG5cclxuXHRcdHJldHVybiBzaGFkb3dQb3NpdGlvbjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBPdmVyd3JpdGVzIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRvIG9ubHkgdXNlIHBvaW50IGxpZ2h0IHNwZWNpZmljXHJcblx0ICogc2hhZG93IGZpbHRlciBmdW5jdGlvbnMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dHMgLSBBIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHRoYXQgZGVmaW5lcyB0aGUgc2hhZG93IGZpbHRlcmluZy5cclxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpbnB1dHMuZmlsdGVyRm4gLSBUaGlzIGZ1bmN0aW9uIGRlZmluZXMgdGhlIGZpbHRlcmluZyB0eXBlIG9mIHRoZSBzaGFkb3cgbWFwIGUuZy4gUENGLlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gaW5wdXRzLnNoYWRvd1RleHR1cmUgLSBBIHJlZmVyZW5jZSB0byB0aGUgc2hhZG93IG1hcCdzIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtEZXB0aFRleHR1cmV9IGlucHV0cy5kZXB0aFRleHR1cmUgLSBBIHJlZmVyZW5jZSB0byB0aGUgc2hhZG93IG1hcCdzIHRleHR1cmUgZGF0YS5cclxuXHQgKiBAcGFyYW0ge05vZGU8dmVjMz59IGlucHV0cy5zaGFkb3dDb29yZCAtIFNoYWRvdyBjb29yZGluYXRlcyB3aGljaCBhcmUgdXNlZCB0byBzYW1wbGUgZnJvbSB0aGUgc2hhZG93IG1hcC5cclxuXHQgKiBAcGFyYW0ge0xpZ2h0U2hhZG93fSBpbnB1dHMuc2hhZG93IC0gVGhlIGxpZ2h0IHNoYWRvdy5cclxuXHQgKiBAcmV0dXJuIHtOb2RlPGZsb2F0Pn0gVGhlIHJlc3VsdCBub2RlIG9mIHRoZSBzaGFkb3cgZmlsdGVyaW5nLlxyXG5cdCAqL1xyXG5cdHNldHVwU2hhZG93RmlsdGVyKCBidWlsZGVyLCB7IGZpbHRlckZuLCBzaGFkb3dUZXh0dXJlLCBkZXB0aFRleHR1cmUsIHNoYWRvd0Nvb3JkLCBzaGFkb3cgfSApIHtcclxuXHJcblx0XHRyZXR1cm4gcG9pbnRTaGFkb3dGaWx0ZXIoIHsgZmlsdGVyRm4sIHNoYWRvd1RleHR1cmUsIGRlcHRoVGV4dHVyZSwgc2hhZG93Q29vcmQsIHNoYWRvdyB9ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogT3ZlcndyaXRlcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB3aXRoIHBvaW50IGxpZ2h0IHNwZWNpZmljXHJcblx0ICogcmVuZGVyaW5nIGNvZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVGcmFtZX0gZnJhbWUgLSBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBub2RlIGZyYW1lLlxyXG5cdCAqL1xyXG5cdHJlbmRlclNoYWRvdyggZnJhbWUgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBzaGFkb3csIHNoYWRvd01hcCwgbGlnaHQgfSA9IHRoaXM7XHJcblx0XHRjb25zdCB7IHJlbmRlcmVyLCBzY2VuZSB9ID0gZnJhbWU7XHJcblxyXG5cdFx0Y29uc3Qgc2hhZG93RnJhbWVFeHRlbnRzID0gc2hhZG93LmdldEZyYW1lRXh0ZW50cygpO1xyXG5cclxuXHRcdF9zaGFkb3dNYXBTaXplLmNvcHkoIHNoYWRvdy5tYXBTaXplICk7XHJcblx0XHRfc2hhZG93TWFwU2l6ZS5tdWx0aXBseSggc2hhZG93RnJhbWVFeHRlbnRzICk7XHJcblxyXG5cdFx0c2hhZG93TWFwLnNldFNpemUoIF9zaGFkb3dNYXBTaXplLndpZHRoLCBfc2hhZG93TWFwU2l6ZS5oZWlnaHQgKTtcclxuXHJcblx0XHRfdmlld3BvcnRTaXplLmNvcHkoIHNoYWRvdy5tYXBTaXplICk7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCBwcmV2aW91c0F1dG9DbGVhciA9IHJlbmRlcmVyLmF1dG9DbGVhcjtcclxuXHJcblx0XHRjb25zdCBwcmV2aW91c0NsZWFyQ29sb3IgPSByZW5kZXJlci5nZXRDbGVhckNvbG9yKCBfY2xlYXJDb2xvciApO1xyXG5cdFx0Y29uc3QgcHJldmlvdXNDbGVhckFscGhhID0gcmVuZGVyZXIuZ2V0Q2xlYXJBbHBoYSgpO1xyXG5cclxuXHRcdHJlbmRlcmVyLmF1dG9DbGVhciA9IGZhbHNlO1xyXG5cdFx0cmVuZGVyZXIuc2V0Q2xlYXJDb2xvciggc2hhZG93LmNsZWFyQ29sb3IsIHNoYWRvdy5jbGVhckFscGhhICk7XHJcblx0XHRyZW5kZXJlci5jbGVhcigpO1xyXG5cclxuXHRcdGNvbnN0IHZpZXdwb3J0Q291bnQgPSBzaGFkb3cuZ2V0Vmlld3BvcnRDb3VudCgpO1xyXG5cclxuXHRcdGZvciAoIGxldCB2cCA9IDA7IHZwIDwgdmlld3BvcnRDb3VudDsgdnAgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB2aWV3cG9ydCA9IHNoYWRvdy5nZXRWaWV3cG9ydCggdnAgKTtcclxuXHJcblx0XHRcdGNvbnN0IHggPSBfdmlld3BvcnRTaXplLnggKiB2aWV3cG9ydC54O1xyXG5cdFx0XHRjb25zdCB5ID0gX3NoYWRvd01hcFNpemUueSAtIF92aWV3cG9ydFNpemUueSAtICggX3ZpZXdwb3J0U2l6ZS55ICogdmlld3BvcnQueSApO1xyXG5cclxuXHRcdFx0X3ZpZXdwb3J0LnNldChcclxuXHRcdFx0XHR4LFxyXG5cdFx0XHRcdHksXHJcblx0XHRcdFx0X3ZpZXdwb3J0U2l6ZS54ICogdmlld3BvcnQueixcclxuXHRcdFx0XHRfdmlld3BvcnRTaXplLnkgKiB2aWV3cG9ydC53XHJcblx0XHRcdCk7XHJcblxyXG5cdFx0XHRzaGFkb3dNYXAudmlld3BvcnQuY29weSggX3ZpZXdwb3J0ICk7XHJcblxyXG5cdFx0XHRzaGFkb3cudXBkYXRlTWF0cmljZXMoIGxpZ2h0LCB2cCApO1xyXG5cclxuXHRcdFx0cmVuZGVyZXIucmVuZGVyKCBzY2VuZSwgc2hhZG93LmNhbWVyYSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdHJlbmRlcmVyLmF1dG9DbGVhciA9IHByZXZpb3VzQXV0b0NsZWFyO1xyXG5cdFx0cmVuZGVyZXIuc2V0Q2xlYXJDb2xvciggcHJldmlvdXNDbGVhckNvbG9yLCBwcmV2aW91c0NsZWFyQWxwaGEgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUG9pbnRTaGFkb3dOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYW4gaW5zdGFuY2Ugb2YgYFBvaW50U2hhZG93Tm9kZWAuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7UG9pbnRMaWdodH0gbGlnaHQgLSBUaGUgc2hhZG93IGNhc3RpbmcgcG9pbnQgbGlnaHQuXHJcbiAqIEBwYXJhbSB7P1BvaW50TGlnaHRTaGFkb3d9IFtzaGFkb3c9bnVsbF0gLSBBbiBvcHRpb25hbCBwb2ludCBsaWdodCBzaGFkb3cuXHJcbiAqIEByZXR1cm4ge1BvaW50U2hhZG93Tm9kZX0gVGhlIGNyZWF0ZWQgcG9pbnQgc2hhZG93IG5vZGUuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcG9pbnRTaGFkb3cgPSAoIGxpZ2h0LCBzaGFkb3cgKSA9PiBub2RlT2JqZWN0KCBuZXcgUG9pbnRTaGFkb3dOb2RlKCBsaWdodCwgc2hhZG93ICkgKTtcclxuIiwiaW1wb3J0IExpZ2h0aW5nTm9kZSBmcm9tICcuL0xpZ2h0aW5nTm9kZS5qcyc7XHJcbmltcG9ydCB7IE5vZGVVcGRhdGVUeXBlIH0gZnJvbSAnLi4vY29yZS9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyB1bmlmb3JtIH0gZnJvbSAnLi4vY29yZS9Vbmlmb3JtTm9kZS5qcyc7XHJcbmltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vLi4vbWF0aC9Db2xvci5qcyc7XHJcbmltcG9ydCB7IHJlbmRlckdyb3VwIH0gZnJvbSAnLi4vY29yZS9Vbmlmb3JtR3JvdXBOb2RlLmpzJztcclxuaW1wb3J0IHsgaGFzaCB9IGZyb20gJy4uL2NvcmUvTm9kZVV0aWxzLmpzJztcclxuaW1wb3J0IHsgc2hhZG93IH0gZnJvbSAnLi9TaGFkb3dOb2RlLmpzJztcclxuaW1wb3J0IHsgbm9kZU9iamVjdCB9IGZyb20gJy4uL3RzbC9UU0xDb3JlLmpzJztcclxuaW1wb3J0IHsgbGlnaHRWaWV3UG9zaXRpb24gfSBmcm9tICcuLi9hY2Nlc3NvcnMvTGlnaHRzLmpzJztcclxuaW1wb3J0IHsgcG9zaXRpb25WaWV3IH0gZnJvbSAnLi4vYWNjZXNzb3JzL1Bvc2l0aW9uLmpzJztcclxuXHJcbi8qKlxyXG4gKiBCYXNlIGNsYXNzIGZvciBhbmFseXRpYyBsaWdodCBub2Rlcy5cclxuICpcclxuICogQGF1Z21lbnRzIExpZ2h0aW5nTm9kZVxyXG4gKi9cclxuY2xhc3MgQW5hbHl0aWNMaWdodE5vZGUgZXh0ZW5kcyBMaWdodGluZ05vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdBbmFseXRpY0xpZ2h0Tm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBhbmFseXRpYyBsaWdodCBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHs/TGlnaHR9IFtsaWdodD1udWxsXSAtIFRoZSBsaWdodCBzb3VyY2UuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGxpZ2h0ID0gbnVsbCApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGxpZ2h0IHNvdXJjZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P0xpZ2h0fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxpZ2h0ID0gbGlnaHQ7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbGlnaHQncyBjb2xvciB2YWx1ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Q29sb3J9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBsaWdodCdzIGNvbG9yIG5vZGUuIFBvaW50cyB0byBgY29sb3JOb2RlYCBvZiB0aGUgbGlnaHQgc291cmNlLCBpZiBzZXQuIE90aGVyd2lzZVxyXG5cdFx0ICogaXQgY3JlYXRlcyBhIHVuaWZvcm0gbm9kZSBiYXNlZCBvbiB7QGxpbmsgQW5hbHl0aWNMaWdodE5vZGUjY29sb3J9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvbG9yTm9kZSA9ICggbGlnaHQgJiYgbGlnaHQuY29sb3JOb2RlICkgfHwgdW5pZm9ybSggdGhpcy5jb2xvciApLnNldEdyb3VwKCByZW5kZXJHcm91cCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIHRvIHJldGFpbiBhIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwgdmFsdWUgb2Yge0BsaW5rIEFuYWx5dGljTGlnaHROb2RlI2NvbG9yTm9kZX0uXHJcblx0XHQgKiBUaGUgZmluYWwgY29sb3Igbm9kZSBpcyByZXByZXNlbnRlZCBieSBhIGRpZmZlcmVudCBub2RlIHdoZW4gdXNpbmcgc2hhZG93cy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYmFzZUNvbG9yTm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXByZXNlbnRzIHRoZSBsaWdodCdzIHNoYWRvdy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1NoYWRvd05vZGV9XHJcbiAgIFx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2hhZG93Tm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXByZXNlbnRzIHRoZSBsaWdodCdzIHNoYWRvdyBjb2xvci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGV9XHJcbiAgIFx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2hhZG93Q29sb3JOb2RlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNBbmFseXRpY0xpZ2h0Tm9kZSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBPdmVyd3JpdHRlbiBzaW5jZSBhbmFseXRpYyBsaWdodCBub2RlcyBhcmUgdXBkYXRlZFxyXG5cdFx0ICogb25jZSBwZXIgZnJhbWUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqIEBkZWZhdWx0ICdmcmFtZSdcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51cGRhdGVUeXBlID0gTm9kZVVwZGF0ZVR5cGUuRlJBTUU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogT3ZlcndyaXRlcyB0aGUgZGVmYXVsdCB7QGxpbmsgTm9kZSNjdXN0b21DYWNoZUtleX0gaW1wbGVtZW50YXRpb24gYnkgaW5jbHVkaW5nIHRoZVxyXG5cdCAqIGBsaWdodC5pZGAgYW5kIGBsaWdodC5jYXN0U2hhZG93YCBpbnRvIHRoZSBjYWNoZSBrZXkuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBjdXN0b20gY2FjaGUga2V5LlxyXG5cdCAqL1xyXG5cdGN1c3RvbUNhY2hlS2V5KCkge1xyXG5cclxuXHRcdHJldHVybiBoYXNoKCB0aGlzLmxpZ2h0LmlkLCB0aGlzLmxpZ2h0LmNhc3RTaGFkb3cgPyAxIDogMCApO1xyXG5cclxuXHR9XHJcblxyXG5cdGdldEhhc2goKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubGlnaHQudXVpZDtcclxuXHJcblx0fVxyXG5cclxuXHRnZXRMaWdodFZlY3RvciggYnVpbGRlciApIHtcclxuXHJcblx0XHRyZXR1cm4gbGlnaHRWaWV3UG9zaXRpb24oIHRoaXMubGlnaHQgKS5zdWIoIGJ1aWxkZXIuY29udGV4dC5wb3NpdGlvblZpZXcgfHwgcG9zaXRpb25WaWV3ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB1cCB0aGUgZGlyZWN0IGxpZ2h0aW5nIGZvciB0aGUgYW5hbHl0aWMgbGlnaHQgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgYnVpbGRlciBvYmplY3QgdXNlZCBmb3Igc2V0dGluZyB1cCB0aGUgbGlnaHQuXHJcblx0ICogQHJldHVybiB7T2JqZWN0fHVuZGVmaW5lZH0gVGhlIGRpcmVjdCBsaWdodCBkYXRhIChjb2xvciBhbmQgZGlyZWN0aW9uKS5cclxuXHQgKi9cclxuXHRzZXR1cERpcmVjdCggLypidWlsZGVyKi8gKSB7IH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB1cCB0aGUgZGlyZWN0IHJlY3QgYXJlYSBsaWdodGluZyBmb3IgdGhlIGFuYWx5dGljIGxpZ2h0IG5vZGUuXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGJ1aWxkZXIgb2JqZWN0IHVzZWQgZm9yIHNldHRpbmcgdXAgdGhlIGxpZ2h0LlxyXG5cdCAqIEByZXR1cm4ge09iamVjdHx1bmRlZmluZWR9IFRoZSBkaXJlY3QgcmVjdCBhcmVhIGxpZ2h0IGRhdGEuXHJcblx0ICovXHJcblx0c2V0dXBEaXJlY3RSZWN0QXJlYSggLypidWlsZGVyKi8gKSB7IH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0dXBzIHRoZSBzaGFkb3cgbm9kZSBmb3IgdGhpcyBsaWdodC4gVGhlIG1ldGhvZCBleGlzdHMgc28gY29uY3JldGUgbGlnaHQgY2xhc3Nlc1xyXG5cdCAqIGNhbiBzZXR1cCBkaWZmZXJlbnQgdHlwZXMgb2Ygc2hhZG93IG5vZGVzLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7U2hhZG93Tm9kZX0gVGhlIGNyZWF0ZWQgc2hhZG93IG5vZGUuXHJcblx0ICovXHJcblx0c2V0dXBTaGFkb3dOb2RlKCkge1xyXG5cclxuXHRcdHJldHVybiBzaGFkb3coIHRoaXMubGlnaHQgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXR1cHMgdGhlIHNoYWRvdyBmb3IgdGhpcyBsaWdodC4gVGhpcyBtZXRob2QgaXMgb25seSBleGVjdXRlZCBpZiB0aGUgbGlnaHRcclxuXHQgKiBjYXN0IHNoYWRvd3MgYW5kIHRoZSBjdXJyZW50IGJ1aWxkIG9iamVjdCByZWNlaXZlcyBzaGFkb3dzLiBJdCBpbmNvcnBvcmF0ZXNcclxuXHQgKiBzaGFkb3dzIGludG8gdGhlIGxpZ2h0aW5nIGNvbXB1dGF0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKi9cclxuXHRzZXR1cFNoYWRvdyggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCB7IHJlbmRlcmVyIH0gPSBidWlsZGVyO1xyXG5cclxuXHRcdGlmICggcmVuZGVyZXIuc2hhZG93TWFwLmVuYWJsZWQgPT09IGZhbHNlICkgcmV0dXJuO1xyXG5cclxuXHRcdGxldCBzaGFkb3dDb2xvck5vZGUgPSB0aGlzLnNoYWRvd0NvbG9yTm9kZTtcclxuXHJcblx0XHRpZiAoIHNoYWRvd0NvbG9yTm9kZSA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGN1c3RvbVNoYWRvd05vZGUgPSB0aGlzLmxpZ2h0LnNoYWRvdy5zaGFkb3dOb2RlO1xyXG5cclxuXHRcdFx0bGV0IHNoYWRvd05vZGU7XHJcblxyXG5cdFx0XHRpZiAoIGN1c3RvbVNoYWRvd05vZGUgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0c2hhZG93Tm9kZSA9IG5vZGVPYmplY3QoIGN1c3RvbVNoYWRvd05vZGUgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHNoYWRvd05vZGUgPSB0aGlzLnNldHVwU2hhZG93Tm9kZSgpO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5zaGFkb3dOb2RlID0gc2hhZG93Tm9kZTtcclxuXHJcblx0XHRcdHRoaXMuc2hhZG93Q29sb3JOb2RlID0gc2hhZG93Q29sb3JOb2RlID0gdGhpcy5jb2xvck5vZGUubXVsKCBzaGFkb3dOb2RlICk7XHJcblxyXG5cdFx0XHR0aGlzLmJhc2VDb2xvck5vZGUgPSB0aGlzLmNvbG9yTm9kZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHR0aGlzLmNvbG9yTm9kZSA9IHNoYWRvd0NvbG9yTm9kZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVbmxpa2UgbW9zdCBvdGhlciBub2RlcywgbGlnaHRpbmcgbm9kZXMgZG8gbm90IHJldHVybiBhIG91dHB1dCBub2RlIGluIHtAbGluayBOb2RlI3NldHVwfS5cclxuXHQgKiBUaGUgbWFpbiBwdXJwb3NlIG9mIGxpZ2h0aW5nIG5vZGVzIGlzIHRvIGNvbmZpZ3VyZSB0aGUgY3VycmVudCB7QGxpbmsgTGlnaHRpbmdNb2RlbH0gYW5kL29yXHJcblx0ICogaW52b2NhdGUgdGhlIHJlc3BlY3RpdmUgaW50ZXJmYWNlIG1ldGhvZHMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqL1xyXG5cdHNldHVwKCBidWlsZGVyICkge1xyXG5cclxuXHRcdHRoaXMuY29sb3JOb2RlID0gdGhpcy5iYXNlQ29sb3JOb2RlIHx8IHRoaXMuY29sb3JOb2RlO1xyXG5cclxuXHRcdGlmICggdGhpcy5saWdodC5jYXN0U2hhZG93ICkge1xyXG5cclxuXHRcdFx0aWYgKCBidWlsZGVyLm9iamVjdC5yZWNlaXZlU2hhZG93ICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLnNldHVwU2hhZG93KCBidWlsZGVyICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmICggdGhpcy5zaGFkb3dOb2RlICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5zaGFkb3dOb2RlLmRpc3Bvc2UoKTtcclxuXHRcdFx0dGhpcy5zaGFkb3dOb2RlID0gbnVsbDtcclxuXHRcdFx0dGhpcy5zaGFkb3dDb2xvck5vZGUgPSBudWxsO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBkaXJlY3RMaWdodERhdGEgPSB0aGlzLnNldHVwRGlyZWN0KCBidWlsZGVyICk7XHJcblx0XHRjb25zdCBkaXJlY3RSZWN0QXJlYUxpZ2h0RGF0YSA9IHRoaXMuc2V0dXBEaXJlY3RSZWN0QXJlYSggYnVpbGRlciApO1xyXG5cclxuXHRcdGlmICggZGlyZWN0TGlnaHREYXRhICkge1xyXG5cclxuXHRcdFx0YnVpbGRlci5saWdodHNOb2RlLnNldHVwRGlyZWN0TGlnaHQoIGJ1aWxkZXIsIHRoaXMsIGRpcmVjdExpZ2h0RGF0YSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGRpcmVjdFJlY3RBcmVhTGlnaHREYXRhICkge1xyXG5cclxuXHRcdFx0YnVpbGRlci5saWdodHNOb2RlLnNldHVwRGlyZWN0UmVjdEFyZWFMaWdodCggYnVpbGRlciwgdGhpcywgZGlyZWN0UmVjdEFyZWFMaWdodERhdGEgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIHVwZGF0ZSBtZXRob2QgaXMgdXNlZCB0byB1cGRhdGUgbGlnaHQgdW5pZm9ybXMgcGVyIGZyYW1lLlxyXG5cdCAqIFBvdGVudGlhbGx5IG92ZXJ3cml0dGVuIGluIGNvbmNyZXRlIGxpZ2h0IG5vZGVzIHRvIHVwZGF0ZSBsaWdodFxyXG5cdCAqIHNwZWNpZmljIHVuaWZvcm1zLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlRnJhbWV9IGZyYW1lIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgbm9kZSBmcmFtZS5cclxuXHQgKi9cclxuXHR1cGRhdGUoIC8qZnJhbWUqLyApIHtcclxuXHJcblx0XHRjb25zdCB7IGxpZ2h0IH0gPSB0aGlzO1xyXG5cclxuXHRcdHRoaXMuY29sb3IuY29weSggbGlnaHQuY29sb3IgKS5tdWx0aXBseVNjYWxhciggbGlnaHQuaW50ZW5zaXR5ICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEFuYWx5dGljTGlnaHROb2RlO1xyXG4iLCJpbXBvcnQgeyBGbiB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIGEgYGRpc2NhcmRgIHNoYWRlciBvcGVyYXRpb24gaW4gVFNMLlxyXG4gKlxyXG4gKiBAbWV0aG9kXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dHMgLSBUaGUgaW5wdXQgcGFyYW1ldGVyIG9iamVjdC5cclxuICogQHBhcmFtIHtOb2RlPGZsb2F0Pn0gaW5wdXRzLmxpZ2h0RGlzdGFuY2UgLSBUaGUgZGlzdGFuY2Ugb2YgdGhlIGxpZ2h0J3MgcG9zaXRpb24gdG8gdGhlIGN1cnJlbnQgZnJhZ21lbnQgcG9zaXRpb24uXHJcbiAqIEBwYXJhbSB7Tm9kZTxmbG9hdD59IGlucHV0cy5jdXRvZmZEaXN0YW5jZSAtIFRoZSBsaWdodCdzIGN1dG9mZiBkaXN0YW5jZS5cclxuICogQHBhcmFtIHtOb2RlPGZsb2F0Pn0gaW5wdXRzLmRlY2F5RXhwb25lbnQgLSBUaGUgbGlnaHQncyBkZWNheSBleHBvbmVudC5cclxuICogQHJldHVybiB7Tm9kZTxmbG9hdD59IFRoZSBkaXN0YW5jZSBmYWxsb2ZmLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGdldERpc3RhbmNlQXR0ZW51YXRpb24gPSAvKkBfX1BVUkVfXyovIEZuKCAoIHsgbGlnaHREaXN0YW5jZSwgY3V0b2ZmRGlzdGFuY2UsIGRlY2F5RXhwb25lbnQgfSApID0+IHtcclxuXHJcblx0Ly8gYmFzZWQgdXBvbiBGcm9zdGJpdGUgMyBNb3ZpbmcgdG8gUGh5c2ljYWxseS1iYXNlZCBSZW5kZXJpbmdcclxuXHQvLyBwYWdlIDMyLCBlcXVhdGlvbiAyNjogRVt3aW5kb3cxXVxyXG5cdC8vIGh0dHBzOi8vc2VibGFnYXJkZS5maWxlcy53b3JkcHJlc3MuY29tLzIwMTUvMDcvY291cnNlX25vdGVzX21vdmluZ19mcm9zdGJpdGVfdG9fcGJyX3YzMi5wZGZcclxuXHRjb25zdCBkaXN0YW5jZUZhbGxvZmYgPSBsaWdodERpc3RhbmNlLnBvdyggZGVjYXlFeHBvbmVudCApLm1heCggMC4wMSApLnJlY2lwcm9jYWwoKTtcclxuXHJcblx0cmV0dXJuIGN1dG9mZkRpc3RhbmNlLmdyZWF0ZXJUaGFuKCAwICkuc2VsZWN0KFxyXG5cdFx0ZGlzdGFuY2VGYWxsb2ZmLm11bCggbGlnaHREaXN0YW5jZS5kaXYoIGN1dG9mZkRpc3RhbmNlICkucG93NCgpLm9uZU1pbnVzKCkuY2xhbXAoKS5wb3cyKCkgKSxcclxuXHRcdGRpc3RhbmNlRmFsbG9mZlxyXG5cdCk7XHJcblxyXG59ICk7IC8vIHZhbGlkYXRlZFxyXG4iLCJpbXBvcnQgQW5hbHl0aWNMaWdodE5vZGUgZnJvbSAnLi9BbmFseXRpY0xpZ2h0Tm9kZS5qcyc7XHJcbmltcG9ydCB7IGdldERpc3RhbmNlQXR0ZW51YXRpb24gfSBmcm9tICcuL0xpZ2h0VXRpbHMuanMnO1xyXG5pbXBvcnQgeyB1bmlmb3JtIH0gZnJvbSAnLi4vY29yZS9Vbmlmb3JtTm9kZS5qcyc7XHJcbmltcG9ydCB7IHJlbmRlckdyb3VwIH0gZnJvbSAnLi4vY29yZS9Vbmlmb3JtR3JvdXBOb2RlLmpzJztcclxuaW1wb3J0IHsgcG9pbnRTaGFkb3cgfSBmcm9tICcuL1BvaW50U2hhZG93Tm9kZS5qcyc7XHJcblxyXG5leHBvcnQgY29uc3QgZGlyZWN0UG9pbnRMaWdodCA9ICggeyBjb2xvciwgbGlnaHRWZWN0b3IsIGN1dG9mZkRpc3RhbmNlLCBkZWNheUV4cG9uZW50IH0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IGxpZ2h0RGlyZWN0aW9uID0gbGlnaHRWZWN0b3Iubm9ybWFsaXplKCk7XHJcblx0Y29uc3QgbGlnaHREaXN0YW5jZSA9IGxpZ2h0VmVjdG9yLmxlbmd0aCgpO1xyXG5cclxuXHRjb25zdCBhdHRlbnVhdGlvbiA9IGdldERpc3RhbmNlQXR0ZW51YXRpb24oIHtcclxuXHRcdGxpZ2h0RGlzdGFuY2UsXHJcblx0XHRjdXRvZmZEaXN0YW5jZSxcclxuXHRcdGRlY2F5RXhwb25lbnRcclxuXHR9ICk7XHJcblxyXG5cdGNvbnN0IGxpZ2h0Q29sb3IgPSBjb2xvci5tdWwoIGF0dGVudWF0aW9uICk7XHJcblxyXG5cdHJldHVybiB7IGxpZ2h0RGlyZWN0aW9uLCBsaWdodENvbG9yIH07XHJcblxyXG59O1xyXG5cclxuLyoqXHJcbiAqIE1vZHVsZSBmb3IgcmVwcmVzZW50aW5nIHBvaW50IGxpZ2h0cyBhcyBub2Rlcy5cclxuICpcclxuICogQGF1Z21lbnRzIEFuYWx5dGljTGlnaHROb2RlXHJcbiAqL1xyXG5jbGFzcyBQb2ludExpZ2h0Tm9kZSBleHRlbmRzIEFuYWx5dGljTGlnaHROb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnUG9pbnRMaWdodE5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcG9pbnQgbGlnaHQgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7P1BvaW50TGlnaHR9IFtsaWdodD1udWxsXSAtIFRoZSBwb2ludCBsaWdodCBzb3VyY2UuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGxpZ2h0ID0gbnVsbCApIHtcclxuXHJcblx0XHRzdXBlciggbGlnaHQgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFVuaWZvcm0gbm9kZSByZXByZXNlbnRpbmcgdGhlIGN1dG9mZiBkaXN0YW5jZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VW5pZm9ybU5vZGU8ZmxvYXQ+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmN1dG9mZkRpc3RhbmNlTm9kZSA9IHVuaWZvcm0oIDAgKS5zZXRHcm91cCggcmVuZGVyR3JvdXAgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFVuaWZvcm0gbm9kZSByZXByZXNlbnRpbmcgdGhlIGRlY2F5IGV4cG9uZW50LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtVbmlmb3JtTm9kZTxmbG9hdD59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGVjYXlFeHBvbmVudE5vZGUgPSB1bmlmb3JtKCAyICkuc2V0R3JvdXAoIHJlbmRlckdyb3VwICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogT3ZlcndyaXR0ZW4gdG8gdXBkYXRlZCBwb2ludCBsaWdodCBzcGVjaWZpYyB1bmlmb3Jtcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUZyYW1lfSBmcmFtZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IG5vZGUgZnJhbWUuXHJcblx0ICovXHJcblx0dXBkYXRlKCBmcmFtZSApIHtcclxuXHJcblx0XHRjb25zdCB7IGxpZ2h0IH0gPSB0aGlzO1xyXG5cclxuXHRcdHN1cGVyLnVwZGF0ZSggZnJhbWUgKTtcclxuXHJcblx0XHR0aGlzLmN1dG9mZkRpc3RhbmNlTm9kZS52YWx1ZSA9IGxpZ2h0LmRpc3RhbmNlO1xyXG5cdFx0dGhpcy5kZWNheUV4cG9uZW50Tm9kZS52YWx1ZSA9IGxpZ2h0LmRlY2F5O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE92ZXJ3cml0dGVuIHRvIHNldHVwIHBvaW50IGxpZ2h0IHNwZWNpZmljIHNoYWRvdy5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1BvaW50U2hhZG93Tm9kZX1cclxuXHQgKi9cclxuXHRzZXR1cFNoYWRvd05vZGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHBvaW50U2hhZG93KCB0aGlzLmxpZ2h0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXBEaXJlY3QoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIGRpcmVjdFBvaW50TGlnaHQoIHtcclxuXHRcdFx0Y29sb3I6IHRoaXMuY29sb3JOb2RlLFxyXG5cdFx0XHRsaWdodFZlY3RvcjogdGhpcy5nZXRMaWdodFZlY3RvciggYnVpbGRlciApLFxyXG5cdFx0XHRjdXRvZmZEaXN0YW5jZTogdGhpcy5jdXRvZmZEaXN0YW5jZU5vZGUsXHJcblx0XHRcdGRlY2F5RXhwb25lbnQ6IHRoaXMuZGVjYXlFeHBvbmVudE5vZGVcclxuXHRcdH0gKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUG9pbnRMaWdodE5vZGU7XHJcbiIsImltcG9ydCB7IHV2IH0gZnJvbSAnLi4vYWNjZXNzb3JzL1VWLmpzJztcclxuaW1wb3J0IHsgRm4gfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIDJ4MiBjaGVja2VyYm9hcmQgcGF0dGVybiB0aGF0IGNhbiBiZSB1c2VkIGFzIHByb2NlZHVyYWwgdGV4dHVyZSBkYXRhLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGU8dmVjMj59IGNvb3JkIC0gVGhlIHV2IGNvb3JkaW5hdGVzLlxyXG4gKiBAcmV0dXJuIHtOb2RlPGZsb2F0Pn0gVGhlIHJlc3VsdCBkYXRhLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGNoZWNrZXIgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgY29vcmQgPSB1digpIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IHV2ID0gY29vcmQubXVsKCAyLjAgKTtcclxuXHJcblx0Y29uc3QgY3ggPSB1di54LmZsb29yKCk7XHJcblx0Y29uc3QgY3kgPSB1di55LmZsb29yKCk7XHJcblx0Y29uc3QgcmVzdWx0ID0gY3guYWRkKCBjeSApLm1vZCggMi4wICk7XHJcblxyXG5cdHJldHVybiByZXN1bHQuc2lnbigpO1xyXG5cclxufSApO1xyXG4iLCJpbXBvcnQgeyBGbiwgZmxvYXQgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcbmltcG9ydCB7IGxlbmd0aFNxLCBzbW9vdGhzdGVwIH0gZnJvbSAnLi4vbWF0aC9NYXRoTm9kZS5qcyc7XHJcbmltcG9ydCB7IHV2IH0gZnJvbSAnLi4vYWNjZXNzb3JzL1VWLmpzJztcclxuXHJcbi8qKlxyXG4gKiBHZW5lcmF0ZXMgYSBjaXJjbGUgYmFzZWQgb24gdGhlIHV2IGNvb3JkaW5hdGVzLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGU8dmVjMj59IGNvb3JkIC0gVGhlIHV2IHRvIGdlbmVyYXRlIHRoZSBjaXJjbGUuXHJcbiAqIEByZXR1cm4ge05vZGU8ZmxvYXQ+fSBUaGUgY2lyY2xlIHNoYXBlLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHNoYXBlQ2lyY2xlID0gRm4oICggWyBjb29yZCA9IHV2KCkgXSwgeyByZW5kZXJlciwgbWF0ZXJpYWwgfSApID0+IHtcclxuXHJcblx0Y29uc3QgYWxwaGEgPSBmbG9hdCggMSApLnRvVmFyKCk7XHJcblx0Y29uc3QgbGVuMiA9IGxlbmd0aFNxKCBjb29yZC5tdWwoIDIgKS5zdWIoIDEgKSApO1xyXG5cclxuXHRpZiAoIG1hdGVyaWFsLmFscGhhVG9Db3ZlcmFnZSAmJiByZW5kZXJlci5zYW1wbGVzID4gMSApIHtcclxuXHJcblx0XHRjb25zdCBkbGVuID0gZmxvYXQoIGxlbjIuZndpZHRoKCkgKS50b1ZhcigpO1xyXG5cclxuXHRcdGFscGhhLmFzc2lnbiggc21vb3Roc3RlcCggZGxlbi5vbmVNaW51cygpLCBkbGVuLmFkZCggMSApLCBsZW4yICkub25lTWludXMoKSApO1xyXG5cclxuXHR9IGVsc2Uge1xyXG5cclxuXHRcdGxlbjIuZ3JlYXRlclRoYW4oIDEuMCApLmRpc2NhcmQoKTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gYWxwaGE7XHJcblxyXG59ICk7XHJcbiIsIi8vIFRocmVlLmpzIFRyYW5zcGlsZXJcclxuLy8gaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL0FjYWRlbXlTb2Z0d2FyZUZvdW5kYXRpb24vTWF0ZXJpYWxYL21haW4vbGlicmFyaWVzL3N0ZGxpYi9nZW5nbHNsL2xpYi9teF9ub2lzZS5nbHNsXHJcblxyXG5pbXBvcnQgeyBpbnQsIHVpbnQsIGZsb2F0LCB2ZWMzLCBib29sLCB1dmVjMywgdmVjMiwgdmVjNCwgSWYsIEZuIH0gZnJvbSAnLi4vLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5pbXBvcnQgeyBzZWxlY3QgfSBmcm9tICcuLi8uLi9tYXRoL0NvbmRpdGlvbmFsTm9kZS5qcyc7XHJcbmltcG9ydCB7IHN1YiwgbXVsIH0gZnJvbSAnLi4vLi4vbWF0aC9PcGVyYXRvck5vZGUuanMnO1xyXG5pbXBvcnQgeyBmbG9vciwgYWJzLCBtYXgsIGRvdCwgbWluLCBzcXJ0IH0gZnJvbSAnLi4vLi4vbWF0aC9NYXRoTm9kZS5qcyc7XHJcbmltcG9ydCB7IG92ZXJsb2FkaW5nRm4gfSBmcm9tICcuLi8uLi91dGlscy9GdW5jdGlvbk92ZXJsb2FkaW5nTm9kZS5qcyc7XHJcbmltcG9ydCB7IExvb3AgfSBmcm9tICcuLi8uLi91dGlscy9Mb29wTm9kZS5qcyc7XHJcblxyXG5cclxuZXhwb3J0IGNvbnN0IG14X3NlbGVjdCA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyBiX2ltbXV0YWJsZSwgdF9pbW11dGFibGUsIGZfaW1tdXRhYmxlIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IGYgPSBmbG9hdCggZl9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHQgPSBmbG9hdCggdF9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IGIgPSBib29sKCBiX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblxyXG5cdHJldHVybiBzZWxlY3QoIGIsIHQsIGYgKTtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnbXhfc2VsZWN0JyxcclxuXHR0eXBlOiAnZmxvYXQnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAnYicsIHR5cGU6ICdib29sJyB9LFxyXG5cdFx0eyBuYW1lOiAndCcsIHR5cGU6ICdmbG9hdCcgfSxcclxuXHRcdHsgbmFtZTogJ2YnLCB0eXBlOiAnZmxvYXQnIH1cclxuXHRdXHJcbn0gKTtcclxuXHJcbmV4cG9ydCBjb25zdCBteF9uZWdhdGVfaWYgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgdmFsX2ltbXV0YWJsZSwgYl9pbW11dGFibGUgXSApID0+IHtcclxuXHJcblx0Y29uc3QgYiA9IGJvb2woIGJfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCB2YWwgPSBmbG9hdCggdmFsX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblxyXG5cdHJldHVybiBzZWxlY3QoIGIsIHZhbC5uZWdhdGUoKSwgdmFsICk7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ214X25lZ2F0ZV9pZicsXHJcblx0dHlwZTogJ2Zsb2F0JyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ3ZhbCcsIHR5cGU6ICdmbG9hdCcgfSxcclxuXHRcdHsgbmFtZTogJ2InLCB0eXBlOiAnYm9vbCcgfVxyXG5cdF1cclxufSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X2Zsb29yID0gLypAX19QVVJFX18qLyBGbiggKCBbIHhfaW1tdXRhYmxlIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IHggPSBmbG9hdCggeF9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cclxuXHRyZXR1cm4gaW50KCBmbG9vciggeCApICk7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ214X2Zsb29yJyxcclxuXHR0eXBlOiAnaW50JyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ3gnLCB0eXBlOiAnZmxvYXQnIH1cclxuXHRdXHJcbn0gKTtcclxuXHJcbmV4cG9ydCBjb25zdCBteF9mbG9vcmZyYWMgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgeF9pbW11dGFibGUsIGkgXSApID0+IHtcclxuXHJcblx0Y29uc3QgeCA9IGZsb2F0KCB4X2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0aS5hc3NpZ24oIG14X2Zsb29yKCB4ICkgKTtcclxuXHJcblx0cmV0dXJuIHguc3ViKCBmbG9hdCggaSApICk7XHJcblxyXG59ICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfYmlsZXJwXzAgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgdjBfaW1tdXRhYmxlLCB2MV9pbW11dGFibGUsIHYyX2ltbXV0YWJsZSwgdjNfaW1tdXRhYmxlLCBzX2ltbXV0YWJsZSwgdF9pbW11dGFibGUgXSApID0+IHtcclxuXHJcblx0Y29uc3QgdCA9IGZsb2F0KCB0X2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgcyA9IGZsb2F0KCBzX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgdjMgPSBmbG9hdCggdjNfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCB2MiA9IGZsb2F0KCB2Ml9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHYxID0gZmxvYXQoIHYxX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgdjAgPSBmbG9hdCggdjBfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBzMSA9IGZsb2F0KCBzdWIoIDEuMCwgcyApICkudG9WYXIoKTtcclxuXHJcblx0cmV0dXJuIHN1YiggMS4wLCB0ICkubXVsKCB2MC5tdWwoIHMxICkuYWRkKCB2MS5tdWwoIHMgKSApICkuYWRkKCB0Lm11bCggdjIubXVsKCBzMSApLmFkZCggdjMubXVsKCBzICkgKSApICk7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ214X2JpbGVycF8wJyxcclxuXHR0eXBlOiAnZmxvYXQnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAndjAnLCB0eXBlOiAnZmxvYXQnIH0sXHJcblx0XHR7IG5hbWU6ICd2MScsIHR5cGU6ICdmbG9hdCcgfSxcclxuXHRcdHsgbmFtZTogJ3YyJywgdHlwZTogJ2Zsb2F0JyB9LFxyXG5cdFx0eyBuYW1lOiAndjMnLCB0eXBlOiAnZmxvYXQnIH0sXHJcblx0XHR7IG5hbWU6ICdzJywgdHlwZTogJ2Zsb2F0JyB9LFxyXG5cdFx0eyBuYW1lOiAndCcsIHR5cGU6ICdmbG9hdCcgfVxyXG5cdF1cclxufSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X2JpbGVycF8xID0gLypAX19QVVJFX18qLyBGbiggKCBbIHYwX2ltbXV0YWJsZSwgdjFfaW1tdXRhYmxlLCB2Ml9pbW11dGFibGUsIHYzX2ltbXV0YWJsZSwgc19pbW11dGFibGUsIHRfaW1tdXRhYmxlIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IHQgPSBmbG9hdCggdF9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHMgPSBmbG9hdCggc19pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHYzID0gdmVjMyggdjNfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCB2MiA9IHZlYzMoIHYyX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgdjEgPSB2ZWMzKCB2MV9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHYwID0gdmVjMyggdjBfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBzMSA9IGZsb2F0KCBzdWIoIDEuMCwgcyApICkudG9WYXIoKTtcclxuXHJcblx0cmV0dXJuIHN1YiggMS4wLCB0ICkubXVsKCB2MC5tdWwoIHMxICkuYWRkKCB2MS5tdWwoIHMgKSApICkuYWRkKCB0Lm11bCggdjIubXVsKCBzMSApLmFkZCggdjMubXVsKCBzICkgKSApICk7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ214X2JpbGVycF8xJyxcclxuXHR0eXBlOiAndmVjMycsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICd2MCcsIHR5cGU6ICd2ZWMzJyB9LFxyXG5cdFx0eyBuYW1lOiAndjEnLCB0eXBlOiAndmVjMycgfSxcclxuXHRcdHsgbmFtZTogJ3YyJywgdHlwZTogJ3ZlYzMnIH0sXHJcblx0XHR7IG5hbWU6ICd2MycsIHR5cGU6ICd2ZWMzJyB9LFxyXG5cdFx0eyBuYW1lOiAncycsIHR5cGU6ICdmbG9hdCcgfSxcclxuXHRcdHsgbmFtZTogJ3QnLCB0eXBlOiAnZmxvYXQnIH1cclxuXHRdXHJcbn0gKTtcclxuXHJcbmV4cG9ydCBjb25zdCBteF9iaWxlcnAgPSAvKkBfX1BVUkVfXyovIG92ZXJsb2FkaW5nRm4oIFsgbXhfYmlsZXJwXzAsIG14X2JpbGVycF8xIF0gKTtcclxuXHJcbmV4cG9ydCBjb25zdCBteF90cmlsZXJwXzAgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgdjBfaW1tdXRhYmxlLCB2MV9pbW11dGFibGUsIHYyX2ltbXV0YWJsZSwgdjNfaW1tdXRhYmxlLCB2NF9pbW11dGFibGUsIHY1X2ltbXV0YWJsZSwgdjZfaW1tdXRhYmxlLCB2N19pbW11dGFibGUsIHNfaW1tdXRhYmxlLCB0X2ltbXV0YWJsZSwgcl9pbW11dGFibGUgXSApID0+IHtcclxuXHJcblx0Y29uc3QgciA9IGZsb2F0KCByX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgdCA9IGZsb2F0KCB0X2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgcyA9IGZsb2F0KCBzX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgdjcgPSBmbG9hdCggdjdfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCB2NiA9IGZsb2F0KCB2Nl9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHY1ID0gZmxvYXQoIHY1X2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgdjQgPSBmbG9hdCggdjRfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCB2MyA9IGZsb2F0KCB2M19pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHYyID0gZmxvYXQoIHYyX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgdjEgPSBmbG9hdCggdjFfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCB2MCA9IGZsb2F0KCB2MF9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHMxID0gZmxvYXQoIHN1YiggMS4wLCBzICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHQxID0gZmxvYXQoIHN1YiggMS4wLCB0ICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHIxID0gZmxvYXQoIHN1YiggMS4wLCByICkgKS50b1ZhcigpO1xyXG5cclxuXHRyZXR1cm4gcjEubXVsKCB0MS5tdWwoIHYwLm11bCggczEgKS5hZGQoIHYxLm11bCggcyApICkgKS5hZGQoIHQubXVsKCB2Mi5tdWwoIHMxICkuYWRkKCB2My5tdWwoIHMgKSApICkgKSApLmFkZCggci5tdWwoIHQxLm11bCggdjQubXVsKCBzMSApLmFkZCggdjUubXVsKCBzICkgKSApLmFkZCggdC5tdWwoIHY2Lm11bCggczEgKS5hZGQoIHY3Lm11bCggcyApICkgKSApICkgKTtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnbXhfdHJpbGVycF8wJyxcclxuXHR0eXBlOiAnZmxvYXQnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAndjAnLCB0eXBlOiAnZmxvYXQnIH0sXHJcblx0XHR7IG5hbWU6ICd2MScsIHR5cGU6ICdmbG9hdCcgfSxcclxuXHRcdHsgbmFtZTogJ3YyJywgdHlwZTogJ2Zsb2F0JyB9LFxyXG5cdFx0eyBuYW1lOiAndjMnLCB0eXBlOiAnZmxvYXQnIH0sXHJcblx0XHR7IG5hbWU6ICd2NCcsIHR5cGU6ICdmbG9hdCcgfSxcclxuXHRcdHsgbmFtZTogJ3Y1JywgdHlwZTogJ2Zsb2F0JyB9LFxyXG5cdFx0eyBuYW1lOiAndjYnLCB0eXBlOiAnZmxvYXQnIH0sXHJcblx0XHR7IG5hbWU6ICd2NycsIHR5cGU6ICdmbG9hdCcgfSxcclxuXHRcdHsgbmFtZTogJ3MnLCB0eXBlOiAnZmxvYXQnIH0sXHJcblx0XHR7IG5hbWU6ICd0JywgdHlwZTogJ2Zsb2F0JyB9LFxyXG5cdFx0eyBuYW1lOiAncicsIHR5cGU6ICdmbG9hdCcgfVxyXG5cdF1cclxufSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X3RyaWxlcnBfMSA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyB2MF9pbW11dGFibGUsIHYxX2ltbXV0YWJsZSwgdjJfaW1tdXRhYmxlLCB2M19pbW11dGFibGUsIHY0X2ltbXV0YWJsZSwgdjVfaW1tdXRhYmxlLCB2Nl9pbW11dGFibGUsIHY3X2ltbXV0YWJsZSwgc19pbW11dGFibGUsIHRfaW1tdXRhYmxlLCByX2ltbXV0YWJsZSBdICkgPT4ge1xyXG5cclxuXHRjb25zdCByID0gZmxvYXQoIHJfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCB0ID0gZmxvYXQoIHRfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBzID0gZmxvYXQoIHNfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCB2NyA9IHZlYzMoIHY3X2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgdjYgPSB2ZWMzKCB2Nl9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHY1ID0gdmVjMyggdjVfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCB2NCA9IHZlYzMoIHY0X2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgdjMgPSB2ZWMzKCB2M19pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHYyID0gdmVjMyggdjJfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCB2MSA9IHZlYzMoIHYxX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgdjAgPSB2ZWMzKCB2MF9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHMxID0gZmxvYXQoIHN1YiggMS4wLCBzICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHQxID0gZmxvYXQoIHN1YiggMS4wLCB0ICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHIxID0gZmxvYXQoIHN1YiggMS4wLCByICkgKS50b1ZhcigpO1xyXG5cclxuXHRyZXR1cm4gcjEubXVsKCB0MS5tdWwoIHYwLm11bCggczEgKS5hZGQoIHYxLm11bCggcyApICkgKS5hZGQoIHQubXVsKCB2Mi5tdWwoIHMxICkuYWRkKCB2My5tdWwoIHMgKSApICkgKSApLmFkZCggci5tdWwoIHQxLm11bCggdjQubXVsKCBzMSApLmFkZCggdjUubXVsKCBzICkgKSApLmFkZCggdC5tdWwoIHY2Lm11bCggczEgKS5hZGQoIHY3Lm11bCggcyApICkgKSApICkgKTtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnbXhfdHJpbGVycF8xJyxcclxuXHR0eXBlOiAndmVjMycsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICd2MCcsIHR5cGU6ICd2ZWMzJyB9LFxyXG5cdFx0eyBuYW1lOiAndjEnLCB0eXBlOiAndmVjMycgfSxcclxuXHRcdHsgbmFtZTogJ3YyJywgdHlwZTogJ3ZlYzMnIH0sXHJcblx0XHR7IG5hbWU6ICd2MycsIHR5cGU6ICd2ZWMzJyB9LFxyXG5cdFx0eyBuYW1lOiAndjQnLCB0eXBlOiAndmVjMycgfSxcclxuXHRcdHsgbmFtZTogJ3Y1JywgdHlwZTogJ3ZlYzMnIH0sXHJcblx0XHR7IG5hbWU6ICd2NicsIHR5cGU6ICd2ZWMzJyB9LFxyXG5cdFx0eyBuYW1lOiAndjcnLCB0eXBlOiAndmVjMycgfSxcclxuXHRcdHsgbmFtZTogJ3MnLCB0eXBlOiAnZmxvYXQnIH0sXHJcblx0XHR7IG5hbWU6ICd0JywgdHlwZTogJ2Zsb2F0JyB9LFxyXG5cdFx0eyBuYW1lOiAncicsIHR5cGU6ICdmbG9hdCcgfVxyXG5cdF1cclxufSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X3RyaWxlcnAgPSAvKkBfX1BVUkVfXyovIG92ZXJsb2FkaW5nRm4oIFsgbXhfdHJpbGVycF8wLCBteF90cmlsZXJwXzEgXSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X2dyYWRpZW50X2Zsb2F0XzAgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgaGFzaF9pbW11dGFibGUsIHhfaW1tdXRhYmxlLCB5X2ltbXV0YWJsZSBdICkgPT4ge1xyXG5cclxuXHRjb25zdCB5ID0gZmxvYXQoIHlfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCB4ID0gZmxvYXQoIHhfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBoYXNoID0gdWludCggaGFzaF9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IGggPSB1aW50KCBoYXNoLmJpdEFuZCggdWludCggNyApICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHUgPSBmbG9hdCggbXhfc2VsZWN0KCBoLmxlc3NUaGFuKCB1aW50KCA0ICkgKSwgeCwgeSApICkudG9WYXIoKTtcclxuXHRjb25zdCB2ID0gZmxvYXQoIG11bCggMi4wLCBteF9zZWxlY3QoIGgubGVzc1RoYW4oIHVpbnQoIDQgKSApLCB5LCB4ICkgKSApLnRvVmFyKCk7XHJcblxyXG5cdHJldHVybiBteF9uZWdhdGVfaWYoIHUsIGJvb2woIGguYml0QW5kKCB1aW50KCAxICkgKSApICkuYWRkKCBteF9uZWdhdGVfaWYoIHYsIGJvb2woIGguYml0QW5kKCB1aW50KCAyICkgKSApICkgKTtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnbXhfZ3JhZGllbnRfZmxvYXRfMCcsXHJcblx0dHlwZTogJ2Zsb2F0JyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ2hhc2gnLCB0eXBlOiAndWludCcgfSxcclxuXHRcdHsgbmFtZTogJ3gnLCB0eXBlOiAnZmxvYXQnIH0sXHJcblx0XHR7IG5hbWU6ICd5JywgdHlwZTogJ2Zsb2F0JyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfZ3JhZGllbnRfZmxvYXRfMSA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyBoYXNoX2ltbXV0YWJsZSwgeF9pbW11dGFibGUsIHlfaW1tdXRhYmxlLCB6X2ltbXV0YWJsZSBdICkgPT4ge1xyXG5cclxuXHRjb25zdCB6ID0gZmxvYXQoIHpfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCB5ID0gZmxvYXQoIHlfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCB4ID0gZmxvYXQoIHhfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBoYXNoID0gdWludCggaGFzaF9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IGggPSB1aW50KCBoYXNoLmJpdEFuZCggdWludCggMTUgKSApICkudG9WYXIoKTtcclxuXHRjb25zdCB1ID0gZmxvYXQoIG14X3NlbGVjdCggaC5sZXNzVGhhbiggdWludCggOCApICksIHgsIHkgKSApLnRvVmFyKCk7XHJcblx0Y29uc3QgdiA9IGZsb2F0KCBteF9zZWxlY3QoIGgubGVzc1RoYW4oIHVpbnQoIDQgKSApLCB5LCBteF9zZWxlY3QoIGguZXF1YWwoIHVpbnQoIDEyICkgKS5vciggaC5lcXVhbCggdWludCggMTQgKSApICksIHgsIHogKSApICkudG9WYXIoKTtcclxuXHJcblx0cmV0dXJuIG14X25lZ2F0ZV9pZiggdSwgYm9vbCggaC5iaXRBbmQoIHVpbnQoIDEgKSApICkgKS5hZGQoIG14X25lZ2F0ZV9pZiggdiwgYm9vbCggaC5iaXRBbmQoIHVpbnQoIDIgKSApICkgKSApO1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdteF9ncmFkaWVudF9mbG9hdF8xJyxcclxuXHR0eXBlOiAnZmxvYXQnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAnaGFzaCcsIHR5cGU6ICd1aW50JyB9LFxyXG5cdFx0eyBuYW1lOiAneCcsIHR5cGU6ICdmbG9hdCcgfSxcclxuXHRcdHsgbmFtZTogJ3knLCB0eXBlOiAnZmxvYXQnIH0sXHJcblx0XHR7IG5hbWU6ICd6JywgdHlwZTogJ2Zsb2F0JyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfZ3JhZGllbnRfZmxvYXQgPSAvKkBfX1BVUkVfXyovIG92ZXJsb2FkaW5nRm4oIFsgbXhfZ3JhZGllbnRfZmxvYXRfMCwgbXhfZ3JhZGllbnRfZmxvYXRfMSBdICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfZ3JhZGllbnRfdmVjM18wID0gLypAX19QVVJFX18qLyBGbiggKCBbIGhhc2hfaW1tdXRhYmxlLCB4X2ltbXV0YWJsZSwgeV9pbW11dGFibGUgXSApID0+IHtcclxuXHJcblx0Y29uc3QgeSA9IGZsb2F0KCB5X2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgeCA9IGZsb2F0KCB4X2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgaGFzaCA9IHV2ZWMzKCBoYXNoX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblxyXG5cdHJldHVybiB2ZWMzKCBteF9ncmFkaWVudF9mbG9hdCggaGFzaC54LCB4LCB5ICksIG14X2dyYWRpZW50X2Zsb2F0KCBoYXNoLnksIHgsIHkgKSwgbXhfZ3JhZGllbnRfZmxvYXQoIGhhc2gueiwgeCwgeSApICk7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ214X2dyYWRpZW50X3ZlYzNfMCcsXHJcblx0dHlwZTogJ3ZlYzMnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAnaGFzaCcsIHR5cGU6ICd1dmVjMycgfSxcclxuXHRcdHsgbmFtZTogJ3gnLCB0eXBlOiAnZmxvYXQnIH0sXHJcblx0XHR7IG5hbWU6ICd5JywgdHlwZTogJ2Zsb2F0JyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfZ3JhZGllbnRfdmVjM18xID0gLypAX19QVVJFX18qLyBGbiggKCBbIGhhc2hfaW1tdXRhYmxlLCB4X2ltbXV0YWJsZSwgeV9pbW11dGFibGUsIHpfaW1tdXRhYmxlIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IHogPSBmbG9hdCggel9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHkgPSBmbG9hdCggeV9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHggPSBmbG9hdCggeF9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IGhhc2ggPSB1dmVjMyggaGFzaF9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cclxuXHRyZXR1cm4gdmVjMyggbXhfZ3JhZGllbnRfZmxvYXQoIGhhc2gueCwgeCwgeSwgeiApLCBteF9ncmFkaWVudF9mbG9hdCggaGFzaC55LCB4LCB5LCB6ICksIG14X2dyYWRpZW50X2Zsb2F0KCBoYXNoLnosIHgsIHksIHogKSApO1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdteF9ncmFkaWVudF92ZWMzXzEnLFxyXG5cdHR5cGU6ICd2ZWMzJyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ2hhc2gnLCB0eXBlOiAndXZlYzMnIH0sXHJcblx0XHR7IG5hbWU6ICd4JywgdHlwZTogJ2Zsb2F0JyB9LFxyXG5cdFx0eyBuYW1lOiAneScsIHR5cGU6ICdmbG9hdCcgfSxcclxuXHRcdHsgbmFtZTogJ3onLCB0eXBlOiAnZmxvYXQnIH1cclxuXHRdXHJcbn0gKTtcclxuXHJcbmV4cG9ydCBjb25zdCBteF9ncmFkaWVudF92ZWMzID0gLypAX19QVVJFX18qLyBvdmVybG9hZGluZ0ZuKCBbIG14X2dyYWRpZW50X3ZlYzNfMCwgbXhfZ3JhZGllbnRfdmVjM18xIF0gKTtcclxuXHJcbmV4cG9ydCBjb25zdCBteF9ncmFkaWVudF9zY2FsZTJkXzAgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgdl9pbW11dGFibGUgXSApID0+IHtcclxuXHJcblx0Y29uc3QgdiA9IGZsb2F0KCB2X2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblxyXG5cdHJldHVybiBtdWwoIDAuNjYxNiwgdiApO1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdteF9ncmFkaWVudF9zY2FsZTJkXzAnLFxyXG5cdHR5cGU6ICdmbG9hdCcsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICd2JywgdHlwZTogJ2Zsb2F0JyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfZ3JhZGllbnRfc2NhbGUzZF8wID0gLypAX19QVVJFX18qLyBGbiggKCBbIHZfaW1tdXRhYmxlIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IHYgPSBmbG9hdCggdl9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cclxuXHRyZXR1cm4gbXVsKCAwLjk4MjAsIHYgKTtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnbXhfZ3JhZGllbnRfc2NhbGUzZF8wJyxcclxuXHR0eXBlOiAnZmxvYXQnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAndicsIHR5cGU6ICdmbG9hdCcgfVxyXG5cdF1cclxufSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X2dyYWRpZW50X3NjYWxlMmRfMSA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyB2X2ltbXV0YWJsZSBdICkgPT4ge1xyXG5cclxuXHRjb25zdCB2ID0gdmVjMyggdl9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cclxuXHRyZXR1cm4gbXVsKCAwLjY2MTYsIHYgKTtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnbXhfZ3JhZGllbnRfc2NhbGUyZF8xJyxcclxuXHR0eXBlOiAndmVjMycsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICd2JywgdHlwZTogJ3ZlYzMnIH1cclxuXHRdXHJcbn0gKTtcclxuXHJcbmV4cG9ydCBjb25zdCBteF9ncmFkaWVudF9zY2FsZTJkID0gLypAX19QVVJFX18qLyBvdmVybG9hZGluZ0ZuKCBbIG14X2dyYWRpZW50X3NjYWxlMmRfMCwgbXhfZ3JhZGllbnRfc2NhbGUyZF8xIF0gKTtcclxuXHJcbmV4cG9ydCBjb25zdCBteF9ncmFkaWVudF9zY2FsZTNkXzEgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgdl9pbW11dGFibGUgXSApID0+IHtcclxuXHJcblx0Y29uc3QgdiA9IHZlYzMoIHZfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHJcblx0cmV0dXJuIG11bCggMC45ODIwLCB2ICk7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ214X2dyYWRpZW50X3NjYWxlM2RfMScsXHJcblx0dHlwZTogJ3ZlYzMnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAndicsIHR5cGU6ICd2ZWMzJyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfZ3JhZGllbnRfc2NhbGUzZCA9IC8qQF9fUFVSRV9fKi8gb3ZlcmxvYWRpbmdGbiggWyBteF9ncmFkaWVudF9zY2FsZTNkXzAsIG14X2dyYWRpZW50X3NjYWxlM2RfMSBdICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfcm90bDMyID0gLypAX19QVVJFX18qLyBGbiggKCBbIHhfaW1tdXRhYmxlLCBrX2ltbXV0YWJsZSBdICkgPT4ge1xyXG5cclxuXHRjb25zdCBrID0gaW50KCBrX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgeCA9IHVpbnQoIHhfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHJcblx0cmV0dXJuIHguc2hpZnRMZWZ0KCBrICkuYml0T3IoIHguc2hpZnRSaWdodCggaW50KCAzMiApLnN1YiggayApICkgKTtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnbXhfcm90bDMyJyxcclxuXHR0eXBlOiAndWludCcsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICd4JywgdHlwZTogJ3VpbnQnIH0sXHJcblx0XHR7IG5hbWU6ICdrJywgdHlwZTogJ2ludCcgfVxyXG5cdF1cclxufSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X2JqbWl4ID0gLypAX19QVVJFX18qLyBGbiggKCBbIGEsIGIsIGMgXSApID0+IHtcclxuXHJcblx0YS5zdWJBc3NpZ24oIGMgKTtcclxuXHRhLmJpdFhvckFzc2lnbiggbXhfcm90bDMyKCBjLCBpbnQoIDQgKSApICk7XHJcblx0Yy5hZGRBc3NpZ24oIGIgKTtcclxuXHRiLnN1YkFzc2lnbiggYSApO1xyXG5cdGIuYml0WG9yQXNzaWduKCBteF9yb3RsMzIoIGEsIGludCggNiApICkgKTtcclxuXHRhLmFkZEFzc2lnbiggYyApO1xyXG5cdGMuc3ViQXNzaWduKCBiICk7XHJcblx0Yy5iaXRYb3JBc3NpZ24oIG14X3JvdGwzMiggYiwgaW50KCA4ICkgKSApO1xyXG5cdGIuYWRkQXNzaWduKCBhICk7XHJcblx0YS5zdWJBc3NpZ24oIGMgKTtcclxuXHRhLmJpdFhvckFzc2lnbiggbXhfcm90bDMyKCBjLCBpbnQoIDE2ICkgKSApO1xyXG5cdGMuYWRkQXNzaWduKCBiICk7XHJcblx0Yi5zdWJBc3NpZ24oIGEgKTtcclxuXHRiLmJpdFhvckFzc2lnbiggbXhfcm90bDMyKCBhLCBpbnQoIDE5ICkgKSApO1xyXG5cdGEuYWRkQXNzaWduKCBjICk7XHJcblx0Yy5zdWJBc3NpZ24oIGIgKTtcclxuXHRjLmJpdFhvckFzc2lnbiggbXhfcm90bDMyKCBiLCBpbnQoIDQgKSApICk7XHJcblx0Yi5hZGRBc3NpZ24oIGEgKTtcclxuXHJcbn0gKTtcclxuXHJcbmV4cG9ydCBjb25zdCBteF9iamZpbmFsID0gLypAX19QVVJFX18qLyBGbiggKCBbIGFfaW1tdXRhYmxlLCBiX2ltbXV0YWJsZSwgY19pbW11dGFibGUgXSApID0+IHtcclxuXHJcblx0Y29uc3QgYyA9IHVpbnQoIGNfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBiID0gdWludCggYl9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IGEgPSB1aW50KCBhX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Yy5iaXRYb3JBc3NpZ24oIGIgKTtcclxuXHRjLnN1YkFzc2lnbiggbXhfcm90bDMyKCBiLCBpbnQoIDE0ICkgKSApO1xyXG5cdGEuYml0WG9yQXNzaWduKCBjICk7XHJcblx0YS5zdWJBc3NpZ24oIG14X3JvdGwzMiggYywgaW50KCAxMSApICkgKTtcclxuXHRiLmJpdFhvckFzc2lnbiggYSApO1xyXG5cdGIuc3ViQXNzaWduKCBteF9yb3RsMzIoIGEsIGludCggMjUgKSApICk7XHJcblx0Yy5iaXRYb3JBc3NpZ24oIGIgKTtcclxuXHRjLnN1YkFzc2lnbiggbXhfcm90bDMyKCBiLCBpbnQoIDE2ICkgKSApO1xyXG5cdGEuYml0WG9yQXNzaWduKCBjICk7XHJcblx0YS5zdWJBc3NpZ24oIG14X3JvdGwzMiggYywgaW50KCA0ICkgKSApO1xyXG5cdGIuYml0WG9yQXNzaWduKCBhICk7XHJcblx0Yi5zdWJBc3NpZ24oIG14X3JvdGwzMiggYSwgaW50KCAxNCApICkgKTtcclxuXHRjLmJpdFhvckFzc2lnbiggYiApO1xyXG5cdGMuc3ViQXNzaWduKCBteF9yb3RsMzIoIGIsIGludCggMjQgKSApICk7XHJcblxyXG5cdHJldHVybiBjO1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdteF9iamZpbmFsJyxcclxuXHR0eXBlOiAndWludCcsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICdhJywgdHlwZTogJ3VpbnQnIH0sXHJcblx0XHR7IG5hbWU6ICdiJywgdHlwZTogJ3VpbnQnIH0sXHJcblx0XHR7IG5hbWU6ICdjJywgdHlwZTogJ3VpbnQnIH1cclxuXHRdXHJcbn0gKTtcclxuXHJcbmV4cG9ydCBjb25zdCBteF9iaXRzX3RvXzAxID0gLypAX19QVVJFX18qLyBGbiggKCBbIGJpdHNfaW1tdXRhYmxlIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IGJpdHMgPSB1aW50KCBiaXRzX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblxyXG5cdHJldHVybiBmbG9hdCggYml0cyApLmRpdiggZmxvYXQoIHVpbnQoIGludCggMHhmZmZmZmZmZiApICkgKSApO1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdteF9iaXRzX3RvXzAxJyxcclxuXHR0eXBlOiAnZmxvYXQnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAnYml0cycsIHR5cGU6ICd1aW50JyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfZmFkZSA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyB0X2ltbXV0YWJsZSBdICkgPT4ge1xyXG5cclxuXHRjb25zdCB0ID0gZmxvYXQoIHRfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHJcblx0cmV0dXJuIHQubXVsKCB0ICkubXVsKCB0ICkubXVsKCB0Lm11bCggdC5tdWwoIDYuMCApLnN1YiggMTUuMCApICkuYWRkKCAxMC4wICkgKTtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnbXhfZmFkZScsXHJcblx0dHlwZTogJ2Zsb2F0JyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ3QnLCB0eXBlOiAnZmxvYXQnIH1cclxuXHRdXHJcbn0gKTtcclxuXHJcbmV4cG9ydCBjb25zdCBteF9oYXNoX2ludF8wID0gLypAX19QVVJFX18qLyBGbiggKCBbIHhfaW1tdXRhYmxlIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IHggPSBpbnQoIHhfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBsZW4gPSB1aW50KCB1aW50KCAxICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHNlZWQgPSB1aW50KCB1aW50KCBpbnQoIDB4ZGVhZGJlZWYgKSApLmFkZCggbGVuLnNoaWZ0TGVmdCggdWludCggMiApICkgKS5hZGQoIHVpbnQoIDEzICkgKSApLnRvVmFyKCk7XHJcblxyXG5cdHJldHVybiBteF9iamZpbmFsKCBzZWVkLmFkZCggdWludCggeCApICksIHNlZWQsIHNlZWQgKTtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnbXhfaGFzaF9pbnRfMCcsXHJcblx0dHlwZTogJ3VpbnQnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAneCcsIHR5cGU6ICdpbnQnIH1cclxuXHRdXHJcbn0gKTtcclxuXHJcbmV4cG9ydCBjb25zdCBteF9oYXNoX2ludF8xID0gLypAX19QVVJFX18qLyBGbiggKCBbIHhfaW1tdXRhYmxlLCB5X2ltbXV0YWJsZSBdICkgPT4ge1xyXG5cclxuXHRjb25zdCB5ID0gaW50KCB5X2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgeCA9IGludCggeF9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IGxlbiA9IHVpbnQoIHVpbnQoIDIgKSApLnRvVmFyKCk7XHJcblx0Y29uc3QgYSA9IHVpbnQoKS50b1ZhcigpLCBiID0gdWludCgpLnRvVmFyKCksIGMgPSB1aW50KCkudG9WYXIoKTtcclxuXHRhLmFzc2lnbiggYi5hc3NpZ24oIGMuYXNzaWduKCB1aW50KCBpbnQoIDB4ZGVhZGJlZWYgKSApLmFkZCggbGVuLnNoaWZ0TGVmdCggdWludCggMiApICkgKS5hZGQoIHVpbnQoIDEzICkgKSApICkgKTtcclxuXHRhLmFkZEFzc2lnbiggdWludCggeCApICk7XHJcblx0Yi5hZGRBc3NpZ24oIHVpbnQoIHkgKSApO1xyXG5cclxuXHRyZXR1cm4gbXhfYmpmaW5hbCggYSwgYiwgYyApO1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdteF9oYXNoX2ludF8xJyxcclxuXHR0eXBlOiAndWludCcsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICd4JywgdHlwZTogJ2ludCcgfSxcclxuXHRcdHsgbmFtZTogJ3knLCB0eXBlOiAnaW50JyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfaGFzaF9pbnRfMiA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyB4X2ltbXV0YWJsZSwgeV9pbW11dGFibGUsIHpfaW1tdXRhYmxlIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IHogPSBpbnQoIHpfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCB5ID0gaW50KCB5X2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgeCA9IGludCggeF9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IGxlbiA9IHVpbnQoIHVpbnQoIDMgKSApLnRvVmFyKCk7XHJcblx0Y29uc3QgYSA9IHVpbnQoKS50b1ZhcigpLCBiID0gdWludCgpLnRvVmFyKCksIGMgPSB1aW50KCkudG9WYXIoKTtcclxuXHRhLmFzc2lnbiggYi5hc3NpZ24oIGMuYXNzaWduKCB1aW50KCBpbnQoIDB4ZGVhZGJlZWYgKSApLmFkZCggbGVuLnNoaWZ0TGVmdCggdWludCggMiApICkgKS5hZGQoIHVpbnQoIDEzICkgKSApICkgKTtcclxuXHRhLmFkZEFzc2lnbiggdWludCggeCApICk7XHJcblx0Yi5hZGRBc3NpZ24oIHVpbnQoIHkgKSApO1xyXG5cdGMuYWRkQXNzaWduKCB1aW50KCB6ICkgKTtcclxuXHJcblx0cmV0dXJuIG14X2JqZmluYWwoIGEsIGIsIGMgKTtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnbXhfaGFzaF9pbnRfMicsXHJcblx0dHlwZTogJ3VpbnQnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAneCcsIHR5cGU6ICdpbnQnIH0sXHJcblx0XHR7IG5hbWU6ICd5JywgdHlwZTogJ2ludCcgfSxcclxuXHRcdHsgbmFtZTogJ3onLCB0eXBlOiAnaW50JyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfaGFzaF9pbnRfMyA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyB4X2ltbXV0YWJsZSwgeV9pbW11dGFibGUsIHpfaW1tdXRhYmxlLCB4eF9pbW11dGFibGUgXSApID0+IHtcclxuXHJcblx0Y29uc3QgeHggPSBpbnQoIHh4X2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgeiA9IGludCggel9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHkgPSBpbnQoIHlfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCB4ID0gaW50KCB4X2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgbGVuID0gdWludCggdWludCggNCApICkudG9WYXIoKTtcclxuXHRjb25zdCBhID0gdWludCgpLnRvVmFyKCksIGIgPSB1aW50KCkudG9WYXIoKSwgYyA9IHVpbnQoKS50b1ZhcigpO1xyXG5cdGEuYXNzaWduKCBiLmFzc2lnbiggYy5hc3NpZ24oIHVpbnQoIGludCggMHhkZWFkYmVlZiApICkuYWRkKCBsZW4uc2hpZnRMZWZ0KCB1aW50KCAyICkgKSApLmFkZCggdWludCggMTMgKSApICkgKSApO1xyXG5cdGEuYWRkQXNzaWduKCB1aW50KCB4ICkgKTtcclxuXHRiLmFkZEFzc2lnbiggdWludCggeSApICk7XHJcblx0Yy5hZGRBc3NpZ24oIHVpbnQoIHogKSApO1xyXG5cdG14X2JqbWl4KCBhLCBiLCBjICk7XHJcblx0YS5hZGRBc3NpZ24oIHVpbnQoIHh4ICkgKTtcclxuXHJcblx0cmV0dXJuIG14X2JqZmluYWwoIGEsIGIsIGMgKTtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnbXhfaGFzaF9pbnRfMycsXHJcblx0dHlwZTogJ3VpbnQnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAneCcsIHR5cGU6ICdpbnQnIH0sXHJcblx0XHR7IG5hbWU6ICd5JywgdHlwZTogJ2ludCcgfSxcclxuXHRcdHsgbmFtZTogJ3onLCB0eXBlOiAnaW50JyB9LFxyXG5cdFx0eyBuYW1lOiAneHgnLCB0eXBlOiAnaW50JyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfaGFzaF9pbnRfNCA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyB4X2ltbXV0YWJsZSwgeV9pbW11dGFibGUsIHpfaW1tdXRhYmxlLCB4eF9pbW11dGFibGUsIHl5X2ltbXV0YWJsZSBdICkgPT4ge1xyXG5cclxuXHRjb25zdCB5eSA9IGludCggeXlfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCB4eCA9IGludCggeHhfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCB6ID0gaW50KCB6X2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgeSA9IGludCggeV9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHggPSBpbnQoIHhfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBsZW4gPSB1aW50KCB1aW50KCA1ICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IGEgPSB1aW50KCkudG9WYXIoKSwgYiA9IHVpbnQoKS50b1ZhcigpLCBjID0gdWludCgpLnRvVmFyKCk7XHJcblx0YS5hc3NpZ24oIGIuYXNzaWduKCBjLmFzc2lnbiggdWludCggaW50KCAweGRlYWRiZWVmICkgKS5hZGQoIGxlbi5zaGlmdExlZnQoIHVpbnQoIDIgKSApICkuYWRkKCB1aW50KCAxMyApICkgKSApICk7XHJcblx0YS5hZGRBc3NpZ24oIHVpbnQoIHggKSApO1xyXG5cdGIuYWRkQXNzaWduKCB1aW50KCB5ICkgKTtcclxuXHRjLmFkZEFzc2lnbiggdWludCggeiApICk7XHJcblx0bXhfYmptaXgoIGEsIGIsIGMgKTtcclxuXHRhLmFkZEFzc2lnbiggdWludCggeHggKSApO1xyXG5cdGIuYWRkQXNzaWduKCB1aW50KCB5eSApICk7XHJcblxyXG5cdHJldHVybiBteF9iamZpbmFsKCBhLCBiLCBjICk7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ214X2hhc2hfaW50XzQnLFxyXG5cdHR5cGU6ICd1aW50JyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ3gnLCB0eXBlOiAnaW50JyB9LFxyXG5cdFx0eyBuYW1lOiAneScsIHR5cGU6ICdpbnQnIH0sXHJcblx0XHR7IG5hbWU6ICd6JywgdHlwZTogJ2ludCcgfSxcclxuXHRcdHsgbmFtZTogJ3h4JywgdHlwZTogJ2ludCcgfSxcclxuXHRcdHsgbmFtZTogJ3l5JywgdHlwZTogJ2ludCcgfVxyXG5cdF1cclxufSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X2hhc2hfaW50ID0gLypAX19QVVJFX18qLyBvdmVybG9hZGluZ0ZuKCBbIG14X2hhc2hfaW50XzAsIG14X2hhc2hfaW50XzEsIG14X2hhc2hfaW50XzIsIG14X2hhc2hfaW50XzMsIG14X2hhc2hfaW50XzQgXSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X2hhc2hfdmVjM18wID0gLypAX19QVVJFX18qLyBGbiggKCBbIHhfaW1tdXRhYmxlLCB5X2ltbXV0YWJsZSBdICkgPT4ge1xyXG5cclxuXHRjb25zdCB5ID0gaW50KCB5X2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgeCA9IGludCggeF9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IGggPSB1aW50KCBteF9oYXNoX2ludCggeCwgeSApICkudG9WYXIoKTtcclxuXHRjb25zdCByZXN1bHQgPSB1dmVjMygpLnRvVmFyKCk7XHJcblx0cmVzdWx0LnguYXNzaWduKCBoLmJpdEFuZCggaW50KCAweEZGICkgKSApO1xyXG5cdHJlc3VsdC55LmFzc2lnbiggaC5zaGlmdFJpZ2h0KCBpbnQoIDggKSApLmJpdEFuZCggaW50KCAweEZGICkgKSApO1xyXG5cdHJlc3VsdC56LmFzc2lnbiggaC5zaGlmdFJpZ2h0KCBpbnQoIDE2ICkgKS5iaXRBbmQoIGludCggMHhGRiApICkgKTtcclxuXHJcblx0cmV0dXJuIHJlc3VsdDtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnbXhfaGFzaF92ZWMzXzAnLFxyXG5cdHR5cGU6ICd1dmVjMycsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICd4JywgdHlwZTogJ2ludCcgfSxcclxuXHRcdHsgbmFtZTogJ3knLCB0eXBlOiAnaW50JyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfaGFzaF92ZWMzXzEgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgeF9pbW11dGFibGUsIHlfaW1tdXRhYmxlLCB6X2ltbXV0YWJsZSBdICkgPT4ge1xyXG5cclxuXHRjb25zdCB6ID0gaW50KCB6X2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgeSA9IGludCggeV9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHggPSBpbnQoIHhfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBoID0gdWludCggbXhfaGFzaF9pbnQoIHgsIHksIHogKSApLnRvVmFyKCk7XHJcblx0Y29uc3QgcmVzdWx0ID0gdXZlYzMoKS50b1ZhcigpO1xyXG5cdHJlc3VsdC54LmFzc2lnbiggaC5iaXRBbmQoIGludCggMHhGRiApICkgKTtcclxuXHRyZXN1bHQueS5hc3NpZ24oIGguc2hpZnRSaWdodCggaW50KCA4ICkgKS5iaXRBbmQoIGludCggMHhGRiApICkgKTtcclxuXHRyZXN1bHQuei5hc3NpZ24oIGguc2hpZnRSaWdodCggaW50KCAxNiApICkuYml0QW5kKCBpbnQoIDB4RkYgKSApICk7XHJcblxyXG5cdHJldHVybiByZXN1bHQ7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ214X2hhc2hfdmVjM18xJyxcclxuXHR0eXBlOiAndXZlYzMnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAneCcsIHR5cGU6ICdpbnQnIH0sXHJcblx0XHR7IG5hbWU6ICd5JywgdHlwZTogJ2ludCcgfSxcclxuXHRcdHsgbmFtZTogJ3onLCB0eXBlOiAnaW50JyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfaGFzaF92ZWMzID0gLypAX19QVVJFX18qLyBvdmVybG9hZGluZ0ZuKCBbIG14X2hhc2hfdmVjM18wLCBteF9oYXNoX3ZlYzNfMSBdICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfcGVybGluX25vaXNlX2Zsb2F0XzAgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgcF9pbW11dGFibGUgXSApID0+IHtcclxuXHJcblx0Y29uc3QgcCA9IHZlYzIoIHBfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBYID0gaW50KCkudG9WYXIoKSwgWSA9IGludCgpLnRvVmFyKCk7XHJcblx0Y29uc3QgZnggPSBmbG9hdCggbXhfZmxvb3JmcmFjKCBwLngsIFggKSApLnRvVmFyKCk7XHJcblx0Y29uc3QgZnkgPSBmbG9hdCggbXhfZmxvb3JmcmFjKCBwLnksIFkgKSApLnRvVmFyKCk7XHJcblx0Y29uc3QgdSA9IGZsb2F0KCBteF9mYWRlKCBmeCApICkudG9WYXIoKTtcclxuXHRjb25zdCB2ID0gZmxvYXQoIG14X2ZhZGUoIGZ5ICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHJlc3VsdCA9IGZsb2F0KCBteF9iaWxlcnAoIG14X2dyYWRpZW50X2Zsb2F0KCBteF9oYXNoX2ludCggWCwgWSApLCBmeCwgZnkgKSwgbXhfZ3JhZGllbnRfZmxvYXQoIG14X2hhc2hfaW50KCBYLmFkZCggaW50KCAxICkgKSwgWSApLCBmeC5zdWIoIDEuMCApLCBmeSApLCBteF9ncmFkaWVudF9mbG9hdCggbXhfaGFzaF9pbnQoIFgsIFkuYWRkKCBpbnQoIDEgKSApICksIGZ4LCBmeS5zdWIoIDEuMCApICksIG14X2dyYWRpZW50X2Zsb2F0KCBteF9oYXNoX2ludCggWC5hZGQoIGludCggMSApICksIFkuYWRkKCBpbnQoIDEgKSApICksIGZ4LnN1YiggMS4wICksIGZ5LnN1YiggMS4wICkgKSwgdSwgdiApICkudG9WYXIoKTtcclxuXHJcblx0cmV0dXJuIG14X2dyYWRpZW50X3NjYWxlMmQoIHJlc3VsdCApO1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdteF9wZXJsaW5fbm9pc2VfZmxvYXRfMCcsXHJcblx0dHlwZTogJ2Zsb2F0JyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ3AnLCB0eXBlOiAndmVjMicgfVxyXG5cdF1cclxufSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X3Blcmxpbl9ub2lzZV9mbG9hdF8xID0gLypAX19QVVJFX18qLyBGbiggKCBbIHBfaW1tdXRhYmxlIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IHAgPSB2ZWMzKCBwX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgWCA9IGludCgpLnRvVmFyKCksIFkgPSBpbnQoKS50b1ZhcigpLCBaID0gaW50KCkudG9WYXIoKTtcclxuXHRjb25zdCBmeCA9IGZsb2F0KCBteF9mbG9vcmZyYWMoIHAueCwgWCApICkudG9WYXIoKTtcclxuXHRjb25zdCBmeSA9IGZsb2F0KCBteF9mbG9vcmZyYWMoIHAueSwgWSApICkudG9WYXIoKTtcclxuXHRjb25zdCBmeiA9IGZsb2F0KCBteF9mbG9vcmZyYWMoIHAueiwgWiApICkudG9WYXIoKTtcclxuXHRjb25zdCB1ID0gZmxvYXQoIG14X2ZhZGUoIGZ4ICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHYgPSBmbG9hdCggbXhfZmFkZSggZnkgKSApLnRvVmFyKCk7XHJcblx0Y29uc3QgdyA9IGZsb2F0KCBteF9mYWRlKCBmeiApICkudG9WYXIoKTtcclxuXHRjb25zdCByZXN1bHQgPSBmbG9hdCggbXhfdHJpbGVycCggbXhfZ3JhZGllbnRfZmxvYXQoIG14X2hhc2hfaW50KCBYLCBZLCBaICksIGZ4LCBmeSwgZnogKSwgbXhfZ3JhZGllbnRfZmxvYXQoIG14X2hhc2hfaW50KCBYLmFkZCggaW50KCAxICkgKSwgWSwgWiApLCBmeC5zdWIoIDEuMCApLCBmeSwgZnogKSwgbXhfZ3JhZGllbnRfZmxvYXQoIG14X2hhc2hfaW50KCBYLCBZLmFkZCggaW50KCAxICkgKSwgWiApLCBmeCwgZnkuc3ViKCAxLjAgKSwgZnogKSwgbXhfZ3JhZGllbnRfZmxvYXQoIG14X2hhc2hfaW50KCBYLmFkZCggaW50KCAxICkgKSwgWS5hZGQoIGludCggMSApICksIFogKSwgZnguc3ViKCAxLjAgKSwgZnkuc3ViKCAxLjAgKSwgZnogKSwgbXhfZ3JhZGllbnRfZmxvYXQoIG14X2hhc2hfaW50KCBYLCBZLCBaLmFkZCggaW50KCAxICkgKSApLCBmeCwgZnksIGZ6LnN1YiggMS4wICkgKSwgbXhfZ3JhZGllbnRfZmxvYXQoIG14X2hhc2hfaW50KCBYLmFkZCggaW50KCAxICkgKSwgWSwgWi5hZGQoIGludCggMSApICkgKSwgZnguc3ViKCAxLjAgKSwgZnksIGZ6LnN1YiggMS4wICkgKSwgbXhfZ3JhZGllbnRfZmxvYXQoIG14X2hhc2hfaW50KCBYLCBZLmFkZCggaW50KCAxICkgKSwgWi5hZGQoIGludCggMSApICkgKSwgZngsIGZ5LnN1YiggMS4wICksIGZ6LnN1YiggMS4wICkgKSwgbXhfZ3JhZGllbnRfZmxvYXQoIG14X2hhc2hfaW50KCBYLmFkZCggaW50KCAxICkgKSwgWS5hZGQoIGludCggMSApICksIFouYWRkKCBpbnQoIDEgKSApICksIGZ4LnN1YiggMS4wICksIGZ5LnN1YiggMS4wICksIGZ6LnN1YiggMS4wICkgKSwgdSwgdiwgdyApICkudG9WYXIoKTtcclxuXHJcblx0cmV0dXJuIG14X2dyYWRpZW50X3NjYWxlM2QoIHJlc3VsdCApO1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdteF9wZXJsaW5fbm9pc2VfZmxvYXRfMScsXHJcblx0dHlwZTogJ2Zsb2F0JyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ3AnLCB0eXBlOiAndmVjMycgfVxyXG5cdF1cclxufSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X3Blcmxpbl9ub2lzZV9mbG9hdCA9IC8qQF9fUFVSRV9fKi8gb3ZlcmxvYWRpbmdGbiggWyBteF9wZXJsaW5fbm9pc2VfZmxvYXRfMCwgbXhfcGVybGluX25vaXNlX2Zsb2F0XzEgXSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X3Blcmxpbl9ub2lzZV92ZWMzXzAgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgcF9pbW11dGFibGUgXSApID0+IHtcclxuXHJcblx0Y29uc3QgcCA9IHZlYzIoIHBfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBYID0gaW50KCkudG9WYXIoKSwgWSA9IGludCgpLnRvVmFyKCk7XHJcblx0Y29uc3QgZnggPSBmbG9hdCggbXhfZmxvb3JmcmFjKCBwLngsIFggKSApLnRvVmFyKCk7XHJcblx0Y29uc3QgZnkgPSBmbG9hdCggbXhfZmxvb3JmcmFjKCBwLnksIFkgKSApLnRvVmFyKCk7XHJcblx0Y29uc3QgdSA9IGZsb2F0KCBteF9mYWRlKCBmeCApICkudG9WYXIoKTtcclxuXHRjb25zdCB2ID0gZmxvYXQoIG14X2ZhZGUoIGZ5ICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHJlc3VsdCA9IHZlYzMoIG14X2JpbGVycCggbXhfZ3JhZGllbnRfdmVjMyggbXhfaGFzaF92ZWMzKCBYLCBZICksIGZ4LCBmeSApLCBteF9ncmFkaWVudF92ZWMzKCBteF9oYXNoX3ZlYzMoIFguYWRkKCBpbnQoIDEgKSApLCBZICksIGZ4LnN1YiggMS4wICksIGZ5ICksIG14X2dyYWRpZW50X3ZlYzMoIG14X2hhc2hfdmVjMyggWCwgWS5hZGQoIGludCggMSApICkgKSwgZngsIGZ5LnN1YiggMS4wICkgKSwgbXhfZ3JhZGllbnRfdmVjMyggbXhfaGFzaF92ZWMzKCBYLmFkZCggaW50KCAxICkgKSwgWS5hZGQoIGludCggMSApICkgKSwgZnguc3ViKCAxLjAgKSwgZnkuc3ViKCAxLjAgKSApLCB1LCB2ICkgKS50b1ZhcigpO1xyXG5cclxuXHRyZXR1cm4gbXhfZ3JhZGllbnRfc2NhbGUyZCggcmVzdWx0ICk7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ214X3Blcmxpbl9ub2lzZV92ZWMzXzAnLFxyXG5cdHR5cGU6ICd2ZWMzJyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ3AnLCB0eXBlOiAndmVjMicgfVxyXG5cdF1cclxufSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X3Blcmxpbl9ub2lzZV92ZWMzXzEgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgcF9pbW11dGFibGUgXSApID0+IHtcclxuXHJcblx0Y29uc3QgcCA9IHZlYzMoIHBfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBYID0gaW50KCkudG9WYXIoKSwgWSA9IGludCgpLnRvVmFyKCksIFogPSBpbnQoKS50b1ZhcigpO1xyXG5cdGNvbnN0IGZ4ID0gZmxvYXQoIG14X2Zsb29yZnJhYyggcC54LCBYICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IGZ5ID0gZmxvYXQoIG14X2Zsb29yZnJhYyggcC55LCBZICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IGZ6ID0gZmxvYXQoIG14X2Zsb29yZnJhYyggcC56LCBaICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHUgPSBmbG9hdCggbXhfZmFkZSggZnggKSApLnRvVmFyKCk7XHJcblx0Y29uc3QgdiA9IGZsb2F0KCBteF9mYWRlKCBmeSApICkudG9WYXIoKTtcclxuXHRjb25zdCB3ID0gZmxvYXQoIG14X2ZhZGUoIGZ6ICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHJlc3VsdCA9IHZlYzMoIG14X3RyaWxlcnAoIG14X2dyYWRpZW50X3ZlYzMoIG14X2hhc2hfdmVjMyggWCwgWSwgWiApLCBmeCwgZnksIGZ6ICksIG14X2dyYWRpZW50X3ZlYzMoIG14X2hhc2hfdmVjMyggWC5hZGQoIGludCggMSApICksIFksIFogKSwgZnguc3ViKCAxLjAgKSwgZnksIGZ6ICksIG14X2dyYWRpZW50X3ZlYzMoIG14X2hhc2hfdmVjMyggWCwgWS5hZGQoIGludCggMSApICksIFogKSwgZngsIGZ5LnN1YiggMS4wICksIGZ6ICksIG14X2dyYWRpZW50X3ZlYzMoIG14X2hhc2hfdmVjMyggWC5hZGQoIGludCggMSApICksIFkuYWRkKCBpbnQoIDEgKSApLCBaICksIGZ4LnN1YiggMS4wICksIGZ5LnN1YiggMS4wICksIGZ6ICksIG14X2dyYWRpZW50X3ZlYzMoIG14X2hhc2hfdmVjMyggWCwgWSwgWi5hZGQoIGludCggMSApICkgKSwgZngsIGZ5LCBmei5zdWIoIDEuMCApICksIG14X2dyYWRpZW50X3ZlYzMoIG14X2hhc2hfdmVjMyggWC5hZGQoIGludCggMSApICksIFksIFouYWRkKCBpbnQoIDEgKSApICksIGZ4LnN1YiggMS4wICksIGZ5LCBmei5zdWIoIDEuMCApICksIG14X2dyYWRpZW50X3ZlYzMoIG14X2hhc2hfdmVjMyggWCwgWS5hZGQoIGludCggMSApICksIFouYWRkKCBpbnQoIDEgKSApICksIGZ4LCBmeS5zdWIoIDEuMCApLCBmei5zdWIoIDEuMCApICksIG14X2dyYWRpZW50X3ZlYzMoIG14X2hhc2hfdmVjMyggWC5hZGQoIGludCggMSApICksIFkuYWRkKCBpbnQoIDEgKSApLCBaLmFkZCggaW50KCAxICkgKSApLCBmeC5zdWIoIDEuMCApLCBmeS5zdWIoIDEuMCApLCBmei5zdWIoIDEuMCApICksIHUsIHYsIHcgKSApLnRvVmFyKCk7XHJcblxyXG5cdHJldHVybiBteF9ncmFkaWVudF9zY2FsZTNkKCByZXN1bHQgKTtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnbXhfcGVybGluX25vaXNlX3ZlYzNfMScsXHJcblx0dHlwZTogJ3ZlYzMnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAncCcsIHR5cGU6ICd2ZWMzJyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfcGVybGluX25vaXNlX3ZlYzMgPSAvKkBfX1BVUkVfXyovIG92ZXJsb2FkaW5nRm4oIFsgbXhfcGVybGluX25vaXNlX3ZlYzNfMCwgbXhfcGVybGluX25vaXNlX3ZlYzNfMSBdICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfY2VsbF9ub2lzZV9mbG9hdF8wID0gLypAX19QVVJFX18qLyBGbiggKCBbIHBfaW1tdXRhYmxlIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IHAgPSBmbG9hdCggcF9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IGl4ID0gaW50KCBteF9mbG9vciggcCApICkudG9WYXIoKTtcclxuXHJcblx0cmV0dXJuIG14X2JpdHNfdG9fMDEoIG14X2hhc2hfaW50KCBpeCApICk7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ214X2NlbGxfbm9pc2VfZmxvYXRfMCcsXHJcblx0dHlwZTogJ2Zsb2F0JyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ3AnLCB0eXBlOiAnZmxvYXQnIH1cclxuXHRdXHJcbn0gKTtcclxuXHJcbmV4cG9ydCBjb25zdCBteF9jZWxsX25vaXNlX2Zsb2F0XzEgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgcF9pbW11dGFibGUgXSApID0+IHtcclxuXHJcblx0Y29uc3QgcCA9IHZlYzIoIHBfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBpeCA9IGludCggbXhfZmxvb3IoIHAueCApICkudG9WYXIoKTtcclxuXHRjb25zdCBpeSA9IGludCggbXhfZmxvb3IoIHAueSApICkudG9WYXIoKTtcclxuXHJcblx0cmV0dXJuIG14X2JpdHNfdG9fMDEoIG14X2hhc2hfaW50KCBpeCwgaXkgKSApO1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdteF9jZWxsX25vaXNlX2Zsb2F0XzEnLFxyXG5cdHR5cGU6ICdmbG9hdCcsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICdwJywgdHlwZTogJ3ZlYzInIH1cclxuXHRdXHJcbn0gKTtcclxuXHJcbmV4cG9ydCBjb25zdCBteF9jZWxsX25vaXNlX2Zsb2F0XzIgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgcF9pbW11dGFibGUgXSApID0+IHtcclxuXHJcblx0Y29uc3QgcCA9IHZlYzMoIHBfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBpeCA9IGludCggbXhfZmxvb3IoIHAueCApICkudG9WYXIoKTtcclxuXHRjb25zdCBpeSA9IGludCggbXhfZmxvb3IoIHAueSApICkudG9WYXIoKTtcclxuXHRjb25zdCBpeiA9IGludCggbXhfZmxvb3IoIHAueiApICkudG9WYXIoKTtcclxuXHJcblx0cmV0dXJuIG14X2JpdHNfdG9fMDEoIG14X2hhc2hfaW50KCBpeCwgaXksIGl6ICkgKTtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnbXhfY2VsbF9ub2lzZV9mbG9hdF8yJyxcclxuXHR0eXBlOiAnZmxvYXQnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAncCcsIHR5cGU6ICd2ZWMzJyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfY2VsbF9ub2lzZV9mbG9hdF8zID0gLypAX19QVVJFX18qLyBGbiggKCBbIHBfaW1tdXRhYmxlIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IHAgPSB2ZWM0KCBwX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgaXggPSBpbnQoIG14X2Zsb29yKCBwLnggKSApLnRvVmFyKCk7XHJcblx0Y29uc3QgaXkgPSBpbnQoIG14X2Zsb29yKCBwLnkgKSApLnRvVmFyKCk7XHJcblx0Y29uc3QgaXogPSBpbnQoIG14X2Zsb29yKCBwLnogKSApLnRvVmFyKCk7XHJcblx0Y29uc3QgaXcgPSBpbnQoIG14X2Zsb29yKCBwLncgKSApLnRvVmFyKCk7XHJcblxyXG5cdHJldHVybiBteF9iaXRzX3RvXzAxKCBteF9oYXNoX2ludCggaXgsIGl5LCBpeiwgaXcgKSApO1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdteF9jZWxsX25vaXNlX2Zsb2F0XzMnLFxyXG5cdHR5cGU6ICdmbG9hdCcsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICdwJywgdHlwZTogJ3ZlYzQnIH1cclxuXHRdXHJcbn0gKTtcclxuXHJcbmV4cG9ydCBjb25zdCBteF9jZWxsX25vaXNlX2Zsb2F0ID0gLypAX19QVVJFX18qLyBvdmVybG9hZGluZ0ZuKCBbIG14X2NlbGxfbm9pc2VfZmxvYXRfMCwgbXhfY2VsbF9ub2lzZV9mbG9hdF8xLCBteF9jZWxsX25vaXNlX2Zsb2F0XzIsIG14X2NlbGxfbm9pc2VfZmxvYXRfMyBdICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfY2VsbF9ub2lzZV92ZWMzXzAgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgcF9pbW11dGFibGUgXSApID0+IHtcclxuXHJcblx0Y29uc3QgcCA9IGZsb2F0KCBwX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgaXggPSBpbnQoIG14X2Zsb29yKCBwICkgKS50b1ZhcigpO1xyXG5cclxuXHRyZXR1cm4gdmVjMyggbXhfYml0c190b18wMSggbXhfaGFzaF9pbnQoIGl4LCBpbnQoIDAgKSApICksIG14X2JpdHNfdG9fMDEoIG14X2hhc2hfaW50KCBpeCwgaW50KCAxICkgKSApLCBteF9iaXRzX3RvXzAxKCBteF9oYXNoX2ludCggaXgsIGludCggMiApICkgKSApO1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdteF9jZWxsX25vaXNlX3ZlYzNfMCcsXHJcblx0dHlwZTogJ3ZlYzMnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAncCcsIHR5cGU6ICdmbG9hdCcgfVxyXG5cdF1cclxufSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X2NlbGxfbm9pc2VfdmVjM18xID0gLypAX19QVVJFX18qLyBGbiggKCBbIHBfaW1tdXRhYmxlIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IHAgPSB2ZWMyKCBwX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgaXggPSBpbnQoIG14X2Zsb29yKCBwLnggKSApLnRvVmFyKCk7XHJcblx0Y29uc3QgaXkgPSBpbnQoIG14X2Zsb29yKCBwLnkgKSApLnRvVmFyKCk7XHJcblxyXG5cdHJldHVybiB2ZWMzKCBteF9iaXRzX3RvXzAxKCBteF9oYXNoX2ludCggaXgsIGl5LCBpbnQoIDAgKSApICksIG14X2JpdHNfdG9fMDEoIG14X2hhc2hfaW50KCBpeCwgaXksIGludCggMSApICkgKSwgbXhfYml0c190b18wMSggbXhfaGFzaF9pbnQoIGl4LCBpeSwgaW50KCAyICkgKSApICk7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ214X2NlbGxfbm9pc2VfdmVjM18xJyxcclxuXHR0eXBlOiAndmVjMycsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICdwJywgdHlwZTogJ3ZlYzInIH1cclxuXHRdXHJcbn0gKTtcclxuXHJcbmV4cG9ydCBjb25zdCBteF9jZWxsX25vaXNlX3ZlYzNfMiA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyBwX2ltbXV0YWJsZSBdICkgPT4ge1xyXG5cclxuXHRjb25zdCBwID0gdmVjMyggcF9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IGl4ID0gaW50KCBteF9mbG9vciggcC54ICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IGl5ID0gaW50KCBteF9mbG9vciggcC55ICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IGl6ID0gaW50KCBteF9mbG9vciggcC56ICkgKS50b1ZhcigpO1xyXG5cclxuXHRyZXR1cm4gdmVjMyggbXhfYml0c190b18wMSggbXhfaGFzaF9pbnQoIGl4LCBpeSwgaXosIGludCggMCApICkgKSwgbXhfYml0c190b18wMSggbXhfaGFzaF9pbnQoIGl4LCBpeSwgaXosIGludCggMSApICkgKSwgbXhfYml0c190b18wMSggbXhfaGFzaF9pbnQoIGl4LCBpeSwgaXosIGludCggMiApICkgKSApO1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdteF9jZWxsX25vaXNlX3ZlYzNfMicsXHJcblx0dHlwZTogJ3ZlYzMnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAncCcsIHR5cGU6ICd2ZWMzJyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfY2VsbF9ub2lzZV92ZWMzXzMgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgcF9pbW11dGFibGUgXSApID0+IHtcclxuXHJcblx0Y29uc3QgcCA9IHZlYzQoIHBfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBpeCA9IGludCggbXhfZmxvb3IoIHAueCApICkudG9WYXIoKTtcclxuXHRjb25zdCBpeSA9IGludCggbXhfZmxvb3IoIHAueSApICkudG9WYXIoKTtcclxuXHRjb25zdCBpeiA9IGludCggbXhfZmxvb3IoIHAueiApICkudG9WYXIoKTtcclxuXHRjb25zdCBpdyA9IGludCggbXhfZmxvb3IoIHAudyApICkudG9WYXIoKTtcclxuXHJcblx0cmV0dXJuIHZlYzMoIG14X2JpdHNfdG9fMDEoIG14X2hhc2hfaW50KCBpeCwgaXksIGl6LCBpdywgaW50KCAwICkgKSApLCBteF9iaXRzX3RvXzAxKCBteF9oYXNoX2ludCggaXgsIGl5LCBpeiwgaXcsIGludCggMSApICkgKSwgbXhfYml0c190b18wMSggbXhfaGFzaF9pbnQoIGl4LCBpeSwgaXosIGl3LCBpbnQoIDIgKSApICkgKTtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnbXhfY2VsbF9ub2lzZV92ZWMzXzMnLFxyXG5cdHR5cGU6ICd2ZWMzJyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ3AnLCB0eXBlOiAndmVjNCcgfVxyXG5cdF1cclxufSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X2NlbGxfbm9pc2VfdmVjMyA9IC8qQF9fUFVSRV9fKi8gb3ZlcmxvYWRpbmdGbiggWyBteF9jZWxsX25vaXNlX3ZlYzNfMCwgbXhfY2VsbF9ub2lzZV92ZWMzXzEsIG14X2NlbGxfbm9pc2VfdmVjM18yLCBteF9jZWxsX25vaXNlX3ZlYzNfMyBdICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfZnJhY3RhbF9ub2lzZV9mbG9hdCA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyBwX2ltbXV0YWJsZSwgb2N0YXZlc19pbW11dGFibGUsIGxhY3VuYXJpdHlfaW1tdXRhYmxlLCBkaW1pbmlzaF9pbW11dGFibGUgXSApID0+IHtcclxuXHJcblx0Y29uc3QgZGltaW5pc2ggPSBmbG9hdCggZGltaW5pc2hfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBsYWN1bmFyaXR5ID0gZmxvYXQoIGxhY3VuYXJpdHlfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBvY3RhdmVzID0gaW50KCBvY3RhdmVzX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgcCA9IHZlYzMoIHBfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCByZXN1bHQgPSBmbG9hdCggMC4wICkudG9WYXIoKTtcclxuXHRjb25zdCBhbXBsaXR1ZGUgPSBmbG9hdCggMS4wICkudG9WYXIoKTtcclxuXHJcblx0TG9vcCggb2N0YXZlcywgKCkgPT4ge1xyXG5cclxuXHRcdHJlc3VsdC5hZGRBc3NpZ24oIGFtcGxpdHVkZS5tdWwoIG14X3Blcmxpbl9ub2lzZV9mbG9hdCggcCApICkgKTtcclxuXHRcdGFtcGxpdHVkZS5tdWxBc3NpZ24oIGRpbWluaXNoICk7XHJcblx0XHRwLm11bEFzc2lnbiggbGFjdW5hcml0eSApO1xyXG5cclxuXHR9ICk7XHJcblxyXG5cdHJldHVybiByZXN1bHQ7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ214X2ZyYWN0YWxfbm9pc2VfZmxvYXQnLFxyXG5cdHR5cGU6ICdmbG9hdCcsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICdwJywgdHlwZTogJ3ZlYzMnIH0sXHJcblx0XHR7IG5hbWU6ICdvY3RhdmVzJywgdHlwZTogJ2ludCcgfSxcclxuXHRcdHsgbmFtZTogJ2xhY3VuYXJpdHknLCB0eXBlOiAnZmxvYXQnIH0sXHJcblx0XHR7IG5hbWU6ICdkaW1pbmlzaCcsIHR5cGU6ICdmbG9hdCcgfVxyXG5cdF1cclxufSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X2ZyYWN0YWxfbm9pc2VfdmVjMyA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyBwX2ltbXV0YWJsZSwgb2N0YXZlc19pbW11dGFibGUsIGxhY3VuYXJpdHlfaW1tdXRhYmxlLCBkaW1pbmlzaF9pbW11dGFibGUgXSApID0+IHtcclxuXHJcblx0Y29uc3QgZGltaW5pc2ggPSBmbG9hdCggZGltaW5pc2hfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBsYWN1bmFyaXR5ID0gZmxvYXQoIGxhY3VuYXJpdHlfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBvY3RhdmVzID0gaW50KCBvY3RhdmVzX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgcCA9IHZlYzMoIHBfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCByZXN1bHQgPSB2ZWMzKCAwLjAgKS50b1ZhcigpO1xyXG5cdGNvbnN0IGFtcGxpdHVkZSA9IGZsb2F0KCAxLjAgKS50b1ZhcigpO1xyXG5cclxuXHRMb29wKCBvY3RhdmVzLCAoKSA9PiB7XHJcblxyXG5cdFx0cmVzdWx0LmFkZEFzc2lnbiggYW1wbGl0dWRlLm11bCggbXhfcGVybGluX25vaXNlX3ZlYzMoIHAgKSApICk7XHJcblx0XHRhbXBsaXR1ZGUubXVsQXNzaWduKCBkaW1pbmlzaCApO1xyXG5cdFx0cC5tdWxBc3NpZ24oIGxhY3VuYXJpdHkgKTtcclxuXHJcblx0fSApO1xyXG5cclxuXHRyZXR1cm4gcmVzdWx0O1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdteF9mcmFjdGFsX25vaXNlX3ZlYzMnLFxyXG5cdHR5cGU6ICd2ZWMzJyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ3AnLCB0eXBlOiAndmVjMycgfSxcclxuXHRcdHsgbmFtZTogJ29jdGF2ZXMnLCB0eXBlOiAnaW50JyB9LFxyXG5cdFx0eyBuYW1lOiAnbGFjdW5hcml0eScsIHR5cGU6ICdmbG9hdCcgfSxcclxuXHRcdHsgbmFtZTogJ2RpbWluaXNoJywgdHlwZTogJ2Zsb2F0JyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfZnJhY3RhbF9ub2lzZV92ZWMyID0gLypAX19QVVJFX18qLyBGbiggKCBbIHBfaW1tdXRhYmxlLCBvY3RhdmVzX2ltbXV0YWJsZSwgbGFjdW5hcml0eV9pbW11dGFibGUsIGRpbWluaXNoX2ltbXV0YWJsZSBdICkgPT4ge1xyXG5cclxuXHRjb25zdCBkaW1pbmlzaCA9IGZsb2F0KCBkaW1pbmlzaF9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IGxhY3VuYXJpdHkgPSBmbG9hdCggbGFjdW5hcml0eV9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IG9jdGF2ZXMgPSBpbnQoIG9jdGF2ZXNfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBwID0gdmVjMyggcF9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cclxuXHRyZXR1cm4gdmVjMiggbXhfZnJhY3RhbF9ub2lzZV9mbG9hdCggcCwgb2N0YXZlcywgbGFjdW5hcml0eSwgZGltaW5pc2ggKSwgbXhfZnJhY3RhbF9ub2lzZV9mbG9hdCggcC5hZGQoIHZlYzMoIGludCggMTkgKSwgaW50KCAxOTMgKSwgaW50KCAxNyApICkgKSwgb2N0YXZlcywgbGFjdW5hcml0eSwgZGltaW5pc2ggKSApO1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdteF9mcmFjdGFsX25vaXNlX3ZlYzInLFxyXG5cdHR5cGU6ICd2ZWMyJyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ3AnLCB0eXBlOiAndmVjMycgfSxcclxuXHRcdHsgbmFtZTogJ29jdGF2ZXMnLCB0eXBlOiAnaW50JyB9LFxyXG5cdFx0eyBuYW1lOiAnbGFjdW5hcml0eScsIHR5cGU6ICdmbG9hdCcgfSxcclxuXHRcdHsgbmFtZTogJ2RpbWluaXNoJywgdHlwZTogJ2Zsb2F0JyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfZnJhY3RhbF9ub2lzZV92ZWM0ID0gLypAX19QVVJFX18qLyBGbiggKCBbIHBfaW1tdXRhYmxlLCBvY3RhdmVzX2ltbXV0YWJsZSwgbGFjdW5hcml0eV9pbW11dGFibGUsIGRpbWluaXNoX2ltbXV0YWJsZSBdICkgPT4ge1xyXG5cclxuXHRjb25zdCBkaW1pbmlzaCA9IGZsb2F0KCBkaW1pbmlzaF9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IGxhY3VuYXJpdHkgPSBmbG9hdCggbGFjdW5hcml0eV9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IG9jdGF2ZXMgPSBpbnQoIG9jdGF2ZXNfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBwID0gdmVjMyggcF9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IGMgPSB2ZWMzKCBteF9mcmFjdGFsX25vaXNlX3ZlYzMoIHAsIG9jdGF2ZXMsIGxhY3VuYXJpdHksIGRpbWluaXNoICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IGYgPSBmbG9hdCggbXhfZnJhY3RhbF9ub2lzZV9mbG9hdCggcC5hZGQoIHZlYzMoIGludCggMTkgKSwgaW50KCAxOTMgKSwgaW50KCAxNyApICkgKSwgb2N0YXZlcywgbGFjdW5hcml0eSwgZGltaW5pc2ggKSApLnRvVmFyKCk7XHJcblxyXG5cdHJldHVybiB2ZWM0KCBjLCBmICk7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ214X2ZyYWN0YWxfbm9pc2VfdmVjNCcsXHJcblx0dHlwZTogJ3ZlYzQnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAncCcsIHR5cGU6ICd2ZWMzJyB9LFxyXG5cdFx0eyBuYW1lOiAnb2N0YXZlcycsIHR5cGU6ICdpbnQnIH0sXHJcblx0XHR7IG5hbWU6ICdsYWN1bmFyaXR5JywgdHlwZTogJ2Zsb2F0JyB9LFxyXG5cdFx0eyBuYW1lOiAnZGltaW5pc2gnLCB0eXBlOiAnZmxvYXQnIH1cclxuXHRdXHJcbn0gKTtcclxuXHJcbmV4cG9ydCBjb25zdCBteF93b3JsZXlfZGlzdGFuY2VfMCA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyBwX2ltbXV0YWJsZSwgeF9pbW11dGFibGUsIHlfaW1tdXRhYmxlLCB4b2ZmX2ltbXV0YWJsZSwgeW9mZl9pbW11dGFibGUsIGppdHRlcl9pbW11dGFibGUsIG1ldHJpY19pbW11dGFibGUgXSApID0+IHtcclxuXHJcblx0Y29uc3QgbWV0cmljID0gaW50KCBtZXRyaWNfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBqaXR0ZXIgPSBmbG9hdCggaml0dGVyX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgeW9mZiA9IGludCggeW9mZl9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHhvZmYgPSBpbnQoIHhvZmZfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCB5ID0gaW50KCB5X2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgeCA9IGludCggeF9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHAgPSB2ZWMyKCBwX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgdG1wID0gdmVjMyggbXhfY2VsbF9ub2lzZV92ZWMzKCB2ZWMyKCB4LmFkZCggeG9mZiApLCB5LmFkZCggeW9mZiApICkgKSApLnRvVmFyKCk7XHJcblx0Y29uc3Qgb2ZmID0gdmVjMiggdG1wLngsIHRtcC55ICkudG9WYXIoKTtcclxuXHRvZmYuc3ViQXNzaWduKCAwLjUgKTtcclxuXHRvZmYubXVsQXNzaWduKCBqaXR0ZXIgKTtcclxuXHRvZmYuYWRkQXNzaWduKCAwLjUgKTtcclxuXHRjb25zdCBjZWxscG9zID0gdmVjMiggdmVjMiggZmxvYXQoIHggKSwgZmxvYXQoIHkgKSApLmFkZCggb2ZmICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IGRpZmYgPSB2ZWMyKCBjZWxscG9zLnN1YiggcCApICkudG9WYXIoKTtcclxuXHJcblx0SWYoIG1ldHJpYy5lcXVhbCggaW50KCAyICkgKSwgKCkgPT4ge1xyXG5cclxuXHRcdHJldHVybiBhYnMoIGRpZmYueCApLmFkZCggYWJzKCBkaWZmLnkgKSApO1xyXG5cclxuXHR9ICk7XHJcblxyXG5cdElmKCBtZXRyaWMuZXF1YWwoIGludCggMyApICksICgpID0+IHtcclxuXHJcblx0XHRyZXR1cm4gbWF4KCBhYnMoIGRpZmYueCApLCBhYnMoIGRpZmYueSApICk7XHJcblxyXG5cdH0gKTtcclxuXHJcblx0cmV0dXJuIGRvdCggZGlmZiwgZGlmZiApO1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdteF93b3JsZXlfZGlzdGFuY2VfMCcsXHJcblx0dHlwZTogJ2Zsb2F0JyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ3AnLCB0eXBlOiAndmVjMicgfSxcclxuXHRcdHsgbmFtZTogJ3gnLCB0eXBlOiAnaW50JyB9LFxyXG5cdFx0eyBuYW1lOiAneScsIHR5cGU6ICdpbnQnIH0sXHJcblx0XHR7IG5hbWU6ICd4b2ZmJywgdHlwZTogJ2ludCcgfSxcclxuXHRcdHsgbmFtZTogJ3lvZmYnLCB0eXBlOiAnaW50JyB9LFxyXG5cdFx0eyBuYW1lOiAnaml0dGVyJywgdHlwZTogJ2Zsb2F0JyB9LFxyXG5cdFx0eyBuYW1lOiAnbWV0cmljJywgdHlwZTogJ2ludCcgfVxyXG5cdF1cclxufSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X3dvcmxleV9kaXN0YW5jZV8xID0gLypAX19QVVJFX18qLyBGbiggKCBbIHBfaW1tdXRhYmxlLCB4X2ltbXV0YWJsZSwgeV9pbW11dGFibGUsIHpfaW1tdXRhYmxlLCB4b2ZmX2ltbXV0YWJsZSwgeW9mZl9pbW11dGFibGUsIHpvZmZfaW1tdXRhYmxlLCBqaXR0ZXJfaW1tdXRhYmxlLCBtZXRyaWNfaW1tdXRhYmxlIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IG1ldHJpYyA9IGludCggbWV0cmljX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3Qgaml0dGVyID0gZmxvYXQoIGppdHRlcl9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHpvZmYgPSBpbnQoIHpvZmZfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCB5b2ZmID0gaW50KCB5b2ZmX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgeG9mZiA9IGludCggeG9mZl9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHogPSBpbnQoIHpfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCB5ID0gaW50KCB5X2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgeCA9IGludCggeF9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHAgPSB2ZWMzKCBwX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3Qgb2ZmID0gdmVjMyggbXhfY2VsbF9ub2lzZV92ZWMzKCB2ZWMzKCB4LmFkZCggeG9mZiApLCB5LmFkZCggeW9mZiApLCB6LmFkZCggem9mZiApICkgKSApLnRvVmFyKCk7XHJcblx0b2ZmLnN1YkFzc2lnbiggMC41ICk7XHJcblx0b2ZmLm11bEFzc2lnbiggaml0dGVyICk7XHJcblx0b2ZmLmFkZEFzc2lnbiggMC41ICk7XHJcblx0Y29uc3QgY2VsbHBvcyA9IHZlYzMoIHZlYzMoIGZsb2F0KCB4ICksIGZsb2F0KCB5ICksIGZsb2F0KCB6ICkgKS5hZGQoIG9mZiApICkudG9WYXIoKTtcclxuXHRjb25zdCBkaWZmID0gdmVjMyggY2VsbHBvcy5zdWIoIHAgKSApLnRvVmFyKCk7XHJcblxyXG5cdElmKCBtZXRyaWMuZXF1YWwoIGludCggMiApICksICgpID0+IHtcclxuXHJcblx0XHRyZXR1cm4gYWJzKCBkaWZmLnggKS5hZGQoIGFicyggZGlmZi55ICkgKS5hZGQoIGFicyggZGlmZi56ICkgKTtcclxuXHJcblx0fSApO1xyXG5cclxuXHRJZiggbWV0cmljLmVxdWFsKCBpbnQoIDMgKSApLCAoKSA9PiB7XHJcblxyXG5cdFx0cmV0dXJuIG1heCggbWF4KCBhYnMoIGRpZmYueCApLCBhYnMoIGRpZmYueSApICksIGFicyggZGlmZi56ICkgKTtcclxuXHJcblx0fSApO1xyXG5cclxuXHRyZXR1cm4gZG90KCBkaWZmLCBkaWZmICk7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ214X3dvcmxleV9kaXN0YW5jZV8xJyxcclxuXHR0eXBlOiAnZmxvYXQnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAncCcsIHR5cGU6ICd2ZWMzJyB9LFxyXG5cdFx0eyBuYW1lOiAneCcsIHR5cGU6ICdpbnQnIH0sXHJcblx0XHR7IG5hbWU6ICd5JywgdHlwZTogJ2ludCcgfSxcclxuXHRcdHsgbmFtZTogJ3onLCB0eXBlOiAnaW50JyB9LFxyXG5cdFx0eyBuYW1lOiAneG9mZicsIHR5cGU6ICdpbnQnIH0sXHJcblx0XHR7IG5hbWU6ICd5b2ZmJywgdHlwZTogJ2ludCcgfSxcclxuXHRcdHsgbmFtZTogJ3pvZmYnLCB0eXBlOiAnaW50JyB9LFxyXG5cdFx0eyBuYW1lOiAnaml0dGVyJywgdHlwZTogJ2Zsb2F0JyB9LFxyXG5cdFx0eyBuYW1lOiAnbWV0cmljJywgdHlwZTogJ2ludCcgfVxyXG5cdF1cclxufSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X3dvcmxleV9kaXN0YW5jZSA9IC8qQF9fUFVSRV9fKi8gb3ZlcmxvYWRpbmdGbiggWyBteF93b3JsZXlfZGlzdGFuY2VfMCwgbXhfd29ybGV5X2Rpc3RhbmNlXzEgXSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X3dvcmxleV9ub2lzZV9mbG9hdF8wID0gLypAX19QVVJFX18qLyBGbiggKCBbIHBfaW1tdXRhYmxlLCBqaXR0ZXJfaW1tdXRhYmxlLCBtZXRyaWNfaW1tdXRhYmxlIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IG1ldHJpYyA9IGludCggbWV0cmljX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3Qgaml0dGVyID0gZmxvYXQoIGppdHRlcl9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHAgPSB2ZWMyKCBwX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgWCA9IGludCgpLnRvVmFyKCksIFkgPSBpbnQoKS50b1ZhcigpO1xyXG5cdGNvbnN0IGxvY2FscG9zID0gdmVjMiggbXhfZmxvb3JmcmFjKCBwLngsIFggKSwgbXhfZmxvb3JmcmFjKCBwLnksIFkgKSApLnRvVmFyKCk7XHJcblx0Y29uc3Qgc3FkaXN0ID0gZmxvYXQoIDFlNiApLnRvVmFyKCk7XHJcblxyXG5cdExvb3AoIHsgc3RhcnQ6IC0gMSwgZW5kOiBpbnQoIDEgKSwgbmFtZTogJ3gnLCBjb25kaXRpb246ICc8PScgfSwgKCB7IHggfSApID0+IHtcclxuXHJcblx0XHRMb29wKCB7IHN0YXJ0OiAtIDEsIGVuZDogaW50KCAxICksIG5hbWU6ICd5JywgY29uZGl0aW9uOiAnPD0nIH0sICggeyB5IH0gKSA9PiB7XHJcblxyXG5cdFx0XHRjb25zdCBkaXN0ID0gZmxvYXQoIG14X3dvcmxleV9kaXN0YW5jZSggbG9jYWxwb3MsIHgsIHksIFgsIFksIGppdHRlciwgbWV0cmljICkgKS50b1ZhcigpO1xyXG5cdFx0XHRzcWRpc3QuYXNzaWduKCBtaW4oIHNxZGlzdCwgZGlzdCApICk7XHJcblxyXG5cdFx0fSApO1xyXG5cclxuXHR9ICk7XHJcblxyXG5cdElmKCBtZXRyaWMuZXF1YWwoIGludCggMCApICksICgpID0+IHtcclxuXHJcblx0XHRzcWRpc3QuYXNzaWduKCBzcXJ0KCBzcWRpc3QgKSApO1xyXG5cclxuXHR9ICk7XHJcblxyXG5cdHJldHVybiBzcWRpc3Q7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ214X3dvcmxleV9ub2lzZV9mbG9hdF8wJyxcclxuXHR0eXBlOiAnZmxvYXQnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAncCcsIHR5cGU6ICd2ZWMyJyB9LFxyXG5cdFx0eyBuYW1lOiAnaml0dGVyJywgdHlwZTogJ2Zsb2F0JyB9LFxyXG5cdFx0eyBuYW1lOiAnbWV0cmljJywgdHlwZTogJ2ludCcgfVxyXG5cdF1cclxufSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X3dvcmxleV9ub2lzZV92ZWMyXzAgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgcF9pbW11dGFibGUsIGppdHRlcl9pbW11dGFibGUsIG1ldHJpY19pbW11dGFibGUgXSApID0+IHtcclxuXHJcblx0Y29uc3QgbWV0cmljID0gaW50KCBtZXRyaWNfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBqaXR0ZXIgPSBmbG9hdCggaml0dGVyX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgcCA9IHZlYzIoIHBfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBYID0gaW50KCkudG9WYXIoKSwgWSA9IGludCgpLnRvVmFyKCk7XHJcblx0Y29uc3QgbG9jYWxwb3MgPSB2ZWMyKCBteF9mbG9vcmZyYWMoIHAueCwgWCApLCBteF9mbG9vcmZyYWMoIHAueSwgWSApICkudG9WYXIoKTtcclxuXHRjb25zdCBzcWRpc3QgPSB2ZWMyKCAxZTYsIDFlNiApLnRvVmFyKCk7XHJcblxyXG5cdExvb3AoIHsgc3RhcnQ6IC0gMSwgZW5kOiBpbnQoIDEgKSwgbmFtZTogJ3gnLCBjb25kaXRpb246ICc8PScgfSwgKCB7IHggfSApID0+IHtcclxuXHJcblx0XHRMb29wKCB7IHN0YXJ0OiAtIDEsIGVuZDogaW50KCAxICksIG5hbWU6ICd5JywgY29uZGl0aW9uOiAnPD0nIH0sICggeyB5IH0gKSA9PiB7XHJcblxyXG5cdFx0XHRjb25zdCBkaXN0ID0gZmxvYXQoIG14X3dvcmxleV9kaXN0YW5jZSggbG9jYWxwb3MsIHgsIHksIFgsIFksIGppdHRlciwgbWV0cmljICkgKS50b1ZhcigpO1xyXG5cclxuXHRcdFx0SWYoIGRpc3QubGVzc1RoYW4oIHNxZGlzdC54ICksICgpID0+IHtcclxuXHJcblx0XHRcdFx0c3FkaXN0LnkuYXNzaWduKCBzcWRpc3QueCApO1xyXG5cdFx0XHRcdHNxZGlzdC54LmFzc2lnbiggZGlzdCApO1xyXG5cclxuXHRcdFx0fSApLkVsc2VJZiggZGlzdC5sZXNzVGhhbiggc3FkaXN0LnkgKSwgKCkgPT4ge1xyXG5cclxuXHRcdFx0XHRzcWRpc3QueS5hc3NpZ24oIGRpc3QgKTtcclxuXHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHR9ICk7XHJcblxyXG5cdH0gKTtcclxuXHJcblx0SWYoIG1ldHJpYy5lcXVhbCggaW50KCAwICkgKSwgKCkgPT4ge1xyXG5cclxuXHRcdHNxZGlzdC5hc3NpZ24oIHNxcnQoIHNxZGlzdCApICk7XHJcblxyXG5cdH0gKTtcclxuXHJcblx0cmV0dXJuIHNxZGlzdDtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnbXhfd29ybGV5X25vaXNlX3ZlYzJfMCcsXHJcblx0dHlwZTogJ3ZlYzInLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAncCcsIHR5cGU6ICd2ZWMyJyB9LFxyXG5cdFx0eyBuYW1lOiAnaml0dGVyJywgdHlwZTogJ2Zsb2F0JyB9LFxyXG5cdFx0eyBuYW1lOiAnbWV0cmljJywgdHlwZTogJ2ludCcgfVxyXG5cdF1cclxufSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X3dvcmxleV9ub2lzZV92ZWMzXzAgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgcF9pbW11dGFibGUsIGppdHRlcl9pbW11dGFibGUsIG1ldHJpY19pbW11dGFibGUgXSApID0+IHtcclxuXHJcblx0Y29uc3QgbWV0cmljID0gaW50KCBtZXRyaWNfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBqaXR0ZXIgPSBmbG9hdCggaml0dGVyX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgcCA9IHZlYzIoIHBfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBYID0gaW50KCkudG9WYXIoKSwgWSA9IGludCgpLnRvVmFyKCk7XHJcblx0Y29uc3QgbG9jYWxwb3MgPSB2ZWMyKCBteF9mbG9vcmZyYWMoIHAueCwgWCApLCBteF9mbG9vcmZyYWMoIHAueSwgWSApICkudG9WYXIoKTtcclxuXHRjb25zdCBzcWRpc3QgPSB2ZWMzKCAxZTYsIDFlNiwgMWU2ICkudG9WYXIoKTtcclxuXHJcblx0TG9vcCggeyBzdGFydDogLSAxLCBlbmQ6IGludCggMSApLCBuYW1lOiAneCcsIGNvbmRpdGlvbjogJzw9JyB9LCAoIHsgeCB9ICkgPT4ge1xyXG5cclxuXHRcdExvb3AoIHsgc3RhcnQ6IC0gMSwgZW5kOiBpbnQoIDEgKSwgbmFtZTogJ3knLCBjb25kaXRpb246ICc8PScgfSwgKCB7IHkgfSApID0+IHtcclxuXHJcblx0XHRcdGNvbnN0IGRpc3QgPSBmbG9hdCggbXhfd29ybGV5X2Rpc3RhbmNlKCBsb2NhbHBvcywgeCwgeSwgWCwgWSwgaml0dGVyLCBtZXRyaWMgKSApLnRvVmFyKCk7XHJcblxyXG5cdFx0XHRJZiggZGlzdC5sZXNzVGhhbiggc3FkaXN0LnggKSwgKCkgPT4ge1xyXG5cclxuXHRcdFx0XHRzcWRpc3Quei5hc3NpZ24oIHNxZGlzdC55ICk7XHJcblx0XHRcdFx0c3FkaXN0LnkuYXNzaWduKCBzcWRpc3QueCApO1xyXG5cdFx0XHRcdHNxZGlzdC54LmFzc2lnbiggZGlzdCApO1xyXG5cclxuXHRcdFx0fSApLkVsc2VJZiggZGlzdC5sZXNzVGhhbiggc3FkaXN0LnkgKSwgKCkgPT4ge1xyXG5cclxuXHRcdFx0XHRzcWRpc3Quei5hc3NpZ24oIHNxZGlzdC55ICk7XHJcblx0XHRcdFx0c3FkaXN0LnkuYXNzaWduKCBkaXN0ICk7XHJcblxyXG5cdFx0XHR9ICkuRWxzZUlmKCBkaXN0Lmxlc3NUaGFuKCBzcWRpc3QueiApLCAoKSA9PiB7XHJcblxyXG5cdFx0XHRcdHNxZGlzdC56LmFzc2lnbiggZGlzdCApO1xyXG5cclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdH0gKTtcclxuXHJcblx0fSApO1xyXG5cclxuXHRJZiggbWV0cmljLmVxdWFsKCBpbnQoIDAgKSApLCAoKSA9PiB7XHJcblxyXG5cdFx0c3FkaXN0LmFzc2lnbiggc3FydCggc3FkaXN0ICkgKTtcclxuXHJcblx0fSApO1xyXG5cclxuXHRyZXR1cm4gc3FkaXN0O1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdteF93b3JsZXlfbm9pc2VfdmVjM18wJyxcclxuXHR0eXBlOiAndmVjMycsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICdwJywgdHlwZTogJ3ZlYzInIH0sXHJcblx0XHR7IG5hbWU6ICdqaXR0ZXInLCB0eXBlOiAnZmxvYXQnIH0sXHJcblx0XHR7IG5hbWU6ICdtZXRyaWMnLCB0eXBlOiAnaW50JyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfd29ybGV5X25vaXNlX2Zsb2F0XzEgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgcF9pbW11dGFibGUsIGppdHRlcl9pbW11dGFibGUsIG1ldHJpY19pbW11dGFibGUgXSApID0+IHtcclxuXHJcblx0Y29uc3QgbWV0cmljID0gaW50KCBtZXRyaWNfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBqaXR0ZXIgPSBmbG9hdCggaml0dGVyX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgcCA9IHZlYzMoIHBfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBYID0gaW50KCkudG9WYXIoKSwgWSA9IGludCgpLnRvVmFyKCksIFogPSBpbnQoKS50b1ZhcigpO1xyXG5cdGNvbnN0IGxvY2FscG9zID0gdmVjMyggbXhfZmxvb3JmcmFjKCBwLngsIFggKSwgbXhfZmxvb3JmcmFjKCBwLnksIFkgKSwgbXhfZmxvb3JmcmFjKCBwLnosIFogKSApLnRvVmFyKCk7XHJcblx0Y29uc3Qgc3FkaXN0ID0gZmxvYXQoIDFlNiApLnRvVmFyKCk7XHJcblxyXG5cdExvb3AoIHsgc3RhcnQ6IC0gMSwgZW5kOiBpbnQoIDEgKSwgbmFtZTogJ3gnLCBjb25kaXRpb246ICc8PScgfSwgKCB7IHggfSApID0+IHtcclxuXHJcblx0XHRMb29wKCB7IHN0YXJ0OiAtIDEsIGVuZDogaW50KCAxICksIG5hbWU6ICd5JywgY29uZGl0aW9uOiAnPD0nIH0sICggeyB5IH0gKSA9PiB7XHJcblxyXG5cdFx0XHRMb29wKCB7IHN0YXJ0OiAtIDEsIGVuZDogaW50KCAxICksIG5hbWU6ICd6JywgY29uZGl0aW9uOiAnPD0nIH0sICggeyB6IH0gKSA9PiB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGRpc3QgPSBmbG9hdCggbXhfd29ybGV5X2Rpc3RhbmNlKCBsb2NhbHBvcywgeCwgeSwgeiwgWCwgWSwgWiwgaml0dGVyLCBtZXRyaWMgKSApLnRvVmFyKCk7XHJcblx0XHRcdFx0c3FkaXN0LmFzc2lnbiggbWluKCBzcWRpc3QsIGRpc3QgKSApO1xyXG5cclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdH0gKTtcclxuXHJcblx0fSApO1xyXG5cclxuXHRJZiggbWV0cmljLmVxdWFsKCBpbnQoIDAgKSApLCAoKSA9PiB7XHJcblxyXG5cdFx0c3FkaXN0LmFzc2lnbiggc3FydCggc3FkaXN0ICkgKTtcclxuXHJcblx0fSApO1xyXG5cclxuXHRyZXR1cm4gc3FkaXN0O1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdteF93b3JsZXlfbm9pc2VfZmxvYXRfMScsXHJcblx0dHlwZTogJ2Zsb2F0JyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ3AnLCB0eXBlOiAndmVjMycgfSxcclxuXHRcdHsgbmFtZTogJ2ppdHRlcicsIHR5cGU6ICdmbG9hdCcgfSxcclxuXHRcdHsgbmFtZTogJ21ldHJpYycsIHR5cGU6ICdpbnQnIH1cclxuXHRdXHJcbn0gKTtcclxuXHJcbmV4cG9ydCBjb25zdCBteF93b3JsZXlfbm9pc2VfZmxvYXQgPSAvKkBfX1BVUkVfXyovIG92ZXJsb2FkaW5nRm4oIFsgbXhfd29ybGV5X25vaXNlX2Zsb2F0XzAsIG14X3dvcmxleV9ub2lzZV9mbG9hdF8xIF0gKTtcclxuXHJcbmV4cG9ydCBjb25zdCBteF93b3JsZXlfbm9pc2VfdmVjMl8xID0gLypAX19QVVJFX18qLyBGbiggKCBbIHBfaW1tdXRhYmxlLCBqaXR0ZXJfaW1tdXRhYmxlLCBtZXRyaWNfaW1tdXRhYmxlIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IG1ldHJpYyA9IGludCggbWV0cmljX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3Qgaml0dGVyID0gZmxvYXQoIGppdHRlcl9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHAgPSB2ZWMzKCBwX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgWCA9IGludCgpLnRvVmFyKCksIFkgPSBpbnQoKS50b1ZhcigpLCBaID0gaW50KCkudG9WYXIoKTtcclxuXHRjb25zdCBsb2NhbHBvcyA9IHZlYzMoIG14X2Zsb29yZnJhYyggcC54LCBYICksIG14X2Zsb29yZnJhYyggcC55LCBZICksIG14X2Zsb29yZnJhYyggcC56LCBaICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHNxZGlzdCA9IHZlYzIoIDFlNiwgMWU2ICkudG9WYXIoKTtcclxuXHJcblx0TG9vcCggeyBzdGFydDogLSAxLCBlbmQ6IGludCggMSApLCBuYW1lOiAneCcsIGNvbmRpdGlvbjogJzw9JyB9LCAoIHsgeCB9ICkgPT4ge1xyXG5cclxuXHRcdExvb3AoIHsgc3RhcnQ6IC0gMSwgZW5kOiBpbnQoIDEgKSwgbmFtZTogJ3knLCBjb25kaXRpb246ICc8PScgfSwgKCB7IHkgfSApID0+IHtcclxuXHJcblx0XHRcdExvb3AoIHsgc3RhcnQ6IC0gMSwgZW5kOiBpbnQoIDEgKSwgbmFtZTogJ3onLCBjb25kaXRpb246ICc8PScgfSwgKCB7IHogfSApID0+IHtcclxuXHJcblx0XHRcdFx0Y29uc3QgZGlzdCA9IGZsb2F0KCBteF93b3JsZXlfZGlzdGFuY2UoIGxvY2FscG9zLCB4LCB5LCB6LCBYLCBZLCBaLCBqaXR0ZXIsIG1ldHJpYyApICkudG9WYXIoKTtcclxuXHJcblx0XHRcdFx0SWYoIGRpc3QubGVzc1RoYW4oIHNxZGlzdC54ICksICgpID0+IHtcclxuXHJcblx0XHRcdFx0XHRzcWRpc3QueS5hc3NpZ24oIHNxZGlzdC54ICk7XHJcblx0XHRcdFx0XHRzcWRpc3QueC5hc3NpZ24oIGRpc3QgKTtcclxuXHJcblx0XHRcdFx0fSApLkVsc2VJZiggZGlzdC5sZXNzVGhhbiggc3FkaXN0LnkgKSwgKCkgPT4ge1xyXG5cclxuXHRcdFx0XHRcdHNxZGlzdC55LmFzc2lnbiggZGlzdCApO1xyXG5cclxuXHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0fSApO1xyXG5cclxuXHR9ICk7XHJcblxyXG5cdElmKCBtZXRyaWMuZXF1YWwoIGludCggMCApICksICgpID0+IHtcclxuXHJcblx0XHRzcWRpc3QuYXNzaWduKCBzcXJ0KCBzcWRpc3QgKSApO1xyXG5cclxuXHR9ICk7XHJcblxyXG5cdHJldHVybiBzcWRpc3Q7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ214X3dvcmxleV9ub2lzZV92ZWMyXzEnLFxyXG5cdHR5cGU6ICd2ZWMyJyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ3AnLCB0eXBlOiAndmVjMycgfSxcclxuXHRcdHsgbmFtZTogJ2ppdHRlcicsIHR5cGU6ICdmbG9hdCcgfSxcclxuXHRcdHsgbmFtZTogJ21ldHJpYycsIHR5cGU6ICdpbnQnIH1cclxuXHRdXHJcbn0gKTtcclxuXHJcbmV4cG9ydCBjb25zdCBteF93b3JsZXlfbm9pc2VfdmVjMiA9IC8qQF9fUFVSRV9fKi8gb3ZlcmxvYWRpbmdGbiggWyBteF93b3JsZXlfbm9pc2VfdmVjMl8wLCBteF93b3JsZXlfbm9pc2VfdmVjMl8xIF0gKTtcclxuXHJcbmV4cG9ydCBjb25zdCBteF93b3JsZXlfbm9pc2VfdmVjM18xID0gLypAX19QVVJFX18qLyBGbiggKCBbIHBfaW1tdXRhYmxlLCBqaXR0ZXJfaW1tdXRhYmxlLCBtZXRyaWNfaW1tdXRhYmxlIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IG1ldHJpYyA9IGludCggbWV0cmljX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3Qgaml0dGVyID0gZmxvYXQoIGppdHRlcl9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHAgPSB2ZWMzKCBwX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgWCA9IGludCgpLnRvVmFyKCksIFkgPSBpbnQoKS50b1ZhcigpLCBaID0gaW50KCkudG9WYXIoKTtcclxuXHRjb25zdCBsb2NhbHBvcyA9IHZlYzMoIG14X2Zsb29yZnJhYyggcC54LCBYICksIG14X2Zsb29yZnJhYyggcC55LCBZICksIG14X2Zsb29yZnJhYyggcC56LCBaICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHNxZGlzdCA9IHZlYzMoIDFlNiwgMWU2LCAxZTYgKS50b1ZhcigpO1xyXG5cclxuXHRMb29wKCB7IHN0YXJ0OiAtIDEsIGVuZDogaW50KCAxICksIG5hbWU6ICd4JywgY29uZGl0aW9uOiAnPD0nIH0sICggeyB4IH0gKSA9PiB7XHJcblxyXG5cdFx0TG9vcCggeyBzdGFydDogLSAxLCBlbmQ6IGludCggMSApLCBuYW1lOiAneScsIGNvbmRpdGlvbjogJzw9JyB9LCAoIHsgeSB9ICkgPT4ge1xyXG5cclxuXHRcdFx0TG9vcCggeyBzdGFydDogLSAxLCBlbmQ6IGludCggMSApLCBuYW1lOiAneicsIGNvbmRpdGlvbjogJzw9JyB9LCAoIHsgeiB9ICkgPT4ge1xyXG5cclxuXHRcdFx0XHRjb25zdCBkaXN0ID0gZmxvYXQoIG14X3dvcmxleV9kaXN0YW5jZSggbG9jYWxwb3MsIHgsIHksIHosIFgsIFksIFosIGppdHRlciwgbWV0cmljICkgKS50b1ZhcigpO1xyXG5cclxuXHRcdFx0XHRJZiggZGlzdC5sZXNzVGhhbiggc3FkaXN0LnggKSwgKCkgPT4ge1xyXG5cclxuXHRcdFx0XHRcdHNxZGlzdC56LmFzc2lnbiggc3FkaXN0LnkgKTtcclxuXHRcdFx0XHRcdHNxZGlzdC55LmFzc2lnbiggc3FkaXN0LnggKTtcclxuXHRcdFx0XHRcdHNxZGlzdC54LmFzc2lnbiggZGlzdCApO1xyXG5cclxuXHRcdFx0XHR9ICkuRWxzZUlmKCBkaXN0Lmxlc3NUaGFuKCBzcWRpc3QueSApLCAoKSA9PiB7XHJcblxyXG5cdFx0XHRcdFx0c3FkaXN0LnouYXNzaWduKCBzcWRpc3QueSApO1xyXG5cdFx0XHRcdFx0c3FkaXN0LnkuYXNzaWduKCBkaXN0ICk7XHJcblxyXG5cdFx0XHRcdH0gKS5FbHNlSWYoIGRpc3QubGVzc1RoYW4oIHNxZGlzdC56ICksICgpID0+IHtcclxuXHJcblx0XHRcdFx0XHRzcWRpc3Quei5hc3NpZ24oIGRpc3QgKTtcclxuXHJcblx0XHRcdFx0fSApO1xyXG5cclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdH0gKTtcclxuXHJcblx0fSApO1xyXG5cclxuXHRJZiggbWV0cmljLmVxdWFsKCBpbnQoIDAgKSApLCAoKSA9PiB7XHJcblxyXG5cdFx0c3FkaXN0LmFzc2lnbiggc3FydCggc3FkaXN0ICkgKTtcclxuXHJcblx0fSApO1xyXG5cclxuXHRyZXR1cm4gc3FkaXN0O1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdteF93b3JsZXlfbm9pc2VfdmVjM18xJyxcclxuXHR0eXBlOiAndmVjMycsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICdwJywgdHlwZTogJ3ZlYzMnIH0sXHJcblx0XHR7IG5hbWU6ICdqaXR0ZXInLCB0eXBlOiAnZmxvYXQnIH0sXHJcblx0XHR7IG5hbWU6ICdtZXRyaWMnLCB0eXBlOiAnaW50JyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfd29ybGV5X25vaXNlX3ZlYzMgPSAvKkBfX1BVUkVfXyovIG92ZXJsb2FkaW5nRm4oIFsgbXhfd29ybGV5X25vaXNlX3ZlYzNfMCwgbXhfd29ybGV5X25vaXNlX3ZlYzNfMSBdICk7XHJcbiIsIi8vIFRocmVlLmpzIFRyYW5zcGlsZXJcclxuLy8gaHR0cHM6Ly9naXRodWIuY29tL0FjYWRlbXlTb2Z0d2FyZUZvdW5kYXRpb24vTWF0ZXJpYWxYL2Jsb2IvbWFpbi9saWJyYXJpZXMvc3RkbGliL2dlbmdsc2wvbGliL214X2hzdi5nbHNsXHJcblxyXG5pbXBvcnQgeyBpbnQsIGZsb2F0LCB2ZWMzLCBJZiwgRm4gfSBmcm9tICcuLi8uLi90c2wvVFNMQmFzZS5qcyc7XHJcbmltcG9ydCB7IGFkZCB9IGZyb20gJy4uLy4uL21hdGgvT3BlcmF0b3JOb2RlLmpzJztcclxuaW1wb3J0IHsgZmxvb3IsIHRydW5jLCBtYXgsIG1pbiB9IGZyb20gJy4uLy4uL21hdGgvTWF0aE5vZGUuanMnO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X2hzdnRvcmdiID0gLypAX19QVVJFX18qLyBGbiggKCBbIGhzdiBdICkgPT4ge1xyXG5cclxuXHRjb25zdCBzID0gaHN2Lnk7XHJcblx0Y29uc3QgdiA9IGhzdi56O1xyXG5cclxuXHRjb25zdCByZXN1bHQgPSB2ZWMzKCkudG9WYXIoKTtcclxuXHJcblx0SWYoIHMubGVzc1RoYW4oIDAuMDAwMSApLCAoKSA9PiB7XHJcblxyXG5cdFx0cmVzdWx0LmFzc2lnbiggdmVjMyggdiwgdiwgdiApICk7XHJcblxyXG5cdH0gKS5FbHNlKCAoKSA9PiB7XHJcblxyXG5cdFx0bGV0IGggPSBoc3YueDtcclxuXHRcdGggPSBoLnN1YiggZmxvb3IoIGggKSApLm11bCggNi4wICkudG9WYXIoKTsgLy8gVE9ETzogY2hlY2sgd2hhdCAudG9WYXIoKSBpcyBuZWVkZWQgaW4gbm9kZSBzeXN0ZW0gY2FjaGVcclxuXHRcdGNvbnN0IGhpID0gaW50KCB0cnVuYyggaCApICk7XHJcblx0XHRjb25zdCBmID0gaC5zdWIoIGZsb2F0KCBoaSApICk7XHJcblx0XHRjb25zdCBwID0gdi5tdWwoIHMub25lTWludXMoKSApO1xyXG5cdFx0Y29uc3QgcSA9IHYubXVsKCBzLm11bCggZiApLm9uZU1pbnVzKCkgKTtcclxuXHRcdGNvbnN0IHQgPSB2Lm11bCggcy5tdWwoIGYub25lTWludXMoKSApLm9uZU1pbnVzKCkgKTtcclxuXHJcblx0XHRJZiggaGkuZXF1YWwoIGludCggMCApICksICgpID0+IHtcclxuXHJcblx0XHRcdHJlc3VsdC5hc3NpZ24oIHZlYzMoIHYsIHQsIHAgKSApO1xyXG5cclxuXHRcdH0gKS5FbHNlSWYoIGhpLmVxdWFsKCBpbnQoIDEgKSApLCAoKSA9PiB7XHJcblxyXG5cdFx0XHRyZXN1bHQuYXNzaWduKCB2ZWMzKCBxLCB2LCBwICkgKTtcclxuXHJcblx0XHR9ICkuRWxzZUlmKCBoaS5lcXVhbCggaW50KCAyICkgKSwgKCkgPT4ge1xyXG5cclxuXHRcdFx0cmVzdWx0LmFzc2lnbiggdmVjMyggcCwgdiwgdCApICk7XHJcblxyXG5cdFx0fSApLkVsc2VJZiggaGkuZXF1YWwoIGludCggMyApICksICgpID0+IHtcclxuXHJcblx0XHRcdHJlc3VsdC5hc3NpZ24oIHZlYzMoIHAsIHEsIHYgKSApO1xyXG5cclxuXHRcdH0gKS5FbHNlSWYoIGhpLmVxdWFsKCBpbnQoIDQgKSApLCAoKSA9PiB7XHJcblxyXG5cdFx0XHRyZXN1bHQuYXNzaWduKCB2ZWMzKCB0LCBwLCB2ICkgKTtcclxuXHJcblx0XHR9ICkuRWxzZSggKCkgPT4ge1xyXG5cclxuXHRcdFx0cmVzdWx0LmFzc2lnbiggdmVjMyggdiwgcCwgcSApICk7XHJcblxyXG5cdFx0fSApO1xyXG5cclxuXHR9ICk7XHJcblxyXG5cdHJldHVybiByZXN1bHQ7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ214X2hzdnRvcmdiJyxcclxuXHR0eXBlOiAndmVjMycsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICdoc3YnLCB0eXBlOiAndmVjMycgfVxyXG5cdF1cclxufSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X3JnYnRvaHN2ID0gLypAX19QVVJFX18qLyBGbiggKCBbIGNfaW1tdXRhYmxlIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IGMgPSB2ZWMzKCBjX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgciA9IGZsb2F0KCBjLnggKS50b1ZhcigpO1xyXG5cdGNvbnN0IGcgPSBmbG9hdCggYy55ICkudG9WYXIoKTtcclxuXHRjb25zdCBiID0gZmxvYXQoIGMueiApLnRvVmFyKCk7XHJcblx0Y29uc3QgbWluY29tcCA9IGZsb2F0KCBtaW4oIHIsIG1pbiggZywgYiApICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IG1heGNvbXAgPSBmbG9hdCggbWF4KCByLCBtYXgoIGcsIGIgKSApICkudG9WYXIoKTtcclxuXHRjb25zdCBkZWx0YSA9IGZsb2F0KCBtYXhjb21wLnN1YiggbWluY29tcCApICkudG9WYXIoKTtcclxuXHRjb25zdCBoID0gZmxvYXQoKS50b1ZhcigpLCBzID0gZmxvYXQoKS50b1ZhcigpLCB2ID0gZmxvYXQoKS50b1ZhcigpO1xyXG5cdHYuYXNzaWduKCBtYXhjb21wICk7XHJcblxyXG5cdElmKCBtYXhjb21wLmdyZWF0ZXJUaGFuKCAwLjAgKSwgKCkgPT4ge1xyXG5cclxuXHRcdHMuYXNzaWduKCBkZWx0YS5kaXYoIG1heGNvbXAgKSApO1xyXG5cclxuXHR9ICkuRWxzZSggKCkgPT4ge1xyXG5cclxuXHRcdHMuYXNzaWduKCAwLjAgKTtcclxuXHJcblx0fSApO1xyXG5cclxuXHRJZiggcy5sZXNzVGhhbkVxdWFsKCAwLjAgKSwgKCkgPT4ge1xyXG5cclxuXHRcdGguYXNzaWduKCAwLjAgKTtcclxuXHJcblx0fSApLkVsc2UoICgpID0+IHtcclxuXHJcblx0XHRJZiggci5ncmVhdGVyVGhhbkVxdWFsKCBtYXhjb21wICksICgpID0+IHtcclxuXHJcblx0XHRcdGguYXNzaWduKCBnLnN1YiggYiApLmRpdiggZGVsdGEgKSApO1xyXG5cclxuXHRcdH0gKS5FbHNlSWYoIGcuZ3JlYXRlclRoYW5FcXVhbCggbWF4Y29tcCApLCAoKSA9PiB7XHJcblxyXG5cdFx0XHRoLmFzc2lnbiggYWRkKCAyLjAsIGIuc3ViKCByICkuZGl2KCBkZWx0YSApICkgKTtcclxuXHJcblx0XHR9ICkuRWxzZSggKCkgPT4ge1xyXG5cclxuXHRcdFx0aC5hc3NpZ24oIGFkZCggNC4wLCByLnN1YiggZyApLmRpdiggZGVsdGEgKSApICk7XHJcblxyXG5cdFx0fSApO1xyXG5cclxuXHRcdGgubXVsQXNzaWduKCAxLjAgLyA2LjAgKTtcclxuXHJcblx0XHRJZiggaC5sZXNzVGhhbiggMC4wICksICgpID0+IHtcclxuXHJcblx0XHRcdGguYWRkQXNzaWduKCAxLjAgKTtcclxuXHJcblx0XHR9ICk7XHJcblxyXG5cdH0gKTtcclxuXHJcblx0cmV0dXJuIHZlYzMoIGgsIHMsIHYgKTtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnbXhfcmdidG9oc3YnLFxyXG5cdHR5cGU6ICd2ZWMzJyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ2MnLCB0eXBlOiAndmVjMycgfVxyXG5cdF1cclxufSApO1xyXG4iLCIvLyBUaHJlZS5qcyBUcmFuc3BpbGVyXHJcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9BY2FkZW15U29mdHdhcmVGb3VuZGF0aW9uL01hdGVyaWFsWC9ibG9iL21haW4vbGlicmFyaWVzL3N0ZGxpYi9nZW5nbHNsL2xpYi9teF90cmFuc2Zvcm1fY29sb3IuZ2xzbFxyXG5cclxuaW1wb3J0IHsgYnZlYzMsIHZlYzMsIEZuIH0gZnJvbSAnLi4vLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5pbXBvcnQgeyBncmVhdGVyVGhhbiB9IGZyb20gJy4uLy4uL21hdGgvT3BlcmF0b3JOb2RlLmpzJztcclxuaW1wb3J0IHsgbWF4LCBwb3csIG1peCB9IGZyb20gJy4uLy4uL21hdGgvTWF0aE5vZGUuanMnO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X3NyZ2JfdGV4dHVyZV90b19saW5fcmVjNzA5ID0gLypAX19QVVJFX18qLyBGbiggKCBbIGNvbG9yX2ltbXV0YWJsZSBdICkgPT4ge1xyXG5cclxuXHRjb25zdCBjb2xvciA9IHZlYzMoIGNvbG9yX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgaXNBYm92ZSA9IGJ2ZWMzKCBncmVhdGVyVGhhbiggY29sb3IsIHZlYzMoIDAuMDQwNDUgKSApICkudG9WYXIoKTtcclxuXHRjb25zdCBsaW5TZWcgPSB2ZWMzKCBjb2xvci5kaXYoIDEyLjkyICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHBvd1NlZyA9IHZlYzMoIHBvdyggbWF4KCBjb2xvci5hZGQoIHZlYzMoIDAuMDU1ICkgKSwgdmVjMyggMC4wICkgKS5kaXYoIDEuMDU1ICksIHZlYzMoIDIuNCApICkgKS50b1ZhcigpO1xyXG5cclxuXHRyZXR1cm4gbWl4KCBsaW5TZWcsIHBvd1NlZywgaXNBYm92ZSApO1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdteF9zcmdiX3RleHR1cmVfdG9fbGluX3JlYzcwOScsXHJcblx0dHlwZTogJ3ZlYzMnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAnY29sb3InLCB0eXBlOiAndmVjMycgfVxyXG5cdF1cclxufSApO1xyXG4iLCJpbXBvcnQge1xyXG5cdG14X3Blcmxpbl9ub2lzZV9mbG9hdCwgbXhfcGVybGluX25vaXNlX3ZlYzMsXHJcblx0bXhfd29ybGV5X25vaXNlX2Zsb2F0IGFzIHdvcmxleV9ub2lzZV9mbG9hdCwgbXhfd29ybGV5X25vaXNlX3ZlYzIgYXMgd29ybGV5X25vaXNlX3ZlYzIsIG14X3dvcmxleV9ub2lzZV92ZWMzIGFzIHdvcmxleV9ub2lzZV92ZWMzLFxyXG5cdG14X2NlbGxfbm9pc2VfZmxvYXQgYXMgY2VsbF9ub2lzZV9mbG9hdCxcclxuXHRteF9mcmFjdGFsX25vaXNlX2Zsb2F0IGFzIGZyYWN0YWxfbm9pc2VfZmxvYXQsIG14X2ZyYWN0YWxfbm9pc2VfdmVjMiBhcyBmcmFjdGFsX25vaXNlX3ZlYzIsIG14X2ZyYWN0YWxfbm9pc2VfdmVjMyBhcyBmcmFjdGFsX25vaXNlX3ZlYzMsIG14X2ZyYWN0YWxfbm9pc2VfdmVjNCBhcyBmcmFjdGFsX25vaXNlX3ZlYzRcclxufSBmcm9tICcuL2xpYi9teF9ub2lzZS5qcyc7XHJcbmltcG9ydCB7IG14X2hzdnRvcmdiLCBteF9yZ2J0b2hzdiB9IGZyb20gJy4vbGliL214X2hzdi5qcyc7XHJcbmltcG9ydCB7IG14X3NyZ2JfdGV4dHVyZV90b19saW5fcmVjNzA5IH0gZnJvbSAnLi9saWIvbXhfdHJhbnNmb3JtX2NvbG9yLmpzJztcclxuaW1wb3J0IHsgbWl4LCBzbW9vdGhzdGVwIH0gZnJvbSAnLi4vbWF0aC9NYXRoTm9kZS5qcyc7XHJcbmltcG9ydCB7IHV2IH0gZnJvbSAnLi4vYWNjZXNzb3JzL1VWLmpzJztcclxuaW1wb3J0IHsgZmxvYXQsIHZlYzIsIHZlYzQsIGludCB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbmV4cG9ydCBjb25zdCBteF9hYXN0ZXAgPSAoIHRocmVzaG9sZCwgdmFsdWUgKSA9PiB7XHJcblxyXG5cdHRocmVzaG9sZCA9IGZsb2F0KCB0aHJlc2hvbGQgKTtcclxuXHR2YWx1ZSA9IGZsb2F0KCB2YWx1ZSApO1xyXG5cclxuXHRjb25zdCBhZndpZHRoID0gdmVjMiggdmFsdWUuZEZkeCgpLCB2YWx1ZS5kRmR5KCkgKS5sZW5ndGgoKS5tdWwoIDAuNzA3MTA2NzgxMTg2NTQ3NTcgKTtcclxuXHJcblx0cmV0dXJuIHNtb290aHN0ZXAoIHRocmVzaG9sZC5zdWIoIGFmd2lkdGggKSwgdGhyZXNob2xkLmFkZCggYWZ3aWR0aCApLCB2YWx1ZSApO1xyXG5cclxufTtcclxuXHJcbmNvbnN0IF9yYW1wID0gKCBhLCBiLCB1diwgcCApID0+IG1peCggYSwgYiwgdXZbIHAgXS5jbGFtcCgpICk7XHJcbmV4cG9ydCBjb25zdCBteF9yYW1wbHIgPSAoIHZhbHVlbCwgdmFsdWVyLCB0ZXhjb29yZCA9IHV2KCkgKSA9PiBfcmFtcCggdmFsdWVsLCB2YWx1ZXIsIHRleGNvb3JkLCAneCcgKTtcclxuZXhwb3J0IGNvbnN0IG14X3JhbXB0YiA9ICggdmFsdWV0LCB2YWx1ZWIsIHRleGNvb3JkID0gdXYoKSApID0+IF9yYW1wKCB2YWx1ZXQsIHZhbHVlYiwgdGV4Y29vcmQsICd5JyApO1xyXG5cclxuY29uc3QgX3NwbGl0ID0gKCBhLCBiLCBjZW50ZXIsIHV2LCBwICkgPT4gbWl4KCBhLCBiLCBteF9hYXN0ZXAoIGNlbnRlciwgdXZbIHAgXSApICk7XHJcbmV4cG9ydCBjb25zdCBteF9zcGxpdGxyID0gKCB2YWx1ZWwsIHZhbHVlciwgY2VudGVyLCB0ZXhjb29yZCA9IHV2KCkgKSA9PiBfc3BsaXQoIHZhbHVlbCwgdmFsdWVyLCBjZW50ZXIsIHRleGNvb3JkLCAneCcgKTtcclxuZXhwb3J0IGNvbnN0IG14X3NwbGl0dGIgPSAoIHZhbHVldCwgdmFsdWViLCBjZW50ZXIsIHRleGNvb3JkID0gdXYoKSApID0+IF9zcGxpdCggdmFsdWV0LCB2YWx1ZWIsIGNlbnRlciwgdGV4Y29vcmQsICd5JyApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X3RyYW5zZm9ybV91diA9ICggdXZfc2NhbGUgPSAxLCB1dl9vZmZzZXQgPSAwLCB1dl9nZW8gPSB1digpICkgPT4gdXZfZ2VvLm11bCggdXZfc2NhbGUgKS5hZGQoIHV2X29mZnNldCApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X3NhZmVwb3dlciA9ICggaW4xLCBpbjIgPSAxICkgPT4ge1xyXG5cclxuXHRpbjEgPSBmbG9hdCggaW4xICk7XHJcblxyXG5cdHJldHVybiBpbjEuYWJzKCkucG93KCBpbjIgKS5tdWwoIGluMS5zaWduKCkgKTtcclxuXHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgbXhfY29udHJhc3QgPSAoIGlucHV0LCBhbW91bnQgPSAxLCBwaXZvdCA9IC41ICkgPT4gZmxvYXQoIGlucHV0ICkuc3ViKCBwaXZvdCApLm11bCggYW1vdW50ICkuYWRkKCBwaXZvdCApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X25vaXNlX2Zsb2F0ID0gKCB0ZXhjb29yZCA9IHV2KCksIGFtcGxpdHVkZSA9IDEsIHBpdm90ID0gMCApID0+IG14X3Blcmxpbl9ub2lzZV9mbG9hdCggdGV4Y29vcmQuY29udmVydCggJ3ZlYzJ8dmVjMycgKSApLm11bCggYW1wbGl0dWRlICkuYWRkKCBwaXZvdCApO1xyXG4vL2V4cG9ydCBjb25zdCBteF9ub2lzZV92ZWMyID0gKCB0ZXhjb29yZCA9IHV2KCksIGFtcGxpdHVkZSA9IDEsIHBpdm90ID0gMCApID0+IG14X3Blcmxpbl9ub2lzZV92ZWMzKCB0ZXhjb29yZC5jb252ZXJ0KCAndmVjMnx2ZWMzJyApICkubXVsKCBhbXBsaXR1ZGUgKS5hZGQoIHBpdm90ICk7XHJcbmV4cG9ydCBjb25zdCBteF9ub2lzZV92ZWMzID0gKCB0ZXhjb29yZCA9IHV2KCksIGFtcGxpdHVkZSA9IDEsIHBpdm90ID0gMCApID0+IG14X3Blcmxpbl9ub2lzZV92ZWMzKCB0ZXhjb29yZC5jb252ZXJ0KCAndmVjMnx2ZWMzJyApICkubXVsKCBhbXBsaXR1ZGUgKS5hZGQoIHBpdm90ICk7XHJcbmV4cG9ydCBjb25zdCBteF9ub2lzZV92ZWM0ID0gKCB0ZXhjb29yZCA9IHV2KCksIGFtcGxpdHVkZSA9IDEsIHBpdm90ID0gMCApID0+IHtcclxuXHJcblx0dGV4Y29vcmQgPSB0ZXhjb29yZC5jb252ZXJ0KCAndmVjMnx2ZWMzJyApOyAvLyBvdmVybG9hZGluZyB0eXBlXHJcblxyXG5cdGNvbnN0IG5vaXNlX3ZlYzQgPSB2ZWM0KCBteF9wZXJsaW5fbm9pc2VfdmVjMyggdGV4Y29vcmQgKSwgbXhfcGVybGluX25vaXNlX2Zsb2F0KCB0ZXhjb29yZC5hZGQoIHZlYzIoIDE5LCA3MyApICkgKSApO1xyXG5cclxuXHRyZXR1cm4gbm9pc2VfdmVjNC5tdWwoIGFtcGxpdHVkZSApLmFkZCggcGl2b3QgKTtcclxuXHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgbXhfd29ybGV5X25vaXNlX2Zsb2F0ID0gKCB0ZXhjb29yZCA9IHV2KCksIGppdHRlciA9IDEgKSA9PiB3b3JsZXlfbm9pc2VfZmxvYXQoIHRleGNvb3JkLmNvbnZlcnQoICd2ZWMyfHZlYzMnICksIGppdHRlciwgaW50KCAxICkgKTtcclxuZXhwb3J0IGNvbnN0IG14X3dvcmxleV9ub2lzZV92ZWMyID0gKCB0ZXhjb29yZCA9IHV2KCksIGppdHRlciA9IDEgKSA9PiB3b3JsZXlfbm9pc2VfdmVjMiggdGV4Y29vcmQuY29udmVydCggJ3ZlYzJ8dmVjMycgKSwgaml0dGVyLCBpbnQoIDEgKSApO1xyXG5leHBvcnQgY29uc3QgbXhfd29ybGV5X25vaXNlX3ZlYzMgPSAoIHRleGNvb3JkID0gdXYoKSwgaml0dGVyID0gMSApID0+IHdvcmxleV9ub2lzZV92ZWMzKCB0ZXhjb29yZC5jb252ZXJ0KCAndmVjMnx2ZWMzJyApLCBqaXR0ZXIsIGludCggMSApICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfY2VsbF9ub2lzZV9mbG9hdCA9ICggdGV4Y29vcmQgPSB1digpICkgPT4gY2VsbF9ub2lzZV9mbG9hdCggdGV4Y29vcmQuY29udmVydCggJ3ZlYzJ8dmVjMycgKSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X2ZyYWN0YWxfbm9pc2VfZmxvYXQgPSAoIHBvc2l0aW9uID0gdXYoKSwgb2N0YXZlcyA9IDMsIGxhY3VuYXJpdHkgPSAyLCBkaW1pbmlzaCA9IC41LCBhbXBsaXR1ZGUgPSAxICkgPT4gZnJhY3RhbF9ub2lzZV9mbG9hdCggcG9zaXRpb24sIGludCggb2N0YXZlcyApLCBsYWN1bmFyaXR5LCBkaW1pbmlzaCApLm11bCggYW1wbGl0dWRlICk7XHJcbmV4cG9ydCBjb25zdCBteF9mcmFjdGFsX25vaXNlX3ZlYzIgPSAoIHBvc2l0aW9uID0gdXYoKSwgb2N0YXZlcyA9IDMsIGxhY3VuYXJpdHkgPSAyLCBkaW1pbmlzaCA9IC41LCBhbXBsaXR1ZGUgPSAxICkgPT4gZnJhY3RhbF9ub2lzZV92ZWMyKCBwb3NpdGlvbiwgaW50KCBvY3RhdmVzICksIGxhY3VuYXJpdHksIGRpbWluaXNoICkubXVsKCBhbXBsaXR1ZGUgKTtcclxuZXhwb3J0IGNvbnN0IG14X2ZyYWN0YWxfbm9pc2VfdmVjMyA9ICggcG9zaXRpb24gPSB1digpLCBvY3RhdmVzID0gMywgbGFjdW5hcml0eSA9IDIsIGRpbWluaXNoID0gLjUsIGFtcGxpdHVkZSA9IDEgKSA9PiBmcmFjdGFsX25vaXNlX3ZlYzMoIHBvc2l0aW9uLCBpbnQoIG9jdGF2ZXMgKSwgbGFjdW5hcml0eSwgZGltaW5pc2ggKS5tdWwoIGFtcGxpdHVkZSApO1xyXG5leHBvcnQgY29uc3QgbXhfZnJhY3RhbF9ub2lzZV92ZWM0ID0gKCBwb3NpdGlvbiA9IHV2KCksIG9jdGF2ZXMgPSAzLCBsYWN1bmFyaXR5ID0gMiwgZGltaW5pc2ggPSAuNSwgYW1wbGl0dWRlID0gMSApID0+IGZyYWN0YWxfbm9pc2VfdmVjNCggcG9zaXRpb24sIGludCggb2N0YXZlcyApLCBsYWN1bmFyaXR5LCBkaW1pbmlzaCApLm11bCggYW1wbGl0dWRlICk7XHJcblxyXG5leHBvcnQgeyBteF9oc3Z0b3JnYiwgbXhfcmdidG9oc3YsIG14X3NyZ2JfdGV4dHVyZV90b19saW5fcmVjNzA5IH07XHJcbiIsImltcG9ydCB7IHBvc2l0aW9uV29ybGQgfSBmcm9tICcuLi8uLi9hY2Nlc3NvcnMvUG9zaXRpb24uanMnO1xyXG5pbXBvcnQgeyBmbG9hdCwgRm4sIG1pbiwgbm9ybWFsaXplLCBzdWIsIHZlYzMgfSBmcm9tICcuLi8uLi90c2wvVFNMQmFzZS5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBjb21wdXRlcyBhIHBhcmFsbGF4IGNvcnJlY3RlZCBub3JtYWwgd2hpY2ggaXMgdXNlZCBmb3IgYm94LXByb2plY3RlZCBjdWJlIG1hcHBpbmcgKEJQQ0VNKS5cclxuICpcclxuICogUmVmZXJlbmNlOiB7QGxpbmsgaHR0cHM6Ly9kZXZsb2ctbWFydGluc2guYmxvZ3Nwb3QuY29tLzIwMTEvMDkvYm94LXByb2plY3RlZC1jdWJlLWVudmlyb25tZW50LW1hcHBpbmcuaHRtbH1cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgdXZOb2RlID0gZ2V0UGFyYWxsYXhDb3JyZWN0Tm9ybWFsKCByZWZsZWN0VmVjdG9yLCB2ZWMzKCAyMDAsIDEwMCwgMTAwICksIHZlYzMoIDAsIC0gNTAsIDAgKSApO1xyXG4gKiBtYXRlcmlhbC5lbnZOb2RlID0gcG1yZW1UZXh0dXJlKCByZW5kZXJUYXJnZXQudGV4dHVyZSwgdXZOb2RlICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGU8dmVjMz59IG5vcm1hbCAtIFRoZSBub3JtYWwgdG8gY29ycmVjdC5cclxuICogQHBhcmFtIHtOb2RlPHZlYzM+fSBjdWJlU2l6ZSAtIFRoZSBjdWJlIHNpemUgc2hvdWxkIHJlZmxlY3QgdGhlIHNpemUgb2YgdGhlIGVudmlyb25tZW50IChCUENFTSBpcyB1c3VhbGx5IGFwcGxpZWQgaW4gY2xvc2VkIGVudmlyb25tZW50cyBsaWtlIHJvb21zKS5cclxuICogQHBhcmFtIHtOb2RlPHZlYzM+fSBjdWJlUG9zIC0gVGhlIGN1YmUgcG9zaXRpb24uXHJcbiAqIEByZXR1cm4ge05vZGU8dmVjMz59IFRoZSBwYXJhbGxheCBjb3JyZWN0ZWQgbm9ybWFsLlxyXG4gKi9cclxuY29uc3QgZ2V0UGFyYWxsYXhDb3JyZWN0Tm9ybWFsID0gLypAX19QVVJFX18qLyBGbiggKCBbIG5vcm1hbCwgY3ViZVNpemUsIGN1YmVQb3MgXSApID0+IHtcclxuXHJcblx0Y29uc3QgbkRpciA9IG5vcm1hbGl6ZSggbm9ybWFsICkudG9WYXIoKTtcclxuXHRjb25zdCByYm1heCA9IHN1YiggZmxvYXQoIDAuNSApLm11bCggY3ViZVNpemUuc3ViKCBjdWJlUG9zICkgKSwgcG9zaXRpb25Xb3JsZCApLmRpdiggbkRpciApLnRvVmFyKCk7XHJcblx0Y29uc3QgcmJtaW4gPSBzdWIoIGZsb2F0KCAtIDAuNSApLm11bCggY3ViZVNpemUuc3ViKCBjdWJlUG9zICkgKSwgcG9zaXRpb25Xb3JsZCApLmRpdiggbkRpciApLnRvVmFyKCk7XHJcblx0Y29uc3QgcmJtaW5tYXggPSB2ZWMzKCkudG9WYXIoKTtcclxuXHRyYm1pbm1heC54ID0gbkRpci54LmdyZWF0ZXJUaGFuKCBmbG9hdCggMCApICkuc2VsZWN0KCByYm1heC54LCByYm1pbi54ICk7XHJcblx0cmJtaW5tYXgueSA9IG5EaXIueS5ncmVhdGVyVGhhbiggZmxvYXQoIDAgKSApLnNlbGVjdCggcmJtYXgueSwgcmJtaW4ueSApO1xyXG5cdHJibWlubWF4LnogPSBuRGlyLnouZ3JlYXRlclRoYW4oIGZsb2F0KCAwICkgKS5zZWxlY3QoIHJibWF4LnosIHJibWluLnogKTtcclxuXHJcblx0Y29uc3QgY29ycmVjdGlvbiA9IG1pbiggbWluKCByYm1pbm1heC54LCByYm1pbm1heC55ICksIHJibWlubWF4LnogKS50b1ZhcigpO1xyXG5cdGNvbnN0IGJveEludGVyc2VjdGlvbiA9IHBvc2l0aW9uV29ybGQuYWRkKCBuRGlyLm11bCggY29ycmVjdGlvbiApICkudG9WYXIoKTtcclxuXHRyZXR1cm4gYm94SW50ZXJzZWN0aW9uLnN1YiggY3ViZVBvcyApO1xyXG5cclxufSApO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZ2V0UGFyYWxsYXhDb3JyZWN0Tm9ybWFsO1xyXG4iLCJpbXBvcnQgeyBGbiwgbXVsIH0gZnJvbSAnLi4vLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5cclxuY29uc3QgZ2V0U2hJcnJhZGlhbmNlQXQgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgbm9ybWFsLCBzaENvZWZmaWNpZW50cyBdICkgPT4ge1xyXG5cclxuXHQvLyBub3JtYWwgaXMgYXNzdW1lZCB0byBoYXZlIHVuaXQgbGVuZ3RoXHJcblxyXG5cdGNvbnN0IHggPSBub3JtYWwueCwgeSA9IG5vcm1hbC55LCB6ID0gbm9ybWFsLno7XHJcblxyXG5cdC8vIGJhbmQgMFxyXG5cdGxldCByZXN1bHQgPSBzaENvZWZmaWNpZW50cy5lbGVtZW50KCAwICkubXVsKCAwLjg4NjIyNyApO1xyXG5cclxuXHQvLyBiYW5kIDFcclxuXHRyZXN1bHQgPSByZXN1bHQuYWRkKCBzaENvZWZmaWNpZW50cy5lbGVtZW50KCAxICkubXVsKCAyLjAgKiAwLjUxMTY2NCApLm11bCggeSApICk7XHJcblx0cmVzdWx0ID0gcmVzdWx0LmFkZCggc2hDb2VmZmljaWVudHMuZWxlbWVudCggMiApLm11bCggMi4wICogMC41MTE2NjQgKS5tdWwoIHogKSApO1xyXG5cdHJlc3VsdCA9IHJlc3VsdC5hZGQoIHNoQ29lZmZpY2llbnRzLmVsZW1lbnQoIDMgKS5tdWwoIDIuMCAqIDAuNTExNjY0ICkubXVsKCB4ICkgKTtcclxuXHJcblx0Ly8gYmFuZCAyXHJcblx0cmVzdWx0ID0gcmVzdWx0LmFkZCggc2hDb2VmZmljaWVudHMuZWxlbWVudCggNCApLm11bCggMi4wICogMC40MjkwNDMgKS5tdWwoIHggKS5tdWwoIHkgKSApO1xyXG5cdHJlc3VsdCA9IHJlc3VsdC5hZGQoIHNoQ29lZmZpY2llbnRzLmVsZW1lbnQoIDUgKS5tdWwoIDIuMCAqIDAuNDI5MDQzICkubXVsKCB5ICkubXVsKCB6ICkgKTtcclxuXHRyZXN1bHQgPSByZXN1bHQuYWRkKCBzaENvZWZmaWNpZW50cy5lbGVtZW50KCA2ICkubXVsKCB6Lm11bCggeiApLm11bCggMC43NDMxMjUgKS5zdWIoIDAuMjQ3NzA4ICkgKSApO1xyXG5cdHJlc3VsdCA9IHJlc3VsdC5hZGQoIHNoQ29lZmZpY2llbnRzLmVsZW1lbnQoIDcgKS5tdWwoIDIuMCAqIDAuNDI5MDQzICkubXVsKCB4ICkubXVsKCB6ICkgKTtcclxuXHRyZXN1bHQgPSByZXN1bHQuYWRkKCBzaENvZWZmaWNpZW50cy5lbGVtZW50KCA4ICkubXVsKCAwLjQyOTA0MyApLm11bCggbXVsKCB4LCB4ICkuc3ViKCBtdWwoIHksIHkgKSApICkgKTtcclxuXHJcblx0cmV0dXJuIHJlc3VsdDtcclxuXHJcbn0gKTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGdldFNoSXJyYWRpYW5jZUF0O1xyXG4iLCIvLyBjb25zdGFudHNcclxuZXhwb3J0ICogZnJvbSAnLi9jb3JlL2NvbnN0YW50cy5qcyc7XHJcblxyXG4vLyBjb3JlXHJcbmV4cG9ydCAqIGZyb20gJy4vY29yZS9Bc3NpZ25Ob2RlLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi9jb3JlL0F0dHJpYnV0ZU5vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2NvcmUvQnlwYXNzTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vY29yZS9DYWNoZU5vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2NvcmUvQ29udGV4dE5vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2NvcmUvSW5kZXhOb2RlLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi9jb3JlL1BhcmFtZXRlck5vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2NvcmUvUHJvcGVydHlOb2RlLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi9jb3JlL1N0YWNrTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vY29yZS9TdHJ1Y3ROb2RlLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi9jb3JlL1VuaWZvcm1Hcm91cE5vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2NvcmUvVW5pZm9ybU5vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2NvcmUvVmFyeWluZ05vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2NvcmUvT3V0cHV0U3RydWN0Tm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vY29yZS9NUlROb2RlLmpzJztcclxuXHJcbi8vIG1hdGhcclxuZXhwb3J0ICogZnJvbSAnLi9tYXRoL0hhc2guanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL21hdGgvTWF0aFV0aWxzLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi9tYXRoL1RyaU5vaXNlM0QuanMnO1xyXG5cclxuLy8gdXRpbHNcclxuZXhwb3J0ICogZnJvbSAnLi91dGlscy9FcXVpcmVjdFVWTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvRnVuY3Rpb25PdmVybG9hZGluZ05vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL0xvb3BOb2RlLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi91dGlscy9NYXRjYXBVVk5vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL01heE1pcExldmVsTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvT3NjaWxsYXRvcnMuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL1BhY2tpbmcuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL1JlbWFwTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvVVZVdGlscy5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvU3ByaXRlVXRpbHMuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL1ZpZXdwb3J0VXRpbHMuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL1JvdGF0ZU5vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL1Nwcml0ZVNoZWV0VVZOb2RlLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi91dGlscy9UaW1lci5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvVHJpcGxhbmFyVGV4dHVyZXNOb2RlLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi91dGlscy9SZWZsZWN0b3JOb2RlLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi91dGlscy9SVFROb2RlLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi91dGlscy9Qb3N0UHJvY2Vzc2luZ1V0aWxzLmpzJztcclxuXHJcbi8vIHRocmVlLmpzIHNoYWRpbmcgbGFuZ3VhZ2VcclxuZXhwb3J0ICogZnJvbSAnLi90c2wvVFNMQmFzZS5qcyc7XHJcblxyXG4vLyBhY2Nlc3NvcnNcclxuZXhwb3J0ICogZnJvbSAnLi9hY2Nlc3NvcnMvQWNjZXNzb3JzVXRpbHMuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2FjY2Vzc29ycy9BcnJheXMuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2FjY2Vzc29ycy9Vbmlmb3JtQXJyYXlOb2RlLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi9hY2Nlc3NvcnMvQml0YW5nZW50LmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi9hY2Nlc3NvcnMvQnVmZmVyQXR0cmlidXRlTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vYWNjZXNzb3JzL0J1ZmZlck5vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2FjY2Vzc29ycy9DYW1lcmEuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2FjY2Vzc29ycy9WZXJ0ZXhDb2xvck5vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2FjY2Vzc29ycy9DdWJlVGV4dHVyZU5vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2FjY2Vzc29ycy9JbnN0YW5jZU5vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2FjY2Vzc29ycy9JbnN0YW5jZWRNZXNoTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vYWNjZXNzb3JzL0JhdGNoTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vYWNjZXNzb3JzL01hdGVyaWFsTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vYWNjZXNzb3JzL01hdGVyaWFsUHJvcGVydGllcy5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vYWNjZXNzb3JzL01hdGVyaWFsUmVmZXJlbmNlTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vYWNjZXNzb3JzL1JlbmRlcmVyUmVmZXJlbmNlTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vYWNjZXNzb3JzL01vcnBoTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vYWNjZXNzb3JzL1RleHR1cmVCaWN1YmljLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi9hY2Nlc3NvcnMvTW9kZWxOb2RlLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi9hY2Nlc3NvcnMvTW9kZWxWaWV3UHJvamVjdGlvbk5vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2FjY2Vzc29ycy9Ob3JtYWwuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2FjY2Vzc29ycy9PYmplY3QzRE5vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2FjY2Vzc29ycy9Qb2ludFVWTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vYWNjZXNzb3JzL1Bvc2l0aW9uLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi9hY2Nlc3NvcnMvUmVmZXJlbmNlTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vYWNjZXNzb3JzL1JlZmxlY3RWZWN0b3IuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2FjY2Vzc29ycy9Ta2lubmluZ05vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2FjY2Vzc29ycy9TY2VuZU5vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2FjY2Vzc29ycy9TdG9yYWdlQnVmZmVyTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vYWNjZXNzb3JzL1RhbmdlbnQuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2FjY2Vzc29ycy9UZXh0dXJlTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vYWNjZXNzb3JzL1RleHR1cmVTaXplTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vYWNjZXNzb3JzL1N0b3JhZ2VUZXh0dXJlTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vYWNjZXNzb3JzL1RleHR1cmUzRE5vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2FjY2Vzc29ycy9VVi5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vYWNjZXNzb3JzL1VzZXJEYXRhTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vYWNjZXNzb3JzL1ZlbG9jaXR5Tm9kZS5qcyc7XHJcblxyXG4vLyBkaXNwbGF5XHJcbmV4cG9ydCAqIGZyb20gJy4vZGlzcGxheS9CbGVuZE1vZGVzLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi9kaXNwbGF5L0J1bXBNYXBOb2RlLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi9kaXNwbGF5L0NvbG9yQWRqdXN0bWVudC5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vZGlzcGxheS9Db2xvclNwYWNlTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vZGlzcGxheS9Gcm9udEZhY2luZ05vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2Rpc3BsYXkvTm9ybWFsTWFwTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vZGlzcGxheS9Qb3N0ZXJpemVOb2RlLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi9kaXNwbGF5L1RvbmVNYXBwaW5nTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vZGlzcGxheS9TY3JlZW5Ob2RlLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi9kaXNwbGF5L1ZpZXdwb3J0VGV4dHVyZU5vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2Rpc3BsYXkvVmlld3BvcnRTaGFyZWRUZXh0dXJlTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vZGlzcGxheS9WaWV3cG9ydERlcHRoVGV4dHVyZU5vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2Rpc3BsYXkvVmlld3BvcnREZXB0aE5vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2Rpc3BsYXkvUmVuZGVyT3V0cHV0Tm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vZGlzcGxheS9Ub29uT3V0bGluZVBhc3NOb2RlLmpzJztcclxuXHJcbmV4cG9ydCAqIGZyb20gJy4vZGlzcGxheS9QYXNzTm9kZS5qcyc7XHJcblxyXG5leHBvcnQgKiBmcm9tICcuL2Rpc3BsYXkvQ29sb3JTcGFjZUZ1bmN0aW9ucy5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vZGlzcGxheS9Ub25lTWFwcGluZ0Z1bmN0aW9ucy5qcyc7XHJcblxyXG4vLyBjb2RlXHJcbmV4cG9ydCAqIGZyb20gJy4vY29kZS9FeHByZXNzaW9uTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vY29kZS9Db2RlTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vY29kZS9GdW5jdGlvbkNhbGxOb2RlLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi9jb2RlL0Z1bmN0aW9uTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vY29kZS9TY3JpcHRhYmxlTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vY29kZS9TY3JpcHRhYmxlVmFsdWVOb2RlLmpzJztcclxuXHJcbi8vIGZvZ1xyXG5leHBvcnQgKiBmcm9tICcuL2ZvZy9Gb2cuanMnO1xyXG5cclxuLy8gZ2VvbWV0cnlcclxuZXhwb3J0ICogZnJvbSAnLi9nZW9tZXRyeS9SYW5nZU5vZGUuanMnO1xyXG5cclxuLy8gZ3BncHVcclxuZXhwb3J0ICogZnJvbSAnLi9ncGdwdS9Db21wdXRlTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vZ3BncHUvQ29tcHV0ZUJ1aWx0aW5Ob2RlLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi9ncGdwdS9CYXJyaWVyTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vZ3BncHUvV29ya2dyb3VwSW5mb05vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2dwZ3B1L0F0b21pY0Z1bmN0aW9uTm9kZS5qcyc7XHJcblxyXG4vLyBsaWdodGluZ1xyXG5leHBvcnQgKiBmcm9tICcuL2FjY2Vzc29ycy9MaWdodHMuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpZ2h0aW5nL0xpZ2h0c05vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpZ2h0aW5nL0xpZ2h0aW5nQ29udGV4dE5vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpZ2h0aW5nL1NoYWRvd0Jhc2VOb2RlLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWdodGluZy9TaGFkb3dOb2RlLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWdodGluZy9Qb2ludFNoYWRvd05vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpZ2h0aW5nL1BvaW50TGlnaHROb2RlLmpzJztcclxuXHJcbi8vIHBtcmVtXHJcbmV4cG9ydCAqIGZyb20gJy4vcG1yZW0vUE1SRU1Ob2RlLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi9wbXJlbS9QTVJFTVV0aWxzLmpzJztcclxuXHJcbi8vIHByb2NlZHVyYWxcclxuZXhwb3J0ICogZnJvbSAnLi9wcm9jZWR1cmFsL0NoZWNrZXIuanMnO1xyXG5cclxuLy8gc2hhcGVzXHJcbmV4cG9ydCAqIGZyb20gJy4vc2hhcGVzL1NoYXBlcy5qcyc7XHJcblxyXG4vLyBtYXRlcmlhbFhcclxuZXhwb3J0ICogZnJvbSAnLi9tYXRlcmlhbHgvTWF0ZXJpYWxYTm9kZXMuanMnO1xyXG5cclxuLy8gZnVuY3Rpb25zXHJcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQlJERl9HR1ggfSBmcm9tICcuL2Z1bmN0aW9ucy9CU0RGL0JSREZfR0dYLmpzJztcclxuZXhwb3J0IHsgZGVmYXVsdCBhcyBCUkRGX0xhbWJlcnQgfSBmcm9tICcuL2Z1bmN0aW9ucy9CU0RGL0JSREZfTGFtYmVydC5qcyc7XHJcbmV4cG9ydCB7IGRlZmF1bHQgYXMgRF9HR1ggfSBmcm9tICcuL2Z1bmN0aW9ucy9CU0RGL0RfR0dYLmpzJztcclxuZXhwb3J0IHsgZGVmYXVsdCBhcyBERkdBcHByb3ggfSBmcm9tICcuL2Z1bmN0aW9ucy9CU0RGL0RGR0FwcHJveC5qcyc7XHJcbmV4cG9ydCB7IGRlZmF1bHQgYXMgRl9TY2hsaWNrIH0gZnJvbSAnLi9mdW5jdGlvbnMvQlNERi9GX1NjaGxpY2suanMnO1xyXG5leHBvcnQgeyBkZWZhdWx0IGFzIFNjaGxpY2tfdG9fRjAgfSBmcm9tICcuL2Z1bmN0aW9ucy9CU0RGL1NjaGxpY2tfdG9fRjAuanMnO1xyXG5leHBvcnQgeyBkZWZhdWx0IGFzIFZfR0dYX1NtaXRoQ29ycmVsYXRlZCB9IGZyb20gJy4vZnVuY3Rpb25zL0JTREYvVl9HR1hfU21pdGhDb3JyZWxhdGVkLmpzJztcclxuXHJcbmV4cG9ydCAqIGZyb20gJy4vbGlnaHRpbmcvTGlnaHRVdGlscy5qcyc7XHJcblxyXG5leHBvcnQgeyBkZWZhdWx0IGFzIGdldEdlb21ldHJ5Um91Z2huZXNzIH0gZnJvbSAnLi9mdW5jdGlvbnMvbWF0ZXJpYWwvZ2V0R2VvbWV0cnlSb3VnaG5lc3MuanMnO1xyXG5leHBvcnQgeyBkZWZhdWx0IGFzIGdldFBhcmFsbGF4Q29ycmVjdE5vcm1hbCB9IGZyb20gJy4vZnVuY3Rpb25zL21hdGVyaWFsL2dldFBhcmFsbGF4Q29ycmVjdE5vcm1hbC5qcyc7XHJcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZ2V0Um91Z2huZXNzIH0gZnJvbSAnLi9mdW5jdGlvbnMvbWF0ZXJpYWwvZ2V0Um91Z2huZXNzLmpzJztcclxuZXhwb3J0IHsgZGVmYXVsdCBhcyBnZXRTaElycmFkaWFuY2VBdCB9IGZyb20gJy4vZnVuY3Rpb25zL21hdGVyaWFsL2dldFNoSXJyYWRpYW5jZUF0LmpzJztcclxuIiwiaW1wb3J0IERhdGFNYXAgZnJvbSAnLi9EYXRhTWFwLmpzJztcclxuaW1wb3J0IENvbG9yNCBmcm9tICcuL0NvbG9yNC5qcyc7XHJcbmltcG9ydCB7IHZlYzQsIGNvbnRleHQsIG5vcm1hbFdvcmxkLCBiYWNrZ3JvdW5kQmx1cnJpbmVzcywgYmFja2dyb3VuZEludGVuc2l0eSwgYmFja2dyb3VuZFJvdGF0aW9uLCBtb2RlbFZpZXdQcm9qZWN0aW9uIH0gZnJvbSAnLi4vLi4vbm9kZXMvVFNMLmpzJztcclxuaW1wb3J0IE5vZGVNYXRlcmlhbCBmcm9tICcuLi8uLi9tYXRlcmlhbHMvbm9kZXMvTm9kZU1hdGVyaWFsLmpzJztcclxuXHJcbmltcG9ydCB7IE1lc2ggfSBmcm9tICcuLi8uLi9vYmplY3RzL01lc2guanMnO1xyXG5pbXBvcnQgeyBTcGhlcmVHZW9tZXRyeSB9IGZyb20gJy4uLy4uL2dlb21ldHJpZXMvU3BoZXJlR2VvbWV0cnkuanMnO1xyXG5pbXBvcnQgeyBCYWNrU2lkZSB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcblxyXG5jb25zdCBfY2xlYXJDb2xvciA9IC8qQF9fUFVSRV9fKi8gbmV3IENvbG9yNCgpO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgcmVuZGVyZXIgbW9kdWxlIG1hbmFnZXMgdGhlIGJhY2tncm91bmQuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBhdWdtZW50cyBEYXRhTWFwXHJcbiAqL1xyXG5jbGFzcyBCYWNrZ3JvdW5kIGV4dGVuZHMgRGF0YU1hcCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYmFja2dyb3VuZCBtYW5hZ2VtZW50IGNvbXBvbmVudC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7Tm9kZXN9IG5vZGVzIC0gUmVuZGVyZXIgY29tcG9uZW50IGZvciBtYW5hZ2luZyBub2RlcyByZWxhdGVkIGxvZ2ljLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCByZW5kZXJlciwgbm9kZXMgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByZW5kZXJlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7UmVuZGVyZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlbmRlcmVyIGNvbXBvbmVudCBmb3IgbWFuYWdpbmcgbm9kZXMgcmVsYXRlZCBsb2dpYy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZXN9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9kZXMgPSBub2RlcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoZSBiYWNrZ3JvdW5kIGZvciB0aGUgZ2l2ZW4gc2NlbmUuIERlcGVuZGluZyBvbiBob3cgYFNjZW5lLmJhY2tncm91bmRgXHJcblx0ICogb3IgYFNjZW5lLmJhY2tncm91bmROb2RlYCBhcmUgY29uZmlndXJlZCwgdGhpcyBtZXRob2QgbWlnaHQgY29uZmlndXJlIGEgc2ltcGxlIGNsZWFyXHJcblx0ICogb3IgYWRkIGEgbWVzaCB0byB0aGUgcmVuZGVyIGxpc3QgZm9yIHJlbmRlcmluZyB0aGUgYmFja2dyb3VuZCBhcyBhIHRleHR1cmVkIHBsYW5lXHJcblx0ICogb3Igc2t5Ym94LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTY2VuZX0gc2NlbmUgLSBUaGUgc2NlbmUuXHJcblx0ICogQHBhcmFtIHtSZW5kZXJMaXN0fSByZW5kZXJMaXN0IC0gVGhlIGN1cnJlbnQgcmVuZGVyIGxpc3QuXHJcblx0ICogQHBhcmFtIHtSZW5kZXJDb250ZXh0fSByZW5kZXJDb250ZXh0IC0gVGhlIGN1cnJlbnQgcmVuZGVyIGNvbnRleHQuXHJcblx0ICovXHJcblx0dXBkYXRlKCBzY2VuZSwgcmVuZGVyTGlzdCwgcmVuZGVyQ29udGV4dCApIHtcclxuXHJcblx0XHRjb25zdCByZW5kZXJlciA9IHRoaXMucmVuZGVyZXI7XHJcblx0XHRjb25zdCBiYWNrZ3JvdW5kID0gdGhpcy5ub2Rlcy5nZXRCYWNrZ3JvdW5kTm9kZSggc2NlbmUgKSB8fCBzY2VuZS5iYWNrZ3JvdW5kO1xyXG5cclxuXHRcdGxldCBmb3JjZUNsZWFyID0gZmFsc2U7XHJcblxyXG5cdFx0aWYgKCBiYWNrZ3JvdW5kID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0Ly8gbm8gYmFja2dyb3VuZCBzZXR0aW5ncywgdXNlIGNsZWFyIGNvbG9yIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgcmVuZGVyZXJcclxuXHJcblx0XHRcdHJlbmRlcmVyLl9jbGVhckNvbG9yLmdldFJHQiggX2NsZWFyQ29sb3IgKTtcclxuXHRcdFx0X2NsZWFyQ29sb3IuYSA9IHJlbmRlcmVyLl9jbGVhckNvbG9yLmE7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggYmFja2dyb3VuZC5pc0NvbG9yID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0Ly8gYmFja2dyb3VuZCBpcyBhbiBvcGFxdWUgY29sb3JcclxuXHJcblx0XHRcdGJhY2tncm91bmQuZ2V0UkdCKCBfY2xlYXJDb2xvciApO1xyXG5cdFx0XHRfY2xlYXJDb2xvci5hID0gMTtcclxuXHJcblx0XHRcdGZvcmNlQ2xlYXIgPSB0cnVlO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGJhY2tncm91bmQuaXNOb2RlID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgc2NlbmVEYXRhID0gdGhpcy5nZXQoIHNjZW5lICk7XHJcblx0XHRcdGNvbnN0IGJhY2tncm91bmROb2RlID0gYmFja2dyb3VuZDtcclxuXHJcblx0XHRcdF9jbGVhckNvbG9yLmNvcHkoIHJlbmRlcmVyLl9jbGVhckNvbG9yICk7XHJcblxyXG5cdFx0XHRsZXQgYmFja2dyb3VuZE1lc2ggPSBzY2VuZURhdGEuYmFja2dyb3VuZE1lc2g7XHJcblxyXG5cdFx0XHRpZiAoIGJhY2tncm91bmRNZXNoID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGJhY2tncm91bmRNZXNoTm9kZSA9IGNvbnRleHQoIHZlYzQoIGJhY2tncm91bmROb2RlICkubXVsKCBiYWNrZ3JvdW5kSW50ZW5zaXR5ICksIHtcclxuXHRcdFx0XHRcdC8vIEBUT0RPOiBBZGQgVGV4dHVyZTJEIHN1cHBvcnQgdXNpbmcgbm9kZSBjb250ZXh0XHJcblx0XHRcdFx0XHRnZXRVVjogKCkgPT4gYmFja2dyb3VuZFJvdGF0aW9uLm11bCggbm9ybWFsV29ybGQgKSxcclxuXHRcdFx0XHRcdGdldFRleHR1cmVMZXZlbDogKCkgPT4gYmFja2dyb3VuZEJsdXJyaW5lc3NcclxuXHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRcdGxldCB2aWV3UHJvaiA9IG1vZGVsVmlld1Byb2plY3Rpb247XHJcblx0XHRcdFx0dmlld1Byb2ogPSB2aWV3UHJvai5zZXRaKCB2aWV3UHJvai53ICk7XHJcblxyXG5cdFx0XHRcdGNvbnN0IG5vZGVNYXRlcmlhbCA9IG5ldyBOb2RlTWF0ZXJpYWwoKTtcclxuXHRcdFx0XHRub2RlTWF0ZXJpYWwubmFtZSA9ICdCYWNrZ3JvdW5kLm1hdGVyaWFsJztcclxuXHRcdFx0XHRub2RlTWF0ZXJpYWwuc2lkZSA9IEJhY2tTaWRlO1xyXG5cdFx0XHRcdG5vZGVNYXRlcmlhbC5kZXB0aFRlc3QgPSBmYWxzZTtcclxuXHRcdFx0XHRub2RlTWF0ZXJpYWwuZGVwdGhXcml0ZSA9IGZhbHNlO1xyXG5cdFx0XHRcdG5vZGVNYXRlcmlhbC5hbGxvd092ZXJyaWRlID0gZmFsc2U7XHJcblx0XHRcdFx0bm9kZU1hdGVyaWFsLmZvZyA9IGZhbHNlO1xyXG5cdFx0XHRcdG5vZGVNYXRlcmlhbC5saWdodHMgPSBmYWxzZTtcclxuXHRcdFx0XHRub2RlTWF0ZXJpYWwudmVydGV4Tm9kZSA9IHZpZXdQcm9qO1xyXG5cdFx0XHRcdG5vZGVNYXRlcmlhbC5jb2xvck5vZGUgPSBiYWNrZ3JvdW5kTWVzaE5vZGU7XHJcblxyXG5cdFx0XHRcdHNjZW5lRGF0YS5iYWNrZ3JvdW5kTWVzaE5vZGUgPSBiYWNrZ3JvdW5kTWVzaE5vZGU7XHJcblx0XHRcdFx0c2NlbmVEYXRhLmJhY2tncm91bmRNZXNoID0gYmFja2dyb3VuZE1lc2ggPSBuZXcgTWVzaCggbmV3IFNwaGVyZUdlb21ldHJ5KCAxLCAzMiwgMzIgKSwgbm9kZU1hdGVyaWFsICk7XHJcblx0XHRcdFx0YmFja2dyb3VuZE1lc2guZnJ1c3R1bUN1bGxlZCA9IGZhbHNlO1xyXG5cdFx0XHRcdGJhY2tncm91bmRNZXNoLm5hbWUgPSAnQmFja2dyb3VuZC5tZXNoJztcclxuXHJcblx0XHRcdFx0YmFja2dyb3VuZE1lc2gub25CZWZvcmVSZW5kZXIgPSBmdW5jdGlvbiAoIHJlbmRlcmVyLCBzY2VuZSwgY2FtZXJhICkge1xyXG5cclxuXHRcdFx0XHRcdHRoaXMubWF0cml4V29ybGQuY29weVBvc2l0aW9uKCBjYW1lcmEubWF0cml4V29ybGQgKTtcclxuXHJcblx0XHRcdFx0fTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IGJhY2tncm91bmRDYWNoZUtleSA9IGJhY2tncm91bmROb2RlLmdldENhY2hlS2V5KCk7XHJcblxyXG5cdFx0XHRpZiAoIHNjZW5lRGF0YS5iYWNrZ3JvdW5kQ2FjaGVLZXkgIT09IGJhY2tncm91bmRDYWNoZUtleSApIHtcclxuXHJcblx0XHRcdFx0c2NlbmVEYXRhLmJhY2tncm91bmRNZXNoTm9kZS5ub2RlID0gdmVjNCggYmFja2dyb3VuZE5vZGUgKS5tdWwoIGJhY2tncm91bmRJbnRlbnNpdHkgKTtcclxuXHRcdFx0XHRzY2VuZURhdGEuYmFja2dyb3VuZE1lc2hOb2RlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0YmFja2dyb3VuZE1lc2gubWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHRzY2VuZURhdGEuYmFja2dyb3VuZENhY2hlS2V5ID0gYmFja2dyb3VuZENhY2hlS2V5O1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmVuZGVyTGlzdC51bnNoaWZ0KCBiYWNrZ3JvdW5kTWVzaCwgYmFja2dyb3VuZE1lc2guZ2VvbWV0cnksIGJhY2tncm91bmRNZXNoLm1hdGVyaWFsLCAwLCAwLCBudWxsLCBudWxsICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5SZW5kZXJlcjogVW5zdXBwb3J0ZWQgYmFja2dyb3VuZCBjb25maWd1cmF0aW9uLicsIGJhY2tncm91bmQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCBlbnZpcm9ubWVudEJsZW5kTW9kZSA9IHJlbmRlcmVyLnhyLmdldEVudmlyb25tZW50QmxlbmRNb2RlKCk7XHJcblxyXG5cdFx0aWYgKCBlbnZpcm9ubWVudEJsZW5kTW9kZSA9PT0gJ2FkZGl0aXZlJyApIHtcclxuXHJcblx0XHRcdF9jbGVhckNvbG9yLnNldCggMCwgMCwgMCwgMSApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGVudmlyb25tZW50QmxlbmRNb2RlID09PSAnYWxwaGEtYmxlbmQnICkge1xyXG5cclxuXHRcdFx0X2NsZWFyQ29sb3Iuc2V0KCAwLCAwLCAwLCAwICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0aWYgKCByZW5kZXJlci5hdXRvQ2xlYXIgPT09IHRydWUgfHwgZm9yY2VDbGVhciA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdGNvbnN0IGNsZWFyQ29sb3JWYWx1ZSA9IHJlbmRlckNvbnRleHQuY2xlYXJDb2xvclZhbHVlO1xyXG5cclxuXHRcdFx0Y2xlYXJDb2xvclZhbHVlLnIgPSBfY2xlYXJDb2xvci5yO1xyXG5cdFx0XHRjbGVhckNvbG9yVmFsdWUuZyA9IF9jbGVhckNvbG9yLmc7XHJcblx0XHRcdGNsZWFyQ29sb3JWYWx1ZS5iID0gX2NsZWFyQ29sb3IuYjtcclxuXHRcdFx0Y2xlYXJDb2xvclZhbHVlLmEgPSBfY2xlYXJDb2xvci5hO1xyXG5cclxuXHRcdFx0Ly8gcHJlbXVsdGlwbHkgYWxwaGFcclxuXHJcblx0XHRcdGlmICggcmVuZGVyZXIuYmFja2VuZC5pc1dlYkdMQmFja2VuZCA9PT0gdHJ1ZSB8fCByZW5kZXJlci5hbHBoYSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0Y2xlYXJDb2xvclZhbHVlLnIgKj0gY2xlYXJDb2xvclZhbHVlLmE7XHJcblx0XHRcdFx0Y2xlYXJDb2xvclZhbHVlLmcgKj0gY2xlYXJDb2xvclZhbHVlLmE7XHJcblx0XHRcdFx0Y2xlYXJDb2xvclZhbHVlLmIgKj0gY2xlYXJDb2xvclZhbHVlLmE7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvL1xyXG5cclxuXHRcdFx0cmVuZGVyQ29udGV4dC5kZXB0aENsZWFyVmFsdWUgPSByZW5kZXJlci5fY2xlYXJEZXB0aDtcclxuXHRcdFx0cmVuZGVyQ29udGV4dC5zdGVuY2lsQ2xlYXJWYWx1ZSA9IHJlbmRlcmVyLl9jbGVhclN0ZW5jaWw7XHJcblxyXG5cdFx0XHRyZW5kZXJDb250ZXh0LmNsZWFyQ29sb3IgPSByZW5kZXJlci5hdXRvQ2xlYXJDb2xvciA9PT0gdHJ1ZTtcclxuXHRcdFx0cmVuZGVyQ29udGV4dC5jbGVhckRlcHRoID0gcmVuZGVyZXIuYXV0b0NsZWFyRGVwdGggPT09IHRydWU7XHJcblx0XHRcdHJlbmRlckNvbnRleHQuY2xlYXJTdGVuY2lsID0gcmVuZGVyZXIuYXV0b0NsZWFyU3RlbmNpbCA9PT0gdHJ1ZTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0cmVuZGVyQ29udGV4dC5jbGVhckNvbG9yID0gZmFsc2U7XHJcblx0XHRcdHJlbmRlckNvbnRleHQuY2xlYXJEZXB0aCA9IGZhbHNlO1xyXG5cdFx0XHRyZW5kZXJDb250ZXh0LmNsZWFyU3RlbmNpbCA9IGZhbHNlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQmFja2dyb3VuZDtcclxuIiwibGV0IF9pZCA9IDA7XHJcblxyXG4vKipcclxuICogQSBiaW5kIGdyb3VwIHJlcHJlc2VudHMgYSBjb2xsZWN0aW9uIG9mIGJpbmRpbmdzIGFuZCB0aHVzIGEgY29sbGVjdGlvblxyXG4gKiBvciByZXNvdXJjZXMuIEJpbmQgZ3JvdXBzIGFyZSBhc3NpZ25lZCB0byBwaXBlbGluZXMgdG8gcHJvdmlkZSB0aGVtXHJcbiAqIHdpdGggdGhlIHJlcXVpcmVkIHJlc291cmNlcyAobGlrZSB1bmlmb3JtIGJ1ZmZlcnMgb3IgdGV4dHVyZXMpLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuY2xhc3MgQmluZEdyb3VwIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBiaW5kIGdyb3VwLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgYmluZCBncm91cCdzIG5hbWUuXHJcblx0ICogQHBhcmFtIHtBcnJheTxCaW5kaW5nPn0gYmluZGluZ3MgLSBBbiBhcnJheSBvZiBiaW5kaW5ncy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgZ3JvdXAgaW5kZXguXHJcblx0ICogQHBhcmFtIHtBcnJheTxCaW5kaW5nPn0gYmluZGluZ3NSZWZlcmVuY2UgLSBBbiBhcnJheSBvZiByZWZlcmVuY2UgYmluZGluZ3MuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5hbWUgPSAnJywgYmluZGluZ3MgPSBbXSwgaW5kZXggPSAwLCBiaW5kaW5nc1JlZmVyZW5jZSA9IFtdICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGJpbmQgZ3JvdXAncyBuYW1lLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubmFtZSA9IG5hbWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBhcnJheSBvZiBiaW5kaW5ncy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8QmluZGluZz59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYmluZGluZ3MgPSBiaW5kaW5ncztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBncm91cCBpbmRleC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmluZGV4ID0gaW5kZXg7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBhcnJheSBvZiByZWZlcmVuY2UgYmluZGluZ3MuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PEJpbmRpbmc+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJpbmRpbmdzUmVmZXJlbmNlID0gYmluZGluZ3NSZWZlcmVuY2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZ3JvdXAncyBJRC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlkID0gX2lkICsrO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBCaW5kR3JvdXA7XHJcbiIsImltcG9ydCBCaW5kR3JvdXAgZnJvbSAnLi4vQmluZEdyb3VwLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIG1vZHVsZSByZXByZXNlbnRzIHRoZSBzdGF0ZSBvZiBhIG5vZGUgYnVpbGRlciBhZnRlciBpdCB3YXNcclxuICogdXNlZCB0byBidWlsZCB0aGUgbm9kZXMgZm9yIGEgcmVuZGVyIG9iamVjdC4gVGhlIHN0YXRlIGhvbGRzIHRoZVxyXG4gKiByZXN1bHRzIG9mIHRoZSBidWlsZCBmb3IgZnVydGhlciBwcm9jZXNzaW5nIGluIHRoZSByZW5kZXJlci5cclxuICpcclxuICogUmVuZGVyIG9iamVjdHMgd2l0aCBpZGVudGljYWwgY2FjaGUga2V5cyBzaGFyZSB0aGUgc2FtZSBub2RlIGJ1aWxkZXIgc3RhdGUuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5jbGFzcyBOb2RlQnVpbGRlclN0YXRlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBub2RlIGJ1aWxkZXIgc3RhdGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdmVydGV4U2hhZGVyIC0gVGhlIG5hdGl2ZSB2ZXJ0ZXggc2hhZGVyIGNvZGUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGZyYWdtZW50U2hhZGVyIC0gVGhlIG5hdGl2ZSBmcmFnbWVudCBzaGFkZXIgY29kZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gY29tcHV0ZVNoYWRlciAtIFRoZSBuYXRpdmUgY29tcHV0ZSBzaGFkZXIgY29kZS5cclxuXHQgKiBAcGFyYW0ge0FycmF5PE5vZGVBdHRyaWJ1dGU+fSBub2RlQXR0cmlidXRlcyAtIEFuIGFycmF5IG9mIG5vZGUgYXR0cmlidXRlcy5cclxuXHQgKiBAcGFyYW0ge0FycmF5PEJpbmRHcm91cD59IGJpbmRpbmdzIC0gQW4gYXJyYXkgb2YgYmluZCBncm91cHMuXHJcblx0ICogQHBhcmFtIHtBcnJheTxOb2RlPn0gdXBkYXRlTm9kZXMgLSBBbiBhcnJheSBvZiBub2RlcyB0aGF0IGltcGxlbWVudCB0aGVpciBgdXBkYXRlKClgIG1ldGhvZC5cclxuXHQgKiBAcGFyYW0ge0FycmF5PE5vZGU+fSB1cGRhdGVCZWZvcmVOb2RlcyAtIEFuIGFycmF5IG9mIG5vZGVzIHRoYXQgaW1wbGVtZW50IHRoZWlyIGB1cGRhdGVCZWZvcmUoKWAgbWV0aG9kLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8Tm9kZT59IHVwZGF0ZUFmdGVyTm9kZXMgLSBBbiBhcnJheSBvZiBub2RlcyB0aGF0IGltcGxlbWVudCB0aGVpciBgdXBkYXRlQWZ0ZXIoKWAgbWV0aG9kLlxyXG5cdCAqIEBwYXJhbSB7Tm9kZU1hdGVyaWFsT2JzZXJ2ZXJ9IG9ic2VydmVyIC0gQSBub2RlIG1hdGVyaWFsIG9ic2VydmVyLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8T2JqZWN0Pn0gdHJhbnNmb3JtcyAtIEFuIGFycmF5IHdpdGggdHJhbnNmb3JtIGF0dHJpYnV0ZSBvYmplY3RzLiBPbmx5IHJlbGV2YW50IHdoZW4gdXNpbmcgY29tcHV0ZSBzaGFkZXJzIHdpdGggV2ViR0wgMi5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggdmVydGV4U2hhZGVyLCBmcmFnbWVudFNoYWRlciwgY29tcHV0ZVNoYWRlciwgbm9kZUF0dHJpYnV0ZXMsIGJpbmRpbmdzLCB1cGRhdGVOb2RlcywgdXBkYXRlQmVmb3JlTm9kZXMsIHVwZGF0ZUFmdGVyTm9kZXMsIG9ic2VydmVyLCB0cmFuc2Zvcm1zID0gW10gKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbmF0aXZlIHZlcnRleCBzaGFkZXIgY29kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnZlcnRleFNoYWRlciA9IHZlcnRleFNoYWRlcjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBuYXRpdmUgZnJhZ21lbnQgc2hhZGVyIGNvZGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5mcmFnbWVudFNoYWRlciA9IGZyYWdtZW50U2hhZGVyO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG5hdGl2ZSBjb21wdXRlIHNoYWRlciBjb2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29tcHV0ZVNoYWRlciA9IGNvbXB1dGVTaGFkZXI7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBhcnJheSB3aXRoIHRyYW5zZm9ybSBhdHRyaWJ1dGUgb2JqZWN0cy5cclxuXHRcdCAqIE9ubHkgcmVsZXZhbnQgd2hlbiB1c2luZyBjb21wdXRlIHNoYWRlcnMgd2l0aCBXZWJHTCAyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxPYmplY3Q+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRyYW5zZm9ybXMgPSB0cmFuc2Zvcm1zO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQW4gYXJyYXkgb2Ygbm9kZSBhdHRyaWJ1dGVzIHJlcHJlc2VudGluZ1xyXG5cdFx0ICogdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIHNoYWRlcnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PE5vZGVBdHRyaWJ1dGU+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vZGVBdHRyaWJ1dGVzID0gbm9kZUF0dHJpYnV0ZXM7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBhcnJheSBvZiBiaW5kIGdyb3VwcyByZXByZXNlbnRpbmcgdGhlIHVuaWZvcm0gb3Igc3RvcmFnZVxyXG5cdFx0ICogYnVmZmVycywgdGV4dHVyZSBvciBzYW1wbGVycyBvZiB0aGUgc2hhZGVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxCaW5kR3JvdXA+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJpbmRpbmdzID0gYmluZGluZ3M7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBhcnJheSBvZiBub2RlcyB0aGF0IGltcGxlbWVudCB0aGVpciBgdXBkYXRlKClgIG1ldGhvZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8Tm9kZT59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXBkYXRlTm9kZXMgPSB1cGRhdGVOb2RlcztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIGFycmF5IG9mIG5vZGVzIHRoYXQgaW1wbGVtZW50IHRoZWlyIGB1cGRhdGVCZWZvcmUoKWAgbWV0aG9kLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxOb2RlPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51cGRhdGVCZWZvcmVOb2RlcyA9IHVwZGF0ZUJlZm9yZU5vZGVzO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQW4gYXJyYXkgb2Ygbm9kZXMgdGhhdCBpbXBsZW1lbnQgdGhlaXIgYHVwZGF0ZUFmdGVyKClgIG1ldGhvZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8Tm9kZT59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXBkYXRlQWZ0ZXJOb2RlcyA9IHVwZGF0ZUFmdGVyTm9kZXM7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIG5vZGUgbWF0ZXJpYWwgb2JzZXJ2ZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGVNYXRlcmlhbE9ic2VydmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm9ic2VydmVyID0gb2JzZXJ2ZXI7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3cgb2Z0ZW4gdGhpcyBzdGF0ZSBpcyB1c2VkIGJ5IHJlbmRlciBvYmplY3RzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXNlZFRpbWVzID0gMDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGNyZWF0ZSBhIGFycmF5IG9mIGJpbmQgZ3JvdXBzIGJhc2VkXHJcblx0ICogb24gdGhlIGV4aXN0aW5nIGJpbmQgZ3JvdXBzIG9mIHRoaXMgc3RhdGUuIFNoYXJlZCBncm91cHMgYXJlXHJcblx0ICogbm90IGNsb25lZC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0FycmF5PEJpbmRHcm91cD59IEEgYXJyYXkgb2YgYmluZCBncm91cHMuXHJcblx0ICovXHJcblx0Y3JlYXRlQmluZGluZ3MoKSB7XHJcblxyXG5cdFx0Y29uc3QgYmluZGluZ3MgPSBbXTtcclxuXHJcblx0XHRmb3IgKCBjb25zdCBpbnN0YW5jZUdyb3VwIG9mIHRoaXMuYmluZGluZ3MgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBzaGFyZWQgPSBpbnN0YW5jZUdyb3VwLmJpbmRpbmdzWyAwIF0uZ3JvdXBOb2RlLnNoYXJlZDsgLy8gQWxsIGJpbmRpbmdzIGluIHRoZSBncm91cCBtdXN0IGhhdmUgdGhlIHNhbWUgZ3JvdXBOb2RlLlxyXG5cclxuXHRcdFx0aWYgKCBzaGFyZWQgIT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGJpbmRpbmdzR3JvdXAgPSBuZXcgQmluZEdyb3VwKCBpbnN0YW5jZUdyb3VwLm5hbWUsIFtdLCBpbnN0YW5jZUdyb3VwLmluZGV4LCBpbnN0YW5jZUdyb3VwICk7XHJcblx0XHRcdFx0YmluZGluZ3MucHVzaCggYmluZGluZ3NHcm91cCApO1xyXG5cclxuXHRcdFx0XHRmb3IgKCBjb25zdCBpbnN0YW5jZUJpbmRpbmcgb2YgaW5zdGFuY2VHcm91cC5iaW5kaW5ncyApIHtcclxuXHJcblx0XHRcdFx0XHRiaW5kaW5nc0dyb3VwLmJpbmRpbmdzLnB1c2goIGluc3RhbmNlQmluZGluZy5jbG9uZSgpICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGJpbmRpbmdzLnB1c2goIGluc3RhbmNlR3JvdXAgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGJpbmRpbmdzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBOb2RlQnVpbGRlclN0YXRlO1xyXG4iLCIvKipcclxuICoge0BsaW5rIE5vZGVCdWlsZGVyfSBpcyBnb2luZyB0byBjcmVhdGUgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgZHVyaW5nIHRoZSBidWlsZCBwcm9jZXNzXHJcbiAqIG9mIG5vZGVzLiBUaGV5IHJlcHJlc2VudCB0aGUgZmluYWwgc2hhZGVyIGF0dHJpYnV0ZXMgdGhhdCBhcmUgZ29pbmcgdG8gYmUgZ2VuZXJhdGVkXHJcbiAqIGJ5IHRoZSBidWlsZGVyLiBBcnJheXMgb2Ygbm9kZSBhdHRyaWJ1dGVzIGlzIG1haW50YWluZWQgaW4ge0BsaW5rIE5vZGVCdWlsZGVyI2F0dHJpYnV0ZXN9XHJcbiAqIGFuZCB7QGxpbmsgTm9kZUJ1aWxkZXIjYnVmZmVyQXR0cmlidXRlc30gZm9yIHRoaXMgcHVycG9zZS5cclxuICovXHJcbmNsYXNzIE5vZGVBdHRyaWJ1dGUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG5vZGUgYXR0cmlidXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZS5cclxuXHQgKiBAcGFyYW0gez9Ob2RlfSBub2RlIC0gQW4gb3B0aW9uYWwgcmVmZXJlbmNlIHRvIHRoZSBub2RlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBuYW1lLCB0eXBlLCBub2RlID0gbnVsbCApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNOb2RlQXR0cmlidXRlID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5uYW1lID0gbmFtZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50eXBlID0gdHlwZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIG9wdGlvbmFsIHJlZmVyZW5jZSB0byB0aGUgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9kZSA9IG5vZGU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IE5vZGVBdHRyaWJ1dGU7XHJcbiIsIi8qKlxyXG4gKiB7QGxpbmsgTm9kZUJ1aWxkZXJ9IGlzIGdvaW5nIHRvIGNyZWF0ZSBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBkdXJpbmcgdGhlIGJ1aWxkIHByb2Nlc3NcclxuICogb2Ygbm9kZXMuIFRoZXkgcmVwcmVzZW50IHRoZSBmaW5hbCBzaGFkZXIgdW5pZm9ybXMgdGhhdCBhcmUgZ29pbmcgdG8gYmUgZ2VuZXJhdGVkXHJcbiAqIGJ5IHRoZSBidWlsZGVyLiBBIGRpY3Rpb25hcnkgb2Ygbm9kZSB1bmlmb3JtcyBpcyBtYWludGFpbmVkIGluIHtAbGluayBOb2RlQnVpbGRlciN1bmlmb3Jtc31cclxuICogZm9yIHRoaXMgcHVycG9zZS5cclxuICovXHJcbmNsYXNzIE5vZGVVbmlmb3JtIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBub2RlIHVuaWZvcm0uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB1bmlmb3JtLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIHR5cGUgb2YgdGhlIHVuaWZvcm0uXHJcblx0ICogQHBhcmFtIHtVbmlmb3JtTm9kZX0gbm9kZSAtIEFuIHJlZmVyZW5jZSB0byB0aGUgbm9kZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbmFtZSwgdHlwZSwgbm9kZSApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNOb2RlVW5pZm9ybSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbmFtZSBvZiB0aGUgdW5pZm9ybS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5hbWUgPSBuYW1lO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHR5cGUgb2YgdGhlIHVuaWZvcm0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50eXBlID0gdHlwZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIHJlZmVyZW5jZSB0byB0aGUgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VW5pZm9ybU5vZGV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9kZSA9IG5vZGUuZ2V0U2VsZigpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSB2YWx1ZSBvZiB0aGUgdW5pZm9ybSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge2FueX1cclxuXHQgKi9cclxuXHRnZXQgdmFsdWUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubm9kZS52YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHRzZXQgdmFsdWUoIHZhbCApIHtcclxuXHJcblx0XHR0aGlzLm5vZGUudmFsdWUgPSB2YWw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGlkIG9mIHRoZSB1bmlmb3JtIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdCAqL1xyXG5cdGdldCBpZCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5ub2RlLmlkO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSB1bmlmb3JtIG5vZGUncyBncm91cC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtVbmlmb3JtR3JvdXBOb2RlfVxyXG5cdCAqL1xyXG5cdGdldCBncm91cE5vZGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubm9kZS5ncm91cE5vZGU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IE5vZGVVbmlmb3JtO1xyXG4iLCIvKipcclxuICoge0BsaW5rIE5vZGVCdWlsZGVyfSBpcyBnb2luZyB0byBjcmVhdGUgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgZHVyaW5nIHRoZSBidWlsZCBwcm9jZXNzXHJcbiAqIG9mIG5vZGVzLiBUaGV5IHJlcHJlc2VudCB0aGUgZmluYWwgc2hhZGVyIHZhcmlhYmxlcyB0aGF0IGFyZSBnb2luZyB0byBiZSBnZW5lcmF0ZWRcclxuICogYnkgdGhlIGJ1aWxkZXIuIEEgZGljdGlvbmFyeSBvZiBub2RlIHZhcmlhYmxlcyBpcyBtYWludGFpbmVkIGluIHtAbGluayBOb2RlQnVpbGRlciN2YXJzfSBmb3JcclxuICogdGhpcyBwdXJwb3NlLlxyXG4gKi9cclxuY2xhc3MgTm9kZVZhciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbm9kZSB2YXJpYWJsZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIHR5cGUgb2YgdGhlIHZhcmlhYmxlLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JlYWRPbmx5PWZhbHNlXSAtIFRoZSByZWFkLW9ubHkgZmxhZy5cclxuXHQgKiBAcGFyYW0gez9udW1iZXJ9IFtjb3VudD1udWxsXSAtIFRoZSBzaXplLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBuYW1lLCB0eXBlLCByZWFkT25seSA9IGZhbHNlLCBjb3VudCA9IG51bGwgKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzTm9kZVZhciA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5uYW1lID0gbmFtZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB0eXBlIG9mIHRoZSB2YXJpYWJsZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnR5cGUgPSB0eXBlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogIFRoZSByZWFkLW9ubHkgZmxhZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yZWFkT25seSA9IHJlYWRPbmx5O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHNpemUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9udW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY291bnQgPSBjb3VudDtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTm9kZVZhcjtcclxuIiwiaW1wb3J0IE5vZGVWYXIgZnJvbSAnLi9Ob2RlVmFyLmpzJztcclxuXHJcbi8qKlxyXG4gKiB7QGxpbmsgTm9kZUJ1aWxkZXJ9IGlzIGdvaW5nIHRvIGNyZWF0ZSBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBkdXJpbmcgdGhlIGJ1aWxkIHByb2Nlc3NcclxuICogb2Ygbm9kZXMuIFRoZXkgcmVwcmVzZW50IHRoZSBmaW5hbCBzaGFkZXIgdmFyeWluZ3MgdGhhdCBhcmUgZ29pbmcgdG8gYmUgZ2VuZXJhdGVkXHJcbiAqIGJ5IHRoZSBidWlsZGVyLiBBbiBhcnJheSBvZiBub2RlIHZhcnlpbmdzIGlzIG1haW50YWluZWQgaW4ge0BsaW5rIE5vZGVCdWlsZGVyI3ZhcnlpbmdzfSBmb3JcclxuICogdGhpcyBwdXJwb3NlLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTm9kZVZhclxyXG4gKi9cclxuY2xhc3MgTm9kZVZhcnlpbmcgZXh0ZW5kcyBOb2RlVmFyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBub2RlIHZhcnlpbmcuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB2YXJ5aW5nLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIHR5cGUgb2YgdGhlIHZhcnlpbmcuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5hbWUsIHR5cGUgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5hbWUsIHR5cGUgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhpcyB2YXJ5aW5nIHJlcXVpcmVzIGludGVycG9sYXRpb24gb3Igbm90LiBUaGlzIHByb3BlcnR5IGNhbiBiZSB1c2VkXHJcblx0XHQgKiB0byBjaGVjayBpZiB0aGUgdmFyeWluZyBjYW4gYmUgb3B0aW1pemVkIGZvciBhIHZhcmlhYmxlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5uZWVkc0ludGVycG9sYXRpb24gPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNOb2RlVmFyeWluZyA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IE5vZGVWYXJ5aW5nO1xyXG4iLCIvKipcclxuICoge0BsaW5rIE5vZGVCdWlsZGVyfSBpcyBnb2luZyB0byBjcmVhdGUgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgZHVyaW5nIHRoZSBidWlsZCBwcm9jZXNzXHJcbiAqIG9mIG5vZGVzLiBUaGV5IHJlcHJlc2VudCB1c2VyLWRlZmluZWQsIG5hdGl2ZSBzaGFkZXIgY29kZSBwb3J0aW9ucyB0aGF0IGFyZSBnb2luZyB0byBiZVxyXG4gKiBpbmplY3RlZCBieSB0aGUgYnVpbGRlci4gQSBkaWN0aW9uYXJ5IG9mIG5vZGUgY29kZXMgaXMgbWFpbnRhaW5lZCBpbiB7QGxpbmsgTm9kZUJ1aWxkZXIjY29kZXN9XHJcbiAqIGZvciB0aGlzIHB1cnBvc2UuXHJcbiAqL1xyXG5jbGFzcyBOb2RlQ29kZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgY29kZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgY29kZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSBub2RlIHR5cGUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtjb2RlPScnXSAtIFRoZSBuYXRpdmUgc2hhZGVyIGNvZGUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5hbWUsIHR5cGUsIGNvZGUgPSAnJyApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBuYW1lIG9mIHRoZSBjb2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubmFtZSA9IG5hbWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbm9kZSB0eXBlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudHlwZSA9IHR5cGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbmF0aXZlIHNoYWRlciBjb2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKiBAZGVmYXVsdCAnJ1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvZGUgPSBjb2RlO1xyXG5cclxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ2lzTm9kZUNvZGUnLCB7IHZhbHVlOiB0cnVlIH0gKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTm9kZUNvZGU7XHJcbiIsImxldCBfaWQgPSAwO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgdXRpbGl0eSBjbGFzcyBpcyB1c2VkIGluIHtAbGluayBOb2RlQnVpbGRlcn0gYXMgYW4gaW50ZXJuYWxcclxuICogY2FjaGUgZGF0YSBzdHJ1Y3R1cmUgZm9yIG5vZGUgZGF0YS5cclxuICovXHJcbmNsYXNzIE5vZGVDYWNoZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbm9kZSBjYWNoZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7P05vZGVDYWNoZX0gcGFyZW50IC0gQSByZWZlcmVuY2UgdG8gYSBwYXJlbnQgY2FjaGUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHBhcmVudCA9IG51bGwgKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgaWQgb2YgdGhlIGNhY2hlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pZCA9IF9pZCArKztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgd2VhayBtYXAgZm9yIG1hbmFnaW5nIG5vZGUgZGF0YS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2Vha01hcDxOb2RlLCBPYmplY3Q+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vZGVzRGF0YSA9IG5ldyBXZWFrTWFwKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZWZlcmVuY2UgdG8gYSBwYXJlbnQgbm9kZSBjYWNoZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGVDYWNoZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wYXJlbnQgPSBwYXJlbnQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgZGF0YSBmb3IgdGhlIGdpdmVuIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBUaGUgbm9kZS5cclxuXHQgKiBAcmV0dXJuIHs/T2JqZWN0fSBUaGUgZGF0YSBmb3IgdGhlIG5vZGUuXHJcblx0ICovXHJcblx0Z2V0RGF0YSggbm9kZSApIHtcclxuXHJcblx0XHRsZXQgZGF0YSA9IHRoaXMubm9kZXNEYXRhLmdldCggbm9kZSApO1xyXG5cclxuXHRcdGlmICggZGF0YSA9PT0gdW5kZWZpbmVkICYmIHRoaXMucGFyZW50ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0ZGF0YSA9IHRoaXMucGFyZW50LmdldERhdGEoIG5vZGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGRhdGE7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZGF0YSBmb3IgYSBnaXZlbiBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIG5vZGUuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBUaGUgZGF0YSB0aGF0IHNob3VsZCBiZSBjYWNoZWQuXHJcblx0ICovXHJcblx0c2V0RGF0YSggbm9kZSwgZGF0YSApIHtcclxuXHJcblx0XHR0aGlzLm5vZGVzRGF0YS5zZXQoIG5vZGUsIGRhdGEgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTm9kZUNhY2hlO1xyXG4iLCJjbGFzcyBTdHJ1Y3RUeXBlIHtcclxuXHJcblx0Y29uc3RydWN0b3IoIG5hbWUsIG1lbWJlcnMgKSB7XHJcblxyXG5cdFx0dGhpcy5uYW1lID0gbmFtZTtcclxuXHRcdHRoaXMubWVtYmVycyA9IG1lbWJlcnM7XHJcblx0XHR0aGlzLm91dHB1dCA9IGZhbHNlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTdHJ1Y3RUeXBlO1xyXG4iLCJpbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uLy4uL21hdGgvQ29sb3IuanMnO1xyXG5pbXBvcnQgeyBNYXRyaXgyIH0gZnJvbSAnLi4vLi4vbWF0aC9NYXRyaXgyLmpzJztcclxuaW1wb3J0IHsgTWF0cml4MyB9IGZyb20gJy4uLy4uL21hdGgvTWF0cml4My5qcyc7XHJcbmltcG9ydCB7IE1hdHJpeDQgfSBmcm9tICcuLi8uLi9tYXRoL01hdHJpeDQuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IyLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjQgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjQuanMnO1xyXG5cclxuLyoqXHJcbiAqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHVuaWZvcm1zLlxyXG4gKlxyXG4gKiBAYWJzdHJhY3RcclxuICogQHByaXZhdGVcclxuICovXHJcbmNsYXNzIFVuaWZvcm0ge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHVuaWZvcm0uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSB1bmlmb3JtJ3MgbmFtZS5cclxuXHQgKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBUaGUgdW5pZm9ybSdzIHZhbHVlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBuYW1lLCB2YWx1ZSApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB1bmlmb3JtJ3MgbmFtZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5hbWUgPSBuYW1lO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHVuaWZvcm0ncyB2YWx1ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7YW55fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnZhbHVlID0gdmFsdWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBVc2VkIHRvIGJ1aWxkIHRoZSB1bmlmb3JtIGJ1ZmZlciBhY2NvcmRpbmcgdG8gdGhlIFNURDE0MCBsYXlvdXQuXHJcblx0XHQgKiBEZXJpdmVkIHVuaWZvcm1zIHdpbGwgc2V0IHRoaXMgcHJvcGVydHkgdG8gYSBkYXRhIHR5cGUgc3BlY2lmaWNcclxuXHRcdCAqIHZhbHVlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYm91bmRhcnkgPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGl0ZW0gc2l6ZS4gRGVyaXZlZCB1bmlmb3JtcyB3aWxsIHNldCB0aGlzIHByb3BlcnR5IHRvIGEgZGF0YVxyXG5cdFx0ICogdHlwZSBzcGVjaWZpYyB2YWx1ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLml0ZW1TaXplID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgcHJvcGVydHkgaXMgc2V0IGJ5IHtAbGluayBVbmlmb3Jtc0dyb3VwfSBhbmQgbWFya3NcclxuXHRcdCAqIHRoZSBzdGFydCBwb3NpdGlvbiBpbiB0aGUgdW5pZm9ybSBidWZmZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5vZmZzZXQgPSAwO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHVuaWZvcm0ncyB2YWx1ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBzZXQuXHJcblx0ICovXHJcblx0c2V0VmFsdWUoIHZhbHVlICkge1xyXG5cclxuXHRcdHRoaXMudmFsdWUgPSB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSB1bmlmb3JtJ3MgdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHthbnl9IFRoZSB2YWx1ZS5cclxuXHQgKi9cclxuXHRnZXRWYWx1ZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy52YWx1ZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgYSBOdW1iZXIgdW5pZm9ybS5cclxuICpcclxuICogQHByaXZhdGVcclxuICogQGF1Z21lbnRzIFVuaWZvcm1cclxuICovXHJcbmNsYXNzIE51bWJlclVuaWZvcm0gZXh0ZW5kcyBVbmlmb3JtIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBOdW1iZXIgdW5pZm9ybS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIHVuaWZvcm0ncyBuYW1lLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSB1bmlmb3JtJ3MgdmFsdWUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5hbWUsIHZhbHVlID0gMCApIHtcclxuXHJcblx0XHRzdXBlciggbmFtZSwgdmFsdWUgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNOdW1iZXJVbmlmb3JtID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLmJvdW5kYXJ5ID0gNDtcclxuXHRcdHRoaXMuaXRlbVNpemUgPSAxO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyBhIFZlY3RvcjIgdW5pZm9ybS5cclxuICpcclxuICogQHByaXZhdGVcclxuICogQGF1Z21lbnRzIFVuaWZvcm1cclxuICovXHJcbmNsYXNzIFZlY3RvcjJVbmlmb3JtIGV4dGVuZHMgVW5pZm9ybSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgTnVtYmVyIHVuaWZvcm0uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSB1bmlmb3JtJ3MgbmFtZS5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IHZhbHVlIC0gVGhlIHVuaWZvcm0ncyB2YWx1ZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbmFtZSwgdmFsdWUgPSBuZXcgVmVjdG9yMigpICkge1xyXG5cclxuXHRcdHN1cGVyKCBuYW1lLCB2YWx1ZSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1ZlY3RvcjJVbmlmb3JtID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLmJvdW5kYXJ5ID0gODtcclxuXHRcdHRoaXMuaXRlbVNpemUgPSAyO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyBhIFZlY3RvcjMgdW5pZm9ybS5cclxuICpcclxuICogQHByaXZhdGVcclxuICogQGF1Z21lbnRzIFVuaWZvcm1cclxuICovXHJcbmNsYXNzIFZlY3RvcjNVbmlmb3JtIGV4dGVuZHMgVW5pZm9ybSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgTnVtYmVyIHVuaWZvcm0uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSB1bmlmb3JtJ3MgbmFtZS5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHZhbHVlIC0gVGhlIHVuaWZvcm0ncyB2YWx1ZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbmFtZSwgdmFsdWUgPSBuZXcgVmVjdG9yMygpICkge1xyXG5cclxuXHRcdHN1cGVyKCBuYW1lLCB2YWx1ZSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1ZlY3RvcjNVbmlmb3JtID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLmJvdW5kYXJ5ID0gMTY7XHJcblx0XHR0aGlzLml0ZW1TaXplID0gMztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgYSBWZWN0b3I0IHVuaWZvcm0uXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBhdWdtZW50cyBVbmlmb3JtXHJcbiAqL1xyXG5jbGFzcyBWZWN0b3I0VW5pZm9ybSBleHRlbmRzIFVuaWZvcm0ge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IE51bWJlciB1bmlmb3JtLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgdW5pZm9ybSdzIG5hbWUuXHJcblx0ICogQHBhcmFtIHtWZWN0b3I0fSB2YWx1ZSAtIFRoZSB1bmlmb3JtJ3MgdmFsdWUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5hbWUsIHZhbHVlID0gbmV3IFZlY3RvcjQoKSApIHtcclxuXHJcblx0XHRzdXBlciggbmFtZSwgdmFsdWUgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNWZWN0b3I0VW5pZm9ybSA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy5ib3VuZGFyeSA9IDE2O1xyXG5cdFx0dGhpcy5pdGVtU2l6ZSA9IDQ7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIGEgQ29sb3IgdW5pZm9ybS5cclxuICpcclxuICogQHByaXZhdGVcclxuICogQGF1Z21lbnRzIFVuaWZvcm1cclxuICovXHJcbmNsYXNzIENvbG9yVW5pZm9ybSBleHRlbmRzIFVuaWZvcm0ge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IE51bWJlciB1bmlmb3JtLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgdW5pZm9ybSdzIG5hbWUuXHJcblx0ICogQHBhcmFtIHtDb2xvcn0gdmFsdWUgLSBUaGUgdW5pZm9ybSdzIHZhbHVlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBuYW1lLCB2YWx1ZSA9IG5ldyBDb2xvcigpICkge1xyXG5cclxuXHRcdHN1cGVyKCBuYW1lLCB2YWx1ZSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0NvbG9yVW5pZm9ybSA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy5ib3VuZGFyeSA9IDE2O1xyXG5cdFx0dGhpcy5pdGVtU2l6ZSA9IDM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIGEgTWF0cml4MiB1bmlmb3JtLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAYXVnbWVudHMgVW5pZm9ybVxyXG4gKi9cclxuY2xhc3MgTWF0cml4MlVuaWZvcm0gZXh0ZW5kcyBVbmlmb3JtIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBOdW1iZXIgdW5pZm9ybS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIHVuaWZvcm0ncyBuYW1lLlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4Mn0gdmFsdWUgLSBUaGUgdW5pZm9ybSdzIHZhbHVlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBuYW1lLCB2YWx1ZSA9IG5ldyBNYXRyaXgyKCkgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5hbWUsIHZhbHVlICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzTWF0cml4MlVuaWZvcm0gPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMuYm91bmRhcnkgPSAxNjtcclxuXHRcdHRoaXMuaXRlbVNpemUgPSA0O1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgYSBNYXRyaXgzIHVuaWZvcm0uXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBhdWdtZW50cyBVbmlmb3JtXHJcbiAqL1xyXG5jbGFzcyBNYXRyaXgzVW5pZm9ybSBleHRlbmRzIFVuaWZvcm0ge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IE51bWJlciB1bmlmb3JtLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgdW5pZm9ybSdzIG5hbWUuXHJcblx0ICogQHBhcmFtIHtNYXRyaXgzfSB2YWx1ZSAtIFRoZSB1bmlmb3JtJ3MgdmFsdWUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5hbWUsIHZhbHVlID0gbmV3IE1hdHJpeDMoKSApIHtcclxuXHJcblx0XHRzdXBlciggbmFtZSwgdmFsdWUgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNNYXRyaXgzVW5pZm9ybSA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy5ib3VuZGFyeSA9IDQ4O1xyXG5cdFx0dGhpcy5pdGVtU2l6ZSA9IDEyO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyBhIE1hdHJpeDQgdW5pZm9ybS5cclxuICpcclxuICogQHByaXZhdGVcclxuICogQGF1Z21lbnRzIFVuaWZvcm1cclxuICovXHJcbmNsYXNzIE1hdHJpeDRVbmlmb3JtIGV4dGVuZHMgVW5pZm9ybSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgTnVtYmVyIHVuaWZvcm0uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSB1bmlmb3JtJ3MgbmFtZS5cclxuXHQgKiBAcGFyYW0ge01hdHJpeDR9IHZhbHVlIC0gVGhlIHVuaWZvcm0ncyB2YWx1ZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbmFtZSwgdmFsdWUgPSBuZXcgTWF0cml4NCgpICkge1xyXG5cclxuXHRcdHN1cGVyKCBuYW1lLCB2YWx1ZSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc01hdHJpeDRVbmlmb3JtID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLmJvdW5kYXJ5ID0gNjQ7XHJcblx0XHR0aGlzLml0ZW1TaXplID0gMTY7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7XHJcblx0TnVtYmVyVW5pZm9ybSxcclxuXHRWZWN0b3IyVW5pZm9ybSwgVmVjdG9yM1VuaWZvcm0sIFZlY3RvcjRVbmlmb3JtLCBDb2xvclVuaWZvcm0sXHJcblx0TWF0cml4MlVuaWZvcm0sIE1hdHJpeDNVbmlmb3JtLCBNYXRyaXg0VW5pZm9ybVxyXG59O1xyXG4iLCJpbXBvcnQge1xyXG5cdE51bWJlclVuaWZvcm0sIFZlY3RvcjJVbmlmb3JtLCBWZWN0b3IzVW5pZm9ybSwgVmVjdG9yNFVuaWZvcm0sXHJcblx0Q29sb3JVbmlmb3JtLCBNYXRyaXgyVW5pZm9ybSwgTWF0cml4M1VuaWZvcm0sIE1hdHJpeDRVbmlmb3JtXHJcbn0gZnJvbSAnLi4vVW5pZm9ybS5qcyc7XHJcblxyXG4vKipcclxuICogQSBzcGVjaWFsIGZvcm0gb2YgTnVtYmVyIHVuaWZvcm0gYmluZGluZyB0eXBlLlxyXG4gKiBJdCdzIHZhbHVlIGlzIG1hbmFnZWQgYnkgYSBub2RlIG9iamVjdC5cclxuICpcclxuICogQHByaXZhdGVcclxuICogQGF1Z21lbnRzIE51bWJlclVuaWZvcm1cclxuICovXHJcbmNsYXNzIE51bWJlck5vZGVVbmlmb3JtIGV4dGVuZHMgTnVtYmVyVW5pZm9ybSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbm9kZS1iYXNlZCBOdW1iZXIgdW5pZm9ybS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZVVuaWZvcm19IG5vZGVVbmlmb3JtIC0gVGhlIG5vZGUgdW5pZm9ybS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggbm9kZVVuaWZvcm0gKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5vZGVVbmlmb3JtLm5hbWUsIG5vZGVVbmlmb3JtLnZhbHVlICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbm9kZSB1bmlmb3JtLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlVW5pZm9ybX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub2RlVW5pZm9ybSA9IG5vZGVVbmlmb3JtO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE92ZXJ3cml0dGVuIHRvIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIG5vZGUgdW5pZm9ybS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIHZhbHVlLlxyXG5cdCAqL1xyXG5cdGdldFZhbHVlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm5vZGVVbmlmb3JtLnZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIG5vZGUgdW5pZm9ybSBkYXRhIHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBkYXRhIHR5cGUuXHJcblx0ICovXHJcblx0Z2V0VHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5ub2RlVW5pZm9ybS50eXBlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQSBzcGVjaWFsIGZvcm0gb2YgVmVjdG9yMiB1bmlmb3JtIGJpbmRpbmcgdHlwZS5cclxuICogSXQncyB2YWx1ZSBpcyBtYW5hZ2VkIGJ5IGEgbm9kZSBvYmplY3QuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBhdWdtZW50cyBWZWN0b3IyVW5pZm9ybVxyXG4gKi9cclxuY2xhc3MgVmVjdG9yMk5vZGVVbmlmb3JtIGV4dGVuZHMgVmVjdG9yMlVuaWZvcm0ge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG5vZGUtYmFzZWQgVmVjdG9yMiB1bmlmb3JtLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlVW5pZm9ybX0gbm9kZVVuaWZvcm0gLSBUaGUgbm9kZSB1bmlmb3JtLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBub2RlVW5pZm9ybSApIHtcclxuXHJcblx0XHRzdXBlciggbm9kZVVuaWZvcm0ubmFtZSwgbm9kZVVuaWZvcm0udmFsdWUgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBub2RlIHVuaWZvcm0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGVVbmlmb3JtfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vZGVVbmlmb3JtID0gbm9kZVVuaWZvcm07XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogT3ZlcndyaXR0ZW4gdG8gcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgbm9kZSB1bmlmb3JtLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gVGhlIHZhbHVlLlxyXG5cdCAqL1xyXG5cdGdldFZhbHVlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm5vZGVVbmlmb3JtLnZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIG5vZGUgdW5pZm9ybSBkYXRhIHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBkYXRhIHR5cGUuXHJcblx0ICovXHJcblx0Z2V0VHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5ub2RlVW5pZm9ybS50eXBlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQSBzcGVjaWFsIGZvcm0gb2YgVmVjdG9yMyB1bmlmb3JtIGJpbmRpbmcgdHlwZS5cclxuICogSXQncyB2YWx1ZSBpcyBtYW5hZ2VkIGJ5IGEgbm9kZSBvYmplY3QuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBhdWdtZW50cyBWZWN0b3IzVW5pZm9ybVxyXG4gKi9cclxuY2xhc3MgVmVjdG9yM05vZGVVbmlmb3JtIGV4dGVuZHMgVmVjdG9yM1VuaWZvcm0ge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG5vZGUtYmFzZWQgVmVjdG9yMyB1bmlmb3JtLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlVW5pZm9ybX0gbm9kZVVuaWZvcm0gLSBUaGUgbm9kZSB1bmlmb3JtLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBub2RlVW5pZm9ybSApIHtcclxuXHJcblx0XHRzdXBlciggbm9kZVVuaWZvcm0ubmFtZSwgbm9kZVVuaWZvcm0udmFsdWUgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBub2RlIHVuaWZvcm0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGVVbmlmb3JtfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vZGVVbmlmb3JtID0gbm9kZVVuaWZvcm07XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogT3ZlcndyaXR0ZW4gdG8gcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgbm9kZSB1bmlmb3JtLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gVGhlIHZhbHVlLlxyXG5cdCAqL1xyXG5cdGdldFZhbHVlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm5vZGVVbmlmb3JtLnZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIG5vZGUgdW5pZm9ybSBkYXRhIHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBkYXRhIHR5cGUuXHJcblx0ICovXHJcblx0Z2V0VHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5ub2RlVW5pZm9ybS50eXBlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQSBzcGVjaWFsIGZvcm0gb2YgVmVjdG9yNCB1bmlmb3JtIGJpbmRpbmcgdHlwZS5cclxuICogSXQncyB2YWx1ZSBpcyBtYW5hZ2VkIGJ5IGEgbm9kZSBvYmplY3QuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBhdWdtZW50cyBWZWN0b3I0VW5pZm9ybVxyXG4gKi9cclxuY2xhc3MgVmVjdG9yNE5vZGVVbmlmb3JtIGV4dGVuZHMgVmVjdG9yNFVuaWZvcm0ge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG5vZGUtYmFzZWQgVmVjdG9yNCB1bmlmb3JtLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlVW5pZm9ybX0gbm9kZVVuaWZvcm0gLSBUaGUgbm9kZSB1bmlmb3JtLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBub2RlVW5pZm9ybSApIHtcclxuXHJcblx0XHRzdXBlciggbm9kZVVuaWZvcm0ubmFtZSwgbm9kZVVuaWZvcm0udmFsdWUgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBub2RlIHVuaWZvcm0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGVVbmlmb3JtfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vZGVVbmlmb3JtID0gbm9kZVVuaWZvcm07XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogT3ZlcndyaXR0ZW4gdG8gcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgbm9kZSB1bmlmb3JtLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7VmVjdG9yNH0gVGhlIHZhbHVlLlxyXG5cdCAqL1xyXG5cdGdldFZhbHVlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm5vZGVVbmlmb3JtLnZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIG5vZGUgdW5pZm9ybSBkYXRhIHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBkYXRhIHR5cGUuXHJcblx0ICovXHJcblx0Z2V0VHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5ub2RlVW5pZm9ybS50eXBlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQSBzcGVjaWFsIGZvcm0gb2YgQ29sb3IgdW5pZm9ybSBiaW5kaW5nIHR5cGUuXHJcbiAqIEl0J3MgdmFsdWUgaXMgbWFuYWdlZCBieSBhIG5vZGUgb2JqZWN0LlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAYXVnbWVudHMgQ29sb3JVbmlmb3JtXHJcbiAqL1xyXG5jbGFzcyBDb2xvck5vZGVVbmlmb3JtIGV4dGVuZHMgQ29sb3JVbmlmb3JtIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBub2RlLWJhc2VkIENvbG9yIHVuaWZvcm0uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVVbmlmb3JtfSBub2RlVW5pZm9ybSAtIFRoZSBub2RlIHVuaWZvcm0uXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5vZGVVbmlmb3JtICkge1xyXG5cclxuXHRcdHN1cGVyKCBub2RlVW5pZm9ybS5uYW1lLCBub2RlVW5pZm9ybS52YWx1ZSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG5vZGUgdW5pZm9ybS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZVVuaWZvcm19XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9kZVVuaWZvcm0gPSBub2RlVW5pZm9ybTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBPdmVyd3JpdHRlbiB0byByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBub2RlIHVuaWZvcm0uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtDb2xvcn0gVGhlIHZhbHVlLlxyXG5cdCAqL1xyXG5cdGdldFZhbHVlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm5vZGVVbmlmb3JtLnZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIG5vZGUgdW5pZm9ybSBkYXRhIHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBkYXRhIHR5cGUuXHJcblx0ICovXHJcblx0Z2V0VHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5ub2RlVW5pZm9ybS50eXBlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5cclxuLyoqXHJcbiAqIEEgc3BlY2lhbCBmb3JtIG9mIE1hdHJpeDIgdW5pZm9ybSBiaW5kaW5nIHR5cGUuXHJcbiAqIEl0J3MgdmFsdWUgaXMgbWFuYWdlZCBieSBhIG5vZGUgb2JqZWN0LlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAYXVnbWVudHMgTWF0cml4MlVuaWZvcm1cclxuICovXHJcbmNsYXNzIE1hdHJpeDJOb2RlVW5pZm9ybSBleHRlbmRzIE1hdHJpeDJVbmlmb3JtIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBub2RlLWJhc2VkIE1hdHJpeDIgdW5pZm9ybS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZVVuaWZvcm19IG5vZGVVbmlmb3JtIC0gVGhlIG5vZGUgdW5pZm9ybS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggbm9kZVVuaWZvcm0gKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5vZGVVbmlmb3JtLm5hbWUsIG5vZGVVbmlmb3JtLnZhbHVlICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbm9kZSB1bmlmb3JtLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlVW5pZm9ybX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub2RlVW5pZm9ybSA9IG5vZGVVbmlmb3JtO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE92ZXJ3cml0dGVuIHRvIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIG5vZGUgdW5pZm9ybS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDJ9IFRoZSB2YWx1ZS5cclxuXHQgKi9cclxuXHRnZXRWYWx1ZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5ub2RlVW5pZm9ybS52YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBub2RlIHVuaWZvcm0gZGF0YSB0eXBlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgZGF0YSB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldFR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubm9kZVVuaWZvcm0udHlwZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIEEgc3BlY2lhbCBmb3JtIG9mIE1hdHJpeDMgdW5pZm9ybSBiaW5kaW5nIHR5cGUuXHJcbiAqIEl0J3MgdmFsdWUgaXMgbWFuYWdlZCBieSBhIG5vZGUgb2JqZWN0LlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAYXVnbWVudHMgTWF0cml4M1VuaWZvcm1cclxuICovXHJcbmNsYXNzIE1hdHJpeDNOb2RlVW5pZm9ybSBleHRlbmRzIE1hdHJpeDNVbmlmb3JtIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBub2RlLWJhc2VkIE1hdHJpeDMgdW5pZm9ybS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZVVuaWZvcm19IG5vZGVVbmlmb3JtIC0gVGhlIG5vZGUgdW5pZm9ybS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggbm9kZVVuaWZvcm0gKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5vZGVVbmlmb3JtLm5hbWUsIG5vZGVVbmlmb3JtLnZhbHVlICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbm9kZSB1bmlmb3JtLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlVW5pZm9ybX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub2RlVW5pZm9ybSA9IG5vZGVVbmlmb3JtO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE92ZXJ3cml0dGVuIHRvIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIG5vZGUgdW5pZm9ybS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDN9IFRoZSB2YWx1ZS5cclxuXHQgKi9cclxuXHRnZXRWYWx1ZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5ub2RlVW5pZm9ybS52YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBub2RlIHVuaWZvcm0gZGF0YSB0eXBlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgZGF0YSB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldFR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubm9kZVVuaWZvcm0udHlwZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIEEgc3BlY2lhbCBmb3JtIG9mIE1hdHJpeDQgdW5pZm9ybSBiaW5kaW5nIHR5cGUuXHJcbiAqIEl0J3MgdmFsdWUgaXMgbWFuYWdlZCBieSBhIG5vZGUgb2JqZWN0LlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAYXVnbWVudHMgTWF0cml4NFVuaWZvcm1cclxuICovXHJcbmNsYXNzIE1hdHJpeDROb2RlVW5pZm9ybSBleHRlbmRzIE1hdHJpeDRVbmlmb3JtIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBub2RlLWJhc2VkIE1hdHJpeDQgdW5pZm9ybS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZVVuaWZvcm19IG5vZGVVbmlmb3JtIC0gVGhlIG5vZGUgdW5pZm9ybS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggbm9kZVVuaWZvcm0gKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5vZGVVbmlmb3JtLm5hbWUsIG5vZGVVbmlmb3JtLnZhbHVlICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbm9kZSB1bmlmb3JtLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlVW5pZm9ybX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub2RlVW5pZm9ybSA9IG5vZGVVbmlmb3JtO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE92ZXJ3cml0dGVuIHRvIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIG5vZGUgdW5pZm9ybS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDR9IFRoZSB2YWx1ZS5cclxuXHQgKi9cclxuXHRnZXRWYWx1ZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5ub2RlVW5pZm9ybS52YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBub2RlIHVuaWZvcm0gZGF0YSB0eXBlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgZGF0YSB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldFR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubm9kZVVuaWZvcm0udHlwZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHtcclxuXHROdW1iZXJOb2RlVW5pZm9ybSwgVmVjdG9yMk5vZGVVbmlmb3JtLCBWZWN0b3IzTm9kZVVuaWZvcm0sIFZlY3RvcjROb2RlVW5pZm9ybSxcclxuXHRDb2xvck5vZGVVbmlmb3JtLCBNYXRyaXgyTm9kZVVuaWZvcm0sIE1hdHJpeDNOb2RlVW5pZm9ybSwgTWF0cml4NE5vZGVVbmlmb3JtXHJcbn07XHJcbiIsImltcG9ydCBOb2RlVW5pZm9ybSBmcm9tICcuL05vZGVVbmlmb3JtLmpzJztcclxuaW1wb3J0IE5vZGVBdHRyaWJ1dGUgZnJvbSAnLi9Ob2RlQXR0cmlidXRlLmpzJztcclxuaW1wb3J0IE5vZGVWYXJ5aW5nIGZyb20gJy4vTm9kZVZhcnlpbmcuanMnO1xyXG5pbXBvcnQgTm9kZVZhciBmcm9tICcuL05vZGVWYXIuanMnO1xyXG5pbXBvcnQgTm9kZUNvZGUgZnJvbSAnLi9Ob2RlQ29kZS5qcyc7XHJcbmltcG9ydCBOb2RlQ2FjaGUgZnJvbSAnLi9Ob2RlQ2FjaGUuanMnO1xyXG5pbXBvcnQgUGFyYW1ldGVyTm9kZSBmcm9tICcuL1BhcmFtZXRlck5vZGUuanMnO1xyXG5pbXBvcnQgU3RydWN0VHlwZSBmcm9tICcuL1N0cnVjdFR5cGUuanMnO1xyXG5pbXBvcnQgRnVuY3Rpb25Ob2RlIGZyb20gJy4uL2NvZGUvRnVuY3Rpb25Ob2RlLmpzJztcclxuaW1wb3J0IE5vZGVNYXRlcmlhbCBmcm9tICcuLi8uLi9tYXRlcmlhbHMvbm9kZXMvTm9kZU1hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgZ2V0VHlwZUZyb21MZW5ndGggfSBmcm9tICcuL05vZGVVdGlscy5qcyc7XHJcbmltcG9ydCB7IE5vZGVVcGRhdGVUeXBlLCBkZWZhdWx0QnVpbGRTdGFnZXMsIHNoYWRlclN0YWdlcyB9IGZyb20gJy4vY29uc3RhbnRzLmpzJztcclxuXHJcbmltcG9ydCB7XHJcblx0TnVtYmVyTm9kZVVuaWZvcm0sIFZlY3RvcjJOb2RlVW5pZm9ybSwgVmVjdG9yM05vZGVVbmlmb3JtLCBWZWN0b3I0Tm9kZVVuaWZvcm0sXHJcblx0Q29sb3JOb2RlVW5pZm9ybSwgTWF0cml4Mk5vZGVVbmlmb3JtLCBNYXRyaXgzTm9kZVVuaWZvcm0sIE1hdHJpeDROb2RlVW5pZm9ybVxyXG59IGZyb20gJy4uLy4uL3JlbmRlcmVycy9jb21tb24vbm9kZXMvTm9kZVVuaWZvcm0uanMnO1xyXG5cclxuaW1wb3J0IHsgc3RhY2sgfSBmcm9tICcuL1N0YWNrTm9kZS5qcyc7XHJcbmltcG9ydCB7IGdldEN1cnJlbnRTdGFjaywgc2V0Q3VycmVudFN0YWNrIH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5cclxuaW1wb3J0IEN1YmVSZW5kZXJUYXJnZXQgZnJvbSAnLi4vLi4vcmVuZGVyZXJzL2NvbW1vbi9DdWJlUmVuZGVyVGFyZ2V0LmpzJztcclxuaW1wb3J0IENoYWluTWFwIGZyb20gJy4uLy4uL3JlbmRlcmVycy9jb21tb24vQ2hhaW5NYXAuanMnO1xyXG5cclxuaW1wb3J0IEJpbmRHcm91cCBmcm9tICcuLi8uLi9yZW5kZXJlcnMvY29tbW9uL0JpbmRHcm91cC5qcyc7XHJcblxyXG5pbXBvcnQgeyBSRVZJU0lPTiwgSW50VHlwZSwgVW5zaWduZWRJbnRUeXBlLCBMaW5lYXJGaWx0ZXIsIExpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXIsIE5lYXJlc3RNaXBtYXBMaW5lYXJGaWx0ZXIsIExpbmVhck1pcG1hcExpbmVhckZpbHRlciB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IFJlbmRlclRhcmdldCB9IGZyb20gJy4uLy4uL2NvcmUvUmVuZGVyVGFyZ2V0LmpzJztcclxuaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi8uLi9tYXRoL0NvbG9yLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMi5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3I0IH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3I0LmpzJztcclxuaW1wb3J0IHsgRmxvYXQxNkJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uLy4uL2NvcmUvQnVmZmVyQXR0cmlidXRlLmpzJztcclxuXHJcbmNvbnN0IHJlbmRlcmVyQ2FjaGUgPSBuZXcgV2Vha01hcCgpO1xyXG5cclxuY29uc3QgdHlwZUZyb21BcnJheSA9IG5ldyBNYXAoIFtcclxuXHRbIEludDhBcnJheSwgJ2ludCcgXSxcclxuXHRbIEludDE2QXJyYXksICdpbnQnIF0sXHJcblx0WyBJbnQzMkFycmF5LCAnaW50JyBdLFxyXG5cdFsgVWludDhBcnJheSwgJ3VpbnQnIF0sXHJcblx0WyBVaW50MTZBcnJheSwgJ3VpbnQnIF0sXHJcblx0WyBVaW50MzJBcnJheSwgJ3VpbnQnIF0sXHJcblx0WyBGbG9hdDMyQXJyYXksICdmbG9hdCcgXVxyXG5dICk7XHJcblxyXG5jb25zdCB0b0Zsb2F0ID0gKCB2YWx1ZSApID0+IHtcclxuXHJcblx0aWYgKCAvZS9nLnRlc3QoIHZhbHVlICkgKSB7XHJcblxyXG5cdFx0cmV0dXJuIFN0cmluZyggdmFsdWUgKS5yZXBsYWNlKCAvXFwrL2csICcnICk7XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0dmFsdWUgPSBOdW1iZXIoIHZhbHVlICk7XHJcblxyXG5cdFx0cmV0dXJuIHZhbHVlICsgKCB2YWx1ZSAlIDEgPyAnJyA6ICcuMCcgKTtcclxuXHJcblx0fVxyXG5cclxufTtcclxuXHJcbi8qKlxyXG4gKiBCYXNlIGNsYXNzIGZvciBidWlsZGVycyB3aGljaCBnZW5lcmF0ZSBhIHNoYWRlciBwcm9ncmFtIGJhc2VkXHJcbiAqIG9uIGEgM0Qgb2JqZWN0IGFuZCBpdHMgbm9kZSBtYXRlcmlhbCBkZWZpbml0aW9uLlxyXG4gKi9cclxuY2xhc3MgTm9kZUJ1aWxkZXIge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG5vZGUgYnVpbGRlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0M0R9IG9iamVjdCAtIFRoZSAzRCBvYmplY3QuXHJcblx0ICogQHBhcmFtIHtSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgY3VycmVudCByZW5kZXJlci5cclxuXHQgKiBAcGFyYW0ge05vZGVQYXJzZXJ9IHBhcnNlciAtIEEgcmVmZXJlbmNlIHRvIGEgbm9kZSBwYXJzZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG9iamVjdCwgcmVuZGVyZXIsIHBhcnNlciApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSAzRCBvYmplY3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdDNEfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm9iamVjdCA9IG9iamVjdDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBtYXRlcmlhbCBvZiB0aGUgM0Qgb2JqZWN0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/TWF0ZXJpYWx9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWF0ZXJpYWwgPSAoIG9iamVjdCAmJiBvYmplY3QubWF0ZXJpYWwgKSB8fCBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGdlb21ldHJ5IG9mIHRoZSAzRCBvYmplY3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9CdWZmZXJHZW9tZXRyeX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nZW9tZXRyeSA9ICggb2JqZWN0ICYmIG9iamVjdC5nZW9tZXRyeSApIHx8IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY3VycmVudCByZW5kZXJlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7UmVuZGVyZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIGEgbm9kZSBwYXJzZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGVQYXJzZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucGFyc2VyID0gcGFyc2VyO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHNjZW5lIHRoZSAzRCBvYmplY3QgYmVsb25ncyB0by5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1NjZW5lfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNjZW5lID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjYW1lcmEgdGhlIDNEIG9iamVjdCBpcyByZW5kZXJlZCB3aXRoLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Q2FtZXJhfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNhbWVyYSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGxpc3Qgb2YgYWxsIG5vZGVzIHRoZSBidWlsZGVyIGlzIHByb2Nlc3NpbmdcclxuXHRcdCAqIGZvciB0aGlzIDNEIG9iamVjdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8Tm9kZT59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9kZXMgPSBbXTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgbGlzdCBvZiBhbGwgc2VxdWVudGlhbCBub2Rlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8Tm9kZT59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2VxdWVudGlhbE5vZGVzID0gW107XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGxpc3Qgb2YgYWxsIG5vZGVzIHdoaWNoIHtAbGluayBOb2RlI3VwZGF0ZX0gbWV0aG9kIHNob3VsZCBiZSBleGVjdXRlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8Tm9kZT59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXBkYXRlTm9kZXMgPSBbXTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgbGlzdCBvZiBhbGwgbm9kZXMgd2hpY2gge0BsaW5rIE5vZGUjdXBkYXRlQmVmb3JlfSBtZXRob2Qgc2hvdWxkIGJlIGV4ZWN1dGVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxOb2RlPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51cGRhdGVCZWZvcmVOb2RlcyA9IFtdO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBsaXN0IG9mIGFsbCBub2RlcyB3aGljaCB7QGxpbmsgTm9kZSN1cGRhdGVBZnRlcn0gbWV0aG9kIHNob3VsZCBiZSBleGVjdXRlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8Tm9kZT59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXBkYXRlQWZ0ZXJOb2RlcyA9IFtdO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBkaWN0aW9uYXJ5IHRoYXQgYXNzaWducyBlYWNoIG5vZGUgdG8gYSB1bmlxdWUgaGFzaC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0PG51bWJlcixOb2RlPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5oYXNoTm9kZXMgPSB7fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIGEgbm9kZSBtYXRlcmlhbCBvYnNlcnZlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGVNYXRlcmlhbE9ic2VydmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm9ic2VydmVyID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGxpZ2h0cyBub2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/TGlnaHRzTm9kZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5saWdodHNOb2RlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGVudmlyb25tZW50IG5vZGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmVudmlyb25tZW50Tm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBmb2cgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P0ZvZ05vZGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZm9nTm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY3VycmVudCBjbGlwcGluZyBjb250ZXh0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Q2xpcHBpbmdDb250ZXh0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNsaXBwaW5nQ29udGV4dCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZ2VuZXJhdGVkIHZlcnRleCBzaGFkZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9zdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudmVydGV4U2hhZGVyID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBnZW5lcmF0ZWQgZnJhZ21lbnQgc2hhZGVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZyYWdtZW50U2hhZGVyID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBnZW5lcmF0ZWQgY29tcHV0ZSBzaGFkZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9zdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29tcHV0ZVNoYWRlciA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBOb2RlcyB1c2VkIGluIHRoZSBwcmltYXJ5IGZsb3cgb2YgY29kZSBnZW5lcmF0aW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLEFycmF5PE5vZGU+Pn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5mbG93Tm9kZXMgPSB7IHZlcnRleDogW10sIGZyYWdtZW50OiBbXSwgY29tcHV0ZTogW10gfTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIE5vZGVzIGNvZGUgZnJvbSBgLmZsb3dOb2Rlc2AuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdDxzdHJpbmcsc3RyaW5nPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5mbG93Q29kZSA9IHsgdmVydGV4OiAnJywgZnJhZ21lbnQ6ICcnLCBjb21wdXRlOiAnJyB9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBkaWN0aW9uYXJ5IGhvbGRzIHRoZSBub2RlIHVuaWZvcm1zIG9mIHRoZSBidWlsZGVyLlxyXG5cdFx0ICogVGhlIHVuaWZvcm1zIGFyZSBtYWludGFpbmVkIGluIGFuIGFycmF5IGZvciBlYWNoIHNoYWRlciBzdGFnZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVuaWZvcm1zID0geyB2ZXJ0ZXg6IFtdLCBmcmFnbWVudDogW10sIGNvbXB1dGU6IFtdLCBpbmRleDogMCB9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBkaWN0aW9uYXJ5IGhvbGRzIHRoZSBvdXRwdXQgc3RydWN0cyBvZiB0aGUgYnVpbGRlci5cclxuXHRcdCAqIFRoZSBzdHJ1Y3RzIGFyZSBtYWludGFpbmVkIGluIGFuIGFycmF5IGZvciBlYWNoIHNoYWRlciBzdGFnZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnN0cnVjdHMgPSB7IHZlcnRleDogW10sIGZyYWdtZW50OiBbXSwgY29tcHV0ZTogW10sIGluZGV4OiAwIH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGRpY3Rpb25hcnkgaG9sZHMgdGhlIGJpbmRpbmdzIGZvciBlYWNoIHNoYWRlciBzdGFnZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJpbmRpbmdzID0geyB2ZXJ0ZXg6IHt9LCBmcmFnbWVudDoge30sIGNvbXB1dGU6IHt9IH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGRpY3Rpb25hcnkgbWFpbnRhaW5zIHRoZSBiaW5kaW5nIGluZGljZXMgcGVyIGJpbmQgZ3JvdXAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5iaW5kaW5nc0luZGV4ZXMgPSB7fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlZmVyZW5jZSB0byB0aGUgYXJyYXkgb2YgYmluZCBncm91cHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9BcnJheTxCaW5kR3JvdXA+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJpbmRHcm91cHMgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBhcnJheSBob2xkcyB0aGUgbm9kZSBhdHRyaWJ1dGVzIG9mIHRoaXMgYnVpbGRlclxyXG5cdFx0ICogY3JlYXRlZCB2aWEge0BsaW5rIEF0dHJpYnV0ZU5vZGV9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxOb2RlQXR0cmlidXRlPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hdHRyaWJ1dGVzID0gW107XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBub2RlIGF0dHJpYnV0ZXMgb2YgdGhpcyBidWlsZGVyXHJcblx0XHQgKiBjcmVhdGVkIHZpYSB7QGxpbmsgQnVmZmVyQXR0cmlidXRlTm9kZX0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PE5vZGVBdHRyaWJ1dGU+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJ1ZmZlckF0dHJpYnV0ZXMgPSBbXTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgYXJyYXkgaG9sZHMgdGhlIG5vZGUgdmFyeWluZ3Mgb2YgdGhpcyBidWlsZGVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxOb2RlVmFyeWluZz59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudmFyeWluZ3MgPSBbXTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZGljdGlvbmFyeSBob2xkcyB0aGUgKG5hdGl2ZSkgbm9kZSBjb2RlcyBvZiB0aGlzIGJ1aWxkZXIuXHJcblx0XHQgKiBUaGUgY29kZXMgYXJlIG1haW50YWluZWQgaW4gYW4gYXJyYXkgZm9yIGVhY2ggc2hhZGVyIHN0YWdlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLEFycmF5PE5vZGVDb2RlPj59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29kZXMgPSB7fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZGljdGlvbmFyeSBob2xkcyB0aGUgbm9kZSB2YXJpYWJsZXMgb2YgdGhpcyBidWlsZGVyLlxyXG5cdFx0ICogVGhlIHZhcmlhYmxlcyBhcmUgbWFpbnRhaW5lZCBpbiBhbiBhcnJheSBmb3IgZWFjaCBzaGFkZXIgc3RhZ2UuXHJcblx0XHQgKiBUaGlzIGRpY3Rpb25hcnkgaXMgYWxzbyB1c2VkIHRvIGNvdW50IHRoZSBudW1iZXIgb2YgdmFyaWFibGVzXHJcblx0XHQgKiBhY2NvcmRpbmcgdG8gdGhlaXIgdHlwZSAoY29uc3QsIHZhcnMpLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLEFycmF5PE5vZGVWYXI+fG51bWJlcj59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudmFycyA9IHt9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBkaWN0aW9uYXJ5IGhvbGRzIHRoZSBkZWNsYXJhdGlvbnMgZm9yIGVhY2ggc2hhZGVyIHN0YWdlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGVjbGFyYXRpb25zID0ge307XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDdXJyZW50IGNvZGUgZmxvdy5cclxuXHRcdCAqIEFsbCBjb2RlIGdlbmVyYXRlZCBpbiB0aGlzIHN0YWNrIHdpbGwgYmUgc3RvcmVkIGluIGAuZmxvd2AuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3tjb2RlOiBzdHJpbmd9fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZsb3cgPSB7IGNvZGU6ICcnIH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGNoYWluIG9mIG5vZGVzLlxyXG5cdFx0ICogVXNlZCB0byBjaGVjayByZWN1cnNpdmUgY2FsbHMgaW4gbm9kZS1ncmFwaC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8Tm9kZT59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2hhaW5pbmcgPSBbXTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjdXJyZW50IHN0YWNrLlxyXG5cdFx0ICogVGhpcyByZWZsZWN0cyB0aGUgY3VycmVudCBwcm9jZXNzIGluIHRoZSBjb2RlIGJsb2NrIGhpZXJhcmNoeSxcclxuXHRcdCAqIGl0IGlzIHVzZWZ1bCB0byBrbm93IGlmIHRoZSBjdXJyZW50IHByb2Nlc3MgaXMgaW5zaWRlIGEgY29uZGl0aW9uYWwgZm9yIGV4YW1wbGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1N0YWNrTm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zdGFjayA9IHN0YWNrKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBMaXN0IG9mIHN0YWNrIG5vZGVzLlxyXG5cdFx0ICogVGhlIGN1cnJlbnQgc3RhY2sgaGllcmFyY2h5IGlzIHN0b3JlZCBpbiBhbiBhcnJheS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8U3RhY2tOb2RlPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zdGFja3MgPSBbXTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgdGFiIHZhbHVlLiBVc2VkIGZvciBzaGFkZXIgc3RyaW5nIGdlbmVyYXRpb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqIEBkZWZhdWx0ICdcXHQnXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudGFiID0gJ1xcdCc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgZnVuY3Rpb24gbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P0Z1bmN0aW9uTm9kZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jdXJyZW50RnVuY3Rpb25Ob2RlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBidWlsZGVyJ3MgY29udGV4dC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvbnRleHQgPSB7XHJcblx0XHRcdG1hdGVyaWFsOiB0aGlzLm1hdGVyaWFsXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGJ1aWxkZXIncyBjYWNoZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZUNhY2hlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNhY2hlID0gbmV3IE5vZGVDYWNoZSgpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU2luY2UgdGhlIHtAbGluayBOb2RlQnVpbGRlciNjYWNoZX0gbWlnaHQgYmUgdGVtcG9yYXJpbHlcclxuXHRcdCAqIG92ZXJ3cml0dGVuIGJ5IG90aGVyIGNhY2hlcywgdGhpcyBtZW1iZXIgcmV0YWlucyB0aGUgcmVmZXJlbmNlXHJcblx0XHQgKiB0byB0aGUgYnVpbGRlcidzIG93biBjYWNoZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZUNhY2hlfVxyXG5cdFx0ICogQGRlZmF1bHQgdGhpcy5jYWNoZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdsb2JhbENhY2hlID0gdGhpcy5jYWNoZTtcclxuXHJcblx0XHR0aGlzLmZsb3dzRGF0YSA9IG5ldyBXZWFrTWFwKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY3VycmVudCBzaGFkZXIgc3RhZ2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez8oJ3ZlcnRleCd8J2ZyYWdtZW50J3wnY29tcHV0ZSd8J2FueScpfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNoYWRlclN0YWdlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjdXJyZW50IGJ1aWxkIHN0YWdlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/KCdzZXR1cCd8J2FuYWx5emUnfCdnZW5lcmF0ZScpfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJ1aWxkU3RhZ2UgPSBudWxsO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGJpbmQgZ3JvdXBzIG9mIHRoZSBjdXJyZW50IHJlbmRlcmVyLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Q2hhaW5NYXB9IFRoZSBjYWNoZS5cclxuXHQgKi9cclxuXHRnZXRCaW5kR3JvdXBzQ2FjaGUoKSB7XHJcblxyXG5cdFx0bGV0IGJpbmRHcm91cHNDYWNoZSA9IHJlbmRlcmVyQ2FjaGUuZ2V0KCB0aGlzLnJlbmRlcmVyICk7XHJcblxyXG5cdFx0aWYgKCBiaW5kR3JvdXBzQ2FjaGUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGJpbmRHcm91cHNDYWNoZSA9IG5ldyBDaGFpbk1hcCgpO1xyXG5cclxuXHRcdFx0cmVuZGVyZXJDYWNoZS5zZXQoIHRoaXMucmVuZGVyZXIsIGJpbmRHcm91cHNDYWNoZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gYmluZEdyb3Vwc0NhY2hlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgUmVuZGVyVGFyZ2V0fSB3aXRoIHRoZSBnaXZlblxyXG5cdCAqIGRpbWVuc2lvbnMgYW5kIG9wdGlvbnMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIHJlbmRlciB0YXJnZXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIHJlbmRlciB0YXJnZXQuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBvZiB0aGUgcmVuZGVyIHRhcmdldC5cclxuXHQgKiBAcmV0dXJuIHtSZW5kZXJUYXJnZXR9IFRoZSByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqL1xyXG5cdGNyZWF0ZVJlbmRlclRhcmdldCggd2lkdGgsIGhlaWdodCwgb3B0aW9ucyApIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IFJlbmRlclRhcmdldCggd2lkdGgsIGhlaWdodCwgb3B0aW9ucyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgQ3ViZVJlbmRlclRhcmdldH0gd2l0aCB0aGUgZ2l2ZW5cclxuXHQgKiBkaW1lbnNpb25zIGFuZCBvcHRpb25zLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHNpemUgLSBUaGUgc2l6ZSBvZiB0aGUgY3ViZSByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgb2YgdGhlIGN1YmUgcmVuZGVyIHRhcmdldC5cclxuXHQgKiBAcmV0dXJuIHtDdWJlUmVuZGVyVGFyZ2V0fSBUaGUgY3ViZSByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqL1xyXG5cdGNyZWF0ZUN1YmVSZW5kZXJUYXJnZXQoIHNpemUsIG9wdGlvbnMgKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBDdWJlUmVuZGVyVGFyZ2V0KCBzaXplLCBvcHRpb25zICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogV2hldGhlciB0aGUgZ2l2ZW4gbm9kZSBpcyBpbmNsdWRlZCBpbiB0aGUgaW50ZXJuYWwgYXJyYXkgb2Ygbm9kZXMgb3Igbm90LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIG5vZGUgdG8gdGVzdC5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBnaXZlbiBub2RlIGlzIGluY2x1ZGVkIGluIHRoZSBpbnRlcm5hbCBhcnJheSBvZiBub2RlcyBvciBub3QuXHJcblx0ICovXHJcblx0aW5jbHVkZXMoIG5vZGUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubm9kZXMuaW5jbHVkZXMoIG5vZGUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBvdXRwdXQgc3RydWN0IG5hbWUgd2hpY2ggaXMgcmVxdWlyZWQgYnlcclxuXHQgKiB7QGxpbmsgT3V0cHV0U3RydWN0Tm9kZX0uXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBuYW1lIG9mIHRoZSBvdXRwdXQgc3RydWN0LlxyXG5cdCAqL1xyXG5cdGdldE91dHB1dFN0cnVjdE5hbWUoKSB7fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgYmluZCBncm91cCBmb3IgdGhlIGdpdmVuIGdyb3VwIG5hbWUgYW5kIGJpbmRpbmcuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBncm91cE5hbWUgLSBUaGUgZ3JvdXAgbmFtZS5cclxuXHQgKiBAcGFyYW0ge0FycmF5PE5vZGVVbmlmb3Jtc0dyb3VwPn0gYmluZGluZ3MgLSBMaXN0IG9mIGJpbmRpbmdzLlxyXG5cdCAqIEByZXR1cm4ge0JpbmRHcm91cH0gVGhlIGJpbmQgZ3JvdXBcclxuXHQgKi9cclxuXHRfZ2V0QmluZEdyb3VwKCBncm91cE5hbWUsIGJpbmRpbmdzICkge1xyXG5cclxuXHRcdGNvbnN0IGJpbmRHcm91cHNDYWNoZSA9IHRoaXMuZ2V0QmluZEdyb3Vwc0NhY2hlKCk7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCBiaW5kaW5nc0FycmF5ID0gW107XHJcblxyXG5cdFx0bGV0IHNoYXJlZEdyb3VwID0gdHJ1ZTtcclxuXHJcblx0XHRmb3IgKCBjb25zdCBiaW5kaW5nIG9mIGJpbmRpbmdzICkge1xyXG5cclxuXHRcdFx0YmluZGluZ3NBcnJheS5wdXNoKCBiaW5kaW5nICk7XHJcblxyXG5cdFx0XHRzaGFyZWRHcm91cCA9IHNoYXJlZEdyb3VwICYmIGJpbmRpbmcuZ3JvdXBOb2RlLnNoYXJlZCAhPT0gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRsZXQgYmluZEdyb3VwO1xyXG5cclxuXHRcdGlmICggc2hhcmVkR3JvdXAgKSB7XHJcblxyXG5cdFx0XHRiaW5kR3JvdXAgPSBiaW5kR3JvdXBzQ2FjaGUuZ2V0KCBiaW5kaW5nc0FycmF5ICk7XHJcblxyXG5cdFx0XHRpZiAoIGJpbmRHcm91cCA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRiaW5kR3JvdXAgPSBuZXcgQmluZEdyb3VwKCBncm91cE5hbWUsIGJpbmRpbmdzQXJyYXksIHRoaXMuYmluZGluZ3NJbmRleGVzWyBncm91cE5hbWUgXS5ncm91cCwgYmluZGluZ3NBcnJheSApO1xyXG5cclxuXHRcdFx0XHRiaW5kR3JvdXBzQ2FjaGUuc2V0KCBiaW5kaW5nc0FycmF5LCBiaW5kR3JvdXAgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0YmluZEdyb3VwID0gbmV3IEJpbmRHcm91cCggZ3JvdXBOYW1lLCBiaW5kaW5nc0FycmF5LCB0aGlzLmJpbmRpbmdzSW5kZXhlc1sgZ3JvdXBOYW1lIF0uZ3JvdXAsIGJpbmRpbmdzQXJyYXkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGJpbmRHcm91cDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGFuIGFycmF5IG9mIG5vZGUgdW5pZm9ybSBncm91cHMgZm9yIHRoZSBnaXZlbiBncm91cCBuYW1lIGFuZCBzaGFkZXIgc3RhZ2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gZ3JvdXBOYW1lIC0gVGhlIGdyb3VwIG5hbWUuXHJcblx0ICogQHBhcmFtIHsoJ3ZlcnRleCd8J2ZyYWdtZW50J3wnY29tcHV0ZSd8J2FueScpfSBzaGFkZXJTdGFnZSAtIFRoZSBzaGFkZXIgc3RhZ2UuXHJcblx0ICogQHJldHVybiB7QXJyYXk8Tm9kZVVuaWZvcm1zR3JvdXA+fSBUaGUgYXJyYXkgb2Ygbm9kZSB1bmlmb3JtIGdyb3Vwcy5cclxuXHQgKi9cclxuXHRnZXRCaW5kR3JvdXBBcnJheSggZ3JvdXBOYW1lLCBzaGFkZXJTdGFnZSApIHtcclxuXHJcblx0XHRjb25zdCBiaW5kaW5ncyA9IHRoaXMuYmluZGluZ3NbIHNoYWRlclN0YWdlIF07XHJcblxyXG5cdFx0bGV0IGJpbmRHcm91cCA9IGJpbmRpbmdzWyBncm91cE5hbWUgXTtcclxuXHJcblx0XHRpZiAoIGJpbmRHcm91cCA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLmJpbmRpbmdzSW5kZXhlc1sgZ3JvdXBOYW1lIF0gPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5iaW5kaW5nc0luZGV4ZXNbIGdyb3VwTmFtZSBdID0geyBiaW5kaW5nOiAwLCBncm91cDogT2JqZWN0LmtleXMoIHRoaXMuYmluZGluZ3NJbmRleGVzICkubGVuZ3RoIH07XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRiaW5kaW5nc1sgZ3JvdXBOYW1lIF0gPSBiaW5kR3JvdXAgPSBbXTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGJpbmRHcm91cDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbGlzdCBiaW5kaW5ncyBvZiBhbGwgc2hhZGVyIHN0YWdlcyBzZXBhcmF0ZWQgYnkgZ3JvdXBzLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7QXJyYXk8QmluZEdyb3VwPn0gVGhlIGxpc3Qgb2YgYmluZGluZ3MuXHJcblx0ICovXHJcblx0Z2V0QmluZGluZ3MoKSB7XHJcblxyXG5cdFx0bGV0IGJpbmRpbmdzR3JvdXBzID0gdGhpcy5iaW5kR3JvdXBzO1xyXG5cclxuXHRcdGlmICggYmluZGluZ3NHcm91cHMgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBncm91cHMgPSB7fTtcclxuXHRcdFx0Y29uc3QgYmluZGluZ3MgPSB0aGlzLmJpbmRpbmdzO1xyXG5cclxuXHRcdFx0Zm9yICggY29uc3Qgc2hhZGVyU3RhZ2Ugb2Ygc2hhZGVyU3RhZ2VzICkge1xyXG5cclxuXHRcdFx0XHRmb3IgKCBjb25zdCBncm91cE5hbWUgaW4gYmluZGluZ3NbIHNoYWRlclN0YWdlIF0gKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgdW5pZm9ybXMgPSBiaW5kaW5nc1sgc2hhZGVyU3RhZ2UgXVsgZ3JvdXBOYW1lIF07XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgZ3JvdXBVbmlmb3JtcyA9IGdyb3Vwc1sgZ3JvdXBOYW1lIF0gfHwgKCBncm91cHNbIGdyb3VwTmFtZSBdID0gW10gKTtcclxuXHRcdFx0XHRcdGdyb3VwVW5pZm9ybXMucHVzaCggLi4udW5pZm9ybXMgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0YmluZGluZ3NHcm91cHMgPSBbXTtcclxuXHJcblx0XHRcdGZvciAoIGNvbnN0IGdyb3VwTmFtZSBpbiBncm91cHMgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGdyb3VwID0gZ3JvdXBzWyBncm91cE5hbWUgXTtcclxuXHJcblx0XHRcdFx0Y29uc3QgYmluZGluZ3NHcm91cCA9IHRoaXMuX2dldEJpbmRHcm91cCggZ3JvdXBOYW1lLCBncm91cCApO1xyXG5cclxuXHRcdFx0XHRiaW5kaW5nc0dyb3Vwcy5wdXNoKCBiaW5kaW5nc0dyb3VwICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0aGlzLmJpbmRHcm91cHMgPSBiaW5kaW5nc0dyb3VwcztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGJpbmRpbmdzR3JvdXBzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNvcnRzIHRoZSBiaW5kIGdyb3VwcyBhbmQgdXBkYXRlcyB7QGxpbmsgTm9kZUJ1aWxkZXIjYmluZGluZ3NJbmRleGVzfS5cclxuXHQgKi9cclxuXHRzb3J0QmluZGluZ0dyb3VwcygpIHtcclxuXHJcblx0XHRjb25zdCBiaW5kaW5nc0dyb3VwcyA9IHRoaXMuZ2V0QmluZGluZ3MoKTtcclxuXHJcblx0XHRiaW5kaW5nc0dyb3Vwcy5zb3J0KCAoIGEsIGIgKSA9PiAoIGEuYmluZGluZ3NbIDAgXS5ncm91cE5vZGUub3JkZXIgLSBiLmJpbmRpbmdzWyAwIF0uZ3JvdXBOb2RlLm9yZGVyICkgKTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBiaW5kaW5nc0dyb3Vwcy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBiaW5kaW5nR3JvdXAgPSBiaW5kaW5nc0dyb3Vwc1sgaSBdO1xyXG5cdFx0XHR0aGlzLmJpbmRpbmdzSW5kZXhlc1sgYmluZGluZ0dyb3VwLm5hbWUgXS5ncm91cCA9IGk7XHJcblxyXG5cdFx0XHRiaW5kaW5nR3JvdXAuaW5kZXggPSBpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgYnVpbGRlciBtYWludGFpbnMgZWFjaCBub2RlIGluIGEgaGFzaC1iYXNlZCBkaWN0aW9uYXJ5LlxyXG5cdCAqIFRoaXMgbWV0aG9kIHNldHMgdGhlIGdpdmVuIG5vZGUgKHZhbHVlKSB3aXRoIHRoZSBnaXZlbiBoYXNoIChrZXkpIGludG8gdGhpcyBkaWN0aW9uYXJ5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIG5vZGUgdG8gYWRkLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBoYXNoIC0gVGhlIGhhc2ggb2YgdGhlIG5vZGUuXHJcblx0ICovXHJcblx0c2V0SGFzaE5vZGUoIG5vZGUsIGhhc2ggKSB7XHJcblxyXG5cdFx0dGhpcy5oYXNoTm9kZXNbIGhhc2ggXSA9IG5vZGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyBhIG5vZGUgdG8gdGhpcyBidWlsZGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIG5vZGUgdG8gYWRkLlxyXG5cdCAqL1xyXG5cdGFkZE5vZGUoIG5vZGUgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5vZGVzLmluY2x1ZGVzKCBub2RlICkgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0dGhpcy5ub2Rlcy5wdXNoKCBub2RlICk7XHJcblxyXG5cdFx0XHR0aGlzLnNldEhhc2hOb2RlKCBub2RlLCBub2RlLmdldEhhc2goIHRoaXMgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJdCBpcyB1c2VkIHRvIGFkZCBOb2RlcyB0aGF0IHdpbGwgYmUgdXNlZCBhcyBGUkFNRSBhbmQgUkVOREVSIGV2ZW50cyxcclxuXHQgKiBhbmQgbmVlZCB0byBmb2xsb3cgYSBjZXJ0YWluIHNlcXVlbmNlIGluIHRoZSBjYWxscyB0byB3b3JrIGNvcnJlY3RseS5cclxuXHQgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgJ3NldHVwKCknIGluIHRoZSAnYnVpbGQoKScgcHJvY2VzcyB0byBlbnN1cmUgdGhhdCB0aGUgY2hpbGQgbm9kZXMgYXJlIHByb2Nlc3NlZCBmaXJzdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFRoZSBub2RlIHRvIGFkZC5cclxuXHQgKi9cclxuXHRhZGRTZXF1ZW50aWFsTm9kZSggbm9kZSApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuc2VxdWVudGlhbE5vZGVzLmluY2x1ZGVzKCBub2RlICkgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0dGhpcy5zZXF1ZW50aWFsTm9kZXMucHVzaCggbm9kZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDaGVja3MgdGhlIHVwZGF0ZSB0eXBlcyBvZiBub2Rlc1xyXG5cdCAqL1xyXG5cdGJ1aWxkVXBkYXRlTm9kZXMoKSB7XHJcblxyXG5cdFx0Zm9yICggY29uc3Qgbm9kZSBvZiB0aGlzLm5vZGVzICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdXBkYXRlVHlwZSA9IG5vZGUuZ2V0VXBkYXRlVHlwZSgpO1xyXG5cclxuXHRcdFx0aWYgKCB1cGRhdGVUeXBlICE9PSBOb2RlVXBkYXRlVHlwZS5OT05FICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLnVwZGF0ZU5vZGVzLnB1c2goIG5vZGUuZ2V0U2VsZigpICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZvciAoIGNvbnN0IG5vZGUgb2YgdGhpcy5zZXF1ZW50aWFsTm9kZXMgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB1cGRhdGVCZWZvcmVUeXBlID0gbm9kZS5nZXRVcGRhdGVCZWZvcmVUeXBlKCk7XHJcblx0XHRcdGNvbnN0IHVwZGF0ZUFmdGVyVHlwZSA9IG5vZGUuZ2V0VXBkYXRlQWZ0ZXJUeXBlKCk7XHJcblxyXG5cdFx0XHRpZiAoIHVwZGF0ZUJlZm9yZVR5cGUgIT09IE5vZGVVcGRhdGVUeXBlLk5PTkUgKSB7XHJcblxyXG5cdFx0XHRcdHRoaXMudXBkYXRlQmVmb3JlTm9kZXMucHVzaCggbm9kZS5nZXRTZWxmKCkgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggdXBkYXRlQWZ0ZXJUeXBlICE9PSBOb2RlVXBkYXRlVHlwZS5OT05FICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLnVwZGF0ZUFmdGVyTm9kZXMucHVzaCggbm9kZS5nZXRTZWxmKCkgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQSByZWZlcmVuY2UgdGhlIGN1cnJlbnQgbm9kZSB3aGljaCBpcyB0aGVcclxuXHQgKiBsYXN0IG5vZGUgaW4gdGhlIGNoYWluIG9mIG5vZGVzLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge05vZGV9XHJcblx0ICovXHJcblx0Z2V0IGN1cnJlbnROb2RlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmNoYWluaW5nWyB0aGlzLmNoYWluaW5nLmxlbmd0aCAtIDEgXTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBXaGV0aGVyIHRoZSBnaXZlbiB0ZXh0dXJlIGlzIGZpbHRlcmVkIG9yIG5vdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlIHRvIGNoZWNrLlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGdpdmVuIHRleHR1cmUgaXMgZmlsdGVyZWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGlzRmlsdGVyZWRUZXh0dXJlKCB0ZXh0dXJlICkge1xyXG5cclxuXHRcdHJldHVybiAoIHRleHR1cmUubWFnRmlsdGVyID09PSBMaW5lYXJGaWx0ZXIgfHwgdGV4dHVyZS5tYWdGaWx0ZXIgPT09IExpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXIgfHwgdGV4dHVyZS5tYWdGaWx0ZXIgPT09IE5lYXJlc3RNaXBtYXBMaW5lYXJGaWx0ZXIgfHwgdGV4dHVyZS5tYWdGaWx0ZXIgPT09IExpbmVhck1pcG1hcExpbmVhckZpbHRlciB8fFxyXG5cdFx0XHR0ZXh0dXJlLm1pbkZpbHRlciA9PT0gTGluZWFyRmlsdGVyIHx8IHRleHR1cmUubWluRmlsdGVyID09PSBMaW5lYXJNaXBtYXBOZWFyZXN0RmlsdGVyIHx8IHRleHR1cmUubWluRmlsdGVyID09PSBOZWFyZXN0TWlwbWFwTGluZWFyRmlsdGVyIHx8IHRleHR1cmUubWluRmlsdGVyID09PSBMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIHRoZSBnaXZlbiBub2RlIHRvIHRoZSBpbnRlcm5hbCBub2RlIGNoYWluLlxyXG5cdCAqIFRoaXMgaXMgdXNlZCB0byBjaGVjayByZWN1cnNpdmUgY2FsbHMgaW4gbm9kZS1ncmFwaC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFRoZSBub2RlIHRvIGFkZC5cclxuXHQgKi9cclxuXHRhZGRDaGFpbiggbm9kZSApIHtcclxuXHJcblx0XHQvKlxyXG5cdFx0aWYgKCB0aGlzLmNoYWluaW5nLmluZGV4T2YoIG5vZGUgKSAhPT0gLSAxICkge1xyXG5cclxuXHRcdFx0Y29uc29sZS53YXJuKCAnUmVjdXJzaXZlIG5vZGU6ICcsIG5vZGUgKTtcclxuXHJcblx0XHR9XHJcblx0XHQqL1xyXG5cclxuXHRcdHRoaXMuY2hhaW5pbmcucHVzaCggbm9kZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbW92ZXMgdGhlIGdpdmVuIG5vZGUgZnJvbSB0aGUgaW50ZXJuYWwgbm9kZSBjaGFpbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFRoZSBub2RlIHRvIHJlbW92ZS5cclxuXHQgKi9cclxuXHRyZW1vdmVDaGFpbiggbm9kZSApIHtcclxuXHJcblx0XHRjb25zdCBsYXN0Q2hhaW4gPSB0aGlzLmNoYWluaW5nLnBvcCgpO1xyXG5cclxuXHRcdGlmICggbGFzdENoYWluICE9PSBub2RlICkge1xyXG5cclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnTm9kZUJ1aWxkZXI6IEludmFsaWQgbm9kZSBjaGFpbmluZyEnICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIG5hdGl2ZSBzaGFkZXIgbWV0aG9kIG5hbWUgZm9yIGEgZ2l2ZW4gZ2VuZXJpYyBuYW1lLiBFLmcuXHJcblx0ICogdGhlIG1ldGhvZCBuYW1lIGB0ZXh0dXJlRGltZW5zaW9uc2AgbWF0Y2hlcyB0aGUgV0dTTCBuYW1lIGJ1dCBtdXN0IGJlXHJcblx0ICogcmVzb2x2ZWQgdG8gYHRleHR1cmVTaXplYCBpbiBHTFNMLlxyXG5cdCAqXHJcblx0ICogQGFic3RyYWN0XHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZCAtIFRoZSBtZXRob2QgbmFtZSB0byByZXNvbHZlLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHJlc29sdmVkIG1ldGhvZCBuYW1lLlxyXG5cdCAqL1xyXG5cdGdldE1ldGhvZCggbWV0aG9kICkge1xyXG5cclxuXHRcdHJldHVybiBtZXRob2Q7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIG5vZGUgZm9yIHRoZSBnaXZlbiBoYXNoLCBzZWUge0BsaW5rIE5vZGVCdWlsZGVyI3NldEhhc2hOb2RlfS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBoYXNoIC0gVGhlIGhhc2ggb2YgdGhlIG5vZGUuXHJcblx0ICogQHJldHVybiB7Tm9kZX0gVGhlIGZvdW5kIG5vZGUuXHJcblx0ICovXHJcblx0Z2V0Tm9kZUZyb21IYXNoKCBoYXNoICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmhhc2hOb2Rlc1sgaGFzaCBdO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgdGhlIE5vZGUgdG8gYSB0YXJnZXQgZmxvdyBzbyB0aGF0IGl0IGNhbiBnZW5lcmF0ZSBjb2RlIGluIHRoZSAnZ2VuZXJhdGUnIHByb2Nlc3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geygndmVydGV4J3wnZnJhZ21lbnQnfCdjb21wdXRlJyl9IHNoYWRlclN0YWdlIC0gVGhlIHNoYWRlciBzdGFnZS5cclxuXHQgKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBUaGUgbm9kZSB0byBhZGQuXHJcblx0ICogQHJldHVybiB7Tm9kZX0gVGhlIG5vZGUuXHJcblx0ICovXHJcblx0YWRkRmxvdyggc2hhZGVyU3RhZ2UsIG5vZGUgKSB7XHJcblxyXG5cdFx0dGhpcy5mbG93Tm9kZXNbIHNoYWRlclN0YWdlIF0ucHVzaCggbm9kZSApO1xyXG5cclxuXHRcdHJldHVybiBub2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgYnVpbGRlcidzIGNvbnRleHQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dCAtIFRoZSBjb250ZXh0IHRvIHNldC5cclxuXHQgKi9cclxuXHRzZXRDb250ZXh0KCBjb250ZXh0ICkge1xyXG5cclxuXHRcdHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgYnVpbGRlcidzIGN1cnJlbnQgY29udGV4dC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge09iamVjdH0gVGhlIGJ1aWxkZXIncyBjdXJyZW50IGNvbnRleHQuXHJcblx0ICovXHJcblx0Z2V0Q29udGV4dCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5jb250ZXh0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdldHMgYSBjb250ZXh0IHVzZWQgaW4gc2hhZGVyIGNvbnN0cnVjdGlvbiB0aGF0IGNhbiBiZSBzaGFyZWQgYWNyb3NzIGRpZmZlcmVudCBtYXRlcmlhbHMuXHJcblx0ICogVGhpcyBpcyBuZWNlc3Nhcnkgc2luY2UgdGhlIHJlbmRlcmVyIGNhY2hlIGNhbiByZXVzZSBzaGFkZXJzIGdlbmVyYXRlZCBpbiBvbmUgbWF0ZXJpYWwgYW5kIHVzZSB0aGVtIGluIGFub3RoZXIuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBidWlsZGVyJ3MgY3VycmVudCBjb250ZXh0IHdpdGhvdXQgbWF0ZXJpYWwuXHJcblx0ICovXHJcblx0Z2V0U2hhcmVkQ29udGV4dCgpIHtcclxuXHJcblx0XHRjb25zdCBjb250ZXh0ID0geyAuLi50aGlzLmNvbnRleHQgfTtcclxuXHJcblx0XHRkZWxldGUgY29udGV4dC5tYXRlcmlhbDtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5jb250ZXh0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgYnVpbGRlcidzIGNhY2hlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQ2FjaGV9IGNhY2hlIC0gVGhlIGNhY2hlIHRvIHNldC5cclxuXHQgKi9cclxuXHRzZXRDYWNoZSggY2FjaGUgKSB7XHJcblxyXG5cdFx0dGhpcy5jYWNoZSA9IGNhY2hlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGJ1aWxkZXIncyBjdXJyZW50IGNhY2hlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Tm9kZUNhY2hlfSBUaGUgYnVpbGRlcidzIGN1cnJlbnQgY2FjaGUuXHJcblx0ICovXHJcblx0Z2V0Q2FjaGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuY2FjaGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIGNhY2hlIGZvciB0aGUgZ2l2ZW4gbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFRoZSBub2RlLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BhcmVudD10cnVlXSAtIFdoZXRoZXIgdGhpcyBub2RlIHJlZmVycyB0byBhIHNoYXJlZCBwYXJlbnQgY2FjaGUgb3Igbm90LlxyXG5cdCAqIEByZXR1cm4ge05vZGVDYWNoZX0gVGhlIGNhY2hlLlxyXG5cdCAqL1xyXG5cdGdldENhY2hlRnJvbU5vZGUoIG5vZGUsIHBhcmVudCA9IHRydWUgKSB7XHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IHRoaXMuZ2V0RGF0YUZyb21Ob2RlKCBub2RlICk7XHJcblx0XHRpZiAoIGRhdGEuY2FjaGUgPT09IHVuZGVmaW5lZCApIGRhdGEuY2FjaGUgPSBuZXcgTm9kZUNhY2hlKCBwYXJlbnQgPyB0aGlzLmdldENhY2hlKCkgOiBudWxsICk7XHJcblxyXG5cdFx0cmV0dXJuIGRhdGEuY2FjaGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogV2hldGhlciB0aGUgcmVxdWVzdGVkIGZlYXR1cmUgaXMgYXZhaWxhYmxlIG9yIG5vdC5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIHJlcXVlc3RlZCBmZWF0dXJlLlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHJlcXVlc3RlZCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBvciBub3QuXHJcblx0ICovXHJcblx0aXNBdmFpbGFibGUoIC8qbmFtZSovICkge1xyXG5cclxuXHRcdHJldHVybiBmYWxzZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSB2ZXJ0ZXhJbmRleCBpbnB1dCB2YXJpYWJsZSBhcyBhIG5hdGl2ZSBzaGFkZXIgc3RyaW5nLlxyXG5cdCAqXHJcblx0ICogQGFic3RyYWN0XHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgaW5zdGFuY2VJbmRleCBzaGFkZXIgc3RyaW5nLlxyXG5cdCAqL1xyXG5cdGdldFZlcnRleEluZGV4KCkge1xyXG5cclxuXHRcdGNvbnNvbGUud2FybiggJ0Fic3RyYWN0IGZ1bmN0aW9uLicgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBpbnN0YW5jZUluZGV4IGlucHV0IHZhcmlhYmxlIGFzIGEgbmF0aXZlIHNoYWRlciBzdHJpbmcuXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBpbnN0YW5jZUluZGV4IHNoYWRlciBzdHJpbmcuXHJcblx0ICovXHJcblx0Z2V0SW5zdGFuY2VJbmRleCgpIHtcclxuXHJcblx0XHRjb25zb2xlLndhcm4oICdBYnN0cmFjdCBmdW5jdGlvbi4nICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgZHJhd0luZGV4IGlucHV0IHZhcmlhYmxlIGFzIGEgbmF0aXZlIHNoYWRlciBzdHJpbmcuXHJcblx0ICogT25seSByZWxldmFudCBmb3IgV2ViR0wgYW5kIGl0cyBgV0VCR0xfbXVsdGlfZHJhd2AgZXh0ZW5zaW9uLlxyXG5cdCAqXHJcblx0ICogQGFic3RyYWN0XHJcblx0ICogQHJldHVybiB7P3N0cmluZ30gVGhlIGRyYXdJbmRleCBzaGFkZXIgc3RyaW5nLlxyXG5cdCAqL1xyXG5cdGdldERyYXdJbmRleCgpIHtcclxuXHJcblx0XHRjb25zb2xlLndhcm4oICdBYnN0cmFjdCBmdW5jdGlvbi4nICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgZnJvbnRGYWNpbmcgaW5wdXQgdmFyaWFibGUgYXMgYSBuYXRpdmUgc2hhZGVyIHN0cmluZy5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGZyb250RmFjaW5nIHNoYWRlciBzdHJpbmcuXHJcblx0ICovXHJcblx0Z2V0RnJvbnRGYWNpbmcoKSB7XHJcblxyXG5cdFx0Y29uc29sZS53YXJuKCAnQWJzdHJhY3QgZnVuY3Rpb24uJyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGZyYWdDb29yZCBpbnB1dCB2YXJpYWJsZSBhcyBhIG5hdGl2ZSBzaGFkZXIgc3RyaW5nLlxyXG5cdCAqXHJcblx0ICogQGFic3RyYWN0XHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgZnJhZ0Nvb3JkIHNoYWRlciBzdHJpbmcuXHJcblx0ICovXHJcblx0Z2V0RnJhZ0Nvb3JkKCkge1xyXG5cclxuXHRcdGNvbnNvbGUud2FybiggJ0Fic3RyYWN0IGZ1bmN0aW9uLicgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBXaGV0aGVyIHRvIGZsaXAgdGV4dHVyZSBkYXRhIGFsb25nIGl0cyB2ZXJ0aWNhbCBheGlzIG9yIG5vdC4gV2ViR0wgbmVlZHNcclxuXHQgKiB0aGlzIG1ldGhvZCBldmFsdWF0ZSB0byBgdHJ1ZWAsIFdlYkdQVSB0byBgZmFsc2VgLlxyXG5cdCAqXHJcblx0ICogQGFic3RyYWN0XHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0byBmbGlwIHRleHR1cmUgZGF0YSBhbG9uZyBpdHMgdmVydGljYWwgYXhpcyBvciBub3QuXHJcblx0ICovXHJcblx0aXNGbGlwWSgpIHtcclxuXHJcblx0XHRyZXR1cm4gZmFsc2U7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2FsbGluZyB0aGlzIG1ldGhvZCBpbmNyZWFzZXMgdGhlIHVzYWdlIGNvdW50IGZvciB0aGUgZ2l2ZW4gbm9kZSBieSBvbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBUaGUgbm9kZSB0byBpbmNyZWFzZSB0aGUgdXNhZ2UgY291bnQgZm9yLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIHVwZGF0ZWQgdXNhZ2UgY291bnQuXHJcblx0ICovXHJcblx0aW5jcmVhc2VVc2FnZSggbm9kZSApIHtcclxuXHJcblx0XHRjb25zdCBub2RlRGF0YSA9IHRoaXMuZ2V0RGF0YUZyb21Ob2RlKCBub2RlICk7XHJcblx0XHRub2RlRGF0YS51c2FnZUNvdW50ID0gbm9kZURhdGEudXNhZ2VDb3VudCA9PT0gdW5kZWZpbmVkID8gMSA6IG5vZGVEYXRhLnVzYWdlQ291bnQgKyAxO1xyXG5cclxuXHRcdHJldHVybiBub2RlRGF0YS51c2FnZUNvdW50O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyBhIHRleHR1cmUgc2FtcGxlIHNoYWRlciBzdHJpbmcgZm9yIHRoZSBnaXZlbiB0ZXh0dXJlIGRhdGEuXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdGV4dHVyZVByb3BlcnR5IC0gVGhlIHRleHR1cmUgcHJvcGVydHkgbmFtZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdXZTbmlwcGV0IC0gU25pcHBldCBkZWZpbmluZyB0aGUgdGV4dHVyZSBjb29yZGluYXRlcy5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBnZW5lcmF0ZWQgc2hhZGVyIHN0cmluZy5cclxuXHQgKi9cclxuXHRnZW5lcmF0ZVRleHR1cmUoIC8qIHRleHR1cmUsIHRleHR1cmVQcm9wZXJ0eSwgdXZTbmlwcGV0ICovICkge1xyXG5cclxuXHRcdGNvbnNvbGUud2FybiggJ0Fic3RyYWN0IGZ1bmN0aW9uLicgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZW5lcmF0ZXMgYSB0ZXh0dXJlIExPRCBzaGFkZXIgc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdGV4dHVyZSBkYXRhLlxyXG5cdCAqXHJcblx0ICogQGFic3RyYWN0XHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHRleHR1cmVQcm9wZXJ0eSAtIFRoZSB0ZXh0dXJlIHByb3BlcnR5IG5hbWUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHV2U25pcHBldCAtIFNuaXBwZXQgZGVmaW5pbmcgdGhlIHRleHR1cmUgY29vcmRpbmF0ZXMuXHJcblx0ICogQHBhcmFtIHs/c3RyaW5nfSBkZXB0aFNuaXBwZXQgLSBTbmlwcGV0IGRlZmluaW5nIHRoZSAwLWJhc2VkIHRleHR1cmUgYXJyYXkgaW5kZXggdG8gc2FtcGxlLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBsZXZlbFNuaXBwZXQgLSBTbmlwcGV0IGRlZmluaW5nIHRoZSBtaXAgbGV2ZWwuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgZ2VuZXJhdGVkIHNoYWRlciBzdHJpbmcuXHJcblx0ICovXHJcblx0Z2VuZXJhdGVUZXh0dXJlTG9kKCAvKiB0ZXh0dXJlLCB0ZXh0dXJlUHJvcGVydHksIHV2U25pcHBldCwgZGVwdGhTbmlwcGV0LCBsZXZlbFNuaXBwZXQgKi8gKSB7XHJcblxyXG5cdFx0Y29uc29sZS53YXJuKCAnQWJzdHJhY3QgZnVuY3Rpb24uJyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyB0aGUgYXJyYXkgZGVjbGFyYXRpb24gc3RyaW5nLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBUaGUgdHlwZS5cclxuXHQgKiBAcGFyYW0gez9udW1iZXJ9IFtjb3VudF0gLSBUaGUgY291bnQuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgZ2VuZXJhdGVkIHZhbHVlIGFzIGEgc2hhZGVyIHN0cmluZy5cclxuXHQgKi9cclxuXHRnZW5lcmF0ZUFycmF5RGVjbGFyYXRpb24oIHR5cGUsIGNvdW50ICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmdldFR5cGUoIHR5cGUgKSArICdbICcgKyBjb3VudCArICcgXSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2VuZXJhdGVzIHRoZSBhcnJheSBzaGFkZXIgc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZSBhbmQgdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSB0eXBlLlxyXG5cdCAqIEBwYXJhbSB7P251bWJlcn0gW2NvdW50XSAtIFRoZSBjb3VudC5cclxuXHQgKiBAcGFyYW0gez9BcnJheTxOb2RlPn0gW3ZhbHVlcz1udWxsXSAtIFRoZSBkZWZhdWx0IHZhbHVlcy5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBnZW5lcmF0ZWQgdmFsdWUgYXMgYSBzaGFkZXIgc3RyaW5nLlxyXG5cdCAqL1xyXG5cdGdlbmVyYXRlQXJyYXkoIHR5cGUsIGNvdW50LCB2YWx1ZXMgPSBudWxsICkge1xyXG5cclxuXHRcdGxldCBzbmlwcGV0ID0gdGhpcy5nZW5lcmF0ZUFycmF5RGVjbGFyYXRpb24oIHR5cGUsIGNvdW50ICkgKyAnKCAnO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGNvdW50OyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdmFsdWUgPSB2YWx1ZXMgPyB2YWx1ZXNbIGkgXSA6IG51bGw7XHJcblxyXG5cdFx0XHRpZiAoIHZhbHVlICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRzbmlwcGV0ICs9IHZhbHVlLmJ1aWxkKCB0aGlzLCB0eXBlICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRzbmlwcGV0ICs9IHRoaXMuZ2VuZXJhdGVDb25zdCggdHlwZSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBpIDwgY291bnQgLSAxICkgc25pcHBldCArPSAnLCAnO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRzbmlwcGV0ICs9ICcgKSc7XHJcblxyXG5cdFx0cmV0dXJuIHNuaXBwZXQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2VuZXJhdGVzIHRoZSBzdHJ1Y3Qgc2hhZGVyIHN0cmluZy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIHR5cGUuXHJcblx0ICogQHBhcmFtIHtBcnJheTxPYmplY3Q+fSBbbWVtYmVyc0xheW91dF0gLSBUaGUgY291bnQuXHJcblx0ICogQHBhcmFtIHs/QXJyYXk8Tm9kZT59IFt2YWx1ZXM9bnVsbF0gLSBUaGUgZGVmYXVsdCB2YWx1ZXMuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgZ2VuZXJhdGVkIHZhbHVlIGFzIGEgc2hhZGVyIHN0cmluZy5cclxuXHQgKi9cclxuXHRnZW5lcmF0ZVN0cnVjdCggdHlwZSwgbWVtYmVyc0xheW91dCwgdmFsdWVzID0gbnVsbCApIHtcclxuXHJcblx0XHRjb25zdCBzbmlwcGV0cyA9IFtdO1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IG1lbWJlciBvZiBtZW1iZXJzTGF5b3V0ICkge1xyXG5cclxuXHRcdFx0Y29uc3QgeyBuYW1lLCB0eXBlIH0gPSBtZW1iZXI7XHJcblxyXG5cdFx0XHRpZiAoIHZhbHVlcyAmJiB2YWx1ZXNbIG5hbWUgXSAmJiB2YWx1ZXNbIG5hbWUgXS5pc05vZGUgKSB7XHJcblxyXG5cdFx0XHRcdHNuaXBwZXRzLnB1c2goIHZhbHVlc1sgbmFtZSBdLmJ1aWxkKCB0aGlzLCB0eXBlICkgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHNuaXBwZXRzLnB1c2goIHRoaXMuZ2VuZXJhdGVDb25zdCggdHlwZSApICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0eXBlICsgJyggJyArIHNuaXBwZXRzLmpvaW4oICcsICcgKSArICcgKSc7XHJcblxyXG5cdH1cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyB0aGUgc2hhZGVyIHN0cmluZyBmb3IgdGhlIGdpdmVuIHR5cGUgYW5kIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBUaGUgdHlwZS5cclxuXHQgKiBAcGFyYW0gez9hbnl9IFt2YWx1ZT1udWxsXSAtIFRoZSB2YWx1ZS5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBnZW5lcmF0ZWQgdmFsdWUgYXMgYSBzaGFkZXIgc3RyaW5nLlxyXG5cdCAqL1xyXG5cdGdlbmVyYXRlQ29uc3QoIHR5cGUsIHZhbHVlID0gbnVsbCApIHtcclxuXHJcblx0XHRpZiAoIHZhbHVlID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0aWYgKCB0eXBlID09PSAnZmxvYXQnIHx8IHR5cGUgPT09ICdpbnQnIHx8IHR5cGUgPT09ICd1aW50JyApIHZhbHVlID0gMDtcclxuXHRcdFx0ZWxzZSBpZiAoIHR5cGUgPT09ICdib29sJyApIHZhbHVlID0gZmFsc2U7XHJcblx0XHRcdGVsc2UgaWYgKCB0eXBlID09PSAnY29sb3InICkgdmFsdWUgPSBuZXcgQ29sb3IoKTtcclxuXHRcdFx0ZWxzZSBpZiAoIHR5cGUgPT09ICd2ZWMyJyApIHZhbHVlID0gbmV3IFZlY3RvcjIoKTtcclxuXHRcdFx0ZWxzZSBpZiAoIHR5cGUgPT09ICd2ZWMzJyApIHZhbHVlID0gbmV3IFZlY3RvcjMoKTtcclxuXHRcdFx0ZWxzZSBpZiAoIHR5cGUgPT09ICd2ZWM0JyApIHZhbHVlID0gbmV3IFZlY3RvcjQoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0eXBlID09PSAnZmxvYXQnICkgcmV0dXJuIHRvRmxvYXQoIHZhbHVlICk7XHJcblx0XHRpZiAoIHR5cGUgPT09ICdpbnQnICkgcmV0dXJuIGAkeyBNYXRoLnJvdW5kKCB2YWx1ZSApIH1gO1xyXG5cdFx0aWYgKCB0eXBlID09PSAndWludCcgKSByZXR1cm4gdmFsdWUgPj0gMCA/IGAkeyBNYXRoLnJvdW5kKCB2YWx1ZSApIH11YCA6ICcwdSc7XHJcblx0XHRpZiAoIHR5cGUgPT09ICdib29sJyApIHJldHVybiB2YWx1ZSA/ICd0cnVlJyA6ICdmYWxzZSc7XHJcblx0XHRpZiAoIHR5cGUgPT09ICdjb2xvcicgKSByZXR1cm4gYCR7IHRoaXMuZ2V0VHlwZSggJ3ZlYzMnICkgfSggJHsgdG9GbG9hdCggdmFsdWUuciApIH0sICR7IHRvRmxvYXQoIHZhbHVlLmcgKSB9LCAkeyB0b0Zsb2F0KCB2YWx1ZS5iICkgfSApYDtcclxuXHJcblx0XHRjb25zdCB0eXBlTGVuZ3RoID0gdGhpcy5nZXRUeXBlTGVuZ3RoKCB0eXBlICk7XHJcblxyXG5cdFx0Y29uc3QgY29tcG9uZW50VHlwZSA9IHRoaXMuZ2V0Q29tcG9uZW50VHlwZSggdHlwZSApO1xyXG5cclxuXHRcdGNvbnN0IGdlbmVyYXRlQ29uc3QgPSB2YWx1ZSA9PiB0aGlzLmdlbmVyYXRlQ29uc3QoIGNvbXBvbmVudFR5cGUsIHZhbHVlICk7XHJcblxyXG5cdFx0aWYgKCB0eXBlTGVuZ3RoID09PSAyICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIGAkeyB0aGlzLmdldFR5cGUoIHR5cGUgKSB9KCAkeyBnZW5lcmF0ZUNvbnN0KCB2YWx1ZS54ICkgfSwgJHsgZ2VuZXJhdGVDb25zdCggdmFsdWUueSApIH0gKWA7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggdHlwZUxlbmd0aCA9PT0gMyApIHtcclxuXHJcblx0XHRcdHJldHVybiBgJHsgdGhpcy5nZXRUeXBlKCB0eXBlICkgfSggJHsgZ2VuZXJhdGVDb25zdCggdmFsdWUueCApIH0sICR7IGdlbmVyYXRlQ29uc3QoIHZhbHVlLnkgKSB9LCAkeyBnZW5lcmF0ZUNvbnN0KCB2YWx1ZS56ICkgfSApYDtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCB0eXBlTGVuZ3RoID09PSA0ICYmIHR5cGUgIT09ICdtYXQyJyApIHtcclxuXHJcblx0XHRcdHJldHVybiBgJHsgdGhpcy5nZXRUeXBlKCB0eXBlICkgfSggJHsgZ2VuZXJhdGVDb25zdCggdmFsdWUueCApIH0sICR7IGdlbmVyYXRlQ29uc3QoIHZhbHVlLnkgKSB9LCAkeyBnZW5lcmF0ZUNvbnN0KCB2YWx1ZS56ICkgfSwgJHsgZ2VuZXJhdGVDb25zdCggdmFsdWUudyApIH0gKWA7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggdHlwZUxlbmd0aCA+PSA0ICYmIHZhbHVlICYmICggdmFsdWUuaXNNYXRyaXgyIHx8IHZhbHVlLmlzTWF0cml4MyB8fCB2YWx1ZS5pc01hdHJpeDQgKSApIHtcclxuXHJcblx0XHRcdHJldHVybiBgJHsgdGhpcy5nZXRUeXBlKCB0eXBlICkgfSggJHsgdmFsdWUuZWxlbWVudHMubWFwKCBnZW5lcmF0ZUNvbnN0ICkuam9pbiggJywgJyApIH0gKWA7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggdHlwZUxlbmd0aCA+IDQgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gYCR7IHRoaXMuZ2V0VHlwZSggdHlwZSApIH0oKWA7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRocm93IG5ldyBFcnJvciggYE5vZGVCdWlsZGVyOiBUeXBlICcke3R5cGV9JyBub3QgZm91bmQgaW4gZ2VuZXJhdGUgY29uc3RhbnQgYXR0ZW1wdC5gICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSXQgbWlnaHQgYmUgbmVjZXNzYXJ5IHRvIGNvbnZlcnQgY2VydGFpbiBkYXRhIHR5cGVzIHRvIGRpZmZlcmVudCBvbmVzXHJcblx0ICogc28gdGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gaGlkZSB0aGUgY29udmVyc2lvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIHR5cGUuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgdXBkYXRlZCB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldFR5cGUoIHR5cGUgKSB7XHJcblxyXG5cdFx0aWYgKCB0eXBlID09PSAnY29sb3InICkgcmV0dXJuICd2ZWMzJztcclxuXHJcblx0XHRyZXR1cm4gdHlwZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBXaGV0aGVyIHRoZSBnaXZlbiBhdHRyaWJ1dGUgbmFtZSBpcyBkZWZpbmVkIGluIHRoZSBnZW9tZXRyeSBvciBub3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBhdHRyaWJ1dGUgbmFtZS5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBnaXZlbiBhdHRyaWJ1dGUgbmFtZSBpcyBkZWZpbmVkIGluIHRoZSBnZW9tZXRyeS5cclxuXHQgKi9cclxuXHRoYXNHZW9tZXRyeUF0dHJpYnV0ZSggbmFtZSApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5nZW9tZXRyeSAmJiB0aGlzLmdlb21ldHJ5LmdldEF0dHJpYnV0ZSggbmFtZSApICE9PSB1bmRlZmluZWQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIG5vZGUgYXR0cmlidXRlIGZvciB0aGUgZ2l2ZW4gbmFtZSBhbmQgdHlwZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIGF0dHJpYnV0ZSdzIG5hbWUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBUaGUgYXR0cmlidXRlJ3MgdHlwZS5cclxuXHQgKiBAcmV0dXJuIHtOb2RlQXR0cmlidXRlfSBUaGUgbm9kZSBhdHRyaWJ1dGUuXHJcblx0ICovXHJcblx0Z2V0QXR0cmlidXRlKCBuYW1lLCB0eXBlICkge1xyXG5cclxuXHRcdGNvbnN0IGF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZXM7XHJcblxyXG5cdFx0Ly8gZmluZCBhdHRyaWJ1dGVcclxuXHJcblx0XHRmb3IgKCBjb25zdCBhdHRyaWJ1dGUgb2YgYXR0cmlidXRlcyApIHtcclxuXHJcblx0XHRcdGlmICggYXR0cmlidXRlLm5hbWUgPT09IG5hbWUgKSB7XHJcblxyXG5cdFx0XHRcdHJldHVybiBhdHRyaWJ1dGU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGNyZWF0ZSBhIG5ldyBpZiBubyBleGlzdFxyXG5cclxuXHRcdGNvbnN0IGF0dHJpYnV0ZSA9IG5ldyBOb2RlQXR0cmlidXRlKCBuYW1lLCB0eXBlICk7XHJcblxyXG5cdFx0dGhpcy5yZWdpc3RlckRlY2xhcmF0aW9uKCBhdHRyaWJ1dGUgKTtcclxuXHJcblx0XHRhdHRyaWJ1dGVzLnB1c2goIGF0dHJpYnV0ZSApO1xyXG5cclxuXHRcdHJldHVybiBhdHRyaWJ1dGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBmb3IgdGhlIGdpdmVuIG5vZGUgYW5kIHNoYWRlciBzdGFnZSB0aGUgcHJvcGVydHkgbmFtZSBmb3IgdGhlIHNoYWRlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFRoZSBub2RlLlxyXG5cdCAqIEBwYXJhbSB7KCd2ZXJ0ZXgnfCdmcmFnbWVudCd8J2NvbXB1dGUnfCdhbnknKX0gc2hhZGVyU3RhZ2UgLSBUaGUgc2hhZGVyIHN0YWdlLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHByb3BlcnR5IG5hbWUuXHJcblx0ICovXHJcblx0Z2V0UHJvcGVydHlOYW1lKCBub2RlLyosIHNoYWRlclN0YWdlKi8gKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5vZGUubmFtZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBXaGV0aGVyIHRoZSBnaXZlbiB0eXBlIGlzIGEgdmVjdG9yIHR5cGUgb3Igbm90LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBUaGUgdHlwZSB0byBjaGVjay5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBnaXZlbiB0eXBlIGlzIGEgdmVjdG9yIHR5cGUgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGlzVmVjdG9yKCB0eXBlICkge1xyXG5cclxuXHRcdHJldHVybiAvdmVjXFxkLy50ZXN0KCB0eXBlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogV2hldGhlciB0aGUgZ2l2ZW4gdHlwZSBpcyBhIG1hdHJpeCB0eXBlIG9yIG5vdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIHR5cGUgdG8gY2hlY2suXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZ2l2ZW4gdHlwZSBpcyBhIG1hdHJpeCB0eXBlIG9yIG5vdC5cclxuXHQgKi9cclxuXHRpc01hdHJpeCggdHlwZSApIHtcclxuXHJcblx0XHRyZXR1cm4gL21hdFxcZC8udGVzdCggdHlwZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdoZXRoZXIgdGhlIGdpdmVuIHR5cGUgaXMgYSByZWZlcmVuY2UgdHlwZSBvciBub3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSB0eXBlIHRvIGNoZWNrLlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGdpdmVuIHR5cGUgaXMgYSByZWZlcmVuY2UgdHlwZSBvciBub3QuXHJcblx0ICovXHJcblx0aXNSZWZlcmVuY2UoIHR5cGUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHR5cGUgPT09ICd2b2lkJyB8fCB0eXBlID09PSAncHJvcGVydHknIHx8IHR5cGUgPT09ICdzYW1wbGVyJyB8fCB0eXBlID09PSAnc2FtcGxlckNvbXBhcmlzb24nIHx8IHR5cGUgPT09ICd0ZXh0dXJlJyB8fCB0eXBlID09PSAnY3ViZVRleHR1cmUnIHx8IHR5cGUgPT09ICdzdG9yYWdlVGV4dHVyZScgfHwgdHlwZSA9PT0gJ2RlcHRoVGV4dHVyZScgfHwgdHlwZSA9PT0gJ3RleHR1cmUzRCc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2hlY2tzIGlmIHRoZSBnaXZlbiB0ZXh0dXJlIHJlcXVpcmVzIGEgbWFudWFsIGNvbnZlcnNpb24gdG8gdGhlIHdvcmtpbmcgY29sb3Igc3BhY2UuXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZSB0byBjaGVjay5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBnaXZlbiB0ZXh0dXJlIHJlcXVpcmVzIGEgY29udmVyc2lvbiB0byB3b3JraW5nIGNvbG9yIHNwYWNlIG9yIG5vdC5cclxuXHQgKi9cclxuXHRuZWVkc1RvV29ya2luZ0NvbG9yU3BhY2UoIC8qdGV4dHVyZSovICkge1xyXG5cclxuXHRcdHJldHVybiBmYWxzZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBjb21wb25lbnQgdHlwZSBvZiBhIGdpdmVuIHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZS5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBjb21wb25lbnQgdHlwZS5cclxuXHQgKi9cclxuXHRnZXRDb21wb25lbnRUeXBlRnJvbVRleHR1cmUoIHRleHR1cmUgKSB7XHJcblxyXG5cdFx0Y29uc3QgdHlwZSA9IHRleHR1cmUudHlwZTtcclxuXHJcblx0XHRpZiAoIHRleHR1cmUuaXNEYXRhVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdGlmICggdHlwZSA9PT0gSW50VHlwZSApIHJldHVybiAnaW50JztcclxuXHRcdFx0aWYgKCB0eXBlID09PSBVbnNpZ25lZEludFR5cGUgKSByZXR1cm4gJ3VpbnQnO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gJ2Zsb2F0JztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBlbGVtZW50IHR5cGUgZm9yIGEgZ2l2ZW4gdHlwZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIHR5cGUuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgZWxlbWVudCB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldEVsZW1lbnRUeXBlKCB0eXBlICkge1xyXG5cclxuXHRcdGlmICggdHlwZSA9PT0gJ21hdDInICkgcmV0dXJuICd2ZWMyJztcclxuXHRcdGlmICggdHlwZSA9PT0gJ21hdDMnICkgcmV0dXJuICd2ZWMzJztcclxuXHRcdGlmICggdHlwZSA9PT0gJ21hdDQnICkgcmV0dXJuICd2ZWM0JztcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5nZXRDb21wb25lbnRUeXBlKCB0eXBlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgY29tcG9uZW50IHR5cGUgZm9yIGEgZ2l2ZW4gdHlwZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIHR5cGUuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgY29tcG9uZW50IHR5cGUuXHJcblx0ICovXHJcblx0Z2V0Q29tcG9uZW50VHlwZSggdHlwZSApIHtcclxuXHJcblx0XHR0eXBlID0gdGhpcy5nZXRWZWN0b3JUeXBlKCB0eXBlICk7XHJcblxyXG5cdFx0aWYgKCB0eXBlID09PSAnZmxvYXQnIHx8IHR5cGUgPT09ICdib29sJyB8fCB0eXBlID09PSAnaW50JyB8fCB0eXBlID09PSAndWludCcgKSByZXR1cm4gdHlwZTtcclxuXHJcblx0XHRjb25zdCBjb21wb25lbnRUeXBlID0gLyhifGl8dXwpKHZlY3xtYXQpKFsyLTRdKS8uZXhlYyggdHlwZSApO1xyXG5cclxuXHRcdGlmICggY29tcG9uZW50VHlwZSA9PT0gbnVsbCApIHJldHVybiBudWxsO1xyXG5cclxuXHRcdGlmICggY29tcG9uZW50VHlwZVsgMSBdID09PSAnYicgKSByZXR1cm4gJ2Jvb2wnO1xyXG5cdFx0aWYgKCBjb21wb25lbnRUeXBlWyAxIF0gPT09ICdpJyApIHJldHVybiAnaW50JztcclxuXHRcdGlmICggY29tcG9uZW50VHlwZVsgMSBdID09PSAndScgKSByZXR1cm4gJ3VpbnQnO1xyXG5cclxuXHRcdHJldHVybiAnZmxvYXQnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHZlY3RvciB0eXBlIGZvciBhIGdpdmVuIHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSB0eXBlLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHZlY3RvciB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldFZlY3RvclR5cGUoIHR5cGUgKSB7XHJcblxyXG5cdFx0aWYgKCB0eXBlID09PSAnY29sb3InICkgcmV0dXJuICd2ZWMzJztcclxuXHRcdGlmICggdHlwZSA9PT0gJ3RleHR1cmUnIHx8IHR5cGUgPT09ICdjdWJlVGV4dHVyZScgfHwgdHlwZSA9PT0gJ3N0b3JhZ2VUZXh0dXJlJyB8fCB0eXBlID09PSAndGV4dHVyZTNEJyApIHJldHVybiAndmVjNCc7XHJcblxyXG5cdFx0cmV0dXJuIHR5cGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgZGF0YSB0eXBlIGZvciB0aGUgZ2l2ZW4gdGhlIGxlbmd0aCBhbmQgY29tcG9uZW50IHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIC0gVGhlIGxlbmd0aC5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW2NvbXBvbmVudFR5cGU9J2Zsb2F0J10gLSBUaGUgY29tcG9uZW50IHR5cGUuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgdHlwZS5cclxuXHQgKi9cclxuXHRnZXRUeXBlRnJvbUxlbmd0aCggbGVuZ3RoLCBjb21wb25lbnRUeXBlID0gJ2Zsb2F0JyApIHtcclxuXHJcblx0XHRpZiAoIGxlbmd0aCA9PT0gMSApIHJldHVybiBjb21wb25lbnRUeXBlO1xyXG5cclxuXHRcdGxldCBiYXNlVHlwZSA9IGdldFR5cGVGcm9tTGVuZ3RoKCBsZW5ndGggKTtcclxuXHRcdGNvbnN0IHByZWZpeCA9IGNvbXBvbmVudFR5cGUgPT09ICdmbG9hdCcgPyAnJyA6IGNvbXBvbmVudFR5cGVbIDAgXTtcclxuXHJcblx0XHQvLyBmaXggZWRnZSBjYXNlIGZvciBtYXQyeDIgYmVpbmcgc2FtZSBzaXplIGFzIHZlYzRcclxuXHRcdGlmICggL21hdDIvLnRlc3QoIGNvbXBvbmVudFR5cGUgKSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdGJhc2VUeXBlID0gYmFzZVR5cGUucmVwbGFjZSggJ3ZlYycsICdtYXQnICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBwcmVmaXggKyBiYXNlVHlwZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSB0eXBlIGZvciBhIGdpdmVuIHR5cGVkIGFycmF5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUeXBlZEFycmF5fSBhcnJheSAtIFRoZSB0eXBlZCBhcnJheS5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldFR5cGVGcm9tQXJyYXkoIGFycmF5ICkge1xyXG5cclxuXHRcdHJldHVybiB0eXBlRnJvbUFycmF5LmdldCggYXJyYXkuY29uc3RydWN0b3IgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSB0eXBlIGlzIGFuIGludGVnZXIgdHlwZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIHR5cGUuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgdHlwZSBpcyBhbiBpbnRlZ2VyIHR5cGUgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGlzSW50ZWdlciggdHlwZSApIHtcclxuXHJcblx0XHRyZXR1cm4gL2ludHx1aW50fChpfHUpdmVjLy50ZXN0KCB0eXBlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgdHlwZSBmb3IgYSBnaXZlbiBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCdWZmZXJBdHRyaWJ1dGV9IGF0dHJpYnV0ZSAtIFRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHR5cGUuXHJcblx0ICovXHJcblx0Z2V0VHlwZUZyb21BdHRyaWJ1dGUoIGF0dHJpYnV0ZSApIHtcclxuXHJcblx0XHRsZXQgZGF0YUF0dHJpYnV0ZSA9IGF0dHJpYnV0ZTtcclxuXHJcblx0XHRpZiAoIGF0dHJpYnV0ZS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlICkgZGF0YUF0dHJpYnV0ZSA9IGF0dHJpYnV0ZS5kYXRhO1xyXG5cclxuXHRcdGNvbnN0IGFycmF5ID0gZGF0YUF0dHJpYnV0ZS5hcnJheTtcclxuXHRcdGNvbnN0IGl0ZW1TaXplID0gYXR0cmlidXRlLml0ZW1TaXplO1xyXG5cdFx0Y29uc3Qgbm9ybWFsaXplZCA9IGF0dHJpYnV0ZS5ub3JtYWxpemVkO1xyXG5cclxuXHRcdGxldCBhcnJheVR5cGU7XHJcblxyXG5cdFx0aWYgKCAhICggYXR0cmlidXRlIGluc3RhbmNlb2YgRmxvYXQxNkJ1ZmZlckF0dHJpYnV0ZSApICYmIG5vcm1hbGl6ZWQgIT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRhcnJheVR5cGUgPSB0aGlzLmdldFR5cGVGcm9tQXJyYXkoIGFycmF5ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzLmdldFR5cGVGcm9tTGVuZ3RoKCBpdGVtU2l6ZSwgYXJyYXlUeXBlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgbGVuZ3RoIGZvciB0aGUgZ2l2ZW4gZGF0YSB0eXBlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBUaGUgZGF0YSB0eXBlLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGxlbmd0aC5cclxuXHQgKi9cclxuXHRnZXRUeXBlTGVuZ3RoKCB0eXBlICkge1xyXG5cclxuXHRcdGNvbnN0IHZlY1R5cGUgPSB0aGlzLmdldFZlY3RvclR5cGUoIHR5cGUgKTtcclxuXHRcdGNvbnN0IHZlY051bSA9IC92ZWMoWzItNF0pLy5leGVjKCB2ZWNUeXBlICk7XHJcblxyXG5cdFx0aWYgKCB2ZWNOdW0gIT09IG51bGwgKSByZXR1cm4gTnVtYmVyKCB2ZWNOdW1bIDEgXSApO1xyXG5cdFx0aWYgKCB2ZWNUeXBlID09PSAnZmxvYXQnIHx8IHZlY1R5cGUgPT09ICdib29sJyB8fCB2ZWNUeXBlID09PSAnaW50JyB8fCB2ZWNUeXBlID09PSAndWludCcgKSByZXR1cm4gMTtcclxuXHRcdGlmICggL21hdDIvLnRlc3QoIHR5cGUgKSA9PT0gdHJ1ZSApIHJldHVybiA0O1xyXG5cdFx0aWYgKCAvbWF0My8udGVzdCggdHlwZSApID09PSB0cnVlICkgcmV0dXJuIDk7XHJcblx0XHRpZiAoIC9tYXQ0Ly50ZXN0KCB0eXBlICkgPT09IHRydWUgKSByZXR1cm4gMTY7XHJcblxyXG5cdFx0cmV0dXJuIDA7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgdmVjdG9yIHR5cGUgZm9yIGEgZ2l2ZW4gbWF0cml4IHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSBtYXRyaXggdHlwZS5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB2ZWN0b3IgdHlwZS5cclxuXHQgKi9cclxuXHRnZXRWZWN0b3JGcm9tTWF0cml4KCB0eXBlICkge1xyXG5cclxuXHRcdHJldHVybiB0eXBlLnJlcGxhY2UoICdtYXQnLCAndmVjJyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZvciBhIGdpdmVuIHR5cGUgdGhpcyBtZXRob2QgY2hhbmdlcyB0aGUgY29tcG9uZW50IHR5cGUgdG8gdGhlXHJcblx0ICogZ2l2ZW4gdmFsdWUuIEUuZy4gYHZlYzRgIHNob3VsZCBiZSBjaGFuZ2VkIHRvIHRoZSBuZXcgY29tcG9uZW50IHR5cGVcclxuXHQgKiBgdWludGAgd2hpY2ggcmVzdWx0cyBpbiBgdXZlYzRgLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBUaGUgdHlwZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmV3Q29tcG9uZW50VHlwZSAtIFRoZSBuZXcgY29tcG9uZW50IHR5cGUuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgbmV3IHR5cGUuXHJcblx0ICovXHJcblx0Y2hhbmdlQ29tcG9uZW50VHlwZSggdHlwZSwgbmV3Q29tcG9uZW50VHlwZSApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5nZXRUeXBlRnJvbUxlbmd0aCggdGhpcy5nZXRUeXBlTGVuZ3RoKCB0eXBlICksIG5ld0NvbXBvbmVudFR5cGUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBpbnRlZ2VyIHR5cGUgcGVuZGFudCBmb3IgdGhlIGdpdmVuIHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSB0eXBlLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGludGVnZXIgdHlwZS5cclxuXHQgKi9cclxuXHRnZXRJbnRlZ2VyVHlwZSggdHlwZSApIHtcclxuXHJcblx0XHRjb25zdCBjb21wb25lbnRUeXBlID0gdGhpcy5nZXRDb21wb25lbnRUeXBlKCB0eXBlICk7XHJcblxyXG5cdFx0aWYgKCBjb21wb25lbnRUeXBlID09PSAnaW50JyB8fCBjb21wb25lbnRUeXBlID09PSAndWludCcgKSByZXR1cm4gdHlwZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5jaGFuZ2VDb21wb25lbnRUeXBlKCB0eXBlLCAnaW50JyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgYSBzdGFjayBub2RlIHRvIHRoZSBpbnRlcm5hbCBzdGFjay5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1N0YWNrTm9kZX0gVGhlIGFkZGVkIHN0YWNrIG5vZGUuXHJcblx0ICovXHJcblx0YWRkU3RhY2soKSB7XHJcblxyXG5cdFx0dGhpcy5zdGFjayA9IHN0YWNrKCB0aGlzLnN0YWNrICk7XHJcblxyXG5cdFx0dGhpcy5zdGFja3MucHVzaCggZ2V0Q3VycmVudFN0YWNrKCkgfHwgdGhpcy5zdGFjayApO1xyXG5cdFx0c2V0Q3VycmVudFN0YWNrKCB0aGlzLnN0YWNrICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuc3RhY2s7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVtb3ZlcyB0aGUgbGFzdCBzdGFjayBub2RlIGZyb20gdGhlIGludGVybmFsIHN0YWNrLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7U3RhY2tOb2RlfSBUaGUgcmVtb3ZlZCBzdGFjayBub2RlLlxyXG5cdCAqL1xyXG5cdHJlbW92ZVN0YWNrKCkge1xyXG5cclxuXHRcdGNvbnN0IGxhc3RTdGFjayA9IHRoaXMuc3RhY2s7XHJcblx0XHR0aGlzLnN0YWNrID0gbGFzdFN0YWNrLnBhcmVudDtcclxuXHJcblx0XHRzZXRDdXJyZW50U3RhY2soIHRoaXMuc3RhY2tzLnBvcCgpICk7XHJcblxyXG5cdFx0cmV0dXJuIGxhc3RTdGFjaztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgYnVpbGRlciBtYWludGFpbnMgKGNhY2hlZCkgZGF0YSBmb3IgZWFjaCBub2RlIGR1cmluZyB0aGUgYnVpbGRpbmcgcHJvY2Vzcy4gVGhpcyBtZXRob2RcclxuXHQgKiBjYW4gYmUgdXNlZCB0byBnZXQgdGhlc2UgZGF0YSBmb3IgYSBzcGVjaWZpYyBzaGFkZXIgc3RhZ2UgYW5kIGNhY2hlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIG5vZGUgdG8gZ2V0IHRoZSBkYXRhIGZvci5cclxuXHQgKiBAcGFyYW0geygndmVydGV4J3wnZnJhZ21lbnQnfCdjb21wdXRlJ3wnYW55Jyl9IFtzaGFkZXJTdGFnZT10aGlzLnNoYWRlclN0YWdlXSAtIFRoZSBzaGFkZXIgc3RhZ2UuXHJcblx0ICogQHBhcmFtIHs/Tm9kZUNhY2hlfSBjYWNoZSAtIEFuIG9wdGlvbmFsIGNhY2hlLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdH0gVGhlIG5vZGUgZGF0YS5cclxuXHQgKi9cclxuXHRnZXREYXRhRnJvbU5vZGUoIG5vZGUsIHNoYWRlclN0YWdlID0gdGhpcy5zaGFkZXJTdGFnZSwgY2FjaGUgPSBudWxsICkge1xyXG5cclxuXHRcdGNhY2hlID0gY2FjaGUgPT09IG51bGwgPyAoIG5vZGUuaXNHbG9iYWwoIHRoaXMgKSA/IHRoaXMuZ2xvYmFsQ2FjaGUgOiB0aGlzLmNhY2hlICkgOiBjYWNoZTtcclxuXHJcblx0XHRsZXQgbm9kZURhdGEgPSBjYWNoZS5nZXREYXRhKCBub2RlICk7XHJcblxyXG5cdFx0aWYgKCBub2RlRGF0YSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0bm9kZURhdGEgPSB7fTtcclxuXHJcblx0XHRcdGNhY2hlLnNldERhdGEoIG5vZGUsIG5vZGVEYXRhICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggbm9kZURhdGFbIHNoYWRlclN0YWdlIF0gPT09IHVuZGVmaW5lZCApIG5vZGVEYXRhWyBzaGFkZXJTdGFnZSBdID0ge307XHJcblxyXG5cdFx0cmV0dXJuIG5vZGVEYXRhWyBzaGFkZXJTdGFnZSBdO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHByb3BlcnRpZXMgZm9yIHRoZSBnaXZlbiBub2RlIGFuZCBzaGFkZXIgc3RhZ2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBUaGUgbm9kZSB0byBnZXQgdGhlIHByb3BlcnRpZXMgZm9yLlxyXG5cdCAqIEBwYXJhbSB7KCd2ZXJ0ZXgnfCdmcmFnbWVudCd8J2NvbXB1dGUnfCdhbnknKX0gW3NoYWRlclN0YWdlPSdhbnknXSAtIFRoZSBzaGFkZXIgc3RhZ2UuXHJcblx0ICogQHJldHVybiB7T2JqZWN0fSBUaGUgbm9kZSBwcm9wZXJ0aWVzLlxyXG5cdCAqL1xyXG5cdGdldE5vZGVQcm9wZXJ0aWVzKCBub2RlLCBzaGFkZXJTdGFnZSA9ICdhbnknICkge1xyXG5cclxuXHRcdGNvbnN0IG5vZGVEYXRhID0gdGhpcy5nZXREYXRhRnJvbU5vZGUoIG5vZGUsIHNoYWRlclN0YWdlICk7XHJcblxyXG5cdFx0cmV0dXJuIG5vZGVEYXRhLnByb3BlcnRpZXMgfHwgKCBub2RlRGF0YS5wcm9wZXJ0aWVzID0geyBvdXRwdXROb2RlOiBudWxsIH0gKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIHtAbGluayBOb2RlQXR0cmlidXRlfSBmb3IgdGhlIGdpdmVuIGJ1ZmZlciBhdHRyaWJ1dGUgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyQXR0cmlidXRlTm9kZX0gbm9kZSAtIFRoZSBidWZmZXIgYXR0cmlidXRlIG5vZGUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBUaGUgbm9kZSB0eXBlLlxyXG5cdCAqIEByZXR1cm4ge05vZGVBdHRyaWJ1dGV9IFRoZSBub2RlIGF0dHJpYnV0ZS5cclxuXHQgKi9cclxuXHRnZXRCdWZmZXJBdHRyaWJ1dGVGcm9tTm9kZSggbm9kZSwgdHlwZSApIHtcclxuXHJcblx0XHRjb25zdCBub2RlRGF0YSA9IHRoaXMuZ2V0RGF0YUZyb21Ob2RlKCBub2RlICk7XHJcblxyXG5cdFx0bGV0IGJ1ZmZlckF0dHJpYnV0ZSA9IG5vZGVEYXRhLmJ1ZmZlckF0dHJpYnV0ZTtcclxuXHJcblx0XHRpZiAoIGJ1ZmZlckF0dHJpYnV0ZSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Y29uc3QgaW5kZXggPSB0aGlzLnVuaWZvcm1zLmluZGV4ICsrO1xyXG5cclxuXHRcdFx0YnVmZmVyQXR0cmlidXRlID0gbmV3IE5vZGVBdHRyaWJ1dGUoICdub2RlQXR0cmlidXRlJyArIGluZGV4LCB0eXBlLCBub2RlICk7XHJcblxyXG5cdFx0XHR0aGlzLmJ1ZmZlckF0dHJpYnV0ZXMucHVzaCggYnVmZmVyQXR0cmlidXRlICk7XHJcblxyXG5cdFx0XHRub2RlRGF0YS5idWZmZXJBdHRyaWJ1dGUgPSBidWZmZXJBdHRyaWJ1dGU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBidWZmZXJBdHRyaWJ1dGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgU3RydWN0VHlwZX0gZm9yIHRoZSBnaXZlbiBvdXRwdXQgc3RydWN0IG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge091dHB1dFN0cnVjdE5vZGV9IG5vZGUgLSBUaGUgb3V0cHV0IHN0cnVjdCBub2RlLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8T2JqZWN0Pn0gbWVtYmVyc0xheW91dCAtIFRoZSBvdXRwdXQgc3RydWN0IHR5cGVzLlxyXG5cdCAqIEBwYXJhbSB7P3N0cmluZ30gW25hbWU9bnVsbF0gLSBUaGUgbmFtZSBvZiB0aGUgc3RydWN0LlxyXG5cdCAqIEBwYXJhbSB7KCd2ZXJ0ZXgnfCdmcmFnbWVudCd8J2NvbXB1dGUnfCdhbnknKX0gW3NoYWRlclN0YWdlPXRoaXMuc2hhZGVyU3RhZ2VdIC0gVGhlIHNoYWRlciBzdGFnZS5cclxuXHQgKiBAcmV0dXJuIHtTdHJ1Y3RUeXBlfSBUaGUgc3RydWN0IHR5cGUgYXR0cmlidXRlLlxyXG5cdCAqL1xyXG5cdGdldFN0cnVjdFR5cGVGcm9tTm9kZSggbm9kZSwgbWVtYmVyc0xheW91dCwgbmFtZSA9IG51bGwsIHNoYWRlclN0YWdlID0gdGhpcy5zaGFkZXJTdGFnZSApIHtcclxuXHJcblx0XHRjb25zdCBub2RlRGF0YSA9IHRoaXMuZ2V0RGF0YUZyb21Ob2RlKCBub2RlLCBzaGFkZXJTdGFnZSwgdGhpcy5nbG9iYWxDYWNoZSApO1xyXG5cclxuXHRcdGxldCBzdHJ1Y3RUeXBlID0gbm9kZURhdGEuc3RydWN0VHlwZTtcclxuXHJcblx0XHRpZiAoIHN0cnVjdFR5cGUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGluZGV4ID0gdGhpcy5zdHJ1Y3RzLmluZGV4ICsrO1xyXG5cclxuXHRcdFx0aWYgKCBuYW1lID09PSBudWxsICkgbmFtZSA9ICdTdHJ1Y3RUeXBlJyArIGluZGV4O1xyXG5cclxuXHRcdFx0c3RydWN0VHlwZSA9IG5ldyBTdHJ1Y3RUeXBlKCBuYW1lLCBtZW1iZXJzTGF5b3V0ICk7XHJcblxyXG5cdFx0XHR0aGlzLnN0cnVjdHNbIHNoYWRlclN0YWdlIF0ucHVzaCggc3RydWN0VHlwZSApO1xyXG5cclxuXHRcdFx0bm9kZURhdGEuc3RydWN0VHlwZSA9IHN0cnVjdFR5cGU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBzdHJ1Y3RUeXBlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFN0cnVjdFR5cGV9IGZvciB0aGUgZ2l2ZW4gb3V0cHV0IHN0cnVjdCBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPdXRwdXRTdHJ1Y3ROb2RlfSBub2RlIC0gVGhlIG91dHB1dCBzdHJ1Y3Qgbm9kZS5cclxuXHQgKiBAcGFyYW0ge0FycmF5PE9iamVjdD59IG1lbWJlcnNMYXlvdXQgLSBUaGUgb3V0cHV0IHN0cnVjdCB0eXBlcy5cclxuXHQgKiBAcmV0dXJuIHtTdHJ1Y3RUeXBlfSBUaGUgc3RydWN0IHR5cGUgYXR0cmlidXRlLlxyXG5cdCAqL1xyXG5cdGdldE91dHB1dFN0cnVjdFR5cGVGcm9tTm9kZSggbm9kZSwgbWVtYmVyc0xheW91dCApIHtcclxuXHJcblx0XHRjb25zdCBzdHJ1Y3RUeXBlID0gdGhpcy5nZXRTdHJ1Y3RUeXBlRnJvbU5vZGUoIG5vZGUsIG1lbWJlcnNMYXlvdXQsICdPdXRwdXRUeXBlJywgJ2ZyYWdtZW50JyApO1xyXG5cdFx0c3RydWN0VHlwZS5vdXRwdXQgPSB0cnVlO1xyXG5cclxuXHRcdHJldHVybiBzdHJ1Y3RUeXBlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIE5vZGVVbmlmb3JtfSBmb3IgdGhlIGdpdmVuIHVuaWZvcm0gbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VW5pZm9ybU5vZGV9IG5vZGUgLSBUaGUgdW5pZm9ybSBub2RlLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIHVuaWZvcm0gdHlwZS5cclxuXHQgKiBAcGFyYW0geygndmVydGV4J3wnZnJhZ21lbnQnfCdjb21wdXRlJ3wnYW55Jyl9IFtzaGFkZXJTdGFnZT10aGlzLnNoYWRlclN0YWdlXSAtIFRoZSBzaGFkZXIgc3RhZ2UuXHJcblx0ICogQHBhcmFtIHs/c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHVuaWZvcm0uXHJcblx0ICogQHJldHVybiB7Tm9kZVVuaWZvcm19IFRoZSBub2RlIHVuaWZvcm0uXHJcblx0ICovXHJcblx0Z2V0VW5pZm9ybUZyb21Ob2RlKCBub2RlLCB0eXBlLCBzaGFkZXJTdGFnZSA9IHRoaXMuc2hhZGVyU3RhZ2UsIG5hbWUgPSBudWxsICkge1xyXG5cclxuXHRcdGNvbnN0IG5vZGVEYXRhID0gdGhpcy5nZXREYXRhRnJvbU5vZGUoIG5vZGUsIHNoYWRlclN0YWdlLCB0aGlzLmdsb2JhbENhY2hlICk7XHJcblxyXG5cdFx0bGV0IG5vZGVVbmlmb3JtID0gbm9kZURhdGEudW5pZm9ybTtcclxuXHJcblx0XHRpZiAoIG5vZGVVbmlmb3JtID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBpbmRleCA9IHRoaXMudW5pZm9ybXMuaW5kZXggKys7XHJcblxyXG5cdFx0XHRub2RlVW5pZm9ybSA9IG5ldyBOb2RlVW5pZm9ybSggbmFtZSB8fCAoICdub2RlVW5pZm9ybScgKyBpbmRleCApLCB0eXBlLCBub2RlICk7XHJcblxyXG5cdFx0XHR0aGlzLnVuaWZvcm1zWyBzaGFkZXJTdGFnZSBdLnB1c2goIG5vZGVVbmlmb3JtICk7XHJcblxyXG5cdFx0XHR0aGlzLnJlZ2lzdGVyRGVjbGFyYXRpb24oIG5vZGVVbmlmb3JtICk7XHJcblxyXG5cdFx0XHRub2RlRGF0YS51bmlmb3JtID0gbm9kZVVuaWZvcm07XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBub2RlVW5pZm9ybTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBhcnJheSBsZW5ndGguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBUaGUgbm9kZS5cclxuXHQgKiBAcmV0dXJuIHs/bnVtYmVyfSBUaGUgYXJyYXkgbGVuZ3RoLlxyXG5cdCAqL1xyXG5cdGdldEFycmF5Q291bnQoIG5vZGUgKSB7XHJcblxyXG5cdFx0bGV0IGNvdW50ID0gbnVsbDtcclxuXHJcblx0XHRpZiAoIG5vZGUuaXNBcnJheU5vZGUgKSBjb3VudCA9IG5vZGUuY291bnQ7XHJcblx0XHRlbHNlIGlmICggbm9kZS5pc1Zhck5vZGUgJiYgbm9kZS5ub2RlLmlzQXJyYXlOb2RlICkgY291bnQgPSBub2RlLm5vZGUuY291bnQ7XHJcblxyXG5cdFx0cmV0dXJuIGNvdW50O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIE5vZGVWYXJ9IGZvciB0aGUgZ2l2ZW4gdmFyaWFibGUgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmFyTm9kZX0gbm9kZSAtIFRoZSB2YXJpYWJsZSBub2RlLlxyXG5cdCAqIEBwYXJhbSB7P3N0cmluZ30gbmFtZSAtIFRoZSB2YXJpYWJsZSdzIG5hbWUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFt0eXBlPW5vZGUuZ2V0Tm9kZVR5cGUoIHRoaXMgKV0gLSBUaGUgdmFyaWFibGUncyB0eXBlLlxyXG5cdCAqIEBwYXJhbSB7KCd2ZXJ0ZXgnfCdmcmFnbWVudCd8J2NvbXB1dGUnfCdhbnknKX0gW3NoYWRlclN0YWdlPXRoaXMuc2hhZGVyU3RhZ2VdIC0gVGhlIHNoYWRlciBzdGFnZS5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZWFkT25seT1mYWxzZV0gLSBXaGV0aGVyIHRoZSB2YXJpYWJsZSBpcyByZWFkLW9ubHkgb3Igbm90LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Tm9kZVZhcn0gVGhlIG5vZGUgdmFyaWFibGUuXHJcblx0ICovXHJcblx0Z2V0VmFyRnJvbU5vZGUoIG5vZGUsIG5hbWUgPSBudWxsLCB0eXBlID0gbm9kZS5nZXROb2RlVHlwZSggdGhpcyApLCBzaGFkZXJTdGFnZSA9IHRoaXMuc2hhZGVyU3RhZ2UsIHJlYWRPbmx5ID0gZmFsc2UgKSB7XHJcblxyXG5cdFx0Y29uc3Qgbm9kZURhdGEgPSB0aGlzLmdldERhdGFGcm9tTm9kZSggbm9kZSwgc2hhZGVyU3RhZ2UgKTtcclxuXHJcblx0XHRsZXQgbm9kZVZhciA9IG5vZGVEYXRhLnZhcmlhYmxlO1xyXG5cclxuXHRcdGlmICggbm9kZVZhciA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Y29uc3QgaWROUyA9IHJlYWRPbmx5ID8gJ19jb25zdCcgOiAnX3Zhcic7XHJcblxyXG5cdFx0XHRjb25zdCB2YXJzID0gdGhpcy52YXJzWyBzaGFkZXJTdGFnZSBdIHx8ICggdGhpcy52YXJzWyBzaGFkZXJTdGFnZSBdID0gW10gKTtcclxuXHRcdFx0Y29uc3QgaWQgPSB0aGlzLnZhcnNbIGlkTlMgXSB8fCAoIHRoaXMudmFyc1sgaWROUyBdID0gMCApO1xyXG5cclxuXHRcdFx0aWYgKCBuYW1lID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRuYW1lID0gKCByZWFkT25seSA/ICdub2RlQ29uc3QnIDogJ25vZGVWYXInICkgKyBpZDtcclxuXHJcblx0XHRcdFx0dGhpcy52YXJzWyBpZE5TIF0gKys7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvL1xyXG5cclxuXHRcdFx0Y29uc3QgY291bnQgPSB0aGlzLmdldEFycmF5Q291bnQoIG5vZGUgKTtcclxuXHJcblx0XHRcdG5vZGVWYXIgPSBuZXcgTm9kZVZhciggbmFtZSwgdHlwZSwgcmVhZE9ubHksIGNvdW50ICk7XHJcblxyXG5cdFx0XHRpZiAoICEgcmVhZE9ubHkgKSB7XHJcblxyXG5cdFx0XHRcdHZhcnMucHVzaCggbm9kZVZhciApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5yZWdpc3RlckRlY2xhcmF0aW9uKCBub2RlVmFyICk7XHJcblxyXG5cdFx0XHRub2RlRGF0YS52YXJpYWJsZSA9IG5vZGVWYXI7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBub2RlVmFyO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgd2hldGhlciBhIE5vZGUgb3IgaXRzIGZsb3cgaXMgZGV0ZXJtaW5pc3RpYywgdXNlZnVsIGZvciB1c2UgaW4gYGNvbnN0YC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFRoZSB2YXJ5aW5nIG5vZGUuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIGRldGVybWluaXN0aWMuXHJcblx0ICovXHJcblx0aXNEZXRlcm1pbmlzdGljKCBub2RlICkge1xyXG5cclxuXHRcdGlmICggbm9kZS5pc01hdGhOb2RlICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIHRoaXMuaXNEZXRlcm1pbmlzdGljKCBub2RlLmFOb2RlICkgJiZcclxuXHRcdFx0XHQoIG5vZGUuYk5vZGUgPyB0aGlzLmlzRGV0ZXJtaW5pc3RpYyggbm9kZS5iTm9kZSApIDogdHJ1ZSApICYmXHJcblx0XHRcdFx0KCBub2RlLmNOb2RlID8gdGhpcy5pc0RldGVybWluaXN0aWMoIG5vZGUuY05vZGUgKSA6IHRydWUgKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBub2RlLmlzT3BlcmF0b3JOb2RlICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIHRoaXMuaXNEZXRlcm1pbmlzdGljKCBub2RlLmFOb2RlICkgJiZcclxuXHRcdFx0XHQoIG5vZGUuYk5vZGUgPyB0aGlzLmlzRGV0ZXJtaW5pc3RpYyggbm9kZS5iTm9kZSApIDogdHJ1ZSApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIG5vZGUuaXNBcnJheU5vZGUgKSB7XHJcblxyXG5cdFx0XHRpZiAoIG5vZGUudmFsdWVzICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRmb3IgKCBjb25zdCBuIG9mIG5vZGUudmFsdWVzICkge1xyXG5cclxuXHRcdFx0XHRcdGlmICggISB0aGlzLmlzRGV0ZXJtaW5pc3RpYyggbiApICkge1xyXG5cclxuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggbm9kZS5pc0NvbnN0Tm9kZSApIHtcclxuXHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZmFsc2U7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgTm9kZVZhcnlpbmd9IGZvciB0aGUgZ2l2ZW4gdmFyeWluZyBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHsoVmFyeWluZ05vZGV8UHJvcGVydHlOb2RlKX0gbm9kZSAtIFRoZSB2YXJ5aW5nIG5vZGUuXHJcblx0ICogQHBhcmFtIHs/c3RyaW5nfSBuYW1lIC0gVGhlIHZhcnlpbmcncyBuYW1lLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbdHlwZT1ub2RlLmdldE5vZGVUeXBlKCB0aGlzICldIC0gVGhlIHZhcnlpbmcncyB0eXBlLlxyXG5cdCAqIEByZXR1cm4ge05vZGVWYXJ9IFRoZSBub2RlIHZhcnlpbmcuXHJcblx0ICovXHJcblx0Z2V0VmFyeWluZ0Zyb21Ob2RlKCBub2RlLCBuYW1lID0gbnVsbCwgdHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoIHRoaXMgKSApIHtcclxuXHJcblx0XHRjb25zdCBub2RlRGF0YSA9IHRoaXMuZ2V0RGF0YUZyb21Ob2RlKCBub2RlLCAnYW55JyApO1xyXG5cclxuXHRcdGxldCBub2RlVmFyeWluZyA9IG5vZGVEYXRhLnZhcnlpbmc7XHJcblxyXG5cdFx0aWYgKCBub2RlVmFyeWluZyA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdmFyeWluZ3MgPSB0aGlzLnZhcnlpbmdzO1xyXG5cdFx0XHRjb25zdCBpbmRleCA9IHZhcnlpbmdzLmxlbmd0aDtcclxuXHJcblx0XHRcdGlmICggbmFtZSA9PT0gbnVsbCApIG5hbWUgPSAnbm9kZVZhcnlpbmcnICsgaW5kZXg7XHJcblxyXG5cdFx0XHRub2RlVmFyeWluZyA9IG5ldyBOb2RlVmFyeWluZyggbmFtZSwgdHlwZSApO1xyXG5cclxuXHRcdFx0dmFyeWluZ3MucHVzaCggbm9kZVZhcnlpbmcgKTtcclxuXHJcblx0XHRcdHRoaXMucmVnaXN0ZXJEZWNsYXJhdGlvbiggbm9kZVZhcnlpbmcgKTtcclxuXHJcblx0XHRcdG5vZGVEYXRhLnZhcnlpbmcgPSBub2RlVmFyeWluZztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG5vZGVWYXJ5aW5nO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlZ2lzdGVycyBhIG5vZGUgZGVjbGFyYXRpb24gaW4gdGhlIGN1cnJlbnQgc2hhZGVyIHN0YWdlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IG5vZGUgLSBUaGUgbm9kZSB0byBiZSByZWdpc3RlcmVkLlxyXG5cdCAqL1xyXG5cdHJlZ2lzdGVyRGVjbGFyYXRpb24oIG5vZGUgKSB7XHJcblxyXG5cdFx0Y29uc3Qgc2hhZGVyU3RhZ2UgPSB0aGlzLnNoYWRlclN0YWdlO1xyXG5cdFx0Y29uc3QgZGVjbGFyYXRpb25zID0gdGhpcy5kZWNsYXJhdGlvbnNbIHNoYWRlclN0YWdlIF0gfHwgKCB0aGlzLmRlY2xhcmF0aW9uc1sgc2hhZGVyU3RhZ2UgXSA9IHt9ICk7XHJcblxyXG5cdFx0Y29uc3QgcHJvcGVydHkgPSB0aGlzLmdldFByb3BlcnR5TmFtZSggbm9kZSApO1xyXG5cclxuXHRcdGxldCBpbmRleCA9IDE7XHJcblx0XHRsZXQgbmFtZSA9IHByb3BlcnR5O1xyXG5cclxuXHRcdC8vIEF1dG9tYXRpY2FsbHkgcmVuYW1lcyB0aGUgcHJvcGVydHkgaWYgdGhlIG5hbWUgaXMgYWxyZWFkeSBpbiB1c2UuXHJcblxyXG5cdFx0d2hpbGUgKCBkZWNsYXJhdGlvbnNbIG5hbWUgXSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0bmFtZSA9IHByb3BlcnR5ICsgJ18nICsgaW5kZXggKys7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGRlY2xhcmF0aW9uc1sgbmFtZSBdID0gbm9kZTtcclxuXHJcblx0XHRpZiAoIGluZGV4ID4gMSApIHtcclxuXHJcblx0XHRcdG5vZGUubmFtZSA9IG5hbWU7XHJcblxyXG5cdFx0XHRjb25zb2xlLndhcm4oIGBUSFJFRS5UU0w6IERlY2xhcmF0aW9uIG5hbWUgJyR7IHByb3BlcnR5IH0nIG9mICckeyBub2RlLnR5cGUgfScgYWxyZWFkeSBpbiB1c2UuIFJlbmFtZWQgdG8gJyR7IG5hbWUgfScuYCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIHtAbGluayBOb2RlQ29kZX0gZm9yIHRoZSBnaXZlbiBjb2RlIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0NvZGVOb2RlfSBub2RlIC0gVGhlIGNvZGUgbm9kZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSBub2RlIHR5cGUuXHJcblx0ICogQHBhcmFtIHsoJ3ZlcnRleCd8J2ZyYWdtZW50J3wnY29tcHV0ZSd8J2FueScpfSBbc2hhZGVyU3RhZ2U9dGhpcy5zaGFkZXJTdGFnZV0gLSBUaGUgc2hhZGVyIHN0YWdlLlxyXG5cdCAqIEByZXR1cm4ge05vZGVDb2RlfSBUaGUgbm9kZSBjb2RlLlxyXG5cdCAqL1xyXG5cdGdldENvZGVGcm9tTm9kZSggbm9kZSwgdHlwZSwgc2hhZGVyU3RhZ2UgPSB0aGlzLnNoYWRlclN0YWdlICkge1xyXG5cclxuXHRcdGNvbnN0IG5vZGVEYXRhID0gdGhpcy5nZXREYXRhRnJvbU5vZGUoIG5vZGUgKTtcclxuXHJcblx0XHRsZXQgbm9kZUNvZGUgPSBub2RlRGF0YS5jb2RlO1xyXG5cclxuXHRcdGlmICggbm9kZUNvZGUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGNvZGVzID0gdGhpcy5jb2Rlc1sgc2hhZGVyU3RhZ2UgXSB8fCAoIHRoaXMuY29kZXNbIHNoYWRlclN0YWdlIF0gPSBbXSApO1xyXG5cdFx0XHRjb25zdCBpbmRleCA9IGNvZGVzLmxlbmd0aDtcclxuXHJcblx0XHRcdG5vZGVDb2RlID0gbmV3IE5vZGVDb2RlKCAnbm9kZUNvZGUnICsgaW5kZXgsIHR5cGUgKTtcclxuXHJcblx0XHRcdGNvZGVzLnB1c2goIG5vZGVDb2RlICk7XHJcblxyXG5cdFx0XHRub2RlRGF0YS5jb2RlID0gbm9kZUNvZGU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBub2RlQ29kZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIGEgY29kZSBmbG93IGJhc2VkIG9uIHRoZSBjb2RlLWJsb2NrIGhpZXJhcmNoeS5cclxuXHJcblx0ICogVGhpcyBpcyB1c2VkIHNvIHRoYXQgY29kZS1ibG9ja3MgbGlrZSBJZixFbHNlIGNyZWF0ZSB0aGVpciB2YXJpYWJsZXMgbG9jYWxseSBpZiB0aGUgTm9kZVxyXG5cdCAqIGlzIG9ubHkgdXNlZCBpbnNpZGUgb25lIG9mIHRoZXNlIGNvbmRpdGlvbmFscyBpbiB0aGUgY3VycmVudCBzaGFkZXIgc3RhZ2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBUaGUgbm9kZSB0byBhZGQuXHJcblx0ICogQHBhcmFtIHtOb2RlfSBub2RlQmxvY2sgLSBOb2RlLWJhc2VkIGNvZGUtYmxvY2suIFVzdWFsbHkgJ0NvbmRpdGlvbmFsTm9kZScuXHJcblx0ICovXHJcblx0YWRkRmxvd0NvZGVIaWVyYXJjaHkoIG5vZGUsIG5vZGVCbG9jayApIHtcclxuXHJcblx0XHRjb25zdCB7IGZsb3dDb2RlcywgZmxvd0NvZGVCbG9jayB9ID0gdGhpcy5nZXREYXRhRnJvbU5vZGUoIG5vZGUgKTtcclxuXHJcblx0XHRsZXQgbmVlZHNGbG93Q29kZSA9IHRydWU7XHJcblx0XHRsZXQgbm9kZUJsb2NrSGllcmFyY2h5ID0gbm9kZUJsb2NrO1xyXG5cclxuXHRcdHdoaWxlICggbm9kZUJsb2NrSGllcmFyY2h5ICkge1xyXG5cclxuXHRcdFx0aWYgKCBmbG93Q29kZUJsb2NrLmdldCggbm9kZUJsb2NrSGllcmFyY2h5ICkgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdG5lZWRzRmxvd0NvZGUgPSBmYWxzZTtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdG5vZGVCbG9ja0hpZXJhcmNoeSA9IHRoaXMuZ2V0RGF0YUZyb21Ob2RlKCBub2RlQmxvY2tIaWVyYXJjaHkgKS5wYXJlbnROb2RlQmxvY2s7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggbmVlZHNGbG93Q29kZSApIHtcclxuXHJcblx0XHRcdGZvciAoIGNvbnN0IGZsb3dDb2RlIG9mIGZsb3dDb2RlcyApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5hZGRMaW5lRmxvd0NvZGUoIGZsb3dDb2RlICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZCBhIGlubGluZS1jb2RlIHRvIHRoZSBjdXJyZW50IGZsb3cgY29kZS1ibG9jay5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFRoZSBub2RlIHRvIGFkZC5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gY29kZSAtIFRoZSBjb2RlIHRvIGFkZC5cclxuXHQgKiBAcGFyYW0ge05vZGV9IG5vZGVCbG9jayAtIEN1cnJlbnQgQ29uZGl0aW9uYWxOb2RlXHJcblx0ICovXHJcblx0YWRkTGluZUZsb3dDb2RlQmxvY2soIG5vZGUsIGNvZGUsIG5vZGVCbG9jayApIHtcclxuXHJcblx0XHRjb25zdCBub2RlRGF0YSA9IHRoaXMuZ2V0RGF0YUZyb21Ob2RlKCBub2RlICk7XHJcblx0XHRjb25zdCBmbG93Q29kZXMgPSBub2RlRGF0YS5mbG93Q29kZXMgfHwgKCBub2RlRGF0YS5mbG93Q29kZXMgPSBbXSApO1xyXG5cdFx0Y29uc3QgY29kZUJsb2NrID0gbm9kZURhdGEuZmxvd0NvZGVCbG9jayB8fCAoIG5vZGVEYXRhLmZsb3dDb2RlQmxvY2sgPSBuZXcgV2Vha01hcCgpICk7XHJcblxyXG5cdFx0Zmxvd0NvZGVzLnB1c2goIGNvZGUgKTtcclxuXHRcdGNvZGVCbG9jay5zZXQoIG5vZGVCbG9jaywgdHJ1ZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZCBhIGlubGluZS1jb2RlIHRvIHRoZSBjdXJyZW50IGZsb3cuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gY29kZSAtIFRoZSBjb2RlIHRvIGFkZC5cclxuXHQgKiBAcGFyYW0gez9Ob2RlfSBbbm9kZT0gbnVsbF0gLSBPcHRpb25hbCBOb2RlLCBjYW4gaGVscCB0aGUgc3lzdGVtIHVuZGVyc3RhbmQgaWYgdGhlIE5vZGUgaXMgcGFydCBvZiBhIGNvZGUtYmxvY2suXHJcblx0ICogQHJldHVybiB7Tm9kZUJ1aWxkZXJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbm9kZSBidWlsZGVyLlxyXG5cdCAqL1xyXG5cdGFkZExpbmVGbG93Q29kZSggY29kZSwgbm9kZSA9IG51bGwgKSB7XHJcblxyXG5cdFx0aWYgKCBjb2RlID09PSAnJyApIHJldHVybiB0aGlzO1xyXG5cclxuXHRcdGlmICggbm9kZSAhPT0gbnVsbCAmJiB0aGlzLmNvbnRleHQubm9kZUJsb2NrICkge1xyXG5cclxuXHRcdFx0dGhpcy5hZGRMaW5lRmxvd0NvZGVCbG9jayggbm9kZSwgY29kZSwgdGhpcy5jb250ZXh0Lm5vZGVCbG9jayApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb2RlID0gdGhpcy50YWIgKyBjb2RlO1xyXG5cclxuXHRcdGlmICggISAvO1xccyokLy50ZXN0KCBjb2RlICkgKSB7XHJcblxyXG5cdFx0XHRjb2RlID0gY29kZSArICc7XFxuJztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5mbG93LmNvZGUgKz0gY29kZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIGEgY29kZSB0byB0aGUgY3VycmVudCBjb2RlIGZsb3cuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gY29kZSAtIFNoYWRlciBjb2RlLlxyXG5cdCAqIEByZXR1cm4ge05vZGVCdWlsZGVyfSBBIHJlZmVyZW5jZSB0byB0aGlzIG5vZGUgYnVpbGRlci5cclxuXHQgKi9cclxuXHRhZGRGbG93Q29kZSggY29kZSApIHtcclxuXHJcblx0XHR0aGlzLmZsb3cuY29kZSArPSBjb2RlO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZCB0YWIgaW4gdGhlIGNvZGUgdGhhdCB3aWxsIGJlIGdlbmVyYXRlZCBzbyB0aGF0IG90aGVyIHNuaXBwZXRzIHJlc3BlY3QgdGhlIGN1cnJlbnQgdGFidWxhdGlvbi5cclxuXHQgKiBUeXBpY2FsbHkgdXNlZCBpbiBjb2RlcyB3aXRoIElmLEVsc2UuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtOb2RlQnVpbGRlcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBub2RlIGJ1aWxkZXIuXHJcblx0ICovXHJcblx0YWRkRmxvd1RhYigpIHtcclxuXHJcblx0XHR0aGlzLnRhYiArPSAnXFx0JztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW1vdmVzIGEgdGFiLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Tm9kZUJ1aWxkZXJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbm9kZSBidWlsZGVyLlxyXG5cdCAqL1xyXG5cdHJlbW92ZUZsb3dUYWIoKSB7XHJcblxyXG5cdFx0dGhpcy50YWIgPSB0aGlzLnRhYi5zbGljZSggMCwgLSAxICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2V0cyB0aGUgY3VycmVudCBmbG93IGRhdGEgYmFzZWQgb24gYSBOb2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlfSBub2RlIC0gTm9kZSB0aGF0IHRoZSBmbG93IHdhcyBzdGFydGVkLlxyXG5cdCAqIEBwYXJhbSB7KCd2ZXJ0ZXgnfCdmcmFnbWVudCd8J2NvbXB1dGUnfCdhbnknKX0gc2hhZGVyU3RhZ2UgLSBUaGUgc2hhZGVyIHN0YWdlLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdH0gVGhlIGZsb3cgZGF0YS5cclxuXHQgKi9cclxuXHRnZXRGbG93RGF0YSggbm9kZS8qLCBzaGFkZXJTdGFnZSovICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmZsb3dzRGF0YS5nZXQoIG5vZGUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFeGVjdXRlcyB0aGUgbm9kZSBmbG93IGJhc2VkIG9uIGEgcm9vdCBub2RlIHRvIGdlbmVyYXRlIHRoZSBmaW5hbCBzaGFkZXIgY29kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFRoZSBub2RlIHRvIGV4ZWN1dGUuXHJcblx0ICogQHJldHVybiB7T2JqZWN0fSBUaGUgY29kZSBmbG93LlxyXG5cdCAqL1xyXG5cdGZsb3dOb2RlKCBub2RlICkge1xyXG5cclxuXHRcdGNvbnN0IG91dHB1dCA9IG5vZGUuZ2V0Tm9kZVR5cGUoIHRoaXMgKTtcclxuXHJcblx0XHRjb25zdCBmbG93RGF0YSA9IHRoaXMuZmxvd0NoaWxkTm9kZSggbm9kZSwgb3V0cHV0ICk7XHJcblxyXG5cdFx0dGhpcy5mbG93c0RhdGEuc2V0KCBub2RlLCBmbG93RGF0YSApO1xyXG5cclxuXHRcdHJldHVybiBmbG93RGF0YTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJbmNsdWRlcyBhIG5vZGUgaW4gdGhlIGN1cnJlbnQgZnVuY3Rpb24gbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFRoZSBub2RlIHRvIGluY2x1ZGUuXHJcblx0ICogQHJldHVybnMge3ZvaWR9XHJcblx0ICovXHJcblx0YWRkSW5jbHVkZSggbm9kZSApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuY3VycmVudEZ1bmN0aW9uTm9kZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuY3VycmVudEZ1bmN0aW9uTm9kZS5pbmNsdWRlcy5wdXNoKCBub2RlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIG5hdGl2ZSBzaGFkZXIgb3BlcmF0b3IgbmFtZSBmb3IgYSBnaXZlbiBnZW5lcmljIG5hbWUuXHJcblx0ICogSXQgaXMgYSBzaW1pbGFyIHR5cGUgb2YgbWV0aG9kIGxpa2Uge0BsaW5rIE5vZGVCdWlsZGVyI2dldE1ldGhvZH0uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1NoYWRlck5vZGVJbnRlcm5hbH0gc2hhZGVyTm9kZSAtIFRoZSBzaGFkZXIgbm9kZSB0byBidWlsZCB0aGUgZnVuY3Rpb24gbm9kZSB3aXRoLlxyXG5cdCAqIEByZXR1cm4ge0Z1bmN0aW9uTm9kZX0gVGhlIGJ1aWxkIGZ1bmN0aW9uIG5vZGUuXHJcblx0ICovXHJcblx0YnVpbGRGdW5jdGlvbk5vZGUoIHNoYWRlck5vZGUgKSB7XHJcblxyXG5cdFx0Y29uc3QgZm4gPSBuZXcgRnVuY3Rpb25Ob2RlKCk7XHJcblxyXG5cdFx0Y29uc3QgcHJldmlvdXMgPSB0aGlzLmN1cnJlbnRGdW5jdGlvbk5vZGU7XHJcblxyXG5cdFx0dGhpcy5jdXJyZW50RnVuY3Rpb25Ob2RlID0gZm47XHJcblxyXG5cdFx0Zm4uY29kZSA9IHRoaXMuYnVpbGRGdW5jdGlvbkNvZGUoIHNoYWRlck5vZGUgKTtcclxuXHJcblx0XHR0aGlzLmN1cnJlbnRGdW5jdGlvbk5vZGUgPSBwcmV2aW91cztcclxuXHJcblx0XHRyZXR1cm4gZm47XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2VuZXJhdGVzIGEgY29kZSBmbG93IGJhc2VkIG9uIGEgVFNMIGZ1bmN0aW9uOiBGbigpLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTaGFkZXJOb2RlSW50ZXJuYWx9IHNoYWRlck5vZGUgLSBBIGZ1bmN0aW9uIGNvZGUgd2lsbCBiZSBnZW5lcmF0ZWQgYmFzZWQgb24gdGhlIGlucHV0LlxyXG5cdCAqIEByZXR1cm4ge09iamVjdH1cclxuXHQgKi9cclxuXHRmbG93U2hhZGVyTm9kZSggc2hhZGVyTm9kZSApIHtcclxuXHJcblx0XHRjb25zdCBsYXlvdXQgPSBzaGFkZXJOb2RlLmxheW91dDtcclxuXHJcblx0XHRjb25zdCBpbnB1dHMgPSB7XHJcblx0XHRcdFsgU3ltYm9sLml0ZXJhdG9yIF0oKSB7XHJcblxyXG5cdFx0XHRcdGxldCBpbmRleCA9IDA7XHJcblx0XHRcdFx0Y29uc3QgdmFsdWVzID0gT2JqZWN0LnZhbHVlcyggdGhpcyApO1xyXG5cdFx0XHRcdHJldHVybiB7XHJcblx0XHRcdFx0XHRuZXh0OiAoKSA9PiAoIHtcclxuXHRcdFx0XHRcdFx0dmFsdWU6IHZhbHVlc1sgaW5kZXggXSxcclxuXHRcdFx0XHRcdFx0ZG9uZTogaW5kZXggKysgPj0gdmFsdWVzLmxlbmd0aFxyXG5cdFx0XHRcdFx0fSApXHJcblx0XHRcdFx0fTtcclxuXHJcblx0XHRcdH1cclxuXHRcdH07XHJcblxyXG5cdFx0Zm9yICggY29uc3QgaW5wdXQgb2YgbGF5b3V0LmlucHV0cyApIHtcclxuXHJcblx0XHRcdGlucHV0c1sgaW5wdXQubmFtZSBdID0gbmV3IFBhcmFtZXRlck5vZGUoIGlucHV0LnR5cGUsIGlucHV0Lm5hbWUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRzaGFkZXJOb2RlLmxheW91dCA9IG51bGw7XHJcblxyXG5cdFx0Y29uc3QgY2FsbE5vZGUgPSBzaGFkZXJOb2RlLmNhbGwoIGlucHV0cyApO1xyXG5cdFx0Y29uc3QgZmxvd0RhdGEgPSB0aGlzLmZsb3dTdGFnZXNOb2RlKCBjYWxsTm9kZSwgbGF5b3V0LnR5cGUgKTtcclxuXHJcblx0XHRzaGFkZXJOb2RlLmxheW91dCA9IGxheW91dDtcclxuXHJcblx0XHRyZXR1cm4gZmxvd0RhdGE7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUnVucyB0aGUgbm9kZSBmbG93IHRocm91Z2ggYWxsIHRoZSBzdGVwcyBvZiBjcmVhdGlvbiwgJ3NldHVwJywgJ2FuYWx5emUnLCAnZ2VuZXJhdGUnLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIG5vZGUgdG8gZXhlY3V0ZS5cclxuXHQgKiBAcGFyYW0gez9zdHJpbmd9IG91dHB1dCAtIEV4cGVjdGVkIG91dHB1dCB0eXBlLiBGb3IgZXhhbXBsZSAndmVjMycuXHJcblx0ICogQHJldHVybiB7T2JqZWN0fVxyXG5cdCAqL1xyXG5cdGZsb3dTdGFnZXNOb2RlKCBub2RlLCBvdXRwdXQgPSBudWxsICkge1xyXG5cclxuXHRcdGNvbnN0IHByZXZpb3VzRmxvdyA9IHRoaXMuZmxvdztcclxuXHRcdGNvbnN0IHByZXZpb3VzVmFycyA9IHRoaXMudmFycztcclxuXHRcdGNvbnN0IHByZXZpb3VzRGVjbGFyYXRpb25zID0gdGhpcy5kZWNsYXJhdGlvbnM7XHJcblx0XHRjb25zdCBwcmV2aW91c0NhY2hlID0gdGhpcy5jYWNoZTtcclxuXHRcdGNvbnN0IHByZXZpb3VzQnVpbGRTdGFnZSA9IHRoaXMuYnVpbGRTdGFnZTtcclxuXHRcdGNvbnN0IHByZXZpb3VzU3RhY2sgPSB0aGlzLnN0YWNrO1xyXG5cclxuXHRcdGNvbnN0IGZsb3cgPSB7XHJcblx0XHRcdGNvZGU6ICcnXHJcblx0XHR9O1xyXG5cclxuXHRcdHRoaXMuZmxvdyA9IGZsb3c7XHJcblx0XHR0aGlzLnZhcnMgPSB7fTtcclxuXHRcdHRoaXMuZGVjbGFyYXRpb25zID0ge307XHJcblx0XHR0aGlzLmNhY2hlID0gbmV3IE5vZGVDYWNoZSgpO1xyXG5cdFx0dGhpcy5zdGFjayA9IHN0YWNrKCk7XHJcblxyXG5cdFx0Zm9yICggY29uc3QgYnVpbGRTdGFnZSBvZiBkZWZhdWx0QnVpbGRTdGFnZXMgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnNldEJ1aWxkU3RhZ2UoIGJ1aWxkU3RhZ2UgKTtcclxuXHJcblx0XHRcdGZsb3cucmVzdWx0ID0gbm9kZS5idWlsZCggdGhpcywgb3V0cHV0ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZsb3cudmFycyA9IHRoaXMuZ2V0VmFycyggdGhpcy5zaGFkZXJTdGFnZSApO1xyXG5cclxuXHRcdHRoaXMuZmxvdyA9IHByZXZpb3VzRmxvdztcclxuXHRcdHRoaXMudmFycyA9IHByZXZpb3VzVmFycztcclxuXHRcdHRoaXMuZGVjbGFyYXRpb25zID0gcHJldmlvdXNEZWNsYXJhdGlvbnM7XHJcblx0XHR0aGlzLmNhY2hlID0gcHJldmlvdXNDYWNoZTtcclxuXHRcdHRoaXMuc3RhY2sgPSBwcmV2aW91c1N0YWNrO1xyXG5cclxuXHRcdHRoaXMuc2V0QnVpbGRTdGFnZSggcHJldmlvdXNCdWlsZFN0YWdlICk7XHJcblxyXG5cdFx0cmV0dXJuIGZsb3c7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgbmF0aXZlIHNoYWRlciBvcGVyYXRvciBuYW1lIGZvciBhIGdpdmVuIGdlbmVyaWMgbmFtZS5cclxuXHQgKiBJdCBpcyBhIHNpbWlsYXIgdHlwZSBvZiBtZXRob2QgbGlrZSB7QGxpbmsgTm9kZUJ1aWxkZXIjZ2V0TWV0aG9kfS5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBvcCAtIFRoZSBvcGVyYXRvciBuYW1lIHRvIHJlc29sdmUuXHJcblx0ICogQHJldHVybiB7P3N0cmluZ30gVGhlIHJlc29sdmVkIG9wZXJhdG9yIG5hbWUuXHJcblx0ICovXHJcblx0Z2V0RnVuY3Rpb25PcGVyYXRvciggLyogb3AgKi8gKSB7XHJcblxyXG5cdFx0cmV0dXJuIG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQnVpbGRzIHRoZSBnaXZlbiBzaGFkZXIgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7U2hhZGVyTm9kZUludGVybmFsfSBzaGFkZXJOb2RlIC0gVGhlIHNoYWRlciBub2RlLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGZ1bmN0aW9uIGNvZGUuXHJcblx0ICovXHJcblx0YnVpbGRGdW5jdGlvbkNvZGUoIC8qIHNoYWRlck5vZGUgKi8gKSB7XHJcblxyXG5cdFx0Y29uc29sZS53YXJuKCAnQWJzdHJhY3QgZnVuY3Rpb24uJyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyBhIGNvZGUgZmxvdyBiYXNlZCBvbiBhIGNoaWxkIE5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBUaGUgbm9kZSB0byBleGVjdXRlLlxyXG5cdCAqIEBwYXJhbSB7P3N0cmluZ30gb3V0cHV0IC0gRXhwZWN0ZWQgb3V0cHV0IHR5cGUuIEZvciBleGFtcGxlICd2ZWMzJy5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBjb2RlIGZsb3cuXHJcblx0ICovXHJcblx0Zmxvd0NoaWxkTm9kZSggbm9kZSwgb3V0cHV0ID0gbnVsbCApIHtcclxuXHJcblx0XHRjb25zdCBwcmV2aW91c0Zsb3cgPSB0aGlzLmZsb3c7XHJcblxyXG5cdFx0Y29uc3QgZmxvdyA9IHtcclxuXHRcdFx0Y29kZTogJydcclxuXHRcdH07XHJcblxyXG5cdFx0dGhpcy5mbG93ID0gZmxvdztcclxuXHJcblx0XHRmbG93LnJlc3VsdCA9IG5vZGUuYnVpbGQoIHRoaXMsIG91dHB1dCApO1xyXG5cclxuXHRcdHRoaXMuZmxvdyA9IHByZXZpb3VzRmxvdztcclxuXHJcblx0XHRyZXR1cm4gZmxvdztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFeGVjdXRlcyBhIGZsb3cgb2YgY29kZSBpbiBhIGRpZmZlcmVudCBzdGFnZS5cclxuXHQgKlxyXG5cdCAqIFNvbWUgbm9kZXMgbGlrZSBgdmFyeWluZygpYCBoYXZlIHRoZSBhYmlsaXR5IHRvIGNvbXB1dGUgY29kZSBpbiB2ZXJ0ZXgtc3RhZ2UgYW5kXHJcblx0ICogcmV0dXJuIHRoZSB2YWx1ZSBpbiBmcmFnbWVudC1zdGFnZSBldmVuIGlmIGl0IGlzIGJlaW5nIGV4ZWN1dGVkIGluIGFuIGlucHV0IGZyYWdtZW50LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHsoJ3ZlcnRleCd8J2ZyYWdtZW50J3wnY29tcHV0ZSd8J2FueScpfSBzaGFkZXJTdGFnZSAtIFRoZSBzaGFkZXIgc3RhZ2UuXHJcblx0ICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIG5vZGUgdG8gZXhlY3V0ZS5cclxuXHQgKiBAcGFyYW0gez9zdHJpbmd9IG91dHB1dCAtIEV4cGVjdGVkIG91dHB1dCB0eXBlLiBGb3IgZXhhbXBsZSAndmVjMycuXHJcblx0ICogQHBhcmFtIHs/c3RyaW5nfSBwcm9wZXJ0eU5hbWUgLSBUaGUgcHJvcGVydHkgbmFtZSB0byBhc3NpZ24gdGhlIHJlc3VsdC5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3R9XHJcblx0ICovXHJcblx0Zmxvd05vZGVGcm9tU2hhZGVyU3RhZ2UoIHNoYWRlclN0YWdlLCBub2RlLCBvdXRwdXQgPSBudWxsLCBwcm9wZXJ0eU5hbWUgPSBudWxsICkge1xyXG5cclxuXHRcdGNvbnN0IHByZXZpb3VzU2hhZGVyU3RhZ2UgPSB0aGlzLnNoYWRlclN0YWdlO1xyXG5cclxuXHRcdHRoaXMuc2V0U2hhZGVyU3RhZ2UoIHNoYWRlclN0YWdlICk7XHJcblxyXG5cdFx0Y29uc3QgZmxvd0RhdGEgPSB0aGlzLmZsb3dDaGlsZE5vZGUoIG5vZGUsIG91dHB1dCApO1xyXG5cclxuXHRcdGlmICggcHJvcGVydHlOYW1lICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0Zmxvd0RhdGEuY29kZSArPSBgJHsgdGhpcy50YWIgKyBwcm9wZXJ0eU5hbWUgfSA9ICR7IGZsb3dEYXRhLnJlc3VsdCB9O1xcbmA7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuZmxvd0NvZGVbIHNoYWRlclN0YWdlIF0gPSB0aGlzLmZsb3dDb2RlWyBzaGFkZXJTdGFnZSBdICsgZmxvd0RhdGEuY29kZTtcclxuXHJcblx0XHR0aGlzLnNldFNoYWRlclN0YWdlKCBwcmV2aW91c1NoYWRlclN0YWdlICk7XHJcblxyXG5cdFx0cmV0dXJuIGZsb3dEYXRhO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYW4gYXJyYXkgaG9sZGluZyBhbGwgbm9kZSBhdHRyaWJ1dGVzIG9mIHRoaXMgbm9kZSBidWlsZGVyLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7QXJyYXk8Tm9kZUF0dHJpYnV0ZT59IFRoZSBub2RlIGF0dHJpYnV0ZXMgb2YgdGhpcyBidWlsZGVyLlxyXG5cdCAqL1xyXG5cdGdldEF0dHJpYnV0ZXNBcnJheSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzLmNvbmNhdCggdGhpcy5idWZmZXJBdHRyaWJ1dGVzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgYXR0cmlidXRlIGRlZmluaXRpb25zIGFzIGEgc2hhZGVyIHN0cmluZyBmb3IgdGhlIGdpdmVuIHNoYWRlciBzdGFnZS5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7KCd2ZXJ0ZXgnfCdmcmFnbWVudCd8J2NvbXB1dGUnfCdhbnknKX0gc2hhZGVyU3RhZ2UgLSBUaGUgc2hhZGVyIHN0YWdlLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGF0dHJpYnV0ZSBjb2RlIHNlY3Rpb24uXHJcblx0ICovXHJcblx0Z2V0QXR0cmlidXRlcyggLypzaGFkZXJTdGFnZSovICkge1xyXG5cclxuXHRcdGNvbnNvbGUud2FybiggJ0Fic3RyYWN0IGZ1bmN0aW9uLicgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSB2YXJ5aW5nIGRlZmluaXRpb25zIGFzIGEgc2hhZGVyIHN0cmluZyBmb3IgdGhlIGdpdmVuIHNoYWRlciBzdGFnZS5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7KCd2ZXJ0ZXgnfCdmcmFnbWVudCd8J2NvbXB1dGUnfCdhbnknKX0gc2hhZGVyU3RhZ2UgLSBUaGUgc2hhZGVyIHN0YWdlLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHZhcnlpbmcgY29kZSBzZWN0aW9uLlxyXG5cdCAqL1xyXG5cdGdldFZhcnlpbmdzKCAvKnNoYWRlclN0YWdlKi8gKSB7XHJcblxyXG5cdFx0Y29uc29sZS53YXJuKCAnQWJzdHJhY3QgZnVuY3Rpb24uJyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBzaW5nbGUgdmFyaWFibGUgZGVmaW5pdGlvbiBhcyBhIHNoYWRlciBzdHJpbmcgZm9yIHRoZSBnaXZlbiB2YXJpYWJsZSB0eXBlIGFuZCBuYW1lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBUaGUgdmFyaWFibGUncyB0eXBlLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIHZhcmlhYmxlJ3MgbmFtZS5cclxuXHQgKiBAcGFyYW0gez9udW1iZXJ9IFtjb3VudD1udWxsXSAtIFRoZSBhcnJheSBsZW5ndGguXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgc2hhZGVyIHN0cmluZy5cclxuXHQgKi9cclxuXHRnZXRWYXIoIHR5cGUsIG5hbWUsIGNvdW50ID0gbnVsbCApIHtcclxuXHJcblx0XHRyZXR1cm4gYCR7IGNvdW50ICE9PSBudWxsID8gdGhpcy5nZW5lcmF0ZUFycmF5RGVjbGFyYXRpb24oIHR5cGUsIGNvdW50ICkgOiB0aGlzLmdldFR5cGUoIHR5cGUgKSB9ICR7IG5hbWUgfWA7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgdmFyaWFibGUgZGVmaW5pdGlvbnMgYXMgYSBzaGFkZXIgc3RyaW5nIGZvciB0aGUgZ2l2ZW4gc2hhZGVyIHN0YWdlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHsoJ3ZlcnRleCd8J2ZyYWdtZW50J3wnY29tcHV0ZSd8J2FueScpfSBzaGFkZXJTdGFnZSAtIFRoZSBzaGFkZXIgc3RhZ2UuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgdmFyaWFibGUgY29kZSBzZWN0aW9uLlxyXG5cdCAqL1xyXG5cdGdldFZhcnMoIHNoYWRlclN0YWdlICkge1xyXG5cclxuXHRcdGxldCBzbmlwcGV0ID0gJyc7XHJcblxyXG5cdFx0Y29uc3QgdmFycyA9IHRoaXMudmFyc1sgc2hhZGVyU3RhZ2UgXTtcclxuXHJcblx0XHRpZiAoIHZhcnMgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGZvciAoIGNvbnN0IHZhcmlhYmxlIG9mIHZhcnMgKSB7XHJcblxyXG5cdFx0XHRcdHNuaXBwZXQgKz0gYCR7IHRoaXMuZ2V0VmFyKCB2YXJpYWJsZS50eXBlLCB2YXJpYWJsZS5uYW1lICkgfTsgYDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHNuaXBwZXQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgdW5pZm9ybSBkZWZpbml0aW9ucyBhcyBhIHNoYWRlciBzdHJpbmcgZm9yIHRoZSBnaXZlbiBzaGFkZXIgc3RhZ2UuXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcGFyYW0geygndmVydGV4J3wnZnJhZ21lbnQnfCdjb21wdXRlJ3wnYW55Jyl9IHNoYWRlclN0YWdlIC0gVGhlIHNoYWRlciBzdGFnZS5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB1bmlmb3JtIGNvZGUgc2VjdGlvbi5cclxuXHQgKi9cclxuXHRnZXRVbmlmb3JtcyggLypzaGFkZXJTdGFnZSovICkge1xyXG5cclxuXHRcdGNvbnNvbGUud2FybiggJ0Fic3RyYWN0IGZ1bmN0aW9uLicgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBuYXRpdmUgY29kZSBkZWZpbml0aW9ucyBhcyBhIHNoYWRlciBzdHJpbmcgZm9yIHRoZSBnaXZlbiBzaGFkZXIgc3RhZ2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geygndmVydGV4J3wnZnJhZ21lbnQnfCdjb21wdXRlJ3wnYW55Jyl9IHNoYWRlclN0YWdlIC0gVGhlIHNoYWRlciBzdGFnZS5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBuYXRpdmUgY29kZSBzZWN0aW9uLlxyXG5cdCAqL1xyXG5cdGdldENvZGVzKCBzaGFkZXJTdGFnZSApIHtcclxuXHJcblx0XHRjb25zdCBjb2RlcyA9IHRoaXMuY29kZXNbIHNoYWRlclN0YWdlIF07XHJcblxyXG5cdFx0bGV0IGNvZGUgPSAnJztcclxuXHJcblx0XHRpZiAoIGNvZGVzICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBjb25zdCBub2RlQ29kZSBvZiBjb2RlcyApIHtcclxuXHJcblx0XHRcdFx0Y29kZSArPSBub2RlQ29kZS5jb2RlICsgJ1xcbic7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBjb2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGhhc2ggb2YgdGhpcyBub2RlIGJ1aWxkZXIuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBoYXNoLlxyXG5cdCAqL1xyXG5cdGdldEhhc2goKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMudmVydGV4U2hhZGVyICsgdGhpcy5mcmFnbWVudFNoYWRlciArIHRoaXMuY29tcHV0ZVNoYWRlcjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBjdXJyZW50IHNoYWRlciBzdGFnZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7PygndmVydGV4J3wnZnJhZ21lbnQnfCdjb21wdXRlJ3wnYW55Jyl9IHNoYWRlclN0YWdlIC0gVGhlIHNoYWRlciBzdGFnZSB0byBzZXQuXHJcblx0ICovXHJcblx0c2V0U2hhZGVyU3RhZ2UoIHNoYWRlclN0YWdlICkge1xyXG5cclxuXHRcdHRoaXMuc2hhZGVyU3RhZ2UgPSBzaGFkZXJTdGFnZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNoYWRlciBzdGFnZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4gez8oJ3ZlcnRleCd8J2ZyYWdtZW50J3wnY29tcHV0ZSd8J2FueScpfSBUaGUgY3VycmVudCBzaGFkZXIgc3RhZ2UuXHJcblx0ICovXHJcblx0Z2V0U2hhZGVyU3RhZ2UoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuc2hhZGVyU3RhZ2U7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgY3VycmVudCBidWlsZCBzdGFnZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Pygnc2V0dXAnfCdhbmFseXplJ3wnZ2VuZXJhdGUnKX0gYnVpbGRTdGFnZSAtIFRoZSBidWlsZCBzdGFnZSB0byBzZXQuXHJcblx0ICovXHJcblx0c2V0QnVpbGRTdGFnZSggYnVpbGRTdGFnZSApIHtcclxuXHJcblx0XHR0aGlzLmJ1aWxkU3RhZ2UgPSBidWlsZFN0YWdlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGN1cnJlbnQgYnVpbGQgc3RhZ2UuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHs/KCdzZXR1cCd8J2FuYWx5emUnfCdnZW5lcmF0ZScpfSBUaGUgY3VycmVudCBidWlsZCBzdGFnZS5cclxuXHQgKi9cclxuXHRnZXRCdWlsZFN0YWdlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmJ1aWxkU3RhZ2U7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29udHJvbHMgdGhlIGNvZGUgYnVpbGQgb2YgdGhlIHNoYWRlciBzdGFnZXMuXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKi9cclxuXHRidWlsZENvZGUoKSB7XHJcblxyXG5cdFx0Y29uc29sZS53YXJuKCAnQWJzdHJhY3QgZnVuY3Rpb24uJyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENlbnRyYWwgYnVpbGQgbWV0aG9kIHdoaWNoIGNvbnRyb2xzIHRoZSBidWlsZCBmb3IgdGhlIGdpdmVuIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge05vZGVCdWlsZGVyfSBBIHJlZmVyZW5jZSB0byB0aGlzIG5vZGUgYnVpbGRlci5cclxuXHQgKi9cclxuXHRidWlsZCgpIHtcclxuXHJcblx0XHRjb25zdCB7IG9iamVjdCwgbWF0ZXJpYWwsIHJlbmRlcmVyIH0gPSB0aGlzO1xyXG5cclxuXHRcdGlmICggbWF0ZXJpYWwgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRsZXQgbm9kZU1hdGVyaWFsID0gcmVuZGVyZXIubGlicmFyeS5mcm9tTWF0ZXJpYWwoIG1hdGVyaWFsICk7XHJcblxyXG5cdFx0XHRpZiAoIG5vZGVNYXRlcmlhbCA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0Y29uc29sZS5lcnJvciggYE5vZGVNYXRlcmlhbDogTWF0ZXJpYWwgXCIkeyBtYXRlcmlhbC50eXBlIH1cIiBpcyBub3QgY29tcGF0aWJsZS5gICk7XHJcblxyXG5cdFx0XHRcdG5vZGVNYXRlcmlhbCA9IG5ldyBOb2RlTWF0ZXJpYWwoKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdG5vZGVNYXRlcmlhbC5idWlsZCggdGhpcyApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR0aGlzLmFkZEZsb3coICdjb21wdXRlJywgb2JqZWN0ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIHNldHVwKCkgLT4gc3RhZ2UgMTogY3JlYXRlIHBvc3NpYmxlIG5ldyBub2RlcyBhbmQgcmV0dXJucyBhbiBvdXRwdXQgcmVmZXJlbmNlIG5vZGVcclxuXHRcdC8vIGFuYWx5emUoKSAgIC0+IHN0YWdlIDI6IGFuYWx5emUgbm9kZXMgdG8gcG9zc2libGUgb3B0aW1pemF0aW9uIGFuZCB2YWxpZGF0aW9uXHJcblx0XHQvLyBnZW5lcmF0ZSgpICAtPiBzdGFnZSAzOiBnZW5lcmF0ZSBzaGFkZXJcclxuXHJcblx0XHRmb3IgKCBjb25zdCBidWlsZFN0YWdlIG9mIGRlZmF1bHRCdWlsZFN0YWdlcyApIHtcclxuXHJcblx0XHRcdHRoaXMuc2V0QnVpbGRTdGFnZSggYnVpbGRTdGFnZSApO1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLmNvbnRleHQudmVydGV4ICYmIHRoaXMuY29udGV4dC52ZXJ0ZXguaXNOb2RlICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLmZsb3dOb2RlRnJvbVNoYWRlclN0YWdlKCAndmVydGV4JywgdGhpcy5jb250ZXh0LnZlcnRleCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Zm9yICggY29uc3Qgc2hhZGVyU3RhZ2Ugb2Ygc2hhZGVyU3RhZ2VzICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLnNldFNoYWRlclN0YWdlKCBzaGFkZXJTdGFnZSApO1xyXG5cclxuXHRcdFx0XHRjb25zdCBmbG93Tm9kZXMgPSB0aGlzLmZsb3dOb2Rlc1sgc2hhZGVyU3RhZ2UgXTtcclxuXHJcblx0XHRcdFx0Zm9yICggY29uc3Qgbm9kZSBvZiBmbG93Tm9kZXMgKSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBidWlsZFN0YWdlID09PSAnZ2VuZXJhdGUnICkge1xyXG5cclxuXHRcdFx0XHRcdFx0dGhpcy5mbG93Tm9kZSggbm9kZSApO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRub2RlLmJ1aWxkKCB0aGlzICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuc2V0QnVpbGRTdGFnZSggbnVsbCApO1xyXG5cdFx0dGhpcy5zZXRTaGFkZXJTdGFnZSggbnVsbCApO1xyXG5cclxuXHRcdC8vIHN0YWdlIDQ6IGJ1aWxkIGNvZGUgZm9yIGEgc3BlY2lmaWMgb3V0cHV0XHJcblxyXG5cdFx0dGhpcy5idWlsZENvZGUoKTtcclxuXHRcdHRoaXMuYnVpbGRVcGRhdGVOb2RlcygpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSB1bmlmb3JtIHJlcHJlc2VudGF0aW9uIHdoaWNoIGlzIGxhdGVyIHVzZWQgZm9yIFVCTyBnZW5lcmF0aW9uIGFuZCByZW5kZXJpbmcuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVVbmlmb3JtfSB1bmlmb3JtTm9kZSAtIFRoZSB1bmlmb3JtIG5vZGUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBUaGUgcmVxdWVzdGVkIHR5cGUuXHJcblx0ICogQHJldHVybiB7VW5pZm9ybX0gVGhlIHVuaWZvcm0uXHJcblx0ICovXHJcblx0Z2V0Tm9kZVVuaWZvcm0oIHVuaWZvcm1Ob2RlLCB0eXBlICkge1xyXG5cclxuXHRcdGlmICggdHlwZSA9PT0gJ2Zsb2F0JyB8fCB0eXBlID09PSAnaW50JyB8fCB0eXBlID09PSAndWludCcgKSByZXR1cm4gbmV3IE51bWJlck5vZGVVbmlmb3JtKCB1bmlmb3JtTm9kZSApO1xyXG5cdFx0aWYgKCB0eXBlID09PSAndmVjMicgfHwgdHlwZSA9PT0gJ2l2ZWMyJyB8fCB0eXBlID09PSAndXZlYzInICkgcmV0dXJuIG5ldyBWZWN0b3IyTm9kZVVuaWZvcm0oIHVuaWZvcm1Ob2RlICk7XHJcblx0XHRpZiAoIHR5cGUgPT09ICd2ZWMzJyB8fCB0eXBlID09PSAnaXZlYzMnIHx8IHR5cGUgPT09ICd1dmVjMycgKSByZXR1cm4gbmV3IFZlY3RvcjNOb2RlVW5pZm9ybSggdW5pZm9ybU5vZGUgKTtcclxuXHRcdGlmICggdHlwZSA9PT0gJ3ZlYzQnIHx8IHR5cGUgPT09ICdpdmVjNCcgfHwgdHlwZSA9PT0gJ3V2ZWM0JyApIHJldHVybiBuZXcgVmVjdG9yNE5vZGVVbmlmb3JtKCB1bmlmb3JtTm9kZSApO1xyXG5cdFx0aWYgKCB0eXBlID09PSAnY29sb3InICkgcmV0dXJuIG5ldyBDb2xvck5vZGVVbmlmb3JtKCB1bmlmb3JtTm9kZSApO1xyXG5cdFx0aWYgKCB0eXBlID09PSAnbWF0MicgKSByZXR1cm4gbmV3IE1hdHJpeDJOb2RlVW5pZm9ybSggdW5pZm9ybU5vZGUgKTtcclxuXHRcdGlmICggdHlwZSA9PT0gJ21hdDMnICkgcmV0dXJuIG5ldyBNYXRyaXgzTm9kZVVuaWZvcm0oIHVuaWZvcm1Ob2RlICk7XHJcblx0XHRpZiAoIHR5cGUgPT09ICdtYXQ0JyApIHJldHVybiBuZXcgTWF0cml4NE5vZGVVbmlmb3JtKCB1bmlmb3JtTm9kZSApO1xyXG5cclxuXHRcdHRocm93IG5ldyBFcnJvciggYFVuaWZvcm0gXCIke3R5cGV9XCIgbm90IGRlY2xhcmVkLmAgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGb3JtYXRzIHRoZSBnaXZlbiBzaGFkZXIgc25pcHBldCBmcm9tIGEgZ2l2ZW4gdHlwZSBpbnRvIGFub3RoZXIgb25lLiBFLmcuXHJcblx0ICogdGhpcyBtZXRob2QgbWlnaHQgYmUgdXNlZCB0byBjb252ZXJ0IGEgc2ltcGxlIGZsb2F0IHN0cmluZyBgXCIxLjBcImAgaW50byBhXHJcblx0ICogYHZlYzNgIHJlcHJlc2VudGF0aW9uOiBgXCJ2ZWMzPGYzMj4oIDEuMCApXCJgLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNuaXBwZXQgLSBUaGUgc2hhZGVyIHNuaXBwZXQuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGZyb21UeXBlIC0gVGhlIHNvdXJjZSB0eXBlLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0b1R5cGUgLSBUaGUgdGFyZ2V0IHR5cGUuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgdXBkYXRlZCBzaGFkZXIgc3RyaW5nLlxyXG5cdCAqL1xyXG5cdGZvcm1hdCggc25pcHBldCwgZnJvbVR5cGUsIHRvVHlwZSApIHtcclxuXHJcblx0XHRmcm9tVHlwZSA9IHRoaXMuZ2V0VmVjdG9yVHlwZSggZnJvbVR5cGUgKTtcclxuXHRcdHRvVHlwZSA9IHRoaXMuZ2V0VmVjdG9yVHlwZSggdG9UeXBlICk7XHJcblxyXG5cdFx0aWYgKCBmcm9tVHlwZSA9PT0gdG9UeXBlIHx8IHRvVHlwZSA9PT0gbnVsbCB8fCB0aGlzLmlzUmVmZXJlbmNlKCB0b1R5cGUgKSApIHtcclxuXHJcblx0XHRcdHJldHVybiBzbmlwcGV0O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBmcm9tVHlwZUxlbmd0aCA9IHRoaXMuZ2V0VHlwZUxlbmd0aCggZnJvbVR5cGUgKTtcclxuXHRcdGNvbnN0IHRvVHlwZUxlbmd0aCA9IHRoaXMuZ2V0VHlwZUxlbmd0aCggdG9UeXBlICk7XHJcblxyXG5cdFx0aWYgKCBmcm9tVHlwZUxlbmd0aCA9PT0gMTYgJiYgdG9UeXBlTGVuZ3RoID09PSA5ICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIGAkeyB0aGlzLmdldFR5cGUoIHRvVHlwZSApIH0oICR7IHNuaXBwZXQgfVsgMCBdLnh5eiwgJHsgc25pcHBldCB9WyAxIF0ueHl6LCAkeyBzbmlwcGV0IH1bIDIgXS54eXogKWA7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggZnJvbVR5cGVMZW5ndGggPT09IDkgJiYgdG9UeXBlTGVuZ3RoID09PSA0ICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIGAkeyB0aGlzLmdldFR5cGUoIHRvVHlwZSApIH0oICR7IHNuaXBwZXQgfVsgMCBdLnh5LCAkeyBzbmlwcGV0IH1bIDEgXS54eSApYDtcclxuXHJcblx0XHR9XHJcblxyXG5cclxuXHRcdGlmICggZnJvbVR5cGVMZW5ndGggPiA0ICkgeyAvLyBmcm9tVHlwZSBpcyBtYXRyaXgtbGlrZVxyXG5cclxuXHRcdFx0Ly8gQFRPRE86IGlnbm9yZSBmb3Igbm93XHJcblxyXG5cdFx0XHRyZXR1cm4gc25pcHBldDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0b1R5cGVMZW5ndGggPiA0IHx8IHRvVHlwZUxlbmd0aCA9PT0gMCApIHsgLy8gdG9UeXBlIGlzIG1hdHJpeC1saWtlIG9yIHVua25vd25cclxuXHJcblx0XHRcdC8vIEBUT0RPOiBpZ25vcmUgZm9yIG5vd1xyXG5cclxuXHRcdFx0cmV0dXJuIHNuaXBwZXQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggZnJvbVR5cGVMZW5ndGggPT09IHRvVHlwZUxlbmd0aCApIHtcclxuXHJcblx0XHRcdHJldHVybiBgJHsgdGhpcy5nZXRUeXBlKCB0b1R5cGUgKSB9KCAkeyBzbmlwcGV0IH0gKWA7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggZnJvbVR5cGVMZW5ndGggPiB0b1R5cGVMZW5ndGggKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gdGhpcy5mb3JtYXQoIGAkeyBzbmlwcGV0IH0uJHsgJ3h5eicuc2xpY2UoIDAsIHRvVHlwZUxlbmd0aCApIH1gLCB0aGlzLmdldFR5cGVGcm9tTGVuZ3RoKCB0b1R5cGVMZW5ndGgsIHRoaXMuZ2V0Q29tcG9uZW50VHlwZSggZnJvbVR5cGUgKSApLCB0b1R5cGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0b1R5cGVMZW5ndGggPT09IDQgJiYgZnJvbVR5cGVMZW5ndGggPiAxICkgeyAvLyB0b1R5cGUgaXMgdmVjNC1saWtlXHJcblxyXG5cdFx0XHRyZXR1cm4gYCR7IHRoaXMuZ2V0VHlwZSggdG9UeXBlICkgfSggJHsgdGhpcy5mb3JtYXQoIHNuaXBwZXQsIGZyb21UeXBlLCAndmVjMycgKSB9LCAxLjAgKWA7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggZnJvbVR5cGVMZW5ndGggPT09IDIgKSB7IC8vIGZyb21UeXBlIGlzIHZlYzItbGlrZSBhbmQgdG9UeXBlIGlzIHZlYzMtbGlrZVxyXG5cclxuXHRcdFx0cmV0dXJuIGAkeyB0aGlzLmdldFR5cGUoIHRvVHlwZSApIH0oICR7IHRoaXMuZm9ybWF0KCBzbmlwcGV0LCBmcm9tVHlwZSwgJ3ZlYzInICkgfSwgMC4wIClgO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGZyb21UeXBlTGVuZ3RoID09PSAxICYmIHRvVHlwZUxlbmd0aCA+IDEgJiYgZnJvbVR5cGUgIT09IHRoaXMuZ2V0Q29tcG9uZW50VHlwZSggdG9UeXBlICkgKSB7IC8vIGZyb21UeXBlIGlzIGZsb2F0LWxpa2VcclxuXHJcblx0XHRcdC8vIGNvbnZlcnQgYSBudW1iZXIgdmFsdWUgdG8gdmVjdG9yIHR5cGUsIGUuZzpcclxuXHRcdFx0Ly8gdmVjMyggMXUgKSAtPiB2ZWMzKCBmbG9hdCggMXUgKSApXHJcblxyXG5cdFx0XHRzbmlwcGV0ID0gYCR7IHRoaXMuZ2V0VHlwZSggdGhpcy5nZXRDb21wb25lbnRUeXBlKCB0b1R5cGUgKSApIH0oICR7IHNuaXBwZXQgfSApYDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGAkeyB0aGlzLmdldFR5cGUoIHRvVHlwZSApIH0oICR7IHNuaXBwZXQgfSApYDsgLy8gZnJvbVR5cGUgaXMgZmxvYXQtbGlrZVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBzaWduYXR1cmUgd2l0aCB0aGUgZW5naW5lJ3MgY3VycmVudCByZXZpc2lvbi5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHNpZ25hdHVyZS5cclxuXHQgKi9cclxuXHRnZXRTaWduYXR1cmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIGAvLyBUaHJlZS5qcyByJHsgUkVWSVNJT04gfSAtIE5vZGUgU3lzdGVtXFxuYDtcclxuXHJcblx0fVxyXG5cclxuXHQvLyBEZXByZWNhdGVkXHJcblxyXG5cdC8qKlxyXG5cdCAqIEBmdW5jdGlvblxyXG5cdCAqIEBkZXByZWNhdGVkIHNpbmNlIHIxNjguIFVzZSBgbmV3IE5vZGVNYXRlcmlhbCgpYCBpbnN0ZWFkLCB3aXRoIHRhcmdldGVkIG5vZGUgbWF0ZXJpYWwgbmFtZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbdHlwZT0nTm9kZU1hdGVyaWFsJ10gLSBUaGUgbm9kZSBtYXRlcmlhbCB0eXBlLlxyXG5cdCAqIEB0aHJvd3Mge0Vycm9yfVxyXG5cdCAqL1xyXG5cdGNyZWF0ZU5vZGVNYXRlcmlhbCggdHlwZSA9ICdOb2RlTWF0ZXJpYWwnICkgeyAvLyBAZGVwcmVjYXRlZCwgcjE2OFxyXG5cclxuXHRcdHRocm93IG5ldyBFcnJvciggYFRIUkVFLk5vZGVCdWlsZGVyOiBjcmVhdGVOb2RlTWF0ZXJpYWwoKSB3YXMgZGVwcmVjYXRlZC4gVXNlIG5ldyAkeyB0eXBlIH0oKSBpbnN0ZWFkLmAgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTm9kZUJ1aWxkZXI7XHJcbiIsImltcG9ydCB7IE5vZGVVcGRhdGVUeXBlIH0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xyXG5cclxuLyoqXHJcbiAqIE1hbmFnZW1lbnQgY2xhc3MgZm9yIHVwZGF0aW5nIG5vZGVzLiBUaGUgbW9kdWxlIHRyYWNrcyBtZXRyaWNzIGxpa2VcclxuICogdGhlIGVsYXBzZWQgdGltZSwgZGVsdGEgdGltZSwgdGhlIHJlbmRlciBhbmQgZnJhbWUgSUQgdG8gY29ycmVjdGx5XHJcbiAqIGNhbGwgdGhlIG5vZGUgdXBkYXRlIG1ldGhvZHMge0BsaW5rIE5vZGUjdXBkYXRlQmVmb3JlfSwge0BsaW5rIE5vZGUjdXBkYXRlfVxyXG4gKiBhbmQge0BsaW5rIE5vZGUjdXBkYXRlQWZ0ZXJ9IGRlcGVuZGluZyBvbiB0aGUgbm9kZSdzIGNvbmZpZ3VyYXRpb24uXHJcbiAqL1xyXG5jbGFzcyBOb2RlRnJhbWUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG5vZGUgZmFtZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBlbGFwc2VkIHRpbWUgaW4gc2Vjb25kcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRpbWUgPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGRlbHRhIHRpbWUgaW4gc2Vjb25kcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRlbHRhVGltZSA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZnJhbWUgSUQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5mcmFtZUlkID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByZW5kZXIgSUQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yZW5kZXJJZCA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBVc2VkIHRvIGNvbnRyb2wgdGhlIHtAbGluayBOb2RlI3VwZGF0ZX0gY2FsbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2Vha01hcDxOb2RlLCBPYmplY3Q+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVwZGF0ZU1hcCA9IG5ldyBXZWFrTWFwKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBVc2VkIHRvIGNvbnRyb2wgdGhlIHtAbGluayBOb2RlI3VwZGF0ZUJlZm9yZX0gY2FsbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2Vha01hcDxOb2RlLCBPYmplY3Q+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVwZGF0ZUJlZm9yZU1hcCA9IG5ldyBXZWFrTWFwKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBVc2VkIHRvIGNvbnRyb2wgdGhlIHtAbGluayBOb2RlI3VwZGF0ZUFmdGVyfSBjYWxsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtXZWFrTWFwPE5vZGUsIE9iamVjdD59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXBkYXRlQWZ0ZXJNYXAgPSBuZXcgV2Vha01hcCgpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgcmVuZGVyZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9SZW5kZXJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yZW5kZXJlciA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P01hdGVyaWFsfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1hdGVyaWFsID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGNhbWVyYS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P0NhbWVyYX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jYW1lcmEgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgM0Qgb2JqZWN0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/T2JqZWN0M0R9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMub2JqZWN0ID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IHNjZW5lLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/U2NlbmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2NlbmUgPSBudWxsO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBkaWN0aW9uYXJ5IGZvciBhIGdpdmVuIG5vZGUgYW5kIHVwZGF0ZSBtYXAgd2hpY2hcclxuXHQgKiBpcyB1c2VkIHRvIGNvcnJlY3RseSBjYWxsIG5vZGUgdXBkYXRlIG1ldGhvZHMgcGVyIGZyYW1lIG9yIHJlbmRlci5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtXZWFrTWFwPE5vZGUsIE9iamVjdD59IHJlZmVyZW5jZU1hcCAtIFRoZSByZWZlcmVuY2Ugd2VhayBtYXAuXHJcblx0ICogQHBhcmFtIHtOb2RlfSBub2RlUmVmIC0gVGhlIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBub2RlLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdDxzdHJpbmcsV2Vha01hcD59IFRoZSBkaWN0aW9uYXJ5LlxyXG5cdCAqL1xyXG5cdF9nZXRNYXBzKCByZWZlcmVuY2VNYXAsIG5vZGVSZWYgKSB7XHJcblxyXG5cdFx0bGV0IG1hcHMgPSByZWZlcmVuY2VNYXAuZ2V0KCBub2RlUmVmICk7XHJcblxyXG5cdFx0aWYgKCBtYXBzID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRtYXBzID0ge1xyXG5cdFx0XHRcdHJlbmRlck1hcDogbmV3IFdlYWtNYXAoKSxcclxuXHRcdFx0XHRmcmFtZU1hcDogbmV3IFdlYWtNYXAoKVxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0cmVmZXJlbmNlTWFwLnNldCggbm9kZVJlZiwgbWFwcyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbWFwcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBleGVjdXRlcyB0aGUge0BsaW5rIE5vZGUjdXBkYXRlQmVmb3JlfSBmb3IgdGhlIGdpdmVuIG5vZGUuXHJcblx0ICogSXQgbWFrZXMgc3VyZSB7QGxpbmsgTm9kZSN1cGRhdGVCZWZvcmVUeXBlfSBpcyBob25vcmVkIG1lYW5pbmcgdGhlIHVwZGF0ZVxyXG5cdCAqIGlzIG9ubHkgZXhlY3V0ZWQgb25jZSBwZXIgZnJhbWUsIHJlbmRlciBvciBvYmplY3QgZGVwZW5kaW5nIG9uIHRoZSB1cGRhdGVcclxuXHQgKiB0eXBlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIG5vZGUgdGhhdCBzaG91bGQgYmUgdXBkYXRlZC5cclxuXHQgKi9cclxuXHR1cGRhdGVCZWZvcmVOb2RlKCBub2RlICkge1xyXG5cclxuXHRcdGNvbnN0IHVwZGF0ZVR5cGUgPSBub2RlLmdldFVwZGF0ZUJlZm9yZVR5cGUoKTtcclxuXHRcdGNvbnN0IHJlZmVyZW5jZSA9IG5vZGUudXBkYXRlUmVmZXJlbmNlKCB0aGlzICk7XHJcblxyXG5cdFx0aWYgKCB1cGRhdGVUeXBlID09PSBOb2RlVXBkYXRlVHlwZS5GUkFNRSApIHtcclxuXHJcblx0XHRcdGNvbnN0IHsgZnJhbWVNYXAgfSA9IHRoaXMuX2dldE1hcHMoIHRoaXMudXBkYXRlQmVmb3JlTWFwLCByZWZlcmVuY2UgKTtcclxuXHJcblx0XHRcdGlmICggZnJhbWVNYXAuZ2V0KCByZWZlcmVuY2UgKSAhPT0gdGhpcy5mcmFtZUlkICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIG5vZGUudXBkYXRlQmVmb3JlKCB0aGlzICkgIT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0XHRcdGZyYW1lTWFwLnNldCggcmVmZXJlbmNlLCB0aGlzLmZyYW1lSWQgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHVwZGF0ZVR5cGUgPT09IE5vZGVVcGRhdGVUeXBlLlJFTkRFUiApIHtcclxuXHJcblx0XHRcdGNvbnN0IHsgcmVuZGVyTWFwIH0gPSB0aGlzLl9nZXRNYXBzKCB0aGlzLnVwZGF0ZUJlZm9yZU1hcCwgcmVmZXJlbmNlICk7XHJcblxyXG5cdFx0XHRpZiAoIHJlbmRlck1hcC5nZXQoIHJlZmVyZW5jZSApICE9PSB0aGlzLnJlbmRlcklkICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIG5vZGUudXBkYXRlQmVmb3JlKCB0aGlzICkgIT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0XHRcdHJlbmRlck1hcC5zZXQoIHJlZmVyZW5jZSwgdGhpcy5yZW5kZXJJZCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmICggdXBkYXRlVHlwZSA9PT0gTm9kZVVwZGF0ZVR5cGUuT0JKRUNUICkge1xyXG5cclxuXHRcdFx0bm9kZS51cGRhdGVCZWZvcmUoIHRoaXMgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgZXhlY3V0ZXMgdGhlIHtAbGluayBOb2RlI3VwZGF0ZUFmdGVyfSBmb3IgdGhlIGdpdmVuIG5vZGUuXHJcblx0ICogSXQgbWFrZXMgc3VyZSB7QGxpbmsgTm9kZSN1cGRhdGVBZnRlclR5cGV9IGlzIGhvbm9yZWQgbWVhbmluZyB0aGUgdXBkYXRlXHJcblx0ICogaXMgb25seSBleGVjdXRlZCBvbmNlIHBlciBmcmFtZSwgcmVuZGVyIG9yIG9iamVjdCBkZXBlbmRpbmcgb24gdGhlIHVwZGF0ZVxyXG5cdCAqIHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBUaGUgbm9kZSB0aGF0IHNob3VsZCBiZSB1cGRhdGVkLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZUFmdGVyTm9kZSggbm9kZSApIHtcclxuXHJcblx0XHRjb25zdCB1cGRhdGVUeXBlID0gbm9kZS5nZXRVcGRhdGVBZnRlclR5cGUoKTtcclxuXHRcdGNvbnN0IHJlZmVyZW5jZSA9IG5vZGUudXBkYXRlUmVmZXJlbmNlKCB0aGlzICk7XHJcblxyXG5cdFx0aWYgKCB1cGRhdGVUeXBlID09PSBOb2RlVXBkYXRlVHlwZS5GUkFNRSApIHtcclxuXHJcblx0XHRcdGNvbnN0IHsgZnJhbWVNYXAgfSA9IHRoaXMuX2dldE1hcHMoIHRoaXMudXBkYXRlQWZ0ZXJNYXAsIHJlZmVyZW5jZSApO1xyXG5cclxuXHRcdFx0aWYgKCBmcmFtZU1hcC5nZXQoIHJlZmVyZW5jZSApICE9PSB0aGlzLmZyYW1lSWQgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggbm9kZS51cGRhdGVBZnRlciggdGhpcyApICE9PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdFx0XHRmcmFtZU1hcC5zZXQoIHJlZmVyZW5jZSwgdGhpcy5mcmFtZUlkICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2UgaWYgKCB1cGRhdGVUeXBlID09PSBOb2RlVXBkYXRlVHlwZS5SRU5ERVIgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB7IHJlbmRlck1hcCB9ID0gdGhpcy5fZ2V0TWFwcyggdGhpcy51cGRhdGVBZnRlck1hcCwgcmVmZXJlbmNlICk7XHJcblxyXG5cdFx0XHRpZiAoIHJlbmRlck1hcC5nZXQoIHJlZmVyZW5jZSApICE9PSB0aGlzLnJlbmRlcklkICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIG5vZGUudXBkYXRlQWZ0ZXIoIHRoaXMgKSAhPT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRcdFx0cmVuZGVyTWFwLnNldCggcmVmZXJlbmNlLCB0aGlzLnJlbmRlcklkICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2UgaWYgKCB1cGRhdGVUeXBlID09PSBOb2RlVXBkYXRlVHlwZS5PQkpFQ1QgKSB7XHJcblxyXG5cdFx0XHRub2RlLnVwZGF0ZUFmdGVyKCB0aGlzICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGV4ZWN1dGVzIHRoZSB7QGxpbmsgTm9kZSN1cGRhdGV9IGZvciB0aGUgZ2l2ZW4gbm9kZS5cclxuXHQgKiBJdCBtYWtlcyBzdXJlIHtAbGluayBOb2RlI3VwZGF0ZVR5cGV9IGlzIGhvbm9yZWQgbWVhbmluZyB0aGUgdXBkYXRlXHJcblx0ICogaXMgb25seSBleGVjdXRlZCBvbmNlIHBlciBmcmFtZSwgcmVuZGVyIG9yIG9iamVjdCBkZXBlbmRpbmcgb24gdGhlIHVwZGF0ZVxyXG5cdCAqIHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBUaGUgbm9kZSB0aGF0IHNob3VsZCBiZSB1cGRhdGVkLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZU5vZGUoIG5vZGUgKSB7XHJcblxyXG5cdFx0Y29uc3QgdXBkYXRlVHlwZSA9IG5vZGUuZ2V0VXBkYXRlVHlwZSgpO1xyXG5cdFx0Y29uc3QgcmVmZXJlbmNlID0gbm9kZS51cGRhdGVSZWZlcmVuY2UoIHRoaXMgKTtcclxuXHJcblx0XHRpZiAoIHVwZGF0ZVR5cGUgPT09IE5vZGVVcGRhdGVUeXBlLkZSQU1FICkge1xyXG5cclxuXHRcdFx0Y29uc3QgeyBmcmFtZU1hcCB9ID0gdGhpcy5fZ2V0TWFwcyggdGhpcy51cGRhdGVNYXAsIHJlZmVyZW5jZSApO1xyXG5cclxuXHRcdFx0aWYgKCBmcmFtZU1hcC5nZXQoIHJlZmVyZW5jZSApICE9PSB0aGlzLmZyYW1lSWQgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggbm9kZS51cGRhdGUoIHRoaXMgKSAhPT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRcdFx0ZnJhbWVNYXAuc2V0KCByZWZlcmVuY2UsIHRoaXMuZnJhbWVJZCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmICggdXBkYXRlVHlwZSA9PT0gTm9kZVVwZGF0ZVR5cGUuUkVOREVSICkge1xyXG5cclxuXHRcdFx0Y29uc3QgeyByZW5kZXJNYXAgfSA9IHRoaXMuX2dldE1hcHMoIHRoaXMudXBkYXRlTWFwLCByZWZlcmVuY2UgKTtcclxuXHJcblx0XHRcdGlmICggcmVuZGVyTWFwLmdldCggcmVmZXJlbmNlICkgIT09IHRoaXMucmVuZGVySWQgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggbm9kZS51cGRhdGUoIHRoaXMgKSAhPT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRcdFx0cmVuZGVyTWFwLnNldCggcmVmZXJlbmNlLCB0aGlzLnJlbmRlcklkICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2UgaWYgKCB1cGRhdGVUeXBlID09PSBOb2RlVXBkYXRlVHlwZS5PQkpFQ1QgKSB7XHJcblxyXG5cdFx0XHRub2RlLnVwZGF0ZSggdGhpcyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgbm9kZSBmcmFtZS4gVGhpcyBtZXRob2QgaXNcclxuXHQgKiBjYWxsZWQgYnkgdGhlIHJlbmRlcmVyIGluIGl0cyBpbnRlcm5hbCBhbmltYXRpb24gbG9vcC5cclxuXHQgKi9cclxuXHR1cGRhdGUoKSB7XHJcblxyXG5cdFx0dGhpcy5mcmFtZUlkICsrO1xyXG5cclxuXHRcdGlmICggdGhpcy5sYXN0VGltZSA9PT0gdW5kZWZpbmVkICkgdGhpcy5sYXN0VGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xyXG5cclxuXHRcdHRoaXMuZGVsdGFUaW1lID0gKCBwZXJmb3JtYW5jZS5ub3coKSAtIHRoaXMubGFzdFRpbWUgKSAvIDEwMDA7XHJcblxyXG5cdFx0dGhpcy5sYXN0VGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xyXG5cclxuXHRcdHRoaXMudGltZSArPSB0aGlzLmRlbHRhVGltZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTm9kZUZyYW1lO1xyXG4iLCIvKipcclxuICogRGVzY3JpYmVzIHRoZSBpbnB1dCBvZiBhIHtAbGluayBOb2RlRnVuY3Rpb259LlxyXG4gKi9cclxuY2xhc3MgTm9kZUZ1bmN0aW9uSW5wdXQge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG5vZGUgZnVuY3Rpb24gaW5wdXQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSBpbnB1dCB0eXBlLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIGlucHV0IG5hbWUuXHJcblx0ICogQHBhcmFtIHs/bnVtYmVyfSBbY291bnQ9bnVsbF0gLSBJZiB0aGUgaW5wdXQgaXMgYW4gQXJyYXksIGNvdW50IHdpbGwgYmUgdGhlIGxlbmd0aC5cclxuXHQgKiBAcGFyYW0geygnaW4nfCdvdXQnfCdpbm91dCcpfSBbcXVhbGlmaWVyPScnXSAtIFRoZSBwYXJhbWV0ZXIgcXVhbGlmaWVyIChvbmx5IHJlbGV2YW50IGZvciBHTFNMKS5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0NvbnN0PWZhbHNlXSAtIFdoZXRoZXIgdGhlIGlucHV0IHVzZXMgYSBjb25zdCBxdWFsaWZpZXIgb3Igbm90IChvbmx5IHJlbGV2YW50IGZvciBHTFNMKS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggdHlwZSwgbmFtZSwgY291bnQgPSBudWxsLCBxdWFsaWZpZXIgPSAnJywgaXNDb25zdCA9IGZhbHNlICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogIFRoZSBpbnB1dCB0eXBlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudHlwZSA9IHR5cGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgaW5wdXQgbmFtZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5hbWUgPSBuYW1lO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSWYgdGhlIGlucHV0IGlzIGFuIEFycmF5LCBjb3VudCB3aWxsIGJlIHRoZSBsZW5ndGguXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9udW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY291bnQgPSBjb3VudDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqVGhlIHBhcmFtZXRlciBxdWFsaWZpZXIgKG9ubHkgcmVsZXZhbnQgZm9yIEdMU0wpLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoJ2luJ3wnb3V0J3wnaW5vdXQnKX1cclxuXHRcdCAqIEBkZWZhdWx0ICcnXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucXVhbGlmaWVyID0gcXVhbGlmaWVyO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgaW5wdXQgdXNlcyBhIGNvbnN0IHF1YWxpZmllciBvciBub3QgKG9ubHkgcmVsZXZhbnQgZm9yIEdMU0wpLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0NvbnN0ID0gaXNDb25zdDtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuTm9kZUZ1bmN0aW9uSW5wdXQuaXNOb2RlRnVuY3Rpb25JbnB1dCA9IHRydWU7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBOb2RlRnVuY3Rpb25JbnB1dDtcclxuIiwiaW1wb3J0IEFuYWx5dGljTGlnaHROb2RlIGZyb20gJy4vQW5hbHl0aWNMaWdodE5vZGUuanMnO1xyXG5pbXBvcnQgeyBsaWdodFRhcmdldERpcmVjdGlvbiB9IGZyb20gJy4uL2FjY2Vzc29ycy9MaWdodHMuanMnO1xyXG5cclxuLyoqXHJcbiAqIE1vZHVsZSBmb3IgcmVwcmVzZW50aW5nIGRpcmVjdGlvbmFsIGxpZ2h0cyBhcyBub2Rlcy5cclxuICpcclxuICogQGF1Z21lbnRzIEFuYWx5dGljTGlnaHROb2RlXHJcbiAqL1xyXG5jbGFzcyBEaXJlY3Rpb25hbExpZ2h0Tm9kZSBleHRlbmRzIEFuYWx5dGljTGlnaHROb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnRGlyZWN0aW9uYWxMaWdodE5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgZGlyZWN0aW9uYWwgbGlnaHQgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7P0RpcmVjdGlvbmFsTGlnaHR9IFtsaWdodD1udWxsXSAtIFRoZSBkaXJlY3Rpb25hbCBsaWdodCBzb3VyY2UuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGxpZ2h0ID0gbnVsbCApIHtcclxuXHJcblx0XHRzdXBlciggbGlnaHQgKTtcclxuXHJcblx0fVxyXG5cclxuXHRzZXR1cERpcmVjdCgpIHtcclxuXHJcblx0XHRjb25zdCBsaWdodENvbG9yID0gdGhpcy5jb2xvck5vZGU7XHJcblx0XHRjb25zdCBsaWdodERpcmVjdGlvbiA9IGxpZ2h0VGFyZ2V0RGlyZWN0aW9uKCB0aGlzLmxpZ2h0ICk7XHJcblxyXG5cdFx0cmV0dXJuIHsgbGlnaHREaXJlY3Rpb24sIGxpZ2h0Q29sb3IgfTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgRGlyZWN0aW9uYWxMaWdodE5vZGU7XHJcbiIsImltcG9ydCBBbmFseXRpY0xpZ2h0Tm9kZSBmcm9tICcuL0FuYWx5dGljTGlnaHROb2RlLmpzJztcclxuaW1wb3J0IHsgdGV4dHVyZSB9IGZyb20gJy4uL2FjY2Vzc29ycy9UZXh0dXJlTm9kZS5qcyc7XHJcbmltcG9ydCB7IHVuaWZvcm0gfSBmcm9tICcuLi9jb3JlL1VuaWZvcm1Ob2RlLmpzJztcclxuaW1wb3J0IHsgbGlnaHRWaWV3UG9zaXRpb24gfSBmcm9tICcuLi9hY2Nlc3NvcnMvTGlnaHRzLmpzJztcclxuaW1wb3J0IHsgcmVuZGVyR3JvdXAgfSBmcm9tICcuLi9jb3JlL1VuaWZvcm1Hcm91cE5vZGUuanMnO1xyXG5cclxuaW1wb3J0IHsgTWF0cml4NCB9IGZyb20gJy4uLy4uL21hdGgvTWF0cml4NC5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBOb2RlVXBkYXRlVHlwZSB9IGZyb20gJy4uL2NvcmUvY29uc3RhbnRzLmpzJztcclxuXHJcbmNvbnN0IF9tYXRyaXg0MSA9IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDQoKTtcclxuY29uc3QgX21hdHJpeDQyID0gLypAX19QVVJFX18qLyBuZXcgTWF0cml4NCgpO1xyXG5cclxubGV0IF9sdGNMaWIgPSBudWxsO1xyXG5cclxuLyoqXHJcbiAqIE1vZHVsZSBmb3IgcmVwcmVzZW50aW5nIHJlY3QgYXJlYSBsaWdodHMgYXMgbm9kZXMuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBBbmFseXRpY0xpZ2h0Tm9kZVxyXG4gKi9cclxuY2xhc3MgUmVjdEFyZWFMaWdodE5vZGUgZXh0ZW5kcyBBbmFseXRpY0xpZ2h0Tm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ1JlY3RBcmVhTGlnaHROb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHJlY3QgYXJlYSBsaWdodCBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHs/UmVjdEFyZWFMaWdodH0gW2xpZ2h0PW51bGxdIC0gVGhlIHJlY3QgYXJlYSBsaWdodCBzb3VyY2UuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGxpZ2h0ID0gbnVsbCApIHtcclxuXHJcblx0XHRzdXBlciggbGlnaHQgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFVuaWZvcm0gbm9kZSByZXByZXNlbnRpbmcgdGhlIGhhbGYgaGVpZ2h0IG9mIHRoZSBhcmUgbGlnaHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1VuaWZvcm1Ob2RlPHZlYzM+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmhhbGZIZWlnaHQgPSB1bmlmb3JtKCBuZXcgVmVjdG9yMygpICkuc2V0R3JvdXAoIHJlbmRlckdyb3VwICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBVbmlmb3JtIG5vZGUgcmVwcmVzZW50aW5nIHRoZSBoYWxmIHdpZHRoIG9mIHRoZSBhcmUgbGlnaHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1VuaWZvcm1Ob2RlPHZlYzM+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmhhbGZXaWR0aCA9IHVuaWZvcm0oIG5ldyBWZWN0b3IzKCkgKS5zZXRHcm91cCggcmVuZGVyR3JvdXAgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBgdXBkYXRlVHlwZWAgaXMgc2V0IHRvIGBOb2RlVXBkYXRlVHlwZS5SRU5ERVJgIHNpbmNlIHRoZSBsaWdodFxyXG5cdFx0ICogcmVsaWVzIG9uIGB2aWV3TWF0cml4YCB3aGljaCBtaWdodCB2YXJ5IHBlciByZW5kZXIgY2FsbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICogQGRlZmF1bHQgJ3JlbmRlcidcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51cGRhdGVUeXBlID0gTm9kZVVwZGF0ZVR5cGUuUkVOREVSO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE92ZXJ3cml0dGVuIHRvIHVwZGF0ZWQgcmVjdCBhcmVhIGxpZ2h0IHNwZWNpZmljIHVuaWZvcm1zLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlRnJhbWV9IGZyYW1lIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgbm9kZSBmcmFtZS5cclxuXHQgKi9cclxuXHR1cGRhdGUoIGZyYW1lICkge1xyXG5cclxuXHRcdHN1cGVyLnVwZGF0ZSggZnJhbWUgKTtcclxuXHJcblx0XHRjb25zdCB7IGxpZ2h0IH0gPSB0aGlzO1xyXG5cclxuXHRcdGNvbnN0IHZpZXdNYXRyaXggPSBmcmFtZS5jYW1lcmEubWF0cml4V29ybGRJbnZlcnNlO1xyXG5cclxuXHRcdF9tYXRyaXg0Mi5pZGVudGl0eSgpO1xyXG5cdFx0X21hdHJpeDQxLmNvcHkoIGxpZ2h0Lm1hdHJpeFdvcmxkICk7XHJcblx0XHRfbWF0cml4NDEucHJlbXVsdGlwbHkoIHZpZXdNYXRyaXggKTtcclxuXHRcdF9tYXRyaXg0Mi5leHRyYWN0Um90YXRpb24oIF9tYXRyaXg0MSApO1xyXG5cclxuXHRcdHRoaXMuaGFsZldpZHRoLnZhbHVlLnNldCggbGlnaHQud2lkdGggKiAwLjUsIDAuMCwgMC4wICk7XHJcblx0XHR0aGlzLmhhbGZIZWlnaHQudmFsdWUuc2V0KCAwLjAsIGxpZ2h0LmhlaWdodCAqIDAuNSwgMC4wICk7XHJcblxyXG5cdFx0dGhpcy5oYWxmV2lkdGgudmFsdWUuYXBwbHlNYXRyaXg0KCBfbWF0cml4NDIgKTtcclxuXHRcdHRoaXMuaGFsZkhlaWdodC52YWx1ZS5hcHBseU1hdHJpeDQoIF9tYXRyaXg0MiApO1xyXG5cclxuXHR9XHJcblxyXG5cdHNldHVwRGlyZWN0UmVjdEFyZWEoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0bGV0IGx0Y18xLCBsdGNfMjtcclxuXHJcblx0XHRpZiAoIGJ1aWxkZXIuaXNBdmFpbGFibGUoICdmbG9hdDMyRmlsdGVyYWJsZScgKSApIHtcclxuXHJcblx0XHRcdGx0Y18xID0gdGV4dHVyZSggX2x0Y0xpYi5MVENfRkxPQVRfMSApO1xyXG5cdFx0XHRsdGNfMiA9IHRleHR1cmUoIF9sdGNMaWIuTFRDX0ZMT0FUXzIgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0bHRjXzEgPSB0ZXh0dXJlKCBfbHRjTGliLkxUQ19IQUxGXzEgKTtcclxuXHRcdFx0bHRjXzIgPSB0ZXh0dXJlKCBfbHRjTGliLkxUQ19IQUxGXzIgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgeyBjb2xvck5vZGUsIGxpZ2h0IH0gPSB0aGlzO1xyXG5cclxuXHRcdGNvbnN0IGxpZ2h0UG9zaXRpb24gPSBsaWdodFZpZXdQb3NpdGlvbiggbGlnaHQgKTtcclxuXHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHRsaWdodENvbG9yOiBjb2xvck5vZGUsXHJcblx0XHRcdGxpZ2h0UG9zaXRpb24sXHJcblx0XHRcdGhhbGZXaWR0aDogdGhpcy5oYWxmV2lkdGgsXHJcblx0XHRcdGhhbGZIZWlnaHQ6IHRoaXMuaGFsZkhlaWdodCxcclxuXHRcdFx0bHRjXzEsXHJcblx0XHRcdGx0Y18yXHJcblx0XHR9O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVzZWQgdG8gY29uZmlndXJlIHRoZSBpbnRlcm5hbCBCUkRGIGFwcHJveGltYXRpb24gdGV4dHVyZSBkYXRhLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSZWN0QXJlYUxpZ2h0VGV4dHVyZXNMaWJ9IGx0YyAtIFRoZSBCUkRGIGFwcHJveGltYXRpb24gdGV4dHVyZSBkYXRhLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBzZXRMVEMoIGx0YyApIHtcclxuXHJcblx0XHRfbHRjTGliID0gbHRjO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBSZWN0QXJlYUxpZ2h0Tm9kZTtcclxuIiwiaW1wb3J0IEFuYWx5dGljTGlnaHROb2RlIGZyb20gJy4vQW5hbHl0aWNMaWdodE5vZGUuanMnO1xyXG5pbXBvcnQgeyBnZXREaXN0YW5jZUF0dGVudWF0aW9uIH0gZnJvbSAnLi9MaWdodFV0aWxzLmpzJztcclxuaW1wb3J0IHsgdW5pZm9ybSB9IGZyb20gJy4uL2NvcmUvVW5pZm9ybU5vZGUuanMnO1xyXG5pbXBvcnQgeyBzbW9vdGhzdGVwIH0gZnJvbSAnLi4vbWF0aC9NYXRoTm9kZS5qcyc7XHJcbmltcG9ydCB7IHJlbmRlckdyb3VwIH0gZnJvbSAnLi4vY29yZS9Vbmlmb3JtR3JvdXBOb2RlLmpzJztcclxuaW1wb3J0IHsgbGlnaHRUYXJnZXREaXJlY3Rpb24sIGxpZ2h0UHJvamVjdGlvblVWIH0gZnJvbSAnLi4vYWNjZXNzb3JzL0xpZ2h0cy5qcyc7XHJcbmltcG9ydCB7IHRleHR1cmUgfSBmcm9tICcuLi9hY2Nlc3NvcnMvVGV4dHVyZU5vZGUuanMnO1xyXG5cclxuLyoqXHJcbiAqIE1vZHVsZSBmb3IgcmVwcmVzZW50aW5nIHNwb3QgbGlnaHRzIGFzIG5vZGVzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQW5hbHl0aWNMaWdodE5vZGVcclxuICovXHJcbmNsYXNzIFNwb3RMaWdodE5vZGUgZXh0ZW5kcyBBbmFseXRpY0xpZ2h0Tm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ1Nwb3RMaWdodE5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc3BvdCBsaWdodCBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHs/U3BvdExpZ2h0fSBbbGlnaHQ9bnVsbF0gLSBUaGUgc3BvdCBsaWdodCBzb3VyY2UuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGxpZ2h0ID0gbnVsbCApIHtcclxuXHJcblx0XHRzdXBlciggbGlnaHQgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFVuaWZvcm0gbm9kZSByZXByZXNlbnRpbmcgdGhlIGNvbmUgY29zaW5lLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtVbmlmb3JtTm9kZTxmbG9hdD59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29uZUNvc05vZGUgPSB1bmlmb3JtKCAwICkuc2V0R3JvdXAoIHJlbmRlckdyb3VwICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBVbmlmb3JtIG5vZGUgcmVwcmVzZW50aW5nIHRoZSBwZW51bWJyYSBjb3NpbmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1VuaWZvcm1Ob2RlPGZsb2F0Pn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wZW51bWJyYUNvc05vZGUgPSB1bmlmb3JtKCAwICkuc2V0R3JvdXAoIHJlbmRlckdyb3VwICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBVbmlmb3JtIG5vZGUgcmVwcmVzZW50aW5nIHRoZSBjdXRvZmYgZGlzdGFuY2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1VuaWZvcm1Ob2RlPGZsb2F0Pn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jdXRvZmZEaXN0YW5jZU5vZGUgPSB1bmlmb3JtKCAwICkuc2V0R3JvdXAoIHJlbmRlckdyb3VwICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBVbmlmb3JtIG5vZGUgcmVwcmVzZW50aW5nIHRoZSBkZWNheSBleHBvbmVudC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VW5pZm9ybU5vZGU8ZmxvYXQ+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRlY2F5RXhwb25lbnROb2RlID0gdW5pZm9ybSggMCApLnNldEdyb3VwKCByZW5kZXJHcm91cCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE92ZXJ3cml0dGVuIHRvIHVwZGF0ZWQgc3BvdCBsaWdodCBzcGVjaWZpYyB1bmlmb3Jtcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUZyYW1lfSBmcmFtZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IG5vZGUgZnJhbWUuXHJcblx0ICovXHJcblx0dXBkYXRlKCBmcmFtZSApIHtcclxuXHJcblx0XHRzdXBlci51cGRhdGUoIGZyYW1lICk7XHJcblxyXG5cdFx0Y29uc3QgeyBsaWdodCB9ID0gdGhpcztcclxuXHJcblx0XHR0aGlzLmNvbmVDb3NOb2RlLnZhbHVlID0gTWF0aC5jb3MoIGxpZ2h0LmFuZ2xlICk7XHJcblx0XHR0aGlzLnBlbnVtYnJhQ29zTm9kZS52YWx1ZSA9IE1hdGguY29zKCBsaWdodC5hbmdsZSAqICggMSAtIGxpZ2h0LnBlbnVtYnJhICkgKTtcclxuXHJcblx0XHR0aGlzLmN1dG9mZkRpc3RhbmNlTm9kZS52YWx1ZSA9IGxpZ2h0LmRpc3RhbmNlO1xyXG5cdFx0dGhpcy5kZWNheUV4cG9uZW50Tm9kZS52YWx1ZSA9IGxpZ2h0LmRlY2F5O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSBzcG90IGF0dGVudWF0aW9uIGZvciB0aGUgZ2l2ZW4gYW5nbGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSBhbmdsZUNvc2luZSAtIFRoZSBhbmdsZSB0byBjb21wdXRlIHRoZSBzcG90IGF0dGVudWF0aW9uIGZvci5cclxuXHQgKiBAcmV0dXJuIHtOb2RlPGZsb2F0Pn0gVGhlIHNwb3QgYXR0ZW51YXRpb24uXHJcblx0ICovXHJcblx0Z2V0U3BvdEF0dGVudWF0aW9uKCBhbmdsZUNvc2luZSApIHtcclxuXHJcblx0XHRjb25zdCB7IGNvbmVDb3NOb2RlLCBwZW51bWJyYUNvc05vZGUgfSA9IHRoaXM7XHJcblxyXG5cdFx0cmV0dXJuIHNtb290aHN0ZXAoIGNvbmVDb3NOb2RlLCBwZW51bWJyYUNvc05vZGUsIGFuZ2xlQ29zaW5lICk7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXBEaXJlY3QoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBjb2xvck5vZGUsIGN1dG9mZkRpc3RhbmNlTm9kZSwgZGVjYXlFeHBvbmVudE5vZGUsIGxpZ2h0IH0gPSB0aGlzO1xyXG5cclxuXHRcdGNvbnN0IGxpZ2h0VmVjdG9yID0gdGhpcy5nZXRMaWdodFZlY3RvciggYnVpbGRlciApO1xyXG5cclxuXHRcdGNvbnN0IGxpZ2h0RGlyZWN0aW9uID0gbGlnaHRWZWN0b3Iubm9ybWFsaXplKCk7XHJcblx0XHRjb25zdCBhbmdsZUNvcyA9IGxpZ2h0RGlyZWN0aW9uLmRvdCggbGlnaHRUYXJnZXREaXJlY3Rpb24oIGxpZ2h0ICkgKTtcclxuXHRcdGNvbnN0IHNwb3RBdHRlbnVhdGlvbiA9IHRoaXMuZ2V0U3BvdEF0dGVudWF0aW9uKCBhbmdsZUNvcyApO1xyXG5cclxuXHRcdGNvbnN0IGxpZ2h0RGlzdGFuY2UgPSBsaWdodFZlY3Rvci5sZW5ndGgoKTtcclxuXHJcblx0XHRjb25zdCBsaWdodEF0dGVudWF0aW9uID0gZ2V0RGlzdGFuY2VBdHRlbnVhdGlvbigge1xyXG5cdFx0XHRsaWdodERpc3RhbmNlLFxyXG5cdFx0XHRjdXRvZmZEaXN0YW5jZTogY3V0b2ZmRGlzdGFuY2VOb2RlLFxyXG5cdFx0XHRkZWNheUV4cG9uZW50OiBkZWNheUV4cG9uZW50Tm9kZVxyXG5cdFx0fSApO1xyXG5cclxuXHRcdGxldCBsaWdodENvbG9yID0gY29sb3JOb2RlLm11bCggc3BvdEF0dGVudWF0aW9uICkubXVsKCBsaWdodEF0dGVudWF0aW9uICk7XHJcblxyXG5cdFx0aWYgKCBsaWdodC5tYXAgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBzcG90TGlnaHRDb29yZCA9IGxpZ2h0UHJvamVjdGlvblVWKCBsaWdodCwgYnVpbGRlci5jb250ZXh0LnBvc2l0aW9uV29ybGQgKTtcclxuXHRcdFx0Y29uc3QgcHJvamVjdGVkVGV4dHVyZSA9IHRleHR1cmUoIGxpZ2h0Lm1hcCwgc3BvdExpZ2h0Q29vcmQueHkgKS5vblJlbmRlclVwZGF0ZSggKCkgPT4gbGlnaHQubWFwICk7XHJcblxyXG5cdFx0XHRjb25zdCBpblNwb3RMaWdodE1hcCA9IHNwb3RMaWdodENvb3JkLm11bCggMi4gKS5zdWIoIDEuICkuYWJzKCkubGVzc1RoYW4oIDEuICkuYWxsKCk7XHJcblxyXG5cdFx0XHRsaWdodENvbG9yID0gaW5TcG90TGlnaHRNYXAuc2VsZWN0KCBsaWdodENvbG9yLm11bCggcHJvamVjdGVkVGV4dHVyZSApLCBsaWdodENvbG9yICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB7IGxpZ2h0Q29sb3IsIGxpZ2h0RGlyZWN0aW9uIH07XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFNwb3RMaWdodE5vZGU7XHJcbiIsImltcG9ydCBTcG90TGlnaHROb2RlIGZyb20gJy4vU3BvdExpZ2h0Tm9kZS5qcyc7XHJcbmltcG9ydCB7IHRleHR1cmUgfSBmcm9tICcuLi9hY2Nlc3NvcnMvVGV4dHVyZU5vZGUuanMnO1xyXG5pbXBvcnQgeyB2ZWMyIH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5cclxuLyoqXHJcbiAqIEFuIElFUyB2ZXJzaW9uIG9mIHRoZSBkZWZhdWx0IHNwb3QgbGlnaHQgbm9kZS5cclxuICpcclxuICogQGF1Z21lbnRzIFNwb3RMaWdodE5vZGVcclxuICovXHJcbmNsYXNzIElFU1Nwb3RMaWdodE5vZGUgZXh0ZW5kcyBTcG90TGlnaHROb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnSUVTU3BvdExpZ2h0Tm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogT3ZlcndyaXRlcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byBjb21wdXRlIGFuIElFUyBjb25mb3JtIHNwb3QgYXR0ZW51YXRpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSBhbmdsZUNvc2luZSAtIFRoZSBhbmdsZSB0byBjb21wdXRlIHRoZSBzcG90IGF0dGVudWF0aW9uIGZvci5cclxuXHQgKiBAcmV0dXJuIHtOb2RlPGZsb2F0Pn0gVGhlIHNwb3QgYXR0ZW51YXRpb24uXHJcblx0ICovXHJcblx0Z2V0U3BvdEF0dGVudWF0aW9uKCBhbmdsZUNvc2luZSApIHtcclxuXHJcblx0XHRjb25zdCBpZXNNYXAgPSB0aGlzLmxpZ2h0Lmllc01hcDtcclxuXHJcblx0XHRsZXQgc3BvdEF0dGVudWF0aW9uID0gbnVsbDtcclxuXHJcblx0XHRpZiAoIGllc01hcCAmJiBpZXNNYXAuaXNUZXh0dXJlID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYW5nbGUgPSBhbmdsZUNvc2luZS5hY29zKCkubXVsKCAxLjAgLyBNYXRoLlBJICk7XHJcblxyXG5cdFx0XHRzcG90QXR0ZW51YXRpb24gPSB0ZXh0dXJlKCBpZXNNYXAsIHZlYzIoIGFuZ2xlLCAwICksIDAgKS5yO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRzcG90QXR0ZW51YXRpb24gPSBzdXBlci5nZXRTcG90QXR0ZW51YXRpb24oIGFuZ2xlQ29zaW5lICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBzcG90QXR0ZW51YXRpb247XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IElFU1Nwb3RMaWdodE5vZGU7XHJcbiIsImltcG9ydCBBbmFseXRpY0xpZ2h0Tm9kZSBmcm9tICcuL0FuYWx5dGljTGlnaHROb2RlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBNb2R1bGUgZm9yIHJlcHJlc2VudGluZyBhbWJpZW50IGxpZ2h0cyBhcyBub2Rlcy5cclxuICpcclxuICogQGF1Z21lbnRzIEFuYWx5dGljTGlnaHROb2RlXHJcbiAqL1xyXG5jbGFzcyBBbWJpZW50TGlnaHROb2RlIGV4dGVuZHMgQW5hbHl0aWNMaWdodE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdBbWJpZW50TGlnaHROb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGFtYmllbnQgbGlnaHQgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7P0FtYmllbnRMaWdodH0gW2xpZ2h0PW51bGxdIC0gVGhlIGFtYmllbnQgbGlnaHQgc291cmNlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBsaWdodCA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoIGxpZ2h0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXAoIHsgY29udGV4dCB9ICkge1xyXG5cclxuXHRcdGNvbnRleHQuaXJyYWRpYW5jZS5hZGRBc3NpZ24oIHRoaXMuY29sb3JOb2RlICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEFtYmllbnRMaWdodE5vZGU7XHJcbiIsImltcG9ydCBBbmFseXRpY0xpZ2h0Tm9kZSBmcm9tICcuL0FuYWx5dGljTGlnaHROb2RlLmpzJztcclxuaW1wb3J0IHsgdW5pZm9ybSB9IGZyb20gJy4uL2NvcmUvVW5pZm9ybU5vZGUuanMnO1xyXG5pbXBvcnQgeyBtaXggfSBmcm9tICcuLi9tYXRoL01hdGhOb2RlLmpzJztcclxuaW1wb3J0IHsgbm9ybWFsVmlldyB9IGZyb20gJy4uL2FjY2Vzc29ycy9Ob3JtYWwuanMnO1xyXG5pbXBvcnQgeyBsaWdodFBvc2l0aW9uIH0gZnJvbSAnLi4vYWNjZXNzb3JzL0xpZ2h0cy5qcyc7XHJcbmltcG9ydCB7IHJlbmRlckdyb3VwIH0gZnJvbSAnLi4vY29yZS9Vbmlmb3JtR3JvdXBOb2RlLmpzJztcclxuXHJcbmltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vLi4vbWF0aC9Db2xvci5qcyc7XHJcblxyXG4vKipcclxuICogTW9kdWxlIGZvciByZXByZXNlbnRpbmcgaGVtaXNwaGVyZSBsaWdodHMgYXMgbm9kZXMuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBBbmFseXRpY0xpZ2h0Tm9kZVxyXG4gKi9cclxuY2xhc3MgSGVtaXNwaGVyZUxpZ2h0Tm9kZSBleHRlbmRzIEFuYWx5dGljTGlnaHROb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnSGVtaXNwaGVyZUxpZ2h0Tm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBoZW1pc3BoZXJlIGxpZ2h0IG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gez9IZW1pc3BoZXJlTGlnaHR9IFtsaWdodD1udWxsXSAtIFRoZSBoZW1pc3BoZXJlIGxpZ2h0IHNvdXJjZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbGlnaHQgPSBudWxsICkge1xyXG5cclxuXHRcdHN1cGVyKCBsaWdodCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVW5pZm9ybSBub2RlIHJlcHJlc2VudGluZyB0aGUgbGlnaHQncyBwb3NpdGlvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VW5pZm9ybU5vZGU8dmVjMz59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGlnaHRQb3NpdGlvbk5vZGUgPSBsaWdodFBvc2l0aW9uKCBsaWdodCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBub2RlIHJlcHJlc2VudGluZyB0aGUgbGlnaHQncyBkaXJlY3Rpb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGU8dmVjMz59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGlnaHREaXJlY3Rpb25Ob2RlID0gdGhpcy5saWdodFBvc2l0aW9uTm9kZS5ub3JtYWxpemUoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFVuaWZvcm0gbm9kZSByZXByZXNlbnRpbmcgdGhlIGxpZ2h0J3MgZ3JvdW5kIGNvbG9yLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtVbmlmb3JtTm9kZTx2ZWMzPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ncm91bmRDb2xvck5vZGUgPSB1bmlmb3JtKCBuZXcgQ29sb3IoKSApLnNldEdyb3VwKCByZW5kZXJHcm91cCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE92ZXJ3cml0dGVuIHRvIHVwZGF0ZWQgaGVtaXNwaGVyZSBsaWdodCBzcGVjaWZpYyB1bmlmb3Jtcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUZyYW1lfSBmcmFtZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IG5vZGUgZnJhbWUuXHJcblx0ICovXHJcblx0dXBkYXRlKCBmcmFtZSApIHtcclxuXHJcblx0XHRjb25zdCB7IGxpZ2h0IH0gPSB0aGlzO1xyXG5cclxuXHRcdHN1cGVyLnVwZGF0ZSggZnJhbWUgKTtcclxuXHJcblx0XHR0aGlzLmxpZ2h0UG9zaXRpb25Ob2RlLm9iamVjdDNkID0gbGlnaHQ7XHJcblxyXG5cdFx0dGhpcy5ncm91bmRDb2xvck5vZGUudmFsdWUuY29weSggbGlnaHQuZ3JvdW5kQ29sb3IgKS5tdWx0aXBseVNjYWxhciggbGlnaHQuaW50ZW5zaXR5ICk7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXAoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBjb2xvck5vZGUsIGdyb3VuZENvbG9yTm9kZSwgbGlnaHREaXJlY3Rpb25Ob2RlIH0gPSB0aGlzO1xyXG5cclxuXHRcdGNvbnN0IGRvdE5MID0gbm9ybWFsVmlldy5kb3QoIGxpZ2h0RGlyZWN0aW9uTm9kZSApO1xyXG5cdFx0Y29uc3QgaGVtaURpZmZ1c2VXZWlnaHQgPSBkb3ROTC5tdWwoIDAuNSApLmFkZCggMC41ICk7XHJcblxyXG5cdFx0Y29uc3QgaXJyYWRpYW5jZSA9IG1peCggZ3JvdW5kQ29sb3JOb2RlLCBjb2xvck5vZGUsIGhlbWlEaWZmdXNlV2VpZ2h0ICk7XHJcblxyXG5cdFx0YnVpbGRlci5jb250ZXh0LmlycmFkaWFuY2UuYWRkQXNzaWduKCBpcnJhZGlhbmNlICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEhlbWlzcGhlcmVMaWdodE5vZGU7XHJcbiIsImltcG9ydCBBbmFseXRpY0xpZ2h0Tm9kZSBmcm9tICcuL0FuYWx5dGljTGlnaHROb2RlLmpzJztcclxuaW1wb3J0IHsgbm9ybWFsV29ybGQgfSBmcm9tICcuLi9hY2Nlc3NvcnMvTm9ybWFsLmpzJztcclxuaW1wb3J0IHsgdW5pZm9ybUFycmF5IH0gZnJvbSAnLi4vYWNjZXNzb3JzL1VuaWZvcm1BcnJheU5vZGUuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuaW1wb3J0IGdldFNoSXJyYWRpYW5jZUF0IGZyb20gJy4uL2Z1bmN0aW9ucy9tYXRlcmlhbC9nZXRTaElycmFkaWFuY2VBdC5qcyc7XHJcblxyXG4vKipcclxuICogTW9kdWxlIGZvciByZXByZXNlbnRpbmcgbGlnaHQgcHJvYmVzIGFzIG5vZGVzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQW5hbHl0aWNMaWdodE5vZGVcclxuICovXHJcbmNsYXNzIExpZ2h0UHJvYmVOb2RlIGV4dGVuZHMgQW5hbHl0aWNMaWdodE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdMaWdodFByb2JlTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBsaWdodCBwcm9iZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHs/TGlnaHRQcm9iZX0gW2xpZ2h0PW51bGxdIC0gVGhlIGxpZ2h0IHByb2JlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBsaWdodCA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoIGxpZ2h0ICk7XHJcblxyXG5cdFx0Y29uc3QgYXJyYXkgPSBbXTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCA5OyBpICsrICkgYXJyYXkucHVzaCggbmV3IFZlY3RvcjMoKSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogTGlnaHQgcHJvYmUgcmVwcmVzZW50ZWQgYXMgYSB1bmlmb3JtIG9mIHNwaGVyaWNhbCBoYXJtb25pY3MuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1VuaWZvcm1BcnJheU5vZGV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGlnaHRQcm9iZSA9IHVuaWZvcm1BcnJheSggYXJyYXkgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBPdmVyd3JpdHRlbiB0byB1cGRhdGVkIGxpZ2h0IHByb2JlIHNwZWNpZmljIHVuaWZvcm1zLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlRnJhbWV9IGZyYW1lIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgbm9kZSBmcmFtZS5cclxuXHQgKi9cclxuXHR1cGRhdGUoIGZyYW1lICkge1xyXG5cclxuXHRcdGNvbnN0IHsgbGlnaHQgfSA9IHRoaXM7XHJcblxyXG5cdFx0c3VwZXIudXBkYXRlKCBmcmFtZSApO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgOTsgaSArKyApIHtcclxuXHJcblx0XHRcdHRoaXMubGlnaHRQcm9iZS5hcnJheVsgaSBdLmNvcHkoIGxpZ2h0LnNoLmNvZWZmaWNpZW50c1sgaSBdICkubXVsdGlwbHlTY2FsYXIoIGxpZ2h0LmludGVuc2l0eSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRzZXR1cCggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCBpcnJhZGlhbmNlID0gZ2V0U2hJcnJhZGlhbmNlQXQoIG5vcm1hbFdvcmxkLCB0aGlzLmxpZ2h0UHJvYmUgKTtcclxuXHJcblx0XHRidWlsZGVyLmNvbnRleHQuaXJyYWRpYW5jZS5hZGRBc3NpZ24oIGlycmFkaWFuY2UgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTGlnaHRQcm9iZU5vZGU7XHJcbiIsIi8qKlxyXG4gKiBCYXNlIGNsYXNzIGZvciBub2RlIHBhcnNlcnMuIEEgZGVyaXZlZCBwYXJzZXIgbXVzdCBiZSBpbXBsZW1lbnRlZFxyXG4gKiBmb3IgZWFjaCBzdXBwb3J0ZWQgbmF0aXZlIHNoYWRlciBsYW5ndWFnZS5cclxuICovXHJcbmNsYXNzIE5vZGVQYXJzZXIge1xyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgbWV0aG9kIHBhcnNlcyB0aGUgZ2l2ZW4gbmF0aXZlIGNvZGUgYW4gcmV0dXJucyBhIG5vZGUgZnVuY3Rpb24uXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gVGhlIG5hdGl2ZSBzaGFkZXIgY29kZS5cclxuXHQgKiBAcmV0dXJuIHtOb2RlRnVuY3Rpb259IEEgbm9kZSBmdW5jdGlvbi5cclxuXHQgKi9cclxuXHRwYXJzZUZ1bmN0aW9uKCAvKnNvdXJjZSovICkge1xyXG5cclxuXHRcdGNvbnNvbGUud2FybiggJ0Fic3RyYWN0IGZ1bmN0aW9uLicgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTm9kZVBhcnNlcjtcclxuIiwiLyoqXHJcbiAqIEJhc2UgY2xhc3MgZm9yIG5vZGUgZnVuY3Rpb25zLiBBIGRlcml2ZWQgbW9kdWxlIG11c3QgYmUgaW1wbGVtZW50ZWRcclxuICogZm9yIGVhY2ggc3VwcG9ydGVkIG5hdGl2ZSBzaGFkZXIgbGFuZ3VhZ2UuIFNpbWlsYXIgdG8gb3RoZXIgYE5vZGUqYCBtb2R1bGVzLFxyXG4gKiB0aGlzIGNsYXNzIGlzIG9ubHkgcmVsZXZhbnQgZHVyaW5nIHRoZSBidWlsZGluZyBwcm9jZXNzIGFuZCBub3QgdXNlZFxyXG4gKiBpbiB1c2VyLWxldmVsIGNvZGUuXHJcbiAqL1xyXG5jbGFzcyBOb2RlRnVuY3Rpb24ge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG5vZGUgZnVuY3Rpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSBub2RlIHR5cGUuIFRoaXMgdHlwZSBpcyB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIG5vZGUgZnVuY3Rpb24uXHJcblx0ICogQHBhcmFtIHtBcnJheTxOb2RlRnVuY3Rpb25JbnB1dD59IGlucHV0cyAtIFRoZSBmdW5jdGlvbidzIGlucHV0cy5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW25hbWU9JyddIC0gVGhlIGZ1bmN0aW9uJ3MgbmFtZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW3ByZWNpc2lvbj0nJ10gLSBUaGUgcHJlY2lzaW9uIHF1YWxpZmllci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggdHlwZSwgaW5wdXRzLCBuYW1lID0gJycsIHByZWNpc2lvbiA9ICcnICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG5vZGUgdHlwZS4gVGhpcyB0eXBlIGlzIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgbm9kZSBmdW5jdGlvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnR5cGUgPSB0eXBlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGZ1bmN0aW9uJ3MgaW5wdXRzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxOb2RlRnVuY3Rpb25JbnB1dD59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaW5wdXRzID0gaW5wdXRzO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG5hbWUgb2YgdGhlIHVuaWZvcm0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqIEBkZWZhdWx0ICcnXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubmFtZSA9IG5hbWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcHJlY2lzaW9uIHF1YWxpZmllci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICogQGRlZmF1bHQgJydcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wcmVjaXNpb24gPSBwcmVjaXNpb247XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbmF0aXZlIGNvZGUgb2YgdGhlIG5vZGUgZnVuY3Rpb24uXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBmdW5jdGlvbidzIG5hbWUuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBBIHNoYWRlciBjb2RlLlxyXG5cdCAqL1xyXG5cdGdldENvZGUoIC8qbmFtZSA9IHRoaXMubmFtZSovICkge1xyXG5cclxuXHRcdGNvbnNvbGUud2FybiggJ0Fic3RyYWN0IGZ1bmN0aW9uLicgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuTm9kZUZ1bmN0aW9uLmlzTm9kZUZ1bmN0aW9uID0gdHJ1ZTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IE5vZGVGdW5jdGlvbjtcclxuIiwiaW1wb3J0IE5vZGVGdW5jdGlvbiBmcm9tICcuLi9jb3JlL05vZGVGdW5jdGlvbi5qcyc7XHJcbmltcG9ydCBOb2RlRnVuY3Rpb25JbnB1dCBmcm9tICcuLi9jb3JlL05vZGVGdW5jdGlvbklucHV0LmpzJztcclxuXHJcbmNvbnN0IGRlY2xhcmF0aW9uUmVnZXhwID0gL15cXHMqKGhpZ2hwfG1lZGl1bXB8bG93cCk/XFxzKihbYS16XzAtOV0rKVxccyooW2Etel8wLTldKyk/XFxzKlxcKChbXFxzXFxTXSo/KVxcKS9pO1xyXG5jb25zdCBwcm9wZXJ0aWVzUmVnZXhwID0gL1thLXpfMC05XSsvaWc7XHJcblxyXG5jb25zdCBwcmFnbWFNYWluID0gJyNwcmFnbWEgbWFpbic7XHJcblxyXG5jb25zdCBwYXJzZSA9ICggc291cmNlICkgPT4ge1xyXG5cclxuXHRzb3VyY2UgPSBzb3VyY2UudHJpbSgpO1xyXG5cclxuXHRjb25zdCBwcmFnbWFNYWluSW5kZXggPSBzb3VyY2UuaW5kZXhPZiggcHJhZ21hTWFpbiApO1xyXG5cclxuXHRjb25zdCBtYWluQ29kZSA9IHByYWdtYU1haW5JbmRleCAhPT0gLSAxID8gc291cmNlLnNsaWNlKCBwcmFnbWFNYWluSW5kZXggKyBwcmFnbWFNYWluLmxlbmd0aCApIDogc291cmNlO1xyXG5cclxuXHRjb25zdCBkZWNsYXJhdGlvbiA9IG1haW5Db2RlLm1hdGNoKCBkZWNsYXJhdGlvblJlZ2V4cCApO1xyXG5cclxuXHRpZiAoIGRlY2xhcmF0aW9uICE9PSBudWxsICYmIGRlY2xhcmF0aW9uLmxlbmd0aCA9PT0gNSApIHtcclxuXHJcblx0XHQvLyB0b2tlbml6ZXJcclxuXHJcblx0XHRjb25zdCBpbnB1dHNDb2RlID0gZGVjbGFyYXRpb25bIDQgXTtcclxuXHRcdGNvbnN0IHByb3BzTWF0Y2hlcyA9IFtdO1xyXG5cclxuXHRcdGxldCBuYW1lTWF0Y2ggPSBudWxsO1xyXG5cclxuXHRcdHdoaWxlICggKCBuYW1lTWF0Y2ggPSBwcm9wZXJ0aWVzUmVnZXhwLmV4ZWMoIGlucHV0c0NvZGUgKSApICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0cHJvcHNNYXRjaGVzLnB1c2goIG5hbWVNYXRjaCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBwYXJzZXJcclxuXHJcblx0XHRjb25zdCBpbnB1dHMgPSBbXTtcclxuXHJcblx0XHRsZXQgaSA9IDA7XHJcblxyXG5cdFx0d2hpbGUgKCBpIDwgcHJvcHNNYXRjaGVzLmxlbmd0aCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGlzQ29uc3QgPSBwcm9wc01hdGNoZXNbIGkgXVsgMCBdID09PSAnY29uc3QnO1xyXG5cclxuXHRcdFx0aWYgKCBpc0NvbnN0ID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRpICsrO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0bGV0IHF1YWxpZmllciA9IHByb3BzTWF0Y2hlc1sgaSBdWyAwIF07XHJcblxyXG5cdFx0XHRpZiAoIHF1YWxpZmllciA9PT0gJ2luJyB8fCBxdWFsaWZpZXIgPT09ICdvdXQnIHx8IHF1YWxpZmllciA9PT0gJ2lub3V0JyApIHtcclxuXHJcblx0XHRcdFx0aSArKztcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHF1YWxpZmllciA9ICcnO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgdHlwZSA9IHByb3BzTWF0Y2hlc1sgaSArKyBdWyAwIF07XHJcblxyXG5cdFx0XHRsZXQgY291bnQgPSBOdW1iZXIucGFyc2VJbnQoIHByb3BzTWF0Y2hlc1sgaSBdWyAwIF0gKTtcclxuXHJcblx0XHRcdGlmICggTnVtYmVyLmlzTmFOKCBjb3VudCApID09PSBmYWxzZSApIGkgKys7XHJcblx0XHRcdGVsc2UgY291bnQgPSBudWxsO1xyXG5cclxuXHRcdFx0Y29uc3QgbmFtZSA9IHByb3BzTWF0Y2hlc1sgaSArKyBdWyAwIF07XHJcblxyXG5cdFx0XHRpbnB1dHMucHVzaCggbmV3IE5vZGVGdW5jdGlvbklucHV0KCB0eXBlLCBuYW1lLCBjb3VudCwgcXVhbGlmaWVyLCBpc0NvbnN0ICkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCBibG9ja0NvZGUgPSBtYWluQ29kZS5zdWJzdHJpbmcoIGRlY2xhcmF0aW9uWyAwIF0ubGVuZ3RoICk7XHJcblxyXG5cdFx0Y29uc3QgbmFtZSA9IGRlY2xhcmF0aW9uWyAzIF0gIT09IHVuZGVmaW5lZCA/IGRlY2xhcmF0aW9uWyAzIF0gOiAnJztcclxuXHRcdGNvbnN0IHR5cGUgPSBkZWNsYXJhdGlvblsgMiBdO1xyXG5cclxuXHRcdGNvbnN0IHByZWNpc2lvbiA9IGRlY2xhcmF0aW9uWyAxIF0gIT09IHVuZGVmaW5lZCA/IGRlY2xhcmF0aW9uWyAxIF0gOiAnJztcclxuXHJcblx0XHRjb25zdCBoZWFkZXJDb2RlID0gcHJhZ21hTWFpbkluZGV4ICE9PSAtIDEgPyBzb3VyY2Uuc2xpY2UoIDAsIHByYWdtYU1haW5JbmRleCApIDogJyc7XHJcblxyXG5cdFx0cmV0dXJuIHtcclxuXHRcdFx0dHlwZSxcclxuXHRcdFx0aW5wdXRzLFxyXG5cdFx0XHRuYW1lLFxyXG5cdFx0XHRwcmVjaXNpb24sXHJcblx0XHRcdGlucHV0c0NvZGUsXHJcblx0XHRcdGJsb2NrQ29kZSxcclxuXHRcdFx0aGVhZGVyQ29kZVxyXG5cdFx0fTtcclxuXHJcblx0fSBlbHNlIHtcclxuXHJcblx0XHR0aHJvdyBuZXcgRXJyb3IoICdGdW5jdGlvbk5vZGU6IEZ1bmN0aW9uIGlzIG5vdCBhIEdMU0wgY29kZS4nICk7XHJcblxyXG5cdH1cclxuXHJcbn07XHJcblxyXG4vKipcclxuICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgR0xTTCBub2RlIGZ1bmN0aW9uLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTm9kZUZ1bmN0aW9uXHJcbiAqL1xyXG5jbGFzcyBHTFNMTm9kZUZ1bmN0aW9uIGV4dGVuZHMgTm9kZUZ1bmN0aW9uIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBHTFNMIG5vZGUgZnVuY3Rpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gVGhlIEdMU0wgc291cmNlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyB0eXBlLCBpbnB1dHMsIG5hbWUsIHByZWNpc2lvbiwgaW5wdXRzQ29kZSwgYmxvY2tDb2RlLCBoZWFkZXJDb2RlIH0gPSBwYXJzZSggc291cmNlICk7XHJcblxyXG5cdFx0c3VwZXIoIHR5cGUsIGlucHV0cywgbmFtZSwgcHJlY2lzaW9uICk7XHJcblxyXG5cdFx0dGhpcy5pbnB1dHNDb2RlID0gaW5wdXRzQ29kZTtcclxuXHRcdHRoaXMuYmxvY2tDb2RlID0gYmxvY2tDb2RlO1xyXG5cdFx0dGhpcy5oZWFkZXJDb2RlID0gaGVhZGVyQ29kZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBHTFNMIGNvZGUgb2YgdGhlIG5vZGUgZnVuY3Rpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW25hbWU9dGhpcy5uYW1lXSAtIFRoZSBmdW5jdGlvbidzIG5hbWUuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgc2hhZGVyIGNvZGUuXHJcblx0ICovXHJcblx0Z2V0Q29kZSggbmFtZSA9IHRoaXMubmFtZSApIHtcclxuXHJcblx0XHRsZXQgY29kZTtcclxuXHJcblx0XHRjb25zdCBibG9ja0NvZGUgPSB0aGlzLmJsb2NrQ29kZTtcclxuXHJcblx0XHRpZiAoIGJsb2NrQ29kZSAhPT0gJycgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB7IHR5cGUsIGlucHV0c0NvZGUsIGhlYWRlckNvZGUsIHByZWNpc2lvbiB9ID0gdGhpcztcclxuXHJcblx0XHRcdGxldCBkZWNsYXJhdGlvbkNvZGUgPSBgJHsgdHlwZSB9ICR7IG5hbWUgfSAoICR7IGlucHV0c0NvZGUudHJpbSgpIH0gKWA7XHJcblxyXG5cdFx0XHRpZiAoIHByZWNpc2lvbiAhPT0gJycgKSB7XHJcblxyXG5cdFx0XHRcdGRlY2xhcmF0aW9uQ29kZSA9IGAkeyBwcmVjaXNpb24gfSAkeyBkZWNsYXJhdGlvbkNvZGUgfWA7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb2RlID0gaGVhZGVyQ29kZSArIGRlY2xhcmF0aW9uQ29kZSArIGJsb2NrQ29kZTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Ly8gaW50ZXJmYWNlIGZ1bmN0aW9uXHJcblxyXG5cdFx0XHRjb2RlID0gJyc7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBjb2RlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBHTFNMTm9kZUZ1bmN0aW9uO1xyXG4iLCJpbXBvcnQgTm9kZVBhcnNlciBmcm9tICcuLi9jb3JlL05vZGVQYXJzZXIuanMnO1xyXG5pbXBvcnQgR0xTTE5vZGVGdW5jdGlvbiBmcm9tICcuL0dMU0xOb2RlRnVuY3Rpb24uanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgR0xTTCBub2RlIHBhcnNlci5cclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVQYXJzZXJcclxuICovXHJcbmNsYXNzIEdMU0xOb2RlUGFyc2VyIGV4dGVuZHMgTm9kZVBhcnNlciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBtZXRob2QgcGFyc2VzIHRoZSBnaXZlbiBHTFNMIGNvZGUgYW4gcmV0dXJucyBhIG5vZGUgZnVuY3Rpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gVGhlIEdMU0wgY29kZS5cclxuXHQgKiBAcmV0dXJuIHtHTFNMTm9kZUZ1bmN0aW9ufSBBIG5vZGUgZnVuY3Rpb24uXHJcblx0ICovXHJcblx0cGFyc2VGdW5jdGlvbiggc291cmNlICkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgR0xTTE5vZGVGdW5jdGlvbiggc291cmNlICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEdMU0xOb2RlUGFyc2VyO1xyXG4iLCJpbXBvcnQgRGF0YU1hcCBmcm9tICcuLi9EYXRhTWFwLmpzJztcclxuaW1wb3J0IENoYWluTWFwIGZyb20gJy4uL0NoYWluTWFwLmpzJztcclxuaW1wb3J0IE5vZGVCdWlsZGVyU3RhdGUgZnJvbSAnLi9Ob2RlQnVpbGRlclN0YXRlLmpzJztcclxuaW1wb3J0IHsgY3ViZU1hcE5vZGUgfSBmcm9tICcuLi8uLi8uLi9ub2Rlcy91dGlscy9DdWJlTWFwTm9kZS5qcyc7XHJcbmltcG9ydCB7IE5vZGVGcmFtZSB9IGZyb20gJy4uLy4uLy4uL25vZGVzL05vZGVzLmpzJztcclxuaW1wb3J0IHsgb2JqZWN0R3JvdXAsIHJlbmRlckdyb3VwLCBmcmFtZUdyb3VwLCBjdWJlVGV4dHVyZSwgdGV4dHVyZSwgZm9nLCByYW5nZUZvZ0ZhY3RvciwgZGVuc2l0eUZvZ0ZhY3RvciwgcmVmZXJlbmNlLCBwbXJlbVRleHR1cmUsIHNjcmVlblVWIH0gZnJvbSAnLi4vLi4vLi4vbm9kZXMvVFNMLmpzJztcclxuXHJcbmltcG9ydCB7IEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nLCBFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZywgRXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmcgfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBoYXNoQXJyYXkgfSBmcm9tICcuLi8uLi8uLi9ub2Rlcy9jb3JlL05vZGVVdGlscy5qcyc7XHJcblxyXG5jb25zdCBfb3V0cHV0Tm9kZU1hcCA9IG5ldyBXZWFrTWFwKCk7XHJcbmNvbnN0IF9jaGFpbktleXMgPSBbXTtcclxuY29uc3QgX2NhY2hlS2V5VmFsdWVzID0gW107XHJcblxyXG4vKipcclxuICogVGhpcyByZW5kZXJlciBtb2R1bGUgbWFuYWdlcyBub2RlLXJlbGF0ZWQgb2JqZWN0cyBhbmQgaXMgdGhlXHJcbiAqIHByaW1hcnkgaW50ZXJmYWNlIGJldHdlZW4gdGhlIHJlbmRlcmVyIGFuZCB0aGUgbm9kZSBzeXN0ZW0uXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBhdWdtZW50cyBEYXRhTWFwXHJcbiAqL1xyXG5jbGFzcyBOb2RlcyBleHRlbmRzIERhdGFNYXAge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG5vZGVzIG1hbmFnZW1lbnQgY29tcG9uZW50LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcblx0ICogQHBhcmFtIHtCYWNrZW5kfSBiYWNrZW5kIC0gVGhlIHJlbmRlcmVyJ3MgYmFja2VuZC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcmVuZGVyZXIsIGJhY2tlbmQgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByZW5kZXJlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7UmVuZGVyZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByZW5kZXJlcidzIGJhY2tlbmQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0JhY2tlbmR9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYmFja2VuZCA9IGJhY2tlbmQ7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbm9kZSBmcmFtZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7UmVuZGVyZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9kZUZyYW1lID0gbmV3IE5vZGVGcmFtZSgpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBjYWNoZSBmb3IgbWFuYWdpbmcgbm9kZSBidWlsZGVyIHN0YXRlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7TWFwPG51bWJlcixOb2RlQnVpbGRlclN0YXRlPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub2RlQnVpbGRlckNhY2hlID0gbmV3IE1hcCgpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBjYWNoZSBmb3IgbWFuYWdpbmcgZGF0YSBjYWNoZSBrZXkgZGF0YS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Q2hhaW5NYXB9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2FsbEhhc2hDYWNoZSA9IG5ldyBDaGFpbk1hcCgpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBjYWNoZSBmb3IgbWFuYWdpbmcgbm9kZSB1bmlmb3JtcyBncm91cCBkYXRhLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtDaGFpbk1hcH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ncm91cHNEYXRhID0gbmV3IENoYWluTWFwKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGNhY2hlIGZvciBtYW5hZ2luZyBub2RlIG9iamVjdHMgb2ZcclxuXHRcdCAqIHNjZW5lIHByb3BlcnRpZXMgbGlrZSBmb2cgb3IgZW52aXJvbm1lbnRzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLFdlYWtNYXA+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNhY2hlTGliID0ge307XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIG5vZGUgdW5pZm9ybXMgZ3JvdXAgbXVzdCBiZSB1cGRhdGVkIG9yIG5vdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZVVuaWZvcm1zR3JvdXB9IG5vZGVVbmlmb3Jtc0dyb3VwIC0gVGhlIG5vZGUgdW5pZm9ybXMgZ3JvdXAuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgbm9kZSB1bmlmb3JtcyBncm91cCByZXF1aXJlcyBhbiB1cGRhdGUgb3Igbm90LlxyXG5cdCAqL1xyXG5cdHVwZGF0ZUdyb3VwKCBub2RlVW5pZm9ybXNHcm91cCApIHtcclxuXHJcblx0XHRjb25zdCBncm91cE5vZGUgPSBub2RlVW5pZm9ybXNHcm91cC5ncm91cE5vZGU7XHJcblx0XHRjb25zdCBuYW1lID0gZ3JvdXBOb2RlLm5hbWU7XHJcblxyXG5cdFx0Ly8gb2JqZWN0R3JvdXAgaXMgYWx3YXlzIHVwZGF0ZWRcclxuXHJcblx0XHRpZiAoIG5hbWUgPT09IG9iamVjdEdyb3VwLm5hbWUgKSByZXR1cm4gdHJ1ZTtcclxuXHJcblx0XHQvLyByZW5kZXJHcm91cCBpcyB1cGRhdGVkIG9uY2UgcGVyIHJlbmRlci9jb21wdXRlIGNhbGxcclxuXHJcblx0XHRpZiAoIG5hbWUgPT09IHJlbmRlckdyb3VwLm5hbWUgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB1bmlmb3Jtc0dyb3VwRGF0YSA9IHRoaXMuZ2V0KCBub2RlVW5pZm9ybXNHcm91cCApO1xyXG5cdFx0XHRjb25zdCByZW5kZXJJZCA9IHRoaXMubm9kZUZyYW1lLnJlbmRlcklkO1xyXG5cclxuXHRcdFx0aWYgKCB1bmlmb3Jtc0dyb3VwRGF0YS5yZW5kZXJJZCAhPT0gcmVuZGVySWQgKSB7XHJcblxyXG5cdFx0XHRcdHVuaWZvcm1zR3JvdXBEYXRhLnJlbmRlcklkID0gcmVuZGVySWQ7XHJcblxyXG5cdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBmcmFtZUdyb3VwIGlzIHVwZGF0ZWQgb25jZSBwZXIgZnJhbWVcclxuXHJcblx0XHRpZiAoIG5hbWUgPT09IGZyYW1lR3JvdXAubmFtZSApIHtcclxuXHJcblx0XHRcdGNvbnN0IHVuaWZvcm1zR3JvdXBEYXRhID0gdGhpcy5nZXQoIG5vZGVVbmlmb3Jtc0dyb3VwICk7XHJcblx0XHRcdGNvbnN0IGZyYW1lSWQgPSB0aGlzLm5vZGVGcmFtZS5mcmFtZUlkO1xyXG5cclxuXHRcdFx0aWYgKCB1bmlmb3Jtc0dyb3VwRGF0YS5mcmFtZUlkICE9PSBmcmFtZUlkICkge1xyXG5cclxuXHRcdFx0XHR1bmlmb3Jtc0dyb3VwRGF0YS5mcmFtZUlkID0gZnJhbWVJZDtcclxuXHJcblx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIG90aGVyIGdyb3VwcyBhcmUgdXBkYXRlZCBqdXN0IHdoZW4gZ3JvdXBOb2RlLm5lZWRzVXBkYXRlIGlzIHRydWVcclxuXHJcblx0XHRfY2hhaW5LZXlzWyAwIF0gPSBncm91cE5vZGU7XHJcblx0XHRfY2hhaW5LZXlzWyAxIF0gPSBub2RlVW5pZm9ybXNHcm91cDtcclxuXHJcblx0XHRsZXQgZ3JvdXBEYXRhID0gdGhpcy5ncm91cHNEYXRhLmdldCggX2NoYWluS2V5cyApO1xyXG5cdFx0aWYgKCBncm91cERhdGEgPT09IHVuZGVmaW5lZCApIHRoaXMuZ3JvdXBzRGF0YS5zZXQoIF9jaGFpbktleXMsIGdyb3VwRGF0YSA9IHt9ICk7XHJcblxyXG5cdFx0X2NoYWluS2V5cy5sZW5ndGggPSAwO1xyXG5cclxuXHRcdGlmICggZ3JvdXBEYXRhLnZlcnNpb24gIT09IGdyb3VwTm9kZS52ZXJzaW9uICkge1xyXG5cclxuXHRcdFx0Z3JvdXBEYXRhLnZlcnNpb24gPSBncm91cE5vZGUudmVyc2lvbjtcclxuXHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZmFsc2U7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgY2FjaGUga2V5IGZvciB0aGUgZ2l2ZW4gcmVuZGVyIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyT2JqZWN0fSByZW5kZXJPYmplY3QgLSBUaGUgcmVuZGVyIG9iamVjdC5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBjYWNoZSBrZXkuXHJcblx0ICovXHJcblx0Z2V0Rm9yUmVuZGVyQ2FjaGVLZXkoIHJlbmRlck9iamVjdCApIHtcclxuXHJcblx0XHRyZXR1cm4gcmVuZGVyT2JqZWN0LmluaXRpYWxDYWNoZUtleTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbm9kZSBidWlsZGVyIHN0YXRlIGZvciB0aGUgZ2l2ZW4gcmVuZGVyIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyT2JqZWN0fSByZW5kZXJPYmplY3QgLSBUaGUgcmVuZGVyIG9iamVjdC5cclxuXHQgKiBAcmV0dXJuIHtOb2RlQnVpbGRlclN0YXRlfSBUaGUgbm9kZSBidWlsZGVyIHN0YXRlLlxyXG5cdCAqL1xyXG5cdGdldEZvclJlbmRlciggcmVuZGVyT2JqZWN0ICkge1xyXG5cclxuXHRcdGNvbnN0IHJlbmRlck9iamVjdERhdGEgPSB0aGlzLmdldCggcmVuZGVyT2JqZWN0ICk7XHJcblxyXG5cdFx0bGV0IG5vZGVCdWlsZGVyU3RhdGUgPSByZW5kZXJPYmplY3REYXRhLm5vZGVCdWlsZGVyU3RhdGU7XHJcblxyXG5cdFx0aWYgKCBub2RlQnVpbGRlclN0YXRlID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB7IG5vZGVCdWlsZGVyQ2FjaGUgfSA9IHRoaXM7XHJcblxyXG5cdFx0XHRjb25zdCBjYWNoZUtleSA9IHRoaXMuZ2V0Rm9yUmVuZGVyQ2FjaGVLZXkoIHJlbmRlck9iamVjdCApO1xyXG5cclxuXHRcdFx0bm9kZUJ1aWxkZXJTdGF0ZSA9IG5vZGVCdWlsZGVyQ2FjaGUuZ2V0KCBjYWNoZUtleSApO1xyXG5cclxuXHRcdFx0aWYgKCBub2RlQnVpbGRlclN0YXRlID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IG5vZGVCdWlsZGVyID0gdGhpcy5iYWNrZW5kLmNyZWF0ZU5vZGVCdWlsZGVyKCByZW5kZXJPYmplY3Qub2JqZWN0LCB0aGlzLnJlbmRlcmVyICk7XHJcblx0XHRcdFx0bm9kZUJ1aWxkZXIuc2NlbmUgPSByZW5kZXJPYmplY3Quc2NlbmU7XHJcblx0XHRcdFx0bm9kZUJ1aWxkZXIubWF0ZXJpYWwgPSByZW5kZXJPYmplY3QubWF0ZXJpYWw7XHJcblx0XHRcdFx0bm9kZUJ1aWxkZXIuY2FtZXJhID0gcmVuZGVyT2JqZWN0LmNhbWVyYTtcclxuXHRcdFx0XHRub2RlQnVpbGRlci5jb250ZXh0Lm1hdGVyaWFsID0gcmVuZGVyT2JqZWN0Lm1hdGVyaWFsO1xyXG5cdFx0XHRcdG5vZGVCdWlsZGVyLmxpZ2h0c05vZGUgPSByZW5kZXJPYmplY3QubGlnaHRzTm9kZTtcclxuXHRcdFx0XHRub2RlQnVpbGRlci5lbnZpcm9ubWVudE5vZGUgPSB0aGlzLmdldEVudmlyb25tZW50Tm9kZSggcmVuZGVyT2JqZWN0LnNjZW5lICk7XHJcblx0XHRcdFx0bm9kZUJ1aWxkZXIuZm9nTm9kZSA9IHRoaXMuZ2V0Rm9nTm9kZSggcmVuZGVyT2JqZWN0LnNjZW5lICk7XHJcblx0XHRcdFx0bm9kZUJ1aWxkZXIuY2xpcHBpbmdDb250ZXh0ID0gcmVuZGVyT2JqZWN0LmNsaXBwaW5nQ29udGV4dDtcclxuXHRcdFx0XHRub2RlQnVpbGRlci5idWlsZCgpO1xyXG5cclxuXHRcdFx0XHRub2RlQnVpbGRlclN0YXRlID0gdGhpcy5fY3JlYXRlTm9kZUJ1aWxkZXJTdGF0ZSggbm9kZUJ1aWxkZXIgKTtcclxuXHJcblx0XHRcdFx0bm9kZUJ1aWxkZXJDYWNoZS5zZXQoIGNhY2hlS2V5LCBub2RlQnVpbGRlclN0YXRlICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRub2RlQnVpbGRlclN0YXRlLnVzZWRUaW1lcyArKztcclxuXHJcblx0XHRcdHJlbmRlck9iamVjdERhdGEubm9kZUJ1aWxkZXJTdGF0ZSA9IG5vZGVCdWlsZGVyU3RhdGU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBub2RlQnVpbGRlclN0YXRlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlbGV0ZXMgdGhlIGdpdmVuIG9iamVjdCBmcm9tIHRoZSBpbnRlcm5hbCBkYXRhIG1hcFxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHthbnl9IG9iamVjdCAtIFRoZSBvYmplY3QgdG8gZGVsZXRlLlxyXG5cdCAqIEByZXR1cm4gez9PYmplY3R9IFRoZSBkZWxldGVkIGRpY3Rpb25hcnkuXHJcblx0ICovXHJcblx0ZGVsZXRlKCBvYmplY3QgKSB7XHJcblxyXG5cdFx0aWYgKCBvYmplY3QuaXNSZW5kZXJPYmplY3QgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBub2RlQnVpbGRlclN0YXRlID0gdGhpcy5nZXQoIG9iamVjdCApLm5vZGVCdWlsZGVyU3RhdGU7XHJcblx0XHRcdG5vZGVCdWlsZGVyU3RhdGUudXNlZFRpbWVzIC0tO1xyXG5cclxuXHRcdFx0aWYgKCBub2RlQnVpbGRlclN0YXRlLnVzZWRUaW1lcyA9PT0gMCApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5ub2RlQnVpbGRlckNhY2hlLmRlbGV0ZSggdGhpcy5nZXRGb3JSZW5kZXJDYWNoZUtleSggb2JqZWN0ICkgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHN1cGVyLmRlbGV0ZSggb2JqZWN0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIG5vZGUgYnVpbGRlciBzdGF0ZSBmb3IgdGhlIGdpdmVuIGNvbXB1dGUgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gY29tcHV0ZU5vZGUgLSBUaGUgY29tcHV0ZSBub2RlLlxyXG5cdCAqIEByZXR1cm4ge05vZGVCdWlsZGVyU3RhdGV9IFRoZSBub2RlIGJ1aWxkZXIgc3RhdGUuXHJcblx0ICovXHJcblx0Z2V0Rm9yQ29tcHV0ZSggY29tcHV0ZU5vZGUgKSB7XHJcblxyXG5cdFx0Y29uc3QgY29tcHV0ZURhdGEgPSB0aGlzLmdldCggY29tcHV0ZU5vZGUgKTtcclxuXHJcblx0XHRsZXQgbm9kZUJ1aWxkZXJTdGF0ZSA9IGNvbXB1dGVEYXRhLm5vZGVCdWlsZGVyU3RhdGU7XHJcblxyXG5cdFx0aWYgKCBub2RlQnVpbGRlclN0YXRlID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBub2RlQnVpbGRlciA9IHRoaXMuYmFja2VuZC5jcmVhdGVOb2RlQnVpbGRlciggY29tcHV0ZU5vZGUsIHRoaXMucmVuZGVyZXIgKTtcclxuXHRcdFx0bm9kZUJ1aWxkZXIuYnVpbGQoKTtcclxuXHJcblx0XHRcdG5vZGVCdWlsZGVyU3RhdGUgPSB0aGlzLl9jcmVhdGVOb2RlQnVpbGRlclN0YXRlKCBub2RlQnVpbGRlciApO1xyXG5cclxuXHRcdFx0Y29tcHV0ZURhdGEubm9kZUJ1aWxkZXJTdGF0ZSA9IG5vZGVCdWlsZGVyU3RhdGU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBub2RlQnVpbGRlclN0YXRlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgYSBub2RlIGJ1aWxkZXIgc3RhdGUgZm9yIHRoZSBnaXZlbiBub2RlIGJ1aWxkZXIuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IG5vZGVCdWlsZGVyIC0gVGhlIG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtOb2RlQnVpbGRlclN0YXRlfSBUaGUgbm9kZSBidWlsZGVyIHN0YXRlLlxyXG5cdCAqL1xyXG5cdF9jcmVhdGVOb2RlQnVpbGRlclN0YXRlKCBub2RlQnVpbGRlciApIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IE5vZGVCdWlsZGVyU3RhdGUoXHJcblx0XHRcdG5vZGVCdWlsZGVyLnZlcnRleFNoYWRlcixcclxuXHRcdFx0bm9kZUJ1aWxkZXIuZnJhZ21lbnRTaGFkZXIsXHJcblx0XHRcdG5vZGVCdWlsZGVyLmNvbXB1dGVTaGFkZXIsXHJcblx0XHRcdG5vZGVCdWlsZGVyLmdldEF0dHJpYnV0ZXNBcnJheSgpLFxyXG5cdFx0XHRub2RlQnVpbGRlci5nZXRCaW5kaW5ncygpLFxyXG5cdFx0XHRub2RlQnVpbGRlci51cGRhdGVOb2RlcyxcclxuXHRcdFx0bm9kZUJ1aWxkZXIudXBkYXRlQmVmb3JlTm9kZXMsXHJcblx0XHRcdG5vZGVCdWlsZGVyLnVwZGF0ZUFmdGVyTm9kZXMsXHJcblx0XHRcdG5vZGVCdWlsZGVyLm9ic2VydmVyLFxyXG5cdFx0XHRub2RlQnVpbGRlci50cmFuc2Zvcm1zXHJcblx0XHQpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYW4gZW52aXJvbm1lbnQgbm9kZSBmb3IgdGhlIGN1cnJlbnQgY29uZmlndXJlZFxyXG5cdCAqIHNjZW5lIGVudmlyb25tZW50LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTY2VuZX0gc2NlbmUgLSBUaGUgc2NlbmUuXHJcblx0ICogQHJldHVybiB7Tm9kZX0gQSBub2RlIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBzY2VuZSBlbnZpcm9ubWVudC5cclxuXHQgKi9cclxuXHRnZXRFbnZpcm9ubWVudE5vZGUoIHNjZW5lICkge1xyXG5cclxuXHRcdHRoaXMudXBkYXRlRW52aXJvbm1lbnQoIHNjZW5lICk7XHJcblxyXG5cdFx0bGV0IGVudmlyb25tZW50Tm9kZSA9IG51bGw7XHJcblxyXG5cdFx0aWYgKCBzY2VuZS5lbnZpcm9ubWVudE5vZGUgJiYgc2NlbmUuZW52aXJvbm1lbnROb2RlLmlzTm9kZSApIHtcclxuXHJcblx0XHRcdGVudmlyb25tZW50Tm9kZSA9IHNjZW5lLmVudmlyb25tZW50Tm9kZTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc3Qgc2NlbmVEYXRhID0gdGhpcy5nZXQoIHNjZW5lICk7XHJcblxyXG5cdFx0XHRpZiAoIHNjZW5lRGF0YS5lbnZpcm9ubWVudE5vZGUgKSB7XHJcblxyXG5cdFx0XHRcdGVudmlyb25tZW50Tm9kZSA9IHNjZW5lRGF0YS5lbnZpcm9ubWVudE5vZGU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBlbnZpcm9ubWVudE5vZGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIGJhY2tncm91bmQgbm9kZSBmb3IgdGhlIGN1cnJlbnQgY29uZmlndXJlZFxyXG5cdCAqIHNjZW5lIGJhY2tncm91bmQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1NjZW5lfSBzY2VuZSAtIFRoZSBzY2VuZS5cclxuXHQgKiBAcmV0dXJuIHtOb2RlfSBBIG5vZGUgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IHNjZW5lIGJhY2tncm91bmQuXHJcblx0ICovXHJcblx0Z2V0QmFja2dyb3VuZE5vZGUoIHNjZW5lICkge1xyXG5cclxuXHRcdHRoaXMudXBkYXRlQmFja2dyb3VuZCggc2NlbmUgKTtcclxuXHJcblx0XHRsZXQgYmFja2dyb3VuZE5vZGUgPSBudWxsO1xyXG5cclxuXHRcdGlmICggc2NlbmUuYmFja2dyb3VuZE5vZGUgJiYgc2NlbmUuYmFja2dyb3VuZE5vZGUuaXNOb2RlICkge1xyXG5cclxuXHRcdFx0YmFja2dyb3VuZE5vZGUgPSBzY2VuZS5iYWNrZ3JvdW5kTm9kZTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc3Qgc2NlbmVEYXRhID0gdGhpcy5nZXQoIHNjZW5lICk7XHJcblxyXG5cdFx0XHRpZiAoIHNjZW5lRGF0YS5iYWNrZ3JvdW5kTm9kZSApIHtcclxuXHJcblx0XHRcdFx0YmFja2dyb3VuZE5vZGUgPSBzY2VuZURhdGEuYmFja2dyb3VuZE5vZGU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBiYWNrZ3JvdW5kTm9kZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgZm9nIG5vZGUgZm9yIHRoZSBjdXJyZW50IGNvbmZpZ3VyZWQgc2NlbmUgZm9nLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTY2VuZX0gc2NlbmUgLSBUaGUgc2NlbmUuXHJcblx0ICogQHJldHVybiB7Tm9kZX0gQSBub2RlIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBzY2VuZSBmb2cuXHJcblx0ICovXHJcblx0Z2V0Rm9nTm9kZSggc2NlbmUgKSB7XHJcblxyXG5cdFx0dGhpcy51cGRhdGVGb2coIHNjZW5lICk7XHJcblxyXG5cdFx0cmV0dXJuIHNjZW5lLmZvZ05vZGUgfHwgdGhpcy5nZXQoIHNjZW5lICkuZm9nTm9kZSB8fCBudWxsO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBjYWNoZSBrZXkgZm9yIHRoZSBnaXZlbiBzY2VuZSBhbmQgbGlnaHRzIG5vZGUuXHJcblx0ICogVGhpcyBrZXkgaXMgdXNlZCBieSBgUmVuZGVyT2JqZWN0YCBhcyBhIHBhcnQgb2YgdGhlIGR5bmFtaWNcclxuXHQgKiBjYWNoZSBrZXkgKGEga2V5IHRoYXQgbXVzdCBiZSBjaGVja2VkIGV2ZXJ5IHRpbWUgdGhlIHJlbmRlclxyXG5cdCAqIG9iamVjdHMgaXMgZHJhd24pLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTY2VuZX0gc2NlbmUgLSBUaGUgc2NlbmUuXHJcblx0ICogQHBhcmFtIHtMaWdodHNOb2RlfSBsaWdodHNOb2RlIC0gVGhlIGxpZ2h0cyBub2RlLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGNhY2hlIGtleS5cclxuXHQgKi9cclxuXHRnZXRDYWNoZUtleSggc2NlbmUsIGxpZ2h0c05vZGUgKSB7XHJcblxyXG5cdFx0X2NoYWluS2V5c1sgMCBdID0gc2NlbmU7XHJcblx0XHRfY2hhaW5LZXlzWyAxIF0gPSBsaWdodHNOb2RlO1xyXG5cclxuXHRcdGNvbnN0IGNhbGxJZCA9IHRoaXMucmVuZGVyZXIuaW5mby5jYWxscztcclxuXHJcblx0XHRjb25zdCBjYWNoZUtleURhdGEgPSB0aGlzLmNhbGxIYXNoQ2FjaGUuZ2V0KCBfY2hhaW5LZXlzICkgfHwge307XHJcblxyXG5cdFx0aWYgKCBjYWNoZUtleURhdGEuY2FsbElkICE9PSBjYWxsSWQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBlbnZpcm9ubWVudE5vZGUgPSB0aGlzLmdldEVudmlyb25tZW50Tm9kZSggc2NlbmUgKTtcclxuXHRcdFx0Y29uc3QgZm9nTm9kZSA9IHRoaXMuZ2V0Rm9nTm9kZSggc2NlbmUgKTtcclxuXHJcblx0XHRcdGlmICggbGlnaHRzTm9kZSApIF9jYWNoZUtleVZhbHVlcy5wdXNoKCBsaWdodHNOb2RlLmdldENhY2hlS2V5KCB0cnVlICkgKTtcclxuXHRcdFx0aWYgKCBlbnZpcm9ubWVudE5vZGUgKSBfY2FjaGVLZXlWYWx1ZXMucHVzaCggZW52aXJvbm1lbnROb2RlLmdldENhY2hlS2V5KCkgKTtcclxuXHRcdFx0aWYgKCBmb2dOb2RlICkgX2NhY2hlS2V5VmFsdWVzLnB1c2goIGZvZ05vZGUuZ2V0Q2FjaGVLZXkoKSApO1xyXG5cclxuXHRcdFx0X2NhY2hlS2V5VmFsdWVzLnB1c2goIHRoaXMucmVuZGVyZXIuc2hhZG93TWFwLmVuYWJsZWQgPyAxIDogMCApO1xyXG5cclxuXHRcdFx0Y2FjaGVLZXlEYXRhLmNhbGxJZCA9IGNhbGxJZDtcclxuXHRcdFx0Y2FjaGVLZXlEYXRhLmNhY2hlS2V5ID0gaGFzaEFycmF5KCBfY2FjaGVLZXlWYWx1ZXMgKTtcclxuXHJcblx0XHRcdHRoaXMuY2FsbEhhc2hDYWNoZS5zZXQoIF9jaGFpbktleXMsIGNhY2hlS2V5RGF0YSApO1xyXG5cclxuXHRcdFx0X2NhY2hlS2V5VmFsdWVzLmxlbmd0aCA9IDA7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdF9jaGFpbktleXMubGVuZ3RoID0gMDtcclxuXHJcblx0XHRyZXR1cm4gY2FjaGVLZXlEYXRhLmNhY2hlS2V5O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEEgYm9vbGVhbiB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRvbmUgbWFwcGluZyBzaG91bGQgYmUgZW5hYmxlZFxyXG5cdCAqIG9yIG5vdC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdCAqL1xyXG5cdGdldCBpc1RvbmVNYXBwaW5nU3RhdGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMucmVuZGVyZXIuZ2V0UmVuZGVyVGFyZ2V0KCkgPyBmYWxzZSA6IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSWYgYSBzY2VuZSBiYWNrZ3JvdW5kIGlzIGNvbmZpZ3VyZWQsIHRoaXMgbWV0aG9kIG1ha2VzIHN1cmUgdG9cclxuXHQgKiByZXByZXNlbnQgdGhlIGJhY2tncm91bmQgd2l0aCBhIGNvcnJlc3BvbmRpbmcgbm9kZS1iYXNlZCBpbXBsZW1lbnRhdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7U2NlbmV9IHNjZW5lIC0gVGhlIHNjZW5lLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZUJhY2tncm91bmQoIHNjZW5lICkge1xyXG5cclxuXHRcdGNvbnN0IHNjZW5lRGF0YSA9IHRoaXMuZ2V0KCBzY2VuZSApO1xyXG5cdFx0Y29uc3QgYmFja2dyb3VuZCA9IHNjZW5lLmJhY2tncm91bmQ7XHJcblxyXG5cdFx0aWYgKCBiYWNrZ3JvdW5kICkge1xyXG5cclxuXHRcdFx0Y29uc3QgZm9yY2VVcGRhdGUgPSAoIHNjZW5lLmJhY2tncm91bmRCbHVycmluZXNzID09PSAwICYmIHNjZW5lRGF0YS5iYWNrZ3JvdW5kQmx1cnJpbmVzcyA+IDAgKSB8fCAoIHNjZW5lLmJhY2tncm91bmRCbHVycmluZXNzID4gMCAmJiBzY2VuZURhdGEuYmFja2dyb3VuZEJsdXJyaW5lc3MgPT09IDAgKTtcclxuXHJcblx0XHRcdGlmICggc2NlbmVEYXRhLmJhY2tncm91bmQgIT09IGJhY2tncm91bmQgfHwgZm9yY2VVcGRhdGUgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGJhY2tncm91bmROb2RlID0gdGhpcy5nZXRDYWNoZU5vZGUoICdiYWNrZ3JvdW5kJywgYmFja2dyb3VuZCwgKCkgPT4ge1xyXG5cclxuXHRcdFx0XHRcdGlmICggYmFja2dyb3VuZC5pc0N1YmVUZXh0dXJlID09PSB0cnVlIHx8ICggYmFja2dyb3VuZC5tYXBwaW5nID09PSBFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZyB8fCBiYWNrZ3JvdW5kLm1hcHBpbmcgPT09IEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nIHx8IGJhY2tncm91bmQubWFwcGluZyA9PT0gQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmcgKSApIHtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggc2NlbmUuYmFja2dyb3VuZEJsdXJyaW5lc3MgPiAwIHx8IGJhY2tncm91bmQubWFwcGluZyA9PT0gQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmcgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdHJldHVybiBwbXJlbVRleHR1cmUoIGJhY2tncm91bmQgKTtcclxuXHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGxldCBlbnZNYXA7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmICggYmFja2dyb3VuZC5pc0N1YmVUZXh0dXJlID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGVudk1hcCA9IGN1YmVUZXh0dXJlKCBiYWNrZ3JvdW5kICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0ZW52TWFwID0gdGV4dHVyZSggYmFja2dyb3VuZCApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdHJldHVybiBjdWJlTWFwTm9kZSggZW52TWFwICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIGlmICggYmFja2dyb3VuZC5pc1RleHR1cmUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gdGV4dHVyZSggYmFja2dyb3VuZCwgc2NyZWVuVVYuZmxpcFkoKSApLnNldFVwZGF0ZU1hdHJpeCggdHJ1ZSApO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIGJhY2tncm91bmQuaXNDb2xvciAhPT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdXZWJHUFVOb2RlczogVW5zdXBwb3J0ZWQgYmFja2dyb3VuZCBjb25maWd1cmF0aW9uLicsIGJhY2tncm91bmQgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH0sIGZvcmNlVXBkYXRlICk7XHJcblxyXG5cdFx0XHRcdHNjZW5lRGF0YS5iYWNrZ3JvdW5kTm9kZSA9IGJhY2tncm91bmROb2RlO1xyXG5cdFx0XHRcdHNjZW5lRGF0YS5iYWNrZ3JvdW5kID0gYmFja2dyb3VuZDtcclxuXHRcdFx0XHRzY2VuZURhdGEuYmFja2dyb3VuZEJsdXJyaW5lc3MgPSBzY2VuZS5iYWNrZ3JvdW5kQmx1cnJpbmVzcztcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2UgaWYgKCBzY2VuZURhdGEuYmFja2dyb3VuZE5vZGUgKSB7XHJcblxyXG5cdFx0XHRkZWxldGUgc2NlbmVEYXRhLmJhY2tncm91bmROb2RlO1xyXG5cdFx0XHRkZWxldGUgc2NlbmVEYXRhLmJhY2tncm91bmQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgdGhlIGNhY2hpbmcgb2Ygbm9kZXMgd2hpY2ggYXJlIHVzZWQgdG8gcmVwcmVzZW50cyB0aGVcclxuXHQgKiBzY2VuZSdzIGJhY2tncm91bmQsIGZvZyBvciBlbnZpcm9ubWVudC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIHR5cGUgb2Ygb2JqZWN0IHRvIGNhY2hlLlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgLSBUaGUgb2JqZWN0LlxyXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIC0gQSBjYWxsYmFjayB0aGF0IHByb2R1Y2VzIGEgbm9kZSByZXByZXNlbnRhdGlvbiBmb3IgdGhlIGdpdmVuIG9iamVjdC5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtmb3JjZVVwZGF0ZT1mYWxzZV0gLSBXaGV0aGVyIGFuIHVwZGF0ZSBzaG91bGQgYmUgZW5mb3JjZWQgb3Igbm90LlxyXG5cdCAqIEByZXR1cm4ge05vZGV9IFRoZSBub2RlIHJlcHJlc2VudGF0aW9uLlxyXG5cdCAqL1xyXG5cdGdldENhY2hlTm9kZSggdHlwZSwgb2JqZWN0LCBjYWxsYmFjaywgZm9yY2VVcGRhdGUgPSBmYWxzZSApIHtcclxuXHJcblx0XHRjb25zdCBub2RlQ2FjaGUgPSB0aGlzLmNhY2hlTGliWyB0eXBlIF0gfHwgKCB0aGlzLmNhY2hlTGliWyB0eXBlIF0gPSBuZXcgV2Vha01hcCgpICk7XHJcblxyXG5cdFx0bGV0IG5vZGUgPSBub2RlQ2FjaGUuZ2V0KCBvYmplY3QgKTtcclxuXHJcblx0XHRpZiAoIG5vZGUgPT09IHVuZGVmaW5lZCB8fCBmb3JjZVVwZGF0ZSApIHtcclxuXHJcblx0XHRcdG5vZGUgPSBjYWxsYmFjaygpO1xyXG5cdFx0XHRub2RlQ2FjaGUuc2V0KCBvYmplY3QsIG5vZGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG5vZGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSWYgYSBzY2VuZSBmb2cgaXMgY29uZmlndXJlZCwgdGhpcyBtZXRob2QgbWFrZXMgc3VyZSB0b1xyXG5cdCAqIHJlcHJlc2VudCB0aGUgZm9nIHdpdGggYSBjb3JyZXNwb25kaW5nIG5vZGUtYmFzZWQgaW1wbGVtZW50YXRpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1NjZW5lfSBzY2VuZSAtIFRoZSBzY2VuZS5cclxuXHQgKi9cclxuXHR1cGRhdGVGb2coIHNjZW5lICkge1xyXG5cclxuXHRcdGNvbnN0IHNjZW5lRGF0YSA9IHRoaXMuZ2V0KCBzY2VuZSApO1xyXG5cdFx0Y29uc3Qgc2NlbmVGb2cgPSBzY2VuZS5mb2c7XHJcblxyXG5cdFx0aWYgKCBzY2VuZUZvZyApIHtcclxuXHJcblx0XHRcdGlmICggc2NlbmVEYXRhLmZvZyAhPT0gc2NlbmVGb2cgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGZvZ05vZGUgPSB0aGlzLmdldENhY2hlTm9kZSggJ2ZvZycsIHNjZW5lRm9nLCAoKSA9PiB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBzY2VuZUZvZy5pc0ZvZ0V4cDIgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCBjb2xvciA9IHJlZmVyZW5jZSggJ2NvbG9yJywgJ2NvbG9yJywgc2NlbmVGb2cgKS5zZXRHcm91cCggcmVuZGVyR3JvdXAgKTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgZGVuc2l0eSA9IHJlZmVyZW5jZSggJ2RlbnNpdHknLCAnZmxvYXQnLCBzY2VuZUZvZyApLnNldEdyb3VwKCByZW5kZXJHcm91cCApO1xyXG5cclxuXHRcdFx0XHRcdFx0cmV0dXJuIGZvZyggY29sb3IsIGRlbnNpdHlGb2dGYWN0b3IoIGRlbnNpdHkgKSApO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIHNjZW5lRm9nLmlzRm9nICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgY29sb3IgPSByZWZlcmVuY2UoICdjb2xvcicsICdjb2xvcicsIHNjZW5lRm9nICkuc2V0R3JvdXAoIHJlbmRlckdyb3VwICk7XHJcblx0XHRcdFx0XHRcdGNvbnN0IG5lYXIgPSByZWZlcmVuY2UoICduZWFyJywgJ2Zsb2F0Jywgc2NlbmVGb2cgKS5zZXRHcm91cCggcmVuZGVyR3JvdXAgKTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgZmFyID0gcmVmZXJlbmNlKCAnZmFyJywgJ2Zsb2F0Jywgc2NlbmVGb2cgKS5zZXRHcm91cCggcmVuZGVyR3JvdXAgKTtcclxuXHJcblx0XHRcdFx0XHRcdHJldHVybiBmb2coIGNvbG9yLCByYW5nZUZvZ0ZhY3RvciggbmVhciwgZmFyICkgKTtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlJlbmRlcmVyOiBVbnN1cHBvcnRlZCBmb2cgY29uZmlndXJhdGlvbi4nLCBzY2VuZUZvZyApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fSApO1xyXG5cclxuXHRcdFx0XHRzY2VuZURhdGEuZm9nTm9kZSA9IGZvZ05vZGU7XHJcblx0XHRcdFx0c2NlbmVEYXRhLmZvZyA9IHNjZW5lRm9nO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRkZWxldGUgc2NlbmVEYXRhLmZvZ05vZGU7XHJcblx0XHRcdGRlbGV0ZSBzY2VuZURhdGEuZm9nO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJZiBhIHNjZW5lIGVudmlyb25tZW50IGlzIGNvbmZpZ3VyZWQsIHRoaXMgbWV0aG9kIG1ha2VzIHN1cmUgdG9cclxuXHQgKiByZXByZXNlbnQgdGhlIGVudmlyb25tZW50IHdpdGggYSBjb3JyZXNwb25kaW5nIG5vZGUtYmFzZWQgaW1wbGVtZW50YXRpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1NjZW5lfSBzY2VuZSAtIFRoZSBzY2VuZS5cclxuXHQgKi9cclxuXHR1cGRhdGVFbnZpcm9ubWVudCggc2NlbmUgKSB7XHJcblxyXG5cdFx0Y29uc3Qgc2NlbmVEYXRhID0gdGhpcy5nZXQoIHNjZW5lICk7XHJcblx0XHRjb25zdCBlbnZpcm9ubWVudCA9IHNjZW5lLmVudmlyb25tZW50O1xyXG5cclxuXHRcdGlmICggZW52aXJvbm1lbnQgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHNjZW5lRGF0YS5lbnZpcm9ubWVudCAhPT0gZW52aXJvbm1lbnQgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGVudmlyb25tZW50Tm9kZSA9IHRoaXMuZ2V0Q2FjaGVOb2RlKCAnZW52aXJvbm1lbnQnLCBlbnZpcm9ubWVudCwgKCkgPT4ge1xyXG5cclxuXHRcdFx0XHRcdGlmICggZW52aXJvbm1lbnQuaXNDdWJlVGV4dHVyZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdHJldHVybiBjdWJlVGV4dHVyZSggZW52aXJvbm1lbnQgKTtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKCBlbnZpcm9ubWVudC5pc1RleHR1cmUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gdGV4dHVyZSggZW52aXJvbm1lbnQgKTtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ05vZGVzOiBVbnN1cHBvcnRlZCBlbnZpcm9ubWVudCBjb25maWd1cmF0aW9uLicsIGVudmlyb25tZW50ICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRcdHNjZW5lRGF0YS5lbnZpcm9ubWVudE5vZGUgPSBlbnZpcm9ubWVudE5vZGU7XHJcblx0XHRcdFx0c2NlbmVEYXRhLmVudmlyb25tZW50ID0gZW52aXJvbm1lbnQ7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmICggc2NlbmVEYXRhLmVudmlyb25tZW50Tm9kZSApIHtcclxuXHJcblx0XHRcdGRlbGV0ZSBzY2VuZURhdGEuZW52aXJvbm1lbnROb2RlO1xyXG5cdFx0XHRkZWxldGUgc2NlbmVEYXRhLmVudmlyb25tZW50O1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRnZXROb2RlRnJhbWUoIHJlbmRlcmVyID0gdGhpcy5yZW5kZXJlciwgc2NlbmUgPSBudWxsLCBvYmplY3QgPSBudWxsLCBjYW1lcmEgPSBudWxsLCBtYXRlcmlhbCA9IG51bGwgKSB7XHJcblxyXG5cdFx0Y29uc3Qgbm9kZUZyYW1lID0gdGhpcy5ub2RlRnJhbWU7XHJcblx0XHRub2RlRnJhbWUucmVuZGVyZXIgPSByZW5kZXJlcjtcclxuXHRcdG5vZGVGcmFtZS5zY2VuZSA9IHNjZW5lO1xyXG5cdFx0bm9kZUZyYW1lLm9iamVjdCA9IG9iamVjdDtcclxuXHRcdG5vZGVGcmFtZS5jYW1lcmEgPSBjYW1lcmE7XHJcblx0XHRub2RlRnJhbWUubWF0ZXJpYWwgPSBtYXRlcmlhbDtcclxuXHJcblx0XHRyZXR1cm4gbm9kZUZyYW1lO1xyXG5cclxuXHR9XHJcblxyXG5cdGdldE5vZGVGcmFtZUZvclJlbmRlciggcmVuZGVyT2JqZWN0ICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmdldE5vZGVGcmFtZSggcmVuZGVyT2JqZWN0LnJlbmRlcmVyLCByZW5kZXJPYmplY3Quc2NlbmUsIHJlbmRlck9iamVjdC5vYmplY3QsIHJlbmRlck9iamVjdC5jYW1lcmEsIHJlbmRlck9iamVjdC5tYXRlcmlhbCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGN1cnJlbnQgb3V0cHV0IGNhY2hlIGtleS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG91dHB1dCBjYWNoZSBrZXkuXHJcblx0ICovXHJcblx0Z2V0T3V0cHV0Q2FjaGVLZXkoKSB7XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyZXIgPSB0aGlzLnJlbmRlcmVyO1xyXG5cclxuXHRcdHJldHVybiByZW5kZXJlci50b25lTWFwcGluZyArICcsJyArIHJlbmRlcmVyLmN1cnJlbnRDb2xvclNwYWNlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENoZWNrcyBpZiB0aGUgb3V0cHV0IGNvbmZpZ3VyYXRpb24gKHRvbmUgbWFwcGluZyBhbmQgY29sb3Igc3BhY2UpIGZvclxyXG5cdCAqIHRoZSBnaXZlbiB0YXJnZXQgaGFzIGNoYW5nZWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IG91dHB1dFRhcmdldCAtIFRoZSBvdXRwdXQgdGFyZ2V0LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIG91dHB1dCBjb25maWd1cmF0aW9uIGhhcyBjaGFuZ2VkIG9yIG5vdC5cclxuXHQgKi9cclxuXHRoYXNPdXRwdXRDaGFuZ2UoIG91dHB1dFRhcmdldCApIHtcclxuXHJcblx0XHRjb25zdCBjYWNoZUtleSA9IF9vdXRwdXROb2RlTWFwLmdldCggb3V0cHV0VGFyZ2V0ICk7XHJcblxyXG5cdFx0cmV0dXJuIGNhY2hlS2V5ICE9PSB0aGlzLmdldE91dHB1dENhY2hlS2V5KCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIG5vZGUgdGhhdCByZXByZXNlbnRzIHRoZSBvdXRwdXQgY29uZmlndXJhdGlvbiAodG9uZSBtYXBwaW5nIGFuZFxyXG5cdCAqIGNvbG9yIHNwYWNlKSBmb3IgdGhlIGN1cnJlbnQgdGFyZ2V0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSBvdXRwdXRUYXJnZXQgLSBUaGUgb3V0cHV0IHRhcmdldC5cclxuXHQgKiBAcmV0dXJuIHtOb2RlfSBUaGUgb3V0cHV0IG5vZGUuXHJcblx0ICovXHJcblx0Z2V0T3V0cHV0Tm9kZSggb3V0cHV0VGFyZ2V0ICkge1xyXG5cclxuXHRcdGNvbnN0IHJlbmRlcmVyID0gdGhpcy5yZW5kZXJlcjtcclxuXHRcdGNvbnN0IGNhY2hlS2V5ID0gdGhpcy5nZXRPdXRwdXRDYWNoZUtleSgpO1xyXG5cclxuXHRcdGNvbnN0IG91dHB1dCA9IHRleHR1cmUoIG91dHB1dFRhcmdldCwgc2NyZWVuVVYgKS5yZW5kZXJPdXRwdXQoIHJlbmRlcmVyLnRvbmVNYXBwaW5nLCByZW5kZXJlci5jdXJyZW50Q29sb3JTcGFjZSApO1xyXG5cclxuXHRcdF9vdXRwdXROb2RlTWFwLnNldCggb3V0cHV0VGFyZ2V0LCBjYWNoZUtleSApO1xyXG5cclxuXHRcdHJldHVybiBvdXRwdXQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVHJpZ2dlcnMgdGhlIGNhbGwgb2YgYHVwZGF0ZUJlZm9yZSgpYCBtZXRob2RzXHJcblx0ICogZm9yIGFsbCBub2RlcyBvZiB0aGUgZ2l2ZW4gcmVuZGVyIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyT2JqZWN0fSByZW5kZXJPYmplY3QgLSBUaGUgcmVuZGVyIG9iamVjdC5cclxuXHQgKi9cclxuXHR1cGRhdGVCZWZvcmUoIHJlbmRlck9iamVjdCApIHtcclxuXHJcblx0XHRjb25zdCBub2RlQnVpbGRlciA9IHJlbmRlck9iamVjdC5nZXROb2RlQnVpbGRlclN0YXRlKCk7XHJcblxyXG5cdFx0Zm9yICggY29uc3Qgbm9kZSBvZiBub2RlQnVpbGRlci51cGRhdGVCZWZvcmVOb2RlcyApIHtcclxuXHJcblx0XHRcdC8vIHVwZGF0ZSBmcmFtZSBzdGF0ZSBmb3IgZWFjaCBub2RlXHJcblxyXG5cdFx0XHR0aGlzLmdldE5vZGVGcmFtZUZvclJlbmRlciggcmVuZGVyT2JqZWN0ICkudXBkYXRlQmVmb3JlTm9kZSggbm9kZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUcmlnZ2VycyB0aGUgY2FsbCBvZiBgdXBkYXRlQWZ0ZXIoKWAgbWV0aG9kc1xyXG5cdCAqIGZvciBhbGwgbm9kZXMgb2YgdGhlIGdpdmVuIHJlbmRlciBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JlbmRlck9iamVjdH0gcmVuZGVyT2JqZWN0IC0gVGhlIHJlbmRlciBvYmplY3QuXHJcblx0ICovXHJcblx0dXBkYXRlQWZ0ZXIoIHJlbmRlck9iamVjdCApIHtcclxuXHJcblx0XHRjb25zdCBub2RlQnVpbGRlciA9IHJlbmRlck9iamVjdC5nZXROb2RlQnVpbGRlclN0YXRlKCk7XHJcblxyXG5cdFx0Zm9yICggY29uc3Qgbm9kZSBvZiBub2RlQnVpbGRlci51cGRhdGVBZnRlck5vZGVzICkge1xyXG5cclxuXHRcdFx0Ly8gdXBkYXRlIGZyYW1lIHN0YXRlIGZvciBlYWNoIG5vZGVcclxuXHJcblx0XHRcdHRoaXMuZ2V0Tm9kZUZyYW1lRm9yUmVuZGVyKCByZW5kZXJPYmplY3QgKS51cGRhdGVBZnRlck5vZGUoIG5vZGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVHJpZ2dlcnMgdGhlIGNhbGwgb2YgYHVwZGF0ZSgpYCBtZXRob2RzXHJcblx0ICogZm9yIGFsbCBub2RlcyBvZiB0aGUgZ2l2ZW4gY29tcHV0ZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlfSBjb21wdXRlTm9kZSAtIFRoZSBjb21wdXRlIG5vZGUuXHJcblx0ICovXHJcblx0dXBkYXRlRm9yQ29tcHV0ZSggY29tcHV0ZU5vZGUgKSB7XHJcblxyXG5cdFx0Y29uc3Qgbm9kZUZyYW1lID0gdGhpcy5nZXROb2RlRnJhbWUoKTtcclxuXHRcdGNvbnN0IG5vZGVCdWlsZGVyID0gdGhpcy5nZXRGb3JDb21wdXRlKCBjb21wdXRlTm9kZSApO1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IG5vZGUgb2Ygbm9kZUJ1aWxkZXIudXBkYXRlTm9kZXMgKSB7XHJcblxyXG5cdFx0XHRub2RlRnJhbWUudXBkYXRlTm9kZSggbm9kZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUcmlnZ2VycyB0aGUgY2FsbCBvZiBgdXBkYXRlKClgIG1ldGhvZHNcclxuXHQgKiBmb3IgYWxsIG5vZGVzIG9mIHRoZSBnaXZlbiBjb21wdXRlIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JlbmRlck9iamVjdH0gcmVuZGVyT2JqZWN0IC0gVGhlIHJlbmRlciBvYmplY3QuXHJcblx0ICovXHJcblx0dXBkYXRlRm9yUmVuZGVyKCByZW5kZXJPYmplY3QgKSB7XHJcblxyXG5cdFx0Y29uc3Qgbm9kZUZyYW1lID0gdGhpcy5nZXROb2RlRnJhbWVGb3JSZW5kZXIoIHJlbmRlck9iamVjdCApO1xyXG5cdFx0Y29uc3Qgbm9kZUJ1aWxkZXIgPSByZW5kZXJPYmplY3QuZ2V0Tm9kZUJ1aWxkZXJTdGF0ZSgpO1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IG5vZGUgb2Ygbm9kZUJ1aWxkZXIudXBkYXRlTm9kZXMgKSB7XHJcblxyXG5cdFx0XHRub2RlRnJhbWUudXBkYXRlTm9kZSggbm9kZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gcmVuZGVyIG9iamVjdCByZXF1aXJlcyBhIHJlZnJlc2guXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JlbmRlck9iamVjdH0gcmVuZGVyT2JqZWN0IC0gVGhlIHJlbmRlciBvYmplY3QuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZ2l2ZW4gcmVuZGVyIG9iamVjdCByZXF1aXJlcyBhIHJlZnJlc2ggb3Igbm90LlxyXG5cdCAqL1xyXG5cdG5lZWRzUmVmcmVzaCggcmVuZGVyT2JqZWN0ICkge1xyXG5cclxuXHRcdGNvbnN0IG5vZGVGcmFtZSA9IHRoaXMuZ2V0Tm9kZUZyYW1lRm9yUmVuZGVyKCByZW5kZXJPYmplY3QgKTtcclxuXHRcdGNvbnN0IG1vbml0b3IgPSByZW5kZXJPYmplY3QuZ2V0TW9uaXRvcigpO1xyXG5cclxuXHRcdHJldHVybiBtb25pdG9yLm5lZWRzUmVmcmVzaCggcmVuZGVyT2JqZWN0LCBub2RlRnJhbWUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGcmVlcyB0aGUgaW50ZXJuYWwgcmVzb3VyY2VzLlxyXG5cdCAqL1xyXG5cdGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0c3VwZXIuZGlzcG9zZSgpO1xyXG5cclxuXHRcdHRoaXMubm9kZUZyYW1lID0gbmV3IE5vZGVGcmFtZSgpO1xyXG5cdFx0dGhpcy5ub2RlQnVpbGRlckNhY2hlID0gbmV3IE1hcCgpO1xyXG5cdFx0dGhpcy5jYWNoZUxpYiA9IHt9O1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBOb2RlcztcclxuIiwiaW1wb3J0IHsgTWF0cml4MyB9IGZyb20gJy4uLy4uL21hdGgvTWF0cml4My5qcyc7XHJcbmltcG9ydCB7IFBsYW5lIH0gZnJvbSAnLi4vLi4vbWF0aC9QbGFuZS5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjQgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjQuanMnO1xyXG5cclxuY29uc3QgX3BsYW5lID0gLypAX19QVVJFX18qLyBuZXcgUGxhbmUoKTtcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIHRoZSBzdGF0ZSB0aGF0IGlzIHVzZWQgdG8gcGVyZm9ybSBjbGlwcGluZyB2aWEgY2xpcHBpbmcgcGxhbmVzLlxyXG4gKiBUaGVyZSBpcyBhIGRlZmF1bHQgY2xpcHBpbmcgY29udGV4dCBmb3IgZWFjaCByZW5kZXIgY29udGV4dC4gV2hlbiB0aGVcclxuICogc2NlbmUgaG9sZHMgaW5zdGFuY2VzIG9mIGBDbGlwcGluZ0dyb3VwYCwgdGhlcmUgd2lsbCBiZSBhIGNvbnRleHQgZm9yIGVhY2hcclxuICogZ3JvdXAuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5jbGFzcyBDbGlwcGluZ0NvbnRleHQge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGNsaXBwaW5nIGNvbnRleHQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gez9DbGlwcGluZ0NvbnRleHR9IFtwYXJlbnRDb250ZXh0PW51bGxdIC0gQSByZWZlcmVuY2UgdG8gdGhlIHBhcmVudCBjbGlwcGluZyBjb250ZXh0LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwYXJlbnRDb250ZXh0ID0gbnVsbCApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjbGlwcGluZyBjb250ZXh0J3MgdmVyc2lvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudmVyc2lvbiA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIGNsaXBwaW5nIHBsYW5lcyBpcyB1c2VkIHRvIGNsaXAgb2JqZWN0cywgcmF0aGVyIHRoYW4gdGhlaXIgdW5pb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9ib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNsaXBJbnRlcnNlY3Rpb24gPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNsaXBwaW5nIGNvbnRleHQncyBjYWNoZSBrZXkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jYWNoZUtleSA9ICcnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgc2hhZG93IHBhc3MgaXMgYWN0aXZlIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2hhZG93UGFzcyA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHZpZXcgbm9ybWFsIG1hdHJpeC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7TWF0cml4M31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52aWV3Tm9ybWFsTWF0cml4ID0gbmV3IE1hdHJpeDMoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEludGVybmFsIGNhY2hlIGZvciBtYWludGFpbmluZyBjbGlwcGluZyBjb250ZXh0cy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2Vha01hcDxDbGlwcGluZ0dyb3VwLENsaXBwaW5nQ29udGV4dD59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2xpcHBpbmdHcm91cENvbnRleHRzID0gbmV3IFdlYWtNYXAoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBpbnRlcnNlY3Rpb24gcGxhbmVzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxWZWN0b3I0Pn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pbnRlcnNlY3Rpb25QbGFuZXMgPSBbXTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBpbnRlcnNlY3Rpb24gcGxhbmVzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxWZWN0b3I0Pn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51bmlvblBsYW5lcyA9IFtdO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHZlcnNpb24gb2YgdGhlIGNsaXBwaW5nIGNvbnRleHQncyBwYXJlbnQgY29udGV4dC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P251bWJlcn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBhcmVudFZlcnNpb24gPSBudWxsO1xyXG5cclxuXHRcdGlmICggcGFyZW50Q29udGV4dCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMudmlld05vcm1hbE1hdHJpeCA9IHBhcmVudENvbnRleHQudmlld05vcm1hbE1hdHJpeDtcclxuXHRcdFx0dGhpcy5jbGlwcGluZ0dyb3VwQ29udGV4dHMgPSBwYXJlbnRDb250ZXh0LmNsaXBwaW5nR3JvdXBDb250ZXh0cztcclxuXHJcblx0XHRcdHRoaXMuc2hhZG93UGFzcyA9IHBhcmVudENvbnRleHQuc2hhZG93UGFzcztcclxuXHRcdFx0dGhpcy52aWV3TWF0cml4ID0gcGFyZW50Q29udGV4dC52aWV3TWF0cml4O1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQcm9qZWN0cyB0aGUgZ2l2ZW4gc291cmNlIGNsaXBwaW5nIHBsYW5lcyBhbmQgd3JpdGVzIHRoZSByZXN1bHQgaW50byB0aGVcclxuXHQgKiBkZXN0aW5hdGlvbiBhcnJheS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8UGxhbmU+fSBzb3VyY2UgLSBUaGUgc291cmNlIGNsaXBwaW5nIHBsYW5lcy5cclxuXHQgKiBAcGFyYW0ge0FycmF5PFZlY3RvcjQ+fSBkZXN0aW5hdGlvbiAtIFRoZSBkZXN0aW5hdGlvbi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0IC0gVGhlIG9mZnNldC5cclxuXHQgKi9cclxuXHRwcm9qZWN0UGxhbmVzKCBzb3VyY2UsIGRlc3RpbmF0aW9uLCBvZmZzZXQgKSB7XHJcblxyXG5cdFx0Y29uc3QgbCA9IHNvdXJjZS5sZW5ndGg7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdF9wbGFuZS5jb3B5KCBzb3VyY2VbIGkgXSApLmFwcGx5TWF0cml4NCggdGhpcy52aWV3TWF0cml4LCB0aGlzLnZpZXdOb3JtYWxNYXRyaXggKTtcclxuXHJcblx0XHRcdGNvbnN0IHYgPSBkZXN0aW5hdGlvblsgb2Zmc2V0ICsgaSBdO1xyXG5cdFx0XHRjb25zdCBub3JtYWwgPSBfcGxhbmUubm9ybWFsO1xyXG5cclxuXHRcdFx0di54ID0gLSBub3JtYWwueDtcclxuXHRcdFx0di55ID0gLSBub3JtYWwueTtcclxuXHRcdFx0di56ID0gLSBub3JtYWwuejtcclxuXHRcdFx0di53ID0gX3BsYW5lLmNvbnN0YW50O1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoZSByb290IGNsaXBwaW5nIGNvbnRleHQgb2YgYSBzY2VuZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7U2NlbmV9IHNjZW5lIC0gVGhlIHNjZW5lLlxyXG5cdCAqIEBwYXJhbSB7Q2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIHRoYXQgaXMgdXNlZCB0byByZW5kZXIgdGhlIHNjZW5lLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZUdsb2JhbCggc2NlbmUsIGNhbWVyYSApIHtcclxuXHJcblx0XHR0aGlzLnNoYWRvd1Bhc3MgPSAoIHNjZW5lLm92ZXJyaWRlTWF0ZXJpYWwgIT09IG51bGwgJiYgc2NlbmUub3ZlcnJpZGVNYXRlcmlhbC5pc1NoYWRvd1Bhc3NNYXRlcmlhbCApO1xyXG5cdFx0dGhpcy52aWV3TWF0cml4ID0gY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZTtcclxuXHJcblx0XHR0aGlzLnZpZXdOb3JtYWxNYXRyaXguZ2V0Tm9ybWFsTWF0cml4KCB0aGlzLnZpZXdNYXRyaXggKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoZSBjbGlwcGluZyBjb250ZXh0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtDbGlwcGluZ0NvbnRleHR9IHBhcmVudENvbnRleHQgLSBUaGUgcGFyZW50IGNvbnRleHQuXHJcblx0ICogQHBhcmFtIHtDbGlwcGluZ0dyb3VwfSBjbGlwcGluZ0dyb3VwIC0gVGhlIGNsaXBwaW5nIGdyb3VwIHRoaXMgY29udGV4dCBiZWxvbmdzIHRvLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZSggcGFyZW50Q29udGV4dCwgY2xpcHBpbmdHcm91cCApIHtcclxuXHJcblx0XHRsZXQgdXBkYXRlID0gZmFsc2U7XHJcblxyXG5cdFx0aWYgKCBwYXJlbnRDb250ZXh0LnZlcnNpb24gIT09IHRoaXMucGFyZW50VmVyc2lvbiApIHtcclxuXHJcblx0XHRcdHRoaXMuaW50ZXJzZWN0aW9uUGxhbmVzID0gQXJyYXkuZnJvbSggcGFyZW50Q29udGV4dC5pbnRlcnNlY3Rpb25QbGFuZXMgKTtcclxuXHRcdFx0dGhpcy51bmlvblBsYW5lcyA9IEFycmF5LmZyb20oIHBhcmVudENvbnRleHQudW5pb25QbGFuZXMgKTtcclxuXHRcdFx0dGhpcy5wYXJlbnRWZXJzaW9uID0gcGFyZW50Q29udGV4dC52ZXJzaW9uO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMuY2xpcEludGVyc2VjdGlvbiAhPT0gY2xpcHBpbmdHcm91cC5jbGlwSW50ZXJzZWN0aW9uICkge1xyXG5cclxuXHRcdFx0dGhpcy5jbGlwSW50ZXJzZWN0aW9uID0gY2xpcHBpbmdHcm91cC5jbGlwSW50ZXJzZWN0aW9uO1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLmNsaXBJbnRlcnNlY3Rpb24gKSB7XHJcblxyXG5cdFx0XHRcdHRoaXMudW5pb25QbGFuZXMubGVuZ3RoID0gcGFyZW50Q29udGV4dC51bmlvblBsYW5lcy5sZW5ndGg7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHR0aGlzLmludGVyc2VjdGlvblBsYW5lcy5sZW5ndGggPSBwYXJlbnRDb250ZXh0LmludGVyc2VjdGlvblBsYW5lcy5sZW5ndGg7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHNyY0NsaXBwaW5nUGxhbmVzID0gY2xpcHBpbmdHcm91cC5jbGlwcGluZ1BsYW5lcztcclxuXHRcdGNvbnN0IGwgPSBzcmNDbGlwcGluZ1BsYW5lcy5sZW5ndGg7XHJcblxyXG5cdFx0bGV0IGRzdENsaXBwaW5nUGxhbmVzO1xyXG5cdFx0bGV0IG9mZnNldDtcclxuXHJcblx0XHRpZiAoIHRoaXMuY2xpcEludGVyc2VjdGlvbiApIHtcclxuXHJcblx0XHRcdGRzdENsaXBwaW5nUGxhbmVzID0gdGhpcy5pbnRlcnNlY3Rpb25QbGFuZXM7XHJcblx0XHRcdG9mZnNldCA9IHBhcmVudENvbnRleHQuaW50ZXJzZWN0aW9uUGxhbmVzLmxlbmd0aDtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0ZHN0Q2xpcHBpbmdQbGFuZXMgPSB0aGlzLnVuaW9uUGxhbmVzO1xyXG5cdFx0XHRvZmZzZXQgPSBwYXJlbnRDb250ZXh0LnVuaW9uUGxhbmVzLmxlbmd0aDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBkc3RDbGlwcGluZ1BsYW5lcy5sZW5ndGggIT09IG9mZnNldCArIGwgKSB7XHJcblxyXG5cdFx0XHRkc3RDbGlwcGluZ1BsYW5lcy5sZW5ndGggPSBvZmZzZXQgKyBsO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0ZHN0Q2xpcHBpbmdQbGFuZXNbIG9mZnNldCArIGkgXSA9IG5ldyBWZWN0b3I0KCk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR1cGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnByb2plY3RQbGFuZXMoIHNyY0NsaXBwaW5nUGxhbmVzLCBkc3RDbGlwcGluZ1BsYW5lcywgb2Zmc2V0ICk7XHJcblxyXG5cdFx0aWYgKCB1cGRhdGUgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnZlcnNpb24gKys7XHJcblx0XHRcdHRoaXMuY2FjaGVLZXkgPSBgJHsgdGhpcy5pbnRlcnNlY3Rpb25QbGFuZXMubGVuZ3RoIH06JHsgdGhpcy51bmlvblBsYW5lcy5sZW5ndGggfWA7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBjbGlwcGluZyBjb250ZXh0IGZvciB0aGUgZ2l2ZW4gY2xpcHBpbmcgZ3JvdXAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0NsaXBwaW5nR3JvdXB9IGNsaXBwaW5nR3JvdXAgLSBUaGUgY2xpcHBpbmcgZ3JvdXAuXHJcblx0ICogQHJldHVybiB7Q2xpcHBpbmdDb250ZXh0fSBUaGUgY2xpcHBpbmcgY29udGV4dC5cclxuXHQgKi9cclxuXHRnZXRHcm91cENvbnRleHQoIGNsaXBwaW5nR3JvdXAgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLnNoYWRvd1Bhc3MgJiYgISBjbGlwcGluZ0dyb3VwLmNsaXBTaGFkb3dzICkgcmV0dXJuIHRoaXM7XHJcblxyXG5cdFx0bGV0IGNvbnRleHQgPSB0aGlzLmNsaXBwaW5nR3JvdXBDb250ZXh0cy5nZXQoIGNsaXBwaW5nR3JvdXAgKTtcclxuXHJcblx0XHRpZiAoIGNvbnRleHQgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGNvbnRleHQgPSBuZXcgQ2xpcHBpbmdDb250ZXh0KCB0aGlzICk7XHJcblx0XHRcdHRoaXMuY2xpcHBpbmdHcm91cENvbnRleHRzLnNldCggY2xpcHBpbmdHcm91cCwgY29udGV4dCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb250ZXh0LnVwZGF0ZSggdGhpcywgY2xpcHBpbmdHcm91cCApO1xyXG5cclxuXHRcdHJldHVybiBjb250ZXh0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBjb3VudCBvZiB1bmlvbiBjbGlwcGluZyBwbGFuZXMuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdCAqIEByZWFkb25seVxyXG5cdCAqL1xyXG5cdGdldCB1bmlvbkNsaXBwaW5nQ291bnQoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMudW5pb25QbGFuZXMubGVuZ3RoO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBDbGlwcGluZ0NvbnRleHQ7XHJcbiIsIi8qKlxyXG4gKiBUaGlzIG1vZHVsZSBpcyB1c2VkIHRvIHJlcHJlc2VudCByZW5kZXIgYnVuZGxlcyBpbnNpZGUgdGhlIHJlbmRlcmVyXHJcbiAqIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5jbGFzcyBSZW5kZXJCdW5kbGUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGJ1bmRsZSBncm91cC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QnVuZGxlR3JvdXB9IGJ1bmRsZUdyb3VwIC0gVGhlIGJ1bmRsZSBncm91cC5cclxuXHQgKiBAcGFyYW0ge0NhbWVyYX0gY2FtZXJhIC0gVGhlIGNhbWVyYSB0aGUgYnVuZGxlIGdyb3VwIGlzIHJlbmRlcmVkIHdpdGguXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGJ1bmRsZUdyb3VwLCBjYW1lcmEgKSB7XHJcblxyXG5cdFx0dGhpcy5idW5kbGVHcm91cCA9IGJ1bmRsZUdyb3VwO1xyXG5cdFx0dGhpcy5jYW1lcmEgPSBjYW1lcmE7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFJlbmRlckJ1bmRsZTtcclxuIiwiaW1wb3J0IENoYWluTWFwIGZyb20gJy4vQ2hhaW5NYXAuanMnO1xyXG5pbXBvcnQgUmVuZGVyQnVuZGxlIGZyb20gJy4vUmVuZGVyQnVuZGxlLmpzJztcclxuXHJcbmNvbnN0IF9jaGFpbktleXMgPSBbXTtcclxuXHJcbi8qKlxyXG4gKiBUaGlzIHJlbmRlcmVyIG1vZHVsZSBtYW5hZ2VzIHJlbmRlciBidW5kbGVzLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuY2xhc3MgUmVuZGVyQnVuZGxlcyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcmVuZGVyIGJ1bmRsZSBtYW5hZ2VtZW50IGNvbXBvbmVudC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgY2hhaW4gbWFwIGZvciBtYWludGFpbmluZyB0aGUgcmVuZGVyIGJ1bmRsZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0NoYWluTWFwfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJ1bmRsZXMgPSBuZXcgQ2hhaW5NYXAoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgcmVuZGVyIGJ1bmRsZSBmb3IgdGhlIGdpdmVuIGJ1bmRsZSBncm91cCBhbmQgY2FtZXJhLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCdW5kbGVHcm91cH0gYnVuZGxlR3JvdXAgLSBUaGUgYnVuZGxlIGdyb3VwLlxyXG5cdCAqIEBwYXJhbSB7Q2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIHRoZSBidW5kbGUgZ3JvdXAgaXMgcmVuZGVyZWQgd2l0aC5cclxuXHQgKiBAcmV0dXJuIHtSZW5kZXJCdW5kbGV9IFRoZSByZW5kZXIgYnVuZGxlLlxyXG5cdCAqL1xyXG5cdGdldCggYnVuZGxlR3JvdXAsIGNhbWVyYSApIHtcclxuXHJcblx0XHRjb25zdCBidW5kbGVzID0gdGhpcy5idW5kbGVzO1xyXG5cclxuXHRcdF9jaGFpbktleXNbIDAgXSA9IGJ1bmRsZUdyb3VwO1xyXG5cdFx0X2NoYWluS2V5c1sgMSBdID0gY2FtZXJhO1xyXG5cclxuXHRcdGxldCBidW5kbGUgPSBidW5kbGVzLmdldCggX2NoYWluS2V5cyApO1xyXG5cclxuXHRcdGlmICggYnVuZGxlID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRidW5kbGUgPSBuZXcgUmVuZGVyQnVuZGxlKCBidW5kbGVHcm91cCwgY2FtZXJhICk7XHJcblx0XHRcdGJ1bmRsZXMuc2V0KCBfY2hhaW5LZXlzLCBidW5kbGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0X2NoYWluS2V5cy5sZW5ndGggPSAwO1xyXG5cclxuXHRcdHJldHVybiBidW5kbGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRnJlZXMgYWxsIGludGVybmFsIHJlc291cmNlcy5cclxuXHQgKi9cclxuXHRkaXNwb3NlKCkge1xyXG5cclxuXHRcdHRoaXMuYnVuZGxlcyA9IG5ldyBDaGFpbk1hcCgpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBSZW5kZXJCdW5kbGVzO1xyXG4iLCIvKipcclxuICogVGhlIHB1cnBvc2Ugb2YgYSBub2RlIGxpYnJhcnkgaXMgdG8gYXNzaWduIG5vZGUgaW1wbGVtZW50YXRpb25zXHJcbiAqIHRvIGV4aXN0aW5nIGxpYnJhcnkgZmVhdHVyZXMuIEluIGBXZWJHUFVSZW5kZXJlcmAgbGlnaHRzLCBtYXRlcmlhbHNcclxuICogd2hpY2ggYXJlIG5vdCBiYXNlZCBvbiBgTm9kZU1hdGVyaWFsYCBhcyB3ZWxsIGFzIHRvbmUgbWFwcGluZyB0ZWNobmlxdWVzXHJcbiAqIGFyZSBpbXBsZW1lbnRlZCB3aXRoIG5vZGUtYmFzZWQgbW9kdWxlcy5cclxuICpcclxuICogQHByaXZhdGVcclxuICovXHJcbmNsYXNzIE5vZGVMaWJyYXJ5IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBub2RlIGxpYnJhcnkuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHdlYWsgbWFwIHRoYXQgbWFwcyBsaWdodHMgdG8gbGlnaHQgbm9kZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1dlYWtNYXA8TGlnaHQuY29uc3RydWN0b3IsQW5hbHl0aWNMaWdodE5vZGUuY29uc3RydWN0b3I+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxpZ2h0Tm9kZXMgPSBuZXcgV2Vha01hcCgpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBtYXAgdGhhdCBtYXBzIG1hdGVyaWFscyB0byBub2RlIG1hdGVyaWFscy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7TWFwPHN0cmluZyxOb2RlTWF0ZXJpYWwuY29uc3RydWN0b3I+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1hdGVyaWFsTm9kZXMgPSBuZXcgTWFwKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIG1hcCB0aGF0IG1hcHMgdG9uZSBtYXBwaW5nIHRlY2huaXF1ZXMgKGNvbnN0YW50cylcclxuXHRcdCAqIHRvIHRvbmUgbWFwcGluZyBub2RlIGZ1bmN0aW9ucy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7TWFwPG51bWJlcixGdW5jdGlvbj59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudG9uZU1hcHBpbmdOb2RlcyA9IG5ldyBNYXAoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbWF0Y2hpbmcgbm9kZSBtYXRlcmlhbCBpbnN0YW5jZSBmb3IgdGhlIGdpdmVuIG1hdGVyaWFsIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGFsc28gYXNzaWducy9jb3BpZXMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuIG1hdGVyaWFsIG9iamVjdFxyXG5cdCAqIHRvIHRoZSBub2RlIG1hdGVyaWFsLiBUaGlzIGlzIGRvbmUgdG8gbWFrZSBzdXJlIHRoZSBjdXJyZW50IG1hdGVyaWFsXHJcblx0ICogY29uZmlndXJhdGlvbiBjYXJyaWVzIG92ZXIgdG8gdGhlIG5vZGUgdmVyc2lvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0ZXJpYWx9IG1hdGVyaWFsIC0gQSBtYXRlcmlhbC5cclxuXHQgKiBAcmV0dXJuIHtOb2RlTWF0ZXJpYWx9IFRoZSBjb3JyZXNwb25kaW5nIG5vZGUgbWF0ZXJpYWwuXHJcblx0ICovXHJcblx0ZnJvbU1hdGVyaWFsKCBtYXRlcmlhbCApIHtcclxuXHJcblx0XHRpZiAoIG1hdGVyaWFsLmlzTm9kZU1hdGVyaWFsICkgcmV0dXJuIG1hdGVyaWFsO1xyXG5cclxuXHRcdGxldCBub2RlTWF0ZXJpYWwgPSBudWxsO1xyXG5cclxuXHRcdGNvbnN0IG5vZGVNYXRlcmlhbENsYXNzID0gdGhpcy5nZXRNYXRlcmlhbE5vZGVDbGFzcyggbWF0ZXJpYWwudHlwZSApO1xyXG5cclxuXHRcdGlmICggbm9kZU1hdGVyaWFsQ2xhc3MgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRub2RlTWF0ZXJpYWwgPSBuZXcgbm9kZU1hdGVyaWFsQ2xhc3MoKTtcclxuXHJcblx0XHRcdGZvciAoIGNvbnN0IGtleSBpbiBtYXRlcmlhbCApIHtcclxuXHJcblx0XHRcdFx0bm9kZU1hdGVyaWFsWyBrZXkgXSA9IG1hdGVyaWFsWyBrZXkgXTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG5vZGVNYXRlcmlhbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIGEgdG9uZSBtYXBwaW5nIG5vZGUgZnVuY3Rpb24gZm9yIGEgdG9uZSBtYXBwaW5nIHRlY2huaXF1ZSAoY29uc3RhbnQpLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gdG9uZU1hcHBpbmdOb2RlIC0gVGhlIHRvbmUgbWFwcGluZyBub2RlIGZ1bmN0aW9uLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0b25lTWFwcGluZyAtIFRoZSB0b25lIG1hcHBpbmcuXHJcblx0ICovXHJcblx0YWRkVG9uZU1hcHBpbmcoIHRvbmVNYXBwaW5nTm9kZSwgdG9uZU1hcHBpbmcgKSB7XHJcblxyXG5cdFx0dGhpcy5hZGRUeXBlKCB0b25lTWFwcGluZ05vZGUsIHRvbmVNYXBwaW5nLCB0aGlzLnRvbmVNYXBwaW5nTm9kZXMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgdG9uZSBtYXBwaW5nIG5vZGUgZnVuY3Rpb24gZm9yIGEgdG9uZSBtYXBwaW5nIHRlY2huaXF1ZSAoY29uc3RhbnQpLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHRvbmVNYXBwaW5nIC0gVGhlIHRvbmUgbWFwcGluZy5cclxuXHQgKiBAcmV0dXJuIHs/RnVuY3Rpb259IFRoZSB0b25lIG1hcHBpbmcgbm9kZSBmdW5jdGlvbi4gUmV0dXJucyBgbnVsbGAgaWYgbm8gbm9kZSBmdW5jdGlvbiBpcyBmb3VuZC5cclxuXHQgKi9cclxuXHRnZXRUb25lTWFwcGluZ0Z1bmN0aW9uKCB0b25lTWFwcGluZyApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy50b25lTWFwcGluZ05vZGVzLmdldCggdG9uZU1hcHBpbmcgKSB8fCBudWxsO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBub2RlIG1hdGVyaWFsIGNsYXNzIGRlZmluaXRpb24gZm9yIGEgbWF0ZXJpYWwgdHlwZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBtYXRlcmlhbFR5cGUgLSBUaGUgbWF0ZXJpYWwgdHlwZS5cclxuXHQgKiBAcmV0dXJuIHs/Tm9kZU1hdGVyaWFsLmNvbnN0cnVjdG9yfSBUaGUgbm9kZSBtYXRlcmlhbCBjbGFzcyBkZWZpbml0aW9uLiBSZXR1cm5zIGBudWxsYCBpZiBubyBub2RlIG1hdGVyaWFsIGlzIGZvdW5kLlxyXG5cdCAqL1xyXG5cdGdldE1hdGVyaWFsTm9kZUNsYXNzKCBtYXRlcmlhbFR5cGUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubWF0ZXJpYWxOb2Rlcy5nZXQoIG1hdGVyaWFsVHlwZSApIHx8IG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyBhIG5vZGUgbWF0ZXJpYWwgY2xhc3MgZGVmaW5pdGlvbiBmb3IgYSBnaXZlbiBtYXRlcmlhbCB0eXBlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlTWF0ZXJpYWwuY29uc3RydWN0b3J9IG1hdGVyaWFsTm9kZUNsYXNzIC0gVGhlIG5vZGUgbWF0ZXJpYWwgY2xhc3MgZGVmaW5pdGlvbi5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbWF0ZXJpYWxDbGFzc1R5cGUgLSBUaGUgbWF0ZXJpYWwgdHlwZS5cclxuXHQgKi9cclxuXHRhZGRNYXRlcmlhbCggbWF0ZXJpYWxOb2RlQ2xhc3MsIG1hdGVyaWFsQ2xhc3NUeXBlICkge1xyXG5cclxuXHRcdHRoaXMuYWRkVHlwZSggbWF0ZXJpYWxOb2RlQ2xhc3MsIG1hdGVyaWFsQ2xhc3NUeXBlLCB0aGlzLm1hdGVyaWFsTm9kZXMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbGlnaHQgbm9kZSBjbGFzcyBkZWZpbml0aW9uIGZvciBhIGxpZ2h0IGNsYXNzIGRlZmluaXRpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0xpZ2h0LmNvbnN0cnVjdG9yfSBsaWdodCAtIFRoZSBsaWdodCBjbGFzcyBkZWZpbml0aW9uLlxyXG5cdCAqIEByZXR1cm4gez9BbmFseXRpY0xpZ2h0Tm9kZS5jb25zdHJ1Y3Rvcn0gVGhlIGxpZ2h0IG5vZGUgY2xhc3MgZGVmaW5pdGlvbi4gUmV0dXJucyBgbnVsbGAgaWYgbm8gbGlnaHQgbm9kZSBpcyBmb3VuZC5cclxuXHQgKi9cclxuXHRnZXRMaWdodE5vZGVDbGFzcyggbGlnaHQgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubGlnaHROb2Rlcy5nZXQoIGxpZ2h0ICkgfHwgbnVsbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIGEgbGlnaHQgbm9kZSBjbGFzcyBkZWZpbml0aW9uIGZvciBhIGdpdmVuIGxpZ2h0IGNsYXNzIGRlZmluaXRpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FuYWx5dGljTGlnaHROb2RlLmNvbnN0cnVjdG9yfSBsaWdodE5vZGVDbGFzcyAtIFRoZSBsaWdodCBub2RlIGNsYXNzIGRlZmluaXRpb24uXHJcblx0ICogQHBhcmFtIHtMaWdodC5jb25zdHJ1Y3Rvcn0gbGlnaHRDbGFzcyAtIFRoZSBsaWdodCBjbGFzcyBkZWZpbml0aW9uLlxyXG5cdCAqL1xyXG5cdGFkZExpZ2h0KCBsaWdodE5vZGVDbGFzcywgbGlnaHRDbGFzcyApIHtcclxuXHJcblx0XHR0aGlzLmFkZENsYXNzKCBsaWdodE5vZGVDbGFzcywgbGlnaHRDbGFzcywgdGhpcy5saWdodE5vZGVzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyBhIG5vZGUgY2xhc3MgZGVmaW5pdGlvbiBmb3IgdGhlIGdpdmVuIHR5cGUgdG8gdGhlIHByb3ZpZGVkIHR5cGUgbGlicmFyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7YW55fSBub2RlQ2xhc3MgLSBUaGUgbm9kZSBjbGFzcyBkZWZpbml0aW9uLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gdHlwZSAtIFRoZSBvYmplY3QgdHlwZS5cclxuXHQgKiBAcGFyYW0ge01hcH0gbGlicmFyeSAtIFRoZSB0eXBlIGxpYnJhcnkuXHJcblx0ICovXHJcblx0YWRkVHlwZSggbm9kZUNsYXNzLCB0eXBlLCBsaWJyYXJ5ICkge1xyXG5cclxuXHRcdGlmICggbGlicmFyeS5oYXMoIHR5cGUgKSApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUud2FybiggYFJlZGVmaW5pdGlvbiBvZiBub2RlICR7IHR5cGUgfWAgKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHR5cGVvZiBub2RlQ2xhc3MgIT09ICdmdW5jdGlvbicgKSB0aHJvdyBuZXcgRXJyb3IoIGBOb2RlIGNsYXNzICR7IG5vZGVDbGFzcy5uYW1lIH0gaXMgbm90IGEgY2xhc3MuYCApO1xyXG5cdFx0aWYgKCB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgKSB0aHJvdyBuZXcgRXJyb3IoIGBCYXNlIGNsYXNzICR7IHR5cGUgfSBpcyBub3QgYSBjbGFzcy5gICk7XHJcblxyXG5cdFx0bGlicmFyeS5zZXQoIHR5cGUsIG5vZGVDbGFzcyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgYSBub2RlIGNsYXNzIGRlZmluaXRpb24gZm9yIHRoZSBnaXZlbiBjbGFzcyBkZWZpbml0aW9uIHRvIHRoZSBwcm92aWRlZCB0eXBlIGxpYnJhcnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge2FueX0gbm9kZUNsYXNzIC0gVGhlIG5vZGUgY2xhc3MgZGVmaW5pdGlvbi5cclxuXHQgKiBAcGFyYW0ge2FueX0gYmFzZUNsYXNzIC0gVGhlIGNsYXNzIGRlZmluaXRpb24uXHJcblx0ICogQHBhcmFtIHtXZWFrTWFwfSBsaWJyYXJ5IC0gVGhlIHR5cGUgbGlicmFyeS5cclxuXHQgKi9cclxuXHRhZGRDbGFzcyggbm9kZUNsYXNzLCBiYXNlQ2xhc3MsIGxpYnJhcnkgKSB7XHJcblxyXG5cdFx0aWYgKCBsaWJyYXJ5LmhhcyggYmFzZUNsYXNzICkgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLndhcm4oIGBSZWRlZmluaXRpb24gb2Ygbm9kZSAkeyBiYXNlQ2xhc3MubmFtZSB9YCApO1xyXG5cdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdHlwZW9mIG5vZGVDbGFzcyAhPT0gJ2Z1bmN0aW9uJyApIHRocm93IG5ldyBFcnJvciggYE5vZGUgY2xhc3MgJHsgbm9kZUNsYXNzLm5hbWUgfSBpcyBub3QgYSBjbGFzcy5gICk7XHJcblx0XHRpZiAoIHR5cGVvZiBiYXNlQ2xhc3MgIT09ICdmdW5jdGlvbicgKSB0aHJvdyBuZXcgRXJyb3IoIGBCYXNlIGNsYXNzICR7IGJhc2VDbGFzcy5uYW1lIH0gaXMgbm90IGEgY2xhc3MuYCApO1xyXG5cclxuXHRcdGxpYnJhcnkuc2V0KCBiYXNlQ2xhc3MsIG5vZGVDbGFzcyApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBOb2RlTGlicmFyeTtcclxuIiwiaW1wb3J0IHsgTGlnaHRzTm9kZSB9IGZyb20gJy4uLy4uL25vZGVzL05vZGVzLmpzJztcclxuaW1wb3J0IENoYWluTWFwIGZyb20gJy4vQ2hhaW5NYXAuanMnO1xyXG5cclxuY29uc3QgX2RlZmF1bHRMaWdodHMgPSAvKkBfX1BVUkVfXyovIG5ldyBMaWdodHNOb2RlKCk7XHJcbmNvbnN0IF9jaGFpbktleXMgPSBbXTtcclxuXHJcbi8qKlxyXG4gKiBUaGlzIHJlbmRlcmVyIG1vZHVsZSBtYW5hZ2VzIHRoZSBsaWdodHMgbm9kZXMgd2hpY2ggYXJlIHVuaXF1ZVxyXG4gKiBwZXIgc2NlbmUgYW5kIGNhbWVyYSBjb21iaW5hdGlvbi5cclxuICpcclxuICogVGhlIGxpZ2h0cyBub2RlIGl0c2VsZiBpcyBsYXRlciBjb25maWd1cmVkIGluIHRoZSByZW5kZXIgbGlzdFxyXG4gKiB3aXRoIHRoZSBhY3R1YWwgbGlnaHRzIGZyb20gdGhlIHNjZW5lLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAYXVnbWVudHMgQ2hhaW5NYXBcclxuICovXHJcbmNsYXNzIExpZ2h0aW5nIGV4dGVuZHMgQ2hhaW5NYXAge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbGlnaHRpbmcgbWFuYWdlbWVudCBjb21wb25lbnQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGEgbmV3IGxpZ2h0cyBub2RlIGZvciB0aGUgZ2l2ZW4gYXJyYXkgb2YgbGlnaHRzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxMaWdodD59IGxpZ2h0cyAtIFRoZSByZW5kZXIgb2JqZWN0LlxyXG5cdCAqIEByZXR1cm4ge0xpZ2h0c05vZGV9IFRoZSBsaWdodHMgbm9kZS5cclxuXHQgKi9cclxuXHRjcmVhdGVOb2RlKCBsaWdodHMgPSBbXSApIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IExpZ2h0c05vZGUoKS5zZXRMaWdodHMoIGxpZ2h0cyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBsaWdodHMgbm9kZSBmb3IgdGhlIGdpdmVuIHNjZW5lIGFuZCBjYW1lcmEuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1NjZW5lfSBzY2VuZSAtIFRoZSBzY2VuZS5cclxuXHQgKiBAcGFyYW0ge0NhbWVyYX0gY2FtZXJhIC0gVGhlIGNhbWVyYS5cclxuXHQgKiBAcmV0dXJuIHtMaWdodHNOb2RlfSBUaGUgbGlnaHRzIG5vZGUuXHJcblx0ICovXHJcblx0Z2V0Tm9kZSggc2NlbmUsIGNhbWVyYSApIHtcclxuXHJcblx0XHQvLyBpZ25vcmUgcG9zdC1wcm9jZXNzaW5nXHJcblxyXG5cdFx0aWYgKCBzY2VuZS5pc1F1YWRNZXNoICkgcmV0dXJuIF9kZWZhdWx0TGlnaHRzO1xyXG5cclxuXHRcdF9jaGFpbktleXNbIDAgXSA9IHNjZW5lO1xyXG5cdFx0X2NoYWluS2V5c1sgMSBdID0gY2FtZXJhO1xyXG5cclxuXHRcdGxldCBub2RlID0gdGhpcy5nZXQoIF9jaGFpbktleXMgKTtcclxuXHJcblx0XHRpZiAoIG5vZGUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcclxuXHRcdFx0dGhpcy5zZXQoIF9jaGFpbktleXMsIG5vZGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0X2NoYWluS2V5cy5sZW5ndGggPSAwO1xyXG5cclxuXHRcdHJldHVybiBub2RlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBMaWdodGluZztcclxuIiwiaW1wb3J0IHsgUmVuZGVyVGFyZ2V0IH0gZnJvbSAnLi4vLi4vY29yZS9SZW5kZXJUYXJnZXQuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgc3BlY2lhbCB0eXBlIG9mIHJlbmRlciB0YXJnZXQgdGhhdCBpcyB1c2VkIHdoZW4gcmVuZGVyaW5nXHJcbiAqIHdpdGggdGhlIFdlYlhSIERldmljZSBBUEkuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBhdWdtZW50cyBSZW5kZXJUYXJnZXRcclxuICovXHJcbmNsYXNzIFhSUmVuZGVyVGFyZ2V0IGV4dGVuZHMgUmVuZGVyVGFyZ2V0IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBYUiByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt3aWR0aD0xXSAtIFRoZSB3aWR0aCBvZiB0aGUgcmVuZGVyIHRhcmdldC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2hlaWdodD0xXSAtIFRoZSBoZWlnaHQgb2YgdGhlIHJlbmRlciB0YXJnZXQuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSAtIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHdpZHRoID0gMSwgaGVpZ2h0ID0gMSwgb3B0aW9ucyA9IHt9ICkge1xyXG5cclxuXHRcdHN1cGVyKCB3aWR0aCwgaGVpZ2h0LCBvcHRpb25zICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzWFJSZW5kZXJUYXJnZXQgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgYXR0YWNobWVudHMgb2YgdGhlIHJlbmRlciB0YXJnZXRcclxuXHRcdCAqIGFyZSBkZWZpbmVkIGJ5IGV4dGVybmFsIHRleHR1cmVzLiBUaGlzIGZsYWcgaXNcclxuXHRcdCAqIHNldCB0byBgdHJ1ZWAgd2hlbiB1c2luZyB0aGUgV2ViWFIgTGF5ZXJzIEFQSS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaGFzRXh0ZXJuYWxUZXh0dXJlcyA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciBhIGRlcHRoIGJ1ZmZlciBzaG91bGQgYXV0b21hdGljYWxseSBiZSBhbGxvY2F0ZWRcclxuXHRcdCAqIGZvciB0aGlzIFhSIHJlbmRlciB0YXJnZXQgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEFsbG9jYXRpbmcgYSBkZXB0aCBidWZmZXIgaXMgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgWFIgcmVuZGVyXHJcblx0XHQgKiB0YXJnZXRzLiBIb3dldmVyLCB3aGVuIHVzaW5nIHRoZSBXZWJYUiBMYXllcnMgQVBJLCB0aGlzIGZsYWdcclxuXHRcdCAqIG11c3QgYmUgc2V0IHRvIGBmYWxzZWAgd2hlbiB0aGUgYGlnbm9yZURlcHRoVmFsdWVzYCBwcm9wZXJ0eSBvZlxyXG5cdFx0ICogdGhlIHByb2plY3Rpb24gbGF5ZXJzIGV2YWx1YXRlcyB0byBgZmFsc2VgLlxyXG5cdFx0ICpcclxuXHRcdCAqIFJlZmVyZW5jZToge0BsaW5rIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJ4cmxheWVycy0xLyNkb20teHJwcm9qZWN0aW9ubGF5ZXItaWdub3JlZGVwdGh2YWx1ZXN9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmF1dG9BbGxvY2F0ZURlcHRoQnVmZmVyID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy5oYXNFeHRlcm5hbFRleHR1cmVzID0gc291cmNlLmhhc0V4dGVybmFsVGV4dHVyZXM7XHJcblx0XHR0aGlzLmF1dG9BbGxvY2F0ZURlcHRoQnVmZmVyID0gc291cmNlLmF1dG9BbGxvY2F0ZURlcHRoQnVmZmVyO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgWFJSZW5kZXJUYXJnZXQgfTtcclxuIiwiaW1wb3J0IHsgQXJyYXlDYW1lcmEgfSBmcm9tICcuLi8uLi9jYW1lcmFzL0FycmF5Q2FtZXJhLmpzJztcclxuaW1wb3J0IHsgRXZlbnREaXNwYXRjaGVyIH0gZnJvbSAnLi4vLi4vY29yZS9FdmVudERpc3BhdGNoZXIuanMnO1xyXG5pbXBvcnQgeyBQZXJzcGVjdGl2ZUNhbWVyYSB9IGZyb20gJy4uLy4uL2NhbWVyYXMvUGVyc3BlY3RpdmVDYW1lcmEuanMnO1xyXG5pbXBvcnQgeyBRdWF0ZXJuaW9uIH0gZnJvbSAnLi4vLi4vbWF0aC9RdWF0ZXJuaW9uLmpzJztcclxuaW1wb3J0IHsgUkFEMkRFRyB9IGZyb20gJy4uLy4uL21hdGgvTWF0aFV0aWxzLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMi5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3I0IH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3I0LmpzJztcclxuaW1wb3J0IHsgV2ViWFJDb250cm9sbGVyIH0gZnJvbSAnLi4vd2VieHIvV2ViWFJDb250cm9sbGVyLmpzJztcclxuaW1wb3J0IHsgQWRkRXF1YXRpb24sIEJhY2tTaWRlLCBDdXN0b21CbGVuZGluZywgRGVwdGhGb3JtYXQsIERlcHRoU3RlbmNpbEZvcm1hdCwgRnJvbnRTaWRlLCBSR0JBRm9ybWF0LCBVbnNpZ25lZEJ5dGVUeXBlLCBVbnNpZ25lZEludDI0OFR5cGUsIFVuc2lnbmVkSW50VHlwZSwgWmVyb0ZhY3RvciB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IERlcHRoVGV4dHVyZSB9IGZyb20gJy4uLy4uL3RleHR1cmVzL0RlcHRoVGV4dHVyZS5qcyc7XHJcbmltcG9ydCB7IFhSUmVuZGVyVGFyZ2V0IH0gZnJvbSAnLi9YUlJlbmRlclRhcmdldC5qcyc7XHJcbmltcG9ydCB7IEN5bGluZGVyR2VvbWV0cnkgfSBmcm9tICcuLi8uLi9nZW9tZXRyaWVzL0N5bGluZGVyR2VvbWV0cnkuanMnO1xyXG5pbXBvcnQgeyBQbGFuZUdlb21ldHJ5IH0gZnJvbSAnLi4vLi4vZ2VvbWV0cmllcy9QbGFuZUdlb21ldHJ5LmpzJztcclxuaW1wb3J0IHsgTWVzaEJhc2ljTWF0ZXJpYWwgfSBmcm9tICcuLi8uLi9tYXRlcmlhbHMvTWVzaEJhc2ljTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyBNZXNoIH0gZnJvbSAnLi4vLi4vb2JqZWN0cy9NZXNoLmpzJztcclxuXHJcbmNvbnN0IF9jYW1lcmFMUG9zID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfY2FtZXJhUlBvcyA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuXHJcbi8qKlxyXG4gKiBUaGUgWFIgbWFuYWdlciBpcyBidWlsdCBvbiB0b3Agb2YgdGhlIFdlYlhSIERldmljZSBBUEkgdG9cclxuICogbWFuYWdlIFhSIHNlc3Npb25zIHdpdGggYFdlYkdQVVJlbmRlcmVyYC5cclxuICpcclxuICogWFIgaXMgY3VycmVudGx5IG9ubHkgc3VwcG9ydGVkIHdpdGggYSBXZWJHTCAyIGJhY2tlbmQuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBFdmVudERpc3BhdGNoZXJcclxuICovXHJcbmNsYXNzIFhSTWFuYWdlciBleHRlbmRzIEV2ZW50RGlzcGF0Y2hlciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgWFIgbWFuYWdlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCByZW5kZXJlciApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGdsb2JhbGx5IGVuYWJsZXMgWFIgcmVuZGVyaW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5lbmFibGVkID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSBYUiBkZXZpY2UgaXMgY3VycmVudGx5IHByZXNlbnRpbmcgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzUHJlc2VudGluZyA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgWFIgY2FtZXJhIHNob3VsZCBhdXRvbWF0aWNhbGx5IGJlIHVwZGF0ZWQgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNhbWVyYUF1dG9VcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJlbmRlcmVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7UmVuZGVyZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX3JlbmRlcmVyID0gcmVuZGVyZXI7XHJcblxyXG5cdFx0Ly8gY2FtZXJhXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXByZXNlbnRzIHRoZSBjYW1lcmEgZm9yIHRoZSBsZWZ0IGV5ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge1BlcnNwZWN0aXZlQ2FtZXJhfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9jYW1lcmFMID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCk7XHJcblx0XHR0aGlzLl9jYW1lcmFMLnZpZXdwb3J0ID0gbmV3IFZlY3RvcjQoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlcHJlc2VudHMgdGhlIGNhbWVyYSBmb3IgdGhlIHJpZ2h0IGV5ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge1BlcnNwZWN0aXZlQ2FtZXJhfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9jYW1lcmFSID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCk7XHJcblx0XHR0aGlzLl9jYW1lcmFSLnZpZXdwb3J0ID0gbmV3IFZlY3RvcjQoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgbGlzdCBvZiBjYW1lcmFzIHVzZWQgZm9yIHJlbmRlcmluZyB0aGUgWFIgdmlld3MuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxDYW1lcmE+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9jYW1lcmFzID0gWyB0aGlzLl9jYW1lcmFMLCB0aGlzLl9jYW1lcmFSIF07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbWFpbiBYUiBjYW1lcmEuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHtBcnJheUNhbWVyYX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fY2FtZXJhWFIgPSBuZXcgQXJyYXlDYW1lcmEoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjdXJyZW50IG5lYXIgdmFsdWUgb2YgdGhlIFhSIGNhbWVyYS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUgez9udW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX2N1cnJlbnREZXB0aE5lYXIgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGN1cnJlbnQgZmFyIHZhbHVlIG9mIHRoZSBYUiBjYW1lcmEuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHs/bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9jdXJyZW50RGVwdGhGYXIgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBsaXN0IG9mIFdlYlhSIGNvbnRyb2xsZXJzIHJlcXVlc3RlZCBieSB0aGUgYXBwbGljYXRpb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxXZWJYUkNvbnRyb2xsZXI+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9jb250cm9sbGVycyA9IFtdO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBsaXN0IG9mIFhSIGlucHV0IHNvdXJjZS4gRWFjaCBpbnB1dCBzb3VyY2UgYmVsb25ncyB0b1xyXG5cdFx0ICogYW4gaW5zdGFuY2Ugb2YgV2ViWFJDb250cm9sbGVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8WFJJbnB1dFNvdXJjZT8+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9jb250cm9sbGVySW5wdXRTb3VyY2VzID0gW107XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgWFIgcmVuZGVyIHRhcmdldCB0aGF0IHJlcHJlc2VudHMgdGhlIHJlbmRlcmluZyBkZXN0aW5hdGlvblxyXG5cdFx0ICogZHVyaW5nIGFuIGFjdGl2ZSBYUiBzZXNzaW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7P1JlbmRlclRhcmdldH1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5feHJSZW5kZXJUYXJnZXQgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQW4gYXJyYXkgaG9sZGluZyBhbGwgdGhlIG5vbi1wcm9qZWN0aW9uIGxheWVyc1xyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8T2JqZWN0Pn1cclxuXHRcdCAqIEBkZWZhdWx0IFtdXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX2xheWVycyA9IFtdO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgZGV2aWNlIGhhcyBzdXBwb3J0IGZvciBhbGwgbGF5ZXIgdHlwZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9zdXBwb3J0c0xheWVycyA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBuYXRpdmUgV2ViWFIgTGF5ZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHtGdW5jdGlvbn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fY3JlYXRlWFJMYXllciA9IGNyZWF0ZVhSTGF5ZXIuYmluZCggdGhpcyApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0KiBUaGUgY3VycmVudCBXZWJHTCBjb250ZXh0LlxyXG5cdFx0KlxyXG5cdFx0KiBAcHJpdmF0ZVxyXG5cdFx0KiBAdHlwZSB7P1dlYkdMMlJlbmRlcmluZ0NvbnRleHR9XHJcblx0XHQqIEBkZWZhdWx0IG51bGxcclxuXHRcdCovXHJcblx0XHR0aGlzLl9nbCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY3VycmVudCBhbmltYXRpb24gY29udGV4dC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUgez9XaW5kb3d9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX2N1cnJlbnRBbmltYXRpb25Db250ZXh0ID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjdXJyZW50IGFuaW1hdGlvbiBsb29wLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7P0Z1bmN0aW9ufVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9jdXJyZW50QW5pbWF0aW9uTG9vcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY3VycmVudCBwaXhlbCByYXRpby5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUgez9udW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX2N1cnJlbnRQaXhlbFJhdGlvID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjdXJyZW50IHNpemUgb2YgdGhlIHJlbmRlcmVyJ3MgY2FudmFzXHJcblx0XHQgKiBpbiBsb2dpY2FsIHBpeGVsIHVuaXQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3IyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9jdXJyZW50U2l6ZSA9IG5ldyBWZWN0b3IyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZGVmYXVsdCBldmVudCBsaXN0ZW5lciBmb3IgaGFuZGxpbmcgZXZlbnRzIGluc2lkZSBhIFhSIHNlc3Npb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHtGdW5jdGlvbn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fb25TZXNzaW9uRXZlbnQgPSBvblNlc3Npb25FdmVudC5iaW5kKCB0aGlzICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZXZlbnQgbGlzdGVuZXIgZm9yIGhhbmRsaW5nIHRoZSBlbmQgb2YgYSBYUiBzZXNzaW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7RnVuY3Rpb259XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX29uU2Vzc2lvbkVuZCA9IG9uU2Vzc2lvbkVuZC5iaW5kKCB0aGlzICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZXZlbnQgbGlzdGVuZXIgZm9yIGhhbmRsaW5nIHRoZSBgaW5wdXRzb3VyY2VzY2hhbmdlYCBldmVudC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge0Z1bmN0aW9ufVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9vbklucHV0U291cmNlc0NoYW5nZSA9IG9uSW5wdXRTb3VyY2VzQ2hhbmdlLmJpbmQoIHRoaXMgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBhbmltYXRpb24gbG9vcCB3aGljaCBpcyB1c2VkIGFzIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBkZWZhdWx0XHJcblx0XHQgKiBhbmltYXRpb24gbG9vcCBvZiB0aGUgYXBwbGljYXRpb24uIEl0IGlzIG9ubHkgdXNlZCB3aGVuIGEgWFIgc2Vzc2lvblxyXG5cdFx0ICogaXMgYWN0aXZlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7RnVuY3Rpb259XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX29uQW5pbWF0aW9uRnJhbWUgPSBvbkFuaW1hdGlvbkZyYW1lLmJpbmQoIHRoaXMgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjdXJyZW50IFhSIHJlZmVyZW5jZSBzcGFjZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUgez9YUlJlZmVyZW5jZVNwYWNlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9yZWZlcmVuY2VTcGFjZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY3VycmVudCBYUiByZWZlcmVuY2Ugc3BhY2UgdHlwZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge1hSUmVmZXJlbmNlU3BhY2VUeXBlfVxyXG5cdFx0ICogQGRlZmF1bHQgJ2xvY2FsLWZsb29yJ1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9yZWZlcmVuY2VTcGFjZVR5cGUgPSAnbG9jYWwtZmxvb3InO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBjdXN0b20gcmVmZXJlbmNlIHNwYWNlIGRlZmluZWQgYnkgdGhlIGFwcGxpY2F0aW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7P1hSUmVmZXJlbmNlU3BhY2V9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX2N1c3RvbVJlZmVyZW5jZVNwYWNlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBmcmFtZWJ1ZmZlciBzY2FsZSBmYWN0b3IuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX2ZyYW1lYnVmZmVyU2NhbGVGYWN0b3IgPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGZvdmVhdGlvbiBmYWN0b3IuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX2ZvdmVhdGlvbiA9IDEuMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IFhSIHNlc3Npb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHs/WFJTZXNzaW9ufVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9zZXNzaW9uID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IFhSIGJhc2UgbGF5ZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHs/WFJXZWJHTExheWVyfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9nbEJhc2VMYXllciA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBYUiBiaW5kaW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7P1hSV2ViR0xCaW5kaW5nfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9nbEJpbmRpbmcgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgWFIgcHJvamVjdGlvbiBsYXllci5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUgez9YUlByb2plY3Rpb25MYXllcn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fZ2xQcm9qTGF5ZXIgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgWFIgZnJhbWUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHs/WFJGcmFtZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5feHJGcmFtZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRvIHVzZSB0aGUgV2ViWFIgTGF5ZXJzIEFQSSBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX3VzZUxheWVycyA9ICggdHlwZW9mIFhSV2ViR0xCaW5kaW5nICE9PSAndW5kZWZpbmVkJyAmJiAnY3JlYXRlUHJvamVjdGlvbkxheWVyJyBpbiBYUldlYkdMQmluZGluZy5wcm90b3R5cGUgKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjb21wYXQvY29tcGF0XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiBgVEhSRUUuR3JvdXBgIHRoYXQgcmVwcmVzZW50cyB0aGUgdHJhbnNmb3JtYXRpb25cclxuXHQgKiBvZiBhIFhSIGNvbnRyb2xsZXIgaW4gdGFyZ2V0IHJheSBzcGFjZS4gVGhlIHJlcXVlc3RlZCBjb250cm9sbGVyIGlzIGRlZmluZWRcclxuXHQgKiBieSB0aGUgZ2l2ZW4gaW5kZXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIFhSIGNvbnRyb2xsZXIuXHJcblx0ICogQHJldHVybiB7R3JvdXB9IEEgZ3JvdXAgdGhhdCByZXByZXNlbnRzIHRoZSBjb250cm9sbGVyJ3MgdHJhbnNmb3JtYXRpb24uXHJcblx0ICovXHJcblx0Z2V0Q29udHJvbGxlciggaW5kZXggKSB7XHJcblxyXG5cdFx0Y29uc3QgY29udHJvbGxlciA9IHRoaXMuX2dldENvbnRyb2xsZXIoIGluZGV4ICk7XHJcblxyXG5cdFx0cmV0dXJuIGNvbnRyb2xsZXIuZ2V0VGFyZ2V0UmF5U3BhY2UoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIGBUSFJFRS5Hcm91cGAgdGhhdCByZXByZXNlbnRzIHRoZSB0cmFuc2Zvcm1hdGlvblxyXG5cdCAqIG9mIGEgWFIgY29udHJvbGxlciBpbiBncmlwIHNwYWNlLiBUaGUgcmVxdWVzdGVkIGNvbnRyb2xsZXIgaXMgZGVmaW5lZFxyXG5cdCAqIGJ5IHRoZSBnaXZlbiBpbmRleC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgWFIgY29udHJvbGxlci5cclxuXHQgKiBAcmV0dXJuIHtHcm91cH0gQSBncm91cCB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbnRyb2xsZXIncyB0cmFuc2Zvcm1hdGlvbi5cclxuXHQgKi9cclxuXHRnZXRDb250cm9sbGVyR3JpcCggaW5kZXggKSB7XHJcblxyXG5cdFx0Y29uc3QgY29udHJvbGxlciA9IHRoaXMuX2dldENvbnRyb2xsZXIoIGluZGV4ICk7XHJcblxyXG5cdFx0cmV0dXJuIGNvbnRyb2xsZXIuZ2V0R3JpcFNwYWNlKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiBgVEhSRUUuR3JvdXBgIHRoYXQgcmVwcmVzZW50cyB0aGUgdHJhbnNmb3JtYXRpb25cclxuXHQgKiBvZiBhIFhSIGNvbnRyb2xsZXIgaW4gaGFuZCBzcGFjZS4gVGhlIHJlcXVlc3RlZCBjb250cm9sbGVyIGlzIGRlZmluZWRcclxuXHQgKiBieSB0aGUgZ2l2ZW4gaW5kZXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIFhSIGNvbnRyb2xsZXIuXHJcblx0ICogQHJldHVybiB7R3JvdXB9IEEgZ3JvdXAgdGhhdCByZXByZXNlbnRzIHRoZSBjb250cm9sbGVyJ3MgdHJhbnNmb3JtYXRpb24uXHJcblx0ICovXHJcblx0Z2V0SGFuZCggaW5kZXggKSB7XHJcblxyXG5cdFx0Y29uc3QgY29udHJvbGxlciA9IHRoaXMuX2dldENvbnRyb2xsZXIoIGluZGV4ICk7XHJcblxyXG5cdFx0cmV0dXJuIGNvbnRyb2xsZXIuZ2V0SGFuZFNwYWNlKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgZm92ZWF0aW9uIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfHVuZGVmaW5lZH0gVGhlIGZvdmVhdGlvbiB2YWx1ZS4gUmV0dXJucyBgdW5kZWZpbmVkYCBpZiBubyBiYXNlIG9yIHByb2plY3Rpb24gbGF5ZXIgaXMgZGVmaW5lZC5cclxuXHQgKi9cclxuXHRnZXRGb3ZlYXRpb24oKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9nbFByb2pMYXllciA9PT0gbnVsbCAmJiB0aGlzLl9nbEJhc2VMYXllciA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzLl9mb3ZlYXRpb247XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZm92ZWF0aW9uIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGZvdmVhdGlvbiAtIEEgbnVtYmVyIGluIHRoZSByYW5nZSBgWzAsMV1gIHdoZXJlIGAwYCBtZWFucyBubyBmb3ZlYXRpb24gKGZ1bGwgcmVzb2x1dGlvbilcclxuXHQgKiBhbmQgYDFgIG1lYW5zIG1heGltdW0gZm92ZWF0aW9uICh0aGUgZWRnZXMgcmVuZGVyIGF0IGxvd2VyIHJlc29sdXRpb24pLlxyXG5cdCAqL1xyXG5cdHNldEZvdmVhdGlvbiggZm92ZWF0aW9uICkge1xyXG5cclxuXHRcdHRoaXMuX2ZvdmVhdGlvbiA9IGZvdmVhdGlvbjtcclxuXHJcblx0XHRpZiAoIHRoaXMuX2dsUHJvakxheWVyICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5fZ2xQcm9qTGF5ZXIuZml4ZWRGb3ZlYXRpb24gPSBmb3ZlYXRpb247XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy5fZ2xCYXNlTGF5ZXIgIT09IG51bGwgJiYgdGhpcy5fZ2xCYXNlTGF5ZXIuZml4ZWRGb3ZlYXRpb24gIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHRoaXMuX2dsQmFzZUxheWVyLmZpeGVkRm92ZWF0aW9uID0gZm92ZWF0aW9uO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBmcmFtZWJ1ZmZlciBzY2FsZSBmYWN0b3IuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBmcmFtZWJ1ZmZlciBzY2FsZSBmYWN0b3IuXHJcblx0ICovXHJcblx0Z2V0RnJhbWVidWZmZXJTY2FsZUZhY3RvcigpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fZnJhbWVidWZmZXJTY2FsZUZhY3RvcjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBmcmFtZWJ1ZmZlciBzY2FsZSBmYWN0b3IuXHJcblx0ICpcclxuXHQgKiBUaGlzIG1ldGhvZCBjYW4gbm90IGJlIHVzZWQgZHVyaW5nIGEgWFIgc2Vzc2lvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBmYWN0b3IgLSBUaGUgZnJhbWVidWZmZXIgc2NhbGUgZmFjdG9yLlxyXG5cdCAqL1xyXG5cdHNldEZyYW1lYnVmZmVyU2NhbGVGYWN0b3IoIGZhY3RvciApIHtcclxuXHJcblx0XHR0aGlzLl9mcmFtZWJ1ZmZlclNjYWxlRmFjdG9yID0gZmFjdG9yO1xyXG5cclxuXHRcdGlmICggdGhpcy5pc1ByZXNlbnRpbmcgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5YUk1hbmFnZXI6IENhbm5vdCBjaGFuZ2UgZnJhbWVidWZmZXIgc2NhbGUgd2hpbGUgcHJlc2VudGluZy4nICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHJlZmVyZW5jZSBzcGFjZSB0eXBlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7WFJSZWZlcmVuY2VTcGFjZVR5cGV9IFRoZSByZWZlcmVuY2Ugc3BhY2UgdHlwZS5cclxuXHQgKi9cclxuXHRnZXRSZWZlcmVuY2VTcGFjZVR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX3JlZmVyZW5jZVNwYWNlVHlwZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSByZWZlcmVuY2Ugc3BhY2UgdHlwZS5cclxuXHQgKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGNhbiBub3QgYmUgdXNlZCBkdXJpbmcgYSBYUiBzZXNzaW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtYUlJlZmVyZW5jZVNwYWNlVHlwZX0gdHlwZSAtIFRoZSByZWZlcmVuY2Ugc3BhY2UgdHlwZS5cclxuXHQgKi9cclxuXHRzZXRSZWZlcmVuY2VTcGFjZVR5cGUoIHR5cGUgKSB7XHJcblxyXG5cdFx0dGhpcy5fcmVmZXJlbmNlU3BhY2VUeXBlID0gdHlwZTtcclxuXHJcblx0XHRpZiAoIHRoaXMuaXNQcmVzZW50aW5nID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuWFJNYW5hZ2VyOiBDYW5ub3QgY2hhbmdlIHJlZmVyZW5jZSBzcGFjZSB0eXBlIHdoaWxlIHByZXNlbnRpbmcuJyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBYUiByZWZlcmVuY2Ugc3BhY2UuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtYUlJlZmVyZW5jZVNwYWNlfSBUaGUgWFIgcmVmZXJlbmNlIHNwYWNlLlxyXG5cdCAqL1xyXG5cdGdldFJlZmVyZW5jZVNwYWNlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9jdXN0b21SZWZlcmVuY2VTcGFjZSB8fCB0aGlzLl9yZWZlcmVuY2VTcGFjZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIGEgY3VzdG9tIFhSIHJlZmVyZW5jZSBzcGFjZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7WFJSZWZlcmVuY2VTcGFjZX0gc3BhY2UgLSBUaGUgWFIgcmVmZXJlbmNlIHNwYWNlLlxyXG5cdCAqL1xyXG5cdHNldFJlZmVyZW5jZVNwYWNlKCBzcGFjZSApIHtcclxuXHJcblx0XHR0aGlzLl9jdXN0b21SZWZlcmVuY2VTcGFjZSA9IHNwYWNlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIFhSIGNhbWVyYS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0FycmF5Q2FtZXJhfSBUaGUgWFIgY2FtZXJhLlxyXG5cdCAqL1xyXG5cdGdldENhbWVyYSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fY2FtZXJhWFI7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgZW52aXJvbm1lbnQgYmxlbmQgbW9kZSBmcm9tIHRoZSBjdXJyZW50IFhSIHNlc3Npb24uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHsnb3BhcXVlJ3wnYWRkaXRpdmUnfCdhbHBoYS1ibGVuZCd8dW5kZWZpbmVkfSBUaGUgZW52aXJvbm1lbnQgYmxlbmQgbW9kZS4gUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHVzZWQgb3V0c2lkZSBvZiBhIFhSIHNlc3Npb24uXHJcblx0ICovXHJcblx0Z2V0RW52aXJvbm1lbnRCbGVuZE1vZGUoKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9zZXNzaW9uICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIHRoaXMuX3Nlc3Npb24uZW52aXJvbm1lbnRCbGVuZE1vZGU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGN1cnJlbnQgWFIgZnJhbWUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHs/WFJGcmFtZX0gVGhlIFhSIGZyYW1lLiBSZXR1cm5zIGBudWxsYCB3aGVuIHVzZWQgb3V0c2lkZSBhIFhSIHNlc3Npb24uXHJcblx0ICovXHJcblx0Z2V0RnJhbWUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX3hyRnJhbWU7XHJcblxyXG5cdH1cclxuXHJcblx0Y3JlYXRlUXVhZExheWVyKCB3aWR0aCwgaGVpZ2h0LCB0cmFuc2xhdGlvbiwgcXVhdGVybmlvbiwgcGl4ZWx3aWR0aCwgcGl4ZWxoZWlnaHQsIHJlbmRlcmNhbGwsIGF0dHJpYnV0ZXMgPSBbXSApIHtcclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeSA9IG5ldyBQbGFuZUdlb21ldHJ5KCB3aWR0aCwgaGVpZ2h0ICk7XHJcblx0XHRjb25zdCByZW5kZXJUYXJnZXQgPSBuZXcgWFJSZW5kZXJUYXJnZXQoXHJcblx0XHRcdHBpeGVsd2lkdGgsXHJcblx0XHRcdHBpeGVsaGVpZ2h0LFxyXG5cdFx0XHR7XHJcblx0XHRcdFx0Zm9ybWF0OiBSR0JBRm9ybWF0LFxyXG5cdFx0XHRcdHR5cGU6IFVuc2lnbmVkQnl0ZVR5cGUsXHJcblx0XHRcdFx0ZGVwdGhUZXh0dXJlOiBuZXcgRGVwdGhUZXh0dXJlKFxyXG5cdFx0XHRcdFx0cGl4ZWx3aWR0aCxcclxuXHRcdFx0XHRcdHBpeGVsaGVpZ2h0LFxyXG5cdFx0XHRcdFx0YXR0cmlidXRlcy5zdGVuY2lsID8gVW5zaWduZWRJbnQyNDhUeXBlIDogVW5zaWduZWRJbnRUeXBlLFxyXG5cdFx0XHRcdFx0dW5kZWZpbmVkLFxyXG5cdFx0XHRcdFx0dW5kZWZpbmVkLFxyXG5cdFx0XHRcdFx0dW5kZWZpbmVkLFxyXG5cdFx0XHRcdFx0dW5kZWZpbmVkLFxyXG5cdFx0XHRcdFx0dW5kZWZpbmVkLFxyXG5cdFx0XHRcdFx0dW5kZWZpbmVkLFxyXG5cdFx0XHRcdFx0YXR0cmlidXRlcy5zdGVuY2lsID8gRGVwdGhTdGVuY2lsRm9ybWF0IDogRGVwdGhGb3JtYXRcclxuXHRcdFx0XHQpLFxyXG5cdFx0XHRcdHN0ZW5jaWxCdWZmZXI6IGF0dHJpYnV0ZXMuc3RlbmNpbCxcclxuXHRcdFx0XHRyZXNvbHZlRGVwdGhCdWZmZXI6IGZhbHNlLFxyXG5cdFx0XHRcdHJlc29sdmVTdGVuY2lsQnVmZmVyOiBmYWxzZVxyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0Y29uc3QgbWF0ZXJpYWwgPSBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IDB4ZmZmZmZmLCBzaWRlOiBGcm9udFNpZGUgfSApO1xyXG5cdFx0bWF0ZXJpYWwubWFwID0gcmVuZGVyVGFyZ2V0LnRleHR1cmU7XHJcblx0XHRtYXRlcmlhbC5tYXAub2Zmc2V0LnkgPSAxO1xyXG5cdFx0bWF0ZXJpYWwubWFwLnJlcGVhdC55ID0gLSAxO1xyXG5cdFx0Y29uc3QgcGxhbmUgPSBuZXcgTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcblx0XHRwbGFuZS5wb3NpdGlvbi5jb3B5KCB0cmFuc2xhdGlvbiApO1xyXG5cdFx0cGxhbmUucXVhdGVybmlvbi5jb3B5KCBxdWF0ZXJuaW9uICk7XHJcblxyXG5cdFx0Y29uc3QgbGF5ZXIgPSB7XHJcblx0XHRcdHR5cGU6ICdxdWFkJyxcclxuXHRcdFx0d2lkdGg6IHdpZHRoLFxyXG5cdFx0XHRoZWlnaHQ6IGhlaWdodCxcclxuXHRcdFx0dHJhbnNsYXRpb246IHRyYW5zbGF0aW9uLFxyXG5cdFx0XHRxdWF0ZXJuaW9uOiBxdWF0ZXJuaW9uLFxyXG5cdFx0XHRwaXhlbHdpZHRoOiBwaXhlbHdpZHRoLFxyXG5cdFx0XHRwaXhlbGhlaWdodDogcGl4ZWxoZWlnaHQsXHJcblx0XHRcdHBsYW5lOiBwbGFuZSxcclxuXHRcdFx0bWF0ZXJpYWw6IG1hdGVyaWFsLFxyXG5cdFx0XHRyZW5kZXJjYWxsOiByZW5kZXJjYWxsLFxyXG5cdFx0XHRyZW5kZXJUYXJnZXQ6IHJlbmRlclRhcmdldCB9O1xyXG5cclxuXHRcdHRoaXMuX2xheWVycy5wdXNoKCBsYXllciApO1xyXG5cclxuXHRcdGlmICggdGhpcy5fc2Vzc2lvbiAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGxheWVyLnBsYW5lLm1hdGVyaWFsID0gbmV3IE1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiAweGZmZmZmZiwgc2lkZTogRnJvbnRTaWRlIH0gKTtcclxuXHRcdFx0bGF5ZXIucGxhbmUubWF0ZXJpYWwuYmxlbmRpbmcgPSBDdXN0b21CbGVuZGluZztcclxuXHRcdFx0bGF5ZXIucGxhbmUubWF0ZXJpYWwuYmxlbmRFcXVhdGlvbiA9IEFkZEVxdWF0aW9uO1xyXG5cdFx0XHRsYXllci5wbGFuZS5tYXRlcmlhbC5ibGVuZFNyYyA9IFplcm9GYWN0b3I7XHJcblx0XHRcdGxheWVyLnBsYW5lLm1hdGVyaWFsLmJsZW5kRHN0ID0gWmVyb0ZhY3RvcjtcclxuXHJcblx0XHRcdGxheWVyLnhybGF5ZXIgPSB0aGlzLl9jcmVhdGVYUkxheWVyKCBsYXllciApO1xyXG5cclxuXHRcdFx0Y29uc3QgeHJsYXllcnMgPSB0aGlzLl9zZXNzaW9uLnJlbmRlclN0YXRlLmxheWVycztcclxuXHRcdFx0eHJsYXllcnMudW5zaGlmdCggbGF5ZXIueHJsYXllciApO1xyXG5cdFx0XHR0aGlzLl9zZXNzaW9uLnVwZGF0ZVJlbmRlclN0YXRlKCB7IGxheWVyczogeHJsYXllcnMgfSApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRyZW5kZXJUYXJnZXQuaXNYUlJlbmRlclRhcmdldCA9IGZhbHNlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcGxhbmU7XHJcblxyXG5cdH1cclxuXHJcblx0Y3JlYXRlQ3lsaW5kZXJMYXllciggcmFkaXVzLCBjZW50cmFsQW5nbGUsIGFzcGVjdHJhdGlvLCB0cmFuc2xhdGlvbiwgcXVhdGVybmlvbiwgcGl4ZWx3aWR0aCwgcGl4ZWxoZWlnaHQsIHJlbmRlcmNhbGwsIGF0dHJpYnV0ZXMgPSBbXSApIHtcclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeSA9IG5ldyBDeWxpbmRlckdlb21ldHJ5KCByYWRpdXMsIHJhZGl1cywgcmFkaXVzICogY2VudHJhbEFuZ2xlIC8gYXNwZWN0cmF0aW8sIDY0LCA2NCwgdHJ1ZSwgTWF0aC5QSSAtIGNlbnRyYWxBbmdsZSAvIDIsIGNlbnRyYWxBbmdsZSApO1xyXG5cdFx0Y29uc3QgcmVuZGVyVGFyZ2V0ID0gbmV3IFhSUmVuZGVyVGFyZ2V0KFxyXG5cdFx0XHRwaXhlbHdpZHRoLFxyXG5cdFx0XHRwaXhlbGhlaWdodCxcclxuXHRcdFx0e1xyXG5cdFx0XHRcdGZvcm1hdDogUkdCQUZvcm1hdCxcclxuXHRcdFx0XHR0eXBlOiBVbnNpZ25lZEJ5dGVUeXBlLFxyXG5cdFx0XHRcdGRlcHRoVGV4dHVyZTogbmV3IERlcHRoVGV4dHVyZShcclxuXHRcdFx0XHRcdHBpeGVsd2lkdGgsXHJcblx0XHRcdFx0XHRwaXhlbGhlaWdodCxcclxuXHRcdFx0XHRcdGF0dHJpYnV0ZXMuc3RlbmNpbCA/IFVuc2lnbmVkSW50MjQ4VHlwZSA6IFVuc2lnbmVkSW50VHlwZSxcclxuXHRcdFx0XHRcdHVuZGVmaW5lZCxcclxuXHRcdFx0XHRcdHVuZGVmaW5lZCxcclxuXHRcdFx0XHRcdHVuZGVmaW5lZCxcclxuXHRcdFx0XHRcdHVuZGVmaW5lZCxcclxuXHRcdFx0XHRcdHVuZGVmaW5lZCxcclxuXHRcdFx0XHRcdHVuZGVmaW5lZCxcclxuXHRcdFx0XHRcdGF0dHJpYnV0ZXMuc3RlbmNpbCA/IERlcHRoU3RlbmNpbEZvcm1hdCA6IERlcHRoRm9ybWF0XHJcblx0XHRcdFx0KSxcclxuXHRcdFx0XHRzdGVuY2lsQnVmZmVyOiBhdHRyaWJ1dGVzLnN0ZW5jaWwsXHJcblx0XHRcdFx0cmVzb2x2ZURlcHRoQnVmZmVyOiBmYWxzZSxcclxuXHRcdFx0XHRyZXNvbHZlU3RlbmNpbEJ1ZmZlcjogZmFsc2VcclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdGNvbnN0IG1hdGVyaWFsID0gbmV3IE1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiAweGZmZmZmZiwgc2lkZTogQmFja1NpZGUgfSApO1xyXG5cdFx0bWF0ZXJpYWwubWFwID0gcmVuZGVyVGFyZ2V0LnRleHR1cmU7XHJcblx0XHRtYXRlcmlhbC5tYXAub2Zmc2V0LnkgPSAxO1xyXG5cdFx0bWF0ZXJpYWwubWFwLnJlcGVhdC55ID0gLSAxO1xyXG5cdFx0Y29uc3QgcGxhbmUgPSBuZXcgTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcblx0XHRwbGFuZS5wb3NpdGlvbi5jb3B5KCB0cmFuc2xhdGlvbiApO1xyXG5cdFx0cGxhbmUucXVhdGVybmlvbi5jb3B5KCBxdWF0ZXJuaW9uICk7XHJcblxyXG5cdFx0Y29uc3QgbGF5ZXIgPSB7XHJcblx0XHRcdHR5cGU6ICdjeWxpbmRlcicsXHJcblx0XHRcdHJhZGl1czogcmFkaXVzLFxyXG5cdFx0XHRjZW50cmFsQW5nbGU6IGNlbnRyYWxBbmdsZSxcclxuXHRcdFx0YXNwZWN0cmF0aW86IGFzcGVjdHJhdGlvLFxyXG5cdFx0XHR0cmFuc2xhdGlvbjogdHJhbnNsYXRpb24sXHJcblx0XHRcdHF1YXRlcm5pb246IHF1YXRlcm5pb24sXHJcblx0XHRcdHBpeGVsd2lkdGg6IHBpeGVsd2lkdGgsXHJcblx0XHRcdHBpeGVsaGVpZ2h0OiBwaXhlbGhlaWdodCxcclxuXHRcdFx0cGxhbmU6IHBsYW5lLFxyXG5cdFx0XHRtYXRlcmlhbDogbWF0ZXJpYWwsXHJcblx0XHRcdHJlbmRlcmNhbGw6IHJlbmRlcmNhbGwsXHJcblx0XHRcdHJlbmRlclRhcmdldDogcmVuZGVyVGFyZ2V0IH07XHJcblxyXG5cdFx0dGhpcy5fbGF5ZXJzLnB1c2goIGxheWVyICk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9zZXNzaW9uICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0bGF5ZXIucGxhbmUubWF0ZXJpYWwgPSBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IDB4ZmZmZmZmLCBzaWRlOiBCYWNrU2lkZSB9ICk7XHJcblx0XHRcdGxheWVyLnBsYW5lLm1hdGVyaWFsLmJsZW5kaW5nID0gQ3VzdG9tQmxlbmRpbmc7XHJcblx0XHRcdGxheWVyLnBsYW5lLm1hdGVyaWFsLmJsZW5kRXF1YXRpb24gPSBBZGRFcXVhdGlvbjtcclxuXHRcdFx0bGF5ZXIucGxhbmUubWF0ZXJpYWwuYmxlbmRTcmMgPSBaZXJvRmFjdG9yO1xyXG5cdFx0XHRsYXllci5wbGFuZS5tYXRlcmlhbC5ibGVuZERzdCA9IFplcm9GYWN0b3I7XHJcblxyXG5cdFx0XHRsYXllci54cmxheWVyID0gdGhpcy5fY3JlYXRlWFJMYXllciggbGF5ZXIgKTtcclxuXHJcblx0XHRcdGNvbnN0IHhybGF5ZXJzID0gdGhpcy5fc2Vzc2lvbi5yZW5kZXJTdGF0ZS5sYXllcnM7XHJcblx0XHRcdHhybGF5ZXJzLnVuc2hpZnQoIGxheWVyLnhybGF5ZXIgKTtcclxuXHRcdFx0dGhpcy5fc2Vzc2lvbi51cGRhdGVSZW5kZXJTdGF0ZSggeyBsYXllcnM6IHhybGF5ZXJzIH0gKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0cmVuZGVyVGFyZ2V0LmlzWFJSZW5kZXJUYXJnZXQgPSBmYWxzZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHBsYW5lO1xyXG5cclxuXHR9XHJcblxyXG5cdHJlbmRlckxheWVycyggKSB7XHJcblxyXG5cdFx0Y29uc3QgdHJhbnNsYXRpb25PYmplY3QgPSBuZXcgVmVjdG9yMygpO1xyXG5cdFx0Y29uc3QgcXVhdGVybmlvbk9iamVjdCA9IG5ldyBRdWF0ZXJuaW9uKCk7XHJcblxyXG5cdFx0Y29uc3Qgd2FzUHJlc2VudGluZyA9IHRoaXMuaXNQcmVzZW50aW5nO1xyXG5cdFx0dGhpcy5pc1ByZXNlbnRpbmcgPSBmYWxzZTtcclxuXHJcblx0XHRmb3IgKCBjb25zdCBsYXllciBvZiB0aGlzLl9sYXllcnMgKSB7XHJcblxyXG5cdFx0XHRsYXllci5yZW5kZXJUYXJnZXQuaXNYUlJlbmRlclRhcmdldCA9IHRoaXMuX3Nlc3Npb24gIT09IG51bGw7XHJcblx0XHRcdGxheWVyLnJlbmRlclRhcmdldC5oYXNFeHRlcm5hbFRleHR1cmVzID0gbGF5ZXIucmVuZGVyVGFyZ2V0LmlzWFJSZW5kZXJUYXJnZXQ7XHJcblx0XHRcdGxheWVyLnJlbmRlclRhcmdldC5hdXRvQWxsb2NhdGVEZXB0aEJ1ZmZlciA9ICEgbGF5ZXIucmVuZGVyVGFyZ2V0LmlzWFJSZW5kZXJUYXJnZXQ7XHJcblxyXG5cdFx0XHRpZiAoIGxheWVyLnJlbmRlclRhcmdldC5pc1hSUmVuZGVyVGFyZ2V0ICYmIHRoaXMuX3N1cHBvcnRzTGF5ZXJzICkge1xyXG5cclxuXHRcdFx0XHRsYXllci54cmxheWVyLnRyYW5zZm9ybSA9IG5ldyBYUlJpZ2lkVHJhbnNmb3JtKCBsYXllci5wbGFuZS5nZXRXb3JsZFBvc2l0aW9uKCB0cmFuc2xhdGlvbk9iamVjdCApLCBsYXllci5wbGFuZS5nZXRXb3JsZFF1YXRlcm5pb24oIHF1YXRlcm5pb25PYmplY3QgKSApO1xyXG5cclxuXHRcdFx0XHRjb25zdCBnbFN1YkltYWdlID0gdGhpcy5fZ2xCaW5kaW5nLmdldFN1YkltYWdlKCBsYXllci54cmxheWVyLCB0aGlzLl94ckZyYW1lICk7XHJcblx0XHRcdFx0dGhpcy5fcmVuZGVyZXIuYmFja2VuZC5zZXRYUlJlbmRlclRhcmdldFRleHR1cmVzKFxyXG5cdFx0XHRcdFx0bGF5ZXIucmVuZGVyVGFyZ2V0LFxyXG5cdFx0XHRcdFx0Z2xTdWJJbWFnZS5jb2xvclRleHR1cmUsXHJcblx0XHRcdFx0XHRnbFN1YkltYWdlLmRlcHRoU3RlbmNpbFRleHR1cmUgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuX3JlbmRlcmVyLnNldFJlbmRlclRhcmdldCggbGF5ZXIucmVuZGVyVGFyZ2V0ICk7XHJcblx0XHRcdGxheWVyLnJlbmRlcmNhbGwoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5pc1ByZXNlbnRpbmcgPSB3YXNQcmVzZW50aW5nO1xyXG5cdFx0dGhpcy5fcmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCBudWxsICk7XHJcblxyXG5cdH1cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGN1cnJlbnQgWFIgc2Vzc2lvbi5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4gez9YUlNlc3Npb259IFRoZSBYUiBzZXNzaW9uLiBSZXR1cm5zIGBudWxsYCB3aGVuIHVzZWQgb3V0c2lkZSBhIFhSIHNlc3Npb24uXHJcblx0ICovXHJcblx0Z2V0U2Vzc2lvbigpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fc2Vzc2lvbjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZnRlciBhIFhSIHNlc3Npb24gaGFzIGJlZW4gcmVxdWVzdGVkIHVzdWFsbHkgd2l0aCBvbmUgb2YgdGhlIGAqQnV0dG9uYCBtb2R1bGVzLCBpdFxyXG5cdCAqIGlzIGluamVjdGVkIGludG8gdGhlIHJlbmRlcmVyIHdpdGggdGhpcyBtZXRob2QuIFRoaXMgbWV0aG9kIHRyaWdnZXJzIHRoZSBzdGFydCBvZlxyXG5cdCAqIHRoZSBhY3R1YWwgWFIgcmVuZGVyaW5nLlxyXG5cdCAqXHJcblx0ICogQGFzeW5jXHJcblx0ICogQHBhcmFtIHtYUlNlc3Npb259IHNlc3Npb24gLSBUaGUgWFIgc2Vzc2lvbiB0byBzZXQuXHJcblx0ICogQHJldHVybiB7UHJvbWlzZX0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgc2Vzc2lvbiBoYXMgYmVlbiBzZXQuXHJcblx0ICovXHJcblx0YXN5bmMgc2V0U2Vzc2lvbiggc2Vzc2lvbiApIHtcclxuXHJcblx0XHRjb25zdCByZW5kZXJlciA9IHRoaXMuX3JlbmRlcmVyO1xyXG5cdFx0Y29uc3QgYmFja2VuZCA9IHJlbmRlcmVyLmJhY2tlbmQ7XHJcblxyXG5cdFx0dGhpcy5fZ2wgPSByZW5kZXJlci5nZXRDb250ZXh0KCk7XHJcblx0XHRjb25zdCBnbCA9IHRoaXMuX2dsO1xyXG5cdFx0Y29uc3QgYXR0cmlidXRlcyA9IGdsLmdldENvbnRleHRBdHRyaWJ1dGVzKCk7XHJcblxyXG5cdFx0dGhpcy5fc2Vzc2lvbiA9IHNlc3Npb247XHJcblxyXG5cdFx0aWYgKCBzZXNzaW9uICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0aWYgKCBiYWNrZW5kLmlzV2ViR1BVQmFja2VuZCA9PT0gdHJ1ZSApIHRocm93IG5ldyBFcnJvciggJ1RIUkVFLlhSTWFuYWdlcjogWFIgaXMgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgd2l0aCBhIFdlYkdQVSBiYWNrZW5kLiBVc2UgV2ViR0wgYnkgcGFzc2luZyBcInsgZm9yY2VXZWJHTDogdHJ1ZSB9XCIgdG8gdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSByZW5kZXJlci4nICk7XHJcblxyXG5cdFx0XHRzZXNzaW9uLmFkZEV2ZW50TGlzdGVuZXIoICdzZWxlY3QnLCB0aGlzLl9vblNlc3Npb25FdmVudCApO1xyXG5cdFx0XHRzZXNzaW9uLmFkZEV2ZW50TGlzdGVuZXIoICdzZWxlY3RzdGFydCcsIHRoaXMuX29uU2Vzc2lvbkV2ZW50ICk7XHJcblx0XHRcdHNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lciggJ3NlbGVjdGVuZCcsIHRoaXMuX29uU2Vzc2lvbkV2ZW50ICk7XHJcblx0XHRcdHNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lciggJ3NxdWVlemUnLCB0aGlzLl9vblNlc3Npb25FdmVudCApO1xyXG5cdFx0XHRzZXNzaW9uLmFkZEV2ZW50TGlzdGVuZXIoICdzcXVlZXplc3RhcnQnLCB0aGlzLl9vblNlc3Npb25FdmVudCApO1xyXG5cdFx0XHRzZXNzaW9uLmFkZEV2ZW50TGlzdGVuZXIoICdzcXVlZXplZW5kJywgdGhpcy5fb25TZXNzaW9uRXZlbnQgKTtcclxuXHRcdFx0c2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCAnZW5kJywgdGhpcy5fb25TZXNzaW9uRW5kICk7XHJcblx0XHRcdHNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lciggJ2lucHV0c291cmNlc2NoYW5nZScsIHRoaXMuX29uSW5wdXRTb3VyY2VzQ2hhbmdlICk7XHJcblxyXG5cdFx0XHRhd2FpdCBiYWNrZW5kLm1ha2VYUkNvbXBhdGlibGUoKTtcclxuXHJcblx0XHRcdHRoaXMuX2N1cnJlbnRQaXhlbFJhdGlvID0gcmVuZGVyZXIuZ2V0UGl4ZWxSYXRpbygpO1xyXG5cdFx0XHRyZW5kZXJlci5nZXRTaXplKCB0aGlzLl9jdXJyZW50U2l6ZSApO1xyXG5cclxuXHRcdFx0dGhpcy5fY3VycmVudEFuaW1hdGlvbkNvbnRleHQgPSByZW5kZXJlci5fYW5pbWF0aW9uLmdldENvbnRleHQoKTtcclxuXHRcdFx0dGhpcy5fY3VycmVudEFuaW1hdGlvbkxvb3AgPSByZW5kZXJlci5fYW5pbWF0aW9uLmdldEFuaW1hdGlvbkxvb3AoKTtcclxuXHRcdFx0cmVuZGVyZXIuX2FuaW1hdGlvbi5zdG9wKCk7XHJcblxyXG5cdFx0XHQvL1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLl91c2VMYXllcnMgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdC8vIGRlZmF1bHQgcGF0aCB1c2luZyBYUldlYkdMQmluZGluZy9YUlByb2plY3Rpb25MYXllclxyXG5cclxuXHRcdFx0XHRsZXQgZGVwdGhGb3JtYXQgPSBudWxsO1xyXG5cdFx0XHRcdGxldCBkZXB0aFR5cGUgPSBudWxsO1xyXG5cdFx0XHRcdGxldCBnbERlcHRoRm9ybWF0ID0gbnVsbDtcclxuXHJcblx0XHRcdFx0aWYgKCByZW5kZXJlci5kZXB0aCApIHtcclxuXHJcblx0XHRcdFx0XHRnbERlcHRoRm9ybWF0ID0gcmVuZGVyZXIuc3RlbmNpbCA/IGdsLkRFUFRIMjRfU1RFTkNJTDggOiBnbC5ERVBUSF9DT01QT05FTlQyNDtcclxuXHRcdFx0XHRcdGRlcHRoRm9ybWF0ID0gcmVuZGVyZXIuc3RlbmNpbCA/IERlcHRoU3RlbmNpbEZvcm1hdCA6IERlcHRoRm9ybWF0O1xyXG5cdFx0XHRcdFx0ZGVwdGhUeXBlID0gcmVuZGVyZXIuc3RlbmNpbCA/IFVuc2lnbmVkSW50MjQ4VHlwZSA6IFVuc2lnbmVkSW50VHlwZTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRjb25zdCBwcm9qZWN0aW9ubGF5ZXJJbml0ID0ge1xyXG5cdFx0XHRcdFx0Y29sb3JGb3JtYXQ6IGdsLlJHQkE4LFxyXG5cdFx0XHRcdFx0ZGVwdGhGb3JtYXQ6IGdsRGVwdGhGb3JtYXQsXHJcblx0XHRcdFx0XHRzY2FsZUZhY3RvcjogdGhpcy5fZnJhbWVidWZmZXJTY2FsZUZhY3RvclxyXG5cdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdGNvbnN0IGdsQmluZGluZyA9IG5ldyBYUldlYkdMQmluZGluZyggc2Vzc2lvbiwgZ2wgKTtcclxuXHRcdFx0XHRjb25zdCBnbFByb2pMYXllciA9IGdsQmluZGluZy5jcmVhdGVQcm9qZWN0aW9uTGF5ZXIoIHByb2plY3Rpb25sYXllckluaXQgKTtcclxuXHRcdFx0XHRjb25zdCBsYXllcnNBcnJheSA9IFsgZ2xQcm9qTGF5ZXIgXTtcclxuXHJcblx0XHRcdFx0dGhpcy5fZ2xCaW5kaW5nID0gZ2xCaW5kaW5nO1xyXG5cdFx0XHRcdHRoaXMuX2dsUHJvakxheWVyID0gZ2xQcm9qTGF5ZXI7XHJcblxyXG5cdFx0XHRcdHJlbmRlcmVyLnNldFBpeGVsUmF0aW8oIDEgKTtcclxuXHRcdFx0XHRyZW5kZXJlci5zZXRTaXplKCBnbFByb2pMYXllci50ZXh0dXJlV2lkdGgsIGdsUHJvakxheWVyLnRleHR1cmVIZWlnaHQsIGZhbHNlICk7XHJcblxyXG5cdFx0XHRcdHRoaXMuX3hyUmVuZGVyVGFyZ2V0ID0gbmV3IFhSUmVuZGVyVGFyZ2V0KFxyXG5cdFx0XHRcdFx0Z2xQcm9qTGF5ZXIudGV4dHVyZVdpZHRoLFxyXG5cdFx0XHRcdFx0Z2xQcm9qTGF5ZXIudGV4dHVyZUhlaWdodCxcclxuXHRcdFx0XHRcdHtcclxuXHRcdFx0XHRcdFx0Zm9ybWF0OiBSR0JBRm9ybWF0LFxyXG5cdFx0XHRcdFx0XHR0eXBlOiBVbnNpZ25lZEJ5dGVUeXBlLFxyXG5cdFx0XHRcdFx0XHRjb2xvclNwYWNlOiByZW5kZXJlci5vdXRwdXRDb2xvclNwYWNlLFxyXG5cdFx0XHRcdFx0XHRkZXB0aFRleHR1cmU6IG5ldyBEZXB0aFRleHR1cmUoIGdsUHJvakxheWVyLnRleHR1cmVXaWR0aCwgZ2xQcm9qTGF5ZXIudGV4dHVyZUhlaWdodCwgZGVwdGhUeXBlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBkZXB0aEZvcm1hdCApLFxyXG5cdFx0XHRcdFx0XHRzdGVuY2lsQnVmZmVyOiByZW5kZXJlci5zdGVuY2lsLFxyXG5cdFx0XHRcdFx0XHRzYW1wbGVzOiBhdHRyaWJ1dGVzLmFudGlhbGlhcyA/IDQgOiAwLFxyXG5cdFx0XHRcdFx0XHRyZXNvbHZlRGVwdGhCdWZmZXI6ICggZ2xQcm9qTGF5ZXIuaWdub3JlRGVwdGhWYWx1ZXMgPT09IGZhbHNlICksXHJcblx0XHRcdFx0XHRcdHJlc29sdmVTdGVuY2lsQnVmZmVyOiAoIGdsUHJvakxheWVyLmlnbm9yZURlcHRoVmFsdWVzID09PSBmYWxzZSApLFxyXG5cdFx0XHRcdFx0fSApO1xyXG5cclxuXHRcdFx0XHR0aGlzLl94clJlbmRlclRhcmdldC5oYXNFeHRlcm5hbFRleHR1cmVzID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0dGhpcy5fcmVmZXJlbmNlU3BhY2UgPSBhd2FpdCBzZXNzaW9uLnJlcXVlc3RSZWZlcmVuY2VTcGFjZSggdGhpcy5nZXRSZWZlcmVuY2VTcGFjZVR5cGUoKSApO1xyXG5cclxuXHRcdFx0XHR0aGlzLl9zdXBwb3J0c0xheWVycyA9IHNlc3Npb24uZW5hYmxlZEZlYXR1cmVzLmluY2x1ZGVzKCAnbGF5ZXJzJyApO1xyXG5cclxuXHRcdFx0XHRpZiAoIHRoaXMuX3N1cHBvcnRzTGF5ZXJzICkge1xyXG5cclxuXHRcdFx0XHRcdC8vIHN3aXRjaCBsYXllcnMgdG8gbmF0aXZlXHJcblx0XHRcdFx0XHRmb3IgKCBjb25zdCBsYXllciBvZiB0aGlzLl9sYXllcnMgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBjaGFuZ2UgbWF0ZXJpYWwgc28gaXQgXCJwdW5jaGVzXCIgb3V0IGEgaG9sZSB0byBzaG93IHRoZSBYUiBMYXllci5cclxuXHRcdFx0XHRcdFx0bGF5ZXIucGxhbmUubWF0ZXJpYWwgPSBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IDB4ZmZmZmZmLCBzaWRlOiBsYXllci50eXBlID09PSAnY3lsaW5kZXInID8gQmFja1NpZGUgOiBGcm9udFNpZGUgfSApO1xyXG5cdFx0XHRcdFx0XHRsYXllci5wbGFuZS5tYXRlcmlhbC5ibGVuZGluZyA9IEN1c3RvbUJsZW5kaW5nO1xyXG5cdFx0XHRcdFx0XHRsYXllci5wbGFuZS5tYXRlcmlhbC5ibGVuZEVxdWF0aW9uID0gQWRkRXF1YXRpb247XHJcblx0XHRcdFx0XHRcdGxheWVyLnBsYW5lLm1hdGVyaWFsLmJsZW5kU3JjID0gWmVyb0ZhY3RvcjtcclxuXHRcdFx0XHRcdFx0bGF5ZXIucGxhbmUubWF0ZXJpYWwuYmxlbmREc3QgPSBaZXJvRmFjdG9yO1xyXG5cclxuXHRcdFx0XHRcdFx0bGF5ZXIueHJsYXllciA9IHRoaXMuX2NyZWF0ZVhSTGF5ZXIoIGxheWVyICk7XHJcblxyXG5cdFx0XHRcdFx0XHRsYXllcnNBcnJheS51bnNoaWZ0KCBsYXllci54cmxheWVyICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHNlc3Npb24udXBkYXRlUmVuZGVyU3RhdGUoIHsgbGF5ZXJzOiBsYXllcnNBcnJheSB9ICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHQvLyBmYWxsYmFjayB0byBYUldlYkdMTGF5ZXJcclxuXHJcblx0XHRcdFx0Y29uc3QgbGF5ZXJJbml0ID0ge1xyXG5cdFx0XHRcdFx0YW50aWFsaWFzOiByZW5kZXJlci5zYW1wbGVzID4gMCxcclxuXHRcdFx0XHRcdGFscGhhOiB0cnVlLFxyXG5cdFx0XHRcdFx0ZGVwdGg6IHJlbmRlcmVyLmRlcHRoLFxyXG5cdFx0XHRcdFx0c3RlbmNpbDogcmVuZGVyZXIuc3RlbmNpbCxcclxuXHRcdFx0XHRcdGZyYW1lYnVmZmVyU2NhbGVGYWN0b3I6IHRoaXMuZ2V0RnJhbWVidWZmZXJTY2FsZUZhY3RvcigpXHJcblx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0Y29uc3QgZ2xCYXNlTGF5ZXIgPSBuZXcgWFJXZWJHTExheWVyKCBzZXNzaW9uLCBnbCwgbGF5ZXJJbml0ICk7XHJcblx0XHRcdFx0dGhpcy5fZ2xCYXNlTGF5ZXIgPSBnbEJhc2VMYXllcjtcclxuXHJcblx0XHRcdFx0c2Vzc2lvbi51cGRhdGVSZW5kZXJTdGF0ZSggeyBiYXNlTGF5ZXI6IGdsQmFzZUxheWVyIH0gKTtcclxuXHJcblx0XHRcdFx0cmVuZGVyZXIuc2V0UGl4ZWxSYXRpbyggMSApO1xyXG5cdFx0XHRcdHJlbmRlcmVyLnNldFNpemUoIGdsQmFzZUxheWVyLmZyYW1lYnVmZmVyV2lkdGgsIGdsQmFzZUxheWVyLmZyYW1lYnVmZmVySGVpZ2h0LCBmYWxzZSApO1xyXG5cclxuXHRcdFx0XHR0aGlzLl94clJlbmRlclRhcmdldCA9IG5ldyBYUlJlbmRlclRhcmdldChcclxuXHRcdFx0XHRcdGdsQmFzZUxheWVyLmZyYW1lYnVmZmVyV2lkdGgsXHJcblx0XHRcdFx0XHRnbEJhc2VMYXllci5mcmFtZWJ1ZmZlckhlaWdodCxcclxuXHRcdFx0XHRcdHtcclxuXHRcdFx0XHRcdFx0Zm9ybWF0OiBSR0JBRm9ybWF0LFxyXG5cdFx0XHRcdFx0XHR0eXBlOiBVbnNpZ25lZEJ5dGVUeXBlLFxyXG5cdFx0XHRcdFx0XHRjb2xvclNwYWNlOiByZW5kZXJlci5vdXRwdXRDb2xvclNwYWNlLFxyXG5cdFx0XHRcdFx0XHRzdGVuY2lsQnVmZmVyOiByZW5kZXJlci5zdGVuY2lsLFxyXG5cdFx0XHRcdFx0XHRyZXNvbHZlRGVwdGhCdWZmZXI6ICggZ2xCYXNlTGF5ZXIuaWdub3JlRGVwdGhWYWx1ZXMgPT09IGZhbHNlICksXHJcblx0XHRcdFx0XHRcdHJlc29sdmVTdGVuY2lsQnVmZmVyOiAoIGdsQmFzZUxheWVyLmlnbm9yZURlcHRoVmFsdWVzID09PSBmYWxzZSApLFxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdCk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvL1xyXG5cclxuXHRcdFx0dGhpcy5zZXRGb3ZlYXRpb24oIHRoaXMuZ2V0Rm92ZWF0aW9uKCkgKTtcclxuXHJcblx0XHRcdHJlbmRlcmVyLl9hbmltYXRpb24uc2V0QW5pbWF0aW9uTG9vcCggdGhpcy5fb25BbmltYXRpb25GcmFtZSApO1xyXG5cdFx0XHRyZW5kZXJlci5fYW5pbWF0aW9uLnNldENvbnRleHQoIHNlc3Npb24gKTtcclxuXHRcdFx0cmVuZGVyZXIuX2FuaW1hdGlvbi5zdGFydCgpO1xyXG5cclxuXHRcdFx0dGhpcy5pc1ByZXNlbnRpbmcgPSB0cnVlO1xyXG5cclxuXHRcdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdzZXNzaW9uc3RhcnQnIH0gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSByZW5kZXJlciBwZXIgZnJhbWUgYW5kIHVwZGF0ZXMgdGhlIFhSIGNhbWVyYVxyXG5cdCAqIGFuZCBpdCBzdWIgY2FtZXJhcyBiYXNlZCBvbiB0aGUgZ2l2ZW4gY2FtZXJhLiBUaGUgZ2l2ZW4gY2FtZXJhIGlzIHRoZSBcInVzZXJcIlxyXG5cdCAqIGNhbWVyYSBjcmVhdGVkIG9uIGFwcGxpY2F0aW9uIGxldmVsIGFuZCB1c2VkIGZvciBub24tWFIgcmVuZGVyaW5nLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtQZXJzcGVjdGl2ZUNhbWVyYX0gY2FtZXJhIC0gVGhlIGNhbWVyYS5cclxuXHQgKi9cclxuXHR1cGRhdGVDYW1lcmEoIGNhbWVyYSApIHtcclxuXHJcblx0XHRjb25zdCBzZXNzaW9uID0gdGhpcy5fc2Vzc2lvbjtcclxuXHJcblx0XHRpZiAoIHNlc3Npb24gPT09IG51bGwgKSByZXR1cm47XHJcblxyXG5cdFx0Y29uc3QgZGVwdGhOZWFyID0gY2FtZXJhLm5lYXI7XHJcblx0XHRjb25zdCBkZXB0aEZhciA9IGNhbWVyYS5mYXI7XHJcblxyXG5cdFx0Y29uc3QgY2FtZXJhWFIgPSB0aGlzLl9jYW1lcmFYUjtcclxuXHRcdGNvbnN0IGNhbWVyYUwgPSB0aGlzLl9jYW1lcmFMO1xyXG5cdFx0Y29uc3QgY2FtZXJhUiA9IHRoaXMuX2NhbWVyYVI7XHJcblxyXG5cdFx0Y2FtZXJhWFIubmVhciA9IGNhbWVyYVIubmVhciA9IGNhbWVyYUwubmVhciA9IGRlcHRoTmVhcjtcclxuXHRcdGNhbWVyYVhSLmZhciA9IGNhbWVyYVIuZmFyID0gY2FtZXJhTC5mYXIgPSBkZXB0aEZhcjtcclxuXHJcblx0XHRpZiAoIHRoaXMuX2N1cnJlbnREZXB0aE5lYXIgIT09IGNhbWVyYVhSLm5lYXIgfHwgdGhpcy5fY3VycmVudERlcHRoRmFyICE9PSBjYW1lcmFYUi5mYXIgKSB7XHJcblxyXG5cdFx0XHQvLyBOb3RlIHRoYXQgdGhlIG5ldyByZW5kZXJTdGF0ZSB3b24ndCBhcHBseSB1bnRpbCB0aGUgbmV4dCBmcmFtZS4gU2VlICMxODMyMFxyXG5cclxuXHRcdFx0c2Vzc2lvbi51cGRhdGVSZW5kZXJTdGF0ZSgge1xyXG5cdFx0XHRcdGRlcHRoTmVhcjogY2FtZXJhWFIubmVhcixcclxuXHRcdFx0XHRkZXB0aEZhcjogY2FtZXJhWFIuZmFyXHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHRcdHRoaXMuX2N1cnJlbnREZXB0aE5lYXIgPSBjYW1lcmFYUi5uZWFyO1xyXG5cdFx0XHR0aGlzLl9jdXJyZW50RGVwdGhGYXIgPSBjYW1lcmFYUi5mYXI7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNhbWVyYUwubGF5ZXJzLm1hc2sgPSBjYW1lcmEubGF5ZXJzLm1hc2sgfCAwYjAxMDtcclxuXHRcdGNhbWVyYVIubGF5ZXJzLm1hc2sgPSBjYW1lcmEubGF5ZXJzLm1hc2sgfCAwYjEwMDtcclxuXHRcdGNhbWVyYVhSLmxheWVycy5tYXNrID0gY2FtZXJhTC5sYXllcnMubWFzayB8IGNhbWVyYVIubGF5ZXJzLm1hc2s7XHJcblxyXG5cdFx0Y29uc3QgcGFyZW50ID0gY2FtZXJhLnBhcmVudDtcclxuXHRcdGNvbnN0IGNhbWVyYXMgPSBjYW1lcmFYUi5jYW1lcmFzO1xyXG5cclxuXHRcdHVwZGF0ZUNhbWVyYSggY2FtZXJhWFIsIHBhcmVudCApO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGNhbWVyYXMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0dXBkYXRlQ2FtZXJhKCBjYW1lcmFzWyBpIF0sIHBhcmVudCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyB1cGRhdGUgcHJvamVjdGlvbiBtYXRyaXggZm9yIHByb3BlciB2aWV3IGZydXN0dW0gY3VsbGluZ1xyXG5cclxuXHRcdGlmICggY2FtZXJhcy5sZW5ndGggPT09IDIgKSB7XHJcblxyXG5cdFx0XHRzZXRQcm9qZWN0aW9uRnJvbVVuaW9uKCBjYW1lcmFYUiwgY2FtZXJhTCwgY2FtZXJhUiApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHQvLyBhc3N1bWUgc2luZ2xlIGNhbWVyYSBzZXR1cCAoQVIpXHJcblxyXG5cdFx0XHRjYW1lcmFYUi5wcm9qZWN0aW9uTWF0cml4LmNvcHkoIGNhbWVyYUwucHJvamVjdGlvbk1hdHJpeCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyB1cGRhdGUgdXNlciBjYW1lcmEgYW5kIGl0cyBjaGlsZHJlblxyXG5cclxuXHRcdHVwZGF0ZVVzZXJDYW1lcmEoIGNhbWVyYSwgY2FtZXJhWFIsIHBhcmVudCApO1xyXG5cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgV2ViWFIgY29udHJvbGxlciBmb3IgdGhlIGdpdmVuIGNvbnRyb2xsZXIgaW5kZXguXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBjb250cm9sbGVyIGluZGV4LlxyXG5cdCAqIEByZXR1cm4ge1dlYlhSQ29udHJvbGxlcn0gVGhlIFhSIGNvbnRyb2xsZXIuXHJcblx0ICovXHJcblx0X2dldENvbnRyb2xsZXIoIGluZGV4ICkge1xyXG5cclxuXHRcdGxldCBjb250cm9sbGVyID0gdGhpcy5fY29udHJvbGxlcnNbIGluZGV4IF07XHJcblxyXG5cdFx0aWYgKCBjb250cm9sbGVyID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRjb250cm9sbGVyID0gbmV3IFdlYlhSQ29udHJvbGxlcigpO1xyXG5cdFx0XHR0aGlzLl9jb250cm9sbGVyc1sgaW5kZXggXSA9IGNvbnRyb2xsZXI7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBjb250cm9sbGVyO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQXNzdW1lcyAyIGNhbWVyYXMgdGhhdCBhcmUgcGFyYWxsZWwgYW5kIHNoYXJlIGFuIFgtYXhpcywgYW5kIHRoYXRcclxuICogdGhlIGNhbWVyYXMnIHByb2plY3Rpb24gYW5kIHdvcmxkIG1hdHJpY2VzIGhhdmUgYWxyZWFkeSBiZWVuIHNldC5cclxuICogQW5kIHRoYXQgbmVhciBhbmQgZmFyIHBsYW5lcyBhcmUgaWRlbnRpY2FsIGZvciBib3RoIGNhbWVyYXMuXHJcbiAqIFZpc3VhbGl6YXRpb24gb2YgdGhpcyB0ZWNobmlxdWU6IGh0dHBzOi8vY29tcHV0ZXJncmFwaGljcy5zdGFja2V4Y2hhbmdlLmNvbS9hLzQ3NjVcclxuICpcclxuICogQHBhcmFtIHtBcnJheUNhbWVyYX0gY2FtZXJhIC0gVGhlIGNhbWVyYSB0byB1cGRhdGUuXHJcbiAqIEBwYXJhbSB7UGVyc3BlY3RpdmVDYW1lcmF9IGNhbWVyYUwgLSBUaGUgbGVmdCBjYW1lcmEuXHJcbiAqIEBwYXJhbSB7UGVyc3BlY3RpdmVDYW1lcmF9IGNhbWVyYVIgLSBUaGUgcmlnaHQgY2FtZXJhLlxyXG4gKi9cclxuZnVuY3Rpb24gc2V0UHJvamVjdGlvbkZyb21VbmlvbiggY2FtZXJhLCBjYW1lcmFMLCBjYW1lcmFSICkge1xyXG5cclxuXHRfY2FtZXJhTFBvcy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGNhbWVyYUwubWF0cml4V29ybGQgKTtcclxuXHRfY2FtZXJhUlBvcy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGNhbWVyYVIubWF0cml4V29ybGQgKTtcclxuXHJcblx0Y29uc3QgaXBkID0gX2NhbWVyYUxQb3MuZGlzdGFuY2VUbyggX2NhbWVyYVJQb3MgKTtcclxuXHJcblx0Y29uc3QgcHJvakwgPSBjYW1lcmFMLnByb2plY3Rpb25NYXRyaXguZWxlbWVudHM7XHJcblx0Y29uc3QgcHJvalIgPSBjYW1lcmFSLnByb2plY3Rpb25NYXRyaXguZWxlbWVudHM7XHJcblxyXG5cdC8vIFZSIHN5c3RlbXMgd2lsbCBoYXZlIGlkZW50aWNhbCBmYXIgYW5kIG5lYXIgcGxhbmVzLCBhbmRcclxuXHQvLyBtb3N0IGxpa2VseSBpZGVudGljYWwgdG9wIGFuZCBib3R0b20gZnJ1c3R1bSBleHRlbnRzLlxyXG5cdC8vIFVzZSB0aGUgbGVmdCBjYW1lcmEgZm9yIHRoZXNlIHZhbHVlcy5cclxuXHRjb25zdCBuZWFyID0gcHJvakxbIDE0IF0gLyAoIHByb2pMWyAxMCBdIC0gMSApO1xyXG5cdGNvbnN0IGZhciA9IHByb2pMWyAxNCBdIC8gKCBwcm9qTFsgMTAgXSArIDEgKTtcclxuXHRjb25zdCB0b3BGb3YgPSAoIHByb2pMWyA5IF0gKyAxICkgLyBwcm9qTFsgNSBdO1xyXG5cdGNvbnN0IGJvdHRvbUZvdiA9ICggcHJvakxbIDkgXSAtIDEgKSAvIHByb2pMWyA1IF07XHJcblxyXG5cdGNvbnN0IGxlZnRGb3YgPSAoIHByb2pMWyA4IF0gLSAxICkgLyBwcm9qTFsgMCBdO1xyXG5cdGNvbnN0IHJpZ2h0Rm92ID0gKCBwcm9qUlsgOCBdICsgMSApIC8gcHJvalJbIDAgXTtcclxuXHRjb25zdCBsZWZ0ID0gbmVhciAqIGxlZnRGb3Y7XHJcblx0Y29uc3QgcmlnaHQgPSBuZWFyICogcmlnaHRGb3Y7XHJcblxyXG5cdC8vIENhbGN1bGF0ZSB0aGUgbmV3IGNhbWVyYSdzIHBvc2l0aW9uIG9mZnNldCBmcm9tIHRoZVxyXG5cdC8vIGxlZnQgY2FtZXJhLiB4T2Zmc2V0IHNob3VsZCBiZSByb3VnaGx5IGhhbGYgYGlwZGAuXHJcblx0Y29uc3Qgek9mZnNldCA9IGlwZCAvICggLSBsZWZ0Rm92ICsgcmlnaHRGb3YgKTtcclxuXHRjb25zdCB4T2Zmc2V0ID0gek9mZnNldCAqIC0gbGVmdEZvdjtcclxuXHJcblx0Ly8gVE9ETzogQmV0dGVyIHdheSB0byBhcHBseSB0aGlzIG9mZnNldD9cclxuXHRjYW1lcmFMLm1hdHJpeFdvcmxkLmRlY29tcG9zZSggY2FtZXJhLnBvc2l0aW9uLCBjYW1lcmEucXVhdGVybmlvbiwgY2FtZXJhLnNjYWxlICk7XHJcblx0Y2FtZXJhLnRyYW5zbGF0ZVgoIHhPZmZzZXQgKTtcclxuXHRjYW1lcmEudHJhbnNsYXRlWiggek9mZnNldCApO1xyXG5cdGNhbWVyYS5tYXRyaXhXb3JsZC5jb21wb3NlKCBjYW1lcmEucG9zaXRpb24sIGNhbWVyYS5xdWF0ZXJuaW9uLCBjYW1lcmEuc2NhbGUgKTtcclxuXHRjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlLmNvcHkoIGNhbWVyYS5tYXRyaXhXb3JsZCApLmludmVydCgpO1xyXG5cclxuXHQvLyBDaGVjayBpZiB0aGUgcHJvamVjdGlvbiB1c2VzIGFuIGluZmluaXRlIGZhciBwbGFuZS5cclxuXHRpZiAoIHByb2pMWyAxMCBdID09PSAtIDEuMCApIHtcclxuXHJcblx0XHQvLyBVc2UgdGhlIHByb2plY3Rpb24gbWF0cml4IGZyb20gdGhlIGxlZnQgZXllLlxyXG5cdFx0Ly8gVGhlIGNhbWVyYSBvZmZzZXQgaXMgc3VmZmljaWVudCB0byBpbmNsdWRlIHRoZSB2aWV3IHZvbHVtZXNcclxuXHRcdC8vIG9mIGJvdGggZXllcyAoYXNzdW1pbmcgc3ltbWV0cmljIHByb2plY3Rpb25zKS5cclxuXHRcdGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LmNvcHkoIGNhbWVyYUwucHJvamVjdGlvbk1hdHJpeCApO1xyXG5cdFx0Y2FtZXJhLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkoIGNhbWVyYUwucHJvamVjdGlvbk1hdHJpeEludmVyc2UgKTtcclxuXHJcblx0fSBlbHNlIHtcclxuXHJcblx0XHQvLyBGaW5kIHRoZSB1bmlvbiBvZiB0aGUgZnJ1c3R1bSB2YWx1ZXMgb2YgdGhlIGNhbWVyYXMgYW5kIHNjYWxlXHJcblx0XHQvLyB0aGUgdmFsdWVzIHNvIHRoYXQgdGhlIG5lYXIgcGxhbmUncyBwb3NpdGlvbiBkb2VzIG5vdCBjaGFuZ2UgaW4gd29ybGQgc3BhY2UsXHJcblx0XHQvLyBhbHRob3VnaCBtdXN0IG5vdyBiZSByZWxhdGl2ZSB0byB0aGUgbmV3IHVuaW9uIGNhbWVyYS5cclxuXHRcdGNvbnN0IG5lYXIyID0gbmVhciArIHpPZmZzZXQ7XHJcblx0XHRjb25zdCBmYXIyID0gZmFyICsgek9mZnNldDtcclxuXHRcdGNvbnN0IGxlZnQyID0gbGVmdCAtIHhPZmZzZXQ7XHJcblx0XHRjb25zdCByaWdodDIgPSByaWdodCArICggaXBkIC0geE9mZnNldCApO1xyXG5cdFx0Y29uc3QgdG9wMiA9IHRvcEZvdiAqIGZhciAvIGZhcjIgKiBuZWFyMjtcclxuXHRcdGNvbnN0IGJvdHRvbTIgPSBib3R0b21Gb3YgKiBmYXIgLyBmYXIyICogbmVhcjI7XHJcblxyXG5cdFx0Y2FtZXJhLnByb2plY3Rpb25NYXRyaXgubWFrZVBlcnNwZWN0aXZlKCBsZWZ0MiwgcmlnaHQyLCB0b3AyLCBib3R0b20yLCBuZWFyMiwgZmFyMiApO1xyXG5cdFx0Y2FtZXJhLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkoIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4ICkuaW52ZXJ0KCk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBVcGRhdGVzIHRoZSB3b3JsZCBtYXRyaWNlcyBmb3IgdGhlIGdpdmVuIGNhbWVyYSBiYXNlZCBvbiB0aGUgcGFyZW50IDNEIG9iamVjdC5cclxuICpcclxuICogQGlubmVyXHJcbiAqIEBwYXJhbSB7Q2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIHRvIHVwZGF0ZS5cclxuICogQHBhcmFtIHtPYmplY3QzRH0gcGFyZW50IC0gVGhlIHBhcmVudCAzRCBvYmplY3QuXHJcbiAqL1xyXG5mdW5jdGlvbiB1cGRhdGVDYW1lcmEoIGNhbWVyYSwgcGFyZW50ICkge1xyXG5cclxuXHRpZiAoIHBhcmVudCA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRjYW1lcmEubWF0cml4V29ybGQuY29weSggY2FtZXJhLm1hdHJpeCApO1xyXG5cclxuXHR9IGVsc2Uge1xyXG5cclxuXHRcdGNhbWVyYS5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKCBwYXJlbnQubWF0cml4V29ybGQsIGNhbWVyYS5tYXRyaXggKTtcclxuXHJcblx0fVxyXG5cclxuXHRjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlLmNvcHkoIGNhbWVyYS5tYXRyaXhXb3JsZCApLmludmVydCgpO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFVwZGF0ZXMgdGhlIGdpdmVuIGNhbWVyYSB3aXRoIHRoZSB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgWFIgY2FtZXJhIGFuZCBwYXJlbnQgb2JqZWN0LlxyXG4gKlxyXG4gKiBAaW5uZXJcclxuICogQHBhcmFtIHtDYW1lcmF9IGNhbWVyYSAtIFRoZSBjYW1lcmEgdG8gdXBkYXRlLlxyXG4gKiBAcGFyYW0ge0FycmF5Q2FtZXJhfSBjYW1lcmFYUiAtIFRoZSBYUiBjYW1lcmEuXHJcbiAqIEBwYXJhbSB7T2JqZWN0M0R9IHBhcmVudCAtIFRoZSBwYXJlbnQgM0Qgb2JqZWN0LlxyXG4gKi9cclxuZnVuY3Rpb24gdXBkYXRlVXNlckNhbWVyYSggY2FtZXJhLCBjYW1lcmFYUiwgcGFyZW50ICkge1xyXG5cclxuXHRpZiAoIHBhcmVudCA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRjYW1lcmEubWF0cml4LmNvcHkoIGNhbWVyYVhSLm1hdHJpeFdvcmxkICk7XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0Y2FtZXJhLm1hdHJpeC5jb3B5KCBwYXJlbnQubWF0cml4V29ybGQgKTtcclxuXHRcdGNhbWVyYS5tYXRyaXguaW52ZXJ0KCk7XHJcblx0XHRjYW1lcmEubWF0cml4Lm11bHRpcGx5KCBjYW1lcmFYUi5tYXRyaXhXb3JsZCApO1xyXG5cclxuXHR9XHJcblxyXG5cdGNhbWVyYS5tYXRyaXguZGVjb21wb3NlKCBjYW1lcmEucG9zaXRpb24sIGNhbWVyYS5xdWF0ZXJuaW9uLCBjYW1lcmEuc2NhbGUgKTtcclxuXHRjYW1lcmEudXBkYXRlTWF0cml4V29ybGQoIHRydWUgKTtcclxuXHJcblx0Y2FtZXJhLnByb2plY3Rpb25NYXRyaXguY29weSggY2FtZXJhWFIucHJvamVjdGlvbk1hdHJpeCApO1xyXG5cdGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5jb3B5KCBjYW1lcmFYUi5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSApO1xyXG5cclxuXHRpZiAoIGNhbWVyYS5pc1BlcnNwZWN0aXZlQ2FtZXJhICkge1xyXG5cclxuXHRcdGNhbWVyYS5mb3YgPSBSQUQyREVHICogMiAqIE1hdGguYXRhbiggMSAvIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWyA1IF0gKTtcclxuXHRcdGNhbWVyYS56b29tID0gMTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gb25TZXNzaW9uRXZlbnQoIGV2ZW50ICkge1xyXG5cclxuXHRjb25zdCBjb250cm9sbGVySW5kZXggPSB0aGlzLl9jb250cm9sbGVySW5wdXRTb3VyY2VzLmluZGV4T2YoIGV2ZW50LmlucHV0U291cmNlICk7XHJcblxyXG5cdGlmICggY29udHJvbGxlckluZGV4ID09PSAtIDEgKSB7XHJcblxyXG5cdFx0cmV0dXJuO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvbnN0IGNvbnRyb2xsZXIgPSB0aGlzLl9jb250cm9sbGVyc1sgY29udHJvbGxlckluZGV4IF07XHJcblxyXG5cdGlmICggY29udHJvbGxlciAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdGNvbnN0IHJlZmVyZW5jZVNwYWNlID0gdGhpcy5nZXRSZWZlcmVuY2VTcGFjZSgpO1xyXG5cclxuXHRcdGNvbnRyb2xsZXIudXBkYXRlKCBldmVudC5pbnB1dFNvdXJjZSwgZXZlbnQuZnJhbWUsIHJlZmVyZW5jZVNwYWNlICk7XHJcblx0XHRjb250cm9sbGVyLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogZXZlbnQudHlwZSwgZGF0YTogZXZlbnQuaW5wdXRTb3VyY2UgfSApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBvblNlc3Npb25FbmQoKSB7XHJcblxyXG5cdGNvbnN0IHNlc3Npb24gPSB0aGlzLl9zZXNzaW9uO1xyXG5cdGNvbnN0IHJlbmRlcmVyID0gdGhpcy5fcmVuZGVyZXI7XHJcblxyXG5cdHNlc3Npb24ucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3NlbGVjdCcsIHRoaXMuX29uU2Vzc2lvbkV2ZW50ICk7XHJcblx0c2Vzc2lvbi5yZW1vdmVFdmVudExpc3RlbmVyKCAnc2VsZWN0c3RhcnQnLCB0aGlzLl9vblNlc3Npb25FdmVudCApO1xyXG5cdHNlc3Npb24ucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3NlbGVjdGVuZCcsIHRoaXMuX29uU2Vzc2lvbkV2ZW50ICk7XHJcblx0c2Vzc2lvbi5yZW1vdmVFdmVudExpc3RlbmVyKCAnc3F1ZWV6ZScsIHRoaXMuX29uU2Vzc2lvbkV2ZW50ICk7XHJcblx0c2Vzc2lvbi5yZW1vdmVFdmVudExpc3RlbmVyKCAnc3F1ZWV6ZXN0YXJ0JywgdGhpcy5fb25TZXNzaW9uRXZlbnQgKTtcclxuXHRzZXNzaW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdzcXVlZXplZW5kJywgdGhpcy5fb25TZXNzaW9uRXZlbnQgKTtcclxuXHRzZXNzaW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdlbmQnLCB0aGlzLl9vblNlc3Npb25FbmQgKTtcclxuXHRzZXNzaW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdpbnB1dHNvdXJjZXNjaGFuZ2UnLCB0aGlzLl9vbklucHV0U291cmNlc0NoYW5nZSApO1xyXG5cclxuXHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB0aGlzLl9jb250cm9sbGVycy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0Y29uc3QgaW5wdXRTb3VyY2UgPSB0aGlzLl9jb250cm9sbGVySW5wdXRTb3VyY2VzWyBpIF07XHJcblxyXG5cdFx0aWYgKCBpbnB1dFNvdXJjZSA9PT0gbnVsbCApIGNvbnRpbnVlO1xyXG5cclxuXHRcdHRoaXMuX2NvbnRyb2xsZXJJbnB1dFNvdXJjZXNbIGkgXSA9IG51bGw7XHJcblxyXG5cdFx0dGhpcy5fY29udHJvbGxlcnNbIGkgXS5kaXNjb25uZWN0KCBpbnB1dFNvdXJjZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdHRoaXMuX2N1cnJlbnREZXB0aE5lYXIgPSBudWxsO1xyXG5cdHRoaXMuX2N1cnJlbnREZXB0aEZhciA9IG51bGw7XHJcblxyXG5cdC8vIHJlc3RvcmUgZnJhbWVidWZmZXIvcmVuZGVyaW5nIHN0YXRlXHJcblxyXG5cdHJlbmRlcmVyLmJhY2tlbmQuc2V0WFJUYXJnZXQoIG51bGwgKTtcclxuXHRyZW5kZXJlci5zZXRPdXRwdXRSZW5kZXJUYXJnZXQoIG51bGwgKTtcclxuXHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIG51bGwgKTtcclxuXHJcblx0dGhpcy5fc2Vzc2lvbiA9IG51bGw7XHJcblx0dGhpcy5feHJSZW5kZXJUYXJnZXQgPSBudWxsO1xyXG5cclxuXHQvLyBzd2l0Y2ggbGF5ZXJzIGJhY2sgdG8gZW11bGF0ZWRcclxuXHRpZiAoIHRoaXMuX3N1cHBvcnRzTGF5ZXJzID09PSB0cnVlICkge1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IGxheWVyIG9mIHRoaXMuX2xheWVycyApIHtcclxuXHJcblx0XHRcdC8vIFJlY3JlYXRlIGxheWVyIHJlbmRlciB0YXJnZXQgdG8gcmVzZXQgc3RhdGVcclxuXHRcdFx0bGF5ZXIucmVuZGVyVGFyZ2V0ID0gbmV3IFhSUmVuZGVyVGFyZ2V0KFxyXG5cdFx0XHRcdGxheWVyLnBpeGVsd2lkdGgsXHJcblx0XHRcdFx0bGF5ZXIucGl4ZWxoZWlnaHQsXHJcblx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0Zm9ybWF0OiBSR0JBRm9ybWF0LFxyXG5cdFx0XHRcdFx0dHlwZTogVW5zaWduZWRCeXRlVHlwZSxcclxuXHRcdFx0XHRcdGRlcHRoVGV4dHVyZTogbmV3IERlcHRoVGV4dHVyZShcclxuXHRcdFx0XHRcdFx0bGF5ZXIucGl4ZWx3aWR0aCxcclxuXHRcdFx0XHRcdFx0bGF5ZXIucGl4ZWxoZWlnaHQsXHJcblx0XHRcdFx0XHRcdGxheWVyLnN0ZW5jaWxCdWZmZXIgPyBVbnNpZ25lZEludDI0OFR5cGUgOiBVbnNpZ25lZEludFR5cGUsXHJcblx0XHRcdFx0XHRcdHVuZGVmaW5lZCxcclxuXHRcdFx0XHRcdFx0dW5kZWZpbmVkLFxyXG5cdFx0XHRcdFx0XHR1bmRlZmluZWQsXHJcblx0XHRcdFx0XHRcdHVuZGVmaW5lZCxcclxuXHRcdFx0XHRcdFx0dW5kZWZpbmVkLFxyXG5cdFx0XHRcdFx0XHR1bmRlZmluZWQsXHJcblx0XHRcdFx0XHRcdGxheWVyLnN0ZW5jaWxCdWZmZXIgPyBEZXB0aFN0ZW5jaWxGb3JtYXQgOiBEZXB0aEZvcm1hdFxyXG5cdFx0XHRcdFx0KSxcclxuXHRcdFx0XHRcdHN0ZW5jaWxCdWZmZXI6IGxheWVyLnN0ZW5jaWxCdWZmZXIsXHJcblx0XHRcdFx0XHRyZXNvbHZlRGVwdGhCdWZmZXI6IGZhbHNlLFxyXG5cdFx0XHRcdFx0cmVzb2x2ZVN0ZW5jaWxCdWZmZXI6IGZhbHNlXHJcblx0XHRcdFx0fSApO1xyXG5cclxuXHRcdFx0bGF5ZXIucmVuZGVyVGFyZ2V0LmlzWFJSZW5kZXJUYXJnZXQgPSBmYWxzZTtcclxuXHJcblx0XHRcdGxheWVyLnBsYW5lLm1hdGVyaWFsID0gbGF5ZXIubWF0ZXJpYWw7XHJcblx0XHRcdGxheWVyLm1hdGVyaWFsLm1hcCA9IGxheWVyLnJlbmRlclRhcmdldC50ZXh0dXJlO1xyXG5cdFx0XHRkZWxldGUgbGF5ZXIueHJsYXllcjtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0Ly9cclxuXHJcblx0dGhpcy5pc1ByZXNlbnRpbmcgPSBmYWxzZTtcclxuXHJcblx0cmVuZGVyZXIuX2FuaW1hdGlvbi5zdG9wKCk7XHJcblxyXG5cdHJlbmRlcmVyLl9hbmltYXRpb24uc2V0QW5pbWF0aW9uTG9vcCggdGhpcy5fY3VycmVudEFuaW1hdGlvbkxvb3AgKTtcclxuXHRyZW5kZXJlci5fYW5pbWF0aW9uLnNldENvbnRleHQoIHRoaXMuX2N1cnJlbnRBbmltYXRpb25Db250ZXh0ICk7XHJcblx0cmVuZGVyZXIuX2FuaW1hdGlvbi5zdGFydCgpO1xyXG5cclxuXHRyZW5kZXJlci5zZXRQaXhlbFJhdGlvKCB0aGlzLl9jdXJyZW50UGl4ZWxSYXRpbyApO1xyXG5cdHJlbmRlcmVyLnNldFNpemUoIHRoaXMuX2N1cnJlbnRTaXplLndpZHRoLCB0aGlzLl9jdXJyZW50U2l6ZS5oZWlnaHQsIGZhbHNlICk7XHJcblxyXG5cdHRoaXMuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnc2Vzc2lvbmVuZCcgfSApO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gb25JbnB1dFNvdXJjZXNDaGFuZ2UoIGV2ZW50ICkge1xyXG5cclxuXHRjb25zdCBjb250cm9sbGVycyA9IHRoaXMuX2NvbnRyb2xsZXJzO1xyXG5cdGNvbnN0IGNvbnRyb2xsZXJJbnB1dFNvdXJjZXMgPSB0aGlzLl9jb250cm9sbGVySW5wdXRTb3VyY2VzO1xyXG5cclxuXHQvLyBOb3RpZnkgZGlzY29ubmVjdGVkXHJcblxyXG5cdGZvciAoIGxldCBpID0gMDsgaSA8IGV2ZW50LnJlbW92ZWQubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdGNvbnN0IGlucHV0U291cmNlID0gZXZlbnQucmVtb3ZlZFsgaSBdO1xyXG5cdFx0Y29uc3QgaW5kZXggPSBjb250cm9sbGVySW5wdXRTb3VyY2VzLmluZGV4T2YoIGlucHV0U291cmNlICk7XHJcblxyXG5cdFx0aWYgKCBpbmRleCA+PSAwICkge1xyXG5cclxuXHRcdFx0Y29udHJvbGxlcklucHV0U291cmNlc1sgaW5kZXggXSA9IG51bGw7XHJcblx0XHRcdGNvbnRyb2xsZXJzWyBpbmRleCBdLmRpc2Nvbm5lY3QoIGlucHV0U291cmNlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8vIE5vdGlmeSBjb25uZWN0ZWRcclxuXHJcblx0Zm9yICggbGV0IGkgPSAwOyBpIDwgZXZlbnQuYWRkZWQubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdGNvbnN0IGlucHV0U291cmNlID0gZXZlbnQuYWRkZWRbIGkgXTtcclxuXHJcblx0XHRsZXQgY29udHJvbGxlckluZGV4ID0gY29udHJvbGxlcklucHV0U291cmNlcy5pbmRleE9mKCBpbnB1dFNvdXJjZSApO1xyXG5cclxuXHRcdGlmICggY29udHJvbGxlckluZGV4ID09PSAtIDEgKSB7XHJcblxyXG5cdFx0XHQvLyBBc3NpZ24gaW5wdXQgc291cmNlIGEgY29udHJvbGxlciB0aGF0IGN1cnJlbnRseSBoYXMgbm8gaW5wdXQgc291cmNlXHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBjb250cm9sbGVycy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggaSA+PSBjb250cm9sbGVySW5wdXRTb3VyY2VzLmxlbmd0aCApIHtcclxuXHJcblx0XHRcdFx0XHRjb250cm9sbGVySW5wdXRTb3VyY2VzLnB1c2goIGlucHV0U291cmNlICk7XHJcblx0XHRcdFx0XHRjb250cm9sbGVySW5kZXggPSBpO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGNvbnRyb2xsZXJJbnB1dFNvdXJjZXNbIGkgXSA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHRjb250cm9sbGVySW5wdXRTb3VyY2VzWyBpIF0gPSBpbnB1dFNvdXJjZTtcclxuXHRcdFx0XHRcdGNvbnRyb2xsZXJJbmRleCA9IGk7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gSWYgYWxsIGNvbnRyb2xsZXJzIGRvIGN1cnJlbnRseSByZWNlaXZlIGlucHV0IHdlIGlnbm9yZSBuZXcgb25lc1xyXG5cclxuXHRcdFx0aWYgKCBjb250cm9sbGVySW5kZXggPT09IC0gMSApIGJyZWFrO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBjb250cm9sbGVyID0gY29udHJvbGxlcnNbIGNvbnRyb2xsZXJJbmRleCBdO1xyXG5cclxuXHRcdGlmICggY29udHJvbGxlciApIHtcclxuXHJcblx0XHRcdGNvbnRyb2xsZXIuY29ubmVjdCggaW5wdXRTb3VyY2UgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8vIENyZWF0aW9uIG1ldGhvZCBmb3IgbmF0aXZlIFdlYlhSIGxheWVyc1xyXG5mdW5jdGlvbiBjcmVhdGVYUkxheWVyKCBsYXllciApIHtcclxuXHJcblx0aWYgKCBsYXllci50eXBlID09PSAncXVhZCcgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX2dsQmluZGluZy5jcmVhdGVRdWFkTGF5ZXIoIHtcclxuXHRcdFx0dHJhbnNmb3JtOiBuZXcgWFJSaWdpZFRyYW5zZm9ybSggbGF5ZXIudHJhbnNsYXRpb24sIGxheWVyLnF1YXRlcm5pb24gKSxcclxuXHRcdFx0ZGVwdGhGb3JtYXQ6IHRoaXMuX2dsLkRFUFRIX0NPTVBPTkVOVCxcclxuXHRcdFx0d2lkdGg6IGxheWVyLndpZHRoIC8gMixcclxuXHRcdFx0aGVpZ2h0OiBsYXllci5oZWlnaHQgLyAyLFxyXG5cdFx0XHRzcGFjZTogdGhpcy5fcmVmZXJlbmNlU3BhY2UsXHJcblx0XHRcdHZpZXdQaXhlbFdpZHRoOiBsYXllci5waXhlbHdpZHRoLFxyXG5cdFx0XHR2aWV3UGl4ZWxIZWlnaHQ6IGxheWVyLnBpeGVsaGVpZ2h0XHJcblx0XHR9ICk7XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX2dsQmluZGluZy5jcmVhdGVDeWxpbmRlckxheWVyKCB7XHJcblx0XHRcdHRyYW5zZm9ybTogbmV3IFhSUmlnaWRUcmFuc2Zvcm0oIGxheWVyLnRyYW5zbGF0aW9uLCBsYXllci5xdWF0ZXJuaW9uICksXHJcblx0XHRcdGRlcHRoRm9ybWF0OiB0aGlzLl9nbC5ERVBUSF9DT01QT05FTlQsXHJcblx0XHRcdHJhZGl1czogbGF5ZXIucmFkaXVzLFxyXG5cdFx0XHRjZW50cmFsQW5nbGU6IGxheWVyLmNlbnRyYWxBbmdsZSxcclxuXHRcdFx0YXNwZWN0UmF0aW86IGxheWVyLmFzcGVjdFJhdGlvLFxyXG5cdFx0XHRzcGFjZTogdGhpcy5fcmVmZXJlbmNlU3BhY2UsXHJcblx0XHRcdHZpZXdQaXhlbFdpZHRoOiBsYXllci5waXhlbHdpZHRoLFxyXG5cdFx0XHR2aWV3UGl4ZWxIZWlnaHQ6IGxheWVyLnBpeGVsaGVpZ2h0XHJcblx0XHR9ICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8vIEFuaW1hdGlvbiBMb29wXHJcblxyXG5mdW5jdGlvbiBvbkFuaW1hdGlvbkZyYW1lKCB0aW1lLCBmcmFtZSApIHtcclxuXHJcblx0aWYgKCBmcmFtZSA9PT0gdW5kZWZpbmVkICkgcmV0dXJuO1xyXG5cclxuXHRjb25zdCBjYW1lcmFYUiA9IHRoaXMuX2NhbWVyYVhSO1xyXG5cdGNvbnN0IHJlbmRlcmVyID0gdGhpcy5fcmVuZGVyZXI7XHJcblx0Y29uc3QgYmFja2VuZCA9IHJlbmRlcmVyLmJhY2tlbmQ7XHJcblxyXG5cdGNvbnN0IGdsQmFzZUxheWVyID0gdGhpcy5fZ2xCYXNlTGF5ZXI7XHJcblxyXG5cdGNvbnN0IHJlZmVyZW5jZVNwYWNlID0gdGhpcy5nZXRSZWZlcmVuY2VTcGFjZSgpO1xyXG5cdGNvbnN0IHBvc2UgPSBmcmFtZS5nZXRWaWV3ZXJQb3NlKCByZWZlcmVuY2VTcGFjZSApO1xyXG5cclxuXHR0aGlzLl94ckZyYW1lID0gZnJhbWU7XHJcblxyXG5cdGlmICggcG9zZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRjb25zdCB2aWV3cyA9IHBvc2Uudmlld3M7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9nbEJhc2VMYXllciAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGJhY2tlbmQuc2V0WFJUYXJnZXQoIGdsQmFzZUxheWVyLmZyYW1lYnVmZmVyICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGxldCBjYW1lcmFYUk5lZWRzVXBkYXRlID0gZmFsc2U7XHJcblxyXG5cdFx0Ly8gY2hlY2sgaWYgaXQncyBuZWNlc3NhcnkgdG8gcmVidWlsZCBjYW1lcmFYUidzIGNhbWVyYSBsaXN0XHJcblxyXG5cdFx0aWYgKCB2aWV3cy5sZW5ndGggIT09IGNhbWVyYVhSLmNhbWVyYXMubGVuZ3RoICkge1xyXG5cclxuXHRcdFx0Y2FtZXJhWFIuY2FtZXJhcy5sZW5ndGggPSAwO1xyXG5cdFx0XHRjYW1lcmFYUk5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdmlld3MubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdmlldyA9IHZpZXdzWyBpIF07XHJcblxyXG5cdFx0XHRsZXQgdmlld3BvcnQ7XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMuX3VzZUxheWVycyA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgZ2xTdWJJbWFnZSA9IHRoaXMuX2dsQmluZGluZy5nZXRWaWV3U3ViSW1hZ2UoIHRoaXMuX2dsUHJvakxheWVyLCB2aWV3ICk7XHJcblx0XHRcdFx0dmlld3BvcnQgPSBnbFN1YkltYWdlLnZpZXdwb3J0O1xyXG5cclxuXHRcdFx0XHQvLyBGb3Igc2lkZS1ieS1zaWRlIHByb2plY3Rpb24sIHdlIG9ubHkgcHJvZHVjZSBhIHNpbmdsZSB0ZXh0dXJlIGZvciBib3RoIGV5ZXMuXHJcblx0XHRcdFx0aWYgKCBpID09PSAwICkge1xyXG5cclxuXHRcdFx0XHRcdGJhY2tlbmQuc2V0WFJSZW5kZXJUYXJnZXRUZXh0dXJlcyhcclxuXHRcdFx0XHRcdFx0dGhpcy5feHJSZW5kZXJUYXJnZXQsXHJcblx0XHRcdFx0XHRcdGdsU3ViSW1hZ2UuY29sb3JUZXh0dXJlLFxyXG5cdFx0XHRcdFx0XHR0aGlzLl9nbFByb2pMYXllci5pZ25vcmVEZXB0aFZhbHVlcyA/IHVuZGVmaW5lZCA6IGdsU3ViSW1hZ2UuZGVwdGhTdGVuY2lsVGV4dHVyZVxyXG5cdFx0XHRcdFx0KTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0dmlld3BvcnQgPSBnbEJhc2VMYXllci5nZXRWaWV3cG9ydCggdmlldyApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0bGV0IGNhbWVyYSA9IHRoaXMuX2NhbWVyYXNbIGkgXTtcclxuXHJcblx0XHRcdGlmICggY2FtZXJhID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGNhbWVyYSA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSgpO1xyXG5cdFx0XHRcdGNhbWVyYS5sYXllcnMuZW5hYmxlKCBpICk7XHJcblx0XHRcdFx0Y2FtZXJhLnZpZXdwb3J0ID0gbmV3IFZlY3RvcjQoKTtcclxuXHRcdFx0XHR0aGlzLl9jYW1lcmFzWyBpIF0gPSBjYW1lcmE7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjYW1lcmEubWF0cml4LmZyb21BcnJheSggdmlldy50cmFuc2Zvcm0ubWF0cml4ICk7XHJcblx0XHRcdGNhbWVyYS5tYXRyaXguZGVjb21wb3NlKCBjYW1lcmEucG9zaXRpb24sIGNhbWVyYS5xdWF0ZXJuaW9uLCBjYW1lcmEuc2NhbGUgKTtcclxuXHRcdFx0Y2FtZXJhLnByb2plY3Rpb25NYXRyaXguZnJvbUFycmF5KCB2aWV3LnByb2plY3Rpb25NYXRyaXggKTtcclxuXHRcdFx0Y2FtZXJhLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkoIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4ICkuaW52ZXJ0KCk7XHJcblx0XHRcdGNhbWVyYS52aWV3cG9ydC5zZXQoIHZpZXdwb3J0LngsIHZpZXdwb3J0LnksIHZpZXdwb3J0LndpZHRoLCB2aWV3cG9ydC5oZWlnaHQgKTtcclxuXHJcblx0XHRcdGlmICggaSA9PT0gMCApIHtcclxuXHJcblx0XHRcdFx0Y2FtZXJhWFIubWF0cml4LmNvcHkoIGNhbWVyYS5tYXRyaXggKTtcclxuXHRcdFx0XHRjYW1lcmFYUi5tYXRyaXguZGVjb21wb3NlKCBjYW1lcmFYUi5wb3NpdGlvbiwgY2FtZXJhWFIucXVhdGVybmlvbiwgY2FtZXJhWFIuc2NhbGUgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggY2FtZXJhWFJOZWVkc1VwZGF0ZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0Y2FtZXJhWFIuY2FtZXJhcy5wdXNoKCBjYW1lcmEgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmVuZGVyZXIuc2V0T3V0cHV0UmVuZGVyVGFyZ2V0KCB0aGlzLl94clJlbmRlclRhcmdldCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vXHJcblxyXG5cdGZvciAoIGxldCBpID0gMDsgaSA8IHRoaXMuX2NvbnRyb2xsZXJzLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRjb25zdCBpbnB1dFNvdXJjZSA9IHRoaXMuX2NvbnRyb2xsZXJJbnB1dFNvdXJjZXNbIGkgXTtcclxuXHRcdGNvbnN0IGNvbnRyb2xsZXIgPSB0aGlzLl9jb250cm9sbGVyc1sgaSBdO1xyXG5cclxuXHRcdGlmICggaW5wdXRTb3VyY2UgIT09IG51bGwgJiYgY29udHJvbGxlciAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Y29udHJvbGxlci51cGRhdGUoIGlucHV0U291cmNlLCBmcmFtZSwgcmVmZXJlbmNlU3BhY2UgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0aWYgKCB0aGlzLl9jdXJyZW50QW5pbWF0aW9uTG9vcCApIHRoaXMuX2N1cnJlbnRBbmltYXRpb25Mb29wKCB0aW1lLCBmcmFtZSApO1xyXG5cclxuXHRpZiAoIGZyYW1lLmRldGVjdGVkUGxhbmVzICkge1xyXG5cclxuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAncGxhbmVzZGV0ZWN0ZWQnLCBkYXRhOiBmcmFtZSB9ICk7XHJcblxyXG5cdH1cclxuXHJcblx0dGhpcy5feHJGcmFtZSA9IG51bGw7XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBYUk1hbmFnZXI7XHJcbiIsImltcG9ydCBBbmltYXRpb24gZnJvbSAnLi9BbmltYXRpb24uanMnO1xyXG5pbXBvcnQgUmVuZGVyT2JqZWN0cyBmcm9tICcuL1JlbmRlck9iamVjdHMuanMnO1xyXG5pbXBvcnQgQXR0cmlidXRlcyBmcm9tICcuL0F0dHJpYnV0ZXMuanMnO1xyXG5pbXBvcnQgR2VvbWV0cmllcyBmcm9tICcuL0dlb21ldHJpZXMuanMnO1xyXG5pbXBvcnQgSW5mbyBmcm9tICcuL0luZm8uanMnO1xyXG5pbXBvcnQgUGlwZWxpbmVzIGZyb20gJy4vUGlwZWxpbmVzLmpzJztcclxuaW1wb3J0IEJpbmRpbmdzIGZyb20gJy4vQmluZGluZ3MuanMnO1xyXG5pbXBvcnQgUmVuZGVyTGlzdHMgZnJvbSAnLi9SZW5kZXJMaXN0cy5qcyc7XHJcbmltcG9ydCBSZW5kZXJDb250ZXh0cyBmcm9tICcuL1JlbmRlckNvbnRleHRzLmpzJztcclxuaW1wb3J0IFRleHR1cmVzIGZyb20gJy4vVGV4dHVyZXMuanMnO1xyXG5pbXBvcnQgQmFja2dyb3VuZCBmcm9tICcuL0JhY2tncm91bmQuanMnO1xyXG5pbXBvcnQgTm9kZXMgZnJvbSAnLi9ub2Rlcy9Ob2Rlcy5qcyc7XHJcbmltcG9ydCBDb2xvcjQgZnJvbSAnLi9Db2xvcjQuanMnO1xyXG5pbXBvcnQgQ2xpcHBpbmdDb250ZXh0IGZyb20gJy4vQ2xpcHBpbmdDb250ZXh0LmpzJztcclxuaW1wb3J0IFF1YWRNZXNoIGZyb20gJy4vUXVhZE1lc2guanMnO1xyXG5pbXBvcnQgUmVuZGVyQnVuZGxlcyBmcm9tICcuL1JlbmRlckJ1bmRsZXMuanMnO1xyXG5pbXBvcnQgTm9kZUxpYnJhcnkgZnJvbSAnLi9ub2Rlcy9Ob2RlTGlicmFyeS5qcyc7XHJcbmltcG9ydCBMaWdodGluZyBmcm9tICcuL0xpZ2h0aW5nLmpzJztcclxuaW1wb3J0IFhSTWFuYWdlciBmcm9tICcuL1hSTWFuYWdlci5qcyc7XHJcblxyXG5pbXBvcnQgTm9kZU1hdGVyaWFsIGZyb20gJy4uLy4uL21hdGVyaWFscy9ub2Rlcy9Ob2RlTWF0ZXJpYWwuanMnO1xyXG5cclxuaW1wb3J0IHsgU2NlbmUgfSBmcm9tICcuLi8uLi9zY2VuZXMvU2NlbmUuanMnO1xyXG5pbXBvcnQgeyBGcnVzdHVtIH0gZnJvbSAnLi4vLi4vbWF0aC9GcnVzdHVtLmpzJztcclxuaW1wb3J0IHsgTWF0cml4NCB9IGZyb20gJy4uLy4uL21hdGgvTWF0cml4NC5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjIuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3I0IH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3I0LmpzJztcclxuaW1wb3J0IHsgUmVuZGVyVGFyZ2V0IH0gZnJvbSAnLi4vLi4vY29yZS9SZW5kZXJUYXJnZXQuanMnO1xyXG5pbXBvcnQgeyBEb3VibGVTaWRlLCBCYWNrU2lkZSwgRnJvbnRTaWRlLCBTUkdCQ29sb3JTcGFjZSwgTm9Ub25lTWFwcGluZywgTGluZWFyRmlsdGVyLCBMaW5lYXJTUkdCQ29sb3JTcGFjZSwgSGFsZkZsb2F0VHlwZSwgUkdCQUZvcm1hdCwgUENGU2hhZG93TWFwIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzLmpzJztcclxuXHJcbmNvbnN0IF9zY2VuZSA9IC8qQF9fUFVSRV9fKi8gbmV3IFNjZW5lKCk7XHJcbmNvbnN0IF9kcmF3aW5nQnVmZmVyU2l6ZSA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjIoKTtcclxuY29uc3QgX3NjcmVlbiA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjQoKTtcclxuY29uc3QgX2ZydXN0dW0gPSAvKkBfX1BVUkVfXyovIG5ldyBGcnVzdHVtKCk7XHJcbmNvbnN0IF9wcm9qU2NyZWVuTWF0cml4ID0gLypAX19QVVJFX18qLyBuZXcgTWF0cml4NCgpO1xyXG5jb25zdCBfdmVjdG9yNCA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjQoKTtcclxuXHJcbi8qKlxyXG4gKiBCYXNlIGNsYXNzIGZvciByZW5kZXJlcnMuXHJcbiAqL1xyXG5jbGFzcyBSZW5kZXJlciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbmRlcmVyIG9wdGlvbnMuXHJcblx0ICpcclxuXHQgKiBAdHlwZWRlZiB7T2JqZWN0fSBSZW5kZXJlcn5PcHRpb25zXHJcblx0ICogQHByb3BlcnR5IHtib29sZWFufSBbbG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcj1mYWxzZV0gLSBXaGV0aGVyIGxvZ2FyaXRobWljIGRlcHRoIGJ1ZmZlciBpcyBlbmFibGVkIG9yIG5vdC5cclxuXHQgKiBAcHJvcGVydHkge2Jvb2xlYW59IFthbHBoYT10cnVlXSAtIFdoZXRoZXIgdGhlIGRlZmF1bHQgZnJhbWVidWZmZXIgKHdoaWNoIHJlcHJlc2VudHMgdGhlIGZpbmFsIGNvbnRlbnRzIG9mIHRoZSBjYW52YXMpIHNob3VsZCBiZSB0cmFuc3BhcmVudCBvciBvcGFxdWUuXHJcblx0ICogQHByb3BlcnR5IHtib29sZWFufSBbZGVwdGg9dHJ1ZV0gLSBXaGV0aGVyIHRoZSBkZWZhdWx0IGZyYW1lYnVmZmVyIHNob3VsZCBoYXZlIGEgZGVwdGggYnVmZmVyIG9yIG5vdC5cclxuXHQgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtzdGVuY2lsPWZhbHNlXSAtIFdoZXRoZXIgdGhlIGRlZmF1bHQgZnJhbWVidWZmZXIgc2hvdWxkIGhhdmUgYSBzdGVuY2lsIGJ1ZmZlciBvciBub3QuXHJcblx0ICogQHByb3BlcnR5IHtib29sZWFufSBbYW50aWFsaWFzPWZhbHNlXSAtIFdoZXRoZXIgTVNBQSBhcyB0aGUgZGVmYXVsdCBhbnRpLWFsaWFzaW5nIHNob3VsZCBiZSBlbmFibGVkIG9yIG5vdC5cclxuXHQgKiBAcHJvcGVydHkge251bWJlcn0gW3NhbXBsZXM9MF0gLSBXaGVuIGBhbnRpYWxpYXNgIGlzIGB0cnVlYCwgYDRgIHNhbXBsZXMgYXJlIHVzZWQgYnkgZGVmYXVsdC4gVGhpcyBwYXJhbWV0ZXIgY2FuIHNldCB0byBhbnkgb3RoZXIgaW50ZWdlciB2YWx1ZSB0aGFuIDBcclxuXHQgKiB0byBvdmVyd3JpdGUgdGhlIGRlZmF1bHQuXHJcblx0ICogQHByb3BlcnR5IHs/RnVuY3Rpb259IFtnZXRGYWxsYmFjaz1udWxsXSAtIFRoaXMgY2FsbGJhY2sgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBhIGZhbGxiYWNrIGJhY2tlbmQsIGlmIHRoZSBwcmltYXJ5IGJhY2tlbmQgY2FuJ3QgYmUgdGFyZ2V0ZWQuXHJcblx0ICogQHByb3BlcnR5IHtudW1iZXJ9IFtjb2xvckJ1ZmZlclR5cGU9SGFsZkZsb2F0VHlwZV0gLSBEZWZpbmVzIHRoZSB0eXBlIG9mIGNvbG9yIGJ1ZmZlcnMuIFRoZSBkZWZhdWx0IGBIYWxmRmxvYXRUeXBlYCBpcyByZWNvbW1lbmQgZm9yIGJlc3RcclxuXHQgKiBxdWFsaXR5LiBUbyBzYXZlIG1lbW9yeSBhbmQgYmFuZHdpZHRoLCBgVW5zaWduZWRCeXRlVHlwZWAgbWlnaHQgYmUgdXNlZC4gVGhpcyB3aWxsIHJlZHVjZSByZW5kZXJpbmcgcXVhbGl0eSB0aG91Z2guXHJcblx0ICovXHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcmVuZGVyZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0JhY2tlbmR9IGJhY2tlbmQgLSBUaGUgYmFja2VuZCB0aGUgcmVuZGVyZXIgaXMgdGFyZ2V0aW5nIChlLmcuIFdlYkdQVSBvciBXZWJHTCAyKS5cclxuXHQgKiBAcGFyYW0ge1JlbmRlcmVyfk9wdGlvbnN9IFtwYXJhbWV0ZXJzXSAtIFRoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlci5cclxuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGJhY2tlbmQsIHBhcmFtZXRlcnMgPSB7fSApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNSZW5kZXJlciA9IHRydWU7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCB7XHJcblx0XHRcdGxvZ2FyaXRobWljRGVwdGhCdWZmZXIgPSBmYWxzZSxcclxuXHRcdFx0YWxwaGEgPSB0cnVlLFxyXG5cdFx0XHRkZXB0aCA9IHRydWUsXHJcblx0XHRcdHN0ZW5jaWwgPSBmYWxzZSxcclxuXHRcdFx0YW50aWFsaWFzID0gZmFsc2UsXHJcblx0XHRcdHNhbXBsZXMgPSAwLFxyXG5cdFx0XHRnZXRGYWxsYmFjayA9IG51bGwsXHJcblx0XHRcdGNvbG9yQnVmZmVyVHlwZSA9IEhhbGZGbG9hdFR5cGVcclxuXHRcdH0gPSBwYXJhbWV0ZXJzO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIGNhbnZhcyBlbGVtZW50IHRoZSByZW5kZXJlciBpcyBkcmF3aW5nIHRvLlxyXG5cdFx0ICogVGhpcyB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5IHdpbGwgYXV0b21hdGljYWxseSBiZSBjcmVhdGVkIGJ5XHJcblx0XHQgKiB0aGUgcmVuZGVyZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0hUTUxDYW52YXNFbGVtZW50fE9mZnNjcmVlbkNhbnZhc31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kb21FbGVtZW50ID0gYmFja2VuZC5nZXREb21FbGVtZW50KCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBiYWNrZW5kLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtCYWNrZW5kfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJhY2tlbmQgPSBiYWNrZW5kO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG51bWJlciBvZiBNU0FBIHNhbXBsZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zYW1wbGVzID0gc2FtcGxlcyB8fCAoIGFudGlhbGlhcyA9PT0gdHJ1ZSApID8gNCA6IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSByZW5kZXJlciBzaG91bGQgYXV0b21hdGljYWxseSBjbGVhciB0aGUgY3VycmVudCByZW5kZXJpbmcgdGFyZ2V0XHJcblx0XHQgKiBiZWZvcmUgZXhlY3V0ZSBhIGByZW5kZXIoKWAgY2FsbC4gVGhlIHRhcmdldCBjYW4gYmUgdGhlIGNhbnZhcyAoZGVmYXVsdCBmcmFtZWJ1ZmZlcilcclxuXHRcdCAqIG9yIHRoZSBjdXJyZW50IGJvdW5kIHJlbmRlciB0YXJnZXQgKGN1c3RvbSBmcmFtZWJ1ZmZlcikuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYXV0b0NsZWFyID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZW4gYGF1dG9DbGVhcmAgaXMgc2V0IHRvIGB0cnVlYCwgdGhpcyBwcm9wZXJ0eSBkZWZpbmVzIHdoZXRoZXIgdGhlIHJlbmRlcmVyXHJcblx0XHQgKiBzaG91bGQgY2xlYXIgdGhlIGNvbG9yIGJ1ZmZlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hdXRvQ2xlYXJDb2xvciA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGVuIGBhdXRvQ2xlYXJgIGlzIHNldCB0byBgdHJ1ZWAsIHRoaXMgcHJvcGVydHkgZGVmaW5lcyB3aGV0aGVyIHRoZSByZW5kZXJlclxyXG5cdFx0ICogc2hvdWxkIGNsZWFyIHRoZSBkZXB0aCBidWZmZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYXV0b0NsZWFyRGVwdGggPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hlbiBgYXV0b0NsZWFyYCBpcyBzZXQgdG8gYHRydWVgLCB0aGlzIHByb3BlcnR5IGRlZmluZXMgd2hldGhlciB0aGUgcmVuZGVyZXJcclxuXHRcdCAqIHNob3VsZCBjbGVhciB0aGUgc3RlbmNpbCBidWZmZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYXV0b0NsZWFyU3RlbmNpbCA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSBkZWZhdWx0IGZyYW1lYnVmZmVyIHNob3VsZCBiZSB0cmFuc3BhcmVudCBvciBvcGFxdWUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYWxwaGEgPSBhbHBoYTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgbG9nYXJpdGhtaWMgZGVwdGggYnVmZmVyIGlzIGVuYWJsZWQgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyID0gbG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgdGhlIG91dHB1dCBjb2xvciBzcGFjZSBvZiB0aGUgcmVuZGVyZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqIEBkZWZhdWx0IFNSR0JDb2xvclNwYWNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMub3V0cHV0Q29sb3JTcGFjZSA9IFNSR0JDb2xvclNwYWNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyB0aGUgdG9uZSBtYXBwaW5nIG9mIHRoZSByZW5kZXJlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgTm9Ub25lTWFwcGluZ1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRvbmVNYXBwaW5nID0gTm9Ub25lTWFwcGluZztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgdGhlIHRvbmUgbWFwcGluZyBleHBvc3VyZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRvbmVNYXBwaW5nRXhwb3N1cmUgPSAxLjA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSByZW5kZXJlciBzaG91bGQgc29ydCBpdHMgcmVuZGVyIGxpc3RzIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBOb3RlOiBTb3J0aW5nIGlzIHVzZWQgdG8gYXR0ZW1wdCB0byBwcm9wZXJseSByZW5kZXIgb2JqZWN0cyB0aGF0IGhhdmUgc29tZSBkZWdyZWUgb2YgdHJhbnNwYXJlbmN5LlxyXG5cdFx0ICogQnkgZGVmaW5pdGlvbiwgc29ydGluZyBvYmplY3RzIG1heSBub3Qgd29yayBpbiBhbGwgY2FzZXMuIERlcGVuZGluZyBvbiB0aGUgbmVlZHMgb2YgYXBwbGljYXRpb24sXHJcblx0XHQgKiBpdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIHR1cm4gb2ZmIHNvcnRpbmcgYW5kIHVzZSBvdGhlciBtZXRob2RzIHRvIGRlYWwgd2l0aCB0cmFuc3BhcmVuY3kgcmVuZGVyaW5nXHJcblx0XHQgKiBlLmcuIG1hbnVhbGx5IGRldGVybWluaW5nIGVhY2ggb2JqZWN0J3MgcmVuZGVyaW5nIG9yZGVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNvcnRPYmplY3RzID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIGRlZmF1bHQgZnJhbWVidWZmZXIgc2hvdWxkIGhhdmUgYSBkZXB0aCBidWZmZXIgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRlcHRoID0gZGVwdGg7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSBkZWZhdWx0IGZyYW1lYnVmZmVyIHNob3VsZCBoYXZlIGEgc3RlbmNpbCBidWZmZXIgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zdGVuY2lsID0gc3RlbmNpbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvbGRzIGEgc2VyaWVzIG9mIHN0YXRpc3RpY2FsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBHUFUgbWVtb3J5XHJcblx0XHQgKiBhbmQgdGhlIHJlbmRlcmluZyBwcm9jZXNzLiBVc2VmdWwgZm9yIGRlYnVnZ2luZyBhbmQgbW9uaXRvcmluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7SW5mb31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pbmZvID0gbmV3IEluZm8oKTtcclxuXHJcblx0XHR0aGlzLm5vZGVzID0ge1xyXG5cdFx0XHRtb2RlbFZpZXdNYXRyaXg6IG51bGwsXHJcblx0XHRcdG1vZGVsTm9ybWFsVmlld01hdHJpeDogbnVsbFxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBub2RlIGxpYnJhcnkgZGVmaW5lcyBob3cgY2VydGFpbiBsaWJyYXJ5IG9iamVjdHMgbGlrZSBtYXRlcmlhbHMsIGxpZ2h0c1xyXG5cdFx0ICogb3IgdG9uZSBtYXBwaW5nIGZ1bmN0aW9ucyBhcmUgbWFwcGVkIHRvIG5vZGUgdHlwZXMuIFRoaXMgaXMgcmVxdWlyZWQgc2luY2VcclxuXHRcdCAqIGFsdGhvdWdoIGluc3RhbmNlcyBvZiBjbGFzc2VzIGxpa2UgYE1lc2hCYXNpY01hdGVyaWFsYCBvciBgUG9pbnRMaWdodGAgY2FuXHJcblx0XHQgKiBiZSBwYXJ0IG9mIHRoZSBzY2VuZSBncmFwaCwgdGhleSBhcmUgaW50ZXJuYWxseSByZXByZXNlbnRlZCBhcyBub2RlcyBmb3JcclxuXHRcdCAqIGZ1cnRoZXIgcHJvY2Vzc2luZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZUxpYnJhcnl9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGlicmFyeSA9IG5ldyBOb2RlTGlicmFyeSgpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBtYXAtbGlrZSBkYXRhIHN0cnVjdHVyZSBmb3IgbWFuYWdpbmcgbGlnaHRzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtMaWdodGluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5saWdodGluZyA9IG5ldyBMaWdodGluZygpO1xyXG5cclxuXHRcdC8vIGludGVybmFsc1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBjYWxsYmFjayBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBwcm92aWRlIGEgZmFsbGJhY2sgYmFja2VuZCwgaWYgdGhlIHByaW1hcnkgYmFja2VuZCBjYW4ndCBiZSB0YXJnZXRlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUgez9GdW5jdGlvbn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fZ2V0RmFsbGJhY2sgPSBnZXRGYWxsYmFjaztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByZW5kZXJlcidzIHBpeGVsIHJhdGlvLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9waXhlbFJhdGlvID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB3aWR0aCBvZiB0aGUgcmVuZGVyZXIncyBkZWZhdWx0IGZyYW1lYnVmZmVyIGluIGxvZ2ljYWwgcGl4ZWwgdW5pdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fd2lkdGggPSB0aGlzLmRvbUVsZW1lbnQud2lkdGg7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgaGVpZ2h0IG9mIHRoZSByZW5kZXJlcidzIGRlZmF1bHQgZnJhbWVidWZmZXIgaW4gbG9naWNhbCBwaXhlbCB1bml0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9oZWlnaHQgPSB0aGlzLmRvbUVsZW1lbnQuaGVpZ2h0O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHZpZXdwb3J0IG9mIHRoZSByZW5kZXJlciBpbiBsb2dpY2FsIHBpeGVsIHVuaXQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3I0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl92aWV3cG9ydCA9IG5ldyBWZWN0b3I0KCAwLCAwLCB0aGlzLl93aWR0aCwgdGhpcy5faGVpZ2h0ICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc2Npc3NvciByZWN0YW5nbGUgb2YgdGhlIHJlbmRlcmVyIGluIGxvZ2ljYWwgcGl4ZWwgdW5pdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjR9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX3NjaXNzb3IgPSBuZXcgVmVjdG9yNCggMCwgMCwgdGhpcy5fd2lkdGgsIHRoaXMuX2hlaWdodCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgc2Npc3NvciB0ZXN0IHNob3VsZCBiZSBlbmFibGVkIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX3NjaXNzb3JUZXN0ID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZSB0byBhIHJlbmRlcmVyIG1vZHVsZSBmb3IgbWFuYWdpbmcgc2hhZGVyIGF0dHJpYnV0ZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHs/QXR0cmlidXRlc31cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fYXR0cmlidXRlcyA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZSB0byBhIHJlbmRlcmVyIG1vZHVsZSBmb3IgbWFuYWdpbmcgZ2VvbWV0cmllcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUgez9HZW9tZXRyaWVzfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9nZW9tZXRyaWVzID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIGEgcmVuZGVyZXIgbW9kdWxlIGZvciBtYW5hZ2luZyBub2RlIHJlbGF0ZWQgbG9naWMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHs/Tm9kZXN9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX25vZGVzID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIGEgcmVuZGVyZXIgbW9kdWxlIGZvciBtYW5hZ2luZyB0aGUgaW50ZXJuYWwgYW5pbWF0aW9uIGxvb3AuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHs/QW5pbWF0aW9ufVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9hbmltYXRpb24gPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gYSByZW5kZXJlciBtb2R1bGUgZm9yIG1hbmFnaW5nIHNoYWRlciBwcm9ncmFtIGJpbmRpbmdzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7P0JpbmRpbmdzfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9iaW5kaW5ncyA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZSB0byBhIHJlbmRlcmVyIG1vZHVsZSBmb3IgbWFuYWdpbmcgcmVuZGVyIG9iamVjdHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHs/UmVuZGVyT2JqZWN0c31cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fb2JqZWN0cyA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZSB0byBhIHJlbmRlcmVyIG1vZHVsZSBmb3IgbWFuYWdpbmcgcmVuZGVyIGFuZCBjb21wdXRlIHBpcGVsaW5lcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUgez9QaXBlbGluZXN9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX3BpcGVsaW5lcyA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZSB0byBhIHJlbmRlcmVyIG1vZHVsZSBmb3IgbWFuYWdpbmcgcmVuZGVyIGJ1bmRsZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHs/UmVuZGVyQnVuZGxlc31cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fYnVuZGxlcyA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZSB0byBhIHJlbmRlcmVyIG1vZHVsZSBmb3IgbWFuYWdpbmcgcmVuZGVyIGxpc3RzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7P1JlbmRlckxpc3RzfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9yZW5kZXJMaXN0cyA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZSB0byBhIHJlbmRlcmVyIG1vZHVsZSBmb3IgbWFuYWdpbmcgcmVuZGVyIGNvbnRleHRzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7P1JlbmRlckNvbnRleHRzfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9yZW5kZXJDb250ZXh0cyA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZSB0byBhIHJlbmRlcmVyIG1vZHVsZSBmb3IgbWFuYWdpbmcgdGV4dHVyZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZXN9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX3RleHR1cmVzID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIGEgcmVuZGVyZXIgbW9kdWxlIGZvciBiYWNrZ3JvdW5kcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUgez9CYWNrZ3JvdW5kfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9iYWNrZ3JvdW5kID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZnVsbHNjcmVlbiBxdWFkIGlzIHVzZWQgZm9yIGludGVybmFsIHJlbmRlciBwYXNzZXNcclxuXHRcdCAqIGxpa2UgdGhlIHRvbmUgbWFwcGluZyBhbmQgY29sb3Igc3BhY2Ugb3V0cHV0IHBhc3MuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHtRdWFkTWVzaH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fcXVhZCA9IG5ldyBRdWFkTWVzaCggbmV3IE5vZGVNYXRlcmlhbCgpICk7XHJcblx0XHR0aGlzLl9xdWFkLm1hdGVyaWFsLm5hbWUgPSAnUmVuZGVyZXJfb3V0cHV0JztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IHJlbmRlciBjb250ZXh0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7P1JlbmRlckNvbnRleHR9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX2N1cnJlbnRSZW5kZXJDb250ZXh0ID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgY3VzdG9tIHNvcnQgZnVuY3Rpb24gZm9yIHRoZSBvcGFxdWUgcmVuZGVyIGxpc3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHs/RnVuY3Rpb259XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX29wYXF1ZVNvcnQgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBjdXN0b20gc29ydCBmdW5jdGlvbiBmb3IgdGhlIHRyYW5zcGFyZW50IHJlbmRlciBsaXN0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7P0Z1bmN0aW9ufVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl90cmFuc3BhcmVudFNvcnQgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGZyYW1lYnVmZmVyIHRhcmdldC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUgez9SZW5kZXJUYXJnZXR9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX2ZyYW1lQnVmZmVyVGFyZ2V0ID0gbnVsbDtcclxuXHJcblx0XHRjb25zdCBhbHBoYUNsZWFyID0gdGhpcy5hbHBoYSA9PT0gdHJ1ZSA/IDAgOiAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNsZWFyIGNvbG9yIHZhbHVlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7Q29sb3I0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9jbGVhckNvbG9yID0gbmV3IENvbG9yNCggMCwgMCwgMCwgYWxwaGFDbGVhciApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNsZWFyIGRlcHRoIHZhbHVlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9jbGVhckRlcHRoID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjbGVhciBzdGVuY2lsIHZhbHVlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9jbGVhclN0ZW5jaWwgPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGN1cnJlbnQgcmVuZGVyIHRhcmdldC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUgez9SZW5kZXJUYXJnZXR9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX3JlbmRlclRhcmdldCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYWN0aXZlIGN1YmUgZmFjZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fYWN0aXZlQ3ViZUZhY2UgPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGFjdGl2ZSBtaXBtYXAgbGV2ZWwuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX2FjdGl2ZU1pcG1hcExldmVsID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjdXJyZW50IG91dHB1dCByZW5kZXIgdGFyZ2V0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7P1JlbmRlclRhcmdldH1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fb3V0cHV0UmVuZGVyVGFyZ2V0ID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBNUlQgc2V0dGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUgez9NUlROb2RlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9tcnQgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmdW5jdGlvbiBkZWZpbmVzIGhvdyBhIHJlbmRlciBvYmplY3QgaXMgZ29pbmdcclxuXHRcdCAqIHRvIGJlIHJlbmRlcmVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7P0Z1bmN0aW9ufVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9yZW5kZXJPYmplY3RGdW5jdGlvbiA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBVc2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnQgcmVuZGVyIG9iamVjdCBmdW5jdGlvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUgez9GdW5jdGlvbn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fY3VycmVudFJlbmRlck9iamVjdEZ1bmN0aW9uID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFVzZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgY3VycmVudCByZW5kZXIgYnVuZGxlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7P1JlbmRlckJ1bmRsZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fY3VycmVudFJlbmRlckJ1bmRsZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBOZXh0IHRvIGBfcmVuZGVyT2JqZWN0RnVuY3Rpb24oKWAsIHRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYW5vdGhlciBob29rXHJcblx0XHQgKiBmb3IgaW5mbHVlbmNpbmcgdGhlIHJlbmRlciBwcm9jZXNzIG9mIGEgcmVuZGVyIG9iamVjdC4gSXQgaXMgbWVhbnQgZm9yIGludGVybmFsXHJcblx0XHQgKiB1c2UgYW5kIG9ubHkgcmVsZXZhbnQgZm9yIGBjb21waWxlQXN5bmMoKWAgcmlnaHQgbm93LiBJbnN0ZWFkIG9mIHVzaW5nXHJcblx0XHQgKiB0aGUgZGVmYXVsdCBsb2dpYyBvZiBgX3JlbmRlck9iamVjdERpcmVjdCgpYCB3aGljaCBhY3R1YWxseSBkcmF3cyB0aGUgcmVuZGVyIG9iamVjdCxcclxuXHRcdCAqIGEgZGlmZmVyZW50IGZ1bmN0aW9uIG1pZ2h0IGJlIHVzZWQgd2hpY2ggcGVyZm9ybXMgbm8gZHJhdyBidXQganVzdCB0aGUgbm9kZVxyXG5cdFx0ICogYW5kIHBpcGVsaW5lIHVwZGF0ZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHs/RnVuY3Rpb259XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX2hhbmRsZU9iamVjdEZ1bmN0aW9uID0gdGhpcy5fcmVuZGVyT2JqZWN0RGlyZWN0O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRldmljZSBoYXMgYmVlbiBsb3N0IG9yIG5vdC4gSW4gV2ViR0wgdGVybXMsIHRoZSBkZXZpY2VcclxuXHRcdCAqIGxvc3QgaXMgY29uc2lkZXJlZCBhcyBhIGNvbnRleHQgbG9zdC4gV2hlbiB0aGlzIGlzIHNldCB0byBgdHJ1ZWAsIHJlbmRlcmluZ1xyXG5cdFx0ICogaXNuJ3QgcG9zc2libGUgYW55bW9yZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9pc0RldmljZUxvc3QgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBkZWZpbmVzIHdoYXQgc2hvdWxkIGhhcHBlbiB3aGVuIGEgZGV2aWNlL2NvbnRleHQgbG9zdCBvY2N1cnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0Z1bmN0aW9ufVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm9uRGV2aWNlTG9zdCA9IHRoaXMuX29uRGV2aWNlTG9zdDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgdGhlIHR5cGUgb2YgY29sb3IgYnVmZmVycy4gVGhlIGRlZmF1bHQgYEhhbGZGbG9hdFR5cGVgIGlzIHJlY29tbWVuZCBmb3JcclxuXHRcdCAqIGJlc3QgcXVhbGl0eS4gVG8gc2F2ZSBtZW1vcnkgYW5kIGJhbmR3aWR0aCwgYFVuc2lnbmVkQnl0ZVR5cGVgIG1pZ2h0IGJlIHVzZWQuXHJcblx0XHQgKiBUaGlzIHdpbGwgcmVkdWNlIHJlbmRlcmluZyBxdWFsaXR5IHRob3VnaC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IEhhbGZGbG9hdFR5cGVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fY29sb3JCdWZmZXJUeXBlID0gY29sb3JCdWZmZXJUeXBlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgcmVuZGVyZXIgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX2luaXRpYWxpemVkID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZSB0byB0aGUgcHJvbWlzZSB3aGljaCBpbml0aWFsaXplcyB0aGUgcmVuZGVyZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHs/UHJvbWlzZTx0aGlzPn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5faW5pdFByb21pc2UgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQW4gYXJyYXkgb2YgY29tcGlsYXRpb24gcHJvbWlzZXMgd2hpY2ggYXJlIHVzZWQgaW4gYGNvbXBpbGVBc3luYygpYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUgez9BcnJheTxQcm9taXNlPn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fY29tcGlsYXRpb25Qcm9taXNlcyA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSByZW5kZXJlciBzaG91bGQgcmVuZGVyIHRyYW5zcGFyZW50IHJlbmRlciBvYmplY3RzIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50cmFuc3BhcmVudCA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSByZW5kZXJlciBzaG91bGQgcmVuZGVyIG9wYXF1ZSByZW5kZXIgb2JqZWN0cyBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMub3BhcXVlID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNoYWRvdyBtYXAgY29uZmlndXJhdGlvblxyXG5cdFx0ICogQHR5cGVkZWYge09iamVjdH0gU2hhZG93TWFwQ29uZmlnXHJcblx0XHQgKiBAcHJvcGVydHkge2Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRvIGdsb2JhbGx5IGVuYWJsZSBzaGFkb3dzIG9yIG5vdC5cclxuXHRcdCAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0eXBlIC0gVGhlIHNoYWRvdyBtYXAgdHlwZS5cclxuXHRcdCAqL1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJlbmRlcmVyJ3Mgc2hhZG93IGNvbmZpZ3VyYXRpb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1NoYWRvd01hcENvbmZpZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zaGFkb3dNYXAgPSB7XHJcblx0XHRcdGVuYWJsZWQ6IGZhbHNlLFxyXG5cdFx0XHR0eXBlOiBQQ0ZTaGFkb3dNYXBcclxuXHRcdH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBYUiBjb25maWd1cmF0aW9uLlxyXG5cdFx0ICogQHR5cGVkZWYge09iamVjdH0gWFJDb25maWdcclxuXHRcdCAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZW5hYmxlZCAtIFdoZXRoZXIgdG8gZ2xvYmFsbHkgZW5hYmxlIFhSIG9yIG5vdC5cclxuXHRcdCAqL1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJlbmRlcmVyJ3MgWFIgbWFuYWdlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7WFJNYW5hZ2VyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnhyID0gbmV3IFhSTWFuYWdlciggdGhpcyApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVidWcgY29uZmlndXJhdGlvbi5cclxuXHRcdCAqIEB0eXBlZGVmIHtPYmplY3R9IERlYnVnQ29uZmlnXHJcblx0XHQgKiBAcHJvcGVydHkge2Jvb2xlYW59IGNoZWNrU2hhZGVyRXJyb3JzIC0gV2hldGhlciBzaGFkZXIgZXJyb3JzIHNob3VsZCBiZSBjaGVja2VkIG9yIG5vdC5cclxuXHRcdCAqIEBwcm9wZXJ0eSB7P0Z1bmN0aW9ufSBvblNoYWRlckVycm9yIC0gQSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGV4ZWN1dGVkIHdoZW4gYSBzaGFkZXIgZXJyb3IgaGFwcGVucy4gT25seSBzdXBwb3J0ZWQgd2l0aCBXZWJHTCAyIHJpZ2h0IG5vdy5cclxuXHRcdCAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGdldFNoYWRlckFzeW5jIC0gQWxsb3dzIHRoZSBnZXQgdGhlIHJhdyBzaGFkZXIgY29kZSBmb3IgdGhlIGdpdmVuIHNjZW5lLCBjYW1lcmEgYW5kIDNEIG9iamVjdC5cclxuXHRcdCAqL1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJlbmRlcmVyJ3MgZGVidWcgY29uZmlndXJhdGlvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7RGVidWdDb25maWd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGVidWcgPSB7XHJcblx0XHRcdGNoZWNrU2hhZGVyRXJyb3JzOiB0cnVlLFxyXG5cdFx0XHRvblNoYWRlckVycm9yOiBudWxsLFxyXG5cdFx0XHRnZXRTaGFkZXJBc3luYzogYXN5bmMgKCBzY2VuZSwgY2FtZXJhLCBvYmplY3QgKSA9PiB7XHJcblxyXG5cdFx0XHRcdGF3YWl0IHRoaXMuY29tcGlsZUFzeW5jKCBzY2VuZSwgY2FtZXJhICk7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHJlbmRlckxpc3QgPSB0aGlzLl9yZW5kZXJMaXN0cy5nZXQoIHNjZW5lLCBjYW1lcmEgKTtcclxuXHRcdFx0XHRjb25zdCByZW5kZXJDb250ZXh0ID0gdGhpcy5fcmVuZGVyQ29udGV4dHMuZ2V0KCBzY2VuZSwgY2FtZXJhLCB0aGlzLl9yZW5kZXJUYXJnZXQgKTtcclxuXHJcblx0XHRcdFx0Y29uc3QgbWF0ZXJpYWwgPSBzY2VuZS5vdmVycmlkZU1hdGVyaWFsIHx8IG9iamVjdC5tYXRlcmlhbDtcclxuXHJcblx0XHRcdFx0Y29uc3QgcmVuZGVyT2JqZWN0ID0gdGhpcy5fb2JqZWN0cy5nZXQoIG9iamVjdCwgbWF0ZXJpYWwsIHNjZW5lLCBjYW1lcmEsIHJlbmRlckxpc3QubGlnaHRzTm9kZSwgcmVuZGVyQ29udGV4dCwgcmVuZGVyQ29udGV4dC5jbGlwcGluZ0NvbnRleHQgKTtcclxuXHJcblx0XHRcdFx0Y29uc3QgeyBmcmFnbWVudFNoYWRlciwgdmVydGV4U2hhZGVyIH0gPSByZW5kZXJPYmplY3QuZ2V0Tm9kZUJ1aWxkZXJTdGF0ZSgpO1xyXG5cclxuXHRcdFx0XHRyZXR1cm4geyBmcmFnbWVudFNoYWRlciwgdmVydGV4U2hhZGVyIH07XHJcblxyXG5cdFx0XHR9XHJcblx0XHR9O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEluaXRpYWxpemVzIHRoZSByZW5kZXJlciBzbyBpdCBpcyByZWFkeSBmb3IgdXNhZ2UuXHJcblx0ICpcclxuXHQgKiBAYXN5bmNcclxuXHQgKiBAcmV0dXJuIHtQcm9taXNlPHRoaXM+fSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSByZW5kZXJlciBoYXMgYmVlbiBpbml0aWFsaXplZC5cclxuXHQgKi9cclxuXHRhc3luYyBpbml0KCkge1xyXG5cclxuXHRcdGlmICggdGhpcy5faW5pdGlhbGl6ZWQgKSB7XHJcblxyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdSZW5kZXJlcjogQmFja2VuZCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLicgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9pbml0UHJvbWlzZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHJldHVybiB0aGlzLl9pbml0UHJvbWlzZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5faW5pdFByb21pc2UgPSBuZXcgUHJvbWlzZSggYXN5bmMgKCByZXNvbHZlLCByZWplY3QgKSA9PiB7XHJcblxyXG5cdFx0XHRsZXQgYmFja2VuZCA9IHRoaXMuYmFja2VuZDtcclxuXHJcblx0XHRcdHRyeSB7XHJcblxyXG5cdFx0XHRcdGF3YWl0IGJhY2tlbmQuaW5pdCggdGhpcyApO1xyXG5cclxuXHRcdFx0fSBjYXRjaCAoIGVycm9yICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIHRoaXMuX2dldEZhbGxiYWNrICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRcdC8vIHRyeSB0aGUgZmFsbGJhY2tcclxuXHJcblx0XHRcdFx0XHR0cnkge1xyXG5cclxuXHRcdFx0XHRcdFx0dGhpcy5iYWNrZW5kID0gYmFja2VuZCA9IHRoaXMuX2dldEZhbGxiYWNrKCBlcnJvciApO1xyXG5cdFx0XHRcdFx0XHRhd2FpdCBiYWNrZW5kLmluaXQoIHRoaXMgKTtcclxuXHJcblx0XHRcdFx0XHR9IGNhdGNoICggZXJyb3IgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRyZWplY3QoIGVycm9yICk7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0cmVqZWN0KCBlcnJvciApO1xyXG5cdFx0XHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0aGlzLl9ub2RlcyA9IG5ldyBOb2RlcyggdGhpcywgYmFja2VuZCApO1xyXG5cdFx0XHR0aGlzLl9hbmltYXRpb24gPSBuZXcgQW5pbWF0aW9uKCB0aGlzLl9ub2RlcywgdGhpcy5pbmZvICk7XHJcblx0XHRcdHRoaXMuX2F0dHJpYnV0ZXMgPSBuZXcgQXR0cmlidXRlcyggYmFja2VuZCApO1xyXG5cdFx0XHR0aGlzLl9iYWNrZ3JvdW5kID0gbmV3IEJhY2tncm91bmQoIHRoaXMsIHRoaXMuX25vZGVzICk7XHJcblx0XHRcdHRoaXMuX2dlb21ldHJpZXMgPSBuZXcgR2VvbWV0cmllcyggdGhpcy5fYXR0cmlidXRlcywgdGhpcy5pbmZvICk7XHJcblx0XHRcdHRoaXMuX3RleHR1cmVzID0gbmV3IFRleHR1cmVzKCB0aGlzLCBiYWNrZW5kLCB0aGlzLmluZm8gKTtcclxuXHRcdFx0dGhpcy5fcGlwZWxpbmVzID0gbmV3IFBpcGVsaW5lcyggYmFja2VuZCwgdGhpcy5fbm9kZXMgKTtcclxuXHRcdFx0dGhpcy5fYmluZGluZ3MgPSBuZXcgQmluZGluZ3MoIGJhY2tlbmQsIHRoaXMuX25vZGVzLCB0aGlzLl90ZXh0dXJlcywgdGhpcy5fYXR0cmlidXRlcywgdGhpcy5fcGlwZWxpbmVzLCB0aGlzLmluZm8gKTtcclxuXHRcdFx0dGhpcy5fb2JqZWN0cyA9IG5ldyBSZW5kZXJPYmplY3RzKCB0aGlzLCB0aGlzLl9ub2RlcywgdGhpcy5fZ2VvbWV0cmllcywgdGhpcy5fcGlwZWxpbmVzLCB0aGlzLl9iaW5kaW5ncywgdGhpcy5pbmZvICk7XHJcblx0XHRcdHRoaXMuX3JlbmRlckxpc3RzID0gbmV3IFJlbmRlckxpc3RzKCB0aGlzLmxpZ2h0aW5nICk7XHJcblx0XHRcdHRoaXMuX2J1bmRsZXMgPSBuZXcgUmVuZGVyQnVuZGxlcygpO1xyXG5cdFx0XHR0aGlzLl9yZW5kZXJDb250ZXh0cyA9IG5ldyBSZW5kZXJDb250ZXh0cygpO1xyXG5cclxuXHRcdFx0Ly9cclxuXHJcblx0XHRcdHRoaXMuX2FuaW1hdGlvbi5zdGFydCgpO1xyXG5cdFx0XHR0aGlzLl9pbml0aWFsaXplZCA9IHRydWU7XHJcblxyXG5cdFx0XHRyZXNvbHZlKCB0aGlzICk7XHJcblxyXG5cdFx0fSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9pbml0UHJvbWlzZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgY29vcmRpbmF0ZSBzeXN0ZW0gb2YgdGhlIHJlbmRlcmVyLiBUaGUgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eVxyXG5cdCAqIGRlcGVuZHMgb24gdGhlIHNlbGVjdGVkIGJhY2tlbmQuIEVpdGhlciBgVEhSRUUuV2ViR0xDb29yZGluYXRlU3lzdGVtYCBvclxyXG5cdCAqIGBUSFJFRS5XZWJHUFVDb29yZGluYXRlU3lzdGVtYC5cclxuXHQgKlxyXG5cdCAqIEByZWFkb25seVxyXG5cdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0ICovXHJcblx0Z2V0IGNvb3JkaW5hdGVTeXN0ZW0oKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuYmFja2VuZC5jb29yZGluYXRlU3lzdGVtO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXBpbGVzIGFsbCBtYXRlcmlhbHMgaW4gdGhlIGdpdmVuIHNjZW5lLiBUaGlzIGNhbiBiZSB1c2VmdWwgdG8gYXZvaWQgYVxyXG5cdCAqIHBoZW5vbWVub24gd2hpY2ggaXMgY2FsbGVkIFwic2hhZGVyIGNvbXBpbGF0aW9uIHN0dXR0ZXJcIiwgd2hpY2ggb2NjdXJzIHdoZW5cclxuXHQgKiByZW5kZXJpbmcgYW4gb2JqZWN0IHdpdGggYSBuZXcgc2hhZGVyIGZvciB0aGUgZmlyc3QgdGltZS5cclxuXHQgKlxyXG5cdCAqIElmIHlvdSB3YW50IHRvIGFkZCBhIDNEIG9iamVjdCB0byBhbiBleGlzdGluZyBzY2VuZSwgdXNlIHRoZSB0aGlyZCBvcHRpb25hbFxyXG5cdCAqIHBhcmFtZXRlciBmb3IgYXBwbHlpbmcgdGhlIHRhcmdldCBzY2VuZS4gTm90ZSB0aGF0IHRoZSAodGFyZ2V0KSBzY2VuZSdzIGxpZ2h0aW5nXHJcblx0ICogYW5kIGVudmlyb25tZW50IG11c3QgYmUgY29uZmlndXJlZCBiZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZC5cclxuXHQgKlxyXG5cdCAqIEBhc3luY1xyXG5cdCAqIEBwYXJhbSB7T2JqZWN0M0R9IHNjZW5lIC0gVGhlIHNjZW5lIG9yIDNEIG9iamVjdCB0byBwcmVjb21waWxlLlxyXG5cdCAqIEBwYXJhbSB7Q2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIHRoYXQgaXMgdXNlZCB0byByZW5kZXIgdGhlIHNjZW5lLlxyXG5cdCAqIEBwYXJhbSB7P1NjZW5lfSB0YXJnZXRTY2VuZSAtIElmIHRoZSBmaXJzdCBhcmd1bWVudCBpcyBhIDNEIG9iamVjdCwgdGhpcyBwYXJhbWV0ZXIgbXVzdCByZXByZXNlbnQgdGhlIHNjZW5lIHRoZSAzRCBvYmplY3QgaXMgZ29pbmcgdG8gYmUgYWRkZWQuXHJcblx0ICogQHJldHVybiB7UHJvbWlzZTxBcnJheXx1bmRlZmluZWQ+fSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjb21waWxlIGhhcyBiZWVuIGZpbmlzaGVkLlxyXG5cdCAqL1xyXG5cdGFzeW5jIGNvbXBpbGVBc3luYyggc2NlbmUsIGNhbWVyYSwgdGFyZ2V0U2NlbmUgPSBudWxsICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5faXNEZXZpY2VMb3N0ID09PSB0cnVlICkgcmV0dXJuO1xyXG5cclxuXHRcdGlmICggdGhpcy5faW5pdGlhbGl6ZWQgPT09IGZhbHNlICkgYXdhaXQgdGhpcy5pbml0KCk7XHJcblxyXG5cdFx0Ly8gcHJlc2VydmUgcmVuZGVyIHRyZWVcclxuXHJcblx0XHRjb25zdCBub2RlRnJhbWUgPSB0aGlzLl9ub2Rlcy5ub2RlRnJhbWU7XHJcblxyXG5cdFx0Y29uc3QgcHJldmlvdXNSZW5kZXJJZCA9IG5vZGVGcmFtZS5yZW5kZXJJZDtcclxuXHRcdGNvbnN0IHByZXZpb3VzUmVuZGVyQ29udGV4dCA9IHRoaXMuX2N1cnJlbnRSZW5kZXJDb250ZXh0O1xyXG5cdFx0Y29uc3QgcHJldmlvdXNSZW5kZXJPYmplY3RGdW5jdGlvbiA9IHRoaXMuX2N1cnJlbnRSZW5kZXJPYmplY3RGdW5jdGlvbjtcclxuXHRcdGNvbnN0IHByZXZpb3VzQ29tcGlsYXRpb25Qcm9taXNlcyA9IHRoaXMuX2NvbXBpbGF0aW9uUHJvbWlzZXM7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCBzY2VuZVJlZiA9ICggc2NlbmUuaXNTY2VuZSA9PT0gdHJ1ZSApID8gc2NlbmUgOiBfc2NlbmU7XHJcblxyXG5cdFx0aWYgKCB0YXJnZXRTY2VuZSA9PT0gbnVsbCApIHRhcmdldFNjZW5lID0gc2NlbmU7XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyVGFyZ2V0ID0gdGhpcy5fcmVuZGVyVGFyZ2V0O1xyXG5cdFx0Y29uc3QgcmVuZGVyQ29udGV4dCA9IHRoaXMuX3JlbmRlckNvbnRleHRzLmdldCggdGFyZ2V0U2NlbmUsIGNhbWVyYSwgcmVuZGVyVGFyZ2V0ICk7XHJcblx0XHRjb25zdCBhY3RpdmVNaXBtYXBMZXZlbCA9IHRoaXMuX2FjdGl2ZU1pcG1hcExldmVsO1xyXG5cclxuXHRcdGNvbnN0IGNvbXBpbGF0aW9uUHJvbWlzZXMgPSBbXTtcclxuXHJcblx0XHR0aGlzLl9jdXJyZW50UmVuZGVyQ29udGV4dCA9IHJlbmRlckNvbnRleHQ7XHJcblx0XHR0aGlzLl9jdXJyZW50UmVuZGVyT2JqZWN0RnVuY3Rpb24gPSB0aGlzLnJlbmRlck9iamVjdDtcclxuXHJcblx0XHR0aGlzLl9oYW5kbGVPYmplY3RGdW5jdGlvbiA9IHRoaXMuX2NyZWF0ZU9iamVjdFBpcGVsaW5lO1xyXG5cclxuXHRcdHRoaXMuX2NvbXBpbGF0aW9uUHJvbWlzZXMgPSBjb21waWxhdGlvblByb21pc2VzO1xyXG5cclxuXHRcdG5vZGVGcmFtZS5yZW5kZXJJZCArKztcclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdG5vZGVGcmFtZS51cGRhdGUoKTtcclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdHJlbmRlckNvbnRleHQuZGVwdGggPSB0aGlzLmRlcHRoO1xyXG5cdFx0cmVuZGVyQ29udGV4dC5zdGVuY2lsID0gdGhpcy5zdGVuY2lsO1xyXG5cclxuXHRcdGlmICggISByZW5kZXJDb250ZXh0LmNsaXBwaW5nQ29udGV4dCApIHJlbmRlckNvbnRleHQuY2xpcHBpbmdDb250ZXh0ID0gbmV3IENsaXBwaW5nQ29udGV4dCgpO1xyXG5cdFx0cmVuZGVyQ29udGV4dC5jbGlwcGluZ0NvbnRleHQudXBkYXRlR2xvYmFsKCBzY2VuZVJlZiwgY2FtZXJhICk7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRzY2VuZVJlZi5vbkJlZm9yZVJlbmRlciggdGhpcywgc2NlbmUsIGNhbWVyYSwgcmVuZGVyVGFyZ2V0ICk7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCByZW5kZXJMaXN0ID0gdGhpcy5fcmVuZGVyTGlzdHMuZ2V0KCBzY2VuZSwgY2FtZXJhICk7XHJcblx0XHRyZW5kZXJMaXN0LmJlZ2luKCk7XHJcblxyXG5cdFx0dGhpcy5fcHJvamVjdE9iamVjdCggc2NlbmUsIGNhbWVyYSwgMCwgcmVuZGVyTGlzdCwgcmVuZGVyQ29udGV4dC5jbGlwcGluZ0NvbnRleHQgKTtcclxuXHJcblx0XHQvLyBpbmNsdWRlIGxpZ2h0cyBmcm9tIHRhcmdldCBzY2VuZVxyXG5cdFx0aWYgKCB0YXJnZXRTY2VuZSAhPT0gc2NlbmUgKSB7XHJcblxyXG5cdFx0XHR0YXJnZXRTY2VuZS50cmF2ZXJzZVZpc2libGUoIGZ1bmN0aW9uICggb2JqZWN0ICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIG9iamVjdC5pc0xpZ2h0ICYmIG9iamVjdC5sYXllcnMudGVzdCggY2FtZXJhLmxheWVycyApICkge1xyXG5cclxuXHRcdFx0XHRcdHJlbmRlckxpc3QucHVzaExpZ2h0KCBvYmplY3QgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZW5kZXJMaXN0LmZpbmlzaCgpO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLl90ZXh0dXJlcy51cGRhdGVSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCwgYWN0aXZlTWlwbWFwTGV2ZWwgKTtcclxuXHJcblx0XHRcdGNvbnN0IHJlbmRlclRhcmdldERhdGEgPSB0aGlzLl90ZXh0dXJlcy5nZXQoIHJlbmRlclRhcmdldCApO1xyXG5cclxuXHRcdFx0cmVuZGVyQ29udGV4dC50ZXh0dXJlcyA9IHJlbmRlclRhcmdldERhdGEudGV4dHVyZXM7XHJcblx0XHRcdHJlbmRlckNvbnRleHQuZGVwdGhUZXh0dXJlID0gcmVuZGVyVGFyZ2V0RGF0YS5kZXB0aFRleHR1cmU7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHJlbmRlckNvbnRleHQudGV4dHVyZXMgPSBudWxsO1xyXG5cdFx0XHRyZW5kZXJDb250ZXh0LmRlcHRoVGV4dHVyZSA9IG51bGw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0dGhpcy5fYmFja2dyb3VuZC51cGRhdGUoIHNjZW5lUmVmLCByZW5kZXJMaXN0LCByZW5kZXJDb250ZXh0ICk7XHJcblxyXG5cdFx0Ly8gcHJvY2VzcyByZW5kZXIgbGlzdHNcclxuXHJcblx0XHRjb25zdCBvcGFxdWVPYmplY3RzID0gcmVuZGVyTGlzdC5vcGFxdWU7XHJcblx0XHRjb25zdCB0cmFuc3BhcmVudE9iamVjdHMgPSByZW5kZXJMaXN0LnRyYW5zcGFyZW50O1xyXG5cdFx0Y29uc3QgdHJhbnNwYXJlbnREb3VibGVQYXNzT2JqZWN0cyA9IHJlbmRlckxpc3QudHJhbnNwYXJlbnREb3VibGVQYXNzO1xyXG5cdFx0Y29uc3QgbGlnaHRzTm9kZSA9IHJlbmRlckxpc3QubGlnaHRzTm9kZTtcclxuXHJcblx0XHRpZiAoIHRoaXMub3BhcXVlID09PSB0cnVlICYmIG9wYXF1ZU9iamVjdHMubGVuZ3RoID4gMCApIHRoaXMuX3JlbmRlck9iamVjdHMoIG9wYXF1ZU9iamVjdHMsIGNhbWVyYSwgc2NlbmVSZWYsIGxpZ2h0c05vZGUgKTtcclxuXHRcdGlmICggdGhpcy50cmFuc3BhcmVudCA9PT0gdHJ1ZSAmJiB0cmFuc3BhcmVudE9iamVjdHMubGVuZ3RoID4gMCApIHRoaXMuX3JlbmRlclRyYW5zcGFyZW50cyggdHJhbnNwYXJlbnRPYmplY3RzLCB0cmFuc3BhcmVudERvdWJsZVBhc3NPYmplY3RzLCBjYW1lcmEsIHNjZW5lUmVmLCBsaWdodHNOb2RlICk7XHJcblxyXG5cdFx0Ly8gcmVzdG9yZSByZW5kZXIgdHJlZVxyXG5cclxuXHRcdG5vZGVGcmFtZS5yZW5kZXJJZCA9IHByZXZpb3VzUmVuZGVySWQ7XHJcblxyXG5cdFx0dGhpcy5fY3VycmVudFJlbmRlckNvbnRleHQgPSBwcmV2aW91c1JlbmRlckNvbnRleHQ7XHJcblx0XHR0aGlzLl9jdXJyZW50UmVuZGVyT2JqZWN0RnVuY3Rpb24gPSBwcmV2aW91c1JlbmRlck9iamVjdEZ1bmN0aW9uO1xyXG5cdFx0dGhpcy5fY29tcGlsYXRpb25Qcm9taXNlcyA9IHByZXZpb3VzQ29tcGlsYXRpb25Qcm9taXNlcztcclxuXHJcblx0XHR0aGlzLl9oYW5kbGVPYmplY3RGdW5jdGlvbiA9IHRoaXMuX3JlbmRlck9iamVjdERpcmVjdDtcclxuXHJcblx0XHQvLyB3YWl0IGZvciBhbGwgcHJvbWlzZXMgc2V0dXAgYnkgYmFja2VuZHMgYXdhaXRpbmcgY29tcGlsYXRpb24vbGlua2luZy9waXBlbGluZSBjcmVhdGlvbiB0byBjb21wbGV0ZVxyXG5cclxuXHRcdGF3YWl0IFByb21pc2UuYWxsKCBjb21waWxhdGlvblByb21pc2VzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVuZGVycyB0aGUgc2NlbmUgaW4gYW4gYXN5bmMgZmFzaGlvbi5cclxuXHQgKlxyXG5cdCAqIEBhc3luY1xyXG5cdCAqIEBwYXJhbSB7T2JqZWN0M0R9IHNjZW5lIC0gVGhlIHNjZW5lIG9yIDNEIG9iamVjdCB0byByZW5kZXIuXHJcblx0ICogQHBhcmFtIHtDYW1lcmF9IGNhbWVyYSAtIFRoZSBjYW1lcmEuXHJcblx0ICogQHJldHVybiB7UHJvbWlzZX0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgcmVuZGVyIGhhcyBiZWVuIGZpbmlzaGVkLlxyXG5cdCAqL1xyXG5cdGFzeW5jIHJlbmRlckFzeW5jKCBzY2VuZSwgY2FtZXJhICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5faW5pdGlhbGl6ZWQgPT09IGZhbHNlICkgYXdhaXQgdGhpcy5pbml0KCk7XHJcblxyXG5cdFx0dGhpcy5fcmVuZGVyU2NlbmUoIHNjZW5lLCBjYW1lcmEgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDYW4gYmUgdXNlZCB0byBzeW5jaHJvbml6ZSBDUFUgb3BlcmF0aW9ucyB3aXRoIEdQVSB0YXNrcy4gU28gd2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsXHJcblx0ICogdGhlIENQVSB3YWl0cyBmb3IgdGhlIEdQVSB0byBjb21wbGV0ZSBpdHMgb3BlcmF0aW9uIChlLmcuIGEgY29tcHV0ZSB0YXNrKS5cclxuXHQgKlxyXG5cdCAqIEBhc3luY1xyXG5cdCAqIEByZXR1cm4ge1Byb21pc2V9IEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gc3luY2hyb25pemF0aW9uIGhhcyBiZWVuIGZpbmlzaGVkLlxyXG5cdCAqL1xyXG5cdGFzeW5jIHdhaXRGb3JHUFUoKSB7XHJcblxyXG5cdFx0YXdhaXQgdGhpcy5iYWNrZW5kLndhaXRGb3JHUFUoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBnaXZlbiBNUlQgY29uZmlndXJhdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TVJUTm9kZX0gbXJ0IC0gVGhlIE1SVCBub2RlIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtSZW5kZXJlcn0gQSByZWZlcmVuY2UgdG8gdGhpcyByZW5kZXJlci5cclxuXHQgKi9cclxuXHRzZXRNUlQoIG1ydCApIHtcclxuXHJcblx0XHR0aGlzLl9tcnQgPSBtcnQ7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgTVJUIGNvbmZpZ3VyYXRpb24uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtNUlROb2RlfSBUaGUgTVJUIGNvbmZpZ3VyYXRpb24uXHJcblx0ICovXHJcblx0Z2V0TVJUKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9tcnQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgY29sb3IgYnVmZmVyIHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBjb2xvciBidWZmZXIgdHlwZS5cclxuXHQgKi9cclxuXHRnZXRDb2xvckJ1ZmZlclR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX2NvbG9yQnVmZmVyVHlwZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBkZXZpY2UgbG9zdCBjYWxsYmFjay5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGluZm8gLSBJbmZvcm1hdGlvbiBhYm91dCB0aGUgY29udGV4dCBsb3N0LlxyXG5cdCAqL1xyXG5cdF9vbkRldmljZUxvc3QoIGluZm8gKSB7XHJcblxyXG5cdFx0bGV0IGVycm9yTWVzc2FnZSA9IGBUSFJFRS5XZWJHUFVSZW5kZXJlcjogJHtpbmZvLmFwaX0gRGV2aWNlIExvc3Q6XFxuXFxuTWVzc2FnZTogJHtpbmZvLm1lc3NhZ2V9YDtcclxuXHJcblx0XHRpZiAoIGluZm8ucmVhc29uICkge1xyXG5cclxuXHRcdFx0ZXJyb3JNZXNzYWdlICs9IGBcXG5SZWFzb246ICR7aW5mby5yZWFzb259YDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc29sZS5lcnJvciggZXJyb3JNZXNzYWdlICk7XHJcblxyXG5cdFx0dGhpcy5faXNEZXZpY2VMb3N0ID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW5kZXJzIHRoZSBnaXZlbiByZW5kZXIgYnVuZGxlLlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gYnVuZGxlIC0gUmVuZGVyIGJ1bmRsZSBkYXRhLlxyXG5cdCAqIEBwYXJhbSB7U2NlbmV9IHNjZW5lUmVmIC0gVGhlIHNjZW5lIHRoZSByZW5kZXIgYnVuZGxlIGJlbG9uZ3MgdG8uXHJcblx0ICogQHBhcmFtIHtMaWdodHNOb2RlfSBsaWdodHNOb2RlIC0gVGhlIGxpZ2h0cyBub2RlLlxyXG5cdCAqL1xyXG5cdF9yZW5kZXJCdW5kbGUoIGJ1bmRsZSwgc2NlbmVSZWYsIGxpZ2h0c05vZGUgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBidW5kbGVHcm91cCwgY2FtZXJhLCByZW5kZXJMaXN0IH0gPSBidW5kbGU7XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyQ29udGV4dCA9IHRoaXMuX2N1cnJlbnRSZW5kZXJDb250ZXh0O1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyQnVuZGxlID0gdGhpcy5fYnVuZGxlcy5nZXQoIGJ1bmRsZUdyb3VwLCBjYW1lcmEgKTtcclxuXHRcdGNvbnN0IHJlbmRlckJ1bmRsZURhdGEgPSB0aGlzLmJhY2tlbmQuZ2V0KCByZW5kZXJCdW5kbGUgKTtcclxuXHJcblx0XHRpZiAoIHJlbmRlckJ1bmRsZURhdGEucmVuZGVyQ29udGV4dHMgPT09IHVuZGVmaW5lZCApIHJlbmRlckJ1bmRsZURhdGEucmVuZGVyQ29udGV4dHMgPSBuZXcgU2V0KCk7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCBuZWVkc1VwZGF0ZSA9IGJ1bmRsZUdyb3VwLnZlcnNpb24gIT09IHJlbmRlckJ1bmRsZURhdGEudmVyc2lvbjtcclxuXHRcdGNvbnN0IHJlbmRlckJ1bmRsZU5lZWRzVXBkYXRlID0gcmVuZGVyQnVuZGxlRGF0YS5yZW5kZXJDb250ZXh0cy5oYXMoIHJlbmRlckNvbnRleHQgKSA9PT0gZmFsc2UgfHwgbmVlZHNVcGRhdGU7XHJcblxyXG5cdFx0cmVuZGVyQnVuZGxlRGF0YS5yZW5kZXJDb250ZXh0cy5hZGQoIHJlbmRlckNvbnRleHQgKTtcclxuXHJcblx0XHRpZiAoIHJlbmRlckJ1bmRsZU5lZWRzVXBkYXRlICkge1xyXG5cclxuXHRcdFx0dGhpcy5iYWNrZW5kLmJlZ2luQnVuZGxlKCByZW5kZXJDb250ZXh0ICk7XHJcblxyXG5cdFx0XHRpZiAoIHJlbmRlckJ1bmRsZURhdGEucmVuZGVyT2JqZWN0cyA9PT0gdW5kZWZpbmVkIHx8IG5lZWRzVXBkYXRlICkge1xyXG5cclxuXHRcdFx0XHRyZW5kZXJCdW5kbGVEYXRhLnJlbmRlck9iamVjdHMgPSBbXTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuX2N1cnJlbnRSZW5kZXJCdW5kbGUgPSByZW5kZXJCdW5kbGU7XHJcblxyXG5cdFx0XHRjb25zdCB7XHJcblx0XHRcdFx0dHJhbnNwYXJlbnREb3VibGVQYXNzOiB0cmFuc3BhcmVudERvdWJsZVBhc3NPYmplY3RzLFxyXG5cdFx0XHRcdHRyYW5zcGFyZW50OiB0cmFuc3BhcmVudE9iamVjdHMsXHJcblx0XHRcdFx0b3BhcXVlOiBvcGFxdWVPYmplY3RzXHJcblx0XHRcdH0gPSByZW5kZXJMaXN0O1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLm9wYXF1ZSA9PT0gdHJ1ZSAmJiBvcGFxdWVPYmplY3RzLmxlbmd0aCA+IDAgKSB0aGlzLl9yZW5kZXJPYmplY3RzKCBvcGFxdWVPYmplY3RzLCBjYW1lcmEsIHNjZW5lUmVmLCBsaWdodHNOb2RlICk7XHJcblx0XHRcdGlmICggdGhpcy50cmFuc3BhcmVudCA9PT0gdHJ1ZSAmJiB0cmFuc3BhcmVudE9iamVjdHMubGVuZ3RoID4gMCApIHRoaXMuX3JlbmRlclRyYW5zcGFyZW50cyggdHJhbnNwYXJlbnRPYmplY3RzLCB0cmFuc3BhcmVudERvdWJsZVBhc3NPYmplY3RzLCBjYW1lcmEsIHNjZW5lUmVmLCBsaWdodHNOb2RlICk7XHJcblxyXG5cdFx0XHR0aGlzLl9jdXJyZW50UmVuZGVyQnVuZGxlID0gbnVsbDtcclxuXHJcblx0XHRcdC8vXHJcblxyXG5cdFx0XHR0aGlzLmJhY2tlbmQuZmluaXNoQnVuZGxlKCByZW5kZXJDb250ZXh0LCByZW5kZXJCdW5kbGUgKTtcclxuXHJcblx0XHRcdHJlbmRlckJ1bmRsZURhdGEudmVyc2lvbiA9IGJ1bmRsZUdyb3VwLnZlcnNpb247XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGNvbnN0IHsgcmVuZGVyT2JqZWN0cyB9ID0gcmVuZGVyQnVuZGxlRGF0YTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHJlbmRlck9iamVjdHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgcmVuZGVyT2JqZWN0ID0gcmVuZGVyT2JqZWN0c1sgaSBdO1xyXG5cclxuXHRcdFx0XHRpZiAoIHRoaXMuX25vZGVzLm5lZWRzUmVmcmVzaCggcmVuZGVyT2JqZWN0ICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0dGhpcy5fbm9kZXMudXBkYXRlQmVmb3JlKCByZW5kZXJPYmplY3QgKTtcclxuXHJcblx0XHRcdFx0XHR0aGlzLl9ub2Rlcy51cGRhdGVGb3JSZW5kZXIoIHJlbmRlck9iamVjdCApO1xyXG5cdFx0XHRcdFx0dGhpcy5fYmluZGluZ3MudXBkYXRlRm9yUmVuZGVyKCByZW5kZXJPYmplY3QgKTtcclxuXHJcblx0XHRcdFx0XHR0aGlzLl9ub2Rlcy51cGRhdGVBZnRlciggcmVuZGVyT2JqZWN0ICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5iYWNrZW5kLmFkZEJ1bmRsZSggcmVuZGVyQ29udGV4dCwgcmVuZGVyQnVuZGxlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVuZGVycyB0aGUgc2NlbmUgb3IgM0Qgb2JqZWN0IHdpdGggdGhlIGdpdmVuIGNhbWVyYS4gVGhpcyBtZXRob2QgY2FuIG9ubHkgYmUgY2FsbGVkXHJcblx0ICogaWYgdGhlIHJlbmRlcmVyIGhhcyBiZWVuIGluaXRpYWxpemVkLlxyXG5cdCAqXHJcblx0ICogVGhlIHRhcmdldCBvZiB0aGUgbWV0aG9kIGlzIHRoZSBkZWZhdWx0IGZyYW1lYnVmZmVyIChtZWFuaW5nIHRoZSBjYW52YXMpXHJcblx0ICogb3IgYWx0ZXJuYXRpdmVseSBhIHJlbmRlciB0YXJnZXQgd2hlbiBzcGVjaWZpZWQgdmlhIGBzZXRSZW5kZXJUYXJnZXQoKWAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdDNEfSBzY2VuZSAtIFRoZSBzY2VuZSBvciAzRCBvYmplY3QgdG8gcmVuZGVyLlxyXG5cdCAqIEBwYXJhbSB7Q2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIHRvIHJlbmRlciB0aGUgc2NlbmUgd2l0aC5cclxuXHQgKiBAcmV0dXJuIHs/UHJvbWlzZX0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZSB3aGVuIHRoZSBzY2VuZSBoYXMgYmVlbiByZW5kZXJlZC5cclxuXHQgKiBPbmx5IHJldHVybmVkIHdoZW4gdGhlIHJlbmRlcmVyIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZC5cclxuXHQgKi9cclxuXHRyZW5kZXIoIHNjZW5lLCBjYW1lcmEgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9pbml0aWFsaXplZCA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5SZW5kZXJlcjogLnJlbmRlcigpIGNhbGxlZCBiZWZvcmUgdGhlIGJhY2tlbmQgaXMgaW5pdGlhbGl6ZWQuIFRyeSB1c2luZyAucmVuZGVyQXN5bmMoKSBpbnN0ZWFkLicgKTtcclxuXHJcblx0XHRcdHJldHVybiB0aGlzLnJlbmRlckFzeW5jKCBzY2VuZSwgY2FtZXJhICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuX3JlbmRlclNjZW5lKCBzY2VuZSwgY2FtZXJhICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhbiBpbnRlcm5hbCByZW5kZXIgdGFyZ2V0IHdoaWNoIGlzIHVzZWQgd2hlbiBjb21wdXRpbmcgdGhlIG91dHB1dCB0b25lIG1hcHBpbmdcclxuXHQgKiBhbmQgY29sb3Igc3BhY2UgY29udmVyc2lvbi4gVW5saWtlIGluIGBXZWJHTFJlbmRlcmVyYCwgdGhpcyBpcyBkb25lIGluIGEgc2VwYXJhdGUgcmVuZGVyXHJcblx0ICogcGFzcyBhbmQgbm90IGlubGluZSB0byBhY2hpZXZlIG1vcmUgY29ycmVjdCByZXN1bHRzLlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcmV0dXJuIHs/UmVuZGVyVGFyZ2V0fSBUaGUgcmVuZGVyIHRhcmdldC4gVGhlIG1ldGhvZCByZXR1cm5zIGBudWxsYCBpZiBubyBvdXRwdXQgY29udmVyc2lvbiBzaG91bGQgYmUgYXBwbGllZC5cclxuXHQgKi9cclxuXHRfZ2V0RnJhbWVCdWZmZXJUYXJnZXQoKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBjdXJyZW50VG9uZU1hcHBpbmcsIGN1cnJlbnRDb2xvclNwYWNlIH0gPSB0aGlzO1xyXG5cclxuXHRcdGNvbnN0IHVzZVRvbmVNYXBwaW5nID0gY3VycmVudFRvbmVNYXBwaW5nICE9PSBOb1RvbmVNYXBwaW5nO1xyXG5cdFx0Y29uc3QgdXNlQ29sb3JTcGFjZSA9IGN1cnJlbnRDb2xvclNwYWNlICE9PSBMaW5lYXJTUkdCQ29sb3JTcGFjZTtcclxuXHJcblx0XHRpZiAoIHVzZVRvbmVNYXBwaW5nID09PSBmYWxzZSAmJiB1c2VDb2xvclNwYWNlID09PSBmYWxzZSApIHJldHVybiBudWxsO1xyXG5cclxuXHRcdGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gdGhpcy5nZXREcmF3aW5nQnVmZmVyU2l6ZSggX2RyYXdpbmdCdWZmZXJTaXplICk7XHJcblx0XHRjb25zdCB7IGRlcHRoLCBzdGVuY2lsIH0gPSB0aGlzO1xyXG5cclxuXHRcdGxldCBmcmFtZUJ1ZmZlclRhcmdldCA9IHRoaXMuX2ZyYW1lQnVmZmVyVGFyZ2V0O1xyXG5cclxuXHRcdGlmICggZnJhbWVCdWZmZXJUYXJnZXQgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRmcmFtZUJ1ZmZlclRhcmdldCA9IG5ldyBSZW5kZXJUYXJnZXQoIHdpZHRoLCBoZWlnaHQsIHtcclxuXHRcdFx0XHRkZXB0aEJ1ZmZlcjogZGVwdGgsXHJcblx0XHRcdFx0c3RlbmNpbEJ1ZmZlcjogc3RlbmNpbCxcclxuXHRcdFx0XHR0eXBlOiB0aGlzLl9jb2xvckJ1ZmZlclR5cGUsXHJcblx0XHRcdFx0Zm9ybWF0OiBSR0JBRm9ybWF0LFxyXG5cdFx0XHRcdGNvbG9yU3BhY2U6IExpbmVhclNSR0JDb2xvclNwYWNlLFxyXG5cdFx0XHRcdGdlbmVyYXRlTWlwbWFwczogZmFsc2UsXHJcblx0XHRcdFx0bWluRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXHJcblx0XHRcdFx0bWFnRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXHJcblx0XHRcdFx0c2FtcGxlczogdGhpcy5zYW1wbGVzXHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHRcdGZyYW1lQnVmZmVyVGFyZ2V0LmlzUG9zdFByb2Nlc3NpbmdSZW5kZXJUYXJnZXQgPSB0cnVlO1xyXG5cclxuXHRcdFx0dGhpcy5fZnJhbWVCdWZmZXJUYXJnZXQgPSBmcmFtZUJ1ZmZlclRhcmdldDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0ZnJhbWVCdWZmZXJUYXJnZXQuZGVwdGhCdWZmZXIgPSBkZXB0aDtcclxuXHRcdGZyYW1lQnVmZmVyVGFyZ2V0LnN0ZW5jaWxCdWZmZXIgPSBzdGVuY2lsO1xyXG5cdFx0ZnJhbWVCdWZmZXJUYXJnZXQuc2V0U2l6ZSggd2lkdGgsIGhlaWdodCApO1xyXG5cdFx0ZnJhbWVCdWZmZXJUYXJnZXQudmlld3BvcnQuY29weSggdGhpcy5fdmlld3BvcnQgKTtcclxuXHRcdGZyYW1lQnVmZmVyVGFyZ2V0LnNjaXNzb3IuY29weSggdGhpcy5fc2Npc3NvciApO1xyXG5cdFx0ZnJhbWVCdWZmZXJUYXJnZXQudmlld3BvcnQubXVsdGlwbHlTY2FsYXIoIHRoaXMuX3BpeGVsUmF0aW8gKTtcclxuXHRcdGZyYW1lQnVmZmVyVGFyZ2V0LnNjaXNzb3IubXVsdGlwbHlTY2FsYXIoIHRoaXMuX3BpeGVsUmF0aW8gKTtcclxuXHRcdGZyYW1lQnVmZmVyVGFyZ2V0LnNjaXNzb3JUZXN0ID0gdGhpcy5fc2Npc3NvclRlc3Q7XHJcblxyXG5cdFx0cmV0dXJuIGZyYW1lQnVmZmVyVGFyZ2V0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbmRlcnMgdGhlIHNjZW5lIG9yIDNEIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBjYW1lcmEuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0M0R9IHNjZW5lIC0gVGhlIHNjZW5lIG9yIDNEIG9iamVjdCB0byByZW5kZXIuXHJcblx0ICogQHBhcmFtIHtDYW1lcmF9IGNhbWVyYSAtIFRoZSBjYW1lcmEgdG8gcmVuZGVyIHRoZSBzY2VuZSB3aXRoLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW3VzZUZyYW1lQnVmZmVyVGFyZ2V0PXRydWVdIC0gV2hldGhlciB0byB1c2UgYSBmcmFtZWJ1ZmZlciB0YXJnZXQgb3Igbm90LlxyXG5cdCAqIEByZXR1cm4ge1JlbmRlckNvbnRleHR9IFRoZSBjdXJyZW50IHJlbmRlciBjb250ZXh0LlxyXG5cdCAqL1xyXG5cdF9yZW5kZXJTY2VuZSggc2NlbmUsIGNhbWVyYSwgdXNlRnJhbWVCdWZmZXJUYXJnZXQgPSB0cnVlICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5faXNEZXZpY2VMb3N0ID09PSB0cnVlICkgcmV0dXJuO1xyXG5cclxuXHRcdGNvbnN0IGZyYW1lQnVmZmVyVGFyZ2V0ID0gdXNlRnJhbWVCdWZmZXJUYXJnZXQgPyB0aGlzLl9nZXRGcmFtZUJ1ZmZlclRhcmdldCgpIDogbnVsbDtcclxuXHJcblx0XHQvLyBwcmVzZXJ2ZSByZW5kZXIgdHJlZVxyXG5cclxuXHRcdGNvbnN0IG5vZGVGcmFtZSA9IHRoaXMuX25vZGVzLm5vZGVGcmFtZTtcclxuXHJcblx0XHRjb25zdCBwcmV2aW91c1JlbmRlcklkID0gbm9kZUZyYW1lLnJlbmRlcklkO1xyXG5cdFx0Y29uc3QgcHJldmlvdXNSZW5kZXJDb250ZXh0ID0gdGhpcy5fY3VycmVudFJlbmRlckNvbnRleHQ7XHJcblx0XHRjb25zdCBwcmV2aW91c1JlbmRlck9iamVjdEZ1bmN0aW9uID0gdGhpcy5fY3VycmVudFJlbmRlck9iamVjdEZ1bmN0aW9uO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0Y29uc3Qgc2NlbmVSZWYgPSAoIHNjZW5lLmlzU2NlbmUgPT09IHRydWUgKSA/IHNjZW5lIDogX3NjZW5lO1xyXG5cclxuXHRcdGNvbnN0IG91dHB1dFJlbmRlclRhcmdldCA9IHRoaXMuX3JlbmRlclRhcmdldCB8fCB0aGlzLl9vdXRwdXRSZW5kZXJUYXJnZXQ7XHJcblxyXG5cdFx0Y29uc3QgYWN0aXZlQ3ViZUZhY2UgPSB0aGlzLl9hY3RpdmVDdWJlRmFjZTtcclxuXHRcdGNvbnN0IGFjdGl2ZU1pcG1hcExldmVsID0gdGhpcy5fYWN0aXZlTWlwbWFwTGV2ZWw7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRsZXQgcmVuZGVyVGFyZ2V0O1xyXG5cclxuXHRcdGlmICggZnJhbWVCdWZmZXJUYXJnZXQgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRyZW5kZXJUYXJnZXQgPSBmcmFtZUJ1ZmZlclRhcmdldDtcclxuXHJcblx0XHRcdHRoaXMuc2V0UmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0cmVuZGVyVGFyZ2V0ID0gb3V0cHV0UmVuZGVyVGFyZ2V0O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGNvbnN0IHJlbmRlckNvbnRleHQgPSB0aGlzLl9yZW5kZXJDb250ZXh0cy5nZXQoIHNjZW5lLCBjYW1lcmEsIHJlbmRlclRhcmdldCApO1xyXG5cclxuXHRcdHRoaXMuX2N1cnJlbnRSZW5kZXJDb250ZXh0ID0gcmVuZGVyQ29udGV4dDtcclxuXHRcdHRoaXMuX2N1cnJlbnRSZW5kZXJPYmplY3RGdW5jdGlvbiA9IHRoaXMuX3JlbmRlck9iamVjdEZ1bmN0aW9uIHx8IHRoaXMucmVuZGVyT2JqZWN0O1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0dGhpcy5pbmZvLmNhbGxzICsrO1xyXG5cdFx0dGhpcy5pbmZvLnJlbmRlci5jYWxscyArKztcclxuXHRcdHRoaXMuaW5mby5yZW5kZXIuZnJhbWVDYWxscyArKztcclxuXHJcblx0XHRub2RlRnJhbWUucmVuZGVySWQgPSB0aGlzLmluZm8uY2FsbHM7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCBjb29yZGluYXRlU3lzdGVtID0gdGhpcy5jb29yZGluYXRlU3lzdGVtO1xyXG5cdFx0Y29uc3QgeHIgPSB0aGlzLnhyO1xyXG5cclxuXHRcdGlmICggY2FtZXJhLmNvb3JkaW5hdGVTeXN0ZW0gIT09IGNvb3JkaW5hdGVTeXN0ZW0gJiYgeHIuaXNQcmVzZW50aW5nID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdGNhbWVyYS5jb29yZGluYXRlU3lzdGVtID0gY29vcmRpbmF0ZVN5c3RlbTtcclxuXHRcdFx0Y2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcclxuXHJcblx0XHRcdGlmICggY2FtZXJhLmlzQXJyYXlDYW1lcmEgKSB7XHJcblxyXG5cdFx0XHRcdGZvciAoIGNvbnN0IHN1YkNhbWVyYSBvZiBjYW1lcmEuY2FtZXJhcyApIHtcclxuXHJcblx0XHRcdFx0XHRzdWJDYW1lcmEuY29vcmRpbmF0ZVN5c3RlbSA9IGNvb3JkaW5hdGVTeXN0ZW07XHJcblx0XHRcdFx0XHRzdWJDYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0aWYgKCBzY2VuZS5tYXRyaXhXb3JsZEF1dG9VcGRhdGUgPT09IHRydWUgKSBzY2VuZS51cGRhdGVNYXRyaXhXb3JsZCgpO1xyXG5cclxuXHRcdGlmICggY2FtZXJhLnBhcmVudCA9PT0gbnVsbCAmJiBjYW1lcmEubWF0cml4V29ybGRBdXRvVXBkYXRlID09PSB0cnVlICkgY2FtZXJhLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XHJcblxyXG5cdFx0aWYgKCB4ci5lbmFibGVkID09PSB0cnVlICYmIHhyLmlzUHJlc2VudGluZyA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdGlmICggeHIuY2FtZXJhQXV0b1VwZGF0ZSA9PT0gdHJ1ZSApIHhyLnVwZGF0ZUNhbWVyYSggY2FtZXJhICk7XHJcblx0XHRcdGNhbWVyYSA9IHhyLmdldENhbWVyYSgpOyAvLyB1c2UgWFIgY2FtZXJhIGZvciByZW5kZXJpbmdcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRsZXQgdmlld3BvcnQgPSB0aGlzLl92aWV3cG9ydDtcclxuXHRcdGxldCBzY2lzc29yID0gdGhpcy5fc2Npc3NvcjtcclxuXHRcdGxldCBwaXhlbFJhdGlvID0gdGhpcy5fcGl4ZWxSYXRpbztcclxuXHJcblx0XHRpZiAoIHJlbmRlclRhcmdldCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHZpZXdwb3J0ID0gcmVuZGVyVGFyZ2V0LnZpZXdwb3J0O1xyXG5cdFx0XHRzY2lzc29yID0gcmVuZGVyVGFyZ2V0LnNjaXNzb3I7XHJcblx0XHRcdHBpeGVsUmF0aW8gPSAxO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmdldERyYXdpbmdCdWZmZXJTaXplKCBfZHJhd2luZ0J1ZmZlclNpemUgKTtcclxuXHJcblx0XHRfc2NyZWVuLnNldCggMCwgMCwgX2RyYXdpbmdCdWZmZXJTaXplLndpZHRoLCBfZHJhd2luZ0J1ZmZlclNpemUuaGVpZ2h0ICk7XHJcblxyXG5cdFx0Y29uc3QgbWluRGVwdGggPSAoIHZpZXdwb3J0Lm1pbkRlcHRoID09PSB1bmRlZmluZWQgKSA/IDAgOiB2aWV3cG9ydC5taW5EZXB0aDtcclxuXHRcdGNvbnN0IG1heERlcHRoID0gKCB2aWV3cG9ydC5tYXhEZXB0aCA9PT0gdW5kZWZpbmVkICkgPyAxIDogdmlld3BvcnQubWF4RGVwdGg7XHJcblxyXG5cdFx0cmVuZGVyQ29udGV4dC52aWV3cG9ydFZhbHVlLmNvcHkoIHZpZXdwb3J0ICkubXVsdGlwbHlTY2FsYXIoIHBpeGVsUmF0aW8gKS5mbG9vcigpO1xyXG5cdFx0cmVuZGVyQ29udGV4dC52aWV3cG9ydFZhbHVlLndpZHRoID4+PSBhY3RpdmVNaXBtYXBMZXZlbDtcclxuXHRcdHJlbmRlckNvbnRleHQudmlld3BvcnRWYWx1ZS5oZWlnaHQgPj49IGFjdGl2ZU1pcG1hcExldmVsO1xyXG5cdFx0cmVuZGVyQ29udGV4dC52aWV3cG9ydFZhbHVlLm1pbkRlcHRoID0gbWluRGVwdGg7XHJcblx0XHRyZW5kZXJDb250ZXh0LnZpZXdwb3J0VmFsdWUubWF4RGVwdGggPSBtYXhEZXB0aDtcclxuXHRcdHJlbmRlckNvbnRleHQudmlld3BvcnQgPSByZW5kZXJDb250ZXh0LnZpZXdwb3J0VmFsdWUuZXF1YWxzKCBfc2NyZWVuICkgPT09IGZhbHNlO1xyXG5cclxuXHRcdHJlbmRlckNvbnRleHQuc2Npc3NvclZhbHVlLmNvcHkoIHNjaXNzb3IgKS5tdWx0aXBseVNjYWxhciggcGl4ZWxSYXRpbyApLmZsb29yKCk7XHJcblx0XHRyZW5kZXJDb250ZXh0LnNjaXNzb3IgPSB0aGlzLl9zY2lzc29yVGVzdCAmJiByZW5kZXJDb250ZXh0LnNjaXNzb3JWYWx1ZS5lcXVhbHMoIF9zY3JlZW4gKSA9PT0gZmFsc2U7XHJcblx0XHRyZW5kZXJDb250ZXh0LnNjaXNzb3JWYWx1ZS53aWR0aCA+Pj0gYWN0aXZlTWlwbWFwTGV2ZWw7XHJcblx0XHRyZW5kZXJDb250ZXh0LnNjaXNzb3JWYWx1ZS5oZWlnaHQgPj49IGFjdGl2ZU1pcG1hcExldmVsO1xyXG5cclxuXHRcdGlmICggISByZW5kZXJDb250ZXh0LmNsaXBwaW5nQ29udGV4dCApIHJlbmRlckNvbnRleHQuY2xpcHBpbmdDb250ZXh0ID0gbmV3IENsaXBwaW5nQ29udGV4dCgpO1xyXG5cdFx0cmVuZGVyQ29udGV4dC5jbGlwcGluZ0NvbnRleHQudXBkYXRlR2xvYmFsKCBzY2VuZVJlZiwgY2FtZXJhICk7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRzY2VuZVJlZi5vbkJlZm9yZVJlbmRlciggdGhpcywgc2NlbmUsIGNhbWVyYSwgcmVuZGVyVGFyZ2V0ICk7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRfcHJvalNjcmVlbk1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeCwgY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSApO1xyXG5cdFx0X2ZydXN0dW0uc2V0RnJvbVByb2plY3Rpb25NYXRyaXgoIF9wcm9qU2NyZWVuTWF0cml4LCBjb29yZGluYXRlU3lzdGVtICk7XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyTGlzdCA9IHRoaXMuX3JlbmRlckxpc3RzLmdldCggc2NlbmUsIGNhbWVyYSApO1xyXG5cdFx0cmVuZGVyTGlzdC5iZWdpbigpO1xyXG5cclxuXHRcdHRoaXMuX3Byb2plY3RPYmplY3QoIHNjZW5lLCBjYW1lcmEsIDAsIHJlbmRlckxpc3QsIHJlbmRlckNvbnRleHQuY2xpcHBpbmdDb250ZXh0ICk7XHJcblxyXG5cdFx0cmVuZGVyTGlzdC5maW5pc2goKTtcclxuXHJcblx0XHRpZiAoIHRoaXMuc29ydE9iamVjdHMgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRyZW5kZXJMaXN0LnNvcnQoIHRoaXMuX29wYXF1ZVNvcnQsIHRoaXMuX3RyYW5zcGFyZW50U29ydCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGlmICggcmVuZGVyVGFyZ2V0ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5fdGV4dHVyZXMudXBkYXRlUmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQsIGFjdGl2ZU1pcG1hcExldmVsICk7XHJcblxyXG5cdFx0XHRjb25zdCByZW5kZXJUYXJnZXREYXRhID0gdGhpcy5fdGV4dHVyZXMuZ2V0KCByZW5kZXJUYXJnZXQgKTtcclxuXHJcblx0XHRcdHJlbmRlckNvbnRleHQudGV4dHVyZXMgPSByZW5kZXJUYXJnZXREYXRhLnRleHR1cmVzO1xyXG5cdFx0XHRyZW5kZXJDb250ZXh0LmRlcHRoVGV4dHVyZSA9IHJlbmRlclRhcmdldERhdGEuZGVwdGhUZXh0dXJlO1xyXG5cdFx0XHRyZW5kZXJDb250ZXh0LndpZHRoID0gcmVuZGVyVGFyZ2V0RGF0YS53aWR0aDtcclxuXHRcdFx0cmVuZGVyQ29udGV4dC5oZWlnaHQgPSByZW5kZXJUYXJnZXREYXRhLmhlaWdodDtcclxuXHRcdFx0cmVuZGVyQ29udGV4dC5yZW5kZXJUYXJnZXQgPSByZW5kZXJUYXJnZXQ7XHJcblx0XHRcdHJlbmRlckNvbnRleHQuZGVwdGggPSByZW5kZXJUYXJnZXQuZGVwdGhCdWZmZXI7XHJcblx0XHRcdHJlbmRlckNvbnRleHQuc3RlbmNpbCA9IHJlbmRlclRhcmdldC5zdGVuY2lsQnVmZmVyO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRyZW5kZXJDb250ZXh0LnRleHR1cmVzID0gbnVsbDtcclxuXHRcdFx0cmVuZGVyQ29udGV4dC5kZXB0aFRleHR1cmUgPSBudWxsO1xyXG5cdFx0XHRyZW5kZXJDb250ZXh0LndpZHRoID0gdGhpcy5kb21FbGVtZW50LndpZHRoO1xyXG5cdFx0XHRyZW5kZXJDb250ZXh0LmhlaWdodCA9IHRoaXMuZG9tRWxlbWVudC5oZWlnaHQ7XHJcblx0XHRcdHJlbmRlckNvbnRleHQuZGVwdGggPSB0aGlzLmRlcHRoO1xyXG5cdFx0XHRyZW5kZXJDb250ZXh0LnN0ZW5jaWwgPSB0aGlzLnN0ZW5jaWw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJlbmRlckNvbnRleHQud2lkdGggPj49IGFjdGl2ZU1pcG1hcExldmVsO1xyXG5cdFx0cmVuZGVyQ29udGV4dC5oZWlnaHQgPj49IGFjdGl2ZU1pcG1hcExldmVsO1xyXG5cdFx0cmVuZGVyQ29udGV4dC5hY3RpdmVDdWJlRmFjZSA9IGFjdGl2ZUN1YmVGYWNlO1xyXG5cdFx0cmVuZGVyQ29udGV4dC5hY3RpdmVNaXBtYXBMZXZlbCA9IGFjdGl2ZU1pcG1hcExldmVsO1xyXG5cdFx0cmVuZGVyQ29udGV4dC5vY2NsdXNpb25RdWVyeUNvdW50ID0gcmVuZGVyTGlzdC5vY2NsdXNpb25RdWVyeUNvdW50O1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0dGhpcy5fYmFja2dyb3VuZC51cGRhdGUoIHNjZW5lUmVmLCByZW5kZXJMaXN0LCByZW5kZXJDb250ZXh0ICk7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHR0aGlzLmJhY2tlbmQuYmVnaW5SZW5kZXIoIHJlbmRlckNvbnRleHQgKTtcclxuXHJcblx0XHQvLyBwcm9jZXNzIHJlbmRlciBsaXN0c1xyXG5cclxuXHRcdGNvbnN0IHtcclxuXHRcdFx0YnVuZGxlcyxcclxuXHRcdFx0bGlnaHRzTm9kZSxcclxuXHRcdFx0dHJhbnNwYXJlbnREb3VibGVQYXNzOiB0cmFuc3BhcmVudERvdWJsZVBhc3NPYmplY3RzLFxyXG5cdFx0XHR0cmFuc3BhcmVudDogdHJhbnNwYXJlbnRPYmplY3RzLFxyXG5cdFx0XHRvcGFxdWU6IG9wYXF1ZU9iamVjdHNcclxuXHRcdH0gPSByZW5kZXJMaXN0O1xyXG5cclxuXHRcdGlmICggYnVuZGxlcy5sZW5ndGggPiAwICkgdGhpcy5fcmVuZGVyQnVuZGxlcyggYnVuZGxlcywgc2NlbmVSZWYsIGxpZ2h0c05vZGUgKTtcclxuXHRcdGlmICggdGhpcy5vcGFxdWUgPT09IHRydWUgJiYgb3BhcXVlT2JqZWN0cy5sZW5ndGggPiAwICkgdGhpcy5fcmVuZGVyT2JqZWN0cyggb3BhcXVlT2JqZWN0cywgY2FtZXJhLCBzY2VuZVJlZiwgbGlnaHRzTm9kZSApO1xyXG5cdFx0aWYgKCB0aGlzLnRyYW5zcGFyZW50ID09PSB0cnVlICYmIHRyYW5zcGFyZW50T2JqZWN0cy5sZW5ndGggPiAwICkgdGhpcy5fcmVuZGVyVHJhbnNwYXJlbnRzKCB0cmFuc3BhcmVudE9iamVjdHMsIHRyYW5zcGFyZW50RG91YmxlUGFzc09iamVjdHMsIGNhbWVyYSwgc2NlbmVSZWYsIGxpZ2h0c05vZGUgKTtcclxuXHJcblx0XHQvLyBmaW5pc2ggcmVuZGVyIHBhc3NcclxuXHJcblx0XHR0aGlzLmJhY2tlbmQuZmluaXNoUmVuZGVyKCByZW5kZXJDb250ZXh0ICk7XHJcblxyXG5cdFx0Ly8gcmVzdG9yZSByZW5kZXIgdHJlZVxyXG5cclxuXHRcdG5vZGVGcmFtZS5yZW5kZXJJZCA9IHByZXZpb3VzUmVuZGVySWQ7XHJcblxyXG5cdFx0dGhpcy5fY3VycmVudFJlbmRlckNvbnRleHQgPSBwcmV2aW91c1JlbmRlckNvbnRleHQ7XHJcblx0XHR0aGlzLl9jdXJyZW50UmVuZGVyT2JqZWN0RnVuY3Rpb24gPSBwcmV2aW91c1JlbmRlck9iamVjdEZ1bmN0aW9uO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0aWYgKCBmcmFtZUJ1ZmZlclRhcmdldCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuc2V0UmVuZGVyVGFyZ2V0KCBvdXRwdXRSZW5kZXJUYXJnZXQsIGFjdGl2ZUN1YmVGYWNlLCBhY3RpdmVNaXBtYXBMZXZlbCApO1xyXG5cclxuXHRcdFx0dGhpcy5fcmVuZGVyT3V0cHV0KCByZW5kZXJUYXJnZXQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRzY2VuZVJlZi5vbkFmdGVyUmVuZGVyKCB0aGlzLCBzY2VuZSwgY2FtZXJhLCByZW5kZXJUYXJnZXQgKTtcclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdHJldHVybiByZW5kZXJDb250ZXh0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBvdXRwdXQgcGFzcyBwZXJmb3JtcyB0b25lIG1hcHBpbmcgYW5kIGNvbG9yIHNwYWNlIGNvbnZlcnNpb24uXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyVGFyZ2V0fSByZW5kZXJUYXJnZXQgLSBUaGUgY3VycmVudCByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqL1xyXG5cdF9yZW5kZXJPdXRwdXQoIHJlbmRlclRhcmdldCApIHtcclxuXHJcblx0XHRjb25zdCBxdWFkID0gdGhpcy5fcXVhZDtcclxuXHJcblx0XHRpZiAoIHRoaXMuX25vZGVzLmhhc091dHB1dENoYW5nZSggcmVuZGVyVGFyZ2V0LnRleHR1cmUgKSApIHtcclxuXHJcblx0XHRcdHF1YWQubWF0ZXJpYWwuZnJhZ21lbnROb2RlID0gdGhpcy5fbm9kZXMuZ2V0T3V0cHV0Tm9kZSggcmVuZGVyVGFyZ2V0LnRleHR1cmUgKTtcclxuXHRcdFx0cXVhZC5tYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGEgY2xlYXIgb3BlcmF0aW9uIGNsZWFycyB0aGUgaW50ZXJtZWRpYXRlIHJlbmRlclRhcmdldCB0ZXh0dXJlLCBidXQgc2hvdWxkIG5vdCB1cGRhdGUgdGhlIHNjcmVlbiBjYW52YXMuXHJcblxyXG5cdFx0Y29uc3QgY3VycmVudEF1dG9DbGVhciA9IHRoaXMuYXV0b0NsZWFyO1xyXG5cdFx0Y29uc3QgY3VycmVudFhSID0gdGhpcy54ci5lbmFibGVkO1xyXG5cclxuXHRcdHRoaXMuYXV0b0NsZWFyID0gZmFsc2U7XHJcblx0XHR0aGlzLnhyLmVuYWJsZWQgPSBmYWxzZTtcclxuXHJcblx0XHR0aGlzLl9yZW5kZXJTY2VuZSggcXVhZCwgcXVhZC5jYW1lcmEsIGZhbHNlICk7XHJcblxyXG5cdFx0dGhpcy5hdXRvQ2xlYXIgPSBjdXJyZW50QXV0b0NsZWFyO1xyXG5cdFx0dGhpcy54ci5lbmFibGVkID0gY3VycmVudFhSO1xyXG5cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIGF2YWlsYWJsZSBhbmlzb3Ryb3B5IGZvciB0ZXh0dXJlIGZpbHRlcmluZy5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIG1heGltdW0gYXZhaWxhYmxlIGFuaXNvdHJvcHkuXHJcblx0ICovXHJcblx0Z2V0TWF4QW5pc290cm9weSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5iYWNrZW5kLmdldE1heEFuaXNvdHJvcHkoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBhY3RpdmUgY3ViZSBmYWNlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgYWN0aXZlIGN1YmUgZmFjZS5cclxuXHQgKi9cclxuXHRnZXRBY3RpdmVDdWJlRmFjZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fYWN0aXZlQ3ViZUZhY2U7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgYWN0aXZlIG1pcG1hcCBsZXZlbC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGFjdGl2ZSBtaXBtYXAgbGV2ZWwuXHJcblx0ICovXHJcblx0Z2V0QWN0aXZlTWlwbWFwTGV2ZWwoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX2FjdGl2ZU1pcG1hcExldmVsO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFwcGxpY2F0aW9ucyBhcmUgYWR2aXNlZCB0byBhbHdheXMgZGVmaW5lIHRoZSBhbmltYXRpb24gbG9vcFxyXG5cdCAqIHdpdGggdGhpcyBtZXRob2QgYW5kIG5vdCBtYW51YWxseSB3aXRoIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKWBcclxuXHQgKiBmb3IgYmVzdCBjb21wYXRpYmlsaXR5LlxyXG5cdCAqXHJcblx0ICogQGFzeW5jXHJcblx0ICogQHBhcmFtIHs/RnVuY3Rpb259IGNhbGxiYWNrIC0gVGhlIGFwcGxpY2F0aW9uJ3MgYW5pbWF0aW9uIGxvb3AuXHJcblx0ICogQHJldHVybiB7UHJvbWlzZX0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgc2V0IGhhcyBiZWVuIGV4ZWN1dGVkLlxyXG5cdCAqL1xyXG5cdGFzeW5jIHNldEFuaW1hdGlvbkxvb3AoIGNhbGxiYWNrICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5faW5pdGlhbGl6ZWQgPT09IGZhbHNlICkgYXdhaXQgdGhpcy5pbml0KCk7XHJcblxyXG5cdFx0dGhpcy5fYW5pbWF0aW9uLnNldEFuaW1hdGlvbkxvb3AoIGNhbGxiYWNrICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2FuIGJlIHVzZWQgdG8gdHJhbnNmZXIgYnVmZmVyIGRhdGEgZnJvbSBhIHN0b3JhZ2UgYnVmZmVyIGF0dHJpYnV0ZVxyXG5cdCAqIGZyb20gdGhlIEdQVSB0byB0aGUgQ1BVIGluIGNvbnRleHQgb2YgY29tcHV0ZSBzaGFkZXJzLlxyXG5cdCAqXHJcblx0ICogQGFzeW5jXHJcblx0ICogQHBhcmFtIHtTdG9yYWdlQnVmZmVyQXR0cmlidXRlfSBhdHRyaWJ1dGUgLSBUaGUgc3RvcmFnZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqIEByZXR1cm4ge1Byb21pc2U8QXJyYXlCdWZmZXI+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBidWZmZXIgZGF0YSB3aGVuIHRoZSBkYXRhIGFyZSByZWFkeS5cclxuXHQgKi9cclxuXHRhc3luYyBnZXRBcnJheUJ1ZmZlckFzeW5jKCBhdHRyaWJ1dGUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIGF3YWl0IHRoaXMuYmFja2VuZC5nZXRBcnJheUJ1ZmZlckFzeW5jKCBhdHRyaWJ1dGUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSByZW5kZXJpbmcgY29udGV4dC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0dQVUNhbnZhc0NvbnRleHR8V2ViR0wyUmVuZGVyaW5nQ29udGV4dH0gVGhlIHJlbmRlcmluZyBjb250ZXh0LlxyXG5cdCAqL1xyXG5cdGdldENvbnRleHQoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuYmFja2VuZC5nZXRDb250ZXh0KCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgcGl4ZWwgcmF0aW8uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBwaXhlbCByYXRpby5cclxuXHQgKi9cclxuXHRnZXRQaXhlbFJhdGlvKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9waXhlbFJhdGlvO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGRyYXdpbmcgYnVmZmVyIHNpemUgaW4gcGh5c2ljYWwgcGl4ZWxzLiBUaGlzIG1ldGhvZCBob25vcnMgdGhlIHBpeGVsIHJhdGlvLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSB0YXJnZXQgLSBUaGUgbWV0aG9kIHdyaXRlcyB0aGUgcmVzdWx0IGluIHRoaXMgdGFyZ2V0IG9iamVjdC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBUaGUgZHJhd2luZyBidWZmZXIgc2l6ZS5cclxuXHQgKi9cclxuXHRnZXREcmF3aW5nQnVmZmVyU2l6ZSggdGFyZ2V0ICkge1xyXG5cclxuXHRcdHJldHVybiB0YXJnZXQuc2V0KCB0aGlzLl93aWR0aCAqIHRoaXMuX3BpeGVsUmF0aW8sIHRoaXMuX2hlaWdodCAqIHRoaXMuX3BpeGVsUmF0aW8gKS5mbG9vcigpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHJlbmRlcmVyJ3Mgc2l6ZSBpbiBsb2dpY2FsIHBpeGVscy4gVGhpcyBtZXRob2QgZG9lcyBub3QgaG9ub3IgdGhlIHBpeGVsIHJhdGlvLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSB0YXJnZXQgLSBUaGUgbWV0aG9kIHdyaXRlcyB0aGUgcmVzdWx0IGluIHRoaXMgdGFyZ2V0IG9iamVjdC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBUaGUgcmVuZGVyZXIncyBzaXplIGluIGxvZ2ljYWwgcGl4ZWxzLlxyXG5cdCAqL1xyXG5cdGdldFNpemUoIHRhcmdldCApIHtcclxuXHJcblx0XHRyZXR1cm4gdGFyZ2V0LnNldCggdGhpcy5fd2lkdGgsIHRoaXMuX2hlaWdodCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGdpdmVuIHBpeGVsIHJhdGlvIGFuZCByZXNpemVzIHRoZSBjYW52YXMgaWYgbmVjZXNzYXJ5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt2YWx1ZT0xXSAtIFRoZSBwaXhlbCByYXRpby5cclxuXHQgKi9cclxuXHRzZXRQaXhlbFJhdGlvKCB2YWx1ZSA9IDEgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9waXhlbFJhdGlvID09PSB2YWx1ZSApIHJldHVybjtcclxuXHJcblx0XHR0aGlzLl9waXhlbFJhdGlvID0gdmFsdWU7XHJcblxyXG5cdFx0dGhpcy5zZXRTaXplKCB0aGlzLl93aWR0aCwgdGhpcy5faGVpZ2h0LCBmYWxzZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGFsbG93cyB0byBkZWZpbmUgdGhlIGRyYXdpbmcgYnVmZmVyIHNpemUgYnkgc3BlY2lmeWluZ1xyXG5cdCAqIHdpZHRoLCBoZWlnaHQgYW5kIHBpeGVsIHJhdGlvIGFsbCBhdCBvbmNlLiBUaGUgc2l6ZSBvZiB0aGUgZHJhd2luZ1xyXG5cdCAqIGJ1ZmZlciBpcyBjb21wdXRlZCB3aXRoIHRoaXMgZm9ybXVsYTpcclxuXHQgKiBgYGBqc1xyXG5cdCAqIHNpemUueCA9IHdpZHRoICogcGl4ZWxSYXRpbztcclxuXHQgKiBzaXplLnkgPSBoZWlnaHQgKiBwaXhlbFJhdGlvO1xyXG5cdCAqIGBgYFxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIGluIGxvZ2ljYWwgcGl4ZWxzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IGluIGxvZ2ljYWwgcGl4ZWxzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBwaXhlbFJhdGlvIC0gVGhlIHBpeGVsIHJhdGlvLlxyXG5cdCAqL1xyXG5cdHNldERyYXdpbmdCdWZmZXJTaXplKCB3aWR0aCwgaGVpZ2h0LCBwaXhlbFJhdGlvICkge1xyXG5cclxuXHRcdC8vIFJlbmRlcmVyIGNhbid0IGJlIHJlc2l6ZWQgd2hpbGUgcHJlc2VudGluZyBpbiBYUi5cclxuXHRcdGlmICggdGhpcy54ciAmJiB0aGlzLnhyLmlzUHJlc2VudGluZyApIHJldHVybjtcclxuXHJcblx0XHR0aGlzLl93aWR0aCA9IHdpZHRoO1xyXG5cdFx0dGhpcy5faGVpZ2h0ID0gaGVpZ2h0O1xyXG5cclxuXHRcdHRoaXMuX3BpeGVsUmF0aW8gPSBwaXhlbFJhdGlvO1xyXG5cclxuXHRcdHRoaXMuZG9tRWxlbWVudC53aWR0aCA9IE1hdGguZmxvb3IoIHdpZHRoICogcGl4ZWxSYXRpbyApO1xyXG5cdFx0dGhpcy5kb21FbGVtZW50LmhlaWdodCA9IE1hdGguZmxvb3IoIGhlaWdodCAqIHBpeGVsUmF0aW8gKTtcclxuXHJcblx0XHR0aGlzLnNldFZpZXdwb3J0KCAwLCAwLCB3aWR0aCwgaGVpZ2h0ICk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9pbml0aWFsaXplZCApIHRoaXMuYmFja2VuZC51cGRhdGVTaXplKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgc2l6ZSBvZiB0aGUgcmVuZGVyZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggaW4gbG9naWNhbCBwaXhlbHMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgaW4gbG9naWNhbCBwaXhlbHMuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbdXBkYXRlU3R5bGU9dHJ1ZV0gLSBXaGV0aGVyIHRvIHVwZGF0ZSB0aGUgYHN0eWxlYCBhdHRyaWJ1dGUgb2YgdGhlIGNhbnZhcyBvciBub3QuXHJcblx0ICovXHJcblx0c2V0U2l6ZSggd2lkdGgsIGhlaWdodCwgdXBkYXRlU3R5bGUgPSB0cnVlICkge1xyXG5cclxuXHRcdC8vIFJlbmRlcmVyIGNhbid0IGJlIHJlc2l6ZWQgd2hpbGUgcHJlc2VudGluZyBpbiBYUi5cclxuXHRcdGlmICggdGhpcy54ciAmJiB0aGlzLnhyLmlzUHJlc2VudGluZyApIHJldHVybjtcclxuXHJcblx0XHR0aGlzLl93aWR0aCA9IHdpZHRoO1xyXG5cdFx0dGhpcy5faGVpZ2h0ID0gaGVpZ2h0O1xyXG5cclxuXHRcdHRoaXMuZG9tRWxlbWVudC53aWR0aCA9IE1hdGguZmxvb3IoIHdpZHRoICogdGhpcy5fcGl4ZWxSYXRpbyApO1xyXG5cdFx0dGhpcy5kb21FbGVtZW50LmhlaWdodCA9IE1hdGguZmxvb3IoIGhlaWdodCAqIHRoaXMuX3BpeGVsUmF0aW8gKTtcclxuXHJcblx0XHRpZiAoIHVwZGF0ZVN0eWxlID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0dGhpcy5kb21FbGVtZW50LnN0eWxlLndpZHRoID0gd2lkdGggKyAncHgnO1xyXG5cdFx0XHR0aGlzLmRvbUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5zZXRWaWV3cG9ydCggMCwgMCwgd2lkdGgsIGhlaWdodCApO1xyXG5cclxuXHRcdGlmICggdGhpcy5faW5pdGlhbGl6ZWQgKSB0aGlzLmJhY2tlbmQudXBkYXRlU2l6ZSgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgYSBtYW51YWwgc29ydCBmdW5jdGlvbiBmb3IgdGhlIG9wYXF1ZSByZW5kZXIgbGlzdC5cclxuXHQgKiBQYXNzIGBudWxsYCB0byB1c2UgdGhlIGRlZmF1bHQgc29ydC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IG1ldGhvZCAtIFRoZSBzb3J0IGZ1bmN0aW9uLlxyXG5cdCAqL1xyXG5cdHNldE9wYXF1ZVNvcnQoIG1ldGhvZCApIHtcclxuXHJcblx0XHR0aGlzLl9vcGFxdWVTb3J0ID0gbWV0aG9kO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgYSBtYW51YWwgc29ydCBmdW5jdGlvbiBmb3IgdGhlIHRyYW5zcGFyZW50IHJlbmRlciBsaXN0LlxyXG5cdCAqIFBhc3MgYG51bGxgIHRvIHVzZSB0aGUgZGVmYXVsdCBzb3J0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gbWV0aG9kIC0gVGhlIHNvcnQgZnVuY3Rpb24uXHJcblx0ICovXHJcblx0c2V0VHJhbnNwYXJlbnRTb3J0KCBtZXRob2QgKSB7XHJcblxyXG5cdFx0dGhpcy5fdHJhbnNwYXJlbnRTb3J0ID0gbWV0aG9kO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHNjaXNzb3IgcmVjdGFuZ2xlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3I0fSB0YXJnZXQgLSBUaGUgbWV0aG9kIHdyaXRlcyB0aGUgcmVzdWx0IGluIHRoaXMgdGFyZ2V0IG9iamVjdC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3I0fSBUaGUgc2Npc3NvciByZWN0YW5nbGUuXHJcblx0ICovXHJcblx0Z2V0U2Npc3NvciggdGFyZ2V0ICkge1xyXG5cclxuXHRcdGNvbnN0IHNjaXNzb3IgPSB0aGlzLl9zY2lzc29yO1xyXG5cclxuXHRcdHRhcmdldC54ID0gc2Npc3Nvci54O1xyXG5cdFx0dGFyZ2V0LnkgPSBzY2lzc29yLnk7XHJcblx0XHR0YXJnZXQud2lkdGggPSBzY2lzc29yLndpZHRoO1xyXG5cdFx0dGFyZ2V0LmhlaWdodCA9IHNjaXNzb3IuaGVpZ2h0O1xyXG5cclxuXHRcdHJldHVybiB0YXJnZXQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVmaW5lcyB0aGUgc2Npc3NvciByZWN0YW5nbGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlciB8IFZlY3RvcjR9IHggLSBUaGUgaG9yaXpvbnRhbCBjb29yZGluYXRlIGZvciB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIGJveCBpbiBsb2dpY2FsIHBpeGVsIHVuaXQuXHJcblx0ICogSW5zdGVhZCBvZiBwYXNzaW5nIGZvdXIgYXJndW1lbnRzLCB0aGUgbWV0aG9kIGFsc28gd29ya3Mgd2l0aCBhIHNpbmdsZSBmb3VyLWRpbWVuc2lvbmFsIHZlY3Rvci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB2ZXJ0aWNhbCBjb29yZGluYXRlIGZvciB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIGJveCBpbiBsb2dpY2FsIHBpeGVsIHVuaXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSBzY2lzc29yIGJveCBpbiBsb2dpY2FsIHBpeGVsIHVuaXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIHNjaXNzb3IgYm94IGluIGxvZ2ljYWwgcGl4ZWwgdW5pdC5cclxuXHQgKi9cclxuXHRzZXRTY2lzc29yKCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICkge1xyXG5cclxuXHRcdGNvbnN0IHNjaXNzb3IgPSB0aGlzLl9zY2lzc29yO1xyXG5cclxuXHRcdGlmICggeC5pc1ZlY3RvcjQgKSB7XHJcblxyXG5cdFx0XHRzY2lzc29yLmNvcHkoIHggKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0c2Npc3Nvci5zZXQoIHgsIHksIHdpZHRoLCBoZWlnaHQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgc2Npc3NvciB0ZXN0IHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgc2Npc3NvciB0ZXN0IHNob3VsZCBiZSBlbmFibGVkIG9yIG5vdC5cclxuXHQgKi9cclxuXHRnZXRTY2lzc29yVGVzdCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fc2Npc3NvclRlc3Q7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVmaW5lcyB0aGUgc2Npc3NvciB0ZXN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBib29sZWFuIC0gV2hldGhlciB0aGUgc2Npc3NvciB0ZXN0IHNob3VsZCBiZSBlbmFibGVkIG9yIG5vdC5cclxuXHQgKi9cclxuXHRzZXRTY2lzc29yVGVzdCggYm9vbGVhbiApIHtcclxuXHJcblx0XHR0aGlzLl9zY2lzc29yVGVzdCA9IGJvb2xlYW47XHJcblxyXG5cdFx0dGhpcy5iYWNrZW5kLnNldFNjaXNzb3JUZXN0KCBib29sZWFuICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgdmlld3BvcnQgZGVmaW5pdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yNH0gdGFyZ2V0IC0gVGhlIG1ldGhvZCB3cml0ZXMgdGhlIHJlc3VsdCBpbiB0aGlzIHRhcmdldCBvYmplY3QuXHJcblx0ICogQHJldHVybiB7VmVjdG9yNH0gVGhlIHZpZXdwb3J0IGRlZmluaXRpb24uXHJcblx0ICovXHJcblx0Z2V0Vmlld3BvcnQoIHRhcmdldCApIHtcclxuXHJcblx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIHRoaXMuX3ZpZXdwb3J0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVmaW5lcyB0aGUgdmlld3BvcnQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlciB8IFZlY3RvcjR9IHggLSBUaGUgaG9yaXpvbnRhbCBjb29yZGluYXRlIGZvciB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHZpZXdwb3J0IG9yaWdpbiBpbiBsb2dpY2FsIHBpeGVsIHVuaXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmVydGljYWwgY29vcmRpbmF0ZSBmb3IgdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSB2aWV3cG9ydCBvcmlnaW4gIGluIGxvZ2ljYWwgcGl4ZWwgdW5pdC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIHZpZXdwb3J0IGluIGxvZ2ljYWwgcGl4ZWwgdW5pdC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgdmlld3BvcnQgaW4gbG9naWNhbCBwaXhlbCB1bml0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBtaW5EZXB0aCAtIFRoZSBtaW5pbXVtIGRlcHRoIHZhbHVlIG9mIHRoZSB2aWV3cG9ydC4gV2ViR1BVIG9ubHkuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IG1heERlcHRoIC0gVGhlIG1heGltdW0gZGVwdGggdmFsdWUgb2YgdGhlIHZpZXdwb3J0LiBXZWJHUFUgb25seS5cclxuXHQgKi9cclxuXHRzZXRWaWV3cG9ydCggeCwgeSwgd2lkdGgsIGhlaWdodCwgbWluRGVwdGggPSAwLCBtYXhEZXB0aCA9IDEgKSB7XHJcblxyXG5cdFx0Y29uc3Qgdmlld3BvcnQgPSB0aGlzLl92aWV3cG9ydDtcclxuXHJcblx0XHRpZiAoIHguaXNWZWN0b3I0ICkge1xyXG5cclxuXHRcdFx0dmlld3BvcnQuY29weSggeCApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR2aWV3cG9ydC5zZXQoIHgsIHksIHdpZHRoLCBoZWlnaHQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dmlld3BvcnQubWluRGVwdGggPSBtaW5EZXB0aDtcclxuXHRcdHZpZXdwb3J0Lm1heERlcHRoID0gbWF4RGVwdGg7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgY2xlYXIgY29sb3IuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0NvbG9yfSB0YXJnZXQgLSBUaGUgbWV0aG9kIHdyaXRlcyB0aGUgcmVzdWx0IGluIHRoaXMgdGFyZ2V0IG9iamVjdC5cclxuXHQgKiBAcmV0dXJuIHtDb2xvcn0gVGhlIGNsZWFyIGNvbG9yLlxyXG5cdCAqL1xyXG5cdGdldENsZWFyQ29sb3IoIHRhcmdldCApIHtcclxuXHJcblx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIHRoaXMuX2NsZWFyQ29sb3IgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWZpbmVzIHRoZSBjbGVhciBjb2xvciBhbmQgb3B0aW9uYWxseSB0aGUgY2xlYXIgYWxwaGEuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0NvbG9yfSBjb2xvciAtIFRoZSBjbGVhciBjb2xvci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2FscGhhPTFdIC0gVGhlIGNsZWFyIGFscGhhLlxyXG5cdCAqL1xyXG5cdHNldENsZWFyQ29sb3IoIGNvbG9yLCBhbHBoYSA9IDEgKSB7XHJcblxyXG5cdFx0dGhpcy5fY2xlYXJDb2xvci5zZXQoIGNvbG9yICk7XHJcblx0XHR0aGlzLl9jbGVhckNvbG9yLmEgPSBhbHBoYTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBjbGVhciBhbHBoYS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGNsZWFyIGFscGhhLlxyXG5cdCAqL1xyXG5cdGdldENsZWFyQWxwaGEoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX2NsZWFyQ29sb3IuYTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWZpbmVzIHRoZSBjbGVhciBhbHBoYS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhbHBoYSAtIFRoZSBjbGVhciBhbHBoYS5cclxuXHQgKi9cclxuXHRzZXRDbGVhckFscGhhKCBhbHBoYSApIHtcclxuXHJcblx0XHR0aGlzLl9jbGVhckNvbG9yLmEgPSBhbHBoYTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBjbGVhciBkZXB0aC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGNsZWFyIGRlcHRoLlxyXG5cdCAqL1xyXG5cdGdldENsZWFyRGVwdGgoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX2NsZWFyRGVwdGg7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVmaW5lcyB0aGUgY2xlYXIgZGVwdGguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZGVwdGggLSBUaGUgY2xlYXIgZGVwdGguXHJcblx0ICovXHJcblx0c2V0Q2xlYXJEZXB0aCggZGVwdGggKSB7XHJcblxyXG5cdFx0dGhpcy5fY2xlYXJEZXB0aCA9IGRlcHRoO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGNsZWFyIHN0ZW5jaWwuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBjbGVhciBzdGVuY2lsLlxyXG5cdCAqL1xyXG5cdGdldENsZWFyU3RlbmNpbCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fY2xlYXJTdGVuY2lsO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgdGhlIGNsZWFyIHN0ZW5jaWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc3RlbmNpbCAtIFRoZSBjbGVhciBzdGVuY2lsLlxyXG5cdCAqL1xyXG5cdHNldENsZWFyU3RlbmNpbCggc3RlbmNpbCApIHtcclxuXHJcblx0XHR0aGlzLl9jbGVhclN0ZW5jaWwgPSBzdGVuY2lsO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIHBlcmZvcm1zIGFuIG9jY2x1c2lvbiBxdWVyeSBmb3IgdGhlIGdpdmVuIDNEIG9iamVjdC5cclxuXHQgKiBJdCByZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gM0Qgb2JqZWN0IGlzIGZ1bGx5IG9jY2x1ZGVkIGJ5IG90aGVyXHJcblx0ICogM0Qgb2JqZWN0cyBpbiB0aGUgc2NlbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdDNEfSBvYmplY3QgLSBUaGUgM0Qgb2JqZWN0IHRvIHRlc3QuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgM0Qgb2JqZWN0IGlzIGZ1bGx5IG9jY2x1ZGVkIG9yIG5vdC5cclxuXHQgKi9cclxuXHRpc09jY2x1ZGVkKCBvYmplY3QgKSB7XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyQ29udGV4dCA9IHRoaXMuX2N1cnJlbnRSZW5kZXJDb250ZXh0O1xyXG5cclxuXHRcdHJldHVybiByZW5kZXJDb250ZXh0ICYmIHRoaXMuYmFja2VuZC5pc09jY2x1ZGVkKCByZW5kZXJDb250ZXh0LCBvYmplY3QgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQZXJmb3JtcyBhIG1hbnVhbCBjbGVhciBvcGVyYXRpb24uIFRoaXMgbWV0aG9kIGlnbm9yZXMgYGF1dG9DbGVhcmAgcHJvcGVydGllcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NvbG9yPXRydWVdIC0gV2hldGhlciB0aGUgY29sb3IgYnVmZmVyIHNob3VsZCBiZSBjbGVhcmVkIG9yIG5vdC5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtkZXB0aD10cnVlXSAtIFdoZXRoZXIgdGhlIGRlcHRoIGJ1ZmZlciBzaG91bGQgYmUgY2xlYXJlZCBvciBub3QuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbc3RlbmNpbD10cnVlXSAtIFdoZXRoZXIgdGhlIHN0ZW5jaWwgYnVmZmVyIHNob3VsZCBiZSBjbGVhcmVkIG9yIG5vdC5cclxuXHQgKiBAcmV0dXJuIHtQcm9taXNlfSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjbGVhciBvcGVyYXRpb24gaGFzIGJlZW4gZXhlY3V0ZWQuXHJcblx0ICogT25seSByZXR1cm5lZCB3aGVuIHRoZSByZW5kZXJlciBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQuXHJcblx0ICovXHJcblx0Y2xlYXIoIGNvbG9yID0gdHJ1ZSwgZGVwdGggPSB0cnVlLCBzdGVuY2lsID0gdHJ1ZSApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuX2luaXRpYWxpemVkID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlJlbmRlcmVyOiAuY2xlYXIoKSBjYWxsZWQgYmVmb3JlIHRoZSBiYWNrZW5kIGlzIGluaXRpYWxpemVkLiBUcnkgdXNpbmcgLmNsZWFyQXN5bmMoKSBpbnN0ZWFkLicgKTtcclxuXHJcblx0XHRcdHJldHVybiB0aGlzLmNsZWFyQXN5bmMoIGNvbG9yLCBkZXB0aCwgc3RlbmNpbCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCByZW5kZXJUYXJnZXQgPSB0aGlzLl9yZW5kZXJUYXJnZXQgfHwgdGhpcy5fZ2V0RnJhbWVCdWZmZXJUYXJnZXQoKTtcclxuXHJcblx0XHRsZXQgcmVuZGVyQ29udGV4dCA9IG51bGw7XHJcblxyXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLl90ZXh0dXJlcy51cGRhdGVSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCApO1xyXG5cclxuXHRcdFx0Y29uc3QgcmVuZGVyVGFyZ2V0RGF0YSA9IHRoaXMuX3RleHR1cmVzLmdldCggcmVuZGVyVGFyZ2V0ICk7XHJcblxyXG5cdFx0XHRyZW5kZXJDb250ZXh0ID0gdGhpcy5fcmVuZGVyQ29udGV4dHMuZ2V0Rm9yQ2xlYXIoIHJlbmRlclRhcmdldCApO1xyXG5cdFx0XHRyZW5kZXJDb250ZXh0LnRleHR1cmVzID0gcmVuZGVyVGFyZ2V0RGF0YS50ZXh0dXJlcztcclxuXHRcdFx0cmVuZGVyQ29udGV4dC5kZXB0aFRleHR1cmUgPSByZW5kZXJUYXJnZXREYXRhLmRlcHRoVGV4dHVyZTtcclxuXHRcdFx0cmVuZGVyQ29udGV4dC53aWR0aCA9IHJlbmRlclRhcmdldERhdGEud2lkdGg7XHJcblx0XHRcdHJlbmRlckNvbnRleHQuaGVpZ2h0ID0gcmVuZGVyVGFyZ2V0RGF0YS5oZWlnaHQ7XHJcblx0XHRcdHJlbmRlckNvbnRleHQucmVuZGVyVGFyZ2V0ID0gcmVuZGVyVGFyZ2V0O1xyXG5cdFx0XHRyZW5kZXJDb250ZXh0LmRlcHRoID0gcmVuZGVyVGFyZ2V0LmRlcHRoQnVmZmVyO1xyXG5cdFx0XHRyZW5kZXJDb250ZXh0LnN0ZW5jaWwgPSByZW5kZXJUYXJnZXQuc3RlbmNpbEJ1ZmZlcjtcclxuXHRcdFx0Ly8gIzMwMzI5XHJcblx0XHRcdHJlbmRlckNvbnRleHQuY2xlYXJDb2xvclZhbHVlID0gdGhpcy5iYWNrZW5kLmdldENsZWFyQ29sb3IoKTtcclxuXHRcdFx0cmVuZGVyQ29udGV4dC5hY3RpdmVDdWJlRmFjZSA9IHRoaXMuZ2V0QWN0aXZlQ3ViZUZhY2UoKTtcclxuXHRcdFx0cmVuZGVyQ29udGV4dC5hY3RpdmVNaXBtYXBMZXZlbCA9IHRoaXMuZ2V0QWN0aXZlTWlwbWFwTGV2ZWwoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5iYWNrZW5kLmNsZWFyKCBjb2xvciwgZGVwdGgsIHN0ZW5jaWwsIHJlbmRlckNvbnRleHQgKTtcclxuXHJcblx0XHRpZiAoIHJlbmRlclRhcmdldCAhPT0gbnVsbCAmJiB0aGlzLl9yZW5kZXJUYXJnZXQgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLl9yZW5kZXJPdXRwdXQoIHJlbmRlclRhcmdldCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQZXJmb3JtcyBhIG1hbnVhbCBjbGVhciBvcGVyYXRpb24gb2YgdGhlIGNvbG9yIGJ1ZmZlci4gVGhpcyBtZXRob2QgaWdub3JlcyBgYXV0b0NsZWFyYCBwcm9wZXJ0aWVzLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7UHJvbWlzZX0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY2xlYXIgb3BlcmF0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkLlxyXG5cdCAqIE9ubHkgcmV0dXJuZWQgd2hlbiB0aGUgcmVuZGVyZXIgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLlxyXG5cdCAqL1xyXG5cdGNsZWFyQ29sb3IoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuY2xlYXIoIHRydWUsIGZhbHNlLCBmYWxzZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBlcmZvcm1zIGEgbWFudWFsIGNsZWFyIG9wZXJhdGlvbiBvZiB0aGUgZGVwdGggYnVmZmVyLiBUaGlzIG1ldGhvZCBpZ25vcmVzIGBhdXRvQ2xlYXJgIHByb3BlcnRpZXMuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtQcm9taXNlfSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjbGVhciBvcGVyYXRpb24gaGFzIGJlZW4gZXhlY3V0ZWQuXHJcblx0ICogT25seSByZXR1cm5lZCB3aGVuIHRoZSByZW5kZXJlciBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQuXHJcblx0ICovXHJcblx0Y2xlYXJEZXB0aCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5jbGVhciggZmFsc2UsIHRydWUsIGZhbHNlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUGVyZm9ybXMgYSBtYW51YWwgY2xlYXIgb3BlcmF0aW9uIG9mIHRoZSBzdGVuY2lsIGJ1ZmZlci4gVGhpcyBtZXRob2QgaWdub3JlcyBgYXV0b0NsZWFyYCBwcm9wZXJ0aWVzLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7UHJvbWlzZX0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY2xlYXIgb3BlcmF0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkLlxyXG5cdCAqIE9ubHkgcmV0dXJuZWQgd2hlbiB0aGUgcmVuZGVyZXIgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLlxyXG5cdCAqL1xyXG5cdGNsZWFyU3RlbmNpbCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5jbGVhciggZmFsc2UsIGZhbHNlLCB0cnVlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQXN5bmMgdmVyc2lvbiBvZiB7QGxpbmsgUmVuZGVyZXIjY2xlYXJ9LlxyXG5cdCAqXHJcblx0ICogQGFzeW5jXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbY29sb3I9dHJ1ZV0gLSBXaGV0aGVyIHRoZSBjb2xvciBidWZmZXIgc2hvdWxkIGJlIGNsZWFyZWQgb3Igbm90LlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW2RlcHRoPXRydWVdIC0gV2hldGhlciB0aGUgZGVwdGggYnVmZmVyIHNob3VsZCBiZSBjbGVhcmVkIG9yIG5vdC5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtzdGVuY2lsPXRydWVdIC0gV2hldGhlciB0aGUgc3RlbmNpbCBidWZmZXIgc2hvdWxkIGJlIGNsZWFyZWQgb3Igbm90LlxyXG5cdCAqIEByZXR1cm4ge1Byb21pc2V9IEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNsZWFyIG9wZXJhdGlvbiBoYXMgYmVlbiBleGVjdXRlZC5cclxuXHQgKi9cclxuXHRhc3luYyBjbGVhckFzeW5jKCBjb2xvciA9IHRydWUsIGRlcHRoID0gdHJ1ZSwgc3RlbmNpbCA9IHRydWUgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9pbml0aWFsaXplZCA9PT0gZmFsc2UgKSBhd2FpdCB0aGlzLmluaXQoKTtcclxuXHJcblx0XHR0aGlzLmNsZWFyKCBjb2xvciwgZGVwdGgsIHN0ZW5jaWwgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBc3luYyB2ZXJzaW9uIG9mIHtAbGluayBSZW5kZXJlciNjbGVhckNvbG9yfS5cclxuXHQgKlxyXG5cdCAqIEBhc3luY1xyXG5cdCAqIEByZXR1cm4ge1Byb21pc2V9IEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNsZWFyIG9wZXJhdGlvbiBoYXMgYmVlbiBleGVjdXRlZC5cclxuXHQgKi9cclxuXHRhc3luYyBjbGVhckNvbG9yQXN5bmMoKSB7XHJcblxyXG5cdFx0dGhpcy5jbGVhckFzeW5jKCB0cnVlLCBmYWxzZSwgZmFsc2UgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBc3luYyB2ZXJzaW9uIG9mIHtAbGluayBSZW5kZXJlciNjbGVhckRlcHRofS5cclxuXHQgKlxyXG5cdCAqIEBhc3luY1xyXG5cdCAqIEByZXR1cm4ge1Byb21pc2V9IEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNsZWFyIG9wZXJhdGlvbiBoYXMgYmVlbiBleGVjdXRlZC5cclxuXHQgKi9cclxuXHRhc3luYyBjbGVhckRlcHRoQXN5bmMoKSB7XHJcblxyXG5cdFx0dGhpcy5jbGVhckFzeW5jKCBmYWxzZSwgdHJ1ZSwgZmFsc2UgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBc3luYyB2ZXJzaW9uIG9mIHtAbGluayBSZW5kZXJlciNjbGVhclN0ZW5jaWx9LlxyXG5cdCAqXHJcblx0ICogQGFzeW5jXHJcblx0ICogQHJldHVybiB7UHJvbWlzZX0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY2xlYXIgb3BlcmF0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkLlxyXG5cdCAqL1xyXG5cdGFzeW5jIGNsZWFyU3RlbmNpbEFzeW5jKCkge1xyXG5cclxuXHRcdHRoaXMuY2xlYXJBc3luYyggZmFsc2UsIGZhbHNlLCB0cnVlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGN1cnJlbnQgb3V0cHV0IHRvbmUgbWFwcGluZyBvZiB0aGUgcmVuZGVyZXIuIFdoZW4gYSByZW5kZXIgdGFyZ2V0IGlzIHNldCxcclxuXHQgKiB0aGUgb3V0cHV0IHRvbmUgbWFwcGluZyBpcyBhbHdheXMgYE5vVG9uZU1hcHBpbmdgLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge251bWJlcn1cclxuXHQgKi9cclxuXHRnZXQgY3VycmVudFRvbmVNYXBwaW5nKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmlzT3V0cHV0VGFyZ2V0ID8gdGhpcy50b25lTWFwcGluZyA6IE5vVG9uZU1hcHBpbmc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGN1cnJlbnQgb3V0cHV0IGNvbG9yIHNwYWNlIG9mIHRoZSByZW5kZXJlci4gV2hlbiBhIHJlbmRlciB0YXJnZXQgaXMgc2V0LFxyXG5cdCAqIHRoZSBvdXRwdXQgY29sb3Igc3BhY2UgaXMgYWx3YXlzIGBMaW5lYXJTUkdCQ29sb3JTcGFjZWAuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdCAqL1xyXG5cdGdldCBjdXJyZW50Q29sb3JTcGFjZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5pc091dHB1dFRhcmdldCA/IHRoaXMub3V0cHV0Q29sb3JTcGFjZSA6IExpbmVhclNSR0JDb2xvclNwYWNlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSByZW5kZXJpbmcgc2V0dGluZ3MgYXJlIHNldCB0byBzY3JlZW4gb3V0cHV0LlxyXG5cdCAqXHJcblx0ICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIGN1cnJlbnQgcmVuZGVyIHRhcmdldCBpcyB0aGUgc2FtZSBvZiBvdXRwdXQgcmVuZGVyIHRhcmdldCBvciBgbnVsbGAsIG90aGVyd2lzZSBmYWxzZS5cclxuXHQgKi9cclxuXHRnZXQgaXNPdXRwdXRUYXJnZXQoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX3JlbmRlclRhcmdldCA9PT0gdGhpcy5fb3V0cHV0UmVuZGVyVGFyZ2V0IHx8IHRoaXMuX3JlbmRlclRhcmdldCA9PT0gbnVsbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGcmVlcyBhbGwgaW50ZXJuYWwgcmVzb3VyY2VzIG9mIHRoZSByZW5kZXJlci4gQ2FsbCB0aGlzIG1ldGhvZCBpZiB0aGUgcmVuZGVyZXJcclxuXHQgKiBpcyBubyBsb25nZXIgaW4gdXNlIGJ5IHlvdXIgYXBwLlxyXG5cdCAqL1xyXG5cdGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0dGhpcy5pbmZvLmRpc3Bvc2UoKTtcclxuXHRcdHRoaXMuYmFja2VuZC5kaXNwb3NlKCk7XHJcblxyXG5cdFx0dGhpcy5fYW5pbWF0aW9uLmRpc3Bvc2UoKTtcclxuXHRcdHRoaXMuX29iamVjdHMuZGlzcG9zZSgpO1xyXG5cdFx0dGhpcy5fcGlwZWxpbmVzLmRpc3Bvc2UoKTtcclxuXHRcdHRoaXMuX25vZGVzLmRpc3Bvc2UoKTtcclxuXHRcdHRoaXMuX2JpbmRpbmdzLmRpc3Bvc2UoKTtcclxuXHRcdHRoaXMuX3JlbmRlckxpc3RzLmRpc3Bvc2UoKTtcclxuXHRcdHRoaXMuX3JlbmRlckNvbnRleHRzLmRpc3Bvc2UoKTtcclxuXHRcdHRoaXMuX3RleHR1cmVzLmRpc3Bvc2UoKTtcclxuXHJcblx0XHRpZiAoIHRoaXMuX2ZyYW1lQnVmZmVyVGFyZ2V0ICE9PSBudWxsICkgdGhpcy5fZnJhbWVCdWZmZXJUYXJnZXQuZGlzcG9zZSgpO1xyXG5cclxuXHRcdE9iamVjdC52YWx1ZXMoIHRoaXMuYmFja2VuZC50aW1lc3RhbXBRdWVyeVBvb2wgKS5mb3JFYWNoKCBxdWVyeVBvb2wgPT4ge1xyXG5cclxuXHRcdFx0aWYgKCBxdWVyeVBvb2wgIT09IG51bGwgKSBxdWVyeVBvb2wuZGlzcG9zZSgpO1xyXG5cclxuXHRcdH0gKTtcclxuXHJcblx0XHR0aGlzLnNldFJlbmRlclRhcmdldCggbnVsbCApO1xyXG5cdFx0dGhpcy5zZXRBbmltYXRpb25Mb29wKCBudWxsICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZ2l2ZW4gcmVuZGVyIHRhcmdldC4gQ2FsbGluZyB0aGlzIG1ldGhvZCBtZWFucyB0aGUgcmVuZGVyZXIgZG9lcyBub3RcclxuXHQgKiB0YXJnZXQgdGhlIGRlZmF1bHQgZnJhbWVidWZmZXIgKG1lYW5pbmcgdGhlIGNhbnZhcykgYW55bW9yZSBidXQgYSBjdXN0b20gZnJhbWVidWZmZXIuXHJcblx0ICogVXNlIGBudWxsYCBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gcmVzZXQgdGhlIHN0YXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHs/UmVuZGVyVGFyZ2V0fSByZW5kZXJUYXJnZXQgLSBUaGUgcmVuZGVyIHRhcmdldCB0byBzZXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFthY3RpdmVDdWJlRmFjZT0wXSAtIFRoZSBhY3RpdmUgY3ViZSBmYWNlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbYWN0aXZlTWlwbWFwTGV2ZWw9MF0gLSBUaGUgYWN0aXZlIG1pcG1hcCBsZXZlbC5cclxuXHQgKi9cclxuXHRzZXRSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCwgYWN0aXZlQ3ViZUZhY2UgPSAwLCBhY3RpdmVNaXBtYXBMZXZlbCA9IDAgKSB7XHJcblxyXG5cdFx0dGhpcy5fcmVuZGVyVGFyZ2V0ID0gcmVuZGVyVGFyZ2V0O1xyXG5cdFx0dGhpcy5fYWN0aXZlQ3ViZUZhY2UgPSBhY3RpdmVDdWJlRmFjZTtcclxuXHRcdHRoaXMuX2FjdGl2ZU1pcG1hcExldmVsID0gYWN0aXZlTWlwbWFwTGV2ZWw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgY3VycmVudCByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7P1JlbmRlclRhcmdldH0gVGhlIHJlbmRlciB0YXJnZXQuIFJldHVybnMgYG51bGxgIGlmIG5vIHJlbmRlciB0YXJnZXQgaXMgc2V0LlxyXG5cdCAqL1xyXG5cdGdldFJlbmRlclRhcmdldCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fcmVuZGVyVGFyZ2V0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIG91dHB1dCByZW5kZXIgdGFyZ2V0IGZvciB0aGUgcmVuZGVyZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gcmVuZGVyVGFyZ2V0IC0gVGhlIHJlbmRlciB0YXJnZXQgdG8gc2V0IGFzIHRoZSBvdXRwdXQgdGFyZ2V0LlxyXG5cdCAqL1xyXG5cdHNldE91dHB1dFJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICkge1xyXG5cclxuXHRcdHRoaXMuX291dHB1dFJlbmRlclRhcmdldCA9IHJlbmRlclRhcmdldDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBjdXJyZW50IG91dHB1dCB0YXJnZXQuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHs/UmVuZGVyVGFyZ2V0fSBUaGUgY3VycmVudCBvdXRwdXQgcmVuZGVyIHRhcmdldC4gUmV0dXJucyBgbnVsbGAgaWYgbm8gb3V0cHV0IHRhcmdldCBpcyBzZXQuXHJcblx0ICovXHJcblx0Z2V0T3V0cHV0UmVuZGVyVGFyZ2V0KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9vdXRwdXRSZW5kZXJUYXJnZXQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2FsbGJhY2sgZm9yIHtAbGluayBSZW5kZXJlciNzZXRSZW5kZXJPYmplY3RGdW5jdGlvbn0uXHJcblx0ICpcclxuXHQgKiBAY2FsbGJhY2sgcmVuZGVyT2JqZWN0RnVuY3Rpb25cclxuXHQgKiBAcGFyYW0ge09iamVjdDNEfSBvYmplY3QgLSBUaGUgM0Qgb2JqZWN0LlxyXG5cdCAqIEBwYXJhbSB7U2NlbmV9IHNjZW5lIC0gVGhlIHNjZW5lIHRoZSAzRCBvYmplY3QgYmVsb25ncyB0by5cclxuXHQgKiBAcGFyYW0ge0NhbWVyYX0gY2FtZXJhIC0gVGhlIGNhbWVyYSB0aGUgb2JqZWN0IHNob3VsZCBiZSByZW5kZXJlZCB3aXRoLlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyR2VvbWV0cnl9IGdlb21ldHJ5IC0gVGhlIG9iamVjdCdzIGdlb21ldHJ5LlxyXG5cdCAqIEBwYXJhbSB7TWF0ZXJpYWx9IG1hdGVyaWFsIC0gVGhlIG9iamVjdCdzIG1hdGVyaWFsLlxyXG5cdCAqIEBwYXJhbSB7P09iamVjdH0gZ3JvdXAgLSBPbmx5IHJlbGV2YW50IGZvciBvYmplY3RzIHVzaW5nIG11bHRpcGxlIG1hdGVyaWFscy4gVGhpcyByZXByZXNlbnRzIGEgZ3JvdXAgZW50cnkgZnJvbSB0aGUgcmVzcGVjdGl2ZSBgQnVmZmVyR2VvbWV0cnlgLlxyXG5cdCAqIEBwYXJhbSB7TGlnaHRzTm9kZX0gbGlnaHRzTm9kZSAtIFRoZSBjdXJyZW50IGxpZ2h0cyBub2RlLlxyXG5cdCAqIEBwYXJhbSB7Q2xpcHBpbmdDb250ZXh0fSBjbGlwcGluZ0NvbnRleHQgLSBUaGUgY2xpcHBpbmcgY29udGV4dC5cclxuXHQgKiBAcGFyYW0gez9zdHJpbmd9IFtwYXNzSWQ9bnVsbF0gLSBBbiBvcHRpb25hbCBJRCBmb3IgaWRlbnRpZnlpbmcgdGhlIHBhc3MuXHJcblx0ICovXHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGdpdmVuIHJlbmRlciBvYmplY3QgZnVuY3Rpb24uIENhbGxpbmcgdGhpcyBtZXRob2Qgb3ZlcndyaXRlcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvblxyXG5cdCAqIHdoaWNoIGlzIHtAbGluayBSZW5kZXJlciNyZW5kZXJPYmplY3R9LiBEZWZpbmluZyBhIGN1c3RvbSBmdW5jdGlvbiBjYW4gYmUgdXNlZnVsXHJcblx0ICogaWYgeW91IHdhbnQgdG8gbW9kaWZ5IHRoZSB3YXkgb2JqZWN0cyBhcmUgcmVuZGVyZWQuIEZvciBleGFtcGxlIHlvdSBjYW4gZGVmaW5lIHRoaW5ncyBsaWtlIFwiZXZlcnlcclxuXHQgKiBvYmplY3QgdGhhdCBoYXMgbWF0ZXJpYWwgb2YgYSBjZXJ0YWluIHR5cGUgc2hvdWxkIHBlcmZvcm0gYSBwcmUtcGFzcyB3aXRoIGEgc3BlY2lhbCBvdmVyd3JpdGUgbWF0ZXJpYWxcIi5cclxuXHQgKiBUaGUgY3VzdG9tIGZ1bmN0aW9uIG11c3QgYWx3YXlzIGNhbGwgYHJlbmRlck9iamVjdCgpYCBpbiBpdHMgaW1wbGVtZW50YXRpb24uXHJcblx0ICpcclxuXHQgKiBVc2UgYG51bGxgIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byByZXNldCB0aGUgc3RhdGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gez9yZW5kZXJPYmplY3RGdW5jdGlvbn0gcmVuZGVyT2JqZWN0RnVuY3Rpb24gLSBUaGUgcmVuZGVyIG9iamVjdCBmdW5jdGlvbi5cclxuXHQgKi9cclxuXHRzZXRSZW5kZXJPYmplY3RGdW5jdGlvbiggcmVuZGVyT2JqZWN0RnVuY3Rpb24gKSB7XHJcblxyXG5cdFx0dGhpcy5fcmVuZGVyT2JqZWN0RnVuY3Rpb24gPSByZW5kZXJPYmplY3RGdW5jdGlvbjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHJlbmRlciBvYmplY3QgZnVuY3Rpb24uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHs/RnVuY3Rpb259IFRoZSBjdXJyZW50IHJlbmRlciBvYmplY3QgZnVuY3Rpb24uIFJldHVybnMgYG51bGxgIGlmIG5vIGZ1bmN0aW9uIGlzIHNldC5cclxuXHQgKi9cclxuXHRnZXRSZW5kZXJPYmplY3RGdW5jdGlvbigpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fcmVuZGVyT2JqZWN0RnVuY3Rpb247XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRXhlY3V0ZSBhIHNpbmdsZSBvciBhbiBhcnJheSBvZiBjb21wdXRlIG5vZGVzLiBUaGlzIG1ldGhvZCBjYW4gb25seSBiZSBjYWxsZWRcclxuXHQgKiBpZiB0aGUgcmVuZGVyZXIgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV8QXJyYXk8Tm9kZT59IGNvbXB1dGVOb2RlcyAtIFRoZSBjb21wdXRlIG5vZGUocykuXHJcblx0ICogQHJldHVybiB7UHJvbWlzZXx1bmRlZmluZWR9IEEgUHJvbWlzZSB0aGF0IHJlc29sdmUgd2hlbiB0aGUgY29tcHV0ZSBoYXMgZmluaXNoZWQuIE9ubHkgcmV0dXJuZWQgd2hlbiB0aGUgcmVuZGVyZXIgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLlxyXG5cdCAqL1xyXG5cdGNvbXB1dGUoIGNvbXB1dGVOb2RlcyApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuX2lzRGV2aWNlTG9zdCA9PT0gdHJ1ZSApIHJldHVybjtcclxuXHJcblx0XHRpZiAoIHRoaXMuX2luaXRpYWxpemVkID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlJlbmRlcmVyOiAuY29tcHV0ZSgpIGNhbGxlZCBiZWZvcmUgdGhlIGJhY2tlbmQgaXMgaW5pdGlhbGl6ZWQuIFRyeSB1c2luZyAuY29tcHV0ZUFzeW5jKCkgaW5zdGVhZC4nICk7XHJcblxyXG5cdFx0XHRyZXR1cm4gdGhpcy5jb21wdXRlQXN5bmMoIGNvbXB1dGVOb2RlcyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGNvbnN0IG5vZGVGcmFtZSA9IHRoaXMuX25vZGVzLm5vZGVGcmFtZTtcclxuXHJcblx0XHRjb25zdCBwcmV2aW91c1JlbmRlcklkID0gbm9kZUZyYW1lLnJlbmRlcklkO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0dGhpcy5pbmZvLmNhbGxzICsrO1xyXG5cdFx0dGhpcy5pbmZvLmNvbXB1dGUuY2FsbHMgKys7XHJcblx0XHR0aGlzLmluZm8uY29tcHV0ZS5mcmFtZUNhbGxzICsrO1xyXG5cclxuXHRcdG5vZGVGcmFtZS5yZW5kZXJJZCA9IHRoaXMuaW5mby5jYWxscztcclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGNvbnN0IGJhY2tlbmQgPSB0aGlzLmJhY2tlbmQ7XHJcblx0XHRjb25zdCBwaXBlbGluZXMgPSB0aGlzLl9waXBlbGluZXM7XHJcblx0XHRjb25zdCBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzO1xyXG5cdFx0Y29uc3Qgbm9kZXMgPSB0aGlzLl9ub2RlcztcclxuXHJcblx0XHRjb25zdCBjb21wdXRlTGlzdCA9IEFycmF5LmlzQXJyYXkoIGNvbXB1dGVOb2RlcyApID8gY29tcHV0ZU5vZGVzIDogWyBjb21wdXRlTm9kZXMgXTtcclxuXHJcblx0XHRpZiAoIGNvbXB1dGVMaXN0WyAwIF0gPT09IHVuZGVmaW5lZCB8fCBjb21wdXRlTGlzdFsgMCBdLmlzQ29tcHV0ZU5vZGUgIT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5SZW5kZXJlcjogLmNvbXB1dGUoKSBleHBlY3RzIGEgQ29tcHV0ZU5vZGUuJyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRiYWNrZW5kLmJlZ2luQ29tcHV0ZSggY29tcHV0ZU5vZGVzICk7XHJcblxyXG5cdFx0Zm9yICggY29uc3QgY29tcHV0ZU5vZGUgb2YgY29tcHV0ZUxpc3QgKSB7XHJcblxyXG5cdFx0XHQvLyBvbkluaXRcclxuXHJcblx0XHRcdGlmICggcGlwZWxpbmVzLmhhcyggY29tcHV0ZU5vZGUgKSA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGRpc3Bvc2UgPSAoKSA9PiB7XHJcblxyXG5cdFx0XHRcdFx0Y29tcHV0ZU5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBkaXNwb3NlICk7XHJcblxyXG5cdFx0XHRcdFx0cGlwZWxpbmVzLmRlbGV0ZSggY29tcHV0ZU5vZGUgKTtcclxuXHRcdFx0XHRcdGJpbmRpbmdzLmRlbGV0ZSggY29tcHV0ZU5vZGUgKTtcclxuXHRcdFx0XHRcdG5vZGVzLmRlbGV0ZSggY29tcHV0ZU5vZGUgKTtcclxuXHJcblx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0Y29tcHV0ZU5vZGUuYWRkRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBkaXNwb3NlICk7XHJcblxyXG5cdFx0XHRcdC8vXHJcblxyXG5cdFx0XHRcdGNvbnN0IG9uSW5pdEZuID0gY29tcHV0ZU5vZGUub25Jbml0RnVuY3Rpb247XHJcblxyXG5cdFx0XHRcdGlmICggb25Jbml0Rm4gIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdFx0b25Jbml0Rm4uY2FsbCggY29tcHV0ZU5vZGUsIHsgcmVuZGVyZXI6IHRoaXMgfSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRub2Rlcy51cGRhdGVGb3JDb21wdXRlKCBjb21wdXRlTm9kZSApO1xyXG5cdFx0XHRiaW5kaW5ncy51cGRhdGVGb3JDb21wdXRlKCBjb21wdXRlTm9kZSApO1xyXG5cclxuXHRcdFx0Y29uc3QgY29tcHV0ZUJpbmRpbmdzID0gYmluZGluZ3MuZ2V0Rm9yQ29tcHV0ZSggY29tcHV0ZU5vZGUgKTtcclxuXHRcdFx0Y29uc3QgY29tcHV0ZVBpcGVsaW5lID0gcGlwZWxpbmVzLmdldEZvckNvbXB1dGUoIGNvbXB1dGVOb2RlLCBjb21wdXRlQmluZGluZ3MgKTtcclxuXHJcblx0XHRcdGJhY2tlbmQuY29tcHV0ZSggY29tcHV0ZU5vZGVzLCBjb21wdXRlTm9kZSwgY29tcHV0ZUJpbmRpbmdzLCBjb21wdXRlUGlwZWxpbmUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0YmFja2VuZC5maW5pc2hDb21wdXRlKCBjb21wdXRlTm9kZXMgKTtcclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdG5vZGVGcmFtZS5yZW5kZXJJZCA9IHByZXZpb3VzUmVuZGVySWQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRXhlY3V0ZSBhIHNpbmdsZSBvciBhbiBhcnJheSBvZiBjb21wdXRlIG5vZGVzLlxyXG5cdCAqXHJcblx0ICogQGFzeW5jXHJcblx0ICogQHBhcmFtIHtOb2RlfEFycmF5PE5vZGU+fSBjb21wdXRlTm9kZXMgLSBUaGUgY29tcHV0ZSBub2RlKHMpLlxyXG5cdCAqIEByZXR1cm4ge1Byb21pc2V9IEEgUHJvbWlzZSB0aGF0IHJlc29sdmUgd2hlbiB0aGUgY29tcHV0ZSBoYXMgZmluaXNoZWQuXHJcblx0ICovXHJcblx0YXN5bmMgY29tcHV0ZUFzeW5jKCBjb21wdXRlTm9kZXMgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9pbml0aWFsaXplZCA9PT0gZmFsc2UgKSBhd2FpdCB0aGlzLmluaXQoKTtcclxuXHJcblx0XHR0aGlzLmNvbXB1dGUoIGNvbXB1dGVOb2RlcyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIHNlbGVjdGVkIGJhY2tlbmQuXHJcblx0ICpcclxuXHQgKiBAYXN5bmNcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBmZWF0dXJlJ3MgbmFtZS5cclxuXHQgKiBAcmV0dXJuIHtQcm9taXNlPGJvb2xlYW4+fSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGEgYm9vbCB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBvciBub3QuXHJcblx0ICovXHJcblx0YXN5bmMgaGFzRmVhdHVyZUFzeW5jKCBuYW1lICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5faW5pdGlhbGl6ZWQgPT09IGZhbHNlICkgYXdhaXQgdGhpcy5pbml0KCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuYmFja2VuZC5oYXNGZWF0dXJlKCBuYW1lICk7XHJcblxyXG5cdH1cclxuXHJcblx0YXN5bmMgcmVzb2x2ZVRpbWVzdGFtcHNBc3luYyggdHlwZSA9ICdyZW5kZXInICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5faW5pdGlhbGl6ZWQgPT09IGZhbHNlICkgYXdhaXQgdGhpcy5pbml0KCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuYmFja2VuZC5yZXNvbHZlVGltZXN0YW1wc0FzeW5jKCB0eXBlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgc2VsZWN0ZWQgYmFja2VuZC4gSWYgdGhlXHJcblx0ICogcmVuZGVyZXIgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLCB0aGlzIG1ldGhvZCBhbHdheXMgcmV0dXJucyBgZmFsc2VgLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgZmVhdHVyZSdzIG5hbWUuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGhhc0ZlYXR1cmUoIG5hbWUgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9pbml0aWFsaXplZCA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5SZW5kZXJlcjogLmhhc0ZlYXR1cmUoKSBjYWxsZWQgYmVmb3JlIHRoZSBiYWNrZW5kIGlzIGluaXRpYWxpemVkLiBUcnkgdXNpbmcgLmhhc0ZlYXR1cmVBc3luYygpIGluc3RlYWQuJyApO1xyXG5cclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcy5iYWNrZW5kLmhhc0ZlYXR1cmUoIG5hbWUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSByZW5kZXJlciBoYXMgYmVlbiBpbml0aWFsaXplZC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHJlbmRlcmVyIGhhcyBiZWVuIGluaXRpYWxpemVkIG9yIG5vdC5cclxuXHQgKi9cclxuXHRoYXNJbml0aWFsaXplZCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5faW5pdGlhbGl6ZWQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW5pdGlhbGl6ZXMgdGhlIGdpdmVuIHRleHR1cmVzLiBVc2VmdWwgZm9yIHByZWxvYWRpbmcgYSB0ZXh0dXJlIHJhdGhlciB0aGFuIHdhaXRpbmcgdW50aWwgZmlyc3QgcmVuZGVyXHJcblx0ICogKHdoaWNoIGNhbiBjYXVzZSBub3RpY2VhYmxlIGxhZ3MgZHVlIHRvIGRlY29kZSBhbmQgR1BVIHVwbG9hZCBvdmVyaGVhZCkuXHJcblx0ICpcclxuXHQgKiBAYXN5bmNcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZS5cclxuXHQgKiBAcmV0dXJuIHtQcm9taXNlfSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSB0ZXh0dXJlIGhhcyBiZWVuIGluaXRpYWxpemVkLlxyXG5cdCAqL1xyXG5cdGFzeW5jIGluaXRUZXh0dXJlQXN5bmMoIHRleHR1cmUgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9pbml0aWFsaXplZCA9PT0gZmFsc2UgKSBhd2FpdCB0aGlzLmluaXQoKTtcclxuXHJcblx0XHR0aGlzLl90ZXh0dXJlcy51cGRhdGVUZXh0dXJlKCB0ZXh0dXJlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW5pdGlhbGl6ZXMgdGhlIGdpdmVuIHRleHR1cmUuIFVzZWZ1bCBmb3IgcHJlbG9hZGluZyBhIHRleHR1cmUgcmF0aGVyIHRoYW4gd2FpdGluZyB1bnRpbCBmaXJzdCByZW5kZXJcclxuXHQgKiAod2hpY2ggY2FuIGNhdXNlIG5vdGljZWFibGUgbGFncyBkdWUgdG8gZGVjb2RlIGFuZCBHUFUgdXBsb2FkIG92ZXJoZWFkKS5cclxuXHQgKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGNhbiBvbmx5IGJlIHVzZWQgaWYgdGhlIHJlbmRlcmVyIGhhcyBiZWVuIGluaXRpYWxpemVkLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUuXHJcblx0ICovXHJcblx0aW5pdFRleHR1cmUoIHRleHR1cmUgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9pbml0aWFsaXplZCA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5SZW5kZXJlcjogLmluaXRUZXh0dXJlKCkgY2FsbGVkIGJlZm9yZSB0aGUgYmFja2VuZCBpcyBpbml0aWFsaXplZC4gVHJ5IHVzaW5nIC5pbml0VGV4dHVyZUFzeW5jKCkgaW5zdGVhZC4nICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuX3RleHR1cmVzLnVwZGF0ZVRleHR1cmUoIHRleHR1cmUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb3BpZXMgdGhlIGN1cnJlbnQgYm91bmQgZnJhbWVidWZmZXIgaW50byB0aGUgZ2l2ZW4gdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7RnJhbWVidWZmZXJUZXh0dXJlfSBmcmFtZWJ1ZmZlclRleHR1cmUgLSBUaGUgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0gez9WZWN0b3IyfFZlY3RvcjR9IFtyZWN0YW5nbGU9bnVsbF0gLSBBIHR3byBvciBmb3VyIGRpbWVuc2lvbmFsIHZlY3RvciB0aGF0IGRlZmluZXMgdGhlIHJlY3Rhbmd1bGFyIHBvcnRpb24gb2YgdGhlIGZyYW1lYnVmZmVyIHRoYXQgc2hvdWxkIGJlIGNvcGllZC5cclxuXHQgKi9cclxuXHRjb3B5RnJhbWVidWZmZXJUb1RleHR1cmUoIGZyYW1lYnVmZmVyVGV4dHVyZSwgcmVjdGFuZ2xlID0gbnVsbCApIHtcclxuXHJcblx0XHRpZiAoIHJlY3RhbmdsZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGlmICggcmVjdGFuZ2xlLmlzVmVjdG9yMiApIHtcclxuXHJcblx0XHRcdFx0cmVjdGFuZ2xlID0gX3ZlY3RvcjQuc2V0KCByZWN0YW5nbGUueCwgcmVjdGFuZ2xlLnksIGZyYW1lYnVmZmVyVGV4dHVyZS5pbWFnZS53aWR0aCwgZnJhbWVidWZmZXJUZXh0dXJlLmltYWdlLmhlaWdodCApLmZsb29yKCk7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCByZWN0YW5nbGUuaXNWZWN0b3I0ICkge1xyXG5cclxuXHRcdFx0XHRyZWN0YW5nbGUgPSBfdmVjdG9yNC5jb3B5KCByZWN0YW5nbGUgKS5mbG9vcigpO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlJlbmRlcmVyLmNvcHlGcmFtZWJ1ZmZlclRvVGV4dHVyZTogSW52YWxpZCByZWN0YW5nbGUuJyApO1xyXG5cclxuXHRcdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHJlY3RhbmdsZSA9IF92ZWN0b3I0LnNldCggMCwgMCwgZnJhbWVidWZmZXJUZXh0dXJlLmltYWdlLndpZHRoLCBmcmFtZWJ1ZmZlclRleHR1cmUuaW1hZ2UuaGVpZ2h0ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0bGV0IHJlbmRlckNvbnRleHQgPSB0aGlzLl9jdXJyZW50UmVuZGVyQ29udGV4dDtcclxuXHRcdGxldCByZW5kZXJUYXJnZXQ7XHJcblxyXG5cdFx0aWYgKCByZW5kZXJDb250ZXh0ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0cmVuZGVyVGFyZ2V0ID0gcmVuZGVyQ29udGV4dC5yZW5kZXJUYXJnZXQ7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHJlbmRlclRhcmdldCA9IHRoaXMuX3JlbmRlclRhcmdldCB8fCB0aGlzLl9nZXRGcmFtZUJ1ZmZlclRhcmdldCgpO1xyXG5cclxuXHRcdFx0aWYgKCByZW5kZXJUYXJnZXQgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdHRoaXMuX3RleHR1cmVzLnVwZGF0ZVJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICk7XHJcblxyXG5cdFx0XHRcdHJlbmRlckNvbnRleHQgPSB0aGlzLl90ZXh0dXJlcy5nZXQoIHJlbmRlclRhcmdldCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdHRoaXMuX3RleHR1cmVzLnVwZGF0ZVRleHR1cmUoIGZyYW1lYnVmZmVyVGV4dHVyZSwgeyByZW5kZXJUYXJnZXQgfSApO1xyXG5cclxuXHRcdHRoaXMuYmFja2VuZC5jb3B5RnJhbWVidWZmZXJUb1RleHR1cmUoIGZyYW1lYnVmZmVyVGV4dHVyZSwgcmVuZGVyQ29udGV4dCwgcmVjdGFuZ2xlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29waWVzIGRhdGEgb2YgdGhlIGdpdmVuIHNvdXJjZSB0ZXh0dXJlIGludG8gYSBkZXN0aW5hdGlvbiB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSBzcmNUZXh0dXJlIC0gVGhlIHNvdXJjZSB0ZXh0dXJlLlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gZHN0VGV4dHVyZSAtIFRoZSBkZXN0aW5hdGlvbiB0ZXh0dXJlLlxyXG5cdCAqIEBwYXJhbSB7Qm94MnxCb3gzfSBbc3JjUmVnaW9uPW51bGxdIC0gQSBib3VuZGluZyBib3ggd2hpY2ggZGVzY3JpYmVzIHRoZSBzb3VyY2UgcmVnaW9uLiBDYW4gYmUgdHdvIG9yIHRocmVlLWRpbWVuc2lvbmFsLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMnxWZWN0b3IzfSBbZHN0UG9zaXRpb249bnVsbF0gLSBBIHZlY3RvciB0aGF0IHJlcHJlc2VudHMgdGhlIG9yaWdpbiBvZiB0aGUgZGVzdGluYXRpb24gcmVnaW9uLiBDYW4gYmUgdHdvIG9yIHRocmVlLWRpbWVuc2lvbmFsLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbc3JjTGV2ZWw9MF0gLSBUaGUgc291cmNlIG1pcCBsZXZlbCB0byBjb3B5IGZyb20uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtkc3RMZXZlbD0wXSAtIFRoZSBkZXN0aW5hdGlvbiBtaXAgbGV2ZWwgdG8gY29weSB0by5cclxuXHQgKi9cclxuXHRjb3B5VGV4dHVyZVRvVGV4dHVyZSggc3JjVGV4dHVyZSwgZHN0VGV4dHVyZSwgc3JjUmVnaW9uID0gbnVsbCwgZHN0UG9zaXRpb24gPSBudWxsLCBzcmNMZXZlbCA9IDAsIGRzdExldmVsID0gMCApIHtcclxuXHJcblx0XHR0aGlzLl90ZXh0dXJlcy51cGRhdGVUZXh0dXJlKCBzcmNUZXh0dXJlICk7XHJcblx0XHR0aGlzLl90ZXh0dXJlcy51cGRhdGVUZXh0dXJlKCBkc3RUZXh0dXJlICk7XHJcblxyXG5cdFx0dGhpcy5iYWNrZW5kLmNvcHlUZXh0dXJlVG9UZXh0dXJlKCBzcmNUZXh0dXJlLCBkc3RUZXh0dXJlLCBzcmNSZWdpb24sIGRzdFBvc2l0aW9uLCBzcmNMZXZlbCwgZHN0TGV2ZWwgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZWFkcyBwaXhlbCBkYXRhIGZyb20gdGhlIGdpdmVuIHJlbmRlciB0YXJnZXQuXHJcblx0ICpcclxuXHQgKiBAYXN5bmNcclxuXHQgKiBAcGFyYW0ge1JlbmRlclRhcmdldH0gcmVuZGVyVGFyZ2V0IC0gVGhlIHJlbmRlciB0YXJnZXQgdG8gcmVhZCBmcm9tLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGB4YCBjb29yZGluYXRlIG9mIHRoZSBjb3B5IHJlZ2lvbidzIG9yaWdpbi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSBgeWAgY29vcmRpbmF0ZSBvZiB0aGUgY29weSByZWdpb24ncyBvcmlnaW4uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSBjb3B5IHJlZ2lvbi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgY29weSByZWdpb24uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt0ZXh0dXJlSW5kZXg9MF0gLSBUaGUgdGV4dHVyZSBpbmRleCBvZiBhIE1SVCByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZmFjZUluZGV4PTBdIC0gVGhlIGFjdGl2ZSBjdWJlIGZhY2UgaW5kZXguXHJcblx0ICogQHJldHVybiB7UHJvbWlzZTxUeXBlZEFycmF5Pn0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgcmVhZCBoYXMgYmVlbiBmaW5pc2hlZC4gVGhlIHJlc29sdmUgcHJvdmlkZXMgdGhlIHJlYWQgZGF0YSBhcyBhIHR5cGVkIGFycmF5LlxyXG5cdCAqL1xyXG5cdGFzeW5jIHJlYWRSZW5kZXJUYXJnZXRQaXhlbHNBc3luYyggcmVuZGVyVGFyZ2V0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCB0ZXh0dXJlSW5kZXggPSAwLCBmYWNlSW5kZXggPSAwICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmJhY2tlbmQuY29weVRleHR1cmVUb0J1ZmZlciggcmVuZGVyVGFyZ2V0LnRleHR1cmVzWyB0ZXh0dXJlSW5kZXggXSwgeCwgeSwgd2lkdGgsIGhlaWdodCwgZmFjZUluZGV4ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQW5hbHl6ZXMgdGhlIGdpdmVuIDNEIG9iamVjdCdzIGhpZXJhcmNoeSBhbmQgYnVpbGRzIHJlbmRlciBsaXN0cyBmcm9tIHRoZVxyXG5cdCAqIHByb2Nlc3NlZCBoaWVyYXJjaHkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdDNEfSBvYmplY3QgLSBUaGUgM0Qgb2JqZWN0IHRvIHByb2Nlc3MgKHVzdWFsbHkgYSBzY2VuZSkuXHJcblx0ICogQHBhcmFtIHtDYW1lcmF9IGNhbWVyYSAtIFRoZSBjYW1lcmEgdGhlIG9iamVjdCBpcyByZW5kZXJlZCB3aXRoLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBncm91cE9yZGVyIC0gVGhlIGdyb3VwIG9yZGVyIGlzIGRlcml2ZWQgZnJvbSB0aGUgYHJlbmRlck9yZGVyYCBvZiBncm91cHMgYW5kIGlzIHVzZWQgdG8gZ3JvdXAgM0Qgb2JqZWN0cyB3aXRoaW4gZ3JvdXBzLlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyTGlzdH0gcmVuZGVyTGlzdCAtIFRoZSBjdXJyZW50IHJlbmRlciBsaXN0LlxyXG5cdCAqIEBwYXJhbSB7Q2xpcHBpbmdDb250ZXh0fSBjbGlwcGluZ0NvbnRleHQgLSBUaGUgY3VycmVudCBjbGlwcGluZyBjb250ZXh0LlxyXG5cdCAqL1xyXG5cdF9wcm9qZWN0T2JqZWN0KCBvYmplY3QsIGNhbWVyYSwgZ3JvdXBPcmRlciwgcmVuZGVyTGlzdCwgY2xpcHBpbmdDb250ZXh0ICkge1xyXG5cclxuXHRcdGlmICggb2JqZWN0LnZpc2libGUgPT09IGZhbHNlICkgcmV0dXJuO1xyXG5cclxuXHRcdGNvbnN0IHZpc2libGUgPSBvYmplY3QubGF5ZXJzLnRlc3QoIGNhbWVyYS5sYXllcnMgKTtcclxuXHJcblx0XHRpZiAoIHZpc2libGUgKSB7XHJcblxyXG5cdFx0XHRpZiAoIG9iamVjdC5pc0dyb3VwICkge1xyXG5cclxuXHRcdFx0XHRncm91cE9yZGVyID0gb2JqZWN0LnJlbmRlck9yZGVyO1xyXG5cclxuXHRcdFx0XHRpZiAoIG9iamVjdC5pc0NsaXBwaW5nR3JvdXAgJiYgb2JqZWN0LmVuYWJsZWQgKSBjbGlwcGluZ0NvbnRleHQgPSBjbGlwcGluZ0NvbnRleHQuZ2V0R3JvdXBDb250ZXh0KCBvYmplY3QgKTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc0xPRCApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBvYmplY3QuYXV0b1VwZGF0ZSA9PT0gdHJ1ZSApIG9iamVjdC51cGRhdGUoIGNhbWVyYSApO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzTGlnaHQgKSB7XHJcblxyXG5cdFx0XHRcdHJlbmRlckxpc3QucHVzaExpZ2h0KCBvYmplY3QgKTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc1Nwcml0ZSApIHtcclxuXHJcblx0XHRcdFx0aWYgKCAhIG9iamVjdC5mcnVzdHVtQ3VsbGVkIHx8IF9mcnVzdHVtLmludGVyc2VjdHNTcHJpdGUoIG9iamVjdCApICkge1xyXG5cclxuXHRcdFx0XHRcdGlmICggdGhpcy5zb3J0T2JqZWN0cyA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdF92ZWN0b3I0LnNldEZyb21NYXRyaXhQb3NpdGlvbiggb2JqZWN0Lm1hdHJpeFdvcmxkICkuYXBwbHlNYXRyaXg0KCBfcHJvalNjcmVlbk1hdHJpeCApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRjb25zdCB7IGdlb21ldHJ5LCBtYXRlcmlhbCB9ID0gb2JqZWN0O1xyXG5cclxuXHRcdFx0XHRcdGlmICggbWF0ZXJpYWwudmlzaWJsZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdHJlbmRlckxpc3QucHVzaCggb2JqZWN0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwT3JkZXIsIF92ZWN0b3I0LnosIG51bGwsIGNsaXBwaW5nQ29udGV4dCApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzTGluZUxvb3AgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5SZW5kZXJlcjogT2JqZWN0cyBvZiB0eXBlIFRIUkVFLkxpbmVMb29wIGFyZSBub3Qgc3VwcG9ydGVkLiBQbGVhc2UgdXNlIFRIUkVFLkxpbmUgb3IgVEhSRUUuTGluZVNlZ21lbnRzLicgKTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc01lc2ggfHwgb2JqZWN0LmlzTGluZSB8fCBvYmplY3QuaXNQb2ludHMgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggISBvYmplY3QuZnJ1c3R1bUN1bGxlZCB8fCBfZnJ1c3R1bS5pbnRlcnNlY3RzT2JqZWN0KCBvYmplY3QgKSApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCB7IGdlb21ldHJ5LCBtYXRlcmlhbCB9ID0gb2JqZWN0O1xyXG5cclxuXHRcdFx0XHRcdGlmICggdGhpcy5zb3J0T2JqZWN0cyA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSBnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcclxuXHJcblx0XHRcdFx0XHRcdF92ZWN0b3I0XHJcblx0XHRcdFx0XHRcdFx0LmNvcHkoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlLmNlbnRlciApXHJcblx0XHRcdFx0XHRcdFx0LmFwcGx5TWF0cml4NCggb2JqZWN0Lm1hdHJpeFdvcmxkIClcclxuXHRcdFx0XHRcdFx0XHQuYXBwbHlNYXRyaXg0KCBfcHJvalNjcmVlbk1hdHJpeCApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIG1hdGVyaWFsICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCBncm91cHMgPSBnZW9tZXRyeS5ncm91cHM7XHJcblxyXG5cdFx0XHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBncm91cHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgZ3JvdXAgPSBncm91cHNbIGkgXTtcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBncm91cE1hdGVyaWFsID0gbWF0ZXJpYWxbIGdyb3VwLm1hdGVyaWFsSW5kZXggXTtcclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKCBncm91cE1hdGVyaWFsICYmIGdyb3VwTWF0ZXJpYWwudmlzaWJsZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRyZW5kZXJMaXN0LnB1c2goIG9iamVjdCwgZ2VvbWV0cnksIGdyb3VwTWF0ZXJpYWwsIGdyb3VwT3JkZXIsIF92ZWN0b3I0LnosIGdyb3VwLCBjbGlwcGluZ0NvbnRleHQgKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLnZpc2libGUgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRyZW5kZXJMaXN0LnB1c2goIG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cE9yZGVyLCBfdmVjdG9yNC56LCBudWxsLCBjbGlwcGluZ0NvbnRleHQgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBvYmplY3QuaXNCdW5kbGVHcm91cCA9PT0gdHJ1ZSAmJiB0aGlzLmJhY2tlbmQuYmVnaW5CdW5kbGUgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGJhc2VSZW5kZXJMaXN0ID0gcmVuZGVyTGlzdDtcclxuXHJcblx0XHRcdC8vIHJlcGxhY2UgcmVuZGVyIGxpc3RcclxuXHRcdFx0cmVuZGVyTGlzdCA9IHRoaXMuX3JlbmRlckxpc3RzLmdldCggb2JqZWN0LCBjYW1lcmEgKTtcclxuXHJcblx0XHRcdHJlbmRlckxpc3QuYmVnaW4oKTtcclxuXHJcblx0XHRcdGJhc2VSZW5kZXJMaXN0LnB1c2hCdW5kbGUoIHtcclxuXHRcdFx0XHRidW5kbGVHcm91cDogb2JqZWN0LFxyXG5cdFx0XHRcdGNhbWVyYSxcclxuXHRcdFx0XHRyZW5kZXJMaXN0LFxyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRyZW5kZXJMaXN0LmZpbmlzaCgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBjaGlsZHJlbiA9IG9iamVjdC5jaGlsZHJlbjtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0dGhpcy5fcHJvamVjdE9iamVjdCggY2hpbGRyZW5bIGkgXSwgY2FtZXJhLCBncm91cE9yZGVyLCByZW5kZXJMaXN0LCBjbGlwcGluZ0NvbnRleHQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVuZGVycyB0aGUgZ2l2ZW4gcmVuZGVyIGJ1bmRsZXMuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8T2JqZWN0Pn0gYnVuZGxlcyAtIEFycmF5IHdpdGggcmVuZGVyIGJ1bmRsZSBkYXRhLlxyXG5cdCAqIEBwYXJhbSB7U2NlbmV9IHNjZW5lUmVmIC0gVGhlIHNjZW5lIHRoZSByZW5kZXIgYnVuZGxlcyBiZWxvbmcgdG8uXHJcblx0ICogQHBhcmFtIHtMaWdodHNOb2RlfSBsaWdodHNOb2RlIC0gVGhlIGN1cnJlbnQgbGlnaHRzIG5vZGUuXHJcblx0ICovXHJcblx0X3JlbmRlckJ1bmRsZXMoIGJ1bmRsZXMsIHNjZW5lUmVmLCBsaWdodHNOb2RlICkge1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IGJ1bmRsZSBvZiBidW5kbGVzICkge1xyXG5cclxuXHRcdFx0dGhpcy5fcmVuZGVyQnVuZGxlKCBidW5kbGUsIHNjZW5lUmVmLCBsaWdodHNOb2RlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbmRlcnMgdGhlIHRyYW5zcGFyZW50IG9iamVjdHMgZnJvbSB0aGUgZ2l2ZW4gcmVuZGVyIGxpc3RzLlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge0FycmF5PE9iamVjdD59IHJlbmRlckxpc3QgLSBUaGUgdHJhbnNwYXJlbnQgcmVuZGVyIGxpc3QuXHJcblx0ICogQHBhcmFtIHtBcnJheTxPYmplY3Q+fSBkb3VibGVQYXNzTGlzdCAtIFRoZSBsaXN0IG9mIHRyYW5zcGFyZW50IG9iamVjdHMgd2hpY2ggcmVxdWlyZSBhIGRvdWJsZSBwYXNzIChlLmcuIGJlY2F1c2Ugb2YgdHJhbnNtaXNzaW9uKS5cclxuXHQgKiBAcGFyYW0ge0NhbWVyYX0gY2FtZXJhIC0gVGhlIGNhbWVyYSB0aGUgcmVuZGVyIGxpc3Qgc2hvdWxkIGJlIHJlbmRlcmVkIHdpdGguXHJcblx0ICogQHBhcmFtIHtTY2VuZX0gc2NlbmUgLSBUaGUgc2NlbmUgdGhlIHJlbmRlciBsaXN0IGJlbG9uZ3MgdG8uXHJcblx0ICogQHBhcmFtIHtMaWdodHNOb2RlfSBsaWdodHNOb2RlIC0gVGhlIGN1cnJlbnQgbGlnaHRzIG5vZGUuXHJcblx0ICovXHJcblx0X3JlbmRlclRyYW5zcGFyZW50cyggcmVuZGVyTGlzdCwgZG91YmxlUGFzc0xpc3QsIGNhbWVyYSwgc2NlbmUsIGxpZ2h0c05vZGUgKSB7XHJcblxyXG5cdFx0aWYgKCBkb3VibGVQYXNzTGlzdC5sZW5ndGggPiAwICkge1xyXG5cclxuXHRcdFx0Ly8gcmVuZGVyIGJhY2sgc2lkZVxyXG5cclxuXHRcdFx0Zm9yICggY29uc3QgeyBtYXRlcmlhbCB9IG9mIGRvdWJsZVBhc3NMaXN0ICkge1xyXG5cclxuXHRcdFx0XHRtYXRlcmlhbC5zaWRlID0gQmFja1NpZGU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0aGlzLl9yZW5kZXJPYmplY3RzKCBkb3VibGVQYXNzTGlzdCwgY2FtZXJhLCBzY2VuZSwgbGlnaHRzTm9kZSwgJ2JhY2tTaWRlJyApO1xyXG5cclxuXHRcdFx0Ly8gcmVuZGVyIGZyb250IHNpZGVcclxuXHJcblx0XHRcdGZvciAoIGNvbnN0IHsgbWF0ZXJpYWwgfSBvZiBkb3VibGVQYXNzTGlzdCApIHtcclxuXHJcblx0XHRcdFx0bWF0ZXJpYWwuc2lkZSA9IEZyb250U2lkZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuX3JlbmRlck9iamVjdHMoIHJlbmRlckxpc3QsIGNhbWVyYSwgc2NlbmUsIGxpZ2h0c05vZGUgKTtcclxuXHJcblx0XHRcdC8vIHJlc3RvcmVcclxuXHJcblx0XHRcdGZvciAoIGNvbnN0IHsgbWF0ZXJpYWwgfSBvZiBkb3VibGVQYXNzTGlzdCApIHtcclxuXHJcblx0XHRcdFx0bWF0ZXJpYWwuc2lkZSA9IERvdWJsZVNpZGU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHRoaXMuX3JlbmRlck9iamVjdHMoIHJlbmRlckxpc3QsIGNhbWVyYSwgc2NlbmUsIGxpZ2h0c05vZGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVuZGVycyB0aGUgb2JqZWN0cyBmcm9tIHRoZSBnaXZlbiByZW5kZXIgbGlzdC5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtBcnJheTxPYmplY3Q+fSByZW5kZXJMaXN0IC0gVGhlIHJlbmRlciBsaXN0LlxyXG5cdCAqIEBwYXJhbSB7Q2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIHRoZSByZW5kZXIgbGlzdCBzaG91bGQgYmUgcmVuZGVyZWQgd2l0aC5cclxuXHQgKiBAcGFyYW0ge1NjZW5lfSBzY2VuZSAtIFRoZSBzY2VuZSB0aGUgcmVuZGVyIGxpc3QgYmVsb25ncyB0by5cclxuXHQgKiBAcGFyYW0ge0xpZ2h0c05vZGV9IGxpZ2h0c05vZGUgLSBUaGUgY3VycmVudCBsaWdodHMgbm9kZS5cclxuXHQgKiBAcGFyYW0gez9zdHJpbmd9IFtwYXNzSWQ9bnVsbF0gLSBBbiBvcHRpb25hbCBJRCBmb3IgaWRlbnRpZnlpbmcgdGhlIHBhc3MuXHJcblx0ICovXHJcblx0X3JlbmRlck9iamVjdHMoIHJlbmRlckxpc3QsIGNhbWVyYSwgc2NlbmUsIGxpZ2h0c05vZGUsIHBhc3NJZCA9IG51bGwgKSB7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IHJlbmRlckxpc3QubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB7IG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cCwgY2xpcHBpbmdDb250ZXh0IH0gPSByZW5kZXJMaXN0WyBpIF07XHJcblxyXG5cdFx0XHR0aGlzLl9jdXJyZW50UmVuZGVyT2JqZWN0RnVuY3Rpb24oIG9iamVjdCwgc2NlbmUsIGNhbWVyYSwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cCwgbGlnaHRzTm9kZSwgY2xpcHBpbmdDb250ZXh0LCBwYXNzSWQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgcmVwcmVzZW50cyB0aGUgZGVmYXVsdCByZW5kZXIgb2JqZWN0IGZ1bmN0aW9uIHRoYXQgbWFuYWdlcyB0aGUgcmVuZGVyIGxpZmVjeWNsZVxyXG5cdCAqIG9mIHRoZSBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdDNEfSBvYmplY3QgLSBUaGUgM0Qgb2JqZWN0LlxyXG5cdCAqIEBwYXJhbSB7U2NlbmV9IHNjZW5lIC0gVGhlIHNjZW5lIHRoZSAzRCBvYmplY3QgYmVsb25ncyB0by5cclxuXHQgKiBAcGFyYW0ge0NhbWVyYX0gY2FtZXJhIC0gVGhlIGNhbWVyYSB0aGUgb2JqZWN0IHNob3VsZCBiZSByZW5kZXJlZCB3aXRoLlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyR2VvbWV0cnl9IGdlb21ldHJ5IC0gVGhlIG9iamVjdCdzIGdlb21ldHJ5LlxyXG5cdCAqIEBwYXJhbSB7TWF0ZXJpYWx9IG1hdGVyaWFsIC0gVGhlIG9iamVjdCdzIG1hdGVyaWFsLlxyXG5cdCAqIEBwYXJhbSB7P09iamVjdH0gZ3JvdXAgLSBPbmx5IHJlbGV2YW50IGZvciBvYmplY3RzIHVzaW5nIG11bHRpcGxlIG1hdGVyaWFscy4gVGhpcyByZXByZXNlbnRzIGEgZ3JvdXAgZW50cnkgZnJvbSB0aGUgcmVzcGVjdGl2ZSBgQnVmZmVyR2VvbWV0cnlgLlxyXG5cdCAqIEBwYXJhbSB7TGlnaHRzTm9kZX0gbGlnaHRzTm9kZSAtIFRoZSBjdXJyZW50IGxpZ2h0cyBub2RlLlxyXG5cdCAqIEBwYXJhbSB7P0NsaXBwaW5nQ29udGV4dH0gY2xpcHBpbmdDb250ZXh0IC0gVGhlIGNsaXBwaW5nIGNvbnRleHQuXHJcblx0ICogQHBhcmFtIHs/c3RyaW5nfSBbcGFzc0lkPW51bGxdIC0gQW4gb3B0aW9uYWwgSUQgZm9yIGlkZW50aWZ5aW5nIHRoZSBwYXNzLlxyXG5cdCAqL1xyXG5cdHJlbmRlck9iamVjdCggb2JqZWN0LCBzY2VuZSwgY2FtZXJhLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwLCBsaWdodHNOb2RlLCBjbGlwcGluZ0NvbnRleHQgPSBudWxsLCBwYXNzSWQgPSBudWxsICkge1xyXG5cclxuXHRcdGxldCBvdmVycmlkZVBvc2l0aW9uTm9kZTtcclxuXHRcdGxldCBvdmVycmlkZUNvbG9yTm9kZTtcclxuXHRcdGxldCBvdmVycmlkZURlcHRoTm9kZTtcclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdG9iamVjdC5vbkJlZm9yZVJlbmRlciggdGhpcywgc2NlbmUsIGNhbWVyYSwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cCApO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0aWYgKCBtYXRlcmlhbC5hbGxvd092ZXJyaWRlID09PSB0cnVlICYmIHNjZW5lLm92ZXJyaWRlTWF0ZXJpYWwgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBvdmVycmlkZU1hdGVyaWFsID0gc2NlbmUub3ZlcnJpZGVNYXRlcmlhbDtcclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWwucG9zaXRpb25Ob2RlICYmIG1hdGVyaWFsLnBvc2l0aW9uTm9kZS5pc05vZGUgKSB7XHJcblxyXG5cdFx0XHRcdG92ZXJyaWRlUG9zaXRpb25Ob2RlID0gb3ZlcnJpZGVNYXRlcmlhbC5wb3NpdGlvbk5vZGU7XHJcblx0XHRcdFx0b3ZlcnJpZGVNYXRlcmlhbC5wb3NpdGlvbk5vZGUgPSBtYXRlcmlhbC5wb3NpdGlvbk5vZGU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRvdmVycmlkZU1hdGVyaWFsLmFscGhhVGVzdCA9IG1hdGVyaWFsLmFscGhhVGVzdDtcclxuXHRcdFx0b3ZlcnJpZGVNYXRlcmlhbC5hbHBoYU1hcCA9IG1hdGVyaWFsLmFscGhhTWFwO1xyXG5cdFx0XHRvdmVycmlkZU1hdGVyaWFsLnRyYW5zcGFyZW50ID0gbWF0ZXJpYWwudHJhbnNwYXJlbnQgfHwgbWF0ZXJpYWwudHJhbnNtaXNzaW9uID4gMDtcclxuXHJcblx0XHRcdGlmICggb3ZlcnJpZGVNYXRlcmlhbC5pc1NoYWRvd1Bhc3NNYXRlcmlhbCApIHtcclxuXHJcblx0XHRcdFx0b3ZlcnJpZGVNYXRlcmlhbC5zaWRlID0gbWF0ZXJpYWwuc2hhZG93U2lkZSA9PT0gbnVsbCA/IG1hdGVyaWFsLnNpZGUgOiBtYXRlcmlhbC5zaGFkb3dTaWRlO1xyXG5cclxuXHRcdFx0XHRpZiAoIG1hdGVyaWFsLmRlcHRoTm9kZSAmJiBtYXRlcmlhbC5kZXB0aE5vZGUuaXNOb2RlICkge1xyXG5cclxuXHRcdFx0XHRcdG92ZXJyaWRlRGVwdGhOb2RlID0gb3ZlcnJpZGVNYXRlcmlhbC5kZXB0aE5vZGU7XHJcblx0XHRcdFx0XHRvdmVycmlkZU1hdGVyaWFsLmRlcHRoTm9kZSA9IG1hdGVyaWFsLmRlcHRoTm9kZTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoIG1hdGVyaWFsLmNhc3RTaGFkb3dOb2RlICYmIG1hdGVyaWFsLmNhc3RTaGFkb3dOb2RlLmlzTm9kZSApIHtcclxuXHJcblx0XHRcdFx0XHRvdmVycmlkZUNvbG9yTm9kZSA9IG92ZXJyaWRlTWF0ZXJpYWwuY29sb3JOb2RlO1xyXG5cdFx0XHRcdFx0b3ZlcnJpZGVNYXRlcmlhbC5jb2xvck5vZGUgPSBtYXRlcmlhbC5jYXN0U2hhZG93Tm9kZTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0bWF0ZXJpYWwgPSBvdmVycmlkZU1hdGVyaWFsO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGlmICggbWF0ZXJpYWwudHJhbnNwYXJlbnQgPT09IHRydWUgJiYgbWF0ZXJpYWwuc2lkZSA9PT0gRG91YmxlU2lkZSAmJiBtYXRlcmlhbC5mb3JjZVNpbmdsZVBhc3MgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0bWF0ZXJpYWwuc2lkZSA9IEJhY2tTaWRlO1xyXG5cdFx0XHR0aGlzLl9oYW5kbGVPYmplY3RGdW5jdGlvbiggb2JqZWN0LCBtYXRlcmlhbCwgc2NlbmUsIGNhbWVyYSwgbGlnaHRzTm9kZSwgZ3JvdXAsIGNsaXBwaW5nQ29udGV4dCwgJ2JhY2tTaWRlJyApOyAvLyBjcmVhdGUgYmFja1NpZGUgcGFzcyBpZFxyXG5cclxuXHRcdFx0bWF0ZXJpYWwuc2lkZSA9IEZyb250U2lkZTtcclxuXHRcdFx0dGhpcy5faGFuZGxlT2JqZWN0RnVuY3Rpb24oIG9iamVjdCwgbWF0ZXJpYWwsIHNjZW5lLCBjYW1lcmEsIGxpZ2h0c05vZGUsIGdyb3VwLCBjbGlwcGluZ0NvbnRleHQsIHBhc3NJZCApOyAvLyB1c2UgZGVmYXVsdCBwYXNzIGlkXHJcblxyXG5cdFx0XHRtYXRlcmlhbC5zaWRlID0gRG91YmxlU2lkZTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGhpcy5faGFuZGxlT2JqZWN0RnVuY3Rpb24oIG9iamVjdCwgbWF0ZXJpYWwsIHNjZW5lLCBjYW1lcmEsIGxpZ2h0c05vZGUsIGdyb3VwLCBjbGlwcGluZ0NvbnRleHQsIHBhc3NJZCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGlmICggb3ZlcnJpZGVQb3NpdGlvbk5vZGUgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHNjZW5lLm92ZXJyaWRlTWF0ZXJpYWwucG9zaXRpb25Ob2RlID0gb3ZlcnJpZGVQb3NpdGlvbk5vZGU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggb3ZlcnJpZGVEZXB0aE5vZGUgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHNjZW5lLm92ZXJyaWRlTWF0ZXJpYWwuZGVwdGhOb2RlID0gb3ZlcnJpZGVEZXB0aE5vZGU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggb3ZlcnJpZGVDb2xvck5vZGUgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHNjZW5lLm92ZXJyaWRlTWF0ZXJpYWwuY29sb3JOb2RlID0gb3ZlcnJpZGVDb2xvck5vZGU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0b2JqZWN0Lm9uQWZ0ZXJSZW5kZXIoIHRoaXMsIHNjZW5lLCBjYW1lcmEsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXAgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCByZXByZXNlbnRzIHRoZSBkZWZhdWx0IGBfaGFuZGxlT2JqZWN0RnVuY3Rpb25gIGltcGxlbWVudGF0aW9uIHdoaWNoIGNyZWF0ZXNcclxuXHQgKiBhIHJlbmRlciBvYmplY3QgZnJvbSB0aGUgZ2l2ZW4gZGF0YSBhbmQgcGVyZm9ybXMgdGhlIGRyYXcgY29tbWFuZCB3aXRoIHRoZSBzZWxlY3RlZCBiYWNrZW5kLlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge09iamVjdDNEfSBvYmplY3QgLSBUaGUgM0Qgb2JqZWN0LlxyXG5cdCAqIEBwYXJhbSB7TWF0ZXJpYWx9IG1hdGVyaWFsIC0gVGhlIG9iamVjdCdzIG1hdGVyaWFsLlxyXG5cdCAqIEBwYXJhbSB7U2NlbmV9IHNjZW5lIC0gVGhlIHNjZW5lIHRoZSAzRCBvYmplY3QgYmVsb25ncyB0by5cclxuXHQgKiBAcGFyYW0ge0NhbWVyYX0gY2FtZXJhIC0gVGhlIGNhbWVyYSB0aGUgb2JqZWN0IHNob3VsZCBiZSByZW5kZXJlZCB3aXRoLlxyXG5cdCAqIEBwYXJhbSB7TGlnaHRzTm9kZX0gbGlnaHRzTm9kZSAtIFRoZSBjdXJyZW50IGxpZ2h0cyBub2RlLlxyXG5cdCAqIEBwYXJhbSB7P3tzdGFydDogbnVtYmVyLCBjb3VudDogbnVtYmVyfX0gZ3JvdXAgLSBPbmx5IHJlbGV2YW50IGZvciBvYmplY3RzIHVzaW5nIG11bHRpcGxlIG1hdGVyaWFscy4gVGhpcyByZXByZXNlbnRzIGEgZ3JvdXAgZW50cnkgZnJvbSB0aGUgcmVzcGVjdGl2ZSBgQnVmZmVyR2VvbWV0cnlgLlxyXG5cdCAqIEBwYXJhbSB7Q2xpcHBpbmdDb250ZXh0fSBjbGlwcGluZ0NvbnRleHQgLSBUaGUgY2xpcHBpbmcgY29udGV4dC5cclxuXHQgKiBAcGFyYW0gez9zdHJpbmd9IFtwYXNzSWQ9bnVsbF0gLSBBbiBvcHRpb25hbCBJRCBmb3IgaWRlbnRpZnlpbmcgdGhlIHBhc3MuXHJcblx0ICovXHJcblx0X3JlbmRlck9iamVjdERpcmVjdCggb2JqZWN0LCBtYXRlcmlhbCwgc2NlbmUsIGNhbWVyYSwgbGlnaHRzTm9kZSwgZ3JvdXAsIGNsaXBwaW5nQ29udGV4dCwgcGFzc0lkICkge1xyXG5cclxuXHRcdGNvbnN0IHJlbmRlck9iamVjdCA9IHRoaXMuX29iamVjdHMuZ2V0KCBvYmplY3QsIG1hdGVyaWFsLCBzY2VuZSwgY2FtZXJhLCBsaWdodHNOb2RlLCB0aGlzLl9jdXJyZW50UmVuZGVyQ29udGV4dCwgY2xpcHBpbmdDb250ZXh0LCBwYXNzSWQgKTtcclxuXHRcdHJlbmRlck9iamVjdC5kcmF3UmFuZ2UgPSBvYmplY3QuZ2VvbWV0cnkuZHJhd1JhbmdlO1xyXG5cdFx0cmVuZGVyT2JqZWN0Lmdyb3VwID0gZ3JvdXA7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCBuZWVkc1JlZnJlc2ggPSB0aGlzLl9ub2Rlcy5uZWVkc1JlZnJlc2goIHJlbmRlck9iamVjdCApO1xyXG5cclxuXHRcdGlmICggbmVlZHNSZWZyZXNoICkge1xyXG5cclxuXHRcdFx0dGhpcy5fbm9kZXMudXBkYXRlQmVmb3JlKCByZW5kZXJPYmplY3QgKTtcclxuXHJcblx0XHRcdHRoaXMuX2dlb21ldHJpZXMudXBkYXRlRm9yUmVuZGVyKCByZW5kZXJPYmplY3QgKTtcclxuXHJcblx0XHRcdHRoaXMuX25vZGVzLnVwZGF0ZUZvclJlbmRlciggcmVuZGVyT2JqZWN0ICk7XHJcblx0XHRcdHRoaXMuX2JpbmRpbmdzLnVwZGF0ZUZvclJlbmRlciggcmVuZGVyT2JqZWN0ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuX3BpcGVsaW5lcy51cGRhdGVGb3JSZW5kZXIoIHJlbmRlck9iamVjdCApO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0aWYgKCB0aGlzLl9jdXJyZW50UmVuZGVyQnVuZGxlICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0Y29uc3QgcmVuZGVyQnVuZGxlRGF0YSA9IHRoaXMuYmFja2VuZC5nZXQoIHRoaXMuX2N1cnJlbnRSZW5kZXJCdW5kbGUgKTtcclxuXHJcblx0XHRcdHJlbmRlckJ1bmRsZURhdGEucmVuZGVyT2JqZWN0cy5wdXNoKCByZW5kZXJPYmplY3QgKTtcclxuXHJcblx0XHRcdHJlbmRlck9iamVjdC5idW5kbGUgPSB0aGlzLl9jdXJyZW50UmVuZGVyQnVuZGxlLmJ1bmRsZUdyb3VwO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmJhY2tlbmQuZHJhdyggcmVuZGVyT2JqZWN0LCB0aGlzLmluZm8gKTtcclxuXHJcblx0XHRpZiAoIG5lZWRzUmVmcmVzaCApIHRoaXMuX25vZGVzLnVwZGF0ZUFmdGVyKCByZW5kZXJPYmplY3QgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbiBmb3IgYF9oYW5kbGVPYmplY3RGdW5jdGlvbmAgd2hpY2ggb25seSBtYWtlcyBzdXJlIHRoZSBvYmplY3QgaXMgcmVhZHkgZm9yIHJlbmRlcmluZy5cclxuXHQgKiBVc2VkIGluIGBjb21waWxlQXN5bmMoKWAuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0M0R9IG9iamVjdCAtIFRoZSAzRCBvYmplY3QuXHJcblx0ICogQHBhcmFtIHtNYXRlcmlhbH0gbWF0ZXJpYWwgLSBUaGUgb2JqZWN0J3MgbWF0ZXJpYWwuXHJcblx0ICogQHBhcmFtIHtTY2VuZX0gc2NlbmUgLSBUaGUgc2NlbmUgdGhlIDNEIG9iamVjdCBiZWxvbmdzIHRvLlxyXG5cdCAqIEBwYXJhbSB7Q2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIHRoZSBvYmplY3Qgc2hvdWxkIGJlIHJlbmRlcmVkIHdpdGguXHJcblx0ICogQHBhcmFtIHtMaWdodHNOb2RlfSBsaWdodHNOb2RlIC0gVGhlIGN1cnJlbnQgbGlnaHRzIG5vZGUuXHJcblx0ICogQHBhcmFtIHs/e3N0YXJ0OiBudW1iZXIsIGNvdW50OiBudW1iZXJ9fSBncm91cCAtIE9ubHkgcmVsZXZhbnQgZm9yIG9iamVjdHMgdXNpbmcgbXVsdGlwbGUgbWF0ZXJpYWxzLiBUaGlzIHJlcHJlc2VudHMgYSBncm91cCBlbnRyeSBmcm9tIHRoZSByZXNwZWN0aXZlIGBCdWZmZXJHZW9tZXRyeWAuXHJcblx0ICogQHBhcmFtIHtDbGlwcGluZ0NvbnRleHR9IGNsaXBwaW5nQ29udGV4dCAtIFRoZSBjbGlwcGluZyBjb250ZXh0LlxyXG5cdCAqIEBwYXJhbSB7P3N0cmluZ30gW3Bhc3NJZD1udWxsXSAtIEFuIG9wdGlvbmFsIElEIGZvciBpZGVudGlmeWluZyB0aGUgcGFzcy5cclxuXHQgKi9cclxuXHRfY3JlYXRlT2JqZWN0UGlwZWxpbmUoIG9iamVjdCwgbWF0ZXJpYWwsIHNjZW5lLCBjYW1lcmEsIGxpZ2h0c05vZGUsIGdyb3VwLCBjbGlwcGluZ0NvbnRleHQsIHBhc3NJZCApIHtcclxuXHJcblx0XHRjb25zdCByZW5kZXJPYmplY3QgPSB0aGlzLl9vYmplY3RzLmdldCggb2JqZWN0LCBtYXRlcmlhbCwgc2NlbmUsIGNhbWVyYSwgbGlnaHRzTm9kZSwgdGhpcy5fY3VycmVudFJlbmRlckNvbnRleHQsIGNsaXBwaW5nQ29udGV4dCwgcGFzc0lkICk7XHJcblx0XHRyZW5kZXJPYmplY3QuZHJhd1JhbmdlID0gb2JqZWN0Lmdlb21ldHJ5LmRyYXdSYW5nZTtcclxuXHRcdHJlbmRlck9iamVjdC5ncm91cCA9IGdyb3VwO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0dGhpcy5fbm9kZXMudXBkYXRlQmVmb3JlKCByZW5kZXJPYmplY3QgKTtcclxuXHJcblx0XHR0aGlzLl9nZW9tZXRyaWVzLnVwZGF0ZUZvclJlbmRlciggcmVuZGVyT2JqZWN0ICk7XHJcblxyXG5cdFx0dGhpcy5fbm9kZXMudXBkYXRlRm9yUmVuZGVyKCByZW5kZXJPYmplY3QgKTtcclxuXHRcdHRoaXMuX2JpbmRpbmdzLnVwZGF0ZUZvclJlbmRlciggcmVuZGVyT2JqZWN0ICk7XHJcblxyXG5cdFx0dGhpcy5fcGlwZWxpbmVzLmdldEZvclJlbmRlciggcmVuZGVyT2JqZWN0LCB0aGlzLl9jb21waWxhdGlvblByb21pc2VzICk7XHJcblxyXG5cdFx0dGhpcy5fbm9kZXMudXBkYXRlQWZ0ZXIoIHJlbmRlck9iamVjdCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFsaWFzIGZvciBgY29tcGlsZUFzeW5jKClgLlxyXG5cdCAqXHJcblx0ICogQG1ldGhvZFxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0M0R9IHNjZW5lIC0gVGhlIHNjZW5lIG9yIDNEIG9iamVjdCB0byBwcmVjb21waWxlLlxyXG5cdCAqIEBwYXJhbSB7Q2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIHRoYXQgaXMgdXNlZCB0byByZW5kZXIgdGhlIHNjZW5lLlxyXG5cdCAqIEBwYXJhbSB7U2NlbmV9IHRhcmdldFNjZW5lIC0gSWYgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGEgM0Qgb2JqZWN0LCB0aGlzIHBhcmFtZXRlciBtdXN0IHJlcHJlc2VudCB0aGUgc2NlbmUgdGhlIDNEIG9iamVjdCBpcyBnb2luZyB0byBiZSBhZGRlZC5cclxuXHQgKiBAcmV0dXJuIHtmdW5jdGlvbihPYmplY3QzRCwgQ2FtZXJhLCA/U2NlbmUpOiBQcm9taXNlfHVuZGVmaW5lZH0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY29tcGlsZSBoYXMgYmVlbiBmaW5pc2hlZC5cclxuXHQgKi9cclxuXHRnZXQgY29tcGlsZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5jb21waWxlQXN5bmM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFJlbmRlcmVyO1xyXG4iLCIvKipcclxuICogQSBiaW5kaW5nIHJlcHJlc2VudHMgdGhlIGNvbm5lY3Rpb24gYmV0d2VlbiBhIHJlc291cmNlIChsaWtlIGEgdGV4dHVyZSwgc2FtcGxlclxyXG4gKiBvciB1bmlmb3JtIGJ1ZmZlcikgYW5kIHRoZSByZXNvdXJjZSBkZWZpbml0aW9uIGluIGEgc2hhZGVyIHN0YWdlLlxyXG4gKlxyXG4gKiBUaGlzIG1vZHVsZSBpcyBhbiBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhbGwgY29uY3JldGUgYmluZGluZ3MgdHlwZXMuXHJcbiAqXHJcbiAqIEBhYnN0cmFjdFxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuY2xhc3MgQmluZGluZyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYmluZGluZy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZT0nJ10gLSBUaGUgYmluZGluZydzIG5hbWUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5hbWUgPSAnJyApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBiaW5kaW5nJ3MgbmFtZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5hbWUgPSBuYW1lO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBiaXRtYXNrIHRoYXQgZGVmaW5lcyBpbiB3aGF0IHNoYWRlciBzdGFnZXMgdGhlXHJcblx0XHQgKiBiaW5kaW5nJ3MgcmVzb3VyY2UgaXMgYWNjZXNzaWJsZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnZpc2liaWxpdHkgPSAwO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE1ha2VzIHN1cmUgYmluZGluZydzIHJlc291cmNlIGlzIHZpc2libGUgZm9yIHRoZSBnaXZlbiBzaGFkZXIgc3RhZ2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdmlzaWJpbGl0eSAtIFRoZSBzaGFkZXIgc3RhZ2UuXHJcblx0ICovXHJcblx0c2V0VmlzaWJpbGl0eSggdmlzaWJpbGl0eSApIHtcclxuXHJcblx0XHR0aGlzLnZpc2liaWxpdHkgfD0gdmlzaWJpbGl0eTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDbG9uZXMgdGhlIGJpbmRpbmcuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtCaW5kaW5nfSBUaGUgY2xvbmVkIGJpbmRpbmcuXHJcblx0ICovXHJcblx0Y2xvbmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIE9iamVjdC5hc3NpZ24oIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCksIHRoaXMgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQmluZGluZztcclxuIiwiaW1wb3J0IHsgR1BVX0NIVU5LX0JZVEVTIH0gZnJvbSAnLi9Db25zdGFudHMuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgZnVuY3Rpb24gaXMgdXN1YWxseSBjYWxsZWQgd2l0aCB0aGUgbGVuZ3RoIGluIGJ5dGVzIG9mIGFuIGFycmF5IGJ1ZmZlci5cclxuICogSXQgcmV0dXJucyBhbiBwYWRkZWQgdmFsdWUgd2hpY2ggZW5zdXJlIGNodW5rIHNpemUgYWxpZ25tZW50IGFjY29yZGluZyB0byBTVEQxNDAgbGF5b3V0LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtudW1iZXJ9IGZsb2F0TGVuZ3RoIC0gVGhlIGJ1ZmZlciBsZW5ndGguXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIHBhZGRlZCBsZW5ndGguXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRGbG9hdExlbmd0aCggZmxvYXRMZW5ndGggKSB7XHJcblxyXG5cdC8vIGVuc3VyZSBjaHVuayBzaXplIGFsaWdubWVudCAoU1REMTQwIGxheW91dClcclxuXHJcblx0cmV0dXJuIGZsb2F0TGVuZ3RoICsgKCAoIEdQVV9DSFVOS19CWVRFUyAtICggZmxvYXRMZW5ndGggJSBHUFVfQ0hVTktfQllURVMgKSApICUgR1BVX0NIVU5LX0JZVEVTICk7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogR2l2ZW4gdGhlIGNvdW50IG9mIHZlY3RvcnMgYW5kIHRoZWlyIHZlY3RvciBsZW5ndGgsIHRoaXMgZnVuY3Rpb24gY29tcHV0ZXNcclxuICogYSB0b3RhbCBsZW5ndGggaW4gYnl0ZXMgd2l0aCBidWZmZXIgYWxpZ25tZW50IGFjY29yZGluZyB0byBTVEQxNDAgbGF5b3V0LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtudW1iZXJ9IGNvdW50IC0gVGhlIG51bWJlciBvZiB2ZWN0b3JzLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3ZlY3Rvckxlbmd0aD00XSAtIFRoZSB2ZWN0b3IgbGVuZ3RoLlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBwYWRkZWQgbGVuZ3RoLlxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0VmVjdG9yTGVuZ3RoKCBjb3VudCwgdmVjdG9yTGVuZ3RoID0gNCApIHtcclxuXHJcblx0Y29uc3Qgc3RyaWRlTGVuZ3RoID0gZ2V0U3RyaWRlTGVuZ3RoKCB2ZWN0b3JMZW5ndGggKTtcclxuXHJcblx0Y29uc3QgZmxvYXRMZW5ndGggPSBzdHJpZGVMZW5ndGggKiBjb3VudDtcclxuXHJcblx0cmV0dXJuIGdldEZsb2F0TGVuZ3RoKCBmbG9hdExlbmd0aCApO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggYSB2ZWN0b3IgbGVuZ3RoIGFuZCBlbnN1cmUgdGhlIGNvbXB1dGVkIGxlbmd0aFxyXG4gKiBtYXRjaGVzIGEgcHJlZGVmaW5lZCBzdHJpZGUgKGluIHRoaXMgY2FzZSBgNGApLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtudW1iZXJ9IHZlY3Rvckxlbmd0aCAtIFRoZSB2ZWN0b3IgbGVuZ3RoLlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBwYWRkZWQgbGVuZ3RoLlxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0U3RyaWRlTGVuZ3RoKCB2ZWN0b3JMZW5ndGggKSB7XHJcblxyXG5cdGNvbnN0IHN0cmlkZUxlbmd0aCA9IDQ7XHJcblxyXG5cdHJldHVybiB2ZWN0b3JMZW5ndGggKyAoICggc3RyaWRlTGVuZ3RoIC0gKCB2ZWN0b3JMZW5ndGggJSBzdHJpZGVMZW5ndGggKSApICUgc3RyaWRlTGVuZ3RoICk7XHJcblxyXG59XHJcblxyXG5leHBvcnQge1xyXG5cdGdldEZsb2F0TGVuZ3RoLFxyXG5cdGdldFZlY3Rvckxlbmd0aCxcclxuXHRnZXRTdHJpZGVMZW5ndGhcclxufTtcclxuIiwiaW1wb3J0IEJpbmRpbmcgZnJvbSAnLi9CaW5kaW5nLmpzJztcclxuaW1wb3J0IHsgZ2V0RmxvYXRMZW5ndGggfSBmcm9tICcuL0J1ZmZlclV0aWxzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIGEgYnVmZmVyIGJpbmRpbmcgdHlwZS5cclxuICpcclxuICogQHByaXZhdGVcclxuICogQGFic3RyYWN0XHJcbiAqIEBhdWdtZW50cyBCaW5kaW5nXHJcbiAqL1xyXG5jbGFzcyBCdWZmZXIgZXh0ZW5kcyBCaW5kaW5nIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBidWZmZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBidWZmZXIncyBuYW1lLlxyXG5cdCAqIEBwYXJhbSB7VHlwZWRBcnJheX0gW2J1ZmZlcj1udWxsXSAtIFRoZSBidWZmZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5hbWUsIGJ1ZmZlciA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5hbWUgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNCdWZmZXIgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGJ5dGVzIHBlciBlbGVtZW50LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYnl0ZXNQZXJFbGVtZW50ID0gRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIGludGVybmFsIGJ1ZmZlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge1R5cGVkQXJyYXl9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX2J1ZmZlciA9IGJ1ZmZlcjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgYnVmZmVyJ3MgYnl0ZSBsZW5ndGguXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdCAqIEByZWFkb25seVxyXG5cdCAqL1xyXG5cdGdldCBieXRlTGVuZ3RoKCkge1xyXG5cclxuXHRcdHJldHVybiBnZXRGbG9hdExlbmd0aCggdGhpcy5fYnVmZmVyLmJ5dGVMZW5ndGggKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBIHJlZmVyZW5jZSB0byB0aGUgaW50ZXJuYWwgYnVmZmVyLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge0Zsb2F0MzJBcnJheX1cclxuXHQgKiBAcmVhZG9ubHlcclxuXHQgKi9cclxuXHRnZXQgYnVmZmVyKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9idWZmZXI7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgYmluZGluZy5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGJ1ZmZlciBoYXMgYmVlbiB1cGRhdGVkIGFuZCBtdXN0IGJlXHJcblx0ICogdXBsb2FkZWQgdG8gdGhlIEdQVS5cclxuXHQgKi9cclxuXHR1cGRhdGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRydWU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEJ1ZmZlcjtcclxuIiwiaW1wb3J0IEJ1ZmZlciBmcm9tICcuL0J1ZmZlci5qcyc7XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyBhIHVuaWZvcm0gYnVmZmVyIGJpbmRpbmcgdHlwZS5cclxuICpcclxuICogQHByaXZhdGVcclxuICogQGF1Z21lbnRzIEJ1ZmZlclxyXG4gKi9cclxuY2xhc3MgVW5pZm9ybUJ1ZmZlciBleHRlbmRzIEJ1ZmZlciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgdW5pZm9ybSBidWZmZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBidWZmZXIncyBuYW1lLlxyXG5cdCAqIEBwYXJhbSB7VHlwZWRBcnJheX0gW2J1ZmZlcj1udWxsXSAtIFRoZSBidWZmZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5hbWUsIGJ1ZmZlciA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5hbWUsIGJ1ZmZlciApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1VuaWZvcm1CdWZmZXIgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBVbmlmb3JtQnVmZmVyO1xyXG4iLCJpbXBvcnQgVW5pZm9ybUJ1ZmZlciBmcm9tICcuLi9Vbmlmb3JtQnVmZmVyLmpzJztcclxuXHJcbmxldCBfaWQgPSAwO1xyXG5cclxuLyoqXHJcbiAqIEEgc3BlY2lhbCBmb3JtIG9mIHVuaWZvcm0gYnVmZmVyIGJpbmRpbmcgdHlwZS5cclxuICogSXQncyBidWZmZXIgdmFsdWUgaXMgbWFuYWdlZCBieSBhIG5vZGUgb2JqZWN0LlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAYXVnbWVudHMgVW5pZm9ybUJ1ZmZlclxyXG4gKi9cclxuY2xhc3MgTm9kZVVuaWZvcm1CdWZmZXIgZXh0ZW5kcyBVbmlmb3JtQnVmZmVyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBub2RlLWJhc2VkIHVuaWZvcm0gYnVmZmVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCdWZmZXJOb2RlfSBub2RlVW5pZm9ybSAtIFRoZSB1bmlmb3JtIGJ1ZmZlciBub2RlLlxyXG5cdCAqIEBwYXJhbSB7VW5pZm9ybUdyb3VwTm9kZX0gZ3JvdXBOb2RlIC0gVGhlIHVuaWZvcm0gZ3JvdXAgbm9kZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggbm9kZVVuaWZvcm0sIGdyb3VwTm9kZSApIHtcclxuXHJcblx0XHRzdXBlciggJ1VuaWZvcm1CdWZmZXJfJyArIF9pZCArKywgbm9kZVVuaWZvcm0gPyBub2RlVW5pZm9ybS52YWx1ZSA6IG51bGwgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB1bmlmb3JtIGJ1ZmZlciBub2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtCdWZmZXJOb2RlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vZGVVbmlmb3JtID0gbm9kZVVuaWZvcm07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdW5pZm9ybSBncm91cCBub2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtVbmlmb3JtR3JvdXBOb2RlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdyb3VwTm9kZSA9IGdyb3VwTm9kZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgdW5pZm9ybSBidWZmZXIuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7RmxvYXQzMkFycmF5fVxyXG5cdCAqL1xyXG5cdGdldCBidWZmZXIoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubm9kZVVuaWZvcm0udmFsdWU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IE5vZGVVbmlmb3JtQnVmZmVyO1xyXG4iLCJpbXBvcnQgVW5pZm9ybUJ1ZmZlciBmcm9tICcuL1VuaWZvcm1CdWZmZXIuanMnO1xyXG5pbXBvcnQgeyBHUFVfQ0hVTktfQllURVMgfSBmcm9tICcuL0NvbnN0YW50cy5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgdW5pZm9ybSBidWZmZXIgYmluZGluZyBidXQgd2l0aFxyXG4gKiBhbiBBUEkgdGhhdCBhbGxvd3MgdG8gbWFpbnRhaW4gaW5kaXZpZHVhbCB1bmlmb3JtIG9iamVjdHMuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBhdWdtZW50cyBVbmlmb3JtQnVmZmVyXHJcbiAqL1xyXG5jbGFzcyBVbmlmb3Jtc0dyb3VwIGV4dGVuZHMgVW5pZm9ybUJ1ZmZlciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgdW5pZm9ybXMgZ3JvdXAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBncm91cCdzIG5hbWUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5hbWUgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5hbWUgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNVbmlmb3Jtc0dyb3VwID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIGFycmF5IHdpdGggdGhlIHJhdyB1bmlmb3JtIHZhbHVlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUgez9BcnJheTxudW1iZXI+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl92YWx1ZXMgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQW4gYXJyYXkgb2YgdW5pZm9ybSBvYmplY3RzLlxyXG5cdFx0ICpcclxuXHRcdCAqIFRoZSBvcmRlciBvZiB1bmlmb3JtcyBpbiB0aGlzIGFycmF5IG11c3QgbWF0Y2ggdGhlIG9yZGVyIG9mIHVuaWZvcm1zIGluIHRoZSBzaGFkZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PFVuaWZvcm0+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVuaWZvcm1zID0gW107XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyBhIHVuaWZvcm0gdG8gdGhpcyBncm91cC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VW5pZm9ybX0gdW5pZm9ybSAtIFRoZSB1bmlmb3JtIHRvIGFkZC5cclxuXHQgKiBAcmV0dXJuIHtVbmlmb3Jtc0dyb3VwfSBBIHJlZmVyZW5jZSB0byB0aGlzIGdyb3VwLlxyXG5cdCAqL1xyXG5cdGFkZFVuaWZvcm0oIHVuaWZvcm0gKSB7XHJcblxyXG5cdFx0dGhpcy51bmlmb3Jtcy5wdXNoKCB1bmlmb3JtICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVtb3ZlcyBhIHVuaWZvcm0gZnJvbSB0aGlzIGdyb3VwLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtVbmlmb3JtfSB1bmlmb3JtIC0gVGhlIHVuaWZvcm0gdG8gcmVtb3ZlLlxyXG5cdCAqIEByZXR1cm4ge1VuaWZvcm1zR3JvdXB9IEEgcmVmZXJlbmNlIHRvIHRoaXMgZ3JvdXAuXHJcblx0ICovXHJcblx0cmVtb3ZlVW5pZm9ybSggdW5pZm9ybSApIHtcclxuXHJcblx0XHRjb25zdCBpbmRleCA9IHRoaXMudW5pZm9ybXMuaW5kZXhPZiggdW5pZm9ybSApO1xyXG5cclxuXHRcdGlmICggaW5kZXggIT09IC0gMSApIHtcclxuXHJcblx0XHRcdHRoaXMudW5pZm9ybXMuc3BsaWNlKCBpbmRleCwgMSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBbiBhcnJheSB3aXRoIHRoZSByYXcgdW5pZm9ybSB2YWx1ZXMuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7QXJyYXk8bnVtYmVyPn1cclxuXHQgKi9cclxuXHRnZXQgdmFsdWVzKCkge1xyXG5cclxuXHRcdGlmICggdGhpcy5fdmFsdWVzID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5fdmFsdWVzID0gQXJyYXkuZnJvbSggdGhpcy5idWZmZXIgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX3ZhbHVlcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBIEZsb2F0MzIgYXJyYXkgYnVmZmVyIHdpdGggdGhlIHVuaWZvcm0gdmFsdWVzLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge0Zsb2F0MzJBcnJheX1cclxuXHQgKi9cclxuXHRnZXQgYnVmZmVyKCkge1xyXG5cclxuXHRcdGxldCBidWZmZXIgPSB0aGlzLl9idWZmZXI7XHJcblxyXG5cdFx0aWYgKCBidWZmZXIgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBieXRlTGVuZ3RoID0gdGhpcy5ieXRlTGVuZ3RoO1xyXG5cclxuXHRcdFx0YnVmZmVyID0gbmV3IEZsb2F0MzJBcnJheSggbmV3IEFycmF5QnVmZmVyKCBieXRlTGVuZ3RoICkgKTtcclxuXHJcblx0XHRcdHRoaXMuX2J1ZmZlciA9IGJ1ZmZlcjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGJ1ZmZlcjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgYnl0ZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciB3aXRoIGNvcnJlY3QgYnVmZmVyIGFsaWdubWVudC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0ICovXHJcblx0Z2V0IGJ5dGVMZW5ndGgoKSB7XHJcblxyXG5cdFx0bGV0IG9mZnNldCA9IDA7IC8vIGdsb2JhbCBidWZmZXIgb2Zmc2V0IGluIGJ5dGVzXHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gdGhpcy51bmlmb3Jtcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdW5pZm9ybSA9IHRoaXMudW5pZm9ybXNbIGkgXTtcclxuXHJcblx0XHRcdGNvbnN0IHsgYm91bmRhcnksIGl0ZW1TaXplIH0gPSB1bmlmb3JtO1xyXG5cclxuXHRcdFx0Ly8gb2Zmc2V0IHdpdGhpbiBhIHNpbmdsZSBjaHVuayBpbiBieXRlc1xyXG5cclxuXHRcdFx0Y29uc3QgY2h1bmtPZmZzZXQgPSBvZmZzZXQgJSBHUFVfQ0hVTktfQllURVM7XHJcblx0XHRcdGNvbnN0IHJlbWFpbmluZ1NpemVJbkNodW5rID0gR1BVX0NIVU5LX0JZVEVTIC0gY2h1bmtPZmZzZXQ7XHJcblxyXG5cdFx0XHQvLyBjb25mb3JtYW5jZSB0ZXN0c1xyXG5cclxuXHRcdFx0aWYgKCBjaHVua09mZnNldCAhPT0gMCAmJiAoIHJlbWFpbmluZ1NpemVJbkNodW5rIC0gYm91bmRhcnkgKSA8IDAgKSB7XHJcblxyXG5cdFx0XHRcdC8vIGNoZWNrIGZvciBjaHVuayBvdmVyZmxvd1xyXG5cclxuXHRcdFx0XHRvZmZzZXQgKz0gKCBHUFVfQ0hVTktfQllURVMgLSBjaHVua09mZnNldCApO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggY2h1bmtPZmZzZXQgJSBib3VuZGFyeSAhPT0gMCApIHtcclxuXHJcblx0XHRcdFx0Ly8gY2hlY2sgZm9yIGNvcnJlY3QgYWxpZ25tZW50XHJcblxyXG5cdFx0XHRcdG9mZnNldCArPSAoIGNodW5rT2Zmc2V0ICUgYm91bmRhcnkgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHVuaWZvcm0ub2Zmc2V0ID0gKCBvZmZzZXQgLyB0aGlzLmJ5dGVzUGVyRWxlbWVudCApO1xyXG5cclxuXHRcdFx0b2Zmc2V0ICs9ICggaXRlbVNpemUgKiB0aGlzLmJ5dGVzUGVyRWxlbWVudCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gTWF0aC5jZWlsKCBvZmZzZXQgLyBHUFVfQ0hVTktfQllURVMgKSAqIEdQVV9DSFVOS19CWVRFUztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoaXMgZ3JvdXAgYnkgdXBkYXRpbmcgZWFjaCB1bmlmb3JtIG9iamVjdCBvZlxyXG5cdCAqIHRoZSBpbnRlcm5hbCB1bmlmb3JtIGxpc3QuIFRoZSB1bmlmb3JtIG9iamVjdHMgY2hlY2sgaWYgdGhlaXJcclxuXHQgKiB2YWx1ZXMgaGFzIGFjdHVhbGx5IGNoYW5nZWQgc28gdGhpcyBtZXRob2Qgb25seSByZXR1cm5zXHJcblx0ICogYHRydWVgIGlmIHRoZXJlIGlzIGEgcmVhbCB2YWx1ZSBjaGFuZ2UuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSB1bmlmb3JtcyBoYXZlIGJlZW4gdXBkYXRlZCBhbmRcclxuXHQgKiBtdXN0IGJlIHVwbG9hZGVkIHRvIHRoZSBHUFUuXHJcblx0ICovXHJcblx0dXBkYXRlKCkge1xyXG5cclxuXHRcdGxldCB1cGRhdGVkID0gZmFsc2U7XHJcblxyXG5cdFx0Zm9yICggY29uc3QgdW5pZm9ybSBvZiB0aGlzLnVuaWZvcm1zICkge1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLnVwZGF0ZUJ5VHlwZSggdW5pZm9ybSApID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHR1cGRhdGVkID0gdHJ1ZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHVwZGF0ZWQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyBhIGdpdmVuIHVuaWZvcm0gYnkgY2FsbGluZyBhbiB1cGRhdGUgbWV0aG9kIG1hdGNoaW5nXHJcblx0ICogdGhlIHVuaWZvcm1zIHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1VuaWZvcm19IHVuaWZvcm0gLSBUaGUgdW5pZm9ybSB0byB1cGRhdGUuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgdW5pZm9ybSBoYXMgYmVlbiB1cGRhdGVkIG9yIG5vdC5cclxuXHQgKi9cclxuXHR1cGRhdGVCeVR5cGUoIHVuaWZvcm0gKSB7XHJcblxyXG5cdFx0aWYgKCB1bmlmb3JtLmlzTnVtYmVyVW5pZm9ybSApIHJldHVybiB0aGlzLnVwZGF0ZU51bWJlciggdW5pZm9ybSApO1xyXG5cdFx0aWYgKCB1bmlmb3JtLmlzVmVjdG9yMlVuaWZvcm0gKSByZXR1cm4gdGhpcy51cGRhdGVWZWN0b3IyKCB1bmlmb3JtICk7XHJcblx0XHRpZiAoIHVuaWZvcm0uaXNWZWN0b3IzVW5pZm9ybSApIHJldHVybiB0aGlzLnVwZGF0ZVZlY3RvcjMoIHVuaWZvcm0gKTtcclxuXHRcdGlmICggdW5pZm9ybS5pc1ZlY3RvcjRVbmlmb3JtICkgcmV0dXJuIHRoaXMudXBkYXRlVmVjdG9yNCggdW5pZm9ybSApO1xyXG5cdFx0aWYgKCB1bmlmb3JtLmlzQ29sb3JVbmlmb3JtICkgcmV0dXJuIHRoaXMudXBkYXRlQ29sb3IoIHVuaWZvcm0gKTtcclxuXHRcdGlmICggdW5pZm9ybS5pc01hdHJpeDNVbmlmb3JtICkgcmV0dXJuIHRoaXMudXBkYXRlTWF0cml4MyggdW5pZm9ybSApO1xyXG5cdFx0aWYgKCB1bmlmb3JtLmlzTWF0cml4NFVuaWZvcm0gKSByZXR1cm4gdGhpcy51cGRhdGVNYXRyaXg0KCB1bmlmb3JtICk7XHJcblxyXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdQVVVuaWZvcm1zR3JvdXA6IFVuc3VwcG9ydGVkIHVuaWZvcm0gdHlwZS4nLCB1bmlmb3JtICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyBhIGdpdmVuIE51bWJlciB1bmlmb3JtLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOdW1iZXJVbmlmb3JtfSB1bmlmb3JtIC0gVGhlIE51bWJlciB1bmlmb3JtLlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHVuaWZvcm0gaGFzIGJlZW4gdXBkYXRlZCBvciBub3QuXHJcblx0ICovXHJcblx0dXBkYXRlTnVtYmVyKCB1bmlmb3JtICkge1xyXG5cclxuXHRcdGxldCB1cGRhdGVkID0gZmFsc2U7XHJcblxyXG5cdFx0Y29uc3QgYSA9IHRoaXMudmFsdWVzO1xyXG5cdFx0Y29uc3QgdiA9IHVuaWZvcm0uZ2V0VmFsdWUoKTtcclxuXHRcdGNvbnN0IG9mZnNldCA9IHVuaWZvcm0ub2Zmc2V0O1xyXG5cdFx0Y29uc3QgdHlwZSA9IHVuaWZvcm0uZ2V0VHlwZSgpO1xyXG5cclxuXHRcdGlmICggYVsgb2Zmc2V0IF0gIT09IHYgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBiID0gdGhpcy5fZ2V0QnVmZmVyRm9yVHlwZSggdHlwZSApO1xyXG5cclxuXHRcdFx0Ylsgb2Zmc2V0IF0gPSBhWyBvZmZzZXQgXSA9IHY7XHJcblx0XHRcdHVwZGF0ZWQgPSB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdXBkYXRlZDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIGEgZ2l2ZW4gVmVjdG9yMiB1bmlmb3JtLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyVW5pZm9ybX0gdW5pZm9ybSAtIFRoZSBWZWN0b3IyIHVuaWZvcm0uXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgdW5pZm9ybSBoYXMgYmVlbiB1cGRhdGVkIG9yIG5vdC5cclxuXHQgKi9cclxuXHR1cGRhdGVWZWN0b3IyKCB1bmlmb3JtICkge1xyXG5cclxuXHRcdGxldCB1cGRhdGVkID0gZmFsc2U7XHJcblxyXG5cdFx0Y29uc3QgYSA9IHRoaXMudmFsdWVzO1xyXG5cdFx0Y29uc3QgdiA9IHVuaWZvcm0uZ2V0VmFsdWUoKTtcclxuXHRcdGNvbnN0IG9mZnNldCA9IHVuaWZvcm0ub2Zmc2V0O1xyXG5cdFx0Y29uc3QgdHlwZSA9IHVuaWZvcm0uZ2V0VHlwZSgpO1xyXG5cclxuXHRcdGlmICggYVsgb2Zmc2V0ICsgMCBdICE9PSB2LnggfHwgYVsgb2Zmc2V0ICsgMSBdICE9PSB2LnkgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBiID0gdGhpcy5fZ2V0QnVmZmVyRm9yVHlwZSggdHlwZSApO1xyXG5cclxuXHRcdFx0Ylsgb2Zmc2V0ICsgMCBdID0gYVsgb2Zmc2V0ICsgMCBdID0gdi54O1xyXG5cdFx0XHRiWyBvZmZzZXQgKyAxIF0gPSBhWyBvZmZzZXQgKyAxIF0gPSB2Lnk7XHJcblxyXG5cdFx0XHR1cGRhdGVkID0gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHVwZGF0ZWQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyBhIGdpdmVuIFZlY3RvcjMgdW5pZm9ybS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM1VuaWZvcm19IHVuaWZvcm0gLSBUaGUgVmVjdG9yMyB1bmlmb3JtLlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHVuaWZvcm0gaGFzIGJlZW4gdXBkYXRlZCBvciBub3QuXHJcblx0ICovXHJcblx0dXBkYXRlVmVjdG9yMyggdW5pZm9ybSApIHtcclxuXHJcblx0XHRsZXQgdXBkYXRlZCA9IGZhbHNlO1xyXG5cclxuXHRcdGNvbnN0IGEgPSB0aGlzLnZhbHVlcztcclxuXHRcdGNvbnN0IHYgPSB1bmlmb3JtLmdldFZhbHVlKCk7XHJcblx0XHRjb25zdCBvZmZzZXQgPSB1bmlmb3JtLm9mZnNldDtcclxuXHRcdGNvbnN0IHR5cGUgPSB1bmlmb3JtLmdldFR5cGUoKTtcclxuXHJcblx0XHRpZiAoIGFbIG9mZnNldCArIDAgXSAhPT0gdi54IHx8IGFbIG9mZnNldCArIDEgXSAhPT0gdi55IHx8IGFbIG9mZnNldCArIDIgXSAhPT0gdi56ICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYiA9IHRoaXMuX2dldEJ1ZmZlckZvclR5cGUoIHR5cGUgKTtcclxuXHJcblx0XHRcdGJbIG9mZnNldCArIDAgXSA9IGFbIG9mZnNldCArIDAgXSA9IHYueDtcclxuXHRcdFx0Ylsgb2Zmc2V0ICsgMSBdID0gYVsgb2Zmc2V0ICsgMSBdID0gdi55O1xyXG5cdFx0XHRiWyBvZmZzZXQgKyAyIF0gPSBhWyBvZmZzZXQgKyAyIF0gPSB2Lno7XHJcblxyXG5cdFx0XHR1cGRhdGVkID0gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHVwZGF0ZWQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyBhIGdpdmVuIFZlY3RvcjQgdW5pZm9ybS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yNFVuaWZvcm19IHVuaWZvcm0gLSBUaGUgVmVjdG9yNCB1bmlmb3JtLlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHVuaWZvcm0gaGFzIGJlZW4gdXBkYXRlZCBvciBub3QuXHJcblx0ICovXHJcblx0dXBkYXRlVmVjdG9yNCggdW5pZm9ybSApIHtcclxuXHJcblx0XHRsZXQgdXBkYXRlZCA9IGZhbHNlO1xyXG5cclxuXHRcdGNvbnN0IGEgPSB0aGlzLnZhbHVlcztcclxuXHRcdGNvbnN0IHYgPSB1bmlmb3JtLmdldFZhbHVlKCk7XHJcblx0XHRjb25zdCBvZmZzZXQgPSB1bmlmb3JtLm9mZnNldDtcclxuXHRcdGNvbnN0IHR5cGUgPSB1bmlmb3JtLmdldFR5cGUoKTtcclxuXHJcblx0XHRpZiAoIGFbIG9mZnNldCArIDAgXSAhPT0gdi54IHx8IGFbIG9mZnNldCArIDEgXSAhPT0gdi55IHx8IGFbIG9mZnNldCArIDIgXSAhPT0gdi56IHx8IGFbIG9mZnNldCArIDQgXSAhPT0gdi53ICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYiA9IHRoaXMuX2dldEJ1ZmZlckZvclR5cGUoIHR5cGUgKTtcclxuXHJcblx0XHRcdGJbIG9mZnNldCArIDAgXSA9IGFbIG9mZnNldCArIDAgXSA9IHYueDtcclxuXHRcdFx0Ylsgb2Zmc2V0ICsgMSBdID0gYVsgb2Zmc2V0ICsgMSBdID0gdi55O1xyXG5cdFx0XHRiWyBvZmZzZXQgKyAyIF0gPSBhWyBvZmZzZXQgKyAyIF0gPSB2Lno7XHJcblx0XHRcdGJbIG9mZnNldCArIDMgXSA9IGFbIG9mZnNldCArIDMgXSA9IHYudztcclxuXHJcblx0XHRcdHVwZGF0ZWQgPSB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdXBkYXRlZDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIGEgZ2l2ZW4gQ29sb3IgdW5pZm9ybS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Q29sb3JVbmlmb3JtfSB1bmlmb3JtIC0gVGhlIENvbG9yIHVuaWZvcm0uXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgdW5pZm9ybSBoYXMgYmVlbiB1cGRhdGVkIG9yIG5vdC5cclxuXHQgKi9cclxuXHR1cGRhdGVDb2xvciggdW5pZm9ybSApIHtcclxuXHJcblx0XHRsZXQgdXBkYXRlZCA9IGZhbHNlO1xyXG5cclxuXHRcdGNvbnN0IGEgPSB0aGlzLnZhbHVlcztcclxuXHRcdGNvbnN0IGMgPSB1bmlmb3JtLmdldFZhbHVlKCk7XHJcblx0XHRjb25zdCBvZmZzZXQgPSB1bmlmb3JtLm9mZnNldDtcclxuXHJcblx0XHRpZiAoIGFbIG9mZnNldCArIDAgXSAhPT0gYy5yIHx8IGFbIG9mZnNldCArIDEgXSAhPT0gYy5nIHx8IGFbIG9mZnNldCArIDIgXSAhPT0gYy5iICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYiA9IHRoaXMuYnVmZmVyO1xyXG5cclxuXHRcdFx0Ylsgb2Zmc2V0ICsgMCBdID0gYVsgb2Zmc2V0ICsgMCBdID0gYy5yO1xyXG5cdFx0XHRiWyBvZmZzZXQgKyAxIF0gPSBhWyBvZmZzZXQgKyAxIF0gPSBjLmc7XHJcblx0XHRcdGJbIG9mZnNldCArIDIgXSA9IGFbIG9mZnNldCArIDIgXSA9IGMuYjtcclxuXHJcblx0XHRcdHVwZGF0ZWQgPSB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdXBkYXRlZDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIGEgZ2l2ZW4gTWF0cml4MyB1bmlmb3JtLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRyaXgzVW5pZm9ybX0gdW5pZm9ybSAtIFRoZSBNYXRyaXgzIHVuaWZvcm0uXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgdW5pZm9ybSBoYXMgYmVlbiB1cGRhdGVkIG9yIG5vdC5cclxuXHQgKi9cclxuXHR1cGRhdGVNYXRyaXgzKCB1bmlmb3JtICkge1xyXG5cclxuXHRcdGxldCB1cGRhdGVkID0gZmFsc2U7XHJcblxyXG5cdFx0Y29uc3QgYSA9IHRoaXMudmFsdWVzO1xyXG5cdFx0Y29uc3QgZSA9IHVuaWZvcm0uZ2V0VmFsdWUoKS5lbGVtZW50cztcclxuXHRcdGNvbnN0IG9mZnNldCA9IHVuaWZvcm0ub2Zmc2V0O1xyXG5cclxuXHRcdGlmICggYVsgb2Zmc2V0ICsgMCBdICE9PSBlWyAwIF0gfHwgYVsgb2Zmc2V0ICsgMSBdICE9PSBlWyAxIF0gfHwgYVsgb2Zmc2V0ICsgMiBdICE9PSBlWyAyIF0gfHxcclxuXHRcdFx0YVsgb2Zmc2V0ICsgNCBdICE9PSBlWyAzIF0gfHwgYVsgb2Zmc2V0ICsgNSBdICE9PSBlWyA0IF0gfHwgYVsgb2Zmc2V0ICsgNiBdICE9PSBlWyA1IF0gfHxcclxuXHRcdFx0YVsgb2Zmc2V0ICsgOCBdICE9PSBlWyA2IF0gfHwgYVsgb2Zmc2V0ICsgOSBdICE9PSBlWyA3IF0gfHwgYVsgb2Zmc2V0ICsgMTAgXSAhPT0gZVsgOCBdICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYiA9IHRoaXMuYnVmZmVyO1xyXG5cclxuXHRcdFx0Ylsgb2Zmc2V0ICsgMCBdID0gYVsgb2Zmc2V0ICsgMCBdID0gZVsgMCBdO1xyXG5cdFx0XHRiWyBvZmZzZXQgKyAxIF0gPSBhWyBvZmZzZXQgKyAxIF0gPSBlWyAxIF07XHJcblx0XHRcdGJbIG9mZnNldCArIDIgXSA9IGFbIG9mZnNldCArIDIgXSA9IGVbIDIgXTtcclxuXHRcdFx0Ylsgb2Zmc2V0ICsgNCBdID0gYVsgb2Zmc2V0ICsgNCBdID0gZVsgMyBdO1xyXG5cdFx0XHRiWyBvZmZzZXQgKyA1IF0gPSBhWyBvZmZzZXQgKyA1IF0gPSBlWyA0IF07XHJcblx0XHRcdGJbIG9mZnNldCArIDYgXSA9IGFbIG9mZnNldCArIDYgXSA9IGVbIDUgXTtcclxuXHRcdFx0Ylsgb2Zmc2V0ICsgOCBdID0gYVsgb2Zmc2V0ICsgOCBdID0gZVsgNiBdO1xyXG5cdFx0XHRiWyBvZmZzZXQgKyA5IF0gPSBhWyBvZmZzZXQgKyA5IF0gPSBlWyA3IF07XHJcblx0XHRcdGJbIG9mZnNldCArIDEwIF0gPSBhWyBvZmZzZXQgKyAxMCBdID0gZVsgOCBdO1xyXG5cclxuXHRcdFx0dXBkYXRlZCA9IHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB1cGRhdGVkO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgYSBnaXZlbiBNYXRyaXg0IHVuaWZvcm0uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDRVbmlmb3JtfSB1bmlmb3JtIC0gVGhlIE1hdHJpeDQgdW5pZm9ybS5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSB1bmlmb3JtIGhhcyBiZWVuIHVwZGF0ZWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdHVwZGF0ZU1hdHJpeDQoIHVuaWZvcm0gKSB7XHJcblxyXG5cdFx0bGV0IHVwZGF0ZWQgPSBmYWxzZTtcclxuXHJcblx0XHRjb25zdCBhID0gdGhpcy52YWx1ZXM7XHJcblx0XHRjb25zdCBlID0gdW5pZm9ybS5nZXRWYWx1ZSgpLmVsZW1lbnRzO1xyXG5cdFx0Y29uc3Qgb2Zmc2V0ID0gdW5pZm9ybS5vZmZzZXQ7XHJcblxyXG5cdFx0aWYgKCBhcnJheXNFcXVhbCggYSwgZSwgb2Zmc2V0ICkgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYiA9IHRoaXMuYnVmZmVyO1xyXG5cdFx0XHRiLnNldCggZSwgb2Zmc2V0ICk7XHJcblx0XHRcdHNldEFycmF5KCBhLCBlLCBvZmZzZXQgKTtcclxuXHRcdFx0dXBkYXRlZCA9IHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB1cGRhdGVkO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSB0eXBlZCBhcnJheSB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIGRhdGEgdHlwZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIGRhdGEgdHlwZS5cclxuXHQgKiBAcmV0dXJuIHtUeXBlZEFycmF5fSBUaGUgdHlwZWQgYXJyYXkuXHJcblx0ICovXHJcblx0X2dldEJ1ZmZlckZvclR5cGUoIHR5cGUgKSB7XHJcblxyXG5cdFx0aWYgKCB0eXBlID09PSAnaW50JyB8fCB0eXBlID09PSAnaXZlYzInIHx8IHR5cGUgPT09ICdpdmVjMycgfHwgdHlwZSA9PT0gJ2l2ZWM0JyApIHJldHVybiBuZXcgSW50MzJBcnJheSggdGhpcy5idWZmZXIuYnVmZmVyICk7XHJcblx0XHRpZiAoIHR5cGUgPT09ICd1aW50JyB8fCB0eXBlID09PSAndXZlYzInIHx8IHR5cGUgPT09ICd1dmVjMycgfHwgdHlwZSA9PT0gJ3V2ZWM0JyApIHJldHVybiBuZXcgVWludDMyQXJyYXkoIHRoaXMuYnVmZmVyLmJ1ZmZlciApO1xyXG5cdFx0cmV0dXJuIHRoaXMuYnVmZmVyO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogU2V0cyB0aGUgdmFsdWVzIG9mIHRoZSBzZWNvbmQgYXJyYXkgdG8gdGhlIGZpcnN0IGFycmF5LlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAcGFyYW0ge1R5cGVkQXJyYXl9IGEgLSBUaGUgZmlyc3QgYXJyYXkuXHJcbiAqIEBwYXJhbSB7VHlwZWRBcnJheX0gYiAtIFRoZSBzZWNvbmQgYXJyYXkuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBvZmZzZXQgLSBBbiBpbmRleCBvZmZzZXQgZm9yIHRoZSBmaXJzdCBhcnJheS5cclxuICovXHJcbmZ1bmN0aW9uIHNldEFycmF5KCBhLCBiLCBvZmZzZXQgKSB7XHJcblxyXG5cdGZvciAoIGxldCBpID0gMCwgbCA9IGIubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRhWyBvZmZzZXQgKyBpIF0gPSBiWyBpIF07XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gYXJyYXlzIGFyZSBlcXVhbC5cclxuICpcclxuICogQHByaXZhdGVcclxuICogQHBhcmFtIHtUeXBlZEFycmF5fSBhIC0gVGhlIGZpcnN0IGFycmF5LlxyXG4gKiBAcGFyYW0ge1R5cGVkQXJyYXl9IGIgLSBUaGUgc2Vjb25kIGFycmF5LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0IC0gQW4gaW5kZXggb2Zmc2V0IGZvciB0aGUgZmlyc3QgYXJyYXkuXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGdpdmVuIGFycmF5cyBhcmUgZXF1YWwgb3Igbm90LlxyXG4gKi9cclxuZnVuY3Rpb24gYXJyYXlzRXF1YWwoIGEsIGIsIG9mZnNldCApIHtcclxuXHJcblx0Zm9yICggbGV0IGkgPSAwLCBsID0gYi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdGlmICggYVsgb2Zmc2V0ICsgaSBdICE9PSBiWyBpIF0gKSByZXR1cm4gZmFsc2U7XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIHRydWU7XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBVbmlmb3Jtc0dyb3VwO1xyXG4iLCJpbXBvcnQgVW5pZm9ybXNHcm91cCBmcm9tICcuLi9Vbmlmb3Jtc0dyb3VwLmpzJztcclxuXHJcbmxldCBfaWQgPSAwO1xyXG5cclxuLyoqXHJcbiAqIEEgc3BlY2lhbCBmb3JtIG9mIHVuaWZvcm1zIGdyb3VwIHRoYXQgcmVwcmVzZW50c1xyXG4gKiB0aGUgaW5kaXZpZHVhbCB1bmlmb3JtcyBhcyBub2RlLWJhc2VkIHVuaWZvcm1zLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAYXVnbWVudHMgVW5pZm9ybXNHcm91cFxyXG4gKi9cclxuY2xhc3MgTm9kZVVuaWZvcm1zR3JvdXAgZXh0ZW5kcyBVbmlmb3Jtc0dyb3VwIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBub2RlLWJhc2VkIHVuaWZvcm1zIGdyb3VwLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgZ3JvdXAncyBuYW1lLlxyXG5cdCAqIEBwYXJhbSB7VW5pZm9ybUdyb3VwTm9kZX0gZ3JvdXBOb2RlIC0gVGhlIHVuaWZvcm0gZ3JvdXAgbm9kZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbmFtZSwgZ3JvdXBOb2RlICkge1xyXG5cclxuXHRcdHN1cGVyKCBuYW1lICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZ3JvdXAncyBJRC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlkID0gX2lkICsrO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHVuaWZvcm0gZ3JvdXAgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VW5pZm9ybUdyb3VwTm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ncm91cE5vZGUgPSBncm91cE5vZGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzTm9kZVVuaWZvcm1zR3JvdXAgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBOb2RlVW5pZm9ybXNHcm91cDtcclxuIiwiaW1wb3J0IEJpbmRpbmcgZnJvbSAnLi9CaW5kaW5nLmpzJztcclxuXHJcbmxldCBfaWQgPSAwO1xyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgYSBzYW1wbGVkIHRleHR1cmUgYmluZGluZyB0eXBlLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAYXVnbWVudHMgQmluZGluZ1xyXG4gKi9cclxuY2xhc3MgU2FtcGxlZFRleHR1cmUgZXh0ZW5kcyBCaW5kaW5nIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBzYW1wbGVkIHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBzYW1wbGVkIHRleHR1cmUncyBuYW1lLlxyXG5cdCAqIEBwYXJhbSB7P1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZSB0aGlzIGJpbmRpbmcgaXMgcmVmZXJyaW5nIHRvLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBuYW1lLCB0ZXh0dXJlICkge1xyXG5cclxuXHRcdHN1cGVyKCBuYW1lICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGlkZW50aWZpZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pZCA9IF9pZCArKztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB0ZXh0dXJlIHRoaXMgYmluZGluZyBpcyByZWZlcnJpbmcgdG8uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRleHR1cmUgPSB0ZXh0dXJlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGJpbmRpbmcncyB2ZXJzaW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudmVyc2lvbiA9IHRleHR1cmUgPyB0ZXh0dXJlLnZlcnNpb24gOiAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgdGV4dHVyZSBpcyBhIHN0b3JhZ2UgdGV4dHVyZSBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnN0b3JlID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYmluZGluZydzIGdlbmVyYXRpb24gd2hpY2ggaXMgYW4gYWRkaXRpb25hbCB2ZXJzaW9uXHJcblx0XHQgKiBxdWFsaWZpZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9udW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ2VuZXJhdGlvbiA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzU2FtcGxlZFRleHR1cmUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIHdoZXRoZXIgdGhpcyBiaW5kaW5nIHJlcXVpcmVzIGFuIHVwZGF0ZSBmb3IgdGhlXHJcblx0ICogZ2l2ZW4gZ2VuZXJhdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBnZW5lcmF0aW9uIC0gVGhlIGdlbmVyYXRpb24uXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciBhbiB1cGRhdGUgaXMgcmVxdWlyZWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdG5lZWRzQmluZGluZ3NVcGRhdGUoIGdlbmVyYXRpb24gKSB7XHJcblxyXG5cdFx0Y29uc3QgeyB0ZXh0dXJlIH0gPSB0aGlzO1xyXG5cclxuXHRcdGlmICggZ2VuZXJhdGlvbiAhPT0gdGhpcy5nZW5lcmF0aW9uICkge1xyXG5cclxuXHRcdFx0dGhpcy5nZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjtcclxuXHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGV4dHVyZS5pc1ZpZGVvVGV4dHVyZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoZSBiaW5kaW5nLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgdGV4dHVyZSBoYXMgYmVlbiB1cGRhdGVkIGFuZCBtdXN0IGJlXHJcblx0ICogdXBsb2FkZWQgdG8gdGhlIEdQVS5cclxuXHQgKi9cclxuXHR1cGRhdGUoKSB7XHJcblxyXG5cdFx0Y29uc3QgeyB0ZXh0dXJlLCB2ZXJzaW9uIH0gPSB0aGlzO1xyXG5cclxuXHRcdGlmICggdmVyc2lvbiAhPT0gdGV4dHVyZS52ZXJzaW9uICkge1xyXG5cclxuXHRcdFx0dGhpcy52ZXJzaW9uID0gdGV4dHVyZS52ZXJzaW9uO1xyXG5cclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBmYWxzZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgYSBzYW1wbGVkIGFycmF5IHRleHR1cmUgYmluZGluZyB0eXBlLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAYXVnbWVudHMgU2FtcGxlZFRleHR1cmVcclxuICovXHJcbmNsYXNzIFNhbXBsZWRBcnJheVRleHR1cmUgZXh0ZW5kcyBTYW1wbGVkVGV4dHVyZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc2FtcGxlZCBhcnJheSB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgc2FtcGxlZCBhcnJheSB0ZXh0dXJlJ3MgbmFtZS5cclxuXHQgKiBAcGFyYW0gez8oRGF0YUFycmF5VGV4dHVyZXxDb21wcmVzc2VkQXJyYXlUZXh0dXJlKX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlIHRoaXMgYmluZGluZyBpcyByZWZlcnJpbmcgdG8uXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5hbWUsIHRleHR1cmUgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5hbWUsIHRleHR1cmUgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNTYW1wbGVkQXJyYXlUZXh0dXJlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgYSBzYW1wbGVkIDNEIHRleHR1cmUgYmluZGluZyB0eXBlLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAYXVnbWVudHMgU2FtcGxlZFRleHR1cmVcclxuICovXHJcbmNsYXNzIFNhbXBsZWQzRFRleHR1cmUgZXh0ZW5kcyBTYW1wbGVkVGV4dHVyZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc2FtcGxlZCAzRCB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgc2FtcGxlZCAzRCB0ZXh0dXJlJ3MgbmFtZS5cclxuXHQgKiBAcGFyYW0gez9EYXRhM0RUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUgdGhpcyBiaW5kaW5nIGlzIHJlZmVycmluZyB0by5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbmFtZSwgdGV4dHVyZSApIHtcclxuXHJcblx0XHRzdXBlciggbmFtZSwgdGV4dHVyZSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1NhbXBsZWQzRFRleHR1cmUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyBhIHNhbXBsZWQgY3ViZSB0ZXh0dXJlIGJpbmRpbmcgdHlwZS5cclxuICpcclxuICogQHByaXZhdGVcclxuICogQGF1Z21lbnRzIFNhbXBsZWRUZXh0dXJlXHJcbiAqL1xyXG5jbGFzcyBTYW1wbGVkQ3ViZVRleHR1cmUgZXh0ZW5kcyBTYW1wbGVkVGV4dHVyZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc2FtcGxlZCBjdWJlIHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBzYW1wbGVkIGN1YmUgdGV4dHVyZSdzIG5hbWUuXHJcblx0ICogQHBhcmFtIHs/KEN1YmVUZXh0dXJlfENvbXByZXNzZWRDdWJlVGV4dHVyZSl9IHRleHR1cmUgLSBUaGUgdGV4dHVyZSB0aGlzIGJpbmRpbmcgaXMgcmVmZXJyaW5nIHRvLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBuYW1lLCB0ZXh0dXJlICkge1xyXG5cclxuXHRcdHN1cGVyKCBuYW1lLCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzU2FtcGxlZEN1YmVUZXh0dXJlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgU2FtcGxlZFRleHR1cmUsIFNhbXBsZWRBcnJheVRleHR1cmUsIFNhbXBsZWQzRFRleHR1cmUsIFNhbXBsZWRDdWJlVGV4dHVyZSB9O1xyXG4iLCJpbXBvcnQgeyBTYW1wbGVkVGV4dHVyZSB9IGZyb20gJy4uL1NhbXBsZWRUZXh0dXJlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIHNwZWNpYWwgZm9ybSBvZiBzYW1wbGVkIHRleHR1cmUgYmluZGluZyB0eXBlLlxyXG4gKiBJdCdzIHRleHR1cmUgdmFsdWUgaXMgbWFuYWdlZCBieSBhIG5vZGUgb2JqZWN0LlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAYXVnbWVudHMgU2FtcGxlZFRleHR1cmVcclxuICovXHJcbmNsYXNzIE5vZGVTYW1wbGVkVGV4dHVyZSBleHRlbmRzIFNhbXBsZWRUZXh0dXJlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBub2RlLWJhc2VkIHNhbXBsZWQgdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIHRleHR1cmVzJ3MgbmFtZS5cclxuXHQgKiBAcGFyYW0ge1RleHR1cmVOb2RlfSB0ZXh0dXJlTm9kZSAtIFRoZSB0ZXh0dXJlIG5vZGUuXHJcblx0ICogQHBhcmFtIHtVbmlmb3JtR3JvdXBOb2RlfSBncm91cE5vZGUgLSBUaGUgdW5pZm9ybSBncm91cCBub2RlLlxyXG5cdCAqIEBwYXJhbSB7P3N0cmluZ30gW2FjY2Vzcz1udWxsXSAtIFRoZSBhY2Nlc3MgdHlwZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbmFtZSwgdGV4dHVyZU5vZGUsIGdyb3VwTm9kZSwgYWNjZXNzID0gbnVsbCApIHtcclxuXHJcblx0XHRzdXBlciggbmFtZSwgdGV4dHVyZU5vZGUgPyB0ZXh0dXJlTm9kZS52YWx1ZSA6IG51bGwgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB0ZXh0dXJlIG5vZGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1RleHR1cmVOb2RlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRleHR1cmVOb2RlID0gdGV4dHVyZU5vZGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdW5pZm9ybSBncm91cCBub2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtVbmlmb3JtR3JvdXBOb2RlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdyb3VwTm9kZSA9IGdyb3VwTm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBhY2Nlc3MgdHlwZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P3N0cmluZ31cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hY2Nlc3MgPSBhY2Nlc3M7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogT3ZlcndyaXRlcyB0aGUgZGVmYXVsdCB0byBhZGRpdGlvbmFsbHkgY2hlY2sgaWYgdGhlIG5vZGUgdmFsdWUgaGFzIGNoYW5nZWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZ2VuZXJhdGlvbiAtIFRoZSBnZW5lcmF0aW9uLlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgYW4gdXBkYXRlIGlzIHJlcXVpcmVkIG9yIG5vdC5cclxuXHQgKi9cclxuXHRuZWVkc0JpbmRpbmdzVXBkYXRlKCBnZW5lcmF0aW9uICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnRleHR1cmVOb2RlLnZhbHVlICE9PSB0aGlzLnRleHR1cmUgfHwgc3VwZXIubmVlZHNCaW5kaW5nc1VwZGF0ZSggZ2VuZXJhdGlvbiApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIGJpbmRpbmcuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSB0ZXh0dXJlIGhhcyBiZWVuIHVwZGF0ZWQgYW5kIG11c3QgYmVcclxuXHQgKiB1cGxvYWRlZCB0byB0aGUgR1BVLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZSgpIHtcclxuXHJcblx0XHRjb25zdCB7IHRleHR1cmVOb2RlIH0gPSB0aGlzO1xyXG5cclxuXHRcdGlmICggdGhpcy50ZXh0dXJlICE9PSB0ZXh0dXJlTm9kZS52YWx1ZSApIHtcclxuXHJcblx0XHRcdHRoaXMudGV4dHVyZSA9IHRleHR1cmVOb2RlLnZhbHVlO1xyXG5cclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBzdXBlci51cGRhdGUoKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIEEgc3BlY2lhbCBmb3JtIG9mIHNhbXBsZWQgY3ViZSB0ZXh0dXJlIGJpbmRpbmcgdHlwZS5cclxuICogSXQncyB0ZXh0dXJlIHZhbHVlIGlzIG1hbmFnZWQgYnkgYSBub2RlIG9iamVjdC5cclxuICpcclxuICogQHByaXZhdGVcclxuICogQGF1Z21lbnRzIE5vZGVTYW1wbGVkVGV4dHVyZVxyXG4gKi9cclxuY2xhc3MgTm9kZVNhbXBsZWRDdWJlVGV4dHVyZSBleHRlbmRzIE5vZGVTYW1wbGVkVGV4dHVyZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbm9kZS1iYXNlZCBzYW1wbGVkIGN1YmUgdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIHRleHR1cmVzJ3MgbmFtZS5cclxuXHQgKiBAcGFyYW0ge1RleHR1cmVOb2RlfSB0ZXh0dXJlTm9kZSAtIFRoZSB0ZXh0dXJlIG5vZGUuXHJcblx0ICogQHBhcmFtIHtVbmlmb3JtR3JvdXBOb2RlfSBncm91cE5vZGUgLSBUaGUgdW5pZm9ybSBncm91cCBub2RlLlxyXG5cdCAqIEBwYXJhbSB7P3N0cmluZ30gW2FjY2Vzcz1udWxsXSAtIFRoZSBhY2Nlc3MgdHlwZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbmFtZSwgdGV4dHVyZU5vZGUsIGdyb3VwTm9kZSwgYWNjZXNzID0gbnVsbCApIHtcclxuXHJcblx0XHRzdXBlciggbmFtZSwgdGV4dHVyZU5vZGUsIGdyb3VwTm9kZSwgYWNjZXNzICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzU2FtcGxlZEN1YmVUZXh0dXJlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIEEgc3BlY2lhbCBmb3JtIG9mIHNhbXBsZWQgM0QgdGV4dHVyZSBiaW5kaW5nIHR5cGUuXHJcbiAqIEl0J3MgdGV4dHVyZSB2YWx1ZSBpcyBtYW5hZ2VkIGJ5IGEgbm9kZSBvYmplY3QuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBhdWdtZW50cyBOb2RlU2FtcGxlZFRleHR1cmVcclxuICovXHJcbmNsYXNzIE5vZGVTYW1wbGVkVGV4dHVyZTNEIGV4dGVuZHMgTm9kZVNhbXBsZWRUZXh0dXJlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBub2RlLWJhc2VkIHNhbXBsZWQgM0QgdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIHRleHR1cmVzJ3MgbmFtZS5cclxuXHQgKiBAcGFyYW0ge1RleHR1cmVOb2RlfSB0ZXh0dXJlTm9kZSAtIFRoZSB0ZXh0dXJlIG5vZGUuXHJcblx0ICogQHBhcmFtIHtVbmlmb3JtR3JvdXBOb2RlfSBncm91cE5vZGUgLSBUaGUgdW5pZm9ybSBncm91cCBub2RlLlxyXG5cdCAqIEBwYXJhbSB7P3N0cmluZ30gW2FjY2Vzcz1udWxsXSAtIFRoZSBhY2Nlc3MgdHlwZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbmFtZSwgdGV4dHVyZU5vZGUsIGdyb3VwTm9kZSwgYWNjZXNzID0gbnVsbCApIHtcclxuXHJcblx0XHRzdXBlciggbmFtZSwgdGV4dHVyZU5vZGUsIGdyb3VwTm9kZSwgYWNjZXNzICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzU2FtcGxlZFRleHR1cmUzRCA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IE5vZGVTYW1wbGVkVGV4dHVyZSwgTm9kZVNhbXBsZWRDdWJlVGV4dHVyZSwgTm9kZVNhbXBsZWRUZXh0dXJlM0QgfTtcclxuIiwiaW1wb3J0IHsgR0xTTE5vZGVQYXJzZXIsIE5vZGVCdWlsZGVyLCBUZXh0dXJlTm9kZSwgdmVjdG9yQ29tcG9uZW50cyB9IGZyb20gJy4uLy4uLy4uL25vZGVzL05vZGVzLmpzJztcclxuXHJcbmltcG9ydCBOb2RlVW5pZm9ybUJ1ZmZlciBmcm9tICcuLi8uLi9jb21tb24vbm9kZXMvTm9kZVVuaWZvcm1CdWZmZXIuanMnO1xyXG5pbXBvcnQgTm9kZVVuaWZvcm1zR3JvdXAgZnJvbSAnLi4vLi4vY29tbW9uL25vZGVzL05vZGVVbmlmb3Jtc0dyb3VwLmpzJztcclxuXHJcbmltcG9ydCB7IE5vZGVTYW1wbGVkVGV4dHVyZSwgTm9kZVNhbXBsZWRDdWJlVGV4dHVyZSwgTm9kZVNhbXBsZWRUZXh0dXJlM0QgfSBmcm9tICcuLi8uLi9jb21tb24vbm9kZXMvTm9kZVNhbXBsZWRUZXh0dXJlLmpzJztcclxuXHJcbmltcG9ydCB7IE5vQ29sb3JTcGFjZSwgQnl0ZVR5cGUsIFNob3J0VHlwZSwgUkdCQUludGVnZXJGb3JtYXQsIFJHQkludGVnZXJGb3JtYXQsIFJlZEludGVnZXJGb3JtYXQsIFJHSW50ZWdlckZvcm1hdCwgVW5zaWduZWRCeXRlVHlwZSwgVW5zaWduZWRJbnRUeXBlLCBVbnNpZ25lZFNob3J0VHlwZSwgUmVkRm9ybWF0LCBSR0Zvcm1hdCwgSW50VHlwZSwgUkdCRm9ybWF0LCBSR0JBRm9ybWF0LCBGbG9hdFR5cGUgfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBEYXRhVGV4dHVyZSB9IGZyb20gJy4uLy4uLy4uL3RleHR1cmVzL0RhdGFUZXh0dXJlLmpzJztcclxuXHJcbmNvbnN0IGdsc2xNZXRob2RzID0ge1xyXG5cdHRleHR1cmVEaW1lbnNpb25zOiAndGV4dHVyZVNpemUnLFxyXG5cdGVxdWFsczogJ2VxdWFsJ1xyXG59O1xyXG5cclxuY29uc3QgcHJlY2lzaW9uTGliID0ge1xyXG5cdGxvdzogJ2xvd3AnLFxyXG5cdG1lZGl1bTogJ21lZGl1bXAnLFxyXG5cdGhpZ2g6ICdoaWdocCdcclxufTtcclxuXHJcbmNvbnN0IHN1cHBvcnRzID0ge1xyXG5cdHN3aXp6bGVBc3NpZ246IHRydWUsXHJcblx0c3RvcmFnZUJ1ZmZlcjogZmFsc2VcclxufTtcclxuXHJcbmNvbnN0IGRlZmF1bHRQcmVjaXNpb25zID0gYFxyXG5wcmVjaXNpb24gaGlnaHAgZmxvYXQ7XHJcbnByZWNpc2lvbiBoaWdocCBpbnQ7XHJcbnByZWNpc2lvbiBoaWdocCBzYW1wbGVyMkQ7XHJcbnByZWNpc2lvbiBoaWdocCBzYW1wbGVyM0Q7XHJcbnByZWNpc2lvbiBoaWdocCBzYW1wbGVyQ3ViZTtcclxucHJlY2lzaW9uIGhpZ2hwIHNhbXBsZXIyREFycmF5O1xyXG5cclxucHJlY2lzaW9uIGhpZ2hwIHVzYW1wbGVyMkQ7XHJcbnByZWNpc2lvbiBoaWdocCB1c2FtcGxlcjNEO1xyXG5wcmVjaXNpb24gaGlnaHAgdXNhbXBsZXJDdWJlO1xyXG5wcmVjaXNpb24gaGlnaHAgdXNhbXBsZXIyREFycmF5O1xyXG5cclxucHJlY2lzaW9uIGhpZ2hwIGlzYW1wbGVyMkQ7XHJcbnByZWNpc2lvbiBoaWdocCBpc2FtcGxlcjNEO1xyXG5wcmVjaXNpb24gaGlnaHAgaXNhbXBsZXJDdWJlO1xyXG5wcmVjaXNpb24gaGlnaHAgaXNhbXBsZXIyREFycmF5O1xyXG5cclxucHJlY2lzaW9uIGxvd3Agc2FtcGxlcjJEU2hhZG93O1xyXG5gO1xyXG5cclxuLyoqXHJcbiAqIEEgbm9kZSBidWlsZGVyIHRhcmdldGluZyBHTFNMLlxyXG4gKlxyXG4gKiBUaGlzIG1vZHVsZSBnZW5lcmF0ZXMgR0xTTCBzaGFkZXIgY29kZSBmcm9tIG5vZGUgbWF0ZXJpYWxzIGFuZCBhbHNvXHJcbiAqIGdlbmVyYXRlcyB0aGUgcmVzcGVjdGl2ZSBiaW5kaW5ncyBhbmQgdmVydGV4IGJ1ZmZlciBkZWZpbml0aW9ucy4gVGhlc2VcclxuICogZGF0YSBhcmUgbGF0ZXIgdXNlZCBieSB0aGUgcmVuZGVyZXIgdG8gY3JlYXRlIHJlbmRlciBhbmQgY29tcHV0ZSBwaXBlbGluZXNcclxuICogZm9yIHJlbmRlciBvYmplY3RzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTm9kZUJ1aWxkZXJcclxuICovXHJcbmNsYXNzIEdMU0xOb2RlQnVpbGRlciBleHRlbmRzIE5vZGVCdWlsZGVyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBHTFNMIG5vZGUgYnVpbGRlciByZW5kZXJlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0M0R9IG9iamVjdCAtIFRoZSAzRCBvYmplY3QuXHJcblx0ICogQHBhcmFtIHtSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG9iamVjdCwgcmVuZGVyZXIgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG9iamVjdCwgcmVuZGVyZXIsIG5ldyBHTFNMTm9kZVBhcnNlcigpICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGRpY3Rpb25hcnkgaG9sZHMgZm9yIGVhY2ggc2hhZGVyIHN0YWdlICgndmVydGV4JywgJ2ZyYWdtZW50JywgJ2NvbXB1dGUnKVxyXG5cdFx0ICogYW5vdGhlciBkaWN0aW9uYXJ5IHdoaWNoIG1hbmFnZXMgVUJPcyBwZXIgZ3JvdXAgKCdyZW5kZXInLCdmcmFtZScsJ29iamVjdCcpLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLE9iamVjdDxzdHJpbmcsTm9kZVVuaWZvcm1zR3JvdXA+Pn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51bmlmb3JtR3JvdXBzID0ge307XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBhcnJheSB0aGF0IGhvbGRzIG9iamVjdHMgZGVmaW5pbmcgdGhlIHZhcnlpbmcgYW5kIGF0dHJpYnV0ZSBkYXRhIGluXHJcblx0XHQgKiBjb250ZXh0IG9mIFRyYW5zZm9ybSBGZWVkYmFjay5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8T2JqZWN0PHN0cmluZyxBdHRyaWJ1dGVOb2RlfHN0cmluZz4+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRyYW5zZm9ybXMgPSBbXTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgZGljdGlvbmFyeSB0aGF0IGhvbGRzIGZvciBlYWNoIHNoYWRlciBzdGFnZSBhIE1hcCBvZiB1c2VkIGV4dGVuc2lvbnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdDxzdHJpbmcsTWFwPHN0cmluZyxPYmplY3Q+Pn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5leHRlbnNpb25zID0ge307XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGRpY3Rpb25hcnkgdGhhdCBob2xkcyBmb3IgZWFjaCBzaGFkZXIgc3RhZ2UgYW4gQXJyYXkgb2YgdXNlZCBidWlsdGlucy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0PHN0cmluZyxBcnJheTxzdHJpbmc+Pn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5idWlsdGlucyA9IHsgdmVydGV4OiBbXSwgZnJhZ21lbnQ6IFtdLCBjb21wdXRlOiBbXSB9O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gdGV4dHVyZSByZXF1aXJlcyBhIG1hbnVhbCBjb252ZXJzaW9uIHRvIHRoZSB3b3JraW5nIGNvbG9yIHNwYWNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUgdG8gY2hlY2suXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZ2l2ZW4gdGV4dHVyZSByZXF1aXJlcyBhIGNvbnZlcnNpb24gdG8gd29ya2luZyBjb2xvciBzcGFjZSBvciBub3QuXHJcblx0ICovXHJcblx0bmVlZHNUb1dvcmtpbmdDb2xvclNwYWNlKCB0ZXh0dXJlICkge1xyXG5cclxuXHRcdHJldHVybiB0ZXh0dXJlLmlzVmlkZW9UZXh0dXJlID09PSB0cnVlICYmIHRleHR1cmUuY29sb3JTcGFjZSAhPT0gTm9Db2xvclNwYWNlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIG5hdGl2ZSBzaGFkZXIgbWV0aG9kIG5hbWUgZm9yIGEgZ2l2ZW4gZ2VuZXJpYyBuYW1lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZCAtIFRoZSBtZXRob2QgbmFtZSB0byByZXNvbHZlLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHJlc29sdmVkIEdMU0wgbWV0aG9kIG5hbWUuXHJcblx0ICovXHJcblx0Z2V0TWV0aG9kKCBtZXRob2QgKSB7XHJcblxyXG5cdFx0cmV0dXJuIGdsc2xNZXRob2RzWyBtZXRob2QgXSB8fCBtZXRob2Q7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgb3V0cHV0IHN0cnVjdCBuYW1lLiBOb3QgcmVsZXZhbnQgZm9yIEdMU0wuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9XHJcblx0ICovXHJcblx0Z2V0T3V0cHV0U3RydWN0TmFtZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJyc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQnVpbGRzIHRoZSBnaXZlbiBzaGFkZXIgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7U2hhZGVyTm9kZUludGVybmFsfSBzaGFkZXJOb2RlIC0gVGhlIHNoYWRlciBub2RlLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIEdMU0wgZnVuY3Rpb24gY29kZS5cclxuXHQgKi9cclxuXHRidWlsZEZ1bmN0aW9uQ29kZSggc2hhZGVyTm9kZSApIHtcclxuXHJcblx0XHRjb25zdCBsYXlvdXQgPSBzaGFkZXJOb2RlLmxheW91dDtcclxuXHRcdGNvbnN0IGZsb3dEYXRhID0gdGhpcy5mbG93U2hhZGVyTm9kZSggc2hhZGVyTm9kZSApO1xyXG5cclxuXHRcdGNvbnN0IHBhcmFtZXRlcnMgPSBbXTtcclxuXHJcblx0XHRmb3IgKCBjb25zdCBpbnB1dCBvZiBsYXlvdXQuaW5wdXRzICkge1xyXG5cclxuXHRcdFx0cGFyYW1ldGVycy5wdXNoKCB0aGlzLmdldFR5cGUoIGlucHV0LnR5cGUgKSArICcgJyArIGlucHV0Lm5hbWUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCBjb2RlID0gYCR7IHRoaXMuZ2V0VHlwZSggbGF5b3V0LnR5cGUgKSB9ICR7IGxheW91dC5uYW1lIH0oICR7IHBhcmFtZXRlcnMuam9pbiggJywgJyApIH0gKSB7XHJcblxyXG5cdCR7IGZsb3dEYXRhLnZhcnMgfVxyXG5cclxuJHsgZmxvd0RhdGEuY29kZSB9XHJcblx0cmV0dXJuICR7IGZsb3dEYXRhLnJlc3VsdCB9O1xyXG5cclxufWA7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRyZXR1cm4gY29kZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXR1cHMgdGhlIFBpeGVsIEJ1ZmZlciBPYmplY3QgKFBCTykgZm9yIHRoZSBnaXZlbiBzdG9yYWdlXHJcblx0ICogYnVmZmVyIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1N0b3JhZ2VCdWZmZXJOb2RlfSBzdG9yYWdlQnVmZmVyTm9kZSAtIFRoZSBzdG9yYWdlIGJ1ZmZlciBub2RlLlxyXG5cdCAqL1xyXG5cdHNldHVwUEJPKCBzdG9yYWdlQnVmZmVyTm9kZSApIHtcclxuXHJcblx0XHRjb25zdCBhdHRyaWJ1dGUgPSBzdG9yYWdlQnVmZmVyTm9kZS52YWx1ZTtcclxuXHJcblx0XHRpZiAoIGF0dHJpYnV0ZS5wYm8gPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGNvbnN0IG9yaWdpbmFsQXJyYXkgPSBhdHRyaWJ1dGUuYXJyYXk7XHJcblx0XHRcdGNvbnN0IG51bUVsZW1lbnRzID0gYXR0cmlidXRlLmNvdW50ICogYXR0cmlidXRlLml0ZW1TaXplO1xyXG5cclxuXHRcdFx0Y29uc3QgeyBpdGVtU2l6ZSB9ID0gYXR0cmlidXRlO1xyXG5cclxuXHRcdFx0Y29uc3QgaXNJbnRlZ2VyID0gYXR0cmlidXRlLmFycmF5LmNvbnN0cnVjdG9yLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyggJ2ludCcgKTtcclxuXHJcblx0XHRcdGxldCBmb3JtYXQgPSBpc0ludGVnZXIgPyBSZWRJbnRlZ2VyRm9ybWF0IDogUmVkRm9ybWF0O1xyXG5cclxuXHRcdFx0aWYgKCBpdGVtU2l6ZSA9PT0gMiApIHtcclxuXHJcblx0XHRcdFx0Zm9ybWF0ID0gaXNJbnRlZ2VyID8gUkdJbnRlZ2VyRm9ybWF0IDogUkdGb3JtYXQ7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBpdGVtU2l6ZSA9PT0gMyApIHtcclxuXHJcblx0XHRcdFx0Zm9ybWF0ID0gaXNJbnRlZ2VyID8gUkdCSW50ZWdlckZvcm1hdCA6IFJHQkZvcm1hdDtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGl0ZW1TaXplID09PSA0ICkge1xyXG5cclxuXHRcdFx0XHRmb3JtYXQgPSBpc0ludGVnZXIgPyBSR0JBSW50ZWdlckZvcm1hdCA6IFJHQkFGb3JtYXQ7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCB0eXBlTWFwID0ge1xyXG5cdFx0XHRcdEZsb2F0MzJBcnJheTogRmxvYXRUeXBlLFxyXG5cdFx0XHRcdFVpbnQ4QXJyYXk6IFVuc2lnbmVkQnl0ZVR5cGUsXHJcblx0XHRcdFx0VWludDE2QXJyYXk6IFVuc2lnbmVkU2hvcnRUeXBlLFxyXG5cdFx0XHRcdFVpbnQzMkFycmF5OiBVbnNpZ25lZEludFR5cGUsXHJcblx0XHRcdFx0SW50OEFycmF5OiBCeXRlVHlwZSxcclxuXHRcdFx0XHRJbnQxNkFycmF5OiBTaG9ydFR5cGUsXHJcblx0XHRcdFx0SW50MzJBcnJheTogSW50VHlwZSxcclxuXHRcdFx0XHRVaW50OENsYW1wZWRBcnJheTogVW5zaWduZWRCeXRlVHlwZSxcclxuXHRcdFx0fTtcclxuXHJcblx0XHRcdGNvbnN0IHdpZHRoID0gTWF0aC5wb3coIDIsIE1hdGguY2VpbCggTWF0aC5sb2cyKCBNYXRoLnNxcnQoIG51bUVsZW1lbnRzIC8gaXRlbVNpemUgKSApICkgKTtcclxuXHRcdFx0bGV0IGhlaWdodCA9IE1hdGguY2VpbCggKCBudW1FbGVtZW50cyAvIGl0ZW1TaXplICkgLyB3aWR0aCApO1xyXG5cdFx0XHRpZiAoIHdpZHRoICogaGVpZ2h0ICogaXRlbVNpemUgPCBudW1FbGVtZW50cyApIGhlaWdodCArKzsgLy8gRW5zdXJlIGVub3VnaCBzcGFjZVxyXG5cclxuXHRcdFx0Y29uc3QgbmV3U2l6ZSA9IHdpZHRoICogaGVpZ2h0ICogaXRlbVNpemU7XHJcblxyXG5cdFx0XHRjb25zdCBuZXdBcnJheSA9IG5ldyBvcmlnaW5hbEFycmF5LmNvbnN0cnVjdG9yKCBuZXdTaXplICk7XHJcblxyXG5cdFx0XHRuZXdBcnJheS5zZXQoIG9yaWdpbmFsQXJyYXksIDAgKTtcclxuXHJcblx0XHRcdGF0dHJpYnV0ZS5hcnJheSA9IG5ld0FycmF5O1xyXG5cclxuXHRcdFx0Y29uc3QgcGJvVGV4dHVyZSA9IG5ldyBEYXRhVGV4dHVyZSggYXR0cmlidXRlLmFycmF5LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGVNYXBbIGF0dHJpYnV0ZS5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lIF0gfHwgRmxvYXRUeXBlICk7XHJcblx0XHRcdHBib1RleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cdFx0XHRwYm9UZXh0dXJlLmlzUEJPVGV4dHVyZSA9IHRydWU7XHJcblxyXG5cdFx0XHRjb25zdCBwYm8gPSBuZXcgVGV4dHVyZU5vZGUoIHBib1RleHR1cmUsIG51bGwsIG51bGwgKTtcclxuXHRcdFx0cGJvLnNldFByZWNpc2lvbiggJ2hpZ2gnICk7XHJcblxyXG5cdFx0XHRhdHRyaWJ1dGUucGJvTm9kZSA9IHBibztcclxuXHRcdFx0YXR0cmlidXRlLnBibyA9IHBiby52YWx1ZTtcclxuXHJcblx0XHRcdHRoaXMuZ2V0VW5pZm9ybUZyb21Ob2RlKCBhdHRyaWJ1dGUucGJvTm9kZSwgJ3RleHR1cmUnLCB0aGlzLnNoYWRlclN0YWdlLCB0aGlzLmNvbnRleHQubGFiZWwgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIEdMU0wgc25pcHBldCB0aGF0IHJlcHJlc2VudHMgdGhlIHByb3BlcnR5IG5hbWUgb2YgdGhlIGdpdmVuIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBUaGUgbm9kZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW3NoYWRlclN0YWdlPXRoaXMuc2hhZGVyU3RhZ2VdIC0gVGhlIHNoYWRlciBzdGFnZSB0aGlzIGNvZGUgc25pcHBldCBpcyBnZW5lcmF0ZWQgZm9yLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHByb3BlcnR5IG5hbWUuXHJcblx0ICovXHJcblx0Z2V0UHJvcGVydHlOYW1lKCBub2RlLCBzaGFkZXJTdGFnZSA9IHRoaXMuc2hhZGVyU3RhZ2UgKSB7XHJcblxyXG5cdFx0aWYgKCBub2RlLmlzTm9kZVVuaWZvcm0gJiYgbm9kZS5ub2RlLmlzVGV4dHVyZU5vZGUgIT09IHRydWUgJiYgbm9kZS5ub2RlLmlzQnVmZmVyTm9kZSAhPT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdHJldHVybiBzaGFkZXJTdGFnZS5jaGFyQXQoIDAgKSArICdfJyArIG5vZGUubmFtZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHN1cGVyLmdldFByb3BlcnR5TmFtZSggbm9kZSwgc2hhZGVyU3RhZ2UgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXR1cHMgdGhlIFBpeGVsIEJ1ZmZlciBPYmplY3QgKFBCTykgZm9yIHRoZSBnaXZlbiBzdG9yYWdlXHJcblx0ICogYnVmZmVyIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1N0b3JhZ2VBcnJheUVsZW1lbnROb2RlfSBzdG9yYWdlQXJyYXlFbGVtZW50Tm9kZSAtIFRoZSBzdG9yYWdlIGFycmF5IGVsZW1lbnQgbm9kZS5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBwcm9wZXJ0eSBuYW1lLlxyXG5cdCAqL1xyXG5cdGdlbmVyYXRlUEJPKCBzdG9yYWdlQXJyYXlFbGVtZW50Tm9kZSApIHtcclxuXHJcblx0XHRjb25zdCB7IG5vZGUsIGluZGV4Tm9kZSB9ID0gc3RvcmFnZUFycmF5RWxlbWVudE5vZGU7XHJcblx0XHRjb25zdCBhdHRyaWJ1dGUgPSBub2RlLnZhbHVlO1xyXG5cclxuXHRcdGlmICggdGhpcy5yZW5kZXJlci5iYWNrZW5kLmhhcyggYXR0cmlidXRlICkgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBhdHRyaWJ1dGVEYXRhID0gdGhpcy5yZW5kZXJlci5iYWNrZW5kLmdldCggYXR0cmlidXRlICk7XHJcblx0XHRcdGF0dHJpYnV0ZURhdGEucGJvID0gYXR0cmlidXRlLnBibztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3Qgbm9kZVVuaWZvcm0gPSB0aGlzLmdldFVuaWZvcm1Gcm9tTm9kZSggYXR0cmlidXRlLnBib05vZGUsICd0ZXh0dXJlJywgdGhpcy5zaGFkZXJTdGFnZSwgdGhpcy5jb250ZXh0LmxhYmVsICk7XHJcblx0XHRjb25zdCB0ZXh0dXJlTmFtZSA9IHRoaXMuZ2V0UHJvcGVydHlOYW1lKCBub2RlVW5pZm9ybSApO1xyXG5cclxuXHRcdHRoaXMuaW5jcmVhc2VVc2FnZSggaW5kZXhOb2RlICk7IC8vIGZvcmNlIGNhY2hlIGdlbmVyYXRlIHRvIGJlIHVzZWQgYXMgaW5kZXggaW4geCx5XHJcblx0XHRjb25zdCBpbmRleFNuaXBwZXQgPSBpbmRleE5vZGUuYnVpbGQoIHRoaXMsICd1aW50JyApO1xyXG5cclxuXHRcdGNvbnN0IGVsZW1lbnROb2RlRGF0YSA9IHRoaXMuZ2V0RGF0YUZyb21Ob2RlKCBzdG9yYWdlQXJyYXlFbGVtZW50Tm9kZSApO1xyXG5cclxuXHRcdGxldCBwcm9wZXJ0eU5hbWUgPSBlbGVtZW50Tm9kZURhdGEucHJvcGVydHlOYW1lO1xyXG5cclxuXHRcdGlmICggcHJvcGVydHlOYW1lID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHQvLyBwcm9wZXJ0eSBlbGVtZW50XHJcblxyXG5cdFx0XHRjb25zdCBub2RlVmFyID0gdGhpcy5nZXRWYXJGcm9tTm9kZSggc3RvcmFnZUFycmF5RWxlbWVudE5vZGUgKTtcclxuXHJcblx0XHRcdHByb3BlcnR5TmFtZSA9IHRoaXMuZ2V0UHJvcGVydHlOYW1lKCBub2RlVmFyICk7XHJcblxyXG5cdFx0XHQvLyBwcm9wZXJ0eSBzaXplXHJcblxyXG5cdFx0XHRjb25zdCBidWZmZXJOb2RlRGF0YSA9IHRoaXMuZ2V0RGF0YUZyb21Ob2RlKCBub2RlICk7XHJcblxyXG5cdFx0XHRsZXQgcHJvcGVydHlTaXplTmFtZSA9IGJ1ZmZlck5vZGVEYXRhLnByb3BlcnR5U2l6ZU5hbWU7XHJcblxyXG5cdFx0XHRpZiAoIHByb3BlcnR5U2l6ZU5hbWUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0cHJvcGVydHlTaXplTmFtZSA9IHByb3BlcnR5TmFtZSArICdTaXplJztcclxuXHJcblx0XHRcdFx0dGhpcy5nZXRWYXJGcm9tTm9kZSggbm9kZSwgcHJvcGVydHlTaXplTmFtZSwgJ3VpbnQnICk7XHJcblxyXG5cdFx0XHRcdHRoaXMuYWRkTGluZUZsb3dDb2RlKCBgJHsgcHJvcGVydHlTaXplTmFtZSB9ID0gdWludCggdGV4dHVyZVNpemUoICR7IHRleHR1cmVOYW1lIH0sIDAgKS54IClgLCBzdG9yYWdlQXJyYXlFbGVtZW50Tm9kZSApO1xyXG5cclxuXHRcdFx0XHRidWZmZXJOb2RlRGF0YS5wcm9wZXJ0eVNpemVOYW1lID0gcHJvcGVydHlTaXplTmFtZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vXHJcblxyXG5cdFx0XHRjb25zdCB7IGl0ZW1TaXplIH0gPSBhdHRyaWJ1dGU7XHJcblxyXG5cdFx0XHRjb25zdCBjaGFubmVsID0gJy4nICsgdmVjdG9yQ29tcG9uZW50cy5qb2luKCAnJyApLnNsaWNlKCAwLCBpdGVtU2l6ZSApO1xyXG5cdFx0XHRjb25zdCB1dlNuaXBwZXQgPSBgaXZlYzIoJHtpbmRleFNuaXBwZXR9ICUgJHsgcHJvcGVydHlTaXplTmFtZSB9LCAke2luZGV4U25pcHBldH0gLyAkeyBwcm9wZXJ0eVNpemVOYW1lIH0pYDtcclxuXHJcblx0XHRcdGNvbnN0IHNuaXBwZXQgPSB0aGlzLmdlbmVyYXRlVGV4dHVyZUxvYWQoIG51bGwsIHRleHR1cmVOYW1lLCB1dlNuaXBwZXQsIG51bGwsICcwJyApO1xyXG5cclxuXHRcdFx0Ly9cclxuXHJcblxyXG5cdFx0XHRsZXQgcHJlZml4ID0gJ3ZlYzQnO1xyXG5cclxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUucGJvLnR5cGUgPT09IFVuc2lnbmVkSW50VHlwZSApIHtcclxuXHJcblx0XHRcdFx0cHJlZml4ID0gJ3V2ZWM0JztcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGF0dHJpYnV0ZS5wYm8udHlwZSA9PT0gSW50VHlwZSApIHtcclxuXHJcblx0XHRcdFx0cHJlZml4ID0gJ2l2ZWM0JztcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuYWRkTGluZUZsb3dDb2RlKCBgJHsgcHJvcGVydHlOYW1lIH0gPSAke3ByZWZpeH0oJHsgc25pcHBldCB9KSR7Y2hhbm5lbH1gLCBzdG9yYWdlQXJyYXlFbGVtZW50Tm9kZSApO1xyXG5cclxuXHRcdFx0ZWxlbWVudE5vZGVEYXRhLnByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHByb3BlcnR5TmFtZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZW5lcmF0ZXMgdGhlIEdMU0wgc25pcHBldCB0aGF0IHJlYWRzIGEgc2luZ2xlIHRleGVsIGZyb20gYSB0ZXh0dXJlIHdpdGhvdXQgc2FtcGxpbmcgb3IgZmlsdGVyaW5nLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHRleHR1cmVQcm9wZXJ0eSAtIFRoZSBuYW1lIG9mIHRoZSB0ZXh0dXJlIHVuaWZvcm0gaW4gdGhlIHNoYWRlci5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdXZJbmRleFNuaXBwZXQgLSBBIEdMU0wgc25pcHBldCB0aGF0IHJlcHJlc2VudHMgdGV4dHVyZSBjb29yZGluYXRlcyB1c2VkIGZvciBzYW1wbGluZy5cclxuXHQgKiBAcGFyYW0gez9zdHJpbmd9IGRlcHRoU25pcHBldCAtIEEgR0xTTCBzbmlwcGV0IHRoYXQgcmVwcmVzZW50cyB0aGUgMC1iYXNlZCB0ZXh0dXJlIGFycmF5IGluZGV4IHRvIHNhbXBsZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW2xldmVsU25pcHBldD0nMHUnXSAtIEEgR0xTTCBzbmlwcGV0IHRoYXQgcmVwcmVzZW50cyB0aGUgbWlwIGxldmVsLCB3aXRoIGxldmVsIDAgY29udGFpbmluZyBhIGZ1bGwgc2l6ZSB2ZXJzaW9uIG9mIHRoZSB0ZXh0dXJlLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIEdMU0wgc25pcHBldC5cclxuXHQgKi9cclxuXHRnZW5lcmF0ZVRleHR1cmVMb2FkKCB0ZXh0dXJlLCB0ZXh0dXJlUHJvcGVydHksIHV2SW5kZXhTbmlwcGV0LCBkZXB0aFNuaXBwZXQsIGxldmVsU25pcHBldCA9ICcwJyApIHtcclxuXHJcblx0XHRpZiAoIGRlcHRoU25pcHBldCApIHtcclxuXHJcblx0XHRcdHJldHVybiBgdGV4ZWxGZXRjaCggJHsgdGV4dHVyZVByb3BlcnR5IH0sIGl2ZWMzKCAkeyB1dkluZGV4U25pcHBldCB9LCAkeyBkZXB0aFNuaXBwZXQgfSApLCAkeyBsZXZlbFNuaXBwZXQgfSApYDtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0cmV0dXJuIGB0ZXhlbEZldGNoKCAkeyB0ZXh0dXJlUHJvcGVydHkgfSwgJHsgdXZJbmRleFNuaXBwZXQgfSwgJHsgbGV2ZWxTbmlwcGV0IH0gKWA7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyB0aGUgR0xTTCBzbmlwcGV0IGZvciBzYW1wbGluZy9sb2FkaW5nIHRoZSBnaXZlbiB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHRleHR1cmVQcm9wZXJ0eSAtIFRoZSBuYW1lIG9mIHRoZSB0ZXh0dXJlIHVuaWZvcm0gaW4gdGhlIHNoYWRlci5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdXZTbmlwcGV0IC0gQSBHTFNMIHNuaXBwZXQgdGhhdCByZXByZXNlbnRzIHRleHR1cmUgY29vcmRpbmF0ZXMgdXNlZCBmb3Igc2FtcGxpbmcuXHJcblx0ICogQHBhcmFtIHs/c3RyaW5nfSBkZXB0aFNuaXBwZXQgLSAgQSBHTFNMIHNuaXBwZXQgdGhhdCByZXByZXNlbnRzIHRoZSAwLWJhc2VkIHRleHR1cmUgYXJyYXkgaW5kZXggdG8gc2FtcGxlLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIEdMU0wgc25pcHBldC5cclxuXHQgKi9cclxuXHRnZW5lcmF0ZVRleHR1cmUoIHRleHR1cmUsIHRleHR1cmVQcm9wZXJ0eSwgdXZTbmlwcGV0LCBkZXB0aFNuaXBwZXQgKSB7XHJcblxyXG5cdFx0aWYgKCB0ZXh0dXJlLmlzRGVwdGhUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIGB0ZXh0dXJlKCAkeyB0ZXh0dXJlUHJvcGVydHkgfSwgJHsgdXZTbmlwcGV0IH0gKS54YDtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0aWYgKCBkZXB0aFNuaXBwZXQgKSB1dlNuaXBwZXQgPSBgdmVjMyggJHsgdXZTbmlwcGV0IH0sICR7IGRlcHRoU25pcHBldCB9IClgO1xyXG5cclxuXHRcdFx0cmV0dXJuIGB0ZXh0dXJlKCAkeyB0ZXh0dXJlUHJvcGVydHkgfSwgJHsgdXZTbmlwcGV0IH0gKWA7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyB0aGUgR0xTTCBzbmlwcGV0IHdoZW4gc2FtcGxpbmcgdGV4dHVyZXMgd2l0aCBleHBsaWNpdCBtaXAgbGV2ZWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdGV4dHVyZVByb3BlcnR5IC0gVGhlIG5hbWUgb2YgdGhlIHRleHR1cmUgdW5pZm9ybSBpbiB0aGUgc2hhZGVyLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB1dlNuaXBwZXQgLSBBIEdMU0wgc25pcHBldCB0aGF0IHJlcHJlc2VudHMgdGV4dHVyZSBjb29yZGluYXRlcyB1c2VkIGZvciBzYW1wbGluZy5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbGV2ZWxTbmlwcGV0IC0gQSBHTFNMIHNuaXBwZXQgdGhhdCByZXByZXNlbnRzIHRoZSBtaXAgbGV2ZWwsIHdpdGggbGV2ZWwgMCBjb250YWluaW5nIGEgZnVsbCBzaXplIHZlcnNpb24gb2YgdGhlIHRleHR1cmUuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgR0xTTCBzbmlwcGV0LlxyXG5cdCAqL1xyXG5cdGdlbmVyYXRlVGV4dHVyZUxldmVsKCB0ZXh0dXJlLCB0ZXh0dXJlUHJvcGVydHksIHV2U25pcHBldCwgbGV2ZWxTbmlwcGV0ICkge1xyXG5cclxuXHRcdHJldHVybiBgdGV4dHVyZUxvZCggJHsgdGV4dHVyZVByb3BlcnR5IH0sICR7IHV2U25pcHBldCB9LCAkeyBsZXZlbFNuaXBwZXQgfSApYDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZW5lcmF0ZXMgdGhlIEdMU0wgc25pcHBldCB3aGVuIHNhbXBsaW5nIHRleHR1cmVzIHdpdGggYSBiaWFzIHRvIHRoZSBtaXAgbGV2ZWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdGV4dHVyZVByb3BlcnR5IC0gVGhlIG5hbWUgb2YgdGhlIHRleHR1cmUgdW5pZm9ybSBpbiB0aGUgc2hhZGVyLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB1dlNuaXBwZXQgLSBBIEdMU0wgc25pcHBldCB0aGF0IHJlcHJlc2VudHMgdGV4dHVyZSBjb29yZGluYXRlcyB1c2VkIGZvciBzYW1wbGluZy5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gYmlhc1NuaXBwZXQgLSBBIEdMU0wgc25pcHBldCB0aGF0IHJlcHJlc2VudHMgdGhlIGJpYXMgdG8gYXBwbHkgdG8gdGhlIG1pcCBsZXZlbCBiZWZvcmUgc2FtcGxpbmcuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgR0xTTCBzbmlwcGV0LlxyXG5cdCAqL1xyXG5cdGdlbmVyYXRlVGV4dHVyZUJpYXMoIHRleHR1cmUsIHRleHR1cmVQcm9wZXJ0eSwgdXZTbmlwcGV0LCBiaWFzU25pcHBldCApIHtcclxuXHJcblx0XHRyZXR1cm4gYHRleHR1cmUoICR7IHRleHR1cmVQcm9wZXJ0eSB9LCAkeyB1dlNuaXBwZXQgfSwgJHsgYmlhc1NuaXBwZXQgfSApYDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZW5lcmF0ZXMgdGhlIEdMU0wgc25pcHBldCBmb3Igc2FtcGxpbmcvbG9hZGluZyB0aGUgZ2l2ZW4gdGV4dHVyZSB1c2luZyBleHBsaWNpdCBncmFkaWVudHMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdGV4dHVyZVByb3BlcnR5IC0gVGhlIG5hbWUgb2YgdGhlIHRleHR1cmUgdW5pZm9ybSBpbiB0aGUgc2hhZGVyLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB1dlNuaXBwZXQgLSBBIEdMU0wgc25pcHBldCB0aGF0IHJlcHJlc2VudHMgdGV4dHVyZSBjb29yZGluYXRlcyB1c2VkIGZvciBzYW1wbGluZy5cclxuXHQgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGdyYWRTbmlwcGV0IC0gQW4gYXJyYXkgaG9sZGluZyBib3RoIGdyYWRpZW50IEdMU0wgc25pcHBldHMuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgR0xTTCBzbmlwcGV0LlxyXG5cdCAqL1xyXG5cdGdlbmVyYXRlVGV4dHVyZUdyYWQoIHRleHR1cmUsIHRleHR1cmVQcm9wZXJ0eSwgdXZTbmlwcGV0LCBncmFkU25pcHBldCApIHtcclxuXHJcblx0XHRyZXR1cm4gYHRleHR1cmVHcmFkKCAkeyB0ZXh0dXJlUHJvcGVydHkgfSwgJHsgdXZTbmlwcGV0IH0sICR7IGdyYWRTbmlwcGV0WyAwIF0gfSwgJHsgZ3JhZFNuaXBwZXRbIDEgXSB9IClgO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyB0aGUgR0xTTCBzbmlwcGV0IGZvciBzYW1wbGluZyBhIGRlcHRoIHRleHR1cmUgYW5kIGNvbXBhcmluZyB0aGUgc2FtcGxlZCBkZXB0aCB2YWx1ZXNcclxuXHQgKiBhZ2FpbnN0IGEgcmVmZXJlbmNlIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHRleHR1cmVQcm9wZXJ0eSAtIFRoZSBuYW1lIG9mIHRoZSB0ZXh0dXJlIHVuaWZvcm0gaW4gdGhlIHNoYWRlci5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdXZTbmlwcGV0IC0gQSBHTFNMIHNuaXBwZXQgdGhhdCByZXByZXNlbnRzIHRleHR1cmUgY29vcmRpbmF0ZXMgdXNlZCBmb3Igc2FtcGxpbmcuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGNvbXBhcmVTbmlwcGV0IC0gIEEgR0xTTCBzbmlwcGV0IHRoYXQgcmVwcmVzZW50cyB0aGUgcmVmZXJlbmNlIHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7P3N0cmluZ30gZGVwdGhTbmlwcGV0IC0gQSBHTFNMIHNuaXBwZXQgdGhhdCByZXByZXNlbnRzIDAtYmFzZWQgdGV4dHVyZSBhcnJheSBpbmRleCB0byBzYW1wbGUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtzaGFkZXJTdGFnZT10aGlzLnNoYWRlclN0YWdlXSAtIFRoZSBzaGFkZXIgc3RhZ2UgdGhpcyBjb2RlIHNuaXBwZXQgaXMgZ2VuZXJhdGVkIGZvci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBHTFNMIHNuaXBwZXQuXHJcblx0ICovXHJcblx0Z2VuZXJhdGVUZXh0dXJlQ29tcGFyZSggdGV4dHVyZSwgdGV4dHVyZVByb3BlcnR5LCB1dlNuaXBwZXQsIGNvbXBhcmVTbmlwcGV0LCBkZXB0aFNuaXBwZXQsIHNoYWRlclN0YWdlID0gdGhpcy5zaGFkZXJTdGFnZSApIHtcclxuXHJcblx0XHRpZiAoIHNoYWRlclN0YWdlID09PSAnZnJhZ21lbnQnICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIGB0ZXh0dXJlKCAkeyB0ZXh0dXJlUHJvcGVydHkgfSwgdmVjMyggJHsgdXZTbmlwcGV0IH0sICR7IGNvbXBhcmVTbmlwcGV0IH0gKSApYDtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc29sZS5lcnJvciggYFdlYkdQVVJlbmRlcmVyOiBUSFJFRS5EZXB0aFRleHR1cmUuY29tcGFyZUZ1bmN0aW9uKCkgZG9lcyBub3Qgc3VwcG9ydCAkeyBzaGFkZXJTdGFnZSB9IHNoYWRlci5gICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHZhcmlhYmxlcyBvZiB0aGUgZ2l2ZW4gc2hhZGVyIHN0YWdlIGFzIGEgR0xTTCBzdHJpbmcuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc2hhZGVyU3RhZ2UgLSBUaGUgc2hhZGVyIHN0YWdlLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIEdMU0wgc25pcHBldCB0aGF0IGRlZmluZXMgdGhlIHZhcmlhYmxlcy5cclxuXHQgKi9cclxuXHRnZXRWYXJzKCBzaGFkZXJTdGFnZSApIHtcclxuXHJcblx0XHRjb25zdCBzbmlwcGV0cyA9IFtdO1xyXG5cclxuXHRcdGNvbnN0IHZhcnMgPSB0aGlzLnZhcnNbIHNoYWRlclN0YWdlIF07XHJcblxyXG5cdFx0aWYgKCB2YXJzICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBjb25zdCB2YXJpYWJsZSBvZiB2YXJzICkge1xyXG5cclxuXHRcdFx0XHRzbmlwcGV0cy5wdXNoKCBgJHsgdGhpcy5nZXRWYXIoIHZhcmlhYmxlLnR5cGUsIHZhcmlhYmxlLm5hbWUsIHZhcmlhYmxlLmNvdW50ICkgfTtgICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBzbmlwcGV0cy5qb2luKCAnXFxuXFx0JyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHVuaWZvcm1zIG9mIHRoZSBnaXZlbiBzaGFkZXIgc3RhZ2UgYXMgYSBHTFNMIHN0cmluZy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzaGFkZXJTdGFnZSAtIFRoZSBzaGFkZXIgc3RhZ2UuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgR0xTTCBzbmlwcGV0IHRoYXQgZGVmaW5lcyB0aGUgdW5pZm9ybXMuXHJcblx0ICovXHJcblx0Z2V0VW5pZm9ybXMoIHNoYWRlclN0YWdlICkge1xyXG5cclxuXHRcdGNvbnN0IHVuaWZvcm1zID0gdGhpcy51bmlmb3Jtc1sgc2hhZGVyU3RhZ2UgXTtcclxuXHJcblx0XHRjb25zdCBiaW5kaW5nU25pcHBldHMgPSBbXTtcclxuXHRcdGNvbnN0IHVuaWZvcm1Hcm91cHMgPSB7fTtcclxuXHJcblx0XHRmb3IgKCBjb25zdCB1bmlmb3JtIG9mIHVuaWZvcm1zICkge1xyXG5cclxuXHRcdFx0bGV0IHNuaXBwZXQgPSBudWxsO1xyXG5cdFx0XHRsZXQgZ3JvdXAgPSBmYWxzZTtcclxuXHJcblx0XHRcdGlmICggdW5pZm9ybS50eXBlID09PSAndGV4dHVyZScgfHwgdW5pZm9ybS50eXBlID09PSAndGV4dHVyZTNEJyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgdGV4dHVyZSA9IHVuaWZvcm0ubm9kZS52YWx1ZTtcclxuXHJcblx0XHRcdFx0bGV0IHR5cGVQcmVmaXggPSAnJztcclxuXHJcblx0XHRcdFx0aWYgKCB0ZXh0dXJlLmlzRGF0YVRleHR1cmUgPT09IHRydWUgfHwgdGV4dHVyZS5pc0RhdGEzRFRleHR1cmUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCB0ZXh0dXJlLnR5cGUgPT09IFVuc2lnbmVkSW50VHlwZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdHR5cGVQcmVmaXggPSAndSc7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIGlmICggdGV4dHVyZS50eXBlID09PSBJbnRUeXBlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0dHlwZVByZWZpeCA9ICdpJztcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKCB1bmlmb3JtLnR5cGUgPT09ICd0ZXh0dXJlM0QnICkge1xyXG5cclxuXHRcdFx0XHRcdHNuaXBwZXQgPSBgJHt0eXBlUHJlZml4fXNhbXBsZXIzRCAkeyB1bmlmb3JtLm5hbWUgfTtgO1xyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCB0ZXh0dXJlLmNvbXBhcmVGdW5jdGlvbiApIHtcclxuXHJcblx0XHRcdFx0XHRzbmlwcGV0ID0gYHNhbXBsZXIyRFNoYWRvdyAkeyB1bmlmb3JtLm5hbWUgfTtgO1xyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCB0ZXh0dXJlLmlzRGF0YUFycmF5VGV4dHVyZSA9PT0gdHJ1ZSB8fCB0ZXh0dXJlLmlzQ29tcHJlc3NlZEFycmF5VGV4dHVyZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0XHRzbmlwcGV0ID0gYCR7dHlwZVByZWZpeH1zYW1wbGVyMkRBcnJheSAkeyB1bmlmb3JtLm5hbWUgfTtgO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdHNuaXBwZXQgPSBgJHt0eXBlUHJlZml4fXNhbXBsZXIyRCAkeyB1bmlmb3JtLm5hbWUgfTtgO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCB1bmlmb3JtLnR5cGUgPT09ICdjdWJlVGV4dHVyZScgKSB7XHJcblxyXG5cdFx0XHRcdHNuaXBwZXQgPSBgc2FtcGxlckN1YmUgJHsgdW5pZm9ybS5uYW1lIH07YDtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIHVuaWZvcm0udHlwZSA9PT0gJ2J1ZmZlcicgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGJ1ZmZlck5vZGUgPSB1bmlmb3JtLm5vZGU7XHJcblx0XHRcdFx0Y29uc3QgYnVmZmVyVHlwZSA9IHRoaXMuZ2V0VHlwZSggYnVmZmVyTm9kZS5idWZmZXJUeXBlICk7XHJcblx0XHRcdFx0Y29uc3QgYnVmZmVyQ291bnQgPSBidWZmZXJOb2RlLmJ1ZmZlckNvdW50O1xyXG5cclxuXHRcdFx0XHRjb25zdCBidWZmZXJDb3VudFNuaXBwZXQgPSBidWZmZXJDb3VudCA+IDAgPyBidWZmZXJDb3VudCA6ICcnO1xyXG5cdFx0XHRcdHNuaXBwZXQgPSBgJHtidWZmZXJOb2RlLm5hbWV9IHtcXG5cXHQkeyBidWZmZXJUeXBlIH0gJHsgdW5pZm9ybS5uYW1lIH1bJHsgYnVmZmVyQ291bnRTbmlwcGV0IH1dO1xcbn07XFxuYDtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHZlY3RvclR5cGUgPSB0aGlzLmdldFZlY3RvclR5cGUoIHVuaWZvcm0udHlwZSApO1xyXG5cclxuXHRcdFx0XHRzbmlwcGV0ID0gYCR7IHZlY3RvclR5cGUgfSAkeyB0aGlzLmdldFByb3BlcnR5TmFtZSggdW5pZm9ybSwgc2hhZGVyU3RhZ2UgKSB9O2A7XHJcblxyXG5cdFx0XHRcdGdyb3VwID0gdHJ1ZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IHByZWNpc2lvbiA9IHVuaWZvcm0ubm9kZS5wcmVjaXNpb247XHJcblxyXG5cdFx0XHRpZiAoIHByZWNpc2lvbiAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0c25pcHBldCA9IHByZWNpc2lvbkxpYlsgcHJlY2lzaW9uIF0gKyAnICcgKyBzbmlwcGV0O1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBncm91cCApIHtcclxuXHJcblx0XHRcdFx0c25pcHBldCA9ICdcXHQnICsgc25pcHBldDtcclxuXHJcblx0XHRcdFx0Y29uc3QgZ3JvdXBOYW1lID0gdW5pZm9ybS5ncm91cE5vZGUubmFtZTtcclxuXHRcdFx0XHRjb25zdCBncm91cFNuaXBwZXRzID0gdW5pZm9ybUdyb3Vwc1sgZ3JvdXBOYW1lIF0gfHwgKCB1bmlmb3JtR3JvdXBzWyBncm91cE5hbWUgXSA9IFtdICk7XHJcblxyXG5cdFx0XHRcdGdyb3VwU25pcHBldHMucHVzaCggc25pcHBldCApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0c25pcHBldCA9ICd1bmlmb3JtICcgKyBzbmlwcGV0O1xyXG5cclxuXHRcdFx0XHRiaW5kaW5nU25pcHBldHMucHVzaCggc25pcHBldCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRsZXQgb3V0cHV0ID0gJyc7XHJcblxyXG5cdFx0Zm9yICggY29uc3QgbmFtZSBpbiB1bmlmb3JtR3JvdXBzICkge1xyXG5cclxuXHRcdFx0Y29uc3QgZ3JvdXBTbmlwcGV0cyA9IHVuaWZvcm1Hcm91cHNbIG5hbWUgXTtcclxuXHJcblx0XHRcdG91dHB1dCArPSB0aGlzLl9nZXRHTFNMVW5pZm9ybVN0cnVjdCggc2hhZGVyU3RhZ2UgKyAnXycgKyBuYW1lLCBncm91cFNuaXBwZXRzLmpvaW4oICdcXG4nICkgKSArICdcXG4nO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRvdXRwdXQgKz0gYmluZGluZ1NuaXBwZXRzLmpvaW4oICdcXG4nICk7XHJcblxyXG5cdFx0cmV0dXJuIG91dHB1dDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSB0eXBlIGZvciBhIGdpdmVuIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0J1ZmZlckF0dHJpYnV0ZX0gYXR0cmlidXRlIC0gVGhlIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgdHlwZS5cclxuXHQgKi9cclxuXHRnZXRUeXBlRnJvbUF0dHJpYnV0ZSggYXR0cmlidXRlICkge1xyXG5cclxuXHRcdGxldCBub2RlVHlwZSA9IHN1cGVyLmdldFR5cGVGcm9tQXR0cmlidXRlKCBhdHRyaWJ1dGUgKTtcclxuXHJcblx0XHRpZiAoIC9eW2l1XS8udGVzdCggbm9kZVR5cGUgKSAmJiBhdHRyaWJ1dGUuZ3B1VHlwZSAhPT0gSW50VHlwZSApIHtcclxuXHJcblx0XHRcdGxldCBkYXRhQXR0cmlidXRlID0gYXR0cmlidXRlO1xyXG5cclxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApIGRhdGFBdHRyaWJ1dGUgPSBhdHRyaWJ1dGUuZGF0YTtcclxuXHJcblx0XHRcdGNvbnN0IGFycmF5ID0gZGF0YUF0dHJpYnV0ZS5hcnJheTtcclxuXHJcblx0XHRcdGlmICggKCBhcnJheSBpbnN0YW5jZW9mIFVpbnQzMkFycmF5IHx8IGFycmF5IGluc3RhbmNlb2YgSW50MzJBcnJheSApID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdFx0bm9kZVR5cGUgPSBub2RlVHlwZS5zbGljZSggMSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbm9kZVR5cGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgc2hhZGVyIGF0dHJpYnV0ZXMgb2YgdGhlIGdpdmVuIHNoYWRlciBzdGFnZSBhcyBhIEdMU0wgc3RyaW5nLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNoYWRlclN0YWdlIC0gVGhlIHNoYWRlciBzdGFnZS5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBHTFNMIHNuaXBwZXQgdGhhdCBkZWZpbmVzIHRoZSBzaGFkZXIgYXR0cmlidXRlcy5cclxuXHQgKi9cclxuXHRnZXRBdHRyaWJ1dGVzKCBzaGFkZXJTdGFnZSApIHtcclxuXHJcblx0XHRsZXQgc25pcHBldCA9ICcnO1xyXG5cclxuXHRcdGlmICggc2hhZGVyU3RhZ2UgPT09ICd2ZXJ0ZXgnIHx8IHNoYWRlclN0YWdlID09PSAnY29tcHV0ZScgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBhdHRyaWJ1dGVzID0gdGhpcy5nZXRBdHRyaWJ1dGVzQXJyYXkoKTtcclxuXHJcblx0XHRcdGxldCBsb2NhdGlvbiA9IDA7XHJcblxyXG5cdFx0XHRmb3IgKCBjb25zdCBhdHRyaWJ1dGUgb2YgYXR0cmlidXRlcyApIHtcclxuXHJcblx0XHRcdFx0c25pcHBldCArPSBgbGF5b3V0KCBsb2NhdGlvbiA9ICR7IGxvY2F0aW9uICsrIH0gKSBpbiAkeyBhdHRyaWJ1dGUudHlwZSB9ICR7IGF0dHJpYnV0ZS5uYW1lIH07XFxuYDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHNuaXBwZXQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgbWVtYmVycyBvZiB0aGUgZ2l2ZW4gc3RydWN0IHR5cGUgbm9kZSBhcyBhIEdMU0wgc3RyaW5nLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTdHJ1Y3RUeXBlTm9kZX0gc3RydWN0IC0gVGhlIHN0cnVjdCB0eXBlIG5vZGUuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgR0xTTCBzbmlwcGV0IHRoYXQgZGVmaW5lcyB0aGUgc3RydWN0IG1lbWJlcnMuXHJcblx0ICovXHJcblx0Z2V0U3RydWN0TWVtYmVycyggc3RydWN0ICkge1xyXG5cclxuXHRcdGNvbnN0IHNuaXBwZXRzID0gW107XHJcblxyXG5cdFx0Zm9yICggY29uc3QgbWVtYmVyIG9mIHN0cnVjdC5tZW1iZXJzICkge1xyXG5cclxuXHRcdFx0c25pcHBldHMucHVzaCggYFxcdCR7IG1lbWJlci50eXBlIH0gJHsgbWVtYmVyLm5hbWUgfTtgICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBzbmlwcGV0cy5qb2luKCAnXFxuJyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHN0cnVjdHMgb2YgdGhlIGdpdmVuIHNoYWRlciBzdGFnZSBhcyBhIEdMU0wgc3RyaW5nLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNoYWRlclN0YWdlIC0gVGhlIHNoYWRlciBzdGFnZS5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBHTFNMIHNuaXBwZXQgdGhhdCBkZWZpbmVzIHRoZSBzdHJ1Y3RzLlxyXG5cdCAqL1xyXG5cdGdldFN0cnVjdHMoIHNoYWRlclN0YWdlICkge1xyXG5cclxuXHRcdGNvbnN0IHNuaXBwZXRzID0gW107XHJcblx0XHRjb25zdCBzdHJ1Y3RzID0gdGhpcy5zdHJ1Y3RzWyBzaGFkZXJTdGFnZSBdO1xyXG5cclxuXHRcdGNvbnN0IG91dHB1dFNuaXBwZXQgPSBbXTtcclxuXHJcblx0XHRmb3IgKCBjb25zdCBzdHJ1Y3Qgb2Ygc3RydWN0cyApIHtcclxuXHJcblx0XHRcdGlmICggc3RydWN0Lm91dHB1dCApIHtcclxuXHJcblx0XHRcdFx0Zm9yICggY29uc3QgbWVtYmVyIG9mIHN0cnVjdC5tZW1iZXJzICkge1xyXG5cclxuXHRcdFx0XHRcdG91dHB1dFNuaXBwZXQucHVzaCggYGxheW91dCggbG9jYXRpb24gPSAkeyBtZW1iZXIuaW5kZXggfSApIG91dCAkeyBtZW1iZXIudHlwZSB9ICR7IG1lbWJlci5uYW1lIH07YCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRsZXQgc25pcHBldCA9ICdzdHJ1Y3QgJyArIHN0cnVjdC5uYW1lICsgJyB7XFxuJztcclxuXHRcdFx0XHRzbmlwcGV0ICs9IHRoaXMuZ2V0U3RydWN0TWVtYmVycyggc3RydWN0ICk7XHJcblx0XHRcdFx0c25pcHBldCArPSAnXFxufTtcXG4nO1xyXG5cclxuXHRcdFx0XHRzbmlwcGV0cy5wdXNoKCBzbmlwcGV0ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggb3V0cHV0U25pcHBldC5sZW5ndGggPT09IDAgKSB7XHJcblxyXG5cdFx0XHRvdXRwdXRTbmlwcGV0LnB1c2goICdsYXlvdXQoIGxvY2F0aW9uID0gMCApIG91dCB2ZWM0IGZyYWdDb2xvcjsnICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiAnXFxuJyArIG91dHB1dFNuaXBwZXQuam9pbiggJ1xcbicgKSArICdcXG5cXG4nICsgc25pcHBldHMuam9pbiggJ1xcbicgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSB2YXJ5aW5ncyBvZiB0aGUgZ2l2ZW4gc2hhZGVyIHN0YWdlIGFzIGEgR0xTTCBzdHJpbmcuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc2hhZGVyU3RhZ2UgLSBUaGUgc2hhZGVyIHN0YWdlLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIEdMU0wgc25pcHBldCB0aGF0IGRlZmluZXMgdGhlIHZhcnlpbmdzLlxyXG5cdCAqL1xyXG5cdGdldFZhcnlpbmdzKCBzaGFkZXJTdGFnZSApIHtcclxuXHJcblx0XHRsZXQgc25pcHBldCA9ICcnO1xyXG5cclxuXHRcdGNvbnN0IHZhcnlpbmdzID0gdGhpcy52YXJ5aW5ncztcclxuXHJcblx0XHRpZiAoIHNoYWRlclN0YWdlID09PSAndmVydGV4JyB8fCBzaGFkZXJTdGFnZSA9PT0gJ2NvbXB1dGUnICkge1xyXG5cclxuXHRcdFx0Zm9yICggY29uc3QgdmFyeWluZyBvZiB2YXJ5aW5ncyApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBzaGFkZXJTdGFnZSA9PT0gJ2NvbXB1dGUnICkgdmFyeWluZy5uZWVkc0ludGVycG9sYXRpb24gPSB0cnVlO1xyXG5cclxuXHRcdFx0XHRjb25zdCB0eXBlID0gdGhpcy5nZXRUeXBlKCB2YXJ5aW5nLnR5cGUgKTtcclxuXHJcblx0XHRcdFx0aWYgKCB2YXJ5aW5nLm5lZWRzSW50ZXJwb2xhdGlvbiApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBmbGF0ID0gdHlwZS5pbmNsdWRlcyggJ2ludCcgKSB8fCB0eXBlLmluY2x1ZGVzKCAndXYnICkgfHwgdHlwZS5pbmNsdWRlcyggJ2l2JyApID8gJ2ZsYXQgJyA6ICcnO1xyXG5cclxuXHRcdFx0XHRcdHNuaXBwZXQgKz0gYCR7ZmxhdH1vdXQgJHt0eXBlfSAke3ZhcnlpbmcubmFtZX07XFxuYDtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRzbmlwcGV0ICs9IGAke3R5cGV9ICR7dmFyeWluZy5uYW1lfTtcXG5gOyAvLyBnZW5lcmF0ZSB2YXJpYWJsZSAobm8gdmFyeWluZyByZXF1aXJlZClcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHNoYWRlclN0YWdlID09PSAnZnJhZ21lbnQnICkge1xyXG5cclxuXHRcdFx0Zm9yICggY29uc3QgdmFyeWluZyBvZiB2YXJ5aW5ncyApIHtcclxuXHJcblx0XHRcdFx0aWYgKCB2YXJ5aW5nLm5lZWRzSW50ZXJwb2xhdGlvbiApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCB0eXBlID0gdGhpcy5nZXRUeXBlKCB2YXJ5aW5nLnR5cGUgKTtcclxuXHRcdFx0XHRcdGNvbnN0IGZsYXQgPSB0eXBlLmluY2x1ZGVzKCAnaW50JyApIHx8IHR5cGUuaW5jbHVkZXMoICd1dicgKSB8fCB0eXBlLmluY2x1ZGVzKCAnaXYnICkgPyAnZmxhdCAnIDogJyc7XHJcblxyXG5cdFx0XHRcdFx0c25pcHBldCArPSBgJHtmbGF0fWluICR7dHlwZX0gJHt2YXJ5aW5nLm5hbWV9O1xcbmA7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Zm9yICggY29uc3QgYnVpbHRpbiBvZiB0aGlzLmJ1aWx0aW5zWyBzaGFkZXJTdGFnZSBdICkge1xyXG5cclxuXHRcdFx0c25pcHBldCArPSBgJHtidWlsdGlufTtcXG5gO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gc25pcHBldDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSB2ZXJ0ZXggaW5kZXggYnVpbHRpbi5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHZlcnRleCBpbmRleC5cclxuXHQgKi9cclxuXHRnZXRWZXJ0ZXhJbmRleCgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ3VpbnQoIGdsX1ZlcnRleElEICknO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGluc3RhbmNlIGluZGV4IGJ1aWx0aW4uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBpbnN0YW5jZSBpbmRleC5cclxuXHQgKi9cclxuXHRnZXRJbnN0YW5jZUluZGV4KCkge1xyXG5cclxuXHRcdHJldHVybiAndWludCggZ2xfSW5zdGFuY2VJRCApJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBpbnZvY2F0aW9uIGxvY2FsIGluZGV4IGJ1aWx0aW4uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBpbnZvY2F0aW9uIGxvY2FsIGluZGV4LlxyXG5cdCAqL1xyXG5cdGdldEludm9jYXRpb25Mb2NhbEluZGV4KCkge1xyXG5cclxuXHRcdGNvbnN0IHdvcmtncm91cFNpemUgPSB0aGlzLm9iamVjdC53b3JrZ3JvdXBTaXplO1xyXG5cclxuXHRcdGNvbnN0IHNpemUgPSB3b3JrZ3JvdXBTaXplLnJlZHVjZSggKCBhY2MsIGN1cnIgKSA9PiBhY2MgKiBjdXJyLCAxICk7XHJcblxyXG5cdFx0cmV0dXJuIGB1aW50KCBnbF9JbnN0YW5jZUlEICkgJSAke3NpemV9dWA7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgZHJhdyBpbmRleCBidWlsdGluLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7P3N0cmluZ30gVGhlIGRyYXdJbmRleCBzaGFkZXIgc3RyaW5nLiBSZXR1cm5zIGBudWxsYCBpZiBgV0VCR0xfbXVsdGlfZHJhd2AgaXNuJ3Qgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UuXHJcblx0ICovXHJcblx0Z2V0RHJhd0luZGV4KCkge1xyXG5cclxuXHRcdGNvbnN0IGV4dGVuc2lvbnMgPSB0aGlzLnJlbmRlcmVyLmJhY2tlbmQuZXh0ZW5zaW9ucztcclxuXHJcblx0XHRpZiAoIGV4dGVuc2lvbnMuaGFzKCAnV0VCR0xfbXVsdGlfZHJhdycgKSApIHtcclxuXHJcblx0XHRcdHJldHVybiAndWludCggZ2xfRHJhd0lEICknO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBmcm9udCBmYWNpbmcgYnVpbHRpbi5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGZyb250IGZhY2luZyBidWlsdGluLlxyXG5cdCAqL1xyXG5cdGdldEZyb250RmFjaW5nKCkge1xyXG5cclxuXHRcdHJldHVybiAnZ2xfRnJvbnRGYWNpbmcnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGZyYWcgY29vcmQgYnVpbHRpbi5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGZyYWcgY29vcmQgYnVpbHRpbi5cclxuXHQgKi9cclxuXHRnZXRGcmFnQ29vcmQoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdnbF9GcmFnQ29vcmQueHknO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGZyYWcgZGVwdGggYnVpbHRpbi5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGZyYWcgZGVwdGggYnVpbHRpbi5cclxuXHQgKi9cclxuXHRnZXRGcmFnRGVwdGgoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdnbF9GcmFnRGVwdGgnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEVuYWJsZXMgdGhlIGdpdmVuIGV4dGVuc2lvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIGV4dGVuc2lvbiBuYW1lLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBiZWhhdmlvciAtIFRoZSBleHRlbnNpb24gYmVoYXZpb3IuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtzaGFkZXJTdGFnZT10aGlzLnNoYWRlclN0YWdlXSAtIFRoZSBzaGFkZXIgc3RhZ2UuXHJcblx0ICovXHJcblx0ZW5hYmxlRXh0ZW5zaW9uKCBuYW1lLCBiZWhhdmlvciwgc2hhZGVyU3RhZ2UgPSB0aGlzLnNoYWRlclN0YWdlICkge1xyXG5cclxuXHRcdGNvbnN0IG1hcCA9IHRoaXMuZXh0ZW5zaW9uc1sgc2hhZGVyU3RhZ2UgXSB8fCAoIHRoaXMuZXh0ZW5zaW9uc1sgc2hhZGVyU3RhZ2UgXSA9IG5ldyBNYXAoKSApO1xyXG5cclxuXHRcdGlmICggbWFwLmhhcyggbmFtZSApID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdG1hcC5zZXQoIG5hbWUsIHtcclxuXHRcdFx0XHRuYW1lLFxyXG5cdFx0XHRcdGJlaGF2aW9yXHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgZW5hYmxlZCBleHRlbnNpb25zIG9mIHRoZSBnaXZlbiBzaGFkZXIgc3RhZ2UgYXMgYSBHTFNMIHN0cmluZy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzaGFkZXJTdGFnZSAtIFRoZSBzaGFkZXIgc3RhZ2UuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgR0xTTCBzbmlwcGV0IHRoYXQgZGVmaW5lcyB0aGUgZW5hYmxlZCBleHRlbnNpb25zLlxyXG5cdCAqL1xyXG5cdGdldEV4dGVuc2lvbnMoIHNoYWRlclN0YWdlICkge1xyXG5cclxuXHRcdGNvbnN0IHNuaXBwZXRzID0gW107XHJcblxyXG5cdFx0aWYgKCBzaGFkZXJTdGFnZSA9PT0gJ3ZlcnRleCcgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBleHQgPSB0aGlzLnJlbmRlcmVyLmJhY2tlbmQuZXh0ZW5zaW9ucztcclxuXHRcdFx0Y29uc3QgaXNCYXRjaGVkTWVzaCA9IHRoaXMub2JqZWN0LmlzQmF0Y2hlZE1lc2g7XHJcblxyXG5cdFx0XHRpZiAoIGlzQmF0Y2hlZE1lc2ggJiYgZXh0LmhhcyggJ1dFQkdMX211bHRpX2RyYXcnICkgKSB7XHJcblxyXG5cdFx0XHRcdHRoaXMuZW5hYmxlRXh0ZW5zaW9uKCAnR0xfQU5HTEVfbXVsdGlfZHJhdycsICdyZXF1aXJlJywgc2hhZGVyU3RhZ2UgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgZXh0ZW5zaW9ucyA9IHRoaXMuZXh0ZW5zaW9uc1sgc2hhZGVyU3RhZ2UgXTtcclxuXHJcblx0XHRpZiAoIGV4dGVuc2lvbnMgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGZvciAoIGNvbnN0IHsgbmFtZSwgYmVoYXZpb3IgfSBvZiBleHRlbnNpb25zLnZhbHVlcygpICkge1xyXG5cclxuXHRcdFx0XHRzbmlwcGV0cy5wdXNoKCBgI2V4dGVuc2lvbiAke25hbWV9IDogJHtiZWhhdmlvcn1gICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBzbmlwcGV0cy5qb2luKCAnXFxuJyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGNsaXAgZGlzdGFuY2VzIGJ1aWx0aW4uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBjbGlwIGRpc3RhbmNlcyBidWlsdGluLlxyXG5cdCAqL1xyXG5cdGdldENsaXBEaXN0YW5jZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ2dsX0NsaXBEaXN0YW5jZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogV2hldGhlciB0aGUgcmVxdWVzdGVkIGZlYXR1cmUgaXMgYXZhaWxhYmxlIG9yIG5vdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIHJlcXVlc3RlZCBmZWF0dXJlLlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHJlcXVlc3RlZCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBvciBub3QuXHJcblx0ICovXHJcblx0aXNBdmFpbGFibGUoIG5hbWUgKSB7XHJcblxyXG5cdFx0bGV0IHJlc3VsdCA9IHN1cHBvcnRzWyBuYW1lIF07XHJcblxyXG5cdFx0aWYgKCByZXN1bHQgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGxldCBleHRlbnNpb25OYW1lO1xyXG5cclxuXHRcdFx0cmVzdWx0ID0gZmFsc2U7XHJcblxyXG5cdFx0XHRzd2l0Y2ggKCBuYW1lICkge1xyXG5cclxuXHRcdFx0XHRjYXNlICdmbG9hdDMyRmlsdGVyYWJsZSc6XHJcblx0XHRcdFx0XHRleHRlbnNpb25OYW1lID0gJ09FU190ZXh0dXJlX2Zsb2F0X2xpbmVhcic7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0Y2FzZSAnY2xpcERpc3RhbmNlJzpcclxuXHRcdFx0XHRcdGV4dGVuc2lvbk5hbWUgPSAnV0VCR0xfY2xpcF9jdWxsX2Rpc3RhbmNlJztcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBleHRlbnNpb25OYW1lICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGV4dGVuc2lvbnMgPSB0aGlzLnJlbmRlcmVyLmJhY2tlbmQuZXh0ZW5zaW9ucztcclxuXHJcblx0XHRcdFx0aWYgKCBleHRlbnNpb25zLmhhcyggZXh0ZW5zaW9uTmFtZSApICkge1xyXG5cclxuXHRcdFx0XHRcdGV4dGVuc2lvbnMuZ2V0KCBleHRlbnNpb25OYW1lICk7XHJcblx0XHRcdFx0XHRyZXN1bHQgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRzdXBwb3J0c1sgbmFtZSBdID0gcmVzdWx0O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdoZXRoZXIgdG8gZmxpcCB0ZXh0dXJlIGRhdGEgYWxvbmcgaXRzIHZlcnRpY2FsIGF4aXMgb3Igbm90LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyBhbHdheXMgYHRydWVgIGluIGNvbnRleHQgb2YgR0xTTC5cclxuXHQgKi9cclxuXHRpc0ZsaXBZKCkge1xyXG5cclxuXHRcdHJldHVybiB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEVuYWJsZXMgaGFyZHdhcmUgY2xpcHBpbmcuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcGxhbmVDb3VudCAtIFRoZSBjbGlwcGluZyBwbGFuZSBjb3VudC5cclxuXHQgKi9cclxuXHRlbmFibGVIYXJkd2FyZUNsaXBwaW5nKCBwbGFuZUNvdW50ICkge1xyXG5cclxuXHRcdHRoaXMuZW5hYmxlRXh0ZW5zaW9uKCAnR0xfQU5HTEVfY2xpcF9jdWxsX2Rpc3RhbmNlJywgJ3JlcXVpcmUnICk7XHJcblxyXG5cdFx0dGhpcy5idWlsdGluc1sgJ3ZlcnRleCcgXS5wdXNoKCBgb3V0IGZsb2F0IGdsX0NsaXBEaXN0YW5jZVsgJHsgcGxhbmVDb3VudCB9IF1gICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVnaXN0ZXJzIGEgdHJhbnNmb3JtIGluIGNvbnRleHQgb2YgVHJhbnNmb3JtIEZlZWRiYWNrLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHZhcnlpbmdOYW1lIC0gVGhlIHZhcnlpbmcgbmFtZS5cclxuXHQgKiBAcGFyYW0ge0F0dHJpYnV0ZU5vZGV9IGF0dHJpYnV0ZU5vZGUgLSBUaGUgYXR0cmlidXRlIG5vZGUuXHJcblx0ICovXHJcblx0cmVnaXN0ZXJUcmFuc2Zvcm0oIHZhcnlpbmdOYW1lLCBhdHRyaWJ1dGVOb2RlICkge1xyXG5cclxuXHRcdHRoaXMudHJhbnNmb3Jtcy5wdXNoKCB7IHZhcnlpbmdOYW1lLCBhdHRyaWJ1dGVOb2RlIH0gKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSB0cmFuc2Zvcm1zIG9mIHRoZSBnaXZlbiBzaGFkZXIgc3RhZ2UgYXMgYSBHTFNMIHN0cmluZy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzaGFkZXJTdGFnZSAtIFRoZSBzaGFkZXIgc3RhZ2UuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgR0xTTCBzbmlwcGV0IHRoYXQgZGVmaW5lcyB0aGUgdHJhbnNmb3Jtcy5cclxuXHQgKi9cclxuXHRnZXRUcmFuc2Zvcm1zKCAvKiBzaGFkZXJTdGFnZSAgKi8gKSB7XHJcblxyXG5cdFx0Y29uc3QgdHJhbnNmb3JtcyA9IHRoaXMudHJhbnNmb3JtcztcclxuXHJcblx0XHRsZXQgc25pcHBldCA9ICcnO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHRyYW5zZm9ybXMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdHJhbnNmb3JtID0gdHJhbnNmb3Jtc1sgaSBdO1xyXG5cdFx0XHRjb25zdCBhdHRyaWJ1dGVOYW1lID0gdGhpcy5nZXRQcm9wZXJ0eU5hbWUoIHRyYW5zZm9ybS5hdHRyaWJ1dGVOb2RlICk7XHJcblxyXG5cdFx0XHRpZiAoIGF0dHJpYnV0ZU5hbWUgKSBzbmlwcGV0ICs9IGAkeyB0cmFuc2Zvcm0udmFyeWluZ05hbWUgfSA9ICR7IGF0dHJpYnV0ZU5hbWUgfTtcXG5cXHRgO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gc25pcHBldDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgR0xTTCBzdHJ1Y3QgYmFzZWQgb24gdGhlIGdpdmVuIG5hbWUgYW5kIHZhcmlhYmxlcy5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgc3RydWN0IG5hbWUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHZhcnMgLSBUaGUgc3RydWN0IHZhcmlhYmxlcy5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBHTFNMIHNuaXBwZXQgcmVwcmVzZW50aW5nIGEgc3RydWN0LlxyXG5cdCAqL1xyXG5cdF9nZXRHTFNMVW5pZm9ybVN0cnVjdCggbmFtZSwgdmFycyApIHtcclxuXHJcblx0XHRyZXR1cm4gYFxyXG5sYXlvdXQoIHN0ZDE0MCApIHVuaWZvcm0gJHtuYW1lfSB7XHJcbiR7dmFyc31cclxufTtgO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBHTFNMIHZlcnRleCBzaGFkZXIgYmFzZWQgb24gdGhlIGdpdmVuIHNoYWRlciBkYXRhLlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gc2hhZGVyRGF0YSAtIFRoZSBzaGFkZXIgZGF0YS5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB2ZXJ0ZXggc2hhZGVyLlxyXG5cdCAqL1xyXG5cdF9nZXRHTFNMVmVydGV4Q29kZSggc2hhZGVyRGF0YSApIHtcclxuXHJcblx0XHRyZXR1cm4gYCN2ZXJzaW9uIDMwMCBlc1xyXG5cclxuJHsgdGhpcy5nZXRTaWduYXR1cmUoKSB9XHJcblxyXG4vLyBleHRlbnNpb25zXHJcbiR7c2hhZGVyRGF0YS5leHRlbnNpb25zfVxyXG5cclxuLy8gcHJlY2lzaW9uXHJcbiR7IGRlZmF1bHRQcmVjaXNpb25zIH1cclxuXHJcbi8vIHVuaWZvcm1zXHJcbiR7c2hhZGVyRGF0YS51bmlmb3Jtc31cclxuXHJcbi8vIHZhcnlpbmdzXHJcbiR7c2hhZGVyRGF0YS52YXJ5aW5nc31cclxuXHJcbi8vIGF0dHJpYnV0ZXNcclxuJHtzaGFkZXJEYXRhLmF0dHJpYnV0ZXN9XHJcblxyXG4vLyBjb2Rlc1xyXG4ke3NoYWRlckRhdGEuY29kZXN9XHJcblxyXG52b2lkIG1haW4oKSB7XHJcblxyXG5cdC8vIHZhcnNcclxuXHQke3NoYWRlckRhdGEudmFyc31cclxuXHJcblx0Ly8gdHJhbnNmb3Jtc1xyXG5cdCR7c2hhZGVyRGF0YS50cmFuc2Zvcm1zfVxyXG5cclxuXHQvLyBmbG93XHJcblx0JHtzaGFkZXJEYXRhLmZsb3d9XHJcblxyXG5cdGdsX1BvaW50U2l6ZSA9IDEuMDtcclxuXHJcbn1cclxuYDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgR0xTTCBmcmFnbWVudCBzaGFkZXIgYmFzZWQgb24gdGhlIGdpdmVuIHNoYWRlciBkYXRhLlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gc2hhZGVyRGF0YSAtIFRoZSBzaGFkZXIgZGF0YS5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB2ZXJ0ZXggc2hhZGVyLlxyXG5cdCAqL1xyXG5cdF9nZXRHTFNMRnJhZ21lbnRDb2RlKCBzaGFkZXJEYXRhICkge1xyXG5cclxuXHRcdHJldHVybiBgI3ZlcnNpb24gMzAwIGVzXHJcblxyXG4keyB0aGlzLmdldFNpZ25hdHVyZSgpIH1cclxuXHJcbi8vIHByZWNpc2lvblxyXG4keyBkZWZhdWx0UHJlY2lzaW9ucyB9XHJcblxyXG4vLyB1bmlmb3Jtc1xyXG4ke3NoYWRlckRhdGEudW5pZm9ybXN9XHJcblxyXG4vLyB2YXJ5aW5nc1xyXG4ke3NoYWRlckRhdGEudmFyeWluZ3N9XHJcblxyXG4vLyBjb2Rlc1xyXG4ke3NoYWRlckRhdGEuY29kZXN9XHJcblxyXG4vLyBzdHJ1Y3RzXHJcbiR7c2hhZGVyRGF0YS5zdHJ1Y3RzfVxyXG5cclxudm9pZCBtYWluKCkge1xyXG5cclxuXHQvLyB2YXJzXHJcblx0JHtzaGFkZXJEYXRhLnZhcnN9XHJcblxyXG5cdC8vIGZsb3dcclxuXHQke3NoYWRlckRhdGEuZmxvd31cclxuXHJcbn1cclxuYDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb250cm9scyB0aGUgY29kZSBidWlsZCBvZiB0aGUgc2hhZGVyIHN0YWdlcy5cclxuXHQgKi9cclxuXHRidWlsZENvZGUoKSB7XHJcblxyXG5cdFx0Y29uc3Qgc2hhZGVyc0RhdGEgPSB0aGlzLm1hdGVyaWFsICE9PSBudWxsID8geyBmcmFnbWVudDoge30sIHZlcnRleDoge30gfSA6IHsgY29tcHV0ZToge30gfTtcclxuXHJcblx0XHR0aGlzLnNvcnRCaW5kaW5nR3JvdXBzKCk7XHJcblxyXG5cdFx0Zm9yICggY29uc3Qgc2hhZGVyU3RhZ2UgaW4gc2hhZGVyc0RhdGEgKSB7XHJcblxyXG5cdFx0XHRsZXQgZmxvdyA9ICcvLyBjb2RlXFxuXFxuJztcclxuXHRcdFx0ZmxvdyArPSB0aGlzLmZsb3dDb2RlWyBzaGFkZXJTdGFnZSBdO1xyXG5cclxuXHRcdFx0Y29uc3QgZmxvd05vZGVzID0gdGhpcy5mbG93Tm9kZXNbIHNoYWRlclN0YWdlIF07XHJcblx0XHRcdGNvbnN0IG1haW5Ob2RlID0gZmxvd05vZGVzWyBmbG93Tm9kZXMubGVuZ3RoIC0gMSBdO1xyXG5cclxuXHRcdFx0Zm9yICggY29uc3Qgbm9kZSBvZiBmbG93Tm9kZXMgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGZsb3dTbG90RGF0YSA9IHRoaXMuZ2V0Rmxvd0RhdGEoIG5vZGUvKiwgc2hhZGVyU3RhZ2UqLyApO1xyXG5cdFx0XHRcdGNvbnN0IHNsb3ROYW1lID0gbm9kZS5uYW1lO1xyXG5cclxuXHRcdFx0XHRpZiAoIHNsb3ROYW1lICkge1xyXG5cclxuXHRcdFx0XHRcdGlmICggZmxvdy5sZW5ndGggPiAwICkgZmxvdyArPSAnXFxuJztcclxuXHJcblx0XHRcdFx0XHRmbG93ICs9IGBcXHQvLyBmbG93IC0+ICR7IHNsb3ROYW1lIH1cXG5cXHRgO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGZsb3cgKz0gYCR7IGZsb3dTbG90RGF0YS5jb2RlIH1cXG5cXHRgO1xyXG5cclxuXHRcdFx0XHRpZiAoIG5vZGUgPT09IG1haW5Ob2RlICYmIHNoYWRlclN0YWdlICE9PSAnY29tcHV0ZScgKSB7XHJcblxyXG5cdFx0XHRcdFx0ZmxvdyArPSAnLy8gcmVzdWx0XFxuXFx0JztcclxuXHJcblx0XHRcdFx0XHRpZiAoIHNoYWRlclN0YWdlID09PSAndmVydGV4JyApIHtcclxuXHJcblx0XHRcdFx0XHRcdGZsb3cgKz0gJ2dsX1Bvc2l0aW9uID0gJztcclxuXHRcdFx0XHRcdFx0ZmxvdyArPSBgJHsgZmxvd1Nsb3REYXRhLnJlc3VsdCB9O2A7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIGlmICggc2hhZGVyU3RhZ2UgPT09ICdmcmFnbWVudCcgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoICEgbm9kZS5vdXRwdXROb2RlLmlzT3V0cHV0U3RydWN0Tm9kZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0ZmxvdyArPSAnZnJhZ0NvbG9yID0gJztcclxuXHRcdFx0XHRcdFx0XHRmbG93ICs9IGAkeyBmbG93U2xvdERhdGEucmVzdWx0IH07YDtcclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IHN0YWdlRGF0YSA9IHNoYWRlcnNEYXRhWyBzaGFkZXJTdGFnZSBdO1xyXG5cclxuXHRcdFx0c3RhZ2VEYXRhLmV4dGVuc2lvbnMgPSB0aGlzLmdldEV4dGVuc2lvbnMoIHNoYWRlclN0YWdlICk7XHJcblx0XHRcdHN0YWdlRGF0YS51bmlmb3JtcyA9IHRoaXMuZ2V0VW5pZm9ybXMoIHNoYWRlclN0YWdlICk7XHJcblx0XHRcdHN0YWdlRGF0YS5hdHRyaWJ1dGVzID0gdGhpcy5nZXRBdHRyaWJ1dGVzKCBzaGFkZXJTdGFnZSApO1xyXG5cdFx0XHRzdGFnZURhdGEudmFyeWluZ3MgPSB0aGlzLmdldFZhcnlpbmdzKCBzaGFkZXJTdGFnZSApO1xyXG5cdFx0XHRzdGFnZURhdGEudmFycyA9IHRoaXMuZ2V0VmFycyggc2hhZGVyU3RhZ2UgKTtcclxuXHRcdFx0c3RhZ2VEYXRhLnN0cnVjdHMgPSB0aGlzLmdldFN0cnVjdHMoIHNoYWRlclN0YWdlICk7XHJcblx0XHRcdHN0YWdlRGF0YS5jb2RlcyA9IHRoaXMuZ2V0Q29kZXMoIHNoYWRlclN0YWdlICk7XHJcblx0XHRcdHN0YWdlRGF0YS50cmFuc2Zvcm1zID0gdGhpcy5nZXRUcmFuc2Zvcm1zKCBzaGFkZXJTdGFnZSApO1xyXG5cdFx0XHRzdGFnZURhdGEuZmxvdyA9IGZsb3c7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy5tYXRlcmlhbCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMudmVydGV4U2hhZGVyID0gdGhpcy5fZ2V0R0xTTFZlcnRleENvZGUoIHNoYWRlcnNEYXRhLnZlcnRleCApO1xyXG5cdFx0XHR0aGlzLmZyYWdtZW50U2hhZGVyID0gdGhpcy5fZ2V0R0xTTEZyYWdtZW50Q29kZSggc2hhZGVyc0RhdGEuZnJhZ21lbnQgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGhpcy5jb21wdXRlU2hhZGVyID0gdGhpcy5fZ2V0R0xTTFZlcnRleENvZGUoIHNoYWRlcnNEYXRhLmNvbXB1dGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgaXMgb25lIG9mIHRoZSBtb3JlIGltcG9ydGFudCBvbmVzIHNpbmNlIGl0J3MgcmVzcG9uc2libGVcclxuXHQgKiBmb3IgZ2VuZXJhdGluZyBhIG1hdGNoaW5nIGJpbmRpbmcgaW5zdGFuY2UgZm9yIHRoZSBnaXZlbiB1bmlmb3JtIG5vZGUuXHJcblx0ICpcclxuXHQgKiBUaGVzZSBiaW5kaW5ncyBhcmUgbGF0ZXIgdXNlZCBpbiB0aGUgcmVuZGVyZXIgdG8gY3JlYXRlIGJpbmQgZ3JvdXBzXHJcblx0ICogYW5kIGxheW91dHMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1VuaWZvcm1Ob2RlfSBub2RlIC0gVGhlIHVuaWZvcm0gbm9kZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSBub2RlIGRhdGEgdHlwZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc2hhZGVyU3RhZ2UgLSBUaGUgc2hhZGVyIHN0YWdlLlxyXG5cdCAqIEBwYXJhbSB7P3N0cmluZ30gW25hbWU9bnVsbF0gLSBBbiBvcHRpb25hbCB1bmlmb3JtIG5hbWUuXHJcblx0ICogQHJldHVybiB7Tm9kZVVuaWZvcm19IFRoZSBub2RlIHVuaWZvcm0gb2JqZWN0LlxyXG5cdCAqL1xyXG5cdGdldFVuaWZvcm1Gcm9tTm9kZSggbm9kZSwgdHlwZSwgc2hhZGVyU3RhZ2UsIG5hbWUgPSBudWxsICkge1xyXG5cclxuXHRcdGNvbnN0IHVuaWZvcm1Ob2RlID0gc3VwZXIuZ2V0VW5pZm9ybUZyb21Ob2RlKCBub2RlLCB0eXBlLCBzaGFkZXJTdGFnZSwgbmFtZSApO1xyXG5cdFx0Y29uc3Qgbm9kZURhdGEgPSB0aGlzLmdldERhdGFGcm9tTm9kZSggbm9kZSwgc2hhZGVyU3RhZ2UsIHRoaXMuZ2xvYmFsQ2FjaGUgKTtcclxuXHJcblx0XHRsZXQgdW5pZm9ybUdQVSA9IG5vZGVEYXRhLnVuaWZvcm1HUFU7XHJcblxyXG5cdFx0aWYgKCB1bmlmb3JtR1BVID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBncm91cCA9IG5vZGUuZ3JvdXBOb2RlO1xyXG5cdFx0XHRjb25zdCBncm91cE5hbWUgPSBncm91cC5uYW1lO1xyXG5cclxuXHRcdFx0Y29uc3QgYmluZGluZ3MgPSB0aGlzLmdldEJpbmRHcm91cEFycmF5KCBncm91cE5hbWUsIHNoYWRlclN0YWdlICk7XHJcblxyXG5cdFx0XHRpZiAoIHR5cGUgPT09ICd0ZXh0dXJlJyApIHtcclxuXHJcblx0XHRcdFx0dW5pZm9ybUdQVSA9IG5ldyBOb2RlU2FtcGxlZFRleHR1cmUoIHVuaWZvcm1Ob2RlLm5hbWUsIHVuaWZvcm1Ob2RlLm5vZGUsIGdyb3VwICk7XHJcblx0XHRcdFx0YmluZGluZ3MucHVzaCggdW5pZm9ybUdQVSApO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggdHlwZSA9PT0gJ2N1YmVUZXh0dXJlJyApIHtcclxuXHJcblx0XHRcdFx0dW5pZm9ybUdQVSA9IG5ldyBOb2RlU2FtcGxlZEN1YmVUZXh0dXJlKCB1bmlmb3JtTm9kZS5uYW1lLCB1bmlmb3JtTm9kZS5ub2RlLCBncm91cCApO1xyXG5cdFx0XHRcdGJpbmRpbmdzLnB1c2goIHVuaWZvcm1HUFUgKTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIHR5cGUgPT09ICd0ZXh0dXJlM0QnICkge1xyXG5cclxuXHRcdFx0XHR1bmlmb3JtR1BVID0gbmV3IE5vZGVTYW1wbGVkVGV4dHVyZTNEKCB1bmlmb3JtTm9kZS5uYW1lLCB1bmlmb3JtTm9kZS5ub2RlLCBncm91cCApO1xyXG5cdFx0XHRcdGJpbmRpbmdzLnB1c2goIHVuaWZvcm1HUFUgKTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIHR5cGUgPT09ICdidWZmZXInICkge1xyXG5cclxuXHRcdFx0XHRub2RlLm5hbWUgPSBgTm9kZUJ1ZmZlcl8keyBub2RlLmlkIH1gO1xyXG5cdFx0XHRcdHVuaWZvcm1Ob2RlLm5hbWUgPSBgYnVmZmVyJHsgbm9kZS5pZCB9YDtcclxuXHJcblx0XHRcdFx0Y29uc3QgYnVmZmVyID0gbmV3IE5vZGVVbmlmb3JtQnVmZmVyKCBub2RlLCBncm91cCApO1xyXG5cdFx0XHRcdGJ1ZmZlci5uYW1lID0gbm9kZS5uYW1lO1xyXG5cclxuXHRcdFx0XHRiaW5kaW5ncy5wdXNoKCBidWZmZXIgKTtcclxuXHJcblx0XHRcdFx0dW5pZm9ybUdQVSA9IGJ1ZmZlcjtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHVuaWZvcm1zU3RhZ2UgPSB0aGlzLnVuaWZvcm1Hcm91cHNbIHNoYWRlclN0YWdlIF0gfHwgKCB0aGlzLnVuaWZvcm1Hcm91cHNbIHNoYWRlclN0YWdlIF0gPSB7fSApO1xyXG5cclxuXHRcdFx0XHRsZXQgdW5pZm9ybXNHcm91cCA9IHVuaWZvcm1zU3RhZ2VbIGdyb3VwTmFtZSBdO1xyXG5cclxuXHRcdFx0XHRpZiAoIHVuaWZvcm1zR3JvdXAgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHR1bmlmb3Jtc0dyb3VwID0gbmV3IE5vZGVVbmlmb3Jtc0dyb3VwKCBzaGFkZXJTdGFnZSArICdfJyArIGdyb3VwTmFtZSwgZ3JvdXAgKTtcclxuXHRcdFx0XHRcdC8vdW5pZm9ybXNHcm91cC5zZXRWaXNpYmlsaXR5KCBncHVTaGFkZXJTdGFnZUxpYlsgc2hhZGVyU3RhZ2UgXSApO1xyXG5cclxuXHRcdFx0XHRcdHVuaWZvcm1zU3RhZ2VbIGdyb3VwTmFtZSBdID0gdW5pZm9ybXNHcm91cDtcclxuXHJcblx0XHRcdFx0XHRiaW5kaW5ncy5wdXNoKCB1bmlmb3Jtc0dyb3VwICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0dW5pZm9ybUdQVSA9IHRoaXMuZ2V0Tm9kZVVuaWZvcm0oIHVuaWZvcm1Ob2RlLCB0eXBlICk7XHJcblxyXG5cdFx0XHRcdHVuaWZvcm1zR3JvdXAuYWRkVW5pZm9ybSggdW5pZm9ybUdQVSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0bm9kZURhdGEudW5pZm9ybUdQVSA9IHVuaWZvcm1HUFU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB1bmlmb3JtTm9kZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgR0xTTE5vZGVCdWlsZGVyO1xyXG4iLCJsZXQgX3ZlY3RvcjIgPSBudWxsO1xyXG5sZXQgX2NvbG9yNCA9IG51bGw7XHJcblxyXG5pbXBvcnQgQ29sb3I0IGZyb20gJy4vQ29sb3I0LmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMi5qcyc7XHJcbmltcG9ydCB7IGNyZWF0ZUNhbnZhc0VsZW1lbnQsIHdhcm5PbmNlIH0gZnJvbSAnLi4vLi4vdXRpbHMuanMnO1xyXG5pbXBvcnQgeyBSRVZJU0lPTiB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcblxyXG4vKipcclxuICogTW9zdCBvZiB0aGUgcmVuZGVyaW5nIHJlbGF0ZWQgbG9naWMgaXMgaW1wbGVtZW50ZWQgaW4gdGhlXHJcbiAqIHtAbGluayBSZW5kZXJlcn0gbW9kdWxlIGFuZCByZWxhdGVkIG1hbmFnZW1lbnQgY29tcG9uZW50cy5cclxuICogU29tZXRpbWVzIGl0IGlzIHJlcXVpcmVkIHRob3VnaCB0byBleGVjdXRlIGNvbW1hbmRzIHdoaWNoIGFyZVxyXG4gKiBzcGVjaWZpYyB0byB0aGUgY3VycmVudCAzRCBiYWNrZW5kICh3aGljaCBpcyBXZWJHUFUgb3IgV2ViR0wgMikuXHJcbiAqIFRoaXMgYWJzdHJhY3QgYmFzZSBjbGFzcyBkZWZpbmVzIGFuIGludGVyZmFjZSB0aGF0IGVuY2Fwc3VsYXRlc1xyXG4gKiBhbGwgYmFja2VuZC1yZWxhdGVkIGxvZ2ljLiBEZXJpdmVkIGNsYXNzZXMgZm9yIGVhY2ggYmFja2VuZCBtdXN0XHJcbiAqIGltcGxlbWVudCB0aGUgaW50ZXJmYWNlLlxyXG4gKlxyXG4gKiBAYWJzdHJhY3RcclxuICogQHByaXZhdGVcclxuICovXHJcbmNsYXNzIEJhY2tlbmQge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGJhY2tlbmQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1ldGVycyAtIEFuIG9iamVjdCBob2xkaW5nIHBhcmFtZXRlcnMgZm9yIHRoZSBiYWNrZW5kLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwYXJhbWV0ZXJzID0ge30gKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcGFyYW1ldGVycyBvZiB0aGUgYmFja2VuZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBhcmFtZXRlcnMgPSBPYmplY3QuYXNzaWduKCB7fSwgcGFyYW1ldGVycyApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyB3ZWFrIG1hcCBob2xkcyBiYWNrZW5kLXNwZWNpZmljIGRhdGEgb2Ygb2JqZWN0c1xyXG5cdFx0ICogbGlrZSB0ZXh0dXJlcywgYXR0cmlidXRlcyBvciByZW5kZXIgdGFyZ2V0cy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2Vha01hcH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kYXRhID0gbmV3IFdlYWtNYXAoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIHRoZSByZW5kZXJlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1JlbmRlcmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJlbmRlcmVyID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIHRoZSBjYW52YXMgZWxlbWVudCB0aGUgcmVuZGVyZXIgaXMgZHJhd2luZyB0by5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7PyhIVE1MQ2FudmFzRWxlbWVudHxPZmZzY3JlZW5DYW52YXMpfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRvbUVsZW1lbnQgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIHRpbWVzdGFtcCBxdWVyeSBwb29sLlxyXG4gICBcdFx0ICpcclxuICAgXHRcdCAqIEB0eXBlIHt7cmVuZGVyOiA/VGltZXN0YW1wUXVlcnlQb29sLCBjb21wdXRlOiA/VGltZXN0YW1wUXVlcnlQb29sfX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50aW1lc3RhbXBRdWVyeVBvb2wgPSB7XHJcblx0XHRcdCdyZW5kZXInOiBudWxsLFxyXG5cdFx0XHQnY29tcHV0ZSc6IG51bGxcclxuXHRcdH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRvIHRyYWNrIHRpbWVzdGFtcHMgd2l0aCBhIFRpbWVzdGFtcCBRdWVyeSBBUEkgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50cmFja1RpbWVzdGFtcCA9ICggcGFyYW1ldGVycy50cmFja1RpbWVzdGFtcCA9PT0gdHJ1ZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEluaXRpYWxpemVzIHRoZSBiYWNrZW5kIHNvIGl0IGlzIHJlYWR5IGZvciB1c2FnZS4gQ29uY3JldGUgYmFja2VuZHNcclxuXHQgKiBhcmUgc3VwcG9zZWQgdG8gaW1wbGVtZW50IHRoZWlyIHJlbmRlcmluZyBjb250ZXh0IGNyZWF0aW9uIGFuZCByZWxhdGVkXHJcblx0ICogb3BlcmF0aW9ucyBpbiB0aGlzIG1ldGhvZC5cclxuXHQgKlxyXG5cdCAqIEBhc3luY1xyXG5cdCAqIEBwYXJhbSB7UmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEByZXR1cm4ge1Byb21pc2V9IEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGJhY2tlbmQgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuXHJcblx0ICovXHJcblx0YXN5bmMgaW5pdCggcmVuZGVyZXIgKSB7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBjb29yZGluYXRlIHN5c3RlbSBvZiB0aGUgYmFja2VuZC5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0ICogQHJlYWRvbmx5XHJcblx0ICovXHJcblx0Z2V0IGNvb3JkaW5hdGVTeXN0ZW0oKSB7fVxyXG5cclxuXHQvLyByZW5kZXIgY29udGV4dFxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyBleGVjdXRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgcmVuZGVyIGNhbGwgYW5kXHJcblx0ICogY2FuIGJlIHVzZWQgYnkgdGhlIGJhY2tlbmQgdG8gcHJlcGFyZSB0aGUgc3RhdGUgZm9yIHVwY29taW5nXHJcblx0ICogZHJhdyBjYWxscy5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyQ29udGV4dH0gcmVuZGVyQ29udGV4dCAtIFRoZSByZW5kZXIgY29udGV4dC5cclxuXHQgKi9cclxuXHRiZWdpblJlbmRlciggLypyZW5kZXJDb250ZXh0Ki8gKSB7fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyBleGVjdXRlZCBhdCB0aGUgZW5kIG9mIGEgcmVuZGVyIGNhbGwgYW5kXHJcblx0ICogY2FuIGJlIHVzZWQgYnkgdGhlIGJhY2tlbmQgdG8gZmluYWxpemUgd29yayBhZnRlciBkcmF3XHJcblx0ICogY2FsbHMuXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcGFyYW0ge1JlbmRlckNvbnRleHR9IHJlbmRlckNvbnRleHQgLSBUaGUgcmVuZGVyIGNvbnRleHQuXHJcblx0ICovXHJcblx0ZmluaXNoUmVuZGVyKCAvKnJlbmRlckNvbnRleHQqLyApIHt9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGlzIGV4ZWN1dGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBjb21wdXRlIGNhbGwgYW5kXHJcblx0ICogY2FuIGJlIHVzZWQgYnkgdGhlIGJhY2tlbmQgdG8gcHJlcGFyZSB0aGUgc3RhdGUgZm9yIHVwY29taW5nXHJcblx0ICogY29tcHV0ZSB0YXNrcy5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7Tm9kZXxBcnJheTxOb2RlPn0gY29tcHV0ZUdyb3VwIC0gVGhlIGNvbXB1dGUgbm9kZShzKS5cclxuXHQgKi9cclxuXHRiZWdpbkNvbXB1dGUoIC8qY29tcHV0ZUdyb3VwKi8gKSB7fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyBleGVjdXRlZCBhdCB0aGUgZW5kIG9mIGEgY29tcHV0ZSBjYWxsIGFuZFxyXG5cdCAqIGNhbiBiZSB1c2VkIGJ5IHRoZSBiYWNrZW5kIHRvIGZpbmFsaXplIHdvcmsgYWZ0ZXIgY29tcHV0ZVxyXG5cdCAqIHRhc2tzLlxyXG5cdCAqXHJcblx0ICogQGFic3RyYWN0XHJcblx0ICogQHBhcmFtIHtOb2RlfEFycmF5PE5vZGU+fSBjb21wdXRlR3JvdXAgLSBUaGUgY29tcHV0ZSBub2RlKHMpLlxyXG5cdCAqL1xyXG5cdGZpbmlzaENvbXB1dGUoIC8qY29tcHV0ZUdyb3VwKi8gKSB7fVxyXG5cclxuXHQvLyByZW5kZXIgb2JqZWN0XHJcblxyXG5cdC8qKlxyXG5cdCAqIEV4ZWN1dGVzIGEgZHJhdyBjb21tYW5kIGZvciB0aGUgZ2l2ZW4gcmVuZGVyIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyT2JqZWN0fSByZW5kZXJPYmplY3QgLSBUaGUgcmVuZGVyIG9iamVjdCB0byBkcmF3LlxyXG5cdCAqIEBwYXJhbSB7SW5mb30gaW5mbyAtIEhvbGRzIGEgc2VyaWVzIG9mIHN0YXRpc3RpY2FsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBHUFUgbWVtb3J5IGFuZCB0aGUgcmVuZGVyaW5nIHByb2Nlc3MuXHJcblx0ICovXHJcblx0ZHJhdyggLypyZW5kZXJPYmplY3QsIGluZm8qLyApIHsgfVxyXG5cclxuXHQvLyBjb21wdXRlIG5vZGVcclxuXHJcblx0LyoqXHJcblx0ICogRXhlY3V0ZXMgYSBjb21wdXRlIGNvbW1hbmQgZm9yIHRoZSBnaXZlbiBjb21wdXRlIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcGFyYW0ge05vZGV8QXJyYXk8Tm9kZT59IGNvbXB1dGVHcm91cCAtIFRoZSBncm91cCBvZiBjb21wdXRlIG5vZGVzIG9mIGEgY29tcHV0ZSBjYWxsLiBDYW4gYmUgYSBzaW5nbGUgY29tcHV0ZSBub2RlLlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gY29tcHV0ZU5vZGUgLSBUaGUgY29tcHV0ZSBub2RlLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8QmluZEdyb3VwPn0gYmluZGluZ3MgLSBUaGUgYmluZGluZ3MuXHJcblx0ICogQHBhcmFtIHtDb21wdXRlUGlwZWxpbmV9IGNvbXB1dGVQaXBlbGluZSAtIFRoZSBjb21wdXRlIHBpcGVsaW5lLlxyXG5cdCAqL1xyXG5cdGNvbXB1dGUoIC8qY29tcHV0ZUdyb3VwLCBjb21wdXRlTm9kZSwgY29tcHV0ZUJpbmRpbmdzLCBjb21wdXRlUGlwZWxpbmUqLyApIHsgfVxyXG5cclxuXHQvLyBwcm9ncmFtXHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgYSBzaGFkZXIgcHJvZ3JhbSBmcm9tIHRoZSBnaXZlbiBwcm9ncmFtbWFibGUgc3RhZ2UuXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcGFyYW0ge1Byb2dyYW1tYWJsZVN0YWdlfSBwcm9ncmFtIC0gVGhlIHByb2dyYW1tYWJsZSBzdGFnZS5cclxuXHQgKi9cclxuXHRjcmVhdGVQcm9ncmFtKCAvKnByb2dyYW0qLyApIHsgfVxyXG5cclxuXHQvKipcclxuXHQgKiBEZXN0cm95cyB0aGUgc2hhZGVyIHByb2dyYW0gb2YgdGhlIGdpdmVuIHByb2dyYW1tYWJsZSBzdGFnZS5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7UHJvZ3JhbW1hYmxlU3RhZ2V9IHByb2dyYW0gLSBUaGUgcHJvZ3JhbW1hYmxlIHN0YWdlLlxyXG5cdCAqL1xyXG5cdGRlc3Ryb3lQcm9ncmFtKCAvKnByb2dyYW0qLyApIHsgfVxyXG5cclxuXHQvLyBiaW5kaW5nc1xyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGJpbmRpbmdzIGZyb20gdGhlIGdpdmVuIGJpbmQgZ3JvdXAgZGVmaW5pdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7QmluZEdyb3VwfSBiaW5kR3JvdXAgLSBUaGUgYmluZCBncm91cC5cclxuXHQgKiBAcGFyYW0ge0FycmF5PEJpbmRHcm91cD59IGJpbmRpbmdzIC0gQXJyYXkgb2YgYmluZCBncm91cHMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGNhY2hlSW5kZXggLSBUaGUgY2FjaGUgaW5kZXguXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHZlcnNpb24gLSBUaGUgdmVyc2lvbi5cclxuXHQgKi9cclxuXHRjcmVhdGVCaW5kaW5ncyggLypiaW5kR3JvdXAsIGJpbmRpbmdzLCBjYWNoZUluZGV4LCB2ZXJzaW9uKi8gKSB7IH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgZ2l2ZW4gYmluZCBncm91cCBkZWZpbml0aW9uLlxyXG5cdCAqXHJcblx0ICogQGFic3RyYWN0XHJcblx0ICogQHBhcmFtIHtCaW5kR3JvdXB9IGJpbmRHcm91cCAtIFRoZSBiaW5kIGdyb3VwLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8QmluZEdyb3VwPn0gYmluZGluZ3MgLSBBcnJheSBvZiBiaW5kIGdyb3Vwcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gY2FjaGVJbmRleCAtIFRoZSBjYWNoZSBpbmRleC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdmVyc2lvbiAtIFRoZSB2ZXJzaW9uLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZUJpbmRpbmdzKCAvKmJpbmRHcm91cCwgYmluZGluZ3MsIGNhY2hlSW5kZXgsIHZlcnNpb24qLyApIHsgfVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIGEgYnVmZmVyIGJpbmRpbmcuXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcGFyYW0ge0J1ZmZlcn0gYmluZGluZyAtIFRoZSBidWZmZXIgYmluZGluZyB0byB1cGRhdGUuXHJcblx0ICovXHJcblx0dXBkYXRlQmluZGluZyggLypiaW5kaW5nKi8gKSB7IH1cclxuXHJcblx0Ly8gcGlwZWxpbmVcclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyBhIHJlbmRlciBwaXBlbGluZSBmb3IgdGhlIGdpdmVuIHJlbmRlciBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcGFyYW0ge1JlbmRlck9iamVjdH0gcmVuZGVyT2JqZWN0IC0gVGhlIHJlbmRlciBvYmplY3QuXHJcblx0ICogQHBhcmFtIHtBcnJheTxQcm9taXNlPn0gcHJvbWlzZXMgLSBBbiBhcnJheSBvZiBjb21waWxhdGlvbiBwcm9taXNlcyB3aGljaCBhcmUgdXNlZCBpbiBgY29tcGlsZUFzeW5jKClgLlxyXG5cdCAqL1xyXG5cdGNyZWF0ZVJlbmRlclBpcGVsaW5lKCAvKnJlbmRlck9iamVjdCwgcHJvbWlzZXMqLyApIHsgfVxyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGEgY29tcHV0ZSBwaXBlbGluZSBmb3IgdGhlIGdpdmVuIGNvbXB1dGUgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7Q29tcHV0ZVBpcGVsaW5lfSBjb21wdXRlUGlwZWxpbmUgLSBUaGUgY29tcHV0ZSBwaXBlbGluZS5cclxuXHQgKiBAcGFyYW0ge0FycmF5PEJpbmRHcm91cD59IGJpbmRpbmdzIC0gVGhlIGJpbmRpbmdzLlxyXG5cdCAqL1xyXG5cdGNyZWF0ZUNvbXB1dGVQaXBlbGluZSggLypjb21wdXRlUGlwZWxpbmUsIGJpbmRpbmdzKi8gKSB7IH1cclxuXHJcblx0Ly8gY2FjaGUga2V5XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSByZW5kZXIgcGlwZWxpbmUgcmVxdWlyZXMgYW4gdXBkYXRlLlxyXG5cdCAqXHJcblx0ICogQGFic3RyYWN0XHJcblx0ICogQHBhcmFtIHtSZW5kZXJPYmplY3R9IHJlbmRlck9iamVjdCAtIFRoZSByZW5kZXIgb2JqZWN0LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHJlbmRlciBwaXBlbGluZSByZXF1aXJlcyBhbiB1cGRhdGUgb3Igbm90LlxyXG5cdCAqL1xyXG5cdG5lZWRzUmVuZGVyVXBkYXRlKCAvKnJlbmRlck9iamVjdCovICkgeyB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBjYWNoZSBrZXkgdGhhdCBpcyB1c2VkIHRvIGlkZW50aWZ5IHJlbmRlciBwaXBlbGluZXMuXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcGFyYW0ge1JlbmRlck9iamVjdH0gcmVuZGVyT2JqZWN0IC0gVGhlIHJlbmRlciBvYmplY3QuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgY2FjaGUga2V5LlxyXG5cdCAqL1xyXG5cdGdldFJlbmRlckNhY2hlS2V5KCAvKnJlbmRlck9iamVjdCovICkgeyB9XHJcblxyXG5cdC8vIG5vZGUgYnVpbGRlclxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbm9kZSBidWlsZGVyIGZvciB0aGUgZ2l2ZW4gcmVuZGVyIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyT2JqZWN0fSByZW5kZXJPYmplY3QgLSBUaGUgcmVuZGVyIG9iamVjdC5cclxuXHQgKiBAcGFyYW0ge1JlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcmV0dXJuIHtOb2RlQnVpbGRlcn0gVGhlIG5vZGUgYnVpbGRlci5cclxuXHQgKi9cclxuXHRjcmVhdGVOb2RlQnVpbGRlciggLypyZW5kZXJPYmplY3QsIHJlbmRlcmVyKi8gKSB7IH1cclxuXHJcblx0Ly8gdGV4dHVyZXNcclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyBhIEdQVSBzYW1wbGVyIGZvciB0aGUgZ2l2ZW4gdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlIHRvIGNyZWF0ZSB0aGUgc2FtcGxlciBmb3IuXHJcblx0ICovXHJcblx0Y3JlYXRlU2FtcGxlciggLyp0ZXh0dXJlKi8gKSB7IH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVzdHJveXMgdGhlIEdQVSBzYW1wbGVyIGZvciB0aGUgZ2l2ZW4gdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlIHRvIGRlc3Ryb3kgdGhlIHNhbXBsZXIgZm9yLlxyXG5cdCAqL1xyXG5cdGRlc3Ryb3lTYW1wbGVyKCAvKnRleHR1cmUqLyApIHt9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgYSBkZWZhdWx0IHRleHR1cmUgZm9yIHRoZSBnaXZlbiB0ZXh0dXJlIHRoYXQgY2FuIGJlIHVzZWRcclxuXHQgKiBhcyBhIHBsYWNlaG9sZGVyIHVudGlsIHRoZSBhY3R1YWwgdGV4dHVyZSBpcyByZWFkeSBmb3IgdXNhZ2UuXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZSB0byBjcmVhdGUgYSBkZWZhdWx0IHRleHR1cmUgZm9yLlxyXG5cdCAqL1xyXG5cdGNyZWF0ZURlZmF1bHRUZXh0dXJlKCAvKnRleHR1cmUqLyApIHsgfVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWZpbmVzIGEgdGV4dHVyZSBvbiB0aGUgR1BVIGZvciB0aGUgZ2l2ZW4gdGV4dHVyZSBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIuXHJcblx0ICovXHJcblx0Y3JlYXRlVGV4dHVyZSggLyp0ZXh0dXJlLCBvcHRpb25zPXt9Ki8gKSB7IH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBsb2FkcyB0aGUgdXBkYXRlZCB0ZXh0dXJlIGRhdGEgdG8gdGhlIEdQVS5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlLlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIHBhcmFtZXRlci5cclxuXHQgKi9cclxuXHR1cGRhdGVUZXh0dXJlKCAvKnRleHR1cmUsIG9wdGlvbnMgPSB7fSovICkgeyB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyBtaXBtYXBzIGZvciB0aGUgZ2l2ZW4gdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlLlxyXG5cdCAqL1xyXG5cdGdlbmVyYXRlTWlwbWFwcyggLyp0ZXh0dXJlKi8gKSB7IH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVzdHJveXMgdGhlIEdQVSBkYXRhIGZvciB0aGUgZ2l2ZW4gdGV4dHVyZSBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZS5cclxuXHQgKi9cclxuXHRkZXN0cm95VGV4dHVyZSggLyp0ZXh0dXJlKi8gKSB7IH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0ZXh0dXJlIGRhdGEgYXMgYSB0eXBlZCBhcnJheS5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBhc3luY1xyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlIHRvIGNvcHkuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBjb3B5IG9yaWdpbi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGNvcHkgb3JpZ2luLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgY29weS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgY29weS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZmFjZUluZGV4IC0gVGhlIGZhY2UgaW5kZXguXHJcblx0ICogQHJldHVybiB7UHJvbWlzZTxUeXBlZEFycmF5Pn0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCBhIHR5cGVkIGFycmF5IHdoZW4gdGhlIGNvcHkgb3BlcmF0aW9uIGhhcyBmaW5pc2hlZC5cclxuXHQgKi9cclxuXHRhc3luYyBjb3B5VGV4dHVyZVRvQnVmZmVyKCAvKnRleHR1cmUsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGZhY2VJbmRleCovICkge31cclxuXHJcblx0LyoqXHJcblx0ICogQ29waWVzIGRhdGEgb2YgdGhlIGdpdmVuIHNvdXJjZSB0ZXh0dXJlIHRvIHRoZSBnaXZlbiBkZXN0aW5hdGlvbiB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQGFic3RyYWN0XHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSBzcmNUZXh0dXJlIC0gVGhlIHNvdXJjZSB0ZXh0dXJlLlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gZHN0VGV4dHVyZSAtIFRoZSBkZXN0aW5hdGlvbiB0ZXh0dXJlLlxyXG5cdCAqIEBwYXJhbSB7PyhCb3gzfEJveDIpfSBbc3JjUmVnaW9uPW51bGxdIC0gVGhlIHJlZ2lvbiBvZiB0aGUgc291cmNlIHRleHR1cmUgdG8gY29weS5cclxuXHQgKiBAcGFyYW0gez8oVmVjdG9yMnxWZWN0b3IzKX0gW2RzdFBvc2l0aW9uPW51bGxdIC0gVGhlIGRlc3RpbmF0aW9uIHBvc2l0aW9uIG9mIHRoZSBjb3B5LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbc3JjTGV2ZWw9MF0gLSBUaGUgc291cmNlIG1pcCBsZXZlbCB0byBjb3B5IGZyb20uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtkc3RMZXZlbD0wXSAtIFRoZSBkZXN0aW5hdGlvbiBtaXAgbGV2ZWwgdG8gY29weSB0by5cclxuXHQgKi9cclxuXHRjb3B5VGV4dHVyZVRvVGV4dHVyZSggLypzcmNUZXh0dXJlLCBkc3RUZXh0dXJlLCBzcmNSZWdpb24gPSBudWxsLCBkc3RQb3NpdGlvbiA9IG51bGwsIHNyY0xldmVsID0gMCwgZHN0TGV2ZWwgPSAwKi8gKSB7fVxyXG5cclxuXHQvKipcclxuXHQqIENvcGllcyB0aGUgY3VycmVudCBib3VuZCBmcmFtZWJ1ZmZlciB0byB0aGUgZ2l2ZW4gdGV4dHVyZS5cclxuXHQqXHJcblx0KiBAYWJzdHJhY3RcclxuXHQqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSBkZXN0aW5hdGlvbiB0ZXh0dXJlLlxyXG5cdCogQHBhcmFtIHtSZW5kZXJDb250ZXh0fSByZW5kZXJDb250ZXh0IC0gVGhlIHJlbmRlciBjb250ZXh0LlxyXG5cdCogQHBhcmFtIHtWZWN0b3I0fSByZWN0YW5nbGUgLSBBIGZvdXIgZGltZW5zaW9uYWwgdmVjdG9yIGRlZmluaW5nIHRoZSBvcmlnaW4gYW5kIGRpbWVuc2lvbiBvZiB0aGUgY29weS5cclxuXHQqL1xyXG5cdGNvcHlGcmFtZWJ1ZmZlclRvVGV4dHVyZSggLyp0ZXh0dXJlLCByZW5kZXJDb250ZXh0LCByZWN0YW5nbGUqLyApIHt9XHJcblxyXG5cdC8vIGF0dHJpYnV0ZXNcclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyB0aGUgR1BVIGJ1ZmZlciBvZiBhIHNoYWRlciBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcGFyYW0ge0J1ZmZlckF0dHJpYnV0ZX0gYXR0cmlidXRlIC0gVGhlIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICovXHJcblx0Y3JlYXRlQXR0cmlidXRlKCAvKmF0dHJpYnV0ZSovICkgeyB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgdGhlIEdQVSBidWZmZXIgb2YgYW4gaW5kZXhlZCBzaGFkZXIgYXR0cmlidXRlLlxyXG5cdCAqXHJcblx0ICogQGFic3RyYWN0XHJcblx0ICogQHBhcmFtIHtCdWZmZXJBdHRyaWJ1dGV9IGF0dHJpYnV0ZSAtIFRoZSBpbmRleGVkIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICovXHJcblx0Y3JlYXRlSW5kZXhBdHRyaWJ1dGUoIC8qYXR0cmlidXRlKi8gKSB7IH1cclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyB0aGUgR1BVIGJ1ZmZlciBvZiBhIHN0b3JhZ2UgYXR0cmlidXRlLlxyXG5cdCAqXHJcblx0ICogQGFic3RyYWN0XHJcblx0ICogQHBhcmFtIHtCdWZmZXJBdHRyaWJ1dGV9IGF0dHJpYnV0ZSAtIFRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqL1xyXG5cdGNyZWF0ZVN0b3JhZ2VBdHRyaWJ1dGUoIC8qYXR0cmlidXRlKi8gKSB7IH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgR1BVIGJ1ZmZlciBvZiBhIHNoYWRlciBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcGFyYW0ge0J1ZmZlckF0dHJpYnV0ZX0gYXR0cmlidXRlIC0gVGhlIGJ1ZmZlciBhdHRyaWJ1dGUgdG8gdXBkYXRlLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZUF0dHJpYnV0ZSggLyphdHRyaWJ1dGUqLyApIHsgfVxyXG5cclxuXHQvKipcclxuXHQgKiBEZXN0cm95cyB0aGUgR1BVIGJ1ZmZlciBvZiBhIHNoYWRlciBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcGFyYW0ge0J1ZmZlckF0dHJpYnV0ZX0gYXR0cmlidXRlIC0gVGhlIGJ1ZmZlciBhdHRyaWJ1dGUgdG8gZGVzdHJveS5cclxuXHQgKi9cclxuXHRkZXN0cm95QXR0cmlidXRlKCAvKmF0dHJpYnV0ZSovICkgeyB9XHJcblxyXG5cdC8vIGNhbnZhc1xyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBiYWNrZW5kJ3MgcmVuZGVyaW5nIGNvbnRleHQuXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSByZW5kZXJpbmcgY29udGV4dC5cclxuXHQgKi9cclxuXHRnZXRDb250ZXh0KCkgeyB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEJhY2tlbmRzIGNhbiB1c2UgdGhpcyBtZXRob2QgaWYgdGhleSBoYXZlIHRvIHJ1blxyXG5cdCAqIGxvZ2ljIHdoZW4gdGhlIHJlbmRlcmVyIGdldHMgcmVzaXplZC5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqL1xyXG5cdHVwZGF0ZVNpemUoKSB7IH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgdmlld3BvcnQgd2l0aCB0aGUgdmFsdWVzIGZyb20gdGhlIGdpdmVuIHJlbmRlciBjb250ZXh0LlxyXG5cdCAqXHJcblx0ICogQGFic3RyYWN0XHJcblx0ICogQHBhcmFtIHtSZW5kZXJDb250ZXh0fSByZW5kZXJDb250ZXh0IC0gVGhlIHJlbmRlciBjb250ZXh0LlxyXG5cdCAqL1xyXG5cdHVwZGF0ZVZpZXdwb3J0KCAvKnJlbmRlckNvbnRleHQqLyApIHt9XHJcblxyXG5cdC8vIHV0aWxzXHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBnaXZlbiAzRCBvYmplY3QgaXMgZnVsbHkgb2NjbHVkZWQgYnkgb3RoZXJcclxuXHQgKiAzRCBvYmplY3RzIGluIHRoZSBzY2VuZS4gQmFja2VuZHMgbXVzdCBpbXBsZW1lbnQgdGhpcyBtZXRob2QgYnkgdXNpbmdcclxuXHQgKiBhIE9jY2x1c2lvbiBRdWVyeSBBUEkuXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcGFyYW0ge1JlbmRlckNvbnRleHR9IHJlbmRlckNvbnRleHQgLSBUaGUgcmVuZGVyIGNvbnRleHQuXHJcblx0ICogQHBhcmFtIHtPYmplY3QzRH0gb2JqZWN0IC0gVGhlIDNEIG9iamVjdCB0byB0ZXN0LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIDNEIG9iamVjdCBpcyBmdWxseSBvY2NsdWRlZCBvciBub3QuXHJcblx0ICovXHJcblx0aXNPY2NsdWRlZCggLypyZW5kZXJDb250ZXh0LCBvYmplY3QqLyApIHt9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlc29sdmVzIHRoZSB0aW1lIHN0YW1wIGZvciB0aGUgZ2l2ZW4gcmVuZGVyIGNvbnRleHQgYW5kIHR5cGUuXHJcblx0ICpcclxuXHQgKiBAYXN5bmNcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW3R5cGU9J3JlbmRlciddIC0gVGhlIHR5cGUgb2YgdGhlIHRpbWUgc3RhbXAuXHJcblx0ICogQHJldHVybiB7UHJvbWlzZTxudW1iZXI+fSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSB0aW1lIHN0YW1wLlxyXG5cdCAqL1xyXG5cdGFzeW5jIHJlc29sdmVUaW1lc3RhbXBzQXN5bmMoIHR5cGUgPSAncmVuZGVyJyApIHtcclxuXHJcblx0XHRpZiAoICEgdGhpcy50cmFja1RpbWVzdGFtcCApIHtcclxuXHJcblx0XHRcdHdhcm5PbmNlKCAnV2ViR1BVUmVuZGVyZXI6IFRpbWVzdGFtcCB0cmFja2luZyBpcyBkaXNhYmxlZC4nICk7XHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgcXVlcnlQb29sID0gdGhpcy50aW1lc3RhbXBRdWVyeVBvb2xbIHR5cGUgXTtcclxuXHRcdGlmICggISBxdWVyeVBvb2wgKSB7XHJcblxyXG5cdFx0XHR3YXJuT25jZSggYFdlYkdQVVJlbmRlcmVyOiBObyB0aW1lc3RhbXAgcXVlcnkgcG9vbCBmb3IgdHlwZSAnJHt0eXBlfScgZm91bmQuYCApO1xyXG5cdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGR1cmF0aW9uID0gYXdhaXQgcXVlcnlQb29sLnJlc29sdmVRdWVyaWVzQXN5bmMoKTtcclxuXHJcblx0XHR0aGlzLnJlbmRlcmVyLmluZm9bIHR5cGUgXS50aW1lc3RhbXAgPSBkdXJhdGlvbjtcclxuXHJcblx0XHRyZXR1cm4gZHVyYXRpb247XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2FuIGJlIHVzZWQgdG8gc3luY2hyb25pemUgQ1BVIG9wZXJhdGlvbnMgd2l0aCBHUFUgdGFza3MuIFNvIHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLFxyXG5cdCAqIHRoZSBDUFUgd2FpdHMgZm9yIHRoZSBHUFUgdG8gY29tcGxldGUgaXRzIG9wZXJhdGlvbiAoZS5nLiBhIGNvbXB1dGUgdGFzaykuXHJcblx0ICpcclxuXHQgKiBAYXN5bmNcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcmV0dXJuIHtQcm9taXNlfSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHN5bmNocm9uaXphdGlvbiBoYXMgYmVlbiBmaW5pc2hlZC5cclxuXHQgKi9cclxuXHRhc3luYyB3YWl0Rm9yR1BVKCkge31cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgcGVyZm9ybXMgYSByZWFkYmFjayBvcGVyYXRpb24gYnkgbW92aW5nIGJ1ZmZlciBkYXRhIGZyb21cclxuXHQgKiBhIHN0b3JhZ2UgYnVmZmVyIGF0dHJpYnV0ZSBmcm9tIHRoZSBHUFUgdG8gdGhlIENQVS5cclxuXHQgKlxyXG5cdCAqIEBhc3luY1xyXG5cdCAqIEBwYXJhbSB7U3RvcmFnZUJ1ZmZlckF0dHJpYnV0ZX0gYXR0cmlidXRlIC0gVGhlIHN0b3JhZ2UgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKiBAcmV0dXJuIHtQcm9taXNlPEFycmF5QnVmZmVyPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgYnVmZmVyIGRhdGEgd2hlbiB0aGUgZGF0YSBhcmUgcmVhZHkuXHJcblx0ICovXHJcblx0YXN5bmMgZ2V0QXJyYXlCdWZmZXJBc3luYyggLyogYXR0cmlidXRlICovICkge31cclxuXHJcblx0LyoqXHJcblx0ICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgYmFja2VuZC5cclxuXHQgKlxyXG5cdCAqIEBhc3luY1xyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIGZlYXR1cmUncyBuYW1lLlxyXG5cdCAqIEByZXR1cm4ge1Byb21pc2U8Ym9vbGVhbj59IEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggYSBib29sIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIG9yIG5vdC5cclxuXHQgKi9cclxuXHRhc3luYyBoYXNGZWF0dXJlQXN5bmMoIC8qbmFtZSovICkgeyB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgIGJ5IHRoZSBiYWNrZW5kLlxyXG5cdCAqXHJcblx0ICogQGFic3RyYWN0XHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgZmVhdHVyZSdzIG5hbWUuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGhhc0ZlYXR1cmUoIC8qbmFtZSovICkge31cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgbWF4aW11bSBhbmlzb3Ryb3B5IHRleHR1cmUgZmlsdGVyaW5nIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQGFic3RyYWN0XHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgbWF4aW11bSBhbmlzb3Ryb3B5IHRleHR1cmUgZmlsdGVyaW5nIHZhbHVlLlxyXG5cdCAqL1xyXG5cdGdldE1heEFuaXNvdHJvcHkoKSB7fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBkcmF3aW5nIGJ1ZmZlciBzaXplLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gVGhlIGRyYXdpbmcgYnVmZmVyIHNpemUuXHJcblx0ICovXHJcblx0Z2V0RHJhd2luZ0J1ZmZlclNpemUoKSB7XHJcblxyXG5cdFx0X3ZlY3RvcjIgPSBfdmVjdG9yMiB8fCBuZXcgVmVjdG9yMigpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnJlbmRlcmVyLmdldERyYXdpbmdCdWZmZXJTaXplKCBfdmVjdG9yMiApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgdGhlIHNjaXNzb3IgdGVzdC5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gYm9vbGVhbiAtIFdoZXRoZXIgdGhlIHNjaXNzb3IgdGVzdCBzaG91bGQgYmUgZW5hYmxlZCBvciBub3QuXHJcblx0ICovXHJcblx0c2V0U2Npc3NvclRlc3QoIC8qYm9vbGVhbiovICkgeyB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGNsZWFyIGNvbG9yIGFuZCBhbHBoYSBpbnRvIGEgc2luZ2xlXHJcblx0ICogY29sb3Igb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Q29sb3I0fSBUaGUgY2xlYXIgY29sb3IuXHJcblx0ICovXHJcblx0Z2V0Q2xlYXJDb2xvcigpIHtcclxuXHJcblx0XHRjb25zdCByZW5kZXJlciA9IHRoaXMucmVuZGVyZXI7XHJcblxyXG5cdFx0X2NvbG9yNCA9IF9jb2xvcjQgfHwgbmV3IENvbG9yNCgpO1xyXG5cclxuXHRcdHJlbmRlcmVyLmdldENsZWFyQ29sb3IoIF9jb2xvcjQgKTtcclxuXHJcblx0XHRfY29sb3I0LmdldFJHQiggX2NvbG9yNCApO1xyXG5cclxuXHRcdHJldHVybiBfY29sb3I0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIERPTSBlbGVtZW50LiBJZiBubyBET00gZWxlbWVudCBleGlzdHMsIHRoZSBiYWNrZW5kXHJcblx0ICogY3JlYXRlcyBhIG5ldyBvbmUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtIVE1MQ2FudmFzRWxlbWVudH0gVGhlIERPTSBlbGVtZW50LlxyXG5cdCAqL1xyXG5cdGdldERvbUVsZW1lbnQoKSB7XHJcblxyXG5cdFx0bGV0IGRvbUVsZW1lbnQgPSB0aGlzLmRvbUVsZW1lbnQ7XHJcblxyXG5cdFx0aWYgKCBkb21FbGVtZW50ID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0ZG9tRWxlbWVudCA9ICggdGhpcy5wYXJhbWV0ZXJzLmNhbnZhcyAhPT0gdW5kZWZpbmVkICkgPyB0aGlzLnBhcmFtZXRlcnMuY2FudmFzIDogY3JlYXRlQ2FudmFzRWxlbWVudCgpO1xyXG5cclxuXHRcdFx0Ly8gT2Zmc2NyZWVuQ2FudmFzIGRvZXMgbm90IGhhdmUgc2V0QXR0cmlidXRlLCBzZWUgIzIyODExXHJcblx0XHRcdGlmICggJ3NldEF0dHJpYnV0ZScgaW4gZG9tRWxlbWVudCApIGRvbUVsZW1lbnQuc2V0QXR0cmlidXRlKCAnZGF0YS1lbmdpbmUnLCBgdGhyZWUuanMgciR7UkVWSVNJT059IHdlYmdwdWAgKTtcclxuXHJcblx0XHRcdHRoaXMuZG9tRWxlbWVudCA9IGRvbUVsZW1lbnQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBkb21FbGVtZW50O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgYSBkaWN0aW9uYXJ5IGZvciB0aGUgZ2l2ZW4gb2JqZWN0IGludG8gdGhlXHJcblx0ICogaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IC0gVGhlIG9iamVjdC5cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gdmFsdWUgLSBUaGUgZGljdGlvbmFyeSB0byBzZXQuXHJcblx0ICovXHJcblx0c2V0KCBvYmplY3QsIHZhbHVlICkge1xyXG5cclxuXHRcdHRoaXMuZGF0YS5zZXQoIG9iamVjdCwgdmFsdWUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBkaWN0aW9uYXJ5IGZvciB0aGUgZ2l2ZW4gb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCAtIFRoZSBvYmplY3QuXHJcblx0ICogQHJldHVybiB7T2JqZWN0fSBUaGUgb2JqZWN0J3MgZGljdGlvbmFyeS5cclxuXHQgKi9cclxuXHRnZXQoIG9iamVjdCApIHtcclxuXHJcblx0XHRsZXQgbWFwID0gdGhpcy5kYXRhLmdldCggb2JqZWN0ICk7XHJcblxyXG5cdFx0aWYgKCBtYXAgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdG1hcCA9IHt9O1xyXG5cdFx0XHR0aGlzLmRhdGEuc2V0KCBvYmplY3QsIG1hcCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbWFwO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGhhcyBhIGRpY3Rpb25hcnlcclxuXHQgKiB3aXRoIGRhdGEgZGVmaW5lZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgLSBUaGUgb2JqZWN0LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgYSBkaWN0aW9uYXJ5IGZvciB0aGUgZ2l2ZW4gb2JqZWN0IGFzIGJlZW4gZGVmaW5lZCBvciBub3QuXHJcblx0ICovXHJcblx0aGFzKCBvYmplY3QgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5oYXMoIG9iamVjdCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlbGV0ZXMgYW4gb2JqZWN0IGZyb20gdGhlIGludGVybmFsIGRhdGEgc3RydWN0dXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCAtIFRoZSBvYmplY3QgdG8gZGVsZXRlLlxyXG5cdCAqL1xyXG5cdGRlbGV0ZSggb2JqZWN0ICkge1xyXG5cclxuXHRcdHRoaXMuZGF0YS5kZWxldGUoIG9iamVjdCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZyZWVzIGludGVybmFsIHJlc291cmNlcy5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqL1xyXG5cdGRpc3Bvc2UoKSB7IH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEJhY2tlbmQ7XHJcbiIsImltcG9ydCB7IEludFR5cGUgfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMuanMnO1xyXG5cclxubGV0IF9pZCA9IDA7XHJcblxyXG4vKipcclxuICogVGhpcyBtb2R1bGUgaXMgaW50ZXJuYWxseSB1c2VkIGluIGNvbnRleHQgb2YgY29tcHV0ZSBzaGFkZXJzLlxyXG4gKiBUaGlzIHR5cGUgb2Ygc2hhZGVyIGlzIG5vdCBuYXRpdmVseSBzdXBwb3J0ZWQgaW4gV2ViR0wgMiBhbmRcclxuICogdGh1cyBpbXBsZW1lbnRlZCB2aWEgVHJhbnNmb3JtIEZlZWRiYWNrLiBgRHVhbEF0dHJpYnV0ZURhdGFgXHJcbiAqIG1hbmFnZXMgdGhlIHJlbGF0ZWQgZGF0YS5cclxuICpcclxuICogQHByaXZhdGVcclxuICovXHJcbmNsYXNzIER1YWxBdHRyaWJ1dGVEYXRhIHtcclxuXHJcblx0Y29uc3RydWN0b3IoIGF0dHJpYnV0ZURhdGEsIGR1YWxCdWZmZXIgKSB7XHJcblxyXG5cdFx0dGhpcy5idWZmZXJzID0gWyBhdHRyaWJ1dGVEYXRhLmJ1ZmZlckdQVSwgZHVhbEJ1ZmZlciBdO1xyXG5cdFx0dGhpcy50eXBlID0gYXR0cmlidXRlRGF0YS50eXBlO1xyXG5cdFx0dGhpcy5idWZmZXJUeXBlID0gYXR0cmlidXRlRGF0YS5idWZmZXJUeXBlO1xyXG5cdFx0dGhpcy5wYm8gPSBhdHRyaWJ1dGVEYXRhLnBibztcclxuXHRcdHRoaXMuYnl0ZUxlbmd0aCA9IGF0dHJpYnV0ZURhdGEuYnl0ZUxlbmd0aDtcclxuXHRcdHRoaXMuYnl0ZXNQZXJFbGVtZW50ID0gYXR0cmlidXRlRGF0YS5CWVRFU19QRVJfRUxFTUVOVDtcclxuXHRcdHRoaXMudmVyc2lvbiA9IGF0dHJpYnV0ZURhdGEudmVyc2lvbjtcclxuXHRcdHRoaXMuaXNJbnRlZ2VyID0gYXR0cmlidXRlRGF0YS5pc0ludGVnZXI7XHJcblx0XHR0aGlzLmFjdGl2ZUJ1ZmZlckluZGV4ID0gMDtcclxuXHRcdHRoaXMuYmFzZUlkID0gYXR0cmlidXRlRGF0YS5pZDtcclxuXHJcblx0fVxyXG5cclxuXHJcblx0Z2V0IGlkKCkge1xyXG5cclxuXHRcdHJldHVybiBgJHsgdGhpcy5iYXNlSWQgfXwkeyB0aGlzLmFjdGl2ZUJ1ZmZlckluZGV4IH1gO1xyXG5cclxuXHR9XHJcblxyXG5cdGdldCBidWZmZXJHUFUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuYnVmZmVyc1sgdGhpcy5hY3RpdmVCdWZmZXJJbmRleCBdO1xyXG5cclxuXHR9XHJcblxyXG5cdGdldCB0cmFuc2Zvcm1CdWZmZXIoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuYnVmZmVyc1sgdGhpcy5hY3RpdmVCdWZmZXJJbmRleCBeIDEgXTtcclxuXHJcblx0fVxyXG5cclxuXHRzd2l0Y2hCdWZmZXJzKCkge1xyXG5cclxuXHRcdHRoaXMuYWN0aXZlQnVmZmVySW5kZXggXj0gMTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIEEgV2ViR0wgMiBiYWNrZW5kIHV0aWxpdHkgbW9kdWxlIGZvciBtYW5hZ2luZyBzaGFkZXIgYXR0cmlidXRlcy5cclxuICpcclxuICogQHByaXZhdGVcclxuICovXHJcbmNsYXNzIFdlYkdMQXR0cmlidXRlVXRpbHMge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHV0aWxpdHkgb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHTEJhY2tlbmR9IGJhY2tlbmQgLSBUaGUgV2ViR0wgMiBiYWNrZW5kLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBiYWNrZW5kICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIFdlYkdMIDIgYmFja2VuZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2ViR0xCYWNrZW5kfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJhY2tlbmQgPSBiYWNrZW5kO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgdGhlIEdQVSBidWZmZXIgZm9yIHRoZSBnaXZlbiBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCdWZmZXJBdHRyaWJ1dGV9IGF0dHJpYnV0ZSAtIFRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqIEBwYXJhbSB7R0xlbnVtIH0gYnVmZmVyVHlwZSAtIEEgZmxhZyB0aGF0IGluZGljYXRlcyB0aGUgYnVmZmVyIHR5cGUgYW5kIHRodXMgYmluZGluZyBwb2ludCB0YXJnZXQuXHJcblx0ICovXHJcblx0Y3JlYXRlQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGJ1ZmZlclR5cGUgKSB7XHJcblxyXG5cdFx0Y29uc3QgYmFja2VuZCA9IHRoaXMuYmFja2VuZDtcclxuXHRcdGNvbnN0IHsgZ2wgfSA9IGJhY2tlbmQ7XHJcblxyXG5cdFx0Y29uc3QgYXJyYXkgPSBhdHRyaWJ1dGUuYXJyYXk7XHJcblx0XHRjb25zdCB1c2FnZSA9IGF0dHJpYnV0ZS51c2FnZSB8fCBnbC5TVEFUSUNfRFJBVztcclxuXHJcblx0XHRjb25zdCBidWZmZXJBdHRyaWJ1dGUgPSBhdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSA/IGF0dHJpYnV0ZS5kYXRhIDogYXR0cmlidXRlO1xyXG5cdFx0Y29uc3QgYnVmZmVyRGF0YSA9IGJhY2tlbmQuZ2V0KCBidWZmZXJBdHRyaWJ1dGUgKTtcclxuXHJcblx0XHRsZXQgYnVmZmVyR1BVID0gYnVmZmVyRGF0YS5idWZmZXJHUFU7XHJcblxyXG5cdFx0aWYgKCBidWZmZXJHUFUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGJ1ZmZlckdQVSA9IHRoaXMuX2NyZWF0ZUJ1ZmZlciggZ2wsIGJ1ZmZlclR5cGUsIGFycmF5LCB1c2FnZSApO1xyXG5cclxuXHRcdFx0YnVmZmVyRGF0YS5idWZmZXJHUFUgPSBidWZmZXJHUFU7XHJcblx0XHRcdGJ1ZmZlckRhdGEuYnVmZmVyVHlwZSA9IGJ1ZmZlclR5cGU7XHJcblx0XHRcdGJ1ZmZlckRhdGEudmVyc2lvbiA9IGJ1ZmZlckF0dHJpYnV0ZS52ZXJzaW9uO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvL2F0dHJpYnV0ZS5vblVwbG9hZENhbGxiYWNrKCk7XHJcblxyXG5cdFx0bGV0IHR5cGU7XHJcblxyXG5cdFx0aWYgKCBhcnJheSBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSApIHtcclxuXHJcblx0XHRcdHR5cGUgPSBnbC5GTE9BVDtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIFVpbnQxNkFycmF5ICkge1xyXG5cclxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUuaXNGbG9hdDE2QnVmZmVyQXR0cmlidXRlICkge1xyXG5cclxuXHRcdFx0XHR0eXBlID0gZ2wuSEFMRl9GTE9BVDtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHR5cGUgPSBnbC5VTlNJR05FRF9TSE9SVDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIEludDE2QXJyYXkgKSB7XHJcblxyXG5cdFx0XHR0eXBlID0gZ2wuU0hPUlQ7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBVaW50MzJBcnJheSApIHtcclxuXHJcblx0XHRcdHR5cGUgPSBnbC5VTlNJR05FRF9JTlQ7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBJbnQzMkFycmF5ICkge1xyXG5cclxuXHRcdFx0dHlwZSA9IGdsLklOVDtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIEludDhBcnJheSApIHtcclxuXHJcblx0XHRcdHR5cGUgPSBnbC5CWVRFO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGFycmF5IGluc3RhbmNlb2YgVWludDhBcnJheSApIHtcclxuXHJcblx0XHRcdHR5cGUgPSBnbC5VTlNJR05FRF9CWVRFO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGFycmF5IGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXkgKSB7XHJcblxyXG5cdFx0XHR0eXBlID0gZ2wuVU5TSUdORURfQllURTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuV2ViR0xCYWNrZW5kOiBVbnN1cHBvcnRlZCBidWZmZXIgZGF0YSBmb3JtYXQ6ICcgKyBhcnJheSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRsZXQgYXR0cmlidXRlRGF0YSA9IHtcclxuXHRcdFx0YnVmZmVyR1BVLFxyXG5cdFx0XHRidWZmZXJUeXBlLFxyXG5cdFx0XHR0eXBlLFxyXG5cdFx0XHRieXRlTGVuZ3RoOiBhcnJheS5ieXRlTGVuZ3RoLFxyXG5cdFx0XHRieXRlc1BlckVsZW1lbnQ6IGFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULFxyXG5cdFx0XHR2ZXJzaW9uOiBhdHRyaWJ1dGUudmVyc2lvbixcclxuXHRcdFx0cGJvOiBhdHRyaWJ1dGUucGJvLFxyXG5cdFx0XHRpc0ludGVnZXI6IHR5cGUgPT09IGdsLklOVCB8fCB0eXBlID09PSBnbC5VTlNJR05FRF9JTlQgfHwgYXR0cmlidXRlLmdwdVR5cGUgPT09IEludFR5cGUsXHJcblx0XHRcdGlkOiBfaWQgKytcclxuXHRcdH07XHJcblxyXG5cdFx0aWYgKCBhdHRyaWJ1dGUuaXNTdG9yYWdlQnVmZmVyQXR0cmlidXRlIHx8IGF0dHJpYnV0ZS5pc1N0b3JhZ2VJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUgKSB7XHJcblxyXG5cdFx0XHQvLyBjcmVhdGUgYnVmZmVyIGZvciB0cmFuc2Zvcm0gZmVlZGJhY2sgdXNlXHJcblx0XHRcdGNvbnN0IGJ1ZmZlckdQVUR1YWwgPSB0aGlzLl9jcmVhdGVCdWZmZXIoIGdsLCBidWZmZXJUeXBlLCBhcnJheSwgdXNhZ2UgKTtcclxuXHRcdFx0YXR0cmlidXRlRGF0YSA9IG5ldyBEdWFsQXR0cmlidXRlRGF0YSggYXR0cmlidXRlRGF0YSwgYnVmZmVyR1BVRHVhbCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRiYWNrZW5kLnNldCggYXR0cmlidXRlLCBhdHRyaWJ1dGVEYXRhICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgR1BVIGJ1ZmZlciBvZiB0aGUgZ2l2ZW4gYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyQXR0cmlidXRlfSBhdHRyaWJ1dGUgLSBUaGUgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKi9cclxuXHR1cGRhdGVBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApIHtcclxuXHJcblx0XHRjb25zdCBiYWNrZW5kID0gdGhpcy5iYWNrZW5kO1xyXG5cdFx0Y29uc3QgeyBnbCB9ID0gYmFja2VuZDtcclxuXHJcblx0XHRjb25zdCBhcnJheSA9IGF0dHJpYnV0ZS5hcnJheTtcclxuXHRcdGNvbnN0IGJ1ZmZlckF0dHJpYnV0ZSA9IGF0dHJpYnV0ZS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlID8gYXR0cmlidXRlLmRhdGEgOiBhdHRyaWJ1dGU7XHJcblx0XHRjb25zdCBidWZmZXJEYXRhID0gYmFja2VuZC5nZXQoIGJ1ZmZlckF0dHJpYnV0ZSApO1xyXG5cdFx0Y29uc3QgYnVmZmVyVHlwZSA9IGJ1ZmZlckRhdGEuYnVmZmVyVHlwZTtcclxuXHRcdGNvbnN0IHVwZGF0ZVJhbmdlcyA9IGF0dHJpYnV0ZS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlID8gYXR0cmlidXRlLmRhdGEudXBkYXRlUmFuZ2VzIDogYXR0cmlidXRlLnVwZGF0ZVJhbmdlcztcclxuXHJcblx0XHRnbC5iaW5kQnVmZmVyKCBidWZmZXJUeXBlLCBidWZmZXJEYXRhLmJ1ZmZlckdQVSApO1xyXG5cclxuXHRcdGlmICggdXBkYXRlUmFuZ2VzLmxlbmd0aCA9PT0gMCApIHtcclxuXHJcblx0XHRcdC8vIE5vdCB1c2luZyB1cGRhdGUgcmFuZ2VzXHJcblxyXG5cdFx0XHRnbC5idWZmZXJTdWJEYXRhKCBidWZmZXJUeXBlLCAwLCBhcnJheSApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSB1cGRhdGVSYW5nZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgcmFuZ2UgPSB1cGRhdGVSYW5nZXNbIGkgXTtcclxuXHRcdFx0XHRnbC5idWZmZXJTdWJEYXRhKCBidWZmZXJUeXBlLCByYW5nZS5zdGFydCAqIGFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULFxyXG5cdFx0XHRcdFx0YXJyYXksIHJhbmdlLnN0YXJ0LCByYW5nZS5jb3VudCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0YnVmZmVyQXR0cmlidXRlLmNsZWFyVXBkYXRlUmFuZ2VzKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGdsLmJpbmRCdWZmZXIoIGJ1ZmZlclR5cGUsIG51bGwgKTtcclxuXHJcblx0XHRidWZmZXJEYXRhLnZlcnNpb24gPSBidWZmZXJBdHRyaWJ1dGUudmVyc2lvbjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZXN0cm95cyB0aGUgR1BVIGJ1ZmZlciBvZiB0aGUgZ2l2ZW4gYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyQXR0cmlidXRlfSBhdHRyaWJ1dGUgLSBUaGUgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKi9cclxuXHRkZXN0cm95QXR0cmlidXRlKCBhdHRyaWJ1dGUgKSB7XHJcblxyXG5cdFx0Y29uc3QgYmFja2VuZCA9IHRoaXMuYmFja2VuZDtcclxuXHRcdGNvbnN0IHsgZ2wgfSA9IGJhY2tlbmQ7XHJcblxyXG5cdFx0aWYgKCBhdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApIHtcclxuXHJcblx0XHRcdGJhY2tlbmQuZGVsZXRlKCBhdHRyaWJ1dGUuZGF0YSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBhdHRyaWJ1dGVEYXRhID0gYmFja2VuZC5nZXQoIGF0dHJpYnV0ZSApO1xyXG5cclxuXHRcdGdsLmRlbGV0ZUJ1ZmZlciggYXR0cmlidXRlRGF0YS5idWZmZXJHUFUgKTtcclxuXHJcblx0XHRiYWNrZW5kLmRlbGV0ZSggYXR0cmlidXRlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgcGVyZm9ybXMgYSByZWFkYmFjayBvcGVyYXRpb24gYnkgbW92aW5nIGJ1ZmZlciBkYXRhIGZyb21cclxuXHQgKiBhIHN0b3JhZ2UgYnVmZmVyIGF0dHJpYnV0ZSBmcm9tIHRoZSBHUFUgdG8gdGhlIENQVS5cclxuXHQgKlxyXG5cdCAqIEBhc3luY1xyXG5cdCAqIEBwYXJhbSB7U3RvcmFnZUJ1ZmZlckF0dHJpYnV0ZX0gYXR0cmlidXRlIC0gVGhlIHN0b3JhZ2UgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKiBAcmV0dXJuIHtQcm9taXNlPEFycmF5QnVmZmVyPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgYnVmZmVyIGRhdGEgd2hlbiB0aGUgZGF0YSBhcmUgcmVhZHkuXHJcblx0ICovXHJcblx0YXN5bmMgZ2V0QXJyYXlCdWZmZXJBc3luYyggYXR0cmlidXRlICkge1xyXG5cclxuXHRcdGNvbnN0IGJhY2tlbmQgPSB0aGlzLmJhY2tlbmQ7XHJcblx0XHRjb25zdCB7IGdsIH0gPSBiYWNrZW5kO1xyXG5cclxuXHRcdGNvbnN0IGJ1ZmZlckF0dHJpYnV0ZSA9IGF0dHJpYnV0ZS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlID8gYXR0cmlidXRlLmRhdGEgOiBhdHRyaWJ1dGU7XHJcblx0XHRjb25zdCB7IGJ1ZmZlckdQVSB9ID0gYmFja2VuZC5nZXQoIGJ1ZmZlckF0dHJpYnV0ZSApO1xyXG5cclxuXHRcdGNvbnN0IGFycmF5ID0gYXR0cmlidXRlLmFycmF5O1xyXG5cdFx0Y29uc3QgYnl0ZUxlbmd0aCA9IGFycmF5LmJ5dGVMZW5ndGg7XHJcblxyXG5cdFx0Z2wuYmluZEJ1ZmZlciggZ2wuQ09QWV9SRUFEX0JVRkZFUiwgYnVmZmVyR1BVICk7XHJcblxyXG5cdFx0Y29uc3Qgd3JpdGVCdWZmZXIgPSBnbC5jcmVhdGVCdWZmZXIoKTtcclxuXHJcblx0XHRnbC5iaW5kQnVmZmVyKCBnbC5DT1BZX1dSSVRFX0JVRkZFUiwgd3JpdGVCdWZmZXIgKTtcclxuXHRcdGdsLmJ1ZmZlckRhdGEoIGdsLkNPUFlfV1JJVEVfQlVGRkVSLCBieXRlTGVuZ3RoLCBnbC5TVFJFQU1fUkVBRCApO1xyXG5cclxuXHRcdGdsLmNvcHlCdWZmZXJTdWJEYXRhKCBnbC5DT1BZX1JFQURfQlVGRkVSLCBnbC5DT1BZX1dSSVRFX0JVRkZFUiwgMCwgMCwgYnl0ZUxlbmd0aCApO1xyXG5cclxuXHRcdGF3YWl0IGJhY2tlbmQudXRpbHMuX2NsaWVudFdhaXRBc3luYygpO1xyXG5cclxuXHRcdGNvbnN0IGRzdEJ1ZmZlciA9IG5ldyBhdHRyaWJ1dGUuYXJyYXkuY29uc3RydWN0b3IoIGFycmF5Lmxlbmd0aCApO1xyXG5cclxuXHRcdC8vIEVuc3VyZSB0aGUgYnVmZmVyIGlzIGJvdW5kIGJlZm9yZSByZWFkaW5nXHJcblx0XHRnbC5iaW5kQnVmZmVyKCBnbC5DT1BZX1dSSVRFX0JVRkZFUiwgd3JpdGVCdWZmZXIgKTtcclxuXHJcblx0XHRnbC5nZXRCdWZmZXJTdWJEYXRhKCBnbC5DT1BZX1dSSVRFX0JVRkZFUiwgMCwgZHN0QnVmZmVyICk7XHJcblxyXG5cdFx0Z2wuZGVsZXRlQnVmZmVyKCB3cml0ZUJ1ZmZlciApO1xyXG5cclxuXHRcdGdsLmJpbmRCdWZmZXIoIGdsLkNPUFlfUkVBRF9CVUZGRVIsIG51bGwgKTtcclxuXHRcdGdsLmJpbmRCdWZmZXIoIGdsLkNPUFlfV1JJVEVfQlVGRkVSLCBudWxsICk7XHJcblxyXG5cdFx0cmV0dXJuIGRzdEJ1ZmZlci5idWZmZXI7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyBhIFdlYkdMIGJ1ZmZlciB3aXRoIHRoZSBnaXZlbiBkYXRhLlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge1dlYkdMMlJlbmRlcmluZ0NvbnRleHR9IGdsIC0gVGhlIHJlbmRlcmluZyBjb250ZXh0LlxyXG5cdCAqIEBwYXJhbSB7R0xlbnVtIH0gYnVmZmVyVHlwZSAtIEEgZmxhZyB0aGF0IGluZGljYXRlcyB0aGUgYnVmZmVyIHR5cGUgYW5kIHRodXMgYmluZGluZyBwb2ludCB0YXJnZXQuXHJcblx0ICogQHBhcmFtIHtUeXBlZEFycmF5fSBhcnJheSAtIFRoZSBhcnJheSBvZiB0aGUgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKiBAcGFyYW0ge0dMZW51bX0gdXNhZ2UgLSBUaGUgdXNhZ2UuXHJcblx0ICogQHJldHVybiB7V2ViR0xCdWZmZXJ9IFRoZSBXZWJHTCBidWZmZXIuXHJcblx0ICovXHJcblx0X2NyZWF0ZUJ1ZmZlciggZ2wsIGJ1ZmZlclR5cGUsIGFycmF5LCB1c2FnZSApIHtcclxuXHJcblx0XHRjb25zdCBidWZmZXJHUFUgPSBnbC5jcmVhdGVCdWZmZXIoKTtcclxuXHJcblx0XHRnbC5iaW5kQnVmZmVyKCBidWZmZXJUeXBlLCBidWZmZXJHUFUgKTtcclxuXHRcdGdsLmJ1ZmZlckRhdGEoIGJ1ZmZlclR5cGUsIGFycmF5LCB1c2FnZSApO1xyXG5cdFx0Z2wuYmluZEJ1ZmZlciggYnVmZmVyVHlwZSwgbnVsbCApO1xyXG5cclxuXHRcdHJldHVybiBidWZmZXJHUFU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFdlYkdMQXR0cmlidXRlVXRpbHM7XHJcbiIsImltcG9ydCB7XHJcblx0Q3VsbEZhY2VOb25lLCBDdWxsRmFjZUJhY2ssIEN1bGxGYWNlRnJvbnQsIERvdWJsZVNpZGUsIEJhY2tTaWRlLFxyXG5cdE5vcm1hbEJsZW5kaW5nLCBOb0JsZW5kaW5nLCBDdXN0b21CbGVuZGluZywgQWRkRXF1YXRpb24sXHJcblx0QWRkaXRpdmVCbGVuZGluZywgU3VidHJhY3RpdmVCbGVuZGluZywgTXVsdGlwbHlCbGVuZGluZywgU3VidHJhY3RFcXVhdGlvbiwgUmV2ZXJzZVN1YnRyYWN0RXF1YXRpb24sXHJcblx0WmVyb0ZhY3RvciwgT25lRmFjdG9yLCBTcmNDb2xvckZhY3RvciwgU3JjQWxwaGFGYWN0b3IsIFNyY0FscGhhU2F0dXJhdGVGYWN0b3IsIERzdENvbG9yRmFjdG9yLCBEc3RBbHBoYUZhY3RvcixcclxuXHRPbmVNaW51c1NyY0NvbG9yRmFjdG9yLCBPbmVNaW51c1NyY0FscGhhRmFjdG9yLCBPbmVNaW51c0RzdENvbG9yRmFjdG9yLCBPbmVNaW51c0RzdEFscGhhRmFjdG9yLFxyXG5cdE5ldmVyRGVwdGgsIEFsd2F5c0RlcHRoLCBMZXNzRGVwdGgsIExlc3NFcXVhbERlcHRoLCBFcXVhbERlcHRoLCBHcmVhdGVyRXF1YWxEZXB0aCwgR3JlYXRlckRlcHRoLCBOb3RFcXVhbERlcHRoXHJcbn0gZnJvbSAnLi4vLi4vLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yNCB9IGZyb20gJy4uLy4uLy4uL21hdGgvVmVjdG9yNC5qcyc7XHJcblxyXG5sZXQgZXF1YXRpb25Ub0dMLCBmYWN0b3JUb0dMO1xyXG5cclxuLyoqXHJcbiAqIEEgV2ViR0wgMiBiYWNrZW5kIHV0aWxpdHkgbW9kdWxlIGZvciBtYW5hZ2luZyB0aGUgV2ViR0wgc3RhdGUuXHJcbiAqXHJcbiAqIFRoZSBtYWpvciBnb2FsIG9mIHRoaXMgbW9kdWxlIGlzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHN0YXRlIGNoYW5nZXNcclxuICogYnkgY2FjaGluZyB0aGUgV0ViR0wgc3RhdGUgd2l0aCBhIHNlcmllcyBvZiB2YXJpYWJsZXMuIEluIHRoaXMgd2F5LCB0aGVcclxuICogcmVuZGVyZXIgb25seSBleGVjdXRlcyBzdGF0ZSBjaGFuZ2UgY29tbWFuZHMgd2hlbiBuZWNlc3Nhcnkgd2hpY2hcclxuICogaW1wcm92ZXMgdGhlIG92ZXJhbGwgcGVyZm9ybWFuY2UuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5jbGFzcyBXZWJHTFN0YXRlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB1dGlsaXR5IG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xCYWNrZW5kfSBiYWNrZW5kIC0gVGhlIFdlYkdMIDIgYmFja2VuZC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggYmFja2VuZCApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIHRoZSBXZWJHTCAyIGJhY2tlbmQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1dlYkdMQmFja2VuZH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5iYWNrZW5kID0gYmFja2VuZDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIHRoZSByZW5kZXJpbmcgY29udGV4dC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2ViR0wyUmVuZGVyaW5nQ29udGV4dH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nbCA9IHRoaXMuYmFja2VuZC5nbDtcclxuXHJcblx0XHQvLyBCZWxvdyBwcm9wZXJ0aWVzIGFyZSBpbnRlbmRlZCB0byBjYWNoZVxyXG5cdFx0Ly8gdGhlIFdlYkdMIHN0YXRlIGFuZCBhcmUgbm90IGV4cGxpY2l0bHlcclxuXHRcdC8vIGRvY3VtZW50ZWQgZm9yIGNvbnZlbmllbmNlIHJlYXNvbnMuXHJcblxyXG5cdFx0dGhpcy5lbmFibGVkID0ge307XHJcblx0XHR0aGlzLmN1cnJlbnRGbGlwU2lkZWQgPSBudWxsO1xyXG5cdFx0dGhpcy5jdXJyZW50Q3VsbEZhY2UgPSBudWxsO1xyXG5cdFx0dGhpcy5jdXJyZW50UHJvZ3JhbSA9IG51bGw7XHJcblx0XHR0aGlzLmN1cnJlbnRCbGVuZGluZ0VuYWJsZWQgPSBmYWxzZTtcclxuXHRcdHRoaXMuY3VycmVudEJsZW5kaW5nID0gbnVsbDtcclxuXHRcdHRoaXMuY3VycmVudEJsZW5kU3JjID0gbnVsbDtcclxuXHRcdHRoaXMuY3VycmVudEJsZW5kRHN0ID0gbnVsbDtcclxuXHRcdHRoaXMuY3VycmVudEJsZW5kU3JjQWxwaGEgPSBudWxsO1xyXG5cdFx0dGhpcy5jdXJyZW50QmxlbmREc3RBbHBoYSA9IG51bGw7XHJcblx0XHR0aGlzLmN1cnJlbnRQcmVtdWx0aXBsZWRBbHBoYSA9IG51bGw7XHJcblx0XHR0aGlzLmN1cnJlbnRQb2x5Z29uT2Zmc2V0RmFjdG9yID0gbnVsbDtcclxuXHRcdHRoaXMuY3VycmVudFBvbHlnb25PZmZzZXRVbml0cyA9IG51bGw7XHJcblx0XHR0aGlzLmN1cnJlbnRDb2xvck1hc2sgPSBudWxsO1xyXG5cdFx0dGhpcy5jdXJyZW50RGVwdGhGdW5jID0gbnVsbDtcclxuXHRcdHRoaXMuY3VycmVudERlcHRoTWFzayA9IG51bGw7XHJcblx0XHR0aGlzLmN1cnJlbnRTdGVuY2lsRnVuYyA9IG51bGw7XHJcblx0XHR0aGlzLmN1cnJlbnRTdGVuY2lsUmVmID0gbnVsbDtcclxuXHRcdHRoaXMuY3VycmVudFN0ZW5jaWxGdW5jTWFzayA9IG51bGw7XHJcblx0XHR0aGlzLmN1cnJlbnRTdGVuY2lsRmFpbCA9IG51bGw7XHJcblx0XHR0aGlzLmN1cnJlbnRTdGVuY2lsWkZhaWwgPSBudWxsO1xyXG5cdFx0dGhpcy5jdXJyZW50U3RlbmNpbFpQYXNzID0gbnVsbDtcclxuXHRcdHRoaXMuY3VycmVudFN0ZW5jaWxNYXNrID0gbnVsbDtcclxuXHRcdHRoaXMuY3VycmVudExpbmVXaWR0aCA9IG51bGw7XHJcblx0XHR0aGlzLmN1cnJlbnRDbGlwcGluZ1BsYW5lcyA9IDA7XHJcblxyXG5cdFx0dGhpcy5jdXJyZW50VkFPID0gbnVsbDtcclxuXHRcdHRoaXMuY3VycmVudEluZGV4ID0gbnVsbDtcclxuXHJcblx0XHR0aGlzLmN1cnJlbnRCb3VuZEZyYW1lYnVmZmVycyA9IHt9O1xyXG5cdFx0dGhpcy5jdXJyZW50RHJhd2J1ZmZlcnMgPSBuZXcgV2Vha01hcCgpO1xyXG5cclxuXHRcdHRoaXMubWF4VGV4dHVyZXMgPSB0aGlzLmdsLmdldFBhcmFtZXRlciggdGhpcy5nbC5NQVhfVEVYVFVSRV9JTUFHRV9VTklUUyApO1xyXG5cdFx0dGhpcy5jdXJyZW50VGV4dHVyZVNsb3QgPSBudWxsO1xyXG5cdFx0dGhpcy5jdXJyZW50Qm91bmRUZXh0dXJlcyA9IHt9O1xyXG5cdFx0dGhpcy5jdXJyZW50Qm91bmRCdWZmZXJCYXNlcyA9IHt9O1xyXG5cclxuXHJcblx0XHR0aGlzLl9pbml0KCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW5pdHMgdGhlIHN0YXRlIG9mIHRoZSB1dGlsaXR5LlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKi9cclxuXHRfaW5pdCgpIHtcclxuXHJcblx0XHRjb25zdCBnbCA9IHRoaXMuZ2w7XHJcblxyXG5cdFx0Ly8gU3RvcmUgb25seSBXZWJHTCBjb25zdGFudHMgaGVyZS5cclxuXHJcblx0XHRlcXVhdGlvblRvR0wgPSB7XHJcblx0XHRcdFsgQWRkRXF1YXRpb24gXTogZ2wuRlVOQ19BREQsXHJcblx0XHRcdFsgU3VidHJhY3RFcXVhdGlvbiBdOiBnbC5GVU5DX1NVQlRSQUNULFxyXG5cdFx0XHRbIFJldmVyc2VTdWJ0cmFjdEVxdWF0aW9uIF06IGdsLkZVTkNfUkVWRVJTRV9TVUJUUkFDVFxyXG5cdFx0fTtcclxuXHJcblx0XHRmYWN0b3JUb0dMID0ge1xyXG5cdFx0XHRbIFplcm9GYWN0b3IgXTogZ2wuWkVSTyxcclxuXHRcdFx0WyBPbmVGYWN0b3IgXTogZ2wuT05FLFxyXG5cdFx0XHRbIFNyY0NvbG9yRmFjdG9yIF06IGdsLlNSQ19DT0xPUixcclxuXHRcdFx0WyBTcmNBbHBoYUZhY3RvciBdOiBnbC5TUkNfQUxQSEEsXHJcblx0XHRcdFsgU3JjQWxwaGFTYXR1cmF0ZUZhY3RvciBdOiBnbC5TUkNfQUxQSEFfU0FUVVJBVEUsXHJcblx0XHRcdFsgRHN0Q29sb3JGYWN0b3IgXTogZ2wuRFNUX0NPTE9SLFxyXG5cdFx0XHRbIERzdEFscGhhRmFjdG9yIF06IGdsLkRTVF9BTFBIQSxcclxuXHRcdFx0WyBPbmVNaW51c1NyY0NvbG9yRmFjdG9yIF06IGdsLk9ORV9NSU5VU19TUkNfQ09MT1IsXHJcblx0XHRcdFsgT25lTWludXNTcmNBbHBoYUZhY3RvciBdOiBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBLFxyXG5cdFx0XHRbIE9uZU1pbnVzRHN0Q29sb3JGYWN0b3IgXTogZ2wuT05FX01JTlVTX0RTVF9DT0xPUixcclxuXHRcdFx0WyBPbmVNaW51c0RzdEFscGhhRmFjdG9yIF06IGdsLk9ORV9NSU5VU19EU1RfQUxQSEFcclxuXHRcdH07XHJcblxyXG5cdFx0Y29uc3Qgc2Npc3NvclBhcmFtID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5TQ0lTU09SX0JPWCApO1xyXG5cdFx0Y29uc3Qgdmlld3BvcnRQYXJhbSA9IGdsLmdldFBhcmFtZXRlciggZ2wuVklFV1BPUlQgKTtcclxuXHJcblx0XHR0aGlzLmN1cnJlbnRTY2lzc29yID0gbmV3IFZlY3RvcjQoKS5mcm9tQXJyYXkoIHNjaXNzb3JQYXJhbSApO1xyXG5cdFx0dGhpcy5jdXJyZW50Vmlld3BvcnQgPSBuZXcgVmVjdG9yNCgpLmZyb21BcnJheSggdmlld3BvcnRQYXJhbSApO1xyXG5cclxuXHRcdHRoaXMuX3RlbXBWZWM0ID0gbmV3IFZlY3RvcjQoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFbmFibGVzIHRoZSBnaXZlbiBXZWJHTCBjYXBhYmlsaXR5LlxyXG5cdCAqXHJcblx0ICogVGhpcyBtZXRob2QgY2FjaGVzIHRoZSBjYXBhYmlsaXR5IHN0YXRlIHNvXHJcblx0ICogYGdsLmVuYWJsZSgpYCBpcyBvbmx5IGNhbGxlZCB3aGVuIG5lY2Vzc2FyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7R0xlbnVtfSBpZCAtIFRoZSBjYXBhYmlsaXR5IHRvIGVuYWJsZS5cclxuXHQgKi9cclxuXHRlbmFibGUoIGlkICkge1xyXG5cclxuXHRcdGNvbnN0IHsgZW5hYmxlZCB9ID0gdGhpcztcclxuXHJcblx0XHRpZiAoIGVuYWJsZWRbIGlkIF0gIT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmdsLmVuYWJsZSggaWQgKTtcclxuXHRcdFx0ZW5hYmxlZFsgaWQgXSA9IHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERpc2FibGVzIHRoZSBnaXZlbiBXZWJHTCBjYXBhYmlsaXR5LlxyXG5cdCAqXHJcblx0ICogVGhpcyBtZXRob2QgY2FjaGVzIHRoZSBjYXBhYmlsaXR5IHN0YXRlIHNvXHJcblx0ICogYGdsLmRpc2FibGUoKWAgaXMgb25seSBjYWxsZWQgd2hlbiBuZWNlc3NhcnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0dMZW51bX0gaWQgLSBUaGUgY2FwYWJpbGl0eSB0byBlbmFibGUuXHJcblx0ICovXHJcblx0ZGlzYWJsZSggaWQgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBlbmFibGVkIH0gPSB0aGlzO1xyXG5cclxuXHRcdGlmICggZW5hYmxlZFsgaWQgXSAhPT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmdsLmRpc2FibGUoIGlkICk7XHJcblx0XHRcdGVuYWJsZWRbIGlkIF0gPSBmYWxzZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3BlY2lmaWVzIHdoZXRoZXIgcG9seWdvbnMgYXJlIGZyb250LSBvciBiYWNrLWZhY2luZ1xyXG5cdCAqIGJ5IHNldHRpbmcgdGhlIHdpbmRpbmcgb3JpZW50YXRpb24uXHJcblx0ICpcclxuXHQgKiBUaGlzIG1ldGhvZCBjYWNoZXMgdGhlIHN0YXRlIHNvIGBnbC5mcm9udEZhY2UoKWAgaXMgb25seVxyXG5cdCAqIGNhbGxlZCB3aGVuIG5lY2Vzc2FyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gZmxpcFNpZGVkIC0gV2hldGhlciB0cmlhbmdsZXMgZmxpcHBlZCB0aGVpciBzaWRlcyBvciBub3QuXHJcblx0ICovXHJcblx0c2V0RmxpcFNpZGVkKCBmbGlwU2lkZWQgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmN1cnJlbnRGbGlwU2lkZWQgIT09IGZsaXBTaWRlZCApIHtcclxuXHJcblx0XHRcdGNvbnN0IHsgZ2wgfSA9IHRoaXM7XHJcblxyXG5cdFx0XHRpZiAoIGZsaXBTaWRlZCApIHtcclxuXHJcblx0XHRcdFx0Z2wuZnJvbnRGYWNlKCBnbC5DVyApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0Z2wuZnJvbnRGYWNlKCBnbC5DQ1cgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuY3VycmVudEZsaXBTaWRlZCA9IGZsaXBTaWRlZDtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IGZyb250LSBhbmQvb3IgYmFjay1mYWNpbmdcclxuXHQgKiBwb2x5Z29ucyBjYW4gYmUgY3VsbGVkLlxyXG5cdCAqXHJcblx0ICogVGhpcyBtZXRob2QgY2FjaGVzIHRoZSBzdGF0ZSBzbyBgZ2wuY3VsbEZhY2UoKWAgaXMgb25seVxyXG5cdCAqIGNhbGxlZCB3aGVuIG5lY2Vzc2FyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBjdWxsRmFjZSAtIERlZmluZXMgd2hpY2ggcG9seWdvbnMgYXJlIGNhbmRpZGF0ZXMgZm9yIGN1bGxpbmcuXHJcblx0ICovXHJcblx0c2V0Q3VsbEZhY2UoIGN1bGxGYWNlICkge1xyXG5cclxuXHRcdGNvbnN0IHsgZ2wgfSA9IHRoaXM7XHJcblxyXG5cdFx0aWYgKCBjdWxsRmFjZSAhPT0gQ3VsbEZhY2VOb25lICkge1xyXG5cclxuXHRcdFx0dGhpcy5lbmFibGUoIGdsLkNVTExfRkFDRSApO1xyXG5cclxuXHRcdFx0aWYgKCBjdWxsRmFjZSAhPT0gdGhpcy5jdXJyZW50Q3VsbEZhY2UgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggY3VsbEZhY2UgPT09IEN1bGxGYWNlQmFjayApIHtcclxuXHJcblx0XHRcdFx0XHRnbC5jdWxsRmFjZSggZ2wuQkFDSyApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCBjdWxsRmFjZSA9PT0gQ3VsbEZhY2VGcm9udCApIHtcclxuXHJcblx0XHRcdFx0XHRnbC5jdWxsRmFjZSggZ2wuRlJPTlQgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRnbC5jdWxsRmFjZSggZ2wuRlJPTlRfQU5EX0JBQ0sgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR0aGlzLmRpc2FibGUoIGdsLkNVTExfRkFDRSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmN1cnJlbnRDdWxsRmFjZSA9IGN1bGxGYWNlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNwZWNpZmllcyB0aGUgd2lkdGggb2YgbGluZSBwcmltaXRpdmVzLlxyXG5cdCAqXHJcblx0ICogVGhpcyBtZXRob2QgY2FjaGVzIHRoZSBzdGF0ZSBzbyBgZ2wubGluZVdpZHRoKClgIGlzIG9ubHlcclxuXHQgKiBjYWxsZWQgd2hlbiBuZWNlc3NhcnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgbGluZSB3aWR0aC5cclxuXHQgKi9cclxuXHRzZXRMaW5lV2lkdGgoIHdpZHRoICkge1xyXG5cclxuXHRcdGNvbnN0IHsgY3VycmVudExpbmVXaWR0aCwgZ2wgfSA9IHRoaXM7XHJcblxyXG5cdFx0aWYgKCB3aWR0aCAhPT0gY3VycmVudExpbmVXaWR0aCApIHtcclxuXHJcblx0XHRcdGdsLmxpbmVXaWR0aCggd2lkdGggKTtcclxuXHJcblx0XHRcdHRoaXMuY3VycmVudExpbmVXaWR0aCA9IHdpZHRoO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWZpbmVzIHRoZSBibGVuZGluZy5cclxuXHQgKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGNhY2hlcyB0aGUgc3RhdGUgc28gYGdsLmJsZW5kRXF1YXRpb24oKWAsIGBnbC5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoKWAsXHJcblx0ICogYGdsLmJsZW5kRnVuYygpYCBhbmQgIGBnbC5ibGVuZEZ1bmNTZXBhcmF0ZSgpYCBhcmUgb25seSBjYWxsZWQgd2hlbiBuZWNlc3NhcnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYmxlbmRpbmcgLSBUaGUgYmxlbmRpbmcgdHlwZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYmxlbmRFcXVhdGlvbiAtIFRoZSBibGVuZGluZyBlcXVhdGlvbi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYmxlbmRTcmMgLSBPbmx5IHJlbGV2YW50IGZvciBjdXN0b20gYmxlbmRpbmcuIFRoZSBSR0Igc291cmNlIGJsZW5kaW5nIGZhY3Rvci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYmxlbmREc3QgLSBPbmx5IHJlbGV2YW50IGZvciBjdXN0b20gYmxlbmRpbmcuIFRoZSBSR0IgZGVzdGluYXRpb24gYmxlbmRpbmcgZmFjdG9yLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBibGVuZEVxdWF0aW9uQWxwaGEgLSBPbmx5IHJlbGV2YW50IGZvciBjdXN0b20gYmxlbmRpbmcuIFRoZSBibGVuZGluZyBlcXVhdGlvbiBmb3IgYWxwaGEuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGJsZW5kU3JjQWxwaGEgLSBPbmx5IHJlbGV2YW50IGZvciBjdXN0b20gYmxlbmRpbmcuIFRoZSBhbHBoYSBzb3VyY2UgYmxlbmRpbmcgZmFjdG9yLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBibGVuZERzdEFscGhhIC0gT25seSByZWxldmFudCBmb3IgY3VzdG9tIGJsZW5kaW5nLiBUaGUgYWxwaGEgZGVzdGluYXRpb24gYmxlbmRpbmcgZmFjdG9yLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gcHJlbXVsdGlwbGllZEFscGhhIC0gV2hldGhlciBwcmVtdWx0aXBsaWVkIGFscGhhIGlzIGVuYWJsZWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdHNldEJsZW5kaW5nKCBibGVuZGluZywgYmxlbmRFcXVhdGlvbiwgYmxlbmRTcmMsIGJsZW5kRHN0LCBibGVuZEVxdWF0aW9uQWxwaGEsIGJsZW5kU3JjQWxwaGEsIGJsZW5kRHN0QWxwaGEsIHByZW11bHRpcGxpZWRBbHBoYSApIHtcclxuXHJcblx0XHRjb25zdCB7IGdsIH0gPSB0aGlzO1xyXG5cclxuXHRcdGlmICggYmxlbmRpbmcgPT09IE5vQmxlbmRpbmcgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMuY3VycmVudEJsZW5kaW5nRW5hYmxlZCA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5kaXNhYmxlKCBnbC5CTEVORCApO1xyXG5cdFx0XHRcdHRoaXMuY3VycmVudEJsZW5kaW5nRW5hYmxlZCA9IGZhbHNlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMuY3VycmVudEJsZW5kaW5nRW5hYmxlZCA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmVuYWJsZSggZ2wuQkxFTkQgKTtcclxuXHRcdFx0dGhpcy5jdXJyZW50QmxlbmRpbmdFbmFibGVkID0gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBibGVuZGluZyAhPT0gQ3VzdG9tQmxlbmRpbmcgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGJsZW5kaW5nICE9PSB0aGlzLmN1cnJlbnRCbGVuZGluZyB8fCBwcmVtdWx0aXBsaWVkQWxwaGEgIT09IHRoaXMuY3VycmVudFByZW11bHRpcGxlZEFscGhhICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIHRoaXMuY3VycmVudEJsZW5kRXF1YXRpb24gIT09IEFkZEVxdWF0aW9uIHx8IHRoaXMuY3VycmVudEJsZW5kRXF1YXRpb25BbHBoYSAhPT0gQWRkRXF1YXRpb24gKSB7XHJcblxyXG5cdFx0XHRcdFx0Z2wuYmxlbmRFcXVhdGlvbiggZ2wuRlVOQ19BREQgKTtcclxuXHJcblx0XHRcdFx0XHR0aGlzLmN1cnJlbnRCbGVuZEVxdWF0aW9uID0gQWRkRXF1YXRpb247XHJcblx0XHRcdFx0XHR0aGlzLmN1cnJlbnRCbGVuZEVxdWF0aW9uQWxwaGEgPSBBZGRFcXVhdGlvbjtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoIHByZW11bHRpcGxpZWRBbHBoYSApIHtcclxuXHJcblx0XHRcdFx0XHRzd2l0Y2ggKCBibGVuZGluZyApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNhc2UgTm9ybWFsQmxlbmRpbmc6XHJcblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRGdW5jU2VwYXJhdGUoIGdsLk9ORSwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSwgZ2wuT05FLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBICk7XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0XHRjYXNlIEFkZGl0aXZlQmxlbmRpbmc6XHJcblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRGdW5jKCBnbC5PTkUsIGdsLk9ORSApO1xyXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdFx0Y2FzZSBTdWJ0cmFjdGl2ZUJsZW5kaW5nOlxyXG5cdFx0XHRcdFx0XHRcdGdsLmJsZW5kRnVuY1NlcGFyYXRlKCBnbC5aRVJPLCBnbC5PTkVfTUlOVVNfU1JDX0NPTE9SLCBnbC5aRVJPLCBnbC5PTkUgKTtcclxuXHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRcdGNhc2UgTXVsdGlwbHlCbGVuZGluZzpcclxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEZ1bmNTZXBhcmF0ZSggZ2wuWkVSTywgZ2wuU1JDX0NPTE9SLCBnbC5aRVJPLCBnbC5TUkNfQUxQSEEgKTtcclxuXHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMU3RhdGU6IEludmFsaWQgYmxlbmRpbmc6ICcsIGJsZW5kaW5nICk7XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdHN3aXRjaCAoIGJsZW5kaW5nICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y2FzZSBOb3JtYWxCbGVuZGluZzpcclxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEZ1bmNTZXBhcmF0ZSggZ2wuU1JDX0FMUEhBLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBLCBnbC5PTkUsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEgKTtcclxuXHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRcdGNhc2UgQWRkaXRpdmVCbGVuZGluZzpcclxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEZ1bmMoIGdsLlNSQ19BTFBIQSwgZ2wuT05FICk7XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0XHRjYXNlIFN1YnRyYWN0aXZlQmxlbmRpbmc6XHJcblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRGdW5jU2VwYXJhdGUoIGdsLlpFUk8sIGdsLk9ORV9NSU5VU19TUkNfQ09MT1IsIGdsLlpFUk8sIGdsLk9ORSApO1xyXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdFx0Y2FzZSBNdWx0aXBseUJsZW5kaW5nOlxyXG5cdFx0XHRcdFx0XHRcdGdsLmJsZW5kRnVuYyggZ2wuWkVSTywgZ2wuU1JDX0NPTE9SICk7XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFN0YXRlOiBJbnZhbGlkIGJsZW5kaW5nOiAnLCBibGVuZGluZyApO1xyXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR0aGlzLmN1cnJlbnRCbGVuZFNyYyA9IG51bGw7XHJcblx0XHRcdFx0dGhpcy5jdXJyZW50QmxlbmREc3QgPSBudWxsO1xyXG5cdFx0XHRcdHRoaXMuY3VycmVudEJsZW5kU3JjQWxwaGEgPSBudWxsO1xyXG5cdFx0XHRcdHRoaXMuY3VycmVudEJsZW5kRHN0QWxwaGEgPSBudWxsO1xyXG5cclxuXHRcdFx0XHR0aGlzLmN1cnJlbnRCbGVuZGluZyA9IGJsZW5kaW5nO1xyXG5cdFx0XHRcdHRoaXMuY3VycmVudFByZW11bHRpcGxlZEFscGhhID0gcHJlbXVsdGlwbGllZEFscGhhO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBjdXN0b20gYmxlbmRpbmdcclxuXHJcblx0XHRibGVuZEVxdWF0aW9uQWxwaGEgPSBibGVuZEVxdWF0aW9uQWxwaGEgfHwgYmxlbmRFcXVhdGlvbjtcclxuXHRcdGJsZW5kU3JjQWxwaGEgPSBibGVuZFNyY0FscGhhIHx8IGJsZW5kU3JjO1xyXG5cdFx0YmxlbmREc3RBbHBoYSA9IGJsZW5kRHN0QWxwaGEgfHwgYmxlbmREc3Q7XHJcblxyXG5cdFx0aWYgKCBibGVuZEVxdWF0aW9uICE9PSB0aGlzLmN1cnJlbnRCbGVuZEVxdWF0aW9uIHx8IGJsZW5kRXF1YXRpb25BbHBoYSAhPT0gdGhpcy5jdXJyZW50QmxlbmRFcXVhdGlvbkFscGhhICkge1xyXG5cclxuXHRcdFx0Z2wuYmxlbmRFcXVhdGlvblNlcGFyYXRlKCBlcXVhdGlvblRvR0xbIGJsZW5kRXF1YXRpb24gXSwgZXF1YXRpb25Ub0dMWyBibGVuZEVxdWF0aW9uQWxwaGEgXSApO1xyXG5cclxuXHRcdFx0dGhpcy5jdXJyZW50QmxlbmRFcXVhdGlvbiA9IGJsZW5kRXF1YXRpb247XHJcblx0XHRcdHRoaXMuY3VycmVudEJsZW5kRXF1YXRpb25BbHBoYSA9IGJsZW5kRXF1YXRpb25BbHBoYTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBibGVuZFNyYyAhPT0gdGhpcy5jdXJyZW50QmxlbmRTcmMgfHwgYmxlbmREc3QgIT09IHRoaXMuY3VycmVudEJsZW5kRHN0IHx8IGJsZW5kU3JjQWxwaGEgIT09IHRoaXMuY3VycmVudEJsZW5kU3JjQWxwaGEgfHwgYmxlbmREc3RBbHBoYSAhPT0gdGhpcy5jdXJyZW50QmxlbmREc3RBbHBoYSApIHtcclxuXHJcblx0XHRcdGdsLmJsZW5kRnVuY1NlcGFyYXRlKCBmYWN0b3JUb0dMWyBibGVuZFNyYyBdLCBmYWN0b3JUb0dMWyBibGVuZERzdCBdLCBmYWN0b3JUb0dMWyBibGVuZFNyY0FscGhhIF0sIGZhY3RvclRvR0xbIGJsZW5kRHN0QWxwaGEgXSApO1xyXG5cclxuXHRcdFx0dGhpcy5jdXJyZW50QmxlbmRTcmMgPSBibGVuZFNyYztcclxuXHRcdFx0dGhpcy5jdXJyZW50QmxlbmREc3QgPSBibGVuZERzdDtcclxuXHRcdFx0dGhpcy5jdXJyZW50QmxlbmRTcmNBbHBoYSA9IGJsZW5kU3JjQWxwaGE7XHJcblx0XHRcdHRoaXMuY3VycmVudEJsZW5kRHN0QWxwaGEgPSBibGVuZERzdEFscGhhO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmN1cnJlbnRCbGVuZGluZyA9IGJsZW5kaW5nO1xyXG5cdFx0dGhpcy5jdXJyZW50UHJlbXVsdGlwbGVkQWxwaGEgPSBmYWxzZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTcGVjaWZpZXMgd2hldGhlciBjb2xvcnMgY2FuIGJlIHdyaXR0ZW4gd2hlbiByZW5kZXJpbmdcclxuXHQgKiBpbnRvIGEgZnJhbWVidWZmZXIgb3Igbm90LlxyXG5cdCAqXHJcblx0ICogVGhpcyBtZXRob2QgY2FjaGVzIHRoZSBzdGF0ZSBzbyBgZ2wuY29sb3JNYXNrKClgIGlzIG9ubHlcclxuXHQgKiBjYWxsZWQgd2hlbiBuZWNlc3NhcnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IGNvbG9yTWFzayAtIFRoZSBjb2xvciBtYXNrLlxyXG5cdCAqL1xyXG5cdHNldENvbG9yTWFzayggY29sb3JNYXNrICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5jdXJyZW50Q29sb3JNYXNrICE9PSBjb2xvck1hc2sgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmdsLmNvbG9yTWFzayggY29sb3JNYXNrLCBjb2xvck1hc2ssIGNvbG9yTWFzaywgY29sb3JNYXNrICk7XHJcblx0XHRcdHRoaXMuY3VycmVudENvbG9yTWFzayA9IGNvbG9yTWFzaztcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGRlcHRoIHRlc3QgaXMgZW5hYmxlZCBvciBub3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IGRlcHRoVGVzdCAtIFdoZXRoZXIgdGhlIGRlcHRoIHRlc3QgaXMgZW5hYmxlZCBvciBub3QuXHJcblx0ICovXHJcblx0c2V0RGVwdGhUZXN0KCBkZXB0aFRlc3QgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBnbCB9ID0gdGhpcztcclxuXHJcblx0XHRpZiAoIGRlcHRoVGVzdCApIHtcclxuXHJcblx0XHRcdHRoaXMuZW5hYmxlKCBnbC5ERVBUSF9URVNUICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHRoaXMuZGlzYWJsZSggZ2wuREVQVEhfVEVTVCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTcGVjaWZpZXMgd2hldGhlciBkZXB0aCB2YWx1ZXMgY2FuIGJlIHdyaXR0ZW4gd2hlbiByZW5kZXJpbmdcclxuXHQgKiBpbnRvIGEgZnJhbWVidWZmZXIgb3Igbm90LlxyXG5cdCAqXHJcblx0ICogVGhpcyBtZXRob2QgY2FjaGVzIHRoZSBzdGF0ZSBzbyBgZ2wuZGVwdGhNYXNrKClgIGlzIG9ubHlcclxuXHQgKiBjYWxsZWQgd2hlbiBuZWNlc3NhcnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IGRlcHRoTWFzayAtIFRoZSBkZXB0aCBtYXNrLlxyXG5cdCAqL1xyXG5cdHNldERlcHRoTWFzayggZGVwdGhNYXNrICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5jdXJyZW50RGVwdGhNYXNrICE9PSBkZXB0aE1hc2sgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmdsLmRlcHRoTWFzayggZGVwdGhNYXNrICk7XHJcblx0XHRcdHRoaXMuY3VycmVudERlcHRoTWFzayA9IGRlcHRoTWFzaztcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3BlY2lmaWVzIHRoZSBkZXB0aCBjb21wYXJlIGZ1bmN0aW9uLlxyXG5cdCAqXHJcblx0ICogVGhpcyBtZXRob2QgY2FjaGVzIHRoZSBzdGF0ZSBzbyBgZ2wuZGVwdGhGdW5jKClgIGlzIG9ubHlcclxuXHQgKiBjYWxsZWQgd2hlbiBuZWNlc3NhcnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZGVwdGhGdW5jIC0gVGhlIGRlcHRoIGNvbXBhcmUgZnVuY3Rpb24uXHJcblx0ICovXHJcblx0c2V0RGVwdGhGdW5jKCBkZXB0aEZ1bmMgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmN1cnJlbnREZXB0aEZ1bmMgIT09IGRlcHRoRnVuYyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHsgZ2wgfSA9IHRoaXM7XHJcblxyXG5cdFx0XHRzd2l0Y2ggKCBkZXB0aEZ1bmMgKSB7XHJcblxyXG5cdFx0XHRcdGNhc2UgTmV2ZXJEZXB0aDpcclxuXHJcblx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIGdsLk5FVkVSICk7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0Y2FzZSBBbHdheXNEZXB0aDpcclxuXHJcblx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIGdsLkFMV0FZUyApO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdGNhc2UgTGVzc0RlcHRoOlxyXG5cclxuXHRcdFx0XHRcdGdsLmRlcHRoRnVuYyggZ2wuTEVTUyApO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdGNhc2UgTGVzc0VxdWFsRGVwdGg6XHJcblxyXG5cdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5MRVFVQUwgKTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRjYXNlIEVxdWFsRGVwdGg6XHJcblxyXG5cdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5FUVVBTCApO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdGNhc2UgR3JlYXRlckVxdWFsRGVwdGg6XHJcblxyXG5cdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5HRVFVQUwgKTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRjYXNlIEdyZWF0ZXJEZXB0aDpcclxuXHJcblx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIGdsLkdSRUFURVIgKTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRjYXNlIE5vdEVxdWFsRGVwdGg6XHJcblxyXG5cdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5OT1RFUVVBTCApO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdGRlZmF1bHQ6XHJcblxyXG5cdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5MRVFVQUwgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuY3VycmVudERlcHRoRnVuYyA9IGRlcHRoRnVuYztcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3BlY2lmaWVzIHRoZSBzY2lzc29yIGJveC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHZpZXdwb3J0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHZpZXdwb3J0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgdmlld3BvcnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIHZpZXdwb3J0LlxyXG5cdCAqXHJcblx0ICovXHJcblx0c2Npc3NvciggeCwgeSwgd2lkdGgsIGhlaWdodCApIHtcclxuXHJcblx0XHRjb25zdCBzY2lzc29yID0gdGhpcy5fdGVtcFZlYzQuc2V0KCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmN1cnJlbnRTY2lzc29yLmVxdWFscyggc2Npc3NvciApID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdGNvbnN0IHsgZ2wgfSA9IHRoaXM7XHJcblxyXG5cdFx0XHRnbC5zY2lzc29yKCBzY2lzc29yLngsIHNjaXNzb3IueSwgc2Npc3Nvci56LCBzY2lzc29yLncgKTtcclxuXHRcdFx0dGhpcy5jdXJyZW50U2Npc3Nvci5jb3B5KCBzY2lzc29yICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNwZWNpZmllcyB0aGUgdmlld3BvcnQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSB2aWV3cG9ydC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSB2aWV3cG9ydC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIHZpZXdwb3J0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSB2aWV3cG9ydC5cclxuXHQgKlxyXG5cdCAqL1xyXG5cdHZpZXdwb3J0KCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICkge1xyXG5cclxuXHRcdGNvbnN0IHZpZXdwb3J0ID0gdGhpcy5fdGVtcFZlYzQuc2V0KCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmN1cnJlbnRWaWV3cG9ydC5lcXVhbHMoIHZpZXdwb3J0ICkgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0Y29uc3QgeyBnbCB9ID0gdGhpcztcclxuXHJcblx0XHRcdGdsLnZpZXdwb3J0KCB2aWV3cG9ydC54LCB2aWV3cG9ydC55LCB2aWV3cG9ydC56LCB2aWV3cG9ydC53ICk7XHJcblx0XHRcdHRoaXMuY3VycmVudFZpZXdwb3J0LmNvcHkoIHZpZXdwb3J0ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgdGhlIHNjaXNzb3IgdGVzdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gYm9vbGVhbiAtIFdoZXRoZXIgdGhlIHNjaXNzb3IgdGVzdCBzaG91bGQgYmUgZW5hYmxlZCBvciBub3QuXHJcblx0ICovXHJcblx0c2V0U2Npc3NvclRlc3QoIGJvb2xlYW4gKSB7XHJcblxyXG5cdFx0Y29uc3QgZ2wgPSB0aGlzLmdsO1xyXG5cclxuXHRcdGlmICggYm9vbGVhbiApIHtcclxuXHJcblx0XHRcdGdsLmVuYWJsZSggZ2wuU0NJU1NPUl9URVNUICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGdsLmRpc2FibGUoIGdsLlNDSVNTT1JfVEVTVCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgc3RlbmNpbCB0ZXN0IGlzIGVuYWJsZWQgb3Igbm90LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBzdGVuY2lsVGVzdCAtIFdoZXRoZXIgdGhlIHN0ZW5jaWwgdGVzdCBpcyBlbmFibGVkIG9yIG5vdC5cclxuXHQgKi9cclxuXHRzZXRTdGVuY2lsVGVzdCggc3RlbmNpbFRlc3QgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBnbCB9ID0gdGhpcztcclxuXHJcblx0XHRpZiAoIHN0ZW5jaWxUZXN0ICkge1xyXG5cclxuXHRcdFx0dGhpcy5lbmFibGUoIGdsLlNURU5DSUxfVEVTVCApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR0aGlzLmRpc2FibGUoIGdsLlNURU5DSUxfVEVTVCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTcGVjaWZpZXMgd2hldGhlciBzdGVuY2lsIHZhbHVlcyBjYW4gYmUgd3JpdHRlbiB3aGVuIHJlbmRlcmluZ1xyXG5cdCAqIGludG8gYSBmcmFtZWJ1ZmZlciBvciBub3QuXHJcblx0ICpcclxuXHQgKiBUaGlzIG1ldGhvZCBjYWNoZXMgdGhlIHN0YXRlIHNvIGBnbC5zdGVuY2lsTWFzaygpYCBpcyBvbmx5XHJcblx0ICogY2FsbGVkIHdoZW4gbmVjZXNzYXJ5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBzdGVuY2lsTWFzayAtIFRoZSBzdGVuY2lsIG1hc2suXHJcblx0ICovXHJcblx0c2V0U3RlbmNpbE1hc2soIHN0ZW5jaWxNYXNrICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5jdXJyZW50U3RlbmNpbE1hc2sgIT09IHN0ZW5jaWxNYXNrICkge1xyXG5cclxuXHRcdFx0dGhpcy5nbC5zdGVuY2lsTWFzayggc3RlbmNpbE1hc2sgKTtcclxuXHRcdFx0dGhpcy5jdXJyZW50U3RlbmNpbE1hc2sgPSBzdGVuY2lsTWFzaztcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHN0ZW5jaWwgdGVzdCBmdW5jdGlvbnMuXHJcblx0ICpcclxuXHQgKiBUaGlzIG1ldGhvZCBjYWNoZXMgdGhlIHN0YXRlIHNvIGBnbC5zdGVuY2lsRnVuYygpYCBpcyBvbmx5XHJcblx0ICogY2FsbGVkIHdoZW4gbmVjZXNzYXJ5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHN0ZW5jaWxGdW5jIC0gVGhlIHN0ZW5jaWwgY29tcGFyZSBmdW5jdGlvbi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc3RlbmNpbFJlZiAtIFRoZSByZWZlcmVuY2UgdmFsdWUgZm9yIHRoZSBzdGVuY2lsIHRlc3QuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHN0ZW5jaWxNYXNrIC0gQSBiaXQtd2lzZSBtYXNrIHRoYXQgaXMgdXNlZCB0byBBTkQgdGhlIHJlZmVyZW5jZSB2YWx1ZSBhbmQgdGhlIHN0b3JlZCBzdGVuY2lsIHZhbHVlIHdoZW4gdGhlIHRlc3QgaXMgZG9uZS5cclxuXHQgKi9cclxuXHRzZXRTdGVuY2lsRnVuYyggc3RlbmNpbEZ1bmMsIHN0ZW5jaWxSZWYsIHN0ZW5jaWxNYXNrICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5jdXJyZW50U3RlbmNpbEZ1bmMgIT09IHN0ZW5jaWxGdW5jIHx8XHJcblx0XHRcdCB0aGlzLmN1cnJlbnRTdGVuY2lsUmVmICE9PSBzdGVuY2lsUmVmIHx8XHJcblx0XHRcdCB0aGlzLmN1cnJlbnRTdGVuY2lsRnVuY01hc2sgIT09IHN0ZW5jaWxNYXNrICkge1xyXG5cclxuXHRcdFx0dGhpcy5nbC5zdGVuY2lsRnVuYyggc3RlbmNpbEZ1bmMsIHN0ZW5jaWxSZWYsIHN0ZW5jaWxNYXNrICk7XHJcblxyXG5cdFx0XHR0aGlzLmN1cnJlbnRTdGVuY2lsRnVuYyA9IHN0ZW5jaWxGdW5jO1xyXG5cdFx0XHR0aGlzLmN1cnJlbnRTdGVuY2lsUmVmID0gc3RlbmNpbFJlZjtcclxuXHRcdFx0dGhpcy5jdXJyZW50U3RlbmNpbEZ1bmNNYXNrID0gc3RlbmNpbE1hc2s7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBzdGVuY2lsIHRlc3Qgb3BlcmF0aW9uLlxyXG5cdCAqXHJcblx0ICogVGhpcyBtZXRob2QgY2FjaGVzIHRoZSBzdGF0ZSBzbyBgZ2wuc3RlbmNpbE9wKClgIGlzIG9ubHlcclxuXHQgKiBjYWxsZWQgd2hlbiBuZWNlc3NhcnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc3RlbmNpbEZhaWwgLSBUaGUgZnVuY3Rpb24gdG8gdXNlIHdoZW4gdGhlIHN0ZW5jaWwgdGVzdCBmYWlscy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc3RlbmNpbFpGYWlsIC0gVGhlIGZ1bmN0aW9uIHRvIHVzZSB3aGVuIHRoZSBzdGVuY2lsIHRlc3QgcGFzc2VzLCBidXQgdGhlIGRlcHRoIHRlc3QgZmFpbC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc3RlbmNpbFpQYXNzIC0gVGhlIGZ1bmN0aW9uIHRvIHVzZSB3aGVuIGJvdGggdGhlIHN0ZW5jaWwgdGVzdCBhbmQgdGhlIGRlcHRoIHRlc3QgcGFzcyxcclxuXHQgKiBvciB3aGVuIHRoZSBzdGVuY2lsIHRlc3QgcGFzc2VzIGFuZCB0aGVyZSBpcyBubyBkZXB0aCBidWZmZXIgb3IgZGVwdGggdGVzdGluZyBpcyBkaXNhYmxlZC5cclxuXHQgKi9cclxuXHRzZXRTdGVuY2lsT3AoIHN0ZW5jaWxGYWlsLCBzdGVuY2lsWkZhaWwsIHN0ZW5jaWxaUGFzcyApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuY3VycmVudFN0ZW5jaWxGYWlsICE9PSBzdGVuY2lsRmFpbCB8fFxyXG5cdFx0XHQgdGhpcy5jdXJyZW50U3RlbmNpbFpGYWlsICE9PSBzdGVuY2lsWkZhaWwgfHxcclxuXHRcdFx0IHRoaXMuY3VycmVudFN0ZW5jaWxaUGFzcyAhPT0gc3RlbmNpbFpQYXNzICkge1xyXG5cclxuXHRcdFx0dGhpcy5nbC5zdGVuY2lsT3AoIHN0ZW5jaWxGYWlsLCBzdGVuY2lsWkZhaWwsIHN0ZW5jaWxaUGFzcyApO1xyXG5cclxuXHRcdFx0dGhpcy5jdXJyZW50U3RlbmNpbEZhaWwgPSBzdGVuY2lsRmFpbDtcclxuXHRcdFx0dGhpcy5jdXJyZW50U3RlbmNpbFpGYWlsID0gc3RlbmNpbFpGYWlsO1xyXG5cdFx0XHR0aGlzLmN1cnJlbnRTdGVuY2lsWlBhc3MgPSBzdGVuY2lsWlBhc3M7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbmZpZ3VyZXMgdGhlIFdlYkdMIHN0YXRlIGZvciB0aGUgZ2l2ZW4gbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdGVyaWFsfSBtYXRlcmlhbCAtIFRoZSBtYXRlcmlhbCB0byBjb25maWd1cmUgdGhlIHN0YXRlIGZvci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZnJvbnRGYWNlQ1cgLSBXaGV0aGVyIHRoZSBmcm9udCBmYWNlcyBhcmUgY291bnRlci1jbG9ja3dpc2Ugb3Igbm90LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBoYXJkd2FyZUNsaXBwaW5nUGxhbmVzIC0gVGhlIG51bWJlciBvZiBoYXJkd2FyZSBjbGlwcGluZyBwbGFuZXMuXHJcblx0ICovXHJcblx0c2V0TWF0ZXJpYWwoIG1hdGVyaWFsLCBmcm9udEZhY2VDVywgaGFyZHdhcmVDbGlwcGluZ1BsYW5lcyApIHtcclxuXHJcblx0XHRjb25zdCB7IGdsIH0gPSB0aGlzO1xyXG5cclxuXHRcdG1hdGVyaWFsLnNpZGUgPT09IERvdWJsZVNpZGVcclxuXHRcdFx0PyB0aGlzLmRpc2FibGUoIGdsLkNVTExfRkFDRSApXHJcblx0XHRcdDogdGhpcy5lbmFibGUoIGdsLkNVTExfRkFDRSApO1xyXG5cclxuXHRcdGxldCBmbGlwU2lkZWQgPSAoIG1hdGVyaWFsLnNpZGUgPT09IEJhY2tTaWRlICk7XHJcblx0XHRpZiAoIGZyb250RmFjZUNXICkgZmxpcFNpZGVkID0gISBmbGlwU2lkZWQ7XHJcblxyXG5cdFx0dGhpcy5zZXRGbGlwU2lkZWQoIGZsaXBTaWRlZCApO1xyXG5cclxuXHRcdCggbWF0ZXJpYWwuYmxlbmRpbmcgPT09IE5vcm1hbEJsZW5kaW5nICYmIG1hdGVyaWFsLnRyYW5zcGFyZW50ID09PSBmYWxzZSApXHJcblx0XHRcdD8gdGhpcy5zZXRCbGVuZGluZyggTm9CbGVuZGluZyApXHJcblx0XHRcdDogdGhpcy5zZXRCbGVuZGluZyggbWF0ZXJpYWwuYmxlbmRpbmcsIG1hdGVyaWFsLmJsZW5kRXF1YXRpb24sIG1hdGVyaWFsLmJsZW5kU3JjLCBtYXRlcmlhbC5ibGVuZERzdCwgbWF0ZXJpYWwuYmxlbmRFcXVhdGlvbkFscGhhLCBtYXRlcmlhbC5ibGVuZFNyY0FscGhhLCBtYXRlcmlhbC5ibGVuZERzdEFscGhhLCBtYXRlcmlhbC5wcmVtdWx0aXBsaWVkQWxwaGEgKTtcclxuXHJcblx0XHR0aGlzLnNldERlcHRoRnVuYyggbWF0ZXJpYWwuZGVwdGhGdW5jICk7XHJcblx0XHR0aGlzLnNldERlcHRoVGVzdCggbWF0ZXJpYWwuZGVwdGhUZXN0ICk7XHJcblx0XHR0aGlzLnNldERlcHRoTWFzayggbWF0ZXJpYWwuZGVwdGhXcml0ZSApO1xyXG5cdFx0dGhpcy5zZXRDb2xvck1hc2soIG1hdGVyaWFsLmNvbG9yV3JpdGUgKTtcclxuXHJcblx0XHRjb25zdCBzdGVuY2lsV3JpdGUgPSBtYXRlcmlhbC5zdGVuY2lsV3JpdGU7XHJcblx0XHR0aGlzLnNldFN0ZW5jaWxUZXN0KCBzdGVuY2lsV3JpdGUgKTtcclxuXHRcdGlmICggc3RlbmNpbFdyaXRlICkge1xyXG5cclxuXHRcdFx0dGhpcy5zZXRTdGVuY2lsTWFzayggbWF0ZXJpYWwuc3RlbmNpbFdyaXRlTWFzayApO1xyXG5cdFx0XHR0aGlzLnNldFN0ZW5jaWxGdW5jKCBtYXRlcmlhbC5zdGVuY2lsRnVuYywgbWF0ZXJpYWwuc3RlbmNpbFJlZiwgbWF0ZXJpYWwuc3RlbmNpbEZ1bmNNYXNrICk7XHJcblx0XHRcdHRoaXMuc2V0U3RlbmNpbE9wKCBtYXRlcmlhbC5zdGVuY2lsRmFpbCwgbWF0ZXJpYWwuc3RlbmNpbFpGYWlsLCBtYXRlcmlhbC5zdGVuY2lsWlBhc3MgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5zZXRQb2x5Z29uT2Zmc2V0KCBtYXRlcmlhbC5wb2x5Z29uT2Zmc2V0LCBtYXRlcmlhbC5wb2x5Z29uT2Zmc2V0RmFjdG9yLCBtYXRlcmlhbC5wb2x5Z29uT2Zmc2V0VW5pdHMgKTtcclxuXHJcblx0XHRtYXRlcmlhbC5hbHBoYVRvQ292ZXJhZ2UgPT09IHRydWUgJiYgdGhpcy5iYWNrZW5kLnJlbmRlcmVyLnNhbXBsZXMgPiAxXHJcblx0XHRcdD8gdGhpcy5lbmFibGUoIGdsLlNBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSApXHJcblx0XHRcdDogdGhpcy5kaXNhYmxlKCBnbC5TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UgKTtcclxuXHJcblx0XHRpZiAoIGhhcmR3YXJlQ2xpcHBpbmdQbGFuZXMgPiAwICkge1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLmN1cnJlbnRDbGlwcGluZ1BsYW5lcyAhPT0gaGFyZHdhcmVDbGlwcGluZ1BsYW5lcyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgQ0xJUF9ESVNUQU5DRTBfV0VCR0wgPSAweDMwMDA7XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBpIDwgaGFyZHdhcmVDbGlwcGluZ1BsYW5lcyApIHtcclxuXHJcblx0XHRcdFx0XHRcdHRoaXMuZW5hYmxlKCBDTElQX0RJU1RBTkNFMF9XRUJHTCArIGkgKTtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0dGhpcy5kaXNhYmxlKCBDTElQX0RJU1RBTkNFMF9XRUJHTCArIGkgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3BlY2lmaWVzIHRoZSBwb2x5Z29uIG9mZnNldC5cclxuXHQgKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGNhY2hlcyB0aGUgc3RhdGUgc28gYGdsLnBvbHlnb25PZmZzZXQoKWAgaXMgb25seVxyXG5cdCAqIGNhbGxlZCB3aGVuIG5lY2Vzc2FyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gcG9seWdvbk9mZnNldCAtIFdoZXRoZXIgcG9seWdvbiBvZmZzZXQgaXMgZW5hYmxlZCBvciBub3QuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGZhY3RvciAtIFRoZSBzY2FsZSBmYWN0b3IgZm9yIHRoZSB2YXJpYWJsZSBkZXB0aCBvZmZzZXQgZm9yIGVhY2ggcG9seWdvbi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdW5pdHMgLSBUaGUgbXVsdGlwbGllciBieSB3aGljaCBhbiBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyB2YWx1ZSBpcyBtdWx0aXBsaWVkIHdpdGggdG8gY3JlYXRlIGEgY29uc3RhbnQgZGVwdGggb2Zmc2V0LlxyXG5cdCAqL1xyXG5cdHNldFBvbHlnb25PZmZzZXQoIHBvbHlnb25PZmZzZXQsIGZhY3RvciwgdW5pdHMgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBnbCB9ID0gdGhpcztcclxuXHJcblx0XHRpZiAoIHBvbHlnb25PZmZzZXQgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmVuYWJsZSggZ2wuUE9MWUdPTl9PRkZTRVRfRklMTCApO1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLmN1cnJlbnRQb2x5Z29uT2Zmc2V0RmFjdG9yICE9PSBmYWN0b3IgfHwgdGhpcy5jdXJyZW50UG9seWdvbk9mZnNldFVuaXRzICE9PSB1bml0cyApIHtcclxuXHJcblx0XHRcdFx0Z2wucG9seWdvbk9mZnNldCggZmFjdG9yLCB1bml0cyApO1xyXG5cclxuXHRcdFx0XHR0aGlzLmN1cnJlbnRQb2x5Z29uT2Zmc2V0RmFjdG9yID0gZmFjdG9yO1xyXG5cdFx0XHRcdHRoaXMuY3VycmVudFBvbHlnb25PZmZzZXRVbml0cyA9IHVuaXRzO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR0aGlzLmRpc2FibGUoIGdsLlBPTFlHT05fT0ZGU0VUX0ZJTEwgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVmaW5lcyB0aGUgdXNhZ2Ugb2YgdGhlIGdpdmVuIFdlYkdMIHByb2dyYW0uXHJcblx0ICpcclxuXHQgKiBUaGlzIG1ldGhvZCBjYWNoZXMgdGhlIHN0YXRlIHNvIGBnbC51c2VQcm9ncmFtKClgIGlzIG9ubHlcclxuXHQgKiBjYWxsZWQgd2hlbiBuZWNlc3NhcnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMUHJvZ3JhbX0gcHJvZ3JhbSAtIFRoZSBXZWJHTCBwcm9ncmFtIHRvIHVzZS5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIGEgcHJvZ3JhbSBjaGFuZ2UgaGFzIGJlZW4gZXhlY3V0ZWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdHVzZVByb2dyYW0oIHByb2dyYW0gKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmN1cnJlbnRQcm9ncmFtICE9PSBwcm9ncmFtICkge1xyXG5cclxuXHRcdFx0dGhpcy5nbC51c2VQcm9ncmFtKCBwcm9ncmFtICk7XHJcblxyXG5cdFx0XHR0aGlzLmN1cnJlbnRQcm9ncmFtID0gcHJvZ3JhbTtcclxuXHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZmFsc2U7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdmVydGV4IHN0YXRlIGJ5IGJpbmRpbmcgdGhlIGdpdmVuIFZBTyBhbmQgZWxlbWVudCBidWZmZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMVmVydGV4QXJyYXlPYmplY3R9IHZhbyAtIFRoZSBWQU8uXHJcblx0ICogQHBhcmFtIHtXZWJHTEJ1ZmZlcn0gaW5kZXhCdWZmZXIgLSBUaGUgaW5kZXggYnVmZmVyLlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgYSB2ZXJ0ZXggc3RhdGUgaGFzIGJlZW4gY2hhbmdlZCBvciBub3QuXHJcblx0ICovXHJcblx0c2V0VmVydGV4U3RhdGUoIHZhbywgaW5kZXhCdWZmZXIgPSBudWxsICkge1xyXG5cclxuXHRcdGNvbnN0IGdsID0gdGhpcy5nbDtcclxuXHJcblx0XHRpZiAoIHRoaXMuY3VycmVudFZBTyAhPT0gdmFvIHx8IHRoaXMuY3VycmVudEluZGV4ICE9PSBpbmRleEJ1ZmZlciApIHtcclxuXHJcblx0XHRcdGdsLmJpbmRWZXJ0ZXhBcnJheSggdmFvICk7XHJcblxyXG5cdFx0XHRpZiAoIGluZGV4QnVmZmVyICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRnbC5iaW5kQnVmZmVyKCBnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgaW5kZXhCdWZmZXIgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuY3VycmVudFZBTyA9IHZhbztcclxuXHRcdFx0dGhpcy5jdXJyZW50SW5kZXggPSBpbmRleEJ1ZmZlcjtcclxuXHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZmFsc2U7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVzZXRzIHRoZSB2ZXJ0ZXggYXJyYXkgc3RhdGUgYnkgcmVzZXR0aW5nIHRoZSBWQU8gYW5kIGVsZW1lbnQgYnVmZmVyLlxyXG5cdCAqL1xyXG5cdHJlc2V0VmVydGV4U3RhdGUoKSB7XHJcblxyXG5cdFx0Y29uc3QgZ2wgPSB0aGlzLmdsO1xyXG5cclxuXHRcdGdsLmJpbmRWZXJ0ZXhBcnJheSggbnVsbCApO1xyXG5cdFx0Z2wuYmluZEJ1ZmZlciggZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIG51bGwgKTtcclxuXHJcblx0XHR0aGlzLmN1cnJlbnRWQU8gPSBudWxsO1xyXG5cdFx0dGhpcy5jdXJyZW50SW5kZXggPSBudWxsO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vIGZyYW1lYnVmZmVyXHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBCaW5kcyB0aGUgZ2l2ZW4gZnJhbWVidWZmZXIuXHJcblx0ICpcclxuXHQgKiBUaGlzIG1ldGhvZCBjYWNoZXMgdGhlIHN0YXRlIHNvIGBnbC5iaW5kRnJhbWVidWZmZXIoKWAgaXMgb25seVxyXG5cdCAqIGNhbGxlZCB3aGVuIG5lY2Vzc2FyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0YXJnZXQgLSBUaGUgYmluZGluZyBwb2ludCAodGFyZ2V0KS5cclxuXHQgKiBAcGFyYW0ge1dlYkdMRnJhbWVidWZmZXJ9IGZyYW1lYnVmZmVyIC0gVGhlIFdlYkdMIGZyYW1lYnVmZmVyIHRvIGJpbmQuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciBhIGJpbmQgaGFzIGJlZW4gZXhlY3V0ZWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGJpbmRGcmFtZWJ1ZmZlciggdGFyZ2V0LCBmcmFtZWJ1ZmZlciApIHtcclxuXHJcblx0XHRjb25zdCB7IGdsLCBjdXJyZW50Qm91bmRGcmFtZWJ1ZmZlcnMgfSA9IHRoaXM7XHJcblxyXG5cdFx0aWYgKCBjdXJyZW50Qm91bmRGcmFtZWJ1ZmZlcnNbIHRhcmdldCBdICE9PSBmcmFtZWJ1ZmZlciApIHtcclxuXHJcblx0XHRcdGdsLmJpbmRGcmFtZWJ1ZmZlciggdGFyZ2V0LCBmcmFtZWJ1ZmZlciApO1xyXG5cclxuXHRcdFx0Y3VycmVudEJvdW5kRnJhbWVidWZmZXJzWyB0YXJnZXQgXSA9IGZyYW1lYnVmZmVyO1xyXG5cclxuXHRcdFx0Ly8gZ2wuRFJBV19GUkFNRUJVRkZFUiBpcyBlcXVpdmFsZW50IHRvIGdsLkZSQU1FQlVGRkVSXHJcblxyXG5cdFx0XHRpZiAoIHRhcmdldCA9PT0gZ2wuRFJBV19GUkFNRUJVRkZFUiApIHtcclxuXHJcblx0XHRcdFx0Y3VycmVudEJvdW5kRnJhbWVidWZmZXJzWyBnbC5GUkFNRUJVRkZFUiBdID0gZnJhbWVidWZmZXI7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHRhcmdldCA9PT0gZ2wuRlJBTUVCVUZGRVIgKSB7XHJcblxyXG5cdFx0XHRcdGN1cnJlbnRCb3VuZEZyYW1lYnVmZmVyc1sgZ2wuRFJBV19GUkFNRUJVRkZFUiBdID0gZnJhbWVidWZmZXI7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGZhbHNlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgZHJhdyBidWZmZXJzIHRvIHdoaWNoIGZyYWdtZW50IGNvbG9ycyBhcmUgd3JpdHRlbiBpbnRvLlxyXG5cdCAqIENvbmZpZ3VyZXMgdGhlIE1SVCBzZXR1cCBvZiBjdXN0b20gZnJhbWVidWZmZXJzLlxyXG5cdCAqXHJcblx0ICogVGhpcyBtZXRob2QgY2FjaGVzIHRoZSBzdGF0ZSBzbyBgZ2wuZHJhd0J1ZmZlcnMoKWAgaXMgb25seVxyXG5cdCAqIGNhbGxlZCB3aGVuIG5lY2Vzc2FyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyQ29udGV4dH0gcmVuZGVyQ29udGV4dCAtIFRoZSByZW5kZXIgY29udGV4dC5cclxuXHQgKiBAcGFyYW0ge1dlYkdMRnJhbWVidWZmZXJ9IGZyYW1lYnVmZmVyIC0gVGhlIFdlYkdMIGZyYW1lYnVmZmVyLlxyXG5cdCAqL1xyXG5cdGRyYXdCdWZmZXJzKCByZW5kZXJDb250ZXh0LCBmcmFtZWJ1ZmZlciApIHtcclxuXHJcblx0XHRjb25zdCB7IGdsIH0gPSB0aGlzO1xyXG5cclxuXHRcdGxldCBkcmF3QnVmZmVycyA9IFtdO1xyXG5cclxuXHRcdGxldCBuZWVkc1VwZGF0ZSA9IGZhbHNlO1xyXG5cclxuXHRcdGlmICggcmVuZGVyQ29udGV4dC50ZXh0dXJlcyAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGRyYXdCdWZmZXJzID0gdGhpcy5jdXJyZW50RHJhd2J1ZmZlcnMuZ2V0KCBmcmFtZWJ1ZmZlciApO1xyXG5cclxuXHRcdFx0aWYgKCBkcmF3QnVmZmVycyA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRkcmF3QnVmZmVycyA9IFtdO1xyXG5cdFx0XHRcdHRoaXMuY3VycmVudERyYXdidWZmZXJzLnNldCggZnJhbWVidWZmZXIsIGRyYXdCdWZmZXJzICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cclxuXHRcdFx0Y29uc3QgdGV4dHVyZXMgPSByZW5kZXJDb250ZXh0LnRleHR1cmVzO1xyXG5cclxuXHRcdFx0aWYgKCBkcmF3QnVmZmVycy5sZW5ndGggIT09IHRleHR1cmVzLmxlbmd0aCB8fCBkcmF3QnVmZmVyc1sgMCBdICE9PSBnbC5DT0xPUl9BVFRBQ0hNRU5UMCApIHtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IHRleHR1cmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdGRyYXdCdWZmZXJzWyBpIF0gPSBnbC5DT0xPUl9BVFRBQ0hNRU5UMCArIGk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0ZHJhd0J1ZmZlcnMubGVuZ3RoID0gdGV4dHVyZXMubGVuZ3RoO1xyXG5cclxuXHRcdFx0XHRuZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRpZiAoIGRyYXdCdWZmZXJzWyAwIF0gIT09IGdsLkJBQ0sgKSB7XHJcblxyXG5cdFx0XHRcdGRyYXdCdWZmZXJzWyAwIF0gPSBnbC5CQUNLO1xyXG5cclxuXHRcdFx0XHRuZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggbmVlZHNVcGRhdGUgKSB7XHJcblxyXG5cdFx0XHRnbC5kcmF3QnVmZmVycyggZHJhd0J1ZmZlcnMgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblxyXG5cdC8vIHRleHR1cmVcclxuXHJcblx0LyoqXHJcblx0ICogTWFrZXMgdGhlIGdpdmVuIHRleHR1cmUgdW5pdCBhY3RpdmUuXHJcblx0ICpcclxuXHQgKiBUaGlzIG1ldGhvZCBjYWNoZXMgdGhlIHN0YXRlIHNvIGBnbC5hY3RpdmVUZXh0dXJlKClgIGlzIG9ubHlcclxuXHQgKiBjYWxsZWQgd2hlbiBuZWNlc3NhcnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gd2ViZ2xTbG90IC0gVGhlIHRleHR1cmUgdW5pdCB0byBtYWtlIGFjdGl2ZS5cclxuXHQgKi9cclxuXHRhY3RpdmVUZXh0dXJlKCB3ZWJnbFNsb3QgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBnbCwgY3VycmVudFRleHR1cmVTbG90LCBtYXhUZXh0dXJlcyB9ID0gdGhpcztcclxuXHJcblx0XHRpZiAoIHdlYmdsU2xvdCA9PT0gdW5kZWZpbmVkICkgd2ViZ2xTbG90ID0gZ2wuVEVYVFVSRTAgKyBtYXhUZXh0dXJlcyAtIDE7XHJcblxyXG5cdFx0aWYgKCBjdXJyZW50VGV4dHVyZVNsb3QgIT09IHdlYmdsU2xvdCApIHtcclxuXHJcblx0XHRcdGdsLmFjdGl2ZVRleHR1cmUoIHdlYmdsU2xvdCApO1xyXG5cdFx0XHR0aGlzLmN1cnJlbnRUZXh0dXJlU2xvdCA9IHdlYmdsU2xvdDtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQmluZHMgdGhlIGdpdmVuIFdlYkdMIHRleHR1cmUgdG8gYSB0YXJnZXQuXHJcblx0ICpcclxuXHQgKiBUaGlzIG1ldGhvZCBjYWNoZXMgdGhlIHN0YXRlIHNvIGBnbC5iaW5kVGV4dHVyZSgpYCBpcyBvbmx5XHJcblx0ICogY2FsbGVkIHdoZW4gbmVjZXNzYXJ5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHdlYmdsVHlwZSAtIFRoZSBiaW5kaW5nIHBvaW50ICh0YXJnZXQpLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xUZXh0dXJlfSB3ZWJnbFRleHR1cmUgLSBUaGUgV2ViR0wgdGV4dHVyZSB0byBiaW5kLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB3ZWJnbFNsb3QgLSBUaGUgdGV4dHVyZS5cclxuXHQgKi9cclxuXHRiaW5kVGV4dHVyZSggd2ViZ2xUeXBlLCB3ZWJnbFRleHR1cmUsIHdlYmdsU2xvdCApIHtcclxuXHJcblx0XHRjb25zdCB7IGdsLCBjdXJyZW50VGV4dHVyZVNsb3QsIGN1cnJlbnRCb3VuZFRleHR1cmVzLCBtYXhUZXh0dXJlcyB9ID0gdGhpcztcclxuXHJcblx0XHRpZiAoIHdlYmdsU2xvdCA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0aWYgKCBjdXJyZW50VGV4dHVyZVNsb3QgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdHdlYmdsU2xvdCA9IGdsLlRFWFRVUkUwICsgbWF4VGV4dHVyZXMgLSAxO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0d2ViZ2xTbG90ID0gY3VycmVudFRleHR1cmVTbG90O1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRsZXQgYm91bmRUZXh0dXJlID0gY3VycmVudEJvdW5kVGV4dHVyZXNbIHdlYmdsU2xvdCBdO1xyXG5cclxuXHRcdGlmICggYm91bmRUZXh0dXJlID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRib3VuZFRleHR1cmUgPSB7IHR5cGU6IHVuZGVmaW5lZCwgdGV4dHVyZTogdW5kZWZpbmVkIH07XHJcblx0XHRcdGN1cnJlbnRCb3VuZFRleHR1cmVzWyB3ZWJnbFNsb3QgXSA9IGJvdW5kVGV4dHVyZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBib3VuZFRleHR1cmUudHlwZSAhPT0gd2ViZ2xUeXBlIHx8IGJvdW5kVGV4dHVyZS50ZXh0dXJlICE9PSB3ZWJnbFRleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGN1cnJlbnRUZXh0dXJlU2xvdCAhPT0gd2ViZ2xTbG90ICkge1xyXG5cclxuXHRcdFx0XHRnbC5hY3RpdmVUZXh0dXJlKCB3ZWJnbFNsb3QgKTtcclxuXHRcdFx0XHR0aGlzLmN1cnJlbnRUZXh0dXJlU2xvdCA9IHdlYmdsU2xvdDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGdsLmJpbmRUZXh0dXJlKCB3ZWJnbFR5cGUsIHdlYmdsVGV4dHVyZSApO1xyXG5cclxuXHRcdFx0Ym91bmRUZXh0dXJlLnR5cGUgPSB3ZWJnbFR5cGU7XHJcblx0XHRcdGJvdW5kVGV4dHVyZS50ZXh0dXJlID0gd2ViZ2xUZXh0dXJlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBCaW5kcyBhIGdpdmVuIFdlYkdMIGJ1ZmZlciB0byBhIGdpdmVuIGJpbmRpbmcgcG9pbnQgKHRhcmdldCkgYXQgYSBnaXZlbiBpbmRleC5cclxuXHQgKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGNhY2hlcyB0aGUgc3RhdGUgc28gYGdsLmJpbmRCdWZmZXJCYXNlKClgIGlzIG9ubHlcclxuXHQgKiBjYWxsZWQgd2hlbiBuZWNlc3NhcnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdGFyZ2V0IC0gVGhlIHRhcmdldCBmb3IgdGhlIGJpbmQgb3BlcmF0aW9uLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgdGFyZ2V0LlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xCdWZmZXJ9IGJ1ZmZlciAtIFRoZSBXZWJHTCBidWZmZXIuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciBhIGJpbmQgaGFzIGJlZW4gZXhlY3V0ZWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGJpbmRCdWZmZXJCYXNlKCB0YXJnZXQsIGluZGV4LCBidWZmZXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBnbCB9ID0gdGhpcztcclxuXHJcblx0XHRjb25zdCBrZXkgPSBgJHt0YXJnZXR9LSR7aW5kZXh9YDtcclxuXHJcblx0XHRpZiAoIHRoaXMuY3VycmVudEJvdW5kQnVmZmVyQmFzZXNbIGtleSBdICE9PSBidWZmZXIgKSB7XHJcblxyXG5cdFx0XHRnbC5iaW5kQnVmZmVyQmFzZSggdGFyZ2V0LCBpbmRleCwgYnVmZmVyICk7XHJcblx0XHRcdHRoaXMuY3VycmVudEJvdW5kQnVmZmVyQmFzZXNbIGtleSBdID0gYnVmZmVyO1xyXG5cclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBmYWxzZTtcclxuXHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogVW5iaW5kcyB0aGUgY3VycmVudCBib3VuZCB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogVGhpcyBtZXRob2QgY2FjaGVzIHRoZSBzdGF0ZSBzbyBgZ2wuYmluZFRleHR1cmUoKWAgaXMgb25seVxyXG5cdCAqIGNhbGxlZCB3aGVuIG5lY2Vzc2FyeS5cclxuXHQgKi9cclxuXHR1bmJpbmRUZXh0dXJlKCkge1xyXG5cclxuXHRcdGNvbnN0IHsgZ2wsIGN1cnJlbnRUZXh0dXJlU2xvdCwgY3VycmVudEJvdW5kVGV4dHVyZXMgfSA9IHRoaXM7XHJcblxyXG5cdFx0Y29uc3QgYm91bmRUZXh0dXJlID0gY3VycmVudEJvdW5kVGV4dHVyZXNbIGN1cnJlbnRUZXh0dXJlU2xvdCBdO1xyXG5cclxuXHRcdGlmICggYm91bmRUZXh0dXJlICE9PSB1bmRlZmluZWQgJiYgYm91bmRUZXh0dXJlLnR5cGUgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGdsLmJpbmRUZXh0dXJlKCBib3VuZFRleHR1cmUudHlwZSwgbnVsbCApO1xyXG5cclxuXHRcdFx0Ym91bmRUZXh0dXJlLnR5cGUgPSB1bmRlZmluZWQ7XHJcblx0XHRcdGJvdW5kVGV4dHVyZS50ZXh0dXJlID0gdW5kZWZpbmVkO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgV2ViR0xTdGF0ZTtcclxuIiwiaW1wb3J0IHsgUkdCQV9BU1RDXzR4NF9Gb3JtYXQsIFJHQkFfQVNUQ181eDRfRm9ybWF0LCBSR0JBX0FTVENfNXg1X0Zvcm1hdCwgUkdCQV9BU1RDXzZ4NV9Gb3JtYXQsIFJHQkFfQVNUQ182eDZfRm9ybWF0LCBSR0JBX0FTVENfOHg1X0Zvcm1hdCwgUkdCQV9BU1RDXzh4Nl9Gb3JtYXQsIFJHQkFfQVNUQ184eDhfRm9ybWF0LCBSR0JBX0FTVENfMTB4NV9Gb3JtYXQsIFJHQkFfQVNUQ18xMHg2X0Zvcm1hdCwgUkdCQV9BU1RDXzEweDhfRm9ybWF0LCBSR0JBX0FTVENfMTB4MTBfRm9ybWF0LCBSR0JBX0FTVENfMTJ4MTBfRm9ybWF0LCBSR0JBX0FTVENfMTJ4MTJfRm9ybWF0LCBSR0JfRVRDMV9Gb3JtYXQsIFJHQl9FVEMyX0Zvcm1hdCwgUkdCQV9FVEMyX0VBQ19Gb3JtYXQsIFJHQkFfUFZSVENfMkJQUFYxX0Zvcm1hdCwgUkdCQV9QVlJUQ180QlBQVjFfRm9ybWF0LCBSR0JfUFZSVENfMkJQUFYxX0Zvcm1hdCwgUkdCX1BWUlRDXzRCUFBWMV9Gb3JtYXQsIFJHQkFfUzNUQ19EWFQ1X0Zvcm1hdCwgUkdCQV9TM1RDX0RYVDNfRm9ybWF0LCBSR0JBX1MzVENfRFhUMV9Gb3JtYXQsIFJHQl9TM1RDX0RYVDFfRm9ybWF0LCBEZXB0aEZvcm1hdCwgRGVwdGhTdGVuY2lsRm9ybWF0LCBMdW1pbmFuY2VBbHBoYUZvcm1hdCwgTHVtaW5hbmNlRm9ybWF0LCBSZWRGb3JtYXQsIFJHQkZvcm1hdCwgUkdCQUZvcm1hdCwgQWxwaGFGb3JtYXQsIFJlZEludGVnZXJGb3JtYXQsIFJHRm9ybWF0LCBSR0ludGVnZXJGb3JtYXQsIFJHQkFJbnRlZ2VyRm9ybWF0LCBIYWxmRmxvYXRUeXBlLCBGbG9hdFR5cGUsIFVuc2lnbmVkSW50VHlwZSwgSW50VHlwZSwgVW5zaWduZWRTaG9ydFR5cGUsIFNob3J0VHlwZSwgQnl0ZVR5cGUsIFVuc2lnbmVkSW50MjQ4VHlwZSwgVW5zaWduZWRJbnQ1OTk5VHlwZSwgVW5zaWduZWRTaG9ydDU1NTFUeXBlLCBVbnNpZ25lZFNob3J0NDQ0NFR5cGUsIFVuc2lnbmVkQnl0ZVR5cGUsIFJHQkFfQlBUQ19Gb3JtYXQsIFJFRF9SR1RDMV9Gb3JtYXQsIFNJR05FRF9SRURfUkdUQzFfRm9ybWF0LCBSRURfR1JFRU5fUkdUQzJfRm9ybWF0LCBTSUdORURfUkVEX0dSRUVOX1JHVEMyX0Zvcm1hdCwgU1JHQkNvbG9yU3BhY2UsIE5vQ29sb3JTcGFjZSB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcblxyXG4vKipcclxuICogQSBXZWJHTCAyIGJhY2tlbmQgdXRpbGl0eSBtb2R1bGUgd2l0aCBjb21tb24gaGVscGVycy5cclxuICpcclxuICogQHByaXZhdGVcclxuICovXHJcbmNsYXNzIFdlYkdMVXRpbHMge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHV0aWxpdHkgb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHTEJhY2tlbmR9IGJhY2tlbmQgLSBUaGUgV2ViR0wgMiBiYWNrZW5kLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBiYWNrZW5kICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIFdlYkdMIDIgYmFja2VuZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2ViR0xCYWNrZW5kfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJhY2tlbmQgPSBiYWNrZW5kO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIHJlbmRlcmluZyBjb250ZXh0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtXZWJHTDJSZW5kZXJpbmdDb250ZXh0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdsID0gdGhpcy5iYWNrZW5kLmdsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gYSBiYWNrZW5kIG1vZHVsZSBob2xkaW5nIGV4dGVuc2lvbi1yZWxhdGVkXHJcblx0XHQgKiB1dGlsaXR5IGZ1bmN0aW9ucy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2ViR0xFeHRlbnNpb25zfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmV4dGVuc2lvbnMgPSBiYWNrZW5kLmV4dGVuc2lvbnM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29udmVydHMgdGhlIGdpdmVuIHRocmVlLmpzIGNvbnN0YW50IGludG8gYSBXZWJHTCBjb25zdGFudC5cclxuXHQgKiBUaGUgbWV0aG9kIGN1cnJlbnRseSBzdXBwb3J0cyB0aGUgY29udmVyc2lvbiBvZiB0ZXh0dXJlIGZvcm1hdHNcclxuXHQgKiBhbmQgdHlwZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gcCAtIFRoZSB0aHJlZS5qcyBjb25zdGFudC5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW2NvbG9yU3BhY2U9Tm9Db2xvclNwYWNlXSAtIFRoZSBjb2xvciBzcGFjZS5cclxuXHQgKiBAcmV0dXJuIHs/bnVtYmVyfSBUaGUgY29ycmVzcG9uZGluZyBXZWJHTCBjb25zdGFudC5cclxuXHQgKi9cclxuXHRjb252ZXJ0KCBwLCBjb2xvclNwYWNlID0gTm9Db2xvclNwYWNlICkge1xyXG5cclxuXHRcdGNvbnN0IHsgZ2wsIGV4dGVuc2lvbnMgfSA9IHRoaXM7XHJcblxyXG5cdFx0bGV0IGV4dGVuc2lvbjtcclxuXHJcblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkQnl0ZVR5cGUgKSByZXR1cm4gZ2wuVU5TSUdORURfQllURTtcclxuXHRcdGlmICggcCA9PT0gVW5zaWduZWRTaG9ydDQ0NDRUeXBlICkgcmV0dXJuIGdsLlVOU0lHTkVEX1NIT1JUXzRfNF80XzQ7XHJcblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkU2hvcnQ1NTUxVHlwZSApIHJldHVybiBnbC5VTlNJR05FRF9TSE9SVF81XzVfNV8xO1xyXG5cdFx0aWYgKCBwID09PSBVbnNpZ25lZEludDU5OTlUeXBlICkgcmV0dXJuIGdsLlVOU0lHTkVEX0lOVF81XzlfOV85X1JFVjtcclxuXHJcblx0XHRpZiAoIHAgPT09IEJ5dGVUeXBlICkgcmV0dXJuIGdsLkJZVEU7XHJcblx0XHRpZiAoIHAgPT09IFNob3J0VHlwZSApIHJldHVybiBnbC5TSE9SVDtcclxuXHRcdGlmICggcCA9PT0gVW5zaWduZWRTaG9ydFR5cGUgKSByZXR1cm4gZ2wuVU5TSUdORURfU0hPUlQ7XHJcblx0XHRpZiAoIHAgPT09IEludFR5cGUgKSByZXR1cm4gZ2wuSU5UO1xyXG5cdFx0aWYgKCBwID09PSBVbnNpZ25lZEludFR5cGUgKSByZXR1cm4gZ2wuVU5TSUdORURfSU5UO1xyXG5cdFx0aWYgKCBwID09PSBGbG9hdFR5cGUgKSByZXR1cm4gZ2wuRkxPQVQ7XHJcblxyXG5cdFx0aWYgKCBwID09PSBIYWxmRmxvYXRUeXBlICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIGdsLkhBTEZfRkxPQVQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggcCA9PT0gQWxwaGFGb3JtYXQgKSByZXR1cm4gZ2wuQUxQSEE7XHJcblx0XHRpZiAoIHAgPT09IFJHQkZvcm1hdCApIHJldHVybiBnbC5SR0I7XHJcblx0XHRpZiAoIHAgPT09IFJHQkFGb3JtYXQgKSByZXR1cm4gZ2wuUkdCQTtcclxuXHRcdGlmICggcCA9PT0gTHVtaW5hbmNlRm9ybWF0ICkgcmV0dXJuIGdsLkxVTUlOQU5DRTtcclxuXHRcdGlmICggcCA9PT0gTHVtaW5hbmNlQWxwaGFGb3JtYXQgKSByZXR1cm4gZ2wuTFVNSU5BTkNFX0FMUEhBO1xyXG5cdFx0aWYgKCBwID09PSBEZXB0aEZvcm1hdCApIHJldHVybiBnbC5ERVBUSF9DT01QT05FTlQ7XHJcblx0XHRpZiAoIHAgPT09IERlcHRoU3RlbmNpbEZvcm1hdCApIHJldHVybiBnbC5ERVBUSF9TVEVOQ0lMO1xyXG5cclxuXHRcdC8vIFdlYkdMMiBmb3JtYXRzLlxyXG5cclxuXHRcdGlmICggcCA9PT0gUmVkRm9ybWF0ICkgcmV0dXJuIGdsLlJFRDtcclxuXHRcdGlmICggcCA9PT0gUmVkSW50ZWdlckZvcm1hdCApIHJldHVybiBnbC5SRURfSU5URUdFUjtcclxuXHRcdGlmICggcCA9PT0gUkdGb3JtYXQgKSByZXR1cm4gZ2wuUkc7XHJcblx0XHRpZiAoIHAgPT09IFJHSW50ZWdlckZvcm1hdCApIHJldHVybiBnbC5SR19JTlRFR0VSO1xyXG5cdFx0aWYgKCBwID09PSBSR0JBSW50ZWdlckZvcm1hdCApIHJldHVybiBnbC5SR0JBX0lOVEVHRVI7XHJcblxyXG5cdFx0Ly8gUzNUQ1xyXG5cclxuXHRcdGlmICggcCA9PT0gUkdCX1MzVENfRFhUMV9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9TM1RDX0RYVDFfRm9ybWF0IHx8IHAgPT09IFJHQkFfUzNUQ19EWFQzX0Zvcm1hdCB8fCBwID09PSBSR0JBX1MzVENfRFhUNV9Gb3JtYXQgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGNvbG9yU3BhY2UgPT09IFNSR0JDb2xvclNwYWNlICkge1xyXG5cclxuXHRcdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjX3NyZ2InICk7XHJcblxyXG5cdFx0XHRcdGlmICggZXh0ZW5zaW9uICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRcdGlmICggcCA9PT0gUkdCX1MzVENfRFhUMV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU1JHQl9TM1RDX0RYVDFfRVhUO1xyXG5cdFx0XHRcdFx0aWYgKCBwID09PSBSR0JBX1MzVENfRFhUMV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU1JHQl9BTFBIQV9TM1RDX0RYVDFfRVhUO1xyXG5cdFx0XHRcdFx0aWYgKCBwID09PSBSR0JBX1MzVENfRFhUM19Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU1JHQl9BTFBIQV9TM1RDX0RYVDNfRVhUO1xyXG5cdFx0XHRcdFx0aWYgKCBwID09PSBSR0JBX1MzVENfRFhUNV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU1JHQl9BTFBIQV9TM1RDX0RYVDVfRVhUO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdHJldHVybiBudWxsO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApO1xyXG5cclxuXHRcdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIHAgPT09IFJHQl9TM1RDX0RYVDFfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhUO1xyXG5cdFx0XHRcdFx0aWYgKCBwID09PSBSR0JBX1MzVENfRFhUMV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDFfRVhUO1xyXG5cdFx0XHRcdFx0aWYgKCBwID09PSBSR0JBX1MzVENfRFhUM19Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDNfRVhUO1xyXG5cdFx0XHRcdFx0aWYgKCBwID09PSBSR0JBX1MzVENfRFhUNV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhUO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdHJldHVybiBudWxsO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFBWUlRDXHJcblxyXG5cdFx0aWYgKCBwID09PSBSR0JfUFZSVENfNEJQUFYxX0Zvcm1hdCB8fCBwID09PSBSR0JfUFZSVENfMkJQUFYxX0Zvcm1hdCB8fCBwID09PSBSR0JBX1BWUlRDXzRCUFBWMV9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9QVlJUQ18yQlBQVjFfRm9ybWF0ICkge1xyXG5cclxuXHRcdFx0ZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnICk7XHJcblxyXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBwID09PSBSR0JfUFZSVENfNEJQUFYxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JfUFZSVENfNEJQUFYxX0lNRztcclxuXHRcdFx0XHRpZiAoIHAgPT09IFJHQl9QVlJUQ18yQlBQVjFfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQl9QVlJUQ18yQlBQVjFfSU1HO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9QVlJUQ180QlBQVjFfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfUFZSVENfNEJQUFYxX0lNRztcclxuXHRcdFx0XHRpZiAoIHAgPT09IFJHQkFfUFZSVENfMkJQUFYxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzJCUFBWMV9JTUc7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gRVRDXHJcblxyXG5cdFx0aWYgKCBwID09PSBSR0JfRVRDMV9Gb3JtYXQgfHwgcCA9PT0gUkdCX0VUQzJfRm9ybWF0IHx8IHAgPT09IFJHQkFfRVRDMl9FQUNfRm9ybWF0ICkge1xyXG5cclxuXHRcdFx0ZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfZXRjJyApO1xyXG5cclxuXHRcdFx0aWYgKCBleHRlbnNpb24gIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCX0VUQzFfRm9ybWF0IHx8IHAgPT09IFJHQl9FVEMyX0Zvcm1hdCApIHJldHVybiAoIGNvbG9yU3BhY2UgPT09IFNSR0JDb2xvclNwYWNlICkgPyBleHRlbnNpb24uQ09NUFJFU1NFRF9TUkdCOF9FVEMyIDogZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCOF9FVEMyO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9FVEMyX0VBQ19Gb3JtYXQgKSByZXR1cm4gKCBjb2xvclNwYWNlID09PSBTUkdCQ29sb3JTcGFjZSApID8gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0VUQzJfRUFDIDogZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQThfRVRDMl9FQUM7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQVNUQ1xyXG5cclxuXHRcdGlmICggcCA9PT0gUkdCQV9BU1RDXzR4NF9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzV4NF9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzV4NV9Gb3JtYXQgfHxcclxuXHRcdFx0cCA9PT0gUkdCQV9BU1RDXzZ4NV9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzZ4Nl9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzh4NV9Gb3JtYXQgfHxcclxuXHRcdFx0cCA9PT0gUkdCQV9BU1RDXzh4Nl9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzh4OF9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzEweDVfRm9ybWF0IHx8XHJcblx0XHRcdHAgPT09IFJHQkFfQVNUQ18xMHg2X0Zvcm1hdCB8fCBwID09PSBSR0JBX0FTVENfMTB4OF9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzEweDEwX0Zvcm1hdCB8fFxyXG5cdFx0XHRwID09PSBSR0JBX0FTVENfMTJ4MTBfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ18xMngxMl9Gb3JtYXQgKSB7XHJcblxyXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9hc3RjJyApO1xyXG5cclxuXHRcdFx0aWYgKCBleHRlbnNpb24gIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9BU1RDXzR4NF9Gb3JtYXQgKSByZXR1cm4gKCBjb2xvclNwYWNlID09PSBTUkdCQ29sb3JTcGFjZSApID8gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfNHg0X0tIUiA6IGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfQVNUQ180eDRfS0hSO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9BU1RDXzV4NF9Gb3JtYXQgKSByZXR1cm4gKCBjb2xvclNwYWNlID09PSBTUkdCQ29sb3JTcGFjZSApID8gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfNXg0X0tIUiA6IGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfQVNUQ181eDRfS0hSO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9BU1RDXzV4NV9Gb3JtYXQgKSByZXR1cm4gKCBjb2xvclNwYWNlID09PSBTUkdCQ29sb3JTcGFjZSApID8gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfNXg1X0tIUiA6IGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfQVNUQ181eDVfS0hSO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9BU1RDXzZ4NV9Gb3JtYXQgKSByZXR1cm4gKCBjb2xvclNwYWNlID09PSBTUkdCQ29sb3JTcGFjZSApID8gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfNng1X0tIUiA6IGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfQVNUQ182eDVfS0hSO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9BU1RDXzZ4Nl9Gb3JtYXQgKSByZXR1cm4gKCBjb2xvclNwYWNlID09PSBTUkdCQ29sb3JTcGFjZSApID8gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfNng2X0tIUiA6IGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfQVNUQ182eDZfS0hSO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9BU1RDXzh4NV9Gb3JtYXQgKSByZXR1cm4gKCBjb2xvclNwYWNlID09PSBTUkdCQ29sb3JTcGFjZSApID8gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfOHg1X0tIUiA6IGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfQVNUQ184eDVfS0hSO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9BU1RDXzh4Nl9Gb3JtYXQgKSByZXR1cm4gKCBjb2xvclNwYWNlID09PSBTUkdCQ29sb3JTcGFjZSApID8gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfOHg2X0tIUiA6IGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfQVNUQ184eDZfS0hSO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9BU1RDXzh4OF9Gb3JtYXQgKSByZXR1cm4gKCBjb2xvclNwYWNlID09PSBTUkdCQ29sb3JTcGFjZSApID8gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfOHg4X0tIUiA6IGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfQVNUQ184eDhfS0hSO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9BU1RDXzEweDVfRm9ybWF0ICkgcmV0dXJuICggY29sb3JTcGFjZSA9PT0gU1JHQkNvbG9yU3BhY2UgKSA/IGV4dGVuc2lvbi5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzEweDVfS0hSIDogZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9BU1RDXzEweDVfS0hSO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9BU1RDXzEweDZfRm9ybWF0ICkgcmV0dXJuICggY29sb3JTcGFjZSA9PT0gU1JHQkNvbG9yU3BhY2UgKSA/IGV4dGVuc2lvbi5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzEweDZfS0hSIDogZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9BU1RDXzEweDZfS0hSO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9BU1RDXzEweDhfRm9ybWF0ICkgcmV0dXJuICggY29sb3JTcGFjZSA9PT0gU1JHQkNvbG9yU3BhY2UgKSA/IGV4dGVuc2lvbi5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzEweDhfS0hSIDogZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9BU1RDXzEweDhfS0hSO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9BU1RDXzEweDEwX0Zvcm1hdCApIHJldHVybiAoIGNvbG9yU3BhY2UgPT09IFNSR0JDb2xvclNwYWNlICkgPyBleHRlbnNpb24uQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ18xMHgxMF9LSFIgOiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX0FTVENfMTB4MTBfS0hSO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9BU1RDXzEyeDEwX0Zvcm1hdCApIHJldHVybiAoIGNvbG9yU3BhY2UgPT09IFNSR0JDb2xvclNwYWNlICkgPyBleHRlbnNpb24uQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ18xMngxMF9LSFIgOiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX0FTVENfMTJ4MTBfS0hSO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9BU1RDXzEyeDEyX0Zvcm1hdCApIHJldHVybiAoIGNvbG9yU3BhY2UgPT09IFNSR0JDb2xvclNwYWNlICkgPyBleHRlbnNpb24uQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ18xMngxMl9LSFIgOiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX0FTVENfMTJ4MTJfS0hSO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0cmV0dXJuIG51bGw7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEJQVENcclxuXHJcblx0XHRpZiAoIHAgPT09IFJHQkFfQlBUQ19Gb3JtYXQgKSB7XHJcblxyXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ0VYVF90ZXh0dXJlX2NvbXByZXNzaW9uX2JwdGMnICk7XHJcblxyXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBwID09PSBSR0JBX0JQVENfRm9ybWF0ICkgcmV0dXJuICggY29sb3JTcGFjZSA9PT0gU1JHQkNvbG9yU3BhY2UgKSA/IGV4dGVuc2lvbi5DT01QUkVTU0VEX1NSR0JfQUxQSEFfQlBUQ19VTk9STV9FWFQgOiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX0JQVENfVU5PUk1fRVhUO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0cmV0dXJuIG51bGw7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFJHVENcclxuXHJcblx0XHRpZiAoIHAgPT09IFJFRF9SR1RDMV9Gb3JtYXQgfHwgcCA9PT0gU0lHTkVEX1JFRF9SR1RDMV9Gb3JtYXQgfHwgcCA9PT0gUkVEX0dSRUVOX1JHVEMyX0Zvcm1hdCB8fCBwID09PSBTSUdORURfUkVEX0dSRUVOX1JHVEMyX0Zvcm1hdCApIHtcclxuXHJcblx0XHRcdGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnRVhUX3RleHR1cmVfY29tcHJlc3Npb25fcmd0YycgKTtcclxuXHJcblx0XHRcdGlmICggZXh0ZW5zaW9uICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIHAgPT09IFJHQkFfQlBUQ19Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkVEX1JHVEMxX0VYVDtcclxuXHRcdFx0XHRpZiAoIHAgPT09IFNJR05FRF9SRURfUkdUQzFfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1NJR05FRF9SRURfUkdUQzFfRVhUO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gUkVEX0dSRUVOX1JHVEMyX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SRURfR1JFRU5fUkdUQzJfRVhUO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gU0lHTkVEX1JFRF9HUkVFTl9SR1RDMl9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU0lHTkVEX1JFRF9HUkVFTl9SR1RDMl9FWFQ7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkSW50MjQ4VHlwZSApIHtcclxuXHJcblx0XHRcdHJldHVybiBnbC5VTlNJR05FRF9JTlRfMjRfODtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gaWYgXCJwXCIgY2FuJ3QgYmUgcmVzb2x2ZWQsIGFzc3VtZSB0aGUgdXNlciBkZWZpbmVzIGEgV2ViR0wgY29uc3RhbnQgYXMgYSBzdHJpbmcgKGZhbGxiYWNrL3dvcmthcm91bmQgZm9yIHBhY2tlZCBSR0IgZm9ybWF0cylcclxuXHJcblx0XHRyZXR1cm4gKCBnbFsgcCBdICE9PSB1bmRlZmluZWQgKSA/IGdsWyBwIF0gOiBudWxsO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIHN5bmNocm9uaXplIHRoZSBDUFUgd2l0aCB0aGUgR1BVIGJ5IHdhaXRpbmcgdW50aWxcclxuXHQgKiBvbmdvaW5nIEdQVSBjb21tYW5kcyBoYXZlIGJlZW4gY29tcGxldGVkLlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcmV0dXJuIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBvbmdvaW5nIEdQVSBjb21tYW5kcyBoYXZlIGJlZW4gY29tcGxldGVkLlxyXG5cdCAqL1xyXG5cdF9jbGllbnRXYWl0QXN5bmMoKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBnbCB9ID0gdGhpcztcclxuXHJcblx0XHRjb25zdCBzeW5jID0gZ2wuZmVuY2VTeW5jKCBnbC5TWU5DX0dQVV9DT01NQU5EU19DT01QTEVURSwgMCApO1xyXG5cclxuXHRcdGdsLmZsdXNoKCk7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKCAoIHJlc29sdmUsIHJlamVjdCApID0+IHtcclxuXHJcblx0XHRcdGZ1bmN0aW9uIHRlc3QoKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHJlcyA9IGdsLmNsaWVudFdhaXRTeW5jKCBzeW5jLCBnbC5TWU5DX0ZMVVNIX0NPTU1BTkRTX0JJVCwgMCApO1xyXG5cclxuXHRcdFx0XHRpZiAoIHJlcyA9PT0gZ2wuV0FJVF9GQUlMRUQgKSB7XHJcblxyXG5cdFx0XHRcdFx0Z2wuZGVsZXRlU3luYyggc3luYyApO1xyXG5cclxuXHRcdFx0XHRcdHJlamVjdCgpO1xyXG5cdFx0XHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICggcmVzID09PSBnbC5USU1FT1VUX0VYUElSRUQgKSB7XHJcblxyXG5cdFx0XHRcdFx0cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCB0ZXN0ICk7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Z2wuZGVsZXRlU3luYyggc3luYyApO1xyXG5cclxuXHRcdFx0XHRyZXNvbHZlKCk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0ZXN0KCk7XHJcblxyXG5cdFx0fSApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBXZWJHTFV0aWxzO1xyXG4iLCJpbXBvcnQgeyBMaW5lYXJGaWx0ZXIsIExpbmVhck1pcG1hcExpbmVhckZpbHRlciwgTGluZWFyTWlwbWFwTmVhcmVzdEZpbHRlciwgTmVhcmVzdEZpbHRlciwgTmVhcmVzdE1pcG1hcExpbmVhckZpbHRlciwgTmVhcmVzdE1pcG1hcE5lYXJlc3RGaWx0ZXIsIEZsb2F0VHlwZSwgTWlycm9yZWRSZXBlYXRXcmFwcGluZywgQ2xhbXBUb0VkZ2VXcmFwcGluZywgUmVwZWF0V3JhcHBpbmcsIFNSR0JDb2xvclNwYWNlLCBOZXZlckNvbXBhcmUsIEFsd2F5c0NvbXBhcmUsIExlc3NDb21wYXJlLCBMZXNzRXF1YWxDb21wYXJlLCBFcXVhbENvbXBhcmUsIEdyZWF0ZXJFcXVhbENvbXBhcmUsIEdyZWF0ZXJDb21wYXJlLCBOb3RFcXVhbENvbXBhcmUgfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMuanMnO1xyXG5cclxubGV0IGluaXRpYWxpemVkID0gZmFsc2UsIHdyYXBwaW5nVG9HTCwgZmlsdGVyVG9HTCwgY29tcGFyZVRvR0w7XHJcblxyXG4vKipcclxuICogQSBXZWJHTCAyIGJhY2tlbmQgdXRpbGl0eSBtb2R1bGUgZm9yIG1hbmFnaW5nIHRleHR1cmVzLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuY2xhc3MgV2ViR0xUZXh0dXJlVXRpbHMge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHV0aWxpdHkgb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHTEJhY2tlbmR9IGJhY2tlbmQgLSBUaGUgV2ViR0wgMiBiYWNrZW5kLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBiYWNrZW5kICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIFdlYkdMIDIgYmFja2VuZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2ViR0xCYWNrZW5kfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJhY2tlbmQgPSBiYWNrZW5kO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIHJlbmRlcmluZyBjb250ZXh0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtXZWJHTDJSZW5kZXJpbmdDb250ZXh0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdsID0gYmFja2VuZC5nbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIGEgYmFja2VuZCBtb2R1bGUgaG9sZGluZyBleHRlbnNpb24tcmVsYXRlZFxyXG5cdFx0ICogdXRpbGl0eSBmdW5jdGlvbnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1dlYkdMRXh0ZW5zaW9uc31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5leHRlbnNpb25zID0gYmFja2VuZC5leHRlbnNpb25zO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBkaWN0aW9uYXJ5IGZvciBtYW5hZ2luZyBkZWZhdWx0IHRleHR1cmVzLiBUaGUga2V5XHJcblx0XHQgKiBpcyB0aGUgYmluZGluZyBwb2ludCAodGFyZ2V0KSwgdGhlIHZhbHVlIHRoZSBXRWJHTCB0ZXh0dXJlIG9iamVjdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0PEdMZW51bSxXZWJHTFRleHR1cmU+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRlZmF1bHRUZXh0dXJlcyA9IHt9O1xyXG5cclxuXHRcdGlmICggaW5pdGlhbGl6ZWQgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0dGhpcy5faW5pdCgpO1xyXG5cclxuXHRcdFx0aW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJbml0cyB0aGUgc3RhdGUgb2YgdGhlIHV0aWxpdHkuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqL1xyXG5cdF9pbml0KCkge1xyXG5cclxuXHRcdGNvbnN0IGdsID0gdGhpcy5nbDtcclxuXHJcblx0XHQvLyBTdG9yZSBvbmx5IFdlYkdMIGNvbnN0YW50cyBoZXJlLlxyXG5cclxuXHRcdHdyYXBwaW5nVG9HTCA9IHtcclxuXHRcdFx0WyBSZXBlYXRXcmFwcGluZyBdOiBnbC5SRVBFQVQsXHJcblx0XHRcdFsgQ2xhbXBUb0VkZ2VXcmFwcGluZyBdOiBnbC5DTEFNUF9UT19FREdFLFxyXG5cdFx0XHRbIE1pcnJvcmVkUmVwZWF0V3JhcHBpbmcgXTogZ2wuTUlSUk9SRURfUkVQRUFUXHJcblx0XHR9O1xyXG5cclxuXHRcdGZpbHRlclRvR0wgPSB7XHJcblx0XHRcdFsgTmVhcmVzdEZpbHRlciBdOiBnbC5ORUFSRVNULFxyXG5cdFx0XHRbIE5lYXJlc3RNaXBtYXBOZWFyZXN0RmlsdGVyIF06IGdsLk5FQVJFU1RfTUlQTUFQX05FQVJFU1QsXHJcblx0XHRcdFsgTmVhcmVzdE1pcG1hcExpbmVhckZpbHRlciBdOiBnbC5ORUFSRVNUX01JUE1BUF9MSU5FQVIsXHJcblxyXG5cdFx0XHRbIExpbmVhckZpbHRlciBdOiBnbC5MSU5FQVIsXHJcblx0XHRcdFsgTGluZWFyTWlwbWFwTmVhcmVzdEZpbHRlciBdOiBnbC5MSU5FQVJfTUlQTUFQX05FQVJFU1QsXHJcblx0XHRcdFsgTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyIF06IGdsLkxJTkVBUl9NSVBNQVBfTElORUFSXHJcblx0XHR9O1xyXG5cclxuXHRcdGNvbXBhcmVUb0dMID0ge1xyXG5cdFx0XHRbIE5ldmVyQ29tcGFyZSBdOiBnbC5ORVZFUixcclxuXHRcdFx0WyBBbHdheXNDb21wYXJlIF06IGdsLkFMV0FZUyxcclxuXHRcdFx0WyBMZXNzQ29tcGFyZSBdOiBnbC5MRVNTLFxyXG5cdFx0XHRbIExlc3NFcXVhbENvbXBhcmUgXTogZ2wuTEVRVUFMLFxyXG5cdFx0XHRbIEVxdWFsQ29tcGFyZSBdOiBnbC5FUVVBTCxcclxuXHRcdFx0WyBHcmVhdGVyRXF1YWxDb21wYXJlIF06IGdsLkdFUVVBTCxcclxuXHRcdFx0WyBHcmVhdGVyQ29tcGFyZSBdOiBnbC5HUkVBVEVSLFxyXG5cdFx0XHRbIE5vdEVxdWFsQ29tcGFyZSBdOiBnbC5OT1RFUVVBTFxyXG5cdFx0fTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBuYXRpdmUgdGV4dHVyZSB0eXBlIGZvciB0aGUgZ2l2ZW4gdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlLlxyXG5cdCAqIEByZXR1cm4ge0dMZW51bX0gVGhlIG5hdGl2ZSB0ZXh0dXJlIHR5cGUuXHJcblx0ICovXHJcblx0Z2V0R0xUZXh0dXJlVHlwZSggdGV4dHVyZSApIHtcclxuXHJcblx0XHRjb25zdCB7IGdsIH0gPSB0aGlzO1xyXG5cclxuXHRcdGxldCBnbFRleHR1cmVUeXBlO1xyXG5cclxuXHRcdGlmICggdGV4dHVyZS5pc0N1YmVUZXh0dXJlID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0Z2xUZXh0dXJlVHlwZSA9IGdsLlRFWFRVUkVfQ1VCRV9NQVA7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggdGV4dHVyZS5pc0RhdGFBcnJheVRleHR1cmUgPT09IHRydWUgfHwgdGV4dHVyZS5pc0NvbXByZXNzZWRBcnJheVRleHR1cmUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRnbFRleHR1cmVUeXBlID0gZ2wuVEVYVFVSRV8yRF9BUlJBWTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCB0ZXh0dXJlLmlzRGF0YTNEVGV4dHVyZSA9PT0gdHJ1ZSApIHsgLy8gVE9ETzogaXNDb21wcmVzc2VkM0RUZXh0dXJlLCB3YWl0IGZvciAjMjY2NDJcclxuXHJcblx0XHRcdGdsVGV4dHVyZVR5cGUgPSBnbC5URVhUVVJFXzNEO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRnbFRleHR1cmVUeXBlID0gZ2wuVEVYVFVSRV8yRDtcclxuXHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBnbFRleHR1cmVUeXBlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIG5hdGl2ZSB0ZXh0dXJlIHR5cGUgZm9yIHRoZSBnaXZlbiB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHs/c3RyaW5nfSBpbnRlcm5hbEZvcm1hdE5hbWUgLSBUaGUgaW50ZXJuYWwgZm9ybWF0IG5hbWUuIFdoZW4gYG51bGxgLCB0aGUgaW50ZXJuYWwgZm9ybWF0IGlzIGRlcml2ZWQgZnJvbSB0aGUgc3Vic2VxdWVudCBwYXJhbWV0ZXJzLlxyXG5cdCAqIEBwYXJhbSB7R0xlbnVtfSBnbEZvcm1hdCAtIFRoZSBXZWJHTCBmb3JtYXQuXHJcblx0ICogQHBhcmFtIHtHTGVudW19IGdsVHlwZSAtIFRoZSBXZWJHTCB0eXBlLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBjb2xvclNwYWNlIC0gVGhlIHRleHR1cmUncyBjb2xvciBzcGFjZS5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtmb3JjZUxpbmVhclRyYW5zZmVyPWZhbHNlXSAtIFdoZXRoZXIgdG8gZm9yY2UgYSBsaW5lYXIgdHJhbnNmZXIgb3Igbm90LlxyXG5cdCAqIEByZXR1cm4ge0dMZW51bX0gVGhlIGludGVybmFsIGZvcm1hdC5cclxuXHQgKi9cclxuXHRnZXRJbnRlcm5hbEZvcm1hdCggaW50ZXJuYWxGb3JtYXROYW1lLCBnbEZvcm1hdCwgZ2xUeXBlLCBjb2xvclNwYWNlLCBmb3JjZUxpbmVhclRyYW5zZmVyID0gZmFsc2UgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBnbCwgZXh0ZW5zaW9ucyB9ID0gdGhpcztcclxuXHJcblx0XHRpZiAoIGludGVybmFsRm9ybWF0TmFtZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGlmICggZ2xbIGludGVybmFsRm9ybWF0TmFtZSBdICE9PSB1bmRlZmluZWQgKSByZXR1cm4gZ2xbIGludGVybmFsRm9ybWF0TmFtZSBdO1xyXG5cclxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogQXR0ZW1wdCB0byB1c2Ugbm9uLWV4aXN0aW5nIFdlYkdMIGludGVybmFsIGZvcm1hdCBcXCcnICsgaW50ZXJuYWxGb3JtYXROYW1lICsgJ1xcJycgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0bGV0IGludGVybmFsRm9ybWF0ID0gZ2xGb3JtYXQ7XHJcblxyXG5cdFx0aWYgKCBnbEZvcm1hdCA9PT0gZ2wuUkVEICkge1xyXG5cclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IGdsLkZMT0FUICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SMzJGO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuSEFMRl9GTE9BVCApIGludGVybmFsRm9ybWF0ID0gZ2wuUjE2RjtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IGdsLlVOU0lHTkVEX0JZVEUgKSBpbnRlcm5hbEZvcm1hdCA9IGdsLlI4O1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuVU5TSUdORURfU0hPUlQgKSBpbnRlcm5hbEZvcm1hdCA9IGdsLlIxNjtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IGdsLlVOU0lHTkVEX0lOVCApIGludGVybmFsRm9ybWF0ID0gZ2wuUjMyVUk7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBnbC5CWVRFICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SOEk7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBnbC5TSE9SVCApIGludGVybmFsRm9ybWF0ID0gZ2wuUjE2STtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IGdsLklOVCApIGludGVybmFsRm9ybWF0ID0gZ2wuUjMySTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBnbEZvcm1hdCA9PT0gZ2wuUkVEX0lOVEVHRVIgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuVU5TSUdORURfQllURSApIGludGVybmFsRm9ybWF0ID0gZ2wuUjhVSTtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IGdsLlVOU0lHTkVEX1NIT1JUICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SMTZVSTtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IGdsLlVOU0lHTkVEX0lOVCApIGludGVybmFsRm9ybWF0ID0gZ2wuUjMyVUk7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBnbC5CWVRFICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SOEk7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBnbC5TSE9SVCApIGludGVybmFsRm9ybWF0ID0gZ2wuUjE2STtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IGdsLklOVCApIGludGVybmFsRm9ybWF0ID0gZ2wuUjMySTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBnbEZvcm1hdCA9PT0gZ2wuUkcgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuRkxPQVQgKSBpbnRlcm5hbEZvcm1hdCA9IGdsLlJHMzJGO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuSEFMRl9GTE9BVCApIGludGVybmFsRm9ybWF0ID0gZ2wuUkcxNkY7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBnbC5VTlNJR05FRF9CWVRFICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SRzg7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBnbC5VTlNJR05FRF9TSE9SVCApIGludGVybmFsRm9ybWF0ID0gZ2wuUkcxNjtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IGdsLlVOU0lHTkVEX0lOVCApIGludGVybmFsRm9ybWF0ID0gZ2wuUkczMlVJO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuQllURSApIGludGVybmFsRm9ybWF0ID0gZ2wuUkc4STtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IGdsLlNIT1JUICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SRzE2STtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IGdsLklOVCApIGludGVybmFsRm9ybWF0ID0gZ2wuUkczMkk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggZ2xGb3JtYXQgPT09IGdsLlJHX0lOVEVHRVIgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuVU5TSUdORURfQllURSApIGludGVybmFsRm9ybWF0ID0gZ2wuUkc4VUk7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBnbC5VTlNJR05FRF9TSE9SVCApIGludGVybmFsRm9ybWF0ID0gZ2wuUkcxNlVJO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuVU5TSUdORURfSU5UICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SRzMyVUk7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBnbC5CWVRFICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SRzhJO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuU0hPUlQgKSBpbnRlcm5hbEZvcm1hdCA9IGdsLlJHMTZJO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuSU5UICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SRzMySTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBnbEZvcm1hdCA9PT0gZ2wuUkdCICkge1xyXG5cclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IGdsLkZMT0FUICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SR0IzMkY7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBnbC5IQUxGX0ZMT0FUICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SR0IxNkY7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBnbC5VTlNJR05FRF9CWVRFICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SR0I4O1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuVU5TSUdORURfU0hPUlQgKSBpbnRlcm5hbEZvcm1hdCA9IGdsLlJHQjE2O1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuVU5TSUdORURfSU5UICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SR0IzMlVJO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuQllURSApIGludGVybmFsRm9ybWF0ID0gZ2wuUkdCOEk7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBnbC5TSE9SVCApIGludGVybmFsRm9ybWF0ID0gZ2wuUkdCMTZJO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuSU5UICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SR0IzMkk7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBnbC5VTlNJR05FRF9CWVRFICkgaW50ZXJuYWxGb3JtYXQgPSAoIGNvbG9yU3BhY2UgPT09IFNSR0JDb2xvclNwYWNlICYmIGZvcmNlTGluZWFyVHJhbnNmZXIgPT09IGZhbHNlICkgPyBnbC5TUkdCOCA6IGdsLlJHQjg7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBnbC5VTlNJR05FRF9TSE9SVF81XzZfNSApIGludGVybmFsRm9ybWF0ID0gZ2wuUkdCNTY1O1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuVU5TSUdORURfU0hPUlRfNV81XzVfMSApIGludGVybmFsRm9ybWF0ID0gZ2wuUkdCNV9BMTtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IGdsLlVOU0lHTkVEX1NIT1JUXzRfNF80XzQgKSBpbnRlcm5hbEZvcm1hdCA9IGdsLlJHQjQ7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBnbC5VTlNJR05FRF9JTlRfNV85XzlfOV9SRVYgKSBpbnRlcm5hbEZvcm1hdCA9IGdsLlJHQjlfRTU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggZ2xGb3JtYXQgPT09IGdsLlJHQl9JTlRFR0VSICkge1xyXG5cclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IGdsLlVOU0lHTkVEX0JZVEUgKSBpbnRlcm5hbEZvcm1hdCA9IGdsLlJHQjhVSTtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IGdsLlVOU0lHTkVEX1NIT1JUICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SR0IxNlVJO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuVU5TSUdORURfSU5UICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SR0IzMlVJO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuQllURSApIGludGVybmFsRm9ybWF0ID0gZ2wuUkdCOEk7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBnbC5TSE9SVCApIGludGVybmFsRm9ybWF0ID0gZ2wuUkdCMTZJO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuSU5UICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SR0IzMkk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggZ2xGb3JtYXQgPT09IGdsLlJHQkEgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuRkxPQVQgKSBpbnRlcm5hbEZvcm1hdCA9IGdsLlJHQkEzMkY7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBnbC5IQUxGX0ZMT0FUICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SR0JBMTZGO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuVU5TSUdORURfQllURSApIGludGVybmFsRm9ybWF0ID0gZ2wuUkdCQTg7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBnbC5VTlNJR05FRF9TSE9SVCApIGludGVybmFsRm9ybWF0ID0gZ2wuUkdCQTE2O1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuVU5TSUdORURfSU5UICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SR0JBMzJVSTtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IGdsLkJZVEUgKSBpbnRlcm5hbEZvcm1hdCA9IGdsLlJHQkE4STtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IGdsLlNIT1JUICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SR0JBMTZJO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuSU5UICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SR0JBMzJJO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuVU5TSUdORURfQllURSApIGludGVybmFsRm9ybWF0ID0gKCBjb2xvclNwYWNlID09PSBTUkdCQ29sb3JTcGFjZSAmJiBmb3JjZUxpbmVhclRyYW5zZmVyID09PSBmYWxzZSApID8gZ2wuU1JHQjhfQUxQSEE4IDogZ2wuUkdCQTg7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBnbC5VTlNJR05FRF9TSE9SVF80XzRfNF80ICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SR0JBNDtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IGdsLlVOU0lHTkVEX1NIT1JUXzVfNV81XzEgKSBpbnRlcm5hbEZvcm1hdCA9IGdsLlJHQjVfQTE7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggZ2xGb3JtYXQgPT09IGdsLlJHQkFfSU5URUdFUiApIHtcclxuXHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBnbC5VTlNJR05FRF9CWVRFICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SR0JBOFVJO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuVU5TSUdORURfU0hPUlQgKSBpbnRlcm5hbEZvcm1hdCA9IGdsLlJHQkExNlVJO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuVU5TSUdORURfSU5UICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SR0JBMzJVSTtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IGdsLkJZVEUgKSBpbnRlcm5hbEZvcm1hdCA9IGdsLlJHQkE4STtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IGdsLlNIT1JUICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SR0JBMTZJO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuSU5UICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SR0JBMzJJO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGdsRm9ybWF0ID09PSBnbC5ERVBUSF9DT01QT05FTlQgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuVU5TSUdORURfU0hPUlQgKSBpbnRlcm5hbEZvcm1hdCA9IGdsLkRFUFRIX0NPTVBPTkVOVDE2O1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuVU5TSUdORURfSU5UICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5ERVBUSF9DT01QT05FTlQyNDtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IGdsLkZMT0FUICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5ERVBUSF9DT01QT05FTlQzMkY7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggZ2xGb3JtYXQgPT09IGdsLkRFUFRIX1NURU5DSUwgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuVU5TSUdORURfSU5UXzI0XzggKSBpbnRlcm5hbEZvcm1hdCA9IGdsLkRFUFRIMjRfU1RFTkNJTDg7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggaW50ZXJuYWxGb3JtYXQgPT09IGdsLlIxNkYgfHwgaW50ZXJuYWxGb3JtYXQgPT09IGdsLlIzMkYgfHxcclxuXHRcdFx0aW50ZXJuYWxGb3JtYXQgPT09IGdsLlJHMTZGIHx8IGludGVybmFsRm9ybWF0ID09PSBnbC5SRzMyRiB8fFxyXG5cdFx0XHRpbnRlcm5hbEZvcm1hdCA9PT0gZ2wuUkdCQTE2RiB8fCBpbnRlcm5hbEZvcm1hdCA9PT0gZ2wuUkdCQTMyRiApIHtcclxuXHJcblx0XHRcdGV4dGVuc2lvbnMuZ2V0KCAnRVhUX2NvbG9yX2J1ZmZlcl9mbG9hdCcgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGludGVybmFsRm9ybWF0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHRleHR1cmUgcGFyYW1ldGVycyBmb3IgdGhlIGdpdmVuIHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0dMZW51bX0gdGV4dHVyZVR5cGUgLSBUaGUgdGV4dHVyZSB0eXBlLlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlLlxyXG5cdCAqL1xyXG5cdHNldFRleHR1cmVQYXJhbWV0ZXJzKCB0ZXh0dXJlVHlwZSwgdGV4dHVyZSApIHtcclxuXHJcblx0XHRjb25zdCB7IGdsLCBleHRlbnNpb25zLCBiYWNrZW5kIH0gPSB0aGlzO1xyXG5cclxuXHJcblx0XHRnbC5waXhlbFN0b3JlaSggZ2wuVU5QQUNLX0ZMSVBfWV9XRUJHTCwgdGV4dHVyZS5mbGlwWSApO1xyXG5cdFx0Z2wucGl4ZWxTdG9yZWkoIGdsLlVOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTCwgdGV4dHVyZS5wcmVtdWx0aXBseUFscGhhICk7XHJcblx0XHRnbC5waXhlbFN0b3JlaSggZ2wuVU5QQUNLX0FMSUdOTUVOVCwgdGV4dHVyZS51bnBhY2tBbGlnbm1lbnQgKTtcclxuXHRcdGdsLnBpeGVsU3RvcmVpKCBnbC5VTlBBQ0tfQ09MT1JTUEFDRV9DT05WRVJTSU9OX1dFQkdMLCBnbC5OT05FICk7XHJcblxyXG5cdFx0Z2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIGdsLlRFWFRVUkVfV1JBUF9TLCB3cmFwcGluZ1RvR0xbIHRleHR1cmUud3JhcFMgXSApO1xyXG5cdFx0Z2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIGdsLlRFWFRVUkVfV1JBUF9ULCB3cmFwcGluZ1RvR0xbIHRleHR1cmUud3JhcFQgXSApO1xyXG5cclxuXHRcdGlmICggdGV4dHVyZVR5cGUgPT09IGdsLlRFWFRVUkVfM0QgfHwgdGV4dHVyZVR5cGUgPT09IGdsLlRFWFRVUkVfMkRfQVJSQVkgKSB7XHJcblxyXG5cdFx0XHRnbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgZ2wuVEVYVFVSRV9XUkFQX1IsIHdyYXBwaW5nVG9HTFsgdGV4dHVyZS53cmFwUiBdICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGdsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCBnbC5URVhUVVJFX01BR19GSUxURVIsIGZpbHRlclRvR0xbIHRleHR1cmUubWFnRmlsdGVyIF0gKTtcclxuXHJcblxyXG5cdFx0Y29uc3QgaGFzTWlwbWFwcyA9IHRleHR1cmUubWlwbWFwcyAhPT0gdW5kZWZpbmVkICYmIHRleHR1cmUubWlwbWFwcy5sZW5ndGggPiAwO1xyXG5cclxuXHRcdC8vIGZvbGxvdyBXZWJHUFUgYmFja2VuZCBtYXBwaW5nIGZvciB0ZXh0dXJlIGZpbHRlcmluZ1xyXG5cdFx0Y29uc3QgbWluRmlsdGVyID0gdGV4dHVyZS5taW5GaWx0ZXIgPT09IExpbmVhckZpbHRlciAmJiBoYXNNaXBtYXBzID8gTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyIDogdGV4dHVyZS5taW5GaWx0ZXI7XHJcblxyXG5cdFx0Z2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZmlsdGVyVG9HTFsgbWluRmlsdGVyIF0gKTtcclxuXHJcblx0XHRpZiAoIHRleHR1cmUuY29tcGFyZUZ1bmN0aW9uICkge1xyXG5cclxuXHRcdFx0Z2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIGdsLlRFWFRVUkVfQ09NUEFSRV9NT0RFLCBnbC5DT01QQVJFX1JFRl9UT19URVhUVVJFICk7XHJcblx0XHRcdGdsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCBnbC5URVhUVVJFX0NPTVBBUkVfRlVOQywgY29tcGFyZVRvR0xbIHRleHR1cmUuY29tcGFyZUZ1bmN0aW9uIF0gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBleHRlbnNpb25zLmhhcyggJ0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYycgKSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdGlmICggdGV4dHVyZS5tYWdGaWx0ZXIgPT09IE5lYXJlc3RGaWx0ZXIgKSByZXR1cm47XHJcblx0XHRcdGlmICggdGV4dHVyZS5taW5GaWx0ZXIgIT09IE5lYXJlc3RNaXBtYXBMaW5lYXJGaWx0ZXIgJiYgdGV4dHVyZS5taW5GaWx0ZXIgIT09IExpbmVhck1pcG1hcExpbmVhckZpbHRlciApIHJldHVybjtcclxuXHRcdFx0aWYgKCB0ZXh0dXJlLnR5cGUgPT09IEZsb2F0VHlwZSAmJiBleHRlbnNpb25zLmhhcyggJ09FU190ZXh0dXJlX2Zsb2F0X2xpbmVhcicgKSA9PT0gZmFsc2UgKSByZXR1cm47IC8vIHZlcmlmeSBleHRlbnNpb24gZm9yIFdlYkdMIDEgYW5kIFdlYkdMIDJcclxuXHJcblx0XHRcdGlmICggdGV4dHVyZS5hbmlzb3Ryb3B5ID4gMSApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnICk7XHJcblx0XHRcdFx0Z2wudGV4UGFyYW1ldGVyZiggdGV4dHVyZVR5cGUsIGV4dGVuc2lvbi5URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCwgTWF0aC5taW4oIHRleHR1cmUuYW5pc290cm9weSwgYmFja2VuZC5nZXRNYXhBbmlzb3Ryb3B5KCkgKSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGEgZGVmYXVsdCB0ZXh0dXJlIGZvciB0aGUgZ2l2ZW4gdGV4dHVyZSB0aGF0IGNhbiBiZSB1c2VkXHJcblx0ICogYXMgYSBwbGFjZWhvbGRlciB1bnRpbCB0aGUgYWN0dWFsIHRleHR1cmUgaXMgcmVhZHkgZm9yIHVzYWdlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUgdG8gY3JlYXRlIGEgZGVmYXVsdCB0ZXh0dXJlIGZvci5cclxuXHQgKi9cclxuXHRjcmVhdGVEZWZhdWx0VGV4dHVyZSggdGV4dHVyZSApIHtcclxuXHJcblx0XHRjb25zdCB7IGdsLCBiYWNrZW5kLCBkZWZhdWx0VGV4dHVyZXMgfSA9IHRoaXM7XHJcblxyXG5cclxuXHRcdGNvbnN0IGdsVGV4dHVyZVR5cGUgPSB0aGlzLmdldEdMVGV4dHVyZVR5cGUoIHRleHR1cmUgKTtcclxuXHJcblx0XHRsZXQgdGV4dHVyZUdQVSA9IGRlZmF1bHRUZXh0dXJlc1sgZ2xUZXh0dXJlVHlwZSBdO1xyXG5cclxuXHRcdGlmICggdGV4dHVyZUdQVSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0dGV4dHVyZUdQVSA9IGdsLmNyZWF0ZVRleHR1cmUoKTtcclxuXHJcblx0XHRcdGJhY2tlbmQuc3RhdGUuYmluZFRleHR1cmUoIGdsVGV4dHVyZVR5cGUsIHRleHR1cmVHUFUgKTtcclxuXHRcdFx0Z2wudGV4UGFyYW1ldGVyaSggZ2xUZXh0dXJlVHlwZSwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBnbC5ORUFSRVNUICk7XHJcblx0XHRcdGdsLnRleFBhcmFtZXRlcmkoIGdsVGV4dHVyZVR5cGUsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTkVBUkVTVCApO1xyXG5cclxuXHRcdFx0Ly8gZ2wudGV4SW1hZ2UyRCggZ2xUZXh0dXJlVHlwZSwgMCwgZ2wuUkdCQSwgMSwgMSwgMCwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgZGF0YSApO1xyXG5cclxuXHRcdFx0ZGVmYXVsdFRleHR1cmVzWyBnbFRleHR1cmVUeXBlIF0gPSB0ZXh0dXJlR1BVO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRiYWNrZW5kLnNldCggdGV4dHVyZSwge1xyXG5cdFx0XHR0ZXh0dXJlR1BVLFxyXG5cdFx0XHRnbFRleHR1cmVUeXBlLFxyXG5cdFx0XHRpc0RlZmF1bHQ6IHRydWVcclxuXHRcdH0gKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWZpbmVzIGEgdGV4dHVyZSBvbiB0aGUgR1BVIGZvciB0aGUgZ2l2ZW4gdGV4dHVyZSBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIuXHJcblx0ICogQHJldHVybiB7dW5kZWZpbmVkfVxyXG5cdCAqL1xyXG5cdGNyZWF0ZVRleHR1cmUoIHRleHR1cmUsIG9wdGlvbnMgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBnbCwgYmFja2VuZCB9ID0gdGhpcztcclxuXHRcdGNvbnN0IHsgbGV2ZWxzLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCB9ID0gb3B0aW9ucztcclxuXHJcblx0XHRjb25zdCBnbEZvcm1hdCA9IGJhY2tlbmQudXRpbHMuY29udmVydCggdGV4dHVyZS5mb3JtYXQsIHRleHR1cmUuY29sb3JTcGFjZSApO1xyXG5cdFx0Y29uc3QgZ2xUeXBlID0gYmFja2VuZC51dGlscy5jb252ZXJ0KCB0ZXh0dXJlLnR5cGUgKTtcclxuXHRcdGNvbnN0IGdsSW50ZXJuYWxGb3JtYXQgPSB0aGlzLmdldEludGVybmFsRm9ybWF0KCB0ZXh0dXJlLmludGVybmFsRm9ybWF0LCBnbEZvcm1hdCwgZ2xUeXBlLCB0ZXh0dXJlLmNvbG9yU3BhY2UsIHRleHR1cmUuaXNWaWRlb1RleHR1cmUgKTtcclxuXHJcblx0XHRjb25zdCB0ZXh0dXJlR1BVID0gZ2wuY3JlYXRlVGV4dHVyZSgpO1xyXG5cdFx0Y29uc3QgZ2xUZXh0dXJlVHlwZSA9IHRoaXMuZ2V0R0xUZXh0dXJlVHlwZSggdGV4dHVyZSApO1xyXG5cclxuXHRcdGJhY2tlbmQuc3RhdGUuYmluZFRleHR1cmUoIGdsVGV4dHVyZVR5cGUsIHRleHR1cmVHUFUgKTtcclxuXHJcblx0XHR0aGlzLnNldFRleHR1cmVQYXJhbWV0ZXJzKCBnbFRleHR1cmVUeXBlLCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0aWYgKCB0ZXh0dXJlLmlzRGF0YUFycmF5VGV4dHVyZSB8fCB0ZXh0dXJlLmlzQ29tcHJlc3NlZEFycmF5VGV4dHVyZSApIHtcclxuXHJcblx0XHRcdGdsLnRleFN0b3JhZ2UzRCggZ2wuVEVYVFVSRV8yRF9BUlJBWSwgbGV2ZWxzLCBnbEludGVybmFsRm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHRleHR1cmUuaXNEYXRhM0RUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0Z2wudGV4U3RvcmFnZTNEKCBnbC5URVhUVVJFXzNELCBsZXZlbHMsIGdsSW50ZXJuYWxGb3JtYXQsIHdpZHRoLCBoZWlnaHQsIGRlcHRoICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggISB0ZXh0dXJlLmlzVmlkZW9UZXh0dXJlICkge1xyXG5cclxuXHRcdFx0Z2wudGV4U3RvcmFnZTJEKCBnbFRleHR1cmVUeXBlLCBsZXZlbHMsIGdsSW50ZXJuYWxGb3JtYXQsIHdpZHRoLCBoZWlnaHQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0YmFja2VuZC5zZXQoIHRleHR1cmUsIHtcclxuXHRcdFx0dGV4dHVyZUdQVSxcclxuXHRcdFx0Z2xUZXh0dXJlVHlwZSxcclxuXHRcdFx0Z2xGb3JtYXQsXHJcblx0XHRcdGdsVHlwZSxcclxuXHRcdFx0Z2xJbnRlcm5hbEZvcm1hdFxyXG5cdFx0fSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwbG9hZHMgdGV4dHVyZSBidWZmZXIgZGF0YSB0byB0aGUgR1BVIG1lbW9yeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xCdWZmZXJ9IGJ1ZmZlciAtIFRoZSBidWZmZXIgZGF0YS5cclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZSxcclxuXHQgKi9cclxuXHRjb3B5QnVmZmVyVG9UZXh0dXJlKCBidWZmZXIsIHRleHR1cmUgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBnbCwgYmFja2VuZCB9ID0gdGhpcztcclxuXHJcblx0XHRjb25zdCB7IHRleHR1cmVHUFUsIGdsVGV4dHVyZVR5cGUsIGdsRm9ybWF0LCBnbFR5cGUgfSA9IGJhY2tlbmQuZ2V0KCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0Y29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSB0ZXh0dXJlLnNvdXJjZS5kYXRhO1xyXG5cclxuXHRcdGdsLmJpbmRCdWZmZXIoIGdsLlBJWEVMX1VOUEFDS19CVUZGRVIsIGJ1ZmZlciApO1xyXG5cclxuXHRcdGJhY2tlbmQuc3RhdGUuYmluZFRleHR1cmUoIGdsVGV4dHVyZVR5cGUsIHRleHR1cmVHUFUgKTtcclxuXHJcblx0XHRnbC5waXhlbFN0b3JlaSggZ2wuVU5QQUNLX0ZMSVBfWV9XRUJHTCwgZmFsc2UgKTtcclxuXHRcdGdsLnBpeGVsU3RvcmVpKCBnbC5VTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wsIGZhbHNlICk7XHJcblx0XHRnbC50ZXhTdWJJbWFnZTJEKCBnbFRleHR1cmVUeXBlLCAwLCAwLCAwLCB3aWR0aCwgaGVpZ2h0LCBnbEZvcm1hdCwgZ2xUeXBlLCAwICk7XHJcblxyXG5cdFx0Z2wuYmluZEJ1ZmZlciggZ2wuUElYRUxfVU5QQUNLX0JVRkZFUiwgbnVsbCApO1xyXG5cclxuXHRcdGJhY2tlbmQuc3RhdGUudW5iaW5kVGV4dHVyZSgpO1xyXG5cdFx0Ly8gZGVidWdcclxuXHRcdC8vIGNvbnN0IGZyYW1lYnVmZmVyID0gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTtcclxuXHRcdC8vIGdsLmJpbmRGcmFtZWJ1ZmZlciggZ2wuRlJBTUVCVUZGRVIsIGZyYW1lYnVmZmVyICk7XHJcblx0XHQvLyBnbC5mcmFtZWJ1ZmZlclRleHR1cmUyRCggZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbFRleHR1cmVUeXBlLCB0ZXh0dXJlR1BVLCAwICk7XHJcblxyXG5cdFx0Ly8gY29uc3QgcmVhZG91dCA9IG5ldyBGbG9hdDMyQXJyYXkoIHdpZHRoICogaGVpZ2h0ICogNCApO1xyXG5cclxuXHRcdC8vIGNvbnN0IGFsdEZvcm1hdCA9IGdsLmdldFBhcmFtZXRlciggZ2wuSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVQgKTtcclxuXHRcdC8vIGNvbnN0IGFsdFR5cGUgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLklNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfVFlQRSApO1xyXG5cclxuXHRcdC8vIGdsLnJlYWRQaXhlbHMoIDAsIDAsIHdpZHRoLCBoZWlnaHQsIGFsdEZvcm1hdCwgYWx0VHlwZSwgcmVhZG91dCApO1xyXG5cdFx0Ly8gZ2wuYmluZEZyYW1lYnVmZmVyKCBnbC5GUkFNRUJVRkZFUiwgbnVsbCApO1xyXG5cdFx0Ly8gY29uc29sZS5sb2coIHJlYWRvdXQgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGxvYWRzIHRoZSB1cGRhdGVkIHRleHR1cmUgZGF0YSB0byB0aGUgR1BVLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZVRleHR1cmUoIHRleHR1cmUsIG9wdGlvbnMgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBnbCB9ID0gdGhpcztcclxuXHRcdGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gb3B0aW9ucztcclxuXHRcdGNvbnN0IHsgdGV4dHVyZUdQVSwgZ2xUZXh0dXJlVHlwZSwgZ2xGb3JtYXQsIGdsVHlwZSwgZ2xJbnRlcm5hbEZvcm1hdCB9ID0gdGhpcy5iYWNrZW5kLmdldCggdGV4dHVyZSApO1xyXG5cclxuXHRcdGlmICggdGV4dHVyZS5pc1JlbmRlclRhcmdldFRleHR1cmUgfHwgKCB0ZXh0dXJlR1BVID09PSB1bmRlZmluZWQgLyogdW5zdXBwb3J0ZWQgdGV4dHVyZSBmb3JtYXQgKi8gKSApXHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHRjb25zdCBnZXRJbWFnZSA9ICggc291cmNlICkgPT4ge1xyXG5cclxuXHRcdFx0aWYgKCBzb3VyY2UuaXNEYXRhVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0cmV0dXJuIHNvdXJjZS5pbWFnZS5kYXRhO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggKCB0eXBlb2YgSFRNTEltYWdlRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgc291cmNlIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCApIHx8XHJcblx0XHRcdFx0KCB0eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHNvdXJjZSBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50ICkgfHxcclxuXHRcdFx0XHQoIHR5cGVvZiBJbWFnZUJpdG1hcCAhPT0gJ3VuZGVmaW5lZCcgJiYgc291cmNlIGluc3RhbmNlb2YgSW1hZ2VCaXRtYXAgKSB8fFxyXG5cdFx0XHRcdHNvdXJjZSBpbnN0YW5jZW9mIE9mZnNjcmVlbkNhbnZhcyApIHtcclxuXHJcblx0XHRcdFx0cmV0dXJuIHNvdXJjZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBzb3VyY2UuZGF0YTtcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdHRoaXMuYmFja2VuZC5zdGF0ZS5iaW5kVGV4dHVyZSggZ2xUZXh0dXJlVHlwZSwgdGV4dHVyZUdQVSApO1xyXG5cclxuXHRcdHRoaXMuc2V0VGV4dHVyZVBhcmFtZXRlcnMoIGdsVGV4dHVyZVR5cGUsIHRleHR1cmUgKTtcclxuXHJcblx0XHRpZiAoIHRleHR1cmUuaXNDb21wcmVzc2VkVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdGNvbnN0IG1pcG1hcHMgPSB0ZXh0dXJlLm1pcG1hcHM7XHJcblx0XHRcdGNvbnN0IGltYWdlID0gb3B0aW9ucy5pbWFnZTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IG1pcG1hcHMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBtaXBtYXAgPSBtaXBtYXBzWyBpIF07XHJcblxyXG5cdFx0XHRcdGlmICggdGV4dHVyZS5pc0NvbXByZXNzZWRBcnJheVRleHR1cmUgKSB7XHJcblxyXG5cclxuXHRcdFx0XHRcdGlmICggdGV4dHVyZS5mb3JtYXQgIT09IGdsLlJHQkEgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIGdsRm9ybWF0ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRnbC5jb21wcmVzc2VkVGV4U3ViSW1hZ2UzRCggZ2wuVEVYVFVSRV8yRF9BUlJBWSwgaSwgMCwgMCwgMCwgbWlwbWFwLndpZHRoLCBtaXBtYXAuaGVpZ2h0LCBpbWFnZS5kZXB0aCwgZ2xGb3JtYXQsIG1pcG1hcC5kYXRhICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBBdHRlbXB0IHRvIGxvYWQgdW5zdXBwb3J0ZWQgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdCBpbiAudXBsb2FkVGV4dHVyZSgpJyApO1xyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRnbC50ZXhTdWJJbWFnZTNEKCBnbC5URVhUVVJFXzJEX0FSUkFZLCBpLCAwLCAwLCAwLCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIGltYWdlLmRlcHRoLCBnbEZvcm1hdCwgZ2xUeXBlLCBtaXBtYXAuZGF0YSApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGdsRm9ybWF0ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Z2wuY29tcHJlc3NlZFRleFN1YkltYWdlMkQoIGdsLlRFWFRVUkVfMkQsIGksIDAsIDAsIG1pcG1hcC53aWR0aCwgbWlwbWFwLmhlaWdodCwgZ2xGb3JtYXQsIG1pcG1hcC5kYXRhICk7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1Vuc3VwcG9ydGVkIGNvbXByZXNzZWQgdGV4dHVyZSBmb3JtYXQnICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHRleHR1cmUuaXNDdWJlVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdGNvbnN0IGltYWdlcyA9IG9wdGlvbnMuaW1hZ2VzO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgNjsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgaW1hZ2UgPSBnZXRJbWFnZSggaW1hZ2VzWyBpIF0gKTtcclxuXHJcblx0XHRcdFx0Z2wudGV4U3ViSW1hZ2UyRCggZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaSwgMCwgMCwgMCwgd2lkdGgsIGhlaWdodCwgZ2xGb3JtYXQsIGdsVHlwZSwgaW1hZ2UgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2UgaWYgKCB0ZXh0dXJlLmlzRGF0YUFycmF5VGV4dHVyZSApIHtcclxuXHJcblx0XHRcdGNvbnN0IGltYWdlID0gb3B0aW9ucy5pbWFnZTtcclxuXHJcblx0XHRcdGdsLnRleFN1YkltYWdlM0QoIGdsLlRFWFRVUkVfMkRfQVJSQVksIDAsIDAsIDAsIDAsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQsIGltYWdlLmRlcHRoLCBnbEZvcm1hdCwgZ2xUeXBlLCBpbWFnZS5kYXRhICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggdGV4dHVyZS5pc0RhdGEzRFRleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBpbWFnZSA9IG9wdGlvbnMuaW1hZ2U7XHJcblxyXG5cdFx0XHRnbC50ZXhTdWJJbWFnZTNEKCBnbC5URVhUVVJFXzNELCAwLCAwLCAwLCAwLCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0LCBpbWFnZS5kZXB0aCwgZ2xGb3JtYXQsIGdsVHlwZSwgaW1hZ2UuZGF0YSApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHRleHR1cmUuaXNWaWRlb1RleHR1cmUgKSB7XHJcblxyXG5cdFx0XHR0ZXh0dXJlLnVwZGF0ZSgpO1xyXG5cclxuXHRcdFx0Z2wudGV4SW1hZ2UyRCggZ2xUZXh0dXJlVHlwZSwgMCwgZ2xJbnRlcm5hbEZvcm1hdCwgZ2xGb3JtYXQsIGdsVHlwZSwgb3B0aW9ucy5pbWFnZSApO1xyXG5cclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc3QgaW1hZ2UgPSBnZXRJbWFnZSggb3B0aW9ucy5pbWFnZSApO1xyXG5cclxuXHRcdFx0Z2wudGV4U3ViSW1hZ2UyRCggZ2xUZXh0dXJlVHlwZSwgMCwgMCwgMCwgd2lkdGgsIGhlaWdodCwgZ2xGb3JtYXQsIGdsVHlwZSwgaW1hZ2UgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2VuZXJhdGVzIG1pcG1hcHMgZm9yIHRoZSBnaXZlbiB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUuXHJcblx0ICovXHJcblx0Z2VuZXJhdGVNaXBtYXBzKCB0ZXh0dXJlICkge1xyXG5cclxuXHRcdGNvbnN0IHsgZ2wsIGJhY2tlbmQgfSA9IHRoaXM7XHJcblx0XHRjb25zdCB7IHRleHR1cmVHUFUsIGdsVGV4dHVyZVR5cGUgfSA9IGJhY2tlbmQuZ2V0KCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0YmFja2VuZC5zdGF0ZS5iaW5kVGV4dHVyZSggZ2xUZXh0dXJlVHlwZSwgdGV4dHVyZUdQVSApO1xyXG5cdFx0Z2wuZ2VuZXJhdGVNaXBtYXAoIGdsVGV4dHVyZVR5cGUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWFsbG9jYXRlcyB0aGUgcmVuZGVyIGJ1ZmZlcnMgb2YgdGhlIGdpdmVuIHJlbmRlciB0YXJnZXQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JlbmRlclRhcmdldH0gcmVuZGVyVGFyZ2V0IC0gVGhlIHJlbmRlciB0YXJnZXQuXHJcblx0ICovXHJcblx0ZGVhbGxvY2F0ZVJlbmRlckJ1ZmZlcnMoIHJlbmRlclRhcmdldCApIHtcclxuXHJcblx0XHRjb25zdCB7IGdsLCBiYWNrZW5kIH0gPSB0aGlzO1xyXG5cclxuXHRcdC8vIHJlbW92ZSBmcmFtZWJ1ZmZlciByZWZlcmVuY2VcclxuXHRcdGlmICggcmVuZGVyVGFyZ2V0ICkge1xyXG5cclxuXHRcdFx0Y29uc3QgcmVuZGVyQ29udGV4dERhdGEgPSBiYWNrZW5kLmdldCggcmVuZGVyVGFyZ2V0ICk7XHJcblxyXG5cdFx0XHRyZW5kZXJDb250ZXh0RGF0YS5yZW5kZXJCdWZmZXJTdG9yYWdlU2V0dXAgPSB1bmRlZmluZWQ7XHJcblxyXG5cdFx0XHRpZiAoIHJlbmRlckNvbnRleHREYXRhLmZyYW1lYnVmZmVycyApIHtcclxuXHJcblx0XHRcdFx0Zm9yICggY29uc3QgY2FjaGVLZXkgaW4gcmVuZGVyQ29udGV4dERhdGEuZnJhbWVidWZmZXJzICkge1xyXG5cclxuXHRcdFx0XHRcdGdsLmRlbGV0ZUZyYW1lYnVmZmVyKCByZW5kZXJDb250ZXh0RGF0YS5mcmFtZWJ1ZmZlcnNbIGNhY2hlS2V5IF0gKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRkZWxldGUgcmVuZGVyQ29udGV4dERhdGEuZnJhbWVidWZmZXJzO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCByZW5kZXJDb250ZXh0RGF0YS5kZXB0aFJlbmRlcmJ1ZmZlciApIHtcclxuXHJcblx0XHRcdFx0Z2wuZGVsZXRlUmVuZGVyYnVmZmVyKCByZW5kZXJDb250ZXh0RGF0YS5kZXB0aFJlbmRlcmJ1ZmZlciApO1xyXG5cdFx0XHRcdGRlbGV0ZSByZW5kZXJDb250ZXh0RGF0YS5kZXB0aFJlbmRlcmJ1ZmZlcjtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggcmVuZGVyQ29udGV4dERhdGEuc3RlbmNpbFJlbmRlcmJ1ZmZlciApIHtcclxuXHJcblx0XHRcdFx0Z2wuZGVsZXRlUmVuZGVyYnVmZmVyKCByZW5kZXJDb250ZXh0RGF0YS5zdGVuY2lsUmVuZGVyYnVmZmVyICk7XHJcblx0XHRcdFx0ZGVsZXRlIHJlbmRlckNvbnRleHREYXRhLnN0ZW5jaWxSZW5kZXJidWZmZXI7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHJlbmRlckNvbnRleHREYXRhLm1zYWFGcmFtZUJ1ZmZlciApIHtcclxuXHJcblx0XHRcdFx0Z2wuZGVsZXRlRnJhbWVidWZmZXIoIHJlbmRlckNvbnRleHREYXRhLm1zYWFGcmFtZUJ1ZmZlciApO1xyXG5cdFx0XHRcdGRlbGV0ZSByZW5kZXJDb250ZXh0RGF0YS5tc2FhRnJhbWVCdWZmZXI7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHJlbmRlckNvbnRleHREYXRhLm1zYWFSZW5kZXJidWZmZXJzICkge1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCByZW5kZXJDb250ZXh0RGF0YS5tc2FhUmVuZGVyYnVmZmVycy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0Z2wuZGVsZXRlUmVuZGVyYnVmZmVyKCByZW5kZXJDb250ZXh0RGF0YS5tc2FhUmVuZGVyYnVmZmVyc1sgaSBdICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0ZGVsZXRlIHJlbmRlckNvbnRleHREYXRhLm1zYWFSZW5kZXJidWZmZXJzO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZXN0cm95cyB0aGUgR1BVIGRhdGEgZm9yIHRoZSBnaXZlbiB0ZXh0dXJlIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlLlxyXG5cdCAqL1xyXG5cdGRlc3Ryb3lUZXh0dXJlKCB0ZXh0dXJlICkge1xyXG5cclxuXHRcdGNvbnN0IHsgZ2wsIGJhY2tlbmQgfSA9IHRoaXM7XHJcblx0XHRjb25zdCB7IHRleHR1cmVHUFUsIHJlbmRlclRhcmdldCB9ID0gYmFja2VuZC5nZXQoIHRleHR1cmUgKTtcclxuXHJcblx0XHR0aGlzLmRlYWxsb2NhdGVSZW5kZXJCdWZmZXJzKCByZW5kZXJUYXJnZXQgKTtcclxuXHRcdGdsLmRlbGV0ZVRleHR1cmUoIHRleHR1cmVHUFUgKTtcclxuXHJcblx0XHRiYWNrZW5kLmRlbGV0ZSggdGV4dHVyZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvcGllcyBkYXRhIG9mIHRoZSBnaXZlbiBzb3VyY2UgdGV4dHVyZSB0byB0aGUgZ2l2ZW4gZGVzdGluYXRpb24gdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gc3JjVGV4dHVyZSAtIFRoZSBzb3VyY2UgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IGRzdFRleHR1cmUgLSBUaGUgZGVzdGluYXRpb24gdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0gez8oQm94M3xCb3gyKX0gW3NyY1JlZ2lvbj1udWxsXSAtIFRoZSByZWdpb24gb2YgdGhlIHNvdXJjZSB0ZXh0dXJlIHRvIGNvcHkuXHJcblx0ICogQHBhcmFtIHs/KFZlY3RvcjJ8VmVjdG9yMyl9IFtkc3RQb3NpdGlvbj1udWxsXSAtIFRoZSBkZXN0aW5hdGlvbiBwb3NpdGlvbiBvZiB0aGUgY29weS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3NyY0xldmVsPTBdIC0gVGhlIHNvdXJjZSBtaXAgbGV2ZWwgdG8gY29weSBmcm9tLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZHN0TGV2ZWw9MF0gLSBUaGUgZGVzdGluYXRpb24gbWlwIGxldmVsIHRvIGNvcHkgdG8uXHJcblx0ICovXHJcblx0Y29weVRleHR1cmVUb1RleHR1cmUoIHNyY1RleHR1cmUsIGRzdFRleHR1cmUsIHNyY1JlZ2lvbiA9IG51bGwsIGRzdFBvc2l0aW9uID0gbnVsbCwgc3JjTGV2ZWwgPSAwLCBkc3RMZXZlbCA9IDAgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBnbCwgYmFja2VuZCB9ID0gdGhpcztcclxuXHRcdGNvbnN0IHsgc3RhdGUgfSA9IHRoaXMuYmFja2VuZDtcclxuXHJcblx0XHRjb25zdCB7IHRleHR1cmVHUFU6IGRzdFRleHR1cmVHUFUsIGdsVGV4dHVyZVR5cGUsIGdsVHlwZSwgZ2xGb3JtYXQgfSA9IGJhY2tlbmQuZ2V0KCBkc3RUZXh0dXJlICk7XHJcblxyXG5cdFx0c3RhdGUuYmluZFRleHR1cmUoIGdsVGV4dHVyZVR5cGUsIGRzdFRleHR1cmVHUFUgKTtcclxuXHJcblx0XHQvLyBnYXRoZXIgdGhlIG5lY2Vzc2FyeSBkaW1lbnNpb25zIHRvIGNvcHlcclxuXHRcdGxldCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgbWluWCwgbWluWSwgbWluWjtcclxuXHRcdGxldCBkc3RYLCBkc3RZLCBkc3RaO1xyXG5cdFx0Y29uc3QgaW1hZ2UgPSBzcmNUZXh0dXJlLmlzQ29tcHJlc3NlZFRleHR1cmUgPyBzcmNUZXh0dXJlLm1pcG1hcHNbIGRzdExldmVsIF0gOiBzcmNUZXh0dXJlLmltYWdlO1xyXG5cclxuXHRcdGlmICggc3JjUmVnaW9uICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0d2lkdGggPSBzcmNSZWdpb24ubWF4LnggLSBzcmNSZWdpb24ubWluLng7XHJcblx0XHRcdGhlaWdodCA9IHNyY1JlZ2lvbi5tYXgueSAtIHNyY1JlZ2lvbi5taW4ueTtcclxuXHRcdFx0ZGVwdGggPSBzcmNSZWdpb24uaXNCb3gzID8gc3JjUmVnaW9uLm1heC56IC0gc3JjUmVnaW9uLm1pbi56IDogMTtcclxuXHRcdFx0bWluWCA9IHNyY1JlZ2lvbi5taW4ueDtcclxuXHRcdFx0bWluWSA9IHNyY1JlZ2lvbi5taW4ueTtcclxuXHRcdFx0bWluWiA9IHNyY1JlZ2lvbi5pc0JveDMgPyBzcmNSZWdpb24ubWluLnogOiAwO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRjb25zdCBsZXZlbFNjYWxlID0gTWF0aC5wb3coIDIsIC0gc3JjTGV2ZWwgKTtcclxuXHRcdFx0d2lkdGggPSBNYXRoLmZsb29yKCBpbWFnZS53aWR0aCAqIGxldmVsU2NhbGUgKTtcclxuXHRcdFx0aGVpZ2h0ID0gTWF0aC5mbG9vciggaW1hZ2UuaGVpZ2h0ICogbGV2ZWxTY2FsZSApO1xyXG5cclxuXHRcdFx0aWYgKCBzcmNUZXh0dXJlLmlzRGF0YUFycmF5VGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0ZGVwdGggPSBpbWFnZS5kZXB0aDtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIHNyY1RleHR1cmUuaXNEYXRhM0RUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0XHRkZXB0aCA9IE1hdGguZmxvb3IoIGltYWdlLmRlcHRoICogbGV2ZWxTY2FsZSApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0ZGVwdGggPSAxO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0bWluWCA9IDA7XHJcblx0XHRcdG1pblkgPSAwO1xyXG5cdFx0XHRtaW5aID0gMDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBkc3RQb3NpdGlvbiAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGRzdFggPSBkc3RQb3NpdGlvbi54O1xyXG5cdFx0XHRkc3RZID0gZHN0UG9zaXRpb24ueTtcclxuXHRcdFx0ZHN0WiA9IGRzdFBvc2l0aW9uLno7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGRzdFggPSAwO1xyXG5cdFx0XHRkc3RZID0gMDtcclxuXHRcdFx0ZHN0WiA9IDA7XHJcblxyXG5cdFx0fVxyXG5cclxuXHJcblx0XHRnbC5waXhlbFN0b3JlaSggZ2wuVU5QQUNLX0ZMSVBfWV9XRUJHTCwgZHN0VGV4dHVyZS5mbGlwWSApO1xyXG5cdFx0Z2wucGl4ZWxTdG9yZWkoIGdsLlVOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTCwgZHN0VGV4dHVyZS5wcmVtdWx0aXBseUFscGhhICk7XHJcblx0XHRnbC5waXhlbFN0b3JlaSggZ2wuVU5QQUNLX0FMSUdOTUVOVCwgZHN0VGV4dHVyZS51bnBhY2tBbGlnbm1lbnQgKTtcclxuXHJcblx0XHQvLyB1c2VkIGZvciBjb3B5aW5nIGRhdGEgZnJvbSBjcHVcclxuXHRcdGNvbnN0IGN1cnJlbnRVbnBhY2tSb3dMZW4gPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLlVOUEFDS19ST1dfTEVOR1RIICk7XHJcblx0XHRjb25zdCBjdXJyZW50VW5wYWNrSW1hZ2VIZWlnaHQgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLlVOUEFDS19JTUFHRV9IRUlHSFQgKTtcclxuXHRcdGNvbnN0IGN1cnJlbnRVbnBhY2tTa2lwUGl4ZWxzID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5VTlBBQ0tfU0tJUF9QSVhFTFMgKTtcclxuXHRcdGNvbnN0IGN1cnJlbnRVbnBhY2tTa2lwUm93cyA9IGdsLmdldFBhcmFtZXRlciggZ2wuVU5QQUNLX1NLSVBfUk9XUyApO1xyXG5cdFx0Y29uc3QgY3VycmVudFVucGFja1NraXBJbWFnZXMgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLlVOUEFDS19TS0lQX0lNQUdFUyApO1xyXG5cclxuXHRcdGdsLnBpeGVsU3RvcmVpKCBnbC5VTlBBQ0tfUk9XX0xFTkdUSCwgaW1hZ2Uud2lkdGggKTtcclxuXHRcdGdsLnBpeGVsU3RvcmVpKCBnbC5VTlBBQ0tfSU1BR0VfSEVJR0hULCBpbWFnZS5oZWlnaHQgKTtcclxuXHRcdGdsLnBpeGVsU3RvcmVpKCBnbC5VTlBBQ0tfU0tJUF9QSVhFTFMsIG1pblggKTtcclxuXHRcdGdsLnBpeGVsU3RvcmVpKCBnbC5VTlBBQ0tfU0tJUF9ST1dTLCBtaW5ZICk7XHJcblx0XHRnbC5waXhlbFN0b3JlaSggZ2wuVU5QQUNLX1NLSVBfSU1BR0VTLCBtaW5aICk7XHJcblxyXG5cdFx0Ly8gc2V0IHVwIHRoZSBzcmMgdGV4dHVyZVxyXG5cdFx0Y29uc3QgaXNEc3QzRCA9IGRzdFRleHR1cmUuaXNEYXRhQXJyYXlUZXh0dXJlIHx8IGRzdFRleHR1cmUuaXNEYXRhM0RUZXh0dXJlO1xyXG5cdFx0aWYgKCBzcmNUZXh0dXJlLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSB8fCBzcmNUZXh0dXJlLmlzRGVwdGhUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgc3JjVGV4dHVyZURhdGEgPSBiYWNrZW5kLmdldCggc3JjVGV4dHVyZSApO1xyXG5cdFx0XHRjb25zdCBkc3RUZXh0dXJlRGF0YSA9IGJhY2tlbmQuZ2V0KCBkc3RUZXh0dXJlICk7XHJcblxyXG5cdFx0XHRjb25zdCBzcmNSZW5kZXJDb250ZXh0RGF0YSA9IGJhY2tlbmQuZ2V0KCBzcmNUZXh0dXJlRGF0YS5yZW5kZXJUYXJnZXQgKTtcclxuXHRcdFx0Y29uc3QgZHN0UmVuZGVyQ29udGV4dERhdGEgPSBiYWNrZW5kLmdldCggZHN0VGV4dHVyZURhdGEucmVuZGVyVGFyZ2V0ICk7XHJcblxyXG5cdFx0XHRjb25zdCBzcmNGcmFtZWJ1ZmZlciA9IHNyY1JlbmRlckNvbnRleHREYXRhLmZyYW1lYnVmZmVyc1sgc3JjVGV4dHVyZURhdGEuY2FjaGVLZXkgXTtcclxuXHRcdFx0Y29uc3QgZHN0RnJhbWVidWZmZXIgPSBkc3RSZW5kZXJDb250ZXh0RGF0YS5mcmFtZWJ1ZmZlcnNbIGRzdFRleHR1cmVEYXRhLmNhY2hlS2V5IF07XHJcblxyXG5cdFx0XHRzdGF0ZS5iaW5kRnJhbWVidWZmZXIoIGdsLlJFQURfRlJBTUVCVUZGRVIsIHNyY0ZyYW1lYnVmZmVyICk7XHJcblx0XHRcdHN0YXRlLmJpbmRGcmFtZWJ1ZmZlciggZ2wuRFJBV19GUkFNRUJVRkZFUiwgZHN0RnJhbWVidWZmZXIgKTtcclxuXHJcblx0XHRcdGxldCBtYXNrID0gZ2wuQ09MT1JfQlVGRkVSX0JJVDtcclxuXHJcblx0XHRcdGlmICggc3JjVGV4dHVyZS5pc0RlcHRoVGV4dHVyZSApIG1hc2sgPSBnbC5ERVBUSF9CVUZGRVJfQklUO1xyXG5cclxuXHRcdFx0Z2wuYmxpdEZyYW1lYnVmZmVyKCBtaW5YLCBtaW5ZLCB3aWR0aCwgaGVpZ2h0LCBkc3RYLCBkc3RZLCB3aWR0aCwgaGVpZ2h0LCBtYXNrLCBnbC5ORUFSRVNUICk7XHJcblxyXG5cdFx0XHRzdGF0ZS5iaW5kRnJhbWVidWZmZXIoIGdsLlJFQURfRlJBTUVCVUZGRVIsIG51bGwgKTtcclxuXHRcdFx0c3RhdGUuYmluZEZyYW1lYnVmZmVyKCBnbC5EUkFXX0ZSQU1FQlVGRkVSLCBudWxsICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGlmICggaXNEc3QzRCApIHtcclxuXHJcblx0XHRcdFx0Ly8gY29weSBkYXRhIGludG8gdGhlIDNkIHRleHR1cmVcclxuXHRcdFx0XHRpZiAoIHNyY1RleHR1cmUuaXNEYXRhVGV4dHVyZSB8fCBzcmNUZXh0dXJlLmlzRGF0YTNEVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0XHRnbC50ZXhTdWJJbWFnZTNEKCBnbFRleHR1cmVUeXBlLCBkc3RMZXZlbCwgZHN0WCwgZHN0WSwgZHN0Wiwgd2lkdGgsIGhlaWdodCwgZGVwdGgsIGdsRm9ybWF0LCBnbFR5cGUsIGltYWdlLmRhdGEgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggZHN0VGV4dHVyZS5pc0NvbXByZXNzZWRBcnJheVRleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRcdFx0Z2wuY29tcHJlc3NlZFRleFN1YkltYWdlM0QoIGdsVGV4dHVyZVR5cGUsIGRzdExldmVsLCBkc3RYLCBkc3RZLCBkc3RaLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgZ2xGb3JtYXQsIGltYWdlLmRhdGEgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRnbC50ZXhTdWJJbWFnZTNEKCBnbFRleHR1cmVUeXBlLCBkc3RMZXZlbCwgZHN0WCwgZHN0WSwgZHN0Wiwgd2lkdGgsIGhlaWdodCwgZGVwdGgsIGdsRm9ybWF0LCBnbFR5cGUsIGltYWdlICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdC8vIGNvcHkgZGF0YSBpbnRvIHRoZSAyZCB0ZXh0dXJlXHJcblx0XHRcdFx0aWYgKCBzcmNUZXh0dXJlLmlzRGF0YVRleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRcdFx0Z2wudGV4U3ViSW1hZ2UyRCggZ2xUZXh0dXJlVHlwZSwgZHN0TGV2ZWwsIGRzdFgsIGRzdFksIHdpZHRoLCBoZWlnaHQsIGdsRm9ybWF0LCBnbFR5cGUsIGltYWdlLmRhdGEgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggc3JjVGV4dHVyZS5pc0NvbXByZXNzZWRUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0XHRcdGdsLmNvbXByZXNzZWRUZXhTdWJJbWFnZTJEKCBnbFRleHR1cmVUeXBlLCBkc3RMZXZlbCwgZHN0WCwgZHN0WSwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCwgZ2xGb3JtYXQsIGltYWdlLmRhdGEgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRnbC50ZXhTdWJJbWFnZTJEKCBnbFRleHR1cmVUeXBlLCBkc3RMZXZlbCwgZHN0WCwgZHN0WSwgd2lkdGgsIGhlaWdodCwgZ2xGb3JtYXQsIGdsVHlwZSwgaW1hZ2UgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyByZXNldCB2YWx1ZXNcclxuXHRcdGdsLnBpeGVsU3RvcmVpKCBnbC5VTlBBQ0tfUk9XX0xFTkdUSCwgY3VycmVudFVucGFja1Jvd0xlbiApO1xyXG5cdFx0Z2wucGl4ZWxTdG9yZWkoIGdsLlVOUEFDS19JTUFHRV9IRUlHSFQsIGN1cnJlbnRVbnBhY2tJbWFnZUhlaWdodCApO1xyXG5cdFx0Z2wucGl4ZWxTdG9yZWkoIGdsLlVOUEFDS19TS0lQX1BJWEVMUywgY3VycmVudFVucGFja1NraXBQaXhlbHMgKTtcclxuXHRcdGdsLnBpeGVsU3RvcmVpKCBnbC5VTlBBQ0tfU0tJUF9ST1dTLCBjdXJyZW50VW5wYWNrU2tpcFJvd3MgKTtcclxuXHRcdGdsLnBpeGVsU3RvcmVpKCBnbC5VTlBBQ0tfU0tJUF9JTUFHRVMsIGN1cnJlbnRVbnBhY2tTa2lwSW1hZ2VzICk7XHJcblxyXG5cdFx0Ly8gR2VuZXJhdGUgbWlwbWFwcyBvbmx5IHdoZW4gY29weWluZyBsZXZlbCAwXHJcblx0XHRpZiAoIGRzdExldmVsID09PSAwICYmIGRzdFRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzICkge1xyXG5cclxuXHRcdFx0Z2wuZ2VuZXJhdGVNaXBtYXAoIGdsVGV4dHVyZVR5cGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0c3RhdGUudW5iaW5kVGV4dHVyZSgpO1xyXG5cclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBDb3BpZXMgdGhlIGN1cnJlbnQgYm91bmQgZnJhbWVidWZmZXIgdG8gdGhlIGdpdmVuIHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgZGVzdGluYXRpb24gdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge1JlbmRlckNvbnRleHR9IHJlbmRlckNvbnRleHQgLSBUaGUgcmVuZGVyIGNvbnRleHQuXHJcblx0ICogQHBhcmFtIHtWZWN0b3I0fSByZWN0YW5nbGUgLSBBIGZvdXIgZGltZW5zaW9uYWwgdmVjdG9yIGRlZmluaW5nIHRoZSBvcmlnaW4gYW5kIGRpbWVuc2lvbiBvZiB0aGUgY29weS5cclxuXHQgKi9cclxuXHRjb3B5RnJhbWVidWZmZXJUb1RleHR1cmUoIHRleHR1cmUsIHJlbmRlckNvbnRleHQsIHJlY3RhbmdsZSApIHtcclxuXHJcblx0XHRjb25zdCB7IGdsIH0gPSB0aGlzO1xyXG5cdFx0Y29uc3QgeyBzdGF0ZSB9ID0gdGhpcy5iYWNrZW5kO1xyXG5cclxuXHRcdGNvbnN0IHsgdGV4dHVyZUdQVSB9ID0gdGhpcy5iYWNrZW5kLmdldCggdGV4dHVyZSApO1xyXG5cclxuXHRcdGNvbnN0IHsgeCwgeSwgejogd2lkdGgsIHc6IGhlaWdodCB9ID0gcmVjdGFuZ2xlO1xyXG5cclxuXHRcdGNvbnN0IHJlcXVpcmVEcmF3RnJhbWVCdWZmZXIgPSB0ZXh0dXJlLmlzRGVwdGhUZXh0dXJlID09PSB0cnVlIHx8ICggcmVuZGVyQ29udGV4dC5yZW5kZXJUYXJnZXQgJiYgcmVuZGVyQ29udGV4dC5yZW5kZXJUYXJnZXQuc2FtcGxlcyA+IDAgKTtcclxuXHJcblx0XHRjb25zdCBzcmNIZWlnaHQgPSByZW5kZXJDb250ZXh0LnJlbmRlclRhcmdldCA/IHJlbmRlckNvbnRleHQucmVuZGVyVGFyZ2V0LmhlaWdodCA6IHRoaXMuYmFja2VuZC5nZXREcmF3aW5nQnVmZmVyU2l6ZSgpLnk7XHJcblxyXG5cdFx0aWYgKCByZXF1aXJlRHJhd0ZyYW1lQnVmZmVyICkge1xyXG5cclxuXHRcdFx0Y29uc3QgcGFydGlhbCA9ICggeCAhPT0gMCB8fCB5ICE9PSAwICk7XHJcblx0XHRcdGxldCBtYXNrO1xyXG5cdFx0XHRsZXQgYXR0YWNobWVudDtcclxuXHJcblx0XHRcdGlmICggdGV4dHVyZS5pc0RlcHRoVGV4dHVyZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0bWFzayA9IGdsLkRFUFRIX0JVRkZFUl9CSVQ7XHJcblx0XHRcdFx0YXR0YWNobWVudCA9IGdsLkRFUFRIX0FUVEFDSE1FTlQ7XHJcblxyXG5cdFx0XHRcdGlmICggcmVuZGVyQ29udGV4dC5zdGVuY2lsICkge1xyXG5cclxuXHRcdFx0XHRcdG1hc2sgfD0gZ2wuU1RFTkNJTF9CVUZGRVJfQklUO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRtYXNrID0gZ2wuQ09MT1JfQlVGRkVSX0JJVDtcclxuXHRcdFx0XHRhdHRhY2htZW50ID0gZ2wuQ09MT1JfQVRUQUNITUVOVDA7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHBhcnRpYWwgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHJlbmRlclRhcmdldENvbnRleHREYXRhID0gdGhpcy5iYWNrZW5kLmdldCggcmVuZGVyQ29udGV4dC5yZW5kZXJUYXJnZXQgKTtcclxuXHJcblx0XHRcdFx0Y29uc3QgZmIgPSByZW5kZXJUYXJnZXRDb250ZXh0RGF0YS5mcmFtZWJ1ZmZlcnNbIHJlbmRlckNvbnRleHQuZ2V0Q2FjaGVLZXkoKSBdO1xyXG5cdFx0XHRcdGNvbnN0IG1zYWFGcmFtZUJ1ZmZlciA9IHJlbmRlclRhcmdldENvbnRleHREYXRhLm1zYWFGcmFtZUJ1ZmZlcjtcclxuXHJcblx0XHRcdFx0c3RhdGUuYmluZEZyYW1lYnVmZmVyKCBnbC5EUkFXX0ZSQU1FQlVGRkVSLCBmYiApO1xyXG5cdFx0XHRcdHN0YXRlLmJpbmRGcmFtZWJ1ZmZlciggZ2wuUkVBRF9GUkFNRUJVRkZFUiwgbXNhYUZyYW1lQnVmZmVyICk7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGZsaXBwZWRZID0gc3JjSGVpZ2h0IC0geSAtIGhlaWdodDtcclxuXHJcblx0XHRcdFx0Z2wuYmxpdEZyYW1lYnVmZmVyKCB4LCBmbGlwcGVkWSwgeCArIHdpZHRoLCBmbGlwcGVkWSArIGhlaWdodCwgeCwgZmxpcHBlZFksIHggKyB3aWR0aCwgZmxpcHBlZFkgKyBoZWlnaHQsIG1hc2ssIGdsLk5FQVJFU1QgKTtcclxuXHJcblx0XHRcdFx0c3RhdGUuYmluZEZyYW1lYnVmZmVyKCBnbC5SRUFEX0ZSQU1FQlVGRkVSLCBmYiApO1xyXG5cclxuXHRcdFx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZUdQVSApO1xyXG5cclxuXHRcdFx0XHRnbC5jb3B5VGV4U3ViSW1hZ2UyRCggZ2wuVEVYVFVSRV8yRCwgMCwgMCwgMCwgeCwgZmxpcHBlZFksIHdpZHRoLCBoZWlnaHQgKTtcclxuXHJcblx0XHRcdFx0c3RhdGUudW5iaW5kVGV4dHVyZSgpO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgZmIgPSBnbC5jcmVhdGVGcmFtZWJ1ZmZlcigpO1xyXG5cclxuXHRcdFx0XHRzdGF0ZS5iaW5kRnJhbWVidWZmZXIoIGdsLkRSQVdfRlJBTUVCVUZGRVIsIGZiICk7XHJcblxyXG5cdFx0XHRcdGdsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKCBnbC5EUkFXX0ZSQU1FQlVGRkVSLCBhdHRhY2htZW50LCBnbC5URVhUVVJFXzJELCB0ZXh0dXJlR1BVLCAwICk7XHJcblx0XHRcdFx0Z2wuYmxpdEZyYW1lYnVmZmVyKCAwLCAwLCB3aWR0aCwgaGVpZ2h0LCAwLCAwLCB3aWR0aCwgaGVpZ2h0LCBtYXNrLCBnbC5ORUFSRVNUICk7XHJcblxyXG5cdFx0XHRcdGdsLmRlbGV0ZUZyYW1lYnVmZmVyKCBmYiApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZUdQVSApO1xyXG5cdFx0XHRnbC5jb3B5VGV4U3ViSW1hZ2UyRCggZ2wuVEVYVFVSRV8yRCwgMCwgMCwgMCwgeCwgc3JjSGVpZ2h0IC0gaGVpZ2h0IC0geSwgd2lkdGgsIGhlaWdodCApO1xyXG5cclxuXHRcdFx0c3RhdGUudW5iaW5kVGV4dHVyZSgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzICkgdGhpcy5nZW5lcmF0ZU1pcG1hcHMoIHRleHR1cmUgKTtcclxuXHJcblx0XHR0aGlzLmJhY2tlbmQuX3NldEZyYW1lYnVmZmVyKCByZW5kZXJDb250ZXh0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0dXBTIHN0b3JhZ2UgZm9yIGludGVybmFsIGRlcHRoL3N0ZW5jaWwgYnVmZmVycyBhbmQgYmluZCB0byBjb3JyZWN0IGZyYW1lYnVmZmVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlcmJ1ZmZlcn0gcmVuZGVyYnVmZmVyIC0gVGhlIHJlbmRlciBidWZmZXIuXHJcblx0ICogQHBhcmFtIHtSZW5kZXJDb250ZXh0fSByZW5kZXJDb250ZXh0IC0gVGhlIHJlbmRlciBjb250ZXh0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzYW1wbGVzIC0gVGhlIE1TQUEgc2FtcGxlIGNvdW50LlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW3VzZU11bHRpc2FtcGxlZFJUVD1mYWxzZV0gLSBXaGV0aGVyIHRvIHVzZSBXRUJHTF9tdWx0aXNhbXBsZWRfcmVuZGVyX3RvX3RleHR1cmUgb3Igbm90LlxyXG5cdCAqL1xyXG5cdHNldHVwUmVuZGVyQnVmZmVyU3RvcmFnZSggcmVuZGVyYnVmZmVyLCByZW5kZXJDb250ZXh0LCBzYW1wbGVzLCB1c2VNdWx0aXNhbXBsZWRSVFQgPSBmYWxzZSApIHtcclxuXHJcblx0XHRjb25zdCB7IGdsIH0gPSB0aGlzO1xyXG5cdFx0Y29uc3QgcmVuZGVyVGFyZ2V0ID0gcmVuZGVyQ29udGV4dC5yZW5kZXJUYXJnZXQ7XHJcblxyXG5cdFx0Y29uc3QgeyBkZXB0aFRleHR1cmUsIGRlcHRoQnVmZmVyLCBzdGVuY2lsQnVmZmVyLCB3aWR0aCwgaGVpZ2h0IH0gPSByZW5kZXJUYXJnZXQ7XHJcblxyXG5cdFx0Z2wuYmluZFJlbmRlcmJ1ZmZlciggZ2wuUkVOREVSQlVGRkVSLCByZW5kZXJidWZmZXIgKTtcclxuXHJcblx0XHRpZiAoIGRlcHRoQnVmZmVyICYmICEgc3RlbmNpbEJ1ZmZlciApIHtcclxuXHJcblx0XHRcdGxldCBnbEludGVybmFsRm9ybWF0ID0gZ2wuREVQVEhfQ09NUE9ORU5UMjQ7XHJcblxyXG5cdFx0XHRpZiAoIHVzZU11bHRpc2FtcGxlZFJUVCA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgbXVsdGlzYW1wbGVkUlRURXh0ID0gdGhpcy5leHRlbnNpb25zLmdldCggJ1dFQkdMX211bHRpc2FtcGxlZF9yZW5kZXJfdG9fdGV4dHVyZScgKTtcclxuXHJcblx0XHRcdFx0bXVsdGlzYW1wbGVkUlRURXh0LnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUVYVCggZ2wuUkVOREVSQlVGRkVSLCByZW5kZXJUYXJnZXQuc2FtcGxlcywgZ2xJbnRlcm5hbEZvcm1hdCwgd2lkdGgsIGhlaWdodCApO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggc2FtcGxlcyA+IDAgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggZGVwdGhUZXh0dXJlICYmIGRlcHRoVGV4dHVyZS5pc0RlcHRoVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGRlcHRoVGV4dHVyZS50eXBlID09PSBnbC5GTE9BVCApIHtcclxuXHJcblx0XHRcdFx0XHRcdGdsSW50ZXJuYWxGb3JtYXQgPSBnbC5ERVBUSF9DT01QT05FTlQzMkY7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGdsLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZSggZ2wuUkVOREVSQlVGRkVSLCBzYW1wbGVzLCBnbEludGVybmFsRm9ybWF0LCB3aWR0aCwgaGVpZ2h0ICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRnbC5yZW5kZXJidWZmZXJTdG9yYWdlKCBnbC5SRU5ERVJCVUZGRVIsIGdsSW50ZXJuYWxGb3JtYXQsIHdpZHRoLCBoZWlnaHQgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGdsLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKCBnbC5GUkFNRUJVRkZFUiwgZ2wuREVQVEhfQVRUQUNITUVOVCwgZ2wuUkVOREVSQlVGRkVSLCByZW5kZXJidWZmZXIgKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBkZXB0aEJ1ZmZlciAmJiBzdGVuY2lsQnVmZmVyICkge1xyXG5cclxuXHRcdFx0aWYgKCBzYW1wbGVzID4gMCApIHtcclxuXHJcblx0XHRcdFx0Z2wucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKCBnbC5SRU5ERVJCVUZGRVIsIHNhbXBsZXMsIGdsLkRFUFRIMjRfU1RFTkNJTDgsIHdpZHRoLCBoZWlnaHQgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGdsLnJlbmRlcmJ1ZmZlclN0b3JhZ2UoIGdsLlJFTkRFUkJVRkZFUiwgZ2wuREVQVEhfU1RFTkNJTCwgd2lkdGgsIGhlaWdodCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHJcblx0XHRcdGdsLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKCBnbC5GUkFNRUJVRkZFUiwgZ2wuREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5ULCBnbC5SRU5ERVJCVUZGRVIsIHJlbmRlcmJ1ZmZlciApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRleHR1cmUgZGF0YSBhcyBhIHR5cGVkIGFycmF5LlxyXG5cdCAqXHJcblx0ICogQGFzeW5jXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUgdG8gY29weS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGNvcHkgb3JpZ2luLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgY29weSBvcmlnaW4uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSBjb3B5LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSBjb3B5LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBmYWNlSW5kZXggLSBUaGUgZmFjZSBpbmRleC5cclxuXHQgKiBAcmV0dXJuIHtQcm9taXNlPFR5cGVkQXJyYXk+fSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGEgdHlwZWQgYXJyYXkgd2hlbiB0aGUgY29weSBvcGVyYXRpb24gaGFzIGZpbmlzaGVkLlxyXG5cdCAqL1xyXG5cdGFzeW5jIGNvcHlUZXh0dXJlVG9CdWZmZXIoIHRleHR1cmUsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGZhY2VJbmRleCApIHtcclxuXHJcblx0XHRjb25zdCB7IGJhY2tlbmQsIGdsIH0gPSB0aGlzO1xyXG5cclxuXHRcdGNvbnN0IHsgdGV4dHVyZUdQVSwgZ2xGb3JtYXQsIGdsVHlwZSB9ID0gdGhpcy5iYWNrZW5kLmdldCggdGV4dHVyZSApO1xyXG5cclxuXHRcdGNvbnN0IGZiID0gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTtcclxuXHJcblx0XHRnbC5iaW5kRnJhbWVidWZmZXIoIGdsLlJFQURfRlJBTUVCVUZGRVIsIGZiICk7XHJcblxyXG5cdFx0Y29uc3QgdGFyZ2V0ID0gdGV4dHVyZS5pc0N1YmVUZXh0dXJlID8gZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgZmFjZUluZGV4IDogZ2wuVEVYVFVSRV8yRDtcclxuXHJcblx0XHRnbC5mcmFtZWJ1ZmZlclRleHR1cmUyRCggZ2wuUkVBRF9GUkFNRUJVRkZFUiwgZ2wuQ09MT1JfQVRUQUNITUVOVDAsIHRhcmdldCwgdGV4dHVyZUdQVSwgMCApO1xyXG5cclxuXHRcdGNvbnN0IHR5cGVkQXJyYXlUeXBlID0gdGhpcy5fZ2V0VHlwZWRBcnJheVR5cGUoIGdsVHlwZSApO1xyXG5cdFx0Y29uc3QgYnl0ZXNQZXJUZXhlbCA9IHRoaXMuX2dldEJ5dGVzUGVyVGV4ZWwoIGdsVHlwZSwgZ2xGb3JtYXQgKTtcclxuXHJcblx0XHRjb25zdCBlbGVtZW50Q291bnQgPSB3aWR0aCAqIGhlaWdodDtcclxuXHRcdGNvbnN0IGJ5dGVMZW5ndGggPSBlbGVtZW50Q291bnQgKiBieXRlc1BlclRleGVsO1xyXG5cclxuXHRcdGNvbnN0IGJ1ZmZlciA9IGdsLmNyZWF0ZUJ1ZmZlcigpO1xyXG5cclxuXHRcdGdsLmJpbmRCdWZmZXIoIGdsLlBJWEVMX1BBQ0tfQlVGRkVSLCBidWZmZXIgKTtcclxuXHRcdGdsLmJ1ZmZlckRhdGEoIGdsLlBJWEVMX1BBQ0tfQlVGRkVSLCBieXRlTGVuZ3RoLCBnbC5TVFJFQU1fUkVBRCApO1xyXG5cdFx0Z2wucmVhZFBpeGVscyggeCwgeSwgd2lkdGgsIGhlaWdodCwgZ2xGb3JtYXQsIGdsVHlwZSwgMCApO1xyXG5cdFx0Z2wuYmluZEJ1ZmZlciggZ2wuUElYRUxfUEFDS19CVUZGRVIsIG51bGwgKTtcclxuXHJcblx0XHRhd2FpdCBiYWNrZW5kLnV0aWxzLl9jbGllbnRXYWl0QXN5bmMoKTtcclxuXHJcblx0XHRjb25zdCBkc3RCdWZmZXIgPSBuZXcgdHlwZWRBcnJheVR5cGUoIGJ5dGVMZW5ndGggLyB0eXBlZEFycmF5VHlwZS5CWVRFU19QRVJfRUxFTUVOVCApO1xyXG5cclxuXHRcdGdsLmJpbmRCdWZmZXIoIGdsLlBJWEVMX1BBQ0tfQlVGRkVSLCBidWZmZXIgKTtcclxuXHRcdGdsLmdldEJ1ZmZlclN1YkRhdGEoIGdsLlBJWEVMX1BBQ0tfQlVGRkVSLCAwLCBkc3RCdWZmZXIgKTtcclxuXHRcdGdsLmJpbmRCdWZmZXIoIGdsLlBJWEVMX1BBQ0tfQlVGRkVSLCBudWxsICk7XHJcblxyXG5cdFx0Z2wuZGVsZXRlRnJhbWVidWZmZXIoIGZiICk7XHJcblxyXG5cdFx0cmV0dXJuIGRzdEJ1ZmZlcjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHR5cGVkIGFycmF5IHR5cGUgZm9yIHRoZSBnaXZlbiBXZWJHTCBkYXRhIHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7R0xlbnVtfSBnbFR5cGUgLSBUaGUgV2ViR0wgZGF0YSB0eXBlLlxyXG5cdCAqIEByZXR1cm4ge1R5cGVkQXJyYXkuY29uc3RydWN0b3J9IFRoZSB0eXBlZCBhcnJheSB0eXBlLlxyXG5cdCAqL1xyXG5cdF9nZXRUeXBlZEFycmF5VHlwZSggZ2xUeXBlICkge1xyXG5cclxuXHRcdGNvbnN0IHsgZ2wgfSA9IHRoaXM7XHJcblxyXG5cdFx0aWYgKCBnbFR5cGUgPT09IGdsLlVOU0lHTkVEX0JZVEUgKSByZXR1cm4gVWludDhBcnJheTtcclxuXHJcblx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuVU5TSUdORURfU0hPUlRfNF80XzRfNCApIHJldHVybiBVaW50MTZBcnJheTtcclxuXHRcdGlmICggZ2xUeXBlID09PSBnbC5VTlNJR05FRF9TSE9SVF81XzVfNV8xICkgcmV0dXJuIFVpbnQxNkFycmF5O1xyXG5cdFx0aWYgKCBnbFR5cGUgPT09IGdsLlVOU0lHTkVEX1NIT1JUXzVfNl81ICkgcmV0dXJuIFVpbnQxNkFycmF5O1xyXG5cdFx0aWYgKCBnbFR5cGUgPT09IGdsLlVOU0lHTkVEX1NIT1JUICkgcmV0dXJuIFVpbnQxNkFycmF5O1xyXG5cdFx0aWYgKCBnbFR5cGUgPT09IGdsLlVOU0lHTkVEX0lOVCApIHJldHVybiBVaW50MzJBcnJheTtcclxuXHJcblx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuSEFMRl9GTE9BVCApIHJldHVybiBVaW50MTZBcnJheTtcclxuXHRcdGlmICggZ2xUeXBlID09PSBnbC5GTE9BVCApIHJldHVybiBGbG9hdDMyQXJyYXk7XHJcblxyXG5cdFx0dGhyb3cgbmV3IEVycm9yKCBgVW5zdXBwb3J0ZWQgV2ViR0wgdHlwZTogJHtnbFR5cGV9YCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGJ5dGVzLXBlci10ZXhlbCB2YWx1ZSBmb3IgdGhlIGdpdmVuIFdlYkdMIGRhdGEgdHlwZSBhbmQgdGV4dHVyZSBmb3JtYXQuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7R0xlbnVtfSBnbFR5cGUgLSBUaGUgV2ViR0wgZGF0YSB0eXBlLlxyXG5cdCAqIEBwYXJhbSB7R0xlbnVtfSBnbEZvcm1hdCAtIFRoZSBXZWJHTCB0ZXh0dXJlIGZvcm1hdC5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBieXRlcy1wZXItdGV4ZWwuXHJcblx0ICovXHJcblx0X2dldEJ5dGVzUGVyVGV4ZWwoIGdsVHlwZSwgZ2xGb3JtYXQgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBnbCB9ID0gdGhpcztcclxuXHJcblx0XHRsZXQgYnl0ZXNQZXJDb21wb25lbnQgPSAwO1xyXG5cclxuXHRcdGlmICggZ2xUeXBlID09PSBnbC5VTlNJR05FRF9CWVRFICkgYnl0ZXNQZXJDb21wb25lbnQgPSAxO1xyXG5cclxuXHRcdGlmICggZ2xUeXBlID09PSBnbC5VTlNJR05FRF9TSE9SVF80XzRfNF80IHx8XHJcblx0XHRcdGdsVHlwZSA9PT0gZ2wuVU5TSUdORURfU0hPUlRfNV81XzVfMSB8fFxyXG5cdFx0XHRnbFR5cGUgPT09IGdsLlVOU0lHTkVEX1NIT1JUXzVfNl81IHx8XHJcblx0XHRcdGdsVHlwZSA9PT0gZ2wuVU5TSUdORURfU0hPUlQgfHxcclxuXHRcdFx0Z2xUeXBlID09PSBnbC5IQUxGX0ZMT0FUICkgYnl0ZXNQZXJDb21wb25lbnQgPSAyO1xyXG5cclxuXHRcdGlmICggZ2xUeXBlID09PSBnbC5VTlNJR05FRF9JTlQgfHxcclxuXHRcdFx0Z2xUeXBlID09PSBnbC5GTE9BVCApIGJ5dGVzUGVyQ29tcG9uZW50ID0gNDtcclxuXHJcblx0XHRpZiAoIGdsRm9ybWF0ID09PSBnbC5SR0JBICkgcmV0dXJuIGJ5dGVzUGVyQ29tcG9uZW50ICogNDtcclxuXHRcdGlmICggZ2xGb3JtYXQgPT09IGdsLlJHQiApIHJldHVybiBieXRlc1BlckNvbXBvbmVudCAqIDM7XHJcblx0XHRpZiAoIGdsRm9ybWF0ID09PSBnbC5BTFBIQSApIHJldHVybiBieXRlc1BlckNvbXBvbmVudDtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgV2ViR0xUZXh0dXJlVXRpbHM7XHJcbiIsIi8qKlxyXG4gKiBBIFdlYkdMIDIgYmFja2VuZCB1dGlsaXR5IG1vZHVsZSBmb3IgbWFuYWdpbmcgZXh0ZW5zaW9ucy5cclxuICpcclxuICogQHByaXZhdGVcclxuICovXHJcbmNsYXNzIFdlYkdMRXh0ZW5zaW9ucyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgdXRpbGl0eSBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMQmFja2VuZH0gYmFja2VuZCAtIFRoZSBXZWJHTCAyIGJhY2tlbmQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGJhY2tlbmQgKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZSB0byB0aGUgV2ViR0wgMiBiYWNrZW5kLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtXZWJHTEJhY2tlbmR9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYmFja2VuZCA9IGJhY2tlbmQ7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZSB0byB0aGUgcmVuZGVyaW5nIGNvbnRleHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1dlYkdMMlJlbmRlcmluZ0NvbnRleHR9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ2wgPSB0aGlzLmJhY2tlbmQuZ2w7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGxpc3Qgd2l0aCBhbGwgdGhlIHN1cHBvcnRlZCBXZWJHTCBleHRlbnNpb25zLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmF2YWlsYWJsZUV4dGVuc2lvbnMgPSB0aGlzLmdsLmdldFN1cHBvcnRlZEV4dGVuc2lvbnMoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgZGljdGlvbmFyeSB3aXRoIHJlcXVlc3RlZCBXZWJHTCBleHRlbnNpb25zLlxyXG5cdFx0ICogVGhlIGtleSBpcyB0aGUgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uLCB0aGUgdmFsdWVcclxuXHRcdCAqIHRoZSByZXF1ZXN0ZWQgZXh0ZW5zaW9uIG9iamVjdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0PHN0cmluZyxPYmplY3Q+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmV4dGVuc2lvbnMgPSB7fTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBleHRlbnNpb24gb2JqZWN0IGZvciB0aGUgZ2l2ZW4gZXh0ZW5zaW9uIG5hbWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBleHRlbnNpb24gbmFtZS5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBleHRlbnNpb24gb2JqZWN0LlxyXG5cdCAqL1xyXG5cdGdldCggbmFtZSApIHtcclxuXHJcblx0XHRsZXQgZXh0ZW5zaW9uID0gdGhpcy5leHRlbnNpb25zWyBuYW1lIF07XHJcblxyXG5cdFx0aWYgKCBleHRlbnNpb24gPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGV4dGVuc2lvbiA9IHRoaXMuZ2wuZ2V0RXh0ZW5zaW9uKCBuYW1lICk7XHJcblxyXG5cdFx0XHR0aGlzLmV4dGVuc2lvbnNbIG5hbWUgXSA9IGV4dGVuc2lvbjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGV4dGVuc2lvbjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgcmVxdWVzdGVkIGV4dGVuc2lvbiBpcyBhdmFpbGFibGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBleHRlbnNpb24gbmFtZS5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBnaXZlbiBleHRlbnNpb24gaXMgYXZhaWxhYmxlIG9yIG5vdC5cclxuXHQgKi9cclxuXHRoYXMoIG5hbWUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuYXZhaWxhYmxlRXh0ZW5zaW9ucy5pbmNsdWRlcyggbmFtZSApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBXZWJHTEV4dGVuc2lvbnM7XHJcbiIsIi8qKlxyXG4gKiBBIFdlYkdMIDIgYmFja2VuZCB1dGlsaXR5IG1vZHVsZSBmb3IgbWFuYWdpbmcgdGhlIGRldmljZSdzIGNhcGFiaWxpdGllcy5cclxuICpcclxuICogQHByaXZhdGVcclxuICovXHJcbmNsYXNzIFdlYkdMQ2FwYWJpbGl0aWVzIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB1dGlsaXR5IG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xCYWNrZW5kfSBiYWNrZW5kIC0gVGhlIFdlYkdMIDIgYmFja2VuZC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggYmFja2VuZCApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIHRoZSBXZWJHTCAyIGJhY2tlbmQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1dlYkdMQmFja2VuZH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5iYWNrZW5kID0gYmFja2VuZDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgdmFsdWUgaG9sZHMgdGhlIGNhY2hlZCBtYXggYW5pc290cm9weSB2YWx1ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tYXhBbmlzb3Ryb3B5ID0gbnVsbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIGFuaXNvdHJvcHkgdGV4dHVyZSBmaWx0ZXJpbmcgdmFsdWUuIFRoaXMgdmFsdWVcclxuXHQgKiBkZXBlbmRzIG9uIHRoZSBkZXZpY2UgYW5kIGlzIHJlcG9ydGVkIGJ5IHRoZSBgRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljYFxyXG5cdCAqIFdlYkdMIGV4dGVuc2lvbi5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIG1heGltdW0gYW5pc290cm9weSB0ZXh0dXJlIGZpbHRlcmluZyB2YWx1ZS5cclxuXHQgKi9cclxuXHRnZXRNYXhBbmlzb3Ryb3B5KCkge1xyXG5cclxuXHRcdGlmICggdGhpcy5tYXhBbmlzb3Ryb3B5ICE9PSBudWxsICkgcmV0dXJuIHRoaXMubWF4QW5pc290cm9weTtcclxuXHJcblx0XHRjb25zdCBnbCA9IHRoaXMuYmFja2VuZC5nbDtcclxuXHRcdGNvbnN0IGV4dGVuc2lvbnMgPSB0aGlzLmJhY2tlbmQuZXh0ZW5zaW9ucztcclxuXHJcblx0XHRpZiAoIGV4dGVuc2lvbnMuaGFzKCAnRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJyApID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0Y29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnICk7XHJcblxyXG5cdFx0XHR0aGlzLm1heEFuaXNvdHJvcHkgPSBnbC5nZXRQYXJhbWV0ZXIoIGV4dGVuc2lvbi5NQVhfVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGhpcy5tYXhBbmlzb3Ryb3B5ID0gMDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubWF4QW5pc290cm9weTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgV2ViR0xDYXBhYmlsaXRpZXM7XHJcbiIsImV4cG9ydCBjb25zdCBHTEZlYXR1cmVOYW1lID0ge1xyXG5cclxuXHQnV0VCR0xfbXVsdGlfZHJhdyc6ICdXRUJHTF9tdWx0aV9kcmF3JyxcclxuXHQnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2FzdGMnOiAndGV4dHVyZS1jb21wcmVzc2lvbi1hc3RjJyxcclxuXHQnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2V0Yyc6ICd0ZXh0dXJlLWNvbXByZXNzaW9uLWV0YzInLFxyXG5cdCdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfZXRjMSc6ICd0ZXh0dXJlLWNvbXByZXNzaW9uLWV0YzEnLFxyXG5cdCdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnOiAndGV4dHVyZS1jb21wcmVzc2lvbi1wdnJ0YycsXHJcblx0J1dFQktJVF9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnOiAndGV4dHVyZS1jb21wcmVzc2lvbi1wdnJ0YycsXHJcblx0J1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJzogJ3RleHR1cmUtY29tcHJlc3Npb24tYmMnLFxyXG5cdCdFWFRfdGV4dHVyZV9jb21wcmVzc2lvbl9icHRjJzogJ3RleHR1cmUtY29tcHJlc3Npb24tYnB0YycsXHJcblx0J0VYVF9kaXNqb2ludF90aW1lcl9xdWVyeV93ZWJnbDInOiAndGltZXN0YW1wLXF1ZXJ5JyxcclxuXHJcbn07XHJcbiIsImNsYXNzIFdlYkdMQnVmZmVyUmVuZGVyZXIge1xyXG5cclxuXHRjb25zdHJ1Y3RvciggYmFja2VuZCApIHtcclxuXHJcblx0XHR0aGlzLmdsID0gYmFja2VuZC5nbDtcclxuXHRcdHRoaXMuZXh0ZW5zaW9ucyA9IGJhY2tlbmQuZXh0ZW5zaW9ucztcclxuXHRcdHRoaXMuaW5mbyA9IGJhY2tlbmQucmVuZGVyZXIuaW5mbztcclxuXHRcdHRoaXMubW9kZSA9IG51bGw7XHJcblx0XHR0aGlzLmluZGV4ID0gMDtcclxuXHRcdHRoaXMudHlwZSA9IG51bGw7XHJcblx0XHR0aGlzLm9iamVjdCA9IG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0cmVuZGVyKCBzdGFydCwgY291bnQgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBnbCwgbW9kZSwgb2JqZWN0LCB0eXBlLCBpbmZvLCBpbmRleCB9ID0gdGhpcztcclxuXHJcblx0XHRpZiAoIGluZGV4ICE9PSAwICkge1xyXG5cclxuXHRcdFx0Z2wuZHJhd0VsZW1lbnRzKCBtb2RlLCBjb3VudCwgdHlwZSwgc3RhcnQgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Z2wuZHJhd0FycmF5cyggbW9kZSwgc3RhcnQsIGNvdW50ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGluZm8udXBkYXRlKCBvYmplY3QsIGNvdW50LCAxICk7XHJcblxyXG5cdH1cclxuXHJcblx0cmVuZGVySW5zdGFuY2VzKCBzdGFydCwgY291bnQsIHByaW1jb3VudCApIHtcclxuXHJcblx0XHRjb25zdCB7IGdsLCBtb2RlLCB0eXBlLCBpbmRleCwgb2JqZWN0LCBpbmZvIH0gPSB0aGlzO1xyXG5cclxuXHRcdGlmICggcHJpbWNvdW50ID09PSAwICkgcmV0dXJuO1xyXG5cclxuXHRcdGlmICggaW5kZXggIT09IDAgKSB7XHJcblxyXG5cdFx0XHRnbC5kcmF3RWxlbWVudHNJbnN0YW5jZWQoIG1vZGUsIGNvdW50LCB0eXBlLCBzdGFydCwgcHJpbWNvdW50ICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGdsLmRyYXdBcnJheXNJbnN0YW5jZWQoIG1vZGUsIHN0YXJ0LCBjb3VudCwgcHJpbWNvdW50ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGluZm8udXBkYXRlKCBvYmplY3QsIGNvdW50LCBwcmltY291bnQgKTtcclxuXHJcblx0fVxyXG5cclxuXHRyZW5kZXJNdWx0aURyYXcoIHN0YXJ0cywgY291bnRzLCBkcmF3Q291bnQgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBleHRlbnNpb25zLCBtb2RlLCBvYmplY3QsIGluZm8gfSA9IHRoaXM7XHJcblxyXG5cdFx0aWYgKCBkcmF3Q291bnQgPT09IDAgKSByZXR1cm47XHJcblxyXG5cdFx0Y29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9tdWx0aV9kcmF3JyApO1xyXG5cclxuXHRcdGlmICggZXh0ZW5zaW9uID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgZHJhd0NvdW50OyBpICsrICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLnJlbmRlciggc3RhcnRzWyBpIF0sIGNvdW50c1sgaSBdICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGlmICggdGhpcy5pbmRleCAhPT0gMCApIHtcclxuXHJcblx0XHRcdFx0ZXh0ZW5zaW9uLm11bHRpRHJhd0VsZW1lbnRzV0VCR0woIG1vZGUsIGNvdW50cywgMCwgdGhpcy50eXBlLCBzdGFydHMsIDAsIGRyYXdDb3VudCApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0ZXh0ZW5zaW9uLm11bHRpRHJhd0FycmF5c1dFQkdMKCBtb2RlLCBzdGFydHMsIDAsIGNvdW50cywgMCwgZHJhd0NvdW50ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRsZXQgZWxlbWVudENvdW50ID0gMDtcclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgZHJhd0NvdW50OyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRlbGVtZW50Q291bnQgKz0gY291bnRzWyBpIF07XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpbmZvLnVwZGF0ZSggb2JqZWN0LCBlbGVtZW50Q291bnQsIDEgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0cmVuZGVyTXVsdGlEcmF3SW5zdGFuY2VzKCBzdGFydHMsIGNvdW50cywgZHJhd0NvdW50LCBwcmltY291bnQgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBleHRlbnNpb25zLCBtb2RlLCBvYmplY3QsIGluZm8gfSA9IHRoaXM7XHJcblxyXG5cdFx0aWYgKCBkcmF3Q291bnQgPT09IDAgKSByZXR1cm47XHJcblxyXG5cdFx0Y29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9tdWx0aV9kcmF3JyApO1xyXG5cclxuXHRcdGlmICggZXh0ZW5zaW9uID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgZHJhd0NvdW50OyBpICsrICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLnJlbmRlckluc3RhbmNlcyggc3RhcnRzWyBpIF0sIGNvdW50c1sgaSBdLCBwcmltY291bnRbIGkgXSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMuaW5kZXggIT09IDAgKSB7XHJcblxyXG5cdFx0XHRcdGV4dGVuc2lvbi5tdWx0aURyYXdFbGVtZW50c0luc3RhbmNlZFdFQkdMKCBtb2RlLCBjb3VudHMsIDAsIHRoaXMudHlwZSwgc3RhcnRzLCAwLCBwcmltY291bnQsIDAsIGRyYXdDb3VudCApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0ZXh0ZW5zaW9uLm11bHRpRHJhd0FycmF5c0luc3RhbmNlZFdFQkdMKCBtb2RlLCBzdGFydHMsIDAsIGNvdW50cywgMCwgcHJpbWNvdW50LCAwLCBkcmF3Q291bnQgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGxldCBlbGVtZW50Q291bnQgPSAwO1xyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBkcmF3Q291bnQ7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGVsZW1lbnRDb3VudCArPSBjb3VudHNbIGkgXSAqIHByaW1jb3VudFsgaSBdO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aW5mby51cGRhdGUoIG9iamVjdCwgZWxlbWVudENvdW50LCAxICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8vXHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgV2ViR0xCdWZmZXJSZW5kZXJlciB9O1xyXG4iLCIvKipcclxuICogQWJzdHJhY3QgYmFzZSBjbGFzcyBvZiBhIHRpbWVzdGFtcCBxdWVyeSBwb29sLlxyXG4gKlxyXG4gKiBAYWJzdHJhY3RcclxuICovXHJcbmNsYXNzIFRpbWVzdGFtcFF1ZXJ5UG9vbCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgYSBuZXcgdGltZXN0YW1wIHF1ZXJ5IHBvb2wuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW21heFF1ZXJpZXM9MjU2XSAtIE1heGltdW0gbnVtYmVyIG9mIHF1ZXJpZXMgdGhpcyBwb29sIGNhbiBob2xkLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBtYXhRdWVyaWVzID0gMjU2ICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0byB0cmFjayB0aW1lc3RhbXBzIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50cmFja1RpbWVzdGFtcCA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBNYXhpbXVtIG51bWJlciBvZiBxdWVyaWVzIHRoaXMgcG9vbCBjYW4gaG9sZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMjU2XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWF4UXVlcmllcyA9IG1heFF1ZXJpZXM7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3cgbWFueSBxdWVyaWVzIGFsbG9jYXRlZCBzbyBmYXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jdXJyZW50UXVlcnlJbmRleCA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUcmFja3Mgb2Zmc2V0cyBmb3IgZGlmZmVyZW50IGNvbnRleHRzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtNYXA8c3RyaW5nLCBudW1iZXI+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnF1ZXJ5T2Zmc2V0cyA9IG5ldyBNYXAoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIHBvb2wgaGFzIGJlZW4gZGlzcG9zZWQgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0Rpc3Bvc2VkID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUT0RPXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5sYXN0VmFsdWUgPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVE9ET1xyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wZW5kaW5nUmVzb2x2ZSA9IGZhbHNlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFsbG9jYXRlIHF1ZXJpZXMgZm9yIGEgc3BlY2lmaWMgcmVuZGVyQ29udGV4dC5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSByZW5kZXJDb250ZXh0IC0gVGhlIHJlbmRlciBjb250ZXh0IHRvIGFsbG9jYXRlIHF1ZXJpZXMgZm9yLlxyXG5cdCAqL1xyXG5cdGFsbG9jYXRlUXVlcmllc0ZvckNvbnRleHQoIC8qIHJlbmRlckNvbnRleHQgKi8gKSB7fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXNvbHZlIGFsbCB0aW1lc3RhbXBzIGFuZCByZXR1cm4gZGF0YSAob3IgcHJvY2VzcyB0aGVtKS5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBhc3luY1xyXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlcj58bnVtYmVyfSBUaGUgcmVzb2x2ZWQgdGltZXN0YW1wIHZhbHVlLlxyXG5cdCAqL1xyXG5cdGFzeW5jIHJlc29sdmVRdWVyaWVzQXN5bmMoKSB7fVxyXG5cclxuXHQvKipcclxuXHQgKiBEaXNwb3NlIG9mIHRoZSBxdWVyeSBwb29sLlxyXG5cdCAqXHJcblx0ICogQGFic3RyYWN0XHJcblx0ICovXHJcblx0ZGlzcG9zZSgpIHt9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBUaW1lc3RhbXBRdWVyeVBvb2w7XHJcbiIsImltcG9ydCB7IHdhcm5PbmNlIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMuanMnO1xyXG5pbXBvcnQgVGltZXN0YW1wUXVlcnlQb29sIGZyb20gJy4uLy4uL2NvbW1vbi9UaW1lc3RhbXBRdWVyeVBvb2wuanMnO1xyXG5cclxuLyoqXHJcbiAqIE1hbmFnZXMgYSBwb29sIG9mIFdlYkdMIHRpbWVzdGFtcCBxdWVyaWVzIGZvciBwZXJmb3JtYW5jZSBtZWFzdXJlbWVudC5cclxuICogSGFuZGxlcyBjcmVhdGlvbiwgZXhlY3V0aW9uLCBhbmQgcmVzb2x1dGlvbiBvZiB0aW1lciBxdWVyaWVzIHVzaW5nIFdlYkdMIGV4dGVuc2lvbnMuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBUaW1lc3RhbXBRdWVyeVBvb2xcclxuICovXHJcbmNsYXNzIFdlYkdMVGltZXN0YW1wUXVlcnlQb29sIGV4dGVuZHMgVGltZXN0YW1wUXVlcnlQb29sIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyBhIG5ldyBXZWJHTCB0aW1lc3RhbXAgcXVlcnkgcG9vbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJpbmdDb250ZXh0fFdlYkdMMlJlbmRlcmluZ0NvbnRleHR9IGdsIC0gVGhlIFdlYkdMIGNvbnRleHQuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBUaGUgdHlwZSBpZGVudGlmaWVyIGZvciB0aGlzIHF1ZXJ5IHBvb2wuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFttYXhRdWVyaWVzPTIwNDhdIC0gTWF4aW11bSBudW1iZXIgb2YgcXVlcmllcyB0aGlzIHBvb2wgY2FuIGhvbGQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGdsLCB0eXBlLCBtYXhRdWVyaWVzID0gMjA0OCApIHtcclxuXHJcblx0XHRzdXBlciggbWF4UXVlcmllcyApO1xyXG5cclxuXHRcdHRoaXMuZ2wgPSBnbDtcclxuXHRcdHRoaXMudHlwZSA9IHR5cGU7XHJcblxyXG5cdFx0Ly8gQ2hlY2sgZm9yIHRpbWVyIHF1ZXJ5IGV4dGVuc2lvbnNcclxuXHRcdHRoaXMuZXh0ID0gZ2wuZ2V0RXh0ZW5zaW9uKCAnRVhUX2Rpc2pvaW50X3RpbWVyX3F1ZXJ5X3dlYmdsMicgKSB8fFxyXG5cdFx0XHRcdCAgZ2wuZ2V0RXh0ZW5zaW9uKCAnRVhUX2Rpc2pvaW50X3RpbWVyX3F1ZXJ5JyApO1xyXG5cclxuXHRcdGlmICggISB0aGlzLmV4dCApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUud2FybiggJ0VYVF9kaXNqb2ludF90aW1lcl9xdWVyeSBub3Qgc3VwcG9ydGVkOyB0aW1lc3RhbXBzIHdpbGwgYmUgZGlzYWJsZWQuJyApO1xyXG5cdFx0XHR0aGlzLnRyYWNrVGltZXN0YW1wID0gZmFsc2U7XHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQ3JlYXRlIHF1ZXJ5IG9iamVjdHNcclxuXHRcdHRoaXMucXVlcmllcyA9IFtdO1xyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdGhpcy5tYXhRdWVyaWVzOyBpICsrICkge1xyXG5cclxuXHRcdFx0dGhpcy5xdWVyaWVzLnB1c2goIGdsLmNyZWF0ZVF1ZXJ5KCkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5hY3RpdmVRdWVyeSA9IG51bGw7XHJcblx0XHR0aGlzLnF1ZXJ5U3RhdGVzID0gbmV3IE1hcCgpOyAvLyBUcmFjayBzdGF0ZSBvZiBlYWNoIHF1ZXJ5OiAnaW5hY3RpdmUnLCAnc3RhcnRlZCcsICdlbmRlZCdcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBbGxvY2F0ZXMgYSBwYWlyIG9mIHF1ZXJpZXMgZm9yIGEgZ2l2ZW4gcmVuZGVyIGNvbnRleHQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gcmVuZGVyQ29udGV4dCAtIFRoZSByZW5kZXIgY29udGV4dCB0byBhbGxvY2F0ZSBxdWVyaWVzIGZvci5cclxuXHQgKiBAcmV0dXJucyB7P251bWJlcn0gVGhlIGJhc2Ugb2Zmc2V0IGZvciB0aGUgYWxsb2NhdGVkIHF1ZXJpZXMsIG9yIG51bGwgaWYgYWxsb2NhdGlvbiBmYWlsZWQuXHJcblx0ICovXHJcblx0YWxsb2NhdGVRdWVyaWVzRm9yQ29udGV4dCggcmVuZGVyQ29udGV4dCApIHtcclxuXHJcblx0XHRpZiAoICEgdGhpcy50cmFja1RpbWVzdGFtcCApIHJldHVybiBudWxsO1xyXG5cclxuXHRcdC8vIENoZWNrIGlmIHdlIGhhdmUgZW5vdWdoIHNwYWNlIGZvciBhIG5ldyBxdWVyeSBwYWlyXHJcblx0XHRpZiAoIHRoaXMuY3VycmVudFF1ZXJ5SW5kZXggKyAyID4gdGhpcy5tYXhRdWVyaWVzICkge1xyXG5cclxuXHRcdFx0d2Fybk9uY2UoIGBXZWJHUFVUaW1lc3RhbXBRdWVyeVBvb2wgWyR7IHRoaXMudHlwZSB9XTogTWF4aW11bSBudW1iZXIgb2YgcXVlcmllcyBleGNlZWRlZCwgd2hlbiB1c2luZyB0cmFja1RpbWVzdGFtcCBpdCBpcyBuZWNlc3NhcnkgdG8gcmVzb2x2ZXMgdGhlIHF1ZXJpZXMgdmlhIHJlbmRlcmVyLnJlc29sdmVUaW1lc3RhbXBzQXN5bmMoIFRIUkVFLlRpbWVzdGFtcFF1ZXJ5LiR7IHRoaXMudHlwZS50b1VwcGVyQ2FzZSgpIH0gKS5gICk7XHJcblx0XHRcdHJldHVybiBudWxsO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBiYXNlT2Zmc2V0ID0gdGhpcy5jdXJyZW50UXVlcnlJbmRleDtcclxuXHRcdHRoaXMuY3VycmVudFF1ZXJ5SW5kZXggKz0gMjtcclxuXHJcblx0XHQvLyBJbml0aWFsaXplIHF1ZXJ5IHN0YXRlc1xyXG5cdFx0dGhpcy5xdWVyeVN0YXRlcy5zZXQoIGJhc2VPZmZzZXQsICdpbmFjdGl2ZScgKTtcclxuXHRcdHRoaXMucXVlcnlPZmZzZXRzLnNldCggcmVuZGVyQ29udGV4dC5pZCwgYmFzZU9mZnNldCApO1xyXG5cclxuXHRcdHJldHVybiBiYXNlT2Zmc2V0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEJlZ2lucyBhIHRpbWVzdGFtcCBxdWVyeSBmb3IgdGhlIHNwZWNpZmllZCByZW5kZXIgY29udGV4dC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSByZW5kZXJDb250ZXh0IC0gVGhlIHJlbmRlciBjb250ZXh0IHRvIGJlZ2luIHRpbWluZyBmb3IuXHJcblx0ICovXHJcblx0YmVnaW5RdWVyeSggcmVuZGVyQ29udGV4dCApIHtcclxuXHJcblx0XHRpZiAoICEgdGhpcy50cmFja1RpbWVzdGFtcCB8fCB0aGlzLmlzRGlzcG9zZWQgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGJhc2VPZmZzZXQgPSB0aGlzLnF1ZXJ5T2Zmc2V0cy5nZXQoIHJlbmRlckNvbnRleHQuaWQgKTtcclxuXHRcdGlmICggYmFzZU9mZnNldCA9PSBudWxsICkge1xyXG5cclxuXHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBEb24ndCBzdGFydCBhIG5ldyBxdWVyeSBpZiB0aGVyZSdzIGFuIGFjdGl2ZSBvbmVcclxuXHRcdGlmICggdGhpcy5hY3RpdmVRdWVyeSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgcXVlcnkgPSB0aGlzLnF1ZXJpZXNbIGJhc2VPZmZzZXQgXTtcclxuXHRcdGlmICggISBxdWVyeSApIHtcclxuXHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dHJ5IHtcclxuXHJcblx0XHRcdC8vIE9ubHkgYmVnaW4gaWYgcXVlcnkgaXMgaW5hY3RpdmVcclxuXHRcdFx0aWYgKCB0aGlzLnF1ZXJ5U3RhdGVzLmdldCggYmFzZU9mZnNldCApID09PSAnaW5hY3RpdmUnICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLmdsLmJlZ2luUXVlcnkoIHRoaXMuZXh0LlRJTUVfRUxBUFNFRF9FWFQsIHF1ZXJ5ICk7XHJcblx0XHRcdFx0dGhpcy5hY3RpdmVRdWVyeSA9IGJhc2VPZmZzZXQ7XHJcblx0XHRcdFx0dGhpcy5xdWVyeVN0YXRlcy5zZXQoIGJhc2VPZmZzZXQsICdzdGFydGVkJyApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gY2F0Y2ggKCBlcnJvciApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoICdFcnJvciBpbiBiZWdpblF1ZXJ5OicsIGVycm9yICk7XHJcblx0XHRcdHRoaXMuYWN0aXZlUXVlcnkgPSBudWxsO1xyXG5cdFx0XHR0aGlzLnF1ZXJ5U3RhdGVzLnNldCggYmFzZU9mZnNldCwgJ2luYWN0aXZlJyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFbmRzIHRoZSBhY3RpdmUgdGltZXN0YW1wIHF1ZXJ5IGZvciB0aGUgc3BlY2lmaWVkIHJlbmRlciBjb250ZXh0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IHJlbmRlckNvbnRleHQgLSBUaGUgcmVuZGVyIGNvbnRleHQgdG8gZW5kIHRpbWluZyBmb3IuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHJlbmRlckNvbnRleHQuaWQgLSBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlbmRlciBjb250ZXh0LlxyXG5cdCAqL1xyXG5cdGVuZFF1ZXJ5KCByZW5kZXJDb250ZXh0ICkge1xyXG5cclxuXHRcdGlmICggISB0aGlzLnRyYWNrVGltZXN0YW1wIHx8IHRoaXMuaXNEaXNwb3NlZCApIHtcclxuXHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgYmFzZU9mZnNldCA9IHRoaXMucXVlcnlPZmZzZXRzLmdldCggcmVuZGVyQ29udGV4dC5pZCApO1xyXG5cdFx0aWYgKCBiYXNlT2Zmc2V0ID09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIE9ubHkgZW5kIGlmIHRoaXMgaXMgdGhlIGFjdGl2ZSBxdWVyeVxyXG5cdFx0aWYgKCB0aGlzLmFjdGl2ZVF1ZXJ5ICE9PSBiYXNlT2Zmc2V0ICkge1xyXG5cclxuXHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0cnkge1xyXG5cclxuXHRcdFx0dGhpcy5nbC5lbmRRdWVyeSggdGhpcy5leHQuVElNRV9FTEFQU0VEX0VYVCApO1xyXG5cdFx0XHR0aGlzLnF1ZXJ5U3RhdGVzLnNldCggYmFzZU9mZnNldCwgJ2VuZGVkJyApO1xyXG5cdFx0XHR0aGlzLmFjdGl2ZVF1ZXJ5ID0gbnVsbDtcclxuXHJcblx0XHR9IGNhdGNoICggZXJyb3IgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnRXJyb3IgaW4gZW5kUXVlcnk6JywgZXJyb3IgKTtcclxuXHRcdFx0Ly8gUmVzZXQgc3RhdGUgb24gZXJyb3JcclxuXHRcdFx0dGhpcy5xdWVyeVN0YXRlcy5zZXQoIGJhc2VPZmZzZXQsICdpbmFjdGl2ZScgKTtcclxuXHRcdFx0dGhpcy5hY3RpdmVRdWVyeSA9IG51bGw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFzeW5jaHJvbm91c2x5IHJlc29sdmVzIGFsbCBjb21wbGV0ZWQgcXVlcmllcyBhbmQgcmV0dXJucyB0aGUgdG90YWwgZHVyYXRpb24uXHJcblx0ICpcclxuXHQgKiBAYXN5bmNcclxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSBUaGUgdG90YWwgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzLCBvciB0aGUgbGFzdCB2YWxpZCB2YWx1ZSBpZiByZXNvbHV0aW9uIGZhaWxzLlxyXG5cdCAqL1xyXG5cdGFzeW5jIHJlc29sdmVRdWVyaWVzQXN5bmMoKSB7XHJcblxyXG5cdFx0aWYgKCAhIHRoaXMudHJhY2tUaW1lc3RhbXAgfHwgdGhpcy5wZW5kaW5nUmVzb2x2ZSApIHtcclxuXHJcblx0XHRcdHJldHVybiB0aGlzLmxhc3RWYWx1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5wZW5kaW5nUmVzb2x2ZSA9IHRydWU7XHJcblxyXG5cdFx0dHJ5IHtcclxuXHJcblx0XHRcdC8vIFdhaXQgZm9yIGFsbCBlbmRlZCBxdWVyaWVzIHRvIGNvbXBsZXRlXHJcblx0XHRcdGNvbnN0IHJlc29sdmVQcm9taXNlcyA9IFtdO1xyXG5cclxuXHRcdFx0Zm9yICggY29uc3QgWyBiYXNlT2Zmc2V0LCBzdGF0ZSBdIG9mIHRoaXMucXVlcnlTdGF0ZXMgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggc3RhdGUgPT09ICdlbmRlZCcgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgcXVlcnkgPSB0aGlzLnF1ZXJpZXNbIGJhc2VPZmZzZXQgXTtcclxuXHRcdFx0XHRcdHJlc29sdmVQcm9taXNlcy5wdXNoKCB0aGlzLnJlc29sdmVRdWVyeSggcXVlcnkgKSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHJlc29sdmVQcm9taXNlcy5sZW5ndGggPT09IDAgKSB7XHJcblxyXG5cdFx0XHRcdHJldHVybiB0aGlzLmxhc3RWYWx1ZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbCggcmVzb2x2ZVByb21pc2VzICk7XHJcblx0XHRcdGNvbnN0IHRvdGFsRHVyYXRpb24gPSByZXN1bHRzLnJlZHVjZSggKCBhY2MsIHZhbCApID0+IGFjYyArIHZhbCwgMCApO1xyXG5cclxuXHRcdFx0Ly8gU3RvcmUgdGhlIGxhc3QgdmFsaWQgcmVzdWx0XHJcblx0XHRcdHRoaXMubGFzdFZhbHVlID0gdG90YWxEdXJhdGlvbjtcclxuXHJcblx0XHRcdC8vIFJlc2V0IHN0YXRlc1xyXG5cdFx0XHR0aGlzLmN1cnJlbnRRdWVyeUluZGV4ID0gMDtcclxuXHRcdFx0dGhpcy5xdWVyeU9mZnNldHMuY2xlYXIoKTtcclxuXHRcdFx0dGhpcy5xdWVyeVN0YXRlcy5jbGVhcigpO1xyXG5cdFx0XHR0aGlzLmFjdGl2ZVF1ZXJ5ID0gbnVsbDtcclxuXHJcblx0XHRcdHJldHVybiB0b3RhbER1cmF0aW9uO1xyXG5cclxuXHRcdH0gY2F0Y2ggKCBlcnJvciApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoICdFcnJvciByZXNvbHZpbmcgcXVlcmllczonLCBlcnJvciApO1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5sYXN0VmFsdWU7XHJcblxyXG5cdFx0fSBmaW5hbGx5IHtcclxuXHJcblx0XHRcdHRoaXMucGVuZGluZ1Jlc29sdmUgPSBmYWxzZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVzb2x2ZXMgYSBzaW5nbGUgcXVlcnksIGNoZWNraW5nIGZvciBjb21wbGV0aW9uIGFuZCBkaXNqb2ludCBvcGVyYXRpb24uXHJcblx0ICpcclxuXHQgKiBAYXN5bmNcclxuXHQgKiBAcGFyYW0ge1dlYkdMUXVlcnl9IHF1ZXJ5IC0gVGhlIHF1ZXJ5IG9iamVjdCB0byByZXNvbHZlLlxyXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlcj59IFRoZSBlbGFwc2VkIHRpbWUgaW4gbWlsbGlzZWNvbmRzLlxyXG5cdCAqL1xyXG5cdGFzeW5jIHJlc29sdmVRdWVyeSggcXVlcnkgKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKCAoIHJlc29sdmUgKSA9PiB7XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMuaXNEaXNwb3NlZCApIHtcclxuXHJcblx0XHRcdFx0cmVzb2x2ZSggdGhpcy5sYXN0VmFsdWUgKTtcclxuXHRcdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRsZXQgdGltZW91dElkO1xyXG5cdFx0XHRsZXQgaXNSZXNvbHZlZCA9IGZhbHNlO1xyXG5cclxuXHRcdFx0Y29uc3QgY2xlYW51cCA9ICgpID0+IHtcclxuXHJcblx0XHRcdFx0aWYgKCB0aW1lb3V0SWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y2xlYXJUaW1lb3V0KCB0aW1lb3V0SWQgKTtcclxuXHRcdFx0XHRcdHRpbWVvdXRJZCA9IG51bGw7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHRjb25zdCBmaW5hbGl6ZVJlc29sdXRpb24gPSAoIHZhbHVlICkgPT4ge1xyXG5cclxuXHRcdFx0XHRpZiAoICEgaXNSZXNvbHZlZCApIHtcclxuXHJcblx0XHRcdFx0XHRpc1Jlc29sdmVkID0gdHJ1ZTtcclxuXHRcdFx0XHRcdGNsZWFudXAoKTtcclxuXHRcdFx0XHRcdHJlc29sdmUoIHZhbHVlICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHRjb25zdCBjaGVja1F1ZXJ5ID0gKCkgPT4ge1xyXG5cclxuXHRcdFx0XHRpZiAoIHRoaXMuaXNEaXNwb3NlZCApIHtcclxuXHJcblx0XHRcdFx0XHRmaW5hbGl6ZVJlc29sdXRpb24oIHRoaXMubGFzdFZhbHVlICk7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0dHJ5IHtcclxuXHJcblx0XHRcdFx0XHQvLyBDaGVjayBpZiB0aGUgR1BVIHRpbWVyIHdhcyBkaXNqb2ludCAoaS5lLiwgdGltaW5nIHdhcyB1bnJlbGlhYmxlKVxyXG5cdFx0XHRcdFx0Y29uc3QgZGlzam9pbnQgPSB0aGlzLmdsLmdldFBhcmFtZXRlciggdGhpcy5leHQuR1BVX0RJU0pPSU5UX0VYVCApO1xyXG5cdFx0XHRcdFx0aWYgKCBkaXNqb2ludCApIHtcclxuXHJcblx0XHRcdFx0XHRcdGZpbmFsaXplUmVzb2x1dGlvbiggdGhpcy5sYXN0VmFsdWUgKTtcclxuXHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRjb25zdCBhdmFpbGFibGUgPSB0aGlzLmdsLmdldFF1ZXJ5UGFyYW1ldGVyKCBxdWVyeSwgdGhpcy5nbC5RVUVSWV9SRVNVTFRfQVZBSUxBQkxFICk7XHJcblx0XHRcdFx0XHRpZiAoICEgYXZhaWxhYmxlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0dGltZW91dElkID0gc2V0VGltZW91dCggY2hlY2tRdWVyeSwgMSApO1xyXG5cdFx0XHRcdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGVsYXBzZWQgPSB0aGlzLmdsLmdldFF1ZXJ5UGFyYW1ldGVyKCBxdWVyeSwgdGhpcy5nbC5RVUVSWV9SRVNVTFQgKTtcclxuXHRcdFx0XHRcdHJlc29sdmUoIE51bWJlciggZWxhcHNlZCApIC8gMWU2ICk7IC8vIENvbnZlcnQgbmFub3NlY29uZHMgdG8gbWlsbGlzZWNvbmRzXHJcblxyXG5cdFx0XHRcdH0gY2F0Y2ggKCBlcnJvciApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnRXJyb3IgY2hlY2tpbmcgcXVlcnk6JywgZXJyb3IgKTtcclxuXHRcdFx0XHRcdHJlc29sdmUoIHRoaXMubGFzdFZhbHVlICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHRjaGVja1F1ZXJ5KCk7XHJcblxyXG5cdFx0fSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbGVhc2VzIGFsbCByZXNvdXJjZXMgaGVsZCBieSB0aGlzIHF1ZXJ5IHBvb2wuXHJcblx0ICogVGhpcyBpbmNsdWRlcyBkZWxldGluZyBhbGwgcXVlcnkgb2JqZWN0cyBhbmQgY2xlYXJpbmcgaW50ZXJuYWwgc3RhdGUuXHJcblx0ICovXHJcblx0ZGlzcG9zZSgpIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuaXNEaXNwb3NlZCApIHtcclxuXHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5pc0Rpc3Bvc2VkID0gdHJ1ZTtcclxuXHJcblx0XHRpZiAoICEgdGhpcy50cmFja1RpbWVzdGFtcCApIHJldHVybjtcclxuXHJcblx0XHRmb3IgKCBjb25zdCBxdWVyeSBvZiB0aGlzLnF1ZXJpZXMgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmdsLmRlbGV0ZVF1ZXJ5KCBxdWVyeSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnF1ZXJpZXMgPSBbXTtcclxuXHRcdHRoaXMucXVlcnlTdGF0ZXMuY2xlYXIoKTtcclxuXHRcdHRoaXMucXVlcnlPZmZzZXRzLmNsZWFyKCk7XHJcblx0XHR0aGlzLmxhc3RWYWx1ZSA9IDA7XHJcblx0XHR0aGlzLmFjdGl2ZVF1ZXJ5ID0gbnVsbDtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgV2ViR0xUaW1lc3RhbXBRdWVyeVBvb2w7XHJcbiIsImltcG9ydCBHTFNMTm9kZUJ1aWxkZXIgZnJvbSAnLi9ub2Rlcy9HTFNMTm9kZUJ1aWxkZXIuanMnO1xyXG5pbXBvcnQgQmFja2VuZCBmcm9tICcuLi9jb21tb24vQmFja2VuZC5qcyc7XHJcbmltcG9ydCB7IGdldENhY2hlS2V5IH0gZnJvbSAnLi4vY29tbW9uL1JlbmRlckNvbnRleHQuanMnO1xyXG5cclxuaW1wb3J0IFdlYkdMQXR0cmlidXRlVXRpbHMgZnJvbSAnLi91dGlscy9XZWJHTEF0dHJpYnV0ZVV0aWxzLmpzJztcclxuaW1wb3J0IFdlYkdMU3RhdGUgZnJvbSAnLi91dGlscy9XZWJHTFN0YXRlLmpzJztcclxuaW1wb3J0IFdlYkdMVXRpbHMgZnJvbSAnLi91dGlscy9XZWJHTFV0aWxzLmpzJztcclxuaW1wb3J0IFdlYkdMVGV4dHVyZVV0aWxzIGZyb20gJy4vdXRpbHMvV2ViR0xUZXh0dXJlVXRpbHMuanMnO1xyXG5pbXBvcnQgV2ViR0xFeHRlbnNpb25zIGZyb20gJy4vdXRpbHMvV2ViR0xFeHRlbnNpb25zLmpzJztcclxuaW1wb3J0IFdlYkdMQ2FwYWJpbGl0aWVzIGZyb20gJy4vdXRpbHMvV2ViR0xDYXBhYmlsaXRpZXMuanMnO1xyXG5pbXBvcnQgeyBHTEZlYXR1cmVOYW1lIH0gZnJvbSAnLi91dGlscy9XZWJHTENvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IFdlYkdMQnVmZmVyUmVuZGVyZXIgfSBmcm9tICcuL1dlYkdMQnVmZmVyUmVuZGVyZXIuanMnO1xyXG5cclxuaW1wb3J0IHsgd2Fybk9uY2UgfSBmcm9tICcuLi8uLi91dGlscy5qcyc7XHJcbmltcG9ydCB7IFdlYkdMQ29vcmRpbmF0ZVN5c3RlbSB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCBXZWJHTFRpbWVzdGFtcFF1ZXJ5UG9vbCBmcm9tICcuL3V0aWxzL1dlYkdMVGltZXN0YW1wUXVlcnlQb29sLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIGJhY2tlbmQgaW1wbGVtZW50YXRpb24gdGFyZ2V0aW5nIFdlYkdMIDIuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBhdWdtZW50cyBCYWNrZW5kXHJcbiAqL1xyXG5jbGFzcyBXZWJHTEJhY2tlbmQgZXh0ZW5kcyBCYWNrZW5kIHtcclxuXHJcblx0LyoqXHJcblx0ICogV2ViR0xCYWNrZW5kIG9wdGlvbnMuXHJcblx0ICpcclxuXHQgKiBAdHlwZWRlZiB7T2JqZWN0fSBXZWJHTEJhY2tlbmR+T3B0aW9uc1xyXG5cdCAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2xvZ2FyaXRobWljRGVwdGhCdWZmZXI9ZmFsc2VdIC0gV2hldGhlciBsb2dhcml0aG1pYyBkZXB0aCBidWZmZXIgaXMgZW5hYmxlZCBvciBub3QuXHJcblx0ICogQHByb3BlcnR5IHtib29sZWFufSBbYWxwaGE9dHJ1ZV0gLSBXaGV0aGVyIHRoZSBkZWZhdWx0IGZyYW1lYnVmZmVyICh3aGljaCByZXByZXNlbnRzIHRoZSBmaW5hbCBjb250ZW50cyBvZiB0aGUgY2FudmFzKSBzaG91bGQgYmUgdHJhbnNwYXJlbnQgb3Igb3BhcXVlLlxyXG5cdCAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2RlcHRoPXRydWVdIC0gV2hldGhlciB0aGUgZGVmYXVsdCBmcmFtZWJ1ZmZlciBzaG91bGQgaGF2ZSBhIGRlcHRoIGJ1ZmZlciBvciBub3QuXHJcblx0ICogQHByb3BlcnR5IHtib29sZWFufSBbc3RlbmNpbD1mYWxzZV0gLSBXaGV0aGVyIHRoZSBkZWZhdWx0IGZyYW1lYnVmZmVyIHNob3VsZCBoYXZlIGEgc3RlbmNpbCBidWZmZXIgb3Igbm90LlxyXG5cdCAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2FudGlhbGlhcz1mYWxzZV0gLSBXaGV0aGVyIE1TQUEgYXMgdGhlIGRlZmF1bHQgYW50aS1hbGlhc2luZyBzaG91bGQgYmUgZW5hYmxlZCBvciBub3QuXHJcblx0ICogQHByb3BlcnR5IHtudW1iZXJ9IFtzYW1wbGVzPTBdIC0gV2hlbiBgYW50aWFsaWFzYCBpcyBgdHJ1ZWAsIGA0YCBzYW1wbGVzIGFyZSB1c2VkIGJ5IGRlZmF1bHQuIFNldCB0aGlzIHBhcmFtZXRlciB0byBhbnkgb3RoZXIgaW50ZWdlciB2YWx1ZSB0aGFuIDAgdG8gb3ZlcndyaXRlIHRoZSBkZWZhdWx0LlxyXG5cdCAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2ZvcmNlV2ViR0w9ZmFsc2VdIC0gSWYgc2V0IHRvIGB0cnVlYCwgdGhlIHJlbmRlcmVyIHVzZXMgYSBXZWJHTCAyIGJhY2tlbmQgbm8gbWF0dGVyIGlmIFdlYkdQVSBpcyBzdXBwb3J0ZWQgb3Igbm90LlxyXG5cdCAqIEBwcm9wZXJ0eSB7V2ViR0wyUmVuZGVyaW5nQ29udGV4dH0gW2NvbnRleHQ9dW5kZWZpbmVkXSAtIEEgV2ViR0wgMiByZW5kZXJpbmcgY29udGV4dC5cclxuXHQgKi9cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBXZWJHUFUgYmFja2VuZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xCYWNrZW5kfk9wdGlvbnN9IFtwYXJhbWV0ZXJzXSAtIFRoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVycyA9IHt9ICkge1xyXG5cclxuXHRcdHN1cGVyKCBwYXJhbWV0ZXJzICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzV2ViR0xCYWNrZW5kID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIGEgYmFja2VuZCBtb2R1bGUgaG9sZGluZyBzaGFkZXIgYXR0cmlidXRlLXJlbGF0ZWRcclxuXHRcdCAqIHV0aWxpdHkgZnVuY3Rpb25zLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/V2ViR0xBdHRyaWJ1dGVVdGlsc31cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hdHRyaWJ1dGVVdGlscyA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZSB0byBhIGJhY2tlbmQgbW9kdWxlIGhvbGRpbmcgZXh0ZW5zaW9uLXJlbGF0ZWRcclxuXHRcdCAqIHV0aWxpdHkgZnVuY3Rpb25zLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/V2ViR0xFeHRlbnNpb25zfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmV4dGVuc2lvbnMgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gYSBiYWNrZW5kIG1vZHVsZSBob2xkaW5nIGNhcGFiaWxpdHktcmVsYXRlZFxyXG5cdFx0ICogdXRpbGl0eSBmdW5jdGlvbnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9XZWJHTENhcGFiaWxpdGllc31cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jYXBhYmlsaXRpZXMgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gYSBiYWNrZW5kIG1vZHVsZSBob2xkaW5nIHRleHR1cmUtcmVsYXRlZFxyXG5cdFx0ICogdXRpbGl0eSBmdW5jdGlvbnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9XZWJHTFRleHR1cmVVdGlsc31cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50ZXh0dXJlVXRpbHMgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gYSBiYWNrZW5kIG1vZHVsZSBob2xkaW5nIHJlbmRlcmVyLXJlbGF0ZWRcclxuXHRcdCAqIHV0aWxpdHkgZnVuY3Rpb25zLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/V2ViR0xCdWZmZXJSZW5kZXJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5idWZmZXJSZW5kZXJlciA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZSB0byB0aGUgcmVuZGVyaW5nIGNvbnRleHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9XZWJHTDJSZW5kZXJpbmdDb250ZXh0fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdsID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIGEgYmFja2VuZCBtb2R1bGUgaG9sZGluZyBzdGF0ZS1yZWxhdGVkXHJcblx0XHQgKiB1dGlsaXR5IGZ1bmN0aW9ucy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1dlYkdMU3RhdGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc3RhdGUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gYSBiYWNrZW5kIG1vZHVsZSBob2xkaW5nIGNvbW1vblxyXG5cdFx0ICogdXRpbGl0eSBmdW5jdGlvbnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9XZWJHTFV0aWxzfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnV0aWxzID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERpY3Rpb25hcnkgZm9yIGNhY2hpbmcgVkFPcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0PHN0cmluZyxXZWJHTFZlcnRleEFycmF5T2JqZWN0Pn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52YW9DYWNoZSA9IHt9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGljdGlvbmFyeSBmb3IgY2FjaGluZyB0cmFuc2Zvcm0gZmVlZGJhY2sgb2JqZWN0cy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0PHN0cmluZyxXZWJHTFRyYW5zZm9ybUZlZWRiYWNrPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50cmFuc2Zvcm1GZWVkYmFja0NhY2hlID0ge307XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDb250cm9scyBpZiBgZ2wuUkFTVEVSSVpFUl9ESVNDQVJEYCBzaG91bGQgYmUgZW5hYmxlZCBvciBub3QuXHJcblx0XHQgKiBPbmx5IHJlbGV2YW50IHdoZW4gdXNpbmcgY29tcHV0ZSBzaGFkZXJzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kaXNjYXJkID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZSB0byB0aGUgYEVYVF9kaXNqb2ludF90aW1lcl9xdWVyeV93ZWJnbDJgIGV4dGVuc2lvbi4gYG51bGxgIGlmIHRoZVxyXG5cdFx0ICogZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhlIGV4dGVuc2lvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P0VYVERpc2pvaW50VGltZXJRdWVyeVdlYkdMMn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kaXNqb2ludCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQqIEEgcmVmZXJlbmNlIHRvIHRoZSBgS0hSX3BhcmFsbGVsX3NoYWRlcl9jb21waWxlYCBleHRlbnNpb24uIGBudWxsYCBpZiB0aGVcclxuXHRcdCogZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhlIGV4dGVuc2lvbi5cclxuXHRcdCpcclxuXHRcdCogQHR5cGUgez9LSFJQYXJhbGxlbFNoYWRlckNvbXBpbGV9XHJcblx0XHQqIEBkZWZhdWx0IG51bGxcclxuXHRcdCovXHJcblx0XHR0aGlzLnBhcmFsbGVsID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IHJlbmRlciBjb250ZXh0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7UmVuZGVyQ29udGV4dH1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fY3VycmVudENvbnRleHQgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSB1bmlxdWUgY29sbGVjdGlvbiBvZiBiaW5kaW5ncy5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge1dlYWtTZXR9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX2tub3duQmluZGluZ3MgPSBuZXcgV2Vha1NldCgpO1xyXG5cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIGRldmljZSBzdXBwb3J0cyBmcmFtZWJ1ZmZlcnMgaW52YWxpZGF0aW9uIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX3N1cHBvcnRzSW52YWxpZGF0ZUZyYW1lYnVmZmVyID0gdHlwZW9mIG5hdmlnYXRvciA9PT0gJ3VuZGVmaW5lZCcgPyBmYWxzZSA6IC9PY3VsdXNCcm93c2VyL2cudGVzdCggbmF2aWdhdG9yLnVzZXJBZ2VudCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHRhcmdldCBmcmFtZWJ1ZmZlciB3aGVuIHJlbmRlcmluZyB3aXRoXHJcblx0XHQgKiB0aGUgV2ViWFIgZGV2aWNlIEFQSS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge1dlYkdMRnJhbWVidWZmZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX3hyRnJhbWVidWZmZXIgPSBudWxsO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEluaXRpYWxpemVzIHRoZSBiYWNrZW5kIHNvIGl0IGlzIHJlYWR5IGZvciB1c2FnZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqL1xyXG5cdGluaXQoIHJlbmRlcmVyICkge1xyXG5cclxuXHRcdHN1cGVyLmluaXQoIHJlbmRlcmVyICk7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCBwYXJhbWV0ZXJzID0gdGhpcy5wYXJhbWV0ZXJzO1xyXG5cclxuXHRcdGNvbnN0IGNvbnRleHRBdHRyaWJ1dGVzID0ge1xyXG5cdFx0XHRhbnRpYWxpYXM6IHJlbmRlcmVyLnNhbXBsZXMgPiAwLFxyXG5cdFx0XHRhbHBoYTogdHJ1ZSwgLy8gYWx3YXlzIHRydWUgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnNcclxuXHRcdFx0ZGVwdGg6IHJlbmRlcmVyLmRlcHRoLFxyXG5cdFx0XHRzdGVuY2lsOiByZW5kZXJlci5zdGVuY2lsXHJcblx0XHR9O1xyXG5cclxuXHRcdGNvbnN0IGdsQ29udGV4dCA9ICggcGFyYW1ldGVycy5jb250ZXh0ICE9PSB1bmRlZmluZWQgKSA/IHBhcmFtZXRlcnMuY29udGV4dCA6IHJlbmRlcmVyLmRvbUVsZW1lbnQuZ2V0Q29udGV4dCggJ3dlYmdsMicsIGNvbnRleHRBdHRyaWJ1dGVzICk7XHJcblxyXG5cdCBcdGZ1bmN0aW9uIG9uQ29udGV4dExvc3QoIGV2ZW50ICkge1xyXG5cclxuXHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcblx0XHRcdGNvbnN0IGNvbnRleHRMb3NzSW5mbyA9IHtcclxuXHRcdFx0XHRhcGk6ICdXZWJHTCcsXHJcblx0XHRcdFx0bWVzc2FnZTogZXZlbnQuc3RhdHVzTWVzc2FnZSB8fCAnVW5rbm93biByZWFzb24nLFxyXG5cdFx0XHRcdHJlYXNvbjogbnVsbCxcclxuXHRcdFx0XHRvcmlnaW5hbEV2ZW50OiBldmVudFxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0cmVuZGVyZXIub25EZXZpY2VMb3N0KCBjb250ZXh0TG9zc0luZm8gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5fb25Db250ZXh0TG9zdCA9IG9uQ29udGV4dExvc3Q7XHJcblxyXG5cdFx0cmVuZGVyZXIuZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCAnd2ViZ2xjb250ZXh0bG9zdCcsIG9uQ29udGV4dExvc3QsIGZhbHNlICk7XHJcblxyXG5cdFx0dGhpcy5nbCA9IGdsQ29udGV4dDtcclxuXHJcblx0XHR0aGlzLmV4dGVuc2lvbnMgPSBuZXcgV2ViR0xFeHRlbnNpb25zKCB0aGlzICk7XHJcblx0XHR0aGlzLmNhcGFiaWxpdGllcyA9IG5ldyBXZWJHTENhcGFiaWxpdGllcyggdGhpcyApO1xyXG5cdFx0dGhpcy5hdHRyaWJ1dGVVdGlscyA9IG5ldyBXZWJHTEF0dHJpYnV0ZVV0aWxzKCB0aGlzICk7XHJcblx0XHR0aGlzLnRleHR1cmVVdGlscyA9IG5ldyBXZWJHTFRleHR1cmVVdGlscyggdGhpcyApO1xyXG5cdFx0dGhpcy5idWZmZXJSZW5kZXJlciA9IG5ldyBXZWJHTEJ1ZmZlclJlbmRlcmVyKCB0aGlzICk7XHJcblxyXG5cdFx0dGhpcy5zdGF0ZSA9IG5ldyBXZWJHTFN0YXRlKCB0aGlzICk7XHJcblx0XHR0aGlzLnV0aWxzID0gbmV3IFdlYkdMVXRpbHMoIHRoaXMgKTtcclxuXHJcblx0XHR0aGlzLmV4dGVuc2lvbnMuZ2V0KCAnRVhUX2NvbG9yX2J1ZmZlcl9mbG9hdCcgKTtcclxuXHRcdHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jbGlwX2N1bGxfZGlzdGFuY2UnICk7XHJcblx0XHR0aGlzLmV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyJyApO1xyXG5cdFx0dGhpcy5leHRlbnNpb25zLmdldCggJ0VYVF9jb2xvcl9idWZmZXJfaGFsZl9mbG9hdCcgKTtcclxuXHRcdHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9tdWx0aXNhbXBsZWRfcmVuZGVyX3RvX3RleHR1cmUnICk7XHJcblx0XHR0aGlzLmV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfcmVuZGVyX3NoYXJlZF9leHBvbmVudCcgKTtcclxuXHRcdHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9tdWx0aV9kcmF3JyApO1xyXG5cclxuXHRcdHRoaXMuZGlzam9pbnQgPSB0aGlzLmV4dGVuc2lvbnMuZ2V0KCAnRVhUX2Rpc2pvaW50X3RpbWVyX3F1ZXJ5X3dlYmdsMicgKTtcclxuXHRcdHRoaXMucGFyYWxsZWwgPSB0aGlzLmV4dGVuc2lvbnMuZ2V0KCAnS0hSX3BhcmFsbGVsX3NoYWRlcl9jb21waWxlJyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBjb29yZGluYXRlIHN5c3RlbSBvZiB0aGUgYmFja2VuZC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0ICogQHJlYWRvbmx5XHJcblx0ICovXHJcblx0Z2V0IGNvb3JkaW5hdGVTeXN0ZW0oKSB7XHJcblxyXG5cdFx0cmV0dXJuIFdlYkdMQ29vcmRpbmF0ZVN5c3RlbTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBwZXJmb3JtcyBhIHJlYWRiYWNrIG9wZXJhdGlvbiBieSBtb3ZpbmcgYnVmZmVyIGRhdGEgZnJvbVxyXG5cdCAqIGEgc3RvcmFnZSBidWZmZXIgYXR0cmlidXRlIGZyb20gdGhlIEdQVSB0byB0aGUgQ1BVLlxyXG5cdCAqXHJcblx0ICogQGFzeW5jXHJcblx0ICogQHBhcmFtIHtTdG9yYWdlQnVmZmVyQXR0cmlidXRlfSBhdHRyaWJ1dGUgLSBUaGUgc3RvcmFnZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqIEByZXR1cm4ge1Byb21pc2U8QXJyYXlCdWZmZXI+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBidWZmZXIgZGF0YSB3aGVuIHRoZSBkYXRhIGFyZSByZWFkeS5cclxuXHQgKi9cclxuXHRhc3luYyBnZXRBcnJheUJ1ZmZlckFzeW5jKCBhdHRyaWJ1dGUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIGF3YWl0IHRoaXMuYXR0cmlidXRlVXRpbHMuZ2V0QXJyYXlCdWZmZXJBc3luYyggYXR0cmlidXRlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2FuIGJlIHVzZWQgdG8gc3luY2hyb25pemUgQ1BVIG9wZXJhdGlvbnMgd2l0aCBHUFUgdGFza3MuIFNvIHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLFxyXG5cdCAqIHRoZSBDUFUgd2FpdHMgZm9yIHRoZSBHUFUgdG8gY29tcGxldGUgaXRzIG9wZXJhdGlvbiAoZS5nLiBhIGNvbXB1dGUgdGFzaykuXHJcblx0ICpcclxuXHQgKiBAYXN5bmNcclxuXHQgKiBAcmV0dXJuIHtQcm9taXNlfSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHN5bmNocm9uaXphdGlvbiBoYXMgYmVlbiBmaW5pc2hlZC5cclxuXHQgKi9cclxuXHRhc3luYyB3YWl0Rm9yR1BVKCkge1xyXG5cclxuXHRcdGF3YWl0IHRoaXMudXRpbHMuX2NsaWVudFdhaXRBc3luYygpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEVuc3VyZXMgdGhlIGJhY2tlbmQgaXMgWFIgY29tcGF0aWJsZS5cclxuXHQgKlxyXG5cdCAqIEBhc3luY1xyXG5cdCAqIEByZXR1cm4ge1Byb21pc2V9IEEgUHJvbWlzZSB0aGF0IHJlc29sdmUgd2hlbiB0aGUgcmVuZGVyZXIgaXMgWFIgY29tcGF0aWJsZS5cclxuXHQgKi9cclxuXHRhc3luYyBtYWtlWFJDb21wYXRpYmxlKCkge1xyXG5cclxuXHRcdGNvbnN0IGF0dHJpYnV0ZXMgPSB0aGlzLmdsLmdldENvbnRleHRBdHRyaWJ1dGVzKCk7XHJcblxyXG5cdFx0aWYgKCBhdHRyaWJ1dGVzLnhyQ29tcGF0aWJsZSAhPT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdGF3YWl0IHRoaXMuZ2wubWFrZVhSQ29tcGF0aWJsZSgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIFhSIHJlbmRlcmluZyBkZXN0aW5hdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xGcmFtZWJ1ZmZlcn0geHJGcmFtZWJ1ZmZlciAtIFRoZSBYUiBmcmFtZWJ1ZmZlci5cclxuXHQgKi9cclxuXHRzZXRYUlRhcmdldCggeHJGcmFtZWJ1ZmZlciApIHtcclxuXHJcblx0XHR0aGlzLl94ckZyYW1lYnVmZmVyID0geHJGcmFtZWJ1ZmZlcjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25maWd1cmVzIHRoZSBnaXZlbiBYUiByZW5kZXIgdGFyZ2V0IHdpdGggZXh0ZXJuYWwgdGV4dHVyZXMuXHJcblx0ICpcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyBvbmx5IHJlbGV2YW50IHdoZW4gdXNpbmcgdGhlIFdlYlhSIExheWVycyBBUEkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1hSUmVuZGVyVGFyZ2V0fSByZW5kZXJUYXJnZXQgLSBUaGUgWFIgcmVuZGVyIHRhcmdldC5cclxuXHQgKiBAcGFyYW0ge1dlYkdMVGV4dHVyZX0gY29sb3JUZXh0dXJlIC0gQSBuYXRpdmUgY29sb3IgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0gez9XZWJHTFRleHR1cmV9IFtkZXB0aFRleHR1cmU9bnVsbF0gLSBBIG5hdGl2ZSBkZXB0aCB0ZXh0dXJlLlxyXG5cdCAqL1xyXG5cdHNldFhSUmVuZGVyVGFyZ2V0VGV4dHVyZXMoIHJlbmRlclRhcmdldCwgY29sb3JUZXh0dXJlLCBkZXB0aFRleHR1cmUgPSBudWxsICkge1xyXG5cclxuXHRcdGNvbnN0IGdsID0gdGhpcy5nbDtcclxuXHJcblx0XHR0aGlzLnNldCggcmVuZGVyVGFyZ2V0LnRleHR1cmUsIHsgdGV4dHVyZUdQVTogY29sb3JUZXh0dXJlLCBnbEludGVybmFsRm9ybWF0OiBnbC5SR0JBOCB9ICk7IC8vIHNlZSAjMjQ2OTggd2h5IFJHQkE4IGFuZCBub3QgU1JHQjhfQUxQSEE4IGlzIHVzZWRcclxuXHJcblx0XHRpZiAoIGRlcHRoVGV4dHVyZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGdsSW50ZXJuYWxGb3JtYXQgPSByZW5kZXJUYXJnZXQuc3RlbmNpbEJ1ZmZlciA/IGdsLkRFUFRIMjRfU1RFTkNJTDggOiBnbC5ERVBUSF9DT01QT05FTlQyNDtcclxuXHJcblx0XHRcdHRoaXMuc2V0KCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLCB7IHRleHR1cmVHUFU6IGRlcHRoVGV4dHVyZSwgZ2xJbnRlcm5hbEZvcm1hdDogZ2xJbnRlcm5hbEZvcm1hdCB9ICk7XHJcblxyXG5cdFx0XHQvLyBUaGUgbXVsdGlzYW1wbGVfcmVuZGVyX3RvX3RleHR1cmUgZXh0ZW5zaW9uIGRvZXNuJ3Qgd29yayBwcm9wZXJseSBpZiB0aGVyZVxyXG5cdFx0XHQvLyBhcmUgbWlkZnJhbWUgZmx1c2hlcyBhbmQgYW4gZXh0ZXJuYWwgZGVwdGggdGV4dHVyZS5cclxuXHRcdFx0aWYgKCAoIHRoaXMuZXh0ZW5zaW9ucy5oYXMoICdXRUJHTF9tdWx0aXNhbXBsZWRfcmVuZGVyX3RvX3RleHR1cmUnICkgPT09IHRydWUgKSAmJiByZW5kZXJUYXJnZXQuYXV0b0FsbG9jYXRlRGVwdGhCdWZmZXIgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMQmFja2VuZDogUmVuZGVyLXRvLXRleHR1cmUgZXh0ZW5zaW9uIHdhcyBkaXNhYmxlZCBiZWNhdXNlIGFuIGV4dGVybmFsIHRleHR1cmUgd2FzIHByb3ZpZGVkJyApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmVuZGVyVGFyZ2V0LmF1dG9BbGxvY2F0ZURlcHRoQnVmZmVyID0gZmFsc2U7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEluaXRzIGEgdGltZSBzdGFtcCBxdWVyeSBmb3IgdGhlIGdpdmVuIHJlbmRlciBjb250ZXh0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSZW5kZXJDb250ZXh0fSByZW5kZXJDb250ZXh0IC0gVGhlIHJlbmRlciBjb250ZXh0LlxyXG5cdCAqL1xyXG5cdGluaXRUaW1lc3RhbXBRdWVyeSggcmVuZGVyQ29udGV4dCApIHtcclxuXHJcblx0XHRpZiAoICEgdGhpcy5kaXNqb2ludCB8fCAhIHRoaXMudHJhY2tUaW1lc3RhbXAgKSByZXR1cm47XHJcblxyXG5cdFx0Y29uc3QgdHlwZSA9IHJlbmRlckNvbnRleHQuaXNDb21wdXRlTm9kZSA/ICdjb21wdXRlJyA6ICdyZW5kZXInO1xyXG5cclxuXHRcdGlmICggISB0aGlzLnRpbWVzdGFtcFF1ZXJ5UG9vbFsgdHlwZSBdICkge1xyXG5cclxuXHRcdFx0Ly8gVE9ETzogVmFyaWFibGUgbWF4UXVlcmllcz9cclxuXHRcdFx0dGhpcy50aW1lc3RhbXBRdWVyeVBvb2xbIHR5cGUgXSA9IG5ldyBXZWJHTFRpbWVzdGFtcFF1ZXJ5UG9vbCggdGhpcy5nbCwgdHlwZSwgMjA0OCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCB0aW1lc3RhbXBRdWVyeVBvb2wgPSB0aGlzLnRpbWVzdGFtcFF1ZXJ5UG9vbFsgdHlwZSBdO1xyXG5cclxuXHRcdGNvbnN0IGJhc2VPZmZzZXQgPSB0aW1lc3RhbXBRdWVyeVBvb2wuYWxsb2NhdGVRdWVyaWVzRm9yQ29udGV4dCggcmVuZGVyQ29udGV4dCApO1xyXG5cclxuXHRcdGlmICggYmFzZU9mZnNldCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRpbWVzdGFtcFF1ZXJ5UG9vbC5iZWdpblF1ZXJ5KCByZW5kZXJDb250ZXh0ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8vIHRpbWVzdGFtcCB1dGlsc1xyXG5cclxuXHQvKipcclxuXHQgKiBQcmVwYXJlcyB0aGUgdGltZXN0YW1wIGJ1ZmZlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyQ29udGV4dH0gcmVuZGVyQ29udGV4dCAtIFRoZSByZW5kZXIgY29udGV4dC5cclxuXHQgKi9cclxuXHRwcmVwYXJlVGltZXN0YW1wQnVmZmVyKCByZW5kZXJDb250ZXh0ICkge1xyXG5cclxuXHRcdGlmICggISB0aGlzLmRpc2pvaW50IHx8ICEgdGhpcy50cmFja1RpbWVzdGFtcCApIHJldHVybjtcclxuXHJcblx0XHRjb25zdCB0eXBlID0gcmVuZGVyQ29udGV4dC5pc0NvbXB1dGVOb2RlID8gJ2NvbXB1dGUnIDogJ3JlbmRlcic7XHJcblx0XHRjb25zdCB0aW1lc3RhbXBRdWVyeVBvb2wgPSB0aGlzLnRpbWVzdGFtcFF1ZXJ5UG9vbFsgdHlwZSBdO1xyXG5cclxuXHRcdHRpbWVzdGFtcFF1ZXJ5UG9vbC5lbmRRdWVyeSggcmVuZGVyQ29udGV4dCApO1xyXG5cclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBiYWNrZW5kJ3MgcmVuZGVyaW5nIGNvbnRleHQuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtXZWJHTDJSZW5kZXJpbmdDb250ZXh0fSBUaGUgcmVuZGVyaW5nIGNvbnRleHQuXHJcblx0ICovXHJcblx0Z2V0Q29udGV4dCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5nbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyBleGVjdXRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgcmVuZGVyIGNhbGwgYW5kIHByZXBhcmVzXHJcblx0ICogdGhlIFdlYkdMIHN0YXRlIGZvciB1cGNvbWluZyByZW5kZXIgY2FsbHNcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyQ29udGV4dH0gcmVuZGVyQ29udGV4dCAtIFRoZSByZW5kZXIgY29udGV4dC5cclxuXHQgKi9cclxuXHRiZWdpblJlbmRlciggcmVuZGVyQ29udGV4dCApIHtcclxuXHJcblx0XHRjb25zdCB7IHN0YXRlLCBnbCB9ID0gdGhpcztcclxuXHRcdGNvbnN0IHJlbmRlckNvbnRleHREYXRhID0gdGhpcy5nZXQoIHJlbmRlckNvbnRleHQgKTtcclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGlmICggcmVuZGVyQ29udGV4dC52aWV3cG9ydCApIHtcclxuXHJcblx0XHRcdHRoaXMudXBkYXRlVmlld3BvcnQoIHJlbmRlckNvbnRleHQgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0c3RhdGUudmlld3BvcnQoIDAsIDAsIGdsLmRyYXdpbmdCdWZmZXJXaWR0aCwgZ2wuZHJhd2luZ0J1ZmZlckhlaWdodCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHJlbmRlckNvbnRleHQuc2Npc3NvciApIHtcclxuXHJcblx0XHRcdGNvbnN0IHsgeCwgeSwgd2lkdGgsIGhlaWdodCB9ID0gcmVuZGVyQ29udGV4dC5zY2lzc29yVmFsdWU7XHJcblxyXG5cdFx0XHRzdGF0ZS5zY2lzc29yKCB4LCByZW5kZXJDb250ZXh0LmhlaWdodCAtIGhlaWdodCAtIHksIHdpZHRoLCBoZWlnaHQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHR0aGlzLmluaXRUaW1lc3RhbXBRdWVyeSggcmVuZGVyQ29udGV4dCApO1xyXG5cclxuXHRcdHJlbmRlckNvbnRleHREYXRhLnByZXZpb3VzQ29udGV4dCA9IHRoaXMuX2N1cnJlbnRDb250ZXh0O1xyXG5cdFx0dGhpcy5fY3VycmVudENvbnRleHQgPSByZW5kZXJDb250ZXh0O1xyXG5cclxuXHRcdHRoaXMuX3NldEZyYW1lYnVmZmVyKCByZW5kZXJDb250ZXh0ICk7XHJcblxyXG5cdFx0dGhpcy5jbGVhciggcmVuZGVyQ29udGV4dC5jbGVhckNvbG9yLCByZW5kZXJDb250ZXh0LmNsZWFyRGVwdGgsIHJlbmRlckNvbnRleHQuY2xlYXJTdGVuY2lsLCByZW5kZXJDb250ZXh0LCBmYWxzZSApO1xyXG5cclxuXHJcblx0XHRjb25zdCBvY2NsdXNpb25RdWVyeUNvdW50ID0gcmVuZGVyQ29udGV4dC5vY2NsdXNpb25RdWVyeUNvdW50O1xyXG5cclxuXHRcdGlmICggb2NjbHVzaW9uUXVlcnlDb3VudCA+IDAgKSB7XHJcblxyXG5cdFx0XHQvLyBHZXQgYSByZWZlcmVuY2UgdG8gdGhlIGFycmF5IG9mIG9iamVjdHMgd2l0aCBxdWVyaWVzLiBUaGUgcmVuZGVyQ29udGV4dERhdGEgcHJvcGVydHlcclxuXHRcdFx0Ly8gY2FuIGJlIGNoYW5nZWQgYnkgYW5vdGhlciByZW5kZXIgcGFzcyBiZWZvcmUgdGhlIGFzeW5jIHJlYWRpbmcgb2YgYWxsIHByZXZpb3VzIHF1ZXJpZXMgY29tcGxldGVcclxuXHRcdFx0cmVuZGVyQ29udGV4dERhdGEuY3VycmVudE9jY2x1c2lvblF1ZXJpZXMgPSByZW5kZXJDb250ZXh0RGF0YS5vY2NsdXNpb25RdWVyaWVzO1xyXG5cdFx0XHRyZW5kZXJDb250ZXh0RGF0YS5jdXJyZW50T2NjbHVzaW9uUXVlcnlPYmplY3RzID0gcmVuZGVyQ29udGV4dERhdGEub2NjbHVzaW9uUXVlcnlPYmplY3RzO1xyXG5cclxuXHRcdFx0cmVuZGVyQ29udGV4dERhdGEubGFzdE9jY2x1c2lvbk9iamVjdCA9IG51bGw7XHJcblx0XHRcdHJlbmRlckNvbnRleHREYXRhLm9jY2x1c2lvblF1ZXJpZXMgPSBuZXcgQXJyYXkoIG9jY2x1c2lvblF1ZXJ5Q291bnQgKTtcclxuXHRcdFx0cmVuZGVyQ29udGV4dERhdGEub2NjbHVzaW9uUXVlcnlPYmplY3RzID0gbmV3IEFycmF5KCBvY2NsdXNpb25RdWVyeUNvdW50ICk7XHJcblx0XHRcdHJlbmRlckNvbnRleHREYXRhLm9jY2x1c2lvblF1ZXJ5SW5kZXggPSAwO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyBleGVjdXRlZCBhdCB0aGUgZW5kIG9mIGEgcmVuZGVyIGNhbGwgYW5kIGZpbmFsaXplcyB3b3JrXHJcblx0ICogYWZ0ZXIgZHJhdyBjYWxscy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyQ29udGV4dH0gcmVuZGVyQ29udGV4dCAtIFRoZSByZW5kZXIgY29udGV4dC5cclxuXHQgKi9cclxuXHRmaW5pc2hSZW5kZXIoIHJlbmRlckNvbnRleHQgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBnbCwgc3RhdGUgfSA9IHRoaXM7XHJcblx0XHRjb25zdCByZW5kZXJDb250ZXh0RGF0YSA9IHRoaXMuZ2V0KCByZW5kZXJDb250ZXh0ICk7XHJcblx0XHRjb25zdCBwcmV2aW91c0NvbnRleHQgPSByZW5kZXJDb250ZXh0RGF0YS5wcmV2aW91c0NvbnRleHQ7XHJcblxyXG5cdFx0c3RhdGUucmVzZXRWZXJ0ZXhTdGF0ZSgpO1xyXG5cclxuXHRcdGNvbnN0IG9jY2x1c2lvblF1ZXJ5Q291bnQgPSByZW5kZXJDb250ZXh0Lm9jY2x1c2lvblF1ZXJ5Q291bnQ7XHJcblxyXG5cdFx0aWYgKCBvY2NsdXNpb25RdWVyeUNvdW50ID4gMCApIHtcclxuXHJcblx0XHRcdGlmICggb2NjbHVzaW9uUXVlcnlDb3VudCA+IHJlbmRlckNvbnRleHREYXRhLm9jY2x1c2lvblF1ZXJ5SW5kZXggKSB7XHJcblxyXG5cdFx0XHRcdGdsLmVuZFF1ZXJ5KCBnbC5BTllfU0FNUExFU19QQVNTRUQgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMucmVzb2x2ZU9jY2x1ZGVkQXN5bmMoIHJlbmRlckNvbnRleHQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZXMgPSByZW5kZXJDb250ZXh0LnRleHR1cmVzO1xyXG5cclxuXHRcdGlmICggdGV4dHVyZXMgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB0ZXh0dXJlcy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHRleHR1cmUgPSB0ZXh0dXJlc1sgaSBdO1xyXG5cclxuXHRcdFx0XHRpZiAoIHRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzICkge1xyXG5cclxuXHRcdFx0XHRcdHRoaXMuZ2VuZXJhdGVNaXBtYXBzKCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5fY3VycmVudENvbnRleHQgPSBwcmV2aW91c0NvbnRleHQ7XHJcblxyXG5cdFx0aWYgKCByZW5kZXJDb250ZXh0LnRleHR1cmVzICE9PSBudWxsICYmIHJlbmRlckNvbnRleHQucmVuZGVyVGFyZ2V0ICkge1xyXG5cclxuXHRcdFx0Y29uc3QgcmVuZGVyVGFyZ2V0Q29udGV4dERhdGEgPSB0aGlzLmdldCggcmVuZGVyQ29udGV4dC5yZW5kZXJUYXJnZXQgKTtcclxuXHJcblx0XHRcdGNvbnN0IHsgc2FtcGxlcyB9ID0gcmVuZGVyQ29udGV4dC5yZW5kZXJUYXJnZXQ7XHJcblxyXG5cdFx0XHRpZiAoIHNhbXBsZXMgPiAwICYmIHRoaXMuX3VzZU11bHRpc2FtcGxlZFJUVCggcmVuZGVyQ29udGV4dC5yZW5kZXJUYXJnZXQgKSA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGZiID0gcmVuZGVyVGFyZ2V0Q29udGV4dERhdGEuZnJhbWVidWZmZXJzWyByZW5kZXJDb250ZXh0LmdldENhY2hlS2V5KCkgXTtcclxuXHJcblx0XHRcdFx0Y29uc3QgbWFzayA9IGdsLkNPTE9SX0JVRkZFUl9CSVQ7XHJcblxyXG5cdFx0XHRcdGNvbnN0IG1zYWFGcmFtZUJ1ZmZlciA9IHJlbmRlclRhcmdldENvbnRleHREYXRhLm1zYWFGcmFtZUJ1ZmZlcjtcclxuXHJcblx0XHRcdFx0Y29uc3QgdGV4dHVyZXMgPSByZW5kZXJDb250ZXh0LnRleHR1cmVzO1xyXG5cclxuXHRcdFx0XHRzdGF0ZS5iaW5kRnJhbWVidWZmZXIoIGdsLlJFQURfRlJBTUVCVUZGRVIsIG1zYWFGcmFtZUJ1ZmZlciApO1xyXG5cdFx0XHRcdHN0YXRlLmJpbmRGcmFtZWJ1ZmZlciggZ2wuRFJBV19GUkFNRUJVRkZFUiwgZmIgKTtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdGV4dHVyZXMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdC8vIFRPRE8gQWRkIHN1cHBvcnQgZm9yIE1SVFxyXG5cclxuXHRcdFx0XHRcdGlmICggcmVuZGVyQ29udGV4dC5zY2lzc29yICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgeyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH0gPSByZW5kZXJDb250ZXh0LnNjaXNzb3JWYWx1ZTtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnN0IHZpZXdZID0gcmVuZGVyQ29udGV4dC5oZWlnaHQgLSBoZWlnaHQgLSB5O1xyXG5cclxuXHRcdFx0XHRcdFx0Z2wuYmxpdEZyYW1lYnVmZmVyKCB4LCB2aWV3WSwgeCArIHdpZHRoLCB2aWV3WSArIGhlaWdodCwgeCwgdmlld1ksIHggKyB3aWR0aCwgdmlld1kgKyBoZWlnaHQsIG1hc2ssIGdsLk5FQVJFU1QgKTtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggdGhpcy5fc3VwcG9ydHNJbnZhbGlkYXRlRnJhbWVidWZmZXIgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGdsLmludmFsaWRhdGVTdWJGcmFtZWJ1ZmZlciggZ2wuUkVBRF9GUkFNRUJVRkZFUiwgcmVuZGVyVGFyZ2V0Q29udGV4dERhdGEuaW52YWxpZGF0aW9uQXJyYXksIHgsIHZpZXdZLCB3aWR0aCwgaGVpZ2h0ICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdGdsLmJsaXRGcmFtZWJ1ZmZlciggMCwgMCwgcmVuZGVyQ29udGV4dC53aWR0aCwgcmVuZGVyQ29udGV4dC5oZWlnaHQsIDAsIDAsIHJlbmRlckNvbnRleHQud2lkdGgsIHJlbmRlckNvbnRleHQuaGVpZ2h0LCBtYXNrLCBnbC5ORUFSRVNUICk7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIHRoaXMuX3N1cHBvcnRzSW52YWxpZGF0ZUZyYW1lYnVmZmVyID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRnbC5pbnZhbGlkYXRlRnJhbWVidWZmZXIoIGdsLlJFQURfRlJBTUVCVUZGRVIsIHJlbmRlclRhcmdldENvbnRleHREYXRhLmludmFsaWRhdGlvbkFycmF5ICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHByZXZpb3VzQ29udGV4dCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuX3NldEZyYW1lYnVmZmVyKCBwcmV2aW91c0NvbnRleHQgKTtcclxuXHJcblx0XHRcdGlmICggcHJldmlvdXNDb250ZXh0LnZpZXdwb3J0ICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLnVwZGF0ZVZpZXdwb3J0KCBwcmV2aW91c0NvbnRleHQgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHN0YXRlLnZpZXdwb3J0KCAwLCAwLCBnbC5kcmF3aW5nQnVmZmVyV2lkdGgsIGdsLmRyYXdpbmdCdWZmZXJIZWlnaHQgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5wcmVwYXJlVGltZXN0YW1wQnVmZmVyKCByZW5kZXJDb250ZXh0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgcHJvY2Vzc2VzIHRoZSByZXN1bHQgb2Ygb2NjbHVzaW9uIHF1ZXJpZXMgYW5kIHdyaXRlcyBpdFxyXG5cdCAqIGludG8gcmVuZGVyIGNvbnRleHQgZGF0YS5cclxuXHQgKlxyXG5cdCAqIEBhc3luY1xyXG5cdCAqIEBwYXJhbSB7UmVuZGVyQ29udGV4dH0gcmVuZGVyQ29udGV4dCAtIFRoZSByZW5kZXIgY29udGV4dC5cclxuXHQgKi9cclxuXHRyZXNvbHZlT2NjbHVkZWRBc3luYyggcmVuZGVyQ29udGV4dCApIHtcclxuXHJcblx0XHRjb25zdCByZW5kZXJDb250ZXh0RGF0YSA9IHRoaXMuZ2V0KCByZW5kZXJDb250ZXh0ICk7XHJcblxyXG5cdFx0Ly8gaGFuZGxlIG9jY2x1c2lvbiBxdWVyeSByZXN1bHRzXHJcblxyXG5cdFx0Y29uc3QgeyBjdXJyZW50T2NjbHVzaW9uUXVlcmllcywgY3VycmVudE9jY2x1c2lvblF1ZXJ5T2JqZWN0cyB9ID0gcmVuZGVyQ29udGV4dERhdGE7XHJcblxyXG5cdFx0aWYgKCBjdXJyZW50T2NjbHVzaW9uUXVlcmllcyAmJiBjdXJyZW50T2NjbHVzaW9uUXVlcnlPYmplY3RzICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgb2NjbHVkZWQgPSBuZXcgV2Vha1NldCgpO1xyXG5cdFx0XHRjb25zdCB7IGdsIH0gPSB0aGlzO1xyXG5cclxuXHRcdFx0cmVuZGVyQ29udGV4dERhdGEuY3VycmVudE9jY2x1c2lvblF1ZXJ5T2JqZWN0cyA9IG51bGw7XHJcblx0XHRcdHJlbmRlckNvbnRleHREYXRhLmN1cnJlbnRPY2NsdXNpb25RdWVyaWVzID0gbnVsbDtcclxuXHJcblx0XHRcdGNvbnN0IGNoZWNrID0gKCkgPT4ge1xyXG5cclxuXHRcdFx0XHRsZXQgY29tcGxldGVkID0gMDtcclxuXHJcblx0XHRcdFx0Ly8gY2hlY2sgYWxsIHF1ZXJpZXMgYW5kIHJlcXVldWUgYXMgYXBwcm9wcmlhdGVcclxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBjdXJyZW50T2NjbHVzaW9uUXVlcmllcy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgcXVlcnkgPSBjdXJyZW50T2NjbHVzaW9uUXVlcmllc1sgaSBdO1xyXG5cclxuXHRcdFx0XHRcdGlmICggcXVlcnkgPT09IG51bGwgKSBjb250aW51ZTtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGdsLmdldFF1ZXJ5UGFyYW1ldGVyKCBxdWVyeSwgZ2wuUVVFUllfUkVTVUxUX0FWQUlMQUJMRSApICkge1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCBnbC5nZXRRdWVyeVBhcmFtZXRlciggcXVlcnksIGdsLlFVRVJZX1JFU1VMVCApID09PSAwICkgb2NjbHVkZWQuYWRkKCBjdXJyZW50T2NjbHVzaW9uUXVlcnlPYmplY3RzWyBpIF0gKTtcclxuXHJcblx0XHRcdFx0XHRcdGN1cnJlbnRPY2NsdXNpb25RdWVyaWVzWyBpIF0gPSBudWxsO1xyXG5cdFx0XHRcdFx0XHRnbC5kZWxldGVRdWVyeSggcXVlcnkgKTtcclxuXHJcblx0XHRcdFx0XHRcdGNvbXBsZXRlZCArKztcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKCBjb21wbGV0ZWQgPCBjdXJyZW50T2NjbHVzaW9uUXVlcmllcy5sZW5ndGggKSB7XHJcblxyXG5cdFx0XHRcdFx0cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCBjaGVjayApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdHJlbmRlckNvbnRleHREYXRhLm9jY2x1ZGVkID0gb2NjbHVkZWQ7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHRjaGVjaygpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gM0Qgb2JqZWN0IGlzIGZ1bGx5IG9jY2x1ZGVkIGJ5IG90aGVyXHJcblx0ICogM0Qgb2JqZWN0cyBpbiB0aGUgc2NlbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JlbmRlckNvbnRleHR9IHJlbmRlckNvbnRleHQgLSBUaGUgcmVuZGVyIGNvbnRleHQuXHJcblx0ICogQHBhcmFtIHtPYmplY3QzRH0gb2JqZWN0IC0gVGhlIDNEIG9iamVjdCB0byB0ZXN0LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIDNEIG9iamVjdCBpcyBmdWxseSBvY2NsdWRlZCBvciBub3QuXHJcblx0ICovXHJcblx0aXNPY2NsdWRlZCggcmVuZGVyQ29udGV4dCwgb2JqZWN0ICkge1xyXG5cclxuXHRcdGNvbnN0IHJlbmRlckNvbnRleHREYXRhID0gdGhpcy5nZXQoIHJlbmRlckNvbnRleHQgKTtcclxuXHJcblx0XHRyZXR1cm4gcmVuZGVyQ29udGV4dERhdGEub2NjbHVkZWQgJiYgcmVuZGVyQ29udGV4dERhdGEub2NjbHVkZWQuaGFzKCBvYmplY3QgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoZSB2aWV3cG9ydCB3aXRoIHRoZSB2YWx1ZXMgZnJvbSB0aGUgZ2l2ZW4gcmVuZGVyIGNvbnRleHQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JlbmRlckNvbnRleHR9IHJlbmRlckNvbnRleHQgLSBUaGUgcmVuZGVyIGNvbnRleHQuXHJcblx0ICovXHJcblx0dXBkYXRlVmlld3BvcnQoIHJlbmRlckNvbnRleHQgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBzdGF0ZSB9ID0gdGhpcztcclxuXHRcdGNvbnN0IHsgeCwgeSwgd2lkdGgsIGhlaWdodCB9ID0gcmVuZGVyQ29udGV4dC52aWV3cG9ydFZhbHVlO1xyXG5cclxuXHRcdHN0YXRlLnZpZXdwb3J0KCB4LCByZW5kZXJDb250ZXh0LmhlaWdodCAtIGhlaWdodCAtIHksIHdpZHRoLCBoZWlnaHQgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWZpbmVzIHRoZSBzY2lzc29yIHRlc3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IGJvb2xlYW4gLSBXaGV0aGVyIHRoZSBzY2lzc29yIHRlc3Qgc2hvdWxkIGJlIGVuYWJsZWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdHNldFNjaXNzb3JUZXN0KCBib29sZWFuICkge1xyXG5cclxuXHRcdGNvbnN0IHN0YXRlID0gdGhpcy5zdGF0ZTtcclxuXHJcblx0XHRzdGF0ZS5zZXRTY2lzc29yVGVzdCggYm9vbGVhbiApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGNsZWFyIGNvbG9yIGFuZCBhbHBoYSBpbnRvIGEgc2luZ2xlXHJcblx0ICogY29sb3Igb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Q29sb3I0fSBUaGUgY2xlYXIgY29sb3IuXHJcblx0ICovXHJcblx0Z2V0Q2xlYXJDb2xvcigpIHtcclxuXHJcblx0XHRjb25zdCBjbGVhckNvbG9yID0gc3VwZXIuZ2V0Q2xlYXJDb2xvcigpO1xyXG5cclxuXHRcdC8vIFNpbmNlIHRoZSBjYW52YXMgaXMgYWx3YXlzIGNyZWF0ZWQgd2l0aCBhbHBoYTogdHJ1ZSxcclxuXHRcdC8vIFdlYkdMIG11c3QgYWx3YXlzIHByZW11bHRpcGx5IHRoZSBjbGVhciBjb2xvci5cclxuXHJcblx0XHRjbGVhckNvbG9yLnIgKj0gY2xlYXJDb2xvci5hO1xyXG5cdFx0Y2xlYXJDb2xvci5nICo9IGNsZWFyQ29sb3IuYTtcclxuXHRcdGNsZWFyQ29sb3IuYiAqPSBjbGVhckNvbG9yLmE7XHJcblxyXG5cdFx0cmV0dXJuIGNsZWFyQ29sb3I7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUGVyZm9ybXMgYSBjbGVhciBvcGVyYXRpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IGNvbG9yIC0gV2hldGhlciB0aGUgY29sb3IgYnVmZmVyIHNob3VsZCBiZSBjbGVhcmVkIG9yIG5vdC5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IGRlcHRoIC0gV2hldGhlciB0aGUgZGVwdGggYnVmZmVyIHNob3VsZCBiZSBjbGVhcmVkIG9yIG5vdC5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IHN0ZW5jaWwgLSBXaGV0aGVyIHRoZSBzdGVuY2lsIGJ1ZmZlciBzaG91bGQgYmUgY2xlYXJlZCBvciBub3QuXHJcblx0ICogQHBhcmFtIHs/T2JqZWN0fSBbZGVzY3JpcHRvcj1udWxsXSAtIFRoZSByZW5kZXIgY29udGV4dCBvZiB0aGUgY3VycmVudCBzZXQgcmVuZGVyIHRhcmdldC5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtzZXRGcmFtZUJ1ZmZlcj10cnVlXSAtIFRPRE8uXHJcblx0ICovXHJcblx0Y2xlYXIoIGNvbG9yLCBkZXB0aCwgc3RlbmNpbCwgZGVzY3JpcHRvciA9IG51bGwsIHNldEZyYW1lQnVmZmVyID0gdHJ1ZSApIHtcclxuXHJcblx0XHRjb25zdCB7IGdsLCByZW5kZXJlciB9ID0gdGhpcztcclxuXHJcblx0XHRpZiAoIGRlc2NyaXB0b3IgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBjbGVhckNvbG9yID0gdGhpcy5nZXRDbGVhckNvbG9yKCk7XHJcblxyXG5cdFx0XHRkZXNjcmlwdG9yID0ge1xyXG5cdFx0XHRcdHRleHR1cmVzOiBudWxsLFxyXG5cdFx0XHRcdGNsZWFyQ29sb3JWYWx1ZTogY2xlYXJDb2xvclxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGxldCBjbGVhciA9IDA7XHJcblxyXG5cdFx0aWYgKCBjb2xvciApIGNsZWFyIHw9IGdsLkNPTE9SX0JVRkZFUl9CSVQ7XHJcblx0XHRpZiAoIGRlcHRoICkgY2xlYXIgfD0gZ2wuREVQVEhfQlVGRkVSX0JJVDtcclxuXHRcdGlmICggc3RlbmNpbCApIGNsZWFyIHw9IGdsLlNURU5DSUxfQlVGRkVSX0JJVDtcclxuXHJcblx0XHRpZiAoIGNsZWFyICE9PSAwICkge1xyXG5cclxuXHRcdFx0bGV0IGNsZWFyQ29sb3I7XHJcblxyXG5cdFx0XHRpZiAoIGRlc2NyaXB0b3IuY2xlYXJDb2xvclZhbHVlICkge1xyXG5cclxuXHRcdFx0XHRjbGVhckNvbG9yID0gZGVzY3JpcHRvci5jbGVhckNvbG9yVmFsdWU7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRjbGVhckNvbG9yID0gdGhpcy5nZXRDbGVhckNvbG9yKCk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBjbGVhckRlcHRoID0gcmVuZGVyZXIuZ2V0Q2xlYXJEZXB0aCgpO1xyXG5cdFx0XHRjb25zdCBjbGVhclN0ZW5jaWwgPSByZW5kZXJlci5nZXRDbGVhclN0ZW5jaWwoKTtcclxuXHJcblx0XHRcdGlmICggZGVwdGggKSB0aGlzLnN0YXRlLnNldERlcHRoTWFzayggdHJ1ZSApO1xyXG5cclxuXHRcdFx0aWYgKCBkZXNjcmlwdG9yLnRleHR1cmVzID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRnbC5jbGVhckNvbG9yKCBjbGVhckNvbG9yLnIsIGNsZWFyQ29sb3IuZywgY2xlYXJDb2xvci5iLCBjbGVhckNvbG9yLmEgKTtcclxuXHRcdFx0XHRnbC5jbGVhciggY2xlYXIgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGlmICggc2V0RnJhbWVCdWZmZXIgKSB0aGlzLl9zZXRGcmFtZWJ1ZmZlciggZGVzY3JpcHRvciApO1xyXG5cclxuXHRcdFx0XHRpZiAoIGNvbG9yICkge1xyXG5cclxuXHRcdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGRlc2NyaXB0b3IudGV4dHVyZXMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCBpID09PSAwICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRnbC5jbGVhckJ1ZmZlcmZ2KCBnbC5DT0xPUiwgaSwgWyBjbGVhckNvbG9yLnIsIGNsZWFyQ29sb3IuZywgY2xlYXJDb2xvci5iLCBjbGVhckNvbG9yLmEgXSApO1xyXG5cclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0Z2wuY2xlYXJCdWZmZXJmdiggZ2wuQ09MT1IsIGksIFsgMCwgMCwgMCwgMSBdICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICggZGVwdGggJiYgc3RlbmNpbCApIHtcclxuXHJcblx0XHRcdFx0XHRnbC5jbGVhckJ1ZmZlcmZpKCBnbC5ERVBUSF9TVEVOQ0lMLCAwLCBjbGVhckRlcHRoLCBjbGVhclN0ZW5jaWwgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggZGVwdGggKSB7XHJcblxyXG5cdFx0XHRcdFx0Z2wuY2xlYXJCdWZmZXJmdiggZ2wuREVQVEgsIDAsIFsgY2xlYXJEZXB0aCBdICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIHN0ZW5jaWwgKSB7XHJcblxyXG5cdFx0XHRcdFx0Z2wuY2xlYXJCdWZmZXJpdiggZ2wuU1RFTkNJTCwgMCwgWyBjbGVhclN0ZW5jaWwgXSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGlzIGV4ZWN1dGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBjb21wdXRlIGNhbGwgYW5kXHJcblx0ICogcHJlcGFyZXMgdGhlIHN0YXRlIGZvciB1cGNvbWluZyBjb21wdXRlIHRhc2tzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlfEFycmF5PE5vZGU+fSBjb21wdXRlR3JvdXAgLSBUaGUgY29tcHV0ZSBub2RlKHMpLlxyXG5cdCAqL1xyXG5cdGJlZ2luQ29tcHV0ZSggY29tcHV0ZUdyb3VwICkge1xyXG5cclxuXHRcdGNvbnN0IHsgc3RhdGUsIGdsIH0gPSB0aGlzO1xyXG5cclxuXHRcdHN0YXRlLmJpbmRGcmFtZWJ1ZmZlciggZ2wuRlJBTUVCVUZGRVIsIG51bGwgKTtcclxuXHRcdHRoaXMuaW5pdFRpbWVzdGFtcFF1ZXJ5KCBjb21wdXRlR3JvdXAgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFeGVjdXRlcyBhIGNvbXB1dGUgY29tbWFuZCBmb3IgdGhlIGdpdmVuIGNvbXB1dGUgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZXxBcnJheTxOb2RlPn0gY29tcHV0ZUdyb3VwIC0gVGhlIGdyb3VwIG9mIGNvbXB1dGUgbm9kZXMgb2YgYSBjb21wdXRlIGNhbGwuIENhbiBiZSBhIHNpbmdsZSBjb21wdXRlIG5vZGUuXHJcblx0ICogQHBhcmFtIHtOb2RlfSBjb21wdXRlTm9kZSAtIFRoZSBjb21wdXRlIG5vZGUuXHJcblx0ICogQHBhcmFtIHtBcnJheTxCaW5kR3JvdXA+fSBiaW5kaW5ncyAtIFRoZSBiaW5kaW5ncy5cclxuXHQgKiBAcGFyYW0ge0NvbXB1dGVQaXBlbGluZX0gcGlwZWxpbmUgLSBUaGUgY29tcHV0ZSBwaXBlbGluZS5cclxuXHQgKi9cclxuXHRjb21wdXRlKCBjb21wdXRlR3JvdXAsIGNvbXB1dGVOb2RlLCBiaW5kaW5ncywgcGlwZWxpbmUgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBzdGF0ZSwgZ2wgfSA9IHRoaXM7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmRpc2NhcmQgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0Ly8gcmVxdWlyZWQgaGVyZSB0byBoYW5kbGUgYXN5bmMgYmVoYXZpb3VyIG9mIHJlbmRlci5jb21wdXRlKClcclxuXHRcdFx0Z2wuZW5hYmxlKCBnbC5SQVNURVJJWkVSX0RJU0NBUkQgKTtcclxuXHRcdFx0dGhpcy5kaXNjYXJkID0gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgeyBwcm9ncmFtR1BVLCB0cmFuc2Zvcm1CdWZmZXJzLCBhdHRyaWJ1dGVzIH0gPSB0aGlzLmdldCggcGlwZWxpbmUgKTtcclxuXHJcblx0XHRjb25zdCB2YW9LZXkgPSB0aGlzLl9nZXRWYW9LZXkoIGF0dHJpYnV0ZXMgKTtcclxuXHJcblx0XHRjb25zdCB2YW9HUFUgPSB0aGlzLnZhb0NhY2hlWyB2YW9LZXkgXTtcclxuXHJcblx0XHRpZiAoIHZhb0dQVSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0dGhpcy5fY3JlYXRlVmFvKCBhdHRyaWJ1dGVzICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHN0YXRlLnNldFZlcnRleFN0YXRlKCB2YW9HUFUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0c3RhdGUudXNlUHJvZ3JhbSggcHJvZ3JhbUdQVSApO1xyXG5cclxuXHRcdHRoaXMuX2JpbmRVbmlmb3JtcyggYmluZGluZ3MgKTtcclxuXHJcblx0XHRjb25zdCB0cmFuc2Zvcm1GZWVkYmFja0dQVSA9IHRoaXMuX2dldFRyYW5zZm9ybUZlZWRiYWNrKCB0cmFuc2Zvcm1CdWZmZXJzICk7XHJcblxyXG5cdFx0Z2wuYmluZFRyYW5zZm9ybUZlZWRiYWNrKCBnbC5UUkFOU0ZPUk1fRkVFREJBQ0ssIHRyYW5zZm9ybUZlZWRiYWNrR1BVICk7XHJcblx0XHRnbC5iZWdpblRyYW5zZm9ybUZlZWRiYWNrKCBnbC5QT0lOVFMgKTtcclxuXHJcblx0XHRpZiAoIGF0dHJpYnV0ZXNbIDAgXS5pc1N0b3JhZ2VJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUgKSB7XHJcblxyXG5cdFx0XHRnbC5kcmF3QXJyYXlzSW5zdGFuY2VkKCBnbC5QT0lOVFMsIDAsIDEsIGNvbXB1dGVOb2RlLmNvdW50ICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGdsLmRyYXdBcnJheXMoIGdsLlBPSU5UUywgMCwgY29tcHV0ZU5vZGUuY291bnQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Z2wuZW5kVHJhbnNmb3JtRmVlZGJhY2soKTtcclxuXHRcdGdsLmJpbmRUcmFuc2Zvcm1GZWVkYmFjayggZ2wuVFJBTlNGT1JNX0ZFRURCQUNLLCBudWxsICk7XHJcblxyXG5cdFx0Ly8gc3dpdGNoIGFjdGl2ZSBidWZmZXJzXHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdHJhbnNmb3JtQnVmZmVycy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBkdWFsQXR0cmlidXRlRGF0YSA9IHRyYW5zZm9ybUJ1ZmZlcnNbIGkgXTtcclxuXHJcblx0XHRcdGlmICggZHVhbEF0dHJpYnV0ZURhdGEucGJvICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLnRleHR1cmVVdGlscy5jb3B5QnVmZmVyVG9UZXh0dXJlKCBkdWFsQXR0cmlidXRlRGF0YS50cmFuc2Zvcm1CdWZmZXIsIGR1YWxBdHRyaWJ1dGVEYXRhLnBibyApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZHVhbEF0dHJpYnV0ZURhdGEuc3dpdGNoQnVmZmVycygpO1xyXG5cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgaXMgZXhlY3V0ZWQgYXQgdGhlIGVuZCBvZiBhIGNvbXB1dGUgY2FsbCBhbmRcclxuXHQgKiBmaW5hbGl6ZXMgd29yayBhZnRlciBjb21wdXRlIHRhc2tzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlfEFycmF5PE5vZGU+fSBjb21wdXRlR3JvdXAgLSBUaGUgY29tcHV0ZSBub2RlKHMpLlxyXG5cdCAqL1xyXG5cdGZpbmlzaENvbXB1dGUoIGNvbXB1dGVHcm91cCApIHtcclxuXHJcblx0XHRjb25zdCBnbCA9IHRoaXMuZ2w7XHJcblxyXG5cdFx0dGhpcy5kaXNjYXJkID0gZmFsc2U7XHJcblxyXG5cdFx0Z2wuZGlzYWJsZSggZ2wuUkFTVEVSSVpFUl9ESVNDQVJEICk7XHJcblxyXG5cdFx0dGhpcy5wcmVwYXJlVGltZXN0YW1wQnVmZmVyKCBjb21wdXRlR3JvdXAgKTtcclxuXHJcblx0XHRpZiAoIHRoaXMuX2N1cnJlbnRDb250ZXh0ICkge1xyXG5cclxuXHRcdFx0dGhpcy5fc2V0RnJhbWVidWZmZXIoIHRoaXMuX2N1cnJlbnRDb250ZXh0ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEV4ZWN1dGVzIGEgZHJhdyBjb21tYW5kIGZvciB0aGUgZ2l2ZW4gcmVuZGVyIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyT2JqZWN0fSByZW5kZXJPYmplY3QgLSBUaGUgcmVuZGVyIG9iamVjdCB0byBkcmF3LlxyXG5cdCAqIEBwYXJhbSB7SW5mb30gaW5mbyAtIEhvbGRzIGEgc2VyaWVzIG9mIHN0YXRpc3RpY2FsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBHUFUgbWVtb3J5IGFuZCB0aGUgcmVuZGVyaW5nIHByb2Nlc3MuXHJcblx0ICovXHJcblx0ZHJhdyggcmVuZGVyT2JqZWN0LyosIGluZm8qLyApIHtcclxuXHJcblx0XHRjb25zdCB7IG9iamVjdCwgcGlwZWxpbmUsIG1hdGVyaWFsLCBjb250ZXh0LCBoYXJkd2FyZUNsaXBwaW5nUGxhbmVzIH0gPSByZW5kZXJPYmplY3Q7XHJcblx0XHRjb25zdCB7IHByb2dyYW1HUFUgfSA9IHRoaXMuZ2V0KCBwaXBlbGluZSApO1xyXG5cclxuXHRcdGNvbnN0IHsgZ2wsIHN0YXRlIH0gPSB0aGlzO1xyXG5cclxuXHRcdGNvbnN0IGNvbnRleHREYXRhID0gdGhpcy5nZXQoIGNvbnRleHQgKTtcclxuXHJcblx0XHRjb25zdCBkcmF3UGFyYW1zID0gcmVuZGVyT2JqZWN0LmdldERyYXdQYXJhbWV0ZXJzKCk7XHJcblxyXG5cdFx0aWYgKCBkcmF3UGFyYW1zID09PSBudWxsICkgcmV0dXJuO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0dGhpcy5fYmluZFVuaWZvcm1zKCByZW5kZXJPYmplY3QuZ2V0QmluZGluZ3MoKSApO1xyXG5cclxuXHRcdGNvbnN0IGZyb250RmFjZUNXID0gKCBvYmplY3QuaXNNZXNoICYmIG9iamVjdC5tYXRyaXhXb3JsZC5kZXRlcm1pbmFudCgpIDwgMCApO1xyXG5cclxuXHRcdHN0YXRlLnNldE1hdGVyaWFsKCBtYXRlcmlhbCwgZnJvbnRGYWNlQ1csIGhhcmR3YXJlQ2xpcHBpbmdQbGFuZXMgKTtcclxuXHJcblx0XHRzdGF0ZS51c2VQcm9ncmFtKCBwcm9ncmFtR1BVICk7XHJcblxyXG5cdFx0Ly8gdmVydGV4IHN0YXRlXHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyT2JqZWN0RGF0YSA9IHRoaXMuZ2V0KCByZW5kZXJPYmplY3QgKTtcclxuXHJcblx0XHRsZXQgdmFvR1BVID0gcmVuZGVyT2JqZWN0RGF0YS5zdGF0aWNWYW87XHJcblxyXG5cdFx0aWYgKCB2YW9HUFUgPT09IHVuZGVmaW5lZCB8fCByZW5kZXJPYmplY3REYXRhLmdlb21ldHJ5SWQgIT09IHJlbmRlck9iamVjdC5nZW9tZXRyeS5pZCApIHtcclxuXHJcblx0XHRcdGNvbnN0IHZhb0tleSA9IHRoaXMuX2dldFZhb0tleSggcmVuZGVyT2JqZWN0LmdldEF0dHJpYnV0ZXMoKSApO1xyXG5cclxuXHRcdFx0dmFvR1BVID0gdGhpcy52YW9DYWNoZVsgdmFvS2V5IF07XHJcblxyXG5cdFx0XHRpZiAoIHZhb0dQVSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRsZXQgc3RhdGljVmFvO1xyXG5cclxuXHRcdFx0XHQoIHsgdmFvR1BVLCBzdGF0aWNWYW8gfSA9IHRoaXMuX2NyZWF0ZVZhbyggcmVuZGVyT2JqZWN0LmdldEF0dHJpYnV0ZXMoKSApICk7XHJcblxyXG5cdFx0XHRcdGlmICggc3RhdGljVmFvICkge1xyXG5cclxuXHRcdFx0XHRcdHJlbmRlck9iamVjdERhdGEuc3RhdGljVmFvID0gdmFvR1BVO1xyXG5cdFx0XHRcdFx0cmVuZGVyT2JqZWN0RGF0YS5nZW9tZXRyeUlkID0gcmVuZGVyT2JqZWN0Lmdlb21ldHJ5LmlkO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGluZGV4ID0gcmVuZGVyT2JqZWN0LmdldEluZGV4KCk7XHJcblx0XHRjb25zdCBpbmRleEdQVSA9ICggaW5kZXggIT09IG51bGwgKSA/IHRoaXMuZ2V0KCBpbmRleCApLmJ1ZmZlckdQVSA6IG51bGw7XHJcblxyXG5cdFx0c3RhdGUuc2V0VmVydGV4U3RhdGUoIHZhb0dQVSwgaW5kZXhHUFUgKTtcclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGNvbnN0IGxhc3RPYmplY3QgPSBjb250ZXh0RGF0YS5sYXN0T2NjbHVzaW9uT2JqZWN0O1xyXG5cclxuXHRcdGlmICggbGFzdE9iamVjdCAhPT0gb2JqZWN0ICYmIGxhc3RPYmplY3QgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGlmICggbGFzdE9iamVjdCAhPT0gbnVsbCAmJiBsYXN0T2JqZWN0Lm9jY2x1c2lvblRlc3QgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdGdsLmVuZFF1ZXJ5KCBnbC5BTllfU0FNUExFU19QQVNTRUQgKTtcclxuXHJcblx0XHRcdFx0Y29udGV4dERhdGEub2NjbHVzaW9uUXVlcnlJbmRleCArKztcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggb2JqZWN0Lm9jY2x1c2lvblRlc3QgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHF1ZXJ5ID0gZ2wuY3JlYXRlUXVlcnkoKTtcclxuXHJcblx0XHRcdFx0Z2wuYmVnaW5RdWVyeSggZ2wuQU5ZX1NBTVBMRVNfUEFTU0VELCBxdWVyeSApO1xyXG5cclxuXHRcdFx0XHRjb250ZXh0RGF0YS5vY2NsdXNpb25RdWVyaWVzWyBjb250ZXh0RGF0YS5vY2NsdXNpb25RdWVyeUluZGV4IF0gPSBxdWVyeTtcclxuXHRcdFx0XHRjb250ZXh0RGF0YS5vY2NsdXNpb25RdWVyeU9iamVjdHNbIGNvbnRleHREYXRhLm9jY2x1c2lvblF1ZXJ5SW5kZXggXSA9IG9iamVjdDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnRleHREYXRhLmxhc3RPY2NsdXNpb25PYmplY3QgPSBvYmplY3Q7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vXHJcblx0XHRjb25zdCByZW5kZXJlciA9IHRoaXMuYnVmZmVyUmVuZGVyZXI7XHJcblxyXG5cdFx0aWYgKCBvYmplY3QuaXNQb2ludHMgKSByZW5kZXJlci5tb2RlID0gZ2wuUE9JTlRTO1xyXG5cdFx0ZWxzZSBpZiAoIG9iamVjdC5pc0xpbmVTZWdtZW50cyApIHJlbmRlcmVyLm1vZGUgPSBnbC5MSU5FUztcclxuXHRcdGVsc2UgaWYgKCBvYmplY3QuaXNMaW5lICkgcmVuZGVyZXIubW9kZSA9IGdsLkxJTkVfU1RSSVA7XHJcblx0XHRlbHNlIGlmICggb2JqZWN0LmlzTGluZUxvb3AgKSByZW5kZXJlci5tb2RlID0gZ2wuTElORV9MT09QO1xyXG5cdFx0ZWxzZSB7XHJcblxyXG5cdFx0XHRpZiAoIG1hdGVyaWFsLndpcmVmcmFtZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0c3RhdGUuc2V0TGluZVdpZHRoKCBtYXRlcmlhbC53aXJlZnJhbWVMaW5ld2lkdGggKiB0aGlzLnJlbmRlcmVyLmdldFBpeGVsUmF0aW8oKSApO1xyXG5cdFx0XHRcdHJlbmRlcmVyLm1vZGUgPSBnbC5MSU5FUztcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHJlbmRlcmVyLm1vZGUgPSBnbC5UUklBTkdMRVM7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0Y29uc3QgeyB2ZXJ0ZXhDb3VudCwgaW5zdGFuY2VDb3VudCB9ID0gZHJhd1BhcmFtcztcclxuXHRcdGxldCB7IGZpcnN0VmVydGV4IH0gPSBkcmF3UGFyYW1zO1xyXG5cclxuXHRcdHJlbmRlcmVyLm9iamVjdCA9IG9iamVjdDtcclxuXHJcblx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0Zmlyc3RWZXJ0ZXggKj0gaW5kZXguYXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7XHJcblxyXG5cdFx0XHRjb25zdCBpbmRleERhdGEgPSB0aGlzLmdldCggaW5kZXggKTtcclxuXHJcblx0XHRcdHJlbmRlcmVyLmluZGV4ID0gaW5kZXguY291bnQ7XHJcblx0XHRcdHJlbmRlcmVyLnR5cGUgPSBpbmRleERhdGEudHlwZTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0cmVuZGVyZXIuaW5kZXggPSAwO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBkcmF3ID0gKCkgPT4ge1xyXG5cclxuXHRcdFx0aWYgKCBvYmplY3QuaXNCYXRjaGVkTWVzaCApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBvYmplY3QuX211bHRpRHJhd0luc3RhbmNlcyAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHQvLyBAZGVwcmVjYXRlZCwgcjE3NFxyXG5cdFx0XHRcdFx0d2Fybk9uY2UoICdUSFJFRS5XZWJHTEJhY2tlbmQ6IHJlbmRlck11bHRpRHJhd0luc3RhbmNlcyBoYXMgYmVlbiBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gcjE4NC4gQXBwZW5kIHRvIHJlbmRlck11bHRpRHJhdyBhcmd1bWVudHMgYW5kIHVzZSBpbmRpcmVjdGlvbi4nICk7XHJcblx0XHRcdFx0XHRyZW5kZXJlci5yZW5kZXJNdWx0aURyYXdJbnN0YW5jZXMoIG9iamVjdC5fbXVsdGlEcmF3U3RhcnRzLCBvYmplY3QuX211bHRpRHJhd0NvdW50cywgb2JqZWN0Ll9tdWx0aURyYXdDb3VudCwgb2JqZWN0Ll9tdWx0aURyYXdJbnN0YW5jZXMgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggISB0aGlzLmhhc0ZlYXR1cmUoICdXRUJHTF9tdWx0aV9kcmF3JyApICkge1xyXG5cclxuXHRcdFx0XHRcdHdhcm5PbmNlKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogV0VCR0xfbXVsdGlfZHJhdyBub3Qgc3VwcG9ydGVkLicgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRyZW5kZXJlci5yZW5kZXJNdWx0aURyYXcoIG9iamVjdC5fbXVsdGlEcmF3U3RhcnRzLCBvYmplY3QuX211bHRpRHJhd0NvdW50cywgb2JqZWN0Ll9tdWx0aURyYXdDb3VudCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBpbnN0YW5jZUNvdW50ID4gMSApIHtcclxuXHJcblx0XHRcdFx0cmVuZGVyZXIucmVuZGVySW5zdGFuY2VzKCBmaXJzdFZlcnRleCwgdmVydGV4Q291bnQsIGluc3RhbmNlQ291bnQgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHJlbmRlcmVyLnJlbmRlciggZmlyc3RWZXJ0ZXgsIHZlcnRleENvdW50ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHRpZiAoIHJlbmRlck9iamVjdC5jYW1lcmEuaXNBcnJheUNhbWVyYSAmJiByZW5kZXJPYmplY3QuY2FtZXJhLmNhbWVyYXMubGVuZ3RoID4gMCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGNhbWVyYURhdGEgPSB0aGlzLmdldCggcmVuZGVyT2JqZWN0LmNhbWVyYSApO1xyXG5cdFx0XHRjb25zdCBjYW1lcmFzID0gcmVuZGVyT2JqZWN0LmNhbWVyYS5jYW1lcmFzO1xyXG5cdFx0XHRjb25zdCBjYW1lcmFJbmRleCA9IHJlbmRlck9iamVjdC5nZXRCaW5kaW5nR3JvdXAoICdjYW1lcmFJbmRleCcgKS5iaW5kaW5nc1sgMCBdO1xyXG5cclxuXHRcdFx0aWYgKCBjYW1lcmFEYXRhLmluZGV4ZXNHUFUgPT09IHVuZGVmaW5lZCB8fCBjYW1lcmFEYXRhLmluZGV4ZXNHUFUubGVuZ3RoICE9PSBjYW1lcmFzLmxlbmd0aCApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgZGF0YSA9IG5ldyBVaW50MzJBcnJheSggWyAwLCAwLCAwLCAwIF0gKTtcclxuXHRcdFx0XHRjb25zdCBpbmRleGVzR1BVID0gW107XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMCwgbGVuID0gY2FtZXJhcy5sZW5ndGg7IGkgPCBsZW47IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgYnVmZmVyR1BVID0gZ2wuY3JlYXRlQnVmZmVyKCk7XHJcblxyXG5cdFx0XHRcdFx0ZGF0YVsgMCBdID0gaTtcclxuXHJcblx0XHRcdFx0XHRnbC5iaW5kQnVmZmVyKCBnbC5VTklGT1JNX0JVRkZFUiwgYnVmZmVyR1BVICk7XHJcblx0XHRcdFx0XHRnbC5idWZmZXJEYXRhKCBnbC5VTklGT1JNX0JVRkZFUiwgZGF0YSwgZ2wuU1RBVElDX0RSQVcgKTtcclxuXHJcblx0XHRcdFx0XHRpbmRleGVzR1BVLnB1c2goIGJ1ZmZlckdQVSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGNhbWVyYURhdGEuaW5kZXhlc0dQVSA9IGluZGV4ZXNHUFU7IC8vIFRPRE86IENyZWF0ZSBhIGdsb2JhbCBsaWJyYXJ5IGZvciB0aGlzXHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBjYW1lcmFJbmRleERhdGEgPSB0aGlzLmdldCggY2FtZXJhSW5kZXggKTtcclxuXHRcdFx0Y29uc3QgcGl4ZWxSYXRpbyA9IHRoaXMucmVuZGVyZXIuZ2V0UGl4ZWxSYXRpbygpO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsZW4gPSBjYW1lcmFzLmxlbmd0aDsgaSA8IGxlbjsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3Qgc3ViQ2FtZXJhID0gY2FtZXJhc1sgaSBdO1xyXG5cclxuXHRcdFx0XHRpZiAoIG9iamVjdC5sYXllcnMudGVzdCggc3ViQ2FtZXJhLmxheWVycyApICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHZwID0gc3ViQ2FtZXJhLnZpZXdwb3J0O1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHggPSB2cC54ICogcGl4ZWxSYXRpbztcclxuXHRcdFx0XHRcdGNvbnN0IHkgPSB2cC55ICogcGl4ZWxSYXRpbztcclxuXHRcdFx0XHRcdGNvbnN0IHdpZHRoID0gdnAud2lkdGggKiBwaXhlbFJhdGlvO1xyXG5cdFx0XHRcdFx0Y29uc3QgaGVpZ2h0ID0gdnAuaGVpZ2h0ICogcGl4ZWxSYXRpbztcclxuXHJcblx0XHRcdFx0XHRzdGF0ZS52aWV3cG9ydChcclxuXHRcdFx0XHRcdFx0TWF0aC5mbG9vciggeCApLFxyXG5cdFx0XHRcdFx0XHRNYXRoLmZsb29yKCByZW5kZXJPYmplY3QuY29udGV4dC5oZWlnaHQgLSBoZWlnaHQgLSB5ICksXHJcblx0XHRcdFx0XHRcdE1hdGguZmxvb3IoIHdpZHRoICksXHJcblx0XHRcdFx0XHRcdE1hdGguZmxvb3IoIGhlaWdodCApXHJcblx0XHRcdFx0XHQpO1xyXG5cclxuXHRcdFx0XHRcdHN0YXRlLmJpbmRCdWZmZXJCYXNlKCBnbC5VTklGT1JNX0JVRkZFUiwgY2FtZXJhSW5kZXhEYXRhLmluZGV4LCBjYW1lcmFEYXRhLmluZGV4ZXNHUFVbIGkgXSApO1xyXG5cclxuXHRcdFx0XHRcdGRyYXcoKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRkcmF3KCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEV4cGxhaW4gd2h5IGFsd2F5cyBudWxsIGlzIHJldHVybmVkLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSZW5kZXJPYmplY3R9IHJlbmRlck9iamVjdCAtIFRoZSByZW5kZXIgb2JqZWN0LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHJlbmRlciBwaXBlbGluZSByZXF1aXJlcyBhbiB1cGRhdGUgb3Igbm90LlxyXG5cdCAqL1xyXG5cdG5lZWRzUmVuZGVyVXBkYXRlKCAvKnJlbmRlck9iamVjdCovICkge1xyXG5cclxuXHRcdHJldHVybiBmYWxzZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFeHBsYWluIHdoeSBubyBjYWNoZSBrZXkgaXMgY29tcHV0ZWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JlbmRlck9iamVjdH0gcmVuZGVyT2JqZWN0IC0gVGhlIHJlbmRlciBvYmplY3QuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgY2FjaGUga2V5LlxyXG5cdCAqL1xyXG5cdGdldFJlbmRlckNhY2hlS2V5KCAvKnJlbmRlck9iamVjdCovICkge1xyXG5cclxuXHRcdHJldHVybiAnJztcclxuXHJcblx0fVxyXG5cclxuXHQvLyB0ZXh0dXJlc1xyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGEgZGVmYXVsdCB0ZXh0dXJlIGZvciB0aGUgZ2l2ZW4gdGV4dHVyZSB0aGF0IGNhbiBiZSB1c2VkXHJcblx0ICogYXMgYSBwbGFjZWhvbGRlciB1bnRpbCB0aGUgYWN0dWFsIHRleHR1cmUgaXMgcmVhZHkgZm9yIHVzYWdlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUgdG8gY3JlYXRlIGEgZGVmYXVsdCB0ZXh0dXJlIGZvci5cclxuXHQgKi9cclxuXHRjcmVhdGVEZWZhdWx0VGV4dHVyZSggdGV4dHVyZSApIHtcclxuXHJcblx0XHR0aGlzLnRleHR1cmVVdGlscy5jcmVhdGVEZWZhdWx0VGV4dHVyZSggdGV4dHVyZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgYSB0ZXh0dXJlIG9uIHRoZSBHUFUgZm9yIHRoZSBnaXZlbiB0ZXh0dXJlIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlLlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIHBhcmFtZXRlci5cclxuXHQgKi9cclxuXHRjcmVhdGVUZXh0dXJlKCB0ZXh0dXJlLCBvcHRpb25zICkge1xyXG5cclxuXHRcdHRoaXMudGV4dHVyZVV0aWxzLmNyZWF0ZVRleHR1cmUoIHRleHR1cmUsIG9wdGlvbnMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGxvYWRzIHRoZSB1cGRhdGVkIHRleHR1cmUgZGF0YSB0byB0aGUgR1BVLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZVRleHR1cmUoIHRleHR1cmUsIG9wdGlvbnMgKSB7XHJcblxyXG5cdFx0dGhpcy50ZXh0dXJlVXRpbHMudXBkYXRlVGV4dHVyZSggdGV4dHVyZSwgb3B0aW9ucyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyBtaXBtYXBzIGZvciB0aGUgZ2l2ZW4gdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlLlxyXG5cdCAqL1xyXG5cdGdlbmVyYXRlTWlwbWFwcyggdGV4dHVyZSApIHtcclxuXHJcblx0XHR0aGlzLnRleHR1cmVVdGlscy5nZW5lcmF0ZU1pcG1hcHMoIHRleHR1cmUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZXN0cm95cyB0aGUgR1BVIGRhdGEgZm9yIHRoZSBnaXZlbiB0ZXh0dXJlIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlLlxyXG5cdCAqL1xyXG5cdGRlc3Ryb3lUZXh0dXJlKCB0ZXh0dXJlICkge1xyXG5cclxuXHRcdHRoaXMudGV4dHVyZVV0aWxzLmRlc3Ryb3lUZXh0dXJlKCB0ZXh0dXJlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0ZXh0dXJlIGRhdGEgYXMgYSB0eXBlZCBhcnJheS5cclxuXHQgKlxyXG5cdCAqIEBhc3luY1xyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlIHRvIGNvcHkuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBjb3B5IG9yaWdpbi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGNvcHkgb3JpZ2luLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgY29weS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgY29weS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZmFjZUluZGV4IC0gVGhlIGZhY2UgaW5kZXguXHJcblx0ICogQHJldHVybiB7UHJvbWlzZTxUeXBlZEFycmF5Pn0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCBhIHR5cGVkIGFycmF5IHdoZW4gdGhlIGNvcHkgb3BlcmF0aW9uIGhhcyBmaW5pc2hlZC5cclxuXHQgKi9cclxuXHRhc3luYyBjb3B5VGV4dHVyZVRvQnVmZmVyKCB0ZXh0dXJlLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmYWNlSW5kZXggKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMudGV4dHVyZVV0aWxzLmNvcHlUZXh0dXJlVG9CdWZmZXIoIHRleHR1cmUsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGZhY2VJbmRleCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGRvZXMgbm90aGluZyBzaW5jZSBXZWJHTCAyIGhhcyBubyBjb25jZXB0IG9mIHNhbXBsZXJzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUgdG8gY3JlYXRlIHRoZSBzYW1wbGVyIGZvci5cclxuXHQgKi9cclxuXHRjcmVhdGVTYW1wbGVyKCAvKnRleHR1cmUqLyApIHtcclxuXHJcblx0XHQvL2NvbnNvbGUud2FybiggJ0Fic3RyYWN0IGNsYXNzLicgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcgc2luY2UgV2ViR0wgMiBoYXMgbm8gY29uY2VwdCBvZiBzYW1wbGVycy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlIHRvIGRlc3Ryb3kgdGhlIHNhbXBsZXIgZm9yLlxyXG5cdCAqL1xyXG5cdGRlc3Ryb3lTYW1wbGVyKCAvKnRleHR1cmUqLyApIHt9XHJcblxyXG5cdC8vIG5vZGUgYnVpbGRlclxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbm9kZSBidWlsZGVyIGZvciB0aGUgZ2l2ZW4gcmVuZGVyIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyT2JqZWN0fSBvYmplY3QgLSBUaGUgcmVuZGVyIG9iamVjdC5cclxuXHQgKiBAcGFyYW0ge1JlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcmV0dXJuIHtHTFNMTm9kZUJ1aWxkZXJ9IFRoZSBub2RlIGJ1aWxkZXIuXHJcblx0ICovXHJcblx0Y3JlYXRlTm9kZUJ1aWxkZXIoIG9iamVjdCwgcmVuZGVyZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBHTFNMTm9kZUJ1aWxkZXIoIG9iamVjdCwgcmVuZGVyZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvLyBwcm9ncmFtXHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgYSBzaGFkZXIgcHJvZ3JhbSBmcm9tIHRoZSBnaXZlbiBwcm9ncmFtbWFibGUgc3RhZ2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1Byb2dyYW1tYWJsZVN0YWdlfSBwcm9ncmFtIC0gVGhlIHByb2dyYW1tYWJsZSBzdGFnZS5cclxuXHQgKi9cclxuXHRjcmVhdGVQcm9ncmFtKCBwcm9ncmFtICkge1xyXG5cclxuXHRcdGNvbnN0IGdsID0gdGhpcy5nbDtcclxuXHRcdGNvbnN0IHsgc3RhZ2UsIGNvZGUgfSA9IHByb2dyYW07XHJcblxyXG5cdFx0Y29uc3Qgc2hhZGVyID0gc3RhZ2UgPT09ICdmcmFnbWVudCcgPyBnbC5jcmVhdGVTaGFkZXIoIGdsLkZSQUdNRU5UX1NIQURFUiApIDogZ2wuY3JlYXRlU2hhZGVyKCBnbC5WRVJURVhfU0hBREVSICk7XHJcblxyXG5cdFx0Z2wuc2hhZGVyU291cmNlKCBzaGFkZXIsIGNvZGUgKTtcclxuXHRcdGdsLmNvbXBpbGVTaGFkZXIoIHNoYWRlciApO1xyXG5cclxuXHRcdHRoaXMuc2V0KCBwcm9ncmFtLCB7XHJcblx0XHRcdHNoYWRlckdQVTogc2hhZGVyXHJcblx0XHR9ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVzdHJveXMgdGhlIHNoYWRlciBwcm9ncmFtIG9mIHRoZSBnaXZlbiBwcm9ncmFtbWFibGUgc3RhZ2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1Byb2dyYW1tYWJsZVN0YWdlfSBwcm9ncmFtIC0gVGhlIHByb2dyYW1tYWJsZSBzdGFnZS5cclxuXHQgKi9cclxuXHRkZXN0cm95UHJvZ3JhbSggcHJvZ3JhbSApIHtcclxuXHJcblx0XHR0aGlzLmRlbGV0ZSggcHJvZ3JhbSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgYSByZW5kZXIgcGlwZWxpbmUgZm9yIHRoZSBnaXZlbiByZW5kZXIgb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSZW5kZXJPYmplY3R9IHJlbmRlck9iamVjdCAtIFRoZSByZW5kZXIgb2JqZWN0LlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8UHJvbWlzZT59IHByb21pc2VzIC0gQW4gYXJyYXkgb2YgY29tcGlsYXRpb24gcHJvbWlzZXMgd2hpY2ggYXJlIHVzZWQgaW4gYGNvbXBpbGVBc3luYygpYC5cclxuXHQgKi9cclxuXHRjcmVhdGVSZW5kZXJQaXBlbGluZSggcmVuZGVyT2JqZWN0LCBwcm9taXNlcyApIHtcclxuXHJcblx0XHRjb25zdCBnbCA9IHRoaXMuZ2w7XHJcblx0XHRjb25zdCBwaXBlbGluZSA9IHJlbmRlck9iamVjdC5waXBlbGluZTtcclxuXHJcblx0XHQvLyBQcm9ncmFtXHJcblxyXG5cdFx0Y29uc3QgeyBmcmFnbWVudFByb2dyYW0sIHZlcnRleFByb2dyYW0gfSA9IHBpcGVsaW5lO1xyXG5cclxuXHRcdGNvbnN0IHByb2dyYW1HUFUgPSBnbC5jcmVhdGVQcm9ncmFtKCk7XHJcblxyXG5cdFx0Y29uc3QgZnJhZ21lbnRTaGFkZXIgPSB0aGlzLmdldCggZnJhZ21lbnRQcm9ncmFtICkuc2hhZGVyR1BVO1xyXG5cdFx0Y29uc3QgdmVydGV4U2hhZGVyID0gdGhpcy5nZXQoIHZlcnRleFByb2dyYW0gKS5zaGFkZXJHUFU7XHJcblxyXG5cdFx0Z2wuYXR0YWNoU2hhZGVyKCBwcm9ncmFtR1BVLCBmcmFnbWVudFNoYWRlciApO1xyXG5cdFx0Z2wuYXR0YWNoU2hhZGVyKCBwcm9ncmFtR1BVLCB2ZXJ0ZXhTaGFkZXIgKTtcclxuXHRcdGdsLmxpbmtQcm9ncmFtKCBwcm9ncmFtR1BVICk7XHJcblxyXG5cdFx0dGhpcy5zZXQoIHBpcGVsaW5lLCB7XHJcblx0XHRcdHByb2dyYW1HUFUsXHJcblx0XHRcdGZyYWdtZW50U2hhZGVyLFxyXG5cdFx0XHR2ZXJ0ZXhTaGFkZXJcclxuXHRcdH0gKTtcclxuXHJcblx0XHRpZiAoIHByb21pc2VzICE9PSBudWxsICYmIHRoaXMucGFyYWxsZWwgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBwID0gbmV3IFByb21pc2UoICggcmVzb2x2ZSAvKiwgcmVqZWN0Ki8gKSA9PiB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHBhcmFsbGVsID0gdGhpcy5wYXJhbGxlbDtcclxuXHRcdFx0XHRjb25zdCBjaGVja1N0YXR1cyA9ICgpID0+IHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGdsLmdldFByb2dyYW1QYXJhbWV0ZXIoIHByb2dyYW1HUFUsIHBhcmFsbGVsLkNPTVBMRVRJT05fU1RBVFVTX0tIUiApICkge1xyXG5cclxuXHRcdFx0XHRcdFx0dGhpcy5fY29tcGxldGVDb21waWxlKCByZW5kZXJPYmplY3QsIHBpcGVsaW5lICk7XHJcblx0XHRcdFx0XHRcdHJlc29sdmUoKTtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCBjaGVja1N0YXR1cyApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0Y2hlY2tTdGF0dXMoKTtcclxuXHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHRcdHByb21pc2VzLnB1c2goIHAgKTtcclxuXHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5fY29tcGxldGVDb21waWxlKCByZW5kZXJPYmplY3QsIHBpcGVsaW5lICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRm9ybWF0cyB0aGUgc291cmNlIGNvZGUgb2YgZXJyb3IgbWVzc2FnZXMuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgLSBUaGUgY29kZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZXJyb3JMaW5lIC0gVGhlIGVycm9yIGxpbmUuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgZm9ybWF0dGVkIGNvZGUuXHJcblx0ICovXHJcblx0X2hhbmRsZVNvdXJjZSggc3RyaW5nLCBlcnJvckxpbmUgKSB7XHJcblxyXG5cdFx0Y29uc3QgbGluZXMgPSBzdHJpbmcuc3BsaXQoICdcXG4nICk7XHJcblx0XHRjb25zdCBsaW5lczIgPSBbXTtcclxuXHJcblx0XHRjb25zdCBmcm9tID0gTWF0aC5tYXgoIGVycm9yTGluZSAtIDYsIDAgKTtcclxuXHRcdGNvbnN0IHRvID0gTWF0aC5taW4oIGVycm9yTGluZSArIDYsIGxpbmVzLmxlbmd0aCApO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gZnJvbTsgaSA8IHRvOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgbGluZSA9IGkgKyAxO1xyXG5cdFx0XHRsaW5lczIucHVzaCggYCR7bGluZSA9PT0gZXJyb3JMaW5lID8gJz4nIDogJyAnfSAke2xpbmV9OiAke2xpbmVzWyBpIF19YCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbGluZXMyLmpvaW4oICdcXG4nICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2V0cyB0aGUgc2hhZGVyIGNvbXBpbGF0aW9uIGVycm9ycyBmcm9tIHRoZSBpbmZvIGxvZy5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtXZWJHTDJSZW5kZXJpbmdDb250ZXh0fSBnbCAtIFRoZSByZW5kZXJpbmcgY29udGV4dC5cclxuXHQgKiBAcGFyYW0ge1dlYkdMU2hhZGVyfSBzaGFkZXIgLSBUaGUgV2ViR0wgc2hhZGVyIG9iamVjdC5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSBzaGFkZXIgdHlwZS5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBzaGFkZXIgZXJyb3JzLlxyXG5cdCAqL1xyXG5cdF9nZXRTaGFkZXJFcnJvcnMoIGdsLCBzaGFkZXIsIHR5cGUgKSB7XHJcblxyXG5cdFx0Y29uc3Qgc3RhdHVzID0gZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKCBzaGFkZXIsIGdsLkNPTVBJTEVfU1RBVFVTICk7XHJcblx0XHRjb25zdCBlcnJvcnMgPSBnbC5nZXRTaGFkZXJJbmZvTG9nKCBzaGFkZXIgKS50cmltKCk7XHJcblxyXG5cdFx0aWYgKCBzdGF0dXMgJiYgZXJyb3JzID09PSAnJyApIHJldHVybiAnJztcclxuXHJcblx0XHRjb25zdCBlcnJvck1hdGNoZXMgPSAvRVJST1I6IDA6KFxcZCspLy5leGVjKCBlcnJvcnMgKTtcclxuXHRcdGlmICggZXJyb3JNYXRjaGVzICkge1xyXG5cclxuXHRcdFx0Y29uc3QgZXJyb3JMaW5lID0gcGFyc2VJbnQoIGVycm9yTWF0Y2hlc1sgMSBdICk7XHJcblx0XHRcdHJldHVybiB0eXBlLnRvVXBwZXJDYXNlKCkgKyAnXFxuXFxuJyArIGVycm9ycyArICdcXG5cXG4nICsgdGhpcy5faGFuZGxlU291cmNlKCBnbC5nZXRTaGFkZXJTb3VyY2UoIHNoYWRlciApLCBlcnJvckxpbmUgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0cmV0dXJuIGVycm9ycztcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTG9ncyBzaGFkZXIgY29tcGlsYXRpb24gZXJyb3JzLlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge1dlYkdMUHJvZ3JhbX0gcHJvZ3JhbUdQVSAtIFRoZSBXZWJHTCBwcm9ncmFtLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xTaGFkZXJ9IGdsRnJhZ21lbnRTaGFkZXIgLSBUaGUgZnJhZ21lbnQgc2hhZGVyIGFzIGEgbmF0aXZlIFdlYkdMIHNoYWRlciBvYmplY3QuXHJcblx0ICogQHBhcmFtIHtXZWJHTFNoYWRlcn0gZ2xWZXJ0ZXhTaGFkZXIgLSBUaGUgdmVydGV4IHNoYWRlciBhcyBhIG5hdGl2ZSBXZWJHTCBzaGFkZXIgb2JqZWN0LlxyXG5cdCAqL1xyXG5cdF9sb2dQcm9ncmFtRXJyb3IoIHByb2dyYW1HUFUsIGdsRnJhZ21lbnRTaGFkZXIsIGdsVmVydGV4U2hhZGVyICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5yZW5kZXJlci5kZWJ1Zy5jaGVja1NoYWRlckVycm9ycyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGdsID0gdGhpcy5nbDtcclxuXHJcblx0XHRcdGNvbnN0IHByb2dyYW1Mb2cgPSBnbC5nZXRQcm9ncmFtSW5mb0xvZyggcHJvZ3JhbUdQVSApLnRyaW0oKTtcclxuXHJcblx0XHRcdGlmICggZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlciggcHJvZ3JhbUdQVSwgZ2wuTElOS19TVEFUVVMgKSA9PT0gZmFsc2UgKSB7XHJcblxyXG5cclxuXHRcdFx0XHRpZiAoIHR5cGVvZiB0aGlzLnJlbmRlcmVyLmRlYnVnLm9uU2hhZGVyRXJyb3IgPT09ICdmdW5jdGlvbicgKSB7XHJcblxyXG5cdFx0XHRcdFx0dGhpcy5yZW5kZXJlci5kZWJ1Zy5vblNoYWRlckVycm9yKCBnbCwgcHJvZ3JhbUdQVSwgZ2xWZXJ0ZXhTaGFkZXIsIGdsRnJhZ21lbnRTaGFkZXIgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHQvLyBkZWZhdWx0IGVycm9yIHJlcG9ydGluZ1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHZlcnRleEVycm9ycyA9IHRoaXMuX2dldFNoYWRlckVycm9ycyggZ2wsIGdsVmVydGV4U2hhZGVyLCAndmVydGV4JyApO1xyXG5cdFx0XHRcdFx0Y29uc3QgZnJhZ21lbnRFcnJvcnMgPSB0aGlzLl9nZXRTaGFkZXJFcnJvcnMoIGdsLCBnbEZyYWdtZW50U2hhZGVyLCAnZnJhZ21lbnQnICk7XHJcblxyXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvcihcclxuXHRcdFx0XHRcdFx0J1RIUkVFLldlYkdMUHJvZ3JhbTogU2hhZGVyIEVycm9yICcgKyBnbC5nZXRFcnJvcigpICsgJyAtICcgK1xyXG5cdFx0XHRcdFx0XHQnVkFMSURBVEVfU1RBVFVTICcgKyBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKCBwcm9ncmFtR1BVLCBnbC5WQUxJREFURV9TVEFUVVMgKSArICdcXG5cXG4nICtcclxuXHRcdFx0XHRcdFx0J1Byb2dyYW0gSW5mbyBMb2c6ICcgKyBwcm9ncmFtTG9nICsgJ1xcbicgK1xyXG5cdFx0XHRcdFx0XHR2ZXJ0ZXhFcnJvcnMgKyAnXFxuJyArXHJcblx0XHRcdFx0XHRcdGZyYWdtZW50RXJyb3JzXHJcblx0XHRcdFx0XHQpO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBwcm9ncmFtTG9nICE9PSAnJyApIHtcclxuXHJcblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xQcm9ncmFtOiBQcm9ncmFtIEluZm8gTG9nOicsIHByb2dyYW1Mb2cgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcGxldGVzIHRoZSBzaGFkZXIgcHJvZ3JhbSBzZXR1cCBmb3IgdGhlIGdpdmVuIHJlbmRlciBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyT2JqZWN0fSByZW5kZXJPYmplY3QgLSBUaGUgcmVuZGVyIG9iamVjdC5cclxuXHQgKiBAcGFyYW0ge1JlbmRlclBpcGVsaW5lfSBwaXBlbGluZSAtIFRoZSByZW5kZXIgcGlwZWxpbmUuXHJcblx0ICovXHJcblx0X2NvbXBsZXRlQ29tcGlsZSggcmVuZGVyT2JqZWN0LCBwaXBlbGluZSApIHtcclxuXHJcblx0XHRjb25zdCB7IHN0YXRlLCBnbCB9ID0gdGhpcztcclxuXHRcdGNvbnN0IHBpcGVsaW5lRGF0YSA9IHRoaXMuZ2V0KCBwaXBlbGluZSApO1xyXG5cdFx0Y29uc3QgeyBwcm9ncmFtR1BVLCBmcmFnbWVudFNoYWRlciwgdmVydGV4U2hhZGVyIH0gPSBwaXBlbGluZURhdGE7XHJcblxyXG5cdFx0aWYgKCBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKCBwcm9ncmFtR1BVLCBnbC5MSU5LX1NUQVRVUyApID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdHRoaXMuX2xvZ1Byb2dyYW1FcnJvciggcHJvZ3JhbUdQVSwgZnJhZ21lbnRTaGFkZXIsIHZlcnRleFNoYWRlciApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRzdGF0ZS51c2VQcm9ncmFtKCBwcm9ncmFtR1BVICk7XHJcblxyXG5cdFx0Ly8gQmluZGluZ3NcclxuXHJcblx0XHRjb25zdCBiaW5kaW5ncyA9IHJlbmRlck9iamVjdC5nZXRCaW5kaW5ncygpO1xyXG5cclxuXHRcdHRoaXMuX3NldHVwQmluZGluZ3MoIGJpbmRpbmdzLCBwcm9ncmFtR1BVICk7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHR0aGlzLnNldCggcGlwZWxpbmUsIHtcclxuXHRcdFx0cHJvZ3JhbUdQVVxyXG5cdFx0fSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgYSBjb21wdXRlIHBpcGVsaW5lIGZvciB0aGUgZ2l2ZW4gY29tcHV0ZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtDb21wdXRlUGlwZWxpbmV9IGNvbXB1dGVQaXBlbGluZSAtIFRoZSBjb21wdXRlIHBpcGVsaW5lLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8QmluZEdyb3VwPn0gYmluZGluZ3MgLSBUaGUgYmluZGluZ3MuXHJcblx0ICovXHJcblx0Y3JlYXRlQ29tcHV0ZVBpcGVsaW5lKCBjb21wdXRlUGlwZWxpbmUsIGJpbmRpbmdzICkge1xyXG5cclxuXHRcdGNvbnN0IHsgc3RhdGUsIGdsIH0gPSB0aGlzO1xyXG5cclxuXHRcdC8vIFByb2dyYW1cclxuXHJcblx0XHRjb25zdCBmcmFnbWVudFByb2dyYW0gPSB7XHJcblx0XHRcdHN0YWdlOiAnZnJhZ21lbnQnLFxyXG5cdFx0XHRjb2RlOiAnI3ZlcnNpb24gMzAwIGVzXFxucHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xcbnZvaWQgbWFpbigpIHt9J1xyXG5cdFx0fTtcclxuXHJcblx0XHR0aGlzLmNyZWF0ZVByb2dyYW0oIGZyYWdtZW50UHJvZ3JhbSApO1xyXG5cclxuXHRcdGNvbnN0IHsgY29tcHV0ZVByb2dyYW0gfSA9IGNvbXB1dGVQaXBlbGluZTtcclxuXHJcblx0XHRjb25zdCBwcm9ncmFtR1BVID0gZ2wuY3JlYXRlUHJvZ3JhbSgpO1xyXG5cclxuXHRcdGNvbnN0IGZyYWdtZW50U2hhZGVyID0gdGhpcy5nZXQoIGZyYWdtZW50UHJvZ3JhbSApLnNoYWRlckdQVTtcclxuXHRcdGNvbnN0IHZlcnRleFNoYWRlciA9IHRoaXMuZ2V0KCBjb21wdXRlUHJvZ3JhbSApLnNoYWRlckdQVTtcclxuXHJcblx0XHRjb25zdCB0cmFuc2Zvcm1zID0gY29tcHV0ZVByb2dyYW0udHJhbnNmb3JtcztcclxuXHJcblx0XHRjb25zdCB0cmFuc2Zvcm1WYXJ5aW5nTmFtZXMgPSBbXTtcclxuXHRcdGNvbnN0IHRyYW5zZm9ybUF0dHJpYnV0ZU5vZGVzID0gW107XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdHJhbnNmb3Jtcy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB0cmFuc2Zvcm0gPSB0cmFuc2Zvcm1zWyBpIF07XHJcblxyXG5cdFx0XHR0cmFuc2Zvcm1WYXJ5aW5nTmFtZXMucHVzaCggdHJhbnNmb3JtLnZhcnlpbmdOYW1lICk7XHJcblx0XHRcdHRyYW5zZm9ybUF0dHJpYnV0ZU5vZGVzLnB1c2goIHRyYW5zZm9ybS5hdHRyaWJ1dGVOb2RlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGdsLmF0dGFjaFNoYWRlciggcHJvZ3JhbUdQVSwgZnJhZ21lbnRTaGFkZXIgKTtcclxuXHRcdGdsLmF0dGFjaFNoYWRlciggcHJvZ3JhbUdQVSwgdmVydGV4U2hhZGVyICk7XHJcblxyXG5cdFx0Z2wudHJhbnNmb3JtRmVlZGJhY2tWYXJ5aW5ncyhcclxuXHRcdFx0cHJvZ3JhbUdQVSxcclxuXHRcdFx0dHJhbnNmb3JtVmFyeWluZ05hbWVzLFxyXG5cdFx0XHRnbC5TRVBBUkFURV9BVFRSSUJTXHJcblx0XHQpO1xyXG5cclxuXHRcdGdsLmxpbmtQcm9ncmFtKCBwcm9ncmFtR1BVICk7XHJcblxyXG5cdFx0aWYgKCBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKCBwcm9ncmFtR1BVLCBnbC5MSU5LX1NUQVRVUyApID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdHRoaXMuX2xvZ1Byb2dyYW1FcnJvciggcHJvZ3JhbUdQVSwgZnJhZ21lbnRTaGFkZXIsIHZlcnRleFNoYWRlciApO1xyXG5cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0c3RhdGUudXNlUHJvZ3JhbSggcHJvZ3JhbUdQVSApO1xyXG5cclxuXHRcdC8vIEJpbmRpbmdzXHJcblxyXG5cdFx0dGhpcy5fc2V0dXBCaW5kaW5ncyggYmluZGluZ3MsIHByb2dyYW1HUFUgKTtcclxuXHJcblx0XHRjb25zdCBhdHRyaWJ1dGVOb2RlcyA9IGNvbXB1dGVQcm9ncmFtLmF0dHJpYnV0ZXM7XHJcblx0XHRjb25zdCBhdHRyaWJ1dGVzID0gW107XHJcblx0XHRjb25zdCB0cmFuc2Zvcm1CdWZmZXJzID0gW107XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgYXR0cmlidXRlTm9kZXMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYXR0cmlidXRlID0gYXR0cmlidXRlTm9kZXNbIGkgXS5ub2RlLmF0dHJpYnV0ZTtcclxuXHJcblx0XHRcdGF0dHJpYnV0ZXMucHVzaCggYXR0cmlidXRlICk7XHJcblxyXG5cdFx0XHRpZiAoICEgdGhpcy5oYXMoIGF0dHJpYnV0ZSApICkgdGhpcy5hdHRyaWJ1dGVVdGlscy5jcmVhdGVBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgZ2wuQVJSQVlfQlVGRkVSICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHRyYW5zZm9ybUF0dHJpYnV0ZU5vZGVzLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGF0dHJpYnV0ZSA9IHRyYW5zZm9ybUF0dHJpYnV0ZU5vZGVzWyBpIF0uYXR0cmlidXRlO1xyXG5cclxuXHRcdFx0aWYgKCAhIHRoaXMuaGFzKCBhdHRyaWJ1dGUgKSApIHRoaXMuYXR0cmlidXRlVXRpbHMuY3JlYXRlQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGdsLkFSUkFZX0JVRkZFUiApO1xyXG5cclxuXHRcdFx0Y29uc3QgYXR0cmlidXRlRGF0YSA9IHRoaXMuZ2V0KCBhdHRyaWJ1dGUgKTtcclxuXHJcblx0XHRcdHRyYW5zZm9ybUJ1ZmZlcnMucHVzaCggYXR0cmlidXRlRGF0YSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdHRoaXMuc2V0KCBjb21wdXRlUGlwZWxpbmUsIHtcclxuXHRcdFx0cHJvZ3JhbUdQVSxcclxuXHRcdFx0dHJhbnNmb3JtQnVmZmVycyxcclxuXHRcdFx0YXR0cmlidXRlc1xyXG5cdFx0fSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgYmluZGluZ3MgZnJvbSB0aGUgZ2l2ZW4gYmluZCBncm91cCBkZWZpbml0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCaW5kR3JvdXB9IGJpbmRHcm91cCAtIFRoZSBiaW5kIGdyb3VwLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8QmluZEdyb3VwPn0gYmluZGluZ3MgLSBBcnJheSBvZiBiaW5kIGdyb3Vwcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gY2FjaGVJbmRleCAtIFRoZSBjYWNoZSBpbmRleC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdmVyc2lvbiAtIFRoZSB2ZXJzaW9uLlxyXG5cdCAqL1xyXG5cdGNyZWF0ZUJpbmRpbmdzKCBiaW5kR3JvdXAsIGJpbmRpbmdzIC8qLCBjYWNoZUluZGV4LCB2ZXJzaW9uKi8gKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9rbm93bkJpbmRpbmdzLmhhcyggYmluZGluZ3MgKSA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHR0aGlzLl9rbm93bkJpbmRpbmdzLmFkZCggYmluZGluZ3MgKTtcclxuXHJcblx0XHRcdGxldCB1bmlmb3JtQnVmZmVycyA9IDA7XHJcblx0XHRcdGxldCB0ZXh0dXJlcyA9IDA7XHJcblxyXG5cdFx0XHRmb3IgKCBjb25zdCBiaW5kR3JvdXAgb2YgYmluZGluZ3MgKSB7XHJcblxyXG5cdFx0XHRcdHRoaXMuc2V0KCBiaW5kR3JvdXAsIHtcclxuXHRcdFx0XHRcdHRleHR1cmVzOiB0ZXh0dXJlcyxcclxuXHRcdFx0XHRcdHVuaWZvcm1CdWZmZXJzOiB1bmlmb3JtQnVmZmVyc1xyXG5cdFx0XHRcdH0gKTtcclxuXHJcblx0XHRcdFx0Zm9yICggY29uc3QgYmluZGluZyBvZiBiaW5kR3JvdXAuYmluZGluZ3MgKSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBiaW5kaW5nLmlzVW5pZm9ybUJ1ZmZlciApIHVuaWZvcm1CdWZmZXJzICsrO1xyXG5cdFx0XHRcdFx0aWYgKCBiaW5kaW5nLmlzU2FtcGxlZFRleHR1cmUgKSB0ZXh0dXJlcyArKztcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnVwZGF0ZUJpbmRpbmdzKCBiaW5kR3JvdXAsIGJpbmRpbmdzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgZ2l2ZW4gYmluZCBncm91cCBkZWZpbml0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCaW5kR3JvdXB9IGJpbmRHcm91cCAtIFRoZSBiaW5kIGdyb3VwLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8QmluZEdyb3VwPn0gYmluZGluZ3MgLSBBcnJheSBvZiBiaW5kIGdyb3Vwcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gY2FjaGVJbmRleCAtIFRoZSBjYWNoZSBpbmRleC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdmVyc2lvbiAtIFRoZSB2ZXJzaW9uLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZUJpbmRpbmdzKCBiaW5kR3JvdXAgLyosIGJpbmRpbmdzLCBjYWNoZUluZGV4LCB2ZXJzaW9uKi8gKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBnbCB9ID0gdGhpcztcclxuXHJcblx0XHRjb25zdCBiaW5kR3JvdXBEYXRhID0gdGhpcy5nZXQoIGJpbmRHcm91cCApO1xyXG5cclxuXHRcdGxldCBpID0gYmluZEdyb3VwRGF0YS51bmlmb3JtQnVmZmVycztcclxuXHRcdGxldCB0ID0gYmluZEdyb3VwRGF0YS50ZXh0dXJlcztcclxuXHJcblx0XHRmb3IgKCBjb25zdCBiaW5kaW5nIG9mIGJpbmRHcm91cC5iaW5kaW5ncyApIHtcclxuXHJcblx0XHRcdGlmICggYmluZGluZy5pc1VuaWZvcm1zR3JvdXAgfHwgYmluZGluZy5pc1VuaWZvcm1CdWZmZXIgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGRhdGEgPSBiaW5kaW5nLmJ1ZmZlcjtcclxuXHRcdFx0XHRjb25zdCBidWZmZXJHUFUgPSBnbC5jcmVhdGVCdWZmZXIoKTtcclxuXHJcblx0XHRcdFx0Z2wuYmluZEJ1ZmZlciggZ2wuVU5JRk9STV9CVUZGRVIsIGJ1ZmZlckdQVSApO1xyXG5cdFx0XHRcdGdsLmJ1ZmZlckRhdGEoIGdsLlVOSUZPUk1fQlVGRkVSLCBkYXRhLCBnbC5EWU5BTUlDX0RSQVcgKTtcclxuXHJcblx0XHRcdFx0dGhpcy5zZXQoIGJpbmRpbmcsIHtcclxuXHRcdFx0XHRcdGluZGV4OiBpICsrLFxyXG5cdFx0XHRcdFx0YnVmZmVyR1BVXHJcblx0XHRcdFx0fSApO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggYmluZGluZy5pc1NhbXBsZWRUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB7IHRleHR1cmVHUFUsIGdsVGV4dHVyZVR5cGUgfSA9IHRoaXMuZ2V0KCBiaW5kaW5nLnRleHR1cmUgKTtcclxuXHJcblx0XHRcdFx0dGhpcy5zZXQoIGJpbmRpbmcsIHtcclxuXHRcdFx0XHRcdGluZGV4OiB0ICsrLFxyXG5cdFx0XHRcdFx0dGV4dHVyZUdQVSxcclxuXHRcdFx0XHRcdGdsVGV4dHVyZVR5cGVcclxuXHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgYSBidWZmZXIgYmluZGluZy5cclxuXHQgKlxyXG5cdCAqICBAcGFyYW0ge0J1ZmZlcn0gYmluZGluZyAtIFRoZSBidWZmZXIgYmluZGluZyB0byB1cGRhdGUuXHJcblx0ICovXHJcblx0dXBkYXRlQmluZGluZyggYmluZGluZyApIHtcclxuXHJcblx0XHRjb25zdCBnbCA9IHRoaXMuZ2w7XHJcblxyXG5cdFx0aWYgKCBiaW5kaW5nLmlzVW5pZm9ybXNHcm91cCB8fCBiaW5kaW5nLmlzVW5pZm9ybUJ1ZmZlciApIHtcclxuXHJcblx0XHRcdGNvbnN0IGJpbmRpbmdEYXRhID0gdGhpcy5nZXQoIGJpbmRpbmcgKTtcclxuXHRcdFx0Y29uc3QgYnVmZmVyR1BVID0gYmluZGluZ0RhdGEuYnVmZmVyR1BVO1xyXG5cdFx0XHRjb25zdCBkYXRhID0gYmluZGluZy5idWZmZXI7XHJcblxyXG5cdFx0XHRnbC5iaW5kQnVmZmVyKCBnbC5VTklGT1JNX0JVRkZFUiwgYnVmZmVyR1BVICk7XHJcblx0XHRcdGdsLmJ1ZmZlckRhdGEoIGdsLlVOSUZPUk1fQlVGRkVSLCBkYXRhLCBnbC5EWU5BTUlDX0RSQVcgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gYXR0cmlidXRlc1xyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIHRoZSBHUFUgYnVmZmVyIG9mIGFuIGluZGV4ZWQgc2hhZGVyIGF0dHJpYnV0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyQXR0cmlidXRlfSBhdHRyaWJ1dGUgLSBUaGUgaW5kZXhlZCBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqL1xyXG5cdGNyZWF0ZUluZGV4QXR0cmlidXRlKCBhdHRyaWJ1dGUgKSB7XHJcblxyXG5cdFx0Y29uc3QgZ2wgPSB0aGlzLmdsO1xyXG5cclxuXHRcdHRoaXMuYXR0cmlidXRlVXRpbHMuY3JlYXRlQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyB0aGUgR1BVIGJ1ZmZlciBvZiBhIHNoYWRlciBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0J1ZmZlckF0dHJpYnV0ZX0gYXR0cmlidXRlIC0gVGhlIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICovXHJcblx0Y3JlYXRlQXR0cmlidXRlKCBhdHRyaWJ1dGUgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmhhcyggYXR0cmlidXRlICkgKSByZXR1cm47XHJcblxyXG5cdFx0Y29uc3QgZ2wgPSB0aGlzLmdsO1xyXG5cclxuXHRcdHRoaXMuYXR0cmlidXRlVXRpbHMuY3JlYXRlQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGdsLkFSUkFZX0JVRkZFUiApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgdGhlIEdQVSBidWZmZXIgb2YgYSBzdG9yYWdlIGF0dHJpYnV0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyQXR0cmlidXRlfSBhdHRyaWJ1dGUgLSBUaGUgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKi9cclxuXHRjcmVhdGVTdG9yYWdlQXR0cmlidXRlKCBhdHRyaWJ1dGUgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmhhcyggYXR0cmlidXRlICkgKSByZXR1cm47XHJcblxyXG5cdFx0Y29uc3QgZ2wgPSB0aGlzLmdsO1xyXG5cclxuXHRcdHRoaXMuYXR0cmlidXRlVXRpbHMuY3JlYXRlQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGdsLkFSUkFZX0JVRkZFUiApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIEdQVSBidWZmZXIgb2YgYSBzaGFkZXIgYXR0cmlidXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCdWZmZXJBdHRyaWJ1dGV9IGF0dHJpYnV0ZSAtIFRoZSBidWZmZXIgYXR0cmlidXRlIHRvIHVwZGF0ZS5cclxuXHQgKi9cclxuXHR1cGRhdGVBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApIHtcclxuXHJcblx0XHR0aGlzLmF0dHJpYnV0ZVV0aWxzLnVwZGF0ZUF0dHJpYnV0ZSggYXR0cmlidXRlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVzdHJveXMgdGhlIEdQVSBidWZmZXIgb2YgYSBzaGFkZXIgYXR0cmlidXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCdWZmZXJBdHRyaWJ1dGV9IGF0dHJpYnV0ZSAtIFRoZSBidWZmZXIgYXR0cmlidXRlIHRvIGRlc3Ryb3kuXHJcblx0ICovXHJcblx0ZGVzdHJveUF0dHJpYnV0ZSggYXR0cmlidXRlICkge1xyXG5cclxuXHRcdHRoaXMuYXR0cmlidXRlVXRpbHMuZGVzdHJveUF0dHJpYnV0ZSggYXR0cmlidXRlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBmZWF0dXJlIGlzIHN1cHBvcnRlZCAgYnkgdGhlIGJhY2tlbmQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBmZWF0dXJlJ3MgbmFtZS5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBvciBub3QuXHJcblx0ICovXHJcblx0aGFzRmVhdHVyZSggbmFtZSApIHtcclxuXHJcblx0XHRjb25zdCBrZXlzTWF0Y2hpbmcgPSBPYmplY3Qua2V5cyggR0xGZWF0dXJlTmFtZSApLmZpbHRlcigga2V5ID0+IEdMRmVhdHVyZU5hbWVbIGtleSBdID09PSBuYW1lICk7XHJcblxyXG5cdFx0Y29uc3QgZXh0ZW5zaW9ucyA9IHRoaXMuZXh0ZW5zaW9ucztcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBrZXlzTWF0Y2hpbmcubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0aWYgKCBleHRlbnNpb25zLmhhcygga2V5c01hdGNoaW5nWyBpIF0gKSApIHJldHVybiB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZmFsc2U7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgbWF4aW11bSBhbmlzb3Ryb3B5IHRleHR1cmUgZmlsdGVyaW5nIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgbWF4aW11bSBhbmlzb3Ryb3B5IHRleHR1cmUgZmlsdGVyaW5nIHZhbHVlLlxyXG5cdCAqL1xyXG5cdGdldE1heEFuaXNvdHJvcHkoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuY2FwYWJpbGl0aWVzLmdldE1heEFuaXNvdHJvcHkoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb3BpZXMgZGF0YSBvZiB0aGUgZ2l2ZW4gc291cmNlIHRleHR1cmUgdG8gdGhlIGdpdmVuIGRlc3RpbmF0aW9uIHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHNyY1RleHR1cmUgLSBUaGUgc291cmNlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSBkc3RUZXh0dXJlIC0gVGhlIGRlc3RpbmF0aW9uIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHs/KEJveDN8Qm94Mil9IFtzcmNSZWdpb249bnVsbF0gLSBUaGUgcmVnaW9uIG9mIHRoZSBzb3VyY2UgdGV4dHVyZSB0byBjb3B5LlxyXG5cdCAqIEBwYXJhbSB7PyhWZWN0b3IyfFZlY3RvcjMpfSBbZHN0UG9zaXRpb249bnVsbF0gLSBUaGUgZGVzdGluYXRpb24gcG9zaXRpb24gb2YgdGhlIGNvcHkuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtzcmNMZXZlbD0wXSAtIFRoZSBzb3VyY2UgbWlwIGxldmVsIHRvIGNvcHkgZnJvbS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2RzdExldmVsPTBdIC0gVGhlIGRlc3RpbmF0aW9uIG1pcCBsZXZlbCB0byBjb3B5IHRvLlxyXG5cdCAqL1xyXG5cdGNvcHlUZXh0dXJlVG9UZXh0dXJlKCBzcmNUZXh0dXJlLCBkc3RUZXh0dXJlLCBzcmNSZWdpb24gPSBudWxsLCBkc3RQb3NpdGlvbiA9IG51bGwsIHNyY0xldmVsID0gMCwgZHN0TGV2ZWwgPSAwICkge1xyXG5cclxuXHRcdHRoaXMudGV4dHVyZVV0aWxzLmNvcHlUZXh0dXJlVG9UZXh0dXJlKCBzcmNUZXh0dXJlLCBkc3RUZXh0dXJlLCBzcmNSZWdpb24sIGRzdFBvc2l0aW9uLCBzcmNMZXZlbCwgZHN0TGV2ZWwgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb3BpZXMgdGhlIGN1cnJlbnQgYm91bmQgZnJhbWVidWZmZXIgdG8gdGhlIGdpdmVuIHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgZGVzdGluYXRpb24gdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge1JlbmRlckNvbnRleHR9IHJlbmRlckNvbnRleHQgLSBUaGUgcmVuZGVyIGNvbnRleHQuXHJcblx0ICogQHBhcmFtIHtWZWN0b3I0fSByZWN0YW5nbGUgLSBBIGZvdXIgZGltZW5zaW9uYWwgdmVjdG9yIGRlZmluaW5nIHRoZSBvcmlnaW4gYW5kIGRpbWVuc2lvbiBvZiB0aGUgY29weS5cclxuXHQgKi9cclxuXHRjb3B5RnJhbWVidWZmZXJUb1RleHR1cmUoIHRleHR1cmUsIHJlbmRlckNvbnRleHQsIHJlY3RhbmdsZSApIHtcclxuXHJcblx0XHR0aGlzLnRleHR1cmVVdGlscy5jb3B5RnJhbWVidWZmZXJUb1RleHR1cmUoIHRleHR1cmUsIHJlbmRlckNvbnRleHQsIHJlY3RhbmdsZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbmZpZ3VyZXMgdGhlIGFjdGl2ZSBmcmFtZWJ1ZmZlciBmcm9tIHRoZSBnaXZlbiByZW5kZXIgY29udGV4dC5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtSZW5kZXJDb250ZXh0fSBkZXNjcmlwdG9yIC0gVGhlIHJlbmRlciBjb250ZXh0LlxyXG5cdCAqL1xyXG5cdF9zZXRGcmFtZWJ1ZmZlciggZGVzY3JpcHRvciApIHtcclxuXHJcblx0XHRjb25zdCB7IGdsLCBzdGF0ZSB9ID0gdGhpcztcclxuXHJcblx0XHRsZXQgY3VycmVudEZyYW1lQnVmZmVyID0gbnVsbDtcclxuXHJcblx0XHRpZiAoIGRlc2NyaXB0b3IudGV4dHVyZXMgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRjb25zdCByZW5kZXJUYXJnZXQgPSBkZXNjcmlwdG9yLnJlbmRlclRhcmdldDtcclxuXHRcdFx0Y29uc3QgcmVuZGVyVGFyZ2V0Q29udGV4dERhdGEgPSB0aGlzLmdldCggcmVuZGVyVGFyZ2V0ICk7XHJcblx0XHRcdGNvbnN0IHsgc2FtcGxlcywgZGVwdGhCdWZmZXIsIHN0ZW5jaWxCdWZmZXIgfSA9IHJlbmRlclRhcmdldDtcclxuXHJcblx0XHRcdGNvbnN0IGlzQ3ViZSA9IHJlbmRlclRhcmdldC5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldCA9PT0gdHJ1ZTtcclxuXHRcdFx0Y29uc3QgaXNSZW5kZXJUYXJnZXQzRCA9IHJlbmRlclRhcmdldC5pc1JlbmRlclRhcmdldDNEID09PSB0cnVlO1xyXG5cdFx0XHRjb25zdCBpc1JlbmRlclRhcmdldEFycmF5ID0gcmVuZGVyVGFyZ2V0LmlzUmVuZGVyVGFyZ2V0QXJyYXkgPT09IHRydWU7XHJcblx0XHRcdGNvbnN0IGlzWFJSZW5kZXJUYXJnZXQgPSByZW5kZXJUYXJnZXQuaXNYUlJlbmRlclRhcmdldCA9PT0gdHJ1ZTtcclxuXHRcdFx0Y29uc3QgaGFzRXh0ZXJuYWxUZXh0dXJlcyA9ICggaXNYUlJlbmRlclRhcmdldCA9PT0gdHJ1ZSAmJiByZW5kZXJUYXJnZXQuaGFzRXh0ZXJuYWxUZXh0dXJlcyA9PT0gdHJ1ZSApO1xyXG5cclxuXHRcdFx0bGV0IG1zYWFGYiA9IHJlbmRlclRhcmdldENvbnRleHREYXRhLm1zYWFGcmFtZUJ1ZmZlcjtcclxuXHRcdFx0bGV0IGRlcHRoUmVuZGVyYnVmZmVyID0gcmVuZGVyVGFyZ2V0Q29udGV4dERhdGEuZGVwdGhSZW5kZXJidWZmZXI7XHJcblx0XHRcdGNvbnN0IG11bHRpc2FtcGxlZFJUVEV4dCA9IHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9tdWx0aXNhbXBsZWRfcmVuZGVyX3RvX3RleHR1cmUnICk7XHJcblx0XHRcdGNvbnN0IHVzZU11bHRpc2FtcGxlZFJUVCA9IHRoaXMuX3VzZU11bHRpc2FtcGxlZFJUVCggcmVuZGVyVGFyZ2V0ICk7XHJcblxyXG5cdFx0XHRjb25zdCBjYWNoZUtleSA9IGdldENhY2hlS2V5KCBkZXNjcmlwdG9yICk7XHJcblxyXG5cdFx0XHRsZXQgZmI7XHJcblxyXG5cdFx0XHRpZiAoIGlzQ3ViZSApIHtcclxuXHJcblx0XHRcdFx0cmVuZGVyVGFyZ2V0Q29udGV4dERhdGEuY3ViZUZyYW1lYnVmZmVycyB8fCAoIHJlbmRlclRhcmdldENvbnRleHREYXRhLmN1YmVGcmFtZWJ1ZmZlcnMgPSB7fSApO1xyXG5cclxuXHRcdFx0XHRmYiA9IHJlbmRlclRhcmdldENvbnRleHREYXRhLmN1YmVGcmFtZWJ1ZmZlcnNbIGNhY2hlS2V5IF07XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBpc1hSUmVuZGVyVGFyZ2V0ICYmIGhhc0V4dGVybmFsVGV4dHVyZXMgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0XHRmYiA9IHRoaXMuX3hyRnJhbWVidWZmZXI7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRyZW5kZXJUYXJnZXRDb250ZXh0RGF0YS5mcmFtZWJ1ZmZlcnMgfHwgKCByZW5kZXJUYXJnZXRDb250ZXh0RGF0YS5mcmFtZWJ1ZmZlcnMgPSB7fSApO1xyXG5cclxuXHRcdFx0XHRmYiA9IHJlbmRlclRhcmdldENvbnRleHREYXRhLmZyYW1lYnVmZmVyc1sgY2FjaGVLZXkgXTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggZmIgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0ZmIgPSBnbC5jcmVhdGVGcmFtZWJ1ZmZlcigpO1xyXG5cclxuXHRcdFx0XHRzdGF0ZS5iaW5kRnJhbWVidWZmZXIoIGdsLkZSQU1FQlVGRkVSLCBmYiApO1xyXG5cclxuXHRcdFx0XHRjb25zdCB0ZXh0dXJlcyA9IGRlc2NyaXB0b3IudGV4dHVyZXM7XHJcblxyXG5cdFx0XHRcdGlmICggaXNDdWJlICkge1xyXG5cclxuXHRcdFx0XHRcdHJlbmRlclRhcmdldENvbnRleHREYXRhLmN1YmVGcmFtZWJ1ZmZlcnNbIGNhY2hlS2V5IF0gPSBmYjtcclxuXHJcblx0XHRcdFx0XHRjb25zdCB7IHRleHR1cmVHUFUgfSA9IHRoaXMuZ2V0KCB0ZXh0dXJlc1sgMCBdICk7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgY3ViZUZhY2UgPSB0aGlzLnJlbmRlcmVyLl9hY3RpdmVDdWJlRmFjZTtcclxuXHJcblx0XHRcdFx0XHRnbC5mcmFtZWJ1ZmZlclRleHR1cmUyRCggZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBjdWJlRmFjZSwgdGV4dHVyZUdQVSwgMCApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdHJlbmRlclRhcmdldENvbnRleHREYXRhLmZyYW1lYnVmZmVyc1sgY2FjaGVLZXkgXSA9IGZiO1xyXG5cclxuXHRcdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHRleHR1cmVzLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnN0IHRleHR1cmUgPSB0ZXh0dXJlc1sgaSBdO1xyXG5cdFx0XHRcdFx0XHRjb25zdCB0ZXh0dXJlRGF0YSA9IHRoaXMuZ2V0KCB0ZXh0dXJlICk7XHJcblx0XHRcdFx0XHRcdHRleHR1cmVEYXRhLnJlbmRlclRhcmdldCA9IGRlc2NyaXB0b3IucmVuZGVyVGFyZ2V0O1xyXG5cdFx0XHRcdFx0XHR0ZXh0dXJlRGF0YS5jYWNoZUtleSA9IGNhY2hlS2V5OyAvLyByZXF1aXJlZCBmb3IgY29weVRleHR1cmVUb1RleHR1cmUoKVxyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgYXR0YWNobWVudCA9IGdsLkNPTE9SX0FUVEFDSE1FTlQwICsgaTtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggaXNSZW5kZXJUYXJnZXQzRCB8fCBpc1JlbmRlclRhcmdldEFycmF5ICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRjb25zdCBsYXllciA9IHRoaXMucmVuZGVyZXIuX2FjdGl2ZUN1YmVGYWNlO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRnbC5mcmFtZWJ1ZmZlclRleHR1cmVMYXllciggZ2wuRlJBTUVCVUZGRVIsIGF0dGFjaG1lbnQsIHRleHR1cmVEYXRhLnRleHR1cmVHUFUsIDAsIGxheWVyICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoIGhhc0V4dGVybmFsVGV4dHVyZXMgJiYgdXNlTXVsdGlzYW1wbGVkUlRUICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdG11bHRpc2FtcGxlZFJUVEV4dC5mcmFtZWJ1ZmZlclRleHR1cmUyRE11bHRpc2FtcGxlRVhUKCBnbC5GUkFNRUJVRkZFUiwgYXR0YWNobWVudCwgZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZURhdGEudGV4dHVyZUdQVSwgMCwgc2FtcGxlcyApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGdsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKCBnbC5GUkFNRUJVRkZFUiwgYXR0YWNobWVudCwgZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZURhdGEudGV4dHVyZUdQVSwgMCApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHN0YXRlLmRyYXdCdWZmZXJzKCBkZXNjcmlwdG9yLCBmYiApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICggcmVuZGVyVGFyZ2V0LmlzWFJSZW5kZXJUYXJnZXQgJiYgcmVuZGVyVGFyZ2V0LmF1dG9BbGxvY2F0ZURlcHRoQnVmZmVyID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHJlbmRlcmJ1ZmZlciA9IGdsLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpO1xyXG5cdFx0XHRcdFx0dGhpcy50ZXh0dXJlVXRpbHMuc2V0dXBSZW5kZXJCdWZmZXJTdG9yYWdlKCByZW5kZXJidWZmZXIsIGRlc2NyaXB0b3IsIDAsIHVzZU11bHRpc2FtcGxlZFJUVCApO1xyXG5cdFx0XHRcdFx0cmVuZGVyVGFyZ2V0Q29udGV4dERhdGEueHJEZXB0aFJlbmRlcmJ1ZmZlciA9IHJlbmRlcmJ1ZmZlcjtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGRlc2NyaXB0b3IuZGVwdGhUZXh0dXJlICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgdGV4dHVyZURhdGEgPSB0aGlzLmdldCggZGVzY3JpcHRvci5kZXB0aFRleHR1cmUgKTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgZGVwdGhTdHlsZSA9IHN0ZW5jaWxCdWZmZXIgPyBnbC5ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQgOiBnbC5ERVBUSF9BVFRBQ0hNRU5UO1xyXG5cdFx0XHRcdFx0XHR0ZXh0dXJlRGF0YS5yZW5kZXJUYXJnZXQgPSBkZXNjcmlwdG9yLnJlbmRlclRhcmdldDtcclxuXHRcdFx0XHRcdFx0dGV4dHVyZURhdGEuY2FjaGVLZXkgPSBjYWNoZUtleTsgLy8gcmVxdWlyZWQgZm9yIGNvcHlUZXh0dXJlVG9UZXh0dXJlKClcclxuXHJcblx0XHRcdFx0XHRcdGlmICggaGFzRXh0ZXJuYWxUZXh0dXJlcyAmJiB1c2VNdWx0aXNhbXBsZWRSVFQgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdG11bHRpc2FtcGxlZFJUVEV4dC5mcmFtZWJ1ZmZlclRleHR1cmUyRE11bHRpc2FtcGxlRVhUKCBnbC5GUkFNRUJVRkZFUiwgZGVwdGhTdHlsZSwgZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZURhdGEudGV4dHVyZUdQVSwgMCwgc2FtcGxlcyApO1xyXG5cclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0Z2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoIGdsLkZSQU1FQlVGRkVSLCBkZXB0aFN0eWxlLCBnbC5URVhUVVJFXzJELCB0ZXh0dXJlRGF0YS50ZXh0dXJlR1BVLCAwICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHQvLyByZWJpbmQgZXh0ZXJuYWwgWFIgdGV4dHVyZXNcclxuXHJcblx0XHRcdFx0aWYgKCBpc1hSUmVuZGVyVGFyZ2V0ICYmIGhhc0V4dGVybmFsVGV4dHVyZXMgKSB7XHJcblxyXG5cdFx0XHRcdFx0c3RhdGUuYmluZEZyYW1lYnVmZmVyKCBnbC5GUkFNRUJVRkZFUiwgZmIgKTtcclxuXHJcblx0XHRcdFx0XHQvLyByZWJpbmQgY29sb3JcclxuXHJcblx0XHRcdFx0XHRjb25zdCB0ZXh0dXJlRGF0YSA9IHRoaXMuZ2V0KCBkZXNjcmlwdG9yLnRleHR1cmVzWyAwIF0gKTtcclxuXHJcblx0XHRcdFx0XHRpZiAoIHVzZU11bHRpc2FtcGxlZFJUVCApIHtcclxuXHJcblx0XHRcdFx0XHRcdG11bHRpc2FtcGxlZFJUVEV4dC5mcmFtZWJ1ZmZlclRleHR1cmUyRE11bHRpc2FtcGxlRVhUKCBnbC5GUkFNRUJVRkZFUiwgZ2wuQ09MT1JfQVRUQUNITUVOVDAsIGdsLlRFWFRVUkVfMkQsIHRleHR1cmVEYXRhLnRleHR1cmVHUFUsIDAsIHNhbXBsZXMgKTtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0Z2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoIGdsLkZSQU1FQlVGRkVSLCBnbC5DT0xPUl9BVFRBQ0hNRU5UMCwgZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZURhdGEudGV4dHVyZUdQVSwgMCApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvLyByZWJpbmQgZGVwdGhcclxuXHJcblx0XHRcdFx0XHRjb25zdCBkZXB0aFN0eWxlID0gc3RlbmNpbEJ1ZmZlciA/IGdsLkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVCA6IGdsLkRFUFRIX0FUVEFDSE1FTlQ7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCByZW5kZXJUYXJnZXQuYXV0b0FsbG9jYXRlRGVwdGhCdWZmZXIgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCByZW5kZXJidWZmZXIgPSByZW5kZXJUYXJnZXRDb250ZXh0RGF0YS54ckRlcHRoUmVuZGVyYnVmZmVyO1xyXG5cdFx0XHRcdFx0XHRnbC5iaW5kUmVuZGVyYnVmZmVyKCBnbC5SRU5ERVJCVUZGRVIsIHJlbmRlcmJ1ZmZlciApO1xyXG5cdFx0XHRcdFx0XHRnbC5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlciggZ2wuRlJBTUVCVUZGRVIsIGRlcHRoU3R5bGUsIGdsLlJFTkRFUkJVRkZFUiwgcmVuZGVyYnVmZmVyICk7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnN0IHRleHR1cmVEYXRhID0gdGhpcy5nZXQoIGRlc2NyaXB0b3IuZGVwdGhUZXh0dXJlICk7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIHVzZU11bHRpc2FtcGxlZFJUVCApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0bXVsdGlzYW1wbGVkUlRURXh0LmZyYW1lYnVmZmVyVGV4dHVyZTJETXVsdGlzYW1wbGVFWFQoIGdsLkZSQU1FQlVGRkVSLCBkZXB0aFN0eWxlLCBnbC5URVhUVVJFXzJELCB0ZXh0dXJlRGF0YS50ZXh0dXJlR1BVLCAwLCBzYW1wbGVzICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRnbC5mcmFtZWJ1ZmZlclRleHR1cmUyRCggZ2wuRlJBTUVCVUZGRVIsIGRlcHRoU3R5bGUsIGdsLlRFWFRVUkVfMkQsIHRleHR1cmVEYXRhLnRleHR1cmVHUFUsIDAgKTtcclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggc2FtcGxlcyA+IDAgJiYgdXNlTXVsdGlzYW1wbGVkUlRUID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBtc2FhRmIgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBpbnZhbGlkYXRpb25BcnJheSA9IFtdO1xyXG5cclxuXHRcdFx0XHRcdG1zYWFGYiA9IGdsLmNyZWF0ZUZyYW1lYnVmZmVyKCk7XHJcblxyXG5cdFx0XHRcdFx0c3RhdGUuYmluZEZyYW1lYnVmZmVyKCBnbC5GUkFNRUJVRkZFUiwgbXNhYUZiICk7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgbXNhYVJlbmRlcmJ1ZmZlcnMgPSBbXTtcclxuXHJcblx0XHRcdFx0XHRjb25zdCB0ZXh0dXJlcyA9IGRlc2NyaXB0b3IudGV4dHVyZXM7XHJcblxyXG5cdFx0XHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdGV4dHVyZXMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdFx0bXNhYVJlbmRlcmJ1ZmZlcnNbIGkgXSA9IGdsLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpO1xyXG5cclxuXHRcdFx0XHRcdFx0Z2wuYmluZFJlbmRlcmJ1ZmZlciggZ2wuUkVOREVSQlVGRkVSLCBtc2FhUmVuZGVyYnVmZmVyc1sgaSBdICk7XHJcblxyXG5cdFx0XHRcdFx0XHRpbnZhbGlkYXRpb25BcnJheS5wdXNoKCBnbC5DT0xPUl9BVFRBQ0hNRU5UMCArIGkgKTtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggZGVwdGhCdWZmZXIgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGRlcHRoU3R5bGUgPSBzdGVuY2lsQnVmZmVyID8gZ2wuREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UIDogZ2wuREVQVEhfQVRUQUNITUVOVDtcclxuXHRcdFx0XHRcdFx0XHRpbnZhbGlkYXRpb25BcnJheS5wdXNoKCBkZXB0aFN0eWxlICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCB0ZXh0dXJlID0gZGVzY3JpcHRvci50ZXh0dXJlc1sgaSBdO1xyXG5cdFx0XHRcdFx0XHRjb25zdCB0ZXh0dXJlRGF0YSA9IHRoaXMuZ2V0KCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0XHRcdFx0XHRnbC5yZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGUoIGdsLlJFTkRFUkJVRkZFUiwgc2FtcGxlcywgdGV4dHVyZURhdGEuZ2xJbnRlcm5hbEZvcm1hdCwgZGVzY3JpcHRvci53aWR0aCwgZGVzY3JpcHRvci5oZWlnaHQgKTtcclxuXHRcdFx0XHRcdFx0Z2wuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoIGdsLkZSQU1FQlVGRkVSLCBnbC5DT0xPUl9BVFRBQ0hNRU5UMCArIGksIGdsLlJFTkRFUkJVRkZFUiwgbXNhYVJlbmRlcmJ1ZmZlcnNbIGkgXSApO1xyXG5cclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0cmVuZGVyVGFyZ2V0Q29udGV4dERhdGEubXNhYUZyYW1lQnVmZmVyID0gbXNhYUZiO1xyXG5cdFx0XHRcdFx0cmVuZGVyVGFyZ2V0Q29udGV4dERhdGEubXNhYVJlbmRlcmJ1ZmZlcnMgPSBtc2FhUmVuZGVyYnVmZmVycztcclxuXHJcblx0XHRcdFx0XHRpZiAoIGRlcHRoUmVuZGVyYnVmZmVyID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRkZXB0aFJlbmRlcmJ1ZmZlciA9IGdsLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpO1xyXG5cdFx0XHRcdFx0XHR0aGlzLnRleHR1cmVVdGlscy5zZXR1cFJlbmRlckJ1ZmZlclN0b3JhZ2UoIGRlcHRoUmVuZGVyYnVmZmVyLCBkZXNjcmlwdG9yLCBzYW1wbGVzICk7XHJcblxyXG5cdFx0XHRcdFx0XHRyZW5kZXJUYXJnZXRDb250ZXh0RGF0YS5kZXB0aFJlbmRlcmJ1ZmZlciA9IGRlcHRoUmVuZGVyYnVmZmVyO1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgZGVwdGhTdHlsZSA9IHN0ZW5jaWxCdWZmZXIgPyBnbC5ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQgOiBnbC5ERVBUSF9BVFRBQ0hNRU5UO1xyXG5cdFx0XHRcdFx0XHRpbnZhbGlkYXRpb25BcnJheS5wdXNoKCBkZXB0aFN0eWxlICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHJlbmRlclRhcmdldENvbnRleHREYXRhLmludmFsaWRhdGlvbkFycmF5ID0gaW52YWxpZGF0aW9uQXJyYXk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Y3VycmVudEZyYW1lQnVmZmVyID0gcmVuZGVyVGFyZ2V0Q29udGV4dERhdGEubXNhYUZyYW1lQnVmZmVyO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0Y3VycmVudEZyYW1lQnVmZmVyID0gZmI7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHN0YXRlLmJpbmRGcmFtZWJ1ZmZlciggZ2wuRlJBTUVCVUZGRVIsIGN1cnJlbnRGcmFtZUJ1ZmZlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSBWQU8ga2V5IGZvciB0aGUgZ2l2ZW4gaW5kZXggYW5kIGF0dHJpYnV0ZXMuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8QnVmZmVyQXR0cmlidXRlPn0gYXR0cmlidXRlcyAtIEFuIGFycmF5IG9mIGJ1ZmZlciBhdHRyaWJ1dGVzLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIFZBTyBrZXkuXHJcblx0ICovXHJcblx0X2dldFZhb0tleSggYXR0cmlidXRlcyApIHtcclxuXHJcblx0XHRsZXQga2V5ID0gJyc7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBhdHRyaWJ1dGVEYXRhID0gdGhpcy5nZXQoIGF0dHJpYnV0ZXNbIGkgXSApO1xyXG5cclxuXHRcdFx0a2V5ICs9ICc6JyArIGF0dHJpYnV0ZURhdGEuaWQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBrZXk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyBhIFZBTyBmcm9tIHRoZSBpbmRleCBhbmQgYXR0cmlidXRlcy5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtBcnJheTxCdWZmZXJBdHRyaWJ1dGU+fSBhdHRyaWJ1dGVzIC0gQW4gYXJyYXkgb2YgYnVmZmVyIGF0dHJpYnV0ZXMuXHJcblx0ICogQHJldHVybiB7T2JqZWN0fSBUaGUgVkFPIGRhdGEuXHJcblx0ICovXHJcblx0X2NyZWF0ZVZhbyggYXR0cmlidXRlcyApIHtcclxuXHJcblx0XHRjb25zdCB7IGdsIH0gPSB0aGlzO1xyXG5cclxuXHRcdGNvbnN0IHZhb0dQVSA9IGdsLmNyZWF0ZVZlcnRleEFycmF5KCk7XHJcblx0XHRsZXQga2V5ID0gJyc7XHJcblxyXG5cdFx0bGV0IHN0YXRpY1ZhbyA9IHRydWU7XHJcblxyXG5cdFx0Z2wuYmluZFZlcnRleEFycmF5KCB2YW9HUFUgKTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbIGkgXTtcclxuXHRcdFx0Y29uc3QgYXR0cmlidXRlRGF0YSA9IHRoaXMuZ2V0KCBhdHRyaWJ1dGUgKTtcclxuXHJcblx0XHRcdGtleSArPSAnOicgKyBhdHRyaWJ1dGVEYXRhLmlkO1xyXG5cclxuXHRcdFx0Z2wuYmluZEJ1ZmZlciggZ2wuQVJSQVlfQlVGRkVSLCBhdHRyaWJ1dGVEYXRhLmJ1ZmZlckdQVSApO1xyXG5cdFx0XHRnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSggaSApO1xyXG5cclxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUuaXNTdG9yYWdlQnVmZmVyQXR0cmlidXRlIHx8IGF0dHJpYnV0ZS5pc1N0b3JhZ2VJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUgKSBzdGF0aWNWYW8gPSBmYWxzZTtcclxuXHJcblx0XHRcdGxldCBzdHJpZGUsIG9mZnNldDtcclxuXHJcblx0XHRcdGlmICggYXR0cmlidXRlLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdHN0cmlkZSA9IGF0dHJpYnV0ZS5kYXRhLnN0cmlkZSAqIGF0dHJpYnV0ZURhdGEuYnl0ZXNQZXJFbGVtZW50O1xyXG5cdFx0XHRcdG9mZnNldCA9IGF0dHJpYnV0ZS5vZmZzZXQgKiBhdHRyaWJ1dGVEYXRhLmJ5dGVzUGVyRWxlbWVudDtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHN0cmlkZSA9IDA7XHJcblx0XHRcdFx0b2Zmc2V0ID0gMDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggYXR0cmlidXRlRGF0YS5pc0ludGVnZXIgKSB7XHJcblxyXG5cdFx0XHRcdGdsLnZlcnRleEF0dHJpYklQb2ludGVyKCBpLCBhdHRyaWJ1dGUuaXRlbVNpemUsIGF0dHJpYnV0ZURhdGEudHlwZSwgc3RyaWRlLCBvZmZzZXQgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoIGksIGF0dHJpYnV0ZS5pdGVtU2l6ZSwgYXR0cmlidXRlRGF0YS50eXBlLCBhdHRyaWJ1dGUubm9ybWFsaXplZCwgc3RyaWRlLCBvZmZzZXQgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggYXR0cmlidXRlLmlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlICYmICEgYXR0cmlidXRlLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgKSB7XHJcblxyXG5cdFx0XHRcdGdsLnZlcnRleEF0dHJpYkRpdmlzb3IoIGksIGF0dHJpYnV0ZS5tZXNoUGVyQXR0cmlidXRlICk7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBhdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSAmJiBhdHRyaWJ1dGUuZGF0YS5pc0luc3RhbmNlZEludGVybGVhdmVkQnVmZmVyICkge1xyXG5cclxuXHRcdFx0XHRnbC52ZXJ0ZXhBdHRyaWJEaXZpc29yKCBpLCBhdHRyaWJ1dGUuZGF0YS5tZXNoUGVyQXR0cmlidXRlICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGdsLmJpbmRCdWZmZXIoIGdsLkFSUkFZX0JVRkZFUiwgbnVsbCApO1xyXG5cclxuXHRcdHRoaXMudmFvQ2FjaGVbIGtleSBdID0gdmFvR1BVO1xyXG5cclxuXHRcdHJldHVybiB7IHZhb0dQVSwgc3RhdGljVmFvIH07XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyBhIHRyYW5zZm9ybSBmZWVkYmFjayBmcm9tIHRoZSBnaXZlbiB0cmFuc2Zvcm0gYnVmZmVycy5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtBcnJheTxEdWFsQXR0cmlidXRlRGF0YT59IHRyYW5zZm9ybUJ1ZmZlcnMgLSBUaGUgdHJhbnNmb3JtIGJ1ZmZlcnMuXHJcblx0ICogQHJldHVybiB7V2ViR0xUcmFuc2Zvcm1GZWVkYmFja30gVGhlIHRyYW5zZm9ybSBmZWVkYmFjay5cclxuXHQgKi9cclxuXHRfZ2V0VHJhbnNmb3JtRmVlZGJhY2soIHRyYW5zZm9ybUJ1ZmZlcnMgKSB7XHJcblxyXG5cdFx0bGV0IGtleSA9ICcnO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHRyYW5zZm9ybUJ1ZmZlcnMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0a2V5ICs9ICc6JyArIHRyYW5zZm9ybUJ1ZmZlcnNbIGkgXS5pZDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0bGV0IHRyYW5zZm9ybUZlZWRiYWNrR1BVID0gdGhpcy50cmFuc2Zvcm1GZWVkYmFja0NhY2hlWyBrZXkgXTtcclxuXHJcblx0XHRpZiAoIHRyYW5zZm9ybUZlZWRiYWNrR1BVICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gdHJhbnNmb3JtRmVlZGJhY2tHUFU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHsgZ2wgfSA9IHRoaXM7XHJcblxyXG5cdFx0dHJhbnNmb3JtRmVlZGJhY2tHUFUgPSBnbC5jcmVhdGVUcmFuc2Zvcm1GZWVkYmFjaygpO1xyXG5cclxuXHRcdGdsLmJpbmRUcmFuc2Zvcm1GZWVkYmFjayggZ2wuVFJBTlNGT1JNX0ZFRURCQUNLLCB0cmFuc2Zvcm1GZWVkYmFja0dQVSApO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHRyYW5zZm9ybUJ1ZmZlcnMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYXR0cmlidXRlRGF0YSA9IHRyYW5zZm9ybUJ1ZmZlcnNbIGkgXTtcclxuXHJcblx0XHRcdGdsLmJpbmRCdWZmZXJCYXNlKCBnbC5UUkFOU0ZPUk1fRkVFREJBQ0tfQlVGRkVSLCBpLCBhdHRyaWJ1dGVEYXRhLnRyYW5zZm9ybUJ1ZmZlciApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRnbC5iaW5kVHJhbnNmb3JtRmVlZGJhY2soIGdsLlRSQU5TRk9STV9GRUVEQkFDSywgbnVsbCApO1xyXG5cclxuXHRcdHRoaXMudHJhbnNmb3JtRmVlZGJhY2tDYWNoZVsga2V5IF0gPSB0cmFuc2Zvcm1GZWVkYmFja0dQVTtcclxuXHJcblx0XHRyZXR1cm4gdHJhbnNmb3JtRmVlZGJhY2tHUFU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0dXBzIHRoZSBnaXZlbiBiaW5kaW5ncy5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtBcnJheTxCaW5kR3JvdXA+fSBiaW5kaW5ncyAtIFRoZSBiaW5kaW5ncy5cclxuXHQgKiBAcGFyYW0ge1dlYkdMUHJvZ3JhbX0gcHJvZ3JhbUdQVSAtIFRoZSBXZWJHTCBwcm9ncmFtLlxyXG5cdCAqL1xyXG5cdF9zZXR1cEJpbmRpbmdzKCBiaW5kaW5ncywgcHJvZ3JhbUdQVSApIHtcclxuXHJcblx0XHRjb25zdCBnbCA9IHRoaXMuZ2w7XHJcblxyXG5cdFx0Zm9yICggY29uc3QgYmluZEdyb3VwIG9mIGJpbmRpbmdzICkge1xyXG5cclxuXHRcdFx0Zm9yICggY29uc3QgYmluZGluZyBvZiBiaW5kR3JvdXAuYmluZGluZ3MgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGJpbmRpbmdEYXRhID0gdGhpcy5nZXQoIGJpbmRpbmcgKTtcclxuXHRcdFx0XHRjb25zdCBpbmRleCA9IGJpbmRpbmdEYXRhLmluZGV4O1xyXG5cclxuXHRcdFx0XHRpZiAoIGJpbmRpbmcuaXNVbmlmb3Jtc0dyb3VwIHx8IGJpbmRpbmcuaXNVbmlmb3JtQnVmZmVyICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGxvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUJsb2NrSW5kZXgoIHByb2dyYW1HUFUsIGJpbmRpbmcubmFtZSApO1xyXG5cdFx0XHRcdFx0Z2wudW5pZm9ybUJsb2NrQmluZGluZyggcHJvZ3JhbUdQVSwgbG9jYXRpb24sIGluZGV4ICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGJpbmRpbmcuaXNTYW1wbGVkVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBsb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbUdQVSwgYmluZGluZy5uYW1lICk7XHJcblx0XHRcdFx0XHRnbC51bmlmb3JtMWkoIGxvY2F0aW9uLCBpbmRleCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEJpbmRzIHRoZSBnaXZlbiB1bmlmb3Jtcy5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtBcnJheTxCaW5kR3JvdXA+fSBiaW5kaW5ncyAtIFRoZSBiaW5kaW5ncy5cclxuXHQgKi9cclxuXHRfYmluZFVuaWZvcm1zKCBiaW5kaW5ncyApIHtcclxuXHJcblx0XHRjb25zdCB7IGdsLCBzdGF0ZSB9ID0gdGhpcztcclxuXHJcblx0XHRmb3IgKCBjb25zdCBiaW5kR3JvdXAgb2YgYmluZGluZ3MgKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBjb25zdCBiaW5kaW5nIG9mIGJpbmRHcm91cC5iaW5kaW5ncyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgYmluZGluZ0RhdGEgPSB0aGlzLmdldCggYmluZGluZyApO1xyXG5cdFx0XHRcdGNvbnN0IGluZGV4ID0gYmluZGluZ0RhdGEuaW5kZXg7XHJcblxyXG5cdFx0XHRcdGlmICggYmluZGluZy5pc1VuaWZvcm1zR3JvdXAgfHwgYmluZGluZy5pc1VuaWZvcm1CdWZmZXIgKSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gVE9ETyBVU0UgYmluZEJ1ZmZlclJhbmdlIHRvIGdyb3VwIG11bHRpcGxlIHVuaWZvcm0gYnVmZmVyc1xyXG5cdFx0XHRcdFx0c3RhdGUuYmluZEJ1ZmZlckJhc2UoIGdsLlVOSUZPUk1fQlVGRkVSLCBpbmRleCwgYmluZGluZ0RhdGEuYnVmZmVyR1BVICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGJpbmRpbmcuaXNTYW1wbGVkVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggYmluZGluZ0RhdGEuZ2xUZXh0dXJlVHlwZSwgYmluZGluZ0RhdGEudGV4dHVyZUdQVSwgZ2wuVEVYVFVSRTAgKyBpbmRleCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBgV0VCR0xfbXVsdGlzYW1wbGVkX3JlbmRlcl90b190ZXh0dXJlYCBleHRlbnNpb25cclxuXHQgKiBzaG91bGQgYmUgdXNlZCB3aGVuIE1TQUEgaXMgZW5hYmxlZC5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtSZW5kZXJUYXJnZXR9IHJlbmRlclRhcmdldCAtIFRoZSByZW5kZXIgdGFyZ2V0IHRoYXQgc2hvdWxkIGJlIG11bHRpc2FtcGxlZC5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRvIHVzZSB0aGUgYFdFQkdMX211bHRpc2FtcGxlZF9yZW5kZXJfdG9fdGV4dHVyZWAgZXh0ZW5zaW9uIGZvciBNU0FBIG9yIG5vdC5cclxuXHQgKi9cclxuXHRfdXNlTXVsdGlzYW1wbGVkUlRUKCByZW5kZXJUYXJnZXQgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHJlbmRlclRhcmdldC5zYW1wbGVzID4gMCAmJiB0aGlzLmV4dGVuc2lvbnMuaGFzKCAnV0VCR0xfbXVsdGlzYW1wbGVkX3JlbmRlcl90b190ZXh0dXJlJyApID09PSB0cnVlICYmIHJlbmRlclRhcmdldC5hdXRvQWxsb2NhdGVEZXB0aEJ1ZmZlciAhPT0gZmFsc2U7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRnJlZXMgaW50ZXJuYWwgcmVzb3VyY2VzLlxyXG5cdCAqL1xyXG5cdGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0Y29uc3QgZXh0ZW5zaW9uID0gdGhpcy5leHRlbnNpb25zLmdldCggJ1dFQkdMX2xvc2VfY29udGV4dCcgKTtcclxuXHRcdGlmICggZXh0ZW5zaW9uICkgZXh0ZW5zaW9uLmxvc2VDb250ZXh0KCk7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICd3ZWJnbGNvbnRleHRsb3N0JywgdGhpcy5fb25Db250ZXh0TG9zdCApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBXZWJHTEJhY2tlbmQ7XHJcbiIsImV4cG9ydCBjb25zdCBHUFVQcmltaXRpdmVUb3BvbG9neSA9IHtcclxuXHRQb2ludExpc3Q6ICdwb2ludC1saXN0JyxcclxuXHRMaW5lTGlzdDogJ2xpbmUtbGlzdCcsXHJcblx0TGluZVN0cmlwOiAnbGluZS1zdHJpcCcsXHJcblx0VHJpYW5nbGVMaXN0OiAndHJpYW5nbGUtbGlzdCcsXHJcblx0VHJpYW5nbGVTdHJpcDogJ3RyaWFuZ2xlLXN0cmlwJyxcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBHUFVDb21wYXJlRnVuY3Rpb24gPSB7XHJcblx0TmV2ZXI6ICduZXZlcicsXHJcblx0TGVzczogJ2xlc3MnLFxyXG5cdEVxdWFsOiAnZXF1YWwnLFxyXG5cdExlc3NFcXVhbDogJ2xlc3MtZXF1YWwnLFxyXG5cdEdyZWF0ZXI6ICdncmVhdGVyJyxcclxuXHROb3RFcXVhbDogJ25vdC1lcXVhbCcsXHJcblx0R3JlYXRlckVxdWFsOiAnZ3JlYXRlci1lcXVhbCcsXHJcblx0QWx3YXlzOiAnYWx3YXlzJ1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IEdQVVN0b3JlT3AgPSB7XHJcblx0U3RvcmU6ICdzdG9yZScsXHJcblx0RGlzY2FyZDogJ2Rpc2NhcmQnXHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgR1BVTG9hZE9wID0ge1xyXG5cdExvYWQ6ICdsb2FkJyxcclxuXHRDbGVhcjogJ2NsZWFyJ1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IEdQVUZyb250RmFjZSA9IHtcclxuXHRDQ1c6ICdjY3cnLFxyXG5cdENXOiAnY3cnXHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgR1BVQ3VsbE1vZGUgPSB7XHJcblx0Tm9uZTogJ25vbmUnLFxyXG5cdEZyb250OiAnZnJvbnQnLFxyXG5cdEJhY2s6ICdiYWNrJ1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IEdQVUluZGV4Rm9ybWF0ID0ge1xyXG5cdFVpbnQxNjogJ3VpbnQxNicsXHJcblx0VWludDMyOiAndWludDMyJ1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IEdQVVZlcnRleEZvcm1hdCA9IHtcclxuXHRVaW50OHgyOiAndWludDh4MicsXHJcblx0VWludDh4NDogJ3VpbnQ4eDQnLFxyXG5cdFNpbnQ4eDI6ICdzaW50OHgyJyxcclxuXHRTaW50OHg0OiAnc2ludDh4NCcsXHJcblx0VW5vcm04eDI6ICd1bm9ybTh4MicsXHJcblx0VW5vcm04eDQ6ICd1bm9ybTh4NCcsXHJcblx0U25vcm04eDI6ICdzbm9ybTh4MicsXHJcblx0U25vcm04eDQ6ICdzbm9ybTh4NCcsXHJcblx0VWludDE2eDI6ICd1aW50MTZ4MicsXHJcblx0VWludDE2eDQ6ICd1aW50MTZ4NCcsXHJcblx0U2ludDE2eDI6ICdzaW50MTZ4MicsXHJcblx0U2ludDE2eDQ6ICdzaW50MTZ4NCcsXHJcblx0VW5vcm0xNngyOiAndW5vcm0xNngyJyxcclxuXHRVbm9ybTE2eDQ6ICd1bm9ybTE2eDQnLFxyXG5cdFNub3JtMTZ4MjogJ3Nub3JtMTZ4MicsXHJcblx0U25vcm0xNng0OiAnc25vcm0xNng0JyxcclxuXHRGbG9hdDE2eDI6ICdmbG9hdDE2eDInLFxyXG5cdEZsb2F0MTZ4NDogJ2Zsb2F0MTZ4NCcsXHJcblx0RmxvYXQzMjogJ2Zsb2F0MzInLFxyXG5cdEZsb2F0MzJ4MjogJ2Zsb2F0MzJ4MicsXHJcblx0RmxvYXQzMngzOiAnZmxvYXQzMngzJyxcclxuXHRGbG9hdDMyeDQ6ICdmbG9hdDMyeDQnLFxyXG5cdFVpbnQzMjogJ3VpbnQzMicsXHJcblx0VWludDMyeDI6ICd1aW50MzJ4MicsXHJcblx0VWludDMyeDM6ICd1aW50MzJ4MycsXHJcblx0VWludDMyeDQ6ICd1aW50MzJ4NCcsXHJcblx0U2ludDMyOiAnc2ludDMyJyxcclxuXHRTaW50MzJ4MjogJ3NpbnQzMngyJyxcclxuXHRTaW50MzJ4MzogJ3NpbnQzMngzJyxcclxuXHRTaW50MzJ4NDogJ3NpbnQzMng0J1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IEdQVVRleHR1cmVGb3JtYXQgPSB7XHJcblxyXG5cdC8vIDgtYml0IGZvcm1hdHNcclxuXHJcblx0UjhVbm9ybTogJ3I4dW5vcm0nLFxyXG5cdFI4U25vcm06ICdyOHNub3JtJyxcclxuXHRSOFVpbnQ6ICdyOHVpbnQnLFxyXG5cdFI4U2ludDogJ3I4c2ludCcsXHJcblxyXG5cdC8vIDE2LWJpdCBmb3JtYXRzXHJcblxyXG5cdFIxNlVpbnQ6ICdyMTZ1aW50JyxcclxuXHRSMTZTaW50OiAncjE2c2ludCcsXHJcblx0UjE2RmxvYXQ6ICdyMTZmbG9hdCcsXHJcblx0Ukc4VW5vcm06ICdyZzh1bm9ybScsXHJcblx0Ukc4U25vcm06ICdyZzhzbm9ybScsXHJcblx0Ukc4VWludDogJ3JnOHVpbnQnLFxyXG5cdFJHOFNpbnQ6ICdyZzhzaW50JyxcclxuXHJcblx0Ly8gMzItYml0IGZvcm1hdHNcclxuXHJcblx0UjMyVWludDogJ3IzMnVpbnQnLFxyXG5cdFIzMlNpbnQ6ICdyMzJzaW50JyxcclxuXHRSMzJGbG9hdDogJ3IzMmZsb2F0JyxcclxuXHRSRzE2VWludDogJ3JnMTZ1aW50JyxcclxuXHRSRzE2U2ludDogJ3JnMTZzaW50JyxcclxuXHRSRzE2RmxvYXQ6ICdyZzE2ZmxvYXQnLFxyXG5cdFJHQkE4VW5vcm06ICdyZ2JhOHVub3JtJyxcclxuXHRSR0JBOFVub3JtU1JHQjogJ3JnYmE4dW5vcm0tc3JnYicsXHJcblx0UkdCQThTbm9ybTogJ3JnYmE4c25vcm0nLFxyXG5cdFJHQkE4VWludDogJ3JnYmE4dWludCcsXHJcblx0UkdCQThTaW50OiAncmdiYThzaW50JyxcclxuXHRCR1JBOFVub3JtOiAnYmdyYTh1bm9ybScsXHJcblx0QkdSQThVbm9ybVNSR0I6ICdiZ3JhOHVub3JtLXNyZ2InLFxyXG5cdC8vIFBhY2tlZCAzMi1iaXQgZm9ybWF0c1xyXG5cdFJHQjlFNVVGbG9hdDogJ3JnYjllNXVmbG9hdCcsXHJcblx0UkdCMTBBMlVub3JtOiAncmdiMTBhMnVub3JtJyxcclxuXHRSRzExQjEwVUZsb2F0OiAncmdiMTBhMnVub3JtJyxcclxuXHJcblx0Ly8gNjQtYml0IGZvcm1hdHNcclxuXHJcblx0UkczMlVpbnQ6ICdyZzMydWludCcsXHJcblx0UkczMlNpbnQ6ICdyZzMyc2ludCcsXHJcblx0UkczMkZsb2F0OiAncmczMmZsb2F0JyxcclxuXHRSR0JBMTZVaW50OiAncmdiYTE2dWludCcsXHJcblx0UkdCQTE2U2ludDogJ3JnYmExNnNpbnQnLFxyXG5cdFJHQkExNkZsb2F0OiAncmdiYTE2ZmxvYXQnLFxyXG5cclxuXHQvLyAxMjgtYml0IGZvcm1hdHNcclxuXHJcblx0UkdCQTMyVWludDogJ3JnYmEzMnVpbnQnLFxyXG5cdFJHQkEzMlNpbnQ6ICdyZ2JhMzJzaW50JyxcclxuXHRSR0JBMzJGbG9hdDogJ3JnYmEzMmZsb2F0JyxcclxuXHJcblx0Ly8gRGVwdGggYW5kIHN0ZW5jaWwgZm9ybWF0c1xyXG5cclxuXHRTdGVuY2lsODogJ3N0ZW5jaWw4JyxcclxuXHREZXB0aDE2VW5vcm06ICdkZXB0aDE2dW5vcm0nLFxyXG5cdERlcHRoMjRQbHVzOiAnZGVwdGgyNHBsdXMnLFxyXG5cdERlcHRoMjRQbHVzU3RlbmNpbDg6ICdkZXB0aDI0cGx1cy1zdGVuY2lsOCcsXHJcblx0RGVwdGgzMkZsb2F0OiAnZGVwdGgzMmZsb2F0JyxcclxuXHJcblx0Ly8gJ2RlcHRoMzJmbG9hdC1zdGVuY2lsOCcgZXh0ZW5zaW9uXHJcblxyXG5cdERlcHRoMzJGbG9hdFN0ZW5jaWw4OiAnZGVwdGgzMmZsb2F0LXN0ZW5jaWw4JyxcclxuXHJcblx0Ly8gQkMgY29tcHJlc3NlZCBmb3JtYXRzIHVzYWJsZSBpZiAndGV4dHVyZS1jb21wcmVzc2lvbi1iYycgaXMgYm90aFxyXG5cdC8vIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlL3VzZXIgYWdlbnQgYW5kIGVuYWJsZWQgaW4gcmVxdWVzdERldmljZS5cclxuXHJcblx0QkMxUkdCQVVub3JtOiAnYmMxLXJnYmEtdW5vcm0nLFxyXG5cdEJDMVJHQkFVbm9ybVNSR0I6ICdiYzEtcmdiYS11bm9ybS1zcmdiJyxcclxuXHRCQzJSR0JBVW5vcm06ICdiYzItcmdiYS11bm9ybScsXHJcblx0QkMyUkdCQVVub3JtU1JHQjogJ2JjMi1yZ2JhLXVub3JtLXNyZ2InLFxyXG5cdEJDM1JHQkFVbm9ybTogJ2JjMy1yZ2JhLXVub3JtJyxcclxuXHRCQzNSR0JBVW5vcm1TUkdCOiAnYmMzLXJnYmEtdW5vcm0tc3JnYicsXHJcblx0QkM0UlVub3JtOiAnYmM0LXItdW5vcm0nLFxyXG5cdEJDNFJTbm9ybTogJ2JjNC1yLXNub3JtJyxcclxuXHRCQzVSR1Vub3JtOiAnYmM1LXJnLXVub3JtJyxcclxuXHRCQzVSR1Nub3JtOiAnYmM1LXJnLXNub3JtJyxcclxuXHRCQzZIUkdCVUZsb2F0OiAnYmM2aC1yZ2ItdWZsb2F0JyxcclxuXHRCQzZIUkdCRmxvYXQ6ICdiYzZoLXJnYi1mbG9hdCcsXHJcblx0QkM3UkdCQVVub3JtOiAnYmM3LXJnYmEtdW5vcm0nLFxyXG5cdEJDN1JHQkFVbm9ybVNSR0I6ICdiYzctcmdiYS1zcmdiJyxcclxuXHJcblx0Ly8gRVRDMiBjb21wcmVzc2VkIGZvcm1hdHMgdXNhYmxlIGlmICd0ZXh0dXJlLWNvbXByZXNzaW9uLWV0YzInIGlzIGJvdGhcclxuXHQvLyBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZS91c2VyIGFnZW50IGFuZCBlbmFibGVkIGluIHJlcXVlc3REZXZpY2UuXHJcblxyXG5cdEVUQzJSR0I4VW5vcm06ICdldGMyLXJnYjh1bm9ybScsXHJcblx0RVRDMlJHQjhVbm9ybVNSR0I6ICdldGMyLXJnYjh1bm9ybS1zcmdiJyxcclxuXHRFVEMyUkdCOEExVW5vcm06ICdldGMyLXJnYjhhMXVub3JtJyxcclxuXHRFVEMyUkdCOEExVW5vcm1TUkdCOiAnZXRjMi1yZ2I4YTF1bm9ybS1zcmdiJyxcclxuXHRFVEMyUkdCQThVbm9ybTogJ2V0YzItcmdiYTh1bm9ybScsXHJcblx0RVRDMlJHQkE4VW5vcm1TUkdCOiAnZXRjMi1yZ2JhOHVub3JtLXNyZ2InLFxyXG5cdEVBQ1IxMVVub3JtOiAnZWFjLXIxMXVub3JtJyxcclxuXHRFQUNSMTFTbm9ybTogJ2VhYy1yMTFzbm9ybScsXHJcblx0RUFDUkcxMVVub3JtOiAnZWFjLXJnMTF1bm9ybScsXHJcblx0RUFDUkcxMVNub3JtOiAnZWFjLXJnMTFzbm9ybScsXHJcblxyXG5cdC8vIEFTVEMgY29tcHJlc3NlZCBmb3JtYXRzIHVzYWJsZSBpZiAndGV4dHVyZS1jb21wcmVzc2lvbi1hc3RjJyBpcyBib3RoXHJcblx0Ly8gc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UvdXNlciBhZ2VudCBhbmQgZW5hYmxlZCBpbiByZXF1ZXN0RGV2aWNlLlxyXG5cclxuXHRBU1RDNHg0VW5vcm06ICdhc3RjLTR4NC11bm9ybScsXHJcblx0QVNUQzR4NFVub3JtU1JHQjogJ2FzdGMtNHg0LXVub3JtLXNyZ2InLFxyXG5cdEFTVEM1eDRVbm9ybTogJ2FzdGMtNXg0LXVub3JtJyxcclxuXHRBU1RDNXg0VW5vcm1TUkdCOiAnYXN0Yy01eDQtdW5vcm0tc3JnYicsXHJcblx0QVNUQzV4NVVub3JtOiAnYXN0Yy01eDUtdW5vcm0nLFxyXG5cdEFTVEM1eDVVbm9ybVNSR0I6ICdhc3RjLTV4NS11bm9ybS1zcmdiJyxcclxuXHRBU1RDNng1VW5vcm06ICdhc3RjLTZ4NS11bm9ybScsXHJcblx0QVNUQzZ4NVVub3JtU1JHQjogJ2FzdGMtNng1LXVub3JtLXNyZ2InLFxyXG5cdEFTVEM2eDZVbm9ybTogJ2FzdGMtNng2LXVub3JtJyxcclxuXHRBU1RDNng2VW5vcm1TUkdCOiAnYXN0Yy02eDYtdW5vcm0tc3JnYicsXHJcblx0QVNUQzh4NVVub3JtOiAnYXN0Yy04eDUtdW5vcm0nLFxyXG5cdEFTVEM4eDVVbm9ybVNSR0I6ICdhc3RjLTh4NS11bm9ybS1zcmdiJyxcclxuXHRBU1RDOHg2VW5vcm06ICdhc3RjLTh4Ni11bm9ybScsXHJcblx0QVNUQzh4NlVub3JtU1JHQjogJ2FzdGMtOHg2LXVub3JtLXNyZ2InLFxyXG5cdEFTVEM4eDhVbm9ybTogJ2FzdGMtOHg4LXVub3JtJyxcclxuXHRBU1RDOHg4VW5vcm1TUkdCOiAnYXN0Yy04eDgtdW5vcm0tc3JnYicsXHJcblx0QVNUQzEweDVVbm9ybTogJ2FzdGMtMTB4NS11bm9ybScsXHJcblx0QVNUQzEweDVVbm9ybVNSR0I6ICdhc3RjLTEweDUtdW5vcm0tc3JnYicsXHJcblx0QVNUQzEweDZVbm9ybTogJ2FzdGMtMTB4Ni11bm9ybScsXHJcblx0QVNUQzEweDZVbm9ybVNSR0I6ICdhc3RjLTEweDYtdW5vcm0tc3JnYicsXHJcblx0QVNUQzEweDhVbm9ybTogJ2FzdGMtMTB4OC11bm9ybScsXHJcblx0QVNUQzEweDhVbm9ybVNSR0I6ICdhc3RjLTEweDgtdW5vcm0tc3JnYicsXHJcblx0QVNUQzEweDEwVW5vcm06ICdhc3RjLTEweDEwLXVub3JtJyxcclxuXHRBU1RDMTB4MTBVbm9ybVNSR0I6ICdhc3RjLTEweDEwLXVub3JtLXNyZ2InLFxyXG5cdEFTVEMxMngxMFVub3JtOiAnYXN0Yy0xMngxMC11bm9ybScsXHJcblx0QVNUQzEyeDEwVW5vcm1TUkdCOiAnYXN0Yy0xMngxMC11bm9ybS1zcmdiJyxcclxuXHRBU1RDMTJ4MTJVbm9ybTogJ2FzdGMtMTJ4MTItdW5vcm0nLFxyXG5cdEFTVEMxMngxMlVub3JtU1JHQjogJ2FzdGMtMTJ4MTItdW5vcm0tc3JnYicsXHJcblxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IEdQVUFkZHJlc3NNb2RlID0ge1xyXG5cdENsYW1wVG9FZGdlOiAnY2xhbXAtdG8tZWRnZScsXHJcblx0UmVwZWF0OiAncmVwZWF0JyxcclxuXHRNaXJyb3JSZXBlYXQ6ICdtaXJyb3ItcmVwZWF0J1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IEdQVUZpbHRlck1vZGUgPSB7XHJcblx0TGluZWFyOiAnbGluZWFyJyxcclxuXHROZWFyZXN0OiAnbmVhcmVzdCdcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBHUFVCbGVuZEZhY3RvciA9IHtcclxuXHRaZXJvOiAnemVybycsXHJcblx0T25lOiAnb25lJyxcclxuXHRTcmM6ICdzcmMnLFxyXG5cdE9uZU1pbnVzU3JjOiAnb25lLW1pbnVzLXNyYycsXHJcblx0U3JjQWxwaGE6ICdzcmMtYWxwaGEnLFxyXG5cdE9uZU1pbnVzU3JjQWxwaGE6ICdvbmUtbWludXMtc3JjLWFscGhhJyxcclxuXHREc3Q6ICdkc3QnLFxyXG5cdE9uZU1pbnVzRHN0Q29sb3I6ICdvbmUtbWludXMtZHN0JyxcclxuXHREc3RBbHBoYTogJ2RzdC1hbHBoYScsXHJcblx0T25lTWludXNEc3RBbHBoYTogJ29uZS1taW51cy1kc3QtYWxwaGEnLFxyXG5cdFNyY0FscGhhU2F0dXJhdGVkOiAnc3JjLWFscGhhLXNhdHVyYXRlZCcsXHJcblx0Q29uc3RhbnQ6ICdjb25zdGFudCcsXHJcblx0T25lTWludXNDb25zdGFudDogJ29uZS1taW51cy1jb25zdGFudCdcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBHUFVCbGVuZE9wZXJhdGlvbiA9IHtcclxuXHRBZGQ6ICdhZGQnLFxyXG5cdFN1YnRyYWN0OiAnc3VidHJhY3QnLFxyXG5cdFJldmVyc2VTdWJ0cmFjdDogJ3JldmVyc2Utc3VidHJhY3QnLFxyXG5cdE1pbjogJ21pbicsXHJcblx0TWF4OiAnbWF4J1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IEdQVUNvbG9yV3JpdGVGbGFncyA9IHtcclxuXHROb25lOiAwLFxyXG5cdFJlZDogMHgxLFxyXG5cdEdyZWVuOiAweDIsXHJcblx0Qmx1ZTogMHg0LFxyXG5cdEFscGhhOiAweDgsXHJcblx0QWxsOiAweEZcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBHUFVTdGVuY2lsT3BlcmF0aW9uID0ge1xyXG5cdEtlZXA6ICdrZWVwJyxcclxuXHRaZXJvOiAnemVybycsXHJcblx0UmVwbGFjZTogJ3JlcGxhY2UnLFxyXG5cdEludmVydDogJ2ludmVydCcsXHJcblx0SW5jcmVtZW50Q2xhbXA6ICdpbmNyZW1lbnQtY2xhbXAnLFxyXG5cdERlY3JlbWVudENsYW1wOiAnZGVjcmVtZW50LWNsYW1wJyxcclxuXHRJbmNyZW1lbnRXcmFwOiAnaW5jcmVtZW50LXdyYXAnLFxyXG5cdERlY3JlbWVudFdyYXA6ICdkZWNyZW1lbnQtd3JhcCdcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBHUFVCdWZmZXJCaW5kaW5nVHlwZSA9IHtcclxuXHRVbmlmb3JtOiAndW5pZm9ybScsXHJcblx0U3RvcmFnZTogJ3N0b3JhZ2UnLFxyXG5cdFJlYWRPbmx5U3RvcmFnZTogJ3JlYWQtb25seS1zdG9yYWdlJ1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IEdQVVN0b3JhZ2VUZXh0dXJlQWNjZXNzID0ge1xyXG5cdFdyaXRlT25seTogJ3dyaXRlLW9ubHknLFxyXG5cdFJlYWRPbmx5OiAncmVhZC1vbmx5JyxcclxuXHRSZWFkV3JpdGU6ICdyZWFkLXdyaXRlJyxcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBHUFVTYW1wbGVyQmluZGluZ1R5cGUgPSB7XHJcblx0RmlsdGVyaW5nOiAnZmlsdGVyaW5nJyxcclxuXHROb25GaWx0ZXJpbmc6ICdub24tZmlsdGVyaW5nJyxcclxuXHRDb21wYXJpc29uOiAnY29tcGFyaXNvbidcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBHUFVUZXh0dXJlU2FtcGxlVHlwZSA9IHtcclxuXHRGbG9hdDogJ2Zsb2F0JyxcclxuXHRVbmZpbHRlcmFibGVGbG9hdDogJ3VuZmlsdGVyYWJsZS1mbG9hdCcsXHJcblx0RGVwdGg6ICdkZXB0aCcsXHJcblx0U0ludDogJ3NpbnQnLFxyXG5cdFVJbnQ6ICd1aW50J1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IEdQVVRleHR1cmVEaW1lbnNpb24gPSB7XHJcblx0T25lRDogJzFkJyxcclxuXHRUd29EOiAnMmQnLFxyXG5cdFRocmVlRDogJzNkJ1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IEdQVVRleHR1cmVWaWV3RGltZW5zaW9uID0ge1xyXG5cdE9uZUQ6ICcxZCcsXHJcblx0VHdvRDogJzJkJyxcclxuXHRUd29EQXJyYXk6ICcyZC1hcnJheScsXHJcblx0Q3ViZTogJ2N1YmUnLFxyXG5cdEN1YmVBcnJheTogJ2N1YmUtYXJyYXknLFxyXG5cdFRocmVlRDogJzNkJ1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IEdQVVRleHR1cmVBc3BlY3QgPSB7XHJcblx0QWxsOiAnYWxsJyxcclxuXHRTdGVuY2lsT25seTogJ3N0ZW5jaWwtb25seScsXHJcblx0RGVwdGhPbmx5OiAnZGVwdGgtb25seSdcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBHUFVJbnB1dFN0ZXBNb2RlID0ge1xyXG5cdFZlcnRleDogJ3ZlcnRleCcsXHJcblx0SW5zdGFuY2U6ICdpbnN0YW5jZSdcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBHUFVGZWF0dXJlTmFtZSA9IHtcclxuXHREZXB0aENsaXBDb250cm9sOiAnZGVwdGgtY2xpcC1jb250cm9sJyxcclxuXHREZXB0aDMyRmxvYXRTdGVuY2lsODogJ2RlcHRoMzJmbG9hdC1zdGVuY2lsOCcsXHJcblx0VGV4dHVyZUNvbXByZXNzaW9uQkM6ICd0ZXh0dXJlLWNvbXByZXNzaW9uLWJjJyxcclxuXHRUZXh0dXJlQ29tcHJlc3Npb25FVEMyOiAndGV4dHVyZS1jb21wcmVzc2lvbi1ldGMyJyxcclxuXHRUZXh0dXJlQ29tcHJlc3Npb25BU1RDOiAndGV4dHVyZS1jb21wcmVzc2lvbi1hc3RjJyxcclxuXHRUaW1lc3RhbXBRdWVyeTogJ3RpbWVzdGFtcC1xdWVyeScsXHJcblx0SW5kaXJlY3RGaXJzdEluc3RhbmNlOiAnaW5kaXJlY3QtZmlyc3QtaW5zdGFuY2UnLFxyXG5cdFNoYWRlckYxNjogJ3NoYWRlci1mMTYnLFxyXG5cdFJHMTFCMTBVRmxvYXQ6ICdyZzExYjEwdWZsb2F0LXJlbmRlcmFibGUnLFxyXG5cdEJHUkE4VU5vcm1TdG9yYWdlOiAnYmdyYTh1bm9ybS1zdG9yYWdlJyxcclxuXHRGbG9hdDMyRmlsdGVyYWJsZTogJ2Zsb2F0MzItZmlsdGVyYWJsZScsXHJcblx0Q2xpcERpc3RhbmNlczogJ2NsaXAtZGlzdGFuY2VzJyxcclxuXHREdWFsU291cmNlQmxlbmRpbmc6ICdkdWFsLXNvdXJjZS1ibGVuZGluZycsXHJcblx0U3ViZ3JvdXBzOiAnc3ViZ3JvdXBzJ1xyXG59O1xyXG4iLCJpbXBvcnQgQmluZGluZyBmcm9tICcuL0JpbmRpbmcuanMnO1xyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgYSBzYW1wbGVyIGJpbmRpbmcgdHlwZS5cclxuICpcclxuICogQHByaXZhdGVcclxuICogQGF1Z21lbnRzIEJpbmRpbmdcclxuICovXHJcbmNsYXNzIFNhbXBsZXIgZXh0ZW5kcyBCaW5kaW5nIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBzYW1wbGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgc2FtcGxlcnMncyBuYW1lLlxyXG5cdCAqIEBwYXJhbSB7P1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZSB0aGlzIGJpbmRpbmcgaXMgcmVmZXJyaW5nIHRvLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBuYW1lLCB0ZXh0dXJlICkge1xyXG5cclxuXHRcdHN1cGVyKCBuYW1lICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdGV4dHVyZSB0aGUgc2FtcGxlciBpcyByZWZlcnJpbmcgdG8uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRleHR1cmUgPSB0ZXh0dXJlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGJpbmRpbmcncyB2ZXJzaW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudmVyc2lvbiA9IHRleHR1cmUgPyB0ZXh0dXJlLnZlcnNpb24gOiAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1NhbXBsZXIgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTYW1wbGVyO1xyXG4iLCJpbXBvcnQgU2FtcGxlciBmcm9tICcuLi9TYW1wbGVyLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIHNwZWNpYWwgZm9ybSBvZiBzYW1wbGVyIGJpbmRpbmcgdHlwZS5cclxuICogSXQncyB0ZXh0dXJlIHZhbHVlIGlzIG1hbmFnZWQgYnkgYSBub2RlIG9iamVjdC5cclxuICpcclxuICogQHByaXZhdGVcclxuICogQGF1Z21lbnRzIFNhbXBsZXJcclxuICovXHJcbmNsYXNzIE5vZGVTYW1wbGVyIGV4dGVuZHMgU2FtcGxlciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbm9kZS1iYXNlZCBzYW1wbGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgc2FtcGxlcnMncyBuYW1lLlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZU5vZGV9IHRleHR1cmVOb2RlIC0gVGhlIHRleHR1cmUgbm9kZS5cclxuXHQgKiBAcGFyYW0ge1VuaWZvcm1Hcm91cE5vZGV9IGdyb3VwTm9kZSAtIFRoZSB1bmlmb3JtIGdyb3VwIG5vZGUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5hbWUsIHRleHR1cmVOb2RlLCBncm91cE5vZGUgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5hbWUsIHRleHR1cmVOb2RlID8gdGV4dHVyZU5vZGUudmFsdWUgOiBudWxsICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdGV4dHVyZSBub2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtUZXh0dXJlTm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50ZXh0dXJlTm9kZSA9IHRleHR1cmVOb2RlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHVuaWZvcm0gZ3JvdXAgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VW5pZm9ybUdyb3VwTm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ncm91cE5vZGUgPSBncm91cE5vZGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgdGV4dHVyZSB2YWx1ZSBvZiB0aGlzIHNhbXBsZXIuXHJcblx0ICovXHJcblx0dXBkYXRlKCkge1xyXG5cclxuXHRcdHRoaXMudGV4dHVyZSA9IHRoaXMudGV4dHVyZU5vZGUudmFsdWU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IE5vZGVTYW1wbGVyO1xyXG4iLCJpbXBvcnQgQnVmZmVyIGZyb20gJy4vQnVmZmVyLmpzJztcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIGEgc3RvcmFnZSBidWZmZXIgYmluZGluZyB0eXBlLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAYXVnbWVudHMgQnVmZmVyXHJcbiAqL1xyXG5jbGFzcyBTdG9yYWdlQnVmZmVyIGV4dGVuZHMgQnVmZmVyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB1bmlmb3JtIGJ1ZmZlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIGJ1ZmZlcidzIG5hbWUuXHJcblx0ICogQHBhcmFtIHtCdWZmZXJBdHRyaWJ1dGV9IGF0dHJpYnV0ZSAtIFRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBuYW1lLCBhdHRyaWJ1dGUgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5hbWUsIGF0dHJpYnV0ZSA/IGF0dHJpYnV0ZS5hcnJheSA6IG51bGwgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtCdWZmZXJBdHRyaWJ1dGV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYXR0cmlidXRlID0gYXR0cmlidXRlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1N0b3JhZ2VCdWZmZXIgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTdG9yYWdlQnVmZmVyO1xyXG4iLCJpbXBvcnQgU3RvcmFnZUJ1ZmZlciBmcm9tICcuLi9TdG9yYWdlQnVmZmVyLmpzJztcclxuaW1wb3J0IHsgTm9kZUFjY2VzcyB9IGZyb20gJy4uLy4uLy4uL25vZGVzL2NvcmUvY29uc3RhbnRzLmpzJztcclxuXHJcbmxldCBfaWQgPSAwO1xyXG5cclxuLyoqXHJcbiAqIEEgc3BlY2lhbCBmb3JtIG9mIHN0b3JhZ2UgYnVmZmVyIGJpbmRpbmcgdHlwZS5cclxuICogSXQncyBidWZmZXIgdmFsdWUgaXMgbWFuYWdlZCBieSBhIG5vZGUgb2JqZWN0LlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAYXVnbWVudHMgU3RvcmFnZUJ1ZmZlclxyXG4gKi9cclxuY2xhc3MgTm9kZVN0b3JhZ2VCdWZmZXIgZXh0ZW5kcyBTdG9yYWdlQnVmZmVyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBub2RlLWJhc2VkIHN0b3JhZ2UgYnVmZmVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTdG9yYWdlQnVmZmVyTm9kZX0gbm9kZVVuaWZvcm0gLSBUaGUgc3RvcmFnZSBidWZmZXIgbm9kZS5cclxuXHQgKiBAcGFyYW0ge1VuaWZvcm1Hcm91cE5vZGV9IGdyb3VwTm9kZSAtIFRoZSB1bmlmb3JtIGdyb3VwIG5vZGUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5vZGVVbmlmb3JtLCBncm91cE5vZGUgKSB7XHJcblxyXG5cdFx0c3VwZXIoICdTdG9yYWdlQnVmZmVyXycgKyBfaWQgKyssIG5vZGVVbmlmb3JtID8gbm9kZVVuaWZvcm0udmFsdWUgOiBudWxsICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbm9kZSB1bmlmb3JtLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtTdG9yYWdlQnVmZmVyTm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub2RlVW5pZm9ybSA9IG5vZGVVbmlmb3JtO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGFjY2VzcyB0eXBlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYWNjZXNzID0gbm9kZVVuaWZvcm0gPyBub2RlVW5pZm9ybS5hY2Nlc3MgOiBOb2RlQWNjZXNzLlJFQURfV1JJVEU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdW5pZm9ybSBncm91cCBub2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtVbmlmb3JtR3JvdXBOb2RlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdyb3VwTm9kZSA9IGdyb3VwTm9kZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgc3RvcmFnZSBidWZmZXIuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7QnVmZmVyQXR0cmlidXRlfVxyXG5cdCAqL1xyXG5cdGdldCBidWZmZXIoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubm9kZVVuaWZvcm0udmFsdWU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IE5vZGVTdG9yYWdlQnVmZmVyO1xyXG4iLCJpbXBvcnQgRGF0YU1hcCBmcm9tICcuLi8uLi9jb21tb24vRGF0YU1hcC5qcyc7XHJcbmltcG9ydCB7IEdQVVRleHR1cmVWaWV3RGltZW5zaW9uLCBHUFVJbmRleEZvcm1hdCwgR1BVRmlsdGVyTW9kZSwgR1BVUHJpbWl0aXZlVG9wb2xvZ3ksIEdQVUxvYWRPcCwgR1BVU3RvcmVPcCB9IGZyb20gJy4vV2ViR1BVQ29uc3RhbnRzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIFdlYkdQVSBiYWNrZW5kIHV0aWxpdHkgbW9kdWxlIHVzZWQgYnkge0BsaW5rIFdlYkdQVVRleHR1cmVVdGlsc30uXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5jbGFzcyBXZWJHUFVUZXh0dXJlUGFzc1V0aWxzIGV4dGVuZHMgRGF0YU1hcCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgdXRpbGl0eSBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0dQVURldmljZX0gZGV2aWNlIC0gVGhlIFdlYkdQVSBkZXZpY2UuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGRldmljZSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIFdlYkdQVSBkZXZpY2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0dQVURldmljZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kZXZpY2UgPSBkZXZpY2U7XHJcblxyXG5cdFx0Y29uc3QgbWlwbWFwVmVydGV4U291cmNlID0gYFxyXG5zdHJ1Y3QgVmFyeXNTdHJ1Y3Qge1xyXG5cdEBidWlsdGluKCBwb3NpdGlvbiApIFBvc2l0aW9uOiB2ZWM0PGYzMj4sXHJcblx0QGxvY2F0aW9uKCAwICkgdlRleCA6IHZlYzI8ZjMyPlxyXG59O1xyXG5cclxuQHZlcnRleFxyXG5mbiBtYWluKCBAYnVpbHRpbiggdmVydGV4X2luZGV4ICkgdmVydGV4SW5kZXggOiB1MzIgKSAtPiBWYXJ5c1N0cnVjdCB7XHJcblxyXG5cdHZhciBWYXJ5cyA6IFZhcnlzU3RydWN0O1xyXG5cclxuXHR2YXIgcG9zID0gYXJyYXk8IHZlYzI8ZjMyPiwgNCA+KFxyXG5cdFx0dmVjMjxmMzI+KCAtMS4wLCAgMS4wICksXHJcblx0XHR2ZWMyPGYzMj4oICAxLjAsICAxLjAgKSxcclxuXHRcdHZlYzI8ZjMyPiggLTEuMCwgLTEuMCApLFxyXG5cdFx0dmVjMjxmMzI+KCAgMS4wLCAtMS4wIClcclxuXHQpO1xyXG5cclxuXHR2YXIgdGV4ID0gYXJyYXk8IHZlYzI8ZjMyPiwgNCA+KFxyXG5cdFx0dmVjMjxmMzI+KCAwLjAsIDAuMCApLFxyXG5cdFx0dmVjMjxmMzI+KCAxLjAsIDAuMCApLFxyXG5cdFx0dmVjMjxmMzI+KCAwLjAsIDEuMCApLFxyXG5cdFx0dmVjMjxmMzI+KCAxLjAsIDEuMCApXHJcblx0KTtcclxuXHJcblx0VmFyeXMudlRleCA9IHRleFsgdmVydGV4SW5kZXggXTtcclxuXHRWYXJ5cy5Qb3NpdGlvbiA9IHZlYzQ8ZjMyPiggcG9zWyB2ZXJ0ZXhJbmRleCBdLCAwLjAsIDEuMCApO1xyXG5cclxuXHRyZXR1cm4gVmFyeXM7XHJcblxyXG59XHJcbmA7XHJcblxyXG5cdFx0Y29uc3QgbWlwbWFwRnJhZ21lbnRTb3VyY2UgPSBgXHJcbkBncm91cCggMCApIEBiaW5kaW5nKCAwIClcclxudmFyIGltZ1NhbXBsZXIgOiBzYW1wbGVyO1xyXG5cclxuQGdyb3VwKCAwICkgQGJpbmRpbmcoIDEgKVxyXG52YXIgaW1nIDogdGV4dHVyZV8yZDxmMzI+O1xyXG5cclxuQGZyYWdtZW50XHJcbmZuIG1haW4oIEBsb2NhdGlvbiggMCApIHZUZXggOiB2ZWMyPGYzMj4gKSAtPiBAbG9jYXRpb24oIDAgKSB2ZWM0PGYzMj4ge1xyXG5cclxuXHRyZXR1cm4gdGV4dHVyZVNhbXBsZSggaW1nLCBpbWdTYW1wbGVyLCB2VGV4ICk7XHJcblxyXG59XHJcbmA7XHJcblxyXG5cdFx0Y29uc3QgZmxpcFlGcmFnbWVudFNvdXJjZSA9IGBcclxuQGdyb3VwKCAwICkgQGJpbmRpbmcoIDAgKVxyXG52YXIgaW1nU2FtcGxlciA6IHNhbXBsZXI7XHJcblxyXG5AZ3JvdXAoIDAgKSBAYmluZGluZyggMSApXHJcbnZhciBpbWcgOiB0ZXh0dXJlXzJkPGYzMj47XHJcblxyXG5AZnJhZ21lbnRcclxuZm4gbWFpbiggQGxvY2F0aW9uKCAwICkgdlRleCA6IHZlYzI8ZjMyPiApIC0+IEBsb2NhdGlvbiggMCApIHZlYzQ8ZjMyPiB7XHJcblxyXG5cdHJldHVybiB0ZXh0dXJlU2FtcGxlKCBpbWcsIGltZ1NhbXBsZXIsIHZlYzIoIHZUZXgueCwgMS4wIC0gdlRleC55ICkgKTtcclxuXHJcbn1cclxuYDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBtaXBtYXAgR1BVIHNhbXBsZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0dQVVNhbXBsZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWlwbWFwU2FtcGxlciA9IGRldmljZS5jcmVhdGVTYW1wbGVyKCB7IG1pbkZpbHRlcjogR1BVRmlsdGVyTW9kZS5MaW5lYXIgfSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGZsaXBZIEdQVSBzYW1wbGVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtHUFVTYW1wbGVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZsaXBZU2FtcGxlciA9IGRldmljZS5jcmVhdGVTYW1wbGVyKCB7IG1pbkZpbHRlcjogR1BVRmlsdGVyTW9kZS5OZWFyZXN0IH0gKTsgLy9AVE9ETz86IENvbnNpZGVyIHVzaW5nIHRleHR1cmVMb2FkKClcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgY2FjaGUgZm9yIEdQVSByZW5kZXIgcGlwZWxpbmVzIHVzZWQgZm9yIGNvcHkvdHJhbnNmZXIgcGFzc2VzLlxyXG5cdFx0ICogRXZlcnkgdGV4dHVyZSBmb3JtYXQgcmVxdWlyZXMgYSB1bmlxdWUgcGlwZWxpbmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdDxzdHJpbmcsR1BVUmVuZGVyUGlwZWxpbmU+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRyYW5zZmVyUGlwZWxpbmVzID0ge307XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGNhY2hlIGZvciBHUFUgcmVuZGVyIHBpcGVsaW5lcyB1c2VkIGZvciBmbGlwWSBwYXNzZXMuXHJcblx0XHQgKiBFdmVyeSB0ZXh0dXJlIGZvcm1hdCByZXF1aXJlcyBhIHVuaXF1ZSBwaXBlbGluZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0PHN0cmluZyxHUFVSZW5kZXJQaXBlbGluZT59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZmxpcFlQaXBlbGluZXMgPSB7fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBtaXBtYXAgdmVydGV4IHNoYWRlciBtb2R1bGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0dQVVNoYWRlck1vZHVsZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5taXBtYXBWZXJ0ZXhTaGFkZXJNb2R1bGUgPSBkZXZpY2UuY3JlYXRlU2hhZGVyTW9kdWxlKCB7XHJcblx0XHRcdGxhYmVsOiAnbWlwbWFwVmVydGV4JyxcclxuXHRcdFx0Y29kZTogbWlwbWFwVmVydGV4U291cmNlXHJcblx0XHR9ICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbWlwbWFwIGZyYWdtZW50IHNoYWRlciBtb2R1bGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0dQVVNoYWRlck1vZHVsZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5taXBtYXBGcmFnbWVudFNoYWRlck1vZHVsZSA9IGRldmljZS5jcmVhdGVTaGFkZXJNb2R1bGUoIHtcclxuXHRcdFx0bGFiZWw6ICdtaXBtYXBGcmFnbWVudCcsXHJcblx0XHRcdGNvZGU6IG1pcG1hcEZyYWdtZW50U291cmNlXHJcblx0XHR9ICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZmxpcFkgZnJhZ21lbnQgc2hhZGVyIG1vZHVsZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7R1BVU2hhZGVyTW9kdWxlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZsaXBZRnJhZ21lbnRTaGFkZXJNb2R1bGUgPSBkZXZpY2UuY3JlYXRlU2hhZGVyTW9kdWxlKCB7XHJcblx0XHRcdGxhYmVsOiAnZmxpcFlGcmFnbWVudCcsXHJcblx0XHRcdGNvZGU6IGZsaXBZRnJhZ21lbnRTb3VyY2VcclxuXHRcdH0gKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgcmVuZGVyIHBpcGVsaW5lIGZvciB0aGUgaW50ZXJuYWwgY29weSByZW5kZXIgcGFzcy4gVGhlIHBhc3NcclxuXHQgKiByZXF1aXJlcyBhIHVuaXF1ZSByZW5kZXIgcGlwZWxpbmUgZm9yIGVhY2ggdGV4dHVyZSBmb3JtYXQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gZm9ybWF0IC0gVGhlIEdQVSB0ZXh0dXJlIGZvcm1hdFxyXG5cdCAqIEByZXR1cm4ge0dQVVJlbmRlclBpcGVsaW5lfSBUaGUgR1BVIHJlbmRlciBwaXBlbGluZS5cclxuXHQgKi9cclxuXHRnZXRUcmFuc2ZlclBpcGVsaW5lKCBmb3JtYXQgKSB7XHJcblxyXG5cdFx0bGV0IHBpcGVsaW5lID0gdGhpcy50cmFuc2ZlclBpcGVsaW5lc1sgZm9ybWF0IF07XHJcblxyXG5cdFx0aWYgKCBwaXBlbGluZSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0cGlwZWxpbmUgPSB0aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZSgge1xyXG5cdFx0XHRcdGxhYmVsOiBgbWlwbWFwLSR7IGZvcm1hdCB9YCxcclxuXHRcdFx0XHR2ZXJ0ZXg6IHtcclxuXHRcdFx0XHRcdG1vZHVsZTogdGhpcy5taXBtYXBWZXJ0ZXhTaGFkZXJNb2R1bGUsXHJcblx0XHRcdFx0XHRlbnRyeVBvaW50OiAnbWFpbidcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdGZyYWdtZW50OiB7XHJcblx0XHRcdFx0XHRtb2R1bGU6IHRoaXMubWlwbWFwRnJhZ21lbnRTaGFkZXJNb2R1bGUsXHJcblx0XHRcdFx0XHRlbnRyeVBvaW50OiAnbWFpbicsXHJcblx0XHRcdFx0XHR0YXJnZXRzOiBbIHsgZm9ybWF0IH0gXVxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0cHJpbWl0aXZlOiB7XHJcblx0XHRcdFx0XHR0b3BvbG9neTogR1BVUHJpbWl0aXZlVG9wb2xvZ3kuVHJpYW5nbGVTdHJpcCxcclxuXHRcdFx0XHRcdHN0cmlwSW5kZXhGb3JtYXQ6IEdQVUluZGV4Rm9ybWF0LlVpbnQzMlxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0bGF5b3V0OiAnYXV0bydcclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdFx0dGhpcy50cmFuc2ZlclBpcGVsaW5lc1sgZm9ybWF0IF0gPSBwaXBlbGluZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHBpcGVsaW5lO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSByZW5kZXIgcGlwZWxpbmUgZm9yIHRoZSBmbGlwWSByZW5kZXIgcGFzcy4gVGhlIHBhc3NcclxuXHQgKiByZXF1aXJlcyBhIHVuaXF1ZSByZW5kZXIgcGlwZWxpbmUgZm9yIGVhY2ggdGV4dHVyZSBmb3JtYXQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gZm9ybWF0IC0gVGhlIEdQVSB0ZXh0dXJlIGZvcm1hdFxyXG5cdCAqIEByZXR1cm4ge0dQVVJlbmRlclBpcGVsaW5lfSBUaGUgR1BVIHJlbmRlciBwaXBlbGluZS5cclxuXHQgKi9cclxuXHRnZXRGbGlwWVBpcGVsaW5lKCBmb3JtYXQgKSB7XHJcblxyXG5cdFx0bGV0IHBpcGVsaW5lID0gdGhpcy5mbGlwWVBpcGVsaW5lc1sgZm9ybWF0IF07XHJcblxyXG5cdFx0aWYgKCBwaXBlbGluZSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0cGlwZWxpbmUgPSB0aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZSgge1xyXG5cdFx0XHRcdGxhYmVsOiBgZmxpcFktJHsgZm9ybWF0IH1gLFxyXG5cdFx0XHRcdHZlcnRleDoge1xyXG5cdFx0XHRcdFx0bW9kdWxlOiB0aGlzLm1pcG1hcFZlcnRleFNoYWRlck1vZHVsZSxcclxuXHRcdFx0XHRcdGVudHJ5UG9pbnQ6ICdtYWluJ1xyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0ZnJhZ21lbnQ6IHtcclxuXHRcdFx0XHRcdG1vZHVsZTogdGhpcy5mbGlwWUZyYWdtZW50U2hhZGVyTW9kdWxlLFxyXG5cdFx0XHRcdFx0ZW50cnlQb2ludDogJ21haW4nLFxyXG5cdFx0XHRcdFx0dGFyZ2V0czogWyB7IGZvcm1hdCB9IF1cclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdHByaW1pdGl2ZToge1xyXG5cdFx0XHRcdFx0dG9wb2xvZ3k6IEdQVVByaW1pdGl2ZVRvcG9sb2d5LlRyaWFuZ2xlU3RyaXAsXHJcblx0XHRcdFx0XHRzdHJpcEluZGV4Rm9ybWF0OiBHUFVJbmRleEZvcm1hdC5VaW50MzJcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdGxheW91dDogJ2F1dG8nXHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHRcdHRoaXMuZmxpcFlQaXBlbGluZXNbIGZvcm1hdCBdID0gcGlwZWxpbmU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBwaXBlbGluZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGbGlwIHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4gR1BVIHRleHR1cmUgYWxvbmcgaXRzIHZlcnRpY2FsIGF4aXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0dQVVRleHR1cmV9IHRleHR1cmVHUFUgLSBUaGUgR1BVIHRleHR1cmUgb2JqZWN0LlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSB0ZXh0dXJlR1BVRGVzY3JpcHRvciAtIFRoZSB0ZXh0dXJlIGRlc2NyaXB0b3IuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtiYXNlQXJyYXlMYXllcj0wXSAtIFRoZSBpbmRleCBvZiB0aGUgZmlyc3QgYXJyYXkgbGF5ZXIgYWNjZXNzaWJsZSB0byB0aGUgdGV4dHVyZSB2aWV3LlxyXG5cdCAqL1xyXG5cdGZsaXBZKCB0ZXh0dXJlR1BVLCB0ZXh0dXJlR1BVRGVzY3JpcHRvciwgYmFzZUFycmF5TGF5ZXIgPSAwICkge1xyXG5cclxuXHRcdGNvbnN0IGZvcm1hdCA9IHRleHR1cmVHUFVEZXNjcmlwdG9yLmZvcm1hdDtcclxuXHRcdGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gdGV4dHVyZUdQVURlc2NyaXB0b3Iuc2l6ZTtcclxuXHJcblx0XHRjb25zdCB0cmFuc2ZlclBpcGVsaW5lID0gdGhpcy5nZXRUcmFuc2ZlclBpcGVsaW5lKCBmb3JtYXQgKTtcclxuXHRcdGNvbnN0IGZsaXBZUGlwZWxpbmUgPSB0aGlzLmdldEZsaXBZUGlwZWxpbmUoIGZvcm1hdCApO1xyXG5cclxuXHRcdGNvbnN0IHRlbXBUZXh0dXJlID0gdGhpcy5kZXZpY2UuY3JlYXRlVGV4dHVyZSgge1xyXG5cdFx0XHRzaXplOiB7IHdpZHRoLCBoZWlnaHQsIGRlcHRoT3JBcnJheUxheWVyczogMSB9LFxyXG5cdFx0XHRmb3JtYXQsXHJcblx0XHRcdHVzYWdlOiBHUFVUZXh0dXJlVXNhZ2UuUkVOREVSX0FUVEFDSE1FTlQgfCBHUFVUZXh0dXJlVXNhZ2UuVEVYVFVSRV9CSU5ESU5HXHJcblx0XHR9ICk7XHJcblxyXG5cdFx0Y29uc3Qgc3JjVmlldyA9IHRleHR1cmVHUFUuY3JlYXRlVmlldygge1xyXG5cdFx0XHRiYXNlTWlwTGV2ZWw6IDAsXHJcblx0XHRcdG1pcExldmVsQ291bnQ6IDEsXHJcblx0XHRcdGRpbWVuc2lvbjogR1BVVGV4dHVyZVZpZXdEaW1lbnNpb24uVHdvRCxcclxuXHRcdFx0YmFzZUFycmF5TGF5ZXJcclxuXHRcdH0gKTtcclxuXHJcblx0XHRjb25zdCBkc3RWaWV3ID0gdGVtcFRleHR1cmUuY3JlYXRlVmlldygge1xyXG5cdFx0XHRiYXNlTWlwTGV2ZWw6IDAsXHJcblx0XHRcdG1pcExldmVsQ291bnQ6IDEsXHJcblx0XHRcdGRpbWVuc2lvbjogR1BVVGV4dHVyZVZpZXdEaW1lbnNpb24uVHdvRCxcclxuXHRcdFx0YmFzZUFycmF5TGF5ZXI6IDBcclxuXHRcdH0gKTtcclxuXHJcblx0XHRjb25zdCBjb21tYW5kRW5jb2RlciA9IHRoaXMuZGV2aWNlLmNyZWF0ZUNvbW1hbmRFbmNvZGVyKCB7fSApO1xyXG5cclxuXHRcdGNvbnN0IHBhc3MgPSAoIHBpcGVsaW5lLCBzb3VyY2VWaWV3LCBkZXN0aW5hdGlvblZpZXcgKSA9PiB7XHJcblxyXG5cdFx0XHRjb25zdCBiaW5kR3JvdXBMYXlvdXQgPSBwaXBlbGluZS5nZXRCaW5kR3JvdXBMYXlvdXQoIDAgKTsgLy8gQFRPRE86IENvbnNpZGVyIG1ha2luZyB0aGlzIHN0YXRpYy5cclxuXHJcblx0XHRcdGNvbnN0IGJpbmRHcm91cCA9IHRoaXMuZGV2aWNlLmNyZWF0ZUJpbmRHcm91cCgge1xyXG5cdFx0XHRcdGxheW91dDogYmluZEdyb3VwTGF5b3V0LFxyXG5cdFx0XHRcdGVudHJpZXM6IFsge1xyXG5cdFx0XHRcdFx0YmluZGluZzogMCxcclxuXHRcdFx0XHRcdHJlc291cmNlOiB0aGlzLmZsaXBZU2FtcGxlclxyXG5cdFx0XHRcdH0sIHtcclxuXHRcdFx0XHRcdGJpbmRpbmc6IDEsXHJcblx0XHRcdFx0XHRyZXNvdXJjZTogc291cmNlVmlld1xyXG5cdFx0XHRcdH0gXVxyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRjb25zdCBwYXNzRW5jb2RlciA9IGNvbW1hbmRFbmNvZGVyLmJlZ2luUmVuZGVyUGFzcygge1xyXG5cdFx0XHRcdGNvbG9yQXR0YWNobWVudHM6IFsge1xyXG5cdFx0XHRcdFx0dmlldzogZGVzdGluYXRpb25WaWV3LFxyXG5cdFx0XHRcdFx0bG9hZE9wOiBHUFVMb2FkT3AuQ2xlYXIsXHJcblx0XHRcdFx0XHRzdG9yZU9wOiBHUFVTdG9yZU9wLlN0b3JlLFxyXG5cdFx0XHRcdFx0Y2xlYXJWYWx1ZTogWyAwLCAwLCAwLCAwIF1cclxuXHRcdFx0XHR9IF1cclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdFx0cGFzc0VuY29kZXIuc2V0UGlwZWxpbmUoIHBpcGVsaW5lICk7XHJcblx0XHRcdHBhc3NFbmNvZGVyLnNldEJpbmRHcm91cCggMCwgYmluZEdyb3VwICk7XHJcblx0XHRcdHBhc3NFbmNvZGVyLmRyYXcoIDQsIDEsIDAsIDAgKTtcclxuXHRcdFx0cGFzc0VuY29kZXIuZW5kKCk7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHRwYXNzKCB0cmFuc2ZlclBpcGVsaW5lLCBzcmNWaWV3LCBkc3RWaWV3ICk7XHJcblx0XHRwYXNzKCBmbGlwWVBpcGVsaW5lLCBkc3RWaWV3LCBzcmNWaWV3ICk7XHJcblxyXG5cdFx0dGhpcy5kZXZpY2UucXVldWUuc3VibWl0KCBbIGNvbW1hbmRFbmNvZGVyLmZpbmlzaCgpIF0gKTtcclxuXHJcblx0XHR0ZW1wVGV4dHVyZS5kZXN0cm95KCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2VuZXJhdGVzIG1pcG1hcHMgZm9yIHRoZSBnaXZlbiBHUFUgdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7R1BVVGV4dHVyZX0gdGV4dHVyZUdQVSAtIFRoZSBHUFUgdGV4dHVyZSBvYmplY3QuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IHRleHR1cmVHUFVEZXNjcmlwdG9yIC0gVGhlIHRleHR1cmUgZGVzY3JpcHRvci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2Jhc2VBcnJheUxheWVyPTBdIC0gVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBhcnJheSBsYXllciBhY2Nlc3NpYmxlIHRvIHRoZSB0ZXh0dXJlIHZpZXcuXHJcblx0ICovXHJcblx0Z2VuZXJhdGVNaXBtYXBzKCB0ZXh0dXJlR1BVLCB0ZXh0dXJlR1BVRGVzY3JpcHRvciwgYmFzZUFycmF5TGF5ZXIgPSAwICkge1xyXG5cclxuXHRcdGNvbnN0IHRleHR1cmVEYXRhID0gdGhpcy5nZXQoIHRleHR1cmVHUFUgKTtcclxuXHJcblx0XHRpZiAoIHRleHR1cmVEYXRhLnVzZUNvdW50ID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHR0ZXh0dXJlRGF0YS51c2VDb3VudCA9IDA7XHJcblx0XHRcdHRleHR1cmVEYXRhLmxheWVycyA9IFtdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBwYXNzZXMgPSB0ZXh0dXJlRGF0YS5sYXllcnNbIGJhc2VBcnJheUxheWVyIF0gfHwgdGhpcy5fbWlwbWFwQ3JlYXRlQnVuZGxlcyggdGV4dHVyZUdQVSwgdGV4dHVyZUdQVURlc2NyaXB0b3IsIGJhc2VBcnJheUxheWVyICk7XHJcblxyXG5cdFx0Y29uc3QgY29tbWFuZEVuY29kZXIgPSB0aGlzLmRldmljZS5jcmVhdGVDb21tYW5kRW5jb2Rlcigge30gKTtcclxuXHJcblx0XHR0aGlzLl9taXBtYXBSdW5CdW5kbGVzKCBjb21tYW5kRW5jb2RlciwgcGFzc2VzICk7XHJcblxyXG5cdFx0dGhpcy5kZXZpY2UucXVldWUuc3VibWl0KCBbIGNvbW1hbmRFbmNvZGVyLmZpbmlzaCgpIF0gKTtcclxuXHJcblx0XHRpZiAoIHRleHR1cmVEYXRhLnVzZUNvdW50ICE9PSAwICkgdGV4dHVyZURhdGEubGF5ZXJzWyBiYXNlQXJyYXlMYXllciBdID0gcGFzc2VzO1xyXG5cclxuXHRcdHRleHR1cmVEYXRhLnVzZUNvdW50ICsrO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNpbmNlIG11bHRpcGxlIGNvcHkgcmVuZGVyIHBhc3NlcyBhcmUgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgbWlwbWFwcywgdGhlIHBhc3Nlc1xyXG5cdCAqIGFyZSBtYW5hZ2VkIGFzIHJlbmRlciBidW5kbGVzIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0dQVVRleHR1cmV9IHRleHR1cmVHUFUgLSBUaGUgR1BVIHRleHR1cmUgb2JqZWN0LlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSB0ZXh0dXJlR1BVRGVzY3JpcHRvciAtIFRoZSB0ZXh0dXJlIGRlc2NyaXB0b3IuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGJhc2VBcnJheUxheWVyIC0gVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBhcnJheSBsYXllciBhY2Nlc3NpYmxlIHRvIHRoZSB0ZXh0dXJlIHZpZXcuXHJcblx0ICogQHJldHVybiB7QXJyYXk8T2JqZWN0Pn0gQW4gYXJyYXkgb2YgcmVuZGVyIGJ1bmRsZXMuXHJcblx0ICovXHJcblx0X21pcG1hcENyZWF0ZUJ1bmRsZXMoIHRleHR1cmVHUFUsIHRleHR1cmVHUFVEZXNjcmlwdG9yLCBiYXNlQXJyYXlMYXllciApIHtcclxuXHJcblx0XHRjb25zdCBwaXBlbGluZSA9IHRoaXMuZ2V0VHJhbnNmZXJQaXBlbGluZSggdGV4dHVyZUdQVURlc2NyaXB0b3IuZm9ybWF0ICk7XHJcblxyXG5cdFx0Y29uc3QgYmluZEdyb3VwTGF5b3V0ID0gcGlwZWxpbmUuZ2V0QmluZEdyb3VwTGF5b3V0KCAwICk7IC8vIEBUT0RPOiBDb25zaWRlciBtYWtpbmcgdGhpcyBzdGF0aWMuXHJcblxyXG5cdFx0bGV0IHNyY1ZpZXcgPSB0ZXh0dXJlR1BVLmNyZWF0ZVZpZXcoIHtcclxuXHRcdFx0YmFzZU1pcExldmVsOiAwLFxyXG5cdFx0XHRtaXBMZXZlbENvdW50OiAxLFxyXG5cdFx0XHRkaW1lbnNpb246IEdQVVRleHR1cmVWaWV3RGltZW5zaW9uLlR3b0QsXHJcblx0XHRcdGJhc2VBcnJheUxheWVyXHJcblx0XHR9ICk7XHJcblxyXG5cdFx0Y29uc3QgcGFzc2VzID0gW107XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAxOyBpIDwgdGV4dHVyZUdQVURlc2NyaXB0b3IubWlwTGV2ZWxDb3VudDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGJpbmRHcm91cCA9IHRoaXMuZGV2aWNlLmNyZWF0ZUJpbmRHcm91cCgge1xyXG5cdFx0XHRcdGxheW91dDogYmluZEdyb3VwTGF5b3V0LFxyXG5cdFx0XHRcdGVudHJpZXM6IFsge1xyXG5cdFx0XHRcdFx0YmluZGluZzogMCxcclxuXHRcdFx0XHRcdHJlc291cmNlOiB0aGlzLm1pcG1hcFNhbXBsZXJcclxuXHRcdFx0XHR9LCB7XHJcblx0XHRcdFx0XHRiaW5kaW5nOiAxLFxyXG5cdFx0XHRcdFx0cmVzb3VyY2U6IHNyY1ZpZXdcclxuXHRcdFx0XHR9IF1cclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdFx0Y29uc3QgZHN0VmlldyA9IHRleHR1cmVHUFUuY3JlYXRlVmlldygge1xyXG5cdFx0XHRcdGJhc2VNaXBMZXZlbDogaSxcclxuXHRcdFx0XHRtaXBMZXZlbENvdW50OiAxLFxyXG5cdFx0XHRcdGRpbWVuc2lvbjogR1BVVGV4dHVyZVZpZXdEaW1lbnNpb24uVHdvRCxcclxuXHRcdFx0XHRiYXNlQXJyYXlMYXllclxyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRjb25zdCBwYXNzRGVzY3JpcHRvciA9IHtcclxuXHRcdFx0XHRjb2xvckF0dGFjaG1lbnRzOiBbIHtcclxuXHRcdFx0XHRcdHZpZXc6IGRzdFZpZXcsXHJcblx0XHRcdFx0XHRsb2FkT3A6IEdQVUxvYWRPcC5DbGVhcixcclxuXHRcdFx0XHRcdHN0b3JlT3A6IEdQVVN0b3JlT3AuU3RvcmUsXHJcblx0XHRcdFx0XHRjbGVhclZhbHVlOiBbIDAsIDAsIDAsIDAgXVxyXG5cdFx0XHRcdH0gXVxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0Y29uc3QgcGFzc0VuY29kZXIgPSB0aGlzLmRldmljZS5jcmVhdGVSZW5kZXJCdW5kbGVFbmNvZGVyKCB7XHJcblx0XHRcdFx0Y29sb3JGb3JtYXRzOiBbIHRleHR1cmVHUFVEZXNjcmlwdG9yLmZvcm1hdCBdXHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHRcdHBhc3NFbmNvZGVyLnNldFBpcGVsaW5lKCBwaXBlbGluZSApO1xyXG5cdFx0XHRwYXNzRW5jb2Rlci5zZXRCaW5kR3JvdXAoIDAsIGJpbmRHcm91cCApO1xyXG5cdFx0XHRwYXNzRW5jb2Rlci5kcmF3KCA0LCAxLCAwLCAwICk7XHJcblxyXG5cdFx0XHRwYXNzZXMucHVzaCgge1xyXG5cdFx0XHRcdHJlbmRlckJ1bmRsZXM6IFsgcGFzc0VuY29kZXIuZmluaXNoKCkgXSxcclxuXHRcdFx0XHRwYXNzRGVzY3JpcHRvclxyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRzcmNWaWV3ID0gZHN0VmlldztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHBhc3NlcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFeGVjdXRlcyB0aGUgcmVuZGVyIGJ1bmRsZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0dQVUNvbW1hbmRFbmNvZGVyfSBjb21tYW5kRW5jb2RlciAtIFRoZSBHUFUgY29tbWFuZCBlbmNvZGVyLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8T2JqZWN0Pn0gcGFzc2VzIC0gQW4gYXJyYXkgb2YgcmVuZGVyIGJ1bmRsZXMuXHJcblx0ICovXHJcblx0X21pcG1hcFJ1bkJ1bmRsZXMoIGNvbW1hbmRFbmNvZGVyLCBwYXNzZXMgKSB7XHJcblxyXG5cdFx0Y29uc3QgbGV2ZWxzID0gcGFzc2VzLmxlbmd0aDtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBsZXZlbHM7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBwYXNzID0gcGFzc2VzWyBpIF07XHJcblxyXG5cdFx0XHRjb25zdCBwYXNzRW5jb2RlciA9IGNvbW1hbmRFbmNvZGVyLmJlZ2luUmVuZGVyUGFzcyggcGFzcy5wYXNzRGVzY3JpcHRvciApO1xyXG5cclxuXHRcdFx0cGFzc0VuY29kZXIuZXhlY3V0ZUJ1bmRsZXMoIHBhc3MucmVuZGVyQnVuZGxlcyApO1xyXG5cclxuXHRcdFx0cGFzc0VuY29kZXIuZW5kKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBXZWJHUFVUZXh0dXJlUGFzc1V0aWxzO1xyXG4iLCJpbXBvcnQge1xyXG5cdEdQVVRleHR1cmVGb3JtYXQsIEdQVUFkZHJlc3NNb2RlLCBHUFVGaWx0ZXJNb2RlLCBHUFVUZXh0dXJlRGltZW5zaW9uLCBHUFVGZWF0dXJlTmFtZVxyXG59IGZyb20gJy4vV2ViR1BVQ29uc3RhbnRzLmpzJztcclxuXHJcbmltcG9ydCBXZWJHUFVUZXh0dXJlUGFzc1V0aWxzIGZyb20gJy4vV2ViR1BVVGV4dHVyZVBhc3NVdGlscy5qcyc7XHJcblxyXG5pbXBvcnQge1xyXG5cdEJ5dGVUeXBlLCBTaG9ydFR5cGUsXHJcblx0TmVhcmVzdEZpbHRlciwgTmVhcmVzdE1pcG1hcE5lYXJlc3RGaWx0ZXIsIE5lYXJlc3RNaXBtYXBMaW5lYXJGaWx0ZXIsXHJcblx0UmVwZWF0V3JhcHBpbmcsIE1pcnJvcmVkUmVwZWF0V3JhcHBpbmcsXHJcblx0UkdCX0VUQzJfRm9ybWF0LCBSR0JBX0VUQzJfRUFDX0Zvcm1hdCxcclxuXHRSR0JBRm9ybWF0LCBSR0JGb3JtYXQsIFJlZEZvcm1hdCwgUkdGb3JtYXQsIFJHQkFfUzNUQ19EWFQxX0Zvcm1hdCwgUkdCQV9TM1RDX0RYVDNfRm9ybWF0LCBSR0JBX1MzVENfRFhUNV9Gb3JtYXQsIFVuc2lnbmVkQnl0ZVR5cGUsIEZsb2F0VHlwZSwgSGFsZkZsb2F0VHlwZSwgU1JHQkNvbG9yU3BhY2UsIERlcHRoRm9ybWF0LCBEZXB0aFN0ZW5jaWxGb3JtYXQsXHJcblx0UkdCQV9BU1RDXzR4NF9Gb3JtYXQsIFJHQkFfQVNUQ181eDRfRm9ybWF0LCBSR0JBX0FTVENfNXg1X0Zvcm1hdCwgUkdCQV9BU1RDXzZ4NV9Gb3JtYXQsIFJHQkFfQVNUQ182eDZfRm9ybWF0LCBSR0JBX0FTVENfOHg1X0Zvcm1hdCwgUkdCQV9BU1RDXzh4Nl9Gb3JtYXQsIFJHQkFfQVNUQ184eDhfRm9ybWF0LCBSR0JBX0FTVENfMTB4NV9Gb3JtYXQsXHJcblx0UkdCQV9BU1RDXzEweDZfRm9ybWF0LCBSR0JBX0FTVENfMTB4OF9Gb3JtYXQsIFJHQkFfQVNUQ18xMHgxMF9Gb3JtYXQsIFJHQkFfQVNUQ18xMngxMF9Gb3JtYXQsIFJHQkFfQVNUQ18xMngxMl9Gb3JtYXQsIFVuc2lnbmVkSW50VHlwZSwgVW5zaWduZWRTaG9ydFR5cGUsIFVuc2lnbmVkSW50MjQ4VHlwZSwgVW5zaWduZWRJbnQ1OTk5VHlwZSxcclxuXHROZXZlckNvbXBhcmUsIEFsd2F5c0NvbXBhcmUsIExlc3NDb21wYXJlLCBMZXNzRXF1YWxDb21wYXJlLCBFcXVhbENvbXBhcmUsIEdyZWF0ZXJFcXVhbENvbXBhcmUsIEdyZWF0ZXJDb21wYXJlLCBOb3RFcXVhbENvbXBhcmUsIEludFR5cGUsIFJlZEludGVnZXJGb3JtYXQsIFJHSW50ZWdlckZvcm1hdCwgUkdCQUludGVnZXJGb3JtYXQsXHJcblx0Q3ViZVJlZmxlY3Rpb25NYXBwaW5nLCBDdWJlUmVmcmFjdGlvbk1hcHBpbmcsIEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nLCBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZ1xyXG59IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IEN1YmVUZXh0dXJlIH0gZnJvbSAnLi4vLi4vLi4vdGV4dHVyZXMvQ3ViZVRleHR1cmUuanMnO1xyXG5pbXBvcnQgeyBEZXB0aFRleHR1cmUgfSBmcm9tICcuLi8uLi8uLi90ZXh0dXJlcy9EZXB0aFRleHR1cmUuanMnO1xyXG5pbXBvcnQgeyBUZXh0dXJlIH0gZnJvbSAnLi4vLi4vLi4vdGV4dHVyZXMvVGV4dHVyZS5qcyc7XHJcblxyXG5jb25zdCBfY29tcGFyZVRvV2ViR1BVID0ge1xyXG5cdFsgTmV2ZXJDb21wYXJlIF06ICduZXZlcicsXHJcblx0WyBMZXNzQ29tcGFyZSBdOiAnbGVzcycsXHJcblx0WyBFcXVhbENvbXBhcmUgXTogJ2VxdWFsJyxcclxuXHRbIExlc3NFcXVhbENvbXBhcmUgXTogJ2xlc3MtZXF1YWwnLFxyXG5cdFsgR3JlYXRlckNvbXBhcmUgXTogJ2dyZWF0ZXInLFxyXG5cdFsgR3JlYXRlckVxdWFsQ29tcGFyZSBdOiAnZ3JlYXRlci1lcXVhbCcsXHJcblx0WyBBbHdheXNDb21wYXJlIF06ICdhbHdheXMnLFxyXG5cdFsgTm90RXF1YWxDb21wYXJlIF06ICdub3QtZXF1YWwnXHJcbn07XHJcblxyXG5jb25zdCBfZmxpcE1hcCA9IFsgMCwgMSwgMywgMiwgNCwgNSBdO1xyXG5cclxuLyoqXHJcbiAqIEEgV2ViR1BVIGJhY2tlbmQgdXRpbGl0eSBtb2R1bGUgZm9yIG1hbmFnaW5nIHRleHR1cmVzLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuY2xhc3MgV2ViR1BVVGV4dHVyZVV0aWxzIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB1dGlsaXR5IG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7V2ViR1BVQmFja2VuZH0gYmFja2VuZCAtIFRoZSBXZWJHUFUgYmFja2VuZC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggYmFja2VuZCApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIHRoZSBXZWJHUFUgYmFja2VuZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2ViR1BVQmFja2VuZH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5iYWNrZW5kID0gYmFja2VuZDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIHRoZSBwYXNzIHV0aWxzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/V2ViR1BVVGV4dHVyZVBhc3NVdGlsc31cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fcGFzc1V0aWxzID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgZGljdGlvbmFyeSBmb3IgbWFuYWdpbmcgZGVmYXVsdCB0ZXh0dXJlcy4gVGhlIGtleVxyXG5cdFx0ICogaXMgdGhlIHRleHR1cmUgZm9ybWF0LCB0aGUgdmFsdWUgdGhlIHRleHR1cmUgb2JqZWN0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLFRleHR1cmU+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRlZmF1bHRUZXh0dXJlID0ge307XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGRpY3Rpb25hcnkgZm9yIG1hbmFnaW5nIGRlZmF1bHQgY3ViZSB0ZXh0dXJlcy4gVGhlIGtleVxyXG5cdFx0ICogaXMgdGhlIHRleHR1cmUgZm9ybWF0LCB0aGUgdmFsdWUgdGhlIHRleHR1cmUgb2JqZWN0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLEN1YmVUZXh0dXJlPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kZWZhdWx0Q3ViZVRleHR1cmUgPSB7fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgZGVmYXVsdCB2aWRlbyBmcmFtZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1ZpZGVvRnJhbWV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGVmYXVsdFZpZGVvRnJhbWUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVwcmVzZW50cyB0aGUgY29sb3IgYXR0YWNobWVudCBvZiB0aGUgZGVmYXVsdCBmcmFtZWJ1ZmZlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P0dQVVRleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29sb3JCdWZmZXIgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVwcmVzZW50cyB0aGUgZGVwdGggYXR0YWNobWVudCBvZiB0aGUgZGVmYXVsdCBmcmFtZWJ1ZmZlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7RGVwdGhUZXh0dXJlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRlcHRoVGV4dHVyZSA9IG5ldyBEZXB0aFRleHR1cmUoKTtcclxuXHRcdHRoaXMuZGVwdGhUZXh0dXJlLm5hbWUgPSAnZGVwdGhCdWZmZXInO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgYSBHUFUgc2FtcGxlciBmb3IgdGhlIGdpdmVuIHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZSB0byBjcmVhdGUgdGhlIHNhbXBsZXIgZm9yLlxyXG5cdCAqL1xyXG5cdGNyZWF0ZVNhbXBsZXIoIHRleHR1cmUgKSB7XHJcblxyXG5cdFx0Y29uc3QgYmFja2VuZCA9IHRoaXMuYmFja2VuZDtcclxuXHRcdGNvbnN0IGRldmljZSA9IGJhY2tlbmQuZGV2aWNlO1xyXG5cclxuXHRcdGNvbnN0IHRleHR1cmVHUFUgPSBiYWNrZW5kLmdldCggdGV4dHVyZSApO1xyXG5cclxuXHRcdGNvbnN0IHNhbXBsZXJEZXNjcmlwdG9yR1BVID0ge1xyXG5cdFx0XHRhZGRyZXNzTW9kZVU6IHRoaXMuX2NvbnZlcnRBZGRyZXNzTW9kZSggdGV4dHVyZS53cmFwUyApLFxyXG5cdFx0XHRhZGRyZXNzTW9kZVY6IHRoaXMuX2NvbnZlcnRBZGRyZXNzTW9kZSggdGV4dHVyZS53cmFwVCApLFxyXG5cdFx0XHRhZGRyZXNzTW9kZVc6IHRoaXMuX2NvbnZlcnRBZGRyZXNzTW9kZSggdGV4dHVyZS53cmFwUiApLFxyXG5cdFx0XHRtYWdGaWx0ZXI6IHRoaXMuX2NvbnZlcnRGaWx0ZXJNb2RlKCB0ZXh0dXJlLm1hZ0ZpbHRlciApLFxyXG5cdFx0XHRtaW5GaWx0ZXI6IHRoaXMuX2NvbnZlcnRGaWx0ZXJNb2RlKCB0ZXh0dXJlLm1pbkZpbHRlciApLFxyXG5cdFx0XHRtaXBtYXBGaWx0ZXI6IHRoaXMuX2NvbnZlcnRGaWx0ZXJNb2RlKCB0ZXh0dXJlLm1pbkZpbHRlciApLFxyXG5cdFx0XHRtYXhBbmlzb3Ryb3B5OiAxXHJcblx0XHR9O1xyXG5cclxuXHRcdC8vIGFuaXNvdHJvcHkgY2FuIG9ubHkgYmUgdXNlZCB3aGVuIGFsbCBmaWx0ZXIgbW9kZXMgYXJlIHNldCB0byBsaW5lYXIuXHJcblxyXG5cdFx0aWYgKCBzYW1wbGVyRGVzY3JpcHRvckdQVS5tYWdGaWx0ZXIgPT09IEdQVUZpbHRlck1vZGUuTGluZWFyICYmIHNhbXBsZXJEZXNjcmlwdG9yR1BVLm1pbkZpbHRlciA9PT0gR1BVRmlsdGVyTW9kZS5MaW5lYXIgJiYgc2FtcGxlckRlc2NyaXB0b3JHUFUubWlwbWFwRmlsdGVyID09PSBHUFVGaWx0ZXJNb2RlLkxpbmVhciApIHtcclxuXHJcblx0XHRcdHNhbXBsZXJEZXNjcmlwdG9yR1BVLm1heEFuaXNvdHJvcHkgPSB0ZXh0dXJlLmFuaXNvdHJvcHk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGV4dHVyZS5pc0RlcHRoVGV4dHVyZSAmJiB0ZXh0dXJlLmNvbXBhcmVGdW5jdGlvbiAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHNhbXBsZXJEZXNjcmlwdG9yR1BVLmNvbXBhcmUgPSBfY29tcGFyZVRvV2ViR1BVWyB0ZXh0dXJlLmNvbXBhcmVGdW5jdGlvbiBdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0ZXh0dXJlR1BVLnNhbXBsZXIgPSBkZXZpY2UuY3JlYXRlU2FtcGxlciggc2FtcGxlckRlc2NyaXB0b3JHUFUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGEgZGVmYXVsdCB0ZXh0dXJlIGZvciB0aGUgZ2l2ZW4gdGV4dHVyZSB0aGF0IGNhbiBiZSB1c2VkXHJcblx0ICogYXMgYSBwbGFjZWhvbGRlciB1bnRpbCB0aGUgYWN0dWFsIHRleHR1cmUgaXMgcmVhZHkgZm9yIHVzYWdlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUgdG8gY3JlYXRlIGEgZGVmYXVsdCB0ZXh0dXJlIGZvci5cclxuXHQgKi9cclxuXHRjcmVhdGVEZWZhdWx0VGV4dHVyZSggdGV4dHVyZSApIHtcclxuXHJcblx0XHRsZXQgdGV4dHVyZUdQVTtcclxuXHJcblx0XHRjb25zdCBmb3JtYXQgPSBnZXRGb3JtYXQoIHRleHR1cmUgKTtcclxuXHJcblx0XHRpZiAoIHRleHR1cmUuaXNDdWJlVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdHRleHR1cmVHUFUgPSB0aGlzLl9nZXREZWZhdWx0Q3ViZVRleHR1cmVHUFUoIGZvcm1hdCApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHRleHR1cmUuaXNWaWRlb1RleHR1cmUgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmJhY2tlbmQuZ2V0KCB0ZXh0dXJlICkuZXh0ZXJuYWxUZXh0dXJlID0gdGhpcy5fZ2V0RGVmYXVsdFZpZGVvRnJhbWUoKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGV4dHVyZUdQVSA9IHRoaXMuX2dldERlZmF1bHRUZXh0dXJlR1BVKCBmb3JtYXQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5iYWNrZW5kLmdldCggdGV4dHVyZSApLnRleHR1cmUgPSB0ZXh0dXJlR1BVO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgYSB0ZXh0dXJlIG9uIHRoZSBHUFUgZm9yIHRoZSBnaXZlbiB0ZXh0dXJlIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlLlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIHBhcmFtZXRlci5cclxuXHQgKi9cclxuXHRjcmVhdGVUZXh0dXJlKCB0ZXh0dXJlLCBvcHRpb25zID0ge30gKSB7XHJcblxyXG5cdFx0Y29uc3QgYmFja2VuZCA9IHRoaXMuYmFja2VuZDtcclxuXHRcdGNvbnN0IHRleHR1cmVEYXRhID0gYmFja2VuZC5nZXQoIHRleHR1cmUgKTtcclxuXHJcblx0XHRpZiAoIHRleHR1cmVEYXRhLmluaXRpYWxpemVkICkge1xyXG5cclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnV2ViR1BVVGV4dHVyZVV0aWxzOiBUZXh0dXJlIGFscmVhZHkgaW5pdGlhbGl6ZWQuJyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIG9wdGlvbnMubmVlZHNNaXBtYXBzID09PSB1bmRlZmluZWQgKSBvcHRpb25zLm5lZWRzTWlwbWFwcyA9IGZhbHNlO1xyXG5cdFx0aWYgKCBvcHRpb25zLmxldmVscyA9PT0gdW5kZWZpbmVkICkgb3B0aW9ucy5sZXZlbHMgPSAxO1xyXG5cdFx0aWYgKCBvcHRpb25zLmRlcHRoID09PSB1bmRlZmluZWQgKSBvcHRpb25zLmRlcHRoID0gMTtcclxuXHJcblx0XHRjb25zdCB7IHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBsZXZlbHMgfSA9IG9wdGlvbnM7XHJcblxyXG5cdFx0aWYgKCB0ZXh0dXJlLmlzRnJhbWVidWZmZXJUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0aWYgKCBvcHRpb25zLnJlbmRlclRhcmdldCApIHtcclxuXHJcblx0XHRcdFx0b3B0aW9ucy5mb3JtYXQgPSB0aGlzLmJhY2tlbmQudXRpbHMuZ2V0Q3VycmVudENvbG9yRm9ybWF0KCBvcHRpb25zLnJlbmRlclRhcmdldCApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0b3B0aW9ucy5mb3JtYXQgPSB0aGlzLmJhY2tlbmQudXRpbHMuZ2V0UHJlZmVycmVkQ2FudmFzRm9ybWF0KCk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGRpbWVuc2lvbiA9IHRoaXMuX2dldERpbWVuc2lvbiggdGV4dHVyZSApO1xyXG5cdFx0Y29uc3QgZm9ybWF0ID0gdGV4dHVyZS5pbnRlcm5hbEZvcm1hdCB8fCBvcHRpb25zLmZvcm1hdCB8fCBnZXRGb3JtYXQoIHRleHR1cmUsIGJhY2tlbmQuZGV2aWNlICk7XHJcblxyXG5cdFx0dGV4dHVyZURhdGEuZm9ybWF0ID0gZm9ybWF0O1xyXG5cclxuXHRcdGNvbnN0IHsgc2FtcGxlcywgcHJpbWFyeVNhbXBsZXMsIGlzTVNBQSB9ID0gYmFja2VuZC51dGlscy5nZXRUZXh0dXJlU2FtcGxlRGF0YSggdGV4dHVyZSApO1xyXG5cclxuXHRcdGxldCB1c2FnZSA9IEdQVVRleHR1cmVVc2FnZS5URVhUVVJFX0JJTkRJTkcgfCBHUFVUZXh0dXJlVXNhZ2UuQ09QWV9EU1QgfCBHUFVUZXh0dXJlVXNhZ2UuQ09QWV9TUkM7XHJcblxyXG5cdFx0aWYgKCB0ZXh0dXJlLmlzU3RvcmFnZVRleHR1cmUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHR1c2FnZSB8PSBHUFVUZXh0dXJlVXNhZ2UuU1RPUkFHRV9CSU5ESU5HO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRleHR1cmUuaXNDb21wcmVzc2VkVGV4dHVyZSAhPT0gdHJ1ZSAmJiB0ZXh0dXJlLmlzQ29tcHJlc3NlZEFycmF5VGV4dHVyZSAhPT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdHVzYWdlIHw9IEdQVVRleHR1cmVVc2FnZS5SRU5ERVJfQVRUQUNITUVOVDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZURlc2NyaXB0b3JHUFUgPSB7XHJcblx0XHRcdGxhYmVsOiB0ZXh0dXJlLm5hbWUsXHJcblx0XHRcdHNpemU6IHtcclxuXHRcdFx0XHR3aWR0aDogd2lkdGgsXHJcblx0XHRcdFx0aGVpZ2h0OiBoZWlnaHQsXHJcblx0XHRcdFx0ZGVwdGhPckFycmF5TGF5ZXJzOiBkZXB0aCxcclxuXHRcdFx0fSxcclxuXHRcdFx0bWlwTGV2ZWxDb3VudDogbGV2ZWxzLFxyXG5cdFx0XHRzYW1wbGVDb3VudDogcHJpbWFyeVNhbXBsZXMsXHJcblx0XHRcdGRpbWVuc2lvbjogZGltZW5zaW9uLFxyXG5cdFx0XHRmb3JtYXQ6IGZvcm1hdCxcclxuXHRcdFx0dXNhZ2U6IHVzYWdlXHJcblx0XHR9O1xyXG5cclxuXHRcdC8vIHRleHR1cmUgY3JlYXRpb25cclxuXHJcblx0XHRpZiAoIHRleHR1cmUuaXNWaWRlb1RleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB2aWRlbyA9IHRleHR1cmUuc291cmNlLmRhdGE7XHJcblx0XHRcdGNvbnN0IHZpZGVvRnJhbWUgPSBuZXcgVmlkZW9GcmFtZSggdmlkZW8gKTtcclxuXHJcblx0XHRcdHRleHR1cmVEZXNjcmlwdG9yR1BVLnNpemUud2lkdGggPSB2aWRlb0ZyYW1lLmRpc3BsYXlXaWR0aDtcclxuXHRcdFx0dGV4dHVyZURlc2NyaXB0b3JHUFUuc2l6ZS5oZWlnaHQgPSB2aWRlb0ZyYW1lLmRpc3BsYXlIZWlnaHQ7XHJcblxyXG5cdFx0XHR2aWRlb0ZyYW1lLmNsb3NlKCk7XHJcblxyXG5cdFx0XHR0ZXh0dXJlRGF0YS5leHRlcm5hbFRleHR1cmUgPSB2aWRlbztcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0aWYgKCBmb3JtYXQgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0Y29uc29sZS53YXJuKCAnV2ViR1BVUmVuZGVyZXI6IFRleHR1cmUgZm9ybWF0IG5vdCBzdXBwb3J0ZWQuJyApO1xyXG5cclxuXHRcdFx0XHR0aGlzLmNyZWF0ZURlZmF1bHRUZXh0dXJlKCB0ZXh0dXJlICk7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGV4dHVyZURhdGEudGV4dHVyZSA9IGJhY2tlbmQuZGV2aWNlLmNyZWF0ZVRleHR1cmUoIHRleHR1cmVEZXNjcmlwdG9yR1BVICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggaXNNU0FBICkge1xyXG5cclxuXHRcdFx0Y29uc3QgbXNhYVRleHR1cmVEZXNjcmlwdG9yR1BVID0gT2JqZWN0LmFzc2lnbigge30sIHRleHR1cmVEZXNjcmlwdG9yR1BVICk7XHJcblxyXG5cdFx0XHRtc2FhVGV4dHVyZURlc2NyaXB0b3JHUFUubGFiZWwgPSBtc2FhVGV4dHVyZURlc2NyaXB0b3JHUFUubGFiZWwgKyAnLW1zYWEnO1xyXG5cdFx0XHRtc2FhVGV4dHVyZURlc2NyaXB0b3JHUFUuc2FtcGxlQ291bnQgPSBzYW1wbGVzO1xyXG5cclxuXHRcdFx0dGV4dHVyZURhdGEubXNhYVRleHR1cmUgPSBiYWNrZW5kLmRldmljZS5jcmVhdGVUZXh0dXJlKCBtc2FhVGV4dHVyZURlc2NyaXB0b3JHUFUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGV4dHVyZURhdGEuaW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG5cclxuXHRcdHRleHR1cmVEYXRhLnRleHR1cmVEZXNjcmlwdG9yR1BVID0gdGV4dHVyZURlc2NyaXB0b3JHUFU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVzdHJveXMgdGhlIEdQVSBkYXRhIGZvciB0aGUgZ2l2ZW4gdGV4dHVyZSBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZS5cclxuXHQgKi9cclxuXHRkZXN0cm95VGV4dHVyZSggdGV4dHVyZSApIHtcclxuXHJcblx0XHRjb25zdCBiYWNrZW5kID0gdGhpcy5iYWNrZW5kO1xyXG5cdFx0Y29uc3QgdGV4dHVyZURhdGEgPSBiYWNrZW5kLmdldCggdGV4dHVyZSApO1xyXG5cclxuXHRcdGlmICggdGV4dHVyZURhdGEudGV4dHVyZSAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZURhdGEudGV4dHVyZS5kZXN0cm95KCk7XHJcblxyXG5cdFx0aWYgKCB0ZXh0dXJlRGF0YS5tc2FhVGV4dHVyZSAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZURhdGEubXNhYVRleHR1cmUuZGVzdHJveSgpO1xyXG5cclxuXHRcdGJhY2tlbmQuZGVsZXRlKCB0ZXh0dXJlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVzdHJveXMgdGhlIEdQVSBzYW1wbGVyIGZvciB0aGUgZ2l2ZW4gdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlIHRvIGRlc3Ryb3kgdGhlIHNhbXBsZXIgZm9yLlxyXG5cdCAqL1xyXG5cdGRlc3Ryb3lTYW1wbGVyKCB0ZXh0dXJlICkge1xyXG5cclxuXHRcdGNvbnN0IGJhY2tlbmQgPSB0aGlzLmJhY2tlbmQ7XHJcblx0XHRjb25zdCB0ZXh0dXJlRGF0YSA9IGJhY2tlbmQuZ2V0KCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0ZGVsZXRlIHRleHR1cmVEYXRhLnNhbXBsZXI7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2VuZXJhdGVzIG1pcG1hcHMgZm9yIHRoZSBnaXZlbiB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUuXHJcblx0ICovXHJcblx0Z2VuZXJhdGVNaXBtYXBzKCB0ZXh0dXJlICkge1xyXG5cclxuXHRcdGNvbnN0IHRleHR1cmVEYXRhID0gdGhpcy5iYWNrZW5kLmdldCggdGV4dHVyZSApO1xyXG5cclxuXHRcdGlmICggdGV4dHVyZS5pc0N1YmVUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgNjsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5fZ2VuZXJhdGVNaXBtYXBzKCB0ZXh0dXJlRGF0YS50ZXh0dXJlLCB0ZXh0dXJlRGF0YS50ZXh0dXJlRGVzY3JpcHRvckdQVSwgaSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRjb25zdCBkZXB0aCA9IHRleHR1cmUuaW1hZ2UuZGVwdGggfHwgMTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGRlcHRoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLl9nZW5lcmF0ZU1pcG1hcHMoIHRleHR1cmVEYXRhLnRleHR1cmUsIHRleHR1cmVEYXRhLnRleHR1cmVEZXNjcmlwdG9yR1BVLCBpICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGNvbG9yIGJ1ZmZlciByZXByZXNlbnRpbmcgdGhlIGNvbG9yXHJcblx0ICogYXR0YWNobWVudCBvZiB0aGUgZGVmYXVsdCBmcmFtZWJ1ZmZlci5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0dQVVRleHR1cmV9IFRoZSBjb2xvciBidWZmZXIuXHJcblx0ICovXHJcblx0Z2V0Q29sb3JCdWZmZXIoKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmNvbG9yQnVmZmVyICkgdGhpcy5jb2xvckJ1ZmZlci5kZXN0cm95KCk7XHJcblxyXG5cdFx0Y29uc3QgYmFja2VuZCA9IHRoaXMuYmFja2VuZDtcclxuXHRcdGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gYmFja2VuZC5nZXREcmF3aW5nQnVmZmVyU2l6ZSgpO1xyXG5cclxuXHRcdHRoaXMuY29sb3JCdWZmZXIgPSBiYWNrZW5kLmRldmljZS5jcmVhdGVUZXh0dXJlKCB7XHJcblx0XHRcdGxhYmVsOiAnY29sb3JCdWZmZXInLFxyXG5cdFx0XHRzaXplOiB7XHJcblx0XHRcdFx0d2lkdGg6IHdpZHRoLFxyXG5cdFx0XHRcdGhlaWdodDogaGVpZ2h0LFxyXG5cdFx0XHRcdGRlcHRoT3JBcnJheUxheWVyczogMVxyXG5cdFx0XHR9LFxyXG5cdFx0XHRzYW1wbGVDb3VudDogYmFja2VuZC51dGlscy5nZXRTYW1wbGVDb3VudCggYmFja2VuZC5yZW5kZXJlci5zYW1wbGVzICksXHJcblx0XHRcdGZvcm1hdDogYmFja2VuZC51dGlscy5nZXRQcmVmZXJyZWRDYW52YXNGb3JtYXQoKSxcclxuXHRcdFx0dXNhZ2U6IEdQVVRleHR1cmVVc2FnZS5SRU5ERVJfQVRUQUNITUVOVCB8IEdQVVRleHR1cmVVc2FnZS5DT1BZX1NSQ1xyXG5cdFx0fSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmNvbG9yQnVmZmVyO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGRlcHRoIGJ1ZmZlciByZXByZXNlbnRpbmcgdGhlIGRlcHRoXHJcblx0ICogYXR0YWNobWVudCBvZiB0aGUgZGVmYXVsdCBmcmFtZWJ1ZmZlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW2RlcHRoPXRydWVdIC0gV2hldGhlciBkZXB0aCBpcyBlbmFibGVkIG9yIG5vdC5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtzdGVuY2lsPWZhbHNlXSAtICBXaGV0aGVyIHN0ZW5jaWwgaXMgZW5hYmxlZCBvciBub3QuXHJcblx0ICogQHJldHVybiB7R1BVVGV4dHVyZX0gVGhlIGRlcHRoIGJ1ZmZlci5cclxuXHQgKi9cclxuXHRnZXREZXB0aEJ1ZmZlciggZGVwdGggPSB0cnVlLCBzdGVuY2lsID0gZmFsc2UgKSB7XHJcblxyXG5cdFx0Y29uc3QgYmFja2VuZCA9IHRoaXMuYmFja2VuZDtcclxuXHRcdGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gYmFja2VuZC5nZXREcmF3aW5nQnVmZmVyU2l6ZSgpO1xyXG5cclxuXHRcdGNvbnN0IGRlcHRoVGV4dHVyZSA9IHRoaXMuZGVwdGhUZXh0dXJlO1xyXG5cdFx0Y29uc3QgZGVwdGhUZXh0dXJlR1BVID0gYmFja2VuZC5nZXQoIGRlcHRoVGV4dHVyZSApLnRleHR1cmU7XHJcblxyXG5cdFx0bGV0IGZvcm1hdCwgdHlwZTtcclxuXHJcblx0XHRpZiAoIHN0ZW5jaWwgKSB7XHJcblxyXG5cdFx0XHRmb3JtYXQgPSBEZXB0aFN0ZW5jaWxGb3JtYXQ7XHJcblx0XHRcdHR5cGUgPSBVbnNpZ25lZEludDI0OFR5cGU7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggZGVwdGggKSB7XHJcblxyXG5cdFx0XHRmb3JtYXQgPSBEZXB0aEZvcm1hdDtcclxuXHRcdFx0dHlwZSA9IFVuc2lnbmVkSW50VHlwZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBkZXB0aFRleHR1cmVHUFUgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGlmICggZGVwdGhUZXh0dXJlLmltYWdlLndpZHRoID09PSB3aWR0aCAmJiBkZXB0aFRleHR1cmUuaW1hZ2UuaGVpZ2h0ID09PSBoZWlnaHQgJiYgZGVwdGhUZXh0dXJlLmZvcm1hdCA9PT0gZm9ybWF0ICYmIGRlcHRoVGV4dHVyZS50eXBlID09PSB0eXBlICkge1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gZGVwdGhUZXh0dXJlR1BVO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5kZXN0cm95VGV4dHVyZSggZGVwdGhUZXh0dXJlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGRlcHRoVGV4dHVyZS5uYW1lID0gJ2RlcHRoQnVmZmVyJztcclxuXHRcdGRlcHRoVGV4dHVyZS5mb3JtYXQgPSBmb3JtYXQ7XHJcblx0XHRkZXB0aFRleHR1cmUudHlwZSA9IHR5cGU7XHJcblx0XHRkZXB0aFRleHR1cmUuaW1hZ2Uud2lkdGggPSB3aWR0aDtcclxuXHRcdGRlcHRoVGV4dHVyZS5pbWFnZS5oZWlnaHQgPSBoZWlnaHQ7XHJcblxyXG5cdFx0dGhpcy5jcmVhdGVUZXh0dXJlKCBkZXB0aFRleHR1cmUsIHsgd2lkdGgsIGhlaWdodCB9ICk7XHJcblxyXG5cdFx0cmV0dXJuIGJhY2tlbmQuZ2V0KCBkZXB0aFRleHR1cmUgKS50ZXh0dXJlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwbG9hZHMgdGhlIHVwZGF0ZWQgdGV4dHVyZSBkYXRhIHRvIHRoZSBHUFUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIuXHJcblx0ICovXHJcblx0dXBkYXRlVGV4dHVyZSggdGV4dHVyZSwgb3B0aW9ucyApIHtcclxuXHJcblx0XHRjb25zdCB0ZXh0dXJlRGF0YSA9IHRoaXMuYmFja2VuZC5nZXQoIHRleHR1cmUgKTtcclxuXHJcblx0XHRjb25zdCB7IHRleHR1cmVEZXNjcmlwdG9yR1BVIH0gPSB0ZXh0dXJlRGF0YTtcclxuXHJcblx0XHRpZiAoIHRleHR1cmUuaXNSZW5kZXJUYXJnZXRUZXh0dXJlIHx8ICggdGV4dHVyZURlc2NyaXB0b3JHUFUgPT09IHVuZGVmaW5lZCAvKiB1bnN1cHBvcnRlZCB0ZXh0dXJlIGZvcm1hdCAqLyApIClcclxuXHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdC8vIHRyYW5zZmVyIHRleHR1cmUgZGF0YVxyXG5cclxuXHRcdGlmICggdGV4dHVyZS5pc0RhdGFUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0dGhpcy5fY29weUJ1ZmZlclRvVGV4dHVyZSggb3B0aW9ucy5pbWFnZSwgdGV4dHVyZURhdGEudGV4dHVyZSwgdGV4dHVyZURlc2NyaXB0b3JHUFUsIDAsIHRleHR1cmUuZmxpcFkgKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCB0ZXh0dXJlLmlzRGF0YUFycmF5VGV4dHVyZSB8fCB0ZXh0dXJlLmlzRGF0YTNEVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IG9wdGlvbnMuaW1hZ2UuZGVwdGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdHRoaXMuX2NvcHlCdWZmZXJUb1RleHR1cmUoIG9wdGlvbnMuaW1hZ2UsIHRleHR1cmVEYXRhLnRleHR1cmUsIHRleHR1cmVEZXNjcmlwdG9yR1BVLCBpLCB0ZXh0dXJlLmZsaXBZLCBpICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmICggdGV4dHVyZS5pc0NvbXByZXNzZWRUZXh0dXJlIHx8IHRleHR1cmUuaXNDb21wcmVzc2VkQXJyYXlUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0dGhpcy5fY29weUNvbXByZXNzZWRCdWZmZXJUb1RleHR1cmUoIHRleHR1cmUubWlwbWFwcywgdGV4dHVyZURhdGEudGV4dHVyZSwgdGV4dHVyZURlc2NyaXB0b3JHUFUgKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCB0ZXh0dXJlLmlzQ3ViZVRleHR1cmUgKSB7XHJcblxyXG5cdFx0XHR0aGlzLl9jb3B5Q3ViZU1hcFRvVGV4dHVyZSggb3B0aW9ucy5pbWFnZXMsIHRleHR1cmVEYXRhLnRleHR1cmUsIHRleHR1cmVEZXNjcmlwdG9yR1BVLCB0ZXh0dXJlLmZsaXBZICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggdGV4dHVyZS5pc1ZpZGVvVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdGNvbnN0IHZpZGVvID0gdGV4dHVyZS5zb3VyY2UuZGF0YTtcclxuXHJcblx0XHRcdHRleHR1cmVEYXRhLmV4dGVybmFsVGV4dHVyZSA9IHZpZGVvO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR0aGlzLl9jb3B5SW1hZ2VUb1RleHR1cmUoIG9wdGlvbnMuaW1hZ2UsIHRleHR1cmVEYXRhLnRleHR1cmUsIHRleHR1cmVEZXNjcmlwdG9yR1BVLCAwLCB0ZXh0dXJlLmZsaXBZICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0dGV4dHVyZURhdGEudmVyc2lvbiA9IHRleHR1cmUudmVyc2lvbjtcclxuXHJcblx0XHRpZiAoIHRleHR1cmUub25VcGRhdGUgKSB0ZXh0dXJlLm9uVXBkYXRlKCB0ZXh0dXJlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0ZXh0dXJlIGRhdGEgYXMgYSB0eXBlZCBhcnJheS5cclxuXHQgKlxyXG5cdCAqIEBhc3luY1xyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlIHRvIGNvcHkuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBjb3B5IG9yaWdpbi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGNvcHkgb3JpZ2luLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgY29weS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgY29weS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZmFjZUluZGV4IC0gVGhlIGZhY2UgaW5kZXguXHJcblx0ICogQHJldHVybiB7UHJvbWlzZTxUeXBlZEFycmF5Pn0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCBhIHR5cGVkIGFycmF5IHdoZW4gdGhlIGNvcHkgb3BlcmF0aW9uIGhhcyBmaW5pc2hlZC5cclxuXHQgKi9cclxuXHRhc3luYyBjb3B5VGV4dHVyZVRvQnVmZmVyKCB0ZXh0dXJlLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmYWNlSW5kZXggKSB7XHJcblxyXG5cdFx0Y29uc3QgZGV2aWNlID0gdGhpcy5iYWNrZW5kLmRldmljZTtcclxuXHJcblx0XHRjb25zdCB0ZXh0dXJlRGF0YSA9IHRoaXMuYmFja2VuZC5nZXQoIHRleHR1cmUgKTtcclxuXHRcdGNvbnN0IHRleHR1cmVHUFUgPSB0ZXh0dXJlRGF0YS50ZXh0dXJlO1xyXG5cdFx0Y29uc3QgZm9ybWF0ID0gdGV4dHVyZURhdGEudGV4dHVyZURlc2NyaXB0b3JHUFUuZm9ybWF0O1xyXG5cdFx0Y29uc3QgYnl0ZXNQZXJUZXhlbCA9IHRoaXMuX2dldEJ5dGVzUGVyVGV4ZWwoIGZvcm1hdCApO1xyXG5cclxuXHRcdGxldCBieXRlc1BlclJvdyA9IHdpZHRoICogYnl0ZXNQZXJUZXhlbDtcclxuXHRcdGJ5dGVzUGVyUm93ID0gTWF0aC5jZWlsKCBieXRlc1BlclJvdyAvIDI1NiApICogMjU2OyAvLyBBbGlnbiB0byAyNTYgYnl0ZXNcclxuXHJcblx0XHRjb25zdCByZWFkQnVmZmVyID0gZGV2aWNlLmNyZWF0ZUJ1ZmZlcihcclxuXHRcdFx0e1xyXG5cdFx0XHRcdHNpemU6IHdpZHRoICogaGVpZ2h0ICogYnl0ZXNQZXJUZXhlbCxcclxuXHRcdFx0XHR1c2FnZTogR1BVQnVmZmVyVXNhZ2UuQ09QWV9EU1QgfCBHUFVCdWZmZXJVc2FnZS5NQVBfUkVBRFxyXG5cdFx0XHR9XHJcblx0XHQpO1xyXG5cclxuXHRcdGNvbnN0IGVuY29kZXIgPSBkZXZpY2UuY3JlYXRlQ29tbWFuZEVuY29kZXIoKTtcclxuXHJcblx0XHRlbmNvZGVyLmNvcHlUZXh0dXJlVG9CdWZmZXIoXHJcblx0XHRcdHtcclxuXHRcdFx0XHR0ZXh0dXJlOiB0ZXh0dXJlR1BVLFxyXG5cdFx0XHRcdG9yaWdpbjogeyB4LCB5LCB6OiBmYWNlSW5kZXggfSxcclxuXHRcdFx0fSxcclxuXHRcdFx0e1xyXG5cdFx0XHRcdGJ1ZmZlcjogcmVhZEJ1ZmZlcixcclxuXHRcdFx0XHRieXRlc1BlclJvdzogYnl0ZXNQZXJSb3dcclxuXHRcdFx0fSxcclxuXHRcdFx0e1xyXG5cdFx0XHRcdHdpZHRoOiB3aWR0aCxcclxuXHRcdFx0XHRoZWlnaHQ6IGhlaWdodFxyXG5cdFx0XHR9XHJcblxyXG5cdFx0KTtcclxuXHJcblx0XHRjb25zdCB0eXBlZEFycmF5VHlwZSA9IHRoaXMuX2dldFR5cGVkQXJyYXlUeXBlKCBmb3JtYXQgKTtcclxuXHJcblx0XHRkZXZpY2UucXVldWUuc3VibWl0KCBbIGVuY29kZXIuZmluaXNoKCkgXSApO1xyXG5cclxuXHRcdGF3YWl0IHJlYWRCdWZmZXIubWFwQXN5bmMoIEdQVU1hcE1vZGUuUkVBRCApO1xyXG5cclxuXHRcdGNvbnN0IGJ1ZmZlciA9IHJlYWRCdWZmZXIuZ2V0TWFwcGVkUmFuZ2UoKTtcclxuXHJcblx0XHRyZXR1cm4gbmV3IHR5cGVkQXJyYXlUeXBlKCBidWZmZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gdGV4dHVyZSBpcyBhbiBlbnZpcm9ubWVudCBtYXAuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlLlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGdpdmVuIHRleHR1cmUgaXMgYW4gZW52aXJvbm1lbnQgbWFwIG9yIG5vdC5cclxuXHQgKi9cclxuXHRfaXNFbnZpcm9ubWVudFRleHR1cmUoIHRleHR1cmUgKSB7XHJcblxyXG5cdFx0Y29uc3QgbWFwcGluZyA9IHRleHR1cmUubWFwcGluZztcclxuXHJcblx0XHRyZXR1cm4gKCBtYXBwaW5nID09PSBFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZyB8fCBtYXBwaW5nID09PSBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZyApIHx8ICggbWFwcGluZyA9PT0gQ3ViZVJlZmxlY3Rpb25NYXBwaW5nIHx8IG1hcHBpbmcgPT09IEN1YmVSZWZyYWN0aW9uTWFwcGluZyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGRlZmF1bHQgR1BVIHRleHR1cmUgZm9yIHRoZSBnaXZlbiBmb3JtYXQuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtYXQgLSBUaGUgR1BVIGZvcm1hdC5cclxuXHQgKiBAcmV0dXJuIHtHUFVUZXh0dXJlfSBUaGUgR1BVIHRleHR1cmUuXHJcblx0ICovXHJcblx0X2dldERlZmF1bHRUZXh0dXJlR1BVKCBmb3JtYXQgKSB7XHJcblxyXG5cdFx0bGV0IGRlZmF1bHRUZXh0dXJlID0gdGhpcy5kZWZhdWx0VGV4dHVyZVsgZm9ybWF0IF07XHJcblxyXG5cdFx0aWYgKCBkZWZhdWx0VGV4dHVyZSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdGV4dHVyZSA9IG5ldyBUZXh0dXJlKCk7XHJcblx0XHRcdHRleHR1cmUubWluRmlsdGVyID0gTmVhcmVzdEZpbHRlcjtcclxuXHRcdFx0dGV4dHVyZS5tYWdGaWx0ZXIgPSBOZWFyZXN0RmlsdGVyO1xyXG5cclxuXHRcdFx0dGhpcy5jcmVhdGVUZXh0dXJlKCB0ZXh0dXJlLCB7IHdpZHRoOiAxLCBoZWlnaHQ6IDEsIGZvcm1hdCB9ICk7XHJcblxyXG5cdFx0XHR0aGlzLmRlZmF1bHRUZXh0dXJlWyBmb3JtYXQgXSA9IGRlZmF1bHRUZXh0dXJlID0gdGV4dHVyZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuYmFja2VuZC5nZXQoIGRlZmF1bHRUZXh0dXJlICkudGV4dHVyZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IEdQVSBjdWJlIHRleHR1cmUgZm9yIHRoZSBnaXZlbiBmb3JtYXQuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtYXQgLSBUaGUgR1BVIGZvcm1hdC5cclxuXHQgKiBAcmV0dXJuIHtHUFVUZXh0dXJlfSBUaGUgR1BVIHRleHR1cmUuXHJcblx0ICovXHJcblx0X2dldERlZmF1bHRDdWJlVGV4dHVyZUdQVSggZm9ybWF0ICkge1xyXG5cclxuXHRcdGxldCBkZWZhdWx0Q3ViZVRleHR1cmUgPSB0aGlzLmRlZmF1bHRUZXh0dXJlWyBmb3JtYXQgXTtcclxuXHJcblx0XHRpZiAoIGRlZmF1bHRDdWJlVGV4dHVyZSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdGV4dHVyZSA9IG5ldyBDdWJlVGV4dHVyZSgpO1xyXG5cdFx0XHR0ZXh0dXJlLm1pbkZpbHRlciA9IE5lYXJlc3RGaWx0ZXI7XHJcblx0XHRcdHRleHR1cmUubWFnRmlsdGVyID0gTmVhcmVzdEZpbHRlcjtcclxuXHJcblx0XHRcdHRoaXMuY3JlYXRlVGV4dHVyZSggdGV4dHVyZSwgeyB3aWR0aDogMSwgaGVpZ2h0OiAxLCBkZXB0aDogNiB9ICk7XHJcblxyXG5cdFx0XHR0aGlzLmRlZmF1bHRDdWJlVGV4dHVyZVsgZm9ybWF0IF0gPSBkZWZhdWx0Q3ViZVRleHR1cmUgPSB0ZXh0dXJlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcy5iYWNrZW5kLmdldCggZGVmYXVsdEN1YmVUZXh0dXJlICkudGV4dHVyZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHZpZGVvIGZyYW1lIHVzZWQgYXMgZGVmYXVsdCBkYXRhIGluIGNvbnRleHQgb2YgdmlkZW8gdGV4dHVyZXMuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEByZXR1cm4ge1ZpZGVvRnJhbWV9IFRoZSB2aWRlbyBmcmFtZS5cclxuXHQgKi9cclxuXHRfZ2V0RGVmYXVsdFZpZGVvRnJhbWUoKSB7XHJcblxyXG5cdFx0bGV0IGRlZmF1bHRWaWRlb0ZyYW1lID0gdGhpcy5kZWZhdWx0VmlkZW9GcmFtZTtcclxuXHJcblx0XHRpZiAoIGRlZmF1bHRWaWRlb0ZyYW1lID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0Y29uc3QgaW5pdCA9IHtcclxuXHRcdFx0XHR0aW1lc3RhbXA6IDAsXHJcblx0XHRcdFx0Y29kZWRXaWR0aDogMSxcclxuXHRcdFx0XHRjb2RlZEhlaWdodDogMSxcclxuXHRcdFx0XHRmb3JtYXQ6ICdSR0JBJyxcclxuXHRcdFx0fTtcclxuXHJcblx0XHRcdHRoaXMuZGVmYXVsdFZpZGVvRnJhbWUgPSBkZWZhdWx0VmlkZW9GcmFtZSA9IG5ldyBWaWRlb0ZyYW1lKCBuZXcgVWludDhBcnJheSggWyAwLCAwLCAwLCAweGZmIF0gKSwgaW5pdCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZGVmYXVsdFZpZGVvRnJhbWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBsb2FkcyBjdWJlIHRleHR1cmUgaW1hZ2UgZGF0YSB0byB0aGUgR1BVIG1lbW9yeS5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtBcnJheX0gaW1hZ2VzIC0gVGhlIGN1YmUgaW1hZ2UgZGF0YS5cclxuXHQgKiBAcGFyYW0ge0dQVVRleHR1cmV9IHRleHR1cmVHUFUgLSBUaGUgR1BVIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IHRleHR1cmVEZXNjcmlwdG9yR1BVIC0gVGhlIEdQVSB0ZXh0dXJlIGRlc2NyaXB0b3IuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBmbGlwWSAtIFdoZXRoZXIgdG8gZmxpcCB0ZXh0dXJlIGRhdGEgYWxvbmcgdGhlaXIgdmVydGljYWwgYXhpcyBvciBub3QuXHJcblx0ICovXHJcblx0X2NvcHlDdWJlTWFwVG9UZXh0dXJlKCBpbWFnZXMsIHRleHR1cmVHUFUsIHRleHR1cmVEZXNjcmlwdG9yR1BVLCBmbGlwWSApIHtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCA2OyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgaW1hZ2UgPSBpbWFnZXNbIGkgXTtcclxuXHJcblx0XHRcdGNvbnN0IGZsaXBJbmRleCA9IGZsaXBZID09PSB0cnVlID8gX2ZsaXBNYXBbIGkgXSA6IGk7XHJcblxyXG5cdFx0XHRpZiAoIGltYWdlLmlzRGF0YVRleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRcdHRoaXMuX2NvcHlCdWZmZXJUb1RleHR1cmUoIGltYWdlLmltYWdlLCB0ZXh0dXJlR1BVLCB0ZXh0dXJlRGVzY3JpcHRvckdQVSwgZmxpcEluZGV4LCBmbGlwWSApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0dGhpcy5fY29weUltYWdlVG9UZXh0dXJlKCBpbWFnZSwgdGV4dHVyZUdQVSwgdGV4dHVyZURlc2NyaXB0b3JHUFUsIGZsaXBJbmRleCwgZmxpcFkgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBsb2FkcyB0ZXh0dXJlIGltYWdlIGRhdGEgdG8gdGhlIEdQVSBtZW1vcnkuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7SFRNTEltYWdlRWxlbWVudHxJbWFnZUJpdG1hcHxIVE1MQ2FudmFzRWxlbWVudH0gaW1hZ2UgLSBUaGUgaW1hZ2UgZGF0YS5cclxuXHQgKiBAcGFyYW0ge0dQVVRleHR1cmV9IHRleHR1cmVHUFUgLSBUaGUgR1BVIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IHRleHR1cmVEZXNjcmlwdG9yR1BVIC0gVGhlIEdQVSB0ZXh0dXJlIGRlc2NyaXB0b3IuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IG9yaWdpbkRlcHRoIC0gVGhlIG9yaWdpbiBkZXB0aC5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IGZsaXBZIC0gV2hldGhlciB0byBmbGlwIHRleHR1cmUgZGF0YSBhbG9uZyB0aGVpciB2ZXJ0aWNhbCBheGlzIG9yIG5vdC5cclxuXHQgKi9cclxuXHRfY29weUltYWdlVG9UZXh0dXJlKCBpbWFnZSwgdGV4dHVyZUdQVSwgdGV4dHVyZURlc2NyaXB0b3JHUFUsIG9yaWdpbkRlcHRoLCBmbGlwWSApIHtcclxuXHJcblx0XHRjb25zdCBkZXZpY2UgPSB0aGlzLmJhY2tlbmQuZGV2aWNlO1xyXG5cclxuXHRcdGRldmljZS5xdWV1ZS5jb3B5RXh0ZXJuYWxJbWFnZVRvVGV4dHVyZShcclxuXHRcdFx0e1xyXG5cdFx0XHRcdHNvdXJjZTogaW1hZ2UsXHJcblx0XHRcdFx0ZmxpcFk6IGZsaXBZXHJcblx0XHRcdH0sIHtcclxuXHRcdFx0XHR0ZXh0dXJlOiB0ZXh0dXJlR1BVLFxyXG5cdFx0XHRcdG1pcExldmVsOiAwLFxyXG5cdFx0XHRcdG9yaWdpbjogeyB4OiAwLCB5OiAwLCB6OiBvcmlnaW5EZXB0aCB9XHJcblx0XHRcdH0sIHtcclxuXHRcdFx0XHR3aWR0aDogaW1hZ2Uud2lkdGgsXHJcblx0XHRcdFx0aGVpZ2h0OiBpbWFnZS5oZWlnaHQsXHJcblx0XHRcdFx0ZGVwdGhPckFycmF5TGF5ZXJzOiAxXHJcblx0XHRcdH1cclxuXHRcdCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgcGFzcyB1dGlscyBzaW5nbGV0b24uXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEByZXR1cm4ge1dlYkdQVVRleHR1cmVQYXNzVXRpbHN9IFRoZSB1dGlscyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRfZ2V0UGFzc1V0aWxzKCkge1xyXG5cclxuXHRcdGxldCBwYXNzVXRpbHMgPSB0aGlzLl9wYXNzVXRpbHM7XHJcblxyXG5cdFx0aWYgKCBwYXNzVXRpbHMgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLl9wYXNzVXRpbHMgPSBwYXNzVXRpbHMgPSBuZXcgV2ViR1BVVGV4dHVyZVBhc3NVdGlscyggdGhpcy5iYWNrZW5kLmRldmljZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcGFzc1V0aWxzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyBtaXBtYXBzIGZvciB0aGUgZ2l2ZW4gR1BVIHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7R1BVVGV4dHVyZX0gdGV4dHVyZUdQVSAtIFRoZSBHUFUgdGV4dHVyZSBvYmplY3QuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IHRleHR1cmVEZXNjcmlwdG9yR1BVIC0gVGhlIHRleHR1cmUgZGVzY3JpcHRvci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2Jhc2VBcnJheUxheWVyPTBdIC0gVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBhcnJheSBsYXllciBhY2Nlc3NpYmxlIHRvIHRoZSB0ZXh0dXJlIHZpZXcuXHJcblx0ICovXHJcblx0X2dlbmVyYXRlTWlwbWFwcyggdGV4dHVyZUdQVSwgdGV4dHVyZURlc2NyaXB0b3JHUFUsIGJhc2VBcnJheUxheWVyID0gMCApIHtcclxuXHJcblx0XHR0aGlzLl9nZXRQYXNzVXRpbHMoKS5nZW5lcmF0ZU1pcG1hcHMoIHRleHR1cmVHUFUsIHRleHR1cmVEZXNjcmlwdG9yR1BVLCBiYXNlQXJyYXlMYXllciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZsaXAgdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBHUFUgdGV4dHVyZSBhbG9uZyBpdHMgdmVydGljYWwgYXhpcy5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtHUFVUZXh0dXJlfSB0ZXh0dXJlR1BVIC0gVGhlIEdQVSB0ZXh0dXJlIG9iamVjdC5cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gdGV4dHVyZURlc2NyaXB0b3JHUFUgLSBUaGUgdGV4dHVyZSBkZXNjcmlwdG9yLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbb3JpZ2luRGVwdGg9MF0gLSBUaGUgb3JpZ2luIGRlcHRoLlxyXG5cdCAqL1xyXG5cdF9mbGlwWSggdGV4dHVyZUdQVSwgdGV4dHVyZURlc2NyaXB0b3JHUFUsIG9yaWdpbkRlcHRoID0gMCApIHtcclxuXHJcblx0XHR0aGlzLl9nZXRQYXNzVXRpbHMoKS5mbGlwWSggdGV4dHVyZUdQVSwgdGV4dHVyZURlc2NyaXB0b3JHUFUsIG9yaWdpbkRlcHRoICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBsb2FkcyB0ZXh0dXJlIGJ1ZmZlciBkYXRhIHRvIHRoZSBHUFUgbWVtb3J5LlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gaW1hZ2UgLSBBbiBvYmplY3QgZGVmaW5pbmcgdGhlIGltYWdlIGJ1ZmZlciBkYXRhLlxyXG5cdCAqIEBwYXJhbSB7R1BVVGV4dHVyZX0gdGV4dHVyZUdQVSAtIFRoZSBHUFUgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gdGV4dHVyZURlc2NyaXB0b3JHUFUgLSBUaGUgR1BVIHRleHR1cmUgZGVzY3JpcHRvci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gb3JpZ2luRGVwdGggLSBUaGUgb3JpZ2luIGRlcHRoLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gZmxpcFkgLSBXaGV0aGVyIHRvIGZsaXAgdGV4dHVyZSBkYXRhIGFsb25nIHRoZWlyIHZlcnRpY2FsIGF4aXMgb3Igbm90LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZGVwdGg9MF0gLSBUT0RPLlxyXG5cdCAqL1xyXG5cdF9jb3B5QnVmZmVyVG9UZXh0dXJlKCBpbWFnZSwgdGV4dHVyZUdQVSwgdGV4dHVyZURlc2NyaXB0b3JHUFUsIG9yaWdpbkRlcHRoLCBmbGlwWSwgZGVwdGggPSAwICkge1xyXG5cclxuXHRcdC8vIEBUT0RPOiBDb25zaWRlciB0byB1c2UgR1BVQ29tbWFuZEVuY29kZXIuY29weUJ1ZmZlclRvVGV4dHVyZSgpXHJcblx0XHQvLyBAVE9ETzogQ29uc2lkZXIgdG8gc3VwcG9ydCB2YWxpZCBidWZmZXIgbGF5b3V0cyB3aXRoIG90aGVyIGZvcm1hdHMgbGlrZSBSR0JcclxuXHJcblx0XHRjb25zdCBkZXZpY2UgPSB0aGlzLmJhY2tlbmQuZGV2aWNlO1xyXG5cclxuXHRcdGNvbnN0IGRhdGEgPSBpbWFnZS5kYXRhO1xyXG5cclxuXHRcdGNvbnN0IGJ5dGVzUGVyVGV4ZWwgPSB0aGlzLl9nZXRCeXRlc1BlclRleGVsKCB0ZXh0dXJlRGVzY3JpcHRvckdQVS5mb3JtYXQgKTtcclxuXHRcdGNvbnN0IGJ5dGVzUGVyUm93ID0gaW1hZ2Uud2lkdGggKiBieXRlc1BlclRleGVsO1xyXG5cclxuXHRcdGRldmljZS5xdWV1ZS53cml0ZVRleHR1cmUoXHJcblx0XHRcdHtcclxuXHRcdFx0XHR0ZXh0dXJlOiB0ZXh0dXJlR1BVLFxyXG5cdFx0XHRcdG1pcExldmVsOiAwLFxyXG5cdFx0XHRcdG9yaWdpbjogeyB4OiAwLCB5OiAwLCB6OiBvcmlnaW5EZXB0aCB9XHJcblx0XHRcdH0sXHJcblx0XHRcdGRhdGEsXHJcblx0XHRcdHtcclxuXHRcdFx0XHRvZmZzZXQ6IGltYWdlLndpZHRoICogaW1hZ2UuaGVpZ2h0ICogYnl0ZXNQZXJUZXhlbCAqIGRlcHRoLFxyXG5cdFx0XHRcdGJ5dGVzUGVyUm93XHJcblx0XHRcdH0sXHJcblx0XHRcdHtcclxuXHRcdFx0XHR3aWR0aDogaW1hZ2Uud2lkdGgsXHJcblx0XHRcdFx0aGVpZ2h0OiBpbWFnZS5oZWlnaHQsXHJcblx0XHRcdFx0ZGVwdGhPckFycmF5TGF5ZXJzOiAxXHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHRpZiAoIGZsaXBZID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0dGhpcy5fZmxpcFkoIHRleHR1cmVHUFUsIHRleHR1cmVEZXNjcmlwdG9yR1BVLCBvcmlnaW5EZXB0aCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGxvYWRzIGNvbXByZXNzZWQgdGV4dHVyZSBkYXRhIHRvIHRoZSBHUFUgbWVtb3J5LlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge0FycmF5PE9iamVjdD59IG1pcG1hcHMgLSBBbiBhcnJheSB3aXRoIG1pcG1hcCBkYXRhLlxyXG5cdCAqIEBwYXJhbSB7R1BVVGV4dHVyZX0gdGV4dHVyZUdQVSAtIFRoZSBHUFUgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gdGV4dHVyZURlc2NyaXB0b3JHUFUgLSBUaGUgR1BVIHRleHR1cmUgZGVzY3JpcHRvci5cclxuXHQgKi9cclxuXHRfY29weUNvbXByZXNzZWRCdWZmZXJUb1RleHR1cmUoIG1pcG1hcHMsIHRleHR1cmVHUFUsIHRleHR1cmVEZXNjcmlwdG9yR1BVICkge1xyXG5cclxuXHRcdC8vIEBUT0RPOiBDb25zaWRlciB0byB1c2UgR1BVQ29tbWFuZEVuY29kZXIuY29weUJ1ZmZlclRvVGV4dHVyZSgpXHJcblxyXG5cdFx0Y29uc3QgZGV2aWNlID0gdGhpcy5iYWNrZW5kLmRldmljZTtcclxuXHJcblx0XHRjb25zdCBibG9ja0RhdGEgPSB0aGlzLl9nZXRCbG9ja0RhdGEoIHRleHR1cmVEZXNjcmlwdG9yR1BVLmZvcm1hdCApO1xyXG5cdFx0Y29uc3QgaXNUZXh0dXJlQXJyYXkgPSB0ZXh0dXJlRGVzY3JpcHRvckdQVS5zaXplLmRlcHRoT3JBcnJheUxheWVycyA+IDE7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgbWlwbWFwcy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBtaXBtYXAgPSBtaXBtYXBzWyBpIF07XHJcblxyXG5cdFx0XHRjb25zdCB3aWR0aCA9IG1pcG1hcC53aWR0aDtcclxuXHRcdFx0Y29uc3QgaGVpZ2h0ID0gbWlwbWFwLmhlaWdodDtcclxuXHRcdFx0Y29uc3QgZGVwdGggPSBpc1RleHR1cmVBcnJheSA/IHRleHR1cmVEZXNjcmlwdG9yR1BVLnNpemUuZGVwdGhPckFycmF5TGF5ZXJzIDogMTtcclxuXHJcblx0XHRcdGNvbnN0IGJ5dGVzUGVyUm93ID0gTWF0aC5jZWlsKCB3aWR0aCAvIGJsb2NrRGF0YS53aWR0aCApICogYmxvY2tEYXRhLmJ5dGVMZW5ndGg7XHJcblx0XHRcdGNvbnN0IGJ5dGVzUGVySW1hZ2UgPSBieXRlc1BlclJvdyAqIE1hdGguY2VpbCggaGVpZ2h0IC8gYmxvY2tEYXRhLmhlaWdodCApO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGogPSAwOyBqIDwgZGVwdGg7IGogKysgKSB7XHJcblxyXG5cdFx0XHRcdGRldmljZS5xdWV1ZS53cml0ZVRleHR1cmUoXHJcblx0XHRcdFx0XHR7XHJcblx0XHRcdFx0XHRcdHRleHR1cmU6IHRleHR1cmVHUFUsXHJcblx0XHRcdFx0XHRcdG1pcExldmVsOiBpLFxyXG5cdFx0XHRcdFx0XHRvcmlnaW46IHsgeDogMCwgeTogMCwgejogaiB9XHJcblx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0bWlwbWFwLmRhdGEsXHJcblx0XHRcdFx0XHR7XHJcblx0XHRcdFx0XHRcdG9mZnNldDogaiAqIGJ5dGVzUGVySW1hZ2UsXHJcblx0XHRcdFx0XHRcdGJ5dGVzUGVyUm93LFxyXG5cdFx0XHRcdFx0XHRyb3dzUGVySW1hZ2U6IE1hdGguY2VpbCggaGVpZ2h0IC8gYmxvY2tEYXRhLmhlaWdodCApXHJcblx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0XHR3aWR0aDogTWF0aC5jZWlsKCB3aWR0aCAvIGJsb2NrRGF0YS53aWR0aCApICogYmxvY2tEYXRhLndpZHRoLFxyXG5cdFx0XHRcdFx0XHRoZWlnaHQ6IE1hdGguY2VpbCggaGVpZ2h0IC8gYmxvY2tEYXRhLmhlaWdodCApICogYmxvY2tEYXRhLmhlaWdodCxcclxuXHRcdFx0XHRcdFx0ZGVwdGhPckFycmF5TGF5ZXJzOiAxXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0KTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgaXMgb25seSByZWxldmFudCBmb3IgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdHMuIEl0IHJldHVybnMgYSBibG9ja1xyXG5cdCAqIGRhdGEgZGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIEdQVSBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0LlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gZm9ybWF0IC0gVGhlIEdQVSBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0LlxyXG5cdCAqIEByZXR1cm4ge09iamVjdH0gVGhlIGJsb2NrIGRhdGEgZGVzY3JpcHRvci5cclxuXHQgKi9cclxuXHRfZ2V0QmxvY2tEYXRhKCBmb3JtYXQgKSB7XHJcblxyXG5cdFx0aWYgKCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuQkMxUkdCQVVub3JtIHx8IGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5CQzFSR0JBVW5vcm1TUkdCICkgcmV0dXJuIHsgYnl0ZUxlbmd0aDogOCwgd2lkdGg6IDQsIGhlaWdodDogNCB9OyAvLyBEWFQxXHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5CQzJSR0JBVW5vcm0gfHwgZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LkJDMlJHQkFVbm9ybVNSR0IgKSByZXR1cm4geyBieXRlTGVuZ3RoOiAxNiwgd2lkdGg6IDQsIGhlaWdodDogNCB9OyAvLyBEWFQzXHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5CQzNSR0JBVW5vcm0gfHwgZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LkJDM1JHQkFVbm9ybVNSR0IgKSByZXR1cm4geyBieXRlTGVuZ3RoOiAxNiwgd2lkdGg6IDQsIGhlaWdodDogNCB9OyAvLyBEWFQ1XHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5CQzRSVW5vcm0gfHwgZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LkJDNFJTbm9ybSApIHJldHVybiB7IGJ5dGVMZW5ndGg6IDgsIHdpZHRoOiA0LCBoZWlnaHQ6IDQgfTsgLy8gUkdUQzFcclxuXHRcdGlmICggZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LkJDNVJHVW5vcm0gfHwgZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LkJDNVJHU25vcm0gKSByZXR1cm4geyBieXRlTGVuZ3RoOiAxNiwgd2lkdGg6IDQsIGhlaWdodDogNCB9OyAvLyBSR1RDMlxyXG5cdFx0aWYgKCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuQkM2SFJHQlVGbG9hdCB8fCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuQkM2SFJHQkZsb2F0ICkgcmV0dXJuIHsgYnl0ZUxlbmd0aDogMTYsIHdpZHRoOiA0LCBoZWlnaHQ6IDQgfTsgLy8gQlBUQyAoZmxvYXQpXHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5CQzdSR0JBVW5vcm0gfHwgZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LkJDN1JHQkFVbm9ybVNSR0IgKSByZXR1cm4geyBieXRlTGVuZ3RoOiAxNiwgd2lkdGg6IDQsIGhlaWdodDogNCB9OyAvLyBCUFRDICh1bm9ybSlcclxuXHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5FVEMyUkdCOFVub3JtIHx8IGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5FVEMyUkdCOFVub3JtU1JHQiApIHJldHVybiB7IGJ5dGVMZW5ndGg6IDgsIHdpZHRoOiA0LCBoZWlnaHQ6IDQgfTtcclxuXHRcdGlmICggZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LkVUQzJSR0I4QTFVbm9ybSB8fCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuRVRDMlJHQjhBMVVub3JtU1JHQiApIHJldHVybiB7IGJ5dGVMZW5ndGg6IDgsIHdpZHRoOiA0LCBoZWlnaHQ6IDQgfTtcclxuXHRcdGlmICggZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LkVUQzJSR0JBOFVub3JtIHx8IGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5FVEMyUkdCQThVbm9ybVNSR0IgKSByZXR1cm4geyBieXRlTGVuZ3RoOiAxNiwgd2lkdGg6IDQsIGhlaWdodDogNCB9O1xyXG5cdFx0aWYgKCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuRUFDUjExVW5vcm0gKSByZXR1cm4geyBieXRlTGVuZ3RoOiA4LCB3aWR0aDogNCwgaGVpZ2h0OiA0IH07XHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5FQUNSMTFTbm9ybSApIHJldHVybiB7IGJ5dGVMZW5ndGg6IDgsIHdpZHRoOiA0LCBoZWlnaHQ6IDQgfTtcclxuXHRcdGlmICggZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LkVBQ1JHMTFVbm9ybSApIHJldHVybiB7IGJ5dGVMZW5ndGg6IDE2LCB3aWR0aDogNCwgaGVpZ2h0OiA0IH07XHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5FQUNSRzExU25vcm0gKSByZXR1cm4geyBieXRlTGVuZ3RoOiAxNiwgd2lkdGg6IDQsIGhlaWdodDogNCB9O1xyXG5cclxuXHRcdGlmICggZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LkFTVEM0eDRVbm9ybSB8fCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuQVNUQzR4NFVub3JtU1JHQiApIHJldHVybiB7IGJ5dGVMZW5ndGg6IDE2LCB3aWR0aDogNCwgaGVpZ2h0OiA0IH07XHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5BU1RDNXg0VW5vcm0gfHwgZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LkFTVEM1eDRVbm9ybVNSR0IgKSByZXR1cm4geyBieXRlTGVuZ3RoOiAxNiwgd2lkdGg6IDUsIGhlaWdodDogNCB9O1xyXG5cdFx0aWYgKCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuQVNUQzV4NVVub3JtIHx8IGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5BU1RDNXg1VW5vcm1TUkdCICkgcmV0dXJuIHsgYnl0ZUxlbmd0aDogMTYsIHdpZHRoOiA1LCBoZWlnaHQ6IDUgfTtcclxuXHRcdGlmICggZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LkFTVEM2eDVVbm9ybSB8fCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuQVNUQzZ4NVVub3JtU1JHQiApIHJldHVybiB7IGJ5dGVMZW5ndGg6IDE2LCB3aWR0aDogNiwgaGVpZ2h0OiA1IH07XHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5BU1RDNng2VW5vcm0gfHwgZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LkFTVEM2eDZVbm9ybVNSR0IgKSByZXR1cm4geyBieXRlTGVuZ3RoOiAxNiwgd2lkdGg6IDYsIGhlaWdodDogNiB9O1xyXG5cdFx0aWYgKCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuQVNUQzh4NVVub3JtIHx8IGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5BU1RDOHg1VW5vcm1TUkdCICkgcmV0dXJuIHsgYnl0ZUxlbmd0aDogMTYsIHdpZHRoOiA4LCBoZWlnaHQ6IDUgfTtcclxuXHRcdGlmICggZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LkFTVEM4eDZVbm9ybSB8fCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuQVNUQzh4NlVub3JtU1JHQiApIHJldHVybiB7IGJ5dGVMZW5ndGg6IDE2LCB3aWR0aDogOCwgaGVpZ2h0OiA2IH07XHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5BU1RDOHg4VW5vcm0gfHwgZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LkFTVEM4eDhVbm9ybVNSR0IgKSByZXR1cm4geyBieXRlTGVuZ3RoOiAxNiwgd2lkdGg6IDgsIGhlaWdodDogOCB9O1xyXG5cdFx0aWYgKCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuQVNUQzEweDVVbm9ybSB8fCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuQVNUQzEweDVVbm9ybVNSR0IgKSByZXR1cm4geyBieXRlTGVuZ3RoOiAxNiwgd2lkdGg6IDEwLCBoZWlnaHQ6IDUgfTtcclxuXHRcdGlmICggZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LkFTVEMxMHg2VW5vcm0gfHwgZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LkFTVEMxMHg2VW5vcm1TUkdCICkgcmV0dXJuIHsgYnl0ZUxlbmd0aDogMTYsIHdpZHRoOiAxMCwgaGVpZ2h0OiA2IH07XHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5BU1RDMTB4OFVub3JtIHx8IGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5BU1RDMTB4OFVub3JtU1JHQiApIHJldHVybiB7IGJ5dGVMZW5ndGg6IDE2LCB3aWR0aDogMTAsIGhlaWdodDogOCB9O1xyXG5cdFx0aWYgKCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuQVNUQzEweDEwVW5vcm0gfHwgZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LkFTVEMxMHgxMFVub3JtU1JHQiApIHJldHVybiB7IGJ5dGVMZW5ndGg6IDE2LCB3aWR0aDogMTAsIGhlaWdodDogMTAgfTtcclxuXHRcdGlmICggZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LkFTVEMxMngxMFVub3JtIHx8IGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5BU1RDMTJ4MTBVbm9ybVNSR0IgKSByZXR1cm4geyBieXRlTGVuZ3RoOiAxNiwgd2lkdGg6IDEyLCBoZWlnaHQ6IDEwIH07XHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5BU1RDMTJ4MTJVbm9ybSB8fCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuQVNUQzEyeDEyVW5vcm1TUkdCICkgcmV0dXJuIHsgYnl0ZUxlbmd0aDogMTYsIHdpZHRoOiAxMiwgaGVpZ2h0OiAxMiB9O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnZlcnRzIHRoZSB0aHJlZS5qcyB1diB3cmFwcGluZyBjb25zdGFudHMgdG8gR1BVIGFkZHJlc3MgbW9kZSBjb25zdGFudHMuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSB0aHJlZS5qcyBjb25zdGFudCBkZWZpbmluZyBhIHV2IHdyYXBwaW5nIG1vZGUuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgR1BVIGFkZHJlc3MgbW9kZS5cclxuXHQgKi9cclxuXHRfY29udmVydEFkZHJlc3NNb2RlKCB2YWx1ZSApIHtcclxuXHJcblx0XHRsZXQgYWRkcmVzc01vZGUgPSBHUFVBZGRyZXNzTW9kZS5DbGFtcFRvRWRnZTtcclxuXHJcblx0XHRpZiAoIHZhbHVlID09PSBSZXBlYXRXcmFwcGluZyApIHtcclxuXHJcblx0XHRcdGFkZHJlc3NNb2RlID0gR1BVQWRkcmVzc01vZGUuUmVwZWF0O1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHZhbHVlID09PSBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nICkge1xyXG5cclxuXHRcdFx0YWRkcmVzc01vZGUgPSBHUFVBZGRyZXNzTW9kZS5NaXJyb3JSZXBlYXQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBhZGRyZXNzTW9kZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb252ZXJ0cyB0aGUgdGhyZWUuanMgZmlsdGVyIGNvbnN0YW50cyB0byBHUFUgZmlsdGVyIGNvbnN0YW50cy5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIHRocmVlLmpzIGNvbnN0YW50IGRlZmluaW5nIGEgZmlsdGVyIG1vZGUuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgR1BVIGZpbHRlciBtb2RlLlxyXG5cdCAqL1xyXG5cdF9jb252ZXJ0RmlsdGVyTW9kZSggdmFsdWUgKSB7XHJcblxyXG5cdFx0bGV0IGZpbHRlck1vZGUgPSBHUFVGaWx0ZXJNb2RlLkxpbmVhcjtcclxuXHJcblx0XHRpZiAoIHZhbHVlID09PSBOZWFyZXN0RmlsdGVyIHx8IHZhbHVlID09PSBOZWFyZXN0TWlwbWFwTmVhcmVzdEZpbHRlciB8fCB2YWx1ZSA9PT0gTmVhcmVzdE1pcG1hcExpbmVhckZpbHRlciApIHtcclxuXHJcblx0XHRcdGZpbHRlck1vZGUgPSBHUFVGaWx0ZXJNb2RlLk5lYXJlc3Q7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBmaWx0ZXJNb2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGJ5dGVzLXBlci10ZXhlbCB2YWx1ZSBmb3IgdGhlIGdpdmVuIEdQVSB0ZXh0dXJlIGZvcm1hdC5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGZvcm1hdCAtIFRoZSBHUFUgdGV4dHVyZSBmb3JtYXQuXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgYnl0ZXMtcGVyLXRleGVsLlxyXG5cdCAqL1xyXG5cdF9nZXRCeXRlc1BlclRleGVsKCBmb3JtYXQgKSB7XHJcblxyXG5cdFx0Ly8gOC1iaXQgZm9ybWF0c1xyXG5cdFx0aWYgKCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuUjhVbm9ybSB8fFxyXG5cdFx0XHRmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuUjhTbm9ybSB8fFxyXG5cdFx0XHRmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuUjhVaW50IHx8XHJcblx0XHRcdGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5SOFNpbnQgKSByZXR1cm4gMTtcclxuXHJcblx0XHQvLyAxNi1iaXQgZm9ybWF0c1xyXG5cdFx0aWYgKCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuUjE2VWludCB8fFxyXG5cdFx0XHRmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuUjE2U2ludCB8fFxyXG5cdFx0XHRmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuUjE2RmxvYXQgfHxcclxuXHRcdFx0Zm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LlJHOFVub3JtIHx8XHJcblx0XHRcdGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5SRzhTbm9ybSB8fFxyXG5cdFx0XHRmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuUkc4VWludCB8fFxyXG5cdFx0XHRmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuUkc4U2ludCApIHJldHVybiAyO1xyXG5cclxuXHRcdC8vIDMyLWJpdCBmb3JtYXRzXHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5SMzJVaW50IHx8XHJcblx0XHRcdGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5SMzJTaW50IHx8XHJcblx0XHRcdGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5SMzJGbG9hdCB8fFxyXG5cdFx0XHRmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuUkcxNlVpbnQgfHxcclxuXHRcdFx0Zm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LlJHMTZTaW50IHx8XHJcblx0XHRcdGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5SRzE2RmxvYXQgfHxcclxuXHRcdFx0Zm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LlJHQkE4VW5vcm0gfHxcclxuXHRcdFx0Zm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LlJHQkE4VW5vcm1TUkdCIHx8XHJcblx0XHRcdGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5SR0JBOFNub3JtIHx8XHJcblx0XHRcdGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5SR0JBOFVpbnQgfHxcclxuXHRcdFx0Zm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LlJHQkE4U2ludCB8fFxyXG5cdFx0XHRmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuQkdSQThVbm9ybSB8fFxyXG5cdFx0XHRmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuQkdSQThVbm9ybVNSR0IgfHxcclxuXHRcdFx0Ly8gUGFja2VkIDMyLWJpdCBmb3JtYXRzXHJcblx0XHRcdGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5SR0I5RTVVRmxvYXQgfHxcclxuXHRcdFx0Zm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LlJHQjEwQTJVbm9ybSB8fFxyXG5cdFx0XHRmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuUkcxMUIxMFVGbG9hdCB8fFxyXG5cdFx0XHRmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuRGVwdGgzMkZsb2F0IHx8XHJcblx0XHRcdGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5EZXB0aDI0UGx1cyB8fFxyXG5cdFx0XHRmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuRGVwdGgyNFBsdXNTdGVuY2lsOCB8fFxyXG5cdFx0XHRmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuRGVwdGgzMkZsb2F0U3RlbmNpbDggKSByZXR1cm4gNDtcclxuXHJcblx0XHQvLyA2NC1iaXQgZm9ybWF0c1xyXG5cdFx0aWYgKCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuUkczMlVpbnQgfHxcclxuXHRcdFx0Zm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LlJHMzJTaW50IHx8XHJcblx0XHRcdGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5SRzMyRmxvYXQgfHxcclxuXHRcdFx0Zm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LlJHQkExNlVpbnQgfHxcclxuXHRcdFx0Zm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LlJHQkExNlNpbnQgfHxcclxuXHRcdFx0Zm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LlJHQkExNkZsb2F0ICkgcmV0dXJuIDg7XHJcblxyXG5cdFx0Ly8gMTI4LWJpdCBmb3JtYXRzXHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5SR0JBMzJVaW50IHx8XHJcblx0XHRcdGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5SR0JBMzJTaW50IHx8XHJcblx0XHRcdGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5SR0JBMzJGbG9hdCApIHJldHVybiAxNjtcclxuXHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyB0eXBlZCBhcnJheSB0eXBlIGZvciB0aGUgZ2l2ZW4gR1BVIHRleHR1cmUgZm9ybWF0LlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gZm9ybWF0IC0gVGhlIEdQVSB0ZXh0dXJlIGZvcm1hdC5cclxuXHQgKiBAcmV0dXJuIHtUeXBlZEFycmF5LmNvbnN0cnVjdG9yfSBUaGUgdHlwZWQgYXJyYXkgdHlwZS5cclxuXHQgKi9cclxuXHRfZ2V0VHlwZWRBcnJheVR5cGUoIGZvcm1hdCApIHtcclxuXHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5SOFVpbnQgKSByZXR1cm4gVWludDhBcnJheTtcclxuXHRcdGlmICggZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LlI4U2ludCApIHJldHVybiBJbnQ4QXJyYXk7XHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5SOFVub3JtICkgcmV0dXJuIFVpbnQ4QXJyYXk7XHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5SOFNub3JtICkgcmV0dXJuIEludDhBcnJheTtcclxuXHRcdGlmICggZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LlJHOFVpbnQgKSByZXR1cm4gVWludDhBcnJheTtcclxuXHRcdGlmICggZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LlJHOFNpbnQgKSByZXR1cm4gSW50OEFycmF5O1xyXG5cdFx0aWYgKCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuUkc4VW5vcm0gKSByZXR1cm4gVWludDhBcnJheTtcclxuXHRcdGlmICggZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LlJHOFNub3JtICkgcmV0dXJuIEludDhBcnJheTtcclxuXHRcdGlmICggZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LlJHQkE4VWludCApIHJldHVybiBVaW50OEFycmF5O1xyXG5cdFx0aWYgKCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuUkdCQThTaW50ICkgcmV0dXJuIEludDhBcnJheTtcclxuXHRcdGlmICggZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LlJHQkE4VW5vcm0gKSByZXR1cm4gVWludDhBcnJheTtcclxuXHRcdGlmICggZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LlJHQkE4U25vcm0gKSByZXR1cm4gSW50OEFycmF5O1xyXG5cclxuXHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5SMTZVaW50ICkgcmV0dXJuIFVpbnQxNkFycmF5O1xyXG5cdFx0aWYgKCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuUjE2U2ludCApIHJldHVybiBJbnQxNkFycmF5O1xyXG5cdFx0aWYgKCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuUkcxNlVpbnQgKSByZXR1cm4gVWludDE2QXJyYXk7XHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5SRzE2U2ludCApIHJldHVybiBJbnQxNkFycmF5O1xyXG5cdFx0aWYgKCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuUkdCQTE2VWludCApIHJldHVybiBVaW50MTZBcnJheTtcclxuXHRcdGlmICggZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LlJHQkExNlNpbnQgKSByZXR1cm4gSW50MTZBcnJheTtcclxuXHRcdGlmICggZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LlIxNkZsb2F0ICkgcmV0dXJuIFVpbnQxNkFycmF5O1xyXG5cdFx0aWYgKCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuUkcxNkZsb2F0ICkgcmV0dXJuIFVpbnQxNkFycmF5O1xyXG5cdFx0aWYgKCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuUkdCQTE2RmxvYXQgKSByZXR1cm4gVWludDE2QXJyYXk7XHJcblxyXG5cclxuXHRcdGlmICggZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LlIzMlVpbnQgKSByZXR1cm4gVWludDMyQXJyYXk7XHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5SMzJTaW50ICkgcmV0dXJuIEludDMyQXJyYXk7XHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5SMzJGbG9hdCApIHJldHVybiBGbG9hdDMyQXJyYXk7XHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5SRzMyVWludCApIHJldHVybiBVaW50MzJBcnJheTtcclxuXHRcdGlmICggZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LlJHMzJTaW50ICkgcmV0dXJuIEludDMyQXJyYXk7XHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5SRzMyRmxvYXQgKSByZXR1cm4gRmxvYXQzMkFycmF5O1xyXG5cdFx0aWYgKCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuUkdCQTMyVWludCApIHJldHVybiBVaW50MzJBcnJheTtcclxuXHRcdGlmICggZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LlJHQkEzMlNpbnQgKSByZXR1cm4gSW50MzJBcnJheTtcclxuXHRcdGlmICggZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LlJHQkEzMkZsb2F0ICkgcmV0dXJuIEZsb2F0MzJBcnJheTtcclxuXHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5CR1JBOFVub3JtICkgcmV0dXJuIFVpbnQ4QXJyYXk7XHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5CR1JBOFVub3JtU1JHQiApIHJldHVybiBVaW50OEFycmF5O1xyXG5cdFx0aWYgKCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuUkdCMTBBMlVub3JtICkgcmV0dXJuIFVpbnQzMkFycmF5O1xyXG5cdFx0aWYgKCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuUkdCOUU1VUZsb2F0ICkgcmV0dXJuIFVpbnQzMkFycmF5O1xyXG5cdFx0aWYgKCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuUkcxMUIxMFVGbG9hdCApIHJldHVybiBVaW50MzJBcnJheTtcclxuXHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5EZXB0aDMyRmxvYXQgKSByZXR1cm4gRmxvYXQzMkFycmF5O1xyXG5cdFx0aWYgKCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuRGVwdGgyNFBsdXMgKSByZXR1cm4gVWludDMyQXJyYXk7XHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5EZXB0aDI0UGx1c1N0ZW5jaWw4ICkgcmV0dXJuIFVpbnQzMkFycmF5O1xyXG5cdFx0aWYgKCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuRGVwdGgzMkZsb2F0U3RlbmNpbDggKSByZXR1cm4gRmxvYXQzMkFycmF5O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIEdQVSBkaW1lbnNpb25zIGZvciB0aGUgZ2l2ZW4gdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgR1BVIGRpbWVuc2lvbi5cclxuXHQgKi9cclxuXHRfZ2V0RGltZW5zaW9uKCB0ZXh0dXJlICkge1xyXG5cclxuXHRcdGxldCBkaW1lbnNpb247XHJcblxyXG5cdFx0aWYgKCB0ZXh0dXJlLmlzRGF0YTNEVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdGRpbWVuc2lvbiA9IEdQVVRleHR1cmVEaW1lbnNpb24uVGhyZWVEO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRkaW1lbnNpb24gPSBHUFVUZXh0dXJlRGltZW5zaW9uLlR3b0Q7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBkaW1lbnNpb247XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBHUFUgZm9ybWF0IGZvciB0aGUgZ2l2ZW4gdGV4dHVyZS5cclxuICpcclxuICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUuXHJcbiAqIEBwYXJhbSB7P0dQVURldmljZX0gW2RldmljZT1udWxsXSAtIFRoZSBHUFUgZGV2aWNlIHdoaWNoIGlzIHVzZWQgZm9yIGZlYXR1cmUgZGV0ZWN0aW9uLlxyXG4gKiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGFwcGx5IHRoZSBkZXZpY2UgZm9yIG1vc3QgZm9ybWF0cy5cclxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgR1BVIGZvcm1hdC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtYXQoIHRleHR1cmUsIGRldmljZSA9IG51bGwgKSB7XHJcblxyXG5cdGNvbnN0IGZvcm1hdCA9IHRleHR1cmUuZm9ybWF0O1xyXG5cdGNvbnN0IHR5cGUgPSB0ZXh0dXJlLnR5cGU7XHJcblx0Y29uc3QgY29sb3JTcGFjZSA9IHRleHR1cmUuY29sb3JTcGFjZTtcclxuXHJcblx0bGV0IGZvcm1hdEdQVTtcclxuXHJcblx0aWYgKCB0ZXh0dXJlLmlzQ29tcHJlc3NlZFRleHR1cmUgPT09IHRydWUgfHwgdGV4dHVyZS5pc0NvbXByZXNzZWRBcnJheVRleHR1cmUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0c3dpdGNoICggZm9ybWF0ICkge1xyXG5cclxuXHRcdFx0Y2FzZSBSR0JBX1MzVENfRFhUMV9Gb3JtYXQ6XHJcblx0XHRcdFx0Zm9ybWF0R1BVID0gKCBjb2xvclNwYWNlID09PSBTUkdCQ29sb3JTcGFjZSApID8gR1BVVGV4dHVyZUZvcm1hdC5CQzFSR0JBVW5vcm1TUkdCIDogR1BVVGV4dHVyZUZvcm1hdC5CQzFSR0JBVW5vcm07XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIFJHQkFfUzNUQ19EWFQzX0Zvcm1hdDpcclxuXHRcdFx0XHRmb3JtYXRHUFUgPSAoIGNvbG9yU3BhY2UgPT09IFNSR0JDb2xvclNwYWNlICkgPyBHUFVUZXh0dXJlRm9ybWF0LkJDMlJHQkFVbm9ybVNSR0IgOiBHUFVUZXh0dXJlRm9ybWF0LkJDMlJHQkFVbm9ybTtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgUkdCQV9TM1RDX0RYVDVfRm9ybWF0OlxyXG5cdFx0XHRcdGZvcm1hdEdQVSA9ICggY29sb3JTcGFjZSA9PT0gU1JHQkNvbG9yU3BhY2UgKSA/IEdQVVRleHR1cmVGb3JtYXQuQkMzUkdCQVVub3JtU1JHQiA6IEdQVVRleHR1cmVGb3JtYXQuQkMzUkdCQVVub3JtO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBSR0JfRVRDMl9Gb3JtYXQ6XHJcblx0XHRcdFx0Zm9ybWF0R1BVID0gKCBjb2xvclNwYWNlID09PSBTUkdCQ29sb3JTcGFjZSApID8gR1BVVGV4dHVyZUZvcm1hdC5FVEMyUkdCOFVub3JtU1JHQiA6IEdQVVRleHR1cmVGb3JtYXQuRVRDMlJHQjhVbm9ybTtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgUkdCQV9FVEMyX0VBQ19Gb3JtYXQ6XHJcblx0XHRcdFx0Zm9ybWF0R1BVID0gKCBjb2xvclNwYWNlID09PSBTUkdCQ29sb3JTcGFjZSApID8gR1BVVGV4dHVyZUZvcm1hdC5FVEMyUkdCQThVbm9ybVNSR0IgOiBHUFVUZXh0dXJlRm9ybWF0LkVUQzJSR0JBOFVub3JtO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBSR0JBX0FTVENfNHg0X0Zvcm1hdDpcclxuXHRcdFx0XHRmb3JtYXRHUFUgPSAoIGNvbG9yU3BhY2UgPT09IFNSR0JDb2xvclNwYWNlICkgPyBHUFVUZXh0dXJlRm9ybWF0LkFTVEM0eDRVbm9ybVNSR0IgOiBHUFVUZXh0dXJlRm9ybWF0LkFTVEM0eDRVbm9ybTtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgUkdCQV9BU1RDXzV4NF9Gb3JtYXQ6XHJcblx0XHRcdFx0Zm9ybWF0R1BVID0gKCBjb2xvclNwYWNlID09PSBTUkdCQ29sb3JTcGFjZSApID8gR1BVVGV4dHVyZUZvcm1hdC5BU1RDNXg0VW5vcm1TUkdCIDogR1BVVGV4dHVyZUZvcm1hdC5BU1RDNXg0VW5vcm07XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIFJHQkFfQVNUQ181eDVfRm9ybWF0OlxyXG5cdFx0XHRcdGZvcm1hdEdQVSA9ICggY29sb3JTcGFjZSA9PT0gU1JHQkNvbG9yU3BhY2UgKSA/IEdQVVRleHR1cmVGb3JtYXQuQVNUQzV4NVVub3JtU1JHQiA6IEdQVVRleHR1cmVGb3JtYXQuQVNUQzV4NVVub3JtO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBSR0JBX0FTVENfNng1X0Zvcm1hdDpcclxuXHRcdFx0XHRmb3JtYXRHUFUgPSAoIGNvbG9yU3BhY2UgPT09IFNSR0JDb2xvclNwYWNlICkgPyBHUFVUZXh0dXJlRm9ybWF0LkFTVEM2eDVVbm9ybVNSR0IgOiBHUFVUZXh0dXJlRm9ybWF0LkFTVEM2eDVVbm9ybTtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgUkdCQV9BU1RDXzZ4Nl9Gb3JtYXQ6XHJcblx0XHRcdFx0Zm9ybWF0R1BVID0gKCBjb2xvclNwYWNlID09PSBTUkdCQ29sb3JTcGFjZSApID8gR1BVVGV4dHVyZUZvcm1hdC5BU1RDNng2VW5vcm1TUkdCIDogR1BVVGV4dHVyZUZvcm1hdC5BU1RDNng2VW5vcm07XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIFJHQkFfQVNUQ184eDVfRm9ybWF0OlxyXG5cdFx0XHRcdGZvcm1hdEdQVSA9ICggY29sb3JTcGFjZSA9PT0gU1JHQkNvbG9yU3BhY2UgKSA/IEdQVVRleHR1cmVGb3JtYXQuQVNUQzh4NVVub3JtU1JHQiA6IEdQVVRleHR1cmVGb3JtYXQuQVNUQzh4NVVub3JtO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBSR0JBX0FTVENfOHg2X0Zvcm1hdDpcclxuXHRcdFx0XHRmb3JtYXRHUFUgPSAoIGNvbG9yU3BhY2UgPT09IFNSR0JDb2xvclNwYWNlICkgPyBHUFVUZXh0dXJlRm9ybWF0LkFTVEM4eDZVbm9ybVNSR0IgOiBHUFVUZXh0dXJlRm9ybWF0LkFTVEM4eDZVbm9ybTtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgUkdCQV9BU1RDXzh4OF9Gb3JtYXQ6XHJcblx0XHRcdFx0Zm9ybWF0R1BVID0gKCBjb2xvclNwYWNlID09PSBTUkdCQ29sb3JTcGFjZSApID8gR1BVVGV4dHVyZUZvcm1hdC5BU1RDOHg4VW5vcm1TUkdCIDogR1BVVGV4dHVyZUZvcm1hdC5BU1RDOHg4VW5vcm07XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIFJHQkFfQVNUQ18xMHg1X0Zvcm1hdDpcclxuXHRcdFx0XHRmb3JtYXRHUFUgPSAoIGNvbG9yU3BhY2UgPT09IFNSR0JDb2xvclNwYWNlICkgPyBHUFVUZXh0dXJlRm9ybWF0LkFTVEMxMHg1VW5vcm1TUkdCIDogR1BVVGV4dHVyZUZvcm1hdC5BU1RDMTB4NVVub3JtO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBSR0JBX0FTVENfMTB4Nl9Gb3JtYXQ6XHJcblx0XHRcdFx0Zm9ybWF0R1BVID0gKCBjb2xvclNwYWNlID09PSBTUkdCQ29sb3JTcGFjZSApID8gR1BVVGV4dHVyZUZvcm1hdC5BU1RDMTB4NlVub3JtU1JHQiA6IEdQVVRleHR1cmVGb3JtYXQuQVNUQzEweDZVbm9ybTtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgUkdCQV9BU1RDXzEweDhfRm9ybWF0OlxyXG5cdFx0XHRcdGZvcm1hdEdQVSA9ICggY29sb3JTcGFjZSA9PT0gU1JHQkNvbG9yU3BhY2UgKSA/IEdQVVRleHR1cmVGb3JtYXQuQVNUQzEweDhVbm9ybVNSR0IgOiBHUFVUZXh0dXJlRm9ybWF0LkFTVEMxMHg4VW5vcm07XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIFJHQkFfQVNUQ18xMHgxMF9Gb3JtYXQ6XHJcblx0XHRcdFx0Zm9ybWF0R1BVID0gKCBjb2xvclNwYWNlID09PSBTUkdCQ29sb3JTcGFjZSApID8gR1BVVGV4dHVyZUZvcm1hdC5BU1RDMTB4MTBVbm9ybVNSR0IgOiBHUFVUZXh0dXJlRm9ybWF0LkFTVEMxMHgxMFVub3JtO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBSR0JBX0FTVENfMTJ4MTBfRm9ybWF0OlxyXG5cdFx0XHRcdGZvcm1hdEdQVSA9ICggY29sb3JTcGFjZSA9PT0gU1JHQkNvbG9yU3BhY2UgKSA/IEdQVVRleHR1cmVGb3JtYXQuQVNUQzEyeDEwVW5vcm1TUkdCIDogR1BVVGV4dHVyZUZvcm1hdC5BU1RDMTJ4MTBVbm9ybTtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgUkdCQV9BU1RDXzEyeDEyX0Zvcm1hdDpcclxuXHRcdFx0XHRmb3JtYXRHUFUgPSAoIGNvbG9yU3BhY2UgPT09IFNSR0JDb2xvclNwYWNlICkgPyBHUFVUZXh0dXJlRm9ybWF0LkFTVEMxMngxMlVub3JtU1JHQiA6IEdQVVRleHR1cmVGb3JtYXQuQVNUQzEyeDEyVW5vcm07XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIFJHQkFGb3JtYXQ6XHJcblx0XHRcdFx0Zm9ybWF0R1BVID0gKCBjb2xvclNwYWNlID09PSBTUkdCQ29sb3JTcGFjZSApID8gR1BVVGV4dHVyZUZvcm1hdC5SR0JBOFVub3JtU1JHQiA6IEdQVVRleHR1cmVGb3JtYXQuUkdCQThVbm9ybTtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1dlYkdQVVJlbmRlcmVyOiBVbnN1cHBvcnRlZCB0ZXh0dXJlIGZvcm1hdC4nLCBmb3JtYXQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0c3dpdGNoICggZm9ybWF0ICkge1xyXG5cclxuXHRcdFx0Y2FzZSBSR0JBRm9ybWF0OlxyXG5cclxuXHRcdFx0XHRzd2l0Y2ggKCB0eXBlICkge1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgQnl0ZVR5cGU6XHJcblx0XHRcdFx0XHRcdGZvcm1hdEdQVSA9IEdQVVRleHR1cmVGb3JtYXQuUkdCQThTbm9ybTtcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0Y2FzZSBTaG9ydFR5cGU6XHJcblx0XHRcdFx0XHRcdGZvcm1hdEdQVSA9IEdQVVRleHR1cmVGb3JtYXQuUkdCQTE2U2ludDtcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0Y2FzZSBVbnNpZ25lZFNob3J0VHlwZTpcclxuXHRcdFx0XHRcdFx0Zm9ybWF0R1BVID0gR1BVVGV4dHVyZUZvcm1hdC5SR0JBMTZVaW50O1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdGNhc2UgVW5zaWduZWRJbnRUeXBlOlxyXG5cdFx0XHRcdFx0XHRmb3JtYXRHUFUgPSBHUFVUZXh0dXJlRm9ybWF0LlJHQkEzMlVpbnQ7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgSW50VHlwZTpcclxuXHRcdFx0XHRcdFx0Zm9ybWF0R1BVID0gR1BVVGV4dHVyZUZvcm1hdC5SR0JBMzJTaW50O1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRjYXNlIFVuc2lnbmVkQnl0ZVR5cGU6XHJcblx0XHRcdFx0XHRcdGZvcm1hdEdQVSA9ICggY29sb3JTcGFjZSA9PT0gU1JHQkNvbG9yU3BhY2UgKSA/IEdQVVRleHR1cmVGb3JtYXQuUkdCQThVbm9ybVNSR0IgOiBHUFVUZXh0dXJlRm9ybWF0LlJHQkE4VW5vcm07XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgSGFsZkZsb2F0VHlwZTpcclxuXHRcdFx0XHRcdFx0Zm9ybWF0R1BVID0gR1BVVGV4dHVyZUZvcm1hdC5SR0JBMTZGbG9hdDtcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0Y2FzZSBGbG9hdFR5cGU6XHJcblx0XHRcdFx0XHRcdGZvcm1hdEdQVSA9IEdQVVRleHR1cmVGb3JtYXQuUkdCQTMyRmxvYXQ7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdXZWJHUFVSZW5kZXJlcjogVW5zdXBwb3J0ZWQgdGV4dHVyZSB0eXBlIHdpdGggUkdCQUZvcm1hdC4nLCB0eXBlICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIFJHQkZvcm1hdDpcclxuXHJcblx0XHRcdFx0c3dpdGNoICggdHlwZSApIHtcclxuXHJcblx0XHRcdFx0XHRjYXNlIFVuc2lnbmVkSW50NTk5OVR5cGU6XHJcblx0XHRcdFx0XHRcdGZvcm1hdEdQVSA9IEdQVVRleHR1cmVGb3JtYXQuUkdCOUU1VUZsb2F0O1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnV2ViR1BVUmVuZGVyZXI6IFVuc3VwcG9ydGVkIHRleHR1cmUgdHlwZSB3aXRoIFJHQkZvcm1hdC4nLCB0eXBlICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIFJlZEZvcm1hdDpcclxuXHJcblx0XHRcdFx0c3dpdGNoICggdHlwZSApIHtcclxuXHJcblx0XHRcdFx0XHRjYXNlIEJ5dGVUeXBlOlxyXG5cdFx0XHRcdFx0XHRmb3JtYXRHUFUgPSBHUFVUZXh0dXJlRm9ybWF0LlI4U25vcm07XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgU2hvcnRUeXBlOlxyXG5cdFx0XHRcdFx0XHRmb3JtYXRHUFUgPSBHUFVUZXh0dXJlRm9ybWF0LlIxNlNpbnQ7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgVW5zaWduZWRTaG9ydFR5cGU6XHJcblx0XHRcdFx0XHRcdGZvcm1hdEdQVSA9IEdQVVRleHR1cmVGb3JtYXQuUjE2VWludDtcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0Y2FzZSBVbnNpZ25lZEludFR5cGU6XHJcblx0XHRcdFx0XHRcdGZvcm1hdEdQVSA9IEdQVVRleHR1cmVGb3JtYXQuUjMyVWludDtcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0Y2FzZSBJbnRUeXBlOlxyXG5cdFx0XHRcdFx0XHRmb3JtYXRHUFUgPSBHUFVUZXh0dXJlRm9ybWF0LlIzMlNpbnQ7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgVW5zaWduZWRCeXRlVHlwZTpcclxuXHRcdFx0XHRcdFx0Zm9ybWF0R1BVID0gR1BVVGV4dHVyZUZvcm1hdC5SOFVub3JtO1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRjYXNlIEhhbGZGbG9hdFR5cGU6XHJcblx0XHRcdFx0XHRcdGZvcm1hdEdQVSA9IEdQVVRleHR1cmVGb3JtYXQuUjE2RmxvYXQ7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgRmxvYXRUeXBlOlxyXG5cdFx0XHRcdFx0XHRmb3JtYXRHUFUgPSBHUFVUZXh0dXJlRm9ybWF0LlIzMkZsb2F0O1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnV2ViR1BVUmVuZGVyZXI6IFVuc3VwcG9ydGVkIHRleHR1cmUgdHlwZSB3aXRoIFJlZEZvcm1hdC4nLCB0eXBlICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIFJHRm9ybWF0OlxyXG5cclxuXHRcdFx0XHRzd2l0Y2ggKCB0eXBlICkge1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgQnl0ZVR5cGU6XHJcblx0XHRcdFx0XHRcdGZvcm1hdEdQVSA9IEdQVVRleHR1cmVGb3JtYXQuUkc4U25vcm07XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgU2hvcnRUeXBlOlxyXG5cdFx0XHRcdFx0XHRmb3JtYXRHUFUgPSBHUFVUZXh0dXJlRm9ybWF0LlJHMTZTaW50O1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRjYXNlIFVuc2lnbmVkU2hvcnRUeXBlOlxyXG5cdFx0XHRcdFx0XHRmb3JtYXRHUFUgPSBHUFVUZXh0dXJlRm9ybWF0LlJHMTZVaW50O1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRjYXNlIFVuc2lnbmVkSW50VHlwZTpcclxuXHRcdFx0XHRcdFx0Zm9ybWF0R1BVID0gR1BVVGV4dHVyZUZvcm1hdC5SRzMyVWludDtcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0Y2FzZSBJbnRUeXBlOlxyXG5cdFx0XHRcdFx0XHRmb3JtYXRHUFUgPSBHUFVUZXh0dXJlRm9ybWF0LlJHMzJTaW50O1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRjYXNlIFVuc2lnbmVkQnl0ZVR5cGU6XHJcblx0XHRcdFx0XHRcdGZvcm1hdEdQVSA9IEdQVVRleHR1cmVGb3JtYXQuUkc4VW5vcm07XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgSGFsZkZsb2F0VHlwZTpcclxuXHRcdFx0XHRcdFx0Zm9ybWF0R1BVID0gR1BVVGV4dHVyZUZvcm1hdC5SRzE2RmxvYXQ7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgRmxvYXRUeXBlOlxyXG5cdFx0XHRcdFx0XHRmb3JtYXRHUFUgPSBHUFVUZXh0dXJlRm9ybWF0LlJHMzJGbG9hdDtcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1dlYkdQVVJlbmRlcmVyOiBVbnN1cHBvcnRlZCB0ZXh0dXJlIHR5cGUgd2l0aCBSR0Zvcm1hdC4nLCB0eXBlICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIERlcHRoRm9ybWF0OlxyXG5cclxuXHRcdFx0XHRzd2l0Y2ggKCB0eXBlICkge1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgVW5zaWduZWRTaG9ydFR5cGU6XHJcblx0XHRcdFx0XHRcdGZvcm1hdEdQVSA9IEdQVVRleHR1cmVGb3JtYXQuRGVwdGgxNlVub3JtO1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRjYXNlIFVuc2lnbmVkSW50VHlwZTpcclxuXHRcdFx0XHRcdFx0Zm9ybWF0R1BVID0gR1BVVGV4dHVyZUZvcm1hdC5EZXB0aDI0UGx1cztcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0Y2FzZSBGbG9hdFR5cGU6XHJcblx0XHRcdFx0XHRcdGZvcm1hdEdQVSA9IEdQVVRleHR1cmVGb3JtYXQuRGVwdGgzMkZsb2F0O1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnV2ViR1BVUmVuZGVyZXI6IFVuc3VwcG9ydGVkIHRleHR1cmUgdHlwZSB3aXRoIERlcHRoRm9ybWF0LicsIHR5cGUgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgRGVwdGhTdGVuY2lsRm9ybWF0OlxyXG5cclxuXHRcdFx0XHRzd2l0Y2ggKCB0eXBlICkge1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgVW5zaWduZWRJbnQyNDhUeXBlOlxyXG5cdFx0XHRcdFx0XHRmb3JtYXRHUFUgPSBHUFVUZXh0dXJlRm9ybWF0LkRlcHRoMjRQbHVzU3RlbmNpbDg7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgRmxvYXRUeXBlOlxyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCBkZXZpY2UgJiYgZGV2aWNlLmZlYXR1cmVzLmhhcyggR1BVRmVhdHVyZU5hbWUuRGVwdGgzMkZsb2F0U3RlbmNpbDggKSA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdXZWJHUFVSZW5kZXJlcjogRGVwdGggdGV4dHVyZXMgd2l0aCBEZXB0aFN0ZW5jaWxGb3JtYXQgKyBGbG9hdFR5cGUgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIHRoZSBcImRlcHRoMzJmbG9hdC1zdGVuY2lsOFwiIEdQVSBmZWF0dXJlLicgKTtcclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdGZvcm1hdEdQVSA9IEdQVVRleHR1cmVGb3JtYXQuRGVwdGgzMkZsb2F0U3RlbmNpbDg7XHJcblxyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnV2ViR1BVUmVuZGVyZXI6IFVuc3VwcG9ydGVkIHRleHR1cmUgdHlwZSB3aXRoIERlcHRoU3RlbmNpbEZvcm1hdC4nLCB0eXBlICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIFJlZEludGVnZXJGb3JtYXQ6XHJcblxyXG5cdFx0XHRcdHN3aXRjaCAoIHR5cGUgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y2FzZSBJbnRUeXBlOlxyXG5cdFx0XHRcdFx0XHRmb3JtYXRHUFUgPSBHUFVUZXh0dXJlRm9ybWF0LlIzMlNpbnQ7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgVW5zaWduZWRJbnRUeXBlOlxyXG5cdFx0XHRcdFx0XHRmb3JtYXRHUFUgPSBHUFVUZXh0dXJlRm9ybWF0LlIzMlVpbnQ7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdXZWJHUFVSZW5kZXJlcjogVW5zdXBwb3J0ZWQgdGV4dHVyZSB0eXBlIHdpdGggUmVkSW50ZWdlckZvcm1hdC4nLCB0eXBlICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIFJHSW50ZWdlckZvcm1hdDpcclxuXHJcblx0XHRcdFx0c3dpdGNoICggdHlwZSApIHtcclxuXHJcblx0XHRcdFx0XHRjYXNlIEludFR5cGU6XHJcblx0XHRcdFx0XHRcdGZvcm1hdEdQVSA9IEdQVVRleHR1cmVGb3JtYXQuUkczMlNpbnQ7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgVW5zaWduZWRJbnRUeXBlOlxyXG5cdFx0XHRcdFx0XHRmb3JtYXRHUFUgPSBHUFVUZXh0dXJlRm9ybWF0LlJHMzJVaW50O1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnV2ViR1BVUmVuZGVyZXI6IFVuc3VwcG9ydGVkIHRleHR1cmUgdHlwZSB3aXRoIFJHSW50ZWdlckZvcm1hdC4nLCB0eXBlICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIFJHQkFJbnRlZ2VyRm9ybWF0OlxyXG5cclxuXHRcdFx0XHRzd2l0Y2ggKCB0eXBlICkge1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgSW50VHlwZTpcclxuXHRcdFx0XHRcdFx0Zm9ybWF0R1BVID0gR1BVVGV4dHVyZUZvcm1hdC5SR0JBMzJTaW50O1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRjYXNlIFVuc2lnbmVkSW50VHlwZTpcclxuXHRcdFx0XHRcdFx0Zm9ybWF0R1BVID0gR1BVVGV4dHVyZUZvcm1hdC5SR0JBMzJVaW50O1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnV2ViR1BVUmVuZGVyZXI6IFVuc3VwcG9ydGVkIHRleHR1cmUgdHlwZSB3aXRoIFJHQkFJbnRlZ2VyRm9ybWF0LicsIHR5cGUgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1dlYkdQVVJlbmRlcmVyOiBVbnN1cHBvcnRlZCB0ZXh0dXJlIGZvcm1hdC4nLCBmb3JtYXQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIGZvcm1hdEdQVTtcclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFdlYkdQVVRleHR1cmVVdGlscztcclxuIiwiaW1wb3J0IE5vZGVGdW5jdGlvbiBmcm9tICcuLi8uLi8uLi9ub2Rlcy9jb3JlL05vZGVGdW5jdGlvbi5qcyc7XHJcbmltcG9ydCBOb2RlRnVuY3Rpb25JbnB1dCBmcm9tICcuLi8uLi8uLi9ub2Rlcy9jb3JlL05vZGVGdW5jdGlvbklucHV0LmpzJztcclxuXHJcbmNvbnN0IGRlY2xhcmF0aW9uUmVnZXhwID0gL15bZm5dKlxccyooW2Etel8wLTldKyk/XFxzKlxcKChbXFxzXFxTXSo/KVxcKVxccypbXFwtXFw+XSpcXHMqKFthLXpfMC05XSsoPzo8W1xcc1xcU10rPz4pPykvaTtcclxuY29uc3QgcHJvcGVydGllc1JlZ2V4cCA9IC8oW2Etel8wLTldKylcXHMqOlxccyooW2Etel8wLTldKyg/OjxbXFxzXFxTXSs/Pik/KS9pZztcclxuXHJcbmNvbnN0IHdnc2xUeXBlTGliID0ge1xyXG5cdCdmMzInOiAnZmxvYXQnLFxyXG5cdCdpMzInOiAnaW50JyxcclxuXHQndTMyJzogJ3VpbnQnLFxyXG5cdCdib29sJzogJ2Jvb2wnLFxyXG5cclxuXHQndmVjMjxmMzI+JzogJ3ZlYzInLFxyXG4gXHQndmVjMjxpMzI+JzogJ2l2ZWMyJyxcclxuIFx0J3ZlYzI8dTMyPic6ICd1dmVjMicsXHJcbiBcdCd2ZWMyPGJvb2w+JzogJ2J2ZWMyJyxcclxuXHJcblx0J3ZlYzJmJzogJ3ZlYzInLFxyXG5cdCd2ZWMyaSc6ICdpdmVjMicsXHJcblx0J3ZlYzJ1JzogJ3V2ZWMyJyxcclxuXHQndmVjMmInOiAnYnZlYzInLFxyXG5cclxuXHQndmVjMzxmMzI+JzogJ3ZlYzMnLFxyXG5cdCd2ZWMzPGkzMj4nOiAnaXZlYzMnLFxyXG5cdCd2ZWMzPHUzMj4nOiAndXZlYzMnLFxyXG5cdCd2ZWMzPGJvb2w+JzogJ2J2ZWMzJyxcclxuXHJcblx0J3ZlYzNmJzogJ3ZlYzMnLFxyXG5cdCd2ZWMzaSc6ICdpdmVjMycsXHJcblx0J3ZlYzN1JzogJ3V2ZWMzJyxcclxuXHQndmVjM2InOiAnYnZlYzMnLFxyXG5cclxuXHQndmVjNDxmMzI+JzogJ3ZlYzQnLFxyXG5cdCd2ZWM0PGkzMj4nOiAnaXZlYzQnLFxyXG5cdCd2ZWM0PHUzMj4nOiAndXZlYzQnLFxyXG5cdCd2ZWM0PGJvb2w+JzogJ2J2ZWM0JyxcclxuXHJcblx0J3ZlYzRmJzogJ3ZlYzQnLFxyXG5cdCd2ZWM0aSc6ICdpdmVjNCcsXHJcblx0J3ZlYzR1JzogJ3V2ZWM0JyxcclxuXHQndmVjNGInOiAnYnZlYzQnLFxyXG5cclxuXHQnbWF0MngyPGYzMj4nOiAnbWF0MicsXHJcblx0J21hdDJ4MmYnOiAnbWF0MicsXHJcblxyXG5cdCdtYXQzeDM8ZjMyPic6ICdtYXQzJyxcclxuXHQnbWF0M3gzZic6ICdtYXQzJyxcclxuXHJcblx0J21hdDR4NDxmMzI+JzogJ21hdDQnLFxyXG5cdCdtYXQ0eDRmJzogJ21hdDQnLFxyXG5cclxuXHQnc2FtcGxlcic6ICdzYW1wbGVyJyxcclxuXHJcblx0J3RleHR1cmVfMWQnOiAndGV4dHVyZScsXHJcblxyXG5cdCd0ZXh0dXJlXzJkJzogJ3RleHR1cmUnLFxyXG5cdCd0ZXh0dXJlXzJkX2FycmF5JzogJ3RleHR1cmUnLFxyXG5cdCd0ZXh0dXJlX211bHRpc2FtcGxlZF8yZCc6ICdjdWJlVGV4dHVyZScsXHJcblxyXG5cdCd0ZXh0dXJlX2RlcHRoXzJkJzogJ2RlcHRoVGV4dHVyZScsXHJcblx0J3RleHR1cmVfZGVwdGhfbXVsdGlzYW1wbGVkXzJkJzogJ2RlcHRoVGV4dHVyZScsXHJcblxyXG5cdCd0ZXh0dXJlXzNkJzogJ3RleHR1cmUzRCcsXHJcblxyXG5cdCd0ZXh0dXJlX2N1YmUnOiAnY3ViZVRleHR1cmUnLFxyXG5cdCd0ZXh0dXJlX2N1YmVfYXJyYXknOiAnY3ViZVRleHR1cmUnLFxyXG5cclxuXHQndGV4dHVyZV9zdG9yYWdlXzFkJzogJ3N0b3JhZ2VUZXh0dXJlJyxcclxuXHQndGV4dHVyZV9zdG9yYWdlXzJkJzogJ3N0b3JhZ2VUZXh0dXJlJyxcclxuXHQndGV4dHVyZV9zdG9yYWdlXzJkX2FycmF5JzogJ3N0b3JhZ2VUZXh0dXJlJyxcclxuXHQndGV4dHVyZV9zdG9yYWdlXzNkJzogJ3N0b3JhZ2VUZXh0dXJlJ1xyXG5cclxufTtcclxuXHJcbmNvbnN0IHBhcnNlID0gKCBzb3VyY2UgKSA9PiB7XHJcblxyXG5cdHNvdXJjZSA9IHNvdXJjZS50cmltKCk7XHJcblxyXG5cdGNvbnN0IGRlY2xhcmF0aW9uID0gc291cmNlLm1hdGNoKCBkZWNsYXJhdGlvblJlZ2V4cCApO1xyXG5cclxuXHRpZiAoIGRlY2xhcmF0aW9uICE9PSBudWxsICYmIGRlY2xhcmF0aW9uLmxlbmd0aCA9PT0gNCApIHtcclxuXHJcblx0XHRjb25zdCBpbnB1dHNDb2RlID0gZGVjbGFyYXRpb25bIDIgXTtcclxuXHRcdGNvbnN0IHByb3BzTWF0Y2hlcyA9IFtdO1xyXG5cdFx0bGV0IG1hdGNoID0gbnVsbDtcclxuXHJcblx0XHR3aGlsZSAoICggbWF0Y2ggPSBwcm9wZXJ0aWVzUmVnZXhwLmV4ZWMoIGlucHV0c0NvZGUgKSApICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0cHJvcHNNYXRjaGVzLnB1c2goIHsgbmFtZTogbWF0Y2hbIDEgXSwgdHlwZTogbWF0Y2hbIDIgXSB9ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFByb2Nlc3MgbWF0Y2hlcyB0byBjb3JyZWN0bHkgcGFpciBuYW1lcyBhbmQgdHlwZXNcclxuXHRcdGNvbnN0IGlucHV0cyA9IFtdO1xyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgcHJvcHNNYXRjaGVzLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHsgbmFtZSwgdHlwZSB9ID0gcHJvcHNNYXRjaGVzWyBpIF07XHJcblxyXG5cdFx0XHRsZXQgcmVzb2x2ZWRUeXBlID0gdHlwZTtcclxuXHJcblx0XHRcdGlmICggcmVzb2x2ZWRUeXBlLnN0YXJ0c1dpdGgoICdwdHInICkgKSB7XHJcblxyXG5cdFx0XHRcdHJlc29sdmVkVHlwZSA9ICdwb2ludGVyJztcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGlmICggcmVzb2x2ZWRUeXBlLnN0YXJ0c1dpdGgoICd0ZXh0dXJlJyApICkge1xyXG5cclxuXHRcdFx0XHRcdHJlc29sdmVkVHlwZSA9IHR5cGUuc3BsaXQoICc8JyApWyAwIF07XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0cmVzb2x2ZWRUeXBlID0gd2dzbFR5cGVMaWJbIHJlc29sdmVkVHlwZSBdO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aW5wdXRzLnB1c2goIG5ldyBOb2RlRnVuY3Rpb25JbnB1dCggcmVzb2x2ZWRUeXBlLCBuYW1lICkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgYmxvY2tDb2RlID0gc291cmNlLnN1YnN0cmluZyggZGVjbGFyYXRpb25bIDAgXS5sZW5ndGggKTtcclxuXHRcdGNvbnN0IG91dHB1dFR5cGUgPSBkZWNsYXJhdGlvblsgMyBdIHx8ICd2b2lkJztcclxuXHJcblx0XHRjb25zdCBuYW1lID0gZGVjbGFyYXRpb25bIDEgXSAhPT0gdW5kZWZpbmVkID8gZGVjbGFyYXRpb25bIDEgXSA6ICcnO1xyXG5cdFx0Y29uc3QgdHlwZSA9IHdnc2xUeXBlTGliWyBvdXRwdXRUeXBlIF0gfHwgb3V0cHV0VHlwZTtcclxuXHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHR0eXBlLFxyXG5cdFx0XHRpbnB1dHMsXHJcblx0XHRcdG5hbWUsXHJcblx0XHRcdGlucHV0c0NvZGUsXHJcblx0XHRcdGJsb2NrQ29kZSxcclxuXHRcdFx0b3V0cHV0VHlwZVxyXG5cdFx0fTtcclxuXHJcblx0fSBlbHNlIHtcclxuXHJcblx0XHR0aHJvdyBuZXcgRXJyb3IoICdGdW5jdGlvbk5vZGU6IEZ1bmN0aW9uIGlzIG5vdCBhIFdHU0wgY29kZS4nICk7XHJcblxyXG5cdH1cclxuXHJcbn07XHJcblxyXG4vKipcclxuICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NMIG5vZGUgZnVuY3Rpb24uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBOb2RlRnVuY3Rpb25cclxuICovXHJcbmNsYXNzIFdHU0xOb2RlRnVuY3Rpb24gZXh0ZW5kcyBOb2RlRnVuY3Rpb24ge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IFdHU0wgbm9kZSBmdW5jdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBUaGUgV0dTTCBzb3VyY2UuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHNvdXJjZSApIHtcclxuXHJcblx0XHRjb25zdCB7IHR5cGUsIGlucHV0cywgbmFtZSwgaW5wdXRzQ29kZSwgYmxvY2tDb2RlLCBvdXRwdXRUeXBlIH0gPSBwYXJzZSggc291cmNlICk7XHJcblxyXG5cdFx0c3VwZXIoIHR5cGUsIGlucHV0cywgbmFtZSApO1xyXG5cclxuXHRcdHRoaXMuaW5wdXRzQ29kZSA9IGlucHV0c0NvZGU7XHJcblx0XHR0aGlzLmJsb2NrQ29kZSA9IGJsb2NrQ29kZTtcclxuXHRcdHRoaXMub3V0cHV0VHlwZSA9IG91dHB1dFR5cGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgV0dTTCBjb2RlIG9mIHRoZSBub2RlIGZ1bmN0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lPXRoaXMubmFtZV0gLSBUaGUgZnVuY3Rpb24ncyBuYW1lLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHNoYWRlciBjb2RlLlxyXG5cdCAqL1xyXG5cdGdldENvZGUoIG5hbWUgPSB0aGlzLm5hbWUgKSB7XHJcblxyXG5cdFx0Y29uc3Qgb3V0cHV0VHlwZSA9IHRoaXMub3V0cHV0VHlwZSAhPT0gJ3ZvaWQnID8gJy0+ICcgKyB0aGlzLm91dHB1dFR5cGUgOiAnJztcclxuXHJcblx0XHRyZXR1cm4gYGZuICR7IG5hbWUgfSAoICR7IHRoaXMuaW5wdXRzQ29kZS50cmltKCkgfSApICR7IG91dHB1dFR5cGUgfWAgKyB0aGlzLmJsb2NrQ29kZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgV0dTTE5vZGVGdW5jdGlvbjtcclxuIiwiaW1wb3J0IE5vZGVQYXJzZXIgZnJvbSAnLi4vLi4vLi4vbm9kZXMvY29yZS9Ob2RlUGFyc2VyLmpzJztcclxuaW1wb3J0IFdHU0xOb2RlRnVuY3Rpb24gZnJvbSAnLi9XR1NMTm9kZUZ1bmN0aW9uLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIFdHU0wgbm9kZSBwYXJzZXIuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBOb2RlUGFyc2VyXHJcbiAqL1xyXG5jbGFzcyBXR1NMTm9kZVBhcnNlciBleHRlbmRzIE5vZGVQYXJzZXIge1xyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgbWV0aG9kIHBhcnNlcyB0aGUgZ2l2ZW4gV0dTTCBjb2RlIGFuIHJldHVybnMgYSBub2RlIGZ1bmN0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSAtIFRoZSBXR1NMIGNvZGUuXHJcblx0ICogQHJldHVybiB7V0dTTE5vZGVGdW5jdGlvbn0gQSBub2RlIGZ1bmN0aW9uLlxyXG5cdCAqL1xyXG5cdHBhcnNlRnVuY3Rpb24oIHNvdXJjZSApIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IFdHU0xOb2RlRnVuY3Rpb24oIHNvdXJjZSApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBXR1NMTm9kZVBhcnNlcjtcclxuIiwiaW1wb3J0IE5vZGVVbmlmb3Jtc0dyb3VwIGZyb20gJy4uLy4uL2NvbW1vbi9ub2Rlcy9Ob2RlVW5pZm9ybXNHcm91cC5qcyc7XHJcblxyXG5pbXBvcnQgTm9kZVNhbXBsZXIgZnJvbSAnLi4vLi4vY29tbW9uL25vZGVzL05vZGVTYW1wbGVyLmpzJztcclxuaW1wb3J0IHsgTm9kZVNhbXBsZWRUZXh0dXJlLCBOb2RlU2FtcGxlZEN1YmVUZXh0dXJlLCBOb2RlU2FtcGxlZFRleHR1cmUzRCB9IGZyb20gJy4uLy4uL2NvbW1vbi9ub2Rlcy9Ob2RlU2FtcGxlZFRleHR1cmUuanMnO1xyXG5cclxuaW1wb3J0IE5vZGVVbmlmb3JtQnVmZmVyIGZyb20gJy4uLy4uL2NvbW1vbi9ub2Rlcy9Ob2RlVW5pZm9ybUJ1ZmZlci5qcyc7XHJcbmltcG9ydCBOb2RlU3RvcmFnZUJ1ZmZlciBmcm9tICcuLi8uLi9jb21tb24vbm9kZXMvTm9kZVN0b3JhZ2VCdWZmZXIuanMnO1xyXG5cclxuaW1wb3J0IHsgTm9kZUJ1aWxkZXIsIENvZGVOb2RlIH0gZnJvbSAnLi4vLi4vLi4vbm9kZXMvTm9kZXMuanMnO1xyXG5cclxuaW1wb3J0IHsgZ2V0Rm9ybWF0IH0gZnJvbSAnLi4vdXRpbHMvV2ViR1BVVGV4dHVyZVV0aWxzLmpzJztcclxuXHJcbmltcG9ydCBXR1NMTm9kZVBhcnNlciBmcm9tICcuL1dHU0xOb2RlUGFyc2VyLmpzJztcclxuaW1wb3J0IHsgTm9kZUFjY2VzcyB9IGZyb20gJy4uLy4uLy4uL25vZGVzL2NvcmUvY29uc3RhbnRzLmpzJztcclxuXHJcbmltcG9ydCBWYXJOb2RlIGZyb20gJy4uLy4uLy4uL25vZGVzL2NvcmUvVmFyTm9kZS5qcyc7XHJcbmltcG9ydCBFeHByZXNzaW9uTm9kZSBmcm9tICcuLi8uLi8uLi9ub2Rlcy9jb2RlL0V4cHJlc3Npb25Ob2RlLmpzJztcclxuXHJcbmltcG9ydCB7IE5vQ29sb3JTcGFjZSwgRmxvYXRUeXBlLCBSZXBlYXRXcmFwcGluZywgQ2xhbXBUb0VkZ2VXcmFwcGluZywgTWlycm9yZWRSZXBlYXRXcmFwcGluZywgTmVhcmVzdEZpbHRlciB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcblxyXG4vLyBHUFVTaGFkZXJTdGFnZSBpcyBub3QgZGVmaW5lZCBpbiBicm93c2VycyBub3Qgc3VwcG9ydGluZyBXZWJHUFVcclxuY29uc3QgR1BVU2hhZGVyU3RhZ2UgPSAoIHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyApID8gc2VsZi5HUFVTaGFkZXJTdGFnZSA6IHsgVkVSVEVYOiAxLCBGUkFHTUVOVDogMiwgQ09NUFVURTogNCB9O1xyXG5cclxuY29uc3QgYWNjZXNzTmFtZXMgPSB7XHJcblx0WyBOb2RlQWNjZXNzLlJFQURfT05MWSBdOiAncmVhZCcsXHJcblx0WyBOb2RlQWNjZXNzLldSSVRFX09OTFkgXTogJ3dyaXRlJyxcclxuXHRbIE5vZGVBY2Nlc3MuUkVBRF9XUklURSBdOiAncmVhZF93cml0ZSdcclxufTtcclxuXHJcbmNvbnN0IHdyYXBOYW1lcyA9IHtcclxuXHRbIFJlcGVhdFdyYXBwaW5nIF06ICdyZXBlYXQnLFxyXG5cdFsgQ2xhbXBUb0VkZ2VXcmFwcGluZyBdOiAnY2xhbXAnLFxyXG5cdFsgTWlycm9yZWRSZXBlYXRXcmFwcGluZyBdOiAnbWlycm9yJ1xyXG59O1xyXG5cclxuY29uc3QgZ3B1U2hhZGVyU3RhZ2VMaWIgPSB7XHJcblx0J3ZlcnRleCc6IEdQVVNoYWRlclN0YWdlID8gR1BVU2hhZGVyU3RhZ2UuVkVSVEVYIDogMSxcclxuXHQnZnJhZ21lbnQnOiBHUFVTaGFkZXJTdGFnZSA/IEdQVVNoYWRlclN0YWdlLkZSQUdNRU5UIDogMixcclxuXHQnY29tcHV0ZSc6IEdQVVNoYWRlclN0YWdlID8gR1BVU2hhZGVyU3RhZ2UuQ09NUFVURSA6IDRcclxufTtcclxuXHJcbmNvbnN0IHN1cHBvcnRzID0ge1xyXG5cdGluc3RhbmNlOiB0cnVlLFxyXG5cdHN3aXp6bGVBc3NpZ246IGZhbHNlLFxyXG5cdHN0b3JhZ2VCdWZmZXI6IHRydWVcclxufTtcclxuXHJcbmNvbnN0IHdnc2xGbk9wTGliID0ge1xyXG5cdCdeXic6ICd0c2xfeG9yJ1xyXG59O1xyXG5cclxuY29uc3Qgd2dzbFR5cGVMaWIgPSB7XHJcblx0ZmxvYXQ6ICdmMzInLFxyXG5cdGludDogJ2kzMicsXHJcblx0dWludDogJ3UzMicsXHJcblx0Ym9vbDogJ2Jvb2wnLFxyXG5cdGNvbG9yOiAndmVjMzxmMzI+JyxcclxuXHJcblx0dmVjMjogJ3ZlYzI8ZjMyPicsXHJcblx0aXZlYzI6ICd2ZWMyPGkzMj4nLFxyXG5cdHV2ZWMyOiAndmVjMjx1MzI+JyxcclxuXHRidmVjMjogJ3ZlYzI8Ym9vbD4nLFxyXG5cclxuXHR2ZWMzOiAndmVjMzxmMzI+JyxcclxuXHRpdmVjMzogJ3ZlYzM8aTMyPicsXHJcblx0dXZlYzM6ICd2ZWMzPHUzMj4nLFxyXG5cdGJ2ZWMzOiAndmVjMzxib29sPicsXHJcblxyXG5cdHZlYzQ6ICd2ZWM0PGYzMj4nLFxyXG5cdGl2ZWM0OiAndmVjNDxpMzI+JyxcclxuXHR1dmVjNDogJ3ZlYzQ8dTMyPicsXHJcblx0YnZlYzQ6ICd2ZWM0PGJvb2w+JyxcclxuXHJcblx0bWF0MjogJ21hdDJ4MjxmMzI+JyxcclxuXHRtYXQzOiAnbWF0M3gzPGYzMj4nLFxyXG5cdG1hdDQ6ICdtYXQ0eDQ8ZjMyPidcclxufTtcclxuXHJcbmNvbnN0IHdnc2xDb2RlQ2FjaGUgPSB7fTtcclxuXHJcbmNvbnN0IHdnc2xQb2x5ZmlsbCA9IHtcclxuXHR0c2xfeG9yOiBuZXcgQ29kZU5vZGUoICdmbiB0c2xfeG9yKCBhIDogYm9vbCwgYiA6IGJvb2wgKSAtPiBib29sIHsgcmV0dXJuICggYSB8fCBiICkgJiYgISggYSAmJiBiICk7IH0nICksXHJcblx0bW9kX2Zsb2F0OiBuZXcgQ29kZU5vZGUoICdmbiB0c2xfbW9kX2Zsb2F0KCB4IDogZjMyLCB5IDogZjMyICkgLT4gZjMyIHsgcmV0dXJuIHggLSB5ICogZmxvb3IoIHggLyB5ICk7IH0nICksXHJcblx0bW9kX3ZlYzI6IG5ldyBDb2RlTm9kZSggJ2ZuIHRzbF9tb2RfdmVjMiggeCA6IHZlYzJmLCB5IDogdmVjMmYgKSAtPiB2ZWMyZiB7IHJldHVybiB4IC0geSAqIGZsb29yKCB4IC8geSApOyB9JyApLFxyXG5cdG1vZF92ZWMzOiBuZXcgQ29kZU5vZGUoICdmbiB0c2xfbW9kX3ZlYzMoIHggOiB2ZWMzZiwgeSA6IHZlYzNmICkgLT4gdmVjM2YgeyByZXR1cm4geCAtIHkgKiBmbG9vciggeCAvIHkgKTsgfScgKSxcclxuXHRtb2RfdmVjNDogbmV3IENvZGVOb2RlKCAnZm4gdHNsX21vZF92ZWM0KCB4IDogdmVjNGYsIHkgOiB2ZWM0ZiApIC0+IHZlYzRmIHsgcmV0dXJuIHggLSB5ICogZmxvb3IoIHggLyB5ICk7IH0nICksXHJcblx0ZXF1YWxzX2Jvb2w6IG5ldyBDb2RlTm9kZSggJ2ZuIHRzbF9lcXVhbHNfYm9vbCggYSA6IGJvb2wsIGIgOiBib29sICkgLT4gYm9vbCB7IHJldHVybiBhID09IGI7IH0nICksXHJcblx0ZXF1YWxzX2J2ZWMyOiBuZXcgQ29kZU5vZGUoICdmbiB0c2xfZXF1YWxzX2J2ZWMyKCBhIDogdmVjMmYsIGIgOiB2ZWMyZiApIC0+IHZlYzI8Ym9vbD4geyByZXR1cm4gdmVjMjxib29sPiggYS54ID09IGIueCwgYS55ID09IGIueSApOyB9JyApLFxyXG5cdGVxdWFsc19idmVjMzogbmV3IENvZGVOb2RlKCAnZm4gdHNsX2VxdWFsc19idmVjMyggYSA6IHZlYzNmLCBiIDogdmVjM2YgKSAtPiB2ZWMzPGJvb2w+IHsgcmV0dXJuIHZlYzM8Ym9vbD4oIGEueCA9PSBiLngsIGEueSA9PSBiLnksIGEueiA9PSBiLnogKTsgfScgKSxcclxuXHRlcXVhbHNfYnZlYzQ6IG5ldyBDb2RlTm9kZSggJ2ZuIHRzbF9lcXVhbHNfYnZlYzQoIGEgOiB2ZWM0ZiwgYiA6IHZlYzRmICkgLT4gdmVjNDxib29sPiB7IHJldHVybiB2ZWM0PGJvb2w+KCBhLnggPT0gYi54LCBhLnkgPT0gYi55LCBhLnogPT0gYi56LCBhLncgPT0gYi53ICk7IH0nICksXHJcblx0cmVwZWF0V3JhcHBpbmdfZmxvYXQ6IG5ldyBDb2RlTm9kZSggJ2ZuIHRzbF9yZXBlYXRXcmFwcGluZ19mbG9hdCggY29vcmQ6IGYzMiApIC0+IGYzMiB7IHJldHVybiBmcmFjdCggY29vcmQgKTsgfScgKSxcclxuXHRtaXJyb3JXcmFwcGluZ19mbG9hdDogbmV3IENvZGVOb2RlKCAnZm4gdHNsX21pcnJvcldyYXBwaW5nX2Zsb2F0KCBjb29yZDogZjMyICkgLT4gZjMyIHsgbGV0IG1pcnJvcmVkID0gZnJhY3QoIGNvb3JkICogMC41ICkgKiAyLjA7IHJldHVybiAxLjAgLSBhYnMoIDEuMCAtIG1pcnJvcmVkICk7IH0nICksXHJcblx0Y2xhbXBXcmFwcGluZ19mbG9hdDogbmV3IENvZGVOb2RlKCAnZm4gdHNsX2NsYW1wV3JhcHBpbmdfZmxvYXQoIGNvb3JkOiBmMzIgKSAtPiBmMzIgeyByZXR1cm4gY2xhbXAoIGNvb3JkLCAwLjAsIDEuMCApOyB9JyApLFxyXG5cdGJpcXVhZHJhdGljVGV4dHVyZTogbmV3IENvZGVOb2RlKCAvKiB3Z3NsICovYFxyXG5mbiB0c2xfYmlxdWFkcmF0aWNUZXh0dXJlKCBtYXAgOiB0ZXh0dXJlXzJkPGYzMj4sIGNvb3JkIDogdmVjMmYsIGlSZXMgOiB2ZWMydSwgbGV2ZWwgOiB1MzIgKSAtPiB2ZWM0ZiB7XHJcblxyXG5cdGxldCByZXMgPSB2ZWMyZiggaVJlcyApO1xyXG5cclxuXHRsZXQgdXZTY2FsZWQgPSBjb29yZCAqIHJlcztcclxuXHRsZXQgdXZXcmFwcGluZyA9ICggKCB1dlNjYWxlZCAlIHJlcyApICsgcmVzICkgJSByZXM7XHJcblxyXG5cdC8vIGh0dHBzOi8vd3d3LnNoYWRlcnRveS5jb20vdmlldy9XdHlYUnlcclxuXHJcblx0bGV0IHV2ID0gdXZXcmFwcGluZyAtIDAuNTtcclxuXHRsZXQgaXV2ID0gZmxvb3IoIHV2ICk7XHJcblx0bGV0IGYgPSBmcmFjdCggdXYgKTtcclxuXHJcblx0bGV0IHJnMSA9IHRleHR1cmVMb2FkKCBtYXAsIHZlYzJ1KCBpdXYgKyB2ZWMyKCAwLjUsIDAuNSApICkgJSBpUmVzLCBsZXZlbCApO1xyXG5cdGxldCByZzIgPSB0ZXh0dXJlTG9hZCggbWFwLCB2ZWMydSggaXV2ICsgdmVjMiggMS41LCAwLjUgKSApICUgaVJlcywgbGV2ZWwgKTtcclxuXHRsZXQgcmczID0gdGV4dHVyZUxvYWQoIG1hcCwgdmVjMnUoIGl1diArIHZlYzIoIDAuNSwgMS41ICkgKSAlIGlSZXMsIGxldmVsICk7XHJcblx0bGV0IHJnNCA9IHRleHR1cmVMb2FkKCBtYXAsIHZlYzJ1KCBpdXYgKyB2ZWMyKCAxLjUsIDEuNSApICkgJSBpUmVzLCBsZXZlbCApO1xyXG5cclxuXHRyZXR1cm4gbWl4KCBtaXgoIHJnMSwgcmcyLCBmLnggKSwgbWl4KCByZzMsIHJnNCwgZi54ICksIGYueSApO1xyXG5cclxufVxyXG5gIClcclxufTtcclxuXHJcbmNvbnN0IHdnc2xNZXRob2RzID0ge1xyXG5cdGRGZHg6ICdkcGR4JyxcclxuXHRkRmR5OiAnLSBkcGR5JyxcclxuXHRtb2RfZmxvYXQ6ICd0c2xfbW9kX2Zsb2F0JyxcclxuXHRtb2RfdmVjMjogJ3RzbF9tb2RfdmVjMicsXHJcblx0bW9kX3ZlYzM6ICd0c2xfbW9kX3ZlYzMnLFxyXG5cdG1vZF92ZWM0OiAndHNsX21vZF92ZWM0JyxcclxuXHRlcXVhbHNfYm9vbDogJ3RzbF9lcXVhbHNfYm9vbCcsXHJcblx0ZXF1YWxzX2J2ZWMyOiAndHNsX2VxdWFsc19idmVjMicsXHJcblx0ZXF1YWxzX2J2ZWMzOiAndHNsX2VxdWFsc19idmVjMycsXHJcblx0ZXF1YWxzX2J2ZWM0OiAndHNsX2VxdWFsc19idmVjNCcsXHJcblx0aW52ZXJzZXNxcnQ6ICdpbnZlcnNlU3FydCcsXHJcblx0Yml0Y2FzdDogJ2JpdGNhc3Q8ZjMyPidcclxufTtcclxuXHJcbi8vIFdlYkdQVSBpc3N1ZTogZG9lcyBub3Qgc3VwcG9ydCBwb3coKSB3aXRoIG5lZ2F0aXZlIGJhc2Ugb24gV2luZG93c1xyXG5cclxuaWYgKCB0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiAvV2luZG93cy9nLnRlc3QoIG5hdmlnYXRvci51c2VyQWdlbnQgKSApIHtcclxuXHJcblx0d2dzbFBvbHlmaWxsLnBvd19mbG9hdCA9IG5ldyBDb2RlTm9kZSggJ2ZuIHRzbF9wb3dfZmxvYXQoIGEgOiBmMzIsIGIgOiBmMzIgKSAtPiBmMzIgeyByZXR1cm4gc2VsZWN0KCAtcG93KCAtYSwgYiApLCBwb3coIGEsIGIgKSwgYSA+IDAuMCApOyB9JyApO1xyXG5cdHdnc2xQb2x5ZmlsbC5wb3dfdmVjMiA9IG5ldyBDb2RlTm9kZSggJ2ZuIHRzbF9wb3dfdmVjMiggYSA6IHZlYzJmLCBiIDogdmVjMmYgKSAtPiB2ZWMyZiB7IHJldHVybiB2ZWMyZiggdHNsX3Bvd19mbG9hdCggYS54LCBiLnggKSwgdHNsX3Bvd19mbG9hdCggYS55LCBiLnkgKSApOyB9JywgWyB3Z3NsUG9seWZpbGwucG93X2Zsb2F0IF0gKTtcclxuXHR3Z3NsUG9seWZpbGwucG93X3ZlYzMgPSBuZXcgQ29kZU5vZGUoICdmbiB0c2xfcG93X3ZlYzMoIGEgOiB2ZWMzZiwgYiA6IHZlYzNmICkgLT4gdmVjM2YgeyByZXR1cm4gdmVjM2YoIHRzbF9wb3dfZmxvYXQoIGEueCwgYi54ICksIHRzbF9wb3dfZmxvYXQoIGEueSwgYi55ICksIHRzbF9wb3dfZmxvYXQoIGEueiwgYi56ICkgKTsgfScsIFsgd2dzbFBvbHlmaWxsLnBvd19mbG9hdCBdICk7XHJcblx0d2dzbFBvbHlmaWxsLnBvd192ZWM0ID0gbmV3IENvZGVOb2RlKCAnZm4gdHNsX3Bvd192ZWM0KCBhIDogdmVjNGYsIGIgOiB2ZWM0ZiApIC0+IHZlYzRmIHsgcmV0dXJuIHZlYzRmKCB0c2xfcG93X2Zsb2F0KCBhLngsIGIueCApLCB0c2xfcG93X2Zsb2F0KCBhLnksIGIueSApLCB0c2xfcG93X2Zsb2F0KCBhLnosIGIueiApLCB0c2xfcG93X2Zsb2F0KCBhLncsIGIudyApICk7IH0nLCBbIHdnc2xQb2x5ZmlsbC5wb3dfZmxvYXQgXSApO1xyXG5cclxuXHR3Z3NsTWV0aG9kcy5wb3dfZmxvYXQgPSAndHNsX3Bvd19mbG9hdCc7XHJcblx0d2dzbE1ldGhvZHMucG93X3ZlYzIgPSAndHNsX3Bvd192ZWMyJztcclxuXHR3Z3NsTWV0aG9kcy5wb3dfdmVjMyA9ICd0c2xfcG93X3ZlYzMnO1xyXG5cdHdnc2xNZXRob2RzLnBvd192ZWM0ID0gJ3RzbF9wb3dfdmVjNCc7XHJcblxyXG59XHJcblxyXG4vL1xyXG5cclxubGV0IGRpYWdub3N0aWNzID0gJyc7XHJcblxyXG5pZiAoICggdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgL0ZpcmVmb3h8RGVuby9nLnRlc3QoIG5hdmlnYXRvci51c2VyQWdlbnQgKSApICE9PSB0cnVlICkge1xyXG5cclxuXHRkaWFnbm9zdGljcyArPSAnZGlhZ25vc3RpYyggb2ZmLCBkZXJpdmF0aXZlX3VuaWZvcm1pdHkgKTtcXG4nO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIEEgbm9kZSBidWlsZGVyIHRhcmdldGluZyBXR1NMLlxyXG4gKlxyXG4gKiBUaGlzIG1vZHVsZSBnZW5lcmF0ZXMgV0dTTCBzaGFkZXIgY29kZSBmcm9tIG5vZGUgbWF0ZXJpYWxzIGFuZCBhbHNvXHJcbiAqIGdlbmVyYXRlcyB0aGUgcmVzcGVjdGl2ZSBiaW5kaW5ncyBhbmQgdmVydGV4IGJ1ZmZlciBkZWZpbml0aW9ucy4gVGhlc2VcclxuICogZGF0YSBhcmUgbGF0ZXIgdXNlZCBieSB0aGUgcmVuZGVyZXIgdG8gY3JlYXRlIHJlbmRlciBhbmQgY29tcHV0ZSBwaXBlbGluZXNcclxuICogZm9yIHJlbmRlciBvYmplY3RzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTm9kZUJ1aWxkZXJcclxuICovXHJcbmNsYXNzIFdHU0xOb2RlQnVpbGRlciBleHRlbmRzIE5vZGVCdWlsZGVyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBXR1NMIG5vZGUgYnVpbGRlciByZW5kZXJlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0M0R9IG9iamVjdCAtIFRoZSAzRCBvYmplY3QuXHJcblx0ICogQHBhcmFtIHtSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG9iamVjdCwgcmVuZGVyZXIgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG9iamVjdCwgcmVuZGVyZXIsIG5ldyBXR1NMTm9kZVBhcnNlcigpICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGRpY3Rpb25hcnkgdGhhdCBob2xkcyBmb3IgZWFjaCBzaGFkZXIgc3RhZ2UgKCd2ZXJ0ZXgnLCAnZnJhZ21lbnQnLCAnY29tcHV0ZScpXHJcblx0XHQgKiBhbm90aGVyIGRpY3Rpb25hcnkgd2hpY2ggbWFuYWdlcyBVQk9zIHBlciBncm91cCAoJ3JlbmRlcicsJ2ZyYW1lJywnb2JqZWN0JykuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdDxzdHJpbmcsT2JqZWN0PHN0cmluZyxOb2RlVW5pZm9ybXNHcm91cD4+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVuaWZvcm1Hcm91cHMgPSB7fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgZGljdGlvbmFyeSB0aGF0IGhvbGRzIGZvciBlYWNoIHNoYWRlciBzdGFnZSBhIE1hcCBvZiBidWlsdGlucy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0PHN0cmluZyxNYXA8c3RyaW5nLE9iamVjdD4+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJ1aWx0aW5zID0ge307XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGRpY3Rpb25hcnkgdGhhdCBob2xkcyBmb3IgZWFjaCBzaGFkZXIgc3RhZ2UgYSBTZXQgb2YgZGlyZWN0aXZlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0PHN0cmluZyxTZXQ8c3RyaW5nPj59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGlyZWN0aXZlcyA9IHt9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBtYXAgZm9yIG1hbmFnaW5nIHNjb3BlIGFycmF5cy4gT25seSByZWxldmFudCBmb3Igd2hlbiB1c2luZ1xyXG5cdFx0ICoge0BsaW5rIFdvcmtncm91cEluZm9Ob2RlfSBpbiBjb250ZXh0IG9mIGNvbXB1dGUgc2hhZGVycy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7TWFwPHN0cmluZyxPYmplY3Q+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNjb3BlZEFycmF5cyA9IG5ldyBNYXAoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHRleHR1cmUgcmVxdWlyZXMgYSBtYW51YWwgY29udmVyc2lvbiB0byB0aGUgd29ya2luZyBjb2xvciBzcGFjZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlIHRvIGNoZWNrLlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGdpdmVuIHRleHR1cmUgcmVxdWlyZXMgYSBjb252ZXJzaW9uIHRvIHdvcmtpbmcgY29sb3Igc3BhY2Ugb3Igbm90LlxyXG5cdCAqL1xyXG5cdG5lZWRzVG9Xb3JraW5nQ29sb3JTcGFjZSggdGV4dHVyZSApIHtcclxuXHJcblx0XHRyZXR1cm4gdGV4dHVyZS5pc1ZpZGVvVGV4dHVyZSA9PT0gdHJ1ZSAmJiB0ZXh0dXJlLmNvbG9yU3BhY2UgIT09IE5vQ29sb3JTcGFjZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZW5lcmF0ZXMgdGhlIFdHU0wgc25pcHBldCBmb3Igc2FtcGxlZCB0ZXh0dXJlcy5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHRleHR1cmVQcm9wZXJ0eSAtIFRoZSBuYW1lIG9mIHRoZSB0ZXh0dXJlIHVuaWZvcm0gaW4gdGhlIHNoYWRlci5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdXZTbmlwcGV0IC0gQSBXR1NMIHNuaXBwZXQgdGhhdCByZXByZXNlbnRzIHRleHR1cmUgY29vcmRpbmF0ZXMgdXNlZCBmb3Igc2FtcGxpbmcuXHJcblx0ICogQHBhcmFtIHs/c3RyaW5nfSBkZXB0aFNuaXBwZXQgLSBBIFdHU0wgc25pcHBldCB0aGF0IHJlcHJlc2VudHMgMC1iYXNlZCB0ZXh0dXJlIGFycmF5IGluZGV4IHRvIHNhbXBsZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW3NoYWRlclN0YWdlPXRoaXMuc2hhZGVyU3RhZ2VdIC0gVGhlIHNoYWRlciBzdGFnZSB0aGlzIGNvZGUgc25pcHBldCBpcyBnZW5lcmF0ZWQgZm9yLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIFdHU0wgc25pcHBldC5cclxuXHQgKi9cclxuXHRfZ2VuZXJhdGVUZXh0dXJlU2FtcGxlKCB0ZXh0dXJlLCB0ZXh0dXJlUHJvcGVydHksIHV2U25pcHBldCwgZGVwdGhTbmlwcGV0LCBzaGFkZXJTdGFnZSA9IHRoaXMuc2hhZGVyU3RhZ2UgKSB7XHJcblxyXG5cdFx0aWYgKCBzaGFkZXJTdGFnZSA9PT0gJ2ZyYWdtZW50JyApIHtcclxuXHJcblx0XHRcdGlmICggZGVwdGhTbmlwcGV0ICkge1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gYHRleHR1cmVTYW1wbGUoICR7IHRleHR1cmVQcm9wZXJ0eSB9LCAkeyB0ZXh0dXJlUHJvcGVydHkgfV9zYW1wbGVyLCAkeyB1dlNuaXBwZXQgfSwgJHsgZGVwdGhTbmlwcGV0IH0gKWA7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gYHRleHR1cmVTYW1wbGUoICR7IHRleHR1cmVQcm9wZXJ0eSB9LCAkeyB0ZXh0dXJlUHJvcGVydHkgfV9zYW1wbGVyLCAkeyB1dlNuaXBwZXQgfSApYDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2UgaWYgKCB0aGlzLmlzRmlsdGVyZWRUZXh0dXJlKCB0ZXh0dXJlICkgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gdGhpcy5nZW5lcmF0ZUZpbHRlcmVkVGV4dHVyZSggdGV4dHVyZSwgdGV4dHVyZVByb3BlcnR5LCB1dlNuaXBwZXQgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0cmV0dXJuIHRoaXMuZ2VuZXJhdGVUZXh0dXJlTG9kKCB0ZXh0dXJlLCB0ZXh0dXJlUHJvcGVydHksIHV2U25pcHBldCwgZGVwdGhTbmlwcGV0LCAnMCcgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2VuZXJhdGVzIHRoZSBXR1NMIHNuaXBwZXQgd2hlbiBzYW1wbGluZyB2aWRlbyB0ZXh0dXJlcy5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHRleHR1cmVQcm9wZXJ0eSAtIFRoZSBuYW1lIG9mIHRoZSB2aWRlbyB0ZXh0dXJlIHVuaWZvcm0gaW4gdGhlIHNoYWRlci5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdXZTbmlwcGV0IC0gQSBXR1NMIHNuaXBwZXQgdGhhdCByZXByZXNlbnRzIHRleHR1cmUgY29vcmRpbmF0ZXMgdXNlZCBmb3Igc2FtcGxpbmcuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtzaGFkZXJTdGFnZT10aGlzLnNoYWRlclN0YWdlXSAtIFRoZSBzaGFkZXIgc3RhZ2UgdGhpcyBjb2RlIHNuaXBwZXQgaXMgZ2VuZXJhdGVkIGZvci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBXR1NMIHNuaXBwZXQuXHJcblx0ICovXHJcblx0X2dlbmVyYXRlVmlkZW9TYW1wbGUoIHRleHR1cmVQcm9wZXJ0eSwgdXZTbmlwcGV0LCBzaGFkZXJTdGFnZSA9IHRoaXMuc2hhZGVyU3RhZ2UgKSB7XHJcblxyXG5cdFx0aWYgKCBzaGFkZXJTdGFnZSA9PT0gJ2ZyYWdtZW50JyApIHtcclxuXHJcblx0XHRcdHJldHVybiBgdGV4dHVyZVNhbXBsZUJhc2VDbGFtcFRvRWRnZSggJHsgdGV4dHVyZVByb3BlcnR5IH0sICR7IHRleHR1cmVQcm9wZXJ0eSB9X3NhbXBsZXIsIHZlYzI8ZjMyPiggJHsgdXZTbmlwcGV0IH0ueCwgMS4wIC0gJHsgdXZTbmlwcGV0IH0ueSApIClgO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLmVycm9yKCBgV2ViR1BVUmVuZGVyZXI6IFRIUkVFLlZpZGVvVGV4dHVyZSBkb2VzIG5vdCBzdXBwb3J0ICR7IHNoYWRlclN0YWdlIH0gc2hhZGVyLmAgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2VuZXJhdGVzIHRoZSBXR1NMIHNuaXBwZXQgd2hlbiBzYW1wbGluZyB0ZXh0dXJlcyB3aXRoIGV4cGxpY2l0IG1pcCBsZXZlbC5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHRleHR1cmVQcm9wZXJ0eSAtIFRoZSBuYW1lIG9mIHRoZSB0ZXh0dXJlIHVuaWZvcm0gaW4gdGhlIHNoYWRlci5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdXZTbmlwcGV0IC0gQSBXR1NMIHNuaXBwZXQgdGhhdCByZXByZXNlbnRzIHRleHR1cmUgY29vcmRpbmF0ZXMgdXNlZCBmb3Igc2FtcGxpbmcuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGxldmVsU25pcHBldCAtIEEgV0dTTCBzbmlwcGV0IHRoYXQgcmVwcmVzZW50cyB0aGUgbWlwIGxldmVsLCB3aXRoIGxldmVsIDAgY29udGFpbmluZyBhIGZ1bGwgc2l6ZSB2ZXJzaW9uIG9mIHRoZSB0ZXh0dXJlLlxyXG5cdCAqIEBwYXJhbSB7P3N0cmluZ30gZGVwdGhTbmlwcGV0IC0gQSBXR1NMIHNuaXBwZXQgdGhhdCByZXByZXNlbnRzIDAtYmFzZWQgdGV4dHVyZSBhcnJheSBpbmRleCB0byBzYW1wbGUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtzaGFkZXJTdGFnZT10aGlzLnNoYWRlclN0YWdlXSAtIFRoZSBzaGFkZXIgc3RhZ2UgdGhpcyBjb2RlIHNuaXBwZXQgaXMgZ2VuZXJhdGVkIGZvci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBXR1NMIHNuaXBwZXQuXHJcblx0ICovXHJcblx0X2dlbmVyYXRlVGV4dHVyZVNhbXBsZUxldmVsKCB0ZXh0dXJlLCB0ZXh0dXJlUHJvcGVydHksIHV2U25pcHBldCwgbGV2ZWxTbmlwcGV0LCBkZXB0aFNuaXBwZXQsIHNoYWRlclN0YWdlID0gdGhpcy5zaGFkZXJTdGFnZSApIHtcclxuXHJcblx0XHRpZiAoICggc2hhZGVyU3RhZ2UgPT09ICdmcmFnbWVudCcgfHwgc2hhZGVyU3RhZ2UgPT09ICdjb21wdXRlJyApICYmIHRoaXMuaXNVbmZpbHRlcmFibGUoIHRleHR1cmUgKSA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gYHRleHR1cmVTYW1wbGVMZXZlbCggJHsgdGV4dHVyZVByb3BlcnR5IH0sICR7IHRleHR1cmVQcm9wZXJ0eSB9X3NhbXBsZXIsICR7IHV2U25pcHBldCB9LCAkeyBsZXZlbFNuaXBwZXQgfSApYDtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCB0aGlzLmlzRmlsdGVyZWRUZXh0dXJlKCB0ZXh0dXJlICkgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gdGhpcy5nZW5lcmF0ZUZpbHRlcmVkVGV4dHVyZSggdGV4dHVyZSwgdGV4dHVyZVByb3BlcnR5LCB1dlNuaXBwZXQsIGxldmVsU25pcHBldCApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gdGhpcy5nZW5lcmF0ZVRleHR1cmVMb2QoIHRleHR1cmUsIHRleHR1cmVQcm9wZXJ0eSwgdXZTbmlwcGV0LCBkZXB0aFNuaXBwZXQsIGxldmVsU25pcHBldCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZW5lcmF0ZXMgYSB3cmFwIGZ1bmN0aW9uIHVzZWQgaW4gY29udGV4dCBvZiB0ZXh0dXJlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlIHRvIGdlbmVyYXRlIHRoZSBmdW5jdGlvbiBmb3IuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIGZ1bmN0aW9uLlxyXG5cdCAqL1xyXG5cdGdlbmVyYXRlV3JhcEZ1bmN0aW9uKCB0ZXh0dXJlICkge1xyXG5cclxuXHRcdGNvbnN0IGZ1bmN0aW9uTmFtZSA9IGB0c2xfY29vcmRfJHsgd3JhcE5hbWVzWyB0ZXh0dXJlLndyYXBTIF0gfVNfJHsgd3JhcE5hbWVzWyB0ZXh0dXJlLndyYXBUIF0gfV8keyB0ZXh0dXJlLmlzRGF0YTNEVGV4dHVyZSA/ICczZCcgOiAnMmQnIH1UYDtcclxuXHJcblx0XHRsZXQgbm9kZUNvZGUgPSB3Z3NsQ29kZUNhY2hlWyBmdW5jdGlvbk5hbWUgXTtcclxuXHJcblx0XHRpZiAoIG5vZGVDb2RlID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBpbmNsdWRlcyA9IFtdO1xyXG5cclxuXHRcdFx0Ly8gRm9yIDNEIHRleHR1cmVzLCB1c2UgdmVjM2Y7IGZvciB0ZXh0dXJlIGFycmF5cywga2VlcCB2ZWMyZiBzaW5jZSBhcnJheSBpbmRleCBpcyBzZXBhcmF0ZVxyXG5cdFx0XHRjb25zdCBjb29yZFR5cGUgPSB0ZXh0dXJlLmlzRGF0YTNEVGV4dHVyZSA/ICd2ZWMzZicgOiAndmVjMmYnO1xyXG5cdFx0XHRsZXQgY29kZSA9IGBmbiAkeyBmdW5jdGlvbk5hbWUgfSggY29vcmQgOiAkeyBjb29yZFR5cGUgfSApIC0+ICR7IGNvb3JkVHlwZSB9IHtcXG5cXG5cXHRyZXR1cm4gJHsgY29vcmRUeXBlIH0oXFxuYDtcclxuXHJcblx0XHRcdGNvbnN0IGFkZFdyYXBTbmlwcGV0ID0gKCB3cmFwLCBheGlzICkgPT4ge1xyXG5cclxuXHRcdFx0XHRpZiAoIHdyYXAgPT09IFJlcGVhdFdyYXBwaW5nICkge1xyXG5cclxuXHRcdFx0XHRcdGluY2x1ZGVzLnB1c2goIHdnc2xQb2x5ZmlsbC5yZXBlYXRXcmFwcGluZ19mbG9hdCApO1xyXG5cclxuXHRcdFx0XHRcdGNvZGUgKz0gYFxcdFxcdHRzbF9yZXBlYXRXcmFwcGluZ19mbG9hdCggY29vcmQuJHsgYXhpcyB9IClgO1xyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCB3cmFwID09PSBDbGFtcFRvRWRnZVdyYXBwaW5nICkge1xyXG5cclxuXHRcdFx0XHRcdGluY2x1ZGVzLnB1c2goIHdnc2xQb2x5ZmlsbC5jbGFtcFdyYXBwaW5nX2Zsb2F0ICk7XHJcblxyXG5cdFx0XHRcdFx0Y29kZSArPSBgXFx0XFx0dHNsX2NsYW1wV3JhcHBpbmdfZmxvYXQoIGNvb3JkLiR7IGF4aXMgfSApYDtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggd3JhcCA9PT0gTWlycm9yZWRSZXBlYXRXcmFwcGluZyApIHtcclxuXHJcblx0XHRcdFx0XHRpbmNsdWRlcy5wdXNoKCB3Z3NsUG9seWZpbGwubWlycm9yV3JhcHBpbmdfZmxvYXQgKTtcclxuXHJcblx0XHRcdFx0XHRjb2RlICs9IGBcXHRcXHR0c2xfbWlycm9yV3JhcHBpbmdfZmxvYXQoIGNvb3JkLiR7IGF4aXMgfSApYDtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRjb2RlICs9IGBcXHRcXHRjb29yZC4keyBheGlzIH1gO1xyXG5cclxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggYFdlYkdQVVJlbmRlcmVyOiBVbnN1cHBvcnRlZCB0ZXh0dXJlIHdyYXAgdHlwZSBcIiR7IHdyYXAgfVwiIGZvciB2ZXJ0ZXggc2hhZGVyLmAgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fTtcclxuXHJcblx0XHRcdGFkZFdyYXBTbmlwcGV0KCB0ZXh0dXJlLndyYXBTLCAneCcgKTtcclxuXHJcblx0XHRcdGNvZGUgKz0gJyxcXG4nO1xyXG5cclxuXHRcdFx0YWRkV3JhcFNuaXBwZXQoIHRleHR1cmUud3JhcFQsICd5JyApO1xyXG5cclxuXHRcdFx0aWYgKCB0ZXh0dXJlLmlzRGF0YTNEVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0Y29kZSArPSAnLFxcbic7XHJcblx0XHRcdFx0YWRkV3JhcFNuaXBwZXQoIHRleHR1cmUud3JhcFIsICd6JyApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29kZSArPSAnXFxuXFx0KTtcXG5cXG59XFxuJztcclxuXHJcblx0XHRcdHdnc2xDb2RlQ2FjaGVbIGZ1bmN0aW9uTmFtZSBdID0gbm9kZUNvZGUgPSBuZXcgQ29kZU5vZGUoIGNvZGUsIGluY2x1ZGVzICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdG5vZGVDb2RlLmJ1aWxkKCB0aGlzICk7XHJcblxyXG5cdFx0cmV0dXJuIGZ1bmN0aW9uTmFtZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZW5lcmF0ZXMgdGhlIGFycmF5IGRlY2xhcmF0aW9uIHN0cmluZy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIHR5cGUuXHJcblx0ICogQHBhcmFtIHs/bnVtYmVyfSBbY291bnRdIC0gVGhlIGNvdW50LlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGdlbmVyYXRlZCB2YWx1ZSBhcyBhIHNoYWRlciBzdHJpbmcuXHJcblx0ICovXHJcblx0Z2VuZXJhdGVBcnJheURlY2xhcmF0aW9uKCB0eXBlLCBjb3VudCApIHtcclxuXHJcblx0XHRyZXR1cm4gYGFycmF5PCAkeyB0aGlzLmdldFR5cGUoIHR5cGUgKSB9LCAkeyBjb3VudCB9ID5gO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyBhIFdHU0wgdmFyaWFibGUgdGhhdCBob2xkcyB0aGUgdGV4dHVyZSBkaW1lbnNpb24gb2YgdGhlIGdpdmVuIHRleHR1cmUuXHJcblx0ICogSXQgYWxzbyByZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBudW1iZXIgb2YgbGF5ZXJzIChlbGVtZW50cykgb2YgYW4gYXJyYXllZFxyXG5cdCAqIHRleHR1cmUgYXMgd2VsbCBhcyB0aGUgY3ViZSBmYWNlIGNvdW50IG9mIGN1YmUgdGV4dHVyZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZSB0byBnZW5lcmF0ZSB0aGUgZnVuY3Rpb24gZm9yLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0dXJlUHJvcGVydHkgLSBUaGUgbmFtZSBvZiB0aGUgdmlkZW8gdGV4dHVyZSB1bmlmb3JtIGluIHRoZSBzaGFkZXIuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGxldmVsU25pcHBldCAtIEEgV0dTTCBzbmlwcGV0IHRoYXQgcmVwcmVzZW50cyB0aGUgbWlwIGxldmVsLCB3aXRoIGxldmVsIDAgY29udGFpbmluZyBhIGZ1bGwgc2l6ZSB2ZXJzaW9uIG9mIHRoZSB0ZXh0dXJlLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG5hbWUgb2YgdGhlIGRpbWVuc2lvbiB2YXJpYWJsZS5cclxuXHQgKi9cclxuXHRnZW5lcmF0ZVRleHR1cmVEaW1lbnNpb24oIHRleHR1cmUsIHRleHR1cmVQcm9wZXJ0eSwgbGV2ZWxTbmlwcGV0ICkge1xyXG5cclxuXHRcdGNvbnN0IHRleHR1cmVEYXRhID0gdGhpcy5nZXREYXRhRnJvbU5vZGUoIHRleHR1cmUsIHRoaXMuc2hhZGVyU3RhZ2UsIHRoaXMuZ2xvYmFsQ2FjaGUgKTtcclxuXHJcblx0XHRpZiAoIHRleHR1cmVEYXRhLmRpbWVuc2lvbnNTbmlwcGV0ID09PSB1bmRlZmluZWQgKSB0ZXh0dXJlRGF0YS5kaW1lbnNpb25zU25pcHBldCA9IHt9O1xyXG5cclxuXHRcdGxldCB0ZXh0dXJlRGltZW5zaW9uTm9kZSA9IHRleHR1cmVEYXRhLmRpbWVuc2lvbnNTbmlwcGV0WyBsZXZlbFNuaXBwZXQgXTtcclxuXHJcblx0XHRpZiAoIHRleHR1cmVEYXRhLmRpbWVuc2lvbnNTbmlwcGV0WyBsZXZlbFNuaXBwZXQgXSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0bGV0IHRleHR1cmVEaW1lbnNpb25zUGFyYW1zO1xyXG5cdFx0XHRsZXQgZGltZW5zaW9uVHlwZTtcclxuXHJcblx0XHRcdGNvbnN0IHsgcHJpbWFyeVNhbXBsZXMgfSA9IHRoaXMucmVuZGVyZXIuYmFja2VuZC51dGlscy5nZXRUZXh0dXJlU2FtcGxlRGF0YSggdGV4dHVyZSApO1xyXG5cdFx0XHRjb25zdCBpc011bHRpc2FtcGxlZCA9IHByaW1hcnlTYW1wbGVzID4gMTtcclxuXHJcblx0XHRcdGlmICggdGV4dHVyZS5pc0RhdGEzRFRleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRcdGRpbWVuc2lvblR5cGUgPSAndmVjMzx1MzI+JztcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdC8vIFJlZ3VsYXIgMkQgdGV4dHVyZXMsIGRlcHRoIHRleHR1cmVzLCBldGMuXHJcblx0XHRcdFx0ZGltZW5zaW9uVHlwZSA9ICd2ZWMyPHUzMj4nO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gQnVpbGQgcGFyYW1ldGVycyBzdHJpbmcgYmFzZWQgb24gdGV4dHVyZSB0eXBlIGFuZCBtdWx0aXNhbXBsaW5nXHJcblx0XHRcdGlmICggaXNNdWx0aXNhbXBsZWQgfHwgdGV4dHVyZS5pc1ZpZGVvVGV4dHVyZSB8fCB0ZXh0dXJlLmlzU3RvcmFnZVRleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRcdHRleHR1cmVEaW1lbnNpb25zUGFyYW1zID0gdGV4dHVyZVByb3BlcnR5O1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0dGV4dHVyZURpbWVuc2lvbnNQYXJhbXMgPSBgJHt0ZXh0dXJlUHJvcGVydHl9JHtsZXZlbFNuaXBwZXQgPyBgLCB1MzIoICR7IGxldmVsU25pcHBldCB9IClgIDogJyd9YDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRleHR1cmVEaW1lbnNpb25Ob2RlID0gbmV3IFZhck5vZGUoIG5ldyBFeHByZXNzaW9uTm9kZSggYHRleHR1cmVEaW1lbnNpb25zKCAkeyB0ZXh0dXJlRGltZW5zaW9uc1BhcmFtcyB9IClgLCBkaW1lbnNpb25UeXBlICkgKTtcclxuXHJcblx0XHRcdHRleHR1cmVEYXRhLmRpbWVuc2lvbnNTbmlwcGV0WyBsZXZlbFNuaXBwZXQgXSA9IHRleHR1cmVEaW1lbnNpb25Ob2RlO1xyXG5cclxuXHRcdFx0aWYgKCB0ZXh0dXJlLmlzRGF0YUFycmF5VGV4dHVyZSB8fCB0ZXh0dXJlLmlzRGF0YTNEVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0dGV4dHVyZURhdGEuYXJyYXlMYXllckNvdW50ID0gbmV3IFZhck5vZGUoXHJcblx0XHRcdFx0XHRuZXcgRXhwcmVzc2lvbk5vZGUoXHJcblx0XHRcdFx0XHRcdGB0ZXh0dXJlTnVtTGF5ZXJzKCR7dGV4dHVyZVByb3BlcnR5fSlgLFxyXG5cdFx0XHRcdFx0XHQndTMyJ1xyXG5cdFx0XHRcdFx0KVxyXG5cdFx0XHRcdCk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBGb3IgY3ViZSB0ZXh0dXJlcywgd2Uga25vdyBpdCdzIGFsd2F5cyA2IGZhY2VzXHJcblx0XHRcdGlmICggdGV4dHVyZS5pc1RleHR1cmVDdWJlICkge1xyXG5cclxuXHRcdFx0XHR0ZXh0dXJlRGF0YS5jdWJlRmFjZUNvdW50ID0gbmV3IFZhck5vZGUoXHJcblx0XHRcdFx0XHRuZXcgRXhwcmVzc2lvbk5vZGUoICc2dScsICd1MzInIClcclxuXHRcdFx0XHQpO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGV4dHVyZURpbWVuc2lvbk5vZGUuYnVpbGQoIHRoaXMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZW5lcmF0ZXMgdGhlIFdHU0wgc25pcHBldCBmb3IgYSBtYW51YWwgZmlsdGVyZWQgdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0dXJlUHJvcGVydHkgLSBUaGUgbmFtZSBvZiB0aGUgdGV4dHVyZSB1bmlmb3JtIGluIHRoZSBzaGFkZXIuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHV2U25pcHBldCAtIEEgV0dTTCBzbmlwcGV0IHRoYXQgcmVwcmVzZW50cyB0ZXh0dXJlIGNvb3JkaW5hdGVzIHVzZWQgZm9yIHNhbXBsaW5nLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBsZXZlbFNuaXBwZXQgLSBBIFdHU0wgc25pcHBldCB0aGF0IHJlcHJlc2VudHMgdGhlIG1pcCBsZXZlbCwgd2l0aCBsZXZlbCAwIGNvbnRhaW5pbmcgYSBmdWxsIHNpemUgdmVyc2lvbiBvZiB0aGUgdGV4dHVyZS5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBXR1NMIHNuaXBwZXQuXHJcblx0ICovXHJcblx0Z2VuZXJhdGVGaWx0ZXJlZFRleHR1cmUoIHRleHR1cmUsIHRleHR1cmVQcm9wZXJ0eSwgdXZTbmlwcGV0LCBsZXZlbFNuaXBwZXQgPSAnMHUnICkge1xyXG5cclxuXHRcdHRoaXMuX2luY2x1ZGUoICdiaXF1YWRyYXRpY1RleHR1cmUnICk7XHJcblxyXG5cdFx0Y29uc3Qgd3JhcEZ1bmN0aW9uID0gdGhpcy5nZW5lcmF0ZVdyYXBGdW5jdGlvbiggdGV4dHVyZSApO1xyXG5cdFx0Y29uc3QgdGV4dHVyZURpbWVuc2lvbiA9IHRoaXMuZ2VuZXJhdGVUZXh0dXJlRGltZW5zaW9uKCB0ZXh0dXJlLCB0ZXh0dXJlUHJvcGVydHksIGxldmVsU25pcHBldCApO1xyXG5cclxuXHRcdHJldHVybiBgdHNsX2JpcXVhZHJhdGljVGV4dHVyZSggJHsgdGV4dHVyZVByb3BlcnR5IH0sICR7IHdyYXBGdW5jdGlvbiB9KCAkeyB1dlNuaXBwZXQgfSApLCAkeyB0ZXh0dXJlRGltZW5zaW9uIH0sIHUzMiggJHsgbGV2ZWxTbmlwcGV0IH0gKSApYDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZW5lcmF0ZXMgdGhlIFdHU0wgc25pcHBldCBmb3IgYSB0ZXh0dXJlIGxvb2t1cCB3aXRoIGV4cGxpY2l0IGxldmVsLW9mLWRldGFpbC5cclxuXHQgKiBTaW5jZSBpdCdzIGEgbG9va3VwLCBubyBzYW1wbGluZyBvciBmaWx0ZXJpbmcgaXMgYXBwbGllZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0dXJlUHJvcGVydHkgLSBUaGUgbmFtZSBvZiB0aGUgdGV4dHVyZSB1bmlmb3JtIGluIHRoZSBzaGFkZXIuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHV2U25pcHBldCAtIEEgV0dTTCBzbmlwcGV0IHRoYXQgcmVwcmVzZW50cyB0ZXh0dXJlIGNvb3JkaW5hdGVzIHVzZWQgZm9yIHNhbXBsaW5nLlxyXG5cdCAqIEBwYXJhbSB7P3N0cmluZ30gZGVwdGhTbmlwcGV0IC0gQSBXR1NMIHNuaXBwZXQgdGhhdCByZXByZXNlbnRzIDAtYmFzZWQgdGV4dHVyZSBhcnJheSBpbmRleCB0byBzYW1wbGUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtsZXZlbFNuaXBwZXQ9JzB1J10gLSBBIFdHU0wgc25pcHBldCB0aGF0IHJlcHJlc2VudHMgdGhlIG1pcCBsZXZlbCwgd2l0aCBsZXZlbCAwIGNvbnRhaW5pbmcgYSBmdWxsIHNpemUgdmVyc2lvbiBvZiB0aGUgdGV4dHVyZS5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBXR1NMIHNuaXBwZXQuXHJcblx0ICovXHJcblx0Z2VuZXJhdGVUZXh0dXJlTG9kKCB0ZXh0dXJlLCB0ZXh0dXJlUHJvcGVydHksIHV2U25pcHBldCwgZGVwdGhTbmlwcGV0LCBsZXZlbFNuaXBwZXQgPSAnMHUnICkge1xyXG5cclxuXHRcdGNvbnN0IHdyYXBGdW5jdGlvbiA9IHRoaXMuZ2VuZXJhdGVXcmFwRnVuY3Rpb24oIHRleHR1cmUgKTtcclxuXHRcdGNvbnN0IHRleHR1cmVEaW1lbnNpb24gPSB0aGlzLmdlbmVyYXRlVGV4dHVyZURpbWVuc2lvbiggdGV4dHVyZSwgdGV4dHVyZVByb3BlcnR5LCBsZXZlbFNuaXBwZXQgKTtcclxuXHJcblx0XHRjb25zdCB2ZWNUeXBlID0gdGV4dHVyZS5pc0RhdGEzRFRleHR1cmUgPyAndmVjMycgOiAndmVjMic7XHJcblx0XHRjb25zdCBjb29yZFNuaXBwZXQgPSBgJHsgdmVjVHlwZSB9PHUzMj4oJHsgd3JhcEZ1bmN0aW9uIH0oJHsgdXZTbmlwcGV0IH0pICogJHsgdmVjVHlwZSB9PGYzMj4oJHsgdGV4dHVyZURpbWVuc2lvbiB9KSlgO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmdlbmVyYXRlVGV4dHVyZUxvYWQoIHRleHR1cmUsIHRleHR1cmVQcm9wZXJ0eSwgY29vcmRTbmlwcGV0LCBkZXB0aFNuaXBwZXQsIGxldmVsU25pcHBldCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyB0aGUgV0dTTCBzbmlwcGV0IHRoYXQgcmVhZHMgYSBzaW5nbGUgdGV4ZWwgZnJvbSBhIHRleHR1cmUgd2l0aG91dCBzYW1wbGluZyBvciBmaWx0ZXJpbmcuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdGV4dHVyZVByb3BlcnR5IC0gVGhlIG5hbWUgb2YgdGhlIHRleHR1cmUgdW5pZm9ybSBpbiB0aGUgc2hhZGVyLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB1dkluZGV4U25pcHBldCAtIEEgV0dTTCBzbmlwcGV0IHRoYXQgcmVwcmVzZW50cyB0ZXh0dXJlIGNvb3JkaW5hdGVzIHVzZWQgZm9yIHNhbXBsaW5nLlxyXG5cdCAqIEBwYXJhbSB7P3N0cmluZ30gZGVwdGhTbmlwcGV0IC0gQSBXR1NMIHNuaXBwZXQgdGhhdCByZXByZXNlbnRzIDAtYmFzZWQgdGV4dHVyZSBhcnJheSBpbmRleCB0byBzYW1wbGUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtsZXZlbFNuaXBwZXQ9JzB1J10gLSBBIFdHU0wgc25pcHBldCB0aGF0IHJlcHJlc2VudHMgdGhlIG1pcCBsZXZlbCwgd2l0aCBsZXZlbCAwIGNvbnRhaW5pbmcgYSBmdWxsIHNpemUgdmVyc2lvbiBvZiB0aGUgdGV4dHVyZS5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBXR1NMIHNuaXBwZXQuXHJcblx0ICovXHJcblx0Z2VuZXJhdGVUZXh0dXJlTG9hZCggdGV4dHVyZSwgdGV4dHVyZVByb3BlcnR5LCB1dkluZGV4U25pcHBldCwgZGVwdGhTbmlwcGV0LCBsZXZlbFNuaXBwZXQgPSAnMHUnICkge1xyXG5cclxuXHRcdGlmICggdGV4dHVyZS5pc1ZpZGVvVGV4dHVyZSA9PT0gdHJ1ZSB8fCB0ZXh0dXJlLmlzU3RvcmFnZVRleHR1cmUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gYHRleHR1cmVMb2FkKCAkeyB0ZXh0dXJlUHJvcGVydHkgfSwgJHsgdXZJbmRleFNuaXBwZXQgfSApYDtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBkZXB0aFNuaXBwZXQgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gYHRleHR1cmVMb2FkKCAkeyB0ZXh0dXJlUHJvcGVydHkgfSwgJHsgdXZJbmRleFNuaXBwZXQgfSwgJHsgZGVwdGhTbmlwcGV0IH0sIHUzMiggJHsgbGV2ZWxTbmlwcGV0IH0gKSApYDtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0cmV0dXJuIGB0ZXh0dXJlTG9hZCggJHsgdGV4dHVyZVByb3BlcnR5IH0sICR7IHV2SW5kZXhTbmlwcGV0IH0sIHUzMiggJHsgbGV2ZWxTbmlwcGV0IH0gKSApYDtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2VuZXJhdGVzIHRoZSBXR1NMIHNuaXBwZXQgdGhhdCB3cml0ZXMgYSBzaW5nbGUgdGV4ZWwgdG8gYSB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHRleHR1cmVQcm9wZXJ0eSAtIFRoZSBuYW1lIG9mIHRoZSB0ZXh0dXJlIHVuaWZvcm0gaW4gdGhlIHNoYWRlci5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdXZJbmRleFNuaXBwZXQgLSBBIFdHU0wgc25pcHBldCB0aGF0IHJlcHJlc2VudHMgdGV4dHVyZSBjb29yZGluYXRlcyB1c2VkIGZvciBzYW1wbGluZy5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVTbmlwcGV0IC0gQSBXR1NMIHNuaXBwZXQgdGhhdCByZXByZXNlbnQgdGhlIG5ldyB0ZXhlbCB2YWx1ZS5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBXR1NMIHNuaXBwZXQuXHJcblx0ICovXHJcblx0Z2VuZXJhdGVUZXh0dXJlU3RvcmUoIHRleHR1cmUsIHRleHR1cmVQcm9wZXJ0eSwgdXZJbmRleFNuaXBwZXQsIHZhbHVlU25pcHBldCApIHtcclxuXHJcblx0XHRyZXR1cm4gYHRleHR1cmVTdG9yZSggJHsgdGV4dHVyZVByb3BlcnR5IH0sICR7IHV2SW5kZXhTbmlwcGV0IH0sICR7IHZhbHVlU25pcHBldCB9IClgO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBzYW1wbGVkIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gdGV4dHVyZSBzaG91bGQgYmUgY29tcGFyZWQgYWdhaW5zdCBhIHJlZmVyZW5jZSB2YWx1ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlLlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHNhbXBsZWQgdmFsdWVzIG9mIHRoZSBnaXZlbiB0ZXh0dXJlIHNob3VsZCBiZSBjb21wYXJlZCBhZ2FpbnN0IGEgcmVmZXJlbmNlIHZhbHVlIG9yIG5vdC5cclxuXHQgKi9cclxuXHRpc1NhbXBsZUNvbXBhcmUoIHRleHR1cmUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRleHR1cmUuaXNEZXB0aFRleHR1cmUgPT09IHRydWUgJiYgdGV4dHVyZS5jb21wYXJlRnVuY3Rpb24gIT09IG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIHRleHR1cmUgaXMgdW5maWx0ZXJhYmxlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZ2l2ZW4gdGV4dHVyZSBpcyB1bmZpbHRlcmFibGUgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGlzVW5maWx0ZXJhYmxlKCB0ZXh0dXJlICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmdldENvbXBvbmVudFR5cGVGcm9tVGV4dHVyZSggdGV4dHVyZSApICE9PSAnZmxvYXQnIHx8XHJcblx0XHRcdCggISB0aGlzLmlzQXZhaWxhYmxlKCAnZmxvYXQzMkZpbHRlcmFibGUnICkgJiYgdGV4dHVyZS5pc0RhdGFUZXh0dXJlID09PSB0cnVlICYmIHRleHR1cmUudHlwZSA9PT0gRmxvYXRUeXBlICkgfHxcclxuXHRcdFx0KCB0aGlzLmlzU2FtcGxlQ29tcGFyZSggdGV4dHVyZSApID09PSBmYWxzZSAmJiB0ZXh0dXJlLm1pbkZpbHRlciA9PT0gTmVhcmVzdEZpbHRlciAmJiB0ZXh0dXJlLm1hZ0ZpbHRlciA9PT0gTmVhcmVzdEZpbHRlciApIHx8XHJcblx0XHRcdHRoaXMucmVuZGVyZXIuYmFja2VuZC51dGlscy5nZXRUZXh0dXJlU2FtcGxlRGF0YSggdGV4dHVyZSApLnByaW1hcnlTYW1wbGVzID4gMTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZW5lcmF0ZXMgdGhlIFdHU0wgc25pcHBldCBmb3Igc2FtcGxpbmcvbG9hZGluZyB0aGUgZ2l2ZW4gdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0dXJlUHJvcGVydHkgLSBUaGUgbmFtZSBvZiB0aGUgdGV4dHVyZSB1bmlmb3JtIGluIHRoZSBzaGFkZXIuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHV2U25pcHBldCAtIEEgV0dTTCBzbmlwcGV0IHRoYXQgcmVwcmVzZW50cyB0ZXh0dXJlIGNvb3JkaW5hdGVzIHVzZWQgZm9yIHNhbXBsaW5nLlxyXG5cdCAqIEBwYXJhbSB7P3N0cmluZ30gZGVwdGhTbmlwcGV0IC0gQSBXR1NMIHNuaXBwZXQgdGhhdCByZXByZXNlbnRzIDAtYmFzZWQgdGV4dHVyZSBhcnJheSBpbmRleCB0byBzYW1wbGUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtzaGFkZXJTdGFnZT10aGlzLnNoYWRlclN0YWdlXSAtIFRoZSBzaGFkZXIgc3RhZ2UgdGhpcyBjb2RlIHNuaXBwZXQgaXMgZ2VuZXJhdGVkIGZvci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBXR1NMIHNuaXBwZXQuXHJcblx0ICovXHJcblx0Z2VuZXJhdGVUZXh0dXJlKCB0ZXh0dXJlLCB0ZXh0dXJlUHJvcGVydHksIHV2U25pcHBldCwgZGVwdGhTbmlwcGV0LCBzaGFkZXJTdGFnZSA9IHRoaXMuc2hhZGVyU3RhZ2UgKSB7XHJcblxyXG5cdFx0bGV0IHNuaXBwZXQgPSBudWxsO1xyXG5cclxuXHRcdGlmICggdGV4dHVyZS5pc1ZpZGVvVGV4dHVyZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdHNuaXBwZXQgPSB0aGlzLl9nZW5lcmF0ZVZpZGVvU2FtcGxlKCB0ZXh0dXJlUHJvcGVydHksIHV2U25pcHBldCwgc2hhZGVyU3RhZ2UgKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCB0aGlzLmlzVW5maWx0ZXJhYmxlKCB0ZXh0dXJlICkgKSB7XHJcblxyXG5cdFx0XHRzbmlwcGV0ID0gdGhpcy5nZW5lcmF0ZVRleHR1cmVMb2QoIHRleHR1cmUsIHRleHR1cmVQcm9wZXJ0eSwgdXZTbmlwcGV0LCBkZXB0aFNuaXBwZXQsICcwJywgc2hhZGVyU3RhZ2UgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0c25pcHBldCA9IHRoaXMuX2dlbmVyYXRlVGV4dHVyZVNhbXBsZSggdGV4dHVyZSwgdGV4dHVyZVByb3BlcnR5LCB1dlNuaXBwZXQsIGRlcHRoU25pcHBldCwgc2hhZGVyU3RhZ2UgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHNuaXBwZXQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2VuZXJhdGVzIHRoZSBXR1NMIHNuaXBwZXQgZm9yIHNhbXBsaW5nL2xvYWRpbmcgdGhlIGdpdmVuIHRleHR1cmUgdXNpbmcgZXhwbGljaXQgZ3JhZGllbnRzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHRleHR1cmVQcm9wZXJ0eSAtIFRoZSBuYW1lIG9mIHRoZSB0ZXh0dXJlIHVuaWZvcm0gaW4gdGhlIHNoYWRlci5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdXZTbmlwcGV0IC0gQSBXR1NMIHNuaXBwZXQgdGhhdCByZXByZXNlbnRzIHRleHR1cmUgY29vcmRpbmF0ZXMgdXNlZCBmb3Igc2FtcGxpbmcuXHJcblx0ICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBncmFkU25pcHBldCAtIEFuIGFycmF5IGhvbGRpbmcgYm90aCBncmFkaWVudCBXR1NMIHNuaXBwZXRzLlxyXG5cdCAqIEBwYXJhbSB7P3N0cmluZ30gZGVwdGhTbmlwcGV0IC0gQSBXR1NMIHNuaXBwZXQgdGhhdCByZXByZXNlbnRzIDAtYmFzZWQgdGV4dHVyZSBhcnJheSBpbmRleCB0byBzYW1wbGUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtzaGFkZXJTdGFnZT10aGlzLnNoYWRlclN0YWdlXSAtIFRoZSBzaGFkZXIgc3RhZ2UgdGhpcyBjb2RlIHNuaXBwZXQgaXMgZ2VuZXJhdGVkIGZvci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBXR1NMIHNuaXBwZXQuXHJcblx0ICovXHJcblx0Z2VuZXJhdGVUZXh0dXJlR3JhZCggdGV4dHVyZSwgdGV4dHVyZVByb3BlcnR5LCB1dlNuaXBwZXQsIGdyYWRTbmlwcGV0LCBkZXB0aFNuaXBwZXQsIHNoYWRlclN0YWdlID0gdGhpcy5zaGFkZXJTdGFnZSApIHtcclxuXHJcblx0XHRpZiAoIHNoYWRlclN0YWdlID09PSAnZnJhZ21lbnQnICkge1xyXG5cclxuXHRcdFx0Ly8gVE9ETyBoYW5kbGUgaTMyIG9yIHUzMiAtLT4gdXZTbmlwcGV0LCBhcnJheV9pbmRleDogQSwgZGR4LCBkZHlcclxuXHRcdFx0cmV0dXJuIGB0ZXh0dXJlU2FtcGxlR3JhZCggJHsgdGV4dHVyZVByb3BlcnR5IH0sICR7IHRleHR1cmVQcm9wZXJ0eSB9X3NhbXBsZXIsICR7IHV2U25pcHBldCB9LCAgJHsgZ3JhZFNuaXBwZXRbIDAgXSB9LCAkeyBncmFkU25pcHBldFsgMSBdIH0gKWA7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoIGBXZWJHUFVSZW5kZXJlcjogVEhSRUUuVGV4dHVyZU5vZGUuZ3JhZGllbnQoKSBkb2VzIG5vdCBzdXBwb3J0ICR7IHNoYWRlclN0YWdlIH0gc2hhZGVyLmAgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2VuZXJhdGVzIHRoZSBXR1NMIHNuaXBwZXQgZm9yIHNhbXBsaW5nIGEgZGVwdGggdGV4dHVyZSBhbmQgY29tcGFyaW5nIHRoZSBzYW1wbGVkIGRlcHRoIHZhbHVlc1xyXG5cdCAqIGFnYWluc3QgYSByZWZlcmVuY2UgdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdGV4dHVyZVByb3BlcnR5IC0gVGhlIG5hbWUgb2YgdGhlIHRleHR1cmUgdW5pZm9ybSBpbiB0aGUgc2hhZGVyLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB1dlNuaXBwZXQgLSBBIFdHU0wgc25pcHBldCB0aGF0IHJlcHJlc2VudHMgdGV4dHVyZSBjb29yZGluYXRlcyB1c2VkIGZvciBzYW1wbGluZy5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gY29tcGFyZVNuaXBwZXQgLSAgQSBXR1NMIHNuaXBwZXQgdGhhdCByZXByZXNlbnRzIHRoZSByZWZlcmVuY2UgdmFsdWUuXHJcblx0ICogQHBhcmFtIHs/c3RyaW5nfSBkZXB0aFNuaXBwZXQgLSBBIFdHU0wgc25pcHBldCB0aGF0IHJlcHJlc2VudHMgMC1iYXNlZCB0ZXh0dXJlIGFycmF5IGluZGV4IHRvIHNhbXBsZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW3NoYWRlclN0YWdlPXRoaXMuc2hhZGVyU3RhZ2VdIC0gVGhlIHNoYWRlciBzdGFnZSB0aGlzIGNvZGUgc25pcHBldCBpcyBnZW5lcmF0ZWQgZm9yLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIFdHU0wgc25pcHBldC5cclxuXHQgKi9cclxuXHRnZW5lcmF0ZVRleHR1cmVDb21wYXJlKCB0ZXh0dXJlLCB0ZXh0dXJlUHJvcGVydHksIHV2U25pcHBldCwgY29tcGFyZVNuaXBwZXQsIGRlcHRoU25pcHBldCwgc2hhZGVyU3RhZ2UgPSB0aGlzLnNoYWRlclN0YWdlICkge1xyXG5cclxuXHRcdGlmICggc2hhZGVyU3RhZ2UgPT09ICdmcmFnbWVudCcgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gYHRleHR1cmVTYW1wbGVDb21wYXJlKCAkeyB0ZXh0dXJlUHJvcGVydHkgfSwgJHsgdGV4dHVyZVByb3BlcnR5IH1fc2FtcGxlciwgJHsgdXZTbmlwcGV0IH0sICR7IGNvbXBhcmVTbmlwcGV0IH0gKWA7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoIGBXZWJHUFVSZW5kZXJlcjogVEhSRUUuRGVwdGhUZXh0dXJlLmNvbXBhcmVGdW5jdGlvbigpIGRvZXMgbm90IHN1cHBvcnQgJHsgc2hhZGVyU3RhZ2UgfSBzaGFkZXIuYCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZW5lcmF0ZXMgdGhlIFdHU0wgc25pcHBldCB3aGVuIHNhbXBsaW5nIHRleHR1cmVzIHdpdGggZXhwbGljaXQgbWlwIGxldmVsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHRleHR1cmVQcm9wZXJ0eSAtIFRoZSBuYW1lIG9mIHRoZSB0ZXh0dXJlIHVuaWZvcm0gaW4gdGhlIHNoYWRlci5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdXZTbmlwcGV0IC0gQSBXR1NMIHNuaXBwZXQgdGhhdCByZXByZXNlbnRzIHRleHR1cmUgY29vcmRpbmF0ZXMgdXNlZCBmb3Igc2FtcGxpbmcuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGxldmVsU25pcHBldCAtIEEgV0dTTCBzbmlwcGV0IHRoYXQgcmVwcmVzZW50cyB0aGUgbWlwIGxldmVsLCB3aXRoIGxldmVsIDAgY29udGFpbmluZyBhIGZ1bGwgc2l6ZSB2ZXJzaW9uIG9mIHRoZSB0ZXh0dXJlLlxyXG5cdCAqIEBwYXJhbSB7P3N0cmluZ30gZGVwdGhTbmlwcGV0IC0gQSBXR1NMIHNuaXBwZXQgdGhhdCByZXByZXNlbnRzIDAtYmFzZWQgdGV4dHVyZSBhcnJheSBpbmRleCB0byBzYW1wbGUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtzaGFkZXJTdGFnZT10aGlzLnNoYWRlclN0YWdlXSAtIFRoZSBzaGFkZXIgc3RhZ2UgdGhpcyBjb2RlIHNuaXBwZXQgaXMgZ2VuZXJhdGVkIGZvci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBXR1NMIHNuaXBwZXQuXHJcblx0ICovXHJcblx0Z2VuZXJhdGVUZXh0dXJlTGV2ZWwoIHRleHR1cmUsIHRleHR1cmVQcm9wZXJ0eSwgdXZTbmlwcGV0LCBsZXZlbFNuaXBwZXQsIGRlcHRoU25pcHBldCwgc2hhZGVyU3RhZ2UgPSB0aGlzLnNoYWRlclN0YWdlICkge1xyXG5cclxuXHRcdGxldCBzbmlwcGV0ID0gbnVsbDtcclxuXHJcblx0XHRpZiAoIHRleHR1cmUuaXNWaWRlb1RleHR1cmUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRzbmlwcGV0ID0gdGhpcy5fZ2VuZXJhdGVWaWRlb1NhbXBsZSggdGV4dHVyZVByb3BlcnR5LCB1dlNuaXBwZXQsIHNoYWRlclN0YWdlICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHNuaXBwZXQgPSB0aGlzLl9nZW5lcmF0ZVRleHR1cmVTYW1wbGVMZXZlbCggdGV4dHVyZSwgdGV4dHVyZVByb3BlcnR5LCB1dlNuaXBwZXQsIGxldmVsU25pcHBldCwgZGVwdGhTbmlwcGV0LCBzaGFkZXJTdGFnZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gc25pcHBldDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZW5lcmF0ZXMgdGhlIFdHU0wgc25pcHBldCB3aGVuIHNhbXBsaW5nIHRleHR1cmVzIHdpdGggYSBiaWFzIHRvIHRoZSBtaXAgbGV2ZWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdGV4dHVyZVByb3BlcnR5IC0gVGhlIG5hbWUgb2YgdGhlIHRleHR1cmUgdW5pZm9ybSBpbiB0aGUgc2hhZGVyLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB1dlNuaXBwZXQgLSBBIFdHU0wgc25pcHBldCB0aGF0IHJlcHJlc2VudHMgdGV4dHVyZSBjb29yZGluYXRlcyB1c2VkIGZvciBzYW1wbGluZy5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gYmlhc1NuaXBwZXQgLSBBIFdHU0wgc25pcHBldCB0aGF0IHJlcHJlc2VudHMgdGhlIGJpYXMgdG8gYXBwbHkgdG8gdGhlIG1pcCBsZXZlbCBiZWZvcmUgc2FtcGxpbmcuXHJcblx0ICogQHBhcmFtIHs/c3RyaW5nfSBkZXB0aFNuaXBwZXQgLSBBIFdHU0wgc25pcHBldCB0aGF0IHJlcHJlc2VudHMgMC1iYXNlZCB0ZXh0dXJlIGFycmF5IGluZGV4IHRvIHNhbXBsZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW3NoYWRlclN0YWdlPXRoaXMuc2hhZGVyU3RhZ2VdIC0gVGhlIHNoYWRlciBzdGFnZSB0aGlzIGNvZGUgc25pcHBldCBpcyBnZW5lcmF0ZWQgZm9yLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIFdHU0wgc25pcHBldC5cclxuXHQgKi9cclxuXHRnZW5lcmF0ZVRleHR1cmVCaWFzKCB0ZXh0dXJlLCB0ZXh0dXJlUHJvcGVydHksIHV2U25pcHBldCwgYmlhc1NuaXBwZXQsIGRlcHRoU25pcHBldCwgc2hhZGVyU3RhZ2UgPSB0aGlzLnNoYWRlclN0YWdlICkge1xyXG5cclxuXHRcdGlmICggc2hhZGVyU3RhZ2UgPT09ICdmcmFnbWVudCcgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gYHRleHR1cmVTYW1wbGVCaWFzKCAkeyB0ZXh0dXJlUHJvcGVydHkgfSwgJHsgdGV4dHVyZVByb3BlcnR5IH1fc2FtcGxlciwgJHsgdXZTbmlwcGV0IH0sICR7IGJpYXNTbmlwcGV0IH0gKWA7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoIGBXZWJHUFVSZW5kZXJlcjogVEhSRUUuVGV4dHVyZU5vZGUuYmlhc05vZGUgZG9lcyBub3Qgc3VwcG9ydCAkeyBzaGFkZXJTdGFnZSB9IHNoYWRlci5gICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBXR1NMIHNuaXBwZXQgdGhhdCByZXByZXNlbnRzIHRoZSBwcm9wZXJ0eSBuYW1lIG9mIHRoZSBnaXZlbiBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIG5vZGUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtzaGFkZXJTdGFnZT10aGlzLnNoYWRlclN0YWdlXSAtIFRoZSBzaGFkZXIgc3RhZ2UgdGhpcyBjb2RlIHNuaXBwZXQgaXMgZ2VuZXJhdGVkIGZvci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBwcm9wZXJ0eSBuYW1lLlxyXG5cdCAqL1xyXG5cdGdldFByb3BlcnR5TmFtZSggbm9kZSwgc2hhZGVyU3RhZ2UgPSB0aGlzLnNoYWRlclN0YWdlICkge1xyXG5cclxuXHRcdGlmICggbm9kZS5pc05vZGVWYXJ5aW5nID09PSB0cnVlICYmIG5vZGUubmVlZHNJbnRlcnBvbGF0aW9uID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0aWYgKCBzaGFkZXJTdGFnZSA9PT0gJ3ZlcnRleCcgKSB7XHJcblxyXG5cdFx0XHRcdHJldHVybiBgdmFyeWluZ3MuJHsgbm9kZS5uYW1lIH1gO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSBpZiAoIG5vZGUuaXNOb2RlVW5pZm9ybSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdGNvbnN0IG5hbWUgPSBub2RlLm5hbWU7XHJcblx0XHRcdGNvbnN0IHR5cGUgPSBub2RlLnR5cGU7XHJcblxyXG5cdFx0XHRpZiAoIHR5cGUgPT09ICd0ZXh0dXJlJyB8fCB0eXBlID09PSAnY3ViZVRleHR1cmUnIHx8IHR5cGUgPT09ICdzdG9yYWdlVGV4dHVyZScgfHwgdHlwZSA9PT0gJ3RleHR1cmUzRCcgKSB7XHJcblxyXG5cdFx0XHRcdHJldHVybiBuYW1lO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggdHlwZSA9PT0gJ2J1ZmZlcicgfHwgdHlwZSA9PT0gJ3N0b3JhZ2VCdWZmZXInIHx8IHR5cGUgPT09ICdpbmRpcmVjdFN0b3JhZ2VCdWZmZXInICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIHRoaXMuaXNDdXN0b21TdHJ1Y3QoIG5vZGUgKSApIHtcclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gbmFtZTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRyZXR1cm4gbmFtZSArICcudmFsdWUnO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0cmV0dXJuIG5vZGUuZ3JvdXBOb2RlLm5hbWUgKyAnLicgKyBuYW1lO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHlOYW1lKCBub2RlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgb3V0cHV0IHN0cnVjdCBuYW1lLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgbmFtZSBvZiB0aGUgb3V0cHV0IHN0cnVjdC5cclxuXHQgKi9cclxuXHRnZXRPdXRwdXRTdHJ1Y3ROYW1lKCkge1xyXG5cclxuXHRcdHJldHVybiAnb3V0cHV0JztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBuYXRpdmUgc2hhZGVyIG9wZXJhdG9yIG5hbWUgZm9yIGEgZ2l2ZW4gZ2VuZXJpYyBuYW1lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG9wIC0gVGhlIG9wZXJhdG9yIG5hbWUgdG8gcmVzb2x2ZS5cclxuXHQgKiBAcmV0dXJuIHs/c3RyaW5nfSBUaGUgcmVzb2x2ZWQgb3BlcmF0b3IgbmFtZS5cclxuXHQgKi9cclxuXHRnZXRGdW5jdGlvbk9wZXJhdG9yKCBvcCApIHtcclxuXHJcblx0XHRjb25zdCBmbk9wID0gd2dzbEZuT3BMaWJbIG9wIF07XHJcblxyXG5cdFx0aWYgKCBmbk9wICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHR0aGlzLl9pbmNsdWRlKCBmbk9wICk7XHJcblxyXG5cdFx0XHRyZXR1cm4gZm5PcDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgbm9kZSBhY2Nlc3MgZm9yIHRoZSBnaXZlbiBub2RlIGFuZCBzaGFkZXIgc3RhZ2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1N0b3JhZ2VUZXh0dXJlTm9kZXxTdG9yYWdlQnVmZmVyTm9kZX0gbm9kZSAtIFRoZSBzdG9yYWdlIG5vZGUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNoYWRlclN0YWdlIC0gVGhlIHNoYWRlciBzdGFnZS5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBub2RlIGFjY2Vzcy5cclxuXHQgKi9cclxuXHRnZXROb2RlQWNjZXNzKCBub2RlLCBzaGFkZXJTdGFnZSApIHtcclxuXHJcblx0XHRpZiAoIHNoYWRlclN0YWdlICE9PSAnY29tcHV0ZScgKVxyXG5cdFx0XHRyZXR1cm4gTm9kZUFjY2Vzcy5SRUFEX09OTFk7XHJcblxyXG5cdFx0cmV0dXJuIG5vZGUuYWNjZXNzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgQSBXR1NMIHNuaXBwZXQgcmVwcmVzZW50aW5nIHRoZSBzdG9yYWdlIGFjY2Vzcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7U3RvcmFnZVRleHR1cmVOb2RlfFN0b3JhZ2VCdWZmZXJOb2RlfSBub2RlIC0gVGhlIHN0b3JhZ2Ugbm9kZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc2hhZGVyU3RhZ2UgLSBUaGUgc2hhZGVyIHN0YWdlLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIFdHU0wgc25pcHBldCByZXByZXNlbnRpbmcgdGhlIHN0b3JhZ2UgYWNjZXNzLlxyXG5cdCAqL1xyXG5cdGdldFN0b3JhZ2VBY2Nlc3MoIG5vZGUsIHNoYWRlclN0YWdlICkge1xyXG5cclxuXHRcdHJldHVybiBhY2Nlc3NOYW1lc1sgdGhpcy5nZXROb2RlQWNjZXNzKCBub2RlLCBzaGFkZXJTdGFnZSApIF07XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgaXMgb25lIG9mIHRoZSBtb3JlIGltcG9ydGFudCBvbmVzIHNpbmNlIGl0J3MgcmVzcG9uc2libGVcclxuXHQgKiBmb3IgZ2VuZXJhdGluZyBhIG1hdGNoaW5nIGJpbmRpbmcgaW5zdGFuY2UgZm9yIHRoZSBnaXZlbiB1bmlmb3JtIG5vZGUuXHJcblx0ICpcclxuXHQgKiBUaGVzZSBiaW5kaW5ncyBhcmUgbGF0ZXIgdXNlZCBpbiB0aGUgcmVuZGVyZXIgdG8gY3JlYXRlIGJpbmQgZ3JvdXBzXHJcblx0ICogYW5kIGxheW91dHMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1VuaWZvcm1Ob2RlfSBub2RlIC0gVGhlIHVuaWZvcm0gbm9kZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSBub2RlIGRhdGEgdHlwZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc2hhZGVyU3RhZ2UgLSBUaGUgc2hhZGVyIHN0YWdlLlxyXG5cdCAqIEBwYXJhbSB7P3N0cmluZ30gW25hbWU9bnVsbF0gLSBBbiBvcHRpb25hbCB1bmlmb3JtIG5hbWUuXHJcblx0ICogQHJldHVybiB7Tm9kZVVuaWZvcm19IFRoZSBub2RlIHVuaWZvcm0gb2JqZWN0LlxyXG5cdCAqL1xyXG5cdGdldFVuaWZvcm1Gcm9tTm9kZSggbm9kZSwgdHlwZSwgc2hhZGVyU3RhZ2UsIG5hbWUgPSBudWxsICkge1xyXG5cclxuXHRcdGNvbnN0IHVuaWZvcm1Ob2RlID0gc3VwZXIuZ2V0VW5pZm9ybUZyb21Ob2RlKCBub2RlLCB0eXBlLCBzaGFkZXJTdGFnZSwgbmFtZSApO1xyXG5cdFx0Y29uc3Qgbm9kZURhdGEgPSB0aGlzLmdldERhdGFGcm9tTm9kZSggbm9kZSwgc2hhZGVyU3RhZ2UsIHRoaXMuZ2xvYmFsQ2FjaGUgKTtcclxuXHJcblx0XHRpZiAoIG5vZGVEYXRhLnVuaWZvcm1HUFUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGxldCB1bmlmb3JtR1BVO1xyXG5cclxuXHRcdFx0Y29uc3QgZ3JvdXAgPSBub2RlLmdyb3VwTm9kZTtcclxuXHRcdFx0Y29uc3QgZ3JvdXBOYW1lID0gZ3JvdXAubmFtZTtcclxuXHJcblx0XHRcdGNvbnN0IGJpbmRpbmdzID0gdGhpcy5nZXRCaW5kR3JvdXBBcnJheSggZ3JvdXBOYW1lLCBzaGFkZXJTdGFnZSApO1xyXG5cclxuXHRcdFx0aWYgKCB0eXBlID09PSAndGV4dHVyZScgfHwgdHlwZSA9PT0gJ2N1YmVUZXh0dXJlJyB8fCB0eXBlID09PSAnc3RvcmFnZVRleHR1cmUnIHx8IHR5cGUgPT09ICd0ZXh0dXJlM0QnICkge1xyXG5cclxuXHRcdFx0XHRsZXQgdGV4dHVyZSA9IG51bGw7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGFjY2VzcyA9IHRoaXMuZ2V0Tm9kZUFjY2Vzcyggbm9kZSwgc2hhZGVyU3RhZ2UgKTtcclxuXHJcblx0XHRcdFx0aWYgKCB0eXBlID09PSAndGV4dHVyZScgfHwgdHlwZSA9PT0gJ3N0b3JhZ2VUZXh0dXJlJyApIHtcclxuXHJcblx0XHRcdFx0XHR0ZXh0dXJlID0gbmV3IE5vZGVTYW1wbGVkVGV4dHVyZSggdW5pZm9ybU5vZGUubmFtZSwgdW5pZm9ybU5vZGUubm9kZSwgZ3JvdXAsIGFjY2VzcyApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCB0eXBlID09PSAnY3ViZVRleHR1cmUnICkge1xyXG5cclxuXHRcdFx0XHRcdHRleHR1cmUgPSBuZXcgTm9kZVNhbXBsZWRDdWJlVGV4dHVyZSggdW5pZm9ybU5vZGUubmFtZSwgdW5pZm9ybU5vZGUubm9kZSwgZ3JvdXAsIGFjY2VzcyApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCB0eXBlID09PSAndGV4dHVyZTNEJyApIHtcclxuXHJcblx0XHRcdFx0XHR0ZXh0dXJlID0gbmV3IE5vZGVTYW1wbGVkVGV4dHVyZTNEKCB1bmlmb3JtTm9kZS5uYW1lLCB1bmlmb3JtTm9kZS5ub2RlLCBncm91cCwgYWNjZXNzICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0dGV4dHVyZS5zdG9yZSA9IG5vZGUuaXNTdG9yYWdlVGV4dHVyZU5vZGUgPT09IHRydWU7XHJcblx0XHRcdFx0dGV4dHVyZS5zZXRWaXNpYmlsaXR5KCBncHVTaGFkZXJTdGFnZUxpYlsgc2hhZGVyU3RhZ2UgXSApO1xyXG5cclxuXHRcdFx0XHRpZiAoICggc2hhZGVyU3RhZ2UgPT09ICdmcmFnbWVudCcgfHwgc2hhZGVyU3RhZ2UgPT09ICdjb21wdXRlJyApICYmIHRoaXMuaXNVbmZpbHRlcmFibGUoIG5vZGUudmFsdWUgKSA9PT0gZmFsc2UgJiYgdGV4dHVyZS5zdG9yZSA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3Qgc2FtcGxlciA9IG5ldyBOb2RlU2FtcGxlciggYCR7IHVuaWZvcm1Ob2RlLm5hbWUgfV9zYW1wbGVyYCwgdW5pZm9ybU5vZGUubm9kZSwgZ3JvdXAgKTtcclxuXHRcdFx0XHRcdHNhbXBsZXIuc2V0VmlzaWJpbGl0eSggZ3B1U2hhZGVyU3RhZ2VMaWJbIHNoYWRlclN0YWdlIF0gKTtcclxuXHJcblx0XHRcdFx0XHRiaW5kaW5ncy5wdXNoKCBzYW1wbGVyLCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0XHRcdFx0dW5pZm9ybUdQVSA9IFsgc2FtcGxlciwgdGV4dHVyZSBdO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdGJpbmRpbmdzLnB1c2goIHRleHR1cmUgKTtcclxuXHJcblx0XHRcdFx0XHR1bmlmb3JtR1BVID0gWyB0ZXh0dXJlIF07XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIHR5cGUgPT09ICdidWZmZXInIHx8IHR5cGUgPT09ICdzdG9yYWdlQnVmZmVyJyB8fCB0eXBlID09PSAnaW5kaXJlY3RTdG9yYWdlQnVmZmVyJyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgYnVmZmVyQ2xhc3MgPSB0eXBlID09PSAnYnVmZmVyJyA/IE5vZGVVbmlmb3JtQnVmZmVyIDogTm9kZVN0b3JhZ2VCdWZmZXI7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGJ1ZmZlciA9IG5ldyBidWZmZXJDbGFzcyggbm9kZSwgZ3JvdXAgKTtcclxuXHRcdFx0XHRidWZmZXIuc2V0VmlzaWJpbGl0eSggZ3B1U2hhZGVyU3RhZ2VMaWJbIHNoYWRlclN0YWdlIF0gKTtcclxuXHJcblx0XHRcdFx0YmluZGluZ3MucHVzaCggYnVmZmVyICk7XHJcblxyXG5cdFx0XHRcdHVuaWZvcm1HUFUgPSBidWZmZXI7XHJcblxyXG5cdFx0XHRcdHVuaWZvcm1Ob2RlLm5hbWUgPSBuYW1lID8gbmFtZSA6ICdOb2RlQnVmZmVyXycgKyB1bmlmb3JtTm9kZS5pZDtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHVuaWZvcm1zU3RhZ2UgPSB0aGlzLnVuaWZvcm1Hcm91cHNbIHNoYWRlclN0YWdlIF0gfHwgKCB0aGlzLnVuaWZvcm1Hcm91cHNbIHNoYWRlclN0YWdlIF0gPSB7fSApO1xyXG5cclxuXHRcdFx0XHRsZXQgdW5pZm9ybXNHcm91cCA9IHVuaWZvcm1zU3RhZ2VbIGdyb3VwTmFtZSBdO1xyXG5cclxuXHRcdFx0XHRpZiAoIHVuaWZvcm1zR3JvdXAgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHR1bmlmb3Jtc0dyb3VwID0gbmV3IE5vZGVVbmlmb3Jtc0dyb3VwKCBncm91cE5hbWUsIGdyb3VwICk7XHJcblx0XHRcdFx0XHR1bmlmb3Jtc0dyb3VwLnNldFZpc2liaWxpdHkoIGdwdVNoYWRlclN0YWdlTGliWyBzaGFkZXJTdGFnZSBdICk7XHJcblxyXG5cdFx0XHRcdFx0dW5pZm9ybXNTdGFnZVsgZ3JvdXBOYW1lIF0gPSB1bmlmb3Jtc0dyb3VwO1xyXG5cclxuXHRcdFx0XHRcdGJpbmRpbmdzLnB1c2goIHVuaWZvcm1zR3JvdXAgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR1bmlmb3JtR1BVID0gdGhpcy5nZXROb2RlVW5pZm9ybSggdW5pZm9ybU5vZGUsIHR5cGUgKTtcclxuXHJcblx0XHRcdFx0dW5pZm9ybXNHcm91cC5hZGRVbmlmb3JtKCB1bmlmb3JtR1BVICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRub2RlRGF0YS51bmlmb3JtR1BVID0gdW5pZm9ybUdQVTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHVuaWZvcm1Ob2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSB1c2VkIHdoZW5ldmVyIGJ1aWx0aW5zIGFyZSByZXF1aXJlZCBpbiBub2Rlcy5cclxuXHQgKiBUaGUgaW50ZXJuYWwgYnVpbHRpbnMgZGF0YSBzdHJ1Y3R1cmUgd2lsbCBtYWtlIHN1cmUgYnVpbHRpbnMgYXJlXHJcblx0ICogZGVmaW5lZCBpbiB0aGUgV0dTTCBzb3VyY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBidWlsdGluIG5hbWUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IG5hbWUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBUaGUgbm9kZSBkYXRhIHR5cGUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtzaGFkZXJTdGFnZT10aGlzLnNoYWRlclN0YWdlXSAtIFRoZSBzaGFkZXIgc3RhZ2UgdGhpcyBjb2RlIHNuaXBwZXQgaXMgZ2VuZXJhdGVkIGZvci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBwcm9wZXJ0eSBuYW1lLlxyXG5cdCAqL1xyXG5cdGdldEJ1aWx0aW4oIG5hbWUsIHByb3BlcnR5LCB0eXBlLCBzaGFkZXJTdGFnZSA9IHRoaXMuc2hhZGVyU3RhZ2UgKSB7XHJcblxyXG5cdFx0Y29uc3QgbWFwID0gdGhpcy5idWlsdGluc1sgc2hhZGVyU3RhZ2UgXSB8fCAoIHRoaXMuYnVpbHRpbnNbIHNoYWRlclN0YWdlIF0gPSBuZXcgTWFwKCkgKTtcclxuXHJcblx0XHRpZiAoIG1hcC5oYXMoIG5hbWUgKSA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRtYXAuc2V0KCBuYW1lLCB7XHJcblx0XHRcdFx0bmFtZSxcclxuXHRcdFx0XHRwcm9wZXJ0eSxcclxuXHRcdFx0XHR0eXBlXHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHByb3BlcnR5O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBnaXZlbiBidWlsdGluIGlzIGRlZmluZWQgaW4gdGhlIGdpdmVuIHNoYWRlciBzdGFnZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIGJ1aWx0aW4gbmFtZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW3NoYWRlclN0YWdlPXRoaXMuc2hhZGVyU3RhZ2VdIC0gVGhlIHNoYWRlciBzdGFnZSB0aGlzIGNvZGUgc25pcHBldCBpcyBnZW5lcmF0ZWQgZm9yLlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGdpdmVuIGJ1aWx0aW4gaXMgZGVmaW5lZCBpbiB0aGUgZ2l2ZW4gc2hhZGVyIHN0YWdlIG9yIG5vdC5cclxuXHQgKi9cclxuXHRoYXNCdWlsdGluKCBuYW1lLCBzaGFkZXJTdGFnZSA9IHRoaXMuc2hhZGVyU3RhZ2UgKSB7XHJcblxyXG5cdFx0cmV0dXJuICggdGhpcy5idWlsdGluc1sgc2hhZGVyU3RhZ2UgXSAhPT0gdW5kZWZpbmVkICYmIHRoaXMuYnVpbHRpbnNbIHNoYWRlclN0YWdlIF0uaGFzKCBuYW1lICkgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSB2ZXJ0ZXggaW5kZXggYnVpbHRpbi5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHZlcnRleCBpbmRleC5cclxuXHQgKi9cclxuXHRnZXRWZXJ0ZXhJbmRleCgpIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuc2hhZGVyU3RhZ2UgPT09ICd2ZXJ0ZXgnICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0QnVpbHRpbiggJ3ZlcnRleF9pbmRleCcsICd2ZXJ0ZXhJbmRleCcsICd1MzInLCAnYXR0cmlidXRlJyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gJ3ZlcnRleEluZGV4JztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBCdWlsZHMgdGhlIGdpdmVuIHNoYWRlciBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTaGFkZXJOb2RlSW50ZXJuYWx9IHNoYWRlck5vZGUgLSBUaGUgc2hhZGVyIG5vZGUuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgV0dTTCBmdW5jdGlvbiBjb2RlLlxyXG5cdCAqL1xyXG5cdGJ1aWxkRnVuY3Rpb25Db2RlKCBzaGFkZXJOb2RlICkge1xyXG5cclxuXHRcdGNvbnN0IGxheW91dCA9IHNoYWRlck5vZGUubGF5b3V0O1xyXG5cdFx0Y29uc3QgZmxvd0RhdGEgPSB0aGlzLmZsb3dTaGFkZXJOb2RlKCBzaGFkZXJOb2RlICk7XHJcblxyXG5cdFx0Y29uc3QgcGFyYW1ldGVycyA9IFtdO1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IGlucHV0IG9mIGxheW91dC5pbnB1dHMgKSB7XHJcblxyXG5cdFx0XHRwYXJhbWV0ZXJzLnB1c2goIGlucHV0Lm5hbWUgKyAnIDogJyArIHRoaXMuZ2V0VHlwZSggaW5wdXQudHlwZSApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0bGV0IGNvZGUgPSBgZm4gJHsgbGF5b3V0Lm5hbWUgfSggJHsgcGFyYW1ldGVycy5qb2luKCAnLCAnICkgfSApIC0+ICR7IHRoaXMuZ2V0VHlwZSggbGF5b3V0LnR5cGUgKSB9IHtcclxuJHsgZmxvd0RhdGEudmFycyB9XHJcbiR7IGZsb3dEYXRhLmNvZGUgfVxyXG5gO1xyXG5cclxuXHRcdGlmICggZmxvd0RhdGEucmVzdWx0ICkge1xyXG5cclxuXHRcdFx0Y29kZSArPSBgXFx0cmV0dXJuICR7IGZsb3dEYXRhLnJlc3VsdCB9O1xcbmA7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvZGUgKz0gJ1xcbn1cXG4nO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0cmV0dXJuIGNvZGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgaW5zdGFuY2UgaW5kZXggYnVpbHRpbi5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGluc3RhbmNlIGluZGV4LlxyXG5cdCAqL1xyXG5cdGdldEluc3RhbmNlSW5kZXgoKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLnNoYWRlclN0YWdlID09PSAndmVydGV4JyApIHtcclxuXHJcblx0XHRcdHJldHVybiB0aGlzLmdldEJ1aWx0aW4oICdpbnN0YW5jZV9pbmRleCcsICdpbnN0YW5jZUluZGV4JywgJ3UzMicsICdhdHRyaWJ1dGUnICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiAnaW5zdGFuY2VJbmRleCc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgaW52b2NhdGlvbiBsb2NhbCBpbmRleCBidWlsdGluLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgaW52b2NhdGlvbiBsb2NhbCBpbmRleC5cclxuXHQgKi9cclxuXHRnZXRJbnZvY2F0aW9uTG9jYWxJbmRleCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5nZXRCdWlsdGluKCAnbG9jYWxfaW52b2NhdGlvbl9pbmRleCcsICdpbnZvY2F0aW9uTG9jYWxJbmRleCcsICd1MzInLCAnYXR0cmlidXRlJyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHN1Ymdyb3VwIHNpemUgYnVpbHRpbi5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHN1Ymdyb3VwIHNpemUuXHJcblx0ICovXHJcblx0Z2V0U3ViZ3JvdXBTaXplKCkge1xyXG5cclxuXHRcdHRoaXMuZW5hYmxlU3ViR3JvdXBzKCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZ2V0QnVpbHRpbiggJ3N1Ymdyb3VwX3NpemUnLCAnc3ViZ3JvdXBTaXplJywgJ3UzMicsICdhdHRyaWJ1dGUnICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgaW52b2NhdGlvbiBzdWJncm91cCBpbmRleCBidWlsdGluLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgaW52b2NhdGlvbiBzdWJncm91cCBpbmRleC5cclxuXHQgKi9cclxuXHRnZXRJbnZvY2F0aW9uU3ViZ3JvdXBJbmRleCgpIHtcclxuXHJcblx0XHR0aGlzLmVuYWJsZVN1Ykdyb3VwcygpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmdldEJ1aWx0aW4oICdzdWJncm91cF9pbnZvY2F0aW9uX2lkJywgJ2ludm9jYXRpb25TdWJncm91cEluZGV4JywgJ3UzMicsICdhdHRyaWJ1dGUnICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgc3ViZ3JvdXAgaW5kZXggYnVpbHRpbi5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHN1Ymdyb3VwIGluZGV4LlxyXG5cdCAqL1xyXG5cdGdldFN1Ymdyb3VwSW5kZXgoKSB7XHJcblxyXG5cdFx0dGhpcy5lbmFibGVTdWJHcm91cHMoKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5nZXRCdWlsdGluKCAnc3ViZ3JvdXBfaWQnLCAnc3ViZ3JvdXBJbmRleCcsICd1MzInLCAnYXR0cmlidXRlJyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE92ZXJ3cml0dGVuIGFzIGEgTk9QIHNpbmNlIHRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciB0aGUgV2ViR0wgMiBiYWNrZW5kLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVsbH0gTnVsbC5cclxuXHQgKi9cclxuXHRnZXREcmF3SW5kZXgoKSB7XHJcblxyXG5cdFx0cmV0dXJuIG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgZnJvbnQgZmFjaW5nIGJ1aWx0aW4uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBmcm9udCBmYWNpbmcgYnVpbHRpbi5cclxuXHQgKi9cclxuXHRnZXRGcm9udEZhY2luZygpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5nZXRCdWlsdGluKCAnZnJvbnRfZmFjaW5nJywgJ2lzRnJvbnQnLCAnYm9vbCcgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBmcmFnIGNvb3JkIGJ1aWx0aW4uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBmcmFnIGNvb3JkIGJ1aWx0aW4uXHJcblx0ICovXHJcblx0Z2V0RnJhZ0Nvb3JkKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmdldEJ1aWx0aW4oICdwb3NpdGlvbicsICdmcmFnQ29vcmQnLCAndmVjNDxmMzI+JyApICsgJy54eSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgZnJhZyBkZXB0aCBidWlsdGluLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgZnJhZyBkZXB0aCBidWlsdGluLlxyXG5cdCAqL1xyXG5cdGdldEZyYWdEZXB0aCgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ291dHB1dC4nICsgdGhpcy5nZXRCdWlsdGluKCAnZnJhZ19kZXB0aCcsICdkZXB0aCcsICdmMzInLCAnb3V0cHV0JyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGNsaXAgZGlzdGFuY2VzIGJ1aWx0aW4uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBjbGlwIGRpc3RhbmNlcyBidWlsdGluLlxyXG5cdCAqL1xyXG5cdGdldENsaXBEaXN0YW5jZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ3ZhcnlpbmdzLmh3X2NsaXBfZGlzdGFuY2VzJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBXaGV0aGVyIHRvIGZsaXAgdGV4dHVyZSBkYXRhIGFsb25nIGl0cyB2ZXJ0aWNhbCBheGlzIG9yIG5vdC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFJldHVybnMgYWx3YXlzIGBmYWxzZWAgaW4gY29udGV4dCBvZiBXR1NMLlxyXG5cdCAqL1xyXG5cdGlzRmxpcFkoKSB7XHJcblxyXG5cdFx0cmV0dXJuIGZhbHNlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEVuYWJsZXMgdGhlIGdpdmVuIGRpcmVjdGl2ZSBmb3IgdGhlIGdpdmVuIHNoYWRlciBzdGFnZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIGRpcmVjdGl2ZSBuYW1lLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbc2hhZGVyU3RhZ2U9dGhpcy5zaGFkZXJTdGFnZV0gLSBUaGUgc2hhZGVyIHN0YWdlIHRvIGVuYWJsZSB0aGUgZGlyZWN0aXZlIGZvci5cclxuXHQgKi9cclxuXHRlbmFibGVEaXJlY3RpdmUoIG5hbWUsIHNoYWRlclN0YWdlID0gdGhpcy5zaGFkZXJTdGFnZSApIHtcclxuXHJcblx0XHRjb25zdCBzdGFnZSA9IHRoaXMuZGlyZWN0aXZlc1sgc2hhZGVyU3RhZ2UgXSB8fCAoIHRoaXMuZGlyZWN0aXZlc1sgc2hhZGVyU3RhZ2UgXSA9IG5ldyBTZXQoKSApO1xyXG5cdFx0c3RhZ2UuYWRkKCBuYW1lICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgZGlyZWN0aXZlcyBvZiB0aGUgZ2l2ZW4gc2hhZGVyIHN0YWdlIGFzIGEgV0dTTCBzdHJpbmcuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc2hhZGVyU3RhZ2UgLSBUaGUgc2hhZGVyIHN0YWdlLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gQSBXR1NMIHNuaXBwZXQgdGhhdCBlbmFibGVzIHRoZSBkaXJlY3RpdmVzIG9mIHRoZSBnaXZlbiBzdGFnZS5cclxuXHQgKi9cclxuXHRnZXREaXJlY3RpdmVzKCBzaGFkZXJTdGFnZSApIHtcclxuXHJcblx0XHRjb25zdCBzbmlwcGV0cyA9IFtdO1xyXG5cdFx0Y29uc3QgZGlyZWN0aXZlcyA9IHRoaXMuZGlyZWN0aXZlc1sgc2hhZGVyU3RhZ2UgXTtcclxuXHJcblx0XHRpZiAoIGRpcmVjdGl2ZXMgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGZvciAoIGNvbnN0IGRpcmVjdGl2ZSBvZiBkaXJlY3RpdmVzICkge1xyXG5cclxuXHRcdFx0XHRzbmlwcGV0cy5wdXNoKCBgZW5hYmxlICR7ZGlyZWN0aXZlfTtgICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBzbmlwcGV0cy5qb2luKCAnXFxuJyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEVuYWJsZXMgdGhlICdzdWJncm91cHMnIGRpcmVjdGl2ZS5cclxuXHQgKi9cclxuXHRlbmFibGVTdWJHcm91cHMoKSB7XHJcblxyXG5cdFx0dGhpcy5lbmFibGVEaXJlY3RpdmUoICdzdWJncm91cHMnICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRW5hYmxlcyB0aGUgJ3N1Ymdyb3Vwcy1mMTYnIGRpcmVjdGl2ZS5cclxuXHQgKi9cclxuXHRlbmFibGVTdWJncm91cHNGMTYoKSB7XHJcblxyXG5cdFx0dGhpcy5lbmFibGVEaXJlY3RpdmUoICdzdWJncm91cHMtZjE2JyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEVuYWJsZXMgdGhlICdjbGlwX2Rpc3RhbmNlcycgZGlyZWN0aXZlLlxyXG5cdCAqL1xyXG5cdGVuYWJsZUNsaXBEaXN0YW5jZXMoKSB7XHJcblxyXG5cdFx0dGhpcy5lbmFibGVEaXJlY3RpdmUoICdjbGlwX2Rpc3RhbmNlcycgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFbmFibGVzIHRoZSAnZjE2JyBkaXJlY3RpdmUuXHJcblx0ICovXHJcblx0ZW5hYmxlU2hhZGVyRjE2KCkge1xyXG5cclxuXHRcdHRoaXMuZW5hYmxlRGlyZWN0aXZlKCAnZjE2JyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEVuYWJsZXMgdGhlICdkdWFsX3NvdXJjZV9ibGVuZGluZycgZGlyZWN0aXZlLlxyXG5cdCAqL1xyXG5cdGVuYWJsZUR1YWxTb3VyY2VCbGVuZGluZygpIHtcclxuXHJcblx0XHR0aGlzLmVuYWJsZURpcmVjdGl2ZSggJ2R1YWxfc291cmNlX2JsZW5kaW5nJyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEVuYWJsZXMgaGFyZHdhcmUgY2xpcHBpbmcuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcGxhbmVDb3VudCAtIFRoZSBjbGlwcGluZyBwbGFuZSBjb3VudC5cclxuXHQgKi9cclxuXHRlbmFibGVIYXJkd2FyZUNsaXBwaW5nKCBwbGFuZUNvdW50ICkge1xyXG5cclxuXHRcdHRoaXMuZW5hYmxlQ2xpcERpc3RhbmNlcygpO1xyXG5cdFx0dGhpcy5nZXRCdWlsdGluKCAnY2xpcF9kaXN0YW5jZXMnLCAnaHdfY2xpcF9kaXN0YW5jZXMnLCBgYXJyYXk8ZjMyLCAkeyBwbGFuZUNvdW50IH0gPmAsICd2ZXJ0ZXgnICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgYnVpbHRpbnMgb2YgdGhlIGdpdmVuIHNoYWRlciBzdGFnZSBhcyBhIFdHU0wgc3RyaW5nLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNoYWRlclN0YWdlIC0gVGhlIHNoYWRlciBzdGFnZS5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IEEgV0dTTCBzbmlwcGV0IHRoYXQgcmVwcmVzZW50cyB0aGUgYnVpbHRpbnMgb2YgdGhlIGdpdmVuIHN0YWdlLlxyXG5cdCAqL1xyXG5cdGdldEJ1aWx0aW5zKCBzaGFkZXJTdGFnZSApIHtcclxuXHJcblx0XHRjb25zdCBzbmlwcGV0cyA9IFtdO1xyXG5cdFx0Y29uc3QgYnVpbHRpbnMgPSB0aGlzLmJ1aWx0aW5zWyBzaGFkZXJTdGFnZSBdO1xyXG5cclxuXHRcdGlmICggYnVpbHRpbnMgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGZvciAoIGNvbnN0IHsgbmFtZSwgcHJvcGVydHksIHR5cGUgfSBvZiBidWlsdGlucy52YWx1ZXMoKSApIHtcclxuXHJcblx0XHRcdFx0c25pcHBldHMucHVzaCggYEBidWlsdGluKCAke25hbWV9ICkgJHtwcm9wZXJ0eX0gOiAke3R5cGV9YCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gc25pcHBldHMuam9pbiggJyxcXG5cXHQnICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgd2hlbiBhIG5ldyBzY29wZWQgYnVmZmVyIGlzIHVzZWQgaW4gY29udGV4dCBvZlxyXG5cdCAqIGNvbXB1dGUgc2hhZGVycy4gSXQgYWRkcyB0aGUgYXJyYXkgdG8gdGhlIGludGVybmFsIGRhdGEgc3RydWN0dXJlIHdoaWNoIGlzXHJcblx0ICogbGF0ZXIgdXNlZCB0byBnZW5lcmF0ZSB0aGUgcmVzcGVjdGl2ZSBXR1NMLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgYXJyYXkgbmFtZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc2NvcGUgLSBUaGUgc2NvcGUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGJ1ZmZlclR5cGUgLSBUaGUgYnVmZmVyIHR5cGUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGJ1ZmZlckNvdW50IC0gVGhlIGJ1ZmZlciBjb3VudC5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBhcnJheSBuYW1lLlxyXG5cdCAqL1xyXG5cdGdldFNjb3BlZEFycmF5KCBuYW1lLCBzY29wZSwgYnVmZmVyVHlwZSwgYnVmZmVyQ291bnQgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLnNjb3BlZEFycmF5cy5oYXMoIG5hbWUgKSA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnNjb3BlZEFycmF5cy5zZXQoIG5hbWUsIHtcclxuXHRcdFx0XHRuYW1lLFxyXG5cdFx0XHRcdHNjb3BlLFxyXG5cdFx0XHRcdGJ1ZmZlclR5cGUsXHJcblx0XHRcdFx0YnVmZmVyQ291bnRcclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbmFtZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBzY29wZWQgYXJyYXlzIG9mIHRoZSBnaXZlbiBzaGFkZXIgc3RhZ2UgYXMgYSBXR1NMIHN0cmluZy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzaGFkZXJTdGFnZSAtIFRoZSBzaGFkZXIgc3RhZ2UuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfHVuZGVmaW5lZH0gVGhlIFdHU0wgc25pcHBldCB0aGF0IGRlZmluZXMgdGhlIHNjb3BlZCBhcnJheXMuXHJcblx0ICogUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHVzZWQgaW4gdGhlIHZlcnRleCBvciBmcmFnbWVudCBzdGFnZS5cclxuXHQgKi9cclxuXHRnZXRTY29wZWRBcnJheXMoIHNoYWRlclN0YWdlICkge1xyXG5cclxuXHRcdGlmICggc2hhZGVyU3RhZ2UgIT09ICdjb21wdXRlJyApIHtcclxuXHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3Qgc25pcHBldHMgPSBbXTtcclxuXHJcblx0XHRmb3IgKCBjb25zdCB7IG5hbWUsIHNjb3BlLCBidWZmZXJUeXBlLCBidWZmZXJDb3VudCB9IG9mIHRoaXMuc2NvcGVkQXJyYXlzLnZhbHVlcygpICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdHlwZSA9IHRoaXMuZ2V0VHlwZSggYnVmZmVyVHlwZSApO1xyXG5cclxuXHRcdFx0c25pcHBldHMucHVzaCggYHZhcjwke3Njb3BlfT4gJHtuYW1lfTogYXJyYXk8ICR7dHlwZX0sICR7YnVmZmVyQ291bnR9ID47YCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gc25pcHBldHMuam9pbiggJ1xcbicgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBzaGFkZXIgYXR0cmlidXRlcyBvZiB0aGUgZ2l2ZW4gc2hhZGVyIHN0YWdlIGFzIGEgV0dTTCBzdHJpbmcuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc2hhZGVyU3RhZ2UgLSBUaGUgc2hhZGVyIHN0YWdlLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIFdHU0wgc25pcHBldCB0aGF0IGRlZmluZXMgdGhlIHNoYWRlciBhdHRyaWJ1dGVzLlxyXG5cdCAqL1xyXG5cdGdldEF0dHJpYnV0ZXMoIHNoYWRlclN0YWdlICkge1xyXG5cclxuXHRcdGNvbnN0IHNuaXBwZXRzID0gW107XHJcblxyXG5cdFx0aWYgKCBzaGFkZXJTdGFnZSA9PT0gJ2NvbXB1dGUnICkge1xyXG5cclxuXHRcdFx0dGhpcy5nZXRCdWlsdGluKCAnZ2xvYmFsX2ludm9jYXRpb25faWQnLCAnZ2xvYmFsSWQnLCAndmVjMzx1MzI+JywgJ2F0dHJpYnV0ZScgKTtcclxuXHRcdFx0dGhpcy5nZXRCdWlsdGluKCAnd29ya2dyb3VwX2lkJywgJ3dvcmtncm91cElkJywgJ3ZlYzM8dTMyPicsICdhdHRyaWJ1dGUnICk7XHJcblx0XHRcdHRoaXMuZ2V0QnVpbHRpbiggJ2xvY2FsX2ludm9jYXRpb25faWQnLCAnbG9jYWxJZCcsICd2ZWMzPHUzMj4nLCAnYXR0cmlidXRlJyApO1xyXG5cdFx0XHR0aGlzLmdldEJ1aWx0aW4oICdudW1fd29ya2dyb3VwcycsICdudW1Xb3JrZ3JvdXBzJywgJ3ZlYzM8dTMyPicsICdhdHRyaWJ1dGUnICk7XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMucmVuZGVyZXIuaGFzRmVhdHVyZSggJ3N1Ymdyb3VwcycgKSApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5lbmFibGVEaXJlY3RpdmUoICdzdWJncm91cHMnLCBzaGFkZXJTdGFnZSApO1xyXG5cdFx0XHRcdHRoaXMuZ2V0QnVpbHRpbiggJ3N1Ymdyb3VwX3NpemUnLCAnc3ViZ3JvdXBTaXplJywgJ3UzMicsICdhdHRyaWJ1dGUnICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggc2hhZGVyU3RhZ2UgPT09ICd2ZXJ0ZXgnIHx8IHNoYWRlclN0YWdlID09PSAnY29tcHV0ZScgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBidWlsdGlucyA9IHRoaXMuZ2V0QnVpbHRpbnMoICdhdHRyaWJ1dGUnICk7XHJcblxyXG5cdFx0XHRpZiAoIGJ1aWx0aW5zICkgc25pcHBldHMucHVzaCggYnVpbHRpbnMgKTtcclxuXHJcblx0XHRcdGNvbnN0IGF0dHJpYnV0ZXMgPSB0aGlzLmdldEF0dHJpYnV0ZXNBcnJheSgpO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGluZGV4ID0gMCwgbGVuZ3RoID0gYXR0cmlidXRlcy5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgYXR0cmlidXRlID0gYXR0cmlidXRlc1sgaW5kZXggXTtcclxuXHRcdFx0XHRjb25zdCBuYW1lID0gYXR0cmlidXRlLm5hbWU7XHJcblx0XHRcdFx0Y29uc3QgdHlwZSA9IHRoaXMuZ2V0VHlwZSggYXR0cmlidXRlLnR5cGUgKTtcclxuXHJcblx0XHRcdFx0c25pcHBldHMucHVzaCggYEBsb2NhdGlvbiggJHtpbmRleH0gKSAkeyBuYW1lIH0gOiAkeyB0eXBlIH1gICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBzbmlwcGV0cy5qb2luKCAnLFxcblxcdCcgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBtZW1iZXJzIG9mIHRoZSBnaXZlbiBzdHJ1Y3QgdHlwZSBub2RlIGFzIGEgV0dTTCBzdHJpbmcuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1N0cnVjdFR5cGVOb2RlfSBzdHJ1Y3QgLSBUaGUgc3RydWN0IHR5cGUgbm9kZS5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBXR1NMIHNuaXBwZXQgdGhhdCBkZWZpbmVzIHRoZSBzdHJ1Y3QgbWVtYmVycy5cclxuXHQgKi9cclxuXHRnZXRTdHJ1Y3RNZW1iZXJzKCBzdHJ1Y3QgKSB7XHJcblxyXG5cdFx0Y29uc3Qgc25pcHBldHMgPSBbXTtcclxuXHJcblx0XHRmb3IgKCBjb25zdCBtZW1iZXIgb2Ygc3RydWN0Lm1lbWJlcnMgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBwcmVmaXggPSBzdHJ1Y3Qub3V0cHV0ID8gJ0Bsb2NhdGlvbiggJyArIG1lbWJlci5pbmRleCArICcgKSAnIDogJyc7XHJcblxyXG5cdFx0XHRsZXQgdHlwZSA9IHRoaXMuZ2V0VHlwZSggbWVtYmVyLnR5cGUgKTtcclxuXHJcblx0XHRcdGlmICggbWVtYmVyLmF0b21pYyApIHtcclxuXHJcblx0XHRcdFx0dHlwZSA9ICdhdG9taWM8ICcgKyB0eXBlICsgJyA+JztcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHNuaXBwZXRzLnB1c2goIGBcXHQkeyBwcmVmaXggKyBtZW1iZXIubmFtZSB9IDogJHsgdHlwZSB9YCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHN0cnVjdC5vdXRwdXQgKSB7XHJcblxyXG5cdFx0XHRzbmlwcGV0cy5wdXNoKCBgXFx0JHsgdGhpcy5nZXRCdWlsdGlucyggJ291dHB1dCcgKSB9YCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gc25pcHBldHMuam9pbiggJyxcXG4nICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgc3RydWN0cyBvZiB0aGUgZ2l2ZW4gc2hhZGVyIHN0YWdlIGFzIGEgV0dTTCBzdHJpbmcuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc2hhZGVyU3RhZ2UgLSBUaGUgc2hhZGVyIHN0YWdlLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIFdHU0wgc25pcHBldCB0aGF0IGRlZmluZXMgdGhlIHN0cnVjdHMuXHJcblx0ICovXHJcblx0Z2V0U3RydWN0cyggc2hhZGVyU3RhZ2UgKSB7XHJcblxyXG5cdFx0bGV0IHJlc3VsdCA9ICcnO1xyXG5cclxuXHRcdGNvbnN0IHN0cnVjdHMgPSB0aGlzLnN0cnVjdHNbIHNoYWRlclN0YWdlIF07XHJcblxyXG5cdFx0aWYgKCBzdHJ1Y3RzLmxlbmd0aCA+IDAgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBzbmlwcGV0cyA9IFtdO1xyXG5cclxuXHRcdFx0Zm9yICggY29uc3Qgc3RydWN0IG9mIHN0cnVjdHMgKSB7XHJcblxyXG5cdFx0XHRcdGxldCBzbmlwcGV0ID0gYHN0cnVjdCAkeyBzdHJ1Y3QubmFtZSB9IHtcXG5gO1xyXG5cdFx0XHRcdHNuaXBwZXQgKz0gdGhpcy5nZXRTdHJ1Y3RNZW1iZXJzKCBzdHJ1Y3QgKTtcclxuXHRcdFx0XHRzbmlwcGV0ICs9ICdcXG59Oyc7XHJcblxyXG5cdFx0XHRcdHNuaXBwZXRzLnB1c2goIHNuaXBwZXQgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJlc3VsdCA9ICdcXG4nICsgc25pcHBldHMuam9pbiggJ1xcblxcbicgKSArICdcXG4nO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBXR1NMIHN0cmluZyByZXByZXNlbnRpbmcgYSB2YXJpYWJsZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIHZhcmlhYmxlJ3MgdHlwZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSB2YXJpYWJsZSdzIG5hbWUuXHJcblx0ICogQHBhcmFtIHs/bnVtYmVyfSBbY291bnQ9bnVsbF0gLSBUaGUgYXJyYXkgbGVuZ3RoLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIFdHU0wgc25pcHBldCB0aGF0IGRlZmluZXMgYSB2YXJpYWJsZS5cclxuXHQgKi9cclxuXHRnZXRWYXIoIHR5cGUsIG5hbWUsIGNvdW50ID0gbnVsbCApIHtcclxuXHJcblx0XHRsZXQgc25pcHBldCA9IGB2YXIgJHsgbmFtZSB9IDogYDtcclxuXHJcblx0XHRpZiAoIGNvdW50ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0c25pcHBldCArPSB0aGlzLmdlbmVyYXRlQXJyYXlEZWNsYXJhdGlvbiggdHlwZSwgY291bnQgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0c25pcHBldCArPSB0aGlzLmdldFR5cGUoIHR5cGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHNuaXBwZXQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgdmFyaWFibGVzIG9mIHRoZSBnaXZlbiBzaGFkZXIgc3RhZ2UgYXMgYSBXR1NMIHN0cmluZy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzaGFkZXJTdGFnZSAtIFRoZSBzaGFkZXIgc3RhZ2UuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgV0dTTCBzbmlwcGV0IHRoYXQgZGVmaW5lcyB0aGUgdmFyaWFibGVzLlxyXG5cdCAqL1xyXG5cdGdldFZhcnMoIHNoYWRlclN0YWdlICkge1xyXG5cclxuXHRcdGNvbnN0IHNuaXBwZXRzID0gW107XHJcblx0XHRjb25zdCB2YXJzID0gdGhpcy52YXJzWyBzaGFkZXJTdGFnZSBdO1xyXG5cclxuXHRcdGlmICggdmFycyAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Zm9yICggY29uc3QgdmFyaWFibGUgb2YgdmFycyApIHtcclxuXHJcblx0XHRcdFx0c25pcHBldHMucHVzaCggYFxcdCR7IHRoaXMuZ2V0VmFyKCB2YXJpYWJsZS50eXBlLCB2YXJpYWJsZS5uYW1lLCB2YXJpYWJsZS5jb3VudCApIH07YCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gYFxcbiR7IHNuaXBwZXRzLmpvaW4oICdcXG4nICkgfVxcbmA7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgdmFyeWluZ3Mgb2YgdGhlIGdpdmVuIHNoYWRlciBzdGFnZSBhcyBhIFdHU0wgc3RyaW5nLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNoYWRlclN0YWdlIC0gVGhlIHNoYWRlciBzdGFnZS5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBXR1NMIHNuaXBwZXQgdGhhdCBkZWZpbmVzIHRoZSB2YXJ5aW5ncy5cclxuXHQgKi9cclxuXHRnZXRWYXJ5aW5ncyggc2hhZGVyU3RhZ2UgKSB7XHJcblxyXG5cdFx0Y29uc3Qgc25pcHBldHMgPSBbXTtcclxuXHJcblx0XHRpZiAoIHNoYWRlclN0YWdlID09PSAndmVydGV4JyApIHtcclxuXHJcblx0XHRcdHRoaXMuZ2V0QnVpbHRpbiggJ3Bvc2l0aW9uJywgJ1ZlcnRleCcsICd2ZWM0PGYzMj4nLCAndmVydGV4JyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHNoYWRlclN0YWdlID09PSAndmVydGV4JyB8fCBzaGFkZXJTdGFnZSA9PT0gJ2ZyYWdtZW50JyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHZhcnlpbmdzID0gdGhpcy52YXJ5aW5ncztcclxuXHRcdFx0Y29uc3QgdmFycyA9IHRoaXMudmFyc1sgc2hhZGVyU3RhZ2UgXTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpbmRleCA9IDA7IGluZGV4IDwgdmFyeWluZ3MubGVuZ3RoOyBpbmRleCArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgdmFyeWluZyA9IHZhcnlpbmdzWyBpbmRleCBdO1xyXG5cclxuXHRcdFx0XHRpZiAoIHZhcnlpbmcubmVlZHNJbnRlcnBvbGF0aW9uICkge1xyXG5cclxuXHRcdFx0XHRcdGxldCBhdHRyaWJ1dGVzU25pcHBldCA9IGBAbG9jYXRpb24oICR7aW5kZXh9IClgO1xyXG5cclxuXHRcdFx0XHRcdGlmICggL14oaW50fHVpbnR8aXZlY3x1dmVjKS8udGVzdCggdmFyeWluZy50eXBlICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRhdHRyaWJ1dGVzU25pcHBldCArPSAnIEBpbnRlcnBvbGF0ZSggZmxhdCApJztcclxuXHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHNuaXBwZXRzLnB1c2goIGAkeyBhdHRyaWJ1dGVzU25pcHBldCB9ICR7IHZhcnlpbmcubmFtZSB9IDogJHsgdGhpcy5nZXRUeXBlKCB2YXJ5aW5nLnR5cGUgKSB9YCApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCBzaGFkZXJTdGFnZSA9PT0gJ3ZlcnRleCcgJiYgdmFycy5pbmNsdWRlcyggdmFyeWluZyApID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdFx0XHR2YXJzLnB1c2goIHZhcnlpbmcgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBidWlsdGlucyA9IHRoaXMuZ2V0QnVpbHRpbnMoIHNoYWRlclN0YWdlICk7XHJcblxyXG5cdFx0aWYgKCBidWlsdGlucyApIHNuaXBwZXRzLnB1c2goIGJ1aWx0aW5zICk7XHJcblxyXG5cdFx0Y29uc3QgY29kZSA9IHNuaXBwZXRzLmpvaW4oICcsXFxuXFx0JyApO1xyXG5cclxuXHRcdHJldHVybiBzaGFkZXJTdGFnZSA9PT0gJ3ZlcnRleCcgPyB0aGlzLl9nZXRXR1NMU3RydWN0KCAnVmFyeWluZ3NTdHJ1Y3QnLCAnXFx0JyArIGNvZGUgKSA6IGNvZGU7XHJcblxyXG5cdH1cclxuXHJcblx0aXNDdXN0b21TdHJ1Y3QoIG5vZGVVbmlmb3JtICkge1xyXG5cclxuXHRcdHJldHVybiBub2RlVW5pZm9ybS52YWx1ZS5pc1N0b3JhZ2VCdWZmZXJBdHRyaWJ1dGUgJiYgbm9kZVVuaWZvcm0ubm9kZS5zdHJ1Y3RUeXBlTm9kZSAhPT0gbnVsbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSB1bmlmb3JtcyBvZiB0aGUgZ2l2ZW4gc2hhZGVyIHN0YWdlIGFzIGEgV0dTTCBzdHJpbmcuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc2hhZGVyU3RhZ2UgLSBUaGUgc2hhZGVyIHN0YWdlLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIFdHU0wgc25pcHBldCB0aGF0IGRlZmluZXMgdGhlIHVuaWZvcm1zLlxyXG5cdCAqL1xyXG5cdGdldFVuaWZvcm1zKCBzaGFkZXJTdGFnZSApIHtcclxuXHJcblx0XHRjb25zdCB1bmlmb3JtcyA9IHRoaXMudW5pZm9ybXNbIHNoYWRlclN0YWdlIF07XHJcblxyXG5cdFx0Y29uc3QgYmluZGluZ1NuaXBwZXRzID0gW107XHJcblx0XHRjb25zdCBidWZmZXJTbmlwcGV0cyA9IFtdO1xyXG5cdFx0Y29uc3Qgc3RydWN0U25pcHBldHMgPSBbXTtcclxuXHRcdGNvbnN0IHVuaWZvcm1Hcm91cHMgPSB7fTtcclxuXHJcblx0XHRmb3IgKCBjb25zdCB1bmlmb3JtIG9mIHVuaWZvcm1zICkge1xyXG5cclxuXHRcdFx0Y29uc3QgZ3JvdXBOYW1lID0gdW5pZm9ybS5ncm91cE5vZGUubmFtZTtcclxuXHRcdFx0Y29uc3QgdW5pZm9ybUluZGV4ZXMgPSB0aGlzLmJpbmRpbmdzSW5kZXhlc1sgZ3JvdXBOYW1lIF07XHJcblxyXG5cdFx0XHRpZiAoIHVuaWZvcm0udHlwZSA9PT0gJ3RleHR1cmUnIHx8IHVuaWZvcm0udHlwZSA9PT0gJ2N1YmVUZXh0dXJlJyB8fCB1bmlmb3JtLnR5cGUgPT09ICdzdG9yYWdlVGV4dHVyZScgfHwgdW5pZm9ybS50eXBlID09PSAndGV4dHVyZTNEJyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgdGV4dHVyZSA9IHVuaWZvcm0ubm9kZS52YWx1ZTtcclxuXHJcblx0XHRcdFx0aWYgKCAoIHNoYWRlclN0YWdlID09PSAnZnJhZ21lbnQnIHx8IHNoYWRlclN0YWdlID09PSAnY29tcHV0ZScgKSAmJiB0aGlzLmlzVW5maWx0ZXJhYmxlKCB0ZXh0dXJlICkgPT09IGZhbHNlICYmIHVuaWZvcm0ubm9kZS5pc1N0b3JhZ2VUZXh0dXJlTm9kZSAhPT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIHRoaXMuaXNTYW1wbGVDb21wYXJlKCB0ZXh0dXJlICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRiaW5kaW5nU25pcHBldHMucHVzaCggYEBiaW5kaW5nKCAkeyB1bmlmb3JtSW5kZXhlcy5iaW5kaW5nICsrIH0gKSBAZ3JvdXAoICR7IHVuaWZvcm1JbmRleGVzLmdyb3VwIH0gKSB2YXIgJHsgdW5pZm9ybS5uYW1lIH1fc2FtcGxlciA6IHNhbXBsZXJfY29tcGFyaXNvbjtgICk7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdGJpbmRpbmdTbmlwcGV0cy5wdXNoKCBgQGJpbmRpbmcoICR7IHVuaWZvcm1JbmRleGVzLmJpbmRpbmcgKysgfSApIEBncm91cCggJHsgdW5pZm9ybUluZGV4ZXMuZ3JvdXAgfSApIHZhciAkeyB1bmlmb3JtLm5hbWUgfV9zYW1wbGVyIDogc2FtcGxlcjtgICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGxldCB0ZXh0dXJlVHlwZTtcclxuXHJcblx0XHRcdFx0bGV0IG11bHRpc2FtcGxlZCA9ICcnO1xyXG5cclxuXHRcdFx0XHRjb25zdCB7IHByaW1hcnlTYW1wbGVzIH0gPSB0aGlzLnJlbmRlcmVyLmJhY2tlbmQudXRpbHMuZ2V0VGV4dHVyZVNhbXBsZURhdGEoIHRleHR1cmUgKTtcclxuXHJcblx0XHRcdFx0aWYgKCBwcmltYXJ5U2FtcGxlcyA+IDEgKSB7XHJcblxyXG5cdFx0XHRcdFx0bXVsdGlzYW1wbGVkID0gJ19tdWx0aXNhbXBsZWQnO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICggdGV4dHVyZS5pc0N1YmVUZXh0dXJlID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRcdHRleHR1cmVUeXBlID0gJ3RleHR1cmVfY3ViZTxmMzI+JztcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggdGV4dHVyZS5pc0RhdGFBcnJheVRleHR1cmUgPT09IHRydWUgfHwgdGV4dHVyZS5pc0NvbXByZXNzZWRBcnJheVRleHR1cmUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0dGV4dHVyZVR5cGUgPSAndGV4dHVyZV8yZF9hcnJheTxmMzI+JztcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggdGV4dHVyZS5pc0RlcHRoVGV4dHVyZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0XHR0ZXh0dXJlVHlwZSA9IGB0ZXh0dXJlX2RlcHRoJHttdWx0aXNhbXBsZWR9XzJkYDtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggdGV4dHVyZS5pc1ZpZGVvVGV4dHVyZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0XHR0ZXh0dXJlVHlwZSA9ICd0ZXh0dXJlX2V4dGVybmFsJztcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggdGV4dHVyZS5pc0RhdGEzRFRleHR1cmUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0dGV4dHVyZVR5cGUgPSAndGV4dHVyZV8zZDxmMzI+JztcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggdW5pZm9ybS5ub2RlLmlzU3RvcmFnZVRleHR1cmVOb2RlID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGZvcm1hdCA9IGdldEZvcm1hdCggdGV4dHVyZSApO1xyXG5cdFx0XHRcdFx0Y29uc3QgYWNjZXNzID0gdGhpcy5nZXRTdG9yYWdlQWNjZXNzKCB1bmlmb3JtLm5vZGUsIHNoYWRlclN0YWdlICk7XHJcblxyXG5cdFx0XHRcdFx0dGV4dHVyZVR5cGUgPSBgdGV4dHVyZV9zdG9yYWdlXzJkPCR7IGZvcm1hdCB9LCAkeyBhY2Nlc3MgfT5gO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGNvbXBvbmVudFByZWZpeCA9IHRoaXMuZ2V0Q29tcG9uZW50VHlwZUZyb21UZXh0dXJlKCB0ZXh0dXJlICkuY2hhckF0KCAwICk7XHJcblxyXG5cdFx0XHRcdFx0dGV4dHVyZVR5cGUgPSBgdGV4dHVyZSR7IG11bHRpc2FtcGxlZCB9XzJkPCR7IGNvbXBvbmVudFByZWZpeCB9MzI+YDtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRiaW5kaW5nU25pcHBldHMucHVzaCggYEBiaW5kaW5nKCAkeyB1bmlmb3JtSW5kZXhlcy5iaW5kaW5nICsrIH0gKSBAZ3JvdXAoICR7IHVuaWZvcm1JbmRleGVzLmdyb3VwIH0gKSB2YXIgJHsgdW5pZm9ybS5uYW1lIH0gOiAkeyB0ZXh0dXJlVHlwZSB9O2AgKTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIHVuaWZvcm0udHlwZSA9PT0gJ2J1ZmZlcicgfHwgdW5pZm9ybS50eXBlID09PSAnc3RvcmFnZUJ1ZmZlcicgfHwgdW5pZm9ybS50eXBlID09PSAnaW5kaXJlY3RTdG9yYWdlQnVmZmVyJyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgYnVmZmVyTm9kZSA9IHVuaWZvcm0ubm9kZTtcclxuXHRcdFx0XHRjb25zdCBidWZmZXJUeXBlID0gdGhpcy5nZXRUeXBlKCBidWZmZXJOb2RlLmdldE5vZGVUeXBlKCB0aGlzICkgKTtcclxuXHRcdFx0XHRjb25zdCBidWZmZXJDb3VudCA9IGJ1ZmZlck5vZGUuYnVmZmVyQ291bnQ7XHJcblx0XHRcdFx0Y29uc3QgYnVmZmVyQ291bnRTbmlwcGV0ID0gYnVmZmVyQ291bnQgPiAwICYmIHVuaWZvcm0udHlwZSA9PT0gJ2J1ZmZlcicgPyAnLCAnICsgYnVmZmVyQ291bnQgOiAnJztcclxuXHRcdFx0XHRjb25zdCBidWZmZXJBY2Nlc3NNb2RlID0gYnVmZmVyTm9kZS5pc1N0b3JhZ2VCdWZmZXJOb2RlID8gYHN0b3JhZ2UsICR7IHRoaXMuZ2V0U3RvcmFnZUFjY2VzcyggYnVmZmVyTm9kZSwgc2hhZGVyU3RhZ2UgKSB9YCA6ICd1bmlmb3JtJztcclxuXHJcblx0XHRcdFx0aWYgKCB0aGlzLmlzQ3VzdG9tU3RydWN0KCB1bmlmb3JtICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0YnVmZmVyU25pcHBldHMucHVzaCggYEBiaW5kaW5nKCAkeyB1bmlmb3JtSW5kZXhlcy5iaW5kaW5nICsrIH0gKSBAZ3JvdXAoICR7IHVuaWZvcm1JbmRleGVzLmdyb3VwIH0gKSB2YXI8JHsgYnVmZmVyQWNjZXNzTW9kZSB9PiAkeyB1bmlmb3JtLm5hbWUgfSA6ICR7IGJ1ZmZlclR5cGUgfTtgICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgYnVmZmVyVHlwZVNuaXBwZXQgPSBidWZmZXJOb2RlLmlzQXRvbWljID8gYGF0b21pYzwkeyBidWZmZXJUeXBlIH0+YCA6IGAkeyBidWZmZXJUeXBlIH1gO1xyXG5cdFx0XHRcdFx0Y29uc3QgYnVmZmVyU25pcHBldCA9IGBcXHR2YWx1ZSA6IGFycmF5PCAkeyBidWZmZXJUeXBlU25pcHBldCB9JHsgYnVmZmVyQ291bnRTbmlwcGV0IH0gPmA7XHJcblxyXG5cdFx0XHRcdFx0YnVmZmVyU25pcHBldHMucHVzaCggdGhpcy5fZ2V0V0dTTFN0cnVjdEJpbmRpbmcoIHVuaWZvcm0ubmFtZSwgYnVmZmVyU25pcHBldCwgYnVmZmVyQWNjZXNzTW9kZSwgdW5pZm9ybUluZGV4ZXMuYmluZGluZyArKywgdW5pZm9ybUluZGV4ZXMuZ3JvdXAgKSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRjb25zdCB2ZWN0b3JUeXBlID0gdGhpcy5nZXRUeXBlKCB0aGlzLmdldFZlY3RvclR5cGUoIHVuaWZvcm0udHlwZSApICk7XHJcblx0XHRcdFx0Y29uc3QgZ3JvdXBOYW1lID0gdW5pZm9ybS5ncm91cE5vZGUubmFtZTtcclxuXHJcblx0XHRcdFx0Y29uc3QgZ3JvdXAgPSB1bmlmb3JtR3JvdXBzWyBncm91cE5hbWUgXSB8fCAoIHVuaWZvcm1Hcm91cHNbIGdyb3VwTmFtZSBdID0ge1xyXG5cdFx0XHRcdFx0aW5kZXg6IHVuaWZvcm1JbmRleGVzLmJpbmRpbmcgKyssXHJcblx0XHRcdFx0XHRpZDogdW5pZm9ybUluZGV4ZXMuZ3JvdXAsXHJcblx0XHRcdFx0XHRzbmlwcGV0czogW11cclxuXHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRcdGdyb3VwLnNuaXBwZXRzLnB1c2goIGBcXHQkeyB1bmlmb3JtLm5hbWUgfSA6ICR7IHZlY3RvclR5cGUgfWAgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Zm9yICggY29uc3QgbmFtZSBpbiB1bmlmb3JtR3JvdXBzICkge1xyXG5cclxuXHRcdFx0Y29uc3QgZ3JvdXAgPSB1bmlmb3JtR3JvdXBzWyBuYW1lIF07XHJcblxyXG5cdFx0XHRzdHJ1Y3RTbmlwcGV0cy5wdXNoKCB0aGlzLl9nZXRXR1NMU3RydWN0QmluZGluZyggbmFtZSwgZ3JvdXAuc25pcHBldHMuam9pbiggJyxcXG4nICksICd1bmlmb3JtJywgZ3JvdXAuaW5kZXgsIGdyb3VwLmlkICkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0bGV0IGNvZGUgPSBiaW5kaW5nU25pcHBldHMuam9pbiggJ1xcbicgKTtcclxuXHRcdGNvZGUgKz0gYnVmZmVyU25pcHBldHMuam9pbiggJ1xcbicgKTtcclxuXHRcdGNvZGUgKz0gc3RydWN0U25pcHBldHMuam9pbiggJ1xcbicgKTtcclxuXHJcblx0XHRyZXR1cm4gY29kZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb250cm9scyB0aGUgY29kZSBidWlsZCBvZiB0aGUgc2hhZGVyIHN0YWdlcy5cclxuXHQgKi9cclxuXHRidWlsZENvZGUoKSB7XHJcblxyXG5cdFx0Y29uc3Qgc2hhZGVyc0RhdGEgPSB0aGlzLm1hdGVyaWFsICE9PSBudWxsID8geyBmcmFnbWVudDoge30sIHZlcnRleDoge30gfSA6IHsgY29tcHV0ZToge30gfTtcclxuXHJcblx0XHR0aGlzLnNvcnRCaW5kaW5nR3JvdXBzKCk7XHJcblxyXG5cdFx0Zm9yICggY29uc3Qgc2hhZGVyU3RhZ2UgaW4gc2hhZGVyc0RhdGEgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnNoYWRlclN0YWdlID0gc2hhZGVyU3RhZ2U7XHJcblxyXG5cdFx0XHRjb25zdCBzdGFnZURhdGEgPSBzaGFkZXJzRGF0YVsgc2hhZGVyU3RhZ2UgXTtcclxuXHRcdFx0c3RhZ2VEYXRhLnVuaWZvcm1zID0gdGhpcy5nZXRVbmlmb3Jtcyggc2hhZGVyU3RhZ2UgKTtcclxuXHRcdFx0c3RhZ2VEYXRhLmF0dHJpYnV0ZXMgPSB0aGlzLmdldEF0dHJpYnV0ZXMoIHNoYWRlclN0YWdlICk7XHJcblx0XHRcdHN0YWdlRGF0YS52YXJ5aW5ncyA9IHRoaXMuZ2V0VmFyeWluZ3MoIHNoYWRlclN0YWdlICk7XHJcblx0XHRcdHN0YWdlRGF0YS5zdHJ1Y3RzID0gdGhpcy5nZXRTdHJ1Y3RzKCBzaGFkZXJTdGFnZSApO1xyXG5cdFx0XHRzdGFnZURhdGEudmFycyA9IHRoaXMuZ2V0VmFycyggc2hhZGVyU3RhZ2UgKTtcclxuXHRcdFx0c3RhZ2VEYXRhLmNvZGVzID0gdGhpcy5nZXRDb2Rlcyggc2hhZGVyU3RhZ2UgKTtcclxuXHRcdFx0c3RhZ2VEYXRhLmRpcmVjdGl2ZXMgPSB0aGlzLmdldERpcmVjdGl2ZXMoIHNoYWRlclN0YWdlICk7XHJcblx0XHRcdHN0YWdlRGF0YS5zY29wZWRBcnJheXMgPSB0aGlzLmdldFNjb3BlZEFycmF5cyggc2hhZGVyU3RhZ2UgKTtcclxuXHJcblx0XHRcdC8vXHJcblxyXG5cdFx0XHRsZXQgZmxvdyA9ICcvLyBjb2RlXFxuXFxuJztcclxuXHRcdFx0ZmxvdyArPSB0aGlzLmZsb3dDb2RlWyBzaGFkZXJTdGFnZSBdO1xyXG5cclxuXHRcdFx0Y29uc3QgZmxvd05vZGVzID0gdGhpcy5mbG93Tm9kZXNbIHNoYWRlclN0YWdlIF07XHJcblx0XHRcdGNvbnN0IG1haW5Ob2RlID0gZmxvd05vZGVzWyBmbG93Tm9kZXMubGVuZ3RoIC0gMSBdO1xyXG5cclxuXHRcdFx0Y29uc3Qgb3V0cHV0Tm9kZSA9IG1haW5Ob2RlLm91dHB1dE5vZGU7XHJcblx0XHRcdGNvbnN0IGlzT3V0cHV0U3RydWN0ID0gKCBvdXRwdXROb2RlICE9PSB1bmRlZmluZWQgJiYgb3V0cHV0Tm9kZS5pc091dHB1dFN0cnVjdE5vZGUgPT09IHRydWUgKTtcclxuXHJcblx0XHRcdGZvciAoIGNvbnN0IG5vZGUgb2YgZmxvd05vZGVzICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBmbG93U2xvdERhdGEgPSB0aGlzLmdldEZsb3dEYXRhKCBub2RlLyosIHNoYWRlclN0YWdlKi8gKTtcclxuXHRcdFx0XHRjb25zdCBzbG90TmFtZSA9IG5vZGUubmFtZTtcclxuXHJcblx0XHRcdFx0aWYgKCBzbG90TmFtZSApIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGZsb3cubGVuZ3RoID4gMCApIGZsb3cgKz0gJ1xcbic7XHJcblxyXG5cdFx0XHRcdFx0ZmxvdyArPSBgXFx0Ly8gZmxvdyAtPiAkeyBzbG90TmFtZSB9XFxuYDtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRmbG93ICs9IGAkeyBmbG93U2xvdERhdGEuY29kZSB9XFxuXFx0YDtcclxuXHJcblx0XHRcdFx0aWYgKCBub2RlID09PSBtYWluTm9kZSAmJiBzaGFkZXJTdGFnZSAhPT0gJ2NvbXB1dGUnICkge1xyXG5cclxuXHRcdFx0XHRcdGZsb3cgKz0gJy8vIHJlc3VsdFxcblxcblxcdCc7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBzaGFkZXJTdGFnZSA9PT0gJ3ZlcnRleCcgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRmbG93ICs9IGB2YXJ5aW5ncy5WZXJ0ZXggPSAkeyBmbG93U2xvdERhdGEucmVzdWx0IH07YDtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKCBzaGFkZXJTdGFnZSA9PT0gJ2ZyYWdtZW50JyApIHtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggaXNPdXRwdXRTdHJ1Y3QgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdHN0YWdlRGF0YS5yZXR1cm5UeXBlID0gb3V0cHV0Tm9kZS5nZXROb2RlVHlwZSggdGhpcyApO1xyXG5cdFx0XHRcdFx0XHRcdHN0YWdlRGF0YS5zdHJ1Y3RzICs9ICd2YXI8cHJpdmF0ZT4gb3V0cHV0IDogJyArIHN0YWdlRGF0YS5yZXR1cm5UeXBlICsgJzsnO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRmbG93ICs9IGByZXR1cm4gJHsgZmxvd1Nsb3REYXRhLnJlc3VsdCB9O2A7XHJcblxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRsZXQgc3RydWN0U25pcHBldCA9ICdcXHRAbG9jYXRpb24oMCkgY29sb3I6IHZlYzQ8ZjMyPic7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGJ1aWx0aW5zID0gdGhpcy5nZXRCdWlsdGlucyggJ291dHB1dCcgKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKCBidWlsdGlucyApIHN0cnVjdFNuaXBwZXQgKz0gJyxcXG5cXHQnICsgYnVpbHRpbnM7XHJcblxyXG5cdFx0XHRcdFx0XHRcdHN0YWdlRGF0YS5yZXR1cm5UeXBlID0gJ091dHB1dFN0cnVjdCc7XHJcblx0XHRcdFx0XHRcdFx0c3RhZ2VEYXRhLnN0cnVjdHMgKz0gdGhpcy5fZ2V0V0dTTFN0cnVjdCggJ091dHB1dFN0cnVjdCcsIHN0cnVjdFNuaXBwZXQgKTtcclxuXHRcdFx0XHRcdFx0XHRzdGFnZURhdGEuc3RydWN0cyArPSAnXFxudmFyPHByaXZhdGU+IG91dHB1dCA6IE91dHB1dFN0cnVjdDsnO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRmbG93ICs9IGBvdXRwdXQuY29sb3IgPSAkeyBmbG93U2xvdERhdGEucmVzdWx0IH07XFxuXFxuXFx0cmV0dXJuIG91dHB1dDtgO1xyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0c3RhZ2VEYXRhLmZsb3cgPSBmbG93O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnNoYWRlclN0YWdlID0gbnVsbDtcclxuXHJcblx0XHRpZiAoIHRoaXMubWF0ZXJpYWwgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnZlcnRleFNoYWRlciA9IHRoaXMuX2dldFdHU0xWZXJ0ZXhDb2RlKCBzaGFkZXJzRGF0YS52ZXJ0ZXggKTtcclxuXHRcdFx0dGhpcy5mcmFnbWVudFNoYWRlciA9IHRoaXMuX2dldFdHU0xGcmFnbWVudENvZGUoIHNoYWRlcnNEYXRhLmZyYWdtZW50ICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHRoaXMuY29tcHV0ZVNoYWRlciA9IHRoaXMuX2dldFdHU0xDb21wdXRlQ29kZSggc2hhZGVyc0RhdGEuY29tcHV0ZSwgKCB0aGlzLm9iamVjdC53b3JrZ3JvdXBTaXplIHx8IFsgNjQgXSApLmpvaW4oICcsICcgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBuYXRpdmUgc2hhZGVyIG1ldGhvZCBuYW1lIGZvciBhIGdpdmVuIGdlbmVyaWMgbmFtZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2QgLSBUaGUgbWV0aG9kIG5hbWUgdG8gcmVzb2x2ZS5cclxuXHQgKiBAcGFyYW0gez9zdHJpbmd9IFtvdXRwdXQ9bnVsbF0gLSBBbiBvcHRpb25hbCBvdXRwdXQuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgcmVzb2x2ZWQgV0dTTCBtZXRob2QgbmFtZS5cclxuXHQgKi9cclxuXHRnZXRNZXRob2QoIG1ldGhvZCwgb3V0cHV0ID0gbnVsbCApIHtcclxuXHJcblx0XHRsZXQgd2dzbE1ldGhvZDtcclxuXHJcblx0XHRpZiAoIG91dHB1dCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHdnc2xNZXRob2QgPSB0aGlzLl9nZXRXR1NMTWV0aG9kKCBtZXRob2QgKyAnXycgKyBvdXRwdXQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB3Z3NsTWV0aG9kID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHR3Z3NsTWV0aG9kID0gdGhpcy5fZ2V0V0dTTE1ldGhvZCggbWV0aG9kICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB3Z3NsTWV0aG9kIHx8IG1ldGhvZDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBXR1NMIHR5cGUgb2YgdGhlIGdpdmVuIG5vZGUgZGF0YSB0eXBlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBUaGUgbm9kZSBkYXRhIHR5cGUuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgV0dTTCB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldFR5cGUoIHR5cGUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHdnc2xUeXBlTGliWyB0eXBlIF0gfHwgdHlwZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBXaGV0aGVyIHRoZSByZXF1ZXN0ZWQgZmVhdHVyZSBpcyBhdmFpbGFibGUgb3Igbm90LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgcmVxdWVzdGVkIGZlYXR1cmUuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgcmVxdWVzdGVkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIG9yIG5vdC5cclxuXHQgKi9cclxuXHRpc0F2YWlsYWJsZSggbmFtZSApIHtcclxuXHJcblx0XHRsZXQgcmVzdWx0ID0gc3VwcG9ydHNbIG5hbWUgXTtcclxuXHJcblx0XHRpZiAoIHJlc3VsdCA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0aWYgKCBuYW1lID09PSAnZmxvYXQzMkZpbHRlcmFibGUnICkge1xyXG5cclxuXHRcdFx0XHRyZXN1bHQgPSB0aGlzLnJlbmRlcmVyLmhhc0ZlYXR1cmUoICdmbG9hdDMyLWZpbHRlcmFibGUnICk7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBuYW1lID09PSAnY2xpcERpc3RhbmNlJyApIHtcclxuXHJcblx0XHRcdFx0cmVzdWx0ID0gdGhpcy5yZW5kZXJlci5oYXNGZWF0dXJlKCAnY2xpcC1kaXN0YW5jZXMnICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRzdXBwb3J0c1sgbmFtZSBdID0gcmVzdWx0O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIG5hdGl2ZSBzaGFkZXIgbWV0aG9kIG5hbWUgZm9yIGEgZ2l2ZW4gZ2VuZXJpYyBuYW1lLlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kIC0gVGhlIG1ldGhvZCBuYW1lIHRvIHJlc29sdmUuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgcmVzb2x2ZWQgV0dTTCBtZXRob2QgbmFtZS5cclxuXHQgKi9cclxuXHRfZ2V0V0dTTE1ldGhvZCggbWV0aG9kICkge1xyXG5cclxuXHRcdGlmICggd2dzbFBvbHlmaWxsWyBtZXRob2QgXSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0dGhpcy5faW5jbHVkZSggbWV0aG9kICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB3Z3NsTWV0aG9kc1sgbWV0aG9kIF07XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW5jbHVkZXMgdGhlIGdpdmVuIG1ldGhvZCBuYW1lIGludG8gdGhlIGN1cnJlbnRcclxuXHQgKiBmdW5jdGlvbiBub2RlLlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBtZXRob2QgbmFtZSB0byBpbmNsdWRlLlxyXG5cdCAqIEByZXR1cm4ge0NvZGVOb2RlfSBUaGUgcmVzcGVjdGl2ZSBjb2RlIG5vZGUuXHJcblx0ICovXHJcblx0X2luY2x1ZGUoIG5hbWUgKSB7XHJcblxyXG5cdFx0Y29uc3QgY29kZU5vZGUgPSB3Z3NsUG9seWZpbGxbIG5hbWUgXTtcclxuXHRcdGNvZGVOb2RlLmJ1aWxkKCB0aGlzICk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmN1cnJlbnRGdW5jdGlvbk5vZGUgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmN1cnJlbnRGdW5jdGlvbk5vZGUuaW5jbHVkZXMucHVzaCggY29kZU5vZGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGNvZGVOb2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBXR1NMIHZlcnRleCBzaGFkZXIgYmFzZWQgb24gdGhlIGdpdmVuIHNoYWRlciBkYXRhLlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gc2hhZGVyRGF0YSAtIFRoZSBzaGFkZXIgZGF0YS5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB2ZXJ0ZXggc2hhZGVyLlxyXG5cdCAqL1xyXG5cdF9nZXRXR1NMVmVydGV4Q29kZSggc2hhZGVyRGF0YSApIHtcclxuXHJcblx0XHRyZXR1cm4gYCR7IHRoaXMuZ2V0U2lnbmF0dXJlKCkgfVxyXG4vLyBkaXJlY3RpdmVzXHJcbiR7c2hhZGVyRGF0YS5kaXJlY3RpdmVzfVxyXG5cclxuLy8gc3RydWN0c1xyXG4ke3NoYWRlckRhdGEuc3RydWN0c31cclxuXHJcbi8vIHVuaWZvcm1zXHJcbiR7c2hhZGVyRGF0YS51bmlmb3Jtc31cclxuXHJcbi8vIHZhcnlpbmdzXHJcbiR7c2hhZGVyRGF0YS52YXJ5aW5nc31cclxudmFyPHByaXZhdGU+IHZhcnlpbmdzIDogVmFyeWluZ3NTdHJ1Y3Q7XHJcblxyXG4vLyBjb2Rlc1xyXG4ke3NoYWRlckRhdGEuY29kZXN9XHJcblxyXG5AdmVydGV4XHJcbmZuIG1haW4oICR7c2hhZGVyRGF0YS5hdHRyaWJ1dGVzfSApIC0+IFZhcnlpbmdzU3RydWN0IHtcclxuXHJcblx0Ly8gdmFyc1xyXG5cdCR7c2hhZGVyRGF0YS52YXJzfVxyXG5cclxuXHQvLyBmbG93XHJcblx0JHtzaGFkZXJEYXRhLmZsb3d9XHJcblxyXG5cdHJldHVybiB2YXJ5aW5ncztcclxuXHJcbn1cclxuYDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgV0dTTCBmcmFnbWVudCBzaGFkZXIgYmFzZWQgb24gdGhlIGdpdmVuIHNoYWRlciBkYXRhLlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gc2hhZGVyRGF0YSAtIFRoZSBzaGFkZXIgZGF0YS5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB2ZXJ0ZXggc2hhZGVyLlxyXG5cdCAqL1xyXG5cdF9nZXRXR1NMRnJhZ21lbnRDb2RlKCBzaGFkZXJEYXRhICkge1xyXG5cclxuXHRcdHJldHVybiBgJHsgdGhpcy5nZXRTaWduYXR1cmUoKSB9XHJcbi8vIGdsb2JhbFxyXG4keyBkaWFnbm9zdGljcyB9XHJcblxyXG4vLyBzdHJ1Y3RzXHJcbiR7c2hhZGVyRGF0YS5zdHJ1Y3RzfVxyXG5cclxuLy8gdW5pZm9ybXNcclxuJHtzaGFkZXJEYXRhLnVuaWZvcm1zfVxyXG5cclxuLy8gY29kZXNcclxuJHtzaGFkZXJEYXRhLmNvZGVzfVxyXG5cclxuQGZyYWdtZW50XHJcbmZuIG1haW4oICR7c2hhZGVyRGF0YS52YXJ5aW5nc30gKSAtPiAke3NoYWRlckRhdGEucmV0dXJuVHlwZX0ge1xyXG5cclxuXHQvLyB2YXJzXHJcblx0JHtzaGFkZXJEYXRhLnZhcnN9XHJcblxyXG5cdC8vIGZsb3dcclxuXHQke3NoYWRlckRhdGEuZmxvd31cclxuXHJcbn1cclxuYDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgV0dTTCBjb21wdXRlIHNoYWRlciBiYXNlZCBvbiB0aGUgZ2l2ZW4gc2hhZGVyIGRhdGEuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBzaGFkZXJEYXRhIC0gVGhlIHNoYWRlciBkYXRhLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB3b3JrZ3JvdXBTaXplIC0gVGhlIHdvcmtncm91cCBzaXplLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHZlcnRleCBzaGFkZXIuXHJcblx0ICovXHJcblx0X2dldFdHU0xDb21wdXRlQ29kZSggc2hhZGVyRGF0YSwgd29ya2dyb3VwU2l6ZSApIHtcclxuXHJcblx0XHRyZXR1cm4gYCR7IHRoaXMuZ2V0U2lnbmF0dXJlKCkgfVxyXG4vLyBkaXJlY3RpdmVzXHJcbiR7c2hhZGVyRGF0YS5kaXJlY3RpdmVzfVxyXG5cclxuLy8gc3lzdGVtXHJcbnZhcjxwcml2YXRlPiBpbnN0YW5jZUluZGV4IDogdTMyO1xyXG5cclxuLy8gbG9jYWxzXHJcbiR7c2hhZGVyRGF0YS5zY29wZWRBcnJheXN9XHJcblxyXG4vLyBzdHJ1Y3RzXHJcbiR7c2hhZGVyRGF0YS5zdHJ1Y3RzfVxyXG5cclxuLy8gdW5pZm9ybXNcclxuJHtzaGFkZXJEYXRhLnVuaWZvcm1zfVxyXG5cclxuLy8gY29kZXNcclxuJHtzaGFkZXJEYXRhLmNvZGVzfVxyXG5cclxuQGNvbXB1dGUgQHdvcmtncm91cF9zaXplKCAke3dvcmtncm91cFNpemV9IClcclxuZm4gbWFpbiggJHtzaGFkZXJEYXRhLmF0dHJpYnV0ZXN9ICkge1xyXG5cclxuXHQvLyBzeXN0ZW1cclxuXHRpbnN0YW5jZUluZGV4ID0gZ2xvYmFsSWQueCArIGdsb2JhbElkLnkgKiBudW1Xb3JrZ3JvdXBzLnggKiB1MzIoJHt3b3JrZ3JvdXBTaXplfSkgKyBnbG9iYWxJZC56ICogbnVtV29ya2dyb3Vwcy54ICogbnVtV29ya2dyb3Vwcy55ICogdTMyKCR7d29ya2dyb3VwU2l6ZX0pO1xyXG5cclxuXHQvLyB2YXJzXHJcblx0JHtzaGFkZXJEYXRhLnZhcnN9XHJcblxyXG5cdC8vIGZsb3dcclxuXHQke3NoYWRlckRhdGEuZmxvd31cclxuXHJcbn1cclxuYDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgV0dTTCBzdHJ1Y3QgYmFzZWQgb24gdGhlIGdpdmVuIG5hbWUgYW5kIHZhcmlhYmxlcy5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgc3RydWN0IG5hbWUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHZhcnMgLSBUaGUgc3RydWN0IHZhcmlhYmxlcy5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBXR1NMIHNuaXBwZXQgcmVwcmVzZW50aW5nIGEgc3RydWN0LlxyXG5cdCAqL1xyXG5cdF9nZXRXR1NMU3RydWN0KCBuYW1lLCB2YXJzICkge1xyXG5cclxuXHRcdHJldHVybiBgXHJcbnN0cnVjdCAke25hbWV9IHtcclxuJHt2YXJzfVxyXG59O2A7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIFdHU0wgc3RydWN0IGJpbmRpbmcuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIHN0cnVjdCBuYW1lLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB2YXJzIC0gVGhlIHN0cnVjdCB2YXJpYWJsZXMuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGFjY2VzcyAtIFRoZSBhY2Nlc3MuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtiaW5kaW5nPTBdIC0gVGhlIGJpbmRpbmcgaW5kZXguXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtncm91cD0wXSAtIFRoZSBncm91cCBpbmRleC5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBXR1NMIHNuaXBwZXQgcmVwcmVzZW50aW5nIGEgc3RydWN0IGJpbmRpbmcuXHJcblx0ICovXHJcblx0X2dldFdHU0xTdHJ1Y3RCaW5kaW5nKCBuYW1lLCB2YXJzLCBhY2Nlc3MsIGJpbmRpbmcgPSAwLCBncm91cCA9IDAgKSB7XHJcblxyXG5cdFx0Y29uc3Qgc3RydWN0TmFtZSA9IG5hbWUgKyAnU3RydWN0JztcclxuXHRcdGNvbnN0IHN0cnVjdFNuaXBwZXQgPSB0aGlzLl9nZXRXR1NMU3RydWN0KCBzdHJ1Y3ROYW1lLCB2YXJzICk7XHJcblxyXG5cdFx0cmV0dXJuIGAke3N0cnVjdFNuaXBwZXR9XHJcbkBiaW5kaW5nKCAkeyBiaW5kaW5nIH0gKSBAZ3JvdXAoICR7IGdyb3VwIH0gKVxyXG52YXI8JHthY2Nlc3N9PiAkeyBuYW1lIH0gOiAkeyBzdHJ1Y3ROYW1lIH07YDtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgV0dTTE5vZGVCdWlsZGVyO1xyXG4iLCJpbXBvcnQgeyBIYWxmRmxvYXRUeXBlLCBVbnNpZ25lZEJ5dGVUeXBlIH0gZnJvbSAnLi4vLi4vLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgR1BVUHJpbWl0aXZlVG9wb2xvZ3ksIEdQVVRleHR1cmVGb3JtYXQgfSBmcm9tICcuL1dlYkdQVUNvbnN0YW50cy5qcyc7XHJcblxyXG4vKipcclxuICogQSBXZWJHUFUgYmFja2VuZCB1dGlsaXR5IG1vZHVsZSB3aXRoIGNvbW1vbiBoZWxwZXJzLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuY2xhc3MgV2ViR1BVVXRpbHMge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHV0aWxpdHkgb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHUFVCYWNrZW5kfSBiYWNrZW5kIC0gVGhlIFdlYkdQVSBiYWNrZW5kLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBiYWNrZW5kICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIFdlYkdQVSBiYWNrZW5kLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtXZWJHUFVCYWNrZW5kfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJhY2tlbmQgPSBiYWNrZW5kO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGRlcHRoL3N0ZW5jaWwgR1BVIGZvcm1hdCBmb3IgdGhlIGdpdmVuIHJlbmRlciBjb250ZXh0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSZW5kZXJDb250ZXh0fSByZW5kZXJDb250ZXh0IC0gVGhlIHJlbmRlciBjb250ZXh0LlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGRlcHRoL3N0ZW5jaWwgR1BVIHRleHR1cmUgZm9ybWF0LlxyXG5cdCAqL1xyXG5cdGdldEN1cnJlbnREZXB0aFN0ZW5jaWxGb3JtYXQoIHJlbmRlckNvbnRleHQgKSB7XHJcblxyXG5cdFx0bGV0IGZvcm1hdDtcclxuXHJcblx0XHRpZiAoIHJlbmRlckNvbnRleHQuZGVwdGhUZXh0dXJlICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0Zm9ybWF0ID0gdGhpcy5nZXRUZXh0dXJlRm9ybWF0R1BVKCByZW5kZXJDb250ZXh0LmRlcHRoVGV4dHVyZSApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHJlbmRlckNvbnRleHQuZGVwdGggJiYgcmVuZGVyQ29udGV4dC5zdGVuY2lsICkge1xyXG5cclxuXHRcdFx0Zm9ybWF0ID0gR1BVVGV4dHVyZUZvcm1hdC5EZXB0aDI0UGx1c1N0ZW5jaWw4O1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHJlbmRlckNvbnRleHQuZGVwdGggKSB7XHJcblxyXG5cdFx0XHRmb3JtYXQgPSBHUFVUZXh0dXJlRm9ybWF0LkRlcHRoMjRQbHVzO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZm9ybWF0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIEdQVSBmb3JtYXQgZm9yIHRoZSBnaXZlbiB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgR1BVIHRleHR1cmUgZm9ybWF0LlxyXG5cdCAqL1xyXG5cdGdldFRleHR1cmVGb3JtYXRHUFUoIHRleHR1cmUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuYmFja2VuZC5nZXQoIHRleHR1cmUgKS5mb3JtYXQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhbiBvYmplY3QgdGhhdCBkZWZpbmVzIHRoZSBtdWx0aS1zYW1wbGluZyBzdGF0ZSBvZiB0aGUgZ2l2ZW4gdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdH0gVGhlIG11bHRpLXNhbXBsaW5nIHN0YXRlLlxyXG5cdCAqL1xyXG5cdGdldFRleHR1cmVTYW1wbGVEYXRhKCB0ZXh0dXJlICkge1xyXG5cclxuXHRcdGxldCBzYW1wbGVzO1xyXG5cclxuXHRcdGlmICggdGV4dHVyZS5pc0ZyYW1lYnVmZmVyVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdHNhbXBsZXMgPSAxO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHRleHR1cmUuaXNEZXB0aFRleHR1cmUgJiYgISB0ZXh0dXJlLnJlbmRlclRhcmdldCApIHtcclxuXHJcblx0XHRcdGNvbnN0IHJlbmRlcmVyID0gdGhpcy5iYWNrZW5kLnJlbmRlcmVyO1xyXG5cdFx0XHRjb25zdCByZW5kZXJUYXJnZXQgPSByZW5kZXJlci5nZXRSZW5kZXJUYXJnZXQoKTtcclxuXHJcblx0XHRcdHNhbXBsZXMgPSByZW5kZXJUYXJnZXQgPyByZW5kZXJUYXJnZXQuc2FtcGxlcyA6IHJlbmRlcmVyLnNhbXBsZXM7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggdGV4dHVyZS5yZW5kZXJUYXJnZXQgKSB7XHJcblxyXG5cdFx0XHRzYW1wbGVzID0gdGV4dHVyZS5yZW5kZXJUYXJnZXQuc2FtcGxlcztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0c2FtcGxlcyA9IHNhbXBsZXMgfHwgMTtcclxuXHJcblx0XHRjb25zdCBpc01TQUEgPSBzYW1wbGVzID4gMSAmJiB0ZXh0dXJlLnJlbmRlclRhcmdldCAhPT0gbnVsbCAmJiAoIHRleHR1cmUuaXNEZXB0aFRleHR1cmUgIT09IHRydWUgJiYgdGV4dHVyZS5pc0ZyYW1lYnVmZmVyVGV4dHVyZSAhPT0gdHJ1ZSApO1xyXG5cdFx0Y29uc3QgcHJpbWFyeVNhbXBsZXMgPSBpc01TQUEgPyAxIDogc2FtcGxlcztcclxuXHJcblx0XHRyZXR1cm4geyBzYW1wbGVzLCBwcmltYXJ5U2FtcGxlcywgaXNNU0FBIH07XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgZGVmYXVsdCBjb2xvciBhdHRhY2htZW50J3MgR1BVIGZvcm1hdCBvZiB0aGUgY3VycmVudCByZW5kZXIgY29udGV4dC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyQ29udGV4dH0gcmVuZGVyQ29udGV4dCAtIFRoZSByZW5kZXIgY29udGV4dC5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBHUFUgdGV4dHVyZSBmb3JtYXQgb2YgdGhlIGRlZmF1bHQgY29sb3IgYXR0YWNobWVudC5cclxuXHQgKi9cclxuXHRnZXRDdXJyZW50Q29sb3JGb3JtYXQoIHJlbmRlckNvbnRleHQgKSB7XHJcblxyXG5cdFx0bGV0IGZvcm1hdDtcclxuXHJcblx0XHRpZiAoIHJlbmRlckNvbnRleHQudGV4dHVyZXMgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRmb3JtYXQgPSB0aGlzLmdldFRleHR1cmVGb3JtYXRHUFUoIHJlbmRlckNvbnRleHQudGV4dHVyZXNbIDAgXSApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRmb3JtYXQgPSB0aGlzLmdldFByZWZlcnJlZENhbnZhc0Zvcm1hdCgpOyAvLyBkZWZhdWx0IGNvbnRleHQgZm9ybWF0XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBmb3JtYXQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgb3V0cHV0IGNvbG9yIHNwYWNlIG9mIHRoZSBjdXJyZW50IHJlbmRlciBjb250ZXh0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSZW5kZXJDb250ZXh0fSByZW5kZXJDb250ZXh0IC0gVGhlIHJlbmRlciBjb250ZXh0LlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG91dHB1dCBjb2xvciBzcGFjZS5cclxuXHQgKi9cclxuXHRnZXRDdXJyZW50Q29sb3JTcGFjZSggcmVuZGVyQ29udGV4dCApIHtcclxuXHJcblx0XHRpZiAoIHJlbmRlckNvbnRleHQudGV4dHVyZXMgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gcmVuZGVyQ29udGV4dC50ZXh0dXJlc1sgMCBdLmNvbG9yU3BhY2U7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzLmJhY2tlbmQucmVuZGVyZXIub3V0cHV0Q29sb3JTcGFjZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIEdQVSBwcmltaXRpdmUgdG9wb2xvZ3kgZm9yIHRoZSBnaXZlbiBvYmplY3QgYW5kIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3QzRH0gb2JqZWN0IC0gVGhlIDNEIG9iamVjdC5cclxuXHQgKiBAcGFyYW0ge01hdGVyaWFsfSBtYXRlcmlhbCAtIFRoZSBtYXRlcmlhbC5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBHUFUgcHJpbWl0aXZlIHRvcG9sb2d5LlxyXG5cdCAqL1xyXG5cdGdldFByaW1pdGl2ZVRvcG9sb2d5KCBvYmplY3QsIG1hdGVyaWFsICkge1xyXG5cclxuXHRcdGlmICggb2JqZWN0LmlzUG9pbnRzICkgcmV0dXJuIEdQVVByaW1pdGl2ZVRvcG9sb2d5LlBvaW50TGlzdDtcclxuXHRcdGVsc2UgaWYgKCBvYmplY3QuaXNMaW5lU2VnbWVudHMgfHwgKCBvYmplY3QuaXNNZXNoICYmIG1hdGVyaWFsLndpcmVmcmFtZSA9PT0gdHJ1ZSApICkgcmV0dXJuIEdQVVByaW1pdGl2ZVRvcG9sb2d5LkxpbmVMaXN0O1xyXG5cdFx0ZWxzZSBpZiAoIG9iamVjdC5pc0xpbmUgKSByZXR1cm4gR1BVUHJpbWl0aXZlVG9wb2xvZ3kuTGluZVN0cmlwO1xyXG5cdFx0ZWxzZSBpZiAoIG9iamVjdC5pc01lc2ggKSByZXR1cm4gR1BVUHJpbWl0aXZlVG9wb2xvZ3kuVHJpYW5nbGVMaXN0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBtb2RpZmllZCBzYW1wbGUgY291bnQgZnJvbSB0aGUgZ2l2ZW4gc2FtcGxlIGNvdW50IHZhbHVlLlxyXG5cdCAqXHJcblx0ICogVGhhdCBpcyByZXF1aXJlZCBzaW5jZSBXZWJHUFUgZG9lcyBub3Qgc3VwcG9ydCBhcmJpdHJhcnkgc2FtcGxlIGNvdW50cy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzYW1wbGVDb3VudCAtIFRoZSBpbnB1dCBzYW1wbGUgY291bnQuXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgKHBvdGVudGlhbGx5IHVwZGF0ZWQpIG91dHB1dCBzYW1wbGUgY291bnQuXHJcblx0ICovXHJcblx0Z2V0U2FtcGxlQ291bnQoIHNhbXBsZUNvdW50ICkge1xyXG5cclxuXHRcdGxldCBjb3VudCA9IDE7XHJcblxyXG5cdFx0aWYgKCBzYW1wbGVDb3VudCA+IDEgKSB7XHJcblxyXG5cdFx0XHQvLyBXZWJHUFUgb25seSBzdXBwb3J0cyBwb3dlci1vZi10d28gc2FtcGxlIGNvdW50cyBhbmQgMiBpcyBub3QgYSB2YWxpZCB2YWx1ZVxyXG5cdFx0XHRjb3VudCA9IE1hdGgucG93KCAyLCBNYXRoLmZsb29yKCBNYXRoLmxvZzIoIHNhbXBsZUNvdW50ICkgKSApO1xyXG5cclxuXHRcdFx0aWYgKCBjb3VudCA9PT0gMiApIHtcclxuXHJcblx0XHRcdFx0Y291bnQgPSA0O1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gY291bnQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgc2FtcGxlIGNvdW50IG9mIHRoZSBnaXZlbiByZW5kZXIgY29udGV4dC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyQ29udGV4dH0gcmVuZGVyQ29udGV4dCAtIFRoZSByZW5kZXIgY29udGV4dC5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBzYW1wbGUgY291bnQuXHJcblx0ICovXHJcblx0Z2V0U2FtcGxlQ291bnRSZW5kZXJDb250ZXh0KCByZW5kZXJDb250ZXh0ICkge1xyXG5cclxuXHRcdGlmICggcmVuZGVyQ29udGV4dC50ZXh0dXJlcyAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHJldHVybiB0aGlzLmdldFNhbXBsZUNvdW50KCByZW5kZXJDb250ZXh0LnNhbXBsZUNvdW50ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzLmdldFNhbXBsZUNvdW50KCB0aGlzLmJhY2tlbmQucmVuZGVyZXIuc2FtcGxlcyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHByZWZlcnJlZCBjYW52YXMgZm9ybWF0LlxyXG5cdCAqXHJcblx0ICogVGhlcmUgaXMgYSBzZXBhcmF0ZSBtZXRob2QgZm9yIHRoaXMgc28gaXQncyBwb3NzaWJsZSB0b1xyXG5cdCAqIGhvbm9yIGVkZ2UgY2FzZXMgZm9yIHNwZWNpZmljIGRldmljZXMuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBHUFUgdGV4dHVyZSBmb3JtYXQgb2YgdGhlIGNhbnZhcy5cclxuXHQgKi9cclxuXHRnZXRQcmVmZXJyZWRDYW52YXNGb3JtYXQoKSB7XHJcblxyXG5cdFx0Y29uc3Qgb3V0cHV0VHlwZSA9IHRoaXMuYmFja2VuZC5wYXJhbWV0ZXJzLm91dHB1dFR5cGU7XHJcblxyXG5cdFx0aWYgKCBvdXRwdXRUeXBlID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gbmF2aWdhdG9yLmdwdS5nZXRQcmVmZXJyZWRDYW52YXNGb3JtYXQoKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBvdXRwdXRUeXBlID09PSBVbnNpZ25lZEJ5dGVUeXBlICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIEdQVVRleHR1cmVGb3JtYXQuQkdSQThVbm9ybTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBvdXRwdXRUeXBlID09PSBIYWxmRmxvYXRUeXBlICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIEdQVVRleHR1cmVGb3JtYXQuUkdCQTE2RmxvYXQ7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHRocm93IG5ldyBFcnJvciggJ1Vuc3VwcG9ydGVkIG91dHB1dFR5cGUnICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBXZWJHUFVVdGlscztcclxuIiwiaW1wb3J0IHsgR1BVSW5wdXRTdGVwTW9kZSB9IGZyb20gJy4vV2ViR1BVQ29uc3RhbnRzLmpzJztcclxuXHJcbmltcG9ydCB7IEZsb2F0MTZCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi8uLi8uLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcblxyXG5jb25zdCB0eXBlZEFycmF5c1RvVmVydGV4Rm9ybWF0UHJlZml4ID0gbmV3IE1hcCggW1xyXG5cdFsgSW50OEFycmF5LCBbICdzaW50OCcsICdzbm9ybTgnIF1dLFxyXG5cdFsgVWludDhBcnJheSwgWyAndWludDgnLCAndW5vcm04JyBdXSxcclxuXHRbIEludDE2QXJyYXksIFsgJ3NpbnQxNicsICdzbm9ybTE2JyBdXSxcclxuXHRbIFVpbnQxNkFycmF5LCBbICd1aW50MTYnLCAndW5vcm0xNicgXV0sXHJcblx0WyBJbnQzMkFycmF5LCBbICdzaW50MzInLCAnc25vcm0zMicgXV0sXHJcblx0WyBVaW50MzJBcnJheSwgWyAndWludDMyJywgJ3Vub3JtMzInIF1dLFxyXG5cdFsgRmxvYXQzMkFycmF5LCBbICdmbG9hdDMyJywgXV0sXHJcbl0gKTtcclxuXHJcbmNvbnN0IHR5cGVkQXR0cmlidXRlVG9WZXJ0ZXhGb3JtYXRQcmVmaXggPSBuZXcgTWFwKCBbXHJcblx0WyBGbG9hdDE2QnVmZmVyQXR0cmlidXRlLCBbICdmbG9hdDE2JywgXV0sXHJcbl0gKTtcclxuXHJcbmNvbnN0IHR5cGVBcnJheXNUb1ZlcnRleEZvcm1hdFByZWZpeEZvckl0ZW1TaXplMSA9IG5ldyBNYXAoIFtcclxuXHRbIEludDMyQXJyYXksICdzaW50MzInIF0sXHJcblx0WyBJbnQxNkFycmF5LCAnc2ludDMyJyBdLCAvLyBwYXRjaCBmb3IgSU5UMTZcclxuXHRbIFVpbnQzMkFycmF5LCAndWludDMyJyBdLFxyXG5cdFsgVWludDE2QXJyYXksICd1aW50MzInIF0sIC8vIHBhdGNoIGZvciBVSU5UMTZcclxuXHRbIEZsb2F0MzJBcnJheSwgJ2Zsb2F0MzInIF1cclxuXSApO1xyXG5cclxuLyoqXHJcbiAqIEEgV2ViR1BVIGJhY2tlbmQgdXRpbGl0eSBtb2R1bGUgZm9yIG1hbmFnaW5nIHNoYWRlciBhdHRyaWJ1dGVzLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuY2xhc3MgV2ViR1BVQXR0cmlidXRlVXRpbHMge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHV0aWxpdHkgb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHUFVCYWNrZW5kfSBiYWNrZW5kIC0gVGhlIFdlYkdQVSBiYWNrZW5kLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBiYWNrZW5kICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIFdlYkdQVSBiYWNrZW5kLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtXZWJHUFVCYWNrZW5kfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJhY2tlbmQgPSBiYWNrZW5kO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgdGhlIEdQVSBidWZmZXIgZm9yIHRoZSBnaXZlbiBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCdWZmZXJBdHRyaWJ1dGV9IGF0dHJpYnV0ZSAtIFRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqIEBwYXJhbSB7R1BVQnVmZmVyVXNhZ2V9IHVzYWdlIC0gQSBmbGFnIHRoYXQgaW5kaWNhdGVzIGhvdyB0aGUgYnVmZmVyIG1heSBiZSB1c2VkIGFmdGVyIGl0cyBjcmVhdGlvbi5cclxuXHQgKi9cclxuXHRjcmVhdGVBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgdXNhZ2UgKSB7XHJcblxyXG5cdFx0Y29uc3QgYnVmZmVyQXR0cmlidXRlID0gdGhpcy5fZ2V0QnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUgKTtcclxuXHJcblx0XHRjb25zdCBiYWNrZW5kID0gdGhpcy5iYWNrZW5kO1xyXG5cdFx0Y29uc3QgYnVmZmVyRGF0YSA9IGJhY2tlbmQuZ2V0KCBidWZmZXJBdHRyaWJ1dGUgKTtcclxuXHJcblx0XHRsZXQgYnVmZmVyID0gYnVmZmVyRGF0YS5idWZmZXI7XHJcblxyXG5cdFx0aWYgKCBidWZmZXIgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGRldmljZSA9IGJhY2tlbmQuZGV2aWNlO1xyXG5cclxuXHRcdFx0bGV0IGFycmF5ID0gYnVmZmVyQXR0cmlidXRlLmFycmF5O1xyXG5cclxuXHRcdFx0Ly8gcGF0Y2ggZm9yIElOVDE2IGFuZCBVSU5UMTZcclxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUubm9ybWFsaXplZCA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggYXJyYXkuY29uc3RydWN0b3IgPT09IEludDE2QXJyYXkgfHwgYXJyYXkuY29uc3RydWN0b3IgPT09IEludDhBcnJheSApIHtcclxuXHJcblx0XHRcdFx0XHRhcnJheSA9IG5ldyBJbnQzMkFycmF5KCBhcnJheSApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCBhcnJheS5jb25zdHJ1Y3RvciA9PT0gVWludDE2QXJyYXkgfHwgYXJyYXkuY29uc3RydWN0b3IgPT09IFVpbnQ4QXJyYXkgKSB7XHJcblxyXG5cdFx0XHRcdFx0YXJyYXkgPSBuZXcgVWludDMyQXJyYXkoIGFycmF5ICk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCB1c2FnZSAmIEdQVUJ1ZmZlclVzYWdlLklOREVYICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoIGFycmF5WyBpIF0gPT09IDB4ZmZmZiApIGFycmF5WyBpIF0gPSAweGZmZmZmZmZmOyAvLyB1c2UgY29ycmVjdCBwcmltaXRpdmUgcmVzdGFydCBpbmRleFxyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0YnVmZmVyQXR0cmlidXRlLmFycmF5ID0gYXJyYXk7XHJcblxyXG5cdFx0XHRpZiAoICggYnVmZmVyQXR0cmlidXRlLmlzU3RvcmFnZUJ1ZmZlckF0dHJpYnV0ZSB8fCBidWZmZXJBdHRyaWJ1dGUuaXNTdG9yYWdlSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlICkgJiYgYnVmZmVyQXR0cmlidXRlLml0ZW1TaXplID09PSAzICkge1xyXG5cclxuXHRcdFx0XHRhcnJheSA9IG5ldyBhcnJheS5jb25zdHJ1Y3RvciggYnVmZmVyQXR0cmlidXRlLmNvdW50ICogNCApO1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBidWZmZXJBdHRyaWJ1dGUuY291bnQ7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0YXJyYXkuc2V0KCBidWZmZXJBdHRyaWJ1dGUuYXJyYXkuc3ViYXJyYXkoIGkgKiAzLCBpICogMyArIDMgKSwgaSAqIDQgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyBVcGRhdGUgQnVmZmVyQXR0cmlidXRlXHJcblx0XHRcdFx0YnVmZmVyQXR0cmlidXRlLml0ZW1TaXplID0gNDtcclxuXHRcdFx0XHRidWZmZXJBdHRyaWJ1dGUuYXJyYXkgPSBhcnJheTtcclxuXHJcblx0XHRcdFx0YnVmZmVyRGF0YS5fZm9yY2UzdG80Qnl0ZXNBbGlnbm1lbnQgPSB0cnVlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3Qgc2l6ZSA9IGFycmF5LmJ5dGVMZW5ndGggKyAoICggNCAtICggYXJyYXkuYnl0ZUxlbmd0aCAlIDQgKSApICUgNCApOyAvLyBlbnN1cmUgNCBieXRlIGFsaWdubWVudCwgc2VlICMyMDQ0MVxyXG5cclxuXHRcdFx0YnVmZmVyID0gZGV2aWNlLmNyZWF0ZUJ1ZmZlcigge1xyXG5cdFx0XHRcdGxhYmVsOiBidWZmZXJBdHRyaWJ1dGUubmFtZSxcclxuXHRcdFx0XHRzaXplOiBzaXplLFxyXG5cdFx0XHRcdHVzYWdlOiB1c2FnZSxcclxuXHRcdFx0XHRtYXBwZWRBdENyZWF0aW9uOiB0cnVlXHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHRcdG5ldyBhcnJheS5jb25zdHJ1Y3RvciggYnVmZmVyLmdldE1hcHBlZFJhbmdlKCkgKS5zZXQoIGFycmF5ICk7XHJcblxyXG5cdFx0XHRidWZmZXIudW5tYXAoKTtcclxuXHJcblx0XHRcdGJ1ZmZlckRhdGEuYnVmZmVyID0gYnVmZmVyO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoZSBHUFUgYnVmZmVyIG9mIHRoZSBnaXZlbiBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCdWZmZXJBdHRyaWJ1dGV9IGF0dHJpYnV0ZSAtIFRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZUF0dHJpYnV0ZSggYXR0cmlidXRlICkge1xyXG5cclxuXHRcdGNvbnN0IGJ1ZmZlckF0dHJpYnV0ZSA9IHRoaXMuX2dldEJ1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlICk7XHJcblxyXG5cdFx0Y29uc3QgYmFja2VuZCA9IHRoaXMuYmFja2VuZDtcclxuXHRcdGNvbnN0IGRldmljZSA9IGJhY2tlbmQuZGV2aWNlO1xyXG5cclxuXHRcdGNvbnN0IGJ1ZmZlckRhdGEgPSBiYWNrZW5kLmdldCggYnVmZmVyQXR0cmlidXRlICk7XHJcblx0XHRjb25zdCBidWZmZXIgPSBiYWNrZW5kLmdldCggYnVmZmVyQXR0cmlidXRlICkuYnVmZmVyO1xyXG5cclxuXHRcdGxldCBhcnJheSA9IGJ1ZmZlckF0dHJpYnV0ZS5hcnJheTtcclxuXHJcblx0XHQvLyAgaWYgc3RvcmFnZSBidWZmZXIgZW5zdXJlIDQgYnl0ZSBhbGlnbm1lbnRcclxuXHRcdGlmICggYnVmZmVyRGF0YS5fZm9yY2UzdG80Qnl0ZXNBbGlnbm1lbnQgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRhcnJheSA9IG5ldyBhcnJheS5jb25zdHJ1Y3RvciggYnVmZmVyQXR0cmlidXRlLmNvdW50ICogNCApO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgYnVmZmVyQXR0cmlidXRlLmNvdW50OyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRhcnJheS5zZXQoIGJ1ZmZlckF0dHJpYnV0ZS5hcnJheS5zdWJhcnJheSggaSAqIDMsIGkgKiAzICsgMyApLCBpICogNCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0YnVmZmVyQXR0cmlidXRlLmFycmF5ID0gYXJyYXk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHJcblx0XHRjb25zdCBpc1R5cGVkQXJyYXkgPSB0aGlzLl9pc1R5cGVkQXJyYXkoIGFycmF5ICk7XHJcblx0XHRjb25zdCB1cGRhdGVSYW5nZXMgPSBidWZmZXJBdHRyaWJ1dGUudXBkYXRlUmFuZ2VzO1xyXG5cclxuXHRcdGlmICggdXBkYXRlUmFuZ2VzLmxlbmd0aCA9PT0gMCApIHtcclxuXHJcblx0XHRcdC8vIE5vdCB1c2luZyB1cGRhdGUgcmFuZ2VzXHJcblxyXG5cdFx0XHRkZXZpY2UucXVldWUud3JpdGVCdWZmZXIoXHJcblx0XHRcdFx0YnVmZmVyLFxyXG5cdFx0XHRcdDAsXHJcblx0XHRcdFx0YXJyYXksXHJcblx0XHRcdFx0MFxyXG5cdFx0XHQpO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRjb25zdCBieXRlT2Zmc2V0RmFjdG9yID0gaXNUeXBlZEFycmF5ID8gMSA6IGFycmF5LkJZVEVTX1BFUl9FTEVNRU5UO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gdXBkYXRlUmFuZ2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHJhbmdlID0gdXBkYXRlUmFuZ2VzWyBpIF07XHJcblx0XHRcdFx0bGV0IGRhdGFPZmZzZXQsIHNpemU7XHJcblxyXG5cdFx0XHRcdGlmICggYnVmZmVyRGF0YS5fZm9yY2UzdG80Qnl0ZXNBbGlnbm1lbnQgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgdmVydGV4U3RhcnQgPSBNYXRoLmZsb29yKCByYW5nZS5zdGFydCAvIDMgKTtcclxuXHRcdFx0XHRcdGNvbnN0IHZlcnRleENvdW50ID0gTWF0aC5jZWlsKCByYW5nZS5jb3VudCAvIDMgKTtcclxuXHRcdFx0XHRcdGRhdGFPZmZzZXQgPSB2ZXJ0ZXhTdGFydCAqIDQgKiBieXRlT2Zmc2V0RmFjdG9yO1xyXG5cdFx0XHRcdFx0c2l6ZSA9IHZlcnRleENvdW50ICogNCAqIGJ5dGVPZmZzZXRGYWN0b3I7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0ZGF0YU9mZnNldCA9IHJhbmdlLnN0YXJ0ICogYnl0ZU9mZnNldEZhY3RvcjtcclxuXHRcdFx0XHRcdHNpemUgPSByYW5nZS5jb3VudCAqIGJ5dGVPZmZzZXRGYWN0b3I7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Y29uc3QgYnVmZmVyT2Zmc2V0ID0gZGF0YU9mZnNldCAqICggaXNUeXBlZEFycmF5ID8gYXJyYXkuQllURVNfUEVSX0VMRU1FTlQgOiAxICk7IC8vIGJ1ZmZlck9mZnNldCBpcyBhbHdheXMgaW4gYnl0ZXNcclxuXHJcblx0XHRcdFx0ZGV2aWNlLnF1ZXVlLndyaXRlQnVmZmVyKFxyXG5cdFx0XHRcdFx0YnVmZmVyLFxyXG5cdFx0XHRcdFx0YnVmZmVyT2Zmc2V0LFxyXG5cdFx0XHRcdFx0YXJyYXksXHJcblx0XHRcdFx0XHRkYXRhT2Zmc2V0LFxyXG5cdFx0XHRcdFx0c2l6ZVxyXG5cdFx0XHRcdCk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRidWZmZXJBdHRyaWJ1dGUuY2xlYXJVcGRhdGVSYW5nZXMoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgY3JlYXRlcyB0aGUgdmVydGV4IGJ1ZmZlciBsYXlvdXQgZGF0YSB3aGljaCBhcmVcclxuXHQgKiByZXF1aXJlIHdoZW4gY3JlYXRpbmcgYSByZW5kZXIgcGlwZWxpbmUgZm9yIHRoZSBnaXZlbiByZW5kZXIgb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSZW5kZXJPYmplY3R9IHJlbmRlck9iamVjdCAtIFRoZSByZW5kZXIgb2JqZWN0LlxyXG5cdCAqIEByZXR1cm4ge0FycmF5PE9iamVjdD59IEFuIGFycmF5IGhvbGRpbmcgb2JqZWN0cyB3aGljaCBkZXNjcmliZSB0aGUgdmVydGV4IGJ1ZmZlciBsYXlvdXQuXHJcblx0ICovXHJcblx0Y3JlYXRlU2hhZGVyVmVydGV4QnVmZmVycyggcmVuZGVyT2JqZWN0ICkge1xyXG5cclxuXHRcdGNvbnN0IGF0dHJpYnV0ZXMgPSByZW5kZXJPYmplY3QuZ2V0QXR0cmlidXRlcygpO1xyXG5cdFx0Y29uc3QgdmVydGV4QnVmZmVycyA9IG5ldyBNYXAoKTtcclxuXHJcblx0XHRmb3IgKCBsZXQgc2xvdCA9IDA7IHNsb3QgPCBhdHRyaWJ1dGVzLmxlbmd0aDsgc2xvdCArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGdlb21ldHJ5QXR0cmlidXRlID0gYXR0cmlidXRlc1sgc2xvdCBdO1xyXG5cdFx0XHRjb25zdCBieXRlc1BlckVsZW1lbnQgPSBnZW9tZXRyeUF0dHJpYnV0ZS5hcnJheS5CWVRFU19QRVJfRUxFTUVOVDtcclxuXHRcdFx0Y29uc3QgYnVmZmVyQXR0cmlidXRlID0gdGhpcy5fZ2V0QnVmZmVyQXR0cmlidXRlKCBnZW9tZXRyeUF0dHJpYnV0ZSApO1xyXG5cclxuXHRcdFx0bGV0IHZlcnRleEJ1ZmZlckxheW91dCA9IHZlcnRleEJ1ZmZlcnMuZ2V0KCBidWZmZXJBdHRyaWJ1dGUgKTtcclxuXHJcblx0XHRcdGlmICggdmVydGV4QnVmZmVyTGF5b3V0ID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGxldCBhcnJheVN0cmlkZSwgc3RlcE1vZGU7XHJcblxyXG5cdFx0XHRcdGlmICggZ2VvbWV0cnlBdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0XHRhcnJheVN0cmlkZSA9IGdlb21ldHJ5QXR0cmlidXRlLmRhdGEuc3RyaWRlICogYnl0ZXNQZXJFbGVtZW50O1xyXG5cdFx0XHRcdFx0c3RlcE1vZGUgPSBnZW9tZXRyeUF0dHJpYnV0ZS5kYXRhLmlzSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIgPyBHUFVJbnB1dFN0ZXBNb2RlLkluc3RhbmNlIDogR1BVSW5wdXRTdGVwTW9kZS5WZXJ0ZXg7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0YXJyYXlTdHJpZGUgPSBnZW9tZXRyeUF0dHJpYnV0ZS5pdGVtU2l6ZSAqIGJ5dGVzUGVyRWxlbWVudDtcclxuXHRcdFx0XHRcdHN0ZXBNb2RlID0gZ2VvbWV0cnlBdHRyaWJ1dGUuaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUgPyBHUFVJbnB1dFN0ZXBNb2RlLkluc3RhbmNlIDogR1BVSW5wdXRTdGVwTW9kZS5WZXJ0ZXg7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Ly8gcGF0Y2ggZm9yIElOVDE2IGFuZCBVSU5UMTZcclxuXHRcdFx0XHRpZiAoIGdlb21ldHJ5QXR0cmlidXRlLm5vcm1hbGl6ZWQgPT09IGZhbHNlICYmICggZ2VvbWV0cnlBdHRyaWJ1dGUuYXJyYXkuY29uc3RydWN0b3IgPT09IEludDE2QXJyYXkgfHwgZ2VvbWV0cnlBdHRyaWJ1dGUuYXJyYXkuY29uc3RydWN0b3IgPT09IFVpbnQxNkFycmF5ICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0YXJyYXlTdHJpZGUgPSA0O1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHZlcnRleEJ1ZmZlckxheW91dCA9IHtcclxuXHRcdFx0XHRcdGFycmF5U3RyaWRlLFxyXG5cdFx0XHRcdFx0YXR0cmlidXRlczogW10sXHJcblx0XHRcdFx0XHRzdGVwTW9kZVxyXG5cdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdHZlcnRleEJ1ZmZlcnMuc2V0KCBidWZmZXJBdHRyaWJ1dGUsIHZlcnRleEJ1ZmZlckxheW91dCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgZm9ybWF0ID0gdGhpcy5fZ2V0VmVydGV4Rm9ybWF0KCBnZW9tZXRyeUF0dHJpYnV0ZSApO1xyXG5cdFx0XHRjb25zdCBvZmZzZXQgPSAoIGdlb21ldHJ5QXR0cmlidXRlLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgPT09IHRydWUgKSA/IGdlb21ldHJ5QXR0cmlidXRlLm9mZnNldCAqIGJ5dGVzUGVyRWxlbWVudCA6IDA7XHJcblxyXG5cdFx0XHR2ZXJ0ZXhCdWZmZXJMYXlvdXQuYXR0cmlidXRlcy5wdXNoKCB7XHJcblx0XHRcdFx0c2hhZGVyTG9jYXRpb246IHNsb3QsXHJcblx0XHRcdFx0b2Zmc2V0LFxyXG5cdFx0XHRcdGZvcm1hdFxyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBBcnJheS5mcm9tKCB2ZXJ0ZXhCdWZmZXJzLnZhbHVlcygpICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVzdHJveXMgdGhlIEdQVSBidWZmZXIgb2YgdGhlIGdpdmVuIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0J1ZmZlckF0dHJpYnV0ZX0gYXR0cmlidXRlIC0gVGhlIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICovXHJcblx0ZGVzdHJveUF0dHJpYnV0ZSggYXR0cmlidXRlICkge1xyXG5cclxuXHRcdGNvbnN0IGJhY2tlbmQgPSB0aGlzLmJhY2tlbmQ7XHJcblx0XHRjb25zdCBkYXRhID0gYmFja2VuZC5nZXQoIHRoaXMuX2dldEJ1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlICkgKTtcclxuXHJcblx0XHRkYXRhLmJ1ZmZlci5kZXN0cm95KCk7XHJcblxyXG5cdFx0YmFja2VuZC5kZWxldGUoIGF0dHJpYnV0ZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIHBlcmZvcm1zIGEgcmVhZGJhY2sgb3BlcmF0aW9uIGJ5IG1vdmluZyBidWZmZXIgZGF0YSBmcm9tXHJcblx0ICogYSBzdG9yYWdlIGJ1ZmZlciBhdHRyaWJ1dGUgZnJvbSB0aGUgR1BVIHRvIHRoZSBDUFUuXHJcblx0ICpcclxuXHQgKiBAYXN5bmNcclxuXHQgKiBAcGFyYW0ge1N0b3JhZ2VCdWZmZXJBdHRyaWJ1dGV9IGF0dHJpYnV0ZSAtIFRoZSBzdG9yYWdlIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICogQHJldHVybiB7UHJvbWlzZTxBcnJheUJ1ZmZlcj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGJ1ZmZlciBkYXRhIHdoZW4gdGhlIGRhdGEgYXJlIHJlYWR5LlxyXG5cdCAqL1xyXG5cdGFzeW5jIGdldEFycmF5QnVmZmVyQXN5bmMoIGF0dHJpYnV0ZSApIHtcclxuXHJcblx0XHRjb25zdCBiYWNrZW5kID0gdGhpcy5iYWNrZW5kO1xyXG5cdFx0Y29uc3QgZGV2aWNlID0gYmFja2VuZC5kZXZpY2U7XHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IGJhY2tlbmQuZ2V0KCB0aGlzLl9nZXRCdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApICk7XHJcblx0XHRjb25zdCBidWZmZXJHUFUgPSBkYXRhLmJ1ZmZlcjtcclxuXHRcdGNvbnN0IHNpemUgPSBidWZmZXJHUFUuc2l6ZTtcclxuXHJcblx0XHRjb25zdCByZWFkQnVmZmVyR1BVID0gZGV2aWNlLmNyZWF0ZUJ1ZmZlcigge1xyXG5cdFx0XHRsYWJlbDogYCR7IGF0dHJpYnV0ZS5uYW1lIH1fcmVhZGJhY2tgLFxyXG5cdFx0XHRzaXplLFxyXG5cdFx0XHR1c2FnZTogR1BVQnVmZmVyVXNhZ2UuQ09QWV9EU1QgfCBHUFVCdWZmZXJVc2FnZS5NQVBfUkVBRFxyXG5cdFx0fSApO1xyXG5cclxuXHRcdGNvbnN0IGNtZEVuY29kZXIgPSBkZXZpY2UuY3JlYXRlQ29tbWFuZEVuY29kZXIoIHtcclxuXHRcdFx0bGFiZWw6IGByZWFkYmFja19lbmNvZGVyXyR7IGF0dHJpYnV0ZS5uYW1lIH1gXHJcblx0XHR9ICk7XHJcblxyXG5cdFx0Y21kRW5jb2Rlci5jb3B5QnVmZmVyVG9CdWZmZXIoXHJcblx0XHRcdGJ1ZmZlckdQVSxcclxuXHRcdFx0MCxcclxuXHRcdFx0cmVhZEJ1ZmZlckdQVSxcclxuXHRcdFx0MCxcclxuXHRcdFx0c2l6ZVxyXG5cdFx0KTtcclxuXHJcblx0XHRjb25zdCBncHVDb21tYW5kcyA9IGNtZEVuY29kZXIuZmluaXNoKCk7XHJcblx0XHRkZXZpY2UucXVldWUuc3VibWl0KCBbIGdwdUNvbW1hbmRzIF0gKTtcclxuXHJcblx0XHRhd2FpdCByZWFkQnVmZmVyR1BVLm1hcEFzeW5jKCBHUFVNYXBNb2RlLlJFQUQgKTtcclxuXHJcblx0XHRjb25zdCBhcnJheUJ1ZmZlciA9IHJlYWRCdWZmZXJHUFUuZ2V0TWFwcGVkUmFuZ2UoKTtcclxuXHJcblx0XHRjb25zdCBkc3RCdWZmZXIgPSBuZXcgYXR0cmlidXRlLmFycmF5LmNvbnN0cnVjdG9yKCBhcnJheUJ1ZmZlci5zbGljZSggMCApICk7XHJcblxyXG5cdFx0cmVhZEJ1ZmZlckdQVS51bm1hcCgpO1xyXG5cclxuXHRcdHJldHVybiBkc3RCdWZmZXIuYnVmZmVyO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHZlcnRleCBmb3JtYXQgb2YgdGhlIGdpdmVuIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyQXR0cmlidXRlfSBnZW9tZXRyeUF0dHJpYnV0ZSAtIFRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ3x1bmRlZmluZWR9IFRoZSB2ZXJ0ZXggZm9ybWF0IChlLmcuICdmbG9hdDMyeDMnKS5cclxuXHQgKi9cclxuXHRfZ2V0VmVydGV4Rm9ybWF0KCBnZW9tZXRyeUF0dHJpYnV0ZSApIHtcclxuXHJcblx0XHRjb25zdCB7IGl0ZW1TaXplLCBub3JtYWxpemVkIH0gPSBnZW9tZXRyeUF0dHJpYnV0ZTtcclxuXHRcdGNvbnN0IEFycmF5VHlwZSA9IGdlb21ldHJ5QXR0cmlidXRlLmFycmF5LmNvbnN0cnVjdG9yO1xyXG5cdFx0Y29uc3QgQXR0cmlidXRlVHlwZSA9IGdlb21ldHJ5QXR0cmlidXRlLmNvbnN0cnVjdG9yO1xyXG5cclxuXHRcdGxldCBmb3JtYXQ7XHJcblxyXG5cdFx0aWYgKCBpdGVtU2l6ZSA9PT0gMSApIHtcclxuXHJcblx0XHRcdGZvcm1hdCA9IHR5cGVBcnJheXNUb1ZlcnRleEZvcm1hdFByZWZpeEZvckl0ZW1TaXplMS5nZXQoIEFycmF5VHlwZSApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRjb25zdCBwcmVmaXhPcHRpb25zID0gdHlwZWRBdHRyaWJ1dGVUb1ZlcnRleEZvcm1hdFByZWZpeC5nZXQoIEF0dHJpYnV0ZVR5cGUgKSB8fCB0eXBlZEFycmF5c1RvVmVydGV4Rm9ybWF0UHJlZml4LmdldCggQXJyYXlUeXBlICk7XHJcblx0XHRcdGNvbnN0IHByZWZpeCA9IHByZWZpeE9wdGlvbnNbIG5vcm1hbGl6ZWQgPyAxIDogMCBdO1xyXG5cclxuXHRcdFx0aWYgKCBwcmVmaXggKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGJ5dGVzUGVyVW5pdCA9IEFycmF5VHlwZS5CWVRFU19QRVJfRUxFTUVOVCAqIGl0ZW1TaXplO1xyXG5cdFx0XHRcdGNvbnN0IHBhZGRlZEJ5dGVzUGVyVW5pdCA9IE1hdGguZmxvb3IoICggYnl0ZXNQZXJVbml0ICsgMyApIC8gNCApICogNDtcclxuXHRcdFx0XHRjb25zdCBwYWRkZWRJdGVtU2l6ZSA9IHBhZGRlZEJ5dGVzUGVyVW5pdCAvIEFycmF5VHlwZS5CWVRFU19QRVJfRUxFTUVOVDtcclxuXHJcblx0XHRcdFx0aWYgKCBwYWRkZWRJdGVtU2l6ZSAlIDEgKSB7XHJcblxyXG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuV2ViR1BVQXR0cmlidXRlVXRpbHM6IEJhZCB2ZXJ0ZXggZm9ybWF0IGl0ZW0gc2l6ZS4nICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Zm9ybWF0ID0gYCR7cHJlZml4fXgke3BhZGRlZEl0ZW1TaXplfWA7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggISBmb3JtYXQgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR1BVQXR0cmlidXRlVXRpbHM6IFZlcnRleCBmb3JtYXQgbm90IHN1cHBvcnRlZCB5ZXQuJyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZm9ybWF0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBnaXZlbiBhcnJheSBpcyBhIHR5cGVkIGFycmF5LlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge2FueX0gYXJyYXkgLSBUaGUgYXJyYXkuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZ2l2ZW4gYXJyYXkgaXMgYSB0eXBlZCBhcnJheSBvciBub3QuXHJcblx0ICovXHJcblx0X2lzVHlwZWRBcnJheSggYXJyYXkgKSB7XHJcblxyXG5cdFx0cmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyggYXJyYXkgKSAmJiAhICggYXJyYXkgaW5zdGFuY2VvZiBEYXRhVmlldyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFV0aWxpdHkgbWV0aG9kIGZvciBoYW5kbGluZyBpbnRlcmxlYXZlZCBidWZmZXIgYXR0cmlidXRlcyBjb3JyZWN0bHkuXHJcblx0ICogVG8gcHJvY2VzcyB0aGVtLCB0aGVpciBgSW50ZXJsZWF2ZWRCdWZmZXJgIGlzIHJldHVybmVkLlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge0J1ZmZlckF0dHJpYnV0ZX0gYXR0cmlidXRlIC0gVGhlIGF0dHJpYnV0ZS5cclxuXHQgKiBAcmV0dXJuIHtCdWZmZXJBdHRyaWJ1dGV8SW50ZXJsZWF2ZWRCdWZmZXJ9XHJcblx0ICovXHJcblx0X2dldEJ1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlICkge1xyXG5cclxuXHRcdGlmICggYXR0cmlidXRlLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgKSBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGUuZGF0YTtcclxuXHJcblx0XHRyZXR1cm4gYXR0cmlidXRlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBXZWJHUFVBdHRyaWJ1dGVVdGlscztcclxuIiwiaW1wb3J0IHtcclxuXHRHUFVUZXh0dXJlQXNwZWN0LCBHUFVUZXh0dXJlVmlld0RpbWVuc2lvbiwgR1BVVGV4dHVyZVNhbXBsZVR5cGUsIEdQVUJ1ZmZlckJpbmRpbmdUeXBlLCBHUFVTdG9yYWdlVGV4dHVyZUFjY2Vzc1xyXG59IGZyb20gJy4vV2ViR1BVQ29uc3RhbnRzLmpzJztcclxuXHJcbmltcG9ydCB7IEZsb2F0VHlwZSwgSW50VHlwZSwgVW5zaWduZWRJbnRUeXBlIH0gZnJvbSAnLi4vLi4vLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgTm9kZUFjY2VzcyB9IGZyb20gJy4uLy4uLy4uL25vZGVzL2NvcmUvY29uc3RhbnRzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIFdlYkdQVSBiYWNrZW5kIHV0aWxpdHkgbW9kdWxlIGZvciBtYW5hZ2luZyBiaW5kaW5ncy5cclxuICpcclxuICogV2hlbiByZWFkaW5nIHRoZSBkb2N1bWVudGF0aW9uIGl0J3MgaGVscGZ1bCB0byBrZWVwIGluIG1pbmQgdGhhdFxyXG4gKiBhbGwgY2xhc3MgZGVmaW5pdGlvbnMgc3RhcnRpbmcgd2l0aCAnR1BVKicgYXJlIG1vZHVsZXMgZnJvbSB0aGVcclxuICogV2ViR1BVIEFQSS4gU28gZm9yIGV4YW1wbGUgYEJpbmRHcm91cGAgaXMgYSBjbGFzcyBmcm9tIHRoZSBlbmdpbmVcclxuICogd2hlcmVhcyBgR1BVQmluZEdyb3VwYCBpcyBhIGNsYXNzIGZyb20gV2ViR1BVLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuY2xhc3MgV2ViR1BVQmluZGluZ1V0aWxzIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB1dGlsaXR5IG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7V2ViR1BVQmFja2VuZH0gYmFja2VuZCAtIFRoZSBXZWJHUFUgYmFja2VuZC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggYmFja2VuZCApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIHRoZSBXZWJHUFUgYmFja2VuZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2ViR1BVQmFja2VuZH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5iYWNrZW5kID0gYmFja2VuZDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgY2FjaGUgZm9yIG1hbmFnaW5nIGJpbmQgZ3JvdXAgbGF5b3V0cy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2Vha01hcDxBcnJheTxCaW5kaW5nPixHUFVCaW5kR3JvdXBMYXlvdXQ+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJpbmRHcm91cExheW91dENhY2hlID0gbmV3IFdlYWtNYXAoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGEgR1BVIGJpbmQgZ3JvdXAgbGF5b3V0IGZvciB0aGUgZ2l2ZW4gYmluZCBncm91cC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QmluZEdyb3VwfSBiaW5kR3JvdXAgLSBUaGUgYmluZCBncm91cC5cclxuXHQgKiBAcmV0dXJuIHtHUFVCaW5kR3JvdXBMYXlvdXR9IFRoZSBHUFUgYmluZCBncm91cCBsYXlvdXQuXHJcblx0ICovXHJcblx0Y3JlYXRlQmluZGluZ3NMYXlvdXQoIGJpbmRHcm91cCApIHtcclxuXHJcblx0XHRjb25zdCBiYWNrZW5kID0gdGhpcy5iYWNrZW5kO1xyXG5cdFx0Y29uc3QgZGV2aWNlID0gYmFja2VuZC5kZXZpY2U7XHJcblxyXG5cdFx0Y29uc3QgZW50cmllcyA9IFtdO1xyXG5cclxuXHRcdGxldCBpbmRleCA9IDA7XHJcblxyXG5cdFx0Zm9yICggY29uc3QgYmluZGluZyBvZiBiaW5kR3JvdXAuYmluZGluZ3MgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBiaW5kaW5nR1BVID0ge1xyXG5cdFx0XHRcdGJpbmRpbmc6IGluZGV4ICsrLFxyXG5cdFx0XHRcdHZpc2liaWxpdHk6IGJpbmRpbmcudmlzaWJpbGl0eVxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0aWYgKCBiaW5kaW5nLmlzVW5pZm9ybUJ1ZmZlciB8fCBiaW5kaW5nLmlzU3RvcmFnZUJ1ZmZlciApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgYnVmZmVyID0ge307IC8vIEdQVUJ1ZmZlckJpbmRpbmdMYXlvdXRcclxuXHJcblx0XHRcdFx0aWYgKCBiaW5kaW5nLmlzU3RvcmFnZUJ1ZmZlciApIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGJpbmRpbmcudmlzaWJpbGl0eSAmIDQgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBjb21wdXRlXHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIGJpbmRpbmcuYWNjZXNzID09PSBOb2RlQWNjZXNzLlJFQURfV1JJVEUgfHwgYmluZGluZy5hY2Nlc3MgPT09IE5vZGVBY2Nlc3MuV1JJVEVfT05MWSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0YnVmZmVyLnR5cGUgPSBHUFVCdWZmZXJCaW5kaW5nVHlwZS5TdG9yYWdlO1xyXG5cclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0YnVmZmVyLnR5cGUgPSBHUFVCdWZmZXJCaW5kaW5nVHlwZS5SZWFkT25seVN0b3JhZ2U7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdGJ1ZmZlci50eXBlID0gR1BVQnVmZmVyQmluZGluZ1R5cGUuUmVhZE9ubHlTdG9yYWdlO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRiaW5kaW5nR1BVLmJ1ZmZlciA9IGJ1ZmZlcjtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGJpbmRpbmcuaXNTYW1wbGVyICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBzYW1wbGVyID0ge307IC8vIEdQVVNhbXBsZXJCaW5kaW5nTGF5b3V0XHJcblxyXG5cdFx0XHRcdGlmICggYmluZGluZy50ZXh0dXJlLmlzRGVwdGhUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0XHRcdGlmICggYmluZGluZy50ZXh0dXJlLmNvbXBhcmVGdW5jdGlvbiAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHRcdHNhbXBsZXIudHlwZSA9ICdjb21wYXJpc29uJztcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0YmluZGluZ0dQVS5zYW1wbGVyID0gc2FtcGxlcjtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGJpbmRpbmcuaXNTYW1wbGVkVGV4dHVyZSAmJiBiaW5kaW5nLnRleHR1cmUuaXNWaWRlb1RleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRcdGJpbmRpbmdHUFUuZXh0ZXJuYWxUZXh0dXJlID0ge307IC8vIEdQVUV4dGVybmFsVGV4dHVyZUJpbmRpbmdMYXlvdXRcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGJpbmRpbmcuaXNTYW1wbGVkVGV4dHVyZSAmJiBiaW5kaW5nLnN0b3JlICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBzdG9yYWdlVGV4dHVyZSA9IHt9OyAvLyBHUFVTdG9yYWdlVGV4dHVyZUJpbmRpbmdMYXlvdXRcclxuXHRcdFx0XHRzdG9yYWdlVGV4dHVyZS5mb3JtYXQgPSB0aGlzLmJhY2tlbmQuZ2V0KCBiaW5kaW5nLnRleHR1cmUgKS50ZXh0dXJlLmZvcm1hdDtcclxuXHJcblx0XHRcdFx0Y29uc3QgYWNjZXNzID0gYmluZGluZy5hY2Nlc3M7XHJcblxyXG5cdFx0XHRcdGlmICggYWNjZXNzID09PSBOb2RlQWNjZXNzLlJFQURfV1JJVEUgKSB7XHJcblxyXG5cdFx0XHRcdFx0c3RvcmFnZVRleHR1cmUuYWNjZXNzID0gR1BVU3RvcmFnZVRleHR1cmVBY2Nlc3MuUmVhZFdyaXRlO1xyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCBhY2Nlc3MgPT09IE5vZGVBY2Nlc3MuV1JJVEVfT05MWSApIHtcclxuXHJcblx0XHRcdFx0XHRzdG9yYWdlVGV4dHVyZS5hY2Nlc3MgPSBHUFVTdG9yYWdlVGV4dHVyZUFjY2Vzcy5Xcml0ZU9ubHk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0c3RvcmFnZVRleHR1cmUuYWNjZXNzID0gR1BVU3RvcmFnZVRleHR1cmVBY2Nlc3MuUmVhZE9ubHk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0YmluZGluZ0dQVS5zdG9yYWdlVGV4dHVyZSA9IHN0b3JhZ2VUZXh0dXJlO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggYmluZGluZy5pc1NhbXBsZWRUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB0ZXh0dXJlID0ge307IC8vIEdQVVRleHR1cmVCaW5kaW5nTGF5b3V0XHJcblxyXG5cdFx0XHRcdGNvbnN0IHsgcHJpbWFyeVNhbXBsZXMgfSA9IGJhY2tlbmQudXRpbHMuZ2V0VGV4dHVyZVNhbXBsZURhdGEoIGJpbmRpbmcudGV4dHVyZSApO1xyXG5cclxuXHRcdFx0XHRpZiAoIHByaW1hcnlTYW1wbGVzID4gMSApIHtcclxuXHJcblx0XHRcdFx0XHR0ZXh0dXJlLm11bHRpc2FtcGxlZCA9IHRydWU7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCAhIGJpbmRpbmcudGV4dHVyZS5pc0RlcHRoVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdHRleHR1cmUuc2FtcGxlVHlwZSA9IEdQVVRleHR1cmVTYW1wbGVUeXBlLlVuZmlsdGVyYWJsZUZsb2F0O1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoIGJpbmRpbmcudGV4dHVyZS5pc0RlcHRoVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0XHR0ZXh0dXJlLnNhbXBsZVR5cGUgPSBHUFVUZXh0dXJlU2FtcGxlVHlwZS5EZXB0aDtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggYmluZGluZy50ZXh0dXJlLmlzRGF0YVRleHR1cmUgfHwgYmluZGluZy50ZXh0dXJlLmlzRGF0YUFycmF5VGV4dHVyZSB8fCBiaW5kaW5nLnRleHR1cmUuaXNEYXRhM0RUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHR5cGUgPSBiaW5kaW5nLnRleHR1cmUudHlwZTtcclxuXHJcblx0XHRcdFx0XHRpZiAoIHR5cGUgPT09IEludFR5cGUgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHR0ZXh0dXJlLnNhbXBsZVR5cGUgPSBHUFVUZXh0dXJlU2FtcGxlVHlwZS5TSW50O1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIHR5cGUgPT09IFVuc2lnbmVkSW50VHlwZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdHRleHR1cmUuc2FtcGxlVHlwZSA9IEdQVVRleHR1cmVTYW1wbGVUeXBlLlVJbnQ7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIGlmICggdHlwZSA9PT0gRmxvYXRUeXBlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCB0aGlzLmJhY2tlbmQuaGFzRmVhdHVyZSggJ2Zsb2F0MzItZmlsdGVyYWJsZScgKSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0dGV4dHVyZS5zYW1wbGVUeXBlID0gR1BVVGV4dHVyZVNhbXBsZVR5cGUuRmxvYXQ7XHJcblxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0XHR0ZXh0dXJlLnNhbXBsZVR5cGUgPSBHUFVUZXh0dXJlU2FtcGxlVHlwZS5VbmZpbHRlcmFibGVGbG9hdDtcclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKCBiaW5kaW5nLmlzU2FtcGxlZEN1YmVUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0XHRcdHRleHR1cmUudmlld0RpbWVuc2lvbiA9IEdQVVRleHR1cmVWaWV3RGltZW5zaW9uLkN1YmU7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGJpbmRpbmcudGV4dHVyZS5pc0RhdGFBcnJheVRleHR1cmUgfHwgYmluZGluZy50ZXh0dXJlLmlzQ29tcHJlc3NlZEFycmF5VGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0XHR0ZXh0dXJlLnZpZXdEaW1lbnNpb24gPSBHUFVUZXh0dXJlVmlld0RpbWVuc2lvbi5Ud29EQXJyYXk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGJpbmRpbmcuaXNTYW1wbGVkVGV4dHVyZTNEICkge1xyXG5cclxuXHRcdFx0XHRcdHRleHR1cmUudmlld0RpbWVuc2lvbiA9IEdQVVRleHR1cmVWaWV3RGltZW5zaW9uLlRocmVlRDtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRiaW5kaW5nR1BVLnRleHR1cmUgPSB0ZXh0dXJlO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0Y29uc29sZS5lcnJvciggYFdlYkdQVUJpbmRpbmdVdGlsczogVW5zdXBwb3J0ZWQgYmluZGluZyBcIiR7IGJpbmRpbmcgfVwiLmAgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGVudHJpZXMucHVzaCggYmluZGluZ0dQVSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZGV2aWNlLmNyZWF0ZUJpbmRHcm91cExheW91dCggeyBlbnRyaWVzIH0gKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGJpbmRpbmdzIGZyb20gdGhlIGdpdmVuIGJpbmQgZ3JvdXAgZGVmaW5pdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QmluZEdyb3VwfSBiaW5kR3JvdXAgLSBUaGUgYmluZCBncm91cC5cclxuXHQgKiBAcGFyYW0ge0FycmF5PEJpbmRHcm91cD59IGJpbmRpbmdzIC0gQXJyYXkgb2YgYmluZCBncm91cHMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGNhY2hlSW5kZXggLSBUaGUgY2FjaGUgaW5kZXguXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHZlcnNpb24gLSBUaGUgdmVyc2lvbi5cclxuXHQgKi9cclxuXHRjcmVhdGVCaW5kaW5ncyggYmluZEdyb3VwLCBiaW5kaW5ncywgY2FjaGVJbmRleCwgdmVyc2lvbiA9IDAgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBiYWNrZW5kLCBiaW5kR3JvdXBMYXlvdXRDYWNoZSB9ID0gdGhpcztcclxuXHRcdGNvbnN0IGJpbmRpbmdzRGF0YSA9IGJhY2tlbmQuZ2V0KCBiaW5kR3JvdXAgKTtcclxuXHJcblx0XHQvLyBzZXR1cCAoc3RhdGljKSBiaW5kaW5nIGxheW91dCBhbmQgKGR5bmFtaWMpIGJpbmRpbmcgZ3JvdXBcclxuXHJcblx0XHRsZXQgYmluZExheW91dEdQVSA9IGJpbmRHcm91cExheW91dENhY2hlLmdldCggYmluZEdyb3VwLmJpbmRpbmdzUmVmZXJlbmNlICk7XHJcblxyXG5cdFx0aWYgKCBiaW5kTGF5b3V0R1BVID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRiaW5kTGF5b3V0R1BVID0gdGhpcy5jcmVhdGVCaW5kaW5nc0xheW91dCggYmluZEdyb3VwICk7XHJcblx0XHRcdGJpbmRHcm91cExheW91dENhY2hlLnNldCggYmluZEdyb3VwLmJpbmRpbmdzUmVmZXJlbmNlLCBiaW5kTGF5b3V0R1BVICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGxldCBiaW5kR3JvdXBHUFU7XHJcblxyXG5cdFx0aWYgKCBjYWNoZUluZGV4ID4gMCApIHtcclxuXHJcblx0XHRcdGlmICggYmluZGluZ3NEYXRhLmdyb3VwcyA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRiaW5kaW5nc0RhdGEuZ3JvdXBzID0gW107XHJcblx0XHRcdFx0YmluZGluZ3NEYXRhLnZlcnNpb25zID0gW107XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIGJpbmRpbmdzRGF0YS52ZXJzaW9uc1sgY2FjaGVJbmRleCBdID09PSB2ZXJzaW9uICkge1xyXG5cclxuXHRcdFx0XHRiaW5kR3JvdXBHUFUgPSBiaW5kaW5nc0RhdGEuZ3JvdXBzWyBjYWNoZUluZGV4IF07XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggYmluZEdyb3VwR1BVID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRiaW5kR3JvdXBHUFUgPSB0aGlzLmNyZWF0ZUJpbmRHcm91cCggYmluZEdyb3VwLCBiaW5kTGF5b3V0R1BVICk7XHJcblxyXG5cdFx0XHRpZiAoIGNhY2hlSW5kZXggPiAwICkge1xyXG5cclxuXHRcdFx0XHRiaW5kaW5nc0RhdGEuZ3JvdXBzWyBjYWNoZUluZGV4IF0gPSBiaW5kR3JvdXBHUFU7XHJcblx0XHRcdFx0YmluZGluZ3NEYXRhLnZlcnNpb25zWyBjYWNoZUluZGV4IF0gPSB2ZXJzaW9uO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRiaW5kaW5nc0RhdGEuZ3JvdXAgPSBiaW5kR3JvdXBHUFU7XHJcblx0XHRiaW5kaW5nc0RhdGEubGF5b3V0ID0gYmluZExheW91dEdQVTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIGEgYnVmZmVyIGJpbmRpbmcuXHJcblx0ICpcclxuXHQgKiAgQHBhcmFtIHtCdWZmZXJ9IGJpbmRpbmcgLSBUaGUgYnVmZmVyIGJpbmRpbmcgdG8gdXBkYXRlLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZUJpbmRpbmcoIGJpbmRpbmcgKSB7XHJcblxyXG5cdFx0Y29uc3QgYmFja2VuZCA9IHRoaXMuYmFja2VuZDtcclxuXHRcdGNvbnN0IGRldmljZSA9IGJhY2tlbmQuZGV2aWNlO1xyXG5cclxuXHRcdGNvbnN0IGJ1ZmZlciA9IGJpbmRpbmcuYnVmZmVyO1xyXG5cdFx0Y29uc3QgYnVmZmVyR1BVID0gYmFja2VuZC5nZXQoIGJpbmRpbmcgKS5idWZmZXI7XHJcblxyXG5cdFx0ZGV2aWNlLnF1ZXVlLndyaXRlQnVmZmVyKCBidWZmZXJHUFUsIDAsIGJ1ZmZlciwgMCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgYSBHUFUgYmluZCBncm91cCBmb3IgdGhlIGNhbWVyYSBpbmRleC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VWludDMyQXJyYXl9IGRhdGEgLSBUaGUgaW5kZXggZGF0YS5cclxuXHQgKiBAcGFyYW0ge0dQVUJpbmRHcm91cExheW91dH0gbGF5b3V0IC0gVGhlIEdQVSBiaW5kIGdyb3VwIGxheW91dC5cclxuXHQgKiBAcmV0dXJuIHtHUFVCaW5kR3JvdXB9IFRoZSBHUFUgYmluZCBncm91cC5cclxuXHQgKi9cclxuXHRjcmVhdGVCaW5kR3JvdXBJbmRleCggZGF0YSwgbGF5b3V0ICkge1xyXG5cclxuXHRcdGNvbnN0IGJhY2tlbmQgPSB0aGlzLmJhY2tlbmQ7XHJcblx0XHRjb25zdCBkZXZpY2UgPSBiYWNrZW5kLmRldmljZTtcclxuXHJcblx0XHRjb25zdCB1c2FnZSA9IEdQVUJ1ZmZlclVzYWdlLlVOSUZPUk0gfCBHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVDtcclxuXHRcdGNvbnN0IGluZGV4ID0gZGF0YVsgMCBdO1xyXG5cclxuXHRcdGNvbnN0IGJ1ZmZlciA9IGRldmljZS5jcmVhdGVCdWZmZXIoIHtcclxuXHRcdFx0bGFiZWw6ICdiaW5kaW5nQ2FtZXJhSW5kZXhfJyArIGluZGV4LFxyXG5cdFx0XHRzaXplOiAxNiwgLy8gdWludCg0KSAqIDRcclxuXHRcdFx0dXNhZ2U6IHVzYWdlXHJcblx0XHR9ICk7XHJcblxyXG5cdFx0ZGV2aWNlLnF1ZXVlLndyaXRlQnVmZmVyKCBidWZmZXIsIDAsIGRhdGEsIDAgKTtcclxuXHJcblx0XHRjb25zdCBlbnRyaWVzID0gWyB7IGJpbmRpbmc6IDAsIHJlc291cmNlOiB7IGJ1ZmZlciB9IH0gXTtcclxuXHJcblx0XHRyZXR1cm4gZGV2aWNlLmNyZWF0ZUJpbmRHcm91cCgge1xyXG5cdFx0XHRsYWJlbDogJ2JpbmRHcm91cENhbWVyYUluZGV4XycgKyBpbmRleCxcclxuXHRcdFx0bGF5b3V0LFxyXG5cdFx0XHRlbnRyaWVzXHJcblx0XHR9ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyBhIEdQVSBiaW5kIGdyb3VwIGZvciB0aGUgZ2l2ZW4gYmluZCBncm91cCBhbmQgR1BVIGxheW91dC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QmluZEdyb3VwfSBiaW5kR3JvdXAgLSBUaGUgYmluZCBncm91cC5cclxuXHQgKiBAcGFyYW0ge0dQVUJpbmRHcm91cExheW91dH0gbGF5b3V0R1BVIC0gVGhlIEdQVSBiaW5kIGdyb3VwIGxheW91dC5cclxuXHQgKiBAcmV0dXJuIHtHUFVCaW5kR3JvdXB9IFRoZSBHUFUgYmluZCBncm91cC5cclxuXHQgKi9cclxuXHRjcmVhdGVCaW5kR3JvdXAoIGJpbmRHcm91cCwgbGF5b3V0R1BVICkge1xyXG5cclxuXHRcdGNvbnN0IGJhY2tlbmQgPSB0aGlzLmJhY2tlbmQ7XHJcblx0XHRjb25zdCBkZXZpY2UgPSBiYWNrZW5kLmRldmljZTtcclxuXHJcblx0XHRsZXQgYmluZGluZ1BvaW50ID0gMDtcclxuXHRcdGNvbnN0IGVudHJpZXNHUFUgPSBbXTtcclxuXHJcblx0XHRmb3IgKCBjb25zdCBiaW5kaW5nIG9mIGJpbmRHcm91cC5iaW5kaW5ncyApIHtcclxuXHJcblx0XHRcdGlmICggYmluZGluZy5pc1VuaWZvcm1CdWZmZXIgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGJpbmRpbmdEYXRhID0gYmFja2VuZC5nZXQoIGJpbmRpbmcgKTtcclxuXHJcblx0XHRcdFx0aWYgKCBiaW5kaW5nRGF0YS5idWZmZXIgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBieXRlTGVuZ3RoID0gYmluZGluZy5ieXRlTGVuZ3RoO1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHVzYWdlID0gR1BVQnVmZmVyVXNhZ2UuVU5JRk9STSB8IEdQVUJ1ZmZlclVzYWdlLkNPUFlfRFNUO1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGJ1ZmZlckdQVSA9IGRldmljZS5jcmVhdGVCdWZmZXIoIHtcclxuXHRcdFx0XHRcdFx0bGFiZWw6ICdiaW5kaW5nQnVmZmVyXycgKyBiaW5kaW5nLm5hbWUsXHJcblx0XHRcdFx0XHRcdHNpemU6IGJ5dGVMZW5ndGgsXHJcblx0XHRcdFx0XHRcdHVzYWdlOiB1c2FnZVxyXG5cdFx0XHRcdFx0fSApO1xyXG5cclxuXHRcdFx0XHRcdGJpbmRpbmdEYXRhLmJ1ZmZlciA9IGJ1ZmZlckdQVTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRlbnRyaWVzR1BVLnB1c2goIHsgYmluZGluZzogYmluZGluZ1BvaW50LCByZXNvdXJjZTogeyBidWZmZXI6IGJpbmRpbmdEYXRhLmJ1ZmZlciB9IH0gKTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGJpbmRpbmcuaXNTdG9yYWdlQnVmZmVyICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBiaW5kaW5nRGF0YSA9IGJhY2tlbmQuZ2V0KCBiaW5kaW5nICk7XHJcblxyXG5cdFx0XHRcdGlmICggYmluZGluZ0RhdGEuYnVmZmVyID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgYXR0cmlidXRlID0gYmluZGluZy5hdHRyaWJ1dGU7XHJcblx0XHRcdFx0XHQvL2NvbnN0IHVzYWdlID0gR1BVQnVmZmVyVXNhZ2UuU1RPUkFHRSB8IEdQVUJ1ZmZlclVzYWdlLlZFUlRFWCB8IC8qR1BVQnVmZmVyVXNhZ2UuQ09QWV9TUkMgfCovIEdQVUJ1ZmZlclVzYWdlLkNPUFlfRFNUO1xyXG5cclxuXHRcdFx0XHRcdC8vYmFja2VuZC5hdHRyaWJ1dGVVdGlscy5jcmVhdGVBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgdXNhZ2UgKTsgLy8gQFRPRE86IE1vdmUgaXQgdG8gdW5pdmVyc2FsIHJlbmRlcmVyXHJcblxyXG5cdFx0XHRcdFx0YmluZGluZ0RhdGEuYnVmZmVyID0gYmFja2VuZC5nZXQoIGF0dHJpYnV0ZSApLmJ1ZmZlcjtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRlbnRyaWVzR1BVLnB1c2goIHsgYmluZGluZzogYmluZGluZ1BvaW50LCByZXNvdXJjZTogeyBidWZmZXI6IGJpbmRpbmdEYXRhLmJ1ZmZlciB9IH0gKTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGJpbmRpbmcuaXNTYW1wbGVyICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB0ZXh0dXJlR1BVID0gYmFja2VuZC5nZXQoIGJpbmRpbmcudGV4dHVyZSApO1xyXG5cclxuXHRcdFx0XHRlbnRyaWVzR1BVLnB1c2goIHsgYmluZGluZzogYmluZGluZ1BvaW50LCByZXNvdXJjZTogdGV4dHVyZUdQVS5zYW1wbGVyIH0gKTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGJpbmRpbmcuaXNTYW1wbGVkVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgdGV4dHVyZURhdGEgPSBiYWNrZW5kLmdldCggYmluZGluZy50ZXh0dXJlICk7XHJcblxyXG5cdFx0XHRcdGxldCByZXNvdXJjZUdQVTtcclxuXHJcblx0XHRcdFx0aWYgKCB0ZXh0dXJlRGF0YS5leHRlcm5hbFRleHR1cmUgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRyZXNvdXJjZUdQVSA9IGRldmljZS5pbXBvcnRFeHRlcm5hbFRleHR1cmUoIHsgc291cmNlOiB0ZXh0dXJlRGF0YS5leHRlcm5hbFRleHR1cmUgfSApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IG1pcExldmVsQ291bnQgPSBiaW5kaW5nLnN0b3JlID8gMSA6IHRleHR1cmVEYXRhLnRleHR1cmUubWlwTGV2ZWxDb3VudDtcclxuXHRcdFx0XHRcdGNvbnN0IHByb3BlcnR5TmFtZSA9IGB2aWV3LSR7IHRleHR1cmVEYXRhLnRleHR1cmUud2lkdGggfS0keyB0ZXh0dXJlRGF0YS50ZXh0dXJlLmhlaWdodCB9LSR7IG1pcExldmVsQ291bnQgfWA7XHJcblxyXG5cdFx0XHRcdFx0cmVzb3VyY2VHUFUgPSB0ZXh0dXJlRGF0YVsgcHJvcGVydHlOYW1lIF07XHJcblxyXG5cdFx0XHRcdFx0aWYgKCByZXNvdXJjZUdQVSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgYXNwZWN0R1BVID0gR1BVVGV4dHVyZUFzcGVjdC5BbGw7XHJcblxyXG5cdFx0XHRcdFx0XHRsZXQgZGltZW5zaW9uVmlld0dQVTtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggYmluZGluZy5pc1NhbXBsZWRDdWJlVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0ZGltZW5zaW9uVmlld0dQVSA9IEdQVVRleHR1cmVWaWV3RGltZW5zaW9uLkN1YmU7XHJcblxyXG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCBiaW5kaW5nLmlzU2FtcGxlZFRleHR1cmUzRCApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0ZGltZW5zaW9uVmlld0dQVSA9IEdQVVRleHR1cmVWaWV3RGltZW5zaW9uLlRocmVlRDtcclxuXHJcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIGJpbmRpbmcudGV4dHVyZS5pc0RhdGFBcnJheVRleHR1cmUgfHwgYmluZGluZy50ZXh0dXJlLmlzQ29tcHJlc3NlZEFycmF5VGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0ZGltZW5zaW9uVmlld0dQVSA9IEdQVVRleHR1cmVWaWV3RGltZW5zaW9uLlR3b0RBcnJheTtcclxuXHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGRpbWVuc2lvblZpZXdHUFUgPSBHUFVUZXh0dXJlVmlld0RpbWVuc2lvbi5Ud29EO1xyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0cmVzb3VyY2VHUFUgPSB0ZXh0dXJlRGF0YVsgcHJvcGVydHlOYW1lIF0gPSB0ZXh0dXJlRGF0YS50ZXh0dXJlLmNyZWF0ZVZpZXcoIHsgYXNwZWN0OiBhc3BlY3RHUFUsIGRpbWVuc2lvbjogZGltZW5zaW9uVmlld0dQVSwgbWlwTGV2ZWxDb3VudCB9ICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGVudHJpZXNHUFUucHVzaCggeyBiaW5kaW5nOiBiaW5kaW5nUG9pbnQsIHJlc291cmNlOiByZXNvdXJjZUdQVSB9ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRiaW5kaW5nUG9pbnQgKys7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBkZXZpY2UuY3JlYXRlQmluZEdyb3VwKCB7XHJcblx0XHRcdGxhYmVsOiAnYmluZEdyb3VwXycgKyBiaW5kR3JvdXAubmFtZSxcclxuXHRcdFx0bGF5b3V0OiBsYXlvdXRHUFUsXHJcblx0XHRcdGVudHJpZXM6IGVudHJpZXNHUFVcclxuXHRcdH0gKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgV2ViR1BVQmluZGluZ1V0aWxzO1xyXG4iLCJpbXBvcnQgeyBCbGVuZENvbG9yRmFjdG9yLCBPbmVNaW51c0JsZW5kQ29sb3JGYWN0b3IsIH0gZnJvbSAnLi4vLi4vY29tbW9uL0NvbnN0YW50cy5qcyc7XHJcblxyXG5pbXBvcnQge1xyXG5cdEdQVUZyb250RmFjZSwgR1BVQ3VsbE1vZGUsIEdQVUNvbG9yV3JpdGVGbGFncywgR1BVQ29tcGFyZUZ1bmN0aW9uLCBHUFVCbGVuZEZhY3RvciwgR1BVQmxlbmRPcGVyYXRpb24sIEdQVUluZGV4Rm9ybWF0LCBHUFVTdGVuY2lsT3BlcmF0aW9uXHJcbn0gZnJvbSAnLi9XZWJHUFVDb25zdGFudHMuanMnO1xyXG5cclxuaW1wb3J0IHtcclxuXHRGcm9udFNpZGUsIEJhY2tTaWRlLCBEb3VibGVTaWRlLFxyXG5cdE5ldmVyRGVwdGgsIEFsd2F5c0RlcHRoLCBMZXNzRGVwdGgsIExlc3NFcXVhbERlcHRoLCBFcXVhbERlcHRoLCBHcmVhdGVyRXF1YWxEZXB0aCwgR3JlYXRlckRlcHRoLCBOb3RFcXVhbERlcHRoLFxyXG5cdE5vQmxlbmRpbmcsIE5vcm1hbEJsZW5kaW5nLCBBZGRpdGl2ZUJsZW5kaW5nLCBTdWJ0cmFjdGl2ZUJsZW5kaW5nLCBNdWx0aXBseUJsZW5kaW5nLCBDdXN0b21CbGVuZGluZyxcclxuXHRaZXJvRmFjdG9yLCBPbmVGYWN0b3IsIFNyY0NvbG9yRmFjdG9yLCBPbmVNaW51c1NyY0NvbG9yRmFjdG9yLCBTcmNBbHBoYUZhY3RvciwgT25lTWludXNTcmNBbHBoYUZhY3RvciwgRHN0Q29sb3JGYWN0b3IsXHJcblx0T25lTWludXNEc3RDb2xvckZhY3RvciwgRHN0QWxwaGFGYWN0b3IsIE9uZU1pbnVzRHN0QWxwaGFGYWN0b3IsIFNyY0FscGhhU2F0dXJhdGVGYWN0b3IsXHJcblx0QWRkRXF1YXRpb24sIFN1YnRyYWN0RXF1YXRpb24sIFJldmVyc2VTdWJ0cmFjdEVxdWF0aW9uLCBNaW5FcXVhdGlvbiwgTWF4RXF1YXRpb24sXHJcblx0S2VlcFN0ZW5jaWxPcCwgWmVyb1N0ZW5jaWxPcCwgUmVwbGFjZVN0ZW5jaWxPcCwgSW52ZXJ0U3RlbmNpbE9wLCBJbmNyZW1lbnRTdGVuY2lsT3AsIERlY3JlbWVudFN0ZW5jaWxPcCwgSW5jcmVtZW50V3JhcFN0ZW5jaWxPcCwgRGVjcmVtZW50V3JhcFN0ZW5jaWxPcCxcclxuXHROZXZlclN0ZW5jaWxGdW5jLCBBbHdheXNTdGVuY2lsRnVuYywgTGVzc1N0ZW5jaWxGdW5jLCBMZXNzRXF1YWxTdGVuY2lsRnVuYywgRXF1YWxTdGVuY2lsRnVuYywgR3JlYXRlckVxdWFsU3RlbmNpbEZ1bmMsIEdyZWF0ZXJTdGVuY2lsRnVuYywgTm90RXF1YWxTdGVuY2lsRnVuY1xyXG59IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcblxyXG4vKipcclxuICogQSBXZWJHUFUgYmFja2VuZCB1dGlsaXR5IG1vZHVsZSBmb3IgbWFuYWdpbmcgcGlwZWxpbmVzLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuY2xhc3MgV2ViR1BVUGlwZWxpbmVVdGlscyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgdXRpbGl0eSBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdQVUJhY2tlbmR9IGJhY2tlbmQgLSBUaGUgV2ViR1BVIGJhY2tlbmQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGJhY2tlbmQgKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZSB0byB0aGUgV2ViR1BVIGJhY2tlbmQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1dlYkdQVUJhY2tlbmR9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYmFja2VuZCA9IGJhY2tlbmQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgc2FtcGxlIGNvdW50IGRlcml2ZWQgZnJvbSB0aGUgZ2l2ZW4gcmVuZGVyIGNvbnRleHQuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyQ29udGV4dH0gcmVuZGVyQ29udGV4dCAtIFRoZSByZW5kZXIgY29udGV4dC5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBzYW1wbGUgY291bnQuXHJcblx0ICovXHJcblx0X2dldFNhbXBsZUNvdW50KCByZW5kZXJDb250ZXh0ICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmJhY2tlbmQudXRpbHMuZ2V0U2FtcGxlQ291bnRSZW5kZXJDb250ZXh0KCByZW5kZXJDb250ZXh0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyBhIHJlbmRlciBwaXBlbGluZSBmb3IgdGhlIGdpdmVuIHJlbmRlciBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JlbmRlck9iamVjdH0gcmVuZGVyT2JqZWN0IC0gVGhlIHJlbmRlciBvYmplY3QuXHJcblx0ICogQHBhcmFtIHtBcnJheTxQcm9taXNlPn0gcHJvbWlzZXMgLSBBbiBhcnJheSBvZiBjb21waWxhdGlvbiBwcm9taXNlcyB3aGljaCBhcmUgdXNlZCBpbiBgY29tcGlsZUFzeW5jKClgLlxyXG5cdCAqL1xyXG5cdGNyZWF0ZVJlbmRlclBpcGVsaW5lKCByZW5kZXJPYmplY3QsIHByb21pc2VzICkge1xyXG5cclxuXHRcdGNvbnN0IHsgb2JqZWN0LCBtYXRlcmlhbCwgZ2VvbWV0cnksIHBpcGVsaW5lIH0gPSByZW5kZXJPYmplY3Q7XHJcblx0XHRjb25zdCB7IHZlcnRleFByb2dyYW0sIGZyYWdtZW50UHJvZ3JhbSB9ID0gcGlwZWxpbmU7XHJcblxyXG5cdFx0Y29uc3QgYmFja2VuZCA9IHRoaXMuYmFja2VuZDtcclxuXHRcdGNvbnN0IGRldmljZSA9IGJhY2tlbmQuZGV2aWNlO1xyXG5cdFx0Y29uc3QgdXRpbHMgPSBiYWNrZW5kLnV0aWxzO1xyXG5cclxuXHRcdGNvbnN0IHBpcGVsaW5lRGF0YSA9IGJhY2tlbmQuZ2V0KCBwaXBlbGluZSApO1xyXG5cclxuXHRcdC8vIGJpbmQgZ3JvdXAgbGF5b3V0c1xyXG5cclxuXHRcdGNvbnN0IGJpbmRHcm91cExheW91dHMgPSBbXTtcclxuXHJcblx0XHRmb3IgKCBjb25zdCBiaW5kR3JvdXAgb2YgcmVuZGVyT2JqZWN0LmdldEJpbmRpbmdzKCkgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBiaW5kaW5nc0RhdGEgPSBiYWNrZW5kLmdldCggYmluZEdyb3VwICk7XHJcblxyXG5cdFx0XHRiaW5kR3JvdXBMYXlvdXRzLnB1c2goIGJpbmRpbmdzRGF0YS5sYXlvdXQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gdmVydGV4IGJ1ZmZlcnNcclxuXHJcblx0XHRjb25zdCB2ZXJ0ZXhCdWZmZXJzID0gYmFja2VuZC5hdHRyaWJ1dGVVdGlscy5jcmVhdGVTaGFkZXJWZXJ0ZXhCdWZmZXJzKCByZW5kZXJPYmplY3QgKTtcclxuXHJcblx0XHQvLyBibGVuZGluZ1xyXG5cclxuXHRcdGxldCBibGVuZGluZztcclxuXHJcblx0XHRpZiAoIG1hdGVyaWFsLnRyYW5zcGFyZW50ID09PSB0cnVlICYmIG1hdGVyaWFsLmJsZW5kaW5nICE9PSBOb0JsZW5kaW5nICkge1xyXG5cclxuXHRcdFx0YmxlbmRpbmcgPSB0aGlzLl9nZXRCbGVuZGluZyggbWF0ZXJpYWwgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gc3RlbmNpbFxyXG5cclxuXHRcdGxldCBzdGVuY2lsRnJvbnQgPSB7fTtcclxuXHJcblx0XHRpZiAoIG1hdGVyaWFsLnN0ZW5jaWxXcml0ZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdHN0ZW5jaWxGcm9udCA9IHtcclxuXHRcdFx0XHRjb21wYXJlOiB0aGlzLl9nZXRTdGVuY2lsQ29tcGFyZSggbWF0ZXJpYWwgKSxcclxuXHRcdFx0XHRmYWlsT3A6IHRoaXMuX2dldFN0ZW5jaWxPcGVyYXRpb24oIG1hdGVyaWFsLnN0ZW5jaWxGYWlsICksXHJcblx0XHRcdFx0ZGVwdGhGYWlsT3A6IHRoaXMuX2dldFN0ZW5jaWxPcGVyYXRpb24oIG1hdGVyaWFsLnN0ZW5jaWxaRmFpbCApLFxyXG5cdFx0XHRcdHBhc3NPcDogdGhpcy5fZ2V0U3RlbmNpbE9wZXJhdGlvbiggbWF0ZXJpYWwuc3RlbmNpbFpQYXNzIClcclxuXHRcdFx0fTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgY29sb3JXcml0ZU1hc2sgPSB0aGlzLl9nZXRDb2xvcldyaXRlTWFzayggbWF0ZXJpYWwgKTtcclxuXHJcblx0XHRjb25zdCB0YXJnZXRzID0gW107XHJcblxyXG5cdFx0aWYgKCByZW5kZXJPYmplY3QuY29udGV4dC50ZXh0dXJlcyAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGNvbnN0IHRleHR1cmVzID0gcmVuZGVyT2JqZWN0LmNvbnRleHQudGV4dHVyZXM7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB0ZXh0dXJlcy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGNvbG9yRm9ybWF0ID0gdXRpbHMuZ2V0VGV4dHVyZUZvcm1hdEdQVSggdGV4dHVyZXNbIGkgXSApO1xyXG5cclxuXHRcdFx0XHR0YXJnZXRzLnB1c2goIHtcclxuXHRcdFx0XHRcdGZvcm1hdDogY29sb3JGb3JtYXQsXHJcblx0XHRcdFx0XHRibGVuZDogYmxlbmRpbmcsXHJcblx0XHRcdFx0XHR3cml0ZU1hc2s6IGNvbG9yV3JpdGVNYXNrXHJcblx0XHRcdFx0fSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRjb25zdCBjb2xvckZvcm1hdCA9IHV0aWxzLmdldEN1cnJlbnRDb2xvckZvcm1hdCggcmVuZGVyT2JqZWN0LmNvbnRleHQgKTtcclxuXHJcblx0XHRcdHRhcmdldHMucHVzaCgge1xyXG5cdFx0XHRcdGZvcm1hdDogY29sb3JGb3JtYXQsXHJcblx0XHRcdFx0YmxlbmQ6IGJsZW5kaW5nLFxyXG5cdFx0XHRcdHdyaXRlTWFzazogY29sb3JXcml0ZU1hc2tcclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCB2ZXJ0ZXhNb2R1bGUgPSBiYWNrZW5kLmdldCggdmVydGV4UHJvZ3JhbSApLm1vZHVsZTtcclxuXHRcdGNvbnN0IGZyYWdtZW50TW9kdWxlID0gYmFja2VuZC5nZXQoIGZyYWdtZW50UHJvZ3JhbSApLm1vZHVsZTtcclxuXHJcblx0XHRjb25zdCBwcmltaXRpdmVTdGF0ZSA9IHRoaXMuX2dldFByaW1pdGl2ZVN0YXRlKCBvYmplY3QsIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG5cdFx0Y29uc3QgZGVwdGhDb21wYXJlID0gdGhpcy5fZ2V0RGVwdGhDb21wYXJlKCBtYXRlcmlhbCApO1xyXG5cdFx0Y29uc3QgZGVwdGhTdGVuY2lsRm9ybWF0ID0gdXRpbHMuZ2V0Q3VycmVudERlcHRoU3RlbmNpbEZvcm1hdCggcmVuZGVyT2JqZWN0LmNvbnRleHQgKTtcclxuXHJcblx0XHRjb25zdCBzYW1wbGVDb3VudCA9IHRoaXMuX2dldFNhbXBsZUNvdW50KCByZW5kZXJPYmplY3QuY29udGV4dCApO1xyXG5cclxuXHRcdGNvbnN0IHBpcGVsaW5lRGVzY3JpcHRvciA9IHtcclxuXHRcdFx0bGFiZWw6IGByZW5kZXJQaXBlbGluZV8keyBtYXRlcmlhbC5uYW1lIHx8IG1hdGVyaWFsLnR5cGUgfV8keyBtYXRlcmlhbC5pZCB9YCxcclxuXHRcdFx0dmVydGV4OiBPYmplY3QuYXNzaWduKCB7fSwgdmVydGV4TW9kdWxlLCB7IGJ1ZmZlcnM6IHZlcnRleEJ1ZmZlcnMgfSApLFxyXG5cdFx0XHRmcmFnbWVudDogT2JqZWN0LmFzc2lnbigge30sIGZyYWdtZW50TW9kdWxlLCB7IHRhcmdldHMgfSApLFxyXG5cdFx0XHRwcmltaXRpdmU6IHByaW1pdGl2ZVN0YXRlLFxyXG5cdFx0XHRtdWx0aXNhbXBsZToge1xyXG5cdFx0XHRcdGNvdW50OiBzYW1wbGVDb3VudCxcclxuXHRcdFx0XHRhbHBoYVRvQ292ZXJhZ2VFbmFibGVkOiBtYXRlcmlhbC5hbHBoYVRvQ292ZXJhZ2UgJiYgc2FtcGxlQ291bnQgPiAxXHJcblx0XHRcdH0sXHJcblx0XHRcdGxheW91dDogZGV2aWNlLmNyZWF0ZVBpcGVsaW5lTGF5b3V0KCB7XHJcblx0XHRcdFx0YmluZEdyb3VwTGF5b3V0c1xyXG5cdFx0XHR9IClcclxuXHRcdH07XHJcblxyXG5cclxuXHRcdGNvbnN0IGRlcHRoU3RlbmNpbCA9IHt9O1xyXG5cdFx0Y29uc3QgcmVuZGVyRGVwdGggPSByZW5kZXJPYmplY3QuY29udGV4dC5kZXB0aDtcclxuXHRcdGNvbnN0IHJlbmRlclN0ZW5jaWwgPSByZW5kZXJPYmplY3QuY29udGV4dC5zdGVuY2lsO1xyXG5cclxuXHRcdGlmICggcmVuZGVyRGVwdGggPT09IHRydWUgfHwgcmVuZGVyU3RlbmNpbCA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdGlmICggcmVuZGVyRGVwdGggPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdGRlcHRoU3RlbmNpbC5mb3JtYXQgPSBkZXB0aFN0ZW5jaWxGb3JtYXQ7XHJcblx0XHRcdFx0ZGVwdGhTdGVuY2lsLmRlcHRoV3JpdGVFbmFibGVkID0gbWF0ZXJpYWwuZGVwdGhXcml0ZTtcclxuXHRcdFx0XHRkZXB0aFN0ZW5jaWwuZGVwdGhDb21wYXJlID0gZGVwdGhDb21wYXJlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCByZW5kZXJTdGVuY2lsID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRkZXB0aFN0ZW5jaWwuc3RlbmNpbEZyb250ID0gc3RlbmNpbEZyb250O1xyXG5cdFx0XHRcdGRlcHRoU3RlbmNpbC5zdGVuY2lsQmFjayA9IHt9OyAvLyB0aHJlZS5qcyBkb2VzIG5vdCBwcm92aWRlIGFuIEFQSSB0byBjb25maWd1cmUgdGhlIGJhY2sgZnVuY3Rpb24gKGdsLnN0ZW5jaWxGdW5jU2VwYXJhdGUoKSB3YXMgbmV2ZXIgdXNlZClcclxuXHRcdFx0XHRkZXB0aFN0ZW5jaWwuc3RlbmNpbFJlYWRNYXNrID0gbWF0ZXJpYWwuc3RlbmNpbEZ1bmNNYXNrO1xyXG5cdFx0XHRcdGRlcHRoU3RlbmNpbC5zdGVuY2lsV3JpdGVNYXNrID0gbWF0ZXJpYWwuc3RlbmNpbFdyaXRlTWFzaztcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWwucG9seWdvbk9mZnNldCA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0ZGVwdGhTdGVuY2lsLmRlcHRoQmlhcyA9IG1hdGVyaWFsLnBvbHlnb25PZmZzZXRVbml0cztcclxuXHRcdFx0XHRkZXB0aFN0ZW5jaWwuZGVwdGhCaWFzU2xvcGVTY2FsZSA9IG1hdGVyaWFsLnBvbHlnb25PZmZzZXRGYWN0b3I7XHJcblx0XHRcdFx0ZGVwdGhTdGVuY2lsLmRlcHRoQmlhc0NsYW1wID0gMDsgLy8gdGhyZWUuanMgZG9lcyBub3QgcHJvdmlkZSBhbiBBUEkgdG8gY29uZmlndXJlIHRoaXMgdmFsdWVcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHBpcGVsaW5lRGVzY3JpcHRvci5kZXB0aFN0ZW5jaWwgPSBkZXB0aFN0ZW5jaWw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHJcblx0XHRpZiAoIHByb21pc2VzID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0cGlwZWxpbmVEYXRhLnBpcGVsaW5lID0gZGV2aWNlLmNyZWF0ZVJlbmRlclBpcGVsaW5lKCBwaXBlbGluZURlc2NyaXB0b3IgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc3QgcCA9IG5ldyBQcm9taXNlKCAoIHJlc29sdmUgLyosIHJlamVjdCovICkgPT4ge1xyXG5cclxuXHRcdFx0XHRkZXZpY2UuY3JlYXRlUmVuZGVyUGlwZWxpbmVBc3luYyggcGlwZWxpbmVEZXNjcmlwdG9yICkudGhlbiggcGlwZWxpbmUgPT4ge1xyXG5cclxuXHRcdFx0XHRcdHBpcGVsaW5lRGF0YS5waXBlbGluZSA9IHBpcGVsaW5lO1xyXG5cdFx0XHRcdFx0cmVzb2x2ZSgpO1xyXG5cclxuXHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRwcm9taXNlcy5wdXNoKCBwICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgR1BVIHJlbmRlciBidW5kbGUgZW5jb2RlciBmb3IgdGhlIGdpdmVuIHJlbmRlciBjb250ZXh0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSZW5kZXJDb250ZXh0fSByZW5kZXJDb250ZXh0IC0gVGhlIHJlbmRlciBjb250ZXh0LlxyXG5cdCAqIEByZXR1cm4ge0dQVVJlbmRlckJ1bmRsZUVuY29kZXJ9IFRoZSBHUFUgcmVuZGVyIGJ1bmRsZSBlbmNvZGVyLlxyXG5cdCAqL1xyXG5cdGNyZWF0ZUJ1bmRsZUVuY29kZXIoIHJlbmRlckNvbnRleHQgKSB7XHJcblxyXG5cdFx0Y29uc3QgYmFja2VuZCA9IHRoaXMuYmFja2VuZDtcclxuXHRcdGNvbnN0IHsgdXRpbHMsIGRldmljZSB9ID0gYmFja2VuZDtcclxuXHJcblx0XHRjb25zdCBkZXB0aFN0ZW5jaWxGb3JtYXQgPSB1dGlscy5nZXRDdXJyZW50RGVwdGhTdGVuY2lsRm9ybWF0KCByZW5kZXJDb250ZXh0ICk7XHJcblx0XHRjb25zdCBjb2xvckZvcm1hdCA9IHV0aWxzLmdldEN1cnJlbnRDb2xvckZvcm1hdCggcmVuZGVyQ29udGV4dCApO1xyXG5cdFx0Y29uc3Qgc2FtcGxlQ291bnQgPSB0aGlzLl9nZXRTYW1wbGVDb3VudCggcmVuZGVyQ29udGV4dCApO1xyXG5cclxuXHRcdGNvbnN0IGRlc2NyaXB0b3IgPSB7XHJcblx0XHRcdGxhYmVsOiAncmVuZGVyQnVuZGxlRW5jb2RlcicsXHJcblx0XHRcdGNvbG9yRm9ybWF0czogWyBjb2xvckZvcm1hdCBdLFxyXG5cdFx0XHRkZXB0aFN0ZW5jaWxGb3JtYXQsXHJcblx0XHRcdHNhbXBsZUNvdW50XHJcblx0XHR9O1xyXG5cclxuXHRcdHJldHVybiBkZXZpY2UuY3JlYXRlUmVuZGVyQnVuZGxlRW5jb2RlciggZGVzY3JpcHRvciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgYSBjb21wdXRlIHBpcGVsaW5lIGZvciB0aGUgZ2l2ZW4gY29tcHV0ZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtDb21wdXRlUGlwZWxpbmV9IHBpcGVsaW5lIC0gVGhlIGNvbXB1dGUgcGlwZWxpbmUuXHJcblx0ICogQHBhcmFtIHtBcnJheTxCaW5kR3JvdXA+fSBiaW5kaW5ncyAtIFRoZSBiaW5kaW5ncy5cclxuXHQgKi9cclxuXHRjcmVhdGVDb21wdXRlUGlwZWxpbmUoIHBpcGVsaW5lLCBiaW5kaW5ncyApIHtcclxuXHJcblx0XHRjb25zdCBiYWNrZW5kID0gdGhpcy5iYWNrZW5kO1xyXG5cdFx0Y29uc3QgZGV2aWNlID0gYmFja2VuZC5kZXZpY2U7XHJcblxyXG5cdFx0Y29uc3QgY29tcHV0ZVByb2dyYW0gPSBiYWNrZW5kLmdldCggcGlwZWxpbmUuY29tcHV0ZVByb2dyYW0gKS5tb2R1bGU7XHJcblxyXG5cdFx0Y29uc3QgcGlwZWxpbmVHUFUgPSBiYWNrZW5kLmdldCggcGlwZWxpbmUgKTtcclxuXHJcblx0XHQvLyBiaW5kIGdyb3VwIGxheW91dHNcclxuXHJcblx0XHRjb25zdCBiaW5kR3JvdXBMYXlvdXRzID0gW107XHJcblxyXG5cdFx0Zm9yICggY29uc3QgYmluZGluZ3NHcm91cCBvZiBiaW5kaW5ncyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGJpbmRpbmdzRGF0YSA9IGJhY2tlbmQuZ2V0KCBiaW5kaW5nc0dyb3VwICk7XHJcblxyXG5cdFx0XHRiaW5kR3JvdXBMYXlvdXRzLnB1c2goIGJpbmRpbmdzRGF0YS5sYXlvdXQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cGlwZWxpbmVHUFUucGlwZWxpbmUgPSBkZXZpY2UuY3JlYXRlQ29tcHV0ZVBpcGVsaW5lKCB7XHJcblx0XHRcdGNvbXB1dGU6IGNvbXB1dGVQcm9ncmFtLFxyXG5cdFx0XHRsYXlvdXQ6IGRldmljZS5jcmVhdGVQaXBlbGluZUxheW91dCgge1xyXG5cdFx0XHRcdGJpbmRHcm91cExheW91dHNcclxuXHRcdFx0fSApXHJcblx0XHR9ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgYmxlbmRpbmcgc3RhdGUgYXMgYSBkZXNjcmlwdG9yIG9iamVjdCByZXF1aXJlZFxyXG5cdCAqIGZvciB0aGUgcGlwZWxpbmUgY3JlYXRpb24uXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7TWF0ZXJpYWx9IG1hdGVyaWFsIC0gVGhlIG1hdGVyaWFsLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdH0gVGhlIGJsZW5kaW5nIHN0YXRlLlxyXG5cdCAqL1xyXG5cdF9nZXRCbGVuZGluZyggbWF0ZXJpYWwgKSB7XHJcblxyXG5cdFx0bGV0IGNvbG9yLCBhbHBoYTtcclxuXHJcblx0XHRjb25zdCBibGVuZGluZyA9IG1hdGVyaWFsLmJsZW5kaW5nO1xyXG5cdFx0Y29uc3QgYmxlbmRTcmMgPSBtYXRlcmlhbC5ibGVuZFNyYztcclxuXHRcdGNvbnN0IGJsZW5kRHN0ID0gbWF0ZXJpYWwuYmxlbmREc3Q7XHJcblx0XHRjb25zdCBibGVuZEVxdWF0aW9uID0gbWF0ZXJpYWwuYmxlbmRFcXVhdGlvbjtcclxuXHJcblxyXG5cdFx0aWYgKCBibGVuZGluZyA9PT0gQ3VzdG9tQmxlbmRpbmcgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBibGVuZFNyY0FscGhhID0gbWF0ZXJpYWwuYmxlbmRTcmNBbHBoYSAhPT0gbnVsbCA/IG1hdGVyaWFsLmJsZW5kU3JjQWxwaGEgOiBibGVuZFNyYztcclxuXHRcdFx0Y29uc3QgYmxlbmREc3RBbHBoYSA9IG1hdGVyaWFsLmJsZW5kRHN0QWxwaGEgIT09IG51bGwgPyBtYXRlcmlhbC5ibGVuZERzdEFscGhhIDogYmxlbmREc3Q7XHJcblx0XHRcdGNvbnN0IGJsZW5kRXF1YXRpb25BbHBoYSA9IG1hdGVyaWFsLmJsZW5kRXF1YXRpb25BbHBoYSAhPT0gbnVsbCA/IG1hdGVyaWFsLmJsZW5kRXF1YXRpb25BbHBoYSA6IGJsZW5kRXF1YXRpb247XHJcblxyXG5cdFx0XHRjb2xvciA9IHtcclxuXHRcdFx0XHRzcmNGYWN0b3I6IHRoaXMuX2dldEJsZW5kRmFjdG9yKCBibGVuZFNyYyApLFxyXG5cdFx0XHRcdGRzdEZhY3RvcjogdGhpcy5fZ2V0QmxlbmRGYWN0b3IoIGJsZW5kRHN0ICksXHJcblx0XHRcdFx0b3BlcmF0aW9uOiB0aGlzLl9nZXRCbGVuZE9wZXJhdGlvbiggYmxlbmRFcXVhdGlvbiApXHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHRhbHBoYSA9IHtcclxuXHRcdFx0XHRzcmNGYWN0b3I6IHRoaXMuX2dldEJsZW5kRmFjdG9yKCBibGVuZFNyY0FscGhhICksXHJcblx0XHRcdFx0ZHN0RmFjdG9yOiB0aGlzLl9nZXRCbGVuZEZhY3RvciggYmxlbmREc3RBbHBoYSApLFxyXG5cdFx0XHRcdG9wZXJhdGlvbjogdGhpcy5fZ2V0QmxlbmRPcGVyYXRpb24oIGJsZW5kRXF1YXRpb25BbHBoYSApXHJcblx0XHRcdH07XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGNvbnN0IHByZW11bHRpcGxpZWRBbHBoYSA9IG1hdGVyaWFsLnByZW11bHRpcGxpZWRBbHBoYTtcclxuXHJcblx0XHRcdGNvbnN0IHNldEJsZW5kID0gKCBzcmNSR0IsIGRzdFJHQiwgc3JjQWxwaGEsIGRzdEFscGhhICkgPT4ge1xyXG5cclxuXHRcdFx0XHRjb2xvciA9IHtcclxuXHRcdFx0XHRcdHNyY0ZhY3Rvcjogc3JjUkdCLFxyXG5cdFx0XHRcdFx0ZHN0RmFjdG9yOiBkc3RSR0IsXHJcblx0XHRcdFx0XHRvcGVyYXRpb246IEdQVUJsZW5kT3BlcmF0aW9uLkFkZFxyXG5cdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdGFscGhhID0ge1xyXG5cdFx0XHRcdFx0c3JjRmFjdG9yOiBzcmNBbHBoYSxcclxuXHRcdFx0XHRcdGRzdEZhY3RvcjogZHN0QWxwaGEsXHJcblx0XHRcdFx0XHRvcGVyYXRpb246IEdQVUJsZW5kT3BlcmF0aW9uLkFkZFxyXG5cdFx0XHRcdH07XHJcblxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0aWYgKCBwcmVtdWx0aXBsaWVkQWxwaGEgKSB7XHJcblxyXG5cdFx0XHRcdHN3aXRjaCAoIGJsZW5kaW5nICkge1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgTm9ybWFsQmxlbmRpbmc6XHJcblx0XHRcdFx0XHRcdHNldEJsZW5kKCBHUFVCbGVuZEZhY3Rvci5PbmUsIEdQVUJsZW5kRmFjdG9yLk9uZU1pbnVzU3JjQWxwaGEsIEdQVUJsZW5kRmFjdG9yLk9uZSwgR1BVQmxlbmRGYWN0b3IuT25lTWludXNTcmNBbHBoYSApO1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRjYXNlIEFkZGl0aXZlQmxlbmRpbmc6XHJcblx0XHRcdFx0XHRcdHNldEJsZW5kKCBHUFVCbGVuZEZhY3Rvci5PbmUsIEdQVUJsZW5kRmFjdG9yLk9uZSwgR1BVQmxlbmRGYWN0b3IuT25lLCBHUFVCbGVuZEZhY3Rvci5PbmUgKTtcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0Y2FzZSBTdWJ0cmFjdGl2ZUJsZW5kaW5nOlxyXG5cdFx0XHRcdFx0XHRzZXRCbGVuZCggR1BVQmxlbmRGYWN0b3IuWmVybywgR1BVQmxlbmRGYWN0b3IuT25lTWludXNTcmMsIEdQVUJsZW5kRmFjdG9yLlplcm8sIEdQVUJsZW5kRmFjdG9yLk9uZSApO1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRjYXNlIE11bHRpcGx5QmxlbmRpbmc6XHJcblx0XHRcdFx0XHRcdHNldEJsZW5kKCBHUFVCbGVuZEZhY3Rvci5aZXJvLCBHUFVCbGVuZEZhY3Rvci5TcmMsIEdQVUJsZW5kRmFjdG9yLlplcm8sIEdQVUJsZW5kRmFjdG9yLlNyY0FscGhhICk7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRzd2l0Y2ggKCBibGVuZGluZyApIHtcclxuXHJcblx0XHRcdFx0XHRjYXNlIE5vcm1hbEJsZW5kaW5nOlxyXG5cdFx0XHRcdFx0XHRzZXRCbGVuZCggR1BVQmxlbmRGYWN0b3IuU3JjQWxwaGEsIEdQVUJsZW5kRmFjdG9yLk9uZU1pbnVzU3JjQWxwaGEsIEdQVUJsZW5kRmFjdG9yLk9uZSwgR1BVQmxlbmRGYWN0b3IuT25lTWludXNTcmNBbHBoYSApO1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRjYXNlIEFkZGl0aXZlQmxlbmRpbmc6XHJcblx0XHRcdFx0XHRcdHNldEJsZW5kKCBHUFVCbGVuZEZhY3Rvci5TcmNBbHBoYSwgR1BVQmxlbmRGYWN0b3IuT25lLCBHUFVCbGVuZEZhY3Rvci5TcmNBbHBoYSwgR1BVQmxlbmRGYWN0b3IuT25lICk7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgU3VidHJhY3RpdmVCbGVuZGluZzpcclxuXHRcdFx0XHRcdFx0c2V0QmxlbmQoIEdQVUJsZW5kRmFjdG9yLlplcm8sIEdQVUJsZW5kRmFjdG9yLk9uZU1pbnVzU3JjLCBHUFVCbGVuZEZhY3Rvci5aZXJvLCBHUFVCbGVuZEZhY3Rvci5PbmUgKTtcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0Y2FzZSBNdWx0aXBseUJsZW5kaW5nOlxyXG5cdFx0XHRcdFx0XHRzZXRCbGVuZCggR1BVQmxlbmRGYWN0b3IuWmVybywgR1BVQmxlbmRGYWN0b3IuU3JjLCBHUFVCbGVuZEZhY3Rvci5aZXJvLCBHUFVCbGVuZEZhY3Rvci5TcmMgKTtcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBjb2xvciAhPT0gdW5kZWZpbmVkICYmIGFscGhhICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4geyBjb2xvciwgYWxwaGEgfTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdQVVJlbmRlcmVyOiBJbnZhbGlkIGJsZW5kaW5nOiAnLCBibGVuZGluZyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIEdQVSBibGVuZCBmYWN0b3Igd2hpY2ggaXMgcmVxdWlyZWQgZm9yIHRoZSBwaXBlbGluZSBjcmVhdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGJsZW5kIC0gVGhlIGJsZW5kIGZhY3RvciBhcyBhIHRocmVlLmpzIGNvbnN0YW50LlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIEdQVSBibGVuZCBmYWN0b3IuXHJcblx0ICovXHJcblx0X2dldEJsZW5kRmFjdG9yKCBibGVuZCApIHtcclxuXHJcblx0XHRsZXQgYmxlbmRGYWN0b3I7XHJcblxyXG5cdFx0c3dpdGNoICggYmxlbmQgKSB7XHJcblxyXG5cdFx0XHRjYXNlIFplcm9GYWN0b3I6XHJcblx0XHRcdFx0YmxlbmRGYWN0b3IgPSBHUFVCbGVuZEZhY3Rvci5aZXJvO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBPbmVGYWN0b3I6XHJcblx0XHRcdFx0YmxlbmRGYWN0b3IgPSBHUFVCbGVuZEZhY3Rvci5PbmU7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIFNyY0NvbG9yRmFjdG9yOlxyXG5cdFx0XHRcdGJsZW5kRmFjdG9yID0gR1BVQmxlbmRGYWN0b3IuU3JjO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBPbmVNaW51c1NyY0NvbG9yRmFjdG9yOlxyXG5cdFx0XHRcdGJsZW5kRmFjdG9yID0gR1BVQmxlbmRGYWN0b3IuT25lTWludXNTcmM7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIFNyY0FscGhhRmFjdG9yOlxyXG5cdFx0XHRcdGJsZW5kRmFjdG9yID0gR1BVQmxlbmRGYWN0b3IuU3JjQWxwaGE7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIE9uZU1pbnVzU3JjQWxwaGFGYWN0b3I6XHJcblx0XHRcdFx0YmxlbmRGYWN0b3IgPSBHUFVCbGVuZEZhY3Rvci5PbmVNaW51c1NyY0FscGhhO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBEc3RDb2xvckZhY3RvcjpcclxuXHRcdFx0XHRibGVuZEZhY3RvciA9IEdQVUJsZW5kRmFjdG9yLkRzdDtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgT25lTWludXNEc3RDb2xvckZhY3RvcjpcclxuXHRcdFx0XHRibGVuZEZhY3RvciA9IEdQVUJsZW5kRmFjdG9yLk9uZU1pbnVzRHN0Q29sb3I7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIERzdEFscGhhRmFjdG9yOlxyXG5cdFx0XHRcdGJsZW5kRmFjdG9yID0gR1BVQmxlbmRGYWN0b3IuRHN0QWxwaGE7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIE9uZU1pbnVzRHN0QWxwaGFGYWN0b3I6XHJcblx0XHRcdFx0YmxlbmRGYWN0b3IgPSBHUFVCbGVuZEZhY3Rvci5PbmVNaW51c0RzdEFscGhhO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBTcmNBbHBoYVNhdHVyYXRlRmFjdG9yOlxyXG5cdFx0XHRcdGJsZW5kRmFjdG9yID0gR1BVQmxlbmRGYWN0b3IuU3JjQWxwaGFTYXR1cmF0ZWQ7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIEJsZW5kQ29sb3JGYWN0b3I6XHJcblx0XHRcdFx0YmxlbmRGYWN0b3IgPSBHUFVCbGVuZEZhY3Rvci5Db25zdGFudDtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgT25lTWludXNCbGVuZENvbG9yRmFjdG9yOlxyXG5cdFx0XHRcdGJsZW5kRmFjdG9yID0gR1BVQmxlbmRGYWN0b3IuT25lTWludXNDb25zdGFudDtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdQVVJlbmRlcmVyOiBCbGVuZCBmYWN0b3Igbm90IHN1cHBvcnRlZC4nLCBibGVuZCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gYmxlbmRGYWN0b3I7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgR1BVIHN0ZW5jaWwgY29tcGFyZSBmdW5jdGlvbiB3aGljaCBpcyByZXF1aXJlZCBmb3IgdGhlIHBpcGVsaW5lIGNyZWF0aW9uLlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge01hdGVyaWFsfSBtYXRlcmlhbCAtIFRoZSBtYXRlcmlhbC5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBHUFUgc3RlbmNpbCBjb21wYXJlIGZ1bmN0aW9uLlxyXG5cdCAqL1xyXG5cdF9nZXRTdGVuY2lsQ29tcGFyZSggbWF0ZXJpYWwgKSB7XHJcblxyXG5cdFx0bGV0IHN0ZW5jaWxDb21wYXJlO1xyXG5cclxuXHRcdGNvbnN0IHN0ZW5jaWxGdW5jID0gbWF0ZXJpYWwuc3RlbmNpbEZ1bmM7XHJcblxyXG5cdFx0c3dpdGNoICggc3RlbmNpbEZ1bmMgKSB7XHJcblxyXG5cdFx0XHRjYXNlIE5ldmVyU3RlbmNpbEZ1bmM6XHJcblx0XHRcdFx0c3RlbmNpbENvbXBhcmUgPSBHUFVDb21wYXJlRnVuY3Rpb24uTmV2ZXI7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIEFsd2F5c1N0ZW5jaWxGdW5jOlxyXG5cdFx0XHRcdHN0ZW5jaWxDb21wYXJlID0gR1BVQ29tcGFyZUZ1bmN0aW9uLkFsd2F5cztcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgTGVzc1N0ZW5jaWxGdW5jOlxyXG5cdFx0XHRcdHN0ZW5jaWxDb21wYXJlID0gR1BVQ29tcGFyZUZ1bmN0aW9uLkxlc3M7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIExlc3NFcXVhbFN0ZW5jaWxGdW5jOlxyXG5cdFx0XHRcdHN0ZW5jaWxDb21wYXJlID0gR1BVQ29tcGFyZUZ1bmN0aW9uLkxlc3NFcXVhbDtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgRXF1YWxTdGVuY2lsRnVuYzpcclxuXHRcdFx0XHRzdGVuY2lsQ29tcGFyZSA9IEdQVUNvbXBhcmVGdW5jdGlvbi5FcXVhbDtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgR3JlYXRlckVxdWFsU3RlbmNpbEZ1bmM6XHJcblx0XHRcdFx0c3RlbmNpbENvbXBhcmUgPSBHUFVDb21wYXJlRnVuY3Rpb24uR3JlYXRlckVxdWFsO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBHcmVhdGVyU3RlbmNpbEZ1bmM6XHJcblx0XHRcdFx0c3RlbmNpbENvbXBhcmUgPSBHUFVDb21wYXJlRnVuY3Rpb24uR3JlYXRlcjtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgTm90RXF1YWxTdGVuY2lsRnVuYzpcclxuXHRcdFx0XHRzdGVuY2lsQ29tcGFyZSA9IEdQVUNvbXBhcmVGdW5jdGlvbi5Ob3RFcXVhbDtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdQVVJlbmRlcmVyOiBJbnZhbGlkIHN0ZW5jaWwgZnVuY3Rpb24uJywgc3RlbmNpbEZ1bmMgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHN0ZW5jaWxDb21wYXJlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIEdQVSBzdGVuY2lsIG9wZXJhdGlvbiB3aGljaCBpcyByZXF1aXJlZCBmb3IgdGhlIHBpcGVsaW5lIGNyZWF0aW9uLlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gb3AgLSBBIHRocmVlLmpzIGNvbnN0YW50IGRlZmluaW5nIHRoZSBzdGVuY2lsIG9wZXJhdGlvbi5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBHUFUgc3RlbmNpbCBvcGVyYXRpb24uXHJcblx0ICovXHJcblx0X2dldFN0ZW5jaWxPcGVyYXRpb24oIG9wICkge1xyXG5cclxuXHRcdGxldCBzdGVuY2lsT3BlcmF0aW9uO1xyXG5cclxuXHRcdHN3aXRjaCAoIG9wICkge1xyXG5cclxuXHRcdFx0Y2FzZSBLZWVwU3RlbmNpbE9wOlxyXG5cdFx0XHRcdHN0ZW5jaWxPcGVyYXRpb24gPSBHUFVTdGVuY2lsT3BlcmF0aW9uLktlZXA7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIFplcm9TdGVuY2lsT3A6XHJcblx0XHRcdFx0c3RlbmNpbE9wZXJhdGlvbiA9IEdQVVN0ZW5jaWxPcGVyYXRpb24uWmVybztcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgUmVwbGFjZVN0ZW5jaWxPcDpcclxuXHRcdFx0XHRzdGVuY2lsT3BlcmF0aW9uID0gR1BVU3RlbmNpbE9wZXJhdGlvbi5SZXBsYWNlO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBJbnZlcnRTdGVuY2lsT3A6XHJcblx0XHRcdFx0c3RlbmNpbE9wZXJhdGlvbiA9IEdQVVN0ZW5jaWxPcGVyYXRpb24uSW52ZXJ0O1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBJbmNyZW1lbnRTdGVuY2lsT3A6XHJcblx0XHRcdFx0c3RlbmNpbE9wZXJhdGlvbiA9IEdQVVN0ZW5jaWxPcGVyYXRpb24uSW5jcmVtZW50Q2xhbXA7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIERlY3JlbWVudFN0ZW5jaWxPcDpcclxuXHRcdFx0XHRzdGVuY2lsT3BlcmF0aW9uID0gR1BVU3RlbmNpbE9wZXJhdGlvbi5EZWNyZW1lbnRDbGFtcDtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgSW5jcmVtZW50V3JhcFN0ZW5jaWxPcDpcclxuXHRcdFx0XHRzdGVuY2lsT3BlcmF0aW9uID0gR1BVU3RlbmNpbE9wZXJhdGlvbi5JbmNyZW1lbnRXcmFwO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBEZWNyZW1lbnRXcmFwU3RlbmNpbE9wOlxyXG5cdFx0XHRcdHN0ZW5jaWxPcGVyYXRpb24gPSBHUFVTdGVuY2lsT3BlcmF0aW9uLkRlY3JlbWVudFdyYXA7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHUFVSZW5kZXJlcjogSW52YWxpZCBzdGVuY2lsIG9wZXJhdGlvbi4nLCBzdGVuY2lsT3BlcmF0aW9uICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBzdGVuY2lsT3BlcmF0aW9uO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIEdQVSBibGVuZCBvcGVyYXRpb24gd2hpY2ggaXMgcmVxdWlyZWQgZm9yIHRoZSBwaXBlbGluZSBjcmVhdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGJsZW5kRXF1YXRpb24gLSBBIHRocmVlLmpzIGNvbnN0YW50IGRlZmluaW5nIHRoZSBibGVuZCBlcXVhdGlvbi5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBHUFUgYmxlbmQgb3BlcmF0aW9uLlxyXG5cdCAqL1xyXG5cdF9nZXRCbGVuZE9wZXJhdGlvbiggYmxlbmRFcXVhdGlvbiApIHtcclxuXHJcblx0XHRsZXQgYmxlbmRPcGVyYXRpb247XHJcblxyXG5cdFx0c3dpdGNoICggYmxlbmRFcXVhdGlvbiApIHtcclxuXHJcblx0XHRcdGNhc2UgQWRkRXF1YXRpb246XHJcblx0XHRcdFx0YmxlbmRPcGVyYXRpb24gPSBHUFVCbGVuZE9wZXJhdGlvbi5BZGQ7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIFN1YnRyYWN0RXF1YXRpb246XHJcblx0XHRcdFx0YmxlbmRPcGVyYXRpb24gPSBHUFVCbGVuZE9wZXJhdGlvbi5TdWJ0cmFjdDtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgUmV2ZXJzZVN1YnRyYWN0RXF1YXRpb246XHJcblx0XHRcdFx0YmxlbmRPcGVyYXRpb24gPSBHUFVCbGVuZE9wZXJhdGlvbi5SZXZlcnNlU3VidHJhY3Q7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIE1pbkVxdWF0aW9uOlxyXG5cdFx0XHRcdGJsZW5kT3BlcmF0aW9uID0gR1BVQmxlbmRPcGVyYXRpb24uTWluO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBNYXhFcXVhdGlvbjpcclxuXHRcdFx0XHRibGVuZE9wZXJhdGlvbiA9IEdQVUJsZW5kT3BlcmF0aW9uLk1heDtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdQVVBpcGVsaW5lVXRpbHM6IEJsZW5kIGVxdWF0aW9uIG5vdCBzdXBwb3J0ZWQuJywgYmxlbmRFcXVhdGlvbiApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gYmxlbmRPcGVyYXRpb247XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgcHJpbWl0aXZlIHN0YXRlIGFzIGEgZGVzY3JpcHRvciBvYmplY3QgcmVxdWlyZWRcclxuXHQgKiBmb3IgdGhlIHBpcGVsaW5lIGNyZWF0aW9uLlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge09iamVjdDNEfSBvYmplY3QgLSBUaGUgM0Qgb2JqZWN0LlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyR2VvbWV0cnl9IGdlb21ldHJ5IC0gVGhlIGdlb21ldHJ5LlxyXG5cdCAqIEBwYXJhbSB7TWF0ZXJpYWx9IG1hdGVyaWFsIC0gVGhlIG1hdGVyaWFsLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdH0gVGhlIHByaW1pdGl2ZSBzdGF0ZS5cclxuXHQgKi9cclxuXHRfZ2V0UHJpbWl0aXZlU3RhdGUoIG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsICkge1xyXG5cclxuXHRcdGNvbnN0IGRlc2NyaXB0b3IgPSB7fTtcclxuXHRcdGNvbnN0IHV0aWxzID0gdGhpcy5iYWNrZW5kLnV0aWxzO1xyXG5cclxuXHRcdGRlc2NyaXB0b3IudG9wb2xvZ3kgPSB1dGlscy5nZXRQcmltaXRpdmVUb3BvbG9neSggb2JqZWN0LCBtYXRlcmlhbCApO1xyXG5cclxuXHRcdGlmICggZ2VvbWV0cnkuaW5kZXggIT09IG51bGwgJiYgb2JqZWN0LmlzTGluZSA9PT0gdHJ1ZSAmJiBvYmplY3QuaXNMaW5lU2VnbWVudHMgIT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRkZXNjcmlwdG9yLnN0cmlwSW5kZXhGb3JtYXQgPSAoIGdlb21ldHJ5LmluZGV4LmFycmF5IGluc3RhbmNlb2YgVWludDE2QXJyYXkgKSA/IEdQVUluZGV4Rm9ybWF0LlVpbnQxNiA6IEdQVUluZGV4Rm9ybWF0LlVpbnQzMjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0c3dpdGNoICggbWF0ZXJpYWwuc2lkZSApIHtcclxuXHJcblx0XHRcdGNhc2UgRnJvbnRTaWRlOlxyXG5cdFx0XHRcdGRlc2NyaXB0b3IuZnJvbnRGYWNlID0gR1BVRnJvbnRGYWNlLkNDVztcclxuXHRcdFx0XHRkZXNjcmlwdG9yLmN1bGxNb2RlID0gR1BVQ3VsbE1vZGUuQmFjaztcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgQmFja1NpZGU6XHJcblx0XHRcdFx0ZGVzY3JpcHRvci5mcm9udEZhY2UgPSBHUFVGcm9udEZhY2UuQ0NXO1xyXG5cdFx0XHRcdGRlc2NyaXB0b3IuY3VsbE1vZGUgPSBHUFVDdWxsTW9kZS5Gcm9udDtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgRG91YmxlU2lkZTpcclxuXHRcdFx0XHRkZXNjcmlwdG9yLmZyb250RmFjZSA9IEdQVUZyb250RmFjZS5DQ1c7XHJcblx0XHRcdFx0ZGVzY3JpcHRvci5jdWxsTW9kZSA9IEdQVUN1bGxNb2RlLk5vbmU7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHUFVQaXBlbGluZVV0aWxzOiBVbmtub3duIG1hdGVyaWFsLnNpZGUgdmFsdWUuJywgbWF0ZXJpYWwuc2lkZSApO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZGVzY3JpcHRvcjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBHUFUgY29sb3Igd3JpdGUgbWFzayB3aGljaCBpcyByZXF1aXJlZCBmb3IgdGhlIHBpcGVsaW5lIGNyZWF0aW9uLlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge01hdGVyaWFsfSBtYXRlcmlhbCAtIFRoZSBtYXRlcmlhbC5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBHUFUgY29sb3Igd3JpdGUgbWFzay5cclxuXHQgKi9cclxuXHRfZ2V0Q29sb3JXcml0ZU1hc2soIG1hdGVyaWFsICkge1xyXG5cclxuXHRcdHJldHVybiAoIG1hdGVyaWFsLmNvbG9yV3JpdGUgPT09IHRydWUgKSA/IEdQVUNvbG9yV3JpdGVGbGFncy5BbGwgOiBHUFVDb2xvcldyaXRlRmxhZ3MuTm9uZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBHUFUgZGVwdGggY29tcGFyZSBmdW5jdGlvbiB3aGljaCBpcyByZXF1aXJlZCBmb3IgdGhlIHBpcGVsaW5lIGNyZWF0aW9uLlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge01hdGVyaWFsfSBtYXRlcmlhbCAtIFRoZSBtYXRlcmlhbC5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBHUFUgZGVwdGggY29tcGFyZSBmdW5jdGlvbi5cclxuXHQgKi9cclxuXHRfZ2V0RGVwdGhDb21wYXJlKCBtYXRlcmlhbCApIHtcclxuXHJcblx0XHRsZXQgZGVwdGhDb21wYXJlO1xyXG5cclxuXHRcdGlmICggbWF0ZXJpYWwuZGVwdGhUZXN0ID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdGRlcHRoQ29tcGFyZSA9IEdQVUNvbXBhcmVGdW5jdGlvbi5BbHdheXM7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGNvbnN0IGRlcHRoRnVuYyA9IG1hdGVyaWFsLmRlcHRoRnVuYztcclxuXHJcblx0XHRcdHN3aXRjaCAoIGRlcHRoRnVuYyApIHtcclxuXHJcblx0XHRcdFx0Y2FzZSBOZXZlckRlcHRoOlxyXG5cdFx0XHRcdFx0ZGVwdGhDb21wYXJlID0gR1BVQ29tcGFyZUZ1bmN0aW9uLk5ldmVyO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdGNhc2UgQWx3YXlzRGVwdGg6XHJcblx0XHRcdFx0XHRkZXB0aENvbXBhcmUgPSBHUFVDb21wYXJlRnVuY3Rpb24uQWx3YXlzO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdGNhc2UgTGVzc0RlcHRoOlxyXG5cdFx0XHRcdFx0ZGVwdGhDb21wYXJlID0gR1BVQ29tcGFyZUZ1bmN0aW9uLkxlc3M7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0Y2FzZSBMZXNzRXF1YWxEZXB0aDpcclxuXHRcdFx0XHRcdGRlcHRoQ29tcGFyZSA9IEdQVUNvbXBhcmVGdW5jdGlvbi5MZXNzRXF1YWw7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0Y2FzZSBFcXVhbERlcHRoOlxyXG5cdFx0XHRcdFx0ZGVwdGhDb21wYXJlID0gR1BVQ29tcGFyZUZ1bmN0aW9uLkVxdWFsO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdGNhc2UgR3JlYXRlckVxdWFsRGVwdGg6XHJcblx0XHRcdFx0XHRkZXB0aENvbXBhcmUgPSBHUFVDb21wYXJlRnVuY3Rpb24uR3JlYXRlckVxdWFsO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdGNhc2UgR3JlYXRlckRlcHRoOlxyXG5cdFx0XHRcdFx0ZGVwdGhDb21wYXJlID0gR1BVQ29tcGFyZUZ1bmN0aW9uLkdyZWF0ZXI7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0Y2FzZSBOb3RFcXVhbERlcHRoOlxyXG5cdFx0XHRcdFx0ZGVwdGhDb21wYXJlID0gR1BVQ29tcGFyZUZ1bmN0aW9uLk5vdEVxdWFsO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR1BVUGlwZWxpbmVVdGlsczogSW52YWxpZCBkZXB0aCBmdW5jdGlvbi4nLCBkZXB0aEZ1bmMgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGRlcHRoQ29tcGFyZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgV2ViR1BVUGlwZWxpbmVVdGlscztcclxuIiwiaW1wb3J0IHsgd2Fybk9uY2UgfSBmcm9tICcuLi8uLi8uLi91dGlscy5qcyc7XHJcbmltcG9ydCBUaW1lc3RhbXBRdWVyeVBvb2wgZnJvbSAnLi4vLi4vY29tbW9uL1RpbWVzdGFtcFF1ZXJ5UG9vbC5qcyc7XHJcblxyXG4vKipcclxuICogTWFuYWdlcyBhIHBvb2wgb2YgV2ViR1BVIHRpbWVzdGFtcCBxdWVyaWVzIGZvciBwZXJmb3JtYW5jZSBtZWFzdXJlbWVudC5cclxuICogRXh0ZW5kcyB0aGUgYmFzZSBUaW1lc3RhbXBRdWVyeVBvb2wgdG8gcHJvdmlkZSBXZWJHUFUtc3BlY2lmaWMgaW1wbGVtZW50YXRpb24uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBUaW1lc3RhbXBRdWVyeVBvb2xcclxuICovXHJcbmNsYXNzIFdlYkdQVVRpbWVzdGFtcFF1ZXJ5UG9vbCBleHRlbmRzIFRpbWVzdGFtcFF1ZXJ5UG9vbCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgYSBuZXcgV2ViR1BVIHRpbWVzdGFtcCBxdWVyeSBwb29sLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtHUFVEZXZpY2V9IGRldmljZSAtIFRoZSBXZWJHUFUgZGV2aWNlIHRvIGNyZWF0ZSBxdWVyaWVzIG9uLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIHR5cGUgaWRlbnRpZmllciBmb3IgdGhpcyBxdWVyeSBwb29sLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbWF4UXVlcmllcz0yMDQ4XSAtIE1heGltdW0gbnVtYmVyIG9mIHF1ZXJpZXMgdGhpcyBwb29sIGNhbiBob2xkLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBkZXZpY2UsIHR5cGUsIG1heFF1ZXJpZXMgPSAyMDQ4ICkge1xyXG5cclxuXHRcdHN1cGVyKCBtYXhRdWVyaWVzICk7XHJcblx0XHR0aGlzLmRldmljZSA9IGRldmljZTtcclxuXHRcdHRoaXMudHlwZSA9IHR5cGU7XHJcblxyXG5cdFx0dGhpcy5xdWVyeVNldCA9IHRoaXMuZGV2aWNlLmNyZWF0ZVF1ZXJ5U2V0KCB7XHJcblx0XHRcdHR5cGU6ICd0aW1lc3RhbXAnLFxyXG5cdFx0XHRjb3VudDogdGhpcy5tYXhRdWVyaWVzLFxyXG5cdFx0XHRsYWJlbDogYHF1ZXJ5c2V0X2dsb2JhbF90aW1lc3RhbXBfJHt0eXBlfWBcclxuXHRcdH0gKTtcclxuXHJcblx0XHRjb25zdCBidWZmZXJTaXplID0gdGhpcy5tYXhRdWVyaWVzICogODtcclxuXHRcdHRoaXMucmVzb2x2ZUJ1ZmZlciA9IHRoaXMuZGV2aWNlLmNyZWF0ZUJ1ZmZlcigge1xyXG5cdFx0XHRsYWJlbDogYGJ1ZmZlcl90aW1lc3RhbXBfcmVzb2x2ZV8ke3R5cGV9YCxcclxuXHRcdFx0c2l6ZTogYnVmZmVyU2l6ZSxcclxuXHRcdFx0dXNhZ2U6IEdQVUJ1ZmZlclVzYWdlLlFVRVJZX1JFU09MVkUgfCBHUFVCdWZmZXJVc2FnZS5DT1BZX1NSQ1xyXG5cdFx0fSApO1xyXG5cclxuXHRcdHRoaXMucmVzdWx0QnVmZmVyID0gdGhpcy5kZXZpY2UuY3JlYXRlQnVmZmVyKCB7XHJcblx0XHRcdGxhYmVsOiBgYnVmZmVyX3RpbWVzdGFtcF9yZXN1bHRfJHt0eXBlfWAsXHJcblx0XHRcdHNpemU6IGJ1ZmZlclNpemUsXHJcblx0XHRcdHVzYWdlOiBHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVCB8IEdQVUJ1ZmZlclVzYWdlLk1BUF9SRUFEXHJcblx0XHR9ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWxsb2NhdGVzIGEgcGFpciBvZiBxdWVyaWVzIGZvciBhIGdpdmVuIHJlbmRlciBjb250ZXh0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IHJlbmRlckNvbnRleHQgLSBUaGUgcmVuZGVyIGNvbnRleHQgdG8gYWxsb2NhdGUgcXVlcmllcyBmb3IuXHJcblx0ICogQHJldHVybnMgez9udW1iZXJ9IFRoZSBiYXNlIG9mZnNldCBmb3IgdGhlIGFsbG9jYXRlZCBxdWVyaWVzLCBvciBudWxsIGlmIGFsbG9jYXRpb24gZmFpbGVkLlxyXG5cdCAqL1xyXG5cdGFsbG9jYXRlUXVlcmllc0ZvckNvbnRleHQoIHJlbmRlckNvbnRleHQgKSB7XHJcblxyXG5cdFx0aWYgKCAhIHRoaXMudHJhY2tUaW1lc3RhbXAgfHwgdGhpcy5pc0Rpc3Bvc2VkICkgcmV0dXJuIG51bGw7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmN1cnJlbnRRdWVyeUluZGV4ICsgMiA+IHRoaXMubWF4UXVlcmllcyApIHtcclxuXHJcblx0XHRcdHdhcm5PbmNlKCBgV2ViR1BVVGltZXN0YW1wUXVlcnlQb29sIFskeyB0aGlzLnR5cGUgfV06IE1heGltdW0gbnVtYmVyIG9mIHF1ZXJpZXMgZXhjZWVkZWQsIHdoZW4gdXNpbmcgdHJhY2tUaW1lc3RhbXAgaXQgaXMgbmVjZXNzYXJ5IHRvIHJlc29sdmVzIHRoZSBxdWVyaWVzIHZpYSByZW5kZXJlci5yZXNvbHZlVGltZXN0YW1wc0FzeW5jKCBUSFJFRS5UaW1lc3RhbXBRdWVyeS4keyB0aGlzLnR5cGUudG9VcHBlckNhc2UoKSB9ICkuYCApO1xyXG5cdFx0XHRyZXR1cm4gbnVsbDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgYmFzZU9mZnNldCA9IHRoaXMuY3VycmVudFF1ZXJ5SW5kZXg7XHJcblx0XHR0aGlzLmN1cnJlbnRRdWVyeUluZGV4ICs9IDI7XHJcblxyXG5cdFx0dGhpcy5xdWVyeU9mZnNldHMuc2V0KCByZW5kZXJDb250ZXh0LmlkLCBiYXNlT2Zmc2V0ICk7XHJcblx0XHRyZXR1cm4gYmFzZU9mZnNldDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBc3luY2hyb25vdXNseSByZXNvbHZlcyBhbGwgcGVuZGluZyBxdWVyaWVzIGFuZCByZXR1cm5zIHRoZSB0b3RhbCBkdXJhdGlvbi5cclxuXHQgKiBJZiB0aGVyZSdzIGFscmVhZHkgYSBwZW5kaW5nIHJlc29sdmUgb3BlcmF0aW9uLCByZXR1cm5zIHRoYXQgcHJvbWlzZSBpbnN0ZWFkLlxyXG5cdCAqXHJcblx0ICogQGFzeW5jXHJcblx0ICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyPn0gVGhlIHRvdGFsIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcywgb3IgdGhlIGxhc3QgdmFsaWQgdmFsdWUgaWYgcmVzb2x1dGlvbiBmYWlscy5cclxuXHQgKi9cclxuXHRhc3luYyByZXNvbHZlUXVlcmllc0FzeW5jKCkge1xyXG5cclxuXHRcdGlmICggISB0aGlzLnRyYWNrVGltZXN0YW1wIHx8IHRoaXMuY3VycmVudFF1ZXJ5SW5kZXggPT09IDAgfHwgdGhpcy5pc0Rpc3Bvc2VkICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIHRoaXMubGFzdFZhbHVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMucGVuZGluZ1Jlc29sdmUgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gdGhpcy5wZW5kaW5nUmVzb2x2ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5wZW5kaW5nUmVzb2x2ZSA9IHRoaXMuX3Jlc29sdmVRdWVyaWVzKCk7XHJcblxyXG5cdFx0dHJ5IHtcclxuXHJcblx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucGVuZGluZ1Jlc29sdmU7XHJcblx0XHRcdHJldHVybiByZXN1bHQ7XHJcblxyXG5cdFx0fSBmaW5hbGx5IHtcclxuXHJcblx0XHRcdHRoaXMucGVuZGluZ1Jlc29sdmUgPSBudWxsO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJbnRlcm5hbCBtZXRob2QgdG8gcmVzb2x2ZSBxdWVyaWVzIGFuZCBjYWxjdWxhdGUgdG90YWwgZHVyYXRpb24uXHJcblx0ICpcclxuXHQgKiBAYXN5bmNcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlcj59IFRoZSB0b3RhbCBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMuXHJcblx0ICovXHJcblx0YXN5bmMgX3Jlc29sdmVRdWVyaWVzKCkge1xyXG5cclxuXHRcdGlmICggdGhpcy5pc0Rpc3Bvc2VkICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIHRoaXMubGFzdFZhbHVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0cnkge1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLnJlc3VsdEJ1ZmZlci5tYXBTdGF0ZSAhPT0gJ3VubWFwcGVkJyApIHtcclxuXHJcblx0XHRcdFx0cmV0dXJuIHRoaXMubGFzdFZhbHVlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgY3VycmVudE9mZnNldHMgPSBuZXcgTWFwKCB0aGlzLnF1ZXJ5T2Zmc2V0cyApO1xyXG5cdFx0XHRjb25zdCBxdWVyeUNvdW50ID0gdGhpcy5jdXJyZW50UXVlcnlJbmRleDtcclxuXHRcdFx0Y29uc3QgYnl0ZXNVc2VkID0gcXVlcnlDb3VudCAqIDg7XHJcblxyXG5cdFx0XHQvLyBSZXNldCBzdGF0ZSBiZWZvcmUgR1BVIHdvcmtcclxuXHRcdFx0dGhpcy5jdXJyZW50UXVlcnlJbmRleCA9IDA7XHJcblx0XHRcdHRoaXMucXVlcnlPZmZzZXRzLmNsZWFyKCk7XHJcblxyXG5cdFx0XHRjb25zdCBjb21tYW5kRW5jb2RlciA9IHRoaXMuZGV2aWNlLmNyZWF0ZUNvbW1hbmRFbmNvZGVyKCk7XHJcblxyXG5cdFx0XHRjb21tYW5kRW5jb2Rlci5yZXNvbHZlUXVlcnlTZXQoXHJcblx0XHRcdFx0dGhpcy5xdWVyeVNldCxcclxuXHRcdFx0XHQwLFxyXG5cdFx0XHRcdHF1ZXJ5Q291bnQsXHJcblx0XHRcdFx0dGhpcy5yZXNvbHZlQnVmZmVyLFxyXG5cdFx0XHRcdDBcclxuXHRcdFx0KTtcclxuXHJcblx0XHRcdGNvbW1hbmRFbmNvZGVyLmNvcHlCdWZmZXJUb0J1ZmZlcihcclxuXHRcdFx0XHR0aGlzLnJlc29sdmVCdWZmZXIsXHJcblx0XHRcdFx0MCxcclxuXHRcdFx0XHR0aGlzLnJlc3VsdEJ1ZmZlcixcclxuXHRcdFx0XHQwLFxyXG5cdFx0XHRcdGJ5dGVzVXNlZFxyXG5cdFx0XHQpO1xyXG5cclxuXHRcdFx0Y29uc3QgY29tbWFuZEJ1ZmZlciA9IGNvbW1hbmRFbmNvZGVyLmZpbmlzaCgpO1xyXG5cdFx0XHR0aGlzLmRldmljZS5xdWV1ZS5zdWJtaXQoIFsgY29tbWFuZEJ1ZmZlciBdICk7XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMucmVzdWx0QnVmZmVyLm1hcFN0YXRlICE9PSAndW5tYXBwZWQnICkge1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gdGhpcy5sYXN0VmFsdWU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBDcmVhdGUgYW5kIHRyYWNrIHRoZSBtYXBwaW5nIG9wZXJhdGlvblxyXG5cdFx0XHRhd2FpdCB0aGlzLnJlc3VsdEJ1ZmZlci5tYXBBc3luYyggR1BVTWFwTW9kZS5SRUFELCAwLCBieXRlc1VzZWQgKTtcclxuXHJcblx0XHRcdGlmICggdGhpcy5pc0Rpc3Bvc2VkICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIHRoaXMucmVzdWx0QnVmZmVyLm1hcFN0YXRlID09PSAnbWFwcGVkJyApIHtcclxuXHJcblx0XHRcdFx0XHR0aGlzLnJlc3VsdEJ1ZmZlci51bm1hcCgpO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHJldHVybiB0aGlzLmxhc3RWYWx1ZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IHRpbWVzID0gbmV3IEJpZ1VpbnQ2NEFycmF5KCB0aGlzLnJlc3VsdEJ1ZmZlci5nZXRNYXBwZWRSYW5nZSggMCwgYnl0ZXNVc2VkICkgKTtcclxuXHRcdFx0bGV0IHRvdGFsRHVyYXRpb24gPSAwO1xyXG5cclxuXHRcdFx0Zm9yICggY29uc3QgWyAsIGJhc2VPZmZzZXQgXSBvZiBjdXJyZW50T2Zmc2V0cyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3Qgc3RhcnRUaW1lID0gdGltZXNbIGJhc2VPZmZzZXQgXTtcclxuXHRcdFx0XHRjb25zdCBlbmRUaW1lID0gdGltZXNbIGJhc2VPZmZzZXQgKyAxIF07XHJcblx0XHRcdFx0Y29uc3QgZHVyYXRpb24gPSBOdW1iZXIoIGVuZFRpbWUgLSBzdGFydFRpbWUgKSAvIDFlNjtcclxuXHRcdFx0XHR0b3RhbER1cmF0aW9uICs9IGR1cmF0aW9uO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5yZXN1bHRCdWZmZXIudW5tYXAoKTtcclxuXHRcdFx0dGhpcy5sYXN0VmFsdWUgPSB0b3RhbER1cmF0aW9uO1xyXG5cclxuXHRcdFx0cmV0dXJuIHRvdGFsRHVyYXRpb247XHJcblxyXG5cdFx0fSBjYXRjaCAoIGVycm9yICkge1xyXG5cclxuXHRcdFx0Y29uc29sZS5lcnJvciggJ0Vycm9yIHJlc29sdmluZyBxdWVyaWVzOicsIGVycm9yICk7XHJcblx0XHRcdGlmICggdGhpcy5yZXN1bHRCdWZmZXIubWFwU3RhdGUgPT09ICdtYXBwZWQnICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLnJlc3VsdEJ1ZmZlci51bm1hcCgpO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIHRoaXMubGFzdFZhbHVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEaXNwb3NlIG9mIHRoZSBxdWVyeSBwb29sLlxyXG5cdCAqXHJcblx0ICogQGFzeW5jXHJcblx0ICogQHJldHVybnMge1Byb21pc2V9IEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGRpc3Bvc2UgaGFzIGJlZW4gZXhlY3V0ZWQuXHJcblx0ICovXHJcblx0YXN5bmMgZGlzcG9zZSgpIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuaXNEaXNwb3NlZCApIHtcclxuXHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5pc0Rpc3Bvc2VkID0gdHJ1ZTtcclxuXHJcblx0XHQvLyBXYWl0IGZvciBwZW5kaW5nIHJlc29sdmUgb3BlcmF0aW9uXHJcblx0XHRpZiAoIHRoaXMucGVuZGluZ1Jlc29sdmUgKSB7XHJcblxyXG5cdFx0XHR0cnkge1xyXG5cclxuXHRcdFx0XHRhd2FpdCB0aGlzLnBlbmRpbmdSZXNvbHZlO1xyXG5cclxuXHRcdFx0fSBjYXRjaCAoIGVycm9yICkge1xyXG5cclxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCAnRXJyb3Igd2FpdGluZyBmb3IgcGVuZGluZyByZXNvbHZlOicsIGVycm9yICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEVuc3VyZSBidWZmZXIgaXMgdW5tYXBwZWQgYmVmb3JlIGRlc3Ryb3lpbmdcclxuXHRcdGlmICggdGhpcy5yZXN1bHRCdWZmZXIgJiYgdGhpcy5yZXN1bHRCdWZmZXIubWFwU3RhdGUgPT09ICdtYXBwZWQnICkge1xyXG5cclxuXHRcdFx0dHJ5IHtcclxuXHJcblx0XHRcdFx0dGhpcy5yZXN1bHRCdWZmZXIudW5tYXAoKTtcclxuXHJcblx0XHRcdH0gY2F0Y2ggKCBlcnJvciApIHtcclxuXHJcblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ0Vycm9yIHVubWFwcGluZyBidWZmZXI6JywgZXJyb3IgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gRGVzdHJveSByZXNvdXJjZXNcclxuXHRcdGlmICggdGhpcy5xdWVyeVNldCApIHtcclxuXHJcblx0XHRcdHRoaXMucXVlcnlTZXQuZGVzdHJveSgpO1xyXG5cdFx0XHR0aGlzLnF1ZXJ5U2V0ID0gbnVsbDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aGlzLnJlc29sdmVCdWZmZXIgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnJlc29sdmVCdWZmZXIuZGVzdHJveSgpO1xyXG5cdFx0XHR0aGlzLnJlc29sdmVCdWZmZXIgPSBudWxsO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMucmVzdWx0QnVmZmVyICkge1xyXG5cclxuXHRcdFx0dGhpcy5yZXN1bHRCdWZmZXIuZGVzdHJveSgpO1xyXG5cdFx0XHR0aGlzLnJlc3VsdEJ1ZmZlciA9IG51bGw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMucXVlcnlPZmZzZXRzLmNsZWFyKCk7XHJcblx0XHR0aGlzLnBlbmRpbmdSZXNvbHZlID0gbnVsbDtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgV2ViR1BVVGltZXN0YW1wUXVlcnlQb29sO1xyXG4iLCIvKi8vIGRlYnVnZ2VyIHRvb2xzICovXHJcbmltcG9ydCAnaHR0cHM6Ly9ncmVnZ21hbi5naXRodWIuaW8vd2ViZ3B1LWF2b2lkLXJlZHVuZGFudC1zdGF0ZS1zZXR0aW5nL3dlYmdwdS1jaGVjay1yZWR1bmRhbnQtc3RhdGUtc2V0dGluZy5qcyc7XHJcblxyXG5pbXBvcnQgeyBHUFVGZWF0dXJlTmFtZSwgR1BVTG9hZE9wLCBHUFVTdG9yZU9wLCBHUFVJbmRleEZvcm1hdCwgR1BVVGV4dHVyZVZpZXdEaW1lbnNpb24gfSBmcm9tICcuL3V0aWxzL1dlYkdQVUNvbnN0YW50cy5qcyc7XHJcblxyXG5pbXBvcnQgV0dTTE5vZGVCdWlsZGVyIGZyb20gJy4vbm9kZXMvV0dTTE5vZGVCdWlsZGVyLmpzJztcclxuaW1wb3J0IEJhY2tlbmQgZnJvbSAnLi4vY29tbW9uL0JhY2tlbmQuanMnO1xyXG5cclxuaW1wb3J0IFdlYkdQVVV0aWxzIGZyb20gJy4vdXRpbHMvV2ViR1BVVXRpbHMuanMnO1xyXG5pbXBvcnQgV2ViR1BVQXR0cmlidXRlVXRpbHMgZnJvbSAnLi91dGlscy9XZWJHUFVBdHRyaWJ1dGVVdGlscy5qcyc7XHJcbmltcG9ydCBXZWJHUFVCaW5kaW5nVXRpbHMgZnJvbSAnLi91dGlscy9XZWJHUFVCaW5kaW5nVXRpbHMuanMnO1xyXG5pbXBvcnQgV2ViR1BVUGlwZWxpbmVVdGlscyBmcm9tICcuL3V0aWxzL1dlYkdQVVBpcGVsaW5lVXRpbHMuanMnO1xyXG5pbXBvcnQgV2ViR1BVVGV4dHVyZVV0aWxzIGZyb20gJy4vdXRpbHMvV2ViR1BVVGV4dHVyZVV0aWxzLmpzJztcclxuXHJcbmltcG9ydCB7IFdlYkdQVUNvb3JkaW5hdGVTeXN0ZW0gfSBmcm9tICcuLi8uLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgV2ViR1BVVGltZXN0YW1wUXVlcnlQb29sIGZyb20gJy4vdXRpbHMvV2ViR1BVVGltZXN0YW1wUXVlcnlQb29sLmpzJztcclxuaW1wb3J0IHsgd2Fybk9uY2UgfSBmcm9tICcuLi8uLi91dGlscy5qcyc7XHJcblxyXG5jbGFzcyBXZWJHUFVCYWNrZW5kIGV4dGVuZHMgQmFja2VuZCB7XHJcblxyXG5cdGNvbnN0cnVjdG9yKCBwYXJhbWV0ZXJzID0ge30gKSB7XHJcblx0XHRzdXBlciggcGFyYW1ldGVycyApO1xyXG5cdFx0dGhpcy5pc1dlYkdQVUJhY2tlbmQgPSB0cnVlO1xyXG5cdFx0dGhpcy5wYXJhbWV0ZXJzLmFscGhhID0gKCBwYXJhbWV0ZXJzLmFscGhhID09PSB1bmRlZmluZWQgKSA/IHRydWUgOiBwYXJhbWV0ZXJzLmFscGhhO1xyXG5cdFx0dGhpcy5wYXJhbWV0ZXJzLnJlcXVpcmVkTGltaXRzID0gKCBwYXJhbWV0ZXJzLnJlcXVpcmVkTGltaXRzID09PSB1bmRlZmluZWQgKSA/IHt9IDogcGFyYW1ldGVycy5yZXF1aXJlZExpbWl0cztcclxuXHJcblx0XHR0aGlzLmRldmljZSA9IG51bGw7XHJcblx0XHR0aGlzLmNvbnRleHQgPSBudWxsO1xyXG5cdFx0dGhpcy5jb2xvckJ1ZmZlciA9IG51bGw7XHJcblx0XHR0aGlzLmRlZmF1bHRSZW5kZXJQYXNzZGVzY3JpcHRvciA9IG51bGw7XHJcblxyXG5cdFx0dGhpcy51dGlscyA9IG5ldyBXZWJHUFVVdGlscyggdGhpcyApO1xyXG5cdFx0dGhpcy5hdHRyaWJ1dGVVdGlscyA9IG5ldyBXZWJHUFVBdHRyaWJ1dGVVdGlscyggdGhpcyApO1xyXG5cdFx0dGhpcy5iaW5kaW5nVXRpbHMgPSBuZXcgV2ViR1BVQmluZGluZ1V0aWxzKCB0aGlzICk7XHJcblx0XHR0aGlzLnBpcGVsaW5lVXRpbHMgPSBuZXcgV2ViR1BVUGlwZWxpbmVVdGlscyggdGhpcyApO1xyXG5cdFx0dGhpcy50ZXh0dXJlVXRpbHMgPSBuZXcgV2ViR1BVVGV4dHVyZVV0aWxzKCB0aGlzICk7XHJcblx0XHR0aGlzLm9jY2x1ZGVkUmVzb2x2ZUNhY2hlID0gbmV3IE1hcCgpO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgaW5pdCggcmVuZGVyZXIgKSB7XHJcblx0XHRhd2FpdCBzdXBlci5pbml0KCByZW5kZXJlciApO1xyXG5cdFx0Y29uc3QgcGFyYW1ldGVycyA9IHRoaXMucGFyYW1ldGVycztcclxuXHRcdGxldCBkZXZpY2U7XHJcblxyXG5cdFx0aWYgKCBwYXJhbWV0ZXJzLmRldmljZSA9PT0gdW5kZWZpbmVkICkge1xyXG5cdFx0XHRjb25zdCBhZGFwdGVyT3B0aW9ucyA9IHsgcG93ZXJQcmVmZXJlbmNlOiBwYXJhbWV0ZXJzLnBvd2VyUHJlZmVyZW5jZSB9O1xyXG5cdFx0XHRjb25zdCBhZGFwdGVyID0gKCB0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyApID8gYXdhaXQgbmF2aWdhdG9yLmdwdS5yZXF1ZXN0QWRhcHRlciggYWRhcHRlck9wdGlvbnMgKSA6IG51bGw7XHJcblxyXG5cdFx0XHRpZiAoIGFkYXB0ZXIgPT09IG51bGwgKSB0aHJvdyBuZXcgRXJyb3IoICdXZWJHUFVCYWNrZW5kOiBVbmFibGUgdG8gY3JlYXRlIFdlYkdQVSBhZGFwdGVyLicgKTtcclxuXHJcblx0XHRcdGNvbnN0IGZlYXR1cmVzID0gT2JqZWN0LnZhbHVlcyggR1BVRmVhdHVyZU5hbWUgKTtcclxuXHRcdFx0Y29uc3Qgc3VwcG9ydGVkRmVhdHVyZXMgPSBmZWF0dXJlcy5maWx0ZXIoIG5hbWUgPT4gYWRhcHRlci5mZWF0dXJlcy5oYXMoIG5hbWUgKSApO1xyXG5cclxuXHRcdFx0ZGV2aWNlID0gYXdhaXQgYWRhcHRlci5yZXF1ZXN0RGV2aWNlKHsgcmVxdWlyZWRGZWF0dXJlczogc3VwcG9ydGVkRmVhdHVyZXMsIHJlcXVpcmVkTGltaXRzOiBwYXJhbWV0ZXJzLnJlcXVpcmVkTGltaXRzIH0pO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0ZGV2aWNlID0gcGFyYW1ldGVycy5kZXZpY2U7XHJcblx0XHR9XHJcblxyXG5cdFx0ZGV2aWNlLmxvc3QudGhlbiggKCBpbmZvICkgPT4ge1xyXG5cdFx0XHRyZW5kZXJlci5vbkRldmljZUxvc3Qoe1xyXG5cdFx0XHRcdGFwaTogJ1dlYkdQVScsXHJcblx0XHRcdFx0bWVzc2FnZTogaW5mby5tZXNzYWdlIHx8ICdVbmtub3duIHJlYXNvbicsXHJcblx0XHRcdFx0cmVhc29uOiBpbmZvLnJlYXNvbiB8fCBudWxsLFxyXG5cdFx0XHRcdG9yaWdpbmFsRXZlbnQ6IGluZm9cclxuXHRcdFx0fSk7XHJcblx0XHR9KTtcclxuXHJcblx0XHRjb25zdCBjb250ZXh0ID0gcGFyYW1ldGVycy5jb250ZXh0ICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLmNvbnRleHQgOiByZW5kZXJlci5kb21FbGVtZW50LmdldENvbnRleHQoICd3ZWJncHUnICk7XHJcblx0XHR0aGlzLmRldmljZSA9IGRldmljZTtcclxuXHRcdHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XHJcblx0XHRjb25zdCBhbHBoYU1vZGUgPSBwYXJhbWV0ZXJzLmFscGhhID8gJ3ByZW11bHRpcGxpZWQnIDogJ29wYXF1ZSc7XHJcblx0XHR0aGlzLnRyYWNrVGltZXN0YW1wID0gdGhpcy50cmFja1RpbWVzdGFtcCAmJiB0aGlzLmhhc0ZlYXR1cmUoIEdQVUZlYXR1cmVOYW1lLlRpbWVzdGFtcFF1ZXJ5ICk7XHJcblxyXG5cdFx0dGhpcy5jb250ZXh0LmNvbmZpZ3VyZSh7XHJcblx0XHRcdGRldmljZTogdGhpcy5kZXZpY2UsXHJcblx0XHRcdGZvcm1hdDogdGhpcy51dGlscy5nZXRQcmVmZXJyZWRDYW52YXNGb3JtYXQoKSxcclxuXHRcdFx0dXNhZ2U6IEdQVVRleHR1cmVVc2FnZS5SRU5ERVJfQVRUQUNITUVOVCB8IEdQVVRleHR1cmVVc2FnZS5DT1BZX1NSQyxcclxuXHRcdFx0YWxwaGFNb2RlOiBhbHBoYU1vZGVcclxuXHRcdH0pO1xyXG5cclxuXHRcdGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiAnY2hlY2tXZWJHUFVTdGF0ZScgaW4gd2luZG93KSB7XHJcblx0XHRcdGNoZWNrV2ViR1BVU3RhdGUoKTtcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnVwZGF0ZVNpemUoKTtcclxuXHR9XHJcblxyXG5cdGdldCBjb29yZGluYXRlU3lzdGVtKCkge1xyXG5cdFx0cmV0dXJuIFdlYkdQVUNvb3JkaW5hdGVTeXN0ZW07XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBwZXJmb3JtcyBhIHJlYWRiYWNrIG9wZXJhdGlvbiBieSBtb3ZpbmcgYnVmZmVyIGRhdGEgZnJvbVxyXG5cdCAqIGEgc3RvcmFnZSBidWZmZXIgYXR0cmlidXRlIGZyb20gdGhlIEdQVSB0byB0aGUgQ1BVLlxyXG5cdCAqXHJcblx0ICogQGFzeW5jXHJcblx0ICogQHBhcmFtIHtTdG9yYWdlQnVmZmVyQXR0cmlidXRlfSBhdHRyaWJ1dGUgLSBUaGUgc3RvcmFnZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqIEByZXR1cm4ge1Byb21pc2U8QXJyYXlCdWZmZXI+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBidWZmZXIgZGF0YSB3aGVuIHRoZSBkYXRhIGFyZSByZWFkeS5cclxuXHQgKi9cclxuXHRhc3luYyBnZXRBcnJheUJ1ZmZlckFzeW5jKCBhdHRyaWJ1dGUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIGF3YWl0IHRoaXMuYXR0cmlidXRlVXRpbHMuZ2V0QXJyYXlCdWZmZXJBc3luYyggYXR0cmlidXRlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgYmFja2VuZCdzIHJlbmRlcmluZyBjb250ZXh0LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7R1BVQ2FudmFzQ29udGV4dH0gVGhlIHJlbmRlcmluZyBjb250ZXh0LlxyXG5cdCAqL1xyXG5cdGdldENvbnRleHQoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuY29udGV4dDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHJlbmRlciBwYXNzIGRlc2NyaXB0b3IuXHJcblx0ICpcclxuXHQgKiBJbiBXZWJHUFUsIHRoZSBkZWZhdWx0IGZyYW1lYnVmZmVyIG11c3QgYmUgY29uZmlndXJlZFxyXG5cdCAqIGxpa2UgY3VzdG9tIGZyYW1lYnVmZmVycyBzbyB0aGUgYmFja2VuZCBuZWVkcyBhIHJlbmRlclxyXG5cdCAqIHBhc3MgZGVzY3JpcHRvciBldmVuIHdoZW4gcmVuZGVyaW5nIGRpcmVjdGx5IHRvIHNjcmVlbi5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHJldHVybiB7T2JqZWN0fSBUaGUgcmVuZGVyIHBhc3MgZGVzY3JpcHRvci5cclxuXHQgKi9cclxuXHRfZ2V0RGVmYXVsdFJlbmRlclBhc3NEZXNjcmlwdG9yKCkge1xyXG5cclxuXHRcdGxldCBkZXNjcmlwdG9yID0gdGhpcy5kZWZhdWx0UmVuZGVyUGFzc2Rlc2NyaXB0b3I7XHJcblxyXG5cdFx0aWYgKCBkZXNjcmlwdG9yID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0Y29uc3QgcmVuZGVyZXIgPSB0aGlzLnJlbmRlcmVyO1xyXG5cclxuXHRcdFx0ZGVzY3JpcHRvciA9IHtcclxuXHRcdFx0XHRjb2xvckF0dGFjaG1lbnRzOiBbIHtcclxuXHRcdFx0XHRcdHZpZXc6IG51bGxcclxuXHRcdFx0XHR9IF0sXHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMucmVuZGVyZXIuZGVwdGggPT09IHRydWUgfHwgdGhpcy5yZW5kZXJlci5zdGVuY2lsID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRkZXNjcmlwdG9yLmRlcHRoU3RlbmNpbEF0dGFjaG1lbnQgPSB7XHJcblx0XHRcdFx0XHR2aWV3OiB0aGlzLnRleHR1cmVVdGlscy5nZXREZXB0aEJ1ZmZlciggcmVuZGVyZXIuZGVwdGgsIHJlbmRlcmVyLnN0ZW5jaWwgKS5jcmVhdGVWaWV3KClcclxuXHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgY29sb3JBdHRhY2htZW50ID0gZGVzY3JpcHRvci5jb2xvckF0dGFjaG1lbnRzWyAwIF07XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMucmVuZGVyZXIuc2FtcGxlcyA+IDAgKSB7XHJcblxyXG5cdFx0XHRcdGNvbG9yQXR0YWNobWVudC52aWV3ID0gdGhpcy5jb2xvckJ1ZmZlci5jcmVhdGVWaWV3KCk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRjb2xvckF0dGFjaG1lbnQucmVzb2x2ZVRhcmdldCA9IHVuZGVmaW5lZDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuZGVmYXVsdFJlbmRlclBhc3NkZXNjcmlwdG9yID0gZGVzY3JpcHRvcjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgY29sb3JBdHRhY2htZW50ID0gZGVzY3JpcHRvci5jb2xvckF0dGFjaG1lbnRzWyAwIF07XHJcblxyXG5cdFx0aWYgKCB0aGlzLnJlbmRlcmVyLnNhbXBsZXMgPiAwICkge1xyXG5cclxuXHRcdFx0Y29sb3JBdHRhY2htZW50LnJlc29sdmVUYXJnZXQgPSB0aGlzLmNvbnRleHQuZ2V0Q3VycmVudFRleHR1cmUoKS5jcmVhdGVWaWV3KCk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGNvbG9yQXR0YWNobWVudC52aWV3ID0gdGhpcy5jb250ZXh0LmdldEN1cnJlbnRUZXh0dXJlKCkuY3JlYXRlVmlldygpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZGVzY3JpcHRvcjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSByZW5kZXIgcGFzcyBkZXNjcmlwdG9yIGZvciB0aGUgZ2l2ZW4gcmVuZGVyIGNvbnRleHQuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyQ29udGV4dH0gcmVuZGVyQ29udGV4dCAtIFRoZSByZW5kZXIgY29udGV4dC5cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gY29sb3JBdHRhY2htZW50c0NvbmZpZyAtIENvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciB0aGUgY29sb3IgYXR0YWNobWVudHMuXHJcblx0ICogQHJldHVybiB7T2JqZWN0fSBUaGUgcmVuZGVyIHBhc3MgZGVzY3JpcHRvci5cclxuXHQgKi9cclxuXHRfZ2V0UmVuZGVyUGFzc0Rlc2NyaXB0b3IoIHJlbmRlckNvbnRleHQsIGNvbG9yQXR0YWNobWVudHNDb25maWcgPSB7fSApIHtcclxuXHJcblx0XHRjb25zdCByZW5kZXJUYXJnZXQgPSByZW5kZXJDb250ZXh0LnJlbmRlclRhcmdldDtcclxuXHRcdGNvbnN0IHJlbmRlclRhcmdldERhdGEgPSB0aGlzLmdldCggcmVuZGVyVGFyZ2V0ICk7XHJcblxyXG5cdFx0bGV0IGRlc2NyaXB0b3JzID0gcmVuZGVyVGFyZ2V0RGF0YS5kZXNjcmlwdG9ycztcclxuXHJcblx0XHRpZiAoIGRlc2NyaXB0b3JzID09PSB1bmRlZmluZWQgfHxcclxuXHRcdFx0cmVuZGVyVGFyZ2V0RGF0YS53aWR0aCAhPT0gcmVuZGVyVGFyZ2V0LndpZHRoIHx8XHJcblx0XHRcdHJlbmRlclRhcmdldERhdGEuaGVpZ2h0ICE9PSByZW5kZXJUYXJnZXQuaGVpZ2h0IHx8XHJcblx0XHRcdHJlbmRlclRhcmdldERhdGEuZGltZW5zaW9ucyAhPT0gcmVuZGVyVGFyZ2V0LmRpbWVuc2lvbnMgfHxcclxuXHRcdFx0cmVuZGVyVGFyZ2V0RGF0YS5hY3RpdmVNaXBtYXBMZXZlbCAhPT0gcmVuZGVyQ29udGV4dC5hY3RpdmVNaXBtYXBMZXZlbCB8fFxyXG5cdFx0XHRyZW5kZXJUYXJnZXREYXRhLmFjdGl2ZUN1YmVGYWNlICE9PSByZW5kZXJDb250ZXh0LmFjdGl2ZUN1YmVGYWNlIHx8XHJcblx0XHRcdHJlbmRlclRhcmdldERhdGEuc2FtcGxlcyAhPT0gcmVuZGVyVGFyZ2V0LnNhbXBsZXNcclxuXHRcdCkge1xyXG5cclxuXHRcdFx0ZGVzY3JpcHRvcnMgPSB7fTtcclxuXHJcblx0XHRcdHJlbmRlclRhcmdldERhdGEuZGVzY3JpcHRvcnMgPSBkZXNjcmlwdG9ycztcclxuXHJcblx0XHRcdC8vIGRpc3Bvc2VcclxuXHJcblx0XHRcdGNvbnN0IG9uRGlzcG9zZSA9ICgpID0+IHtcclxuXHJcblx0XHRcdFx0cmVuZGVyVGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25EaXNwb3NlICk7XHJcblx0XHRcdFx0dGhpcy5kZWxldGUoIHJlbmRlclRhcmdldCApO1xyXG5cclxuXHRcdFx0fTtcclxuXHJcblx0XHRcdGlmICggcmVuZGVyVGFyZ2V0Lmhhc0V2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25EaXNwb3NlICkgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0XHRyZW5kZXJUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvbkRpc3Bvc2UgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgY2FjaGVLZXkgPSByZW5kZXJDb250ZXh0LmdldENhY2hlS2V5KCk7XHJcblx0XHRsZXQgZGVzY3JpcHRvckJhc2UgPSBkZXNjcmlwdG9yc1sgY2FjaGVLZXkgXTtcclxuXHJcblx0XHRpZiAoIGRlc2NyaXB0b3JCYXNlID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB0ZXh0dXJlcyA9IHJlbmRlckNvbnRleHQudGV4dHVyZXM7XHJcblx0XHRcdGNvbnN0IHRleHR1cmVWaWV3cyA9IFtdO1xyXG5cclxuXHRcdFx0bGV0IHNsaWNlSW5kZXg7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB0ZXh0dXJlcy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHRleHR1cmVEYXRhID0gdGhpcy5nZXQoIHRleHR1cmVzWyBpIF0gKTtcclxuXHJcblx0XHRcdFx0Y29uc3Qgdmlld0Rlc2NyaXB0b3IgPSB7XHJcblx0XHRcdFx0XHRsYWJlbDogYGNvbG9yQXR0YWNobWVudF8keyBpIH1gLFxyXG5cdFx0XHRcdFx0YmFzZU1pcExldmVsOiByZW5kZXJDb250ZXh0LmFjdGl2ZU1pcG1hcExldmVsLFxyXG5cdFx0XHRcdFx0bWlwTGV2ZWxDb3VudDogMSxcclxuXHRcdFx0XHRcdGJhc2VBcnJheUxheWVyOiByZW5kZXJDb250ZXh0LmFjdGl2ZUN1YmVGYWNlLFxyXG5cdFx0XHRcdFx0YXJyYXlMYXllckNvdW50OiAxLFxyXG5cdFx0XHRcdFx0ZGltZW5zaW9uOiBHUFVUZXh0dXJlVmlld0RpbWVuc2lvbi5Ud29EXHJcblx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0aWYgKCByZW5kZXJUYXJnZXQuaXNSZW5kZXJUYXJnZXQzRCApIHtcclxuXHJcblx0XHRcdFx0XHRzbGljZUluZGV4ID0gcmVuZGVyQ29udGV4dC5hY3RpdmVDdWJlRmFjZTtcclxuXHJcblx0XHRcdFx0XHR2aWV3RGVzY3JpcHRvci5iYXNlQXJyYXlMYXllciA9IDA7XHJcblx0XHRcdFx0XHR2aWV3RGVzY3JpcHRvci5kaW1lbnNpb24gPSBHUFVUZXh0dXJlVmlld0RpbWVuc2lvbi5UaHJlZUQ7XHJcblx0XHRcdFx0XHR2aWV3RGVzY3JpcHRvci5kZXB0aE9yQXJyYXlMYXllcnMgPSB0ZXh0dXJlc1sgaSBdLmltYWdlLmRlcHRoO1xyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCByZW5kZXJUYXJnZXQuaXNSZW5kZXJUYXJnZXRBcnJheSApIHtcclxuXHJcblx0XHRcdFx0XHR2aWV3RGVzY3JpcHRvci5kaW1lbnNpb24gPSBHUFVUZXh0dXJlVmlld0RpbWVuc2lvbi5Ud29EQXJyYXk7XHJcblx0XHRcdFx0XHR2aWV3RGVzY3JpcHRvci5kZXB0aE9yQXJyYXlMYXllcnMgPSB0ZXh0dXJlc1sgaSBdLmltYWdlLmRlcHRoO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGNvbnN0IHRleHR1cmVWaWV3ID0gdGV4dHVyZURhdGEudGV4dHVyZS5jcmVhdGVWaWV3KCB2aWV3RGVzY3JpcHRvciApO1xyXG5cclxuXHRcdFx0XHRsZXQgdmlldywgcmVzb2x2ZVRhcmdldDtcclxuXHJcblx0XHRcdFx0aWYgKCB0ZXh0dXJlRGF0YS5tc2FhVGV4dHVyZSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdHZpZXcgPSB0ZXh0dXJlRGF0YS5tc2FhVGV4dHVyZS5jcmVhdGVWaWV3KCk7XHJcblx0XHRcdFx0XHRyZXNvbHZlVGFyZ2V0ID0gdGV4dHVyZVZpZXc7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0dmlldyA9IHRleHR1cmVWaWV3O1xyXG5cdFx0XHRcdFx0cmVzb2x2ZVRhcmdldCA9IHVuZGVmaW5lZDtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR0ZXh0dXJlVmlld3MucHVzaCgge1xyXG5cdFx0XHRcdFx0dmlldyxcclxuXHRcdFx0XHRcdHJlc29sdmVUYXJnZXQsXHJcblx0XHRcdFx0XHRkZXB0aFNsaWNlOiBzbGljZUluZGV4XHJcblx0XHRcdFx0fSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZGVzY3JpcHRvckJhc2UgPSB7IHRleHR1cmVWaWV3cyB9O1xyXG5cclxuXHRcdFx0aWYgKCByZW5kZXJDb250ZXh0LmRlcHRoICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBkZXB0aFRleHR1cmVEYXRhID0gdGhpcy5nZXQoIHJlbmRlckNvbnRleHQuZGVwdGhUZXh0dXJlICk7XHJcblx0XHRcdFx0ZGVzY3JpcHRvckJhc2UuZGVwdGhTdGVuY2lsVmlldyA9IGRlcHRoVGV4dHVyZURhdGEudGV4dHVyZS5jcmVhdGVWaWV3KCk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRkZXNjcmlwdG9yc1sgY2FjaGVLZXkgXSA9IGRlc2NyaXB0b3JCYXNlO1xyXG5cclxuXHRcdFx0cmVuZGVyVGFyZ2V0RGF0YS53aWR0aCA9IHJlbmRlclRhcmdldC53aWR0aDtcclxuXHRcdFx0cmVuZGVyVGFyZ2V0RGF0YS5oZWlnaHQgPSByZW5kZXJUYXJnZXQuaGVpZ2h0O1xyXG5cdFx0XHRyZW5kZXJUYXJnZXREYXRhLnNhbXBsZXMgPSByZW5kZXJUYXJnZXQuc2FtcGxlcztcclxuXHRcdFx0cmVuZGVyVGFyZ2V0RGF0YS5hY3RpdmVNaXBtYXBMZXZlbCA9IHJlbmRlckNvbnRleHQuYWN0aXZlTWlwbWFwTGV2ZWw7XHJcblx0XHRcdHJlbmRlclRhcmdldERhdGEuYWN0aXZlQ3ViZUZhY2UgPSByZW5kZXJDb250ZXh0LmFjdGl2ZUN1YmVGYWNlO1xyXG5cdFx0XHRyZW5kZXJUYXJnZXREYXRhLmRpbWVuc2lvbnMgPSByZW5kZXJUYXJnZXQuZGltZW5zaW9ucztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgZGVzY3JpcHRvciA9IHtcclxuXHRcdFx0Y29sb3JBdHRhY2htZW50czogW11cclxuXHRcdH07XHJcblxyXG5cdFx0Ly8gQXBwbHkgZHluYW1pYyBwcm9wZXJ0aWVzIHRvIGNhY2hlZCB2aWV3c1xyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgZGVzY3JpcHRvckJhc2UudGV4dHVyZVZpZXdzLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHZpZXdJbmZvID0gZGVzY3JpcHRvckJhc2UudGV4dHVyZVZpZXdzWyBpIF07XHJcblxyXG5cdFx0XHRsZXQgY2xlYXJWYWx1ZSA9IHsgcjogMCwgZzogMCwgYjogMCwgYTogMSB9O1xyXG5cdFx0XHRpZiAoIGkgPT09IDAgJiYgY29sb3JBdHRhY2htZW50c0NvbmZpZy5jbGVhclZhbHVlICkge1xyXG5cclxuXHRcdFx0XHRjbGVhclZhbHVlID0gY29sb3JBdHRhY2htZW50c0NvbmZpZy5jbGVhclZhbHVlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZGVzY3JpcHRvci5jb2xvckF0dGFjaG1lbnRzLnB1c2goIHtcclxuXHRcdFx0XHR2aWV3OiB2aWV3SW5mby52aWV3LFxyXG5cdFx0XHRcdGRlcHRoU2xpY2U6IHZpZXdJbmZvLmRlcHRoU2xpY2UsXHJcblx0XHRcdFx0cmVzb2x2ZVRhcmdldDogdmlld0luZm8ucmVzb2x2ZVRhcmdldCxcclxuXHRcdFx0XHRsb2FkT3A6IGNvbG9yQXR0YWNobWVudHNDb25maWcubG9hZE9wIHx8IEdQVUxvYWRPcC5Mb2FkLFxyXG5cdFx0XHRcdHN0b3JlT3A6IGNvbG9yQXR0YWNobWVudHNDb25maWcuc3RvcmVPcCB8fCBHUFVTdG9yZU9wLlN0b3JlLFxyXG5cdFx0XHRcdGNsZWFyVmFsdWU6IGNsZWFyVmFsdWVcclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGRlc2NyaXB0b3JCYXNlLmRlcHRoU3RlbmNpbFZpZXcgKSB7XHJcblxyXG5cdFx0XHRkZXNjcmlwdG9yLmRlcHRoU3RlbmNpbEF0dGFjaG1lbnQgPSB7XHJcblx0XHRcdFx0dmlldzogZGVzY3JpcHRvckJhc2UuZGVwdGhTdGVuY2lsVmlld1xyXG5cdFx0XHR9O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZGVzY3JpcHRvcjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyBleGVjdXRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgcmVuZGVyIGNhbGwgYW5kIHByZXBhcmVzXHJcblx0ICogdGhlIFdlYkdQVSBzdGF0ZSBmb3IgdXBjb21pbmcgcmVuZGVyIGNhbGxzXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JlbmRlckNvbnRleHR9IHJlbmRlckNvbnRleHQgLSBUaGUgcmVuZGVyIGNvbnRleHQuXHJcblx0ICovXHJcblx0YmVnaW5SZW5kZXIoIHJlbmRlckNvbnRleHQgKSB7XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyQ29udGV4dERhdGEgPSB0aGlzLmdldCggcmVuZGVyQ29udGV4dCApO1xyXG5cclxuXHRcdGNvbnN0IGRldmljZSA9IHRoaXMuZGV2aWNlO1xyXG5cdFx0Y29uc3Qgb2NjbHVzaW9uUXVlcnlDb3VudCA9IHJlbmRlckNvbnRleHQub2NjbHVzaW9uUXVlcnlDb3VudDtcclxuXHJcblx0XHRsZXQgb2NjbHVzaW9uUXVlcnlTZXQ7XHJcblxyXG5cdFx0aWYgKCBvY2NsdXNpb25RdWVyeUNvdW50ID4gMCApIHtcclxuXHJcblx0XHRcdGlmICggcmVuZGVyQ29udGV4dERhdGEuY3VycmVudE9jY2x1c2lvblF1ZXJ5U2V0ICkgcmVuZGVyQ29udGV4dERhdGEuY3VycmVudE9jY2x1c2lvblF1ZXJ5U2V0LmRlc3Ryb3koKTtcclxuXHRcdFx0aWYgKCByZW5kZXJDb250ZXh0RGF0YS5jdXJyZW50T2NjbHVzaW9uUXVlcnlCdWZmZXIgKSByZW5kZXJDb250ZXh0RGF0YS5jdXJyZW50T2NjbHVzaW9uUXVlcnlCdWZmZXIuZGVzdHJveSgpO1xyXG5cclxuXHRcdFx0Ly8gR2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBhcnJheSBvZiBvYmplY3RzIHdpdGggcXVlcmllcy4gVGhlIHJlbmRlckNvbnRleHREYXRhIHByb3BlcnR5XHJcblx0XHRcdC8vIGNhbiBiZSBjaGFuZ2VkIGJ5IGFub3RoZXIgcmVuZGVyIHBhc3MgYmVmb3JlIHRoZSBidWZmZXIubWFwQXN5YygpIGNvbXBsZXRlcy5cclxuXHRcdFx0cmVuZGVyQ29udGV4dERhdGEuY3VycmVudE9jY2x1c2lvblF1ZXJ5U2V0ID0gcmVuZGVyQ29udGV4dERhdGEub2NjbHVzaW9uUXVlcnlTZXQ7XHJcblx0XHRcdHJlbmRlckNvbnRleHREYXRhLmN1cnJlbnRPY2NsdXNpb25RdWVyeUJ1ZmZlciA9IHJlbmRlckNvbnRleHREYXRhLm9jY2x1c2lvblF1ZXJ5QnVmZmVyO1xyXG5cdFx0XHRyZW5kZXJDb250ZXh0RGF0YS5jdXJyZW50T2NjbHVzaW9uUXVlcnlPYmplY3RzID0gcmVuZGVyQ29udGV4dERhdGEub2NjbHVzaW9uUXVlcnlPYmplY3RzO1xyXG5cclxuXHRcdFx0Ly9cclxuXHJcblx0XHRcdG9jY2x1c2lvblF1ZXJ5U2V0ID0gZGV2aWNlLmNyZWF0ZVF1ZXJ5U2V0KCB7IHR5cGU6ICdvY2NsdXNpb24nLCBjb3VudDogb2NjbHVzaW9uUXVlcnlDb3VudCwgbGFiZWw6IGBvY2NsdXNpb25RdWVyeVNldF8keyByZW5kZXJDb250ZXh0LmlkIH1gIH0gKTtcclxuXHJcblx0XHRcdHJlbmRlckNvbnRleHREYXRhLm9jY2x1c2lvblF1ZXJ5U2V0ID0gb2NjbHVzaW9uUXVlcnlTZXQ7XHJcblx0XHRcdHJlbmRlckNvbnRleHREYXRhLm9jY2x1c2lvblF1ZXJ5SW5kZXggPSAwO1xyXG5cdFx0XHRyZW5kZXJDb250ZXh0RGF0YS5vY2NsdXNpb25RdWVyeU9iamVjdHMgPSBuZXcgQXJyYXkoIG9jY2x1c2lvblF1ZXJ5Q291bnQgKTtcclxuXHJcblx0XHRcdHJlbmRlckNvbnRleHREYXRhLmxhc3RPY2NsdXNpb25PYmplY3QgPSBudWxsO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRsZXQgZGVzY3JpcHRvcjtcclxuXHJcblx0XHRpZiAoIHJlbmRlckNvbnRleHQudGV4dHVyZXMgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRkZXNjcmlwdG9yID0gdGhpcy5fZ2V0RGVmYXVsdFJlbmRlclBhc3NEZXNjcmlwdG9yKCk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGRlc2NyaXB0b3IgPSB0aGlzLl9nZXRSZW5kZXJQYXNzRGVzY3JpcHRvciggcmVuZGVyQ29udGV4dCwgeyBsb2FkT3A6IEdQVUxvYWRPcC5Mb2FkIH0gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5pbml0VGltZXN0YW1wUXVlcnkoIHJlbmRlckNvbnRleHQsIGRlc2NyaXB0b3IgKTtcclxuXHJcblx0XHRkZXNjcmlwdG9yLm9jY2x1c2lvblF1ZXJ5U2V0ID0gb2NjbHVzaW9uUXVlcnlTZXQ7XHJcblxyXG5cdFx0Y29uc3QgZGVwdGhTdGVuY2lsQXR0YWNobWVudCA9IGRlc2NyaXB0b3IuZGVwdGhTdGVuY2lsQXR0YWNobWVudDtcclxuXHJcblx0XHRpZiAoIHJlbmRlckNvbnRleHQudGV4dHVyZXMgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBjb2xvckF0dGFjaG1lbnRzID0gZGVzY3JpcHRvci5jb2xvckF0dGFjaG1lbnRzO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgY29sb3JBdHRhY2htZW50cy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGNvbG9yQXR0YWNobWVudCA9IGNvbG9yQXR0YWNobWVudHNbIGkgXTtcclxuXHJcblx0XHRcdFx0aWYgKCByZW5kZXJDb250ZXh0LmNsZWFyQ29sb3IgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29sb3JBdHRhY2htZW50LmNsZWFyVmFsdWUgPSBpID09PSAwID8gcmVuZGVyQ29udGV4dC5jbGVhckNvbG9yVmFsdWUgOiB7IHI6IDAsIGc6IDAsIGI6IDAsIGE6IDEgfTtcclxuXHRcdFx0XHRcdGNvbG9yQXR0YWNobWVudC5sb2FkT3AgPSBHUFVMb2FkT3AuQ2xlYXI7XHJcblx0XHRcdFx0XHRjb2xvckF0dGFjaG1lbnQuc3RvcmVPcCA9IEdQVVN0b3JlT3AuU3RvcmU7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0Y29sb3JBdHRhY2htZW50LmxvYWRPcCA9IEdQVUxvYWRPcC5Mb2FkO1xyXG5cdFx0XHRcdFx0Y29sb3JBdHRhY2htZW50LnN0b3JlT3AgPSBHUFVTdG9yZU9wLlN0b3JlO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGNvbnN0IGNvbG9yQXR0YWNobWVudCA9IGRlc2NyaXB0b3IuY29sb3JBdHRhY2htZW50c1sgMCBdO1xyXG5cclxuXHRcdFx0aWYgKCByZW5kZXJDb250ZXh0LmNsZWFyQ29sb3IgKSB7XHJcblxyXG5cdFx0XHRcdGNvbG9yQXR0YWNobWVudC5jbGVhclZhbHVlID0gcmVuZGVyQ29udGV4dC5jbGVhckNvbG9yVmFsdWU7XHJcblx0XHRcdFx0Y29sb3JBdHRhY2htZW50LmxvYWRPcCA9IEdQVUxvYWRPcC5DbGVhcjtcclxuXHRcdFx0XHRjb2xvckF0dGFjaG1lbnQuc3RvcmVPcCA9IEdQVVN0b3JlT3AuU3RvcmU7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRjb2xvckF0dGFjaG1lbnQubG9hZE9wID0gR1BVTG9hZE9wLkxvYWQ7XHJcblx0XHRcdFx0Y29sb3JBdHRhY2htZW50LnN0b3JlT3AgPSBHUFVTdG9yZU9wLlN0b3JlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGlmICggcmVuZGVyQ29udGV4dC5kZXB0aCApIHtcclxuXHJcblx0XHRcdGlmICggcmVuZGVyQ29udGV4dC5jbGVhckRlcHRoICkge1xyXG5cclxuXHRcdFx0XHRkZXB0aFN0ZW5jaWxBdHRhY2htZW50LmRlcHRoQ2xlYXJWYWx1ZSA9IHJlbmRlckNvbnRleHQuY2xlYXJEZXB0aFZhbHVlO1xyXG5cdFx0XHRcdGRlcHRoU3RlbmNpbEF0dGFjaG1lbnQuZGVwdGhMb2FkT3AgPSBHUFVMb2FkT3AuQ2xlYXI7XHJcblx0XHRcdFx0ZGVwdGhTdGVuY2lsQXR0YWNobWVudC5kZXB0aFN0b3JlT3AgPSBHUFVTdG9yZU9wLlN0b3JlO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0ZGVwdGhTdGVuY2lsQXR0YWNobWVudC5kZXB0aExvYWRPcCA9IEdQVUxvYWRPcC5Mb2FkO1xyXG5cdFx0XHRcdGRlcHRoU3RlbmNpbEF0dGFjaG1lbnQuZGVwdGhTdG9yZU9wID0gR1BVU3RvcmVPcC5TdG9yZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCByZW5kZXJDb250ZXh0LnN0ZW5jaWwgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHJlbmRlckNvbnRleHQuY2xlYXJTdGVuY2lsICkge1xyXG5cclxuXHRcdFx0XHRkZXB0aFN0ZW5jaWxBdHRhY2htZW50LnN0ZW5jaWxDbGVhclZhbHVlID0gcmVuZGVyQ29udGV4dC5jbGVhclN0ZW5jaWxWYWx1ZTtcclxuXHRcdFx0XHRkZXB0aFN0ZW5jaWxBdHRhY2htZW50LnN0ZW5jaWxMb2FkT3AgPSBHUFVMb2FkT3AuQ2xlYXI7XHJcblx0XHRcdFx0ZGVwdGhTdGVuY2lsQXR0YWNobWVudC5zdGVuY2lsU3RvcmVPcCA9IEdQVVN0b3JlT3AuU3RvcmU7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRkZXB0aFN0ZW5jaWxBdHRhY2htZW50LnN0ZW5jaWxMb2FkT3AgPSBHUFVMb2FkT3AuTG9hZDtcclxuXHRcdFx0XHRkZXB0aFN0ZW5jaWxBdHRhY2htZW50LnN0ZW5jaWxTdG9yZU9wID0gR1BVU3RvcmVPcC5TdG9yZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCBlbmNvZGVyID0gZGV2aWNlLmNyZWF0ZUNvbW1hbmRFbmNvZGVyKCB7IGxhYmVsOiAncmVuZGVyQ29udGV4dF8nICsgcmVuZGVyQ29udGV4dC5pZCB9ICk7XHJcblx0XHRjb25zdCBjdXJyZW50UGFzcyA9IGVuY29kZXIuYmVnaW5SZW5kZXJQYXNzKCBkZXNjcmlwdG9yICk7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRyZW5kZXJDb250ZXh0RGF0YS5kZXNjcmlwdG9yID0gZGVzY3JpcHRvcjtcclxuXHRcdHJlbmRlckNvbnRleHREYXRhLmVuY29kZXIgPSBlbmNvZGVyO1xyXG5cdFx0cmVuZGVyQ29udGV4dERhdGEuY3VycmVudFBhc3MgPSBjdXJyZW50UGFzcztcclxuXHRcdHJlbmRlckNvbnRleHREYXRhLmN1cnJlbnRTZXRzID0geyBhdHRyaWJ1dGVzOiB7fSwgYmluZGluZ0dyb3VwczogW10sIHBpcGVsaW5lOiBudWxsLCBpbmRleDogbnVsbCB9O1xyXG5cdFx0cmVuZGVyQ29udGV4dERhdGEucmVuZGVyQnVuZGxlcyA9IFtdO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0aWYgKCByZW5kZXJDb250ZXh0LnZpZXdwb3J0ICkge1xyXG5cclxuXHRcdFx0dGhpcy51cGRhdGVWaWV3cG9ydCggcmVuZGVyQ29udGV4dCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHJlbmRlckNvbnRleHQuc2Npc3NvciApIHtcclxuXHJcblx0XHRcdGNvbnN0IHsgeCwgeSwgd2lkdGgsIGhlaWdodCB9ID0gcmVuZGVyQ29udGV4dC5zY2lzc29yVmFsdWU7XHJcblxyXG5cdFx0XHRjdXJyZW50UGFzcy5zZXRTY2lzc29yUmVjdCggeCwgeSwgd2lkdGgsIGhlaWdodCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyBleGVjdXRlZCBhdCB0aGUgZW5kIG9mIGEgcmVuZGVyIGNhbGwgYW5kIGZpbmFsaXplcyB3b3JrXHJcblx0ICogYWZ0ZXIgZHJhdyBjYWxscy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyQ29udGV4dH0gcmVuZGVyQ29udGV4dCAtIFRoZSByZW5kZXIgY29udGV4dC5cclxuXHQgKi9cclxuXHRmaW5pc2hSZW5kZXIoIHJlbmRlckNvbnRleHQgKSB7XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyQ29udGV4dERhdGEgPSB0aGlzLmdldCggcmVuZGVyQ29udGV4dCApO1xyXG5cdFx0Y29uc3Qgb2NjbHVzaW9uUXVlcnlDb3VudCA9IHJlbmRlckNvbnRleHQub2NjbHVzaW9uUXVlcnlDb3VudDtcclxuXHJcblx0XHRpZiAoIHJlbmRlckNvbnRleHREYXRhLnJlbmRlckJ1bmRsZXMubGVuZ3RoID4gMCApIHtcclxuXHJcblx0XHRcdHJlbmRlckNvbnRleHREYXRhLmN1cnJlbnRQYXNzLmV4ZWN1dGVCdW5kbGVzKCByZW5kZXJDb250ZXh0RGF0YS5yZW5kZXJCdW5kbGVzICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggb2NjbHVzaW9uUXVlcnlDb3VudCA+IHJlbmRlckNvbnRleHREYXRhLm9jY2x1c2lvblF1ZXJ5SW5kZXggKSB7XHJcblxyXG5cdFx0XHRyZW5kZXJDb250ZXh0RGF0YS5jdXJyZW50UGFzcy5lbmRPY2NsdXNpb25RdWVyeSgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZW5kZXJDb250ZXh0RGF0YS5jdXJyZW50UGFzcy5lbmQoKTtcclxuXHJcblx0XHRpZiAoIG9jY2x1c2lvblF1ZXJ5Q291bnQgPiAwICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYnVmZmVyU2l6ZSA9IG9jY2x1c2lvblF1ZXJ5Q291bnQgKiA4OyAvLyA4IGJ5dGUgZW50cmllcyBmb3IgcXVlcnkgcmVzdWx0c1xyXG5cclxuXHRcdFx0Ly9cclxuXHJcblx0XHRcdGxldCBxdWVyeVJlc29sdmVCdWZmZXIgPSB0aGlzLm9jY2x1ZGVkUmVzb2x2ZUNhY2hlLmdldCggYnVmZmVyU2l6ZSApO1xyXG5cclxuXHRcdFx0aWYgKCBxdWVyeVJlc29sdmVCdWZmZXIgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0cXVlcnlSZXNvbHZlQnVmZmVyID0gdGhpcy5kZXZpY2UuY3JlYXRlQnVmZmVyKFxyXG5cdFx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0XHRzaXplOiBidWZmZXJTaXplLFxyXG5cdFx0XHRcdFx0XHR1c2FnZTogR1BVQnVmZmVyVXNhZ2UuUVVFUllfUkVTT0xWRSB8IEdQVUJ1ZmZlclVzYWdlLkNPUFlfU1JDXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0KTtcclxuXHJcblx0XHRcdFx0dGhpcy5vY2NsdWRlZFJlc29sdmVDYWNoZS5zZXQoIGJ1ZmZlclNpemUsIHF1ZXJ5UmVzb2x2ZUJ1ZmZlciApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly9cclxuXHJcblx0XHRcdGNvbnN0IHJlYWRCdWZmZXIgPSB0aGlzLmRldmljZS5jcmVhdGVCdWZmZXIoXHJcblx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0c2l6ZTogYnVmZmVyU2l6ZSxcclxuXHRcdFx0XHRcdHVzYWdlOiBHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVCB8IEdQVUJ1ZmZlclVzYWdlLk1BUF9SRUFEXHJcblx0XHRcdFx0fVxyXG5cdFx0XHQpO1xyXG5cclxuXHRcdFx0Ly8gdHdvIGJ1ZmZlcnMgcmVxdWlyZWQgaGVyZSAtIFdlYkdQVSBkb2Vzbid0IGFsbG93IHVzYWdlIG9mIFFVRVJZX1JFU09MVkUgJiBNQVBfUkVBRCB0byBiZSBjb21iaW5lZFxyXG5cdFx0XHRyZW5kZXJDb250ZXh0RGF0YS5lbmNvZGVyLnJlc29sdmVRdWVyeVNldCggcmVuZGVyQ29udGV4dERhdGEub2NjbHVzaW9uUXVlcnlTZXQsIDAsIG9jY2x1c2lvblF1ZXJ5Q291bnQsIHF1ZXJ5UmVzb2x2ZUJ1ZmZlciwgMCApO1xyXG5cdFx0XHRyZW5kZXJDb250ZXh0RGF0YS5lbmNvZGVyLmNvcHlCdWZmZXJUb0J1ZmZlciggcXVlcnlSZXNvbHZlQnVmZmVyLCAwLCByZWFkQnVmZmVyLCAwLCBidWZmZXJTaXplICk7XHJcblxyXG5cdFx0XHRyZW5kZXJDb250ZXh0RGF0YS5vY2NsdXNpb25RdWVyeUJ1ZmZlciA9IHJlYWRCdWZmZXI7XHJcblxyXG5cdFx0XHQvL1xyXG5cclxuXHRcdFx0dGhpcy5yZXNvbHZlT2NjbHVkZWRBc3luYyggcmVuZGVyQ29udGV4dCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmRldmljZS5xdWV1ZS5zdWJtaXQoIFsgcmVuZGVyQ29udGV4dERhdGEuZW5jb2Rlci5maW5pc2goKSBdICk7XHJcblxyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0aWYgKCByZW5kZXJDb250ZXh0LnRleHR1cmVzICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdGV4dHVyZXMgPSByZW5kZXJDb250ZXh0LnRleHR1cmVzO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdGV4dHVyZXMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB0ZXh0dXJlID0gdGV4dHVyZXNbIGkgXTtcclxuXHJcblx0XHRcdFx0aWYgKCB0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0XHR0aGlzLnRleHR1cmVVdGlscy5nZW5lcmF0ZU1pcG1hcHMoIHRleHR1cmUgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gM0Qgb2JqZWN0IGlzIGZ1bGx5IG9jY2x1ZGVkIGJ5IG90aGVyXHJcblx0ICogM0Qgb2JqZWN0cyBpbiB0aGUgc2NlbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JlbmRlckNvbnRleHR9IHJlbmRlckNvbnRleHQgLSBUaGUgcmVuZGVyIGNvbnRleHQuXHJcblx0ICogQHBhcmFtIHtPYmplY3QzRH0gb2JqZWN0IC0gVGhlIDNEIG9iamVjdCB0byB0ZXN0LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIDNEIG9iamVjdCBpcyBmdWxseSBvY2NsdWRlZCBvciBub3QuXHJcblx0ICovXHJcblx0aXNPY2NsdWRlZCggcmVuZGVyQ29udGV4dCwgb2JqZWN0ICkge1xyXG5cclxuXHRcdGNvbnN0IHJlbmRlckNvbnRleHREYXRhID0gdGhpcy5nZXQoIHJlbmRlckNvbnRleHQgKTtcclxuXHJcblx0XHRyZXR1cm4gcmVuZGVyQ29udGV4dERhdGEub2NjbHVkZWQgJiYgcmVuZGVyQ29udGV4dERhdGEub2NjbHVkZWQuaGFzKCBvYmplY3QgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBwcm9jZXNzZXMgdGhlIHJlc3VsdCBvZiBvY2NsdXNpb24gcXVlcmllcyBhbmQgd3JpdGVzIGl0XHJcblx0ICogaW50byByZW5kZXIgY29udGV4dCBkYXRhLlxyXG5cdCAqXHJcblx0ICogQGFzeW5jXHJcblx0ICogQHBhcmFtIHtSZW5kZXJDb250ZXh0fSByZW5kZXJDb250ZXh0IC0gVGhlIHJlbmRlciBjb250ZXh0LlxyXG5cdCAqIEByZXR1cm4ge1Byb21pc2V9IEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG9jY2x1c2lvbiBxdWVyeSByZXN1bHRzIGhhdmUgYmVlbiBwcm9jZXNzZWQuXHJcblx0ICovXHJcblx0YXN5bmMgcmVzb2x2ZU9jY2x1ZGVkQXN5bmMoIHJlbmRlckNvbnRleHQgKSB7XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyQ29udGV4dERhdGEgPSB0aGlzLmdldCggcmVuZGVyQ29udGV4dCApO1xyXG5cclxuXHRcdC8vIGhhbmRsZSBvY2NsdXNpb24gcXVlcnkgcmVzdWx0c1xyXG5cclxuXHRcdGNvbnN0IHsgY3VycmVudE9jY2x1c2lvblF1ZXJ5QnVmZmVyLCBjdXJyZW50T2NjbHVzaW9uUXVlcnlPYmplY3RzIH0gPSByZW5kZXJDb250ZXh0RGF0YTtcclxuXHJcblx0XHRpZiAoIGN1cnJlbnRPY2NsdXNpb25RdWVyeUJ1ZmZlciAmJiBjdXJyZW50T2NjbHVzaW9uUXVlcnlPYmplY3RzICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgb2NjbHVkZWQgPSBuZXcgV2Vha1NldCgpO1xyXG5cclxuXHRcdFx0cmVuZGVyQ29udGV4dERhdGEuY3VycmVudE9jY2x1c2lvblF1ZXJ5T2JqZWN0cyA9IG51bGw7XHJcblx0XHRcdHJlbmRlckNvbnRleHREYXRhLmN1cnJlbnRPY2NsdXNpb25RdWVyeUJ1ZmZlciA9IG51bGw7XHJcblxyXG5cdFx0XHRhd2FpdCBjdXJyZW50T2NjbHVzaW9uUXVlcnlCdWZmZXIubWFwQXN5bmMoIEdQVU1hcE1vZGUuUkVBRCApO1xyXG5cclxuXHRcdFx0Y29uc3QgYnVmZmVyID0gY3VycmVudE9jY2x1c2lvblF1ZXJ5QnVmZmVyLmdldE1hcHBlZFJhbmdlKCk7XHJcblx0XHRcdGNvbnN0IHJlc3VsdHMgPSBuZXcgQmlnVWludDY0QXJyYXkoIGJ1ZmZlciApO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgY3VycmVudE9jY2x1c2lvblF1ZXJ5T2JqZWN0cy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggcmVzdWx0c1sgaSBdID09PSBCaWdJbnQoIDAgKSApIHtcclxuXHJcblx0XHRcdFx0XHRvY2NsdWRlZC5hZGQoIGN1cnJlbnRPY2NsdXNpb25RdWVyeU9iamVjdHNbIGkgXSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjdXJyZW50T2NjbHVzaW9uUXVlcnlCdWZmZXIuZGVzdHJveSgpO1xyXG5cclxuXHRcdFx0cmVuZGVyQ29udGV4dERhdGEub2NjbHVkZWQgPSBvY2NsdWRlZDtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgdmlld3BvcnQgd2l0aCB0aGUgdmFsdWVzIGZyb20gdGhlIGdpdmVuIHJlbmRlciBjb250ZXh0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSZW5kZXJDb250ZXh0fSByZW5kZXJDb250ZXh0IC0gVGhlIHJlbmRlciBjb250ZXh0LlxyXG5cdCAqL1xyXG5cdHVwZGF0ZVZpZXdwb3J0KCByZW5kZXJDb250ZXh0ICkge1xyXG5cclxuXHRcdGNvbnN0IHsgY3VycmVudFBhc3MgfSA9IHRoaXMuZ2V0KCByZW5kZXJDb250ZXh0ICk7XHJcblx0XHRjb25zdCB7IHgsIHksIHdpZHRoLCBoZWlnaHQsIG1pbkRlcHRoLCBtYXhEZXB0aCB9ID0gcmVuZGVyQ29udGV4dC52aWV3cG9ydFZhbHVlO1xyXG5cclxuXHRcdGN1cnJlbnRQYXNzLnNldFZpZXdwb3J0KCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBtaW5EZXB0aCwgbWF4RGVwdGggKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBjbGVhciBjb2xvciBhbmQgYWxwaGEgaW50byBhIHNpbmdsZVxyXG5cdCAqIGNvbG9yIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0NvbG9yNH0gVGhlIGNsZWFyIGNvbG9yLlxyXG5cdCAqL1xyXG5cdGdldENsZWFyQ29sb3IoKSB7XHJcblxyXG5cdFx0Y29uc3QgY2xlYXJDb2xvciA9IHN1cGVyLmdldENsZWFyQ29sb3IoKTtcclxuXHJcblx0XHQvLyBvbmx5IHByZW11bHRpcGx5IGFscGhhIHdoZW4gYWxwaGFNb2RlIGlzIFwicHJlbXVsdGlwbGllZFwiXHJcblxyXG5cdFx0aWYgKCB0aGlzLnJlbmRlcmVyLmFscGhhID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0Y2xlYXJDb2xvci5yICo9IGNsZWFyQ29sb3IuYTtcclxuXHRcdFx0Y2xlYXJDb2xvci5nICo9IGNsZWFyQ29sb3IuYTtcclxuXHRcdFx0Y2xlYXJDb2xvci5iICo9IGNsZWFyQ29sb3IuYTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGNsZWFyQ29sb3I7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUGVyZm9ybXMgYSBjbGVhciBvcGVyYXRpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IGNvbG9yIC0gV2hldGhlciB0aGUgY29sb3IgYnVmZmVyIHNob3VsZCBiZSBjbGVhcmVkIG9yIG5vdC5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IGRlcHRoIC0gV2hldGhlciB0aGUgZGVwdGggYnVmZmVyIHNob3VsZCBiZSBjbGVhcmVkIG9yIG5vdC5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IHN0ZW5jaWwgLSBXaGV0aGVyIHRoZSBzdGVuY2lsIGJ1ZmZlciBzaG91bGQgYmUgY2xlYXJlZCBvciBub3QuXHJcblx0ICogQHBhcmFtIHs/UmVuZGVyQ29udGV4dH0gW3JlbmRlclRhcmdldENvbnRleHQ9bnVsbF0gLSBUaGUgcmVuZGVyIGNvbnRleHQgb2YgdGhlIGN1cnJlbnQgc2V0IHJlbmRlciB0YXJnZXQuXHJcblx0ICovXHJcblx0Y2xlYXIoIGNvbG9yLCBkZXB0aCwgc3RlbmNpbCwgcmVuZGVyVGFyZ2V0Q29udGV4dCA9IG51bGwgKSB7XHJcblxyXG5cdFx0Y29uc3QgZGV2aWNlID0gdGhpcy5kZXZpY2U7XHJcblx0XHRjb25zdCByZW5kZXJlciA9IHRoaXMucmVuZGVyZXI7XHJcblxyXG5cdFx0bGV0IGNvbG9yQXR0YWNobWVudHMgPSBbXTtcclxuXHRcdGxldCBkZXB0aFN0ZW5jaWxBdHRhY2htZW50O1xyXG5cdFx0bGV0IGNsZWFyVmFsdWU7XHJcblxyXG5cdFx0bGV0IHN1cHBvcnRzRGVwdGg7XHJcblx0XHRsZXQgc3VwcG9ydHNTdGVuY2lsO1xyXG5cclxuXHRcdGlmICggY29sb3IgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBjbGVhckNvbG9yID0gdGhpcy5nZXRDbGVhckNvbG9yKCk7XHJcblx0XHRcdGNsZWFyVmFsdWUgPSB7IHI6IGNsZWFyQ29sb3IuciwgZzogY2xlYXJDb2xvci5nLCBiOiBjbGVhckNvbG9yLmIsIGE6IGNsZWFyQ29sb3IuYSB9O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHJlbmRlclRhcmdldENvbnRleHQgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRzdXBwb3J0c0RlcHRoID0gcmVuZGVyZXIuZGVwdGg7XHJcblx0XHRcdHN1cHBvcnRzU3RlbmNpbCA9IHJlbmRlcmVyLnN0ZW5jaWw7XHJcblxyXG5cdFx0XHRjb25zdCBkZXNjcmlwdG9yID0gdGhpcy5fZ2V0RGVmYXVsdFJlbmRlclBhc3NEZXNjcmlwdG9yKCk7XHJcblxyXG5cdFx0XHRpZiAoIGNvbG9yICkge1xyXG5cclxuXHRcdFx0XHRjb2xvckF0dGFjaG1lbnRzID0gZGVzY3JpcHRvci5jb2xvckF0dGFjaG1lbnRzO1xyXG5cclxuXHRcdFx0XHRjb25zdCBjb2xvckF0dGFjaG1lbnQgPSBjb2xvckF0dGFjaG1lbnRzWyAwIF07XHJcblxyXG5cdFx0XHRcdGNvbG9yQXR0YWNobWVudC5jbGVhclZhbHVlID0gY2xlYXJWYWx1ZTtcclxuXHRcdFx0XHRjb2xvckF0dGFjaG1lbnQubG9hZE9wID0gR1BVTG9hZE9wLkNsZWFyO1xyXG5cdFx0XHRcdGNvbG9yQXR0YWNobWVudC5zdG9yZU9wID0gR1BVU3RvcmVPcC5TdG9yZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggc3VwcG9ydHNEZXB0aCB8fCBzdXBwb3J0c1N0ZW5jaWwgKSB7XHJcblxyXG5cdFx0XHRcdGRlcHRoU3RlbmNpbEF0dGFjaG1lbnQgPSBkZXNjcmlwdG9yLmRlcHRoU3RlbmNpbEF0dGFjaG1lbnQ7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHN1cHBvcnRzRGVwdGggPSByZW5kZXJUYXJnZXRDb250ZXh0LmRlcHRoO1xyXG5cdFx0XHRzdXBwb3J0c1N0ZW5jaWwgPSByZW5kZXJUYXJnZXRDb250ZXh0LnN0ZW5jaWw7XHJcblxyXG5cdFx0XHRjb25zdCBjbGVhckNvbmZpZyA9IHtcclxuXHRcdFx0XHRsb2FkT3A6IGNvbG9yID8gR1BVTG9hZE9wLkNsZWFyIDogR1BVTG9hZE9wLkxvYWQsXHJcblx0XHRcdFx0Y2xlYXJWYWx1ZTogY29sb3IgPyBjbGVhclZhbHVlIDogdW5kZWZpbmVkXHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHRpZiAoIHN1cHBvcnRzRGVwdGggKSB7XHJcblxyXG5cdFx0XHRcdGNsZWFyQ29uZmlnLmRlcHRoTG9hZE9wID0gZGVwdGggPyBHUFVMb2FkT3AuQ2xlYXIgOiBHUFVMb2FkT3AuTG9hZDtcclxuXHRcdFx0XHRjbGVhckNvbmZpZy5kZXB0aENsZWFyVmFsdWUgPSBkZXB0aCA/IHJlbmRlcmVyLmdldENsZWFyRGVwdGgoKSA6IHVuZGVmaW5lZDtcclxuXHRcdFx0XHRjbGVhckNvbmZpZy5kZXB0aFN0b3JlT3AgPSBHUFVTdG9yZU9wLlN0b3JlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBzdXBwb3J0c1N0ZW5jaWwgKSB7XHJcblxyXG5cdFx0XHRcdGNsZWFyQ29uZmlnLnN0ZW5jaWxMb2FkT3AgPSBzdGVuY2lsID8gR1BVTG9hZE9wLkNsZWFyIDogR1BVTG9hZE9wLkxvYWQ7XHJcblx0XHRcdFx0Y2xlYXJDb25maWcuc3RlbmNpbENsZWFyVmFsdWUgPSBzdGVuY2lsID8gcmVuZGVyZXIuZ2V0Q2xlYXJTdGVuY2lsKCkgOiB1bmRlZmluZWQ7XHJcblx0XHRcdFx0Y2xlYXJDb25maWcuc3RlbmNpbFN0b3JlT3AgPSBHUFVTdG9yZU9wLlN0b3JlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgZGVzY3JpcHRvciA9IHRoaXMuX2dldFJlbmRlclBhc3NEZXNjcmlwdG9yKCByZW5kZXJUYXJnZXRDb250ZXh0LCBjbGVhckNvbmZpZyApO1xyXG5cclxuXHRcdFx0Y29sb3JBdHRhY2htZW50cyA9IGRlc2NyaXB0b3IuY29sb3JBdHRhY2htZW50cztcclxuXHRcdFx0ZGVwdGhTdGVuY2lsQXR0YWNobWVudCA9IGRlc2NyaXB0b3IuZGVwdGhTdGVuY2lsQXR0YWNobWVudDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBzdXBwb3J0c0RlcHRoICYmIGRlcHRoU3RlbmNpbEF0dGFjaG1lbnQgJiYgZGVwdGhTdGVuY2lsQXR0YWNobWVudC5kZXB0aExvYWRPcCA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0aWYgKCBkZXB0aCApIHtcclxuXHJcblx0XHRcdFx0ZGVwdGhTdGVuY2lsQXR0YWNobWVudC5kZXB0aExvYWRPcCA9IEdQVUxvYWRPcC5DbGVhcjtcclxuXHRcdFx0XHRkZXB0aFN0ZW5jaWxBdHRhY2htZW50LmRlcHRoQ2xlYXJWYWx1ZSA9IHJlbmRlcmVyLmdldENsZWFyRGVwdGgoKTtcclxuXHRcdFx0XHRkZXB0aFN0ZW5jaWxBdHRhY2htZW50LmRlcHRoU3RvcmVPcCA9IEdQVVN0b3JlT3AuU3RvcmU7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRkZXB0aFN0ZW5jaWxBdHRhY2htZW50LmRlcHRoTG9hZE9wID0gR1BVTG9hZE9wLkxvYWQ7XHJcblx0XHRcdFx0ZGVwdGhTdGVuY2lsQXR0YWNobWVudC5kZXB0aFN0b3JlT3AgPSBHUFVTdG9yZU9wLlN0b3JlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGlmICggc3VwcG9ydHNTdGVuY2lsICYmIGRlcHRoU3RlbmNpbEF0dGFjaG1lbnQgJiYgZGVwdGhTdGVuY2lsQXR0YWNobWVudC5zdGVuY2lsTG9hZE9wID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHN0ZW5jaWwgKSB7XHJcblxyXG5cdFx0XHRcdGRlcHRoU3RlbmNpbEF0dGFjaG1lbnQuc3RlbmNpbExvYWRPcCA9IEdQVUxvYWRPcC5DbGVhcjtcclxuXHRcdFx0XHRkZXB0aFN0ZW5jaWxBdHRhY2htZW50LnN0ZW5jaWxDbGVhclZhbHVlID0gcmVuZGVyZXIuZ2V0Q2xlYXJTdGVuY2lsKCk7XHJcblx0XHRcdFx0ZGVwdGhTdGVuY2lsQXR0YWNobWVudC5zdGVuY2lsU3RvcmVPcCA9IEdQVVN0b3JlT3AuU3RvcmU7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRkZXB0aFN0ZW5jaWxBdHRhY2htZW50LnN0ZW5jaWxMb2FkT3AgPSBHUFVMb2FkT3AuTG9hZDtcclxuXHRcdFx0XHRkZXB0aFN0ZW5jaWxBdHRhY2htZW50LnN0ZW5jaWxTdG9yZU9wID0gR1BVU3RvcmVPcC5TdG9yZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCBlbmNvZGVyID0gZGV2aWNlLmNyZWF0ZUNvbW1hbmRFbmNvZGVyKCB7IGxhYmVsOiAnY2xlYXInIH0gKTtcclxuXHRcdGNvbnN0IGN1cnJlbnRQYXNzID0gZW5jb2Rlci5iZWdpblJlbmRlclBhc3MoIHtcclxuXHRcdFx0Y29sb3JBdHRhY2htZW50cyxcclxuXHRcdFx0ZGVwdGhTdGVuY2lsQXR0YWNobWVudFxyXG5cdFx0fSApO1xyXG5cclxuXHRcdGN1cnJlbnRQYXNzLmVuZCgpO1xyXG5cclxuXHRcdGRldmljZS5xdWV1ZS5zdWJtaXQoIFsgZW5jb2Rlci5maW5pc2goKSBdICk7XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gY29tcHV0ZVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyBleGVjdXRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgY29tcHV0ZSBjYWxsIGFuZFxyXG5cdCAqIHByZXBhcmVzIHRoZSBzdGF0ZSBmb3IgdXBjb21pbmcgY29tcHV0ZSB0YXNrcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZXxBcnJheTxOb2RlPn0gY29tcHV0ZUdyb3VwIC0gVGhlIGNvbXB1dGUgbm9kZShzKS5cclxuXHQgKi9cclxuXHRiZWdpbkNvbXB1dGUoIGNvbXB1dGVHcm91cCApIHtcclxuXHJcblx0XHRjb25zdCBncm91cEdQVSA9IHRoaXMuZ2V0KCBjb21wdXRlR3JvdXAgKTtcclxuXHJcblxyXG5cdFx0Y29uc3QgZGVzY3JpcHRvciA9IHtcclxuXHRcdFx0bGFiZWw6ICdjb21wdXRlR3JvdXBfJyArIGNvbXB1dGVHcm91cC5pZFxyXG5cdFx0fTtcclxuXHJcblx0XHR0aGlzLmluaXRUaW1lc3RhbXBRdWVyeSggY29tcHV0ZUdyb3VwLCBkZXNjcmlwdG9yICk7XHJcblxyXG5cdFx0Z3JvdXBHUFUuY21kRW5jb2RlckdQVSA9IHRoaXMuZGV2aWNlLmNyZWF0ZUNvbW1hbmRFbmNvZGVyKCB7IGxhYmVsOiAnY29tcHV0ZUdyb3VwXycgKyBjb21wdXRlR3JvdXAuaWQgfSApO1xyXG5cclxuXHRcdGdyb3VwR1BVLnBhc3NFbmNvZGVyR1BVID0gZ3JvdXBHUFUuY21kRW5jb2RlckdQVS5iZWdpbkNvbXB1dGVQYXNzKCBkZXNjcmlwdG9yICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRXhlY3V0ZXMgYSBjb21wdXRlIGNvbW1hbmQgZm9yIHRoZSBnaXZlbiBjb21wdXRlIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV8QXJyYXk8Tm9kZT59IGNvbXB1dGVHcm91cCAtIFRoZSBncm91cCBvZiBjb21wdXRlIG5vZGVzIG9mIGEgY29tcHV0ZSBjYWxsLiBDYW4gYmUgYSBzaW5nbGUgY29tcHV0ZSBub2RlLlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gY29tcHV0ZU5vZGUgLSBUaGUgY29tcHV0ZSBub2RlLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8QmluZEdyb3VwPn0gYmluZGluZ3MgLSBUaGUgYmluZGluZ3MuXHJcblx0ICogQHBhcmFtIHtDb21wdXRlUGlwZWxpbmV9IHBpcGVsaW5lIC0gVGhlIGNvbXB1dGUgcGlwZWxpbmUuXHJcblx0ICovXHJcblx0Y29tcHV0ZSggY29tcHV0ZUdyb3VwLCBjb21wdXRlTm9kZSwgYmluZGluZ3MsIHBpcGVsaW5lICkge1xyXG5cclxuXHRcdGNvbnN0IHsgcGFzc0VuY29kZXJHUFUgfSA9IHRoaXMuZ2V0KCBjb21wdXRlR3JvdXAgKTtcclxuXHJcblx0XHQvLyBwaXBlbGluZVxyXG5cclxuXHRcdGNvbnN0IHBpcGVsaW5lR1BVID0gdGhpcy5nZXQoIHBpcGVsaW5lICkucGlwZWxpbmU7XHJcblx0XHRwYXNzRW5jb2RlckdQVS5zZXRQaXBlbGluZSggcGlwZWxpbmVHUFUgKTtcclxuXHJcblx0XHQvLyBiaW5kIGdyb3Vwc1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGJpbmRpbmdzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBiaW5kR3JvdXAgPSBiaW5kaW5nc1sgaSBdO1xyXG5cdFx0XHRjb25zdCBiaW5kaW5nc0RhdGEgPSB0aGlzLmdldCggYmluZEdyb3VwICk7XHJcblxyXG5cdFx0XHRwYXNzRW5jb2RlckdQVS5zZXRCaW5kR3JvdXAoIGksIGJpbmRpbmdzRGF0YS5ncm91cCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBtYXhDb21wdXRlV29ya2dyb3Vwc1BlckRpbWVuc2lvbiA9IHRoaXMuZGV2aWNlLmxpbWl0cy5tYXhDb21wdXRlV29ya2dyb3Vwc1BlckRpbWVuc2lvbjtcclxuXHJcblx0XHRjb25zdCBjb21wdXRlTm9kZURhdGEgPSB0aGlzLmdldCggY29tcHV0ZU5vZGUgKTtcclxuXHJcblx0XHRpZiAoIGNvbXB1dGVOb2RlRGF0YS5kaXNwYXRjaFNpemUgPT09IHVuZGVmaW5lZCApIGNvbXB1dGVOb2RlRGF0YS5kaXNwYXRjaFNpemUgPSB7IHg6IDAsIHk6IDEsIHo6IDEgfTtcclxuXHJcblx0XHRjb25zdCB7IGRpc3BhdGNoU2l6ZSB9ID0gY29tcHV0ZU5vZGVEYXRhO1xyXG5cclxuXHRcdGlmICggY29tcHV0ZU5vZGUuZGlzcGF0Y2hDb3VudCA+IG1heENvbXB1dGVXb3JrZ3JvdXBzUGVyRGltZW5zaW9uICkge1xyXG5cclxuXHRcdFx0ZGlzcGF0Y2hTaXplLnggPSBNYXRoLm1pbiggY29tcHV0ZU5vZGUuZGlzcGF0Y2hDb3VudCwgbWF4Q29tcHV0ZVdvcmtncm91cHNQZXJEaW1lbnNpb24gKTtcclxuXHRcdFx0ZGlzcGF0Y2hTaXplLnkgPSBNYXRoLmNlaWwoIGNvbXB1dGVOb2RlLmRpc3BhdGNoQ291bnQgLyBtYXhDb21wdXRlV29ya2dyb3Vwc1BlckRpbWVuc2lvbiApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRkaXNwYXRjaFNpemUueCA9IGNvbXB1dGVOb2RlLmRpc3BhdGNoQ291bnQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHBhc3NFbmNvZGVyR1BVLmRpc3BhdGNoV29ya2dyb3VwcyhcclxuXHRcdFx0ZGlzcGF0Y2hTaXplLngsXHJcblx0XHRcdGRpc3BhdGNoU2l6ZS55LFxyXG5cdFx0XHRkaXNwYXRjaFNpemUuelxyXG5cdFx0KTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyBleGVjdXRlZCBhdCB0aGUgZW5kIG9mIGEgY29tcHV0ZSBjYWxsIGFuZFxyXG5cdCAqIGZpbmFsaXplcyB3b3JrIGFmdGVyIGNvbXB1dGUgdGFza3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV8QXJyYXk8Tm9kZT59IGNvbXB1dGVHcm91cCAtIFRoZSBjb21wdXRlIG5vZGUocykuXHJcblx0ICovXHJcblx0ZmluaXNoQ29tcHV0ZSggY29tcHV0ZUdyb3VwICkge1xyXG5cclxuXHRcdGNvbnN0IGdyb3VwRGF0YSA9IHRoaXMuZ2V0KCBjb21wdXRlR3JvdXAgKTtcclxuXHJcblx0XHRncm91cERhdGEucGFzc0VuY29kZXJHUFUuZW5kKCk7XHJcblxyXG5cdFx0dGhpcy5kZXZpY2UucXVldWUuc3VibWl0KCBbIGdyb3VwRGF0YS5jbWRFbmNvZGVyR1BVLmZpbmlzaCgpIF0gKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDYW4gYmUgdXNlZCB0byBzeW5jaHJvbml6ZSBDUFUgb3BlcmF0aW9ucyB3aXRoIEdQVSB0YXNrcy4gU28gd2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsXHJcblx0ICogdGhlIENQVSB3YWl0cyBmb3IgdGhlIEdQVSB0byBjb21wbGV0ZSBpdHMgb3BlcmF0aW9uIChlLmcuIGEgY29tcHV0ZSB0YXNrKS5cclxuXHQgKlxyXG5cdCAqIEBhc3luY1xyXG5cdCAqIEByZXR1cm4ge1Byb21pc2V9IEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gc3luY2hyb25pemF0aW9uIGhhcyBiZWVuIGZpbmlzaGVkLlxyXG5cdCAqL1xyXG5cdGFzeW5jIHdhaXRGb3JHUFUoKSB7XHJcblxyXG5cdFx0YXdhaXQgdGhpcy5kZXZpY2UucXVldWUub25TdWJtaXR0ZWRXb3JrRG9uZSgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vIHJlbmRlciBvYmplY3RcclxuXHJcblx0LyoqXHJcblx0ICogRXhlY3V0ZXMgYSBkcmF3IGNvbW1hbmQgZm9yIHRoZSBnaXZlbiByZW5kZXIgb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSZW5kZXJPYmplY3R9IHJlbmRlck9iamVjdCAtIFRoZSByZW5kZXIgb2JqZWN0IHRvIGRyYXcuXHJcblx0ICogQHBhcmFtIHtJbmZvfSBpbmZvIC0gSG9sZHMgYSBzZXJpZXMgb2Ygc3RhdGlzdGljYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEdQVSBtZW1vcnkgYW5kIHRoZSByZW5kZXJpbmcgcHJvY2Vzcy5cclxuXHQgKi9cclxuXHRkcmF3KCByZW5kZXJPYmplY3QsIGluZm8gKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBvYmplY3QsIG1hdGVyaWFsLCBjb250ZXh0LCBwaXBlbGluZSB9ID0gcmVuZGVyT2JqZWN0O1xyXG5cdFx0Y29uc3QgYmluZGluZ3MgPSByZW5kZXJPYmplY3QuZ2V0QmluZGluZ3MoKTtcclxuXHRcdGNvbnN0IHJlbmRlckNvbnRleHREYXRhID0gdGhpcy5nZXQoIGNvbnRleHQgKTtcclxuXHRcdGNvbnN0IHBpcGVsaW5lR1BVID0gdGhpcy5nZXQoIHBpcGVsaW5lICkucGlwZWxpbmU7XHJcblx0XHRjb25zdCBjdXJyZW50U2V0cyA9IHJlbmRlckNvbnRleHREYXRhLmN1cnJlbnRTZXRzO1xyXG5cdFx0Y29uc3QgcGFzc0VuY29kZXJHUFUgPSByZW5kZXJDb250ZXh0RGF0YS5jdXJyZW50UGFzcztcclxuXHJcblx0XHRjb25zdCBkcmF3UGFyYW1zID0gcmVuZGVyT2JqZWN0LmdldERyYXdQYXJhbWV0ZXJzKCk7XHJcblxyXG5cdFx0aWYgKCBkcmF3UGFyYW1zID09PSBudWxsICkgcmV0dXJuO1xyXG5cclxuXHRcdC8vIHBpcGVsaW5lXHJcblxyXG5cdFx0aWYgKCBjdXJyZW50U2V0cy5waXBlbGluZSAhPT0gcGlwZWxpbmVHUFUgKSB7XHJcblxyXG5cdFx0XHRwYXNzRW5jb2RlckdQVS5zZXRQaXBlbGluZSggcGlwZWxpbmVHUFUgKTtcclxuXHJcblx0XHRcdGN1cnJlbnRTZXRzLnBpcGVsaW5lID0gcGlwZWxpbmVHUFU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGJpbmQgZ3JvdXBzXHJcblxyXG5cdFx0Y29uc3QgY3VycmVudEJpbmRpbmdHcm91cHMgPSBjdXJyZW50U2V0cy5iaW5kaW5nR3JvdXBzO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGJpbmRpbmdzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBiaW5kR3JvdXAgPSBiaW5kaW5nc1sgaSBdO1xyXG5cdFx0XHRjb25zdCBiaW5kaW5nc0RhdGEgPSB0aGlzLmdldCggYmluZEdyb3VwICk7XHJcblxyXG5cdFx0XHRpZiAoIGN1cnJlbnRCaW5kaW5nR3JvdXBzWyBiaW5kR3JvdXAuaW5kZXggXSAhPT0gYmluZEdyb3VwLmlkICkge1xyXG5cclxuXHRcdFx0XHRwYXNzRW5jb2RlckdQVS5zZXRCaW5kR3JvdXAoIGJpbmRHcm91cC5pbmRleCwgYmluZGluZ3NEYXRhLmdyb3VwICk7XHJcblx0XHRcdFx0Y3VycmVudEJpbmRpbmdHcm91cHNbIGJpbmRHcm91cC5pbmRleCBdID0gYmluZEdyb3VwLmlkO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBhdHRyaWJ1dGVzXHJcblxyXG5cdFx0Y29uc3QgaW5kZXggPSByZW5kZXJPYmplY3QuZ2V0SW5kZXgoKTtcclxuXHJcblx0XHRjb25zdCBoYXNJbmRleCA9ICggaW5kZXggIT09IG51bGwgKTtcclxuXHJcblx0XHQvLyBpbmRleFxyXG5cclxuXHRcdGlmICggaGFzSW5kZXggPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGN1cnJlbnRTZXRzLmluZGV4ICE9PSBpbmRleCApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgYnVmZmVyID0gdGhpcy5nZXQoIGluZGV4ICkuYnVmZmVyO1xyXG5cdFx0XHRcdGNvbnN0IGluZGV4Rm9ybWF0ID0gKCBpbmRleC5hcnJheSBpbnN0YW5jZW9mIFVpbnQxNkFycmF5ICkgPyBHUFVJbmRleEZvcm1hdC5VaW50MTYgOiBHUFVJbmRleEZvcm1hdC5VaW50MzI7XHJcblxyXG5cdFx0XHRcdHBhc3NFbmNvZGVyR1BVLnNldEluZGV4QnVmZmVyKCBidWZmZXIsIGluZGV4Rm9ybWF0ICk7XHJcblxyXG5cdFx0XHRcdGN1cnJlbnRTZXRzLmluZGV4ID0gaW5kZXg7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIHZlcnRleCBidWZmZXJzXHJcblxyXG5cdFx0Y29uc3QgdmVydGV4QnVmZmVycyA9IHJlbmRlck9iamVjdC5nZXRWZXJ0ZXhCdWZmZXJzKCk7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gdmVydGV4QnVmZmVycy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdmVydGV4QnVmZmVyID0gdmVydGV4QnVmZmVyc1sgaSBdO1xyXG5cclxuXHRcdFx0aWYgKCBjdXJyZW50U2V0cy5hdHRyaWJ1dGVzWyBpIF0gIT09IHZlcnRleEJ1ZmZlciApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgYnVmZmVyID0gdGhpcy5nZXQoIHZlcnRleEJ1ZmZlciApLmJ1ZmZlcjtcclxuXHRcdFx0XHRwYXNzRW5jb2RlckdQVS5zZXRWZXJ0ZXhCdWZmZXIoIGksIGJ1ZmZlciApO1xyXG5cclxuXHRcdFx0XHRjdXJyZW50U2V0cy5hdHRyaWJ1dGVzWyBpIF0gPSB2ZXJ0ZXhCdWZmZXI7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIG9jY2x1c2lvbiBxdWVyaWVzIC0gaGFuZGxlIG11bHRpcGxlIGNvbnNlY3V0aXZlIGRyYXcgY2FsbHMgZm9yIGFuIG9iamVjdFxyXG5cclxuXHRcdGlmICggcmVuZGVyQ29udGV4dERhdGEub2NjbHVzaW9uUXVlcnlTZXQgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGxhc3RPYmplY3QgPSByZW5kZXJDb250ZXh0RGF0YS5sYXN0T2NjbHVzaW9uT2JqZWN0O1xyXG5cclxuXHRcdFx0aWYgKCBsYXN0T2JqZWN0ICE9PSBvYmplY3QgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggbGFzdE9iamVjdCAhPT0gbnVsbCAmJiBsYXN0T2JqZWN0Lm9jY2x1c2lvblRlc3QgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0cGFzc0VuY29kZXJHUFUuZW5kT2NjbHVzaW9uUXVlcnkoKTtcclxuXHRcdFx0XHRcdHJlbmRlckNvbnRleHREYXRhLm9jY2x1c2lvblF1ZXJ5SW5kZXggKys7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKCBvYmplY3Qub2NjbHVzaW9uVGVzdCA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0XHRwYXNzRW5jb2RlckdQVS5iZWdpbk9jY2x1c2lvblF1ZXJ5KCByZW5kZXJDb250ZXh0RGF0YS5vY2NsdXNpb25RdWVyeUluZGV4ICk7XHJcblx0XHRcdFx0XHRyZW5kZXJDb250ZXh0RGF0YS5vY2NsdXNpb25RdWVyeU9iamVjdHNbIHJlbmRlckNvbnRleHREYXRhLm9jY2x1c2lvblF1ZXJ5SW5kZXggXSA9IG9iamVjdDtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRyZW5kZXJDb250ZXh0RGF0YS5sYXN0T2NjbHVzaW9uT2JqZWN0ID0gb2JqZWN0O1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBzdGVuY2lsXHJcblxyXG5cdFx0aWYgKCBjb250ZXh0LnN0ZW5jaWwgPT09IHRydWUgJiYgbWF0ZXJpYWwuc3RlbmNpbFdyaXRlID09PSB0cnVlICYmIHJlbmRlckNvbnRleHREYXRhLmN1cnJlbnRTdGVuY2lsUmVmICE9PSBtYXRlcmlhbC5zdGVuY2lsUmVmICkge1xyXG5cclxuXHRcdFx0cGFzc0VuY29kZXJHUFUuc2V0U3RlbmNpbFJlZmVyZW5jZSggbWF0ZXJpYWwuc3RlbmNpbFJlZiApO1xyXG5cdFx0XHRyZW5kZXJDb250ZXh0RGF0YS5jdXJyZW50U3RlbmNpbFJlZiA9IG1hdGVyaWFsLnN0ZW5jaWxSZWY7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGRyYXdcclxuXHJcblx0XHRjb25zdCBkcmF3ID0gKCkgPT4ge1xyXG5cclxuXHRcdFx0aWYgKCBvYmplY3QuaXNCYXRjaGVkTWVzaCA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0Y29uc3Qgc3RhcnRzID0gb2JqZWN0Ll9tdWx0aURyYXdTdGFydHM7XHJcblx0XHRcdFx0Y29uc3QgY291bnRzID0gb2JqZWN0Ll9tdWx0aURyYXdDb3VudHM7XHJcblx0XHRcdFx0Y29uc3QgZHJhd0NvdW50ID0gb2JqZWN0Ll9tdWx0aURyYXdDb3VudDtcclxuXHRcdFx0XHRjb25zdCBkcmF3SW5zdGFuY2VzID0gb2JqZWN0Ll9tdWx0aURyYXdJbnN0YW5jZXM7XHJcblxyXG5cdFx0XHRcdGlmICggZHJhd0luc3RhbmNlcyAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHQvLyBAZGVwcmVjYXRlZCwgcjE3NFxyXG5cdFx0XHRcdFx0d2Fybk9uY2UoICdUSFJFRS5XZWJHUFVCYWNrZW5kOiByZW5kZXJNdWx0aURyYXdJbnN0YW5jZXMgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHIxODQuIEFwcGVuZCB0byByZW5kZXJNdWx0aURyYXcgYXJndW1lbnRzIGFuZCB1c2UgaW5kaXJlY3Rpb24uJyApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGRyYXdDb3VudDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBjb3VudCA9IGRyYXdJbnN0YW5jZXMgPyBkcmF3SW5zdGFuY2VzWyBpIF0gOiAxO1xyXG5cdFx0XHRcdFx0Y29uc3QgZmlyc3RJbnN0YW5jZSA9IGNvdW50ID4gMSA/IDAgOiBpO1xyXG5cclxuXHRcdFx0XHRcdGlmICggaGFzSW5kZXggPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRwYXNzRW5jb2RlckdQVS5kcmF3SW5kZXhlZCggY291bnRzWyBpIF0sIGNvdW50LCBzdGFydHNbIGkgXSAvIGluZGV4LmFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCAwLCBmaXJzdEluc3RhbmNlICk7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdHBhc3NFbmNvZGVyR1BVLmRyYXcoIGNvdW50c1sgaSBdLCBjb3VudCwgc3RhcnRzWyBpIF0sIGZpcnN0SW5zdGFuY2UgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aW5mby51cGRhdGUoIG9iamVjdCwgY291bnRzWyBpIF0sIGNvdW50ICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGhhc0luZGV4ID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB7IHZlcnRleENvdW50OiBpbmRleENvdW50LCBpbnN0YW5jZUNvdW50LCBmaXJzdFZlcnRleDogZmlyc3RJbmRleCB9ID0gZHJhd1BhcmFtcztcclxuXHJcblx0XHRcdFx0Y29uc3QgaW5kaXJlY3QgPSByZW5kZXJPYmplY3QuZ2V0SW5kaXJlY3QoKTtcclxuXHJcblx0XHRcdFx0aWYgKCBpbmRpcmVjdCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBidWZmZXIgPSB0aGlzLmdldCggaW5kaXJlY3QgKS5idWZmZXI7XHJcblxyXG5cdFx0XHRcdFx0cGFzc0VuY29kZXJHUFUuZHJhd0luZGV4ZWRJbmRpcmVjdCggYnVmZmVyLCAwICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0cGFzc0VuY29kZXJHUFUuZHJhd0luZGV4ZWQoIGluZGV4Q291bnQsIGluc3RhbmNlQ291bnQsIGZpcnN0SW5kZXgsIDAsIDAgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpbmZvLnVwZGF0ZSggb2JqZWN0LCBpbmRleENvdW50LCBpbnN0YW5jZUNvdW50ICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRjb25zdCB7IHZlcnRleENvdW50LCBpbnN0YW5jZUNvdW50LCBmaXJzdFZlcnRleCB9ID0gZHJhd1BhcmFtcztcclxuXHJcblx0XHRcdFx0Y29uc3QgaW5kaXJlY3QgPSByZW5kZXJPYmplY3QuZ2V0SW5kaXJlY3QoKTtcclxuXHJcblx0XHRcdFx0aWYgKCBpbmRpcmVjdCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBidWZmZXIgPSB0aGlzLmdldCggaW5kaXJlY3QgKS5idWZmZXI7XHJcblxyXG5cdFx0XHRcdFx0cGFzc0VuY29kZXJHUFUuZHJhd0luZGlyZWN0KCBidWZmZXIsIDAgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRwYXNzRW5jb2RlckdQVS5kcmF3KCB2ZXJ0ZXhDb3VudCwgaW5zdGFuY2VDb3VudCwgZmlyc3RWZXJ0ZXgsIDAgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpbmZvLnVwZGF0ZSggb2JqZWN0LCB2ZXJ0ZXhDb3VudCwgaW5zdGFuY2VDb3VudCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0aWYgKCByZW5kZXJPYmplY3QuY2FtZXJhLmlzQXJyYXlDYW1lcmEgJiYgcmVuZGVyT2JqZWN0LmNhbWVyYS5jYW1lcmFzLmxlbmd0aCA+IDAgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBjYW1lcmFEYXRhID0gdGhpcy5nZXQoIHJlbmRlck9iamVjdC5jYW1lcmEgKTtcclxuXHRcdFx0Y29uc3QgY2FtZXJhcyA9IHJlbmRlck9iamVjdC5jYW1lcmEuY2FtZXJhcztcclxuXHRcdFx0Y29uc3QgY2FtZXJhSW5kZXggPSByZW5kZXJPYmplY3QuZ2V0QmluZGluZ0dyb3VwKCAnY2FtZXJhSW5kZXgnICk7XHJcblxyXG5cdFx0XHRpZiAoIGNhbWVyYURhdGEuaW5kZXhlc0dQVSA9PT0gdW5kZWZpbmVkIHx8IGNhbWVyYURhdGEuaW5kZXhlc0dQVS5sZW5ndGggIT09IGNhbWVyYXMubGVuZ3RoICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBiaW5kaW5nc0RhdGEgPSB0aGlzLmdldCggY2FtZXJhSW5kZXggKTtcclxuXHRcdFx0XHRjb25zdCBpbmRleGVzR1BVID0gW107XHJcblxyXG5cdFx0XHRcdGNvbnN0IGRhdGEgPSBuZXcgVWludDMyQXJyYXkoIFsgMCwgMCwgMCwgMCBdICk7XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMCwgbGVuID0gY2FtZXJhcy5sZW5ndGg7IGkgPCBsZW47IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0ZGF0YVsgMCBdID0gaTtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBiaW5kR3JvdXBJbmRleCA9IHRoaXMuYmluZGluZ1V0aWxzLmNyZWF0ZUJpbmRHcm91cEluZGV4KCBkYXRhLCBiaW5kaW5nc0RhdGEubGF5b3V0ICk7XHJcblxyXG5cdFx0XHRcdFx0aW5kZXhlc0dQVS5wdXNoKCBiaW5kR3JvdXBJbmRleCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGNhbWVyYURhdGEuaW5kZXhlc0dQVSA9IGluZGV4ZXNHUFU7IC8vIFRPRE86IENyZWF0ZSBhIGdsb2JhbCBsaWJyYXJ5IGZvciB0aGlzXHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBwaXhlbFJhdGlvID0gdGhpcy5yZW5kZXJlci5nZXRQaXhlbFJhdGlvKCk7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGxlbiA9IGNhbWVyYXMubGVuZ3RoOyBpIDwgbGVuOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBzdWJDYW1lcmEgPSBjYW1lcmFzWyBpIF07XHJcblxyXG5cdFx0XHRcdGlmICggb2JqZWN0LmxheWVycy50ZXN0KCBzdWJDYW1lcmEubGF5ZXJzICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgdnAgPSBzdWJDYW1lcmEudmlld3BvcnQ7XHJcblxyXG5cdFx0XHRcdFx0cGFzc0VuY29kZXJHUFUuc2V0Vmlld3BvcnQoXHJcblx0XHRcdFx0XHRcdE1hdGguZmxvb3IoIHZwLnggKiBwaXhlbFJhdGlvICksXHJcblx0XHRcdFx0XHRcdE1hdGguZmxvb3IoIHZwLnkgKiBwaXhlbFJhdGlvICksXHJcblx0XHRcdFx0XHRcdE1hdGguZmxvb3IoIHZwLndpZHRoICogcGl4ZWxSYXRpbyApLFxyXG5cdFx0XHRcdFx0XHRNYXRoLmZsb29yKCB2cC5oZWlnaHQgKiBwaXhlbFJhdGlvICksXHJcblx0XHRcdFx0XHRcdGNvbnRleHQudmlld3BvcnRWYWx1ZS5taW5EZXB0aCxcclxuXHRcdFx0XHRcdFx0Y29udGV4dC52aWV3cG9ydFZhbHVlLm1heERlcHRoXHJcblx0XHRcdFx0XHQpO1xyXG5cclxuXHRcdFx0XHRcdHBhc3NFbmNvZGVyR1BVLnNldEJpbmRHcm91cCggY2FtZXJhSW5kZXguaW5kZXgsIGNhbWVyYURhdGEuaW5kZXhlc0dQVVsgaSBdICk7XHJcblxyXG5cdFx0XHRcdFx0ZHJhdygpO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGRyYXcoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gY2FjaGUga2V5XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSByZW5kZXIgcGlwZWxpbmUgcmVxdWlyZXMgYW4gdXBkYXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSZW5kZXJPYmplY3R9IHJlbmRlck9iamVjdCAtIFRoZSByZW5kZXIgb2JqZWN0LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHJlbmRlciBwaXBlbGluZSByZXF1aXJlcyBhbiB1cGRhdGUgb3Igbm90LlxyXG5cdCAqL1xyXG5cdG5lZWRzUmVuZGVyVXBkYXRlKCByZW5kZXJPYmplY3QgKSB7XHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IHRoaXMuZ2V0KCByZW5kZXJPYmplY3QgKTtcclxuXHJcblx0XHRjb25zdCB7IG9iamVjdCwgbWF0ZXJpYWwgfSA9IHJlbmRlck9iamVjdDtcclxuXHJcblx0XHRjb25zdCB1dGlscyA9IHRoaXMudXRpbHM7XHJcblxyXG5cdFx0Y29uc3Qgc2FtcGxlQ291bnQgPSB1dGlscy5nZXRTYW1wbGVDb3VudFJlbmRlckNvbnRleHQoIHJlbmRlck9iamVjdC5jb250ZXh0ICk7XHJcblx0XHRjb25zdCBjb2xvclNwYWNlID0gdXRpbHMuZ2V0Q3VycmVudENvbG9yU3BhY2UoIHJlbmRlck9iamVjdC5jb250ZXh0ICk7XHJcblx0XHRjb25zdCBjb2xvckZvcm1hdCA9IHV0aWxzLmdldEN1cnJlbnRDb2xvckZvcm1hdCggcmVuZGVyT2JqZWN0LmNvbnRleHQgKTtcclxuXHRcdGNvbnN0IGRlcHRoU3RlbmNpbEZvcm1hdCA9IHV0aWxzLmdldEN1cnJlbnREZXB0aFN0ZW5jaWxGb3JtYXQoIHJlbmRlck9iamVjdC5jb250ZXh0ICk7XHJcblx0XHRjb25zdCBwcmltaXRpdmVUb3BvbG9neSA9IHV0aWxzLmdldFByaW1pdGl2ZVRvcG9sb2d5KCBvYmplY3QsIG1hdGVyaWFsICk7XHJcblxyXG5cdFx0bGV0IG5lZWRzVXBkYXRlID0gZmFsc2U7XHJcblxyXG5cdFx0aWYgKCBkYXRhLm1hdGVyaWFsICE9PSBtYXRlcmlhbCB8fCBkYXRhLm1hdGVyaWFsVmVyc2lvbiAhPT0gbWF0ZXJpYWwudmVyc2lvbiB8fFxyXG5cdFx0XHRkYXRhLnRyYW5zcGFyZW50ICE9PSBtYXRlcmlhbC50cmFuc3BhcmVudCB8fCBkYXRhLmJsZW5kaW5nICE9PSBtYXRlcmlhbC5ibGVuZGluZyB8fCBkYXRhLnByZW11bHRpcGxpZWRBbHBoYSAhPT0gbWF0ZXJpYWwucHJlbXVsdGlwbGllZEFscGhhIHx8XHJcblx0XHRcdGRhdGEuYmxlbmRTcmMgIT09IG1hdGVyaWFsLmJsZW5kU3JjIHx8IGRhdGEuYmxlbmREc3QgIT09IG1hdGVyaWFsLmJsZW5kRHN0IHx8IGRhdGEuYmxlbmRFcXVhdGlvbiAhPT0gbWF0ZXJpYWwuYmxlbmRFcXVhdGlvbiB8fFxyXG5cdFx0XHRkYXRhLmJsZW5kU3JjQWxwaGEgIT09IG1hdGVyaWFsLmJsZW5kU3JjQWxwaGEgfHwgZGF0YS5ibGVuZERzdEFscGhhICE9PSBtYXRlcmlhbC5ibGVuZERzdEFscGhhIHx8IGRhdGEuYmxlbmRFcXVhdGlvbkFscGhhICE9PSBtYXRlcmlhbC5ibGVuZEVxdWF0aW9uQWxwaGEgfHxcclxuXHRcdFx0ZGF0YS5jb2xvcldyaXRlICE9PSBtYXRlcmlhbC5jb2xvcldyaXRlIHx8IGRhdGEuZGVwdGhXcml0ZSAhPT0gbWF0ZXJpYWwuZGVwdGhXcml0ZSB8fCBkYXRhLmRlcHRoVGVzdCAhPT0gbWF0ZXJpYWwuZGVwdGhUZXN0IHx8IGRhdGEuZGVwdGhGdW5jICE9PSBtYXRlcmlhbC5kZXB0aEZ1bmMgfHxcclxuXHRcdFx0ZGF0YS5zdGVuY2lsV3JpdGUgIT09IG1hdGVyaWFsLnN0ZW5jaWxXcml0ZSB8fCBkYXRhLnN0ZW5jaWxGdW5jICE9PSBtYXRlcmlhbC5zdGVuY2lsRnVuYyB8fFxyXG5cdFx0XHRkYXRhLnN0ZW5jaWxGYWlsICE9PSBtYXRlcmlhbC5zdGVuY2lsRmFpbCB8fCBkYXRhLnN0ZW5jaWxaRmFpbCAhPT0gbWF0ZXJpYWwuc3RlbmNpbFpGYWlsIHx8IGRhdGEuc3RlbmNpbFpQYXNzICE9PSBtYXRlcmlhbC5zdGVuY2lsWlBhc3MgfHxcclxuXHRcdFx0ZGF0YS5zdGVuY2lsRnVuY01hc2sgIT09IG1hdGVyaWFsLnN0ZW5jaWxGdW5jTWFzayB8fCBkYXRhLnN0ZW5jaWxXcml0ZU1hc2sgIT09IG1hdGVyaWFsLnN0ZW5jaWxXcml0ZU1hc2sgfHxcclxuXHRcdFx0ZGF0YS5zaWRlICE9PSBtYXRlcmlhbC5zaWRlIHx8IGRhdGEuYWxwaGFUb0NvdmVyYWdlICE9PSBtYXRlcmlhbC5hbHBoYVRvQ292ZXJhZ2UgfHxcclxuXHRcdFx0ZGF0YS5zYW1wbGVDb3VudCAhPT0gc2FtcGxlQ291bnQgfHwgZGF0YS5jb2xvclNwYWNlICE9PSBjb2xvclNwYWNlIHx8XHJcblx0XHRcdGRhdGEuY29sb3JGb3JtYXQgIT09IGNvbG9yRm9ybWF0IHx8IGRhdGEuZGVwdGhTdGVuY2lsRm9ybWF0ICE9PSBkZXB0aFN0ZW5jaWxGb3JtYXQgfHxcclxuXHRcdFx0ZGF0YS5wcmltaXRpdmVUb3BvbG9neSAhPT0gcHJpbWl0aXZlVG9wb2xvZ3kgfHxcclxuXHRcdFx0ZGF0YS5jbGlwcGluZ0NvbnRleHRDYWNoZUtleSAhPT0gcmVuZGVyT2JqZWN0LmNsaXBwaW5nQ29udGV4dENhY2hlS2V5XHJcblx0XHQpIHtcclxuXHJcblx0XHRcdGRhdGEubWF0ZXJpYWwgPSBtYXRlcmlhbDsgZGF0YS5tYXRlcmlhbFZlcnNpb24gPSBtYXRlcmlhbC52ZXJzaW9uO1xyXG5cdFx0XHRkYXRhLnRyYW5zcGFyZW50ID0gbWF0ZXJpYWwudHJhbnNwYXJlbnQ7IGRhdGEuYmxlbmRpbmcgPSBtYXRlcmlhbC5ibGVuZGluZzsgZGF0YS5wcmVtdWx0aXBsaWVkQWxwaGEgPSBtYXRlcmlhbC5wcmVtdWx0aXBsaWVkQWxwaGE7XHJcblx0XHRcdGRhdGEuYmxlbmRTcmMgPSBtYXRlcmlhbC5ibGVuZFNyYzsgZGF0YS5ibGVuZERzdCA9IG1hdGVyaWFsLmJsZW5kRHN0OyBkYXRhLmJsZW5kRXF1YXRpb24gPSBtYXRlcmlhbC5ibGVuZEVxdWF0aW9uO1xyXG5cdFx0XHRkYXRhLmJsZW5kU3JjQWxwaGEgPSBtYXRlcmlhbC5ibGVuZFNyY0FscGhhOyBkYXRhLmJsZW5kRHN0QWxwaGEgPSBtYXRlcmlhbC5ibGVuZERzdEFscGhhOyBkYXRhLmJsZW5kRXF1YXRpb25BbHBoYSA9IG1hdGVyaWFsLmJsZW5kRXF1YXRpb25BbHBoYTtcclxuXHRcdFx0ZGF0YS5jb2xvcldyaXRlID0gbWF0ZXJpYWwuY29sb3JXcml0ZTtcclxuXHRcdFx0ZGF0YS5kZXB0aFdyaXRlID0gbWF0ZXJpYWwuZGVwdGhXcml0ZTsgZGF0YS5kZXB0aFRlc3QgPSBtYXRlcmlhbC5kZXB0aFRlc3Q7IGRhdGEuZGVwdGhGdW5jID0gbWF0ZXJpYWwuZGVwdGhGdW5jO1xyXG5cdFx0XHRkYXRhLnN0ZW5jaWxXcml0ZSA9IG1hdGVyaWFsLnN0ZW5jaWxXcml0ZTsgZGF0YS5zdGVuY2lsRnVuYyA9IG1hdGVyaWFsLnN0ZW5jaWxGdW5jO1xyXG5cdFx0XHRkYXRhLnN0ZW5jaWxGYWlsID0gbWF0ZXJpYWwuc3RlbmNpbEZhaWw7IGRhdGEuc3RlbmNpbFpGYWlsID0gbWF0ZXJpYWwuc3RlbmNpbFpGYWlsOyBkYXRhLnN0ZW5jaWxaUGFzcyA9IG1hdGVyaWFsLnN0ZW5jaWxaUGFzcztcclxuXHRcdFx0ZGF0YS5zdGVuY2lsRnVuY01hc2sgPSBtYXRlcmlhbC5zdGVuY2lsRnVuY01hc2s7IGRhdGEuc3RlbmNpbFdyaXRlTWFzayA9IG1hdGVyaWFsLnN0ZW5jaWxXcml0ZU1hc2s7XHJcblx0XHRcdGRhdGEuc2lkZSA9IG1hdGVyaWFsLnNpZGU7IGRhdGEuYWxwaGFUb0NvdmVyYWdlID0gbWF0ZXJpYWwuYWxwaGFUb0NvdmVyYWdlO1xyXG5cdFx0XHRkYXRhLnNhbXBsZUNvdW50ID0gc2FtcGxlQ291bnQ7XHJcblx0XHRcdGRhdGEuY29sb3JTcGFjZSA9IGNvbG9yU3BhY2U7XHJcblx0XHRcdGRhdGEuY29sb3JGb3JtYXQgPSBjb2xvckZvcm1hdDtcclxuXHRcdFx0ZGF0YS5kZXB0aFN0ZW5jaWxGb3JtYXQgPSBkZXB0aFN0ZW5jaWxGb3JtYXQ7XHJcblx0XHRcdGRhdGEucHJpbWl0aXZlVG9wb2xvZ3kgPSBwcmltaXRpdmVUb3BvbG9neTtcclxuXHRcdFx0ZGF0YS5jbGlwcGluZ0NvbnRleHRDYWNoZUtleSA9IHJlbmRlck9iamVjdC5jbGlwcGluZ0NvbnRleHRDYWNoZUtleTtcclxuXHJcblx0XHRcdG5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG5lZWRzVXBkYXRlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBjYWNoZSBrZXkgdGhhdCBpcyB1c2VkIHRvIGlkZW50aWZ5IHJlbmRlciBwaXBlbGluZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JlbmRlck9iamVjdH0gcmVuZGVyT2JqZWN0IC0gVGhlIHJlbmRlciBvYmplY3QuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgY2FjaGUga2V5LlxyXG5cdCAqL1xyXG5cdGdldFJlbmRlckNhY2hlS2V5KCByZW5kZXJPYmplY3QgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBvYmplY3QsIG1hdGVyaWFsIH0gPSByZW5kZXJPYmplY3Q7XHJcblxyXG5cdFx0Y29uc3QgdXRpbHMgPSB0aGlzLnV0aWxzO1xyXG5cdFx0Y29uc3QgcmVuZGVyQ29udGV4dCA9IHJlbmRlck9iamVjdC5jb250ZXh0O1xyXG5cclxuXHRcdHJldHVybiBbXHJcblx0XHRcdG1hdGVyaWFsLnRyYW5zcGFyZW50LCBtYXRlcmlhbC5ibGVuZGluZywgbWF0ZXJpYWwucHJlbXVsdGlwbGllZEFscGhhLFxyXG5cdFx0XHRtYXRlcmlhbC5ibGVuZFNyYywgbWF0ZXJpYWwuYmxlbmREc3QsIG1hdGVyaWFsLmJsZW5kRXF1YXRpb24sXHJcblx0XHRcdG1hdGVyaWFsLmJsZW5kU3JjQWxwaGEsIG1hdGVyaWFsLmJsZW5kRHN0QWxwaGEsIG1hdGVyaWFsLmJsZW5kRXF1YXRpb25BbHBoYSxcclxuXHRcdFx0bWF0ZXJpYWwuY29sb3JXcml0ZSxcclxuXHRcdFx0bWF0ZXJpYWwuZGVwdGhXcml0ZSwgbWF0ZXJpYWwuZGVwdGhUZXN0LCBtYXRlcmlhbC5kZXB0aEZ1bmMsXHJcblx0XHRcdG1hdGVyaWFsLnN0ZW5jaWxXcml0ZSwgbWF0ZXJpYWwuc3RlbmNpbEZ1bmMsXHJcblx0XHRcdG1hdGVyaWFsLnN0ZW5jaWxGYWlsLCBtYXRlcmlhbC5zdGVuY2lsWkZhaWwsIG1hdGVyaWFsLnN0ZW5jaWxaUGFzcyxcclxuXHRcdFx0bWF0ZXJpYWwuc3RlbmNpbEZ1bmNNYXNrLCBtYXRlcmlhbC5zdGVuY2lsV3JpdGVNYXNrLFxyXG5cdFx0XHRtYXRlcmlhbC5zaWRlLFxyXG5cdFx0XHR1dGlscy5nZXRTYW1wbGVDb3VudFJlbmRlckNvbnRleHQoIHJlbmRlckNvbnRleHQgKSxcclxuXHRcdFx0dXRpbHMuZ2V0Q3VycmVudENvbG9yU3BhY2UoIHJlbmRlckNvbnRleHQgKSwgdXRpbHMuZ2V0Q3VycmVudENvbG9yRm9ybWF0KCByZW5kZXJDb250ZXh0ICksIHV0aWxzLmdldEN1cnJlbnREZXB0aFN0ZW5jaWxGb3JtYXQoIHJlbmRlckNvbnRleHQgKSxcclxuXHRcdFx0dXRpbHMuZ2V0UHJpbWl0aXZlVG9wb2xvZ3koIG9iamVjdCwgbWF0ZXJpYWwgKSxcclxuXHRcdFx0cmVuZGVyT2JqZWN0LmdldEdlb21ldHJ5Q2FjaGVLZXkoKSxcclxuXHRcdFx0cmVuZGVyT2JqZWN0LmNsaXBwaW5nQ29udGV4dENhY2hlS2V5XHJcblx0XHRdLmpvaW4oKTtcclxuXHJcblx0fVxyXG5cclxuXHQvLyB0ZXh0dXJlc1xyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGEgR1BVIHNhbXBsZXIgZm9yIHRoZSBnaXZlbiB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUgdG8gY3JlYXRlIHRoZSBzYW1wbGVyIGZvci5cclxuXHQgKi9cclxuXHRjcmVhdGVTYW1wbGVyKCB0ZXh0dXJlICkge1xyXG5cclxuXHRcdHRoaXMudGV4dHVyZVV0aWxzLmNyZWF0ZVNhbXBsZXIoIHRleHR1cmUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZXN0cm95cyB0aGUgR1BVIHNhbXBsZXIgZm9yIHRoZSBnaXZlbiB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUgdG8gZGVzdHJveSB0aGUgc2FtcGxlciBmb3IuXHJcblx0ICovXHJcblx0ZGVzdHJveVNhbXBsZXIoIHRleHR1cmUgKSB7XHJcblxyXG5cdFx0dGhpcy50ZXh0dXJlVXRpbHMuZGVzdHJveVNhbXBsZXIoIHRleHR1cmUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGEgZGVmYXVsdCB0ZXh0dXJlIGZvciB0aGUgZ2l2ZW4gdGV4dHVyZSB0aGF0IGNhbiBiZSB1c2VkXHJcblx0ICogYXMgYSBwbGFjZWhvbGRlciB1bnRpbCB0aGUgYWN0dWFsIHRleHR1cmUgaXMgcmVhZHkgZm9yIHVzYWdlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUgdG8gY3JlYXRlIGEgZGVmYXVsdCB0ZXh0dXJlIGZvci5cclxuXHQgKi9cclxuXHRjcmVhdGVEZWZhdWx0VGV4dHVyZSggdGV4dHVyZSApIHtcclxuXHJcblx0XHR0aGlzLnRleHR1cmVVdGlscy5jcmVhdGVEZWZhdWx0VGV4dHVyZSggdGV4dHVyZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgYSB0ZXh0dXJlIG9uIHRoZSBHUFUgZm9yIHRoZSBnaXZlbiB0ZXh0dXJlIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlLlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIHBhcmFtZXRlci5cclxuXHQgKi9cclxuXHRjcmVhdGVUZXh0dXJlKCB0ZXh0dXJlLCBvcHRpb25zICkge1xyXG5cclxuXHRcdHRoaXMudGV4dHVyZVV0aWxzLmNyZWF0ZVRleHR1cmUoIHRleHR1cmUsIG9wdGlvbnMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGxvYWRzIHRoZSB1cGRhdGVkIHRleHR1cmUgZGF0YSB0byB0aGUgR1BVLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZVRleHR1cmUoIHRleHR1cmUsIG9wdGlvbnMgKSB7XHJcblxyXG5cdFx0dGhpcy50ZXh0dXJlVXRpbHMudXBkYXRlVGV4dHVyZSggdGV4dHVyZSwgb3B0aW9ucyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyBtaXBtYXBzIGZvciB0aGUgZ2l2ZW4gdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlLlxyXG5cdCAqL1xyXG5cdGdlbmVyYXRlTWlwbWFwcyggdGV4dHVyZSApIHtcclxuXHJcblx0XHR0aGlzLnRleHR1cmVVdGlscy5nZW5lcmF0ZU1pcG1hcHMoIHRleHR1cmUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZXN0cm95cyB0aGUgR1BVIGRhdGEgZm9yIHRoZSBnaXZlbiB0ZXh0dXJlIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlLlxyXG5cdCAqL1xyXG5cdGRlc3Ryb3lUZXh0dXJlKCB0ZXh0dXJlICkge1xyXG5cclxuXHRcdHRoaXMudGV4dHVyZVV0aWxzLmRlc3Ryb3lUZXh0dXJlKCB0ZXh0dXJlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0ZXh0dXJlIGRhdGEgYXMgYSB0eXBlZCBhcnJheS5cclxuXHQgKlxyXG5cdCAqIEBhc3luY1xyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlIHRvIGNvcHkuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBjb3B5IG9yaWdpbi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGNvcHkgb3JpZ2luLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgY29weS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgY29weS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZmFjZUluZGV4IC0gVGhlIGZhY2UgaW5kZXguXHJcblx0ICogQHJldHVybiB7UHJvbWlzZTxUeXBlZEFycmF5Pn0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCBhIHR5cGVkIGFycmF5IHdoZW4gdGhlIGNvcHkgb3BlcmF0aW9uIGhhcyBmaW5pc2hlZC5cclxuXHQgKi9cclxuXHRhc3luYyBjb3B5VGV4dHVyZVRvQnVmZmVyKCB0ZXh0dXJlLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmYWNlSW5kZXggKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMudGV4dHVyZVV0aWxzLmNvcHlUZXh0dXJlVG9CdWZmZXIoIHRleHR1cmUsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGZhY2VJbmRleCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEluaXRzIGEgdGltZSBzdGFtcCBxdWVyeSBmb3IgdGhlIGdpdmVuIHJlbmRlciBjb250ZXh0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSZW5kZXJDb250ZXh0fSByZW5kZXJDb250ZXh0IC0gVGhlIHJlbmRlciBjb250ZXh0LlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBkZXNjcmlwdG9yIC0gVGhlIHF1ZXJ5IGRlc2NyaXB0b3IuXHJcblx0ICovXHJcblx0aW5pdFRpbWVzdGFtcFF1ZXJ5KCByZW5kZXJDb250ZXh0LCBkZXNjcmlwdG9yICkge1xyXG5cclxuXHRcdGlmICggISB0aGlzLnRyYWNrVGltZXN0YW1wICkgcmV0dXJuO1xyXG5cclxuXHRcdGNvbnN0IHR5cGUgPSByZW5kZXJDb250ZXh0LmlzQ29tcHV0ZU5vZGUgPyAnY29tcHV0ZScgOiAncmVuZGVyJztcclxuXHJcblx0XHRpZiAoICEgdGhpcy50aW1lc3RhbXBRdWVyeVBvb2xbIHR5cGUgXSApIHtcclxuXHJcblx0XHRcdC8vIFRPRE86IFZhcmlhYmxlIG1heFF1ZXJpZXM/XHJcblx0XHRcdHRoaXMudGltZXN0YW1wUXVlcnlQb29sWyB0eXBlIF0gPSBuZXcgV2ViR1BVVGltZXN0YW1wUXVlcnlQb29sKCB0aGlzLmRldmljZSwgdHlwZSwgMjA0OCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCB0aW1lc3RhbXBRdWVyeVBvb2wgPSB0aGlzLnRpbWVzdGFtcFF1ZXJ5UG9vbFsgdHlwZSBdO1xyXG5cclxuXHRcdGNvbnN0IGJhc2VPZmZzZXQgPSB0aW1lc3RhbXBRdWVyeVBvb2wuYWxsb2NhdGVRdWVyaWVzRm9yQ29udGV4dCggcmVuZGVyQ29udGV4dCApO1xyXG5cclxuXHRcdGRlc2NyaXB0b3IudGltZXN0YW1wV3JpdGVzID0ge1xyXG5cdFx0XHRxdWVyeVNldDogdGltZXN0YW1wUXVlcnlQb29sLnF1ZXJ5U2V0LFxyXG5cdFx0XHRiZWdpbm5pbmdPZlBhc3NXcml0ZUluZGV4OiBiYXNlT2Zmc2V0LFxyXG5cdFx0XHRlbmRPZlBhc3NXcml0ZUluZGV4OiBiYXNlT2Zmc2V0ICsgMSxcclxuXHRcdCAgfTtcclxuXHJcblx0fVxyXG5cclxuXHJcblx0Ly8gbm9kZSBidWlsZGVyXHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBub2RlIGJ1aWxkZXIgZm9yIHRoZSBnaXZlbiByZW5kZXIgb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSZW5kZXJPYmplY3R9IG9iamVjdCAtIFRoZSByZW5kZXIgb2JqZWN0LlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEByZXR1cm4ge1dHU0xOb2RlQnVpbGRlcn0gVGhlIG5vZGUgYnVpbGRlci5cclxuXHQgKi9cclxuXHRjcmVhdGVOb2RlQnVpbGRlciggb2JqZWN0LCByZW5kZXJlciApIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IFdHU0xOb2RlQnVpbGRlciggb2JqZWN0LCByZW5kZXJlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vIHByb2dyYW1cclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyBhIHNoYWRlciBwcm9ncmFtIGZyb20gdGhlIGdpdmVuIHByb2dyYW1tYWJsZSBzdGFnZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UHJvZ3JhbW1hYmxlU3RhZ2V9IHByb2dyYW0gLSBUaGUgcHJvZ3JhbW1hYmxlIHN0YWdlLlxyXG5cdCAqL1xyXG5cdGNyZWF0ZVByb2dyYW0oIHByb2dyYW0gKSB7XHJcblxyXG5cdFx0Y29uc3QgcHJvZ3JhbUdQVSA9IHRoaXMuZ2V0KCBwcm9ncmFtICk7XHJcblxyXG5cdFx0cHJvZ3JhbUdQVS5tb2R1bGUgPSB7XHJcblx0XHRcdG1vZHVsZTogdGhpcy5kZXZpY2UuY3JlYXRlU2hhZGVyTW9kdWxlKCB7IGNvZGU6IHByb2dyYW0uY29kZSwgbGFiZWw6IHByb2dyYW0uc3RhZ2UgKyAoIHByb2dyYW0ubmFtZSAhPT0gJycgPyBgXyR7IHByb2dyYW0ubmFtZSB9YCA6ICcnICkgfSApLFxyXG5cdFx0XHRlbnRyeVBvaW50OiAnbWFpbidcclxuXHRcdH07XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVzdHJveXMgdGhlIHNoYWRlciBwcm9ncmFtIG9mIHRoZSBnaXZlbiBwcm9ncmFtbWFibGUgc3RhZ2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1Byb2dyYW1tYWJsZVN0YWdlfSBwcm9ncmFtIC0gVGhlIHByb2dyYW1tYWJsZSBzdGFnZS5cclxuXHQgKi9cclxuXHRkZXN0cm95UHJvZ3JhbSggcHJvZ3JhbSApIHtcclxuXHJcblx0XHR0aGlzLmRlbGV0ZSggcHJvZ3JhbSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vIHBpcGVsaW5lc1xyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGEgcmVuZGVyIHBpcGVsaW5lIGZvciB0aGUgZ2l2ZW4gcmVuZGVyIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyT2JqZWN0fSByZW5kZXJPYmplY3QgLSBUaGUgcmVuZGVyIG9iamVjdC5cclxuXHQgKiBAcGFyYW0ge0FycmF5PFByb21pc2U+fSBwcm9taXNlcyAtIEFuIGFycmF5IG9mIGNvbXBpbGF0aW9uIHByb21pc2VzIHdoaWNoIGFyZSB1c2VkIGluIGBjb21waWxlQXN5bmMoKWAuXHJcblx0ICovXHJcblx0Y3JlYXRlUmVuZGVyUGlwZWxpbmUoIHJlbmRlck9iamVjdCwgcHJvbWlzZXMgKSB7XHJcblxyXG5cdFx0dGhpcy5waXBlbGluZVV0aWxzLmNyZWF0ZVJlbmRlclBpcGVsaW5lKCByZW5kZXJPYmplY3QsIHByb21pc2VzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyBhIGNvbXB1dGUgcGlwZWxpbmUgZm9yIHRoZSBnaXZlbiBjb21wdXRlIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0NvbXB1dGVQaXBlbGluZX0gY29tcHV0ZVBpcGVsaW5lIC0gVGhlIGNvbXB1dGUgcGlwZWxpbmUuXHJcblx0ICogQHBhcmFtIHtBcnJheTxCaW5kR3JvdXA+fSBiaW5kaW5ncyAtIFRoZSBiaW5kaW5ncy5cclxuXHQgKi9cclxuXHRjcmVhdGVDb21wdXRlUGlwZWxpbmUoIGNvbXB1dGVQaXBlbGluZSwgYmluZGluZ3MgKSB7XHJcblxyXG5cdFx0dGhpcy5waXBlbGluZVV0aWxzLmNyZWF0ZUNvbXB1dGVQaXBlbGluZSggY29tcHV0ZVBpcGVsaW5lLCBiaW5kaW5ncyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFByZXBhcmVzIHRoZSBzdGF0ZSBmb3IgZW5jb2RpbmcgcmVuZGVyIGJ1bmRsZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JlbmRlckNvbnRleHR9IHJlbmRlckNvbnRleHQgLSBUaGUgcmVuZGVyIGNvbnRleHQuXHJcblx0ICovXHJcblx0YmVnaW5CdW5kbGUoIHJlbmRlckNvbnRleHQgKSB7XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyQ29udGV4dERhdGEgPSB0aGlzLmdldCggcmVuZGVyQ29udGV4dCApO1xyXG5cclxuXHRcdHJlbmRlckNvbnRleHREYXRhLl9jdXJyZW50UGFzcyA9IHJlbmRlckNvbnRleHREYXRhLmN1cnJlbnRQYXNzO1xyXG5cdFx0cmVuZGVyQ29udGV4dERhdGEuX2N1cnJlbnRTZXRzID0gcmVuZGVyQ29udGV4dERhdGEuY3VycmVudFNldHM7XHJcblxyXG5cdFx0cmVuZGVyQ29udGV4dERhdGEuY3VycmVudFNldHMgPSB7IGF0dHJpYnV0ZXM6IHt9LCBiaW5kaW5nR3JvdXBzOiBbXSwgcGlwZWxpbmU6IG51bGwsIGluZGV4OiBudWxsIH07XHJcblx0XHRyZW5kZXJDb250ZXh0RGF0YS5jdXJyZW50UGFzcyA9IHRoaXMucGlwZWxpbmVVdGlscy5jcmVhdGVCdW5kbGVFbmNvZGVyKCByZW5kZXJDb250ZXh0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWZ0ZXIgcHJvY2Vzc2luZyByZW5kZXIgYnVuZGxlcyB0aGlzIG1ldGhvZCBmaW5hbGl6ZXMgcmVsYXRlZCB3b3JrLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSZW5kZXJDb250ZXh0fSByZW5kZXJDb250ZXh0IC0gVGhlIHJlbmRlciBjb250ZXh0LlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyQnVuZGxlfSBidW5kbGUgLSBUaGUgcmVuZGVyIGJ1bmRsZS5cclxuXHQgKi9cclxuXHRmaW5pc2hCdW5kbGUoIHJlbmRlckNvbnRleHQsIGJ1bmRsZSApIHtcclxuXHJcblx0XHRjb25zdCByZW5kZXJDb250ZXh0RGF0YSA9IHRoaXMuZ2V0KCByZW5kZXJDb250ZXh0ICk7XHJcblxyXG5cdFx0Y29uc3QgYnVuZGxlRW5jb2RlciA9IHJlbmRlckNvbnRleHREYXRhLmN1cnJlbnRQYXNzO1xyXG5cdFx0Y29uc3QgYnVuZGxlR1BVID0gYnVuZGxlRW5jb2Rlci5maW5pc2goKTtcclxuXHJcblx0XHR0aGlzLmdldCggYnVuZGxlICkuYnVuZGxlR1BVID0gYnVuZGxlR1BVO1xyXG5cclxuXHRcdC8vIHJlc3RvcmUgcmVuZGVyIHBhc3Mgc3RhdGVcclxuXHJcblx0XHRyZW5kZXJDb250ZXh0RGF0YS5jdXJyZW50U2V0cyA9IHJlbmRlckNvbnRleHREYXRhLl9jdXJyZW50U2V0cztcclxuXHRcdHJlbmRlckNvbnRleHREYXRhLmN1cnJlbnRQYXNzID0gcmVuZGVyQ29udGV4dERhdGEuX2N1cnJlbnRQYXNzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgYSByZW5kZXIgYnVuZGxlIHRvIHRoZSByZW5kZXIgY29udGV4dCBkYXRhLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSZW5kZXJDb250ZXh0fSByZW5kZXJDb250ZXh0IC0gVGhlIHJlbmRlciBjb250ZXh0LlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyQnVuZGxlfSBidW5kbGUgLSBUaGUgcmVuZGVyIGJ1bmRsZSB0byBhZGQuXHJcblx0ICovXHJcblx0YWRkQnVuZGxlKCByZW5kZXJDb250ZXh0LCBidW5kbGUgKSB7XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyQ29udGV4dERhdGEgPSB0aGlzLmdldCggcmVuZGVyQ29udGV4dCApO1xyXG5cclxuXHRcdHJlbmRlckNvbnRleHREYXRhLnJlbmRlckJ1bmRsZXMucHVzaCggdGhpcy5nZXQoIGJ1bmRsZSApLmJ1bmRsZUdQVSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vIGJpbmRpbmdzXHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgYmluZGluZ3MgZnJvbSB0aGUgZ2l2ZW4gYmluZCBncm91cCBkZWZpbml0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCaW5kR3JvdXB9IGJpbmRHcm91cCAtIFRoZSBiaW5kIGdyb3VwLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8QmluZEdyb3VwPn0gYmluZGluZ3MgLSBBcnJheSBvZiBiaW5kIGdyb3Vwcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gY2FjaGVJbmRleCAtIFRoZSBjYWNoZSBpbmRleC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdmVyc2lvbiAtIFRoZSB2ZXJzaW9uLlxyXG5cdCAqL1xyXG5cdGNyZWF0ZUJpbmRpbmdzKCBiaW5kR3JvdXAsIGJpbmRpbmdzLCBjYWNoZUluZGV4LCB2ZXJzaW9uICkge1xyXG5cclxuXHRcdHRoaXMuYmluZGluZ1V0aWxzLmNyZWF0ZUJpbmRpbmdzKCBiaW5kR3JvdXAsIGJpbmRpbmdzLCBjYWNoZUluZGV4LCB2ZXJzaW9uICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgZ2l2ZW4gYmluZCBncm91cCBkZWZpbml0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCaW5kR3JvdXB9IGJpbmRHcm91cCAtIFRoZSBiaW5kIGdyb3VwLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8QmluZEdyb3VwPn0gYmluZGluZ3MgLSBBcnJheSBvZiBiaW5kIGdyb3Vwcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gY2FjaGVJbmRleCAtIFRoZSBjYWNoZSBpbmRleC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdmVyc2lvbiAtIFRoZSB2ZXJzaW9uLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZUJpbmRpbmdzKCBiaW5kR3JvdXAsIGJpbmRpbmdzLCBjYWNoZUluZGV4LCB2ZXJzaW9uICkge1xyXG5cclxuXHRcdHRoaXMuYmluZGluZ1V0aWxzLmNyZWF0ZUJpbmRpbmdzKCBiaW5kR3JvdXAsIGJpbmRpbmdzLCBjYWNoZUluZGV4LCB2ZXJzaW9uICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyBhIGJ1ZmZlciBiaW5kaW5nLlxyXG5cdCAqXHJcblx0ICogIEBwYXJhbSB7QnVmZmVyfSBiaW5kaW5nIC0gVGhlIGJ1ZmZlciBiaW5kaW5nIHRvIHVwZGF0ZS5cclxuXHQgKi9cclxuXHR1cGRhdGVCaW5kaW5nKCBiaW5kaW5nICkge1xyXG5cclxuXHRcdHRoaXMuYmluZGluZ1V0aWxzLnVwZGF0ZUJpbmRpbmcoIGJpbmRpbmcgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvLyBhdHRyaWJ1dGVzXHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgdGhlIGJ1ZmZlciBvZiBhbiBpbmRleGVkIHNoYWRlciBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0J1ZmZlckF0dHJpYnV0ZX0gYXR0cmlidXRlIC0gVGhlIGluZGV4ZWQgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKi9cclxuXHRjcmVhdGVJbmRleEF0dHJpYnV0ZSggYXR0cmlidXRlICkge1xyXG5cclxuXHRcdHRoaXMuYXR0cmlidXRlVXRpbHMuY3JlYXRlQXR0cmlidXRlKCBhdHRyaWJ1dGUsIEdQVUJ1ZmZlclVzYWdlLklOREVYIHwgR1BVQnVmZmVyVXNhZ2UuQ09QWV9TUkMgfCBHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgdGhlIEdQVSBidWZmZXIgb2YgYSBzaGFkZXIgYXR0cmlidXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCdWZmZXJBdHRyaWJ1dGV9IGF0dHJpYnV0ZSAtIFRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqL1xyXG5cdGNyZWF0ZUF0dHJpYnV0ZSggYXR0cmlidXRlICkge1xyXG5cclxuXHRcdHRoaXMuYXR0cmlidXRlVXRpbHMuY3JlYXRlQXR0cmlidXRlKCBhdHRyaWJ1dGUsIEdQVUJ1ZmZlclVzYWdlLlZFUlRFWCB8IEdQVUJ1ZmZlclVzYWdlLkNPUFlfU1JDIHwgR1BVQnVmZmVyVXNhZ2UuQ09QWV9EU1QgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIHRoZSBHUFUgYnVmZmVyIG9mIGEgc3RvcmFnZSBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0J1ZmZlckF0dHJpYnV0ZX0gYXR0cmlidXRlIC0gVGhlIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICovXHJcblx0Y3JlYXRlU3RvcmFnZUF0dHJpYnV0ZSggYXR0cmlidXRlICkge1xyXG5cclxuXHRcdHRoaXMuYXR0cmlidXRlVXRpbHMuY3JlYXRlQXR0cmlidXRlKCBhdHRyaWJ1dGUsIEdQVUJ1ZmZlclVzYWdlLlNUT1JBR0UgfCBHUFVCdWZmZXJVc2FnZS5WRVJURVggfCBHUFVCdWZmZXJVc2FnZS5DT1BZX1NSQyB8IEdQVUJ1ZmZlclVzYWdlLkNPUFlfRFNUICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyB0aGUgR1BVIGJ1ZmZlciBvZiBhbiBpbmRpcmVjdCBzdG9yYWdlIGF0dHJpYnV0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyQXR0cmlidXRlfSBhdHRyaWJ1dGUgLSBUaGUgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKi9cclxuXHRjcmVhdGVJbmRpcmVjdFN0b3JhZ2VBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApIHtcclxuXHJcblx0XHR0aGlzLmF0dHJpYnV0ZVV0aWxzLmNyZWF0ZUF0dHJpYnV0ZSggYXR0cmlidXRlLCBHUFVCdWZmZXJVc2FnZS5TVE9SQUdFIHwgR1BVQnVmZmVyVXNhZ2UuSU5ESVJFQ1QgfCBHUFVCdWZmZXJVc2FnZS5DT1BZX1NSQyB8IEdQVUJ1ZmZlclVzYWdlLkNPUFlfRFNUICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgR1BVIGJ1ZmZlciBvZiBhIHNoYWRlciBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0J1ZmZlckF0dHJpYnV0ZX0gYXR0cmlidXRlIC0gVGhlIGJ1ZmZlciBhdHRyaWJ1dGUgdG8gdXBkYXRlLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZUF0dHJpYnV0ZSggYXR0cmlidXRlICkge1xyXG5cclxuXHRcdHRoaXMuYXR0cmlidXRlVXRpbHMudXBkYXRlQXR0cmlidXRlKCBhdHRyaWJ1dGUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZXN0cm95cyB0aGUgR1BVIGJ1ZmZlciBvZiBhIHNoYWRlciBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0J1ZmZlckF0dHJpYnV0ZX0gYXR0cmlidXRlIC0gVGhlIGJ1ZmZlciBhdHRyaWJ1dGUgdG8gZGVzdHJveS5cclxuXHQgKi9cclxuXHRkZXN0cm95QXR0cmlidXRlKCBhdHRyaWJ1dGUgKSB7XHJcblxyXG5cdFx0dGhpcy5hdHRyaWJ1dGVVdGlscy5kZXN0cm95QXR0cmlidXRlKCBhdHRyaWJ1dGUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvLyBjYW52YXNcclxuXHJcblx0LyoqXHJcblx0ICogVHJpZ2dlcnMgYW4gdXBkYXRlIG9mIHRoZSBkZWZhdWx0IHJlbmRlciBwYXNzIGRlc2NyaXB0b3IuXHJcblx0ICovXHJcblx0dXBkYXRlU2l6ZSgpIHtcclxuXHJcblx0XHR0aGlzLmNvbG9yQnVmZmVyID0gdGhpcy50ZXh0dXJlVXRpbHMuZ2V0Q29sb3JCdWZmZXIoKTtcclxuXHRcdHRoaXMuZGVmYXVsdFJlbmRlclBhc3NkZXNjcmlwdG9yID0gbnVsbDtcclxuXHJcblx0fVxyXG5cclxuXHQvLyB1dGlscyBwdWJsaWNcclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgbWF4aW11bSBhbmlzb3Ryb3B5IHRleHR1cmUgZmlsdGVyaW5nIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgbWF4aW11bSBhbmlzb3Ryb3B5IHRleHR1cmUgZmlsdGVyaW5nIHZhbHVlLlxyXG5cdCAqL1xyXG5cdGdldE1heEFuaXNvdHJvcHkoKSB7XHJcblxyXG5cdFx0cmV0dXJuIDE2O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgIGJ5IHRoZSBiYWNrZW5kLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgZmVhdHVyZSdzIG5hbWUuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGhhc0ZlYXR1cmUoIG5hbWUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZGV2aWNlLmZlYXR1cmVzLmhhcyggbmFtZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvcGllcyBkYXRhIG9mIHRoZSBnaXZlbiBzb3VyY2UgdGV4dHVyZSB0byB0aGUgZ2l2ZW4gZGVzdGluYXRpb24gdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gc3JjVGV4dHVyZSAtIFRoZSBzb3VyY2UgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IGRzdFRleHR1cmUgLSBUaGUgZGVzdGluYXRpb24gdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0gez8oQm94M3xCb3gyKX0gW3NyY1JlZ2lvbj1udWxsXSAtIFRoZSByZWdpb24gb2YgdGhlIHNvdXJjZSB0ZXh0dXJlIHRvIGNvcHkuXHJcblx0ICogQHBhcmFtIHs/KFZlY3RvcjJ8VmVjdG9yMyl9IFtkc3RQb3NpdGlvbj1udWxsXSAtIFRoZSBkZXN0aW5hdGlvbiBwb3NpdGlvbiBvZiB0aGUgY29weS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3NyY0xldmVsPTBdIC0gVGhlIG1pcG1hcCBsZXZlbCB0byBjb3B5LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZHN0TGV2ZWw9MF0gLSBUaGUgZGVzdGluYXRpb24gbWlwIGxldmVsIHRvIGNvcHkgdG8uXHJcblx0ICovXHJcblx0Y29weVRleHR1cmVUb1RleHR1cmUoIHNyY1RleHR1cmUsIGRzdFRleHR1cmUsIHNyY1JlZ2lvbiA9IG51bGwsIGRzdFBvc2l0aW9uID0gbnVsbCwgc3JjTGV2ZWwgPSAwLCBkc3RMZXZlbCA9IDAgKSB7XHJcblxyXG5cdFx0bGV0IGRzdFggPSAwO1xyXG5cdFx0bGV0IGRzdFkgPSAwO1xyXG5cdFx0bGV0IGRzdFogPSAwO1xyXG5cclxuXHRcdGxldCBzcmNYID0gMDtcclxuXHRcdGxldCBzcmNZID0gMDtcclxuXHRcdGxldCBzcmNaID0gMDtcclxuXHJcblx0XHRsZXQgc3JjV2lkdGggPSBzcmNUZXh0dXJlLmltYWdlLndpZHRoO1xyXG5cdFx0bGV0IHNyY0hlaWdodCA9IHNyY1RleHR1cmUuaW1hZ2UuaGVpZ2h0O1xyXG5cdFx0bGV0IHNyY0RlcHRoID0gMTtcclxuXHJcblxyXG5cdFx0aWYgKCBzcmNSZWdpb24gIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHNyY1JlZ2lvbi5pc0JveDMgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdHNyY1ggPSBzcmNSZWdpb24ubWluLng7XHJcblx0XHRcdFx0c3JjWSA9IHNyY1JlZ2lvbi5taW4ueTtcclxuXHRcdFx0XHRzcmNaID0gc3JjUmVnaW9uLm1pbi56O1xyXG5cdFx0XHRcdHNyY1dpZHRoID0gc3JjUmVnaW9uLm1heC54IC0gc3JjUmVnaW9uLm1pbi54O1xyXG5cdFx0XHRcdHNyY0hlaWdodCA9IHNyY1JlZ2lvbi5tYXgueSAtIHNyY1JlZ2lvbi5taW4ueTtcclxuXHRcdFx0XHRzcmNEZXB0aCA9IHNyY1JlZ2lvbi5tYXgueiAtIHNyY1JlZ2lvbi5taW4uejtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdC8vIEFzc3VtZSBpdCdzIGEgQm94MlxyXG5cdFx0XHRcdHNyY1ggPSBzcmNSZWdpb24ubWluLng7XHJcblx0XHRcdFx0c3JjWSA9IHNyY1JlZ2lvbi5taW4ueTtcclxuXHRcdFx0XHRzcmNXaWR0aCA9IHNyY1JlZ2lvbi5tYXgueCAtIHNyY1JlZ2lvbi5taW4ueDtcclxuXHRcdFx0XHRzcmNIZWlnaHQgPSBzcmNSZWdpb24ubWF4LnkgLSBzcmNSZWdpb24ubWluLnk7XHJcblx0XHRcdFx0c3JjRGVwdGggPSAxO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblxyXG5cdFx0aWYgKCBkc3RQb3NpdGlvbiAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGRzdFggPSBkc3RQb3NpdGlvbi54O1xyXG5cdFx0XHRkc3RZID0gZHN0UG9zaXRpb24ueTtcclxuXHRcdFx0ZHN0WiA9IGRzdFBvc2l0aW9uLnogfHwgMDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgZW5jb2RlciA9IHRoaXMuZGV2aWNlLmNyZWF0ZUNvbW1hbmRFbmNvZGVyKCB7IGxhYmVsOiAnY29weVRleHR1cmVUb1RleHR1cmVfJyArIHNyY1RleHR1cmUuaWQgKyAnXycgKyBkc3RUZXh0dXJlLmlkIH0gKTtcclxuXHJcblx0XHRjb25zdCBzb3VyY2VHUFUgPSB0aGlzLmdldCggc3JjVGV4dHVyZSApLnRleHR1cmU7XHJcblx0XHRjb25zdCBkZXN0aW5hdGlvbkdQVSA9IHRoaXMuZ2V0KCBkc3RUZXh0dXJlICkudGV4dHVyZTtcclxuXHJcblx0XHRlbmNvZGVyLmNvcHlUZXh0dXJlVG9UZXh0dXJlKFxyXG5cdFx0XHR7XHJcblx0XHRcdFx0dGV4dHVyZTogc291cmNlR1BVLFxyXG5cdFx0XHRcdG1pcExldmVsOiBzcmNMZXZlbCxcclxuXHRcdFx0XHRvcmlnaW46IHsgeDogc3JjWCwgeTogc3JjWSwgejogc3JjWiB9XHJcblx0XHRcdH0sXHJcblx0XHRcdHtcclxuXHRcdFx0XHR0ZXh0dXJlOiBkZXN0aW5hdGlvbkdQVSxcclxuXHRcdFx0XHRtaXBMZXZlbDogZHN0TGV2ZWwsXHJcblx0XHRcdFx0b3JpZ2luOiB7IHg6IGRzdFgsIHk6IGRzdFksIHo6IGRzdFogfVxyXG5cdFx0XHR9LFxyXG5cdFx0XHRbXHJcblx0XHRcdFx0c3JjV2lkdGgsXHJcblx0XHRcdFx0c3JjSGVpZ2h0LFxyXG5cdFx0XHRcdHNyY0RlcHRoXHJcblx0XHRcdF1cclxuXHRcdCk7XHJcblxyXG5cdFx0dGhpcy5kZXZpY2UucXVldWUuc3VibWl0KCBbIGVuY29kZXIuZmluaXNoKCkgXSApO1xyXG5cclxuXHRcdGlmICggZHN0TGV2ZWwgPT09IDAgJiYgZHN0VGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnRleHR1cmVVdGlscy5nZW5lcmF0ZU1pcG1hcHMoIGRzdFRleHR1cmUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29waWVzIHRoZSBjdXJyZW50IGJvdW5kIGZyYW1lYnVmZmVyIHRvIHRoZSBnaXZlbiB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIGRlc3RpbmF0aW9uIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtSZW5kZXJDb250ZXh0fSByZW5kZXJDb250ZXh0IC0gVGhlIHJlbmRlciBjb250ZXh0LlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yNH0gcmVjdGFuZ2xlIC0gQSBmb3VyIGRpbWVuc2lvbmFsIHZlY3RvciBkZWZpbmluZyB0aGUgb3JpZ2luIGFuZCBkaW1lbnNpb24gb2YgdGhlIGNvcHkuXHJcblx0ICovXHJcblx0Y29weUZyYW1lYnVmZmVyVG9UZXh0dXJlKCB0ZXh0dXJlLCByZW5kZXJDb250ZXh0LCByZWN0YW5nbGUgKSB7XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyQ29udGV4dERhdGEgPSB0aGlzLmdldCggcmVuZGVyQ29udGV4dCApO1xyXG5cclxuXHRcdGxldCBzb3VyY2VHUFUgPSBudWxsO1xyXG5cclxuXHRcdGlmICggcmVuZGVyQ29udGV4dC5yZW5kZXJUYXJnZXQgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHRleHR1cmUuaXNEZXB0aFRleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRcdHNvdXJjZUdQVSA9IHRoaXMuZ2V0KCByZW5kZXJDb250ZXh0LmRlcHRoVGV4dHVyZSApLnRleHR1cmU7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRzb3VyY2VHUFUgPSB0aGlzLmdldCggcmVuZGVyQ29udGV4dC50ZXh0dXJlc1sgMCBdICkudGV4dHVyZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0aWYgKCB0ZXh0dXJlLmlzRGVwdGhUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0XHRzb3VyY2VHUFUgPSB0aGlzLnRleHR1cmVVdGlscy5nZXREZXB0aEJ1ZmZlciggcmVuZGVyQ29udGV4dC5kZXB0aCwgcmVuZGVyQ29udGV4dC5zdGVuY2lsICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRzb3VyY2VHUFUgPSB0aGlzLmNvbnRleHQuZ2V0Q3VycmVudFRleHR1cmUoKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgZGVzdGluYXRpb25HUFUgPSB0aGlzLmdldCggdGV4dHVyZSApLnRleHR1cmU7XHJcblxyXG5cdFx0aWYgKCBzb3VyY2VHUFUuZm9ybWF0ICE9PSBkZXN0aW5hdGlvbkdQVS5mb3JtYXQgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnV2ViR1BVQmFja2VuZDogY29weUZyYW1lYnVmZmVyVG9UZXh0dXJlOiBTb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGZvcm1hdHMgZG8gbm90IG1hdGNoLicsIHNvdXJjZUdQVS5mb3JtYXQsIGRlc3RpbmF0aW9uR1BVLmZvcm1hdCApO1xyXG5cclxuXHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRsZXQgZW5jb2RlcjtcclxuXHJcblx0XHRpZiAoIHJlbmRlckNvbnRleHREYXRhLmN1cnJlbnRQYXNzICkge1xyXG5cclxuXHRcdFx0cmVuZGVyQ29udGV4dERhdGEuY3VycmVudFBhc3MuZW5kKCk7XHJcblxyXG5cdFx0XHRlbmNvZGVyID0gcmVuZGVyQ29udGV4dERhdGEuZW5jb2RlcjtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0ZW5jb2RlciA9IHRoaXMuZGV2aWNlLmNyZWF0ZUNvbW1hbmRFbmNvZGVyKCB7IGxhYmVsOiAnY29weUZyYW1lYnVmZmVyVG9UZXh0dXJlXycgKyB0ZXh0dXJlLmlkIH0gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0ZW5jb2Rlci5jb3B5VGV4dHVyZVRvVGV4dHVyZShcclxuXHRcdFx0e1xyXG5cdFx0XHRcdHRleHR1cmU6IHNvdXJjZUdQVSxcclxuXHRcdFx0XHRvcmlnaW46IFsgcmVjdGFuZ2xlLngsIHJlY3RhbmdsZS55LCAwIF0sXHJcblx0XHRcdH0sXHJcblx0XHRcdHtcclxuXHRcdFx0XHR0ZXh0dXJlOiBkZXN0aW5hdGlvbkdQVVxyXG5cdFx0XHR9LFxyXG5cdFx0XHRbXHJcblx0XHRcdFx0cmVjdGFuZ2xlLnosXHJcblx0XHRcdFx0cmVjdGFuZ2xlLndcclxuXHRcdFx0XVxyXG5cdFx0KTtcclxuXHJcblx0XHRpZiAoIHRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzICkgdGhpcy50ZXh0dXJlVXRpbHMuZ2VuZXJhdGVNaXBtYXBzKCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0aWYgKCByZW5kZXJDb250ZXh0RGF0YS5jdXJyZW50UGFzcyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHsgZGVzY3JpcHRvciB9ID0gcmVuZGVyQ29udGV4dERhdGE7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLmNvbG9yQXR0YWNobWVudHMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRkZXNjcmlwdG9yLmNvbG9yQXR0YWNobWVudHNbIGkgXS5sb2FkT3AgPSBHUFVMb2FkT3AuTG9hZDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggcmVuZGVyQ29udGV4dC5kZXB0aCApIGRlc2NyaXB0b3IuZGVwdGhTdGVuY2lsQXR0YWNobWVudC5kZXB0aExvYWRPcCA9IEdQVUxvYWRPcC5Mb2FkO1xyXG5cdFx0XHRpZiAoIHJlbmRlckNvbnRleHQuc3RlbmNpbCApIGRlc2NyaXB0b3IuZGVwdGhTdGVuY2lsQXR0YWNobWVudC5zdGVuY2lsTG9hZE9wID0gR1BVTG9hZE9wLkxvYWQ7XHJcblxyXG5cdFx0XHRyZW5kZXJDb250ZXh0RGF0YS5jdXJyZW50UGFzcyA9IGVuY29kZXIuYmVnaW5SZW5kZXJQYXNzKCBkZXNjcmlwdG9yICk7XHJcblx0XHRcdHJlbmRlckNvbnRleHREYXRhLmN1cnJlbnRTZXRzID0geyBhdHRyaWJ1dGVzOiB7fSwgYmluZGluZ0dyb3VwczogW10sIHBpcGVsaW5lOiBudWxsLCBpbmRleDogbnVsbCB9O1xyXG5cclxuXHRcdFx0aWYgKCByZW5kZXJDb250ZXh0LnZpZXdwb3J0ICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLnVwZGF0ZVZpZXdwb3J0KCByZW5kZXJDb250ZXh0ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHJlbmRlckNvbnRleHQuc2Npc3NvciApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgeyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH0gPSByZW5kZXJDb250ZXh0LnNjaXNzb3JWYWx1ZTtcclxuXHJcblx0XHRcdFx0cmVuZGVyQ29udGV4dERhdGEuY3VycmVudFBhc3Muc2V0U2Npc3NvclJlY3QoIHgsIHksIHdpZHRoLCBoZWlnaHQgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGhpcy5kZXZpY2UucXVldWUuc3VibWl0KCBbIGVuY29kZXIuZmluaXNoKCkgXSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFdlYkdQVUJhY2tlbmQ7XHJcbiIsImltcG9ydCB7IFNwb3RMaWdodCB9IGZyb20gJy4uL1Nwb3RMaWdodC5qcyc7XHJcblxyXG4vKipcclxuICogQSBJRVMgdmVyc2lvbiBvZiB7QGxpbmsgU3BvdExpZ2h0fS4gQ2FuIG9ubHkgYmUgdXNlZCB3aXRoIHtAbGluayBXZWJHUFVSZW5kZXJlcn0uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBTcG90TGlnaHRcclxuICovXHJcbmNsYXNzIElFU1Nwb3RMaWdodCBleHRlbmRzIFNwb3RMaWdodCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgSUVTIHNwb3QgbGlnaHQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geyhudW1iZXJ8Q29sb3J8c3RyaW5nKX0gW2NvbG9yPTB4ZmZmZmZmXSAtIFRoZSBsaWdodCdzIGNvbG9yLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbaW50ZW5zaXR5PTFdIC0gVGhlIGxpZ2h0J3Mgc3RyZW5ndGgvaW50ZW5zaXR5IG1lYXN1cmVkIGluIGNhbmRlbGEgKGNkKS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2Rpc3RhbmNlPTBdIC0gTWF4aW11bSByYW5nZSBvZiB0aGUgbGlnaHQuIGAwYCBtZWFucyBubyBsaW1pdC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2FuZ2xlPU1hdGguUEkvM10gLSBNYXhpbXVtIGFuZ2xlIG9mIGxpZ2h0IGRpc3BlcnNpb24gZnJvbSBpdHMgZGlyZWN0aW9uIHdob3NlIHVwcGVyIGJvdW5kIGlzIGBNYXRoLlBJLzJgLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbcGVudW1icmE9MF0gLSBQZXJjZW50IG9mIHRoZSBzcG90bGlnaHQgY29uZSB0aGF0IGlzIGF0dGVudWF0ZWQgZHVlIHRvIHBlbnVtYnJhLiBWYWx1ZSByYW5nZSBpcyBgWzAsMV1gLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZGVjYXk9Ml0gLSBUaGUgYW1vdW50IHRoZSBsaWdodCBkaW1zIGFsb25nIHRoZSBkaXN0YW5jZSBvZiB0aGUgbGlnaHQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGNvbG9yLCBpbnRlbnNpdHksIGRpc3RhbmNlLCBhbmdsZSwgcGVudW1icmEsIGRlY2F5ICkge1xyXG5cclxuXHRcdHN1cGVyKCBjb2xvciwgaW50ZW5zaXR5LCBkaXN0YW5jZSwgYW5nbGUsIHBlbnVtYnJhLCBkZWNheSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVE9ET1xyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pZXNNYXAgPSBudWxsO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSwgcmVjdXJzaXZlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSwgcmVjdXJzaXZlICk7XHJcblxyXG5cdFx0dGhpcy5pZXNNYXAgPSBzb3VyY2UuaWVzTWFwO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBJRVNTcG90TGlnaHQ7XHJcbiIsImltcG9ydCBOb2RlTGlicmFyeSBmcm9tICcuLi8uLi9jb21tb24vbm9kZXMvTm9kZUxpYnJhcnkuanMnO1xyXG5cclxuLy8gTWF0ZXJpYWxzXHJcbmltcG9ydCBNZXNoUGhvbmdOb2RlTWF0ZXJpYWwgZnJvbSAnLi4vLi4vLi4vbWF0ZXJpYWxzL25vZGVzL01lc2hQaG9uZ05vZGVNYXRlcmlhbC5qcyc7XHJcbmltcG9ydCBNZXNoU3RhbmRhcmROb2RlTWF0ZXJpYWwgZnJvbSAnLi4vLi4vLi4vbWF0ZXJpYWxzL25vZGVzL01lc2hTdGFuZGFyZE5vZGVNYXRlcmlhbC5qcyc7XHJcbmltcG9ydCBNZXNoUGh5c2ljYWxOb2RlTWF0ZXJpYWwgZnJvbSAnLi4vLi4vLi4vbWF0ZXJpYWxzL25vZGVzL01lc2hQaHlzaWNhbE5vZGVNYXRlcmlhbC5qcyc7XHJcbmltcG9ydCBNZXNoVG9vbk5vZGVNYXRlcmlhbCBmcm9tICcuLi8uLi8uLi9tYXRlcmlhbHMvbm9kZXMvTWVzaFRvb25Ob2RlTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgTWVzaEJhc2ljTm9kZU1hdGVyaWFsIGZyb20gJy4uLy4uLy4uL21hdGVyaWFscy9ub2Rlcy9NZXNoQmFzaWNOb2RlTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgTWVzaExhbWJlcnROb2RlTWF0ZXJpYWwgZnJvbSAnLi4vLi4vLi4vbWF0ZXJpYWxzL25vZGVzL01lc2hMYW1iZXJ0Tm9kZU1hdGVyaWFsLmpzJztcclxuaW1wb3J0IE1lc2hOb3JtYWxOb2RlTWF0ZXJpYWwgZnJvbSAnLi4vLi4vLi4vbWF0ZXJpYWxzL25vZGVzL01lc2hOb3JtYWxOb2RlTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgTWVzaE1hdGNhcE5vZGVNYXRlcmlhbCBmcm9tICcuLi8uLi8uLi9tYXRlcmlhbHMvbm9kZXMvTWVzaE1hdGNhcE5vZGVNYXRlcmlhbC5qcyc7XHJcbmltcG9ydCBMaW5lQmFzaWNOb2RlTWF0ZXJpYWwgZnJvbSAnLi4vLi4vLi4vbWF0ZXJpYWxzL25vZGVzL0xpbmVCYXNpY05vZGVNYXRlcmlhbC5qcyc7XHJcbmltcG9ydCBMaW5lRGFzaGVkTm9kZU1hdGVyaWFsIGZyb20gJy4uLy4uLy4uL21hdGVyaWFscy9ub2Rlcy9MaW5lRGFzaGVkTm9kZU1hdGVyaWFsLmpzJztcclxuaW1wb3J0IFBvaW50c05vZGVNYXRlcmlhbCBmcm9tICcuLi8uLi8uLi9tYXRlcmlhbHMvbm9kZXMvUG9pbnRzTm9kZU1hdGVyaWFsLmpzJztcclxuaW1wb3J0IFNwcml0ZU5vZGVNYXRlcmlhbCBmcm9tICcuLi8uLi8uLi9tYXRlcmlhbHMvbm9kZXMvU3ByaXRlTm9kZU1hdGVyaWFsLmpzJztcclxuaW1wb3J0IFNoYWRvd05vZGVNYXRlcmlhbCBmcm9tICcuLi8uLi8uLi9tYXRlcmlhbHMvbm9kZXMvU2hhZG93Tm9kZU1hdGVyaWFsLmpzJztcclxuLy9pbXBvcnQgeyBNZXNoRGVwdGhNYXRlcmlhbCB9IGZyb20gJy4uLy4uLy4uL21hdGVyaWFscy9NZXNoRGVwdGhNYXRlcmlhbC5qcyc7XHJcbi8vaW1wb3J0IE1lc2hEZXB0aE5vZGVNYXRlcmlhbCBmcm9tICcuLi8uLi8uLi9tYXRlcmlhbHMvbm9kZXMvTWVzaERlcHRoTm9kZU1hdGVyaWFsLmpzJztcclxuLy9pbXBvcnQgeyBNZXNoRGlzdGFuY2VNYXRlcmlhbCB9IGZyb20gJy4uLy4uLy4uL21hdGVyaWFscy9NZXNoRGlzdGFuY2VNYXRlcmlhbC5qcyc7XHJcbi8vaW1wb3J0IE1lc2hEaXN0YW5jZU5vZGVNYXRlcmlhbCBmcm9tICcuLi8uLi8uLi9tYXRlcmlhbHMvbm9kZXMvTWVzaERpc3RhbmNlTm9kZU1hdGVyaWFsLmpzJztcclxuXHJcbi8vIExpZ2h0c1xyXG5pbXBvcnQgeyBQb2ludExpZ2h0IH0gZnJvbSAnLi4vLi4vLi4vbGlnaHRzL1BvaW50TGlnaHQuanMnO1xyXG5pbXBvcnQgeyBEaXJlY3Rpb25hbExpZ2h0IH0gZnJvbSAnLi4vLi4vLi4vbGlnaHRzL0RpcmVjdGlvbmFsTGlnaHQuanMnO1xyXG5pbXBvcnQgeyBSZWN0QXJlYUxpZ2h0IH0gZnJvbSAnLi4vLi4vLi4vbGlnaHRzL1JlY3RBcmVhTGlnaHQuanMnO1xyXG5pbXBvcnQgeyBTcG90TGlnaHQgfSBmcm9tICcuLi8uLi8uLi9saWdodHMvU3BvdExpZ2h0LmpzJztcclxuaW1wb3J0IHsgQW1iaWVudExpZ2h0IH0gZnJvbSAnLi4vLi4vLi4vbGlnaHRzL0FtYmllbnRMaWdodC5qcyc7XHJcbmltcG9ydCB7IEhlbWlzcGhlcmVMaWdodCB9IGZyb20gJy4uLy4uLy4uL2xpZ2h0cy9IZW1pc3BoZXJlTGlnaHQuanMnO1xyXG5pbXBvcnQgeyBMaWdodFByb2JlIH0gZnJvbSAnLi4vLi4vLi4vbGlnaHRzL0xpZ2h0UHJvYmUuanMnO1xyXG5pbXBvcnQgSUVTU3BvdExpZ2h0IGZyb20gJy4uLy4uLy4uL2xpZ2h0cy93ZWJncHUvSUVTU3BvdExpZ2h0LmpzJztcclxuaW1wb3J0IHtcclxuXHRQb2ludExpZ2h0Tm9kZSxcclxuXHREaXJlY3Rpb25hbExpZ2h0Tm9kZSxcclxuXHRSZWN0QXJlYUxpZ2h0Tm9kZSxcclxuXHRTcG90TGlnaHROb2RlLFxyXG5cdEFtYmllbnRMaWdodE5vZGUsXHJcblx0SGVtaXNwaGVyZUxpZ2h0Tm9kZSxcclxuXHRMaWdodFByb2JlTm9kZSxcclxuXHRJRVNTcG90TGlnaHROb2RlXHJcbn0gZnJvbSAnLi4vLi4vLi4vbm9kZXMvTm9kZXMuanMnO1xyXG5cclxuLy8gVG9uZSBNYXBwaW5nXHJcbmltcG9ydCB7IExpbmVhclRvbmVNYXBwaW5nLCBSZWluaGFyZFRvbmVNYXBwaW5nLCBDaW5lb25Ub25lTWFwcGluZywgQUNFU0ZpbG1pY1RvbmVNYXBwaW5nLCBBZ1hUb25lTWFwcGluZywgTmV1dHJhbFRvbmVNYXBwaW5nIH0gZnJvbSAnLi4vLi4vLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgbGluZWFyVG9uZU1hcHBpbmcsIHJlaW5oYXJkVG9uZU1hcHBpbmcsIGNpbmVvblRvbmVNYXBwaW5nLCBhY2VzRmlsbWljVG9uZU1hcHBpbmcsIGFneFRvbmVNYXBwaW5nLCBuZXV0cmFsVG9uZU1hcHBpbmcgfSBmcm9tICcuLi8uLi8uLi9ub2Rlcy9kaXNwbGF5L1RvbmVNYXBwaW5nRnVuY3Rpb25zLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIHZlcnNpb24gb2YgYSBub2RlIGxpYnJhcnkgcmVwcmVzZW50cyB0aGUgc3RhbmRhcmQgdmVyc2lvblxyXG4gKiB1c2VkIGluIHtAbGluayBXZWJHUFVSZW5kZXJlcn0uIEl0IG1hcHMgbGlnaHRzLCB0b25lIG1hcHBpbmdcclxuICogdGVjaG5pcXVlcyBhbmQgbWF0ZXJpYWxzIHRvIG5vZGUtYmFzZWQgaW1wbGVtZW50YXRpb25zLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAYXVnbWVudHMgTm9kZUxpYnJhcnlcclxuICovXHJcbmNsYXNzIFN0YW5kYXJkTm9kZUxpYnJhcnkgZXh0ZW5kcyBOb2RlTGlicmFyeSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc3RhbmRhcmQgbm9kZSBsaWJyYXJ5LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0dGhpcy5hZGRNYXRlcmlhbCggTWVzaFBob25nTm9kZU1hdGVyaWFsLCAnTWVzaFBob25nTWF0ZXJpYWwnICk7XHJcblx0XHR0aGlzLmFkZE1hdGVyaWFsKCBNZXNoU3RhbmRhcmROb2RlTWF0ZXJpYWwsICdNZXNoU3RhbmRhcmRNYXRlcmlhbCcgKTtcclxuXHRcdHRoaXMuYWRkTWF0ZXJpYWwoIE1lc2hQaHlzaWNhbE5vZGVNYXRlcmlhbCwgJ01lc2hQaHlzaWNhbE1hdGVyaWFsJyApO1xyXG5cdFx0dGhpcy5hZGRNYXRlcmlhbCggTWVzaFRvb25Ob2RlTWF0ZXJpYWwsICdNZXNoVG9vbk1hdGVyaWFsJyApO1xyXG5cdFx0dGhpcy5hZGRNYXRlcmlhbCggTWVzaEJhc2ljTm9kZU1hdGVyaWFsLCAnTWVzaEJhc2ljTWF0ZXJpYWwnICk7XHJcblx0XHR0aGlzLmFkZE1hdGVyaWFsKCBNZXNoTGFtYmVydE5vZGVNYXRlcmlhbCwgJ01lc2hMYW1iZXJ0TWF0ZXJpYWwnICk7XHJcblx0XHR0aGlzLmFkZE1hdGVyaWFsKCBNZXNoTm9ybWFsTm9kZU1hdGVyaWFsLCAnTWVzaE5vcm1hbE1hdGVyaWFsJyApO1xyXG5cdFx0dGhpcy5hZGRNYXRlcmlhbCggTWVzaE1hdGNhcE5vZGVNYXRlcmlhbCwgJ01lc2hNYXRjYXBNYXRlcmlhbCcgKTtcclxuXHRcdHRoaXMuYWRkTWF0ZXJpYWwoIExpbmVCYXNpY05vZGVNYXRlcmlhbCwgJ0xpbmVCYXNpY01hdGVyaWFsJyApO1xyXG5cdFx0dGhpcy5hZGRNYXRlcmlhbCggTGluZURhc2hlZE5vZGVNYXRlcmlhbCwgJ0xpbmVEYXNoZWRNYXRlcmlhbCcgKTtcclxuXHRcdHRoaXMuYWRkTWF0ZXJpYWwoIFBvaW50c05vZGVNYXRlcmlhbCwgJ1BvaW50c01hdGVyaWFsJyApO1xyXG5cdFx0dGhpcy5hZGRNYXRlcmlhbCggU3ByaXRlTm9kZU1hdGVyaWFsLCAnU3ByaXRlTWF0ZXJpYWwnICk7XHJcblx0XHR0aGlzLmFkZE1hdGVyaWFsKCBTaGFkb3dOb2RlTWF0ZXJpYWwsICdTaGFkb3dNYXRlcmlhbCcgKTtcclxuXHJcblx0XHR0aGlzLmFkZExpZ2h0KCBQb2ludExpZ2h0Tm9kZSwgUG9pbnRMaWdodCApO1xyXG5cdFx0dGhpcy5hZGRMaWdodCggRGlyZWN0aW9uYWxMaWdodE5vZGUsIERpcmVjdGlvbmFsTGlnaHQgKTtcclxuXHRcdHRoaXMuYWRkTGlnaHQoIFJlY3RBcmVhTGlnaHROb2RlLCBSZWN0QXJlYUxpZ2h0ICk7XHJcblx0XHR0aGlzLmFkZExpZ2h0KCBTcG90TGlnaHROb2RlLCBTcG90TGlnaHQgKTtcclxuXHRcdHRoaXMuYWRkTGlnaHQoIEFtYmllbnRMaWdodE5vZGUsIEFtYmllbnRMaWdodCApO1xyXG5cdFx0dGhpcy5hZGRMaWdodCggSGVtaXNwaGVyZUxpZ2h0Tm9kZSwgSGVtaXNwaGVyZUxpZ2h0ICk7XHJcblx0XHR0aGlzLmFkZExpZ2h0KCBMaWdodFByb2JlTm9kZSwgTGlnaHRQcm9iZSApO1xyXG5cdFx0dGhpcy5hZGRMaWdodCggSUVTU3BvdExpZ2h0Tm9kZSwgSUVTU3BvdExpZ2h0ICk7XHJcblxyXG5cdFx0dGhpcy5hZGRUb25lTWFwcGluZyggbGluZWFyVG9uZU1hcHBpbmcsIExpbmVhclRvbmVNYXBwaW5nICk7XHJcblx0XHR0aGlzLmFkZFRvbmVNYXBwaW5nKCByZWluaGFyZFRvbmVNYXBwaW5nLCBSZWluaGFyZFRvbmVNYXBwaW5nICk7XHJcblx0XHR0aGlzLmFkZFRvbmVNYXBwaW5nKCBjaW5lb25Ub25lTWFwcGluZywgQ2luZW9uVG9uZU1hcHBpbmcgKTtcclxuXHRcdHRoaXMuYWRkVG9uZU1hcHBpbmcoIGFjZXNGaWxtaWNUb25lTWFwcGluZywgQUNFU0ZpbG1pY1RvbmVNYXBwaW5nICk7XHJcblx0XHR0aGlzLmFkZFRvbmVNYXBwaW5nKCBhZ3hUb25lTWFwcGluZywgQWdYVG9uZU1hcHBpbmcgKTtcclxuXHRcdHRoaXMuYWRkVG9uZU1hcHBpbmcoIG5ldXRyYWxUb25lTWFwcGluZywgTmV1dHJhbFRvbmVNYXBwaW5nICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFN0YW5kYXJkTm9kZUxpYnJhcnk7XHJcbiIsImltcG9ydCBSZW5kZXJlciBmcm9tICcuLi9jb21tb24vUmVuZGVyZXIuanMnO1xyXG5pbXBvcnQgV2ViR0xCYWNrZW5kIGZyb20gJy4uL3dlYmdsLWZhbGxiYWNrL1dlYkdMQmFja2VuZC5qcyc7XHJcbmltcG9ydCBXZWJHUFVCYWNrZW5kIGZyb20gJy4vV2ViR1BVQmFja2VuZC5qcyc7XHJcbmltcG9ydCBTdGFuZGFyZE5vZGVMaWJyYXJ5IGZyb20gJy4vbm9kZXMvU3RhbmRhcmROb2RlTGlicmFyeS5qcyc7XHJcbi8qXHJcbmNvbnN0IGRlYnVnSGFuZGxlciA9IHtcclxuXHJcblx0Z2V0OiBmdW5jdGlvbiAoIHRhcmdldCwgbmFtZSApIHtcclxuXHJcblx0XHQvLyBBZGQgfHVwZGF0ZVxyXG5cdFx0aWYgKCAvXihjcmVhdGV8ZGVzdHJveSkvLnRlc3QoIG5hbWUgKSApIGNvbnNvbGUubG9nKCAnV2ViR1BVQmFja2VuZC4nICsgbmFtZSApO1xyXG5cclxuXHRcdHJldHVybiB0YXJnZXRbIG5hbWUgXTtcclxuXHJcblx0fVxyXG5cclxufTtcclxuKi9cclxuXHJcbi8qKlxyXG4gKiBUaGlzIHJlbmRlcmVyIGlzIHRoZSBuZXcgYWx0ZXJuYXRpdmUgb2YgYFdlYkdMUmVuZGVyZXJgLiBgV2ViR1BVUmVuZGVyZXJgIGhhcyB0aGUgYWJpbGl0eVxyXG4gKiB0byB0YXJnZXQgZGlmZmVyZW50IGJhY2tlbmRzLiBCeSBkZWZhdWx0LCB0aGUgcmVuZGVyZXIgdHJpZXMgdG8gdXNlIGEgV2ViR1BVIGJhY2tlbmQgaWYgdGhlXHJcbiAqIGJyb3dzZXIgc3VwcG9ydHMgV2ViR1BVLiBJZiBub3QsIGBXZWJHUFVSZW5kZXJlcmAgZmFsbHMgYmFja3MgdG8gYSBXZWJHTCAyIGJhY2tlbmQuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBSZW5kZXJlclxyXG4gKi9cclxuY2xhc3MgV2ViR1BVUmVuZGVyZXIgZXh0ZW5kcyBSZW5kZXJlciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdlYkdQVVJlbmRlcmVyIG9wdGlvbnMuXHJcblx0ICpcclxuXHQgKiBAdHlwZWRlZiB7T2JqZWN0fSBXZWJHUFVSZW5kZXJlcn5PcHRpb25zXHJcblx0ICogQHByb3BlcnR5IHtib29sZWFufSBbbG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcj1mYWxzZV0gLSBXaGV0aGVyIGxvZ2FyaXRobWljIGRlcHRoIGJ1ZmZlciBpcyBlbmFibGVkIG9yIG5vdC5cclxuXHQgKiBAcHJvcGVydHkge2Jvb2xlYW59IFthbHBoYT10cnVlXSAtIFdoZXRoZXIgdGhlIGRlZmF1bHQgZnJhbWVidWZmZXIgKHdoaWNoIHJlcHJlc2VudHMgdGhlIGZpbmFsIGNvbnRlbnRzIG9mIHRoZSBjYW52YXMpIHNob3VsZCBiZSB0cmFuc3BhcmVudCBvciBvcGFxdWUuXHJcblx0ICogQHByb3BlcnR5IHtib29sZWFufSBbZGVwdGg9dHJ1ZV0gLSBXaGV0aGVyIHRoZSBkZWZhdWx0IGZyYW1lYnVmZmVyIHNob3VsZCBoYXZlIGEgZGVwdGggYnVmZmVyIG9yIG5vdC5cclxuXHQgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtzdGVuY2lsPWZhbHNlXSAtIFdoZXRoZXIgdGhlIGRlZmF1bHQgZnJhbWVidWZmZXIgc2hvdWxkIGhhdmUgYSBzdGVuY2lsIGJ1ZmZlciBvciBub3QuXHJcblx0ICogQHByb3BlcnR5IHtib29sZWFufSBbYW50aWFsaWFzPWZhbHNlXSAtIFdoZXRoZXIgTVNBQSBhcyB0aGUgZGVmYXVsdCBhbnRpLWFsaWFzaW5nIHNob3VsZCBiZSBlbmFibGVkIG9yIG5vdC5cclxuXHQgKiBAcHJvcGVydHkge251bWJlcn0gW3NhbXBsZXM9MF0gLSBXaGVuIGBhbnRpYWxpYXNgIGlzIGB0cnVlYCwgYDRgIHNhbXBsZXMgYXJlIHVzZWQgYnkgZGVmYXVsdC4gU2V0IHRoaXMgcGFyYW1ldGVyIHRvIGFueSBvdGhlciBpbnRlZ2VyIHZhbHVlIHRoYW4gMCB0byBvdmVyd3JpdGUgdGhlIGRlZmF1bHQuXHJcblx0ICogQHByb3BlcnR5IHtib29sZWFufSBbZm9yY2VXZWJHTD1mYWxzZV0gLSBJZiBzZXQgdG8gYHRydWVgLCB0aGUgcmVuZGVyZXIgdXNlcyBhIFdlYkdMIDIgYmFja2VuZCBubyBtYXR0ZXIgaWYgV2ViR1BVIGlzIHN1cHBvcnRlZCBvciBub3QuXHJcblx0ICogQHByb3BlcnR5IHtudW1iZXJ9IFtvdXRwdXRUeXBlPXVuZGVmaW5lZF0gLSBUZXh0dXJlIHR5cGUgZm9yIG91dHB1dCB0byBjYW52YXMuIEJ5IGRlZmF1bHQsIGRldmljZSdzIHByZWZlcnJlZCBmb3JtYXQgaXMgdXNlZDsgb3RoZXIgZm9ybWF0cyBtYXkgaW5jdXIgb3ZlcmhlYWQuXHJcblx0ICogQHByb3BlcnR5IHtudW1iZXJ9IFtjb2xvckJ1ZmZlclR5cGU9SGFsZkZsb2F0VHlwZV0gLSBEZWZpbmVzIHRoZSB0eXBlIG9mIGNvbG9yIGJ1ZmZlcnMuIFRoZSBkZWZhdWx0IGBIYWxmRmxvYXRUeXBlYCBpcyByZWNvbW1lbmQgZm9yIGJlc3RcclxuXHQgKiBxdWFsaXR5LiBUbyBzYXZlIG1lbW9yeSBhbmQgYmFuZHdpZHRoLCBgVW5zaWduZWRCeXRlVHlwZWAgbWlnaHQgYmUgdXNlZC4gVGhpcyB3aWxsIHJlZHVjZSByZW5kZXJpbmcgcXVhbGl0eSB0aG91Z2guXHJcblx0ICovXHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgV2ViR1BVIHJlbmRlcmVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHUFVSZW5kZXJlcn5PcHRpb25zfSBbcGFyYW1ldGVyc10gLSBUaGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHBhcmFtZXRlcnMgPSB7fSApIHtcclxuXHJcblx0XHRsZXQgQmFja2VuZENsYXNzO1xyXG5cclxuXHRcdGlmICggcGFyYW1ldGVycy5mb3JjZVdlYkdMICkge1xyXG5cclxuXHRcdFx0QmFja2VuZENsYXNzID0gV2ViR0xCYWNrZW5kO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRCYWNrZW5kQ2xhc3MgPSBXZWJHUFVCYWNrZW5kO1xyXG5cclxuXHRcdFx0cGFyYW1ldGVycy5nZXRGYWxsYmFjayA9ICgpID0+IHtcclxuXHJcblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR1BVUmVuZGVyZXI6IFdlYkdQVSBpcyBub3QgYXZhaWxhYmxlLCBydW5uaW5nIHVuZGVyIFdlYkdMMiBiYWNrZW5kLicgKTtcclxuXHJcblx0XHRcdFx0cmV0dXJuIG5ldyBXZWJHTEJhY2tlbmQoIHBhcmFtZXRlcnMgKTtcclxuXHJcblx0XHRcdH07XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGJhY2tlbmQgPSBuZXcgQmFja2VuZENsYXNzKCBwYXJhbWV0ZXJzICk7XHJcblxyXG5cdFx0Ly9zdXBlciggbmV3IFByb3h5KCBiYWNrZW5kLCBkZWJ1Z0hhbmRsZXIgKSApO1xyXG5cdFx0c3VwZXIoIGJhY2tlbmQsIHBhcmFtZXRlcnMgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBnZW5lcmljIGRlZmF1bHQgdmFsdWUgaXMgb3ZlcndyaXR0ZW4gd2l0aCB0aGVcclxuXHRcdCAqIHN0YW5kYXJkIG5vZGUgbGlicmFyeSBmb3IgdHlwZSBtYXBwaW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtTdGFuZGFyZE5vZGVMaWJyYXJ5fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxpYnJhcnkgPSBuZXcgU3RhbmRhcmROb2RlTGlicmFyeSgpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1dlYkdQVVJlbmRlcmVyID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgV2ViR1BVUmVuZGVyZXI7XHJcbiIsImltcG9ydCB7IEdyb3VwIH0gZnJvbSAnLi4vLi4vb2JqZWN0cy9Hcm91cC5qcyc7XHJcblxyXG4vKipcclxuICogQSBzcGVjaWFsaXplZCBncm91cCB3aGljaCBlbmFibGVzIGFwcGxpY2F0aW9ucyBhY2Nlc3MgdG8gdGhlXHJcbiAqIFJlbmRlciBCdW5kbGUgQVBJIG9mIFdlYkdQVS4gVGhlIGdyb3VwIHdpdGggYWxsIGl0cyBkZXNjZW5kYW50IG5vZGVzXHJcbiAqIGFyZSBjb25zaWRlcmVkIGFzIG9uZSByZW5kZXIgYnVuZGxlIGFuZCBwcm9jZXNzZWQgYXMgc3VjaCBieVxyXG4gKiB0aGUgcmVuZGVyZXIuXHJcbiAqXHJcbiAqIFRoaXMgbW9kdWxlIGlzIG9ubHkgZnVsbHkgc3VwcG9ydGVkIGJ5IGBXZWJHUFVSZW5kZXJlcmAgd2l0aCBhIFdlYkdQVSBiYWNrZW5kLlxyXG4gKiBXaXRoIGEgV2ViR0wgYmFja2VuZCwgdGhlIGdyb3VwIGNhbiB0ZWNobmljYWxseSBiZSByZW5kZXJlZCBidXQgd2l0aG91dFxyXG4gKiBhbnkgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgR3JvdXBcclxuICovXHJcbmNsYXNzIEJ1bmRsZUdyb3VwIGV4dGVuZHMgR3JvdXAge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGJ1bmRsZSBncm91cC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0J1bmRsZUdyb3VwID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgcHJvcGVydHkgaXMgb25seSByZWxldmFudCBmb3IgZGV0ZWN0aW5nIHR5cGVzXHJcblx0XHQgKiBkdXJpbmcgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24uIEl0IHNob3VsZCBhbHdheXNcclxuXHRcdCAqIG1hdGNoIHRoZSBjbGFzcyBuYW1lLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0ICdCdW5kbGVHcm91cCdcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50eXBlID0gJ0J1bmRsZUdyb3VwJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIGJ1bmRsZSBpcyBzdGF0aWMgb3Igbm90LiBXaGVuIHNldCB0byBgdHJ1ZWAsIHRoZSBzdHJ1Y3R1cmVcclxuXHRcdCAqIGlzIGFzc3VtZWQgdG8gYmUgc3RhdGljIGFuZCBkb2VzIG5vdCBjaGFuZ2UuIEUuZy4gbm8gbmV3IG9iamVjdHMgYXJlXHJcblx0XHQgKiBhZGRlZCB0byB0aGUgZ3JvdXBcclxuXHRcdCAqXHJcblx0XHQgKiBJZiBhIGNoYW5nZSBpcyByZXF1aXJlZCwgYW4gdXBkYXRlIGNhbiBzdGlsbCBiZSBmb3JjZWQgYnkgc2V0dGluZyB0aGVcclxuXHRcdCAqIGBuZWVkc1VwZGF0ZWAgZmxhZyB0byBgdHJ1ZWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc3RhdGljID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBidW5kbGUgZ3JvdXAncyB2ZXJzaW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52ZXJzaW9uID0gMDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBgdHJ1ZWAgd2hlbiB0aGUgYnVuZGxlIGdyb3VwIGhhcyBjaGFuZ2VkLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbHVlXHJcblx0ICovXHJcblx0c2V0IG5lZWRzVXBkYXRlKCB2YWx1ZSApIHtcclxuXHJcblx0XHRpZiAoIHZhbHVlID09PSB0cnVlICkgdGhpcy52ZXJzaW9uICsrO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBCdW5kbGVHcm91cDtcclxuIiwiaW1wb3J0IE5vZGVNYXRlcmlhbCBmcm9tICcuLi8uLi9tYXRlcmlhbHMvbm9kZXMvTm9kZU1hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgdmVjNCwgcmVuZGVyT3V0cHV0IH0gZnJvbSAnLi4vLi4vbm9kZXMvVFNMLmpzJztcclxuaW1wb3J0IHsgTGluZWFyU1JHQkNvbG9yU3BhY2UsIE5vVG9uZU1hcHBpbmcgfSBmcm9tICcuLi8uLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgUXVhZE1lc2ggZnJvbSAnLi4vLi4vcmVuZGVyZXJzL2NvbW1vbi9RdWFkTWVzaC5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBtb2R1bGUgaXMgcmVzcG9uc2libGUgdG8gbWFuYWdlIHRoZSBwb3N0IHByb2Nlc3Npbmcgc2V0dXBzIGluIGFwcHMuXHJcbiAqIFlvdSB1c3VhbGx5IGNyZWF0ZSBhIHNpbmdsZSBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFuZCB1c2UgaXQgdG8gZGVmaW5lXHJcbiAqIHRoZSBvdXRwdXQgb2YgeW91ciBwb3N0IHByb2Nlc3NpbmcgZWZmZWN0IGNoYWluLlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBwb3N0UHJvY2Vzc2luZyA9IG5ldyBQb3N0UHJvY2Vzc2luZyggcmVuZGVyZXIgKTtcclxuICpcclxuICogY29uc3Qgc2NlbmVQYXNzID0gcGFzcyggc2NlbmUsIGNhbWVyYSApO1xyXG4gKlxyXG4gKiBwb3N0UHJvY2Vzc2luZy5vdXRwdXROb2RlID0gc2NlbmVQYXNzO1xyXG4gKiBgYGBcclxuICpcclxuICogTm90ZTogVGhpcyBtb2R1bGUgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIGBXZWJHUFVSZW5kZXJlcmAuXHJcbiAqL1xyXG5jbGFzcyBQb3N0UHJvY2Vzc2luZyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcG9zdCBwcm9jZXNzaW5nIG1hbmFnZW1lbnQgbW9kdWxlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSZW5kZXJlcn0gcmVuZGVyZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgcmVuZGVyZXIuXHJcblx0ICogQHBhcmFtIHtOb2RlPHZlYzQ+fSBvdXRwdXROb2RlIC0gQW4gb3B0aW9uYWwgb3V0cHV0IG5vZGUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHJlbmRlcmVyLCBvdXRwdXROb2RlID0gdmVjNCggMCwgMCwgMSwgMSApICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIHJlbmRlcmVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtSZW5kZXJlcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBub2RlIHdoaWNoIGRlZmluZXMgdGhlIGZpbmFsIG91dHB1dCBvZiB0aGUgcG9zdFxyXG5cdFx0ICogcHJvY2Vzc2luZy4gVGhpcyBpcyB1c3VhbGx5IHRoZSBsYXN0IG5vZGUgaW4gYSBjaGFpblxyXG5cdFx0ICogb2YgZWZmZWN0IG5vZGVzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlPHZlYzQ+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm91dHB1dE5vZGUgPSBvdXRwdXROb2RlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgZGVmYXVsdCBvdXRwdXQgdG9uZSBtYXBwaW5nIGFuZCBjb2xvclxyXG5cdFx0ICogc3BhY2UgdHJhbnNmb3JtYXRpb24gc2hvdWxkIGJlIGVuYWJsZWQgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEl0IGlzIGVuYWJsZWQgYnkgZGVmYXVsdCBieSBpdCBtdXN0IGJlIGRpc2FibGVkIHdoZW5cclxuXHRcdCAqIGVmZmVjdHMgbXVzdCBiZSBleGVjdXRlZCBhZnRlciB0b25lIG1hcHBpbmcgYW5kIGNvbG9yXHJcblx0XHQgKiBzcGFjZSBjb252ZXJzaW9uLiBBIHR5cGljYWwgZXhhbXBsZSBpcyBGWEFBIHdoaWNoXHJcblx0XHQgKiByZXF1aXJlcyBzUkdCIGlucHV0LlxyXG5cdFx0ICpcclxuXHRcdCAqIFdoZW4gc2V0IHRvIGBmYWxzZWAsIHRoZSBhcHAgbXVzdCBjb250cm9sIHRoZSBvdXRwdXRcclxuXHRcdCAqIHRyYW5zZm9ybWF0aW9uIHdpdGggYFJlbmRlck91dHB1dE5vZGVgLlxyXG5cdFx0ICpcclxuXHRcdCAqIGBgYGpzXHJcblx0XHQgKiBjb25zdCBvdXRwdXRQYXNzID0gcmVuZGVyT3V0cHV0KCBzY2VuZVBhc3MgKTtcclxuXHRcdCAqIGBgYFxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm91dHB1dENvbG9yVHJhbnNmb3JtID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIE11c3QgYmUgc2V0IHRvIGB0cnVlYCB3aGVuIHRoZSBvdXRwdXQgbm9kZSBjaGFuZ2VzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlPHZlYzQ+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHRjb25zdCBtYXRlcmlhbCA9IG5ldyBOb2RlTWF0ZXJpYWwoKTtcclxuXHRcdG1hdGVyaWFsLm5hbWUgPSAnUG9zdFByb2Nlc3NpbmcnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGZ1bGwgc2NyZWVuIHF1YWQgdGhhdCBpcyB1c2VkIHRvIHJlbmRlclxyXG5cdFx0ICogdGhlIGVmZmVjdHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHtRdWFkTWVzaH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fcXVhZE1lc2ggPSBuZXcgUXVhZE1lc2goIG1hdGVyaWFsICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogV2hlbiBgUG9zdFByb2Nlc3NpbmdgIGlzIHVzZWQgdG8gYXBwbHkgcG9zdCBwcm9jZXNzaW5nIGVmZmVjdHMsXHJcblx0ICogdGhlIGFwcGxpY2F0aW9uIG11c3QgdXNlIHRoaXMgdmVyc2lvbiBvZiBgcmVuZGVyKClgIGluc2lkZVxyXG5cdCAqIGl0cyBhbmltYXRpb24gbG9vcCAobm90IHRoZSBvbmUgZnJvbSB0aGUgcmVuZGVyZXIpLlxyXG5cdCAqL1xyXG5cdHJlbmRlcigpIHtcclxuXHJcblx0XHR0aGlzLl91cGRhdGUoKTtcclxuXHJcblx0XHRjb25zdCByZW5kZXJlciA9IHRoaXMucmVuZGVyZXI7XHJcblxyXG5cdFx0Y29uc3QgdG9uZU1hcHBpbmcgPSByZW5kZXJlci50b25lTWFwcGluZztcclxuXHRcdGNvbnN0IG91dHB1dENvbG9yU3BhY2UgPSByZW5kZXJlci5vdXRwdXRDb2xvclNwYWNlO1xyXG5cclxuXHRcdHJlbmRlcmVyLnRvbmVNYXBwaW5nID0gTm9Ub25lTWFwcGluZztcclxuXHRcdHJlbmRlcmVyLm91dHB1dENvbG9yU3BhY2UgPSBMaW5lYXJTUkdCQ29sb3JTcGFjZTtcclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGNvbnN0IGN1cnJlbnRYUiA9IHJlbmRlcmVyLnhyLmVuYWJsZWQ7XHJcblx0XHRyZW5kZXJlci54ci5lbmFibGVkID0gZmFsc2U7XHJcblxyXG5cdFx0dGhpcy5fcXVhZE1lc2gucmVuZGVyKCByZW5kZXJlciApO1xyXG5cclxuXHRcdHJlbmRlcmVyLnhyLmVuYWJsZWQgPSBjdXJyZW50WFI7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRyZW5kZXJlci50b25lTWFwcGluZyA9IHRvbmVNYXBwaW5nO1xyXG5cdFx0cmVuZGVyZXIub3V0cHV0Q29sb3JTcGFjZSA9IG91dHB1dENvbG9yU3BhY2U7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRnJlZXMgaW50ZXJuYWwgcmVzb3VyY2VzLlxyXG5cdCAqL1xyXG5cdGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0dGhpcy5fcXVhZE1lc2gubWF0ZXJpYWwuZGlzcG9zZSgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIHN0YXRlIG9mIHRoZSBtb2R1bGUuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqL1xyXG5cdF91cGRhdGUoKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5lZWRzVXBkYXRlID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0Y29uc3QgcmVuZGVyZXIgPSB0aGlzLnJlbmRlcmVyO1xyXG5cclxuXHRcdFx0Y29uc3QgdG9uZU1hcHBpbmcgPSByZW5kZXJlci50b25lTWFwcGluZztcclxuXHRcdFx0Y29uc3Qgb3V0cHV0Q29sb3JTcGFjZSA9IHJlbmRlcmVyLm91dHB1dENvbG9yU3BhY2U7XHJcblxyXG5cdFx0XHR0aGlzLl9xdWFkTWVzaC5tYXRlcmlhbC5mcmFnbWVudE5vZGUgPSB0aGlzLm91dHB1dENvbG9yVHJhbnNmb3JtID09PSB0cnVlID8gcmVuZGVyT3V0cHV0KCB0aGlzLm91dHB1dE5vZGUsIHRvbmVNYXBwaW5nLCBvdXRwdXRDb2xvclNwYWNlICkgOiB0aGlzLm91dHB1dE5vZGUuY29udGV4dCggeyB0b25lTWFwcGluZywgb3V0cHV0Q29sb3JTcGFjZSB9ICk7XHJcblx0XHRcdHRoaXMuX3F1YWRNZXNoLm1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHRcdHRoaXMubmVlZHNVcGRhdGUgPSBmYWxzZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogV2hlbiBgUG9zdFByb2Nlc3NpbmdgIGlzIHVzZWQgdG8gYXBwbHkgcG9zdCBwcm9jZXNzaW5nIGVmZmVjdHMsXHJcblx0ICogdGhlIGFwcGxpY2F0aW9uIG11c3QgdXNlIHRoaXMgdmVyc2lvbiBvZiBgcmVuZGVyQXN5bmMoKWAgaW5zaWRlXHJcblx0ICogaXRzIGFuaW1hdGlvbiBsb29wIChub3QgdGhlIG9uZSBmcm9tIHRoZSByZW5kZXJlcikuXHJcblx0ICpcclxuXHQgKiBAYXN5bmNcclxuXHQgKiBAcmV0dXJuIHtQcm9taXNlfSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSByZW5kZXIgaGFzIGJlZW4gZmluaXNoZWQuXHJcblx0ICovXHJcblx0YXN5bmMgcmVuZGVyQXN5bmMoKSB7XHJcblxyXG5cdFx0dGhpcy5fdXBkYXRlKCk7XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyZXIgPSB0aGlzLnJlbmRlcmVyO1xyXG5cclxuXHRcdGNvbnN0IHRvbmVNYXBwaW5nID0gcmVuZGVyZXIudG9uZU1hcHBpbmc7XHJcblx0XHRjb25zdCBvdXRwdXRDb2xvclNwYWNlID0gcmVuZGVyZXIub3V0cHV0Q29sb3JTcGFjZTtcclxuXHJcblx0XHRyZW5kZXJlci50b25lTWFwcGluZyA9IE5vVG9uZU1hcHBpbmc7XHJcblx0XHRyZW5kZXJlci5vdXRwdXRDb2xvclNwYWNlID0gTGluZWFyU1JHQkNvbG9yU3BhY2U7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCBjdXJyZW50WFIgPSByZW5kZXJlci54ci5lbmFibGVkO1xyXG5cdFx0cmVuZGVyZXIueHIuZW5hYmxlZCA9IGZhbHNlO1xyXG5cclxuXHRcdGF3YWl0IHRoaXMuX3F1YWRNZXNoLnJlbmRlckFzeW5jKCByZW5kZXJlciApO1xyXG5cclxuXHRcdHJlbmRlcmVyLnhyLmVuYWJsZWQgPSBjdXJyZW50WFI7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRyZW5kZXJlci50b25lTWFwcGluZyA9IHRvbmVNYXBwaW5nO1xyXG5cdFx0cmVuZGVyZXIub3V0cHV0Q29sb3JTcGFjZSA9IG91dHB1dENvbG9yU3BhY2U7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFBvc3RQcm9jZXNzaW5nO1xyXG4iLCJpbXBvcnQgeyBUZXh0dXJlIH0gZnJvbSAnLi4vLi4vdGV4dHVyZXMvVGV4dHVyZS5qcyc7XHJcbmltcG9ydCB7IExpbmVhckZpbHRlciB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBzcGVjaWFsIHR5cGUgb2YgdGV4dHVyZSBpcyBpbnRlbmRlZCBmb3IgY29tcHV0ZSBzaGFkZXJzLlxyXG4gKiBJdCBjYW4gYmUgdXNlZCB0byBjb21wdXRlIHRoZSBkYXRhIG9mIGEgdGV4dHVyZSB3aXRoIGEgY29tcHV0ZSBzaGFkZXIuXHJcbiAqXHJcbiAqIE5vdGU6IFRoaXMgdHlwZSBvZiB0ZXh0dXJlIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBgV2ViR1BVUmVuZGVyZXJgXHJcbiAqIGFuZCBhIFdlYkdQVSBiYWNrZW5kLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgVGV4dHVyZVxyXG4gKi9cclxuY2xhc3MgU3RvcmFnZVRleHR1cmUgZXh0ZW5kcyBUZXh0dXJlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBzdG9yYWdlIHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3dpZHRoPTFdIC0gVGhlIHN0b3JhZ2UgdGV4dHVyZSdzIHdpZHRoLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbaGVpZ2h0PTFdIC0gVGhlIHN0b3JhZ2UgdGV4dHVyZSdzIGhlaWdodC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggd2lkdGggPSAxLCBoZWlnaHQgPSAxICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgaW1hZ2Ugb2JqZWN0IHdoaWNoIGp1c3QgcmVwcmVzZW50cyB0aGUgdGV4dHVyZSdzIGRpbWVuc2lvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7e3dpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyfX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pbWFnZSA9IHsgd2lkdGgsIGhlaWdodCB9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGRlZmF1bHQgYG1hZ0ZpbHRlcmAgZm9yIHN0b3JhZ2UgdGV4dHVyZXMgaXMgYFRIUkVFLkxpbmVhckZpbHRlcmAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tYWdGaWx0ZXIgPSBMaW5lYXJGaWx0ZXI7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZGVmYXVsdCBgbWluRmlsdGVyYCBmb3Igc3RvcmFnZSB0ZXh0dXJlcyBpcyBgVEhSRUUuTGluZWFyRmlsdGVyYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1pbkZpbHRlciA9IExpbmVhckZpbHRlcjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNTdG9yYWdlVGV4dHVyZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFN0b3JhZ2VUZXh0dXJlO1xyXG4iLCJpbXBvcnQgU3RvcmFnZUJ1ZmZlckF0dHJpYnV0ZSBmcm9tICcuL1N0b3JhZ2VCdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgc3BlY2lhbCB0eXBlIG9mIGJ1ZmZlciBhdHRyaWJ1dGUgaXMgaW50ZW5kZWQgZm9yIGNvbXB1dGUgc2hhZGVycy5cclxuICogSXQgY2FuIGJlIHVzZWQgdG8gZW5jb2RlIGRyYXcgcGFyYW1ldGVycyBmb3IgaW5kaXJlY3QgZHJhdyBjYWxscy5cclxuICpcclxuICogTm90ZTogVGhpcyB0eXBlIG9mIGJ1ZmZlciBhdHRyaWJ1dGUgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIGBXZWJHUFVSZW5kZXJlcmBcclxuICogYW5kIGEgV2ViR1BVIGJhY2tlbmQuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBTdG9yYWdlQnVmZmVyQXR0cmlidXRlXHJcbiAqL1xyXG5jbGFzcyBJbmRpcmVjdFN0b3JhZ2VCdWZmZXJBdHRyaWJ1dGUgZXh0ZW5kcyBTdG9yYWdlQnVmZmVyQXR0cmlidXRlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBzdG9yYWdlIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcnxVaW50MzJBcnJheX0gY291bnQgLSBUaGUgaXRlbSBjb3VudC4gSXQgaXMgYWxzbyB2YWxpZCB0byBwYXNzIGEgYFVpbnQzMkFycmF5YCBhcyBhbiBhcmd1bWVudC5cclxuXHQgKiBUaGUgc3Vic2VxdWVudCBwYXJhbWV0ZXIgaXMgdGhlbiBvYnNvbGV0ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaXRlbVNpemUgLSBUaGUgaXRlbSBzaXplLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBjb3VudCwgaXRlbVNpemUgKSB7XHJcblxyXG5cdFx0c3VwZXIoIGNvdW50LCBpdGVtU2l6ZSwgVWludDMyQXJyYXkgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNJbmRpcmVjdFN0b3JhZ2VCdWZmZXJBdHRyaWJ1dGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBJbmRpcmVjdFN0b3JhZ2VCdWZmZXJBdHRyaWJ1dGU7XHJcbiIsImltcG9ydCB7IG5vZGVPYmplY3QsIGZsb2F0IH0gZnJvbSAnLi4vLi4vbm9kZXMvdHNsL1RTTEJhc2UuanMnO1xyXG5cclxuaW1wb3J0IHsgTG9hZGVyIH0gZnJvbSAnLi4vTG9hZGVyLmpzJztcclxuaW1wb3J0IHsgRmlsZUxvYWRlciB9IGZyb20gJy4uLy4uL2xvYWRlcnMvRmlsZUxvYWRlci5qcyc7XHJcblxyXG4vKipcclxuICogQSBsb2FkZXIgZm9yIGxvYWRpbmcgbm9kZSBvYmplY3RzIGluIHRoZSB0aHJlZS5qcyBKU09OIE9iamVjdC9TY2VuZSBmb3JtYXQuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBMb2FkZXJcclxuICovXHJcbmNsYXNzIE5vZGVMb2FkZXIgZXh0ZW5kcyBMb2FkZXIge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG5vZGUgbG9hZGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtMb2FkaW5nTWFuYWdlcn0gW21hbmFnZXJdIC0gQSByZWZlcmVuY2UgdG8gYSBsb2FkaW5nIG1hbmFnZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG1hbmFnZXIgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG1hbmFnZXIgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlcHJlc2VudHMgYSBkaWN0aW9uYXJ5IG9mIHRleHR1cmVzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLFRleHR1cmU+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRleHR1cmVzID0ge307XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXByZXNlbnRzIGEgZGljdGlvbmFyeSBvZiBub2RlIHR5cGVzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLE5vZGUuY29uc3RydWN0b3I+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vZGVzID0ge307XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTG9hZHMgdGhlIG5vZGUgZGVmaW5pdGlvbnMgZnJvbSB0aGUgZ2l2ZW4gVVJMLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIFRoZSBwYXRoL1VSTCBvZiB0aGUgZmlsZSB0byBiZSBsb2FkZWQuXHJcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gb25Mb2FkIC0gV2lsbCBiZSBjYWxsZWQgd2hlbiBsb2FkIGNvbXBsZXRlcy5cclxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblByb2dyZXNzIC0gV2lsbCBiZSBjYWxsZWQgd2hpbGUgbG9hZCBwcm9ncmVzc2VzLlxyXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3IgLSBXaWxsIGJlIGNhbGxlZCB3aGVuIGVycm9ycyBhcmUgdGhyb3duIGR1cmluZyB0aGUgbG9hZGluZyBwcm9jZXNzLlxyXG5cdCAqL1xyXG5cdGxvYWQoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xyXG5cclxuXHRcdGNvbnN0IGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCB0aGlzLm1hbmFnZXIgKTtcclxuXHRcdGxvYWRlci5zZXRQYXRoKCB0aGlzLnBhdGggKTtcclxuXHRcdGxvYWRlci5zZXRSZXF1ZXN0SGVhZGVyKCB0aGlzLnJlcXVlc3RIZWFkZXIgKTtcclxuXHRcdGxvYWRlci5zZXRXaXRoQ3JlZGVudGlhbHMoIHRoaXMud2l0aENyZWRlbnRpYWxzICk7XHJcblx0XHRsb2FkZXIubG9hZCggdXJsLCAoIHRleHQgKSA9PiB7XHJcblxyXG5cdFx0XHR0cnkge1xyXG5cclxuXHRcdFx0XHRvbkxvYWQoIHRoaXMucGFyc2UoIEpTT04ucGFyc2UoIHRleHQgKSApICk7XHJcblxyXG5cdFx0XHR9IGNhdGNoICggZSApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBvbkVycm9yICkge1xyXG5cclxuXHRcdFx0XHRcdG9uRXJyb3IoIGUgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCBlICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0dGhpcy5tYW5hZ2VyLml0ZW1FcnJvciggdXJsICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBhcnNlIHRoZSBub2RlIGRlcGVuZGVuY2llcyBmb3IgdGhlIGxvYWRlZCBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxPYmplY3Q+fSBbanNvbl0gLSBUaGUgSlNPTiBkZWZpbml0aW9uXHJcblx0ICogQHJldHVybiB7T2JqZWN0PHN0cmluZyxOb2RlPn0gQSBkaWN0aW9uYXJ5IHdpdGggbm9kZSBkZXBlbmRlbmNpZXMuXHJcblx0ICovXHJcblx0cGFyc2VOb2RlcygganNvbiApIHtcclxuXHJcblx0XHRjb25zdCBub2RlcyA9IHt9O1xyXG5cclxuXHRcdGlmICgganNvbiAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Zm9yICggY29uc3Qgbm9kZUpTT04gb2YganNvbiApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgeyB1dWlkLCB0eXBlIH0gPSBub2RlSlNPTjtcclxuXHJcblx0XHRcdFx0bm9kZXNbIHV1aWQgXSA9IHRoaXMuY3JlYXRlTm9kZUZyb21UeXBlKCB0eXBlICk7XHJcblx0XHRcdFx0bm9kZXNbIHV1aWQgXS51dWlkID0gdXVpZDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IG1ldGEgPSB7IG5vZGVzLCB0ZXh0dXJlczogdGhpcy50ZXh0dXJlcyB9O1xyXG5cclxuXHRcdFx0Zm9yICggY29uc3Qgbm9kZUpTT04gb2YganNvbiApIHtcclxuXHJcblx0XHRcdFx0bm9kZUpTT04ubWV0YSA9IG1ldGE7XHJcblxyXG5cdFx0XHRcdGNvbnN0IG5vZGUgPSBub2Rlc1sgbm9kZUpTT04udXVpZCBdO1xyXG5cdFx0XHRcdG5vZGUuZGVzZXJpYWxpemUoIG5vZGVKU09OICk7XHJcblxyXG5cdFx0XHRcdGRlbGV0ZSBub2RlSlNPTi5tZXRhO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbm9kZXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUGFyc2VzIHRoZSBub2RlIGZyb20gdGhlIGdpdmVuIEpTT04uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0ganNvbiAtIFRoZSBKU09OIGRlZmluaXRpb25cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30ganNvbi50eXBlIC0gVGhlIG5vZGUgdHlwZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30ganNvbi51dWlkIC0gVGhlIG5vZGUgVVVJRC5cclxuXHQgKiBAcGFyYW0ge0FycmF5PE9iamVjdD59IFtqc29uLm5vZGVzXSAtIFRoZSBub2RlIGRlcGVuZGVuY2llcy5cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW2pzb24ubWV0YV0gLSBUaGUgbWV0YSBkYXRhLlxyXG5cdCAqIEByZXR1cm4ge05vZGV9IFRoZSBwYXJzZWQgbm9kZS5cclxuXHQgKi9cclxuXHRwYXJzZSgganNvbiApIHtcclxuXHJcblx0XHRjb25zdCBub2RlID0gdGhpcy5jcmVhdGVOb2RlRnJvbVR5cGUoIGpzb24udHlwZSApO1xyXG5cdFx0bm9kZS51dWlkID0ganNvbi51dWlkO1xyXG5cclxuXHRcdGNvbnN0IG5vZGVzID0gdGhpcy5wYXJzZU5vZGVzKCBqc29uLm5vZGVzICk7XHJcblx0XHRjb25zdCBtZXRhID0geyBub2RlcywgdGV4dHVyZXM6IHRoaXMudGV4dHVyZXMgfTtcclxuXHJcblx0XHRqc29uLm1ldGEgPSBtZXRhO1xyXG5cclxuXHRcdG5vZGUuZGVzZXJpYWxpemUoIGpzb24gKTtcclxuXHJcblx0XHRkZWxldGUganNvbi5tZXRhO1xyXG5cclxuXHRcdHJldHVybiBub2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgdGhlIGRpY3Rpb25hcnkgb2YgdGV4dHVyZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdDxzdHJpbmcsVGV4dHVyZT59IHZhbHVlIC0gVGhlIHRleHR1cmUgbGlicmFyeSBkZWZpbmVzIGFzIGA8dXVpZCx0ZXh0dXJlPmAuXHJcblx0ICogQHJldHVybiB7Tm9kZUxvYWRlcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBsb2FkZXIuXHJcblx0ICovXHJcblx0c2V0VGV4dHVyZXMoIHZhbHVlICkge1xyXG5cclxuXHRcdHRoaXMudGV4dHVyZXMgPSB2YWx1ZTtcclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgdGhlIGRpY3Rpb25hcnkgb2Ygbm9kZSB0eXBlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0PHN0cmluZyxOb2RlLmNvbnN0cnVjdG9yPn0gdmFsdWUgLSBUaGUgbm9kZSBsaWJyYXJ5IGRlZmluZWQgYXMgYDxjbGFzc25hbWUsY2xhc3M+YC5cclxuXHQgKiBAcmV0dXJuIHtOb2RlTG9hZGVyfSBBIHJlZmVyZW5jZSB0byB0aGlzIGxvYWRlci5cclxuXHQgKi9cclxuXHRzZXROb2RlcyggdmFsdWUgKSB7XHJcblxyXG5cdFx0dGhpcy5ub2RlcyA9IHZhbHVlO1xyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyBhIG5vZGUgb2JqZWN0IGZyb20gdGhlIGdpdmVuIHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSBub2RlIHR5cGUuXHJcblx0ICogQHJldHVybiB7Tm9kZX0gVGhlIGNyZWF0ZWQgbm9kZSBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRjcmVhdGVOb2RlRnJvbVR5cGUoIHR5cGUgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5vZGVzWyB0eXBlIF0gPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Ob2RlTG9hZGVyOiBOb2RlIHR5cGUgbm90IGZvdW5kOicsIHR5cGUgKTtcclxuXHRcdFx0cmV0dXJuIGZsb2F0KCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBub2RlT2JqZWN0KCBuZXcgdGhpcy5ub2Rlc1sgdHlwZSBdKCkgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTm9kZUxvYWRlcjtcclxuIiwiaW1wb3J0IHsgTWF0ZXJpYWxMb2FkZXIgfSBmcm9tICcuLi8uLi9sb2FkZXJzL01hdGVyaWFsTG9hZGVyLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIHNwZWNpYWwgdHlwZSBvZiBtYXRlcmlhbCBsb2FkZXIgZm9yIGxvYWRpbmcgbm9kZSBtYXRlcmlhbHMuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBNYXRlcmlhbExvYWRlclxyXG4gKi9cclxuY2xhc3MgTm9kZU1hdGVyaWFsTG9hZGVyIGV4dGVuZHMgTWF0ZXJpYWxMb2FkZXIge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG5vZGUgbWF0ZXJpYWwgbG9hZGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtMb2FkaW5nTWFuYWdlcn0gW21hbmFnZXJdIC0gQSByZWZlcmVuY2UgdG8gYSBsb2FkaW5nIG1hbmFnZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG1hbmFnZXIgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG1hbmFnZXIgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlcHJlc2VudHMgYSBkaWN0aW9uYXJ5IG9mIG5vZGUgdHlwZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdDxzdHJpbmcsTm9kZS5jb25zdHJ1Y3Rvcj59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9kZXMgPSB7fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlcHJlc2VudHMgYSBkaWN0aW9uYXJ5IG9mIG5vZGUgbWF0ZXJpYWwgdHlwZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdDxzdHJpbmcsTm9kZU1hdGVyaWFsLmNvbnN0cnVjdG9yPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub2RlTWF0ZXJpYWxzID0ge307XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUGFyc2VzIHRoZSBub2RlIG1hdGVyaWFsIGZyb20gdGhlIGdpdmVuIEpTT04uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0ganNvbiAtIFRoZSBKU09OIGRlZmluaXRpb25cclxuXHQgKiBAcmV0dXJuIHtOb2RlTWF0ZXJpYWx9LiBUaGUgcGFyc2VkIG1hdGVyaWFsLlxyXG5cdCAqL1xyXG5cdHBhcnNlKCBqc29uICkge1xyXG5cclxuXHRcdGNvbnN0IG1hdGVyaWFsID0gc3VwZXIucGFyc2UoIGpzb24gKTtcclxuXHJcblx0XHRjb25zdCBub2RlcyA9IHRoaXMubm9kZXM7XHJcblx0XHRjb25zdCBpbnB1dE5vZGVzID0ganNvbi5pbnB1dE5vZGVzO1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IHByb3BlcnR5IGluIGlucHV0Tm9kZXMgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB1dWlkID0gaW5wdXROb2Rlc1sgcHJvcGVydHkgXTtcclxuXHJcblx0XHRcdG1hdGVyaWFsWyBwcm9wZXJ0eSBdID0gbm9kZXNbIHV1aWQgXTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG1hdGVyaWFsO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgdGhlIGRpY3Rpb25hcnkgb2Ygbm9kZSB0eXBlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0PHN0cmluZyxOb2RlLmNvbnN0cnVjdG9yPn0gdmFsdWUgLSBUaGUgbm9kZSBsaWJyYXJ5IGRlZmluZWQgYXMgYDxjbGFzc25hbWUsY2xhc3M+YC5cclxuXHQgKiBAcmV0dXJuIHtOb2RlTG9hZGVyfSBBIHJlZmVyZW5jZSB0byB0aGlzIGxvYWRlci5cclxuXHQgKi9cclxuXHRzZXROb2RlcyggdmFsdWUgKSB7XHJcblxyXG5cdFx0dGhpcy5ub2RlcyA9IHZhbHVlO1xyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVmaW5lcyB0aGUgZGljdGlvbmFyeSBvZiBub2RlIG1hdGVyaWFsIHR5cGVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3Q8c3RyaW5nLE5vZGVNYXRlcmlhbC5jb25zdHJ1Y3Rvcj59IHZhbHVlIC0gVGhlIG5vZGUgbWF0ZXJpYWwgbGlicmFyeSBkZWZpbmVkIGFzIGA8Y2xhc3NuYW1lLGNsYXNzPmAuXHJcblx0ICogQHJldHVybiB7Tm9kZUxvYWRlcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBsb2FkZXIuXHJcblx0ICovXHJcblx0c2V0Tm9kZU1hdGVyaWFscyggdmFsdWUgKSB7XHJcblxyXG5cdFx0dGhpcy5ub2RlTWF0ZXJpYWxzID0gdmFsdWU7XHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGEgbm9kZSBtYXRlcmlhbCBmcm9tIHRoZSBnaXZlbiB0eXBlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBUaGUgbm9kZSBtYXRlcmlhbCB0eXBlLlxyXG5cdCAqIEByZXR1cm4ge05vZGV9IFRoZSBjcmVhdGVkIG5vZGUgbWF0ZXJpYWwgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y3JlYXRlTWF0ZXJpYWxGcm9tVHlwZSggdHlwZSApIHtcclxuXHJcblx0XHRjb25zdCBtYXRlcmlhbENsYXNzID0gdGhpcy5ub2RlTWF0ZXJpYWxzWyB0eXBlIF07XHJcblxyXG5cdFx0aWYgKCBtYXRlcmlhbENsYXNzICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gbmV3IG1hdGVyaWFsQ2xhc3MoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHN1cGVyLmNyZWF0ZU1hdGVyaWFsRnJvbVR5cGUoIHR5cGUgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTm9kZU1hdGVyaWFsTG9hZGVyO1xyXG4iLCJpbXBvcnQgTm9kZUxvYWRlciBmcm9tICcuL05vZGVMb2FkZXIuanMnO1xyXG5pbXBvcnQgTm9kZU1hdGVyaWFsTG9hZGVyIGZyb20gJy4vTm9kZU1hdGVyaWFsTG9hZGVyLmpzJztcclxuXHJcbmltcG9ydCB7IE9iamVjdExvYWRlciB9IGZyb20gJy4uLy4uL2xvYWRlcnMvT2JqZWN0TG9hZGVyLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIHNwZWNpYWwgdHlwZSBvZiBvYmplY3QgbG9hZGVyIGZvciBsb2FkaW5nIDNEIG9iamVjdHMgdXNpbmdcclxuICogbm9kZSBtYXRlcmlhbHMuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBPYmplY3RMb2FkZXJcclxuICovXHJcbmNsYXNzIE5vZGVPYmplY3RMb2FkZXIgZXh0ZW5kcyBPYmplY3RMb2FkZXIge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG5vZGUgb2JqZWN0IGxvYWRlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TG9hZGluZ01hbmFnZXJ9IFttYW5hZ2VyXSAtIEEgcmVmZXJlbmNlIHRvIGEgbG9hZGluZyBtYW5hZ2VyLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBtYW5hZ2VyICkge1xyXG5cclxuXHRcdHN1cGVyKCBtYW5hZ2VyICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXByZXNlbnRzIGEgZGljdGlvbmFyeSBvZiBub2RlIHR5cGVzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLE5vZGUuY29uc3RydWN0b3I+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vZGVzID0ge307XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXByZXNlbnRzIGEgZGljdGlvbmFyeSBvZiBub2RlIG1hdGVyaWFsIHR5cGVzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLE5vZGVNYXRlcmlhbC5jb25zdHJ1Y3Rvcj59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9kZU1hdGVyaWFscyA9IHt9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gaG9sZCB0aGUgYG5vZGVzYCBKU09OIHByb3BlcnR5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7P09iamVjdH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fbm9kZXNKU09OID0gbnVsbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWZpbmVzIHRoZSBkaWN0aW9uYXJ5IG9mIG5vZGUgdHlwZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdDxzdHJpbmcsTm9kZS5jb25zdHJ1Y3Rvcj59IHZhbHVlIC0gVGhlIG5vZGUgbGlicmFyeSBkZWZpbmVkIGFzIGA8Y2xhc3NuYW1lLGNsYXNzPmAuXHJcblx0ICogQHJldHVybiB7Tm9kZU9iamVjdExvYWRlcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBsb2FkZXIuXHJcblx0ICovXHJcblx0c2V0Tm9kZXMoIHZhbHVlICkge1xyXG5cclxuXHRcdHRoaXMubm9kZXMgPSB2YWx1ZTtcclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgdGhlIGRpY3Rpb25hcnkgb2Ygbm9kZSBtYXRlcmlhbCB0eXBlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0PHN0cmluZyxOb2RlTWF0ZXJpYWwuY29uc3RydWN0b3I+fSB2YWx1ZSAtIFRoZSBub2RlIG1hdGVyaWFsIGxpYnJhcnkgZGVmaW5lZCBhcyBgPGNsYXNzbmFtZSxjbGFzcz5gLlxyXG5cdCAqIEByZXR1cm4ge05vZGVPYmplY3RMb2FkZXJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbG9hZGVyLlxyXG5cdCAqL1xyXG5cdHNldE5vZGVNYXRlcmlhbHMoIHZhbHVlICkge1xyXG5cclxuXHRcdHRoaXMubm9kZU1hdGVyaWFscyA9IHZhbHVlO1xyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUGFyc2VzIHRoZSBub2RlIG9iamVjdHMgZnJvbSB0aGUgZ2l2ZW4gSlNPTi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBqc29uIC0gVGhlIEpTT04gZGVmaW5pdGlvblxyXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IG9uTG9hZCAtIFRoZSBvbkxvYWQgY2FsbGJhY2sgZnVuY3Rpb24uXHJcblx0ICogQHJldHVybiB7T2JqZWN0M0R9LiBUaGUgcGFyc2VkIDNEIG9iamVjdC5cclxuXHQgKi9cclxuXHRwYXJzZSgganNvbiwgb25Mb2FkICkge1xyXG5cclxuXHRcdHRoaXMuX25vZGVzSlNPTiA9IGpzb24ubm9kZXM7XHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IHN1cGVyLnBhcnNlKCBqc29uLCBvbkxvYWQgKTtcclxuXHJcblx0XHR0aGlzLl9ub2Rlc0pTT04gPSBudWxsOyAvLyBkaXNwb3NlXHJcblxyXG5cdFx0cmV0dXJuIGRhdGE7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUGFyc2VzIHRoZSBub2RlIG9iamVjdHMgZnJvbSB0aGUgZ2l2ZW4gSlNPTiBhbmQgdGV4dHVyZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0ganNvbiAtIFRoZSBKU09OIGRlZmluaXRpb25cclxuXHQgKiBAcGFyYW0ge09iamVjdDxzdHJpbmcsVGV4dHVyZT59IHRleHR1cmVzIC0gVGhlIHRleHR1cmUgbGlicmFyeS5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3Q8c3RyaW5nLE5vZGU+fS4gVGhlIHBhcnNlZCBub2Rlcy5cclxuXHQgKi9cclxuXHRwYXJzZU5vZGVzKCBqc29uLCB0ZXh0dXJlcyApIHtcclxuXHJcblx0XHRpZiAoIGpzb24gIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGxvYWRlciA9IG5ldyBOb2RlTG9hZGVyKCk7XHJcblx0XHRcdGxvYWRlci5zZXROb2RlcyggdGhpcy5ub2RlcyApO1xyXG5cdFx0XHRsb2FkZXIuc2V0VGV4dHVyZXMoIHRleHR1cmVzICk7XHJcblxyXG5cdFx0XHRyZXR1cm4gbG9hZGVyLnBhcnNlTm9kZXMoIGpzb24gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHt9O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBhcnNlcyB0aGUgbm9kZSBvYmplY3RzIGZyb20gdGhlIGdpdmVuIEpTT04gYW5kIHRleHR1cmVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGpzb24gLSBUaGUgSlNPTiBkZWZpbml0aW9uXHJcblx0ICogQHBhcmFtIHtPYmplY3Q8c3RyaW5nLFRleHR1cmU+fSB0ZXh0dXJlcyAtIFRoZSB0ZXh0dXJlIGxpYnJhcnkuXHJcblx0ICogQHJldHVybiB7T2JqZWN0PHN0cmluZyxOb2RlTWF0ZXJpYWw+fS4gVGhlIHBhcnNlZCBtYXRlcmlhbHMuXHJcblx0ICovXHJcblx0cGFyc2VNYXRlcmlhbHMoIGpzb24sIHRleHR1cmVzICkge1xyXG5cclxuXHRcdGNvbnN0IG1hdGVyaWFscyA9IHt9O1xyXG5cclxuXHRcdGlmICgganNvbiAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgbm9kZXMgPSB0aGlzLnBhcnNlTm9kZXMoIHRoaXMuX25vZGVzSlNPTiwgdGV4dHVyZXMgKTtcclxuXHJcblx0XHRcdGNvbnN0IGxvYWRlciA9IG5ldyBOb2RlTWF0ZXJpYWxMb2FkZXIoKTtcclxuXHRcdFx0bG9hZGVyLnNldFRleHR1cmVzKCB0ZXh0dXJlcyApO1xyXG5cdFx0XHRsb2FkZXIuc2V0Tm9kZXMoIG5vZGVzICk7XHJcblx0XHRcdGxvYWRlci5zZXROb2RlTWF0ZXJpYWxzKCB0aGlzLm5vZGVNYXRlcmlhbHMgKTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGpzb24ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgZGF0YSA9IGpzb25bIGkgXTtcclxuXHJcblx0XHRcdFx0bWF0ZXJpYWxzWyBkYXRhLnV1aWQgXSA9IGxvYWRlci5wYXJzZSggZGF0YSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbWF0ZXJpYWxzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBOb2RlT2JqZWN0TG9hZGVyO1xyXG4iLCJpbXBvcnQgeyBHcm91cCB9IGZyb20gJy4vR3JvdXAuanMnO1xyXG5cclxuLyoqXHJcbiAqIEluIGVhcmxpZXIgdGhyZWUuanMgdmVyc2lvbnMsIGNsaXBwaW5nIHdhcyBkZWZpbmVkIGdsb2JhbGx5XHJcbiAqIG9uIHRoZSByZW5kZXJlciBvciBvbiBtYXRlcmlhbCBsZXZlbC4gVGhpcyBzcGVjaWFsIHZlcnNpb24gb2ZcclxuICogYFRIUkVFLkdyb3VwYCBhbGxvd3MgdG8gZW5jb2RlIHRoZSBjbGlwcGluZyBzdGF0ZSBpbnRvIHRoZSBzY2VuZVxyXG4gKiBncmFwaC4gTWVhbmluZyBpZiB5b3UgY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgZ3JvdXAsIGFsbFxyXG4gKiBkZXNjZW5kYW50IDNEIG9iamVjdHMgd2lsbCBiZSBhZmZlY3RlZCBieSB0aGUgcmVzcGVjdGl2ZSBjbGlwcGluZ1xyXG4gKiBwbGFuZXMuXHJcbiAqXHJcbiAqIE5vdGU6IGBDbGlwcGluZ0dyb3VwYCBjYW4gb25seSBiZSB1c2VkIHdpdGggYFdlYkdQVVJlbmRlcmVyYC5cclxuICpcclxuICogQGF1Z21lbnRzIEdyb3VwXHJcbiAqL1xyXG5jbGFzcyBDbGlwcGluZ0dyb3VwIGV4dGVuZHMgR3JvdXAge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGNsaXBwaW5nIGdyb3VwLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzQ2xpcHBpbmdHcm91cCA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBhcnJheSB3aXRoIGNsaXBwaW5nIHBsYW5lcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8UGxhbmU+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNsaXBwaW5nUGxhbmVzID0gW107XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIGNsaXBwaW5nIHNob3VsZCBiZSBlbmFibGVkIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5lbmFibGVkID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgY2xpcHBpbmcgcGxhbmVzIGlzIHVzZWQgdG8gY2xpcCBvYmplY3RzLCByYXRoZXIgdGhhbiB0aGVpciB1bmlvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2xpcEludGVyc2VjdGlvbiA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciBzaGFkb3dzIHNob3VsZCBiZSBjbGlwcGVkIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2xpcFNoYWRvd3MgPSBmYWxzZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgQ2xpcHBpbmdHcm91cCB9O1xyXG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2xiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNZO0FBQ0E7QUFDQTtBQUNBOztBQzdEWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2g0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25GQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3REQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNQO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQU9QO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ087QUFDUDtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDTztBQUNBO0FBQ0E7QUFDQTtBQUNQO0FBQ087QUFDQTtBQUNBO0FBQ0E7QUFDUDtBQUNPO0FBQ0E7QUFDQTtBQUNBO0FBQ1A7QUFDTztBQUNBO0FBQ0E7QUFDQTtBQUNQO0FBQ087QUFDQTtBQUNBO0FBQ1A7QUFDTztBQUNBO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDQTtBQUNBO0FBQ1A7QUFDQTtBQUNBOztBQ3R3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087O0FDcElQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087O0FDdlZQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7O0FDNUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzd0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNBO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdqQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDblBBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7O0FDMUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6TUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDek1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087O0FDbFZQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPOztBQ3ZFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7O0FDL0dBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTs7QUMvVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBOztBQ2hPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBOztBQ2hHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTs7QUN6RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBOztBQ3pIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087O0FDL0RQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7O0FDeEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDTztBQUNQO0FBQ0E7O0FDckVBO0FBQ0E7QUFDQTtBQXdCQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FDNUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUNwS1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPOztBQ1BQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUN4RVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087O0FDM0ZQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUN0d0JQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUM5RlA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyV0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPOztBQ3pIUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPOztBQ3BRUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkxBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUMxRFA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087O0FDbEVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUM1QlA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPOztBQ2xJUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087O0FDcFpQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087O0FDL0VQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUN4RFA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087O0FDN0NQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPOztBQzVJUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087O0FDMUdQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNod0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPOztBQ3JKUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087O0FDM05QO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUN2Q1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087O0FDL0pQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUN2SVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUNuVFA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDTzs7QUNoSFA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087O0FDbklQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087O0FDaERQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBOztBQ2xTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUNwRFA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUMzUFA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6cENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPOztBQzVDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqaUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPOztBQ1RQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUNwRFA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUN6T1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25FQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25EQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNueEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5UEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzU1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPOztBQ2pZUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNWZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPOztBQ3ZDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUMzRlA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3Z5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2TUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkZPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ087QUFDQTs7QUNUUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0dBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzY0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3VEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOVlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0dBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyY0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPOztBQzFEUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUN4TVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPOztBQ25HUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUNuSlA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUNyRFA7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25FQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087O0FDcEpQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087O0FDckNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPOztBQ2xGUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUNuSVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUNyZlA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaFFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUMxR1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUM5Q1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUMzSVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087O0FDdExQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUNqRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPOztBQzNOUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPOztBQ3BEUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPOztBQzd1QlA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPOztBQ2pMUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087O0FDcExQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ0E7O0FDekpQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087O0FDdlBQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087O0FDanRCUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPOztBQ3hLUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPOztBQzlOUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPOztBQ25GUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPOztBQzFNUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPOztBQ3pQUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087O0FDNUhQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPOztBQzlhUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUN2RlA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUN6S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPOztBQzl4QlA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPOztBQ3RTUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDalFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0JBO0FBQ0E7QUFDQTtBQU9BO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPOztBQzl5Q1A7QUFDQTtBQUNBO0FBSUE7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUhBO0FBQ0E7QUFDQTtBQUlBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVk87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDQTtBQUNQO0FBQ0E7QUFDTztBQUNBO0FBQ1A7QUFDTztBQUNQO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDTztBQUNQO0FBQ087QUFDQTtBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ0E7QUFDQTtBQUNQO0FBQ087QUFDUDtBQUNPO0FBQ0E7QUFDQTtBQUNBOztBQzlEUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ1NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbldBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaHBGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9TQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqeUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25RQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbjhDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcDRGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JlQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0lBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeDBDQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdHBCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbG5DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JuQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdETztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxMkVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUdBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFHQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBa0NBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUtBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUVBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFPQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBRUE7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDTztBQUNQO0FBSUE7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMVVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMzdDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwa0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5YUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2p2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVSQTtBQWlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2o0REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeExBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7In0= diff --git a/build/three.webgpu.min.js b/build/three.webgpu.min.js index 53dd02a5b6be02..392ed9b4b4548c 100644 --- a/build/three.webgpu.min.js +++ b/build/three.webgpu.min.js @@ -3,4 +3,5 @@ * Copyright 2010-2025 Three.js Authors * SPDX-License-Identifier: MIT */ -import{Color as e,Vector2 as t,Vector3 as r,Vector4 as s,Matrix2 as i,Matrix3 as n,Matrix4 as a,EventDispatcher as o,MathUtils as u,WebGLCoordinateSystem as l,WebGPUCoordinateSystem as d,ColorManagement as c,SRGBTransfer as h,NoToneMapping as p,StaticDrawUsage as g,InterleavedBuffer as m,InterleavedBufferAttribute as f,DynamicDrawUsage as y,NoColorSpace as x,UnsignedIntType as b,IntType as T,NearestFilter as _,Sphere as v,BackSide as N,Euler as S,CubeReflectionMapping as E,CubeRefractionMapping as w,TangentSpaceNormalMap as A,ObjectSpaceNormalMap as R,InstancedInterleavedBuffer as C,InstancedBufferAttribute as M,DataArrayTexture as P,FloatType as L,FramebufferTexture as F,LinearMipmapLinearFilter as B,DepthTexture as I,Material as D,NormalBlending as V,LineBasicMaterial as U,LineDashedMaterial as O,NoBlending as G,MeshNormalMaterial as k,SRGBColorSpace as z,WebGLCubeRenderTarget as $,BoxGeometry as H,Mesh as W,Scene as j,LinearFilter as q,CubeCamera as X,CubeTexture as K,EquirectangularReflectionMapping as Y,EquirectangularRefractionMapping as Q,AddOperation as Z,MixOperation as J,MultiplyOperation as ee,MeshBasicMaterial as te,MeshLambertMaterial as re,MeshPhongMaterial as se,OrthographicCamera as ie,PerspectiveCamera as ne,RenderTarget as ae,CubeUVReflectionMapping as oe,BufferGeometry as ue,BufferAttribute as le,LinearSRGBColorSpace as de,RGBAFormat as ce,HalfFloatType as he,Texture as pe,MeshStandardMaterial as ge,MeshPhysicalMaterial as me,MeshToonMaterial as fe,MeshMatcapMaterial as ye,SpriteMaterial as xe,PointsMaterial as be,ShadowMaterial as Te,Uint32BufferAttribute as _e,Uint16BufferAttribute as ve,arrayNeedsUint32 as Ne,DoubleSide as Se,Camera as Ee,DepthStencilFormat as we,DepthFormat as Ae,UnsignedInt248Type as Re,UnsignedByteType as Ce,Plane as Me,Object3D as Pe,LinearMipMapLinearFilter as Le,Float32BufferAttribute as Fe,UVMapping as Be,LessCompare as Ie,VSMShadowMap as De,RGFormat as Ve,BasicShadowMap as Ue,SphereGeometry as Oe,LinearMipmapNearestFilter as Ge,NearestMipmapLinearFilter as ke,Float16BufferAttribute as ze,REVISION as $e,ArrayCamera as He,PlaneGeometry as We,FrontSide as je,CustomBlending as qe,AddEquation as Xe,ZeroFactor as Ke,CylinderGeometry as Ye,Quaternion as Qe,WebXRController as Ze,RAD2DEG as Je,PCFShadowMap as et,Frustum as tt,DataTexture as rt,RedIntegerFormat as st,RedFormat as it,ShortType as nt,ByteType as at,UnsignedShortType as ot,RGIntegerFormat as ut,RGBIntegerFormat as lt,RGBFormat as dt,RGBAIntegerFormat as ct,warnOnce as ht,createCanvasElement as pt,ReverseSubtractEquation as gt,SubtractEquation as mt,OneMinusDstAlphaFactor as ft,OneMinusDstColorFactor as yt,OneMinusSrcAlphaFactor as xt,OneMinusSrcColorFactor as bt,DstAlphaFactor as Tt,DstColorFactor as _t,SrcAlphaSaturateFactor as vt,SrcAlphaFactor as Nt,SrcColorFactor as St,OneFactor as Et,CullFaceNone as wt,CullFaceBack as At,CullFaceFront as Rt,MultiplyBlending as Ct,SubtractiveBlending as Mt,AdditiveBlending as Pt,NotEqualDepth as Lt,GreaterDepth as Ft,GreaterEqualDepth as Bt,EqualDepth as It,LessEqualDepth as Dt,LessDepth as Vt,AlwaysDepth as Ut,NeverDepth as Ot,UnsignedShort4444Type as Gt,UnsignedShort5551Type as kt,UnsignedInt5999Type as zt,AlphaFormat as $t,LuminanceFormat as Ht,LuminanceAlphaFormat as Wt,RGB_S3TC_DXT1_Format as jt,RGBA_S3TC_DXT1_Format as qt,RGBA_S3TC_DXT3_Format as Xt,RGBA_S3TC_DXT5_Format as Kt,RGB_PVRTC_4BPPV1_Format as Yt,RGB_PVRTC_2BPPV1_Format as Qt,RGBA_PVRTC_4BPPV1_Format as Zt,RGBA_PVRTC_2BPPV1_Format as Jt,RGB_ETC1_Format as er,RGB_ETC2_Format as tr,RGBA_ETC2_EAC_Format as rr,RGBA_ASTC_4x4_Format as sr,RGBA_ASTC_5x4_Format as ir,RGBA_ASTC_5x5_Format as nr,RGBA_ASTC_6x5_Format as ar,RGBA_ASTC_6x6_Format as or,RGBA_ASTC_8x5_Format as ur,RGBA_ASTC_8x6_Format as lr,RGBA_ASTC_8x8_Format as dr,RGBA_ASTC_10x5_Format as cr,RGBA_ASTC_10x6_Format as hr,RGBA_ASTC_10x8_Format as pr,RGBA_ASTC_10x10_Format as gr,RGBA_ASTC_12x10_Format as mr,RGBA_ASTC_12x12_Format as fr,RGBA_BPTC_Format as yr,RED_RGTC1_Format as xr,SIGNED_RED_RGTC1_Format as br,RED_GREEN_RGTC2_Format as Tr,SIGNED_RED_GREEN_RGTC2_Format as _r,MirroredRepeatWrapping as vr,ClampToEdgeWrapping as Nr,RepeatWrapping as Sr,NearestMipmapNearestFilter as Er,NotEqualCompare as wr,GreaterCompare as Ar,GreaterEqualCompare as Rr,EqualCompare as Cr,LessEqualCompare as Mr,AlwaysCompare as Pr,NeverCompare as Lr,NotEqualStencilFunc as Fr,GreaterStencilFunc as Br,GreaterEqualStencilFunc as Ir,EqualStencilFunc as Dr,LessEqualStencilFunc as Vr,LessStencilFunc as Ur,AlwaysStencilFunc as Or,NeverStencilFunc as Gr,DecrementWrapStencilOp as kr,IncrementWrapStencilOp as zr,DecrementStencilOp as $r,IncrementStencilOp as Hr,InvertStencilOp as Wr,ReplaceStencilOp as jr,ZeroStencilOp as qr,KeepStencilOp as Xr,MaxEquation as Kr,MinEquation as Yr,SpotLight as Qr,PointLight as Zr,DirectionalLight as Jr,RectAreaLight as es,AmbientLight as ts,HemisphereLight as rs,LightProbe as ss,LinearToneMapping as is,ReinhardToneMapping as ns,CineonToneMapping as as,ACESFilmicToneMapping as os,AgXToneMapping as us,NeutralToneMapping as ls,Group as ds,Loader as cs,FileLoader as hs,MaterialLoader as ps,ObjectLoader as gs}from"./three.core.min.js";export{AdditiveAnimationBlendMode,AnimationAction,AnimationClip,AnimationLoader,AnimationMixer,AnimationObjectGroup,AnimationUtils,ArcCurve,ArrowHelper,AttachedBindMode,Audio,AudioAnalyser,AudioContext,AudioListener,AudioLoader,AxesHelper,BasicDepthPacking,BatchedMesh,Bone,BooleanKeyframeTrack,Box2,Box3,Box3Helper,BoxHelper,BufferGeometryLoader,Cache,CameraHelper,CanvasTexture,CapsuleGeometry,CatmullRomCurve3,CircleGeometry,Clock,ColorKeyframeTrack,CompressedArrayTexture,CompressedCubeTexture,CompressedTexture,CompressedTextureLoader,ConeGeometry,ConstantAlphaFactor,ConstantColorFactor,Controls,CubeTextureLoader,CubicBezierCurve,CubicBezierCurve3,CubicInterpolant,CullFaceFrontBack,Curve,CurvePath,CustomToneMapping,Cylindrical,Data3DTexture,DataTextureLoader,DataUtils,DefaultLoadingManager,DetachedBindMode,DirectionalLightHelper,DiscreteInterpolant,DodecahedronGeometry,DynamicCopyUsage,DynamicReadUsage,EdgesGeometry,EllipseCurve,ExtrudeGeometry,Fog,FogExp2,GLBufferAttribute,GLSL1,GLSL3,GridHelper,HemisphereLightHelper,IcosahedronGeometry,ImageBitmapLoader,ImageLoader,ImageUtils,InstancedBufferGeometry,InstancedMesh,Int16BufferAttribute,Int32BufferAttribute,Int8BufferAttribute,Interpolant,InterpolateDiscrete,InterpolateLinear,InterpolateSmooth,KeyframeTrack,LOD,LatheGeometry,Layers,Light,Line,Line3,LineCurve,LineCurve3,LineLoop,LineSegments,LinearInterpolant,LinearMipMapNearestFilter,LinearTransfer,LoaderUtils,LoadingManager,LoopOnce,LoopPingPong,LoopRepeat,MOUSE,MeshDepthMaterial,MeshDistanceMaterial,NearestMipMapLinearFilter,NearestMipMapNearestFilter,NormalAnimationBlendMode,NumberKeyframeTrack,OctahedronGeometry,OneMinusConstantAlphaFactor,OneMinusConstantColorFactor,PCFSoftShadowMap,Path,PlaneHelper,PointLightHelper,Points,PolarGridHelper,PolyhedronGeometry,PositionalAudio,PropertyBinding,PropertyMixer,QuadraticBezierCurve,QuadraticBezierCurve3,QuaternionKeyframeTrack,QuaternionLinearInterpolant,RGBADepthPacking,RGBDepthPacking,RGB_BPTC_SIGNED_Format,RGB_BPTC_UNSIGNED_Format,RGDepthPacking,RawShaderMaterial,Ray,Raycaster,RenderTarget3D,RenderTargetArray,RingGeometry,ShaderMaterial,Shape,ShapeGeometry,ShapePath,ShapeUtils,Skeleton,SkeletonHelper,SkinnedMesh,Source,Spherical,SphericalHarmonics3,SplineCurve,SpotLightHelper,Sprite,StaticCopyUsage,StaticReadUsage,StereoCamera,StreamCopyUsage,StreamDrawUsage,StreamReadUsage,StringKeyframeTrack,TOUCH,TetrahedronGeometry,TextureLoader,TextureUtils,TimestampQuery,TorusGeometry,TorusKnotGeometry,Triangle,TriangleFanDrawMode,TriangleStripDrawMode,TrianglesDrawMode,TubeGeometry,Uint8BufferAttribute,Uint8ClampedBufferAttribute,Uniform,UniformsGroup,VectorKeyframeTrack,VideoFrameTexture,VideoTexture,WebGL3DRenderTarget,WebGLArrayRenderTarget,WebGLRenderTarget,WireframeGeometry,WrapAroundEnding,ZeroCurvatureEnding,ZeroSlopeEnding}from"./three.core.min.js";const ms=["alphaMap","alphaTest","anisotropy","anisotropyMap","anisotropyRotation","aoMap","attenuationColor","attenuationDistance","bumpMap","clearcoat","clearcoatMap","clearcoatNormalMap","clearcoatNormalScale","clearcoatRoughness","color","dispersion","displacementMap","emissive","emissiveMap","envMap","gradientMap","ior","iridescence","iridescenceIOR","iridescenceMap","iridescenceThicknessMap","lightMap","map","matcap","metalness","metalnessMap","normalMap","normalScale","opacity","roughness","roughnessMap","sheen","sheenColor","sheenColorMap","sheenRoughnessMap","shininess","specular","specularColor","specularColorMap","specularIntensity","specularIntensityMap","specularMap","thickness","transmission","transmissionMap"];class fs{constructor(e){this.renderObjects=new WeakMap,this.hasNode=this.containsNode(e),this.hasAnimation=!0===e.object.isSkinnedMesh,this.refreshUniforms=ms,this.renderId=0}firstInitialization(e){return!1===this.renderObjects.has(e)&&(this.getRenderObjectData(e),!0)}getRenderObjectData(e){let t=this.renderObjects.get(e);if(void 0===t){const{geometry:r,material:s,object:i}=e;if(t={material:this.getMaterialData(s),geometry:{id:r.id,attributes:this.getAttributesData(r.attributes),indexVersion:r.index?r.index.version:null,drawRange:{start:r.drawRange.start,count:r.drawRange.count}},worldMatrix:i.matrixWorld.clone()},i.center&&(t.center=i.center.clone()),i.morphTargetInfluences&&(t.morphTargetInfluences=i.morphTargetInfluences.slice()),null!==e.bundle&&(t.version=e.bundle.version),t.material.transmission>0){const{width:r,height:s}=e.context;t.bufferWidth=r,t.bufferHeight=s}this.renderObjects.set(e,t)}return t}getAttributesData(e){const t={};for(const r in e){const s=e[r];t[r]={version:s.version}}return t}containsNode(e){const t=e.material;for(const e in t)if(t[e]&&t[e].isNode)return!0;return null!==e.renderer.nodes.modelViewMatrix||null!==e.renderer.nodes.modelNormalViewMatrix}getMaterialData(e){const t={};for(const r of this.refreshUniforms){const s=e[r];null!=s&&("object"==typeof s&&void 0!==s.clone?!0===s.isTexture?t[r]={id:s.id,version:s.version}:t[r]=s.clone():t[r]=s)}return t}equals(e){const{object:t,material:r,geometry:s}=e,i=this.getRenderObjectData(e);if(!0!==i.worldMatrix.equals(t.matrixWorld))return i.worldMatrix.copy(t.matrixWorld),!1;const n=i.material;for(const e in n){const t=n[e],s=r[e];if(void 0!==t.equals){if(!1===t.equals(s))return t.copy(s),!1}else if(!0===s.isTexture){if(t.id!==s.id||t.version!==s.version)return t.id=s.id,t.version=s.version,!1}else if(t!==s)return n[e]=s,!1}if(n.transmission>0){const{width:t,height:r}=e.context;if(i.bufferWidth!==t||i.bufferHeight!==r)return i.bufferWidth=t,i.bufferHeight=r,!1}const a=i.geometry,o=s.attributes,u=a.attributes,l=Object.keys(u),d=Object.keys(o);if(a.id!==s.id)return a.id=s.id,!1;if(l.length!==d.length)return i.geometry.attributes=this.getAttributesData(o),!1;for(const e of l){const t=u[e],r=o[e];if(void 0===r)return delete u[e],!1;if(t.version!==r.version)return t.version=r.version,!1}const c=s.index,h=a.indexVersion,p=c?c.version:null;if(h!==p)return a.indexVersion=p,!1;if(a.drawRange.start!==s.drawRange.start||a.drawRange.count!==s.drawRange.count)return a.drawRange.start=s.drawRange.start,a.drawRange.count=s.drawRange.count,!1;if(i.morphTargetInfluences){let e=!1;for(let r=0;r>>16,2246822507),r^=Math.imul(s^s>>>13,3266489909),s=Math.imul(s^s>>>16,2246822507),s^=Math.imul(r^r>>>13,3266489909),4294967296*(2097151&s)+(r>>>0)}const xs=e=>ys(e),bs=e=>ys(e),Ts=(...e)=>ys(e);function _s(e,t=!1){const r=[];!0===e.isNode&&(r.push(e.id),e=e.getSelf());for(const{property:s,childNode:i}of vs(e))r.push(ys(s.slice(0,-4)),i.getCacheKey(t));return ys(r)}function*vs(e,t=!1){for(const r in e){if(!0===r.startsWith("_"))continue;const s=e[r];if(!0===Array.isArray(s))for(let e=0;ee.charCodeAt(0))).buffer}var Fs=Object.freeze({__proto__:null,arrayBufferToBase64:Ps,base64ToArrayBuffer:Ls,getCacheKey:_s,getDataFromObject:Ms,getLengthFromType:As,getNodeChildren:vs,getTypeFromLength:Es,getTypedArrayFromType:ws,getValueFromType:Cs,getValueType:Rs,hash:Ts,hashArray:bs,hashString:xs});const Bs={VERTEX:"vertex",FRAGMENT:"fragment"},Is={NONE:"none",FRAME:"frame",RENDER:"render",OBJECT:"object"},Ds={BOOLEAN:"bool",INTEGER:"int",FLOAT:"float",VECTOR2:"vec2",VECTOR3:"vec3",VECTOR4:"vec4",MATRIX2:"mat2",MATRIX3:"mat3",MATRIX4:"mat4"},Vs={READ_ONLY:"readOnly",WRITE_ONLY:"writeOnly",READ_WRITE:"readWrite"},Us=["fragment","vertex"],Os=["setup","analyze","generate"],Gs=[...Us,"compute"],ks=["x","y","z","w"];let zs=0;class $s extends o{static get type(){return"Node"}constructor(e=null){super(),this.nodeType=e,this.updateType=Is.NONE,this.updateBeforeType=Is.NONE,this.updateAfterType=Is.NONE,this.uuid=u.generateUUID(),this.version=0,this.global=!1,this.isNode=!0,this._cacheKey=null,this._cacheKeyVersion=0,Object.defineProperty(this,"id",{value:zs++})}set needsUpdate(e){!0===e&&this.version++}get type(){return this.constructor.type}onUpdate(e,t){return this.updateType=t,this.update=e.bind(this.getSelf()),this}onFrameUpdate(e){return this.onUpdate(e,Is.FRAME)}onRenderUpdate(e){return this.onUpdate(e,Is.RENDER)}onObjectUpdate(e){return this.onUpdate(e,Is.OBJECT)}onReference(e){return this.updateReference=e.bind(this.getSelf()),this}getSelf(){return this.self||this}updateReference(){return this}isGlobal(){return this.global}*getChildren(){for(const{childNode:e}of vs(this))yield e}dispose(){this.dispatchEvent({type:"dispose"})}traverse(e){e(this);for(const t of this.getChildren())t.traverse(e)}getCacheKey(e=!1){return!0!==(e=e||this.version!==this._cacheKeyVersion)&&null!==this._cacheKey||(this._cacheKey=Ts(_s(this,e),this.customCacheKey()),this._cacheKeyVersion=this.version),this._cacheKey}customCacheKey(){return 0}getScope(){return this}getHash(){return this.uuid}getUpdateType(){return this.updateType}getUpdateBeforeType(){return this.updateBeforeType}getUpdateAfterType(){return this.updateAfterType}getElementType(e){const t=this.getNodeType(e);return e.getElementType(t)}getMemberType(){return"void"}getNodeType(e){const t=e.getNodeProperties(this);return t.outputNode?t.outputNode.getNodeType(e):this.nodeType}getShared(e){const t=this.getHash(e);return e.getNodeFromHash(t)||this}setup(e){const t=e.getNodeProperties(this);let r=0;for(const e of this.getChildren())t["node"+r++]=e;return t.outputNode||null}analyze(e){if(1===e.increaseUsage(this)){const t=e.getNodeProperties(this);for(const r of Object.values(t))r&&!0===r.isNode&&r.build(e)}}generate(e,t){const{outputNode:r}=e.getNodeProperties(this);if(r&&!0===r.isNode)return r.build(e,t)}updateBefore(){console.warn("Abstract function.")}updateAfter(){console.warn("Abstract function.")}update(){console.warn("Abstract function.")}build(e,t=null){const r=this.getShared(e);if(this!==r)return r.build(e,t);e.addNode(this),e.addChain(this);let s=null;const i=e.getBuildStage();if("setup"===i){this.updateReference(e);const t=e.getNodeProperties(this);if(!0!==t.initialized){t.initialized=!0;const r=this.setup(e),s=r&&!0===r.isNode;for(const r of Object.values(t))r&&!0===r.isNode&&r.build(e);s&&r.build(e),t.outputNode=r}}else if("analyze"===i)this.analyze(e);else if("generate"===i){if(1===this.generate.length){const r=this.getNodeType(e),i=e.getDataFromNode(this);s=i.snippet,void 0===s?void 0===i.generated?(i.generated=!0,s=this.generate(e)||"",i.snippet=s):(console.warn("THREE.Node: Recursion detected.",this),s=""):void 0!==i.flowCodes&&void 0!==e.context.nodeBlock&&e.addFlowCodeHierarchy(this,e.context.nodeBlock),s=e.format(s,r,t)}else s=this.generate(e,t)||""}return e.removeChain(this),e.addSequentialNode(this),s}getSerializeChildren(){return vs(this)}serialize(e){const t=this.getSerializeChildren(),r={};for(const{property:s,index:i,childNode:n}of t)void 0!==i?(void 0===r[s]&&(r[s]=Number.isInteger(i)?[]:{}),r[s][i]=n.toJSON(e.meta).uuid):r[s]=n.toJSON(e.meta).uuid;Object.keys(r).length>0&&(e.inputNodes=r)}deserialize(e){if(void 0!==e.inputNodes){const t=e.meta.nodes;for(const r in e.inputNodes)if(Array.isArray(e.inputNodes[r])){const s=[];for(const i of e.inputNodes[r])s.push(t[i]);this[r]=s}else if("object"==typeof e.inputNodes[r]){const s={};for(const i in e.inputNodes[r]){const n=e.inputNodes[r][i];s[i]=t[n]}this[r]=s}else{const s=e.inputNodes[r];this[r]=t[s]}}}toJSON(e){const{uuid:t,type:r}=this,s=void 0===e||"string"==typeof e;s&&(e={textures:{},images:{},nodes:{}});let i=e.nodes[t];function n(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(void 0===i&&(i={uuid:t,type:r,meta:e,metadata:{version:4.6,type:"Node",generator:"Node.toJSON"}},!0!==s&&(e.nodes[i.uuid]=i),this.serialize(i),delete i.meta),s){const t=n(e.textures),r=n(e.images),s=n(e.nodes);t.length>0&&(i.textures=t),r.length>0&&(i.images=r),s.length>0&&(i.nodes=s)}return i}}class Hs extends $s{static get type(){return"ArrayElementNode"}constructor(e,t){super(),this.node=e,this.indexNode=t,this.isArrayElementNode=!0}getNodeType(e){return this.node.getElementType(e)}generate(e){const t=this.indexNode.getNodeType(e);return`${this.node.build(e)}[ ${this.indexNode.build(e,!e.isVector(t)&&e.isInteger(t)?t:"uint")} ]`}}class Ws extends $s{static get type(){return"ConvertNode"}constructor(e,t){super(),this.node=e,this.convertTo=t}getNodeType(e){const t=this.node.getNodeType(e);let r=null;for(const s of this.convertTo.split("|"))null!==r&&e.getTypeLength(t)!==e.getTypeLength(s)||(r=s);return r}serialize(e){super.serialize(e),e.convertTo=this.convertTo}deserialize(e){super.deserialize(e),this.convertTo=e.convertTo}generate(e,t){const r=this.node,s=this.getNodeType(e),i=r.build(e,s);return e.format(i,s,t)}}class js extends $s{static get type(){return"TempNode"}constructor(e=null){super(e),this.isTempNode=!0}hasDependencies(e){return e.getDataFromNode(this).usageCount>1}build(e,t){if("generate"===e.getBuildStage()){const r=e.getVectorType(this.getNodeType(e,t)),s=e.getDataFromNode(this);if(void 0!==s.propertyName)return e.format(s.propertyName,r,t);if("void"!==r&&"void"!==t&&this.hasDependencies(e)){const i=super.build(e,r),n=e.getVarFromNode(this,null,r),a=e.getPropertyName(n);return e.addLineFlowCode(`${a} = ${i}`,this),s.snippet=i,s.propertyName=a,e.format(s.propertyName,r,t)}}return super.build(e,t)}}class qs extends js{static get type(){return"JoinNode"}constructor(e=[],t=null){super(t),this.nodes=e}getNodeType(e){return null!==this.nodeType?e.getVectorType(this.nodeType):e.getTypeFromLength(this.nodes.reduce(((t,r)=>t+e.getTypeLength(r.getNodeType(e))),0))}generate(e,t){const r=this.getNodeType(e),s=e.getTypeLength(r),i=this.nodes,n=e.getComponentType(r),a=[];let o=0;for(const t of i){if(o>=s){console.error(`THREE.TSL: Length of parameters exceeds maximum length of function '${r}()' type.`);break}let i,u=t.getNodeType(e),l=e.getTypeLength(u);o+l>s&&(console.error(`THREE.TSL: Length of '${r}()' data exceeds maximum length of output type.`),l=s-o,u=e.getTypeFromLength(l)),o+=l,i=t.build(e,u);const d=e.getComponentType(u);d!==n&&(i=e.format(i,d,n)),a.push(i)}const u=`${e.getType(r)}( ${a.join(", ")} )`;return e.format(u,r,t)}}const Xs=ks.join("");class Ks extends $s{static get type(){return"SplitNode"}constructor(e,t="x"){super(),this.node=e,this.components=t,this.isSplitNode=!0}getVectorLength(){let e=this.components.length;for(const t of this.components)e=Math.max(ks.indexOf(t)+1,e);return e}getComponentType(e){return e.getComponentType(this.node.getNodeType(e))}getNodeType(e){return e.getTypeFromLength(this.components.length,this.getComponentType(e))}generate(e,t){const r=this.node,s=e.getTypeLength(r.getNodeType(e));let i=null;if(s>1){let n=null;this.getVectorLength()>=s&&(n=e.getTypeFromLength(this.getVectorLength(),this.getComponentType(e)));const a=r.build(e,n);i=this.components.length===s&&this.components===Xs.slice(0,this.components.length)?e.format(a,n,t):e.format(`${a}.${this.components}`,this.getNodeType(e),t)}else i=r.build(e,t);return i}serialize(e){super.serialize(e),e.components=this.components}deserialize(e){super.deserialize(e),this.components=e.components}}class Ys extends js{static get type(){return"SetNode"}constructor(e,t,r){super(),this.sourceNode=e,this.components=t,this.targetNode=r}getNodeType(e){return this.sourceNode.getNodeType(e)}generate(e){const{sourceNode:t,components:r,targetNode:s}=this,i=this.getNodeType(e),n=e.getComponentType(s.getNodeType(e)),a=e.getTypeFromLength(r.length,n),o=s.build(e,a),u=t.build(e,i),l=e.getTypeLength(i),d=[];for(let e=0;ee.replace(/r|s/g,"x").replace(/g|t/g,"y").replace(/b|p/g,"z").replace(/a|q/g,"w"),ai=e=>ni(e).split("").sort().join(""),oi={setup(e,t){const r=t.shift();return e(Li(r),...t)},get(e,t,r){if("string"==typeof t&&void 0===e[t]){if(!0!==e.isStackNode&&"assign"===t)return(...e)=>(ri.assign(r,...e),r);if(si.has(t)){const s=si.get(t);return e.isStackNode?(...e)=>r.add(s(...e)):(...e)=>s(r,...e)}if("self"===t)return e;if(t.endsWith("Assign")&&si.has(t.slice(0,t.length-6))){const s=si.get(t.slice(0,t.length-6));return e.isStackNode?(...e)=>r.assign(e[0],s(...e)):(...e)=>r.assign(s(r,...e))}if(!0===/^[xyzwrgbastpq]{1,4}$/.test(t))return t=ni(t),Pi(new Ks(r,t));if(!0===/^set[XYZWRGBASTPQ]{1,4}$/.test(t))return t=ai(t.slice(3).toLowerCase()),r=>Pi(new Ys(e,t,r));if(!0===/^flip[XYZWRGBASTPQ]{1,4}$/.test(t))return t=ai(t.slice(4).toLowerCase()),()=>Pi(new Qs(Pi(e),t));if("width"===t||"height"===t||"depth"===t)return"width"===t?t="x":"height"===t?t="y":"depth"===t&&(t="z"),Pi(new Ks(e,t));if(!0===/^\d+$/.test(t))return Pi(new Hs(r,new ei(Number(t),"uint")));if(!0===/^get$/.test(t))return e=>Pi(new ti(r,e))}return Reflect.get(e,t,r)},set:(e,t,r,s)=>"string"!=typeof t||void 0!==e[t]||!0!==/^[xyzwrgbastpq]{1,4}$/.test(t)&&"width"!==t&&"height"!==t&&"depth"!==t&&!0!==/^\d+$/.test(t)?Reflect.set(e,t,r,s):(s[t].assign(r),!0)},ui=new WeakMap,li=new WeakMap,di=function(e,t=null){for(const r in e)e[r]=Pi(e[r],t);return e},ci=function(e,t=null){const r=e.length;for(let s=0;sPi(null!==s?Object.assign(e,s):e);let n,a,o,u=t;function l(t){let r;return r=u?/[a-z]/i.test(u)?u+"()":u:e.type,void 0!==a&&t.lengtho?(console.error(`THREE.TSL: "${r}" parameter length exceeds limit.`),t.slice(0,o)):t}return null===t?n=(...t)=>i(new e(...Fi(l(t)))):null!==r?(r=Pi(r),n=(...s)=>i(new e(t,...Fi(l(s)),r))):n=(...r)=>i(new e(t,...Fi(l(r)))),n.setParameterLength=(...e)=>(1===e.length?a=o=e[0]:2===e.length&&([a,o]=e),n),n.setName=e=>(u=e,n),n},pi=function(e,...t){return Pi(new e(...Fi(t)))};class gi extends $s{constructor(e,t){super(),this.shaderNode=e,this.inputNodes=t}getNodeType(e){return this.shaderNode.nodeType||this.getOutputNode(e).getNodeType(e)}getMemberType(e,t){return this.getOutputNode(e).getMemberType(e,t)}call(e){const{shaderNode:t,inputNodes:r}=this,s=e.getNodeProperties(t);if(s.onceOutput)return s.onceOutput;let i=null;if(t.layout){let s=li.get(e.constructor);void 0===s&&(s=new WeakMap,li.set(e.constructor,s));let n=s.get(t);void 0===n&&(n=Pi(e.buildFunctionNode(t)),s.set(t,n)),e.addInclude(n),i=Pi(n.call(r))}else{const s=t.jsFunc,n=null!==r||s.length>1?s(r||[],e):s(e);i=Pi(n)}return t.once&&(s.onceOutput=i),i}getOutputNode(e){const t=e.getNodeProperties(this);return null===t.outputNode&&(t.outputNode=this.setupOutput(e)),t.outputNode}setup(e){return this.getOutputNode(e)}setupOutput(e){return e.addStack(),e.stack.outputNode=this.call(e),e.removeStack()}generate(e,t){return this.getOutputNode(e).build(e,t)}}class mi extends $s{constructor(e,t){super(t),this.jsFunc=e,this.layout=null,this.global=!0,this.once=!1}setLayout(e){return this.layout=e,this}call(e=null){return Li(e),Pi(new gi(this,e))}setup(){return this.call()}}const fi=[!1,!0],yi=[0,1,2,3],xi=[-1,-2],bi=[.5,1.5,1/3,1e-6,1e6,Math.PI,2*Math.PI,1/Math.PI,2/Math.PI,1/(2*Math.PI),Math.PI/2],Ti=new Map;for(const e of fi)Ti.set(e,new ei(e));const _i=new Map;for(const e of yi)_i.set(e,new ei(e,"uint"));const vi=new Map([..._i].map((e=>new ei(e.value,"int"))));for(const e of xi)vi.set(e,new ei(e,"int"));const Ni=new Map([...vi].map((e=>new ei(e.value))));for(const e of bi)Ni.set(e,new ei(e));for(const e of bi)Ni.set(-e,new ei(-e));const Si={bool:Ti,uint:_i,ints:vi,float:Ni},Ei=new Map([...Ti,...Ni]),wi=(e,t)=>Ei.has(e)?Ei.get(e):!0===e.isNode?e:new ei(e,t),Ai=function(e,t=null){return(...r)=>{if((0===r.length||!["bool","float","int","uint"].includes(e)&&r.every((e=>"object"!=typeof e)))&&(r=[Cs(e,...r)]),1===r.length&&null!==t&&t.has(r[0]))return Pi(t.get(r[0]));if(1===r.length){const t=wi(r[0],e);return(e=>{try{return e.getNodeType()}catch(e){return}})(t)===e?Pi(t):Pi(new Ws(t,e))}const s=r.map((e=>wi(e)));return Pi(new qs(s,e))}},Ri=e=>"object"==typeof e&&null!==e?e.value:e,Ci=e=>null!=e?e.nodeType||e.convertTo||("string"==typeof e?e:null):null;function Mi(e,t){return new Proxy(new mi(e,t),oi)}const Pi=(e,t=null)=>function(e,t=null){const r=Rs(e);if("node"===r){let t=ui.get(e);return void 0===t&&(t=new Proxy(e,oi),ui.set(e,t),ui.set(t,t)),t}return null===t&&("float"===r||"boolean"===r)||r&&"shader"!==r&&"string"!==r?Pi(wi(e,t)):"shader"===r?Vi(e):e}(e,t),Li=(e,t=null)=>new di(e,t),Fi=(e,t=null)=>new ci(e,t),Bi=(...e)=>new hi(...e),Ii=(...e)=>new pi(...e);let Di=0;const Vi=(e,t=null)=>{let r=null;null!==t&&("object"==typeof t?r=t.return:("string"==typeof t?r=t:console.error("THREE.TSL: Invalid layout type."),t=null));const s=new Mi(e,r),i=(...e)=>{let t;return Li(e),t=e[0]&&e[0].isNode?[...e]:e[0],s.call(t)};if(i.shaderNode=s,i.setLayout=e=>(s.setLayout(e),i),i.once=()=>(s.once=!0,i),null!==t){if("object"!=typeof t.inputs){const e={name:"fn"+Di++,type:r,inputs:[]};for(const r in t)"return"!==r&&e.inputs.push({name:r,type:t[r]});t=e}i.setLayout(t)}return i};ii("toGlobal",(e=>(e.global=!0,e)));const Ui=e=>{ri=e},Oi=()=>ri,Gi=(...e)=>ri.If(...e);function ki(e){return ri&&ri.add(e),e}ii("append",ki);const zi=new Ai("color"),$i=new Ai("float",Si.float),Hi=new Ai("int",Si.ints),Wi=new Ai("uint",Si.uint),ji=new Ai("bool",Si.bool),qi=new Ai("vec2"),Xi=new Ai("ivec2"),Ki=new Ai("uvec2"),Yi=new Ai("bvec2"),Qi=new Ai("vec3"),Zi=new Ai("ivec3"),Ji=new Ai("uvec3"),en=new Ai("bvec3"),tn=new Ai("vec4"),rn=new Ai("ivec4"),sn=new Ai("uvec4"),nn=new Ai("bvec4"),an=new Ai("mat2"),on=new Ai("mat3"),un=new Ai("mat4");ii("toColor",zi),ii("toFloat",$i),ii("toInt",Hi),ii("toUint",Wi),ii("toBool",ji),ii("toVec2",qi),ii("toIVec2",Xi),ii("toUVec2",Ki),ii("toBVec2",Yi),ii("toVec3",Qi),ii("toIVec3",Zi),ii("toUVec3",Ji),ii("toBVec3",en),ii("toVec4",tn),ii("toIVec4",rn),ii("toUVec4",sn),ii("toBVec4",nn),ii("toMat2",an),ii("toMat3",on),ii("toMat4",un);const ln=Bi(Hs).setParameterLength(2),dn=(e,t)=>Pi(new Ws(Pi(e),t));ii("element",ln),ii("convert",dn);class cn extends js{static get type(){return"ArrayNode"}constructor(e,t,r=null){super(e),this.count=t,this.values=r,this.isArrayNode=!0}getNodeType(e){return null===this.nodeType&&(this.nodeType=this.values[0].getNodeType(e)),this.nodeType}getElementType(e){return this.getNodeType(e)}generate(e){const t=this.getNodeType(e);return e.generateArray(t,this.count,this.values)}}const hn=(...e)=>{let t;if(1===e.length){const r=e[0];t=new cn(null,r.length,r)}else{const r=e[0],s=e[1];t=new cn(r,s)}return Pi(t)};ii("toArray",((e,t)=>hn(Array(t).fill(e))));class pn extends $s{static get type(){return"UniformGroupNode"}constructor(e,t=!1,r=1){super("string"),this.name=e,this.shared=t,this.order=r,this.isUniformGroup=!0}serialize(e){super.serialize(e),e.name=this.name,e.version=this.version,e.shared=this.shared}deserialize(e){super.deserialize(e),this.name=e.name,this.version=e.version,this.shared=e.shared}}const gn=e=>new pn(e),mn=(e,t=0)=>new pn(e,!0,t),fn=mn("frame"),yn=mn("render"),xn=gn("object");class bn extends Zs{static get type(){return"UniformNode"}constructor(e,t=null){super(e,t),this.isUniformNode=!0,this.name="",this.groupNode=xn}label(e){return this.name=e,this}setGroup(e){return this.groupNode=e,this}getGroup(){return this.groupNode}getUniformHash(e){return this.getHash(e)}onUpdate(e,t){const r=this.getSelf();return e=e.bind(r),super.onUpdate((t=>{const s=e(t,r);void 0!==s&&(this.value=s)}),t)}generate(e,t){const r=this.getNodeType(e),s=this.getUniformHash(e);let i=e.getNodeFromHash(s);void 0===i&&(e.setHashNode(this,s),i=this);const n=i.getInputType(e),a=e.getUniformFromNode(i,n,e.shaderStage,this.name||e.context.label),o=e.getPropertyName(a);return void 0!==e.context.label&&delete e.context.label,e.format(o,r,t)}}const Tn=(e,t)=>{const r=Ci(t||e),s=e&&!0===e.isNode?e.node&&e.node.value||e.value:e;return Pi(new bn(s,r))};class _n extends $s{static get type(){return"PropertyNode"}constructor(e,t=null,r=!1){super(e),this.name=t,this.varying=r,this.isPropertyNode=!0}getHash(e){return this.name||super.getHash(e)}isGlobal(){return!0}generate(e){let t;return!0===this.varying?(t=e.getVaryingFromNode(this,this.name),t.needsInterpolation=!0):t=e.getVarFromNode(this,this.name),e.getPropertyName(t)}}const vn=(e,t)=>Pi(new _n(e,t)),Nn=(e,t)=>Pi(new _n(e,t,!0)),Sn=Ii(_n,"vec4","DiffuseColor"),En=Ii(_n,"vec3","EmissiveColor"),wn=Ii(_n,"float","Roughness"),An=Ii(_n,"float","Metalness"),Rn=Ii(_n,"float","Clearcoat"),Cn=Ii(_n,"float","ClearcoatRoughness"),Mn=Ii(_n,"vec3","Sheen"),Pn=Ii(_n,"float","SheenRoughness"),Ln=Ii(_n,"float","Iridescence"),Fn=Ii(_n,"float","IridescenceIOR"),Bn=Ii(_n,"float","IridescenceThickness"),In=Ii(_n,"float","AlphaT"),Dn=Ii(_n,"float","Anisotropy"),Vn=Ii(_n,"vec3","AnisotropyT"),Un=Ii(_n,"vec3","AnisotropyB"),On=Ii(_n,"color","SpecularColor"),Gn=Ii(_n,"float","SpecularF90"),kn=Ii(_n,"float","Shininess"),zn=Ii(_n,"vec4","Output"),$n=Ii(_n,"float","dashSize"),Hn=Ii(_n,"float","gapSize"),Wn=Ii(_n,"float","pointWidth"),jn=Ii(_n,"float","IOR"),qn=Ii(_n,"float","Transmission"),Xn=Ii(_n,"float","Thickness"),Kn=Ii(_n,"float","AttenuationDistance"),Yn=Ii(_n,"color","AttenuationColor"),Qn=Ii(_n,"float","Dispersion");class Zn extends js{static get type(){return"AssignNode"}constructor(e,t){super(),this.targetNode=e,this.sourceNode=t}hasDependencies(){return!1}getNodeType(e,t){return"void"!==t?this.targetNode.getNodeType(e):"void"}needsSplitAssign(e){const{targetNode:t}=this;if(!1===e.isAvailable("swizzleAssign")&&t.isSplitNode&&t.components.length>1){const r=e.getTypeLength(t.node.getNodeType(e));return ks.join("").slice(0,r)!==t.components}return!1}generate(e,t){const{targetNode:r,sourceNode:s}=this,i=this.needsSplitAssign(e),n=r.getNodeType(e),a=r.context({assign:!0}).build(e),o=s.build(e,n),u=s.getNodeType(e),l=e.getDataFromNode(this);let d;if(!0===l.initialized)"void"!==t&&(d=a);else if(i){const s=e.getVarFromNode(this,null,n),i=e.getPropertyName(s);e.addLineFlowCode(`${i} = ${o}`,this);const u=r.node.context({assign:!0}).build(e);for(let t=0;t{const s=r.type;let i;return i="pointer"===s?"&"+t.build(e):t.build(e,s),i};if(Array.isArray(i)){if(i.length>s.length)console.error("THREE.TSL: The number of provided parameters exceeds the expected number of inputs in 'Fn()'."),i.length=s.length;else if(i.length(t=t.length>1||t[0]&&!0===t[0].isNode?Fi(t):Li(t[0]),Pi(new ea(Pi(e),t)));ii("call",ta);class ra extends js{static get type(){return"OperatorNode"}constructor(e,t,r,...s){if(super(),s.length>0){let i=new ra(e,t,r);for(let t=0;t>"===r||"<<"===r)return e.getIntegerType(n);if("!"===r||"=="===r||"!="===r||"&&"===r||"||"===r||"^^"===r)return"bool";if("<"===r||">"===r||"<="===r||">="===r){const r=t?e.getTypeLength(t):Math.max(e.getTypeLength(n),e.getTypeLength(a));return r>1?`bvec${r}`:"bool"}if(e.isMatrix(n)){if("float"===a)return n;if(e.isVector(a))return e.getVectorFromMatrix(n);if(e.isMatrix(a))return n}else if(e.isMatrix(a)){if("float"===n)return a;if(e.isVector(n))return e.getVectorFromMatrix(a)}return e.getTypeLength(a)>e.getTypeLength(n)?a:n}generate(e,t){const r=this.op,s=this.aNode,i=this.bNode,n=this.getNodeType(e,t);let a=null,o=null;"void"!==n?(a=s.getNodeType(e),o=void 0!==i?i.getNodeType(e):null,"<"===r||">"===r||"<="===r||">="===r||"=="===r||"!="===r?e.isVector(a)?o=a:a!==o&&(a=o="float"):">>"===r||"<<"===r?(a=n,o=e.changeComponentType(o,"uint")):"%"===r?(a=n,o=e.isInteger(a)&&e.isInteger(o)?o:a):e.isMatrix(a)?"float"===o?o="float":e.isVector(o)?o=e.getVectorFromMatrix(a):e.isMatrix(o)||(a=o=n):a=e.isMatrix(o)?"float"===a?"float":e.isVector(a)?e.getVectorFromMatrix(o):o=n:o=n):a=o=n;const u=s.build(e,a),d=void 0!==i?i.build(e,o):null,c=e.getTypeLength(t),h=e.getFunctionOperator(r);if("void"!==t){const s=e.renderer.coordinateSystem===l;if("=="===r)return s?c>1?e.format(`${e.getMethod("equal",t)}( ${u}, ${d} )`,n,t):e.format(`( ${u} ${r} ${d} )`,n,t):c>1||!e.isVector(a)?e.format(`( ${u} == ${d} )`,n,t):e.format(`all( ${u} == ${d} )`,n,t);if("<"===r&&c>1)return s?e.format(`${e.getMethod("lessThan",t)}( ${u}, ${d} )`,n,t):e.format(`( ${u} < ${d} )`,n,t);if("<="===r&&c>1)return s?e.format(`${e.getMethod("lessThanEqual",t)}( ${u}, ${d} )`,n,t):e.format(`( ${u} <= ${d} )`,n,t);if(">"===r&&c>1)return s?e.format(`${e.getMethod("greaterThan",t)}( ${u}, ${d} )`,n,t):e.format(`( ${u} > ${d} )`,n,t);if(">="===r&&c>1)return s?e.format(`${e.getMethod("greaterThanEqual",t)}( ${u}, ${d} )`,n,t):e.format(`( ${u} >= ${d} )`,n,t);if("%"===r)return e.isInteger(o)?e.format(`( ${u} % ${d} )`,n,t):e.format(`${e.getMethod("mod",n)}( ${u}, ${d} )`,n,t);if("!"===r||"~"===r)return e.format(`(${r}${u})`,a,t);if(h)return e.format(`${h}( ${u}, ${d} )`,n,t);if(e.isMatrix(a)&&"float"===o)return e.format(`( ${d} ${r} ${u} )`,n,t);if("float"===a&&e.isMatrix(o))return e.format(`${u} ${r} ${d}`,n,t);{let i=`( ${u} ${r} ${d} )`;return!s&&"bool"===n&&e.isVector(a)&&e.isVector(o)&&(i=`all${i}`),e.format(i,n,t)}}if("void"!==a)return h?e.format(`${h}( ${u}, ${d} )`,n,t):e.isMatrix(a)&&"float"===o?e.format(`${d} ${r} ${u}`,n,t):e.format(`${u} ${r} ${d}`,n,t)}serialize(e){super.serialize(e),e.op=this.op}deserialize(e){super.deserialize(e),this.op=e.op}}const sa=Bi(ra,"+").setParameterLength(2,1/0).setName("add"),ia=Bi(ra,"-").setParameterLength(2,1/0).setName("sub"),na=Bi(ra,"*").setParameterLength(2,1/0).setName("mul"),aa=Bi(ra,"/").setParameterLength(2,1/0).setName("div"),oa=Bi(ra,"%").setParameterLength(2).setName("mod"),ua=Bi(ra,"==").setParameterLength(2).setName("equal"),la=Bi(ra,"!=").setParameterLength(2).setName("notEqual"),da=Bi(ra,"<").setParameterLength(2).setName("lessThan"),ca=Bi(ra,">").setParameterLength(2).setName("greaterThan"),ha=Bi(ra,"<=").setParameterLength(2).setName("lessThanEqual"),pa=Bi(ra,">=").setParameterLength(2).setName("greaterThanEqual"),ga=Bi(ra,"&&").setParameterLength(2,1/0).setName("and"),ma=Bi(ra,"||").setParameterLength(2,1/0).setName("or"),fa=Bi(ra,"!").setParameterLength(1).setName("not"),ya=Bi(ra,"^^").setParameterLength(2).setName("xor"),xa=Bi(ra,"&").setParameterLength(2).setName("bitAnd"),ba=Bi(ra,"~").setParameterLength(2).setName("bitNot"),Ta=Bi(ra,"|").setParameterLength(2).setName("bitOr"),_a=Bi(ra,"^").setParameterLength(2).setName("bitXor"),va=Bi(ra,"<<").setParameterLength(2).setName("shiftLeft"),Na=Bi(ra,">>").setParameterLength(2).setName("shiftRight");ii("add",sa),ii("sub",ia),ii("mul",na),ii("div",aa),ii("mod",oa),ii("equal",ua),ii("notEqual",la),ii("lessThan",da),ii("greaterThan",ca),ii("lessThanEqual",ha),ii("greaterThanEqual",pa),ii("and",ga),ii("or",ma),ii("not",fa),ii("xor",ya),ii("bitAnd",xa),ii("bitNot",ba),ii("bitOr",Ta),ii("bitXor",_a),ii("shiftLeft",va),ii("shiftRight",Na);const Sa=(e,t)=>(console.warn('THREE.TSL: "remainder()" is deprecated. Use "mod( int( ... ) )" instead.'),oa(e,t)),Ea=(e,t)=>(console.warn('THREE.TSL: "modInt()" is deprecated. Use "mod( int( ... ) )" instead.'),oa(Hi(e),Hi(t)));ii("remainder",Sa),ii("modInt",Ea);class wa extends js{static get type(){return"MathNode"}constructor(e,t,r=null,s=null){if(super(),(e===wa.MAX||e===wa.MIN)&&arguments.length>3){let i=new wa(e,t,r);for(let t=2;tn&&i>a?t:n>a?r:a>i?s:t}getNodeType(e){const t=this.method;return t===wa.LENGTH||t===wa.DISTANCE||t===wa.DOT?"float":t===wa.CROSS?"vec3":t===wa.ALL||t===wa.ANY?"bool":t===wa.EQUALS?e.changeComponentType(this.aNode.getNodeType(e),"bool"):this.getInputType(e)}generate(e,t){let r=this.method;const s=this.getNodeType(e),i=this.getInputType(e),n=this.aNode,a=this.bNode,o=this.cNode,u=e.renderer.coordinateSystem;if(r===wa.TRANSFORM_DIRECTION){let r=n,s=a;e.isMatrix(r.getNodeType(e))?s=tn(Qi(s),0):r=tn(Qi(r),0);const i=na(r,s).xyz;return $a(i).build(e,t)}if(r===wa.NEGATE)return e.format("( - "+n.build(e,i)+" )",s,t);if(r===wa.ONE_MINUS)return ia(1,n).build(e,t);if(r===wa.RECIPROCAL)return aa(1,n).build(e,t);if(r===wa.DIFFERENCE)return Qa(ia(n,a)).build(e,t);{const c=[];return r===wa.CROSS?c.push(n.build(e,s),a.build(e,s)):u===l&&r===wa.STEP?c.push(n.build(e,1===e.getTypeLength(n.getNodeType(e))?"float":i),a.build(e,i)):u!==l||r!==wa.MIN&&r!==wa.MAX?r===wa.REFRACT?c.push(n.build(e,i),a.build(e,i),o.build(e,"float")):r===wa.MIX?c.push(n.build(e,i),a.build(e,i),o.build(e,1===e.getTypeLength(o.getNodeType(e))?"float":i)):(u===d&&r===wa.ATAN&&null!==a&&(r="atan2"),c.push(n.build(e,i)),null!==a&&c.push(a.build(e,i)),null!==o&&c.push(o.build(e,i))):c.push(n.build(e,i),a.build(e,1===e.getTypeLength(a.getNodeType(e))?"float":i)),e.format(`${e.getMethod(r,s)}( ${c.join(", ")} )`,s,t)}}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}wa.ALL="all",wa.ANY="any",wa.RADIANS="radians",wa.DEGREES="degrees",wa.EXP="exp",wa.EXP2="exp2",wa.LOG="log",wa.LOG2="log2",wa.SQRT="sqrt",wa.INVERSE_SQRT="inversesqrt",wa.FLOOR="floor",wa.CEIL="ceil",wa.NORMALIZE="normalize",wa.FRACT="fract",wa.SIN="sin",wa.COS="cos",wa.TAN="tan",wa.ASIN="asin",wa.ACOS="acos",wa.ATAN="atan",wa.ABS="abs",wa.SIGN="sign",wa.LENGTH="length",wa.NEGATE="negate",wa.ONE_MINUS="oneMinus",wa.DFDX="dFdx",wa.DFDY="dFdy",wa.ROUND="round",wa.RECIPROCAL="reciprocal",wa.TRUNC="trunc",wa.FWIDTH="fwidth",wa.TRANSPOSE="transpose",wa.BITCAST="bitcast",wa.EQUALS="equals",wa.MIN="min",wa.MAX="max",wa.STEP="step",wa.REFLECT="reflect",wa.DISTANCE="distance",wa.DIFFERENCE="difference",wa.DOT="dot",wa.CROSS="cross",wa.POW="pow",wa.TRANSFORM_DIRECTION="transformDirection",wa.MIX="mix",wa.CLAMP="clamp",wa.REFRACT="refract",wa.SMOOTHSTEP="smoothstep",wa.FACEFORWARD="faceforward";const Aa=$i(1e-6),Ra=$i(1e6),Ca=$i(Math.PI),Ma=$i(2*Math.PI),Pa=Bi(wa,wa.ALL).setParameterLength(1),La=Bi(wa,wa.ANY).setParameterLength(1),Fa=Bi(wa,wa.RADIANS).setParameterLength(1),Ba=Bi(wa,wa.DEGREES).setParameterLength(1),Ia=Bi(wa,wa.EXP).setParameterLength(1),Da=Bi(wa,wa.EXP2).setParameterLength(1),Va=Bi(wa,wa.LOG).setParameterLength(1),Ua=Bi(wa,wa.LOG2).setParameterLength(1),Oa=Bi(wa,wa.SQRT).setParameterLength(1),Ga=Bi(wa,wa.INVERSE_SQRT).setParameterLength(1),ka=Bi(wa,wa.FLOOR).setParameterLength(1),za=Bi(wa,wa.CEIL).setParameterLength(1),$a=Bi(wa,wa.NORMALIZE).setParameterLength(1),Ha=Bi(wa,wa.FRACT).setParameterLength(1),Wa=Bi(wa,wa.SIN).setParameterLength(1),ja=Bi(wa,wa.COS).setParameterLength(1),qa=Bi(wa,wa.TAN).setParameterLength(1),Xa=Bi(wa,wa.ASIN).setParameterLength(1),Ka=Bi(wa,wa.ACOS).setParameterLength(1),Ya=Bi(wa,wa.ATAN).setParameterLength(1,2),Qa=Bi(wa,wa.ABS).setParameterLength(1),Za=Bi(wa,wa.SIGN).setParameterLength(1),Ja=Bi(wa,wa.LENGTH).setParameterLength(1),eo=Bi(wa,wa.NEGATE).setParameterLength(1),to=Bi(wa,wa.ONE_MINUS).setParameterLength(1),ro=Bi(wa,wa.DFDX).setParameterLength(1),so=Bi(wa,wa.DFDY).setParameterLength(1),io=Bi(wa,wa.ROUND).setParameterLength(1),no=Bi(wa,wa.RECIPROCAL).setParameterLength(1),ao=Bi(wa,wa.TRUNC).setParameterLength(1),oo=Bi(wa,wa.FWIDTH).setParameterLength(1),uo=Bi(wa,wa.TRANSPOSE).setParameterLength(1),lo=Bi(wa,wa.BITCAST).setParameterLength(2),co=(e,t)=>(console.warn('THREE.TSL: "equals" is deprecated. Use "equal" inside a vector instead, like: "bvec*( equal( ... ) )"'),ua(e,t)),ho=Bi(wa,wa.MIN).setParameterLength(2,1/0),po=Bi(wa,wa.MAX).setParameterLength(2,1/0),go=Bi(wa,wa.STEP).setParameterLength(2),mo=Bi(wa,wa.REFLECT).setParameterLength(2),fo=Bi(wa,wa.DISTANCE).setParameterLength(2),yo=Bi(wa,wa.DIFFERENCE).setParameterLength(2),xo=Bi(wa,wa.DOT).setParameterLength(2),bo=Bi(wa,wa.CROSS).setParameterLength(2),To=Bi(wa,wa.POW).setParameterLength(2),_o=Bi(wa,wa.POW,2).setParameterLength(1),vo=Bi(wa,wa.POW,3).setParameterLength(1),No=Bi(wa,wa.POW,4).setParameterLength(1),So=Bi(wa,wa.TRANSFORM_DIRECTION).setParameterLength(2),Eo=e=>na(Za(e),To(Qa(e),1/3)),wo=e=>xo(e,e),Ao=Bi(wa,wa.MIX).setParameterLength(3),Ro=(e,t=0,r=1)=>Pi(new wa(wa.CLAMP,Pi(e),Pi(t),Pi(r))),Co=e=>Ro(e),Mo=Bi(wa,wa.REFRACT).setParameterLength(3),Po=Bi(wa,wa.SMOOTHSTEP).setParameterLength(3),Lo=Bi(wa,wa.FACEFORWARD).setParameterLength(3),Fo=Vi((([e])=>{const t=xo(e.xy,qi(12.9898,78.233)),r=oa(t,Ca);return Ha(Wa(r).mul(43758.5453))})),Bo=(e,t,r)=>Ao(t,r,e),Io=(e,t,r)=>Po(t,r,e),Do=(e,t)=>(console.warn('THREE.TSL: "atan2" is overloaded. Use "atan" instead.'),Ya(e,t)),Vo=Lo,Uo=Ga;ii("all",Pa),ii("any",La),ii("equals",co),ii("radians",Fa),ii("degrees",Ba),ii("exp",Ia),ii("exp2",Da),ii("log",Va),ii("log2",Ua),ii("sqrt",Oa),ii("inverseSqrt",Ga),ii("floor",ka),ii("ceil",za),ii("normalize",$a),ii("fract",Ha),ii("sin",Wa),ii("cos",ja),ii("tan",qa),ii("asin",Xa),ii("acos",Ka),ii("atan",Ya),ii("abs",Qa),ii("sign",Za),ii("length",Ja),ii("lengthSq",wo),ii("negate",eo),ii("oneMinus",to),ii("dFdx",ro),ii("dFdy",so),ii("round",io),ii("reciprocal",no),ii("trunc",ao),ii("fwidth",oo),ii("atan2",Do),ii("min",ho),ii("max",po),ii("step",go),ii("reflect",mo),ii("distance",fo),ii("dot",xo),ii("cross",bo),ii("pow",To),ii("pow2",_o),ii("pow3",vo),ii("pow4",No),ii("transformDirection",So),ii("mix",Bo),ii("clamp",Ro),ii("refract",Mo),ii("smoothstep",Io),ii("faceForward",Lo),ii("difference",yo),ii("saturate",Co),ii("cbrt",Eo),ii("transpose",uo),ii("rand",Fo);class Oo extends $s{static get type(){return"ConditionalNode"}constructor(e,t,r=null){super(),this.condNode=e,this.ifNode=t,this.elseNode=r}getNodeType(e){const{ifNode:t,elseNode:r}=e.getNodeProperties(this);if(void 0===t)return this.setup(e),this.getNodeType(e);const s=t.getNodeType(e);if(null!==r){const t=r.getNodeType(e);if(e.getTypeLength(t)>e.getTypeLength(s))return t}return s}setup(e){const t=this.condNode.cache(),r=this.ifNode.cache(),s=this.elseNode?this.elseNode.cache():null,i=e.context.nodeBlock;e.getDataFromNode(r).parentNodeBlock=i,null!==s&&(e.getDataFromNode(s).parentNodeBlock=i);const n=e.getNodeProperties(this);n.condNode=t,n.ifNode=r.context({nodeBlock:r}),n.elseNode=s?s.context({nodeBlock:s}):null}generate(e,t){const r=this.getNodeType(e),s=e.getDataFromNode(this);if(void 0!==s.nodeProperty)return s.nodeProperty;const{condNode:i,ifNode:n,elseNode:a}=e.getNodeProperties(this),o=e.currentFunctionNode,u="void"!==t,l=u?vn(r).build(e):"";s.nodeProperty=l;const d=i.build(e,"bool");e.addFlowCode(`\n${e.tab}if ( ${d} ) {\n\n`).addFlowTab();let c=n.build(e,r);if(c&&(u?c=l+" = "+c+";":(c="return "+c+";",null===o&&(console.warn("THREE.TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values."),c="// "+c))),e.removeFlowTab().addFlowCode(e.tab+"\t"+c+"\n\n"+e.tab+"}"),null!==a){e.addFlowCode(" else {\n\n").addFlowTab();let t=a.build(e,r);t&&(u?t=l+" = "+t+";":(t="return "+t+";",null===o&&(console.warn("THREE.TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values."),t="// "+t))),e.removeFlowTab().addFlowCode(e.tab+"\t"+t+"\n\n"+e.tab+"}\n\n")}else e.addFlowCode("\n\n");return e.format(l,r,t)}}const Go=Bi(Oo).setParameterLength(2,3);ii("select",Go);const ko=(...e)=>(console.warn("THREE.TSL: cond() has been renamed to select()."),Go(...e));ii("cond",ko);class zo extends $s{static get type(){return"ContextNode"}constructor(e,t={}){super(),this.isContextNode=!0,this.node=e,this.value=t}getScope(){return this.node.getScope()}getNodeType(e){return this.node.getNodeType(e)}analyze(e){this.node.build(e)}setup(e){const t=e.getContext();e.setContext({...e.context,...this.value});const r=this.node.build(e);return e.setContext(t),r}generate(e,t){const r=e.getContext();e.setContext({...e.context,...this.value});const s=this.node.build(e,t);return e.setContext(r),s}}const $o=Bi(zo).setParameterLength(1,2),Ho=(e,t)=>$o(e,{label:t});ii("context",$o),ii("label",Ho);class Wo extends $s{static get type(){return"VarNode"}constructor(e,t=null,r=!1){super(),this.node=e,this.name=t,this.global=!0,this.isVarNode=!0,this.readOnly=r}getMemberType(e,t){return this.node.getMemberType(e,t)}getElementType(e){return this.node.getElementType(e)}getNodeType(e){return this.node.getNodeType(e)}generate(e){const{node:t,name:r,readOnly:s}=this,{renderer:i}=e,n=!0===i.backend.isWebGPUBackend;let a=!1,o=!1;s&&(a=e.isDeterministic(t),o=n?s:a);const u=e.getVectorType(this.getNodeType(e)),l=t.build(e,u),d=e.getVarFromNode(this,r,u,void 0,o),c=e.getPropertyName(d);let h=c;if(o)if(n)h=a?`const ${c}`:`let ${c}`;else{const r=e.getArrayCount(t);h=`const ${e.getVar(d.type,c,r)}`}return e.addLineFlowCode(`${h} = ${l}`,this),c}}const jo=Bi(Wo),qo=(e,t=null)=>jo(e,t).append(),Xo=(e,t=null)=>jo(e,t,!0).append();ii("toVar",qo),ii("toConst",Xo);const Ko=e=>(console.warn('TSL: "temp( node )" is deprecated. Use "Var( node )" or "node.toVar()" instead.'),jo(e));ii("temp",Ko);class Yo extends $s{static get type(){return"VaryingNode"}constructor(e,t=null){super(),this.node=e,this.name=t,this.isVaryingNode=!0}isGlobal(){return!0}getHash(e){return this.name||super.getHash(e)}getNodeType(e){return this.node.getNodeType(e)}setupVarying(e){const t=e.getNodeProperties(this);let r=t.varying;if(void 0===r){const s=this.name,i=this.getNodeType(e);t.varying=r=e.getVaryingFromNode(this,s,i),t.node=this.node}return r.needsInterpolation||(r.needsInterpolation="fragment"===e.shaderStage),r}setup(e){this.setupVarying(e)}analyze(e){return this.setupVarying(e),this.node.analyze(e)}generate(e){const t=e.getNodeProperties(this),r=this.setupVarying(e),s="fragment"===e.shaderStage&&!0===t.reassignPosition&&e.context.needsPositionReassign;if(void 0===t.propertyName||s){const i=this.getNodeType(e),n=e.getPropertyName(r,Bs.VERTEX);e.flowNodeFromShaderStage(Bs.VERTEX,this.node,i,n),t.propertyName=n,s?t.reassignPosition=!1:void 0===t.reassignPosition&&e.context.isPositionNodeInput&&(t.reassignPosition=!0)}return e.getPropertyName(r)}}const Qo=Bi(Yo).setParameterLength(1,2),Zo=e=>Qo(e);ii("toVarying",Qo),ii("toVertexStage",Zo),ii("varying",((...e)=>(console.warn("THREE.TSL: .varying() has been renamed to .toVarying()."),Qo(...e)))),ii("vertexStage",((...e)=>(console.warn("THREE.TSL: .vertexStage() has been renamed to .toVertexStage()."),Qo(...e))));const Jo=Vi((([e])=>{const t=e.mul(.9478672986).add(.0521327014).pow(2.4),r=e.mul(.0773993808),s=e.lessThanEqual(.04045);return Ao(t,r,s)})).setLayout({name:"sRGBTransferEOTF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),eu=Vi((([e])=>{const t=e.pow(.41666).mul(1.055).sub(.055),r=e.mul(12.92),s=e.lessThanEqual(.0031308);return Ao(t,r,s)})).setLayout({name:"sRGBTransferOETF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),tu="WorkingColorSpace",ru="OutputColorSpace";class su extends js{static get type(){return"ColorSpaceNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this.source=t,this.target=r}resolveColorSpace(e,t){return t===tu?c.workingColorSpace:t===ru?e.context.outputColorSpace||e.renderer.outputColorSpace:t}setup(e){const{colorNode:t}=this,r=this.resolveColorSpace(e,this.source),s=this.resolveColorSpace(e,this.target);let i=t;return!1!==c.enabled&&r!==s&&r&&s?(c.getTransfer(r)===h&&(i=tn(Jo(i.rgb),i.a)),c.getPrimaries(r)!==c.getPrimaries(s)&&(i=tn(on(c._getMatrix(new n,r,s)).mul(i.rgb),i.a)),c.getTransfer(s)===h&&(i=tn(eu(i.rgb),i.a)),i):i}}const iu=e=>Pi(new su(Pi(e),tu,ru)),nu=e=>Pi(new su(Pi(e),ru,tu)),au=(e,t)=>Pi(new su(Pi(e),tu,t)),ou=(e,t)=>Pi(new su(Pi(e),t,tu));ii("toOutputColorSpace",iu),ii("toWorkingColorSpace",nu),ii("workingToColorSpace",au),ii("colorSpaceToWorking",ou);let uu=class extends Hs{static get type(){return"ReferenceElementNode"}constructor(e,t){super(e,t),this.referenceNode=e,this.isReferenceElementNode=!0}getNodeType(){return this.referenceNode.uniformType}generate(e){const t=super.generate(e),r=this.referenceNode.getNodeType(),s=this.getNodeType();return e.format(t,r,s)}};class lu extends $s{static get type(){return"ReferenceBaseNode"}constructor(e,t,r=null,s=null){super(),this.property=e,this.uniformType=t,this.object=r,this.count=s,this.properties=e.split("."),this.reference=r,this.node=null,this.group=null,this.updateType=Is.OBJECT}setGroup(e){return this.group=e,this}element(e){return Pi(new uu(this,Pi(e)))}setNodeType(e){const t=Tn(null,e).getSelf();null!==this.group&&t.setGroup(this.group),this.node=t}getNodeType(e){return null===this.node&&(this.updateReference(e),this.updateValue()),this.node.getNodeType(e)}getValueFromReference(e=this.reference){const{properties:t}=this;let r=e[t[0]];for(let e=1;ePi(new du(e,t,r));class hu extends js{static get type(){return"ToneMappingNode"}constructor(e,t=gu,r=null){super("vec3"),this.toneMapping=e,this.exposureNode=t,this.colorNode=r}customCacheKey(){return Ts(this.toneMapping)}setup(e){const t=this.colorNode||e.context.color,r=this.toneMapping;if(r===p)return t;let s=null;const i=e.renderer.library.getToneMappingFunction(r);return null!==i?s=tn(i(t.rgb,this.exposureNode),t.a):(console.error("ToneMappingNode: Unsupported Tone Mapping configuration.",r),s=t),s}}const pu=(e,t,r)=>Pi(new hu(e,Pi(t),Pi(r))),gu=cu("toneMappingExposure","float");ii("toneMapping",((e,t,r)=>pu(t,r,e)));class mu extends Zs{static get type(){return"BufferAttributeNode"}constructor(e,t=null,r=0,s=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferStride=r,this.bufferOffset=s,this.usage=g,this.instanced=!1,this.attribute=null,this.global=!0,e&&!0===e.isBufferAttribute&&(this.attribute=e,this.usage=e.usage,this.instanced=e.isInstancedBufferAttribute)}getHash(e){if(0===this.bufferStride&&0===this.bufferOffset){let t=e.globalCache.getData(this.value);return void 0===t&&(t={node:this},e.globalCache.setData(this.value,t)),t.node.uuid}return this.uuid}getNodeType(e){return null===this.bufferType&&(this.bufferType=e.getTypeFromAttribute(this.attribute)),this.bufferType}setup(e){if(null!==this.attribute)return;const t=this.getNodeType(e),r=this.value,s=e.getTypeLength(t),i=this.bufferStride||s,n=this.bufferOffset,a=!0===r.isInterleavedBuffer?r:new m(r,i),o=new f(a,s,n);a.setUsage(this.usage),this.attribute=o,this.attribute.isInstancedBufferAttribute=this.instanced}generate(e){const t=this.getNodeType(e),r=e.getBufferAttributeFromNode(this,t),s=e.getPropertyName(r);let i=null;if("vertex"===e.shaderStage||"compute"===e.shaderStage)this.name=s,i=s;else{i=Qo(this).build(e,t)}return i}getInputType(){return"bufferAttribute"}setUsage(e){return this.usage=e,this.attribute&&!0===this.attribute.isBufferAttribute&&(this.attribute.usage=e),this}setInstanced(e){return this.instanced=e,this}}const fu=(e,t=null,r=0,s=0)=>Pi(new mu(e,t,r,s)),yu=(e,t=null,r=0,s=0)=>fu(e,t,r,s).setUsage(y),xu=(e,t=null,r=0,s=0)=>fu(e,t,r,s).setInstanced(!0),bu=(e,t=null,r=0,s=0)=>yu(e,t,r,s).setInstanced(!0);ii("toAttribute",(e=>fu(e.value)));class Tu extends $s{static get type(){return"ComputeNode"}constructor(e,t,r=[64]){super("void"),this.isComputeNode=!0,this.computeNode=e,this.count=t,this.workgroupSize=r,this.dispatchCount=0,this.version=1,this.name="",this.updateBeforeType=Is.OBJECT,this.onInitFunction=null,this.updateDispatchCount()}dispose(){this.dispatchEvent({type:"dispose"})}label(e){return this.name=e,this}updateDispatchCount(){const{count:e,workgroupSize:t}=this;let r=t[0];for(let e=1;ePi(new Tu(Pi(e),t,r));ii("compute",_u);class vu extends $s{static get type(){return"CacheNode"}constructor(e,t=!0){super(),this.node=e,this.parent=t,this.isCacheNode=!0}getNodeType(e){const t=e.getCache(),r=e.getCacheFromNode(this,this.parent);e.setCache(r);const s=this.node.getNodeType(e);return e.setCache(t),s}build(e,...t){const r=e.getCache(),s=e.getCacheFromNode(this,this.parent);e.setCache(s);const i=this.node.build(e,...t);return e.setCache(r),i}}const Nu=(e,t)=>Pi(new vu(Pi(e),t));ii("cache",Nu);class Su extends $s{static get type(){return"BypassNode"}constructor(e,t){super(),this.isBypassNode=!0,this.outputNode=e,this.callNode=t}getNodeType(e){return this.outputNode.getNodeType(e)}generate(e){const t=this.callNode.build(e,"void");return""!==t&&e.addLineFlowCode(t,this),this.outputNode.build(e)}}const Eu=Bi(Su).setParameterLength(2);ii("bypass",Eu);class wu extends $s{static get type(){return"RemapNode"}constructor(e,t,r,s=$i(0),i=$i(1)){super(),this.node=e,this.inLowNode=t,this.inHighNode=r,this.outLowNode=s,this.outHighNode=i,this.doClamp=!0}setup(){const{node:e,inLowNode:t,inHighNode:r,outLowNode:s,outHighNode:i,doClamp:n}=this;let a=e.sub(t).div(r.sub(t));return!0===n&&(a=a.clamp()),a.mul(i.sub(s)).add(s)}}const Au=Bi(wu,null,null,{doClamp:!1}).setParameterLength(3,5),Ru=Bi(wu).setParameterLength(3,5);ii("remap",Au),ii("remapClamp",Ru);class Cu extends $s{static get type(){return"ExpressionNode"}constructor(e="",t="void"){super(t),this.snippet=e}generate(e,t){const r=this.getNodeType(e),s=this.snippet;if("void"!==r)return e.format(s,r,t);e.addLineFlowCode(s,this)}}const Mu=Bi(Cu).setParameterLength(1,2),Pu=e=>(e?Go(e,Mu("discard")):Mu("discard")).append();ii("discard",Pu);class Lu extends js{static get type(){return"RenderOutputNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this.toneMapping=t,this.outputColorSpace=r,this.isRenderOutputNode=!0}setup({context:e}){let t=this.colorNode||e.color;const r=(null!==this.toneMapping?this.toneMapping:e.toneMapping)||p,s=(null!==this.outputColorSpace?this.outputColorSpace:e.outputColorSpace)||x;return r!==p&&(t=t.toneMapping(r)),s!==x&&s!==c.workingColorSpace&&(t=t.workingToColorSpace(s)),t}}const Fu=(e,t=null,r=null)=>Pi(new Lu(Pi(e),t,r));ii("renderOutput",Fu);class Bu extends js{static get type(){return"DebugNode"}constructor(e,t=null){super(),this.node=e,this.callback=t}getNodeType(e){return this.node.getNodeType(e)}setup(e){return this.node.build(e)}analyze(e){return this.node.build(e)}generate(e){const t=this.callback,r=this.node.build(e);let s="";return s+="// #--- TSL Debug ---#\n",s+=e.flow.code.replace(/^\t/gm,"")+"\n",s+="/* ... */ "+r+" /* ... */\n",s+="// #-----------------#\n",null!==t?t(s):console.log(s),r}}const Iu=(e,t=null)=>Pi(new Bu(Pi(e),t));ii("debug",Iu);class Du extends $s{static get type(){return"AttributeNode"}constructor(e,t=null){super(t),this.global=!0,this._attributeName=e}getHash(e){return this.getAttributeName(e)}getNodeType(e){let t=this.nodeType;if(null===t){const r=this.getAttributeName(e);if(e.hasGeometryAttribute(r)){const s=e.geometry.getAttribute(r);t=e.getTypeFromAttribute(s)}else t="float"}return t}setAttributeName(e){return this._attributeName=e,this}getAttributeName(){return this._attributeName}generate(e){const t=this.getAttributeName(e),r=this.getNodeType(e);if(!0===e.hasGeometryAttribute(t)){const s=e.geometry.getAttribute(t),i=e.getTypeFromAttribute(s),n=e.getAttribute(t,i);if("vertex"===e.shaderStage)return e.format(n.name,i,r);return Qo(this).build(e,r)}return console.warn(`AttributeNode: Vertex attribute "${t}" not found on geometry.`),e.generateConst(r)}serialize(e){super.serialize(e),e.global=this.global,e._attributeName=this._attributeName}deserialize(e){super.deserialize(e),this.global=e.global,this._attributeName=e._attributeName}}const Vu=(e,t)=>Pi(new Du(e,t)),Uu=(e=0)=>Vu("uv"+(e>0?e:""),"vec2");class Ou extends $s{static get type(){return"TextureSizeNode"}constructor(e,t=null){super("uvec2"),this.isTextureSizeNode=!0,this.textureNode=e,this.levelNode=t}generate(e,t){const r=this.textureNode.build(e,"property"),s=null===this.levelNode?"0":this.levelNode.build(e,"int");return e.format(`${e.getMethod("textureDimensions")}( ${r}, ${s} )`,this.getNodeType(e),t)}}const Gu=Bi(Ou).setParameterLength(1,2);class ku extends bn{static get type(){return"MaxMipLevelNode"}constructor(e){super(0),this._textureNode=e,this.updateType=Is.FRAME}get textureNode(){return this._textureNode}get texture(){return this._textureNode.value}update(){const e=this.texture,t=e.images,r=t&&t.length>0?t[0]&&t[0].image||t[0]:e.image;if(r&&void 0!==r.width){const{width:e,height:t}=r;this.value=Math.log2(Math.max(e,t))}}}const zu=Bi(ku).setParameterLength(1);class $u extends bn{static get type(){return"TextureNode"}constructor(e,t=null,r=null,s=null){super(e),this.isTextureNode=!0,this.uvNode=t,this.levelNode=r,this.biasNode=s,this.compareNode=null,this.depthNode=null,this.gradNode=null,this.sampler=!0,this.updateMatrix=!1,this.updateType=Is.NONE,this.referenceNode=null,this._value=e,this._matrixUniform=null,this.setUpdateMatrix(null===t)}set value(e){this.referenceNode?this.referenceNode.value=e:this._value=e}get value(){return this.referenceNode?this.referenceNode.value:this._value}getUniformHash(){return this.value.uuid}getNodeType(){return!0===this.value.isDepthTexture?"float":this.value.type===b?"uvec4":this.value.type===T?"ivec4":"vec4"}getInputType(){return"texture"}getDefaultUV(){return Uu(this.value.channel)}updateReference(){return this.value}getTransformedUV(e){return null===this._matrixUniform&&(this._matrixUniform=Tn(this.value.matrix)),this._matrixUniform.mul(Qi(e,1)).xy}setUpdateMatrix(e){return this.updateMatrix=e,this.updateType=e?Is.RENDER:Is.NONE,this}setupUV(e,t){const r=this.value;return e.isFlipY()&&(r.image instanceof ImageBitmap&&!0===r.flipY||!0===r.isRenderTargetTexture||!0===r.isFramebufferTexture||!0===r.isDepthTexture)&&(t=this.sampler?t.flipY():t.setY(Hi(Gu(this,this.levelNode).y).sub(t.y).sub(1))),t}setup(e){const t=e.getNodeProperties(this);t.referenceNode=this.referenceNode;const r=this.value;if(!r||!0!==r.isTexture)throw new Error("THREE.TSL: `texture( value )` function expects a valid instance of THREE.Texture().");let s=this.uvNode;null!==s&&!0!==e.context.forceUVContext||!e.context.getUV||(s=e.context.getUV(this)),s||(s=this.getDefaultUV()),!0===this.updateMatrix&&(s=this.getTransformedUV(s)),s=this.setupUV(e,s);let i=this.levelNode;null===i&&e.context.getTextureLevel&&(i=e.context.getTextureLevel(this)),t.uvNode=s,t.levelNode=i,t.biasNode=this.biasNode,t.compareNode=this.compareNode,t.gradNode=this.gradNode,t.depthNode=this.depthNode}generateUV(e,t){return t.build(e,!0===this.sampler?"vec2":"ivec2")}generateSnippet(e,t,r,s,i,n,a,o){const u=this.value;let l;return l=s?e.generateTextureLevel(u,t,r,s,n):i?e.generateTextureBias(u,t,r,i,n):o?e.generateTextureGrad(u,t,r,o,n):a?e.generateTextureCompare(u,t,r,a,n):!1===this.sampler?e.generateTextureLoad(u,t,r,n):e.generateTexture(u,t,r,n),l}generate(e,t){const r=this.value,s=e.getNodeProperties(this),i=super.generate(e,"property");if(/^sampler/.test(t))return i+"_sampler";if(e.isReference(t))return i;{const n=e.getDataFromNode(this);let a=n.propertyName;if(void 0===a){const{uvNode:t,levelNode:r,biasNode:o,compareNode:u,depthNode:l,gradNode:d}=s,c=this.generateUV(e,t),h=r?r.build(e,"float"):null,p=o?o.build(e,"float"):null,g=l?l.build(e,"int"):null,m=u?u.build(e,"float"):null,f=d?[d[0].build(e,"vec2"),d[1].build(e,"vec2")]:null,y=e.getVarFromNode(this);a=e.getPropertyName(y);const x=this.generateSnippet(e,i,c,h,p,g,m,f);e.addLineFlowCode(`${a} = ${x}`,this),n.snippet=x,n.propertyName=a}let o=a;const u=this.getNodeType(e);return e.needsToWorkingColorSpace(r)&&(o=ou(Mu(o,u),r.colorSpace).setup(e).build(e,u)),e.format(o,u,t)}}setSampler(e){return this.sampler=e,this}getSampler(){return this.sampler}uv(e){return console.warn("THREE.TextureNode: .uv() has been renamed. Use .sample() instead."),this.sample(e)}sample(e){const t=this.clone();return t.uvNode=Pi(e),t.referenceNode=this.getSelf(),Pi(t)}blur(e){const t=this.clone();t.biasNode=Pi(e).mul(zu(t)),t.referenceNode=this.getSelf();const r=t.value;return(r&&!1===r.generateMipmaps||r.minFilter===_||r.magFilter===_)&&(console.warn("THREE.TSL: texture().blur() requires mipmaps and sampling. Use .generateMipmaps=true and .minFilter/.magFilter=THREE.LinearFilter in the Texture."),t.biasNode=null),Pi(t)}level(e){const t=this.clone();return t.levelNode=Pi(e),t.referenceNode=this.getSelf(),Pi(t)}size(e){return Gu(this,e)}bias(e){const t=this.clone();return t.biasNode=Pi(e),t.referenceNode=this.getSelf(),Pi(t)}compare(e){const t=this.clone();return t.compareNode=Pi(e),t.referenceNode=this.getSelf(),Pi(t)}grad(e,t){const r=this.clone();return r.gradNode=[Pi(e),Pi(t)],r.referenceNode=this.getSelf(),Pi(r)}depth(e){const t=this.clone();return t.depthNode=Pi(e),t.referenceNode=this.getSelf(),Pi(t)}serialize(e){super.serialize(e),e.value=this.value.toJSON(e.meta).uuid,e.sampler=this.sampler,e.updateMatrix=this.updateMatrix,e.updateType=this.updateType}deserialize(e){super.deserialize(e),this.value=e.meta.textures[e.value],this.sampler=e.sampler,this.updateMatrix=e.updateMatrix,this.updateType=e.updateType}update(){const e=this.value,t=this._matrixUniform;null!==t&&(t.value=e.matrix),!0===e.matrixAutoUpdate&&e.updateMatrix()}clone(){const e=new this.constructor(this.value,this.uvNode,this.levelNode,this.biasNode);return e.sampler=this.sampler,e}}const Hu=Bi($u).setParameterLength(1,4),Wu=(...e)=>Hu(...e).setSampler(!1);class ju extends bn{static get type(){return"BufferNode"}constructor(e,t,r=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferCount=r}getElementType(e){return this.getNodeType(e)}getInputType(){return"buffer"}}const qu=(e,t,r)=>Pi(new ju(e,t,r));class Xu extends Hs{static get type(){return"UniformArrayElementNode"}constructor(e,t){super(e,t),this.isArrayBufferElementNode=!0}generate(e){const t=super.generate(e),r=this.getNodeType(),s=this.node.getPaddedType();return e.format(t,s,r)}}class Ku extends ju{static get type(){return"UniformArrayNode"}constructor(e,t=null){super(null),this.array=e,this.elementType=null===t?Rs(e[0]):t,this.paddedType=this.getPaddedType(),this.updateType=Is.RENDER,this.isArrayBufferNode=!0}getNodeType(){return this.paddedType}getElementType(){return this.elementType}getPaddedType(){const e=this.elementType;let t="vec4";return"mat2"===e?t="mat2":!0===/mat/.test(e)?t="mat4":"i"===e.charAt(0)?t="ivec4":"u"===e.charAt(0)&&(t="uvec4"),t}update(){const{array:e,value:t}=this,r=this.elementType;if("float"===r||"int"===r||"uint"===r)for(let r=0;rPi(new Ku(e,t)),Qu=Tn(0,"uint").setGroup(mn("cameraIndex")).toVarying("v_cameraIndex"),Zu=Tn("float").label("cameraNear").setGroup(yn).onRenderUpdate((({camera:e})=>e.near)),Ju=Tn("float").label("cameraFar").setGroup(yn).onRenderUpdate((({camera:e})=>e.far)),el=Vi((({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrix);t=Yu(r).setGroup(yn).label("cameraProjectionMatrices").element(Qu).toVar("cameraProjectionMatrix")}else t=Tn("mat4").label("cameraProjectionMatrix").setGroup(yn).onRenderUpdate((({camera:e})=>e.projectionMatrix));return t})).once()(),tl=Tn("mat4").label("cameraProjectionMatrixInverse").setGroup(yn).onRenderUpdate((({camera:e})=>e.projectionMatrixInverse)),rl=Vi((({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.matrixWorldInverse);t=Yu(r).setGroup(yn).label("cameraViewMatrices").element(Qu).toVar("cameraViewMatrix")}else t=Tn("mat4").label("cameraViewMatrix").setGroup(yn).onRenderUpdate((({camera:e})=>e.matrixWorldInverse));return t})).once()(),sl=Tn("mat4").label("cameraWorldMatrix").setGroup(yn).onRenderUpdate((({camera:e})=>e.matrixWorld)),il=Tn("mat3").label("cameraNormalMatrix").setGroup(yn).onRenderUpdate((({camera:e})=>e.normalMatrix)),nl=Tn(new r).label("cameraPosition").setGroup(yn).onRenderUpdate((({camera:e},t)=>t.value.setFromMatrixPosition(e.matrixWorld))),al=new v;class ol extends $s{static get type(){return"Object3DNode"}constructor(e,t=null){super(),this.scope=e,this.object3d=t,this.updateType=Is.OBJECT,this._uniformNode=new bn(null)}getNodeType(){const e=this.scope;return e===ol.WORLD_MATRIX?"mat4":e===ol.POSITION||e===ol.VIEW_POSITION||e===ol.DIRECTION||e===ol.SCALE?"vec3":e===ol.RADIUS?"float":void 0}update(e){const t=this.object3d,s=this._uniformNode,i=this.scope;if(i===ol.WORLD_MATRIX)s.value=t.matrixWorld;else if(i===ol.POSITION)s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld);else if(i===ol.SCALE)s.value=s.value||new r,s.value.setFromMatrixScale(t.matrixWorld);else if(i===ol.DIRECTION)s.value=s.value||new r,t.getWorldDirection(s.value);else if(i===ol.VIEW_POSITION){const i=e.camera;s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld),s.value.applyMatrix4(i.matrixWorldInverse)}else if(i===ol.RADIUS){const r=e.object.geometry;null===r.boundingSphere&&r.computeBoundingSphere(),al.copy(r.boundingSphere).applyMatrix4(t.matrixWorld),s.value=al.radius}}generate(e){const t=this.scope;return t===ol.WORLD_MATRIX?this._uniformNode.nodeType="mat4":t===ol.POSITION||t===ol.VIEW_POSITION||t===ol.DIRECTION||t===ol.SCALE?this._uniformNode.nodeType="vec3":t===ol.RADIUS&&(this._uniformNode.nodeType="float"),this._uniformNode.build(e)}serialize(e){super.serialize(e),e.scope=this.scope}deserialize(e){super.deserialize(e),this.scope=e.scope}}ol.WORLD_MATRIX="worldMatrix",ol.POSITION="position",ol.SCALE="scale",ol.VIEW_POSITION="viewPosition",ol.DIRECTION="direction",ol.RADIUS="radius";const ul=Bi(ol,ol.DIRECTION).setParameterLength(1),ll=Bi(ol,ol.WORLD_MATRIX).setParameterLength(1),dl=Bi(ol,ol.POSITION).setParameterLength(1),cl=Bi(ol,ol.SCALE).setParameterLength(1),hl=Bi(ol,ol.VIEW_POSITION).setParameterLength(1),pl=Bi(ol,ol.RADIUS).setParameterLength(1);class gl extends ol{static get type(){return"ModelNode"}constructor(e){super(e)}update(e){this.object3d=e.object,super.update(e)}}const ml=Ii(gl,gl.DIRECTION),fl=Ii(gl,gl.WORLD_MATRIX),yl=Ii(gl,gl.POSITION),xl=Ii(gl,gl.SCALE),bl=Ii(gl,gl.VIEW_POSITION),Tl=Ii(gl,gl.RADIUS),_l=Tn(new n).onObjectUpdate((({object:e},t)=>t.value.getNormalMatrix(e.matrixWorld))),vl=Tn(new a).onObjectUpdate((({object:e},t)=>t.value.copy(e.matrixWorld).invert())),Nl=Vi((e=>e.renderer.nodes.modelViewMatrix||Sl)).once()().toVar("modelViewMatrix"),Sl=rl.mul(fl),El=Vi((e=>(e.context.isHighPrecisionModelViewMatrix=!0,Tn("mat4").onObjectUpdate((({object:e,camera:t})=>e.modelViewMatrix.multiplyMatrices(t.matrixWorldInverse,e.matrixWorld)))))).once()().toVar("highpModelViewMatrix"),wl=Vi((e=>{const t=e.context.isHighPrecisionModelViewMatrix;return Tn("mat3").onObjectUpdate((({object:e,camera:r})=>(!0!==t&&e.modelViewMatrix.multiplyMatrices(r.matrixWorldInverse,e.matrixWorld),e.normalMatrix.getNormalMatrix(e.modelViewMatrix))))})).once()().toVar("highpModelNormalViewMatrix"),Al=Vu("position","vec3"),Rl=Al.toVarying("positionLocal"),Cl=Al.toVarying("positionPrevious"),Ml=fl.mul(Rl).xyz.toVarying("v_positionWorld").context({needsPositionReassign:!0}),Pl=Rl.transformDirection(fl).toVarying("v_positionWorldDirection").normalize().toVar("positionWorldDirection").context({needsPositionReassign:!0}),Ll=Vi((e=>e.context.setupPositionView()),"vec3").once()().toVarying("v_positionView").context({needsPositionReassign:!0}),Fl=Ll.negate().toVarying("v_positionViewDirection").normalize().toVar("positionViewDirection");class Bl extends $s{static get type(){return"FrontFacingNode"}constructor(){super("bool"),this.isFrontFacingNode=!0}generate(e){const{renderer:t,material:r}=e;return t.coordinateSystem===l&&r.side===N?"false":e.getFrontFacing()}}const Il=Ii(Bl),Dl=$i(Il).mul(2).sub(1),Vl=Vu("normal","vec3"),Ul=Vi((e=>!1===e.geometry.hasAttribute("normal")?(console.warn('THREE.TSL: Vertex attribute "normal" not found on geometry.'),Qi(0,1,0)):Vl),"vec3").once()().toVar("normalLocal"),Ol=Ll.dFdx().cross(Ll.dFdy()).normalize().toVar("normalFlat"),Gl=Vi((e=>{let t;return t=!0===e.material.flatShading?Ol:Qo(jl(Ul),"v_normalView").normalize(),t}),"vec3").once()().toVar("normalView"),kl=Qo(Gl.transformDirection(rl),"v_normalWorld").normalize().toVar("normalWorld"),zl=Vi((e=>e.context.setupNormal().context({getUV:null})),"vec3").once()().mul(Dl).toVar("transformedNormalView"),$l=zl.transformDirection(rl).toVar("transformedNormalWorld"),Hl=Vi((e=>e.context.setupClearcoatNormal().context({getUV:null})),"vec3").once()().mul(Dl).toVar("transformedClearcoatNormalView"),Wl=Vi((([e,t=fl])=>{const r=on(t),s=e.div(Qi(r[0].dot(r[0]),r[1].dot(r[1]),r[2].dot(r[2])));return r.mul(s).xyz})),jl=Vi((([e],t)=>{const r=t.renderer.nodes.modelNormalViewMatrix;if(null!==r)return r.transformDirection(e);const s=_l.mul(e);return rl.transformDirection(s)})),ql=new S,Xl=new a,Kl=Tn(0).onReference((({material:e})=>e)).onObjectUpdate((({material:e})=>e.refractionRatio)),Yl=Tn(1).onReference((({material:e})=>e)).onObjectUpdate((function({material:e,scene:t}){return e.envMap?e.envMapIntensity:t.environmentIntensity})),Ql=Tn(new a).onReference((function(e){return e.material})).onObjectUpdate((function({material:e,scene:t}){const r=null!==t.environment&&null===e.envMap?t.environmentRotation:e.envMapRotation;return r?(ql.copy(r),Xl.makeRotationFromEuler(ql)):Xl.identity(),Xl})),Zl=Fl.negate().reflect(zl),Jl=Fl.negate().refract(zl,Kl),ed=Zl.transformDirection(rl).toVar("reflectVector"),td=Jl.transformDirection(rl).toVar("reflectVector");class rd extends $u{static get type(){return"CubeTextureNode"}constructor(e,t=null,r=null,s=null){super(e,t,r,s),this.isCubeTextureNode=!0}getInputType(){return"cubeTexture"}getDefaultUV(){const e=this.value;return e.mapping===E?ed:e.mapping===w?td:(console.error('THREE.CubeTextureNode: Mapping "%s" not supported.',e.mapping),Qi(0,0,0))}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return e.renderer.coordinateSystem!==d&&r.isRenderTargetTexture||(t=Qi(t.x.negate(),t.yz)),Ql.mul(t)}generateUV(e,t){return t.build(e,"vec3")}}const sd=Bi(rd).setParameterLength(1,4).setName("cubeTexture");class id extends Hs{static get type(){return"ReferenceElementNode"}constructor(e,t){super(e,t),this.referenceNode=e,this.isReferenceElementNode=!0}getNodeType(){return this.referenceNode.uniformType}generate(e){const t=super.generate(e),r=this.referenceNode.getNodeType(),s=this.getNodeType();return e.format(t,r,s)}}class nd extends $s{static get type(){return"ReferenceNode"}constructor(e,t,r=null,s=null){super(),this.property=e,this.uniformType=t,this.object=r,this.count=s,this.properties=e.split("."),this.reference=r,this.node=null,this.group=null,this.name=null,this.updateType=Is.OBJECT}element(e){return Pi(new id(this,Pi(e)))}setGroup(e){return this.group=e,this}label(e){return this.name=e,this}setNodeType(e){let t=null;t=null!==this.count?qu(null,e,this.count):Array.isArray(this.getValueFromReference())?Yu(null,e):"texture"===e?Hu(null):"cubeTexture"===e?sd(null):Tn(null,e),null!==this.group&&t.setGroup(this.group),null!==this.name&&t.label(this.name),this.node=t.getSelf()}getNodeType(e){return null===this.node&&(this.updateReference(e),this.updateValue()),this.node.getNodeType(e)}getValueFromReference(e=this.reference){const{properties:t}=this;let r=e[t[0]];for(let e=1;ePi(new nd(e,t,r)),od=(e,t,r,s)=>Pi(new nd(e,t,s,r));class ud extends nd{static get type(){return"MaterialReferenceNode"}constructor(e,t,r=null){super(e,t,r),this.material=r,this.isMaterialReferenceNode=!0}updateReference(e){return this.reference=null!==this.material?this.material:e.material,this.reference}}const ld=(e,t,r=null)=>Pi(new ud(e,t,r)),dd=Vi((e=>(!1===e.geometry.hasAttribute("tangent")&&e.geometry.computeTangents(),Vu("tangent","vec4"))))(),cd=dd.xyz.toVar("tangentLocal"),hd=Nl.mul(tn(cd,0)).xyz.toVarying("v_tangentView").normalize().toVar("tangentView"),pd=hd.transformDirection(rl).toVarying("v_tangentWorld").normalize().toVar("tangentWorld"),gd=hd.toVar("transformedTangentView"),md=gd.transformDirection(rl).normalize().toVar("transformedTangentWorld"),fd=e=>e.mul(dd.w).xyz,yd=Qo(fd(Vl.cross(dd)),"v_bitangentGeometry").normalize().toVar("bitangentGeometry"),xd=Qo(fd(Ul.cross(cd)),"v_bitangentLocal").normalize().toVar("bitangentLocal"),bd=Qo(fd(Gl.cross(hd)),"v_bitangentView").normalize().toVar("bitangentView"),Td=Qo(fd(kl.cross(pd)),"v_bitangentWorld").normalize().toVar("bitangentWorld"),_d=fd(zl.cross(gd)).normalize().toVar("transformedBitangentView"),vd=_d.transformDirection(rl).normalize().toVar("transformedBitangentWorld"),Nd=on(hd,bd,Gl),Sd=Fl.mul(Nd),Ed=(()=>{let e=Un.cross(Fl);return e=e.cross(Un).normalize(),e=Ao(e,zl,Dn.mul(wn.oneMinus()).oneMinus().pow2().pow2()).normalize(),e})(),wd=Vi((e=>{const{eye_pos:t,surf_norm:r,mapN:s,uv:i}=e,n=t.dFdx(),a=t.dFdy(),o=i.dFdx(),u=i.dFdy(),l=r,d=a.cross(l),c=l.cross(n),h=d.mul(o.x).add(c.mul(u.x)),p=d.mul(o.y).add(c.mul(u.y)),g=h.dot(h).max(p.dot(p)),m=Dl.mul(g.inverseSqrt());return sa(h.mul(s.x,m),p.mul(s.y,m),l.mul(s.z)).normalize()}));class Ad extends js{static get type(){return"NormalMapNode"}constructor(e,t=null){super("vec3"),this.node=e,this.scaleNode=t,this.normalMapType=A}setup(e){const{normalMapType:t,scaleNode:r}=this;let s=this.node.mul(2).sub(1);null!==r&&(s=Qi(s.xy.mul(r),s.z));let i=null;if(t===R)i=jl(s);else if(t===A){i=!0===e.hasGeometryAttribute("tangent")?Nd.mul(s).normalize():wd({eye_pos:Ll,surf_norm:Gl,mapN:s,uv:Uu()})}return i}}const Rd=Bi(Ad).setParameterLength(1,2),Cd=Vi((({textureNode:e,bumpScale:t})=>{const r=t=>e.cache().context({getUV:e=>t(e.uvNode||Uu()),forceUVContext:!0}),s=$i(r((e=>e)));return qi($i(r((e=>e.add(e.dFdx())))).sub(s),$i(r((e=>e.add(e.dFdy())))).sub(s)).mul(t)})),Md=Vi((e=>{const{surf_pos:t,surf_norm:r,dHdxy:s}=e,i=t.dFdx().normalize(),n=r,a=t.dFdy().normalize().cross(n),o=n.cross(i),u=i.dot(a).mul(Dl),l=u.sign().mul(s.x.mul(a).add(s.y.mul(o)));return u.abs().mul(r).sub(l).normalize()}));class Pd extends js{static get type(){return"BumpMapNode"}constructor(e,t=null){super("vec3"),this.textureNode=e,this.scaleNode=t}setup(){const e=null!==this.scaleNode?this.scaleNode:1,t=Cd({textureNode:this.textureNode,bumpScale:e});return Md({surf_pos:Ll,surf_norm:Gl,dHdxy:t})}}const Ld=Bi(Pd).setParameterLength(1,2),Fd=new Map;class Bd extends $s{static get type(){return"MaterialNode"}constructor(e){super(),this.scope=e}getCache(e,t){let r=Fd.get(e);return void 0===r&&(r=ld(e,t),Fd.set(e,r)),r}getFloat(e){return this.getCache(e,"float")}getColor(e){return this.getCache(e,"color")}getTexture(e){return this.getCache("map"===e?"map":e+"Map","texture")}setup(e){const t=e.context.material,r=this.scope;let s=null;if(r===Bd.COLOR){const e=void 0!==t.color?this.getColor(r):Qi();s=t.map&&!0===t.map.isTexture?e.mul(this.getTexture("map")):e}else if(r===Bd.OPACITY){const e=this.getFloat(r);s=t.alphaMap&&!0===t.alphaMap.isTexture?e.mul(this.getTexture("alpha")):e}else if(r===Bd.SPECULAR_STRENGTH)s=t.specularMap&&!0===t.specularMap.isTexture?this.getTexture("specular").r:$i(1);else if(r===Bd.SPECULAR_INTENSITY){const e=this.getFloat(r);s=t.specularIntensityMap&&!0===t.specularIntensityMap.isTexture?e.mul(this.getTexture(r).a):e}else if(r===Bd.SPECULAR_COLOR){const e=this.getColor(r);s=t.specularColorMap&&!0===t.specularColorMap.isTexture?e.mul(this.getTexture(r).rgb):e}else if(r===Bd.ROUGHNESS){const e=this.getFloat(r);s=t.roughnessMap&&!0===t.roughnessMap.isTexture?e.mul(this.getTexture(r).g):e}else if(r===Bd.METALNESS){const e=this.getFloat(r);s=t.metalnessMap&&!0===t.metalnessMap.isTexture?e.mul(this.getTexture(r).b):e}else if(r===Bd.EMISSIVE){const e=this.getFloat("emissiveIntensity"),i=this.getColor(r).mul(e);s=t.emissiveMap&&!0===t.emissiveMap.isTexture?i.mul(this.getTexture(r)):i}else if(r===Bd.NORMAL)t.normalMap?(s=Rd(this.getTexture("normal"),this.getCache("normalScale","vec2")),s.normalMapType=t.normalMapType):s=t.bumpMap?Ld(this.getTexture("bump").r,this.getFloat("bumpScale")):Gl;else if(r===Bd.CLEARCOAT){const e=this.getFloat(r);s=t.clearcoatMap&&!0===t.clearcoatMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===Bd.CLEARCOAT_ROUGHNESS){const e=this.getFloat(r);s=t.clearcoatRoughnessMap&&!0===t.clearcoatRoughnessMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===Bd.CLEARCOAT_NORMAL)s=t.clearcoatNormalMap?Rd(this.getTexture(r),this.getCache(r+"Scale","vec2")):Gl;else if(r===Bd.SHEEN){const e=this.getColor("sheenColor").mul(this.getFloat("sheen"));s=t.sheenColorMap&&!0===t.sheenColorMap.isTexture?e.mul(this.getTexture("sheenColor").rgb):e}else if(r===Bd.SHEEN_ROUGHNESS){const e=this.getFloat(r);s=t.sheenRoughnessMap&&!0===t.sheenRoughnessMap.isTexture?e.mul(this.getTexture(r).a):e,s=s.clamp(.07,1)}else if(r===Bd.ANISOTROPY)if(t.anisotropyMap&&!0===t.anisotropyMap.isTexture){const e=this.getTexture(r);s=an(xc.x,xc.y,xc.y.negate(),xc.x).mul(e.rg.mul(2).sub(qi(1)).normalize().mul(e.b))}else s=xc;else if(r===Bd.IRIDESCENCE_THICKNESS){const e=ad("1","float",t.iridescenceThicknessRange);if(t.iridescenceThicknessMap){const i=ad("0","float",t.iridescenceThicknessRange);s=e.sub(i).mul(this.getTexture(r).g).add(i)}else s=e}else if(r===Bd.TRANSMISSION){const e=this.getFloat(r);s=t.transmissionMap?e.mul(this.getTexture(r).r):e}else if(r===Bd.THICKNESS){const e=this.getFloat(r);s=t.thicknessMap?e.mul(this.getTexture(r).g):e}else if(r===Bd.IOR)s=this.getFloat(r);else if(r===Bd.LIGHT_MAP)s=this.getTexture(r).rgb.mul(this.getFloat("lightMapIntensity"));else if(r===Bd.AO)s=this.getTexture(r).r.sub(1).mul(this.getFloat("aoMapIntensity")).add(1);else{const t=this.getNodeType(e);s=this.getCache(r,t)}return s}}Bd.ALPHA_TEST="alphaTest",Bd.COLOR="color",Bd.OPACITY="opacity",Bd.SHININESS="shininess",Bd.SPECULAR="specular",Bd.SPECULAR_STRENGTH="specularStrength",Bd.SPECULAR_INTENSITY="specularIntensity",Bd.SPECULAR_COLOR="specularColor",Bd.REFLECTIVITY="reflectivity",Bd.ROUGHNESS="roughness",Bd.METALNESS="metalness",Bd.NORMAL="normal",Bd.CLEARCOAT="clearcoat",Bd.CLEARCOAT_ROUGHNESS="clearcoatRoughness",Bd.CLEARCOAT_NORMAL="clearcoatNormal",Bd.EMISSIVE="emissive",Bd.ROTATION="rotation",Bd.SHEEN="sheen",Bd.SHEEN_ROUGHNESS="sheenRoughness",Bd.ANISOTROPY="anisotropy",Bd.IRIDESCENCE="iridescence",Bd.IRIDESCENCE_IOR="iridescenceIOR",Bd.IRIDESCENCE_THICKNESS="iridescenceThickness",Bd.IOR="ior",Bd.TRANSMISSION="transmission",Bd.THICKNESS="thickness",Bd.ATTENUATION_DISTANCE="attenuationDistance",Bd.ATTENUATION_COLOR="attenuationColor",Bd.LINE_SCALE="scale",Bd.LINE_DASH_SIZE="dashSize",Bd.LINE_GAP_SIZE="gapSize",Bd.LINE_WIDTH="linewidth",Bd.LINE_DASH_OFFSET="dashOffset",Bd.POINT_SIZE="size",Bd.DISPERSION="dispersion",Bd.LIGHT_MAP="light",Bd.AO="ao";const Id=Ii(Bd,Bd.ALPHA_TEST),Dd=Ii(Bd,Bd.COLOR),Vd=Ii(Bd,Bd.SHININESS),Ud=Ii(Bd,Bd.EMISSIVE),Od=Ii(Bd,Bd.OPACITY),Gd=Ii(Bd,Bd.SPECULAR),kd=Ii(Bd,Bd.SPECULAR_INTENSITY),zd=Ii(Bd,Bd.SPECULAR_COLOR),$d=Ii(Bd,Bd.SPECULAR_STRENGTH),Hd=Ii(Bd,Bd.REFLECTIVITY),Wd=Ii(Bd,Bd.ROUGHNESS),jd=Ii(Bd,Bd.METALNESS),qd=Ii(Bd,Bd.NORMAL),Xd=Ii(Bd,Bd.CLEARCOAT),Kd=Ii(Bd,Bd.CLEARCOAT_ROUGHNESS),Yd=Ii(Bd,Bd.CLEARCOAT_NORMAL),Qd=Ii(Bd,Bd.ROTATION),Zd=Ii(Bd,Bd.SHEEN),Jd=Ii(Bd,Bd.SHEEN_ROUGHNESS),ec=Ii(Bd,Bd.ANISOTROPY),tc=Ii(Bd,Bd.IRIDESCENCE),rc=Ii(Bd,Bd.IRIDESCENCE_IOR),sc=Ii(Bd,Bd.IRIDESCENCE_THICKNESS),ic=Ii(Bd,Bd.TRANSMISSION),nc=Ii(Bd,Bd.THICKNESS),ac=Ii(Bd,Bd.IOR),oc=Ii(Bd,Bd.ATTENUATION_DISTANCE),uc=Ii(Bd,Bd.ATTENUATION_COLOR),lc=Ii(Bd,Bd.LINE_SCALE),dc=Ii(Bd,Bd.LINE_DASH_SIZE),cc=Ii(Bd,Bd.LINE_GAP_SIZE),hc=Ii(Bd,Bd.LINE_WIDTH),pc=Ii(Bd,Bd.LINE_DASH_OFFSET),gc=Ii(Bd,Bd.POINT_SIZE),mc=Ii(Bd,Bd.DISPERSION),fc=Ii(Bd,Bd.LIGHT_MAP),yc=Ii(Bd,Bd.AO),xc=Tn(new t).onReference((function(e){return e.material})).onRenderUpdate((function({material:e}){this.value.set(e.anisotropy*Math.cos(e.anisotropyRotation),e.anisotropy*Math.sin(e.anisotropyRotation))})),bc=Vi((e=>e.context.setupModelViewProjection()),"vec4").once()().toVarying("v_modelViewProjection");class Tc extends $s{static get type(){return"IndexNode"}constructor(e){super("uint"),this.scope=e,this.isIndexNode=!0}generate(e){const t=this.getNodeType(e),r=this.scope;let s,i;if(r===Tc.VERTEX)s=e.getVertexIndex();else if(r===Tc.INSTANCE)s=e.getInstanceIndex();else if(r===Tc.DRAW)s=e.getDrawIndex();else if(r===Tc.INVOCATION_LOCAL)s=e.getInvocationLocalIndex();else if(r===Tc.INVOCATION_SUBGROUP)s=e.getInvocationSubgroupIndex();else{if(r!==Tc.SUBGROUP)throw new Error("THREE.IndexNode: Unknown scope: "+r);s=e.getSubgroupIndex()}if("vertex"===e.shaderStage||"compute"===e.shaderStage)i=s;else{i=Qo(this).build(e,t)}return i}}Tc.VERTEX="vertex",Tc.INSTANCE="instance",Tc.SUBGROUP="subgroup",Tc.INVOCATION_LOCAL="invocationLocal",Tc.INVOCATION_SUBGROUP="invocationSubgroup",Tc.DRAW="draw";const _c=Ii(Tc,Tc.VERTEX),vc=Ii(Tc,Tc.INSTANCE),Nc=Ii(Tc,Tc.SUBGROUP),Sc=Ii(Tc,Tc.INVOCATION_SUBGROUP),Ec=Ii(Tc,Tc.INVOCATION_LOCAL),wc=Ii(Tc,Tc.DRAW);class Ac extends $s{static get type(){return"InstanceNode"}constructor(e,t,r){super("void"),this.count=e,this.instanceMatrix=t,this.instanceColor=r,this.instanceMatrixNode=null,this.instanceColorNode=null,this.updateType=Is.FRAME,this.buffer=null,this.bufferColor=null}setup(e){const{count:t,instanceMatrix:r,instanceColor:s}=this;let{instanceMatrixNode:i,instanceColorNode:n}=this;if(null===i){if(t<=1e3)i=qu(r.array,"mat4",Math.max(t,1)).element(vc);else{const e=new C(r.array,16,1);this.buffer=e;const t=r.usage===y?bu:xu,s=[t(e,"vec4",16,0),t(e,"vec4",16,4),t(e,"vec4",16,8),t(e,"vec4",16,12)];i=un(...s)}this.instanceMatrixNode=i}if(s&&null===n){const e=new M(s.array,3),t=s.usage===y?bu:xu;this.bufferColor=e,n=Qi(t(e,"vec3",3,0)),this.instanceColorNode=n}const a=i.mul(Rl).xyz;if(Rl.assign(a),e.hasGeometryAttribute("normal")){const e=Wl(Ul,i);Ul.assign(e)}null!==this.instanceColorNode&&Nn("vec3","vInstanceColor").assign(this.instanceColorNode)}update(){this.instanceMatrix.usage!==y&&null!==this.buffer&&this.instanceMatrix.version!==this.buffer.version&&(this.buffer.version=this.instanceMatrix.version),this.instanceColor&&this.instanceColor.usage!==y&&null!==this.bufferColor&&this.instanceColor.version!==this.bufferColor.version&&(this.bufferColor.version=this.instanceColor.version)}}const Rc=Bi(Ac).setParameterLength(3);class Cc extends Ac{static get type(){return"InstancedMeshNode"}constructor(e){const{count:t,instanceMatrix:r,instanceColor:s}=e;super(t,r,s),this.instancedMesh=e}}const Mc=Bi(Cc).setParameterLength(1);class Pc extends $s{static get type(){return"BatchNode"}constructor(e){super("void"),this.batchMesh=e,this.batchingIdNode=null}setup(e){null===this.batchingIdNode&&(null===e.getDrawIndex()?this.batchingIdNode=vc:this.batchingIdNode=wc);const t=Vi((([e])=>{const t=Hi(Gu(Wu(this.batchMesh._indirectTexture),0).x),r=Hi(e).mod(t),s=Hi(e).div(t);return Wu(this.batchMesh._indirectTexture,Xi(r,s)).x})).setLayout({name:"getIndirectIndex",type:"uint",inputs:[{name:"id",type:"int"}]}),r=t(Hi(this.batchingIdNode)),s=this.batchMesh._matricesTexture,i=Hi(Gu(Wu(s),0).x),n=$i(r).mul(4).toInt().toVar(),a=n.mod(i),o=n.div(i),u=un(Wu(s,Xi(a,o)),Wu(s,Xi(a.add(1),o)),Wu(s,Xi(a.add(2),o)),Wu(s,Xi(a.add(3),o))),l=this.batchMesh._colorsTexture;if(null!==l){const e=Vi((([e])=>{const t=Hi(Gu(Wu(l),0).x),r=e,s=r.mod(t),i=r.div(t);return Wu(l,Xi(s,i)).rgb})).setLayout({name:"getBatchingColor",type:"vec3",inputs:[{name:"id",type:"int"}]}),t=e(r);Nn("vec3","vBatchColor").assign(t)}const d=on(u);Rl.assign(u.mul(Rl));const c=Ul.div(Qi(d[0].dot(d[0]),d[1].dot(d[1]),d[2].dot(d[2]))),h=d.mul(c).xyz;Ul.assign(h),e.hasGeometryAttribute("tangent")&&cd.mulAssign(d)}}const Lc=Bi(Pc).setParameterLength(1);class Fc extends Hs{static get type(){return"StorageArrayElementNode"}constructor(e,t){super(e,t),this.isStorageArrayElementNode=!0}set storageBufferNode(e){this.node=e}get storageBufferNode(){return this.node}getMemberType(e,t){const r=this.storageBufferNode.structTypeNode;return r?r.getMemberType(e,t):"void"}setup(e){return!1===e.isAvailable("storageBuffer")&&!0===this.node.isPBO&&e.setupPBO(this.node),super.setup(e)}generate(e,t){let r;const s=e.context.assign;if(r=!1===e.isAvailable("storageBuffer")?!0!==this.node.isPBO||!0===s||!this.node.value.isInstancedBufferAttribute&&"compute"===e.shaderStage?this.node.build(e):e.generatePBO(this):super.generate(e),!0!==s){const s=this.getNodeType(e);r=e.format(r,s,t)}return r}}const Bc=Bi(Fc).setParameterLength(2);class Ic extends ju{static get type(){return"StorageBufferNode"}constructor(e,t=null,r=0){let s,i=null;t&&t.isStruct?(s="struct",i=t.layout):null===t&&(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute)?(s=Es(e.itemSize),r=e.count):s=t,super(e,s,r),this.isStorageBufferNode=!0,this.structTypeNode=i,this.access=Vs.READ_WRITE,this.isAtomic=!1,this.isPBO=!1,this._attribute=null,this._varying=null,this.global=!0,!0!==e.isStorageBufferAttribute&&!0!==e.isStorageInstancedBufferAttribute&&(e.isInstancedBufferAttribute?e.isStorageInstancedBufferAttribute=!0:e.isStorageBufferAttribute=!0)}getHash(e){if(0===this.bufferCount){let t=e.globalCache.getData(this.value);return void 0===t&&(t={node:this},e.globalCache.setData(this.value,t)),t.node.uuid}return this.uuid}getInputType(){return this.value.isIndirectStorageBufferAttribute?"indirectStorageBuffer":"storageBuffer"}element(e){return Bc(this,e)}setPBO(e){return this.isPBO=e,this}getPBO(){return this.isPBO}setAccess(e){return this.access=e,this}toReadOnly(){return this.setAccess(Vs.READ_ONLY)}setAtomic(e){return this.isAtomic=e,this}toAtomic(){return this.setAtomic(!0)}getAttributeData(){return null===this._attribute&&(this._attribute=fu(this.value),this._varying=Qo(this._attribute)),{attribute:this._attribute,varying:this._varying}}getNodeType(e){if(null!==this.structTypeNode)return this.structTypeNode.getNodeType(e);if(e.isAvailable("storageBuffer")||e.isAvailable("indirectStorageBuffer"))return super.getNodeType(e);const{attribute:t}=this.getAttributeData();return t.getNodeType(e)}generate(e){if(null!==this.structTypeNode&&this.structTypeNode.build(e),e.isAvailable("storageBuffer")||e.isAvailable("indirectStorageBuffer"))return super.generate(e);const{attribute:t,varying:r}=this.getAttributeData(),s=r.build(e);return e.registerTransform(s,t),s}}const Dc=(e,t=null,r=0)=>Pi(new Ic(e,t,r)),Vc=new WeakMap;class Uc extends $s{static get type(){return"SkinningNode"}constructor(e){super("void"),this.skinnedMesh=e,this.updateType=Is.OBJECT,this.skinIndexNode=Vu("skinIndex","uvec4"),this.skinWeightNode=Vu("skinWeight","vec4"),this.bindMatrixNode=ad("bindMatrix","mat4"),this.bindMatrixInverseNode=ad("bindMatrixInverse","mat4"),this.boneMatricesNode=od("skeleton.boneMatrices","mat4",e.skeleton.bones.length),this.positionNode=Rl,this.toPositionNode=Rl,this.previousBoneMatricesNode=null}getSkinnedPosition(e=this.boneMatricesNode,t=this.positionNode){const{skinIndexNode:r,skinWeightNode:s,bindMatrixNode:i,bindMatrixInverseNode:n}=this,a=e.element(r.x),o=e.element(r.y),u=e.element(r.z),l=e.element(r.w),d=i.mul(t),c=sa(a.mul(s.x).mul(d),o.mul(s.y).mul(d),u.mul(s.z).mul(d),l.mul(s.w).mul(d));return n.mul(c).xyz}getSkinnedNormal(e=this.boneMatricesNode,t=Ul){const{skinIndexNode:r,skinWeightNode:s,bindMatrixNode:i,bindMatrixInverseNode:n}=this,a=e.element(r.x),o=e.element(r.y),u=e.element(r.z),l=e.element(r.w);let d=sa(s.x.mul(a),s.y.mul(o),s.z.mul(u),s.w.mul(l));return d=n.mul(d).mul(i),d.transformDirection(t).xyz}getPreviousSkinnedPosition(e){const t=e.object;return null===this.previousBoneMatricesNode&&(t.skeleton.previousBoneMatrices=new Float32Array(t.skeleton.boneMatrices),this.previousBoneMatricesNode=od("skeleton.previousBoneMatrices","mat4",t.skeleton.bones.length)),this.getSkinnedPosition(this.previousBoneMatricesNode,Cl)}needsPreviousBoneMatrices(e){const t=e.renderer.getMRT();return t&&t.has("velocity")||!0===Ms(e.object).useVelocity}setup(e){this.needsPreviousBoneMatrices(e)&&Cl.assign(this.getPreviousSkinnedPosition(e));const t=this.getSkinnedPosition();if(this.toPositionNode&&this.toPositionNode.assign(t),e.hasGeometryAttribute("normal")){const t=this.getSkinnedNormal();Ul.assign(t),e.hasGeometryAttribute("tangent")&&cd.assign(t)}return t}generate(e,t){if("void"!==t)return super.generate(e,t)}update(e){const t=e.object&&e.object.skeleton?e.object.skeleton:this.skinnedMesh.skeleton;Vc.get(t)!==e.frameId&&(Vc.set(t,e.frameId),null!==this.previousBoneMatricesNode&&t.previousBoneMatrices.set(t.boneMatrices),t.update())}}const Oc=e=>Pi(new Uc(e));class Gc extends $s{static get type(){return"LoopNode"}constructor(e=[]){super(),this.params=e}getVarName(e){return String.fromCharCode("i".charCodeAt(0)+e)}getProperties(e){const t=e.getNodeProperties(this);if(void 0!==t.stackNode)return t;const r={};for(let e=0,t=this.params.length-1;eNumber(o)?">=":"<")),n)i=`while ( ${o} )`;else{const t={start:a,end:o},r=t.start,s=t.end;let n="",h="",p="";c||(c="int"===l||"uint"===l?d.includes("<")?"++":"--":d.includes("<")?"+= 1.":"-= 1."),n+=e.getVar(l,u)+" = "+r,h+=u+" "+d+" "+s,p+=u+" "+c,i=`for ( ${n}; ${h}; ${p} )`}e.addFlowCode((0===t?"\n":"")+e.tab+i+" {\n\n").addFlowTab()}const i=s.build(e,"void"),n=t.returnsNode?t.returnsNode.build(e):"";e.removeFlowTab().addFlowCode("\n"+e.tab+i);for(let t=0,r=this.params.length-1;tPi(new Gc(Fi(e,"int"))).append(),zc=()=>Mu("break").append(),$c=new WeakMap,Hc=new s,Wc=Vi((({bufferMap:e,influence:t,stride:r,width:s,depth:i,offset:n})=>{const a=Hi(_c).mul(r).add(n),o=a.div(s),u=a.sub(o.mul(s));return Wu(e,Xi(u,o)).depth(i).xyz.mul(t)}));class jc extends $s{static get type(){return"MorphNode"}constructor(e){super("void"),this.mesh=e,this.morphBaseInfluence=Tn(1),this.updateType=Is.OBJECT}setup(e){const{geometry:r}=e,s=void 0!==r.morphAttributes.position,i=r.hasAttribute("normal")&&void 0!==r.morphAttributes.normal,n=r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color,a=void 0!==n?n.length:0,{texture:o,stride:u,size:l}=function(e){const r=void 0!==e.morphAttributes.position,s=void 0!==e.morphAttributes.normal,i=void 0!==e.morphAttributes.color,n=e.morphAttributes.position||e.morphAttributes.normal||e.morphAttributes.color,a=void 0!==n?n.length:0;let o=$c.get(e);if(void 0===o||o.count!==a){void 0!==o&&o.texture.dispose();const u=e.morphAttributes.position||[],l=e.morphAttributes.normal||[],d=e.morphAttributes.color||[];let c=0;!0===r&&(c=1),!0===s&&(c=2),!0===i&&(c=3);let h=e.attributes.position.count*c,p=1;const g=4096;h>g&&(p=Math.ceil(h/g),h=g);const m=new Float32Array(h*p*4*a),f=new P(m,h,p,a);f.type=L,f.needsUpdate=!0;const y=4*c;for(let b=0;b{const t=$i(0).toVar();this.mesh.count>1&&null!==this.mesh.morphTexture&&void 0!==this.mesh.morphTexture?t.assign(Wu(this.mesh.morphTexture,Xi(Hi(e).add(1),Hi(vc))).r):t.assign(ad("morphTargetInfluences","float").element(e).toVar()),Gi(t.notEqual(0),(()=>{!0===s&&Rl.addAssign(Wc({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:Hi(0)})),!0===i&&Ul.addAssign(Wc({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:Hi(1)}))}))}))}update(){const e=this.morphBaseInfluence;this.mesh.geometry.morphTargetsRelative?e.value=1:e.value=1-this.mesh.morphTargetInfluences.reduce(((e,t)=>e+t),0)}}const qc=Bi(jc).setParameterLength(1);class Xc extends $s{static get type(){return"LightingNode"}constructor(){super("vec3"),this.isLightingNode=!0}}class Kc extends Xc{static get type(){return"AONode"}constructor(e=null){super(),this.aoNode=e}setup(e){e.context.ambientOcclusion.mulAssign(this.aoNode)}}class Yc extends zo{static get type(){return"LightingContextNode"}constructor(e,t=null,r=null,s=null){super(e),this.lightingModel=t,this.backdropNode=r,this.backdropAlphaNode=s,this._value=null}getContext(){const{backdropNode:e,backdropAlphaNode:t}=this,r={directDiffuse:Qi().toVar("directDiffuse"),directSpecular:Qi().toVar("directSpecular"),indirectDiffuse:Qi().toVar("indirectDiffuse"),indirectSpecular:Qi().toVar("indirectSpecular")};return{radiance:Qi().toVar("radiance"),irradiance:Qi().toVar("irradiance"),iblIrradiance:Qi().toVar("iblIrradiance"),ambientOcclusion:$i(1).toVar("ambientOcclusion"),reflectedLight:r,backdrop:e,backdropAlpha:t}}setup(e){return this.value=this._value||(this._value=this.getContext()),this.value.lightingModel=this.lightingModel||e.context.lightingModel,super.setup(e)}}const Qc=Bi(Yc);class Zc extends Xc{static get type(){return"IrradianceNode"}constructor(e){super(),this.node=e}setup(e){e.context.irradiance.addAssign(this.node)}}let Jc,eh;class th extends $s{static get type(){return"ScreenNode"}constructor(e){super(),this.scope=e,this.isViewportNode=!0}getNodeType(){return this.scope===th.VIEWPORT?"vec4":"vec2"}getUpdateType(){let e=Is.NONE;return this.scope!==th.SIZE&&this.scope!==th.VIEWPORT||(e=Is.RENDER),this.updateType=e,e}update({renderer:e}){const t=e.getRenderTarget();this.scope===th.VIEWPORT?null!==t?eh.copy(t.viewport):(e.getViewport(eh),eh.multiplyScalar(e.getPixelRatio())):null!==t?(Jc.width=t.width,Jc.height=t.height):e.getDrawingBufferSize(Jc)}setup(){const e=this.scope;let r=null;return r=e===th.SIZE?Tn(Jc||(Jc=new t)):e===th.VIEWPORT?Tn(eh||(eh=new s)):qi(ih.div(sh)),r}generate(e){if(this.scope===th.COORDINATE){let t=e.getFragCoord();if(e.isFlipY()){const r=e.getNodeProperties(sh).outputNode.build(e);t=`${e.getType("vec2")}( ${t}.x, ${r}.y - ${t}.y )`}return t}return super.generate(e)}}th.COORDINATE="coordinate",th.VIEWPORT="viewport",th.SIZE="size",th.UV="uv";const rh=Ii(th,th.UV),sh=Ii(th,th.SIZE),ih=Ii(th,th.COORDINATE),nh=Ii(th,th.VIEWPORT),ah=nh.zw,oh=ih.sub(nh.xy),uh=oh.div(ah),lh=Vi((()=>(console.warn('THREE.TSL: "viewportResolution" is deprecated. Use "screenSize" instead.'),sh)),"vec2").once()(),dh=Vi((()=>(console.warn('THREE.TSL: "viewportTopLeft" is deprecated. Use "screenUV" instead.'),rh)),"vec2").once()(),ch=Vi((()=>(console.warn('THREE.TSL: "viewportBottomLeft" is deprecated. Use "screenUV.flipY()" instead.'),rh.flipY())),"vec2").once()(),hh=new t;class ph extends $u{static get type(){return"ViewportTextureNode"}constructor(e=rh,t=null,r=null){null===r&&((r=new F).minFilter=B),super(r,e,t),this.generateMipmaps=!1,this.isOutputTextureNode=!0,this.updateBeforeType=Is.FRAME}updateBefore(e){const t=e.renderer;t.getDrawingBufferSize(hh);const r=this.value;r.image.width===hh.width&&r.image.height===hh.height||(r.image.width=hh.width,r.image.height=hh.height,r.needsUpdate=!0);const s=r.generateMipmaps;r.generateMipmaps=this.generateMipmaps,t.copyFramebufferToTexture(r),r.generateMipmaps=s}clone(){const e=new this.constructor(this.uvNode,this.levelNode,this.value);return e.generateMipmaps=this.generateMipmaps,e}}const gh=Bi(ph).setParameterLength(0,3),mh=Bi(ph,null,null,{generateMipmaps:!0}).setParameterLength(0,3);let fh=null;class yh extends ph{static get type(){return"ViewportDepthTextureNode"}constructor(e=rh,t=null){null===fh&&(fh=new I),super(e,t,fh)}}const xh=Bi(yh).setParameterLength(0,2);class bh extends $s{static get type(){return"ViewportDepthNode"}constructor(e,t=null){super("float"),this.scope=e,this.valueNode=t,this.isViewportDepthNode=!0}generate(e){const{scope:t}=this;return t===bh.DEPTH_BASE?e.getFragDepth():super.generate(e)}setup({camera:e}){const{scope:t}=this,r=this.valueNode;let s=null;if(t===bh.DEPTH_BASE)null!==r&&(s=Sh().assign(r));else if(t===bh.DEPTH)s=e.isPerspectiveCamera?_h(Ll.z,Zu,Ju):Th(Ll.z,Zu,Ju);else if(t===bh.LINEAR_DEPTH)if(null!==r)if(e.isPerspectiveCamera){const e=vh(r,Zu,Ju);s=Th(e,Zu,Ju)}else s=r;else s=Th(Ll.z,Zu,Ju);return s}}bh.DEPTH_BASE="depthBase",bh.DEPTH="depth",bh.LINEAR_DEPTH="linearDepth";const Th=(e,t,r)=>e.add(t).div(t.sub(r)),_h=(e,t,r)=>t.add(e).mul(r).div(r.sub(t).mul(e)),vh=(e,t,r)=>t.mul(r).div(r.sub(t).mul(e).sub(r)),Nh=(e,t,r)=>{t=t.max(1e-6).toVar();const s=Ua(e.negate().div(t)),i=Ua(r.div(t));return s.div(i)},Sh=Bi(bh,bh.DEPTH_BASE),Eh=Ii(bh,bh.DEPTH),wh=Bi(bh,bh.LINEAR_DEPTH).setParameterLength(0,1),Ah=wh(xh());Eh.assign=e=>Sh(e);const Rh=Bi(class extends $s{constructor(e){super("float"),this.name=e,this.isBuiltinNode=!0}generate(){return this.name}}).setParameterLength(1);class Ch extends $s{static get type(){return"ClippingNode"}constructor(e=Ch.DEFAULT){super(),this.scope=e}setup(e){super.setup(e);const t=e.clippingContext,{intersectionPlanes:r,unionPlanes:s}=t;return this.hardwareClipping=e.material.hardwareClipping,this.scope===Ch.ALPHA_TO_COVERAGE?this.setupAlphaToCoverage(r,s):this.scope===Ch.HARDWARE?this.setupHardwareClipping(s,e):this.setupDefault(r,s)}setupAlphaToCoverage(e,t){return Vi((()=>{const r=$i().toVar("distanceToPlane"),s=$i().toVar("distanceToGradient"),i=$i(1).toVar("clipOpacity"),n=t.length;if(!1===this.hardwareClipping&&n>0){const e=Yu(t);kc(n,(({i:t})=>{const n=e.element(t);r.assign(Ll.dot(n.xyz).negate().add(n.w)),s.assign(r.fwidth().div(2)),i.mulAssign(Po(s.negate(),s,r))}))}const a=e.length;if(a>0){const t=Yu(e),n=$i(1).toVar("intersectionClipOpacity");kc(a,(({i:e})=>{const i=t.element(e);r.assign(Ll.dot(i.xyz).negate().add(i.w)),s.assign(r.fwidth().div(2)),n.mulAssign(Po(s.negate(),s,r).oneMinus())})),i.mulAssign(n.oneMinus())}Sn.a.mulAssign(i),Sn.a.equal(0).discard()}))()}setupDefault(e,t){return Vi((()=>{const r=t.length;if(!1===this.hardwareClipping&&r>0){const e=Yu(t);kc(r,(({i:t})=>{const r=e.element(t);Ll.dot(r.xyz).greaterThan(r.w).discard()}))}const s=e.length;if(s>0){const t=Yu(e),r=ji(!0).toVar("clipped");kc(s,(({i:e})=>{const s=t.element(e);r.assign(Ll.dot(s.xyz).greaterThan(s.w).and(r))})),r.discard()}}))()}setupHardwareClipping(e,t){const r=e.length;return t.enableHardwareClipping(r),Vi((()=>{const s=Yu(e),i=Rh(t.getClipDistance());kc(r,(({i:e})=>{const t=s.element(e),r=Ll.dot(t.xyz).sub(t.w).negate();i.element(e).assign(r)}))}))()}}Ch.ALPHA_TO_COVERAGE="alphaToCoverage",Ch.DEFAULT="default",Ch.HARDWARE="hardware";const Mh=Vi((([e])=>Ha(na(1e4,Wa(na(17,e.x).add(na(.1,e.y)))).mul(sa(.1,Qa(Wa(na(13,e.y).add(e.x)))))))),Ph=Vi((([e])=>Mh(qi(Mh(e.xy),e.z)))),Lh=Vi((([e])=>{const t=po(Ja(ro(e.xyz)),Ja(so(e.xyz))),r=$i(1).div($i(.05).mul(t)).toVar("pixScale"),s=qi(Da(ka(Ua(r))),Da(za(Ua(r)))),i=qi(Ph(ka(s.x.mul(e.xyz))),Ph(ka(s.y.mul(e.xyz)))),n=Ha(Ua(r)),a=sa(na(n.oneMinus(),i.x),na(n,i.y)),o=ho(n,n.oneMinus()),u=Qi(a.mul(a).div(na(2,o).mul(ia(1,o))),a.sub(na(.5,o)).div(ia(1,o)),ia(1,ia(1,a).mul(ia(1,a)).div(na(2,o).mul(ia(1,o))))),l=a.lessThan(o.oneMinus()).select(a.lessThan(o).select(u.x,u.y),u.z);return Ro(l,1e-6,1)})).setLayout({name:"getAlphaHashThreshold",type:"float",inputs:[{name:"position",type:"vec3"}]});class Fh extends D{static get type(){return"NodeMaterial"}get type(){return this.constructor.type}set type(e){}constructor(){super(),this.isNodeMaterial=!0,this.fog=!0,this.lights=!1,this.hardwareClipping=!1,this.lightsNode=null,this.envNode=null,this.aoNode=null,this.colorNode=null,this.normalNode=null,this.opacityNode=null,this.backdropNode=null,this.backdropAlphaNode=null,this.alphaTestNode=null,this.positionNode=null,this.geometryNode=null,this.depthNode=null,this.shadowPositionNode=null,this.receivedShadowNode=null,this.castShadowNode=null,this.outputNode=null,this.mrtNode=null,this.fragmentNode=null,this.vertexNode=null}customProgramCacheKey(){return this.type+_s(this)}build(e){this.setup(e)}setupObserver(e){return new fs(e)}setup(e){e.context.setupNormal=()=>this.setupNormal(e),e.context.setupPositionView=()=>this.setupPositionView(e),e.context.setupModelViewProjection=()=>this.setupModelViewProjection(e);const t=e.renderer,r=t.getRenderTarget();e.addStack();const s=this.vertexNode||this.setupVertex(e);let i;e.stack.outputNode=s,this.setupHardwareClipping(e),null!==this.geometryNode&&(e.stack.outputNode=e.stack.outputNode.bypass(this.geometryNode)),e.addFlow("vertex",e.removeStack()),e.addStack();const n=this.setupClipping(e);if(!0!==this.depthWrite&&!0!==this.depthTest||(null!==r?!0===r.depthBuffer&&this.setupDepth(e):!0===t.depth&&this.setupDepth(e)),null===this.fragmentNode){this.setupDiffuseColor(e),this.setupVariants(e);const s=this.setupLighting(e);null!==n&&e.stack.add(n);const a=tn(s,Sn.a).max(0);i=this.setupOutput(e,a),zn.assign(i);const o=null!==this.outputNode;if(o&&(i=this.outputNode),null!==r){const e=t.getMRT(),r=this.mrtNode;null!==e?(o&&zn.assign(i),i=e,null!==r&&(i=e.merge(r))):null!==r&&(i=r)}}else{let t=this.fragmentNode;!0!==t.isOutputStructNode&&(t=tn(t)),i=this.setupOutput(e,t)}e.stack.outputNode=i,e.addFlow("fragment",e.removeStack()),e.observer=this.setupObserver(e)}setupClipping(e){if(null===e.clippingContext)return null;const{unionPlanes:t,intersectionPlanes:r}=e.clippingContext;let s=null;if(t.length>0||r.length>0){const t=e.renderer.samples;this.alphaToCoverage&&t>1?s=Pi(new Ch(Ch.ALPHA_TO_COVERAGE)):e.stack.add(Pi(new Ch))}return s}setupHardwareClipping(e){if(this.hardwareClipping=!1,null===e.clippingContext)return;const t=e.clippingContext.unionPlanes.length;t>0&&t<=8&&e.isAvailable("clipDistance")&&(e.stack.add(Pi(new Ch(Ch.HARDWARE))),this.hardwareClipping=!0)}setupDepth(e){const{renderer:t,camera:r}=e;let s=this.depthNode;if(null===s){const e=t.getMRT();e&&e.has("depth")?s=e.get("depth"):!0===t.logarithmicDepthBuffer&&(s=r.isPerspectiveCamera?Nh(Ll.z,Zu,Ju):Th(Ll.z,Zu,Ju))}null!==s&&Eh.assign(s).append()}setupPositionView(){return Nl.mul(Rl).xyz}setupModelViewProjection(){return el.mul(Ll)}setupVertex(e){return e.addStack(),this.setupPosition(e),e.context.vertex=e.removeStack(),bc}setupPosition(e){const{object:t,geometry:r}=e;if((r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color)&&qc(t).append(),!0===t.isSkinnedMesh&&Oc(t).append(),this.displacementMap){const e=ld("displacementMap","texture"),t=ld("displacementScale","float"),r=ld("displacementBias","float");Rl.addAssign(Ul.normalize().mul(e.x.mul(t).add(r)))}return t.isBatchedMesh&&Lc(t).append(),t.isInstancedMesh&&t.instanceMatrix&&!0===t.instanceMatrix.isInstancedBufferAttribute&&Mc(t).append(),null!==this.positionNode&&Rl.assign(this.positionNode.context({isPositionNodeInput:!0})),Rl}setupDiffuseColor({object:e,geometry:t}){let r=this.colorNode?tn(this.colorNode):Dd;if(!0===this.vertexColors&&t.hasAttribute("color")&&(r=tn(r.xyz.mul(Vu("color","vec3")),r.a)),e.instanceColor){r=Nn("vec3","vInstanceColor").mul(r)}if(e.isBatchedMesh&&e._colorsTexture){r=Nn("vec3","vBatchColor").mul(r)}Sn.assign(r);const s=this.opacityNode?$i(this.opacityNode):Od;if(Sn.a.assign(Sn.a.mul(s)),null!==this.alphaTestNode||this.alphaTest>0){const e=null!==this.alphaTestNode?$i(this.alphaTestNode):Id;Sn.a.lessThanEqual(e).discard()}!0===this.alphaHash&&Sn.a.lessThan(Lh(Rl)).discard(),!1===this.transparent&&this.blending===V&&!1===this.alphaToCoverage&&Sn.a.assign(1)}setupVariants(){}setupOutgoingLight(){return!0===this.lights?Qi(0):Sn.rgb}setupNormal(){return this.normalNode?Qi(this.normalNode):qd}setupEnvironment(){let e=null;return this.envNode?e=this.envNode:this.envMap&&(e=this.envMap.isCubeTexture?ld("envMap","cubeTexture"):ld("envMap","texture")),e}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new Zc(fc)),t}setupLights(e){const t=[],r=this.setupEnvironment(e);r&&r.isLightingNode&&t.push(r);const s=this.setupLightMap(e);if(s&&s.isLightingNode&&t.push(s),null!==this.aoNode||e.material.aoMap){const e=null!==this.aoNode?this.aoNode:yc;t.push(new Kc(e))}let i=this.lightsNode||e.lightsNode;return t.length>0&&(i=e.renderer.lighting.createNode([...i.getLights(),...t])),i}setupLightingModel(){}setupLighting(e){const{material:t}=e,{backdropNode:r,backdropAlphaNode:s,emissiveNode:i}=this,n=!0===this.lights||null!==this.lightsNode?this.setupLights(e):null;let a=this.setupOutgoingLight(e);if(n&&n.getScope().hasLights){const t=this.setupLightingModel(e)||null;a=Qc(n,t,r,s)}else null!==r&&(a=Qi(null!==s?Ao(a,r,s):r));return(i&&!0===i.isNode||t.emissive&&!0===t.emissive.isColor)&&(En.assign(Qi(i||Ud)),a=a.add(En)),a}setupFog(e,t){const r=e.fogNode;return r&&(zn.assign(t),t=tn(r)),t}setupOutput(e,t){return!0===this.fog&&(t=this.setupFog(e,t)),t}setDefaultValues(e){for(const t in e){const r=e[t];void 0===this[t]&&(this[t]=r,r&&r.clone&&(this[t]=r.clone()))}const t=Object.getOwnPropertyDescriptors(e.constructor.prototype);for(const e in t)void 0===Object.getOwnPropertyDescriptor(this.constructor.prototype,e)&&void 0!==t[e].get&&Object.defineProperty(this.constructor.prototype,e,t[e])}toJSON(e){const t=void 0===e||"string"==typeof e;t&&(e={textures:{},images:{},nodes:{}});const r=D.prototype.toJSON.call(this,e),s=vs(this);r.inputNodes={};for(const{property:t,childNode:i}of s)r.inputNodes[t]=i.toJSON(e).uuid;function i(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(t){const t=i(e.textures),s=i(e.images),n=i(e.nodes);t.length>0&&(r.textures=t),s.length>0&&(r.images=s),n.length>0&&(r.nodes=n)}return r}copy(e){return this.lightsNode=e.lightsNode,this.envNode=e.envNode,this.colorNode=e.colorNode,this.normalNode=e.normalNode,this.opacityNode=e.opacityNode,this.backdropNode=e.backdropNode,this.backdropAlphaNode=e.backdropAlphaNode,this.alphaTestNode=e.alphaTestNode,this.positionNode=e.positionNode,this.geometryNode=e.geometryNode,this.depthNode=e.depthNode,this.shadowPositionNode=e.shadowPositionNode,this.receivedShadowNode=e.receivedShadowNode,this.castShadowNode=e.castShadowNode,this.outputNode=e.outputNode,this.mrtNode=e.mrtNode,this.fragmentNode=e.fragmentNode,this.vertexNode=e.vertexNode,super.copy(e)}}const Bh=new U;class Ih extends Fh{static get type(){return"LineBasicNodeMaterial"}constructor(e){super(),this.isLineBasicNodeMaterial=!0,this.setDefaultValues(Bh),this.setValues(e)}}const Dh=new O;class Vh extends Fh{static get type(){return"LineDashedNodeMaterial"}constructor(e){super(),this.isLineDashedNodeMaterial=!0,this.setDefaultValues(Dh),this.dashOffset=0,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.setValues(e)}setupVariants(){const e=this.offsetNode?$i(this.offsetNode):pc,t=this.dashScaleNode?$i(this.dashScaleNode):lc,r=this.dashSizeNode?$i(this.dashSizeNode):dc,s=this.gapSizeNode?$i(this.gapSizeNode):cc;$n.assign(r),Hn.assign(s);const i=Qo(Vu("lineDistance").mul(t));(e?i.add(e):i).mod($n.add(Hn)).greaterThan($n).discard()}}let Uh=null;class Oh extends ph{static get type(){return"ViewportSharedTextureNode"}constructor(e=rh,t=null){null===Uh&&(Uh=new F),super(e,t,Uh)}updateReference(){return this}}const Gh=Bi(Oh).setParameterLength(0,2),kh=new O;class zh extends Fh{static get type(){return"Line2NodeMaterial"}constructor(e={}){super(),this.isLine2NodeMaterial=!0,this.setDefaultValues(kh),this.useColor=e.vertexColors,this.dashOffset=0,this.lineWidth=1,this.lineColorNode=null,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.blending=G,this._useDash=e.dashed,this._useAlphaToCoverage=!0,this._useWorldUnits=!1,this.setValues(e)}setup(e){const{renderer:t}=e,r=this._useAlphaToCoverage,s=this.useColor,i=this._useDash,n=this._useWorldUnits,a=Vi((({start:e,end:t})=>{const r=el.element(2).element(2),s=el.element(3).element(2).mul(-.5).div(r).sub(e.z).div(t.z.sub(e.z));return tn(Ao(e.xyz,t.xyz,s),t.w)})).setLayout({name:"trimSegment",type:"vec4",inputs:[{name:"start",type:"vec4"},{name:"end",type:"vec4"}]});this.vertexNode=Vi((()=>{const e=Vu("instanceStart"),t=Vu("instanceEnd"),r=tn(Nl.mul(tn(e,1))).toVar("start"),s=tn(Nl.mul(tn(t,1))).toVar("end");if(i){const e=this.dashScaleNode?$i(this.dashScaleNode):lc,t=this.offsetNode?$i(this.offsetNode):pc,r=Vu("instanceDistanceStart"),s=Vu("instanceDistanceEnd");let i=Al.y.lessThan(.5).select(e.mul(r),e.mul(s));i=i.add(t),Nn("float","lineDistance").assign(i)}n&&(Nn("vec3","worldStart").assign(r.xyz),Nn("vec3","worldEnd").assign(s.xyz));const o=nh.z.div(nh.w),u=el.element(2).element(3).equal(-1);Gi(u,(()=>{Gi(r.z.lessThan(0).and(s.z.greaterThan(0)),(()=>{s.assign(a({start:r,end:s}))})).ElseIf(s.z.lessThan(0).and(r.z.greaterThanEqual(0)),(()=>{r.assign(a({start:s,end:r}))}))}));const l=el.mul(r),d=el.mul(s),c=l.xyz.div(l.w),h=d.xyz.div(d.w),p=h.xy.sub(c.xy).toVar();p.x.assign(p.x.mul(o)),p.assign(p.normalize());const g=tn().toVar();if(n){const e=s.xyz.sub(r.xyz).normalize(),t=Ao(r.xyz,s.xyz,.5).normalize(),n=e.cross(t).normalize(),a=e.cross(n),o=Nn("vec4","worldPos");o.assign(Al.y.lessThan(.5).select(r,s));const u=hc.mul(.5);o.addAssign(tn(Al.x.lessThan(0).select(n.mul(u),n.mul(u).negate()),0)),i||(o.addAssign(tn(Al.y.lessThan(.5).select(e.mul(u).negate(),e.mul(u)),0)),o.addAssign(tn(a.mul(u),0)),Gi(Al.y.greaterThan(1).or(Al.y.lessThan(0)),(()=>{o.subAssign(tn(a.mul(2).mul(u),0))}))),g.assign(el.mul(o));const l=Qi().toVar();l.assign(Al.y.lessThan(.5).select(c,h)),g.z.assign(l.z.mul(g.w))}else{const e=qi(p.y,p.x.negate()).toVar("offset");p.x.assign(p.x.div(o)),e.x.assign(e.x.div(o)),e.assign(Al.x.lessThan(0).select(e.negate(),e)),Gi(Al.y.lessThan(0),(()=>{e.assign(e.sub(p))})).ElseIf(Al.y.greaterThan(1),(()=>{e.assign(e.add(p))})),e.assign(e.mul(hc)),e.assign(e.div(nh.w)),g.assign(Al.y.lessThan(.5).select(l,d)),e.assign(e.mul(g.w)),g.assign(g.add(tn(e,0,0)))}return g}))();const o=Vi((({p1:e,p2:t,p3:r,p4:s})=>{const i=e.sub(r),n=s.sub(r),a=t.sub(e),o=i.dot(n),u=n.dot(a),l=i.dot(a),d=n.dot(n),c=a.dot(a).mul(d).sub(u.mul(u)),h=o.mul(u).sub(l.mul(d)).div(c).clamp(),p=o.add(u.mul(h)).div(d).clamp();return qi(h,p)}));if(this.colorNode=Vi((()=>{const e=Uu();if(i){const t=this.dashSizeNode?$i(this.dashSizeNode):dc,r=this.gapSizeNode?$i(this.gapSizeNode):cc;$n.assign(t),Hn.assign(r);const s=Nn("float","lineDistance");e.y.lessThan(-1).or(e.y.greaterThan(1)).discard(),s.mod($n.add(Hn)).greaterThan($n).discard()}const a=$i(1).toVar("alpha");if(n){const e=Nn("vec3","worldStart"),s=Nn("vec3","worldEnd"),n=Nn("vec4","worldPos").xyz.normalize().mul(1e5),u=s.sub(e),l=o({p1:e,p2:s,p3:Qi(0,0,0),p4:n}),d=e.add(u.mul(l.x)),c=n.mul(l.y),h=d.sub(c).length().div(hc);if(!i)if(r&&t.samples>1){const e=h.fwidth();a.assign(Po(e.negate().add(.5),e.add(.5),h).oneMinus())}else h.greaterThan(.5).discard()}else if(r&&t.samples>1){const t=e.x,r=e.y.greaterThan(0).select(e.y.sub(1),e.y.add(1)),s=t.mul(t).add(r.mul(r)),i=$i(s.fwidth()).toVar("dlen");Gi(e.y.abs().greaterThan(1),(()=>{a.assign(Po(i.oneMinus(),i.add(1),s).oneMinus())}))}else Gi(e.y.abs().greaterThan(1),(()=>{const t=e.x,r=e.y.greaterThan(0).select(e.y.sub(1),e.y.add(1));t.mul(t).add(r.mul(r)).greaterThan(1).discard()}));let u;if(this.lineColorNode)u=this.lineColorNode;else if(s){const e=Vu("instanceColorStart"),t=Vu("instanceColorEnd");u=Al.y.lessThan(.5).select(e,t).mul(Dd)}else u=Dd;return tn(u,a)}))(),this.transparent){const e=this.opacityNode?$i(this.opacityNode):Od;this.outputNode=tn(this.colorNode.rgb.mul(e).add(Gh().rgb.mul(e.oneMinus())),this.colorNode.a)}super.setup(e)}get worldUnits(){return this._useWorldUnits}set worldUnits(e){this._useWorldUnits!==e&&(this._useWorldUnits=e,this.needsUpdate=!0)}get dashed(){return this._useDash}set dashed(e){this._useDash!==e&&(this._useDash=e,this.needsUpdate=!0)}get alphaToCoverage(){return this._useAlphaToCoverage}set alphaToCoverage(e){this._useAlphaToCoverage!==e&&(this._useAlphaToCoverage=e,this.needsUpdate=!0)}}const $h=e=>Pi(e).mul(.5).add(.5),Hh=new k;class Wh extends Fh{static get type(){return"MeshNormalNodeMaterial"}constructor(e){super(),this.isMeshNormalNodeMaterial=!0,this.setDefaultValues(Hh),this.setValues(e)}setupDiffuseColor(){const e=this.opacityNode?$i(this.opacityNode):Od;Sn.assign(ou(tn($h(zl),e),z))}}class jh extends js{static get type(){return"EquirectUVNode"}constructor(e=Pl){super("vec2"),this.dirNode=e}setup(){const e=this.dirNode,t=e.z.atan(e.x).mul(1/(2*Math.PI)).add(.5),r=e.y.clamp(-1,1).asin().mul(1/Math.PI).add(.5);return qi(t,r)}}const qh=Bi(jh).setParameterLength(0,1);class Xh extends ${constructor(e=1,t={}){super(e,t),this.isCubeRenderTarget=!0}fromEquirectangularTexture(e,t){const r=t.minFilter,s=t.generateMipmaps;t.generateMipmaps=!0,this.texture.type=t.type,this.texture.colorSpace=t.colorSpace,this.texture.generateMipmaps=t.generateMipmaps,this.texture.minFilter=t.minFilter,this.texture.magFilter=t.magFilter;const i=new H(5,5,5),n=qh(Pl),a=new Fh;a.colorNode=Hu(t,n,0),a.side=N,a.blending=G;const o=new W(i,a),u=new j;u.add(o),t.minFilter===B&&(t.minFilter=q);const l=new X(1,10,this),d=e.getMRT();return e.setMRT(null),l.update(e,u),e.setMRT(d),t.minFilter=r,t.currentGenerateMipmaps=s,o.geometry.dispose(),o.material.dispose(),this}}const Kh=new WeakMap;class Yh extends js{static get type(){return"CubeMapNode"}constructor(e){super("vec3"),this.envNode=e,this._cubeTexture=null,this._cubeTextureNode=sd(null);const t=new K;t.isRenderTargetTexture=!0,this._defaultTexture=t,this.updateBeforeType=Is.RENDER}updateBefore(e){const{renderer:t,material:r}=e,s=this.envNode;if(s.isTextureNode||s.isMaterialReferenceNode){const e=s.isTextureNode?s.value:r[s.property];if(e&&e.isTexture){const r=e.mapping;if(r===Y||r===Q){if(Kh.has(e)){const t=Kh.get(e);Zh(t,e.mapping),this._cubeTexture=t}else{const r=e.image;if(function(e){return null!=e&&e.height>0}(r)){const s=new Xh(r.height);s.fromEquirectangularTexture(t,e),Zh(s.texture,e.mapping),this._cubeTexture=s.texture,Kh.set(e,s.texture),e.addEventListener("dispose",Qh)}else this._cubeTexture=this._defaultTexture}this._cubeTextureNode.value=this._cubeTexture}else this._cubeTextureNode=this.envNode}}}setup(e){return this.updateBefore(e),this._cubeTextureNode}}function Qh(e){const t=e.target;t.removeEventListener("dispose",Qh);const r=Kh.get(t);void 0!==r&&(Kh.delete(t),r.dispose())}function Zh(e,t){t===Y?e.mapping=E:t===Q&&(e.mapping=w)}const Jh=Bi(Yh).setParameterLength(1);class ep extends Xc{static get type(){return"BasicEnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){e.context.environment=Jh(this.envNode)}}class tp extends Xc{static get type(){return"BasicLightMapNode"}constructor(e=null){super(),this.lightMapNode=e}setup(e){const t=$i(1/Math.PI);e.context.irradianceLightMap=this.lightMapNode.mul(t)}}class rp{start(e){e.lightsNode.setupLights(e,e.lightsNode.getLightNodes(e)),this.indirect(e)}finish(){}direct(){}directRectArea(){}indirect(){}ambientOcclusion(){}}class sp extends rp{constructor(){super()}indirect({context:e}){const t=e.ambientOcclusion,r=e.reflectedLight,s=e.irradianceLightMap;r.indirectDiffuse.assign(tn(0)),s?r.indirectDiffuse.addAssign(s):r.indirectDiffuse.addAssign(tn(1,1,1,0)),r.indirectDiffuse.mulAssign(t),r.indirectDiffuse.mulAssign(Sn.rgb)}finish(e){const{material:t,context:r}=e,s=r.outgoingLight,i=e.context.environment;if(i)switch(t.combine){case ee:s.rgb.assign(Ao(s.rgb,s.rgb.mul(i.rgb),$d.mul(Hd)));break;case J:s.rgb.assign(Ao(s.rgb,i.rgb,$d.mul(Hd)));break;case Z:s.rgb.addAssign(i.rgb.mul($d.mul(Hd)));break;default:console.warn("THREE.BasicLightingModel: Unsupported .combine value:",t.combine)}}}const ip=new te;class np extends Fh{static get type(){return"MeshBasicNodeMaterial"}constructor(e){super(),this.isMeshBasicNodeMaterial=!0,this.lights=!0,this.setDefaultValues(ip),this.setValues(e)}setupNormal(){return Gl}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new ep(t):null}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new tp(fc)),t}setupOutgoingLight(){return Sn.rgb}setupLightingModel(){return new sp}}const ap=Vi((({f0:e,f90:t,dotVH:r})=>{const s=r.mul(-5.55473).sub(6.98316).mul(r).exp2();return e.mul(s.oneMinus()).add(t.mul(s))})),op=Vi((e=>e.diffuseColor.mul(1/Math.PI))),up=Vi((({dotNH:e})=>kn.mul($i(.5)).add(1).mul($i(1/Math.PI)).mul(e.pow(kn)))),lp=Vi((({lightDirection:e})=>{const t=e.add(Fl).normalize(),r=zl.dot(t).clamp(),s=Fl.dot(t).clamp(),i=ap({f0:On,f90:1,dotVH:s}),n=$i(.25),a=up({dotNH:r});return i.mul(n).mul(a)}));class dp extends sp{constructor(e=!0){super(),this.specular=e}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=zl.dot(e).clamp().mul(t);r.directDiffuse.addAssign(s.mul(op({diffuseColor:Sn.rgb}))),!0===this.specular&&r.directSpecular.addAssign(s.mul(lp({lightDirection:e})).mul($d))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(op({diffuseColor:Sn}))),s.indirectDiffuse.mulAssign(t)}}const cp=new re;class hp extends Fh{static get type(){return"MeshLambertNodeMaterial"}constructor(e){super(),this.isMeshLambertNodeMaterial=!0,this.lights=!0,this.setDefaultValues(cp),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new ep(t):null}setupLightingModel(){return new dp(!1)}}const pp=new se;class gp extends Fh{static get type(){return"MeshPhongNodeMaterial"}constructor(e){super(),this.isMeshPhongNodeMaterial=!0,this.lights=!0,this.shininessNode=null,this.specularNode=null,this.setDefaultValues(pp),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new ep(t):null}setupLightingModel(){return new dp}setupVariants(){const e=(this.shininessNode?$i(this.shininessNode):Vd).max(1e-4);kn.assign(e);const t=this.specularNode||Gd;On.assign(t)}copy(e){return this.shininessNode=e.shininessNode,this.specularNode=e.specularNode,super.copy(e)}}const mp=Vi((e=>{if(!1===e.geometry.hasAttribute("normal"))return $i(0);const t=Gl.dFdx().abs().max(Gl.dFdy().abs());return t.x.max(t.y).max(t.z)})),fp=Vi((e=>{const{roughness:t}=e,r=mp();let s=t.max(.0525);return s=s.add(r),s=s.min(1),s})),yp=Vi((({alpha:e,dotNL:t,dotNV:r})=>{const s=e.pow2(),i=t.mul(s.add(s.oneMinus().mul(r.pow2())).sqrt()),n=r.mul(s.add(s.oneMinus().mul(t.pow2())).sqrt());return aa(.5,i.add(n).max(Aa))})).setLayout({name:"V_GGX_SmithCorrelated",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNL",type:"float"},{name:"dotNV",type:"float"}]}),xp=Vi((({alphaT:e,alphaB:t,dotTV:r,dotBV:s,dotTL:i,dotBL:n,dotNV:a,dotNL:o})=>{const u=o.mul(Qi(e.mul(r),t.mul(s),a).length()),l=a.mul(Qi(e.mul(i),t.mul(n),o).length());return aa(.5,u.add(l)).saturate()})).setLayout({name:"V_GGX_SmithCorrelated_Anisotropic",type:"float",inputs:[{name:"alphaT",type:"float",qualifier:"in"},{name:"alphaB",type:"float",qualifier:"in"},{name:"dotTV",type:"float",qualifier:"in"},{name:"dotBV",type:"float",qualifier:"in"},{name:"dotTL",type:"float",qualifier:"in"},{name:"dotBL",type:"float",qualifier:"in"},{name:"dotNV",type:"float",qualifier:"in"},{name:"dotNL",type:"float",qualifier:"in"}]}),bp=Vi((({alpha:e,dotNH:t})=>{const r=e.pow2(),s=t.pow2().mul(r.oneMinus()).oneMinus();return r.div(s.pow2()).mul(1/Math.PI)})).setLayout({name:"D_GGX",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNH",type:"float"}]}),Tp=$i(1/Math.PI),_p=Vi((({alphaT:e,alphaB:t,dotNH:r,dotTH:s,dotBH:i})=>{const n=e.mul(t),a=Qi(t.mul(s),e.mul(i),n.mul(r)),o=a.dot(a),u=n.div(o);return Tp.mul(n.mul(u.pow2()))})).setLayout({name:"D_GGX_Anisotropic",type:"float",inputs:[{name:"alphaT",type:"float",qualifier:"in"},{name:"alphaB",type:"float",qualifier:"in"},{name:"dotNH",type:"float",qualifier:"in"},{name:"dotTH",type:"float",qualifier:"in"},{name:"dotBH",type:"float",qualifier:"in"}]}),vp=Vi((e=>{const{lightDirection:t,f0:r,f90:s,roughness:i,f:n,USE_IRIDESCENCE:a,USE_ANISOTROPY:o}=e,u=e.normalView||zl,l=i.pow2(),d=t.add(Fl).normalize(),c=u.dot(t).clamp(),h=u.dot(Fl).clamp(),p=u.dot(d).clamp(),g=Fl.dot(d).clamp();let m,f,y=ap({f0:r,f90:s,dotVH:g});if(Ri(a)&&(y=Ln.mix(y,n)),Ri(o)){const e=Vn.dot(t),r=Vn.dot(Fl),s=Vn.dot(d),i=Un.dot(t),n=Un.dot(Fl),a=Un.dot(d);m=xp({alphaT:In,alphaB:l,dotTV:r,dotBV:n,dotTL:e,dotBL:i,dotNV:h,dotNL:c}),f=_p({alphaT:In,alphaB:l,dotNH:p,dotTH:s,dotBH:a})}else m=yp({alpha:l,dotNL:c,dotNV:h}),f=bp({alpha:l,dotNH:p});return y.mul(m).mul(f)})),Np=Vi((({roughness:e,dotNV:t})=>{const r=tn(-1,-.0275,-.572,.022),s=tn(1,.0425,1.04,-.04),i=e.mul(r).add(s),n=i.x.mul(i.x).min(t.mul(-9.28).exp2()).mul(i.x).add(i.y);return qi(-1.04,1.04).mul(n).add(i.zw)})).setLayout({name:"DFGApprox",type:"vec2",inputs:[{name:"roughness",type:"float"},{name:"dotNV",type:"vec3"}]}),Sp=Vi((e=>{const{dotNV:t,specularColor:r,specularF90:s,roughness:i}=e,n=Np({dotNV:t,roughness:i});return r.mul(n.x).add(s.mul(n.y))})),Ep=Vi((({f:e,f90:t,dotVH:r})=>{const s=r.oneMinus().saturate(),i=s.mul(s),n=s.mul(i,i).clamp(0,.9999);return e.sub(Qi(t).mul(n)).div(n.oneMinus())})).setLayout({name:"Schlick_to_F0",type:"vec3",inputs:[{name:"f",type:"vec3"},{name:"f90",type:"float"},{name:"dotVH",type:"float"}]}),wp=Vi((({roughness:e,dotNH:t})=>{const r=e.pow2(),s=$i(1).div(r),i=t.pow2().oneMinus().max(.0078125);return $i(2).add(s).mul(i.pow(s.mul(.5))).div(2*Math.PI)})).setLayout({name:"D_Charlie",type:"float",inputs:[{name:"roughness",type:"float"},{name:"dotNH",type:"float"}]}),Ap=Vi((({dotNV:e,dotNL:t})=>$i(1).div($i(4).mul(t.add(e).sub(t.mul(e)))))).setLayout({name:"V_Neubelt",type:"float",inputs:[{name:"dotNV",type:"float"},{name:"dotNL",type:"float"}]}),Rp=Vi((({lightDirection:e})=>{const t=e.add(Fl).normalize(),r=zl.dot(e).clamp(),s=zl.dot(Fl).clamp(),i=zl.dot(t).clamp(),n=wp({roughness:Pn,dotNH:i}),a=Ap({dotNV:s,dotNL:r});return Mn.mul(n).mul(a)})),Cp=Vi((({N:e,V:t,roughness:r})=>{const s=e.dot(t).saturate(),i=qi(r,s.oneMinus().sqrt());return i.assign(i.mul(.984375).add(.0078125)),i})).setLayout({name:"LTC_Uv",type:"vec2",inputs:[{name:"N",type:"vec3"},{name:"V",type:"vec3"},{name:"roughness",type:"float"}]}),Mp=Vi((({f:e})=>{const t=e.length();return po(t.mul(t).add(e.z).div(t.add(1)),0)})).setLayout({name:"LTC_ClippedSphereFormFactor",type:"float",inputs:[{name:"f",type:"vec3"}]}),Pp=Vi((({v1:e,v2:t})=>{const r=e.dot(t),s=r.abs().toVar(),i=s.mul(.0145206).add(.4965155).mul(s).add(.8543985).toVar(),n=s.add(4.1616724).mul(s).add(3.417594).toVar(),a=i.div(n),o=r.greaterThan(0).select(a,po(r.mul(r).oneMinus(),1e-7).inverseSqrt().mul(.5).sub(a));return e.cross(t).mul(o)})).setLayout({name:"LTC_EdgeVectorFormFactor",type:"vec3",inputs:[{name:"v1",type:"vec3"},{name:"v2",type:"vec3"}]}),Lp=Vi((({N:e,V:t,P:r,mInv:s,p0:i,p1:n,p2:a,p3:o})=>{const u=n.sub(i).toVar(),l=o.sub(i).toVar(),d=u.cross(l),c=Qi().toVar();return Gi(d.dot(r.sub(i)).greaterThanEqual(0),(()=>{const u=t.sub(e.mul(t.dot(e))).normalize(),l=e.cross(u).negate(),d=s.mul(on(u,l,e).transpose()).toVar(),h=d.mul(i.sub(r)).normalize().toVar(),p=d.mul(n.sub(r)).normalize().toVar(),g=d.mul(a.sub(r)).normalize().toVar(),m=d.mul(o.sub(r)).normalize().toVar(),f=Qi(0).toVar();f.addAssign(Pp({v1:h,v2:p})),f.addAssign(Pp({v1:p,v2:g})),f.addAssign(Pp({v1:g,v2:m})),f.addAssign(Pp({v1:m,v2:h})),c.assign(Qi(Mp({f:f})))})),c})).setLayout({name:"LTC_Evaluate",type:"vec3",inputs:[{name:"N",type:"vec3"},{name:"V",type:"vec3"},{name:"P",type:"vec3"},{name:"mInv",type:"mat3"},{name:"p0",type:"vec3"},{name:"p1",type:"vec3"},{name:"p2",type:"vec3"},{name:"p3",type:"vec3"}]}),Fp=Vi((({P:e,p0:t,p1:r,p2:s,p3:i})=>{const n=r.sub(t).toVar(),a=i.sub(t).toVar(),o=n.cross(a),u=Qi().toVar();return Gi(o.dot(e.sub(t)).greaterThanEqual(0),(()=>{const n=t.sub(e).normalize().toVar(),a=r.sub(e).normalize().toVar(),o=s.sub(e).normalize().toVar(),l=i.sub(e).normalize().toVar(),d=Qi(0).toVar();d.addAssign(Pp({v1:n,v2:a})),d.addAssign(Pp({v1:a,v2:o})),d.addAssign(Pp({v1:o,v2:l})),d.addAssign(Pp({v1:l,v2:n})),u.assign(Qi(Mp({f:d.abs()})))})),u})).setLayout({name:"LTC_Evaluate",type:"vec3",inputs:[{name:"P",type:"vec3"},{name:"p0",type:"vec3"},{name:"p1",type:"vec3"},{name:"p2",type:"vec3"},{name:"p3",type:"vec3"}]}),Bp=1/6,Ip=e=>na(Bp,na(e,na(e,e.negate().add(3)).sub(3)).add(1)),Dp=e=>na(Bp,na(e,na(e,na(3,e).sub(6))).add(4)),Vp=e=>na(Bp,na(e,na(e,na(-3,e).add(3)).add(3)).add(1)),Up=e=>na(Bp,To(e,3)),Op=e=>Ip(e).add(Dp(e)),Gp=e=>Vp(e).add(Up(e)),kp=e=>sa(-1,Dp(e).div(Ip(e).add(Dp(e)))),zp=e=>sa(1,Up(e).div(Vp(e).add(Up(e)))),$p=(e,t,r)=>{const s=e.uvNode,i=na(s,t.zw).add(.5),n=ka(i),a=Ha(i),o=Op(a.x),u=Gp(a.x),l=kp(a.x),d=zp(a.x),c=kp(a.y),h=zp(a.y),p=qi(n.x.add(l),n.y.add(c)).sub(.5).mul(t.xy),g=qi(n.x.add(d),n.y.add(c)).sub(.5).mul(t.xy),m=qi(n.x.add(l),n.y.add(h)).sub(.5).mul(t.xy),f=qi(n.x.add(d),n.y.add(h)).sub(.5).mul(t.xy),y=Op(a.y).mul(sa(o.mul(e.sample(p).level(r)),u.mul(e.sample(g).level(r)))),x=Gp(a.y).mul(sa(o.mul(e.sample(m).level(r)),u.mul(e.sample(f).level(r))));return y.add(x)},Hp=Vi((([e,t=$i(3)])=>{const r=qi(e.size(Hi(t))),s=qi(e.size(Hi(t.add(1)))),i=aa(1,r),n=aa(1,s),a=$p(e,tn(i,r),ka(t)),o=$p(e,tn(n,s),za(t));return Ha(t).mix(a,o)})),Wp=Vi((([e,t,r,s,i])=>{const n=Qi(Mo(t.negate(),$a(e),aa(1,s))),a=Qi(Ja(i[0].xyz),Ja(i[1].xyz),Ja(i[2].xyz));return $a(n).mul(r.mul(a))})).setLayout({name:"getVolumeTransmissionRay",type:"vec3",inputs:[{name:"n",type:"vec3"},{name:"v",type:"vec3"},{name:"thickness",type:"float"},{name:"ior",type:"float"},{name:"modelMatrix",type:"mat4"}]}),jp=Vi((([e,t])=>e.mul(Ro(t.mul(2).sub(2),0,1)))).setLayout({name:"applyIorToRoughness",type:"float",inputs:[{name:"roughness",type:"float"},{name:"ior",type:"float"}]}),qp=mh(),Xp=mh(),Kp=Vi((([e,t,r],{material:s})=>{const i=(s.side===N?qp:Xp).sample(e),n=Ua(sh.x).mul(jp(t,r));return Hp(i,n)})),Yp=Vi((([e,t,r])=>(Gi(r.notEqual(0),(()=>{const s=Va(t).negate().div(r);return Ia(s.negate().mul(e))})),Qi(1)))).setLayout({name:"volumeAttenuation",type:"vec3",inputs:[{name:"transmissionDistance",type:"float"},{name:"attenuationColor",type:"vec3"},{name:"attenuationDistance",type:"float"}]}),Qp=Vi((([e,t,r,s,i,n,a,o,u,l,d,c,h,p,g])=>{let m,f;if(g){m=tn().toVar(),f=Qi().toVar();const i=d.sub(1).mul(g.mul(.025)),n=Qi(d.sub(i),d,d.add(i));kc({start:0,end:3},(({i:i})=>{const d=n.element(i),g=Wp(e,t,c,d,o),y=a.add(g),x=l.mul(u.mul(tn(y,1))),b=qi(x.xy.div(x.w)).toVar();b.addAssign(1),b.divAssign(2),b.assign(qi(b.x,b.y.oneMinus()));const T=Kp(b,r,d);m.element(i).assign(T.element(i)),m.a.addAssign(T.a),f.element(i).assign(s.element(i).mul(Yp(Ja(g),h,p).element(i)))})),m.a.divAssign(3)}else{const i=Wp(e,t,c,d,o),n=a.add(i),g=l.mul(u.mul(tn(n,1))),y=qi(g.xy.div(g.w)).toVar();y.addAssign(1),y.divAssign(2),y.assign(qi(y.x,y.y.oneMinus())),m=Kp(y,r,d),f=s.mul(Yp(Ja(i),h,p))}const y=f.rgb.mul(m.rgb),x=e.dot(t).clamp(),b=Qi(Sp({dotNV:x,specularColor:i,specularF90:n,roughness:r})),T=f.r.add(f.g,f.b).div(3);return tn(b.oneMinus().mul(y),m.a.oneMinus().mul(T).oneMinus())})),Zp=on(3.2404542,-.969266,.0556434,-1.5371385,1.8760108,-.2040259,-.4985314,.041556,1.0572252),Jp=(e,t)=>e.sub(t).div(e.add(t)).pow2(),eg=Vi((({outsideIOR:e,eta2:t,cosTheta1:r,thinFilmThickness:s,baseF0:i})=>{const n=Ao(e,t,Po(0,.03,s)),a=e.div(n).pow2().mul(r.pow2().oneMinus()).oneMinus();Gi(a.lessThan(0),(()=>Qi(1)));const o=a.sqrt(),u=Jp(n,e),l=ap({f0:u,f90:1,dotVH:r}),d=l.oneMinus(),c=n.lessThan(e).select(Math.PI,0),h=$i(Math.PI).sub(c),p=(e=>{const t=e.sqrt();return Qi(1).add(t).div(Qi(1).sub(t))})(i.clamp(0,.9999)),g=Jp(p,n.toVec3()),m=ap({f0:g,f90:1,dotVH:o}),f=Qi(p.x.lessThan(n).select(Math.PI,0),p.y.lessThan(n).select(Math.PI,0),p.z.lessThan(n).select(Math.PI,0)),y=n.mul(s,o,2),x=Qi(h).add(f),b=l.mul(m).clamp(1e-5,.9999),T=b.sqrt(),_=d.pow2().mul(m).div(Qi(1).sub(b)),v=l.add(_).toVar(),N=_.sub(d).toVar();return kc({start:1,end:2,condition:"<=",name:"m"},(({m:e})=>{N.mulAssign(T);const t=((e,t)=>{const r=e.mul(2*Math.PI*1e-9),s=Qi(54856e-17,44201e-17,52481e-17),i=Qi(1681e3,1795300,2208400),n=Qi(43278e5,93046e5,66121e5),a=$i(9747e-17*Math.sqrt(2*Math.PI*45282e5)).mul(r.mul(2239900).add(t.x).cos()).mul(r.pow2().mul(-45282e5).exp());let o=s.mul(n.mul(2*Math.PI).sqrt()).mul(i.mul(r).add(t).cos()).mul(r.pow2().negate().mul(n).exp());return o=Qi(o.x.add(a),o.y,o.z).div(1.0685e-7),Zp.mul(o)})($i(e).mul(y),$i(e).mul(x)).mul(2);v.addAssign(N.mul(t))})),v.max(Qi(0))})).setLayout({name:"evalIridescence",type:"vec3",inputs:[{name:"outsideIOR",type:"float"},{name:"eta2",type:"float"},{name:"cosTheta1",type:"float"},{name:"thinFilmThickness",type:"float"},{name:"baseF0",type:"vec3"}]}),tg=Vi((({normal:e,viewDir:t,roughness:r})=>{const s=e.dot(t).saturate(),i=r.pow2(),n=Go(r.lessThan(.25),$i(-339.2).mul(i).add($i(161.4).mul(r)).sub(25.9),$i(-8.48).mul(i).add($i(14.3).mul(r)).sub(9.95)),a=Go(r.lessThan(.25),$i(44).mul(i).sub($i(23.7).mul(r)).add(3.26),$i(1.97).mul(i).sub($i(3.27).mul(r)).add(.72));return Go(r.lessThan(.25),0,$i(.1).mul(r).sub(.025)).add(n.mul(s).add(a).exp()).mul(1/Math.PI).saturate()})),rg=Qi(.04),sg=$i(1);class ig extends rp{constructor(e=!1,t=!1,r=!1,s=!1,i=!1,n=!1){super(),this.clearcoat=e,this.sheen=t,this.iridescence=r,this.anisotropy=s,this.transmission=i,this.dispersion=n,this.clearcoatRadiance=null,this.clearcoatSpecularDirect=null,this.clearcoatSpecularIndirect=null,this.sheenSpecularDirect=null,this.sheenSpecularIndirect=null,this.iridescenceFresnel=null,this.iridescenceF0=null}start(e){if(!0===this.clearcoat&&(this.clearcoatRadiance=Qi().toVar("clearcoatRadiance"),this.clearcoatSpecularDirect=Qi().toVar("clearcoatSpecularDirect"),this.clearcoatSpecularIndirect=Qi().toVar("clearcoatSpecularIndirect")),!0===this.sheen&&(this.sheenSpecularDirect=Qi().toVar("sheenSpecularDirect"),this.sheenSpecularIndirect=Qi().toVar("sheenSpecularIndirect")),!0===this.iridescence){const e=zl.dot(Fl).clamp();this.iridescenceFresnel=eg({outsideIOR:$i(1),eta2:Fn,cosTheta1:e,thinFilmThickness:Bn,baseF0:On}),this.iridescenceF0=Ep({f:this.iridescenceFresnel,f90:1,dotVH:e})}if(!0===this.transmission){const t=Ml,r=nl.sub(Ml).normalize(),s=$l,i=e.context;i.backdrop=Qp(s,r,wn,Sn,On,Gn,t,fl,rl,el,jn,Xn,Yn,Kn,this.dispersion?Qn:null),i.backdropAlpha=qn,Sn.a.mulAssign(Ao(1,i.backdrop.a,qn))}super.start(e)}computeMultiscattering(e,t,r){const s=zl.dot(Fl).clamp(),i=Np({roughness:wn,dotNV:s}),n=(this.iridescenceF0?Ln.mix(On,this.iridescenceF0):On).mul(i.x).add(r.mul(i.y)),a=i.x.add(i.y).oneMinus(),o=On.add(On.oneMinus().mul(.047619)),u=n.mul(o).div(a.mul(o).oneMinus());e.addAssign(n),t.addAssign(u.mul(a))}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=zl.dot(e).clamp().mul(t);if(!0===this.sheen&&this.sheenSpecularDirect.addAssign(s.mul(Rp({lightDirection:e}))),!0===this.clearcoat){const r=Hl.dot(e).clamp().mul(t);this.clearcoatSpecularDirect.addAssign(r.mul(vp({lightDirection:e,f0:rg,f90:sg,roughness:Cn,normalView:Hl})))}r.directDiffuse.addAssign(s.mul(op({diffuseColor:Sn.rgb}))),r.directSpecular.addAssign(s.mul(vp({lightDirection:e,f0:On,f90:1,roughness:wn,iridescence:this.iridescence,f:this.iridescenceFresnel,USE_IRIDESCENCE:this.iridescence,USE_ANISOTROPY:this.anisotropy})))}directRectArea({lightColor:e,lightPosition:t,halfWidth:r,halfHeight:s,reflectedLight:i,ltc_1:n,ltc_2:a}){const o=t.add(r).sub(s),u=t.sub(r).sub(s),l=t.sub(r).add(s),d=t.add(r).add(s),c=zl,h=Fl,p=Ll.toVar(),g=Cp({N:c,V:h,roughness:wn}),m=n.sample(g).toVar(),f=a.sample(g).toVar(),y=on(Qi(m.x,0,m.y),Qi(0,1,0),Qi(m.z,0,m.w)).toVar(),x=On.mul(f.x).add(On.oneMinus().mul(f.y)).toVar();i.directSpecular.addAssign(e.mul(x).mul(Lp({N:c,V:h,P:p,mInv:y,p0:o,p1:u,p2:l,p3:d}))),i.directDiffuse.addAssign(e.mul(Sn).mul(Lp({N:c,V:h,P:p,mInv:on(1,0,0,0,1,0,0,0,1),p0:o,p1:u,p2:l,p3:d})))}indirect(e){this.indirectDiffuse(e),this.indirectSpecular(e),this.ambientOcclusion(e)}indirectDiffuse(e){const{irradiance:t,reflectedLight:r}=e.context;r.indirectDiffuse.addAssign(t.mul(op({diffuseColor:Sn})))}indirectSpecular(e){const{radiance:t,iblIrradiance:r,reflectedLight:s}=e.context;if(!0===this.sheen&&this.sheenSpecularIndirect.addAssign(r.mul(Mn,tg({normal:zl,viewDir:Fl,roughness:Pn}))),!0===this.clearcoat){const e=Hl.dot(Fl).clamp(),t=Sp({dotNV:e,specularColor:rg,specularF90:sg,roughness:Cn});this.clearcoatSpecularIndirect.addAssign(this.clearcoatRadiance.mul(t))}const i=Qi().toVar("singleScattering"),n=Qi().toVar("multiScattering"),a=r.mul(1/Math.PI);this.computeMultiscattering(i,n,Gn);const o=i.add(n),u=Sn.mul(o.r.max(o.g).max(o.b).oneMinus());s.indirectSpecular.addAssign(t.mul(i)),s.indirectSpecular.addAssign(n.mul(a)),s.indirectDiffuse.addAssign(u.mul(a))}ambientOcclusion(e){const{ambientOcclusion:t,reflectedLight:r}=e.context,s=zl.dot(Fl).clamp().add(t),i=wn.mul(-16).oneMinus().negate().exp2(),n=t.sub(s.pow(i).oneMinus()).clamp();!0===this.clearcoat&&this.clearcoatSpecularIndirect.mulAssign(t),!0===this.sheen&&this.sheenSpecularIndirect.mulAssign(t),r.indirectDiffuse.mulAssign(t),r.indirectSpecular.mulAssign(n)}finish({context:e}){const{outgoingLight:t}=e;if(!0===this.clearcoat){const e=Hl.dot(Fl).clamp(),r=ap({dotVH:e,f0:rg,f90:sg}),s=t.mul(Rn.mul(r).oneMinus()).add(this.clearcoatSpecularDirect.add(this.clearcoatSpecularIndirect).mul(Rn));t.assign(s)}if(!0===this.sheen){const e=Mn.r.max(Mn.g).max(Mn.b).mul(.157).oneMinus(),r=t.mul(e).add(this.sheenSpecularDirect,this.sheenSpecularIndirect);t.assign(r)}}}const ng=$i(1),ag=$i(-2),og=$i(.8),ug=$i(-1),lg=$i(.4),dg=$i(2),cg=$i(.305),hg=$i(3),pg=$i(.21),gg=$i(4),mg=$i(4),fg=$i(16),yg=Vi((([e])=>{const t=Qi(Qa(e)).toVar(),r=$i(-1).toVar();return Gi(t.x.greaterThan(t.z),(()=>{Gi(t.x.greaterThan(t.y),(()=>{r.assign(Go(e.x.greaterThan(0),0,3))})).Else((()=>{r.assign(Go(e.y.greaterThan(0),1,4))}))})).Else((()=>{Gi(t.z.greaterThan(t.y),(()=>{r.assign(Go(e.z.greaterThan(0),2,5))})).Else((()=>{r.assign(Go(e.y.greaterThan(0),1,4))}))})),r})).setLayout({name:"getFace",type:"float",inputs:[{name:"direction",type:"vec3"}]}),xg=Vi((([e,t])=>{const r=qi().toVar();return Gi(t.equal(0),(()=>{r.assign(qi(e.z,e.y).div(Qa(e.x)))})).ElseIf(t.equal(1),(()=>{r.assign(qi(e.x.negate(),e.z.negate()).div(Qa(e.y)))})).ElseIf(t.equal(2),(()=>{r.assign(qi(e.x.negate(),e.y).div(Qa(e.z)))})).ElseIf(t.equal(3),(()=>{r.assign(qi(e.z.negate(),e.y).div(Qa(e.x)))})).ElseIf(t.equal(4),(()=>{r.assign(qi(e.x.negate(),e.z).div(Qa(e.y)))})).Else((()=>{r.assign(qi(e.x,e.y).div(Qa(e.z)))})),na(.5,r.add(1))})).setLayout({name:"getUV",type:"vec2",inputs:[{name:"direction",type:"vec3"},{name:"face",type:"float"}]}),bg=Vi((([e])=>{const t=$i(0).toVar();return Gi(e.greaterThanEqual(og),(()=>{t.assign(ng.sub(e).mul(ug.sub(ag)).div(ng.sub(og)).add(ag))})).ElseIf(e.greaterThanEqual(lg),(()=>{t.assign(og.sub(e).mul(dg.sub(ug)).div(og.sub(lg)).add(ug))})).ElseIf(e.greaterThanEqual(cg),(()=>{t.assign(lg.sub(e).mul(hg.sub(dg)).div(lg.sub(cg)).add(dg))})).ElseIf(e.greaterThanEqual(pg),(()=>{t.assign(cg.sub(e).mul(gg.sub(hg)).div(cg.sub(pg)).add(hg))})).Else((()=>{t.assign($i(-2).mul(Ua(na(1.16,e))))})),t})).setLayout({name:"roughnessToMip",type:"float",inputs:[{name:"roughness",type:"float"}]}),Tg=Vi((([e,t])=>{const r=e.toVar();r.assign(na(2,r).sub(1));const s=Qi(r,1).toVar();return Gi(t.equal(0),(()=>{s.assign(s.zyx)})).ElseIf(t.equal(1),(()=>{s.assign(s.xzy),s.xz.mulAssign(-1)})).ElseIf(t.equal(2),(()=>{s.x.mulAssign(-1)})).ElseIf(t.equal(3),(()=>{s.assign(s.zyx),s.xz.mulAssign(-1)})).ElseIf(t.equal(4),(()=>{s.assign(s.xzy),s.xy.mulAssign(-1)})).ElseIf(t.equal(5),(()=>{s.z.mulAssign(-1)})),s})).setLayout({name:"getDirection",type:"vec3",inputs:[{name:"uv",type:"vec2"},{name:"face",type:"float"}]}),_g=Vi((([e,t,r,s,i,n])=>{const a=$i(r),o=Qi(t),u=Ro(bg(a),ag,n),l=Ha(u),d=ka(u),c=Qi(vg(e,o,d,s,i,n)).toVar();return Gi(l.notEqual(0),(()=>{const t=Qi(vg(e,o,d.add(1),s,i,n)).toVar();c.assign(Ao(c,t,l))})),c})),vg=Vi((([e,t,r,s,i,n])=>{const a=$i(r).toVar(),o=Qi(t),u=$i(yg(o)).toVar(),l=$i(po(mg.sub(a),0)).toVar();a.assign(po(a,mg));const d=$i(Da(a)).toVar(),c=qi(xg(o,u).mul(d.sub(2)).add(1)).toVar();return Gi(u.greaterThan(2),(()=>{c.y.addAssign(d),u.subAssign(3)})),c.x.addAssign(u.mul(d)),c.x.addAssign(l.mul(na(3,fg))),c.y.addAssign(na(4,Da(n).sub(d))),c.x.mulAssign(s),c.y.mulAssign(i),e.sample(c).grad(qi(),qi())})),Ng=Vi((({envMap:e,mipInt:t,outputDirection:r,theta:s,axis:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:a,CUBEUV_MAX_MIP:o})=>{const u=ja(s),l=r.mul(u).add(i.cross(r).mul(Wa(s))).add(i.mul(i.dot(r).mul(u.oneMinus())));return vg(e,l,t,n,a,o)})),Sg=Vi((({n:e,latitudinal:t,poleAxis:r,outputDirection:s,weights:i,samples:n,dTheta:a,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})=>{const h=Qi(Go(t,r,bo(r,s))).toVar();Gi(h.equal(Qi(0)),(()=>{h.assign(Qi(s.z,0,s.x.negate()))})),h.assign($a(h));const p=Qi().toVar();return p.addAssign(i.element(0).mul(Ng({theta:0,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),kc({start:Hi(1),end:e},(({i:e})=>{Gi(e.greaterThanEqual(n),(()=>{zc()}));const t=$i(a.mul($i(e))).toVar();p.addAssign(i.element(e).mul(Ng({theta:t.mul(-1),axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),p.addAssign(i.element(e).mul(Ng({theta:t,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})))})),tn(p,1)})),Eg=[.125,.215,.35,.446,.526,.582],wg=20,Ag=new ie(-1,1,1,-1,0,1),Rg=new ne(90,1),Cg=new e;let Mg=null,Pg=0,Lg=0;const Fg=(1+Math.sqrt(5))/2,Bg=1/Fg,Ig=[new r(-Fg,Bg,0),new r(Fg,Bg,0),new r(-Bg,0,Fg),new r(Bg,0,Fg),new r(0,Fg,-Bg),new r(0,Fg,Bg),new r(-1,1,-1),new r(1,1,-1),new r(-1,1,1),new r(1,1,1)],Dg=new r,Vg=new WeakMap,Ug=[3,1,5,0,4,2],Og=Tg(Uu(),Vu("faceIndex")).normalize(),Gg=Qi(Og.x,Og.y,Og.z);class kg{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._lodPlanes=[],this._sizeLods=[],this._sigmas=[],this._lodMeshes=[],this._blurMaterial=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._backgroundBox=null}get _hasInitialized(){return this._renderer.hasInitialized()}fromScene(e,t=0,r=.1,s=100,i={}){const{size:n=256,position:a=Dg,renderTarget:o=null}=i;if(this._setSize(n),!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromScene() called before the backend is initialized. Try using .fromSceneAsync() instead.");const n=o||this._allocateTargets();return i.renderTarget=n,this.fromSceneAsync(e,t,r,s,i),n}Mg=this._renderer.getRenderTarget(),Pg=this._renderer.getActiveCubeFace(),Lg=this._renderer.getActiveMipmapLevel();const u=o||this._allocateTargets();return u.depthBuffer=!0,this._sceneToCubeUV(e,r,s,u,a),t>0&&this._blur(u,0,0,t),this._applyPMREM(u),this._cleanup(u),u}async fromSceneAsync(e,t=0,r=.1,s=100,i={}){return!1===this._hasInitialized&&await this._renderer.init(),this.fromScene(e,t,r,s,i)}fromEquirectangular(e,t=null){if(!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromEquirectangular() called before the backend is initialized. Try using .fromEquirectangularAsync() instead."),this._setSizeFromTexture(e);const r=t||this._allocateTargets();return this.fromEquirectangularAsync(e,r),r}return this._fromTexture(e,t)}async fromEquirectangularAsync(e,t=null){return!1===this._hasInitialized&&await this._renderer.init(),this._fromTexture(e,t)}fromCubemap(e,t=null){if(!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromCubemap() called before the backend is initialized. Try using .fromCubemapAsync() instead."),this._setSizeFromTexture(e);const r=t||this._allocateTargets();return this.fromCubemapAsync(e,t),r}return this._fromTexture(e,t)}async fromCubemapAsync(e,t=null){return!1===this._hasInitialized&&await this._renderer.init(),this._fromTexture(e,t)}async compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=Wg(),await this._compileMaterial(this._cubemapMaterial))}async compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=jg(),await this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),null!==this._cubemapMaterial&&this._cubemapMaterial.dispose(),null!==this._equirectMaterial&&this._equirectMaterial.dispose(),null!==this._backgroundBox&&(this._backgroundBox.geometry.dispose(),this._backgroundBox.material.dispose())}_setSizeFromTexture(e){e.mapping===E||e.mapping===w?this._setSize(0===e.image.length?16:e.image[0].width||e.image[0].image.width):this._setSize(e.image.width/4)}_setSize(e){this._lodMax=Math.floor(Math.log2(e)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){null!==this._blurMaterial&&this._blurMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;ee-4?u=Eg[o-e+4-1]:0===o&&(u=0),s.push(u);const l=1/(a-2),d=-l,c=1+l,h=[d,d,c,d,c,c,d,d,c,c,d,c],p=6,g=6,m=3,f=2,y=1,x=new Float32Array(m*g*p),b=new Float32Array(f*g*p),T=new Float32Array(y*g*p);for(let e=0;e2?0:-1,s=[t,r,0,t+2/3,r,0,t+2/3,r+1,0,t,r,0,t+2/3,r+1,0,t,r+1,0],i=Ug[e];x.set(s,m*g*i),b.set(h,f*g*i);const n=[i,i,i,i,i,i];T.set(n,y*g*i)}const _=new ue;_.setAttribute("position",new le(x,m)),_.setAttribute("uv",new le(b,f)),_.setAttribute("faceIndex",new le(T,y)),t.push(_),i.push(new W(_,null)),n>4&&n--}return{lodPlanes:t,sizeLods:r,sigmas:s,lodMeshes:i}}(i)),this._blurMaterial=function(e,t,s){const i=Yu(new Array(wg).fill(0)),n=Tn(new r(0,1,0)),a=Tn(0),o=$i(wg),u=Tn(0),l=Tn(1),d=Hu(null),c=Tn(0),h=$i(1/t),p=$i(1/s),g=$i(e),m={n:o,latitudinal:u,weights:i,poleAxis:n,outputDirection:Gg,dTheta:a,samples:l,envMap:d,mipInt:c,CUBEUV_TEXEL_WIDTH:h,CUBEUV_TEXEL_HEIGHT:p,CUBEUV_MAX_MIP:g},f=Hg("blur");return f.fragmentNode=Sg({...m,latitudinal:u.equal(1)}),Vg.set(f,m),f}(i,e,t)}return i}async _compileMaterial(e){const t=new W(this._lodPlanes[0],e);await this._renderer.compile(t,Ag)}_sceneToCubeUV(e,t,r,s,i){const n=Rg;n.near=t,n.far=r;const a=[1,1,1,1,-1,1],o=[1,-1,1,-1,1,-1],u=this._renderer,l=u.autoClear;u.getClearColor(Cg),u.autoClear=!1;let d=this._backgroundBox;if(null===d){const e=new te({name:"PMREM.Background",side:N,depthWrite:!1,depthTest:!1});d=new W(new H,e)}let c=!1;const h=e.background;h?h.isColor&&(d.material.color.copy(h),e.background=null,c=!0):(d.material.color.copy(Cg),c=!0),u.setRenderTarget(s),u.clear(),c&&u.render(d,n);for(let t=0;t<6;t++){const r=t%3;0===r?(n.up.set(0,a[t],0),n.position.set(i.x,i.y,i.z),n.lookAt(i.x+o[t],i.y,i.z)):1===r?(n.up.set(0,0,a[t]),n.position.set(i.x,i.y,i.z),n.lookAt(i.x,i.y+o[t],i.z)):(n.up.set(0,a[t],0),n.position.set(i.x,i.y,i.z),n.lookAt(i.x,i.y,i.z+o[t]));const l=this._cubeSize;$g(s,r*l,t>2?l:0,l,l),u.render(e,n)}u.autoClear=l,e.background=h}_textureToCubeUV(e,t){const r=this._renderer,s=e.mapping===E||e.mapping===w;s?null===this._cubemapMaterial&&(this._cubemapMaterial=Wg(e)):null===this._equirectMaterial&&(this._equirectMaterial=jg(e));const i=s?this._cubemapMaterial:this._equirectMaterial;i.fragmentNode.value=e;const n=this._lodMeshes[0];n.material=i;const a=this._cubeSize;$g(t,0,0,3*a,2*a),r.setRenderTarget(t),r.render(n,Ag)}_applyPMREM(e){const t=this._renderer,r=t.autoClear;t.autoClear=!1;const s=this._lodPlanes.length;for(let t=1;twg&&console.warn(`sigmaRadians, ${i}, is too large and will clip, as it requested ${g} samples when the maximum is set to 20`);const m=[];let f=0;for(let e=0;ey-4?s-y+4:0),4*(this._cubeSize-x),3*x,2*x),o.setRenderTarget(t),o.render(l,Ag)}}function zg(e,t,r){const s=new ae(e,t,r);return s.texture.mapping=oe,s.texture.name="PMREM.cubeUv",s.texture.isPMREMTexture=!0,s.scissorTest=!0,s}function $g(e,t,r,s,i){e.viewport.set(t,r,s,i),e.scissor.set(t,r,s,i)}function Hg(e){const t=new Fh;return t.depthTest=!1,t.depthWrite=!1,t.blending=G,t.name=`PMREM_${e}`,t}function Wg(e){const t=Hg("cubemap");return t.fragmentNode=sd(e,Gg),t}function jg(e){const t=Hg("equirect");return t.fragmentNode=Hu(e,qh(Gg),0),t}const qg=new WeakMap;function Xg(e,t,r){const s=function(e){let t=qg.get(e);void 0===t&&(t=new WeakMap,qg.set(e,t));return t}(t);let i=s.get(e);if((void 0!==i?i.pmremVersion:-1)!==e.pmremVersion){const t=e.image;if(e.isCubeTexture){if(!function(e){if(null==e)return!1;let t=0;const r=6;for(let s=0;s0}(t))return null;i=r.fromEquirectangular(e,i)}i.pmremVersion=e.pmremVersion,s.set(e,i)}return i.texture}class Kg extends js{static get type(){return"PMREMNode"}constructor(e,t=null,r=null){super("vec3"),this._value=e,this._pmrem=null,this.uvNode=t,this.levelNode=r,this._generator=null;const s=new pe;s.isRenderTargetTexture=!0,this._texture=Hu(s),this._width=Tn(0),this._height=Tn(0),this._maxMip=Tn(0),this.updateBeforeType=Is.RENDER}set value(e){this._value=e,this._pmrem=null}get value(){return this._value}updateFromTexture(e){const t=function(e){const t=Math.log2(e)-2,r=1/e;return{texelWidth:1/(3*Math.max(Math.pow(2,t),112)),texelHeight:r,maxMip:t}}(e.image.height);this._texture.value=e,this._width.value=t.texelWidth,this._height.value=t.texelHeight,this._maxMip.value=t.maxMip}updateBefore(e){let t=this._pmrem;const r=t?t.pmremVersion:-1,s=this._value;r!==s.pmremVersion&&(t=!0===s.isPMREMTexture?s:Xg(s,e.renderer,this._generator),null!==t&&(this._pmrem=t,this.updateFromTexture(t)))}setup(e){null===this._generator&&(this._generator=new kg(e.renderer)),this.updateBefore(e);let t=this.uvNode;null===t&&e.context.getUV&&(t=e.context.getUV(this)),t=Ql.mul(Qi(t.x,t.y.negate(),t.z));let r=this.levelNode;return null===r&&e.context.getTextureLevel&&(r=e.context.getTextureLevel(this)),_g(this._texture,t,r,this._width,this._height,this._maxMip)}dispose(){super.dispose(),null!==this._generator&&this._generator.dispose()}}const Yg=Bi(Kg).setParameterLength(1,3),Qg=new WeakMap;class Zg extends Xc{static get type(){return"EnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){const{material:t}=e;let r=this.envNode;if(r.isTextureNode||r.isMaterialReferenceNode){const e=r.isTextureNode?r.value:t[r.property];let s=Qg.get(e);void 0===s&&(s=Yg(e),Qg.set(e,s)),r=s}const s=!0===t.useAnisotropy||t.anisotropy>0?Ed:zl,i=r.context(Jg(wn,s)).mul(Yl),n=r.context(em($l)).mul(Math.PI).mul(Yl),a=Nu(i),o=Nu(n);e.context.radiance.addAssign(a),e.context.iblIrradiance.addAssign(o);const u=e.context.lightingModel.clearcoatRadiance;if(u){const e=r.context(Jg(Cn,Hl)).mul(Yl),t=Nu(e);u.addAssign(t)}}}const Jg=(e,t)=>{let r=null;return{getUV:()=>(null===r&&(r=Fl.negate().reflect(t),r=e.mul(e).mix(r,t).normalize(),r=r.transformDirection(rl)),r),getTextureLevel:()=>e}},em=e=>({getUV:()=>e,getTextureLevel:()=>$i(1)}),tm=new ge;class rm extends Fh{static get type(){return"MeshStandardNodeMaterial"}constructor(e){super(),this.isMeshStandardNodeMaterial=!0,this.lights=!0,this.emissiveNode=null,this.metalnessNode=null,this.roughnessNode=null,this.setDefaultValues(tm),this.setValues(e)}setupEnvironment(e){let t=super.setupEnvironment(e);return null===t&&e.environmentNode&&(t=e.environmentNode),t?new Zg(t):null}setupLightingModel(){return new ig}setupSpecular(){const e=Ao(Qi(.04),Sn.rgb,An);On.assign(e),Gn.assign(1)}setupVariants(){const e=this.metalnessNode?$i(this.metalnessNode):jd;An.assign(e);let t=this.roughnessNode?$i(this.roughnessNode):Wd;t=fp({roughness:t}),wn.assign(t),this.setupSpecular(),Sn.assign(tn(Sn.rgb.mul(e.oneMinus()),Sn.a))}copy(e){return this.emissiveNode=e.emissiveNode,this.metalnessNode=e.metalnessNode,this.roughnessNode=e.roughnessNode,super.copy(e)}}const sm=new me;class im extends rm{static get type(){return"MeshPhysicalNodeMaterial"}constructor(e){super(),this.isMeshPhysicalNodeMaterial=!0,this.clearcoatNode=null,this.clearcoatRoughnessNode=null,this.clearcoatNormalNode=null,this.sheenNode=null,this.sheenRoughnessNode=null,this.iridescenceNode=null,this.iridescenceIORNode=null,this.iridescenceThicknessNode=null,this.specularIntensityNode=null,this.specularColorNode=null,this.iorNode=null,this.transmissionNode=null,this.thicknessNode=null,this.attenuationDistanceNode=null,this.attenuationColorNode=null,this.dispersionNode=null,this.anisotropyNode=null,this.setDefaultValues(sm),this.setValues(e)}get useClearcoat(){return this.clearcoat>0||null!==this.clearcoatNode}get useIridescence(){return this.iridescence>0||null!==this.iridescenceNode}get useSheen(){return this.sheen>0||null!==this.sheenNode}get useAnisotropy(){return this.anisotropy>0||null!==this.anisotropyNode}get useTransmission(){return this.transmission>0||null!==this.transmissionNode}get useDispersion(){return this.dispersion>0||null!==this.dispersionNode}setupSpecular(){const e=this.iorNode?$i(this.iorNode):ac;jn.assign(e),On.assign(Ao(ho(_o(jn.sub(1).div(jn.add(1))).mul(zd),Qi(1)).mul(kd),Sn.rgb,An)),Gn.assign(Ao(kd,1,An))}setupLightingModel(){return new ig(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion)}setupVariants(e){if(super.setupVariants(e),this.useClearcoat){const e=this.clearcoatNode?$i(this.clearcoatNode):Xd,t=this.clearcoatRoughnessNode?$i(this.clearcoatRoughnessNode):Kd;Rn.assign(e),Cn.assign(fp({roughness:t}))}if(this.useSheen){const e=this.sheenNode?Qi(this.sheenNode):Zd,t=this.sheenRoughnessNode?$i(this.sheenRoughnessNode):Jd;Mn.assign(e),Pn.assign(t)}if(this.useIridescence){const e=this.iridescenceNode?$i(this.iridescenceNode):tc,t=this.iridescenceIORNode?$i(this.iridescenceIORNode):rc,r=this.iridescenceThicknessNode?$i(this.iridescenceThicknessNode):sc;Ln.assign(e),Fn.assign(t),Bn.assign(r)}if(this.useAnisotropy){const e=(this.anisotropyNode?qi(this.anisotropyNode):ec).toVar();Dn.assign(e.length()),Gi(Dn.equal(0),(()=>{e.assign(qi(1,0))})).Else((()=>{e.divAssign(qi(Dn)),Dn.assign(Dn.saturate())})),In.assign(Dn.pow2().mix(wn.pow2(),1)),Vn.assign(Nd[0].mul(e.x).add(Nd[1].mul(e.y))),Un.assign(Nd[1].mul(e.x).sub(Nd[0].mul(e.y)))}if(this.useTransmission){const e=this.transmissionNode?$i(this.transmissionNode):ic,t=this.thicknessNode?$i(this.thicknessNode):nc,r=this.attenuationDistanceNode?$i(this.attenuationDistanceNode):oc,s=this.attenuationColorNode?Qi(this.attenuationColorNode):uc;if(qn.assign(e),Xn.assign(t),Kn.assign(r),Yn.assign(s),this.useDispersion){const e=this.dispersionNode?$i(this.dispersionNode):mc;Qn.assign(e)}}}setupClearcoatNormal(){return this.clearcoatNormalNode?Qi(this.clearcoatNormalNode):Yd}setup(e){e.context.setupClearcoatNormal=()=>this.setupClearcoatNormal(e),super.setup(e)}copy(e){return this.clearcoatNode=e.clearcoatNode,this.clearcoatRoughnessNode=e.clearcoatRoughnessNode,this.clearcoatNormalNode=e.clearcoatNormalNode,this.sheenNode=e.sheenNode,this.sheenRoughnessNode=e.sheenRoughnessNode,this.iridescenceNode=e.iridescenceNode,this.iridescenceIORNode=e.iridescenceIORNode,this.iridescenceThicknessNode=e.iridescenceThicknessNode,this.specularIntensityNode=e.specularIntensityNode,this.specularColorNode=e.specularColorNode,this.transmissionNode=e.transmissionNode,this.thicknessNode=e.thicknessNode,this.attenuationDistanceNode=e.attenuationDistanceNode,this.attenuationColorNode=e.attenuationColorNode,this.dispersionNode=e.dispersionNode,this.anisotropyNode=e.anisotropyNode,super.copy(e)}}class nm extends ig{constructor(e=!1,t=!1,r=!1,s=!1,i=!1,n=!1,a=!1){super(e,t,r,s,i,n),this.useSSS=a}direct({lightDirection:e,lightColor:t,reflectedLight:r},s){if(!0===this.useSSS){const i=s.material,{thicknessColorNode:n,thicknessDistortionNode:a,thicknessAmbientNode:o,thicknessAttenuationNode:u,thicknessPowerNode:l,thicknessScaleNode:d}=i,c=e.add(zl.mul(a)).normalize(),h=$i(Fl.dot(c.negate()).saturate().pow(l).mul(d)),p=Qi(h.add(o).mul(n));r.directDiffuse.addAssign(p.mul(u.mul(t)))}super.direct({lightDirection:e,lightColor:t,reflectedLight:r},s)}}class am extends im{static get type(){return"MeshSSSNodeMaterial"}constructor(e){super(e),this.thicknessColorNode=null,this.thicknessDistortionNode=$i(.1),this.thicknessAmbientNode=$i(0),this.thicknessAttenuationNode=$i(.1),this.thicknessPowerNode=$i(2),this.thicknessScaleNode=$i(10)}get useSSS(){return null!==this.thicknessColorNode}setupLightingModel(){return new nm(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion,this.useSSS)}copy(e){return this.thicknessColorNode=e.thicknessColorNode,this.thicknessDistortionNode=e.thicknessDistortionNode,this.thicknessAmbientNode=e.thicknessAmbientNode,this.thicknessAttenuationNode=e.thicknessAttenuationNode,this.thicknessPowerNode=e.thicknessPowerNode,this.thicknessScaleNode=e.thicknessScaleNode,super.copy(e)}}const om=Vi((({normal:e,lightDirection:t,builder:r})=>{const s=e.dot(t),i=qi(s.mul(.5).add(.5),0);if(r.material.gradientMap){const e=ld("gradientMap","texture").context({getUV:()=>i});return Qi(e.r)}{const e=i.fwidth().mul(.5);return Ao(Qi(.7),Qi(1),Po($i(.7).sub(e.x),$i(.7).add(e.x),i.x))}}));class um extends rp{direct({lightDirection:e,lightColor:t,reflectedLight:r},s){const i=om({normal:Vl,lightDirection:e,builder:s}).mul(t);r.directDiffuse.addAssign(i.mul(op({diffuseColor:Sn.rgb})))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(op({diffuseColor:Sn}))),s.indirectDiffuse.mulAssign(t)}}const lm=new fe;class dm extends Fh{static get type(){return"MeshToonNodeMaterial"}constructor(e){super(),this.isMeshToonNodeMaterial=!0,this.lights=!0,this.setDefaultValues(lm),this.setValues(e)}setupLightingModel(){return new um}}class cm extends js{static get type(){return"MatcapUVNode"}constructor(){super("vec2")}setup(){const e=Qi(Fl.z,0,Fl.x.negate()).normalize(),t=Fl.cross(e);return qi(e.dot(zl),t.dot(zl)).mul(.495).add(.5)}}const hm=Ii(cm),pm=new ye;class gm extends Fh{static get type(){return"MeshMatcapNodeMaterial"}constructor(e){super(),this.isMeshMatcapNodeMaterial=!0,this.setDefaultValues(pm),this.setValues(e)}setupVariants(e){const t=hm;let r;r=e.material.matcap?ld("matcap","texture").context({getUV:()=>t}):Qi(Ao(.2,.8,t.y)),Sn.rgb.mulAssign(r.rgb)}}class mm extends js{static get type(){return"RotateNode"}constructor(e,t){super(),this.positionNode=e,this.rotationNode=t}getNodeType(e){return this.positionNode.getNodeType(e)}setup(e){const{rotationNode:t,positionNode:r}=this;if("vec2"===this.getNodeType(e)){const e=t.cos(),s=t.sin();return an(e,s,s.negate(),e).mul(r)}{const e=t,s=un(tn(1,0,0,0),tn(0,ja(e.x),Wa(e.x).negate(),0),tn(0,Wa(e.x),ja(e.x),0),tn(0,0,0,1)),i=un(tn(ja(e.y),0,Wa(e.y),0),tn(0,1,0,0),tn(Wa(e.y).negate(),0,ja(e.y),0),tn(0,0,0,1)),n=un(tn(ja(e.z),Wa(e.z).negate(),0,0),tn(Wa(e.z),ja(e.z),0,0),tn(0,0,1,0),tn(0,0,0,1));return s.mul(i).mul(n).mul(tn(r,1)).xyz}}}const fm=Bi(mm).setParameterLength(2),ym=new xe;class xm extends Fh{static get type(){return"SpriteNodeMaterial"}constructor(e){super(),this.isSpriteNodeMaterial=!0,this._useSizeAttenuation=!0,this.positionNode=null,this.rotationNode=null,this.scaleNode=null,this.transparent=!0,this.setDefaultValues(ym),this.setValues(e)}setupPositionView(e){const{object:t,camera:r}=e,s=this.sizeAttenuation,{positionNode:i,rotationNode:n,scaleNode:a}=this,o=Nl.mul(Qi(i||0));let u=qi(fl[0].xyz.length(),fl[1].xyz.length());if(null!==a&&(u=u.mul(qi(a))),!1===s)if(r.isPerspectiveCamera)u=u.mul(o.z.negate());else{const e=$i(2).div(el.element(1).element(1));u=u.mul(e.mul(2))}let l=Al.xy;if(t.center&&!0===t.center.isVector2){const e=((e,t,r)=>Pi(new lu(e,t,r)))("center","vec2",t);l=l.sub(e.sub(.5))}l=l.mul(u);const d=$i(n||Qd),c=fm(l,d);return tn(o.xy.add(c),o.zw)}copy(e){return this.positionNode=e.positionNode,this.rotationNode=e.rotationNode,this.scaleNode=e.scaleNode,super.copy(e)}get sizeAttenuation(){return this._useSizeAttenuation}set sizeAttenuation(e){this._useSizeAttenuation!==e&&(this._useSizeAttenuation=e,this.needsUpdate=!0)}}const bm=new be;class Tm extends xm{static get type(){return"PointsNodeMaterial"}constructor(e){super(),this.sizeNode=null,this.isPointsNodeMaterial=!0,this.setDefaultValues(bm),this.setValues(e)}setupPositionView(){const{positionNode:e}=this;return Nl.mul(Qi(e||Rl)).xyz}setupVertex(e){const t=super.setupVertex(e);if(!0!==e.material.isNodeMaterial)return t;const{rotationNode:r,scaleNode:s,sizeNode:i}=this,n=Al.xy.toVar(),a=nh.z.div(nh.w);if(r&&r.isNode){const e=$i(r);n.assign(fm(n,e))}let o=null!==i?qi(i):gc;return!0===this.sizeAttenuation&&(o=o.mul(o.div(Ll.z.negate()))),s&&s.isNode&&(o=o.mul(qi(s))),n.mulAssign(o.mul(2)),n.assign(n.div(nh.z)),n.y.assign(n.y.mul(a)),n.assign(n.mul(t.w)),t.addAssign(tn(n,0,0)),t}get alphaToCoverage(){return this._useAlphaToCoverage}set alphaToCoverage(e){this._useAlphaToCoverage!==e&&(this._useAlphaToCoverage=e,this.needsUpdate=!0)}}class _m extends rp{constructor(){super(),this.shadowNode=$i(1).toVar("shadowMask")}direct({lightNode:e}){this.shadowNode.mulAssign(e.shadowNode)}finish({context:e}){Sn.a.mulAssign(this.shadowNode.oneMinus()),e.outgoingLight.rgb.assign(Sn.rgb)}}const vm=new Te;class Nm extends Fh{static get type(){return"ShadowNodeMaterial"}constructor(e){super(),this.isShadowNodeMaterial=!0,this.lights=!0,this.transparent=!0,this.setDefaultValues(vm),this.setValues(e)}setupLightingModel(){return new _m}}const Sm=vn("vec3"),Em=vn("vec3"),wm=vn("vec3");class Am extends rp{constructor(){super()}start(e){const{material:t,context:r}=e,s=vn("vec3"),i=vn("vec3");Gi(nl.sub(Ml).length().greaterThan(Tl.mul(2)),(()=>{s.assign(nl),i.assign(Ml)})).Else((()=>{s.assign(Ml),i.assign(nl)}));const n=i.sub(s),a=Tn("int").onRenderUpdate((({material:e})=>e.steps)),o=n.length().div(a).toVar(),u=n.normalize().toVar(),l=$i(0).toVar(),d=Qi(1).toVar();t.offsetNode&&l.addAssign(t.offsetNode.mul(o)),kc(a,(()=>{const i=s.add(u.mul(l)),n=rl.mul(tn(i,1)).xyz;let a;null!==t.depthNode&&(Em.assign(wh(_h(n.z,Zu,Ju))),r.sceneDepthNode=wh(t.depthNode).toVar()),r.positionWorld=i,r.shadowPositionWorld=i,r.positionView=n,Sm.assign(0),t.scatteringNode&&(a=t.scatteringNode({positionRay:i})),super.start(e),a&&Sm.mulAssign(a);const c=Sm.mul(.01).negate().mul(o).exp();d.mulAssign(c),l.addAssign(o)})),wm.addAssign(d.saturate().oneMinus())}scatteringLight(e,t){const r=t.context.sceneDepthNode;r?Gi(r.greaterThanEqual(Em),(()=>{Sm.addAssign(e)})):Sm.addAssign(e)}direct({lightNode:e,lightColor:t},r){if(void 0===e.light.distance)return;const s=t.xyz.toVar();s.mulAssign(e.shadowNode),this.scatteringLight(s,r)}directRectArea({lightColor:e,lightPosition:t,halfWidth:r,halfHeight:s},i){const n=t.add(r).sub(s),a=t.sub(r).sub(s),o=t.sub(r).add(s),u=t.add(r).add(s),l=i.context.positionView,d=e.xyz.mul(Fp({P:l,p0:n,p1:a,p2:o,p3:u})).pow(1.5);this.scatteringLight(d,i)}finish(e){e.context.outgoingLight.assign(wm)}}class Rm extends Fh{static get type(){return"VolumeNodeMaterial"}constructor(e){super(),this.isVolumeNodeMaterial=!0,this.steps=25,this.offsetNode=null,this.scatteringNode=null,this.lights=!0,this.transparent=!0,this.side=N,this.depthTest=!1,this.depthWrite=!1,this.setValues(e)}setupLightingModel(){return new Am}}class Cm{constructor(e,t){this.nodes=e,this.info=t,this._context=self,this._animationLoop=null,this._requestId=null}start(){const e=(t,r)=>{this._requestId=this._context.requestAnimationFrame(e),!0===this.info.autoReset&&this.info.reset(),this.nodes.nodeFrame.update(),this.info.frame=this.nodes.nodeFrame.frameId,null!==this._animationLoop&&this._animationLoop(t,r)};e()}stop(){this._context.cancelAnimationFrame(this._requestId),this._requestId=null}getAnimationLoop(){return this._animationLoop}setAnimationLoop(e){this._animationLoop=e}getContext(){return this._context}setContext(e){this._context=e}dispose(){this.stop()}}class Mm{constructor(){this.weakMap=new WeakMap}get(e){let t=this.weakMap;for(let r=0;r{this.dispose()},this.material.addEventListener("dispose",this.onMaterialDispose)}updateClipping(e){this.clippingContext=e}get clippingNeedsUpdate(){return null!==this.clippingContext&&this.clippingContext.cacheKey!==this.clippingContextCacheKey&&(this.clippingContextCacheKey=this.clippingContext.cacheKey,!0)}get hardwareClippingPlanes(){return!0===this.material.hardwareClipping?this.clippingContext.unionClippingCount:0}getNodeBuilderState(){return this._nodeBuilderState||(this._nodeBuilderState=this._nodes.getForRender(this))}getMonitor(){return this._monitor||(this._monitor=this.getNodeBuilderState().observer)}getBindings(){return this._bindings||(this._bindings=this.getNodeBuilderState().createBindings())}getBindingGroup(e){for(const t of this.getBindings())if(t.name===e)return t}getIndex(){return this._geometries.getIndex(this)}getIndirect(){return this._geometries.getIndirect(this)}getChainArray(){return[this.object,this.material,this.context,this.lightsNode]}setGeometry(e){this.geometry=e,this.attributes=null}getAttributes(){if(null!==this.attributes)return this.attributes;const e=this.getNodeBuilderState().nodeAttributes,t=this.geometry,r=[],s=new Set;for(const i of e){const e=i.node&&i.node.attribute?i.node.attribute:t.getAttribute(i.name);if(void 0===e)continue;r.push(e);const n=e.isInterleavedBufferAttribute?e.data:e;s.add(n)}return this.attributes=r,this.vertexBuffers=Array.from(s.values()),r}getVertexBuffers(){return null===this.vertexBuffers&&this.getAttributes(),this.vertexBuffers}getDrawParameters(){const{object:e,material:t,geometry:r,group:s,drawRange:i}=this,n=this.drawParams||(this.drawParams={vertexCount:0,firstVertex:0,instanceCount:0,firstInstance:0}),a=this.getIndex(),o=null!==a,u=r.isInstancedBufferGeometry?r.instanceCount:e.count>1?e.count:1;if(0===u)return null;if(n.instanceCount=u,!0===e.isBatchedMesh)return n;let l=1;!0!==t.wireframe||e.isPoints||e.isLineSegments||e.isLine||e.isLineLoop||(l=2);let d=i.start*l,c=(i.start+i.count)*l;null!==s&&(d=Math.max(d,s.start*l),c=Math.min(c,(s.start+s.count)*l));const h=r.attributes.position;let p=1/0;o?p=a.count:null!=h&&(p=h.count),d=Math.max(d,0),c=Math.min(c,p);const g=c-d;return g<0||g===1/0?null:(n.vertexCount=g,n.firstVertex=d,n)}getGeometryCacheKey(){const{geometry:e}=this;let t="";for(const r of Object.keys(e.attributes).sort()){const s=e.attributes[r];t+=r+",",s.data&&(t+=s.data.stride+","),s.offset&&(t+=s.offset+","),s.itemSize&&(t+=s.itemSize+","),s.normalized&&(t+="n,")}for(const r of Object.keys(e.morphAttributes).sort()){const s=e.morphAttributes[r];t+="morph-"+r+",";for(let e=0,r=s.length;e1&&(r+=e.uuid+","),r+=e.receiveShadow+",",xs(r)}get needsGeometryUpdate(){return this.geometry.id!==this.object.geometry.id}get needsUpdate(){return this.initialNodesCacheKey!==this.getDynamicCacheKey()||this.clippingNeedsUpdate}getDynamicCacheKey(){let e=0;return!0!==this.material.isShadowPassMaterial&&(e=this._nodes.getCacheKey(this.scene,this.lightsNode)),this.camera.isArrayCamera&&(e=Ts(e,this.camera.cameras.length)),this.object.receiveShadow&&(e=Ts(e,1)),e}getCacheKey(){return this.getMaterialCacheKey()+this.getDynamicCacheKey()}dispose(){this.material.removeEventListener("dispose",this.onMaterialDispose),this.onDispose()}}const Fm=[];class Bm{constructor(e,t,r,s,i,n){this.renderer=e,this.nodes=t,this.geometries=r,this.pipelines=s,this.bindings=i,this.info=n,this.chainMaps={}}get(e,t,r,s,i,n,a,o){const u=this.getChainMap(o);Fm[0]=e,Fm[1]=t,Fm[2]=n,Fm[3]=i;let l=u.get(Fm);return void 0===l?(l=this.createRenderObject(this.nodes,this.geometries,this.renderer,e,t,r,s,i,n,a,o),u.set(Fm,l)):(l.updateClipping(a),l.needsGeometryUpdate&&l.setGeometry(e.geometry),(l.version!==t.version||l.needsUpdate)&&(l.initialCacheKey!==l.getCacheKey()?(l.dispose(),l=this.get(e,t,r,s,i,n,a,o)):l.version=t.version)),Fm.length=0,l}getChainMap(e="default"){return this.chainMaps[e]||(this.chainMaps[e]=new Mm)}dispose(){this.chainMaps={}}createRenderObject(e,t,r,s,i,n,a,o,u,l,d){const c=this.getChainMap(d),h=new Lm(e,t,r,s,i,n,a,o,u,l);return h.onDispose=()=>{this.pipelines.delete(h),this.bindings.delete(h),this.nodes.delete(h),c.delete(h.getChainArray())},h}}class Im{constructor(){this.data=new WeakMap}get(e){let t=this.data.get(e);return void 0===t&&(t={},this.data.set(e,t)),t}delete(e){let t=null;return this.data.has(e)&&(t=this.data.get(e),this.data.delete(e)),t}has(e){return this.data.has(e)}dispose(){this.data=new WeakMap}}const Dm=1,Vm=2,Um=3,Om=4,Gm=16;class km extends Im{constructor(e){super(),this.backend=e}delete(e){const t=super.delete(e);return null!==t&&this.backend.destroyAttribute(e),t}update(e,t){const r=this.get(e);if(void 0===r.version)t===Dm?this.backend.createAttribute(e):t===Vm?this.backend.createIndexAttribute(e):t===Um?this.backend.createStorageAttribute(e):t===Om&&this.backend.createIndirectStorageAttribute(e),r.version=this._getBufferAttribute(e).version;else{const t=this._getBufferAttribute(e);(r.version{this.info.memory.geometries--;const s=t.index,i=e.getAttributes();null!==s&&this.attributes.delete(s);for(const e of i)this.attributes.delete(e);const n=this.wireframes.get(t);void 0!==n&&this.attributes.delete(n),t.removeEventListener("dispose",r)};t.addEventListener("dispose",r)}updateAttributes(e){const t=e.getAttributes();for(const e of t)e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute?this.updateAttribute(e,Um):this.updateAttribute(e,Dm);const r=this.getIndex(e);null!==r&&this.updateAttribute(r,Vm);const s=e.geometry.indirect;null!==s&&this.updateAttribute(s,Om)}updateAttribute(e,t){const r=this.info.render.calls;e.isInterleavedBufferAttribute?void 0===this.attributeCall.get(e)?(this.attributes.update(e,t),this.attributeCall.set(e,r)):this.attributeCall.get(e.data)!==r&&(this.attributes.update(e,t),this.attributeCall.set(e.data,r),this.attributeCall.set(e,r)):this.attributeCall.get(e)!==r&&(this.attributes.update(e,t),this.attributeCall.set(e,r))}getIndirect(e){return e.geometry.indirect}getIndex(e){const{geometry:t,material:r}=e;let s=t.index;if(!0===r.wireframe){const e=this.wireframes;let r=e.get(t);void 0===r?(r=$m(t),e.set(t,r)):r.version!==zm(t)&&(this.attributes.delete(r),r=$m(t),e.set(t,r)),s=r}return s}}class Wm{constructor(){this.autoReset=!0,this.frame=0,this.calls=0,this.render={calls:0,frameCalls:0,drawCalls:0,triangles:0,points:0,lines:0,timestamp:0},this.compute={calls:0,frameCalls:0,timestamp:0},this.memory={geometries:0,textures:0}}update(e,t,r){this.render.drawCalls++,e.isMesh||e.isSprite?this.render.triangles+=r*(t/3):e.isPoints?this.render.points+=r*t:e.isLineSegments?this.render.lines+=r*(t/2):e.isLine?this.render.lines+=r*(t-1):console.error("THREE.WebGPUInfo: Unknown object type.")}reset(){this.render.drawCalls=0,this.render.frameCalls=0,this.compute.frameCalls=0,this.render.triangles=0,this.render.points=0,this.render.lines=0}dispose(){this.reset(),this.calls=0,this.render.calls=0,this.compute.calls=0,this.render.timestamp=0,this.compute.timestamp=0,this.memory.geometries=0,this.memory.textures=0}}class jm{constructor(e){this.cacheKey=e,this.usedTimes=0}}class qm extends jm{constructor(e,t,r){super(e),this.vertexProgram=t,this.fragmentProgram=r}}class Xm extends jm{constructor(e,t){super(e),this.computeProgram=t,this.isComputePipeline=!0}}let Km=0;class Ym{constructor(e,t,r,s=null,i=null){this.id=Km++,this.code=e,this.stage=t,this.name=r,this.transforms=s,this.attributes=i,this.usedTimes=0}}class Qm extends Im{constructor(e,t){super(),this.backend=e,this.nodes=t,this.bindings=null,this.caches=new Map,this.programs={vertex:new Map,fragment:new Map,compute:new Map}}getForCompute(e,t){const{backend:r}=this,s=this.get(e);if(this._needsComputeUpdate(e)){const i=s.pipeline;i&&(i.usedTimes--,i.computeProgram.usedTimes--);const n=this.nodes.getForCompute(e);let a=this.programs.compute.get(n.computeShader);void 0===a&&(i&&0===i.computeProgram.usedTimes&&this._releaseProgram(i.computeProgram),a=new Ym(n.computeShader,"compute",e.name,n.transforms,n.nodeAttributes),this.programs.compute.set(n.computeShader,a),r.createProgram(a));const o=this._getComputeCacheKey(e,a);let u=this.caches.get(o);void 0===u&&(i&&0===i.usedTimes&&this._releasePipeline(i),u=this._getComputePipeline(e,a,o,t)),u.usedTimes++,a.usedTimes++,s.version=e.version,s.pipeline=u}return s.pipeline}getForRender(e,t=null){const{backend:r}=this,s=this.get(e);if(this._needsRenderUpdate(e)){const i=s.pipeline;i&&(i.usedTimes--,i.vertexProgram.usedTimes--,i.fragmentProgram.usedTimes--);const n=e.getNodeBuilderState(),a=e.material?e.material.name:"";let o=this.programs.vertex.get(n.vertexShader);void 0===o&&(i&&0===i.vertexProgram.usedTimes&&this._releaseProgram(i.vertexProgram),o=new Ym(n.vertexShader,"vertex",a),this.programs.vertex.set(n.vertexShader,o),r.createProgram(o));let u=this.programs.fragment.get(n.fragmentShader);void 0===u&&(i&&0===i.fragmentProgram.usedTimes&&this._releaseProgram(i.fragmentProgram),u=new Ym(n.fragmentShader,"fragment",a),this.programs.fragment.set(n.fragmentShader,u),r.createProgram(u));const l=this._getRenderCacheKey(e,o,u);let d=this.caches.get(l);void 0===d?(i&&0===i.usedTimes&&this._releasePipeline(i),d=this._getRenderPipeline(e,o,u,l,t)):e.pipeline=d,d.usedTimes++,o.usedTimes++,u.usedTimes++,s.pipeline=d}return s.pipeline}delete(e){const t=this.get(e).pipeline;return t&&(t.usedTimes--,0===t.usedTimes&&this._releasePipeline(t),t.isComputePipeline?(t.computeProgram.usedTimes--,0===t.computeProgram.usedTimes&&this._releaseProgram(t.computeProgram)):(t.fragmentProgram.usedTimes--,t.vertexProgram.usedTimes--,0===t.vertexProgram.usedTimes&&this._releaseProgram(t.vertexProgram),0===t.fragmentProgram.usedTimes&&this._releaseProgram(t.fragmentProgram))),super.delete(e)}dispose(){super.dispose(),this.caches=new Map,this.programs={vertex:new Map,fragment:new Map,compute:new Map}}updateForRender(e){this.getForRender(e)}_getComputePipeline(e,t,r,s){r=r||this._getComputeCacheKey(e,t);let i=this.caches.get(r);return void 0===i&&(i=new Xm(r,t),this.caches.set(r,i),this.backend.createComputePipeline(i,s)),i}_getRenderPipeline(e,t,r,s,i){s=s||this._getRenderCacheKey(e,t,r);let n=this.caches.get(s);return void 0===n&&(n=new qm(s,t,r),this.caches.set(s,n),e.pipeline=n,this.backend.createRenderPipeline(e,i)),n}_getComputeCacheKey(e,t){return e.id+","+t.id}_getRenderCacheKey(e,t,r){return t.id+","+r.id+","+this.backend.getRenderCacheKey(e)}_releasePipeline(e){this.caches.delete(e.cacheKey)}_releaseProgram(e){const t=e.code,r=e.stage;this.programs[r].delete(t)}_needsComputeUpdate(e){const t=this.get(e);return void 0===t.pipeline||t.version!==e.version}_needsRenderUpdate(e){return void 0===this.get(e).pipeline||this.backend.needsRenderUpdate(e)}}class Zm extends Im{constructor(e,t,r,s,i,n){super(),this.backend=e,this.textures=r,this.pipelines=i,this.attributes=s,this.nodes=t,this.info=n,this.pipelines.bindings=this}getForRender(e){const t=e.getBindings();for(const e of t){const r=this.get(e);void 0===r.bindGroup&&(this._init(e),this.backend.createBindings(e,t,0),r.bindGroup=e)}return t}getForCompute(e){const t=this.nodes.getForCompute(e).bindings;for(const e of t){const r=this.get(e);void 0===r.bindGroup&&(this._init(e),this.backend.createBindings(e,t,0),r.bindGroup=e)}return t}updateForCompute(e){this._updateBindings(this.getForCompute(e))}updateForRender(e){this._updateBindings(this.getForRender(e))}_updateBindings(e){for(const t of e)this._update(t,e)}_init(e){for(const t of e.bindings)if(t.isSampledTexture)this.textures.updateTexture(t.texture);else if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?Om:Um;this.attributes.update(e,r)}}_update(e,t){const{backend:r}=this;let s=!1,i=!0,n=0,a=0;for(const t of e.bindings){if(t.isNodeUniformsGroup){if(!1===this.nodes.updateGroup(t))continue}if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?Om:Um;this.attributes.update(e,r)}if(t.isUniformBuffer){t.update()&&r.updateBinding(t)}else if(t.isSampler)t.update();else if(t.isSampledTexture){const e=this.textures.get(t.texture);t.needsBindingsUpdate(e.generation)&&(s=!0);const o=t.update(),u=t.texture;o&&this.textures.updateTexture(u);const l=r.get(u);if(void 0!==l.externalTexture||e.isDefaultTexture?i=!1:(n=10*n+u.id,a+=u.version),!0===r.isWebGPUBackend&&void 0===l.texture&&void 0===l.externalTexture&&(console.error("Bindings._update: binding should be available:",t,o,u,t.textureNode.value,s),this.textures.updateTexture(u),s=!0),!0===u.isStorageTexture){const e=this.get(u);!0===t.store?e.needsMipmap=!0:this.textures.needsMipmaps(u)&&!0===e.needsMipmap&&(this.backend.generateMipmaps(u),e.needsMipmap=!1)}}}!0===s&&this.backend.updateBindings(e,t,i?n:0,a)}}function Jm(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.material.id!==t.material.id?e.material.id-t.material.id:e.z!==t.z?e.z-t.z:e.id-t.id}function ef(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?t.z-e.z:e.id-t.id}function tf(e){return(e.transmission>0||e.transmissionNode)&&e.side===Se&&!1===e.forceSinglePass}class rf{constructor(e,t,r){this.renderItems=[],this.renderItemsIndex=0,this.opaque=[],this.transparentDoublePass=[],this.transparent=[],this.bundles=[],this.lightsNode=e.getNode(t,r),this.lightsArray=[],this.scene=t,this.camera=r,this.occlusionQueryCount=0}begin(){return this.renderItemsIndex=0,this.opaque.length=0,this.transparentDoublePass.length=0,this.transparent.length=0,this.bundles.length=0,this.lightsArray.length=0,this.occlusionQueryCount=0,this}getNextRenderItem(e,t,r,s,i,n,a){let o=this.renderItems[this.renderItemsIndex];return void 0===o?(o={id:e.id,object:e,geometry:t,material:r,groupOrder:s,renderOrder:e.renderOrder,z:i,group:n,clippingContext:a},this.renderItems[this.renderItemsIndex]=o):(o.id=e.id,o.object=e,o.geometry=t,o.material=r,o.groupOrder=s,o.renderOrder=e.renderOrder,o.z=i,o.group=n,o.clippingContext=a),this.renderItemsIndex++,o}push(e,t,r,s,i,n,a){const o=this.getNextRenderItem(e,t,r,s,i,n,a);!0===e.occlusionTest&&this.occlusionQueryCount++,!0===r.transparent||r.transmission>0?(tf(r)&&this.transparentDoublePass.push(o),this.transparent.push(o)):this.opaque.push(o)}unshift(e,t,r,s,i,n,a){const o=this.getNextRenderItem(e,t,r,s,i,n,a);!0===r.transparent||r.transmission>0?(tf(r)&&this.transparentDoublePass.unshift(o),this.transparent.unshift(o)):this.opaque.unshift(o)}pushBundle(e){this.bundles.push(e)}pushLight(e){this.lightsArray.push(e)}sort(e,t){this.opaque.length>1&&this.opaque.sort(e||Jm),this.transparentDoublePass.length>1&&this.transparentDoublePass.sort(t||ef),this.transparent.length>1&&this.transparent.sort(t||ef)}finish(){this.lightsNode.setLights(this.lightsArray);for(let e=this.renderItemsIndex,t=this.renderItems.length;e>t,u=a.height>>t;let l=e.depthTexture||i[t];const d=!0===e.depthBuffer||!0===e.stencilBuffer;let c=!1;void 0===l&&d&&(l=new I,l.format=e.stencilBuffer?we:Ae,l.type=e.stencilBuffer?Re:b,l.image.width=o,l.image.height=u,i[t]=l),r.width===a.width&&a.height===r.height||(c=!0,l&&(l.needsUpdate=!0,l.image.width=o,l.image.height=u)),r.width=a.width,r.height=a.height,r.textures=n,r.depthTexture=l||null,r.depth=e.depthBuffer,r.stencil=e.stencilBuffer,r.renderTarget=e,r.sampleCount!==s&&(c=!0,l&&(l.needsUpdate=!0),r.sampleCount=s);const h={sampleCount:s};if(!0!==e.isXRRenderTarget){for(let e=0;e{e.removeEventListener("dispose",t);for(let e=0;e0){const s=e.image;if(void 0===s)console.warn("THREE.Renderer: Texture marked for update but image is undefined.");else if(!1===s.complete)console.warn("THREE.Renderer: Texture marked for update but image is incomplete.");else{if(e.images){const r=[];for(const t of e.images)r.push(t);t.images=r}else t.image=s;void 0!==r.isDefaultTexture&&!0!==r.isDefaultTexture||(i.createTexture(e,t),r.isDefaultTexture=!1,r.generation=e.version),!0===e.source.dataReady&&i.updateTexture(e,t),t.needsMipmaps&&0===e.mipmaps.length&&i.generateMipmaps(e)}}else i.createDefaultTexture(e),r.isDefaultTexture=!0,r.generation=e.version}if(!0!==r.initialized){r.initialized=!0,r.generation=e.version,this.info.memory.textures++;const t=()=>{e.removeEventListener("dispose",t),this._destroyTexture(e),this.info.memory.textures--};e.addEventListener("dispose",t)}r.version=e.version}getSize(e,t=pf){let r=e.images?e.images[0]:e.image;return r?(void 0!==r.image&&(r=r.image),t.width=r.width||1,t.height=r.height||1,t.depth=e.isCubeTexture?6:r.depth||1):t.width=t.height=t.depth=1,t}getMipLevels(e,t,r){let s;return s=e.isCompressedTexture?e.mipmaps?e.mipmaps.length:1:Math.floor(Math.log2(Math.max(t,r)))+1,s}needsMipmaps(e){return this.isEnvironmentTexture(e)||!0===e.isCompressedTexture||e.generateMipmaps}isEnvironmentTexture(e){const t=e.mapping;return t===Y||t===Q||t===E||t===w}_destroyTexture(e){this.backend.destroySampler(e),this.backend.destroyTexture(e),this.delete(e)}}class mf extends e{constructor(e,t,r,s=1){super(e,t,r),this.a=s}set(e,t,r,s=1){return this.a=s,super.set(e,t,r)}copy(e){return void 0!==e.a&&(this.a=e.a),super.copy(e)}clone(){return new this.constructor(this.r,this.g,this.b,this.a)}}class ff extends _n{static get type(){return"ParameterNode"}constructor(e,t=null){super(e,t),this.isParameterNode=!0}getHash(){return this.uuid}generate(){return this.name}}class yf extends $s{static get type(){return"StackNode"}constructor(e=null){super(),this.nodes=[],this.outputNode=null,this.parent=e,this._currentCond=null,this.isStackNode=!0}getNodeType(e){return this.outputNode?this.outputNode.getNodeType(e):"void"}getMemberType(e,t){return this.outputNode?this.outputNode.getMemberType(e,t):"void"}add(e){return this.nodes.push(e),this}If(e,t){const r=new Mi(t);return this._currentCond=Go(e,r),this.add(this._currentCond)}ElseIf(e,t){const r=new Mi(t),s=Go(e,r);return this._currentCond.elseNode=s,this._currentCond=s,this}Else(e){return this._currentCond.elseNode=new Mi(e),this}build(e,...t){const r=Oi();Ui(this);for(const t of this.nodes)t.build(e,"void");return Ui(r),this.outputNode?this.outputNode.build(e,...t):super.build(e,...t)}else(...e){return console.warn("THREE.TSL: .else() has been renamed to .Else()."),this.Else(...e)}elseif(...e){return console.warn("THREE.TSL: .elseif() has been renamed to .ElseIf()."),this.ElseIf(...e)}}const xf=Bi(yf).setParameterLength(0,1);class bf extends $s{static get type(){return"StructTypeNode"}constructor(e,t=null){var r;super("struct"),this.membersLayout=(r=e,Object.entries(r).map((([e,t])=>"string"==typeof t?{name:e,type:t,atomic:!1}:{name:e,type:t.type,atomic:t.atomic||!1}))),this.name=t,this.isStructLayoutNode=!0}getLength(){let e=0;for(const t of this.membersLayout)e+=As(t.type);return e}getMemberType(e,t){const r=this.membersLayout.find((e=>e.name===t));return r?r.type:"void"}getNodeType(e){return e.getStructTypeFromNode(this,this.membersLayout,this.name).name}setup(e){e.addInclude(this)}generate(e){return this.getNodeType(e)}}class Tf extends $s{static get type(){return"StructNode"}constructor(e,t){super("vec3"),this.structLayoutNode=e,this.values=t,this.isStructNode=!0}getNodeType(e){return this.structLayoutNode.getNodeType(e)}getMemberType(e,t){return this.structLayoutNode.getMemberType(e,t)}generate(e){const t=e.getVarFromNode(this),r=t.type,s=e.getPropertyName(t);return e.addLineFlowCode(`${s} = ${e.generateStruct(r,this.structLayoutNode.membersLayout,this.values)}`,this),t.name}}class _f extends $s{static get type(){return"OutputStructNode"}constructor(...e){super(),this.members=e,this.isOutputStructNode=!0}getNodeType(e){const t=e.getNodeProperties(this);if(void 0===t.membersLayout){const r=this.members,s=[];for(let t=0;t{const t=e.toUint().mul(747796405).add(2891336453),r=t.shiftRight(t.shiftRight(28).add(4)).bitXor(t).mul(277803737);return r.shiftRight(22).bitXor(r).toFloat().mul(1/2**32)})),Af=(e,t)=>To(na(4,e.mul(ia(1,e))),t),Rf=Vi((([e])=>e.fract().sub(.5).abs())).setLayout({name:"tri",type:"float",inputs:[{name:"x",type:"float"}]}),Cf=Vi((([e])=>Qi(Rf(e.z.add(Rf(e.y.mul(1)))),Rf(e.z.add(Rf(e.x.mul(1)))),Rf(e.y.add(Rf(e.x.mul(1))))))).setLayout({name:"tri3",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),Mf=Vi((([e,t,r])=>{const s=Qi(e).toVar(),i=$i(1.4).toVar(),n=$i(0).toVar(),a=Qi(s).toVar();return kc({start:$i(0),end:$i(3),type:"float",condition:"<="},(()=>{const e=Qi(Cf(a.mul(2))).toVar();s.addAssign(e.add(r.mul($i(.1).mul(t)))),a.mulAssign(1.8),i.mulAssign(1.5),s.mulAssign(1.2);const o=$i(Rf(s.z.add(Rf(s.x.add(Rf(s.y)))))).toVar();n.addAssign(o.div(i)),a.addAssign(.14)})),n})).setLayout({name:"triNoise3D",type:"float",inputs:[{name:"position",type:"vec3"},{name:"speed",type:"float"},{name:"time",type:"float"}]});class Pf extends $s{static get type(){return"FunctionOverloadingNode"}constructor(e=[],...t){super(),this.functionNodes=e,this.parametersNodes=t,this._candidateFnCall=null,this.global=!0}getNodeType(){return this.functionNodes[0].shaderNode.layout.type}setup(e){const t=this.parametersNodes;let r=this._candidateFnCall;if(null===r){let s=null,i=-1;for(const r of this.functionNodes){const n=r.shaderNode.layout;if(null===n)throw new Error("FunctionOverloadingNode: FunctionNode must be a layout.");const a=n.inputs;if(t.length===a.length){let n=0;for(let r=0;ri&&(s=r,i=n)}}this._candidateFnCall=r=s(...t)}return r}}const Lf=Bi(Pf),Ff=e=>(...t)=>Lf(e,...t),Bf=Tn(0).setGroup(yn).onRenderUpdate((e=>e.time)),If=Tn(0).setGroup(yn).onRenderUpdate((e=>e.deltaTime)),Df=Tn(0,"uint").setGroup(yn).onRenderUpdate((e=>e.frameId)),Vf=Vi((([e,t,r=qi(.5)])=>fm(e.sub(r),t).add(r))),Uf=Vi((([e,t,r=qi(.5)])=>{const s=e.sub(r),i=s.dot(s),n=i.mul(i).mul(t);return e.add(s.mul(n))})),Of=Vi((({position:e=null,horizontal:t=!0,vertical:r=!1})=>{let s;null!==e?(s=fl.toVar(),s[3][0]=e.x,s[3][1]=e.y,s[3][2]=e.z):s=fl;const i=rl.mul(s);return Ri(t)&&(i[0][0]=fl[0].length(),i[0][1]=0,i[0][2]=0),Ri(r)&&(i[1][0]=0,i[1][1]=fl[1].length(),i[1][2]=0),i[2][0]=0,i[2][1]=0,i[2][2]=1,el.mul(i).mul(Rl)})),Gf=Vi((([e=null])=>{const t=wh();return wh(xh(e)).sub(t).lessThan(0).select(rh,e)}));class kf extends $s{static get type(){return"SpriteSheetUVNode"}constructor(e,t=Uu(),r=$i(0)){super("vec2"),this.countNode=e,this.uvNode=t,this.frameNode=r}setup(){const{frameNode:e,uvNode:t,countNode:r}=this,{width:s,height:i}=r,n=e.mod(s.mul(i)).floor(),a=n.mod(s),o=i.sub(n.add(1).div(s).ceil()),u=r.reciprocal(),l=qi(a,o);return t.add(l).mul(u)}}const zf=Bi(kf).setParameterLength(3);class $f extends $s{static get type(){return"TriplanarTexturesNode"}constructor(e,t=null,r=null,s=$i(1),i=Rl,n=Ul){super("vec4"),this.textureXNode=e,this.textureYNode=t,this.textureZNode=r,this.scaleNode=s,this.positionNode=i,this.normalNode=n}setup(){const{textureXNode:e,textureYNode:t,textureZNode:r,scaleNode:s,positionNode:i,normalNode:n}=this;let a=n.abs().normalize();a=a.div(a.dot(Qi(1)));const o=i.yz.mul(s),u=i.zx.mul(s),l=i.xy.mul(s),d=e.value,c=null!==t?t.value:d,h=null!==r?r.value:d,p=Hu(d,o).mul(a.x),g=Hu(c,u).mul(a.y),m=Hu(h,l).mul(a.z);return sa(p,g,m)}}const Hf=Bi($f).setParameterLength(1,6),Wf=new Me,jf=new r,qf=new r,Xf=new r,Kf=new a,Yf=new r(0,0,-1),Qf=new s,Zf=new r,Jf=new r,ey=new s,ty=new t,ry=new ae,sy=rh.flipX();ry.depthTexture=new I(1,1);let iy=!1;class ny extends $u{static get type(){return"ReflectorNode"}constructor(e={}){super(e.defaultTexture||ry.texture,sy),this._reflectorBaseNode=e.reflector||new ay(this,e),this._depthNode=null,this.setUpdateMatrix(!1)}get reflector(){return this._reflectorBaseNode}get target(){return this._reflectorBaseNode.target}getDepthNode(){if(null===this._depthNode){if(!0!==this._reflectorBaseNode.depth)throw new Error("THREE.ReflectorNode: Depth node can only be requested when the reflector is created with { depth: true }. ");this._depthNode=Pi(new ny({defaultTexture:ry.depthTexture,reflector:this._reflectorBaseNode}))}return this._depthNode}setup(e){return e.object.isQuadMesh||this._reflectorBaseNode.build(e),super.setup(e)}clone(){const e=new this.constructor(this.reflectorNode);return e._reflectorBaseNode=this._reflectorBaseNode,e}}class ay extends $s{static get type(){return"ReflectorBaseNode"}constructor(e,t={}){super();const{target:r=new Pe,resolution:s=1,generateMipmaps:i=!1,bounces:n=!0,depth:a=!1}=t;this.textureNode=e,this.target=r,this.resolution=s,this.generateMipmaps=i,this.bounces=n,this.depth=a,this.updateBeforeType=n?Is.RENDER:Is.FRAME,this.virtualCameras=new WeakMap,this.renderTargets=new WeakMap,this.forceUpdate=!1}_updateResolution(e,t){const r=this.resolution;t.getDrawingBufferSize(ty),e.setSize(Math.round(ty.width*r),Math.round(ty.height*r))}setup(e){return this._updateResolution(ry,e.renderer),super.setup(e)}getVirtualCamera(e){let t=this.virtualCameras.get(e);return void 0===t&&(t=e.clone(),this.virtualCameras.set(e,t)),t}getRenderTarget(e){let t=this.renderTargets.get(e);return void 0===t&&(t=new ae(0,0,{type:he}),!0===this.generateMipmaps&&(t.texture.minFilter=Le,t.texture.generateMipmaps=!0),!0===this.depth&&(t.depthTexture=new I),this.renderTargets.set(e,t)),t}updateBefore(e){if(!1===this.bounces&&iy)return!1;iy=!0;const{scene:t,camera:r,renderer:s,material:i}=e,{target:n}=this,a=this.getVirtualCamera(r),o=this.getRenderTarget(a);s.getDrawingBufferSize(ty),this._updateResolution(o,s),qf.setFromMatrixPosition(n.matrixWorld),Xf.setFromMatrixPosition(r.matrixWorld),Kf.extractRotation(n.matrixWorld),jf.set(0,0,1),jf.applyMatrix4(Kf),Zf.subVectors(qf,Xf);if(!0===Zf.dot(jf)>0&&!1===this.forceUpdate)return;Zf.reflect(jf).negate(),Zf.add(qf),Kf.extractRotation(r.matrixWorld),Yf.set(0,0,-1),Yf.applyMatrix4(Kf),Yf.add(Xf),Jf.subVectors(qf,Yf),Jf.reflect(jf).negate(),Jf.add(qf),a.coordinateSystem=r.coordinateSystem,a.position.copy(Zf),a.up.set(0,1,0),a.up.applyMatrix4(Kf),a.up.reflect(jf),a.lookAt(Jf),a.near=r.near,a.far=r.far,a.updateMatrixWorld(),a.projectionMatrix.copy(r.projectionMatrix),Wf.setFromNormalAndCoplanarPoint(jf,qf),Wf.applyMatrix4(a.matrixWorldInverse),Qf.set(Wf.normal.x,Wf.normal.y,Wf.normal.z,Wf.constant);const u=a.projectionMatrix;ey.x=(Math.sign(Qf.x)+u.elements[8])/u.elements[0],ey.y=(Math.sign(Qf.y)+u.elements[9])/u.elements[5],ey.z=-1,ey.w=(1+u.elements[10])/u.elements[14],Qf.multiplyScalar(1/Qf.dot(ey));u.elements[2]=Qf.x,u.elements[6]=Qf.y,u.elements[10]=s.coordinateSystem===d?Qf.z-0:Qf.z+1-0,u.elements[14]=Qf.w,this.textureNode.value=o.texture,!0===this.depth&&(this.textureNode.getDepthNode().value=o.depthTexture),i.visible=!1;const l=s.getRenderTarget(),c=s.getMRT(),h=s.autoClear;s.setMRT(null),s.setRenderTarget(o),s.autoClear=!0,s.render(t,a),s.setMRT(c),s.setRenderTarget(l),s.autoClear=h,i.visible=!0,iy=!1,this.forceUpdate=!1}}const oy=new ie(-1,1,1,-1,0,1);class uy extends ue{constructor(e=!1){super();const t=!1===e?[0,-1,0,1,2,1]:[0,2,0,0,2,0];this.setAttribute("position",new Fe([-1,3,0,-1,-1,0,3,-1,0],3)),this.setAttribute("uv",new Fe(t,2))}}const ly=new uy;class dy extends W{constructor(e=null){super(ly,e),this.camera=oy,this.isQuadMesh=!0}async renderAsync(e){return e.renderAsync(this,oy)}render(e){e.render(this,oy)}}const cy=new t;class hy extends $u{static get type(){return"RTTNode"}constructor(e,t=null,r=null,s={type:he}){const i=new ae(t,r,s);super(i.texture,Uu()),this.node=e,this.width=t,this.height=r,this.pixelRatio=1,this.renderTarget=i,this.textureNeedsUpdate=!0,this.autoUpdate=!0,this._rttNode=null,this._quadMesh=new dy(new Fh),this.updateBeforeType=Is.RENDER}get autoSize(){return null===this.width}setup(e){return this._rttNode=this.node.context(e.getSharedContext()),this._quadMesh.material.name="RTT",this._quadMesh.material.needsUpdate=!0,super.setup(e)}setSize(e,t){this.width=e,this.height=t;const r=e*this.pixelRatio,s=t*this.pixelRatio;this.renderTarget.setSize(r,s),this.textureNeedsUpdate=!0}setPixelRatio(e){this.pixelRatio=e,this.setSize(this.width,this.height)}updateBefore({renderer:e}){if(!1===this.textureNeedsUpdate&&!1===this.autoUpdate)return;if(this.textureNeedsUpdate=!1,!0===this.autoSize){this.pixelRatio=e.getPixelRatio();const t=e.getSize(cy);this.setSize(t.width,t.height)}this._quadMesh.material.fragmentNode=this._rttNode;const t=e.getRenderTarget();e.setRenderTarget(this.renderTarget),this._quadMesh.render(e),e.setRenderTarget(t)}clone(){const e=new $u(this.value,this.uvNode,this.levelNode);return e.sampler=this.sampler,e.referenceNode=this,e}}const py=(e,...t)=>Pi(new hy(Pi(e),...t)),gy=Vi((([e,t,r],s)=>{let i;s.renderer.coordinateSystem===d?(e=qi(e.x,e.y.oneMinus()).mul(2).sub(1),i=tn(Qi(e,t),1)):i=tn(Qi(e.x,e.y.oneMinus(),t).mul(2).sub(1),1);const n=tn(r.mul(i));return n.xyz.div(n.w)})),my=Vi((([e,t])=>{const r=t.mul(tn(e,1)),s=r.xy.div(r.w).mul(.5).add(.5).toVar();return qi(s.x,s.y.oneMinus())})),fy=Vi((([e,t,r])=>{const s=Gu(Wu(t)),i=Xi(e.mul(s)).toVar(),n=Wu(t,i).toVar(),a=Wu(t,i.sub(Xi(2,0))).toVar(),o=Wu(t,i.sub(Xi(1,0))).toVar(),u=Wu(t,i.add(Xi(1,0))).toVar(),l=Wu(t,i.add(Xi(2,0))).toVar(),d=Wu(t,i.add(Xi(0,2))).toVar(),c=Wu(t,i.add(Xi(0,1))).toVar(),h=Wu(t,i.sub(Xi(0,1))).toVar(),p=Wu(t,i.sub(Xi(0,2))).toVar(),g=Qa(ia($i(2).mul(o).sub(a),n)).toVar(),m=Qa(ia($i(2).mul(u).sub(l),n)).toVar(),f=Qa(ia($i(2).mul(c).sub(d),n)).toVar(),y=Qa(ia($i(2).mul(h).sub(p),n)).toVar(),x=gy(e,n,r).toVar(),b=g.lessThan(m).select(x.sub(gy(e.sub(qi($i(1).div(s.x),0)),o,r)),x.negate().add(gy(e.add(qi($i(1).div(s.x),0)),u,r))),T=f.lessThan(y).select(x.sub(gy(e.add(qi(0,$i(1).div(s.y))),c,r)),x.negate().add(gy(e.sub(qi(0,$i(1).div(s.y))),h,r)));return $a(bo(b,T))}));class yy extends M{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageInstancedBufferAttribute=!0}}class xy extends le{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageBufferAttribute=!0}}class by extends Du{static get type(){return"VertexColorNode"}constructor(e=0){super(null,"vec4"),this.isVertexColorNode=!0,this.index=e}getAttributeName(){const e=this.index;return"color"+(e>0?e:"")}generate(e){const t=this.getAttributeName(e);let r;return r=!0===e.hasGeometryAttribute(t)?super.generate(e):e.generateConst(this.nodeType,new s(1,1,1,1)),r}serialize(e){super.serialize(e),e.index=this.index}deserialize(e){super.deserialize(e),this.index=e.index}}class Ty extends $s{static get type(){return"PointUVNode"}constructor(){super("vec2"),this.isPointUVNode=!0}generate(){return"vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y )"}}const _y=Ii(Ty),vy=new S,Ny=new a;class Sy extends $s{static get type(){return"SceneNode"}constructor(e=Sy.BACKGROUND_BLURRINESS,t=null){super(),this.scope=e,this.scene=t}setup(e){const t=this.scope,r=null!==this.scene?this.scene:e.scene;let s;return t===Sy.BACKGROUND_BLURRINESS?s=ad("backgroundBlurriness","float",r):t===Sy.BACKGROUND_INTENSITY?s=ad("backgroundIntensity","float",r):t===Sy.BACKGROUND_ROTATION?s=Tn("mat4").label("backgroundRotation").setGroup(yn).onRenderUpdate((()=>{const e=r.background;return null!==e&&e.isTexture&&e.mapping!==Be?(vy.copy(r.backgroundRotation),vy.x*=-1,vy.y*=-1,vy.z*=-1,Ny.makeRotationFromEuler(vy)):Ny.identity(),Ny})):console.error("THREE.SceneNode: Unknown scope:",t),s}}Sy.BACKGROUND_BLURRINESS="backgroundBlurriness",Sy.BACKGROUND_INTENSITY="backgroundIntensity",Sy.BACKGROUND_ROTATION="backgroundRotation";const Ey=Ii(Sy,Sy.BACKGROUND_BLURRINESS),wy=Ii(Sy,Sy.BACKGROUND_INTENSITY),Ay=Ii(Sy,Sy.BACKGROUND_ROTATION);class Ry extends $u{static get type(){return"StorageTextureNode"}constructor(e,t,r=null){super(e,t),this.storeNode=r,this.isStorageTextureNode=!0,this.access=Vs.WRITE_ONLY}getInputType(){return"storageTexture"}setup(e){super.setup(e);e.getNodeProperties(this).storeNode=this.storeNode}setAccess(e){return this.access=e,this}generate(e,t){let r;return r=null!==this.storeNode?this.generateStore(e):super.generate(e,t),r}toReadWrite(){return this.setAccess(Vs.READ_WRITE)}toReadOnly(){return this.setAccess(Vs.READ_ONLY)}toWriteOnly(){return this.setAccess(Vs.WRITE_ONLY)}generateStore(e){const t=e.getNodeProperties(this),{uvNode:r,storeNode:s}=t,i=super.generate(e,"property"),n=r.build(e,"uvec2"),a=s.build(e,"vec4"),o=e.generateTextureStore(e,i,n,a);e.addLineFlowCode(o,this)}}const Cy=Bi(Ry).setParameterLength(1,3),My=Vi((({texture:e,uv:t})=>{const r=1e-4,s=Qi().toVar();return Gi(t.x.lessThan(r),(()=>{s.assign(Qi(1,0,0))})).ElseIf(t.y.lessThan(r),(()=>{s.assign(Qi(0,1,0))})).ElseIf(t.z.lessThan(r),(()=>{s.assign(Qi(0,0,1))})).ElseIf(t.x.greaterThan(.9999),(()=>{s.assign(Qi(-1,0,0))})).ElseIf(t.y.greaterThan(.9999),(()=>{s.assign(Qi(0,-1,0))})).ElseIf(t.z.greaterThan(.9999),(()=>{s.assign(Qi(0,0,-1))})).Else((()=>{const r=.01,i=e.sample(t.add(Qi(-.01,0,0))).r.sub(e.sample(t.add(Qi(r,0,0))).r),n=e.sample(t.add(Qi(0,-.01,0))).r.sub(e.sample(t.add(Qi(0,r,0))).r),a=e.sample(t.add(Qi(0,0,-.01))).r.sub(e.sample(t.add(Qi(0,0,r))).r);s.assign(Qi(i,n,a))})),s.normalize()}));class Py extends $u{static get type(){return"Texture3DNode"}constructor(e,t=null,r=null){super(e,t,r),this.isTexture3DNode=!0}getInputType(){return"texture3D"}getDefaultUV(){return Qi(.5,.5,.5)}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return!e.isFlipY()||!0!==r.isRenderTargetTexture&&!0!==r.isFramebufferTexture||(t=this.sampler?t.flipY():t.setY(Hi(Gu(this,this.levelNode).y).sub(t.y).sub(1))),t}generateUV(e,t){return t.build(e,"vec3")}normal(e){return My({texture:this,uv:e})}}const Ly=Bi(Py).setParameterLength(1,3);class Fy extends nd{static get type(){return"UserDataNode"}constructor(e,t,r=null){super(e,t,r),this.userData=r}updateReference(e){return this.reference=null!==this.userData?this.userData:e.object.userData,this.reference}}const By=new WeakMap;class Iy extends js{static get type(){return"VelocityNode"}constructor(){super("vec2"),this.projectionMatrix=null,this.updateType=Is.OBJECT,this.updateAfterType=Is.OBJECT,this.previousModelWorldMatrix=Tn(new a),this.previousProjectionMatrix=Tn(new a).setGroup(yn),this.previousCameraViewMatrix=Tn(new a)}setProjectionMatrix(e){this.projectionMatrix=e}update({frameId:e,camera:t,object:r}){const s=Vy(r);this.previousModelWorldMatrix.value.copy(s);const i=Dy(t);i.frameId!==e&&(i.frameId=e,void 0===i.previousProjectionMatrix?(i.previousProjectionMatrix=new a,i.previousCameraViewMatrix=new a,i.currentProjectionMatrix=new a,i.currentCameraViewMatrix=new a,i.previousProjectionMatrix.copy(this.projectionMatrix||t.projectionMatrix),i.previousCameraViewMatrix.copy(t.matrixWorldInverse)):(i.previousProjectionMatrix.copy(i.currentProjectionMatrix),i.previousCameraViewMatrix.copy(i.currentCameraViewMatrix)),i.currentProjectionMatrix.copy(this.projectionMatrix||t.projectionMatrix),i.currentCameraViewMatrix.copy(t.matrixWorldInverse),this.previousProjectionMatrix.value.copy(i.previousProjectionMatrix),this.previousCameraViewMatrix.value.copy(i.previousCameraViewMatrix))}updateAfter({object:e}){Vy(e).copy(e.matrixWorld)}setup(){const e=null===this.projectionMatrix?el:Tn(this.projectionMatrix),t=this.previousCameraViewMatrix.mul(this.previousModelWorldMatrix),r=e.mul(Nl).mul(Rl),s=this.previousProjectionMatrix.mul(t).mul(Cl),i=r.xy.div(r.w),n=s.xy.div(s.w);return ia(i,n)}}function Dy(e){let t=By.get(e);return void 0===t&&(t={},By.set(e,t)),t}function Vy(e,t=0){const r=Dy(e);let s=r[t];return void 0===s&&(r[t]=s=new a),s}const Uy=Ii(Iy),Oy=Vi((([e,t])=>ho(1,e.oneMinus().div(t)).oneMinus())).setLayout({name:"blendBurn",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Gy=Vi((([e,t])=>ho(e.div(t.oneMinus()),1))).setLayout({name:"blendDodge",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),ky=Vi((([e,t])=>e.oneMinus().mul(t.oneMinus()).oneMinus())).setLayout({name:"blendScreen",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),zy=Vi((([e,t])=>Ao(e.mul(2).mul(t),e.oneMinus().mul(2).mul(t.oneMinus()).oneMinus(),go(.5,e)))).setLayout({name:"blendOverlay",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),$y=Vi((([e,t])=>{const r=t.a.add(e.a.mul(t.a.oneMinus()));return tn(t.rgb.mul(t.a).add(e.rgb.mul(e.a).mul(t.a.oneMinus())).div(r),r)})).setLayout({name:"blendColor",type:"vec4",inputs:[{name:"base",type:"vec4"},{name:"blend",type:"vec4"}]}),Hy=Vi((([e])=>Xy(e.rgb))),Wy=Vi((([e,t=$i(1)])=>t.mix(Xy(e.rgb),e.rgb))),jy=Vi((([e,t=$i(1)])=>{const r=sa(e.r,e.g,e.b).div(3),s=e.r.max(e.g.max(e.b)),i=s.sub(r).mul(t).mul(-3);return Ao(e.rgb,s,i)})),qy=Vi((([e,t=$i(1)])=>{const r=Qi(.57735,.57735,.57735),s=t.cos();return Qi(e.rgb.mul(s).add(r.cross(e.rgb).mul(t.sin()).add(r.mul(xo(r,e.rgb).mul(s.oneMinus())))))})),Xy=(e,t=Qi(c.getLuminanceCoefficients(new r)))=>xo(e,t),Ky=Vi((([e,t=Qi(1),s=Qi(0),i=Qi(1),n=$i(1),a=Qi(c.getLuminanceCoefficients(new r,de))])=>{const o=e.rgb.dot(Qi(a)),u=po(e.rgb.mul(t).add(s),0).toVar(),l=u.pow(i).toVar();return Gi(u.r.greaterThan(0),(()=>{u.r.assign(l.r)})),Gi(u.g.greaterThan(0),(()=>{u.g.assign(l.g)})),Gi(u.b.greaterThan(0),(()=>{u.b.assign(l.b)})),u.assign(o.add(u.sub(o).mul(n))),tn(u.rgb,e.a)}));class Yy extends js{static get type(){return"PosterizeNode"}constructor(e,t){super(),this.sourceNode=e,this.stepsNode=t}setup(){const{sourceNode:e,stepsNode:t}=this;return e.mul(t).floor().div(t)}}const Qy=Bi(Yy).setParameterLength(2),Zy=new t;class Jy extends $u{static get type(){return"PassTextureNode"}constructor(e,t){super(t),this.passNode=e,this.setUpdateMatrix(!1)}setup(e){return e.object.isQuadMesh&&this.passNode.build(e),super.setup(e)}clone(){return new this.constructor(this.passNode,this.value)}}class ex extends Jy{static get type(){return"PassMultipleTextureNode"}constructor(e,t,r=!1){super(e,null),this.textureName=t,this.previousTexture=r}updateTexture(){this.value=this.previousTexture?this.passNode.getPreviousTexture(this.textureName):this.passNode.getTexture(this.textureName)}setup(e){return this.updateTexture(),super.setup(e)}clone(){return new this.constructor(this.passNode,this.textureName,this.previousTexture)}}class tx extends js{static get type(){return"PassNode"}constructor(e,t,r,s={}){super("vec4"),this.scope=e,this.scene=t,this.camera=r,this.options=s,this._pixelRatio=1,this._width=1,this._height=1;const i=new I;i.isRenderTargetTexture=!0,i.name="depth";const n=new ae(this._width*this._pixelRatio,this._height*this._pixelRatio,{type:he,...s});n.texture.name="output",n.depthTexture=i,this.renderTarget=n,this._textures={output:n.texture,depth:i},this._textureNodes={},this._linearDepthNodes={},this._viewZNodes={},this._previousTextures={},this._previousTextureNodes={},this._cameraNear=Tn(0),this._cameraFar=Tn(0),this._mrt=null,this._layers=null,this._resolution=1,this.isPassNode=!0,this.updateBeforeType=Is.FRAME}setResolution(e){return this._resolution=e,this}getResolution(){return this._resolution}setLayers(e){return this._layers=e,this}getLayers(){return this._layers}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}isGlobal(){return!0}getTexture(e){let t=this._textures[e];if(void 0===t){t=this.renderTarget.texture.clone(),t.name=e,this._textures[e]=t,this.renderTarget.textures.push(t)}return t}getPreviousTexture(e){let t=this._previousTextures[e];return void 0===t&&(t=this.getTexture(e).clone(),this._previousTextures[e]=t),t}toggleTexture(e){const t=this._previousTextures[e];if(void 0!==t){const r=this._textures[e],s=this.renderTarget.textures.indexOf(r);this.renderTarget.textures[s]=t,this._textures[e]=t,this._previousTextures[e]=r,this._textureNodes[e].updateTexture(),this._previousTextureNodes[e].updateTexture()}}getTextureNode(e="output"){let t=this._textureNodes[e];return void 0===t&&(t=Pi(new ex(this,e)),t.updateTexture(),this._textureNodes[e]=t),t}getPreviousTextureNode(e="output"){let t=this._previousTextureNodes[e];return void 0===t&&(void 0===this._textureNodes[e]&&this.getTextureNode(e),t=Pi(new ex(this,e,!0)),t.updateTexture(),this._previousTextureNodes[e]=t),t}getViewZNode(e="depth"){let t=this._viewZNodes[e];if(void 0===t){const r=this._cameraNear,s=this._cameraFar;this._viewZNodes[e]=t=vh(this.getTextureNode(e),r,s)}return t}getLinearDepthNode(e="depth"){let t=this._linearDepthNodes[e];if(void 0===t){const r=this._cameraNear,s=this._cameraFar,i=this.getViewZNode(e);this._linearDepthNodes[e]=t=Th(i,r,s)}return t}setup({renderer:e}){return this.renderTarget.samples=void 0===this.options.samples?e.samples:this.options.samples,!0===e.backend.isWebGLBackend&&(this.renderTarget.samples=0),this.renderTarget.texture.type=e.getColorBufferType(),this.scope===tx.COLOR?this.getTextureNode():this.getLinearDepthNode()}updateBefore(e){const{renderer:t}=e,{scene:r}=this;let s,i;const n=t.getOutputRenderTarget();n&&!0===n.isXRRenderTarget?(i=1,s=t.xr.getCamera(),t.xr.updateCamera(s),Zy.set(n.width,n.height)):(s=this.camera,i=t.getPixelRatio(),t.getSize(Zy)),this._pixelRatio=i,this.setSize(Zy.width,Zy.height);const a=t.getRenderTarget(),o=t.getMRT(),u=s.layers.mask;this._cameraNear.value=s.near,this._cameraFar.value=s.far,null!==this._layers&&(s.layers.mask=this._layers.mask);for(const e in this._previousTextures)this.toggleTexture(e);t.setRenderTarget(this.renderTarget),t.setMRT(this._mrt),t.render(r,s),t.setRenderTarget(a),t.setMRT(o),s.layers.mask=u}setSize(e,t){this._width=e,this._height=t;const r=this._width*this._pixelRatio*this._resolution,s=this._height*this._pixelRatio*this._resolution;this.renderTarget.setSize(r,s)}setPixelRatio(e){this._pixelRatio=e,this.setSize(this._width,this._height)}dispose(){this.renderTarget.dispose()}}tx.COLOR="color",tx.DEPTH="depth";class rx extends tx{static get type(){return"ToonOutlinePassNode"}constructor(e,t,r,s,i){super(tx.COLOR,e,t),this.colorNode=r,this.thicknessNode=s,this.alphaNode=i,this._materialCache=new WeakMap}updateBefore(e){const{renderer:t}=e,r=t.getRenderObjectFunction();t.setRenderObjectFunction(((e,r,s,i,n,a,o,u)=>{if((n.isMeshToonMaterial||n.isMeshToonNodeMaterial)&&!1===n.wireframe){const l=this._getOutlineMaterial(n);t.renderObject(e,r,s,i,l,a,o,u)}t.renderObject(e,r,s,i,n,a,o,u)})),super.updateBefore(e),t.setRenderObjectFunction(r)}_createMaterial(){const e=new Fh;e.isMeshToonOutlineMaterial=!0,e.name="Toon_Outline",e.side=N;const t=Ul.negate(),r=el.mul(Nl),s=$i(1),i=r.mul(tn(Rl,1)),n=r.mul(tn(Rl.add(t),1)),a=$a(i.sub(n));return e.vertexNode=i.add(a.mul(this.thicknessNode).mul(i.w).mul(s)),e.colorNode=tn(this.colorNode,this.alphaNode),e}_getOutlineMaterial(e){let t=this._materialCache.get(e);return void 0===t&&(t=this._createMaterial(),this._materialCache.set(e,t)),t}}const sx=Vi((([e,t])=>e.mul(t).clamp())).setLayout({name:"linearToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),ix=Vi((([e,t])=>(e=e.mul(t)).div(e.add(1)).clamp())).setLayout({name:"reinhardToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),nx=Vi((([e,t])=>{const r=(e=(e=e.mul(t)).sub(.004).max(0)).mul(e.mul(6.2).add(.5)),s=e.mul(e.mul(6.2).add(1.7)).add(.06);return r.div(s).pow(2.2)})).setLayout({name:"cineonToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),ax=Vi((([e])=>{const t=e.mul(e.add(.0245786)).sub(90537e-9),r=e.mul(e.add(.432951).mul(.983729)).add(.238081);return t.div(r)})),ox=Vi((([e,t])=>{const r=on(.59719,.35458,.04823,.076,.90834,.01566,.0284,.13383,.83777),s=on(1.60475,-.53108,-.07367,-.10208,1.10813,-.00605,-.00327,-.07276,1.07602);return e=e.mul(t).div(.6),e=r.mul(e),e=ax(e),(e=s.mul(e)).clamp()})).setLayout({name:"acesFilmicToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),ux=on(Qi(1.6605,-.1246,-.0182),Qi(-.5876,1.1329,-.1006),Qi(-.0728,-.0083,1.1187)),lx=on(Qi(.6274,.0691,.0164),Qi(.3293,.9195,.088),Qi(.0433,.0113,.8956)),dx=Vi((([e])=>{const t=Qi(e).toVar(),r=Qi(t.mul(t)).toVar(),s=Qi(r.mul(r)).toVar();return $i(15.5).mul(s.mul(r)).sub(na(40.14,s.mul(t))).add(na(31.96,s).sub(na(6.868,r.mul(t))).add(na(.4298,r).add(na(.1191,t).sub(.00232))))})),cx=Vi((([e,t])=>{const r=Qi(e).toVar(),s=on(Qi(.856627153315983,.137318972929847,.11189821299995),Qi(.0951212405381588,.761241990602591,.0767994186031903),Qi(.0482516061458583,.101439036467562,.811302368396859)),i=on(Qi(1.1271005818144368,-.1413297634984383,-.14132976349843826),Qi(-.11060664309660323,1.157823702216272,-.11060664309660294),Qi(-.016493938717834573,-.016493938717834257,1.2519364065950405)),n=$i(-12.47393),a=$i(4.026069);return r.mulAssign(t),r.assign(lx.mul(r)),r.assign(s.mul(r)),r.assign(po(r,1e-10)),r.assign(Ua(r)),r.assign(r.sub(n).div(a.sub(n))),r.assign(Ro(r,0,1)),r.assign(dx(r)),r.assign(i.mul(r)),r.assign(To(po(Qi(0),r),Qi(2.2))),r.assign(ux.mul(r)),r.assign(Ro(r,0,1)),r})).setLayout({name:"agxToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),hx=Vi((([e,t])=>{const r=$i(.76),s=$i(.15);e=e.mul(t);const i=ho(e.r,ho(e.g,e.b)),n=Go(i.lessThan(.08),i.sub(na(6.25,i.mul(i))),.04);e.subAssign(n);const a=po(e.r,po(e.g,e.b));Gi(a.lessThan(r),(()=>e));const o=ia(1,r),u=ia(1,o.mul(o).div(a.add(o.sub(r))));e.mulAssign(u.div(a));const l=ia(1,aa(1,s.mul(a.sub(u)).add(1)));return Ao(e,Qi(u),l)})).setLayout({name:"neutralToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]});class px extends $s{static get type(){return"CodeNode"}constructor(e="",t=[],r=""){super("code"),this.isCodeNode=!0,this.code=e,this.includes=t,this.language=r}isGlobal(){return!0}setIncludes(e){return this.includes=e,this}getIncludes(){return this.includes}generate(e){const t=this.getIncludes(e);for(const r of t)r.build(e);const r=e.getCodeFromNode(this,this.getNodeType(e));return r.code=this.code,r.code}serialize(e){super.serialize(e),e.code=this.code,e.language=this.language}deserialize(e){super.deserialize(e),this.code=e.code,this.language=e.language}}const gx=Bi(px).setParameterLength(1,3);class mx extends px{static get type(){return"FunctionNode"}constructor(e="",t=[],r=""){super(e,t,r)}getNodeType(e){return this.getNodeFunction(e).type}getInputs(e){return this.getNodeFunction(e).inputs}getNodeFunction(e){const t=e.getDataFromNode(this);let r=t.nodeFunction;return void 0===r&&(r=e.parser.parseFunction(this.code),t.nodeFunction=r),r}generate(e,t){super.generate(e);const r=this.getNodeFunction(e),s=r.name,i=r.type,n=e.getCodeFromNode(this,i);""!==s&&(n.name=s);const a=e.getPropertyName(n),o=this.getNodeFunction(e).getCode(a);return n.code=o+"\n","property"===t?a:e.format(`${a}()`,i,t)}}const fx=(e,t=[],r="")=>{for(let e=0;es.call(...e);return i.functionNode=s,i};class yx extends $s{static get type(){return"ScriptableValueNode"}constructor(e=null){super(),this._value=e,this._cache=null,this.inputType=null,this.outputType=null,this.events=new o,this.isScriptableValueNode=!0}get isScriptableOutputNode(){return null!==this.outputType}set value(e){this._value!==e&&(this._cache&&"URL"===this.inputType&&this.value.value instanceof ArrayBuffer&&(URL.revokeObjectURL(this._cache),this._cache=null),this._value=e,this.events.dispatchEvent({type:"change"}),this.refresh())}get value(){return this._value}refresh(){this.events.dispatchEvent({type:"refresh"})}getValue(){const e=this.value;if(e&&null===this._cache&&"URL"===this.inputType&&e.value instanceof ArrayBuffer)this._cache=URL.createObjectURL(new Blob([e.value]));else if(e&&null!==e.value&&void 0!==e.value&&(("URL"===this.inputType||"String"===this.inputType)&&"string"==typeof e.value||"Number"===this.inputType&&"number"==typeof e.value||"Vector2"===this.inputType&&e.value.isVector2||"Vector3"===this.inputType&&e.value.isVector3||"Vector4"===this.inputType&&e.value.isVector4||"Color"===this.inputType&&e.value.isColor||"Matrix3"===this.inputType&&e.value.isMatrix3||"Matrix4"===this.inputType&&e.value.isMatrix4))return e.value;return this._cache||e}getNodeType(e){return this.value&&this.value.isNode?this.value.getNodeType(e):"float"}setup(){return this.value&&this.value.isNode?this.value:$i()}serialize(e){super.serialize(e),null!==this.value?"ArrayBuffer"===this.inputType?e.value=Ps(this.value):e.value=this.value?this.value.toJSON(e.meta).uuid:null:e.value=null,e.inputType=this.inputType,e.outputType=this.outputType}deserialize(e){super.deserialize(e);let t=null;null!==e.value&&(t="ArrayBuffer"===e.inputType?Ls(e.value):"Texture"===e.inputType?e.meta.textures[e.value]:e.meta.nodes[e.value]||null),this.value=t,this.inputType=e.inputType,this.outputType=e.outputType}}const xx=Bi(yx).setParameterLength(1);class bx extends Map{get(e,t=null,...r){if(this.has(e))return super.get(e);if(null!==t){const s=t(...r);return this.set(e,s),s}}}class Tx{constructor(e){this.scriptableNode=e}get parameters(){return this.scriptableNode.parameters}get layout(){return this.scriptableNode.getLayout()}getInputLayout(e){return this.scriptableNode.getInputLayout(e)}get(e){const t=this.parameters[e];return t?t.getValue():null}}const _x=new bx;class vx extends $s{static get type(){return"ScriptableNode"}constructor(e=null,t={}){super(),this.codeNode=e,this.parameters=t,this._local=new bx,this._output=xx(null),this._outputs={},this._source=this.source,this._method=null,this._object=null,this._value=null,this._needsOutputUpdate=!0,this.onRefresh=this.onRefresh.bind(this),this.isScriptableNode=!0}get source(){return this.codeNode?this.codeNode.code:""}setLocal(e,t){return this._local.set(e,t)}getLocal(e){return this._local.get(e)}onRefresh(){this._refresh()}getInputLayout(e){for(const t of this.getLayout())if(t.inputType&&(t.id===e||t.name===e))return t}getOutputLayout(e){for(const t of this.getLayout())if(t.outputType&&(t.id===e||t.name===e))return t}setOutput(e,t){const r=this._outputs;return void 0===r[e]?r[e]=xx(t):r[e].value=t,this}getOutput(e){return this._outputs[e]}getParameter(e){return this.parameters[e]}setParameter(e,t){const r=this.parameters;return t&&t.isScriptableNode?(this.deleteParameter(e),r[e]=t,r[e].getDefaultOutput().events.addEventListener("refresh",this.onRefresh)):t&&t.isScriptableValueNode?(this.deleteParameter(e),r[e]=t,r[e].events.addEventListener("refresh",this.onRefresh)):void 0===r[e]?(r[e]=xx(t),r[e].events.addEventListener("refresh",this.onRefresh)):r[e].value=t,this}getValue(){return this.getDefaultOutput().getValue()}deleteParameter(e){let t=this.parameters[e];return t&&(t.isScriptableNode&&(t=t.getDefaultOutput()),t.events.removeEventListener("refresh",this.onRefresh)),this}clearParameters(){for(const e of Object.keys(this.parameters))this.deleteParameter(e);return this.needsUpdate=!0,this}call(e,...t){const r=this.getObject()[e];if("function"==typeof r)return r(...t)}async callAsync(e,...t){const r=this.getObject()[e];if("function"==typeof r)return"AsyncFunction"===r.constructor.name?await r(...t):r(...t)}getNodeType(e){return this.getDefaultOutputNode().getNodeType(e)}refresh(e=null){null!==e?this.getOutput(e).refresh():this._refresh()}getObject(){if(this.needsUpdate&&this.dispose(),null!==this._object)return this._object;const e=new Tx(this),t=_x.get("THREE"),r=_x.get("TSL"),s=this.getMethod(),i=[e,this._local,_x,()=>this.refresh(),(e,t)=>this.setOutput(e,t),t,r];this._object=s(...i);const n=this._object.layout;if(n&&(!1===n.cache&&this._local.clear(),this._output.outputType=n.outputType||null,Array.isArray(n.elements)))for(const e of n.elements){const t=e.id||e.name;e.inputType&&(void 0===this.getParameter(t)&&this.setParameter(t,null),this.getParameter(t).inputType=e.inputType),e.outputType&&(void 0===this.getOutput(t)&&this.setOutput(t,null),this.getOutput(t).outputType=e.outputType)}return this._object}deserialize(e){super.deserialize(e);for(const e in this.parameters){let t=this.parameters[e];t.isScriptableNode&&(t=t.getDefaultOutput()),t.events.addEventListener("refresh",this.onRefresh)}}getLayout(){return this.getObject().layout}getDefaultOutputNode(){const e=this.getDefaultOutput().value;return e&&e.isNode?e:$i()}getDefaultOutput(){return this._exec()._output}getMethod(){if(this.needsUpdate&&this.dispose(),null!==this._method)return this._method;const e=["layout","init","main","dispose"].join(", "),t="\nreturn { ...output, "+e+" };",r="var "+e+"; var output = {};\n"+this.codeNode.code+t;return this._method=new Function(...["parameters","local","global","refresh","setOutput","THREE","TSL"],r),this._method}dispose(){null!==this._method&&(this._object&&"function"==typeof this._object.dispose&&this._object.dispose(),this._method=null,this._object=null,this._source=null,this._value=null,this._needsOutputUpdate=!0,this._output.value=null,this._outputs={})}setup(){return this.getDefaultOutputNode()}getCacheKey(e){const t=[xs(this.source),this.getDefaultOutputNode().getCacheKey(e)];for(const r in this.parameters)t.push(this.parameters[r].getCacheKey(e));return bs(t)}set needsUpdate(e){!0===e&&this.dispose()}get needsUpdate(){return this.source!==this._source}_exec(){return null===this.codeNode||(!0===this._needsOutputUpdate&&(this._value=this.call("main"),this._needsOutputUpdate=!1),this._output.value=this._value),this}_refresh(){this.needsUpdate=!0,this._exec(),this._output.refresh()}}const Nx=Bi(vx).setParameterLength(1,2);function Sx(e){let t;const r=e.context.getViewZ;return void 0!==r&&(t=r(this)),(t||Ll.z).negate()}const Ex=Vi((([e,t],r)=>{const s=Sx(r);return Po(e,t,s)})),wx=Vi((([e],t)=>{const r=Sx(t);return e.mul(e,r,r).negate().exp().oneMinus()})),Ax=Vi((([e,t])=>tn(t.toFloat().mix(zn.rgb,e.toVec3()),zn.a)));let Rx=null,Cx=null;class Mx extends $s{static get type(){return"RangeNode"}constructor(e=$i(),t=$i()){super(),this.minNode=e,this.maxNode=t}getVectorLength(e){const t=e.getTypeLength(Rs(this.minNode.value)),r=e.getTypeLength(Rs(this.maxNode.value));return t>r?t:r}getNodeType(e){return e.object.count>1?e.getTypeFromLength(this.getVectorLength(e)):"float"}setup(e){const t=e.object;let r=null;if(t.count>1){const i=this.minNode.value,n=this.maxNode.value,a=e.getTypeLength(Rs(i)),o=e.getTypeLength(Rs(n));Rx=Rx||new s,Cx=Cx||new s,Rx.setScalar(0),Cx.setScalar(0),1===a?Rx.setScalar(i):i.isColor?Rx.set(i.r,i.g,i.b,1):Rx.set(i.x,i.y,i.z||0,i.w||0),1===o?Cx.setScalar(n):n.isColor?Cx.set(n.r,n.g,n.b,1):Cx.set(n.x,n.y,n.z||0,n.w||0);const l=4,d=l*t.count,c=new Float32Array(d);for(let e=0;ePi(new Lx(e,t)),Bx=Fx("numWorkgroups","uvec3"),Ix=Fx("workgroupId","uvec3"),Dx=Fx("globalId","uvec3"),Vx=Fx("localId","uvec3"),Ux=Fx("subgroupSize","uint");const Ox=Bi(class extends $s{constructor(e){super(),this.scope=e}generate(e){const{scope:t}=this,{renderer:r}=e;!0===r.backend.isWebGLBackend?e.addFlowCode(`\t// ${t}Barrier \n`):e.addLineFlowCode(`${t}Barrier()`,this)}});class Gx extends Hs{constructor(e,t){super(e,t),this.isWorkgroupInfoElementNode=!0}generate(e,t){let r;const s=e.context.assign;if(r=super.generate(e),!0!==s){const s=this.getNodeType(e);r=e.format(r,s,t)}return r}}class kx extends $s{constructor(e,t,r=0){super(t),this.bufferType=t,this.bufferCount=r,this.isWorkgroupInfoNode=!0,this.elementType=t,this.scope=e}label(e){return this.name=e,this}setScope(e){return this.scope=e,this}getElementType(){return this.elementType}getInputType(){return`${this.scope}Array`}element(e){return Pi(new Gx(this,e))}generate(e){return e.getScopedArray(this.name||`${this.scope}Array_${this.id}`,this.scope.toLowerCase(),this.bufferType,this.bufferCount)}}class zx extends js{static get type(){return"AtomicFunctionNode"}constructor(e,t,r){super("uint"),this.method=e,this.pointerNode=t,this.valueNode=r}getInputType(e){return this.pointerNode.getNodeType(e)}getNodeType(e){return this.getInputType(e)}generate(e){const t=this.method,r=this.getNodeType(e),s=this.getInputType(e),i=this.pointerNode,n=this.valueNode,a=[];a.push(`&${i.build(e,s)}`),null!==n&&a.push(n.build(e,s));const o=`${e.getMethod(t,r)}( ${a.join(", ")} )`;return null!==n&&e.addLineFlowCode(o,this),o}}zx.ATOMIC_LOAD="atomicLoad",zx.ATOMIC_STORE="atomicStore",zx.ATOMIC_ADD="atomicAdd",zx.ATOMIC_SUB="atomicSub",zx.ATOMIC_MAX="atomicMax",zx.ATOMIC_MIN="atomicMin",zx.ATOMIC_AND="atomicAnd",zx.ATOMIC_OR="atomicOr",zx.ATOMIC_XOR="atomicXor";const $x=Bi(zx),Hx=(e,t,r)=>{const s=$x(e,t,r);return s.append(),s};let Wx;function jx(e){Wx=Wx||new WeakMap;let t=Wx.get(e);return void 0===t&&Wx.set(e,t={}),t}function qx(e){const t=jx(e);return t.shadowMatrix||(t.shadowMatrix=Tn("mat4").setGroup(yn).onRenderUpdate((()=>(!0!==e.castShadow&&e.shadow.updateMatrices(e),e.shadow.matrix))))}function Xx(e,t=Ml){const r=qx(e).mul(t);return r.xyz.div(r.w)}function Kx(e){const t=jx(e);return t.position||(t.position=Tn(new r).setGroup(yn).onRenderUpdate(((t,r)=>r.value.setFromMatrixPosition(e.matrixWorld))))}function Yx(e){const t=jx(e);return t.targetPosition||(t.targetPosition=Tn(new r).setGroup(yn).onRenderUpdate(((t,r)=>r.value.setFromMatrixPosition(e.target.matrixWorld))))}function Qx(e){const t=jx(e);return t.viewPosition||(t.viewPosition=Tn(new r).setGroup(yn).onRenderUpdate((({camera:t},s)=>{s.value=s.value||new r,s.value.setFromMatrixPosition(e.matrixWorld),s.value.applyMatrix4(t.matrixWorldInverse)})))}const Zx=e=>rl.transformDirection(Kx(e).sub(Yx(e))),Jx=(e,t)=>{for(const r of t)if(r.isAnalyticLightNode&&r.light.id===e)return r;return null},eb=new WeakMap;class tb extends $s{static get type(){return"LightsNode"}constructor(){super("vec3"),this.totalDiffuseNode=Qi().toVar(),this.totalSpecularNode=Qi().toVar(),this.outgoingLightNode=Qi().toVar(),this._lights=[],this._lightNodes=null,this._lightNodesHash=null,this.global=!0}customCacheKey(){const e=[],t=this._lights;for(let r=0;re.sort(((e,t)=>e.id-t.id)))(this._lights),i=e.renderer.library;for(const e of s)if(e.isNode)t.push(Pi(e));else{let s=null;if(null!==r&&(s=Jx(e.id,r)),null===s){const r=i.getLightNodeClass(e.constructor);if(null===r){console.warn(`LightsNode.setupNodeLights: Light node not found for ${e.constructor.name}`);continue}let s=null;eb.has(e)?s=eb.get(e):(s=Pi(new r(e)),eb.set(e,s)),t.push(s)}}this._lightNodes=t}setupDirectLight(e,t,r){const{lightingModel:s,reflectedLight:i}=e.context;s.direct({...r,lightNode:t,reflectedLight:i},e)}setupDirectRectAreaLight(e,t,r){const{lightingModel:s,reflectedLight:i}=e.context;s.directRectArea({...r,lightNode:t,reflectedLight:i},e)}setupLights(e,t){for(const r of t)r.build(e)}getLightNodes(e){return null===this._lightNodes&&this.setupLightsNode(e),this._lightNodes}setup(e){const t=e.lightsNode;e.lightsNode=this;let r=this.outgoingLightNode;const s=e.context,i=s.lightingModel,n=e.getDataFromNode(this);if(i){const{totalDiffuseNode:t,totalSpecularNode:a}=this;s.outgoingLight=r;const o=e.addStack();n.nodes=o.nodes,i.start(e);const{backdrop:u,backdropAlpha:l}=s,{directDiffuse:d,directSpecular:c,indirectDiffuse:h,indirectSpecular:p}=s.reflectedLight;let g=d.add(h);null!==u&&(g=Qi(null!==l?l.mix(g,u):u),s.material.transparent=!0),t.assign(g),a.assign(c.add(p)),r.assign(t.add(a)),i.finish(e),r=r.bypass(e.removeStack())}else n.nodes=[];return e.lightsNode=t,r}setLights(e){return this._lights=e,this._lightNodes=null,this._lightNodesHash=null,this}getLights(){return this._lights}get hasLights(){return this._lights.length>0}}class rb extends $s{static get type(){return"ShadowBaseNode"}constructor(e){super(),this.light=e,this.updateBeforeType=Is.RENDER,this.isShadowBaseNode=!0}setupShadowPosition({context:e,material:t}){sb.assign(t.shadowPositionNode||e.shadowPositionWorld||Ml)}dispose(){this.updateBeforeType=Is.NONE}}const sb=vn("vec3","shadowPositionWorld");function ib(t,r={}){return r.toneMapping=t.toneMapping,r.toneMappingExposure=t.toneMappingExposure,r.outputColorSpace=t.outputColorSpace,r.renderTarget=t.getRenderTarget(),r.activeCubeFace=t.getActiveCubeFace(),r.activeMipmapLevel=t.getActiveMipmapLevel(),r.renderObjectFunction=t.getRenderObjectFunction(),r.pixelRatio=t.getPixelRatio(),r.mrt=t.getMRT(),r.clearColor=t.getClearColor(r.clearColor||new e),r.clearAlpha=t.getClearAlpha(),r.autoClear=t.autoClear,r.scissorTest=t.getScissorTest(),r}function nb(e,t){return t=ib(e,t),e.setMRT(null),e.setRenderObjectFunction(null),e.setClearColor(0,1),e.autoClear=!0,t}function ab(e,t){e.toneMapping=t.toneMapping,e.toneMappingExposure=t.toneMappingExposure,e.outputColorSpace=t.outputColorSpace,e.setRenderTarget(t.renderTarget,t.activeCubeFace,t.activeMipmapLevel),e.setRenderObjectFunction(t.renderObjectFunction),e.setPixelRatio(t.pixelRatio),e.setMRT(t.mrt),e.setClearColor(t.clearColor,t.clearAlpha),e.autoClear=t.autoClear,e.setScissorTest(t.scissorTest)}function ob(e,t={}){return t.background=e.background,t.backgroundNode=e.backgroundNode,t.overrideMaterial=e.overrideMaterial,t}function ub(e,t){return t=ob(e,t),e.background=null,e.backgroundNode=null,e.overrideMaterial=null,t}function lb(e,t){e.background=t.background,e.backgroundNode=t.backgroundNode,e.overrideMaterial=t.overrideMaterial}function db(e,t,r){return r=ub(t,r=nb(e,r))}function cb(e,t,r){ab(e,r),lb(t,r)}var hb=Object.freeze({__proto__:null,resetRendererAndSceneState:db,resetRendererState:nb,resetSceneState:ub,restoreRendererAndSceneState:cb,restoreRendererState:ab,restoreSceneState:lb,saveRendererAndSceneState:function(e,t,r={}){return r=ob(t,r=ib(e,r))},saveRendererState:ib,saveSceneState:ob});const pb=new WeakMap,gb=Vi((([e,t,r])=>{let s=Ml.sub(e).length();return s=s.sub(t).div(r.sub(t)),s=s.saturate(),s})),mb=e=>{let t=pb.get(e);if(void 0===t){const r=e.isPointLight?(e=>{const t=e.shadow.camera,r=ad("near","float",t).setGroup(yn),s=ad("far","float",t).setGroup(yn),i=dl(e);return gb(i,r,s)})(e):null;t=new Fh,t.colorNode=tn(0,0,0,1),t.depthNode=r,t.isShadowPassMaterial=!0,t.name="ShadowMaterial",t.fog=!1,pb.set(e,t)}return t},fb=Vi((({depthTexture:e,shadowCoord:t})=>Hu(e,t.xy).compare(t.z))),yb=Vi((({depthTexture:e,shadowCoord:t,shadow:r})=>{const s=(t,r)=>Hu(e,t).compare(r),i=ad("mapSize","vec2",r).setGroup(yn),n=ad("radius","float",r).setGroup(yn),a=qi(1).div(i),o=a.x.negate().mul(n),u=a.y.negate().mul(n),l=a.x.mul(n),d=a.y.mul(n),c=o.div(2),h=u.div(2),p=l.div(2),g=d.div(2);return sa(s(t.xy.add(qi(o,u)),t.z),s(t.xy.add(qi(0,u)),t.z),s(t.xy.add(qi(l,u)),t.z),s(t.xy.add(qi(c,h)),t.z),s(t.xy.add(qi(0,h)),t.z),s(t.xy.add(qi(p,h)),t.z),s(t.xy.add(qi(o,0)),t.z),s(t.xy.add(qi(c,0)),t.z),s(t.xy,t.z),s(t.xy.add(qi(p,0)),t.z),s(t.xy.add(qi(l,0)),t.z),s(t.xy.add(qi(c,g)),t.z),s(t.xy.add(qi(0,g)),t.z),s(t.xy.add(qi(p,g)),t.z),s(t.xy.add(qi(o,d)),t.z),s(t.xy.add(qi(0,d)),t.z),s(t.xy.add(qi(l,d)),t.z)).mul(1/17)})),xb=Vi((({depthTexture:e,shadowCoord:t,shadow:r})=>{const s=(t,r)=>Hu(e,t).compare(r),i=ad("mapSize","vec2",r).setGroup(yn),n=qi(1).div(i),a=n.x,o=n.y,u=t.xy,l=Ha(u.mul(i).add(.5));return u.subAssign(l.mul(n)),sa(s(u,t.z),s(u.add(qi(a,0)),t.z),s(u.add(qi(0,o)),t.z),s(u.add(n),t.z),Ao(s(u.add(qi(a.negate(),0)),t.z),s(u.add(qi(a.mul(2),0)),t.z),l.x),Ao(s(u.add(qi(a.negate(),o)),t.z),s(u.add(qi(a.mul(2),o)),t.z),l.x),Ao(s(u.add(qi(0,o.negate())),t.z),s(u.add(qi(0,o.mul(2))),t.z),l.y),Ao(s(u.add(qi(a,o.negate())),t.z),s(u.add(qi(a,o.mul(2))),t.z),l.y),Ao(Ao(s(u.add(qi(a.negate(),o.negate())),t.z),s(u.add(qi(a.mul(2),o.negate())),t.z),l.x),Ao(s(u.add(qi(a.negate(),o.mul(2))),t.z),s(u.add(qi(a.mul(2),o.mul(2))),t.z),l.x),l.y)).mul(1/9)})),bb=Vi((({depthTexture:e,shadowCoord:t})=>{const r=$i(1).toVar(),s=Hu(e).sample(t.xy).rg,i=go(t.z,s.x);return Gi(i.notEqual($i(1)),(()=>{const e=t.z.sub(s.x),n=po(0,s.y.mul(s.y));let a=n.div(n.add(e.mul(e)));a=Ro(ia(a,.3).div(.95-.3)),r.assign(Ro(po(i,a)))})),r})),Tb=Vi((({samples:e,radius:t,size:r,shadowPass:s})=>{const i=$i(0).toVar(),n=$i(0).toVar(),a=e.lessThanEqual($i(1)).select($i(0),$i(2).div(e.sub(1))),o=e.lessThanEqual($i(1)).select($i(0),$i(-1));kc({start:Hi(0),end:Hi(e),type:"int",condition:"<"},(({i:e})=>{const u=o.add($i(e).mul(a)),l=s.sample(sa(ih.xy,qi(0,u).mul(t)).div(r)).x;i.addAssign(l),n.addAssign(l.mul(l))})),i.divAssign(e),n.divAssign(e);const u=Oa(n.sub(i.mul(i)));return qi(i,u)})),_b=Vi((({samples:e,radius:t,size:r,shadowPass:s})=>{const i=$i(0).toVar(),n=$i(0).toVar(),a=e.lessThanEqual($i(1)).select($i(0),$i(2).div(e.sub(1))),o=e.lessThanEqual($i(1)).select($i(0),$i(-1));kc({start:Hi(0),end:Hi(e),type:"int",condition:"<"},(({i:e})=>{const u=o.add($i(e).mul(a)),l=s.sample(sa(ih.xy,qi(u,0).mul(t)).div(r));i.addAssign(l.x),n.addAssign(sa(l.y.mul(l.y),l.x.mul(l.x)))})),i.divAssign(e),n.divAssign(e);const u=Oa(n.sub(i.mul(i)));return qi(i,u)})),vb=[fb,yb,xb,bb];let Nb;const Sb=new dy;class Eb extends rb{static get type(){return"ShadowNode"}constructor(e,t=null){super(e),this.shadow=t||e.shadow,this.shadowMap=null,this.vsmShadowMapVertical=null,this.vsmShadowMapHorizontal=null,this.vsmMaterialVertical=null,this.vsmMaterialHorizontal=null,this._node=null,this._cameraFrameId=new WeakMap,this.isShadowNode=!0}setupShadowFilter(e,{filterFn:t,depthTexture:r,shadowCoord:s,shadow:i}){const n=s.x.greaterThanEqual(0).and(s.x.lessThanEqual(1)).and(s.y.greaterThanEqual(0)).and(s.y.lessThanEqual(1)).and(s.z.lessThanEqual(1)),a=t({depthTexture:r,shadowCoord:s,shadow:i});return n.select(a,$i(1))}setupShadowCoord(e,t){const{shadow:r}=this,{renderer:s}=e,i=ad("bias","float",r).setGroup(yn);let n,a=t;if(r.camera.isOrthographicCamera||!0!==s.logarithmicDepthBuffer)a=a.xyz.div(a.w),n=a.z,s.coordinateSystem===d&&(n=n.mul(2).sub(1));else{const e=a.w;a=a.xy.div(e);const t=ad("near","float",r.camera).setGroup(yn),s=ad("far","float",r.camera).setGroup(yn);n=Nh(e.negate(),t,s)}return a=Qi(a.x,a.y.oneMinus(),n.add(i)),a}getShadowFilterFn(e){return vb[e]}setupShadow(e){const{renderer:t}=e,{light:r,shadow:s}=this,i=t.shadowMap.type,n=new I(s.mapSize.width,s.mapSize.height);n.compareFunction=Ie;const a=e.createRenderTarget(s.mapSize.width,s.mapSize.height);if(a.depthTexture=n,s.camera.updateProjectionMatrix(),i===De){n.compareFunction=null,this.vsmShadowMapVertical=e.createRenderTarget(s.mapSize.width,s.mapSize.height,{format:Ve,type:he}),this.vsmShadowMapHorizontal=e.createRenderTarget(s.mapSize.width,s.mapSize.height,{format:Ve,type:he});const t=Hu(n),r=Hu(this.vsmShadowMapVertical.texture),i=ad("blurSamples","float",s).setGroup(yn),a=ad("radius","float",s).setGroup(yn),o=ad("mapSize","vec2",s).setGroup(yn);let u=this.vsmMaterialVertical||(this.vsmMaterialVertical=new Fh);u.fragmentNode=Tb({samples:i,radius:a,size:o,shadowPass:t}).context(e.getSharedContext()),u.name="VSMVertical",u=this.vsmMaterialHorizontal||(this.vsmMaterialHorizontal=new Fh),u.fragmentNode=_b({samples:i,radius:a,size:o,shadowPass:r}).context(e.getSharedContext()),u.name="VSMHorizontal"}const o=ad("intensity","float",s).setGroup(yn),u=ad("normalBias","float",s).setGroup(yn),l=qx(r).mul(sb.add($l.mul(u))),d=this.setupShadowCoord(e,l),c=s.filterNode||this.getShadowFilterFn(t.shadowMap.type)||null;if(null===c)throw new Error("THREE.WebGPURenderer: Shadow map type not supported yet.");const h=i===De?this.vsmShadowMapHorizontal.texture:n,p=this.setupShadowFilter(e,{filterFn:c,shadowTexture:a.texture,depthTexture:h,shadowCoord:d,shadow:s}),g=Hu(a.texture,d),m=Ao(1,p.rgb.mix(g,1),o.mul(g.a)).toVar();return this.shadowMap=a,this.shadow.map=a,m}setup(e){if(!1!==e.renderer.shadowMap.enabled)return Vi((()=>{let t=this._node;return this.setupShadowPosition(e),null===t&&(this._node=t=this.setupShadow(e)),e.material.shadowNode&&console.warn('THREE.NodeMaterial: ".shadowNode" is deprecated. Use ".castShadowNode" instead.'),e.material.receivedShadowNode&&(t=e.material.receivedShadowNode(t)),t}))()}renderShadow(e){const{shadow:t,shadowMap:r,light:s}=this,{renderer:i,scene:n}=e;t.updateMatrices(s),r.setSize(t.mapSize.width,t.mapSize.height),i.render(n,t.camera)}updateShadow(e){const{shadowMap:t,light:r,shadow:s}=this,{renderer:i,scene:n,camera:a}=e,o=i.shadowMap.type,u=t.depthTexture.version;this._depthVersionCached=u,s.camera.layers.mask=a.layers.mask;const l=i.getRenderObjectFunction(),d=i.getMRT(),c=!!d&&d.has("velocity");Nb=db(i,n,Nb),n.overrideMaterial=mb(r),i.setRenderObjectFunction(((e,t,r,n,u,l,...d)=>{(!0===e.castShadow||e.receiveShadow&&o===De)&&(c&&(Ms(e).useVelocity=!0),e.onBeforeShadow(i,e,a,s.camera,n,t.overrideMaterial,l),i.renderObject(e,t,r,n,u,l,...d),e.onAfterShadow(i,e,a,s.camera,n,t.overrideMaterial,l))})),i.setRenderTarget(t),this.renderShadow(e),i.setRenderObjectFunction(l),!0!==r.isPointLight&&o===De&&this.vsmPass(i),cb(i,n,Nb)}vsmPass(e){const{shadow:t}=this;this.vsmShadowMapVertical.setSize(t.mapSize.width,t.mapSize.height),this.vsmShadowMapHorizontal.setSize(t.mapSize.width,t.mapSize.height),e.setRenderTarget(this.vsmShadowMapVertical),Sb.material=this.vsmMaterialVertical,Sb.render(e),e.setRenderTarget(this.vsmShadowMapHorizontal),Sb.material=this.vsmMaterialHorizontal,Sb.render(e)}dispose(){this.shadowMap.dispose(),this.shadowMap=null,null!==this.vsmShadowMapVertical&&(this.vsmShadowMapVertical.dispose(),this.vsmShadowMapVertical=null,this.vsmMaterialVertical.dispose(),this.vsmMaterialVertical=null),null!==this.vsmShadowMapHorizontal&&(this.vsmShadowMapHorizontal.dispose(),this.vsmShadowMapHorizontal=null,this.vsmMaterialHorizontal.dispose(),this.vsmMaterialHorizontal=null),super.dispose()}updateBefore(e){const{shadow:t}=this;let r=t.needsUpdate||t.autoUpdate;r&&(this._cameraFrameId[e.camera]===e.frameId&&(r=!1),this._cameraFrameId[e.camera]=e.frameId),r&&(this.updateShadow(e),this.shadowMap.depthTexture.version===this._depthVersionCached&&(t.needsUpdate=!1))}}const wb=(e,t)=>Pi(new Eb(e,t)),Ab=new e,Rb=Vi((([e,t])=>{const r=e.toVar(),s=Qa(r),i=aa(1,po(s.x,po(s.y,s.z)));s.mulAssign(i),r.mulAssign(i.mul(t.mul(2).oneMinus()));const n=qi(r.xy).toVar(),a=t.mul(1.5).oneMinus();return Gi(s.z.greaterThanEqual(a),(()=>{Gi(r.z.greaterThan(0),(()=>{n.x.assign(ia(4,r.x))}))})).ElseIf(s.x.greaterThanEqual(a),(()=>{const e=Za(r.x);n.x.assign(r.z.mul(e).add(e.mul(2)))})).ElseIf(s.y.greaterThanEqual(a),(()=>{const e=Za(r.y);n.x.assign(r.x.add(e.mul(2)).add(2)),n.y.assign(r.z.mul(e).sub(2))})),qi(.125,.25).mul(n).add(qi(.375,.75)).flipY()})).setLayout({name:"cubeToUV",type:"vec2",inputs:[{name:"pos",type:"vec3"},{name:"texelSizeY",type:"float"}]}),Cb=Vi((({depthTexture:e,bd3D:t,dp:r,texelSize:s})=>Hu(e,Rb(t,s.y)).compare(r))),Mb=Vi((({depthTexture:e,bd3D:t,dp:r,texelSize:s,shadow:i})=>{const n=ad("radius","float",i).setGroup(yn),a=qi(-1,1).mul(n).mul(s.y);return Hu(e,Rb(t.add(a.xyy),s.y)).compare(r).add(Hu(e,Rb(t.add(a.yyy),s.y)).compare(r)).add(Hu(e,Rb(t.add(a.xyx),s.y)).compare(r)).add(Hu(e,Rb(t.add(a.yyx),s.y)).compare(r)).add(Hu(e,Rb(t,s.y)).compare(r)).add(Hu(e,Rb(t.add(a.xxy),s.y)).compare(r)).add(Hu(e,Rb(t.add(a.yxy),s.y)).compare(r)).add(Hu(e,Rb(t.add(a.xxx),s.y)).compare(r)).add(Hu(e,Rb(t.add(a.yxx),s.y)).compare(r)).mul(1/9)})),Pb=Vi((({filterFn:e,depthTexture:t,shadowCoord:r,shadow:s})=>{const i=r.xyz.toVar(),n=i.length(),a=Tn("float").setGroup(yn).onRenderUpdate((()=>s.camera.near)),o=Tn("float").setGroup(yn).onRenderUpdate((()=>s.camera.far)),u=ad("bias","float",s).setGroup(yn),l=Tn(s.mapSize).setGroup(yn),d=$i(1).toVar();return Gi(n.sub(o).lessThanEqual(0).and(n.sub(a).greaterThanEqual(0)),(()=>{const r=n.sub(a).div(o.sub(a)).toVar();r.addAssign(u);const c=i.normalize(),h=qi(1).div(l.mul(qi(4,2)));d.assign(e({depthTexture:t,bd3D:c,dp:r,texelSize:h,shadow:s}))})),d})),Lb=new s,Fb=new t,Bb=new t;class Ib extends Eb{static get type(){return"PointShadowNode"}constructor(e,t=null){super(e,t)}getShadowFilterFn(e){return e===Ue?Cb:Mb}setupShadowCoord(e,t){return t}setupShadowFilter(e,{filterFn:t,shadowTexture:r,depthTexture:s,shadowCoord:i,shadow:n}){return Pb({filterFn:t,shadowTexture:r,depthTexture:s,shadowCoord:i,shadow:n})}renderShadow(e){const{shadow:t,shadowMap:r,light:s}=this,{renderer:i,scene:n}=e,a=t.getFrameExtents();Bb.copy(t.mapSize),Bb.multiply(a),r.setSize(Bb.width,Bb.height),Fb.copy(t.mapSize);const o=i.autoClear,u=i.getClearColor(Ab),l=i.getClearAlpha();i.autoClear=!1,i.setClearColor(t.clearColor,t.clearAlpha),i.clear();const d=t.getViewportCount();for(let e=0;ePi(new Ib(e,t));class Vb extends Xc{static get type(){return"AnalyticLightNode"}constructor(t=null){super(),this.light=t,this.color=new e,this.colorNode=t&&t.colorNode||Tn(this.color).setGroup(yn),this.baseColorNode=null,this.shadowNode=null,this.shadowColorNode=null,this.isAnalyticLightNode=!0,this.updateType=Is.FRAME}customCacheKey(){return Ts(this.light.id,this.light.castShadow?1:0)}getHash(){return this.light.uuid}getLightVector(e){return Qx(this.light).sub(e.context.positionView||Ll)}setupDirect(){}setupDirectRectArea(){}setupShadowNode(){return wb(this.light)}setupShadow(e){const{renderer:t}=e;if(!1===t.shadowMap.enabled)return;let r=this.shadowColorNode;if(null===r){const e=this.light.shadow.shadowNode;let t;t=void 0!==e?Pi(e):this.setupShadowNode(),this.shadowNode=t,this.shadowColorNode=r=this.colorNode.mul(t),this.baseColorNode=this.colorNode}this.colorNode=r}setup(e){this.colorNode=this.baseColorNode||this.colorNode,this.light.castShadow?e.object.receiveShadow&&this.setupShadow(e):null!==this.shadowNode&&(this.shadowNode.dispose(),this.shadowNode=null,this.shadowColorNode=null);const t=this.setupDirect(e),r=this.setupDirectRectArea(e);t&&e.lightsNode.setupDirectLight(e,this,t),r&&e.lightsNode.setupDirectRectAreaLight(e,this,r)}update(){const{light:e}=this;this.color.copy(e.color).multiplyScalar(e.intensity)}}const Ub=Vi((({lightDistance:e,cutoffDistance:t,decayExponent:r})=>{const s=e.pow(r).max(.01).reciprocal();return t.greaterThan(0).select(s.mul(e.div(t).pow4().oneMinus().clamp().pow2()),s)})),Ob=({color:e,lightVector:t,cutoffDistance:r,decayExponent:s})=>{const i=t.normalize(),n=t.length(),a=Ub({lightDistance:n,cutoffDistance:r,decayExponent:s});return{lightDirection:i,lightColor:e.mul(a)}};class Gb extends Vb{static get type(){return"PointLightNode"}constructor(e=null){super(e),this.cutoffDistanceNode=Tn(0).setGroup(yn),this.decayExponentNode=Tn(2).setGroup(yn)}update(e){const{light:t}=this;super.update(e),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}setupShadowNode(){return Db(this.light)}setupDirect(e){return Ob({color:this.colorNode,lightVector:this.getLightVector(e),cutoffDistance:this.cutoffDistanceNode,decayExponent:this.decayExponentNode})}}const kb=Vi((([e=t()])=>{const t=e.mul(2),r=t.x.floor(),s=t.y.floor();return r.add(s).mod(2).sign()})),zb=Vi((([e=Uu()],{renderer:t,material:r})=>{const s=$i(1).toVar(),i=wo(e.mul(2).sub(1));if(r.alphaToCoverage&&t.samples>1){const e=$i(i.fwidth()).toVar();s.assign(Po(e.oneMinus(),e.add(1),i).oneMinus())}else i.greaterThan(1).discard();return s})),$b=Vi((([e,t,r])=>{const s=$i(r).toVar(),i=$i(t).toVar(),n=ji(e).toVar();return Go(n,i,s)})).setLayout({name:"mx_select",type:"float",inputs:[{name:"b",type:"bool"},{name:"t",type:"float"},{name:"f",type:"float"}]}),Hb=Vi((([e,t])=>{const r=ji(t).toVar(),s=$i(e).toVar();return Go(r,s.negate(),s)})).setLayout({name:"mx_negate_if",type:"float",inputs:[{name:"val",type:"float"},{name:"b",type:"bool"}]}),Wb=Vi((([e])=>{const t=$i(e).toVar();return Hi(ka(t))})).setLayout({name:"mx_floor",type:"int",inputs:[{name:"x",type:"float"}]}),jb=Vi((([e,t])=>{const r=$i(e).toVar();return t.assign(Wb(r)),r.sub($i(t))})),qb=Ff([Vi((([e,t,r,s,i,n])=>{const a=$i(n).toVar(),o=$i(i).toVar(),u=$i(s).toVar(),l=$i(r).toVar(),d=$i(t).toVar(),c=$i(e).toVar(),h=$i(ia(1,o)).toVar();return ia(1,a).mul(c.mul(h).add(d.mul(o))).add(a.mul(l.mul(h).add(u.mul(o))))})).setLayout({name:"mx_bilerp_0",type:"float",inputs:[{name:"v0",type:"float"},{name:"v1",type:"float"},{name:"v2",type:"float"},{name:"v3",type:"float"},{name:"s",type:"float"},{name:"t",type:"float"}]}),Vi((([e,t,r,s,i,n])=>{const a=$i(n).toVar(),o=$i(i).toVar(),u=Qi(s).toVar(),l=Qi(r).toVar(),d=Qi(t).toVar(),c=Qi(e).toVar(),h=$i(ia(1,o)).toVar();return ia(1,a).mul(c.mul(h).add(d.mul(o))).add(a.mul(l.mul(h).add(u.mul(o))))})).setLayout({name:"mx_bilerp_1",type:"vec3",inputs:[{name:"v0",type:"vec3"},{name:"v1",type:"vec3"},{name:"v2",type:"vec3"},{name:"v3",type:"vec3"},{name:"s",type:"float"},{name:"t",type:"float"}]})]),Xb=Ff([Vi((([e,t,r,s,i,n,a,o,u,l,d])=>{const c=$i(d).toVar(),h=$i(l).toVar(),p=$i(u).toVar(),g=$i(o).toVar(),m=$i(a).toVar(),f=$i(n).toVar(),y=$i(i).toVar(),x=$i(s).toVar(),b=$i(r).toVar(),T=$i(t).toVar(),_=$i(e).toVar(),v=$i(ia(1,p)).toVar(),N=$i(ia(1,h)).toVar();return $i(ia(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(b.mul(v).add(x.mul(p))))).add(c.mul(N.mul(y.mul(v).add(f.mul(p))).add(h.mul(m.mul(v).add(g.mul(p))))))})).setLayout({name:"mx_trilerp_0",type:"float",inputs:[{name:"v0",type:"float"},{name:"v1",type:"float"},{name:"v2",type:"float"},{name:"v3",type:"float"},{name:"v4",type:"float"},{name:"v5",type:"float"},{name:"v6",type:"float"},{name:"v7",type:"float"},{name:"s",type:"float"},{name:"t",type:"float"},{name:"r",type:"float"}]}),Vi((([e,t,r,s,i,n,a,o,u,l,d])=>{const c=$i(d).toVar(),h=$i(l).toVar(),p=$i(u).toVar(),g=Qi(o).toVar(),m=Qi(a).toVar(),f=Qi(n).toVar(),y=Qi(i).toVar(),x=Qi(s).toVar(),b=Qi(r).toVar(),T=Qi(t).toVar(),_=Qi(e).toVar(),v=$i(ia(1,p)).toVar(),N=$i(ia(1,h)).toVar();return $i(ia(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(b.mul(v).add(x.mul(p))))).add(c.mul(N.mul(y.mul(v).add(f.mul(p))).add(h.mul(m.mul(v).add(g.mul(p))))))})).setLayout({name:"mx_trilerp_1",type:"vec3",inputs:[{name:"v0",type:"vec3"},{name:"v1",type:"vec3"},{name:"v2",type:"vec3"},{name:"v3",type:"vec3"},{name:"v4",type:"vec3"},{name:"v5",type:"vec3"},{name:"v6",type:"vec3"},{name:"v7",type:"vec3"},{name:"s",type:"float"},{name:"t",type:"float"},{name:"r",type:"float"}]})]),Kb=Vi((([e,t,r])=>{const s=$i(r).toVar(),i=$i(t).toVar(),n=Wi(e).toVar(),a=Wi(n.bitAnd(Wi(7))).toVar(),o=$i($b(a.lessThan(Wi(4)),i,s)).toVar(),u=$i(na(2,$b(a.lessThan(Wi(4)),s,i))).toVar();return Hb(o,ji(a.bitAnd(Wi(1)))).add(Hb(u,ji(a.bitAnd(Wi(2)))))})).setLayout({name:"mx_gradient_float_0",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"}]}),Yb=Vi((([e,t,r,s])=>{const i=$i(s).toVar(),n=$i(r).toVar(),a=$i(t).toVar(),o=Wi(e).toVar(),u=Wi(o.bitAnd(Wi(15))).toVar(),l=$i($b(u.lessThan(Wi(8)),a,n)).toVar(),d=$i($b(u.lessThan(Wi(4)),n,$b(u.equal(Wi(12)).or(u.equal(Wi(14))),a,i))).toVar();return Hb(l,ji(u.bitAnd(Wi(1)))).add(Hb(d,ji(u.bitAnd(Wi(2)))))})).setLayout({name:"mx_gradient_float_1",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]}),Qb=Ff([Kb,Yb]),Zb=Vi((([e,t,r])=>{const s=$i(r).toVar(),i=$i(t).toVar(),n=Ji(e).toVar();return Qi(Qb(n.x,i,s),Qb(n.y,i,s),Qb(n.z,i,s))})).setLayout({name:"mx_gradient_vec3_0",type:"vec3",inputs:[{name:"hash",type:"uvec3"},{name:"x",type:"float"},{name:"y",type:"float"}]}),Jb=Vi((([e,t,r,s])=>{const i=$i(s).toVar(),n=$i(r).toVar(),a=$i(t).toVar(),o=Ji(e).toVar();return Qi(Qb(o.x,a,n,i),Qb(o.y,a,n,i),Qb(o.z,a,n,i))})).setLayout({name:"mx_gradient_vec3_1",type:"vec3",inputs:[{name:"hash",type:"uvec3"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]}),eT=Ff([Zb,Jb]),tT=Vi((([e])=>{const t=$i(e).toVar();return na(.6616,t)})).setLayout({name:"mx_gradient_scale2d_0",type:"float",inputs:[{name:"v",type:"float"}]}),rT=Vi((([e])=>{const t=$i(e).toVar();return na(.982,t)})).setLayout({name:"mx_gradient_scale3d_0",type:"float",inputs:[{name:"v",type:"float"}]}),sT=Ff([tT,Vi((([e])=>{const t=Qi(e).toVar();return na(.6616,t)})).setLayout({name:"mx_gradient_scale2d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),iT=Ff([rT,Vi((([e])=>{const t=Qi(e).toVar();return na(.982,t)})).setLayout({name:"mx_gradient_scale3d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),nT=Vi((([e,t])=>{const r=Hi(t).toVar(),s=Wi(e).toVar();return s.shiftLeft(r).bitOr(s.shiftRight(Hi(32).sub(r)))})).setLayout({name:"mx_rotl32",type:"uint",inputs:[{name:"x",type:"uint"},{name:"k",type:"int"}]}),aT=Vi((([e,t,r])=>{e.subAssign(r),e.bitXorAssign(nT(r,Hi(4))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(nT(e,Hi(6))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(nT(t,Hi(8))),t.addAssign(e),e.subAssign(r),e.bitXorAssign(nT(r,Hi(16))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(nT(e,Hi(19))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(nT(t,Hi(4))),t.addAssign(e)})),oT=Vi((([e,t,r])=>{const s=Wi(r).toVar(),i=Wi(t).toVar(),n=Wi(e).toVar();return s.bitXorAssign(i),s.subAssign(nT(i,Hi(14))),n.bitXorAssign(s),n.subAssign(nT(s,Hi(11))),i.bitXorAssign(n),i.subAssign(nT(n,Hi(25))),s.bitXorAssign(i),s.subAssign(nT(i,Hi(16))),n.bitXorAssign(s),n.subAssign(nT(s,Hi(4))),i.bitXorAssign(n),i.subAssign(nT(n,Hi(14))),s.bitXorAssign(i),s.subAssign(nT(i,Hi(24))),s})).setLayout({name:"mx_bjfinal",type:"uint",inputs:[{name:"a",type:"uint"},{name:"b",type:"uint"},{name:"c",type:"uint"}]}),uT=Vi((([e])=>{const t=Wi(e).toVar();return $i(t).div($i(Wi(Hi(4294967295))))})).setLayout({name:"mx_bits_to_01",type:"float",inputs:[{name:"bits",type:"uint"}]}),lT=Vi((([e])=>{const t=$i(e).toVar();return t.mul(t).mul(t).mul(t.mul(t.mul(6).sub(15)).add(10))})).setLayout({name:"mx_fade",type:"float",inputs:[{name:"t",type:"float"}]}),dT=Ff([Vi((([e])=>{const t=Hi(e).toVar(),r=Wi(Wi(1)).toVar(),s=Wi(Wi(Hi(3735928559)).add(r.shiftLeft(Wi(2))).add(Wi(13))).toVar();return oT(s.add(Wi(t)),s,s)})).setLayout({name:"mx_hash_int_0",type:"uint",inputs:[{name:"x",type:"int"}]}),Vi((([e,t])=>{const r=Hi(t).toVar(),s=Hi(e).toVar(),i=Wi(Wi(2)).toVar(),n=Wi().toVar(),a=Wi().toVar(),o=Wi().toVar();return n.assign(a.assign(o.assign(Wi(Hi(3735928559)).add(i.shiftLeft(Wi(2))).add(Wi(13))))),n.addAssign(Wi(s)),a.addAssign(Wi(r)),oT(n,a,o)})).setLayout({name:"mx_hash_int_1",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),Vi((([e,t,r])=>{const s=Hi(r).toVar(),i=Hi(t).toVar(),n=Hi(e).toVar(),a=Wi(Wi(3)).toVar(),o=Wi().toVar(),u=Wi().toVar(),l=Wi().toVar();return o.assign(u.assign(l.assign(Wi(Hi(3735928559)).add(a.shiftLeft(Wi(2))).add(Wi(13))))),o.addAssign(Wi(n)),u.addAssign(Wi(i)),l.addAssign(Wi(s)),oT(o,u,l)})).setLayout({name:"mx_hash_int_2",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]}),Vi((([e,t,r,s])=>{const i=Hi(s).toVar(),n=Hi(r).toVar(),a=Hi(t).toVar(),o=Hi(e).toVar(),u=Wi(Wi(4)).toVar(),l=Wi().toVar(),d=Wi().toVar(),c=Wi().toVar();return l.assign(d.assign(c.assign(Wi(Hi(3735928559)).add(u.shiftLeft(Wi(2))).add(Wi(13))))),l.addAssign(Wi(o)),d.addAssign(Wi(a)),c.addAssign(Wi(n)),aT(l,d,c),l.addAssign(Wi(i)),oT(l,d,c)})).setLayout({name:"mx_hash_int_3",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xx",type:"int"}]}),Vi((([e,t,r,s,i])=>{const n=Hi(i).toVar(),a=Hi(s).toVar(),o=Hi(r).toVar(),u=Hi(t).toVar(),l=Hi(e).toVar(),d=Wi(Wi(5)).toVar(),c=Wi().toVar(),h=Wi().toVar(),p=Wi().toVar();return c.assign(h.assign(p.assign(Wi(Hi(3735928559)).add(d.shiftLeft(Wi(2))).add(Wi(13))))),c.addAssign(Wi(l)),h.addAssign(Wi(u)),p.addAssign(Wi(o)),aT(c,h,p),c.addAssign(Wi(a)),h.addAssign(Wi(n)),oT(c,h,p)})).setLayout({name:"mx_hash_int_4",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xx",type:"int"},{name:"yy",type:"int"}]})]),cT=Ff([Vi((([e,t])=>{const r=Hi(t).toVar(),s=Hi(e).toVar(),i=Wi(dT(s,r)).toVar(),n=Ji().toVar();return n.x.assign(i.bitAnd(Hi(255))),n.y.assign(i.shiftRight(Hi(8)).bitAnd(Hi(255))),n.z.assign(i.shiftRight(Hi(16)).bitAnd(Hi(255))),n})).setLayout({name:"mx_hash_vec3_0",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),Vi((([e,t,r])=>{const s=Hi(r).toVar(),i=Hi(t).toVar(),n=Hi(e).toVar(),a=Wi(dT(n,i,s)).toVar(),o=Ji().toVar();return o.x.assign(a.bitAnd(Hi(255))),o.y.assign(a.shiftRight(Hi(8)).bitAnd(Hi(255))),o.z.assign(a.shiftRight(Hi(16)).bitAnd(Hi(255))),o})).setLayout({name:"mx_hash_vec3_1",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]})]),hT=Ff([Vi((([e])=>{const t=qi(e).toVar(),r=Hi().toVar(),s=Hi().toVar(),i=$i(jb(t.x,r)).toVar(),n=$i(jb(t.y,s)).toVar(),a=$i(lT(i)).toVar(),o=$i(lT(n)).toVar(),u=$i(qb(Qb(dT(r,s),i,n),Qb(dT(r.add(Hi(1)),s),i.sub(1),n),Qb(dT(r,s.add(Hi(1))),i,n.sub(1)),Qb(dT(r.add(Hi(1)),s.add(Hi(1))),i.sub(1),n.sub(1)),a,o)).toVar();return sT(u)})).setLayout({name:"mx_perlin_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"}]}),Vi((([e])=>{const t=Qi(e).toVar(),r=Hi().toVar(),s=Hi().toVar(),i=Hi().toVar(),n=$i(jb(t.x,r)).toVar(),a=$i(jb(t.y,s)).toVar(),o=$i(jb(t.z,i)).toVar(),u=$i(lT(n)).toVar(),l=$i(lT(a)).toVar(),d=$i(lT(o)).toVar(),c=$i(Xb(Qb(dT(r,s,i),n,a,o),Qb(dT(r.add(Hi(1)),s,i),n.sub(1),a,o),Qb(dT(r,s.add(Hi(1)),i),n,a.sub(1),o),Qb(dT(r.add(Hi(1)),s.add(Hi(1)),i),n.sub(1),a.sub(1),o),Qb(dT(r,s,i.add(Hi(1))),n,a,o.sub(1)),Qb(dT(r.add(Hi(1)),s,i.add(Hi(1))),n.sub(1),a,o.sub(1)),Qb(dT(r,s.add(Hi(1)),i.add(Hi(1))),n,a.sub(1),o.sub(1)),Qb(dT(r.add(Hi(1)),s.add(Hi(1)),i.add(Hi(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return iT(c)})).setLayout({name:"mx_perlin_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"}]})]),pT=Ff([Vi((([e])=>{const t=qi(e).toVar(),r=Hi().toVar(),s=Hi().toVar(),i=$i(jb(t.x,r)).toVar(),n=$i(jb(t.y,s)).toVar(),a=$i(lT(i)).toVar(),o=$i(lT(n)).toVar(),u=Qi(qb(eT(cT(r,s),i,n),eT(cT(r.add(Hi(1)),s),i.sub(1),n),eT(cT(r,s.add(Hi(1))),i,n.sub(1)),eT(cT(r.add(Hi(1)),s.add(Hi(1))),i.sub(1),n.sub(1)),a,o)).toVar();return sT(u)})).setLayout({name:"mx_perlin_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),Vi((([e])=>{const t=Qi(e).toVar(),r=Hi().toVar(),s=Hi().toVar(),i=Hi().toVar(),n=$i(jb(t.x,r)).toVar(),a=$i(jb(t.y,s)).toVar(),o=$i(jb(t.z,i)).toVar(),u=$i(lT(n)).toVar(),l=$i(lT(a)).toVar(),d=$i(lT(o)).toVar(),c=Qi(Xb(eT(cT(r,s,i),n,a,o),eT(cT(r.add(Hi(1)),s,i),n.sub(1),a,o),eT(cT(r,s.add(Hi(1)),i),n,a.sub(1),o),eT(cT(r.add(Hi(1)),s.add(Hi(1)),i),n.sub(1),a.sub(1),o),eT(cT(r,s,i.add(Hi(1))),n,a,o.sub(1)),eT(cT(r.add(Hi(1)),s,i.add(Hi(1))),n.sub(1),a,o.sub(1)),eT(cT(r,s.add(Hi(1)),i.add(Hi(1))),n,a.sub(1),o.sub(1)),eT(cT(r.add(Hi(1)),s.add(Hi(1)),i.add(Hi(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return iT(c)})).setLayout({name:"mx_perlin_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"}]})]),gT=Ff([Vi((([e])=>{const t=$i(e).toVar(),r=Hi(Wb(t)).toVar();return uT(dT(r))})).setLayout({name:"mx_cell_noise_float_0",type:"float",inputs:[{name:"p",type:"float"}]}),Vi((([e])=>{const t=qi(e).toVar(),r=Hi(Wb(t.x)).toVar(),s=Hi(Wb(t.y)).toVar();return uT(dT(r,s))})).setLayout({name:"mx_cell_noise_float_1",type:"float",inputs:[{name:"p",type:"vec2"}]}),Vi((([e])=>{const t=Qi(e).toVar(),r=Hi(Wb(t.x)).toVar(),s=Hi(Wb(t.y)).toVar(),i=Hi(Wb(t.z)).toVar();return uT(dT(r,s,i))})).setLayout({name:"mx_cell_noise_float_2",type:"float",inputs:[{name:"p",type:"vec3"}]}),Vi((([e])=>{const t=tn(e).toVar(),r=Hi(Wb(t.x)).toVar(),s=Hi(Wb(t.y)).toVar(),i=Hi(Wb(t.z)).toVar(),n=Hi(Wb(t.w)).toVar();return uT(dT(r,s,i,n))})).setLayout({name:"mx_cell_noise_float_3",type:"float",inputs:[{name:"p",type:"vec4"}]})]),mT=Ff([Vi((([e])=>{const t=$i(e).toVar(),r=Hi(Wb(t)).toVar();return Qi(uT(dT(r,Hi(0))),uT(dT(r,Hi(1))),uT(dT(r,Hi(2))))})).setLayout({name:"mx_cell_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"float"}]}),Vi((([e])=>{const t=qi(e).toVar(),r=Hi(Wb(t.x)).toVar(),s=Hi(Wb(t.y)).toVar();return Qi(uT(dT(r,s,Hi(0))),uT(dT(r,s,Hi(1))),uT(dT(r,s,Hi(2))))})).setLayout({name:"mx_cell_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),Vi((([e])=>{const t=Qi(e).toVar(),r=Hi(Wb(t.x)).toVar(),s=Hi(Wb(t.y)).toVar(),i=Hi(Wb(t.z)).toVar();return Qi(uT(dT(r,s,i,Hi(0))),uT(dT(r,s,i,Hi(1))),uT(dT(r,s,i,Hi(2))))})).setLayout({name:"mx_cell_noise_vec3_2",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),Vi((([e])=>{const t=tn(e).toVar(),r=Hi(Wb(t.x)).toVar(),s=Hi(Wb(t.y)).toVar(),i=Hi(Wb(t.z)).toVar(),n=Hi(Wb(t.w)).toVar();return Qi(uT(dT(r,s,i,n,Hi(0))),uT(dT(r,s,i,n,Hi(1))),uT(dT(r,s,i,n,Hi(2))))})).setLayout({name:"mx_cell_noise_vec3_3",type:"vec3",inputs:[{name:"p",type:"vec4"}]})]),fT=Vi((([e,t,r,s])=>{const i=$i(s).toVar(),n=$i(r).toVar(),a=Hi(t).toVar(),o=Qi(e).toVar(),u=$i(0).toVar(),l=$i(1).toVar();return kc(a,(()=>{u.addAssign(l.mul(hT(o))),l.mulAssign(i),o.mulAssign(n)})),u})).setLayout({name:"mx_fractal_noise_float",type:"float",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),yT=Vi((([e,t,r,s])=>{const i=$i(s).toVar(),n=$i(r).toVar(),a=Hi(t).toVar(),o=Qi(e).toVar(),u=Qi(0).toVar(),l=$i(1).toVar();return kc(a,(()=>{u.addAssign(l.mul(pT(o))),l.mulAssign(i),o.mulAssign(n)})),u})).setLayout({name:"mx_fractal_noise_vec3",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),xT=Vi((([e,t,r,s])=>{const i=$i(s).toVar(),n=$i(r).toVar(),a=Hi(t).toVar(),o=Qi(e).toVar();return qi(fT(o,a,n,i),fT(o.add(Qi(Hi(19),Hi(193),Hi(17))),a,n,i))})).setLayout({name:"mx_fractal_noise_vec2",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),bT=Vi((([e,t,r,s])=>{const i=$i(s).toVar(),n=$i(r).toVar(),a=Hi(t).toVar(),o=Qi(e).toVar(),u=Qi(yT(o,a,n,i)).toVar(),l=$i(fT(o.add(Qi(Hi(19),Hi(193),Hi(17))),a,n,i)).toVar();return tn(u,l)})).setLayout({name:"mx_fractal_noise_vec4",type:"vec4",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),TT=Ff([Vi((([e,t,r,s,i,n,a])=>{const o=Hi(a).toVar(),u=$i(n).toVar(),l=Hi(i).toVar(),d=Hi(s).toVar(),c=Hi(r).toVar(),h=Hi(t).toVar(),p=qi(e).toVar(),g=Qi(mT(qi(h.add(d),c.add(l)))).toVar(),m=qi(g.x,g.y).toVar();m.subAssign(.5),m.mulAssign(u),m.addAssign(.5);const f=qi(qi($i(h),$i(c)).add(m)).toVar(),y=qi(f.sub(p)).toVar();return Gi(o.equal(Hi(2)),(()=>Qa(y.x).add(Qa(y.y)))),Gi(o.equal(Hi(3)),(()=>po(Qa(y.x),Qa(y.y)))),xo(y,y)})).setLayout({name:"mx_worley_distance_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"x",type:"int"},{name:"y",type:"int"},{name:"xoff",type:"int"},{name:"yoff",type:"int"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Vi((([e,t,r,s,i,n,a,o,u])=>{const l=Hi(u).toVar(),d=$i(o).toVar(),c=Hi(a).toVar(),h=Hi(n).toVar(),p=Hi(i).toVar(),g=Hi(s).toVar(),m=Hi(r).toVar(),f=Hi(t).toVar(),y=Qi(e).toVar(),x=Qi(mT(Qi(f.add(p),m.add(h),g.add(c)))).toVar();x.subAssign(.5),x.mulAssign(d),x.addAssign(.5);const b=Qi(Qi($i(f),$i(m),$i(g)).add(x)).toVar(),T=Qi(b.sub(y)).toVar();return Gi(l.equal(Hi(2)),(()=>Qa(T.x).add(Qa(T.y)).add(Qa(T.z)))),Gi(l.equal(Hi(3)),(()=>po(po(Qa(T.x),Qa(T.y)),Qa(T.z)))),xo(T,T)})).setLayout({name:"mx_worley_distance_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xoff",type:"int"},{name:"yoff",type:"int"},{name:"zoff",type:"int"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),_T=Vi((([e,t,r])=>{const s=Hi(r).toVar(),i=$i(t).toVar(),n=qi(e).toVar(),a=Hi().toVar(),o=Hi().toVar(),u=qi(jb(n.x,a),jb(n.y,o)).toVar(),l=$i(1e6).toVar();return kc({start:-1,end:Hi(1),name:"x",condition:"<="},(({x:e})=>{kc({start:-1,end:Hi(1),name:"y",condition:"<="},(({y:t})=>{const r=$i(TT(u,e,t,a,o,i,s)).toVar();l.assign(ho(l,r))}))})),Gi(s.equal(Hi(0)),(()=>{l.assign(Oa(l))})),l})).setLayout({name:"mx_worley_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),vT=Vi((([e,t,r])=>{const s=Hi(r).toVar(),i=$i(t).toVar(),n=qi(e).toVar(),a=Hi().toVar(),o=Hi().toVar(),u=qi(jb(n.x,a),jb(n.y,o)).toVar(),l=qi(1e6,1e6).toVar();return kc({start:-1,end:Hi(1),name:"x",condition:"<="},(({x:e})=>{kc({start:-1,end:Hi(1),name:"y",condition:"<="},(({y:t})=>{const r=$i(TT(u,e,t,a,o,i,s)).toVar();Gi(r.lessThan(l.x),(()=>{l.y.assign(l.x),l.x.assign(r)})).ElseIf(r.lessThan(l.y),(()=>{l.y.assign(r)}))}))})),Gi(s.equal(Hi(0)),(()=>{l.assign(Oa(l))})),l})).setLayout({name:"mx_worley_noise_vec2_0",type:"vec2",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),NT=Vi((([e,t,r])=>{const s=Hi(r).toVar(),i=$i(t).toVar(),n=qi(e).toVar(),a=Hi().toVar(),o=Hi().toVar(),u=qi(jb(n.x,a),jb(n.y,o)).toVar(),l=Qi(1e6,1e6,1e6).toVar();return kc({start:-1,end:Hi(1),name:"x",condition:"<="},(({x:e})=>{kc({start:-1,end:Hi(1),name:"y",condition:"<="},(({y:t})=>{const r=$i(TT(u,e,t,a,o,i,s)).toVar();Gi(r.lessThan(l.x),(()=>{l.z.assign(l.y),l.y.assign(l.x),l.x.assign(r)})).ElseIf(r.lessThan(l.y),(()=>{l.z.assign(l.y),l.y.assign(r)})).ElseIf(r.lessThan(l.z),(()=>{l.z.assign(r)}))}))})),Gi(s.equal(Hi(0)),(()=>{l.assign(Oa(l))})),l})).setLayout({name:"mx_worley_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),ST=Ff([_T,Vi((([e,t,r])=>{const s=Hi(r).toVar(),i=$i(t).toVar(),n=Qi(e).toVar(),a=Hi().toVar(),o=Hi().toVar(),u=Hi().toVar(),l=Qi(jb(n.x,a),jb(n.y,o),jb(n.z,u)).toVar(),d=$i(1e6).toVar();return kc({start:-1,end:Hi(1),name:"x",condition:"<="},(({x:e})=>{kc({start:-1,end:Hi(1),name:"y",condition:"<="},(({y:t})=>{kc({start:-1,end:Hi(1),name:"z",condition:"<="},(({z:r})=>{const n=$i(TT(l,e,t,r,a,o,u,i,s)).toVar();d.assign(ho(d,n))}))}))})),Gi(s.equal(Hi(0)),(()=>{d.assign(Oa(d))})),d})).setLayout({name:"mx_worley_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),ET=Ff([vT,Vi((([e,t,r])=>{const s=Hi(r).toVar(),i=$i(t).toVar(),n=Qi(e).toVar(),a=Hi().toVar(),o=Hi().toVar(),u=Hi().toVar(),l=Qi(jb(n.x,a),jb(n.y,o),jb(n.z,u)).toVar(),d=qi(1e6,1e6).toVar();return kc({start:-1,end:Hi(1),name:"x",condition:"<="},(({x:e})=>{kc({start:-1,end:Hi(1),name:"y",condition:"<="},(({y:t})=>{kc({start:-1,end:Hi(1),name:"z",condition:"<="},(({z:r})=>{const n=$i(TT(l,e,t,r,a,o,u,i,s)).toVar();Gi(n.lessThan(d.x),(()=>{d.y.assign(d.x),d.x.assign(n)})).ElseIf(n.lessThan(d.y),(()=>{d.y.assign(n)}))}))}))})),Gi(s.equal(Hi(0)),(()=>{d.assign(Oa(d))})),d})).setLayout({name:"mx_worley_noise_vec2_1",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),wT=Ff([NT,Vi((([e,t,r])=>{const s=Hi(r).toVar(),i=$i(t).toVar(),n=Qi(e).toVar(),a=Hi().toVar(),o=Hi().toVar(),u=Hi().toVar(),l=Qi(jb(n.x,a),jb(n.y,o),jb(n.z,u)).toVar(),d=Qi(1e6,1e6,1e6).toVar();return kc({start:-1,end:Hi(1),name:"x",condition:"<="},(({x:e})=>{kc({start:-1,end:Hi(1),name:"y",condition:"<="},(({y:t})=>{kc({start:-1,end:Hi(1),name:"z",condition:"<="},(({z:r})=>{const n=$i(TT(l,e,t,r,a,o,u,i,s)).toVar();Gi(n.lessThan(d.x),(()=>{d.z.assign(d.y),d.y.assign(d.x),d.x.assign(n)})).ElseIf(n.lessThan(d.y),(()=>{d.z.assign(d.y),d.y.assign(n)})).ElseIf(n.lessThan(d.z),(()=>{d.z.assign(n)}))}))}))})),Gi(s.equal(Hi(0)),(()=>{d.assign(Oa(d))})),d})).setLayout({name:"mx_worley_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),AT=Vi((([e])=>{const t=e.y,r=e.z,s=Qi().toVar();return Gi(t.lessThan(1e-4),(()=>{s.assign(Qi(r,r,r))})).Else((()=>{let i=e.x;i=i.sub(ka(i)).mul(6).toVar();const n=Hi(ao(i)),a=i.sub($i(n)),o=r.mul(t.oneMinus()),u=r.mul(t.mul(a).oneMinus()),l=r.mul(t.mul(a.oneMinus()).oneMinus());Gi(n.equal(Hi(0)),(()=>{s.assign(Qi(r,l,o))})).ElseIf(n.equal(Hi(1)),(()=>{s.assign(Qi(u,r,o))})).ElseIf(n.equal(Hi(2)),(()=>{s.assign(Qi(o,r,l))})).ElseIf(n.equal(Hi(3)),(()=>{s.assign(Qi(o,u,r))})).ElseIf(n.equal(Hi(4)),(()=>{s.assign(Qi(l,o,r))})).Else((()=>{s.assign(Qi(r,o,u))}))})),s})).setLayout({name:"mx_hsvtorgb",type:"vec3",inputs:[{name:"hsv",type:"vec3"}]}),RT=Vi((([e])=>{const t=Qi(e).toVar(),r=$i(t.x).toVar(),s=$i(t.y).toVar(),i=$i(t.z).toVar(),n=$i(ho(r,ho(s,i))).toVar(),a=$i(po(r,po(s,i))).toVar(),o=$i(a.sub(n)).toVar(),u=$i().toVar(),l=$i().toVar(),d=$i().toVar();return d.assign(a),Gi(a.greaterThan(0),(()=>{l.assign(o.div(a))})).Else((()=>{l.assign(0)})),Gi(l.lessThanEqual(0),(()=>{u.assign(0)})).Else((()=>{Gi(r.greaterThanEqual(a),(()=>{u.assign(s.sub(i).div(o))})).ElseIf(s.greaterThanEqual(a),(()=>{u.assign(sa(2,i.sub(r).div(o)))})).Else((()=>{u.assign(sa(4,r.sub(s).div(o)))})),u.mulAssign(1/6),Gi(u.lessThan(0),(()=>{u.addAssign(1)}))})),Qi(u,l,d)})).setLayout({name:"mx_rgbtohsv",type:"vec3",inputs:[{name:"c",type:"vec3"}]}),CT=Vi((([e])=>{const t=Qi(e).toVar(),r=en(ca(t,Qi(.04045))).toVar(),s=Qi(t.div(12.92)).toVar(),i=Qi(To(po(t.add(Qi(.055)),Qi(0)).div(1.055),Qi(2.4))).toVar();return Ao(s,i,r)})).setLayout({name:"mx_srgb_texture_to_lin_rec709",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),MT=(e,t)=>{e=$i(e),t=$i(t);const r=qi(t.dFdx(),t.dFdy()).length().mul(.7071067811865476);return Po(e.sub(r),e.add(r),t)},PT=(e,t,r,s)=>Ao(e,t,r[s].clamp()),LT=(e,t,r,s,i)=>Ao(e,t,MT(r,s[i])),FT=Vi((([e,t,r])=>{const s=$a(e).toVar(),i=ia($i(.5).mul(t.sub(r)),Ml).div(s).toVar(),n=ia($i(-.5).mul(t.sub(r)),Ml).div(s).toVar(),a=Qi().toVar();a.x=s.x.greaterThan($i(0)).select(i.x,n.x),a.y=s.y.greaterThan($i(0)).select(i.y,n.y),a.z=s.z.greaterThan($i(0)).select(i.z,n.z);const o=ho(ho(a.x,a.y),a.z).toVar();return Ml.add(s.mul(o)).toVar().sub(r)})),BT=Vi((([e,t])=>{const r=e.x,s=e.y,i=e.z;let n=t.element(0).mul(.886227);return n=n.add(t.element(1).mul(1.023328).mul(s)),n=n.add(t.element(2).mul(1.023328).mul(i)),n=n.add(t.element(3).mul(1.023328).mul(r)),n=n.add(t.element(4).mul(.858086).mul(r).mul(s)),n=n.add(t.element(5).mul(.858086).mul(s).mul(i)),n=n.add(t.element(6).mul(i.mul(i).mul(.743125).sub(.247708))),n=n.add(t.element(7).mul(.858086).mul(r).mul(i)),n=n.add(t.element(8).mul(.429043).mul(na(r,r).sub(na(s,s)))),n}));var IT=Object.freeze({__proto__:null,BRDF_GGX:vp,BRDF_Lambert:op,BasicPointShadowFilter:Cb,BasicShadowFilter:fb,Break:zc,Const:Xo,Continue:()=>Mu("continue").append(),DFGApprox:Np,D_GGX:bp,Discard:Pu,EPSILON:Aa,F_Schlick:ap,Fn:Vi,INFINITY:Ra,If:Gi,Loop:kc,NodeAccess:Vs,NodeShaderStage:Bs,NodeType:Ds,NodeUpdateType:Is,PCFShadowFilter:yb,PCFSoftShadowFilter:xb,PI:Ca,PI2:Ma,PointShadowFilter:Mb,Return:()=>Mu("return").append(),Schlick_to_F0:Ep,ScriptableNodeResources:_x,ShaderNode:Mi,TBNViewMatrix:Nd,VSMShadowFilter:bb,V_GGX_SmithCorrelated:yp,Var:qo,abs:Qa,acesFilmicToneMapping:ox,acos:Ka,add:sa,addMethodChaining:ii,addNodeElement:function(e){console.warn("THREE.TSL: AddNodeElement has been removed in favor of tree-shaking. Trying add",e)},agxToneMapping:cx,all:Pa,alphaT:In,and:ga,anisotropy:Dn,anisotropyB:Un,anisotropyT:Vn,any:La,append:ki,array:hn,arrayBuffer:e=>Pi(new ei(e,"ArrayBuffer")),asin:Xa,assign:Jn,atan:Ya,atan2:Do,atomicAdd:(e,t)=>Hx(zx.ATOMIC_ADD,e,t),atomicAnd:(e,t)=>Hx(zx.ATOMIC_AND,e,t),atomicFunc:Hx,atomicLoad:e=>Hx(zx.ATOMIC_LOAD,e,null),atomicMax:(e,t)=>Hx(zx.ATOMIC_MAX,e,t),atomicMin:(e,t)=>Hx(zx.ATOMIC_MIN,e,t),atomicOr:(e,t)=>Hx(zx.ATOMIC_OR,e,t),atomicStore:(e,t)=>Hx(zx.ATOMIC_STORE,e,t),atomicSub:(e,t)=>Hx(zx.ATOMIC_SUB,e,t),atomicXor:(e,t)=>Hx(zx.ATOMIC_XOR,e,t),attenuationColor:Yn,attenuationDistance:Kn,attribute:Vu,attributeArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=ws("float")):(r=As(t),s=ws(t));const i=new xy(e,r,s);return Dc(i,t,e)},backgroundBlurriness:Ey,backgroundIntensity:wy,backgroundRotation:Ay,batch:Lc,billboarding:Of,bitAnd:xa,bitNot:ba,bitOr:Ta,bitXor:_a,bitangentGeometry:yd,bitangentLocal:xd,bitangentView:bd,bitangentWorld:Td,bitcast:lo,blendBurn:Oy,blendColor:$y,blendDodge:Gy,blendOverlay:zy,blendScreen:ky,blur:Sg,bool:ji,buffer:qu,bufferAttribute:fu,bumpMap:Ld,burn:(...e)=>(console.warn('THREE.TSL: "burn" has been renamed. Use "blendBurn" instead.'),Oy(e)),bvec2:Yi,bvec3:en,bvec4:nn,bypass:Eu,cache:Nu,call:ta,cameraFar:Ju,cameraIndex:Qu,cameraNear:Zu,cameraNormalMatrix:il,cameraPosition:nl,cameraProjectionMatrix:el,cameraProjectionMatrixInverse:tl,cameraViewMatrix:rl,cameraWorldMatrix:sl,cbrt:Eo,cdl:Ky,ceil:za,checker:kb,cineonToneMapping:nx,clamp:Ro,clearcoat:Rn,clearcoatRoughness:Cn,code:gx,color:zi,colorSpaceToWorking:ou,colorToDirection:e=>Pi(e).mul(2).sub(1),compute:_u,computeSkinning:(e,t=null)=>{const r=new Uc(e);return r.positionNode=Dc(new M(e.geometry.getAttribute("position").array,3),"vec3").setPBO(!0).toReadOnly().element(vc).toVar(),r.skinIndexNode=Dc(new M(new Uint32Array(e.geometry.getAttribute("skinIndex").array),4),"uvec4").setPBO(!0).toReadOnly().element(vc).toVar(),r.skinWeightNode=Dc(new M(e.geometry.getAttribute("skinWeight").array,4),"vec4").setPBO(!0).toReadOnly().element(vc).toVar(),r.bindMatrixNode=Tn(e.bindMatrix,"mat4"),r.bindMatrixInverseNode=Tn(e.bindMatrixInverse,"mat4"),r.boneMatricesNode=qu(e.skeleton.boneMatrices,"mat4",e.skeleton.bones.length),r.toPositionNode=t,Pi(r)},cond:ko,context:$o,convert:dn,convertColorSpace:(e,t,r)=>Pi(new su(Pi(e),t,r)),convertToTexture:(e,...t)=>e.isTextureNode?e:e.isPassNode?e.getTextureNode():py(e,...t),cos:ja,cross:bo,cubeTexture:sd,cubeToUV:Rb,dFdx:ro,dFdy:so,dashSize:$n,debug:Iu,defaultBuildStages:Os,defaultShaderStages:Us,defined:Ri,degrees:Ba,deltaTime:If,densityFog:function(e,t){return console.warn('THREE.TSL: "densityFog( color, density )" is deprecated. Use "fog( color, densityFogFactor( density ) )" instead.'),Ax(e,wx(t))},densityFogFactor:wx,depth:Eh,depthPass:(e,t,r)=>Pi(new tx(tx.DEPTH,e,t,r)),difference:yo,diffuseColor:Sn,directPointLight:Ob,directionToColor:$h,dispersion:Qn,distance:fo,div:aa,dodge:(...e)=>(console.warn('THREE.TSL: "dodge" has been renamed. Use "blendDodge" instead.'),Gy(e)),dot:xo,drawIndex:wc,dynamicBufferAttribute:yu,element:ln,emissive:En,equal:ua,equals:co,equirectUV:qh,exp:Ia,exp2:Da,expression:Mu,faceDirection:Dl,faceForward:Lo,faceforward:Vo,float:$i,floor:ka,fog:Ax,fract:Ha,frameGroup:fn,frameId:Df,frontFacing:Il,fwidth:oo,gain:(e,t)=>e.lessThan(.5)?Af(e.mul(2),t).div(2):ia(1,Af(na(ia(1,e),2),t).div(2)),gapSize:Hn,getConstNodeType:Ci,getCurrentStack:Oi,getDirection:Tg,getDistanceAttenuation:Ub,getGeometryRoughness:mp,getNormalFromDepth:fy,getParallaxCorrectNormal:FT,getRoughness:fp,getScreenPosition:my,getShIrradianceAt:BT,getTextureIndex:Nf,getViewPosition:gy,globalId:Dx,glsl:(e,t)=>gx(e,t,"glsl"),glslFn:(e,t)=>fx(e,t,"glsl"),grayscale:Hy,greaterThan:ca,greaterThanEqual:pa,hash:wf,highpModelNormalViewMatrix:wl,highpModelViewMatrix:El,hue:qy,instance:Rc,instanceIndex:vc,instancedArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=ws("float")):(r=As(t),s=ws(t));const i=new yy(e,r,s);return Dc(i,t,e)},instancedBufferAttribute:xu,instancedDynamicBufferAttribute:bu,instancedMesh:Mc,int:Hi,inverseSqrt:Ga,inversesqrt:Uo,invocationLocalIndex:Ec,invocationSubgroupIndex:Sc,ior:jn,iridescence:Ln,iridescenceIOR:Fn,iridescenceThickness:Bn,ivec2:Xi,ivec3:Zi,ivec4:rn,js:(e,t)=>gx(e,t,"js"),label:Ho,length:Ja,lengthSq:wo,lessThan:da,lessThanEqual:ha,lightPosition:Kx,lightProjectionUV:Xx,lightShadowMatrix:qx,lightTargetDirection:Zx,lightTargetPosition:Yx,lightViewPosition:Qx,lightingContext:Qc,lights:(e=[])=>Pi(new tb).setLights(e),linearDepth:wh,linearToneMapping:sx,localId:Vx,log:Va,log2:Ua,logarithmicDepthToViewZ:(e,t,r)=>{const s=e.mul(Va(r.div(t)));return $i(Math.E).pow(s).mul(t).negate()},loop:(...e)=>(console.warn("THREE.TSL: loop() has been renamed to Loop()."),kc(...e)),luminance:Xy,mat2:an,mat3:on,mat4:un,matcapUV:hm,materialAO:yc,materialAlphaTest:Id,materialAnisotropy:ec,materialAnisotropyVector:xc,materialAttenuationColor:uc,materialAttenuationDistance:oc,materialClearcoat:Xd,materialClearcoatNormal:Yd,materialClearcoatRoughness:Kd,materialColor:Dd,materialDispersion:mc,materialEmissive:Ud,materialEnvIntensity:Yl,materialEnvRotation:Ql,materialIOR:ac,materialIridescence:tc,materialIridescenceIOR:rc,materialIridescenceThickness:sc,materialLightMap:fc,materialLineDashOffset:pc,materialLineDashSize:dc,materialLineGapSize:cc,materialLineScale:lc,materialLineWidth:hc,materialMetalness:jd,materialNormal:qd,materialOpacity:Od,materialPointSize:gc,materialReference:ld,materialReflectivity:Hd,materialRefractionRatio:Kl,materialRotation:Qd,materialRoughness:Wd,materialSheen:Zd,materialSheenRoughness:Jd,materialShininess:Vd,materialSpecular:Gd,materialSpecularColor:zd,materialSpecularIntensity:kd,materialSpecularStrength:$d,materialThickness:nc,materialTransmission:ic,max:po,maxMipLevel:zu,mediumpModelViewMatrix:Sl,metalness:An,min:ho,mix:Ao,mixElement:Bo,mod:oa,modInt:Ea,modelDirection:ml,modelNormalMatrix:_l,modelPosition:yl,modelRadius:Tl,modelScale:xl,modelViewMatrix:Nl,modelViewPosition:bl,modelViewProjection:bc,modelWorldMatrix:fl,modelWorldMatrixInverse:vl,morphReference:qc,mrt:Ef,mul:na,mx_aastep:MT,mx_cell_noise_float:(e=Uu())=>gT(e.convert("vec2|vec3")),mx_contrast:(e,t=1,r=.5)=>$i(e).sub(r).mul(t).add(r),mx_fractal_noise_float:(e=Uu(),t=3,r=2,s=.5,i=1)=>fT(e,Hi(t),r,s).mul(i),mx_fractal_noise_vec2:(e=Uu(),t=3,r=2,s=.5,i=1)=>xT(e,Hi(t),r,s).mul(i),mx_fractal_noise_vec3:(e=Uu(),t=3,r=2,s=.5,i=1)=>yT(e,Hi(t),r,s).mul(i),mx_fractal_noise_vec4:(e=Uu(),t=3,r=2,s=.5,i=1)=>bT(e,Hi(t),r,s).mul(i),mx_hsvtorgb:AT,mx_noise_float:(e=Uu(),t=1,r=0)=>hT(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec3:(e=Uu(),t=1,r=0)=>pT(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec4:(e=Uu(),t=1,r=0)=>{e=e.convert("vec2|vec3");return tn(pT(e),hT(e.add(qi(19,73)))).mul(t).add(r)},mx_ramplr:(e,t,r=Uu())=>PT(e,t,r,"x"),mx_ramptb:(e,t,r=Uu())=>PT(e,t,r,"y"),mx_rgbtohsv:RT,mx_safepower:(e,t=1)=>(e=$i(e)).abs().pow(t).mul(e.sign()),mx_splitlr:(e,t,r,s=Uu())=>LT(e,t,r,s,"x"),mx_splittb:(e,t,r,s=Uu())=>LT(e,t,r,s,"y"),mx_srgb_texture_to_lin_rec709:CT,mx_transform_uv:(e=1,t=0,r=Uu())=>r.mul(e).add(t),mx_worley_noise_float:(e=Uu(),t=1)=>ST(e.convert("vec2|vec3"),t,Hi(1)),mx_worley_noise_vec2:(e=Uu(),t=1)=>ET(e.convert("vec2|vec3"),t,Hi(1)),mx_worley_noise_vec3:(e=Uu(),t=1)=>wT(e.convert("vec2|vec3"),t,Hi(1)),negate:eo,neutralToneMapping:hx,nodeArray:Fi,nodeImmutable:Ii,nodeObject:Pi,nodeObjects:Li,nodeProxy:Bi,normalFlat:Ol,normalGeometry:Vl,normalLocal:Ul,normalMap:Rd,normalView:Gl,normalWorld:kl,normalize:$a,not:fa,notEqual:la,numWorkgroups:Bx,objectDirection:ul,objectGroup:xn,objectPosition:dl,objectRadius:pl,objectScale:cl,objectViewPosition:hl,objectWorldMatrix:ll,oneMinus:to,or:ma,orthographicDepthToViewZ:(e,t,r)=>t.sub(r).mul(e).sub(t),oscSawtooth:(e=Bf)=>e.fract(),oscSine:(e=Bf)=>e.add(.75).mul(2*Math.PI).sin().mul(.5).add(.5),oscSquare:(e=Bf)=>e.fract().round(),oscTriangle:(e=Bf)=>e.add(.5).fract().mul(2).sub(1).abs(),output:zn,outputStruct:vf,overlay:(...e)=>(console.warn('THREE.TSL: "overlay" has been renamed. Use "blendOverlay" instead.'),zy(e)),overloadingFn:Ff,parabola:Af,parallaxDirection:Sd,parallaxUV:(e,t)=>e.sub(Sd.mul(t)),parameter:(e,t)=>Pi(new ff(e,t)),pass:(e,t,r)=>Pi(new tx(tx.COLOR,e,t,r)),passTexture:(e,t)=>Pi(new Jy(e,t)),pcurve:(e,t,r)=>To(aa(To(e,t),sa(To(e,t),To(ia(1,e),r))),1/t),perspectiveDepthToViewZ:vh,pmremTexture:Yg,pointShadow:Db,pointUV:_y,pointWidth:Wn,positionGeometry:Al,positionLocal:Rl,positionPrevious:Cl,positionView:Ll,positionViewDirection:Fl,positionWorld:Ml,positionWorldDirection:Pl,posterize:Qy,pow:To,pow2:_o,pow3:vo,pow4:No,property:vn,radians:Fa,rand:Fo,range:Px,rangeFog:function(e,t,r){return console.warn('THREE.TSL: "rangeFog( color, near, far )" is deprecated. Use "fog( color, rangeFogFactor( near, far ) )" instead.'),Ax(e,Ex(t,r))},rangeFogFactor:Ex,reciprocal:no,reference:ad,referenceBuffer:od,reflect:mo,reflectVector:ed,reflectView:Zl,reflector:e=>Pi(new ny(e)),refract:Mo,refractVector:td,refractView:Jl,reinhardToneMapping:ix,remainder:Sa,remap:Au,remapClamp:Ru,renderGroup:yn,renderOutput:Fu,rendererReference:cu,rotate:fm,rotateUV:Vf,roughness:wn,round:io,rtt:py,sRGBTransferEOTF:Jo,sRGBTransferOETF:eu,sampler:e=>(!0===e.isNode?e:Hu(e)).convert("sampler"),samplerComparison:e=>(!0===e.isNode?e:Hu(e)).convert("samplerComparison"),saturate:Co,saturation:Wy,screen:(...e)=>(console.warn('THREE.TSL: "screen" has been renamed. Use "blendScreen" instead.'),ky(e)),screenCoordinate:ih,screenSize:sh,screenUV:rh,scriptable:Nx,scriptableValue:xx,select:Go,setCurrentStack:Ui,shaderStages:Gs,shadow:wb,shadowPositionWorld:sb,shapeCircle:zb,sharedUniformGroup:mn,sheen:Mn,sheenRoughness:Pn,shiftLeft:va,shiftRight:Na,shininess:kn,sign:Za,sin:Wa,sinc:(e,t)=>Wa(Ca.mul(t.mul(e).sub(1))).div(Ca.mul(t.mul(e).sub(1))),skinning:Oc,smoothstep:Po,smoothstepElement:Io,specularColor:On,specularF90:Gn,spherizeUV:Uf,split:(e,t)=>Pi(new Ks(Pi(e),t)),spritesheetUV:zf,sqrt:Oa,stack:xf,step:go,storage:Dc,storageBarrier:()=>Ox("storage").append(),storageObject:(e,t,r)=>(console.warn('THREE.TSL: "storageObject()" is deprecated. Use "storage().setPBO( true )" instead.'),Dc(e,t,r).setPBO(!0)),storageTexture:Cy,string:(e="")=>Pi(new ei(e,"string")),struct:(e,t=null)=>{const r=new bf(e,t),s=(...t)=>{let s=null;if(t.length>0)if(t[0].isNode){s={};const r=Object.keys(e);for(let e=0;eOx("texture").append(),textureBicubic:Hp,textureCubeUV:_g,textureLoad:Wu,textureSize:Gu,textureStore:(e,t,r)=>{const s=Cy(e,t,r);return null!==r&&s.append(),s},thickness:Xn,time:Bf,timerDelta:(e=1)=>(console.warn('TSL: timerDelta() is deprecated. Use "deltaTime" instead.'),If.mul(e)),timerGlobal:(e=1)=>(console.warn('TSL: timerGlobal() is deprecated. Use "time" instead.'),Bf.mul(e)),timerLocal:(e=1)=>(console.warn('TSL: timerLocal() is deprecated. Use "time" instead.'),Bf.mul(e)),toOutputColorSpace:iu,toWorkingColorSpace:nu,toneMapping:pu,toneMappingExposure:gu,toonOutlinePass:(t,r,s=new e(0,0,0),i=.003,n=1)=>Pi(new rx(t,r,Pi(s),Pi(i),Pi(n))),transformDirection:So,transformNormal:Wl,transformNormalToView:jl,transformedBentNormalView:Ed,transformedBitangentView:_d,transformedBitangentWorld:vd,transformedClearcoatNormalView:Hl,transformedNormalView:zl,transformedNormalWorld:$l,transformedTangentView:gd,transformedTangentWorld:md,transmission:qn,transpose:uo,triNoise3D:Mf,triplanarTexture:(...e)=>Hf(...e),triplanarTextures:Hf,trunc:ao,tslFn:(...e)=>(console.warn("THREE.TSL: tslFn() has been renamed to Fn()."),Vi(...e)),uint:Wi,uniform:Tn,uniformArray:Yu,uniformGroup:gn,uniforms:(e,t)=>(console.warn("THREE.TSL: uniforms() has been renamed to uniformArray()."),Pi(new Ku(e,t))),userData:(e,t,r)=>Pi(new Fy(e,t,r)),uv:Uu,uvec2:Ki,uvec3:Ji,uvec4:sn,varying:Qo,varyingProperty:Nn,vec2:qi,vec3:Qi,vec4:tn,vectorComponents:ks,velocity:Uy,vertexColor:e=>Pi(new by(e)),vertexIndex:_c,vertexStage:Zo,vibrance:jy,viewZToLogarithmicDepth:Nh,viewZToOrthographicDepth:Th,viewZToPerspectiveDepth:_h,viewport:nh,viewportBottomLeft:ch,viewportCoordinate:oh,viewportDepthTexture:xh,viewportLinearDepth:Ah,viewportMipTexture:mh,viewportResolution:lh,viewportSafeUV:Gf,viewportSharedTexture:Gh,viewportSize:ah,viewportTexture:gh,viewportTopLeft:dh,viewportUV:uh,wgsl:(e,t)=>gx(e,t,"wgsl"),wgslFn:(e,t)=>fx(e,t,"wgsl"),workgroupArray:(e,t)=>Pi(new kx("Workgroup",e,t)),workgroupBarrier:()=>Ox("workgroup").append(),workgroupId:Ix,workingToColorSpace:au,xor:ya});const DT=new mf;class VT extends Im{constructor(e,t){super(),this.renderer=e,this.nodes=t}update(e,t,r){const s=this.renderer,i=this.nodes.getBackgroundNode(e)||e.background;let n=!1;if(null===i)s._clearColor.getRGB(DT),DT.a=s._clearColor.a;else if(!0===i.isColor)i.getRGB(DT),DT.a=1,n=!0;else if(!0===i.isNode){const r=this.get(e),n=i;DT.copy(s._clearColor);let a=r.backgroundMesh;if(void 0===a){const e=$o(tn(n).mul(wy),{getUV:()=>Ay.mul(kl),getTextureLevel:()=>Ey});let t=bc;t=t.setZ(t.w);const s=new Fh;s.name="Background.material",s.side=N,s.depthTest=!1,s.depthWrite=!1,s.allowOverride=!1,s.fog=!1,s.lights=!1,s.vertexNode=t,s.colorNode=e,r.backgroundMeshNode=e,r.backgroundMesh=a=new W(new Oe(1,32,32),s),a.frustumCulled=!1,a.name="Background.mesh",a.onBeforeRender=function(e,t,r){this.matrixWorld.copyPosition(r.matrixWorld)}}const o=n.getCacheKey();r.backgroundCacheKey!==o&&(r.backgroundMeshNode.node=tn(n).mul(wy),r.backgroundMeshNode.needsUpdate=!0,a.material.needsUpdate=!0,r.backgroundCacheKey=o),t.unshift(a,a.geometry,a.material,0,0,null,null)}else console.error("THREE.Renderer: Unsupported background configuration.",i);const a=s.xr.getEnvironmentBlendMode();if("additive"===a?DT.set(0,0,0,1):"alpha-blend"===a&&DT.set(0,0,0,0),!0===s.autoClear||!0===n){const e=r.clearColorValue;e.r=DT.r,e.g=DT.g,e.b=DT.b,e.a=DT.a,!0!==s.backend.isWebGLBackend&&!0!==s.alpha||(e.r*=e.a,e.g*=e.a,e.b*=e.a),r.depthClearValue=s._clearDepth,r.stencilClearValue=s._clearStencil,r.clearColor=!0===s.autoClearColor,r.clearDepth=!0===s.autoClearDepth,r.clearStencil=!0===s.autoClearStencil}else r.clearColor=!1,r.clearDepth=!1,r.clearStencil=!1}}let UT=0;class OT{constructor(e="",t=[],r=0,s=[]){this.name=e,this.bindings=t,this.index=r,this.bindingsReference=s,this.id=UT++}}class GT{constructor(e,t,r,s,i,n,a,o,u,l=[]){this.vertexShader=e,this.fragmentShader=t,this.computeShader=r,this.transforms=l,this.nodeAttributes=s,this.bindings=i,this.updateNodes=n,this.updateBeforeNodes=a,this.updateAfterNodes=o,this.observer=u,this.usedTimes=0}createBindings(){const e=[];for(const t of this.bindings){if(!0!==t.bindings[0].groupNode.shared){const r=new OT(t.name,[],t.index,t);e.push(r);for(const e of t.bindings)r.bindings.push(e.clone())}else e.push(t)}return e}}class kT{constructor(e,t,r=null){this.isNodeAttribute=!0,this.name=e,this.type=t,this.node=r}}class zT{constructor(e,t,r){this.isNodeUniform=!0,this.name=e,this.type=t,this.node=r.getSelf()}get value(){return this.node.value}set value(e){this.node.value=e}get id(){return this.node.id}get groupNode(){return this.node.groupNode}}class $T{constructor(e,t,r=!1,s=null){this.isNodeVar=!0,this.name=e,this.type=t,this.readOnly=r,this.count=s}}class HT extends $T{constructor(e,t){super(e,t),this.needsInterpolation=!1,this.isNodeVarying=!0}}class WT{constructor(e,t,r=""){this.name=e,this.type=t,this.code=r,Object.defineProperty(this,"isNodeCode",{value:!0})}}let jT=0;class qT{constructor(e=null){this.id=jT++,this.nodesData=new WeakMap,this.parent=e}getData(e){let t=this.nodesData.get(e);return void 0===t&&null!==this.parent&&(t=this.parent.getData(e)),t}setData(e,t){this.nodesData.set(e,t)}}class XT{constructor(e,t){this.name=e,this.members=t,this.output=!1}}class KT{constructor(e,t){this.name=e,this.value=t,this.boundary=0,this.itemSize=0,this.offset=0}setValue(e){this.value=e}getValue(){return this.value}}class YT extends KT{constructor(e,t=0){super(e,t),this.isNumberUniform=!0,this.boundary=4,this.itemSize=1}}class QT extends KT{constructor(e,r=new t){super(e,r),this.isVector2Uniform=!0,this.boundary=8,this.itemSize=2}}class ZT extends KT{constructor(e,t=new r){super(e,t),this.isVector3Uniform=!0,this.boundary=16,this.itemSize=3}}class JT extends KT{constructor(e,t=new s){super(e,t),this.isVector4Uniform=!0,this.boundary=16,this.itemSize=4}}class e_ extends KT{constructor(t,r=new e){super(t,r),this.isColorUniform=!0,this.boundary=16,this.itemSize=3}}class t_ extends KT{constructor(e,t=new i){super(e,t),this.isMatrix2Uniform=!0,this.boundary=16,this.itemSize=4}}class r_ extends KT{constructor(e,t=new n){super(e,t),this.isMatrix3Uniform=!0,this.boundary=48,this.itemSize=12}}class s_ extends KT{constructor(e,t=new a){super(e,t),this.isMatrix4Uniform=!0,this.boundary=64,this.itemSize=16}}class i_ extends YT{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class n_ extends QT{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class a_ extends ZT{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class o_ extends JT{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class u_ extends e_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class l_ extends t_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class d_ extends r_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class c_ extends s_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}const h_=new WeakMap,p_=new Map([[Int8Array,"int"],[Int16Array,"int"],[Int32Array,"int"],[Uint8Array,"uint"],[Uint16Array,"uint"],[Uint32Array,"uint"],[Float32Array,"float"]]),g_=e=>/e/g.test(e)?String(e).replace(/\+/g,""):(e=Number(e))+(e%1?"":".0");class m_{constructor(e,t,r){this.object=e,this.material=e&&e.material||null,this.geometry=e&&e.geometry||null,this.renderer=t,this.parser=r,this.scene=null,this.camera=null,this.nodes=[],this.sequentialNodes=[],this.updateNodes=[],this.updateBeforeNodes=[],this.updateAfterNodes=[],this.hashNodes={},this.observer=null,this.lightsNode=null,this.environmentNode=null,this.fogNode=null,this.clippingContext=null,this.vertexShader=null,this.fragmentShader=null,this.computeShader=null,this.flowNodes={vertex:[],fragment:[],compute:[]},this.flowCode={vertex:"",fragment:"",compute:""},this.uniforms={vertex:[],fragment:[],compute:[],index:0},this.structs={vertex:[],fragment:[],compute:[],index:0},this.bindings={vertex:{},fragment:{},compute:{}},this.bindingsIndexes={},this.bindGroups=null,this.attributes=[],this.bufferAttributes=[],this.varyings=[],this.codes={},this.vars={},this.declarations={},this.flow={code:""},this.chaining=[],this.stack=xf(),this.stacks=[],this.tab="\t",this.currentFunctionNode=null,this.context={material:this.material},this.cache=new qT,this.globalCache=this.cache,this.flowsData=new WeakMap,this.shaderStage=null,this.buildStage=null}getBindGroupsCache(){let e=h_.get(this.renderer);return void 0===e&&(e=new Mm,h_.set(this.renderer,e)),e}createRenderTarget(e,t,r){return new ae(e,t,r)}createCubeRenderTarget(e,t){return new Xh(e,t)}includes(e){return this.nodes.includes(e)}getOutputStructName(){}_getBindGroup(e,t){const r=this.getBindGroupsCache(),s=[];let i,n=!0;for(const e of t)s.push(e),n=n&&!0!==e.groupNode.shared;return n?(i=r.get(s),void 0===i&&(i=new OT(e,s,this.bindingsIndexes[e].group,s),r.set(s,i))):i=new OT(e,s,this.bindingsIndexes[e].group,s),i}getBindGroupArray(e,t){const r=this.bindings[t];let s=r[e];return void 0===s&&(void 0===this.bindingsIndexes[e]&&(this.bindingsIndexes[e]={binding:0,group:Object.keys(this.bindingsIndexes).length}),r[e]=s=[]),s}getBindings(){let e=this.bindGroups;if(null===e){const t={},r=this.bindings;for(const e of Gs)for(const s in r[e]){const i=r[e][s];(t[s]||(t[s]=[])).push(...i)}e=[];for(const r in t){const s=t[r],i=this._getBindGroup(r,s);e.push(i)}this.bindGroups=e}return e}sortBindingGroups(){const e=this.getBindings();e.sort(((e,t)=>e.bindings[0].groupNode.order-t.bindings[0].groupNode.order));for(let t=0;t=0?`${Math.round(n)}u`:"0u";if("bool"===i)return n?"true":"false";if("color"===i)return`${this.getType("vec3")}( ${g_(n.r)}, ${g_(n.g)}, ${g_(n.b)} )`;const a=this.getTypeLength(i),o=this.getComponentType(i),u=e=>this.generateConst(o,e);if(2===a)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)} )`;if(3===a)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)} )`;if(4===a&&"mat2"!==i)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)}, ${u(n.w)} )`;if(a>=4&&n&&(n.isMatrix2||n.isMatrix3||n.isMatrix4))return`${this.getType(i)}( ${n.elements.map(u).join(", ")} )`;if(a>4)return`${this.getType(i)}()`;throw new Error(`NodeBuilder: Type '${i}' not found in generate constant attempt.`)}getType(e){return"color"===e?"vec3":e}hasGeometryAttribute(e){return this.geometry&&void 0!==this.geometry.getAttribute(e)}getAttribute(e,t){const r=this.attributes;for(const t of r)if(t.name===e)return t;const s=new kT(e,t);return this.registerDeclaration(s),r.push(s),s}getPropertyName(e){return e.name}isVector(e){return/vec\d/.test(e)}isMatrix(e){return/mat\d/.test(e)}isReference(e){return"void"===e||"property"===e||"sampler"===e||"samplerComparison"===e||"texture"===e||"cubeTexture"===e||"storageTexture"===e||"depthTexture"===e||"texture3D"===e}needsToWorkingColorSpace(){return!1}getComponentTypeFromTexture(e){const t=e.type;if(e.isDataTexture){if(t===T)return"int";if(t===b)return"uint"}return"float"}getElementType(e){return"mat2"===e?"vec2":"mat3"===e?"vec3":"mat4"===e?"vec4":this.getComponentType(e)}getComponentType(e){if("float"===(e=this.getVectorType(e))||"bool"===e||"int"===e||"uint"===e)return e;const t=/(b|i|u|)(vec|mat)([2-4])/.exec(e);return null===t?null:"b"===t[1]?"bool":"i"===t[1]?"int":"u"===t[1]?"uint":"float"}getVectorType(e){return"color"===e?"vec3":"texture"===e||"cubeTexture"===e||"storageTexture"===e||"texture3D"===e?"vec4":e}getTypeFromLength(e,t="float"){if(1===e)return t;let r=Es(e);const s="float"===t?"":t[0];return!0===/mat2/.test(t)&&(r=r.replace("vec","mat")),s+r}getTypeFromArray(e){return p_.get(e.constructor)}isInteger(e){return/int|uint|(i|u)vec/.test(e)}getTypeFromAttribute(e){let t=e;e.isInterleavedBufferAttribute&&(t=e.data);const r=t.array,s=e.itemSize,i=e.normalized;let n;return e instanceof ze||!0===i||(n=this.getTypeFromArray(r)),this.getTypeFromLength(s,n)}getTypeLength(e){const t=this.getVectorType(e),r=/vec([2-4])/.exec(t);return null!==r?Number(r[1]):"float"===t||"bool"===t||"int"===t||"uint"===t?1:!0===/mat2/.test(e)?4:!0===/mat3/.test(e)?9:!0===/mat4/.test(e)?16:0}getVectorFromMatrix(e){return e.replace("mat","vec")}changeComponentType(e,t){return this.getTypeFromLength(this.getTypeLength(e),t)}getIntegerType(e){const t=this.getComponentType(e);return"int"===t||"uint"===t?e:this.changeComponentType(e,"int")}addStack(){return this.stack=xf(this.stack),this.stacks.push(Oi()||this.stack),Ui(this.stack),this.stack}removeStack(){const e=this.stack;return this.stack=e.parent,Ui(this.stacks.pop()),e}getDataFromNode(e,t=this.shaderStage,r=null){let s=(r=null===r?e.isGlobal(this)?this.globalCache:this.cache:r).getData(e);return void 0===s&&(s={},r.setData(e,s)),void 0===s[t]&&(s[t]={}),s[t]}getNodeProperties(e,t="any"){const r=this.getDataFromNode(e,t);return r.properties||(r.properties={outputNode:null})}getBufferAttributeFromNode(e,t){const r=this.getDataFromNode(e);let s=r.bufferAttribute;if(void 0===s){const i=this.uniforms.index++;s=new kT("nodeAttribute"+i,t,e),this.bufferAttributes.push(s),r.bufferAttribute=s}return s}getStructTypeFromNode(e,t,r=null,s=this.shaderStage){const i=this.getDataFromNode(e,s,this.globalCache);let n=i.structType;if(void 0===n){const e=this.structs.index++;null===r&&(r="StructType"+e),n=new XT(r,t),this.structs[s].push(n),i.structType=n}return n}getOutputStructTypeFromNode(e,t){const r=this.getStructTypeFromNode(e,t,"OutputType","fragment");return r.output=!0,r}getUniformFromNode(e,t,r=this.shaderStage,s=null){const i=this.getDataFromNode(e,r,this.globalCache);let n=i.uniform;if(void 0===n){const a=this.uniforms.index++;n=new zT(s||"nodeUniform"+a,t,e),this.uniforms[r].push(n),this.registerDeclaration(n),i.uniform=n}return n}getArrayCount(e){let t=null;return e.isArrayNode?t=e.count:e.isVarNode&&e.node.isArrayNode&&(t=e.node.count),t}getVarFromNode(e,t=null,r=e.getNodeType(this),s=this.shaderStage,i=!1){const n=this.getDataFromNode(e,s);let a=n.variable;if(void 0===a){const o=i?"_const":"_var",u=this.vars[s]||(this.vars[s]=[]),l=this.vars[o]||(this.vars[o]=0);null===t&&(t=(i?"nodeConst":"nodeVar")+l,this.vars[o]++);const d=this.getArrayCount(e);a=new $T(t,r,i,d),i||u.push(a),this.registerDeclaration(a),n.variable=a}return a}isDeterministic(e){if(e.isMathNode)return this.isDeterministic(e.aNode)&&(!e.bNode||this.isDeterministic(e.bNode))&&(!e.cNode||this.isDeterministic(e.cNode));if(e.isOperatorNode)return this.isDeterministic(e.aNode)&&(!e.bNode||this.isDeterministic(e.bNode));if(e.isArrayNode){if(null!==e.values)for(const t of e.values)if(!this.isDeterministic(t))return!1;return!0}return!!e.isConstNode}getVaryingFromNode(e,t=null,r=e.getNodeType(this)){const s=this.getDataFromNode(e,"any");let i=s.varying;if(void 0===i){const e=this.varyings,n=e.length;null===t&&(t="nodeVarying"+n),i=new HT(t,r),e.push(i),this.registerDeclaration(i),s.varying=i}return i}registerDeclaration(e){const t=this.shaderStage,r=this.declarations[t]||(this.declarations[t]={}),s=this.getPropertyName(e);let i=1,n=s;for(;void 0!==r[n];)n=s+"_"+i++;r[n]=e,i>1&&(e.name=n,console.warn(`THREE.TSL: Declaration name '${s}' of '${e.type}' already in use. Renamed to '${n}'.`))}getCodeFromNode(e,t,r=this.shaderStage){const s=this.getDataFromNode(e);let i=s.code;if(void 0===i){const e=this.codes[r]||(this.codes[r]=[]),n=e.length;i=new WT("nodeCode"+n,t),e.push(i),s.code=i}return i}addFlowCodeHierarchy(e,t){const{flowCodes:r,flowCodeBlock:s}=this.getDataFromNode(e);let i=!0,n=t;for(;n;){if(!0===s.get(n)){i=!1;break}n=this.getDataFromNode(n).parentNodeBlock}if(i)for(const e of r)this.addLineFlowCode(e)}addLineFlowCodeBlock(e,t,r){const s=this.getDataFromNode(e),i=s.flowCodes||(s.flowCodes=[]),n=s.flowCodeBlock||(s.flowCodeBlock=new WeakMap);i.push(t),n.set(r,!0)}addLineFlowCode(e,t=null){return""===e||(null!==t&&this.context.nodeBlock&&this.addLineFlowCodeBlock(t,e,this.context.nodeBlock),e=this.tab+e,/;\s*$/.test(e)||(e+=";\n"),this.flow.code+=e),this}addFlowCode(e){return this.flow.code+=e,this}addFlowTab(){return this.tab+="\t",this}removeFlowTab(){return this.tab=this.tab.slice(0,-1),this}getFlowData(e){return this.flowsData.get(e)}flowNode(e){const t=e.getNodeType(this),r=this.flowChildNode(e,t);return this.flowsData.set(e,r),r}addInclude(e){null!==this.currentFunctionNode&&this.currentFunctionNode.includes.push(e)}buildFunctionNode(e){const t=new mx,r=this.currentFunctionNode;return this.currentFunctionNode=t,t.code=this.buildFunctionCode(e),this.currentFunctionNode=r,t}flowShaderNode(e){const t=e.layout,r={[Symbol.iterator](){let e=0;const t=Object.values(this);return{next:()=>({value:t[e],done:e++>=t.length})}}};for(const e of t.inputs)r[e.name]=new ff(e.type,e.name);e.layout=null;const s=e.call(r),i=this.flowStagesNode(s,t.type);return e.layout=t,i}flowStagesNode(e,t=null){const r=this.flow,s=this.vars,i=this.declarations,n=this.cache,a=this.buildStage,o=this.stack,u={code:""};this.flow=u,this.vars={},this.declarations={},this.cache=new qT,this.stack=xf();for(const r of Os)this.setBuildStage(r),u.result=e.build(this,t);return u.vars=this.getVars(this.shaderStage),this.flow=r,this.vars=s,this.declarations=i,this.cache=n,this.stack=o,this.setBuildStage(a),u}getFunctionOperator(){return null}buildFunctionCode(){console.warn("Abstract function.")}flowChildNode(e,t=null){const r=this.flow,s={code:""};return this.flow=s,s.result=e.build(this,t),this.flow=r,s}flowNodeFromShaderStage(e,t,r=null,s=null){const i=this.shaderStage;this.setShaderStage(e);const n=this.flowChildNode(t,r);return null!==s&&(n.code+=`${this.tab+s} = ${n.result};\n`),this.flowCode[e]=this.flowCode[e]+n.code,this.setShaderStage(i),n}getAttributesArray(){return this.attributes.concat(this.bufferAttributes)}getAttributes(){console.warn("Abstract function.")}getVaryings(){console.warn("Abstract function.")}getVar(e,t,r=null){return`${null!==r?this.generateArrayDeclaration(e,r):this.getType(e)} ${t}`}getVars(e){let t="";const r=this.vars[e];if(void 0!==r)for(const e of r)t+=`${this.getVar(e.type,e.name)}; `;return t}getUniforms(){console.warn("Abstract function.")}getCodes(e){const t=this.codes[e];let r="";if(void 0!==t)for(const e of t)r+=e.code+"\n";return r}getHash(){return this.vertexShader+this.fragmentShader+this.computeShader}setShaderStage(e){this.shaderStage=e}getShaderStage(){return this.shaderStage}setBuildStage(e){this.buildStage=e}getBuildStage(){return this.buildStage}buildCode(){console.warn("Abstract function.")}build(){const{object:e,material:t,renderer:r}=this;if(null!==t){let e=r.library.fromMaterial(t);null===e&&(console.error(`NodeMaterial: Material "${t.type}" is not compatible.`),e=new Fh),e.build(this)}else this.addFlow("compute",e);for(const e of Os){this.setBuildStage(e),this.context.vertex&&this.context.vertex.isNode&&this.flowNodeFromShaderStage("vertex",this.context.vertex);for(const t of Gs){this.setShaderStage(t);const r=this.flowNodes[t];for(const t of r)"generate"===e?this.flowNode(t):t.build(this)}}return this.setBuildStage(null),this.setShaderStage(null),this.buildCode(),this.buildUpdateNodes(),this}getNodeUniform(e,t){if("float"===t||"int"===t||"uint"===t)return new i_(e);if("vec2"===t||"ivec2"===t||"uvec2"===t)return new n_(e);if("vec3"===t||"ivec3"===t||"uvec3"===t)return new a_(e);if("vec4"===t||"ivec4"===t||"uvec4"===t)return new o_(e);if("color"===t)return new u_(e);if("mat2"===t)return new l_(e);if("mat3"===t)return new d_(e);if("mat4"===t)return new c_(e);throw new Error(`Uniform "${t}" not declared.`)}format(e,t,r){if((t=this.getVectorType(t))===(r=this.getVectorType(r))||null===r||this.isReference(r))return e;const s=this.getTypeLength(t),i=this.getTypeLength(r);return 16===s&&9===i?`${this.getType(r)}( ${e}[ 0 ].xyz, ${e}[ 1 ].xyz, ${e}[ 2 ].xyz )`:9===s&&4===i?`${this.getType(r)}( ${e}[ 0 ].xy, ${e}[ 1 ].xy )`:s>4||i>4||0===i?e:s===i?`${this.getType(r)}( ${e} )`:s>i?this.format(`${e}.${"xyz".slice(0,i)}`,this.getTypeFromLength(i,this.getComponentType(t)),r):4===i&&s>1?`${this.getType(r)}( ${this.format(e,t,"vec3")}, 1.0 )`:2===s?`${this.getType(r)}( ${this.format(e,t,"vec2")}, 0.0 )`:(1===s&&i>1&&t!==this.getComponentType(r)&&(e=`${this.getType(this.getComponentType(r))}( ${e} )`),`${this.getType(r)}( ${e} )`)}getSignature(){return`// Three.js r${$e} - Node System\n`}createNodeMaterial(e="NodeMaterial"){throw new Error(`THREE.NodeBuilder: createNodeMaterial() was deprecated. Use new ${e}() instead.`)}}class f_{constructor(){this.time=0,this.deltaTime=0,this.frameId=0,this.renderId=0,this.updateMap=new WeakMap,this.updateBeforeMap=new WeakMap,this.updateAfterMap=new WeakMap,this.renderer=null,this.material=null,this.camera=null,this.object=null,this.scene=null}_getMaps(e,t){let r=e.get(t);return void 0===r&&(r={renderMap:new WeakMap,frameMap:new WeakMap},e.set(t,r)),r}updateBeforeNode(e){const t=e.getUpdateBeforeType(),r=e.updateReference(this);if(t===Is.FRAME){const{frameMap:t}=this._getMaps(this.updateBeforeMap,r);t.get(r)!==this.frameId&&!1!==e.updateBefore(this)&&t.set(r,this.frameId)}else if(t===Is.RENDER){const{renderMap:t}=this._getMaps(this.updateBeforeMap,r);t.get(r)!==this.renderId&&!1!==e.updateBefore(this)&&t.set(r,this.renderId)}else t===Is.OBJECT&&e.updateBefore(this)}updateAfterNode(e){const t=e.getUpdateAfterType(),r=e.updateReference(this);if(t===Is.FRAME){const{frameMap:t}=this._getMaps(this.updateAfterMap,r);t.get(r)!==this.frameId&&!1!==e.updateAfter(this)&&t.set(r,this.frameId)}else if(t===Is.RENDER){const{renderMap:t}=this._getMaps(this.updateAfterMap,r);t.get(r)!==this.renderId&&!1!==e.updateAfter(this)&&t.set(r,this.renderId)}else t===Is.OBJECT&&e.updateAfter(this)}updateNode(e){const t=e.getUpdateType(),r=e.updateReference(this);if(t===Is.FRAME){const{frameMap:t}=this._getMaps(this.updateMap,r);t.get(r)!==this.frameId&&!1!==e.update(this)&&t.set(r,this.frameId)}else if(t===Is.RENDER){const{renderMap:t}=this._getMaps(this.updateMap,r);t.get(r)!==this.renderId&&!1!==e.update(this)&&t.set(r,this.renderId)}else t===Is.OBJECT&&e.update(this)}update(){this.frameId++,void 0===this.lastTime&&(this.lastTime=performance.now()),this.deltaTime=(performance.now()-this.lastTime)/1e3,this.lastTime=performance.now(),this.time+=this.deltaTime}}class y_{constructor(e,t,r=null,s="",i=!1){this.type=e,this.name=t,this.count=r,this.qualifier=s,this.isConst=i}}y_.isNodeFunctionInput=!0;class x_ extends Vb{static get type(){return"DirectionalLightNode"}constructor(e=null){super(e)}setupDirect(){const e=this.colorNode;return{lightDirection:Zx(this.light),lightColor:e}}}const b_=new a,T_=new a;let __=null;class v_ extends Vb{static get type(){return"RectAreaLightNode"}constructor(e=null){super(e),this.halfHeight=Tn(new r).setGroup(yn),this.halfWidth=Tn(new r).setGroup(yn),this.updateType=Is.RENDER}update(e){super.update(e);const{light:t}=this,r=e.camera.matrixWorldInverse;T_.identity(),b_.copy(t.matrixWorld),b_.premultiply(r),T_.extractRotation(b_),this.halfWidth.value.set(.5*t.width,0,0),this.halfHeight.value.set(0,.5*t.height,0),this.halfWidth.value.applyMatrix4(T_),this.halfHeight.value.applyMatrix4(T_)}setupDirectRectArea(e){let t,r;e.isAvailable("float32Filterable")?(t=Hu(__.LTC_FLOAT_1),r=Hu(__.LTC_FLOAT_2)):(t=Hu(__.LTC_HALF_1),r=Hu(__.LTC_HALF_2));const{colorNode:s,light:i}=this;return{lightColor:s,lightPosition:Qx(i),halfWidth:this.halfWidth,halfHeight:this.halfHeight,ltc_1:t,ltc_2:r}}static setLTC(e){__=e}}class N_ extends Vb{static get type(){return"SpotLightNode"}constructor(e=null){super(e),this.coneCosNode=Tn(0).setGroup(yn),this.penumbraCosNode=Tn(0).setGroup(yn),this.cutoffDistanceNode=Tn(0).setGroup(yn),this.decayExponentNode=Tn(0).setGroup(yn)}update(e){super.update(e);const{light:t}=this;this.coneCosNode.value=Math.cos(t.angle),this.penumbraCosNode.value=Math.cos(t.angle*(1-t.penumbra)),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}getSpotAttenuation(e){const{coneCosNode:t,penumbraCosNode:r}=this;return Po(t,r,e)}setupDirect(e){const{colorNode:t,cutoffDistanceNode:r,decayExponentNode:s,light:i}=this,n=this.getLightVector(e),a=n.normalize(),o=a.dot(Zx(i)),u=this.getSpotAttenuation(o),l=n.length(),d=Ub({lightDistance:l,cutoffDistance:r,decayExponent:s});let c=t.mul(u).mul(d);if(i.map){const t=Xx(i,e.context.positionWorld),r=Hu(i.map,t.xy).onRenderUpdate((()=>i.map));c=t.mul(2).sub(1).abs().lessThan(1).all().select(c.mul(r),c)}return{lightColor:c,lightDirection:a}}}class S_ extends N_{static get type(){return"IESSpotLightNode"}getSpotAttenuation(e){const t=this.light.iesMap;let r=null;if(t&&!0===t.isTexture){const s=e.acos().mul(1/Math.PI);r=Hu(t,qi(s,0),0).r}else r=super.getSpotAttenuation(e);return r}}class E_ extends Vb{static get type(){return"AmbientLightNode"}constructor(e=null){super(e)}setup({context:e}){e.irradiance.addAssign(this.colorNode)}}class w_ extends Vb{static get type(){return"HemisphereLightNode"}constructor(t=null){super(t),this.lightPositionNode=Kx(t),this.lightDirectionNode=this.lightPositionNode.normalize(),this.groundColorNode=Tn(new e).setGroup(yn)}update(e){const{light:t}=this;super.update(e),this.lightPositionNode.object3d=t,this.groundColorNode.value.copy(t.groundColor).multiplyScalar(t.intensity)}setup(e){const{colorNode:t,groundColorNode:r,lightDirectionNode:s}=this,i=Gl.dot(s).mul(.5).add(.5),n=Ao(r,t,i);e.context.irradiance.addAssign(n)}}class A_ extends Vb{static get type(){return"LightProbeNode"}constructor(e=null){super(e);const t=[];for(let e=0;e<9;e++)t.push(new r);this.lightProbe=Yu(t)}update(e){const{light:t}=this;super.update(e);for(let e=0;e<9;e++)this.lightProbe.array[e].copy(t.sh.coefficients[e]).multiplyScalar(t.intensity)}setup(e){const t=BT(kl,this.lightProbe);e.context.irradiance.addAssign(t)}}class R_{parseFunction(){console.warn("Abstract function.")}}class C_{constructor(e,t,r="",s=""){this.type=e,this.inputs=t,this.name=r,this.precision=s}getCode(){console.warn("Abstract function.")}}C_.isNodeFunction=!0;const M_=/^\s*(highp|mediump|lowp)?\s*([a-z_0-9]+)\s*([a-z_0-9]+)?\s*\(([\s\S]*?)\)/i,P_=/[a-z_0-9]+/gi,L_="#pragma main";class F_ extends C_{constructor(e){const{type:t,inputs:r,name:s,precision:i,inputsCode:n,blockCode:a,headerCode:o}=(e=>{const t=(e=e.trim()).indexOf(L_),r=-1!==t?e.slice(t+12):e,s=r.match(M_);if(null!==s&&5===s.length){const i=s[4],n=[];let a=null;for(;null!==(a=P_.exec(i));)n.push(a);const o=[];let u=0;for(;u0||e.backgroundBlurriness>0&&0===t.backgroundBlurriness;if(t.background!==r||s){const i=this.getCacheNode("background",r,(()=>{if(!0===r.isCubeTexture||r.mapping===Y||r.mapping===Q||r.mapping===oe){if(e.backgroundBlurriness>0||r.mapping===oe)return Yg(r);{let e;return e=!0===r.isCubeTexture?sd(r):Hu(r),Jh(e)}}if(!0===r.isTexture)return Hu(r,rh.flipY()).setUpdateMatrix(!0);!0!==r.isColor&&console.error("WebGPUNodes: Unsupported background configuration.",r)}),s);t.backgroundNode=i,t.background=r,t.backgroundBlurriness=e.backgroundBlurriness}}else t.backgroundNode&&(delete t.backgroundNode,delete t.background)}getCacheNode(e,t,r,s=!1){const i=this.cacheLib[e]||(this.cacheLib[e]=new WeakMap);let n=i.get(t);return(void 0===n||s)&&(n=r(),i.set(t,n)),n}updateFog(e){const t=this.get(e),r=e.fog;if(r){if(t.fog!==r){const e=this.getCacheNode("fog",r,(()=>{if(r.isFogExp2){const e=ad("color","color",r).setGroup(yn),t=ad("density","float",r).setGroup(yn);return Ax(e,wx(t))}if(r.isFog){const e=ad("color","color",r).setGroup(yn),t=ad("near","float",r).setGroup(yn),s=ad("far","float",r).setGroup(yn);return Ax(e,Ex(t,s))}console.error("THREE.Renderer: Unsupported fog configuration.",r)}));t.fogNode=e,t.fog=r}}else delete t.fogNode,delete t.fog}updateEnvironment(e){const t=this.get(e),r=e.environment;if(r){if(t.environment!==r){const e=this.getCacheNode("environment",r,(()=>!0===r.isCubeTexture?sd(r):!0===r.isTexture?Hu(r):void console.error("Nodes: Unsupported environment configuration.",r)));t.environmentNode=e,t.environment=r}}else t.environmentNode&&(delete t.environmentNode,delete t.environment)}getNodeFrame(e=this.renderer,t=null,r=null,s=null,i=null){const n=this.nodeFrame;return n.renderer=e,n.scene=t,n.object=r,n.camera=s,n.material=i,n}getNodeFrameForRender(e){return this.getNodeFrame(e.renderer,e.scene,e.object,e.camera,e.material)}getOutputCacheKey(){const e=this.renderer;return e.toneMapping+","+e.currentColorSpace}hasOutputChange(e){return I_.get(e)!==this.getOutputCacheKey()}getOutputNode(e){const t=this.renderer,r=this.getOutputCacheKey(),s=Hu(e,rh).renderOutput(t.toneMapping,t.currentColorSpace);return I_.set(e,r),s}updateBefore(e){const t=e.getNodeBuilderState();for(const r of t.updateBeforeNodes)this.getNodeFrameForRender(e).updateBeforeNode(r)}updateAfter(e){const t=e.getNodeBuilderState();for(const r of t.updateAfterNodes)this.getNodeFrameForRender(e).updateAfterNode(r)}updateForCompute(e){const t=this.getNodeFrame(),r=this.getForCompute(e);for(const e of r.updateNodes)t.updateNode(e)}updateForRender(e){const t=this.getNodeFrameForRender(e),r=e.getNodeBuilderState();for(const e of r.updateNodes)t.updateNode(e)}needsRefresh(e){const t=this.getNodeFrameForRender(e);return e.getMonitor().needsRefresh(e,t)}dispose(){super.dispose(),this.nodeFrame=new f_,this.nodeBuilderCache=new Map,this.cacheLib={}}}const O_=new Me;class G_{constructor(e=null){this.version=0,this.clipIntersection=null,this.cacheKey="",this.shadowPass=!1,this.viewNormalMatrix=new n,this.clippingGroupContexts=new WeakMap,this.intersectionPlanes=[],this.unionPlanes=[],this.parentVersion=null,null!==e&&(this.viewNormalMatrix=e.viewNormalMatrix,this.clippingGroupContexts=e.clippingGroupContexts,this.shadowPass=e.shadowPass,this.viewMatrix=e.viewMatrix)}projectPlanes(e,t,r){const s=e.length;for(let i=0;i0,alpha:!0,depth:t.depth,stencil:t.stencil,framebufferScaleFactor:this.getFramebufferScaleFactor()},i=new XRWebGLLayer(e,s,r);this._glBaseLayer=i,e.updateRenderState({baseLayer:i}),t.setPixelRatio(1),t.setSize(i.framebufferWidth,i.framebufferHeight,!1),this._xrRenderTarget=new X_(i.framebufferWidth,i.framebufferHeight,{format:ce,type:Ce,colorSpace:t.outputColorSpace,stencilBuffer:t.stencil,resolveDepthBuffer:!1===i.ignoreDepthValues,resolveStencilBuffer:!1===i.ignoreDepthValues})}this.setFoveation(this.getFoveation()),t._animation.setAnimationLoop(this._onAnimationFrame),t._animation.setContext(e),t._animation.start(),this.isPresenting=!0,this.dispatchEvent({type:"sessionstart"})}}updateCamera(e){const t=this._session;if(null===t)return;const r=e.near,s=e.far,i=this._cameraXR,n=this._cameraL,a=this._cameraR;i.near=a.near=n.near=r,i.far=a.far=n.far=s,this._currentDepthNear===i.near&&this._currentDepthFar===i.far||(t.updateRenderState({depthNear:i.near,depthFar:i.far}),this._currentDepthNear=i.near,this._currentDepthFar=i.far),n.layers.mask=2|e.layers.mask,a.layers.mask=4|e.layers.mask,i.layers.mask=n.layers.mask|a.layers.mask;const o=e.parent,u=i.cameras;Z_(i,o);for(let e=0;e=0&&(r[n]=null,t[n].disconnect(i))}for(let s=0;s=r.length){r.push(i),n=e;break}if(null===r[e]){r[e]=i,n=e;break}}if(-1===n)break}const a=t[n];a&&a.connect(i)}}function rv(e){return"quad"===e.type?this._glBinding.createQuadLayer({transform:new XRRigidTransform(e.translation,e.quaternion),depthFormat:this._gl.DEPTH_COMPONENT,width:e.width/2,height:e.height/2,space:this._referenceSpace,viewPixelWidth:e.pixelwidth,viewPixelHeight:e.pixelheight}):this._glBinding.createCylinderLayer({transform:new XRRigidTransform(e.translation,e.quaternion),depthFormat:this._gl.DEPTH_COMPONENT,radius:e.radius,centralAngle:e.centralAngle,aspectRatio:e.aspectRatio,space:this._referenceSpace,viewPixelWidth:e.pixelwidth,viewPixelHeight:e.pixelheight})}function sv(e,t){if(void 0===t)return;const r=this._cameraXR,i=this._renderer,n=i.backend,a=this._glBaseLayer,o=this.getReferenceSpace(),u=t.getViewerPose(o);if(this._xrFrame=t,null!==u){const e=u.views;null!==this._glBaseLayer&&n.setXRTarget(a.framebuffer);let t=!1;e.length!==r.cameras.length&&(r.cameras.length=0,t=!0);for(let i=0;i{await this.compileAsync(e,t);const s=this._renderLists.get(e,t),i=this._renderContexts.get(e,t,this._renderTarget),n=e.overrideMaterial||r.material,a=this._objects.get(r,n,e,t,s.lightsNode,i,i.clippingContext),{fragmentShader:o,vertexShader:u}=a.getNodeBuilderState();return{fragmentShader:o,vertexShader:u}}}}async init(){if(this._initialized)throw new Error("Renderer: Backend has already been initialized.");return null!==this._initPromise||(this._initPromise=new Promise((async(e,t)=>{let r=this.backend;try{await r.init(this)}catch(e){if(null===this._getFallback)return void t(e);try{this.backend=r=this._getFallback(e),await r.init(this)}catch(e){return void t(e)}}this._nodes=new U_(this,r),this._animation=new Cm(this._nodes,this.info),this._attributes=new km(r),this._background=new VT(this,this._nodes),this._geometries=new Hm(this._attributes,this.info),this._textures=new gf(this,r,this.info),this._pipelines=new Qm(r,this._nodes),this._bindings=new Zm(r,this._nodes,this._textures,this._attributes,this._pipelines,this.info),this._objects=new Bm(this,this._nodes,this._geometries,this._pipelines,this._bindings,this.info),this._renderLists=new nf(this.lighting),this._bundles=new $_,this._renderContexts=new hf,this._animation.start(),this._initialized=!0,e(this)}))),this._initPromise}get coordinateSystem(){return this.backend.coordinateSystem}async compileAsync(e,t,r=null){if(!0===this._isDeviceLost)return;!1===this._initialized&&await this.init();const s=this._nodes.nodeFrame,i=s.renderId,n=this._currentRenderContext,a=this._currentRenderObjectFunction,o=this._compilationPromises,u=!0===e.isScene?e:iv;null===r&&(r=e);const l=this._renderTarget,d=this._renderContexts.get(r,t,l),c=this._activeMipmapLevel,h=[];this._currentRenderContext=d,this._currentRenderObjectFunction=this.renderObject,this._handleObjectFunction=this._createObjectPipeline,this._compilationPromises=h,s.renderId++,s.update(),d.depth=this.depth,d.stencil=this.stencil,d.clippingContext||(d.clippingContext=new G_),d.clippingContext.updateGlobal(u,t),u.onBeforeRender(this,e,t,l);const p=this._renderLists.get(e,t);if(p.begin(),this._projectObject(e,t,0,p,d.clippingContext),r!==e&&r.traverseVisible((function(e){e.isLight&&e.layers.test(t.layers)&&p.pushLight(e)})),p.finish(),null!==l){this._textures.updateRenderTarget(l,c);const e=this._textures.get(l);d.textures=e.textures,d.depthTexture=e.depthTexture}else d.textures=null,d.depthTexture=null;this._background.update(u,p,d);const g=p.opaque,m=p.transparent,f=p.transparentDoublePass,y=p.lightsNode;!0===this.opaque&&g.length>0&&this._renderObjects(g,t,u,y),!0===this.transparent&&m.length>0&&this._renderTransparents(m,f,t,u,y),s.renderId=i,this._currentRenderContext=n,this._currentRenderObjectFunction=a,this._compilationPromises=o,this._handleObjectFunction=this._renderObjectDirect,await Promise.all(h)}async renderAsync(e,t){!1===this._initialized&&await this.init(),this._renderScene(e,t)}async waitForGPU(){await this.backend.waitForGPU()}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}getColorBufferType(){return this._colorBufferType}_onDeviceLost(e){let t=`THREE.WebGPURenderer: ${e.api} Device Lost:\n\nMessage: ${e.message}`;e.reason&&(t+=`\nReason: ${e.reason}`),console.error(t),this._isDeviceLost=!0}_renderBundle(e,t,r){const{bundleGroup:s,camera:i,renderList:n}=e,a=this._currentRenderContext,o=this._bundles.get(s,i),u=this.backend.get(o);void 0===u.renderContexts&&(u.renderContexts=new Set);const l=s.version!==u.version,d=!1===u.renderContexts.has(a)||l;if(u.renderContexts.add(a),d){this.backend.beginBundle(a),(void 0===u.renderObjects||l)&&(u.renderObjects=[]),this._currentRenderBundle=o;const{transparentDoublePass:e,transparent:d,opaque:c}=n;!0===this.opaque&&c.length>0&&this._renderObjects(c,i,t,r),!0===this.transparent&&d.length>0&&this._renderTransparents(d,e,i,t,r),this._currentRenderBundle=null,this.backend.finishBundle(a,o),u.version=s.version}else{const{renderObjects:e}=u;for(let t=0,r=e.length;t>=c,p.viewportValue.height>>=c,p.viewportValue.minDepth=b,p.viewportValue.maxDepth=T,p.viewport=!1===p.viewportValue.equals(av),p.scissorValue.copy(y).multiplyScalar(x).floor(),p.scissor=this._scissorTest&&!1===p.scissorValue.equals(av),p.scissorValue.width>>=c,p.scissorValue.height>>=c,p.clippingContext||(p.clippingContext=new G_),p.clippingContext.updateGlobal(u,t),u.onBeforeRender(this,e,t,h),uv.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),ov.setFromProjectionMatrix(uv,g);const _=this._renderLists.get(e,t);if(_.begin(),this._projectObject(e,t,0,_,p.clippingContext),_.finish(),!0===this.sortObjects&&_.sort(this._opaqueSort,this._transparentSort),null!==h){this._textures.updateRenderTarget(h,c);const e=this._textures.get(h);p.textures=e.textures,p.depthTexture=e.depthTexture,p.width=e.width,p.height=e.height,p.renderTarget=h,p.depth=h.depthBuffer,p.stencil=h.stencilBuffer}else p.textures=null,p.depthTexture=null,p.width=this.domElement.width,p.height=this.domElement.height,p.depth=this.depth,p.stencil=this.stencil;p.width>>=c,p.height>>=c,p.activeCubeFace=d,p.activeMipmapLevel=c,p.occlusionQueryCount=_.occlusionQueryCount,this._background.update(u,_,p),this.backend.beginRender(p);const{bundles:v,lightsNode:N,transparentDoublePass:S,transparent:E,opaque:w}=_;return v.length>0&&this._renderBundles(v,u,N),!0===this.opaque&&w.length>0&&this._renderObjects(w,t,u,N),!0===this.transparent&&E.length>0&&this._renderTransparents(E,S,t,u,N),this.backend.finishRender(p),i.renderId=n,this._currentRenderContext=a,this._currentRenderObjectFunction=o,null!==s&&(this.setRenderTarget(l,d,c),this._renderOutput(h)),u.onAfterRender(this,e,t,h),p}_renderOutput(e){const t=this._quad;this._nodes.hasOutputChange(e.texture)&&(t.material.fragmentNode=this._nodes.getOutputNode(e.texture),t.material.needsUpdate=!0);const r=this.autoClear,s=this.xr.enabled;this.autoClear=!1,this.xr.enabled=!1,this._renderScene(t,t.camera,!1),this.autoClear=r,this.xr.enabled=s}getMaxAnisotropy(){return this.backend.getMaxAnisotropy()}getActiveCubeFace(){return this._activeCubeFace}getActiveMipmapLevel(){return this._activeMipmapLevel}async setAnimationLoop(e){!1===this._initialized&&await this.init(),this._animation.setAnimationLoop(e)}async getArrayBufferAsync(e){return await this.backend.getArrayBufferAsync(e)}getContext(){return this.backend.getContext()}getPixelRatio(){return this._pixelRatio}getDrawingBufferSize(e){return e.set(this._width*this._pixelRatio,this._height*this._pixelRatio).floor()}getSize(e){return e.set(this._width,this._height)}setPixelRatio(e=1){this._pixelRatio!==e&&(this._pixelRatio=e,this.setSize(this._width,this._height,!1))}setDrawingBufferSize(e,t,r){this.xr&&this.xr.isPresenting||(this._width=e,this._height=t,this._pixelRatio=r,this.domElement.width=Math.floor(e*r),this.domElement.height=Math.floor(t*r),this.setViewport(0,0,e,t),this._initialized&&this.backend.updateSize())}setSize(e,t,r=!0){this.xr&&this.xr.isPresenting||(this._width=e,this._height=t,this.domElement.width=Math.floor(e*this._pixelRatio),this.domElement.height=Math.floor(t*this._pixelRatio),!0===r&&(this.domElement.style.width=e+"px",this.domElement.style.height=t+"px"),this.setViewport(0,0,e,t),this._initialized&&this.backend.updateSize())}setOpaqueSort(e){this._opaqueSort=e}setTransparentSort(e){this._transparentSort=e}getScissor(e){const t=this._scissor;return e.x=t.x,e.y=t.y,e.width=t.width,e.height=t.height,e}setScissor(e,t,r,s){const i=this._scissor;e.isVector4?i.copy(e):i.set(e,t,r,s)}getScissorTest(){return this._scissorTest}setScissorTest(e){this._scissorTest=e,this.backend.setScissorTest(e)}getViewport(e){return e.copy(this._viewport)}setViewport(e,t,r,s,i=0,n=1){const a=this._viewport;e.isVector4?a.copy(e):a.set(e,t,r,s),a.minDepth=i,a.maxDepth=n}getClearColor(e){return e.copy(this._clearColor)}setClearColor(e,t=1){this._clearColor.set(e),this._clearColor.a=t}getClearAlpha(){return this._clearColor.a}setClearAlpha(e){this._clearColor.a=e}getClearDepth(){return this._clearDepth}setClearDepth(e){this._clearDepth=e}getClearStencil(){return this._clearStencil}setClearStencil(e){this._clearStencil=e}isOccluded(e){const t=this._currentRenderContext;return t&&this.backend.isOccluded(t,e)}clear(e=!0,t=!0,r=!0){if(!1===this._initialized)return console.warn("THREE.Renderer: .clear() called before the backend is initialized. Try using .clearAsync() instead."),this.clearAsync(e,t,r);const s=this._renderTarget||this._getFrameBufferTarget();let i=null;if(null!==s){this._textures.updateRenderTarget(s);const e=this._textures.get(s);i=this._renderContexts.getForClear(s),i.textures=e.textures,i.depthTexture=e.depthTexture,i.width=e.width,i.height=e.height,i.renderTarget=s,i.depth=s.depthBuffer,i.stencil=s.stencilBuffer,i.clearColorValue=this.backend.getClearColor(),i.activeCubeFace=this.getActiveCubeFace(),i.activeMipmapLevel=this.getActiveMipmapLevel()}this.backend.clear(e,t,r,i),null!==s&&null===this._renderTarget&&this._renderOutput(s)}clearColor(){return this.clear(!0,!1,!1)}clearDepth(){return this.clear(!1,!0,!1)}clearStencil(){return this.clear(!1,!1,!0)}async clearAsync(e=!0,t=!0,r=!0){!1===this._initialized&&await this.init(),this.clear(e,t,r)}async clearColorAsync(){this.clearAsync(!0,!1,!1)}async clearDepthAsync(){this.clearAsync(!1,!0,!1)}async clearStencilAsync(){this.clearAsync(!1,!1,!0)}get currentToneMapping(){return this.isOutputTarget?this.toneMapping:p}get currentColorSpace(){return this.isOutputTarget?this.outputColorSpace:de}get isOutputTarget(){return this._renderTarget===this._outputRenderTarget||null===this._renderTarget}dispose(){this.info.dispose(),this.backend.dispose(),this._animation.dispose(),this._objects.dispose(),this._pipelines.dispose(),this._nodes.dispose(),this._bindings.dispose(),this._renderLists.dispose(),this._renderContexts.dispose(),this._textures.dispose(),null!==this._frameBufferTarget&&this._frameBufferTarget.dispose(),Object.values(this.backend.timestampQueryPool).forEach((e=>{null!==e&&e.dispose()})),this.setRenderTarget(null),this.setAnimationLoop(null)}setRenderTarget(e,t=0,r=0){this._renderTarget=e,this._activeCubeFace=t,this._activeMipmapLevel=r}getRenderTarget(){return this._renderTarget}setOutputRenderTarget(e){this._outputRenderTarget=e}getOutputRenderTarget(){return this._outputRenderTarget}setRenderObjectFunction(e){this._renderObjectFunction=e}getRenderObjectFunction(){return this._renderObjectFunction}compute(e){if(!0===this._isDeviceLost)return;if(!1===this._initialized)return console.warn("THREE.Renderer: .compute() called before the backend is initialized. Try using .computeAsync() instead."),this.computeAsync(e);const t=this._nodes.nodeFrame,r=t.renderId;this.info.calls++,this.info.compute.calls++,this.info.compute.frameCalls++,t.renderId=this.info.calls;const s=this.backend,i=this._pipelines,n=this._bindings,a=this._nodes,o=Array.isArray(e)?e:[e];if(void 0===o[0]||!0!==o[0].isComputeNode)throw new Error("THREE.Renderer: .compute() expects a ComputeNode.");s.beginCompute(e);for(const t of o){if(!1===i.has(t)){const e=()=>{t.removeEventListener("dispose",e),i.delete(t),n.delete(t),a.delete(t)};t.addEventListener("dispose",e);const r=t.onInitFunction;null!==r&&r.call(t,{renderer:this})}a.updateForCompute(t),n.updateForCompute(t);const r=n.getForCompute(t),o=i.getForCompute(t,r);s.compute(e,t,r,o)}s.finishCompute(e),t.renderId=r}async computeAsync(e){!1===this._initialized&&await this.init(),this.compute(e)}async hasFeatureAsync(e){return!1===this._initialized&&await this.init(),this.backend.hasFeature(e)}async resolveTimestampsAsync(e="render"){return!1===this._initialized&&await this.init(),this.backend.resolveTimestampsAsync(e)}hasFeature(e){return!1===this._initialized?(console.warn("THREE.Renderer: .hasFeature() called before the backend is initialized. Try using .hasFeatureAsync() instead."),!1):this.backend.hasFeature(e)}hasInitialized(){return this._initialized}async initTextureAsync(e){!1===this._initialized&&await this.init(),this._textures.updateTexture(e)}initTexture(e){!1===this._initialized&&console.warn("THREE.Renderer: .initTexture() called before the backend is initialized. Try using .initTextureAsync() instead."),this._textures.updateTexture(e)}copyFramebufferToTexture(e,t=null){if(null!==t)if(t.isVector2)t=lv.set(t.x,t.y,e.image.width,e.image.height).floor();else{if(!t.isVector4)return void console.error("THREE.Renderer.copyFramebufferToTexture: Invalid rectangle.");t=lv.copy(t).floor()}else t=lv.set(0,0,e.image.width,e.image.height);let r,s=this._currentRenderContext;null!==s?r=s.renderTarget:(r=this._renderTarget||this._getFrameBufferTarget(),null!==r&&(this._textures.updateRenderTarget(r),s=this._textures.get(r))),this._textures.updateTexture(e,{renderTarget:r}),this.backend.copyFramebufferToTexture(e,s,t)}copyTextureToTexture(e,t,r=null,s=null,i=0,n=0){this._textures.updateTexture(e),this._textures.updateTexture(t),this.backend.copyTextureToTexture(e,t,r,s,i,n)}async readRenderTargetPixelsAsync(e,t,r,s,i,n=0,a=0){return this.backend.copyTextureToBuffer(e.textures[n],t,r,s,i,a)}_projectObject(e,t,r,s,i){if(!1===e.visible)return;if(e.layers.test(t.layers))if(e.isGroup)r=e.renderOrder,e.isClippingGroup&&e.enabled&&(i=i.getGroupContext(e));else if(e.isLOD)!0===e.autoUpdate&&e.update(t);else if(e.isLight)s.pushLight(e);else if(e.isSprite){if(!e.frustumCulled||ov.intersectsSprite(e)){!0===this.sortObjects&&lv.setFromMatrixPosition(e.matrixWorld).applyMatrix4(uv);const{geometry:t,material:n}=e;n.visible&&s.push(e,t,n,r,lv.z,null,i)}}else if(e.isLineLoop)console.error("THREE.Renderer: Objects of type THREE.LineLoop are not supported. Please use THREE.Line or THREE.LineSegments.");else if((e.isMesh||e.isLine||e.isPoints)&&(!e.frustumCulled||ov.intersectsObject(e))){const{geometry:t,material:n}=e;if(!0===this.sortObjects&&(null===t.boundingSphere&&t.computeBoundingSphere(),lv.copy(t.boundingSphere.center).applyMatrix4(e.matrixWorld).applyMatrix4(uv)),Array.isArray(n)){const a=t.groups;for(let o=0,u=a.length;o0){for(const{material:e}of t)e.side=N;this._renderObjects(t,r,s,i,"backSide");for(const{material:e}of t)e.side=je;this._renderObjects(e,r,s,i);for(const{material:e}of t)e.side=Se}else this._renderObjects(e,r,s,i)}_renderObjects(e,t,r,s,i=null){for(let n=0,a=e.length;n0,e.isShadowPassMaterial&&(e.side=null===i.shadowSide?i.side:i.shadowSide,i.depthNode&&i.depthNode.isNode&&(c=e.depthNode,e.depthNode=i.depthNode),i.castShadowNode&&i.castShadowNode.isNode&&(d=e.colorNode,e.colorNode=i.castShadowNode)),i=e}!0===i.transparent&&i.side===Se&&!1===i.forceSinglePass?(i.side=N,this._handleObjectFunction(e,i,t,r,a,n,o,"backSide"),i.side=je,this._handleObjectFunction(e,i,t,r,a,n,o,u),i.side=Se):this._handleObjectFunction(e,i,t,r,a,n,o,u),void 0!==l&&(t.overrideMaterial.positionNode=l),void 0!==c&&(t.overrideMaterial.depthNode=c),void 0!==d&&(t.overrideMaterial.colorNode=d),e.onAfterRender(this,t,r,s,i,n)}_renderObjectDirect(e,t,r,s,i,n,a,o){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,a,o);u.drawRange=e.geometry.drawRange,u.group=n;const l=this._nodes.needsRefresh(u);if(l&&(this._nodes.updateBefore(u),this._geometries.updateForRender(u),this._nodes.updateForRender(u),this._bindings.updateForRender(u)),this._pipelines.updateForRender(u),null!==this._currentRenderBundle){this.backend.get(this._currentRenderBundle).renderObjects.push(u),u.bundle=this._currentRenderBundle.bundleGroup}this.backend.draw(u,this.info),l&&this._nodes.updateAfter(u)}_createObjectPipeline(e,t,r,s,i,n,a,o){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,a,o);u.drawRange=e.geometry.drawRange,u.group=n,this._nodes.updateBefore(u),this._geometries.updateForRender(u),this._nodes.updateForRender(u),this._bindings.updateForRender(u),this._pipelines.getForRender(u,this._compilationPromises),this._nodes.updateAfter(u)}get compile(){return this.compileAsync}}class cv{constructor(e=""){this.name=e,this.visibility=0}setVisibility(e){this.visibility|=e}clone(){return Object.assign(new this.constructor,this)}}class hv extends cv{constructor(e,t=null){super(e),this.isBuffer=!0,this.bytesPerElement=Float32Array.BYTES_PER_ELEMENT,this._buffer=t}get byteLength(){return(e=this._buffer.byteLength)+(Gm-e%Gm)%Gm;var e}get buffer(){return this._buffer}update(){return!0}}class pv extends hv{constructor(e,t=null){super(e,t),this.isUniformBuffer=!0}}let gv=0;class mv extends pv{constructor(e,t){super("UniformBuffer_"+gv++,e?e.value:null),this.nodeUniform=e,this.groupNode=t}get buffer(){return this.nodeUniform.value}}class fv extends pv{constructor(e){super(e),this.isUniformsGroup=!0,this._values=null,this.uniforms=[]}addUniform(e){return this.uniforms.push(e),this}removeUniform(e){const t=this.uniforms.indexOf(e);return-1!==t&&this.uniforms.splice(t,1),this}get values(){return null===this._values&&(this._values=Array.from(this.buffer)),this._values}get buffer(){let e=this._buffer;if(null===e){const t=this.byteLength;e=new Float32Array(new ArrayBuffer(t)),this._buffer=e}return e}get byteLength(){let e=0;for(let t=0,r=this.uniforms.length;t0?s:"";t=`${e.name} {\n\t${r} ${i.name}[${n}];\n};\n`}else{t=`${this.getVectorType(i.type)} ${this.getPropertyName(i,e)};`,n=!0}const a=i.node.precision;if(null!==a&&(t=Ev[a]+" "+t),n){t="\t"+t;const e=i.groupNode.name;(s[e]||(s[e]=[])).push(t)}else t="uniform "+t,r.push(t)}let i="";for(const t in s){const r=s[t];i+=this._getGLSLUniformStruct(e+"_"+t,r.join("\n"))+"\n"}return i+=r.join("\n"),i}getTypeFromAttribute(e){let t=super.getTypeFromAttribute(e);if(/^[iu]/.test(t)&&e.gpuType!==T){let r=e;e.isInterleavedBufferAttribute&&(r=e.data);const s=r.array;!1==(s instanceof Uint32Array||s instanceof Int32Array)&&(t=t.slice(1))}return t}getAttributes(e){let t="";if("vertex"===e||"compute"===e){const e=this.getAttributesArray();let r=0;for(const s of e)t+=`layout( location = ${r++} ) in ${s.type} ${s.name};\n`}return t}getStructMembers(e){const t=[];for(const r of e.members)t.push(`\t${r.type} ${r.name};`);return t.join("\n")}getStructs(e){const t=[],r=this.structs[e],s=[];for(const e of r)if(e.output)for(const t of e.members)s.push(`layout( location = ${t.index} ) out ${t.type} ${t.name};`);else{let r="struct "+e.name+" {\n";r+=this.getStructMembers(e),r+="\n};\n",t.push(r)}return 0===s.length&&s.push("layout( location = 0 ) out vec4 fragColor;"),"\n"+s.join("\n")+"\n\n"+t.join("\n")}getVaryings(e){let t="";const r=this.varyings;if("vertex"===e||"compute"===e)for(const s of r){"compute"===e&&(s.needsInterpolation=!0);const r=this.getType(s.type);if(s.needsInterpolation){t+=`${r.includes("int")||r.includes("uv")||r.includes("iv")?"flat ":""}out ${r} ${s.name};\n`}else t+=`${r} ${s.name};\n`}else if("fragment"===e)for(const e of r)if(e.needsInterpolation){const r=this.getType(e.type);t+=`${r.includes("int")||r.includes("uv")||r.includes("iv")?"flat ":""}in ${r} ${e.name};\n`}for(const r of this.builtins[e])t+=`${r};\n`;return t}getVertexIndex(){return"uint( gl_VertexID )"}getInstanceIndex(){return"uint( gl_InstanceID )"}getInvocationLocalIndex(){return`uint( gl_InstanceID ) % ${this.object.workgroupSize.reduce(((e,t)=>e*t),1)}u`}getDrawIndex(){return this.renderer.backend.extensions.has("WEBGL_multi_draw")?"uint( gl_DrawID )":null}getFrontFacing(){return"gl_FrontFacing"}getFragCoord(){return"gl_FragCoord.xy"}getFragDepth(){return"gl_FragDepth"}enableExtension(e,t,r=this.shaderStage){const s=this.extensions[r]||(this.extensions[r]=new Map);!1===s.has(e)&&s.set(e,{name:e,behavior:t})}getExtensions(e){const t=[];if("vertex"===e){const t=this.renderer.backend.extensions;this.object.isBatchedMesh&&t.has("WEBGL_multi_draw")&&this.enableExtension("GL_ANGLE_multi_draw","require",e)}const r=this.extensions[e];if(void 0!==r)for(const{name:e,behavior:s}of r.values())t.push(`#extension ${e} : ${s}`);return t.join("\n")}getClipDistance(){return"gl_ClipDistance"}isAvailable(e){let t=wv[e];if(void 0===t){let r;switch(t=!1,e){case"float32Filterable":r="OES_texture_float_linear";break;case"clipDistance":r="WEBGL_clip_cull_distance"}if(void 0!==r){const e=this.renderer.backend.extensions;e.has(r)&&(e.get(r),t=!0)}wv[e]=t}return t}isFlipY(){return!0}enableHardwareClipping(e){this.enableExtension("GL_ANGLE_clip_cull_distance","require"),this.builtins.vertex.push(`out float gl_ClipDistance[ ${e} ]`)}registerTransform(e,t){this.transforms.push({varyingName:e,attributeNode:t})}getTransforms(){const e=this.transforms;let t="";for(let r=0;r0&&(r+="\n"),r+=`\t// flow -> ${n}\n\t`),r+=`${s.code}\n\t`,e===i&&"compute"!==t&&(r+="// result\n\t","vertex"===t?(r+="gl_Position = ",r+=`${s.result};`):"fragment"===t&&(e.outputNode.isOutputStructNode||(r+="fragColor = ",r+=`${s.result};`)))}const n=e[t];n.extensions=this.getExtensions(t),n.uniforms=this.getUniforms(t),n.attributes=this.getAttributes(t),n.varyings=this.getVaryings(t),n.vars=this.getVars(t),n.structs=this.getStructs(t),n.codes=this.getCodes(t),n.transforms=this.getTransforms(t),n.flow=r}null!==this.material?(this.vertexShader=this._getGLSLVertexCode(e.vertex),this.fragmentShader=this._getGLSLFragmentCode(e.fragment)):this.computeShader=this._getGLSLVertexCode(e.compute)}getUniformFromNode(e,t,r,s=null){const i=super.getUniformFromNode(e,t,r,s),n=this.getDataFromNode(e,r,this.globalCache);let a=n.uniformGPU;if(void 0===a){const s=e.groupNode,o=s.name,u=this.getBindGroupArray(o,r);if("texture"===t)a=new _v(i.name,i.node,s),u.push(a);else if("cubeTexture"===t)a=new vv(i.name,i.node,s),u.push(a);else if("texture3D"===t)a=new Nv(i.name,i.node,s),u.push(a);else if("buffer"===t){e.name=`NodeBuffer_${e.id}`,i.name=`buffer${e.id}`;const t=new mv(e,s);t.name=e.name,u.push(t),a=t}else{const e=this.uniformGroups[r]||(this.uniformGroups[r]={});let n=e[o];void 0===n&&(n=new xv(r+"_"+o,s),e[o]=n,u.push(n)),a=this.getNodeUniform(i,t),n.addUniform(a)}n.uniformGPU=a}return i}}let Cv=null,Mv=null;class Pv{constructor(e={}){this.parameters=Object.assign({},e),this.data=new WeakMap,this.renderer=null,this.domElement=null,this.timestampQueryPool={render:null,compute:null},this.trackTimestamp=!0===e.trackTimestamp}async init(e){this.renderer=e}get coordinateSystem(){}beginRender(){}finishRender(){}beginCompute(){}finishCompute(){}draw(){}compute(){}createProgram(){}destroyProgram(){}createBindings(){}updateBindings(){}updateBinding(){}createRenderPipeline(){}createComputePipeline(){}needsRenderUpdate(){}getRenderCacheKey(){}createNodeBuilder(){}createSampler(){}destroySampler(){}createDefaultTexture(){}createTexture(){}updateTexture(){}generateMipmaps(){}destroyTexture(){}async copyTextureToBuffer(){}copyTextureToTexture(){}copyFramebufferToTexture(){}createAttribute(){}createIndexAttribute(){}createStorageAttribute(){}updateAttribute(){}destroyAttribute(){}getContext(){}updateSize(){}updateViewport(){}isOccluded(){}async resolveTimestampsAsync(e="render"){if(!this.trackTimestamp)return void ht("WebGPURenderer: Timestamp tracking is disabled.");const t=this.timestampQueryPool[e];if(!t)return void ht(`WebGPURenderer: No timestamp query pool for type '${e}' found.`);const r=await t.resolveQueriesAsync();return this.renderer.info[e].timestamp=r,r}async waitForGPU(){}async getArrayBufferAsync(){}async hasFeatureAsync(){}hasFeature(){}getMaxAnisotropy(){}getDrawingBufferSize(){return Cv=Cv||new t,this.renderer.getDrawingBufferSize(Cv)}setScissorTest(){}getClearColor(){const e=this.renderer;return Mv=Mv||new mf,e.getClearColor(Mv),Mv.getRGB(Mv),Mv}getDomElement(){let e=this.domElement;return null===e&&(e=void 0!==this.parameters.canvas?this.parameters.canvas:pt(),"setAttribute"in e&&e.setAttribute("data-engine",`three.js r${$e} webgpu`),this.domElement=e),e}set(e,t){this.data.set(e,t)}get(e){let t=this.data.get(e);return void 0===t&&(t={},this.data.set(e,t)),t}has(e){return this.data.has(e)}delete(e){this.data.delete(e)}dispose(){}}let Lv,Fv,Bv=0;class Iv{constructor(e,t){this.buffers=[e.bufferGPU,t],this.type=e.type,this.bufferType=e.bufferType,this.pbo=e.pbo,this.byteLength=e.byteLength,this.bytesPerElement=e.BYTES_PER_ELEMENT,this.version=e.version,this.isInteger=e.isInteger,this.activeBufferIndex=0,this.baseId=e.id}get id(){return`${this.baseId}|${this.activeBufferIndex}`}get bufferGPU(){return this.buffers[this.activeBufferIndex]}get transformBuffer(){return this.buffers[1^this.activeBufferIndex]}switchBuffers(){this.activeBufferIndex^=1}}class Dv{constructor(e){this.backend=e}createAttribute(e,t){const r=this.backend,{gl:s}=r,i=e.array,n=e.usage||s.STATIC_DRAW,a=e.isInterleavedBufferAttribute?e.data:e,o=r.get(a);let u,l=o.bufferGPU;if(void 0===l&&(l=this._createBuffer(s,t,i,n),o.bufferGPU=l,o.bufferType=t,o.version=a.version),i instanceof Float32Array)u=s.FLOAT;else if(i instanceof Uint16Array)u=e.isFloat16BufferAttribute?s.HALF_FLOAT:s.UNSIGNED_SHORT;else if(i instanceof Int16Array)u=s.SHORT;else if(i instanceof Uint32Array)u=s.UNSIGNED_INT;else if(i instanceof Int32Array)u=s.INT;else if(i instanceof Int8Array)u=s.BYTE;else if(i instanceof Uint8Array)u=s.UNSIGNED_BYTE;else{if(!(i instanceof Uint8ClampedArray))throw new Error("THREE.WebGLBackend: Unsupported buffer data format: "+i);u=s.UNSIGNED_BYTE}let d={bufferGPU:l,bufferType:t,type:u,byteLength:i.byteLength,bytesPerElement:i.BYTES_PER_ELEMENT,version:e.version,pbo:e.pbo,isInteger:u===s.INT||u===s.UNSIGNED_INT||e.gpuType===T,id:Bv++};if(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute){const e=this._createBuffer(s,t,i,n);d=new Iv(d,e)}r.set(e,d)}updateAttribute(e){const t=this.backend,{gl:r}=t,s=e.array,i=e.isInterleavedBufferAttribute?e.data:e,n=t.get(i),a=n.bufferType,o=e.isInterleavedBufferAttribute?e.data.updateRanges:e.updateRanges;if(r.bindBuffer(a,n.bufferGPU),0===o.length)r.bufferSubData(a,0,s);else{for(let e=0,t=o.length;e1?this.enable(s.SAMPLE_ALPHA_TO_COVERAGE):this.disable(s.SAMPLE_ALPHA_TO_COVERAGE),r>0&&this.currentClippingPlanes!==r){const e=12288;for(let t=0;t<8;t++)t{!function i(){const n=e.clientWaitSync(t,e.SYNC_FLUSH_COMMANDS_BIT,0);if(n===e.WAIT_FAILED)return e.deleteSync(t),void s();n!==e.TIMEOUT_EXPIRED?(e.deleteSync(t),r()):requestAnimationFrame(i)}()}))}}let Ov,Gv,kv,zv=!1;class $v{constructor(e){this.backend=e,this.gl=e.gl,this.extensions=e.extensions,this.defaultTextures={},!1===zv&&(this._init(),zv=!0)}_init(){const e=this.gl;Ov={[Sr]:e.REPEAT,[Nr]:e.CLAMP_TO_EDGE,[vr]:e.MIRRORED_REPEAT},Gv={[_]:e.NEAREST,[Er]:e.NEAREST_MIPMAP_NEAREST,[ke]:e.NEAREST_MIPMAP_LINEAR,[q]:e.LINEAR,[Ge]:e.LINEAR_MIPMAP_NEAREST,[B]:e.LINEAR_MIPMAP_LINEAR},kv={[Lr]:e.NEVER,[Pr]:e.ALWAYS,[Ie]:e.LESS,[Mr]:e.LEQUAL,[Cr]:e.EQUAL,[Rr]:e.GEQUAL,[Ar]:e.GREATER,[wr]:e.NOTEQUAL}}getGLTextureType(e){const{gl:t}=this;let r;return r=!0===e.isCubeTexture?t.TEXTURE_CUBE_MAP:!0===e.isDataArrayTexture||!0===e.isCompressedArrayTexture?t.TEXTURE_2D_ARRAY:!0===e.isData3DTexture?t.TEXTURE_3D:t.TEXTURE_2D,r}getInternalFormat(e,t,r,s,i=!1){const{gl:n,extensions:a}=this;if(null!==e){if(void 0!==n[e])return n[e];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+e+"'")}let o=t;return t===n.RED&&(r===n.FLOAT&&(o=n.R32F),r===n.HALF_FLOAT&&(o=n.R16F),r===n.UNSIGNED_BYTE&&(o=n.R8),r===n.UNSIGNED_SHORT&&(o=n.R16),r===n.UNSIGNED_INT&&(o=n.R32UI),r===n.BYTE&&(o=n.R8I),r===n.SHORT&&(o=n.R16I),r===n.INT&&(o=n.R32I)),t===n.RED_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.R8UI),r===n.UNSIGNED_SHORT&&(o=n.R16UI),r===n.UNSIGNED_INT&&(o=n.R32UI),r===n.BYTE&&(o=n.R8I),r===n.SHORT&&(o=n.R16I),r===n.INT&&(o=n.R32I)),t===n.RG&&(r===n.FLOAT&&(o=n.RG32F),r===n.HALF_FLOAT&&(o=n.RG16F),r===n.UNSIGNED_BYTE&&(o=n.RG8),r===n.UNSIGNED_SHORT&&(o=n.RG16),r===n.UNSIGNED_INT&&(o=n.RG32UI),r===n.BYTE&&(o=n.RG8I),r===n.SHORT&&(o=n.RG16I),r===n.INT&&(o=n.RG32I)),t===n.RG_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RG8UI),r===n.UNSIGNED_SHORT&&(o=n.RG16UI),r===n.UNSIGNED_INT&&(o=n.RG32UI),r===n.BYTE&&(o=n.RG8I),r===n.SHORT&&(o=n.RG16I),r===n.INT&&(o=n.RG32I)),t===n.RGB&&(r===n.FLOAT&&(o=n.RGB32F),r===n.HALF_FLOAT&&(o=n.RGB16F),r===n.UNSIGNED_BYTE&&(o=n.RGB8),r===n.UNSIGNED_SHORT&&(o=n.RGB16),r===n.UNSIGNED_INT&&(o=n.RGB32UI),r===n.BYTE&&(o=n.RGB8I),r===n.SHORT&&(o=n.RGB16I),r===n.INT&&(o=n.RGB32I),r===n.UNSIGNED_BYTE&&(o=s===z&&!1===i?n.SRGB8:n.RGB8),r===n.UNSIGNED_SHORT_5_6_5&&(o=n.RGB565),r===n.UNSIGNED_SHORT_5_5_5_1&&(o=n.RGB5_A1),r===n.UNSIGNED_SHORT_4_4_4_4&&(o=n.RGB4),r===n.UNSIGNED_INT_5_9_9_9_REV&&(o=n.RGB9_E5)),t===n.RGB_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RGB8UI),r===n.UNSIGNED_SHORT&&(o=n.RGB16UI),r===n.UNSIGNED_INT&&(o=n.RGB32UI),r===n.BYTE&&(o=n.RGB8I),r===n.SHORT&&(o=n.RGB16I),r===n.INT&&(o=n.RGB32I)),t===n.RGBA&&(r===n.FLOAT&&(o=n.RGBA32F),r===n.HALF_FLOAT&&(o=n.RGBA16F),r===n.UNSIGNED_BYTE&&(o=n.RGBA8),r===n.UNSIGNED_SHORT&&(o=n.RGBA16),r===n.UNSIGNED_INT&&(o=n.RGBA32UI),r===n.BYTE&&(o=n.RGBA8I),r===n.SHORT&&(o=n.RGBA16I),r===n.INT&&(o=n.RGBA32I),r===n.UNSIGNED_BYTE&&(o=s===z&&!1===i?n.SRGB8_ALPHA8:n.RGBA8),r===n.UNSIGNED_SHORT_4_4_4_4&&(o=n.RGBA4),r===n.UNSIGNED_SHORT_5_5_5_1&&(o=n.RGB5_A1)),t===n.RGBA_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RGBA8UI),r===n.UNSIGNED_SHORT&&(o=n.RGBA16UI),r===n.UNSIGNED_INT&&(o=n.RGBA32UI),r===n.BYTE&&(o=n.RGBA8I),r===n.SHORT&&(o=n.RGBA16I),r===n.INT&&(o=n.RGBA32I)),t===n.DEPTH_COMPONENT&&(r===n.UNSIGNED_SHORT&&(o=n.DEPTH_COMPONENT16),r===n.UNSIGNED_INT&&(o=n.DEPTH_COMPONENT24),r===n.FLOAT&&(o=n.DEPTH_COMPONENT32F)),t===n.DEPTH_STENCIL&&r===n.UNSIGNED_INT_24_8&&(o=n.DEPTH24_STENCIL8),o!==n.R16F&&o!==n.R32F&&o!==n.RG16F&&o!==n.RG32F&&o!==n.RGBA16F&&o!==n.RGBA32F||a.get("EXT_color_buffer_float"),o}setTextureParameters(e,t){const{gl:r,extensions:s,backend:i}=this;r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,t.flipY),r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,t.premultiplyAlpha),r.pixelStorei(r.UNPACK_ALIGNMENT,t.unpackAlignment),r.pixelStorei(r.UNPACK_COLORSPACE_CONVERSION_WEBGL,r.NONE),r.texParameteri(e,r.TEXTURE_WRAP_S,Ov[t.wrapS]),r.texParameteri(e,r.TEXTURE_WRAP_T,Ov[t.wrapT]),e!==r.TEXTURE_3D&&e!==r.TEXTURE_2D_ARRAY||r.texParameteri(e,r.TEXTURE_WRAP_R,Ov[t.wrapR]),r.texParameteri(e,r.TEXTURE_MAG_FILTER,Gv[t.magFilter]);const n=void 0!==t.mipmaps&&t.mipmaps.length>0,a=t.minFilter===q&&n?B:t.minFilter;if(r.texParameteri(e,r.TEXTURE_MIN_FILTER,Gv[a]),t.compareFunction&&(r.texParameteri(e,r.TEXTURE_COMPARE_MODE,r.COMPARE_REF_TO_TEXTURE),r.texParameteri(e,r.TEXTURE_COMPARE_FUNC,kv[t.compareFunction])),!0===s.has("EXT_texture_filter_anisotropic")){if(t.magFilter===_)return;if(t.minFilter!==ke&&t.minFilter!==B)return;if(t.type===L&&!1===s.has("OES_texture_float_linear"))return;if(t.anisotropy>1){const n=s.get("EXT_texture_filter_anisotropic");r.texParameterf(e,n.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(t.anisotropy,i.getMaxAnisotropy()))}}}createDefaultTexture(e){const{gl:t,backend:r,defaultTextures:s}=this,i=this.getGLTextureType(e);let n=s[i];void 0===n&&(n=t.createTexture(),r.state.bindTexture(i,n),t.texParameteri(i,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(i,t.TEXTURE_MAG_FILTER,t.NEAREST),s[i]=n),r.set(e,{textureGPU:n,glTextureType:i,isDefault:!0})}createTexture(e,t){const{gl:r,backend:s}=this,{levels:i,width:n,height:a,depth:o}=t,u=s.utils.convert(e.format,e.colorSpace),l=s.utils.convert(e.type),d=this.getInternalFormat(e.internalFormat,u,l,e.colorSpace,e.isVideoTexture),c=r.createTexture(),h=this.getGLTextureType(e);s.state.bindTexture(h,c),this.setTextureParameters(h,e),e.isDataArrayTexture||e.isCompressedArrayTexture?r.texStorage3D(r.TEXTURE_2D_ARRAY,i,d,n,a,o):e.isData3DTexture?r.texStorage3D(r.TEXTURE_3D,i,d,n,a,o):e.isVideoTexture||r.texStorage2D(h,i,d,n,a),s.set(e,{textureGPU:c,glTextureType:h,glFormat:u,glType:l,glInternalFormat:d})}copyBufferToTexture(e,t){const{gl:r,backend:s}=this,{textureGPU:i,glTextureType:n,glFormat:a,glType:o}=s.get(t),{width:u,height:l}=t.source.data;r.bindBuffer(r.PIXEL_UNPACK_BUFFER,e),s.state.bindTexture(n,i),r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,!1),r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1),r.texSubImage2D(n,0,0,0,u,l,a,o,0),r.bindBuffer(r.PIXEL_UNPACK_BUFFER,null),s.state.unbindTexture()}updateTexture(e,t){const{gl:r}=this,{width:s,height:i}=t,{textureGPU:n,glTextureType:a,glFormat:o,glType:u,glInternalFormat:l}=this.backend.get(e);if(e.isRenderTargetTexture||void 0===n)return;const d=e=>e.isDataTexture?e.image.data:"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap||e instanceof OffscreenCanvas?e:e.data;if(this.backend.state.bindTexture(a,n),this.setTextureParameters(a,e),e.isCompressedTexture){const s=e.mipmaps,i=t.image;for(let t=0;t0,c=t.renderTarget?t.renderTarget.height:this.backend.getDrawingBufferSize().y;if(d){const r=0!==a||0!==o;let d,h;if(!0===e.isDepthTexture?(d=s.DEPTH_BUFFER_BIT,h=s.DEPTH_ATTACHMENT,t.stencil&&(d|=s.STENCIL_BUFFER_BIT)):(d=s.COLOR_BUFFER_BIT,h=s.COLOR_ATTACHMENT0),r){const e=this.backend.get(t.renderTarget),r=e.framebuffers[t.getCacheKey()],h=e.msaaFrameBuffer;i.bindFramebuffer(s.DRAW_FRAMEBUFFER,r),i.bindFramebuffer(s.READ_FRAMEBUFFER,h);const p=c-o-l;s.blitFramebuffer(a,p,a+u,p+l,a,p,a+u,p+l,d,s.NEAREST),i.bindFramebuffer(s.READ_FRAMEBUFFER,r),i.bindTexture(s.TEXTURE_2D,n),s.copyTexSubImage2D(s.TEXTURE_2D,0,0,0,a,p,u,l),i.unbindTexture()}else{const e=s.createFramebuffer();i.bindFramebuffer(s.DRAW_FRAMEBUFFER,e),s.framebufferTexture2D(s.DRAW_FRAMEBUFFER,h,s.TEXTURE_2D,n,0),s.blitFramebuffer(0,0,u,l,0,0,u,l,d,s.NEAREST),s.deleteFramebuffer(e)}}else i.bindTexture(s.TEXTURE_2D,n),s.copyTexSubImage2D(s.TEXTURE_2D,0,0,0,a,c-l-o,u,l),i.unbindTexture();e.generateMipmaps&&this.generateMipmaps(e),this.backend._setFramebuffer(t)}setupRenderBufferStorage(e,t,r,s=!1){const{gl:i}=this,n=t.renderTarget,{depthTexture:a,depthBuffer:o,stencilBuffer:u,width:l,height:d}=n;if(i.bindRenderbuffer(i.RENDERBUFFER,e),o&&!u){let t=i.DEPTH_COMPONENT24;if(!0===s){this.extensions.get("WEBGL_multisampled_render_to_texture").renderbufferStorageMultisampleEXT(i.RENDERBUFFER,n.samples,t,l,d)}else r>0?(a&&a.isDepthTexture&&a.type===i.FLOAT&&(t=i.DEPTH_COMPONENT32F),i.renderbufferStorageMultisample(i.RENDERBUFFER,r,t,l,d)):i.renderbufferStorage(i.RENDERBUFFER,t,l,d);i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_ATTACHMENT,i.RENDERBUFFER,e)}else o&&u&&(r>0?i.renderbufferStorageMultisample(i.RENDERBUFFER,r,i.DEPTH24_STENCIL8,l,d):i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_STENCIL,l,d),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_STENCIL_ATTACHMENT,i.RENDERBUFFER,e))}async copyTextureToBuffer(e,t,r,s,i,n){const{backend:a,gl:o}=this,{textureGPU:u,glFormat:l,glType:d}=this.backend.get(e),c=o.createFramebuffer();o.bindFramebuffer(o.READ_FRAMEBUFFER,c);const h=e.isCubeTexture?o.TEXTURE_CUBE_MAP_POSITIVE_X+n:o.TEXTURE_2D;o.framebufferTexture2D(o.READ_FRAMEBUFFER,o.COLOR_ATTACHMENT0,h,u,0);const p=this._getTypedArrayType(d),g=s*i*this._getBytesPerTexel(d,l),m=o.createBuffer();o.bindBuffer(o.PIXEL_PACK_BUFFER,m),o.bufferData(o.PIXEL_PACK_BUFFER,g,o.STREAM_READ),o.readPixels(t,r,s,i,l,d,0),o.bindBuffer(o.PIXEL_PACK_BUFFER,null),await a.utils._clientWaitAsync();const f=new p(g/p.BYTES_PER_ELEMENT);return o.bindBuffer(o.PIXEL_PACK_BUFFER,m),o.getBufferSubData(o.PIXEL_PACK_BUFFER,0,f),o.bindBuffer(o.PIXEL_PACK_BUFFER,null),o.deleteFramebuffer(c),f}_getTypedArrayType(e){const{gl:t}=this;if(e===t.UNSIGNED_BYTE)return Uint8Array;if(e===t.UNSIGNED_SHORT_4_4_4_4)return Uint16Array;if(e===t.UNSIGNED_SHORT_5_5_5_1)return Uint16Array;if(e===t.UNSIGNED_SHORT_5_6_5)return Uint16Array;if(e===t.UNSIGNED_SHORT)return Uint16Array;if(e===t.UNSIGNED_INT)return Uint32Array;if(e===t.HALF_FLOAT)return Uint16Array;if(e===t.FLOAT)return Float32Array;throw new Error(`Unsupported WebGL type: ${e}`)}_getBytesPerTexel(e,t){const{gl:r}=this;let s=0;return e===r.UNSIGNED_BYTE&&(s=1),e!==r.UNSIGNED_SHORT_4_4_4_4&&e!==r.UNSIGNED_SHORT_5_5_5_1&&e!==r.UNSIGNED_SHORT_5_6_5&&e!==r.UNSIGNED_SHORT&&e!==r.HALF_FLOAT||(s=2),e!==r.UNSIGNED_INT&&e!==r.FLOAT||(s=4),t===r.RGBA?4*s:t===r.RGB?3*s:t===r.ALPHA?s:void 0}}class Hv{constructor(e){this.backend=e,this.gl=this.backend.gl,this.availableExtensions=this.gl.getSupportedExtensions(),this.extensions={}}get(e){let t=this.extensions[e];return void 0===t&&(t=this.gl.getExtension(e),this.extensions[e]=t),t}has(e){return this.availableExtensions.includes(e)}}class Wv{constructor(e){this.backend=e,this.maxAnisotropy=null}getMaxAnisotropy(){if(null!==this.maxAnisotropy)return this.maxAnisotropy;const e=this.backend.gl,t=this.backend.extensions;if(!0===t.has("EXT_texture_filter_anisotropic")){const r=t.get("EXT_texture_filter_anisotropic");this.maxAnisotropy=e.getParameter(r.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else this.maxAnisotropy=0;return this.maxAnisotropy}}const jv={WEBGL_multi_draw:"WEBGL_multi_draw",WEBGL_compressed_texture_astc:"texture-compression-astc",WEBGL_compressed_texture_etc:"texture-compression-etc2",WEBGL_compressed_texture_etc1:"texture-compression-etc1",WEBGL_compressed_texture_pvrtc:"texture-compression-pvrtc",WEBKIT_WEBGL_compressed_texture_pvrtc:"texture-compression-pvrtc",WEBGL_compressed_texture_s3tc:"texture-compression-bc",EXT_texture_compression_bptc:"texture-compression-bptc",EXT_disjoint_timer_query_webgl2:"timestamp-query"};class qv{constructor(e){this.gl=e.gl,this.extensions=e.extensions,this.info=e.renderer.info,this.mode=null,this.index=0,this.type=null,this.object=null}render(e,t){const{gl:r,mode:s,object:i,type:n,info:a,index:o}=this;0!==o?r.drawElements(s,t,n,e):r.drawArrays(s,e,t),a.update(i,t,1)}renderInstances(e,t,r){const{gl:s,mode:i,type:n,index:a,object:o,info:u}=this;0!==r&&(0!==a?s.drawElementsInstanced(i,t,n,e,r):s.drawArraysInstanced(i,e,t,r),u.update(o,t,r))}renderMultiDraw(e,t,r){const{extensions:s,mode:i,object:n,info:a}=this;if(0===r)return;const o=s.get("WEBGL_multi_draw");if(null===o)for(let s=0;sthis.maxQueries)return ht(`WebGPUTimestampQueryPool [${this.type}]: Maximum number of queries exceeded, when using trackTimestamp it is necessary to resolves the queries via renderer.resolveTimestampsAsync( THREE.TimestampQuery.${this.type.toUpperCase()} ).`),null;const t=this.currentQueryIndex;return this.currentQueryIndex+=2,this.queryStates.set(t,"inactive"),this.queryOffsets.set(e.id,t),t}beginQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e.id);if(null==t)return;if(null!==this.activeQuery)return;const r=this.queries[t];if(r)try{"inactive"===this.queryStates.get(t)&&(this.gl.beginQuery(this.ext.TIME_ELAPSED_EXT,r),this.activeQuery=t,this.queryStates.set(t,"started"))}catch(e){console.error("Error in beginQuery:",e),this.activeQuery=null,this.queryStates.set(t,"inactive")}}endQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e.id);if(null!=t&&this.activeQuery===t)try{this.gl.endQuery(this.ext.TIME_ELAPSED_EXT),this.queryStates.set(t,"ended"),this.activeQuery=null}catch(e){console.error("Error in endQuery:",e),this.queryStates.set(t,"inactive"),this.activeQuery=null}}async resolveQueriesAsync(){if(!this.trackTimestamp||this.pendingResolve)return this.lastValue;this.pendingResolve=!0;try{const e=[];for(const[t,r]of this.queryStates)if("ended"===r){const r=this.queries[t];e.push(this.resolveQuery(r))}if(0===e.length)return this.lastValue;const t=(await Promise.all(e)).reduce(((e,t)=>e+t),0);return this.lastValue=t,this.currentQueryIndex=0,this.queryOffsets.clear(),this.queryStates.clear(),this.activeQuery=null,t}catch(e){return console.error("Error resolving queries:",e),this.lastValue}finally{this.pendingResolve=!1}}async resolveQuery(e){return new Promise((t=>{if(this.isDisposed)return void t(this.lastValue);let r,s=!1;const i=e=>{s||(s=!0,r&&(clearTimeout(r),r=null),t(e))},n=()=>{if(this.isDisposed)i(this.lastValue);else try{if(this.gl.getParameter(this.ext.GPU_DISJOINT_EXT))return void i(this.lastValue);if(!this.gl.getQueryParameter(e,this.gl.QUERY_RESULT_AVAILABLE))return void(r=setTimeout(n,1));const s=this.gl.getQueryParameter(e,this.gl.QUERY_RESULT);t(Number(s)/1e6)}catch(e){console.error("Error checking query:",e),t(this.lastValue)}};n()}))}dispose(){if(!this.isDisposed&&(this.isDisposed=!0,this.trackTimestamp)){for(const e of this.queries)this.gl.deleteQuery(e);this.queries=[],this.queryStates.clear(),this.queryOffsets.clear(),this.lastValue=0,this.activeQuery=null}}}class Yv extends Pv{constructor(e={}){super(e),this.isWebGLBackend=!0,this.attributeUtils=null,this.extensions=null,this.capabilities=null,this.textureUtils=null,this.bufferRenderer=null,this.gl=null,this.state=null,this.utils=null,this.vaoCache={},this.transformFeedbackCache={},this.discard=!1,this.disjoint=null,this.parallel=null,this._currentContext=null,this._knownBindings=new WeakSet,this._supportsInvalidateFramebuffer="undefined"!=typeof navigator&&/OculusBrowser/g.test(navigator.userAgent),this._xrFramebuffer=null}init(e){super.init(e);const t=this.parameters,r={antialias:e.samples>0,alpha:!0,depth:e.depth,stencil:e.stencil},s=void 0!==t.context?t.context:e.domElement.getContext("webgl2",r);function i(t){t.preventDefault();const r={api:"WebGL",message:t.statusMessage||"Unknown reason",reason:null,originalEvent:t};e.onDeviceLost(r)}this._onContextLost=i,e.domElement.addEventListener("webglcontextlost",i,!1),this.gl=s,this.extensions=new Hv(this),this.capabilities=new Wv(this),this.attributeUtils=new Dv(this),this.textureUtils=new $v(this),this.bufferRenderer=new qv(this),this.state=new Vv(this),this.utils=new Uv(this),this.extensions.get("EXT_color_buffer_float"),this.extensions.get("WEBGL_clip_cull_distance"),this.extensions.get("OES_texture_float_linear"),this.extensions.get("EXT_color_buffer_half_float"),this.extensions.get("WEBGL_multisampled_render_to_texture"),this.extensions.get("WEBGL_render_shared_exponent"),this.extensions.get("WEBGL_multi_draw"),this.disjoint=this.extensions.get("EXT_disjoint_timer_query_webgl2"),this.parallel=this.extensions.get("KHR_parallel_shader_compile")}get coordinateSystem(){return l}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}async waitForGPU(){await this.utils._clientWaitAsync()}async makeXRCompatible(){!0!==this.gl.getContextAttributes().xrCompatible&&await this.gl.makeXRCompatible()}setXRTarget(e){this._xrFramebuffer=e}setXRRenderTargetTextures(e,t,r=null){const s=this.gl;if(this.set(e.texture,{textureGPU:t,glInternalFormat:s.RGBA8}),null!==r){const t=e.stencilBuffer?s.DEPTH24_STENCIL8:s.DEPTH_COMPONENT24;this.set(e.depthTexture,{textureGPU:r,glInternalFormat:t}),!0===this.extensions.has("WEBGL_multisampled_render_to_texture")&&e.autoAllocateDepthBuffer&&console.warn("THREE.WebGLBackend: Render-to-texture extension was disabled because an external texture was provided"),e.autoAllocateDepthBuffer=!1}}initTimestampQuery(e){if(!this.disjoint||!this.trackTimestamp)return;const t=e.isComputeNode?"compute":"render";this.timestampQueryPool[t]||(this.timestampQueryPool[t]=new Kv(this.gl,t,2048));const r=this.timestampQueryPool[t];null!==r.allocateQueriesForContext(e)&&r.beginQuery(e)}prepareTimestampBuffer(e){if(!this.disjoint||!this.trackTimestamp)return;const t=e.isComputeNode?"compute":"render";this.timestampQueryPool[t].endQuery(e)}getContext(){return this.gl}beginRender(e){const{state:t,gl:r}=this,s=this.get(e);if(e.viewport?this.updateViewport(e):t.viewport(0,0,r.drawingBufferWidth,r.drawingBufferHeight),e.scissor){const{x:r,y:s,width:i,height:n}=e.scissorValue;t.scissor(r,e.height-n-s,i,n)}this.initTimestampQuery(e),s.previousContext=this._currentContext,this._currentContext=e,this._setFramebuffer(e),this.clear(e.clearColor,e.clearDepth,e.clearStencil,e,!1);const i=e.occlusionQueryCount;i>0&&(s.currentOcclusionQueries=s.occlusionQueries,s.currentOcclusionQueryObjects=s.occlusionQueryObjects,s.lastOcclusionObject=null,s.occlusionQueries=new Array(i),s.occlusionQueryObjects=new Array(i),s.occlusionQueryIndex=0)}finishRender(e){const{gl:t,state:r}=this,s=this.get(e),i=s.previousContext;r.resetVertexState();const n=e.occlusionQueryCount;n>0&&(n>s.occlusionQueryIndex&&t.endQuery(t.ANY_SAMPLES_PASSED),this.resolveOccludedAsync(e));const a=e.textures;if(null!==a)for(let e=0;e0&&!1===this._useMultisampledRTT(e.renderTarget)){const i=s.framebuffers[e.getCacheKey()],n=t.COLOR_BUFFER_BIT,a=s.msaaFrameBuffer,o=e.textures;r.bindFramebuffer(t.READ_FRAMEBUFFER,a),r.bindFramebuffer(t.DRAW_FRAMEBUFFER,i);for(let r=0;r{let a=0;for(let t=0;t{t.isBatchedMesh?null!==t._multiDrawInstances?(ht("THREE.WebGLBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection."),y.renderMultiDrawInstances(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount,t._multiDrawInstances)):this.hasFeature("WEBGL_multi_draw")?y.renderMultiDraw(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount):ht("THREE.WebGLRenderer: WEBGL_multi_draw not supported."):b>1?y.renderInstances(T,x,b):y.render(T,x)};if(e.camera.isArrayCamera&&e.camera.cameras.length>0){const r=this.get(e.camera),s=e.camera.cameras,i=e.getBindingGroup("cameraIndex").bindings[0];if(void 0===r.indexesGPU||r.indexesGPU.length!==s.length){const e=new Uint32Array([0,0,0,0]),t=[];for(let r=0,i=s.length;r{const i=this.parallel,n=()=>{r.getProgramParameter(a,i.COMPLETION_STATUS_KHR)?(this._completeCompile(e,s),t()):requestAnimationFrame(n)};n()}));t.push(i)}else this._completeCompile(e,s)}_handleSource(e,t){const r=e.split("\n"),s=[],i=Math.max(t-6,0),n=Math.min(t+6,r.length);for(let e=i;e":" "} ${i}: ${r[e]}`)}return s.join("\n")}_getShaderErrors(e,t,r){const s=e.getShaderParameter(t,e.COMPILE_STATUS),i=e.getShaderInfoLog(t).trim();if(s&&""===i)return"";const n=/ERROR: 0:(\d+)/.exec(i);if(n){const s=parseInt(n[1]);return r.toUpperCase()+"\n\n"+i+"\n\n"+this._handleSource(e.getShaderSource(t),s)}return i}_logProgramError(e,t,r){if(this.renderer.debug.checkShaderErrors){const s=this.gl,i=s.getProgramInfoLog(e).trim();if(!1===s.getProgramParameter(e,s.LINK_STATUS))if("function"==typeof this.renderer.debug.onShaderError)this.renderer.debug.onShaderError(s,e,r,t);else{const n=this._getShaderErrors(s,r,"vertex"),a=this._getShaderErrors(s,t,"fragment");console.error("THREE.WebGLProgram: Shader Error "+s.getError()+" - VALIDATE_STATUS "+s.getProgramParameter(e,s.VALIDATE_STATUS)+"\n\nProgram Info Log: "+i+"\n"+n+"\n"+a)}else""!==i&&console.warn("THREE.WebGLProgram: Program Info Log:",i)}}_completeCompile(e,t){const{state:r,gl:s}=this,i=this.get(t),{programGPU:n,fragmentShader:a,vertexShader:o}=i;!1===s.getProgramParameter(n,s.LINK_STATUS)&&this._logProgramError(n,a,o),r.useProgram(n);const u=e.getBindings();this._setupBindings(u,n),this.set(t,{programGPU:n})}createComputePipeline(e,t){const{state:r,gl:s}=this,i={stage:"fragment",code:"#version 300 es\nprecision highp float;\nvoid main() {}"};this.createProgram(i);const{computeProgram:n}=e,a=s.createProgram(),o=this.get(i).shaderGPU,u=this.get(n).shaderGPU,l=n.transforms,d=[],c=[];for(let e=0;ejv[t]===e)),r=this.extensions;for(let e=0;e0&&!1===y){if(void 0===g){const s=[];g=t.createFramebuffer(),r.bindFramebuffer(t.FRAMEBUFFER,g);const i=[],l=e.textures;for(let r=0;r0&&!0===this.extensions.has("WEBGL_multisampled_render_to_texture")&&!1!==e.autoAllocateDepthBuffer}dispose(){const e=this.extensions.get("WEBGL_lose_context");e&&e.loseContext(),this.renderer.domElement.removeEventListener("webglcontextlost",this._onContextLost)}}const Qv="point-list",Zv="line-list",Jv="line-strip",eN="triangle-list",tN="triangle-strip",rN="never",sN="less",iN="equal",nN="less-equal",aN="greater",oN="not-equal",uN="greater-equal",lN="always",dN="store",cN="load",hN="clear",pN="ccw",gN="none",mN="front",fN="back",yN="uint16",xN="uint32",bN="r8unorm",TN="r8snorm",_N="r8uint",vN="r8sint",NN="r16uint",SN="r16sint",EN="r16float",wN="rg8unorm",AN="rg8snorm",RN="rg8uint",CN="rg8sint",MN="r32uint",PN="r32sint",LN="r32float",FN="rg16uint",BN="rg16sint",IN="rg16float",DN="rgba8unorm",VN="rgba8unorm-srgb",UN="rgba8snorm",ON="rgba8uint",GN="rgba8sint",kN="bgra8unorm",zN="bgra8unorm-srgb",$N="rgb9e5ufloat",HN="rgb10a2unorm",WN="rgb10a2unorm",jN="rg32uint",qN="rg32sint",XN="rg32float",KN="rgba16uint",YN="rgba16sint",QN="rgba16float",ZN="rgba32uint",JN="rgba32sint",eS="rgba32float",tS="depth16unorm",rS="depth24plus",sS="depth24plus-stencil8",iS="depth32float",nS="depth32float-stencil8",aS="bc1-rgba-unorm",oS="bc1-rgba-unorm-srgb",uS="bc2-rgba-unorm",lS="bc2-rgba-unorm-srgb",dS="bc3-rgba-unorm",cS="bc3-rgba-unorm-srgb",hS="bc4-r-unorm",pS="bc4-r-snorm",gS="bc5-rg-unorm",mS="bc5-rg-snorm",fS="bc6h-rgb-ufloat",yS="bc6h-rgb-float",xS="bc7-rgba-unorm",bS="bc7-rgba-srgb",TS="etc2-rgb8unorm",_S="etc2-rgb8unorm-srgb",vS="etc2-rgb8a1unorm",NS="etc2-rgb8a1unorm-srgb",SS="etc2-rgba8unorm",ES="etc2-rgba8unorm-srgb",wS="eac-r11unorm",AS="eac-r11snorm",RS="eac-rg11unorm",CS="eac-rg11snorm",MS="astc-4x4-unorm",PS="astc-4x4-unorm-srgb",LS="astc-5x4-unorm",FS="astc-5x4-unorm-srgb",BS="astc-5x5-unorm",IS="astc-5x5-unorm-srgb",DS="astc-6x5-unorm",VS="astc-6x5-unorm-srgb",US="astc-6x6-unorm",OS="astc-6x6-unorm-srgb",GS="astc-8x5-unorm",kS="astc-8x5-unorm-srgb",zS="astc-8x6-unorm",$S="astc-8x6-unorm-srgb",HS="astc-8x8-unorm",WS="astc-8x8-unorm-srgb",jS="astc-10x5-unorm",qS="astc-10x5-unorm-srgb",XS="astc-10x6-unorm",KS="astc-10x6-unorm-srgb",YS="astc-10x8-unorm",QS="astc-10x8-unorm-srgb",ZS="astc-10x10-unorm",JS="astc-10x10-unorm-srgb",eE="astc-12x10-unorm",tE="astc-12x10-unorm-srgb",rE="astc-12x12-unorm",sE="astc-12x12-unorm-srgb",iE="clamp-to-edge",nE="repeat",aE="mirror-repeat",oE="linear",uE="nearest",lE="zero",dE="one",cE="src",hE="one-minus-src",pE="src-alpha",gE="one-minus-src-alpha",mE="dst",fE="one-minus-dst",yE="dst-alpha",xE="one-minus-dst-alpha",bE="src-alpha-saturated",TE="constant",_E="one-minus-constant",vE="add",NE="subtract",SE="reverse-subtract",EE="min",wE="max",AE=0,RE=15,CE="keep",ME="zero",PE="replace",LE="invert",FE="increment-clamp",BE="decrement-clamp",IE="increment-wrap",DE="decrement-wrap",VE="storage",UE="read-only-storage",OE="write-only",GE="read-only",kE="read-write",zE="float",$E="unfilterable-float",HE="depth",WE="sint",jE="uint",qE="2d",XE="3d",KE="2d",YE="2d-array",QE="cube",ZE="3d",JE="all",ew="vertex",tw="instance",rw={DepthClipControl:"depth-clip-control",Depth32FloatStencil8:"depth32float-stencil8",TextureCompressionBC:"texture-compression-bc",TextureCompressionETC2:"texture-compression-etc2",TextureCompressionASTC:"texture-compression-astc",TimestampQuery:"timestamp-query",IndirectFirstInstance:"indirect-first-instance",ShaderF16:"shader-f16",RG11B10UFloat:"rg11b10ufloat-renderable",BGRA8UNormStorage:"bgra8unorm-storage",Float32Filterable:"float32-filterable",ClipDistances:"clip-distances",DualSourceBlending:"dual-source-blending",Subgroups:"subgroups"};class sw extends cv{constructor(e,t){super(e),this.texture=t,this.version=t?t.version:0,this.isSampler=!0}}class iw extends sw{constructor(e,t,r){super(e,t?t.value:null),this.textureNode=t,this.groupNode=r}update(){this.texture=this.textureNode.value}}class nw extends hv{constructor(e,t){super(e,t?t.array:null),this.attribute=t,this.isStorageBuffer=!0}}let aw=0;class ow extends nw{constructor(e,t){super("StorageBuffer_"+aw++,e?e.value:null),this.nodeUniform=e,this.access=e?e.access:Vs.READ_WRITE,this.groupNode=t}get buffer(){return this.nodeUniform.value}}class uw extends Im{constructor(e){super(),this.device=e;this.mipmapSampler=e.createSampler({minFilter:oE}),this.flipYSampler=e.createSampler({minFilter:uE}),this.transferPipelines={},this.flipYPipelines={},this.mipmapVertexShaderModule=e.createShaderModule({label:"mipmapVertex",code:"\nstruct VarysStruct {\n\t@builtin( position ) Position: vec4,\n\t@location( 0 ) vTex : vec2\n};\n\n@vertex\nfn main( @builtin( vertex_index ) vertexIndex : u32 ) -> VarysStruct {\n\n\tvar Varys : VarysStruct;\n\n\tvar pos = array< vec2, 4 >(\n\t\tvec2( -1.0, 1.0 ),\n\t\tvec2( 1.0, 1.0 ),\n\t\tvec2( -1.0, -1.0 ),\n\t\tvec2( 1.0, -1.0 )\n\t);\n\n\tvar tex = array< vec2, 4 >(\n\t\tvec2( 0.0, 0.0 ),\n\t\tvec2( 1.0, 0.0 ),\n\t\tvec2( 0.0, 1.0 ),\n\t\tvec2( 1.0, 1.0 )\n\t);\n\n\tVarys.vTex = tex[ vertexIndex ];\n\tVarys.Position = vec4( pos[ vertexIndex ], 0.0, 1.0 );\n\n\treturn Varys;\n\n}\n"}),this.mipmapFragmentShaderModule=e.createShaderModule({label:"mipmapFragment",code:"\n@group( 0 ) @binding( 0 )\nvar imgSampler : sampler;\n\n@group( 0 ) @binding( 1 )\nvar img : texture_2d;\n\n@fragment\nfn main( @location( 0 ) vTex : vec2 ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( img, imgSampler, vTex );\n\n}\n"}),this.flipYFragmentShaderModule=e.createShaderModule({label:"flipYFragment",code:"\n@group( 0 ) @binding( 0 )\nvar imgSampler : sampler;\n\n@group( 0 ) @binding( 1 )\nvar img : texture_2d;\n\n@fragment\nfn main( @location( 0 ) vTex : vec2 ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( img, imgSampler, vec2( vTex.x, 1.0 - vTex.y ) );\n\n}\n"})}getTransferPipeline(e){let t=this.transferPipelines[e];return void 0===t&&(t=this.device.createRenderPipeline({label:`mipmap-${e}`,vertex:{module:this.mipmapVertexShaderModule,entryPoint:"main"},fragment:{module:this.mipmapFragmentShaderModule,entryPoint:"main",targets:[{format:e}]},primitive:{topology:tN,stripIndexFormat:xN},layout:"auto"}),this.transferPipelines[e]=t),t}getFlipYPipeline(e){let t=this.flipYPipelines[e];return void 0===t&&(t=this.device.createRenderPipeline({label:`flipY-${e}`,vertex:{module:this.mipmapVertexShaderModule,entryPoint:"main"},fragment:{module:this.flipYFragmentShaderModule,entryPoint:"main",targets:[{format:e}]},primitive:{topology:tN,stripIndexFormat:xN},layout:"auto"}),this.flipYPipelines[e]=t),t}flipY(e,t,r=0){const s=t.format,{width:i,height:n}=t.size,a=this.getTransferPipeline(s),o=this.getFlipYPipeline(s),u=this.device.createTexture({size:{width:i,height:n,depthOrArrayLayers:1},format:s,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING}),l=e.createView({baseMipLevel:0,mipLevelCount:1,dimension:KE,baseArrayLayer:r}),d=u.createView({baseMipLevel:0,mipLevelCount:1,dimension:KE,baseArrayLayer:0}),c=this.device.createCommandEncoder({}),h=(e,t,r)=>{const s=e.getBindGroupLayout(0),i=this.device.createBindGroup({layout:s,entries:[{binding:0,resource:this.flipYSampler},{binding:1,resource:t}]}),n=c.beginRenderPass({colorAttachments:[{view:r,loadOp:hN,storeOp:dN,clearValue:[0,0,0,0]}]});n.setPipeline(e),n.setBindGroup(0,i),n.draw(4,1,0,0),n.end()};h(a,l,d),h(o,d,l),this.device.queue.submit([c.finish()]),u.destroy()}generateMipmaps(e,t,r=0){const s=this.get(e);void 0===s.useCount&&(s.useCount=0,s.layers=[]);const i=s.layers[r]||this._mipmapCreateBundles(e,t,r),n=this.device.createCommandEncoder({});this._mipmapRunBundles(n,i),this.device.queue.submit([n.finish()]),0!==s.useCount&&(s.layers[r]=i),s.useCount++}_mipmapCreateBundles(e,t,r){const s=this.getTransferPipeline(t.format),i=s.getBindGroupLayout(0);let n=e.createView({baseMipLevel:0,mipLevelCount:1,dimension:KE,baseArrayLayer:r});const a=[];for(let o=1;o1;for(let a=0;a]*\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/i,gw=/([a-z_0-9]+)\s*:\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/gi,mw={f32:"float",i32:"int",u32:"uint",bool:"bool","vec2":"vec2","vec2":"ivec2","vec2":"uvec2","vec2":"bvec2",vec2f:"vec2",vec2i:"ivec2",vec2u:"uvec2",vec2b:"bvec2","vec3":"vec3","vec3":"ivec3","vec3":"uvec3","vec3":"bvec3",vec3f:"vec3",vec3i:"ivec3",vec3u:"uvec3",vec3b:"bvec3","vec4":"vec4","vec4":"ivec4","vec4":"uvec4","vec4":"bvec4",vec4f:"vec4",vec4i:"ivec4",vec4u:"uvec4",vec4b:"bvec4","mat2x2":"mat2",mat2x2f:"mat2","mat3x3":"mat3",mat3x3f:"mat3","mat4x4":"mat4",mat4x4f:"mat4",sampler:"sampler",texture_1d:"texture",texture_2d:"texture",texture_2d_array:"texture",texture_multisampled_2d:"cubeTexture",texture_depth_2d:"depthTexture",texture_depth_multisampled_2d:"depthTexture",texture_3d:"texture3D",texture_cube:"cubeTexture",texture_cube_array:"cubeTexture",texture_storage_1d:"storageTexture",texture_storage_2d:"storageTexture",texture_storage_2d_array:"storageTexture",texture_storage_3d:"storageTexture"};class fw extends C_{constructor(e){const{type:t,inputs:r,name:s,inputsCode:i,blockCode:n,outputType:a}=(e=>{const t=(e=e.trim()).match(pw);if(null!==t&&4===t.length){const r=t[2],s=[];let i=null;for(;null!==(i=gw.exec(r));)s.push({name:i[1],type:i[2]});const n=[];for(let e=0;e "+this.outputType:"";return`fn ${e} ( ${this.inputsCode.trim()} ) ${t}`+this.blockCode}}class yw extends R_{parseFunction(e){return new fw(e)}}const xw="undefined"!=typeof self?self.GPUShaderStage:{VERTEX:1,FRAGMENT:2,COMPUTE:4},bw={[Vs.READ_ONLY]:"read",[Vs.WRITE_ONLY]:"write",[Vs.READ_WRITE]:"read_write"},Tw={[Sr]:"repeat",[Nr]:"clamp",[vr]:"mirror"},_w={vertex:xw?xw.VERTEX:1,fragment:xw?xw.FRAGMENT:2,compute:xw?xw.COMPUTE:4},vw={instance:!0,swizzleAssign:!1,storageBuffer:!0},Nw={"^^":"tsl_xor"},Sw={float:"f32",int:"i32",uint:"u32",bool:"bool",color:"vec3",vec2:"vec2",ivec2:"vec2",uvec2:"vec2",bvec2:"vec2",vec3:"vec3",ivec3:"vec3",uvec3:"vec3",bvec3:"vec3",vec4:"vec4",ivec4:"vec4",uvec4:"vec4",bvec4:"vec4",mat2:"mat2x2",mat3:"mat3x3",mat4:"mat4x4"},Ew={},ww={tsl_xor:new px("fn tsl_xor( a : bool, b : bool ) -> bool { return ( a || b ) && !( a && b ); }"),mod_float:new px("fn tsl_mod_float( x : f32, y : f32 ) -> f32 { return x - y * floor( x / y ); }"),mod_vec2:new px("fn tsl_mod_vec2( x : vec2f, y : vec2f ) -> vec2f { return x - y * floor( x / y ); }"),mod_vec3:new px("fn tsl_mod_vec3( x : vec3f, y : vec3f ) -> vec3f { return x - y * floor( x / y ); }"),mod_vec4:new px("fn tsl_mod_vec4( x : vec4f, y : vec4f ) -> vec4f { return x - y * floor( x / y ); }"),equals_bool:new px("fn tsl_equals_bool( a : bool, b : bool ) -> bool { return a == b; }"),equals_bvec2:new px("fn tsl_equals_bvec2( a : vec2f, b : vec2f ) -> vec2 { return vec2( a.x == b.x, a.y == b.y ); }"),equals_bvec3:new px("fn tsl_equals_bvec3( a : vec3f, b : vec3f ) -> vec3 { return vec3( a.x == b.x, a.y == b.y, a.z == b.z ); }"),equals_bvec4:new px("fn tsl_equals_bvec4( a : vec4f, b : vec4f ) -> vec4 { return vec4( a.x == b.x, a.y == b.y, a.z == b.z, a.w == b.w ); }"),repeatWrapping_float:new px("fn tsl_repeatWrapping_float( coord: f32 ) -> f32 { return fract( coord ); }"),mirrorWrapping_float:new px("fn tsl_mirrorWrapping_float( coord: f32 ) -> f32 { let mirrored = fract( coord * 0.5 ) * 2.0; return 1.0 - abs( 1.0 - mirrored ); }"),clampWrapping_float:new px("fn tsl_clampWrapping_float( coord: f32 ) -> f32 { return clamp( coord, 0.0, 1.0 ); }"),biquadraticTexture:new px("\nfn tsl_biquadraticTexture( map : texture_2d, coord : vec2f, iRes : vec2u, level : u32 ) -> vec4f {\n\n\tlet res = vec2f( iRes );\n\n\tlet uvScaled = coord * res;\n\tlet uvWrapping = ( ( uvScaled % res ) + res ) % res;\n\n\t// https://www.shadertoy.com/view/WtyXRy\n\n\tlet uv = uvWrapping - 0.5;\n\tlet iuv = floor( uv );\n\tlet f = fract( uv );\n\n\tlet rg1 = textureLoad( map, vec2u( iuv + vec2( 0.5, 0.5 ) ) % iRes, level );\n\tlet rg2 = textureLoad( map, vec2u( iuv + vec2( 1.5, 0.5 ) ) % iRes, level );\n\tlet rg3 = textureLoad( map, vec2u( iuv + vec2( 0.5, 1.5 ) ) % iRes, level );\n\tlet rg4 = textureLoad( map, vec2u( iuv + vec2( 1.5, 1.5 ) ) % iRes, level );\n\n\treturn mix( mix( rg1, rg2, f.x ), mix( rg3, rg4, f.x ), f.y );\n\n}\n")},Aw={dFdx:"dpdx",dFdy:"- dpdy",mod_float:"tsl_mod_float",mod_vec2:"tsl_mod_vec2",mod_vec3:"tsl_mod_vec3",mod_vec4:"tsl_mod_vec4",equals_bool:"tsl_equals_bool",equals_bvec2:"tsl_equals_bvec2",equals_bvec3:"tsl_equals_bvec3",equals_bvec4:"tsl_equals_bvec4",inversesqrt:"inverseSqrt",bitcast:"bitcast"};"undefined"!=typeof navigator&&/Windows/g.test(navigator.userAgent)&&(ww.pow_float=new px("fn tsl_pow_float( a : f32, b : f32 ) -> f32 { return select( -pow( -a, b ), pow( a, b ), a > 0.0 ); }"),ww.pow_vec2=new px("fn tsl_pow_vec2( a : vec2f, b : vec2f ) -> vec2f { return vec2f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ) ); }",[ww.pow_float]),ww.pow_vec3=new px("fn tsl_pow_vec3( a : vec3f, b : vec3f ) -> vec3f { return vec3f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ), tsl_pow_float( a.z, b.z ) ); }",[ww.pow_float]),ww.pow_vec4=new px("fn tsl_pow_vec4( a : vec4f, b : vec4f ) -> vec4f { return vec4f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ), tsl_pow_float( a.z, b.z ), tsl_pow_float( a.w, b.w ) ); }",[ww.pow_float]),Aw.pow_float="tsl_pow_float",Aw.pow_vec2="tsl_pow_vec2",Aw.pow_vec3="tsl_pow_vec3",Aw.pow_vec4="tsl_pow_vec4");let Rw="";!0!==("undefined"!=typeof navigator&&/Firefox|Deno/g.test(navigator.userAgent))&&(Rw+="diagnostic( off, derivative_uniformity );\n");class Cw extends m_{constructor(e,t){super(e,t,new yw),this.uniformGroups={},this.builtins={},this.directives={},this.scopedArrays=new Map}needsToWorkingColorSpace(e){return!0===e.isVideoTexture&&e.colorSpace!==x}_generateTextureSample(e,t,r,s,i=this.shaderStage){return"fragment"===i?s?`textureSample( ${t}, ${t}_sampler, ${r}, ${s} )`:`textureSample( ${t}, ${t}_sampler, ${r} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r):this.generateTextureLod(e,t,r,s,"0")}_generateVideoSample(e,t,r=this.shaderStage){if("fragment"===r)return`textureSampleBaseClampToEdge( ${e}, ${e}_sampler, vec2( ${t}.x, 1.0 - ${t}.y ) )`;console.error(`WebGPURenderer: THREE.VideoTexture does not support ${r} shader.`)}_generateTextureSampleLevel(e,t,r,s,i,n=this.shaderStage){return"fragment"!==n&&"compute"!==n||!1!==this.isUnfilterable(e)?this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,s):this.generateTextureLod(e,t,r,i,s):`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`}generateWrapFunction(e){const t=`tsl_coord_${Tw[e.wrapS]}S_${Tw[e.wrapT]}_${e.isData3DTexture?"3d":"2d"}T`;let r=Ew[t];if(void 0===r){const s=[],i=e.isData3DTexture?"vec3f":"vec2f";let n=`fn ${t}( coord : ${i} ) -> ${i} {\n\n\treturn ${i}(\n`;const a=(e,t)=>{e===Sr?(s.push(ww.repeatWrapping_float),n+=`\t\ttsl_repeatWrapping_float( coord.${t} )`):e===Nr?(s.push(ww.clampWrapping_float),n+=`\t\ttsl_clampWrapping_float( coord.${t} )`):e===vr?(s.push(ww.mirrorWrapping_float),n+=`\t\ttsl_mirrorWrapping_float( coord.${t} )`):(n+=`\t\tcoord.${t}`,console.warn(`WebGPURenderer: Unsupported texture wrap type "${e}" for vertex shader.`))};a(e.wrapS,"x"),n+=",\n",a(e.wrapT,"y"),e.isData3DTexture&&(n+=",\n",a(e.wrapR,"z")),n+="\n\t);\n\n}\n",Ew[t]=r=new px(n,s)}return r.build(this),t}generateArrayDeclaration(e,t){return`array< ${this.getType(e)}, ${t} >`}generateTextureDimension(e,t,r){const s=this.getDataFromNode(e,this.shaderStage,this.globalCache);void 0===s.dimensionsSnippet&&(s.dimensionsSnippet={});let i=s.dimensionsSnippet[r];if(void 0===s.dimensionsSnippet[r]){let n,a;const{primarySamples:o}=this.renderer.backend.utils.getTextureSampleData(e),u=o>1;a=e.isData3DTexture?"vec3":"vec2",n=u||e.isVideoTexture||e.isStorageTexture?t:`${t}${r?`, u32( ${r} )`:""}`,i=new Wo(new Cu(`textureDimensions( ${n} )`,a)),s.dimensionsSnippet[r]=i,(e.isDataArrayTexture||e.isData3DTexture)&&(s.arrayLayerCount=new Wo(new Cu(`textureNumLayers(${t})`,"u32"))),e.isTextureCube&&(s.cubeFaceCount=new Wo(new Cu("6u","u32")))}return i.build(this)}generateFilteredTexture(e,t,r,s="0u"){this._include("biquadraticTexture");return`tsl_biquadraticTexture( ${t}, ${this.generateWrapFunction(e)}( ${r} ), ${this.generateTextureDimension(e,t,s)}, u32( ${s} ) )`}generateTextureLod(e,t,r,s,i="0u"){const n=this.generateWrapFunction(e),a=this.generateTextureDimension(e,t,i),o=e.isData3DTexture?"vec3":"vec2",u=`${o}(${n}(${r}) * ${o}(${a}))`;return this.generateTextureLoad(e,t,u,s,i)}generateTextureLoad(e,t,r,s,i="0u"){return!0===e.isVideoTexture||!0===e.isStorageTexture?`textureLoad( ${t}, ${r} )`:s?`textureLoad( ${t}, ${r}, ${s}, u32( ${i} ) )`:`textureLoad( ${t}, ${r}, u32( ${i} ) )`}generateTextureStore(e,t,r,s){return`textureStore( ${t}, ${r}, ${s} )`}isSampleCompare(e){return!0===e.isDepthTexture&&null!==e.compareFunction}isUnfilterable(e){return"float"!==this.getComponentTypeFromTexture(e)||!this.isAvailable("float32Filterable")&&!0===e.isDataTexture&&e.type===L||!1===this.isSampleCompare(e)&&e.minFilter===_&&e.magFilter===_||this.renderer.backend.utils.getTextureSampleData(e).primarySamples>1}generateTexture(e,t,r,s,i=this.shaderStage){let n=null;return n=!0===e.isVideoTexture?this._generateVideoSample(t,r,i):this.isUnfilterable(e)?this.generateTextureLod(e,t,r,s,"0",i):this._generateTextureSample(e,t,r,s,i),n}generateTextureGrad(e,t,r,s,i,n=this.shaderStage){if("fragment"===n)return`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${s[0]}, ${s[1]} )`;console.error(`WebGPURenderer: THREE.TextureNode.gradient() does not support ${n} shader.`)}generateTextureCompare(e,t,r,s,i,n=this.shaderStage){if("fragment"===n)return`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${s} )`;console.error(`WebGPURenderer: THREE.DepthTexture.compareFunction() does not support ${n} shader.`)}generateTextureLevel(e,t,r,s,i,n=this.shaderStage){let a=null;return a=!0===e.isVideoTexture?this._generateVideoSample(t,r,n):this._generateTextureSampleLevel(e,t,r,s,i,n),a}generateTextureBias(e,t,r,s,i,n=this.shaderStage){if("fragment"===n)return`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${s} )`;console.error(`WebGPURenderer: THREE.TextureNode.biasNode does not support ${n} shader.`)}getPropertyName(e,t=this.shaderStage){if(!0===e.isNodeVarying&&!0===e.needsInterpolation){if("vertex"===t)return`varyings.${e.name}`}else if(!0===e.isNodeUniform){const t=e.name,r=e.type;return"texture"===r||"cubeTexture"===r||"storageTexture"===r||"texture3D"===r?t:"buffer"===r||"storageBuffer"===r||"indirectStorageBuffer"===r?this.isCustomStruct(e)?t:t+".value":e.groupNode.name+"."+t}return super.getPropertyName(e)}getOutputStructName(){return"output"}getFunctionOperator(e){const t=Nw[e];return void 0!==t?(this._include(t),t):null}getNodeAccess(e,t){return"compute"!==t?Vs.READ_ONLY:e.access}getStorageAccess(e,t){return bw[this.getNodeAccess(e,t)]}getUniformFromNode(e,t,r,s=null){const i=super.getUniformFromNode(e,t,r,s),n=this.getDataFromNode(e,r,this.globalCache);if(void 0===n.uniformGPU){let a;const o=e.groupNode,u=o.name,l=this.getBindGroupArray(u,r);if("texture"===t||"cubeTexture"===t||"storageTexture"===t||"texture3D"===t){let s=null;const n=this.getNodeAccess(e,r);if("texture"===t||"storageTexture"===t?s=new _v(i.name,i.node,o,n):"cubeTexture"===t?s=new vv(i.name,i.node,o,n):"texture3D"===t&&(s=new Nv(i.name,i.node,o,n)),s.store=!0===e.isStorageTextureNode,s.setVisibility(_w[r]),"fragment"!==r&&"compute"!==r||!1!==this.isUnfilterable(e.value)||!1!==s.store)l.push(s),a=[s];else{const e=new iw(`${i.name}_sampler`,i.node,o);e.setVisibility(_w[r]),l.push(e,s),a=[e,s]}}else if("buffer"===t||"storageBuffer"===t||"indirectStorageBuffer"===t){const n=new("buffer"===t?mv:ow)(e,o);n.setVisibility(_w[r]),l.push(n),a=n,i.name=s||"NodeBuffer_"+i.id}else{const e=this.uniformGroups[r]||(this.uniformGroups[r]={});let s=e[u];void 0===s&&(s=new xv(u,o),s.setVisibility(_w[r]),e[u]=s,l.push(s)),a=this.getNodeUniform(i,t),s.addUniform(a)}n.uniformGPU=a}return i}getBuiltin(e,t,r,s=this.shaderStage){const i=this.builtins[s]||(this.builtins[s]=new Map);return!1===i.has(e)&&i.set(e,{name:e,property:t,type:r}),t}hasBuiltin(e,t=this.shaderStage){return void 0!==this.builtins[t]&&this.builtins[t].has(e)}getVertexIndex(){return"vertex"===this.shaderStage?this.getBuiltin("vertex_index","vertexIndex","u32","attribute"):"vertexIndex"}buildFunctionCode(e){const t=e.layout,r=this.flowShaderNode(e),s=[];for(const e of t.inputs)s.push(e.name+" : "+this.getType(e.type));let i=`fn ${t.name}( ${s.join(", ")} ) -> ${this.getType(t.type)} {\n${r.vars}\n${r.code}\n`;return r.result&&(i+=`\treturn ${r.result};\n`),i+="\n}\n",i}getInstanceIndex(){return"vertex"===this.shaderStage?this.getBuiltin("instance_index","instanceIndex","u32","attribute"):"instanceIndex"}getInvocationLocalIndex(){return this.getBuiltin("local_invocation_index","invocationLocalIndex","u32","attribute")}getSubgroupSize(){return this.enableSubGroups(),this.getBuiltin("subgroup_size","subgroupSize","u32","attribute")}getInvocationSubgroupIndex(){return this.enableSubGroups(),this.getBuiltin("subgroup_invocation_id","invocationSubgroupIndex","u32","attribute")}getSubgroupIndex(){return this.enableSubGroups(),this.getBuiltin("subgroup_id","subgroupIndex","u32","attribute")}getDrawIndex(){return null}getFrontFacing(){return this.getBuiltin("front_facing","isFront","bool")}getFragCoord(){return this.getBuiltin("position","fragCoord","vec4")+".xy"}getFragDepth(){return"output."+this.getBuiltin("frag_depth","depth","f32","output")}getClipDistance(){return"varyings.hw_clip_distances"}isFlipY(){return!1}enableDirective(e,t=this.shaderStage){(this.directives[t]||(this.directives[t]=new Set)).add(e)}getDirectives(e){const t=[],r=this.directives[e];if(void 0!==r)for(const e of r)t.push(`enable ${e};`);return t.join("\n")}enableSubGroups(){this.enableDirective("subgroups")}enableSubgroupsF16(){this.enableDirective("subgroups-f16")}enableClipDistances(){this.enableDirective("clip_distances")}enableShaderF16(){this.enableDirective("f16")}enableDualSourceBlending(){this.enableDirective("dual_source_blending")}enableHardwareClipping(e){this.enableClipDistances(),this.getBuiltin("clip_distances","hw_clip_distances",`array`,"vertex")}getBuiltins(e){const t=[],r=this.builtins[e];if(void 0!==r)for(const{name:e,property:s,type:i}of r.values())t.push(`@builtin( ${e} ) ${s} : ${i}`);return t.join(",\n\t")}getScopedArray(e,t,r,s){return!1===this.scopedArrays.has(e)&&this.scopedArrays.set(e,{name:e,scope:t,bufferType:r,bufferCount:s}),e}getScopedArrays(e){if("compute"!==e)return;const t=[];for(const{name:e,scope:r,bufferType:s,bufferCount:i}of this.scopedArrays.values()){const n=this.getType(s);t.push(`var<${r}> ${e}: array< ${n}, ${i} >;`)}return t.join("\n")}getAttributes(e){const t=[];if("compute"===e&&(this.getBuiltin("global_invocation_id","globalId","vec3","attribute"),this.getBuiltin("workgroup_id","workgroupId","vec3","attribute"),this.getBuiltin("local_invocation_id","localId","vec3","attribute"),this.getBuiltin("num_workgroups","numWorkgroups","vec3","attribute"),this.renderer.hasFeature("subgroups")&&(this.enableDirective("subgroups",e),this.getBuiltin("subgroup_size","subgroupSize","u32","attribute"))),"vertex"===e||"compute"===e){const e=this.getBuiltins("attribute");e&&t.push(e);const r=this.getAttributesArray();for(let e=0,s=r.length;e"),t.push(`\t${s+r.name} : ${i}`)}return e.output&&t.push(`\t${this.getBuiltins("output")}`),t.join(",\n")}getStructs(e){let t="";const r=this.structs[e];if(r.length>0){const e=[];for(const t of r){let r=`struct ${t.name} {\n`;r+=this.getStructMembers(t),r+="\n};",e.push(r)}t="\n"+e.join("\n\n")+"\n"}return t}getVar(e,t,r=null){let s=`var ${t} : `;return s+=null!==r?this.generateArrayDeclaration(e,r):this.getType(e),s}getVars(e){const t=[],r=this.vars[e];if(void 0!==r)for(const e of r)t.push(`\t${this.getVar(e.type,e.name,e.count)};`);return`\n${t.join("\n")}\n`}getVaryings(e){const t=[];if("vertex"===e&&this.getBuiltin("position","Vertex","vec4","vertex"),"vertex"===e||"fragment"===e){const r=this.varyings,s=this.vars[e];for(let i=0;i1&&(n="_multisampled"),!0===t.isCubeTexture)s="texture_cube";else if(!0===t.isDataArrayTexture||!0===t.isCompressedArrayTexture)s="texture_2d_array";else if(!0===t.isDepthTexture)s=`texture_depth${n}_2d`;else if(!0===t.isVideoTexture)s="texture_external";else if(!0===t.isData3DTexture)s="texture_3d";else if(!0===i.node.isStorageTextureNode){s=`texture_storage_2d<${hw(t)}, ${this.getStorageAccess(i.node,e)}>`}else{s=`texture${n}_2d<${this.getComponentTypeFromTexture(t).charAt(0)}32>`}r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name} : ${s};`)}else if("buffer"===i.type||"storageBuffer"===i.type||"indirectStorageBuffer"===i.type){const t=i.node,r=this.getType(t.getNodeType(this)),n=t.bufferCount,o=n>0&&"buffer"===i.type?", "+n:"",u=t.isStorageBufferNode?`storage, ${this.getStorageAccess(t,e)}`:"uniform";if(this.isCustomStruct(i))s.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var<${u}> ${i.name} : ${r};`);else{const e=`\tvalue : array< ${t.isAtomic?`atomic<${r}>`:`${r}`}${o} >`;s.push(this._getWGSLStructBinding(i.name,e,u,a.binding++,a.group))}}else{const e=this.getType(this.getVectorType(i.type)),t=i.groupNode.name;(n[t]||(n[t]={index:a.binding++,id:a.group,snippets:[]})).snippets.push(`\t${i.name} : ${e}`)}}for(const e in n){const t=n[e];i.push(this._getWGSLStructBinding(e,t.snippets.join(",\n"),"uniform",t.index,t.id))}let a=r.join("\n");return a+=s.join("\n"),a+=i.join("\n"),a}buildCode(){const e=null!==this.material?{fragment:{},vertex:{}}:{compute:{}};this.sortBindingGroups();for(const t in e){this.shaderStage=t;const r=e[t];r.uniforms=this.getUniforms(t),r.attributes=this.getAttributes(t),r.varyings=this.getVaryings(t),r.structs=this.getStructs(t),r.vars=this.getVars(t),r.codes=this.getCodes(t),r.directives=this.getDirectives(t),r.scopedArrays=this.getScopedArrays(t);let s="// code\n\n";s+=this.flowCode[t];const i=this.flowNodes[t],n=i[i.length-1],a=n.outputNode,o=void 0!==a&&!0===a.isOutputStructNode;for(const e of i){const i=this.getFlowData(e),u=e.name;if(u&&(s.length>0&&(s+="\n"),s+=`\t// flow -> ${u}\n`),s+=`${i.code}\n\t`,e===n&&"compute"!==t)if(s+="// result\n\n\t","vertex"===t)s+=`varyings.Vertex = ${i.result};`;else if("fragment"===t)if(o)r.returnType=a.getNodeType(this),r.structs+="var output : "+r.returnType+";",s+=`return ${i.result};`;else{let e="\t@location(0) color: vec4";const t=this.getBuiltins("output");t&&(e+=",\n\t"+t),r.returnType="OutputStruct",r.structs+=this._getWGSLStruct("OutputStruct",e),r.structs+="\nvar output : OutputStruct;",s+=`output.color = ${i.result};\n\n\treturn output;`}}r.flow=s}this.shaderStage=null,null!==this.material?(this.vertexShader=this._getWGSLVertexCode(e.vertex),this.fragmentShader=this._getWGSLFragmentCode(e.fragment)):this.computeShader=this._getWGSLComputeCode(e.compute,(this.object.workgroupSize||[64]).join(", "))}getMethod(e,t=null){let r;return null!==t&&(r=this._getWGSLMethod(e+"_"+t)),void 0===r&&(r=this._getWGSLMethod(e)),r||e}getType(e){return Sw[e]||e}isAvailable(e){let t=vw[e];return void 0===t&&("float32Filterable"===e?t=this.renderer.hasFeature("float32-filterable"):"clipDistance"===e&&(t=this.renderer.hasFeature("clip-distances")),vw[e]=t),t}_getWGSLMethod(e){return void 0!==ww[e]&&this._include(e),Aw[e]}_include(e){const t=ww[e];return t.build(this),null!==this.currentFunctionNode&&this.currentFunctionNode.includes.push(t),t}_getWGSLVertexCode(e){return`${this.getSignature()}\n// directives\n${e.directives}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\n\n// varyings\n${e.varyings}\nvar varyings : VaryingsStruct;\n\n// codes\n${e.codes}\n\n@vertex\nfn main( ${e.attributes} ) -> VaryingsStruct {\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n\treturn varyings;\n\n}\n`}_getWGSLFragmentCode(e){return`${this.getSignature()}\n// global\n${Rw}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\n\n// codes\n${e.codes}\n\n@fragment\nfn main( ${e.varyings} ) -> ${e.returnType} {\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n}\n`}_getWGSLComputeCode(e,t){return`${this.getSignature()}\n// directives\n${e.directives}\n\n// system\nvar instanceIndex : u32;\n\n// locals\n${e.scopedArrays}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\n\n// codes\n${e.codes}\n\n@compute @workgroup_size( ${t} )\nfn main( ${e.attributes} ) {\n\n\t// system\n\tinstanceIndex = globalId.x + globalId.y * numWorkgroups.x * u32(${t}) + globalId.z * numWorkgroups.x * numWorkgroups.y * u32(${t});\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n}\n`}_getWGSLStruct(e,t){return`\nstruct ${e} {\n${t}\n};`}_getWGSLStructBinding(e,t,r,s=0,i=0){const n=e+"Struct";return`${this._getWGSLStruct(n,t)}\n@binding( ${s} ) @group( ${i} )\nvar<${r}> ${e} : ${n};`}}class Mw{constructor(e){this.backend=e}getCurrentDepthStencilFormat(e){let t;return null!==e.depthTexture?t=this.getTextureFormatGPU(e.depthTexture):e.depth&&e.stencil?t=sS:e.depth&&(t=rS),t}getTextureFormatGPU(e){return this.backend.get(e).format}getTextureSampleData(e){let t;if(e.isFramebufferTexture)t=1;else if(e.isDepthTexture&&!e.renderTarget){const e=this.backend.renderer,r=e.getRenderTarget();t=r?r.samples:e.samples}else e.renderTarget&&(t=e.renderTarget.samples);t=t||1;const r=t>1&&null!==e.renderTarget&&!0!==e.isDepthTexture&&!0!==e.isFramebufferTexture;return{samples:t,primarySamples:r?1:t,isMSAA:r}}getCurrentColorFormat(e){let t;return t=null!==e.textures?this.getTextureFormatGPU(e.textures[0]):this.getPreferredCanvasFormat(),t}getCurrentColorSpace(e){return null!==e.textures?e.textures[0].colorSpace:this.backend.renderer.outputColorSpace}getPrimitiveTopology(e,t){return e.isPoints?Qv:e.isLineSegments||e.isMesh&&!0===t.wireframe?Zv:e.isLine?Jv:e.isMesh?eN:void 0}getSampleCount(e){let t=1;return e>1&&(t=Math.pow(2,Math.floor(Math.log2(e))),2===t&&(t=4)),t}getSampleCountRenderContext(e){return null!==e.textures?this.getSampleCount(e.sampleCount):this.getSampleCount(this.backend.renderer.samples)}getPreferredCanvasFormat(){const e=this.backend.parameters.outputType;if(void 0===e)return navigator.gpu.getPreferredCanvasFormat();if(e===Ce)return kN;if(e===he)return QN;throw new Error("Unsupported outputType")}}const Pw=new Map([[Int8Array,["sint8","snorm8"]],[Uint8Array,["uint8","unorm8"]],[Int16Array,["sint16","snorm16"]],[Uint16Array,["uint16","unorm16"]],[Int32Array,["sint32","snorm32"]],[Uint32Array,["uint32","unorm32"]],[Float32Array,["float32"]]]),Lw=new Map([[ze,["float16"]]]),Fw=new Map([[Int32Array,"sint32"],[Int16Array,"sint32"],[Uint32Array,"uint32"],[Uint16Array,"uint32"],[Float32Array,"float32"]]);class Bw{constructor(e){this.backend=e}createAttribute(e,t){const r=this._getBufferAttribute(e),s=this.backend,i=s.get(r);let n=i.buffer;if(void 0===n){const a=s.device;let o=r.array;if(!1===e.normalized)if(o.constructor===Int16Array||o.constructor===Int8Array)o=new Int32Array(o);else if((o.constructor===Uint16Array||o.constructor===Uint8Array)&&(o=new Uint32Array(o),t&GPUBufferUsage.INDEX))for(let e=0;e1&&(s.multisampled=!0,r.texture.isDepthTexture||(s.sampleType=$E)),r.texture.isDepthTexture)s.sampleType=HE;else if(r.texture.isDataTexture||r.texture.isDataArrayTexture||r.texture.isData3DTexture){const e=r.texture.type;e===T?s.sampleType=WE:e===b?s.sampleType=jE:e===L&&(this.backend.hasFeature("float32-filterable")?s.sampleType=zE:s.sampleType=$E)}r.isSampledCubeTexture?s.viewDimension=QE:r.texture.isDataArrayTexture||r.texture.isCompressedArrayTexture?s.viewDimension=YE:r.isSampledTexture3D&&(s.viewDimension=ZE),e.texture=s}else console.error(`WebGPUBindingUtils: Unsupported binding "${r}".`);s.push(e)}return r.createBindGroupLayout({entries:s})}createBindings(e,t,r,s=0){const{backend:i,bindGroupLayoutCache:n}=this,a=i.get(e);let o,u=n.get(e.bindingsReference);void 0===u&&(u=this.createBindingsLayout(e),n.set(e.bindingsReference,u)),r>0&&(void 0===a.groups&&(a.groups=[],a.versions=[]),a.versions[r]===s&&(o=a.groups[r])),void 0===o&&(o=this.createBindGroup(e,u),r>0&&(a.groups[r]=o,a.versions[r]=s)),a.group=o,a.layout=u}updateBinding(e){const t=this.backend,r=t.device,s=e.buffer,i=t.get(e).buffer;r.queue.writeBuffer(i,0,s,0)}createBindGroupIndex(e,t){const r=this.backend.device,s=GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,i=e[0],n=r.createBuffer({label:"bindingCameraIndex_"+i,size:16,usage:s});r.queue.writeBuffer(n,0,e,0);const a=[{binding:0,resource:{buffer:n}}];return r.createBindGroup({label:"bindGroupCameraIndex_"+i,layout:t,entries:a})}createBindGroup(e,t){const r=this.backend,s=r.device;let i=0;const n=[];for(const t of e.bindings){if(t.isUniformBuffer){const e=r.get(t);if(void 0===e.buffer){const r=t.byteLength,i=GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,n=s.createBuffer({label:"bindingBuffer_"+t.name,size:r,usage:i});e.buffer=n}n.push({binding:i,resource:{buffer:e.buffer}})}else if(t.isStorageBuffer){const e=r.get(t);if(void 0===e.buffer){const s=t.attribute;e.buffer=r.get(s).buffer}n.push({binding:i,resource:{buffer:e.buffer}})}else if(t.isSampler){const e=r.get(t.texture);n.push({binding:i,resource:e.sampler})}else if(t.isSampledTexture){const e=r.get(t.texture);let a;if(void 0!==e.externalTexture)a=s.importExternalTexture({source:e.externalTexture});else{const r=t.store?1:e.texture.mipLevelCount,s=`view-${e.texture.width}-${e.texture.height}-${r}`;if(a=e[s],void 0===a){const i=JE;let n;n=t.isSampledCubeTexture?QE:t.isSampledTexture3D?ZE:t.texture.isDataArrayTexture||t.texture.isCompressedArrayTexture?YE:KE,a=e[s]=e.texture.createView({aspect:i,dimension:n,mipLevelCount:r})}}n.push({binding:i,resource:a})}i++}return s.createBindGroup({label:"bindGroup_"+e.name,layout:t,entries:n})}}class Dw{constructor(e){this.backend=e}_getSampleCount(e){return this.backend.utils.getSampleCountRenderContext(e)}createRenderPipeline(e,t){const{object:r,material:s,geometry:i,pipeline:n}=e,{vertexProgram:a,fragmentProgram:o}=n,u=this.backend,l=u.device,d=u.utils,c=u.get(n),h=[];for(const t of e.getBindings()){const e=u.get(t);h.push(e.layout)}const p=u.attributeUtils.createShaderVertexBuffers(e);let g;!0===s.transparent&&s.blending!==G&&(g=this._getBlending(s));let m={};!0===s.stencilWrite&&(m={compare:this._getStencilCompare(s),failOp:this._getStencilOperation(s.stencilFail),depthFailOp:this._getStencilOperation(s.stencilZFail),passOp:this._getStencilOperation(s.stencilZPass)});const f=this._getColorWriteMask(s),y=[];if(null!==e.context.textures){const t=e.context.textures;for(let e=0;e1},layout:l.createPipelineLayout({bindGroupLayouts:h})},E={},w=e.context.depth,A=e.context.stencil;if(!0!==w&&!0!==A||(!0===w&&(E.format=v,E.depthWriteEnabled=s.depthWrite,E.depthCompare=_),!0===A&&(E.stencilFront=m,E.stencilBack={},E.stencilReadMask=s.stencilFuncMask,E.stencilWriteMask=s.stencilWriteMask),!0===s.polygonOffset&&(E.depthBias=s.polygonOffsetUnits,E.depthBiasSlopeScale=s.polygonOffsetFactor,E.depthBiasClamp=0),S.depthStencil=E),null===t)c.pipeline=l.createRenderPipeline(S);else{const e=new Promise((e=>{l.createRenderPipelineAsync(S).then((t=>{c.pipeline=t,e()}))}));t.push(e)}}createBundleEncoder(e){const t=this.backend,{utils:r,device:s}=t,i=r.getCurrentDepthStencilFormat(e),n={label:"renderBundleEncoder",colorFormats:[r.getCurrentColorFormat(e)],depthStencilFormat:i,sampleCount:this._getSampleCount(e)};return s.createRenderBundleEncoder(n)}createComputePipeline(e,t){const r=this.backend,s=r.device,i=r.get(e.computeProgram).module,n=r.get(e),a=[];for(const e of t){const t=r.get(e);a.push(t.layout)}n.pipeline=s.createComputePipeline({compute:i,layout:s.createPipelineLayout({bindGroupLayouts:a})})}_getBlending(e){let t,r;const s=e.blending,i=e.blendSrc,n=e.blendDst,a=e.blendEquation;if(s===qe){const s=null!==e.blendSrcAlpha?e.blendSrcAlpha:i,o=null!==e.blendDstAlpha?e.blendDstAlpha:n,u=null!==e.blendEquationAlpha?e.blendEquationAlpha:a;t={srcFactor:this._getBlendFactor(i),dstFactor:this._getBlendFactor(n),operation:this._getBlendOperation(a)},r={srcFactor:this._getBlendFactor(s),dstFactor:this._getBlendFactor(o),operation:this._getBlendOperation(u)}}else{const i=(e,s,i,n)=>{t={srcFactor:e,dstFactor:s,operation:vE},r={srcFactor:i,dstFactor:n,operation:vE}};if(e.premultipliedAlpha)switch(s){case V:i(dE,gE,dE,gE);break;case Pt:i(dE,dE,dE,dE);break;case Mt:i(lE,hE,lE,dE);break;case Ct:i(lE,cE,lE,pE)}else switch(s){case V:i(pE,gE,dE,gE);break;case Pt:i(pE,dE,pE,dE);break;case Mt:i(lE,hE,lE,dE);break;case Ct:i(lE,cE,lE,cE)}}if(void 0!==t&&void 0!==r)return{color:t,alpha:r};console.error("THREE.WebGPURenderer: Invalid blending: ",s)}_getBlendFactor(e){let t;switch(e){case Ke:t=lE;break;case Et:t=dE;break;case St:t=cE;break;case bt:t=hE;break;case Nt:t=pE;break;case xt:t=gE;break;case _t:t=mE;break;case yt:t=fE;break;case Tt:t=yE;break;case ft:t=xE;break;case vt:t=bE;break;case 211:t=TE;break;case 212:t=_E;break;default:console.error("THREE.WebGPURenderer: Blend factor not supported.",e)}return t}_getStencilCompare(e){let t;const r=e.stencilFunc;switch(r){case Gr:t=rN;break;case Or:t=lN;break;case Ur:t=sN;break;case Vr:t=nN;break;case Dr:t=iN;break;case Ir:t=uN;break;case Br:t=aN;break;case Fr:t=oN;break;default:console.error("THREE.WebGPURenderer: Invalid stencil function.",r)}return t}_getStencilOperation(e){let t;switch(e){case Xr:t=CE;break;case qr:t=ME;break;case jr:t=PE;break;case Wr:t=LE;break;case Hr:t=FE;break;case $r:t=BE;break;case zr:t=IE;break;case kr:t=DE;break;default:console.error("THREE.WebGPURenderer: Invalid stencil operation.",t)}return t}_getBlendOperation(e){let t;switch(e){case Xe:t=vE;break;case mt:t=NE;break;case gt:t=SE;break;case Yr:t=EE;break;case Kr:t=wE;break;default:console.error("THREE.WebGPUPipelineUtils: Blend equation not supported.",e)}return t}_getPrimitiveState(e,t,r){const s={},i=this.backend.utils;switch(s.topology=i.getPrimitiveTopology(e,r),null!==t.index&&!0===e.isLine&&!0!==e.isLineSegments&&(s.stripIndexFormat=t.index.array instanceof Uint16Array?yN:xN),r.side){case je:s.frontFace=pN,s.cullMode=fN;break;case N:s.frontFace=pN,s.cullMode=mN;break;case Se:s.frontFace=pN,s.cullMode=gN;break;default:console.error("THREE.WebGPUPipelineUtils: Unknown material.side value.",r.side)}return s}_getColorWriteMask(e){return!0===e.colorWrite?RE:AE}_getDepthCompare(e){let t;if(!1===e.depthTest)t=lN;else{const r=e.depthFunc;switch(r){case Ot:t=rN;break;case Ut:t=lN;break;case Vt:t=sN;break;case Dt:t=nN;break;case It:t=iN;break;case Bt:t=uN;break;case Ft:t=aN;break;case Lt:t=oN;break;default:console.error("THREE.WebGPUPipelineUtils: Invalid depth function.",r)}}return t}}class Vw extends Xv{constructor(e,t,r=2048){super(r),this.device=e,this.type=t,this.querySet=this.device.createQuerySet({type:"timestamp",count:this.maxQueries,label:`queryset_global_timestamp_${t}`});const s=8*this.maxQueries;this.resolveBuffer=this.device.createBuffer({label:`buffer_timestamp_resolve_${t}`,size:s,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC}),this.resultBuffer=this.device.createBuffer({label:`buffer_timestamp_result_${t}`,size:s,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ})}allocateQueriesForContext(e){if(!this.trackTimestamp||this.isDisposed)return null;if(this.currentQueryIndex+2>this.maxQueries)return ht(`WebGPUTimestampQueryPool [${this.type}]: Maximum number of queries exceeded, when using trackTimestamp it is necessary to resolves the queries via renderer.resolveTimestampsAsync( THREE.TimestampQuery.${this.type.toUpperCase()} ).`),null;const t=this.currentQueryIndex;return this.currentQueryIndex+=2,this.queryOffsets.set(e.id,t),t}async resolveQueriesAsync(){if(!this.trackTimestamp||0===this.currentQueryIndex||this.isDisposed)return this.lastValue;if(this.pendingResolve)return this.pendingResolve;this.pendingResolve=this._resolveQueries();try{return await this.pendingResolve}finally{this.pendingResolve=null}}async _resolveQueries(){if(this.isDisposed)return this.lastValue;try{if("unmapped"!==this.resultBuffer.mapState)return this.lastValue;const e=new Map(this.queryOffsets),t=this.currentQueryIndex,r=8*t;this.currentQueryIndex=0,this.queryOffsets.clear();const s=this.device.createCommandEncoder();s.resolveQuerySet(this.querySet,0,t,this.resolveBuffer,0),s.copyBufferToBuffer(this.resolveBuffer,0,this.resultBuffer,0,r);const i=s.finish();if(this.device.queue.submit([i]),"unmapped"!==this.resultBuffer.mapState)return this.lastValue;if(await this.resultBuffer.mapAsync(GPUMapMode.READ,0,r),this.isDisposed)return"mapped"===this.resultBuffer.mapState&&this.resultBuffer.unmap(),this.lastValue;const n=new BigUint64Array(this.resultBuffer.getMappedRange(0,r));let a=0;for(const[,t]of e){const e=n[t],r=n[t+1];a+=Number(r-e)/1e6}return this.resultBuffer.unmap(),this.lastValue=a,a}catch(e){return console.error("Error resolving queries:",e),"mapped"===this.resultBuffer.mapState&&this.resultBuffer.unmap(),this.lastValue}}async dispose(){if(!this.isDisposed){if(this.isDisposed=!0,this.pendingResolve)try{await this.pendingResolve}catch(e){console.error("Error waiting for pending resolve:",e)}if(this.resultBuffer&&"mapped"===this.resultBuffer.mapState)try{this.resultBuffer.unmap()}catch(e){console.error("Error unmapping buffer:",e)}this.querySet&&(this.querySet.destroy(),this.querySet=null),this.resolveBuffer&&(this.resolveBuffer.destroy(),this.resolveBuffer=null),this.resultBuffer&&(this.resultBuffer.destroy(),this.resultBuffer=null),this.queryOffsets.clear(),this.pendingResolve=null}}}class Uw extends Pv{constructor(e={}){super(e),this.isWebGPUBackend=!0,this.parameters.alpha=void 0===e.alpha||e.alpha,this.parameters.requiredLimits=void 0===e.requiredLimits?{}:e.requiredLimits,this.device=null,this.context=null,this.colorBuffer=null,this.defaultRenderPassdescriptor=null,this.utils=new Mw(this),this.attributeUtils=new Bw(this),this.bindingUtils=new Iw(this),this.pipelineUtils=new Dw(this),this.textureUtils=new cw(this),this.occludedResolveCache=new Map}async init(e){await super.init(e);const t=this.parameters;let r;if(void 0===t.device){const e={powerPreference:t.powerPreference},s="undefined"!=typeof navigator?await navigator.gpu.requestAdapter(e):null;if(null===s)throw new Error("WebGPUBackend: Unable to create WebGPU adapter.");const i=Object.values(rw),n=[];for(const e of i)s.features.has(e)&&n.push(e);const a={requiredFeatures:n,requiredLimits:t.requiredLimits};r=await s.requestDevice(a)}else r=t.device;r.lost.then((t=>{const r={api:"WebGPU",message:t.message||"Unknown reason",reason:t.reason||null,originalEvent:t};e.onDeviceLost(r)}));const s=void 0!==t.context?t.context:e.domElement.getContext("webgpu");this.device=r,this.context=s;const i=t.alpha?"premultiplied":"opaque";this.trackTimestamp=this.trackTimestamp&&this.hasFeature(rw.TimestampQuery),this.context.configure({device:this.device,format:this.utils.getPreferredCanvasFormat(),usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.COPY_SRC,alphaMode:i}),this.updateSize()}get coordinateSystem(){return d}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}getContext(){return this.context}_getDefaultRenderPassDescriptor(){let e=this.defaultRenderPassdescriptor;if(null===e){const t=this.renderer;e={colorAttachments:[{view:null}]},!0!==this.renderer.depth&&!0!==this.renderer.stencil||(e.depthStencilAttachment={view:this.textureUtils.getDepthBuffer(t.depth,t.stencil).createView()});const r=e.colorAttachments[0];this.renderer.samples>0?r.view=this.colorBuffer.createView():r.resolveTarget=void 0,this.defaultRenderPassdescriptor=e}const t=e.colorAttachments[0];return this.renderer.samples>0?t.resolveTarget=this.context.getCurrentTexture().createView():t.view=this.context.getCurrentTexture().createView(),e}_getRenderPassDescriptor(e,t={}){const r=e.renderTarget,s=this.get(r);let i=s.descriptors;if(void 0===i||s.width!==r.width||s.height!==r.height||s.dimensions!==r.dimensions||s.activeMipmapLevel!==e.activeMipmapLevel||s.activeCubeFace!==e.activeCubeFace||s.samples!==r.samples){i={},s.descriptors=i;const e=()=>{r.removeEventListener("dispose",e),this.delete(r)};!1===r.hasEventListener("dispose",e)&&r.addEventListener("dispose",e)}const n=e.getCacheKey();let a=i[n];if(void 0===a){const t=e.textures,o=[];let u;for(let s=0;s0&&(t.currentOcclusionQuerySet&&t.currentOcclusionQuerySet.destroy(),t.currentOcclusionQueryBuffer&&t.currentOcclusionQueryBuffer.destroy(),t.currentOcclusionQuerySet=t.occlusionQuerySet,t.currentOcclusionQueryBuffer=t.occlusionQueryBuffer,t.currentOcclusionQueryObjects=t.occlusionQueryObjects,i=r.createQuerySet({type:"occlusion",count:s,label:`occlusionQuerySet_${e.id}`}),t.occlusionQuerySet=i,t.occlusionQueryIndex=0,t.occlusionQueryObjects=new Array(s),t.lastOcclusionObject=null),n=null===e.textures?this._getDefaultRenderPassDescriptor():this._getRenderPassDescriptor(e,{loadOp:cN}),this.initTimestampQuery(e,n),n.occlusionQuerySet=i;const a=n.depthStencilAttachment;if(null!==e.textures){const t=n.colorAttachments;for(let r=0;r0&&t.currentPass.executeBundles(t.renderBundles),r>t.occlusionQueryIndex&&t.currentPass.endOcclusionQuery(),t.currentPass.end(),r>0){const s=8*r;let i=this.occludedResolveCache.get(s);void 0===i&&(i=this.device.createBuffer({size:s,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC}),this.occludedResolveCache.set(s,i));const n=this.device.createBuffer({size:s,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});t.encoder.resolveQuerySet(t.occlusionQuerySet,0,r,i,0),t.encoder.copyBufferToBuffer(i,0,n,0,s),t.occlusionQueryBuffer=n,this.resolveOccludedAsync(e)}if(this.device.queue.submit([t.encoder.finish()]),null!==e.textures){const t=e.textures;for(let e=0;ea?(u.x=Math.min(t.dispatchCount,a),u.y=Math.ceil(t.dispatchCount/a)):u.x=t.dispatchCount,i.dispatchWorkgroups(u.x,u.y,u.z)}finishCompute(e){const t=this.get(e);t.passEncoderGPU.end(),this.device.queue.submit([t.cmdEncoderGPU.finish()])}async waitForGPU(){await this.device.queue.onSubmittedWorkDone()}draw(e,t){const{object:r,material:s,context:i,pipeline:n}=e,a=e.getBindings(),o=this.get(i),u=this.get(n).pipeline,l=o.currentSets,d=o.currentPass,c=e.getDrawParameters();if(null===c)return;l.pipeline!==u&&(d.setPipeline(u),l.pipeline=u);const h=l.bindingGroups;for(let e=0,t=a.length;e{if(!0===r.isBatchedMesh){const e=r._multiDrawStarts,s=r._multiDrawCounts,i=r._multiDrawCount,n=r._multiDrawInstances;null!==n&&ht("THREE.WebGPUBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.");for(let a=0;a1?0:a;!0===g?d.drawIndexed(s[a],i,e[a]/p.array.BYTES_PER_ELEMENT,0,o):d.draw(s[a],i,e[a],o),t.update(r,s[a],i)}}else if(!0===g){const{vertexCount:s,instanceCount:i,firstVertex:n}=c,a=e.getIndirect();if(null!==a){const e=this.get(a).buffer;d.drawIndexedIndirect(e,0)}else d.drawIndexed(s,i,n,0,0);t.update(r,s,i)}else{const{vertexCount:s,instanceCount:i,firstVertex:n}=c,a=e.getIndirect();if(null!==a){const e=this.get(a).buffer;d.drawIndirect(e,0)}else d.draw(s,i,n,0);t.update(r,s,i)}};if(e.camera.isArrayCamera&&e.camera.cameras.length>0){const t=this.get(e.camera),s=e.camera.cameras,n=e.getBindingGroup("cameraIndex");if(void 0===t.indexesGPU||t.indexesGPU.length!==s.length){const e=this.get(n),r=[],i=new Uint32Array([0,0,0,0]);for(let t=0,n=s.length;t(console.warn("THREE.WebGPURenderer: WebGPU is not available, running under WebGL2 backend."),new Yv(e)));super(new t(e),e),this.library=new Gw,this.isWebGPURenderer=!0}}class zw extends ds{constructor(){super(),this.isBundleGroup=!0,this.type="BundleGroup",this.static=!0,this.version=0}set needsUpdate(e){!0===e&&this.version++}}class $w{constructor(e,t=tn(0,0,1,1)){this.renderer=e,this.outputNode=t,this.outputColorTransform=!0,this.needsUpdate=!0;const r=new Fh;r.name="PostProcessing",this._quadMesh=new dy(r)}render(){this._update();const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=p,e.outputColorSpace=de;const s=e.xr.enabled;e.xr.enabled=!1,this._quadMesh.render(e),e.xr.enabled=s,e.toneMapping=t,e.outputColorSpace=r}dispose(){this._quadMesh.material.dispose()}_update(){if(!0===this.needsUpdate){const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;this._quadMesh.material.fragmentNode=!0===this.outputColorTransform?Fu(this.outputNode,t,r):this.outputNode.context({toneMapping:t,outputColorSpace:r}),this._quadMesh.material.needsUpdate=!0,this.needsUpdate=!1}}async renderAsync(){this._update();const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=p,e.outputColorSpace=de;const s=e.xr.enabled;e.xr.enabled=!1,await this._quadMesh.renderAsync(e),e.xr.enabled=s,e.toneMapping=t,e.outputColorSpace=r}}class Hw extends pe{constructor(e=1,t=1){super(),this.image={width:e,height:t},this.magFilter=q,this.minFilter=q,this.isStorageTexture=!0}}class Ww extends xy{constructor(e,t){super(e,t,Uint32Array),this.isIndirectStorageBufferAttribute=!0}}class jw extends cs{constructor(e){super(e),this.textures={},this.nodes={}}load(e,t,r,s){const i=new hs(this.manager);i.setPath(this.path),i.setRequestHeader(this.requestHeader),i.setWithCredentials(this.withCredentials),i.load(e,(r=>{try{t(this.parse(JSON.parse(r)))}catch(t){s?s(t):console.error(t),this.manager.itemError(e)}}),r,s)}parseNodes(e){const t={};if(void 0!==e){for(const r of e){const{uuid:e,type:s}=r;t[e]=this.createNodeFromType(s),t[e].uuid=e}const r={nodes:t,textures:this.textures};for(const s of e){s.meta=r;t[s.uuid].deserialize(s),delete s.meta}}return t}parse(e){const t=this.createNodeFromType(e.type);t.uuid=e.uuid;const r={nodes:this.parseNodes(e.nodes),textures:this.textures};return e.meta=r,t.deserialize(e),delete e.meta,t}setTextures(e){return this.textures=e,this}setNodes(e){return this.nodes=e,this}createNodeFromType(e){return void 0===this.nodes[e]?(console.error("THREE.NodeLoader: Node type not found:",e),$i()):Pi(new this.nodes[e])}}class qw extends ps{constructor(e){super(e),this.nodes={},this.nodeMaterials={}}parse(e){const t=super.parse(e),r=this.nodes,s=e.inputNodes;for(const e in s){const i=s[e];t[e]=r[i]}return t}setNodes(e){return this.nodes=e,this}setNodeMaterials(e){return this.nodeMaterials=e,this}createMaterialFromType(e){const t=this.nodeMaterials[e];return void 0!==t?new t:super.createMaterialFromType(e)}}class Xw extends gs{constructor(e){super(e),this.nodes={},this.nodeMaterials={},this._nodesJSON=null}setNodes(e){return this.nodes=e,this}setNodeMaterials(e){return this.nodeMaterials=e,this}parse(e,t){this._nodesJSON=e.nodes;const r=super.parse(e,t);return this._nodesJSON=null,r}parseNodes(e,t){if(void 0!==e){const r=new jw;return r.setNodes(this.nodes),r.setTextures(t),r.parseNodes(e)}return{}}parseMaterials(e,t){const r={};if(void 0!==e){const s=this.parseNodes(this._nodesJSON,t),i=new qw;i.setTextures(t),i.setNodes(s),i.setNodeMaterials(this.nodeMaterials);for(let t=0,s=e.length;t0){const{width:r,height:s}=e.context;t.bufferWidth=r,t.bufferHeight=s}this.renderObjects.set(e,t)}return t}getAttributesData(e){const t={};for(const r in e){const s=e[r];t[r]={version:s.version}}return t}containsNode(e){const t=e.material;for(const e in t)if(t[e]&&t[e].isNode)return!0;return null!==e.renderer.nodes.modelViewMatrix||null!==e.renderer.nodes.modelNormalViewMatrix}getMaterialData(e){const t={};for(const r of this.refreshUniforms){const s=e[r];null!=s&&("object"==typeof s&&void 0!==s.clone?!0===s.isTexture?t[r]={id:s.id,version:s.version}:t[r]=s.clone():t[r]=s)}return t}equals(e){const{object:t,material:r,geometry:s}=e,i=this.getRenderObjectData(e);if(!0!==i.worldMatrix.equals(t.matrixWorld))return i.worldMatrix.copy(t.matrixWorld),!1;const n=i.material;for(const e in n){const t=n[e],s=r[e];if(void 0!==t.equals){if(!1===t.equals(s))return t.copy(s),!1}else if(!0===s.isTexture){if(t.id!==s.id||t.version!==s.version)return t.id=s.id,t.version=s.version,!1}else if(t!==s)return n[e]=s,!1}if(n.transmission>0){const{width:t,height:r}=e.context;if(i.bufferWidth!==t||i.bufferHeight!==r)return i.bufferWidth=t,i.bufferHeight=r,!1}const a=i.geometry,o=s.attributes,u=a.attributes,l=Object.keys(u),d=Object.keys(o);if(a.id!==s.id)return a.id=s.id,!1;if(l.length!==d.length)return i.geometry.attributes=this.getAttributesData(o),!1;for(const e of l){const t=u[e],r=o[e];if(void 0===r)return delete u[e],!1;if(t.version!==r.version)return t.version=r.version,!1}const c=s.index,h=a.indexVersion,p=c?c.version:null;if(h!==p)return a.indexVersion=p,!1;if(a.drawRange.start!==s.drawRange.start||a.drawRange.count!==s.drawRange.count)return a.drawRange.start=s.drawRange.start,a.drawRange.count=s.drawRange.count,!1;if(i.morphTargetInfluences){let e=!1;for(let r=0;r>>16,2246822507),r^=Math.imul(s^s>>>13,3266489909),s=Math.imul(s^s>>>16,2246822507),s^=Math.imul(r^r>>>13,3266489909),4294967296*(2097151&s)+(r>>>0)}const xs=e=>ys(e),bs=e=>ys(e),Ts=(...e)=>ys(e);function _s(e,t=!1){const r=[];!0===e.isNode&&(r.push(e.id),e=e.getSelf());for(const{property:s,childNode:i}of vs(e))r.push(ys(s.slice(0,-4)),i.getCacheKey(t));return ys(r)}function*vs(e,t=!1){for(const r in e){if(!0===r.startsWith("_"))continue;const s=e[r];if(!0===Array.isArray(s))for(let e=0;ee.charCodeAt(0))).buffer}var Fs=Object.freeze({__proto__:null,arrayBufferToBase64:Ps,base64ToArrayBuffer:Ls,getCacheKey:_s,getDataFromObject:Ms,getLengthFromType:As,getNodeChildren:vs,getTypeFromLength:Es,getTypedArrayFromType:ws,getValueFromType:Cs,getValueType:Rs,hash:Ts,hashArray:bs,hashString:xs});const Bs={VERTEX:"vertex",FRAGMENT:"fragment"},Is={NONE:"none",FRAME:"frame",RENDER:"render",OBJECT:"object"},Ds={BOOLEAN:"bool",INTEGER:"int",FLOAT:"float",VECTOR2:"vec2",VECTOR3:"vec3",VECTOR4:"vec4",MATRIX2:"mat2",MATRIX3:"mat3",MATRIX4:"mat4"},Vs={READ_ONLY:"readOnly",WRITE_ONLY:"writeOnly",READ_WRITE:"readWrite"},Us=["fragment","vertex"],Os=["setup","analyze","generate"],Gs=[...Us,"compute"],ks=["x","y","z","w"];let zs=0;class $s extends o{static get type(){return"Node"}constructor(e=null){super(),this.nodeType=e,this.updateType=Is.NONE,this.updateBeforeType=Is.NONE,this.updateAfterType=Is.NONE,this.uuid=u.generateUUID(),this.version=0,this.global=!1,this.isNode=!0,this._cacheKey=null,this._cacheKeyVersion=0,Object.defineProperty(this,"id",{value:zs++})}set needsUpdate(e){!0===e&&this.version++}get type(){return this.constructor.type}onUpdate(e,t){return this.updateType=t,this.update=e.bind(this.getSelf()),this}onFrameUpdate(e){return this.onUpdate(e,Is.FRAME)}onRenderUpdate(e){return this.onUpdate(e,Is.RENDER)}onObjectUpdate(e){return this.onUpdate(e,Is.OBJECT)}onReference(e){return this.updateReference=e.bind(this.getSelf()),this}getSelf(){return this.self||this}updateReference(){return this}isGlobal(){return this.global}*getChildren(){for(const{childNode:e}of vs(this))yield e}dispose(){this.dispatchEvent({type:"dispose"})}traverse(e){e(this);for(const t of this.getChildren())t.traverse(e)}getCacheKey(e=!1){return!0!==(e=e||this.version!==this._cacheKeyVersion)&&null!==this._cacheKey||(this._cacheKey=Ts(_s(this,e),this.customCacheKey()),this._cacheKeyVersion=this.version),this._cacheKey}customCacheKey(){return 0}getScope(){return this}getHash(){return this.uuid}getUpdateType(){return this.updateType}getUpdateBeforeType(){return this.updateBeforeType}getUpdateAfterType(){return this.updateAfterType}getElementType(e){const t=this.getNodeType(e);return e.getElementType(t)}getMemberType(){return"void"}getNodeType(e){const t=e.getNodeProperties(this);return t.outputNode?t.outputNode.getNodeType(e):this.nodeType}getShared(e){const t=this.getHash(e);return e.getNodeFromHash(t)||this}setup(e){const t=e.getNodeProperties(this);let r=0;for(const e of this.getChildren())t["node"+r++]=e;return t.outputNode||null}analyze(e){if(1===e.increaseUsage(this)){const t=e.getNodeProperties(this);for(const r of Object.values(t))r&&!0===r.isNode&&r.build(e)}}generate(e,t){const{outputNode:r}=e.getNodeProperties(this);if(r&&!0===r.isNode)return r.build(e,t)}updateBefore(){console.warn("Abstract function.")}updateAfter(){console.warn("Abstract function.")}update(){console.warn("Abstract function.")}build(e,t=null){const r=this.getShared(e);if(this!==r)return r.build(e,t);e.addNode(this),e.addChain(this);let s=null;const i=e.getBuildStage();if("setup"===i){this.updateReference(e);const t=e.getNodeProperties(this);if(!0!==t.initialized){t.initialized=!0;const r=this.setup(e),s=r&&!0===r.isNode;for(const r of Object.values(t))r&&!0===r.isNode&&r.build(e);s&&r.build(e),t.outputNode=r}}else if("analyze"===i)this.analyze(e);else if("generate"===i){if(1===this.generate.length){const r=this.getNodeType(e),i=e.getDataFromNode(this);s=i.snippet,void 0===s?void 0===i.generated?(i.generated=!0,s=this.generate(e)||"",i.snippet=s):(console.warn("THREE.Node: Recursion detected.",this),s=""):void 0!==i.flowCodes&&void 0!==e.context.nodeBlock&&e.addFlowCodeHierarchy(this,e.context.nodeBlock),s=e.format(s,r,t)}else s=this.generate(e,t)||""}return e.removeChain(this),e.addSequentialNode(this),s}getSerializeChildren(){return vs(this)}serialize(e){const t=this.getSerializeChildren(),r={};for(const{property:s,index:i,childNode:n}of t)void 0!==i?(void 0===r[s]&&(r[s]=Number.isInteger(i)?[]:{}),r[s][i]=n.toJSON(e.meta).uuid):r[s]=n.toJSON(e.meta).uuid;Object.keys(r).length>0&&(e.inputNodes=r)}deserialize(e){if(void 0!==e.inputNodes){const t=e.meta.nodes;for(const r in e.inputNodes)if(Array.isArray(e.inputNodes[r])){const s=[];for(const i of e.inputNodes[r])s.push(t[i]);this[r]=s}else if("object"==typeof e.inputNodes[r]){const s={};for(const i in e.inputNodes[r]){const n=e.inputNodes[r][i];s[i]=t[n]}this[r]=s}else{const s=e.inputNodes[r];this[r]=t[s]}}}toJSON(e){const{uuid:t,type:r}=this,s=void 0===e||"string"==typeof e;s&&(e={textures:{},images:{},nodes:{}});let i=e.nodes[t];function n(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(void 0===i&&(i={uuid:t,type:r,meta:e,metadata:{version:4.6,type:"Node",generator:"Node.toJSON"}},!0!==s&&(e.nodes[i.uuid]=i),this.serialize(i),delete i.meta),s){const t=n(e.textures),r=n(e.images),s=n(e.nodes);t.length>0&&(i.textures=t),r.length>0&&(i.images=r),s.length>0&&(i.nodes=s)}return i}}class Hs extends $s{static get type(){return"ArrayElementNode"}constructor(e,t){super(),this.node=e,this.indexNode=t,this.isArrayElementNode=!0}getNodeType(e){return this.node.getElementType(e)}generate(e){const t=this.indexNode.getNodeType(e);return`${this.node.build(e)}[ ${this.indexNode.build(e,!e.isVector(t)&&e.isInteger(t)?t:"uint")} ]`}}class Ws extends $s{static get type(){return"ConvertNode"}constructor(e,t){super(),this.node=e,this.convertTo=t}getNodeType(e){const t=this.node.getNodeType(e);let r=null;for(const s of this.convertTo.split("|"))null!==r&&e.getTypeLength(t)!==e.getTypeLength(s)||(r=s);return r}serialize(e){super.serialize(e),e.convertTo=this.convertTo}deserialize(e){super.deserialize(e),this.convertTo=e.convertTo}generate(e,t){const r=this.node,s=this.getNodeType(e),i=r.build(e,s);return e.format(i,s,t)}}class js extends $s{static get type(){return"TempNode"}constructor(e=null){super(e),this.isTempNode=!0}hasDependencies(e){return e.getDataFromNode(this).usageCount>1}build(e,t){if("generate"===e.getBuildStage()){const r=e.getVectorType(this.getNodeType(e,t)),s=e.getDataFromNode(this);if(void 0!==s.propertyName)return e.format(s.propertyName,r,t);if("void"!==r&&"void"!==t&&this.hasDependencies(e)){const i=super.build(e,r),n=e.getVarFromNode(this,null,r),a=e.getPropertyName(n);return e.addLineFlowCode(`${a} = ${i}`,this),s.snippet=i,s.propertyName=a,e.format(s.propertyName,r,t)}}return super.build(e,t)}}class qs extends js{static get type(){return"JoinNode"}constructor(e=[],t=null){super(t),this.nodes=e}getNodeType(e){return null!==this.nodeType?e.getVectorType(this.nodeType):e.getTypeFromLength(this.nodes.reduce(((t,r)=>t+e.getTypeLength(r.getNodeType(e))),0))}generate(e,t){const r=this.getNodeType(e),s=e.getTypeLength(r),i=this.nodes,n=e.getComponentType(r),a=[];let o=0;for(const t of i){if(o>=s){console.error(`THREE.TSL: Length of parameters exceeds maximum length of function '${r}()' type.`);break}let i,u=t.getNodeType(e),l=e.getTypeLength(u);o+l>s&&(console.error(`THREE.TSL: Length of '${r}()' data exceeds maximum length of output type.`),l=s-o,u=e.getTypeFromLength(l)),o+=l,i=t.build(e,u);const d=e.getComponentType(u);d!==n&&(i=e.format(i,d,n)),a.push(i)}const u=`${e.getType(r)}( ${a.join(", ")} )`;return e.format(u,r,t)}}const Xs=ks.join("");class Ks extends $s{static get type(){return"SplitNode"}constructor(e,t="x"){super(),this.node=e,this.components=t,this.isSplitNode=!0}getVectorLength(){let e=this.components.length;for(const t of this.components)e=Math.max(ks.indexOf(t)+1,e);return e}getComponentType(e){return e.getComponentType(this.node.getNodeType(e))}getNodeType(e){return e.getTypeFromLength(this.components.length,this.getComponentType(e))}generate(e,t){const r=this.node,s=e.getTypeLength(r.getNodeType(e));let i=null;if(s>1){let n=null;this.getVectorLength()>=s&&(n=e.getTypeFromLength(this.getVectorLength(),this.getComponentType(e)));const a=r.build(e,n);i=this.components.length===s&&this.components===Xs.slice(0,this.components.length)?e.format(a,n,t):e.format(`${a}.${this.components}`,this.getNodeType(e),t)}else i=r.build(e,t);return i}serialize(e){super.serialize(e),e.components=this.components}deserialize(e){super.deserialize(e),this.components=e.components}}class Ys extends js{static get type(){return"SetNode"}constructor(e,t,r){super(),this.sourceNode=e,this.components=t,this.targetNode=r}getNodeType(e){return this.sourceNode.getNodeType(e)}generate(e){const{sourceNode:t,components:r,targetNode:s}=this,i=this.getNodeType(e),n=e.getComponentType(s.getNodeType(e)),a=e.getTypeFromLength(r.length,n),o=s.build(e,a),u=t.build(e,i),l=e.getTypeLength(i),d=[];for(let e=0;ee.replace(/r|s/g,"x").replace(/g|t/g,"y").replace(/b|p/g,"z").replace(/a|q/g,"w"),ai=e=>ni(e).split("").sort().join(""),oi={setup(e,t){const r=t.shift();return e(Li(r),...t)},get(e,t,r){if("string"==typeof t&&void 0===e[t]){if(!0!==e.isStackNode&&"assign"===t)return(...e)=>(ri.assign(r,...e),r);if(si.has(t)){const s=si.get(t);return e.isStackNode?(...e)=>r.add(s(...e)):(...e)=>s(r,...e)}if("self"===t)return e;if(t.endsWith("Assign")&&si.has(t.slice(0,t.length-6))){const s=si.get(t.slice(0,t.length-6));return e.isStackNode?(...e)=>r.assign(e[0],s(...e)):(...e)=>r.assign(s(r,...e))}if(!0===/^[xyzwrgbastpq]{1,4}$/.test(t))return t=ni(t),Pi(new Ks(r,t));if(!0===/^set[XYZWRGBASTPQ]{1,4}$/.test(t))return t=ai(t.slice(3).toLowerCase()),r=>Pi(new Ys(e,t,r));if(!0===/^flip[XYZWRGBASTPQ]{1,4}$/.test(t))return t=ai(t.slice(4).toLowerCase()),()=>Pi(new Qs(Pi(e),t));if("width"===t||"height"===t||"depth"===t)return"width"===t?t="x":"height"===t?t="y":"depth"===t&&(t="z"),Pi(new Ks(e,t));if(!0===/^\d+$/.test(t))return Pi(new Hs(r,new ei(Number(t),"uint")));if(!0===/^get$/.test(t))return e=>Pi(new ti(r,e))}return Reflect.get(e,t,r)},set:(e,t,r,s)=>"string"!=typeof t||void 0!==e[t]||!0!==/^[xyzwrgbastpq]{1,4}$/.test(t)&&"width"!==t&&"height"!==t&&"depth"!==t&&!0!==/^\d+$/.test(t)?Reflect.set(e,t,r,s):(s[t].assign(r),!0)},ui=new WeakMap,li=new WeakMap,di=function(e,t=null){for(const r in e)e[r]=Pi(e[r],t);return e},ci=function(e,t=null){const r=e.length;for(let s=0;sPi(null!==s?Object.assign(e,s):e);let n,a,o,u=t;function l(t){let r;return r=u?/[a-z]/i.test(u)?u+"()":u:e.type,void 0!==a&&t.lengtho?(console.error(`THREE.TSL: "${r}" parameter length exceeds limit.`),t.slice(0,o)):t}return null===t?n=(...t)=>i(new e(...Fi(l(t)))):null!==r?(r=Pi(r),n=(...s)=>i(new e(t,...Fi(l(s)),r))):n=(...r)=>i(new e(t,...Fi(l(r)))),n.setParameterLength=(...e)=>(1===e.length?a=o=e[0]:2===e.length&&([a,o]=e),n),n.setName=e=>(u=e,n),n},pi=function(e,...t){return Pi(new e(...Fi(t)))};class gi extends $s{constructor(e,t){super(),this.shaderNode=e,this.inputNodes=t}getNodeType(e){return this.shaderNode.nodeType||this.getOutputNode(e).getNodeType(e)}getMemberType(e,t){return this.getOutputNode(e).getMemberType(e,t)}call(e){const{shaderNode:t,inputNodes:r}=this,s=e.getNodeProperties(t);if(s.onceOutput)return s.onceOutput;let i=null;if(t.layout){let s=li.get(e.constructor);void 0===s&&(s=new WeakMap,li.set(e.constructor,s));let n=s.get(t);void 0===n&&(n=Pi(e.buildFunctionNode(t)),s.set(t,n)),e.addInclude(n),i=Pi(n.call(r))}else{const s=t.jsFunc,n=null!==r||s.length>1?s(r||[],e):s(e);i=Pi(n)}return t.once&&(s.onceOutput=i),i}getOutputNode(e){const t=e.getNodeProperties(this);return null===t.outputNode&&(t.outputNode=this.setupOutput(e)),t.outputNode}setup(e){return this.getOutputNode(e)}setupOutput(e){return e.addStack(),e.stack.outputNode=this.call(e),e.removeStack()}generate(e,t){return this.getOutputNode(e).build(e,t)}}class mi extends $s{constructor(e,t){super(t),this.jsFunc=e,this.layout=null,this.global=!0,this.once=!1}setLayout(e){return this.layout=e,this}call(e=null){return Li(e),Pi(new gi(this,e))}setup(){return this.call()}}const fi=[!1,!0],yi=[0,1,2,3],xi=[-1,-2],bi=[.5,1.5,1/3,1e-6,1e6,Math.PI,2*Math.PI,1/Math.PI,2/Math.PI,1/(2*Math.PI),Math.PI/2],Ti=new Map;for(const e of fi)Ti.set(e,new ei(e));const _i=new Map;for(const e of yi)_i.set(e,new ei(e,"uint"));const vi=new Map([..._i].map((e=>new ei(e.value,"int"))));for(const e of xi)vi.set(e,new ei(e,"int"));const Ni=new Map([...vi].map((e=>new ei(e.value))));for(const e of bi)Ni.set(e,new ei(e));for(const e of bi)Ni.set(-e,new ei(-e));const Si={bool:Ti,uint:_i,ints:vi,float:Ni},Ei=new Map([...Ti,...Ni]),wi=(e,t)=>Ei.has(e)?Ei.get(e):!0===e.isNode?e:new ei(e,t),Ai=function(e,t=null){return(...r)=>{if((0===r.length||!["bool","float","int","uint"].includes(e)&&r.every((e=>"object"!=typeof e)))&&(r=[Cs(e,...r)]),1===r.length&&null!==t&&t.has(r[0]))return Pi(t.get(r[0]));if(1===r.length){const t=wi(r[0],e);return(e=>{try{return e.getNodeType()}catch(e){return}})(t)===e?Pi(t):Pi(new Ws(t,e))}const s=r.map((e=>wi(e)));return Pi(new qs(s,e))}},Ri=e=>"object"==typeof e&&null!==e?e.value:e,Ci=e=>null!=e?e.nodeType||e.convertTo||("string"==typeof e?e:null):null;function Mi(e,t){return new Proxy(new mi(e,t),oi)}const Pi=(e,t=null)=>function(e,t=null){const r=Rs(e);if("node"===r){let t=ui.get(e);return void 0===t&&(t=new Proxy(e,oi),ui.set(e,t),ui.set(t,t)),t}return null===t&&("float"===r||"boolean"===r)||r&&"shader"!==r&&"string"!==r?Pi(wi(e,t)):"shader"===r?Vi(e):e}(e,t),Li=(e,t=null)=>new di(e,t),Fi=(e,t=null)=>new ci(e,t),Bi=(...e)=>new hi(...e),Ii=(...e)=>new pi(...e);let Di=0;const Vi=(e,t=null)=>{let r=null;null!==t&&("object"==typeof t?r=t.return:("string"==typeof t?r=t:console.error("THREE.TSL: Invalid layout type."),t=null));const s=new Mi(e,r),i=(...e)=>{let t;return Li(e),t=e[0]&&e[0].isNode?[...e]:e[0],s.call(t)};if(i.shaderNode=s,i.setLayout=e=>(s.setLayout(e),i),i.once=()=>(s.once=!0,i),null!==t){if("object"!=typeof t.inputs){const e={name:"fn"+Di++,type:r,inputs:[]};for(const r in t)"return"!==r&&e.inputs.push({name:r,type:t[r]});t=e}i.setLayout(t)}return i};ii("toGlobal",(e=>(e.global=!0,e)));const Ui=e=>{ri=e},Oi=()=>ri,Gi=(...e)=>ri.If(...e);function ki(e){return ri&&ri.add(e),e}ii("append",ki);const zi=new Ai("color"),$i=new Ai("float",Si.float),Hi=new Ai("int",Si.ints),Wi=new Ai("uint",Si.uint),ji=new Ai("bool",Si.bool),qi=new Ai("vec2"),Xi=new Ai("ivec2"),Ki=new Ai("uvec2"),Yi=new Ai("bvec2"),Qi=new Ai("vec3"),Zi=new Ai("ivec3"),Ji=new Ai("uvec3"),en=new Ai("bvec3"),tn=new Ai("vec4"),rn=new Ai("ivec4"),sn=new Ai("uvec4"),nn=new Ai("bvec4"),an=new Ai("mat2"),on=new Ai("mat3"),un=new Ai("mat4");ii("toColor",zi),ii("toFloat",$i),ii("toInt",Hi),ii("toUint",Wi),ii("toBool",ji),ii("toVec2",qi),ii("toIVec2",Xi),ii("toUVec2",Ki),ii("toBVec2",Yi),ii("toVec3",Qi),ii("toIVec3",Zi),ii("toUVec3",Ji),ii("toBVec3",en),ii("toVec4",tn),ii("toIVec4",rn),ii("toUVec4",sn),ii("toBVec4",nn),ii("toMat2",an),ii("toMat3",on),ii("toMat4",un);const ln=Bi(Hs).setParameterLength(2),dn=(e,t)=>Pi(new Ws(Pi(e),t));ii("element",ln),ii("convert",dn);class cn extends js{static get type(){return"ArrayNode"}constructor(e,t,r=null){super(e),this.count=t,this.values=r,this.isArrayNode=!0}getNodeType(e){return null===this.nodeType&&(this.nodeType=this.values[0].getNodeType(e)),this.nodeType}getElementType(e){return this.getNodeType(e)}generate(e){const t=this.getNodeType(e);return e.generateArray(t,this.count,this.values)}}const hn=(...e)=>{let t;if(1===e.length){const r=e[0];t=new cn(null,r.length,r)}else{const r=e[0],s=e[1];t=new cn(r,s)}return Pi(t)};ii("toArray",((e,t)=>hn(Array(t).fill(e))));class pn extends $s{static get type(){return"UniformGroupNode"}constructor(e,t=!1,r=1){super("string"),this.name=e,this.shared=t,this.order=r,this.isUniformGroup=!0}serialize(e){super.serialize(e),e.name=this.name,e.version=this.version,e.shared=this.shared}deserialize(e){super.deserialize(e),this.name=e.name,this.version=e.version,this.shared=e.shared}}const gn=e=>new pn(e),mn=(e,t=0)=>new pn(e,!0,t),fn=mn("frame"),yn=mn("render"),xn=gn("object");class bn extends Zs{static get type(){return"UniformNode"}constructor(e,t=null){super(e,t),this.isUniformNode=!0,this.name="",this.groupNode=xn}label(e){return this.name=e,this}setGroup(e){return this.groupNode=e,this}getGroup(){return this.groupNode}getUniformHash(e){return this.getHash(e)}onUpdate(e,t){const r=this.getSelf();return e=e.bind(r),super.onUpdate((t=>{const s=e(t,r);void 0!==s&&(this.value=s)}),t)}generate(e,t){const r=this.getNodeType(e),s=this.getUniformHash(e);let i=e.getNodeFromHash(s);void 0===i&&(e.setHashNode(this,s),i=this);const n=i.getInputType(e),a=e.getUniformFromNode(i,n,e.shaderStage,this.name||e.context.label),o=e.getPropertyName(a);return void 0!==e.context.label&&delete e.context.label,e.format(o,r,t)}}const Tn=(e,t)=>{const r=Ci(t||e),s=e&&!0===e.isNode?e.node&&e.node.value||e.value:e;return Pi(new bn(s,r))};class _n extends $s{static get type(){return"PropertyNode"}constructor(e,t=null,r=!1){super(e),this.name=t,this.varying=r,this.isPropertyNode=!0}getHash(e){return this.name||super.getHash(e)}isGlobal(){return!0}generate(e){let t;return!0===this.varying?(t=e.getVaryingFromNode(this,this.name),t.needsInterpolation=!0):t=e.getVarFromNode(this,this.name),e.getPropertyName(t)}}const vn=(e,t)=>Pi(new _n(e,t)),Nn=(e,t)=>Pi(new _n(e,t,!0)),Sn=Ii(_n,"vec4","DiffuseColor"),En=Ii(_n,"vec3","EmissiveColor"),wn=Ii(_n,"float","Roughness"),An=Ii(_n,"float","Metalness"),Rn=Ii(_n,"float","Clearcoat"),Cn=Ii(_n,"float","ClearcoatRoughness"),Mn=Ii(_n,"vec3","Sheen"),Pn=Ii(_n,"float","SheenRoughness"),Ln=Ii(_n,"float","Iridescence"),Fn=Ii(_n,"float","IridescenceIOR"),Bn=Ii(_n,"float","IridescenceThickness"),In=Ii(_n,"float","AlphaT"),Dn=Ii(_n,"float","Anisotropy"),Vn=Ii(_n,"vec3","AnisotropyT"),Un=Ii(_n,"vec3","AnisotropyB"),On=Ii(_n,"color","SpecularColor"),Gn=Ii(_n,"float","SpecularF90"),kn=Ii(_n,"float","Shininess"),zn=Ii(_n,"vec4","Output"),$n=Ii(_n,"float","dashSize"),Hn=Ii(_n,"float","gapSize"),Wn=Ii(_n,"float","pointWidth"),jn=Ii(_n,"float","IOR"),qn=Ii(_n,"float","Transmission"),Xn=Ii(_n,"float","Thickness"),Kn=Ii(_n,"float","AttenuationDistance"),Yn=Ii(_n,"color","AttenuationColor"),Qn=Ii(_n,"float","Dispersion");class Zn extends js{static get type(){return"AssignNode"}constructor(e,t){super(),this.targetNode=e,this.sourceNode=t}hasDependencies(){return!1}getNodeType(e,t){return"void"!==t?this.targetNode.getNodeType(e):"void"}needsSplitAssign(e){const{targetNode:t}=this;if(!1===e.isAvailable("swizzleAssign")&&t.isSplitNode&&t.components.length>1){const r=e.getTypeLength(t.node.getNodeType(e));return ks.join("").slice(0,r)!==t.components}return!1}generate(e,t){const{targetNode:r,sourceNode:s}=this,i=this.needsSplitAssign(e),n=r.getNodeType(e),a=r.context({assign:!0}).build(e),o=s.build(e,n),u=s.getNodeType(e),l=e.getDataFromNode(this);let d;if(!0===l.initialized)"void"!==t&&(d=a);else if(i){const s=e.getVarFromNode(this,null,n),i=e.getPropertyName(s);e.addLineFlowCode(`${i} = ${o}`,this);const u=r.node.context({assign:!0}).build(e);for(let t=0;t{const s=r.type;let i;return i="pointer"===s?"&"+t.build(e):t.build(e,s),i};if(Array.isArray(i)){if(i.length>s.length)console.error("THREE.TSL: The number of provided parameters exceeds the expected number of inputs in 'Fn()'."),i.length=s.length;else if(i.length(t=t.length>1||t[0]&&!0===t[0].isNode?Fi(t):Li(t[0]),Pi(new ea(Pi(e),t)));ii("call",ta);class ra extends js{static get type(){return"OperatorNode"}constructor(e,t,r,...s){if(super(),s.length>0){let i=new ra(e,t,r);for(let t=0;t>"===r||"<<"===r)return e.getIntegerType(n);if("!"===r||"=="===r||"!="===r||"&&"===r||"||"===r||"^^"===r)return"bool";if("<"===r||">"===r||"<="===r||">="===r){const r=t?e.getTypeLength(t):Math.max(e.getTypeLength(n),e.getTypeLength(a));return r>1?`bvec${r}`:"bool"}if(e.isMatrix(n)){if("float"===a)return n;if(e.isVector(a))return e.getVectorFromMatrix(n);if(e.isMatrix(a))return n}else if(e.isMatrix(a)){if("float"===n)return a;if(e.isVector(n))return e.getVectorFromMatrix(a)}return e.getTypeLength(a)>e.getTypeLength(n)?a:n}generate(e,t){const r=this.op,s=this.aNode,i=this.bNode,n=this.getNodeType(e,t);let a=null,o=null;"void"!==n?(a=s.getNodeType(e),o=void 0!==i?i.getNodeType(e):null,"<"===r||">"===r||"<="===r||">="===r||"=="===r||"!="===r?e.isVector(a)?o=a:a!==o&&(a=o="float"):">>"===r||"<<"===r?(a=n,o=e.changeComponentType(o,"uint")):"%"===r?(a=n,o=e.isInteger(a)&&e.isInteger(o)?o:a):e.isMatrix(a)?"float"===o?o="float":e.isVector(o)?o=e.getVectorFromMatrix(a):e.isMatrix(o)||(a=o=n):a=e.isMatrix(o)?"float"===a?"float":e.isVector(a)?e.getVectorFromMatrix(o):o=n:o=n):a=o=n;const u=s.build(e,a),d=void 0!==i?i.build(e,o):null,c=e.getTypeLength(t),h=e.getFunctionOperator(r);if("void"!==t){const s=e.renderer.coordinateSystem===l;if("=="===r)return s?c>1?e.format(`${e.getMethod("equal",t)}( ${u}, ${d} )`,n,t):e.format(`( ${u} ${r} ${d} )`,n,t):c>1||!e.isVector(a)?e.format(`( ${u} == ${d} )`,n,t):e.format(`all( ${u} == ${d} )`,n,t);if("<"===r&&c>1)return s?e.format(`${e.getMethod("lessThan",t)}( ${u}, ${d} )`,n,t):e.format(`( ${u} < ${d} )`,n,t);if("<="===r&&c>1)return s?e.format(`${e.getMethod("lessThanEqual",t)}( ${u}, ${d} )`,n,t):e.format(`( ${u} <= ${d} )`,n,t);if(">"===r&&c>1)return s?e.format(`${e.getMethod("greaterThan",t)}( ${u}, ${d} )`,n,t):e.format(`( ${u} > ${d} )`,n,t);if(">="===r&&c>1)return s?e.format(`${e.getMethod("greaterThanEqual",t)}( ${u}, ${d} )`,n,t):e.format(`( ${u} >= ${d} )`,n,t);if("%"===r)return e.isInteger(o)?e.format(`( ${u} % ${d} )`,n,t):e.format(`${e.getMethod("mod",n)}( ${u}, ${d} )`,n,t);if("!"===r||"~"===r)return e.format(`(${r}${u})`,a,t);if(h)return e.format(`${h}( ${u}, ${d} )`,n,t);if(e.isMatrix(a)&&"float"===o)return e.format(`( ${d} ${r} ${u} )`,n,t);if("float"===a&&e.isMatrix(o))return e.format(`${u} ${r} ${d}`,n,t);{let i=`( ${u} ${r} ${d} )`;return!s&&"bool"===n&&e.isVector(a)&&e.isVector(o)&&(i=`all${i}`),e.format(i,n,t)}}if("void"!==a)return h?e.format(`${h}( ${u}, ${d} )`,n,t):e.isMatrix(a)&&"float"===o?e.format(`${d} ${r} ${u}`,n,t):e.format(`${u} ${r} ${d}`,n,t)}serialize(e){super.serialize(e),e.op=this.op}deserialize(e){super.deserialize(e),this.op=e.op}}const sa=Bi(ra,"+").setParameterLength(2,1/0).setName("add"),ia=Bi(ra,"-").setParameterLength(2,1/0).setName("sub"),na=Bi(ra,"*").setParameterLength(2,1/0).setName("mul"),aa=Bi(ra,"/").setParameterLength(2,1/0).setName("div"),oa=Bi(ra,"%").setParameterLength(2).setName("mod"),ua=Bi(ra,"==").setParameterLength(2).setName("equal"),la=Bi(ra,"!=").setParameterLength(2).setName("notEqual"),da=Bi(ra,"<").setParameterLength(2).setName("lessThan"),ca=Bi(ra,">").setParameterLength(2).setName("greaterThan"),ha=Bi(ra,"<=").setParameterLength(2).setName("lessThanEqual"),pa=Bi(ra,">=").setParameterLength(2).setName("greaterThanEqual"),ga=Bi(ra,"&&").setParameterLength(2,1/0).setName("and"),ma=Bi(ra,"||").setParameterLength(2,1/0).setName("or"),fa=Bi(ra,"!").setParameterLength(1).setName("not"),ya=Bi(ra,"^^").setParameterLength(2).setName("xor"),xa=Bi(ra,"&").setParameterLength(2).setName("bitAnd"),ba=Bi(ra,"~").setParameterLength(2).setName("bitNot"),Ta=Bi(ra,"|").setParameterLength(2).setName("bitOr"),_a=Bi(ra,"^").setParameterLength(2).setName("bitXor"),va=Bi(ra,"<<").setParameterLength(2).setName("shiftLeft"),Na=Bi(ra,">>").setParameterLength(2).setName("shiftRight");ii("add",sa),ii("sub",ia),ii("mul",na),ii("div",aa),ii("mod",oa),ii("equal",ua),ii("notEqual",la),ii("lessThan",da),ii("greaterThan",ca),ii("lessThanEqual",ha),ii("greaterThanEqual",pa),ii("and",ga),ii("or",ma),ii("not",fa),ii("xor",ya),ii("bitAnd",xa),ii("bitNot",ba),ii("bitOr",Ta),ii("bitXor",_a),ii("shiftLeft",va),ii("shiftRight",Na);const Sa=(e,t)=>(console.warn('THREE.TSL: "remainder()" is deprecated. Use "mod( int( ... ) )" instead.'),oa(e,t)),Ea=(e,t)=>(console.warn('THREE.TSL: "modInt()" is deprecated. Use "mod( int( ... ) )" instead.'),oa(Hi(e),Hi(t)));ii("remainder",Sa),ii("modInt",Ea);class wa extends js{static get type(){return"MathNode"}constructor(e,t,r=null,s=null){if(super(),(e===wa.MAX||e===wa.MIN)&&arguments.length>3){let i=new wa(e,t,r);for(let t=2;tn&&i>a?t:n>a?r:a>i?s:t}getNodeType(e){const t=this.method;return t===wa.LENGTH||t===wa.DISTANCE||t===wa.DOT?"float":t===wa.CROSS?"vec3":t===wa.ALL||t===wa.ANY?"bool":t===wa.EQUALS?e.changeComponentType(this.aNode.getNodeType(e),"bool"):this.getInputType(e)}generate(e,t){let r=this.method;const s=this.getNodeType(e),i=this.getInputType(e),n=this.aNode,a=this.bNode,o=this.cNode,u=e.renderer.coordinateSystem;if(r===wa.TRANSFORM_DIRECTION){let r=n,s=a;e.isMatrix(r.getNodeType(e))?s=tn(Qi(s),0):r=tn(Qi(r),0);const i=na(r,s).xyz;return $a(i).build(e,t)}if(r===wa.NEGATE)return e.format("( - "+n.build(e,i)+" )",s,t);if(r===wa.ONE_MINUS)return ia(1,n).build(e,t);if(r===wa.RECIPROCAL)return aa(1,n).build(e,t);if(r===wa.DIFFERENCE)return Qa(ia(n,a)).build(e,t);{const c=[];return r===wa.CROSS?c.push(n.build(e,s),a.build(e,s)):u===l&&r===wa.STEP?c.push(n.build(e,1===e.getTypeLength(n.getNodeType(e))?"float":i),a.build(e,i)):u!==l||r!==wa.MIN&&r!==wa.MAX?r===wa.REFRACT?c.push(n.build(e,i),a.build(e,i),o.build(e,"float")):r===wa.MIX?c.push(n.build(e,i),a.build(e,i),o.build(e,1===e.getTypeLength(o.getNodeType(e))?"float":i)):(u===d&&r===wa.ATAN&&null!==a&&(r="atan2"),c.push(n.build(e,i)),null!==a&&c.push(a.build(e,i)),null!==o&&c.push(o.build(e,i))):c.push(n.build(e,i),a.build(e,1===e.getTypeLength(a.getNodeType(e))?"float":i)),e.format(`${e.getMethod(r,s)}( ${c.join(", ")} )`,s,t)}}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}wa.ALL="all",wa.ANY="any",wa.RADIANS="radians",wa.DEGREES="degrees",wa.EXP="exp",wa.EXP2="exp2",wa.LOG="log",wa.LOG2="log2",wa.SQRT="sqrt",wa.INVERSE_SQRT="inversesqrt",wa.FLOOR="floor",wa.CEIL="ceil",wa.NORMALIZE="normalize",wa.FRACT="fract",wa.SIN="sin",wa.COS="cos",wa.TAN="tan",wa.ASIN="asin",wa.ACOS="acos",wa.ATAN="atan",wa.ABS="abs",wa.SIGN="sign",wa.LENGTH="length",wa.NEGATE="negate",wa.ONE_MINUS="oneMinus",wa.DFDX="dFdx",wa.DFDY="dFdy",wa.ROUND="round",wa.RECIPROCAL="reciprocal",wa.TRUNC="trunc",wa.FWIDTH="fwidth",wa.TRANSPOSE="transpose",wa.BITCAST="bitcast",wa.EQUALS="equals",wa.MIN="min",wa.MAX="max",wa.STEP="step",wa.REFLECT="reflect",wa.DISTANCE="distance",wa.DIFFERENCE="difference",wa.DOT="dot",wa.CROSS="cross",wa.POW="pow",wa.TRANSFORM_DIRECTION="transformDirection",wa.MIX="mix",wa.CLAMP="clamp",wa.REFRACT="refract",wa.SMOOTHSTEP="smoothstep",wa.FACEFORWARD="faceforward";const Aa=$i(1e-6),Ra=$i(1e6),Ca=$i(Math.PI),Ma=$i(2*Math.PI),Pa=Bi(wa,wa.ALL).setParameterLength(1),La=Bi(wa,wa.ANY).setParameterLength(1),Fa=Bi(wa,wa.RADIANS).setParameterLength(1),Ba=Bi(wa,wa.DEGREES).setParameterLength(1),Ia=Bi(wa,wa.EXP).setParameterLength(1),Da=Bi(wa,wa.EXP2).setParameterLength(1),Va=Bi(wa,wa.LOG).setParameterLength(1),Ua=Bi(wa,wa.LOG2).setParameterLength(1),Oa=Bi(wa,wa.SQRT).setParameterLength(1),Ga=Bi(wa,wa.INVERSE_SQRT).setParameterLength(1),ka=Bi(wa,wa.FLOOR).setParameterLength(1),za=Bi(wa,wa.CEIL).setParameterLength(1),$a=Bi(wa,wa.NORMALIZE).setParameterLength(1),Ha=Bi(wa,wa.FRACT).setParameterLength(1),Wa=Bi(wa,wa.SIN).setParameterLength(1),ja=Bi(wa,wa.COS).setParameterLength(1),qa=Bi(wa,wa.TAN).setParameterLength(1),Xa=Bi(wa,wa.ASIN).setParameterLength(1),Ka=Bi(wa,wa.ACOS).setParameterLength(1),Ya=Bi(wa,wa.ATAN).setParameterLength(1,2),Qa=Bi(wa,wa.ABS).setParameterLength(1),Za=Bi(wa,wa.SIGN).setParameterLength(1),Ja=Bi(wa,wa.LENGTH).setParameterLength(1),eo=Bi(wa,wa.NEGATE).setParameterLength(1),to=Bi(wa,wa.ONE_MINUS).setParameterLength(1),ro=Bi(wa,wa.DFDX).setParameterLength(1),so=Bi(wa,wa.DFDY).setParameterLength(1),io=Bi(wa,wa.ROUND).setParameterLength(1),no=Bi(wa,wa.RECIPROCAL).setParameterLength(1),ao=Bi(wa,wa.TRUNC).setParameterLength(1),oo=Bi(wa,wa.FWIDTH).setParameterLength(1),uo=Bi(wa,wa.TRANSPOSE).setParameterLength(1),lo=Bi(wa,wa.BITCAST).setParameterLength(2),co=(e,t)=>(console.warn('THREE.TSL: "equals" is deprecated. Use "equal" inside a vector instead, like: "bvec*( equal( ... ) )"'),ua(e,t)),ho=Bi(wa,wa.MIN).setParameterLength(2,1/0),po=Bi(wa,wa.MAX).setParameterLength(2,1/0),go=Bi(wa,wa.STEP).setParameterLength(2),mo=Bi(wa,wa.REFLECT).setParameterLength(2),fo=Bi(wa,wa.DISTANCE).setParameterLength(2),yo=Bi(wa,wa.DIFFERENCE).setParameterLength(2),xo=Bi(wa,wa.DOT).setParameterLength(2),bo=Bi(wa,wa.CROSS).setParameterLength(2),To=Bi(wa,wa.POW).setParameterLength(2),_o=Bi(wa,wa.POW,2).setParameterLength(1),vo=Bi(wa,wa.POW,3).setParameterLength(1),No=Bi(wa,wa.POW,4).setParameterLength(1),So=Bi(wa,wa.TRANSFORM_DIRECTION).setParameterLength(2),Eo=e=>na(Za(e),To(Qa(e),1/3)),wo=e=>xo(e,e),Ao=Bi(wa,wa.MIX).setParameterLength(3),Ro=(e,t=0,r=1)=>Pi(new wa(wa.CLAMP,Pi(e),Pi(t),Pi(r))),Co=e=>Ro(e),Mo=Bi(wa,wa.REFRACT).setParameterLength(3),Po=Bi(wa,wa.SMOOTHSTEP).setParameterLength(3),Lo=Bi(wa,wa.FACEFORWARD).setParameterLength(3),Fo=Vi((([e])=>{const t=xo(e.xy,qi(12.9898,78.233)),r=oa(t,Ca);return Ha(Wa(r).mul(43758.5453))})),Bo=(e,t,r)=>Ao(t,r,e),Io=(e,t,r)=>Po(t,r,e),Do=(e,t)=>(console.warn('THREE.TSL: "atan2" is overloaded. Use "atan" instead.'),Ya(e,t)),Vo=Lo,Uo=Ga;ii("all",Pa),ii("any",La),ii("equals",co),ii("radians",Fa),ii("degrees",Ba),ii("exp",Ia),ii("exp2",Da),ii("log",Va),ii("log2",Ua),ii("sqrt",Oa),ii("inverseSqrt",Ga),ii("floor",ka),ii("ceil",za),ii("normalize",$a),ii("fract",Ha),ii("sin",Wa),ii("cos",ja),ii("tan",qa),ii("asin",Xa),ii("acos",Ka),ii("atan",Ya),ii("abs",Qa),ii("sign",Za),ii("length",Ja),ii("lengthSq",wo),ii("negate",eo),ii("oneMinus",to),ii("dFdx",ro),ii("dFdy",so),ii("round",io),ii("reciprocal",no),ii("trunc",ao),ii("fwidth",oo),ii("atan2",Do),ii("min",ho),ii("max",po),ii("step",go),ii("reflect",mo),ii("distance",fo),ii("dot",xo),ii("cross",bo),ii("pow",To),ii("pow2",_o),ii("pow3",vo),ii("pow4",No),ii("transformDirection",So),ii("mix",Bo),ii("clamp",Ro),ii("refract",Mo),ii("smoothstep",Io),ii("faceForward",Lo),ii("difference",yo),ii("saturate",Co),ii("cbrt",Eo),ii("transpose",uo),ii("rand",Fo);class Oo extends $s{static get type(){return"ConditionalNode"}constructor(e,t,r=null){super(),this.condNode=e,this.ifNode=t,this.elseNode=r}getNodeType(e){const{ifNode:t,elseNode:r}=e.getNodeProperties(this);if(void 0===t)return this.setup(e),this.getNodeType(e);const s=t.getNodeType(e);if(null!==r){const t=r.getNodeType(e);if(e.getTypeLength(t)>e.getTypeLength(s))return t}return s}setup(e){const t=this.condNode.cache(),r=this.ifNode.cache(),s=this.elseNode?this.elseNode.cache():null,i=e.context.nodeBlock;e.getDataFromNode(r).parentNodeBlock=i,null!==s&&(e.getDataFromNode(s).parentNodeBlock=i);const n=e.getNodeProperties(this);n.condNode=t,n.ifNode=r.context({nodeBlock:r}),n.elseNode=s?s.context({nodeBlock:s}):null}generate(e,t){const r=this.getNodeType(e),s=e.getDataFromNode(this);if(void 0!==s.nodeProperty)return s.nodeProperty;const{condNode:i,ifNode:n,elseNode:a}=e.getNodeProperties(this),o=e.currentFunctionNode,u="void"!==t,l=u?vn(r).build(e):"";s.nodeProperty=l;const d=i.build(e,"bool");e.addFlowCode(`\n${e.tab}if ( ${d} ) {\n\n`).addFlowTab();let c=n.build(e,r);if(c&&(u?c=l+" = "+c+";":(c="return "+c+";",null===o&&(console.warn("THREE.TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values."),c="// "+c))),e.removeFlowTab().addFlowCode(e.tab+"\t"+c+"\n\n"+e.tab+"}"),null!==a){e.addFlowCode(" else {\n\n").addFlowTab();let t=a.build(e,r);t&&(u?t=l+" = "+t+";":(t="return "+t+";",null===o&&(console.warn("THREE.TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values."),t="// "+t))),e.removeFlowTab().addFlowCode(e.tab+"\t"+t+"\n\n"+e.tab+"}\n\n")}else e.addFlowCode("\n\n");return e.format(l,r,t)}}const Go=Bi(Oo).setParameterLength(2,3);ii("select",Go);const ko=(...e)=>(console.warn("THREE.TSL: cond() has been renamed to select()."),Go(...e));ii("cond",ko);class zo extends $s{static get type(){return"ContextNode"}constructor(e,t={}){super(),this.isContextNode=!0,this.node=e,this.value=t}getScope(){return this.node.getScope()}getNodeType(e){return this.node.getNodeType(e)}analyze(e){this.node.build(e)}setup(e){const t=e.getContext();e.setContext({...e.context,...this.value});const r=this.node.build(e);return e.setContext(t),r}generate(e,t){const r=e.getContext();e.setContext({...e.context,...this.value});const s=this.node.build(e,t);return e.setContext(r),s}}const $o=Bi(zo).setParameterLength(1,2),Ho=(e,t)=>$o(e,{label:t});ii("context",$o),ii("label",Ho);class Wo extends $s{static get type(){return"VarNode"}constructor(e,t=null,r=!1){super(),this.node=e,this.name=t,this.global=!0,this.isVarNode=!0,this.readOnly=r}getMemberType(e,t){return this.node.getMemberType(e,t)}getElementType(e){return this.node.getElementType(e)}getNodeType(e){return this.node.getNodeType(e)}generate(e){const{node:t,name:r,readOnly:s}=this,{renderer:i}=e,n=!0===i.backend.isWebGPUBackend;let a=!1,o=!1;s&&(a=e.isDeterministic(t),o=n?s:a);const u=e.getVectorType(this.getNodeType(e)),l=t.build(e,u),d=e.getVarFromNode(this,r,u,void 0,o),c=e.getPropertyName(d);let h=c;if(o)if(n)h=a?`const ${c}`:`let ${c}`;else{const r=e.getArrayCount(t);h=`const ${e.getVar(d.type,c,r)}`}return e.addLineFlowCode(`${h} = ${l}`,this),c}}const jo=Bi(Wo),qo=(e,t=null)=>jo(e,t).append(),Xo=(e,t=null)=>jo(e,t,!0).append();ii("toVar",qo),ii("toConst",Xo);const Ko=e=>(console.warn('TSL: "temp( node )" is deprecated. Use "Var( node )" or "node.toVar()" instead.'),jo(e));ii("temp",Ko);class Yo extends $s{static get type(){return"VaryingNode"}constructor(e,t=null){super(),this.node=e,this.name=t,this.isVaryingNode=!0}isGlobal(){return!0}getHash(e){return this.name||super.getHash(e)}getNodeType(e){return this.node.getNodeType(e)}setupVarying(e){const t=e.getNodeProperties(this);let r=t.varying;if(void 0===r){const s=this.name,i=this.getNodeType(e);t.varying=r=e.getVaryingFromNode(this,s,i),t.node=this.node}return r.needsInterpolation||(r.needsInterpolation="fragment"===e.shaderStage),r}setup(e){this.setupVarying(e)}analyze(e){return this.setupVarying(e),this.node.analyze(e)}generate(e){const t=e.getNodeProperties(this),r=this.setupVarying(e),s="fragment"===e.shaderStage&&!0===t.reassignPosition&&e.context.needsPositionReassign;if(void 0===t.propertyName||s){const i=this.getNodeType(e),n=e.getPropertyName(r,Bs.VERTEX);e.flowNodeFromShaderStage(Bs.VERTEX,this.node,i,n),t.propertyName=n,s?t.reassignPosition=!1:void 0===t.reassignPosition&&e.context.isPositionNodeInput&&(t.reassignPosition=!0)}return e.getPropertyName(r)}}const Qo=Bi(Yo).setParameterLength(1,2),Zo=e=>Qo(e);ii("toVarying",Qo),ii("toVertexStage",Zo),ii("varying",((...e)=>(console.warn("THREE.TSL: .varying() has been renamed to .toVarying()."),Qo(...e)))),ii("vertexStage",((...e)=>(console.warn("THREE.TSL: .vertexStage() has been renamed to .toVertexStage()."),Qo(...e))));const Jo=Vi((([e])=>{const t=e.mul(.9478672986).add(.0521327014).pow(2.4),r=e.mul(.0773993808),s=e.lessThanEqual(.04045);return Ao(t,r,s)})).setLayout({name:"sRGBTransferEOTF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),eu=Vi((([e])=>{const t=e.pow(.41666).mul(1.055).sub(.055),r=e.mul(12.92),s=e.lessThanEqual(.0031308);return Ao(t,r,s)})).setLayout({name:"sRGBTransferOETF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),tu="WorkingColorSpace",ru="OutputColorSpace";class su extends js{static get type(){return"ColorSpaceNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this.source=t,this.target=r}resolveColorSpace(e,t){return t===tu?c.workingColorSpace:t===ru?e.context.outputColorSpace||e.renderer.outputColorSpace:t}setup(e){const{colorNode:t}=this,r=this.resolveColorSpace(e,this.source),s=this.resolveColorSpace(e,this.target);let i=t;return!1!==c.enabled&&r!==s&&r&&s?(c.getTransfer(r)===h&&(i=tn(Jo(i.rgb),i.a)),c.getPrimaries(r)!==c.getPrimaries(s)&&(i=tn(on(c._getMatrix(new n,r,s)).mul(i.rgb),i.a)),c.getTransfer(s)===h&&(i=tn(eu(i.rgb),i.a)),i):i}}const iu=e=>Pi(new su(Pi(e),tu,ru)),nu=e=>Pi(new su(Pi(e),ru,tu)),au=(e,t)=>Pi(new su(Pi(e),tu,t)),ou=(e,t)=>Pi(new su(Pi(e),t,tu));ii("toOutputColorSpace",iu),ii("toWorkingColorSpace",nu),ii("workingToColorSpace",au),ii("colorSpaceToWorking",ou);let uu=class extends Hs{static get type(){return"ReferenceElementNode"}constructor(e,t){super(e,t),this.referenceNode=e,this.isReferenceElementNode=!0}getNodeType(){return this.referenceNode.uniformType}generate(e){const t=super.generate(e),r=this.referenceNode.getNodeType(),s=this.getNodeType();return e.format(t,r,s)}};class lu extends $s{static get type(){return"ReferenceBaseNode"}constructor(e,t,r=null,s=null){super(),this.property=e,this.uniformType=t,this.object=r,this.count=s,this.properties=e.split("."),this.reference=r,this.node=null,this.group=null,this.updateType=Is.OBJECT}setGroup(e){return this.group=e,this}element(e){return Pi(new uu(this,Pi(e)))}setNodeType(e){const t=Tn(null,e).getSelf();null!==this.group&&t.setGroup(this.group),this.node=t}getNodeType(e){return null===this.node&&(this.updateReference(e),this.updateValue()),this.node.getNodeType(e)}getValueFromReference(e=this.reference){const{properties:t}=this;let r=e[t[0]];for(let e=1;ePi(new du(e,t,r));class hu extends js{static get type(){return"ToneMappingNode"}constructor(e,t=gu,r=null){super("vec3"),this.toneMapping=e,this.exposureNode=t,this.colorNode=r}customCacheKey(){return Ts(this.toneMapping)}setup(e){const t=this.colorNode||e.context.color,r=this.toneMapping;if(r===p)return t;let s=null;const i=e.renderer.library.getToneMappingFunction(r);return null!==i?s=tn(i(t.rgb,this.exposureNode),t.a):(console.error("ToneMappingNode: Unsupported Tone Mapping configuration.",r),s=t),s}}const pu=(e,t,r)=>Pi(new hu(e,Pi(t),Pi(r))),gu=cu("toneMappingExposure","float");ii("toneMapping",((e,t,r)=>pu(t,r,e)));class mu extends Zs{static get type(){return"BufferAttributeNode"}constructor(e,t=null,r=0,s=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferStride=r,this.bufferOffset=s,this.usage=g,this.instanced=!1,this.attribute=null,this.global=!0,e&&!0===e.isBufferAttribute&&(this.attribute=e,this.usage=e.usage,this.instanced=e.isInstancedBufferAttribute)}getHash(e){if(0===this.bufferStride&&0===this.bufferOffset){let t=e.globalCache.getData(this.value);return void 0===t&&(t={node:this},e.globalCache.setData(this.value,t)),t.node.uuid}return this.uuid}getNodeType(e){return null===this.bufferType&&(this.bufferType=e.getTypeFromAttribute(this.attribute)),this.bufferType}setup(e){if(null!==this.attribute)return;const t=this.getNodeType(e),r=this.value,s=e.getTypeLength(t),i=this.bufferStride||s,n=this.bufferOffset,a=!0===r.isInterleavedBuffer?r:new m(r,i),o=new f(a,s,n);a.setUsage(this.usage),this.attribute=o,this.attribute.isInstancedBufferAttribute=this.instanced}generate(e){const t=this.getNodeType(e),r=e.getBufferAttributeFromNode(this,t),s=e.getPropertyName(r);let i=null;if("vertex"===e.shaderStage||"compute"===e.shaderStage)this.name=s,i=s;else{i=Qo(this).build(e,t)}return i}getInputType(){return"bufferAttribute"}setUsage(e){return this.usage=e,this.attribute&&!0===this.attribute.isBufferAttribute&&(this.attribute.usage=e),this}setInstanced(e){return this.instanced=e,this}}const fu=(e,t=null,r=0,s=0)=>Pi(new mu(e,t,r,s)),yu=(e,t=null,r=0,s=0)=>fu(e,t,r,s).setUsage(y),xu=(e,t=null,r=0,s=0)=>fu(e,t,r,s).setInstanced(!0),bu=(e,t=null,r=0,s=0)=>yu(e,t,r,s).setInstanced(!0);ii("toAttribute",(e=>fu(e.value)));class Tu extends $s{static get type(){return"ComputeNode"}constructor(e,t,r=[64]){super("void"),this.isComputeNode=!0,this.computeNode=e,this.count=t,this.workgroupSize=r,this.dispatchCount=0,this.version=1,this.name="",this.updateBeforeType=Is.OBJECT,this.onInitFunction=null,this.updateDispatchCount()}dispose(){this.dispatchEvent({type:"dispose"})}label(e){return this.name=e,this}updateDispatchCount(){const{count:e,workgroupSize:t}=this;let r=t[0];for(let e=1;ePi(new Tu(Pi(e),t,r));ii("compute",_u);class vu extends $s{static get type(){return"CacheNode"}constructor(e,t=!0){super(),this.node=e,this.parent=t,this.isCacheNode=!0}getNodeType(e){const t=e.getCache(),r=e.getCacheFromNode(this,this.parent);e.setCache(r);const s=this.node.getNodeType(e);return e.setCache(t),s}build(e,...t){const r=e.getCache(),s=e.getCacheFromNode(this,this.parent);e.setCache(s);const i=this.node.build(e,...t);return e.setCache(r),i}}const Nu=(e,t)=>Pi(new vu(Pi(e),t));ii("cache",Nu);class Su extends $s{static get type(){return"BypassNode"}constructor(e,t){super(),this.isBypassNode=!0,this.outputNode=e,this.callNode=t}getNodeType(e){return this.outputNode.getNodeType(e)}generate(e){const t=this.callNode.build(e,"void");return""!==t&&e.addLineFlowCode(t,this),this.outputNode.build(e)}}const Eu=Bi(Su).setParameterLength(2);ii("bypass",Eu);class wu extends $s{static get type(){return"RemapNode"}constructor(e,t,r,s=$i(0),i=$i(1)){super(),this.node=e,this.inLowNode=t,this.inHighNode=r,this.outLowNode=s,this.outHighNode=i,this.doClamp=!0}setup(){const{node:e,inLowNode:t,inHighNode:r,outLowNode:s,outHighNode:i,doClamp:n}=this;let a=e.sub(t).div(r.sub(t));return!0===n&&(a=a.clamp()),a.mul(i.sub(s)).add(s)}}const Au=Bi(wu,null,null,{doClamp:!1}).setParameterLength(3,5),Ru=Bi(wu).setParameterLength(3,5);ii("remap",Au),ii("remapClamp",Ru);class Cu extends $s{static get type(){return"ExpressionNode"}constructor(e="",t="void"){super(t),this.snippet=e}generate(e,t){const r=this.getNodeType(e),s=this.snippet;if("void"!==r)return e.format(s,r,t);e.addLineFlowCode(s,this)}}const Mu=Bi(Cu).setParameterLength(1,2),Pu=e=>(e?Go(e,Mu("discard")):Mu("discard")).append();ii("discard",Pu);class Lu extends js{static get type(){return"RenderOutputNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this.toneMapping=t,this.outputColorSpace=r,this.isRenderOutputNode=!0}setup({context:e}){let t=this.colorNode||e.color;const r=(null!==this.toneMapping?this.toneMapping:e.toneMapping)||p,s=(null!==this.outputColorSpace?this.outputColorSpace:e.outputColorSpace)||x;return r!==p&&(t=t.toneMapping(r)),s!==x&&s!==c.workingColorSpace&&(t=t.workingToColorSpace(s)),t}}const Fu=(e,t=null,r=null)=>Pi(new Lu(Pi(e),t,r));ii("renderOutput",Fu);class Bu extends js{static get type(){return"DebugNode"}constructor(e,t=null){super(),this.node=e,this.callback=t}getNodeType(e){return this.node.getNodeType(e)}setup(e){return this.node.build(e)}analyze(e){return this.node.build(e)}generate(e){const t=this.callback,r=this.node.build(e);let s="";return s+="// #--- TSL Debug ---#\n",s+=e.flow.code.replace(/^\t/gm,"")+"\n",s+="/* ... */ "+r+" /* ... */\n",s+="// #-----------------#\n",null!==t?t(s):console.log(s),r}}const Iu=(e,t=null)=>Pi(new Bu(Pi(e),t));ii("debug",Iu);class Du extends $s{static get type(){return"AttributeNode"}constructor(e,t=null){super(t),this.global=!0,this._attributeName=e}getHash(e){return this.getAttributeName(e)}getNodeType(e){let t=this.nodeType;if(null===t){const r=this.getAttributeName(e);if(e.hasGeometryAttribute(r)){const s=e.geometry.getAttribute(r);t=e.getTypeFromAttribute(s)}else t="float"}return t}setAttributeName(e){return this._attributeName=e,this}getAttributeName(){return this._attributeName}generate(e){const t=this.getAttributeName(e),r=this.getNodeType(e);if(!0===e.hasGeometryAttribute(t)){const s=e.geometry.getAttribute(t),i=e.getTypeFromAttribute(s),n=e.getAttribute(t,i);if("vertex"===e.shaderStage)return e.format(n.name,i,r);return Qo(this).build(e,r)}return console.warn(`AttributeNode: Vertex attribute "${t}" not found on geometry.`),e.generateConst(r)}serialize(e){super.serialize(e),e.global=this.global,e._attributeName=this._attributeName}deserialize(e){super.deserialize(e),this.global=e.global,this._attributeName=e._attributeName}}const Vu=(e,t)=>Pi(new Du(e,t)),Uu=(e=0)=>Vu("uv"+(e>0?e:""),"vec2");class Ou extends $s{static get type(){return"TextureSizeNode"}constructor(e,t=null){super("uvec2"),this.isTextureSizeNode=!0,this.textureNode=e,this.levelNode=t}generate(e,t){const r=this.textureNode.build(e,"property"),s=null===this.levelNode?"0":this.levelNode.build(e,"int");return e.format(`${e.getMethod("textureDimensions")}( ${r}, ${s} )`,this.getNodeType(e),t)}}const Gu=Bi(Ou).setParameterLength(1,2);class ku extends bn{static get type(){return"MaxMipLevelNode"}constructor(e){super(0),this._textureNode=e,this.updateType=Is.FRAME}get textureNode(){return this._textureNode}get texture(){return this._textureNode.value}update(){const e=this.texture,t=e.images,r=t&&t.length>0?t[0]&&t[0].image||t[0]:e.image;if(r&&void 0!==r.width){const{width:e,height:t}=r;this.value=Math.log2(Math.max(e,t))}}}const zu=Bi(ku).setParameterLength(1);class $u extends bn{static get type(){return"TextureNode"}constructor(e,t=null,r=null,s=null){super(e),this.isTextureNode=!0,this.uvNode=t,this.levelNode=r,this.biasNode=s,this.compareNode=null,this.depthNode=null,this.gradNode=null,this.sampler=!0,this.updateMatrix=!1,this.updateType=Is.NONE,this.referenceNode=null,this._value=e,this._matrixUniform=null,this.setUpdateMatrix(null===t)}set value(e){this.referenceNode?this.referenceNode.value=e:this._value=e}get value(){return this.referenceNode?this.referenceNode.value:this._value}getUniformHash(){return this.value.uuid}getNodeType(){return!0===this.value.isDepthTexture?"float":this.value.type===b?"uvec4":this.value.type===T?"ivec4":"vec4"}getInputType(){return"texture"}getDefaultUV(){return Uu(this.value.channel)}updateReference(){return this.value}getTransformedUV(e){return null===this._matrixUniform&&(this._matrixUniform=Tn(this.value.matrix)),this._matrixUniform.mul(Qi(e,1)).xy}setUpdateMatrix(e){return this.updateMatrix=e,this.updateType=e?Is.RENDER:Is.NONE,this}setupUV(e,t){const r=this.value;return e.isFlipY()&&(r.image instanceof ImageBitmap&&!0===r.flipY||!0===r.isRenderTargetTexture||!0===r.isFramebufferTexture||!0===r.isDepthTexture)&&(t=this.sampler?t.flipY():t.setY(Hi(Gu(this,this.levelNode).y).sub(t.y).sub(1))),t}setup(e){const t=e.getNodeProperties(this);t.referenceNode=this.referenceNode;const r=this.value;if(!r||!0!==r.isTexture)throw new Error("THREE.TSL: `texture( value )` function expects a valid instance of THREE.Texture().");let s=this.uvNode;null!==s&&!0!==e.context.forceUVContext||!e.context.getUV||(s=e.context.getUV(this)),s||(s=this.getDefaultUV()),!0===this.updateMatrix&&(s=this.getTransformedUV(s)),s=this.setupUV(e,s);let i=this.levelNode;null===i&&e.context.getTextureLevel&&(i=e.context.getTextureLevel(this)),t.uvNode=s,t.levelNode=i,t.biasNode=this.biasNode,t.compareNode=this.compareNode,t.gradNode=this.gradNode,t.depthNode=this.depthNode}generateUV(e,t){return t.build(e,!0===this.sampler?"vec2":"ivec2")}generateSnippet(e,t,r,s,i,n,a,o){const u=this.value;let l;return l=s?e.generateTextureLevel(u,t,r,s,n):i?e.generateTextureBias(u,t,r,i,n):o?e.generateTextureGrad(u,t,r,o,n):a?e.generateTextureCompare(u,t,r,a,n):!1===this.sampler?e.generateTextureLoad(u,t,r,n):e.generateTexture(u,t,r,n),l}generate(e,t){const r=this.value,s=e.getNodeProperties(this),i=super.generate(e,"property");if(/^sampler/.test(t))return i+"_sampler";if(e.isReference(t))return i;{const n=e.getDataFromNode(this);let a=n.propertyName;if(void 0===a){const{uvNode:t,levelNode:r,biasNode:o,compareNode:u,depthNode:l,gradNode:d}=s,c=this.generateUV(e,t),h=r?r.build(e,"float"):null,p=o?o.build(e,"float"):null,g=l?l.build(e,"int"):null,m=u?u.build(e,"float"):null,f=d?[d[0].build(e,"vec2"),d[1].build(e,"vec2")]:null,y=e.getVarFromNode(this);a=e.getPropertyName(y);const x=this.generateSnippet(e,i,c,h,p,g,m,f);e.addLineFlowCode(`${a} = ${x}`,this),n.snippet=x,n.propertyName=a}let o=a;const u=this.getNodeType(e);return e.needsToWorkingColorSpace(r)&&(o=ou(Mu(o,u),r.colorSpace).setup(e).build(e,u)),e.format(o,u,t)}}setSampler(e){return this.sampler=e,this}getSampler(){return this.sampler}uv(e){return console.warn("THREE.TextureNode: .uv() has been renamed. Use .sample() instead."),this.sample(e)}sample(e){const t=this.clone();return t.uvNode=Pi(e),t.referenceNode=this.getSelf(),Pi(t)}blur(e){const t=this.clone();t.biasNode=Pi(e).mul(zu(t)),t.referenceNode=this.getSelf();const r=t.value;return(r&&!1===r.generateMipmaps||r.minFilter===_||r.magFilter===_)&&(console.warn("THREE.TSL: texture().blur() requires mipmaps and sampling. Use .generateMipmaps=true and .minFilter/.magFilter=THREE.LinearFilter in the Texture."),t.biasNode=null),Pi(t)}level(e){const t=this.clone();return t.levelNode=Pi(e),t.referenceNode=this.getSelf(),Pi(t)}size(e){return Gu(this,e)}bias(e){const t=this.clone();return t.biasNode=Pi(e),t.referenceNode=this.getSelf(),Pi(t)}compare(e){const t=this.clone();return t.compareNode=Pi(e),t.referenceNode=this.getSelf(),Pi(t)}grad(e,t){const r=this.clone();return r.gradNode=[Pi(e),Pi(t)],r.referenceNode=this.getSelf(),Pi(r)}depth(e){const t=this.clone();return t.depthNode=Pi(e),t.referenceNode=this.getSelf(),Pi(t)}serialize(e){super.serialize(e),e.value=this.value.toJSON(e.meta).uuid,e.sampler=this.sampler,e.updateMatrix=this.updateMatrix,e.updateType=this.updateType}deserialize(e){super.deserialize(e),this.value=e.meta.textures[e.value],this.sampler=e.sampler,this.updateMatrix=e.updateMatrix,this.updateType=e.updateType}update(){const e=this.value,t=this._matrixUniform;null!==t&&(t.value=e.matrix),!0===e.matrixAutoUpdate&&e.updateMatrix()}clone(){const e=new this.constructor(this.value,this.uvNode,this.levelNode,this.biasNode);return e.sampler=this.sampler,e}}const Hu=Bi($u).setParameterLength(1,4),Wu=(...e)=>Hu(...e).setSampler(!1);class ju extends bn{static get type(){return"BufferNode"}constructor(e,t,r=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferCount=r}getElementType(e){return this.getNodeType(e)}getInputType(){return"buffer"}}const qu=(e,t,r)=>Pi(new ju(e,t,r));class Xu extends Hs{static get type(){return"UniformArrayElementNode"}constructor(e,t){super(e,t),this.isArrayBufferElementNode=!0}generate(e){const t=super.generate(e),r=this.getNodeType(),s=this.node.getPaddedType();return e.format(t,s,r)}}class Ku extends ju{static get type(){return"UniformArrayNode"}constructor(e,t=null){super(null),this.array=e,this.elementType=null===t?Rs(e[0]):t,this.paddedType=this.getPaddedType(),this.updateType=Is.RENDER,this.isArrayBufferNode=!0}getNodeType(){return this.paddedType}getElementType(){return this.elementType}getPaddedType(){const e=this.elementType;let t="vec4";return"mat2"===e?t="mat2":!0===/mat/.test(e)?t="mat4":"i"===e.charAt(0)?t="ivec4":"u"===e.charAt(0)&&(t="uvec4"),t}update(){const{array:e,value:t}=this,r=this.elementType;if("float"===r||"int"===r||"uint"===r)for(let r=0;rPi(new Ku(e,t)),Qu=Tn(0,"uint").setGroup(mn("cameraIndex")).toVarying("v_cameraIndex"),Zu=Tn("float").label("cameraNear").setGroup(yn).onRenderUpdate((({camera:e})=>e.near)),Ju=Tn("float").label("cameraFar").setGroup(yn).onRenderUpdate((({camera:e})=>e.far)),el=Vi((({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrix);t=Yu(r).setGroup(yn).label("cameraProjectionMatrices").element(Qu).toVar("cameraProjectionMatrix")}else t=Tn("mat4").label("cameraProjectionMatrix").setGroup(yn).onRenderUpdate((({camera:e})=>e.projectionMatrix));return t})).once()(),tl=Tn("mat4").label("cameraProjectionMatrixInverse").setGroup(yn).onRenderUpdate((({camera:e})=>e.projectionMatrixInverse)),rl=Vi((({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.matrixWorldInverse);t=Yu(r).setGroup(yn).label("cameraViewMatrices").element(Qu).toVar("cameraViewMatrix")}else t=Tn("mat4").label("cameraViewMatrix").setGroup(yn).onRenderUpdate((({camera:e})=>e.matrixWorldInverse));return t})).once()(),sl=Tn("mat4").label("cameraWorldMatrix").setGroup(yn).onRenderUpdate((({camera:e})=>e.matrixWorld)),il=Tn("mat3").label("cameraNormalMatrix").setGroup(yn).onRenderUpdate((({camera:e})=>e.normalMatrix)),nl=Tn(new r).label("cameraPosition").setGroup(yn).onRenderUpdate((({camera:e},t)=>t.value.setFromMatrixPosition(e.matrixWorld))),al=new v;class ol extends $s{static get type(){return"Object3DNode"}constructor(e,t=null){super(),this.scope=e,this.object3d=t,this.updateType=Is.OBJECT,this._uniformNode=new bn(null)}getNodeType(){const e=this.scope;return e===ol.WORLD_MATRIX?"mat4":e===ol.POSITION||e===ol.VIEW_POSITION||e===ol.DIRECTION||e===ol.SCALE?"vec3":e===ol.RADIUS?"float":void 0}update(e){const t=this.object3d,s=this._uniformNode,i=this.scope;if(i===ol.WORLD_MATRIX)s.value=t.matrixWorld;else if(i===ol.POSITION)s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld);else if(i===ol.SCALE)s.value=s.value||new r,s.value.setFromMatrixScale(t.matrixWorld);else if(i===ol.DIRECTION)s.value=s.value||new r,t.getWorldDirection(s.value);else if(i===ol.VIEW_POSITION){const i=e.camera;s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld),s.value.applyMatrix4(i.matrixWorldInverse)}else if(i===ol.RADIUS){const r=e.object.geometry;null===r.boundingSphere&&r.computeBoundingSphere(),al.copy(r.boundingSphere).applyMatrix4(t.matrixWorld),s.value=al.radius}}generate(e){const t=this.scope;return t===ol.WORLD_MATRIX?this._uniformNode.nodeType="mat4":t===ol.POSITION||t===ol.VIEW_POSITION||t===ol.DIRECTION||t===ol.SCALE?this._uniformNode.nodeType="vec3":t===ol.RADIUS&&(this._uniformNode.nodeType="float"),this._uniformNode.build(e)}serialize(e){super.serialize(e),e.scope=this.scope}deserialize(e){super.deserialize(e),this.scope=e.scope}}ol.WORLD_MATRIX="worldMatrix",ol.POSITION="position",ol.SCALE="scale",ol.VIEW_POSITION="viewPosition",ol.DIRECTION="direction",ol.RADIUS="radius";const ul=Bi(ol,ol.DIRECTION).setParameterLength(1),ll=Bi(ol,ol.WORLD_MATRIX).setParameterLength(1),dl=Bi(ol,ol.POSITION).setParameterLength(1),cl=Bi(ol,ol.SCALE).setParameterLength(1),hl=Bi(ol,ol.VIEW_POSITION).setParameterLength(1),pl=Bi(ol,ol.RADIUS).setParameterLength(1);class gl extends ol{static get type(){return"ModelNode"}constructor(e){super(e)}update(e){this.object3d=e.object,super.update(e)}}const ml=Ii(gl,gl.DIRECTION),fl=Ii(gl,gl.WORLD_MATRIX),yl=Ii(gl,gl.POSITION),xl=Ii(gl,gl.SCALE),bl=Ii(gl,gl.VIEW_POSITION),Tl=Ii(gl,gl.RADIUS),_l=Tn(new n).onObjectUpdate((({object:e},t)=>t.value.getNormalMatrix(e.matrixWorld))),vl=Tn(new a).onObjectUpdate((({object:e},t)=>t.value.copy(e.matrixWorld).invert())),Nl=Vi((e=>e.renderer.nodes.modelViewMatrix||Sl)).once()().toVar("modelViewMatrix"),Sl=rl.mul(fl),El=Vi((e=>(e.context.isHighPrecisionModelViewMatrix=!0,Tn("mat4").onObjectUpdate((({object:e,camera:t})=>e.modelViewMatrix.multiplyMatrices(t.matrixWorldInverse,e.matrixWorld)))))).once()().toVar("highpModelViewMatrix"),wl=Vi((e=>{const t=e.context.isHighPrecisionModelViewMatrix;return Tn("mat3").onObjectUpdate((({object:e,camera:r})=>(!0!==t&&e.modelViewMatrix.multiplyMatrices(r.matrixWorldInverse,e.matrixWorld),e.normalMatrix.getNormalMatrix(e.modelViewMatrix))))})).once()().toVar("highpModelNormalViewMatrix"),Al=Vu("position","vec3"),Rl=Al.toVarying("positionLocal"),Cl=Al.toVarying("positionPrevious"),Ml=fl.mul(Rl).xyz.toVarying("v_positionWorld").context({needsPositionReassign:!0}),Pl=Rl.transformDirection(fl).toVarying("v_positionWorldDirection").normalize().toVar("positionWorldDirection").context({needsPositionReassign:!0}),Ll=Vi((e=>e.context.setupPositionView()),"vec3").once()().toVarying("v_positionView").context({needsPositionReassign:!0}),Fl=Ll.negate().toVarying("v_positionViewDirection").normalize().toVar("positionViewDirection");class Bl extends $s{static get type(){return"FrontFacingNode"}constructor(){super("bool"),this.isFrontFacingNode=!0}generate(e){const{renderer:t,material:r}=e;return t.coordinateSystem===l&&r.side===N?"false":e.getFrontFacing()}}const Il=Ii(Bl),Dl=$i(Il).mul(2).sub(1),Vl=Vu("normal","vec3"),Ul=Vi((e=>!1===e.geometry.hasAttribute("normal")?(console.warn('THREE.TSL: Vertex attribute "normal" not found on geometry.'),Qi(0,1,0)):Vl),"vec3").once()().toVar("normalLocal"),Ol=Ll.dFdx().cross(Ll.dFdy()).normalize().toVar("normalFlat"),Gl=Vi((e=>{let t;return t=!0===e.material.flatShading?Ol:Qo(jl(Ul),"v_normalView").normalize(),t}),"vec3").once()().toVar("normalView"),kl=Qo(Gl.transformDirection(rl),"v_normalWorld").normalize().toVar("normalWorld"),zl=Vi((e=>e.context.setupNormal().context({getUV:null})),"vec3").once()().mul(Dl).toVar("transformedNormalView"),$l=zl.transformDirection(rl).toVar("transformedNormalWorld"),Hl=Vi((e=>e.context.setupClearcoatNormal().context({getUV:null})),"vec3").once()().mul(Dl).toVar("transformedClearcoatNormalView"),Wl=Vi((([e,t=fl])=>{const r=on(t),s=e.div(Qi(r[0].dot(r[0]),r[1].dot(r[1]),r[2].dot(r[2])));return r.mul(s).xyz})),jl=Vi((([e],t)=>{const r=t.renderer.nodes.modelNormalViewMatrix;if(null!==r)return r.transformDirection(e);const s=_l.mul(e);return rl.transformDirection(s)})),ql=new S,Xl=new a,Kl=Tn(0).onReference((({material:e})=>e)).onObjectUpdate((({material:e})=>e.refractionRatio)),Yl=Tn(1).onReference((({material:e})=>e)).onObjectUpdate((function({material:e,scene:t}){return e.envMap?e.envMapIntensity:t.environmentIntensity})),Ql=Tn(new a).onReference((function(e){return e.material})).onObjectUpdate((function({material:e,scene:t}){const r=null!==t.environment&&null===e.envMap?t.environmentRotation:e.envMapRotation;return r?(ql.copy(r),Xl.makeRotationFromEuler(ql)):Xl.identity(),Xl})),Zl=Fl.negate().reflect(zl),Jl=Fl.negate().refract(zl,Kl),ed=Zl.transformDirection(rl).toVar("reflectVector"),td=Jl.transformDirection(rl).toVar("reflectVector");class rd extends $u{static get type(){return"CubeTextureNode"}constructor(e,t=null,r=null,s=null){super(e,t,r,s),this.isCubeTextureNode=!0}getInputType(){return"cubeTexture"}getDefaultUV(){const e=this.value;return e.mapping===E?ed:e.mapping===w?td:(console.error('THREE.CubeTextureNode: Mapping "%s" not supported.',e.mapping),Qi(0,0,0))}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return e.renderer.coordinateSystem!==d&&r.isRenderTargetTexture||(t=Qi(t.x.negate(),t.yz)),Ql.mul(t)}generateUV(e,t){return t.build(e,"vec3")}}const sd=Bi(rd).setParameterLength(1,4).setName("cubeTexture");class id extends Hs{static get type(){return"ReferenceElementNode"}constructor(e,t){super(e,t),this.referenceNode=e,this.isReferenceElementNode=!0}getNodeType(){return this.referenceNode.uniformType}generate(e){const t=super.generate(e),r=this.referenceNode.getNodeType(),s=this.getNodeType();return e.format(t,r,s)}}class nd extends $s{static get type(){return"ReferenceNode"}constructor(e,t,r=null,s=null){super(),this.property=e,this.uniformType=t,this.object=r,this.count=s,this.properties=e.split("."),this.reference=r,this.node=null,this.group=null,this.name=null,this.updateType=Is.OBJECT}element(e){return Pi(new id(this,Pi(e)))}setGroup(e){return this.group=e,this}label(e){return this.name=e,this}setNodeType(e){let t=null;t=null!==this.count?qu(null,e,this.count):Array.isArray(this.getValueFromReference())?Yu(null,e):"texture"===e?Hu(null):"cubeTexture"===e?sd(null):Tn(null,e),null!==this.group&&t.setGroup(this.group),null!==this.name&&t.label(this.name),this.node=t.getSelf()}getNodeType(e){return null===this.node&&(this.updateReference(e),this.updateValue()),this.node.getNodeType(e)}getValueFromReference(e=this.reference){const{properties:t}=this;let r=e[t[0]];for(let e=1;ePi(new nd(e,t,r)),od=(e,t,r,s)=>Pi(new nd(e,t,s,r));class ud extends nd{static get type(){return"MaterialReferenceNode"}constructor(e,t,r=null){super(e,t,r),this.material=r,this.isMaterialReferenceNode=!0}updateReference(e){return this.reference=null!==this.material?this.material:e.material,this.reference}}const ld=(e,t,r=null)=>Pi(new ud(e,t,r)),dd=Vi((e=>(!1===e.geometry.hasAttribute("tangent")&&e.geometry.computeTangents(),Vu("tangent","vec4"))))(),cd=dd.xyz.toVar("tangentLocal"),hd=Nl.mul(tn(cd,0)).xyz.toVarying("v_tangentView").normalize().toVar("tangentView"),pd=hd.transformDirection(rl).toVarying("v_tangentWorld").normalize().toVar("tangentWorld"),gd=hd.toVar("transformedTangentView"),md=gd.transformDirection(rl).normalize().toVar("transformedTangentWorld"),fd=e=>e.mul(dd.w).xyz,yd=Qo(fd(Vl.cross(dd)),"v_bitangentGeometry").normalize().toVar("bitangentGeometry"),xd=Qo(fd(Ul.cross(cd)),"v_bitangentLocal").normalize().toVar("bitangentLocal"),bd=Qo(fd(Gl.cross(hd)),"v_bitangentView").normalize().toVar("bitangentView"),Td=Qo(fd(kl.cross(pd)),"v_bitangentWorld").normalize().toVar("bitangentWorld"),_d=fd(zl.cross(gd)).normalize().toVar("transformedBitangentView"),vd=_d.transformDirection(rl).normalize().toVar("transformedBitangentWorld"),Nd=on(hd,bd,Gl),Sd=Fl.mul(Nd),Ed=(()=>{let e=Un.cross(Fl);return e=e.cross(Un).normalize(),e=Ao(e,zl,Dn.mul(wn.oneMinus()).oneMinus().pow2().pow2()).normalize(),e})(),wd=Vi((e=>{const{eye_pos:t,surf_norm:r,mapN:s,uv:i}=e,n=t.dFdx(),a=t.dFdy(),o=i.dFdx(),u=i.dFdy(),l=r,d=a.cross(l),c=l.cross(n),h=d.mul(o.x).add(c.mul(u.x)),p=d.mul(o.y).add(c.mul(u.y)),g=h.dot(h).max(p.dot(p)),m=Dl.mul(g.inverseSqrt());return sa(h.mul(s.x,m),p.mul(s.y,m),l.mul(s.z)).normalize()}));class Ad extends js{static get type(){return"NormalMapNode"}constructor(e,t=null){super("vec3"),this.node=e,this.scaleNode=t,this.normalMapType=A}setup(e){const{normalMapType:t,scaleNode:r}=this;let s=this.node.mul(2).sub(1);null!==r&&(s=Qi(s.xy.mul(r),s.z));let i=null;if(t===R)i=jl(s);else if(t===A){i=!0===e.hasGeometryAttribute("tangent")?Nd.mul(s).normalize():wd({eye_pos:Ll,surf_norm:Gl,mapN:s,uv:Uu()})}return i}}const Rd=Bi(Ad).setParameterLength(1,2),Cd=Vi((({textureNode:e,bumpScale:t})=>{const r=t=>e.cache().context({getUV:e=>t(e.uvNode||Uu()),forceUVContext:!0}),s=$i(r((e=>e)));return qi($i(r((e=>e.add(e.dFdx())))).sub(s),$i(r((e=>e.add(e.dFdy())))).sub(s)).mul(t)})),Md=Vi((e=>{const{surf_pos:t,surf_norm:r,dHdxy:s}=e,i=t.dFdx().normalize(),n=r,a=t.dFdy().normalize().cross(n),o=n.cross(i),u=i.dot(a).mul(Dl),l=u.sign().mul(s.x.mul(a).add(s.y.mul(o)));return u.abs().mul(r).sub(l).normalize()}));class Pd extends js{static get type(){return"BumpMapNode"}constructor(e,t=null){super("vec3"),this.textureNode=e,this.scaleNode=t}setup(){const e=null!==this.scaleNode?this.scaleNode:1,t=Cd({textureNode:this.textureNode,bumpScale:e});return Md({surf_pos:Ll,surf_norm:Gl,dHdxy:t})}}const Ld=Bi(Pd).setParameterLength(1,2),Fd=new Map;class Bd extends $s{static get type(){return"MaterialNode"}constructor(e){super(),this.scope=e}getCache(e,t){let r=Fd.get(e);return void 0===r&&(r=ld(e,t),Fd.set(e,r)),r}getFloat(e){return this.getCache(e,"float")}getColor(e){return this.getCache(e,"color")}getTexture(e){return this.getCache("map"===e?"map":e+"Map","texture")}setup(e){const t=e.context.material,r=this.scope;let s=null;if(r===Bd.COLOR){const e=void 0!==t.color?this.getColor(r):Qi();s=t.map&&!0===t.map.isTexture?e.mul(this.getTexture("map")):e}else if(r===Bd.OPACITY){const e=this.getFloat(r);s=t.alphaMap&&!0===t.alphaMap.isTexture?e.mul(this.getTexture("alpha")):e}else if(r===Bd.SPECULAR_STRENGTH)s=t.specularMap&&!0===t.specularMap.isTexture?this.getTexture("specular").r:$i(1);else if(r===Bd.SPECULAR_INTENSITY){const e=this.getFloat(r);s=t.specularIntensityMap&&!0===t.specularIntensityMap.isTexture?e.mul(this.getTexture(r).a):e}else if(r===Bd.SPECULAR_COLOR){const e=this.getColor(r);s=t.specularColorMap&&!0===t.specularColorMap.isTexture?e.mul(this.getTexture(r).rgb):e}else if(r===Bd.ROUGHNESS){const e=this.getFloat(r);s=t.roughnessMap&&!0===t.roughnessMap.isTexture?e.mul(this.getTexture(r).g):e}else if(r===Bd.METALNESS){const e=this.getFloat(r);s=t.metalnessMap&&!0===t.metalnessMap.isTexture?e.mul(this.getTexture(r).b):e}else if(r===Bd.EMISSIVE){const e=this.getFloat("emissiveIntensity"),i=this.getColor(r).mul(e);s=t.emissiveMap&&!0===t.emissiveMap.isTexture?i.mul(this.getTexture(r)):i}else if(r===Bd.NORMAL)t.normalMap?(s=Rd(this.getTexture("normal"),this.getCache("normalScale","vec2")),s.normalMapType=t.normalMapType):s=t.bumpMap?Ld(this.getTexture("bump").r,this.getFloat("bumpScale")):Gl;else if(r===Bd.CLEARCOAT){const e=this.getFloat(r);s=t.clearcoatMap&&!0===t.clearcoatMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===Bd.CLEARCOAT_ROUGHNESS){const e=this.getFloat(r);s=t.clearcoatRoughnessMap&&!0===t.clearcoatRoughnessMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===Bd.CLEARCOAT_NORMAL)s=t.clearcoatNormalMap?Rd(this.getTexture(r),this.getCache(r+"Scale","vec2")):Gl;else if(r===Bd.SHEEN){const e=this.getColor("sheenColor").mul(this.getFloat("sheen"));s=t.sheenColorMap&&!0===t.sheenColorMap.isTexture?e.mul(this.getTexture("sheenColor").rgb):e}else if(r===Bd.SHEEN_ROUGHNESS){const e=this.getFloat(r);s=t.sheenRoughnessMap&&!0===t.sheenRoughnessMap.isTexture?e.mul(this.getTexture(r).a):e,s=s.clamp(.07,1)}else if(r===Bd.ANISOTROPY)if(t.anisotropyMap&&!0===t.anisotropyMap.isTexture){const e=this.getTexture(r);s=an(xc.x,xc.y,xc.y.negate(),xc.x).mul(e.rg.mul(2).sub(qi(1)).normalize().mul(e.b))}else s=xc;else if(r===Bd.IRIDESCENCE_THICKNESS){const e=ad("1","float",t.iridescenceThicknessRange);if(t.iridescenceThicknessMap){const i=ad("0","float",t.iridescenceThicknessRange);s=e.sub(i).mul(this.getTexture(r).g).add(i)}else s=e}else if(r===Bd.TRANSMISSION){const e=this.getFloat(r);s=t.transmissionMap?e.mul(this.getTexture(r).r):e}else if(r===Bd.THICKNESS){const e=this.getFloat(r);s=t.thicknessMap?e.mul(this.getTexture(r).g):e}else if(r===Bd.IOR)s=this.getFloat(r);else if(r===Bd.LIGHT_MAP)s=this.getTexture(r).rgb.mul(this.getFloat("lightMapIntensity"));else if(r===Bd.AO)s=this.getTexture(r).r.sub(1).mul(this.getFloat("aoMapIntensity")).add(1);else{const t=this.getNodeType(e);s=this.getCache(r,t)}return s}}Bd.ALPHA_TEST="alphaTest",Bd.COLOR="color",Bd.OPACITY="opacity",Bd.SHININESS="shininess",Bd.SPECULAR="specular",Bd.SPECULAR_STRENGTH="specularStrength",Bd.SPECULAR_INTENSITY="specularIntensity",Bd.SPECULAR_COLOR="specularColor",Bd.REFLECTIVITY="reflectivity",Bd.ROUGHNESS="roughness",Bd.METALNESS="metalness",Bd.NORMAL="normal",Bd.CLEARCOAT="clearcoat",Bd.CLEARCOAT_ROUGHNESS="clearcoatRoughness",Bd.CLEARCOAT_NORMAL="clearcoatNormal",Bd.EMISSIVE="emissive",Bd.ROTATION="rotation",Bd.SHEEN="sheen",Bd.SHEEN_ROUGHNESS="sheenRoughness",Bd.ANISOTROPY="anisotropy",Bd.IRIDESCENCE="iridescence",Bd.IRIDESCENCE_IOR="iridescenceIOR",Bd.IRIDESCENCE_THICKNESS="iridescenceThickness",Bd.IOR="ior",Bd.TRANSMISSION="transmission",Bd.THICKNESS="thickness",Bd.ATTENUATION_DISTANCE="attenuationDistance",Bd.ATTENUATION_COLOR="attenuationColor",Bd.LINE_SCALE="scale",Bd.LINE_DASH_SIZE="dashSize",Bd.LINE_GAP_SIZE="gapSize",Bd.LINE_WIDTH="linewidth",Bd.LINE_DASH_OFFSET="dashOffset",Bd.POINT_SIZE="size",Bd.DISPERSION="dispersion",Bd.LIGHT_MAP="light",Bd.AO="ao";const Id=Ii(Bd,Bd.ALPHA_TEST),Dd=Ii(Bd,Bd.COLOR),Vd=Ii(Bd,Bd.SHININESS),Ud=Ii(Bd,Bd.EMISSIVE),Od=Ii(Bd,Bd.OPACITY),Gd=Ii(Bd,Bd.SPECULAR),kd=Ii(Bd,Bd.SPECULAR_INTENSITY),zd=Ii(Bd,Bd.SPECULAR_COLOR),$d=Ii(Bd,Bd.SPECULAR_STRENGTH),Hd=Ii(Bd,Bd.REFLECTIVITY),Wd=Ii(Bd,Bd.ROUGHNESS),jd=Ii(Bd,Bd.METALNESS),qd=Ii(Bd,Bd.NORMAL),Xd=Ii(Bd,Bd.CLEARCOAT),Kd=Ii(Bd,Bd.CLEARCOAT_ROUGHNESS),Yd=Ii(Bd,Bd.CLEARCOAT_NORMAL),Qd=Ii(Bd,Bd.ROTATION),Zd=Ii(Bd,Bd.SHEEN),Jd=Ii(Bd,Bd.SHEEN_ROUGHNESS),ec=Ii(Bd,Bd.ANISOTROPY),tc=Ii(Bd,Bd.IRIDESCENCE),rc=Ii(Bd,Bd.IRIDESCENCE_IOR),sc=Ii(Bd,Bd.IRIDESCENCE_THICKNESS),ic=Ii(Bd,Bd.TRANSMISSION),nc=Ii(Bd,Bd.THICKNESS),ac=Ii(Bd,Bd.IOR),oc=Ii(Bd,Bd.ATTENUATION_DISTANCE),uc=Ii(Bd,Bd.ATTENUATION_COLOR),lc=Ii(Bd,Bd.LINE_SCALE),dc=Ii(Bd,Bd.LINE_DASH_SIZE),cc=Ii(Bd,Bd.LINE_GAP_SIZE),hc=Ii(Bd,Bd.LINE_WIDTH),pc=Ii(Bd,Bd.LINE_DASH_OFFSET),gc=Ii(Bd,Bd.POINT_SIZE),mc=Ii(Bd,Bd.DISPERSION),fc=Ii(Bd,Bd.LIGHT_MAP),yc=Ii(Bd,Bd.AO),xc=Tn(new t).onReference((function(e){return e.material})).onRenderUpdate((function({material:e}){this.value.set(e.anisotropy*Math.cos(e.anisotropyRotation),e.anisotropy*Math.sin(e.anisotropyRotation))})),bc=Vi((e=>e.context.setupModelViewProjection()),"vec4").once()().toVarying("v_modelViewProjection");class Tc extends $s{static get type(){return"IndexNode"}constructor(e){super("uint"),this.scope=e,this.isIndexNode=!0}generate(e){const t=this.getNodeType(e),r=this.scope;let s,i;if(r===Tc.VERTEX)s=e.getVertexIndex();else if(r===Tc.INSTANCE)s=e.getInstanceIndex();else if(r===Tc.DRAW)s=e.getDrawIndex();else if(r===Tc.INVOCATION_LOCAL)s=e.getInvocationLocalIndex();else if(r===Tc.INVOCATION_SUBGROUP)s=e.getInvocationSubgroupIndex();else{if(r!==Tc.SUBGROUP)throw new Error("THREE.IndexNode: Unknown scope: "+r);s=e.getSubgroupIndex()}if("vertex"===e.shaderStage||"compute"===e.shaderStage)i=s;else{i=Qo(this).build(e,t)}return i}}Tc.VERTEX="vertex",Tc.INSTANCE="instance",Tc.SUBGROUP="subgroup",Tc.INVOCATION_LOCAL="invocationLocal",Tc.INVOCATION_SUBGROUP="invocationSubgroup",Tc.DRAW="draw";const _c=Ii(Tc,Tc.VERTEX),vc=Ii(Tc,Tc.INSTANCE),Nc=Ii(Tc,Tc.SUBGROUP),Sc=Ii(Tc,Tc.INVOCATION_SUBGROUP),Ec=Ii(Tc,Tc.INVOCATION_LOCAL),wc=Ii(Tc,Tc.DRAW);class Ac extends $s{static get type(){return"InstanceNode"}constructor(e,t,r){super("void"),this.count=e,this.instanceMatrix=t,this.instanceColor=r,this.instanceMatrixNode=null,this.instanceColorNode=null,this.updateType=Is.FRAME,this.buffer=null,this.bufferColor=null}setup(e){const{count:t,instanceMatrix:r,instanceColor:s}=this;let{instanceMatrixNode:i,instanceColorNode:n}=this;if(null===i){if(t<=1e3)i=qu(r.array,"mat4",Math.max(t,1)).element(vc);else{const e=new C(r.array,16,1);this.buffer=e;const t=r.usage===y?bu:xu,s=[t(e,"vec4",16,0),t(e,"vec4",16,4),t(e,"vec4",16,8),t(e,"vec4",16,12)];i=un(...s)}this.instanceMatrixNode=i}if(s&&null===n){const e=new M(s.array,3),t=s.usage===y?bu:xu;this.bufferColor=e,n=Qi(t(e,"vec3",3,0)),this.instanceColorNode=n}const a=i.mul(Rl).xyz;if(Rl.assign(a),e.hasGeometryAttribute("normal")){const e=Wl(Ul,i);Ul.assign(e)}null!==this.instanceColorNode&&Nn("vec3","vInstanceColor").assign(this.instanceColorNode)}update(){this.instanceMatrix.usage!==y&&null!==this.buffer&&this.instanceMatrix.version!==this.buffer.version&&(this.buffer.version=this.instanceMatrix.version),this.instanceColor&&this.instanceColor.usage!==y&&null!==this.bufferColor&&this.instanceColor.version!==this.bufferColor.version&&(this.bufferColor.version=this.instanceColor.version)}}const Rc=Bi(Ac).setParameterLength(3);class Cc extends Ac{static get type(){return"InstancedMeshNode"}constructor(e){const{count:t,instanceMatrix:r,instanceColor:s}=e;super(t,r,s),this.instancedMesh=e}}const Mc=Bi(Cc).setParameterLength(1);class Pc extends $s{static get type(){return"BatchNode"}constructor(e){super("void"),this.batchMesh=e,this.batchingIdNode=null}setup(e){null===this.batchingIdNode&&(null===e.getDrawIndex()?this.batchingIdNode=vc:this.batchingIdNode=wc);const t=Vi((([e])=>{const t=Hi(Gu(Wu(this.batchMesh._indirectTexture),0).x),r=Hi(e).mod(t),s=Hi(e).div(t);return Wu(this.batchMesh._indirectTexture,Xi(r,s)).x})).setLayout({name:"getIndirectIndex",type:"uint",inputs:[{name:"id",type:"int"}]}),r=t(Hi(this.batchingIdNode)),s=this.batchMesh._matricesTexture,i=Hi(Gu(Wu(s),0).x),n=$i(r).mul(4).toInt().toVar(),a=n.mod(i),o=n.div(i),u=un(Wu(s,Xi(a,o)),Wu(s,Xi(a.add(1),o)),Wu(s,Xi(a.add(2),o)),Wu(s,Xi(a.add(3),o))),l=this.batchMesh._colorsTexture;if(null!==l){const e=Vi((([e])=>{const t=Hi(Gu(Wu(l),0).x),r=e,s=r.mod(t),i=r.div(t);return Wu(l,Xi(s,i)).rgb})).setLayout({name:"getBatchingColor",type:"vec3",inputs:[{name:"id",type:"int"}]}),t=e(r);Nn("vec3","vBatchColor").assign(t)}const d=on(u);Rl.assign(u.mul(Rl));const c=Ul.div(Qi(d[0].dot(d[0]),d[1].dot(d[1]),d[2].dot(d[2]))),h=d.mul(c).xyz;Ul.assign(h),e.hasGeometryAttribute("tangent")&&cd.mulAssign(d)}}const Lc=Bi(Pc).setParameterLength(1);class Fc extends Hs{static get type(){return"StorageArrayElementNode"}constructor(e,t){super(e,t),this.isStorageArrayElementNode=!0}set storageBufferNode(e){this.node=e}get storageBufferNode(){return this.node}getMemberType(e,t){const r=this.storageBufferNode.structTypeNode;return r?r.getMemberType(e,t):"void"}setup(e){return!1===e.isAvailable("storageBuffer")&&!0===this.node.isPBO&&e.setupPBO(this.node),super.setup(e)}generate(e,t){let r;const s=e.context.assign;if(r=!1===e.isAvailable("storageBuffer")?!0!==this.node.isPBO||!0===s||!this.node.value.isInstancedBufferAttribute&&"compute"===e.shaderStage?this.node.build(e):e.generatePBO(this):super.generate(e),!0!==s){const s=this.getNodeType(e);r=e.format(r,s,t)}return r}}const Bc=Bi(Fc).setParameterLength(2);class Ic extends ju{static get type(){return"StorageBufferNode"}constructor(e,t=null,r=0){let s,i=null;t&&t.isStruct?(s="struct",i=t.layout):null===t&&(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute)?(s=Es(e.itemSize),r=e.count):s=t,super(e,s,r),this.isStorageBufferNode=!0,this.structTypeNode=i,this.access=Vs.READ_WRITE,this.isAtomic=!1,this.isPBO=!1,this._attribute=null,this._varying=null,this.global=!0,!0!==e.isStorageBufferAttribute&&!0!==e.isStorageInstancedBufferAttribute&&(e.isInstancedBufferAttribute?e.isStorageInstancedBufferAttribute=!0:e.isStorageBufferAttribute=!0)}getHash(e){if(0===this.bufferCount){let t=e.globalCache.getData(this.value);return void 0===t&&(t={node:this},e.globalCache.setData(this.value,t)),t.node.uuid}return this.uuid}getInputType(){return this.value.isIndirectStorageBufferAttribute?"indirectStorageBuffer":"storageBuffer"}element(e){return Bc(this,e)}setPBO(e){return this.isPBO=e,this}getPBO(){return this.isPBO}setAccess(e){return this.access=e,this}toReadOnly(){return this.setAccess(Vs.READ_ONLY)}setAtomic(e){return this.isAtomic=e,this}toAtomic(){return this.setAtomic(!0)}getAttributeData(){return null===this._attribute&&(this._attribute=fu(this.value),this._varying=Qo(this._attribute)),{attribute:this._attribute,varying:this._varying}}getNodeType(e){if(null!==this.structTypeNode)return this.structTypeNode.getNodeType(e);if(e.isAvailable("storageBuffer")||e.isAvailable("indirectStorageBuffer"))return super.getNodeType(e);const{attribute:t}=this.getAttributeData();return t.getNodeType(e)}generate(e){if(null!==this.structTypeNode&&this.structTypeNode.build(e),e.isAvailable("storageBuffer")||e.isAvailable("indirectStorageBuffer"))return super.generate(e);const{attribute:t,varying:r}=this.getAttributeData(),s=r.build(e);return e.registerTransform(s,t),s}}const Dc=(e,t=null,r=0)=>Pi(new Ic(e,t,r)),Vc=new WeakMap;class Uc extends $s{static get type(){return"SkinningNode"}constructor(e){super("void"),this.skinnedMesh=e,this.updateType=Is.OBJECT,this.skinIndexNode=Vu("skinIndex","uvec4"),this.skinWeightNode=Vu("skinWeight","vec4"),this.bindMatrixNode=ad("bindMatrix","mat4"),this.bindMatrixInverseNode=ad("bindMatrixInverse","mat4"),this.boneMatricesNode=od("skeleton.boneMatrices","mat4",e.skeleton.bones.length),this.positionNode=Rl,this.toPositionNode=Rl,this.previousBoneMatricesNode=null}getSkinnedPosition(e=this.boneMatricesNode,t=this.positionNode){const{skinIndexNode:r,skinWeightNode:s,bindMatrixNode:i,bindMatrixInverseNode:n}=this,a=e.element(r.x),o=e.element(r.y),u=e.element(r.z),l=e.element(r.w),d=i.mul(t),c=sa(a.mul(s.x).mul(d),o.mul(s.y).mul(d),u.mul(s.z).mul(d),l.mul(s.w).mul(d));return n.mul(c).xyz}getSkinnedNormal(e=this.boneMatricesNode,t=Ul){const{skinIndexNode:r,skinWeightNode:s,bindMatrixNode:i,bindMatrixInverseNode:n}=this,a=e.element(r.x),o=e.element(r.y),u=e.element(r.z),l=e.element(r.w);let d=sa(s.x.mul(a),s.y.mul(o),s.z.mul(u),s.w.mul(l));return d=n.mul(d).mul(i),d.transformDirection(t).xyz}getPreviousSkinnedPosition(e){const t=e.object;return null===this.previousBoneMatricesNode&&(t.skeleton.previousBoneMatrices=new Float32Array(t.skeleton.boneMatrices),this.previousBoneMatricesNode=od("skeleton.previousBoneMatrices","mat4",t.skeleton.bones.length)),this.getSkinnedPosition(this.previousBoneMatricesNode,Cl)}needsPreviousBoneMatrices(e){const t=e.renderer.getMRT();return t&&t.has("velocity")||!0===Ms(e.object).useVelocity}setup(e){this.needsPreviousBoneMatrices(e)&&Cl.assign(this.getPreviousSkinnedPosition(e));const t=this.getSkinnedPosition();if(this.toPositionNode&&this.toPositionNode.assign(t),e.hasGeometryAttribute("normal")){const t=this.getSkinnedNormal();Ul.assign(t),e.hasGeometryAttribute("tangent")&&cd.assign(t)}return t}generate(e,t){if("void"!==t)return super.generate(e,t)}update(e){const t=e.object&&e.object.skeleton?e.object.skeleton:this.skinnedMesh.skeleton;Vc.get(t)!==e.frameId&&(Vc.set(t,e.frameId),null!==this.previousBoneMatricesNode&&t.previousBoneMatrices.set(t.boneMatrices),t.update())}}const Oc=e=>Pi(new Uc(e));class Gc extends $s{static get type(){return"LoopNode"}constructor(e=[]){super(),this.params=e}getVarName(e){return String.fromCharCode("i".charCodeAt(0)+e)}getProperties(e){const t=e.getNodeProperties(this);if(void 0!==t.stackNode)return t;const r={};for(let e=0,t=this.params.length-1;eNumber(o)?">=":"<")),n)i=`while ( ${o} )`;else{const t={start:a,end:o},r=t.start,s=t.end;let n="",h="",p="";c||(c="int"===l||"uint"===l?d.includes("<")?"++":"--":d.includes("<")?"+= 1.":"-= 1."),n+=e.getVar(l,u)+" = "+r,h+=u+" "+d+" "+s,p+=u+" "+c,i=`for ( ${n}; ${h}; ${p} )`}e.addFlowCode((0===t?"\n":"")+e.tab+i+" {\n\n").addFlowTab()}const i=s.build(e,"void"),n=t.returnsNode?t.returnsNode.build(e):"";e.removeFlowTab().addFlowCode("\n"+e.tab+i);for(let t=0,r=this.params.length-1;tPi(new Gc(Fi(e,"int"))).append(),zc=()=>Mu("break").append(),$c=new WeakMap,Hc=new s,Wc=Vi((({bufferMap:e,influence:t,stride:r,width:s,depth:i,offset:n})=>{const a=Hi(_c).mul(r).add(n),o=a.div(s),u=a.sub(o.mul(s));return Wu(e,Xi(u,o)).depth(i).xyz.mul(t)}));class jc extends $s{static get type(){return"MorphNode"}constructor(e){super("void"),this.mesh=e,this.morphBaseInfluence=Tn(1),this.updateType=Is.OBJECT}setup(e){const{geometry:r}=e,s=void 0!==r.morphAttributes.position,i=r.hasAttribute("normal")&&void 0!==r.morphAttributes.normal,n=r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color,a=void 0!==n?n.length:0,{texture:o,stride:u,size:l}=function(e){const r=void 0!==e.morphAttributes.position,s=void 0!==e.morphAttributes.normal,i=void 0!==e.morphAttributes.color,n=e.morphAttributes.position||e.morphAttributes.normal||e.morphAttributes.color,a=void 0!==n?n.length:0;let o=$c.get(e);if(void 0===o||o.count!==a){void 0!==o&&o.texture.dispose();const u=e.morphAttributes.position||[],l=e.morphAttributes.normal||[],d=e.morphAttributes.color||[];let c=0;!0===r&&(c=1),!0===s&&(c=2),!0===i&&(c=3);let h=e.attributes.position.count*c,p=1;const g=4096;h>g&&(p=Math.ceil(h/g),h=g);const m=new Float32Array(h*p*4*a),f=new P(m,h,p,a);f.type=L,f.needsUpdate=!0;const y=4*c;for(let b=0;b{const t=$i(0).toVar();this.mesh.count>1&&null!==this.mesh.morphTexture&&void 0!==this.mesh.morphTexture?t.assign(Wu(this.mesh.morphTexture,Xi(Hi(e).add(1),Hi(vc))).r):t.assign(ad("morphTargetInfluences","float").element(e).toVar()),Gi(t.notEqual(0),(()=>{!0===s&&Rl.addAssign(Wc({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:Hi(0)})),!0===i&&Ul.addAssign(Wc({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:Hi(1)}))}))}))}update(){const e=this.morphBaseInfluence;this.mesh.geometry.morphTargetsRelative?e.value=1:e.value=1-this.mesh.morphTargetInfluences.reduce(((e,t)=>e+t),0)}}const qc=Bi(jc).setParameterLength(1);class Xc extends $s{static get type(){return"LightingNode"}constructor(){super("vec3"),this.isLightingNode=!0}}class Kc extends Xc{static get type(){return"AONode"}constructor(e=null){super(),this.aoNode=e}setup(e){e.context.ambientOcclusion.mulAssign(this.aoNode)}}class Yc extends zo{static get type(){return"LightingContextNode"}constructor(e,t=null,r=null,s=null){super(e),this.lightingModel=t,this.backdropNode=r,this.backdropAlphaNode=s,this._value=null}getContext(){const{backdropNode:e,backdropAlphaNode:t}=this,r={directDiffuse:Qi().toVar("directDiffuse"),directSpecular:Qi().toVar("directSpecular"),indirectDiffuse:Qi().toVar("indirectDiffuse"),indirectSpecular:Qi().toVar("indirectSpecular")};return{radiance:Qi().toVar("radiance"),irradiance:Qi().toVar("irradiance"),iblIrradiance:Qi().toVar("iblIrradiance"),ambientOcclusion:$i(1).toVar("ambientOcclusion"),reflectedLight:r,backdrop:e,backdropAlpha:t}}setup(e){return this.value=this._value||(this._value=this.getContext()),this.value.lightingModel=this.lightingModel||e.context.lightingModel,super.setup(e)}}const Qc=Bi(Yc);class Zc extends Xc{static get type(){return"IrradianceNode"}constructor(e){super(),this.node=e}setup(e){e.context.irradiance.addAssign(this.node)}}let Jc,eh;class th extends $s{static get type(){return"ScreenNode"}constructor(e){super(),this.scope=e,this.isViewportNode=!0}getNodeType(){return this.scope===th.VIEWPORT?"vec4":"vec2"}getUpdateType(){let e=Is.NONE;return this.scope!==th.SIZE&&this.scope!==th.VIEWPORT||(e=Is.RENDER),this.updateType=e,e}update({renderer:e}){const t=e.getRenderTarget();this.scope===th.VIEWPORT?null!==t?eh.copy(t.viewport):(e.getViewport(eh),eh.multiplyScalar(e.getPixelRatio())):null!==t?(Jc.width=t.width,Jc.height=t.height):e.getDrawingBufferSize(Jc)}setup(){const e=this.scope;let r=null;return r=e===th.SIZE?Tn(Jc||(Jc=new t)):e===th.VIEWPORT?Tn(eh||(eh=new s)):qi(ih.div(sh)),r}generate(e){if(this.scope===th.COORDINATE){let t=e.getFragCoord();if(e.isFlipY()){const r=e.getNodeProperties(sh).outputNode.build(e);t=`${e.getType("vec2")}( ${t}.x, ${r}.y - ${t}.y )`}return t}return super.generate(e)}}th.COORDINATE="coordinate",th.VIEWPORT="viewport",th.SIZE="size",th.UV="uv";const rh=Ii(th,th.UV),sh=Ii(th,th.SIZE),ih=Ii(th,th.COORDINATE),nh=Ii(th,th.VIEWPORT),ah=nh.zw,oh=ih.sub(nh.xy),uh=oh.div(ah),lh=Vi((()=>(console.warn('THREE.TSL: "viewportResolution" is deprecated. Use "screenSize" instead.'),sh)),"vec2").once()(),dh=Vi((()=>(console.warn('THREE.TSL: "viewportTopLeft" is deprecated. Use "screenUV" instead.'),rh)),"vec2").once()(),ch=Vi((()=>(console.warn('THREE.TSL: "viewportBottomLeft" is deprecated. Use "screenUV.flipY()" instead.'),rh.flipY())),"vec2").once()(),hh=new t;class ph extends $u{static get type(){return"ViewportTextureNode"}constructor(e=rh,t=null,r=null){null===r&&((r=new F).minFilter=B),super(r,e,t),this.generateMipmaps=!1,this.isOutputTextureNode=!0,this.updateBeforeType=Is.FRAME}updateBefore(e){const t=e.renderer;t.getDrawingBufferSize(hh);const r=this.value;r.image.width===hh.width&&r.image.height===hh.height||(r.image.width=hh.width,r.image.height=hh.height,r.needsUpdate=!0);const s=r.generateMipmaps;r.generateMipmaps=this.generateMipmaps,t.copyFramebufferToTexture(r),r.generateMipmaps=s}clone(){const e=new this.constructor(this.uvNode,this.levelNode,this.value);return e.generateMipmaps=this.generateMipmaps,e}}const gh=Bi(ph).setParameterLength(0,3),mh=Bi(ph,null,null,{generateMipmaps:!0}).setParameterLength(0,3);let fh=null;class yh extends ph{static get type(){return"ViewportDepthTextureNode"}constructor(e=rh,t=null){null===fh&&(fh=new I),super(e,t,fh)}}const xh=Bi(yh).setParameterLength(0,2);class bh extends $s{static get type(){return"ViewportDepthNode"}constructor(e,t=null){super("float"),this.scope=e,this.valueNode=t,this.isViewportDepthNode=!0}generate(e){const{scope:t}=this;return t===bh.DEPTH_BASE?e.getFragDepth():super.generate(e)}setup({camera:e}){const{scope:t}=this,r=this.valueNode;let s=null;if(t===bh.DEPTH_BASE)null!==r&&(s=Sh().assign(r));else if(t===bh.DEPTH)s=e.isPerspectiveCamera?_h(Ll.z,Zu,Ju):Th(Ll.z,Zu,Ju);else if(t===bh.LINEAR_DEPTH)if(null!==r)if(e.isPerspectiveCamera){const e=vh(r,Zu,Ju);s=Th(e,Zu,Ju)}else s=r;else s=Th(Ll.z,Zu,Ju);return s}}bh.DEPTH_BASE="depthBase",bh.DEPTH="depth",bh.LINEAR_DEPTH="linearDepth";const Th=(e,t,r)=>e.add(t).div(t.sub(r)),_h=(e,t,r)=>t.add(e).mul(r).div(r.sub(t).mul(e)),vh=(e,t,r)=>t.mul(r).div(r.sub(t).mul(e).sub(r)),Nh=(e,t,r)=>{t=t.max(1e-6).toVar();const s=Ua(e.negate().div(t)),i=Ua(r.div(t));return s.div(i)},Sh=Bi(bh,bh.DEPTH_BASE),Eh=Ii(bh,bh.DEPTH),wh=Bi(bh,bh.LINEAR_DEPTH).setParameterLength(0,1),Ah=wh(xh());Eh.assign=e=>Sh(e);const Rh=Bi(class extends $s{constructor(e){super("float"),this.name=e,this.isBuiltinNode=!0}generate(){return this.name}}).setParameterLength(1);class Ch extends $s{static get type(){return"ClippingNode"}constructor(e=Ch.DEFAULT){super(),this.scope=e}setup(e){super.setup(e);const t=e.clippingContext,{intersectionPlanes:r,unionPlanes:s}=t;return this.hardwareClipping=e.material.hardwareClipping,this.scope===Ch.ALPHA_TO_COVERAGE?this.setupAlphaToCoverage(r,s):this.scope===Ch.HARDWARE?this.setupHardwareClipping(s,e):this.setupDefault(r,s)}setupAlphaToCoverage(e,t){return Vi((()=>{const r=$i().toVar("distanceToPlane"),s=$i().toVar("distanceToGradient"),i=$i(1).toVar("clipOpacity"),n=t.length;if(!1===this.hardwareClipping&&n>0){const e=Yu(t);kc(n,(({i:t})=>{const n=e.element(t);r.assign(Ll.dot(n.xyz).negate().add(n.w)),s.assign(r.fwidth().div(2)),i.mulAssign(Po(s.negate(),s,r))}))}const a=e.length;if(a>0){const t=Yu(e),n=$i(1).toVar("intersectionClipOpacity");kc(a,(({i:e})=>{const i=t.element(e);r.assign(Ll.dot(i.xyz).negate().add(i.w)),s.assign(r.fwidth().div(2)),n.mulAssign(Po(s.negate(),s,r).oneMinus())})),i.mulAssign(n.oneMinus())}Sn.a.mulAssign(i),Sn.a.equal(0).discard()}))()}setupDefault(e,t){return Vi((()=>{const r=t.length;if(!1===this.hardwareClipping&&r>0){const e=Yu(t);kc(r,(({i:t})=>{const r=e.element(t);Ll.dot(r.xyz).greaterThan(r.w).discard()}))}const s=e.length;if(s>0){const t=Yu(e),r=ji(!0).toVar("clipped");kc(s,(({i:e})=>{const s=t.element(e);r.assign(Ll.dot(s.xyz).greaterThan(s.w).and(r))})),r.discard()}}))()}setupHardwareClipping(e,t){const r=e.length;return t.enableHardwareClipping(r),Vi((()=>{const s=Yu(e),i=Rh(t.getClipDistance());kc(r,(({i:e})=>{const t=s.element(e),r=Ll.dot(t.xyz).sub(t.w).negate();i.element(e).assign(r)}))}))()}}Ch.ALPHA_TO_COVERAGE="alphaToCoverage",Ch.DEFAULT="default",Ch.HARDWARE="hardware";const Mh=Vi((([e])=>Ha(na(1e4,Wa(na(17,e.x).add(na(.1,e.y)))).mul(sa(.1,Qa(Wa(na(13,e.y).add(e.x)))))))),Ph=Vi((([e])=>Mh(qi(Mh(e.xy),e.z)))),Lh=Vi((([e])=>{const t=po(Ja(ro(e.xyz)),Ja(so(e.xyz))),r=$i(1).div($i(.05).mul(t)).toVar("pixScale"),s=qi(Da(ka(Ua(r))),Da(za(Ua(r)))),i=qi(Ph(ka(s.x.mul(e.xyz))),Ph(ka(s.y.mul(e.xyz)))),n=Ha(Ua(r)),a=sa(na(n.oneMinus(),i.x),na(n,i.y)),o=ho(n,n.oneMinus()),u=Qi(a.mul(a).div(na(2,o).mul(ia(1,o))),a.sub(na(.5,o)).div(ia(1,o)),ia(1,ia(1,a).mul(ia(1,a)).div(na(2,o).mul(ia(1,o))))),l=a.lessThan(o.oneMinus()).select(a.lessThan(o).select(u.x,u.y),u.z);return Ro(l,1e-6,1)})).setLayout({name:"getAlphaHashThreshold",type:"float",inputs:[{name:"position",type:"vec3"}]});class Fh extends D{static get type(){return"NodeMaterial"}get type(){return this.constructor.type}set type(e){}constructor(){super(),this.isNodeMaterial=!0,this.fog=!0,this.lights=!1,this.hardwareClipping=!1,this.lightsNode=null,this.envNode=null,this.aoNode=null,this.colorNode=null,this.normalNode=null,this.opacityNode=null,this.backdropNode=null,this.backdropAlphaNode=null,this.alphaTestNode=null,this.positionNode=null,this.geometryNode=null,this.depthNode=null,this.shadowPositionNode=null,this.receivedShadowNode=null,this.castShadowNode=null,this.outputNode=null,this.mrtNode=null,this.fragmentNode=null,this.vertexNode=null}customProgramCacheKey(){return this.type+_s(this)}build(e){this.setup(e)}setupObserver(e){return new fs(e)}setup(e){e.context.setupNormal=()=>this.setupNormal(e),e.context.setupPositionView=()=>this.setupPositionView(e),e.context.setupModelViewProjection=()=>this.setupModelViewProjection(e);const t=e.renderer,r=t.getRenderTarget();e.addStack();const s=this.vertexNode||this.setupVertex(e);let i;e.stack.outputNode=s,this.setupHardwareClipping(e),null!==this.geometryNode&&(e.stack.outputNode=e.stack.outputNode.bypass(this.geometryNode)),e.addFlow("vertex",e.removeStack()),e.addStack();const n=this.setupClipping(e);if(!0!==this.depthWrite&&!0!==this.depthTest||(null!==r?!0===r.depthBuffer&&this.setupDepth(e):!0===t.depth&&this.setupDepth(e)),null===this.fragmentNode){this.setupDiffuseColor(e),this.setupVariants(e);const s=this.setupLighting(e);null!==n&&e.stack.add(n);const a=tn(s,Sn.a).max(0);i=this.setupOutput(e,a),zn.assign(i);const o=null!==this.outputNode;if(o&&(i=this.outputNode),null!==r){const e=t.getMRT(),r=this.mrtNode;null!==e?(o&&zn.assign(i),i=e,null!==r&&(i=e.merge(r))):null!==r&&(i=r)}}else{let t=this.fragmentNode;!0!==t.isOutputStructNode&&(t=tn(t)),i=this.setupOutput(e,t)}e.stack.outputNode=i,e.addFlow("fragment",e.removeStack()),e.observer=this.setupObserver(e)}setupClipping(e){if(null===e.clippingContext)return null;const{unionPlanes:t,intersectionPlanes:r}=e.clippingContext;let s=null;if(t.length>0||r.length>0){const t=e.renderer.samples;this.alphaToCoverage&&t>1?s=Pi(new Ch(Ch.ALPHA_TO_COVERAGE)):e.stack.add(Pi(new Ch))}return s}setupHardwareClipping(e){if(this.hardwareClipping=!1,null===e.clippingContext)return;const t=e.clippingContext.unionPlanes.length;t>0&&t<=8&&e.isAvailable("clipDistance")&&(e.stack.add(Pi(new Ch(Ch.HARDWARE))),this.hardwareClipping=!0)}setupDepth(e){const{renderer:t,camera:r}=e;let s=this.depthNode;if(null===s){const e=t.getMRT();e&&e.has("depth")?s=e.get("depth"):!0===t.logarithmicDepthBuffer&&(s=r.isPerspectiveCamera?Nh(Ll.z,Zu,Ju):Th(Ll.z,Zu,Ju))}null!==s&&Eh.assign(s).append()}setupPositionView(){return Nl.mul(Rl).xyz}setupModelViewProjection(){return el.mul(Ll)}setupVertex(e){return e.addStack(),this.setupPosition(e),e.context.vertex=e.removeStack(),bc}setupPosition(e){const{object:t,geometry:r}=e;if((r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color)&&qc(t).append(),!0===t.isSkinnedMesh&&Oc(t).append(),this.displacementMap){const e=ld("displacementMap","texture"),t=ld("displacementScale","float"),r=ld("displacementBias","float");Rl.addAssign(Ul.normalize().mul(e.x.mul(t).add(r)))}return t.isBatchedMesh&&Lc(t).append(),t.isInstancedMesh&&t.instanceMatrix&&!0===t.instanceMatrix.isInstancedBufferAttribute&&Mc(t).append(),null!==this.positionNode&&Rl.assign(this.positionNode.context({isPositionNodeInput:!0})),Rl}setupDiffuseColor({object:e,geometry:t}){let r=this.colorNode?tn(this.colorNode):Dd;if(!0===this.vertexColors&&t.hasAttribute("color")&&(r=tn(r.xyz.mul(Vu("color","vec3")),r.a)),e.instanceColor){r=Nn("vec3","vInstanceColor").mul(r)}if(e.isBatchedMesh&&e._colorsTexture){r=Nn("vec3","vBatchColor").mul(r)}Sn.assign(r);const s=this.opacityNode?$i(this.opacityNode):Od;if(Sn.a.assign(Sn.a.mul(s)),null!==this.alphaTestNode||this.alphaTest>0){const e=null!==this.alphaTestNode?$i(this.alphaTestNode):Id;Sn.a.lessThanEqual(e).discard()}!0===this.alphaHash&&Sn.a.lessThan(Lh(Rl)).discard(),!1===this.transparent&&this.blending===V&&!1===this.alphaToCoverage&&Sn.a.assign(1)}setupVariants(){}setupOutgoingLight(){return!0===this.lights?Qi(0):Sn.rgb}setupNormal(){return this.normalNode?Qi(this.normalNode):qd}setupEnvironment(){let e=null;return this.envNode?e=this.envNode:this.envMap&&(e=this.envMap.isCubeTexture?ld("envMap","cubeTexture"):ld("envMap","texture")),e}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new Zc(fc)),t}setupLights(e){const t=[],r=this.setupEnvironment(e);r&&r.isLightingNode&&t.push(r);const s=this.setupLightMap(e);if(s&&s.isLightingNode&&t.push(s),null!==this.aoNode||e.material.aoMap){const e=null!==this.aoNode?this.aoNode:yc;t.push(new Kc(e))}let i=this.lightsNode||e.lightsNode;return t.length>0&&(i=e.renderer.lighting.createNode([...i.getLights(),...t])),i}setupLightingModel(){}setupLighting(e){const{material:t}=e,{backdropNode:r,backdropAlphaNode:s,emissiveNode:i}=this,n=!0===this.lights||null!==this.lightsNode?this.setupLights(e):null;let a=this.setupOutgoingLight(e);if(n&&n.getScope().hasLights){const t=this.setupLightingModel(e)||null;a=Qc(n,t,r,s)}else null!==r&&(a=Qi(null!==s?Ao(a,r,s):r));return(i&&!0===i.isNode||t.emissive&&!0===t.emissive.isColor)&&(En.assign(Qi(i||Ud)),a=a.add(En)),a}setupFog(e,t){const r=e.fogNode;return r&&(zn.assign(t),t=tn(r)),t}setupOutput(e,t){return!0===this.fog&&(t=this.setupFog(e,t)),t}setDefaultValues(e){for(const t in e){const r=e[t];void 0===this[t]&&(this[t]=r,r&&r.clone&&(this[t]=r.clone()))}const t=Object.getOwnPropertyDescriptors(e.constructor.prototype);for(const e in t)void 0===Object.getOwnPropertyDescriptor(this.constructor.prototype,e)&&void 0!==t[e].get&&Object.defineProperty(this.constructor.prototype,e,t[e])}toJSON(e){const t=void 0===e||"string"==typeof e;t&&(e={textures:{},images:{},nodes:{}});const r=D.prototype.toJSON.call(this,e),s=vs(this);r.inputNodes={};for(const{property:t,childNode:i}of s)r.inputNodes[t]=i.toJSON(e).uuid;function i(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(t){const t=i(e.textures),s=i(e.images),n=i(e.nodes);t.length>0&&(r.textures=t),s.length>0&&(r.images=s),n.length>0&&(r.nodes=n)}return r}copy(e){return this.lightsNode=e.lightsNode,this.envNode=e.envNode,this.colorNode=e.colorNode,this.normalNode=e.normalNode,this.opacityNode=e.opacityNode,this.backdropNode=e.backdropNode,this.backdropAlphaNode=e.backdropAlphaNode,this.alphaTestNode=e.alphaTestNode,this.positionNode=e.positionNode,this.geometryNode=e.geometryNode,this.depthNode=e.depthNode,this.shadowPositionNode=e.shadowPositionNode,this.receivedShadowNode=e.receivedShadowNode,this.castShadowNode=e.castShadowNode,this.outputNode=e.outputNode,this.mrtNode=e.mrtNode,this.fragmentNode=e.fragmentNode,this.vertexNode=e.vertexNode,super.copy(e)}}const Bh=new U;class Ih extends Fh{static get type(){return"LineBasicNodeMaterial"}constructor(e){super(),this.isLineBasicNodeMaterial=!0,this.setDefaultValues(Bh),this.setValues(e)}}const Dh=new O;class Vh extends Fh{static get type(){return"LineDashedNodeMaterial"}constructor(e){super(),this.isLineDashedNodeMaterial=!0,this.setDefaultValues(Dh),this.dashOffset=0,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.setValues(e)}setupVariants(){const e=this.offsetNode?$i(this.offsetNode):pc,t=this.dashScaleNode?$i(this.dashScaleNode):lc,r=this.dashSizeNode?$i(this.dashSizeNode):dc,s=this.gapSizeNode?$i(this.gapSizeNode):cc;$n.assign(r),Hn.assign(s);const i=Qo(Vu("lineDistance").mul(t));(e?i.add(e):i).mod($n.add(Hn)).greaterThan($n).discard()}}let Uh=null;class Oh extends ph{static get type(){return"ViewportSharedTextureNode"}constructor(e=rh,t=null){null===Uh&&(Uh=new F),super(e,t,Uh)}updateReference(){return this}}const Gh=Bi(Oh).setParameterLength(0,2),kh=new O;class zh extends Fh{static get type(){return"Line2NodeMaterial"}constructor(e={}){super(),this.isLine2NodeMaterial=!0,this.setDefaultValues(kh),this.useColor=e.vertexColors,this.dashOffset=0,this.lineWidth=1,this.lineColorNode=null,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.blending=G,this._useDash=e.dashed,this._useAlphaToCoverage=!0,this._useWorldUnits=!1,this.setValues(e)}setup(e){const{renderer:t}=e,r=this._useAlphaToCoverage,s=this.useColor,i=this._useDash,n=this._useWorldUnits,a=Vi((({start:e,end:t})=>{const r=el.element(2).element(2),s=el.element(3).element(2).mul(-.5).div(r).sub(e.z).div(t.z.sub(e.z));return tn(Ao(e.xyz,t.xyz,s),t.w)})).setLayout({name:"trimSegment",type:"vec4",inputs:[{name:"start",type:"vec4"},{name:"end",type:"vec4"}]});this.vertexNode=Vi((()=>{const e=Vu("instanceStart"),t=Vu("instanceEnd"),r=tn(Nl.mul(tn(e,1))).toVar("start"),s=tn(Nl.mul(tn(t,1))).toVar("end");if(i){const e=this.dashScaleNode?$i(this.dashScaleNode):lc,t=this.offsetNode?$i(this.offsetNode):pc,r=Vu("instanceDistanceStart"),s=Vu("instanceDistanceEnd");let i=Al.y.lessThan(.5).select(e.mul(r),e.mul(s));i=i.add(t),Nn("float","lineDistance").assign(i)}n&&(Nn("vec3","worldStart").assign(r.xyz),Nn("vec3","worldEnd").assign(s.xyz));const o=nh.z.div(nh.w),u=el.element(2).element(3).equal(-1);Gi(u,(()=>{Gi(r.z.lessThan(0).and(s.z.greaterThan(0)),(()=>{s.assign(a({start:r,end:s}))})).ElseIf(s.z.lessThan(0).and(r.z.greaterThanEqual(0)),(()=>{r.assign(a({start:s,end:r}))}))}));const l=el.mul(r),d=el.mul(s),c=l.xyz.div(l.w),h=d.xyz.div(d.w),p=h.xy.sub(c.xy).toVar();p.x.assign(p.x.mul(o)),p.assign(p.normalize());const g=tn().toVar();if(n){const e=s.xyz.sub(r.xyz).normalize(),t=Ao(r.xyz,s.xyz,.5).normalize(),n=e.cross(t).normalize(),a=e.cross(n),o=Nn("vec4","worldPos");o.assign(Al.y.lessThan(.5).select(r,s));const u=hc.mul(.5);o.addAssign(tn(Al.x.lessThan(0).select(n.mul(u),n.mul(u).negate()),0)),i||(o.addAssign(tn(Al.y.lessThan(.5).select(e.mul(u).negate(),e.mul(u)),0)),o.addAssign(tn(a.mul(u),0)),Gi(Al.y.greaterThan(1).or(Al.y.lessThan(0)),(()=>{o.subAssign(tn(a.mul(2).mul(u),0))}))),g.assign(el.mul(o));const l=Qi().toVar();l.assign(Al.y.lessThan(.5).select(c,h)),g.z.assign(l.z.mul(g.w))}else{const e=qi(p.y,p.x.negate()).toVar("offset");p.x.assign(p.x.div(o)),e.x.assign(e.x.div(o)),e.assign(Al.x.lessThan(0).select(e.negate(),e)),Gi(Al.y.lessThan(0),(()=>{e.assign(e.sub(p))})).ElseIf(Al.y.greaterThan(1),(()=>{e.assign(e.add(p))})),e.assign(e.mul(hc)),e.assign(e.div(nh.w)),g.assign(Al.y.lessThan(.5).select(l,d)),e.assign(e.mul(g.w)),g.assign(g.add(tn(e,0,0)))}return g}))();const o=Vi((({p1:e,p2:t,p3:r,p4:s})=>{const i=e.sub(r),n=s.sub(r),a=t.sub(e),o=i.dot(n),u=n.dot(a),l=i.dot(a),d=n.dot(n),c=a.dot(a).mul(d).sub(u.mul(u)),h=o.mul(u).sub(l.mul(d)).div(c).clamp(),p=o.add(u.mul(h)).div(d).clamp();return qi(h,p)}));if(this.colorNode=Vi((()=>{const e=Uu();if(i){const t=this.dashSizeNode?$i(this.dashSizeNode):dc,r=this.gapSizeNode?$i(this.gapSizeNode):cc;$n.assign(t),Hn.assign(r);const s=Nn("float","lineDistance");e.y.lessThan(-1).or(e.y.greaterThan(1)).discard(),s.mod($n.add(Hn)).greaterThan($n).discard()}const a=$i(1).toVar("alpha");if(n){const e=Nn("vec3","worldStart"),s=Nn("vec3","worldEnd"),n=Nn("vec4","worldPos").xyz.normalize().mul(1e5),u=s.sub(e),l=o({p1:e,p2:s,p3:Qi(0,0,0),p4:n}),d=e.add(u.mul(l.x)),c=n.mul(l.y),h=d.sub(c).length().div(hc);if(!i)if(r&&t.samples>1){const e=h.fwidth();a.assign(Po(e.negate().add(.5),e.add(.5),h).oneMinus())}else h.greaterThan(.5).discard()}else if(r&&t.samples>1){const t=e.x,r=e.y.greaterThan(0).select(e.y.sub(1),e.y.add(1)),s=t.mul(t).add(r.mul(r)),i=$i(s.fwidth()).toVar("dlen");Gi(e.y.abs().greaterThan(1),(()=>{a.assign(Po(i.oneMinus(),i.add(1),s).oneMinus())}))}else Gi(e.y.abs().greaterThan(1),(()=>{const t=e.x,r=e.y.greaterThan(0).select(e.y.sub(1),e.y.add(1));t.mul(t).add(r.mul(r)).greaterThan(1).discard()}));let u;if(this.lineColorNode)u=this.lineColorNode;else if(s){const e=Vu("instanceColorStart"),t=Vu("instanceColorEnd");u=Al.y.lessThan(.5).select(e,t).mul(Dd)}else u=Dd;return tn(u,a)}))(),this.transparent){const e=this.opacityNode?$i(this.opacityNode):Od;this.outputNode=tn(this.colorNode.rgb.mul(e).add(Gh().rgb.mul(e.oneMinus())),this.colorNode.a)}super.setup(e)}get worldUnits(){return this._useWorldUnits}set worldUnits(e){this._useWorldUnits!==e&&(this._useWorldUnits=e,this.needsUpdate=!0)}get dashed(){return this._useDash}set dashed(e){this._useDash!==e&&(this._useDash=e,this.needsUpdate=!0)}get alphaToCoverage(){return this._useAlphaToCoverage}set alphaToCoverage(e){this._useAlphaToCoverage!==e&&(this._useAlphaToCoverage=e,this.needsUpdate=!0)}}const $h=e=>Pi(e).mul(.5).add(.5),Hh=new k;class Wh extends Fh{static get type(){return"MeshNormalNodeMaterial"}constructor(e){super(),this.isMeshNormalNodeMaterial=!0,this.setDefaultValues(Hh),this.setValues(e)}setupDiffuseColor(){const e=this.opacityNode?$i(this.opacityNode):Od;Sn.assign(ou(tn($h(zl),e),z))}}class jh extends js{static get type(){return"EquirectUVNode"}constructor(e=Pl){super("vec2"),this.dirNode=e}setup(){const e=this.dirNode,t=e.z.atan(e.x).mul(1/(2*Math.PI)).add(.5),r=e.y.clamp(-1,1).asin().mul(1/Math.PI).add(.5);return qi(t,r)}}const qh=Bi(jh).setParameterLength(0,1);class Xh extends ${constructor(e=1,t={}){super(e,t),this.isCubeRenderTarget=!0}fromEquirectangularTexture(e,t){const r=t.minFilter,s=t.generateMipmaps;t.generateMipmaps=!0,this.texture.type=t.type,this.texture.colorSpace=t.colorSpace,this.texture.generateMipmaps=t.generateMipmaps,this.texture.minFilter=t.minFilter,this.texture.magFilter=t.magFilter;const i=new H(5,5,5),n=qh(Pl),a=new Fh;a.colorNode=Hu(t,n,0),a.side=N,a.blending=G;const o=new W(i,a),u=new j;u.add(o),t.minFilter===B&&(t.minFilter=q);const l=new X(1,10,this),d=e.getMRT();return e.setMRT(null),l.update(e,u),e.setMRT(d),t.minFilter=r,t.currentGenerateMipmaps=s,o.geometry.dispose(),o.material.dispose(),this}}const Kh=new WeakMap;class Yh extends js{static get type(){return"CubeMapNode"}constructor(e){super("vec3"),this.envNode=e,this._cubeTexture=null,this._cubeTextureNode=sd(null);const t=new K;t.isRenderTargetTexture=!0,this._defaultTexture=t,this.updateBeforeType=Is.RENDER}updateBefore(e){const{renderer:t,material:r}=e,s=this.envNode;if(s.isTextureNode||s.isMaterialReferenceNode){const e=s.isTextureNode?s.value:r[s.property];if(e&&e.isTexture){const r=e.mapping;if(r===Y||r===Q){if(Kh.has(e)){const t=Kh.get(e);Zh(t,e.mapping),this._cubeTexture=t}else{const r=e.image;if(function(e){return null!=e&&e.height>0}(r)){const s=new Xh(r.height);s.fromEquirectangularTexture(t,e),Zh(s.texture,e.mapping),this._cubeTexture=s.texture,Kh.set(e,s.texture),e.addEventListener("dispose",Qh)}else this._cubeTexture=this._defaultTexture}this._cubeTextureNode.value=this._cubeTexture}else this._cubeTextureNode=this.envNode}}}setup(e){return this.updateBefore(e),this._cubeTextureNode}}function Qh(e){const t=e.target;t.removeEventListener("dispose",Qh);const r=Kh.get(t);void 0!==r&&(Kh.delete(t),r.dispose())}function Zh(e,t){t===Y?e.mapping=E:t===Q&&(e.mapping=w)}const Jh=Bi(Yh).setParameterLength(1);class ep extends Xc{static get type(){return"BasicEnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){e.context.environment=Jh(this.envNode)}}class tp extends Xc{static get type(){return"BasicLightMapNode"}constructor(e=null){super(),this.lightMapNode=e}setup(e){const t=$i(1/Math.PI);e.context.irradianceLightMap=this.lightMapNode.mul(t)}}class rp{start(e){e.lightsNode.setupLights(e,e.lightsNode.getLightNodes(e)),this.indirect(e)}finish(){}direct(){}directRectArea(){}indirect(){}ambientOcclusion(){}}class sp extends rp{constructor(){super()}indirect({context:e}){const t=e.ambientOcclusion,r=e.reflectedLight,s=e.irradianceLightMap;r.indirectDiffuse.assign(tn(0)),s?r.indirectDiffuse.addAssign(s):r.indirectDiffuse.addAssign(tn(1,1,1,0)),r.indirectDiffuse.mulAssign(t),r.indirectDiffuse.mulAssign(Sn.rgb)}finish(e){const{material:t,context:r}=e,s=r.outgoingLight,i=e.context.environment;if(i)switch(t.combine){case ee:s.rgb.assign(Ao(s.rgb,s.rgb.mul(i.rgb),$d.mul(Hd)));break;case J:s.rgb.assign(Ao(s.rgb,i.rgb,$d.mul(Hd)));break;case Z:s.rgb.addAssign(i.rgb.mul($d.mul(Hd)));break;default:console.warn("THREE.BasicLightingModel: Unsupported .combine value:",t.combine)}}}const ip=new te;class np extends Fh{static get type(){return"MeshBasicNodeMaterial"}constructor(e){super(),this.isMeshBasicNodeMaterial=!0,this.lights=!0,this.setDefaultValues(ip),this.setValues(e)}setupNormal(){return Gl}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new ep(t):null}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new tp(fc)),t}setupOutgoingLight(){return Sn.rgb}setupLightingModel(){return new sp}}const ap=Vi((({f0:e,f90:t,dotVH:r})=>{const s=r.mul(-5.55473).sub(6.98316).mul(r).exp2();return e.mul(s.oneMinus()).add(t.mul(s))})),op=Vi((e=>e.diffuseColor.mul(1/Math.PI))),up=Vi((({dotNH:e})=>kn.mul($i(.5)).add(1).mul($i(1/Math.PI)).mul(e.pow(kn)))),lp=Vi((({lightDirection:e})=>{const t=e.add(Fl).normalize(),r=zl.dot(t).clamp(),s=Fl.dot(t).clamp(),i=ap({f0:On,f90:1,dotVH:s}),n=$i(.25),a=up({dotNH:r});return i.mul(n).mul(a)}));class dp extends sp{constructor(e=!0){super(),this.specular=e}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=zl.dot(e).clamp().mul(t);r.directDiffuse.addAssign(s.mul(op({diffuseColor:Sn.rgb}))),!0===this.specular&&r.directSpecular.addAssign(s.mul(lp({lightDirection:e})).mul($d))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(op({diffuseColor:Sn}))),s.indirectDiffuse.mulAssign(t)}}const cp=new re;class hp extends Fh{static get type(){return"MeshLambertNodeMaterial"}constructor(e){super(),this.isMeshLambertNodeMaterial=!0,this.lights=!0,this.setDefaultValues(cp),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new ep(t):null}setupLightingModel(){return new dp(!1)}}const pp=new se;class gp extends Fh{static get type(){return"MeshPhongNodeMaterial"}constructor(e){super(),this.isMeshPhongNodeMaterial=!0,this.lights=!0,this.shininessNode=null,this.specularNode=null,this.setDefaultValues(pp),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new ep(t):null}setupLightingModel(){return new dp}setupVariants(){const e=(this.shininessNode?$i(this.shininessNode):Vd).max(1e-4);kn.assign(e);const t=this.specularNode||Gd;On.assign(t)}copy(e){return this.shininessNode=e.shininessNode,this.specularNode=e.specularNode,super.copy(e)}}const mp=Vi((e=>{if(!1===e.geometry.hasAttribute("normal"))return $i(0);const t=Gl.dFdx().abs().max(Gl.dFdy().abs());return t.x.max(t.y).max(t.z)})),fp=Vi((e=>{const{roughness:t}=e,r=mp();let s=t.max(.0525);return s=s.add(r),s=s.min(1),s})),yp=Vi((({alpha:e,dotNL:t,dotNV:r})=>{const s=e.pow2(),i=t.mul(s.add(s.oneMinus().mul(r.pow2())).sqrt()),n=r.mul(s.add(s.oneMinus().mul(t.pow2())).sqrt());return aa(.5,i.add(n).max(Aa))})).setLayout({name:"V_GGX_SmithCorrelated",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNL",type:"float"},{name:"dotNV",type:"float"}]}),xp=Vi((({alphaT:e,alphaB:t,dotTV:r,dotBV:s,dotTL:i,dotBL:n,dotNV:a,dotNL:o})=>{const u=o.mul(Qi(e.mul(r),t.mul(s),a).length()),l=a.mul(Qi(e.mul(i),t.mul(n),o).length());return aa(.5,u.add(l)).saturate()})).setLayout({name:"V_GGX_SmithCorrelated_Anisotropic",type:"float",inputs:[{name:"alphaT",type:"float",qualifier:"in"},{name:"alphaB",type:"float",qualifier:"in"},{name:"dotTV",type:"float",qualifier:"in"},{name:"dotBV",type:"float",qualifier:"in"},{name:"dotTL",type:"float",qualifier:"in"},{name:"dotBL",type:"float",qualifier:"in"},{name:"dotNV",type:"float",qualifier:"in"},{name:"dotNL",type:"float",qualifier:"in"}]}),bp=Vi((({alpha:e,dotNH:t})=>{const r=e.pow2(),s=t.pow2().mul(r.oneMinus()).oneMinus();return r.div(s.pow2()).mul(1/Math.PI)})).setLayout({name:"D_GGX",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNH",type:"float"}]}),Tp=$i(1/Math.PI),_p=Vi((({alphaT:e,alphaB:t,dotNH:r,dotTH:s,dotBH:i})=>{const n=e.mul(t),a=Qi(t.mul(s),e.mul(i),n.mul(r)),o=a.dot(a),u=n.div(o);return Tp.mul(n.mul(u.pow2()))})).setLayout({name:"D_GGX_Anisotropic",type:"float",inputs:[{name:"alphaT",type:"float",qualifier:"in"},{name:"alphaB",type:"float",qualifier:"in"},{name:"dotNH",type:"float",qualifier:"in"},{name:"dotTH",type:"float",qualifier:"in"},{name:"dotBH",type:"float",qualifier:"in"}]}),vp=Vi((e=>{const{lightDirection:t,f0:r,f90:s,roughness:i,f:n,USE_IRIDESCENCE:a,USE_ANISOTROPY:o}=e,u=e.normalView||zl,l=i.pow2(),d=t.add(Fl).normalize(),c=u.dot(t).clamp(),h=u.dot(Fl).clamp(),p=u.dot(d).clamp(),g=Fl.dot(d).clamp();let m,f,y=ap({f0:r,f90:s,dotVH:g});if(Ri(a)&&(y=Ln.mix(y,n)),Ri(o)){const e=Vn.dot(t),r=Vn.dot(Fl),s=Vn.dot(d),i=Un.dot(t),n=Un.dot(Fl),a=Un.dot(d);m=xp({alphaT:In,alphaB:l,dotTV:r,dotBV:n,dotTL:e,dotBL:i,dotNV:h,dotNL:c}),f=_p({alphaT:In,alphaB:l,dotNH:p,dotTH:s,dotBH:a})}else m=yp({alpha:l,dotNL:c,dotNV:h}),f=bp({alpha:l,dotNH:p});return y.mul(m).mul(f)})),Np=Vi((({roughness:e,dotNV:t})=>{const r=tn(-1,-.0275,-.572,.022),s=tn(1,.0425,1.04,-.04),i=e.mul(r).add(s),n=i.x.mul(i.x).min(t.mul(-9.28).exp2()).mul(i.x).add(i.y);return qi(-1.04,1.04).mul(n).add(i.zw)})).setLayout({name:"DFGApprox",type:"vec2",inputs:[{name:"roughness",type:"float"},{name:"dotNV",type:"vec3"}]}),Sp=Vi((e=>{const{dotNV:t,specularColor:r,specularF90:s,roughness:i}=e,n=Np({dotNV:t,roughness:i});return r.mul(n.x).add(s.mul(n.y))})),Ep=Vi((({f:e,f90:t,dotVH:r})=>{const s=r.oneMinus().saturate(),i=s.mul(s),n=s.mul(i,i).clamp(0,.9999);return e.sub(Qi(t).mul(n)).div(n.oneMinus())})).setLayout({name:"Schlick_to_F0",type:"vec3",inputs:[{name:"f",type:"vec3"},{name:"f90",type:"float"},{name:"dotVH",type:"float"}]}),wp=Vi((({roughness:e,dotNH:t})=>{const r=e.pow2(),s=$i(1).div(r),i=t.pow2().oneMinus().max(.0078125);return $i(2).add(s).mul(i.pow(s.mul(.5))).div(2*Math.PI)})).setLayout({name:"D_Charlie",type:"float",inputs:[{name:"roughness",type:"float"},{name:"dotNH",type:"float"}]}),Ap=Vi((({dotNV:e,dotNL:t})=>$i(1).div($i(4).mul(t.add(e).sub(t.mul(e)))))).setLayout({name:"V_Neubelt",type:"float",inputs:[{name:"dotNV",type:"float"},{name:"dotNL",type:"float"}]}),Rp=Vi((({lightDirection:e})=>{const t=e.add(Fl).normalize(),r=zl.dot(e).clamp(),s=zl.dot(Fl).clamp(),i=zl.dot(t).clamp(),n=wp({roughness:Pn,dotNH:i}),a=Ap({dotNV:s,dotNL:r});return Mn.mul(n).mul(a)})),Cp=Vi((({N:e,V:t,roughness:r})=>{const s=e.dot(t).saturate(),i=qi(r,s.oneMinus().sqrt());return i.assign(i.mul(.984375).add(.0078125)),i})).setLayout({name:"LTC_Uv",type:"vec2",inputs:[{name:"N",type:"vec3"},{name:"V",type:"vec3"},{name:"roughness",type:"float"}]}),Mp=Vi((({f:e})=>{const t=e.length();return po(t.mul(t).add(e.z).div(t.add(1)),0)})).setLayout({name:"LTC_ClippedSphereFormFactor",type:"float",inputs:[{name:"f",type:"vec3"}]}),Pp=Vi((({v1:e,v2:t})=>{const r=e.dot(t),s=r.abs().toVar(),i=s.mul(.0145206).add(.4965155).mul(s).add(.8543985).toVar(),n=s.add(4.1616724).mul(s).add(3.417594).toVar(),a=i.div(n),o=r.greaterThan(0).select(a,po(r.mul(r).oneMinus(),1e-7).inverseSqrt().mul(.5).sub(a));return e.cross(t).mul(o)})).setLayout({name:"LTC_EdgeVectorFormFactor",type:"vec3",inputs:[{name:"v1",type:"vec3"},{name:"v2",type:"vec3"}]}),Lp=Vi((({N:e,V:t,P:r,mInv:s,p0:i,p1:n,p2:a,p3:o})=>{const u=n.sub(i).toVar(),l=o.sub(i).toVar(),d=u.cross(l),c=Qi().toVar();return Gi(d.dot(r.sub(i)).greaterThanEqual(0),(()=>{const u=t.sub(e.mul(t.dot(e))).normalize(),l=e.cross(u).negate(),d=s.mul(on(u,l,e).transpose()).toVar(),h=d.mul(i.sub(r)).normalize().toVar(),p=d.mul(n.sub(r)).normalize().toVar(),g=d.mul(a.sub(r)).normalize().toVar(),m=d.mul(o.sub(r)).normalize().toVar(),f=Qi(0).toVar();f.addAssign(Pp({v1:h,v2:p})),f.addAssign(Pp({v1:p,v2:g})),f.addAssign(Pp({v1:g,v2:m})),f.addAssign(Pp({v1:m,v2:h})),c.assign(Qi(Mp({f:f})))})),c})).setLayout({name:"LTC_Evaluate",type:"vec3",inputs:[{name:"N",type:"vec3"},{name:"V",type:"vec3"},{name:"P",type:"vec3"},{name:"mInv",type:"mat3"},{name:"p0",type:"vec3"},{name:"p1",type:"vec3"},{name:"p2",type:"vec3"},{name:"p3",type:"vec3"}]}),Fp=Vi((({P:e,p0:t,p1:r,p2:s,p3:i})=>{const n=r.sub(t).toVar(),a=i.sub(t).toVar(),o=n.cross(a),u=Qi().toVar();return Gi(o.dot(e.sub(t)).greaterThanEqual(0),(()=>{const n=t.sub(e).normalize().toVar(),a=r.sub(e).normalize().toVar(),o=s.sub(e).normalize().toVar(),l=i.sub(e).normalize().toVar(),d=Qi(0).toVar();d.addAssign(Pp({v1:n,v2:a})),d.addAssign(Pp({v1:a,v2:o})),d.addAssign(Pp({v1:o,v2:l})),d.addAssign(Pp({v1:l,v2:n})),u.assign(Qi(Mp({f:d.abs()})))})),u})).setLayout({name:"LTC_Evaluate",type:"vec3",inputs:[{name:"P",type:"vec3"},{name:"p0",type:"vec3"},{name:"p1",type:"vec3"},{name:"p2",type:"vec3"},{name:"p3",type:"vec3"}]}),Bp=1/6,Ip=e=>na(Bp,na(e,na(e,e.negate().add(3)).sub(3)).add(1)),Dp=e=>na(Bp,na(e,na(e,na(3,e).sub(6))).add(4)),Vp=e=>na(Bp,na(e,na(e,na(-3,e).add(3)).add(3)).add(1)),Up=e=>na(Bp,To(e,3)),Op=e=>Ip(e).add(Dp(e)),Gp=e=>Vp(e).add(Up(e)),kp=e=>sa(-1,Dp(e).div(Ip(e).add(Dp(e)))),zp=e=>sa(1,Up(e).div(Vp(e).add(Up(e)))),$p=(e,t,r)=>{const s=e.uvNode,i=na(s,t.zw).add(.5),n=ka(i),a=Ha(i),o=Op(a.x),u=Gp(a.x),l=kp(a.x),d=zp(a.x),c=kp(a.y),h=zp(a.y),p=qi(n.x.add(l),n.y.add(c)).sub(.5).mul(t.xy),g=qi(n.x.add(d),n.y.add(c)).sub(.5).mul(t.xy),m=qi(n.x.add(l),n.y.add(h)).sub(.5).mul(t.xy),f=qi(n.x.add(d),n.y.add(h)).sub(.5).mul(t.xy),y=Op(a.y).mul(sa(o.mul(e.sample(p).level(r)),u.mul(e.sample(g).level(r)))),x=Gp(a.y).mul(sa(o.mul(e.sample(m).level(r)),u.mul(e.sample(f).level(r))));return y.add(x)},Hp=Vi((([e,t=$i(3)])=>{const r=qi(e.size(Hi(t))),s=qi(e.size(Hi(t.add(1)))),i=aa(1,r),n=aa(1,s),a=$p(e,tn(i,r),ka(t)),o=$p(e,tn(n,s),za(t));return Ha(t).mix(a,o)})),Wp=Vi((([e,t,r,s,i])=>{const n=Qi(Mo(t.negate(),$a(e),aa(1,s))),a=Qi(Ja(i[0].xyz),Ja(i[1].xyz),Ja(i[2].xyz));return $a(n).mul(r.mul(a))})).setLayout({name:"getVolumeTransmissionRay",type:"vec3",inputs:[{name:"n",type:"vec3"},{name:"v",type:"vec3"},{name:"thickness",type:"float"},{name:"ior",type:"float"},{name:"modelMatrix",type:"mat4"}]}),jp=Vi((([e,t])=>e.mul(Ro(t.mul(2).sub(2),0,1)))).setLayout({name:"applyIorToRoughness",type:"float",inputs:[{name:"roughness",type:"float"},{name:"ior",type:"float"}]}),qp=mh(),Xp=mh(),Kp=Vi((([e,t,r],{material:s})=>{const i=(s.side===N?qp:Xp).sample(e),n=Ua(sh.x).mul(jp(t,r));return Hp(i,n)})),Yp=Vi((([e,t,r])=>(Gi(r.notEqual(0),(()=>{const s=Va(t).negate().div(r);return Ia(s.negate().mul(e))})),Qi(1)))).setLayout({name:"volumeAttenuation",type:"vec3",inputs:[{name:"transmissionDistance",type:"float"},{name:"attenuationColor",type:"vec3"},{name:"attenuationDistance",type:"float"}]}),Qp=Vi((([e,t,r,s,i,n,a,o,u,l,d,c,h,p,g])=>{let m,f;if(g){m=tn().toVar(),f=Qi().toVar();const i=d.sub(1).mul(g.mul(.025)),n=Qi(d.sub(i),d,d.add(i));kc({start:0,end:3},(({i:i})=>{const d=n.element(i),g=Wp(e,t,c,d,o),y=a.add(g),x=l.mul(u.mul(tn(y,1))),b=qi(x.xy.div(x.w)).toVar();b.addAssign(1),b.divAssign(2),b.assign(qi(b.x,b.y.oneMinus()));const T=Kp(b,r,d);m.element(i).assign(T.element(i)),m.a.addAssign(T.a),f.element(i).assign(s.element(i).mul(Yp(Ja(g),h,p).element(i)))})),m.a.divAssign(3)}else{const i=Wp(e,t,c,d,o),n=a.add(i),g=l.mul(u.mul(tn(n,1))),y=qi(g.xy.div(g.w)).toVar();y.addAssign(1),y.divAssign(2),y.assign(qi(y.x,y.y.oneMinus())),m=Kp(y,r,d),f=s.mul(Yp(Ja(i),h,p))}const y=f.rgb.mul(m.rgb),x=e.dot(t).clamp(),b=Qi(Sp({dotNV:x,specularColor:i,specularF90:n,roughness:r})),T=f.r.add(f.g,f.b).div(3);return tn(b.oneMinus().mul(y),m.a.oneMinus().mul(T).oneMinus())})),Zp=on(3.2404542,-.969266,.0556434,-1.5371385,1.8760108,-.2040259,-.4985314,.041556,1.0572252),Jp=(e,t)=>e.sub(t).div(e.add(t)).pow2(),eg=Vi((({outsideIOR:e,eta2:t,cosTheta1:r,thinFilmThickness:s,baseF0:i})=>{const n=Ao(e,t,Po(0,.03,s)),a=e.div(n).pow2().mul(r.pow2().oneMinus()).oneMinus();Gi(a.lessThan(0),(()=>Qi(1)));const o=a.sqrt(),u=Jp(n,e),l=ap({f0:u,f90:1,dotVH:r}),d=l.oneMinus(),c=n.lessThan(e).select(Math.PI,0),h=$i(Math.PI).sub(c),p=(e=>{const t=e.sqrt();return Qi(1).add(t).div(Qi(1).sub(t))})(i.clamp(0,.9999)),g=Jp(p,n.toVec3()),m=ap({f0:g,f90:1,dotVH:o}),f=Qi(p.x.lessThan(n).select(Math.PI,0),p.y.lessThan(n).select(Math.PI,0),p.z.lessThan(n).select(Math.PI,0)),y=n.mul(s,o,2),x=Qi(h).add(f),b=l.mul(m).clamp(1e-5,.9999),T=b.sqrt(),_=d.pow2().mul(m).div(Qi(1).sub(b)),v=l.add(_).toVar(),N=_.sub(d).toVar();return kc({start:1,end:2,condition:"<=",name:"m"},(({m:e})=>{N.mulAssign(T);const t=((e,t)=>{const r=e.mul(2*Math.PI*1e-9),s=Qi(54856e-17,44201e-17,52481e-17),i=Qi(1681e3,1795300,2208400),n=Qi(43278e5,93046e5,66121e5),a=$i(9747e-17*Math.sqrt(2*Math.PI*45282e5)).mul(r.mul(2239900).add(t.x).cos()).mul(r.pow2().mul(-45282e5).exp());let o=s.mul(n.mul(2*Math.PI).sqrt()).mul(i.mul(r).add(t).cos()).mul(r.pow2().negate().mul(n).exp());return o=Qi(o.x.add(a),o.y,o.z).div(1.0685e-7),Zp.mul(o)})($i(e).mul(y),$i(e).mul(x)).mul(2);v.addAssign(N.mul(t))})),v.max(Qi(0))})).setLayout({name:"evalIridescence",type:"vec3",inputs:[{name:"outsideIOR",type:"float"},{name:"eta2",type:"float"},{name:"cosTheta1",type:"float"},{name:"thinFilmThickness",type:"float"},{name:"baseF0",type:"vec3"}]}),tg=Vi((({normal:e,viewDir:t,roughness:r})=>{const s=e.dot(t).saturate(),i=r.pow2(),n=Go(r.lessThan(.25),$i(-339.2).mul(i).add($i(161.4).mul(r)).sub(25.9),$i(-8.48).mul(i).add($i(14.3).mul(r)).sub(9.95)),a=Go(r.lessThan(.25),$i(44).mul(i).sub($i(23.7).mul(r)).add(3.26),$i(1.97).mul(i).sub($i(3.27).mul(r)).add(.72));return Go(r.lessThan(.25),0,$i(.1).mul(r).sub(.025)).add(n.mul(s).add(a).exp()).mul(1/Math.PI).saturate()})),rg=Qi(.04),sg=$i(1);class ig extends rp{constructor(e=!1,t=!1,r=!1,s=!1,i=!1,n=!1){super(),this.clearcoat=e,this.sheen=t,this.iridescence=r,this.anisotropy=s,this.transmission=i,this.dispersion=n,this.clearcoatRadiance=null,this.clearcoatSpecularDirect=null,this.clearcoatSpecularIndirect=null,this.sheenSpecularDirect=null,this.sheenSpecularIndirect=null,this.iridescenceFresnel=null,this.iridescenceF0=null}start(e){if(!0===this.clearcoat&&(this.clearcoatRadiance=Qi().toVar("clearcoatRadiance"),this.clearcoatSpecularDirect=Qi().toVar("clearcoatSpecularDirect"),this.clearcoatSpecularIndirect=Qi().toVar("clearcoatSpecularIndirect")),!0===this.sheen&&(this.sheenSpecularDirect=Qi().toVar("sheenSpecularDirect"),this.sheenSpecularIndirect=Qi().toVar("sheenSpecularIndirect")),!0===this.iridescence){const e=zl.dot(Fl).clamp();this.iridescenceFresnel=eg({outsideIOR:$i(1),eta2:Fn,cosTheta1:e,thinFilmThickness:Bn,baseF0:On}),this.iridescenceF0=Ep({f:this.iridescenceFresnel,f90:1,dotVH:e})}if(!0===this.transmission){const t=Ml,r=nl.sub(Ml).normalize(),s=$l,i=e.context;i.backdrop=Qp(s,r,wn,Sn,On,Gn,t,fl,rl,el,jn,Xn,Yn,Kn,this.dispersion?Qn:null),i.backdropAlpha=qn,Sn.a.mulAssign(Ao(1,i.backdrop.a,qn))}super.start(e)}computeMultiscattering(e,t,r){const s=zl.dot(Fl).clamp(),i=Np({roughness:wn,dotNV:s}),n=(this.iridescenceF0?Ln.mix(On,this.iridescenceF0):On).mul(i.x).add(r.mul(i.y)),a=i.x.add(i.y).oneMinus(),o=On.add(On.oneMinus().mul(.047619)),u=n.mul(o).div(a.mul(o).oneMinus());e.addAssign(n),t.addAssign(u.mul(a))}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=zl.dot(e).clamp().mul(t);if(!0===this.sheen&&this.sheenSpecularDirect.addAssign(s.mul(Rp({lightDirection:e}))),!0===this.clearcoat){const r=Hl.dot(e).clamp().mul(t);this.clearcoatSpecularDirect.addAssign(r.mul(vp({lightDirection:e,f0:rg,f90:sg,roughness:Cn,normalView:Hl})))}r.directDiffuse.addAssign(s.mul(op({diffuseColor:Sn.rgb}))),r.directSpecular.addAssign(s.mul(vp({lightDirection:e,f0:On,f90:1,roughness:wn,iridescence:this.iridescence,f:this.iridescenceFresnel,USE_IRIDESCENCE:this.iridescence,USE_ANISOTROPY:this.anisotropy})))}directRectArea({lightColor:e,lightPosition:t,halfWidth:r,halfHeight:s,reflectedLight:i,ltc_1:n,ltc_2:a}){const o=t.add(r).sub(s),u=t.sub(r).sub(s),l=t.sub(r).add(s),d=t.add(r).add(s),c=zl,h=Fl,p=Ll.toVar(),g=Cp({N:c,V:h,roughness:wn}),m=n.sample(g).toVar(),f=a.sample(g).toVar(),y=on(Qi(m.x,0,m.y),Qi(0,1,0),Qi(m.z,0,m.w)).toVar(),x=On.mul(f.x).add(On.oneMinus().mul(f.y)).toVar();i.directSpecular.addAssign(e.mul(x).mul(Lp({N:c,V:h,P:p,mInv:y,p0:o,p1:u,p2:l,p3:d}))),i.directDiffuse.addAssign(e.mul(Sn).mul(Lp({N:c,V:h,P:p,mInv:on(1,0,0,0,1,0,0,0,1),p0:o,p1:u,p2:l,p3:d})))}indirect(e){this.indirectDiffuse(e),this.indirectSpecular(e),this.ambientOcclusion(e)}indirectDiffuse(e){const{irradiance:t,reflectedLight:r}=e.context;r.indirectDiffuse.addAssign(t.mul(op({diffuseColor:Sn})))}indirectSpecular(e){const{radiance:t,iblIrradiance:r,reflectedLight:s}=e.context;if(!0===this.sheen&&this.sheenSpecularIndirect.addAssign(r.mul(Mn,tg({normal:zl,viewDir:Fl,roughness:Pn}))),!0===this.clearcoat){const e=Hl.dot(Fl).clamp(),t=Sp({dotNV:e,specularColor:rg,specularF90:sg,roughness:Cn});this.clearcoatSpecularIndirect.addAssign(this.clearcoatRadiance.mul(t))}const i=Qi().toVar("singleScattering"),n=Qi().toVar("multiScattering"),a=r.mul(1/Math.PI);this.computeMultiscattering(i,n,Gn);const o=i.add(n),u=Sn.mul(o.r.max(o.g).max(o.b).oneMinus());s.indirectSpecular.addAssign(t.mul(i)),s.indirectSpecular.addAssign(n.mul(a)),s.indirectDiffuse.addAssign(u.mul(a))}ambientOcclusion(e){const{ambientOcclusion:t,reflectedLight:r}=e.context,s=zl.dot(Fl).clamp().add(t),i=wn.mul(-16).oneMinus().negate().exp2(),n=t.sub(s.pow(i).oneMinus()).clamp();!0===this.clearcoat&&this.clearcoatSpecularIndirect.mulAssign(t),!0===this.sheen&&this.sheenSpecularIndirect.mulAssign(t),r.indirectDiffuse.mulAssign(t),r.indirectSpecular.mulAssign(n)}finish({context:e}){const{outgoingLight:t}=e;if(!0===this.clearcoat){const e=Hl.dot(Fl).clamp(),r=ap({dotVH:e,f0:rg,f90:sg}),s=t.mul(Rn.mul(r).oneMinus()).add(this.clearcoatSpecularDirect.add(this.clearcoatSpecularIndirect).mul(Rn));t.assign(s)}if(!0===this.sheen){const e=Mn.r.max(Mn.g).max(Mn.b).mul(.157).oneMinus(),r=t.mul(e).add(this.sheenSpecularDirect,this.sheenSpecularIndirect);t.assign(r)}}}const ng=$i(1),ag=$i(-2),og=$i(.8),ug=$i(-1),lg=$i(.4),dg=$i(2),cg=$i(.305),hg=$i(3),pg=$i(.21),gg=$i(4),mg=$i(4),fg=$i(16),yg=Vi((([e])=>{const t=Qi(Qa(e)).toVar(),r=$i(-1).toVar();return Gi(t.x.greaterThan(t.z),(()=>{Gi(t.x.greaterThan(t.y),(()=>{r.assign(Go(e.x.greaterThan(0),0,3))})).Else((()=>{r.assign(Go(e.y.greaterThan(0),1,4))}))})).Else((()=>{Gi(t.z.greaterThan(t.y),(()=>{r.assign(Go(e.z.greaterThan(0),2,5))})).Else((()=>{r.assign(Go(e.y.greaterThan(0),1,4))}))})),r})).setLayout({name:"getFace",type:"float",inputs:[{name:"direction",type:"vec3"}]}),xg=Vi((([e,t])=>{const r=qi().toVar();return Gi(t.equal(0),(()=>{r.assign(qi(e.z,e.y).div(Qa(e.x)))})).ElseIf(t.equal(1),(()=>{r.assign(qi(e.x.negate(),e.z.negate()).div(Qa(e.y)))})).ElseIf(t.equal(2),(()=>{r.assign(qi(e.x.negate(),e.y).div(Qa(e.z)))})).ElseIf(t.equal(3),(()=>{r.assign(qi(e.z.negate(),e.y).div(Qa(e.x)))})).ElseIf(t.equal(4),(()=>{r.assign(qi(e.x.negate(),e.z).div(Qa(e.y)))})).Else((()=>{r.assign(qi(e.x,e.y).div(Qa(e.z)))})),na(.5,r.add(1))})).setLayout({name:"getUV",type:"vec2",inputs:[{name:"direction",type:"vec3"},{name:"face",type:"float"}]}),bg=Vi((([e])=>{const t=$i(0).toVar();return Gi(e.greaterThanEqual(og),(()=>{t.assign(ng.sub(e).mul(ug.sub(ag)).div(ng.sub(og)).add(ag))})).ElseIf(e.greaterThanEqual(lg),(()=>{t.assign(og.sub(e).mul(dg.sub(ug)).div(og.sub(lg)).add(ug))})).ElseIf(e.greaterThanEqual(cg),(()=>{t.assign(lg.sub(e).mul(hg.sub(dg)).div(lg.sub(cg)).add(dg))})).ElseIf(e.greaterThanEqual(pg),(()=>{t.assign(cg.sub(e).mul(gg.sub(hg)).div(cg.sub(pg)).add(hg))})).Else((()=>{t.assign($i(-2).mul(Ua(na(1.16,e))))})),t})).setLayout({name:"roughnessToMip",type:"float",inputs:[{name:"roughness",type:"float"}]}),Tg=Vi((([e,t])=>{const r=e.toVar();r.assign(na(2,r).sub(1));const s=Qi(r,1).toVar();return Gi(t.equal(0),(()=>{s.assign(s.zyx)})).ElseIf(t.equal(1),(()=>{s.assign(s.xzy),s.xz.mulAssign(-1)})).ElseIf(t.equal(2),(()=>{s.x.mulAssign(-1)})).ElseIf(t.equal(3),(()=>{s.assign(s.zyx),s.xz.mulAssign(-1)})).ElseIf(t.equal(4),(()=>{s.assign(s.xzy),s.xy.mulAssign(-1)})).ElseIf(t.equal(5),(()=>{s.z.mulAssign(-1)})),s})).setLayout({name:"getDirection",type:"vec3",inputs:[{name:"uv",type:"vec2"},{name:"face",type:"float"}]}),_g=Vi((([e,t,r,s,i,n])=>{const a=$i(r),o=Qi(t),u=Ro(bg(a),ag,n),l=Ha(u),d=ka(u),c=Qi(vg(e,o,d,s,i,n)).toVar();return Gi(l.notEqual(0),(()=>{const t=Qi(vg(e,o,d.add(1),s,i,n)).toVar();c.assign(Ao(c,t,l))})),c})),vg=Vi((([e,t,r,s,i,n])=>{const a=$i(r).toVar(),o=Qi(t),u=$i(yg(o)).toVar(),l=$i(po(mg.sub(a),0)).toVar();a.assign(po(a,mg));const d=$i(Da(a)).toVar(),c=qi(xg(o,u).mul(d.sub(2)).add(1)).toVar();return Gi(u.greaterThan(2),(()=>{c.y.addAssign(d),u.subAssign(3)})),c.x.addAssign(u.mul(d)),c.x.addAssign(l.mul(na(3,fg))),c.y.addAssign(na(4,Da(n).sub(d))),c.x.mulAssign(s),c.y.mulAssign(i),e.sample(c).grad(qi(),qi())})),Ng=Vi((({envMap:e,mipInt:t,outputDirection:r,theta:s,axis:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:a,CUBEUV_MAX_MIP:o})=>{const u=ja(s),l=r.mul(u).add(i.cross(r).mul(Wa(s))).add(i.mul(i.dot(r).mul(u.oneMinus())));return vg(e,l,t,n,a,o)})),Sg=Vi((({n:e,latitudinal:t,poleAxis:r,outputDirection:s,weights:i,samples:n,dTheta:a,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})=>{const h=Qi(Go(t,r,bo(r,s))).toVar();Gi(h.equal(Qi(0)),(()=>{h.assign(Qi(s.z,0,s.x.negate()))})),h.assign($a(h));const p=Qi().toVar();return p.addAssign(i.element(0).mul(Ng({theta:0,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),kc({start:Hi(1),end:e},(({i:e})=>{Gi(e.greaterThanEqual(n),(()=>{zc()}));const t=$i(a.mul($i(e))).toVar();p.addAssign(i.element(e).mul(Ng({theta:t.mul(-1),axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),p.addAssign(i.element(e).mul(Ng({theta:t,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})))})),tn(p,1)})),Eg=[.125,.215,.35,.446,.526,.582],wg=20,Ag=new ie(-1,1,1,-1,0,1),Rg=new ne(90,1),Cg=new e;let Mg=null,Pg=0,Lg=0;const Fg=(1+Math.sqrt(5))/2,Bg=1/Fg,Ig=[new r(-Fg,Bg,0),new r(Fg,Bg,0),new r(-Bg,0,Fg),new r(Bg,0,Fg),new r(0,Fg,-Bg),new r(0,Fg,Bg),new r(-1,1,-1),new r(1,1,-1),new r(-1,1,1),new r(1,1,1)],Dg=new r,Vg=new WeakMap,Ug=[3,1,5,0,4,2],Og=Tg(Uu(),Vu("faceIndex")).normalize(),Gg=Qi(Og.x,Og.y,Og.z);class kg{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._lodPlanes=[],this._sizeLods=[],this._sigmas=[],this._lodMeshes=[],this._blurMaterial=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._backgroundBox=null}get _hasInitialized(){return this._renderer.hasInitialized()}fromScene(e,t=0,r=.1,s=100,i={}){const{size:n=256,position:a=Dg,renderTarget:o=null}=i;if(this._setSize(n),!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromScene() called before the backend is initialized. Try using .fromSceneAsync() instead.");const n=o||this._allocateTargets();return i.renderTarget=n,this.fromSceneAsync(e,t,r,s,i),n}Mg=this._renderer.getRenderTarget(),Pg=this._renderer.getActiveCubeFace(),Lg=this._renderer.getActiveMipmapLevel();const u=o||this._allocateTargets();return u.depthBuffer=!0,this._sceneToCubeUV(e,r,s,u,a),t>0&&this._blur(u,0,0,t),this._applyPMREM(u),this._cleanup(u),u}async fromSceneAsync(e,t=0,r=.1,s=100,i={}){return!1===this._hasInitialized&&await this._renderer.init(),this.fromScene(e,t,r,s,i)}fromEquirectangular(e,t=null){if(!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromEquirectangular() called before the backend is initialized. Try using .fromEquirectangularAsync() instead."),this._setSizeFromTexture(e);const r=t||this._allocateTargets();return this.fromEquirectangularAsync(e,r),r}return this._fromTexture(e,t)}async fromEquirectangularAsync(e,t=null){return!1===this._hasInitialized&&await this._renderer.init(),this._fromTexture(e,t)}fromCubemap(e,t=null){if(!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromCubemap() called before the backend is initialized. Try using .fromCubemapAsync() instead."),this._setSizeFromTexture(e);const r=t||this._allocateTargets();return this.fromCubemapAsync(e,t),r}return this._fromTexture(e,t)}async fromCubemapAsync(e,t=null){return!1===this._hasInitialized&&await this._renderer.init(),this._fromTexture(e,t)}async compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=Wg(),await this._compileMaterial(this._cubemapMaterial))}async compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=jg(),await this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),null!==this._cubemapMaterial&&this._cubemapMaterial.dispose(),null!==this._equirectMaterial&&this._equirectMaterial.dispose(),null!==this._backgroundBox&&(this._backgroundBox.geometry.dispose(),this._backgroundBox.material.dispose())}_setSizeFromTexture(e){e.mapping===E||e.mapping===w?this._setSize(0===e.image.length?16:e.image[0].width||e.image[0].image.width):this._setSize(e.image.width/4)}_setSize(e){this._lodMax=Math.floor(Math.log2(e)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){null!==this._blurMaterial&&this._blurMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;ee-4?u=Eg[o-e+4-1]:0===o&&(u=0),s.push(u);const l=1/(a-2),d=-l,c=1+l,h=[d,d,c,d,c,c,d,d,c,c,d,c],p=6,g=6,m=3,f=2,y=1,x=new Float32Array(m*g*p),b=new Float32Array(f*g*p),T=new Float32Array(y*g*p);for(let e=0;e2?0:-1,s=[t,r,0,t+2/3,r,0,t+2/3,r+1,0,t,r,0,t+2/3,r+1,0,t,r+1,0],i=Ug[e];x.set(s,m*g*i),b.set(h,f*g*i);const n=[i,i,i,i,i,i];T.set(n,y*g*i)}const _=new ue;_.setAttribute("position",new le(x,m)),_.setAttribute("uv",new le(b,f)),_.setAttribute("faceIndex",new le(T,y)),t.push(_),i.push(new W(_,null)),n>4&&n--}return{lodPlanes:t,sizeLods:r,sigmas:s,lodMeshes:i}}(i)),this._blurMaterial=function(e,t,s){const i=Yu(new Array(wg).fill(0)),n=Tn(new r(0,1,0)),a=Tn(0),o=$i(wg),u=Tn(0),l=Tn(1),d=Hu(null),c=Tn(0),h=$i(1/t),p=$i(1/s),g=$i(e),m={n:o,latitudinal:u,weights:i,poleAxis:n,outputDirection:Gg,dTheta:a,samples:l,envMap:d,mipInt:c,CUBEUV_TEXEL_WIDTH:h,CUBEUV_TEXEL_HEIGHT:p,CUBEUV_MAX_MIP:g},f=Hg("blur");return f.fragmentNode=Sg({...m,latitudinal:u.equal(1)}),Vg.set(f,m),f}(i,e,t)}return i}async _compileMaterial(e){const t=new W(this._lodPlanes[0],e);await this._renderer.compile(t,Ag)}_sceneToCubeUV(e,t,r,s,i){const n=Rg;n.near=t,n.far=r;const a=[1,1,1,1,-1,1],o=[1,-1,1,-1,1,-1],u=this._renderer,l=u.autoClear;u.getClearColor(Cg),u.autoClear=!1;let d=this._backgroundBox;if(null===d){const e=new te({name:"PMREM.Background",side:N,depthWrite:!1,depthTest:!1});d=new W(new H,e)}let c=!1;const h=e.background;h?h.isColor&&(d.material.color.copy(h),e.background=null,c=!0):(d.material.color.copy(Cg),c=!0),u.setRenderTarget(s),u.clear(),c&&u.render(d,n);for(let t=0;t<6;t++){const r=t%3;0===r?(n.up.set(0,a[t],0),n.position.set(i.x,i.y,i.z),n.lookAt(i.x+o[t],i.y,i.z)):1===r?(n.up.set(0,0,a[t]),n.position.set(i.x,i.y,i.z),n.lookAt(i.x,i.y+o[t],i.z)):(n.up.set(0,a[t],0),n.position.set(i.x,i.y,i.z),n.lookAt(i.x,i.y,i.z+o[t]));const l=this._cubeSize;$g(s,r*l,t>2?l:0,l,l),u.render(e,n)}u.autoClear=l,e.background=h}_textureToCubeUV(e,t){const r=this._renderer,s=e.mapping===E||e.mapping===w;s?null===this._cubemapMaterial&&(this._cubemapMaterial=Wg(e)):null===this._equirectMaterial&&(this._equirectMaterial=jg(e));const i=s?this._cubemapMaterial:this._equirectMaterial;i.fragmentNode.value=e;const n=this._lodMeshes[0];n.material=i;const a=this._cubeSize;$g(t,0,0,3*a,2*a),r.setRenderTarget(t),r.render(n,Ag)}_applyPMREM(e){const t=this._renderer,r=t.autoClear;t.autoClear=!1;const s=this._lodPlanes.length;for(let t=1;twg&&console.warn(`sigmaRadians, ${i}, is too large and will clip, as it requested ${g} samples when the maximum is set to 20`);const m=[];let f=0;for(let e=0;ey-4?s-y+4:0),4*(this._cubeSize-x),3*x,2*x),o.setRenderTarget(t),o.render(l,Ag)}}function zg(e,t,r){const s=new ae(e,t,r);return s.texture.mapping=oe,s.texture.name="PMREM.cubeUv",s.texture.isPMREMTexture=!0,s.scissorTest=!0,s}function $g(e,t,r,s,i){e.viewport.set(t,r,s,i),e.scissor.set(t,r,s,i)}function Hg(e){const t=new Fh;return t.depthTest=!1,t.depthWrite=!1,t.blending=G,t.name=`PMREM_${e}`,t}function Wg(e){const t=Hg("cubemap");return t.fragmentNode=sd(e,Gg),t}function jg(e){const t=Hg("equirect");return t.fragmentNode=Hu(e,qh(Gg),0),t}const qg=new WeakMap;function Xg(e,t,r){const s=function(e){let t=qg.get(e);void 0===t&&(t=new WeakMap,qg.set(e,t));return t}(t);let i=s.get(e);if((void 0!==i?i.pmremVersion:-1)!==e.pmremVersion){const t=e.image;if(e.isCubeTexture){if(!function(e){if(null==e)return!1;let t=0;const r=6;for(let s=0;s0}(t))return null;i=r.fromEquirectangular(e,i)}i.pmremVersion=e.pmremVersion,s.set(e,i)}return i.texture}class Kg extends js{static get type(){return"PMREMNode"}constructor(e,t=null,r=null){super("vec3"),this._value=e,this._pmrem=null,this.uvNode=t,this.levelNode=r,this._generator=null;const s=new pe;s.isRenderTargetTexture=!0,this._texture=Hu(s),this._width=Tn(0),this._height=Tn(0),this._maxMip=Tn(0),this.updateBeforeType=Is.RENDER}set value(e){this._value=e,this._pmrem=null}get value(){return this._value}updateFromTexture(e){const t=function(e){const t=Math.log2(e)-2,r=1/e;return{texelWidth:1/(3*Math.max(Math.pow(2,t),112)),texelHeight:r,maxMip:t}}(e.image.height);this._texture.value=e,this._width.value=t.texelWidth,this._height.value=t.texelHeight,this._maxMip.value=t.maxMip}updateBefore(e){let t=this._pmrem;const r=t?t.pmremVersion:-1,s=this._value;r!==s.pmremVersion&&(t=!0===s.isPMREMTexture?s:Xg(s,e.renderer,this._generator),null!==t&&(this._pmrem=t,this.updateFromTexture(t)))}setup(e){null===this._generator&&(this._generator=new kg(e.renderer)),this.updateBefore(e);let t=this.uvNode;null===t&&e.context.getUV&&(t=e.context.getUV(this)),t=Ql.mul(Qi(t.x,t.y.negate(),t.z));let r=this.levelNode;return null===r&&e.context.getTextureLevel&&(r=e.context.getTextureLevel(this)),_g(this._texture,t,r,this._width,this._height,this._maxMip)}dispose(){super.dispose(),null!==this._generator&&this._generator.dispose()}}const Yg=Bi(Kg).setParameterLength(1,3),Qg=new WeakMap;class Zg extends Xc{static get type(){return"EnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){const{material:t}=e;let r=this.envNode;if(r.isTextureNode||r.isMaterialReferenceNode){const e=r.isTextureNode?r.value:t[r.property];let s=Qg.get(e);void 0===s&&(s=Yg(e),Qg.set(e,s)),r=s}const s=!0===t.useAnisotropy||t.anisotropy>0?Ed:zl,i=r.context(Jg(wn,s)).mul(Yl),n=r.context(em($l)).mul(Math.PI).mul(Yl),a=Nu(i),o=Nu(n);e.context.radiance.addAssign(a),e.context.iblIrradiance.addAssign(o);const u=e.context.lightingModel.clearcoatRadiance;if(u){const e=r.context(Jg(Cn,Hl)).mul(Yl),t=Nu(e);u.addAssign(t)}}}const Jg=(e,t)=>{let r=null;return{getUV:()=>(null===r&&(r=Fl.negate().reflect(t),r=e.mul(e).mix(r,t).normalize(),r=r.transformDirection(rl)),r),getTextureLevel:()=>e}},em=e=>({getUV:()=>e,getTextureLevel:()=>$i(1)}),tm=new ge;class rm extends Fh{static get type(){return"MeshStandardNodeMaterial"}constructor(e){super(),this.isMeshStandardNodeMaterial=!0,this.lights=!0,this.emissiveNode=null,this.metalnessNode=null,this.roughnessNode=null,this.setDefaultValues(tm),this.setValues(e)}setupEnvironment(e){let t=super.setupEnvironment(e);return null===t&&e.environmentNode&&(t=e.environmentNode),t?new Zg(t):null}setupLightingModel(){return new ig}setupSpecular(){const e=Ao(Qi(.04),Sn.rgb,An);On.assign(e),Gn.assign(1)}setupVariants(){const e=this.metalnessNode?$i(this.metalnessNode):jd;An.assign(e);let t=this.roughnessNode?$i(this.roughnessNode):Wd;t=fp({roughness:t}),wn.assign(t),this.setupSpecular(),Sn.assign(tn(Sn.rgb.mul(e.oneMinus()),Sn.a))}copy(e){return this.emissiveNode=e.emissiveNode,this.metalnessNode=e.metalnessNode,this.roughnessNode=e.roughnessNode,super.copy(e)}}const sm=new me;class im extends rm{static get type(){return"MeshPhysicalNodeMaterial"}constructor(e){super(),this.isMeshPhysicalNodeMaterial=!0,this.clearcoatNode=null,this.clearcoatRoughnessNode=null,this.clearcoatNormalNode=null,this.sheenNode=null,this.sheenRoughnessNode=null,this.iridescenceNode=null,this.iridescenceIORNode=null,this.iridescenceThicknessNode=null,this.specularIntensityNode=null,this.specularColorNode=null,this.iorNode=null,this.transmissionNode=null,this.thicknessNode=null,this.attenuationDistanceNode=null,this.attenuationColorNode=null,this.dispersionNode=null,this.anisotropyNode=null,this.setDefaultValues(sm),this.setValues(e)}get useClearcoat(){return this.clearcoat>0||null!==this.clearcoatNode}get useIridescence(){return this.iridescence>0||null!==this.iridescenceNode}get useSheen(){return this.sheen>0||null!==this.sheenNode}get useAnisotropy(){return this.anisotropy>0||null!==this.anisotropyNode}get useTransmission(){return this.transmission>0||null!==this.transmissionNode}get useDispersion(){return this.dispersion>0||null!==this.dispersionNode}setupSpecular(){const e=this.iorNode?$i(this.iorNode):ac;jn.assign(e),On.assign(Ao(ho(_o(jn.sub(1).div(jn.add(1))).mul(zd),Qi(1)).mul(kd),Sn.rgb,An)),Gn.assign(Ao(kd,1,An))}setupLightingModel(){return new ig(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion)}setupVariants(e){if(super.setupVariants(e),this.useClearcoat){const e=this.clearcoatNode?$i(this.clearcoatNode):Xd,t=this.clearcoatRoughnessNode?$i(this.clearcoatRoughnessNode):Kd;Rn.assign(e),Cn.assign(fp({roughness:t}))}if(this.useSheen){const e=this.sheenNode?Qi(this.sheenNode):Zd,t=this.sheenRoughnessNode?$i(this.sheenRoughnessNode):Jd;Mn.assign(e),Pn.assign(t)}if(this.useIridescence){const e=this.iridescenceNode?$i(this.iridescenceNode):tc,t=this.iridescenceIORNode?$i(this.iridescenceIORNode):rc,r=this.iridescenceThicknessNode?$i(this.iridescenceThicknessNode):sc;Ln.assign(e),Fn.assign(t),Bn.assign(r)}if(this.useAnisotropy){const e=(this.anisotropyNode?qi(this.anisotropyNode):ec).toVar();Dn.assign(e.length()),Gi(Dn.equal(0),(()=>{e.assign(qi(1,0))})).Else((()=>{e.divAssign(qi(Dn)),Dn.assign(Dn.saturate())})),In.assign(Dn.pow2().mix(wn.pow2(),1)),Vn.assign(Nd[0].mul(e.x).add(Nd[1].mul(e.y))),Un.assign(Nd[1].mul(e.x).sub(Nd[0].mul(e.y)))}if(this.useTransmission){const e=this.transmissionNode?$i(this.transmissionNode):ic,t=this.thicknessNode?$i(this.thicknessNode):nc,r=this.attenuationDistanceNode?$i(this.attenuationDistanceNode):oc,s=this.attenuationColorNode?Qi(this.attenuationColorNode):uc;if(qn.assign(e),Xn.assign(t),Kn.assign(r),Yn.assign(s),this.useDispersion){const e=this.dispersionNode?$i(this.dispersionNode):mc;Qn.assign(e)}}}setupClearcoatNormal(){return this.clearcoatNormalNode?Qi(this.clearcoatNormalNode):Yd}setup(e){e.context.setupClearcoatNormal=()=>this.setupClearcoatNormal(e),super.setup(e)}copy(e){return this.clearcoatNode=e.clearcoatNode,this.clearcoatRoughnessNode=e.clearcoatRoughnessNode,this.clearcoatNormalNode=e.clearcoatNormalNode,this.sheenNode=e.sheenNode,this.sheenRoughnessNode=e.sheenRoughnessNode,this.iridescenceNode=e.iridescenceNode,this.iridescenceIORNode=e.iridescenceIORNode,this.iridescenceThicknessNode=e.iridescenceThicknessNode,this.specularIntensityNode=e.specularIntensityNode,this.specularColorNode=e.specularColorNode,this.transmissionNode=e.transmissionNode,this.thicknessNode=e.thicknessNode,this.attenuationDistanceNode=e.attenuationDistanceNode,this.attenuationColorNode=e.attenuationColorNode,this.dispersionNode=e.dispersionNode,this.anisotropyNode=e.anisotropyNode,super.copy(e)}}class nm extends ig{constructor(e=!1,t=!1,r=!1,s=!1,i=!1,n=!1,a=!1){super(e,t,r,s,i,n),this.useSSS=a}direct({lightDirection:e,lightColor:t,reflectedLight:r},s){if(!0===this.useSSS){const i=s.material,{thicknessColorNode:n,thicknessDistortionNode:a,thicknessAmbientNode:o,thicknessAttenuationNode:u,thicknessPowerNode:l,thicknessScaleNode:d}=i,c=e.add(zl.mul(a)).normalize(),h=$i(Fl.dot(c.negate()).saturate().pow(l).mul(d)),p=Qi(h.add(o).mul(n));r.directDiffuse.addAssign(p.mul(u.mul(t)))}super.direct({lightDirection:e,lightColor:t,reflectedLight:r},s)}}class am extends im{static get type(){return"MeshSSSNodeMaterial"}constructor(e){super(e),this.thicknessColorNode=null,this.thicknessDistortionNode=$i(.1),this.thicknessAmbientNode=$i(0),this.thicknessAttenuationNode=$i(.1),this.thicknessPowerNode=$i(2),this.thicknessScaleNode=$i(10)}get useSSS(){return null!==this.thicknessColorNode}setupLightingModel(){return new nm(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion,this.useSSS)}copy(e){return this.thicknessColorNode=e.thicknessColorNode,this.thicknessDistortionNode=e.thicknessDistortionNode,this.thicknessAmbientNode=e.thicknessAmbientNode,this.thicknessAttenuationNode=e.thicknessAttenuationNode,this.thicknessPowerNode=e.thicknessPowerNode,this.thicknessScaleNode=e.thicknessScaleNode,super.copy(e)}}const om=Vi((({normal:e,lightDirection:t,builder:r})=>{const s=e.dot(t),i=qi(s.mul(.5).add(.5),0);if(r.material.gradientMap){const e=ld("gradientMap","texture").context({getUV:()=>i});return Qi(e.r)}{const e=i.fwidth().mul(.5);return Ao(Qi(.7),Qi(1),Po($i(.7).sub(e.x),$i(.7).add(e.x),i.x))}}));class um extends rp{direct({lightDirection:e,lightColor:t,reflectedLight:r},s){const i=om({normal:Vl,lightDirection:e,builder:s}).mul(t);r.directDiffuse.addAssign(i.mul(op({diffuseColor:Sn.rgb})))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(op({diffuseColor:Sn}))),s.indirectDiffuse.mulAssign(t)}}const lm=new fe;class dm extends Fh{static get type(){return"MeshToonNodeMaterial"}constructor(e){super(),this.isMeshToonNodeMaterial=!0,this.lights=!0,this.setDefaultValues(lm),this.setValues(e)}setupLightingModel(){return new um}}class cm extends js{static get type(){return"MatcapUVNode"}constructor(){super("vec2")}setup(){const e=Qi(Fl.z,0,Fl.x.negate()).normalize(),t=Fl.cross(e);return qi(e.dot(zl),t.dot(zl)).mul(.495).add(.5)}}const hm=Ii(cm),pm=new ye;class gm extends Fh{static get type(){return"MeshMatcapNodeMaterial"}constructor(e){super(),this.isMeshMatcapNodeMaterial=!0,this.setDefaultValues(pm),this.setValues(e)}setupVariants(e){const t=hm;let r;r=e.material.matcap?ld("matcap","texture").context({getUV:()=>t}):Qi(Ao(.2,.8,t.y)),Sn.rgb.mulAssign(r.rgb)}}class mm extends js{static get type(){return"RotateNode"}constructor(e,t){super(),this.positionNode=e,this.rotationNode=t}getNodeType(e){return this.positionNode.getNodeType(e)}setup(e){const{rotationNode:t,positionNode:r}=this;if("vec2"===this.getNodeType(e)){const e=t.cos(),s=t.sin();return an(e,s,s.negate(),e).mul(r)}{const e=t,s=un(tn(1,0,0,0),tn(0,ja(e.x),Wa(e.x).negate(),0),tn(0,Wa(e.x),ja(e.x),0),tn(0,0,0,1)),i=un(tn(ja(e.y),0,Wa(e.y),0),tn(0,1,0,0),tn(Wa(e.y).negate(),0,ja(e.y),0),tn(0,0,0,1)),n=un(tn(ja(e.z),Wa(e.z).negate(),0,0),tn(Wa(e.z),ja(e.z),0,0),tn(0,0,1,0),tn(0,0,0,1));return s.mul(i).mul(n).mul(tn(r,1)).xyz}}}const fm=Bi(mm).setParameterLength(2),ym=new xe;class xm extends Fh{static get type(){return"SpriteNodeMaterial"}constructor(e){super(),this.isSpriteNodeMaterial=!0,this._useSizeAttenuation=!0,this.positionNode=null,this.rotationNode=null,this.scaleNode=null,this.transparent=!0,this.setDefaultValues(ym),this.setValues(e)}setupPositionView(e){const{object:t,camera:r}=e,s=this.sizeAttenuation,{positionNode:i,rotationNode:n,scaleNode:a}=this,o=Nl.mul(Qi(i||0));let u=qi(fl[0].xyz.length(),fl[1].xyz.length());if(null!==a&&(u=u.mul(qi(a))),!1===s)if(r.isPerspectiveCamera)u=u.mul(o.z.negate());else{const e=$i(2).div(el.element(1).element(1));u=u.mul(e.mul(2))}let l=Al.xy;if(t.center&&!0===t.center.isVector2){const e=((e,t,r)=>Pi(new lu(e,t,r)))("center","vec2",t);l=l.sub(e.sub(.5))}l=l.mul(u);const d=$i(n||Qd),c=fm(l,d);return tn(o.xy.add(c),o.zw)}copy(e){return this.positionNode=e.positionNode,this.rotationNode=e.rotationNode,this.scaleNode=e.scaleNode,super.copy(e)}get sizeAttenuation(){return this._useSizeAttenuation}set sizeAttenuation(e){this._useSizeAttenuation!==e&&(this._useSizeAttenuation=e,this.needsUpdate=!0)}}const bm=new be;class Tm extends xm{static get type(){return"PointsNodeMaterial"}constructor(e){super(),this.sizeNode=null,this.isPointsNodeMaterial=!0,this.setDefaultValues(bm),this.setValues(e)}setupPositionView(){const{positionNode:e}=this;return Nl.mul(Qi(e||Rl)).xyz}setupVertex(e){const t=super.setupVertex(e);if(!0!==e.material.isNodeMaterial)return t;const{rotationNode:r,scaleNode:s,sizeNode:i}=this,n=Al.xy.toVar(),a=nh.z.div(nh.w);if(r&&r.isNode){const e=$i(r);n.assign(fm(n,e))}let o=null!==i?qi(i):gc;return!0===this.sizeAttenuation&&(o=o.mul(o.div(Ll.z.negate()))),s&&s.isNode&&(o=o.mul(qi(s))),n.mulAssign(o.mul(2)),n.assign(n.div(nh.z)),n.y.assign(n.y.mul(a)),n.assign(n.mul(t.w)),t.addAssign(tn(n,0,0)),t}get alphaToCoverage(){return this._useAlphaToCoverage}set alphaToCoverage(e){this._useAlphaToCoverage!==e&&(this._useAlphaToCoverage=e,this.needsUpdate=!0)}}class _m extends rp{constructor(){super(),this.shadowNode=$i(1).toVar("shadowMask")}direct({lightNode:e}){this.shadowNode.mulAssign(e.shadowNode)}finish({context:e}){Sn.a.mulAssign(this.shadowNode.oneMinus()),e.outgoingLight.rgb.assign(Sn.rgb)}}const vm=new Te;class Nm extends Fh{static get type(){return"ShadowNodeMaterial"}constructor(e){super(),this.isShadowNodeMaterial=!0,this.lights=!0,this.transparent=!0,this.setDefaultValues(vm),this.setValues(e)}setupLightingModel(){return new _m}}const Sm=vn("vec3"),Em=vn("vec3"),wm=vn("vec3");class Am extends rp{constructor(){super()}start(e){const{material:t,context:r}=e,s=vn("vec3"),i=vn("vec3");Gi(nl.sub(Ml).length().greaterThan(Tl.mul(2)),(()=>{s.assign(nl),i.assign(Ml)})).Else((()=>{s.assign(Ml),i.assign(nl)}));const n=i.sub(s),a=Tn("int").onRenderUpdate((({material:e})=>e.steps)),o=n.length().div(a).toVar(),u=n.normalize().toVar(),l=$i(0).toVar(),d=Qi(1).toVar();t.offsetNode&&l.addAssign(t.offsetNode.mul(o)),kc(a,(()=>{const i=s.add(u.mul(l)),n=rl.mul(tn(i,1)).xyz;let a;null!==t.depthNode&&(Em.assign(wh(_h(n.z,Zu,Ju))),r.sceneDepthNode=wh(t.depthNode).toVar()),r.positionWorld=i,r.shadowPositionWorld=i,r.positionView=n,Sm.assign(0),t.scatteringNode&&(a=t.scatteringNode({positionRay:i})),super.start(e),a&&Sm.mulAssign(a);const c=Sm.mul(.01).negate().mul(o).exp();d.mulAssign(c),l.addAssign(o)})),wm.addAssign(d.saturate().oneMinus())}scatteringLight(e,t){const r=t.context.sceneDepthNode;r?Gi(r.greaterThanEqual(Em),(()=>{Sm.addAssign(e)})):Sm.addAssign(e)}direct({lightNode:e,lightColor:t},r){if(void 0===e.light.distance)return;const s=t.xyz.toVar();s.mulAssign(e.shadowNode),this.scatteringLight(s,r)}directRectArea({lightColor:e,lightPosition:t,halfWidth:r,halfHeight:s},i){const n=t.add(r).sub(s),a=t.sub(r).sub(s),o=t.sub(r).add(s),u=t.add(r).add(s),l=i.context.positionView,d=e.xyz.mul(Fp({P:l,p0:n,p1:a,p2:o,p3:u})).pow(1.5);this.scatteringLight(d,i)}finish(e){e.context.outgoingLight.assign(wm)}}class Rm extends Fh{static get type(){return"VolumeNodeMaterial"}constructor(e){super(),this.isVolumeNodeMaterial=!0,this.steps=25,this.offsetNode=null,this.scatteringNode=null,this.lights=!0,this.transparent=!0,this.side=N,this.depthTest=!1,this.depthWrite=!1,this.setValues(e)}setupLightingModel(){return new Am}}class Cm{constructor(e,t){this.nodes=e,this.info=t,this._context=self,this._animationLoop=null,this._requestId=null}start(){const e=(t,r)=>{this._requestId=this._context.requestAnimationFrame(e),!0===this.info.autoReset&&this.info.reset(),this.nodes.nodeFrame.update(),this.info.frame=this.nodes.nodeFrame.frameId,null!==this._animationLoop&&this._animationLoop(t,r)};e()}stop(){this._context.cancelAnimationFrame(this._requestId),this._requestId=null}getAnimationLoop(){return this._animationLoop}setAnimationLoop(e){this._animationLoop=e}getContext(){return this._context}setContext(e){this._context=e}dispose(){this.stop()}}class Mm{constructor(){this.weakMap=new WeakMap}get(e){let t=this.weakMap;for(let r=0;r{this.dispose()},this.material.addEventListener("dispose",this.onMaterialDispose)}updateClipping(e){this.clippingContext=e}get clippingNeedsUpdate(){return null!==this.clippingContext&&this.clippingContext.cacheKey!==this.clippingContextCacheKey&&(this.clippingContextCacheKey=this.clippingContext.cacheKey,!0)}get hardwareClippingPlanes(){return!0===this.material.hardwareClipping?this.clippingContext.unionClippingCount:0}getNodeBuilderState(){return this._nodeBuilderState||(this._nodeBuilderState=this._nodes.getForRender(this))}getMonitor(){return this._monitor||(this._monitor=this.getNodeBuilderState().observer)}getBindings(){return this._bindings||(this._bindings=this.getNodeBuilderState().createBindings())}getBindingGroup(e){for(const t of this.getBindings())if(t.name===e)return t}getIndex(){return this._geometries.getIndex(this)}getIndirect(){return this._geometries.getIndirect(this)}getChainArray(){return[this.object,this.material,this.context,this.lightsNode]}setGeometry(e){this.geometry=e,this.attributes=null}getAttributes(){if(null!==this.attributes)return this.attributes;const e=this.getNodeBuilderState().nodeAttributes,t=this.geometry,r=[],s=new Set;for(const i of e){const e=i.node&&i.node.attribute?i.node.attribute:t.getAttribute(i.name);if(void 0===e)continue;r.push(e);const n=e.isInterleavedBufferAttribute?e.data:e;s.add(n)}return this.attributes=r,this.vertexBuffers=Array.from(s.values()),r}getVertexBuffers(){return null===this.vertexBuffers&&this.getAttributes(),this.vertexBuffers}getDrawParameters(){const{object:e,material:t,geometry:r,group:s,drawRange:i}=this,n=this.drawParams||(this.drawParams={vertexCount:0,firstVertex:0,instanceCount:0,firstInstance:0}),a=this.getIndex(),o=null!==a,u=r.isInstancedBufferGeometry?r.instanceCount:e.count>1?e.count:1;if(0===u)return null;if(n.instanceCount=u,!0===e.isBatchedMesh)return n;let l=1;!0!==t.wireframe||e.isPoints||e.isLineSegments||e.isLine||e.isLineLoop||(l=2);let d=i.start*l,c=(i.start+i.count)*l;null!==s&&(d=Math.max(d,s.start*l),c=Math.min(c,(s.start+s.count)*l));const h=r.attributes.position;let p=1/0;o?p=a.count:null!=h&&(p=h.count),d=Math.max(d,0),c=Math.min(c,p);const g=c-d;return g<0||g===1/0?null:(n.vertexCount=g,n.firstVertex=d,n)}getGeometryCacheKey(){const{geometry:e}=this;let t="";for(const r of Object.keys(e.attributes).sort()){const s=e.attributes[r];t+=r+",",s.data&&(t+=s.data.stride+","),s.offset&&(t+=s.offset+","),s.itemSize&&(t+=s.itemSize+","),s.normalized&&(t+="n,")}for(const r of Object.keys(e.morphAttributes).sort()){const s=e.morphAttributes[r];t+="morph-"+r+",";for(let e=0,r=s.length;e1&&(r+=e.uuid+","),r+=e.receiveShadow+",",xs(r)}get needsGeometryUpdate(){return this.geometry.id!==this.object.geometry.id}get needsUpdate(){return this.initialNodesCacheKey!==this.getDynamicCacheKey()||this.clippingNeedsUpdate}getDynamicCacheKey(){let e=0;return!0!==this.material.isShadowPassMaterial&&(e=this._nodes.getCacheKey(this.scene,this.lightsNode)),this.camera.isArrayCamera&&(e=Ts(e,this.camera.cameras.length)),this.object.receiveShadow&&(e=Ts(e,1)),e}getCacheKey(){return this.getMaterialCacheKey()+this.getDynamicCacheKey()}dispose(){this.material.removeEventListener("dispose",this.onMaterialDispose),this.onDispose()}}const Fm=[];class Bm{constructor(e,t,r,s,i,n){this.renderer=e,this.nodes=t,this.geometries=r,this.pipelines=s,this.bindings=i,this.info=n,this.chainMaps={}}get(e,t,r,s,i,n,a,o){const u=this.getChainMap(o);Fm[0]=e,Fm[1]=t,Fm[2]=n,Fm[3]=i;let l=u.get(Fm);return void 0===l?(l=this.createRenderObject(this.nodes,this.geometries,this.renderer,e,t,r,s,i,n,a,o),u.set(Fm,l)):(l.updateClipping(a),l.needsGeometryUpdate&&l.setGeometry(e.geometry),(l.version!==t.version||l.needsUpdate)&&(l.initialCacheKey!==l.getCacheKey()?(l.dispose(),l=this.get(e,t,r,s,i,n,a,o)):l.version=t.version)),Fm.length=0,l}getChainMap(e="default"){return this.chainMaps[e]||(this.chainMaps[e]=new Mm)}dispose(){this.chainMaps={}}createRenderObject(e,t,r,s,i,n,a,o,u,l,d){const c=this.getChainMap(d),h=new Lm(e,t,r,s,i,n,a,o,u,l);return h.onDispose=()=>{this.pipelines.delete(h),this.bindings.delete(h),this.nodes.delete(h),c.delete(h.getChainArray())},h}}class Im{constructor(){this.data=new WeakMap}get(e){let t=this.data.get(e);return void 0===t&&(t={},this.data.set(e,t)),t}delete(e){let t=null;return this.data.has(e)&&(t=this.data.get(e),this.data.delete(e)),t}has(e){return this.data.has(e)}dispose(){this.data=new WeakMap}}const Dm=1,Vm=2,Um=3,Om=4,Gm=16;class km extends Im{constructor(e){super(),this.backend=e}delete(e){const t=super.delete(e);return null!==t&&this.backend.destroyAttribute(e),t}update(e,t){const r=this.get(e);if(void 0===r.version)t===Dm?this.backend.createAttribute(e):t===Vm?this.backend.createIndexAttribute(e):t===Um?this.backend.createStorageAttribute(e):t===Om&&this.backend.createIndirectStorageAttribute(e),r.version=this._getBufferAttribute(e).version;else{const t=this._getBufferAttribute(e);(r.version{this.info.memory.geometries--;const s=t.index,i=e.getAttributes();null!==s&&this.attributes.delete(s);for(const e of i)this.attributes.delete(e);const n=this.wireframes.get(t);void 0!==n&&this.attributes.delete(n),t.removeEventListener("dispose",r)};t.addEventListener("dispose",r)}updateAttributes(e){const t=e.getAttributes();for(const e of t)e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute?this.updateAttribute(e,Um):this.updateAttribute(e,Dm);const r=this.getIndex(e);null!==r&&this.updateAttribute(r,Vm);const s=e.geometry.indirect;null!==s&&this.updateAttribute(s,Om)}updateAttribute(e,t){const r=this.info.render.calls;e.isInterleavedBufferAttribute?void 0===this.attributeCall.get(e)?(this.attributes.update(e,t),this.attributeCall.set(e,r)):this.attributeCall.get(e.data)!==r&&(this.attributes.update(e,t),this.attributeCall.set(e.data,r),this.attributeCall.set(e,r)):this.attributeCall.get(e)!==r&&(this.attributes.update(e,t),this.attributeCall.set(e,r))}getIndirect(e){return e.geometry.indirect}getIndex(e){const{geometry:t,material:r}=e;let s=t.index;if(!0===r.wireframe){const e=this.wireframes;let r=e.get(t);void 0===r?(r=$m(t),e.set(t,r)):r.version!==zm(t)&&(this.attributes.delete(r),r=$m(t),e.set(t,r)),s=r}return s}}class Wm{constructor(){this.autoReset=!0,this.frame=0,this.calls=0,this.render={calls:0,frameCalls:0,drawCalls:0,triangles:0,points:0,lines:0,timestamp:0},this.compute={calls:0,frameCalls:0,timestamp:0},this.memory={geometries:0,textures:0}}update(e,t,r){this.render.drawCalls++,e.isMesh||e.isSprite?this.render.triangles+=r*(t/3):e.isPoints?this.render.points+=r*t:e.isLineSegments?this.render.lines+=r*(t/2):e.isLine?this.render.lines+=r*(t-1):console.error("THREE.WebGPUInfo: Unknown object type.")}reset(){this.render.drawCalls=0,this.render.frameCalls=0,this.compute.frameCalls=0,this.render.triangles=0,this.render.points=0,this.render.lines=0}dispose(){this.reset(),this.calls=0,this.render.calls=0,this.compute.calls=0,this.render.timestamp=0,this.compute.timestamp=0,this.memory.geometries=0,this.memory.textures=0}}class jm{constructor(e){this.cacheKey=e,this.usedTimes=0}}class qm extends jm{constructor(e,t,r){super(e),this.vertexProgram=t,this.fragmentProgram=r}}class Xm extends jm{constructor(e,t){super(e),this.computeProgram=t,this.isComputePipeline=!0}}let Km=0;class Ym{constructor(e,t,r,s=null,i=null){this.id=Km++,this.code=e,this.stage=t,this.name=r,this.transforms=s,this.attributes=i,this.usedTimes=0}}class Qm extends Im{constructor(e,t){super(),this.backend=e,this.nodes=t,this.bindings=null,this.caches=new Map,this.programs={vertex:new Map,fragment:new Map,compute:new Map}}getForCompute(e,t){const{backend:r}=this,s=this.get(e);if(this._needsComputeUpdate(e)){const i=s.pipeline;i&&(i.usedTimes--,i.computeProgram.usedTimes--);const n=this.nodes.getForCompute(e);let a=this.programs.compute.get(n.computeShader);void 0===a&&(i&&0===i.computeProgram.usedTimes&&this._releaseProgram(i.computeProgram),a=new Ym(n.computeShader,"compute",e.name,n.transforms,n.nodeAttributes),this.programs.compute.set(n.computeShader,a),r.createProgram(a));const o=this._getComputeCacheKey(e,a);let u=this.caches.get(o);void 0===u&&(i&&0===i.usedTimes&&this._releasePipeline(i),u=this._getComputePipeline(e,a,o,t)),u.usedTimes++,a.usedTimes++,s.version=e.version,s.pipeline=u}return s.pipeline}getForRender(e,t=null){const{backend:r}=this,s=this.get(e);if(this._needsRenderUpdate(e)){const i=s.pipeline;i&&(i.usedTimes--,i.vertexProgram.usedTimes--,i.fragmentProgram.usedTimes--);const n=e.getNodeBuilderState(),a=e.material?e.material.name:"";let o=this.programs.vertex.get(n.vertexShader);void 0===o&&(i&&0===i.vertexProgram.usedTimes&&this._releaseProgram(i.vertexProgram),o=new Ym(n.vertexShader,"vertex",a),this.programs.vertex.set(n.vertexShader,o),r.createProgram(o));let u=this.programs.fragment.get(n.fragmentShader);void 0===u&&(i&&0===i.fragmentProgram.usedTimes&&this._releaseProgram(i.fragmentProgram),u=new Ym(n.fragmentShader,"fragment",a),this.programs.fragment.set(n.fragmentShader,u),r.createProgram(u));const l=this._getRenderCacheKey(e,o,u);let d=this.caches.get(l);void 0===d?(i&&0===i.usedTimes&&this._releasePipeline(i),d=this._getRenderPipeline(e,o,u,l,t)):e.pipeline=d,d.usedTimes++,o.usedTimes++,u.usedTimes++,s.pipeline=d}return s.pipeline}delete(e){const t=this.get(e).pipeline;return t&&(t.usedTimes--,0===t.usedTimes&&this._releasePipeline(t),t.isComputePipeline?(t.computeProgram.usedTimes--,0===t.computeProgram.usedTimes&&this._releaseProgram(t.computeProgram)):(t.fragmentProgram.usedTimes--,t.vertexProgram.usedTimes--,0===t.vertexProgram.usedTimes&&this._releaseProgram(t.vertexProgram),0===t.fragmentProgram.usedTimes&&this._releaseProgram(t.fragmentProgram))),super.delete(e)}dispose(){super.dispose(),this.caches=new Map,this.programs={vertex:new Map,fragment:new Map,compute:new Map}}updateForRender(e){this.getForRender(e)}_getComputePipeline(e,t,r,s){r=r||this._getComputeCacheKey(e,t);let i=this.caches.get(r);return void 0===i&&(i=new Xm(r,t),this.caches.set(r,i),this.backend.createComputePipeline(i,s)),i}_getRenderPipeline(e,t,r,s,i){s=s||this._getRenderCacheKey(e,t,r);let n=this.caches.get(s);return void 0===n&&(n=new qm(s,t,r),this.caches.set(s,n),e.pipeline=n,this.backend.createRenderPipeline(e,i)),n}_getComputeCacheKey(e,t){return e.id+","+t.id}_getRenderCacheKey(e,t,r){return t.id+","+r.id+","+this.backend.getRenderCacheKey(e)}_releasePipeline(e){this.caches.delete(e.cacheKey)}_releaseProgram(e){const t=e.code,r=e.stage;this.programs[r].delete(t)}_needsComputeUpdate(e){const t=this.get(e);return void 0===t.pipeline||t.version!==e.version}_needsRenderUpdate(e){return void 0===this.get(e).pipeline||this.backend.needsRenderUpdate(e)}}class Zm extends Im{constructor(e,t,r,s,i,n){super(),this.backend=e,this.textures=r,this.pipelines=i,this.attributes=s,this.nodes=t,this.info=n,this.pipelines.bindings=this}getForRender(e){const t=e.getBindings();for(const e of t){const r=this.get(e);void 0===r.bindGroup&&(this._init(e),this.backend.createBindings(e,t,0),r.bindGroup=e)}return t}getForCompute(e){const t=this.nodes.getForCompute(e).bindings;for(const e of t){const r=this.get(e);void 0===r.bindGroup&&(this._init(e),this.backend.createBindings(e,t,0),r.bindGroup=e)}return t}updateForCompute(e){this._updateBindings(this.getForCompute(e))}updateForRender(e){this._updateBindings(this.getForRender(e))}_updateBindings(e){for(const t of e)this._update(t,e)}_init(e){for(const t of e.bindings)if(t.isSampledTexture)this.textures.updateTexture(t.texture);else if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?Om:Um;this.attributes.update(e,r)}}_update(e,t){const{backend:r}=this;let s=!1,i=!0,n=0,a=0;for(const t of e.bindings){if(t.isNodeUniformsGroup){if(!1===this.nodes.updateGroup(t))continue}if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?Om:Um;this.attributes.update(e,r)}if(t.isUniformBuffer){t.update()&&r.updateBinding(t)}else if(t.isSampler)t.update();else if(t.isSampledTexture){const e=this.textures.get(t.texture);t.needsBindingsUpdate(e.generation)&&(s=!0);const o=t.update(),u=t.texture;o&&this.textures.updateTexture(u);const l=r.get(u);if(void 0!==l.externalTexture||e.isDefaultTexture?i=!1:(n=10*n+u.id,a+=u.version),!0===r.isWebGPUBackend&&void 0===l.texture&&void 0===l.externalTexture&&(console.error("Bindings._update: binding should be available:",t,o,u,t.textureNode.value,s),this.textures.updateTexture(u),s=!0),!0===u.isStorageTexture){const e=this.get(u);!0===t.store?e.needsMipmap=!0:this.textures.needsMipmaps(u)&&!0===e.needsMipmap&&(this.backend.generateMipmaps(u),e.needsMipmap=!1)}}}!0===s&&this.backend.updateBindings(e,t,i?n:0,a)}}function Jm(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.material.id!==t.material.id?e.material.id-t.material.id:e.z!==t.z?e.z-t.z:e.id-t.id}function ef(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?t.z-e.z:e.id-t.id}function tf(e){return(e.transmission>0||e.transmissionNode)&&e.side===Se&&!1===e.forceSinglePass}class rf{constructor(e,t,r){this.renderItems=[],this.renderItemsIndex=0,this.opaque=[],this.transparentDoublePass=[],this.transparent=[],this.bundles=[],this.lightsNode=e.getNode(t,r),this.lightsArray=[],this.scene=t,this.camera=r,this.occlusionQueryCount=0}begin(){return this.renderItemsIndex=0,this.opaque.length=0,this.transparentDoublePass.length=0,this.transparent.length=0,this.bundles.length=0,this.lightsArray.length=0,this.occlusionQueryCount=0,this}getNextRenderItem(e,t,r,s,i,n,a){let o=this.renderItems[this.renderItemsIndex];return void 0===o?(o={id:e.id,object:e,geometry:t,material:r,groupOrder:s,renderOrder:e.renderOrder,z:i,group:n,clippingContext:a},this.renderItems[this.renderItemsIndex]=o):(o.id=e.id,o.object=e,o.geometry=t,o.material=r,o.groupOrder=s,o.renderOrder=e.renderOrder,o.z=i,o.group=n,o.clippingContext=a),this.renderItemsIndex++,o}push(e,t,r,s,i,n,a){const o=this.getNextRenderItem(e,t,r,s,i,n,a);!0===e.occlusionTest&&this.occlusionQueryCount++,!0===r.transparent||r.transmission>0?(tf(r)&&this.transparentDoublePass.push(o),this.transparent.push(o)):this.opaque.push(o)}unshift(e,t,r,s,i,n,a){const o=this.getNextRenderItem(e,t,r,s,i,n,a);!0===r.transparent||r.transmission>0?(tf(r)&&this.transparentDoublePass.unshift(o),this.transparent.unshift(o)):this.opaque.unshift(o)}pushBundle(e){this.bundles.push(e)}pushLight(e){this.lightsArray.push(e)}sort(e,t){this.opaque.length>1&&this.opaque.sort(e||Jm),this.transparentDoublePass.length>1&&this.transparentDoublePass.sort(t||ef),this.transparent.length>1&&this.transparent.sort(t||ef)}finish(){this.lightsNode.setLights(this.lightsArray);for(let e=this.renderItemsIndex,t=this.renderItems.length;e>t,u=a.height>>t;let l=e.depthTexture||i[t];const d=!0===e.depthBuffer||!0===e.stencilBuffer;let c=!1;void 0===l&&d&&(l=new I,l.format=e.stencilBuffer?we:Ae,l.type=e.stencilBuffer?Re:b,l.image.width=o,l.image.height=u,i[t]=l),r.width===a.width&&a.height===r.height||(c=!0,l&&(l.needsUpdate=!0,l.image.width=o,l.image.height=u)),r.width=a.width,r.height=a.height,r.textures=n,r.depthTexture=l||null,r.depth=e.depthBuffer,r.stencil=e.stencilBuffer,r.renderTarget=e,r.sampleCount!==s&&(c=!0,l&&(l.needsUpdate=!0),r.sampleCount=s);const h={sampleCount:s};if(!0!==e.isXRRenderTarget){for(let e=0;e{e.removeEventListener("dispose",t);for(let e=0;e0){const s=e.image;if(void 0===s)console.warn("THREE.Renderer: Texture marked for update but image is undefined.");else if(!1===s.complete)console.warn("THREE.Renderer: Texture marked for update but image is incomplete.");else{if(e.images){const r=[];for(const t of e.images)r.push(t);t.images=r}else t.image=s;void 0!==r.isDefaultTexture&&!0!==r.isDefaultTexture||(i.createTexture(e,t),r.isDefaultTexture=!1,r.generation=e.version),!0===e.source.dataReady&&i.updateTexture(e,t),t.needsMipmaps&&0===e.mipmaps.length&&i.generateMipmaps(e)}}else i.createDefaultTexture(e),r.isDefaultTexture=!0,r.generation=e.version}if(!0!==r.initialized){r.initialized=!0,r.generation=e.version,this.info.memory.textures++;const t=()=>{e.removeEventListener("dispose",t),this._destroyTexture(e),this.info.memory.textures--};e.addEventListener("dispose",t)}r.version=e.version}getSize(e,t=pf){let r=e.images?e.images[0]:e.image;return r?(void 0!==r.image&&(r=r.image),t.width=r.width||1,t.height=r.height||1,t.depth=e.isCubeTexture?6:r.depth||1):t.width=t.height=t.depth=1,t}getMipLevels(e,t,r){let s;return s=e.isCompressedTexture?e.mipmaps?e.mipmaps.length:1:Math.floor(Math.log2(Math.max(t,r)))+1,s}needsMipmaps(e){return this.isEnvironmentTexture(e)||!0===e.isCompressedTexture||e.generateMipmaps}isEnvironmentTexture(e){const t=e.mapping;return t===Y||t===Q||t===E||t===w}_destroyTexture(e){this.backend.destroySampler(e),this.backend.destroyTexture(e),this.delete(e)}}class mf extends e{constructor(e,t,r,s=1){super(e,t,r),this.a=s}set(e,t,r,s=1){return this.a=s,super.set(e,t,r)}copy(e){return void 0!==e.a&&(this.a=e.a),super.copy(e)}clone(){return new this.constructor(this.r,this.g,this.b,this.a)}}class ff extends _n{static get type(){return"ParameterNode"}constructor(e,t=null){super(e,t),this.isParameterNode=!0}getHash(){return this.uuid}generate(){return this.name}}class yf extends $s{static get type(){return"StackNode"}constructor(e=null){super(),this.nodes=[],this.outputNode=null,this.parent=e,this._currentCond=null,this.isStackNode=!0}getNodeType(e){return this.outputNode?this.outputNode.getNodeType(e):"void"}getMemberType(e,t){return this.outputNode?this.outputNode.getMemberType(e,t):"void"}add(e){return this.nodes.push(e),this}If(e,t){const r=new Mi(t);return this._currentCond=Go(e,r),this.add(this._currentCond)}ElseIf(e,t){const r=new Mi(t),s=Go(e,r);return this._currentCond.elseNode=s,this._currentCond=s,this}Else(e){return this._currentCond.elseNode=new Mi(e),this}build(e,...t){const r=Oi();Ui(this);for(const t of this.nodes)t.build(e,"void");return Ui(r),this.outputNode?this.outputNode.build(e,...t):super.build(e,...t)}else(...e){return console.warn("THREE.TSL: .else() has been renamed to .Else()."),this.Else(...e)}elseif(...e){return console.warn("THREE.TSL: .elseif() has been renamed to .ElseIf()."),this.ElseIf(...e)}}const xf=Bi(yf).setParameterLength(0,1);class bf extends $s{static get type(){return"StructTypeNode"}constructor(e,t=null){var r;super("struct"),this.membersLayout=(r=e,Object.entries(r).map((([e,t])=>"string"==typeof t?{name:e,type:t,atomic:!1}:{name:e,type:t.type,atomic:t.atomic||!1}))),this.name=t,this.isStructLayoutNode=!0}getLength(){let e=0;for(const t of this.membersLayout)e+=As(t.type);return e}getMemberType(e,t){const r=this.membersLayout.find((e=>e.name===t));return r?r.type:"void"}getNodeType(e){return e.getStructTypeFromNode(this,this.membersLayout,this.name).name}setup(e){e.addInclude(this)}generate(e){return this.getNodeType(e)}}class Tf extends $s{static get type(){return"StructNode"}constructor(e,t){super("vec3"),this.structLayoutNode=e,this.values=t,this.isStructNode=!0}getNodeType(e){return this.structLayoutNode.getNodeType(e)}getMemberType(e,t){return this.structLayoutNode.getMemberType(e,t)}generate(e){const t=e.getVarFromNode(this),r=t.type,s=e.getPropertyName(t);return e.addLineFlowCode(`${s} = ${e.generateStruct(r,this.structLayoutNode.membersLayout,this.values)}`,this),t.name}}class _f extends $s{static get type(){return"OutputStructNode"}constructor(...e){super(),this.members=e,this.isOutputStructNode=!0}getNodeType(e){const t=e.getNodeProperties(this);if(void 0===t.membersLayout){const r=this.members,s=[];for(let t=0;t{const t=e.toUint().mul(747796405).add(2891336453),r=t.shiftRight(t.shiftRight(28).add(4)).bitXor(t).mul(277803737);return r.shiftRight(22).bitXor(r).toFloat().mul(1/2**32)})),Af=(e,t)=>To(na(4,e.mul(ia(1,e))),t),Rf=Vi((([e])=>e.fract().sub(.5).abs())).setLayout({name:"tri",type:"float",inputs:[{name:"x",type:"float"}]}),Cf=Vi((([e])=>Qi(Rf(e.z.add(Rf(e.y.mul(1)))),Rf(e.z.add(Rf(e.x.mul(1)))),Rf(e.y.add(Rf(e.x.mul(1))))))).setLayout({name:"tri3",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),Mf=Vi((([e,t,r])=>{const s=Qi(e).toVar(),i=$i(1.4).toVar(),n=$i(0).toVar(),a=Qi(s).toVar();return kc({start:$i(0),end:$i(3),type:"float",condition:"<="},(()=>{const e=Qi(Cf(a.mul(2))).toVar();s.addAssign(e.add(r.mul($i(.1).mul(t)))),a.mulAssign(1.8),i.mulAssign(1.5),s.mulAssign(1.2);const o=$i(Rf(s.z.add(Rf(s.x.add(Rf(s.y)))))).toVar();n.addAssign(o.div(i)),a.addAssign(.14)})),n})).setLayout({name:"triNoise3D",type:"float",inputs:[{name:"position",type:"vec3"},{name:"speed",type:"float"},{name:"time",type:"float"}]});class Pf extends $s{static get type(){return"FunctionOverloadingNode"}constructor(e=[],...t){super(),this.functionNodes=e,this.parametersNodes=t,this._candidateFnCall=null,this.global=!0}getNodeType(){return this.functionNodes[0].shaderNode.layout.type}setup(e){const t=this.parametersNodes;let r=this._candidateFnCall;if(null===r){let s=null,i=-1;for(const r of this.functionNodes){const n=r.shaderNode.layout;if(null===n)throw new Error("FunctionOverloadingNode: FunctionNode must be a layout.");const a=n.inputs;if(t.length===a.length){let n=0;for(let r=0;ri&&(s=r,i=n)}}this._candidateFnCall=r=s(...t)}return r}}const Lf=Bi(Pf),Ff=e=>(...t)=>Lf(e,...t),Bf=Tn(0).setGroup(yn).onRenderUpdate((e=>e.time)),If=Tn(0).setGroup(yn).onRenderUpdate((e=>e.deltaTime)),Df=Tn(0,"uint").setGroup(yn).onRenderUpdate((e=>e.frameId)),Vf=Vi((([e,t,r=qi(.5)])=>fm(e.sub(r),t).add(r))),Uf=Vi((([e,t,r=qi(.5)])=>{const s=e.sub(r),i=s.dot(s),n=i.mul(i).mul(t);return e.add(s.mul(n))})),Of=Vi((({position:e=null,horizontal:t=!0,vertical:r=!1})=>{let s;null!==e?(s=fl.toVar(),s[3][0]=e.x,s[3][1]=e.y,s[3][2]=e.z):s=fl;const i=rl.mul(s);return Ri(t)&&(i[0][0]=fl[0].length(),i[0][1]=0,i[0][2]=0),Ri(r)&&(i[1][0]=0,i[1][1]=fl[1].length(),i[1][2]=0),i[2][0]=0,i[2][1]=0,i[2][2]=1,el.mul(i).mul(Rl)})),Gf=Vi((([e=null])=>{const t=wh();return wh(xh(e)).sub(t).lessThan(0).select(rh,e)}));class kf extends $s{static get type(){return"SpriteSheetUVNode"}constructor(e,t=Uu(),r=$i(0)){super("vec2"),this.countNode=e,this.uvNode=t,this.frameNode=r}setup(){const{frameNode:e,uvNode:t,countNode:r}=this,{width:s,height:i}=r,n=e.mod(s.mul(i)).floor(),a=n.mod(s),o=i.sub(n.add(1).div(s).ceil()),u=r.reciprocal(),l=qi(a,o);return t.add(l).mul(u)}}const zf=Bi(kf).setParameterLength(3);class $f extends $s{static get type(){return"TriplanarTexturesNode"}constructor(e,t=null,r=null,s=$i(1),i=Rl,n=Ul){super("vec4"),this.textureXNode=e,this.textureYNode=t,this.textureZNode=r,this.scaleNode=s,this.positionNode=i,this.normalNode=n}setup(){const{textureXNode:e,textureYNode:t,textureZNode:r,scaleNode:s,positionNode:i,normalNode:n}=this;let a=n.abs().normalize();a=a.div(a.dot(Qi(1)));const o=i.yz.mul(s),u=i.zx.mul(s),l=i.xy.mul(s),d=e.value,c=null!==t?t.value:d,h=null!==r?r.value:d,p=Hu(d,o).mul(a.x),g=Hu(c,u).mul(a.y),m=Hu(h,l).mul(a.z);return sa(p,g,m)}}const Hf=Bi($f).setParameterLength(1,6),Wf=new Me,jf=new r,qf=new r,Xf=new r,Kf=new a,Yf=new r(0,0,-1),Qf=new s,Zf=new r,Jf=new r,ey=new s,ty=new t,ry=new ae,sy=rh.flipX();ry.depthTexture=new I(1,1);let iy=!1;class ny extends $u{static get type(){return"ReflectorNode"}constructor(e={}){super(e.defaultTexture||ry.texture,sy),this._reflectorBaseNode=e.reflector||new ay(this,e),this._depthNode=null,this.setUpdateMatrix(!1)}get reflector(){return this._reflectorBaseNode}get target(){return this._reflectorBaseNode.target}getDepthNode(){if(null===this._depthNode){if(!0!==this._reflectorBaseNode.depth)throw new Error("THREE.ReflectorNode: Depth node can only be requested when the reflector is created with { depth: true }. ");this._depthNode=Pi(new ny({defaultTexture:ry.depthTexture,reflector:this._reflectorBaseNode}))}return this._depthNode}setup(e){return e.object.isQuadMesh||this._reflectorBaseNode.build(e),super.setup(e)}clone(){const e=new this.constructor(this.reflectorNode);return e._reflectorBaseNode=this._reflectorBaseNode,e}}class ay extends $s{static get type(){return"ReflectorBaseNode"}constructor(e,t={}){super();const{target:r=new Pe,resolution:s=1,generateMipmaps:i=!1,bounces:n=!0,depth:a=!1}=t;this.textureNode=e,this.target=r,this.resolution=s,this.generateMipmaps=i,this.bounces=n,this.depth=a,this.updateBeforeType=n?Is.RENDER:Is.FRAME,this.virtualCameras=new WeakMap,this.renderTargets=new WeakMap,this.forceUpdate=!1}_updateResolution(e,t){const r=this.resolution;t.getDrawingBufferSize(ty),e.setSize(Math.round(ty.width*r),Math.round(ty.height*r))}setup(e){return this._updateResolution(ry,e.renderer),super.setup(e)}getVirtualCamera(e){let t=this.virtualCameras.get(e);return void 0===t&&(t=e.clone(),this.virtualCameras.set(e,t)),t}getRenderTarget(e){let t=this.renderTargets.get(e);return void 0===t&&(t=new ae(0,0,{type:he}),!0===this.generateMipmaps&&(t.texture.minFilter=Le,t.texture.generateMipmaps=!0),!0===this.depth&&(t.depthTexture=new I),this.renderTargets.set(e,t)),t}updateBefore(e){if(!1===this.bounces&&iy)return!1;iy=!0;const{scene:t,camera:r,renderer:s,material:i}=e,{target:n}=this,a=this.getVirtualCamera(r),o=this.getRenderTarget(a);s.getDrawingBufferSize(ty),this._updateResolution(o,s),qf.setFromMatrixPosition(n.matrixWorld),Xf.setFromMatrixPosition(r.matrixWorld),Kf.extractRotation(n.matrixWorld),jf.set(0,0,1),jf.applyMatrix4(Kf),Zf.subVectors(qf,Xf);if(!0===Zf.dot(jf)>0&&!1===this.forceUpdate)return;Zf.reflect(jf).negate(),Zf.add(qf),Kf.extractRotation(r.matrixWorld),Yf.set(0,0,-1),Yf.applyMatrix4(Kf),Yf.add(Xf),Jf.subVectors(qf,Yf),Jf.reflect(jf).negate(),Jf.add(qf),a.coordinateSystem=r.coordinateSystem,a.position.copy(Zf),a.up.set(0,1,0),a.up.applyMatrix4(Kf),a.up.reflect(jf),a.lookAt(Jf),a.near=r.near,a.far=r.far,a.updateMatrixWorld(),a.projectionMatrix.copy(r.projectionMatrix),Wf.setFromNormalAndCoplanarPoint(jf,qf),Wf.applyMatrix4(a.matrixWorldInverse),Qf.set(Wf.normal.x,Wf.normal.y,Wf.normal.z,Wf.constant);const u=a.projectionMatrix;ey.x=(Math.sign(Qf.x)+u.elements[8])/u.elements[0],ey.y=(Math.sign(Qf.y)+u.elements[9])/u.elements[5],ey.z=-1,ey.w=(1+u.elements[10])/u.elements[14],Qf.multiplyScalar(1/Qf.dot(ey));u.elements[2]=Qf.x,u.elements[6]=Qf.y,u.elements[10]=s.coordinateSystem===d?Qf.z-0:Qf.z+1-0,u.elements[14]=Qf.w,this.textureNode.value=o.texture,!0===this.depth&&(this.textureNode.getDepthNode().value=o.depthTexture),i.visible=!1;const l=s.getRenderTarget(),c=s.getMRT(),h=s.autoClear;s.setMRT(null),s.setRenderTarget(o),s.autoClear=!0,s.render(t,a),s.setMRT(c),s.setRenderTarget(l),s.autoClear=h,i.visible=!0,iy=!1,this.forceUpdate=!1}}const oy=new ie(-1,1,1,-1,0,1);class uy extends ue{constructor(e=!1){super();const t=!1===e?[0,-1,0,1,2,1]:[0,2,0,0,2,0];this.setAttribute("position",new Fe([-1,3,0,-1,-1,0,3,-1,0],3)),this.setAttribute("uv",new Fe(t,2))}}const ly=new uy;class dy extends W{constructor(e=null){super(ly,e),this.camera=oy,this.isQuadMesh=!0}async renderAsync(e){return e.renderAsync(this,oy)}render(e){e.render(this,oy)}}const cy=new t;class hy extends $u{static get type(){return"RTTNode"}constructor(e,t=null,r=null,s={type:he}){const i=new ae(t,r,s);super(i.texture,Uu()),this.node=e,this.width=t,this.height=r,this.pixelRatio=1,this.renderTarget=i,this.textureNeedsUpdate=!0,this.autoUpdate=!0,this._rttNode=null,this._quadMesh=new dy(new Fh),this.updateBeforeType=Is.RENDER}get autoSize(){return null===this.width}setup(e){return this._rttNode=this.node.context(e.getSharedContext()),this._quadMesh.material.name="RTT",this._quadMesh.material.needsUpdate=!0,super.setup(e)}setSize(e,t){this.width=e,this.height=t;const r=e*this.pixelRatio,s=t*this.pixelRatio;this.renderTarget.setSize(r,s),this.textureNeedsUpdate=!0}setPixelRatio(e){this.pixelRatio=e,this.setSize(this.width,this.height)}updateBefore({renderer:e}){if(!1===this.textureNeedsUpdate&&!1===this.autoUpdate)return;if(this.textureNeedsUpdate=!1,!0===this.autoSize){this.pixelRatio=e.getPixelRatio();const t=e.getSize(cy);this.setSize(t.width,t.height)}this._quadMesh.material.fragmentNode=this._rttNode;const t=e.getRenderTarget();e.setRenderTarget(this.renderTarget),this._quadMesh.render(e),e.setRenderTarget(t)}clone(){const e=new $u(this.value,this.uvNode,this.levelNode);return e.sampler=this.sampler,e.referenceNode=this,e}}const py=(e,...t)=>Pi(new hy(Pi(e),...t)),gy=Vi((([e,t,r],s)=>{let i;s.renderer.coordinateSystem===d?(e=qi(e.x,e.y.oneMinus()).mul(2).sub(1),i=tn(Qi(e,t),1)):i=tn(Qi(e.x,e.y.oneMinus(),t).mul(2).sub(1),1);const n=tn(r.mul(i));return n.xyz.div(n.w)})),my=Vi((([e,t])=>{const r=t.mul(tn(e,1)),s=r.xy.div(r.w).mul(.5).add(.5).toVar();return qi(s.x,s.y.oneMinus())})),fy=Vi((([e,t,r])=>{const s=Gu(Wu(t)),i=Xi(e.mul(s)).toVar(),n=Wu(t,i).toVar(),a=Wu(t,i.sub(Xi(2,0))).toVar(),o=Wu(t,i.sub(Xi(1,0))).toVar(),u=Wu(t,i.add(Xi(1,0))).toVar(),l=Wu(t,i.add(Xi(2,0))).toVar(),d=Wu(t,i.add(Xi(0,2))).toVar(),c=Wu(t,i.add(Xi(0,1))).toVar(),h=Wu(t,i.sub(Xi(0,1))).toVar(),p=Wu(t,i.sub(Xi(0,2))).toVar(),g=Qa(ia($i(2).mul(o).sub(a),n)).toVar(),m=Qa(ia($i(2).mul(u).sub(l),n)).toVar(),f=Qa(ia($i(2).mul(c).sub(d),n)).toVar(),y=Qa(ia($i(2).mul(h).sub(p),n)).toVar(),x=gy(e,n,r).toVar(),b=g.lessThan(m).select(x.sub(gy(e.sub(qi($i(1).div(s.x),0)),o,r)),x.negate().add(gy(e.add(qi($i(1).div(s.x),0)),u,r))),T=f.lessThan(y).select(x.sub(gy(e.add(qi(0,$i(1).div(s.y))),c,r)),x.negate().add(gy(e.sub(qi(0,$i(1).div(s.y))),h,r)));return $a(bo(b,T))}));class yy extends M{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageInstancedBufferAttribute=!0}}class xy extends le{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageBufferAttribute=!0}}class by extends Du{static get type(){return"VertexColorNode"}constructor(e=0){super(null,"vec4"),this.isVertexColorNode=!0,this.index=e}getAttributeName(){const e=this.index;return"color"+(e>0?e:"")}generate(e){const t=this.getAttributeName(e);let r;return r=!0===e.hasGeometryAttribute(t)?super.generate(e):e.generateConst(this.nodeType,new s(1,1,1,1)),r}serialize(e){super.serialize(e),e.index=this.index}deserialize(e){super.deserialize(e),this.index=e.index}}class Ty extends $s{static get type(){return"PointUVNode"}constructor(){super("vec2"),this.isPointUVNode=!0}generate(){return"vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y )"}}const _y=Ii(Ty),vy=new S,Ny=new a;class Sy extends $s{static get type(){return"SceneNode"}constructor(e=Sy.BACKGROUND_BLURRINESS,t=null){super(),this.scope=e,this.scene=t}setup(e){const t=this.scope,r=null!==this.scene?this.scene:e.scene;let s;return t===Sy.BACKGROUND_BLURRINESS?s=ad("backgroundBlurriness","float",r):t===Sy.BACKGROUND_INTENSITY?s=ad("backgroundIntensity","float",r):t===Sy.BACKGROUND_ROTATION?s=Tn("mat4").label("backgroundRotation").setGroup(yn).onRenderUpdate((()=>{const e=r.background;return null!==e&&e.isTexture&&e.mapping!==Be?(vy.copy(r.backgroundRotation),vy.x*=-1,vy.y*=-1,vy.z*=-1,Ny.makeRotationFromEuler(vy)):Ny.identity(),Ny})):console.error("THREE.SceneNode: Unknown scope:",t),s}}Sy.BACKGROUND_BLURRINESS="backgroundBlurriness",Sy.BACKGROUND_INTENSITY="backgroundIntensity",Sy.BACKGROUND_ROTATION="backgroundRotation";const Ey=Ii(Sy,Sy.BACKGROUND_BLURRINESS),wy=Ii(Sy,Sy.BACKGROUND_INTENSITY),Ay=Ii(Sy,Sy.BACKGROUND_ROTATION);class Ry extends $u{static get type(){return"StorageTextureNode"}constructor(e,t,r=null){super(e,t),this.storeNode=r,this.isStorageTextureNode=!0,this.access=Vs.WRITE_ONLY}getInputType(){return"storageTexture"}setup(e){super.setup(e);e.getNodeProperties(this).storeNode=this.storeNode}setAccess(e){return this.access=e,this}generate(e,t){let r;return r=null!==this.storeNode?this.generateStore(e):super.generate(e,t),r}toReadWrite(){return this.setAccess(Vs.READ_WRITE)}toReadOnly(){return this.setAccess(Vs.READ_ONLY)}toWriteOnly(){return this.setAccess(Vs.WRITE_ONLY)}generateStore(e){const t=e.getNodeProperties(this),{uvNode:r,storeNode:s}=t,i=super.generate(e,"property"),n=r.build(e,"uvec2"),a=s.build(e,"vec4"),o=e.generateTextureStore(e,i,n,a);e.addLineFlowCode(o,this)}}const Cy=Bi(Ry).setParameterLength(1,3),My=Vi((({texture:e,uv:t})=>{const r=1e-4,s=Qi().toVar();return Gi(t.x.lessThan(r),(()=>{s.assign(Qi(1,0,0))})).ElseIf(t.y.lessThan(r),(()=>{s.assign(Qi(0,1,0))})).ElseIf(t.z.lessThan(r),(()=>{s.assign(Qi(0,0,1))})).ElseIf(t.x.greaterThan(.9999),(()=>{s.assign(Qi(-1,0,0))})).ElseIf(t.y.greaterThan(.9999),(()=>{s.assign(Qi(0,-1,0))})).ElseIf(t.z.greaterThan(.9999),(()=>{s.assign(Qi(0,0,-1))})).Else((()=>{const r=.01,i=e.sample(t.add(Qi(-.01,0,0))).r.sub(e.sample(t.add(Qi(r,0,0))).r),n=e.sample(t.add(Qi(0,-.01,0))).r.sub(e.sample(t.add(Qi(0,r,0))).r),a=e.sample(t.add(Qi(0,0,-.01))).r.sub(e.sample(t.add(Qi(0,0,r))).r);s.assign(Qi(i,n,a))})),s.normalize()}));class Py extends $u{static get type(){return"Texture3DNode"}constructor(e,t=null,r=null){super(e,t,r),this.isTexture3DNode=!0}getInputType(){return"texture3D"}getDefaultUV(){return Qi(.5,.5,.5)}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return!e.isFlipY()||!0!==r.isRenderTargetTexture&&!0!==r.isFramebufferTexture||(t=this.sampler?t.flipY():t.setY(Hi(Gu(this,this.levelNode).y).sub(t.y).sub(1))),t}generateUV(e,t){return t.build(e,"vec3")}normal(e){return My({texture:this,uv:e})}}const Ly=Bi(Py).setParameterLength(1,3);class Fy extends nd{static get type(){return"UserDataNode"}constructor(e,t,r=null){super(e,t,r),this.userData=r}updateReference(e){return this.reference=null!==this.userData?this.userData:e.object.userData,this.reference}}const By=new WeakMap;class Iy extends js{static get type(){return"VelocityNode"}constructor(){super("vec2"),this.projectionMatrix=null,this.updateType=Is.OBJECT,this.updateAfterType=Is.OBJECT,this.previousModelWorldMatrix=Tn(new a),this.previousProjectionMatrix=Tn(new a).setGroup(yn),this.previousCameraViewMatrix=Tn(new a)}setProjectionMatrix(e){this.projectionMatrix=e}update({frameId:e,camera:t,object:r}){const s=Vy(r);this.previousModelWorldMatrix.value.copy(s);const i=Dy(t);i.frameId!==e&&(i.frameId=e,void 0===i.previousProjectionMatrix?(i.previousProjectionMatrix=new a,i.previousCameraViewMatrix=new a,i.currentProjectionMatrix=new a,i.currentCameraViewMatrix=new a,i.previousProjectionMatrix.copy(this.projectionMatrix||t.projectionMatrix),i.previousCameraViewMatrix.copy(t.matrixWorldInverse)):(i.previousProjectionMatrix.copy(i.currentProjectionMatrix),i.previousCameraViewMatrix.copy(i.currentCameraViewMatrix)),i.currentProjectionMatrix.copy(this.projectionMatrix||t.projectionMatrix),i.currentCameraViewMatrix.copy(t.matrixWorldInverse),this.previousProjectionMatrix.value.copy(i.previousProjectionMatrix),this.previousCameraViewMatrix.value.copy(i.previousCameraViewMatrix))}updateAfter({object:e}){Vy(e).copy(e.matrixWorld)}setup(){const e=null===this.projectionMatrix?el:Tn(this.projectionMatrix),t=this.previousCameraViewMatrix.mul(this.previousModelWorldMatrix),r=e.mul(Nl).mul(Rl),s=this.previousProjectionMatrix.mul(t).mul(Cl),i=r.xy.div(r.w),n=s.xy.div(s.w);return ia(i,n)}}function Dy(e){let t=By.get(e);return void 0===t&&(t={},By.set(e,t)),t}function Vy(e,t=0){const r=Dy(e);let s=r[t];return void 0===s&&(r[t]=s=new a),s}const Uy=Ii(Iy),Oy=Vi((([e,t])=>ho(1,e.oneMinus().div(t)).oneMinus())).setLayout({name:"blendBurn",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Gy=Vi((([e,t])=>ho(e.div(t.oneMinus()),1))).setLayout({name:"blendDodge",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),ky=Vi((([e,t])=>e.oneMinus().mul(t.oneMinus()).oneMinus())).setLayout({name:"blendScreen",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),zy=Vi((([e,t])=>Ao(e.mul(2).mul(t),e.oneMinus().mul(2).mul(t.oneMinus()).oneMinus(),go(.5,e)))).setLayout({name:"blendOverlay",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),$y=Vi((([e,t])=>{const r=t.a.add(e.a.mul(t.a.oneMinus()));return tn(t.rgb.mul(t.a).add(e.rgb.mul(e.a).mul(t.a.oneMinus())).div(r),r)})).setLayout({name:"blendColor",type:"vec4",inputs:[{name:"base",type:"vec4"},{name:"blend",type:"vec4"}]}),Hy=Vi((([e])=>Xy(e.rgb))),Wy=Vi((([e,t=$i(1)])=>t.mix(Xy(e.rgb),e.rgb))),jy=Vi((([e,t=$i(1)])=>{const r=sa(e.r,e.g,e.b).div(3),s=e.r.max(e.g.max(e.b)),i=s.sub(r).mul(t).mul(-3);return Ao(e.rgb,s,i)})),qy=Vi((([e,t=$i(1)])=>{const r=Qi(.57735,.57735,.57735),s=t.cos();return Qi(e.rgb.mul(s).add(r.cross(e.rgb).mul(t.sin()).add(r.mul(xo(r,e.rgb).mul(s.oneMinus())))))})),Xy=(e,t=Qi(c.getLuminanceCoefficients(new r)))=>xo(e,t),Ky=Vi((([e,t=Qi(1),s=Qi(0),i=Qi(1),n=$i(1),a=Qi(c.getLuminanceCoefficients(new r,de))])=>{const o=e.rgb.dot(Qi(a)),u=po(e.rgb.mul(t).add(s),0).toVar(),l=u.pow(i).toVar();return Gi(u.r.greaterThan(0),(()=>{u.r.assign(l.r)})),Gi(u.g.greaterThan(0),(()=>{u.g.assign(l.g)})),Gi(u.b.greaterThan(0),(()=>{u.b.assign(l.b)})),u.assign(o.add(u.sub(o).mul(n))),tn(u.rgb,e.a)}));class Yy extends js{static get type(){return"PosterizeNode"}constructor(e,t){super(),this.sourceNode=e,this.stepsNode=t}setup(){const{sourceNode:e,stepsNode:t}=this;return e.mul(t).floor().div(t)}}const Qy=Bi(Yy).setParameterLength(2),Zy=new t;class Jy extends $u{static get type(){return"PassTextureNode"}constructor(e,t){super(t),this.passNode=e,this.setUpdateMatrix(!1)}setup(e){return e.object.isQuadMesh&&this.passNode.build(e),super.setup(e)}clone(){return new this.constructor(this.passNode,this.value)}}class ex extends Jy{static get type(){return"PassMultipleTextureNode"}constructor(e,t,r=!1){super(e,null),this.textureName=t,this.previousTexture=r}updateTexture(){this.value=this.previousTexture?this.passNode.getPreviousTexture(this.textureName):this.passNode.getTexture(this.textureName)}setup(e){return this.updateTexture(),super.setup(e)}clone(){return new this.constructor(this.passNode,this.textureName,this.previousTexture)}}class tx extends js{static get type(){return"PassNode"}constructor(e,t,r,s={}){super("vec4"),this.scope=e,this.scene=t,this.camera=r,this.options=s,this._pixelRatio=1,this._width=1,this._height=1;const i=new I;i.isRenderTargetTexture=!0,i.name="depth";const n=new ae(this._width*this._pixelRatio,this._height*this._pixelRatio,{type:he,...s});n.texture.name="output",n.depthTexture=i,this.renderTarget=n,this._textures={output:n.texture,depth:i},this._textureNodes={},this._linearDepthNodes={},this._viewZNodes={},this._previousTextures={},this._previousTextureNodes={},this._cameraNear=Tn(0),this._cameraFar=Tn(0),this._mrt=null,this._layers=null,this._resolution=1,this.isPassNode=!0,this.updateBeforeType=Is.FRAME}setResolution(e){return this._resolution=e,this}getResolution(){return this._resolution}setLayers(e){return this._layers=e,this}getLayers(){return this._layers}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}isGlobal(){return!0}getTexture(e){let t=this._textures[e];if(void 0===t){t=this.renderTarget.texture.clone(),t.name=e,this._textures[e]=t,this.renderTarget.textures.push(t)}return t}getPreviousTexture(e){let t=this._previousTextures[e];return void 0===t&&(t=this.getTexture(e).clone(),this._previousTextures[e]=t),t}toggleTexture(e){const t=this._previousTextures[e];if(void 0!==t){const r=this._textures[e],s=this.renderTarget.textures.indexOf(r);this.renderTarget.textures[s]=t,this._textures[e]=t,this._previousTextures[e]=r,this._textureNodes[e].updateTexture(),this._previousTextureNodes[e].updateTexture()}}getTextureNode(e="output"){let t=this._textureNodes[e];return void 0===t&&(t=Pi(new ex(this,e)),t.updateTexture(),this._textureNodes[e]=t),t}getPreviousTextureNode(e="output"){let t=this._previousTextureNodes[e];return void 0===t&&(void 0===this._textureNodes[e]&&this.getTextureNode(e),t=Pi(new ex(this,e,!0)),t.updateTexture(),this._previousTextureNodes[e]=t),t}getViewZNode(e="depth"){let t=this._viewZNodes[e];if(void 0===t){const r=this._cameraNear,s=this._cameraFar;this._viewZNodes[e]=t=vh(this.getTextureNode(e),r,s)}return t}getLinearDepthNode(e="depth"){let t=this._linearDepthNodes[e];if(void 0===t){const r=this._cameraNear,s=this._cameraFar,i=this.getViewZNode(e);this._linearDepthNodes[e]=t=Th(i,r,s)}return t}setup({renderer:e}){return this.renderTarget.samples=void 0===this.options.samples?e.samples:this.options.samples,!0===e.backend.isWebGLBackend&&(this.renderTarget.samples=0),this.renderTarget.texture.type=e.getColorBufferType(),this.scope===tx.COLOR?this.getTextureNode():this.getLinearDepthNode()}updateBefore(e){const{renderer:t}=e,{scene:r}=this;let s,i;const n=t.getOutputRenderTarget();n&&!0===n.isXRRenderTarget?(i=1,s=t.xr.getCamera(),t.xr.updateCamera(s),Zy.set(n.width,n.height)):(s=this.camera,i=t.getPixelRatio(),t.getSize(Zy)),this._pixelRatio=i,this.setSize(Zy.width,Zy.height);const a=t.getRenderTarget(),o=t.getMRT(),u=s.layers.mask;this._cameraNear.value=s.near,this._cameraFar.value=s.far,null!==this._layers&&(s.layers.mask=this._layers.mask);for(const e in this._previousTextures)this.toggleTexture(e);t.setRenderTarget(this.renderTarget),t.setMRT(this._mrt),t.render(r,s),t.setRenderTarget(a),t.setMRT(o),s.layers.mask=u}setSize(e,t){this._width=e,this._height=t;const r=this._width*this._pixelRatio*this._resolution,s=this._height*this._pixelRatio*this._resolution;this.renderTarget.setSize(r,s)}setPixelRatio(e){this._pixelRatio=e,this.setSize(this._width,this._height)}dispose(){this.renderTarget.dispose()}}tx.COLOR="color",tx.DEPTH="depth";class rx extends tx{static get type(){return"ToonOutlinePassNode"}constructor(e,t,r,s,i){super(tx.COLOR,e,t),this.colorNode=r,this.thicknessNode=s,this.alphaNode=i,this._materialCache=new WeakMap}updateBefore(e){const{renderer:t}=e,r=t.getRenderObjectFunction();t.setRenderObjectFunction(((e,r,s,i,n,a,o,u)=>{if((n.isMeshToonMaterial||n.isMeshToonNodeMaterial)&&!1===n.wireframe){const l=this._getOutlineMaterial(n);t.renderObject(e,r,s,i,l,a,o,u)}t.renderObject(e,r,s,i,n,a,o,u)})),super.updateBefore(e),t.setRenderObjectFunction(r)}_createMaterial(){const e=new Fh;e.isMeshToonOutlineMaterial=!0,e.name="Toon_Outline",e.side=N;const t=Ul.negate(),r=el.mul(Nl),s=$i(1),i=r.mul(tn(Rl,1)),n=r.mul(tn(Rl.add(t),1)),a=$a(i.sub(n));return e.vertexNode=i.add(a.mul(this.thicknessNode).mul(i.w).mul(s)),e.colorNode=tn(this.colorNode,this.alphaNode),e}_getOutlineMaterial(e){let t=this._materialCache.get(e);return void 0===t&&(t=this._createMaterial(),this._materialCache.set(e,t)),t}}const sx=Vi((([e,t])=>e.mul(t).clamp())).setLayout({name:"linearToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),ix=Vi((([e,t])=>(e=e.mul(t)).div(e.add(1)).clamp())).setLayout({name:"reinhardToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),nx=Vi((([e,t])=>{const r=(e=(e=e.mul(t)).sub(.004).max(0)).mul(e.mul(6.2).add(.5)),s=e.mul(e.mul(6.2).add(1.7)).add(.06);return r.div(s).pow(2.2)})).setLayout({name:"cineonToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),ax=Vi((([e])=>{const t=e.mul(e.add(.0245786)).sub(90537e-9),r=e.mul(e.add(.432951).mul(.983729)).add(.238081);return t.div(r)})),ox=Vi((([e,t])=>{const r=on(.59719,.35458,.04823,.076,.90834,.01566,.0284,.13383,.83777),s=on(1.60475,-.53108,-.07367,-.10208,1.10813,-.00605,-.00327,-.07276,1.07602);return e=e.mul(t).div(.6),e=r.mul(e),e=ax(e),(e=s.mul(e)).clamp()})).setLayout({name:"acesFilmicToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),ux=on(Qi(1.6605,-.1246,-.0182),Qi(-.5876,1.1329,-.1006),Qi(-.0728,-.0083,1.1187)),lx=on(Qi(.6274,.0691,.0164),Qi(.3293,.9195,.088),Qi(.0433,.0113,.8956)),dx=Vi((([e])=>{const t=Qi(e).toVar(),r=Qi(t.mul(t)).toVar(),s=Qi(r.mul(r)).toVar();return $i(15.5).mul(s.mul(r)).sub(na(40.14,s.mul(t))).add(na(31.96,s).sub(na(6.868,r.mul(t))).add(na(.4298,r).add(na(.1191,t).sub(.00232))))})),cx=Vi((([e,t])=>{const r=Qi(e).toVar(),s=on(Qi(.856627153315983,.137318972929847,.11189821299995),Qi(.0951212405381588,.761241990602591,.0767994186031903),Qi(.0482516061458583,.101439036467562,.811302368396859)),i=on(Qi(1.1271005818144368,-.1413297634984383,-.14132976349843826),Qi(-.11060664309660323,1.157823702216272,-.11060664309660294),Qi(-.016493938717834573,-.016493938717834257,1.2519364065950405)),n=$i(-12.47393),a=$i(4.026069);return r.mulAssign(t),r.assign(lx.mul(r)),r.assign(s.mul(r)),r.assign(po(r,1e-10)),r.assign(Ua(r)),r.assign(r.sub(n).div(a.sub(n))),r.assign(Ro(r,0,1)),r.assign(dx(r)),r.assign(i.mul(r)),r.assign(To(po(Qi(0),r),Qi(2.2))),r.assign(ux.mul(r)),r.assign(Ro(r,0,1)),r})).setLayout({name:"agxToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),hx=Vi((([e,t])=>{const r=$i(.76),s=$i(.15);e=e.mul(t);const i=ho(e.r,ho(e.g,e.b)),n=Go(i.lessThan(.08),i.sub(na(6.25,i.mul(i))),.04);e.subAssign(n);const a=po(e.r,po(e.g,e.b));Gi(a.lessThan(r),(()=>e));const o=ia(1,r),u=ia(1,o.mul(o).div(a.add(o.sub(r))));e.mulAssign(u.div(a));const l=ia(1,aa(1,s.mul(a.sub(u)).add(1)));return Ao(e,Qi(u),l)})).setLayout({name:"neutralToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]});class px extends $s{static get type(){return"CodeNode"}constructor(e="",t=[],r=""){super("code"),this.isCodeNode=!0,this.code=e,this.includes=t,this.language=r}isGlobal(){return!0}setIncludes(e){return this.includes=e,this}getIncludes(){return this.includes}generate(e){const t=this.getIncludes(e);for(const r of t)r.build(e);const r=e.getCodeFromNode(this,this.getNodeType(e));return r.code=this.code,r.code}serialize(e){super.serialize(e),e.code=this.code,e.language=this.language}deserialize(e){super.deserialize(e),this.code=e.code,this.language=e.language}}const gx=Bi(px).setParameterLength(1,3);class mx extends px{static get type(){return"FunctionNode"}constructor(e="",t=[],r=""){super(e,t,r)}getNodeType(e){return this.getNodeFunction(e).type}getInputs(e){return this.getNodeFunction(e).inputs}getNodeFunction(e){const t=e.getDataFromNode(this);let r=t.nodeFunction;return void 0===r&&(r=e.parser.parseFunction(this.code),t.nodeFunction=r),r}generate(e,t){super.generate(e);const r=this.getNodeFunction(e),s=r.name,i=r.type,n=e.getCodeFromNode(this,i);""!==s&&(n.name=s);const a=e.getPropertyName(n),o=this.getNodeFunction(e).getCode(a);return n.code=o+"\n","property"===t?a:e.format(`${a}()`,i,t)}}const fx=(e,t=[],r="")=>{for(let e=0;es.call(...e);return i.functionNode=s,i};class yx extends $s{static get type(){return"ScriptableValueNode"}constructor(e=null){super(),this._value=e,this._cache=null,this.inputType=null,this.outputType=null,this.events=new o,this.isScriptableValueNode=!0}get isScriptableOutputNode(){return null!==this.outputType}set value(e){this._value!==e&&(this._cache&&"URL"===this.inputType&&this.value.value instanceof ArrayBuffer&&(URL.revokeObjectURL(this._cache),this._cache=null),this._value=e,this.events.dispatchEvent({type:"change"}),this.refresh())}get value(){return this._value}refresh(){this.events.dispatchEvent({type:"refresh"})}getValue(){const e=this.value;if(e&&null===this._cache&&"URL"===this.inputType&&e.value instanceof ArrayBuffer)this._cache=URL.createObjectURL(new Blob([e.value]));else if(e&&null!==e.value&&void 0!==e.value&&(("URL"===this.inputType||"String"===this.inputType)&&"string"==typeof e.value||"Number"===this.inputType&&"number"==typeof e.value||"Vector2"===this.inputType&&e.value.isVector2||"Vector3"===this.inputType&&e.value.isVector3||"Vector4"===this.inputType&&e.value.isVector4||"Color"===this.inputType&&e.value.isColor||"Matrix3"===this.inputType&&e.value.isMatrix3||"Matrix4"===this.inputType&&e.value.isMatrix4))return e.value;return this._cache||e}getNodeType(e){return this.value&&this.value.isNode?this.value.getNodeType(e):"float"}setup(){return this.value&&this.value.isNode?this.value:$i()}serialize(e){super.serialize(e),null!==this.value?"ArrayBuffer"===this.inputType?e.value=Ps(this.value):e.value=this.value?this.value.toJSON(e.meta).uuid:null:e.value=null,e.inputType=this.inputType,e.outputType=this.outputType}deserialize(e){super.deserialize(e);let t=null;null!==e.value&&(t="ArrayBuffer"===e.inputType?Ls(e.value):"Texture"===e.inputType?e.meta.textures[e.value]:e.meta.nodes[e.value]||null),this.value=t,this.inputType=e.inputType,this.outputType=e.outputType}}const xx=Bi(yx).setParameterLength(1);class bx extends Map{get(e,t=null,...r){if(this.has(e))return super.get(e);if(null!==t){const s=t(...r);return this.set(e,s),s}}}class Tx{constructor(e){this.scriptableNode=e}get parameters(){return this.scriptableNode.parameters}get layout(){return this.scriptableNode.getLayout()}getInputLayout(e){return this.scriptableNode.getInputLayout(e)}get(e){const t=this.parameters[e];return t?t.getValue():null}}const _x=new bx;class vx extends $s{static get type(){return"ScriptableNode"}constructor(e=null,t={}){super(),this.codeNode=e,this.parameters=t,this._local=new bx,this._output=xx(null),this._outputs={},this._source=this.source,this._method=null,this._object=null,this._value=null,this._needsOutputUpdate=!0,this.onRefresh=this.onRefresh.bind(this),this.isScriptableNode=!0}get source(){return this.codeNode?this.codeNode.code:""}setLocal(e,t){return this._local.set(e,t)}getLocal(e){return this._local.get(e)}onRefresh(){this._refresh()}getInputLayout(e){for(const t of this.getLayout())if(t.inputType&&(t.id===e||t.name===e))return t}getOutputLayout(e){for(const t of this.getLayout())if(t.outputType&&(t.id===e||t.name===e))return t}setOutput(e,t){const r=this._outputs;return void 0===r[e]?r[e]=xx(t):r[e].value=t,this}getOutput(e){return this._outputs[e]}getParameter(e){return this.parameters[e]}setParameter(e,t){const r=this.parameters;return t&&t.isScriptableNode?(this.deleteParameter(e),r[e]=t,r[e].getDefaultOutput().events.addEventListener("refresh",this.onRefresh)):t&&t.isScriptableValueNode?(this.deleteParameter(e),r[e]=t,r[e].events.addEventListener("refresh",this.onRefresh)):void 0===r[e]?(r[e]=xx(t),r[e].events.addEventListener("refresh",this.onRefresh)):r[e].value=t,this}getValue(){return this.getDefaultOutput().getValue()}deleteParameter(e){let t=this.parameters[e];return t&&(t.isScriptableNode&&(t=t.getDefaultOutput()),t.events.removeEventListener("refresh",this.onRefresh)),this}clearParameters(){for(const e of Object.keys(this.parameters))this.deleteParameter(e);return this.needsUpdate=!0,this}call(e,...t){const r=this.getObject()[e];if("function"==typeof r)return r(...t)}async callAsync(e,...t){const r=this.getObject()[e];if("function"==typeof r)return"AsyncFunction"===r.constructor.name?await r(...t):r(...t)}getNodeType(e){return this.getDefaultOutputNode().getNodeType(e)}refresh(e=null){null!==e?this.getOutput(e).refresh():this._refresh()}getObject(){if(this.needsUpdate&&this.dispose(),null!==this._object)return this._object;const e=new Tx(this),t=_x.get("THREE"),r=_x.get("TSL"),s=this.getMethod(),i=[e,this._local,_x,()=>this.refresh(),(e,t)=>this.setOutput(e,t),t,r];this._object=s(...i);const n=this._object.layout;if(n&&(!1===n.cache&&this._local.clear(),this._output.outputType=n.outputType||null,Array.isArray(n.elements)))for(const e of n.elements){const t=e.id||e.name;e.inputType&&(void 0===this.getParameter(t)&&this.setParameter(t,null),this.getParameter(t).inputType=e.inputType),e.outputType&&(void 0===this.getOutput(t)&&this.setOutput(t,null),this.getOutput(t).outputType=e.outputType)}return this._object}deserialize(e){super.deserialize(e);for(const e in this.parameters){let t=this.parameters[e];t.isScriptableNode&&(t=t.getDefaultOutput()),t.events.addEventListener("refresh",this.onRefresh)}}getLayout(){return this.getObject().layout}getDefaultOutputNode(){const e=this.getDefaultOutput().value;return e&&e.isNode?e:$i()}getDefaultOutput(){return this._exec()._output}getMethod(){if(this.needsUpdate&&this.dispose(),null!==this._method)return this._method;const e=["layout","init","main","dispose"].join(", "),t="\nreturn { ...output, "+e+" };",r="var "+e+"; var output = {};\n"+this.codeNode.code+t;return this._method=new Function(...["parameters","local","global","refresh","setOutput","THREE","TSL"],r),this._method}dispose(){null!==this._method&&(this._object&&"function"==typeof this._object.dispose&&this._object.dispose(),this._method=null,this._object=null,this._source=null,this._value=null,this._needsOutputUpdate=!0,this._output.value=null,this._outputs={})}setup(){return this.getDefaultOutputNode()}getCacheKey(e){const t=[xs(this.source),this.getDefaultOutputNode().getCacheKey(e)];for(const r in this.parameters)t.push(this.parameters[r].getCacheKey(e));return bs(t)}set needsUpdate(e){!0===e&&this.dispose()}get needsUpdate(){return this.source!==this._source}_exec(){return null===this.codeNode||(!0===this._needsOutputUpdate&&(this._value=this.call("main"),this._needsOutputUpdate=!1),this._output.value=this._value),this}_refresh(){this.needsUpdate=!0,this._exec(),this._output.refresh()}}const Nx=Bi(vx).setParameterLength(1,2);function Sx(e){let t;const r=e.context.getViewZ;return void 0!==r&&(t=r(this)),(t||Ll.z).negate()}const Ex=Vi((([e,t],r)=>{const s=Sx(r);return Po(e,t,s)})),wx=Vi((([e],t)=>{const r=Sx(t);return e.mul(e,r,r).negate().exp().oneMinus()})),Ax=Vi((([e,t])=>tn(t.toFloat().mix(zn.rgb,e.toVec3()),zn.a)));let Rx=null,Cx=null;class Mx extends $s{static get type(){return"RangeNode"}constructor(e=$i(),t=$i()){super(),this.minNode=e,this.maxNode=t}getVectorLength(e){const t=e.getTypeLength(Rs(this.minNode.value)),r=e.getTypeLength(Rs(this.maxNode.value));return t>r?t:r}getNodeType(e){return e.object.count>1?e.getTypeFromLength(this.getVectorLength(e)):"float"}setup(e){const t=e.object;let r=null;if(t.count>1){const i=this.minNode.value,n=this.maxNode.value,a=e.getTypeLength(Rs(i)),o=e.getTypeLength(Rs(n));Rx=Rx||new s,Cx=Cx||new s,Rx.setScalar(0),Cx.setScalar(0),1===a?Rx.setScalar(i):i.isColor?Rx.set(i.r,i.g,i.b,1):Rx.set(i.x,i.y,i.z||0,i.w||0),1===o?Cx.setScalar(n):n.isColor?Cx.set(n.r,n.g,n.b,1):Cx.set(n.x,n.y,n.z||0,n.w||0);const l=4,d=l*t.count,c=new Float32Array(d);for(let e=0;ePi(new Lx(e,t)),Bx=Fx("numWorkgroups","uvec3"),Ix=Fx("workgroupId","uvec3"),Dx=Fx("globalId","uvec3"),Vx=Fx("localId","uvec3"),Ux=Fx("subgroupSize","uint");const Ox=Bi(class extends $s{constructor(e){super(),this.scope=e}generate(e){const{scope:t}=this,{renderer:r}=e;!0===r.backend.isWebGLBackend?e.addFlowCode(`\t// ${t}Barrier \n`):e.addLineFlowCode(`${t}Barrier()`,this)}});class Gx extends Hs{constructor(e,t){super(e,t),this.isWorkgroupInfoElementNode=!0}generate(e,t){let r;const s=e.context.assign;if(r=super.generate(e),!0!==s){const s=this.getNodeType(e);r=e.format(r,s,t)}return r}}class kx extends $s{constructor(e,t,r=0){super(t),this.bufferType=t,this.bufferCount=r,this.isWorkgroupInfoNode=!0,this.elementType=t,this.scope=e}label(e){return this.name=e,this}setScope(e){return this.scope=e,this}getElementType(){return this.elementType}getInputType(){return`${this.scope}Array`}element(e){return Pi(new Gx(this,e))}generate(e){return e.getScopedArray(this.name||`${this.scope}Array_${this.id}`,this.scope.toLowerCase(),this.bufferType,this.bufferCount)}}class zx extends js{static get type(){return"AtomicFunctionNode"}constructor(e,t,r){super("uint"),this.method=e,this.pointerNode=t,this.valueNode=r}getInputType(e){return this.pointerNode.getNodeType(e)}getNodeType(e){return this.getInputType(e)}generate(e){const t=this.method,r=this.getNodeType(e),s=this.getInputType(e),i=this.pointerNode,n=this.valueNode,a=[];a.push(`&${i.build(e,s)}`),null!==n&&a.push(n.build(e,s));const o=`${e.getMethod(t,r)}( ${a.join(", ")} )`;return null!==n&&e.addLineFlowCode(o,this),o}}zx.ATOMIC_LOAD="atomicLoad",zx.ATOMIC_STORE="atomicStore",zx.ATOMIC_ADD="atomicAdd",zx.ATOMIC_SUB="atomicSub",zx.ATOMIC_MAX="atomicMax",zx.ATOMIC_MIN="atomicMin",zx.ATOMIC_AND="atomicAnd",zx.ATOMIC_OR="atomicOr",zx.ATOMIC_XOR="atomicXor";const $x=Bi(zx),Hx=(e,t,r)=>{const s=$x(e,t,r);return s.append(),s};let Wx;function jx(e){Wx=Wx||new WeakMap;let t=Wx.get(e);return void 0===t&&Wx.set(e,t={}),t}function qx(e){const t=jx(e);return t.shadowMatrix||(t.shadowMatrix=Tn("mat4").setGroup(yn).onRenderUpdate((()=>(!0!==e.castShadow&&e.shadow.updateMatrices(e),e.shadow.matrix))))}function Xx(e,t=Ml){const r=qx(e).mul(t);return r.xyz.div(r.w)}function Kx(e){const t=jx(e);return t.position||(t.position=Tn(new r).setGroup(yn).onRenderUpdate(((t,r)=>r.value.setFromMatrixPosition(e.matrixWorld))))}function Yx(e){const t=jx(e);return t.targetPosition||(t.targetPosition=Tn(new r).setGroup(yn).onRenderUpdate(((t,r)=>r.value.setFromMatrixPosition(e.target.matrixWorld))))}function Qx(e){const t=jx(e);return t.viewPosition||(t.viewPosition=Tn(new r).setGroup(yn).onRenderUpdate((({camera:t},s)=>{s.value=s.value||new r,s.value.setFromMatrixPosition(e.matrixWorld),s.value.applyMatrix4(t.matrixWorldInverse)})))}const Zx=e=>rl.transformDirection(Kx(e).sub(Yx(e))),Jx=(e,t)=>{for(const r of t)if(r.isAnalyticLightNode&&r.light.id===e)return r;return null},eb=new WeakMap;class tb extends $s{static get type(){return"LightsNode"}constructor(){super("vec3"),this.totalDiffuseNode=Qi().toVar(),this.totalSpecularNode=Qi().toVar(),this.outgoingLightNode=Qi().toVar(),this._lights=[],this._lightNodes=null,this._lightNodesHash=null,this.global=!0}customCacheKey(){const e=[],t=this._lights;for(let r=0;re.sort(((e,t)=>e.id-t.id)))(this._lights),i=e.renderer.library;for(const e of s)if(e.isNode)t.push(Pi(e));else{let s=null;if(null!==r&&(s=Jx(e.id,r)),null===s){const r=i.getLightNodeClass(e.constructor);if(null===r){console.warn(`LightsNode.setupNodeLights: Light node not found for ${e.constructor.name}`);continue}let s=null;eb.has(e)?s=eb.get(e):(s=Pi(new r(e)),eb.set(e,s)),t.push(s)}}this._lightNodes=t}setupDirectLight(e,t,r){const{lightingModel:s,reflectedLight:i}=e.context;s.direct({...r,lightNode:t,reflectedLight:i},e)}setupDirectRectAreaLight(e,t,r){const{lightingModel:s,reflectedLight:i}=e.context;s.directRectArea({...r,lightNode:t,reflectedLight:i},e)}setupLights(e,t){for(const r of t)r.build(e)}getLightNodes(e){return null===this._lightNodes&&this.setupLightsNode(e),this._lightNodes}setup(e){const t=e.lightsNode;e.lightsNode=this;let r=this.outgoingLightNode;const s=e.context,i=s.lightingModel,n=e.getDataFromNode(this);if(i){const{totalDiffuseNode:t,totalSpecularNode:a}=this;s.outgoingLight=r;const o=e.addStack();n.nodes=o.nodes,i.start(e);const{backdrop:u,backdropAlpha:l}=s,{directDiffuse:d,directSpecular:c,indirectDiffuse:h,indirectSpecular:p}=s.reflectedLight;let g=d.add(h);null!==u&&(g=Qi(null!==l?l.mix(g,u):u),s.material.transparent=!0),t.assign(g),a.assign(c.add(p)),r.assign(t.add(a)),i.finish(e),r=r.bypass(e.removeStack())}else n.nodes=[];return e.lightsNode=t,r}setLights(e){return this._lights=e,this._lightNodes=null,this._lightNodesHash=null,this}getLights(){return this._lights}get hasLights(){return this._lights.length>0}}class rb extends $s{static get type(){return"ShadowBaseNode"}constructor(e){super(),this.light=e,this.updateBeforeType=Is.RENDER,this.isShadowBaseNode=!0}setupShadowPosition({context:e,material:t}){sb.assign(t.shadowPositionNode||e.shadowPositionWorld||Ml)}dispose(){this.updateBeforeType=Is.NONE}}const sb=vn("vec3","shadowPositionWorld");function ib(t,r={}){return r.toneMapping=t.toneMapping,r.toneMappingExposure=t.toneMappingExposure,r.outputColorSpace=t.outputColorSpace,r.renderTarget=t.getRenderTarget(),r.activeCubeFace=t.getActiveCubeFace(),r.activeMipmapLevel=t.getActiveMipmapLevel(),r.renderObjectFunction=t.getRenderObjectFunction(),r.pixelRatio=t.getPixelRatio(),r.mrt=t.getMRT(),r.clearColor=t.getClearColor(r.clearColor||new e),r.clearAlpha=t.getClearAlpha(),r.autoClear=t.autoClear,r.scissorTest=t.getScissorTest(),r}function nb(e,t){return t=ib(e,t),e.setMRT(null),e.setRenderObjectFunction(null),e.setClearColor(0,1),e.autoClear=!0,t}function ab(e,t){e.toneMapping=t.toneMapping,e.toneMappingExposure=t.toneMappingExposure,e.outputColorSpace=t.outputColorSpace,e.setRenderTarget(t.renderTarget,t.activeCubeFace,t.activeMipmapLevel),e.setRenderObjectFunction(t.renderObjectFunction),e.setPixelRatio(t.pixelRatio),e.setMRT(t.mrt),e.setClearColor(t.clearColor,t.clearAlpha),e.autoClear=t.autoClear,e.setScissorTest(t.scissorTest)}function ob(e,t={}){return t.background=e.background,t.backgroundNode=e.backgroundNode,t.overrideMaterial=e.overrideMaterial,t}function ub(e,t){return t=ob(e,t),e.background=null,e.backgroundNode=null,e.overrideMaterial=null,t}function lb(e,t){e.background=t.background,e.backgroundNode=t.backgroundNode,e.overrideMaterial=t.overrideMaterial}function db(e,t,r){return r=ub(t,r=nb(e,r))}function cb(e,t,r){ab(e,r),lb(t,r)}var hb=Object.freeze({__proto__:null,resetRendererAndSceneState:db,resetRendererState:nb,resetSceneState:ub,restoreRendererAndSceneState:cb,restoreRendererState:ab,restoreSceneState:lb,saveRendererAndSceneState:function(e,t,r={}){return r=ob(t,r=ib(e,r))},saveRendererState:ib,saveSceneState:ob});const pb=new WeakMap,gb=Vi((([e,t,r])=>{let s=Ml.sub(e).length();return s=s.sub(t).div(r.sub(t)),s=s.saturate(),s})),mb=e=>{let t=pb.get(e);if(void 0===t){const r=e.isPointLight?(e=>{const t=e.shadow.camera,r=ad("near","float",t).setGroup(yn),s=ad("far","float",t).setGroup(yn),i=dl(e);return gb(i,r,s)})(e):null;t=new Fh,t.colorNode=tn(0,0,0,1),t.depthNode=r,t.isShadowPassMaterial=!0,t.name="ShadowMaterial",t.fog=!1,pb.set(e,t)}return t},fb=Vi((({depthTexture:e,shadowCoord:t})=>Hu(e,t.xy).compare(t.z))),yb=Vi((({depthTexture:e,shadowCoord:t,shadow:r})=>{const s=(t,r)=>Hu(e,t).compare(r),i=ad("mapSize","vec2",r).setGroup(yn),n=ad("radius","float",r).setGroup(yn),a=qi(1).div(i),o=a.x.negate().mul(n),u=a.y.negate().mul(n),l=a.x.mul(n),d=a.y.mul(n),c=o.div(2),h=u.div(2),p=l.div(2),g=d.div(2);return sa(s(t.xy.add(qi(o,u)),t.z),s(t.xy.add(qi(0,u)),t.z),s(t.xy.add(qi(l,u)),t.z),s(t.xy.add(qi(c,h)),t.z),s(t.xy.add(qi(0,h)),t.z),s(t.xy.add(qi(p,h)),t.z),s(t.xy.add(qi(o,0)),t.z),s(t.xy.add(qi(c,0)),t.z),s(t.xy,t.z),s(t.xy.add(qi(p,0)),t.z),s(t.xy.add(qi(l,0)),t.z),s(t.xy.add(qi(c,g)),t.z),s(t.xy.add(qi(0,g)),t.z),s(t.xy.add(qi(p,g)),t.z),s(t.xy.add(qi(o,d)),t.z),s(t.xy.add(qi(0,d)),t.z),s(t.xy.add(qi(l,d)),t.z)).mul(1/17)})),xb=Vi((({depthTexture:e,shadowCoord:t,shadow:r})=>{const s=(t,r)=>Hu(e,t).compare(r),i=ad("mapSize","vec2",r).setGroup(yn),n=qi(1).div(i),a=n.x,o=n.y,u=t.xy,l=Ha(u.mul(i).add(.5));return u.subAssign(l.mul(n)),sa(s(u,t.z),s(u.add(qi(a,0)),t.z),s(u.add(qi(0,o)),t.z),s(u.add(n),t.z),Ao(s(u.add(qi(a.negate(),0)),t.z),s(u.add(qi(a.mul(2),0)),t.z),l.x),Ao(s(u.add(qi(a.negate(),o)),t.z),s(u.add(qi(a.mul(2),o)),t.z),l.x),Ao(s(u.add(qi(0,o.negate())),t.z),s(u.add(qi(0,o.mul(2))),t.z),l.y),Ao(s(u.add(qi(a,o.negate())),t.z),s(u.add(qi(a,o.mul(2))),t.z),l.y),Ao(Ao(s(u.add(qi(a.negate(),o.negate())),t.z),s(u.add(qi(a.mul(2),o.negate())),t.z),l.x),Ao(s(u.add(qi(a.negate(),o.mul(2))),t.z),s(u.add(qi(a.mul(2),o.mul(2))),t.z),l.x),l.y)).mul(1/9)})),bb=Vi((({depthTexture:e,shadowCoord:t})=>{const r=$i(1).toVar(),s=Hu(e).sample(t.xy).rg,i=go(t.z,s.x);return Gi(i.notEqual($i(1)),(()=>{const e=t.z.sub(s.x),n=po(0,s.y.mul(s.y));let a=n.div(n.add(e.mul(e)));a=Ro(ia(a,.3).div(.95-.3)),r.assign(Ro(po(i,a)))})),r})),Tb=Vi((({samples:e,radius:t,size:r,shadowPass:s})=>{const i=$i(0).toVar(),n=$i(0).toVar(),a=e.lessThanEqual($i(1)).select($i(0),$i(2).div(e.sub(1))),o=e.lessThanEqual($i(1)).select($i(0),$i(-1));kc({start:Hi(0),end:Hi(e),type:"int",condition:"<"},(({i:e})=>{const u=o.add($i(e).mul(a)),l=s.sample(sa(ih.xy,qi(0,u).mul(t)).div(r)).x;i.addAssign(l),n.addAssign(l.mul(l))})),i.divAssign(e),n.divAssign(e);const u=Oa(n.sub(i.mul(i)));return qi(i,u)})),_b=Vi((({samples:e,radius:t,size:r,shadowPass:s})=>{const i=$i(0).toVar(),n=$i(0).toVar(),a=e.lessThanEqual($i(1)).select($i(0),$i(2).div(e.sub(1))),o=e.lessThanEqual($i(1)).select($i(0),$i(-1));kc({start:Hi(0),end:Hi(e),type:"int",condition:"<"},(({i:e})=>{const u=o.add($i(e).mul(a)),l=s.sample(sa(ih.xy,qi(u,0).mul(t)).div(r));i.addAssign(l.x),n.addAssign(sa(l.y.mul(l.y),l.x.mul(l.x)))})),i.divAssign(e),n.divAssign(e);const u=Oa(n.sub(i.mul(i)));return qi(i,u)})),vb=[fb,yb,xb,bb];let Nb;const Sb=new dy;class Eb extends rb{static get type(){return"ShadowNode"}constructor(e,t=null){super(e),this.shadow=t||e.shadow,this.shadowMap=null,this.vsmShadowMapVertical=null,this.vsmShadowMapHorizontal=null,this.vsmMaterialVertical=null,this.vsmMaterialHorizontal=null,this._node=null,this._cameraFrameId=new WeakMap,this.isShadowNode=!0}setupShadowFilter(e,{filterFn:t,depthTexture:r,shadowCoord:s,shadow:i}){const n=s.x.greaterThanEqual(0).and(s.x.lessThanEqual(1)).and(s.y.greaterThanEqual(0)).and(s.y.lessThanEqual(1)).and(s.z.lessThanEqual(1)),a=t({depthTexture:r,shadowCoord:s,shadow:i});return n.select(a,$i(1))}setupShadowCoord(e,t){const{shadow:r}=this,{renderer:s}=e,i=ad("bias","float",r).setGroup(yn);let n,a=t;if(r.camera.isOrthographicCamera||!0!==s.logarithmicDepthBuffer)a=a.xyz.div(a.w),n=a.z,s.coordinateSystem===d&&(n=n.mul(2).sub(1));else{const e=a.w;a=a.xy.div(e);const t=ad("near","float",r.camera).setGroup(yn),s=ad("far","float",r.camera).setGroup(yn);n=Nh(e.negate(),t,s)}return a=Qi(a.x,a.y.oneMinus(),n.add(i)),a}getShadowFilterFn(e){return vb[e]}setupShadow(e){const{renderer:t}=e,{light:r,shadow:s}=this,i=t.shadowMap.type,n=new I(s.mapSize.width,s.mapSize.height);n.compareFunction=Ie;const a=e.createRenderTarget(s.mapSize.width,s.mapSize.height);if(a.depthTexture=n,s.camera.updateProjectionMatrix(),i===De){n.compareFunction=null,this.vsmShadowMapVertical=e.createRenderTarget(s.mapSize.width,s.mapSize.height,{format:Ve,type:he}),this.vsmShadowMapHorizontal=e.createRenderTarget(s.mapSize.width,s.mapSize.height,{format:Ve,type:he});const t=Hu(n),r=Hu(this.vsmShadowMapVertical.texture),i=ad("blurSamples","float",s).setGroup(yn),a=ad("radius","float",s).setGroup(yn),o=ad("mapSize","vec2",s).setGroup(yn);let u=this.vsmMaterialVertical||(this.vsmMaterialVertical=new Fh);u.fragmentNode=Tb({samples:i,radius:a,size:o,shadowPass:t}).context(e.getSharedContext()),u.name="VSMVertical",u=this.vsmMaterialHorizontal||(this.vsmMaterialHorizontal=new Fh),u.fragmentNode=_b({samples:i,radius:a,size:o,shadowPass:r}).context(e.getSharedContext()),u.name="VSMHorizontal"}const o=ad("intensity","float",s).setGroup(yn),u=ad("normalBias","float",s).setGroup(yn),l=qx(r).mul(sb.add($l.mul(u))),d=this.setupShadowCoord(e,l),c=s.filterNode||this.getShadowFilterFn(t.shadowMap.type)||null;if(null===c)throw new Error("THREE.WebGPURenderer: Shadow map type not supported yet.");const h=i===De?this.vsmShadowMapHorizontal.texture:n,p=this.setupShadowFilter(e,{filterFn:c,shadowTexture:a.texture,depthTexture:h,shadowCoord:d,shadow:s}),g=Hu(a.texture,d),m=Ao(1,p.rgb.mix(g,1),o.mul(g.a)).toVar();return this.shadowMap=a,this.shadow.map=a,m}setup(e){if(!1!==e.renderer.shadowMap.enabled)return Vi((()=>{let t=this._node;return this.setupShadowPosition(e),null===t&&(this._node=t=this.setupShadow(e)),e.material.shadowNode&&console.warn('THREE.NodeMaterial: ".shadowNode" is deprecated. Use ".castShadowNode" instead.'),e.material.receivedShadowNode&&(t=e.material.receivedShadowNode(t)),t}))()}renderShadow(e){const{shadow:t,shadowMap:r,light:s}=this,{renderer:i,scene:n}=e;t.updateMatrices(s),r.setSize(t.mapSize.width,t.mapSize.height),i.render(n,t.camera)}updateShadow(e){const{shadowMap:t,light:r,shadow:s}=this,{renderer:i,scene:n,camera:a}=e,o=i.shadowMap.type,u=t.depthTexture.version;this._depthVersionCached=u,s.camera.layers.mask=a.layers.mask;const l=i.getRenderObjectFunction(),d=i.getMRT(),c=!!d&&d.has("velocity");Nb=db(i,n,Nb),n.overrideMaterial=mb(r),i.setRenderObjectFunction(((e,t,r,n,u,l,...d)=>{(!0===e.castShadow||e.receiveShadow&&o===De)&&(c&&(Ms(e).useVelocity=!0),e.onBeforeShadow(i,e,a,s.camera,n,t.overrideMaterial,l),i.renderObject(e,t,r,n,u,l,...d),e.onAfterShadow(i,e,a,s.camera,n,t.overrideMaterial,l))})),i.setRenderTarget(t),this.renderShadow(e),i.setRenderObjectFunction(l),!0!==r.isPointLight&&o===De&&this.vsmPass(i),cb(i,n,Nb)}vsmPass(e){const{shadow:t}=this;this.vsmShadowMapVertical.setSize(t.mapSize.width,t.mapSize.height),this.vsmShadowMapHorizontal.setSize(t.mapSize.width,t.mapSize.height),e.setRenderTarget(this.vsmShadowMapVertical),Sb.material=this.vsmMaterialVertical,Sb.render(e),e.setRenderTarget(this.vsmShadowMapHorizontal),Sb.material=this.vsmMaterialHorizontal,Sb.render(e)}dispose(){this.shadowMap.dispose(),this.shadowMap=null,null!==this.vsmShadowMapVertical&&(this.vsmShadowMapVertical.dispose(),this.vsmShadowMapVertical=null,this.vsmMaterialVertical.dispose(),this.vsmMaterialVertical=null),null!==this.vsmShadowMapHorizontal&&(this.vsmShadowMapHorizontal.dispose(),this.vsmShadowMapHorizontal=null,this.vsmMaterialHorizontal.dispose(),this.vsmMaterialHorizontal=null),super.dispose()}updateBefore(e){const{shadow:t}=this;let r=t.needsUpdate||t.autoUpdate;r&&(this._cameraFrameId[e.camera]===e.frameId&&(r=!1),this._cameraFrameId[e.camera]=e.frameId),r&&(this.updateShadow(e),this.shadowMap.depthTexture.version===this._depthVersionCached&&(t.needsUpdate=!1))}}const wb=(e,t)=>Pi(new Eb(e,t)),Ab=new e,Rb=Vi((([e,t])=>{const r=e.toVar(),s=Qa(r),i=aa(1,po(s.x,po(s.y,s.z)));s.mulAssign(i),r.mulAssign(i.mul(t.mul(2).oneMinus()));const n=qi(r.xy).toVar(),a=t.mul(1.5).oneMinus();return Gi(s.z.greaterThanEqual(a),(()=>{Gi(r.z.greaterThan(0),(()=>{n.x.assign(ia(4,r.x))}))})).ElseIf(s.x.greaterThanEqual(a),(()=>{const e=Za(r.x);n.x.assign(r.z.mul(e).add(e.mul(2)))})).ElseIf(s.y.greaterThanEqual(a),(()=>{const e=Za(r.y);n.x.assign(r.x.add(e.mul(2)).add(2)),n.y.assign(r.z.mul(e).sub(2))})),qi(.125,.25).mul(n).add(qi(.375,.75)).flipY()})).setLayout({name:"cubeToUV",type:"vec2",inputs:[{name:"pos",type:"vec3"},{name:"texelSizeY",type:"float"}]}),Cb=Vi((({depthTexture:e,bd3D:t,dp:r,texelSize:s})=>Hu(e,Rb(t,s.y)).compare(r))),Mb=Vi((({depthTexture:e,bd3D:t,dp:r,texelSize:s,shadow:i})=>{const n=ad("radius","float",i).setGroup(yn),a=qi(-1,1).mul(n).mul(s.y);return Hu(e,Rb(t.add(a.xyy),s.y)).compare(r).add(Hu(e,Rb(t.add(a.yyy),s.y)).compare(r)).add(Hu(e,Rb(t.add(a.xyx),s.y)).compare(r)).add(Hu(e,Rb(t.add(a.yyx),s.y)).compare(r)).add(Hu(e,Rb(t,s.y)).compare(r)).add(Hu(e,Rb(t.add(a.xxy),s.y)).compare(r)).add(Hu(e,Rb(t.add(a.yxy),s.y)).compare(r)).add(Hu(e,Rb(t.add(a.xxx),s.y)).compare(r)).add(Hu(e,Rb(t.add(a.yxx),s.y)).compare(r)).mul(1/9)})),Pb=Vi((({filterFn:e,depthTexture:t,shadowCoord:r,shadow:s})=>{const i=r.xyz.toVar(),n=i.length(),a=Tn("float").setGroup(yn).onRenderUpdate((()=>s.camera.near)),o=Tn("float").setGroup(yn).onRenderUpdate((()=>s.camera.far)),u=ad("bias","float",s).setGroup(yn),l=Tn(s.mapSize).setGroup(yn),d=$i(1).toVar();return Gi(n.sub(o).lessThanEqual(0).and(n.sub(a).greaterThanEqual(0)),(()=>{const r=n.sub(a).div(o.sub(a)).toVar();r.addAssign(u);const c=i.normalize(),h=qi(1).div(l.mul(qi(4,2)));d.assign(e({depthTexture:t,bd3D:c,dp:r,texelSize:h,shadow:s}))})),d})),Lb=new s,Fb=new t,Bb=new t;class Ib extends Eb{static get type(){return"PointShadowNode"}constructor(e,t=null){super(e,t)}getShadowFilterFn(e){return e===Ue?Cb:Mb}setupShadowCoord(e,t){return t}setupShadowFilter(e,{filterFn:t,shadowTexture:r,depthTexture:s,shadowCoord:i,shadow:n}){return Pb({filterFn:t,shadowTexture:r,depthTexture:s,shadowCoord:i,shadow:n})}renderShadow(e){const{shadow:t,shadowMap:r,light:s}=this,{renderer:i,scene:n}=e,a=t.getFrameExtents();Bb.copy(t.mapSize),Bb.multiply(a),r.setSize(Bb.width,Bb.height),Fb.copy(t.mapSize);const o=i.autoClear,u=i.getClearColor(Ab),l=i.getClearAlpha();i.autoClear=!1,i.setClearColor(t.clearColor,t.clearAlpha),i.clear();const d=t.getViewportCount();for(let e=0;ePi(new Ib(e,t));class Vb extends Xc{static get type(){return"AnalyticLightNode"}constructor(t=null){super(),this.light=t,this.color=new e,this.colorNode=t&&t.colorNode||Tn(this.color).setGroup(yn),this.baseColorNode=null,this.shadowNode=null,this.shadowColorNode=null,this.isAnalyticLightNode=!0,this.updateType=Is.FRAME}customCacheKey(){return Ts(this.light.id,this.light.castShadow?1:0)}getHash(){return this.light.uuid}getLightVector(e){return Qx(this.light).sub(e.context.positionView||Ll)}setupDirect(){}setupDirectRectArea(){}setupShadowNode(){return wb(this.light)}setupShadow(e){const{renderer:t}=e;if(!1===t.shadowMap.enabled)return;let r=this.shadowColorNode;if(null===r){const e=this.light.shadow.shadowNode;let t;t=void 0!==e?Pi(e):this.setupShadowNode(),this.shadowNode=t,this.shadowColorNode=r=this.colorNode.mul(t),this.baseColorNode=this.colorNode}this.colorNode=r}setup(e){this.colorNode=this.baseColorNode||this.colorNode,this.light.castShadow?e.object.receiveShadow&&this.setupShadow(e):null!==this.shadowNode&&(this.shadowNode.dispose(),this.shadowNode=null,this.shadowColorNode=null);const t=this.setupDirect(e),r=this.setupDirectRectArea(e);t&&e.lightsNode.setupDirectLight(e,this,t),r&&e.lightsNode.setupDirectRectAreaLight(e,this,r)}update(){const{light:e}=this;this.color.copy(e.color).multiplyScalar(e.intensity)}}const Ub=Vi((({lightDistance:e,cutoffDistance:t,decayExponent:r})=>{const s=e.pow(r).max(.01).reciprocal();return t.greaterThan(0).select(s.mul(e.div(t).pow4().oneMinus().clamp().pow2()),s)})),Ob=({color:e,lightVector:t,cutoffDistance:r,decayExponent:s})=>{const i=t.normalize(),n=t.length(),a=Ub({lightDistance:n,cutoffDistance:r,decayExponent:s});return{lightDirection:i,lightColor:e.mul(a)}};class Gb extends Vb{static get type(){return"PointLightNode"}constructor(e=null){super(e),this.cutoffDistanceNode=Tn(0).setGroup(yn),this.decayExponentNode=Tn(2).setGroup(yn)}update(e){const{light:t}=this;super.update(e),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}setupShadowNode(){return Db(this.light)}setupDirect(e){return Ob({color:this.colorNode,lightVector:this.getLightVector(e),cutoffDistance:this.cutoffDistanceNode,decayExponent:this.decayExponentNode})}}const kb=Vi((([e=t()])=>{const t=e.mul(2),r=t.x.floor(),s=t.y.floor();return r.add(s).mod(2).sign()})),zb=Vi((([e=Uu()],{renderer:t,material:r})=>{const s=$i(1).toVar(),i=wo(e.mul(2).sub(1));if(r.alphaToCoverage&&t.samples>1){const e=$i(i.fwidth()).toVar();s.assign(Po(e.oneMinus(),e.add(1),i).oneMinus())}else i.greaterThan(1).discard();return s})),$b=Vi((([e,t,r])=>{const s=$i(r).toVar(),i=$i(t).toVar(),n=ji(e).toVar();return Go(n,i,s)})).setLayout({name:"mx_select",type:"float",inputs:[{name:"b",type:"bool"},{name:"t",type:"float"},{name:"f",type:"float"}]}),Hb=Vi((([e,t])=>{const r=ji(t).toVar(),s=$i(e).toVar();return Go(r,s.negate(),s)})).setLayout({name:"mx_negate_if",type:"float",inputs:[{name:"val",type:"float"},{name:"b",type:"bool"}]}),Wb=Vi((([e])=>{const t=$i(e).toVar();return Hi(ka(t))})).setLayout({name:"mx_floor",type:"int",inputs:[{name:"x",type:"float"}]}),jb=Vi((([e,t])=>{const r=$i(e).toVar();return t.assign(Wb(r)),r.sub($i(t))})),qb=Ff([Vi((([e,t,r,s,i,n])=>{const a=$i(n).toVar(),o=$i(i).toVar(),u=$i(s).toVar(),l=$i(r).toVar(),d=$i(t).toVar(),c=$i(e).toVar(),h=$i(ia(1,o)).toVar();return ia(1,a).mul(c.mul(h).add(d.mul(o))).add(a.mul(l.mul(h).add(u.mul(o))))})).setLayout({name:"mx_bilerp_0",type:"float",inputs:[{name:"v0",type:"float"},{name:"v1",type:"float"},{name:"v2",type:"float"},{name:"v3",type:"float"},{name:"s",type:"float"},{name:"t",type:"float"}]}),Vi((([e,t,r,s,i,n])=>{const a=$i(n).toVar(),o=$i(i).toVar(),u=Qi(s).toVar(),l=Qi(r).toVar(),d=Qi(t).toVar(),c=Qi(e).toVar(),h=$i(ia(1,o)).toVar();return ia(1,a).mul(c.mul(h).add(d.mul(o))).add(a.mul(l.mul(h).add(u.mul(o))))})).setLayout({name:"mx_bilerp_1",type:"vec3",inputs:[{name:"v0",type:"vec3"},{name:"v1",type:"vec3"},{name:"v2",type:"vec3"},{name:"v3",type:"vec3"},{name:"s",type:"float"},{name:"t",type:"float"}]})]),Xb=Ff([Vi((([e,t,r,s,i,n,a,o,u,l,d])=>{const c=$i(d).toVar(),h=$i(l).toVar(),p=$i(u).toVar(),g=$i(o).toVar(),m=$i(a).toVar(),f=$i(n).toVar(),y=$i(i).toVar(),x=$i(s).toVar(),b=$i(r).toVar(),T=$i(t).toVar(),_=$i(e).toVar(),v=$i(ia(1,p)).toVar(),N=$i(ia(1,h)).toVar();return $i(ia(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(b.mul(v).add(x.mul(p))))).add(c.mul(N.mul(y.mul(v).add(f.mul(p))).add(h.mul(m.mul(v).add(g.mul(p))))))})).setLayout({name:"mx_trilerp_0",type:"float",inputs:[{name:"v0",type:"float"},{name:"v1",type:"float"},{name:"v2",type:"float"},{name:"v3",type:"float"},{name:"v4",type:"float"},{name:"v5",type:"float"},{name:"v6",type:"float"},{name:"v7",type:"float"},{name:"s",type:"float"},{name:"t",type:"float"},{name:"r",type:"float"}]}),Vi((([e,t,r,s,i,n,a,o,u,l,d])=>{const c=$i(d).toVar(),h=$i(l).toVar(),p=$i(u).toVar(),g=Qi(o).toVar(),m=Qi(a).toVar(),f=Qi(n).toVar(),y=Qi(i).toVar(),x=Qi(s).toVar(),b=Qi(r).toVar(),T=Qi(t).toVar(),_=Qi(e).toVar(),v=$i(ia(1,p)).toVar(),N=$i(ia(1,h)).toVar();return $i(ia(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(b.mul(v).add(x.mul(p))))).add(c.mul(N.mul(y.mul(v).add(f.mul(p))).add(h.mul(m.mul(v).add(g.mul(p))))))})).setLayout({name:"mx_trilerp_1",type:"vec3",inputs:[{name:"v0",type:"vec3"},{name:"v1",type:"vec3"},{name:"v2",type:"vec3"},{name:"v3",type:"vec3"},{name:"v4",type:"vec3"},{name:"v5",type:"vec3"},{name:"v6",type:"vec3"},{name:"v7",type:"vec3"},{name:"s",type:"float"},{name:"t",type:"float"},{name:"r",type:"float"}]})]),Kb=Vi((([e,t,r])=>{const s=$i(r).toVar(),i=$i(t).toVar(),n=Wi(e).toVar(),a=Wi(n.bitAnd(Wi(7))).toVar(),o=$i($b(a.lessThan(Wi(4)),i,s)).toVar(),u=$i(na(2,$b(a.lessThan(Wi(4)),s,i))).toVar();return Hb(o,ji(a.bitAnd(Wi(1)))).add(Hb(u,ji(a.bitAnd(Wi(2)))))})).setLayout({name:"mx_gradient_float_0",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"}]}),Yb=Vi((([e,t,r,s])=>{const i=$i(s).toVar(),n=$i(r).toVar(),a=$i(t).toVar(),o=Wi(e).toVar(),u=Wi(o.bitAnd(Wi(15))).toVar(),l=$i($b(u.lessThan(Wi(8)),a,n)).toVar(),d=$i($b(u.lessThan(Wi(4)),n,$b(u.equal(Wi(12)).or(u.equal(Wi(14))),a,i))).toVar();return Hb(l,ji(u.bitAnd(Wi(1)))).add(Hb(d,ji(u.bitAnd(Wi(2)))))})).setLayout({name:"mx_gradient_float_1",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]}),Qb=Ff([Kb,Yb]),Zb=Vi((([e,t,r])=>{const s=$i(r).toVar(),i=$i(t).toVar(),n=Ji(e).toVar();return Qi(Qb(n.x,i,s),Qb(n.y,i,s),Qb(n.z,i,s))})).setLayout({name:"mx_gradient_vec3_0",type:"vec3",inputs:[{name:"hash",type:"uvec3"},{name:"x",type:"float"},{name:"y",type:"float"}]}),Jb=Vi((([e,t,r,s])=>{const i=$i(s).toVar(),n=$i(r).toVar(),a=$i(t).toVar(),o=Ji(e).toVar();return Qi(Qb(o.x,a,n,i),Qb(o.y,a,n,i),Qb(o.z,a,n,i))})).setLayout({name:"mx_gradient_vec3_1",type:"vec3",inputs:[{name:"hash",type:"uvec3"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]}),eT=Ff([Zb,Jb]),tT=Vi((([e])=>{const t=$i(e).toVar();return na(.6616,t)})).setLayout({name:"mx_gradient_scale2d_0",type:"float",inputs:[{name:"v",type:"float"}]}),rT=Vi((([e])=>{const t=$i(e).toVar();return na(.982,t)})).setLayout({name:"mx_gradient_scale3d_0",type:"float",inputs:[{name:"v",type:"float"}]}),sT=Ff([tT,Vi((([e])=>{const t=Qi(e).toVar();return na(.6616,t)})).setLayout({name:"mx_gradient_scale2d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),iT=Ff([rT,Vi((([e])=>{const t=Qi(e).toVar();return na(.982,t)})).setLayout({name:"mx_gradient_scale3d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),nT=Vi((([e,t])=>{const r=Hi(t).toVar(),s=Wi(e).toVar();return s.shiftLeft(r).bitOr(s.shiftRight(Hi(32).sub(r)))})).setLayout({name:"mx_rotl32",type:"uint",inputs:[{name:"x",type:"uint"},{name:"k",type:"int"}]}),aT=Vi((([e,t,r])=>{e.subAssign(r),e.bitXorAssign(nT(r,Hi(4))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(nT(e,Hi(6))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(nT(t,Hi(8))),t.addAssign(e),e.subAssign(r),e.bitXorAssign(nT(r,Hi(16))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(nT(e,Hi(19))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(nT(t,Hi(4))),t.addAssign(e)})),oT=Vi((([e,t,r])=>{const s=Wi(r).toVar(),i=Wi(t).toVar(),n=Wi(e).toVar();return s.bitXorAssign(i),s.subAssign(nT(i,Hi(14))),n.bitXorAssign(s),n.subAssign(nT(s,Hi(11))),i.bitXorAssign(n),i.subAssign(nT(n,Hi(25))),s.bitXorAssign(i),s.subAssign(nT(i,Hi(16))),n.bitXorAssign(s),n.subAssign(nT(s,Hi(4))),i.bitXorAssign(n),i.subAssign(nT(n,Hi(14))),s.bitXorAssign(i),s.subAssign(nT(i,Hi(24))),s})).setLayout({name:"mx_bjfinal",type:"uint",inputs:[{name:"a",type:"uint"},{name:"b",type:"uint"},{name:"c",type:"uint"}]}),uT=Vi((([e])=>{const t=Wi(e).toVar();return $i(t).div($i(Wi(Hi(4294967295))))})).setLayout({name:"mx_bits_to_01",type:"float",inputs:[{name:"bits",type:"uint"}]}),lT=Vi((([e])=>{const t=$i(e).toVar();return t.mul(t).mul(t).mul(t.mul(t.mul(6).sub(15)).add(10))})).setLayout({name:"mx_fade",type:"float",inputs:[{name:"t",type:"float"}]}),dT=Ff([Vi((([e])=>{const t=Hi(e).toVar(),r=Wi(Wi(1)).toVar(),s=Wi(Wi(Hi(3735928559)).add(r.shiftLeft(Wi(2))).add(Wi(13))).toVar();return oT(s.add(Wi(t)),s,s)})).setLayout({name:"mx_hash_int_0",type:"uint",inputs:[{name:"x",type:"int"}]}),Vi((([e,t])=>{const r=Hi(t).toVar(),s=Hi(e).toVar(),i=Wi(Wi(2)).toVar(),n=Wi().toVar(),a=Wi().toVar(),o=Wi().toVar();return n.assign(a.assign(o.assign(Wi(Hi(3735928559)).add(i.shiftLeft(Wi(2))).add(Wi(13))))),n.addAssign(Wi(s)),a.addAssign(Wi(r)),oT(n,a,o)})).setLayout({name:"mx_hash_int_1",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),Vi((([e,t,r])=>{const s=Hi(r).toVar(),i=Hi(t).toVar(),n=Hi(e).toVar(),a=Wi(Wi(3)).toVar(),o=Wi().toVar(),u=Wi().toVar(),l=Wi().toVar();return o.assign(u.assign(l.assign(Wi(Hi(3735928559)).add(a.shiftLeft(Wi(2))).add(Wi(13))))),o.addAssign(Wi(n)),u.addAssign(Wi(i)),l.addAssign(Wi(s)),oT(o,u,l)})).setLayout({name:"mx_hash_int_2",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]}),Vi((([e,t,r,s])=>{const i=Hi(s).toVar(),n=Hi(r).toVar(),a=Hi(t).toVar(),o=Hi(e).toVar(),u=Wi(Wi(4)).toVar(),l=Wi().toVar(),d=Wi().toVar(),c=Wi().toVar();return l.assign(d.assign(c.assign(Wi(Hi(3735928559)).add(u.shiftLeft(Wi(2))).add(Wi(13))))),l.addAssign(Wi(o)),d.addAssign(Wi(a)),c.addAssign(Wi(n)),aT(l,d,c),l.addAssign(Wi(i)),oT(l,d,c)})).setLayout({name:"mx_hash_int_3",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xx",type:"int"}]}),Vi((([e,t,r,s,i])=>{const n=Hi(i).toVar(),a=Hi(s).toVar(),o=Hi(r).toVar(),u=Hi(t).toVar(),l=Hi(e).toVar(),d=Wi(Wi(5)).toVar(),c=Wi().toVar(),h=Wi().toVar(),p=Wi().toVar();return c.assign(h.assign(p.assign(Wi(Hi(3735928559)).add(d.shiftLeft(Wi(2))).add(Wi(13))))),c.addAssign(Wi(l)),h.addAssign(Wi(u)),p.addAssign(Wi(o)),aT(c,h,p),c.addAssign(Wi(a)),h.addAssign(Wi(n)),oT(c,h,p)})).setLayout({name:"mx_hash_int_4",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xx",type:"int"},{name:"yy",type:"int"}]})]),cT=Ff([Vi((([e,t])=>{const r=Hi(t).toVar(),s=Hi(e).toVar(),i=Wi(dT(s,r)).toVar(),n=Ji().toVar();return n.x.assign(i.bitAnd(Hi(255))),n.y.assign(i.shiftRight(Hi(8)).bitAnd(Hi(255))),n.z.assign(i.shiftRight(Hi(16)).bitAnd(Hi(255))),n})).setLayout({name:"mx_hash_vec3_0",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),Vi((([e,t,r])=>{const s=Hi(r).toVar(),i=Hi(t).toVar(),n=Hi(e).toVar(),a=Wi(dT(n,i,s)).toVar(),o=Ji().toVar();return o.x.assign(a.bitAnd(Hi(255))),o.y.assign(a.shiftRight(Hi(8)).bitAnd(Hi(255))),o.z.assign(a.shiftRight(Hi(16)).bitAnd(Hi(255))),o})).setLayout({name:"mx_hash_vec3_1",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]})]),hT=Ff([Vi((([e])=>{const t=qi(e).toVar(),r=Hi().toVar(),s=Hi().toVar(),i=$i(jb(t.x,r)).toVar(),n=$i(jb(t.y,s)).toVar(),a=$i(lT(i)).toVar(),o=$i(lT(n)).toVar(),u=$i(qb(Qb(dT(r,s),i,n),Qb(dT(r.add(Hi(1)),s),i.sub(1),n),Qb(dT(r,s.add(Hi(1))),i,n.sub(1)),Qb(dT(r.add(Hi(1)),s.add(Hi(1))),i.sub(1),n.sub(1)),a,o)).toVar();return sT(u)})).setLayout({name:"mx_perlin_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"}]}),Vi((([e])=>{const t=Qi(e).toVar(),r=Hi().toVar(),s=Hi().toVar(),i=Hi().toVar(),n=$i(jb(t.x,r)).toVar(),a=$i(jb(t.y,s)).toVar(),o=$i(jb(t.z,i)).toVar(),u=$i(lT(n)).toVar(),l=$i(lT(a)).toVar(),d=$i(lT(o)).toVar(),c=$i(Xb(Qb(dT(r,s,i),n,a,o),Qb(dT(r.add(Hi(1)),s,i),n.sub(1),a,o),Qb(dT(r,s.add(Hi(1)),i),n,a.sub(1),o),Qb(dT(r.add(Hi(1)),s.add(Hi(1)),i),n.sub(1),a.sub(1),o),Qb(dT(r,s,i.add(Hi(1))),n,a,o.sub(1)),Qb(dT(r.add(Hi(1)),s,i.add(Hi(1))),n.sub(1),a,o.sub(1)),Qb(dT(r,s.add(Hi(1)),i.add(Hi(1))),n,a.sub(1),o.sub(1)),Qb(dT(r.add(Hi(1)),s.add(Hi(1)),i.add(Hi(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return iT(c)})).setLayout({name:"mx_perlin_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"}]})]),pT=Ff([Vi((([e])=>{const t=qi(e).toVar(),r=Hi().toVar(),s=Hi().toVar(),i=$i(jb(t.x,r)).toVar(),n=$i(jb(t.y,s)).toVar(),a=$i(lT(i)).toVar(),o=$i(lT(n)).toVar(),u=Qi(qb(eT(cT(r,s),i,n),eT(cT(r.add(Hi(1)),s),i.sub(1),n),eT(cT(r,s.add(Hi(1))),i,n.sub(1)),eT(cT(r.add(Hi(1)),s.add(Hi(1))),i.sub(1),n.sub(1)),a,o)).toVar();return sT(u)})).setLayout({name:"mx_perlin_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),Vi((([e])=>{const t=Qi(e).toVar(),r=Hi().toVar(),s=Hi().toVar(),i=Hi().toVar(),n=$i(jb(t.x,r)).toVar(),a=$i(jb(t.y,s)).toVar(),o=$i(jb(t.z,i)).toVar(),u=$i(lT(n)).toVar(),l=$i(lT(a)).toVar(),d=$i(lT(o)).toVar(),c=Qi(Xb(eT(cT(r,s,i),n,a,o),eT(cT(r.add(Hi(1)),s,i),n.sub(1),a,o),eT(cT(r,s.add(Hi(1)),i),n,a.sub(1),o),eT(cT(r.add(Hi(1)),s.add(Hi(1)),i),n.sub(1),a.sub(1),o),eT(cT(r,s,i.add(Hi(1))),n,a,o.sub(1)),eT(cT(r.add(Hi(1)),s,i.add(Hi(1))),n.sub(1),a,o.sub(1)),eT(cT(r,s.add(Hi(1)),i.add(Hi(1))),n,a.sub(1),o.sub(1)),eT(cT(r.add(Hi(1)),s.add(Hi(1)),i.add(Hi(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return iT(c)})).setLayout({name:"mx_perlin_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"}]})]),gT=Ff([Vi((([e])=>{const t=$i(e).toVar(),r=Hi(Wb(t)).toVar();return uT(dT(r))})).setLayout({name:"mx_cell_noise_float_0",type:"float",inputs:[{name:"p",type:"float"}]}),Vi((([e])=>{const t=qi(e).toVar(),r=Hi(Wb(t.x)).toVar(),s=Hi(Wb(t.y)).toVar();return uT(dT(r,s))})).setLayout({name:"mx_cell_noise_float_1",type:"float",inputs:[{name:"p",type:"vec2"}]}),Vi((([e])=>{const t=Qi(e).toVar(),r=Hi(Wb(t.x)).toVar(),s=Hi(Wb(t.y)).toVar(),i=Hi(Wb(t.z)).toVar();return uT(dT(r,s,i))})).setLayout({name:"mx_cell_noise_float_2",type:"float",inputs:[{name:"p",type:"vec3"}]}),Vi((([e])=>{const t=tn(e).toVar(),r=Hi(Wb(t.x)).toVar(),s=Hi(Wb(t.y)).toVar(),i=Hi(Wb(t.z)).toVar(),n=Hi(Wb(t.w)).toVar();return uT(dT(r,s,i,n))})).setLayout({name:"mx_cell_noise_float_3",type:"float",inputs:[{name:"p",type:"vec4"}]})]),mT=Ff([Vi((([e])=>{const t=$i(e).toVar(),r=Hi(Wb(t)).toVar();return Qi(uT(dT(r,Hi(0))),uT(dT(r,Hi(1))),uT(dT(r,Hi(2))))})).setLayout({name:"mx_cell_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"float"}]}),Vi((([e])=>{const t=qi(e).toVar(),r=Hi(Wb(t.x)).toVar(),s=Hi(Wb(t.y)).toVar();return Qi(uT(dT(r,s,Hi(0))),uT(dT(r,s,Hi(1))),uT(dT(r,s,Hi(2))))})).setLayout({name:"mx_cell_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),Vi((([e])=>{const t=Qi(e).toVar(),r=Hi(Wb(t.x)).toVar(),s=Hi(Wb(t.y)).toVar(),i=Hi(Wb(t.z)).toVar();return Qi(uT(dT(r,s,i,Hi(0))),uT(dT(r,s,i,Hi(1))),uT(dT(r,s,i,Hi(2))))})).setLayout({name:"mx_cell_noise_vec3_2",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),Vi((([e])=>{const t=tn(e).toVar(),r=Hi(Wb(t.x)).toVar(),s=Hi(Wb(t.y)).toVar(),i=Hi(Wb(t.z)).toVar(),n=Hi(Wb(t.w)).toVar();return Qi(uT(dT(r,s,i,n,Hi(0))),uT(dT(r,s,i,n,Hi(1))),uT(dT(r,s,i,n,Hi(2))))})).setLayout({name:"mx_cell_noise_vec3_3",type:"vec3",inputs:[{name:"p",type:"vec4"}]})]),fT=Vi((([e,t,r,s])=>{const i=$i(s).toVar(),n=$i(r).toVar(),a=Hi(t).toVar(),o=Qi(e).toVar(),u=$i(0).toVar(),l=$i(1).toVar();return kc(a,(()=>{u.addAssign(l.mul(hT(o))),l.mulAssign(i),o.mulAssign(n)})),u})).setLayout({name:"mx_fractal_noise_float",type:"float",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),yT=Vi((([e,t,r,s])=>{const i=$i(s).toVar(),n=$i(r).toVar(),a=Hi(t).toVar(),o=Qi(e).toVar(),u=Qi(0).toVar(),l=$i(1).toVar();return kc(a,(()=>{u.addAssign(l.mul(pT(o))),l.mulAssign(i),o.mulAssign(n)})),u})).setLayout({name:"mx_fractal_noise_vec3",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),xT=Vi((([e,t,r,s])=>{const i=$i(s).toVar(),n=$i(r).toVar(),a=Hi(t).toVar(),o=Qi(e).toVar();return qi(fT(o,a,n,i),fT(o.add(Qi(Hi(19),Hi(193),Hi(17))),a,n,i))})).setLayout({name:"mx_fractal_noise_vec2",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),bT=Vi((([e,t,r,s])=>{const i=$i(s).toVar(),n=$i(r).toVar(),a=Hi(t).toVar(),o=Qi(e).toVar(),u=Qi(yT(o,a,n,i)).toVar(),l=$i(fT(o.add(Qi(Hi(19),Hi(193),Hi(17))),a,n,i)).toVar();return tn(u,l)})).setLayout({name:"mx_fractal_noise_vec4",type:"vec4",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),TT=Ff([Vi((([e,t,r,s,i,n,a])=>{const o=Hi(a).toVar(),u=$i(n).toVar(),l=Hi(i).toVar(),d=Hi(s).toVar(),c=Hi(r).toVar(),h=Hi(t).toVar(),p=qi(e).toVar(),g=Qi(mT(qi(h.add(d),c.add(l)))).toVar(),m=qi(g.x,g.y).toVar();m.subAssign(.5),m.mulAssign(u),m.addAssign(.5);const f=qi(qi($i(h),$i(c)).add(m)).toVar(),y=qi(f.sub(p)).toVar();return Gi(o.equal(Hi(2)),(()=>Qa(y.x).add(Qa(y.y)))),Gi(o.equal(Hi(3)),(()=>po(Qa(y.x),Qa(y.y)))),xo(y,y)})).setLayout({name:"mx_worley_distance_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"x",type:"int"},{name:"y",type:"int"},{name:"xoff",type:"int"},{name:"yoff",type:"int"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Vi((([e,t,r,s,i,n,a,o,u])=>{const l=Hi(u).toVar(),d=$i(o).toVar(),c=Hi(a).toVar(),h=Hi(n).toVar(),p=Hi(i).toVar(),g=Hi(s).toVar(),m=Hi(r).toVar(),f=Hi(t).toVar(),y=Qi(e).toVar(),x=Qi(mT(Qi(f.add(p),m.add(h),g.add(c)))).toVar();x.subAssign(.5),x.mulAssign(d),x.addAssign(.5);const b=Qi(Qi($i(f),$i(m),$i(g)).add(x)).toVar(),T=Qi(b.sub(y)).toVar();return Gi(l.equal(Hi(2)),(()=>Qa(T.x).add(Qa(T.y)).add(Qa(T.z)))),Gi(l.equal(Hi(3)),(()=>po(po(Qa(T.x),Qa(T.y)),Qa(T.z)))),xo(T,T)})).setLayout({name:"mx_worley_distance_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xoff",type:"int"},{name:"yoff",type:"int"},{name:"zoff",type:"int"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),_T=Vi((([e,t,r])=>{const s=Hi(r).toVar(),i=$i(t).toVar(),n=qi(e).toVar(),a=Hi().toVar(),o=Hi().toVar(),u=qi(jb(n.x,a),jb(n.y,o)).toVar(),l=$i(1e6).toVar();return kc({start:-1,end:Hi(1),name:"x",condition:"<="},(({x:e})=>{kc({start:-1,end:Hi(1),name:"y",condition:"<="},(({y:t})=>{const r=$i(TT(u,e,t,a,o,i,s)).toVar();l.assign(ho(l,r))}))})),Gi(s.equal(Hi(0)),(()=>{l.assign(Oa(l))})),l})).setLayout({name:"mx_worley_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),vT=Vi((([e,t,r])=>{const s=Hi(r).toVar(),i=$i(t).toVar(),n=qi(e).toVar(),a=Hi().toVar(),o=Hi().toVar(),u=qi(jb(n.x,a),jb(n.y,o)).toVar(),l=qi(1e6,1e6).toVar();return kc({start:-1,end:Hi(1),name:"x",condition:"<="},(({x:e})=>{kc({start:-1,end:Hi(1),name:"y",condition:"<="},(({y:t})=>{const r=$i(TT(u,e,t,a,o,i,s)).toVar();Gi(r.lessThan(l.x),(()=>{l.y.assign(l.x),l.x.assign(r)})).ElseIf(r.lessThan(l.y),(()=>{l.y.assign(r)}))}))})),Gi(s.equal(Hi(0)),(()=>{l.assign(Oa(l))})),l})).setLayout({name:"mx_worley_noise_vec2_0",type:"vec2",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),NT=Vi((([e,t,r])=>{const s=Hi(r).toVar(),i=$i(t).toVar(),n=qi(e).toVar(),a=Hi().toVar(),o=Hi().toVar(),u=qi(jb(n.x,a),jb(n.y,o)).toVar(),l=Qi(1e6,1e6,1e6).toVar();return kc({start:-1,end:Hi(1),name:"x",condition:"<="},(({x:e})=>{kc({start:-1,end:Hi(1),name:"y",condition:"<="},(({y:t})=>{const r=$i(TT(u,e,t,a,o,i,s)).toVar();Gi(r.lessThan(l.x),(()=>{l.z.assign(l.y),l.y.assign(l.x),l.x.assign(r)})).ElseIf(r.lessThan(l.y),(()=>{l.z.assign(l.y),l.y.assign(r)})).ElseIf(r.lessThan(l.z),(()=>{l.z.assign(r)}))}))})),Gi(s.equal(Hi(0)),(()=>{l.assign(Oa(l))})),l})).setLayout({name:"mx_worley_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),ST=Ff([_T,Vi((([e,t,r])=>{const s=Hi(r).toVar(),i=$i(t).toVar(),n=Qi(e).toVar(),a=Hi().toVar(),o=Hi().toVar(),u=Hi().toVar(),l=Qi(jb(n.x,a),jb(n.y,o),jb(n.z,u)).toVar(),d=$i(1e6).toVar();return kc({start:-1,end:Hi(1),name:"x",condition:"<="},(({x:e})=>{kc({start:-1,end:Hi(1),name:"y",condition:"<="},(({y:t})=>{kc({start:-1,end:Hi(1),name:"z",condition:"<="},(({z:r})=>{const n=$i(TT(l,e,t,r,a,o,u,i,s)).toVar();d.assign(ho(d,n))}))}))})),Gi(s.equal(Hi(0)),(()=>{d.assign(Oa(d))})),d})).setLayout({name:"mx_worley_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),ET=Ff([vT,Vi((([e,t,r])=>{const s=Hi(r).toVar(),i=$i(t).toVar(),n=Qi(e).toVar(),a=Hi().toVar(),o=Hi().toVar(),u=Hi().toVar(),l=Qi(jb(n.x,a),jb(n.y,o),jb(n.z,u)).toVar(),d=qi(1e6,1e6).toVar();return kc({start:-1,end:Hi(1),name:"x",condition:"<="},(({x:e})=>{kc({start:-1,end:Hi(1),name:"y",condition:"<="},(({y:t})=>{kc({start:-1,end:Hi(1),name:"z",condition:"<="},(({z:r})=>{const n=$i(TT(l,e,t,r,a,o,u,i,s)).toVar();Gi(n.lessThan(d.x),(()=>{d.y.assign(d.x),d.x.assign(n)})).ElseIf(n.lessThan(d.y),(()=>{d.y.assign(n)}))}))}))})),Gi(s.equal(Hi(0)),(()=>{d.assign(Oa(d))})),d})).setLayout({name:"mx_worley_noise_vec2_1",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),wT=Ff([NT,Vi((([e,t,r])=>{const s=Hi(r).toVar(),i=$i(t).toVar(),n=Qi(e).toVar(),a=Hi().toVar(),o=Hi().toVar(),u=Hi().toVar(),l=Qi(jb(n.x,a),jb(n.y,o),jb(n.z,u)).toVar(),d=Qi(1e6,1e6,1e6).toVar();return kc({start:-1,end:Hi(1),name:"x",condition:"<="},(({x:e})=>{kc({start:-1,end:Hi(1),name:"y",condition:"<="},(({y:t})=>{kc({start:-1,end:Hi(1),name:"z",condition:"<="},(({z:r})=>{const n=$i(TT(l,e,t,r,a,o,u,i,s)).toVar();Gi(n.lessThan(d.x),(()=>{d.z.assign(d.y),d.y.assign(d.x),d.x.assign(n)})).ElseIf(n.lessThan(d.y),(()=>{d.z.assign(d.y),d.y.assign(n)})).ElseIf(n.lessThan(d.z),(()=>{d.z.assign(n)}))}))}))})),Gi(s.equal(Hi(0)),(()=>{d.assign(Oa(d))})),d})).setLayout({name:"mx_worley_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),AT=Vi((([e])=>{const t=e.y,r=e.z,s=Qi().toVar();return Gi(t.lessThan(1e-4),(()=>{s.assign(Qi(r,r,r))})).Else((()=>{let i=e.x;i=i.sub(ka(i)).mul(6).toVar();const n=Hi(ao(i)),a=i.sub($i(n)),o=r.mul(t.oneMinus()),u=r.mul(t.mul(a).oneMinus()),l=r.mul(t.mul(a.oneMinus()).oneMinus());Gi(n.equal(Hi(0)),(()=>{s.assign(Qi(r,l,o))})).ElseIf(n.equal(Hi(1)),(()=>{s.assign(Qi(u,r,o))})).ElseIf(n.equal(Hi(2)),(()=>{s.assign(Qi(o,r,l))})).ElseIf(n.equal(Hi(3)),(()=>{s.assign(Qi(o,u,r))})).ElseIf(n.equal(Hi(4)),(()=>{s.assign(Qi(l,o,r))})).Else((()=>{s.assign(Qi(r,o,u))}))})),s})).setLayout({name:"mx_hsvtorgb",type:"vec3",inputs:[{name:"hsv",type:"vec3"}]}),RT=Vi((([e])=>{const t=Qi(e).toVar(),r=$i(t.x).toVar(),s=$i(t.y).toVar(),i=$i(t.z).toVar(),n=$i(ho(r,ho(s,i))).toVar(),a=$i(po(r,po(s,i))).toVar(),o=$i(a.sub(n)).toVar(),u=$i().toVar(),l=$i().toVar(),d=$i().toVar();return d.assign(a),Gi(a.greaterThan(0),(()=>{l.assign(o.div(a))})).Else((()=>{l.assign(0)})),Gi(l.lessThanEqual(0),(()=>{u.assign(0)})).Else((()=>{Gi(r.greaterThanEqual(a),(()=>{u.assign(s.sub(i).div(o))})).ElseIf(s.greaterThanEqual(a),(()=>{u.assign(sa(2,i.sub(r).div(o)))})).Else((()=>{u.assign(sa(4,r.sub(s).div(o)))})),u.mulAssign(1/6),Gi(u.lessThan(0),(()=>{u.addAssign(1)}))})),Qi(u,l,d)})).setLayout({name:"mx_rgbtohsv",type:"vec3",inputs:[{name:"c",type:"vec3"}]}),CT=Vi((([e])=>{const t=Qi(e).toVar(),r=en(ca(t,Qi(.04045))).toVar(),s=Qi(t.div(12.92)).toVar(),i=Qi(To(po(t.add(Qi(.055)),Qi(0)).div(1.055),Qi(2.4))).toVar();return Ao(s,i,r)})).setLayout({name:"mx_srgb_texture_to_lin_rec709",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),MT=(e,t)=>{e=$i(e),t=$i(t);const r=qi(t.dFdx(),t.dFdy()).length().mul(.7071067811865476);return Po(e.sub(r),e.add(r),t)},PT=(e,t,r,s)=>Ao(e,t,r[s].clamp()),LT=(e,t,r,s,i)=>Ao(e,t,MT(r,s[i])),FT=Vi((([e,t,r])=>{const s=$a(e).toVar(),i=ia($i(.5).mul(t.sub(r)),Ml).div(s).toVar(),n=ia($i(-.5).mul(t.sub(r)),Ml).div(s).toVar(),a=Qi().toVar();a.x=s.x.greaterThan($i(0)).select(i.x,n.x),a.y=s.y.greaterThan($i(0)).select(i.y,n.y),a.z=s.z.greaterThan($i(0)).select(i.z,n.z);const o=ho(ho(a.x,a.y),a.z).toVar();return Ml.add(s.mul(o)).toVar().sub(r)})),BT=Vi((([e,t])=>{const r=e.x,s=e.y,i=e.z;let n=t.element(0).mul(.886227);return n=n.add(t.element(1).mul(1.023328).mul(s)),n=n.add(t.element(2).mul(1.023328).mul(i)),n=n.add(t.element(3).mul(1.023328).mul(r)),n=n.add(t.element(4).mul(.858086).mul(r).mul(s)),n=n.add(t.element(5).mul(.858086).mul(s).mul(i)),n=n.add(t.element(6).mul(i.mul(i).mul(.743125).sub(.247708))),n=n.add(t.element(7).mul(.858086).mul(r).mul(i)),n=n.add(t.element(8).mul(.429043).mul(na(r,r).sub(na(s,s)))),n}));var IT=Object.freeze({__proto__:null,BRDF_GGX:vp,BRDF_Lambert:op,BasicPointShadowFilter:Cb,BasicShadowFilter:fb,Break:zc,Const:Xo,Continue:()=>Mu("continue").append(),DFGApprox:Np,D_GGX:bp,Discard:Pu,EPSILON:Aa,F_Schlick:ap,Fn:Vi,INFINITY:Ra,If:Gi,Loop:kc,NodeAccess:Vs,NodeShaderStage:Bs,NodeType:Ds,NodeUpdateType:Is,PCFShadowFilter:yb,PCFSoftShadowFilter:xb,PI:Ca,PI2:Ma,PointShadowFilter:Mb,Return:()=>Mu("return").append(),Schlick_to_F0:Ep,ScriptableNodeResources:_x,ShaderNode:Mi,TBNViewMatrix:Nd,VSMShadowFilter:bb,V_GGX_SmithCorrelated:yp,Var:qo,abs:Qa,acesFilmicToneMapping:ox,acos:Ka,add:sa,addMethodChaining:ii,addNodeElement:function(e){console.warn("THREE.TSL: AddNodeElement has been removed in favor of tree-shaking. Trying add",e)},agxToneMapping:cx,all:Pa,alphaT:In,and:ga,anisotropy:Dn,anisotropyB:Un,anisotropyT:Vn,any:La,append:ki,array:hn,arrayBuffer:e=>Pi(new ei(e,"ArrayBuffer")),asin:Xa,assign:Jn,atan:Ya,atan2:Do,atomicAdd:(e,t)=>Hx(zx.ATOMIC_ADD,e,t),atomicAnd:(e,t)=>Hx(zx.ATOMIC_AND,e,t),atomicFunc:Hx,atomicLoad:e=>Hx(zx.ATOMIC_LOAD,e,null),atomicMax:(e,t)=>Hx(zx.ATOMIC_MAX,e,t),atomicMin:(e,t)=>Hx(zx.ATOMIC_MIN,e,t),atomicOr:(e,t)=>Hx(zx.ATOMIC_OR,e,t),atomicStore:(e,t)=>Hx(zx.ATOMIC_STORE,e,t),atomicSub:(e,t)=>Hx(zx.ATOMIC_SUB,e,t),atomicXor:(e,t)=>Hx(zx.ATOMIC_XOR,e,t),attenuationColor:Yn,attenuationDistance:Kn,attribute:Vu,attributeArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=ws("float")):(r=As(t),s=ws(t));const i=new xy(e,r,s);return Dc(i,t,e)},backgroundBlurriness:Ey,backgroundIntensity:wy,backgroundRotation:Ay,batch:Lc,billboarding:Of,bitAnd:xa,bitNot:ba,bitOr:Ta,bitXor:_a,bitangentGeometry:yd,bitangentLocal:xd,bitangentView:bd,bitangentWorld:Td,bitcast:lo,blendBurn:Oy,blendColor:$y,blendDodge:Gy,blendOverlay:zy,blendScreen:ky,blur:Sg,bool:ji,buffer:qu,bufferAttribute:fu,bumpMap:Ld,burn:(...e)=>(console.warn('THREE.TSL: "burn" has been renamed. Use "blendBurn" instead.'),Oy(e)),bvec2:Yi,bvec3:en,bvec4:nn,bypass:Eu,cache:Nu,call:ta,cameraFar:Ju,cameraIndex:Qu,cameraNear:Zu,cameraNormalMatrix:il,cameraPosition:nl,cameraProjectionMatrix:el,cameraProjectionMatrixInverse:tl,cameraViewMatrix:rl,cameraWorldMatrix:sl,cbrt:Eo,cdl:Ky,ceil:za,checker:kb,cineonToneMapping:nx,clamp:Ro,clearcoat:Rn,clearcoatRoughness:Cn,code:gx,color:zi,colorSpaceToWorking:ou,colorToDirection:e=>Pi(e).mul(2).sub(1),compute:_u,computeSkinning:(e,t=null)=>{const r=new Uc(e);return r.positionNode=Dc(new M(e.geometry.getAttribute("position").array,3),"vec3").setPBO(!0).toReadOnly().element(vc).toVar(),r.skinIndexNode=Dc(new M(new Uint32Array(e.geometry.getAttribute("skinIndex").array),4),"uvec4").setPBO(!0).toReadOnly().element(vc).toVar(),r.skinWeightNode=Dc(new M(e.geometry.getAttribute("skinWeight").array,4),"vec4").setPBO(!0).toReadOnly().element(vc).toVar(),r.bindMatrixNode=Tn(e.bindMatrix,"mat4"),r.bindMatrixInverseNode=Tn(e.bindMatrixInverse,"mat4"),r.boneMatricesNode=qu(e.skeleton.boneMatrices,"mat4",e.skeleton.bones.length),r.toPositionNode=t,Pi(r)},cond:ko,context:$o,convert:dn,convertColorSpace:(e,t,r)=>Pi(new su(Pi(e),t,r)),convertToTexture:(e,...t)=>e.isTextureNode?e:e.isPassNode?e.getTextureNode():py(e,...t),cos:ja,cross:bo,cubeTexture:sd,cubeToUV:Rb,dFdx:ro,dFdy:so,dashSize:$n,debug:Iu,defaultBuildStages:Os,defaultShaderStages:Us,defined:Ri,degrees:Ba,deltaTime:If,densityFog:function(e,t){return console.warn('THREE.TSL: "densityFog( color, density )" is deprecated. Use "fog( color, densityFogFactor( density ) )" instead.'),Ax(e,wx(t))},densityFogFactor:wx,depth:Eh,depthPass:(e,t,r)=>Pi(new tx(tx.DEPTH,e,t,r)),difference:yo,diffuseColor:Sn,directPointLight:Ob,directionToColor:$h,dispersion:Qn,distance:fo,div:aa,dodge:(...e)=>(console.warn('THREE.TSL: "dodge" has been renamed. Use "blendDodge" instead.'),Gy(e)),dot:xo,drawIndex:wc,dynamicBufferAttribute:yu,element:ln,emissive:En,equal:ua,equals:co,equirectUV:qh,exp:Ia,exp2:Da,expression:Mu,faceDirection:Dl,faceForward:Lo,faceforward:Vo,float:$i,floor:ka,fog:Ax,fract:Ha,frameGroup:fn,frameId:Df,frontFacing:Il,fwidth:oo,gain:(e,t)=>e.lessThan(.5)?Af(e.mul(2),t).div(2):ia(1,Af(na(ia(1,e),2),t).div(2)),gapSize:Hn,getConstNodeType:Ci,getCurrentStack:Oi,getDirection:Tg,getDistanceAttenuation:Ub,getGeometryRoughness:mp,getNormalFromDepth:fy,getParallaxCorrectNormal:FT,getRoughness:fp,getScreenPosition:my,getShIrradianceAt:BT,getTextureIndex:Nf,getViewPosition:gy,globalId:Dx,glsl:(e,t)=>gx(e,t,"glsl"),glslFn:(e,t)=>fx(e,t,"glsl"),grayscale:Hy,greaterThan:ca,greaterThanEqual:pa,hash:wf,highpModelNormalViewMatrix:wl,highpModelViewMatrix:El,hue:qy,instance:Rc,instanceIndex:vc,instancedArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=ws("float")):(r=As(t),s=ws(t));const i=new yy(e,r,s);return Dc(i,t,e)},instancedBufferAttribute:xu,instancedDynamicBufferAttribute:bu,instancedMesh:Mc,int:Hi,inverseSqrt:Ga,inversesqrt:Uo,invocationLocalIndex:Ec,invocationSubgroupIndex:Sc,ior:jn,iridescence:Ln,iridescenceIOR:Fn,iridescenceThickness:Bn,ivec2:Xi,ivec3:Zi,ivec4:rn,js:(e,t)=>gx(e,t,"js"),label:Ho,length:Ja,lengthSq:wo,lessThan:da,lessThanEqual:ha,lightPosition:Kx,lightProjectionUV:Xx,lightShadowMatrix:qx,lightTargetDirection:Zx,lightTargetPosition:Yx,lightViewPosition:Qx,lightingContext:Qc,lights:(e=[])=>Pi(new tb).setLights(e),linearDepth:wh,linearToneMapping:sx,localId:Vx,log:Va,log2:Ua,logarithmicDepthToViewZ:(e,t,r)=>{const s=e.mul(Va(r.div(t)));return $i(Math.E).pow(s).mul(t).negate()},loop:(...e)=>(console.warn("THREE.TSL: loop() has been renamed to Loop()."),kc(...e)),luminance:Xy,mat2:an,mat3:on,mat4:un,matcapUV:hm,materialAO:yc,materialAlphaTest:Id,materialAnisotropy:ec,materialAnisotropyVector:xc,materialAttenuationColor:uc,materialAttenuationDistance:oc,materialClearcoat:Xd,materialClearcoatNormal:Yd,materialClearcoatRoughness:Kd,materialColor:Dd,materialDispersion:mc,materialEmissive:Ud,materialEnvIntensity:Yl,materialEnvRotation:Ql,materialIOR:ac,materialIridescence:tc,materialIridescenceIOR:rc,materialIridescenceThickness:sc,materialLightMap:fc,materialLineDashOffset:pc,materialLineDashSize:dc,materialLineGapSize:cc,materialLineScale:lc,materialLineWidth:hc,materialMetalness:jd,materialNormal:qd,materialOpacity:Od,materialPointSize:gc,materialReference:ld,materialReflectivity:Hd,materialRefractionRatio:Kl,materialRotation:Qd,materialRoughness:Wd,materialSheen:Zd,materialSheenRoughness:Jd,materialShininess:Vd,materialSpecular:Gd,materialSpecularColor:zd,materialSpecularIntensity:kd,materialSpecularStrength:$d,materialThickness:nc,materialTransmission:ic,max:po,maxMipLevel:zu,mediumpModelViewMatrix:Sl,metalness:An,min:ho,mix:Ao,mixElement:Bo,mod:oa,modInt:Ea,modelDirection:ml,modelNormalMatrix:_l,modelPosition:yl,modelRadius:Tl,modelScale:xl,modelViewMatrix:Nl,modelViewPosition:bl,modelViewProjection:bc,modelWorldMatrix:fl,modelWorldMatrixInverse:vl,morphReference:qc,mrt:Ef,mul:na,mx_aastep:MT,mx_cell_noise_float:(e=Uu())=>gT(e.convert("vec2|vec3")),mx_contrast:(e,t=1,r=.5)=>$i(e).sub(r).mul(t).add(r),mx_fractal_noise_float:(e=Uu(),t=3,r=2,s=.5,i=1)=>fT(e,Hi(t),r,s).mul(i),mx_fractal_noise_vec2:(e=Uu(),t=3,r=2,s=.5,i=1)=>xT(e,Hi(t),r,s).mul(i),mx_fractal_noise_vec3:(e=Uu(),t=3,r=2,s=.5,i=1)=>yT(e,Hi(t),r,s).mul(i),mx_fractal_noise_vec4:(e=Uu(),t=3,r=2,s=.5,i=1)=>bT(e,Hi(t),r,s).mul(i),mx_hsvtorgb:AT,mx_noise_float:(e=Uu(),t=1,r=0)=>hT(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec3:(e=Uu(),t=1,r=0)=>pT(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec4:(e=Uu(),t=1,r=0)=>{e=e.convert("vec2|vec3");return tn(pT(e),hT(e.add(qi(19,73)))).mul(t).add(r)},mx_ramplr:(e,t,r=Uu())=>PT(e,t,r,"x"),mx_ramptb:(e,t,r=Uu())=>PT(e,t,r,"y"),mx_rgbtohsv:RT,mx_safepower:(e,t=1)=>(e=$i(e)).abs().pow(t).mul(e.sign()),mx_splitlr:(e,t,r,s=Uu())=>LT(e,t,r,s,"x"),mx_splittb:(e,t,r,s=Uu())=>LT(e,t,r,s,"y"),mx_srgb_texture_to_lin_rec709:CT,mx_transform_uv:(e=1,t=0,r=Uu())=>r.mul(e).add(t),mx_worley_noise_float:(e=Uu(),t=1)=>ST(e.convert("vec2|vec3"),t,Hi(1)),mx_worley_noise_vec2:(e=Uu(),t=1)=>ET(e.convert("vec2|vec3"),t,Hi(1)),mx_worley_noise_vec3:(e=Uu(),t=1)=>wT(e.convert("vec2|vec3"),t,Hi(1)),negate:eo,neutralToneMapping:hx,nodeArray:Fi,nodeImmutable:Ii,nodeObject:Pi,nodeObjects:Li,nodeProxy:Bi,normalFlat:Ol,normalGeometry:Vl,normalLocal:Ul,normalMap:Rd,normalView:Gl,normalWorld:kl,normalize:$a,not:fa,notEqual:la,numWorkgroups:Bx,objectDirection:ul,objectGroup:xn,objectPosition:dl,objectRadius:pl,objectScale:cl,objectViewPosition:hl,objectWorldMatrix:ll,oneMinus:to,or:ma,orthographicDepthToViewZ:(e,t,r)=>t.sub(r).mul(e).sub(t),oscSawtooth:(e=Bf)=>e.fract(),oscSine:(e=Bf)=>e.add(.75).mul(2*Math.PI).sin().mul(.5).add(.5),oscSquare:(e=Bf)=>e.fract().round(),oscTriangle:(e=Bf)=>e.add(.5).fract().mul(2).sub(1).abs(),output:zn,outputStruct:vf,overlay:(...e)=>(console.warn('THREE.TSL: "overlay" has been renamed. Use "blendOverlay" instead.'),zy(e)),overloadingFn:Ff,parabola:Af,parallaxDirection:Sd,parallaxUV:(e,t)=>e.sub(Sd.mul(t)),parameter:(e,t)=>Pi(new ff(e,t)),pass:(e,t,r)=>Pi(new tx(tx.COLOR,e,t,r)),passTexture:(e,t)=>Pi(new Jy(e,t)),pcurve:(e,t,r)=>To(aa(To(e,t),sa(To(e,t),To(ia(1,e),r))),1/t),perspectiveDepthToViewZ:vh,pmremTexture:Yg,pointShadow:Db,pointUV:_y,pointWidth:Wn,positionGeometry:Al,positionLocal:Rl,positionPrevious:Cl,positionView:Ll,positionViewDirection:Fl,positionWorld:Ml,positionWorldDirection:Pl,posterize:Qy,pow:To,pow2:_o,pow3:vo,pow4:No,property:vn,radians:Fa,rand:Fo,range:Px,rangeFog:function(e,t,r){return console.warn('THREE.TSL: "rangeFog( color, near, far )" is deprecated. Use "fog( color, rangeFogFactor( near, far ) )" instead.'),Ax(e,Ex(t,r))},rangeFogFactor:Ex,reciprocal:no,reference:ad,referenceBuffer:od,reflect:mo,reflectVector:ed,reflectView:Zl,reflector:e=>Pi(new ny(e)),refract:Mo,refractVector:td,refractView:Jl,reinhardToneMapping:ix,remainder:Sa,remap:Au,remapClamp:Ru,renderGroup:yn,renderOutput:Fu,rendererReference:cu,rotate:fm,rotateUV:Vf,roughness:wn,round:io,rtt:py,sRGBTransferEOTF:Jo,sRGBTransferOETF:eu,sampler:e=>(!0===e.isNode?e:Hu(e)).convert("sampler"),samplerComparison:e=>(!0===e.isNode?e:Hu(e)).convert("samplerComparison"),saturate:Co,saturation:Wy,screen:(...e)=>(console.warn('THREE.TSL: "screen" has been renamed. Use "blendScreen" instead.'),ky(e)),screenCoordinate:ih,screenSize:sh,screenUV:rh,scriptable:Nx,scriptableValue:xx,select:Go,setCurrentStack:Ui,shaderStages:Gs,shadow:wb,shadowPositionWorld:sb,shapeCircle:zb,sharedUniformGroup:mn,sheen:Mn,sheenRoughness:Pn,shiftLeft:va,shiftRight:Na,shininess:kn,sign:Za,sin:Wa,sinc:(e,t)=>Wa(Ca.mul(t.mul(e).sub(1))).div(Ca.mul(t.mul(e).sub(1))),skinning:Oc,smoothstep:Po,smoothstepElement:Io,specularColor:On,specularF90:Gn,spherizeUV:Uf,split:(e,t)=>Pi(new Ks(Pi(e),t)),spritesheetUV:zf,sqrt:Oa,stack:xf,step:go,storage:Dc,storageBarrier:()=>Ox("storage").append(),storageObject:(e,t,r)=>(console.warn('THREE.TSL: "storageObject()" is deprecated. Use "storage().setPBO( true )" instead.'),Dc(e,t,r).setPBO(!0)),storageTexture:Cy,string:(e="")=>Pi(new ei(e,"string")),struct:(e,t=null)=>{const r=new bf(e,t),s=(...t)=>{let s=null;if(t.length>0)if(t[0].isNode){s={};const r=Object.keys(e);for(let e=0;eOx("texture").append(),textureBicubic:Hp,textureCubeUV:_g,textureLoad:Wu,textureSize:Gu,textureStore:(e,t,r)=>{const s=Cy(e,t,r);return null!==r&&s.append(),s},thickness:Xn,time:Bf,timerDelta:(e=1)=>(console.warn('TSL: timerDelta() is deprecated. Use "deltaTime" instead.'),If.mul(e)),timerGlobal:(e=1)=>(console.warn('TSL: timerGlobal() is deprecated. Use "time" instead.'),Bf.mul(e)),timerLocal:(e=1)=>(console.warn('TSL: timerLocal() is deprecated. Use "time" instead.'),Bf.mul(e)),toOutputColorSpace:iu,toWorkingColorSpace:nu,toneMapping:pu,toneMappingExposure:gu,toonOutlinePass:(t,r,s=new e(0,0,0),i=.003,n=1)=>Pi(new rx(t,r,Pi(s),Pi(i),Pi(n))),transformDirection:So,transformNormal:Wl,transformNormalToView:jl,transformedBentNormalView:Ed,transformedBitangentView:_d,transformedBitangentWorld:vd,transformedClearcoatNormalView:Hl,transformedNormalView:zl,transformedNormalWorld:$l,transformedTangentView:gd,transformedTangentWorld:md,transmission:qn,transpose:uo,triNoise3D:Mf,triplanarTexture:(...e)=>Hf(...e),triplanarTextures:Hf,trunc:ao,tslFn:(...e)=>(console.warn("THREE.TSL: tslFn() has been renamed to Fn()."),Vi(...e)),uint:Wi,uniform:Tn,uniformArray:Yu,uniformGroup:gn,uniforms:(e,t)=>(console.warn("THREE.TSL: uniforms() has been renamed to uniformArray()."),Pi(new Ku(e,t))),userData:(e,t,r)=>Pi(new Fy(e,t,r)),uv:Uu,uvec2:Ki,uvec3:Ji,uvec4:sn,varying:Qo,varyingProperty:Nn,vec2:qi,vec3:Qi,vec4:tn,vectorComponents:ks,velocity:Uy,vertexColor:e=>Pi(new by(e)),vertexIndex:_c,vertexStage:Zo,vibrance:jy,viewZToLogarithmicDepth:Nh,viewZToOrthographicDepth:Th,viewZToPerspectiveDepth:_h,viewport:nh,viewportBottomLeft:ch,viewportCoordinate:oh,viewportDepthTexture:xh,viewportLinearDepth:Ah,viewportMipTexture:mh,viewportResolution:lh,viewportSafeUV:Gf,viewportSharedTexture:Gh,viewportSize:ah,viewportTexture:gh,viewportTopLeft:dh,viewportUV:uh,wgsl:(e,t)=>gx(e,t,"wgsl"),wgslFn:(e,t)=>fx(e,t,"wgsl"),workgroupArray:(e,t)=>Pi(new kx("Workgroup",e,t)),workgroupBarrier:()=>Ox("workgroup").append(),workgroupId:Ix,workingToColorSpace:au,xor:ya});const DT=new mf;class VT extends Im{constructor(e,t){super(),this.renderer=e,this.nodes=t}update(e,t,r){const s=this.renderer,i=this.nodes.getBackgroundNode(e)||e.background;let n=!1;if(null===i)s._clearColor.getRGB(DT),DT.a=s._clearColor.a;else if(!0===i.isColor)i.getRGB(DT),DT.a=1,n=!0;else if(!0===i.isNode){const r=this.get(e),n=i;DT.copy(s._clearColor);let a=r.backgroundMesh;if(void 0===a){const e=$o(tn(n).mul(wy),{getUV:()=>Ay.mul(kl),getTextureLevel:()=>Ey});let t=bc;t=t.setZ(t.w);const s=new Fh;s.name="Background.material",s.side=N,s.depthTest=!1,s.depthWrite=!1,s.allowOverride=!1,s.fog=!1,s.lights=!1,s.vertexNode=t,s.colorNode=e,r.backgroundMeshNode=e,r.backgroundMesh=a=new W(new Oe(1,32,32),s),a.frustumCulled=!1,a.name="Background.mesh",a.onBeforeRender=function(e,t,r){this.matrixWorld.copyPosition(r.matrixWorld)}}const o=n.getCacheKey();r.backgroundCacheKey!==o&&(r.backgroundMeshNode.node=tn(n).mul(wy),r.backgroundMeshNode.needsUpdate=!0,a.material.needsUpdate=!0,r.backgroundCacheKey=o),t.unshift(a,a.geometry,a.material,0,0,null,null)}else console.error("THREE.Renderer: Unsupported background configuration.",i);const a=s.xr.getEnvironmentBlendMode();if("additive"===a?DT.set(0,0,0,1):"alpha-blend"===a&&DT.set(0,0,0,0),!0===s.autoClear||!0===n){const e=r.clearColorValue;e.r=DT.r,e.g=DT.g,e.b=DT.b,e.a=DT.a,!0!==s.backend.isWebGLBackend&&!0!==s.alpha||(e.r*=e.a,e.g*=e.a,e.b*=e.a),r.depthClearValue=s._clearDepth,r.stencilClearValue=s._clearStencil,r.clearColor=!0===s.autoClearColor,r.clearDepth=!0===s.autoClearDepth,r.clearStencil=!0===s.autoClearStencil}else r.clearColor=!1,r.clearDepth=!1,r.clearStencil=!1}}let UT=0;class OT{constructor(e="",t=[],r=0,s=[]){this.name=e,this.bindings=t,this.index=r,this.bindingsReference=s,this.id=UT++}}class GT{constructor(e,t,r,s,i,n,a,o,u,l=[]){this.vertexShader=e,this.fragmentShader=t,this.computeShader=r,this.transforms=l,this.nodeAttributes=s,this.bindings=i,this.updateNodes=n,this.updateBeforeNodes=a,this.updateAfterNodes=o,this.observer=u,this.usedTimes=0}createBindings(){const e=[];for(const t of this.bindings){if(!0!==t.bindings[0].groupNode.shared){const r=new OT(t.name,[],t.index,t);e.push(r);for(const e of t.bindings)r.bindings.push(e.clone())}else e.push(t)}return e}}class kT{constructor(e,t,r=null){this.isNodeAttribute=!0,this.name=e,this.type=t,this.node=r}}class zT{constructor(e,t,r){this.isNodeUniform=!0,this.name=e,this.type=t,this.node=r.getSelf()}get value(){return this.node.value}set value(e){this.node.value=e}get id(){return this.node.id}get groupNode(){return this.node.groupNode}}class $T{constructor(e,t,r=!1,s=null){this.isNodeVar=!0,this.name=e,this.type=t,this.readOnly=r,this.count=s}}class HT extends $T{constructor(e,t){super(e,t),this.needsInterpolation=!1,this.isNodeVarying=!0}}class WT{constructor(e,t,r=""){this.name=e,this.type=t,this.code=r,Object.defineProperty(this,"isNodeCode",{value:!0})}}let jT=0;class qT{constructor(e=null){this.id=jT++,this.nodesData=new WeakMap,this.parent=e}getData(e){let t=this.nodesData.get(e);return void 0===t&&null!==this.parent&&(t=this.parent.getData(e)),t}setData(e,t){this.nodesData.set(e,t)}}class XT{constructor(e,t){this.name=e,this.members=t,this.output=!1}}class KT{constructor(e,t){this.name=e,this.value=t,this.boundary=0,this.itemSize=0,this.offset=0}setValue(e){this.value=e}getValue(){return this.value}}class YT extends KT{constructor(e,t=0){super(e,t),this.isNumberUniform=!0,this.boundary=4,this.itemSize=1}}class QT extends KT{constructor(e,r=new t){super(e,r),this.isVector2Uniform=!0,this.boundary=8,this.itemSize=2}}class ZT extends KT{constructor(e,t=new r){super(e,t),this.isVector3Uniform=!0,this.boundary=16,this.itemSize=3}}class JT extends KT{constructor(e,t=new s){super(e,t),this.isVector4Uniform=!0,this.boundary=16,this.itemSize=4}}class e_ extends KT{constructor(t,r=new e){super(t,r),this.isColorUniform=!0,this.boundary=16,this.itemSize=3}}class t_ extends KT{constructor(e,t=new i){super(e,t),this.isMatrix2Uniform=!0,this.boundary=16,this.itemSize=4}}class r_ extends KT{constructor(e,t=new n){super(e,t),this.isMatrix3Uniform=!0,this.boundary=48,this.itemSize=12}}class s_ extends KT{constructor(e,t=new a){super(e,t),this.isMatrix4Uniform=!0,this.boundary=64,this.itemSize=16}}class i_ extends YT{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class n_ extends QT{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class a_ extends ZT{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class o_ extends JT{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class u_ extends e_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class l_ extends t_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class d_ extends r_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class c_ extends s_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}const h_=new WeakMap,p_=new Map([[Int8Array,"int"],[Int16Array,"int"],[Int32Array,"int"],[Uint8Array,"uint"],[Uint16Array,"uint"],[Uint32Array,"uint"],[Float32Array,"float"]]),g_=e=>/e/g.test(e)?String(e).replace(/\+/g,""):(e=Number(e))+(e%1?"":".0");class m_{constructor(e,t,r){this.object=e,this.material=e&&e.material||null,this.geometry=e&&e.geometry||null,this.renderer=t,this.parser=r,this.scene=null,this.camera=null,this.nodes=[],this.sequentialNodes=[],this.updateNodes=[],this.updateBeforeNodes=[],this.updateAfterNodes=[],this.hashNodes={},this.observer=null,this.lightsNode=null,this.environmentNode=null,this.fogNode=null,this.clippingContext=null,this.vertexShader=null,this.fragmentShader=null,this.computeShader=null,this.flowNodes={vertex:[],fragment:[],compute:[]},this.flowCode={vertex:"",fragment:"",compute:""},this.uniforms={vertex:[],fragment:[],compute:[],index:0},this.structs={vertex:[],fragment:[],compute:[],index:0},this.bindings={vertex:{},fragment:{},compute:{}},this.bindingsIndexes={},this.bindGroups=null,this.attributes=[],this.bufferAttributes=[],this.varyings=[],this.codes={},this.vars={},this.declarations={},this.flow={code:""},this.chaining=[],this.stack=xf(),this.stacks=[],this.tab="\t",this.currentFunctionNode=null,this.context={material:this.material},this.cache=new qT,this.globalCache=this.cache,this.flowsData=new WeakMap,this.shaderStage=null,this.buildStage=null}getBindGroupsCache(){let e=h_.get(this.renderer);return void 0===e&&(e=new Mm,h_.set(this.renderer,e)),e}createRenderTarget(e,t,r){return new ae(e,t,r)}createCubeRenderTarget(e,t){return new Xh(e,t)}includes(e){return this.nodes.includes(e)}getOutputStructName(){}_getBindGroup(e,t){const r=this.getBindGroupsCache(),s=[];let i,n=!0;for(const e of t)s.push(e),n=n&&!0!==e.groupNode.shared;return n?(i=r.get(s),void 0===i&&(i=new OT(e,s,this.bindingsIndexes[e].group,s),r.set(s,i))):i=new OT(e,s,this.bindingsIndexes[e].group,s),i}getBindGroupArray(e,t){const r=this.bindings[t];let s=r[e];return void 0===s&&(void 0===this.bindingsIndexes[e]&&(this.bindingsIndexes[e]={binding:0,group:Object.keys(this.bindingsIndexes).length}),r[e]=s=[]),s}getBindings(){let e=this.bindGroups;if(null===e){const t={},r=this.bindings;for(const e of Gs)for(const s in r[e]){const i=r[e][s];(t[s]||(t[s]=[])).push(...i)}e=[];for(const r in t){const s=t[r],i=this._getBindGroup(r,s);e.push(i)}this.bindGroups=e}return e}sortBindingGroups(){const e=this.getBindings();e.sort(((e,t)=>e.bindings[0].groupNode.order-t.bindings[0].groupNode.order));for(let t=0;t=0?`${Math.round(n)}u`:"0u";if("bool"===i)return n?"true":"false";if("color"===i)return`${this.getType("vec3")}( ${g_(n.r)}, ${g_(n.g)}, ${g_(n.b)} )`;const a=this.getTypeLength(i),o=this.getComponentType(i),u=e=>this.generateConst(o,e);if(2===a)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)} )`;if(3===a)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)} )`;if(4===a&&"mat2"!==i)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)}, ${u(n.w)} )`;if(a>=4&&n&&(n.isMatrix2||n.isMatrix3||n.isMatrix4))return`${this.getType(i)}( ${n.elements.map(u).join(", ")} )`;if(a>4)return`${this.getType(i)}()`;throw new Error(`NodeBuilder: Type '${i}' not found in generate constant attempt.`)}getType(e){return"color"===e?"vec3":e}hasGeometryAttribute(e){return this.geometry&&void 0!==this.geometry.getAttribute(e)}getAttribute(e,t){const r=this.attributes;for(const t of r)if(t.name===e)return t;const s=new kT(e,t);return this.registerDeclaration(s),r.push(s),s}getPropertyName(e){return e.name}isVector(e){return/vec\d/.test(e)}isMatrix(e){return/mat\d/.test(e)}isReference(e){return"void"===e||"property"===e||"sampler"===e||"samplerComparison"===e||"texture"===e||"cubeTexture"===e||"storageTexture"===e||"depthTexture"===e||"texture3D"===e}needsToWorkingColorSpace(){return!1}getComponentTypeFromTexture(e){const t=e.type;if(e.isDataTexture){if(t===T)return"int";if(t===b)return"uint"}return"float"}getElementType(e){return"mat2"===e?"vec2":"mat3"===e?"vec3":"mat4"===e?"vec4":this.getComponentType(e)}getComponentType(e){if("float"===(e=this.getVectorType(e))||"bool"===e||"int"===e||"uint"===e)return e;const t=/(b|i|u|)(vec|mat)([2-4])/.exec(e);return null===t?null:"b"===t[1]?"bool":"i"===t[1]?"int":"u"===t[1]?"uint":"float"}getVectorType(e){return"color"===e?"vec3":"texture"===e||"cubeTexture"===e||"storageTexture"===e||"texture3D"===e?"vec4":e}getTypeFromLength(e,t="float"){if(1===e)return t;let r=Es(e);const s="float"===t?"":t[0];return!0===/mat2/.test(t)&&(r=r.replace("vec","mat")),s+r}getTypeFromArray(e){return p_.get(e.constructor)}isInteger(e){return/int|uint|(i|u)vec/.test(e)}getTypeFromAttribute(e){let t=e;e.isInterleavedBufferAttribute&&(t=e.data);const r=t.array,s=e.itemSize,i=e.normalized;let n;return e instanceof ze||!0===i||(n=this.getTypeFromArray(r)),this.getTypeFromLength(s,n)}getTypeLength(e){const t=this.getVectorType(e),r=/vec([2-4])/.exec(t);return null!==r?Number(r[1]):"float"===t||"bool"===t||"int"===t||"uint"===t?1:!0===/mat2/.test(e)?4:!0===/mat3/.test(e)?9:!0===/mat4/.test(e)?16:0}getVectorFromMatrix(e){return e.replace("mat","vec")}changeComponentType(e,t){return this.getTypeFromLength(this.getTypeLength(e),t)}getIntegerType(e){const t=this.getComponentType(e);return"int"===t||"uint"===t?e:this.changeComponentType(e,"int")}addStack(){return this.stack=xf(this.stack),this.stacks.push(Oi()||this.stack),Ui(this.stack),this.stack}removeStack(){const e=this.stack;return this.stack=e.parent,Ui(this.stacks.pop()),e}getDataFromNode(e,t=this.shaderStage,r=null){let s=(r=null===r?e.isGlobal(this)?this.globalCache:this.cache:r).getData(e);return void 0===s&&(s={},r.setData(e,s)),void 0===s[t]&&(s[t]={}),s[t]}getNodeProperties(e,t="any"){const r=this.getDataFromNode(e,t);return r.properties||(r.properties={outputNode:null})}getBufferAttributeFromNode(e,t){const r=this.getDataFromNode(e);let s=r.bufferAttribute;if(void 0===s){const i=this.uniforms.index++;s=new kT("nodeAttribute"+i,t,e),this.bufferAttributes.push(s),r.bufferAttribute=s}return s}getStructTypeFromNode(e,t,r=null,s=this.shaderStage){const i=this.getDataFromNode(e,s,this.globalCache);let n=i.structType;if(void 0===n){const e=this.structs.index++;null===r&&(r="StructType"+e),n=new XT(r,t),this.structs[s].push(n),i.structType=n}return n}getOutputStructTypeFromNode(e,t){const r=this.getStructTypeFromNode(e,t,"OutputType","fragment");return r.output=!0,r}getUniformFromNode(e,t,r=this.shaderStage,s=null){const i=this.getDataFromNode(e,r,this.globalCache);let n=i.uniform;if(void 0===n){const a=this.uniforms.index++;n=new zT(s||"nodeUniform"+a,t,e),this.uniforms[r].push(n),this.registerDeclaration(n),i.uniform=n}return n}getArrayCount(e){let t=null;return e.isArrayNode?t=e.count:e.isVarNode&&e.node.isArrayNode&&(t=e.node.count),t}getVarFromNode(e,t=null,r=e.getNodeType(this),s=this.shaderStage,i=!1){const n=this.getDataFromNode(e,s);let a=n.variable;if(void 0===a){const o=i?"_const":"_var",u=this.vars[s]||(this.vars[s]=[]),l=this.vars[o]||(this.vars[o]=0);null===t&&(t=(i?"nodeConst":"nodeVar")+l,this.vars[o]++);const d=this.getArrayCount(e);a=new $T(t,r,i,d),i||u.push(a),this.registerDeclaration(a),n.variable=a}return a}isDeterministic(e){if(e.isMathNode)return this.isDeterministic(e.aNode)&&(!e.bNode||this.isDeterministic(e.bNode))&&(!e.cNode||this.isDeterministic(e.cNode));if(e.isOperatorNode)return this.isDeterministic(e.aNode)&&(!e.bNode||this.isDeterministic(e.bNode));if(e.isArrayNode){if(null!==e.values)for(const t of e.values)if(!this.isDeterministic(t))return!1;return!0}return!!e.isConstNode}getVaryingFromNode(e,t=null,r=e.getNodeType(this)){const s=this.getDataFromNode(e,"any");let i=s.varying;if(void 0===i){const e=this.varyings,n=e.length;null===t&&(t="nodeVarying"+n),i=new HT(t,r),e.push(i),this.registerDeclaration(i),s.varying=i}return i}registerDeclaration(e){const t=this.shaderStage,r=this.declarations[t]||(this.declarations[t]={}),s=this.getPropertyName(e);let i=1,n=s;for(;void 0!==r[n];)n=s+"_"+i++;r[n]=e,i>1&&(e.name=n,console.warn(`THREE.TSL: Declaration name '${s}' of '${e.type}' already in use. Renamed to '${n}'.`))}getCodeFromNode(e,t,r=this.shaderStage){const s=this.getDataFromNode(e);let i=s.code;if(void 0===i){const e=this.codes[r]||(this.codes[r]=[]),n=e.length;i=new WT("nodeCode"+n,t),e.push(i),s.code=i}return i}addFlowCodeHierarchy(e,t){const{flowCodes:r,flowCodeBlock:s}=this.getDataFromNode(e);let i=!0,n=t;for(;n;){if(!0===s.get(n)){i=!1;break}n=this.getDataFromNode(n).parentNodeBlock}if(i)for(const e of r)this.addLineFlowCode(e)}addLineFlowCodeBlock(e,t,r){const s=this.getDataFromNode(e),i=s.flowCodes||(s.flowCodes=[]),n=s.flowCodeBlock||(s.flowCodeBlock=new WeakMap);i.push(t),n.set(r,!0)}addLineFlowCode(e,t=null){return""===e||(null!==t&&this.context.nodeBlock&&this.addLineFlowCodeBlock(t,e,this.context.nodeBlock),e=this.tab+e,/;\s*$/.test(e)||(e+=";\n"),this.flow.code+=e),this}addFlowCode(e){return this.flow.code+=e,this}addFlowTab(){return this.tab+="\t",this}removeFlowTab(){return this.tab=this.tab.slice(0,-1),this}getFlowData(e){return this.flowsData.get(e)}flowNode(e){const t=e.getNodeType(this),r=this.flowChildNode(e,t);return this.flowsData.set(e,r),r}addInclude(e){null!==this.currentFunctionNode&&this.currentFunctionNode.includes.push(e)}buildFunctionNode(e){const t=new mx,r=this.currentFunctionNode;return this.currentFunctionNode=t,t.code=this.buildFunctionCode(e),this.currentFunctionNode=r,t}flowShaderNode(e){const t=e.layout,r={[Symbol.iterator](){let e=0;const t=Object.values(this);return{next:()=>({value:t[e],done:e++>=t.length})}}};for(const e of t.inputs)r[e.name]=new ff(e.type,e.name);e.layout=null;const s=e.call(r),i=this.flowStagesNode(s,t.type);return e.layout=t,i}flowStagesNode(e,t=null){const r=this.flow,s=this.vars,i=this.declarations,n=this.cache,a=this.buildStage,o=this.stack,u={code:""};this.flow=u,this.vars={},this.declarations={},this.cache=new qT,this.stack=xf();for(const r of Os)this.setBuildStage(r),u.result=e.build(this,t);return u.vars=this.getVars(this.shaderStage),this.flow=r,this.vars=s,this.declarations=i,this.cache=n,this.stack=o,this.setBuildStage(a),u}getFunctionOperator(){return null}buildFunctionCode(){console.warn("Abstract function.")}flowChildNode(e,t=null){const r=this.flow,s={code:""};return this.flow=s,s.result=e.build(this,t),this.flow=r,s}flowNodeFromShaderStage(e,t,r=null,s=null){const i=this.shaderStage;this.setShaderStage(e);const n=this.flowChildNode(t,r);return null!==s&&(n.code+=`${this.tab+s} = ${n.result};\n`),this.flowCode[e]=this.flowCode[e]+n.code,this.setShaderStage(i),n}getAttributesArray(){return this.attributes.concat(this.bufferAttributes)}getAttributes(){console.warn("Abstract function.")}getVaryings(){console.warn("Abstract function.")}getVar(e,t,r=null){return`${null!==r?this.generateArrayDeclaration(e,r):this.getType(e)} ${t}`}getVars(e){let t="";const r=this.vars[e];if(void 0!==r)for(const e of r)t+=`${this.getVar(e.type,e.name)}; `;return t}getUniforms(){console.warn("Abstract function.")}getCodes(e){const t=this.codes[e];let r="";if(void 0!==t)for(const e of t)r+=e.code+"\n";return r}getHash(){return this.vertexShader+this.fragmentShader+this.computeShader}setShaderStage(e){this.shaderStage=e}getShaderStage(){return this.shaderStage}setBuildStage(e){this.buildStage=e}getBuildStage(){return this.buildStage}buildCode(){console.warn("Abstract function.")}build(){const{object:e,material:t,renderer:r}=this;if(null!==t){let e=r.library.fromMaterial(t);null===e&&(console.error(`NodeMaterial: Material "${t.type}" is not compatible.`),e=new Fh),e.build(this)}else this.addFlow("compute",e);for(const e of Os){this.setBuildStage(e),this.context.vertex&&this.context.vertex.isNode&&this.flowNodeFromShaderStage("vertex",this.context.vertex);for(const t of Gs){this.setShaderStage(t);const r=this.flowNodes[t];for(const t of r)"generate"===e?this.flowNode(t):t.build(this)}}return this.setBuildStage(null),this.setShaderStage(null),this.buildCode(),this.buildUpdateNodes(),this}getNodeUniform(e,t){if("float"===t||"int"===t||"uint"===t)return new i_(e);if("vec2"===t||"ivec2"===t||"uvec2"===t)return new n_(e);if("vec3"===t||"ivec3"===t||"uvec3"===t)return new a_(e);if("vec4"===t||"ivec4"===t||"uvec4"===t)return new o_(e);if("color"===t)return new u_(e);if("mat2"===t)return new l_(e);if("mat3"===t)return new d_(e);if("mat4"===t)return new c_(e);throw new Error(`Uniform "${t}" not declared.`)}format(e,t,r){if((t=this.getVectorType(t))===(r=this.getVectorType(r))||null===r||this.isReference(r))return e;const s=this.getTypeLength(t),i=this.getTypeLength(r);return 16===s&&9===i?`${this.getType(r)}( ${e}[ 0 ].xyz, ${e}[ 1 ].xyz, ${e}[ 2 ].xyz )`:9===s&&4===i?`${this.getType(r)}( ${e}[ 0 ].xy, ${e}[ 1 ].xy )`:s>4||i>4||0===i?e:s===i?`${this.getType(r)}( ${e} )`:s>i?this.format(`${e}.${"xyz".slice(0,i)}`,this.getTypeFromLength(i,this.getComponentType(t)),r):4===i&&s>1?`${this.getType(r)}( ${this.format(e,t,"vec3")}, 1.0 )`:2===s?`${this.getType(r)}( ${this.format(e,t,"vec2")}, 0.0 )`:(1===s&&i>1&&t!==this.getComponentType(r)&&(e=`${this.getType(this.getComponentType(r))}( ${e} )`),`${this.getType(r)}( ${e} )`)}getSignature(){return`// Three.js r${$e} - Node System\n`}createNodeMaterial(e="NodeMaterial"){throw new Error(`THREE.NodeBuilder: createNodeMaterial() was deprecated. Use new ${e}() instead.`)}}class f_{constructor(){this.time=0,this.deltaTime=0,this.frameId=0,this.renderId=0,this.updateMap=new WeakMap,this.updateBeforeMap=new WeakMap,this.updateAfterMap=new WeakMap,this.renderer=null,this.material=null,this.camera=null,this.object=null,this.scene=null}_getMaps(e,t){let r=e.get(t);return void 0===r&&(r={renderMap:new WeakMap,frameMap:new WeakMap},e.set(t,r)),r}updateBeforeNode(e){const t=e.getUpdateBeforeType(),r=e.updateReference(this);if(t===Is.FRAME){const{frameMap:t}=this._getMaps(this.updateBeforeMap,r);t.get(r)!==this.frameId&&!1!==e.updateBefore(this)&&t.set(r,this.frameId)}else if(t===Is.RENDER){const{renderMap:t}=this._getMaps(this.updateBeforeMap,r);t.get(r)!==this.renderId&&!1!==e.updateBefore(this)&&t.set(r,this.renderId)}else t===Is.OBJECT&&e.updateBefore(this)}updateAfterNode(e){const t=e.getUpdateAfterType(),r=e.updateReference(this);if(t===Is.FRAME){const{frameMap:t}=this._getMaps(this.updateAfterMap,r);t.get(r)!==this.frameId&&!1!==e.updateAfter(this)&&t.set(r,this.frameId)}else if(t===Is.RENDER){const{renderMap:t}=this._getMaps(this.updateAfterMap,r);t.get(r)!==this.renderId&&!1!==e.updateAfter(this)&&t.set(r,this.renderId)}else t===Is.OBJECT&&e.updateAfter(this)}updateNode(e){const t=e.getUpdateType(),r=e.updateReference(this);if(t===Is.FRAME){const{frameMap:t}=this._getMaps(this.updateMap,r);t.get(r)!==this.frameId&&!1!==e.update(this)&&t.set(r,this.frameId)}else if(t===Is.RENDER){const{renderMap:t}=this._getMaps(this.updateMap,r);t.get(r)!==this.renderId&&!1!==e.update(this)&&t.set(r,this.renderId)}else t===Is.OBJECT&&e.update(this)}update(){this.frameId++,void 0===this.lastTime&&(this.lastTime=performance.now()),this.deltaTime=(performance.now()-this.lastTime)/1e3,this.lastTime=performance.now(),this.time+=this.deltaTime}}class y_{constructor(e,t,r=null,s="",i=!1){this.type=e,this.name=t,this.count=r,this.qualifier=s,this.isConst=i}}y_.isNodeFunctionInput=!0;class x_ extends Vb{static get type(){return"DirectionalLightNode"}constructor(e=null){super(e)}setupDirect(){const e=this.colorNode;return{lightDirection:Zx(this.light),lightColor:e}}}const b_=new a,T_=new a;let __=null;class v_ extends Vb{static get type(){return"RectAreaLightNode"}constructor(e=null){super(e),this.halfHeight=Tn(new r).setGroup(yn),this.halfWidth=Tn(new r).setGroup(yn),this.updateType=Is.RENDER}update(e){super.update(e);const{light:t}=this,r=e.camera.matrixWorldInverse;T_.identity(),b_.copy(t.matrixWorld),b_.premultiply(r),T_.extractRotation(b_),this.halfWidth.value.set(.5*t.width,0,0),this.halfHeight.value.set(0,.5*t.height,0),this.halfWidth.value.applyMatrix4(T_),this.halfHeight.value.applyMatrix4(T_)}setupDirectRectArea(e){let t,r;e.isAvailable("float32Filterable")?(t=Hu(__.LTC_FLOAT_1),r=Hu(__.LTC_FLOAT_2)):(t=Hu(__.LTC_HALF_1),r=Hu(__.LTC_HALF_2));const{colorNode:s,light:i}=this;return{lightColor:s,lightPosition:Qx(i),halfWidth:this.halfWidth,halfHeight:this.halfHeight,ltc_1:t,ltc_2:r}}static setLTC(e){__=e}}class N_ extends Vb{static get type(){return"SpotLightNode"}constructor(e=null){super(e),this.coneCosNode=Tn(0).setGroup(yn),this.penumbraCosNode=Tn(0).setGroup(yn),this.cutoffDistanceNode=Tn(0).setGroup(yn),this.decayExponentNode=Tn(0).setGroup(yn)}update(e){super.update(e);const{light:t}=this;this.coneCosNode.value=Math.cos(t.angle),this.penumbraCosNode.value=Math.cos(t.angle*(1-t.penumbra)),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}getSpotAttenuation(e){const{coneCosNode:t,penumbraCosNode:r}=this;return Po(t,r,e)}setupDirect(e){const{colorNode:t,cutoffDistanceNode:r,decayExponentNode:s,light:i}=this,n=this.getLightVector(e),a=n.normalize(),o=a.dot(Zx(i)),u=this.getSpotAttenuation(o),l=n.length(),d=Ub({lightDistance:l,cutoffDistance:r,decayExponent:s});let c=t.mul(u).mul(d);if(i.map){const t=Xx(i,e.context.positionWorld),r=Hu(i.map,t.xy).onRenderUpdate((()=>i.map));c=t.mul(2).sub(1).abs().lessThan(1).all().select(c.mul(r),c)}return{lightColor:c,lightDirection:a}}}class S_ extends N_{static get type(){return"IESSpotLightNode"}getSpotAttenuation(e){const t=this.light.iesMap;let r=null;if(t&&!0===t.isTexture){const s=e.acos().mul(1/Math.PI);r=Hu(t,qi(s,0),0).r}else r=super.getSpotAttenuation(e);return r}}class E_ extends Vb{static get type(){return"AmbientLightNode"}constructor(e=null){super(e)}setup({context:e}){e.irradiance.addAssign(this.colorNode)}}class w_ extends Vb{static get type(){return"HemisphereLightNode"}constructor(t=null){super(t),this.lightPositionNode=Kx(t),this.lightDirectionNode=this.lightPositionNode.normalize(),this.groundColorNode=Tn(new e).setGroup(yn)}update(e){const{light:t}=this;super.update(e),this.lightPositionNode.object3d=t,this.groundColorNode.value.copy(t.groundColor).multiplyScalar(t.intensity)}setup(e){const{colorNode:t,groundColorNode:r,lightDirectionNode:s}=this,i=Gl.dot(s).mul(.5).add(.5),n=Ao(r,t,i);e.context.irradiance.addAssign(n)}}class A_ extends Vb{static get type(){return"LightProbeNode"}constructor(e=null){super(e);const t=[];for(let e=0;e<9;e++)t.push(new r);this.lightProbe=Yu(t)}update(e){const{light:t}=this;super.update(e);for(let e=0;e<9;e++)this.lightProbe.array[e].copy(t.sh.coefficients[e]).multiplyScalar(t.intensity)}setup(e){const t=BT(kl,this.lightProbe);e.context.irradiance.addAssign(t)}}class R_{parseFunction(){console.warn("Abstract function.")}}class C_{constructor(e,t,r="",s=""){this.type=e,this.inputs=t,this.name=r,this.precision=s}getCode(){console.warn("Abstract function.")}}C_.isNodeFunction=!0;const M_=/^\s*(highp|mediump|lowp)?\s*([a-z_0-9]+)\s*([a-z_0-9]+)?\s*\(([\s\S]*?)\)/i,P_=/[a-z_0-9]+/gi,L_="#pragma main";class F_ extends C_{constructor(e){const{type:t,inputs:r,name:s,precision:i,inputsCode:n,blockCode:a,headerCode:o}=(e=>{const t=(e=e.trim()).indexOf(L_),r=-1!==t?e.slice(t+12):e,s=r.match(M_);if(null!==s&&5===s.length){const i=s[4],n=[];let a=null;for(;null!==(a=P_.exec(i));)n.push(a);const o=[];let u=0;for(;u0||e.backgroundBlurriness>0&&0===t.backgroundBlurriness;if(t.background!==r||s){const i=this.getCacheNode("background",r,(()=>{if(!0===r.isCubeTexture||r.mapping===Y||r.mapping===Q||r.mapping===oe){if(e.backgroundBlurriness>0||r.mapping===oe)return Yg(r);{let e;return e=!0===r.isCubeTexture?sd(r):Hu(r),Jh(e)}}if(!0===r.isTexture)return Hu(r,rh.flipY()).setUpdateMatrix(!0);!0!==r.isColor&&console.error("WebGPUNodes: Unsupported background configuration.",r)}),s);t.backgroundNode=i,t.background=r,t.backgroundBlurriness=e.backgroundBlurriness}}else t.backgroundNode&&(delete t.backgroundNode,delete t.background)}getCacheNode(e,t,r,s=!1){const i=this.cacheLib[e]||(this.cacheLib[e]=new WeakMap);let n=i.get(t);return(void 0===n||s)&&(n=r(),i.set(t,n)),n}updateFog(e){const t=this.get(e),r=e.fog;if(r){if(t.fog!==r){const e=this.getCacheNode("fog",r,(()=>{if(r.isFogExp2){const e=ad("color","color",r).setGroup(yn),t=ad("density","float",r).setGroup(yn);return Ax(e,wx(t))}if(r.isFog){const e=ad("color","color",r).setGroup(yn),t=ad("near","float",r).setGroup(yn),s=ad("far","float",r).setGroup(yn);return Ax(e,Ex(t,s))}console.error("THREE.Renderer: Unsupported fog configuration.",r)}));t.fogNode=e,t.fog=r}}else delete t.fogNode,delete t.fog}updateEnvironment(e){const t=this.get(e),r=e.environment;if(r){if(t.environment!==r){const e=this.getCacheNode("environment",r,(()=>!0===r.isCubeTexture?sd(r):!0===r.isTexture?Hu(r):void console.error("Nodes: Unsupported environment configuration.",r)));t.environmentNode=e,t.environment=r}}else t.environmentNode&&(delete t.environmentNode,delete t.environment)}getNodeFrame(e=this.renderer,t=null,r=null,s=null,i=null){const n=this.nodeFrame;return n.renderer=e,n.scene=t,n.object=r,n.camera=s,n.material=i,n}getNodeFrameForRender(e){return this.getNodeFrame(e.renderer,e.scene,e.object,e.camera,e.material)}getOutputCacheKey(){const e=this.renderer;return e.toneMapping+","+e.currentColorSpace}hasOutputChange(e){return I_.get(e)!==this.getOutputCacheKey()}getOutputNode(e){const t=this.renderer,r=this.getOutputCacheKey(),s=Hu(e,rh).renderOutput(t.toneMapping,t.currentColorSpace);return I_.set(e,r),s}updateBefore(e){const t=e.getNodeBuilderState();for(const r of t.updateBeforeNodes)this.getNodeFrameForRender(e).updateBeforeNode(r)}updateAfter(e){const t=e.getNodeBuilderState();for(const r of t.updateAfterNodes)this.getNodeFrameForRender(e).updateAfterNode(r)}updateForCompute(e){const t=this.getNodeFrame(),r=this.getForCompute(e);for(const e of r.updateNodes)t.updateNode(e)}updateForRender(e){const t=this.getNodeFrameForRender(e),r=e.getNodeBuilderState();for(const e of r.updateNodes)t.updateNode(e)}needsRefresh(e){const t=this.getNodeFrameForRender(e);return e.getMonitor().needsRefresh(e,t)}dispose(){super.dispose(),this.nodeFrame=new f_,this.nodeBuilderCache=new Map,this.cacheLib={}}}const O_=new Me;class G_{constructor(e=null){this.version=0,this.clipIntersection=null,this.cacheKey="",this.shadowPass=!1,this.viewNormalMatrix=new n,this.clippingGroupContexts=new WeakMap,this.intersectionPlanes=[],this.unionPlanes=[],this.parentVersion=null,null!==e&&(this.viewNormalMatrix=e.viewNormalMatrix,this.clippingGroupContexts=e.clippingGroupContexts,this.shadowPass=e.shadowPass,this.viewMatrix=e.viewMatrix)}projectPlanes(e,t,r){const s=e.length;for(let i=0;i0,alpha:!0,depth:t.depth,stencil:t.stencil,framebufferScaleFactor:this.getFramebufferScaleFactor()},i=new XRWebGLLayer(e,s,r);this._glBaseLayer=i,e.updateRenderState({baseLayer:i}),t.setPixelRatio(1),t.setSize(i.framebufferWidth,i.framebufferHeight,!1),this._xrRenderTarget=new X_(i.framebufferWidth,i.framebufferHeight,{format:ce,type:Ce,colorSpace:t.outputColorSpace,stencilBuffer:t.stencil,resolveDepthBuffer:!1===i.ignoreDepthValues,resolveStencilBuffer:!1===i.ignoreDepthValues})}this.setFoveation(this.getFoveation()),t._animation.setAnimationLoop(this._onAnimationFrame),t._animation.setContext(e),t._animation.start(),this.isPresenting=!0,this.dispatchEvent({type:"sessionstart"})}}updateCamera(e){const t=this._session;if(null===t)return;const r=e.near,s=e.far,i=this._cameraXR,n=this._cameraL,a=this._cameraR;i.near=a.near=n.near=r,i.far=a.far=n.far=s,this._currentDepthNear===i.near&&this._currentDepthFar===i.far||(t.updateRenderState({depthNear:i.near,depthFar:i.far}),this._currentDepthNear=i.near,this._currentDepthFar=i.far),n.layers.mask=2|e.layers.mask,a.layers.mask=4|e.layers.mask,i.layers.mask=n.layers.mask|a.layers.mask;const o=e.parent,u=i.cameras;Z_(i,o);for(let e=0;e=0&&(r[n]=null,t[n].disconnect(i))}for(let s=0;s=r.length){r.push(i),n=e;break}if(null===r[e]){r[e]=i,n=e;break}}if(-1===n)break}const a=t[n];a&&a.connect(i)}}function rv(e){return"quad"===e.type?this._glBinding.createQuadLayer({transform:new XRRigidTransform(e.translation,e.quaternion),depthFormat:this._gl.DEPTH_COMPONENT,width:e.width/2,height:e.height/2,space:this._referenceSpace,viewPixelWidth:e.pixelwidth,viewPixelHeight:e.pixelheight}):this._glBinding.createCylinderLayer({transform:new XRRigidTransform(e.translation,e.quaternion),depthFormat:this._gl.DEPTH_COMPONENT,radius:e.radius,centralAngle:e.centralAngle,aspectRatio:e.aspectRatio,space:this._referenceSpace,viewPixelWidth:e.pixelwidth,viewPixelHeight:e.pixelheight})}function sv(e,t){if(void 0===t)return;const r=this._cameraXR,i=this._renderer,n=i.backend,a=this._glBaseLayer,o=this.getReferenceSpace(),u=t.getViewerPose(o);if(this._xrFrame=t,null!==u){const e=u.views;null!==this._glBaseLayer&&n.setXRTarget(a.framebuffer);let t=!1;e.length!==r.cameras.length&&(r.cameras.length=0,t=!0);for(let i=0;i{await this.compileAsync(e,t);const s=this._renderLists.get(e,t),i=this._renderContexts.get(e,t,this._renderTarget),n=e.overrideMaterial||r.material,a=this._objects.get(r,n,e,t,s.lightsNode,i,i.clippingContext),{fragmentShader:o,vertexShader:u}=a.getNodeBuilderState();return{fragmentShader:o,vertexShader:u}}}}async init(){if(this._initialized)throw new Error("Renderer: Backend has already been initialized.");return null!==this._initPromise||(this._initPromise=new Promise((async(e,t)=>{let r=this.backend;try{await r.init(this)}catch(e){if(null===this._getFallback)return void t(e);try{this.backend=r=this._getFallback(e),await r.init(this)}catch(e){return void t(e)}}this._nodes=new U_(this,r),this._animation=new Cm(this._nodes,this.info),this._attributes=new km(r),this._background=new VT(this,this._nodes),this._geometries=new Hm(this._attributes,this.info),this._textures=new gf(this,r,this.info),this._pipelines=new Qm(r,this._nodes),this._bindings=new Zm(r,this._nodes,this._textures,this._attributes,this._pipelines,this.info),this._objects=new Bm(this,this._nodes,this._geometries,this._pipelines,this._bindings,this.info),this._renderLists=new nf(this.lighting),this._bundles=new $_,this._renderContexts=new hf,this._animation.start(),this._initialized=!0,e(this)}))),this._initPromise}get coordinateSystem(){return this.backend.coordinateSystem}async compileAsync(e,t,r=null){if(!0===this._isDeviceLost)return;!1===this._initialized&&await this.init();const s=this._nodes.nodeFrame,i=s.renderId,n=this._currentRenderContext,a=this._currentRenderObjectFunction,o=this._compilationPromises,u=!0===e.isScene?e:iv;null===r&&(r=e);const l=this._renderTarget,d=this._renderContexts.get(r,t,l),c=this._activeMipmapLevel,h=[];this._currentRenderContext=d,this._currentRenderObjectFunction=this.renderObject,this._handleObjectFunction=this._createObjectPipeline,this._compilationPromises=h,s.renderId++,s.update(),d.depth=this.depth,d.stencil=this.stencil,d.clippingContext||(d.clippingContext=new G_),d.clippingContext.updateGlobal(u,t),u.onBeforeRender(this,e,t,l);const p=this._renderLists.get(e,t);if(p.begin(),this._projectObject(e,t,0,p,d.clippingContext),r!==e&&r.traverseVisible((function(e){e.isLight&&e.layers.test(t.layers)&&p.pushLight(e)})),p.finish(),null!==l){this._textures.updateRenderTarget(l,c);const e=this._textures.get(l);d.textures=e.textures,d.depthTexture=e.depthTexture}else d.textures=null,d.depthTexture=null;this._background.update(u,p,d);const g=p.opaque,m=p.transparent,f=p.transparentDoublePass,y=p.lightsNode;!0===this.opaque&&g.length>0&&this._renderObjects(g,t,u,y),!0===this.transparent&&m.length>0&&this._renderTransparents(m,f,t,u,y),s.renderId=i,this._currentRenderContext=n,this._currentRenderObjectFunction=a,this._compilationPromises=o,this._handleObjectFunction=this._renderObjectDirect,await Promise.all(h)}async renderAsync(e,t){!1===this._initialized&&await this.init(),this._renderScene(e,t)}async waitForGPU(){await this.backend.waitForGPU()}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}getColorBufferType(){return this._colorBufferType}_onDeviceLost(e){let t=`THREE.WebGPURenderer: ${e.api} Device Lost:\n\nMessage: ${e.message}`;e.reason&&(t+=`\nReason: ${e.reason}`),console.error(t),this._isDeviceLost=!0}_renderBundle(e,t,r){const{bundleGroup:s,camera:i,renderList:n}=e,a=this._currentRenderContext,o=this._bundles.get(s,i),u=this.backend.get(o);void 0===u.renderContexts&&(u.renderContexts=new Set);const l=s.version!==u.version,d=!1===u.renderContexts.has(a)||l;if(u.renderContexts.add(a),d){this.backend.beginBundle(a),(void 0===u.renderObjects||l)&&(u.renderObjects=[]),this._currentRenderBundle=o;const{transparentDoublePass:e,transparent:d,opaque:c}=n;!0===this.opaque&&c.length>0&&this._renderObjects(c,i,t,r),!0===this.transparent&&d.length>0&&this._renderTransparents(d,e,i,t,r),this._currentRenderBundle=null,this.backend.finishBundle(a,o),u.version=s.version}else{const{renderObjects:e}=u;for(let t=0,r=e.length;t>=c,p.viewportValue.height>>=c,p.viewportValue.minDepth=b,p.viewportValue.maxDepth=T,p.viewport=!1===p.viewportValue.equals(av),p.scissorValue.copy(y).multiplyScalar(x).floor(),p.scissor=this._scissorTest&&!1===p.scissorValue.equals(av),p.scissorValue.width>>=c,p.scissorValue.height>>=c,p.clippingContext||(p.clippingContext=new G_),p.clippingContext.updateGlobal(u,t),u.onBeforeRender(this,e,t,h),uv.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),ov.setFromProjectionMatrix(uv,g);const _=this._renderLists.get(e,t);if(_.begin(),this._projectObject(e,t,0,_,p.clippingContext),_.finish(),!0===this.sortObjects&&_.sort(this._opaqueSort,this._transparentSort),null!==h){this._textures.updateRenderTarget(h,c);const e=this._textures.get(h);p.textures=e.textures,p.depthTexture=e.depthTexture,p.width=e.width,p.height=e.height,p.renderTarget=h,p.depth=h.depthBuffer,p.stencil=h.stencilBuffer}else p.textures=null,p.depthTexture=null,p.width=this.domElement.width,p.height=this.domElement.height,p.depth=this.depth,p.stencil=this.stencil;p.width>>=c,p.height>>=c,p.activeCubeFace=d,p.activeMipmapLevel=c,p.occlusionQueryCount=_.occlusionQueryCount,this._background.update(u,_,p),this.backend.beginRender(p);const{bundles:v,lightsNode:N,transparentDoublePass:S,transparent:E,opaque:w}=_;return v.length>0&&this._renderBundles(v,u,N),!0===this.opaque&&w.length>0&&this._renderObjects(w,t,u,N),!0===this.transparent&&E.length>0&&this._renderTransparents(E,S,t,u,N),this.backend.finishRender(p),i.renderId=n,this._currentRenderContext=a,this._currentRenderObjectFunction=o,null!==s&&(this.setRenderTarget(l,d,c),this._renderOutput(h)),u.onAfterRender(this,e,t,h),p}_renderOutput(e){const t=this._quad;this._nodes.hasOutputChange(e.texture)&&(t.material.fragmentNode=this._nodes.getOutputNode(e.texture),t.material.needsUpdate=!0);const r=this.autoClear,s=this.xr.enabled;this.autoClear=!1,this.xr.enabled=!1,this._renderScene(t,t.camera,!1),this.autoClear=r,this.xr.enabled=s}getMaxAnisotropy(){return this.backend.getMaxAnisotropy()}getActiveCubeFace(){return this._activeCubeFace}getActiveMipmapLevel(){return this._activeMipmapLevel}async setAnimationLoop(e){!1===this._initialized&&await this.init(),this._animation.setAnimationLoop(e)}async getArrayBufferAsync(e){return await this.backend.getArrayBufferAsync(e)}getContext(){return this.backend.getContext()}getPixelRatio(){return this._pixelRatio}getDrawingBufferSize(e){return e.set(this._width*this._pixelRatio,this._height*this._pixelRatio).floor()}getSize(e){return e.set(this._width,this._height)}setPixelRatio(e=1){this._pixelRatio!==e&&(this._pixelRatio=e,this.setSize(this._width,this._height,!1))}setDrawingBufferSize(e,t,r){this.xr&&this.xr.isPresenting||(this._width=e,this._height=t,this._pixelRatio=r,this.domElement.width=Math.floor(e*r),this.domElement.height=Math.floor(t*r),this.setViewport(0,0,e,t),this._initialized&&this.backend.updateSize())}setSize(e,t,r=!0){this.xr&&this.xr.isPresenting||(this._width=e,this._height=t,this.domElement.width=Math.floor(e*this._pixelRatio),this.domElement.height=Math.floor(t*this._pixelRatio),!0===r&&(this.domElement.style.width=e+"px",this.domElement.style.height=t+"px"),this.setViewport(0,0,e,t),this._initialized&&this.backend.updateSize())}setOpaqueSort(e){this._opaqueSort=e}setTransparentSort(e){this._transparentSort=e}getScissor(e){const t=this._scissor;return e.x=t.x,e.y=t.y,e.width=t.width,e.height=t.height,e}setScissor(e,t,r,s){const i=this._scissor;e.isVector4?i.copy(e):i.set(e,t,r,s)}getScissorTest(){return this._scissorTest}setScissorTest(e){this._scissorTest=e,this.backend.setScissorTest(e)}getViewport(e){return e.copy(this._viewport)}setViewport(e,t,r,s,i=0,n=1){const a=this._viewport;e.isVector4?a.copy(e):a.set(e,t,r,s),a.minDepth=i,a.maxDepth=n}getClearColor(e){return e.copy(this._clearColor)}setClearColor(e,t=1){this._clearColor.set(e),this._clearColor.a=t}getClearAlpha(){return this._clearColor.a}setClearAlpha(e){this._clearColor.a=e}getClearDepth(){return this._clearDepth}setClearDepth(e){this._clearDepth=e}getClearStencil(){return this._clearStencil}setClearStencil(e){this._clearStencil=e}isOccluded(e){const t=this._currentRenderContext;return t&&this.backend.isOccluded(t,e)}clear(e=!0,t=!0,r=!0){if(!1===this._initialized)return console.warn("THREE.Renderer: .clear() called before the backend is initialized. Try using .clearAsync() instead."),this.clearAsync(e,t,r);const s=this._renderTarget||this._getFrameBufferTarget();let i=null;if(null!==s){this._textures.updateRenderTarget(s);const e=this._textures.get(s);i=this._renderContexts.getForClear(s),i.textures=e.textures,i.depthTexture=e.depthTexture,i.width=e.width,i.height=e.height,i.renderTarget=s,i.depth=s.depthBuffer,i.stencil=s.stencilBuffer,i.clearColorValue=this.backend.getClearColor(),i.activeCubeFace=this.getActiveCubeFace(),i.activeMipmapLevel=this.getActiveMipmapLevel()}this.backend.clear(e,t,r,i),null!==s&&null===this._renderTarget&&this._renderOutput(s)}clearColor(){return this.clear(!0,!1,!1)}clearDepth(){return this.clear(!1,!0,!1)}clearStencil(){return this.clear(!1,!1,!0)}async clearAsync(e=!0,t=!0,r=!0){!1===this._initialized&&await this.init(),this.clear(e,t,r)}async clearColorAsync(){this.clearAsync(!0,!1,!1)}async clearDepthAsync(){this.clearAsync(!1,!0,!1)}async clearStencilAsync(){this.clearAsync(!1,!1,!0)}get currentToneMapping(){return this.isOutputTarget?this.toneMapping:p}get currentColorSpace(){return this.isOutputTarget?this.outputColorSpace:de}get isOutputTarget(){return this._renderTarget===this._outputRenderTarget||null===this._renderTarget}dispose(){this.info.dispose(),this.backend.dispose(),this._animation.dispose(),this._objects.dispose(),this._pipelines.dispose(),this._nodes.dispose(),this._bindings.dispose(),this._renderLists.dispose(),this._renderContexts.dispose(),this._textures.dispose(),null!==this._frameBufferTarget&&this._frameBufferTarget.dispose(),Object.values(this.backend.timestampQueryPool).forEach((e=>{null!==e&&e.dispose()})),this.setRenderTarget(null),this.setAnimationLoop(null)}setRenderTarget(e,t=0,r=0){this._renderTarget=e,this._activeCubeFace=t,this._activeMipmapLevel=r}getRenderTarget(){return this._renderTarget}setOutputRenderTarget(e){this._outputRenderTarget=e}getOutputRenderTarget(){return this._outputRenderTarget}setRenderObjectFunction(e){this._renderObjectFunction=e}getRenderObjectFunction(){return this._renderObjectFunction}compute(e){if(!0===this._isDeviceLost)return;if(!1===this._initialized)return console.warn("THREE.Renderer: .compute() called before the backend is initialized. Try using .computeAsync() instead."),this.computeAsync(e);const t=this._nodes.nodeFrame,r=t.renderId;this.info.calls++,this.info.compute.calls++,this.info.compute.frameCalls++,t.renderId=this.info.calls;const s=this.backend,i=this._pipelines,n=this._bindings,a=this._nodes,o=Array.isArray(e)?e:[e];if(void 0===o[0]||!0!==o[0].isComputeNode)throw new Error("THREE.Renderer: .compute() expects a ComputeNode.");s.beginCompute(e);for(const t of o){if(!1===i.has(t)){const e=()=>{t.removeEventListener("dispose",e),i.delete(t),n.delete(t),a.delete(t)};t.addEventListener("dispose",e);const r=t.onInitFunction;null!==r&&r.call(t,{renderer:this})}a.updateForCompute(t),n.updateForCompute(t);const r=n.getForCompute(t),o=i.getForCompute(t,r);s.compute(e,t,r,o)}s.finishCompute(e),t.renderId=r}async computeAsync(e){!1===this._initialized&&await this.init(),this.compute(e)}async hasFeatureAsync(e){return!1===this._initialized&&await this.init(),this.backend.hasFeature(e)}async resolveTimestampsAsync(e="render"){return!1===this._initialized&&await this.init(),this.backend.resolveTimestampsAsync(e)}hasFeature(e){return!1===this._initialized?(console.warn("THREE.Renderer: .hasFeature() called before the backend is initialized. Try using .hasFeatureAsync() instead."),!1):this.backend.hasFeature(e)}hasInitialized(){return this._initialized}async initTextureAsync(e){!1===this._initialized&&await this.init(),this._textures.updateTexture(e)}initTexture(e){!1===this._initialized&&console.warn("THREE.Renderer: .initTexture() called before the backend is initialized. Try using .initTextureAsync() instead."),this._textures.updateTexture(e)}copyFramebufferToTexture(e,t=null){if(null!==t)if(t.isVector2)t=lv.set(t.x,t.y,e.image.width,e.image.height).floor();else{if(!t.isVector4)return void console.error("THREE.Renderer.copyFramebufferToTexture: Invalid rectangle.");t=lv.copy(t).floor()}else t=lv.set(0,0,e.image.width,e.image.height);let r,s=this._currentRenderContext;null!==s?r=s.renderTarget:(r=this._renderTarget||this._getFrameBufferTarget(),null!==r&&(this._textures.updateRenderTarget(r),s=this._textures.get(r))),this._textures.updateTexture(e,{renderTarget:r}),this.backend.copyFramebufferToTexture(e,s,t)}copyTextureToTexture(e,t,r=null,s=null,i=0,n=0){this._textures.updateTexture(e),this._textures.updateTexture(t),this.backend.copyTextureToTexture(e,t,r,s,i,n)}async readRenderTargetPixelsAsync(e,t,r,s,i,n=0,a=0){return this.backend.copyTextureToBuffer(e.textures[n],t,r,s,i,a)}_projectObject(e,t,r,s,i){if(!1===e.visible)return;if(e.layers.test(t.layers))if(e.isGroup)r=e.renderOrder,e.isClippingGroup&&e.enabled&&(i=i.getGroupContext(e));else if(e.isLOD)!0===e.autoUpdate&&e.update(t);else if(e.isLight)s.pushLight(e);else if(e.isSprite){if(!e.frustumCulled||ov.intersectsSprite(e)){!0===this.sortObjects&&lv.setFromMatrixPosition(e.matrixWorld).applyMatrix4(uv);const{geometry:t,material:n}=e;n.visible&&s.push(e,t,n,r,lv.z,null,i)}}else if(e.isLineLoop)console.error("THREE.Renderer: Objects of type THREE.LineLoop are not supported. Please use THREE.Line or THREE.LineSegments.");else if((e.isMesh||e.isLine||e.isPoints)&&(!e.frustumCulled||ov.intersectsObject(e))){const{geometry:t,material:n}=e;if(!0===this.sortObjects&&(null===t.boundingSphere&&t.computeBoundingSphere(),lv.copy(t.boundingSphere.center).applyMatrix4(e.matrixWorld).applyMatrix4(uv)),Array.isArray(n)){const a=t.groups;for(let o=0,u=a.length;o0){for(const{material:e}of t)e.side=N;this._renderObjects(t,r,s,i,"backSide");for(const{material:e}of t)e.side=je;this._renderObjects(e,r,s,i);for(const{material:e}of t)e.side=Se}else this._renderObjects(e,r,s,i)}_renderObjects(e,t,r,s,i=null){for(let n=0,a=e.length;n0,e.isShadowPassMaterial&&(e.side=null===i.shadowSide?i.side:i.shadowSide,i.depthNode&&i.depthNode.isNode&&(c=e.depthNode,e.depthNode=i.depthNode),i.castShadowNode&&i.castShadowNode.isNode&&(d=e.colorNode,e.colorNode=i.castShadowNode)),i=e}!0===i.transparent&&i.side===Se&&!1===i.forceSinglePass?(i.side=N,this._handleObjectFunction(e,i,t,r,a,n,o,"backSide"),i.side=je,this._handleObjectFunction(e,i,t,r,a,n,o,u),i.side=Se):this._handleObjectFunction(e,i,t,r,a,n,o,u),void 0!==l&&(t.overrideMaterial.positionNode=l),void 0!==c&&(t.overrideMaterial.depthNode=c),void 0!==d&&(t.overrideMaterial.colorNode=d),e.onAfterRender(this,t,r,s,i,n)}_renderObjectDirect(e,t,r,s,i,n,a,o){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,a,o);u.drawRange=e.geometry.drawRange,u.group=n;const l=this._nodes.needsRefresh(u);if(l&&(this._nodes.updateBefore(u),this._geometries.updateForRender(u),this._nodes.updateForRender(u),this._bindings.updateForRender(u)),this._pipelines.updateForRender(u),null!==this._currentRenderBundle){this.backend.get(this._currentRenderBundle).renderObjects.push(u),u.bundle=this._currentRenderBundle.bundleGroup}this.backend.draw(u,this.info),l&&this._nodes.updateAfter(u)}_createObjectPipeline(e,t,r,s,i,n,a,o){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,a,o);u.drawRange=e.geometry.drawRange,u.group=n,this._nodes.updateBefore(u),this._geometries.updateForRender(u),this._nodes.updateForRender(u),this._bindings.updateForRender(u),this._pipelines.getForRender(u,this._compilationPromises),this._nodes.updateAfter(u)}get compile(){return this.compileAsync}}class cv{constructor(e=""){this.name=e,this.visibility=0}setVisibility(e){this.visibility|=e}clone(){return Object.assign(new this.constructor,this)}}class hv extends cv{constructor(e,t=null){super(e),this.isBuffer=!0,this.bytesPerElement=Float32Array.BYTES_PER_ELEMENT,this._buffer=t}get byteLength(){return(e=this._buffer.byteLength)+(Gm-e%Gm)%Gm;var e}get buffer(){return this._buffer}update(){return!0}}class pv extends hv{constructor(e,t=null){super(e,t),this.isUniformBuffer=!0}}let gv=0;class mv extends pv{constructor(e,t){super("UniformBuffer_"+gv++,e?e.value:null),this.nodeUniform=e,this.groupNode=t}get buffer(){return this.nodeUniform.value}}class fv extends pv{constructor(e){super(e),this.isUniformsGroup=!0,this._values=null,this.uniforms=[]}addUniform(e){return this.uniforms.push(e),this}removeUniform(e){const t=this.uniforms.indexOf(e);return-1!==t&&this.uniforms.splice(t,1),this}get values(){return null===this._values&&(this._values=Array.from(this.buffer)),this._values}get buffer(){let e=this._buffer;if(null===e){const t=this.byteLength;e=new Float32Array(new ArrayBuffer(t)),this._buffer=e}return e}get byteLength(){let e=0;for(let t=0,r=this.uniforms.length;t0?s:"";t=`${e.name} {\n\t${r} ${i.name}[${n}];\n};\n`}else{t=`${this.getVectorType(i.type)} ${this.getPropertyName(i,e)};`,n=!0}const a=i.node.precision;if(null!==a&&(t=Ev[a]+" "+t),n){t="\t"+t;const e=i.groupNode.name;(s[e]||(s[e]=[])).push(t)}else t="uniform "+t,r.push(t)}let i="";for(const t in s){const r=s[t];i+=this._getGLSLUniformStruct(e+"_"+t,r.join("\n"))+"\n"}return i+=r.join("\n"),i}getTypeFromAttribute(e){let t=super.getTypeFromAttribute(e);if(/^[iu]/.test(t)&&e.gpuType!==T){let r=e;e.isInterleavedBufferAttribute&&(r=e.data);const s=r.array;!1==(s instanceof Uint32Array||s instanceof Int32Array)&&(t=t.slice(1))}return t}getAttributes(e){let t="";if("vertex"===e||"compute"===e){const e=this.getAttributesArray();let r=0;for(const s of e)t+=`layout( location = ${r++} ) in ${s.type} ${s.name};\n`}return t}getStructMembers(e){const t=[];for(const r of e.members)t.push(`\t${r.type} ${r.name};`);return t.join("\n")}getStructs(e){const t=[],r=this.structs[e],s=[];for(const e of r)if(e.output)for(const t of e.members)s.push(`layout( location = ${t.index} ) out ${t.type} ${t.name};`);else{let r="struct "+e.name+" {\n";r+=this.getStructMembers(e),r+="\n};\n",t.push(r)}return 0===s.length&&s.push("layout( location = 0 ) out vec4 fragColor;"),"\n"+s.join("\n")+"\n\n"+t.join("\n")}getVaryings(e){let t="";const r=this.varyings;if("vertex"===e||"compute"===e)for(const s of r){"compute"===e&&(s.needsInterpolation=!0);const r=this.getType(s.type);if(s.needsInterpolation){t+=`${r.includes("int")||r.includes("uv")||r.includes("iv")?"flat ":""}out ${r} ${s.name};\n`}else t+=`${r} ${s.name};\n`}else if("fragment"===e)for(const e of r)if(e.needsInterpolation){const r=this.getType(e.type);t+=`${r.includes("int")||r.includes("uv")||r.includes("iv")?"flat ":""}in ${r} ${e.name};\n`}for(const r of this.builtins[e])t+=`${r};\n`;return t}getVertexIndex(){return"uint( gl_VertexID )"}getInstanceIndex(){return"uint( gl_InstanceID )"}getInvocationLocalIndex(){return`uint( gl_InstanceID ) % ${this.object.workgroupSize.reduce(((e,t)=>e*t),1)}u`}getDrawIndex(){return this.renderer.backend.extensions.has("WEBGL_multi_draw")?"uint( gl_DrawID )":null}getFrontFacing(){return"gl_FrontFacing"}getFragCoord(){return"gl_FragCoord.xy"}getFragDepth(){return"gl_FragDepth"}enableExtension(e,t,r=this.shaderStage){const s=this.extensions[r]||(this.extensions[r]=new Map);!1===s.has(e)&&s.set(e,{name:e,behavior:t})}getExtensions(e){const t=[];if("vertex"===e){const t=this.renderer.backend.extensions;this.object.isBatchedMesh&&t.has("WEBGL_multi_draw")&&this.enableExtension("GL_ANGLE_multi_draw","require",e)}const r=this.extensions[e];if(void 0!==r)for(const{name:e,behavior:s}of r.values())t.push(`#extension ${e} : ${s}`);return t.join("\n")}getClipDistance(){return"gl_ClipDistance"}isAvailable(e){let t=wv[e];if(void 0===t){let r;switch(t=!1,e){case"float32Filterable":r="OES_texture_float_linear";break;case"clipDistance":r="WEBGL_clip_cull_distance"}if(void 0!==r){const e=this.renderer.backend.extensions;e.has(r)&&(e.get(r),t=!0)}wv[e]=t}return t}isFlipY(){return!0}enableHardwareClipping(e){this.enableExtension("GL_ANGLE_clip_cull_distance","require"),this.builtins.vertex.push(`out float gl_ClipDistance[ ${e} ]`)}registerTransform(e,t){this.transforms.push({varyingName:e,attributeNode:t})}getTransforms(){const e=this.transforms;let t="";for(let r=0;r0&&(r+="\n"),r+=`\t// flow -> ${n}\n\t`),r+=`${s.code}\n\t`,e===i&&"compute"!==t&&(r+="// result\n\t","vertex"===t?(r+="gl_Position = ",r+=`${s.result};`):"fragment"===t&&(e.outputNode.isOutputStructNode||(r+="fragColor = ",r+=`${s.result};`)))}const n=e[t];n.extensions=this.getExtensions(t),n.uniforms=this.getUniforms(t),n.attributes=this.getAttributes(t),n.varyings=this.getVaryings(t),n.vars=this.getVars(t),n.structs=this.getStructs(t),n.codes=this.getCodes(t),n.transforms=this.getTransforms(t),n.flow=r}null!==this.material?(this.vertexShader=this._getGLSLVertexCode(e.vertex),this.fragmentShader=this._getGLSLFragmentCode(e.fragment)):this.computeShader=this._getGLSLVertexCode(e.compute)}getUniformFromNode(e,t,r,s=null){const i=super.getUniformFromNode(e,t,r,s),n=this.getDataFromNode(e,r,this.globalCache);let a=n.uniformGPU;if(void 0===a){const s=e.groupNode,o=s.name,u=this.getBindGroupArray(o,r);if("texture"===t)a=new _v(i.name,i.node,s),u.push(a);else if("cubeTexture"===t)a=new vv(i.name,i.node,s),u.push(a);else if("texture3D"===t)a=new Nv(i.name,i.node,s),u.push(a);else if("buffer"===t){e.name=`NodeBuffer_${e.id}`,i.name=`buffer${e.id}`;const t=new mv(e,s);t.name=e.name,u.push(t),a=t}else{const e=this.uniformGroups[r]||(this.uniformGroups[r]={});let n=e[o];void 0===n&&(n=new xv(r+"_"+o,s),e[o]=n,u.push(n)),a=this.getNodeUniform(i,t),n.addUniform(a)}n.uniformGPU=a}return i}}let Cv=null,Mv=null;class Pv{constructor(e={}){this.parameters=Object.assign({},e),this.data=new WeakMap,this.renderer=null,this.domElement=null,this.timestampQueryPool={render:null,compute:null},this.trackTimestamp=!0===e.trackTimestamp}async init(e){this.renderer=e}get coordinateSystem(){}beginRender(){}finishRender(){}beginCompute(){}finishCompute(){}draw(){}compute(){}createProgram(){}destroyProgram(){}createBindings(){}updateBindings(){}updateBinding(){}createRenderPipeline(){}createComputePipeline(){}needsRenderUpdate(){}getRenderCacheKey(){}createNodeBuilder(){}createSampler(){}destroySampler(){}createDefaultTexture(){}createTexture(){}updateTexture(){}generateMipmaps(){}destroyTexture(){}async copyTextureToBuffer(){}copyTextureToTexture(){}copyFramebufferToTexture(){}createAttribute(){}createIndexAttribute(){}createStorageAttribute(){}updateAttribute(){}destroyAttribute(){}getContext(){}updateSize(){}updateViewport(){}isOccluded(){}async resolveTimestampsAsync(e="render"){if(!this.trackTimestamp)return void ht("WebGPURenderer: Timestamp tracking is disabled.");const t=this.timestampQueryPool[e];if(!t)return void ht(`WebGPURenderer: No timestamp query pool for type '${e}' found.`);const r=await t.resolveQueriesAsync();return this.renderer.info[e].timestamp=r,r}async waitForGPU(){}async getArrayBufferAsync(){}async hasFeatureAsync(){}hasFeature(){}getMaxAnisotropy(){}getDrawingBufferSize(){return Cv=Cv||new t,this.renderer.getDrawingBufferSize(Cv)}setScissorTest(){}getClearColor(){const e=this.renderer;return Mv=Mv||new mf,e.getClearColor(Mv),Mv.getRGB(Mv),Mv}getDomElement(){let e=this.domElement;return null===e&&(e=void 0!==this.parameters.canvas?this.parameters.canvas:pt(),"setAttribute"in e&&e.setAttribute("data-engine",`three.js r${$e} webgpu`),this.domElement=e),e}set(e,t){this.data.set(e,t)}get(e){let t=this.data.get(e);return void 0===t&&(t={},this.data.set(e,t)),t}has(e){return this.data.has(e)}delete(e){this.data.delete(e)}dispose(){}}let Lv,Fv,Bv=0;class Iv{constructor(e,t){this.buffers=[e.bufferGPU,t],this.type=e.type,this.bufferType=e.bufferType,this.pbo=e.pbo,this.byteLength=e.byteLength,this.bytesPerElement=e.BYTES_PER_ELEMENT,this.version=e.version,this.isInteger=e.isInteger,this.activeBufferIndex=0,this.baseId=e.id}get id(){return`${this.baseId}|${this.activeBufferIndex}`}get bufferGPU(){return this.buffers[this.activeBufferIndex]}get transformBuffer(){return this.buffers[1^this.activeBufferIndex]}switchBuffers(){this.activeBufferIndex^=1}}class Dv{constructor(e){this.backend=e}createAttribute(e,t){const r=this.backend,{gl:s}=r,i=e.array,n=e.usage||s.STATIC_DRAW,a=e.isInterleavedBufferAttribute?e.data:e,o=r.get(a);let u,l=o.bufferGPU;if(void 0===l&&(l=this._createBuffer(s,t,i,n),o.bufferGPU=l,o.bufferType=t,o.version=a.version),i instanceof Float32Array)u=s.FLOAT;else if(i instanceof Uint16Array)u=e.isFloat16BufferAttribute?s.HALF_FLOAT:s.UNSIGNED_SHORT;else if(i instanceof Int16Array)u=s.SHORT;else if(i instanceof Uint32Array)u=s.UNSIGNED_INT;else if(i instanceof Int32Array)u=s.INT;else if(i instanceof Int8Array)u=s.BYTE;else if(i instanceof Uint8Array)u=s.UNSIGNED_BYTE;else{if(!(i instanceof Uint8ClampedArray))throw new Error("THREE.WebGLBackend: Unsupported buffer data format: "+i);u=s.UNSIGNED_BYTE}let d={bufferGPU:l,bufferType:t,type:u,byteLength:i.byteLength,bytesPerElement:i.BYTES_PER_ELEMENT,version:e.version,pbo:e.pbo,isInteger:u===s.INT||u===s.UNSIGNED_INT||e.gpuType===T,id:Bv++};if(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute){const e=this._createBuffer(s,t,i,n);d=new Iv(d,e)}r.set(e,d)}updateAttribute(e){const t=this.backend,{gl:r}=t,s=e.array,i=e.isInterleavedBufferAttribute?e.data:e,n=t.get(i),a=n.bufferType,o=e.isInterleavedBufferAttribute?e.data.updateRanges:e.updateRanges;if(r.bindBuffer(a,n.bufferGPU),0===o.length)r.bufferSubData(a,0,s);else{for(let e=0,t=o.length;e1?this.enable(s.SAMPLE_ALPHA_TO_COVERAGE):this.disable(s.SAMPLE_ALPHA_TO_COVERAGE),r>0&&this.currentClippingPlanes!==r){const e=12288;for(let t=0;t<8;t++)t{!function i(){const n=e.clientWaitSync(t,e.SYNC_FLUSH_COMMANDS_BIT,0);if(n===e.WAIT_FAILED)return e.deleteSync(t),void s();n!==e.TIMEOUT_EXPIRED?(e.deleteSync(t),r()):requestAnimationFrame(i)}()}))}}let Ov,Gv,kv,zv=!1;class $v{constructor(e){this.backend=e,this.gl=e.gl,this.extensions=e.extensions,this.defaultTextures={},!1===zv&&(this._init(),zv=!0)}_init(){const e=this.gl;Ov={[Sr]:e.REPEAT,[Nr]:e.CLAMP_TO_EDGE,[vr]:e.MIRRORED_REPEAT},Gv={[_]:e.NEAREST,[Er]:e.NEAREST_MIPMAP_NEAREST,[ke]:e.NEAREST_MIPMAP_LINEAR,[q]:e.LINEAR,[Ge]:e.LINEAR_MIPMAP_NEAREST,[B]:e.LINEAR_MIPMAP_LINEAR},kv={[Lr]:e.NEVER,[Pr]:e.ALWAYS,[Ie]:e.LESS,[Mr]:e.LEQUAL,[Cr]:e.EQUAL,[Rr]:e.GEQUAL,[Ar]:e.GREATER,[wr]:e.NOTEQUAL}}getGLTextureType(e){const{gl:t}=this;let r;return r=!0===e.isCubeTexture?t.TEXTURE_CUBE_MAP:!0===e.isDataArrayTexture||!0===e.isCompressedArrayTexture?t.TEXTURE_2D_ARRAY:!0===e.isData3DTexture?t.TEXTURE_3D:t.TEXTURE_2D,r}getInternalFormat(e,t,r,s,i=!1){const{gl:n,extensions:a}=this;if(null!==e){if(void 0!==n[e])return n[e];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+e+"'")}let o=t;return t===n.RED&&(r===n.FLOAT&&(o=n.R32F),r===n.HALF_FLOAT&&(o=n.R16F),r===n.UNSIGNED_BYTE&&(o=n.R8),r===n.UNSIGNED_SHORT&&(o=n.R16),r===n.UNSIGNED_INT&&(o=n.R32UI),r===n.BYTE&&(o=n.R8I),r===n.SHORT&&(o=n.R16I),r===n.INT&&(o=n.R32I)),t===n.RED_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.R8UI),r===n.UNSIGNED_SHORT&&(o=n.R16UI),r===n.UNSIGNED_INT&&(o=n.R32UI),r===n.BYTE&&(o=n.R8I),r===n.SHORT&&(o=n.R16I),r===n.INT&&(o=n.R32I)),t===n.RG&&(r===n.FLOAT&&(o=n.RG32F),r===n.HALF_FLOAT&&(o=n.RG16F),r===n.UNSIGNED_BYTE&&(o=n.RG8),r===n.UNSIGNED_SHORT&&(o=n.RG16),r===n.UNSIGNED_INT&&(o=n.RG32UI),r===n.BYTE&&(o=n.RG8I),r===n.SHORT&&(o=n.RG16I),r===n.INT&&(o=n.RG32I)),t===n.RG_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RG8UI),r===n.UNSIGNED_SHORT&&(o=n.RG16UI),r===n.UNSIGNED_INT&&(o=n.RG32UI),r===n.BYTE&&(o=n.RG8I),r===n.SHORT&&(o=n.RG16I),r===n.INT&&(o=n.RG32I)),t===n.RGB&&(r===n.FLOAT&&(o=n.RGB32F),r===n.HALF_FLOAT&&(o=n.RGB16F),r===n.UNSIGNED_BYTE&&(o=n.RGB8),r===n.UNSIGNED_SHORT&&(o=n.RGB16),r===n.UNSIGNED_INT&&(o=n.RGB32UI),r===n.BYTE&&(o=n.RGB8I),r===n.SHORT&&(o=n.RGB16I),r===n.INT&&(o=n.RGB32I),r===n.UNSIGNED_BYTE&&(o=s===z&&!1===i?n.SRGB8:n.RGB8),r===n.UNSIGNED_SHORT_5_6_5&&(o=n.RGB565),r===n.UNSIGNED_SHORT_5_5_5_1&&(o=n.RGB5_A1),r===n.UNSIGNED_SHORT_4_4_4_4&&(o=n.RGB4),r===n.UNSIGNED_INT_5_9_9_9_REV&&(o=n.RGB9_E5)),t===n.RGB_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RGB8UI),r===n.UNSIGNED_SHORT&&(o=n.RGB16UI),r===n.UNSIGNED_INT&&(o=n.RGB32UI),r===n.BYTE&&(o=n.RGB8I),r===n.SHORT&&(o=n.RGB16I),r===n.INT&&(o=n.RGB32I)),t===n.RGBA&&(r===n.FLOAT&&(o=n.RGBA32F),r===n.HALF_FLOAT&&(o=n.RGBA16F),r===n.UNSIGNED_BYTE&&(o=n.RGBA8),r===n.UNSIGNED_SHORT&&(o=n.RGBA16),r===n.UNSIGNED_INT&&(o=n.RGBA32UI),r===n.BYTE&&(o=n.RGBA8I),r===n.SHORT&&(o=n.RGBA16I),r===n.INT&&(o=n.RGBA32I),r===n.UNSIGNED_BYTE&&(o=s===z&&!1===i?n.SRGB8_ALPHA8:n.RGBA8),r===n.UNSIGNED_SHORT_4_4_4_4&&(o=n.RGBA4),r===n.UNSIGNED_SHORT_5_5_5_1&&(o=n.RGB5_A1)),t===n.RGBA_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RGBA8UI),r===n.UNSIGNED_SHORT&&(o=n.RGBA16UI),r===n.UNSIGNED_INT&&(o=n.RGBA32UI),r===n.BYTE&&(o=n.RGBA8I),r===n.SHORT&&(o=n.RGBA16I),r===n.INT&&(o=n.RGBA32I)),t===n.DEPTH_COMPONENT&&(r===n.UNSIGNED_SHORT&&(o=n.DEPTH_COMPONENT16),r===n.UNSIGNED_INT&&(o=n.DEPTH_COMPONENT24),r===n.FLOAT&&(o=n.DEPTH_COMPONENT32F)),t===n.DEPTH_STENCIL&&r===n.UNSIGNED_INT_24_8&&(o=n.DEPTH24_STENCIL8),o!==n.R16F&&o!==n.R32F&&o!==n.RG16F&&o!==n.RG32F&&o!==n.RGBA16F&&o!==n.RGBA32F||a.get("EXT_color_buffer_float"),o}setTextureParameters(e,t){const{gl:r,extensions:s,backend:i}=this;r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,t.flipY),r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,t.premultiplyAlpha),r.pixelStorei(r.UNPACK_ALIGNMENT,t.unpackAlignment),r.pixelStorei(r.UNPACK_COLORSPACE_CONVERSION_WEBGL,r.NONE),r.texParameteri(e,r.TEXTURE_WRAP_S,Ov[t.wrapS]),r.texParameteri(e,r.TEXTURE_WRAP_T,Ov[t.wrapT]),e!==r.TEXTURE_3D&&e!==r.TEXTURE_2D_ARRAY||r.texParameteri(e,r.TEXTURE_WRAP_R,Ov[t.wrapR]),r.texParameteri(e,r.TEXTURE_MAG_FILTER,Gv[t.magFilter]);const n=void 0!==t.mipmaps&&t.mipmaps.length>0,a=t.minFilter===q&&n?B:t.minFilter;if(r.texParameteri(e,r.TEXTURE_MIN_FILTER,Gv[a]),t.compareFunction&&(r.texParameteri(e,r.TEXTURE_COMPARE_MODE,r.COMPARE_REF_TO_TEXTURE),r.texParameteri(e,r.TEXTURE_COMPARE_FUNC,kv[t.compareFunction])),!0===s.has("EXT_texture_filter_anisotropic")){if(t.magFilter===_)return;if(t.minFilter!==ke&&t.minFilter!==B)return;if(t.type===L&&!1===s.has("OES_texture_float_linear"))return;if(t.anisotropy>1){const n=s.get("EXT_texture_filter_anisotropic");r.texParameterf(e,n.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(t.anisotropy,i.getMaxAnisotropy()))}}}createDefaultTexture(e){const{gl:t,backend:r,defaultTextures:s}=this,i=this.getGLTextureType(e);let n=s[i];void 0===n&&(n=t.createTexture(),r.state.bindTexture(i,n),t.texParameteri(i,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(i,t.TEXTURE_MAG_FILTER,t.NEAREST),s[i]=n),r.set(e,{textureGPU:n,glTextureType:i,isDefault:!0})}createTexture(e,t){const{gl:r,backend:s}=this,{levels:i,width:n,height:a,depth:o}=t,u=s.utils.convert(e.format,e.colorSpace),l=s.utils.convert(e.type),d=this.getInternalFormat(e.internalFormat,u,l,e.colorSpace,e.isVideoTexture),c=r.createTexture(),h=this.getGLTextureType(e);s.state.bindTexture(h,c),this.setTextureParameters(h,e),e.isDataArrayTexture||e.isCompressedArrayTexture?r.texStorage3D(r.TEXTURE_2D_ARRAY,i,d,n,a,o):e.isData3DTexture?r.texStorage3D(r.TEXTURE_3D,i,d,n,a,o):e.isVideoTexture||r.texStorage2D(h,i,d,n,a),s.set(e,{textureGPU:c,glTextureType:h,glFormat:u,glType:l,glInternalFormat:d})}copyBufferToTexture(e,t){const{gl:r,backend:s}=this,{textureGPU:i,glTextureType:n,glFormat:a,glType:o}=s.get(t),{width:u,height:l}=t.source.data;r.bindBuffer(r.PIXEL_UNPACK_BUFFER,e),s.state.bindTexture(n,i),r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,!1),r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1),r.texSubImage2D(n,0,0,0,u,l,a,o,0),r.bindBuffer(r.PIXEL_UNPACK_BUFFER,null),s.state.unbindTexture()}updateTexture(e,t){const{gl:r}=this,{width:s,height:i}=t,{textureGPU:n,glTextureType:a,glFormat:o,glType:u,glInternalFormat:l}=this.backend.get(e);if(e.isRenderTargetTexture||void 0===n)return;const d=e=>e.isDataTexture?e.image.data:"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap||e instanceof OffscreenCanvas?e:e.data;if(this.backend.state.bindTexture(a,n),this.setTextureParameters(a,e),e.isCompressedTexture){const s=e.mipmaps,i=t.image;for(let t=0;t0,c=t.renderTarget?t.renderTarget.height:this.backend.getDrawingBufferSize().y;if(d){const r=0!==a||0!==o;let d,h;if(!0===e.isDepthTexture?(d=s.DEPTH_BUFFER_BIT,h=s.DEPTH_ATTACHMENT,t.stencil&&(d|=s.STENCIL_BUFFER_BIT)):(d=s.COLOR_BUFFER_BIT,h=s.COLOR_ATTACHMENT0),r){const e=this.backend.get(t.renderTarget),r=e.framebuffers[t.getCacheKey()],h=e.msaaFrameBuffer;i.bindFramebuffer(s.DRAW_FRAMEBUFFER,r),i.bindFramebuffer(s.READ_FRAMEBUFFER,h);const p=c-o-l;s.blitFramebuffer(a,p,a+u,p+l,a,p,a+u,p+l,d,s.NEAREST),i.bindFramebuffer(s.READ_FRAMEBUFFER,r),i.bindTexture(s.TEXTURE_2D,n),s.copyTexSubImage2D(s.TEXTURE_2D,0,0,0,a,p,u,l),i.unbindTexture()}else{const e=s.createFramebuffer();i.bindFramebuffer(s.DRAW_FRAMEBUFFER,e),s.framebufferTexture2D(s.DRAW_FRAMEBUFFER,h,s.TEXTURE_2D,n,0),s.blitFramebuffer(0,0,u,l,0,0,u,l,d,s.NEAREST),s.deleteFramebuffer(e)}}else i.bindTexture(s.TEXTURE_2D,n),s.copyTexSubImage2D(s.TEXTURE_2D,0,0,0,a,c-l-o,u,l),i.unbindTexture();e.generateMipmaps&&this.generateMipmaps(e),this.backend._setFramebuffer(t)}setupRenderBufferStorage(e,t,r,s=!1){const{gl:i}=this,n=t.renderTarget,{depthTexture:a,depthBuffer:o,stencilBuffer:u,width:l,height:d}=n;if(i.bindRenderbuffer(i.RENDERBUFFER,e),o&&!u){let t=i.DEPTH_COMPONENT24;if(!0===s){this.extensions.get("WEBGL_multisampled_render_to_texture").renderbufferStorageMultisampleEXT(i.RENDERBUFFER,n.samples,t,l,d)}else r>0?(a&&a.isDepthTexture&&a.type===i.FLOAT&&(t=i.DEPTH_COMPONENT32F),i.renderbufferStorageMultisample(i.RENDERBUFFER,r,t,l,d)):i.renderbufferStorage(i.RENDERBUFFER,t,l,d);i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_ATTACHMENT,i.RENDERBUFFER,e)}else o&&u&&(r>0?i.renderbufferStorageMultisample(i.RENDERBUFFER,r,i.DEPTH24_STENCIL8,l,d):i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_STENCIL,l,d),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_STENCIL_ATTACHMENT,i.RENDERBUFFER,e))}async copyTextureToBuffer(e,t,r,s,i,n){const{backend:a,gl:o}=this,{textureGPU:u,glFormat:l,glType:d}=this.backend.get(e),c=o.createFramebuffer();o.bindFramebuffer(o.READ_FRAMEBUFFER,c);const h=e.isCubeTexture?o.TEXTURE_CUBE_MAP_POSITIVE_X+n:o.TEXTURE_2D;o.framebufferTexture2D(o.READ_FRAMEBUFFER,o.COLOR_ATTACHMENT0,h,u,0);const p=this._getTypedArrayType(d),g=s*i*this._getBytesPerTexel(d,l),m=o.createBuffer();o.bindBuffer(o.PIXEL_PACK_BUFFER,m),o.bufferData(o.PIXEL_PACK_BUFFER,g,o.STREAM_READ),o.readPixels(t,r,s,i,l,d,0),o.bindBuffer(o.PIXEL_PACK_BUFFER,null),await a.utils._clientWaitAsync();const f=new p(g/p.BYTES_PER_ELEMENT);return o.bindBuffer(o.PIXEL_PACK_BUFFER,m),o.getBufferSubData(o.PIXEL_PACK_BUFFER,0,f),o.bindBuffer(o.PIXEL_PACK_BUFFER,null),o.deleteFramebuffer(c),f}_getTypedArrayType(e){const{gl:t}=this;if(e===t.UNSIGNED_BYTE)return Uint8Array;if(e===t.UNSIGNED_SHORT_4_4_4_4)return Uint16Array;if(e===t.UNSIGNED_SHORT_5_5_5_1)return Uint16Array;if(e===t.UNSIGNED_SHORT_5_6_5)return Uint16Array;if(e===t.UNSIGNED_SHORT)return Uint16Array;if(e===t.UNSIGNED_INT)return Uint32Array;if(e===t.HALF_FLOAT)return Uint16Array;if(e===t.FLOAT)return Float32Array;throw new Error(`Unsupported WebGL type: ${e}`)}_getBytesPerTexel(e,t){const{gl:r}=this;let s=0;return e===r.UNSIGNED_BYTE&&(s=1),e!==r.UNSIGNED_SHORT_4_4_4_4&&e!==r.UNSIGNED_SHORT_5_5_5_1&&e!==r.UNSIGNED_SHORT_5_6_5&&e!==r.UNSIGNED_SHORT&&e!==r.HALF_FLOAT||(s=2),e!==r.UNSIGNED_INT&&e!==r.FLOAT||(s=4),t===r.RGBA?4*s:t===r.RGB?3*s:t===r.ALPHA?s:void 0}}class Hv{constructor(e){this.backend=e,this.gl=this.backend.gl,this.availableExtensions=this.gl.getSupportedExtensions(),this.extensions={}}get(e){let t=this.extensions[e];return void 0===t&&(t=this.gl.getExtension(e),this.extensions[e]=t),t}has(e){return this.availableExtensions.includes(e)}}class Wv{constructor(e){this.backend=e,this.maxAnisotropy=null}getMaxAnisotropy(){if(null!==this.maxAnisotropy)return this.maxAnisotropy;const e=this.backend.gl,t=this.backend.extensions;if(!0===t.has("EXT_texture_filter_anisotropic")){const r=t.get("EXT_texture_filter_anisotropic");this.maxAnisotropy=e.getParameter(r.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else this.maxAnisotropy=0;return this.maxAnisotropy}}const jv={WEBGL_multi_draw:"WEBGL_multi_draw",WEBGL_compressed_texture_astc:"texture-compression-astc",WEBGL_compressed_texture_etc:"texture-compression-etc2",WEBGL_compressed_texture_etc1:"texture-compression-etc1",WEBGL_compressed_texture_pvrtc:"texture-compression-pvrtc",WEBKIT_WEBGL_compressed_texture_pvrtc:"texture-compression-pvrtc",WEBGL_compressed_texture_s3tc:"texture-compression-bc",EXT_texture_compression_bptc:"texture-compression-bptc",EXT_disjoint_timer_query_webgl2:"timestamp-query"};class qv{constructor(e){this.gl=e.gl,this.extensions=e.extensions,this.info=e.renderer.info,this.mode=null,this.index=0,this.type=null,this.object=null}render(e,t){const{gl:r,mode:s,object:i,type:n,info:a,index:o}=this;0!==o?r.drawElements(s,t,n,e):r.drawArrays(s,e,t),a.update(i,t,1)}renderInstances(e,t,r){const{gl:s,mode:i,type:n,index:a,object:o,info:u}=this;0!==r&&(0!==a?s.drawElementsInstanced(i,t,n,e,r):s.drawArraysInstanced(i,e,t,r),u.update(o,t,r))}renderMultiDraw(e,t,r){const{extensions:s,mode:i,object:n,info:a}=this;if(0===r)return;const o=s.get("WEBGL_multi_draw");if(null===o)for(let s=0;sthis.maxQueries)return ht(`WebGPUTimestampQueryPool [${this.type}]: Maximum number of queries exceeded, when using trackTimestamp it is necessary to resolves the queries via renderer.resolveTimestampsAsync( THREE.TimestampQuery.${this.type.toUpperCase()} ).`),null;const t=this.currentQueryIndex;return this.currentQueryIndex+=2,this.queryStates.set(t,"inactive"),this.queryOffsets.set(e.id,t),t}beginQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e.id);if(null==t)return;if(null!==this.activeQuery)return;const r=this.queries[t];if(r)try{"inactive"===this.queryStates.get(t)&&(this.gl.beginQuery(this.ext.TIME_ELAPSED_EXT,r),this.activeQuery=t,this.queryStates.set(t,"started"))}catch(e){console.error("Error in beginQuery:",e),this.activeQuery=null,this.queryStates.set(t,"inactive")}}endQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e.id);if(null!=t&&this.activeQuery===t)try{this.gl.endQuery(this.ext.TIME_ELAPSED_EXT),this.queryStates.set(t,"ended"),this.activeQuery=null}catch(e){console.error("Error in endQuery:",e),this.queryStates.set(t,"inactive"),this.activeQuery=null}}async resolveQueriesAsync(){if(!this.trackTimestamp||this.pendingResolve)return this.lastValue;this.pendingResolve=!0;try{const e=[];for(const[t,r]of this.queryStates)if("ended"===r){const r=this.queries[t];e.push(this.resolveQuery(r))}if(0===e.length)return this.lastValue;const t=(await Promise.all(e)).reduce(((e,t)=>e+t),0);return this.lastValue=t,this.currentQueryIndex=0,this.queryOffsets.clear(),this.queryStates.clear(),this.activeQuery=null,t}catch(e){return console.error("Error resolving queries:",e),this.lastValue}finally{this.pendingResolve=!1}}async resolveQuery(e){return new Promise((t=>{if(this.isDisposed)return void t(this.lastValue);let r,s=!1;const i=e=>{s||(s=!0,r&&(clearTimeout(r),r=null),t(e))},n=()=>{if(this.isDisposed)i(this.lastValue);else try{if(this.gl.getParameter(this.ext.GPU_DISJOINT_EXT))return void i(this.lastValue);if(!this.gl.getQueryParameter(e,this.gl.QUERY_RESULT_AVAILABLE))return void(r=setTimeout(n,1));const s=this.gl.getQueryParameter(e,this.gl.QUERY_RESULT);t(Number(s)/1e6)}catch(e){console.error("Error checking query:",e),t(this.lastValue)}};n()}))}dispose(){if(!this.isDisposed&&(this.isDisposed=!0,this.trackTimestamp)){for(const e of this.queries)this.gl.deleteQuery(e);this.queries=[],this.queryStates.clear(),this.queryOffsets.clear(),this.lastValue=0,this.activeQuery=null}}}class Yv extends Pv{constructor(e={}){super(e),this.isWebGLBackend=!0,this.attributeUtils=null,this.extensions=null,this.capabilities=null,this.textureUtils=null,this.bufferRenderer=null,this.gl=null,this.state=null,this.utils=null,this.vaoCache={},this.transformFeedbackCache={},this.discard=!1,this.disjoint=null,this.parallel=null,this._currentContext=null,this._knownBindings=new WeakSet,this._supportsInvalidateFramebuffer="undefined"!=typeof navigator&&/OculusBrowser/g.test(navigator.userAgent),this._xrFramebuffer=null}init(e){super.init(e);const t=this.parameters,r={antialias:e.samples>0,alpha:!0,depth:e.depth,stencil:e.stencil},s=void 0!==t.context?t.context:e.domElement.getContext("webgl2",r);function i(t){t.preventDefault();const r={api:"WebGL",message:t.statusMessage||"Unknown reason",reason:null,originalEvent:t};e.onDeviceLost(r)}this._onContextLost=i,e.domElement.addEventListener("webglcontextlost",i,!1),this.gl=s,this.extensions=new Hv(this),this.capabilities=new Wv(this),this.attributeUtils=new Dv(this),this.textureUtils=new $v(this),this.bufferRenderer=new qv(this),this.state=new Vv(this),this.utils=new Uv(this),this.extensions.get("EXT_color_buffer_float"),this.extensions.get("WEBGL_clip_cull_distance"),this.extensions.get("OES_texture_float_linear"),this.extensions.get("EXT_color_buffer_half_float"),this.extensions.get("WEBGL_multisampled_render_to_texture"),this.extensions.get("WEBGL_render_shared_exponent"),this.extensions.get("WEBGL_multi_draw"),this.disjoint=this.extensions.get("EXT_disjoint_timer_query_webgl2"),this.parallel=this.extensions.get("KHR_parallel_shader_compile")}get coordinateSystem(){return l}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}async waitForGPU(){await this.utils._clientWaitAsync()}async makeXRCompatible(){!0!==this.gl.getContextAttributes().xrCompatible&&await this.gl.makeXRCompatible()}setXRTarget(e){this._xrFramebuffer=e}setXRRenderTargetTextures(e,t,r=null){const s=this.gl;if(this.set(e.texture,{textureGPU:t,glInternalFormat:s.RGBA8}),null!==r){const t=e.stencilBuffer?s.DEPTH24_STENCIL8:s.DEPTH_COMPONENT24;this.set(e.depthTexture,{textureGPU:r,glInternalFormat:t}),!0===this.extensions.has("WEBGL_multisampled_render_to_texture")&&e.autoAllocateDepthBuffer&&console.warn("THREE.WebGLBackend: Render-to-texture extension was disabled because an external texture was provided"),e.autoAllocateDepthBuffer=!1}}initTimestampQuery(e){if(!this.disjoint||!this.trackTimestamp)return;const t=e.isComputeNode?"compute":"render";this.timestampQueryPool[t]||(this.timestampQueryPool[t]=new Kv(this.gl,t,2048));const r=this.timestampQueryPool[t];null!==r.allocateQueriesForContext(e)&&r.beginQuery(e)}prepareTimestampBuffer(e){if(!this.disjoint||!this.trackTimestamp)return;const t=e.isComputeNode?"compute":"render";this.timestampQueryPool[t].endQuery(e)}getContext(){return this.gl}beginRender(e){const{state:t,gl:r}=this,s=this.get(e);if(e.viewport?this.updateViewport(e):t.viewport(0,0,r.drawingBufferWidth,r.drawingBufferHeight),e.scissor){const{x:r,y:s,width:i,height:n}=e.scissorValue;t.scissor(r,e.height-n-s,i,n)}this.initTimestampQuery(e),s.previousContext=this._currentContext,this._currentContext=e,this._setFramebuffer(e),this.clear(e.clearColor,e.clearDepth,e.clearStencil,e,!1);const i=e.occlusionQueryCount;i>0&&(s.currentOcclusionQueries=s.occlusionQueries,s.currentOcclusionQueryObjects=s.occlusionQueryObjects,s.lastOcclusionObject=null,s.occlusionQueries=new Array(i),s.occlusionQueryObjects=new Array(i),s.occlusionQueryIndex=0)}finishRender(e){const{gl:t,state:r}=this,s=this.get(e),i=s.previousContext;r.resetVertexState();const n=e.occlusionQueryCount;n>0&&(n>s.occlusionQueryIndex&&t.endQuery(t.ANY_SAMPLES_PASSED),this.resolveOccludedAsync(e));const a=e.textures;if(null!==a)for(let e=0;e0&&!1===this._useMultisampledRTT(e.renderTarget)){const i=s.framebuffers[e.getCacheKey()],n=t.COLOR_BUFFER_BIT,a=s.msaaFrameBuffer,o=e.textures;r.bindFramebuffer(t.READ_FRAMEBUFFER,a),r.bindFramebuffer(t.DRAW_FRAMEBUFFER,i);for(let r=0;r{let a=0;for(let t=0;t{t.isBatchedMesh?null!==t._multiDrawInstances?(ht("THREE.WebGLBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection."),y.renderMultiDrawInstances(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount,t._multiDrawInstances)):this.hasFeature("WEBGL_multi_draw")?y.renderMultiDraw(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount):ht("THREE.WebGLRenderer: WEBGL_multi_draw not supported."):b>1?y.renderInstances(T,x,b):y.render(T,x)};if(e.camera.isArrayCamera&&e.camera.cameras.length>0){const r=this.get(e.camera),s=e.camera.cameras,i=e.getBindingGroup("cameraIndex").bindings[0];if(void 0===r.indexesGPU||r.indexesGPU.length!==s.length){const e=new Uint32Array([0,0,0,0]),t=[];for(let r=0,i=s.length;r{const i=this.parallel,n=()=>{r.getProgramParameter(a,i.COMPLETION_STATUS_KHR)?(this._completeCompile(e,s),t()):requestAnimationFrame(n)};n()}));t.push(i)}else this._completeCompile(e,s)}_handleSource(e,t){const r=e.split("\n"),s=[],i=Math.max(t-6,0),n=Math.min(t+6,r.length);for(let e=i;e":" "} ${i}: ${r[e]}`)}return s.join("\n")}_getShaderErrors(e,t,r){const s=e.getShaderParameter(t,e.COMPILE_STATUS),i=e.getShaderInfoLog(t).trim();if(s&&""===i)return"";const n=/ERROR: 0:(\d+)/.exec(i);if(n){const s=parseInt(n[1]);return r.toUpperCase()+"\n\n"+i+"\n\n"+this._handleSource(e.getShaderSource(t),s)}return i}_logProgramError(e,t,r){if(this.renderer.debug.checkShaderErrors){const s=this.gl,i=s.getProgramInfoLog(e).trim();if(!1===s.getProgramParameter(e,s.LINK_STATUS))if("function"==typeof this.renderer.debug.onShaderError)this.renderer.debug.onShaderError(s,e,r,t);else{const n=this._getShaderErrors(s,r,"vertex"),a=this._getShaderErrors(s,t,"fragment");console.error("THREE.WebGLProgram: Shader Error "+s.getError()+" - VALIDATE_STATUS "+s.getProgramParameter(e,s.VALIDATE_STATUS)+"\n\nProgram Info Log: "+i+"\n"+n+"\n"+a)}else""!==i&&console.warn("THREE.WebGLProgram: Program Info Log:",i)}}_completeCompile(e,t){const{state:r,gl:s}=this,i=this.get(t),{programGPU:n,fragmentShader:a,vertexShader:o}=i;!1===s.getProgramParameter(n,s.LINK_STATUS)&&this._logProgramError(n,a,o),r.useProgram(n);const u=e.getBindings();this._setupBindings(u,n),this.set(t,{programGPU:n})}createComputePipeline(e,t){const{state:r,gl:s}=this,i={stage:"fragment",code:"#version 300 es\nprecision highp float;\nvoid main() {}"};this.createProgram(i);const{computeProgram:n}=e,a=s.createProgram(),o=this.get(i).shaderGPU,u=this.get(n).shaderGPU,l=n.transforms,d=[],c=[];for(let e=0;ejv[t]===e)),r=this.extensions;for(let e=0;e0&&!1===y){if(void 0===g){const s=[];g=t.createFramebuffer(),r.bindFramebuffer(t.FRAMEBUFFER,g);const i=[],l=e.textures;for(let r=0;r0&&!0===this.extensions.has("WEBGL_multisampled_render_to_texture")&&!1!==e.autoAllocateDepthBuffer}dispose(){const e=this.extensions.get("WEBGL_lose_context");e&&e.loseContext(),this.renderer.domElement.removeEventListener("webglcontextlost",this._onContextLost)}}const Qv="point-list",Zv="line-list",Jv="line-strip",eN="triangle-list",tN="triangle-strip",rN="never",sN="less",iN="equal",nN="less-equal",aN="greater",oN="not-equal",uN="greater-equal",lN="always",dN="store",cN="load",hN="clear",pN="ccw",gN="none",mN="front",fN="back",yN="uint16",xN="uint32",bN="r8unorm",TN="r8snorm",_N="r8uint",vN="r8sint",NN="r16uint",SN="r16sint",EN="r16float",wN="rg8unorm",AN="rg8snorm",RN="rg8uint",CN="rg8sint",MN="r32uint",PN="r32sint",LN="r32float",FN="rg16uint",BN="rg16sint",IN="rg16float",DN="rgba8unorm",VN="rgba8unorm-srgb",UN="rgba8snorm",ON="rgba8uint",GN="rgba8sint",kN="bgra8unorm",zN="bgra8unorm-srgb",$N="rgb9e5ufloat",HN="rgb10a2unorm",WN="rgb10a2unorm",jN="rg32uint",qN="rg32sint",XN="rg32float",KN="rgba16uint",YN="rgba16sint",QN="rgba16float",ZN="rgba32uint",JN="rgba32sint",eS="rgba32float",tS="depth16unorm",rS="depth24plus",sS="depth24plus-stencil8",iS="depth32float",nS="depth32float-stencil8",aS="bc1-rgba-unorm",oS="bc1-rgba-unorm-srgb",uS="bc2-rgba-unorm",lS="bc2-rgba-unorm-srgb",dS="bc3-rgba-unorm",cS="bc3-rgba-unorm-srgb",hS="bc4-r-unorm",pS="bc4-r-snorm",gS="bc5-rg-unorm",mS="bc5-rg-snorm",fS="bc6h-rgb-ufloat",yS="bc6h-rgb-float",xS="bc7-rgba-unorm",bS="bc7-rgba-srgb",TS="etc2-rgb8unorm",_S="etc2-rgb8unorm-srgb",vS="etc2-rgb8a1unorm",NS="etc2-rgb8a1unorm-srgb",SS="etc2-rgba8unorm",ES="etc2-rgba8unorm-srgb",wS="eac-r11unorm",AS="eac-r11snorm",RS="eac-rg11unorm",CS="eac-rg11snorm",MS="astc-4x4-unorm",PS="astc-4x4-unorm-srgb",LS="astc-5x4-unorm",FS="astc-5x4-unorm-srgb",BS="astc-5x5-unorm",IS="astc-5x5-unorm-srgb",DS="astc-6x5-unorm",VS="astc-6x5-unorm-srgb",US="astc-6x6-unorm",OS="astc-6x6-unorm-srgb",GS="astc-8x5-unorm",kS="astc-8x5-unorm-srgb",zS="astc-8x6-unorm",$S="astc-8x6-unorm-srgb",HS="astc-8x8-unorm",WS="astc-8x8-unorm-srgb",jS="astc-10x5-unorm",qS="astc-10x5-unorm-srgb",XS="astc-10x6-unorm",KS="astc-10x6-unorm-srgb",YS="astc-10x8-unorm",QS="astc-10x8-unorm-srgb",ZS="astc-10x10-unorm",JS="astc-10x10-unorm-srgb",eE="astc-12x10-unorm",tE="astc-12x10-unorm-srgb",rE="astc-12x12-unorm",sE="astc-12x12-unorm-srgb",iE="clamp-to-edge",nE="repeat",aE="mirror-repeat",oE="linear",uE="nearest",lE="zero",dE="one",cE="src",hE="one-minus-src",pE="src-alpha",gE="one-minus-src-alpha",mE="dst",fE="one-minus-dst",yE="dst-alpha",xE="one-minus-dst-alpha",bE="src-alpha-saturated",TE="constant",_E="one-minus-constant",vE="add",NE="subtract",SE="reverse-subtract",EE="min",wE="max",AE=0,RE=15,CE="keep",ME="zero",PE="replace",LE="invert",FE="increment-clamp",BE="decrement-clamp",IE="increment-wrap",DE="decrement-wrap",VE="storage",UE="read-only-storage",OE="write-only",GE="read-only",kE="read-write",zE="float",$E="unfilterable-float",HE="depth",WE="sint",jE="uint",qE="2d",XE="3d",KE="2d",YE="2d-array",QE="cube",ZE="3d",JE="all",ew="vertex",tw="instance",rw={DepthClipControl:"depth-clip-control",Depth32FloatStencil8:"depth32float-stencil8",TextureCompressionBC:"texture-compression-bc",TextureCompressionETC2:"texture-compression-etc2",TextureCompressionASTC:"texture-compression-astc",TimestampQuery:"timestamp-query",IndirectFirstInstance:"indirect-first-instance",ShaderF16:"shader-f16",RG11B10UFloat:"rg11b10ufloat-renderable",BGRA8UNormStorage:"bgra8unorm-storage",Float32Filterable:"float32-filterable",ClipDistances:"clip-distances",DualSourceBlending:"dual-source-blending",Subgroups:"subgroups"};class sw extends cv{constructor(e,t){super(e),this.texture=t,this.version=t?t.version:0,this.isSampler=!0}}class iw extends sw{constructor(e,t,r){super(e,t?t.value:null),this.textureNode=t,this.groupNode=r}update(){this.texture=this.textureNode.value}}class nw extends hv{constructor(e,t){super(e,t?t.array:null),this.attribute=t,this.isStorageBuffer=!0}}let aw=0;class ow extends nw{constructor(e,t){super("StorageBuffer_"+aw++,e?e.value:null),this.nodeUniform=e,this.access=e?e.access:Vs.READ_WRITE,this.groupNode=t}get buffer(){return this.nodeUniform.value}}class uw extends Im{constructor(e){super(),this.device=e;this.mipmapSampler=e.createSampler({minFilter:oE}),this.flipYSampler=e.createSampler({minFilter:uE}),this.transferPipelines={},this.flipYPipelines={},this.mipmapVertexShaderModule=e.createShaderModule({label:"mipmapVertex",code:"\nstruct VarysStruct {\n\t@builtin( position ) Position: vec4,\n\t@location( 0 ) vTex : vec2\n};\n\n@vertex\nfn main( @builtin( vertex_index ) vertexIndex : u32 ) -> VarysStruct {\n\n\tvar Varys : VarysStruct;\n\n\tvar pos = array< vec2, 4 >(\n\t\tvec2( -1.0, 1.0 ),\n\t\tvec2( 1.0, 1.0 ),\n\t\tvec2( -1.0, -1.0 ),\n\t\tvec2( 1.0, -1.0 )\n\t);\n\n\tvar tex = array< vec2, 4 >(\n\t\tvec2( 0.0, 0.0 ),\n\t\tvec2( 1.0, 0.0 ),\n\t\tvec2( 0.0, 1.0 ),\n\t\tvec2( 1.0, 1.0 )\n\t);\n\n\tVarys.vTex = tex[ vertexIndex ];\n\tVarys.Position = vec4( pos[ vertexIndex ], 0.0, 1.0 );\n\n\treturn Varys;\n\n}\n"}),this.mipmapFragmentShaderModule=e.createShaderModule({label:"mipmapFragment",code:"\n@group( 0 ) @binding( 0 )\nvar imgSampler : sampler;\n\n@group( 0 ) @binding( 1 )\nvar img : texture_2d;\n\n@fragment\nfn main( @location( 0 ) vTex : vec2 ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( img, imgSampler, vTex );\n\n}\n"}),this.flipYFragmentShaderModule=e.createShaderModule({label:"flipYFragment",code:"\n@group( 0 ) @binding( 0 )\nvar imgSampler : sampler;\n\n@group( 0 ) @binding( 1 )\nvar img : texture_2d;\n\n@fragment\nfn main( @location( 0 ) vTex : vec2 ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( img, imgSampler, vec2( vTex.x, 1.0 - vTex.y ) );\n\n}\n"})}getTransferPipeline(e){let t=this.transferPipelines[e];return void 0===t&&(t=this.device.createRenderPipeline({label:`mipmap-${e}`,vertex:{module:this.mipmapVertexShaderModule,entryPoint:"main"},fragment:{module:this.mipmapFragmentShaderModule,entryPoint:"main",targets:[{format:e}]},primitive:{topology:tN,stripIndexFormat:xN},layout:"auto"}),this.transferPipelines[e]=t),t}getFlipYPipeline(e){let t=this.flipYPipelines[e];return void 0===t&&(t=this.device.createRenderPipeline({label:`flipY-${e}`,vertex:{module:this.mipmapVertexShaderModule,entryPoint:"main"},fragment:{module:this.flipYFragmentShaderModule,entryPoint:"main",targets:[{format:e}]},primitive:{topology:tN,stripIndexFormat:xN},layout:"auto"}),this.flipYPipelines[e]=t),t}flipY(e,t,r=0){const s=t.format,{width:i,height:n}=t.size,a=this.getTransferPipeline(s),o=this.getFlipYPipeline(s),u=this.device.createTexture({size:{width:i,height:n,depthOrArrayLayers:1},format:s,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING}),l=e.createView({baseMipLevel:0,mipLevelCount:1,dimension:KE,baseArrayLayer:r}),d=u.createView({baseMipLevel:0,mipLevelCount:1,dimension:KE,baseArrayLayer:0}),c=this.device.createCommandEncoder({}),h=(e,t,r)=>{const s=e.getBindGroupLayout(0),i=this.device.createBindGroup({layout:s,entries:[{binding:0,resource:this.flipYSampler},{binding:1,resource:t}]}),n=c.beginRenderPass({colorAttachments:[{view:r,loadOp:hN,storeOp:dN,clearValue:[0,0,0,0]}]});n.setPipeline(e),n.setBindGroup(0,i),n.draw(4,1,0,0),n.end()};h(a,l,d),h(o,d,l),this.device.queue.submit([c.finish()]),u.destroy()}generateMipmaps(e,t,r=0){const s=this.get(e);void 0===s.useCount&&(s.useCount=0,s.layers=[]);const i=s.layers[r]||this._mipmapCreateBundles(e,t,r),n=this.device.createCommandEncoder({});this._mipmapRunBundles(n,i),this.device.queue.submit([n.finish()]),0!==s.useCount&&(s.layers[r]=i),s.useCount++}_mipmapCreateBundles(e,t,r){const s=this.getTransferPipeline(t.format),i=s.getBindGroupLayout(0);let n=e.createView({baseMipLevel:0,mipLevelCount:1,dimension:KE,baseArrayLayer:r});const a=[];for(let o=1;o1;for(let a=0;a]*\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/i,gw=/([a-z_0-9]+)\s*:\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/gi,mw={f32:"float",i32:"int",u32:"uint",bool:"bool","vec2":"vec2","vec2":"ivec2","vec2":"uvec2","vec2":"bvec2",vec2f:"vec2",vec2i:"ivec2",vec2u:"uvec2",vec2b:"bvec2","vec3":"vec3","vec3":"ivec3","vec3":"uvec3","vec3":"bvec3",vec3f:"vec3",vec3i:"ivec3",vec3u:"uvec3",vec3b:"bvec3","vec4":"vec4","vec4":"ivec4","vec4":"uvec4","vec4":"bvec4",vec4f:"vec4",vec4i:"ivec4",vec4u:"uvec4",vec4b:"bvec4","mat2x2":"mat2",mat2x2f:"mat2","mat3x3":"mat3",mat3x3f:"mat3","mat4x4":"mat4",mat4x4f:"mat4",sampler:"sampler",texture_1d:"texture",texture_2d:"texture",texture_2d_array:"texture",texture_multisampled_2d:"cubeTexture",texture_depth_2d:"depthTexture",texture_depth_multisampled_2d:"depthTexture",texture_3d:"texture3D",texture_cube:"cubeTexture",texture_cube_array:"cubeTexture",texture_storage_1d:"storageTexture",texture_storage_2d:"storageTexture",texture_storage_2d_array:"storageTexture",texture_storage_3d:"storageTexture"};class fw extends C_{constructor(e){const{type:t,inputs:r,name:s,inputsCode:i,blockCode:n,outputType:a}=(e=>{const t=(e=e.trim()).match(pw);if(null!==t&&4===t.length){const r=t[2],s=[];let i=null;for(;null!==(i=gw.exec(r));)s.push({name:i[1],type:i[2]});const n=[];for(let e=0;e "+this.outputType:"";return`fn ${e} ( ${this.inputsCode.trim()} ) ${t}`+this.blockCode}}class yw extends R_{parseFunction(e){return new fw(e)}}const xw="undefined"!=typeof self?self.GPUShaderStage:{VERTEX:1,FRAGMENT:2,COMPUTE:4},bw={[Vs.READ_ONLY]:"read",[Vs.WRITE_ONLY]:"write",[Vs.READ_WRITE]:"read_write"},Tw={[Sr]:"repeat",[Nr]:"clamp",[vr]:"mirror"},_w={vertex:xw?xw.VERTEX:1,fragment:xw?xw.FRAGMENT:2,compute:xw?xw.COMPUTE:4},vw={instance:!0,swizzleAssign:!1,storageBuffer:!0},Nw={"^^":"tsl_xor"},Sw={float:"f32",int:"i32",uint:"u32",bool:"bool",color:"vec3",vec2:"vec2",ivec2:"vec2",uvec2:"vec2",bvec2:"vec2",vec3:"vec3",ivec3:"vec3",uvec3:"vec3",bvec3:"vec3",vec4:"vec4",ivec4:"vec4",uvec4:"vec4",bvec4:"vec4",mat2:"mat2x2",mat3:"mat3x3",mat4:"mat4x4"},Ew={},ww={tsl_xor:new px("fn tsl_xor( a : bool, b : bool ) -> bool { return ( a || b ) && !( a && b ); }"),mod_float:new px("fn tsl_mod_float( x : f32, y : f32 ) -> f32 { return x - y * floor( x / y ); }"),mod_vec2:new px("fn tsl_mod_vec2( x : vec2f, y : vec2f ) -> vec2f { return x - y * floor( x / y ); }"),mod_vec3:new px("fn tsl_mod_vec3( x : vec3f, y : vec3f ) -> vec3f { return x - y * floor( x / y ); }"),mod_vec4:new px("fn tsl_mod_vec4( x : vec4f, y : vec4f ) -> vec4f { return x - y * floor( x / y ); }"),equals_bool:new px("fn tsl_equals_bool( a : bool, b : bool ) -> bool { return a == b; }"),equals_bvec2:new px("fn tsl_equals_bvec2( a : vec2f, b : vec2f ) -> vec2 { return vec2( a.x == b.x, a.y == b.y ); }"),equals_bvec3:new px("fn tsl_equals_bvec3( a : vec3f, b : vec3f ) -> vec3 { return vec3( a.x == b.x, a.y == b.y, a.z == b.z ); }"),equals_bvec4:new px("fn tsl_equals_bvec4( a : vec4f, b : vec4f ) -> vec4 { return vec4( a.x == b.x, a.y == b.y, a.z == b.z, a.w == b.w ); }"),repeatWrapping_float:new px("fn tsl_repeatWrapping_float( coord: f32 ) -> f32 { return fract( coord ); }"),mirrorWrapping_float:new px("fn tsl_mirrorWrapping_float( coord: f32 ) -> f32 { let mirrored = fract( coord * 0.5 ) * 2.0; return 1.0 - abs( 1.0 - mirrored ); }"),clampWrapping_float:new px("fn tsl_clampWrapping_float( coord: f32 ) -> f32 { return clamp( coord, 0.0, 1.0 ); }"),biquadraticTexture:new px("\nfn tsl_biquadraticTexture( map : texture_2d, coord : vec2f, iRes : vec2u, level : u32 ) -> vec4f {\n\n\tlet res = vec2f( iRes );\n\n\tlet uvScaled = coord * res;\n\tlet uvWrapping = ( ( uvScaled % res ) + res ) % res;\n\n\t// https://www.shadertoy.com/view/WtyXRy\n\n\tlet uv = uvWrapping - 0.5;\n\tlet iuv = floor( uv );\n\tlet f = fract( uv );\n\n\tlet rg1 = textureLoad( map, vec2u( iuv + vec2( 0.5, 0.5 ) ) % iRes, level );\n\tlet rg2 = textureLoad( map, vec2u( iuv + vec2( 1.5, 0.5 ) ) % iRes, level );\n\tlet rg3 = textureLoad( map, vec2u( iuv + vec2( 0.5, 1.5 ) ) % iRes, level );\n\tlet rg4 = textureLoad( map, vec2u( iuv + vec2( 1.5, 1.5 ) ) % iRes, level );\n\n\treturn mix( mix( rg1, rg2, f.x ), mix( rg3, rg4, f.x ), f.y );\n\n}\n")},Aw={dFdx:"dpdx",dFdy:"- dpdy",mod_float:"tsl_mod_float",mod_vec2:"tsl_mod_vec2",mod_vec3:"tsl_mod_vec3",mod_vec4:"tsl_mod_vec4",equals_bool:"tsl_equals_bool",equals_bvec2:"tsl_equals_bvec2",equals_bvec3:"tsl_equals_bvec3",equals_bvec4:"tsl_equals_bvec4",inversesqrt:"inverseSqrt",bitcast:"bitcast"};"undefined"!=typeof navigator&&/Windows/g.test(navigator.userAgent)&&(ww.pow_float=new px("fn tsl_pow_float( a : f32, b : f32 ) -> f32 { return select( -pow( -a, b ), pow( a, b ), a > 0.0 ); }"),ww.pow_vec2=new px("fn tsl_pow_vec2( a : vec2f, b : vec2f ) -> vec2f { return vec2f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ) ); }",[ww.pow_float]),ww.pow_vec3=new px("fn tsl_pow_vec3( a : vec3f, b : vec3f ) -> vec3f { return vec3f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ), tsl_pow_float( a.z, b.z ) ); }",[ww.pow_float]),ww.pow_vec4=new px("fn tsl_pow_vec4( a : vec4f, b : vec4f ) -> vec4f { return vec4f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ), tsl_pow_float( a.z, b.z ), tsl_pow_float( a.w, b.w ) ); }",[ww.pow_float]),Aw.pow_float="tsl_pow_float",Aw.pow_vec2="tsl_pow_vec2",Aw.pow_vec3="tsl_pow_vec3",Aw.pow_vec4="tsl_pow_vec4");let Rw="";!0!==("undefined"!=typeof navigator&&/Firefox|Deno/g.test(navigator.userAgent))&&(Rw+="diagnostic( off, derivative_uniformity );\n");class Cw extends m_{constructor(e,t){super(e,t,new yw),this.uniformGroups={},this.builtins={},this.directives={},this.scopedArrays=new Map}needsToWorkingColorSpace(e){return!0===e.isVideoTexture&&e.colorSpace!==x}_generateTextureSample(e,t,r,s,i=this.shaderStage){return"fragment"===i?s?`textureSample( ${t}, ${t}_sampler, ${r}, ${s} )`:`textureSample( ${t}, ${t}_sampler, ${r} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r):this.generateTextureLod(e,t,r,s,"0")}_generateVideoSample(e,t,r=this.shaderStage){if("fragment"===r)return`textureSampleBaseClampToEdge( ${e}, ${e}_sampler, vec2( ${t}.x, 1.0 - ${t}.y ) )`;console.error(`WebGPURenderer: THREE.VideoTexture does not support ${r} shader.`)}_generateTextureSampleLevel(e,t,r,s,i,n=this.shaderStage){return"fragment"!==n&&"compute"!==n||!1!==this.isUnfilterable(e)?this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,s):this.generateTextureLod(e,t,r,i,s):`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`}generateWrapFunction(e){const t=`tsl_coord_${Tw[e.wrapS]}S_${Tw[e.wrapT]}_${e.isData3DTexture?"3d":"2d"}T`;let r=Ew[t];if(void 0===r){const s=[],i=e.isData3DTexture?"vec3f":"vec2f";let n=`fn ${t}( coord : ${i} ) -> ${i} {\n\n\treturn ${i}(\n`;const a=(e,t)=>{e===Sr?(s.push(ww.repeatWrapping_float),n+=`\t\ttsl_repeatWrapping_float( coord.${t} )`):e===Nr?(s.push(ww.clampWrapping_float),n+=`\t\ttsl_clampWrapping_float( coord.${t} )`):e===vr?(s.push(ww.mirrorWrapping_float),n+=`\t\ttsl_mirrorWrapping_float( coord.${t} )`):(n+=`\t\tcoord.${t}`,console.warn(`WebGPURenderer: Unsupported texture wrap type "${e}" for vertex shader.`))};a(e.wrapS,"x"),n+=",\n",a(e.wrapT,"y"),e.isData3DTexture&&(n+=",\n",a(e.wrapR,"z")),n+="\n\t);\n\n}\n",Ew[t]=r=new px(n,s)}return r.build(this),t}generateArrayDeclaration(e,t){return`array< ${this.getType(e)}, ${t} >`}generateTextureDimension(e,t,r){const s=this.getDataFromNode(e,this.shaderStage,this.globalCache);void 0===s.dimensionsSnippet&&(s.dimensionsSnippet={});let i=s.dimensionsSnippet[r];if(void 0===s.dimensionsSnippet[r]){let n,a;const{primarySamples:o}=this.renderer.backend.utils.getTextureSampleData(e),u=o>1;a=e.isData3DTexture?"vec3":"vec2",n=u||e.isVideoTexture||e.isStorageTexture?t:`${t}${r?`, u32( ${r} )`:""}`,i=new Wo(new Cu(`textureDimensions( ${n} )`,a)),s.dimensionsSnippet[r]=i,(e.isDataArrayTexture||e.isData3DTexture)&&(s.arrayLayerCount=new Wo(new Cu(`textureNumLayers(${t})`,"u32"))),e.isTextureCube&&(s.cubeFaceCount=new Wo(new Cu("6u","u32")))}return i.build(this)}generateFilteredTexture(e,t,r,s="0u"){this._include("biquadraticTexture");return`tsl_biquadraticTexture( ${t}, ${this.generateWrapFunction(e)}( ${r} ), ${this.generateTextureDimension(e,t,s)}, u32( ${s} ) )`}generateTextureLod(e,t,r,s,i="0u"){const n=this.generateWrapFunction(e),a=this.generateTextureDimension(e,t,i),o=e.isData3DTexture?"vec3":"vec2",u=`${o}(${n}(${r}) * ${o}(${a}))`;return this.generateTextureLoad(e,t,u,s,i)}generateTextureLoad(e,t,r,s,i="0u"){return!0===e.isVideoTexture||!0===e.isStorageTexture?`textureLoad( ${t}, ${r} )`:s?`textureLoad( ${t}, ${r}, ${s}, u32( ${i} ) )`:`textureLoad( ${t}, ${r}, u32( ${i} ) )`}generateTextureStore(e,t,r,s){return`textureStore( ${t}, ${r}, ${s} )`}isSampleCompare(e){return!0===e.isDepthTexture&&null!==e.compareFunction}isUnfilterable(e){return"float"!==this.getComponentTypeFromTexture(e)||!this.isAvailable("float32Filterable")&&!0===e.isDataTexture&&e.type===L||!1===this.isSampleCompare(e)&&e.minFilter===_&&e.magFilter===_||this.renderer.backend.utils.getTextureSampleData(e).primarySamples>1}generateTexture(e,t,r,s,i=this.shaderStage){let n=null;return n=!0===e.isVideoTexture?this._generateVideoSample(t,r,i):this.isUnfilterable(e)?this.generateTextureLod(e,t,r,s,"0",i):this._generateTextureSample(e,t,r,s,i),n}generateTextureGrad(e,t,r,s,i,n=this.shaderStage){if("fragment"===n)return`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${s[0]}, ${s[1]} )`;console.error(`WebGPURenderer: THREE.TextureNode.gradient() does not support ${n} shader.`)}generateTextureCompare(e,t,r,s,i,n=this.shaderStage){if("fragment"===n)return`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${s} )`;console.error(`WebGPURenderer: THREE.DepthTexture.compareFunction() does not support ${n} shader.`)}generateTextureLevel(e,t,r,s,i,n=this.shaderStage){let a=null;return a=!0===e.isVideoTexture?this._generateVideoSample(t,r,n):this._generateTextureSampleLevel(e,t,r,s,i,n),a}generateTextureBias(e,t,r,s,i,n=this.shaderStage){if("fragment"===n)return`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${s} )`;console.error(`WebGPURenderer: THREE.TextureNode.biasNode does not support ${n} shader.`)}getPropertyName(e,t=this.shaderStage){if(!0===e.isNodeVarying&&!0===e.needsInterpolation){if("vertex"===t)return`varyings.${e.name}`}else if(!0===e.isNodeUniform){const t=e.name,r=e.type;return"texture"===r||"cubeTexture"===r||"storageTexture"===r||"texture3D"===r?t:"buffer"===r||"storageBuffer"===r||"indirectStorageBuffer"===r?this.isCustomStruct(e)?t:t+".value":e.groupNode.name+"."+t}return super.getPropertyName(e)}getOutputStructName(){return"output"}getFunctionOperator(e){const t=Nw[e];return void 0!==t?(this._include(t),t):null}getNodeAccess(e,t){return"compute"!==t?Vs.READ_ONLY:e.access}getStorageAccess(e,t){return bw[this.getNodeAccess(e,t)]}getUniformFromNode(e,t,r,s=null){const i=super.getUniformFromNode(e,t,r,s),n=this.getDataFromNode(e,r,this.globalCache);if(void 0===n.uniformGPU){let a;const o=e.groupNode,u=o.name,l=this.getBindGroupArray(u,r);if("texture"===t||"cubeTexture"===t||"storageTexture"===t||"texture3D"===t){let s=null;const n=this.getNodeAccess(e,r);if("texture"===t||"storageTexture"===t?s=new _v(i.name,i.node,o,n):"cubeTexture"===t?s=new vv(i.name,i.node,o,n):"texture3D"===t&&(s=new Nv(i.name,i.node,o,n)),s.store=!0===e.isStorageTextureNode,s.setVisibility(_w[r]),"fragment"!==r&&"compute"!==r||!1!==this.isUnfilterable(e.value)||!1!==s.store)l.push(s),a=[s];else{const e=new iw(`${i.name}_sampler`,i.node,o);e.setVisibility(_w[r]),l.push(e,s),a=[e,s]}}else if("buffer"===t||"storageBuffer"===t||"indirectStorageBuffer"===t){const n=new("buffer"===t?mv:ow)(e,o);n.setVisibility(_w[r]),l.push(n),a=n,i.name=s||"NodeBuffer_"+i.id}else{const e=this.uniformGroups[r]||(this.uniformGroups[r]={});let s=e[u];void 0===s&&(s=new xv(u,o),s.setVisibility(_w[r]),e[u]=s,l.push(s)),a=this.getNodeUniform(i,t),s.addUniform(a)}n.uniformGPU=a}return i}getBuiltin(e,t,r,s=this.shaderStage){const i=this.builtins[s]||(this.builtins[s]=new Map);return!1===i.has(e)&&i.set(e,{name:e,property:t,type:r}),t}hasBuiltin(e,t=this.shaderStage){return void 0!==this.builtins[t]&&this.builtins[t].has(e)}getVertexIndex(){return"vertex"===this.shaderStage?this.getBuiltin("vertex_index","vertexIndex","u32","attribute"):"vertexIndex"}buildFunctionCode(e){const t=e.layout,r=this.flowShaderNode(e),s=[];for(const e of t.inputs)s.push(e.name+" : "+this.getType(e.type));let i=`fn ${t.name}( ${s.join(", ")} ) -> ${this.getType(t.type)} {\n${r.vars}\n${r.code}\n`;return r.result&&(i+=`\treturn ${r.result};\n`),i+="\n}\n",i}getInstanceIndex(){return"vertex"===this.shaderStage?this.getBuiltin("instance_index","instanceIndex","u32","attribute"):"instanceIndex"}getInvocationLocalIndex(){return this.getBuiltin("local_invocation_index","invocationLocalIndex","u32","attribute")}getSubgroupSize(){return this.enableSubGroups(),this.getBuiltin("subgroup_size","subgroupSize","u32","attribute")}getInvocationSubgroupIndex(){return this.enableSubGroups(),this.getBuiltin("subgroup_invocation_id","invocationSubgroupIndex","u32","attribute")}getSubgroupIndex(){return this.enableSubGroups(),this.getBuiltin("subgroup_id","subgroupIndex","u32","attribute")}getDrawIndex(){return null}getFrontFacing(){return this.getBuiltin("front_facing","isFront","bool")}getFragCoord(){return this.getBuiltin("position","fragCoord","vec4")+".xy"}getFragDepth(){return"output."+this.getBuiltin("frag_depth","depth","f32","output")}getClipDistance(){return"varyings.hw_clip_distances"}isFlipY(){return!1}enableDirective(e,t=this.shaderStage){(this.directives[t]||(this.directives[t]=new Set)).add(e)}getDirectives(e){const t=[],r=this.directives[e];if(void 0!==r)for(const e of r)t.push(`enable ${e};`);return t.join("\n")}enableSubGroups(){this.enableDirective("subgroups")}enableSubgroupsF16(){this.enableDirective("subgroups-f16")}enableClipDistances(){this.enableDirective("clip_distances")}enableShaderF16(){this.enableDirective("f16")}enableDualSourceBlending(){this.enableDirective("dual_source_blending")}enableHardwareClipping(e){this.enableClipDistances(),this.getBuiltin("clip_distances","hw_clip_distances",`array`,"vertex")}getBuiltins(e){const t=[],r=this.builtins[e];if(void 0!==r)for(const{name:e,property:s,type:i}of r.values())t.push(`@builtin( ${e} ) ${s} : ${i}`);return t.join(",\n\t")}getScopedArray(e,t,r,s){return!1===this.scopedArrays.has(e)&&this.scopedArrays.set(e,{name:e,scope:t,bufferType:r,bufferCount:s}),e}getScopedArrays(e){if("compute"!==e)return;const t=[];for(const{name:e,scope:r,bufferType:s,bufferCount:i}of this.scopedArrays.values()){const n=this.getType(s);t.push(`var<${r}> ${e}: array< ${n}, ${i} >;`)}return t.join("\n")}getAttributes(e){const t=[];if("compute"===e&&(this.getBuiltin("global_invocation_id","globalId","vec3","attribute"),this.getBuiltin("workgroup_id","workgroupId","vec3","attribute"),this.getBuiltin("local_invocation_id","localId","vec3","attribute"),this.getBuiltin("num_workgroups","numWorkgroups","vec3","attribute"),this.renderer.hasFeature("subgroups")&&(this.enableDirective("subgroups",e),this.getBuiltin("subgroup_size","subgroupSize","u32","attribute"))),"vertex"===e||"compute"===e){const e=this.getBuiltins("attribute");e&&t.push(e);const r=this.getAttributesArray();for(let e=0,s=r.length;e"),t.push(`\t${s+r.name} : ${i}`)}return e.output&&t.push(`\t${this.getBuiltins("output")}`),t.join(",\n")}getStructs(e){let t="";const r=this.structs[e];if(r.length>0){const e=[];for(const t of r){let r=`struct ${t.name} {\n`;r+=this.getStructMembers(t),r+="\n};",e.push(r)}t="\n"+e.join("\n\n")+"\n"}return t}getVar(e,t,r=null){let s=`var ${t} : `;return s+=null!==r?this.generateArrayDeclaration(e,r):this.getType(e),s}getVars(e){const t=[],r=this.vars[e];if(void 0!==r)for(const e of r)t.push(`\t${this.getVar(e.type,e.name,e.count)};`);return`\n${t.join("\n")}\n`}getVaryings(e){const t=[];if("vertex"===e&&this.getBuiltin("position","Vertex","vec4","vertex"),"vertex"===e||"fragment"===e){const r=this.varyings,s=this.vars[e];for(let i=0;i1&&(n="_multisampled"),!0===t.isCubeTexture)s="texture_cube";else if(!0===t.isDataArrayTexture||!0===t.isCompressedArrayTexture)s="texture_2d_array";else if(!0===t.isDepthTexture)s=`texture_depth${n}_2d`;else if(!0===t.isVideoTexture)s="texture_external";else if(!0===t.isData3DTexture)s="texture_3d";else if(!0===i.node.isStorageTextureNode){s=`texture_storage_2d<${hw(t)}, ${this.getStorageAccess(i.node,e)}>`}else{s=`texture${n}_2d<${this.getComponentTypeFromTexture(t).charAt(0)}32>`}r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name} : ${s};`)}else if("buffer"===i.type||"storageBuffer"===i.type||"indirectStorageBuffer"===i.type){const t=i.node,r=this.getType(t.getNodeType(this)),n=t.bufferCount,o=n>0&&"buffer"===i.type?", "+n:"",u=t.isStorageBufferNode?`storage, ${this.getStorageAccess(t,e)}`:"uniform";if(this.isCustomStruct(i))s.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var<${u}> ${i.name} : ${r};`);else{const e=`\tvalue : array< ${t.isAtomic?`atomic<${r}>`:`${r}`}${o} >`;s.push(this._getWGSLStructBinding(i.name,e,u,a.binding++,a.group))}}else{const e=this.getType(this.getVectorType(i.type)),t=i.groupNode.name;(n[t]||(n[t]={index:a.binding++,id:a.group,snippets:[]})).snippets.push(`\t${i.name} : ${e}`)}}for(const e in n){const t=n[e];i.push(this._getWGSLStructBinding(e,t.snippets.join(",\n"),"uniform",t.index,t.id))}let a=r.join("\n");return a+=s.join("\n"),a+=i.join("\n"),a}buildCode(){const e=null!==this.material?{fragment:{},vertex:{}}:{compute:{}};this.sortBindingGroups();for(const t in e){this.shaderStage=t;const r=e[t];r.uniforms=this.getUniforms(t),r.attributes=this.getAttributes(t),r.varyings=this.getVaryings(t),r.structs=this.getStructs(t),r.vars=this.getVars(t),r.codes=this.getCodes(t),r.directives=this.getDirectives(t),r.scopedArrays=this.getScopedArrays(t);let s="// code\n\n";s+=this.flowCode[t];const i=this.flowNodes[t],n=i[i.length-1],a=n.outputNode,o=void 0!==a&&!0===a.isOutputStructNode;for(const e of i){const i=this.getFlowData(e),u=e.name;if(u&&(s.length>0&&(s+="\n"),s+=`\t// flow -> ${u}\n`),s+=`${i.code}\n\t`,e===n&&"compute"!==t)if(s+="// result\n\n\t","vertex"===t)s+=`varyings.Vertex = ${i.result};`;else if("fragment"===t)if(o)r.returnType=a.getNodeType(this),r.structs+="var output : "+r.returnType+";",s+=`return ${i.result};`;else{let e="\t@location(0) color: vec4";const t=this.getBuiltins("output");t&&(e+=",\n\t"+t),r.returnType="OutputStruct",r.structs+=this._getWGSLStruct("OutputStruct",e),r.structs+="\nvar output : OutputStruct;",s+=`output.color = ${i.result};\n\n\treturn output;`}}r.flow=s}this.shaderStage=null,null!==this.material?(this.vertexShader=this._getWGSLVertexCode(e.vertex),this.fragmentShader=this._getWGSLFragmentCode(e.fragment)):this.computeShader=this._getWGSLComputeCode(e.compute,(this.object.workgroupSize||[64]).join(", "))}getMethod(e,t=null){let r;return null!==t&&(r=this._getWGSLMethod(e+"_"+t)),void 0===r&&(r=this._getWGSLMethod(e)),r||e}getType(e){return Sw[e]||e}isAvailable(e){let t=vw[e];return void 0===t&&("float32Filterable"===e?t=this.renderer.hasFeature("float32-filterable"):"clipDistance"===e&&(t=this.renderer.hasFeature("clip-distances")),vw[e]=t),t}_getWGSLMethod(e){return void 0!==ww[e]&&this._include(e),Aw[e]}_include(e){const t=ww[e];return t.build(this),null!==this.currentFunctionNode&&this.currentFunctionNode.includes.push(t),t}_getWGSLVertexCode(e){return`${this.getSignature()}\n// directives\n${e.directives}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\n\n// varyings\n${e.varyings}\nvar varyings : VaryingsStruct;\n\n// codes\n${e.codes}\n\n@vertex\nfn main( ${e.attributes} ) -> VaryingsStruct {\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n\treturn varyings;\n\n}\n`}_getWGSLFragmentCode(e){return`${this.getSignature()}\n// global\n${Rw}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\n\n// codes\n${e.codes}\n\n@fragment\nfn main( ${e.varyings} ) -> ${e.returnType} {\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n}\n`}_getWGSLComputeCode(e,t){return`${this.getSignature()}\n// directives\n${e.directives}\n\n// system\nvar instanceIndex : u32;\n\n// locals\n${e.scopedArrays}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\n\n// codes\n${e.codes}\n\n@compute @workgroup_size( ${t} )\nfn main( ${e.attributes} ) {\n\n\t// system\n\tinstanceIndex = globalId.x + globalId.y * numWorkgroups.x * u32(${t}) + globalId.z * numWorkgroups.x * numWorkgroups.y * u32(${t});\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n}\n`}_getWGSLStruct(e,t){return`\nstruct ${e} {\n${t}\n};`}_getWGSLStructBinding(e,t,r,s=0,i=0){const n=e+"Struct";return`${this._getWGSLStruct(n,t)}\n@binding( ${s} ) @group( ${i} )\nvar<${r}> ${e} : ${n};`}}class Mw{constructor(e){this.backend=e}getCurrentDepthStencilFormat(e){let t;return null!==e.depthTexture?t=this.getTextureFormatGPU(e.depthTexture):e.depth&&e.stencil?t=sS:e.depth&&(t=rS),t}getTextureFormatGPU(e){return this.backend.get(e).format}getTextureSampleData(e){let t;if(e.isFramebufferTexture)t=1;else if(e.isDepthTexture&&!e.renderTarget){const e=this.backend.renderer,r=e.getRenderTarget();t=r?r.samples:e.samples}else e.renderTarget&&(t=e.renderTarget.samples);t=t||1;const r=t>1&&null!==e.renderTarget&&!0!==e.isDepthTexture&&!0!==e.isFramebufferTexture;return{samples:t,primarySamples:r?1:t,isMSAA:r}}getCurrentColorFormat(e){let t;return t=null!==e.textures?this.getTextureFormatGPU(e.textures[0]):this.getPreferredCanvasFormat(),t}getCurrentColorSpace(e){return null!==e.textures?e.textures[0].colorSpace:this.backend.renderer.outputColorSpace}getPrimitiveTopology(e,t){return e.isPoints?Qv:e.isLineSegments||e.isMesh&&!0===t.wireframe?Zv:e.isLine?Jv:e.isMesh?eN:void 0}getSampleCount(e){let t=1;return e>1&&(t=Math.pow(2,Math.floor(Math.log2(e))),2===t&&(t=4)),t}getSampleCountRenderContext(e){return null!==e.textures?this.getSampleCount(e.sampleCount):this.getSampleCount(this.backend.renderer.samples)}getPreferredCanvasFormat(){const e=this.backend.parameters.outputType;if(void 0===e)return navigator.gpu.getPreferredCanvasFormat();if(e===Ce)return kN;if(e===he)return QN;throw new Error("Unsupported outputType")}}const Pw=new Map([[Int8Array,["sint8","snorm8"]],[Uint8Array,["uint8","unorm8"]],[Int16Array,["sint16","snorm16"]],[Uint16Array,["uint16","unorm16"]],[Int32Array,["sint32","snorm32"]],[Uint32Array,["uint32","unorm32"]],[Float32Array,["float32"]]]),Lw=new Map([[ze,["float16"]]]),Fw=new Map([[Int32Array,"sint32"],[Int16Array,"sint32"],[Uint32Array,"uint32"],[Uint16Array,"uint32"],[Float32Array,"float32"]]);class Bw{constructor(e){this.backend=e}createAttribute(e,t){const r=this._getBufferAttribute(e),s=this.backend,i=s.get(r);let n=i.buffer;if(void 0===n){const a=s.device;let o=r.array;if(!1===e.normalized)if(o.constructor===Int16Array||o.constructor===Int8Array)o=new Int32Array(o);else if((o.constructor===Uint16Array||o.constructor===Uint8Array)&&(o=new Uint32Array(o),t&GPUBufferUsage.INDEX))for(let e=0;e1&&(s.multisampled=!0,r.texture.isDepthTexture||(s.sampleType=$E)),r.texture.isDepthTexture)s.sampleType=HE;else if(r.texture.isDataTexture||r.texture.isDataArrayTexture||r.texture.isData3DTexture){const e=r.texture.type;e===T?s.sampleType=WE:e===b?s.sampleType=jE:e===L&&(this.backend.hasFeature("float32-filterable")?s.sampleType=zE:s.sampleType=$E)}r.isSampledCubeTexture?s.viewDimension=QE:r.texture.isDataArrayTexture||r.texture.isCompressedArrayTexture?s.viewDimension=YE:r.isSampledTexture3D&&(s.viewDimension=ZE),e.texture=s}else console.error(`WebGPUBindingUtils: Unsupported binding "${r}".`);s.push(e)}return r.createBindGroupLayout({entries:s})}createBindings(e,t,r,s=0){const{backend:i,bindGroupLayoutCache:n}=this,a=i.get(e);let o,u=n.get(e.bindingsReference);void 0===u&&(u=this.createBindingsLayout(e),n.set(e.bindingsReference,u)),r>0&&(void 0===a.groups&&(a.groups=[],a.versions=[]),a.versions[r]===s&&(o=a.groups[r])),void 0===o&&(o=this.createBindGroup(e,u),r>0&&(a.groups[r]=o,a.versions[r]=s)),a.group=o,a.layout=u}updateBinding(e){const t=this.backend,r=t.device,s=e.buffer,i=t.get(e).buffer;r.queue.writeBuffer(i,0,s,0)}createBindGroupIndex(e,t){const r=this.backend.device,s=GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,i=e[0],n=r.createBuffer({label:"bindingCameraIndex_"+i,size:16,usage:s});r.queue.writeBuffer(n,0,e,0);const a=[{binding:0,resource:{buffer:n}}];return r.createBindGroup({label:"bindGroupCameraIndex_"+i,layout:t,entries:a})}createBindGroup(e,t){const r=this.backend,s=r.device;let i=0;const n=[];for(const t of e.bindings){if(t.isUniformBuffer){const e=r.get(t);if(void 0===e.buffer){const r=t.byteLength,i=GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,n=s.createBuffer({label:"bindingBuffer_"+t.name,size:r,usage:i});e.buffer=n}n.push({binding:i,resource:{buffer:e.buffer}})}else if(t.isStorageBuffer){const e=r.get(t);if(void 0===e.buffer){const s=t.attribute;e.buffer=r.get(s).buffer}n.push({binding:i,resource:{buffer:e.buffer}})}else if(t.isSampler){const e=r.get(t.texture);n.push({binding:i,resource:e.sampler})}else if(t.isSampledTexture){const e=r.get(t.texture);let a;if(void 0!==e.externalTexture)a=s.importExternalTexture({source:e.externalTexture});else{const r=t.store?1:e.texture.mipLevelCount,s=`view-${e.texture.width}-${e.texture.height}-${r}`;if(a=e[s],void 0===a){const i=JE;let n;n=t.isSampledCubeTexture?QE:t.isSampledTexture3D?ZE:t.texture.isDataArrayTexture||t.texture.isCompressedArrayTexture?YE:KE,a=e[s]=e.texture.createView({aspect:i,dimension:n,mipLevelCount:r})}}n.push({binding:i,resource:a})}i++}return s.createBindGroup({label:"bindGroup_"+e.name,layout:t,entries:n})}}class Dw{constructor(e){this.backend=e}_getSampleCount(e){return this.backend.utils.getSampleCountRenderContext(e)}createRenderPipeline(e,t){const{object:r,material:s,geometry:i,pipeline:n}=e,{vertexProgram:a,fragmentProgram:o}=n,u=this.backend,l=u.device,d=u.utils,c=u.get(n),h=[];for(const t of e.getBindings()){const e=u.get(t);h.push(e.layout)}const p=u.attributeUtils.createShaderVertexBuffers(e);let g;!0===s.transparent&&s.blending!==G&&(g=this._getBlending(s));let m={};!0===s.stencilWrite&&(m={compare:this._getStencilCompare(s),failOp:this._getStencilOperation(s.stencilFail),depthFailOp:this._getStencilOperation(s.stencilZFail),passOp:this._getStencilOperation(s.stencilZPass)});const f=this._getColorWriteMask(s),y=[];if(null!==e.context.textures){const t=e.context.textures;for(let e=0;e1},layout:l.createPipelineLayout({bindGroupLayouts:h})},E={},w=e.context.depth,A=e.context.stencil;if(!0!==w&&!0!==A||(!0===w&&(E.format=v,E.depthWriteEnabled=s.depthWrite,E.depthCompare=_),!0===A&&(E.stencilFront=m,E.stencilBack={},E.stencilReadMask=s.stencilFuncMask,E.stencilWriteMask=s.stencilWriteMask),!0===s.polygonOffset&&(E.depthBias=s.polygonOffsetUnits,E.depthBiasSlopeScale=s.polygonOffsetFactor,E.depthBiasClamp=0),S.depthStencil=E),null===t)c.pipeline=l.createRenderPipeline(S);else{const e=new Promise((e=>{l.createRenderPipelineAsync(S).then((t=>{c.pipeline=t,e()}))}));t.push(e)}}createBundleEncoder(e){const t=this.backend,{utils:r,device:s}=t,i=r.getCurrentDepthStencilFormat(e),n={label:"renderBundleEncoder",colorFormats:[r.getCurrentColorFormat(e)],depthStencilFormat:i,sampleCount:this._getSampleCount(e)};return s.createRenderBundleEncoder(n)}createComputePipeline(e,t){const r=this.backend,s=r.device,i=r.get(e.computeProgram).module,n=r.get(e),a=[];for(const e of t){const t=r.get(e);a.push(t.layout)}n.pipeline=s.createComputePipeline({compute:i,layout:s.createPipelineLayout({bindGroupLayouts:a})})}_getBlending(e){let t,r;const s=e.blending,i=e.blendSrc,n=e.blendDst,a=e.blendEquation;if(s===qe){const s=null!==e.blendSrcAlpha?e.blendSrcAlpha:i,o=null!==e.blendDstAlpha?e.blendDstAlpha:n,u=null!==e.blendEquationAlpha?e.blendEquationAlpha:a;t={srcFactor:this._getBlendFactor(i),dstFactor:this._getBlendFactor(n),operation:this._getBlendOperation(a)},r={srcFactor:this._getBlendFactor(s),dstFactor:this._getBlendFactor(o),operation:this._getBlendOperation(u)}}else{const i=(e,s,i,n)=>{t={srcFactor:e,dstFactor:s,operation:vE},r={srcFactor:i,dstFactor:n,operation:vE}};if(e.premultipliedAlpha)switch(s){case V:i(dE,gE,dE,gE);break;case Pt:i(dE,dE,dE,dE);break;case Mt:i(lE,hE,lE,dE);break;case Ct:i(lE,cE,lE,pE)}else switch(s){case V:i(pE,gE,dE,gE);break;case Pt:i(pE,dE,pE,dE);break;case Mt:i(lE,hE,lE,dE);break;case Ct:i(lE,cE,lE,cE)}}if(void 0!==t&&void 0!==r)return{color:t,alpha:r};console.error("THREE.WebGPURenderer: Invalid blending: ",s)}_getBlendFactor(e){let t;switch(e){case Ke:t=lE;break;case Et:t=dE;break;case St:t=cE;break;case bt:t=hE;break;case Nt:t=pE;break;case xt:t=gE;break;case _t:t=mE;break;case yt:t=fE;break;case Tt:t=yE;break;case ft:t=xE;break;case vt:t=bE;break;case 211:t=TE;break;case 212:t=_E;break;default:console.error("THREE.WebGPURenderer: Blend factor not supported.",e)}return t}_getStencilCompare(e){let t;const r=e.stencilFunc;switch(r){case Gr:t=rN;break;case Or:t=lN;break;case Ur:t=sN;break;case Vr:t=nN;break;case Dr:t=iN;break;case Ir:t=uN;break;case Br:t=aN;break;case Fr:t=oN;break;default:console.error("THREE.WebGPURenderer: Invalid stencil function.",r)}return t}_getStencilOperation(e){let t;switch(e){case Xr:t=CE;break;case qr:t=ME;break;case jr:t=PE;break;case Wr:t=LE;break;case Hr:t=FE;break;case $r:t=BE;break;case zr:t=IE;break;case kr:t=DE;break;default:console.error("THREE.WebGPURenderer: Invalid stencil operation.",t)}return t}_getBlendOperation(e){let t;switch(e){case Xe:t=vE;break;case mt:t=NE;break;case gt:t=SE;break;case Yr:t=EE;break;case Kr:t=wE;break;default:console.error("THREE.WebGPUPipelineUtils: Blend equation not supported.",e)}return t}_getPrimitiveState(e,t,r){const s={},i=this.backend.utils;switch(s.topology=i.getPrimitiveTopology(e,r),null!==t.index&&!0===e.isLine&&!0!==e.isLineSegments&&(s.stripIndexFormat=t.index.array instanceof Uint16Array?yN:xN),r.side){case je:s.frontFace=pN,s.cullMode=fN;break;case N:s.frontFace=pN,s.cullMode=mN;break;case Se:s.frontFace=pN,s.cullMode=gN;break;default:console.error("THREE.WebGPUPipelineUtils: Unknown material.side value.",r.side)}return s}_getColorWriteMask(e){return!0===e.colorWrite?RE:AE}_getDepthCompare(e){let t;if(!1===e.depthTest)t=lN;else{const r=e.depthFunc;switch(r){case Ot:t=rN;break;case Ut:t=lN;break;case Vt:t=sN;break;case Dt:t=nN;break;case It:t=iN;break;case Bt:t=uN;break;case Ft:t=aN;break;case Lt:t=oN;break;default:console.error("THREE.WebGPUPipelineUtils: Invalid depth function.",r)}}return t}}class Vw extends Xv{constructor(e,t,r=2048){super(r),this.device=e,this.type=t,this.querySet=this.device.createQuerySet({type:"timestamp",count:this.maxQueries,label:`queryset_global_timestamp_${t}`});const s=8*this.maxQueries;this.resolveBuffer=this.device.createBuffer({label:`buffer_timestamp_resolve_${t}`,size:s,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC}),this.resultBuffer=this.device.createBuffer({label:`buffer_timestamp_result_${t}`,size:s,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ})}allocateQueriesForContext(e){if(!this.trackTimestamp||this.isDisposed)return null;if(this.currentQueryIndex+2>this.maxQueries)return ht(`WebGPUTimestampQueryPool [${this.type}]: Maximum number of queries exceeded, when using trackTimestamp it is necessary to resolves the queries via renderer.resolveTimestampsAsync( THREE.TimestampQuery.${this.type.toUpperCase()} ).`),null;const t=this.currentQueryIndex;return this.currentQueryIndex+=2,this.queryOffsets.set(e.id,t),t}async resolveQueriesAsync(){if(!this.trackTimestamp||0===this.currentQueryIndex||this.isDisposed)return this.lastValue;if(this.pendingResolve)return this.pendingResolve;this.pendingResolve=this._resolveQueries();try{return await this.pendingResolve}finally{this.pendingResolve=null}}async _resolveQueries(){if(this.isDisposed)return this.lastValue;try{if("unmapped"!==this.resultBuffer.mapState)return this.lastValue;const e=new Map(this.queryOffsets),t=this.currentQueryIndex,r=8*t;this.currentQueryIndex=0,this.queryOffsets.clear();const s=this.device.createCommandEncoder();s.resolveQuerySet(this.querySet,0,t,this.resolveBuffer,0),s.copyBufferToBuffer(this.resolveBuffer,0,this.resultBuffer,0,r);const i=s.finish();if(this.device.queue.submit([i]),"unmapped"!==this.resultBuffer.mapState)return this.lastValue;if(await this.resultBuffer.mapAsync(GPUMapMode.READ,0,r),this.isDisposed)return"mapped"===this.resultBuffer.mapState&&this.resultBuffer.unmap(),this.lastValue;const n=new BigUint64Array(this.resultBuffer.getMappedRange(0,r));let a=0;for(const[,t]of e){const e=n[t],r=n[t+1];a+=Number(r-e)/1e6}return this.resultBuffer.unmap(),this.lastValue=a,a}catch(e){return console.error("Error resolving queries:",e),"mapped"===this.resultBuffer.mapState&&this.resultBuffer.unmap(),this.lastValue}}async dispose(){if(!this.isDisposed){if(this.isDisposed=!0,this.pendingResolve)try{await this.pendingResolve}catch(e){console.error("Error waiting for pending resolve:",e)}if(this.resultBuffer&&"mapped"===this.resultBuffer.mapState)try{this.resultBuffer.unmap()}catch(e){console.error("Error unmapping buffer:",e)}this.querySet&&(this.querySet.destroy(),this.querySet=null),this.resolveBuffer&&(this.resolveBuffer.destroy(),this.resolveBuffer=null),this.resultBuffer&&(this.resultBuffer.destroy(),this.resultBuffer=null),this.queryOffsets.clear(),this.pendingResolve=null}}}class Uw extends Pv{constructor(e={}){super(e),this.isWebGPUBackend=!0,this.parameters.alpha=void 0===e.alpha||e.alpha,this.parameters.requiredLimits=void 0===e.requiredLimits?{}:e.requiredLimits,this.device=null,this.context=null,this.colorBuffer=null,this.defaultRenderPassdescriptor=null,this.utils=new Mw(this),this.attributeUtils=new Bw(this),this.bindingUtils=new Iw(this),this.pipelineUtils=new Dw(this),this.textureUtils=new cw(this),this.occludedResolveCache=new Map}async init(e){await super.init(e);const t=this.parameters;let r;if(void 0===t.device){const e={powerPreference:t.powerPreference},s="undefined"!=typeof navigator?await navigator.gpu.requestAdapter(e):null;if(null===s)throw new Error("WebGPUBackend: Unable to create WebGPU adapter.");const i=Object.values(rw).filter((e=>s.features.has(e)));r=await s.requestDevice({requiredFeatures:i,requiredLimits:t.requiredLimits})}else r=t.device;r.lost.then((t=>{e.onDeviceLost({api:"WebGPU",message:t.message||"Unknown reason",reason:t.reason||null,originalEvent:t})}));const s=void 0!==t.context?t.context:e.domElement.getContext("webgpu");this.device=r,this.context=s;const i=t.alpha?"premultiplied":"opaque";this.trackTimestamp=this.trackTimestamp&&this.hasFeature(rw.TimestampQuery),this.context.configure({device:this.device,format:this.utils.getPreferredCanvasFormat(),usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.COPY_SRC,alphaMode:i}),"undefined"!=typeof window&&"checkWebGPUState"in window&&checkWebGPUState(),this.updateSize()}get coordinateSystem(){return d}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}getContext(){return this.context}_getDefaultRenderPassDescriptor(){let e=this.defaultRenderPassdescriptor;if(null===e){const t=this.renderer;e={colorAttachments:[{view:null}]},!0!==this.renderer.depth&&!0!==this.renderer.stencil||(e.depthStencilAttachment={view:this.textureUtils.getDepthBuffer(t.depth,t.stencil).createView()});const r=e.colorAttachments[0];this.renderer.samples>0?r.view=this.colorBuffer.createView():r.resolveTarget=void 0,this.defaultRenderPassdescriptor=e}const t=e.colorAttachments[0];return this.renderer.samples>0?t.resolveTarget=this.context.getCurrentTexture().createView():t.view=this.context.getCurrentTexture().createView(),e}_getRenderPassDescriptor(e,t={}){const r=e.renderTarget,s=this.get(r);let i=s.descriptors;if(void 0===i||s.width!==r.width||s.height!==r.height||s.dimensions!==r.dimensions||s.activeMipmapLevel!==e.activeMipmapLevel||s.activeCubeFace!==e.activeCubeFace||s.samples!==r.samples){i={},s.descriptors=i;const e=()=>{r.removeEventListener("dispose",e),this.delete(r)};!1===r.hasEventListener("dispose",e)&&r.addEventListener("dispose",e)}const n=e.getCacheKey();let a=i[n];if(void 0===a){const t=e.textures,o=[];let u;for(let s=0;s0&&(t.currentOcclusionQuerySet&&t.currentOcclusionQuerySet.destroy(),t.currentOcclusionQueryBuffer&&t.currentOcclusionQueryBuffer.destroy(),t.currentOcclusionQuerySet=t.occlusionQuerySet,t.currentOcclusionQueryBuffer=t.occlusionQueryBuffer,t.currentOcclusionQueryObjects=t.occlusionQueryObjects,i=r.createQuerySet({type:"occlusion",count:s,label:`occlusionQuerySet_${e.id}`}),t.occlusionQuerySet=i,t.occlusionQueryIndex=0,t.occlusionQueryObjects=new Array(s),t.lastOcclusionObject=null),n=null===e.textures?this._getDefaultRenderPassDescriptor():this._getRenderPassDescriptor(e,{loadOp:cN}),this.initTimestampQuery(e,n),n.occlusionQuerySet=i;const a=n.depthStencilAttachment;if(null!==e.textures){const t=n.colorAttachments;for(let r=0;r0&&t.currentPass.executeBundles(t.renderBundles),r>t.occlusionQueryIndex&&t.currentPass.endOcclusionQuery(),t.currentPass.end(),r>0){const s=8*r;let i=this.occludedResolveCache.get(s);void 0===i&&(i=this.device.createBuffer({size:s,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC}),this.occludedResolveCache.set(s,i));const n=this.device.createBuffer({size:s,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});t.encoder.resolveQuerySet(t.occlusionQuerySet,0,r,i,0),t.encoder.copyBufferToBuffer(i,0,n,0,s),t.occlusionQueryBuffer=n,this.resolveOccludedAsync(e)}if(this.device.queue.submit([t.encoder.finish()]),null!==e.textures){const t=e.textures;for(let e=0;ea?(u.x=Math.min(t.dispatchCount,a),u.y=Math.ceil(t.dispatchCount/a)):u.x=t.dispatchCount,i.dispatchWorkgroups(u.x,u.y,u.z)}finishCompute(e){const t=this.get(e);t.passEncoderGPU.end(),this.device.queue.submit([t.cmdEncoderGPU.finish()])}async waitForGPU(){await this.device.queue.onSubmittedWorkDone()}draw(e,t){const{object:r,material:s,context:i,pipeline:n}=e,a=e.getBindings(),o=this.get(i),u=this.get(n).pipeline,l=o.currentSets,d=o.currentPass,c=e.getDrawParameters();if(null===c)return;l.pipeline!==u&&(d.setPipeline(u),l.pipeline=u);const h=l.bindingGroups;for(let e=0,t=a.length;e{if(!0===r.isBatchedMesh){const e=r._multiDrawStarts,s=r._multiDrawCounts,i=r._multiDrawCount,n=r._multiDrawInstances;null!==n&&ht("THREE.WebGPUBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.");for(let a=0;a1?0:a;!0===g?d.drawIndexed(s[a],i,e[a]/p.array.BYTES_PER_ELEMENT,0,o):d.draw(s[a],i,e[a],o),t.update(r,s[a],i)}}else if(!0===g){const{vertexCount:s,instanceCount:i,firstVertex:n}=c,a=e.getIndirect();if(null!==a){const e=this.get(a).buffer;d.drawIndexedIndirect(e,0)}else d.drawIndexed(s,i,n,0,0);t.update(r,s,i)}else{const{vertexCount:s,instanceCount:i,firstVertex:n}=c,a=e.getIndirect();if(null!==a){const e=this.get(a).buffer;d.drawIndirect(e,0)}else d.draw(s,i,n,0);t.update(r,s,i)}};if(e.camera.isArrayCamera&&e.camera.cameras.length>0){const t=this.get(e.camera),s=e.camera.cameras,n=e.getBindingGroup("cameraIndex");if(void 0===t.indexesGPU||t.indexesGPU.length!==s.length){const e=this.get(n),r=[],i=new Uint32Array([0,0,0,0]);for(let t=0,n=s.length;t(console.warn("THREE.WebGPURenderer: WebGPU is not available, running under WebGL2 backend."),new Yv(e)));super(new t(e),e),this.library=new Gw,this.isWebGPURenderer=!0}}class zw extends ds{constructor(){super(),this.isBundleGroup=!0,this.type="BundleGroup",this.static=!0,this.version=0}set needsUpdate(e){!0===e&&this.version++}}class $w{constructor(e,t=tn(0,0,1,1)){this.renderer=e,this.outputNode=t,this.outputColorTransform=!0,this.needsUpdate=!0;const r=new Fh;r.name="PostProcessing",this._quadMesh=new dy(r)}render(){this._update();const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=p,e.outputColorSpace=de;const s=e.xr.enabled;e.xr.enabled=!1,this._quadMesh.render(e),e.xr.enabled=s,e.toneMapping=t,e.outputColorSpace=r}dispose(){this._quadMesh.material.dispose()}_update(){if(!0===this.needsUpdate){const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;this._quadMesh.material.fragmentNode=!0===this.outputColorTransform?Fu(this.outputNode,t,r):this.outputNode.context({toneMapping:t,outputColorSpace:r}),this._quadMesh.material.needsUpdate=!0,this.needsUpdate=!1}}async renderAsync(){this._update();const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=p,e.outputColorSpace=de;const s=e.xr.enabled;e.xr.enabled=!1,await this._quadMesh.renderAsync(e),e.xr.enabled=s,e.toneMapping=t,e.outputColorSpace=r}}class Hw extends pe{constructor(e=1,t=1){super(),this.image={width:e,height:t},this.magFilter=q,this.minFilter=q,this.isStorageTexture=!0}}class Ww extends xy{constructor(e,t){super(e,t,Uint32Array),this.isIndirectStorageBufferAttribute=!0}}class jw extends cs{constructor(e){super(e),this.textures={},this.nodes={}}load(e,t,r,s){const i=new hs(this.manager);i.setPath(this.path),i.setRequestHeader(this.requestHeader),i.setWithCredentials(this.withCredentials),i.load(e,(r=>{try{t(this.parse(JSON.parse(r)))}catch(t){s?s(t):console.error(t),this.manager.itemError(e)}}),r,s)}parseNodes(e){const t={};if(void 0!==e){for(const r of e){const{uuid:e,type:s}=r;t[e]=this.createNodeFromType(s),t[e].uuid=e}const r={nodes:t,textures:this.textures};for(const s of e){s.meta=r;t[s.uuid].deserialize(s),delete s.meta}}return t}parse(e){const t=this.createNodeFromType(e.type);t.uuid=e.uuid;const r={nodes:this.parseNodes(e.nodes),textures:this.textures};return e.meta=r,t.deserialize(e),delete e.meta,t}setTextures(e){return this.textures=e,this}setNodes(e){return this.nodes=e,this}createNodeFromType(e){return void 0===this.nodes[e]?(console.error("THREE.NodeLoader: Node type not found:",e),$i()):Pi(new this.nodes[e])}}class qw extends ps{constructor(e){super(e),this.nodes={},this.nodeMaterials={}}parse(e){const t=super.parse(e),r=this.nodes,s=e.inputNodes;for(const e in s){const i=s[e];t[e]=r[i]}return t}setNodes(e){return this.nodes=e,this}setNodeMaterials(e){return this.nodeMaterials=e,this}createMaterialFromType(e){const t=this.nodeMaterials[e];return void 0!==t?new t:super.createMaterialFromType(e)}}class Xw extends gs{constructor(e){super(e),this.nodes={},this.nodeMaterials={},this._nodesJSON=null}setNodes(e){return this.nodes=e,this}setNodeMaterials(e){return this.nodeMaterials=e,this}parse(e,t){this._nodesJSON=e.nodes;const r=super.parse(e,t);return this._nodesJSON=null,r}parseNodes(e,t){if(void 0!==e){const r=new jw;return r.setNodes(this.nodes),r.setTextures(t),r.parseNodes(e)}return{}}parseMaterials(e,t){const r={};if(void 0!==e){const s=this.parseNodes(this._nodesJSON,t),i=new qw;i.setTextures(t),i.setNodes(s),i.setNodeMaterials(this.nodeMaterials);for(let t=0,s=e.length;t} - */ this.occludedResolveCache = new Map(); - } - /** - * Initializes the backend so it is ready for usage. - * - * @async - * @param {Renderer} renderer - The renderer. - * @return {Promise} A Promise that resolves when the backend has been initialized. - */ async init( renderer ) { - await super.init( renderer ); - - // - const parameters = this.parameters; - - // create the device if it is not passed with parameters - let device; if ( parameters.device === undefined ) { - - const adapterOptions = { - powerPreference: parameters.powerPreference - }; - + const adapterOptions = { powerPreference: parameters.powerPreference }; const adapter = ( typeof navigator !== 'undefined' ) ? await navigator.gpu.requestAdapter( adapterOptions ) : null; - if ( adapter === null ) { - - throw new Error( 'WebGPUBackend: Unable to create WebGPU adapter.' ); - - } - - // feature support + if ( adapter === null ) throw new Error( 'WebGPUBackend: Unable to create WebGPU adapter.' ); const features = Object.values( GPUFeatureName ); + const supportedFeatures = features.filter( name => adapter.features.has( name ) ); - const supportedFeatures = []; - - for ( const name of features ) { - - if ( adapter.features.has( name ) ) { - - supportedFeatures.push( name ); - - } - - } - - const deviceDescriptor = { - requiredFeatures: supportedFeatures, - requiredLimits: parameters.requiredLimits - }; - - device = await adapter.requestDevice( deviceDescriptor ); - + device = await adapter.requestDevice({ requiredFeatures: supportedFeatures, requiredLimits: parameters.requiredLimits }); } else { - device = parameters.device; - } device.lost.then( ( info ) => { - - const deviceLossInfo = { + renderer.onDeviceLost({ api: 'WebGPU', message: info.message || 'Unknown reason', reason: info.reason || null, originalEvent: info - }; - - renderer.onDeviceLost( deviceLossInfo ); - - } ); - - const context = ( parameters.context !== undefined ) ? parameters.context : renderer.domElement.getContext( 'webgpu' ); + }); + }); + const context = parameters.context !== undefined ? parameters.context : renderer.domElement.getContext( 'webgpu' ); this.device = device; this.context = context; - const alphaMode = parameters.alpha ? 'premultiplied' : 'opaque'; - this.trackTimestamp = this.trackTimestamp && this.hasFeature( GPUFeatureName.TimestampQuery ); - this.context.configure( { + this.context.configure({ device: this.device, format: this.utils.getPreferredCanvasFormat(), usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC, alphaMode: alphaMode - } ); + }); - this.updateSize(); + if (typeof window !== 'undefined' && 'checkWebGPUState' in window) { + checkWebGPUState(); + } + this.updateSize(); } - /** - * The coordinate system of the backend. - * - * @type {number} - * @readonly - */ get coordinateSystem() { - return WebGPUCoordinateSystem; - } /** @@ -71226,3 +71061,4 @@ class ClippingGroup extends Group { } export { ACESFilmicToneMapping, AONode, AddEquation, AddOperation, AdditiveBlending, AgXToneMapping, AlphaFormat, AlwaysCompare, AlwaysDepth, AlwaysStencilFunc, AmbientLight, AmbientLightNode, AnalyticLightNode, ArrayCamera, ArrayElementNode, ArrayNode, AssignNode, AttributeNode, BackSide, BasicEnvironmentNode, BasicShadowMap, BatchNode, BoxGeometry, BufferAttribute, BufferAttributeNode, BufferGeometry, BufferNode, BumpMapNode, BundleGroup, BypassNode, ByteType, CacheNode, Camera, CineonToneMapping, ClampToEdgeWrapping, ClippingGroup, CodeNode, Color, ColorManagement, ColorSpaceNode, ComputeNode, ConstNode, ContextNode, ConvertNode, CubeCamera, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeTextureNode, CubeUVReflectionMapping, CullFaceBack, CullFaceFront, CullFaceNone, CustomBlending, CylinderGeometry, DataArrayTexture, DataTexture, DebugNode, DecrementStencilOp, DecrementWrapStencilOp, DepthFormat, DepthStencilFormat, DepthTexture, DirectionalLight, DirectionalLightNode, DoubleSide, DstAlphaFactor, DstColorFactor, DynamicDrawUsage, EnvironmentNode, EqualCompare, EqualDepth, EqualStencilFunc, EquirectUVNode, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, ExpressionNode, FileLoader, Float16BufferAttribute, Float32BufferAttribute, FloatType, FramebufferTexture, FrontFacingNode, FrontSide, Frustum, FunctionCallNode, FunctionNode, FunctionOverloadingNode, GLSLNodeParser, GreaterCompare, GreaterDepth, GreaterEqualCompare, GreaterEqualDepth, GreaterEqualStencilFunc, GreaterStencilFunc, Group, HalfFloatType, HemisphereLight, HemisphereLightNode, IESSpotLight, IESSpotLightNode, IncrementStencilOp, IncrementWrapStencilOp, IndexNode, IndirectStorageBufferAttribute, InstanceNode, InstancedBufferAttribute, InstancedInterleavedBuffer, InstancedMeshNode, IntType, InterleavedBuffer, InterleavedBufferAttribute, InvertStencilOp, IrradianceNode, JoinNode, KeepStencilOp, LessCompare, LessDepth, LessEqualCompare, LessEqualDepth, LessEqualStencilFunc, LessStencilFunc, LightProbe, LightProbeNode, Lighting, LightingContextNode, LightingModel, LightingNode, LightsNode, Line2NodeMaterial, LineBasicMaterial, LineBasicNodeMaterial, LineDashedMaterial, LineDashedNodeMaterial, LinearFilter, LinearMipMapLinearFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, LinearSRGBColorSpace, LinearToneMapping, Loader, LoopNode, LuminanceAlphaFormat, LuminanceFormat, MRTNode, MatcapUVNode, Material, MaterialLoader, MaterialNode, MaterialReferenceNode, MathUtils, Matrix2, Matrix3, Matrix4, MaxEquation, MaxMipLevelNode, MemberNode, Mesh, MeshBasicMaterial, MeshBasicNodeMaterial, MeshLambertMaterial, MeshLambertNodeMaterial, MeshMatcapMaterial, MeshMatcapNodeMaterial, MeshNormalMaterial, MeshNormalNodeMaterial, MeshPhongMaterial, MeshPhongNodeMaterial, MeshPhysicalMaterial, MeshPhysicalNodeMaterial, MeshSSSNodeMaterial, MeshStandardMaterial, MeshStandardNodeMaterial, MeshToonMaterial, MeshToonNodeMaterial, MinEquation, MirroredRepeatWrapping, MixOperation, ModelNode, MorphNode, MultiplyBlending, MultiplyOperation, NearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NeutralToneMapping, NeverCompare, NeverDepth, NeverStencilFunc, NoBlending, NoColorSpace, NoToneMapping, Node, NodeAccess, NodeAttribute, NodeBuilder, NodeCache, NodeCode, NodeFrame, NodeFunctionInput, NodeLoader, NodeMaterial, NodeMaterialLoader, NodeMaterialObserver, NodeObjectLoader, NodeShaderStage, NodeType, NodeUniform, NodeUpdateType, NodeUtils, NodeVar, NodeVarying, NormalBlending, NormalMapNode, NotEqualCompare, NotEqualDepth, NotEqualStencilFunc, Object3D, Object3DNode, ObjectLoader, ObjectSpaceNormalMap, OneFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OrthographicCamera, OutputStructNode, PCFShadowMap, PMREMGenerator, PMREMNode, ParameterNode, PassNode, PerspectiveCamera, PhongLightingModel, PhysicalLightingModel, Plane, PlaneGeometry, PointLight, PointLightNode, PointUVNode, PointsMaterial, PointsNodeMaterial, PostProcessing, PosterizeNode, PropertyNode, QuadMesh, Quaternion, RED_GREEN_RGTC2_Format, RED_RGTC1_Format, REVISION, RGBAFormat, RGBAIntegerFormat, RGBA_ASTC_10x10_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_BPTC_Format, RGBA_ETC2_EAC_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGBFormat, RGBIntegerFormat, RGB_ETC1_Format, RGB_ETC2_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGB_S3TC_DXT1_Format, RGFormat, RGIntegerFormat, RTTNode, RangeNode, RectAreaLight, RectAreaLightNode, RedFormat, RedIntegerFormat, ReferenceNode, ReflectorNode, ReinhardToneMapping, RemapNode, RenderOutputNode, RenderTarget, RendererReferenceNode, RendererUtils, RepeatWrapping, ReplaceStencilOp, ReverseSubtractEquation, RotateNode, SIGNED_RED_GREEN_RGTC2_Format, SIGNED_RED_RGTC1_Format, SRGBColorSpace, SRGBTransfer, Scene, SceneNode, ScreenNode, ScriptableNode, ScriptableValueNode, SetNode, ShadowBaseNode, ShadowMaterial, ShadowNode, ShadowNodeMaterial, ShortType, SkinningNode, Sphere, SphereGeometry, SplitNode, SpotLight, SpotLightNode, SpriteMaterial, SpriteNodeMaterial, SpriteSheetUVNode, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, StackNode, StaticDrawUsage, StorageArrayElementNode, StorageBufferAttribute, StorageBufferNode, StorageInstancedBufferAttribute, StorageTexture, StorageTextureNode, StructNode, StructTypeNode, SubtractEquation, SubtractiveBlending, TSL, TangentSpaceNormalMap, TempNode, Texture, Texture3DNode, TextureNode, TextureSizeNode, ToneMappingNode, ToonOutlinePassNode, TriplanarTexturesNode, UVMapping, Uint16BufferAttribute, Uint32BufferAttribute, UniformArrayNode, UniformGroupNode, UniformNode, UnsignedByteType, UnsignedInt248Type, UnsignedInt5999Type, UnsignedIntType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShortType, UserDataNode, VSMShadowMap, VarNode, VaryingNode, Vector2, Vector3, Vector4, VertexColorNode, ViewportDepthNode, ViewportDepthTextureNode, ViewportSharedTextureNode, ViewportTextureNode, VolumeNodeMaterial, WebGLCoordinateSystem, WebGLCubeRenderTarget, WebGPUCoordinateSystem, WebGPURenderer, WebXRController, ZeroFactor, ZeroStencilOp, createCanvasElement, defaultBuildStages, defaultShaderStages, shaderStages, vectorComponents }; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhyZWUud2ViZ3B1Lm5vZGVzLmpzIiwic291cmNlcyI6WyIuLi9zcmMvbWF0ZXJpYWxzL25vZGVzL21hbmFnZXIvTm9kZU1hdGVyaWFsT2JzZXJ2ZXIuanMiLCIuLi9zcmMvbm9kZXMvY29yZS9Ob2RlVXRpbHMuanMiLCIuLi9zcmMvbm9kZXMvY29yZS9jb25zdGFudHMuanMiLCIuLi9zcmMvbm9kZXMvY29yZS9Ob2RlLmpzIiwiLi4vc3JjL25vZGVzL3V0aWxzL0FycmF5RWxlbWVudE5vZGUuanMiLCIuLi9zcmMvbm9kZXMvdXRpbHMvQ29udmVydE5vZGUuanMiLCIuLi9zcmMvbm9kZXMvY29yZS9UZW1wTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy91dGlscy9Kb2luTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy91dGlscy9TcGxpdE5vZGUuanMiLCIuLi9zcmMvbm9kZXMvdXRpbHMvU2V0Tm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy91dGlscy9GbGlwTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9jb3JlL0lucHV0Tm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9jb3JlL0NvbnN0Tm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy91dGlscy9NZW1iZXJOb2RlLmpzIiwiLi4vc3JjL25vZGVzL3RzbC9UU0xDb3JlLmpzIiwiLi4vc3JjL25vZGVzL2NvcmUvQXJyYXlOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2NvcmUvVW5pZm9ybUdyb3VwTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9jb3JlL1VuaWZvcm1Ob2RlLmpzIiwiLi4vc3JjL25vZGVzL2NvcmUvUHJvcGVydHlOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2NvcmUvQXNzaWduTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9jb2RlL0Z1bmN0aW9uQ2FsbE5vZGUuanMiLCIuLi9zcmMvbm9kZXMvbWF0aC9PcGVyYXRvck5vZGUuanMiLCIuLi9zcmMvbm9kZXMvbWF0aC9NYXRoTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9tYXRoL0NvbmRpdGlvbmFsTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9jb3JlL0NvbnRleHROb2RlLmpzIiwiLi4vc3JjL25vZGVzL2NvcmUvVmFyTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9jb3JlL1ZhcnlpbmdOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2Rpc3BsYXkvQ29sb3JTcGFjZUZ1bmN0aW9ucy5qcyIsIi4uL3NyYy9ub2Rlcy9kaXNwbGF5L0NvbG9yU3BhY2VOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2FjY2Vzc29ycy9SZWZlcmVuY2VCYXNlTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9hY2Nlc3NvcnMvUmVuZGVyZXJSZWZlcmVuY2VOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2Rpc3BsYXkvVG9uZU1hcHBpbmdOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2FjY2Vzc29ycy9CdWZmZXJBdHRyaWJ1dGVOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2dwZ3B1L0NvbXB1dGVOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2NvcmUvQ2FjaGVOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2NvcmUvQnlwYXNzTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy91dGlscy9SZW1hcE5vZGUuanMiLCIuLi9zcmMvbm9kZXMvY29kZS9FeHByZXNzaW9uTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy91dGlscy9EaXNjYXJkLmpzIiwiLi4vc3JjL25vZGVzL2Rpc3BsYXkvUmVuZGVyT3V0cHV0Tm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy91dGlscy9EZWJ1Z05vZGUuanMiLCIuLi9zcmMvbm9kZXMvdHNsL1RTTEJhc2UuanMiLCIuLi9zcmMvbm9kZXMvY29yZS9BdHRyaWJ1dGVOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2FjY2Vzc29ycy9VVi5qcyIsIi4uL3NyYy9ub2Rlcy9hY2Nlc3NvcnMvVGV4dHVyZVNpemVOb2RlLmpzIiwiLi4vc3JjL25vZGVzL3V0aWxzL01heE1pcExldmVsTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9hY2Nlc3NvcnMvVGV4dHVyZU5vZGUuanMiLCIuLi9zcmMvbm9kZXMvYWNjZXNzb3JzL0J1ZmZlck5vZGUuanMiLCIuLi9zcmMvbm9kZXMvYWNjZXNzb3JzL1VuaWZvcm1BcnJheU5vZGUuanMiLCIuLi9zcmMvbm9kZXMvYWNjZXNzb3JzL0NhbWVyYS5qcyIsIi4uL3NyYy9ub2Rlcy9hY2Nlc3NvcnMvT2JqZWN0M0ROb2RlLmpzIiwiLi4vc3JjL25vZGVzL2FjY2Vzc29ycy9Nb2RlbE5vZGUuanMiLCIuLi9zcmMvbm9kZXMvYWNjZXNzb3JzL1Bvc2l0aW9uLmpzIiwiLi4vc3JjL25vZGVzL2Rpc3BsYXkvRnJvbnRGYWNpbmdOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2FjY2Vzc29ycy9Ob3JtYWwuanMiLCIuLi9zcmMvbm9kZXMvYWNjZXNzb3JzL01hdGVyaWFsUHJvcGVydGllcy5qcyIsIi4uL3NyYy9ub2Rlcy9hY2Nlc3NvcnMvUmVmbGVjdFZlY3Rvci5qcyIsIi4uL3NyYy9ub2Rlcy9hY2Nlc3NvcnMvQ3ViZVRleHR1cmVOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2FjY2Vzc29ycy9SZWZlcmVuY2VOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2FjY2Vzc29ycy9NYXRlcmlhbFJlZmVyZW5jZU5vZGUuanMiLCIuLi9zcmMvbm9kZXMvYWNjZXNzb3JzL1RhbmdlbnQuanMiLCIuLi9zcmMvbm9kZXMvYWNjZXNzb3JzL0JpdGFuZ2VudC5qcyIsIi4uL3NyYy9ub2Rlcy9hY2Nlc3NvcnMvQWNjZXNzb3JzVXRpbHMuanMiLCIuLi9zcmMvbm9kZXMvZGlzcGxheS9Ob3JtYWxNYXBOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2Rpc3BsYXkvQnVtcE1hcE5vZGUuanMiLCIuLi9zcmMvbm9kZXMvYWNjZXNzb3JzL01hdGVyaWFsTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9hY2Nlc3NvcnMvTW9kZWxWaWV3UHJvamVjdGlvbk5vZGUuanMiLCIuLi9zcmMvbm9kZXMvY29yZS9JbmRleE5vZGUuanMiLCIuLi9zcmMvbm9kZXMvYWNjZXNzb3JzL0luc3RhbmNlTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9hY2Nlc3NvcnMvSW5zdGFuY2VkTWVzaE5vZGUuanMiLCIuLi9zcmMvbm9kZXMvYWNjZXNzb3JzL0JhdGNoTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy91dGlscy9TdG9yYWdlQXJyYXlFbGVtZW50Tm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9hY2Nlc3NvcnMvU3RvcmFnZUJ1ZmZlck5vZGUuanMiLCIuLi9zcmMvbm9kZXMvYWNjZXNzb3JzL1NraW5uaW5nTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy91dGlscy9Mb29wTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9hY2Nlc3NvcnMvTW9ycGhOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2xpZ2h0aW5nL0xpZ2h0aW5nTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9saWdodGluZy9BT05vZGUuanMiLCIuLi9zcmMvbm9kZXMvbGlnaHRpbmcvTGlnaHRpbmdDb250ZXh0Tm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9saWdodGluZy9JcnJhZGlhbmNlTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9kaXNwbGF5L1NjcmVlbk5vZGUuanMiLCIuLi9zcmMvbm9kZXMvZGlzcGxheS9WaWV3cG9ydFRleHR1cmVOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2Rpc3BsYXkvVmlld3BvcnREZXB0aFRleHR1cmVOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2Rpc3BsYXkvVmlld3BvcnREZXB0aE5vZGUuanMiLCIuLi9zcmMvbm9kZXMvYWNjZXNzb3JzL0J1aWx0aW5Ob2RlLmpzIiwiLi4vc3JjL25vZGVzL2FjY2Vzc29ycy9DbGlwcGluZ05vZGUuanMiLCIuLi9zcmMvbm9kZXMvZnVuY3Rpb25zL21hdGVyaWFsL2dldEFscGhhSGFzaFRocmVzaG9sZC5qcyIsIi4uL3NyYy9tYXRlcmlhbHMvbm9kZXMvTm9kZU1hdGVyaWFsLmpzIiwiLi4vc3JjL21hdGVyaWFscy9ub2Rlcy9MaW5lQmFzaWNOb2RlTWF0ZXJpYWwuanMiLCIuLi9zcmMvbWF0ZXJpYWxzL25vZGVzL0xpbmVEYXNoZWROb2RlTWF0ZXJpYWwuanMiLCIuLi9zcmMvbm9kZXMvZGlzcGxheS9WaWV3cG9ydFNoYXJlZFRleHR1cmVOb2RlLmpzIiwiLi4vc3JjL21hdGVyaWFscy9ub2Rlcy9MaW5lMk5vZGVNYXRlcmlhbC5qcyIsIi4uL3NyYy9ub2Rlcy91dGlscy9QYWNraW5nLmpzIiwiLi4vc3JjL21hdGVyaWFscy9ub2Rlcy9NZXNoTm9ybWFsTm9kZU1hdGVyaWFsLmpzIiwiLi4vc3JjL25vZGVzL3V0aWxzL0VxdWlyZWN0VVZOb2RlLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9jb21tb24vQ3ViZVJlbmRlclRhcmdldC5qcyIsIi4uL3NyYy9ub2Rlcy91dGlscy9DdWJlTWFwTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9saWdodGluZy9CYXNpY0Vudmlyb25tZW50Tm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9saWdodGluZy9CYXNpY0xpZ2h0TWFwTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9jb3JlL0xpZ2h0aW5nTW9kZWwuanMiLCIuLi9zcmMvbm9kZXMvZnVuY3Rpb25zL0Jhc2ljTGlnaHRpbmdNb2RlbC5qcyIsIi4uL3NyYy9tYXRlcmlhbHMvbm9kZXMvTWVzaEJhc2ljTm9kZU1hdGVyaWFsLmpzIiwiLi4vc3JjL25vZGVzL2Z1bmN0aW9ucy9CU0RGL0ZfU2NobGljay5qcyIsIi4uL3NyYy9ub2Rlcy9mdW5jdGlvbnMvQlNERi9CUkRGX0xhbWJlcnQuanMiLCIuLi9zcmMvbm9kZXMvZnVuY3Rpb25zL1Bob25nTGlnaHRpbmdNb2RlbC5qcyIsIi4uL3NyYy9tYXRlcmlhbHMvbm9kZXMvTWVzaExhbWJlcnROb2RlTWF0ZXJpYWwuanMiLCIuLi9zcmMvbWF0ZXJpYWxzL25vZGVzL01lc2hQaG9uZ05vZGVNYXRlcmlhbC5qcyIsIi4uL3NyYy9ub2Rlcy9mdW5jdGlvbnMvbWF0ZXJpYWwvZ2V0R2VvbWV0cnlSb3VnaG5lc3MuanMiLCIuLi9zcmMvbm9kZXMvZnVuY3Rpb25zL21hdGVyaWFsL2dldFJvdWdobmVzcy5qcyIsIi4uL3NyYy9ub2Rlcy9mdW5jdGlvbnMvQlNERi9WX0dHWF9TbWl0aENvcnJlbGF0ZWQuanMiLCIuLi9zcmMvbm9kZXMvZnVuY3Rpb25zL0JTREYvVl9HR1hfU21pdGhDb3JyZWxhdGVkX0FuaXNvdHJvcGljLmpzIiwiLi4vc3JjL25vZGVzL2Z1bmN0aW9ucy9CU0RGL0RfR0dYLmpzIiwiLi4vc3JjL25vZGVzL2Z1bmN0aW9ucy9CU0RGL0RfR0dYX0FuaXNvdHJvcGljLmpzIiwiLi4vc3JjL25vZGVzL2Z1bmN0aW9ucy9CU0RGL0JSREZfR0dYLmpzIiwiLi4vc3JjL25vZGVzL2Z1bmN0aW9ucy9CU0RGL0RGR0FwcHJveC5qcyIsIi4uL3NyYy9ub2Rlcy9mdW5jdGlvbnMvQlNERi9FbnZpcm9ubWVudEJSREYuanMiLCIuLi9zcmMvbm9kZXMvZnVuY3Rpb25zL0JTREYvU2NobGlja190b19GMC5qcyIsIi4uL3NyYy9ub2Rlcy9mdW5jdGlvbnMvQlNERi9CUkRGX1NoZWVuLmpzIiwiLi4vc3JjL25vZGVzL2Z1bmN0aW9ucy9CU0RGL0xUQy5qcyIsIi4uL3NyYy9ub2Rlcy9hY2Nlc3NvcnMvVGV4dHVyZUJpY3ViaWMuanMiLCIuLi9zcmMvbm9kZXMvZnVuY3Rpb25zL1BoeXNpY2FsTGlnaHRpbmdNb2RlbC5qcyIsIi4uL3NyYy9ub2Rlcy9wbXJlbS9QTVJFTVV0aWxzLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9jb21tb24vZXh0cmFzL1BNUkVNR2VuZXJhdG9yLmpzIiwiLi4vc3JjL25vZGVzL3BtcmVtL1BNUkVNTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9saWdodGluZy9FbnZpcm9ubWVudE5vZGUuanMiLCIuLi9zcmMvbWF0ZXJpYWxzL25vZGVzL01lc2hTdGFuZGFyZE5vZGVNYXRlcmlhbC5qcyIsIi4uL3NyYy9tYXRlcmlhbHMvbm9kZXMvTWVzaFBoeXNpY2FsTm9kZU1hdGVyaWFsLmpzIiwiLi4vc3JjL21hdGVyaWFscy9ub2Rlcy9NZXNoU1NTTm9kZU1hdGVyaWFsLmpzIiwiLi4vc3JjL25vZGVzL2Z1bmN0aW9ucy9Ub29uTGlnaHRpbmdNb2RlbC5qcyIsIi4uL3NyYy9tYXRlcmlhbHMvbm9kZXMvTWVzaFRvb25Ob2RlTWF0ZXJpYWwuanMiLCIuLi9zcmMvbm9kZXMvdXRpbHMvTWF0Y2FwVVZOb2RlLmpzIiwiLi4vc3JjL21hdGVyaWFscy9ub2Rlcy9NZXNoTWF0Y2FwTm9kZU1hdGVyaWFsLmpzIiwiLi4vc3JjL25vZGVzL3V0aWxzL1JvdGF0ZU5vZGUuanMiLCIuLi9zcmMvbWF0ZXJpYWxzL25vZGVzL1Nwcml0ZU5vZGVNYXRlcmlhbC5qcyIsIi4uL3NyYy9tYXRlcmlhbHMvbm9kZXMvUG9pbnRzTm9kZU1hdGVyaWFsLmpzIiwiLi4vc3JjL25vZGVzL2Z1bmN0aW9ucy9TaGFkb3dNYXNrTW9kZWwuanMiLCIuLi9zcmMvbWF0ZXJpYWxzL25vZGVzL1NoYWRvd05vZGVNYXRlcmlhbC5qcyIsIi4uL3NyYy9ub2Rlcy9mdW5jdGlvbnMvVm9sdW1ldHJpY0xpZ2h0aW5nTW9kZWwuanMiLCIuLi9zcmMvbWF0ZXJpYWxzL25vZGVzL1ZvbHVtZU5vZGVNYXRlcmlhbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvY29tbW9uL0FuaW1hdGlvbi5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvY29tbW9uL0NoYWluTWFwLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9jb21tb24vUmVuZGVyT2JqZWN0LmpzIiwiLi4vc3JjL3JlbmRlcmVycy9jb21tb24vUmVuZGVyT2JqZWN0cy5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvY29tbW9uL0RhdGFNYXAuanMiLCIuLi9zcmMvcmVuZGVyZXJzL2NvbW1vbi9Db25zdGFudHMuanMiLCIuLi9zcmMvcmVuZGVyZXJzL2NvbW1vbi9BdHRyaWJ1dGVzLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9jb21tb24vR2VvbWV0cmllcy5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvY29tbW9uL0luZm8uanMiLCIuLi9zcmMvcmVuZGVyZXJzL2NvbW1vbi9QaXBlbGluZS5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvY29tbW9uL1JlbmRlclBpcGVsaW5lLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9jb21tb24vQ29tcHV0ZVBpcGVsaW5lLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9jb21tb24vUHJvZ3JhbW1hYmxlU3RhZ2UuanMiLCIuLi9zcmMvcmVuZGVyZXJzL2NvbW1vbi9QaXBlbGluZXMuanMiLCIuLi9zcmMvcmVuZGVyZXJzL2NvbW1vbi9CaW5kaW5ncy5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvY29tbW9uL1JlbmRlckxpc3QuanMiLCIuLi9zcmMvcmVuZGVyZXJzL2NvbW1vbi9SZW5kZXJMaXN0cy5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvY29tbW9uL1JlbmRlckNvbnRleHQuanMiLCIuLi9zcmMvcmVuZGVyZXJzL2NvbW1vbi9SZW5kZXJDb250ZXh0cy5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvY29tbW9uL1RleHR1cmVzLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9jb21tb24vQ29sb3I0LmpzIiwiLi4vc3JjL25vZGVzL2NvcmUvUGFyYW1ldGVyTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9jb3JlL1N0YWNrTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9jb3JlL1N0cnVjdFR5cGVOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2NvcmUvU3RydWN0Tm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9jb3JlL091dHB1dFN0cnVjdE5vZGUuanMiLCIuLi9zcmMvbm9kZXMvY29yZS9NUlROb2RlLmpzIiwiLi4vc3JjL25vZGVzL21hdGgvSGFzaC5qcyIsIi4uL3NyYy9ub2Rlcy9tYXRoL01hdGhVdGlscy5qcyIsIi4uL3NyYy9ub2Rlcy9tYXRoL1RyaU5vaXNlM0QuanMiLCIuLi9zcmMvbm9kZXMvdXRpbHMvRnVuY3Rpb25PdmVybG9hZGluZ05vZGUuanMiLCIuLi9zcmMvbm9kZXMvdXRpbHMvVGltZXIuanMiLCIuLi9zcmMvbm9kZXMvdXRpbHMvT3NjaWxsYXRvcnMuanMiLCIuLi9zcmMvbm9kZXMvdXRpbHMvVVZVdGlscy5qcyIsIi4uL3NyYy9ub2Rlcy91dGlscy9TcHJpdGVVdGlscy5qcyIsIi4uL3NyYy9ub2Rlcy91dGlscy9WaWV3cG9ydFV0aWxzLmpzIiwiLi4vc3JjL25vZGVzL3V0aWxzL1Nwcml0ZVNoZWV0VVZOb2RlLmpzIiwiLi4vc3JjL25vZGVzL3V0aWxzL1RyaXBsYW5hclRleHR1cmVzTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy91dGlscy9SZWZsZWN0b3JOb2RlLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9jb21tb24vUXVhZE1lc2guanMiLCIuLi9zcmMvbm9kZXMvdXRpbHMvUlRUTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy91dGlscy9Qb3N0UHJvY2Vzc2luZ1V0aWxzLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9jb21tb24vU3RvcmFnZUluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZS5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvY29tbW9uL1N0b3JhZ2VCdWZmZXJBdHRyaWJ1dGUuanMiLCIuLi9zcmMvbm9kZXMvYWNjZXNzb3JzL0FycmF5cy5qcyIsIi4uL3NyYy9ub2Rlcy9hY2Nlc3NvcnMvVmVydGV4Q29sb3JOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2FjY2Vzc29ycy9Qb2ludFVWTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9hY2Nlc3NvcnMvU2NlbmVOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2FjY2Vzc29ycy9TdG9yYWdlVGV4dHVyZU5vZGUuanMiLCIuLi9zcmMvbm9kZXMvYWNjZXNzb3JzL1RleHR1cmUzRE5vZGUuanMiLCIuLi9zcmMvbm9kZXMvYWNjZXNzb3JzL1VzZXJEYXRhTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9hY2Nlc3NvcnMvVmVsb2NpdHlOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2Rpc3BsYXkvQmxlbmRNb2Rlcy5qcyIsIi4uL3NyYy9ub2Rlcy9kaXNwbGF5L0NvbG9yQWRqdXN0bWVudC5qcyIsIi4uL3NyYy9ub2Rlcy9kaXNwbGF5L1Bvc3Rlcml6ZU5vZGUuanMiLCIuLi9zcmMvbm9kZXMvZGlzcGxheS9QYXNzTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9kaXNwbGF5L1Rvb25PdXRsaW5lUGFzc05vZGUuanMiLCIuLi9zcmMvbm9kZXMvZGlzcGxheS9Ub25lTWFwcGluZ0Z1bmN0aW9ucy5qcyIsIi4uL3NyYy9ub2Rlcy9jb2RlL0NvZGVOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2NvZGUvRnVuY3Rpb25Ob2RlLmpzIiwiLi4vc3JjL25vZGVzL2NvZGUvU2NyaXB0YWJsZVZhbHVlTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9jb2RlL1NjcmlwdGFibGVOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2ZvZy9Gb2cuanMiLCIuLi9zcmMvbm9kZXMvZ2VvbWV0cnkvUmFuZ2VOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2dwZ3B1L0NvbXB1dGVCdWlsdGluTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9ncGdwdS9CYXJyaWVyTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9ncGdwdS9Xb3JrZ3JvdXBJbmZvTm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9ncGdwdS9BdG9taWNGdW5jdGlvbk5vZGUuanMiLCIuLi9zcmMvbm9kZXMvYWNjZXNzb3JzL0xpZ2h0cy5qcyIsIi4uL3NyYy9ub2Rlcy9saWdodGluZy9MaWdodHNOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2xpZ2h0aW5nL1NoYWRvd0Jhc2VOb2RlLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9jb21tb24vUmVuZGVyZXJVdGlscy5qcyIsIi4uL3NyYy9ub2Rlcy9saWdodGluZy9TaGFkb3dOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2xpZ2h0aW5nL1BvaW50U2hhZG93Tm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9saWdodGluZy9BbmFseXRpY0xpZ2h0Tm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9saWdodGluZy9MaWdodFV0aWxzLmpzIiwiLi4vc3JjL25vZGVzL2xpZ2h0aW5nL1BvaW50TGlnaHROb2RlLmpzIiwiLi4vc3JjL25vZGVzL3Byb2NlZHVyYWwvQ2hlY2tlci5qcyIsIi4uL3NyYy9ub2Rlcy9zaGFwZXMvU2hhcGVzLmpzIiwiLi4vc3JjL25vZGVzL21hdGVyaWFseC9saWIvbXhfbm9pc2UuanMiLCIuLi9zcmMvbm9kZXMvbWF0ZXJpYWx4L2xpYi9teF9oc3YuanMiLCIuLi9zcmMvbm9kZXMvbWF0ZXJpYWx4L2xpYi9teF90cmFuc2Zvcm1fY29sb3IuanMiLCIuLi9zcmMvbm9kZXMvbWF0ZXJpYWx4L01hdGVyaWFsWE5vZGVzLmpzIiwiLi4vc3JjL25vZGVzL2Z1bmN0aW9ucy9tYXRlcmlhbC9nZXRQYXJhbGxheENvcnJlY3ROb3JtYWwuanMiLCIuLi9zcmMvbm9kZXMvZnVuY3Rpb25zL21hdGVyaWFsL2dldFNoSXJyYWRpYW5jZUF0LmpzIiwiLi4vc3JjL25vZGVzL1RTTC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvY29tbW9uL0JhY2tncm91bmQuanMiLCIuLi9zcmMvcmVuZGVyZXJzL2NvbW1vbi9CaW5kR3JvdXAuanMiLCIuLi9zcmMvcmVuZGVyZXJzL2NvbW1vbi9ub2Rlcy9Ob2RlQnVpbGRlclN0YXRlLmpzIiwiLi4vc3JjL25vZGVzL2NvcmUvTm9kZUF0dHJpYnV0ZS5qcyIsIi4uL3NyYy9ub2Rlcy9jb3JlL05vZGVVbmlmb3JtLmpzIiwiLi4vc3JjL25vZGVzL2NvcmUvTm9kZVZhci5qcyIsIi4uL3NyYy9ub2Rlcy9jb3JlL05vZGVWYXJ5aW5nLmpzIiwiLi4vc3JjL25vZGVzL2NvcmUvTm9kZUNvZGUuanMiLCIuLi9zcmMvbm9kZXMvY29yZS9Ob2RlQ2FjaGUuanMiLCIuLi9zcmMvbm9kZXMvY29yZS9TdHJ1Y3RUeXBlLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9jb21tb24vVW5pZm9ybS5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvY29tbW9uL25vZGVzL05vZGVVbmlmb3JtLmpzIiwiLi4vc3JjL25vZGVzL2NvcmUvTm9kZUJ1aWxkZXIuanMiLCIuLi9zcmMvbm9kZXMvY29yZS9Ob2RlRnJhbWUuanMiLCIuLi9zcmMvbm9kZXMvY29yZS9Ob2RlRnVuY3Rpb25JbnB1dC5qcyIsIi4uL3NyYy9ub2Rlcy9saWdodGluZy9EaXJlY3Rpb25hbExpZ2h0Tm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9saWdodGluZy9SZWN0QXJlYUxpZ2h0Tm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9saWdodGluZy9TcG90TGlnaHROb2RlLmpzIiwiLi4vc3JjL25vZGVzL2xpZ2h0aW5nL0lFU1Nwb3RMaWdodE5vZGUuanMiLCIuLi9zcmMvbm9kZXMvbGlnaHRpbmcvQW1iaWVudExpZ2h0Tm9kZS5qcyIsIi4uL3NyYy9ub2Rlcy9saWdodGluZy9IZW1pc3BoZXJlTGlnaHROb2RlLmpzIiwiLi4vc3JjL25vZGVzL2xpZ2h0aW5nL0xpZ2h0UHJvYmVOb2RlLmpzIiwiLi4vc3JjL25vZGVzL2NvcmUvTm9kZVBhcnNlci5qcyIsIi4uL3NyYy9ub2Rlcy9jb3JlL05vZGVGdW5jdGlvbi5qcyIsIi4uL3NyYy9ub2Rlcy9wYXJzZXJzL0dMU0xOb2RlRnVuY3Rpb24uanMiLCIuLi9zcmMvbm9kZXMvcGFyc2Vycy9HTFNMTm9kZVBhcnNlci5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvY29tbW9uL25vZGVzL05vZGVzLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9jb21tb24vQ2xpcHBpbmdDb250ZXh0LmpzIiwiLi4vc3JjL3JlbmRlcmVycy9jb21tb24vUmVuZGVyQnVuZGxlLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9jb21tb24vUmVuZGVyQnVuZGxlcy5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvY29tbW9uL25vZGVzL05vZGVMaWJyYXJ5LmpzIiwiLi4vc3JjL3JlbmRlcmVycy9jb21tb24vTGlnaHRpbmcuanMiLCIuLi9zcmMvcmVuZGVyZXJzL2NvbW1vbi9YUlJlbmRlclRhcmdldC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvY29tbW9uL1hSTWFuYWdlci5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvY29tbW9uL1JlbmRlcmVyLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9jb21tb24vQmluZGluZy5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvY29tbW9uL0J1ZmZlclV0aWxzLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9jb21tb24vQnVmZmVyLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9jb21tb24vVW5pZm9ybUJ1ZmZlci5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvY29tbW9uL25vZGVzL05vZGVVbmlmb3JtQnVmZmVyLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9jb21tb24vVW5pZm9ybXNHcm91cC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvY29tbW9uL25vZGVzL05vZGVVbmlmb3Jtc0dyb3VwLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9jb21tb24vU2FtcGxlZFRleHR1cmUuanMiLCIuLi9zcmMvcmVuZGVyZXJzL2NvbW1vbi9ub2Rlcy9Ob2RlU2FtcGxlZFRleHR1cmUuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYmdsLWZhbGxiYWNrL25vZGVzL0dMU0xOb2RlQnVpbGRlci5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvY29tbW9uL0JhY2tlbmQuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYmdsLWZhbGxiYWNrL3V0aWxzL1dlYkdMQXR0cmlidXRlVXRpbHMuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYmdsLWZhbGxiYWNrL3V0aWxzL1dlYkdMU3RhdGUuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYmdsLWZhbGxiYWNrL3V0aWxzL1dlYkdMVXRpbHMuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYmdsLWZhbGxiYWNrL3V0aWxzL1dlYkdMVGV4dHVyZVV0aWxzLmpzIiwiLi4vc3JjL3JlbmRlcmVycy93ZWJnbC1mYWxsYmFjay91dGlscy9XZWJHTEV4dGVuc2lvbnMuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYmdsLWZhbGxiYWNrL3V0aWxzL1dlYkdMQ2FwYWJpbGl0aWVzLmpzIiwiLi4vc3JjL3JlbmRlcmVycy93ZWJnbC1mYWxsYmFjay91dGlscy9XZWJHTENvbnN0YW50cy5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2ViZ2wtZmFsbGJhY2svV2ViR0xCdWZmZXJSZW5kZXJlci5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvY29tbW9uL1RpbWVzdGFtcFF1ZXJ5UG9vbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2ViZ2wtZmFsbGJhY2svdXRpbHMvV2ViR0xUaW1lc3RhbXBRdWVyeVBvb2wuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYmdsLWZhbGxiYWNrL1dlYkdMQmFja2VuZC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2ViZ3B1L3V0aWxzL1dlYkdQVUNvbnN0YW50cy5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvY29tbW9uL1NhbXBsZXIuanMiLCIuLi9zcmMvcmVuZGVyZXJzL2NvbW1vbi9ub2Rlcy9Ob2RlU2FtcGxlci5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvY29tbW9uL1N0b3JhZ2VCdWZmZXIuanMiLCIuLi9zcmMvcmVuZGVyZXJzL2NvbW1vbi9ub2Rlcy9Ob2RlU3RvcmFnZUJ1ZmZlci5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2ViZ3B1L3V0aWxzL1dlYkdQVVRleHR1cmVQYXNzVXRpbHMuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYmdwdS91dGlscy9XZWJHUFVUZXh0dXJlVXRpbHMuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYmdwdS9ub2Rlcy9XR1NMTm9kZUZ1bmN0aW9uLmpzIiwiLi4vc3JjL3JlbmRlcmVycy93ZWJncHUvbm9kZXMvV0dTTE5vZGVQYXJzZXIuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYmdwdS9ub2Rlcy9XR1NMTm9kZUJ1aWxkZXIuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYmdwdS91dGlscy9XZWJHUFVVdGlscy5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2ViZ3B1L3V0aWxzL1dlYkdQVUF0dHJpYnV0ZVV0aWxzLmpzIiwiLi4vc3JjL3JlbmRlcmVycy93ZWJncHUvdXRpbHMvV2ViR1BVQmluZGluZ1V0aWxzLmpzIiwiLi4vc3JjL3JlbmRlcmVycy93ZWJncHUvdXRpbHMvV2ViR1BVUGlwZWxpbmVVdGlscy5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2ViZ3B1L3V0aWxzL1dlYkdQVVRpbWVzdGFtcFF1ZXJ5UG9vbC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvd2ViZ3B1L1dlYkdQVUJhY2tlbmQuanMiLCIuLi9zcmMvbGlnaHRzL3dlYmdwdS9JRVNTcG90TGlnaHQuanMiLCIuLi9zcmMvcmVuZGVyZXJzL3dlYmdwdS9ub2Rlcy9CYXNpY05vZGVMaWJyYXJ5LmpzIiwiLi4vc3JjL3JlbmRlcmVycy93ZWJncHUvV2ViR1BVUmVuZGVyZXIuTm9kZXMuanMiLCIuLi9zcmMvcmVuZGVyZXJzL2NvbW1vbi9CdW5kbGVHcm91cC5qcyIsIi4uL3NyYy9yZW5kZXJlcnMvY29tbW9uL1Bvc3RQcm9jZXNzaW5nLmpzIiwiLi4vc3JjL3JlbmRlcmVycy9jb21tb24vU3RvcmFnZVRleHR1cmUuanMiLCIuLi9zcmMvcmVuZGVyZXJzL2NvbW1vbi9JbmRpcmVjdFN0b3JhZ2VCdWZmZXJBdHRyaWJ1dGUuanMiLCIuLi9zcmMvbG9hZGVycy9ub2Rlcy9Ob2RlTG9hZGVyLmpzIiwiLi4vc3JjL2xvYWRlcnMvbm9kZXMvTm9kZU1hdGVyaWFsTG9hZGVyLmpzIiwiLi4vc3JjL2xvYWRlcnMvbm9kZXMvTm9kZU9iamVjdExvYWRlci5qcyIsIi4uL3NyYy9vYmplY3RzL0NsaXBwaW5nR3JvdXAuanMiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgcmVmcmVzaFVuaWZvcm1zID0gW1xyXG5cdCdhbHBoYU1hcCcsXHJcblx0J2FscGhhVGVzdCcsXHJcblx0J2FuaXNvdHJvcHknLFxyXG5cdCdhbmlzb3Ryb3B5TWFwJyxcclxuXHQnYW5pc290cm9weVJvdGF0aW9uJyxcclxuXHQnYW9NYXAnLFxyXG5cdCdhdHRlbnVhdGlvbkNvbG9yJyxcclxuXHQnYXR0ZW51YXRpb25EaXN0YW5jZScsXHJcblx0J2J1bXBNYXAnLFxyXG5cdCdjbGVhcmNvYXQnLFxyXG5cdCdjbGVhcmNvYXRNYXAnLFxyXG5cdCdjbGVhcmNvYXROb3JtYWxNYXAnLFxyXG5cdCdjbGVhcmNvYXROb3JtYWxTY2FsZScsXHJcblx0J2NsZWFyY29hdFJvdWdobmVzcycsXHJcblx0J2NvbG9yJyxcclxuXHQnZGlzcGVyc2lvbicsXHJcblx0J2Rpc3BsYWNlbWVudE1hcCcsXHJcblx0J2VtaXNzaXZlJyxcclxuXHQnZW1pc3NpdmVNYXAnLFxyXG5cdCdlbnZNYXAnLFxyXG5cdCdncmFkaWVudE1hcCcsXHJcblx0J2lvcicsXHJcblx0J2lyaWRlc2NlbmNlJyxcclxuXHQnaXJpZGVzY2VuY2VJT1InLFxyXG5cdCdpcmlkZXNjZW5jZU1hcCcsXHJcblx0J2lyaWRlc2NlbmNlVGhpY2tuZXNzTWFwJyxcclxuXHQnbGlnaHRNYXAnLFxyXG5cdCdtYXAnLFxyXG5cdCdtYXRjYXAnLFxyXG5cdCdtZXRhbG5lc3MnLFxyXG5cdCdtZXRhbG5lc3NNYXAnLFxyXG5cdCdub3JtYWxNYXAnLFxyXG5cdCdub3JtYWxTY2FsZScsXHJcblx0J29wYWNpdHknLFxyXG5cdCdyb3VnaG5lc3MnLFxyXG5cdCdyb3VnaG5lc3NNYXAnLFxyXG5cdCdzaGVlbicsXHJcblx0J3NoZWVuQ29sb3InLFxyXG5cdCdzaGVlbkNvbG9yTWFwJyxcclxuXHQnc2hlZW5Sb3VnaG5lc3NNYXAnLFxyXG5cdCdzaGluaW5lc3MnLFxyXG5cdCdzcGVjdWxhcicsXHJcblx0J3NwZWN1bGFyQ29sb3InLFxyXG5cdCdzcGVjdWxhckNvbG9yTWFwJyxcclxuXHQnc3BlY3VsYXJJbnRlbnNpdHknLFxyXG5cdCdzcGVjdWxhckludGVuc2l0eU1hcCcsXHJcblx0J3NwZWN1bGFyTWFwJyxcclxuXHQndGhpY2tuZXNzJyxcclxuXHQndHJhbnNtaXNzaW9uJyxcclxuXHQndHJhbnNtaXNzaW9uTWFwJ1xyXG5dO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgY2xhc3MgaXMgdXNlZCBieSB7QGxpbmsgV2ViR1BVUmVuZGVyZXJ9IGFzIG1hbmFnZW1lbnQgY29tcG9uZW50LlxyXG4gKiBJdCdzIHByaW1hcnkgcHVycG9zZSBpcyB0byBkZXRlcm1pbmUgd2hldGhlciByZW5kZXIgb2JqZWN0cyByZXF1aXJlIGFcclxuICogcmVmcmVzaCByaWdodCBiZWZvcmUgdGhleSBhcmUgZ29pbmcgdG8gYmUgcmVuZGVyZWQgb3Igbm90LlxyXG4gKi9cclxuY2xhc3MgTm9kZU1hdGVyaWFsT2JzZXJ2ZXIge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG5vZGUgbWF0ZXJpYWwgb2JzZXJ2ZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIG5vZGUgYnVpbGRlci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggYnVpbGRlciApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgbm9kZSBtYXRlcmlhbCBjYW4gYmUgdXNlZCBieSBtb3JlIHRoYW4gb25lIHJlbmRlciBvYmplY3Qgc28gdGhlXHJcblx0XHQgKiBtb25pdG9yIG11c3QgbWFpbnRhaW4gYSBsaXN0IG9mIHJlbmRlciBvYmplY3RzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtXZWFrTWFwPFJlbmRlck9iamVjdCxPYmplY3Q+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJlbmRlck9iamVjdHMgPSBuZXcgV2Vha01hcCgpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgbWF0ZXJpYWwgdXNlcyBub2RlIG9iamVjdHMgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmhhc05vZGUgPSB0aGlzLmNvbnRhaW5zTm9kZSggYnVpbGRlciApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgbm9kZSBidWlsZGVyJ3MgM0Qgb2JqZWN0IGlzIGFuaW1hdGVkIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5oYXNBbmltYXRpb24gPSBidWlsZGVyLm9iamVjdC5pc1NraW5uZWRNZXNoID09PSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBsaXN0IG9mIGFsbCBwb3NzaWJsZSBtYXRlcmlhbCB1bmlmb3Jtc1xyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJlZnJlc2hVbmlmb3JtcyA9IHJlZnJlc2hVbmlmb3JtcztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvbGRzIHRoZSBjdXJyZW50IHJlbmRlciBJRCBmcm9tIHRoZSBub2RlIGZyYW1lLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVuZGVySWQgPSAwO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBnaXZlbiByZW5kZXIgb2JqZWN0IGlzIHZlcmlmaWVkIGZvciB0aGUgZmlyc3QgdGltZSBvZiB0aGlzIG9ic2VydmVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSZW5kZXJPYmplY3R9IHJlbmRlck9iamVjdCAtIFRoZSByZW5kZXIgb2JqZWN0LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGdpdmVuIHJlbmRlciBvYmplY3QgaXMgdmVyaWZpZWQgZm9yIHRoZSBmaXJzdCB0aW1lIG9mIHRoaXMgb2JzZXJ2ZXIuXHJcblx0ICovXHJcblx0Zmlyc3RJbml0aWFsaXphdGlvbiggcmVuZGVyT2JqZWN0ICkge1xyXG5cclxuXHRcdGNvbnN0IGhhc0luaXRpYWxpemVkID0gdGhpcy5yZW5kZXJPYmplY3RzLmhhcyggcmVuZGVyT2JqZWN0ICk7XHJcblxyXG5cdFx0aWYgKCBoYXNJbml0aWFsaXplZCA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmdldFJlbmRlck9iamVjdERhdGEoIHJlbmRlck9iamVjdCApO1xyXG5cclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBmYWxzZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIG1vbml0b3JpbmcgZGF0YSBmb3IgdGhlIGdpdmVuIHJlbmRlciBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JlbmRlck9iamVjdH0gcmVuZGVyT2JqZWN0IC0gVGhlIHJlbmRlciBvYmplY3QuXHJcblx0ICogQHJldHVybiB7T2JqZWN0fSBUaGUgbW9uaXRvcmluZyBkYXRhLlxyXG5cdCAqL1xyXG5cdGdldFJlbmRlck9iamVjdERhdGEoIHJlbmRlck9iamVjdCApIHtcclxuXHJcblx0XHRsZXQgZGF0YSA9IHRoaXMucmVuZGVyT2JqZWN0cy5nZXQoIHJlbmRlck9iamVjdCApO1xyXG5cclxuXHRcdGlmICggZGF0YSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Y29uc3QgeyBnZW9tZXRyeSwgbWF0ZXJpYWwsIG9iamVjdCB9ID0gcmVuZGVyT2JqZWN0O1xyXG5cclxuXHRcdFx0ZGF0YSA9IHtcclxuXHRcdFx0XHRtYXRlcmlhbDogdGhpcy5nZXRNYXRlcmlhbERhdGEoIG1hdGVyaWFsICksXHJcblx0XHRcdFx0Z2VvbWV0cnk6IHtcclxuXHRcdFx0XHRcdGlkOiBnZW9tZXRyeS5pZCxcclxuXHRcdFx0XHRcdGF0dHJpYnV0ZXM6IHRoaXMuZ2V0QXR0cmlidXRlc0RhdGEoIGdlb21ldHJ5LmF0dHJpYnV0ZXMgKSxcclxuXHRcdFx0XHRcdGluZGV4VmVyc2lvbjogZ2VvbWV0cnkuaW5kZXggPyBnZW9tZXRyeS5pbmRleC52ZXJzaW9uIDogbnVsbCxcclxuXHRcdFx0XHRcdGRyYXdSYW5nZTogeyBzdGFydDogZ2VvbWV0cnkuZHJhd1JhbmdlLnN0YXJ0LCBjb3VudDogZ2VvbWV0cnkuZHJhd1JhbmdlLmNvdW50IH1cclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdHdvcmxkTWF0cml4OiBvYmplY3QubWF0cml4V29ybGQuY2xvbmUoKVxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0aWYgKCBvYmplY3QuY2VudGVyICkge1xyXG5cclxuXHRcdFx0XHRkYXRhLmNlbnRlciA9IG9iamVjdC5jZW50ZXIuY2xvbmUoKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggb2JqZWN0Lm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyApIHtcclxuXHJcblx0XHRcdFx0ZGF0YS5tb3JwaFRhcmdldEluZmx1ZW5jZXMgPSBvYmplY3QubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnNsaWNlKCk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHJlbmRlck9iamVjdC5idW5kbGUgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdGRhdGEudmVyc2lvbiA9IHJlbmRlck9iamVjdC5idW5kbGUudmVyc2lvbjtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggZGF0YS5tYXRlcmlhbC50cmFuc21pc3Npb24gPiAwICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IHJlbmRlck9iamVjdC5jb250ZXh0O1xyXG5cclxuXHRcdFx0XHRkYXRhLmJ1ZmZlcldpZHRoID0gd2lkdGg7XHJcblx0XHRcdFx0ZGF0YS5idWZmZXJIZWlnaHQgPSBoZWlnaHQ7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0aGlzLnJlbmRlck9iamVjdHMuc2V0KCByZW5kZXJPYmplY3QsIGRhdGEgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGRhdGE7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhbiBhdHRyaWJ1dGUgZGF0YSBzdHJ1Y3R1cmUgaG9sZGluZyB0aGUgYXR0cmlidXRlcyB2ZXJzaW9ucyBmb3JcclxuXHQgKiBtb25pdG9yaW5nLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGF0dHJpYnV0ZXMgLSBUaGUgZ2VvbWV0cnkgYXR0cmlidXRlcy5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3R9IEFuIG9iamVjdCBmb3IgbW9uaXRvcmluZyB0aGUgdmVyc2lvbnMgb2YgYXR0cmlidXRlcy5cclxuXHQgKi9cclxuXHRnZXRBdHRyaWJ1dGVzRGF0YSggYXR0cmlidXRlcyApIHtcclxuXHJcblx0XHRjb25zdCBhdHRyaWJ1dGVzRGF0YSA9IHt9O1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IG5hbWUgaW4gYXR0cmlidXRlcyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbIG5hbWUgXTtcclxuXHJcblx0XHRcdGF0dHJpYnV0ZXNEYXRhWyBuYW1lIF0gPSB7XHJcblx0XHRcdFx0dmVyc2lvbjogYXR0cmlidXRlLnZlcnNpb25cclxuXHRcdFx0fTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGF0dHJpYnV0ZXNEYXRhO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBub2RlIGJ1aWxkZXIncyBtYXRlcmlhbCB1c2VzXHJcblx0ICogbm9kZSBwcm9wZXJ0aWVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBub2RlIGJ1aWxkZXIncyBtYXRlcmlhbCB1c2VzIG5vZGUgcHJvcGVydGllcyBvciBub3QuXHJcblx0ICovXHJcblx0Y29udGFpbnNOb2RlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IG1hdGVyaWFsID0gYnVpbGRlci5tYXRlcmlhbDtcclxuXHJcblx0XHRmb3IgKCBjb25zdCBwcm9wZXJ0eSBpbiBtYXRlcmlhbCApIHtcclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWxbIHByb3BlcnR5IF0gJiYgbWF0ZXJpYWxbIHByb3BlcnR5IF0uaXNOb2RlIClcclxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBidWlsZGVyLnJlbmRlcmVyLm5vZGVzLm1vZGVsVmlld01hdHJpeCAhPT0gbnVsbCB8fCBidWlsZGVyLnJlbmRlcmVyLm5vZGVzLm1vZGVsTm9ybWFsVmlld01hdHJpeCAhPT0gbnVsbCApXHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cclxuXHRcdHJldHVybiBmYWxzZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbWF0ZXJpYWwgZGF0YSBzdHJ1Y3R1cmUgaG9sZGluZyB0aGUgbWF0ZXJpYWwgcHJvcGVydHkgdmFsdWVzIGZvclxyXG5cdCAqIG1vbml0b3JpbmcuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdGVyaWFsfSBtYXRlcmlhbCAtIFRoZSBtYXRlcmlhbC5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3R9IEFuIG9iamVjdCBmb3IgbW9uaXRvcmluZyBtYXRlcmlhbCBwcm9wZXJ0aWVzLlxyXG5cdCAqL1xyXG5cdGdldE1hdGVyaWFsRGF0YSggbWF0ZXJpYWwgKSB7XHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IHt9O1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IHByb3BlcnR5IG9mIHRoaXMucmVmcmVzaFVuaWZvcm1zICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdmFsdWUgPSBtYXRlcmlhbFsgcHJvcGVydHkgXTtcclxuXHJcblx0XHRcdGlmICggdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCApIGNvbnRpbnVlO1xyXG5cclxuXHRcdFx0aWYgKCB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlLmNsb25lICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggdmFsdWUuaXNUZXh0dXJlID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRcdGRhdGFbIHByb3BlcnR5IF0gPSB7IGlkOiB2YWx1ZS5pZCwgdmVyc2lvbjogdmFsdWUudmVyc2lvbiB9O1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdGRhdGFbIHByb3BlcnR5IF0gPSB2YWx1ZS5jbG9uZSgpO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRkYXRhWyBwcm9wZXJ0eSBdID0gdmFsdWU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBkYXRhO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBnaXZlbiByZW5kZXIgb2JqZWN0IGhhcyBub3QgY2hhbmdlZCBpdHMgc3RhdGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JlbmRlck9iamVjdH0gcmVuZGVyT2JqZWN0IC0gVGhlIHJlbmRlciBvYmplY3QuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZ2l2ZW4gcmVuZGVyIG9iamVjdCBoYXMgY2hhbmdlZCBpdHMgc3RhdGUgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGVxdWFscyggcmVuZGVyT2JqZWN0ICkge1xyXG5cclxuXHRcdGNvbnN0IHsgb2JqZWN0LCBtYXRlcmlhbCwgZ2VvbWV0cnkgfSA9IHJlbmRlck9iamVjdDtcclxuXHJcblx0XHRjb25zdCByZW5kZXJPYmplY3REYXRhID0gdGhpcy5nZXRSZW5kZXJPYmplY3REYXRhKCByZW5kZXJPYmplY3QgKTtcclxuXHJcblx0XHQvLyB3b3JsZCBtYXRyaXhcclxuXHJcblx0XHRpZiAoIHJlbmRlck9iamVjdERhdGEud29ybGRNYXRyaXguZXF1YWxzKCBvYmplY3QubWF0cml4V29ybGQgKSAhPT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdHJlbmRlck9iamVjdERhdGEud29ybGRNYXRyaXguY29weSggb2JqZWN0Lm1hdHJpeFdvcmxkICk7XHJcblxyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIG1hdGVyaWFsXHJcblxyXG5cdFx0Y29uc3QgbWF0ZXJpYWxEYXRhID0gcmVuZGVyT2JqZWN0RGF0YS5tYXRlcmlhbDtcclxuXHJcblx0XHRmb3IgKCBjb25zdCBwcm9wZXJ0eSBpbiBtYXRlcmlhbERhdGEgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB2YWx1ZSA9IG1hdGVyaWFsRGF0YVsgcHJvcGVydHkgXTtcclxuXHRcdFx0Y29uc3QgbXRsVmFsdWUgPSBtYXRlcmlhbFsgcHJvcGVydHkgXTtcclxuXHJcblx0XHRcdGlmICggdmFsdWUuZXF1YWxzICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggdmFsdWUuZXF1YWxzKCBtdGxWYWx1ZSApID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdFx0XHR2YWx1ZS5jb3B5KCBtdGxWYWx1ZSApO1xyXG5cclxuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggbXRsVmFsdWUuaXNUZXh0dXJlID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIHZhbHVlLmlkICE9PSBtdGxWYWx1ZS5pZCB8fCB2YWx1ZS52ZXJzaW9uICE9PSBtdGxWYWx1ZS52ZXJzaW9uICkge1xyXG5cclxuXHRcdFx0XHRcdHZhbHVlLmlkID0gbXRsVmFsdWUuaWQ7XHJcblx0XHRcdFx0XHR2YWx1ZS52ZXJzaW9uID0gbXRsVmFsdWUudmVyc2lvbjtcclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIHZhbHVlICE9PSBtdGxWYWx1ZSApIHtcclxuXHJcblx0XHRcdFx0bWF0ZXJpYWxEYXRhWyBwcm9wZXJ0eSBdID0gbXRsVmFsdWU7XHJcblxyXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBtYXRlcmlhbERhdGEudHJhbnNtaXNzaW9uID4gMCApIHtcclxuXHJcblx0XHRcdGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gcmVuZGVyT2JqZWN0LmNvbnRleHQ7XHJcblxyXG5cdFx0XHRpZiAoIHJlbmRlck9iamVjdERhdGEuYnVmZmVyV2lkdGggIT09IHdpZHRoIHx8IHJlbmRlck9iamVjdERhdGEuYnVmZmVySGVpZ2h0ICE9PSBoZWlnaHQgKSB7XHJcblxyXG5cdFx0XHRcdHJlbmRlck9iamVjdERhdGEuYnVmZmVyV2lkdGggPSB3aWR0aDtcclxuXHRcdFx0XHRyZW5kZXJPYmplY3REYXRhLmJ1ZmZlckhlaWdodCA9IGhlaWdodDtcclxuXHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBnZW9tZXRyeVxyXG5cclxuXHRcdGNvbnN0IHN0b3JlZEdlb21ldHJ5RGF0YSA9IHJlbmRlck9iamVjdERhdGEuZ2VvbWV0cnk7XHJcblx0XHRjb25zdCBhdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlcztcclxuXHRcdGNvbnN0IHN0b3JlZEF0dHJpYnV0ZXMgPSBzdG9yZWRHZW9tZXRyeURhdGEuYXR0cmlidXRlcztcclxuXHJcblx0XHRjb25zdCBzdG9yZWRBdHRyaWJ1dGVOYW1lcyA9IE9iamVjdC5rZXlzKCBzdG9yZWRBdHRyaWJ1dGVzICk7XHJcblx0XHRjb25zdCBjdXJyZW50QXR0cmlidXRlTmFtZXMgPSBPYmplY3Qua2V5cyggYXR0cmlidXRlcyApO1xyXG5cclxuXHRcdGlmICggc3RvcmVkR2VvbWV0cnlEYXRhLmlkICE9PSBnZW9tZXRyeS5pZCApIHtcclxuXHJcblx0XHRcdHN0b3JlZEdlb21ldHJ5RGF0YS5pZCA9IGdlb21ldHJ5LmlkO1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggc3RvcmVkQXR0cmlidXRlTmFtZXMubGVuZ3RoICE9PSBjdXJyZW50QXR0cmlidXRlTmFtZXMubGVuZ3RoICkge1xyXG5cclxuXHRcdFx0cmVuZGVyT2JqZWN0RGF0YS5nZW9tZXRyeS5hdHRyaWJ1dGVzID0gdGhpcy5nZXRBdHRyaWJ1dGVzRGF0YSggYXR0cmlidXRlcyApO1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGNvbXBhcmUgZWFjaCBhdHRyaWJ1dGVcclxuXHJcblx0XHRmb3IgKCBjb25zdCBuYW1lIG9mIHN0b3JlZEF0dHJpYnV0ZU5hbWVzICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgc3RvcmVkQXR0cmlidXRlRGF0YSA9IHN0b3JlZEF0dHJpYnV0ZXNbIG5hbWUgXTtcclxuXHRcdFx0Y29uc3QgYXR0cmlidXRlID0gYXR0cmlidXRlc1sgbmFtZSBdO1xyXG5cclxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0Ly8gYXR0cmlidXRlIHdhcyByZW1vdmVkXHJcblx0XHRcdFx0ZGVsZXRlIHN0b3JlZEF0dHJpYnV0ZXNbIG5hbWUgXTtcclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHN0b3JlZEF0dHJpYnV0ZURhdGEudmVyc2lvbiAhPT0gYXR0cmlidXRlLnZlcnNpb24gKSB7XHJcblxyXG5cdFx0XHRcdHN0b3JlZEF0dHJpYnV0ZURhdGEudmVyc2lvbiA9IGF0dHJpYnV0ZS52ZXJzaW9uO1xyXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gY2hlY2sgaW5kZXhcclxuXHJcblx0XHRjb25zdCBpbmRleCA9IGdlb21ldHJ5LmluZGV4O1xyXG5cdFx0Y29uc3Qgc3RvcmVkSW5kZXhWZXJzaW9uID0gc3RvcmVkR2VvbWV0cnlEYXRhLmluZGV4VmVyc2lvbjtcclxuXHRcdGNvbnN0IGN1cnJlbnRJbmRleFZlcnNpb24gPSBpbmRleCA/IGluZGV4LnZlcnNpb24gOiBudWxsO1xyXG5cclxuXHRcdGlmICggc3RvcmVkSW5kZXhWZXJzaW9uICE9PSBjdXJyZW50SW5kZXhWZXJzaW9uICkge1xyXG5cclxuXHRcdFx0c3RvcmVkR2VvbWV0cnlEYXRhLmluZGV4VmVyc2lvbiA9IGN1cnJlbnRJbmRleFZlcnNpb247XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gY2hlY2sgZHJhd1JhbmdlXHJcblxyXG5cdFx0aWYgKCBzdG9yZWRHZW9tZXRyeURhdGEuZHJhd1JhbmdlLnN0YXJ0ICE9PSBnZW9tZXRyeS5kcmF3UmFuZ2Uuc3RhcnQgfHwgc3RvcmVkR2VvbWV0cnlEYXRhLmRyYXdSYW5nZS5jb3VudCAhPT0gZ2VvbWV0cnkuZHJhd1JhbmdlLmNvdW50ICkge1xyXG5cclxuXHRcdFx0c3RvcmVkR2VvbWV0cnlEYXRhLmRyYXdSYW5nZS5zdGFydCA9IGdlb21ldHJ5LmRyYXdSYW5nZS5zdGFydDtcclxuXHRcdFx0c3RvcmVkR2VvbWV0cnlEYXRhLmRyYXdSYW5nZS5jb3VudCA9IGdlb21ldHJ5LmRyYXdSYW5nZS5jb3VudDtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBtb3JwaCB0YXJnZXRzXHJcblxyXG5cdFx0aWYgKCByZW5kZXJPYmplY3REYXRhLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyApIHtcclxuXHJcblx0XHRcdGxldCBtb3JwaENoYW5nZWQgPSBmYWxzZTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHJlbmRlck9iamVjdERhdGEubW9ycGhUYXJnZXRJbmZsdWVuY2VzLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0aWYgKCByZW5kZXJPYmplY3REYXRhLm1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgaSBdICE9PSBvYmplY3QubW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBpIF0gKSB7XHJcblxyXG5cdFx0XHRcdFx0bW9ycGhDaGFuZ2VkID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBtb3JwaENoYW5nZWQgKSByZXR1cm4gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gY2VudGVyXHJcblxyXG5cdFx0aWYgKCByZW5kZXJPYmplY3REYXRhLmNlbnRlciApIHtcclxuXHJcblx0XHRcdGlmICggcmVuZGVyT2JqZWN0RGF0YS5jZW50ZXIuZXF1YWxzKCBvYmplY3QuY2VudGVyICkgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0XHRyZW5kZXJPYmplY3REYXRhLmNlbnRlci5jb3B5KCBvYmplY3QuY2VudGVyICk7XHJcblxyXG5cdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBidW5kbGVcclxuXHJcblx0XHRpZiAoIHJlbmRlck9iamVjdC5idW5kbGUgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRyZW5kZXJPYmplY3REYXRhLnZlcnNpb24gPSByZW5kZXJPYmplY3QuYnVuZGxlLnZlcnNpb247XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gcmVuZGVyIG9iamVjdCByZXF1aXJlcyBhIHJlZnJlc2guXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JlbmRlck9iamVjdH0gcmVuZGVyT2JqZWN0IC0gVGhlIHJlbmRlciBvYmplY3QuXHJcblx0ICogQHBhcmFtIHtOb2RlRnJhbWV9IG5vZGVGcmFtZSAtIFRoZSBjdXJyZW50IG5vZGUgZnJhbWUuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZ2l2ZW4gcmVuZGVyIG9iamVjdCByZXF1aXJlcyBhIHJlZnJlc2ggb3Igbm90LlxyXG5cdCAqL1xyXG5cdG5lZWRzUmVmcmVzaCggcmVuZGVyT2JqZWN0LCBub2RlRnJhbWUgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmhhc05vZGUgfHwgdGhpcy5oYXNBbmltYXRpb24gfHwgdGhpcy5maXJzdEluaXRpYWxpemF0aW9uKCByZW5kZXJPYmplY3QgKSApXHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cclxuXHRcdGNvbnN0IHsgcmVuZGVySWQgfSA9IG5vZGVGcmFtZTtcclxuXHJcblx0XHRpZiAoIHRoaXMucmVuZGVySWQgIT09IHJlbmRlcklkICkge1xyXG5cclxuXHRcdFx0dGhpcy5yZW5kZXJJZCA9IHJlbmRlcklkO1xyXG5cclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGlzU3RhdGljID0gcmVuZGVyT2JqZWN0Lm9iamVjdC5zdGF0aWMgPT09IHRydWU7XHJcblx0XHRjb25zdCBpc0J1bmRsZSA9IHJlbmRlck9iamVjdC5idW5kbGUgIT09IG51bGwgJiYgcmVuZGVyT2JqZWN0LmJ1bmRsZS5zdGF0aWMgPT09IHRydWUgJiYgdGhpcy5nZXRSZW5kZXJPYmplY3REYXRhKCByZW5kZXJPYmplY3QgKS52ZXJzaW9uID09PSByZW5kZXJPYmplY3QuYnVuZGxlLnZlcnNpb247XHJcblxyXG5cdFx0aWYgKCBpc1N0YXRpYyB8fCBpc0J1bmRsZSApXHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHJcblx0XHRjb25zdCBub3RFcXVhbCA9IHRoaXMuZXF1YWxzKCByZW5kZXJPYmplY3QgKSAhPT0gdHJ1ZTtcclxuXHJcblx0XHRyZXR1cm4gbm90RXF1YWw7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IE5vZGVNYXRlcmlhbE9ic2VydmVyO1xyXG4iLCJpbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uLy4uL21hdGgvQ29sb3IuanMnO1xyXG5pbXBvcnQgeyBNYXRyaXgyIH0gZnJvbSAnLi4vLi4vbWF0aC9NYXRyaXgyLmpzJztcclxuaW1wb3J0IHsgTWF0cml4MyB9IGZyb20gJy4uLy4uL21hdGgvTWF0cml4My5qcyc7XHJcbmltcG9ydCB7IE1hdHJpeDQgfSBmcm9tICcuLi8uLi9tYXRoL01hdHJpeDQuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IyLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjQgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjQuanMnO1xyXG5cclxuLy8gY3lyYjUzIChjKSAyMDE4IGJyeWMgKGdpdGh1Yi5jb20vYnJ5YykuIExpY2Vuc2U6IFB1YmxpYyBkb21haW4uIEF0dHJpYnV0aW9uIGFwcHJlY2lhdGVkLlxyXG4vLyBBIGZhc3QgYW5kIHNpbXBsZSA2NC1iaXQgKG9yIDUzLWJpdCkgc3RyaW5nIGhhc2ggZnVuY3Rpb24gd2l0aCBkZWNlbnQgY29sbGlzaW9uIHJlc2lzdGFuY2UuXHJcbi8vIExhcmdlbHkgaW5zcGlyZWQgYnkgTXVybXVySGFzaDIvMywgYnV0IHdpdGggYSBmb2N1cyBvbiBzcGVlZC9zaW1wbGljaXR5LlxyXG4vLyBTZWUgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNzYxNjQ2MS9nZW5lcmF0ZS1hLWhhc2gtZnJvbS1zdHJpbmctaW4tamF2YXNjcmlwdC81MjE3MTQ4MCM1MjE3MTQ4MFxyXG4vLyBodHRwczovL2dpdGh1Yi5jb20vYnJ5Yy9jb2RlL2Jsb2IvbWFzdGVyL2pzaGFzaC9leHBlcmltZW50YWwvY3lyYjUzLmpzXHJcbmZ1bmN0aW9uIGN5cmI1MyggdmFsdWUsIHNlZWQgPSAwICkge1xyXG5cclxuXHRsZXQgaDEgPSAweGRlYWRiZWVmIF4gc2VlZCwgaDIgPSAweDQxYzZjZTU3IF4gc2VlZDtcclxuXHJcblx0aWYgKCB2YWx1ZSBpbnN0YW5jZW9mIEFycmF5ICkge1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgdmFsOyBpIDwgdmFsdWUubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0dmFsID0gdmFsdWVbIGkgXTtcclxuXHRcdFx0aDEgPSBNYXRoLmltdWwoIGgxIF4gdmFsLCAyNjU0NDM1NzYxICk7XHJcblx0XHRcdGgyID0gTWF0aC5pbXVsKCBoMiBeIHZhbCwgMTU5NzMzNDY3NyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fSBlbHNlIHtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGNoOyBpIDwgdmFsdWUubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y2ggPSB2YWx1ZS5jaGFyQ29kZUF0KCBpICk7XHJcblx0XHRcdGgxID0gTWF0aC5pbXVsKCBoMSBeIGNoLCAyNjU0NDM1NzYxICk7XHJcblx0XHRcdGgyID0gTWF0aC5pbXVsKCBoMiBeIGNoLCAxNTk3MzM0Njc3ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGgxID0gTWF0aC5pbXVsKCBoMSBeICggaDEgPj4+IDE2ICksIDIyNDY4MjI1MDcgKTtcclxuXHRoMSBePSBNYXRoLmltdWwoIGgyIF4gKCBoMiA+Pj4gMTMgKSwgMzI2NjQ4OTkwOSApO1xyXG5cdGgyID0gTWF0aC5pbXVsKCBoMiBeICggaDIgPj4+IDE2ICksIDIyNDY4MjI1MDcgKTtcclxuXHRoMiBePSBNYXRoLmltdWwoIGgxIF4gKCBoMSA+Pj4gMTMgKSwgMzI2NjQ4OTkwOSApO1xyXG5cclxuXHRyZXR1cm4gNDI5NDk2NzI5NiAqICggMjA5NzE1MSAmIGgyICkgKyAoIGgxID4+PiAwICk7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQ29tcHV0ZXMgYSBoYXNoIGZvciB0aGUgZ2l2ZW4gc3RyaW5nLlxyXG4gKlxyXG4gKiBAbWV0aG9kXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgLSBUaGUgc3RyaW5nIHRvIGJlIGhhc2hlZC5cclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgaGFzaC5cclxuICovXHJcbmV4cG9ydCBjb25zdCBoYXNoU3RyaW5nID0gKCBzdHIgKSA9PiBjeXJiNTMoIHN0ciApO1xyXG5cclxuLyoqXHJcbiAqIENvbXB1dGVzIGEgaGFzaCBmb3IgdGhlIGdpdmVuIGFycmF5LlxyXG4gKlxyXG4gKiBAbWV0aG9kXHJcbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gYXJyYXkgLSBUaGUgYXJyYXkgdG8gYmUgaGFzaGVkLlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBoYXNoLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGhhc2hBcnJheSA9ICggYXJyYXkgKSA9PiBjeXJiNTMoIGFycmF5ICk7XHJcblxyXG4vKipcclxuICogQ29tcHV0ZXMgYSBoYXNoIGZvciB0aGUgZ2l2ZW4gbGlzdCBvZiBwYXJhbWV0ZXJzLlxyXG4gKlxyXG4gKiBAbWV0aG9kXHJcbiAqIEBwYXJhbSB7Li4ubnVtYmVyfSBwYXJhbXMgLSBBIGxpc3Qgb2YgcGFyYW1ldGVycy5cclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgaGFzaC5cclxuICovXHJcbmV4cG9ydCBjb25zdCBoYXNoID0gKCAuLi5wYXJhbXMgKSA9PiBjeXJiNTMoIHBhcmFtcyApO1xyXG5cclxuLyoqXHJcbiAqIENvbXB1dGVzIGEgY2FjaGUga2V5IGZvciB0aGUgZ2l2ZW4gbm9kZS5cclxuICpcclxuICogQG1ldGhvZFxyXG4gKiBAcGFyYW0ge09iamVjdHxOb2RlfSBvYmplY3QgLSBUaGUgb2JqZWN0IHRvIGJlIGhhc2hlZC5cclxuICogQHBhcmFtIHtib29sZWFufSBbZm9yY2U9ZmFsc2VdIC0gV2hldGhlciB0byBmb3JjZSBhIGNhY2hlIGtleSBjb21wdXRhdGlvbiBvciBub3QuXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGhhc2guXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2FjaGVLZXkoIG9iamVjdCwgZm9yY2UgPSBmYWxzZSApIHtcclxuXHJcblx0Y29uc3QgdmFsdWVzID0gW107XHJcblxyXG5cdGlmICggb2JqZWN0LmlzTm9kZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHR2YWx1ZXMucHVzaCggb2JqZWN0LmlkICk7XHJcblx0XHRvYmplY3QgPSBvYmplY3QuZ2V0U2VsZigpO1xyXG5cclxuXHR9XHJcblxyXG5cdGZvciAoIGNvbnN0IHsgcHJvcGVydHksIGNoaWxkTm9kZSB9IG9mIGdldE5vZGVDaGlsZHJlbiggb2JqZWN0ICkgKSB7XHJcblxyXG5cdFx0dmFsdWVzLnB1c2goIGN5cmI1MyggcHJvcGVydHkuc2xpY2UoIDAsIC0gNCApICksIGNoaWxkTm9kZS5nZXRDYWNoZUtleSggZm9yY2UgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiBjeXJiNTMoIHZhbHVlcyApO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFRoaXMgZ2VuZXJhdG9yIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGl0ZXJhdGUgb3ZlciB0aGUgbm9kZSBjaGlsZHJlblxyXG4gKiBvZiB0aGUgZ2l2ZW4gb2JqZWN0LlxyXG4gKlxyXG4gKiBAZ2VuZXJhdG9yXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBub2RlIC0gVGhlIG9iamVjdCB0byBiZSBoYXNoZWQuXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3RvSlNPTj1mYWxzZV0gLSBXaGV0aGVyIHRvIHJldHVybiBKU09OIG9yIG5vdC5cclxuICogQHlpZWxkcyB7T2JqZWN0fSBBIHJlc3VsdCBub2RlIGhvbGRpbmcgdGhlIHByb3BlcnR5LCBpbmRleCAoaWYgYXZhaWxhYmxlKSBhbmQgdGhlIGNoaWxkIG5vZGUuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24qIGdldE5vZGVDaGlsZHJlbiggbm9kZSwgdG9KU09OID0gZmFsc2UgKSB7XHJcblxyXG5cdGZvciAoIGNvbnN0IHByb3BlcnR5IGluIG5vZGUgKSB7XHJcblxyXG5cdFx0Ly8gSWdub3JlIHByaXZhdGUgcHJvcGVydGllcy5cclxuXHRcdGlmICggcHJvcGVydHkuc3RhcnRzV2l0aCggJ18nICkgPT09IHRydWUgKSBjb250aW51ZTtcclxuXHJcblx0XHRjb25zdCBvYmplY3QgPSBub2RlWyBwcm9wZXJ0eSBdO1xyXG5cclxuXHRcdGlmICggQXJyYXkuaXNBcnJheSggb2JqZWN0ICkgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBvYmplY3QubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBjaGlsZCA9IG9iamVjdFsgaSBdO1xyXG5cclxuXHRcdFx0XHRpZiAoIGNoaWxkICYmICggY2hpbGQuaXNOb2RlID09PSB0cnVlIHx8IHRvSlNPTiAmJiB0eXBlb2YgY2hpbGQudG9KU09OID09PSAnZnVuY3Rpb24nICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0eWllbGQgeyBwcm9wZXJ0eSwgaW5kZXg6IGksIGNoaWxkTm9kZTogY2hpbGQgfTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSBpZiAoIG9iamVjdCAmJiBvYmplY3QuaXNOb2RlID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0eWllbGQgeyBwcm9wZXJ0eSwgY2hpbGROb2RlOiBvYmplY3QgfTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyApIHtcclxuXHJcblx0XHRcdGZvciAoIGNvbnN0IHN1YlByb3BlcnR5IGluIG9iamVjdCApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgY2hpbGQgPSBvYmplY3RbIHN1YlByb3BlcnR5IF07XHJcblxyXG5cdFx0XHRcdGlmICggY2hpbGQgJiYgKCBjaGlsZC5pc05vZGUgPT09IHRydWUgfHwgdG9KU09OICYmIHR5cGVvZiBjaGlsZC50b0pTT04gPT09ICdmdW5jdGlvbicgKSApIHtcclxuXHJcblx0XHRcdFx0XHR5aWVsZCB7IHByb3BlcnR5LCBpbmRleDogc3ViUHJvcGVydHksIGNoaWxkTm9kZTogY2hpbGQgfTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuY29uc3QgdHlwZUZyb21MZW5ndGggPSAvKkBfX1BVUkVfXyovIG5ldyBNYXAoIFtcclxuXHRbIDEsICdmbG9hdCcgXSxcclxuXHRbIDIsICd2ZWMyJyBdLFxyXG5cdFsgMywgJ3ZlYzMnIF0sXHJcblx0WyA0LCAndmVjNCcgXSxcclxuXHRbIDksICdtYXQzJyBdLFxyXG5cdFsgMTYsICdtYXQ0JyBdXHJcbl0gKTtcclxuXHJcbmNvbnN0IGRhdGFGcm9tT2JqZWN0ID0gLypAX19QVVJFX18qLyBuZXcgV2Vha01hcCgpO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIGRhdGEgdHlwZSBmb3IgdGhlIGdpdmVuIHRoZSBsZW5ndGguXHJcbiAqXHJcbiAqIEBtZXRob2RcclxuICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCAtIFRoZSBsZW5ndGguXHJcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGRhdGEgdHlwZS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRUeXBlRnJvbUxlbmd0aCggbGVuZ3RoICkge1xyXG5cclxuXHRyZXR1cm4gdHlwZUZyb21MZW5ndGguZ2V0KCBsZW5ndGggKTtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSB0eXBlZCBhcnJheSBmb3IgdGhlIGdpdmVuIGRhdGEgdHlwZS5cclxuICpcclxuICogQG1ldGhvZFxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSBkYXRhIHR5cGUuXHJcbiAqIEByZXR1cm4ge1R5cGVkQXJyYXl9IFRoZSB0eXBlZCBhcnJheS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRUeXBlZEFycmF5RnJvbVR5cGUoIHR5cGUgKSB7XHJcblxyXG5cdC8vIEhhbmRsZSBjb21wb25lbnQgdHlwZSBmb3IgdmVjdG9ycyBhbmQgbWF0cmljZXNcclxuXHRpZiAoIC9baXVdP3ZlY1xcZC8udGVzdCggdHlwZSApICkge1xyXG5cclxuXHRcdC8vIEhhbmRsZSBpbnQgdmVjdG9yc1xyXG5cdFx0aWYgKCB0eXBlLnN0YXJ0c1dpdGgoICdpdmVjJyApICkgcmV0dXJuIEludDMyQXJyYXk7XHJcblx0XHQvLyBIYW5kbGUgdWludCB2ZWN0b3JzXHJcblx0XHRpZiAoIHR5cGUuc3RhcnRzV2l0aCggJ3V2ZWMnICkgKSByZXR1cm4gVWludDMyQXJyYXk7XHJcblx0XHQvLyBEZWZhdWx0IHRvIGZsb2F0IHZlY3RvcnNcclxuXHRcdHJldHVybiBGbG9hdDMyQXJyYXk7XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gSGFuZGxlIG1hdHJpY2VzIChhbHdheXMgZmxvYXQpXHJcblx0aWYgKCAvbWF0XFxkLy50ZXN0KCB0eXBlICkgKSByZXR1cm4gRmxvYXQzMkFycmF5O1xyXG5cclxuXHQvLyBCYXNpYyB0eXBlc1xyXG5cdGlmICggL2Zsb2F0Ly50ZXN0KCB0eXBlICkgKSByZXR1cm4gRmxvYXQzMkFycmF5O1xyXG5cdGlmICggL3VpbnQvLnRlc3QoIHR5cGUgKSApIHJldHVybiBVaW50MzJBcnJheTtcclxuXHRpZiAoIC9pbnQvLnRlc3QoIHR5cGUgKSApIHJldHVybiBJbnQzMkFycmF5O1xyXG5cclxuXHR0aHJvdyBuZXcgRXJyb3IoIGBUSFJFRS5Ob2RlVXRpbHM6IFVuc3VwcG9ydGVkIHR5cGU6ICR7dHlwZX1gICk7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgbGVuZ3RoIGZvciB0aGUgZ2l2ZW4gZGF0YSB0eXBlLlxyXG4gKlxyXG4gKiBAbWV0aG9kXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIGRhdGEgdHlwZS5cclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgbGVuZ3RoLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldExlbmd0aEZyb21UeXBlKCB0eXBlICkge1xyXG5cclxuXHRpZiAoIC9mbG9hdHxpbnR8dWludC8udGVzdCggdHlwZSApICkgcmV0dXJuIDE7XHJcblx0aWYgKCAvdmVjMi8udGVzdCggdHlwZSApICkgcmV0dXJuIDI7XHJcblx0aWYgKCAvdmVjMy8udGVzdCggdHlwZSApICkgcmV0dXJuIDM7XHJcblx0aWYgKCAvdmVjNC8udGVzdCggdHlwZSApICkgcmV0dXJuIDQ7XHJcblx0aWYgKCAvbWF0Mi8udGVzdCggdHlwZSApICkgcmV0dXJuIDQ7XHJcblx0aWYgKCAvbWF0My8udGVzdCggdHlwZSApICkgcmV0dXJuIDk7XHJcblx0aWYgKCAvbWF0NC8udGVzdCggdHlwZSApICkgcmV0dXJuIDE2O1xyXG5cclxuXHRjb25zb2xlLmVycm9yKCAnVEhSRUUuVFNMOiBVbnN1cHBvcnRlZCB0eXBlOicsIHR5cGUgKTtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBkYXRhIHR5cGUgZm9yIHRoZSBnaXZlbiB2YWx1ZS5cclxuICpcclxuICogQG1ldGhvZFxyXG4gKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBUaGUgdmFsdWUuXHJcbiAqIEByZXR1cm4gez9zdHJpbmd9IFRoZSBkYXRhIHR5cGUuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmFsdWVUeXBlKCB2YWx1ZSApIHtcclxuXHJcblx0aWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsICkgcmV0dXJuIG51bGw7XHJcblxyXG5cdGNvbnN0IHR5cGVPZiA9IHR5cGVvZiB2YWx1ZTtcclxuXHJcblx0aWYgKCB2YWx1ZS5pc05vZGUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0cmV0dXJuICdub2RlJztcclxuXHJcblx0fSBlbHNlIGlmICggdHlwZU9mID09PSAnbnVtYmVyJyApIHtcclxuXHJcblx0XHRyZXR1cm4gJ2Zsb2F0JztcclxuXHJcblx0fSBlbHNlIGlmICggdHlwZU9mID09PSAnYm9vbGVhbicgKSB7XHJcblxyXG5cdFx0cmV0dXJuICdib29sJztcclxuXHJcblx0fSBlbHNlIGlmICggdHlwZU9mID09PSAnc3RyaW5nJyApIHtcclxuXHJcblx0XHRyZXR1cm4gJ3N0cmluZyc7XHJcblxyXG5cdH0gZWxzZSBpZiAoIHR5cGVPZiA9PT0gJ2Z1bmN0aW9uJyApIHtcclxuXHJcblx0XHRyZXR1cm4gJ3NoYWRlcic7XHJcblxyXG5cdH0gZWxzZSBpZiAoIHZhbHVlLmlzVmVjdG9yMiA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRyZXR1cm4gJ3ZlYzInO1xyXG5cclxuXHR9IGVsc2UgaWYgKCB2YWx1ZS5pc1ZlY3RvcjMgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0cmV0dXJuICd2ZWMzJztcclxuXHJcblx0fSBlbHNlIGlmICggdmFsdWUuaXNWZWN0b3I0ID09PSB0cnVlICkge1xyXG5cclxuXHRcdHJldHVybiAndmVjNCc7XHJcblxyXG5cdH0gZWxzZSBpZiAoIHZhbHVlLmlzTWF0cml4MiA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRyZXR1cm4gJ21hdDInO1xyXG5cclxuXHR9IGVsc2UgaWYgKCB2YWx1ZS5pc01hdHJpeDMgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0cmV0dXJuICdtYXQzJztcclxuXHJcblx0fSBlbHNlIGlmICggdmFsdWUuaXNNYXRyaXg0ID09PSB0cnVlICkge1xyXG5cclxuXHRcdHJldHVybiAnbWF0NCc7XHJcblxyXG5cdH0gZWxzZSBpZiAoIHZhbHVlLmlzQ29sb3IgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0cmV0dXJuICdjb2xvcic7XHJcblxyXG5cdH0gZWxzZSBpZiAoIHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuICdBcnJheUJ1ZmZlcic7XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIG51bGw7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgdmFsdWUvb2JqZWN0IGZvciB0aGUgZ2l2ZW4gZGF0YSB0eXBlIGFuZCBwYXJhbWV0ZXJzLlxyXG4gKlxyXG4gKiBAbWV0aG9kXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIGdpdmVuIHR5cGUuXHJcbiAqIEBwYXJhbSB7Li4uYW55fSBwYXJhbXMgLSBBIHBhcmFtZXRlciBsaXN0LlxyXG4gKiBAcmV0dXJuIHthbnl9IFRoZSB2YWx1ZS9vYmplY3QuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmFsdWVGcm9tVHlwZSggdHlwZSwgLi4ucGFyYW1zICkge1xyXG5cclxuXHRjb25zdCBsYXN0NCA9IHR5cGUgPyB0eXBlLnNsaWNlKCAtIDQgKSA6IHVuZGVmaW5lZDtcclxuXHJcblx0aWYgKCBwYXJhbXMubGVuZ3RoID09PSAxICkgeyAvLyBlbnN1cmUgc2FtZSBiZWhhdmlvdXIgYXMgaW4gTm9kZUJ1aWxkZXIuZm9ybWF0KClcclxuXHJcblx0XHRpZiAoIGxhc3Q0ID09PSAndmVjMicgKSBwYXJhbXMgPSBbIHBhcmFtc1sgMCBdLCBwYXJhbXNbIDAgXSBdO1xyXG5cdFx0ZWxzZSBpZiAoIGxhc3Q0ID09PSAndmVjMycgKSBwYXJhbXMgPSBbIHBhcmFtc1sgMCBdLCBwYXJhbXNbIDAgXSwgcGFyYW1zWyAwIF0gXTtcclxuXHRcdGVsc2UgaWYgKCBsYXN0NCA9PT0gJ3ZlYzQnICkgcGFyYW1zID0gWyBwYXJhbXNbIDAgXSwgcGFyYW1zWyAwIF0sIHBhcmFtc1sgMCBdLCBwYXJhbXNbIDAgXSBdO1xyXG5cclxuXHR9XHJcblxyXG5cdGlmICggdHlwZSA9PT0gJ2NvbG9yJyApIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IENvbG9yKCAuLi5wYXJhbXMgKTtcclxuXHJcblx0fSBlbHNlIGlmICggbGFzdDQgPT09ICd2ZWMyJyApIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IFZlY3RvcjIoIC4uLnBhcmFtcyApO1xyXG5cclxuXHR9IGVsc2UgaWYgKCBsYXN0NCA9PT0gJ3ZlYzMnICkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgVmVjdG9yMyggLi4ucGFyYW1zICk7XHJcblxyXG5cdH0gZWxzZSBpZiAoIGxhc3Q0ID09PSAndmVjNCcgKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBWZWN0b3I0KCAuLi5wYXJhbXMgKTtcclxuXHJcblx0fSBlbHNlIGlmICggbGFzdDQgPT09ICdtYXQyJyApIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IE1hdHJpeDIoIC4uLnBhcmFtcyApO1xyXG5cclxuXHR9IGVsc2UgaWYgKCBsYXN0NCA9PT0gJ21hdDMnICkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgTWF0cml4MyggLi4ucGFyYW1zICk7XHJcblxyXG5cdH0gZWxzZSBpZiAoIGxhc3Q0ID09PSAnbWF0NCcgKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBNYXRyaXg0KCAuLi5wYXJhbXMgKTtcclxuXHJcblx0fSBlbHNlIGlmICggdHlwZSA9PT0gJ2Jvb2wnICkge1xyXG5cclxuXHRcdHJldHVybiBwYXJhbXNbIDAgXSB8fCBmYWxzZTtcclxuXHJcblx0fSBlbHNlIGlmICggKCB0eXBlID09PSAnZmxvYXQnICkgfHwgKCB0eXBlID09PSAnaW50JyApIHx8ICggdHlwZSA9PT0gJ3VpbnQnICkgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHBhcmFtc1sgMCBdIHx8IDA7XHJcblxyXG5cdH0gZWxzZSBpZiAoIHR5cGUgPT09ICdzdHJpbmcnICkge1xyXG5cclxuXHRcdHJldHVybiBwYXJhbXNbIDAgXSB8fCAnJztcclxuXHJcblx0fSBlbHNlIGlmICggdHlwZSA9PT0gJ0FycmF5QnVmZmVyJyApIHtcclxuXHJcblx0XHRyZXR1cm4gYmFzZTY0VG9BcnJheUJ1ZmZlciggcGFyYW1zWyAwIF0gKTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gbnVsbDtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXRzIHRoZSBvYmplY3QgZGF0YSB0aGF0IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBkaWZmZXJlbnQgcmVuZGVyaW5nIHN0ZXBzLlxyXG4gKlxyXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IC0gVGhlIG9iamVjdCB0byBnZXQgdGhlIGRhdGEgZm9yLlxyXG4gKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBvYmplY3QgZGF0YS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXREYXRhRnJvbU9iamVjdCggb2JqZWN0ICkge1xyXG5cclxuXHRsZXQgZGF0YSA9IGRhdGFGcm9tT2JqZWN0LmdldCggb2JqZWN0ICk7XHJcblxyXG5cdGlmICggZGF0YSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdGRhdGEgPSB7fTtcclxuXHRcdGRhdGFGcm9tT2JqZWN0LnNldCggb2JqZWN0LCBkYXRhICk7XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIGRhdGE7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQ29udmVydHMgdGhlIGdpdmVuIGFycmF5IGJ1ZmZlciB0byBhIEJhc2U2NCBzdHJpbmcuXHJcbiAqXHJcbiAqIEBtZXRob2RcclxuICogQHBhcmFtIHtBcnJheUJ1ZmZlcn0gYXJyYXlCdWZmZXIgLSBUaGUgYXJyYXkgYnVmZmVyLlxyXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBCYXNlNjQgc3RyaW5nLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGFycmF5QnVmZmVyVG9CYXNlNjQoIGFycmF5QnVmZmVyICkge1xyXG5cclxuXHRsZXQgY2hhcnMgPSAnJztcclxuXHJcblx0Y29uc3QgYXJyYXkgPSBuZXcgVWludDhBcnJheSggYXJyYXlCdWZmZXIgKTtcclxuXHJcblx0Zm9yICggbGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdGNoYXJzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoIGFycmF5WyBpIF0gKTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gYnRvYSggY2hhcnMgKTtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gQmFzZTY0IHN0cmluZyB0byBhbiBhcnJheSBidWZmZXIuXHJcbiAqXHJcbiAqIEBtZXRob2RcclxuICogQHBhcmFtIHtzdHJpbmd9IGJhc2U2NCAtIFRoZSBCYXNlNjQgc3RyaW5nLlxyXG4gKiBAcmV0dXJuIHtBcnJheUJ1ZmZlcn0gVGhlIGFycmF5IGJ1ZmZlci5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBiYXNlNjRUb0FycmF5QnVmZmVyKCBiYXNlNjQgKSB7XHJcblxyXG5cdHJldHVybiBVaW50OEFycmF5LmZyb20oIGF0b2IoIGJhc2U2NCApLCBjID0+IGMuY2hhckNvZGVBdCggMCApICkuYnVmZmVyO1xyXG5cclxufVxyXG4iLCIvKipcclxuICogUG9zc2libGUgc2hhZGVyIHN0YWdlcy5cclxuICpcclxuICogQHByb3BlcnR5IHtzdHJpbmd9IFZFUlRFWCBUaGUgdmVydGV4IHNoYWRlciBzdGFnZS5cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IEZSQUdNRU5UIFRoZSBmcmFnbWVudCBzaGFkZXIgc3RhZ2UuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTm9kZVNoYWRlclN0YWdlID0ge1xyXG5cdFZFUlRFWDogJ3ZlcnRleCcsXHJcblx0RlJBR01FTlQ6ICdmcmFnbWVudCdcclxufTtcclxuXHJcbi8qKlxyXG4gKiBVcGRhdGUgdHlwZXMgb2YgYSBub2RlLlxyXG4gKlxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTk9ORSBUaGUgdXBkYXRlIG1ldGhvZCBpcyBub3QgZXhlY3V0ZWQuXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBGUkFNRSBUaGUgdXBkYXRlIG1ldGhvZCBpcyBleGVjdXRlZCBwZXIgZnJhbWUuXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSRU5ERVIgVGhlIHVwZGF0ZSBtZXRob2QgaXMgZXhlY3V0ZWQgcGVyIHJlbmRlci4gQSBmcmFtZSBtaWdodCBiZSBwcm9kdWNlZCBieSBtdWx0aXBsZSByZW5kZXIgY2FsbHMgc28gdGhpcyB2YWx1ZSBhbGxvd3MgbW9yZSBkZXRhaWxlZCB1cGRhdGVzIHRoYW4gRlJBTUUuXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBPQkpFQ1QgVGhlIHVwZGF0ZSBtZXRob2QgaXMgZXhlY3V0ZWQgcGVyIHtAbGluayBPYmplY3QzRH0gdGhhdCB1c2VzIHRoZSBub2RlIGZvciByZW5kZXJpbmcuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTm9kZVVwZGF0ZVR5cGUgPSB7XHJcblx0Tk9ORTogJ25vbmUnLFxyXG5cdEZSQU1FOiAnZnJhbWUnLFxyXG5cdFJFTkRFUjogJ3JlbmRlcicsXHJcblx0T0JKRUNUOiAnb2JqZWN0J1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIERhdGEgdHlwZXMgb2YgYSBub2RlLlxyXG4gKlxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQk9PTEVBTiBCb29sZWFuIHR5cGUuXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBJTlRFR0VSIEludGVnZXIgdHlwZS5cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IEZMT0FUIEZsb2F0IHR5cGUuXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBWRUNUT1IyIFR3by1kaW1lbnNpb25hbCB2ZWN0b3IgdHlwZS5cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IFZFQ1RPUjMgVGhyZWUtZGltZW5zaW9uYWwgdmVjdG9yIHR5cGUuXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBWRUNUT1I0IEZvdXItZGltZW5zaW9uYWwgdmVjdG9yIHR5cGUuXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBNQVRSSVgyIDJ4MiBtYXRyaXggdHlwZS5cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IE1BVFJJWDMgM3gzIG1hdHJpeCB0eXBlLlxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTUFUUklYNCA0eDQgbWF0cml4IHR5cGUuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgTm9kZVR5cGUgPSB7XHJcblx0Qk9PTEVBTjogJ2Jvb2wnLFxyXG5cdElOVEVHRVI6ICdpbnQnLFxyXG5cdEZMT0FUOiAnZmxvYXQnLFxyXG5cdFZFQ1RPUjI6ICd2ZWMyJyxcclxuXHRWRUNUT1IzOiAndmVjMycsXHJcblx0VkVDVE9SNDogJ3ZlYzQnLFxyXG5cdE1BVFJJWDI6ICdtYXQyJyxcclxuXHRNQVRSSVgzOiAnbWF0MycsXHJcblx0TUFUUklYNDogJ21hdDQnXHJcbn07XHJcblxyXG4vKipcclxuICogQWNjZXNzIHR5cGVzIG9mIGEgbm9kZS4gVGhlc2UgYXJlIHJlbGV2YW50IGZvciBjb21wdXRlIGFuZCBzdG9yYWdlIHVzYWdlLlxyXG4gKlxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUkVBRF9PTkxZIFJlYWQtb25seSBhY2Nlc3NcclxuICogQHByb3BlcnR5IHtzdHJpbmd9IFdSSVRFX09OTFkgV3JpdGUtb25seSBhY2Nlc3MuXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSRUFEX1dSSVRFIFJlYWQgYW5kIHdyaXRlIGFjY2Vzcy5cclxuICovXHJcbmV4cG9ydCBjb25zdCBOb2RlQWNjZXNzID0ge1xyXG5cdFJFQURfT05MWTogJ3JlYWRPbmx5JyxcclxuXHRXUklURV9PTkxZOiAnd3JpdGVPbmx5JyxcclxuXHRSRUFEX1dSSVRFOiAncmVhZFdyaXRlJyxcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBkZWZhdWx0U2hhZGVyU3RhZ2VzID0gWyAnZnJhZ21lbnQnLCAndmVydGV4JyBdO1xyXG5leHBvcnQgY29uc3QgZGVmYXVsdEJ1aWxkU3RhZ2VzID0gWyAnc2V0dXAnLCAnYW5hbHl6ZScsICdnZW5lcmF0ZScgXTtcclxuZXhwb3J0IGNvbnN0IHNoYWRlclN0YWdlcyA9IFsgLi4uZGVmYXVsdFNoYWRlclN0YWdlcywgJ2NvbXB1dGUnIF07XHJcbmV4cG9ydCBjb25zdCB2ZWN0b3JDb21wb25lbnRzID0gWyAneCcsICd5JywgJ3onLCAndycgXTtcclxuIiwiaW1wb3J0IHsgTm9kZVVwZGF0ZVR5cGUgfSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IGdldE5vZGVDaGlsZHJlbiwgZ2V0Q2FjaGVLZXksIGhhc2ggfSBmcm9tICcuL05vZGVVdGlscy5qcyc7XHJcblxyXG5pbXBvcnQgeyBFdmVudERpc3BhdGNoZXIgfSBmcm9tICcuLi8uLi9jb3JlL0V2ZW50RGlzcGF0Y2hlci5qcyc7XHJcbmltcG9ydCB7IE1hdGhVdGlscyB9IGZyb20gJy4uLy4uL21hdGgvTWF0aFV0aWxzLmpzJztcclxuXHJcbmxldCBfbm9kZUlkID0gMDtcclxuXHJcbi8qKlxyXG4gKiBCYXNlIGNsYXNzIGZvciBhbGwgbm9kZXMuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBFdmVudERpc3BhdGNoZXJcclxuICovXHJcbmNsYXNzIE5vZGUgZXh0ZW5kcyBFdmVudERpc3BhdGNoZXIge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gez9zdHJpbmd9IG5vZGVUeXBlIC0gVGhlIG5vZGUgdHlwZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggbm9kZVR5cGUgPSBudWxsICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbm9kZSB0eXBlLiBUaGlzIHJlcHJlc2VudHMgdGhlIHJlc3VsdCB0eXBlIG9mIHRoZSBub2RlIChlLmcuIGBmbG9hdGAgb3IgYHZlYzNgKS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P3N0cmluZ31cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub2RlVHlwZSA9IG5vZGVUeXBlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHVwZGF0ZSB0eXBlIG9mIHRoZSBub2RlJ3Mge0BsaW5rIE5vZGUjdXBkYXRlfSBtZXRob2QuIFBvc3NpYmxlIHZhbHVlcyBhcmUgbGlzdGVkIGluIHtAbGluayBOb2RlVXBkYXRlVHlwZX0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqIEBkZWZhdWx0ICdub25lJ1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVwZGF0ZVR5cGUgPSBOb2RlVXBkYXRlVHlwZS5OT05FO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHVwZGF0ZSB0eXBlIG9mIHRoZSBub2RlJ3Mge0BsaW5rIE5vZGUjdXBkYXRlQmVmb3JlfSBtZXRob2QuIFBvc3NpYmxlIHZhbHVlcyBhcmUgbGlzdGVkIGluIHtAbGluayBOb2RlVXBkYXRlVHlwZX0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqIEBkZWZhdWx0ICdub25lJ1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVwZGF0ZUJlZm9yZVR5cGUgPSBOb2RlVXBkYXRlVHlwZS5OT05FO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHVwZGF0ZSB0eXBlIG9mIHRoZSBub2RlJ3Mge0BsaW5rIE5vZGUjdXBkYXRlQWZ0ZXJ9IG1ldGhvZC4gUG9zc2libGUgdmFsdWVzIGFyZSBsaXN0ZWQgaW4ge0BsaW5rIE5vZGVVcGRhdGVUeXBlfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICogQGRlZmF1bHQgJ25vbmUnXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXBkYXRlQWZ0ZXJUeXBlID0gTm9kZVVwZGF0ZVR5cGUuTk9ORTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBVVUlEIG9mIHRoZSBub2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51dWlkID0gTWF0aFV0aWxzLmdlbmVyYXRlVVVJRCgpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHZlcnNpb24gb2YgdGhlIG5vZGUuIFRoZSB2ZXJzaW9uIGF1dG9tYXRpY2FsbHkgaXMgaW5jcmVhc2VkIHdoZW4ge0BsaW5rIE5vZGUjbmVlZHNVcGRhdGV9IGlzIHNldCB0byBgdHJ1ZWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnZlcnNpb24gPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGlzIG5vZGUgaXMgZ2xvYmFsIG9yIG5vdC4gVGhpcyBwcm9wZXJ0eSBpcyByZWxldmFudCBmb3IgdGhlIGludGVybmFsXHJcblx0XHQgKiBub2RlIGNhY2hpbmcgc3lzdGVtLiBBbGwgbm9kZXMgd2hpY2ggc2hvdWxkIGJlIGRlY2xhcmVkIGp1c3Qgb25jZSBzaG91bGRcclxuXHRcdCAqIHNldCB0aGlzIGZsYWcgdG8gYHRydWVgIChhIHR5cGljYWwgZXhhbXBsZSBpcyB7QGxpbmsgQXR0cmlidXRlTm9kZX0pLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nbG9iYWwgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNOb2RlID0gdHJ1ZTtcclxuXHJcblx0XHQvLyBwcml2YXRlXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY2FjaGUga2V5IG9mIHRoaXMgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUgez9udW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX2NhY2hlS2V5ID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjYWNoZSBrZXkgJ3MgdmVyc2lvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fY2FjaGVLZXlWZXJzaW9uID0gMDtcclxuXHJcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsICdpZCcsIHsgdmFsdWU6IF9ub2RlSWQgKysgfSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldCB0aGlzIHByb3BlcnR5IHRvIGB0cnVlYCB3aGVuIHRoZSBub2RlIHNob3VsZCBiZSByZWdlbmVyYXRlZC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0ICogQHBhcmFtIHtib29sZWFufSB2YWx1ZVxyXG5cdCAqL1xyXG5cdHNldCBuZWVkc1VwZGF0ZSggdmFsdWUgKSB7XHJcblxyXG5cdFx0aWYgKCB2YWx1ZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdHRoaXMudmVyc2lvbiArKztcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIHR5cGUgb2YgdGhlIGNsYXNzLiBUaGUgdmFsdWUgaXMgdXN1YWxseSB0aGUgY29uc3RydWN0b3IgbmFtZS5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtzdHJpbmd9XHJcbiBcdCAqIEByZWFkb25seVxyXG5cdCAqL1xyXG5cdGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLnR5cGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29udmVuaWVudCBtZXRob2QgZm9yIGRlZmluaW5nIHtAbGluayBOb2RlI3VwZGF0ZX0uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayAtIFRoZSB1cGRhdGUgbWV0aG9kLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB1cGRhdGVUeXBlIC0gVGhlIHVwZGF0ZSB0eXBlLlxyXG5cdCAqIEByZXR1cm4ge05vZGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbm9kZS5cclxuXHQgKi9cclxuXHRvblVwZGF0ZSggY2FsbGJhY2ssIHVwZGF0ZVR5cGUgKSB7XHJcblxyXG5cdFx0dGhpcy51cGRhdGVUeXBlID0gdXBkYXRlVHlwZTtcclxuXHRcdHRoaXMudXBkYXRlID0gY2FsbGJhY2suYmluZCggdGhpcy5nZXRTZWxmKCkgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb252ZW5pZW50IG1ldGhvZCBmb3IgZGVmaW5pbmcge0BsaW5rIE5vZGUjdXBkYXRlfS4gU2ltaWxhciB0byB7QGxpbmsgTm9kZSNvblVwZGF0ZX0sIGJ1dFxyXG5cdCAqIHRoaXMgbWV0aG9kIGF1dG9tYXRpY2FsbHkgc2V0cyB0aGUgdXBkYXRlIHR5cGUgdG8gYEZSQU1FYC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIC0gVGhlIHVwZGF0ZSBtZXRob2QuXHJcblx0ICogQHJldHVybiB7Tm9kZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBub2RlLlxyXG5cdCAqL1xyXG5cdG9uRnJhbWVVcGRhdGUoIGNhbGxiYWNrICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm9uVXBkYXRlKCBjYWxsYmFjaywgTm9kZVVwZGF0ZVR5cGUuRlJBTUUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb252ZW5pZW50IG1ldGhvZCBmb3IgZGVmaW5pbmcge0BsaW5rIE5vZGUjdXBkYXRlfS4gU2ltaWxhciB0byB7QGxpbmsgTm9kZSNvblVwZGF0ZX0sIGJ1dFxyXG5cdCAqIHRoaXMgbWV0aG9kIGF1dG9tYXRpY2FsbHkgc2V0cyB0aGUgdXBkYXRlIHR5cGUgdG8gYFJFTkRFUmAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayAtIFRoZSB1cGRhdGUgbWV0aG9kLlxyXG5cdCAqIEByZXR1cm4ge05vZGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbm9kZS5cclxuXHQgKi9cclxuXHRvblJlbmRlclVwZGF0ZSggY2FsbGJhY2sgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMub25VcGRhdGUoIGNhbGxiYWNrLCBOb2RlVXBkYXRlVHlwZS5SRU5ERVIgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb252ZW5pZW50IG1ldGhvZCBmb3IgZGVmaW5pbmcge0BsaW5rIE5vZGUjdXBkYXRlfS4gU2ltaWxhciB0byB7QGxpbmsgTm9kZSNvblVwZGF0ZX0sIGJ1dFxyXG5cdCAqIHRoaXMgbWV0aG9kIGF1dG9tYXRpY2FsbHkgc2V0cyB0aGUgdXBkYXRlIHR5cGUgdG8gYE9CSkVDVGAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayAtIFRoZSB1cGRhdGUgbWV0aG9kLlxyXG5cdCAqIEByZXR1cm4ge05vZGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbm9kZS5cclxuXHQgKi9cclxuXHRvbk9iamVjdFVwZGF0ZSggY2FsbGJhY2sgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMub25VcGRhdGUoIGNhbGxiYWNrLCBOb2RlVXBkYXRlVHlwZS5PQkpFQ1QgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb252ZW5pZW50IG1ldGhvZCBmb3IgZGVmaW5pbmcge0BsaW5rIE5vZGUjdXBkYXRlUmVmZXJlbmNlfS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIC0gVGhlIHVwZGF0ZSBtZXRob2QuXHJcblx0ICogQHJldHVybiB7Tm9kZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBub2RlLlxyXG5cdCAqL1xyXG5cdG9uUmVmZXJlbmNlKCBjYWxsYmFjayApIHtcclxuXHJcblx0XHR0aGlzLnVwZGF0ZVJlZmVyZW5jZSA9IGNhbGxiYWNrLmJpbmQoIHRoaXMuZ2V0U2VsZigpICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGB0aGlzYCByZWZlcmVuY2UgbWlnaHQgcG9pbnQgdG8gYSBQcm94eSBzbyB0aGlzIG1ldGhvZCBjYW4gYmUgdXNlZFxyXG5cdCAqIHRvIGdldCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBhY3R1YWwgbm9kZSBpbnN0YW5jZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge05vZGV9IEEgcmVmZXJlbmNlIHRvIHRoZSBub2RlLlxyXG5cdCAqL1xyXG5cdGdldFNlbGYoKSB7XHJcblxyXG5cdFx0Ly8gUmV0dXJucyBub24tbm9kZSBvYmplY3QuXHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuc2VsZiB8fCB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE5vZGVzIG1pZ2h0IHJlZmVyIHRvIG90aGVyIG9iamVjdHMgbGlrZSBtYXRlcmlhbHMuIFRoaXMgbWV0aG9kIGFsbG93cyB0byBkeW5hbWljYWxseSB1cGRhdGUgdGhlIHJlZmVyZW5jZVxyXG5cdCAqIHRvIHN1Y2ggb2JqZWN0cyBiYXNlZCBvbiBhIGdpdmVuIHN0YXRlIChlLmcuIHRoZSBjdXJyZW50IG5vZGUgZnJhbWUgb3IgYnVpbGRlcikuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge2FueX0gc3RhdGUgLSBUaGlzIG1ldGhvZCBjYW4gYmUgaW52b2NhdGVkIGluIGRpZmZlcmVudCBjb250ZXh0cyBzbyBgc3RhdGVgIGNhbiByZWZlciB0byBhbnkgb2JqZWN0IHR5cGUuXHJcblx0ICogQHJldHVybiB7YW55fSBUaGUgdXBkYXRlZCByZWZlcmVuY2UuXHJcblx0ICovXHJcblx0dXBkYXRlUmVmZXJlbmNlKCAvKnN0YXRlKi8gKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQnkgZGVmYXVsdCB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUge0BsaW5rIE5vZGUjZ2xvYmFsfSBmbGFnLiBUaGlzIG1ldGhvZFxyXG5cdCAqIGNhbiBiZSBvdmVyd3JpdHRlbiBpbiBkZXJpdmVkIGNsYXNzZXMgaWYgYW4gYW5hbHl0aWNhbCB3YXkgaXMgcmVxdWlyZWQgdG8gZGV0ZXJtaW5lIHRoZVxyXG5cdCAqIGdsb2JhbCBzdGF0dXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyBub2RlIGlzIGdsb2JhbCBvciBub3QuXHJcblx0ICovXHJcblx0aXNHbG9iYWwoIC8qYnVpbGRlciovICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmdsb2JhbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZW5lcmF0b3IgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBpdGVyYXRlIG92ZXIgdGhlIGNoaWxkIG5vZGVzLlxyXG5cdCAqXHJcblx0ICogQGdlbmVyYXRvclxyXG5cdCAqIEB5aWVsZHMge05vZGV9IEEgY2hpbGQgbm9kZS5cclxuXHQgKi9cclxuXHQqIGdldENoaWxkcmVuKCkge1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IHsgY2hpbGROb2RlIH0gb2YgZ2V0Tm9kZUNoaWxkcmVuKCB0aGlzICkgKSB7XHJcblxyXG5cdFx0XHR5aWVsZCBjaGlsZE5vZGU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENhbGxpbmcgdGhpcyBtZXRob2QgZGlzcGF0Y2hlcyB0aGUgYGRpc3Bvc2VgIGV2ZW50LiBUaGlzIGV2ZW50IGNhbiBiZSB1c2VkXHJcblx0ICogdG8gcmVnaXN0ZXIgZXZlbnQgbGlzdGVuZXJzIGZvciBjbGVhbiB1cCB0YXNrcy5cclxuXHQgKi9cclxuXHRkaXNwb3NlKCkge1xyXG5cclxuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnZGlzcG9zZScgfSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENhbGxiYWNrIGZvciB7QGxpbmsgTm9kZSN0cmF2ZXJzZX0uXHJcblx0ICpcclxuXHQgKiBAY2FsbGJhY2sgdHJhdmVyc2VDYWxsYmFja1xyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFRoZSBjdXJyZW50IG5vZGUuXHJcblx0ICovXHJcblxyXG5cdC8qKlxyXG5cdCAqIENhbiBiZSB1c2VkIHRvIHRyYXZlcnNlIHRocm91Z2ggdGhlIG5vZGUncyBoaWVyYXJjaHkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3RyYXZlcnNlQ2FsbGJhY2t9IGNhbGxiYWNrIC0gQSBjYWxsYmFjayB0aGF0IGlzIGV4ZWN1dGVkIHBlciBub2RlLlxyXG5cdCAqL1xyXG5cdHRyYXZlcnNlKCBjYWxsYmFjayApIHtcclxuXHJcblx0XHRjYWxsYmFjayggdGhpcyApO1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IGNoaWxkTm9kZSBvZiB0aGlzLmdldENoaWxkcmVuKCkgKSB7XHJcblxyXG5cdFx0XHRjaGlsZE5vZGUudHJhdmVyc2UoIGNhbGxiYWNrICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGNhY2hlIGtleSBmb3IgdGhpcyBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbZm9yY2U9ZmFsc2VdIC0gV2hlbiBzZXQgdG8gYHRydWVgLCBhIHJlY29tcHV0YXRpb24gb2YgdGhlIGNhY2hlIGtleSBpcyBmb3JjZWQuXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgY2FjaGUga2V5IG9mIHRoZSBub2RlLlxyXG5cdCAqL1xyXG5cdGdldENhY2hlS2V5KCBmb3JjZSA9IGZhbHNlICkge1xyXG5cclxuXHRcdGZvcmNlID0gZm9yY2UgfHwgdGhpcy52ZXJzaW9uICE9PSB0aGlzLl9jYWNoZUtleVZlcnNpb247XHJcblxyXG5cdFx0aWYgKCBmb3JjZSA9PT0gdHJ1ZSB8fCB0aGlzLl9jYWNoZUtleSA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuX2NhY2hlS2V5ID0gaGFzaCggZ2V0Q2FjaGVLZXkoIHRoaXMsIGZvcmNlICksIHRoaXMuY3VzdG9tQ2FjaGVLZXkoKSApO1xyXG5cdFx0XHR0aGlzLl9jYWNoZUtleVZlcnNpb24gPSB0aGlzLnZlcnNpb247XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzLl9jYWNoZUtleTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZW5lcmF0ZSBhIGN1c3RvbSBjYWNoZSBrZXkgZm9yIHRoaXMgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGNhY2hlIGtleSBvZiB0aGUgbm9kZS5cclxuXHQgKi9cclxuXHRjdXN0b21DYWNoZUtleSgpIHtcclxuXHJcblx0XHRyZXR1cm4gMDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSByZWZlcmVuY2VzIHRvIHRoaXMgbm9kZSB3aGljaCBpcyBieSBkZWZhdWx0IGB0aGlzYC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge05vZGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbm9kZS5cclxuXHQgKi9cclxuXHRnZXRTY29wZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBoYXNoIG9mIHRoZSBub2RlIHdoaWNoIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlIG5vZGUuIEJ5IGRlZmF1bHQgaXQnc1xyXG5cdCAqIHRoZSB7QGxpbmsgTm9kZSN1dWlkfSBob3dldmVyIGRlcml2ZWQgbm9kZSBjbGFzc2VzIG1pZ2h0IGhhdmUgdG8gb3ZlcndyaXRlIHRoaXMgbWV0aG9kXHJcblx0ICogZGVwZW5kaW5nIG9uIHRoZWlyIGltcGxlbWVudGF0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBoYXNoLlxyXG5cdCAqL1xyXG5cdGdldEhhc2goIC8qYnVpbGRlciovICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnV1aWQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgdXBkYXRlIHR5cGUgb2Yge0BsaW5rIE5vZGUjdXBkYXRlfS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge05vZGVVcGRhdGVUeXBlfSBUaGUgdXBkYXRlIHR5cGUuXHJcblx0ICovXHJcblx0Z2V0VXBkYXRlVHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy51cGRhdGVUeXBlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHVwZGF0ZSB0eXBlIG9mIHtAbGluayBOb2RlI3VwZGF0ZUJlZm9yZX0uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtOb2RlVXBkYXRlVHlwZX0gVGhlIHVwZGF0ZSB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldFVwZGF0ZUJlZm9yZVR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMudXBkYXRlQmVmb3JlVHlwZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSB1cGRhdGUgdHlwZSBvZiB7QGxpbmsgTm9kZSN1cGRhdGVBZnRlcn0uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtOb2RlVXBkYXRlVHlwZX0gVGhlIHVwZGF0ZSB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldFVwZGF0ZUFmdGVyVHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy51cGRhdGVBZnRlclR5cGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2VydGFpbiB0eXBlcyBhcmUgY29tcG9zZWQgb2YgbXVsdGlwbGUgZWxlbWVudHMuIEZvciBleGFtcGxlIGEgYHZlYzNgXHJcblx0ICogaXMgY29tcG9zZWQgb2YgdGhyZWUgYGZsb2F0YCB2YWx1ZXMuIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHR5cGUgb2ZcclxuXHQgKiB0aGVzZSBlbGVtZW50cy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgdHlwZSBvZiB0aGUgbm9kZS5cclxuXHQgKi9cclxuXHRnZXRFbGVtZW50VHlwZSggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCB0eXBlID0gdGhpcy5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cdFx0Y29uc3QgZWxlbWVudFR5cGUgPSBidWlsZGVyLmdldEVsZW1lbnRUeXBlKCB0eXBlICk7XHJcblxyXG5cdFx0cmV0dXJuIGVsZW1lbnRUeXBlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIG5vZGUgbWVtYmVyIHR5cGUgZm9yIHRoZSBnaXZlbiBuYW1lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBtZW1iZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgdHlwZSBvZiB0aGUgbm9kZS5cclxuXHQgKi9cclxuXHRnZXRNZW1iZXJUeXBlKCAvKmJ1aWxkZXIsIG5hbWUqLyApIHtcclxuXHJcblx0XHRyZXR1cm4gJ3ZvaWQnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIG5vZGUncyB0eXBlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB0eXBlIG9mIHRoZSBub2RlLlxyXG5cdCAqL1xyXG5cdGdldE5vZGVUeXBlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IG5vZGVQcm9wZXJ0aWVzID0gYnVpbGRlci5nZXROb2RlUHJvcGVydGllcyggdGhpcyApO1xyXG5cclxuXHRcdGlmICggbm9kZVByb3BlcnRpZXMub3V0cHV0Tm9kZSApIHtcclxuXHJcblx0XHRcdHJldHVybiBub2RlUHJvcGVydGllcy5vdXRwdXROb2RlLmdldE5vZGVUeXBlKCBidWlsZGVyICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzLm5vZGVUeXBlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgZHVyaW5nIHRoZSBidWlsZCBwcm9jZXNzIG9mIGEgbm9kZSBhbmQgZW5zdXJlc1xyXG5cdCAqIGVxdWFsIG5vZGVzIGFyZSBub3QgYnVpbHQgbXVsdGlwbGUgdGltZXMgYnV0IGp1c3Qgb25jZS4gRm9yIGV4YW1wbGUgaWZcclxuXHQgKiBgYXR0cmlidXRlKCAndXYnIClgIGlzIHVzZWQgbXVsdGlwbGUgdGltZXMgYnkgdGhlIHVzZXIsIHRoZSBidWlsZFxyXG5cdCAqIHByb2Nlc3MgbWFrZXMgc3VyZSB0byBwcm9jZXNzIGp1c3QgdGhlIGZpcnN0IG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge05vZGV9IFRoZSBzaGFyZWQgbm9kZSBpZiBwb3NzaWJsZS4gT3RoZXJ3aXNlIGB0aGlzYCBpcyByZXR1cm5lZC5cclxuXHQgKi9cclxuXHRnZXRTaGFyZWQoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgaGFzaCA9IHRoaXMuZ2V0SGFzaCggYnVpbGRlciApO1xyXG5cdFx0Y29uc3Qgbm9kZUZyb21IYXNoID0gYnVpbGRlci5nZXROb2RlRnJvbUhhc2goIGhhc2ggKTtcclxuXHJcblx0XHRyZXR1cm4gbm9kZUZyb21IYXNoIHx8IHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVwcmVzZW50cyB0aGUgc2V0dXAgc3RhZ2Ugd2hpY2ggaXMgdGhlIGZpcnN0IHN0ZXAgb2YgdGhlIGJ1aWxkIHByb2Nlc3MsIHNlZSB7QGxpbmsgTm9kZSNidWlsZH0gbWV0aG9kLlxyXG5cdCAqIFRoaXMgbWV0aG9kIGlzIG9mdGVuIG92ZXJ3cml0dGVuIGluIGRlcml2ZWQgbW9kdWxlcyB0byBwcmVwYXJlIHRoZSBub2RlIHdoaWNoIGlzIHVzZWQgYXMgdGhlIG91dHB1dC9yZXN1bHQuXHJcblx0ICogVGhlIG91dHB1dCBub2RlIG11c3QgYmUgcmV0dXJuZWQgaW4gdGhlIGByZXR1cm5gIHN0YXRlbWVudC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7P05vZGV9IFRoZSBvdXRwdXQgbm9kZS5cclxuXHQgKi9cclxuXHRzZXR1cCggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCBub2RlUHJvcGVydGllcyA9IGJ1aWxkZXIuZ2V0Tm9kZVByb3BlcnRpZXMoIHRoaXMgKTtcclxuXHJcblx0XHRsZXQgaW5kZXggPSAwO1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IGNoaWxkTm9kZSBvZiB0aGlzLmdldENoaWxkcmVuKCkgKSB7XHJcblxyXG5cdFx0XHRub2RlUHJvcGVydGllc1sgJ25vZGUnICsgaW5kZXggKysgXSA9IGNoaWxkTm9kZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gcmV0dXJuIGEgb3V0cHV0Tm9kZSBpZiBleGlzdHMgb3IgbnVsbFxyXG5cclxuXHRcdHJldHVybiBub2RlUHJvcGVydGllcy5vdXRwdXROb2RlIHx8IG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVwcmVzZW50cyB0aGUgYW5hbHl6ZSBzdGFnZSB3aGljaCBpcyB0aGUgc2Vjb25kIHN0ZXAgb2YgdGhlIGJ1aWxkIHByb2Nlc3MsIHNlZSB7QGxpbmsgTm9kZSNidWlsZH0gbWV0aG9kLlxyXG5cdCAqIFRoaXMgc3RhZ2UgYW5hbHl6ZXMgdGhlIG5vZGUgaGllcmFyY2h5IGFuZCBlbnN1cmVzIGRlc2NlbmRlbnQgbm9kZXMgYXJlIGJ1aWx0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKi9cclxuXHRhbmFseXplKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IHVzYWdlQ291bnQgPSBidWlsZGVyLmluY3JlYXNlVXNhZ2UoIHRoaXMgKTtcclxuXHJcblx0XHRpZiAoIHVzYWdlQ291bnQgPT09IDEgKSB7XHJcblxyXG5cdFx0XHQvLyBub2RlIGZsb3cgY2hpbGRyZW5cclxuXHJcblx0XHRcdGNvbnN0IG5vZGVQcm9wZXJ0aWVzID0gYnVpbGRlci5nZXROb2RlUHJvcGVydGllcyggdGhpcyApO1xyXG5cclxuXHRcdFx0Zm9yICggY29uc3QgY2hpbGROb2RlIG9mIE9iamVjdC52YWx1ZXMoIG5vZGVQcm9wZXJ0aWVzICkgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggY2hpbGROb2RlICYmIGNoaWxkTm9kZS5pc05vZGUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y2hpbGROb2RlLmJ1aWxkKCBidWlsZGVyICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVwcmVzZW50cyB0aGUgZ2VuZXJhdGUgc3RhZ2Ugd2hpY2ggaXMgdGhlIHRoaXJkIHN0ZXAgb2YgdGhlIGJ1aWxkIHByb2Nlc3MsIHNlZSB7QGxpbmsgTm9kZSNidWlsZH0gbWV0aG9kLlxyXG5cdCAqIFRoaXMgc3RhdGUgYnVpbGRzIHRoZSBvdXRwdXQgbm9kZSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0aW5nIHNoYWRlciBzdHJpbmcuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEBwYXJhbSB7P3N0cmluZ30gb3V0cHV0IC0gQ2FuIGJlIHVzZWQgdG8gZGVmaW5lIHRoZSBvdXRwdXQgdHlwZS5cclxuXHQgKiBAcmV0dXJuIHs/c3RyaW5nfSBUaGUgZ2VuZXJhdGVkIHNoYWRlciBzdHJpbmcuXHJcblx0ICovXHJcblx0Z2VuZXJhdGUoIGJ1aWxkZXIsIG91dHB1dCApIHtcclxuXHJcblx0XHRjb25zdCB7IG91dHB1dE5vZGUgfSA9IGJ1aWxkZXIuZ2V0Tm9kZVByb3BlcnRpZXMoIHRoaXMgKTtcclxuXHJcblx0XHRpZiAoIG91dHB1dE5vZGUgJiYgb3V0cHV0Tm9kZS5pc05vZGUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gb3V0cHV0Tm9kZS5idWlsZCggYnVpbGRlciwgb3V0cHV0ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBtZXRob2QgY2FuIGJlIGltcGxlbWVudGVkIHRvIHVwZGF0ZSB0aGUgbm9kZSdzIGludGVybmFsIHN0YXRlIGJlZm9yZSBpdCBpcyB1c2VkIHRvIHJlbmRlciBhbiBvYmplY3QuXHJcblx0ICogVGhlIHtAbGluayBOb2RlI3VwZGF0ZUJlZm9yZVR5cGV9IHByb3BlcnR5IGRlZmluZXMgaG93IG9mdGVuIHRoZSB1cGRhdGUgaXMgZXhlY3V0ZWQuXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcGFyYW0ge05vZGVGcmFtZX0gZnJhbWUgLSBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBub2RlIGZyYW1lLlxyXG5cdCAqIEByZXR1cm4gez9ib29sZWFufSBBbiBvcHRpb25hbCBib29sIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGltcGxlbWVudGF0aW9uIGFjdHVhbGx5IHBlcmZvcm1lZCBhbiB1cGRhdGUgb3Igbm90IChlLmcuIGR1ZSB0byBjYWNoaW5nKS5cclxuXHQgKi9cclxuXHR1cGRhdGVCZWZvcmUoIC8qZnJhbWUqLyApIHtcclxuXHJcblx0XHRjb25zb2xlLndhcm4oICdBYnN0cmFjdCBmdW5jdGlvbi4nICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIG1ldGhvZCBjYW4gYmUgaW1wbGVtZW50ZWQgdG8gdXBkYXRlIHRoZSBub2RlJ3MgaW50ZXJuYWwgc3RhdGUgYWZ0ZXIgaXQgd2FzIHVzZWQgdG8gcmVuZGVyIGFuIG9iamVjdC5cclxuXHQgKiBUaGUge0BsaW5rIE5vZGUjdXBkYXRlQWZ0ZXJUeXBlfSBwcm9wZXJ0eSBkZWZpbmVzIGhvdyBvZnRlbiB0aGUgdXBkYXRlIGlzIGV4ZWN1dGVkLlxyXG5cdCAqXHJcblx0ICogQGFic3RyYWN0XHJcblx0ICogQHBhcmFtIHtOb2RlRnJhbWV9IGZyYW1lIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgbm9kZSBmcmFtZS5cclxuXHQgKiBAcmV0dXJuIHs/Ym9vbGVhbn0gQW4gb3B0aW9uYWwgYm9vbCB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBpbXBsZW1lbnRhdGlvbiBhY3R1YWxseSBwZXJmb3JtZWQgYW4gdXBkYXRlIG9yIG5vdCAoZS5nLiBkdWUgdG8gY2FjaGluZykuXHJcblx0ICovXHJcblx0dXBkYXRlQWZ0ZXIoIC8qZnJhbWUqLyApIHtcclxuXHJcblx0XHRjb25zb2xlLndhcm4oICdBYnN0cmFjdCBmdW5jdGlvbi4nICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIG1ldGhvZCBjYW4gYmUgaW1wbGVtZW50ZWQgdG8gdXBkYXRlIHRoZSBub2RlJ3MgaW50ZXJuYWwgc3RhdGUgd2hlbiBpdCBpcyB1c2VkIHRvIHJlbmRlciBhbiBvYmplY3QuXHJcblx0ICogVGhlIHtAbGluayBOb2RlI3VwZGF0ZVR5cGV9IHByb3BlcnR5IGRlZmluZXMgaG93IG9mdGVuIHRoZSB1cGRhdGUgaXMgZXhlY3V0ZWQuXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcGFyYW0ge05vZGVGcmFtZX0gZnJhbWUgLSBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBub2RlIGZyYW1lLlxyXG5cdCAqIEByZXR1cm4gez9ib29sZWFufSBBbiBvcHRpb25hbCBib29sIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGltcGxlbWVudGF0aW9uIGFjdHVhbGx5IHBlcmZvcm1lZCBhbiB1cGRhdGUgb3Igbm90IChlLmcuIGR1ZSB0byBjYWNoaW5nKS5cclxuXHQgKi9cclxuXHR1cGRhdGUoIC8qZnJhbWUqLyApIHtcclxuXHJcblx0XHRjb25zb2xlLndhcm4oICdBYnN0cmFjdCBmdW5jdGlvbi4nICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgcGVyZm9ybXMgdGhlIGJ1aWxkIG9mIGEgbm9kZS4gVGhlIGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGFzIHdlbGwgYXMgaXRzIHJldHVybiB2YWx1ZSBkZXBlbmRcclxuXHQgKiBvbiB0aGUgY3VycmVudCBidWlsZCBzdGFnZSAoc2V0dXAsIGFuYWx5emUgb3IgZ2VuZXJhdGUpLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcGFyYW0gez9zdHJpbmd9IG91dHB1dCAtIENhbiBiZSB1c2VkIHRvIGRlZmluZSB0aGUgb3V0cHV0IHR5cGUuXHJcblx0ICogQHJldHVybiB7P3N0cmluZ30gV2hlbiB0aGlzIG1ldGhvZCBpcyBleGVjdXRlZCBpbiB0aGUgc2V0dXAgb3IgYW5hbHl6ZSBzdGFnZSwgYG51bGxgIGlzIHJldHVybmVkLiBJbiB0aGUgZ2VuZXJhdGUgc3RhZ2UsIHRoZSBnZW5lcmF0ZWQgc2hhZGVyIHN0cmluZy5cclxuXHQgKi9cclxuXHRidWlsZCggYnVpbGRlciwgb3V0cHV0ID0gbnVsbCApIHtcclxuXHJcblx0XHRjb25zdCByZWZOb2RlID0gdGhpcy5nZXRTaGFyZWQoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRpZiAoIHRoaXMgIT09IHJlZk5vZGUgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gcmVmTm9kZS5idWlsZCggYnVpbGRlciwgb3V0cHV0ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGJ1aWxkZXIuYWRkTm9kZSggdGhpcyApO1xyXG5cdFx0YnVpbGRlci5hZGRDaGFpbiggdGhpcyApO1xyXG5cclxuXHRcdC8qIEJ1aWxkIHN0YWdlcyBleHBlY3RlZCByZXN1bHRzOlxyXG5cdFx0XHQtIFwic2V0dXBcIlx0XHQtPiBOb2RlXHJcblx0XHRcdC0gXCJhbmFseXplXCJcdFx0LT4gbnVsbFxyXG5cdFx0XHQtIFwiZ2VuZXJhdGVcIlx0LT4gU3RyaW5nXHJcblx0XHQqL1xyXG5cdFx0bGV0IHJlc3VsdCA9IG51bGw7XHJcblxyXG5cdFx0Y29uc3QgYnVpbGRTdGFnZSA9IGJ1aWxkZXIuZ2V0QnVpbGRTdGFnZSgpO1xyXG5cclxuXHRcdGlmICggYnVpbGRTdGFnZSA9PT0gJ3NldHVwJyApIHtcclxuXHJcblx0XHRcdHRoaXMudXBkYXRlUmVmZXJlbmNlKCBidWlsZGVyICk7XHJcblxyXG5cdFx0XHRjb25zdCBwcm9wZXJ0aWVzID0gYnVpbGRlci5nZXROb2RlUHJvcGVydGllcyggdGhpcyApO1xyXG5cclxuXHRcdFx0aWYgKCBwcm9wZXJ0aWVzLmluaXRpYWxpemVkICE9PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHQvL2NvbnN0IHN0YWNrTm9kZXNCZWZvcmVTZXR1cCA9IGJ1aWxkZXIuc3RhY2subm9kZXMubGVuZ3RoO1xyXG5cclxuXHRcdFx0XHRwcm9wZXJ0aWVzLmluaXRpYWxpemVkID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0Y29uc3Qgb3V0cHV0Tm9kZSA9IHRoaXMuc2V0dXAoIGJ1aWxkZXIgKTsgLy8gcmV0dXJuIGEgbm9kZSBvciBudWxsXHJcblx0XHRcdFx0Y29uc3QgaXNOb2RlT3V0cHV0ID0gb3V0cHV0Tm9kZSAmJiBvdXRwdXROb2RlLmlzTm9kZSA9PT0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0LyppZiAoIGlzTm9kZU91dHB1dCAmJiBidWlsZGVyLnN0YWNrLm5vZGVzLmxlbmd0aCAhPT0gc3RhY2tOb2Rlc0JlZm9yZVNldHVwICkge1xyXG5cclxuXHRcdFx0XHRcdC8vICEhIG5vIG91dHB1dE5vZGUgISFcclxuXHRcdFx0XHRcdC8vb3V0cHV0Tm9kZSA9IGJ1aWxkZXIuc3RhY2s7XHJcblxyXG5cdFx0XHRcdH0qL1xyXG5cclxuXHRcdFx0XHRmb3IgKCBjb25zdCBjaGlsZE5vZGUgb2YgT2JqZWN0LnZhbHVlcyggcHJvcGVydGllcyApICkge1xyXG5cclxuXHRcdFx0XHRcdGlmICggY2hpbGROb2RlICYmIGNoaWxkTm9kZS5pc05vZGUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjaGlsZE5vZGUuYnVpbGQoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKCBpc05vZGVPdXRwdXQgKSB7XHJcblxyXG5cdFx0XHRcdFx0b3V0cHV0Tm9kZS5idWlsZCggYnVpbGRlciApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHByb3BlcnRpZXMub3V0cHV0Tm9kZSA9IG91dHB1dE5vZGU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmICggYnVpbGRTdGFnZSA9PT0gJ2FuYWx5emUnICkge1xyXG5cclxuXHRcdFx0dGhpcy5hbmFseXplKCBidWlsZGVyICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggYnVpbGRTdGFnZSA9PT0gJ2dlbmVyYXRlJyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGlzR2VuZXJhdGVPbmNlID0gdGhpcy5nZW5lcmF0ZS5sZW5ndGggPT09IDE7XHJcblxyXG5cdFx0XHRpZiAoIGlzR2VuZXJhdGVPbmNlICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB0eXBlID0gdGhpcy5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cdFx0XHRcdGNvbnN0IG5vZGVEYXRhID0gYnVpbGRlci5nZXREYXRhRnJvbU5vZGUoIHRoaXMgKTtcclxuXHJcblx0XHRcdFx0cmVzdWx0ID0gbm9kZURhdGEuc25pcHBldDtcclxuXHJcblx0XHRcdFx0aWYgKCByZXN1bHQgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIG5vZGVEYXRhLmdlbmVyYXRlZCA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdFx0bm9kZURhdGEuZ2VuZXJhdGVkID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0XHRcdHJlc3VsdCA9IHRoaXMuZ2VuZXJhdGUoIGJ1aWxkZXIgKSB8fCAnJztcclxuXHJcblx0XHRcdFx0XHRcdG5vZGVEYXRhLnNuaXBwZXQgPSByZXN1bHQ7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk5vZGU6IFJlY3Vyc2lvbiBkZXRlY3RlZC4nLCB0aGlzICk7XHJcblxyXG5cdFx0XHRcdFx0XHRyZXN1bHQgPSAnJztcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIG5vZGVEYXRhLmZsb3dDb2RlcyAhPT0gdW5kZWZpbmVkICYmIGJ1aWxkZXIuY29udGV4dC5ub2RlQmxvY2sgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRidWlsZGVyLmFkZEZsb3dDb2RlSGllcmFyY2h5KCB0aGlzLCBidWlsZGVyLmNvbnRleHQubm9kZUJsb2NrICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0cmVzdWx0ID0gYnVpbGRlci5mb3JtYXQoIHJlc3VsdCwgdHlwZSwgb3V0cHV0ICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRyZXN1bHQgPSB0aGlzLmdlbmVyYXRlKCBidWlsZGVyLCBvdXRwdXQgKSB8fCAnJztcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0YnVpbGRlci5yZW1vdmVDaGFpbiggdGhpcyApO1xyXG5cdFx0YnVpbGRlci5hZGRTZXF1ZW50aWFsTm9kZSggdGhpcyApO1xyXG5cclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgY2hpbGQgbm9kZXMgYXMgYSBKU09OIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0FycmF5PE9iamVjdD59IEFuIGl0ZXJhYmxlIGxpc3Qgb2Ygc2VyaWFsaXplZCBjaGlsZCBvYmplY3RzIGFzIEpTT04uXHJcblx0ICovXHJcblx0Z2V0U2VyaWFsaXplQ2hpbGRyZW4oKSB7XHJcblxyXG5cdFx0cmV0dXJuIGdldE5vZGVDaGlsZHJlbiggdGhpcyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNlcmlhbGl6ZXMgdGhlIG5vZGUgdG8gSlNPTi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBqc29uIC0gVGhlIG91dHB1dCBKU09OIG9iamVjdC5cclxuXHQgKi9cclxuXHRzZXJpYWxpemUoIGpzb24gKSB7XHJcblxyXG5cdFx0Y29uc3Qgbm9kZUNoaWxkcmVuID0gdGhpcy5nZXRTZXJpYWxpemVDaGlsZHJlbigpO1xyXG5cclxuXHRcdGNvbnN0IGlucHV0Tm9kZXMgPSB7fTtcclxuXHJcblx0XHRmb3IgKCBjb25zdCB7IHByb3BlcnR5LCBpbmRleCwgY2hpbGROb2RlIH0gb2Ygbm9kZUNoaWxkcmVuICkge1xyXG5cclxuXHRcdFx0aWYgKCBpbmRleCAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIGlucHV0Tm9kZXNbIHByb3BlcnR5IF0gPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRpbnB1dE5vZGVzWyBwcm9wZXJ0eSBdID0gTnVtYmVyLmlzSW50ZWdlciggaW5kZXggKSA/IFtdIDoge307XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aW5wdXROb2Rlc1sgcHJvcGVydHkgXVsgaW5kZXggXSA9IGNoaWxkTm9kZS50b0pTT04oIGpzb24ubWV0YSApLnV1aWQ7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRpbnB1dE5vZGVzWyBwcm9wZXJ0eSBdID0gY2hpbGROb2RlLnRvSlNPTigganNvbi5tZXRhICkudXVpZDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBPYmplY3Qua2V5cyggaW5wdXROb2RlcyApLmxlbmd0aCA+IDAgKSB7XHJcblxyXG5cdFx0XHRqc29uLmlucHV0Tm9kZXMgPSBpbnB1dE5vZGVzO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZXNlcmlhbGl6ZXMgdGhlIG5vZGUgZnJvbSB0aGUgZ2l2ZW4gSlNPTi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBqc29uIC0gVGhlIEpTT04gb2JqZWN0LlxyXG5cdCAqL1xyXG5cdGRlc2VyaWFsaXplKCBqc29uICkge1xyXG5cclxuXHRcdGlmICgganNvbi5pbnB1dE5vZGVzICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBub2RlcyA9IGpzb24ubWV0YS5ub2RlcztcclxuXHJcblx0XHRcdGZvciAoIGNvbnN0IHByb3BlcnR5IGluIGpzb24uaW5wdXROb2RlcyApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBqc29uLmlucHV0Tm9kZXNbIHByb3BlcnR5IF0gKSApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBpbnB1dEFycmF5ID0gW107XHJcblxyXG5cdFx0XHRcdFx0Zm9yICggY29uc3QgdXVpZCBvZiBqc29uLmlucHV0Tm9kZXNbIHByb3BlcnR5IF0gKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRpbnB1dEFycmF5LnB1c2goIG5vZGVzWyB1dWlkIF0gKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0dGhpc1sgcHJvcGVydHkgXSA9IGlucHV0QXJyYXk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIHR5cGVvZiBqc29uLmlucHV0Tm9kZXNbIHByb3BlcnR5IF0gPT09ICdvYmplY3QnICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGlucHV0T2JqZWN0ID0ge307XHJcblxyXG5cdFx0XHRcdFx0Zm9yICggY29uc3Qgc3ViUHJvcGVydHkgaW4ganNvbi5pbnB1dE5vZGVzWyBwcm9wZXJ0eSBdICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgdXVpZCA9IGpzb24uaW5wdXROb2Rlc1sgcHJvcGVydHkgXVsgc3ViUHJvcGVydHkgXTtcclxuXHJcblx0XHRcdFx0XHRcdGlucHV0T2JqZWN0WyBzdWJQcm9wZXJ0eSBdID0gbm9kZXNbIHV1aWQgXTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0dGhpc1sgcHJvcGVydHkgXSA9IGlucHV0T2JqZWN0O1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHV1aWQgPSBqc29uLmlucHV0Tm9kZXNbIHByb3BlcnR5IF07XHJcblxyXG5cdFx0XHRcdFx0dGhpc1sgcHJvcGVydHkgXSA9IG5vZGVzWyB1dWlkIF07XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2VyaWFsaXplcyB0aGUgbm9kZSBpbnRvIHRoZSB0aHJlZS5qcyBKU09OIE9iamVjdC9TY2VuZSBmb3JtYXQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gez9PYmplY3R9IG1ldGEgLSBBbiBvcHRpb25hbCBKU09OIG9iamVjdCB0aGF0IGFscmVhZHkgaG9sZHMgc2VyaWFsaXplZCBkYXRhIGZyb20gb3RoZXIgc2NlbmUgb2JqZWN0cy5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBzZXJpYWxpemVkIG5vZGUuXHJcblx0ICovXHJcblx0dG9KU09OKCBtZXRhICkge1xyXG5cclxuXHRcdGNvbnN0IHsgdXVpZCwgdHlwZSB9ID0gdGhpcztcclxuXHRcdGNvbnN0IGlzUm9vdCA9ICggbWV0YSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBtZXRhID09PSAnc3RyaW5nJyApO1xyXG5cclxuXHRcdGlmICggaXNSb290ICkge1xyXG5cclxuXHRcdFx0bWV0YSA9IHtcclxuXHRcdFx0XHR0ZXh0dXJlczoge30sXHJcblx0XHRcdFx0aW1hZ2VzOiB7fSxcclxuXHRcdFx0XHRub2Rlczoge31cclxuXHRcdFx0fTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gc2VyaWFsaXplXHJcblxyXG5cdFx0bGV0IGRhdGEgPSBtZXRhLm5vZGVzWyB1dWlkIF07XHJcblxyXG5cdFx0aWYgKCBkYXRhID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRkYXRhID0ge1xyXG5cdFx0XHRcdHV1aWQsXHJcblx0XHRcdFx0dHlwZSxcclxuXHRcdFx0XHRtZXRhLFxyXG5cdFx0XHRcdG1ldGFkYXRhOiB7XHJcblx0XHRcdFx0XHR2ZXJzaW9uOiA0LjYsXHJcblx0XHRcdFx0XHR0eXBlOiAnTm9kZScsXHJcblx0XHRcdFx0XHRnZW5lcmF0b3I6ICdOb2RlLnRvSlNPTidcclxuXHRcdFx0XHR9XHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHRpZiAoIGlzUm9vdCAhPT0gdHJ1ZSApIG1ldGEubm9kZXNbIGRhdGEudXVpZCBdID0gZGF0YTtcclxuXHJcblx0XHRcdHRoaXMuc2VyaWFsaXplKCBkYXRhICk7XHJcblxyXG5cdFx0XHRkZWxldGUgZGF0YS5tZXRhO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBUT0RPOiBDb3BpZWQgZnJvbSBPYmplY3QzRC50b0pTT05cclxuXHJcblx0XHRmdW5jdGlvbiBleHRyYWN0RnJvbUNhY2hlKCBjYWNoZSApIHtcclxuXHJcblx0XHRcdGNvbnN0IHZhbHVlcyA9IFtdO1xyXG5cclxuXHRcdFx0Zm9yICggY29uc3Qga2V5IGluIGNhY2hlICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBkYXRhID0gY2FjaGVbIGtleSBdO1xyXG5cdFx0XHRcdGRlbGV0ZSBkYXRhLm1ldGFkYXRhO1xyXG5cdFx0XHRcdHZhbHVlcy5wdXNoKCBkYXRhICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gdmFsdWVzO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGlzUm9vdCApIHtcclxuXHJcblx0XHRcdGNvbnN0IHRleHR1cmVzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS50ZXh0dXJlcyApO1xyXG5cdFx0XHRjb25zdCBpbWFnZXMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLmltYWdlcyApO1xyXG5cdFx0XHRjb25zdCBub2RlcyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEubm9kZXMgKTtcclxuXHJcblx0XHRcdGlmICggdGV4dHVyZXMubGVuZ3RoID4gMCApIGRhdGEudGV4dHVyZXMgPSB0ZXh0dXJlcztcclxuXHRcdFx0aWYgKCBpbWFnZXMubGVuZ3RoID4gMCApIGRhdGEuaW1hZ2VzID0gaW1hZ2VzO1xyXG5cdFx0XHRpZiAoIG5vZGVzLmxlbmd0aCA+IDAgKSBkYXRhLm5vZGVzID0gbm9kZXM7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBkYXRhO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBOb2RlO1xyXG4iLCJpbXBvcnQgTm9kZSBmcm9tICcuLi9jb3JlL05vZGUuanMnO1xyXG5cclxuLyoqXHJcbiAqIEJhc2UgY2xhc3MgZm9yIHJlcHJlc2VudGluZyBlbGVtZW50IGFjY2VzcyBvbiBhbiBhcnJheS1saWtlXHJcbiAqIG5vZGUgZGF0YSBzdHJ1Y3R1cmVzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTm9kZVxyXG4gKi9cclxuY2xhc3MgQXJyYXlFbGVtZW50Tm9kZSBleHRlbmRzIE5vZGUgeyAvLyBAVE9ETzogSWYgZXh0ZW5kaW5nIGZyb20gVGVtcE5vZGUgaXQgYnJlYWtzIHdlYmdwdV9jb21wdXRlXHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ0FycmF5RWxlbWVudE5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYW4gYXJyYXkgZWxlbWVudCBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIGFycmF5LWxpa2Ugbm9kZS5cclxuXHQgKiBAcGFyYW0ge05vZGV9IGluZGV4Tm9kZSAtIFRoZSBpbmRleCBub2RlIHRoYXQgZGVmaW5lcyB0aGUgZWxlbWVudCBhY2Nlc3MuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5vZGUsIGluZGV4Tm9kZSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGFycmF5LWxpa2Ugbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub2RlID0gbm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBpbmRleCBub2RlIHRoYXQgZGVmaW5lcyB0aGUgZWxlbWVudCBhY2Nlc3MuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaW5kZXhOb2RlID0gaW5kZXhOb2RlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0FycmF5RWxlbWVudE5vZGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGlzIG92ZXJ3cml0dGVuIHNpbmNlIHRoZSBub2RlIHR5cGUgaXMgaW5mZXJyZWQgZnJvbSB0aGUgYXJyYXktbGlrZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBub2RlIHR5cGUuXHJcblx0ICovXHJcblx0Z2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubm9kZS5nZXRFbGVtZW50VHlwZSggYnVpbGRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdGdlbmVyYXRlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IGluZGV4VHlwZSA9IHRoaXMuaW5kZXhOb2RlLmdldE5vZGVUeXBlKCBidWlsZGVyICk7XHJcblxyXG5cdFx0Y29uc3Qgbm9kZVNuaXBwZXQgPSB0aGlzLm5vZGUuYnVpbGQoIGJ1aWxkZXIgKTtcclxuXHRcdGNvbnN0IGluZGV4U25pcHBldCA9IHRoaXMuaW5kZXhOb2RlLmJ1aWxkKCBidWlsZGVyLCAhIGJ1aWxkZXIuaXNWZWN0b3IoIGluZGV4VHlwZSApICYmIGJ1aWxkZXIuaXNJbnRlZ2VyKCBpbmRleFR5cGUgKSA/IGluZGV4VHlwZSA6ICd1aW50JyApO1xyXG5cclxuXHRcdHJldHVybiBgJHsgbm9kZVNuaXBwZXQgfVsgJHsgaW5kZXhTbmlwcGV0IH0gXWA7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEFycmF5RWxlbWVudE5vZGU7XHJcbiIsImltcG9ydCBOb2RlIGZyb20gJy4uL2NvcmUvTm9kZS5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBtb2R1bGUgaXMgcGFydCBvZiB0aGUgVFNMIGNvcmUgYW5kIHVzdWFsbHkgbm90IHVzZWQgaW4gYXBwIGxldmVsIGNvZGUuXHJcbiAqIEl0IHJlcHJlc2VudHMgYSBjb252ZXJ0IG9wZXJhdGlvbiBkdXJpbmcgdGhlIHNoYWRlciBnZW5lcmF0aW9uIHByb2Nlc3NcclxuICogbWVhbmluZyBpdCBjb252ZXJ0cyB0aGUgZGF0YSB0eXBlIG9mIGEgbm9kZSB0byBhIHRhcmdldCBkYXRhIHR5cGUuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBOb2RlXHJcbiAqL1xyXG5jbGFzcyBDb252ZXJ0Tm9kZSBleHRlbmRzIE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdDb252ZXJ0Tm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBjb252ZXJ0IG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBUaGUgbm9kZSB3aGljaCB0eXBlIHNob3VsZCBiZSBjb252ZXJ0ZWQuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGNvbnZlcnRUbyAtIFRoZSB0YXJnZXQgbm9kZSB0eXBlLiBNdWx0aXBsZSB0eXBlcyBjYW4gYmUgZGVmaW5lZCBieSBzZXBhcmF0aW5nIHRoZW0gd2l0aCBhIGB8YCBzaWduLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBub2RlLCBjb252ZXJ0VG8gKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBub2RlIHdoaWNoIHR5cGUgc2hvdWxkIGJlIGNvbnZlcnRlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub2RlID0gbm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB0YXJnZXQgbm9kZSB0eXBlLiBNdWx0aXBsZSB0eXBlcyBjYW4gYmUgZGVmaW5lZCBieSBzZXBhcmF0aW5nIHRoZW0gd2l0aCBhIGB8YCBzaWduLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29udmVydFRvID0gY29udmVydFRvO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGlzIG92ZXJ3cml0dGVuIHNpbmNlIHRoZSBpbXBsZW1lbnRhdGlvbiB0cmllcyB0byBpbmZlciB0aGUgYmVzdFxyXG5cdCAqIG1hdGNoaW5nIHR5cGUgZnJvbSB0aGUge0BsaW5rIENvbnZlcnROb2RlI2NvbnZlcnRUb30gcHJvcGVydHkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG5vZGUgdHlwZS5cclxuXHQgKi9cclxuXHRnZXROb2RlVHlwZSggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCByZXF1ZXN0VHlwZSA9IHRoaXMubm9kZS5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cclxuXHRcdGxldCBjb252ZXJ0VG8gPSBudWxsO1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IG92ZXJsb2FkaW5nVHlwZSBvZiB0aGlzLmNvbnZlcnRUby5zcGxpdCggJ3wnICkgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGNvbnZlcnRUbyA9PT0gbnVsbCB8fCBidWlsZGVyLmdldFR5cGVMZW5ndGgoIHJlcXVlc3RUeXBlICkgPT09IGJ1aWxkZXIuZ2V0VHlwZUxlbmd0aCggb3ZlcmxvYWRpbmdUeXBlICkgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnZlcnRUbyA9IG92ZXJsb2FkaW5nVHlwZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGNvbnZlcnRUbztcclxuXHJcblx0fVxyXG5cclxuXHRzZXJpYWxpemUoIGRhdGEgKSB7XHJcblxyXG5cdFx0c3VwZXIuc2VyaWFsaXplKCBkYXRhICk7XHJcblxyXG5cdFx0ZGF0YS5jb252ZXJ0VG8gPSB0aGlzLmNvbnZlcnRUbztcclxuXHJcblx0fVxyXG5cclxuXHRkZXNlcmlhbGl6ZSggZGF0YSApIHtcclxuXHJcblx0XHRzdXBlci5kZXNlcmlhbGl6ZSggZGF0YSApO1xyXG5cclxuXHRcdHRoaXMuY29udmVydFRvID0gZGF0YS5jb252ZXJ0VG87XHJcblxyXG5cdH1cclxuXHJcblx0Z2VuZXJhdGUoIGJ1aWxkZXIsIG91dHB1dCApIHtcclxuXHJcblx0XHRjb25zdCBub2RlID0gdGhpcy5ub2RlO1xyXG5cdFx0Y29uc3QgdHlwZSA9IHRoaXMuZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRjb25zdCBzbmlwcGV0ID0gbm9kZS5idWlsZCggYnVpbGRlciwgdHlwZSApO1xyXG5cclxuXHRcdHJldHVybiBidWlsZGVyLmZvcm1hdCggc25pcHBldCwgdHlwZSwgb3V0cHV0ICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IENvbnZlcnROb2RlO1xyXG4iLCJpbXBvcnQgTm9kZSBmcm9tICcuL05vZGUuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgbW9kdWxlIHVzZXMgY2FjaGUgbWFuYWdlbWVudCB0byBjcmVhdGUgdGVtcG9yYXJ5IHZhcmlhYmxlc1xyXG4gKiBpZiB0aGUgbm9kZSBpcyB1c2VkIG1vcmUgdGhhbiBvbmNlIHRvIHByZXZlbnQgZHVwbGljYXRlIGNhbGN1bGF0aW9ucy5cclxuICpcclxuICogVGhlIGNsYXNzIGFjdHMgYXMgYSBiYXNlIGNsYXNzIGZvciBtYW55IG90aGVyIG5vZGVzIHR5cGVzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTm9kZVxyXG4gKi9cclxuY2xhc3MgVGVtcE5vZGUgZXh0ZW5kcyBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnVGVtcE5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSB0ZW1wIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gez9zdHJpbmd9IG5vZGVUeXBlIC0gVGhlIG5vZGUgdHlwZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggbm9kZVR5cGUgPSBudWxsICkge1xyXG5cclxuXHRcdHN1cGVyKCBub2RlVHlwZSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1RlbXBOb2RlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBXaGV0aGVyIHRoaXMgbm9kZSBpcyB1c2VkIG1vcmUgdGhhbiBvbmNlIGluIGNvbnRleHQgb2Ygb3RoZXIgbm9kZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBBIGZsYWcgdGhhdCBpbmRpY2F0ZXMgaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBkZXBlbmRlbmN5IHRvIG90aGVyIG5vZGVzLlxyXG5cdCAqL1xyXG5cdGhhc0RlcGVuZGVuY2llcyggYnVpbGRlciApIHtcclxuXHJcblx0XHRyZXR1cm4gYnVpbGRlci5nZXREYXRhRnJvbU5vZGUoIHRoaXMgKS51c2FnZUNvdW50ID4gMTtcclxuXHJcblx0fVxyXG5cclxuXHRidWlsZCggYnVpbGRlciwgb3V0cHV0ICkge1xyXG5cclxuXHRcdGNvbnN0IGJ1aWxkU3RhZ2UgPSBidWlsZGVyLmdldEJ1aWxkU3RhZ2UoKTtcclxuXHJcblx0XHRpZiAoIGJ1aWxkU3RhZ2UgPT09ICdnZW5lcmF0ZScgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB0eXBlID0gYnVpbGRlci5nZXRWZWN0b3JUeXBlKCB0aGlzLmdldE5vZGVUeXBlKCBidWlsZGVyLCBvdXRwdXQgKSApO1xyXG5cdFx0XHRjb25zdCBub2RlRGF0YSA9IGJ1aWxkZXIuZ2V0RGF0YUZyb21Ob2RlKCB0aGlzICk7XHJcblxyXG5cdFx0XHRpZiAoIG5vZGVEYXRhLnByb3BlcnR5TmFtZSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gYnVpbGRlci5mb3JtYXQoIG5vZGVEYXRhLnByb3BlcnR5TmFtZSwgdHlwZSwgb3V0cHV0ICk7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCB0eXBlICE9PSAndm9pZCcgJiYgb3V0cHV0ICE9PSAndm9pZCcgJiYgdGhpcy5oYXNEZXBlbmRlbmNpZXMoIGJ1aWxkZXIgKSApIHtcclxuXHJcblx0XHRcdFx0Y29uc3Qgc25pcHBldCA9IHN1cGVyLmJ1aWxkKCBidWlsZGVyLCB0eXBlICk7XHJcblxyXG5cdFx0XHRcdGNvbnN0IG5vZGVWYXIgPSBidWlsZGVyLmdldFZhckZyb21Ob2RlKCB0aGlzLCBudWxsLCB0eXBlICk7XHJcblx0XHRcdFx0Y29uc3QgcHJvcGVydHlOYW1lID0gYnVpbGRlci5nZXRQcm9wZXJ0eU5hbWUoIG5vZGVWYXIgKTtcclxuXHJcblx0XHRcdFx0YnVpbGRlci5hZGRMaW5lRmxvd0NvZGUoIGAkeyBwcm9wZXJ0eU5hbWUgfSA9ICR7IHNuaXBwZXQgfWAsIHRoaXMgKTtcclxuXHJcblx0XHRcdFx0bm9kZURhdGEuc25pcHBldCA9IHNuaXBwZXQ7XHJcblx0XHRcdFx0bm9kZURhdGEucHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lO1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gYnVpbGRlci5mb3JtYXQoIG5vZGVEYXRhLnByb3BlcnR5TmFtZSwgdHlwZSwgb3V0cHV0ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBzdXBlci5idWlsZCggYnVpbGRlciwgb3V0cHV0ICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFRlbXBOb2RlO1xyXG4iLCJpbXBvcnQgVGVtcE5vZGUgZnJvbSAnLi4vY29yZS9UZW1wTm9kZS5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBtb2R1bGUgaXMgcGFydCBvZiB0aGUgVFNMIGNvcmUgYW5kIHVzdWFsbHkgbm90IHVzZWQgaW4gYXBwIGxldmVsIGNvZGUuXHJcbiAqIEl0IHJlcHJlc2VudHMgYSBqb2luIG9wZXJhdGlvbiBkdXJpbmcgdGhlIHNoYWRlciBnZW5lcmF0aW9uIHByb2Nlc3MuXHJcbiAqIEZvciBleGFtcGxlIGluIGNhbiBjb21wb3NlL2pvaW4gdHdvIHNpbmdsZSBmbG9hdHMgaW50byBhIGB2ZWMyYCB0eXBlLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgVGVtcE5vZGVcclxuICovXHJcbmNsYXNzIEpvaW5Ob2RlIGV4dGVuZHMgVGVtcE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdKb2luTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBqb2luIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PE5vZGU+fSBub2RlcyAtIEFuIGFycmF5IG9mIG5vZGVzIHRoYXQgc2hvdWxkIGJlIGpvaW5lZC5cclxuXHQgKiBAcGFyYW0gez9zdHJpbmd9IFtub2RlVHlwZT1udWxsXSAtIFRoZSBub2RlIHR5cGUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5vZGVzID0gW10sIG5vZGVUeXBlID0gbnVsbCApIHtcclxuXHJcblx0XHRzdXBlciggbm9kZVR5cGUgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIGFycmF5IG9mIG5vZGVzIHRoYXQgc2hvdWxkIGJlIGpvaW5lZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8Tm9kZT59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9kZXMgPSBub2RlcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyBvdmVyd3JpdHRlbiBzaW5jZSB0aGUgbm9kZSB0eXBlIG11c3QgYmUgaW5mZXJyZWQgZnJvbSB0aGVcclxuXHQgKiBqb2luZWQgZGF0YSBsZW5ndGggaWYgbm90IGV4cGxpY2l0bHkgZGVmaW5lZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgbm9kZSB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldE5vZGVUeXBlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5ub2RlVHlwZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHJldHVybiBidWlsZGVyLmdldFZlY3RvclR5cGUoIHRoaXMubm9kZVR5cGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGJ1aWxkZXIuZ2V0VHlwZUZyb21MZW5ndGgoIHRoaXMubm9kZXMucmVkdWNlKCAoIGNvdW50LCBjdXIgKSA9PiBjb3VudCArIGJ1aWxkZXIuZ2V0VHlwZUxlbmd0aCggY3VyLmdldE5vZGVUeXBlKCBidWlsZGVyICkgKSwgMCApICk7XHJcblxyXG5cdH1cclxuXHJcblx0Z2VuZXJhdGUoIGJ1aWxkZXIsIG91dHB1dCApIHtcclxuXHJcblx0XHRjb25zdCB0eXBlID0gdGhpcy5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cdFx0Y29uc3QgbWF4TGVuZ3RoID0gYnVpbGRlci5nZXRUeXBlTGVuZ3RoKCB0eXBlICk7XHJcblxyXG5cdFx0Y29uc3Qgbm9kZXMgPSB0aGlzLm5vZGVzO1xyXG5cclxuXHRcdGNvbnN0IHByaW1pdGl2ZVR5cGUgPSBidWlsZGVyLmdldENvbXBvbmVudFR5cGUoIHR5cGUgKTtcclxuXHJcblx0XHRjb25zdCBzbmlwcGV0VmFsdWVzID0gW107XHJcblxyXG5cdFx0bGV0IGxlbmd0aCA9IDA7XHJcblxyXG5cdFx0Zm9yICggY29uc3QgaW5wdXQgb2Ygbm9kZXMgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGxlbmd0aCA+PSBtYXhMZW5ndGggKSB7XHJcblxyXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoIGBUSFJFRS5UU0w6IExlbmd0aCBvZiBwYXJhbWV0ZXJzIGV4Y2VlZHMgbWF4aW11bSBsZW5ndGggb2YgZnVuY3Rpb24gJyR7IHR5cGUgfSgpJyB0eXBlLmAgKTtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGxldCBpbnB1dFR5cGUgPSBpbnB1dC5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cdFx0XHRsZXQgaW5wdXRUeXBlTGVuZ3RoID0gYnVpbGRlci5nZXRUeXBlTGVuZ3RoKCBpbnB1dFR5cGUgKTtcclxuXHRcdFx0bGV0IGlucHV0U25pcHBldDtcclxuXHJcblx0XHRcdGlmICggbGVuZ3RoICsgaW5wdXRUeXBlTGVuZ3RoID4gbWF4TGVuZ3RoICkge1xyXG5cclxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCBgVEhSRUUuVFNMOiBMZW5ndGggb2YgJyR7IHR5cGUgfSgpJyBkYXRhIGV4Y2VlZHMgbWF4aW11bSBsZW5ndGggb2Ygb3V0cHV0IHR5cGUuYCApO1xyXG5cclxuXHRcdFx0XHRpbnB1dFR5cGVMZW5ndGggPSBtYXhMZW5ndGggLSBsZW5ndGg7XHJcblx0XHRcdFx0aW5wdXRUeXBlID0gYnVpbGRlci5nZXRUeXBlRnJvbUxlbmd0aCggaW5wdXRUeXBlTGVuZ3RoICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRsZW5ndGggKz0gaW5wdXRUeXBlTGVuZ3RoO1xyXG5cdFx0XHRpbnB1dFNuaXBwZXQgPSBpbnB1dC5idWlsZCggYnVpbGRlciwgaW5wdXRUeXBlICk7XHJcblxyXG5cdFx0XHRjb25zdCBpbnB1dFByaW1pdGl2ZVR5cGUgPSBidWlsZGVyLmdldENvbXBvbmVudFR5cGUoIGlucHV0VHlwZSApO1xyXG5cclxuXHRcdFx0aWYgKCBpbnB1dFByaW1pdGl2ZVR5cGUgIT09IHByaW1pdGl2ZVR5cGUgKSB7XHJcblxyXG5cdFx0XHRcdGlucHV0U25pcHBldCA9IGJ1aWxkZXIuZm9ybWF0KCBpbnB1dFNuaXBwZXQsIGlucHV0UHJpbWl0aXZlVHlwZSwgcHJpbWl0aXZlVHlwZSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0c25pcHBldFZhbHVlcy5wdXNoKCBpbnB1dFNuaXBwZXQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3Qgc25pcHBldCA9IGAkeyBidWlsZGVyLmdldFR5cGUoIHR5cGUgKSB9KCAkeyBzbmlwcGV0VmFsdWVzLmpvaW4oICcsICcgKSB9IClgO1xyXG5cclxuXHRcdHJldHVybiBidWlsZGVyLmZvcm1hdCggc25pcHBldCwgdHlwZSwgb3V0cHV0ICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEpvaW5Ob2RlO1xyXG4iLCJpbXBvcnQgTm9kZSBmcm9tICcuLi9jb3JlL05vZGUuanMnO1xyXG5pbXBvcnQgeyB2ZWN0b3JDb21wb25lbnRzIH0gZnJvbSAnLi4vY29yZS9jb25zdGFudHMuanMnO1xyXG5cclxuY29uc3QgX3N0cmluZ1ZlY3RvckNvbXBvbmVudHMgPSB2ZWN0b3JDb21wb25lbnRzLmpvaW4oICcnICk7XHJcblxyXG4vKipcclxuICogVGhpcyBtb2R1bGUgaXMgcGFydCBvZiB0aGUgVFNMIGNvcmUgYW5kIHVzdWFsbHkgbm90IHVzZWQgaW4gYXBwIGxldmVsIGNvZGUuXHJcbiAqIGBTcGxpdE5vZGVgIHJlcHJlc2VudHMgYSBwcm9wZXJ0eSBhY2Nlc3Mgb3BlcmF0aW9uIHdoaWNoIG1lYW5zIGl0IGlzXHJcbiAqIHVzZWQgdG8gaW1wbGVtZW50IGFueSBgLnh5endgLCBgLnJnYmFgIGFuZCBgc3RwcWAgdXNhZ2Ugb24gbm9kZSBvYmplY3RzLlxyXG4gKiBGb3IgZXhhbXBsZTpcclxuICogYGBganNcclxuICogY29uc3QgcmVkVmFsdWUgPSBjb2xvci5yO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVcclxuICovXHJcbmNsYXNzIFNwbGl0Tm9kZSBleHRlbmRzIE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdTcGxpdE5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc3BsaXQgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFRoZSBub2RlIHRoYXQgc2hvdWxkIGJlIGFjY2Vzc2VkLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbY29tcG9uZW50cz0neCddIC0gVGhlIGNvbXBvbmVudHMgdGhhdCBzaG91bGQgYmUgYWNjZXNzZWQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5vZGUsIGNvbXBvbmVudHMgPSAneCcgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBub2RlIHRoYXQgc2hvdWxkIGJlIGFjY2Vzc2VkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vZGUgPSBub2RlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNvbXBvbmVudHMgdGhhdCBzaG91bGQgYmUgYWNjZXNzZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb21wb25lbnRzID0gY29tcG9uZW50cztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNTcGxpdE5vZGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHZlY3RvciBsZW5ndGggd2hpY2ggaXMgY29tcHV0ZWQgYmFzZWQgb24gdGhlIHJlcXVlc3RlZCBjb21wb25lbnRzLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgdmVjdG9yIGxlbmd0aC5cclxuXHQgKi9cclxuXHRnZXRWZWN0b3JMZW5ndGgoKSB7XHJcblxyXG5cdFx0bGV0IHZlY3Rvckxlbmd0aCA9IHRoaXMuY29tcG9uZW50cy5sZW5ndGg7XHJcblxyXG5cdFx0Zm9yICggY29uc3QgYyBvZiB0aGlzLmNvbXBvbmVudHMgKSB7XHJcblxyXG5cdFx0XHR2ZWN0b3JMZW5ndGggPSBNYXRoLm1heCggdmVjdG9yQ29tcG9uZW50cy5pbmRleE9mKCBjICkgKyAxLCB2ZWN0b3JMZW5ndGggKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHZlY3Rvckxlbmd0aDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBjb21wb25lbnQgdHlwZSBvZiB0aGUgbm9kZSdzIHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGNvbXBvbmVudCB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldENvbXBvbmVudFR5cGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIGJ1aWxkZXIuZ2V0Q29tcG9uZW50VHlwZSggdGhpcy5ub2RlLmdldE5vZGVUeXBlKCBidWlsZGVyICkgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyBvdmVyd3JpdHRlbiBzaW5jZSB0aGUgbm9kZSB0eXBlIGlzIGluZmVycmVkIGZyb20gcmVxdWVzdGVkIGNvbXBvbmVudHMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG5vZGUgdHlwZS5cclxuXHQgKi9cclxuXHRnZXROb2RlVHlwZSggYnVpbGRlciApIHtcclxuXHJcblx0XHRyZXR1cm4gYnVpbGRlci5nZXRUeXBlRnJvbUxlbmd0aCggdGhpcy5jb21wb25lbnRzLmxlbmd0aCwgdGhpcy5nZXRDb21wb25lbnRUeXBlKCBidWlsZGVyICkgKTtcclxuXHJcblx0fVxyXG5cclxuXHRnZW5lcmF0ZSggYnVpbGRlciwgb3V0cHV0ICkge1xyXG5cclxuXHRcdGNvbnN0IG5vZGUgPSB0aGlzLm5vZGU7XHJcblx0XHRjb25zdCBub2RlVHlwZUxlbmd0aCA9IGJ1aWxkZXIuZ2V0VHlwZUxlbmd0aCggbm9kZS5nZXROb2RlVHlwZSggYnVpbGRlciApICk7XHJcblxyXG5cdFx0bGV0IHNuaXBwZXQgPSBudWxsO1xyXG5cclxuXHRcdGlmICggbm9kZVR5cGVMZW5ndGggPiAxICkge1xyXG5cclxuXHRcdFx0bGV0IHR5cGUgPSBudWxsO1xyXG5cclxuXHRcdFx0Y29uc3QgY29tcG9uZW50c0xlbmd0aCA9IHRoaXMuZ2V0VmVjdG9yTGVuZ3RoKCk7XHJcblxyXG5cdFx0XHRpZiAoIGNvbXBvbmVudHNMZW5ndGggPj0gbm9kZVR5cGVMZW5ndGggKSB7XHJcblxyXG5cdFx0XHRcdC8vIG5lZWRlZCBleHBhbmQgdGhlIGlucHV0IG5vZGVcclxuXHJcblx0XHRcdFx0dHlwZSA9IGJ1aWxkZXIuZ2V0VHlwZUZyb21MZW5ndGgoIHRoaXMuZ2V0VmVjdG9yTGVuZ3RoKCksIHRoaXMuZ2V0Q29tcG9uZW50VHlwZSggYnVpbGRlciApICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBub2RlU25pcHBldCA9IG5vZGUuYnVpbGQoIGJ1aWxkZXIsIHR5cGUgKTtcclxuXHJcblx0XHRcdGlmICggdGhpcy5jb21wb25lbnRzLmxlbmd0aCA9PT0gbm9kZVR5cGVMZW5ndGggJiYgdGhpcy5jb21wb25lbnRzID09PSBfc3RyaW5nVmVjdG9yQ29tcG9uZW50cy5zbGljZSggMCwgdGhpcy5jb21wb25lbnRzLmxlbmd0aCApICkge1xyXG5cclxuXHRcdFx0XHQvLyB1bm5lY2Vzc2FyeSBzd2l6emxlXHJcblxyXG5cdFx0XHRcdHNuaXBwZXQgPSBidWlsZGVyLmZvcm1hdCggbm9kZVNuaXBwZXQsIHR5cGUsIG91dHB1dCApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0c25pcHBldCA9IGJ1aWxkZXIuZm9ybWF0KCBgJHtub2RlU25pcHBldH0uJHt0aGlzLmNvbXBvbmVudHN9YCwgdGhpcy5nZXROb2RlVHlwZSggYnVpbGRlciApLCBvdXRwdXQgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Ly8gaWdub3JlIC5jb21wb25lbnRzIGlmIC5ub2RlIHJldHVybnMgZmxvYXQvaW50ZWdlclxyXG5cclxuXHRcdFx0c25pcHBldCA9IG5vZGUuYnVpbGQoIGJ1aWxkZXIsIG91dHB1dCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gc25pcHBldDtcclxuXHJcblx0fVxyXG5cclxuXHRzZXJpYWxpemUoIGRhdGEgKSB7XHJcblxyXG5cdFx0c3VwZXIuc2VyaWFsaXplKCBkYXRhICk7XHJcblxyXG5cdFx0ZGF0YS5jb21wb25lbnRzID0gdGhpcy5jb21wb25lbnRzO1xyXG5cclxuXHR9XHJcblxyXG5cdGRlc2VyaWFsaXplKCBkYXRhICkge1xyXG5cclxuXHRcdHN1cGVyLmRlc2VyaWFsaXplKCBkYXRhICk7XHJcblxyXG5cdFx0dGhpcy5jb21wb25lbnRzID0gZGF0YS5jb21wb25lbnRzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTcGxpdE5vZGU7XHJcbiIsImltcG9ydCBUZW1wTm9kZSBmcm9tICcuLi9jb3JlL1RlbXBOb2RlLmpzJztcclxuaW1wb3J0IHsgdmVjdG9yQ29tcG9uZW50cyB9IGZyb20gJy4uL2NvcmUvY29uc3RhbnRzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIG1vZHVsZSBpcyBwYXJ0IG9mIHRoZSBUU0wgY29yZSBhbmQgdXN1YWxseSBub3QgdXNlZCBpbiBhcHAgbGV2ZWwgY29kZS5cclxuICogYFNldE5vZGVgIHJlcHJlc2VudHMgYSBzZXQgb3BlcmF0aW9uIHdoaWNoIG1lYW5zIGl0IGlzIHVzZWQgdG8gaW1wbGVtZW50IGFueVxyXG4gKiBgc2V0WFlaVygpYCwgYHNldFJHQkEoKWAgYW5kIGBzZXRTVFBRKClgIG1ldGhvZCBpbnZvY2F0aW9ucyBvbiBub2RlIG9iamVjdHMuXHJcbiAqIEZvciBleGFtcGxlOlxyXG4gKiBgYGBqc1xyXG4gKiBtYXRlcmlhbExpbmUuY29sb3JOb2RlID0gY29sb3IoIDAsIDAsIDAgKS5zZXRSKCBmbG9hdCggMSApICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgVGVtcE5vZGVcclxuICovXHJcbmNsYXNzIFNldE5vZGUgZXh0ZW5kcyBUZW1wTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ1NldE5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc2V0IG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV9IHNvdXJjZU5vZGUgLSBUaGUgbm9kZSB0aGF0IHNob3VsZCBiZSB1cGRhdGVkLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBjb21wb25lbnRzIC0gVGhlIGNvbXBvbmVudHMgdGhhdCBzaG91bGQgYmUgdXBkYXRlZC5cclxuXHQgKiBAcGFyYW0ge05vZGV9IHRhcmdldE5vZGUgLSBUaGUgdmFsdWUgbm9kZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggc291cmNlTm9kZSwgY29tcG9uZW50cywgdGFyZ2V0Tm9kZSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG5vZGUgdGhhdCBzaG91bGQgYmUgdXBkYXRlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zb3VyY2VOb2RlID0gc291cmNlTm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjb21wb25lbnRzIHRoYXQgc2hvdWxkIGJlIHVwZGF0ZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb21wb25lbnRzID0gY29tcG9uZW50cztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB2YWx1ZSBub2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRhcmdldE5vZGUgPSB0YXJnZXROb2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGlzIG92ZXJ3cml0dGVuIHNpbmNlIHRoZSBub2RlIHR5cGUgaXMgaW5mZXJyZWQgZnJvbSB7QGxpbmsgU2V0Tm9kZSNzb3VyY2VOb2RlfS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgbm9kZSB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldE5vZGVUeXBlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnNvdXJjZU5vZGUuZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHRnZW5lcmF0ZSggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCB7IHNvdXJjZU5vZGUsIGNvbXBvbmVudHMsIHRhcmdldE5vZGUgfSA9IHRoaXM7XHJcblxyXG5cdFx0Y29uc3Qgc291cmNlVHlwZSA9IHRoaXMuZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRjb25zdCBjb21wb25lbnRUeXBlID0gYnVpbGRlci5nZXRDb21wb25lbnRUeXBlKCB0YXJnZXROb2RlLmdldE5vZGVUeXBlKCBidWlsZGVyICkgKTtcclxuXHRcdGNvbnN0IHRhcmdldFR5cGUgPSBidWlsZGVyLmdldFR5cGVGcm9tTGVuZ3RoKCBjb21wb25lbnRzLmxlbmd0aCwgY29tcG9uZW50VHlwZSApO1xyXG5cclxuXHRcdGNvbnN0IHRhcmdldFNuaXBwZXQgPSB0YXJnZXROb2RlLmJ1aWxkKCBidWlsZGVyLCB0YXJnZXRUeXBlICk7XHJcblx0XHRjb25zdCBzb3VyY2VTbmlwcGV0ID0gc291cmNlTm9kZS5idWlsZCggYnVpbGRlciwgc291cmNlVHlwZSApO1xyXG5cclxuXHRcdGNvbnN0IGxlbmd0aCA9IGJ1aWxkZXIuZ2V0VHlwZUxlbmd0aCggc291cmNlVHlwZSApO1xyXG5cdFx0Y29uc3Qgc25pcHBldFZhbHVlcyA9IFtdO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGNvbXBvbmVudCA9IHZlY3RvckNvbXBvbmVudHNbIGkgXTtcclxuXHJcblx0XHRcdGlmICggY29tcG9uZW50ID09PSBjb21wb25lbnRzWyAwIF0gKSB7XHJcblxyXG5cdFx0XHRcdHNuaXBwZXRWYWx1ZXMucHVzaCggdGFyZ2V0U25pcHBldCApO1xyXG5cclxuXHRcdFx0XHRpICs9IGNvbXBvbmVudHMubGVuZ3RoIC0gMTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHNuaXBwZXRWYWx1ZXMucHVzaCggc291cmNlU25pcHBldCArICcuJyArIGNvbXBvbmVudCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gYCR7IGJ1aWxkZXIuZ2V0VHlwZSggc291cmNlVHlwZSApIH0oICR7IHNuaXBwZXRWYWx1ZXMuam9pbiggJywgJyApIH0gKWA7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFNldE5vZGU7XHJcbiIsImltcG9ydCBUZW1wTm9kZSBmcm9tICcuLi9jb3JlL1RlbXBOb2RlLmpzJztcclxuaW1wb3J0IHsgdmVjdG9yQ29tcG9uZW50cyB9IGZyb20gJy4uL2NvcmUvY29uc3RhbnRzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIG1vZHVsZSBpcyBwYXJ0IG9mIHRoZSBUU0wgY29yZSBhbmQgdXN1YWxseSBub3QgdXNlZCBpbiBhcHAgbGV2ZWwgY29kZS5cclxuICogSXQgcmVwcmVzZW50cyBhIGZsaXAgb3BlcmF0aW9uIGR1cmluZyB0aGUgc2hhZGVyIGdlbmVyYXRpb24gcHJvY2Vzc1xyXG4gKiBtZWFuaW5nIGl0IGZsaXBzIG5vcm1hbGl6ZWQgdmFsdWVzIHdpdGggdGhlIGZvbGxvd2luZyBmb3JtdWxhOlxyXG4gKiBgYGBcclxuICogeCA9IDEgLSB4O1xyXG4gKiBgYGBcclxuICogYEZsaXBOb2RlYCBpcyBpbnRlcm5hbGx5IHVzZWQgdG8gaW1wbGVtZW50IGFueSBgZmxpcFhZWlcoKWAsIGBmbGlwUkdCQSgpYCBhbmRcclxuICogYGZsaXBTVFBRKClgIG1ldGhvZCBpbnZvY2F0aW9ucyBvbiBub2RlIG9iamVjdHMuIEZvciBleGFtcGxlOlxyXG4gKiBgYGBqc1xyXG4gKiB1dk5vZGUgPSB1dk5vZGUuZmxpcFkoKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBUZW1wTm9kZVxyXG4gKi9cclxuY2xhc3MgRmxpcE5vZGUgZXh0ZW5kcyBUZW1wTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ0ZsaXBOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGZsaXAgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gc291cmNlTm9kZSAtIFRoZSBub2RlIHdoaWNoIGNvbXBvbmVudChzKSBzaG91bGQgYmUgZmxpcHBlZC5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gY29tcG9uZW50cyAtIFRoZSBjb21wb25lbnRzIHRoYXQgc2hvdWxkIGJlIGZsaXBwZWQgZS5nLiBgJ3gnYCBvciBgJ3h5J2AuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHNvdXJjZU5vZGUsIGNvbXBvbmVudHMgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBub2RlIHdoaWNoIGNvbXBvbmVudChzKSBzaG91bGQgYmUgZmxpcHBlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zb3VyY2VOb2RlID0gc291cmNlTm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjb21wb25lbnRzIHRoYXQgc2hvdWxkIGJlIGZsaXBwZWQgZS5nLiBgJ3gnYCBvciBgJ3h5J2AuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb21wb25lbnRzID0gY29tcG9uZW50cztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyBvdmVyd3JpdHRlbiBzaW5jZSB0aGUgbm9kZSB0eXBlIGlzIGluZmVycmVkIGZyb20gdGhlIHNvdXJjZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBub2RlIHR5cGUuXHJcblx0ICovXHJcblx0Z2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuc291cmNlTm9kZS5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdGdlbmVyYXRlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IHsgY29tcG9uZW50cywgc291cmNlTm9kZSB9ID0gdGhpcztcclxuXHJcblx0XHRjb25zdCBzb3VyY2VUeXBlID0gdGhpcy5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cdFx0Y29uc3Qgc291cmNlU25pcHBldCA9IHNvdXJjZU5vZGUuYnVpbGQoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRjb25zdCBzb3VyY2VDYWNoZSA9IGJ1aWxkZXIuZ2V0VmFyRnJvbU5vZGUoIHRoaXMgKTtcclxuXHRcdGNvbnN0IHNvdXJjZVByb3BlcnR5ID0gYnVpbGRlci5nZXRQcm9wZXJ0eU5hbWUoIHNvdXJjZUNhY2hlICk7XHJcblxyXG5cdFx0YnVpbGRlci5hZGRMaW5lRmxvd0NvZGUoIHNvdXJjZVByb3BlcnR5ICsgJyA9ICcgKyBzb3VyY2VTbmlwcGV0LCB0aGlzICk7XHJcblxyXG5cdFx0Y29uc3QgbGVuZ3RoID0gYnVpbGRlci5nZXRUeXBlTGVuZ3RoKCBzb3VyY2VUeXBlICk7XHJcblx0XHRjb25zdCBzbmlwcGV0VmFsdWVzID0gW107XHJcblxyXG5cdFx0bGV0IGNvbXBvbmVudEluZGV4ID0gMDtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBjb21wb25lbnQgPSB2ZWN0b3JDb21wb25lbnRzWyBpIF07XHJcblxyXG5cdFx0XHRpZiAoIGNvbXBvbmVudCA9PT0gY29tcG9uZW50c1sgY29tcG9uZW50SW5kZXggXSApIHtcclxuXHJcblx0XHRcdFx0c25pcHBldFZhbHVlcy5wdXNoKCAnMS4wIC0gJyArICggc291cmNlUHJvcGVydHkgKyAnLicgKyBjb21wb25lbnQgKSApO1xyXG5cclxuXHRcdFx0XHRjb21wb25lbnRJbmRleCArKztcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHNuaXBwZXRWYWx1ZXMucHVzaCggc291cmNlUHJvcGVydHkgKyAnLicgKyBjb21wb25lbnQgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGAkeyBidWlsZGVyLmdldFR5cGUoIHNvdXJjZVR5cGUgKSB9KCAkeyBzbmlwcGV0VmFsdWVzLmpvaW4oICcsICcgKSB9IClgO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBGbGlwTm9kZTtcclxuIiwiaW1wb3J0IE5vZGUgZnJvbSAnLi9Ob2RlLmpzJztcclxuaW1wb3J0IHsgZ2V0VmFsdWVUeXBlLCBnZXRWYWx1ZUZyb21UeXBlLCBhcnJheUJ1ZmZlclRvQmFzZTY0IH0gZnJvbSAnLi9Ob2RlVXRpbHMuanMnO1xyXG5cclxuLyoqXHJcbiAqIEJhc2UgY2xhc3MgZm9yIHJlcHJlc2VudGluZyBkYXRhIGlucHV0IG5vZGVzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTm9kZVxyXG4gKi9cclxuY2xhc3MgSW5wdXROb2RlIGV4dGVuZHMgTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ0lucHV0Tm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBpbnB1dCBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHthbnl9IHZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoaXMgbm9kZS4gVGhpcyBjYW4gYmUgYW55IEpTIHByaW1pdGl2ZSwgZnVuY3Rpb25zLCBhcnJheSBidWZmZXJzIG9yIGV2ZW4gdGhyZWUuanMgb2JqZWN0cyAodmVjdG9yLCBtYXRyaWNlcywgY29sb3JzKS5cclxuXHQgKiBAcGFyYW0gez9zdHJpbmd9IG5vZGVUeXBlIC0gVGhlIG5vZGUgdHlwZS4gSWYgbm8gZXhwbGljaXQgdHlwZSBpcyBkZWZpbmVkLCB0aGUgbm9kZSB0cmllcyB0byBkZXJpdmUgdGhlIHR5cGUgZnJvbSBpdHMgdmFsdWUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHZhbHVlLCBub2RlVHlwZSA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5vZGVUeXBlICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzSW5wdXROb2RlID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB2YWx1ZSBvZiB0aGlzIG5vZGUuIFRoaXMgY2FuIGJlIGFueSBKUyBwcmltaXRpdmUsIGZ1bmN0aW9ucywgYXJyYXkgYnVmZmVycyBvciBldmVuIHRocmVlLmpzIG9iamVjdHMgKHZlY3RvciwgbWF0cmljZXMsIGNvbG9ycykuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2FueX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52YWx1ZSA9IHZhbHVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHByZWNpc2lvbiBvZiB0aGUgdmFsdWUgaW4gdGhlIHNoYWRlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7PygnbG93J3wnbWVkaXVtJ3wnaGlnaCcpfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnByZWNpc2lvbiA9IG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0Tm9kZVR5cGUoIC8qYnVpbGRlciovICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5ub2RlVHlwZSA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHJldHVybiBnZXRWYWx1ZVR5cGUoIHRoaXMudmFsdWUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubm9kZVR5cGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgaW5wdXQgdHlwZSBvZiB0aGUgbm9kZSB3aGljaCBpcyBieSBkZWZhdWx0IHRoZSBub2RlIHR5cGUuIERlcml2ZWQgbW9kdWxlc1xyXG5cdCAqIG1pZ2h0IG92ZXJ3cml0ZSB0aGlzIG1ldGhvZCBhbmQgdXNlIGEgZml4ZWQgdHlwZSBvciBjb21wdXRlIG9uZSBhbmFseXRpY2FsbHkuXHJcblx0ICpcclxuXHQgKiBBIHR5cGljYWwgZXhhbXBsZSBmb3IgZGlmZmVyZW50IGlucHV0IGFuZCBub2RlIHR5cGVzIGFyZSB0ZXh0dXJlcy4gVGhlIGlucHV0IHR5cGUgb2YgYVxyXG5cdCAqIG5vcm1hbCBSR0JBIHRleHR1cmUgaXMgYHRleHR1cmVgIHdoZXJlYXMgaXRzIG5vZGUgdHlwZSBpcyBgdmVjNGAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGlucHV0IHR5cGUuXHJcblx0ICovXHJcblx0Z2V0SW5wdXRUeXBlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmdldE5vZGVUeXBlKCBidWlsZGVyICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgcHJlY2lzaW9uIHRvIHRoZSBnaXZlbiB2YWx1ZS4gVGhlIG1ldGhvZCBjYW4gYmVcclxuXHQgKiBvdmVyd3JpdHRlbiBpbiBkZXJpdmVkIGNsYXNzZXMgaWYgdGhlIGZpbmFsIHByZWNpc2lvbiBtdXN0IGJlIGNvbXB1dGVkXHJcblx0ICogYW5hbHl0aWNhbGx5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHsoJ2xvdyd8J21lZGl1bSd8J2hpZ2gnKX0gcHJlY2lzaW9uIC0gVGhlIHByZWNpc2lvbiBvZiB0aGUgaW5wdXQgdmFsdWUgaW4gdGhlIHNoYWRlci5cclxuXHQgKiBAcmV0dXJuIHtJbnB1dE5vZGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbm9kZS5cclxuXHQgKi9cclxuXHRzZXRQcmVjaXNpb24oIHByZWNpc2lvbiApIHtcclxuXHJcblx0XHR0aGlzLnByZWNpc2lvbiA9IHByZWNpc2lvbjtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHRzZXJpYWxpemUoIGRhdGEgKSB7XHJcblxyXG5cdFx0c3VwZXIuc2VyaWFsaXplKCBkYXRhICk7XHJcblxyXG5cdFx0ZGF0YS52YWx1ZSA9IHRoaXMudmFsdWU7XHJcblxyXG5cdFx0aWYgKCB0aGlzLnZhbHVlICYmIHRoaXMudmFsdWUudG9BcnJheSApIGRhdGEudmFsdWUgPSB0aGlzLnZhbHVlLnRvQXJyYXkoKTtcclxuXHJcblx0XHRkYXRhLnZhbHVlVHlwZSA9IGdldFZhbHVlVHlwZSggdGhpcy52YWx1ZSApO1xyXG5cdFx0ZGF0YS5ub2RlVHlwZSA9IHRoaXMubm9kZVR5cGU7XHJcblxyXG5cdFx0aWYgKCBkYXRhLnZhbHVlVHlwZSA9PT0gJ0FycmF5QnVmZmVyJyApIGRhdGEudmFsdWUgPSBhcnJheUJ1ZmZlclRvQmFzZTY0KCBkYXRhLnZhbHVlICk7XHJcblxyXG5cdFx0ZGF0YS5wcmVjaXNpb24gPSB0aGlzLnByZWNpc2lvbjtcclxuXHJcblx0fVxyXG5cclxuXHRkZXNlcmlhbGl6ZSggZGF0YSApIHtcclxuXHJcblx0XHRzdXBlci5kZXNlcmlhbGl6ZSggZGF0YSApO1xyXG5cclxuXHRcdHRoaXMubm9kZVR5cGUgPSBkYXRhLm5vZGVUeXBlO1xyXG5cdFx0dGhpcy52YWx1ZSA9IEFycmF5LmlzQXJyYXkoIGRhdGEudmFsdWUgKSA/IGdldFZhbHVlRnJvbVR5cGUoIGRhdGEudmFsdWVUeXBlLCAuLi5kYXRhLnZhbHVlICkgOiBkYXRhLnZhbHVlO1xyXG5cclxuXHRcdHRoaXMucHJlY2lzaW9uID0gZGF0YS5wcmVjaXNpb24gfHwgbnVsbDtcclxuXHJcblx0XHRpZiAoIHRoaXMudmFsdWUgJiYgdGhpcy52YWx1ZS5mcm9tQXJyYXkgKSB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5mcm9tQXJyYXkoIGRhdGEudmFsdWUgKTtcclxuXHJcblx0fVxyXG5cclxuXHRnZW5lcmF0ZSggLypidWlsZGVyLCBvdXRwdXQqLyApIHtcclxuXHJcblx0XHRjb25zb2xlLndhcm4oICdBYnN0cmFjdCBmdW5jdGlvbi4nICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IElucHV0Tm9kZTtcclxuIiwiaW1wb3J0IElucHV0Tm9kZSBmcm9tICcuL0lucHV0Tm9kZS5qcyc7XHJcblxyXG5jb25zdCBfcmVnTnVtID0gL2Zsb2F0fHU/aW50LztcclxuXHJcbi8qKlxyXG4gKiBDbGFzcyBmb3IgcmVwcmVzZW50aW5nIGEgY29uc3RhbnQgdmFsdWUgaW4gdGhlIHNoYWRlci5cclxuICpcclxuICogQGF1Z21lbnRzIElucHV0Tm9kZVxyXG4gKi9cclxuY2xhc3MgQ29uc3ROb2RlIGV4dGVuZHMgSW5wdXROb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnQ29uc3ROb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGlucHV0IG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBUaGUgdmFsdWUgb2YgdGhpcyBub2RlLiBVc3VhbGx5IGEgSlMgcHJpbWl0aXZlIG9yIHRocmVlLmpzIG9iamVjdCAodmVjdG9yLCBtYXRyaXgsIGNvbG9yKS5cclxuXHQgKiBAcGFyYW0gez9zdHJpbmd9IG5vZGVUeXBlIC0gVGhlIG5vZGUgdHlwZS4gSWYgbm8gZXhwbGljaXQgdHlwZSBpcyBkZWZpbmVkLCB0aGUgbm9kZSB0cmllcyB0byBkZXJpdmUgdGhlIHR5cGUgZnJvbSBpdHMgdmFsdWUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHZhbHVlLCBub2RlVHlwZSA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoIHZhbHVlLCBub2RlVHlwZSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0NvbnN0Tm9kZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2VuZXJhdGVzIHRoZSBzaGFkZXIgc3RyaW5nIG9mIHRoZSB2YWx1ZSB3aXRoIHRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgZ2VuZXJhdGVkIHZhbHVlIGFzIGEgc2hhZGVyIHN0cmluZy5cclxuXHQgKi9cclxuXHRnZW5lcmF0ZUNvbnN0KCBidWlsZGVyICkge1xyXG5cclxuXHRcdHJldHVybiBidWlsZGVyLmdlbmVyYXRlQ29uc3QoIHRoaXMuZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKSwgdGhpcy52YWx1ZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdGdlbmVyYXRlKCBidWlsZGVyLCBvdXRwdXQgKSB7XHJcblxyXG5cdFx0Y29uc3QgdHlwZSA9IHRoaXMuZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRpZiAoIF9yZWdOdW0udGVzdCggdHlwZSApICYmIF9yZWdOdW0udGVzdCggb3V0cHV0ICkgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gYnVpbGRlci5nZW5lcmF0ZUNvbnN0KCBvdXRwdXQsIHRoaXMudmFsdWUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGJ1aWxkZXIuZm9ybWF0KCB0aGlzLmdlbmVyYXRlQ29uc3QoIGJ1aWxkZXIgKSwgdHlwZSwgb3V0cHV0ICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IENvbnN0Tm9kZTtcclxuIiwiaW1wb3J0IE5vZGUgZnJvbSAnLi4vY29yZS9Ob2RlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBCYXNlIGNsYXNzIGZvciByZXByZXNlbnRpbmcgbWVtYmVyIGFjY2VzcyBvbiBhbiBvYmplY3QtbGlrZVxyXG4gKiBub2RlIGRhdGEgc3RydWN0dXJlcy5cclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVcclxuICovXHJcbmNsYXNzIE1lbWJlck5vZGUgZXh0ZW5kcyBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnTWVtYmVyTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhbiBhcnJheSBlbGVtZW50IG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBUaGUgYXJyYXktbGlrZSBub2RlLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSBuYW1lLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBub2RlLCBwcm9wZXJ0eSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGFycmF5LWxpa2Ugbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub2RlID0gbm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBwcm9wZXJ0eSBuYW1lLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzTWVtYmVyTm9kZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubm9kZS5nZXRNZW1iZXJUeXBlKCBidWlsZGVyLCB0aGlzLnByb3BlcnR5ICk7XHJcblxyXG5cdH1cclxuXHJcblx0Z2VuZXJhdGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgcHJvcGVydHlOYW1lID0gdGhpcy5ub2RlLmJ1aWxkKCBidWlsZGVyICk7XHJcblxyXG5cdFx0cmV0dXJuIHByb3BlcnR5TmFtZSArICcuJyArIHRoaXMucHJvcGVydHk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IE1lbWJlck5vZGU7XHJcbiIsImltcG9ydCBOb2RlIGZyb20gJy4uL2NvcmUvTm9kZS5qcyc7XHJcbmltcG9ydCBBcnJheUVsZW1lbnROb2RlIGZyb20gJy4uL3V0aWxzL0FycmF5RWxlbWVudE5vZGUuanMnO1xyXG5pbXBvcnQgQ29udmVydE5vZGUgZnJvbSAnLi4vdXRpbHMvQ29udmVydE5vZGUuanMnO1xyXG5pbXBvcnQgSm9pbk5vZGUgZnJvbSAnLi4vdXRpbHMvSm9pbk5vZGUuanMnO1xyXG5pbXBvcnQgU3BsaXROb2RlIGZyb20gJy4uL3V0aWxzL1NwbGl0Tm9kZS5qcyc7XHJcbmltcG9ydCBTZXROb2RlIGZyb20gJy4uL3V0aWxzL1NldE5vZGUuanMnO1xyXG5pbXBvcnQgRmxpcE5vZGUgZnJvbSAnLi4vdXRpbHMvRmxpcE5vZGUuanMnO1xyXG5pbXBvcnQgQ29uc3ROb2RlIGZyb20gJy4uL2NvcmUvQ29uc3ROb2RlLmpzJztcclxuaW1wb3J0IE1lbWJlck5vZGUgZnJvbSAnLi4vdXRpbHMvTWVtYmVyTm9kZS5qcyc7XHJcbmltcG9ydCB7IGdldFZhbHVlRnJvbVR5cGUsIGdldFZhbHVlVHlwZSB9IGZyb20gJy4uL2NvcmUvTm9kZVV0aWxzLmpzJztcclxuXHJcbmxldCBjdXJyZW50U3RhY2sgPSBudWxsO1xyXG5cclxuY29uc3QgTm9kZUVsZW1lbnRzID0gbmV3IE1hcCgpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZE1ldGhvZENoYWluaW5nKCBuYW1lLCBub2RlRWxlbWVudCApIHtcclxuXHJcblx0aWYgKCBOb2RlRWxlbWVudHMuaGFzKCBuYW1lICkgKSB7XHJcblxyXG5cdFx0Y29uc29sZS53YXJuKCBgVEhSRUUuVFNMOiBSZWRlZmluaXRpb24gb2YgbWV0aG9kIGNoYWluaW5nICckeyBuYW1lIH0nLmAgKTtcclxuXHRcdHJldHVybjtcclxuXHJcblx0fVxyXG5cclxuXHRpZiAoIHR5cGVvZiBub2RlRWxlbWVudCAhPT0gJ2Z1bmN0aW9uJyApIHRocm93IG5ldyBFcnJvciggYFRIUkVFLlRTTDogTm9kZSBlbGVtZW50ICR7IG5hbWUgfSBpcyBub3QgYSBmdW5jdGlvbmAgKTtcclxuXHJcblx0Tm9kZUVsZW1lbnRzLnNldCggbmFtZSwgbm9kZUVsZW1lbnQgKTtcclxuXHJcbn1cclxuXHJcbmNvbnN0IHBhcnNlU3dpenpsZSA9ICggcHJvcHMgKSA9PiBwcm9wcy5yZXBsYWNlKCAvcnxzL2csICd4JyApLnJlcGxhY2UoIC9nfHQvZywgJ3knICkucmVwbGFjZSggL2J8cC9nLCAneicgKS5yZXBsYWNlKCAvYXxxL2csICd3JyApO1xyXG5jb25zdCBwYXJzZVN3aXp6bGVBbmRTb3J0ID0gKCBwcm9wcyApID0+IHBhcnNlU3dpenpsZSggcHJvcHMgKS5zcGxpdCggJycgKS5zb3J0KCkuam9pbiggJycgKTtcclxuXHJcbmNvbnN0IHNoYWRlck5vZGVIYW5kbGVyID0ge1xyXG5cclxuXHRzZXR1cCggTm9kZUNsb3N1cmUsIHBhcmFtcyApIHtcclxuXHJcblx0XHRjb25zdCBpbnB1dHMgPSBwYXJhbXMuc2hpZnQoKTtcclxuXHJcblx0XHRyZXR1cm4gTm9kZUNsb3N1cmUoIG5vZGVPYmplY3RzKCBpbnB1dHMgKSwgLi4ucGFyYW1zICk7XHJcblxyXG5cdH0sXHJcblxyXG5cdGdldCggbm9kZSwgcHJvcCwgbm9kZU9iaiApIHtcclxuXHJcblx0XHRpZiAoIHR5cGVvZiBwcm9wID09PSAnc3RyaW5nJyAmJiBub2RlWyBwcm9wIF0gPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGlmICggbm9kZS5pc1N0YWNrTm9kZSAhPT0gdHJ1ZSAmJiBwcm9wID09PSAnYXNzaWduJyApIHtcclxuXHJcblx0XHRcdFx0cmV0dXJuICggLi4ucGFyYW1zICkgPT4ge1xyXG5cclxuXHRcdFx0XHRcdGN1cnJlbnRTdGFjay5hc3NpZ24oIG5vZGVPYmosIC4uLnBhcmFtcyApO1xyXG5cclxuXHRcdFx0XHRcdHJldHVybiBub2RlT2JqO1xyXG5cclxuXHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggTm9kZUVsZW1lbnRzLmhhcyggcHJvcCApICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBub2RlRWxlbWVudCA9IE5vZGVFbGVtZW50cy5nZXQoIHByb3AgKTtcclxuXHJcblx0XHRcdFx0cmV0dXJuIG5vZGUuaXNTdGFja05vZGUgPyAoIC4uLnBhcmFtcyApID0+IG5vZGVPYmouYWRkKCBub2RlRWxlbWVudCggLi4ucGFyYW1zICkgKSA6ICggLi4ucGFyYW1zICkgPT4gbm9kZUVsZW1lbnQoIG5vZGVPYmosIC4uLnBhcmFtcyApO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggcHJvcCA9PT0gJ3NlbGYnICkge1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gbm9kZTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIHByb3AuZW5kc1dpdGgoICdBc3NpZ24nICkgJiYgTm9kZUVsZW1lbnRzLmhhcyggcHJvcC5zbGljZSggMCwgcHJvcC5sZW5ndGggLSAnQXNzaWduJy5sZW5ndGggKSApICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBub2RlRWxlbWVudCA9IE5vZGVFbGVtZW50cy5nZXQoIHByb3Auc2xpY2UoIDAsIHByb3AubGVuZ3RoIC0gJ0Fzc2lnbicubGVuZ3RoICkgKTtcclxuXHJcblx0XHRcdFx0cmV0dXJuIG5vZGUuaXNTdGFja05vZGUgPyAoIC4uLnBhcmFtcyApID0+IG5vZGVPYmouYXNzaWduKCBwYXJhbXNbIDAgXSwgbm9kZUVsZW1lbnQoIC4uLnBhcmFtcyApICkgOiAoIC4uLnBhcmFtcyApID0+IG5vZGVPYmouYXNzaWduKCBub2RlRWxlbWVudCggbm9kZU9iaiwgLi4ucGFyYW1zICkgKTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIC9eW3h5endyZ2Jhc3RwcV17MSw0fSQvLnRlc3QoIHByb3AgKSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0Ly8gYWNjZXNzaW5nIHByb3BlcnRpZXMgKCBzd2l6emxlIClcclxuXHJcblx0XHRcdFx0cHJvcCA9IHBhcnNlU3dpenpsZSggcHJvcCApO1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gbm9kZU9iamVjdCggbmV3IFNwbGl0Tm9kZSggbm9kZU9iaiwgcHJvcCApICk7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCAvXnNldFtYWVpXUkdCQVNUUFFdezEsNH0kLy50ZXN0KCBwcm9wICkgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdC8vIHNldCBwcm9wZXJ0aWVzICggc3dpenpsZSApIGFuZCBzb3J0IHRvIHh5encgc2VxdWVuY2VcclxuXHJcblx0XHRcdFx0cHJvcCA9IHBhcnNlU3dpenpsZUFuZFNvcnQoIHByb3Auc2xpY2UoIDMgKS50b0xvd2VyQ2FzZSgpICk7XHJcblxyXG5cdFx0XHRcdHJldHVybiAoIHZhbHVlICkgPT4gbm9kZU9iamVjdCggbmV3IFNldE5vZGUoIG5vZGUsIHByb3AsIHZhbHVlICkgKTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIC9eZmxpcFtYWVpXUkdCQVNUUFFdezEsNH0kLy50ZXN0KCBwcm9wICkgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdC8vIHNldCBwcm9wZXJ0aWVzICggc3dpenpsZSApIGFuZCBzb3J0IHRvIHh5encgc2VxdWVuY2VcclxuXHJcblx0XHRcdFx0cHJvcCA9IHBhcnNlU3dpenpsZUFuZFNvcnQoIHByb3Auc2xpY2UoIDQgKS50b0xvd2VyQ2FzZSgpICk7XHJcblxyXG5cdFx0XHRcdHJldHVybiAoKSA9PiBub2RlT2JqZWN0KCBuZXcgRmxpcE5vZGUoIG5vZGVPYmplY3QoIG5vZGUgKSwgcHJvcCApICk7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBwcm9wID09PSAnd2lkdGgnIHx8IHByb3AgPT09ICdoZWlnaHQnIHx8IHByb3AgPT09ICdkZXB0aCcgKSB7XHJcblxyXG5cdFx0XHRcdC8vIGFjY2Vzc2luZyBwcm9wZXJ0eVxyXG5cclxuXHRcdFx0XHRpZiAoIHByb3AgPT09ICd3aWR0aCcgKSBwcm9wID0gJ3gnO1xyXG5cdFx0XHRcdGVsc2UgaWYgKCBwcm9wID09PSAnaGVpZ2h0JyApIHByb3AgPSAneSc7XHJcblx0XHRcdFx0ZWxzZSBpZiAoIHByb3AgPT09ICdkZXB0aCcgKSBwcm9wID0gJ3onO1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gbm9kZU9iamVjdCggbmV3IFNwbGl0Tm9kZSggbm9kZSwgcHJvcCApICk7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCAvXlxcZCskLy50ZXN0KCBwcm9wICkgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdC8vIGFjY2Vzc2luZyBhcnJheVxyXG5cclxuXHRcdFx0XHRyZXR1cm4gbm9kZU9iamVjdCggbmV3IEFycmF5RWxlbWVudE5vZGUoIG5vZGVPYmosIG5ldyBDb25zdE5vZGUoIE51bWJlciggcHJvcCApLCAndWludCcgKSApICk7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCAvXmdldCQvLnRlc3QoIHByb3AgKSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0Ly8gYWNjZXNzaW5nIHByb3BlcnRpZXNcclxuXHJcblx0XHRcdFx0cmV0dXJuICggdmFsdWUgKSA9PiBub2RlT2JqZWN0KCBuZXcgTWVtYmVyTm9kZSggbm9kZU9iaiwgdmFsdWUgKSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gUmVmbGVjdC5nZXQoIG5vZGUsIHByb3AsIG5vZGVPYmogKTtcclxuXHJcblx0fSxcclxuXHJcblx0c2V0KCBub2RlLCBwcm9wLCB2YWx1ZSwgbm9kZU9iaiApIHtcclxuXHJcblx0XHRpZiAoIHR5cGVvZiBwcm9wID09PSAnc3RyaW5nJyAmJiBub2RlWyBwcm9wIF0gPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdC8vIHNldHRpbmcgcHJvcGVydGllc1xyXG5cclxuXHRcdFx0aWYgKCAvXlt4eXp3cmdiYXN0cHFdezEsNH0kLy50ZXN0KCBwcm9wICkgPT09IHRydWUgfHwgcHJvcCA9PT0gJ3dpZHRoJyB8fCBwcm9wID09PSAnaGVpZ2h0JyB8fCBwcm9wID09PSAnZGVwdGgnIHx8IC9eXFxkKyQvLnRlc3QoIHByb3AgKSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0bm9kZU9ialsgcHJvcCBdLmFzc2lnbiggdmFsdWUgKTtcclxuXHJcblx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBSZWZsZWN0LnNldCggbm9kZSwgcHJvcCwgdmFsdWUsIG5vZGVPYmogKTtcclxuXHJcblx0fVxyXG5cclxufTtcclxuXHJcbmNvbnN0IG5vZGVPYmplY3RzQ2FjaGVNYXAgPSBuZXcgV2Vha01hcCgpO1xyXG5jb25zdCBub2RlQnVpbGRlckZ1bmN0aW9uc0NhY2hlTWFwID0gbmV3IFdlYWtNYXAoKTtcclxuXHJcbmNvbnN0IFNoYWRlck5vZGVPYmplY3QgPSBmdW5jdGlvbiAoIG9iaiwgYWx0VHlwZSA9IG51bGwgKSB7XHJcblxyXG5cdGNvbnN0IHR5cGUgPSBnZXRWYWx1ZVR5cGUoIG9iaiApO1xyXG5cclxuXHRpZiAoIHR5cGUgPT09ICdub2RlJyApIHtcclxuXHJcblx0XHRsZXQgbm9kZU9iamVjdCA9IG5vZGVPYmplY3RzQ2FjaGVNYXAuZ2V0KCBvYmogKTtcclxuXHJcblx0XHRpZiAoIG5vZGVPYmplY3QgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdG5vZGVPYmplY3QgPSBuZXcgUHJveHkoIG9iaiwgc2hhZGVyTm9kZUhhbmRsZXIgKTtcclxuXHJcblx0XHRcdG5vZGVPYmplY3RzQ2FjaGVNYXAuc2V0KCBvYmosIG5vZGVPYmplY3QgKTtcclxuXHRcdFx0bm9kZU9iamVjdHNDYWNoZU1hcC5zZXQoIG5vZGVPYmplY3QsIG5vZGVPYmplY3QgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG5vZGVPYmplY3Q7XHJcblxyXG5cdH0gZWxzZSBpZiAoICggYWx0VHlwZSA9PT0gbnVsbCAmJiAoIHR5cGUgPT09ICdmbG9hdCcgfHwgdHlwZSA9PT0gJ2Jvb2xlYW4nICkgKSB8fCAoIHR5cGUgJiYgdHlwZSAhPT0gJ3NoYWRlcicgJiYgdHlwZSAhPT0gJ3N0cmluZycgKSApIHtcclxuXHJcblx0XHRyZXR1cm4gbm9kZU9iamVjdCggZ2V0Q29uc3ROb2RlKCBvYmosIGFsdFR5cGUgKSApO1xyXG5cclxuXHR9IGVsc2UgaWYgKCB0eXBlID09PSAnc2hhZGVyJyApIHtcclxuXHJcblx0XHRyZXR1cm4gRm4oIG9iaiApO1xyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiBvYmo7XHJcblxyXG59O1xyXG5cclxuY29uc3QgU2hhZGVyTm9kZU9iamVjdHMgPSBmdW5jdGlvbiAoIG9iamVjdHMsIGFsdFR5cGUgPSBudWxsICkge1xyXG5cclxuXHRmb3IgKCBjb25zdCBuYW1lIGluIG9iamVjdHMgKSB7XHJcblxyXG5cdFx0b2JqZWN0c1sgbmFtZSBdID0gbm9kZU9iamVjdCggb2JqZWN0c1sgbmFtZSBdLCBhbHRUeXBlICk7XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIG9iamVjdHM7XHJcblxyXG59O1xyXG5cclxuY29uc3QgU2hhZGVyTm9kZUFycmF5ID0gZnVuY3Rpb24gKCBhcnJheSwgYWx0VHlwZSA9IG51bGwgKSB7XHJcblxyXG5cdGNvbnN0IGxlbiA9IGFycmF5Lmxlbmd0aDtcclxuXHJcblx0Zm9yICggbGV0IGkgPSAwOyBpIDwgbGVuOyBpICsrICkge1xyXG5cclxuXHRcdGFycmF5WyBpIF0gPSBub2RlT2JqZWN0KCBhcnJheVsgaSBdLCBhbHRUeXBlICk7XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIGFycmF5O1xyXG5cclxufTtcclxuXHJcbmNvbnN0IFNoYWRlck5vZGVQcm94eSA9IGZ1bmN0aW9uICggTm9kZUNsYXNzLCBzY29wZSA9IG51bGwsIGZhY3RvciA9IG51bGwsIHNldHRpbmdzID0gbnVsbCApIHtcclxuXHJcblx0Y29uc3QgYXNzaWduTm9kZSA9ICggbm9kZSApID0+IG5vZGVPYmplY3QoIHNldHRpbmdzICE9PSBudWxsID8gT2JqZWN0LmFzc2lnbiggbm9kZSwgc2V0dGluZ3MgKSA6IG5vZGUgKTtcclxuXHJcblx0bGV0IGZuLCBuYW1lID0gc2NvcGUsIG1pblBhcmFtcywgbWF4UGFyYW1zO1xyXG5cclxuXHRmdW5jdGlvbiB2ZXJpZnlQYXJhbXNMaW1pdCggcGFyYW1zICkge1xyXG5cclxuXHRcdGxldCB0c2xOYW1lO1xyXG5cclxuXHRcdGlmICggbmFtZSApIHRzbE5hbWUgPSAvW2Etel0vaS50ZXN0KCBuYW1lICkgPyBuYW1lICsgJygpJyA6IG5hbWU7XHJcblx0XHRlbHNlIHRzbE5hbWUgPSBOb2RlQ2xhc3MudHlwZTtcclxuXHJcblx0XHRpZiAoIG1pblBhcmFtcyAhPT0gdW5kZWZpbmVkICYmIHBhcmFtcy5sZW5ndGggPCBtaW5QYXJhbXMgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLmVycm9yKCBgVEhSRUUuVFNMOiBcIiR7IHRzbE5hbWUgfVwiIHBhcmFtZXRlciBsZW5ndGggaXMgbGVzcyB0aGFuIG1pbmltdW0gcmVxdWlyZWQuYCApO1xyXG5cclxuXHRcdFx0cmV0dXJuIHBhcmFtcy5jb25jYXQoIG5ldyBBcnJheSggbWluUGFyYW1zIC0gcGFyYW1zLmxlbmd0aCApLmZpbGwoIDAgKSApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIG1heFBhcmFtcyAhPT0gdW5kZWZpbmVkICYmIHBhcmFtcy5sZW5ndGggPiBtYXhQYXJhbXMgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLmVycm9yKCBgVEhSRUUuVFNMOiBcIiR7IHRzbE5hbWUgfVwiIHBhcmFtZXRlciBsZW5ndGggZXhjZWVkcyBsaW1pdC5gICk7XHJcblxyXG5cdFx0XHRyZXR1cm4gcGFyYW1zLnNsaWNlKCAwLCBtYXhQYXJhbXMgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHBhcmFtcztcclxuXHJcblx0fVxyXG5cclxuXHRpZiAoIHNjb3BlID09PSBudWxsICkge1xyXG5cclxuXHRcdGZuID0gKCAuLi5wYXJhbXMgKSA9PiB7XHJcblxyXG5cdFx0XHRyZXR1cm4gYXNzaWduTm9kZSggbmV3IE5vZGVDbGFzcyggLi4ubm9kZUFycmF5KCB2ZXJpZnlQYXJhbXNMaW1pdCggcGFyYW1zICkgKSApICk7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0fSBlbHNlIGlmICggZmFjdG9yICE9PSBudWxsICkge1xyXG5cclxuXHRcdGZhY3RvciA9IG5vZGVPYmplY3QoIGZhY3RvciApO1xyXG5cclxuXHRcdGZuID0gKCAuLi5wYXJhbXMgKSA9PiB7XHJcblxyXG5cdFx0XHRyZXR1cm4gYXNzaWduTm9kZSggbmV3IE5vZGVDbGFzcyggc2NvcGUsIC4uLm5vZGVBcnJheSggdmVyaWZ5UGFyYW1zTGltaXQoIHBhcmFtcyApICksIGZhY3RvciApICk7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0fSBlbHNlIHtcclxuXHJcblx0XHRmbiA9ICggLi4ucGFyYW1zICkgPT4ge1xyXG5cclxuXHRcdFx0cmV0dXJuIGFzc2lnbk5vZGUoIG5ldyBOb2RlQ2xhc3MoIHNjb3BlLCAuLi5ub2RlQXJyYXkoIHZlcmlmeVBhcmFtc0xpbWl0KCBwYXJhbXMgKSApICkgKTtcclxuXHJcblx0XHR9O1xyXG5cclxuXHR9XHJcblxyXG5cdGZuLnNldFBhcmFtZXRlckxlbmd0aCA9ICggLi4ucGFyYW1zICkgPT4ge1xyXG5cclxuXHRcdGlmICggcGFyYW1zLmxlbmd0aCA9PT0gMSApIG1pblBhcmFtcyA9IG1heFBhcmFtcyA9IHBhcmFtc1sgMCBdO1xyXG5cdFx0ZWxzZSBpZiAoIHBhcmFtcy5sZW5ndGggPT09IDIgKSBbIG1pblBhcmFtcywgbWF4UGFyYW1zIF0gPSBwYXJhbXM7XHJcblxyXG5cdFx0cmV0dXJuIGZuO1xyXG5cclxuXHR9O1xyXG5cclxuXHRmbi5zZXROYW1lID0gKCB2YWx1ZSApID0+IHtcclxuXHJcblx0XHRuYW1lID0gdmFsdWU7XHJcblxyXG5cdFx0cmV0dXJuIGZuO1xyXG5cclxuXHR9O1xyXG5cclxuXHRyZXR1cm4gZm47XHJcblxyXG59O1xyXG5cclxuY29uc3QgU2hhZGVyTm9kZUltbXV0YWJsZSA9IGZ1bmN0aW9uICggTm9kZUNsYXNzLCAuLi5wYXJhbXMgKSB7XHJcblxyXG5cdHJldHVybiBub2RlT2JqZWN0KCBuZXcgTm9kZUNsYXNzKCAuLi5ub2RlQXJyYXkoIHBhcmFtcyApICkgKTtcclxuXHJcbn07XHJcblxyXG5jbGFzcyBTaGFkZXJDYWxsTm9kZUludGVybmFsIGV4dGVuZHMgTm9kZSB7XHJcblxyXG5cdGNvbnN0cnVjdG9yKCBzaGFkZXJOb2RlLCBpbnB1dE5vZGVzICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0dGhpcy5zaGFkZXJOb2RlID0gc2hhZGVyTm9kZTtcclxuXHRcdHRoaXMuaW5wdXROb2RlcyA9IGlucHV0Tm9kZXM7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuc2hhZGVyTm9kZS5ub2RlVHlwZSB8fCB0aGlzLmdldE91dHB1dE5vZGUoIGJ1aWxkZXIgKS5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdGdldE1lbWJlclR5cGUoIGJ1aWxkZXIsIG5hbWUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZ2V0T3V0cHV0Tm9kZSggYnVpbGRlciApLmdldE1lbWJlclR5cGUoIGJ1aWxkZXIsIG5hbWUgKTtcclxuXHJcblx0fVxyXG5cclxuXHRjYWxsKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IHsgc2hhZGVyTm9kZSwgaW5wdXROb2RlcyB9ID0gdGhpcztcclxuXHJcblx0XHRjb25zdCBwcm9wZXJ0aWVzID0gYnVpbGRlci5nZXROb2RlUHJvcGVydGllcyggc2hhZGVyTm9kZSApO1xyXG5cdFx0aWYgKCBwcm9wZXJ0aWVzLm9uY2VPdXRwdXQgKSByZXR1cm4gcHJvcGVydGllcy5vbmNlT3V0cHV0O1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0bGV0IHJlc3VsdCA9IG51bGw7XHJcblxyXG5cdFx0aWYgKCBzaGFkZXJOb2RlLmxheW91dCApIHtcclxuXHJcblx0XHRcdGxldCBmdW5jdGlvbk5vZGVzQ2FjaGVNYXAgPSBub2RlQnVpbGRlckZ1bmN0aW9uc0NhY2hlTWFwLmdldCggYnVpbGRlci5jb25zdHJ1Y3RvciApO1xyXG5cclxuXHRcdFx0aWYgKCBmdW5jdGlvbk5vZGVzQ2FjaGVNYXAgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0ZnVuY3Rpb25Ob2Rlc0NhY2hlTWFwID0gbmV3IFdlYWtNYXAoKTtcclxuXHJcblx0XHRcdFx0bm9kZUJ1aWxkZXJGdW5jdGlvbnNDYWNoZU1hcC5zZXQoIGJ1aWxkZXIuY29uc3RydWN0b3IsIGZ1bmN0aW9uTm9kZXNDYWNoZU1hcCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0bGV0IGZ1bmN0aW9uTm9kZSA9IGZ1bmN0aW9uTm9kZXNDYWNoZU1hcC5nZXQoIHNoYWRlck5vZGUgKTtcclxuXHJcblx0XHRcdGlmICggZnVuY3Rpb25Ob2RlID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGZ1bmN0aW9uTm9kZSA9IG5vZGVPYmplY3QoIGJ1aWxkZXIuYnVpbGRGdW5jdGlvbk5vZGUoIHNoYWRlck5vZGUgKSApO1xyXG5cclxuXHRcdFx0XHRmdW5jdGlvbk5vZGVzQ2FjaGVNYXAuc2V0KCBzaGFkZXJOb2RlLCBmdW5jdGlvbk5vZGUgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGJ1aWxkZXIuYWRkSW5jbHVkZSggZnVuY3Rpb25Ob2RlICk7XHJcblxyXG5cdFx0XHRyZXN1bHQgPSBub2RlT2JqZWN0KCBmdW5jdGlvbk5vZGUuY2FsbCggaW5wdXROb2RlcyApICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGNvbnN0IGpzRnVuYyA9IHNoYWRlck5vZGUuanNGdW5jO1xyXG5cdFx0XHRjb25zdCBvdXRwdXROb2RlID0gaW5wdXROb2RlcyAhPT0gbnVsbCB8fCBqc0Z1bmMubGVuZ3RoID4gMSA/IGpzRnVuYyggaW5wdXROb2RlcyB8fCBbXSwgYnVpbGRlciApIDoganNGdW5jKCBidWlsZGVyICk7XHJcblxyXG5cdFx0XHRyZXN1bHQgPSBub2RlT2JqZWN0KCBvdXRwdXROb2RlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggc2hhZGVyTm9kZS5vbmNlICkge1xyXG5cclxuXHRcdFx0cHJvcGVydGllcy5vbmNlT3V0cHV0ID0gcmVzdWx0O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cclxuXHR9XHJcblxyXG5cdGdldE91dHB1dE5vZGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgcHJvcGVydGllcyA9IGJ1aWxkZXIuZ2V0Tm9kZVByb3BlcnRpZXMoIHRoaXMgKTtcclxuXHJcblx0XHRpZiAoIHByb3BlcnRpZXMub3V0cHV0Tm9kZSA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHByb3BlcnRpZXMub3V0cHV0Tm9kZSA9IHRoaXMuc2V0dXBPdXRwdXQoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHByb3BlcnRpZXMub3V0cHV0Tm9kZTtcclxuXHJcblx0fVxyXG5cclxuXHRzZXR1cCggYnVpbGRlciApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5nZXRPdXRwdXROb2RlKCBidWlsZGVyICk7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXBPdXRwdXQoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0YnVpbGRlci5hZGRTdGFjaygpO1xyXG5cclxuXHRcdGJ1aWxkZXIuc3RhY2sub3V0cHV0Tm9kZSA9IHRoaXMuY2FsbCggYnVpbGRlciApO1xyXG5cclxuXHRcdHJldHVybiBidWlsZGVyLnJlbW92ZVN0YWNrKCk7XHJcblxyXG5cdH1cclxuXHJcblx0Z2VuZXJhdGUoIGJ1aWxkZXIsIG91dHB1dCApIHtcclxuXHJcblx0XHRjb25zdCBvdXRwdXROb2RlID0gdGhpcy5nZXRPdXRwdXROb2RlKCBidWlsZGVyICk7XHJcblxyXG5cdFx0cmV0dXJuIG91dHB1dE5vZGUuYnVpbGQoIGJ1aWxkZXIsIG91dHB1dCApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5jbGFzcyBTaGFkZXJOb2RlSW50ZXJuYWwgZXh0ZW5kcyBOb2RlIHtcclxuXHJcblx0Y29uc3RydWN0b3IoIGpzRnVuYywgbm9kZVR5cGUgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5vZGVUeXBlICk7XHJcblxyXG5cdFx0dGhpcy5qc0Z1bmMgPSBqc0Z1bmM7XHJcblx0XHR0aGlzLmxheW91dCA9IG51bGw7XHJcblxyXG5cdFx0dGhpcy5nbG9iYWwgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMub25jZSA9IGZhbHNlO1xyXG5cclxuXHR9XHJcblxyXG5cdHNldExheW91dCggbGF5b3V0ICkge1xyXG5cclxuXHRcdHRoaXMubGF5b3V0ID0gbGF5b3V0O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdGNhbGwoIGlucHV0cyA9IG51bGwgKSB7XHJcblxyXG5cdFx0bm9kZU9iamVjdHMoIGlucHV0cyApO1xyXG5cclxuXHRcdHJldHVybiBub2RlT2JqZWN0KCBuZXcgU2hhZGVyQ2FsbE5vZGVJbnRlcm5hbCggdGhpcywgaW5wdXRzICkgKTtcclxuXHJcblx0fVxyXG5cclxuXHRzZXR1cCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5jYWxsKCk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmNvbnN0IGJvb2xzID0gWyBmYWxzZSwgdHJ1ZSBdO1xyXG5jb25zdCB1aW50cyA9IFsgMCwgMSwgMiwgMyBdO1xyXG5jb25zdCBpbnRzID0gWyAtIDEsIC0gMiBdO1xyXG5jb25zdCBmbG9hdHMgPSBbIDAuNSwgMS41LCAxIC8gMywgMWUtNiwgMWU2LCBNYXRoLlBJLCBNYXRoLlBJICogMiwgMSAvIE1hdGguUEksIDIgLyBNYXRoLlBJLCAxIC8gKCBNYXRoLlBJICogMiApLCBNYXRoLlBJIC8gMiBdO1xyXG5cclxuY29uc3QgYm9vbHNDYWNoZU1hcCA9IG5ldyBNYXAoKTtcclxuZm9yICggY29uc3QgYm9vbCBvZiBib29scyApIGJvb2xzQ2FjaGVNYXAuc2V0KCBib29sLCBuZXcgQ29uc3ROb2RlKCBib29sICkgKTtcclxuXHJcbmNvbnN0IHVpbnRzQ2FjaGVNYXAgPSBuZXcgTWFwKCk7XHJcbmZvciAoIGNvbnN0IHVpbnQgb2YgdWludHMgKSB1aW50c0NhY2hlTWFwLnNldCggdWludCwgbmV3IENvbnN0Tm9kZSggdWludCwgJ3VpbnQnICkgKTtcclxuXHJcbmNvbnN0IGludHNDYWNoZU1hcCA9IG5ldyBNYXAoIFsgLi4udWludHNDYWNoZU1hcCBdLm1hcCggZWwgPT4gbmV3IENvbnN0Tm9kZSggZWwudmFsdWUsICdpbnQnICkgKSApO1xyXG5mb3IgKCBjb25zdCBpbnQgb2YgaW50cyApIGludHNDYWNoZU1hcC5zZXQoIGludCwgbmV3IENvbnN0Tm9kZSggaW50LCAnaW50JyApICk7XHJcblxyXG5jb25zdCBmbG9hdHNDYWNoZU1hcCA9IG5ldyBNYXAoIFsgLi4uaW50c0NhY2hlTWFwIF0ubWFwKCBlbCA9PiBuZXcgQ29uc3ROb2RlKCBlbC52YWx1ZSApICkgKTtcclxuZm9yICggY29uc3QgZmxvYXQgb2YgZmxvYXRzICkgZmxvYXRzQ2FjaGVNYXAuc2V0KCBmbG9hdCwgbmV3IENvbnN0Tm9kZSggZmxvYXQgKSApO1xyXG5mb3IgKCBjb25zdCBmbG9hdCBvZiBmbG9hdHMgKSBmbG9hdHNDYWNoZU1hcC5zZXQoIC0gZmxvYXQsIG5ldyBDb25zdE5vZGUoIC0gZmxvYXQgKSApO1xyXG5cclxuY29uc3QgY2FjaGVNYXBzID0geyBib29sOiBib29sc0NhY2hlTWFwLCB1aW50OiB1aW50c0NhY2hlTWFwLCBpbnRzOiBpbnRzQ2FjaGVNYXAsIGZsb2F0OiBmbG9hdHNDYWNoZU1hcCB9O1xyXG5cclxuY29uc3QgY29uc3ROb2Rlc0NhY2hlTWFwID0gbmV3IE1hcCggWyAuLi5ib29sc0NhY2hlTWFwLCAuLi5mbG9hdHNDYWNoZU1hcCBdICk7XHJcblxyXG5jb25zdCBnZXRDb25zdE5vZGUgPSAoIHZhbHVlLCB0eXBlICkgPT4ge1xyXG5cclxuXHRpZiAoIGNvbnN0Tm9kZXNDYWNoZU1hcC5oYXMoIHZhbHVlICkgKSB7XHJcblxyXG5cdFx0cmV0dXJuIGNvbnN0Tm9kZXNDYWNoZU1hcC5nZXQoIHZhbHVlICk7XHJcblxyXG5cdH0gZWxzZSBpZiAoIHZhbHVlLmlzTm9kZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRyZXR1cm4gdmFsdWU7XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBDb25zdE5vZGUoIHZhbHVlLCB0eXBlICk7XHJcblxyXG5cdH1cclxuXHJcbn07XHJcblxyXG5jb25zdCBzYWZlR2V0Tm9kZVR5cGUgPSAoIG5vZGUgKSA9PiB7XHJcblxyXG5cdHRyeSB7XHJcblxyXG5cdFx0cmV0dXJuIG5vZGUuZ2V0Tm9kZVR5cGUoKTtcclxuXHJcblx0fSBjYXRjaCAoIF8gKSB7XHJcblxyXG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcclxuXHJcblx0fVxyXG5cclxufTtcclxuXHJcbmNvbnN0IENvbnZlcnRUeXBlID0gZnVuY3Rpb24gKCB0eXBlLCBjYWNoZU1hcCA9IG51bGwgKSB7XHJcblxyXG5cdHJldHVybiAoIC4uLnBhcmFtcyApID0+IHtcclxuXHJcblx0XHRpZiAoIHBhcmFtcy5sZW5ndGggPT09IDAgfHwgKCAhIFsgJ2Jvb2wnLCAnZmxvYXQnLCAnaW50JywgJ3VpbnQnIF0uaW5jbHVkZXMoIHR5cGUgKSAmJiBwYXJhbXMuZXZlcnkoIHBhcmFtID0+IHR5cGVvZiBwYXJhbSAhPT0gJ29iamVjdCcgKSApICkge1xyXG5cclxuXHRcdFx0cGFyYW1zID0gWyBnZXRWYWx1ZUZyb21UeXBlKCB0eXBlLCAuLi5wYXJhbXMgKSBdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHBhcmFtcy5sZW5ndGggPT09IDEgJiYgY2FjaGVNYXAgIT09IG51bGwgJiYgY2FjaGVNYXAuaGFzKCBwYXJhbXNbIDAgXSApICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIG5vZGVPYmplY3QoIGNhY2hlTWFwLmdldCggcGFyYW1zWyAwIF0gKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHBhcmFtcy5sZW5ndGggPT09IDEgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBub2RlID0gZ2V0Q29uc3ROb2RlKCBwYXJhbXNbIDAgXSwgdHlwZSApO1xyXG5cdFx0XHRpZiAoIHNhZmVHZXROb2RlVHlwZSggbm9kZSApID09PSB0eXBlICkgcmV0dXJuIG5vZGVPYmplY3QoIG5vZGUgKTtcclxuXHRcdFx0cmV0dXJuIG5vZGVPYmplY3QoIG5ldyBDb252ZXJ0Tm9kZSggbm9kZSwgdHlwZSApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IG5vZGVzID0gcGFyYW1zLm1hcCggcGFyYW0gPT4gZ2V0Q29uc3ROb2RlKCBwYXJhbSApICk7XHJcblx0XHRyZXR1cm4gbm9kZU9iamVjdCggbmV3IEpvaW5Ob2RlKCBub2RlcywgdHlwZSApICk7XHJcblxyXG5cdH07XHJcblxyXG59O1xyXG5cclxuLy8gZXhwb3J0c1xyXG5cclxuZXhwb3J0IGNvbnN0IGRlZmluZWQgPSAoIHYgKSA9PiB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPT0gbnVsbCA/IHYudmFsdWUgOiB2OyAvLyBUT0RPOiByZW1vdmUgYm9vbGVhbiBjb252ZXJzaW9uIGFuZCBkZWZpbmVkIGZ1bmN0aW9uXHJcblxyXG4vLyB1dGlsc1xyXG5cclxuZXhwb3J0IGNvbnN0IGdldENvbnN0Tm9kZVR5cGUgPSAoIHZhbHVlICkgPT4gKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsICkgPyAoIHZhbHVlLm5vZGVUeXBlIHx8IHZhbHVlLmNvbnZlcnRUbyB8fCAoIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6IG51bGwgKSApIDogbnVsbDtcclxuXHJcbi8vIHNoYWRlciBub2RlIGJhc2VcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBTaGFkZXJOb2RlKCBqc0Z1bmMsIG5vZGVUeXBlICkge1xyXG5cclxuXHRyZXR1cm4gbmV3IFByb3h5KCBuZXcgU2hhZGVyTm9kZUludGVybmFsKCBqc0Z1bmMsIG5vZGVUeXBlICksIHNoYWRlck5vZGVIYW5kbGVyICk7XHJcblxyXG59XHJcblxyXG5leHBvcnQgY29uc3Qgbm9kZU9iamVjdCA9ICggdmFsLCBhbHRUeXBlID0gbnVsbCApID0+IC8qIG5ldyAqLyBTaGFkZXJOb2RlT2JqZWN0KCB2YWwsIGFsdFR5cGUgKTtcclxuZXhwb3J0IGNvbnN0IG5vZGVPYmplY3RzID0gKCB2YWwsIGFsdFR5cGUgPSBudWxsICkgPT4gbmV3IFNoYWRlck5vZGVPYmplY3RzKCB2YWwsIGFsdFR5cGUgKTtcclxuZXhwb3J0IGNvbnN0IG5vZGVBcnJheSA9ICggdmFsLCBhbHRUeXBlID0gbnVsbCApID0+IG5ldyBTaGFkZXJOb2RlQXJyYXkoIHZhbCwgYWx0VHlwZSApO1xyXG5leHBvcnQgY29uc3Qgbm9kZVByb3h5ID0gKCAuLi5wYXJhbXMgKSA9PiBuZXcgU2hhZGVyTm9kZVByb3h5KCAuLi5wYXJhbXMgKTtcclxuZXhwb3J0IGNvbnN0IG5vZGVJbW11dGFibGUgPSAoIC4uLnBhcmFtcyApID0+IG5ldyBTaGFkZXJOb2RlSW1tdXRhYmxlKCAuLi5wYXJhbXMgKTtcclxuXHJcbmxldCBmbklkID0gMDtcclxuXHJcbmV4cG9ydCBjb25zdCBGbiA9ICgganNGdW5jLCBsYXlvdXQgPSBudWxsICkgPT4ge1xyXG5cclxuXHRsZXQgbm9kZVR5cGUgPSBudWxsO1xyXG5cclxuXHRpZiAoIGxheW91dCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRpZiAoIHR5cGVvZiBsYXlvdXQgPT09ICdvYmplY3QnICkge1xyXG5cclxuXHRcdFx0bm9kZVR5cGUgPSBsYXlvdXQucmV0dXJuO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRpZiAoIHR5cGVvZiBsYXlvdXQgPT09ICdzdHJpbmcnICkge1xyXG5cclxuXHRcdFx0XHRub2RlVHlwZSA9IGxheW91dDtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5UU0w6IEludmFsaWQgbGF5b3V0IHR5cGUuJyApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0bGF5b3V0ID0gbnVsbDtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0Y29uc3Qgc2hhZGVyTm9kZSA9IG5ldyBTaGFkZXJOb2RlKCBqc0Z1bmMsIG5vZGVUeXBlICk7XHJcblxyXG5cdGNvbnN0IGZuID0gKCAuLi5wYXJhbXMgKSA9PiB7XHJcblxyXG5cdFx0bGV0IGlucHV0cztcclxuXHJcblx0XHRub2RlT2JqZWN0cyggcGFyYW1zICk7XHJcblxyXG5cdFx0aWYgKCBwYXJhbXNbIDAgXSAmJiBwYXJhbXNbIDAgXS5pc05vZGUgKSB7XHJcblxyXG5cdFx0XHRpbnB1dHMgPSBbIC4uLnBhcmFtcyBdO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRpbnB1dHMgPSBwYXJhbXNbIDAgXTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHNoYWRlck5vZGUuY2FsbCggaW5wdXRzICk7XHJcblxyXG5cdH07XHJcblxyXG5cdGZuLnNoYWRlck5vZGUgPSBzaGFkZXJOb2RlO1xyXG5cclxuXHRmbi5zZXRMYXlvdXQgPSAoIGxheW91dCApID0+IHtcclxuXHJcblx0XHRzaGFkZXJOb2RlLnNldExheW91dCggbGF5b3V0ICk7XHJcblxyXG5cdFx0cmV0dXJuIGZuO1xyXG5cclxuXHR9O1xyXG5cclxuXHRmbi5vbmNlID0gKCkgPT4ge1xyXG5cclxuXHRcdHNoYWRlck5vZGUub25jZSA9IHRydWU7XHJcblxyXG5cdFx0cmV0dXJuIGZuO1xyXG5cclxuXHR9O1xyXG5cclxuXHRpZiAoIGxheW91dCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRpZiAoIHR5cGVvZiBsYXlvdXQuaW5wdXRzICE9PSAnb2JqZWN0JyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGZ1bGxMYXlvdXQgPSB7XHJcblx0XHRcdFx0bmFtZTogJ2ZuJyArIGZuSWQgKyssXHJcblx0XHRcdFx0dHlwZTogbm9kZVR5cGUsXHJcblx0XHRcdFx0aW5wdXRzOiBbXVxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0Zm9yICggY29uc3QgbmFtZSBpbiBsYXlvdXQgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggbmFtZSA9PT0gJ3JldHVybicgKSBjb250aW51ZTtcclxuXHJcblx0XHRcdFx0ZnVsbExheW91dC5pbnB1dHMucHVzaCgge1xyXG5cdFx0XHRcdFx0bmFtZTogbmFtZSxcclxuXHRcdFx0XHRcdHR5cGU6IGxheW91dFsgbmFtZSBdXHJcblx0XHRcdFx0fSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0bGF5b3V0ID0gZnVsbExheW91dDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Zm4uc2V0TGF5b3V0KCBsYXlvdXQgKTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gZm47XHJcblxyXG59O1xyXG5cclxuLyoqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBkZXByZWNhdGVkIHNpbmNlIHIxNjguIFVzZSB7QGxpbmsgRm59IGluc3RlYWQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7Li4uYW55fSBwYXJhbXNcclxuICogQHJldHVybnMge0Z1bmN0aW9ufVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHRzbEZuID0gKCAuLi5wYXJhbXMgKSA9PiB7IC8vIEBkZXByZWNhdGVkLCByMTY4XHJcblxyXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlRTTDogdHNsRm4oKSBoYXMgYmVlbiByZW5hbWVkIHRvIEZuKCkuJyApO1xyXG5cdHJldHVybiBGbiggLi4ucGFyYW1zICk7XHJcblxyXG59O1xyXG5cclxuLy9cclxuXHJcbmFkZE1ldGhvZENoYWluaW5nKCAndG9HbG9iYWwnLCAoIG5vZGUgKSA9PiB7XHJcblxyXG5cdG5vZGUuZ2xvYmFsID0gdHJ1ZTtcclxuXHJcblx0cmV0dXJuIG5vZGU7XHJcblxyXG59ICk7XHJcblxyXG4vL1xyXG5cclxuZXhwb3J0IGNvbnN0IHNldEN1cnJlbnRTdGFjayA9ICggc3RhY2sgKSA9PiB7XHJcblxyXG5cdGlmICggY3VycmVudFN0YWNrID09PSBzdGFjayApIHtcclxuXHJcblx0XHQvL3Rocm93IG5ldyBFcnJvciggJ1N0YWNrIGFscmVhZHkgZGVmaW5lZC4nICk7XHJcblxyXG5cdH1cclxuXHJcblx0Y3VycmVudFN0YWNrID0gc3RhY2s7XHJcblxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGdldEN1cnJlbnRTdGFjayA9ICgpID0+IGN1cnJlbnRTdGFjaztcclxuXHJcbmV4cG9ydCBjb25zdCBJZiA9ICggLi4ucGFyYW1zICkgPT4gY3VycmVudFN0YWNrLklmKCAuLi5wYXJhbXMgKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhcHBlbmQoIG5vZGUgKSB7XHJcblxyXG5cdGlmICggY3VycmVudFN0YWNrICkgY3VycmVudFN0YWNrLmFkZCggbm9kZSApO1xyXG5cclxuXHRyZXR1cm4gbm9kZTtcclxuXHJcbn1cclxuXHJcbmFkZE1ldGhvZENoYWluaW5nKCAnYXBwZW5kJywgYXBwZW5kICk7XHJcblxyXG4vLyB0eXBlc1xyXG5cclxuZXhwb3J0IGNvbnN0IGNvbG9yID0gbmV3IENvbnZlcnRUeXBlKCAnY29sb3InICk7XHJcblxyXG5leHBvcnQgY29uc3QgZmxvYXQgPSBuZXcgQ29udmVydFR5cGUoICdmbG9hdCcsIGNhY2hlTWFwcy5mbG9hdCApO1xyXG5leHBvcnQgY29uc3QgaW50ID0gbmV3IENvbnZlcnRUeXBlKCAnaW50JywgY2FjaGVNYXBzLmludHMgKTtcclxuZXhwb3J0IGNvbnN0IHVpbnQgPSBuZXcgQ29udmVydFR5cGUoICd1aW50JywgY2FjaGVNYXBzLnVpbnQgKTtcclxuZXhwb3J0IGNvbnN0IGJvb2wgPSBuZXcgQ29udmVydFR5cGUoICdib29sJywgY2FjaGVNYXBzLmJvb2wgKTtcclxuXHJcbmV4cG9ydCBjb25zdCB2ZWMyID0gbmV3IENvbnZlcnRUeXBlKCAndmVjMicgKTtcclxuZXhwb3J0IGNvbnN0IGl2ZWMyID0gbmV3IENvbnZlcnRUeXBlKCAnaXZlYzInICk7XHJcbmV4cG9ydCBjb25zdCB1dmVjMiA9IG5ldyBDb252ZXJ0VHlwZSggJ3V2ZWMyJyApO1xyXG5leHBvcnQgY29uc3QgYnZlYzIgPSBuZXcgQ29udmVydFR5cGUoICdidmVjMicgKTtcclxuXHJcbmV4cG9ydCBjb25zdCB2ZWMzID0gbmV3IENvbnZlcnRUeXBlKCAndmVjMycgKTtcclxuZXhwb3J0IGNvbnN0IGl2ZWMzID0gbmV3IENvbnZlcnRUeXBlKCAnaXZlYzMnICk7XHJcbmV4cG9ydCBjb25zdCB1dmVjMyA9IG5ldyBDb252ZXJ0VHlwZSggJ3V2ZWMzJyApO1xyXG5leHBvcnQgY29uc3QgYnZlYzMgPSBuZXcgQ29udmVydFR5cGUoICdidmVjMycgKTtcclxuXHJcbmV4cG9ydCBjb25zdCB2ZWM0ID0gbmV3IENvbnZlcnRUeXBlKCAndmVjNCcgKTtcclxuZXhwb3J0IGNvbnN0IGl2ZWM0ID0gbmV3IENvbnZlcnRUeXBlKCAnaXZlYzQnICk7XHJcbmV4cG9ydCBjb25zdCB1dmVjNCA9IG5ldyBDb252ZXJ0VHlwZSggJ3V2ZWM0JyApO1xyXG5leHBvcnQgY29uc3QgYnZlYzQgPSBuZXcgQ29udmVydFR5cGUoICdidmVjNCcgKTtcclxuXHJcbmV4cG9ydCBjb25zdCBtYXQyID0gbmV3IENvbnZlcnRUeXBlKCAnbWF0MicgKTtcclxuZXhwb3J0IGNvbnN0IG1hdDMgPSBuZXcgQ29udmVydFR5cGUoICdtYXQzJyApO1xyXG5leHBvcnQgY29uc3QgbWF0NCA9IG5ldyBDb252ZXJ0VHlwZSggJ21hdDQnICk7XHJcblxyXG5leHBvcnQgY29uc3Qgc3RyaW5nID0gKCB2YWx1ZSA9ICcnICkgPT4gbm9kZU9iamVjdCggbmV3IENvbnN0Tm9kZSggdmFsdWUsICdzdHJpbmcnICkgKTtcclxuZXhwb3J0IGNvbnN0IGFycmF5QnVmZmVyID0gKCB2YWx1ZSApID0+IG5vZGVPYmplY3QoIG5ldyBDb25zdE5vZGUoIHZhbHVlLCAnQXJyYXlCdWZmZXInICkgKTtcclxuXHJcbmFkZE1ldGhvZENoYWluaW5nKCAndG9Db2xvcicsIGNvbG9yICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAndG9GbG9hdCcsIGZsb2F0ICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAndG9JbnQnLCBpbnQgKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICd0b1VpbnQnLCB1aW50ICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAndG9Cb29sJywgYm9vbCApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ3RvVmVjMicsIHZlYzIgKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICd0b0lWZWMyJywgaXZlYzIgKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICd0b1VWZWMyJywgdXZlYzIgKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICd0b0JWZWMyJywgYnZlYzIgKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICd0b1ZlYzMnLCB2ZWMzICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAndG9JVmVjMycsIGl2ZWMzICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAndG9VVmVjMycsIHV2ZWMzICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAndG9CVmVjMycsIGJ2ZWMzICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAndG9WZWM0JywgdmVjNCApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ3RvSVZlYzQnLCBpdmVjNCApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ3RvVVZlYzQnLCB1dmVjNCApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ3RvQlZlYzQnLCBidmVjNCApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ3RvTWF0MicsIG1hdDIgKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICd0b01hdDMnLCBtYXQzICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAndG9NYXQ0JywgbWF0NCApO1xyXG5cclxuLy8gYmFzaWMgbm9kZXNcclxuXHJcbmV4cG9ydCBjb25zdCBlbGVtZW50ID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIEFycmF5RWxlbWVudE5vZGUgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDIgKTtcclxuZXhwb3J0IGNvbnN0IGNvbnZlcnQgPSAoIG5vZGUsIHR5cGVzICkgPT4gbm9kZU9iamVjdCggbmV3IENvbnZlcnROb2RlKCBub2RlT2JqZWN0KCBub2RlICksIHR5cGVzICkgKTtcclxuZXhwb3J0IGNvbnN0IHNwbGl0ID0gKCBub2RlLCBjaGFubmVscyApID0+IG5vZGVPYmplY3QoIG5ldyBTcGxpdE5vZGUoIG5vZGVPYmplY3QoIG5vZGUgKSwgY2hhbm5lbHMgKSApO1xyXG5cclxuYWRkTWV0aG9kQ2hhaW5pbmcoICdlbGVtZW50JywgZWxlbWVudCApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ2NvbnZlcnQnLCBjb252ZXJ0ICk7XHJcbiIsImltcG9ydCBUZW1wTm9kZSBmcm9tICcuL1RlbXBOb2RlLmpzJztcclxuaW1wb3J0IHsgYWRkTWV0aG9kQ2hhaW5pbmcsIG5vZGVPYmplY3QgfSBmcm9tICcuLi90c2wvVFNMQ29yZS5qcyc7XHJcblxyXG4vKipcclxuICogQXJyYXlOb2RlIHJlcHJlc2VudHMgYSBjb2xsZWN0aW9uIG9mIG5vZGVzLCB0eXBpY2FsbHkgY3JlYXRlZCB1c2luZyB0aGUge0BsaW5rIGFycmF5fSBmdW5jdGlvbi5cclxuICogYGBganNcclxuICogY29uc3QgY29sb3JzID0gYXJyYXkoIFtcclxuICogXHR2ZWMzKCAxLCAwLCAwICksXHJcbiAqIFx0dmVjMyggMCwgMSwgMCApLFxyXG4gKiBcdHZlYzMoIDAsIDAsIDEgKVxyXG4gKiBdICk7XHJcbiAqXHJcbiAqIGNvbnN0IHJlZENvbG9yID0gdGludENvbG9ycy5lbGVtZW50KCAwICk7XHJcbiAqXHJcbiAqIEBhdWdtZW50cyBUZW1wTm9kZVxyXG4gKi9cclxuY2xhc3MgQXJyYXlOb2RlIGV4dGVuZHMgVGVtcE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdBcnJheU5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYXJyYXkgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7P3N0cmluZ30gbm9kZVR5cGUgLSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBlbGVtZW50cy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gY291bnQgLSBTaXplIG9mIHRoZSBhcnJheS5cclxuXHQgKiBAcGFyYW0gez9BcnJheTxOb2RlPn0gW3ZhbHVlcz1udWxsXSAtIEFycmF5IGRlZmF1bHQgdmFsdWVzLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBub2RlVHlwZSwgY291bnQsIHZhbHVlcyA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5vZGVUeXBlICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBcnJheSBzaXplLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY291bnQgPSBjb3VudDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFycmF5IGRlZmF1bHQgdmFsdWVzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/QXJyYXk8Tm9kZT59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudmFsdWVzID0gdmFsdWVzO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0FycmF5Tm9kZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgbm9kZSdzIHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHR5cGUgb2YgdGhlIG5vZGUuXHJcblx0ICovXHJcblx0Z2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5vZGVUeXBlID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5ub2RlVHlwZSA9IHRoaXMudmFsdWVzWyAwIF0uZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubm9kZVR5cGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgbm9kZSdzIHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHR5cGUgb2YgdGhlIG5vZGUuXHJcblx0ICovXHJcblx0Z2V0RWxlbWVudFR5cGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBidWlsZHMgdGhlIG91dHB1dCBub2RlIGFuZCByZXR1cm5zIHRoZSByZXN1bHRpbmcgYXJyYXkgYXMgYSBzaGFkZXIgc3RyaW5nLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBnZW5lcmF0ZWQgc2hhZGVyIHN0cmluZy5cclxuXHQgKi9cclxuXHRnZW5lcmF0ZSggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCB0eXBlID0gdGhpcy5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cclxuXHRcdHJldHVybiBidWlsZGVyLmdlbmVyYXRlQXJyYXkoIHR5cGUsIHRoaXMuY291bnQsIHRoaXMudmFsdWVzICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEFycmF5Tm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGFuIGFycmF5IG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfEFycmF5PE5vZGU+fSBub2RlVHlwZU9yVmFsdWVzIC0gQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBlbGVtZW50IHR5cGUgKGUuZy4sICd2ZWMzJylcclxuICogb3IgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZGVmYXVsdCB2YWx1ZXMgKGUuZy4sIFsgdmVjMygpIF0pLlxyXG4gKiBAcGFyYW0gez9udW1iZXJ9IFtjb3VudF0gLSBTaXplIG9mIHRoZSBhcnJheS5cclxuICogQHJldHVybnMge0FycmF5Tm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBhcnJheSA9ICggLi4ucGFyYW1zICkgPT4ge1xyXG5cclxuXHRsZXQgbm9kZTtcclxuXHJcblx0aWYgKCBwYXJhbXMubGVuZ3RoID09PSAxICkge1xyXG5cclxuXHRcdGNvbnN0IHZhbHVlcyA9IHBhcmFtc1sgMCBdO1xyXG5cclxuXHRcdG5vZGUgPSBuZXcgQXJyYXlOb2RlKCBudWxsLCB2YWx1ZXMubGVuZ3RoLCB2YWx1ZXMgKTtcclxuXHJcblx0fSBlbHNlIHtcclxuXHJcblx0XHRjb25zdCBub2RlVHlwZSA9IHBhcmFtc1sgMCBdO1xyXG5cdFx0Y29uc3QgY291bnQgPSBwYXJhbXNbIDEgXTtcclxuXHJcblx0XHRub2RlID0gbmV3IEFycmF5Tm9kZSggbm9kZVR5cGUsIGNvdW50ICk7XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIG5vZGVPYmplY3QoIG5vZGUgKTtcclxuXHJcbn07XHJcblxyXG5hZGRNZXRob2RDaGFpbmluZyggJ3RvQXJyYXknLCAoIG5vZGUsIGNvdW50ICkgPT4gYXJyYXkoIEFycmF5KCBjb3VudCApLmZpbGwoIG5vZGUgKSApICk7XHJcbiIsImltcG9ydCBOb2RlIGZyb20gJy4vTm9kZS5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBub2RlIGNhbiBiZSB1c2VkIHRvIGdyb3VwIHNpbmdsZSBpbnN0YW5jZXMgb2Yge0BsaW5rIFVuaWZvcm1Ob2RlfVxyXG4gKiBhbmQgbWFuYWdlIHRoZW0gYXMgYSB1bmlmb3JtIGJ1ZmZlci5cclxuICpcclxuICogSW4gbW9zdCBjYXNlcywgdGhlIHByZWRlZmluZWQgbm9kZXMgYG9iamVjdEdyb3VwYCwgYHJlbmRlckdyb3VwYCBhbmQgYGZyYW1lR3JvdXBgXHJcbiAqIHdpbGwgYmUgdXNlZCB3aGVuIGRlZmluaW5nIHRoZSB7QGxpbmsgVW5pZm9ybU5vZGUjZ3JvdXBOb2RlfSBwcm9wZXJ0eS5cclxuICpcclxuICogLSBgb2JqZWN0R3JvdXBgOiBVbmlmb3JtIGJ1ZmZlciBwZXIgb2JqZWN0LlxyXG4gKiAtIGByZW5kZXJHcm91cGA6IFNoYXJlZCB1bmlmb3JtIGJ1ZmZlciwgdXBkYXRlZCBvbmNlIHBlciByZW5kZXIgY2FsbC5cclxuICogLSBgZnJhbWVHcm91cGA6IFNoYXJlZCB1bmlmb3JtIGJ1ZmZlciwgdXBkYXRlZCBvbmNlIHBlciBmcmFtZS5cclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVcclxuICovXHJcbmNsYXNzIFVuaWZvcm1Hcm91cE5vZGUgZXh0ZW5kcyBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnVW5pZm9ybUdyb3VwTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB1bmlmb3JtIGdyb3VwIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB1bmlmb3JtIGdyb3VwIG5vZGUuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbc2hhcmVkPWZhbHNlXSAtIFdoZXRoZXIgdGhpcyB1bmlmb3JtIGdyb3VwIG5vZGUgaXMgc2hhcmVkIG9yIG5vdC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW29yZGVyPTFdIC0gSW5mbHVlbmNlcyB0aGUgaW50ZXJuYWwgc29ydGluZy5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbmFtZSwgc2hhcmVkID0gZmFsc2UsIG9yZGVyID0gMSApIHtcclxuXHJcblx0XHRzdXBlciggJ3N0cmluZycgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBuYW1lIG9mIHRoZSB1bmlmb3JtIGdyb3VwIG5vZGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5uYW1lID0gbmFtZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhpcyB1bmlmb3JtIGdyb3VwIG5vZGUgaXMgc2hhcmVkIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2hhcmVkID0gc2hhcmVkO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSW5mbHVlbmNlcyB0aGUgaW50ZXJuYWwgc29ydGluZy5cclxuXHRcdCAqIFRPRE86IEFkZCBkZXRhaWxzIHdoZW4gdGhpcyBwcm9wZXJ0eSBzaG91bGQgYmUgY2hhbmdlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm9yZGVyID0gb3JkZXI7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzVW5pZm9ybUdyb3VwID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHRzZXJpYWxpemUoIGRhdGEgKSB7XHJcblxyXG5cdFx0c3VwZXIuc2VyaWFsaXplKCBkYXRhICk7XHJcblxyXG5cdFx0ZGF0YS5uYW1lID0gdGhpcy5uYW1lO1xyXG5cdFx0ZGF0YS52ZXJzaW9uID0gdGhpcy52ZXJzaW9uO1xyXG5cdFx0ZGF0YS5zaGFyZWQgPSB0aGlzLnNoYXJlZDtcclxuXHJcblx0fVxyXG5cclxuXHRkZXNlcmlhbGl6ZSggZGF0YSApIHtcclxuXHJcblx0XHRzdXBlci5kZXNlcmlhbGl6ZSggZGF0YSApO1xyXG5cclxuXHRcdHRoaXMubmFtZSA9IGRhdGEubmFtZTtcclxuXHRcdHRoaXMudmVyc2lvbiA9IGRhdGEudmVyc2lvbjtcclxuXHRcdHRoaXMuc2hhcmVkID0gZGF0YS5zaGFyZWQ7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFVuaWZvcm1Hcm91cE5vZGU7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIHVuaWZvcm0gZ3JvdXAgbm9kZSB3aXRoIHRoZSBnaXZlbiBuYW1lLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB1bmlmb3JtIGdyb3VwIG5vZGUuXHJcbiAqIEByZXR1cm5zIHtVbmlmb3JtR3JvdXBOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHVuaWZvcm1Hcm91cCA9ICggbmFtZSApID0+IG5ldyBVbmlmb3JtR3JvdXBOb2RlKCBuYW1lICk7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIHNoYXJlZCB1bmlmb3JtIGdyb3VwIG5vZGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgb3JkZXIuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHVuaWZvcm0gZ3JvdXAgbm9kZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtvcmRlcj0wXSAtIEluZmx1ZW5jZXMgdGhlIGludGVybmFsIHNvcnRpbmcuXHJcbiAqIEByZXR1cm5zIHtVbmlmb3JtR3JvdXBOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHNoYXJlZFVuaWZvcm1Hcm91cCA9ICggbmFtZSwgb3JkZXIgPSAwICkgPT4gbmV3IFVuaWZvcm1Hcm91cE5vZGUoIG5hbWUsIHRydWUsIG9yZGVyICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgYSBzaGFyZWQgdW5pZm9ybSBncm91cCBub2RlIHdoaWNoIGlzIHVwZGF0ZWQgb25jZSBwZXIgZnJhbWUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1VuaWZvcm1Hcm91cE5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZnJhbWVHcm91cCA9IC8qQF9fUFVSRV9fKi8gc2hhcmVkVW5pZm9ybUdyb3VwKCAnZnJhbWUnICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgYSBzaGFyZWQgdW5pZm9ybSBncm91cCBub2RlIHdoaWNoIGlzIHVwZGF0ZWQgb25jZSBwZXIgcmVuZGVyLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtVbmlmb3JtR3JvdXBOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHJlbmRlckdyb3VwID0gLypAX19QVVJFX18qLyBzaGFyZWRVbmlmb3JtR3JvdXAoICdyZW5kZXInICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgYSB1bmlmb3JtIGdyb3VwIG5vZGUgd2hpY2ggaXMgdXBkYXRlZCBvbmNlIHBlciBvYmplY3QuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1VuaWZvcm1Hcm91cE5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgb2JqZWN0R3JvdXAgPSAvKkBfX1BVUkVfXyovIHVuaWZvcm1Hcm91cCggJ29iamVjdCcgKTtcclxuIiwiaW1wb3J0IElucHV0Tm9kZSBmcm9tICcuL0lucHV0Tm9kZS5qcyc7XHJcbmltcG9ydCB7IG9iamVjdEdyb3VwIH0gZnJvbSAnLi9Vbmlmb3JtR3JvdXBOb2RlLmpzJztcclxuaW1wb3J0IHsgbm9kZU9iamVjdCwgZ2V0Q29uc3ROb2RlVHlwZSB9IGZyb20gJy4uL3RzbC9UU0xDb3JlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBDbGFzcyBmb3IgcmVwcmVzZW50aW5nIGEgdW5pZm9ybS5cclxuICpcclxuICogQGF1Z21lbnRzIElucHV0Tm9kZVxyXG4gKi9cclxuY2xhc3MgVW5pZm9ybU5vZGUgZXh0ZW5kcyBJbnB1dE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdVbmlmb3JtTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB1bmlmb3JtIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBUaGUgdmFsdWUgb2YgdGhpcyBub2RlLiBVc3VhbGx5IGEgSlMgcHJpbWl0aXZlIG9yIHRocmVlLmpzIG9iamVjdCAodmVjdG9yLCBtYXRyaXgsIGNvbG9yLCB0ZXh0dXJlKS5cclxuXHQgKiBAcGFyYW0gez9zdHJpbmd9IG5vZGVUeXBlIC0gVGhlIG5vZGUgdHlwZS4gSWYgbm8gZXhwbGljaXQgdHlwZSBpcyBkZWZpbmVkLCB0aGUgbm9kZSB0cmllcyB0byBkZXJpdmUgdGhlIHR5cGUgZnJvbSBpdHMgdmFsdWUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHZhbHVlLCBub2RlVHlwZSA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoIHZhbHVlLCBub2RlVHlwZSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1VuaWZvcm1Ob2RlID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBuYW1lIG9yIGxhYmVsIG9mIHRoZSB1bmlmb3JtLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKiBAZGVmYXVsdCAnJ1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5hbWUgPSAnJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB1bmlmb3JtIGdyb3VwIG9mIHRoaXMgdW5pZm9ybS4gQnkgZGVmYXVsdCwgdW5pZm9ybXMgYXJlXHJcblx0XHQgKiBtYW5hZ2VkIHBlciBvYmplY3QgYnV0IHRoZXkgbWlnaHQgYmVsb25nIHRvIGEgc2hhcmVkIGdyb3VwXHJcblx0XHQgKiB3aGljaCBpcyB1cGRhdGVkIHBlciBmcmFtZSBvciByZW5kZXIgY2FsbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VW5pZm9ybUdyb3VwTm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ncm91cE5vZGUgPSBvYmplY3RHcm91cDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB7QGxpbmsgVW5pZm9ybU5vZGUjbmFtZX0gcHJvcGVydHkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB1bmlmb3JtLlxyXG5cdCAqIEByZXR1cm4ge1VuaWZvcm1Ob2RlfSBBIHJlZmVyZW5jZSB0byB0aGlzIG5vZGUuXHJcblx0ICovXHJcblx0bGFiZWwoIG5hbWUgKSB7XHJcblxyXG5cdFx0dGhpcy5uYW1lID0gbmFtZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB7QGxpbmsgVW5pZm9ybU5vZGUjZ3JvdXBOb2RlfSBwcm9wZXJ0eS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VW5pZm9ybUdyb3VwTm9kZX0gZ3JvdXAgLSBUaGUgdW5pZm9ybSBncm91cC5cclxuXHQgKiBAcmV0dXJuIHtVbmlmb3JtTm9kZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBub2RlLlxyXG5cdCAqL1xyXG5cdHNldEdyb3VwKCBncm91cCApIHtcclxuXHJcblx0XHR0aGlzLmdyb3VwTm9kZSA9IGdyb3VwO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHtAbGluayBVbmlmb3JtTm9kZSNncm91cE5vZGV9LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7VW5pZm9ybUdyb3VwTm9kZX0gVGhlIHVuaWZvcm0gZ3JvdXAuXHJcblx0ICovXHJcblx0Z2V0R3JvdXAoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZ3JvdXBOb2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEJ5IGRlZmF1bHQsIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHJlc3VsdCBvZiB7QGxpbmsgTm9kZSNnZXRIYXNofSBidXQgZGVyaXZlZFxyXG5cdCAqIGNsYXNzZXMgbWlnaHQgb3ZlcndyaXRlIHRoaXMgbWV0aG9kIHdpdGggYSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHVuaWZvcm0gaGFzaC5cclxuXHQgKi9cclxuXHRnZXRVbmlmb3JtSGFzaCggYnVpbGRlciApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5nZXRIYXNoKCBidWlsZGVyICk7XHJcblxyXG5cdH1cclxuXHJcblx0b25VcGRhdGUoIGNhbGxiYWNrLCB1cGRhdGVUeXBlICkge1xyXG5cclxuXHRcdGNvbnN0IHNlbGYgPSB0aGlzLmdldFNlbGYoKTtcclxuXHJcblx0XHRjYWxsYmFjayA9IGNhbGxiYWNrLmJpbmQoIHNlbGYgKTtcclxuXHJcblx0XHRyZXR1cm4gc3VwZXIub25VcGRhdGUoICggZnJhbWUgKSA9PiB7XHJcblxyXG5cdFx0XHRjb25zdCB2YWx1ZSA9IGNhbGxiYWNrKCBmcmFtZSwgc2VsZiApO1xyXG5cclxuXHRcdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLnZhbHVlID0gdmFsdWU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdCBcdH0sIHVwZGF0ZVR5cGUgKTtcclxuXHJcblx0fVxyXG5cclxuXHRnZW5lcmF0ZSggYnVpbGRlciwgb3V0cHV0ICkge1xyXG5cclxuXHRcdGNvbnN0IHR5cGUgPSB0aGlzLmdldE5vZGVUeXBlKCBidWlsZGVyICk7XHJcblxyXG5cdFx0Y29uc3QgaGFzaCA9IHRoaXMuZ2V0VW5pZm9ybUhhc2goIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRsZXQgc2hhcmVkTm9kZSA9IGJ1aWxkZXIuZ2V0Tm9kZUZyb21IYXNoKCBoYXNoICk7XHJcblxyXG5cdFx0aWYgKCBzaGFyZWROb2RlID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRidWlsZGVyLnNldEhhc2hOb2RlKCB0aGlzLCBoYXNoICk7XHJcblxyXG5cdFx0XHRzaGFyZWROb2RlID0gdGhpcztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3Qgc2hhcmVkTm9kZVR5cGUgPSBzaGFyZWROb2RlLmdldElucHV0VHlwZSggYnVpbGRlciApO1xyXG5cclxuXHRcdGNvbnN0IG5vZGVVbmlmb3JtID0gYnVpbGRlci5nZXRVbmlmb3JtRnJvbU5vZGUoIHNoYXJlZE5vZGUsIHNoYXJlZE5vZGVUeXBlLCBidWlsZGVyLnNoYWRlclN0YWdlLCB0aGlzLm5hbWUgfHwgYnVpbGRlci5jb250ZXh0LmxhYmVsICk7XHJcblx0XHRjb25zdCBwcm9wZXJ0eU5hbWUgPSBidWlsZGVyLmdldFByb3BlcnR5TmFtZSggbm9kZVVuaWZvcm0gKTtcclxuXHJcblx0XHRpZiAoIGJ1aWxkZXIuY29udGV4dC5sYWJlbCAhPT0gdW5kZWZpbmVkICkgZGVsZXRlIGJ1aWxkZXIuY29udGV4dC5sYWJlbDtcclxuXHJcblx0XHRyZXR1cm4gYnVpbGRlci5mb3JtYXQoIHByb3BlcnR5TmFtZSwgdHlwZSwgb3V0cHV0ICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFVuaWZvcm1Ob2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSB1bmlmb3JtIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7YW55fSBhcmcxIC0gVGhlIHZhbHVlIG9mIHRoaXMgbm9kZS4gVXN1YWxseSBhIEpTIHByaW1pdGl2ZSBvciB0aHJlZS5qcyBvYmplY3QgKHZlY3RvciwgbWF0cml4LCBjb2xvciwgdGV4dHVyZSkuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJnMl0gLSBUaGUgbm9kZSB0eXBlLiBJZiBubyBleHBsaWNpdCB0eXBlIGlzIGRlZmluZWQsIHRoZSBub2RlIHRyaWVzIHRvIGRlcml2ZSB0aGUgdHlwZSBmcm9tIGl0cyB2YWx1ZS5cclxuICogQHJldHVybnMge1VuaWZvcm1Ob2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHVuaWZvcm0gPSAoIGFyZzEsIGFyZzIgKSA9PiB7XHJcblxyXG5cdGNvbnN0IG5vZGVUeXBlID0gZ2V0Q29uc3ROb2RlVHlwZSggYXJnMiB8fCBhcmcxICk7XHJcblxyXG5cdC8vIEBUT0RPOiBnZXQgQ29uc3ROb2RlIGZyb20gLnRyYXZlcnNlKCkgaW4gdGhlIGZ1dHVyZVxyXG5cdGNvbnN0IHZhbHVlID0gKCBhcmcxICYmIGFyZzEuaXNOb2RlID09PSB0cnVlICkgPyAoIGFyZzEubm9kZSAmJiBhcmcxLm5vZGUudmFsdWUgKSB8fCBhcmcxLnZhbHVlIDogYXJnMTtcclxuXHJcblx0cmV0dXJuIG5vZGVPYmplY3QoIG5ldyBVbmlmb3JtTm9kZSggdmFsdWUsIG5vZGVUeXBlICkgKTtcclxuXHJcbn07XHJcbiIsImltcG9ydCBOb2RlIGZyb20gJy4vTm9kZS5qcyc7XHJcbmltcG9ydCB7IG5vZGVJbW11dGFibGUsIG5vZGVPYmplY3QgfSBmcm9tICcuLi90c2wvVFNMQ29yZS5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgc2hhZGVyIHByb3BlcnR5LiBJdCBjYW4gYmUgdXNlZFxyXG4gKiB0byBleHBsaWNpdGx5IGRlZmluZSBhIHByb3BlcnR5IGFuZCBhc3NpZ24gYSB2YWx1ZSB0byBpdC5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgdGhyZXNob2xkID0gcHJvcGVydHkoICdmbG9hdCcsICd0aHJlc2hvbGQnICkuYXNzaWduKCBUSFJFU0hPTEQgKTtcclxuICpgYGBcclxuICogYFByb3BlcnR5Tm9kZWAgaXMgdXNlZCBieSB0aGUgZW5naW5lIHRvIHByZWRlZmluZWQgY29tbW9uIG1hdGVyaWFsIHByb3BlcnRpZXNcclxuICogZm9yIFRTTCBjb2RlLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTm9kZVxyXG4gKi9cclxuY2xhc3MgUHJvcGVydHlOb2RlIGV4dGVuZHMgTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ1Byb3BlcnR5Tm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBwcm9wZXJ0eSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5vZGVUeXBlIC0gVGhlIHR5cGUgb2YgdGhlIG5vZGUuXHJcblx0ICogQHBhcmFtIHs/c3RyaW5nfSBbbmFtZT1udWxsXSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBpbiB0aGUgc2hhZGVyLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Zhcnlpbmc9ZmFsc2VdIC0gV2hldGhlciB0aGlzIHByb3BlcnR5IGlzIGEgdmFyeWluZyBvciBub3QuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5vZGVUeXBlLCBuYW1lID0gbnVsbCwgdmFyeWluZyA9IGZhbHNlICkge1xyXG5cclxuXHRcdHN1cGVyKCBub2RlVHlwZSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGluIHRoZSBzaGFkZXIuIElmIG5vIG5hbWUgaXMgZGVmaW5lZCxcclxuXHRcdCAqIHRoZSBub2RlIHN5c3RlbSBhdXRvLWdlbmVyYXRlcyBvbmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9zdHJpbmd9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubmFtZSA9IG5hbWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoaXMgcHJvcGVydHkgaXMgYSB2YXJ5aW5nIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudmFyeWluZyA9IHZhcnlpbmc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzUHJvcGVydHlOb2RlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHRnZXRIYXNoKCBidWlsZGVyICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm5hbWUgfHwgc3VwZXIuZ2V0SGFzaCggYnVpbGRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBtZXRob2QgaXMgb3ZlcndyaXR0ZW4gc28gaXQgYWx3YXlzIHJldHVybnMgYHRydWVgLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoaXMgbm9kZSBpcyBnbG9iYWwgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGlzR2xvYmFsKCAvKmJ1aWxkZXIqLyApIHtcclxuXHJcblx0XHRyZXR1cm4gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHRnZW5lcmF0ZSggYnVpbGRlciApIHtcclxuXHJcblx0XHRsZXQgbm9kZVZhcjtcclxuXHJcblx0XHRpZiAoIHRoaXMudmFyeWluZyA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdG5vZGVWYXIgPSBidWlsZGVyLmdldFZhcnlpbmdGcm9tTm9kZSggdGhpcywgdGhpcy5uYW1lICk7XHJcblx0XHRcdG5vZGVWYXIubmVlZHNJbnRlcnBvbGF0aW9uID0gdHJ1ZTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0bm9kZVZhciA9IGJ1aWxkZXIuZ2V0VmFyRnJvbU5vZGUoIHRoaXMsIHRoaXMubmFtZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gYnVpbGRlci5nZXRQcm9wZXJ0eU5hbWUoIG5vZGVWYXIgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUHJvcGVydHlOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSBwcm9wZXJ0eSBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSB0eXBlIG9mIHRoZSBub2RlLlxyXG4gKiBAcGFyYW0gez9zdHJpbmd9IFtuYW1lPW51bGxdIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGluIHRoZSBzaGFkZXIuXHJcbiAqIEByZXR1cm5zIHtQcm9wZXJ0eU5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcHJvcGVydHkgPSAoIHR5cGUsIG5hbWUgKSA9PiBub2RlT2JqZWN0KCBuZXcgUHJvcGVydHlOb2RlKCB0eXBlLCBuYW1lICkgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgdmFyeWluZyBwcm9wZXJ0eSBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSB0eXBlIG9mIHRoZSBub2RlLlxyXG4gKiBAcGFyYW0gez9zdHJpbmd9IFtuYW1lPW51bGxdIC0gVGhlIG5hbWUgb2YgdGhlIHZhcnlpbmcgaW4gdGhlIHNoYWRlci5cclxuICogQHJldHVybnMge1Byb3BlcnR5Tm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCB2YXJ5aW5nUHJvcGVydHkgPSAoIHR5cGUsIG5hbWUgKSA9PiBub2RlT2JqZWN0KCBuZXcgUHJvcGVydHlOb2RlKCB0eXBlLCBuYW1lLCB0cnVlICkgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgc2hhZGVyIHZhcmlhYmxlIGBEaWZmdXNlQ29sb3JgLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtQcm9wZXJ0eU5vZGU8dmVjND59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZGlmZnVzZUNvbG9yID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBQcm9wZXJ0eU5vZGUsICd2ZWM0JywgJ0RpZmZ1c2VDb2xvcicgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgc2hhZGVyIHZhcmlhYmxlIGBFbWlzc2l2ZUNvbG9yYC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7UHJvcGVydHlOb2RlPHZlYzM+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGVtaXNzaXZlID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBQcm9wZXJ0eU5vZGUsICd2ZWMzJywgJ0VtaXNzaXZlQ29sb3InICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHNoYWRlciB2YXJpYWJsZSBgUm91Z2huZXNzYC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7UHJvcGVydHlOb2RlPGZsb2F0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCByb3VnaG5lc3MgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIFByb3BlcnR5Tm9kZSwgJ2Zsb2F0JywgJ1JvdWdobmVzcycgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgc2hhZGVyIHZhcmlhYmxlIGBNZXRhbG5lc3NgLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtQcm9wZXJ0eU5vZGU8ZmxvYXQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG1ldGFsbmVzcyA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggUHJvcGVydHlOb2RlLCAnZmxvYXQnLCAnTWV0YWxuZXNzJyApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBzaGFkZXIgdmFyaWFibGUgYENsZWFyY29hdGAuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1Byb3BlcnR5Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgY2xlYXJjb2F0ID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBQcm9wZXJ0eU5vZGUsICdmbG9hdCcsICdDbGVhcmNvYXQnICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHNoYWRlciB2YXJpYWJsZSBgQ2xlYXJjb2F0Um91Z2huZXNzYC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7UHJvcGVydHlOb2RlPGZsb2F0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBjbGVhcmNvYXRSb3VnaG5lc3MgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIFByb3BlcnR5Tm9kZSwgJ2Zsb2F0JywgJ0NsZWFyY29hdFJvdWdobmVzcycgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgc2hhZGVyIHZhcmlhYmxlIGBTaGVlbmAuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1Byb3BlcnR5Tm9kZTx2ZWMzPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBzaGVlbiA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggUHJvcGVydHlOb2RlLCAndmVjMycsICdTaGVlbicgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgc2hhZGVyIHZhcmlhYmxlIGBTaGVlblJvdWdobmVzc2AuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1Byb3BlcnR5Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgc2hlZW5Sb3VnaG5lc3MgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIFByb3BlcnR5Tm9kZSwgJ2Zsb2F0JywgJ1NoZWVuUm91Z2huZXNzJyApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBzaGFkZXIgdmFyaWFibGUgYElyaWRlc2NlbmNlYC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7UHJvcGVydHlOb2RlPGZsb2F0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBpcmlkZXNjZW5jZSA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggUHJvcGVydHlOb2RlLCAnZmxvYXQnLCAnSXJpZGVzY2VuY2UnICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHNoYWRlciB2YXJpYWJsZSBgSXJpZGVzY2VuY2VJT1JgLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtQcm9wZXJ0eU5vZGU8ZmxvYXQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGlyaWRlc2NlbmNlSU9SID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBQcm9wZXJ0eU5vZGUsICdmbG9hdCcsICdJcmlkZXNjZW5jZUlPUicgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgc2hhZGVyIHZhcmlhYmxlIGBJcmlkZXNjZW5jZVRoaWNrbmVzc2AuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1Byb3BlcnR5Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgaXJpZGVzY2VuY2VUaGlja25lc3MgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIFByb3BlcnR5Tm9kZSwgJ2Zsb2F0JywgJ0lyaWRlc2NlbmNlVGhpY2tuZXNzJyApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBzaGFkZXIgdmFyaWFibGUgYEFscGhhVGAuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1Byb3BlcnR5Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYWxwaGFUID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBQcm9wZXJ0eU5vZGUsICdmbG9hdCcsICdBbHBoYVQnICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHNoYWRlciB2YXJpYWJsZSBgQW5pc290cm9weWAuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1Byb3BlcnR5Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYW5pc290cm9weSA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggUHJvcGVydHlOb2RlLCAnZmxvYXQnLCAnQW5pc290cm9weScgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgc2hhZGVyIHZhcmlhYmxlIGBBbmlzb3Ryb3B5VGAuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1Byb3BlcnR5Tm9kZTx2ZWMzPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBhbmlzb3Ryb3B5VCA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggUHJvcGVydHlOb2RlLCAndmVjMycsICdBbmlzb3Ryb3B5VCcgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgc2hhZGVyIHZhcmlhYmxlIGBBbmlzb3Ryb3B5QmAuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1Byb3BlcnR5Tm9kZTx2ZWMzPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBhbmlzb3Ryb3B5QiA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggUHJvcGVydHlOb2RlLCAndmVjMycsICdBbmlzb3Ryb3B5QicgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgc2hhZGVyIHZhcmlhYmxlIGBTcGVjdWxhckNvbG9yYC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7UHJvcGVydHlOb2RlPGNvbG9yPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBzcGVjdWxhckNvbG9yID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBQcm9wZXJ0eU5vZGUsICdjb2xvcicsICdTcGVjdWxhckNvbG9yJyApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBzaGFkZXIgdmFyaWFibGUgYFNwZWN1bGFyRjkwYC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7UHJvcGVydHlOb2RlPGZsb2F0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBzcGVjdWxhckY5MCA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggUHJvcGVydHlOb2RlLCAnZmxvYXQnLCAnU3BlY3VsYXJGOTAnICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHNoYWRlciB2YXJpYWJsZSBgU2hpbmluZXNzYC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7UHJvcGVydHlOb2RlPGZsb2F0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBzaGluaW5lc3MgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIFByb3BlcnR5Tm9kZSwgJ2Zsb2F0JywgJ1NoaW5pbmVzcycgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgc2hhZGVyIHZhcmlhYmxlIGBPdXRwdXRgLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtQcm9wZXJ0eU5vZGU8dmVjND59XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgb3V0cHV0ID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBQcm9wZXJ0eU5vZGUsICd2ZWM0JywgJ091dHB1dCcgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgc2hhZGVyIHZhcmlhYmxlIGBkYXNoU2l6ZWAuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1Byb3BlcnR5Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZGFzaFNpemUgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIFByb3BlcnR5Tm9kZSwgJ2Zsb2F0JywgJ2Rhc2hTaXplJyApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBzaGFkZXIgdmFyaWFibGUgYGdhcFNpemVgLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtQcm9wZXJ0eU5vZGU8ZmxvYXQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGdhcFNpemUgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIFByb3BlcnR5Tm9kZSwgJ2Zsb2F0JywgJ2dhcFNpemUnICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHNoYWRlciB2YXJpYWJsZSBgcG9pbnRXaWR0aGAuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1Byb3BlcnR5Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcG9pbnRXaWR0aCA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggUHJvcGVydHlOb2RlLCAnZmxvYXQnLCAncG9pbnRXaWR0aCcgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgc2hhZGVyIHZhcmlhYmxlIGBJT1JgLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtQcm9wZXJ0eU5vZGU8ZmxvYXQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGlvciA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggUHJvcGVydHlOb2RlLCAnZmxvYXQnLCAnSU9SJyApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBzaGFkZXIgdmFyaWFibGUgYFRyYW5zbWlzc2lvbmAuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1Byb3BlcnR5Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdHJhbnNtaXNzaW9uID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBQcm9wZXJ0eU5vZGUsICdmbG9hdCcsICdUcmFuc21pc3Npb24nICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHNoYWRlciB2YXJpYWJsZSBgVGhpY2tuZXNzYC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7UHJvcGVydHlOb2RlPGZsb2F0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCB0aGlja25lc3MgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIFByb3BlcnR5Tm9kZSwgJ2Zsb2F0JywgJ1RoaWNrbmVzcycgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgc2hhZGVyIHZhcmlhYmxlIGBBdHRlbnVhdGlvbkRpc3RhbmNlYC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7UHJvcGVydHlOb2RlPGZsb2F0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBhdHRlbnVhdGlvbkRpc3RhbmNlID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBQcm9wZXJ0eU5vZGUsICdmbG9hdCcsICdBdHRlbnVhdGlvbkRpc3RhbmNlJyApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBzaGFkZXIgdmFyaWFibGUgYEF0dGVudWF0aW9uQ29sb3JgLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtQcm9wZXJ0eU5vZGU8Y29sb3I+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGF0dGVudWF0aW9uQ29sb3IgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIFByb3BlcnR5Tm9kZSwgJ2NvbG9yJywgJ0F0dGVudWF0aW9uQ29sb3InICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHNoYWRlciB2YXJpYWJsZSBgRGlzcGVyc2lvbmAuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1Byb3BlcnR5Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZGlzcGVyc2lvbiA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggUHJvcGVydHlOb2RlLCAnZmxvYXQnLCAnRGlzcGVyc2lvbicgKTtcclxuIiwiaW1wb3J0IFRlbXBOb2RlIGZyb20gJy4uL2NvcmUvVGVtcE5vZGUuanMnO1xyXG5pbXBvcnQgeyBhZGRNZXRob2RDaGFpbmluZywgbm9kZVByb3h5IH0gZnJvbSAnLi4vdHNsL1RTTENvcmUuanMnO1xyXG5pbXBvcnQgeyB2ZWN0b3JDb21wb25lbnRzIH0gZnJvbSAnLi4vY29yZS9jb25zdGFudHMuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRoZXNlIG5vZGUgcmVwcmVzZW50cyBhbiBhc3NpZ24gb3BlcmF0aW9uLiBNZWFuaW5nIGEgbm9kZSBpcyBhc3NpZ25lZFxyXG4gKiB0byBhbm90aGVyIG5vZGUuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBUZW1wTm9kZVxyXG4gKi9cclxuY2xhc3MgQXNzaWduTm9kZSBleHRlbmRzIFRlbXBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnQXNzaWduTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBhc3NpZ24gbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0Tm9kZSAtIFRoZSB0YXJnZXQgbm9kZS5cclxuXHQgKiBAcGFyYW0ge05vZGV9IHNvdXJjZU5vZGUgLSBUaGUgc291cmNlIHR5cGUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHRhcmdldE5vZGUsIHNvdXJjZU5vZGUgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB0YXJnZXQgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50YXJnZXROb2RlID0gdGFyZ2V0Tm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBzb3VyY2Ugbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zb3VyY2VOb2RlID0gc291cmNlTm9kZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBXaGV0aGVyIHRoaXMgbm9kZSBpcyB1c2VkIG1vcmUgdGhhbiBvbmNlIGluIGNvbnRleHQgb2Ygb3RoZXIgbm9kZXMuIFRoaXMgbWV0aG9kXHJcblx0ICogaXMgb3ZlcndyaXR0ZW4gc2luY2UgaXQgYWx3YXlzIHJldHVybnMgYGZhbHNlYCAoYXNzaWducyBhcmUgdW5pcXVlKS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IEEgZmxhZyB0aGF0IGluZGljYXRlcyBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGRlcGVuZGVuY3kgdG8gb3RoZXIgbm9kZXMuIEFsd2F5cyBgZmFsc2VgLlxyXG5cdCAqL1xyXG5cdGhhc0RlcGVuZGVuY2llcygpIHtcclxuXHJcblx0XHRyZXR1cm4gZmFsc2U7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0Tm9kZVR5cGUoIGJ1aWxkZXIsIG91dHB1dCApIHtcclxuXHJcblx0XHRyZXR1cm4gb3V0cHV0ICE9PSAndm9pZCcgPyB0aGlzLnRhcmdldE5vZGUuZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKSA6ICd2b2lkJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBXaGV0aGVyIGEgc3BsaXQgaXMgcmVxdWlyZWQgd2hlbiBhc3NpZ25pbmcgc291cmNlIHRvIHRhcmdldC4gVGhpcyBjYW4gaGFwcGVuIHdoZW4gdGhlIGNvbXBvbmVudCBsZW5ndGggb2ZcclxuXHQgKiB0YXJnZXQgYW5kIHNvdXJjZSBkYXRhIHR5cGUgZG9lcyBub3QgbWF0Y2guXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgYSBzcGxpdCBpcyByZXF1aXJlZCB3aGVuIGFzc2lnbmluZyBzb3VyY2UgdG8gdGFyZ2V0LlxyXG5cdCAqL1xyXG5cdG5lZWRzU3BsaXRBc3NpZ24oIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyB0YXJnZXROb2RlIH0gPSB0aGlzO1xyXG5cclxuXHRcdGlmICggYnVpbGRlci5pc0F2YWlsYWJsZSggJ3N3aXp6bGVBc3NpZ24nICkgPT09IGZhbHNlICYmIHRhcmdldE5vZGUuaXNTcGxpdE5vZGUgJiYgdGFyZ2V0Tm9kZS5jb21wb25lbnRzLmxlbmd0aCA+IDEgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB0YXJnZXRMZW5ndGggPSBidWlsZGVyLmdldFR5cGVMZW5ndGgoIHRhcmdldE5vZGUubm9kZS5nZXROb2RlVHlwZSggYnVpbGRlciApICk7XHJcblx0XHRcdGNvbnN0IGFzc2lnbkRpZmZlcmVudFZlY3RvciA9IHZlY3RvckNvbXBvbmVudHMuam9pbiggJycgKS5zbGljZSggMCwgdGFyZ2V0TGVuZ3RoICkgIT09IHRhcmdldE5vZGUuY29tcG9uZW50cztcclxuXHJcblx0XHRcdHJldHVybiBhc3NpZ25EaWZmZXJlbnRWZWN0b3I7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBmYWxzZTtcclxuXHJcblx0fVxyXG5cclxuXHRnZW5lcmF0ZSggYnVpbGRlciwgb3V0cHV0ICkge1xyXG5cclxuXHRcdGNvbnN0IHsgdGFyZ2V0Tm9kZSwgc291cmNlTm9kZSB9ID0gdGhpcztcclxuXHJcblx0XHRjb25zdCBuZWVkc1NwbGl0QXNzaWduID0gdGhpcy5uZWVkc1NwbGl0QXNzaWduKCBidWlsZGVyICk7XHJcblxyXG5cdFx0Y29uc3QgdGFyZ2V0VHlwZSA9IHRhcmdldE5vZGUuZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRjb25zdCB0YXJnZXQgPSB0YXJnZXROb2RlLmNvbnRleHQoIHsgYXNzaWduOiB0cnVlIH0gKS5idWlsZCggYnVpbGRlciApO1xyXG5cdFx0Y29uc3Qgc291cmNlID0gc291cmNlTm9kZS5idWlsZCggYnVpbGRlciwgdGFyZ2V0VHlwZSApO1xyXG5cclxuXHRcdGNvbnN0IHNvdXJjZVR5cGUgPSBzb3VyY2VOb2RlLmdldE5vZGVUeXBlKCBidWlsZGVyICk7XHJcblxyXG5cdFx0Y29uc3Qgbm9kZURhdGEgPSBidWlsZGVyLmdldERhdGFGcm9tTm9kZSggdGhpcyApO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0bGV0IHNuaXBwZXQ7XHJcblxyXG5cdFx0aWYgKCBub2RlRGF0YS5pbml0aWFsaXplZCA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdGlmICggb3V0cHV0ICE9PSAndm9pZCcgKSB7XHJcblxyXG5cdFx0XHRcdHNuaXBwZXQgPSB0YXJnZXQ7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmICggbmVlZHNTcGxpdEFzc2lnbiApIHtcclxuXHJcblx0XHRcdGNvbnN0IHNvdXJjZVZhciA9IGJ1aWxkZXIuZ2V0VmFyRnJvbU5vZGUoIHRoaXMsIG51bGwsIHRhcmdldFR5cGUgKTtcclxuXHRcdFx0Y29uc3Qgc291cmNlUHJvcGVydHkgPSBidWlsZGVyLmdldFByb3BlcnR5TmFtZSggc291cmNlVmFyICk7XHJcblxyXG5cdFx0XHRidWlsZGVyLmFkZExpbmVGbG93Q29kZSggYCR7IHNvdXJjZVByb3BlcnR5IH0gPSAkeyBzb3VyY2UgfWAsIHRoaXMgKTtcclxuXHJcblx0XHRcdGNvbnN0IHRhcmdldFJvb3QgPSB0YXJnZXROb2RlLm5vZGUuY29udGV4dCggeyBhc3NpZ246IHRydWUgfSApLmJ1aWxkKCBidWlsZGVyICk7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB0YXJnZXROb2RlLmNvbXBvbmVudHMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBjb21wb25lbnQgPSB0YXJnZXROb2RlLmNvbXBvbmVudHNbIGkgXTtcclxuXHJcblx0XHRcdFx0YnVpbGRlci5hZGRMaW5lRmxvd0NvZGUoIGAkeyB0YXJnZXRSb290IH0uJHsgY29tcG9uZW50IH0gPSAkeyBzb3VyY2VQcm9wZXJ0eSB9WyAkeyBpIH0gXWAsIHRoaXMgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggb3V0cHV0ICE9PSAndm9pZCcgKSB7XHJcblxyXG5cdFx0XHRcdHNuaXBwZXQgPSB0YXJnZXQ7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHNuaXBwZXQgPSBgJHsgdGFyZ2V0IH0gPSAkeyBzb3VyY2UgfWA7XHJcblxyXG5cdFx0XHRpZiAoIG91dHB1dCA9PT0gJ3ZvaWQnIHx8IHNvdXJjZVR5cGUgPT09ICd2b2lkJyApIHtcclxuXHJcblx0XHRcdFx0YnVpbGRlci5hZGRMaW5lRmxvd0NvZGUoIHNuaXBwZXQsIHRoaXMgKTtcclxuXHJcblx0XHRcdFx0aWYgKCBvdXRwdXQgIT09ICd2b2lkJyApIHtcclxuXHJcblx0XHRcdFx0XHRzbmlwcGV0ID0gdGFyZ2V0O1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdG5vZGVEYXRhLmluaXRpYWxpemVkID0gdHJ1ZTtcclxuXHJcblx0XHRyZXR1cm4gYnVpbGRlci5mb3JtYXQoIHNuaXBwZXQsIHRhcmdldFR5cGUsIG91dHB1dCApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBBc3NpZ25Ob2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYW4gYXNzaWduIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0Tm9kZSAtIFRoZSB0YXJnZXQgbm9kZS5cclxuICogQHBhcmFtIHtOb2RlfSBzb3VyY2VOb2RlIC0gVGhlIHNvdXJjZSB0eXBlLlxyXG4gKiBAcmV0dXJucyB7QXNzaWduTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBhc3NpZ24gPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggQXNzaWduTm9kZSApLnNldFBhcmFtZXRlckxlbmd0aCggMiApO1xyXG5cclxuYWRkTWV0aG9kQ2hhaW5pbmcoICdhc3NpZ24nLCBhc3NpZ24gKTtcclxuIiwiaW1wb3J0IFRlbXBOb2RlIGZyb20gJy4uL2NvcmUvVGVtcE5vZGUuanMnO1xyXG5pbXBvcnQgeyBhZGRNZXRob2RDaGFpbmluZywgbm9kZUFycmF5LCBub2RlT2JqZWN0LCBub2RlT2JqZWN0cywgZmxvYXQgfSBmcm9tICcuLi90c2wvVFNMQ29yZS5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBtb2R1bGUgcmVwcmVzZW50cyB0aGUgY2FsbCBvZiBhIHtAbGluayBGdW5jdGlvbk5vZGV9LiBEZXZlbG9wZXJzIGFyZSB1c3VhbGx5IG5vdCBjb25mcm9udGVkXHJcbiAqIHdpdGggdGhpcyBtb2R1bGUgc2luY2UgdGhleSB1c2UgdGhlIHByZWRlZmluZWQgVFNMIHN5bnRheCBgd2dzbEZuYCBhbmQgYGdsc2xGbmAgd2hpY2ggZW5jYXBzdWxhdGVcclxuICogdGhpcyBsb2dpYy5cclxuICpcclxuICogQGF1Z21lbnRzIFRlbXBOb2RlXHJcbiAqL1xyXG5jbGFzcyBGdW5jdGlvbkNhbGxOb2RlIGV4dGVuZHMgVGVtcE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdGdW5jdGlvbkNhbGxOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGZ1bmN0aW9uIGNhbGwgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7P0Z1bmN0aW9uTm9kZX0gZnVuY3Rpb25Ob2RlIC0gVGhlIGZ1bmN0aW9uIG5vZGUuXHJcblx0ICogQHBhcmFtIHtPYmplY3Q8c3RyaW5nLCBOb2RlPn0gW3BhcmFtZXRlcnM9e31dIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmdW5jdGlvbiBjYWxsLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBmdW5jdGlvbk5vZGUgPSBudWxsLCBwYXJhbWV0ZXJzID0ge30gKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBmdW5jdGlvbiBub2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/RnVuY3Rpb25Ob2RlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZ1bmN0aW9uTm9kZSA9IGZ1bmN0aW9uTm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBmdW5jdGlvbiBjYWxsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLCBOb2RlPn1cclxuXHRcdCAqIEBkZWZhdWx0IHt9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgcGFyYW1ldGVycyBvZiB0aGUgZnVuY3Rpb24gY2FsbCBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3Q8c3RyaW5nLCBOb2RlPn0gcGFyYW1ldGVycyAtIFRoZSBwYXJhbWV0ZXJzIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtGdW5jdGlvbkNhbGxOb2RlfSBBIHJlZmVyZW5jZSB0byB0aGlzIG5vZGUuXHJcblx0ICovXHJcblx0c2V0UGFyYW1ldGVycyggcGFyYW1ldGVycyApIHtcclxuXHJcblx0XHR0aGlzLnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIGZ1bmN0aW9uIGNhbGwgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge09iamVjdDxzdHJpbmcsIE5vZGU+fSBUaGUgcGFyYW1ldGVycyBvZiB0aGlzIG5vZGUuXHJcblx0ICovXHJcblx0Z2V0UGFyYW1ldGVycygpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5wYXJhbWV0ZXJzO1xyXG5cclxuXHR9XHJcblxyXG5cdGdldE5vZGVUeXBlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmZ1bmN0aW9uTm9kZS5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdGdlbmVyYXRlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IHBhcmFtcyA9IFtdO1xyXG5cclxuXHRcdGNvbnN0IGZ1bmN0aW9uTm9kZSA9IHRoaXMuZnVuY3Rpb25Ob2RlO1xyXG5cclxuXHRcdGNvbnN0IGlucHV0cyA9IGZ1bmN0aW9uTm9kZS5nZXRJbnB1dHMoIGJ1aWxkZXIgKTtcclxuXHRcdGNvbnN0IHBhcmFtZXRlcnMgPSB0aGlzLnBhcmFtZXRlcnM7XHJcblxyXG5cdFx0Y29uc3QgZ2VuZXJhdGVJbnB1dCA9ICggbm9kZSwgaW5wdXROb2RlICkgPT4ge1xyXG5cclxuXHRcdFx0Y29uc3QgdHlwZSA9IGlucHV0Tm9kZS50eXBlO1xyXG5cdFx0XHRjb25zdCBwb2ludGVyID0gdHlwZSA9PT0gJ3BvaW50ZXInO1xyXG5cclxuXHRcdFx0bGV0IG91dHB1dDtcclxuXHJcblx0XHRcdGlmICggcG9pbnRlciApIG91dHB1dCA9ICcmJyArIG5vZGUuYnVpbGQoIGJ1aWxkZXIgKTtcclxuXHRcdFx0ZWxzZSBvdXRwdXQgPSBub2RlLmJ1aWxkKCBidWlsZGVyLCB0eXBlICk7XHJcblxyXG5cdFx0XHRyZXR1cm4gb3V0cHV0O1xyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCBwYXJhbWV0ZXJzICkgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHBhcmFtZXRlcnMubGVuZ3RoID4gaW5wdXRzLmxlbmd0aCApIHtcclxuXHJcblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlRTTDogVGhlIG51bWJlciBvZiBwcm92aWRlZCBwYXJhbWV0ZXJzIGV4Y2VlZHMgdGhlIGV4cGVjdGVkIG51bWJlciBvZiBpbnB1dHMgaW4gXFwnRm4oKVxcJy4nICk7XHJcblxyXG5cdFx0XHRcdHBhcmFtZXRlcnMubGVuZ3RoID0gaW5wdXRzLmxlbmd0aDtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIHBhcmFtZXRlcnMubGVuZ3RoIDwgaW5wdXRzLmxlbmd0aCApIHtcclxuXHJcblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlRTTDogVGhlIG51bWJlciBvZiBwcm92aWRlZCBwYXJhbWV0ZXJzIGlzIGxlc3MgdGhhbiB0aGUgZXhwZWN0ZWQgbnVtYmVyIG9mIGlucHV0cyBpbiBcXCdGbigpXFwnLicgKTtcclxuXHJcblx0XHRcdFx0d2hpbGUgKCBwYXJhbWV0ZXJzLmxlbmd0aCA8IGlucHV0cy5sZW5ndGggKSB7XHJcblxyXG5cdFx0XHRcdFx0cGFyYW1ldGVycy5wdXNoKCBmbG9hdCggMCApICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHBhcmFtZXRlcnMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRwYXJhbXMucHVzaCggZ2VuZXJhdGVJbnB1dCggcGFyYW1ldGVyc1sgaSBdLCBpbnB1dHNbIGkgXSApICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGZvciAoIGNvbnN0IGlucHV0Tm9kZSBvZiBpbnB1dHMgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IG5vZGUgPSBwYXJhbWV0ZXJzWyBpbnB1dE5vZGUubmFtZSBdO1xyXG5cclxuXHRcdFx0XHRpZiAoIG5vZGUgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRwYXJhbXMucHVzaCggZ2VuZXJhdGVJbnB1dCggbm9kZSwgaW5wdXROb2RlICkgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCBgVEhSRUUuVFNMOiBJbnB1dCAnJHsgaW5wdXROb2RlLm5hbWUgfScgbm90IGZvdW5kIGluIFxcJ0ZuKClcXCcuYCApO1xyXG5cclxuXHRcdFx0XHRcdHBhcmFtcy5wdXNoKCBnZW5lcmF0ZUlucHV0KCBmbG9hdCggMCApLCBpbnB1dE5vZGUgKSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGZ1bmN0aW9uTmFtZSA9IGZ1bmN0aW9uTm9kZS5idWlsZCggYnVpbGRlciwgJ3Byb3BlcnR5JyApO1xyXG5cclxuXHRcdHJldHVybiBgJHsgZnVuY3Rpb25OYW1lIH0oICR7IHBhcmFtcy5qb2luKCAnLCAnICkgfSApYDtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgRnVuY3Rpb25DYWxsTm9kZTtcclxuXHJcbmV4cG9ydCBjb25zdCBjYWxsID0gKCBmdW5jLCAuLi5wYXJhbXMgKSA9PiB7XHJcblxyXG5cdHBhcmFtcyA9IHBhcmFtcy5sZW5ndGggPiAxIHx8ICggcGFyYW1zWyAwIF0gJiYgcGFyYW1zWyAwIF0uaXNOb2RlID09PSB0cnVlICkgPyBub2RlQXJyYXkoIHBhcmFtcyApIDogbm9kZU9iamVjdHMoIHBhcmFtc1sgMCBdICk7XHJcblxyXG5cdHJldHVybiBub2RlT2JqZWN0KCBuZXcgRnVuY3Rpb25DYWxsTm9kZSggbm9kZU9iamVjdCggZnVuYyApLCBwYXJhbXMgKSApO1xyXG5cclxufTtcclxuXHJcbmFkZE1ldGhvZENoYWluaW5nKCAnY2FsbCcsIGNhbGwgKTtcclxuIiwiaW1wb3J0IHsgV2ViR0xDb29yZGluYXRlU3lzdGVtIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IFRlbXBOb2RlIGZyb20gJy4uL2NvcmUvVGVtcE5vZGUuanMnO1xyXG5pbXBvcnQgeyBhZGRNZXRob2RDaGFpbmluZywgaW50LCBub2RlUHJveHkgfSBmcm9tICcuLi90c2wvVFNMQ29yZS5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBub2RlIHJlcHJlc2VudHMgYmFzaWMgbWF0aGVtYXRpY2FsIGFuZCBsb2dpY2FsIG9wZXJhdGlvbnMgbGlrZSBhZGRpdGlvbixcclxuICogc3VidHJhY3Rpb24gb3IgY29tcGFyaXNvbnMgKGUuZy4gYGVxdWFsKClgKS5cclxuICpcclxuICogQGF1Z21lbnRzIFRlbXBOb2RlXHJcbiAqL1xyXG5jbGFzcyBPcGVyYXRvck5vZGUgZXh0ZW5kcyBUZW1wTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ09wZXJhdG9yTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBvcGVyYXRvciBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG9wIC0gVGhlIG9wZXJhdG9yLlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gYU5vZGUgLSBUaGUgZmlyc3QgaW5wdXQuXHJcblx0ICogQHBhcmFtIHtOb2RlfSBiTm9kZSAtIFRoZSBzZWNvbmQgaW5wdXQuXHJcblx0ICogQHBhcmFtIHsuLi5Ob2RlfSBwYXJhbXMgLSBBZGRpdGlvbmFsIGlucHV0IHBhcmFtZXRlcnMuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG9wLCBhTm9kZSwgYk5vZGUsIC4uLnBhcmFtcyApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdGlmICggcGFyYW1zLmxlbmd0aCA+IDAgKSB7XHJcblxyXG5cdFx0XHRsZXQgZmluYWxPcCA9IG5ldyBPcGVyYXRvck5vZGUoIG9wLCBhTm9kZSwgYk5vZGUgKTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGggLSAxOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRmaW5hbE9wID0gbmV3IE9wZXJhdG9yTm9kZSggb3AsIGZpbmFsT3AsIHBhcmFtc1sgaSBdICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRhTm9kZSA9IGZpbmFsT3A7XHJcblx0XHRcdGJOb2RlID0gcGFyYW1zWyBwYXJhbXMubGVuZ3RoIC0gMSBdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBvcGVyYXRvci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm9wID0gb3A7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZmlyc3QgaW5wdXQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYU5vZGUgPSBhTm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBzZWNvbmQgaW5wdXQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYk5vZGUgPSBiTm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNPcGVyYXRvck5vZGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGlzIG92ZXJ3cml0dGVuIHNpbmNlIHRoZSBub2RlIHR5cGUgaXMgaW5mZXJyZWQgZnJvbSB0aGUgb3BlcmF0b3JcclxuXHQgKiBhbmQgdGhlIGlucHV0IG5vZGUgdHlwZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBvdXRwdXQgLSBUaGUgY3VycmVudCBvdXRwdXQgc3RyaW5nLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG5vZGUgdHlwZS5cclxuXHQgKi9cclxuXHRnZXROb2RlVHlwZSggYnVpbGRlciwgb3V0cHV0ICkge1xyXG5cclxuXHRcdGNvbnN0IG9wID0gdGhpcy5vcDtcclxuXHJcblx0XHRjb25zdCBhTm9kZSA9IHRoaXMuYU5vZGU7XHJcblx0XHRjb25zdCBiTm9kZSA9IHRoaXMuYk5vZGU7XHJcblxyXG5cdFx0Y29uc3QgdHlwZUEgPSBhTm9kZS5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cdFx0Y29uc3QgdHlwZUIgPSB0eXBlb2YgYk5vZGUgIT09ICd1bmRlZmluZWQnID8gYk5vZGUuZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKSA6IG51bGw7XHJcblxyXG5cdFx0aWYgKCB0eXBlQSA9PT0gJ3ZvaWQnIHx8IHR5cGVCID09PSAndm9pZCcgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gJ3ZvaWQnO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIG9wID09PSAnJScgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gdHlwZUE7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggb3AgPT09ICd+JyB8fCBvcCA9PT0gJyYnIHx8IG9wID09PSAnfCcgfHwgb3AgPT09ICdeJyB8fCBvcCA9PT0gJz4+JyB8fCBvcCA9PT0gJzw8JyApIHtcclxuXHJcblx0XHRcdHJldHVybiBidWlsZGVyLmdldEludGVnZXJUeXBlKCB0eXBlQSApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIG9wID09PSAnIScgfHwgb3AgPT09ICc9PScgfHwgb3AgPT09ICchPScgfHwgb3AgPT09ICcmJicgfHwgb3AgPT09ICd8fCcgfHwgb3AgPT09ICdeXicgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gJ2Jvb2wnO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIG9wID09PSAnPCcgfHwgb3AgPT09ICc+JyB8fCBvcCA9PT0gJzw9JyB8fCBvcCA9PT0gJz49JyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHR5cGVMZW5ndGggPSBvdXRwdXQgPyBidWlsZGVyLmdldFR5cGVMZW5ndGgoIG91dHB1dCApIDogTWF0aC5tYXgoIGJ1aWxkZXIuZ2V0VHlwZUxlbmd0aCggdHlwZUEgKSwgYnVpbGRlci5nZXRUeXBlTGVuZ3RoKCB0eXBlQiApICk7XHJcblxyXG5cdFx0XHRyZXR1cm4gdHlwZUxlbmd0aCA+IDEgPyBgYnZlYyR7IHR5cGVMZW5ndGggfWAgOiAnYm9vbCc7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdC8vIEhhbmRsZSBtYXRyaXggb3BlcmF0aW9uc1xyXG5cclxuXHRcdFx0aWYgKCBidWlsZGVyLmlzTWF0cml4KCB0eXBlQSApICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIHR5cGVCID09PSAnZmxvYXQnICkge1xyXG5cclxuXHRcdFx0XHRcdHJldHVybiB0eXBlQTsgLy8gbWF0cml4ICogc2NhbGFyID0gbWF0cml4XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGJ1aWxkZXIuaXNWZWN0b3IoIHR5cGVCICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIGJ1aWxkZXIuZ2V0VmVjdG9yRnJvbU1hdHJpeCggdHlwZUEgKTsgLy8gbWF0cml4ICogdmVjdG9yXHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGJ1aWxkZXIuaXNNYXRyaXgoIHR5cGVCICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIHR5cGVBOyAvLyBtYXRyaXggKiBtYXRyaXhcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggYnVpbGRlci5pc01hdHJpeCggdHlwZUIgKSApIHtcclxuXHJcblx0XHRcdFx0aWYgKCB0eXBlQSA9PT0gJ2Zsb2F0JyApIHtcclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gdHlwZUI7IC8vIHNjYWxhciAqIG1hdHJpeCA9IG1hdHJpeFxyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCBidWlsZGVyLmlzVmVjdG9yKCB0eXBlQSApICkge1xyXG5cclxuXHRcdFx0XHRcdHJldHVybiBidWlsZGVyLmdldFZlY3RvckZyb21NYXRyaXgoIHR5cGVCICk7IC8vIHZlY3RvciAqIG1hdHJpeFxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBIYW5kbGUgbm9uLW1hdHJpeCBjYXNlc1xyXG5cclxuXHRcdFx0aWYgKCBidWlsZGVyLmdldFR5cGVMZW5ndGgoIHR5cGVCICkgPiBidWlsZGVyLmdldFR5cGVMZW5ndGgoIHR5cGVBICkgKSB7XHJcblxyXG5cdFx0XHRcdC8vIGFueXR5cGUgeCBhbnl0eXBlOiB1c2UgdGhlIGdyZWF0ZXIgbGVuZ3RoIHZlY3RvclxyXG5cclxuXHRcdFx0XHRyZXR1cm4gdHlwZUI7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gdHlwZUE7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGdlbmVyYXRlKCBidWlsZGVyLCBvdXRwdXQgKSB7XHJcblxyXG5cdFx0Y29uc3Qgb3AgPSB0aGlzLm9wO1xyXG5cclxuXHRcdGNvbnN0IGFOb2RlID0gdGhpcy5hTm9kZTtcclxuXHRcdGNvbnN0IGJOb2RlID0gdGhpcy5iTm9kZTtcclxuXHJcblx0XHRjb25zdCB0eXBlID0gdGhpcy5nZXROb2RlVHlwZSggYnVpbGRlciwgb3V0cHV0ICk7XHJcblxyXG5cdFx0bGV0IHR5cGVBID0gbnVsbDtcclxuXHRcdGxldCB0eXBlQiA9IG51bGw7XHJcblxyXG5cdFx0aWYgKCB0eXBlICE9PSAndm9pZCcgKSB7XHJcblxyXG5cdFx0XHR0eXBlQSA9IGFOb2RlLmdldE5vZGVUeXBlKCBidWlsZGVyICk7XHJcblx0XHRcdHR5cGVCID0gdHlwZW9mIGJOb2RlICE9PSAndW5kZWZpbmVkJyA/IGJOb2RlLmdldE5vZGVUeXBlKCBidWlsZGVyICkgOiBudWxsO1xyXG5cclxuXHRcdFx0aWYgKCBvcCA9PT0gJzwnIHx8IG9wID09PSAnPicgfHwgb3AgPT09ICc8PScgfHwgb3AgPT09ICc+PScgfHwgb3AgPT09ICc9PScgfHwgb3AgPT09ICchPScgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggYnVpbGRlci5pc1ZlY3RvciggdHlwZUEgKSApIHtcclxuXHJcblx0XHRcdFx0XHR0eXBlQiA9IHR5cGVBO1xyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCB0eXBlQSAhPT0gdHlwZUIgKSB7XHJcblxyXG5cdFx0XHRcdFx0dHlwZUEgPSB0eXBlQiA9ICdmbG9hdCc7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIG9wID09PSAnPj4nIHx8IG9wID09PSAnPDwnICkge1xyXG5cclxuXHRcdFx0XHR0eXBlQSA9IHR5cGU7XHJcblx0XHRcdFx0dHlwZUIgPSBidWlsZGVyLmNoYW5nZUNvbXBvbmVudFR5cGUoIHR5cGVCLCAndWludCcgKTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIG9wID09PSAnJScgKSB7XHJcblxyXG5cdFx0XHRcdHR5cGVBID0gdHlwZTtcclxuXHRcdFx0XHR0eXBlQiA9IGJ1aWxkZXIuaXNJbnRlZ2VyKCB0eXBlQSApICYmIGJ1aWxkZXIuaXNJbnRlZ2VyKCB0eXBlQiApID8gdHlwZUIgOiB0eXBlQTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGJ1aWxkZXIuaXNNYXRyaXgoIHR5cGVBICkgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggdHlwZUIgPT09ICdmbG9hdCcgKSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gS2VlcCBtYXRyaXggdHlwZSBmb3IgdHlwZUEsIGJ1dCBlbnN1cmUgdHlwZUIgc3RheXMgZmxvYXRcclxuXHJcblx0XHRcdFx0XHR0eXBlQiA9ICdmbG9hdCc7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGJ1aWxkZXIuaXNWZWN0b3IoIHR5cGVCICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gbWF0cml4IHggdmVjdG9yXHJcblx0XHRcdFx0XHR0eXBlQiA9IGJ1aWxkZXIuZ2V0VmVjdG9yRnJvbU1hdHJpeCggdHlwZUEgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggYnVpbGRlci5pc01hdHJpeCggdHlwZUIgKSApIHtcclxuXHJcblx0XHRcdFx0XHQvLyBtYXRyaXggeCBtYXRyaXggLSBrZWVwIGJvdGggdHlwZXNcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHR0eXBlQSA9IHR5cGVCID0gdHlwZTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggYnVpbGRlci5pc01hdHJpeCggdHlwZUIgKSApIHtcclxuXHJcblx0XHRcdFx0aWYgKCB0eXBlQSA9PT0gJ2Zsb2F0JyApIHtcclxuXHJcblx0XHRcdFx0XHQvLyBLZWVwIG1hdHJpeCB0eXBlIGZvciB0eXBlQiwgYnV0IGVuc3VyZSB0eXBlQSBzdGF5cyBmbG9hdFxyXG5cclxuXHRcdFx0XHRcdHR5cGVBID0gJ2Zsb2F0JztcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggYnVpbGRlci5pc1ZlY3RvciggdHlwZUEgKSApIHtcclxuXHJcblx0XHRcdFx0XHQvLyB2ZWN0b3IgeCBtYXRyaXhcclxuXHJcblx0XHRcdFx0XHR0eXBlQSA9IGJ1aWxkZXIuZ2V0VmVjdG9yRnJvbU1hdHJpeCggdHlwZUIgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHR0eXBlQSA9IHR5cGVCID0gdHlwZTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0Ly8gYW55dHlwZSB4IGFueXR5cGVcclxuXHJcblx0XHRcdFx0dHlwZUEgPSB0eXBlQiA9IHR5cGU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHR5cGVBID0gdHlwZUIgPSB0eXBlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBhID0gYU5vZGUuYnVpbGQoIGJ1aWxkZXIsIHR5cGVBICk7XHJcblx0XHRjb25zdCBiID0gdHlwZW9mIGJOb2RlICE9PSAndW5kZWZpbmVkJyA/IGJOb2RlLmJ1aWxkKCBidWlsZGVyLCB0eXBlQiApIDogbnVsbDtcclxuXHJcblx0XHRjb25zdCBvdXRwdXRMZW5ndGggPSBidWlsZGVyLmdldFR5cGVMZW5ndGgoIG91dHB1dCApO1xyXG5cdFx0Y29uc3QgZm5PcFNuaXBwZXQgPSBidWlsZGVyLmdldEZ1bmN0aW9uT3BlcmF0b3IoIG9wICk7XHJcblxyXG5cdFx0aWYgKCBvdXRwdXQgIT09ICd2b2lkJyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGlzR0xTTCA9IGJ1aWxkZXIucmVuZGVyZXIuY29vcmRpbmF0ZVN5c3RlbSA9PT0gV2ViR0xDb29yZGluYXRlU3lzdGVtO1xyXG5cclxuXHRcdFx0aWYgKCBvcCA9PT0gJz09JyApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBpc0dMU0wgKSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBvdXRwdXRMZW5ndGggPiAxICkge1xyXG5cclxuXHRcdFx0XHRcdFx0cmV0dXJuIGJ1aWxkZXIuZm9ybWF0KCBgJHsgYnVpbGRlci5nZXRNZXRob2QoICdlcXVhbCcsIG91dHB1dCApIH0oICR7IGEgfSwgJHsgYiB9IClgLCB0eXBlLCBvdXRwdXQgKTtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0cmV0dXJuIGJ1aWxkZXIuZm9ybWF0KCBgKCAkeyBhIH0gJHsgb3AgfSAkeyBiIH0gKWAsIHR5cGUsIG91dHB1dCApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHQvLyBXR1NMXHJcblxyXG5cdFx0XHRcdFx0aWYgKCBvdXRwdXRMZW5ndGggPiAxIHx8ICEgYnVpbGRlci5pc1ZlY3RvciggdHlwZUEgKSApIHtcclxuXHJcblx0XHRcdFx0XHRcdHJldHVybiBidWlsZGVyLmZvcm1hdCggYCggJHsgYSB9ID09ICR7IGIgfSApYCwgdHlwZSwgb3V0cHV0ICk7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdHJldHVybiBidWlsZGVyLmZvcm1hdCggYGFsbCggJHsgYSB9ID09ICR7IGIgfSApYCwgdHlwZSwgb3V0cHV0ICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBvcCA9PT0gJzwnICYmIG91dHB1dExlbmd0aCA+IDEgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggaXNHTFNMICkge1xyXG5cclxuXHRcdFx0XHRcdHJldHVybiBidWlsZGVyLmZvcm1hdCggYCR7IGJ1aWxkZXIuZ2V0TWV0aG9kKCAnbGVzc1RoYW4nLCBvdXRwdXQgKSB9KCAkeyBhIH0sICR7IGIgfSApYCwgdHlwZSwgb3V0cHV0ICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gV0dTTFxyXG5cclxuXHRcdFx0XHRcdHJldHVybiBidWlsZGVyLmZvcm1hdCggYCggJHsgYSB9IDwgJHsgYiB9IClgLCB0eXBlLCBvdXRwdXQgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggb3AgPT09ICc8PScgJiYgb3V0cHV0TGVuZ3RoID4gMSApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBpc0dMU0wgKSB7XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIGJ1aWxkZXIuZm9ybWF0KCBgJHsgYnVpbGRlci5nZXRNZXRob2QoICdsZXNzVGhhbkVxdWFsJywgb3V0cHV0ICkgfSggJHsgYSB9LCAkeyBiIH0gKWAsIHR5cGUsIG91dHB1dCApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdC8vIFdHU0xcclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gYnVpbGRlci5mb3JtYXQoIGAoICR7IGEgfSA8PSAkeyBiIH0gKWAsIHR5cGUsIG91dHB1dCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBvcCA9PT0gJz4nICYmIG91dHB1dExlbmd0aCA+IDEgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggaXNHTFNMICkge1xyXG5cclxuXHRcdFx0XHRcdHJldHVybiBidWlsZGVyLmZvcm1hdCggYCR7IGJ1aWxkZXIuZ2V0TWV0aG9kKCAnZ3JlYXRlclRoYW4nLCBvdXRwdXQgKSB9KCAkeyBhIH0sICR7IGIgfSApYCwgdHlwZSwgb3V0cHV0ICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gV0dTTFxyXG5cclxuXHRcdFx0XHRcdHJldHVybiBidWlsZGVyLmZvcm1hdCggYCggJHsgYSB9ID4gJHsgYiB9IClgLCB0eXBlLCBvdXRwdXQgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggb3AgPT09ICc+PScgJiYgb3V0cHV0TGVuZ3RoID4gMSApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBpc0dMU0wgKSB7XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIGJ1aWxkZXIuZm9ybWF0KCBgJHsgYnVpbGRlci5nZXRNZXRob2QoICdncmVhdGVyVGhhbkVxdWFsJywgb3V0cHV0ICkgfSggJHsgYSB9LCAkeyBiIH0gKWAsIHR5cGUsIG91dHB1dCApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdC8vIFdHU0xcclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gYnVpbGRlci5mb3JtYXQoIGAoICR7IGEgfSA+PSAkeyBiIH0gKWAsIHR5cGUsIG91dHB1dCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBvcCA9PT0gJyUnICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIGJ1aWxkZXIuaXNJbnRlZ2VyKCB0eXBlQiApICkge1xyXG5cclxuXHRcdFx0XHRcdHJldHVybiBidWlsZGVyLmZvcm1hdCggYCggJHsgYSB9ICUgJHsgYiB9IClgLCB0eXBlLCBvdXRwdXQgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gYnVpbGRlci5mb3JtYXQoIGAkeyBidWlsZGVyLmdldE1ldGhvZCggJ21vZCcsIHR5cGUgKSB9KCAkeyBhIH0sICR7IGIgfSApYCwgdHlwZSwgb3V0cHV0ICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIG9wID09PSAnIScgfHwgb3AgPT09ICd+JyApIHtcclxuXHJcblx0XHRcdFx0cmV0dXJuIGJ1aWxkZXIuZm9ybWF0KCBgKCR7b3B9JHthfSlgLCB0eXBlQSwgb3V0cHV0ICk7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBmbk9wU25pcHBldCApIHtcclxuXHJcblx0XHRcdFx0cmV0dXJuIGJ1aWxkZXIuZm9ybWF0KCBgJHsgZm5PcFNuaXBwZXQgfSggJHsgYSB9LCAkeyBiIH0gKWAsIHR5cGUsIG91dHB1dCApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0Ly8gSGFuZGxlIG1hdHJpeCBvcGVyYXRpb25zXHJcblxyXG5cdFx0XHRcdGlmICggYnVpbGRlci5pc01hdHJpeCggdHlwZUEgKSAmJiB0eXBlQiA9PT0gJ2Zsb2F0JyApIHtcclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gYnVpbGRlci5mb3JtYXQoIGAoICR7IGIgfSAkeyBvcCB9ICR7IGEgfSApYCwgdHlwZSwgb3V0cHV0ICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIHR5cGVBID09PSAnZmxvYXQnICYmIGJ1aWxkZXIuaXNNYXRyaXgoIHR5cGVCICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIGJ1aWxkZXIuZm9ybWF0KCBgJHsgYSB9ICR7IG9wIH0gJHsgYiB9YCwgdHlwZSwgb3V0cHV0ICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0bGV0IHNuaXBwZXQgPSBgKCAkeyBhIH0gJHsgb3AgfSAkeyBiIH0gKWA7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCAhIGlzR0xTTCAmJiB0eXBlID09PSAnYm9vbCcgJiYgYnVpbGRlci5pc1ZlY3RvciggdHlwZUEgKSAmJiBidWlsZGVyLmlzVmVjdG9yKCB0eXBlQiApICkge1xyXG5cclxuXHRcdFx0XHRcdFx0c25pcHBldCA9IGBhbGwkeyBzbmlwcGV0IH1gO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gYnVpbGRlci5mb3JtYXQoIHNuaXBwZXQsIHR5cGUsIG91dHB1dCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmICggdHlwZUEgIT09ICd2b2lkJyApIHtcclxuXHJcblx0XHRcdGlmICggZm5PcFNuaXBwZXQgKSB7XHJcblxyXG5cdFx0XHRcdHJldHVybiBidWlsZGVyLmZvcm1hdCggYCR7IGZuT3BTbmlwcGV0IH0oICR7IGEgfSwgJHsgYiB9IClgLCB0eXBlLCBvdXRwdXQgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGlmICggYnVpbGRlci5pc01hdHJpeCggdHlwZUEgKSAmJiB0eXBlQiA9PT0gJ2Zsb2F0JyApIHtcclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gYnVpbGRlci5mb3JtYXQoIGAkeyBiIH0gJHsgb3AgfSAkeyBhIH1gLCB0eXBlLCBvdXRwdXQgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gYnVpbGRlci5mb3JtYXQoIGAkeyBhIH0gJHsgb3AgfSAkeyBiIH1gLCB0eXBlLCBvdXRwdXQgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRzZXJpYWxpemUoIGRhdGEgKSB7XHJcblxyXG5cdFx0c3VwZXIuc2VyaWFsaXplKCBkYXRhICk7XHJcblxyXG5cdFx0ZGF0YS5vcCA9IHRoaXMub3A7XHJcblxyXG5cdH1cclxuXHJcblx0ZGVzZXJpYWxpemUoIGRhdGEgKSB7XHJcblxyXG5cdFx0c3VwZXIuZGVzZXJpYWxpemUoIGRhdGEgKTtcclxuXHJcblx0XHR0aGlzLm9wID0gZGF0YS5vcDtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgT3BlcmF0b3JOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIGFkZGl0aW9uIG9mIHR3byBvciBtb3JlIHZhbHVlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IGEgLSBUaGUgZmlyc3QgaW5wdXQuXHJcbiAqIEBwYXJhbSB7Tm9kZX0gYiAtIFRoZSBzZWNvbmQgaW5wdXQuXHJcbiAqIEBwYXJhbSB7Li4uTm9kZX0gcGFyYW1zIC0gQWRkaXRpb25hbCBpbnB1dCBwYXJhbWV0ZXJzLlxyXG4gKiBAcmV0dXJucyB7T3BlcmF0b3JOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGFkZCA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBPcGVyYXRvck5vZGUsICcrJyApLnNldFBhcmFtZXRlckxlbmd0aCggMiwgSW5maW5pdHkgKS5zZXROYW1lKCAnYWRkJyApO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIHN1YnRyYWN0aW9uIG9mIHR3byBvciBtb3JlIHZhbHVlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IGEgLSBUaGUgZmlyc3QgaW5wdXQuXHJcbiAqIEBwYXJhbSB7Tm9kZX0gYiAtIFRoZSBzZWNvbmQgaW5wdXQuXHJcbiAqIEBwYXJhbSB7Li4uTm9kZX0gcGFyYW1zIC0gQWRkaXRpb25hbCBpbnB1dCBwYXJhbWV0ZXJzLlxyXG4gKiBAcmV0dXJucyB7T3BlcmF0b3JOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHN1YiA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBPcGVyYXRvck5vZGUsICctJyApLnNldFBhcmFtZXRlckxlbmd0aCggMiwgSW5maW5pdHkgKS5zZXROYW1lKCAnc3ViJyApO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIG11bHRpcGxpY2F0aW9uIG9mIHR3byBvciBtb3JlIHZhbHVlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IGEgLSBUaGUgZmlyc3QgaW5wdXQuXHJcbiAqIEBwYXJhbSB7Tm9kZX0gYiAtIFRoZSBzZWNvbmQgaW5wdXQuXHJcbiAqIEBwYXJhbSB7Li4uTm9kZX0gcGFyYW1zIC0gQWRkaXRpb25hbCBpbnB1dCBwYXJhbWV0ZXJzLlxyXG4gKiBAcmV0dXJucyB7T3BlcmF0b3JOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG11bCA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBPcGVyYXRvck5vZGUsICcqJyApLnNldFBhcmFtZXRlckxlbmd0aCggMiwgSW5maW5pdHkgKS5zZXROYW1lKCAnbXVsJyApO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIGRpdmlzaW9uIG9mIHR3byBvciBtb3JlIHZhbHVlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IGEgLSBUaGUgZmlyc3QgaW5wdXQuXHJcbiAqIEBwYXJhbSB7Tm9kZX0gYiAtIFRoZSBzZWNvbmQgaW5wdXQuXHJcbiAqIEBwYXJhbSB7Li4uTm9kZX0gcGFyYW1zIC0gQWRkaXRpb25hbCBpbnB1dCBwYXJhbWV0ZXJzLlxyXG4gKiBAcmV0dXJucyB7T3BlcmF0b3JOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGRpdiA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBPcGVyYXRvck5vZGUsICcvJyApLnNldFBhcmFtZXRlckxlbmd0aCggMiwgSW5maW5pdHkgKS5zZXROYW1lKCAnZGl2JyApO1xyXG5cclxuLyoqXHJcbiAqIENvbXB1dGVzIHRoZSByZW1haW5kZXIgb2YgZGl2aWRpbmcgdGhlIGZpcnN0IG5vZGUgYnkgdGhlIHNlY29uZCBvbmUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZX0gYSAtIFRoZSBmaXJzdCBpbnB1dC5cclxuICogQHBhcmFtIHtOb2RlfSBiIC0gVGhlIHNlY29uZCBpbnB1dC5cclxuICogQHJldHVybnMge09wZXJhdG9yTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBtb2QgPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggT3BlcmF0b3JOb2RlLCAnJScgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDIgKS5zZXROYW1lKCAnbW9kJyApO1xyXG5cclxuLyoqXHJcbiAqIENoZWNrcyBpZiB0d28gbm9kZXMgYXJlIGVxdWFsLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IGEgLSBUaGUgZmlyc3QgaW5wdXQuXHJcbiAqIEBwYXJhbSB7Tm9kZX0gYiAtIFRoZSBzZWNvbmQgaW5wdXQuXHJcbiAqIEByZXR1cm5zIHtPcGVyYXRvck5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZXF1YWwgPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggT3BlcmF0b3JOb2RlLCAnPT0nICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAyICkuc2V0TmFtZSggJ2VxdWFsJyApO1xyXG5cclxuLyoqXHJcbiAqIENoZWNrcyBpZiB0d28gbm9kZXMgYXJlIG5vdCBlcXVhbC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlfSBhIC0gVGhlIGZpcnN0IGlucHV0LlxyXG4gKiBAcGFyYW0ge05vZGV9IGIgLSBUaGUgc2Vjb25kIGlucHV0LlxyXG4gKiBAcmV0dXJucyB7T3BlcmF0b3JOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG5vdEVxdWFsID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE9wZXJhdG9yTm9kZSwgJyE9JyApLnNldFBhcmFtZXRlckxlbmd0aCggMiApLnNldE5hbWUoICdub3RFcXVhbCcgKTtcclxuXHJcbi8qKlxyXG4gKiBDaGVja3MgaWYgdGhlIGZpcnN0IG5vZGUgaXMgbGVzcyB0aGFuIHRoZSBzZWNvbmQuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZX0gYSAtIFRoZSBmaXJzdCBpbnB1dC5cclxuICogQHBhcmFtIHtOb2RlfSBiIC0gVGhlIHNlY29uZCBpbnB1dC5cclxuICogQHJldHVybnMge09wZXJhdG9yTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBsZXNzVGhhbiA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBPcGVyYXRvck5vZGUsICc8JyApLnNldFBhcmFtZXRlckxlbmd0aCggMiApLnNldE5hbWUoICdsZXNzVGhhbicgKTtcclxuXHJcbi8qKlxyXG4gKiBDaGVja3MgaWYgdGhlIGZpcnN0IG5vZGUgaXMgZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZX0gYSAtIFRoZSBmaXJzdCBpbnB1dC5cclxuICogQHBhcmFtIHtOb2RlfSBiIC0gVGhlIHNlY29uZCBpbnB1dC5cclxuICogQHJldHVybnMge09wZXJhdG9yTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBncmVhdGVyVGhhbiA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBPcGVyYXRvck5vZGUsICc+JyApLnNldFBhcmFtZXRlckxlbmd0aCggMiApLnNldE5hbWUoICdncmVhdGVyVGhhbicgKTtcclxuXHJcbi8qKlxyXG4gKiBDaGVja3MgaWYgdGhlIGZpcnN0IG5vZGUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzZWNvbmQuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZX0gYSAtIFRoZSBmaXJzdCBpbnB1dC5cclxuICogQHBhcmFtIHtOb2RlfSBiIC0gVGhlIHNlY29uZCBpbnB1dC5cclxuICogQHJldHVybnMge09wZXJhdG9yTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBsZXNzVGhhbkVxdWFsID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE9wZXJhdG9yTm9kZSwgJzw9JyApLnNldFBhcmFtZXRlckxlbmd0aCggMiApLnNldE5hbWUoICdsZXNzVGhhbkVxdWFsJyApO1xyXG5cclxuLyoqXHJcbiAqIENoZWNrcyBpZiB0aGUgZmlyc3Qgbm9kZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNlY29uZC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlfSBhIC0gVGhlIGZpcnN0IGlucHV0LlxyXG4gKiBAcGFyYW0ge05vZGV9IGIgLSBUaGUgc2Vjb25kIGlucHV0LlxyXG4gKiBAcmV0dXJucyB7T3BlcmF0b3JOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGdyZWF0ZXJUaGFuRXF1YWwgPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggT3BlcmF0b3JOb2RlLCAnPj0nICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAyICkuc2V0TmFtZSggJ2dyZWF0ZXJUaGFuRXF1YWwnICk7XHJcblxyXG4vKipcclxuICogUGVyZm9ybXMgYSBsb2dpY2FsIEFORCBvcGVyYXRpb24gb24gbXVsdGlwbGUgbm9kZXMuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Li4uTm9kZX0gbm9kZXMgLSBUaGUgaW5wdXQgbm9kZXMgdG8gYmUgY29tYmluZWQgdXNpbmcgQU5ELlxyXG4gKiBAcmV0dXJucyB7T3BlcmF0b3JOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGFuZCA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBPcGVyYXRvck5vZGUsICcmJicgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDIsIEluZmluaXR5ICkuc2V0TmFtZSggJ2FuZCcgKTtcclxuXHJcbi8qKlxyXG4gKiBQZXJmb3JtcyBhIGxvZ2ljYWwgT1Igb3BlcmF0aW9uIG9uIG11bHRpcGxlIG5vZGVzLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0gey4uLk5vZGV9IG5vZGVzIC0gVGhlIGlucHV0IG5vZGVzIHRvIGJlIGNvbWJpbmVkIHVzaW5nIE9SLlxyXG4gKiBAcmV0dXJucyB7T3BlcmF0b3JOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG9yID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE9wZXJhdG9yTm9kZSwgJ3x8JyApLnNldFBhcmFtZXRlckxlbmd0aCggMiwgSW5maW5pdHkgKS5zZXROYW1lKCAnb3InICk7XHJcblxyXG4vKipcclxuICogUGVyZm9ybXMgbG9naWNhbCBOT1Qgb24gYSBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IHZhbHVlIC0gVGhlIHZhbHVlLlxyXG4gKiBAcmV0dXJucyB7T3BlcmF0b3JOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG5vdCA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBPcGVyYXRvck5vZGUsICchJyApLnNldFBhcmFtZXRlckxlbmd0aCggMSApLnNldE5hbWUoICdub3QnICk7XHJcblxyXG4vKipcclxuICogUGVyZm9ybXMgbG9naWNhbCBYT1Igb24gdHdvIG5vZGVzLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IGEgLSBUaGUgZmlyc3QgaW5wdXQuXHJcbiAqIEBwYXJhbSB7Tm9kZX0gYiAtIFRoZSBzZWNvbmQgaW5wdXQuXHJcbiAqIEByZXR1cm5zIHtPcGVyYXRvck5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgeG9yID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE9wZXJhdG9yTm9kZSwgJ15eJyApLnNldFBhcmFtZXRlckxlbmd0aCggMiApLnNldE5hbWUoICd4b3InICk7XHJcblxyXG4vKipcclxuICogUGVyZm9ybXMgYml0d2lzZSBBTkQgb24gdHdvIG5vZGVzLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IGEgLSBUaGUgZmlyc3QgaW5wdXQuXHJcbiAqIEBwYXJhbSB7Tm9kZX0gYiAtIFRoZSBzZWNvbmQgaW5wdXQuXHJcbiAqIEByZXR1cm5zIHtPcGVyYXRvck5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYml0QW5kID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE9wZXJhdG9yTm9kZSwgJyYnICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAyICkuc2V0TmFtZSggJ2JpdEFuZCcgKTtcclxuXHJcbi8qKlxyXG4gKiBQZXJmb3JtcyBiaXR3aXNlIE5PVCBvbiBhIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZX0gYSAtIFRoZSBmaXJzdCBpbnB1dC5cclxuICogQHBhcmFtIHtOb2RlfSBiIC0gVGhlIHNlY29uZCBpbnB1dC5cclxuICogQHJldHVybnMge09wZXJhdG9yTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBiaXROb3QgPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggT3BlcmF0b3JOb2RlLCAnficgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDIgKS5zZXROYW1lKCAnYml0Tm90JyApO1xyXG5cclxuLyoqXHJcbiAqIFBlcmZvcm1zIGJpdHdpc2UgT1Igb24gdHdvIG5vZGVzLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IGEgLSBUaGUgZmlyc3QgaW5wdXQuXHJcbiAqIEBwYXJhbSB7Tm9kZX0gYiAtIFRoZSBzZWNvbmQgaW5wdXQuXHJcbiAqIEByZXR1cm5zIHtPcGVyYXRvck5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYml0T3IgPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggT3BlcmF0b3JOb2RlLCAnfCcgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDIgKS5zZXROYW1lKCAnYml0T3InICk7XHJcblxyXG4vKipcclxuICogUGVyZm9ybXMgYml0d2lzZSBYT1Igb24gdHdvIG5vZGVzLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IGEgLSBUaGUgZmlyc3QgaW5wdXQuXHJcbiAqIEBwYXJhbSB7Tm9kZX0gYiAtIFRoZSBzZWNvbmQgaW5wdXQuXHJcbiAqIEByZXR1cm5zIHtPcGVyYXRvck5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYml0WG9yID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE9wZXJhdG9yTm9kZSwgJ14nICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAyICkuc2V0TmFtZSggJ2JpdFhvcicgKTtcclxuXHJcbi8qKlxyXG4gKiBTaGlmdHMgYSBub2RlIHRvIHRoZSBsZWZ0LlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IGEgLSBUaGUgbm9kZSB0byBzaGlmdC5cclxuICogQHBhcmFtIHtOb2RlfSBiIC0gVGhlIHZhbHVlIHRvIHNoaWZ0LlxyXG4gKiBAcmV0dXJucyB7T3BlcmF0b3JOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHNoaWZ0TGVmdCA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBPcGVyYXRvck5vZGUsICc8PCcgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDIgKS5zZXROYW1lKCAnc2hpZnRMZWZ0JyApO1xyXG5cclxuLyoqXHJcbiAqIFNoaWZ0cyBhIG5vZGUgdG8gdGhlIHJpZ2h0LlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IGEgLSBUaGUgbm9kZSB0byBzaGlmdC5cclxuICogQHBhcmFtIHtOb2RlfSBiIC0gVGhlIHZhbHVlIHRvIHNoaWZ0LlxyXG4gKiBAcmV0dXJucyB7T3BlcmF0b3JOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHNoaWZ0UmlnaHQgPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggT3BlcmF0b3JOb2RlLCAnPj4nICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAyICkuc2V0TmFtZSggJ3NoaWZ0UmlnaHQnICk7XHJcblxyXG5hZGRNZXRob2RDaGFpbmluZyggJ2FkZCcsIGFkZCApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ3N1YicsIHN1YiApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ211bCcsIG11bCApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ2RpdicsIGRpdiApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ21vZCcsIG1vZCApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ2VxdWFsJywgZXF1YWwgKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICdub3RFcXVhbCcsIG5vdEVxdWFsICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAnbGVzc1RoYW4nLCBsZXNzVGhhbiApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ2dyZWF0ZXJUaGFuJywgZ3JlYXRlclRoYW4gKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICdsZXNzVGhhbkVxdWFsJywgbGVzc1RoYW5FcXVhbCApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ2dyZWF0ZXJUaGFuRXF1YWwnLCBncmVhdGVyVGhhbkVxdWFsICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAnYW5kJywgYW5kICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAnb3InLCBvciApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ25vdCcsIG5vdCApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ3hvcicsIHhvciApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ2JpdEFuZCcsIGJpdEFuZCApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ2JpdE5vdCcsIGJpdE5vdCApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ2JpdE9yJywgYml0T3IgKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICdiaXRYb3InLCBiaXRYb3IgKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICdzaGlmdExlZnQnLCBzaGlmdExlZnQgKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICdzaGlmdFJpZ2h0Jywgc2hpZnRSaWdodCApO1xyXG5cclxuLyoqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBkZXByZWNhdGVkIHNpbmNlIHIxNjguIFVzZSB7QGxpbmsgbW9kfSBpbnN0ZWFkLlxyXG4gKlxyXG4gKiBAcGFyYW0ge05vZGV9IGEgLSBUaGUgZmlyc3QgaW5wdXQuXHJcbiAqIEBwYXJhbSB7Tm9kZX0gYiAtIFRoZSBzZWNvbmQgaW5wdXQuXHJcbiAqIEByZXR1cm5zIHtPcGVyYXRvck5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcmVtYWluZGVyID0gKCBhLCBiICkgPT4geyAvLyBAZGVwcmVjYXRlZCwgcjE2OFxyXG5cclxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5UU0w6IFwicmVtYWluZGVyKClcIiBpcyBkZXByZWNhdGVkLiBVc2UgXCJtb2QoIGludCggLi4uICkgKVwiIGluc3RlYWQuJyApO1xyXG5cdHJldHVybiBtb2QoIGEsIGIgKTtcclxuXHJcbn07XHJcblxyXG4vKipcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQGRlcHJlY2F0ZWQgc2luY2UgcjE3NS4gVXNlIHtAbGluayBtb2R9IGluc3RlYWQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7Tm9kZX0gYSAtIFRoZSBmaXJzdCBpbnB1dC5cclxuICogQHBhcmFtIHtOb2RlfSBiIC0gVGhlIHNlY29uZCBpbnB1dC5cclxuICogQHJldHVybnMge09wZXJhdG9yTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBtb2RJbnQgPSAoIGEsIGIgKSA9PiB7IC8vIEBkZXByZWNhdGVkLCByMTc1XHJcblxyXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlRTTDogXCJtb2RJbnQoKVwiIGlzIGRlcHJlY2F0ZWQuIFVzZSBcIm1vZCggaW50KCAuLi4gKSApXCIgaW5zdGVhZC4nICk7XHJcblx0cmV0dXJuIG1vZCggaW50KCBhICksIGludCggYiApICk7XHJcblxyXG59O1xyXG5cclxuYWRkTWV0aG9kQ2hhaW5pbmcoICdyZW1haW5kZXInLCByZW1haW5kZXIgKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICdtb2RJbnQnLCBtb2RJbnQgKTtcclxuIiwiaW1wb3J0IFRlbXBOb2RlIGZyb20gJy4uL2NvcmUvVGVtcE5vZGUuanMnO1xyXG5pbXBvcnQgeyBzdWIsIG11bCwgZGl2LCBtb2QsIGVxdWFsIH0gZnJvbSAnLi9PcGVyYXRvck5vZGUuanMnO1xyXG5pbXBvcnQgeyBhZGRNZXRob2RDaGFpbmluZywgbm9kZU9iamVjdCwgbm9kZVByb3h5LCBmbG9hdCwgdmVjMiwgdmVjMywgdmVjNCwgRm4gfSBmcm9tICcuLi90c2wvVFNMQ29yZS5qcyc7XHJcbmltcG9ydCB7IFdlYkdMQ29vcmRpbmF0ZVN5c3RlbSwgV2ViR1BVQ29vcmRpbmF0ZVN5c3RlbSB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBub2RlIHJlcHJlc2VudHMgYSB2YXJpZXR5IG9mIG1hdGhlbWF0aWNhbCBtZXRob2RzIGF2YWlsYWJsZSBpbiBzaGFkZXJzLlxyXG4gKiBUaGV5IGFyZSBkaXZpZGVkIGludG8gdGhyZWUgY2F0ZWdvcmllczpcclxuICpcclxuICogLSBNZXRob2RzIHdpdGggb25lIGlucHV0IGxpa2UgYHNpbmAsIGBjb3NgIG9yIGBub3JtYWxpemVgLlxyXG4gKiAtIE1ldGhvZHMgd2l0aCB0d28gaW5wdXRzIGxpa2UgYGRvdGAsIGBjcm9zc2Agb3IgYHBvd2AuXHJcbiAqIC0gTWV0aG9kcyB3aXRoIHRocmVlIGlucHV0cyBsaWtlIGBtaXhgLCBgY2xhbXBgIG9yIGBzbW9vdGhzdGVwYC5cclxuICpcclxuICogQGF1Z21lbnRzIFRlbXBOb2RlXHJcbiAqL1xyXG5jbGFzcyBNYXRoTm9kZSBleHRlbmRzIFRlbXBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnTWF0aE5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbWF0aCBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZCAtIFRoZSBtZXRob2QgbmFtZS5cclxuXHQgKiBAcGFyYW0ge05vZGV9IGFOb2RlIC0gVGhlIGZpcnN0IGlucHV0LlxyXG5cdCAqIEBwYXJhbSB7P05vZGV9IFtiTm9kZT1udWxsXSAtIFRoZSBzZWNvbmQgaW5wdXQuXHJcblx0ICogQHBhcmFtIHs/Tm9kZX0gW2NOb2RlPW51bGxdIC0gVGhlIHRoaXJkIGlucHV0LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBtZXRob2QsIGFOb2RlLCBiTm9kZSA9IG51bGwsIGNOb2RlID0gbnVsbCApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8vIEFsbG93IHRoZSBtYXgoKSBhbmQgbWluKCkgZnVuY3Rpb25zIHRvIHRha2UgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBhcmd1bWVudHMuXHJcblxyXG5cdFx0aWYgKCAoIG1ldGhvZCA9PT0gTWF0aE5vZGUuTUFYIHx8IG1ldGhvZCA9PT0gTWF0aE5vZGUuTUlOICkgJiYgYXJndW1lbnRzLmxlbmd0aCA+IDMgKSB7XHJcblxyXG5cdFx0XHRsZXQgZmluYWxPcCA9IG5ldyBNYXRoTm9kZSggbWV0aG9kLCBhTm9kZSwgYk5vZGUgKTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMjsgaSA8IGFyZ3VtZW50cy5sZW5ndGggLSAxOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRmaW5hbE9wID0gbmV3IE1hdGhOb2RlKCBtZXRob2QsIGZpbmFsT3AsIGFyZ3VtZW50c1sgaSBdICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRhTm9kZSA9IGZpbmFsT3A7XHJcblx0XHRcdGJOb2RlID0gYXJndW1lbnRzWyBhcmd1bWVudHMubGVuZ3RoIC0gMSBdO1xyXG5cdFx0XHRjTm9kZSA9IG51bGw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG1ldGhvZCBuYW1lLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWV0aG9kID0gbWV0aG9kO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGZpcnN0IGlucHV0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFOb2RlID0gYU5vZGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc2Vjb25kIGlucHV0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Tm9kZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5iTm9kZSA9IGJOb2RlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHRoaXJkIGlucHV0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Tm9kZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jTm9kZSA9IGNOb2RlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc01hdGhOb2RlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgaW5wdXQgdHlwZSBpcyBpbmZlcnJlZCBmcm9tIHRoZSBub2RlIHR5cGVzIG9mIHRoZSBpbnB1dCBub2Rlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgaW5wdXQgdHlwZS5cclxuXHQgKi9cclxuXHRnZXRJbnB1dFR5cGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgYVR5cGUgPSB0aGlzLmFOb2RlLmdldE5vZGVUeXBlKCBidWlsZGVyICk7XHJcblx0XHRjb25zdCBiVHlwZSA9IHRoaXMuYk5vZGUgPyB0aGlzLmJOb2RlLmdldE5vZGVUeXBlKCBidWlsZGVyICkgOiBudWxsO1xyXG5cdFx0Y29uc3QgY1R5cGUgPSB0aGlzLmNOb2RlID8gdGhpcy5jTm9kZS5nZXROb2RlVHlwZSggYnVpbGRlciApIDogbnVsbDtcclxuXHJcblx0XHRjb25zdCBhTGVuID0gYnVpbGRlci5pc01hdHJpeCggYVR5cGUgKSA/IDAgOiBidWlsZGVyLmdldFR5cGVMZW5ndGgoIGFUeXBlICk7XHJcblx0XHRjb25zdCBiTGVuID0gYnVpbGRlci5pc01hdHJpeCggYlR5cGUgKSA/IDAgOiBidWlsZGVyLmdldFR5cGVMZW5ndGgoIGJUeXBlICk7XHJcblx0XHRjb25zdCBjTGVuID0gYnVpbGRlci5pc01hdHJpeCggY1R5cGUgKSA/IDAgOiBidWlsZGVyLmdldFR5cGVMZW5ndGgoIGNUeXBlICk7XHJcblxyXG5cdFx0aWYgKCBhTGVuID4gYkxlbiAmJiBhTGVuID4gY0xlbiApIHtcclxuXHJcblx0XHRcdHJldHVybiBhVHlwZTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBiTGVuID4gY0xlbiApIHtcclxuXHJcblx0XHRcdHJldHVybiBiVHlwZTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBjTGVuID4gYUxlbiApIHtcclxuXHJcblx0XHRcdHJldHVybiBjVHlwZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGFUeXBlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBzZWxlY3RlZCBtZXRob2QgYXMgd2VsbCBhcyB0aGUgaW5wdXQgdHlwZSBkZXRlcm1pbmUgdGhlIG5vZGUgdHlwZSBvZiB0aGlzIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG5vZGUgdHlwZS5cclxuXHQgKi9cclxuXHRnZXROb2RlVHlwZSggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCBtZXRob2QgPSB0aGlzLm1ldGhvZDtcclxuXHJcblx0XHRpZiAoIG1ldGhvZCA9PT0gTWF0aE5vZGUuTEVOR1RIIHx8IG1ldGhvZCA9PT0gTWF0aE5vZGUuRElTVEFOQ0UgfHwgbWV0aG9kID09PSBNYXRoTm9kZS5ET1QgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gJ2Zsb2F0JztcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBtZXRob2QgPT09IE1hdGhOb2RlLkNST1NTICkge1xyXG5cclxuXHRcdFx0cmV0dXJuICd2ZWMzJztcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBtZXRob2QgPT09IE1hdGhOb2RlLkFMTCB8fCBtZXRob2QgPT09IE1hdGhOb2RlLkFOWSApIHtcclxuXHJcblx0XHRcdHJldHVybiAnYm9vbCc7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggbWV0aG9kID09PSBNYXRoTm9kZS5FUVVBTFMgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gYnVpbGRlci5jaGFuZ2VDb21wb25lbnRUeXBlKCB0aGlzLmFOb2RlLmdldE5vZGVUeXBlKCBidWlsZGVyICksICdib29sJyApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gdGhpcy5nZXRJbnB1dFR5cGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0Z2VuZXJhdGUoIGJ1aWxkZXIsIG91dHB1dCApIHtcclxuXHJcblx0XHRsZXQgbWV0aG9kID0gdGhpcy5tZXRob2Q7XHJcblxyXG5cdFx0Y29uc3QgdHlwZSA9IHRoaXMuZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKTtcclxuXHRcdGNvbnN0IGlucHV0VHlwZSA9IHRoaXMuZ2V0SW5wdXRUeXBlKCBidWlsZGVyICk7XHJcblxyXG5cdFx0Y29uc3QgYSA9IHRoaXMuYU5vZGU7XHJcblx0XHRjb25zdCBiID0gdGhpcy5iTm9kZTtcclxuXHRcdGNvbnN0IGMgPSB0aGlzLmNOb2RlO1xyXG5cclxuXHRcdGNvbnN0IGNvb3JkaW5hdGVTeXN0ZW0gPSBidWlsZGVyLnJlbmRlcmVyLmNvb3JkaW5hdGVTeXN0ZW07XHJcblxyXG5cdFx0aWYgKCBtZXRob2QgPT09IE1hdGhOb2RlLlRSQU5TRk9STV9ESVJFQ1RJT04gKSB7XHJcblxyXG5cdFx0XHQvLyBkaXIgY2FuIGJlIGVpdGhlciBhIGRpcmVjdGlvbiB2ZWN0b3Igb3IgYSBub3JtYWwgdmVjdG9yXHJcblx0XHRcdC8vIHVwcGVyLWxlZnQgM3gzIG9mIG1hdHJpeCBpcyBhc3N1bWVkIHRvIGJlIG9ydGhvZ29uYWxcclxuXHJcblx0XHRcdGxldCB0QSA9IGE7XHJcblx0XHRcdGxldCB0QiA9IGI7XHJcblxyXG5cdFx0XHRpZiAoIGJ1aWxkZXIuaXNNYXRyaXgoIHRBLmdldE5vZGVUeXBlKCBidWlsZGVyICkgKSApIHtcclxuXHJcblx0XHRcdFx0dEIgPSB2ZWM0KCB2ZWMzKCB0QiApLCAwLjAgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHRBID0gdmVjNCggdmVjMyggdEEgKSwgMC4wICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBtdWxOb2RlID0gbXVsKCB0QSwgdEIgKS54eXo7XHJcblxyXG5cdFx0XHRyZXR1cm4gbm9ybWFsaXplKCBtdWxOb2RlICkuYnVpbGQoIGJ1aWxkZXIsIG91dHB1dCApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIG1ldGhvZCA9PT0gTWF0aE5vZGUuTkVHQVRFICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIGJ1aWxkZXIuZm9ybWF0KCAnKCAtICcgKyBhLmJ1aWxkKCBidWlsZGVyLCBpbnB1dFR5cGUgKSArICcgKScsIHR5cGUsIG91dHB1dCApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIG1ldGhvZCA9PT0gTWF0aE5vZGUuT05FX01JTlVTICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIHN1YiggMS4wLCBhICkuYnVpbGQoIGJ1aWxkZXIsIG91dHB1dCApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIG1ldGhvZCA9PT0gTWF0aE5vZGUuUkVDSVBST0NBTCApIHtcclxuXHJcblx0XHRcdHJldHVybiBkaXYoIDEuMCwgYSApLmJ1aWxkKCBidWlsZGVyLCBvdXRwdXQgKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBtZXRob2QgPT09IE1hdGhOb2RlLkRJRkZFUkVOQ0UgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gYWJzKCBzdWIoIGEsIGIgKSApLmJ1aWxkKCBidWlsZGVyLCBvdXRwdXQgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc3QgcGFyYW1zID0gW107XHJcblxyXG5cdFx0XHRpZiAoIG1ldGhvZCA9PT0gTWF0aE5vZGUuQ1JPU1MgKSB7XHJcblxyXG5cdFx0XHRcdHBhcmFtcy5wdXNoKFxyXG5cdFx0XHRcdFx0YS5idWlsZCggYnVpbGRlciwgdHlwZSApLFxyXG5cdFx0XHRcdFx0Yi5idWlsZCggYnVpbGRlciwgdHlwZSApXHJcblx0XHRcdFx0KTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGNvb3JkaW5hdGVTeXN0ZW0gPT09IFdlYkdMQ29vcmRpbmF0ZVN5c3RlbSAmJiBtZXRob2QgPT09IE1hdGhOb2RlLlNURVAgKSB7XHJcblxyXG5cdFx0XHRcdHBhcmFtcy5wdXNoKFxyXG5cdFx0XHRcdFx0YS5idWlsZCggYnVpbGRlciwgYnVpbGRlci5nZXRUeXBlTGVuZ3RoKCBhLmdldE5vZGVUeXBlKCBidWlsZGVyICkgKSA9PT0gMSA/ICdmbG9hdCcgOiBpbnB1dFR5cGUgKSxcclxuXHRcdFx0XHRcdGIuYnVpbGQoIGJ1aWxkZXIsIGlucHV0VHlwZSApXHJcblx0XHRcdFx0KTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGNvb3JkaW5hdGVTeXN0ZW0gPT09IFdlYkdMQ29vcmRpbmF0ZVN5c3RlbSAmJiAoIG1ldGhvZCA9PT0gTWF0aE5vZGUuTUlOIHx8IG1ldGhvZCA9PT0gTWF0aE5vZGUuTUFYICkgKSB7XHJcblxyXG5cdFx0XHRcdHBhcmFtcy5wdXNoKFxyXG5cdFx0XHRcdFx0YS5idWlsZCggYnVpbGRlciwgaW5wdXRUeXBlICksXHJcblx0XHRcdFx0XHRiLmJ1aWxkKCBidWlsZGVyLCBidWlsZGVyLmdldFR5cGVMZW5ndGgoIGIuZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKSApID09PSAxID8gJ2Zsb2F0JyA6IGlucHV0VHlwZSApXHJcblx0XHRcdFx0KTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIG1ldGhvZCA9PT0gTWF0aE5vZGUuUkVGUkFDVCApIHtcclxuXHJcblx0XHRcdFx0cGFyYW1zLnB1c2goXHJcblx0XHRcdFx0XHRhLmJ1aWxkKCBidWlsZGVyLCBpbnB1dFR5cGUgKSxcclxuXHRcdFx0XHRcdGIuYnVpbGQoIGJ1aWxkZXIsIGlucHV0VHlwZSApLFxyXG5cdFx0XHRcdFx0Yy5idWlsZCggYnVpbGRlciwgJ2Zsb2F0JyApXHJcblx0XHRcdFx0KTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIG1ldGhvZCA9PT0gTWF0aE5vZGUuTUlYICkge1xyXG5cclxuXHRcdFx0XHRwYXJhbXMucHVzaChcclxuXHRcdFx0XHRcdGEuYnVpbGQoIGJ1aWxkZXIsIGlucHV0VHlwZSApLFxyXG5cdFx0XHRcdFx0Yi5idWlsZCggYnVpbGRlciwgaW5wdXRUeXBlICksXHJcblx0XHRcdFx0XHRjLmJ1aWxkKCBidWlsZGVyLCBidWlsZGVyLmdldFR5cGVMZW5ndGgoIGMuZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKSApID09PSAxID8gJ2Zsb2F0JyA6IGlucHV0VHlwZSApXHJcblx0XHRcdFx0KTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGlmICggY29vcmRpbmF0ZVN5c3RlbSA9PT0gV2ViR1BVQ29vcmRpbmF0ZVN5c3RlbSAmJiBtZXRob2QgPT09IE1hdGhOb2RlLkFUQU4gJiYgYiAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHRtZXRob2QgPSAnYXRhbjInO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHBhcmFtcy5wdXNoKCBhLmJ1aWxkKCBidWlsZGVyLCBpbnB1dFR5cGUgKSApO1xyXG5cdFx0XHRcdGlmICggYiAhPT0gbnVsbCApIHBhcmFtcy5wdXNoKCBiLmJ1aWxkKCBidWlsZGVyLCBpbnB1dFR5cGUgKSApO1xyXG5cdFx0XHRcdGlmICggYyAhPT0gbnVsbCApIHBhcmFtcy5wdXNoKCBjLmJ1aWxkKCBidWlsZGVyLCBpbnB1dFR5cGUgKSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIGJ1aWxkZXIuZm9ybWF0KCBgJHsgYnVpbGRlci5nZXRNZXRob2QoIG1ldGhvZCwgdHlwZSApIH0oICR7cGFyYW1zLmpvaW4oICcsICcgKX0gKWAsIHR5cGUsIG91dHB1dCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRzZXJpYWxpemUoIGRhdGEgKSB7XHJcblxyXG5cdFx0c3VwZXIuc2VyaWFsaXplKCBkYXRhICk7XHJcblxyXG5cdFx0ZGF0YS5tZXRob2QgPSB0aGlzLm1ldGhvZDtcclxuXHJcblx0fVxyXG5cclxuXHRkZXNlcmlhbGl6ZSggZGF0YSApIHtcclxuXHJcblx0XHRzdXBlci5kZXNlcmlhbGl6ZSggZGF0YSApO1xyXG5cclxuXHRcdHRoaXMubWV0aG9kID0gZGF0YS5tZXRob2Q7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8vIDEgaW5wdXRcclxuXHJcbk1hdGhOb2RlLkFMTCA9ICdhbGwnO1xyXG5NYXRoTm9kZS5BTlkgPSAnYW55JztcclxuXHJcbk1hdGhOb2RlLlJBRElBTlMgPSAncmFkaWFucyc7XHJcbk1hdGhOb2RlLkRFR1JFRVMgPSAnZGVncmVlcyc7XHJcbk1hdGhOb2RlLkVYUCA9ICdleHAnO1xyXG5NYXRoTm9kZS5FWFAyID0gJ2V4cDInO1xyXG5NYXRoTm9kZS5MT0cgPSAnbG9nJztcclxuTWF0aE5vZGUuTE9HMiA9ICdsb2cyJztcclxuTWF0aE5vZGUuU1FSVCA9ICdzcXJ0JztcclxuTWF0aE5vZGUuSU5WRVJTRV9TUVJUID0gJ2ludmVyc2VzcXJ0JztcclxuTWF0aE5vZGUuRkxPT1IgPSAnZmxvb3InO1xyXG5NYXRoTm9kZS5DRUlMID0gJ2NlaWwnO1xyXG5NYXRoTm9kZS5OT1JNQUxJWkUgPSAnbm9ybWFsaXplJztcclxuTWF0aE5vZGUuRlJBQ1QgPSAnZnJhY3QnO1xyXG5NYXRoTm9kZS5TSU4gPSAnc2luJztcclxuTWF0aE5vZGUuQ09TID0gJ2Nvcyc7XHJcbk1hdGhOb2RlLlRBTiA9ICd0YW4nO1xyXG5NYXRoTm9kZS5BU0lOID0gJ2FzaW4nO1xyXG5NYXRoTm9kZS5BQ09TID0gJ2Fjb3MnO1xyXG5NYXRoTm9kZS5BVEFOID0gJ2F0YW4nO1xyXG5NYXRoTm9kZS5BQlMgPSAnYWJzJztcclxuTWF0aE5vZGUuU0lHTiA9ICdzaWduJztcclxuTWF0aE5vZGUuTEVOR1RIID0gJ2xlbmd0aCc7XHJcbk1hdGhOb2RlLk5FR0FURSA9ICduZWdhdGUnO1xyXG5NYXRoTm9kZS5PTkVfTUlOVVMgPSAnb25lTWludXMnO1xyXG5NYXRoTm9kZS5ERkRYID0gJ2RGZHgnO1xyXG5NYXRoTm9kZS5ERkRZID0gJ2RGZHknO1xyXG5NYXRoTm9kZS5ST1VORCA9ICdyb3VuZCc7XHJcbk1hdGhOb2RlLlJFQ0lQUk9DQUwgPSAncmVjaXByb2NhbCc7XHJcbk1hdGhOb2RlLlRSVU5DID0gJ3RydW5jJztcclxuTWF0aE5vZGUuRldJRFRIID0gJ2Z3aWR0aCc7XHJcbk1hdGhOb2RlLlRSQU5TUE9TRSA9ICd0cmFuc3Bvc2UnO1xyXG5cclxuLy8gMiBpbnB1dHNcclxuXHJcbk1hdGhOb2RlLkJJVENBU1QgPSAnYml0Y2FzdCc7XHJcbk1hdGhOb2RlLkVRVUFMUyA9ICdlcXVhbHMnO1xyXG5NYXRoTm9kZS5NSU4gPSAnbWluJztcclxuTWF0aE5vZGUuTUFYID0gJ21heCc7XHJcbk1hdGhOb2RlLlNURVAgPSAnc3RlcCc7XHJcbk1hdGhOb2RlLlJFRkxFQ1QgPSAncmVmbGVjdCc7XHJcbk1hdGhOb2RlLkRJU1RBTkNFID0gJ2Rpc3RhbmNlJztcclxuTWF0aE5vZGUuRElGRkVSRU5DRSA9ICdkaWZmZXJlbmNlJztcclxuTWF0aE5vZGUuRE9UID0gJ2RvdCc7XHJcbk1hdGhOb2RlLkNST1NTID0gJ2Nyb3NzJztcclxuTWF0aE5vZGUuUE9XID0gJ3Bvdyc7XHJcbk1hdGhOb2RlLlRSQU5TRk9STV9ESVJFQ1RJT04gPSAndHJhbnNmb3JtRGlyZWN0aW9uJztcclxuXHJcbi8vIDMgaW5wdXRzXHJcblxyXG5NYXRoTm9kZS5NSVggPSAnbWl4JztcclxuTWF0aE5vZGUuQ0xBTVAgPSAnY2xhbXAnO1xyXG5NYXRoTm9kZS5SRUZSQUNUID0gJ3JlZnJhY3QnO1xyXG5NYXRoTm9kZS5TTU9PVEhTVEVQID0gJ3Ntb290aHN0ZXAnO1xyXG5NYXRoTm9kZS5GQUNFRk9SV0FSRCA9ICdmYWNlZm9yd2FyZCc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBNYXRoTm9kZTtcclxuXHJcbi8vIDEgaW5wdXRzXHJcblxyXG4vKipcclxuICogQSBzbWFsbCB2YWx1ZSB1c2VkIHRvIGhhbmRsZSBmbG9hdGluZy1wb2ludCBwcmVjaXNpb24gZXJyb3JzLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtOb2RlPGZsb2F0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBFUFNJTE9OID0gLypAX19QVVJFX18qLyBmbG9hdCggMWUtNiApO1xyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgaW5maW5pdHkuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8ZmxvYXQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IElORklOSVRZID0gLypAX19QVVJFX18qLyBmbG9hdCggMWU2ICk7XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyBQSS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUEkgPSAvKkBfX1BVUkVfXyovIGZsb2F0KCBNYXRoLlBJICk7XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyBQSSAqIDIuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8ZmxvYXQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFBJMiA9IC8qQF9fUFVSRV9fKi8gZmxvYXQoIE1hdGguUEkgKiAyICk7XHJcblxyXG4vKipcclxuICogUmV0dXJucyBgdHJ1ZWAgaWYgYWxsIGNvbXBvbmVudHMgb2YgYHhgIGFyZSBgdHJ1ZWAuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZSB8IG51bWJlcn0geCAtIFRoZSBwYXJhbWV0ZXIuXHJcbiAqIEByZXR1cm5zIHtOb2RlPGJvb2w+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGFsbCA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBNYXRoTm9kZSwgTWF0aE5vZGUuQUxMICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAxICk7XHJcblxyXG4vKipcclxuICogUmV0dXJucyBgdHJ1ZWAgaWYgYW55IGNvbXBvbmVudHMgb2YgYHhgIGFyZSBgdHJ1ZWAuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZSB8IG51bWJlcn0geCAtIFRoZSBwYXJhbWV0ZXIuXHJcbiAqIEByZXR1cm5zIHtOb2RlPGJvb2w+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGFueSA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBNYXRoTm9kZSwgTWF0aE5vZGUuQU5ZICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAxICk7XHJcblxyXG4vKipcclxuICogQ29udmVydHMgYSBxdWFudGl0eSBpbiBkZWdyZWVzIHRvIHJhZGlhbnMuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZSB8IG51bWJlcn0geCAtIFRoZSBpbnB1dCBpbiBkZWdyZWVzLlxyXG4gKiBAcmV0dXJucyB7Tm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCByYWRpYW5zID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE1hdGhOb2RlLCBNYXRoTm9kZS5SQURJQU5TICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAxICk7XHJcblxyXG4vKipcclxuICogQ29udmVydCBhIHF1YW50aXR5IGluIHJhZGlhbnMgdG8gZGVncmVlcy5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlIHwgbnVtYmVyfSB4IC0gVGhlIGlucHV0IGluIHJhZGlhbnMuXHJcbiAqIEByZXR1cm5zIHtOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGRlZ3JlZXMgPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggTWF0aE5vZGUsIE1hdGhOb2RlLkRFR1JFRVMgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDEgKTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBuYXR1cmFsIGV4cG9uZW50aWF0aW9uIG9mIHRoZSBwYXJhbWV0ZXIuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZSB8IG51bWJlcn0geCAtIFRoZSBwYXJhbWV0ZXIuXHJcbiAqIEByZXR1cm5zIHtOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGV4cCA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBNYXRoTm9kZSwgTWF0aE5vZGUuRVhQICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAxICk7XHJcblxyXG4vKipcclxuICogUmV0dXJucyAyIHJhaXNlZCB0byB0aGUgcG93ZXIgb2YgdGhlIHBhcmFtZXRlci5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlIHwgbnVtYmVyfSB4IC0gVGhlIHBhcmFtZXRlci5cclxuICogQHJldHVybnMge05vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZXhwMiA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBNYXRoTm9kZSwgTWF0aE5vZGUuRVhQMiApLnNldFBhcmFtZXRlckxlbmd0aCggMSApO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIG5hdHVyYWwgbG9nYXJpdGhtIG9mIHRoZSBwYXJhbWV0ZXIuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZSB8IG51bWJlcn0geCAtIFRoZSBwYXJhbWV0ZXIuXHJcbiAqIEByZXR1cm5zIHtOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGxvZyA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBNYXRoTm9kZSwgTWF0aE5vZGUuTE9HICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAxICk7XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgYmFzZSAyIGxvZ2FyaXRobSBvZiB0aGUgcGFyYW1ldGVyLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGUgfCBudW1iZXJ9IHggLSBUaGUgcGFyYW1ldGVyLlxyXG4gKiBAcmV0dXJucyB7Tm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBsb2cyID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE1hdGhOb2RlLCBNYXRoTm9kZS5MT0cyICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAxICk7XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgc3F1YXJlIHJvb3Qgb2YgdGhlIHBhcmFtZXRlci5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlIHwgbnVtYmVyfSB4IC0gVGhlIHBhcmFtZXRlci5cclxuICogQHJldHVybnMge05vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgc3FydCA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBNYXRoTm9kZSwgTWF0aE5vZGUuU1FSVCApLnNldFBhcmFtZXRlckxlbmd0aCggMSApO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIGludmVyc2Ugb2YgdGhlIHNxdWFyZSByb290IG9mIHRoZSBwYXJhbWV0ZXIuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZSB8IG51bWJlcn0geCAtIFRoZSBwYXJhbWV0ZXIuXHJcbiAqIEByZXR1cm5zIHtOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGludmVyc2VTcXJ0ID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE1hdGhOb2RlLCBNYXRoTm9kZS5JTlZFUlNFX1NRUlQgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDEgKTtcclxuXHJcbi8qKlxyXG4gKiBGaW5kcyB0aGUgbmVhcmVzdCBpbnRlZ2VyIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgcGFyYW1ldGVyLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGUgfCBudW1iZXJ9IHggLSBUaGUgcGFyYW1ldGVyLlxyXG4gKiBAcmV0dXJucyB7Tm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBmbG9vciA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBNYXRoTm9kZSwgTWF0aE5vZGUuRkxPT1IgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDEgKTtcclxuXHJcbi8qKlxyXG4gKiBGaW5kcyB0aGUgbmVhcmVzdCBpbnRlZ2VyIHRoYXQgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwYXJhbWV0ZXIuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZSB8IG51bWJlcn0geCAtIFRoZSBwYXJhbWV0ZXIuXHJcbiAqIEByZXR1cm5zIHtOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGNlaWwgPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggTWF0aE5vZGUsIE1hdGhOb2RlLkNFSUwgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDEgKTtcclxuXHJcbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSB1bml0IHZlY3RvciBpbiB0aGUgc2FtZSBkaXJlY3Rpb24gYXMgdGhlIG9yaWdpbmFsIHZlY3Rvci5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlfSB4IC0gVGhlIGlucHV0IHZlY3Rvci5cclxuICogQHJldHVybnMge05vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgbm9ybWFsaXplID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE1hdGhOb2RlLCBNYXRoTm9kZS5OT1JNQUxJWkUgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDEgKTtcclxuXHJcbi8qKlxyXG4gKiBDb21wdXRlcyB0aGUgZnJhY3Rpb25hbCBwYXJ0IG9mIHRoZSBwYXJhbWV0ZXIuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZSB8IG51bWJlcn0geCAtIFRoZSBwYXJhbWV0ZXIuXHJcbiAqIEByZXR1cm5zIHtOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGZyYWN0ID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE1hdGhOb2RlLCBNYXRoTm9kZS5GUkFDVCApLnNldFBhcmFtZXRlckxlbmd0aCggMSApO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIHNpbmUgb2YgdGhlIHBhcmFtZXRlci5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlIHwgbnVtYmVyfSB4IC0gVGhlIHBhcmFtZXRlci5cclxuICogQHJldHVybnMge05vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgc2luID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE1hdGhOb2RlLCBNYXRoTm9kZS5TSU4gKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDEgKTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBjb3NpbmUgb2YgdGhlIHBhcmFtZXRlci5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlIHwgbnVtYmVyfSB4IC0gVGhlIHBhcmFtZXRlci5cclxuICogQHJldHVybnMge05vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgY29zID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE1hdGhOb2RlLCBNYXRoTm9kZS5DT1MgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDEgKTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSB0YW5nZW50IG9mIHRoZSBwYXJhbWV0ZXIuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZSB8IG51bWJlcn0geCAtIFRoZSBwYXJhbWV0ZXIuXHJcbiAqIEByZXR1cm5zIHtOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHRhbiA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBNYXRoTm9kZSwgTWF0aE5vZGUuVEFOICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAxICk7XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgYXJjc2luZSBvZiB0aGUgcGFyYW1ldGVyLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGUgfCBudW1iZXJ9IHggLSBUaGUgcGFyYW1ldGVyLlxyXG4gKiBAcmV0dXJucyB7Tm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBhc2luID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE1hdGhOb2RlLCBNYXRoTm9kZS5BU0lOICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAxICk7XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgYXJjY29zaW5lIG9mIHRoZSBwYXJhbWV0ZXIuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZSB8IG51bWJlcn0geCAtIFRoZSBwYXJhbWV0ZXIuXHJcbiAqIEByZXR1cm5zIHtOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGFjb3MgPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggTWF0aE5vZGUsIE1hdGhOb2RlLkFDT1MgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDEgKTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBhcmMtdGFuZ2VudCBvZiB0aGUgcGFyYW1ldGVyLlxyXG4gKiBJZiB0d28gcGFyYW1ldGVycyBhcmUgcHJvdmlkZWQsIHRoZSByZXN1bHQgaXMgYGF0YW4yKHkveClgLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGUgfCBudW1iZXJ9IHkgLSBUaGUgeSBwYXJhbWV0ZXIuXHJcbiAqIEBwYXJhbSB7PyhOb2RlIHwgbnVtYmVyKX0geCAtIFRoZSB4IHBhcmFtZXRlci5cclxuICogQHJldHVybnMge05vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYXRhbiA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBNYXRoTm9kZSwgTWF0aE5vZGUuQVRBTiApLnNldFBhcmFtZXRlckxlbmd0aCggMSwgMiApO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZSB8IG51bWJlcn0geCAtIFRoZSBwYXJhbWV0ZXIuXHJcbiAqIEByZXR1cm5zIHtOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGFicyA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBNYXRoTm9kZSwgTWF0aE5vZGUuQUJTICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAxICk7XHJcblxyXG4vKipcclxuICogRXh0cmFjdHMgdGhlIHNpZ24gb2YgdGhlIHBhcmFtZXRlci5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlIHwgbnVtYmVyfSB4IC0gVGhlIHBhcmFtZXRlci5cclxuICogQHJldHVybnMge05vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgc2lnbiA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBNYXRoTm9kZSwgTWF0aE5vZGUuU0lHTiApLnNldFBhcmFtZXRlckxlbmd0aCggMSApO1xyXG5cclxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGxlbmd0aCBvZiBhIHZlY3Rvci5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlfSB4IC0gVGhlIHBhcmFtZXRlci5cclxuICogQHJldHVybnMge05vZGU8ZmxvYXQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGxlbmd0aCA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBNYXRoTm9kZSwgTWF0aE5vZGUuTEVOR1RIICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAxICk7XHJcblxyXG4vKipcclxuICogTmVnYXRlcyB0aGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlciAoLXgpLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGUgfCBudW1iZXJ9IHggLSBUaGUgcGFyYW1ldGVyLlxyXG4gKiBAcmV0dXJucyB7Tm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBuZWdhdGUgPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggTWF0aE5vZGUsIE1hdGhOb2RlLk5FR0FURSApLnNldFBhcmFtZXRlckxlbmd0aCggMSApO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybiBgMWAgbWludXMgdGhlIHBhcmFtZXRlci5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlIHwgbnVtYmVyfSB4IC0gVGhlIHBhcmFtZXRlci5cclxuICogQHJldHVybnMge05vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgb25lTWludXMgPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggTWF0aE5vZGUsIE1hdGhOb2RlLk9ORV9NSU5VUyApLnNldFBhcmFtZXRlckxlbmd0aCggMSApO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIHBhcnRpYWwgZGVyaXZhdGl2ZSBvZiB0aGUgcGFyYW1ldGVyIHdpdGggcmVzcGVjdCB0byB4LlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGUgfCBudW1iZXJ9IHggLSBUaGUgcGFyYW1ldGVyLlxyXG4gKiBAcmV0dXJucyB7Tm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBkRmR4ID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE1hdGhOb2RlLCBNYXRoTm9kZS5ERkRYICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAxICk7XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgcGFydGlhbCBkZXJpdmF0aXZlIG9mIHRoZSBwYXJhbWV0ZXIgd2l0aCByZXNwZWN0IHRvIHkuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZSB8IG51bWJlcn0geCAtIFRoZSBwYXJhbWV0ZXIuXHJcbiAqIEByZXR1cm5zIHtOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGRGZHkgPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggTWF0aE5vZGUsIE1hdGhOb2RlLkRGRFkgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDEgKTtcclxuXHJcbi8qKlxyXG4gKiBSb3VuZHMgdGhlIHBhcmFtZXRlciB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGUgfCBudW1iZXJ9IHggLSBUaGUgcGFyYW1ldGVyLlxyXG4gKiBAcmV0dXJucyB7Tm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCByb3VuZCA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBNYXRoTm9kZSwgTWF0aE5vZGUuUk9VTkQgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDEgKTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSByZWNpcHJvY2FsIG9mIHRoZSBwYXJhbWV0ZXIgYCgxL3gpYC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlIHwgbnVtYmVyfSB4IC0gVGhlIHBhcmFtZXRlci5cclxuICogQHJldHVybnMge05vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcmVjaXByb2NhbCA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBNYXRoTm9kZSwgTWF0aE5vZGUuUkVDSVBST0NBTCApLnNldFBhcmFtZXRlckxlbmd0aCggMSApO1xyXG5cclxuLyoqXHJcbiAqIFRydW5jYXRlcyB0aGUgcGFyYW1ldGVyLCByZW1vdmluZyB0aGUgZnJhY3Rpb25hbCBwYXJ0LlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGUgfCBudW1iZXJ9IHggLSBUaGUgcGFyYW1ldGVyLlxyXG4gKiBAcmV0dXJucyB7Tm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCB0cnVuYyA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBNYXRoTm9kZSwgTWF0aE5vZGUuVFJVTkMgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDEgKTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBzdW0gb2YgdGhlIGFic29sdXRlIGRlcml2YXRpdmVzIGluIHggYW5kIHkuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZSB8IG51bWJlcn0geCAtIFRoZSBwYXJhbWV0ZXIuXHJcbiAqIEByZXR1cm5zIHtOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGZ3aWR0aCA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBNYXRoTm9kZSwgTWF0aE5vZGUuRldJRFRIICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAxICk7XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgdHJhbnNwb3NlIG9mIGEgbWF0cml4LlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGU8bWF0MnxtYXQzfG1hdDQ+fSB4IC0gVGhlIHBhcmFtZXRlci5cclxuICogQHJldHVybnMge05vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdHJhbnNwb3NlID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE1hdGhOb2RlLCBNYXRoTm9kZS5UUkFOU1BPU0UgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDEgKTtcclxuXHJcbi8vIDIgaW5wdXRzXHJcblxyXG4vKipcclxuICogUmVpbnRlcnByZXQgdGhlIGJpdCByZXByZXNlbnRhdGlvbiBvZiBhIHZhbHVlIGluIG9uZSB0eXBlIGFzIGEgdmFsdWUgaW4gYW5vdGhlciB0eXBlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGUgfCBudW1iZXJ9IHggLSBUaGUgcGFyYW1ldGVyLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30geSAtIFRoZSBuZXcgdHlwZS5cclxuICogQHJldHVybnMge05vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYml0Y2FzdCA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBNYXRoTm9kZSwgTWF0aE5vZGUuQklUQ0FTVCApLnNldFBhcmFtZXRlckxlbmd0aCggMiApO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYHRydWVgIGlmIGB4YCBlcXVhbHMgYHlgLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGUgfCBudW1iZXJ9IHggLSBUaGUgZmlyc3QgcGFyYW1ldGVyLlxyXG4gKiBAcGFyYW0ge05vZGUgfCBudW1iZXJ9IHkgLSBUaGUgc2Vjb25kIHBhcmFtZXRlci5cclxuICogQGRlcHJlY2F0ZWQgc2luY2UgcjE3NS4gVXNlIHtAbGluayBlcXVhbH0gaW5zdGVhZC5cclxuICogQHJldHVybnMge05vZGU8Ym9vbD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZXF1YWxzID0gKCB4LCB5ICkgPT4geyAvLyBAZGVwcmVjYXRlZCwgcjE3MlxyXG5cclxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5UU0w6IFwiZXF1YWxzXCIgaXMgZGVwcmVjYXRlZC4gVXNlIFwiZXF1YWxcIiBpbnNpZGUgYSB2ZWN0b3IgaW5zdGVhZCwgbGlrZTogXCJidmVjKiggZXF1YWwoIC4uLiApIClcIicgKTtcclxuXHRyZXR1cm4gZXF1YWwoIHgsIHkgKTtcclxuXHJcbn07XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgbGVhc3Qgb2YgdGhlIGdpdmVuIHZhbHVlcy5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHsuLi4oTm9kZSB8IG51bWJlcil9IHZhbHVlcyAtIFRoZSB2YWx1ZXMgdG8gY29tcGFyZS5cclxuICogQHJldHVybnMge05vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbWluID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE1hdGhOb2RlLCBNYXRoTm9kZS5NSU4gKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDIsIEluZmluaXR5ICk7XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgZ3JlYXRlc3Qgb2YgdGhlIGdpdmVuIHZhbHVlcy5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHsuLi4oTm9kZSB8IG51bWJlcil9IHZhbHVlcyAtIFRoZSB2YWx1ZXMgdG8gY29tcGFyZS5cclxuICogQHJldHVybnMge05vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbWF4ID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE1hdGhOb2RlLCBNYXRoTm9kZS5NQVggKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDIsIEluZmluaXR5ICk7XHJcblxyXG4vKipcclxuICogR2VuZXJhdGUgYSBzdGVwIGZ1bmN0aW9uIGJ5IGNvbXBhcmluZyB0d28gdmFsdWVzLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGUgfCBudW1iZXJ9IHggLSBUaGUgeSBwYXJhbWV0ZXIuXHJcbiAqIEBwYXJhbSB7Tm9kZSB8IG51bWJlcn0geSAtIFRoZSB4IHBhcmFtZXRlci5cclxuICogQHJldHVybnMge05vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgc3RlcCA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBNYXRoTm9kZSwgTWF0aE5vZGUuU1RFUCApLnNldFBhcmFtZXRlckxlbmd0aCggMiApO1xyXG5cclxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIHJlZmxlY3Rpb24gZGlyZWN0aW9uIGZvciBhbiBpbmNpZGVudCB2ZWN0b3IuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMyfHZlYzN8dmVjND59IEkgLSBUaGUgaW5jaWRlbnQgdmVjdG9yLlxyXG4gKiBAcGFyYW0ge05vZGU8dmVjMnx2ZWMzfHZlYzQ+fSBOIC0gVGhlIG5vcm1hbCB2ZWN0b3IuXHJcbiAqIEByZXR1cm5zIHtOb2RlPHZlYzJ8dmVjM3x2ZWM0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCByZWZsZWN0ID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE1hdGhOb2RlLCBNYXRoTm9kZS5SRUZMRUNUICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAyICk7XHJcblxyXG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0d28gcG9pbnRzLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGU8dmVjMnx2ZWMzfHZlYzQ+fSB4IC0gVGhlIGZpcnN0IHBvaW50LlxyXG4gKiBAcGFyYW0ge05vZGU8dmVjMnx2ZWMzfHZlYzQ+fSB5IC0gVGhlIHNlY29uZCBwb2ludC5cclxuICogQHJldHVybnMge05vZGU8ZmxvYXQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGRpc3RhbmNlID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE1hdGhOb2RlLCBNYXRoTm9kZS5ESVNUQU5DRSApLnNldFBhcmFtZXRlckxlbmd0aCggMiApO1xyXG5cclxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGFic29sdXRlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gdmFsdWVzLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGUgfCBudW1iZXJ9IHggLSBUaGUgZmlyc3QgcGFyYW1ldGVyLlxyXG4gKiBAcGFyYW0ge05vZGUgfCBudW1iZXJ9IHkgLSBUaGUgc2Vjb25kIHBhcmFtZXRlci5cclxuICogQHJldHVybnMge05vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZGlmZmVyZW5jZSA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBNYXRoTm9kZSwgTWF0aE5vZGUuRElGRkVSRU5DRSApLnNldFBhcmFtZXRlckxlbmd0aCggMiApO1xyXG5cclxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGRvdCBwcm9kdWN0IG9mIHR3byB2ZWN0b3JzLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGU8dmVjMnx2ZWMzfHZlYzQ+fSB4IC0gVGhlIGZpcnN0IHZlY3Rvci5cclxuICogQHBhcmFtIHtOb2RlPHZlYzJ8dmVjM3x2ZWM0Pn0geSAtIFRoZSBzZWNvbmQgdmVjdG9yLlxyXG4gKiBAcmV0dXJucyB7Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZG90ID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE1hdGhOb2RlLCBNYXRoTm9kZS5ET1QgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDIgKTtcclxuXHJcbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBjcm9zcyBwcm9kdWN0IG9mIHR3byB2ZWN0b3JzLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGU8dmVjMnx2ZWMzfHZlYzQ+fSB4IC0gVGhlIGZpcnN0IHZlY3Rvci5cclxuICogQHBhcmFtIHtOb2RlPHZlYzJ8dmVjM3x2ZWM0Pn0geSAtIFRoZSBzZWNvbmQgdmVjdG9yLlxyXG4gKiBAcmV0dXJucyB7Tm9kZTx2ZWMyfHZlYzN8dmVjND59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgY3Jvc3MgPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggTWF0aE5vZGUsIE1hdGhOb2RlLkNST1NTICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAyICk7XHJcblxyXG4vKipcclxuICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgcGFyYW1ldGVyIHJhaXNlZCB0byB0aGUgcG93ZXIgb2YgdGhlIHNlY29uZCBvbmUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZSB8IG51bWJlcn0geCAtIFRoZSBmaXJzdCBwYXJhbWV0ZXIuXHJcbiAqIEBwYXJhbSB7Tm9kZSB8IG51bWJlcn0geSAtIFRoZSBzZWNvbmQgcGFyYW1ldGVyLlxyXG4gKiBAcmV0dXJucyB7Tm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBwb3cgPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggTWF0aE5vZGUsIE1hdGhOb2RlLlBPVyApLnNldFBhcmFtZXRlckxlbmd0aCggMiApO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIHNxdWFyZSBvZiB0aGUgcGFyYW1ldGVyLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGUgfCBudW1iZXJ9IHggLSBUaGUgZmlyc3QgcGFyYW1ldGVyLlxyXG4gKiBAcmV0dXJucyB7Tm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBwb3cyID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE1hdGhOb2RlLCBNYXRoTm9kZS5QT1csIDIgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDEgKTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBjdWJlIG9mIHRoZSBwYXJhbWV0ZXIuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZSB8IG51bWJlcn0geCAtIFRoZSBmaXJzdCBwYXJhbWV0ZXIuXHJcbiAqIEByZXR1cm5zIHtOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHBvdzMgPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggTWF0aE5vZGUsIE1hdGhOb2RlLlBPVywgMyApLnNldFBhcmFtZXRlckxlbmd0aCggMSApO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIGZvdXJ0aCBwb3dlciBvZiB0aGUgcGFyYW1ldGVyLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGUgfCBudW1iZXJ9IHggLSBUaGUgZmlyc3QgcGFyYW1ldGVyLlxyXG4gKiBAcmV0dXJucyB7Tm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBwb3c0ID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE1hdGhOb2RlLCBNYXRoTm9kZS5QT1csIDQgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDEgKTtcclxuXHJcbi8qKlxyXG4gKiBUcmFuc2Zvcm1zIHRoZSBkaXJlY3Rpb24gb2YgYSB2ZWN0b3IgYnkgYSBtYXRyaXggYW5kIHRoZW4gbm9ybWFsaXplcyB0aGUgcmVzdWx0LlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGU8dmVjMnx2ZWMzfHZlYzQ+fSBkaXJlY3Rpb24gLSBUaGUgZGlyZWN0aW9uIHZlY3Rvci5cclxuICogQHBhcmFtIHtOb2RlPG1hdDJ8bWF0M3xtYXQ0Pn0gbWF0cml4IC0gVGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC5cclxuICogQHJldHVybnMge05vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdHJhbnNmb3JtRGlyZWN0aW9uID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE1hdGhOb2RlLCBNYXRoTm9kZS5UUkFOU0ZPUk1fRElSRUNUSU9OICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAyICk7XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgY3ViZSByb290IG9mIGEgbnVtYmVyLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGUgfCBudW1iZXJ9IGEgLSBUaGUgZmlyc3QgcGFyYW1ldGVyLlxyXG4gKiBAcmV0dXJucyB7Tm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBjYnJ0ID0gKCBhICkgPT4gbXVsKCBzaWduKCBhICksIHBvdyggYWJzKCBhICksIDEuMCAvIDMuMCApICk7XHJcblxyXG4vKipcclxuICogQ2FsY3VsYXRlIHRoZSBzcXVhcmVkIGxlbmd0aCBvZiBhIHZlY3Rvci5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlPHZlYzJ8dmVjM3x2ZWM0Pn0gYSAtIFRoZSB2ZWN0b3IuXHJcbiAqIEByZXR1cm5zIHtOb2RlPGZsb2F0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBsZW5ndGhTcSA9ICggYSApID0+IGRvdCggYSwgYSApO1xyXG5cclxuLyoqXHJcbiAqIExpbmVhcmx5IGludGVycG9sYXRlcyBiZXR3ZWVuIHR3byB2YWx1ZXMuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZSB8IG51bWJlcn0gYSAtIFRoZSBmaXJzdCBwYXJhbWV0ZXIuXHJcbiAqIEBwYXJhbSB7Tm9kZSB8IG51bWJlcn0gYiAtIFRoZSBzZWNvbmQgcGFyYW1ldGVyLlxyXG4gKiBAcGFyYW0ge05vZGUgfCBudW1iZXJ9IHQgLSBUaGUgaW50ZXJwb2xhdGlvbiB2YWx1ZS5cclxuICogQHJldHVybnMge05vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbWl4ID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE1hdGhOb2RlLCBNYXRoTm9kZS5NSVggKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDMgKTtcclxuXHJcbi8qKlxyXG4gKiBDb25zdHJhaW5zIGEgdmFsdWUgdG8gbGllIGJldHdlZW4gdHdvIGZ1cnRoZXIgdmFsdWVzLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGUgfCBudW1iZXJ9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNvbnN0cmFpbi5cclxuICogQHBhcmFtIHtOb2RlIHwgbnVtYmVyfSBbbG93PTBdIC0gVGhlIGxvd2VyIGJvdW5kLlxyXG4gKiBAcGFyYW0ge05vZGUgfCBudW1iZXJ9IFtoaWdoPTFdIC0gVGhlIHVwcGVyIGJvdW5kLlxyXG4gKiBAcmV0dXJucyB7Tm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBjbGFtcCA9ICggdmFsdWUsIGxvdyA9IDAsIGhpZ2ggPSAxICkgPT4gbm9kZU9iamVjdCggbmV3IE1hdGhOb2RlKCBNYXRoTm9kZS5DTEFNUCwgbm9kZU9iamVjdCggdmFsdWUgKSwgbm9kZU9iamVjdCggbG93ICksIG5vZGVPYmplY3QoIGhpZ2ggKSApICk7XHJcblxyXG4vKipcclxuICogQ29uc3RyYWlucyBhIHZhbHVlIGJldHdlZW4gYDBgIGFuZCBgMWAuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZSB8IG51bWJlcn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY29uc3RyYWluLlxyXG4gKiBAcmV0dXJucyB7Tm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBzYXR1cmF0ZSA9ICggdmFsdWUgKSA9PiBjbGFtcCggdmFsdWUgKTtcclxuXHJcbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSByZWZyYWN0aW9uIGRpcmVjdGlvbiBmb3IgYW4gaW5jaWRlbnQgdmVjdG9yLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGU8dmVjMnx2ZWMzfHZlYzQ+fSBJIC0gVGhlIGluY2lkZW50IHZlY3Rvci5cclxuICogQHBhcmFtIHtOb2RlPHZlYzJ8dmVjM3x2ZWM0Pn0gTiAtIFRoZSBub3JtYWwgdmVjdG9yLlxyXG4gKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSBldGEgLSBUaGUgcmF0aW8gb2YgaW5kaWNlcyBvZiByZWZyYWN0aW9uLlxyXG4gKiBAcmV0dXJucyB7Tm9kZTx2ZWMyfHZlYzN8dmVjND59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcmVmcmFjdCA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBNYXRoTm9kZSwgTWF0aE5vZGUuUkVGUkFDVCApLnNldFBhcmFtZXRlckxlbmd0aCggMyApO1xyXG5cclxuLyoqXHJcbiAqIFBlcmZvcm1zIGEgSGVybWl0ZSBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdHdvIHZhbHVlcy5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlIHwgbnVtYmVyfSBsb3cgLSBUaGUgdmFsdWUgb2YgdGhlIGxvd2VyIGVkZ2Ugb2YgdGhlIEhlcm1pdGUgZnVuY3Rpb24uXHJcbiAqIEBwYXJhbSB7Tm9kZSB8IG51bWJlcn0gaGlnaCAtIFRoZSB2YWx1ZSBvZiB0aGUgdXBwZXIgZWRnZSBvZiB0aGUgSGVybWl0ZSBmdW5jdGlvbi5cclxuICogQHBhcmFtIHtOb2RlIHwgbnVtYmVyfSB4IC0gVGhlIHNvdXJjZSB2YWx1ZSBmb3IgaW50ZXJwb2xhdGlvbi5cclxuICogQHJldHVybnMge05vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgc21vb3Roc3RlcCA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBNYXRoTm9kZSwgTWF0aE5vZGUuU01PT1RIU1RFUCApLnNldFBhcmFtZXRlckxlbmd0aCggMyApO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSB2ZWN0b3IgcG9pbnRpbmcgaW4gdGhlIHNhbWUgZGlyZWN0aW9uIGFzIGFub3RoZXIuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMyfHZlYzN8dmVjND59IE4gLSBUaGUgdmVjdG9yIHRvIG9yaWVudC5cclxuICogQHBhcmFtIHtOb2RlPHZlYzJ8dmVjM3x2ZWM0Pn0gSSAtIFRoZSBpbmNpZGVudCB2ZWN0b3IuXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMyfHZlYzN8dmVjND59IE5yZWYgLSBUaGUgcmVmZXJlbmNlIHZlY3Rvci5cclxuICogQHJldHVybnMge05vZGU8dmVjMnx2ZWMzfHZlYzQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGZhY2VGb3J3YXJkID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE1hdGhOb2RlLCBNYXRoTm9kZS5GQUNFRk9SV0FSRCApLnNldFBhcmFtZXRlckxlbmd0aCggMyApO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSByYW5kb20gdmFsdWUgZm9yIHRoZSBnaXZlbiB1di5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlPHZlYzI+fSB1diAtIFRoZSB1diBub2RlLlxyXG4gKiBAcmV0dXJucyB7Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcmFuZCA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyB1diBdICkgPT4ge1xyXG5cclxuXHRjb25zdCBhID0gMTIuOTg5OCwgYiA9IDc4LjIzMywgYyA9IDQzNzU4LjU0NTM7XHJcblx0Y29uc3QgZHQgPSBkb3QoIHV2Lnh5LCB2ZWMyKCBhLCBiICkgKSwgc24gPSBtb2QoIGR0LCBQSSApO1xyXG5cclxuXHRyZXR1cm4gZnJhY3QoIHNpbiggc24gKS5tdWwoIGMgKSApO1xyXG5cclxufSApO1xyXG5cclxuLyoqXHJcbiAqIEFsaWFzIGZvciBgbWl4KClgIHdpdGggYSBkaWZmZXJlbnQgcGFyYW1ldGVyIG9yZGVyLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGUgfCBudW1iZXJ9IHQgLSBUaGUgaW50ZXJwb2xhdGlvbiB2YWx1ZS5cclxuICogQHBhcmFtIHtOb2RlIHwgbnVtYmVyfSBlMSAtIFRoZSBmaXJzdCBwYXJhbWV0ZXIuXHJcbiAqIEBwYXJhbSB7Tm9kZSB8IG51bWJlcn0gZTIgLSBUaGUgc2Vjb25kIHBhcmFtZXRlci5cclxuICogQHJldHVybnMge05vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbWl4RWxlbWVudCA9ICggdCwgZTEsIGUyICkgPT4gbWl4KCBlMSwgZTIsIHQgKTtcclxuXHJcbi8qKlxyXG4gKiBBbGlhcyBmb3IgYHNtb290aHN0ZXAoKWAgd2l0aCBhIGRpZmZlcmVudCBwYXJhbWV0ZXIgb3JkZXIuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZSB8IG51bWJlcn0geCAtIFRoZSBzb3VyY2UgdmFsdWUgZm9yIGludGVycG9sYXRpb24uXHJcbiAqIEBwYXJhbSB7Tm9kZSB8IG51bWJlcn0gbG93IC0gVGhlIHZhbHVlIG9mIHRoZSBsb3dlciBlZGdlIG9mIHRoZSBIZXJtaXRlIGZ1bmN0aW9uLlxyXG4gKiBAcGFyYW0ge05vZGUgfCBudW1iZXJ9IGhpZ2ggLSBUaGUgdmFsdWUgb2YgdGhlIHVwcGVyIGVkZ2Ugb2YgdGhlIEhlcm1pdGUgZnVuY3Rpb24uXHJcbiAqIEByZXR1cm5zIHtOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHNtb290aHN0ZXBFbGVtZW50ID0gKCB4LCBsb3csIGhpZ2ggKSA9PiBzbW9vdGhzdGVwKCBsb3csIGhpZ2gsIHggKTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBhcmMtdGFuZ2VudCBvZiB0aGUgcXVvdGllbnQgb2YgaXRzIHBhcmFtZXRlcnMuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBkZXByZWNhdGVkIHNpbmNlIHIxNzIuIFVzZSB7QGxpbmsgYXRhbn0gaW5zdGVhZC5cclxuICpcclxuICogQHBhcmFtIHtOb2RlIHwgbnVtYmVyfSB5IC0gVGhlIHkgcGFyYW1ldGVyLlxyXG4gKiBAcGFyYW0ge05vZGUgfCBudW1iZXJ9IHggLSBUaGUgeCBwYXJhbWV0ZXIuXHJcbiAqIEByZXR1cm5zIHtOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGF0YW4yID0gKCB5LCB4ICkgPT4geyAvLyBAZGVwcmVjYXRlZCwgcjE3MlxyXG5cclxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5UU0w6IFwiYXRhbjJcIiBpcyBvdmVybG9hZGVkLiBVc2UgXCJhdGFuXCIgaW5zdGVhZC4nICk7XHJcblx0cmV0dXJuIGF0YW4oIHksIHggKTtcclxuXHJcbn07XHJcblxyXG4vLyBHTFNMIGFsaWFzIGZ1bmN0aW9uXHJcblxyXG5leHBvcnQgY29uc3QgZmFjZWZvcndhcmQgPSBmYWNlRm9yd2FyZDtcclxuZXhwb3J0IGNvbnN0IGludmVyc2VzcXJ0ID0gaW52ZXJzZVNxcnQ7XHJcblxyXG4vLyBNZXRob2QgY2hhaW5pbmdcclxuXHJcbmFkZE1ldGhvZENoYWluaW5nKCAnYWxsJywgYWxsICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAnYW55JywgYW55ICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAnZXF1YWxzJywgZXF1YWxzICk7XHJcblxyXG5hZGRNZXRob2RDaGFpbmluZyggJ3JhZGlhbnMnLCByYWRpYW5zICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAnZGVncmVlcycsIGRlZ3JlZXMgKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICdleHAnLCBleHAgKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICdleHAyJywgZXhwMiApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ2xvZycsIGxvZyApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ2xvZzInLCBsb2cyICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAnc3FydCcsIHNxcnQgKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICdpbnZlcnNlU3FydCcsIGludmVyc2VTcXJ0ICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAnZmxvb3InLCBmbG9vciApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ2NlaWwnLCBjZWlsICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAnbm9ybWFsaXplJywgbm9ybWFsaXplICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAnZnJhY3QnLCBmcmFjdCApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ3NpbicsIHNpbiApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ2NvcycsIGNvcyApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ3RhbicsIHRhbiApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ2FzaW4nLCBhc2luICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAnYWNvcycsIGFjb3MgKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICdhdGFuJywgYXRhbiApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ2FicycsIGFicyApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ3NpZ24nLCBzaWduICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAnbGVuZ3RoJywgbGVuZ3RoICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAnbGVuZ3RoU3EnLCBsZW5ndGhTcSApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ25lZ2F0ZScsIG5lZ2F0ZSApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ29uZU1pbnVzJywgb25lTWludXMgKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICdkRmR4JywgZEZkeCApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ2RGZHknLCBkRmR5ICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAncm91bmQnLCByb3VuZCApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ3JlY2lwcm9jYWwnLCByZWNpcHJvY2FsICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAndHJ1bmMnLCB0cnVuYyApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ2Z3aWR0aCcsIGZ3aWR0aCApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ2F0YW4yJywgYXRhbjIgKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICdtaW4nLCBtaW4gKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICdtYXgnLCBtYXggKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICdzdGVwJywgc3RlcCApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ3JlZmxlY3QnLCByZWZsZWN0ICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAnZGlzdGFuY2UnLCBkaXN0YW5jZSApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ2RvdCcsIGRvdCApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ2Nyb3NzJywgY3Jvc3MgKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICdwb3cnLCBwb3cgKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICdwb3cyJywgcG93MiApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ3BvdzMnLCBwb3czICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAncG93NCcsIHBvdzQgKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICd0cmFuc2Zvcm1EaXJlY3Rpb24nLCB0cmFuc2Zvcm1EaXJlY3Rpb24gKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICdtaXgnLCBtaXhFbGVtZW50ICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAnY2xhbXAnLCBjbGFtcCApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ3JlZnJhY3QnLCByZWZyYWN0ICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAnc21vb3Roc3RlcCcsIHNtb290aHN0ZXBFbGVtZW50ICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAnZmFjZUZvcndhcmQnLCBmYWNlRm9yd2FyZCApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ2RpZmZlcmVuY2UnLCBkaWZmZXJlbmNlICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAnc2F0dXJhdGUnLCBzYXR1cmF0ZSApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ2NicnQnLCBjYnJ0ICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAndHJhbnNwb3NlJywgdHJhbnNwb3NlICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAncmFuZCcsIHJhbmQgKTtcclxuIiwiaW1wb3J0IE5vZGUgZnJvbSAnLi4vY29yZS9Ob2RlLmpzJztcclxuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICcuLi9jb3JlL1Byb3BlcnR5Tm9kZS5qcyc7XHJcbmltcG9ydCB7IGFkZE1ldGhvZENoYWluaW5nLCBub2RlUHJveHkgfSBmcm9tICcuLi90c2wvVFNMQ29yZS5qcyc7XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyBhIGxvZ2ljYWwgYGlmL2Vsc2VgIHN0YXRlbWVudC4gQ2FuIGJlIHVzZWQgYXMgYW4gYWx0ZXJuYXRpdmVcclxuICogdG8gdGhlIGBJZigpYC9gRWxzZSgpYCBzeW50YXguXHJcbiAqXHJcbiAqIFRoZSBjb3JyZXNwb25kaW5nIFRTTCBgc2VsZWN0KClgIGxvb2tzIGxpa2Ugc286XHJcbiAqIGBgYGpzXHJcbiAqIHZlbG9jaXR5ID0gcG9zaXRpb24uZ3JlYXRlclRoYW5FcXVhbCggbGltaXQgKS5zZWxlY3QoIHZlbG9jaXR5Lm5lZ2F0ZSgpLCB2ZWxvY2l0eSApO1xyXG4gKiBgYGBcclxuICogVGhlIGBzZWxlY3QoKWAgbWV0aG9kIGlzIGNhbGxlZCBpbiBhIGNoYWluaW5nIGZhc2hpb24gb24gYSBjb25kaXRpb24uIFRoZSBwYXJhbWV0ZXIgbm9kZXMgb2YgYHNlbGVjdCgpYFxyXG4gKiBkZXRlcm1pbmUgdGhlIG91dGNvbWUgb2YgdGhlIGVudGlyZSBzdGF0ZW1lbnQuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBOb2RlXHJcbiAqL1xyXG5jbGFzcyBDb25kaXRpb25hbE5vZGUgZXh0ZW5kcyBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnQ29uZGl0aW9uYWxOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGNvbmRpdGlvbmFsIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV9IGNvbmROb2RlIC0gVGhlIG5vZGUgdGhhdCBkZWZpbmVzIHRoZSBjb25kaXRpb24uXHJcblx0ICogQHBhcmFtIHtOb2RlfSBpZk5vZGUgLSBUaGUgbm9kZSB0aGF0IGlzIGV2YWx1YXRlIHdoZW4gdGhlIGNvbmRpdGlvbiBlbmRzIHVwIGB0cnVlYC5cclxuXHQgKiBAcGFyYW0gez9Ob2RlfSBbZWxzZU5vZGU9bnVsbF0gLSBUaGUgbm9kZSB0aGF0IGlzIGV2YWx1YXRlIHdoZW4gdGhlIGNvbmRpdGlvbiBlbmRzIHVwIGBmYWxzZWAuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGNvbmROb2RlLCBpZk5vZGUsIGVsc2VOb2RlID0gbnVsbCApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG5vZGUgdGhhdCBkZWZpbmVzIHRoZSBjb25kaXRpb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29uZE5vZGUgPSBjb25kTm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBub2RlIHRoYXQgaXMgZXZhbHVhdGUgd2hlbiB0aGUgY29uZGl0aW9uIGVuZHMgdXAgYHRydWVgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlmTm9kZSA9IGlmTm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBub2RlIHRoYXQgaXMgZXZhbHVhdGUgd2hlbiB0aGUgY29uZGl0aW9uIGVuZHMgdXAgYGZhbHNlYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZWxzZU5vZGUgPSBlbHNlTm9kZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyBvdmVyd3JpdHRlbiBzaW5jZSB0aGUgbm9kZSB0eXBlIGlzIGluZmVycmVkIGZyb20gdGhlIGlmL2Vsc2VcclxuXHQgKiBub2Rlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgbm9kZSB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldE5vZGVUeXBlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IHsgaWZOb2RlLCBlbHNlTm9kZSB9ID0gYnVpbGRlci5nZXROb2RlUHJvcGVydGllcyggdGhpcyApO1xyXG5cclxuXHRcdGlmICggaWZOb2RlID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHQvLyBmYWxsYmFjayBzZXR1cFxyXG5cclxuXHRcdFx0dGhpcy5zZXR1cCggYnVpbGRlciApO1xyXG5cclxuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgaWZUeXBlID0gaWZOb2RlLmdldE5vZGVUeXBlKCBidWlsZGVyICk7XHJcblxyXG5cdFx0aWYgKCBlbHNlTm9kZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGVsc2VUeXBlID0gZWxzZU5vZGUuZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRcdGlmICggYnVpbGRlci5nZXRUeXBlTGVuZ3RoKCBlbHNlVHlwZSApID4gYnVpbGRlci5nZXRUeXBlTGVuZ3RoKCBpZlR5cGUgKSApIHtcclxuXHJcblx0XHRcdFx0cmV0dXJuIGVsc2VUeXBlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gaWZUeXBlO1xyXG5cclxuXHR9XHJcblxyXG5cdHNldHVwKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IGNvbmROb2RlID0gdGhpcy5jb25kTm9kZS5jYWNoZSgpO1xyXG5cdFx0Y29uc3QgaWZOb2RlID0gdGhpcy5pZk5vZGUuY2FjaGUoKTtcclxuXHRcdGNvbnN0IGVsc2VOb2RlID0gdGhpcy5lbHNlTm9kZSA/IHRoaXMuZWxzZU5vZGUuY2FjaGUoKSA6IG51bGw7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCBjdXJyZW50Tm9kZUJsb2NrID0gYnVpbGRlci5jb250ZXh0Lm5vZGVCbG9jaztcclxuXHJcblx0XHRidWlsZGVyLmdldERhdGFGcm9tTm9kZSggaWZOb2RlICkucGFyZW50Tm9kZUJsb2NrID0gY3VycmVudE5vZGVCbG9jaztcclxuXHRcdGlmICggZWxzZU5vZGUgIT09IG51bGwgKSBidWlsZGVyLmdldERhdGFGcm9tTm9kZSggZWxzZU5vZGUgKS5wYXJlbnROb2RlQmxvY2sgPSBjdXJyZW50Tm9kZUJsb2NrO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0Y29uc3QgcHJvcGVydGllcyA9IGJ1aWxkZXIuZ2V0Tm9kZVByb3BlcnRpZXMoIHRoaXMgKTtcclxuXHRcdHByb3BlcnRpZXMuY29uZE5vZGUgPSBjb25kTm9kZTtcclxuXHRcdHByb3BlcnRpZXMuaWZOb2RlID0gaWZOb2RlLmNvbnRleHQoIHsgbm9kZUJsb2NrOiBpZk5vZGUgfSApO1xyXG5cdFx0cHJvcGVydGllcy5lbHNlTm9kZSA9IGVsc2VOb2RlID8gZWxzZU5vZGUuY29udGV4dCggeyBub2RlQmxvY2s6IGVsc2VOb2RlIH0gKSA6IG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0Z2VuZXJhdGUoIGJ1aWxkZXIsIG91dHB1dCApIHtcclxuXHJcblx0XHRjb25zdCB0eXBlID0gdGhpcy5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cclxuXHRcdGNvbnN0IG5vZGVEYXRhID0gYnVpbGRlci5nZXREYXRhRnJvbU5vZGUoIHRoaXMgKTtcclxuXHJcblx0XHRpZiAoIG5vZGVEYXRhLm5vZGVQcm9wZXJ0eSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIG5vZGVEYXRhLm5vZGVQcm9wZXJ0eTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgeyBjb25kTm9kZSwgaWZOb2RlLCBlbHNlTm9kZSB9ID0gYnVpbGRlci5nZXROb2RlUHJvcGVydGllcyggdGhpcyApO1xyXG5cclxuXHRcdGNvbnN0IGZ1bmN0aW9uTm9kZSA9IGJ1aWxkZXIuY3VycmVudEZ1bmN0aW9uTm9kZTtcclxuXHRcdGNvbnN0IG5lZWRzT3V0cHV0ID0gb3V0cHV0ICE9PSAndm9pZCc7XHJcblx0XHRjb25zdCBub2RlUHJvcGVydHkgPSBuZWVkc091dHB1dCA/IHByb3BlcnR5KCB0eXBlICkuYnVpbGQoIGJ1aWxkZXIgKSA6ICcnO1xyXG5cclxuXHRcdG5vZGVEYXRhLm5vZGVQcm9wZXJ0eSA9IG5vZGVQcm9wZXJ0eTtcclxuXHJcblx0XHRjb25zdCBub2RlU25pcHBldCA9IGNvbmROb2RlLmJ1aWxkKCBidWlsZGVyLCAnYm9vbCcgKTtcclxuXHJcblx0XHRidWlsZGVyLmFkZEZsb3dDb2RlKCBgXFxuJHsgYnVpbGRlci50YWIgfWlmICggJHsgbm9kZVNuaXBwZXQgfSApIHtcXG5cXG5gICkuYWRkRmxvd1RhYigpO1xyXG5cclxuXHRcdGxldCBpZlNuaXBwZXQgPSBpZk5vZGUuYnVpbGQoIGJ1aWxkZXIsIHR5cGUgKTtcclxuXHJcblx0XHRpZiAoIGlmU25pcHBldCApIHtcclxuXHJcblx0XHRcdGlmICggbmVlZHNPdXRwdXQgKSB7XHJcblxyXG5cdFx0XHRcdGlmU25pcHBldCA9IG5vZGVQcm9wZXJ0eSArICcgPSAnICsgaWZTbmlwcGV0ICsgJzsnO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0aWZTbmlwcGV0ID0gJ3JldHVybiAnICsgaWZTbmlwcGV0ICsgJzsnO1xyXG5cclxuXHRcdFx0XHRpZiAoIGZ1bmN0aW9uTm9kZSA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5UU0w6IFJldHVybiBzdGF0ZW1lbnQgdXNlZCBpbiBhbiBpbmxpbmUgXFwnRm4oKVxcJy4gRGVmaW5lIGEgbGF5b3V0IHN0cnVjdCB0byBhbGxvdyByZXR1cm4gdmFsdWVzLicgKTtcclxuXHJcblx0XHRcdFx0XHRpZlNuaXBwZXQgPSAnLy8gJyArIGlmU25pcHBldDtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRidWlsZGVyLnJlbW92ZUZsb3dUYWIoKS5hZGRGbG93Q29kZSggYnVpbGRlci50YWIgKyAnXFx0JyArIGlmU25pcHBldCArICdcXG5cXG4nICsgYnVpbGRlci50YWIgKyAnfScgKTtcclxuXHJcblx0XHRpZiAoIGVsc2VOb2RlICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0YnVpbGRlci5hZGRGbG93Q29kZSggJyBlbHNlIHtcXG5cXG4nICkuYWRkRmxvd1RhYigpO1xyXG5cclxuXHRcdFx0bGV0IGVsc2VTbmlwcGV0ID0gZWxzZU5vZGUuYnVpbGQoIGJ1aWxkZXIsIHR5cGUgKTtcclxuXHJcblx0XHRcdGlmICggZWxzZVNuaXBwZXQgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggbmVlZHNPdXRwdXQgKSB7XHJcblxyXG5cdFx0XHRcdFx0ZWxzZVNuaXBwZXQgPSBub2RlUHJvcGVydHkgKyAnID0gJyArIGVsc2VTbmlwcGV0ICsgJzsnO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdGVsc2VTbmlwcGV0ID0gJ3JldHVybiAnICsgZWxzZVNuaXBwZXQgKyAnOyc7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBmdW5jdGlvbk5vZGUgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5UU0w6IFJldHVybiBzdGF0ZW1lbnQgdXNlZCBpbiBhbiBpbmxpbmUgXFwnRm4oKVxcJy4gRGVmaW5lIGEgbGF5b3V0IHN0cnVjdCB0byBhbGxvdyByZXR1cm4gdmFsdWVzLicgKTtcclxuXHJcblx0XHRcdFx0XHRcdGVsc2VTbmlwcGV0ID0gJy8vICcgKyBlbHNlU25pcHBldDtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGJ1aWxkZXIucmVtb3ZlRmxvd1RhYigpLmFkZEZsb3dDb2RlKCBidWlsZGVyLnRhYiArICdcXHQnICsgZWxzZVNuaXBwZXQgKyAnXFxuXFxuJyArIGJ1aWxkZXIudGFiICsgJ31cXG5cXG4nICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGJ1aWxkZXIuYWRkRmxvd0NvZGUoICdcXG5cXG4nICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBidWlsZGVyLmZvcm1hdCggbm9kZVByb3BlcnR5LCB0eXBlLCBvdXRwdXQgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQ29uZGl0aW9uYWxOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSBjb25kaXRpb25hbCBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IGNvbmROb2RlIC0gVGhlIG5vZGUgdGhhdCBkZWZpbmVzIHRoZSBjb25kaXRpb24uXHJcbiAqIEBwYXJhbSB7Tm9kZX0gaWZOb2RlIC0gVGhlIG5vZGUgdGhhdCBpcyBldmFsdWF0ZSB3aGVuIHRoZSBjb25kaXRpb24gZW5kcyB1cCBgdHJ1ZWAuXHJcbiAqIEBwYXJhbSB7P05vZGV9IFtlbHNlTm9kZT1udWxsXSAtIFRoZSBub2RlIHRoYXQgaXMgZXZhbHVhdGUgd2hlbiB0aGUgY29uZGl0aW9uIGVuZHMgdXAgYGZhbHNlYC5cclxuICogQHJldHVybnMge0NvbmRpdGlvbmFsTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBzZWxlY3QgPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggQ29uZGl0aW9uYWxOb2RlICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAyLCAzICk7XHJcblxyXG5hZGRNZXRob2RDaGFpbmluZyggJ3NlbGVjdCcsIHNlbGVjdCApO1xyXG5cclxuLy8gRGVwcmVjYXRlZFxyXG5cclxuLyoqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBkZXByZWNhdGVkIHNpbmNlIHIxNjguIFVzZSB7QGxpbmsgc2VsZWN0fSBpbnN0ZWFkLlxyXG4gKlxyXG4gKiBAcGFyYW0gey4uLmFueX0gcGFyYW1zXHJcbiAqIEByZXR1cm5zIHtDb25kaXRpb25hbE5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgY29uZCA9ICggLi4ucGFyYW1zICkgPT4geyAvLyBAZGVwcmVjYXRlZCwgcjE2OFxyXG5cclxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5UU0w6IGNvbmQoKSBoYXMgYmVlbiByZW5hbWVkIHRvIHNlbGVjdCgpLicgKTtcclxuXHRyZXR1cm4gc2VsZWN0KCAuLi5wYXJhbXMgKTtcclxuXHJcbn07XHJcblxyXG5hZGRNZXRob2RDaGFpbmluZyggJ2NvbmQnLCBjb25kICk7XHJcbiIsImltcG9ydCBOb2RlIGZyb20gJy4vTm9kZS5qcyc7XHJcbmltcG9ydCB7IGFkZE1ldGhvZENoYWluaW5nLCBub2RlUHJveHkgfSBmcm9tICcuLi90c2wvVFNMQ29yZS5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBub2RlIGNhbiBiZSB1c2VkIGFzIGEgY29udGV4dCBtYW5hZ2VtZW50IGNvbXBvbmVudCBmb3IgYW5vdGhlciBub2RlLlxyXG4gKiB7QGxpbmsgTm9kZUJ1aWxkZXJ9IHBlcmZvcm1zIGl0cyBub2RlIGJ1aWxkaW5nIHByb2Nlc3MgaW4gYSBzcGVjaWZpYyBjb250ZXh0IGFuZFxyXG4gKiB0aGlzIG5vZGUgYWxsb3dzIHRoZSBtb2RpZnkgdGhlIGNvbnRleHQuIEEgdHlwaWNhbCB1c2UgY2FzZSBpcyB0byBvdmVyd3JpdGUgYGdldFVWKClgIGUuZy46XHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqbm9kZS5jb250ZXh0KCB7IGdldFVWOiAoKSA9PiBjdXN0b21Db29yZCB9ICk7XHJcbiAqYGBgXHJcbiAqIEBhdWdtZW50cyBOb2RlXHJcbiAqL1xyXG5jbGFzcyBDb250ZXh0Tm9kZSBleHRlbmRzIE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdDb250ZXh0Tm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBjb250ZXh0IG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBUaGUgbm9kZSB3aG9zZSBjb250ZXh0IHNob3VsZCBiZSBtb2RpZmllZC5cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW3ZhbHVlPXt9XSAtIFRoZSBtb2RpZmllZCBjb250ZXh0IGRhdGEuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5vZGUsIHZhbHVlID0ge30gKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNDb250ZXh0Tm9kZSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbm9kZSB3aG9zZSBjb250ZXh0IHNob3VsZCBiZSBtb2RpZmllZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub2RlID0gbm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBtb2RpZmllZCBjb250ZXh0IGRhdGEuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqIEBkZWZhdWx0IHt9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudmFsdWUgPSB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyBvdmVyd3JpdHRlbiB0byBlbnN1cmUgaXQgcmV0dXJucyB0aGUgcmVmZXJlbmNlIHRvIHtAbGluayBDb250ZXh0Tm9kZSNub2RlfS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge05vZGV9IEEgcmVmZXJlbmNlIHRvIHtAbGluayBDb250ZXh0Tm9kZSNub2RlfS5cclxuXHQgKi9cclxuXHRnZXRTY29wZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5ub2RlLmdldFNjb3BlKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgaXMgb3ZlcndyaXR0ZW4gdG8gZW5zdXJlIGl0IHJldHVybnMgdGhlIHR5cGUgb2Yge0BsaW5rIENvbnRleHROb2RlI25vZGV9LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBub2RlIHR5cGUuXHJcblx0ICovXHJcblx0Z2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubm9kZS5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdGFuYWx5emUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0dGhpcy5ub2RlLmJ1aWxkKCBidWlsZGVyICk7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXAoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgcHJldmlvdXNDb250ZXh0ID0gYnVpbGRlci5nZXRDb250ZXh0KCk7XHJcblxyXG5cdFx0YnVpbGRlci5zZXRDb250ZXh0KCB7IC4uLmJ1aWxkZXIuY29udGV4dCwgLi4udGhpcy52YWx1ZSB9ICk7XHJcblxyXG5cdFx0Y29uc3Qgbm9kZSA9IHRoaXMubm9kZS5idWlsZCggYnVpbGRlciApO1xyXG5cclxuXHRcdGJ1aWxkZXIuc2V0Q29udGV4dCggcHJldmlvdXNDb250ZXh0ICk7XHJcblxyXG5cdFx0cmV0dXJuIG5vZGU7XHJcblxyXG5cdH1cclxuXHJcblx0Z2VuZXJhdGUoIGJ1aWxkZXIsIG91dHB1dCApIHtcclxuXHJcblx0XHRjb25zdCBwcmV2aW91c0NvbnRleHQgPSBidWlsZGVyLmdldENvbnRleHQoKTtcclxuXHJcblx0XHRidWlsZGVyLnNldENvbnRleHQoIHsgLi4uYnVpbGRlci5jb250ZXh0LCAuLi50aGlzLnZhbHVlIH0gKTtcclxuXHJcblx0XHRjb25zdCBzbmlwcGV0ID0gdGhpcy5ub2RlLmJ1aWxkKCBidWlsZGVyLCBvdXRwdXQgKTtcclxuXHJcblx0XHRidWlsZGVyLnNldENvbnRleHQoIHByZXZpb3VzQ29udGV4dCApO1xyXG5cclxuXHRcdHJldHVybiBzbmlwcGV0O1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBDb250ZXh0Tm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgY29udGV4dCBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBUaGUgbm9kZSB3aG9zZSBjb250ZXh0IHNob3VsZCBiZSBtb2RpZmllZC5cclxuICogQHBhcmFtIHtPYmplY3R9IFt2YWx1ZT17fV0gLSBUaGUgbW9kaWZpZWQgY29udGV4dCBkYXRhLlxyXG4gKiBAcmV0dXJucyB7Q29udGV4dE5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgY29udGV4dCA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBDb250ZXh0Tm9kZSApLnNldFBhcmFtZXRlckxlbmd0aCggMSwgMiApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgZGVmaW5pbmcgYSBsYWJlbCBjb250ZXh0IHZhbHVlIGZvciBhIGdpdmVuIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFRoZSBub2RlIHdob3NlIGNvbnRleHQgc2hvdWxkIGJlIG1vZGlmaWVkLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lL2xhYmVsIHRvIHNldC5cclxuICogQHJldHVybnMge0NvbnRleHROb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGxhYmVsID0gKCBub2RlLCBuYW1lICkgPT4gY29udGV4dCggbm9kZSwgeyBsYWJlbDogbmFtZSB9ICk7XHJcblxyXG5hZGRNZXRob2RDaGFpbmluZyggJ2NvbnRleHQnLCBjb250ZXh0ICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAnbGFiZWwnLCBsYWJlbCApO1xyXG4iLCJpbXBvcnQgTm9kZSBmcm9tICcuL05vZGUuanMnO1xyXG5pbXBvcnQgeyBhZGRNZXRob2RDaGFpbmluZywgbm9kZVByb3h5IH0gZnJvbSAnLi4vdHNsL1RTTENvcmUuanMnO1xyXG5cclxuLyoqXHJcbiAqIENsYXNzIGZvciByZXByZXNlbnRpbmcgc2hhZGVyIHZhcmlhYmxlcyBhcyBub2Rlcy4gVmFyaWFibGVzIGFyZSBjcmVhdGVkIGZyb21cclxuICogZXhpc3Rpbmcgbm9kZXMgbGlrZSB0aGUgZm9sbG93aW5nOlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBkZXB0aCA9IHNhbXBsZURlcHRoKCB1dk5vZGUgKS50b1ZhciggJ2RlcHRoJyApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVcclxuICovXHJcbmNsYXNzIFZhck5vZGUgZXh0ZW5kcyBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnVmFyTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB2YXJpYWJsZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIG5vZGUgZm9yIHdoaWNoIGEgdmFyaWFibGUgc2hvdWxkIGJlIGNyZWF0ZWQuXHJcblx0ICogQHBhcmFtIHs/c3RyaW5nfSBbbmFtZT1udWxsXSAtIFRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSBpbiB0aGUgc2hhZGVyLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JlYWRPbmx5PWZhbHNlXSAtIFRoZSByZWFkLW9ubHkgZmxhZy5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggbm9kZSwgbmFtZSA9IG51bGwsIHJlYWRPbmx5ID0gZmFsc2UgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBub2RlIGZvciB3aGljaCBhIHZhcmlhYmxlIHNob3VsZCBiZSBjcmVhdGVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vZGUgPSBub2RlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIGluIHRoZSBzaGFkZXIuIElmIG5vIG5hbWUgaXMgZGVmaW5lZCxcclxuXHRcdCAqIHRoZSBub2RlIHN5c3RlbSBhdXRvLWdlbmVyYXRlcyBvbmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9zdHJpbmd9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubmFtZSA9IG5hbWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBgVmFyTm9kZWAgc2V0cyB0aGlzIHByb3BlcnR5IHRvIGB0cnVlYCBieSBkZWZhdWx0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdsb2JhbCA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzVmFyTm9kZSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKlxyXG5cdFx0ICogVGhlIHJlYWQtb25seSBmbGFnLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yZWFkT25seSA9IHJlYWRPbmx5O1xyXG5cclxuXHR9XHJcblxyXG5cdGdldE1lbWJlclR5cGUoIGJ1aWxkZXIsIG5hbWUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubm9kZS5nZXRNZW1iZXJUeXBlKCBidWlsZGVyLCBuYW1lICk7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0RWxlbWVudFR5cGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubm9kZS5nZXRFbGVtZW50VHlwZSggYnVpbGRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdGdldE5vZGVUeXBlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm5vZGUuZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHRnZW5lcmF0ZSggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCB7IG5vZGUsIG5hbWUsIHJlYWRPbmx5IH0gPSB0aGlzO1xyXG5cdFx0Y29uc3QgeyByZW5kZXJlciB9ID0gYnVpbGRlcjtcclxuXHJcblx0XHRjb25zdCBpc1dlYkdQVUJhY2tlbmQgPSByZW5kZXJlci5iYWNrZW5kLmlzV2ViR1BVQmFja2VuZCA9PT0gdHJ1ZTtcclxuXHJcblx0XHRsZXQgaXNEZXRlcm1pbmlzdGljID0gZmFsc2U7XHJcblx0XHRsZXQgc2hvdWxkVHJlYXRBc1JlYWRPbmx5ID0gZmFsc2U7XHJcblxyXG5cdFx0aWYgKCByZWFkT25seSApIHtcclxuXHJcblx0XHRcdGlzRGV0ZXJtaW5pc3RpYyA9IGJ1aWxkZXIuaXNEZXRlcm1pbmlzdGljKCBub2RlICk7XHJcblxyXG5cdFx0XHRzaG91bGRUcmVhdEFzUmVhZE9ubHkgPSBpc1dlYkdQVUJhY2tlbmQgPyByZWFkT25seSA6IGlzRGV0ZXJtaW5pc3RpYztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgdmVjdG9yVHlwZSA9IGJ1aWxkZXIuZ2V0VmVjdG9yVHlwZSggdGhpcy5nZXROb2RlVHlwZSggYnVpbGRlciApICk7XHJcblx0XHRjb25zdCBzbmlwcGV0ID0gbm9kZS5idWlsZCggYnVpbGRlciwgdmVjdG9yVHlwZSApO1xyXG5cclxuXHRcdGNvbnN0IG5vZGVWYXIgPSBidWlsZGVyLmdldFZhckZyb21Ob2RlKCB0aGlzLCBuYW1lLCB2ZWN0b3JUeXBlLCB1bmRlZmluZWQsIHNob3VsZFRyZWF0QXNSZWFkT25seSApO1xyXG5cclxuXHRcdGNvbnN0IHByb3BlcnR5TmFtZSA9IGJ1aWxkZXIuZ2V0UHJvcGVydHlOYW1lKCBub2RlVmFyICk7XHJcblxyXG5cdFx0bGV0IGRlY2xhcmF0aW9uUHJlZml4ID0gcHJvcGVydHlOYW1lO1xyXG5cclxuXHRcdGlmICggc2hvdWxkVHJlYXRBc1JlYWRPbmx5ICkge1xyXG5cclxuXHRcdFx0aWYgKCBpc1dlYkdQVUJhY2tlbmQgKSB7XHJcblxyXG5cdFx0XHRcdGRlY2xhcmF0aW9uUHJlZml4ID0gaXNEZXRlcm1pbmlzdGljXHJcblx0XHRcdFx0XHQ/IGBjb25zdCAkeyBwcm9wZXJ0eU5hbWUgfWBcclxuXHRcdFx0XHRcdDogYGxldCAkeyBwcm9wZXJ0eU5hbWUgfWA7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRjb25zdCBjb3VudCA9IGJ1aWxkZXIuZ2V0QXJyYXlDb3VudCggbm9kZSApO1xyXG5cclxuXHRcdFx0XHRkZWNsYXJhdGlvblByZWZpeCA9IGBjb25zdCAkeyBidWlsZGVyLmdldFZhciggbm9kZVZhci50eXBlLCBwcm9wZXJ0eU5hbWUsIGNvdW50ICkgfWA7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGJ1aWxkZXIuYWRkTGluZUZsb3dDb2RlKCBgJHsgZGVjbGFyYXRpb25QcmVmaXggfSA9ICR7IHNuaXBwZXQgfWAsIHRoaXMgKTtcclxuXHJcblx0XHRyZXR1cm4gcHJvcGVydHlOYW1lO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBWYXJOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSB2YXIgbm9kZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIG5vZGUgZm9yIHdoaWNoIGEgdmFyaWFibGUgc2hvdWxkIGJlIGNyZWF0ZWQuXHJcbiAqIEBwYXJhbSB7P3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSBpbiB0aGUgc2hhZGVyLlxyXG4gKiBAcmV0dXJucyB7VmFyTm9kZX1cclxuICovXHJcbmNvbnN0IGNyZWF0ZVZhciA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBWYXJOb2RlICk7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIHZhciBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBUaGUgbm9kZSBmb3Igd2hpY2ggYSB2YXJpYWJsZSBzaG91bGQgYmUgY3JlYXRlZC5cclxuICogQHBhcmFtIHs/c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIGluIHRoZSBzaGFkZXIuXHJcbiAqIEByZXR1cm5zIHtWYXJOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFZhciA9ICggbm9kZSwgbmFtZSA9IG51bGwgKSA9PiBjcmVhdGVWYXIoIG5vZGUsIG5hbWUgKS5hcHBlbmQoKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgY29uc3Qgbm9kZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIG5vZGUgZm9yIHdoaWNoIGEgY29uc3RhbnQgc2hvdWxkIGJlIGNyZWF0ZWQuXHJcbiAqIEBwYXJhbSB7P3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBjb25zdGFudCBpbiB0aGUgc2hhZGVyLlxyXG4gKiBAcmV0dXJucyB7VmFyTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBDb25zdCA9ICggbm9kZSwgbmFtZSA9IG51bGwgKSA9PiBjcmVhdGVWYXIoIG5vZGUsIG5hbWUsIHRydWUgKS5hcHBlbmQoKTtcclxuXHJcbi8vIE1ldGhvZCBjaGFpbmluZ1xyXG5cclxuYWRkTWV0aG9kQ2hhaW5pbmcoICd0b1ZhcicsIFZhciApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ3RvQ29uc3QnLCBDb25zdCApO1xyXG5cclxuLy8gRGVwcmVjYXRlZFxyXG5cclxuLyoqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBkZXByZWNhdGVkIHNpbmNlIHIxNzAuIFVzZSBgVmFyKCBub2RlIClgIG9yIGBub2RlLnRvVmFyKClgIGluc3RlYWQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7YW55fSBub2RlXHJcbiAqIEByZXR1cm5zIHtWYXJOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHRlbXAgPSAoIG5vZGUgKSA9PiB7IC8vIEBkZXByZWNhdGVkLCByMTcwXHJcblxyXG5cdGNvbnNvbGUud2FybiggJ1RTTDogXCJ0ZW1wKCBub2RlIClcIiBpcyBkZXByZWNhdGVkLiBVc2UgXCJWYXIoIG5vZGUgKVwiIG9yIFwibm9kZS50b1ZhcigpXCIgaW5zdGVhZC4nICk7XHJcblxyXG5cdHJldHVybiBjcmVhdGVWYXIoIG5vZGUgKTtcclxuXHJcbn07XHJcblxyXG5hZGRNZXRob2RDaGFpbmluZyggJ3RlbXAnLCB0ZW1wICk7XHJcblxyXG4iLCJpbXBvcnQgTm9kZSBmcm9tICcuL05vZGUuanMnO1xyXG5pbXBvcnQgeyBOb2RlU2hhZGVyU3RhZ2UgfSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IGFkZE1ldGhvZENoYWluaW5nLCBub2RlUHJveHkgfSBmcm9tICcuLi90c2wvVFNMQ29yZS5qcyc7XHJcblxyXG4vKipcclxuICogQ2xhc3MgZm9yIHJlcHJlc2VudGluZyBzaGFkZXIgdmFyeWluZ3MgYXMgbm9kZXMuIFZhcnlpbmdzIGFyZSBjcmVhdGUgZnJvbVxyXG4gKiBleGlzdGluZyBub2RlcyBsaWtlIHRoZSBmb2xsb3dpbmc6XHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IHBvc2l0aW9uTG9jYWwgPSBwb3NpdGlvbkdlb21ldHJ5LnRvVmFyeWluZyggJ3ZQb3NpdGlvbkxvY2FsJyApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVcclxuICovXHJcbmNsYXNzIFZhcnlpbmdOb2RlIGV4dGVuZHMgTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ1ZhcnlpbmdOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHZhcnlpbmcgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFRoZSBub2RlIGZvciB3aGljaCBhIHZhcnlpbmcgc2hvdWxkIGJlIGNyZWF0ZWQuXHJcblx0ICogQHBhcmFtIHs/c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHZhcnlpbmcgaW4gdGhlIHNoYWRlci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggbm9kZSwgbmFtZSA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBub2RlIGZvciB3aGljaCBhIHZhcnlpbmcgc2hvdWxkIGJlIGNyZWF0ZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9kZSA9IG5vZGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbmFtZSBvZiB0aGUgdmFyeWluZyBpbiB0aGUgc2hhZGVyLiBJZiBubyBuYW1lIGlzIGRlZmluZWQsXHJcblx0XHQgKiB0aGUgbm9kZSBzeXN0ZW0gYXV0by1nZW5lcmF0ZXMgb25lLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/c3RyaW5nfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5hbWUgPSBuYW1lO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1ZhcnlpbmdOb2RlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgbWV0aG9kIGlzIG92ZXJ3cml0dGVuIHNvIGl0IGFsd2F5cyByZXR1cm5zIGB0cnVlYC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGlzIG5vZGUgaXMgZ2xvYmFsIG9yIG5vdC5cclxuXHQgKi9cclxuXHRpc0dsb2JhbCggLypidWlsZGVyKi8gKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0SGFzaCggYnVpbGRlciApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5uYW1lIHx8IHN1cGVyLmdldEhhc2goIGJ1aWxkZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHRnZXROb2RlVHlwZSggYnVpbGRlciApIHtcclxuXHJcblx0XHQvLyBWYXJ5aW5nTm9kZSBpcyBhdXRvIHR5cGVcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5ub2RlLmdldE5vZGVUeXBlKCBidWlsZGVyICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgcGVyZm9ybXMgdGhlIHNldHVwIG9mIGEgdmFyeWluZyBub2RlIHdpdGggdGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtOb2RlVmFyeWluZ30gVGhlIG5vZGUgdmFyeWluZyBmcm9tIHRoZSBub2RlIGJ1aWxkZXIuXHJcblx0ICovXHJcblx0c2V0dXBWYXJ5aW5nKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IHByb3BlcnRpZXMgPSBidWlsZGVyLmdldE5vZGVQcm9wZXJ0aWVzKCB0aGlzICk7XHJcblxyXG5cdFx0bGV0IHZhcnlpbmcgPSBwcm9wZXJ0aWVzLnZhcnlpbmc7XHJcblxyXG5cdFx0aWYgKCB2YXJ5aW5nID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBuYW1lID0gdGhpcy5uYW1lO1xyXG5cdFx0XHRjb25zdCB0eXBlID0gdGhpcy5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cclxuXHRcdFx0cHJvcGVydGllcy52YXJ5aW5nID0gdmFyeWluZyA9IGJ1aWxkZXIuZ2V0VmFyeWluZ0Zyb21Ob2RlKCB0aGlzLCBuYW1lLCB0eXBlICk7XHJcblx0XHRcdHByb3BlcnRpZXMubm9kZSA9IHRoaXMubm9kZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gdGhpcyBwcm9wZXJ0eSBjYW4gYmUgdXNlZCB0byBjaGVjayBpZiB0aGUgdmFyeWluZyBjYW4gYmUgb3B0aW1pemVkIGZvciBhIHZhcmlhYmxlXHJcblx0XHR2YXJ5aW5nLm5lZWRzSW50ZXJwb2xhdGlvbiB8fCAoIHZhcnlpbmcubmVlZHNJbnRlcnBvbGF0aW9uID0gKCBidWlsZGVyLnNoYWRlclN0YWdlID09PSAnZnJhZ21lbnQnICkgKTtcclxuXHJcblx0XHRyZXR1cm4gdmFyeWluZztcclxuXHJcblx0fVxyXG5cclxuXHRzZXR1cCggYnVpbGRlciApIHtcclxuXHJcblx0XHR0aGlzLnNldHVwVmFyeWluZyggYnVpbGRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdGFuYWx5emUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0dGhpcy5zZXR1cFZhcnlpbmcoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5ub2RlLmFuYWx5emUoIGJ1aWxkZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHRnZW5lcmF0ZSggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCBwcm9wZXJ0aWVzID0gYnVpbGRlci5nZXROb2RlUHJvcGVydGllcyggdGhpcyApO1xyXG5cdFx0Y29uc3QgdmFyeWluZyA9IHRoaXMuc2V0dXBWYXJ5aW5nKCBidWlsZGVyICk7XHJcblxyXG5cdFx0Y29uc3QgbmVlZHNSZWFzc2lnbiA9IGJ1aWxkZXIuc2hhZGVyU3RhZ2UgPT09ICdmcmFnbWVudCcgJiYgcHJvcGVydGllcy5yZWFzc2lnblBvc2l0aW9uID09PSB0cnVlICYmIGJ1aWxkZXIuY29udGV4dC5uZWVkc1Bvc2l0aW9uUmVhc3NpZ247XHJcblxyXG5cdFx0aWYgKCBwcm9wZXJ0aWVzLnByb3BlcnR5TmFtZSA9PT0gdW5kZWZpbmVkIHx8IG5lZWRzUmVhc3NpZ24gKSB7XHJcblxyXG5cdFx0XHRjb25zdCB0eXBlID0gdGhpcy5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cdFx0XHRjb25zdCBwcm9wZXJ0eU5hbWUgPSBidWlsZGVyLmdldFByb3BlcnR5TmFtZSggdmFyeWluZywgTm9kZVNoYWRlclN0YWdlLlZFUlRFWCApO1xyXG5cclxuXHRcdFx0Ly8gZm9yY2Ugbm9kZSBydW4gaW4gdmVydGV4IHN0YWdlXHJcblx0XHRcdGJ1aWxkZXIuZmxvd05vZGVGcm9tU2hhZGVyU3RhZ2UoIE5vZGVTaGFkZXJTdGFnZS5WRVJURVgsIHRoaXMubm9kZSwgdHlwZSwgcHJvcGVydHlOYW1lICk7XHJcblxyXG5cdFx0XHRwcm9wZXJ0aWVzLnByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTtcclxuXHJcblx0XHRcdGlmICggbmVlZHNSZWFzc2lnbiApIHtcclxuXHJcblx0XHRcdFx0Ly8gb25jZSByZWFzc2lnbiB2YXJ5aW5nIGluIGZyYWdtZW50IHN0YWdlXHJcblx0XHRcdFx0cHJvcGVydGllcy5yZWFzc2lnblBvc2l0aW9uID0gZmFsc2U7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBwcm9wZXJ0aWVzLnJlYXNzaWduUG9zaXRpb24gPT09IHVuZGVmaW5lZCAmJiBidWlsZGVyLmNvbnRleHQuaXNQb3NpdGlvbk5vZGVJbnB1dCApIHtcclxuXHJcblx0XHRcdFx0cHJvcGVydGllcy5yZWFzc2lnblBvc2l0aW9uID0gdHJ1ZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGJ1aWxkZXIuZ2V0UHJvcGVydHlOYW1lKCB2YXJ5aW5nICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFZhcnlpbmdOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSB2YXJ5aW5nIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFRoZSBub2RlIGZvciB3aGljaCBhIHZhcnlpbmcgc2hvdWxkIGJlIGNyZWF0ZWQuXHJcbiAqIEBwYXJhbSB7P3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB2YXJ5aW5nIGluIHRoZSBzaGFkZXIuXHJcbiAqIEByZXR1cm5zIHtWYXJ5aW5nTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCB2YXJ5aW5nID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIFZhcnlpbmdOb2RlICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAxLCAyICk7XHJcblxyXG4vKipcclxuICogQ29tcHV0ZXMgYSBub2RlIGluIHRoZSB2ZXJ0ZXggc3RhZ2UuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFRoZSBub2RlIHdoaWNoIHNob3VsZCBiZSBleGVjdXRlZCBpbiB0aGUgdmVydGV4IHN0YWdlLlxyXG4gKiBAcmV0dXJucyB7VmFyeWluZ05vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdmVydGV4U3RhZ2UgPSAoIG5vZGUgKSA9PiB2YXJ5aW5nKCBub2RlICk7XHJcblxyXG5hZGRNZXRob2RDaGFpbmluZyggJ3RvVmFyeWluZycsIHZhcnlpbmcgKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICd0b1ZlcnRleFN0YWdlJywgdmVydGV4U3RhZ2UgKTtcclxuXHJcbi8vIERlcHJlY2F0ZWRcclxuXHJcbmFkZE1ldGhvZENoYWluaW5nKCAndmFyeWluZycsICggLi4ucGFyYW1zICkgPT4geyAvLyBAZGVwcmVjYXRlZCwgcjE3M1xyXG5cclxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5UU0w6IC52YXJ5aW5nKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAudG9WYXJ5aW5nKCkuJyApO1xyXG5cdHJldHVybiB2YXJ5aW5nKCAuLi5wYXJhbXMgKTtcclxuXHJcbn0gKTtcclxuXHJcbmFkZE1ldGhvZENoYWluaW5nKCAndmVydGV4U3RhZ2UnLCAoIC4uLnBhcmFtcyApID0+IHsgLy8gQGRlcHJlY2F0ZWQsIHIxNzNcclxuXHJcblx0Y29uc29sZS53YXJuKCAnVEhSRUUuVFNMOiAudmVydGV4U3RhZ2UoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC50b1ZlcnRleFN0YWdlKCkuJyApO1xyXG5cdHJldHVybiB2YXJ5aW5nKCAuLi5wYXJhbXMgKTtcclxuXHJcbn0gKTtcclxuIiwiaW1wb3J0IHsgbWl4IH0gZnJvbSAnLi4vbWF0aC9NYXRoTm9kZS5qcyc7XHJcbmltcG9ydCB7IEZuIH0gZnJvbSAnLi4vdHNsL1RTTENvcmUuanMnO1xyXG5cclxuLyoqXHJcbiAqIENvbnZlcnRzIHRoZSBnaXZlbiBjb2xvciB2YWx1ZSBmcm9tIHNSR0IgdG8gbGluZWFyLXNSR0IgY29sb3Igc3BhY2UuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMzPn0gY29sb3IgLSBUaGUgc1JHQiBjb2xvci5cclxuICogQHJldHVybiB7Tm9kZTx2ZWMzPn0gVGhlIGxpbmVhci1zUkdCIGNvbG9yLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHNSR0JUcmFuc2ZlckVPVEYgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgY29sb3IgXSApID0+IHtcclxuXHJcblx0Y29uc3QgYSA9IGNvbG9yLm11bCggMC45NDc4NjcyOTg2ICkuYWRkKCAwLjA1MjEzMjcwMTQgKS5wb3coIDIuNCApO1xyXG5cdGNvbnN0IGIgPSBjb2xvci5tdWwoIDAuMDc3Mzk5MzgwOCApO1xyXG5cdGNvbnN0IGZhY3RvciA9IGNvbG9yLmxlc3NUaGFuRXF1YWwoIDAuMDQwNDUgKTtcclxuXHJcblx0Y29uc3QgcmdiUmVzdWx0ID0gbWl4KCBhLCBiLCBmYWN0b3IgKTtcclxuXHJcblx0cmV0dXJuIHJnYlJlc3VsdDtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnc1JHQlRyYW5zZmVyRU9URicsXHJcblx0dHlwZTogJ3ZlYzMnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAnY29sb3InLCB0eXBlOiAndmVjMycgfVxyXG5cdF1cclxufSApO1xyXG5cclxuLyoqXHJcbiAqIENvbnZlcnRzIHRoZSBnaXZlbiBjb2xvciB2YWx1ZSBmcm9tIGxpbmVhci1zUkdCIHRvIHNSR0IgY29sb3Igc3BhY2UuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMzPn0gY29sb3IgLSBUaGUgbGluZWFyLXNSR0IgY29sb3IuXHJcbiAqIEByZXR1cm4ge05vZGU8dmVjMz59IFRoZSBzUkdCIGNvbG9yLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHNSR0JUcmFuc2Zlck9FVEYgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgY29sb3IgXSApID0+IHtcclxuXHJcblx0Y29uc3QgYSA9IGNvbG9yLnBvdyggMC40MTY2NiApLm11bCggMS4wNTUgKS5zdWIoIDAuMDU1ICk7XHJcblx0Y29uc3QgYiA9IGNvbG9yLm11bCggMTIuOTIgKTtcclxuXHRjb25zdCBmYWN0b3IgPSBjb2xvci5sZXNzVGhhbkVxdWFsKCAwLjAwMzEzMDggKTtcclxuXHJcblx0Y29uc3QgcmdiUmVzdWx0ID0gbWl4KCBhLCBiLCBmYWN0b3IgKTtcclxuXHJcblx0cmV0dXJuIHJnYlJlc3VsdDtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnc1JHQlRyYW5zZmVyT0VURicsXHJcblx0dHlwZTogJ3ZlYzMnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAnY29sb3InLCB0eXBlOiAndmVjMycgfVxyXG5cdF1cclxufSApO1xyXG4iLCJpbXBvcnQgVGVtcE5vZGUgZnJvbSAnLi4vY29yZS9UZW1wTm9kZS5qcyc7XHJcbmltcG9ydCB7IGFkZE1ldGhvZENoYWluaW5nLCBtYXQzLCBub2RlT2JqZWN0LCB2ZWM0IH0gZnJvbSAnLi4vdHNsL1RTTENvcmUuanMnO1xyXG5cclxuaW1wb3J0IHsgU1JHQlRyYW5zZmVyIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgQ29sb3JNYW5hZ2VtZW50IH0gZnJvbSAnLi4vLi4vbWF0aC9Db2xvck1hbmFnZW1lbnQuanMnO1xyXG5pbXBvcnQgeyBzUkdCVHJhbnNmZXJFT1RGLCBzUkdCVHJhbnNmZXJPRVRGIH0gZnJvbSAnLi9Db2xvclNwYWNlRnVuY3Rpb25zLmpzJztcclxuaW1wb3J0IHsgTWF0cml4MyB9IGZyb20gJy4uLy4uL21hdGgvTWF0cml4My5qcyc7XHJcblxyXG5jb25zdCBXT1JLSU5HX0NPTE9SX1NQQUNFID0gJ1dvcmtpbmdDb2xvclNwYWNlJztcclxuY29uc3QgT1VUUFVUX0NPTE9SX1NQQUNFID0gJ091dHB1dENvbG9yU3BhY2UnO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgbm9kZSByZXByZXNlbnRzIGEgY29sb3Igc3BhY2UgY29udmVyc2lvbi4gTWVhbmluZyBpdCBjb252ZXJ0c1xyXG4gKiBhIGNvbG9yIHZhbHVlIGZyb20gYSBzb3VyY2UgdG8gYSB0YXJnZXQgY29sb3Igc3BhY2UuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBUZW1wTm9kZVxyXG4gKi9cclxuY2xhc3MgQ29sb3JTcGFjZU5vZGUgZXh0ZW5kcyBUZW1wTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ0NvbG9yU3BhY2VOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGNvbG9yIHNwYWNlIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV9IGNvbG9yTm9kZSAtIFJlcHJlc2VudHMgdGhlIGNvbG9yIHRvIGNvbnZlcnQuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSAtIFRoZSBzb3VyY2UgY29sb3Igc3BhY2UuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHRhcmdldCAtIFRoZSB0YXJnZXQgY29sb3Igc3BhY2UuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGNvbG9yTm9kZSwgc291cmNlLCB0YXJnZXQgKSB7XHJcblxyXG5cdFx0c3VwZXIoICd2ZWM0JyApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVwcmVzZW50cyB0aGUgY29sb3IgdG8gY29udmVydC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb2xvck5vZGUgPSBjb2xvck5vZGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc291cmNlIGNvbG9yIHNwYWNlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc291cmNlID0gc291cmNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHRhcmdldCBjb2xvciBzcGFjZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRhcmdldCA9IHRhcmdldDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCByZXNvbHZlcyB0aGUgY29uc3RhbnRzIGBXT1JLSU5HX0NPTE9SX1NQQUNFYCBhbmRcclxuXHQgKiBgT1VUUFVUX0NPTE9SX1NQQUNFYCBiYXNlZCBvbiB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIG9mIHRoZVxyXG5cdCAqIGNvbG9yIG1hbmFnZW1lbnQgYW5kIHJlbmRlcmVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gY29sb3JTcGFjZSAtIFRoZSBjb2xvciBzcGFjZSB0byByZXNvbHZlLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHJlc29sdmVkIGNvbG9yIHNwYWNlLlxyXG5cdCAqL1xyXG5cdHJlc29sdmVDb2xvclNwYWNlKCBidWlsZGVyLCBjb2xvclNwYWNlICkge1xyXG5cclxuXHRcdGlmICggY29sb3JTcGFjZSA9PT0gV09SS0lOR19DT0xPUl9TUEFDRSApIHtcclxuXHJcblx0XHRcdHJldHVybiBDb2xvck1hbmFnZW1lbnQud29ya2luZ0NvbG9yU3BhY2U7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggY29sb3JTcGFjZSA9PT0gT1VUUFVUX0NPTE9SX1NQQUNFICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIGJ1aWxkZXIuY29udGV4dC5vdXRwdXRDb2xvclNwYWNlIHx8IGJ1aWxkZXIucmVuZGVyZXIub3V0cHV0Q29sb3JTcGFjZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGNvbG9yU3BhY2U7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXAoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBjb2xvck5vZGUgfSA9IHRoaXM7XHJcblxyXG5cdFx0Y29uc3Qgc291cmNlID0gdGhpcy5yZXNvbHZlQ29sb3JTcGFjZSggYnVpbGRlciwgdGhpcy5zb3VyY2UgKTtcclxuXHRcdGNvbnN0IHRhcmdldCA9IHRoaXMucmVzb2x2ZUNvbG9yU3BhY2UoIGJ1aWxkZXIsIHRoaXMudGFyZ2V0ICk7XHJcblxyXG5cdFx0bGV0IG91dHB1dE5vZGUgPSBjb2xvck5vZGU7XHJcblxyXG5cdFx0aWYgKCBDb2xvck1hbmFnZW1lbnQuZW5hYmxlZCA9PT0gZmFsc2UgfHwgc291cmNlID09PSB0YXJnZXQgfHwgISBzb3VyY2UgfHwgISB0YXJnZXQgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gb3V0cHV0Tm9kZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBDb2xvck1hbmFnZW1lbnQuZ2V0VHJhbnNmZXIoIHNvdXJjZSApID09PSBTUkdCVHJhbnNmZXIgKSB7XHJcblxyXG5cdFx0XHRvdXRwdXROb2RlID0gdmVjNCggc1JHQlRyYW5zZmVyRU9URiggb3V0cHV0Tm9kZS5yZ2IgKSwgb3V0cHV0Tm9kZS5hICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggQ29sb3JNYW5hZ2VtZW50LmdldFByaW1hcmllcyggc291cmNlICkgIT09IENvbG9yTWFuYWdlbWVudC5nZXRQcmltYXJpZXMoIHRhcmdldCApICkge1xyXG5cclxuXHRcdFx0b3V0cHV0Tm9kZSA9IHZlYzQoXHJcblx0XHRcdFx0bWF0MyggQ29sb3JNYW5hZ2VtZW50Ll9nZXRNYXRyaXgoIG5ldyBNYXRyaXgzKCksIHNvdXJjZSwgdGFyZ2V0ICkgKS5tdWwoIG91dHB1dE5vZGUucmdiICksXHJcblx0XHRcdFx0b3V0cHV0Tm9kZS5hXHJcblx0XHRcdCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggQ29sb3JNYW5hZ2VtZW50LmdldFRyYW5zZmVyKCB0YXJnZXQgKSA9PT0gU1JHQlRyYW5zZmVyICkge1xyXG5cclxuXHRcdFx0b3V0cHV0Tm9kZSA9IHZlYzQoIHNSR0JUcmFuc2Zlck9FVEYoIG91dHB1dE5vZGUucmdiICksIG91dHB1dE5vZGUuYSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gb3V0cHV0Tm9kZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQ29sb3JTcGFjZU5vZGU7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjb252ZXJ0aW5nIGEgZ2l2ZW4gY29sb3Igbm9kZSB0byB0aGUgY3VycmVudCBvdXRwdXQgY29sb3Igc3BhY2UuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFJlcHJlc2VudHMgdGhlIG5vZGUgdG8gY29udmVydC5cclxuICogQHJldHVybnMge0NvbG9yU3BhY2VOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHRvT3V0cHV0Q29sb3JTcGFjZSA9ICggbm9kZSApID0+IG5vZGVPYmplY3QoIG5ldyBDb2xvclNwYWNlTm9kZSggbm9kZU9iamVjdCggbm9kZSApLCBXT1JLSU5HX0NPTE9SX1NQQUNFLCBPVVRQVVRfQ09MT1JfU1BBQ0UgKSApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY29udmVydGluZyBhIGdpdmVuIGNvbG9yIG5vZGUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBjb2xvciBzcGFjZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlfSBub2RlIC0gUmVwcmVzZW50cyB0aGUgbm9kZSB0byBjb252ZXJ0LlxyXG4gKiBAcmV0dXJucyB7Q29sb3JTcGFjZU5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdG9Xb3JraW5nQ29sb3JTcGFjZSA9ICggbm9kZSApID0+IG5vZGVPYmplY3QoIG5ldyBDb2xvclNwYWNlTm9kZSggbm9kZU9iamVjdCggbm9kZSApLCBPVVRQVVRfQ09MT1JfU1BBQ0UsIFdPUktJTkdfQ09MT1JfU1BBQ0UgKSApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY29udmVydGluZyBhIGdpdmVuIGNvbG9yIG5vZGUgZnJvbSB0aGUgY3VycmVudCB3b3JraW5nIGNvbG9yIHNwYWNlIHRvIHRoZSBnaXZlbiBjb2xvciBzcGFjZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlfSBub2RlIC0gUmVwcmVzZW50cyB0aGUgbm9kZSB0byBjb252ZXJ0LlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gY29sb3JTcGFjZSAtIFRoZSB0YXJnZXQgY29sb3Igc3BhY2UuXHJcbiAqIEByZXR1cm5zIHtDb2xvclNwYWNlTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCB3b3JraW5nVG9Db2xvclNwYWNlID0gKCBub2RlLCBjb2xvclNwYWNlICkgPT4gbm9kZU9iamVjdCggbmV3IENvbG9yU3BhY2VOb2RlKCBub2RlT2JqZWN0KCBub2RlICksIFdPUktJTkdfQ09MT1JfU1BBQ0UsIGNvbG9yU3BhY2UgKSApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY29udmVydGluZyBhIGdpdmVuIGNvbG9yIG5vZGUgZnJvbSB0aGUgZ2l2ZW4gY29sb3Igc3BhY2UgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBjb2xvciBzcGFjZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlfSBub2RlIC0gUmVwcmVzZW50cyB0aGUgbm9kZSB0byBjb252ZXJ0LlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gY29sb3JTcGFjZSAtIFRoZSBzb3VyY2UgY29sb3Igc3BhY2UuXHJcbiAqIEByZXR1cm5zIHtDb2xvclNwYWNlTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBjb2xvclNwYWNlVG9Xb3JraW5nID0gKCBub2RlLCBjb2xvclNwYWNlICkgPT4gbm9kZU9iamVjdCggbmV3IENvbG9yU3BhY2VOb2RlKCBub2RlT2JqZWN0KCBub2RlICksIGNvbG9yU3BhY2UsIFdPUktJTkdfQ09MT1JfU1BBQ0UgKSApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY29udmVydGluZyBhIGdpdmVuIGNvbG9yIG5vZGUgZnJvbSBvbmUgY29sb3Igc3BhY2UgdG8gYW5vdGhlciBvbmUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFJlcHJlc2VudHMgdGhlIG5vZGUgdG8gY29udmVydC5cclxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZUNvbG9yU3BhY2UgLSBUaGUgc291cmNlIGNvbG9yIHNwYWNlLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFyZ2V0Q29sb3JTcGFjZSAtIFRoZSB0YXJnZXQgY29sb3Igc3BhY2UuXHJcbiAqIEByZXR1cm5zIHtDb2xvclNwYWNlTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBjb252ZXJ0Q29sb3JTcGFjZSA9ICggbm9kZSwgc291cmNlQ29sb3JTcGFjZSwgdGFyZ2V0Q29sb3JTcGFjZSApID0+IG5vZGVPYmplY3QoIG5ldyBDb2xvclNwYWNlTm9kZSggbm9kZU9iamVjdCggbm9kZSApLCBzb3VyY2VDb2xvclNwYWNlLCB0YXJnZXRDb2xvclNwYWNlICkgKTtcclxuXHJcbmFkZE1ldGhvZENoYWluaW5nKCAndG9PdXRwdXRDb2xvclNwYWNlJywgdG9PdXRwdXRDb2xvclNwYWNlICk7XHJcbmFkZE1ldGhvZENoYWluaW5nKCAndG9Xb3JraW5nQ29sb3JTcGFjZScsIHRvV29ya2luZ0NvbG9yU3BhY2UgKTtcclxuXHJcbmFkZE1ldGhvZENoYWluaW5nKCAnd29ya2luZ1RvQ29sb3JTcGFjZScsIHdvcmtpbmdUb0NvbG9yU3BhY2UgKTtcclxuYWRkTWV0aG9kQ2hhaW5pbmcoICdjb2xvclNwYWNlVG9Xb3JraW5nJywgY29sb3JTcGFjZVRvV29ya2luZyApO1xyXG4iLCJpbXBvcnQgTm9kZSBmcm9tICcuLi9jb3JlL05vZGUuanMnO1xyXG5pbXBvcnQgeyBOb2RlVXBkYXRlVHlwZSB9IGZyb20gJy4uL2NvcmUvY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgdW5pZm9ybSB9IGZyb20gJy4uL2NvcmUvVW5pZm9ybU5vZGUuanMnO1xyXG5pbXBvcnQgeyBub2RlT2JqZWN0IH0gZnJvbSAnLi4vdHNsL1RTTENvcmUuanMnO1xyXG5pbXBvcnQgQXJyYXlFbGVtZW50Tm9kZSBmcm9tICcuLi91dGlscy9BcnJheUVsZW1lbnROb2RlLmpzJztcclxuXHJcbi8vIFRPRE86IEF2b2lkIGR1cGxpY2F0ZWQgY29kZSBhbmQgdWVzIG9ubHkgUmVmZXJlbmNlQmFzZU5vZGUgb3IgUmVmZXJlbmNlTm9kZVxyXG5cclxuLyoqXHJcbiAqIFRoaXMgY2xhc3MgaXMgb25seSByZWxldmFudCBpZiB0aGUgcmVmZXJlbmNlZCBwcm9wZXJ0eSBpcyBhcnJheS1saWtlLlxyXG4gKiBJbiB0aGlzIGNhc2UsIGBSZWZlcmVuY2VFbGVtZW50Tm9kZWAgYWxsb3dzIHRvIHJlZmVyIHRvIGEgc3BlY2lmaWNcclxuICogZWxlbWVudCBpbnNpZGUgdGhlIGRhdGEgc3RydWN0dXJlIHZpYSBhbiBpbmRleC5cclxuICpcclxuICogQGF1Z21lbnRzIEFycmF5RWxlbWVudE5vZGVcclxuICovXHJcbmNsYXNzIFJlZmVyZW5jZUVsZW1lbnROb2RlIGV4dGVuZHMgQXJyYXlFbGVtZW50Tm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ1JlZmVyZW5jZUVsZW1lbnROb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHJlZmVyZW5jZSBlbGVtZW50IG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JlZmVyZW5jZUJhc2VOb2RlfSByZWZlcmVuY2VOb2RlIC0gVGhlIHJlZmVyZW5jZSBub2RlLlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gaW5kZXhOb2RlIC0gVGhlIGluZGV4IG5vZGUgdGhhdCBkZWZpbmVzIHRoZSBlbGVtZW50IGFjY2Vzcy5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcmVmZXJlbmNlTm9kZSwgaW5kZXhOb2RlICkge1xyXG5cclxuXHRcdHN1cGVyKCByZWZlcmVuY2VOb2RlLCBpbmRleE5vZGUgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNpbWlsYXIgdG8ge0BsaW5rIFJlZmVyZW5jZUJhc2VOb2RlI3JlZmVyZW5jZX0sIGFuIGFkZGl0aW9uYWxcclxuXHRcdCAqIHByb3BlcnR5IHJlZmVyZW5jZXMgdG8gdGhlIGN1cnJlbnQgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1JlZmVyZW5jZUJhc2VOb2RlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJlZmVyZW5jZU5vZGUgPSByZWZlcmVuY2VOb2RlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1JlZmVyZW5jZUVsZW1lbnROb2RlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyBvdmVyd3JpdHRlbiBzaW5jZSB0aGUgbm9kZSB0eXBlIGlzIGluZmVycmVkIGZyb21cclxuXHQgKiB0aGUgdW5pZm9ybSB0eXBlIG9mIHRoZSByZWZlcmVuY2Ugbm9kZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG5vZGUgdHlwZS5cclxuXHQgKi9cclxuXHRnZXROb2RlVHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5yZWZlcmVuY2VOb2RlLnVuaWZvcm1UeXBlO1xyXG5cclxuXHR9XHJcblxyXG5cdGdlbmVyYXRlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IHNuaXBwZXQgPSBzdXBlci5nZW5lcmF0ZSggYnVpbGRlciApO1xyXG5cdFx0Y29uc3QgYXJyYXlUeXBlID0gdGhpcy5yZWZlcmVuY2VOb2RlLmdldE5vZGVUeXBlKCk7XHJcblx0XHRjb25zdCBlbGVtZW50VHlwZSA9IHRoaXMuZ2V0Tm9kZVR5cGUoKTtcclxuXHJcblx0XHRyZXR1cm4gYnVpbGRlci5mb3JtYXQoIHNuaXBwZXQsIGFycmF5VHlwZSwgZWxlbWVudFR5cGUgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIEJhc2UgY2xhc3MgZm9yIG5vZGVzIHdoaWNoIGVzdGFibGlzaGVzIGEgcmVmZXJlbmNlIHRvIGEgcHJvcGVydHkgb2YgYW5vdGhlciBvYmplY3QuXHJcbiAqIEluIHRoaXMgd2F5LCB0aGUgdmFsdWUgb2YgdGhlIG5vZGUgaXMgYXV0b21hdGljYWxseSBsaW5rZWQgdG8gdGhlIHZhbHVlIG9mXHJcbiAqIHJlZmVyZW5jZWQgb2JqZWN0LiBSZWZlcmVuY2Ugbm9kZXMgaW50ZXJuYWxseSByZXByZXNlbnQgdGhlIGxpbmtlZCB2YWx1ZVxyXG4gKiBhcyBhIHVuaWZvcm0uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBOb2RlXHJcbiAqL1xyXG5jbGFzcyBSZWZlcmVuY2VCYXNlTm9kZSBleHRlbmRzIE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdSZWZlcmVuY2VCYXNlTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyByZWZlcmVuY2UgYmFzZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoZSBub2RlIHJlZmVycyB0by5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdW5pZm9ybVR5cGUgLSBUaGUgdW5pZm9ybSB0eXBlIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBwcm9wZXJ0eSB2YWx1ZS5cclxuXHQgKiBAcGFyYW0gez9PYmplY3R9IFtvYmplY3Q9bnVsbF0gLSBUaGUgb2JqZWN0IHRoZSBwcm9wZXJ0eSBiZWxvbmdzIHRvLlxyXG5cdCAqIEBwYXJhbSB7P251bWJlcn0gW2NvdW50PW51bGxdIC0gV2hlbiB0aGUgbGlua2VkIHByb3BlcnR5IGlzIGFuIGFycmF5LWxpa2UsIHRoaXMgcGFyYW1ldGVyIGRlZmluZXMgaXRzIGxlbmd0aC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcHJvcGVydHksIHVuaWZvcm1UeXBlLCBvYmplY3QgPSBudWxsLCBjb3VudCA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGUgbm9kZSByZWZlcnMgdG8uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHVuaWZvcm0gdHlwZSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgcHJvcGVydHkgdmFsdWUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51bmlmb3JtVHlwZSA9IHVuaWZvcm1UeXBlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG9iamVjdCB0aGUgcHJvcGVydHkgYmVsb25ncyB0by5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P09iamVjdH1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5vYmplY3QgPSBvYmplY3Q7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGVuIHRoZSBsaW5rZWQgcHJvcGVydHkgaXMgYW4gYXJyYXksIHRoaXMgcGFyYW1ldGVyIGRlZmluZXMgaXRzIGxlbmd0aC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb3VudCA9IGNvdW50O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHByb3BlcnR5IG5hbWUgbWlnaHQgaGF2ZSBkb3RzIHNvIG5lc3RlZCBwcm9wZXJ0aWVzIGNhbiBiZSByZWZlcnJlZC5cclxuXHRcdCAqIFRoZSBoaWVyYXJjaHkgb2YgdGhlIG5hbWVzIGlzIHN0b3JlZCBpbnNpZGUgdGhpcyBhcnJheS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydHkuc3BsaXQoICcuJyApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUG9pbnRzIHRvIHRoZSBjdXJyZW50IHJlZmVycmVkIG9iamVjdC4gVGhpcyBwcm9wZXJ0eSBleGlzdHMgbmV4dCB0byB7QGxpbmsgUmVmZXJlbmNlTm9kZSNvYmplY3R9XHJcblx0XHQgKiBzaW5jZSB0aGUgZmluYWwgcmVmZXJlbmNlIG1pZ2h0IGJlIHVwZGF0ZWQgZnJvbSBjYWxsaW5nIGNvZGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9PYmplY3R9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVmZXJlbmNlID0gb2JqZWN0O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHVuaWZvcm0gbm9kZSB0aGF0IGhvbGRzIHRoZSB2YWx1ZSBvZiB0aGUgcmVmZXJlbmNlIG5vZGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1VuaWZvcm1Ob2RlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vZGUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHVuaWZvcm0gZ3JvdXAgb2YgdGhlIGludGVybmFsIHVuaWZvcm0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1VuaWZvcm1Hcm91cE5vZGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ3JvdXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogT3ZlcndyaXR0ZW4gc2luY2UgcmVmZXJlbmNlIG5vZGVzIGFyZSB1cGRhdGVkIHBlciBvYmplY3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqIEBkZWZhdWx0ICdvYmplY3QnXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXBkYXRlVHlwZSA9IE5vZGVVcGRhdGVUeXBlLk9CSkVDVDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB1bmlmb3JtIGdyb3VwIGZvciB0aGlzIHJlZmVyZW5jZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtVbmlmb3JtR3JvdXBOb2RlfSBncm91cCAtIFRoZSB1bmlmb3JtIGdyb3VwIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtSZWZlcmVuY2VCYXNlTm9kZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBub2RlLlxyXG5cdCAqL1xyXG5cdHNldEdyb3VwKCBncm91cCApIHtcclxuXHJcblx0XHR0aGlzLmdyb3VwID0gZ3JvdXA7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogV2hlbiB0aGUgcmVmZXJyZWQgcHJvcGVydHkgaXMgYXJyYXktbGlrZSwgdGhpcyBtZXRob2QgY2FuIGJlIHVzZWRcclxuXHQgKiB0byBhY2Nlc3MgZWxlbWVudHMgdmlhIGFuIGluZGV4IG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0luZGV4Tm9kZX0gaW5kZXhOb2RlIC0gaW5kZXhOb2RlLlxyXG5cdCAqIEByZXR1cm4ge1JlZmVyZW5jZUVsZW1lbnROb2RlfSBBIHJlZmVyZW5jZSB0byBhbiBlbGVtZW50LlxyXG5cdCAqL1xyXG5cdGVsZW1lbnQoIGluZGV4Tm9kZSApIHtcclxuXHJcblx0XHRyZXR1cm4gbm9kZU9iamVjdCggbmV3IFJlZmVyZW5jZUVsZW1lbnROb2RlKCB0aGlzLCBub2RlT2JqZWN0KCBpbmRleE5vZGUgKSApICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgbm9kZSB0eXBlIHdoaWNoIGF1dG9tYXRpY2FsbHkgZGVmaW5lcyB0aGUgaW50ZXJuYWxcclxuXHQgKiB1bmlmb3JtIHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdW5pZm9ybVR5cGUgLSBUaGUgdHlwZSB0byBzZXQuXHJcblx0ICovXHJcblx0c2V0Tm9kZVR5cGUoIHVuaWZvcm1UeXBlICkge1xyXG5cclxuXHRcdGNvbnN0IG5vZGUgPSB1bmlmb3JtKCBudWxsLCB1bmlmb3JtVHlwZSApLmdldFNlbGYoKTtcclxuXHJcblx0XHRpZiAoIHRoaXMuZ3JvdXAgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRub2RlLnNldEdyb3VwKCB0aGlzLmdyb3VwICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMubm9kZSA9IG5vZGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgaXMgb3ZlcndyaXR0ZW4gc2luY2UgdGhlIG5vZGUgdHlwZSBpcyBpbmZlcnJlZCBmcm9tXHJcblx0ICogdGhlIHR5cGUgb2YgdGhlIHJlZmVyZW5jZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBub2RlIHR5cGUuXHJcblx0ICovXHJcblx0Z2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5vZGUgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnVwZGF0ZVJlZmVyZW5jZSggYnVpbGRlciApO1xyXG5cdFx0XHR0aGlzLnVwZGF0ZVZhbHVlKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzLm5vZGUuZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZSBmcm9tIHRoZSBnaXZlbiByZWZlcnJlZCBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdD10aGlzLnJlZmVyZW5jZV0gLSBUaGUgb2JqZWN0IHRvIHJldHJpZXZlIHRoZSBwcm9wZXJ0eSB2YWx1ZSBmcm9tLlxyXG5cdCAqIEByZXR1cm4ge2FueX0gVGhlIHZhbHVlLlxyXG5cdCAqL1xyXG5cdGdldFZhbHVlRnJvbVJlZmVyZW5jZSggb2JqZWN0ID0gdGhpcy5yZWZlcmVuY2UgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBwcm9wZXJ0aWVzIH0gPSB0aGlzO1xyXG5cclxuXHRcdGxldCB2YWx1ZSA9IG9iamVjdFsgcHJvcGVydGllc1sgMCBdIF07XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAxOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHR2YWx1ZSA9IHZhbHVlWyBwcm9wZXJ0aWVzWyBpIF0gXTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFsbG93cyB0byB1cGRhdGUgdGhlIHJlZmVyZW5jZSBiYXNlZCBvbiB0aGUgZ2l2ZW4gc3RhdGUuIFRoZSBzdGF0ZSBpcyBvbmx5XHJcblx0ICogZXZhbHVhdGVkIHtAbGluayBSZWZlcmVuY2VCYXNlTm9kZSNvYmplY3R9IGlzIG5vdCBzZXQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geyhOb2RlRnJhbWV8Tm9kZUJ1aWxkZXIpfSBzdGF0ZSAtIFRoZSBjdXJyZW50IHN0YXRlLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdH0gVGhlIHVwZGF0ZWQgcmVmZXJlbmNlLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZVJlZmVyZW5jZSggc3RhdGUgKSB7XHJcblxyXG5cdFx0dGhpcy5yZWZlcmVuY2UgPSB0aGlzLm9iamVjdCAhPT0gbnVsbCA/IHRoaXMub2JqZWN0IDogc3RhdGUub2JqZWN0O1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnJlZmVyZW5jZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgb3V0cHV0IG9mIHRoZSByZWZlcmVuY2Ugbm9kZSBpcyB0aGUgaW50ZXJuYWwgdW5pZm9ybSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7VW5pZm9ybU5vZGV9IFRoZSBvdXRwdXQgbm9kZS5cclxuXHQgKi9cclxuXHRzZXR1cCgpIHtcclxuXHJcblx0XHR0aGlzLnVwZGF0ZVZhbHVlKCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubm9kZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBPdmVyd3JpdHRlbiB0byB0byB1cGRhdGUgdGhlIGludGVybmFsIHVuaWZvcm0gdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVGcmFtZX0gZnJhbWUgLSBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBub2RlIGZyYW1lLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZSggLypmcmFtZSovICkge1xyXG5cclxuXHRcdHRoaXMudXBkYXRlVmFsdWUoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXRyaWV2ZXMgdGhlIHZhbHVlIGZyb20gdGhlIHJlZmVycmVkIG9iamVjdCBwcm9wZXJ0eSBhbmQgdXNlcyBpdFxyXG5cdCAqIHRvIHVwZGF0ZWQgdGhlIGludGVybmFsIHVuaWZvcm0uXHJcblx0ICovXHJcblx0dXBkYXRlVmFsdWUoKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5vZGUgPT09IG51bGwgKSB0aGlzLnNldE5vZGVUeXBlKCB0aGlzLnVuaWZvcm1UeXBlICk7XHJcblxyXG5cdFx0Y29uc3QgdmFsdWUgPSB0aGlzLmdldFZhbHVlRnJvbVJlZmVyZW5jZSgpO1xyXG5cclxuXHRcdGlmICggQXJyYXkuaXNBcnJheSggdmFsdWUgKSApIHtcclxuXHJcblx0XHRcdHRoaXMubm9kZS5hcnJheSA9IHZhbHVlO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR0aGlzLm5vZGUudmFsdWUgPSB2YWx1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFJlZmVyZW5jZUJhc2VOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSByZWZlcmVuY2UgYmFzZSBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGUgbm9kZSByZWZlcnMgdG8uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIHVuaWZvcm0gdHlwZSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgcHJvcGVydHkgdmFsdWUuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgLSBUaGUgb2JqZWN0IHRoZSBwcm9wZXJ0eSBiZWxvbmdzIHRvLlxyXG4gKiBAcmV0dXJucyB7UmVmZXJlbmNlQmFzZU5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcmVmZXJlbmNlID0gKCBuYW1lLCB0eXBlLCBvYmplY3QgKSA9PiBub2RlT2JqZWN0KCBuZXcgUmVmZXJlbmNlQmFzZU5vZGUoIG5hbWUsIHR5cGUsIG9iamVjdCApICk7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIHJlZmVyZW5jZSBiYXNlIG5vZGUuIFVzZSB0aGlzIGZ1bmN0aW9uIGlmIHlvdSB3YW50IG5lZWQgYSByZWZlcmVuY2VcclxuICogdG8gYW4gYXJyYXktbGlrZSBwcm9wZXJ0eSB0aGF0IHNob3VsZCBiZSByZXByZXNlbnRlZCBhcyBhIHVuaWZvcm0gYnVmZmVyLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGUgbm9kZSByZWZlcnMgdG8uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIHVuaWZvcm0gdHlwZSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgcHJvcGVydHkgdmFsdWUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudCAtIFRoZSBudW1iZXIgb2YgdmFsdWUgaW5zaWRlIHRoZSBhcnJheS1saWtlIG9iamVjdC5cclxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIC0gQW4gYXJyYXktbGlrZSBvYmplY3QgdGhlIHByb3BlcnR5IGJlbG9uZ3MgdG8uXHJcbiAqIEByZXR1cm5zIHtSZWZlcmVuY2VCYXNlTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCByZWZlcmVuY2VCdWZmZXIgPSAoIG5hbWUsIHR5cGUsIGNvdW50LCBvYmplY3QgKSA9PiBub2RlT2JqZWN0KCBuZXcgUmVmZXJlbmNlQmFzZU5vZGUoIG5hbWUsIHR5cGUsIG9iamVjdCwgY291bnQgKSApO1xyXG4iLCJpbXBvcnQgUmVmZXJlbmNlQmFzZU5vZGUgZnJvbSAnLi9SZWZlcmVuY2VCYXNlTm9kZS5qcyc7XHJcbmltcG9ydCB7IG5vZGVPYmplY3QgfSBmcm9tICcuLi90c2wvVFNMQ29yZS5qcyc7XHJcbmltcG9ydCB7IHJlbmRlckdyb3VwIH0gZnJvbSAnLi4vY29yZS9Vbmlmb3JtR3JvdXBOb2RlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIG5vZGUgaXMgYSBzcGVjaWFsIHR5cGUgb2YgcmVmZXJlbmNlIG5vZGUgd2hpY2ggaXMgaW50ZW5kZWRcclxuICogZm9yIGxpbmtpbmcgcmVuZGVyZXIgcHJvcGVydGllcyB3aXRoIG5vZGUgdmFsdWVzLlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBleHBvc3VyZU5vZGUgPSByZW5kZXJlclJlZmVyZW5jZSggJ3RvbmVNYXBwaW5nRXhwb3N1cmUnLCAnZmxvYXQnLCByZW5kZXJlciApO1xyXG4gKiBgYGBcclxuICogV2hlbiBjaGFuZ2luZyBgcmVuZGVyZXIudG9uZU1hcHBpbmdFeHBvc3VyZWAsIHRoZSBub2RlIHZhbHVlIG9mIGBleHBvc3VyZU5vZGVgIHdpbGxcclxuICogYXV0b21hdGljYWxseSBiZSB1cGRhdGVkLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgUmVmZXJlbmNlQmFzZU5vZGVcclxuICovXHJcbmNsYXNzIFJlbmRlcmVyUmVmZXJlbmNlTm9kZSBleHRlbmRzIFJlZmVyZW5jZUJhc2VOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnUmVuZGVyZXJSZWZlcmVuY2VOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHJlbmRlcmVyIHJlZmVyZW5jZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoZSBub2RlIHJlZmVycyB0by5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gaW5wdXRUeXBlIC0gVGhlIHVuaWZvcm0gdHlwZSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgcHJvcGVydHkgdmFsdWUuXHJcblx0ICogQHBhcmFtIHs/UmVuZGVyZXJ9IFtyZW5kZXJlcj1udWxsXSAtIFRoZSByZW5kZXJlciB0aGUgcHJvcGVydHkgYmVsb25ncyB0by4gV2hlbiBubyByZW5kZXJlciBpcyBzZXQsXHJcblx0ICogdGhlIG5vZGUgcmVmZXJzIHRvIHRoZSByZW5kZXJlciBvZiB0aGUgY3VycmVudCBzdGF0ZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcHJvcGVydHksIGlucHV0VHlwZSwgcmVuZGVyZXIgPSBudWxsICkge1xyXG5cclxuXHRcdHN1cGVyKCBwcm9wZXJ0eSwgaW5wdXRUeXBlLCByZW5kZXJlciApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJlbmRlcmVyIHRoZSBwcm9wZXJ0eSBiZWxvbmdzIHRvLiBXaGVuIG5vIHJlbmRlcmVyIGlzIHNldCxcclxuXHRcdCAqIHRoZSBub2RlIHJlZmVycyB0byB0aGUgcmVuZGVyZXIgb2YgdGhlIGN1cnJlbnQgc3RhdGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9SZW5kZXJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xyXG5cclxuXHRcdHRoaXMuc2V0R3JvdXAoIHJlbmRlckdyb3VwICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgcmVmZXJlbmNlIGJhc2VkIG9uIHRoZSBnaXZlbiBzdGF0ZS4gVGhlIHN0YXRlIGlzIG9ubHkgZXZhbHVhdGVkXHJcblx0ICoge0BsaW5rIFJlbmRlcmVyUmVmZXJlbmNlTm9kZSNyZW5kZXJlcn0gaXMgbm90IHNldC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7KE5vZGVGcmFtZXxOb2RlQnVpbGRlcil9IHN0YXRlIC0gVGhlIGN1cnJlbnQgc3RhdGUuXHJcblx0ICogQHJldHVybiB7T2JqZWN0fSBUaGUgdXBkYXRlZCByZWZlcmVuY2UuXHJcblx0ICovXHJcblx0dXBkYXRlUmVmZXJlbmNlKCBzdGF0ZSApIHtcclxuXHJcblx0XHR0aGlzLnJlZmVyZW5jZSA9IHRoaXMucmVuZGVyZXIgIT09IG51bGwgPyB0aGlzLnJlbmRlcmVyIDogc3RhdGUucmVuZGVyZXI7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMucmVmZXJlbmNlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBSZW5kZXJlclJlZmVyZW5jZU5vZGU7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIHJlbmRlcmVyIHJlZmVyZW5jZSBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGUgbm9kZSByZWZlcnMgdG8uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIHVuaWZvcm0gdHlwZSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgcHJvcGVydHkgdmFsdWUuXHJcbiAqIEBwYXJhbSB7P1JlbmRlcmVyfSBbcmVuZGVyZXI9bnVsbF0gLSBUaGUgcmVuZGVyZXIgdGhlIHByb3BlcnR5IGJlbG9uZ3MgdG8uIFdoZW4gbm8gcmVuZGVyZXIgaXMgc2V0LFxyXG4gKiB0aGUgbm9kZSByZWZlcnMgdG8gdGhlIHJlbmRlcmVyIG9mIHRoZSBjdXJyZW50IHN0YXRlLlxyXG4gKiBAcmV0dXJucyB7UmVuZGVyZXJSZWZlcmVuY2VOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHJlbmRlcmVyUmVmZXJlbmNlID0gKCBuYW1lLCB0eXBlLCByZW5kZXJlciA9IG51bGwgKSA9PiBub2RlT2JqZWN0KCBuZXcgUmVuZGVyZXJSZWZlcmVuY2VOb2RlKCBuYW1lLCB0eXBlLCByZW5kZXJlciApICk7XHJcbiIsImltcG9ydCBUZW1wTm9kZSBmcm9tICcuLi9jb3JlL1RlbXBOb2RlLmpzJztcclxuaW1wb3J0IHsgYWRkTWV0aG9kQ2hhaW5pbmcsIG5vZGVPYmplY3QsIHZlYzQgfSBmcm9tICcuLi90c2wvVFNMQ29yZS5qcyc7XHJcbmltcG9ydCB7IHJlbmRlcmVyUmVmZXJlbmNlIH0gZnJvbSAnLi4vYWNjZXNzb3JzL1JlbmRlcmVyUmVmZXJlbmNlTm9kZS5qcyc7XHJcblxyXG5pbXBvcnQgeyBOb1RvbmVNYXBwaW5nIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgaGFzaCB9IGZyb20gJy4uL2NvcmUvTm9kZVV0aWxzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIG5vZGUgcmVwcmVzZW50cyBhIHRvbmUgbWFwcGluZyBvcGVyYXRpb24uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBUZW1wTm9kZVxyXG4gKi9cclxuY2xhc3MgVG9uZU1hcHBpbmdOb2RlIGV4dGVuZHMgVGVtcE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdUb25lTWFwcGluZ05vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgdG9uZSBtYXBwaW5nIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdG9uZU1hcHBpbmcgLSBUaGUgdG9uZSBtYXBwaW5nIHR5cGUuXHJcblx0ICogQHBhcmFtIHtOb2RlfSBleHBvc3VyZU5vZGUgLSBUaGUgdG9uZSBtYXBwaW5nIGV4cG9zdXJlLlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gW2NvbG9yTm9kZT1udWxsXSAtIFRoZSBjb2xvciBub2RlIHRvIHByb2Nlc3MuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHRvbmVNYXBwaW5nLCBleHBvc3VyZU5vZGUgPSB0b25lTWFwcGluZ0V4cG9zdXJlLCBjb2xvck5vZGUgPSBudWxsICkge1xyXG5cclxuXHRcdHN1cGVyKCAndmVjMycgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB0b25lIG1hcHBpbmcgdHlwZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRvbmVNYXBwaW5nID0gdG9uZU1hcHBpbmc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdG9uZSBtYXBwaW5nIGV4cG9zdXJlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmV4cG9zdXJlTm9kZSA9IGV4cG9zdXJlTm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlcHJlc2VudHMgdGhlIGNvbG9yIHRvIHByb2Nlc3MuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvbG9yTm9kZSA9IGNvbG9yTm9kZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBPdmVyd3JpdGVzIHRoZSBkZWZhdWx0IGBjdXN0b21DYWNoZUtleSgpYCBpbXBsZW1lbnRhdGlvbiBieSBpbmNsdWRpbmcgdGhlIHRvbmVcclxuXHQgKiBtYXBwaW5nIHR5cGUgaW50byB0aGUgY2FjaGUga2V5LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgaGFzaC5cclxuXHQgKi9cclxuXHRjdXN0b21DYWNoZUtleSgpIHtcclxuXHJcblx0XHRyZXR1cm4gaGFzaCggdGhpcy50b25lTWFwcGluZyApO1xyXG5cclxuXHR9XHJcblxyXG5cdHNldHVwKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IGNvbG9yTm9kZSA9IHRoaXMuY29sb3JOb2RlIHx8IGJ1aWxkZXIuY29udGV4dC5jb2xvcjtcclxuXHRcdGNvbnN0IHRvbmVNYXBwaW5nID0gdGhpcy50b25lTWFwcGluZztcclxuXHJcblx0XHRpZiAoIHRvbmVNYXBwaW5nID09PSBOb1RvbmVNYXBwaW5nICkgcmV0dXJuIGNvbG9yTm9kZTtcclxuXHJcblx0XHRsZXQgb3V0cHV0Tm9kZSA9IG51bGw7XHJcblxyXG5cdFx0Y29uc3QgdG9uZU1hcHBpbmdGbiA9IGJ1aWxkZXIucmVuZGVyZXIubGlicmFyeS5nZXRUb25lTWFwcGluZ0Z1bmN0aW9uKCB0b25lTWFwcGluZyApO1xyXG5cclxuXHRcdGlmICggdG9uZU1hcHBpbmdGbiAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdG91dHB1dE5vZGUgPSB2ZWM0KCB0b25lTWFwcGluZ0ZuKCBjb2xvck5vZGUucmdiLCB0aGlzLmV4cG9zdXJlTm9kZSApLCBjb2xvck5vZGUuYSApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVG9uZU1hcHBpbmdOb2RlOiBVbnN1cHBvcnRlZCBUb25lIE1hcHBpbmcgY29uZmlndXJhdGlvbi4nLCB0b25lTWFwcGluZyApO1xyXG5cclxuXHRcdFx0b3V0cHV0Tm9kZSA9IGNvbG9yTm9kZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG91dHB1dE5vZGU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFRvbmVNYXBwaW5nTm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgdG9uZSBtYXBwaW5nIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBtYXBwaW5nIC0gVGhlIHRvbmUgbWFwcGluZyB0eXBlLlxyXG4gKiBAcGFyYW0ge05vZGU8ZmxvYXQ+IHwgbnVtYmVyfSBleHBvc3VyZSAtIFRoZSB0b25lIG1hcHBpbmcgZXhwb3N1cmUuXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMzPiB8IENvbG9yfSBjb2xvciAtIFRoZSBjb2xvciBub2RlIHRvIHByb2Nlc3MuXHJcbiAqIEByZXR1cm5zIHtUb25lTWFwcGluZ05vZGU8dmVjMz59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdG9uZU1hcHBpbmcgPSAoIG1hcHBpbmcsIGV4cG9zdXJlLCBjb2xvciApID0+IG5vZGVPYmplY3QoIG5ldyBUb25lTWFwcGluZ05vZGUoIG1hcHBpbmcsIG5vZGVPYmplY3QoIGV4cG9zdXJlICksIG5vZGVPYmplY3QoIGNvbG9yICkgKSApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBnbG9iYWwgdG9uZSBtYXBwaW5nIGV4cG9zdXJlIG9mIHRoZSByZW5kZXJlci5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7UmVuZGVyZXJSZWZlcmVuY2VOb2RlPHZlYzM+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHRvbmVNYXBwaW5nRXhwb3N1cmUgPSAvKkBfX1BVUkVfXyovIHJlbmRlcmVyUmVmZXJlbmNlKCAndG9uZU1hcHBpbmdFeHBvc3VyZScsICdmbG9hdCcgKTtcclxuXHJcbmFkZE1ldGhvZENoYWluaW5nKCAndG9uZU1hcHBpbmcnLCAoIGNvbG9yLCBtYXBwaW5nLCBleHBvc3VyZSApID0+IHRvbmVNYXBwaW5nKCBtYXBwaW5nLCBleHBvc3VyZSwgY29sb3IgKSApO1xyXG4iLCJpbXBvcnQgSW5wdXROb2RlIGZyb20gJy4uL2NvcmUvSW5wdXROb2RlLmpzJztcclxuaW1wb3J0IHsgbm9kZU9iamVjdCwgYWRkTWV0aG9kQ2hhaW5pbmcgfSBmcm9tICcuLi90c2wvVFNMQ29yZS5qcyc7XHJcbmltcG9ydCB7IHZhcnlpbmcgfSBmcm9tICcuLi9jb3JlL1ZhcnlpbmdOb2RlLmpzJztcclxuXHJcbmltcG9ydCB7IEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vLi4vY29yZS9JbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcbmltcG9ydCB7IEludGVybGVhdmVkQnVmZmVyIH0gZnJvbSAnLi4vLi4vY29yZS9JbnRlcmxlYXZlZEJ1ZmZlci5qcyc7XHJcbmltcG9ydCB7IFN0YXRpY0RyYXdVc2FnZSwgRHluYW1pY0RyYXdVc2FnZSB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcblxyXG4vKipcclxuICogSW4gZWFybGllciBgdGhyZWUuanNgIHZlcnNpb25zIGl0IHdhcyBvbmx5IHBvc3NpYmxlIHRvIGRlZmluZSBhdHRyaWJ1dGUgZGF0YVxyXG4gKiBvbiBnZW9tZXRyeSBsZXZlbC4gV2l0aCBgQnVmZmVyQXR0cmlidXRlTm9kZWAsIGl0IGlzIGFsc28gcG9zc2libGUgdG8gZG8gdGhpc1xyXG4gKiBvbiB0aGUgbm9kZSBsZXZlbC5cclxuICogYGBganNcclxuICogY29uc3QgZ2VvbWV0cnkgPSBuZXcgVEhSRUUuUGxhbmVHZW9tZXRyeSgpO1xyXG4gKiBjb25zdCBwb3NpdGlvbkF0dHJpYnV0ZSA9IGdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJyApO1xyXG4gKlxyXG4gKiBjb25zdCBjb2xvcnMgPSBbXTtcclxuICogZm9yICggbGV0IGkgPSAwOyBpIDwgcG9zaXRpb24uY291bnQ7IGkgKysgKSB7XHJcbiAqIFx0Y29sb3JzLnB1c2goIDEsIDAsIDAgKTtcclxuICogfVxyXG4gKlxyXG4gKiBtYXRlcmlhbC5jb2xvck5vZGUgPSBidWZmZXJBdHRyaWJ1dGUoIG5ldyBUSFJFRS5GbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBjb2xvcnMsIDMgKSApO1xyXG4gKiBgYGBcclxuICogVGhpcyBuZXcgYXBwcm9hY2ggaXMgZXNwZWNpYWxseSBpbnRlcmVzdGluZyB3aGVuIGdlb21ldHJ5IGRhdGEgYXJlIGdlbmVyYXRlZCB2aWFcclxuICogY29tcHV0ZSBzaGFkZXJzLiBUaGUgYmVsb3cgbGluZSBjb252ZXJ0cyBhIHN0b3JhZ2UgYnVmZmVyIGludG8gYW4gYXR0cmlidXRlIG5vZGUuXHJcbiAqIGBgYGpzXHJcbiAqIG1hdGVyaWFsLnBvc2l0aW9uTm9kZSA9IHBvc2l0aW9uQnVmZmVyLnRvQXR0cmlidXRlKCk7XHJcbiAqIGBgYFxyXG4gKiBAYXVnbWVudHMgSW5wdXROb2RlXHJcbiAqL1xyXG5jbGFzcyBCdWZmZXJBdHRyaWJ1dGVOb2RlIGV4dGVuZHMgSW5wdXROb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnQnVmZmVyQXR0cmlidXRlTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBidWZmZXIgYXR0cmlidXRlIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0J1ZmZlckF0dHJpYnV0ZXxJbnRlcmxlYXZlZEJ1ZmZlcnxUeXBlZEFycmF5fSB2YWx1ZSAtIFRoZSBhdHRyaWJ1dGUgZGF0YS5cclxuXHQgKiBAcGFyYW0gez9zdHJpbmd9IFtidWZmZXJUeXBlPW51bGxdIC0gVGhlIGJ1ZmZlciB0eXBlIChlLmcuIGAndmVjMydgKS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2J1ZmZlclN0cmlkZT0wXSAtIFRoZSBidWZmZXIgc3RyaWRlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbYnVmZmVyT2Zmc2V0PTBdIC0gVGhlIGJ1ZmZlciBvZmZzZXQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHZhbHVlLCBidWZmZXJUeXBlID0gbnVsbCwgYnVmZmVyU3RyaWRlID0gMCwgYnVmZmVyT2Zmc2V0ID0gMCApIHtcclxuXHJcblx0XHRzdXBlciggdmFsdWUsIGJ1ZmZlclR5cGUgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNCdWZmZXJOb2RlID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBidWZmZXIgdHlwZSAoZS5nLiBgJ3ZlYzMnYCkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9zdHJpbmd9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYnVmZmVyVHlwZSA9IGJ1ZmZlclR5cGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYnVmZmVyIHN0cmlkZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJ1ZmZlclN0cmlkZSA9IGJ1ZmZlclN0cmlkZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBidWZmZXIgb2Zmc2V0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYnVmZmVyT2Zmc2V0ID0gYnVmZmVyT2Zmc2V0O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHVzYWdlIHByb3BlcnR5LiBTZXQgdGhpcyB0byBgVEhSRUUuRHluYW1pY0RyYXdVc2FnZWAgdmlhIGAuc2V0VXNhZ2UoKWAsXHJcblx0XHQgKiBpZiB5b3UgYXJlIHBsYW5uaW5nIHRvIHVwZGF0ZSB0aGUgYXR0cmlidXRlIGRhdGEgcGVyIGZyYW1lLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCBTdGF0aWNEcmF3VXNhZ2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51c2FnZSA9IFN0YXRpY0RyYXdVc2FnZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIGF0dHJpYnV0ZSBpcyBpbnN0YW5jZWQgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pbnN0YW5jZWQgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIHRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/QnVmZmVyQXR0cmlidXRlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmF0dHJpYnV0ZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBgQnVmZmVyQXR0cmlidXRlTm9kZWAgc2V0cyB0aGlzIHByb3BlcnR5IHRvIGB0cnVlYCBieSBkZWZhdWx0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdsb2JhbCA9IHRydWU7XHJcblxyXG5cdFx0aWYgKCB2YWx1ZSAmJiB2YWx1ZS5pc0J1ZmZlckF0dHJpYnV0ZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdHRoaXMuYXR0cmlidXRlID0gdmFsdWU7XHJcblx0XHRcdHRoaXMudXNhZ2UgPSB2YWx1ZS51c2FnZTtcclxuXHRcdFx0dGhpcy5pbnN0YW5jZWQgPSB2YWx1ZS5pc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgaXMgb3ZlcndyaXR0ZW4gc2luY2UgdGhlIGF0dHJpYnV0ZSBkYXRhIG1pZ2h0IGJlIHNoYXJlZFxyXG5cdCAqIGFuZCB0aHVzIHRoZSBoYXNoIHNob3VsZCBiZSBzaGFyZWQgYXMgd2VsbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgaGFzaC5cclxuXHQgKi9cclxuXHRnZXRIYXNoKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5idWZmZXJTdHJpZGUgPT09IDAgJiYgdGhpcy5idWZmZXJPZmZzZXQgPT09IDAgKSB7XHJcblxyXG5cdFx0XHRsZXQgYnVmZmVyRGF0YSA9IGJ1aWxkZXIuZ2xvYmFsQ2FjaGUuZ2V0RGF0YSggdGhpcy52YWx1ZSApO1xyXG5cclxuXHRcdFx0aWYgKCBidWZmZXJEYXRhID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGJ1ZmZlckRhdGEgPSB7XHJcblx0XHRcdFx0XHRub2RlOiB0aGlzXHJcblx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0YnVpbGRlci5nbG9iYWxDYWNoZS5zZXREYXRhKCB0aGlzLnZhbHVlLCBidWZmZXJEYXRhICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gYnVmZmVyRGF0YS5ub2RlLnV1aWQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzLnV1aWQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgaXMgb3ZlcndyaXR0ZW4gc2luY2UgdGhlIG5vZGUgdHlwZSBpcyBpbmZlcnJlZCBmcm9tXHJcblx0ICogdGhlIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG5vZGUgdHlwZS5cclxuXHQgKi9cclxuXHRnZXROb2RlVHlwZSggYnVpbGRlciApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuYnVmZmVyVHlwZSA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuYnVmZmVyVHlwZSA9IGJ1aWxkZXIuZ2V0VHlwZUZyb21BdHRyaWJ1dGUoIHRoaXMuYXR0cmlidXRlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzLmJ1ZmZlclR5cGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVwZW5kaW5nIG9uIHdoaWNoIHZhbHVlIHdhcyBwYXNzZWQgdG8gdGhlIG5vZGUsIGBzZXR1cCgpYCBiZWhhdmVzXHJcblx0ICogZGlmZmVyZW50bHkuIElmIG5vIGluc3RhbmNlIG9mIGBCdWZmZXJBdHRyaWJ1dGVgIHdhcyBwYXNzZWQsIHRoZSBtZXRob2RcclxuXHQgKiBjcmVhdGVzIGFuIGludGVybmFsIGF0dHJpYnV0ZSBhbmQgY29uZmlndXJlcyBpdCByZXNwZWN0aXZlbHkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqL1xyXG5cdHNldHVwKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5hdHRyaWJ1dGUgIT09IG51bGwgKSByZXR1cm47XHJcblxyXG5cdFx0Y29uc3QgdHlwZSA9IHRoaXMuZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKTtcclxuXHRcdGNvbnN0IGFycmF5ID0gdGhpcy52YWx1ZTtcclxuXHRcdGNvbnN0IGl0ZW1TaXplID0gYnVpbGRlci5nZXRUeXBlTGVuZ3RoKCB0eXBlICk7XHJcblx0XHRjb25zdCBzdHJpZGUgPSB0aGlzLmJ1ZmZlclN0cmlkZSB8fCBpdGVtU2l6ZTtcclxuXHRcdGNvbnN0IG9mZnNldCA9IHRoaXMuYnVmZmVyT2Zmc2V0O1xyXG5cclxuXHRcdGNvbnN0IGJ1ZmZlciA9IGFycmF5LmlzSW50ZXJsZWF2ZWRCdWZmZXIgPT09IHRydWUgPyBhcnJheSA6IG5ldyBJbnRlcmxlYXZlZEJ1ZmZlciggYXJyYXksIHN0cmlkZSApO1xyXG5cdFx0Y29uc3QgYnVmZmVyQXR0cmlidXRlID0gbmV3IEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKCBidWZmZXIsIGl0ZW1TaXplLCBvZmZzZXQgKTtcclxuXHJcblx0XHRidWZmZXIuc2V0VXNhZ2UoIHRoaXMudXNhZ2UgKTtcclxuXHJcblx0XHR0aGlzLmF0dHJpYnV0ZSA9IGJ1ZmZlckF0dHJpYnV0ZTtcclxuXHRcdHRoaXMuYXR0cmlidXRlLmlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlID0gdGhpcy5pbnN0YW5jZWQ7IC8vIEBUT0RPOiBBZGQgYSBwb3NzaWJsZTogSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGVcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZW5lcmF0ZXMgdGhlIGNvZGUgc25pcHBldCBvZiB0aGUgYnVmZmVyIGF0dHJpYnV0ZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBnZW5lcmF0ZWQgY29kZSBzbmlwcGV0LlxyXG5cdCAqL1xyXG5cdGdlbmVyYXRlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IG5vZGVUeXBlID0gdGhpcy5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cclxuXHRcdGNvbnN0IG5vZGVBdHRyaWJ1dGUgPSBidWlsZGVyLmdldEJ1ZmZlckF0dHJpYnV0ZUZyb21Ob2RlKCB0aGlzLCBub2RlVHlwZSApO1xyXG5cdFx0Y29uc3QgcHJvcGVydHlOYW1lID0gYnVpbGRlci5nZXRQcm9wZXJ0eU5hbWUoIG5vZGVBdHRyaWJ1dGUgKTtcclxuXHJcblx0XHRsZXQgb3V0cHV0ID0gbnVsbDtcclxuXHJcblx0XHRpZiAoIGJ1aWxkZXIuc2hhZGVyU3RhZ2UgPT09ICd2ZXJ0ZXgnIHx8IGJ1aWxkZXIuc2hhZGVyU3RhZ2UgPT09ICdjb21wdXRlJyApIHtcclxuXHJcblx0XHRcdHRoaXMubmFtZSA9IHByb3BlcnR5TmFtZTtcclxuXHJcblx0XHRcdG91dHB1dCA9IHByb3BlcnR5TmFtZTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc3Qgbm9kZVZhcnlpbmcgPSB2YXJ5aW5nKCB0aGlzICk7XHJcblxyXG5cdFx0XHRvdXRwdXQgPSBub2RlVmFyeWluZy5idWlsZCggYnVpbGRlciwgbm9kZVR5cGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG91dHB1dDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBPdmVyd3JpdGVzIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRvIHJldHVybiBhIGZpeGVkIHZhbHVlIGAnYnVmZmVyQXR0cmlidXRlJ2AuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGlucHV0IHR5cGUuXHJcblx0ICovXHJcblx0Z2V0SW5wdXRUeXBlKCAvKmJ1aWxkZXIqLyApIHtcclxuXHJcblx0XHRyZXR1cm4gJ2J1ZmZlckF0dHJpYnV0ZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgYHVzYWdlYCBwcm9wZXJ0eSB0byB0aGUgZ2l2ZW4gdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgdXNhZ2UgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge0J1ZmZlckF0dHJpYnV0ZU5vZGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbm9kZS5cclxuXHQgKi9cclxuXHRzZXRVc2FnZSggdmFsdWUgKSB7XHJcblxyXG5cdFx0dGhpcy51c2FnZSA9IHZhbHVlO1xyXG5cclxuXHRcdGlmICggdGhpcy5hdHRyaWJ1dGUgJiYgdGhpcy5hdHRyaWJ1dGUuaXNCdWZmZXJBdHRyaWJ1dGUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmF0dHJpYnV0ZS51c2FnZSA9IHZhbHVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBgaW5zdGFuY2VkYCBwcm9wZXJ0eSB0byB0aGUgZ2l2ZW4gdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbHVlIC0gVGhlIHZhbHVlIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtCdWZmZXJBdHRyaWJ1dGVOb2RlfSBBIHJlZmVyZW5jZSB0byB0aGlzIG5vZGUuXHJcblx0ICovXHJcblx0c2V0SW5zdGFuY2VkKCB2YWx1ZSApIHtcclxuXHJcblx0XHR0aGlzLmluc3RhbmNlZCA9IHZhbHVlO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBCdWZmZXJBdHRyaWJ1dGVOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSBidWZmZXIgYXR0cmlidXRlIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7QnVmZmVyQXR0cmlidXRlfEludGVybGVhdmVkQnVmZmVyfFR5cGVkQXJyYXl9IGFycmF5IC0gVGhlIGF0dHJpYnV0ZSBkYXRhLlxyXG4gKiBAcGFyYW0gez9zdHJpbmd9IFt0eXBlPW51bGxdIC0gVGhlIGJ1ZmZlciB0eXBlIChlLmcuIGAndmVjMydgKS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtzdHJpZGU9MF0gLSBUaGUgYnVmZmVyIHN0cmlkZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXQ9MF0gLSBUaGUgYnVmZmVyIG9mZnNldC5cclxuICogQHJldHVybnMge0J1ZmZlckF0dHJpYnV0ZU5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYnVmZmVyQXR0cmlidXRlID0gKCBhcnJheSwgdHlwZSA9IG51bGwsIHN0cmlkZSA9IDAsIG9mZnNldCA9IDAgKSA9PiBub2RlT2JqZWN0KCBuZXcgQnVmZmVyQXR0cmlidXRlTm9kZSggYXJyYXksIHR5cGUsIHN0cmlkZSwgb2Zmc2V0ICkgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgYnVmZmVyIGF0dHJpYnV0ZSBub2RlIGJ1dCB3aXRoIGR5bmFtaWMgZHJhdyB1c2FnZS5cclxuICogVXNlIHRoaXMgZnVuY3Rpb24gaWYgYXR0cmlidXRlIGRhdGEgYXJlIHVwZGF0ZWQgcGVyIGZyYW1lLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge0J1ZmZlckF0dHJpYnV0ZXxJbnRlcmxlYXZlZEJ1ZmZlcnxUeXBlZEFycmF5fSBhcnJheSAtIFRoZSBhdHRyaWJ1dGUgZGF0YS5cclxuICogQHBhcmFtIHs/c3RyaW5nfSBbdHlwZT1udWxsXSAtIFRoZSBidWZmZXIgdHlwZSAoZS5nLiBgJ3ZlYzMnYCkuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RyaWRlPTBdIC0gVGhlIGJ1ZmZlciBzdHJpZGUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0PTBdIC0gVGhlIGJ1ZmZlciBvZmZzZXQuXHJcbiAqIEByZXR1cm5zIHtCdWZmZXJBdHRyaWJ1dGVOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGR5bmFtaWNCdWZmZXJBdHRyaWJ1dGUgPSAoIGFycmF5LCB0eXBlID0gbnVsbCwgc3RyaWRlID0gMCwgb2Zmc2V0ID0gMCApID0+IGJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIHR5cGUsIHN0cmlkZSwgb2Zmc2V0ICkuc2V0VXNhZ2UoIER5bmFtaWNEcmF3VXNhZ2UgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgYnVmZmVyIGF0dHJpYnV0ZSBub2RlIGJ1dCB3aXRoIGVuYWJsZWQgaW5zdGFuY2luZ1xyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge0J1ZmZlckF0dHJpYnV0ZXxJbnRlcmxlYXZlZEJ1ZmZlcnxUeXBlZEFycmF5fSBhcnJheSAtIFRoZSBhdHRyaWJ1dGUgZGF0YS5cclxuICogQHBhcmFtIHs/c3RyaW5nfSBbdHlwZT1udWxsXSAtIFRoZSBidWZmZXIgdHlwZSAoZS5nLiBgJ3ZlYzMnYCkuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RyaWRlPTBdIC0gVGhlIGJ1ZmZlciBzdHJpZGUuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0PTBdIC0gVGhlIGJ1ZmZlciBvZmZzZXQuXHJcbiAqIEByZXR1cm5zIHtCdWZmZXJBdHRyaWJ1dGVOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSA9ICggYXJyYXksIHR5cGUgPSBudWxsLCBzdHJpZGUgPSAwLCBvZmZzZXQgPSAwICkgPT4gYnVmZmVyQXR0cmlidXRlKCBhcnJheSwgdHlwZSwgc3RyaWRlLCBvZmZzZXQgKS5zZXRJbnN0YW5jZWQoIHRydWUgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgYnVmZmVyIGF0dHJpYnV0ZSBub2RlIGJ1dCB3aXRoIGR5bmFtaWMgZHJhdyB1c2FnZSBhbmQgZW5hYmxlZCBpbnN0YW5jaW5nXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7QnVmZmVyQXR0cmlidXRlfEludGVybGVhdmVkQnVmZmVyfFR5cGVkQXJyYXl9IGFycmF5IC0gVGhlIGF0dHJpYnV0ZSBkYXRhLlxyXG4gKiBAcGFyYW0gez9zdHJpbmd9IFt0eXBlPW51bGxdIC0gVGhlIGJ1ZmZlciB0eXBlIChlLmcuIGAndmVjMydgKS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtzdHJpZGU9MF0gLSBUaGUgYnVmZmVyIHN0cmlkZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXQ9MF0gLSBUaGUgYnVmZmVyIG9mZnNldC5cclxuICogQHJldHVybnMge0J1ZmZlckF0dHJpYnV0ZU5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgaW5zdGFuY2VkRHluYW1pY0J1ZmZlckF0dHJpYnV0ZSA9ICggYXJyYXksIHR5cGUgPSBudWxsLCBzdHJpZGUgPSAwLCBvZmZzZXQgPSAwICkgPT4gZHluYW1pY0J1ZmZlckF0dHJpYnV0ZSggYXJyYXksIHR5cGUsIHN0cmlkZSwgb2Zmc2V0ICkuc2V0SW5zdGFuY2VkKCB0cnVlICk7XHJcblxyXG5hZGRNZXRob2RDaGFpbmluZyggJ3RvQXR0cmlidXRlJywgKCBidWZmZXJOb2RlICkgPT4gYnVmZmVyQXR0cmlidXRlKCBidWZmZXJOb2RlLnZhbHVlICkgKTtcclxuIiwiaW1wb3J0IE5vZGUgZnJvbSAnLi4vY29yZS9Ob2RlLmpzJztcclxuaW1wb3J0IHsgTm9kZVVwZGF0ZVR5cGUgfSBmcm9tICcuLi9jb3JlL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IGFkZE1ldGhvZENoYWluaW5nLCBub2RlT2JqZWN0IH0gZnJvbSAnLi4vdHNsL1RTTENvcmUuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRPRE9cclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVcclxuICovXHJcbmNsYXNzIENvbXB1dGVOb2RlIGV4dGVuZHMgTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ0NvbXB1dGVOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGNvbXB1dGUgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gY29tcHV0ZU5vZGUgLSBUT0RPXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGNvdW50IC0gVE9ETy5cclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IFt3b3JrZ3JvdXBTaXplPVs2NF1dIC0gVE9ETy5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggY29tcHV0ZU5vZGUsIGNvdW50LCB3b3JrZ3JvdXBTaXplID0gWyA2NCBdICkge1xyXG5cclxuXHRcdHN1cGVyKCAndm9pZCcgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNDb21wdXRlTm9kZSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUT0RPXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29tcHV0ZU5vZGUgPSBjb21wdXRlTm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRPRE9cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvdW50ID0gY291bnQ7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUT0RPXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PG51bWJlcj59XHJcblx0XHQgKiBAZGVmYXVsdCBbNjRdXHJcblx0XHQgKi9cclxuXHRcdHRoaXMud29ya2dyb3VwU2l6ZSA9IHdvcmtncm91cFNpemU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUT0RPXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kaXNwYXRjaENvdW50ID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRPRE9cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnZlcnNpb24gPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG5hbWUgb3IgbGFiZWwgb2YgdGhlIHVuaWZvcm0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqIEBkZWZhdWx0ICcnXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubmFtZSA9ICcnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGB1cGRhdGVCZWZvcmVUeXBlYCBpcyBzZXQgdG8gYE5vZGVVcGRhdGVUeXBlLk9CSkVDVGAgc2luY2Uge0BsaW5rIENvbXB1dGVOb2RlI3VwZGF0ZUJlZm9yZX1cclxuXHRcdCAqIGlzIGV4ZWN1dGVkIG9uY2UgcGVyIG9iamVjdCBieSBkZWZhdWx0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKiBAZGVmYXVsdCAnb2JqZWN0J1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVwZGF0ZUJlZm9yZVR5cGUgPSBOb2RlVXBkYXRlVHlwZS5PQkpFQ1Q7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUT0RPXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9GdW5jdGlvbn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5vbkluaXRGdW5jdGlvbiA9IG51bGw7XHJcblxyXG5cdFx0dGhpcy51cGRhdGVEaXNwYXRjaENvdW50KCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRXhlY3V0ZXMgdGhlIGBkaXNwb3NlYCBldmVudCBmb3IgdGhpcyBub2RlLlxyXG5cdCAqL1xyXG5cdGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdkaXNwb3NlJyB9ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUge0BsaW5rIENvbXB1dGVOb2RlI25hbWV9IHByb3BlcnR5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdW5pZm9ybS5cclxuXHQgKiBAcmV0dXJuIHtDb21wdXRlTm9kZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBub2RlLlxyXG5cdCAqL1xyXG5cdGxhYmVsKCBuYW1lICkge1xyXG5cclxuXHRcdHRoaXMubmFtZSA9IG5hbWU7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVE9ET1xyXG5cdCAqL1xyXG5cdHVwZGF0ZURpc3BhdGNoQ291bnQoKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBjb3VudCwgd29ya2dyb3VwU2l6ZSB9ID0gdGhpcztcclxuXHJcblx0XHRsZXQgc2l6ZSA9IHdvcmtncm91cFNpemVbIDAgXTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDE7IGkgPCB3b3JrZ3JvdXBTaXplLmxlbmd0aDsgaSArKyApXHJcblx0XHRcdHNpemUgKj0gd29ya2dyb3VwU2l6ZVsgaSBdO1xyXG5cclxuXHRcdHRoaXMuZGlzcGF0Y2hDb3VudCA9IE1hdGguY2VpbCggY291bnQgLyBzaXplICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVE9ET1xyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgLSBUT0RPLlxyXG5cdCAqIEByZXR1cm4ge0NvbXB1dGVOb2RlfSBBIHJlZmVyZW5jZSB0byB0aGlzIG5vZGUuXHJcblx0ICovXHJcblx0b25Jbml0KCBjYWxsYmFjayApIHtcclxuXHJcblx0XHR0aGlzLm9uSW5pdEZ1bmN0aW9uID0gY2FsbGJhY2s7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIG1ldGhvZCBleGVjdXRlIHRoZSBjb21wdXRlIGZvciB0aGlzIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVGcmFtZX0gZnJhbWUgLSBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBub2RlIGZyYW1lLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZUJlZm9yZSggeyByZW5kZXJlciB9ICkge1xyXG5cclxuXHRcdHJlbmRlcmVyLmNvbXB1dGUoIHRoaXMgKTtcclxuXHJcblx0fVxyXG5cclxuXHRzZXR1cCggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCByZXN1bHQgPSB0aGlzLmNvbXB1dGVOb2RlLnNldHVwKCBidWlsZGVyICk7XHJcblxyXG5cdFx0aWYgKCByZXN1bHQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBwcm9wZXJ0aWVzID0gYnVpbGRlci5nZXROb2RlUHJvcGVydGllcyggdGhpcyApO1xyXG5cdFx0XHRwcm9wZXJ0aWVzLm91dHB1dENvbXB1dGVOb2RlID0gcmVzdWx0Lm91dHB1dE5vZGU7XHJcblxyXG5cdFx0XHRyZXN1bHQub3V0cHV0Tm9kZSA9IG51bGw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblxyXG5cdH1cclxuXHJcblx0Z2VuZXJhdGUoIGJ1aWxkZXIsIG91dHB1dCApIHtcclxuXHJcblx0XHRjb25zdCB7IHNoYWRlclN0YWdlIH0gPSBidWlsZGVyO1xyXG5cclxuXHRcdGlmICggc2hhZGVyU3RhZ2UgPT09ICdjb21wdXRlJyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHNuaXBwZXQgPSB0aGlzLmNvbXB1dGVOb2RlLmJ1aWxkKCBidWlsZGVyLCAndm9pZCcgKTtcclxuXHJcblx0XHRcdGlmICggc25pcHBldCAhPT0gJycgKSB7XHJcblxyXG5cdFx0XHRcdGJ1aWxkZXIuYWRkTGluZUZsb3dDb2RlKCBzbmlwcGV0LCB0aGlzICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGNvbnN0IHByb3BlcnRpZXMgPSBidWlsZGVyLmdldE5vZGVQcm9wZXJ0aWVzKCB0aGlzICk7XHJcblx0XHRcdGNvbnN0IG91dHB1dENvbXB1dGVOb2RlID0gcHJvcGVydGllcy5vdXRwdXRDb21wdXRlTm9kZTtcclxuXHJcblx0XHRcdGlmICggb3V0cHV0Q29tcHV0ZU5vZGUgKSB7XHJcblxyXG5cdFx0XHRcdHJldHVybiBvdXRwdXRDb21wdXRlTm9kZS5idWlsZCggYnVpbGRlciwgb3V0cHV0ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBDb21wdXRlTm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgY29tcHV0ZSBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBUT0RPXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudCAtIFRPRE8uXHJcbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gW3dvcmtncm91cFNpemU9WzY0XV0gLSBUT0RPLlxyXG4gKiBAcmV0dXJucyB7QXRvbWljRnVuY3Rpb25Ob2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGNvbXB1dGUgPSAoIG5vZGUsIGNvdW50LCB3b3JrZ3JvdXBTaXplICkgPT4gbm9kZU9iamVjdCggbmV3IENvbXB1dGVOb2RlKCBub2RlT2JqZWN0KCBub2RlICksIGNvdW50LCB3b3JrZ3JvdXBTaXplICkgKTtcclxuXHJcbmFkZE1ldGhvZENoYWluaW5nKCAnY29tcHV0ZScsIGNvbXB1dGUgKTtcclxuIiwiaW1wb3J0IE5vZGUgZnJvbSAnLi9Ob2RlLmpzJztcclxuaW1wb3J0IHsgYWRkTWV0aG9kQ2hhaW5pbmcsIG5vZGVPYmplY3QgfSBmcm9tICcuLi90c2wvVFNMQ29yZS5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBub2RlIGNhbiBiZSB1c2VkIGFzIGEgY2FjaGUgbWFuYWdlbWVudCBjb21wb25lbnQgZm9yIGFub3RoZXIgbm9kZS5cclxuICogQ2FjaGluZyBpcyBpbiBnZW5lcmFsIHVzZWQgYnkgZGVmYXVsdCBpbiB7QGxpbmsgTm9kZUJ1aWxkZXJ9IGJ1dCB0aGlzIG5vZGVcclxuICogYWxsb3dzIHRoZSB1c2FnZSBvZiBhIHNoYXJlZCBwYXJlbnQgY2FjaGUgZHVyaW5nIHRoZSBidWlsZCBwcm9jZXNzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTm9kZVxyXG4gKi9cclxuY2xhc3MgQ2FjaGVOb2RlIGV4dGVuZHMgTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ0NhY2hlTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBjYWNoZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIG5vZGUgdGhhdCBzaG91bGQgYmUgY2FjaGVkLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BhcmVudD10cnVlXSAtIFdoZXRoZXIgdGhpcyBub2RlIHJlZmVycyB0byBhIHNoYXJlZCBwYXJlbnQgY2FjaGUgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBub2RlLCBwYXJlbnQgPSB0cnVlICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbm9kZSB0aGF0IHNob3VsZCBiZSBjYWNoZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9kZSA9IG5vZGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoaXMgbm9kZSByZWZlcnMgdG8gYSBzaGFyZWQgcGFyZW50IGNhY2hlIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wYXJlbnQgPSBwYXJlbnQ7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzQ2FjaGVOb2RlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHRnZXROb2RlVHlwZSggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCBwcmV2aW91c0NhY2hlID0gYnVpbGRlci5nZXRDYWNoZSgpO1xyXG5cdFx0Y29uc3QgY2FjaGUgPSBidWlsZGVyLmdldENhY2hlRnJvbU5vZGUoIHRoaXMsIHRoaXMucGFyZW50ICk7XHJcblxyXG5cdFx0YnVpbGRlci5zZXRDYWNoZSggY2FjaGUgKTtcclxuXHJcblx0XHRjb25zdCBub2RlVHlwZSA9IHRoaXMubm9kZS5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cclxuXHRcdGJ1aWxkZXIuc2V0Q2FjaGUoIHByZXZpb3VzQ2FjaGUgKTtcclxuXHJcblx0XHRyZXR1cm4gbm9kZVR5cGU7XHJcblxyXG5cdH1cclxuXHJcblx0YnVpbGQoIGJ1aWxkZXIsIC4uLnBhcmFtcyApIHtcclxuXHJcblx0XHRjb25zdCBwcmV2aW91c0NhY2hlID0gYnVpbGRlci5nZXRDYWNoZSgpO1xyXG5cdFx0Y29uc3QgY2FjaGUgPSBidWlsZGVyLmdldENhY2hlRnJvbU5vZGUoIHRoaXMsIHRoaXMucGFyZW50ICk7XHJcblxyXG5cdFx0YnVpbGRlci5zZXRDYWNoZSggY2FjaGUgKTtcclxuXHJcblx0XHRjb25zdCBkYXRhID0gdGhpcy5ub2RlLmJ1aWxkKCBidWlsZGVyLCAuLi5wYXJhbXMgKTtcclxuXHJcblx0XHRidWlsZGVyLnNldENhY2hlKCBwcmV2aW91c0NhY2hlICk7XHJcblxyXG5cdFx0cmV0dXJuIGRhdGE7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IENhY2hlTm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgY2FjaGUgbm9kZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIG5vZGUgdGhhdCBzaG91bGQgYmUgY2FjaGVkLlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwYXJlbnRdIC0gV2hldGhlciB0aGlzIG5vZGUgcmVmZXJzIHRvIGEgc2hhcmVkIHBhcmVudCBjYWNoZSBvciBub3QuXHJcbiAqIEByZXR1cm5zIHtDYWNoZU5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgY2FjaGUgPSAoIG5vZGUsIHBhcmVudCApID0+IG5vZGVPYmplY3QoIG5ldyBDYWNoZU5vZGUoIG5vZGVPYmplY3QoIG5vZGUgKSwgcGFyZW50ICkgKTtcclxuXHJcbmFkZE1ldGhvZENoYWluaW5nKCAnY2FjaGUnLCBjYWNoZSApO1xyXG4iLCJpbXBvcnQgTm9kZSBmcm9tICcuL05vZGUuanMnO1xyXG5pbXBvcnQgeyBhZGRNZXRob2RDaGFpbmluZywgbm9kZVByb3h5IH0gZnJvbSAnLi4vdHNsL1RTTENvcmUuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRoZSBjbGFzcyBnZW5lcmF0ZXMgdGhlIGNvZGUgb2YgYSBnaXZlbiBub2RlIGJ1dCByZXR1cm5zIGFub3RoZXIgbm9kZSBpbiB0aGUgb3V0cHV0LlxyXG4gKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGNhbGwgYSBtZXRob2Qgb3Igbm9kZSB0aGF0IGRvZXMgbm90IHJldHVybiBhIHZhbHVlLCBpLmUuXHJcbiAqIHR5cGUgYHZvaWRgIG9uIGFuIGlucHV0IHdoZXJlIHJldHVybmluZyBhIHZhbHVlIGlzIHJlcXVpcmVkLiBFeGFtcGxlOlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBtYXRlcmlhbC5jb2xvck5vZGUgPSBteUNvbG9yLmJ5cGFzcyggcnVuVm9pZEZuKCkgKVxyXG4gKmBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTm9kZVxyXG4gKi9cclxuY2xhc3MgQnlwYXNzTm9kZSBleHRlbmRzIE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdCeXBhc3NOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGJ5cGFzcyBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlfSBvdXRwdXROb2RlIC0gVGhlIG91dHB1dCBub2RlLlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gY2FsbE5vZGUgLSBUaGUgY2FsbCBub2RlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBvdXRwdXROb2RlLCBjYWxsTm9kZSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0J5cGFzc05vZGUgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG91dHB1dCBub2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm91dHB1dE5vZGUgPSBvdXRwdXROb2RlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNhbGwgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jYWxsTm9kZSA9IGNhbGxOb2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdGdldE5vZGVUeXBlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm91dHB1dE5vZGUuZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHRnZW5lcmF0ZSggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCBzbmlwcGV0ID0gdGhpcy5jYWxsTm9kZS5idWlsZCggYnVpbGRlciwgJ3ZvaWQnICk7XHJcblxyXG5cdFx0aWYgKCBzbmlwcGV0ICE9PSAnJyApIHtcclxuXHJcblx0XHRcdGJ1aWxkZXIuYWRkTGluZUZsb3dDb2RlKCBzbmlwcGV0LCB0aGlzICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzLm91dHB1dE5vZGUuYnVpbGQoIGJ1aWxkZXIgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQnlwYXNzTm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgYnlwYXNzIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZX0gb3V0cHV0Tm9kZSAtIFRoZSBvdXRwdXQgbm9kZS5cclxuICogQHBhcmFtIHtOb2RlfSBjYWxsTm9kZSAtIFRoZSBjYWxsIG5vZGUuXHJcbiAqIEByZXR1cm5zIHtCeXBhc3NOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGJ5cGFzcyA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBCeXBhc3NOb2RlICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAyICk7XHJcblxyXG5hZGRNZXRob2RDaGFpbmluZyggJ2J5cGFzcycsIGJ5cGFzcyApO1xyXG4iLCJpbXBvcnQgTm9kZSBmcm9tICcuLi9jb3JlL05vZGUuanMnO1xyXG5pbXBvcnQgeyBmbG9hdCwgYWRkTWV0aG9kQ2hhaW5pbmcsIG5vZGVQcm94eSB9IGZyb20gJy4uL3RzbC9UU0xDb3JlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIG5vZGUgYWxsb3dzIHRvIHJlbWFwIGEgbm9kZSB2YWx1ZSBmcm9tIG9uZSByYW5nZSBpbnRvIGFub3RoZXIuIEUuZyBhIHZhbHVlIG9mXHJcbiAqIGAwLjRgIGluIHRoZSByYW5nZSBgWyAwLjMsIDAuNSBdYCBzaG91bGQgYmUgcmVtYXBwZWQgaW50byB0aGUgbm9ybWFsaXplZCByYW5nZSBgWyAwLCAxIF1gLlxyXG4gKiBgUmVtYXBOb2RlYCB0YWtlcyBjYXJlIG9mIHRoYXQgYW5kIGNvbnZlcnRzIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiBgMC40YCB0byBgMC41YC5cclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVcclxuICovXHJcbmNsYXNzIFJlbWFwTm9kZSBleHRlbmRzIE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdSZW1hcE5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcmVtYXAgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFRoZSBub2RlIHRoYXQgc2hvdWxkIGJlIHJlbWFwcGVkLlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gaW5Mb3dOb2RlIC0gVGhlIHNvdXJjZSBvciBjdXJyZW50IGxvd2VyIGJvdW5kIG9mIHRoZSByYW5nZS5cclxuXHQgKiBAcGFyYW0ge05vZGV9IGluSGlnaE5vZGUgLSBUaGUgc291cmNlIG9yIGN1cnJlbnQgdXBwZXIgYm91bmQgb2YgdGhlIHJhbmdlLlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gW291dExvd05vZGU9ZmxvYXQoMCldIC0gVGhlIHRhcmdldCBsb3dlciBib3VuZCBvZiB0aGUgcmFuZ2UuXHJcblx0ICogQHBhcmFtIHtOb2RlfSBbb3V0SGlnaE5vZGU9ZmxvYXQoMSldIC0gVGhlIHRhcmdldCB1cHBlciBib3VuZCBvZiB0aGUgcmFuZ2UuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5vZGUsIGluTG93Tm9kZSwgaW5IaWdoTm9kZSwgb3V0TG93Tm9kZSA9IGZsb2F0KCAwICksIG91dEhpZ2hOb2RlID0gZmxvYXQoIDEgKSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG5vZGUgdGhhdCBzaG91bGQgYmUgcmVtYXBwZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9kZSA9IG5vZGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc291cmNlIG9yIGN1cnJlbnQgbG93ZXIgYm91bmQgb2YgdGhlIHJhbmdlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmluTG93Tm9kZSA9IGluTG93Tm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBzb3VyY2Ugb3IgY3VycmVudCB1cHBlciBib3VuZCBvZiB0aGUgcmFuZ2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaW5IaWdoTm9kZSA9IGluSGlnaE5vZGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdGFyZ2V0IGxvd2VyIGJvdW5kIG9mIHRoZSByYW5nZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZX1cclxuXHRcdCAqIEBkZWZhdWx0IGZsb2F0KDApXHJcblx0XHQgKi9cclxuXHRcdHRoaXMub3V0TG93Tm9kZSA9IG91dExvd05vZGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdGFyZ2V0IHVwcGVyIGJvdW5kIG9mIHRoZSByYW5nZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZX1cclxuXHRcdCAqIEBkZWZhdWx0IGZsb2F0KDEpXHJcblx0XHQgKi9cclxuXHRcdHRoaXMub3V0SGlnaE5vZGUgPSBvdXRIaWdoTm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIG5vZGUgdmFsdWUgc2hvdWxkIGJlIGNsYW1wZWQgYmVmb3JlXHJcblx0XHQgKiByZW1hcHBpbmcgaXQgdG8gdGhlIHRhcmdldCByYW5nZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kb0NsYW1wID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHRzZXR1cCgpIHtcclxuXHJcblx0XHRjb25zdCB7IG5vZGUsIGluTG93Tm9kZSwgaW5IaWdoTm9kZSwgb3V0TG93Tm9kZSwgb3V0SGlnaE5vZGUsIGRvQ2xhbXAgfSA9IHRoaXM7XHJcblxyXG5cdFx0bGV0IHQgPSBub2RlLnN1YiggaW5Mb3dOb2RlICkuZGl2KCBpbkhpZ2hOb2RlLnN1YiggaW5Mb3dOb2RlICkgKTtcclxuXHJcblx0XHRpZiAoIGRvQ2xhbXAgPT09IHRydWUgKSB0ID0gdC5jbGFtcCgpO1xyXG5cclxuXHRcdHJldHVybiB0Lm11bCggb3V0SGlnaE5vZGUuc3ViKCBvdXRMb3dOb2RlICkgKS5hZGQoIG91dExvd05vZGUgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUmVtYXBOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSByZW1hcCBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBUaGUgbm9kZSB0aGF0IHNob3VsZCBiZSByZW1hcHBlZC5cclxuICogQHBhcmFtIHtOb2RlfSBpbkxvd05vZGUgLSBUaGUgc291cmNlIG9yIGN1cnJlbnQgbG93ZXIgYm91bmQgb2YgdGhlIHJhbmdlLlxyXG4gKiBAcGFyYW0ge05vZGV9IGluSGlnaE5vZGUgLSBUaGUgc291cmNlIG9yIGN1cnJlbnQgdXBwZXIgYm91bmQgb2YgdGhlIHJhbmdlLlxyXG4gKiBAcGFyYW0gez9Ob2RlfSBbb3V0TG93Tm9kZT1mbG9hdCgwKV0gLSBUaGUgdGFyZ2V0IGxvd2VyIGJvdW5kIG9mIHRoZSByYW5nZS5cclxuICogQHBhcmFtIHs/Tm9kZX0gW291dEhpZ2hOb2RlPWZsb2F0KDEpXSAtIFRoZSB0YXJnZXQgdXBwZXIgYm91bmQgb2YgdGhlIHJhbmdlLlxyXG4gKiBAcmV0dXJucyB7UmVtYXBOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHJlbWFwID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIFJlbWFwTm9kZSwgbnVsbCwgbnVsbCwgeyBkb0NsYW1wOiBmYWxzZSB9ICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAzLCA1ICk7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIHJlbWFwIG5vZGUsIGJ1dCB3aXRoIGVuYWJsZWQgY2xhbXBpbmcuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFRoZSBub2RlIHRoYXQgc2hvdWxkIGJlIHJlbWFwcGVkLlxyXG4gKiBAcGFyYW0ge05vZGV9IGluTG93Tm9kZSAtIFRoZSBzb3VyY2Ugb3IgY3VycmVudCBsb3dlciBib3VuZCBvZiB0aGUgcmFuZ2UuXHJcbiAqIEBwYXJhbSB7Tm9kZX0gaW5IaWdoTm9kZSAtIFRoZSBzb3VyY2Ugb3IgY3VycmVudCB1cHBlciBib3VuZCBvZiB0aGUgcmFuZ2UuXHJcbiAqIEBwYXJhbSB7P05vZGV9IFtvdXRMb3dOb2RlPWZsb2F0KDApXSAtIFRoZSB0YXJnZXQgbG93ZXIgYm91bmQgb2YgdGhlIHJhbmdlLlxyXG4gKiBAcGFyYW0gez9Ob2RlfSBbb3V0SGlnaE5vZGU9ZmxvYXQoMSldIC0gVGhlIHRhcmdldCB1cHBlciBib3VuZCBvZiB0aGUgcmFuZ2UuXHJcbiAqIEByZXR1cm5zIHtSZW1hcE5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcmVtYXBDbGFtcCA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBSZW1hcE5vZGUgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDMsIDUgKTtcclxuXHJcbmFkZE1ldGhvZENoYWluaW5nKCAncmVtYXAnLCByZW1hcCApO1xyXG5hZGRNZXRob2RDaGFpbmluZyggJ3JlbWFwQ2xhbXAnLCByZW1hcENsYW1wICk7XHJcbiIsImltcG9ydCBOb2RlIGZyb20gJy4uL2NvcmUvTm9kZS5qcyc7XHJcbmltcG9ydCB7IG5vZGVQcm94eSB9IGZyb20gJy4uL3RzbC9UU0xDb3JlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBiYXNpYyBleHByZXNzaW9ucyBpbiBzaGFkZXIgY29kZS5cclxuICogQmFzaWMgZXhhbXBsZXMgZm9yIHRoYXQgYXJlIGByZXR1cm5gLCBgY29udGludWVgIG9yIGBkaXNjYXJkYCBzdGF0ZW1lbnRzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTm9kZVxyXG4gKi9cclxuY2xhc3MgRXhwcmVzc2lvbk5vZGUgZXh0ZW5kcyBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnRXhwcmVzc2lvbk5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgZXhwcmVzc2lvbiBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtzbmlwcGV0PScnXSAtIFRoZSBuYXRpdmUgY29kZSBzbmlwcGV0LlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbbm9kZVR5cGU9J3ZvaWQnXSAtIFRoZSBub2RlIHR5cGUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHNuaXBwZXQgPSAnJywgbm9kZVR5cGUgPSAndm9pZCcgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5vZGVUeXBlICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbmF0aXZlIGNvZGUgc25pcHBldC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICogQGRlZmF1bHQgJydcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zbmlwcGV0ID0gc25pcHBldDtcclxuXHJcblx0fVxyXG5cclxuXHRnZW5lcmF0ZSggYnVpbGRlciwgb3V0cHV0ICkge1xyXG5cclxuXHRcdGNvbnN0IHR5cGUgPSB0aGlzLmdldE5vZGVUeXBlKCBidWlsZGVyICk7XHJcblx0XHRjb25zdCBzbmlwcGV0ID0gdGhpcy5zbmlwcGV0O1xyXG5cclxuXHRcdGlmICggdHlwZSA9PT0gJ3ZvaWQnICkge1xyXG5cclxuXHRcdFx0YnVpbGRlci5hZGRMaW5lRmxvd0NvZGUoIHNuaXBwZXQsIHRoaXMgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0cmV0dXJuIGJ1aWxkZXIuZm9ybWF0KCBzbmlwcGV0LCB0eXBlLCBvdXRwdXQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEV4cHJlc3Npb25Ob2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYW4gZXhwcmVzc2lvbiBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW3NuaXBwZXRdIC0gVGhlIG5hdGl2ZSBjb2RlIHNuaXBwZXQuXHJcbiAqIEBwYXJhbSB7P3N0cmluZ30gW25vZGVUeXBlPSd2b2lkJ10gLSBUaGUgbm9kZSB0eXBlLlxyXG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbk5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZXhwcmVzc2lvbiA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBFeHByZXNzaW9uTm9kZSApLnNldFBhcmFtZXRlckxlbmd0aCggMSwgMiApO1xyXG4iLCJpbXBvcnQgeyBzZWxlY3QgfSBmcm9tICcuLi9tYXRoL0NvbmRpdGlvbmFsTm9kZS5qcyc7XHJcbmltcG9ydCB7IGV4cHJlc3Npb24gfSBmcm9tICcuLi9jb2RlL0V4cHJlc3Npb25Ob2RlLmpzJztcclxuaW1wb3J0IHsgYWRkTWV0aG9kQ2hhaW5pbmcgfSBmcm9tICcuLi90c2wvVFNMQ29yZS5qcyc7XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyBhIGBkaXNjYXJkYCBzaGFkZXIgb3BlcmF0aW9uIGluIFRTTC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHs/Q29uZGl0aW9uYWxOb2RlfSBjb25kaXRpb25hbCAtIEFuIG9wdGlvbmFsIGNvbmRpdGlvbmFsIG5vZGUuIEl0IGFsbG93cyB0byBkZWNpZGUgd2hldGhlciB0aGUgZGlzY2FyZCBzaG91bGQgYmUgZXhlY3V0ZWQgb3Igbm90LlxyXG4gKiBAcmV0dXJuIHtOb2RlfSBUaGUgYGRpc2NhcmRgIGV4cHJlc3Npb24uXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgRGlzY2FyZCA9ICggY29uZGl0aW9uYWwgKSA9PiAoIGNvbmRpdGlvbmFsID8gc2VsZWN0KCBjb25kaXRpb25hbCwgZXhwcmVzc2lvbiggJ2Rpc2NhcmQnICkgKSA6IGV4cHJlc3Npb24oICdkaXNjYXJkJyApICkuYXBwZW5kKCk7XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyBhIGByZXR1cm5gIHNoYWRlciBvcGVyYXRpb24gaW4gVFNMLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcmV0dXJuIHtFeHByZXNzaW9uTm9kZX0gVGhlIGByZXR1cm5gIGV4cHJlc3Npb24uXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUmV0dXJuID0gKCkgPT4gZXhwcmVzc2lvbiggJ3JldHVybicgKS5hcHBlbmQoKTtcclxuXHJcbmFkZE1ldGhvZENoYWluaW5nKCAnZGlzY2FyZCcsIERpc2NhcmQgKTtcclxuIiwiaW1wb3J0IFRlbXBOb2RlIGZyb20gJy4uL2NvcmUvVGVtcE5vZGUuanMnO1xyXG5pbXBvcnQgeyBhZGRNZXRob2RDaGFpbmluZywgbm9kZU9iamVjdCB9IGZyb20gJy4uL3RzbC9UU0xDb3JlLmpzJztcclxuXHJcbmltcG9ydCB7IE5vQ29sb3JTcGFjZSwgTm9Ub25lTWFwcGluZyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IENvbG9yTWFuYWdlbWVudCB9IGZyb20gJy4uLy4uL21hdGgvQ29sb3JNYW5hZ2VtZW50LmpzJztcclxuXHJcbi8qKlxyXG4gKiBOb3JtYWxseSwgdG9uZSBtYXBwaW5nIGFuZCBjb2xvciBjb252ZXJzaW9uIGhhcHBlbnMgYXV0b21hdGljYWxseVxyXG4gKiBiZWZvcmUgb3V0cHV0dGluZyBwaXhlbCB0b28gdGhlIGRlZmF1bHQgKHNjcmVlbikgZnJhbWVidWZmZXIuIEluIGNlcnRhaW5cclxuICogcG9zdCBwcm9jZXNzaW5nIHNldHVwcyB0aGlzIGhhcHBlbnMgdG8gbGF0ZSBiZWNhdXNlIGNlcnRhaW4gZWZmZWN0c1xyXG4gKiByZXF1aXJlIGUuZy4gc1JHQiBpbnB1dC4gRm9yIHN1Y2ggc2NlbmFyaW9zLCBgUmVuZGVyT3V0cHV0Tm9kZWAgY2FuIGJlIHVzZWRcclxuICogdG8gYXBwbHkgdG9uZSBtYXBwaW5nIGFuZCBjb2xvciBzcGFjZSBjb252ZXJzaW9uIGF0IGFuIGFyYml0cmFyeSBwb2ludFxyXG4gKiBpbiB0aGUgZWZmZWN0IGNoYWluLlxyXG4gKlxyXG4gKiBXaGVuIGFwcGx5aW5nIHRvbmUgbWFwcGluZyBhbmQgY29sb3Igc3BhY2UgY29udmVyc2lvbiBtYW51YWxseSB3aXRoIHRoaXMgbm9kZSxcclxuICogeW91IGhhdmUgdG8gc2V0IHtAbGluayBQb3N0UHJvY2Vzc2luZyNvdXRwdXRDb2xvclRyYW5zZm9ybX0gdG8gYGZhbHNlYC5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgcG9zdFByb2Nlc3NpbmcgPSBuZXcgUG9zdFByb2Nlc3NpbmcoIHJlbmRlcmVyICk7XHJcbiAqIHBvc3RQcm9jZXNzaW5nLm91dHB1dENvbG9yVHJhbnNmb3JtID0gZmFsc2U7XHJcbiAqXHJcbiAqIGNvbnN0IHNjZW5lUGFzcyA9IHBhc3MoIHNjZW5lLCBjYW1lcmEgKTtcclxuICogY29uc3Qgb3V0cHV0UGFzcyA9IHJlbmRlck91dHB1dCggc2NlbmVQYXNzICk7XHJcbiAqXHJcbiAqIHBvc3RQcm9jZXNzaW5nLm91dHB1dE5vZGUgPSBvdXRwdXRQYXNzO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIFRlbXBOb2RlXHJcbiAqL1xyXG5jbGFzcyBSZW5kZXJPdXRwdXROb2RlIGV4dGVuZHMgVGVtcE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdSZW5kZXJPdXRwdXROb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHJlbmRlciBvdXRwdXQgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gY29sb3JOb2RlIC0gVGhlIGNvbG9yIG5vZGUgdG8gcHJvY2Vzcy5cclxuXHQgKiBAcGFyYW0gez9udW1iZXJ9IHRvbmVNYXBwaW5nIC0gVGhlIHRvbmUgbWFwcGluZyB0eXBlLlxyXG5cdCAqIEBwYXJhbSB7P3N0cmluZ30gb3V0cHV0Q29sb3JTcGFjZSAtIFRoZSBvdXRwdXQgY29sb3Igc3BhY2UuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGNvbG9yTm9kZSwgdG9uZU1hcHBpbmcsIG91dHB1dENvbG9yU3BhY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIoICd2ZWM0JyApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNvbG9yIG5vZGUgdG8gcHJvY2Vzcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb2xvck5vZGUgPSBjb2xvck5vZGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdG9uZSBtYXBwaW5nIHR5cGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9udW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudG9uZU1hcHBpbmcgPSB0b25lTWFwcGluZztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBvdXRwdXQgY29sb3Igc3BhY2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9zdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMub3V0cHV0Q29sb3JTcGFjZSA9IG91dHB1dENvbG9yU3BhY2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzUmVuZGVyT3V0cHV0Tm9kZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXAoIHsgY29udGV4dCB9ICkge1xyXG5cclxuXHRcdGxldCBvdXRwdXROb2RlID0gdGhpcy5jb2xvck5vZGUgfHwgY29udGV4dC5jb2xvcjtcclxuXHJcblx0XHQvLyB0b25lIG1hcHBpbmdcclxuXHJcblx0XHRjb25zdCB0b25lTWFwcGluZyA9ICggdGhpcy50b25lTWFwcGluZyAhPT0gbnVsbCA/IHRoaXMudG9uZU1hcHBpbmcgOiBjb250ZXh0LnRvbmVNYXBwaW5nICkgfHwgTm9Ub25lTWFwcGluZztcclxuXHRcdGNvbnN0IG91dHB1dENvbG9yU3BhY2UgPSAoIHRoaXMub3V0cHV0Q29sb3JTcGFjZSAhPT0gbnVsbCA/IHRoaXMub3V0cHV0Q29sb3JTcGFjZSA6IGNvbnRleHQub3V0cHV0Q29sb3JTcGFjZSApIHx8IE5vQ29sb3JTcGFjZTtcclxuXHJcblx0XHRpZiAoIHRvbmVNYXBwaW5nICE9PSBOb1RvbmVNYXBwaW5nICkge1xyXG5cclxuXHRcdFx0b3V0cHV0Tm9kZSA9IG91dHB1dE5vZGUudG9uZU1hcHBpbmcoIHRvbmVNYXBwaW5nICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIHdvcmtpbmcgdG8gb3V0cHV0IGNvbG9yIHNwYWNlXHJcblxyXG5cdFx0aWYgKCBvdXRwdXRDb2xvclNwYWNlICE9PSBOb0NvbG9yU3BhY2UgJiYgb3V0cHV0Q29sb3JTcGFjZSAhPT0gQ29sb3JNYW5hZ2VtZW50LndvcmtpbmdDb2xvclNwYWNlICkge1xyXG5cclxuXHRcdFx0b3V0cHV0Tm9kZSA9IG91dHB1dE5vZGUud29ya2luZ1RvQ29sb3JTcGFjZSggb3V0cHV0Q29sb3JTcGFjZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gb3V0cHV0Tm9kZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUmVuZGVyT3V0cHV0Tm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgcG9zdGVyaXplIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZX0gY29sb3IgLSBUaGUgY29sb3Igbm9kZSB0byBwcm9jZXNzLlxyXG4gKiBAcGFyYW0gez9udW1iZXJ9IFt0b25lTWFwcGluZz1udWxsXSAtIFRoZSB0b25lIG1hcHBpbmcgdHlwZS5cclxuICogQHBhcmFtIHs/c3RyaW5nfSBbb3V0cHV0Q29sb3JTcGFjZT1udWxsXSAtIFRoZSBvdXRwdXQgY29sb3Igc3BhY2UuXHJcbiAqIEByZXR1cm5zIHtSZW5kZXJPdXRwdXROb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHJlbmRlck91dHB1dCA9ICggY29sb3IsIHRvbmVNYXBwaW5nID0gbnVsbCwgb3V0cHV0Q29sb3JTcGFjZSA9IG51bGwgKSA9PiBub2RlT2JqZWN0KCBuZXcgUmVuZGVyT3V0cHV0Tm9kZSggbm9kZU9iamVjdCggY29sb3IgKSwgdG9uZU1hcHBpbmcsIG91dHB1dENvbG9yU3BhY2UgKSApO1xyXG5cclxuYWRkTWV0aG9kQ2hhaW5pbmcoICdyZW5kZXJPdXRwdXQnLCByZW5kZXJPdXRwdXQgKTtcclxuIiwiaW1wb3J0IFRlbXBOb2RlIGZyb20gJy4uL2NvcmUvVGVtcE5vZGUuanMnO1xyXG5pbXBvcnQgeyBhZGRNZXRob2RDaGFpbmluZywgbm9kZU9iamVjdCB9IGZyb20gJy4uL3RzbC9UU0xDb3JlLmpzJztcclxuXHJcbmNsYXNzIERlYnVnTm9kZSBleHRlbmRzIFRlbXBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnRGVidWdOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHRjb25zdHJ1Y3Rvciggbm9kZSwgY2FsbGJhY2sgPSBudWxsICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0dGhpcy5ub2RlID0gbm9kZTtcclxuXHRcdHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcclxuXHJcblx0fVxyXG5cclxuXHRnZXROb2RlVHlwZSggYnVpbGRlciApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5ub2RlLmdldE5vZGVUeXBlKCBidWlsZGVyICk7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXAoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubm9kZS5idWlsZCggYnVpbGRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdGFuYWx5emUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubm9kZS5idWlsZCggYnVpbGRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdGdlbmVyYXRlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IGNhbGxiYWNrID0gdGhpcy5jYWxsYmFjaztcclxuXHRcdGNvbnN0IHNuaXBwZXQgPSB0aGlzLm5vZGUuYnVpbGQoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRsZXQgY29kZSA9ICcnO1xyXG5cdFx0Y29kZSArPSAnLy8gIy0tLSBUU0wgRGVidWcgLS0tI1xcbic7XHJcblx0XHRjb2RlICs9IGJ1aWxkZXIuZmxvdy5jb2RlLnJlcGxhY2UoIC9eXFx0L21nLCAnJyApICsgJ1xcbic7XHJcblx0XHRjb2RlICs9ICcvKiAuLi4gKi8gJyArIHNuaXBwZXQgKyAnIC8qIC4uLiAqL1xcbic7XHJcblx0XHRjb2RlICs9ICcvLyAjLS0tLS0tLS0tLS0tLS0tLS0jXFxuJztcclxuXHJcblx0XHRpZiAoIGNhbGxiYWNrICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0Y2FsbGJhY2soIGNvZGUgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc29sZS5sb2coIGNvZGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHNuaXBwZXQ7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IERlYnVnTm9kZTtcclxuXHJcbmV4cG9ydCBjb25zdCBkZWJ1ZyA9ICggbm9kZSwgY2FsbGJhY2sgPSBudWxsICkgPT4gbm9kZU9iamVjdCggbmV3IERlYnVnTm9kZSggbm9kZU9iamVjdCggbm9kZSApLCBjYWxsYmFjayApICk7XHJcblxyXG5hZGRNZXRob2RDaGFpbmluZyggJ2RlYnVnJywgZGVidWcgKTtcclxuIiwiLy8gTm9uLVBVUkUgZXhwb3J0cyBsaXN0LCBzaWRlLWVmZmVjdHMgYXJlIHJlcXVpcmVkIGhlcmUuXHJcbi8vIFRTTCBCYXNlIFN5bnRheFxyXG5cclxuZXhwb3J0ICogZnJvbSAnLi9UU0xDb3JlLmpzJzsgLy8gZmxvYXQoKSwgdmVjMigpLCB2ZWMzKCksIHZlYzQoKSwgbWF0MygpLCBtYXQ0KCksIEZuKCksIElmKCksIGVsZW1lbnQoKSwgbm9kZU9iamVjdCgpLCBub2RlUHJveHkoKSwgLi4uXHJcbmV4cG9ydCAqIGZyb20gJy4uL2NvcmUvQXJyYXlOb2RlLmpzJzsgLy8gYXJyYXkoKSwgLnRvQXJyYXkoKVxyXG5leHBvcnQgKiBmcm9tICcuLi9jb3JlL1VuaWZvcm1Ob2RlLmpzJzsgLy8gdW5pZm9ybSgpXHJcbmV4cG9ydCAqIGZyb20gJy4uL2NvcmUvUHJvcGVydHlOb2RlLmpzJzsgLy8gcHJvcGVydHkoKSAgPC0+IFRPRE86IFNlcGFyYXRlIE1hdGVyaWFsIFByb3BlcnRpZXMgaW4gb3RoZXIgZmlsZVxyXG5leHBvcnQgKiBmcm9tICcuLi9jb3JlL0Fzc2lnbk5vZGUuanMnOyAvLyAuYXNzaWduKClcclxuZXhwb3J0ICogZnJvbSAnLi4vY29kZS9GdW5jdGlvbkNhbGxOb2RlLmpzJzsgLy8gLmNhbGwoKVxyXG5leHBvcnQgKiBmcm9tICcuLi9tYXRoL09wZXJhdG9yTm9kZS5qcyc7IC8vIC5hZGQoKSwgLnN1YigpLCAuLi5cclxuZXhwb3J0ICogZnJvbSAnLi4vbWF0aC9NYXRoTm9kZS5qcyc7IC8vIGFicygpLCBmbG9vcigpLCAuLi5cclxuZXhwb3J0ICogZnJvbSAnLi4vbWF0aC9Db25kaXRpb25hbE5vZGUuanMnOyAvLyBzZWxlY3QoKSwgLi4uXHJcbmV4cG9ydCAqIGZyb20gJy4uL2NvcmUvQ29udGV4dE5vZGUuanMnOyAvLyAuY29udGV4dCgpXHJcbmV4cG9ydCAqIGZyb20gJy4uL2NvcmUvVmFyTm9kZS5qcyc7IC8vIC52YXIoKSAtPiBUT0RPOiBNYXliZSByZW5hbWUgLnRvVmFyKCkgLT4gLnZhcigpXHJcbmV4cG9ydCAqIGZyb20gJy4uL2NvcmUvVmFyeWluZ05vZGUuanMnOyAvLyB2YXJ5aW5nKCksIHZlcnRleFN0YWdlKClcclxuZXhwb3J0ICogZnJvbSAnLi4vZGlzcGxheS9Db2xvclNwYWNlTm9kZS5qcyc7IC8vIC50b0NvbG9yU3BhY2UoKVxyXG5leHBvcnQgKiBmcm9tICcuLi9kaXNwbGF5L1RvbmVNYXBwaW5nTm9kZS5qcyc7IC8vIC50b1RvbmVNYXBwaW5nKClcclxuZXhwb3J0ICogZnJvbSAnLi4vYWNjZXNzb3JzL0J1ZmZlckF0dHJpYnV0ZU5vZGUuanMnOyAvLyAudG9BdHRyaWJ1dGUoKVxyXG5leHBvcnQgKiBmcm9tICcuLi9ncGdwdS9Db21wdXRlTm9kZS5qcyc7IC8vIC5jb21wdXRlKClcclxuZXhwb3J0ICogZnJvbSAnLi4vY29yZS9DYWNoZU5vZGUuanMnOyAvLyAuY2FjaGUoKVxyXG5leHBvcnQgKiBmcm9tICcuLi9jb3JlL0J5cGFzc05vZGUuanMnOyAvLyAuYnlwYXNzKClcclxuZXhwb3J0ICogZnJvbSAnLi4vdXRpbHMvUmVtYXBOb2RlLmpzJzsgLy8gLnJlbWFwKCksIC5yZW1hcENsYW1wKClcclxuZXhwb3J0ICogZnJvbSAnLi4vY29kZS9FeHByZXNzaW9uTm9kZS5qcyc7IC8vIGV4cHJlc3Npb24oKVxyXG5leHBvcnQgKiBmcm9tICcuLi91dGlscy9EaXNjYXJkLmpzJzsgLy8gRGlzY2FyZCgpLCBSZXR1cm4oKVxyXG5leHBvcnQgKiBmcm9tICcuLi9kaXNwbGF5L1JlbmRlck91dHB1dE5vZGUuanMnOyAvLyAucmVuZGVyT3V0cHV0KClcclxuZXhwb3J0ICogZnJvbSAnLi4vdXRpbHMvRGVidWdOb2RlLmpzJzsgLy8gZGVidWcoKVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZE5vZGVFbGVtZW50KCBuYW1lLyosIG5vZGVFbGVtZW50Ki8gKSB7XHJcblxyXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlRTTDogQWRkTm9kZUVsZW1lbnQgaGFzIGJlZW4gcmVtb3ZlZCBpbiBmYXZvciBvZiB0cmVlLXNoYWtpbmcuIFRyeWluZyBhZGQnLCBuYW1lICk7XHJcblxyXG59XHJcbiIsImltcG9ydCBOb2RlIGZyb20gJy4vTm9kZS5qcyc7XHJcbmltcG9ydCB7IG5vZGVPYmplY3QsIHZhcnlpbmcgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcblxyXG4vKipcclxuICogQmFzZSBjbGFzcyBmb3IgcmVwcmVzZW50aW5nIHNoYWRlciBhdHRyaWJ1dGVzIGFzIG5vZGVzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTm9kZVxyXG4gKi9cclxuY2xhc3MgQXR0cmlidXRlTm9kZSBleHRlbmRzIE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdBdHRyaWJ1dGVOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGF0dHJpYnV0ZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLlxyXG5cdCAqIEBwYXJhbSB7P3N0cmluZ30gbm9kZVR5cGUgLSBUaGUgbm9kZSB0eXBlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBhdHRyaWJ1dGVOYW1lLCBub2RlVHlwZSA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5vZGVUeXBlICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBgQXR0cmlidXRlTm9kZWAgc2V0cyB0aGlzIHByb3BlcnR5IHRvIGB0cnVlYCBieSBkZWZhdWx0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdsb2JhbCA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy5fYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZU5hbWU7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0SGFzaCggYnVpbGRlciApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVOYW1lKCBidWlsZGVyICk7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0bGV0IG5vZGVUeXBlID0gdGhpcy5ub2RlVHlwZTtcclxuXHJcblx0XHRpZiAoIG5vZGVUeXBlID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYXR0cmlidXRlTmFtZSA9IHRoaXMuZ2V0QXR0cmlidXRlTmFtZSggYnVpbGRlciApO1xyXG5cclxuXHRcdFx0aWYgKCBidWlsZGVyLmhhc0dlb21ldHJ5QXR0cmlidXRlKCBhdHRyaWJ1dGVOYW1lICkgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGF0dHJpYnV0ZSA9IGJ1aWxkZXIuZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCBhdHRyaWJ1dGVOYW1lICk7XHJcblxyXG5cdFx0XHRcdG5vZGVUeXBlID0gYnVpbGRlci5nZXRUeXBlRnJvbUF0dHJpYnV0ZSggYXR0cmlidXRlICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRub2RlVHlwZSA9ICdmbG9hdCc7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBub2RlVHlwZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBhdHRyaWJ1dGUgbmFtZSB0byB0aGUgZ2l2ZW4gdmFsdWUuIFRoZSBtZXRob2QgY2FuIGJlXHJcblx0ICogb3ZlcndyaXR0ZW4gaW4gZGVyaXZlZCBjbGFzc2VzIGlmIHRoZSBmaW5hbCBuYW1lIG11c3QgYmUgY29tcHV0ZWRcclxuXHQgKiBhbmFseXRpY2FsbHkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuXHJcblx0ICogQHJldHVybiB7QXR0cmlidXRlTm9kZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBub2RlLlxyXG5cdCAqL1xyXG5cdHNldEF0dHJpYnV0ZU5hbWUoIGF0dHJpYnV0ZU5hbWUgKSB7XHJcblxyXG5cdFx0dGhpcy5fYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZU5hbWU7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgYXR0cmlidXRlIG5hbWUgb2YgdGhpcyBub2RlLiBUaGUgbWV0aG9kIGNhbiBiZVxyXG5cdCAqIG92ZXJ3cml0dGVuIGluIGRlcml2ZWQgY2xhc3NlcyBpZiB0aGUgZmluYWwgbmFtZSBtdXN0IGJlIGNvbXB1dGVkXHJcblx0ICogYW5hbHl0aWNhbGx5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBhdHRyaWJ1dGUgbmFtZS5cclxuXHQgKi9cclxuXHRnZXRBdHRyaWJ1dGVOYW1lKCAvKmJ1aWxkZXIqLyApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fYXR0cmlidXRlTmFtZTtcclxuXHJcblx0fVxyXG5cclxuXHRnZW5lcmF0ZSggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCBhdHRyaWJ1dGVOYW1lID0gdGhpcy5nZXRBdHRyaWJ1dGVOYW1lKCBidWlsZGVyICk7XHJcblx0XHRjb25zdCBub2RlVHlwZSA9IHRoaXMuZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKTtcclxuXHRcdGNvbnN0IGdlb21ldHJ5QXR0cmlidXRlID0gYnVpbGRlci5oYXNHZW9tZXRyeUF0dHJpYnV0ZSggYXR0cmlidXRlTmFtZSApO1xyXG5cclxuXHRcdGlmICggZ2VvbWV0cnlBdHRyaWJ1dGUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBhdHRyaWJ1dGUgPSBidWlsZGVyLmdlb21ldHJ5LmdldEF0dHJpYnV0ZSggYXR0cmlidXRlTmFtZSApO1xyXG5cdFx0XHRjb25zdCBhdHRyaWJ1dGVUeXBlID0gYnVpbGRlci5nZXRUeXBlRnJvbUF0dHJpYnV0ZSggYXR0cmlidXRlICk7XHJcblxyXG5cdFx0XHRjb25zdCBub2RlQXR0cmlidXRlID0gYnVpbGRlci5nZXRBdHRyaWJ1dGUoIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVR5cGUgKTtcclxuXHJcblx0XHRcdGlmICggYnVpbGRlci5zaGFkZXJTdGFnZSA9PT0gJ3ZlcnRleCcgKSB7XHJcblxyXG5cdFx0XHRcdHJldHVybiBidWlsZGVyLmZvcm1hdCggbm9kZUF0dHJpYnV0ZS5uYW1lLCBhdHRyaWJ1dGVUeXBlLCBub2RlVHlwZSApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0Y29uc3Qgbm9kZVZhcnlpbmcgPSB2YXJ5aW5nKCB0aGlzICk7XHJcblxyXG5cdFx0XHRcdHJldHVybiBub2RlVmFyeWluZy5idWlsZCggYnVpbGRlciwgbm9kZVR5cGUgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc29sZS53YXJuKCBgQXR0cmlidXRlTm9kZTogVmVydGV4IGF0dHJpYnV0ZSBcIiR7IGF0dHJpYnV0ZU5hbWUgfVwiIG5vdCBmb3VuZCBvbiBnZW9tZXRyeS5gICk7XHJcblxyXG5cdFx0XHRyZXR1cm4gYnVpbGRlci5nZW5lcmF0ZUNvbnN0KCBub2RlVHlwZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRzZXJpYWxpemUoIGRhdGEgKSB7XHJcblxyXG5cdFx0c3VwZXIuc2VyaWFsaXplKCBkYXRhICk7XHJcblxyXG5cdFx0ZGF0YS5nbG9iYWwgPSB0aGlzLmdsb2JhbDtcclxuXHRcdGRhdGEuX2F0dHJpYnV0ZU5hbWUgPSB0aGlzLl9hdHRyaWJ1dGVOYW1lO1xyXG5cclxuXHR9XHJcblxyXG5cdGRlc2VyaWFsaXplKCBkYXRhICkge1xyXG5cclxuXHRcdHN1cGVyLmRlc2VyaWFsaXplKCBkYXRhICk7XHJcblxyXG5cdFx0dGhpcy5nbG9iYWwgPSBkYXRhLmdsb2JhbDtcclxuXHRcdHRoaXMuX2F0dHJpYnV0ZU5hbWUgPSBkYXRhLl9hdHRyaWJ1dGVOYW1lO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBBdHRyaWJ1dGVOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYW4gYXR0cmlidXRlIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS5cclxuICogQHBhcmFtIHtzdHJpbmd9IFtub2RlVHlwZV0gLSBUaGUgbm9kZSB0eXBlLlxyXG4gKiBAcmV0dXJucyB7QXR0cmlidXRlTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBhdHRyaWJ1dGUgPSAoIG5hbWUsIG5vZGVUeXBlICkgPT4gbm9kZU9iamVjdCggbmV3IEF0dHJpYnV0ZU5vZGUoIG5hbWUsIG5vZGVUeXBlICkgKTtcclxuIiwiaW1wb3J0IHsgYXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9BdHRyaWJ1dGVOb2RlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGFuIHV2IGF0dHJpYnV0ZSBub2RlIHdpdGggdGhlIGdpdmVuIGluZGV4LlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge251bWJlcn0gW2luZGV4PTBdIC0gVGhlIHV2IGluZGV4LlxyXG4gKiBAcmV0dXJuIHtBdHRyaWJ1dGVOb2RlPHZlYzI+fSBUaGUgdXYgYXR0cmlidXRlIG5vZGUuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdXYgPSAoIGluZGV4ID0gMCApID0+IGF0dHJpYnV0ZSggJ3V2JyArICggaW5kZXggPiAwID8gaW5kZXggOiAnJyApLCAndmVjMicgKTtcclxuIiwiaW1wb3J0IE5vZGUgZnJvbSAnLi4vY29yZS9Ob2RlLmpzJztcclxuaW1wb3J0IHsgbm9kZVByb3h5IH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgbm9kZSB0aGF0IHJlcHJlc2VudHMgdGhlIGRpbWVuc2lvbnMgb2YgYSB0ZXh0dXJlLiBUaGUgdGV4dHVyZSBzaXplIGlzXHJcbiAqIHJldHJpZXZlZCBpbiB0aGUgc2hhZGVyIHZpYSBidWlsdC1pbiBzaGFkZXIgZnVuY3Rpb25zIGxpa2UgYHRleHR1cmVEaW1lbnNpb25zKClgXHJcbiAqIG9yIGB0ZXh0dXJlU2l6ZSgpYC5cclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVcclxuICovXHJcbmNsYXNzIFRleHR1cmVTaXplTm9kZSBleHRlbmRzIE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdUZXh0dXJlU2l6ZU5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgdGV4dHVyZSBzaXplIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmVOb2RlfSB0ZXh0dXJlTm9kZSAtIEEgdGV4dHVyZSBub2RlIHdoaWNoIHNpemUgc2hvdWxkIGJlIHJldHJpZXZlZC5cclxuXHQgKiBAcGFyYW0gez9Ob2RlPGludD59IFtsZXZlbE5vZGU9bnVsbF0gLSBBIGxldmVsIG5vZGUgd2hpY2ggZGVmaW5lcyB0aGUgcmVxdWVzdGVkIG1pcC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggdGV4dHVyZU5vZGUsIGxldmVsTm9kZSA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoICd1dmVjMicgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNUZXh0dXJlU2l6ZU5vZGUgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSB0ZXh0dXJlIG5vZGUgd2hpY2ggc2l6ZSBzaG91bGQgYmUgcmV0cmlldmVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtUZXh0dXJlTm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50ZXh0dXJlTm9kZSA9IHRleHR1cmVOb2RlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBsZXZlbCBub2RlIHdoaWNoIGRlZmluZXMgdGhlIHJlcXVlc3RlZCBtaXAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGU8aW50Pn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5sZXZlbE5vZGUgPSBsZXZlbE5vZGU7XHJcblxyXG5cdH1cclxuXHJcblx0Z2VuZXJhdGUoIGJ1aWxkZXIsIG91dHB1dCApIHtcclxuXHJcblx0XHRjb25zdCB0ZXh0dXJlUHJvcGVydHkgPSB0aGlzLnRleHR1cmVOb2RlLmJ1aWxkKCBidWlsZGVyLCAncHJvcGVydHknICk7XHJcblx0XHRjb25zdCBsZXZlbCA9IHRoaXMubGV2ZWxOb2RlID09PSBudWxsID8gJzAnIDogdGhpcy5sZXZlbE5vZGUuYnVpbGQoIGJ1aWxkZXIsICdpbnQnICk7XHJcblxyXG5cdFx0cmV0dXJuIGJ1aWxkZXIuZm9ybWF0KCBgJHsgYnVpbGRlci5nZXRNZXRob2QoICd0ZXh0dXJlRGltZW5zaW9ucycgKSB9KCAkeyB0ZXh0dXJlUHJvcGVydHkgfSwgJHsgbGV2ZWwgfSApYCwgdGhpcy5nZXROb2RlVHlwZSggYnVpbGRlciApLCBvdXRwdXQgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgVGV4dHVyZVNpemVOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSB0ZXh0dXJlIHNpemUgbm9kZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtUZXh0dXJlTm9kZX0gdGV4dHVyZU5vZGUgLSBBIHRleHR1cmUgbm9kZSB3aGljaCBzaXplIHNob3VsZCBiZSByZXRyaWV2ZWQuXHJcbiAqIEBwYXJhbSB7P05vZGU8aW50Pn0gW2xldmVsTm9kZT1udWxsXSAtIEEgbGV2ZWwgbm9kZSB3aGljaCBkZWZpbmVzIHRoZSByZXF1ZXN0ZWQgbWlwLlxyXG4gKiBAcmV0dXJucyB7VGV4dHVyZVNpemVOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHRleHR1cmVTaXplID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIFRleHR1cmVTaXplTm9kZSApLnNldFBhcmFtZXRlckxlbmd0aCggMSwgMiApO1xyXG4iLCJpbXBvcnQgVW5pZm9ybU5vZGUgZnJvbSAnLi4vY29yZS9Vbmlmb3JtTm9kZS5qcyc7XHJcbmltcG9ydCB7IE5vZGVVcGRhdGVUeXBlIH0gZnJvbSAnLi4vY29yZS9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBub2RlUHJveHkgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcblxyXG4vKipcclxuICogQSBzcGVjaWFsIHR5cGUgb2YgdW5pZm9ybSBub2RlIHRoYXQgY29tcHV0ZXMgdGhlXHJcbiAqIG1heGltdW0gbWlwbWFwIGxldmVsIGZvciBhIGdpdmVuIHRleHR1cmUgbm9kZS5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgbGV2ZWwgPSBtYXhNaXBMZXZlbCggdGV4dHVyZU5vZGUgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBVbmlmb3JtTm9kZVxyXG4gKi9cclxuY2xhc3MgTWF4TWlwTGV2ZWxOb2RlIGV4dGVuZHMgVW5pZm9ybU5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdNYXhNaXBMZXZlbE5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbWF4IG1pcCBsZXZlbCBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlTm9kZX0gdGV4dHVyZU5vZGUgLSBUaGUgdGV4dHVyZSBub2RlIHRvIGNvbXB1dGUgdGhlIG1heCBtaXAgbGV2ZWwgZm9yLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCB0ZXh0dXJlTm9kZSApIHtcclxuXHJcblx0XHRzdXBlciggMCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHRleHR1cmUgbm9kZSB0byBjb21wdXRlIHRoZSBtYXggbWlwIGxldmVsIGZvci5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge1RleHR1cmVOb2RlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl90ZXh0dXJlTm9kZSA9IHRleHR1cmVOb2RlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGB1cGRhdGVUeXBlYCBpcyBzZXQgdG8gYE5vZGVVcGRhdGVUeXBlLkZSQU1FYCBzaW5jZSB0aGUgbm9kZSB1cGRhdGVzXHJcblx0XHQgKiB0aGUgdGV4dHVyZSBvbmNlIHBlciBmcmFtZSBpbiBpdHMge0BsaW5rIE1heE1pcExldmVsTm9kZSN1cGRhdGV9IG1ldGhvZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICogQGRlZmF1bHQgJ2ZyYW1lJ1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVwZGF0ZVR5cGUgPSBOb2RlVXBkYXRlVHlwZS5GUkFNRTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgdGV4dHVyZSBub2RlIHRvIGNvbXB1dGUgdGhlIG1heCBtaXAgbGV2ZWwgZm9yLlxyXG5cdCAqXHJcblx0ICogQHJlYWRvbmx5XHJcblx0ICogQHR5cGUge1RleHR1cmVOb2RlfVxyXG5cdCAqL1xyXG5cdGdldCB0ZXh0dXJlTm9kZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fdGV4dHVyZU5vZGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBAcmVhZG9ubHlcclxuXHQgKiBAdHlwZSB7VGV4dHVyZX1cclxuXHQgKi9cclxuXHRnZXQgdGV4dHVyZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fdGV4dHVyZU5vZGUudmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0dXBkYXRlKCkge1xyXG5cclxuXHRcdGNvbnN0IHRleHR1cmUgPSB0aGlzLnRleHR1cmU7XHJcblx0XHRjb25zdCBpbWFnZXMgPSB0ZXh0dXJlLmltYWdlcztcclxuXHRcdGNvbnN0IGltYWdlID0gKCBpbWFnZXMgJiYgaW1hZ2VzLmxlbmd0aCA+IDAgKSA/ICggKCBpbWFnZXNbIDAgXSAmJiBpbWFnZXNbIDAgXS5pbWFnZSApIHx8IGltYWdlc1sgMCBdICkgOiB0ZXh0dXJlLmltYWdlO1xyXG5cclxuXHRcdGlmICggaW1hZ2UgJiYgaW1hZ2Uud2lkdGggIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gaW1hZ2U7XHJcblxyXG5cdFx0XHR0aGlzLnZhbHVlID0gTWF0aC5sb2cyKCBNYXRoLm1heCggd2lkdGgsIGhlaWdodCApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBNYXhNaXBMZXZlbE5vZGU7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIG1heCBtaXAgbGV2ZWwgbm9kZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtUZXh0dXJlTm9kZX0gdGV4dHVyZU5vZGUgLSBUaGUgdGV4dHVyZSBub2RlIHRvIGNvbXB1dGUgdGhlIG1heCBtaXAgbGV2ZWwgZm9yLlxyXG4gKiBAcmV0dXJucyB7TWF4TWlwTGV2ZWxOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG1heE1pcExldmVsID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE1heE1pcExldmVsTm9kZSApLnNldFBhcmFtZXRlckxlbmd0aCggMSApO1xyXG4iLCJpbXBvcnQgVW5pZm9ybU5vZGUsIHsgdW5pZm9ybSB9IGZyb20gJy4uL2NvcmUvVW5pZm9ybU5vZGUuanMnO1xyXG5pbXBvcnQgeyB1diB9IGZyb20gJy4vVVYuanMnO1xyXG5pbXBvcnQgeyB0ZXh0dXJlU2l6ZSB9IGZyb20gJy4vVGV4dHVyZVNpemVOb2RlLmpzJztcclxuaW1wb3J0IHsgY29sb3JTcGFjZVRvV29ya2luZyB9IGZyb20gJy4uL2Rpc3BsYXkvQ29sb3JTcGFjZU5vZGUuanMnO1xyXG5pbXBvcnQgeyBleHByZXNzaW9uIH0gZnJvbSAnLi4vY29kZS9FeHByZXNzaW9uTm9kZS5qcyc7XHJcbmltcG9ydCB7IG1heE1pcExldmVsIH0gZnJvbSAnLi4vdXRpbHMvTWF4TWlwTGV2ZWxOb2RlLmpzJztcclxuaW1wb3J0IHsgbm9kZVByb3h5LCB2ZWMzLCBub2RlT2JqZWN0LCBpbnQgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcbmltcG9ydCB7IE5vZGVVcGRhdGVUeXBlIH0gZnJvbSAnLi4vY29yZS9jb25zdGFudHMuanMnO1xyXG5cclxuaW1wb3J0IHsgSW50VHlwZSwgTmVhcmVzdEZpbHRlciwgVW5zaWduZWRJbnRUeXBlIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIHR5cGUgb2YgdW5pZm9ybSBub2RlIHJlcHJlc2VudHMgYSAyRCB0ZXh0dXJlLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgVW5pZm9ybU5vZGVcclxuICovXHJcbmNsYXNzIFRleHR1cmVOb2RlIGV4dGVuZHMgVW5pZm9ybU5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdUZXh0dXJlTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB0ZXh0dXJlIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHZhbHVlIC0gVGhlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHs/Tm9kZTx2ZWMyfHZlYzM+fSBbdXZOb2RlPW51bGxdIC0gVGhlIHV2IG5vZGUuXHJcblx0ICogQHBhcmFtIHs/Tm9kZTxpbnQ+fSBbbGV2ZWxOb2RlPW51bGxdIC0gVGhlIGxldmVsIG5vZGUuXHJcblx0ICogQHBhcmFtIHs/Tm9kZTxmbG9hdD59IFtiaWFzTm9kZT1udWxsXSAtIFRoZSBiaWFzIG5vZGUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHZhbHVlLCB1dk5vZGUgPSBudWxsLCBsZXZlbE5vZGUgPSBudWxsLCBiaWFzTm9kZSA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoIHZhbHVlICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzVGV4dHVyZU5vZGUgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVwcmVzZW50cyB0aGUgdGV4dHVyZSBjb29yZGluYXRlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGU8dmVjMnx2ZWMzPn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51dk5vZGUgPSB1dk5vZGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXByZXNlbnRzIHRoZSBtaXAgbGV2ZWwgdGhhdCBzaG91bGQgYmUgc2VsZWN0ZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPGludD59XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGV2ZWxOb2RlID0gbGV2ZWxOb2RlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVwcmVzZW50cyB0aGUgYmlhcyB0byBiZSBhcHBsaWVkIGR1cmluZyBsZXZlbC1vZi1kZXRhaWwgY29tcHV0YXRpb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPGZsb2F0Pn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5iaWFzTm9kZSA9IGJpYXNOb2RlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVwcmVzZW50cyBhIHJlZmVyZW5jZSB2YWx1ZSBhIHRleHR1cmUgc2FtcGxlIGlzIGNvbXBhcmVkIHRvLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Tm9kZTxmbG9hdD59XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29tcGFyZU5vZGUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hlbiB1c2luZyB0ZXh0dXJlIGFycmF5cywgdGhlIGRlcHRoIG5vZGUgZGVmaW5lcyB0aGUgbGF5ZXIgdG8gc2VsZWN0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Tm9kZTxpbnQ+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRlcHRoTm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGVuIGRlZmluZWQsIGEgdGV4dHVyZSBpcyBzYW1wbGVkIHVzaW5nIGV4cGxpY2l0IGdyYWRpZW50cy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P0FycmF5PE5vZGU8dmVjMj4+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdyYWROb2RlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGV4dHVyZSB2YWx1ZXMgc2hvdWxkIGJlIHNhbXBsZWQgb3IgZmV0Y2hlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zYW1wbGVyID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIHV2IHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBzaG91bGQgYmVcclxuXHRcdCAqIGF1dG9tYXRpY2FsbHkgdXBkYXRlZCBvciBub3QuIFVzZSBgc2V0VXBkYXRlTWF0cml4KClgXHJcblx0XHQgKiBpZiB5b3Ugd2FudCB0byBjaGFuZ2UgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXBkYXRlTWF0cml4ID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBCeSBkZWZhdWx0IHRoZSBgdXBkYXRlKClgIG1ldGhvZCBpcyBub3QgZXhlY3V0ZWQuIGBzZXRVcGRhdGVNYXRyaXgoKWBcclxuXHRcdCAqIHNldHMgdGhlIHZhbHVlIHRvIGBmcmFtZWAgd2hlbiB0aGUgdXYgdHJhbnNmb3JtYXRpb24gbWF0cml4IHNob3VsZFxyXG5cdFx0ICogYXV0b21hdGljYWxseSBiZSB1cGRhdGVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKiBAZGVmYXVsdCAnbm9uZSdcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51cGRhdGVUeXBlID0gTm9kZVVwZGF0ZVR5cGUuTk9ORTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByZWZlcmVuY2Ugbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVmZXJlbmNlTm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdGV4dHVyZSB2YWx1ZSBpcyBzdG9yZWQgaW4gYSBwcml2YXRlIHByb3BlcnR5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7VGV4dHVyZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fdmFsdWUgPSB2YWx1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB1bmlmb3JtIG5vZGUgdGhhdCByZXByZXNlbnRzIHRoZSB1diB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHs/VW5pZm9ybU5vZGU8bWF0Mz59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX21hdHJpeFVuaWZvcm0gPSBudWxsO1xyXG5cclxuXHRcdHRoaXMuc2V0VXBkYXRlTWF0cml4KCB1dk5vZGUgPT09IG51bGwgKTtcclxuXHJcblx0fVxyXG5cclxuXHRzZXQgdmFsdWUoIHZhbHVlICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5yZWZlcmVuY2VOb2RlICkge1xyXG5cclxuXHRcdFx0dGhpcy5yZWZlcmVuY2VOb2RlLnZhbHVlID0gdmFsdWU7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHRoaXMuX3ZhbHVlID0gdmFsdWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSB0ZXh0dXJlIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge1RleHR1cmV9XHJcblx0ICovXHJcblx0Z2V0IHZhbHVlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnJlZmVyZW5jZU5vZGUgPyB0aGlzLnJlZmVyZW5jZU5vZGUudmFsdWUgOiB0aGlzLl92YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBPdmVyd3JpdHRlbiBzaW5jZSB0aGUgdW5pZm9ybSBoYXNoIGlzIGRlZmluZWQgYnkgdGhlIHRleHR1cmUncyBVVUlELlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB1bmlmb3JtIGhhc2guXHJcblx0ICovXHJcblx0Z2V0VW5pZm9ybUhhc2goIC8qYnVpbGRlciovICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnZhbHVlLnV1aWQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogT3ZlcndyaXR0ZW4gc2luY2UgdGhlIG5vZGUgdHlwZSBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0ZXh0dXJlIHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG5vZGUgdHlwZS5cclxuXHQgKi9cclxuXHRnZXROb2RlVHlwZSggLypidWlsZGVyKi8gKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLnZhbHVlLmlzRGVwdGhUZXh0dXJlID09PSB0cnVlICkgcmV0dXJuICdmbG9hdCc7XHJcblxyXG5cdFx0aWYgKCB0aGlzLnZhbHVlLnR5cGUgPT09IFVuc2lnbmVkSW50VHlwZSApIHtcclxuXHJcblx0XHRcdHJldHVybiAndXZlYzQnO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHRoaXMudmFsdWUudHlwZSA9PT0gSW50VHlwZSApIHtcclxuXHJcblx0XHRcdHJldHVybiAnaXZlYzQnO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gJ3ZlYzQnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE92ZXJ3cml0ZXMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gcmV0dXJuIGEgZml4ZWQgdmFsdWUgYCd0ZXh0dXJlJ2AuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGlucHV0IHR5cGUuXHJcblx0ICovXHJcblx0Z2V0SW5wdXRUeXBlKCAvKmJ1aWxkZXIqLyApIHtcclxuXHJcblx0XHRyZXR1cm4gJ3RleHR1cmUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBkZWZhdWx0IHV2cyBiYXNlZCBvbiB0aGUgY3VycmVudCB0ZXh0dXJlJ3MgY2hhbm5lbC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0F0dHJpYnV0ZU5vZGU8dmVjMj59IFRoZSBkZWZhdWx0IHV2cy5cclxuXHQgKi9cclxuXHRnZXREZWZhdWx0VVYoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHV2KCB0aGlzLnZhbHVlLmNoYW5uZWwgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBPdmVyd3JpdHRlbiB0byBhbHdheXMgcmV0dXJuIHRoZSB0ZXh0dXJlIHJlZmVyZW5jZSBvZiB0aGUgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7YW55fSBzdGF0ZSAtIFRoaXMgbWV0aG9kIGNhbiBiZSBpbnZvY2F0ZWQgaW4gZGlmZmVyZW50IGNvbnRleHRzIHNvIGBzdGF0ZWAgY2FuIHJlZmVyIHRvIGFueSBvYmplY3QgdHlwZS5cclxuXHQgKiBAcmV0dXJuIHtUZXh0dXJlfSBUaGUgdGV4dHVyZSByZWZlcmVuY2UuXHJcblx0ICovXHJcblx0dXBkYXRlUmVmZXJlbmNlKCAvKnN0YXRlKi8gKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMudmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVHJhbnNmb3JtcyB0aGUgZ2l2ZW4gdXYgbm9kZSB3aXRoIHRoZSB0ZXh0dXJlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gdXZOb2RlIC0gVGhlIHV2IG5vZGUgdG8gdHJhbnNmb3JtLlxyXG5cdCAqIEByZXR1cm4ge05vZGV9IFRoZSB0cmFuc2Zvcm1lZCB1diBub2RlLlxyXG5cdCAqL1xyXG5cdGdldFRyYW5zZm9ybWVkVVYoIHV2Tm9kZSApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuX21hdHJpeFVuaWZvcm0gPT09IG51bGwgKSB0aGlzLl9tYXRyaXhVbmlmb3JtID0gdW5pZm9ybSggdGhpcy52YWx1ZS5tYXRyaXggKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fbWF0cml4VW5pZm9ybS5tdWwoIHZlYzMoIHV2Tm9kZSwgMSApICkueHk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVmaW5lcyB3aGV0aGVyIHRoZSB1diB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggc2hvdWxkIGF1dG9tYXRpY2FsbHkgYmUgdXBkYXRlZCBvciBub3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbHVlIC0gVGhlIHVwZGF0ZSB0b2dnbGUuXHJcblx0ICogQHJldHVybiB7VGV4dHVyZU5vZGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbm9kZS5cclxuXHQgKi9cclxuXHRzZXRVcGRhdGVNYXRyaXgoIHZhbHVlICkge1xyXG5cclxuXHRcdHRoaXMudXBkYXRlTWF0cml4ID0gdmFsdWU7XHJcblx0XHR0aGlzLnVwZGF0ZVR5cGUgPSB2YWx1ZSA/IE5vZGVVcGRhdGVUeXBlLlJFTkRFUiA6IE5vZGVVcGRhdGVUeXBlLk5PTkU7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0dXBzIHRoZSB1diBub2RlLiBEZXBlbmRpbmcgb24gdGhlIGJhY2tlbmQgYXMgd2VsbCBhcyB0ZXh0dXJlJ3MgaW1hZ2UgYW5kIHR5cGUsIGl0IG1pZ2h0IGJlIG5lY2Vzc2FyeVxyXG5cdCAqIHRvIG1vZGlmeSB0aGUgdXYgbm9kZSBmb3IgY29ycmVjdCBzYW1wbGluZy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHBhcmFtIHtOb2RlfSB1dk5vZGUgLSBUaGUgdXYgbm9kZSB0byBzZXR1cC5cclxuXHQgKiBAcmV0dXJuIHtOb2RlfSBUaGUgdXBkYXRlZCB1diBub2RlLlxyXG5cdCAqL1xyXG5cdHNldHVwVVYoIGJ1aWxkZXIsIHV2Tm9kZSApIHtcclxuXHJcblx0XHRjb25zdCB0ZXh0dXJlID0gdGhpcy52YWx1ZTtcclxuXHJcblx0XHRpZiAoIGJ1aWxkZXIuaXNGbGlwWSgpICYmICggKCB0ZXh0dXJlLmltYWdlIGluc3RhbmNlb2YgSW1hZ2VCaXRtYXAgJiYgdGV4dHVyZS5mbGlwWSA9PT0gdHJ1ZSApIHx8IHRleHR1cmUuaXNSZW5kZXJUYXJnZXRUZXh0dXJlID09PSB0cnVlIHx8IHRleHR1cmUuaXNGcmFtZWJ1ZmZlclRleHR1cmUgPT09IHRydWUgfHwgdGV4dHVyZS5pc0RlcHRoVGV4dHVyZSA9PT0gdHJ1ZSApICkge1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLnNhbXBsZXIgKSB7XHJcblxyXG5cdFx0XHRcdHV2Tm9kZSA9IHV2Tm9kZS5mbGlwWSgpO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0dXZOb2RlID0gdXZOb2RlLnNldFkoIGludCggdGV4dHVyZVNpemUoIHRoaXMsIHRoaXMubGV2ZWxOb2RlICkueSApLnN1YiggdXZOb2RlLnkgKS5zdWIoIDEgKSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdXZOb2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHVwcyB0ZXh0dXJlIG5vZGUgYnkgcHJlcGFyaW5nIHRoZSBpbnRlcm5hbCBub2RlcyBmb3IgY29kZSBnZW5lcmF0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKi9cclxuXHRzZXR1cCggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCBwcm9wZXJ0aWVzID0gYnVpbGRlci5nZXROb2RlUHJvcGVydGllcyggdGhpcyApO1xyXG5cdFx0cHJvcGVydGllcy5yZWZlcmVuY2VOb2RlID0gdGhpcy5yZWZlcmVuY2VOb2RlO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZSA9IHRoaXMudmFsdWU7XHJcblxyXG5cdFx0aWYgKCAhIHRleHR1cmUgfHwgdGV4dHVyZS5pc1RleHR1cmUgIT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5UU0w6IGB0ZXh0dXJlKCB2YWx1ZSApYCBmdW5jdGlvbiBleHBlY3RzIGEgdmFsaWQgaW5zdGFuY2Ugb2YgVEhSRUUuVGV4dHVyZSgpLicgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRsZXQgdXZOb2RlID0gdGhpcy51dk5vZGU7XHJcblxyXG5cdFx0aWYgKCAoIHV2Tm9kZSA9PT0gbnVsbCB8fCBidWlsZGVyLmNvbnRleHQuZm9yY2VVVkNvbnRleHQgPT09IHRydWUgKSAmJiBidWlsZGVyLmNvbnRleHQuZ2V0VVYgKSB7XHJcblxyXG5cdFx0XHR1dk5vZGUgPSBidWlsZGVyLmNvbnRleHQuZ2V0VVYoIHRoaXMgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCAhIHV2Tm9kZSApIHV2Tm9kZSA9IHRoaXMuZ2V0RGVmYXVsdFVWKCk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLnVwZGF0ZU1hdHJpeCA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdHV2Tm9kZSA9IHRoaXMuZ2V0VHJhbnNmb3JtZWRVViggdXZOb2RlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHV2Tm9kZSA9IHRoaXMuc2V0dXBVViggYnVpbGRlciwgdXZOb2RlICk7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRsZXQgbGV2ZWxOb2RlID0gdGhpcy5sZXZlbE5vZGU7XHJcblxyXG5cdFx0aWYgKCBsZXZlbE5vZGUgPT09IG51bGwgJiYgYnVpbGRlci5jb250ZXh0LmdldFRleHR1cmVMZXZlbCApIHtcclxuXHJcblx0XHRcdGxldmVsTm9kZSA9IGJ1aWxkZXIuY29udGV4dC5nZXRUZXh0dXJlTGV2ZWwoIHRoaXMgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRwcm9wZXJ0aWVzLnV2Tm9kZSA9IHV2Tm9kZTtcclxuXHRcdHByb3BlcnRpZXMubGV2ZWxOb2RlID0gbGV2ZWxOb2RlO1xyXG5cdFx0cHJvcGVydGllcy5iaWFzTm9kZSA9IHRoaXMuYmlhc05vZGU7XHJcblx0XHRwcm9wZXJ0aWVzLmNvbXBhcmVOb2RlID0gdGhpcy5jb21wYXJlTm9kZTtcclxuXHRcdHByb3BlcnRpZXMuZ3JhZE5vZGUgPSB0aGlzLmdyYWROb2RlO1xyXG5cdFx0cHJvcGVydGllcy5kZXB0aE5vZGUgPSB0aGlzLmRlcHRoTm9kZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZW5lcmF0ZXMgdGhlIHV2IGNvZGUgc25pcHBldC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHBhcmFtIHtOb2RlfSB1dk5vZGUgLSBUaGUgdXYgbm9kZSB0byBnZW5lcmF0ZSBjb2RlIGZvci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBnZW5lcmF0ZWQgY29kZSBzbmlwcGV0LlxyXG5cdCAqL1xyXG5cdGdlbmVyYXRlVVYoIGJ1aWxkZXIsIHV2Tm9kZSApIHtcclxuXHJcblx0XHRyZXR1cm4gdXZOb2RlLmJ1aWxkKCBidWlsZGVyLCB0aGlzLnNhbXBsZXIgPT09IHRydWUgPyAndmVjMicgOiAnaXZlYzInICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2VuZXJhdGVzIHRoZSBzbmlwcGV0IGZvciB0aGUgdGV4dHVyZSBzYW1wbGluZy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHRleHR1cmVQcm9wZXJ0eSAtIFRoZSB0ZXh0dXJlIHByb3BlcnR5LlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB1dlNuaXBwZXQgLSBUaGUgdXYgc25pcHBldC5cclxuXHQgKiBAcGFyYW0gez9zdHJpbmd9IGxldmVsU25pcHBldCAtIFRoZSBsZXZlbCBzbmlwcGV0LlxyXG5cdCAqIEBwYXJhbSB7P3N0cmluZ30gYmlhc1NuaXBwZXQgLSBUaGUgYmlhcyBzbmlwcGV0LlxyXG5cdCAqIEBwYXJhbSB7P3N0cmluZ30gZGVwdGhTbmlwcGV0IC0gVGhlIGRlcHRoIHNuaXBwZXQuXHJcblx0ICogQHBhcmFtIHs/c3RyaW5nfSBjb21wYXJlU25pcHBldCAtIFRoZSBjb21wYXJlIHNuaXBwZXQuXHJcblx0ICogQHBhcmFtIHs/QXJyYXk8c3RyaW5nPn0gZ3JhZFNuaXBwZXQgLSBUaGUgZ3JhZCBzbmlwcGV0LlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGdlbmVyYXRlZCBjb2RlIHNuaXBwZXQuXHJcblx0ICovXHJcblx0Z2VuZXJhdGVTbmlwcGV0KCBidWlsZGVyLCB0ZXh0dXJlUHJvcGVydHksIHV2U25pcHBldCwgbGV2ZWxTbmlwcGV0LCBiaWFzU25pcHBldCwgZGVwdGhTbmlwcGV0LCBjb21wYXJlU25pcHBldCwgZ3JhZFNuaXBwZXQgKSB7XHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZSA9IHRoaXMudmFsdWU7XHJcblxyXG5cdFx0bGV0IHNuaXBwZXQ7XHJcblxyXG5cdFx0aWYgKCBsZXZlbFNuaXBwZXQgKSB7XHJcblxyXG5cdFx0XHRzbmlwcGV0ID0gYnVpbGRlci5nZW5lcmF0ZVRleHR1cmVMZXZlbCggdGV4dHVyZSwgdGV4dHVyZVByb3BlcnR5LCB1dlNuaXBwZXQsIGxldmVsU25pcHBldCwgZGVwdGhTbmlwcGV0ICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggYmlhc1NuaXBwZXQgKSB7XHJcblxyXG5cdFx0XHRzbmlwcGV0ID0gYnVpbGRlci5nZW5lcmF0ZVRleHR1cmVCaWFzKCB0ZXh0dXJlLCB0ZXh0dXJlUHJvcGVydHksIHV2U25pcHBldCwgYmlhc1NuaXBwZXQsIGRlcHRoU25pcHBldCApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGdyYWRTbmlwcGV0ICkge1xyXG5cclxuXHRcdFx0c25pcHBldCA9IGJ1aWxkZXIuZ2VuZXJhdGVUZXh0dXJlR3JhZCggdGV4dHVyZSwgdGV4dHVyZVByb3BlcnR5LCB1dlNuaXBwZXQsIGdyYWRTbmlwcGV0LCBkZXB0aFNuaXBwZXQgKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBjb21wYXJlU25pcHBldCApIHtcclxuXHJcblx0XHRcdHNuaXBwZXQgPSBidWlsZGVyLmdlbmVyYXRlVGV4dHVyZUNvbXBhcmUoIHRleHR1cmUsIHRleHR1cmVQcm9wZXJ0eSwgdXZTbmlwcGV0LCBjb21wYXJlU25pcHBldCwgZGVwdGhTbmlwcGV0ICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggdGhpcy5zYW1wbGVyID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdHNuaXBwZXQgPSBidWlsZGVyLmdlbmVyYXRlVGV4dHVyZUxvYWQoIHRleHR1cmUsIHRleHR1cmVQcm9wZXJ0eSwgdXZTbmlwcGV0LCBkZXB0aFNuaXBwZXQgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0c25pcHBldCA9IGJ1aWxkZXIuZ2VuZXJhdGVUZXh0dXJlKCB0ZXh0dXJlLCB0ZXh0dXJlUHJvcGVydHksIHV2U25pcHBldCwgZGVwdGhTbmlwcGV0ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBzbmlwcGV0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyB0aGUgY29kZSBzbmlwcGV0IG9mIHRoZSB0ZXh0dXJlIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBvdXRwdXQgLSBUaGUgY3VycmVudCBvdXRwdXQuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgZ2VuZXJhdGVkIGNvZGUgc25pcHBldC5cclxuXHQgKi9cclxuXHRnZW5lcmF0ZSggYnVpbGRlciwgb3V0cHV0ICkge1xyXG5cclxuXHRcdGNvbnN0IHRleHR1cmUgPSB0aGlzLnZhbHVlO1xyXG5cclxuXHRcdGNvbnN0IHByb3BlcnRpZXMgPSBidWlsZGVyLmdldE5vZGVQcm9wZXJ0aWVzKCB0aGlzICk7XHJcblx0XHRjb25zdCB0ZXh0dXJlUHJvcGVydHkgPSBzdXBlci5nZW5lcmF0ZSggYnVpbGRlciwgJ3Byb3BlcnR5JyApO1xyXG5cclxuXHRcdGlmICggL15zYW1wbGVyLy50ZXN0KCBvdXRwdXQgKSApIHtcclxuXHJcblx0XHRcdHJldHVybiB0ZXh0dXJlUHJvcGVydHkgKyAnX3NhbXBsZXInO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGJ1aWxkZXIuaXNSZWZlcmVuY2UoIG91dHB1dCApICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIHRleHR1cmVQcm9wZXJ0eTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc3Qgbm9kZURhdGEgPSBidWlsZGVyLmdldERhdGFGcm9tTm9kZSggdGhpcyApO1xyXG5cclxuXHRcdFx0bGV0IHByb3BlcnR5TmFtZSA9IG5vZGVEYXRhLnByb3BlcnR5TmFtZTtcclxuXHJcblx0XHRcdGlmICggcHJvcGVydHlOYW1lID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHsgdXZOb2RlLCBsZXZlbE5vZGUsIGJpYXNOb2RlLCBjb21wYXJlTm9kZSwgZGVwdGhOb2RlLCBncmFkTm9kZSB9ID0gcHJvcGVydGllcztcclxuXHJcblx0XHRcdFx0Y29uc3QgdXZTbmlwcGV0ID0gdGhpcy5nZW5lcmF0ZVVWKCBidWlsZGVyLCB1dk5vZGUgKTtcclxuXHRcdFx0XHRjb25zdCBsZXZlbFNuaXBwZXQgPSBsZXZlbE5vZGUgPyBsZXZlbE5vZGUuYnVpbGQoIGJ1aWxkZXIsICdmbG9hdCcgKSA6IG51bGw7XHJcblx0XHRcdFx0Y29uc3QgYmlhc1NuaXBwZXQgPSBiaWFzTm9kZSA/IGJpYXNOb2RlLmJ1aWxkKCBidWlsZGVyLCAnZmxvYXQnICkgOiBudWxsO1xyXG5cdFx0XHRcdGNvbnN0IGRlcHRoU25pcHBldCA9IGRlcHRoTm9kZSA/IGRlcHRoTm9kZS5idWlsZCggYnVpbGRlciwgJ2ludCcgKSA6IG51bGw7XHJcblx0XHRcdFx0Y29uc3QgY29tcGFyZVNuaXBwZXQgPSBjb21wYXJlTm9kZSA/IGNvbXBhcmVOb2RlLmJ1aWxkKCBidWlsZGVyLCAnZmxvYXQnICkgOiBudWxsO1xyXG5cdFx0XHRcdGNvbnN0IGdyYWRTbmlwcGV0ID0gZ3JhZE5vZGUgPyBbIGdyYWROb2RlWyAwIF0uYnVpbGQoIGJ1aWxkZXIsICd2ZWMyJyApLCBncmFkTm9kZVsgMSBdLmJ1aWxkKCBidWlsZGVyLCAndmVjMicgKSBdIDogbnVsbDtcclxuXHJcblx0XHRcdFx0Y29uc3Qgbm9kZVZhciA9IGJ1aWxkZXIuZ2V0VmFyRnJvbU5vZGUoIHRoaXMgKTtcclxuXHJcblx0XHRcdFx0cHJvcGVydHlOYW1lID0gYnVpbGRlci5nZXRQcm9wZXJ0eU5hbWUoIG5vZGVWYXIgKTtcclxuXHJcblx0XHRcdFx0Y29uc3Qgc25pcHBldCA9IHRoaXMuZ2VuZXJhdGVTbmlwcGV0KCBidWlsZGVyLCB0ZXh0dXJlUHJvcGVydHksIHV2U25pcHBldCwgbGV2ZWxTbmlwcGV0LCBiaWFzU25pcHBldCwgZGVwdGhTbmlwcGV0LCBjb21wYXJlU25pcHBldCwgZ3JhZFNuaXBwZXQgKTtcclxuXHJcblx0XHRcdFx0YnVpbGRlci5hZGRMaW5lRmxvd0NvZGUoIGAke3Byb3BlcnR5TmFtZX0gPSAke3NuaXBwZXR9YCwgdGhpcyApO1xyXG5cclxuXHRcdFx0XHRub2RlRGF0YS5zbmlwcGV0ID0gc25pcHBldDtcclxuXHRcdFx0XHRub2RlRGF0YS5wcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRsZXQgc25pcHBldCA9IHByb3BlcnR5TmFtZTtcclxuXHRcdFx0Y29uc3Qgbm9kZVR5cGUgPSB0aGlzLmdldE5vZGVUeXBlKCBidWlsZGVyICk7XHJcblxyXG5cdFx0XHRpZiAoIGJ1aWxkZXIubmVlZHNUb1dvcmtpbmdDb2xvclNwYWNlKCB0ZXh0dXJlICkgKSB7XHJcblxyXG5cdFx0XHRcdHNuaXBwZXQgPSBjb2xvclNwYWNlVG9Xb3JraW5nKCBleHByZXNzaW9uKCBzbmlwcGV0LCBub2RlVHlwZSApLCB0ZXh0dXJlLmNvbG9yU3BhY2UgKS5zZXR1cCggYnVpbGRlciApLmJ1aWxkKCBidWlsZGVyLCBub2RlVHlwZSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIGJ1aWxkZXIuZm9ybWF0KCBzbmlwcGV0LCBub2RlVHlwZSwgb3V0cHV0ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHNhbXBsZXIgdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbHVlIC0gVGhlIHNhbXBsZXIgdmFsdWUgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge1RleHR1cmVOb2RlfSBBIHJlZmVyZW5jZSB0byB0aGlzIHRleHR1cmUgbm9kZS5cclxuXHQgKi9cclxuXHRzZXRTYW1wbGVyKCB2YWx1ZSApIHtcclxuXHJcblx0XHR0aGlzLnNhbXBsZXIgPSB2YWx1ZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBzYW1wbGVyIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gVGhlIHNhbXBsZXIgdmFsdWUuXHJcblx0ICovXHJcblx0Z2V0U2FtcGxlcigpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5zYW1wbGVyO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vIEBUT0RPOiBNb3ZlIHRvIFRTTFxyXG5cclxuXHQvKipcclxuXHQgKiBAZnVuY3Rpb25cclxuXHQgKiBAZGVwcmVjYXRlZCBzaW5jZSByMTcyLiBVc2Uge0BsaW5rIFRleHR1cmVOb2RlI3NhbXBsZX0gaW5zdGVhZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gdXZOb2RlIC0gVGhlIHV2IG5vZGUuXHJcblx0ICogQHJldHVybiB7VGV4dHVyZU5vZGV9IEEgdGV4dHVyZSBub2RlIHJlcHJlc2VudGluZyB0aGUgdGV4dHVyZSBzYW1wbGUuXHJcblx0ICovXHJcblx0dXYoIHV2Tm9kZSApIHsgLy8gQGRlcHJlY2F0ZWQsIHIxNzJcclxuXHJcblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5UZXh0dXJlTm9kZTogLnV2KCkgaGFzIGJlZW4gcmVuYW1lZC4gVXNlIC5zYW1wbGUoKSBpbnN0ZWFkLicgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5zYW1wbGUoIHV2Tm9kZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNhbXBsZXMgdGhlIHRleHR1cmUgd2l0aCB0aGUgZ2l2ZW4gdXYgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gdXZOb2RlIC0gVGhlIHV2IG5vZGUuXHJcblx0ICogQHJldHVybiB7VGV4dHVyZU5vZGV9IEEgdGV4dHVyZSBub2RlIHJlcHJlc2VudGluZyB0aGUgdGV4dHVyZSBzYW1wbGUuXHJcblx0ICovXHJcblx0c2FtcGxlKCB1dk5vZGUgKSB7XHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZU5vZGUgPSB0aGlzLmNsb25lKCk7XHJcblx0XHR0ZXh0dXJlTm9kZS51dk5vZGUgPSBub2RlT2JqZWN0KCB1dk5vZGUgKTtcclxuXHRcdHRleHR1cmVOb2RlLnJlZmVyZW5jZU5vZGUgPSB0aGlzLmdldFNlbGYoKTtcclxuXHJcblx0XHRyZXR1cm4gbm9kZU9iamVjdCggdGV4dHVyZU5vZGUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTYW1wbGVzIGEgYmx1cnJlZCB2ZXJzaW9uIG9mIHRoZSB0ZXh0dXJlIGJ5IGRlZmluaW5nIGFuIGludGVybmFsIGJpYXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSBhbW91bnROb2RlIC0gSG93IGJsdXJyZWQgdGhlIHRleHR1cmUgc2hvdWxkIGJlLlxyXG5cdCAqIEByZXR1cm4ge1RleHR1cmVOb2RlfSBBIHRleHR1cmUgbm9kZSByZXByZXNlbnRpbmcgdGhlIHRleHR1cmUgc2FtcGxlLlxyXG5cdCAqL1xyXG5cdGJsdXIoIGFtb3VudE5vZGUgKSB7XHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZU5vZGUgPSB0aGlzLmNsb25lKCk7XHJcblx0XHR0ZXh0dXJlTm9kZS5iaWFzTm9kZSA9IG5vZGVPYmplY3QoIGFtb3VudE5vZGUgKS5tdWwoIG1heE1pcExldmVsKCB0ZXh0dXJlTm9kZSApICk7XHJcblx0XHR0ZXh0dXJlTm9kZS5yZWZlcmVuY2VOb2RlID0gdGhpcy5nZXRTZWxmKCk7XHJcblxyXG5cdFx0Y29uc3QgbWFwID0gdGV4dHVyZU5vZGUudmFsdWU7XHJcblxyXG5cdFx0aWYgKCBtYXAgJiYgbWFwLmdlbmVyYXRlTWlwbWFwcyA9PT0gZmFsc2UgfHwgbWFwLm1pbkZpbHRlciA9PT0gTmVhcmVzdEZpbHRlciB8fCBtYXAubWFnRmlsdGVyID09PSBOZWFyZXN0RmlsdGVyICkge1xyXG5cclxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVFNMOiB0ZXh0dXJlKCkuYmx1cigpIHJlcXVpcmVzIG1pcG1hcHMgYW5kIHNhbXBsaW5nLiBVc2UgLmdlbmVyYXRlTWlwbWFwcz10cnVlIGFuZCAubWluRmlsdGVyLy5tYWdGaWx0ZXI9VEhSRUUuTGluZWFyRmlsdGVyIGluIHRoZSBUZXh0dXJlLicgKTtcclxuXHJcblx0XHRcdHRleHR1cmVOb2RlLmJpYXNOb2RlID0gbnVsbDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG5vZGVPYmplY3QoIHRleHR1cmVOb2RlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2FtcGxlcyBhIHNwZWNpZmljIG1pcCBvZiB0aGUgdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZTxpbnQ+fSBsZXZlbE5vZGUgLSBUaGUgbWlwIGxldmVsIHRvIHNhbXBsZS5cclxuXHQgKiBAcmV0dXJuIHtUZXh0dXJlTm9kZX0gQSB0ZXh0dXJlIG5vZGUgcmVwcmVzZW50aW5nIHRoZSB0ZXh0dXJlIHNhbXBsZS5cclxuXHQgKi9cclxuXHRsZXZlbCggbGV2ZWxOb2RlICkge1xyXG5cclxuXHRcdGNvbnN0IHRleHR1cmVOb2RlID0gdGhpcy5jbG9uZSgpO1xyXG5cdFx0dGV4dHVyZU5vZGUubGV2ZWxOb2RlID0gbm9kZU9iamVjdCggbGV2ZWxOb2RlICk7XHJcblx0XHR0ZXh0dXJlTm9kZS5yZWZlcmVuY2VOb2RlID0gdGhpcy5nZXRTZWxmKCk7XHJcblxyXG5cdFx0cmV0dXJuIG5vZGVPYmplY3QoIHRleHR1cmVOb2RlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgdGV4dHVyZSBzaXplIG9mIHRoZSByZXF1ZXN0ZWQgbGV2ZWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGU8aW50Pn0gbGV2ZWxOb2RlIC0gVGhlIGxldmVsIHRvIGNvbXB1dGUgdGhlIHNpemUgZm9yLlxyXG5cdCAqIEByZXR1cm4ge1RleHR1cmVTaXplTm9kZX0gVGhlIHRleHR1cmUgc2l6ZS5cclxuXHQgKi9cclxuXHRzaXplKCBsZXZlbE5vZGUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRleHR1cmVTaXplKCB0aGlzLCBsZXZlbE5vZGUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTYW1wbGVzIHRoZSB0ZXh0dXJlIHdpdGggdGhlIGdpdmVuIGJpYXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSBiaWFzTm9kZSAtIFRoZSBiaWFzIG5vZGUuXHJcblx0ICogQHJldHVybiB7VGV4dHVyZU5vZGV9IEEgdGV4dHVyZSBub2RlIHJlcHJlc2VudGluZyB0aGUgdGV4dHVyZSBzYW1wbGUuXHJcblx0ICovXHJcblx0YmlhcyggYmlhc05vZGUgKSB7XHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZU5vZGUgPSB0aGlzLmNsb25lKCk7XHJcblx0XHR0ZXh0dXJlTm9kZS5iaWFzTm9kZSA9IG5vZGVPYmplY3QoIGJpYXNOb2RlICk7XHJcblx0XHR0ZXh0dXJlTm9kZS5yZWZlcmVuY2VOb2RlID0gdGhpcy5nZXRTZWxmKCk7XHJcblxyXG5cdFx0cmV0dXJuIG5vZGVPYmplY3QoIHRleHR1cmVOb2RlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2FtcGxlcyB0aGUgdGV4dHVyZSBieSBleGVjdXRpbmcgYSBjb21wYXJlIG9wZXJhdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZTxmbG9hdD59IGNvbXBhcmVOb2RlIC0gVGhlIG5vZGUgdGhhdCBkZWZpbmVzIHRoZSBjb21wYXJlIHZhbHVlLlxyXG5cdCAqIEByZXR1cm4ge1RleHR1cmVOb2RlfSBBIHRleHR1cmUgbm9kZSByZXByZXNlbnRpbmcgdGhlIHRleHR1cmUgc2FtcGxlLlxyXG5cdCAqL1xyXG5cdGNvbXBhcmUoIGNvbXBhcmVOb2RlICkge1xyXG5cclxuXHRcdGNvbnN0IHRleHR1cmVOb2RlID0gdGhpcy5jbG9uZSgpO1xyXG5cdFx0dGV4dHVyZU5vZGUuY29tcGFyZU5vZGUgPSBub2RlT2JqZWN0KCBjb21wYXJlTm9kZSApO1xyXG5cdFx0dGV4dHVyZU5vZGUucmVmZXJlbmNlTm9kZSA9IHRoaXMuZ2V0U2VsZigpO1xyXG5cclxuXHRcdHJldHVybiBub2RlT2JqZWN0KCB0ZXh0dXJlTm9kZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNhbXBsZXMgdGhlIHRleHR1cmUgdXNpbmcgYW4gZXhwbGljaXQgZ3JhZGllbnQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGU8dmVjMj59IGdyYWROb2RlWCAtIFRoZSBncmFkWCBub2RlLlxyXG5cdCAqIEBwYXJhbSB7Tm9kZTx2ZWMyPn0gZ3JhZE5vZGVZIC0gVGhlIGdyYWRZIG5vZGUuXHJcblx0ICogQHJldHVybiB7VGV4dHVyZU5vZGV9IEEgdGV4dHVyZSBub2RlIHJlcHJlc2VudGluZyB0aGUgdGV4dHVyZSBzYW1wbGUuXHJcblx0ICovXHJcblx0Z3JhZCggZ3JhZE5vZGVYLCBncmFkTm9kZVkgKSB7XHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZU5vZGUgPSB0aGlzLmNsb25lKCk7XHJcblx0XHR0ZXh0dXJlTm9kZS5ncmFkTm9kZSA9IFsgbm9kZU9iamVjdCggZ3JhZE5vZGVYICksIG5vZGVPYmplY3QoIGdyYWROb2RlWSApIF07XHJcblx0XHR0ZXh0dXJlTm9kZS5yZWZlcmVuY2VOb2RlID0gdGhpcy5nZXRTZWxmKCk7XHJcblxyXG5cdFx0cmV0dXJuIG5vZGVPYmplY3QoIHRleHR1cmVOb2RlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2FtcGxlcyB0aGUgdGV4dHVyZSBieSBkZWZpbmluZyBhIGRlcHRoIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGU8aW50Pn0gZGVwdGhOb2RlIC0gVGhlIGRlcHRoIG5vZGUuXHJcblx0ICogQHJldHVybiB7VGV4dHVyZU5vZGV9IEEgdGV4dHVyZSBub2RlIHJlcHJlc2VudGluZyB0aGUgdGV4dHVyZSBzYW1wbGUuXHJcblx0ICovXHJcblx0ZGVwdGgoIGRlcHRoTm9kZSApIHtcclxuXHJcblx0XHRjb25zdCB0ZXh0dXJlTm9kZSA9IHRoaXMuY2xvbmUoKTtcclxuXHRcdHRleHR1cmVOb2RlLmRlcHRoTm9kZSA9IG5vZGVPYmplY3QoIGRlcHRoTm9kZSApO1xyXG5cdFx0dGV4dHVyZU5vZGUucmVmZXJlbmNlTm9kZSA9IHRoaXMuZ2V0U2VsZigpO1xyXG5cclxuXHRcdHJldHVybiBub2RlT2JqZWN0KCB0ZXh0dXJlTm9kZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vIC0tXHJcblxyXG5cdHNlcmlhbGl6ZSggZGF0YSApIHtcclxuXHJcblx0XHRzdXBlci5zZXJpYWxpemUoIGRhdGEgKTtcclxuXHJcblx0XHRkYXRhLnZhbHVlID0gdGhpcy52YWx1ZS50b0pTT04oIGRhdGEubWV0YSApLnV1aWQ7XHJcblx0XHRkYXRhLnNhbXBsZXIgPSB0aGlzLnNhbXBsZXI7XHJcblx0XHRkYXRhLnVwZGF0ZU1hdHJpeCA9IHRoaXMudXBkYXRlTWF0cml4O1xyXG5cdFx0ZGF0YS51cGRhdGVUeXBlID0gdGhpcy51cGRhdGVUeXBlO1xyXG5cclxuXHR9XHJcblxyXG5cdGRlc2VyaWFsaXplKCBkYXRhICkge1xyXG5cclxuXHRcdHN1cGVyLmRlc2VyaWFsaXplKCBkYXRhICk7XHJcblxyXG5cdFx0dGhpcy52YWx1ZSA9IGRhdGEubWV0YS50ZXh0dXJlc1sgZGF0YS52YWx1ZSBdO1xyXG5cdFx0dGhpcy5zYW1wbGVyID0gZGF0YS5zYW1wbGVyO1xyXG5cdFx0dGhpcy51cGRhdGVNYXRyaXggPSBkYXRhLnVwZGF0ZU1hdHJpeDtcclxuXHRcdHRoaXMudXBkYXRlVHlwZSA9IGRhdGEudXBkYXRlVHlwZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgdXBkYXRlIGlzIHVzZWQgdG8gaW1wbGVtZW50IHRoZSB1cGRhdGUgb2YgdGhlIHV2IHRyYW5zZm9ybWF0aW9uIG1hdHJpeC5cclxuXHQgKi9cclxuXHR1cGRhdGUoKSB7XHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZSA9IHRoaXMudmFsdWU7XHJcblx0XHRjb25zdCBtYXRyaXhVbmlmb3JtID0gdGhpcy5fbWF0cml4VW5pZm9ybTtcclxuXHJcblx0XHRpZiAoIG1hdHJpeFVuaWZvcm0gIT09IG51bGwgKSBtYXRyaXhVbmlmb3JtLnZhbHVlID0gdGV4dHVyZS5tYXRyaXg7XHJcblxyXG5cdFx0aWYgKCB0ZXh0dXJlLm1hdHJpeEF1dG9VcGRhdGUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHR0ZXh0dXJlLnVwZGF0ZU1hdHJpeCgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDbG9uZXMgdGhlIHRleHR1cmUgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1RleHR1cmVOb2RlfSBUaGUgY2xvbmVkIHRleHR1cmUgbm9kZS5cclxuXHQgKi9cclxuXHRjbG9uZSgpIHtcclxuXHJcblx0XHRjb25zdCBuZXdOb2RlID0gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMudmFsdWUsIHRoaXMudXZOb2RlLCB0aGlzLmxldmVsTm9kZSwgdGhpcy5iaWFzTm9kZSApO1xyXG5cdFx0bmV3Tm9kZS5zYW1wbGVyID0gdGhpcy5zYW1wbGVyO1xyXG5cclxuXHRcdHJldHVybiBuZXdOb2RlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBUZXh0dXJlTm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgdGV4dHVyZSBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge1RleHR1cmV9IHZhbHVlIC0gVGhlIHRleHR1cmUuXHJcbiAqIEBwYXJhbSB7P05vZGU8dmVjMnx2ZWMzPn0gW3V2Tm9kZT1udWxsXSAtIFRoZSB1diBub2RlLlxyXG4gKiBAcGFyYW0gez9Ob2RlPGludD59IFtsZXZlbE5vZGU9bnVsbF0gLSBUaGUgbGV2ZWwgbm9kZS5cclxuICogQHBhcmFtIHs/Tm9kZTxmbG9hdD59IFtiaWFzTm9kZT1udWxsXSAtIFRoZSBiaWFzIG5vZGUuXHJcbiAqIEByZXR1cm5zIHtUZXh0dXJlTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCB0ZXh0dXJlID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIFRleHR1cmVOb2RlICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAxLCA0ICk7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIHRleHR1cmUgbm9kZSB0aGF0IGZldGNoZXMvbG9hZHMgdGV4ZWxzIHdpdGhvdXQgaW50ZXJwb2xhdGlvbi5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtUZXh0dXJlfSB2YWx1ZSAtIFRoZSB0ZXh0dXJlLlxyXG4gKiBAcGFyYW0gez9Ob2RlPHZlYzJ8dmVjMz59IFt1dk5vZGU9bnVsbF0gLSBUaGUgdXYgbm9kZS5cclxuICogQHBhcmFtIHs/Tm9kZTxpbnQ+fSBbbGV2ZWxOb2RlPW51bGxdIC0gVGhlIGxldmVsIG5vZGUuXHJcbiAqIEBwYXJhbSB7P05vZGU8ZmxvYXQ+fSBbYmlhc05vZGU9bnVsbF0gLSBUaGUgYmlhcyBub2RlLlxyXG4gKiBAcmV0dXJucyB7VGV4dHVyZU5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdGV4dHVyZUxvYWQgPSAoIC4uLnBhcmFtcyApID0+IHRleHR1cmUoIC4uLnBhcmFtcyApLnNldFNhbXBsZXIoIGZhbHNlICk7XHJcblxyXG4vL2V4cG9ydCBjb25zdCB0ZXh0dXJlTGV2ZWwgPSAoIHZhbHVlLCB1diwgbGV2ZWwgKSA9PiB0ZXh0dXJlKCB2YWx1ZSwgdXYgKS5sZXZlbCggbGV2ZWwgKTtcclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyBhIHRleHR1cmUgb3IgdGV4dHVyZSBub2RlIHRvIGEgc2FtcGxlci5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtUZXh0dXJlTm9kZXxUZXh0dXJlfSB2YWx1ZSAtIFRoZSB0ZXh0dXJlIG9yIHRleHR1cmUgbm9kZSB0byBjb252ZXJ0LlxyXG4gKiBAcmV0dXJucyB7Tm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBzYW1wbGVyID0gKCB2YWx1ZSApID0+ICggdmFsdWUuaXNOb2RlID09PSB0cnVlID8gdmFsdWUgOiB0ZXh0dXJlKCB2YWx1ZSApICkuY29udmVydCggJ3NhbXBsZXInICk7XHJcblxyXG4vKipcclxuICogQ29udmVydHMgYSB0ZXh0dXJlIG9yIHRleHR1cmUgbm9kZSB0byBhIHNhbXBsZXIgY29tcGFyaXNvbi5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtUZXh0dXJlTm9kZXxUZXh0dXJlfSB2YWx1ZSAtIFRoZSB0ZXh0dXJlIG9yIHRleHR1cmUgbm9kZSB0byBjb252ZXJ0LlxyXG4gKiBAcmV0dXJucyB7Tm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBzYW1wbGVyQ29tcGFyaXNvbiA9ICggdmFsdWUgKSA9PiAoIHZhbHVlLmlzTm9kZSA9PT0gdHJ1ZSA/IHZhbHVlIDogdGV4dHVyZSggdmFsdWUgKSApLmNvbnZlcnQoICdzYW1wbGVyQ29tcGFyaXNvbicgKTtcclxuIiwiaW1wb3J0IFVuaWZvcm1Ob2RlIGZyb20gJy4uL2NvcmUvVW5pZm9ybU5vZGUuanMnO1xyXG5pbXBvcnQgeyBub2RlT2JqZWN0IH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgc3BlY2lhbCB0eXBlIG9mIHVuaWZvcm0gbm9kZSB3aGljaCByZXByZXNlbnRzIGFycmF5LWxpa2UgZGF0YVxyXG4gKiBhcyB1bmlmb3JtIGJ1ZmZlcnMuIFRoZSBhY2Nlc3MgdXN1YWxseSBoYXBwZW5zIHZpYSBgZWxlbWVudCgpYFxyXG4gKiB3aGljaCByZXR1cm5zIGFuIGluc3RhbmNlIG9mIHtAbGluayBBcnJheUVsZW1lbnROb2RlfS4gRm9yIGV4YW1wbGU6XHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGJ1ZmZlck5vZGUgPSBidWZmZXIoIGFycmF5LCAnbWF0NCcsIGNvdW50ICk7XHJcbiAqIGNvbnN0IG1hdHJpeE5vZGUgPSBidWZmZXJOb2RlLmVsZW1lbnQoIGluZGV4ICk7IC8vIGFjY2VzcyBhIG1hdHJpeCBmcm9tIHRoZSBidWZmZXJcclxuICogYGBgXHJcbiAqIEluIGdlbmVyYWwsIGl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgbW9yZSBtYW5hZ2VkIHtAbGluayBVbmlmb3JtQXJyYXlOb2RlfVxyXG4gKiBzaW5jZSBpdCBoYW5kbGVzIG1vcmUgaW5wdXQgdHlwZXMgYW5kIGF1dG9tYXRpY2FsbHkgY2FyZXMgYWJvdXQgYnVmZmVyIHBhZGRpbmdzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgVW5pZm9ybU5vZGVcclxuICovXHJcbmNsYXNzIEJ1ZmZlck5vZGUgZXh0ZW5kcyBVbmlmb3JtTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ0J1ZmZlck5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYnVmZmVyIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IHZhbHVlIC0gQXJyYXktbGlrZSBidWZmZXIgZGF0YS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gYnVmZmVyVHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGJ1ZmZlci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2J1ZmZlckNvdW50PTBdIC0gVGhlIGNvdW50IG9mIGJ1ZmZlciBlbGVtZW50cy5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggdmFsdWUsIGJ1ZmZlclR5cGUsIGJ1ZmZlckNvdW50ID0gMCApIHtcclxuXHJcblx0XHRzdXBlciggdmFsdWUsIGJ1ZmZlclR5cGUgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNCdWZmZXJOb2RlID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGJ1ZmZlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJ1ZmZlclR5cGUgPSBidWZmZXJUeXBlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHVuaWZvcm0gbm9kZSB0aGF0IGhvbGRzIHRoZSB2YWx1ZSBvZiB0aGUgcmVmZXJlbmNlIG5vZGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5idWZmZXJDb3VudCA9IGJ1ZmZlckNvdW50O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGJ1ZmZlciBlbGVtZW50cy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgZWxlbWVudCB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldEVsZW1lbnRUeXBlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmdldE5vZGVUeXBlKCBidWlsZGVyICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogT3ZlcndyaXRlcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byByZXR1cm4gYSBmaXhlZCB2YWx1ZSBgJ2J1ZmZlcidgLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBpbnB1dCB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldElucHV0VHlwZSggLypidWlsZGVyKi8gKSB7XHJcblxyXG5cdFx0cmV0dXJuICdidWZmZXInO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBCdWZmZXJOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSBidWZmZXIgbm9kZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtBcnJheX0gdmFsdWUgLSBBcnJheS1saWtlIGJ1ZmZlciBkYXRhLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgYSBidWZmZXIgZWxlbWVudC5cclxuICogQHBhcmFtIHtudW1iZXJ9IGNvdW50IC0gVGhlIGNvdW50IG9mIGJ1ZmZlciBlbGVtZW50cy5cclxuICogQHJldHVybnMge0J1ZmZlck5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYnVmZmVyID0gKCB2YWx1ZSwgdHlwZSwgY291bnQgKSA9PiBub2RlT2JqZWN0KCBuZXcgQnVmZmVyTm9kZSggdmFsdWUsIHR5cGUsIGNvdW50ICkgKTtcclxuIiwiaW1wb3J0IHsgbm9kZU9iamVjdCB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuaW1wb3J0IHsgTm9kZVVwZGF0ZVR5cGUgfSBmcm9tICcuLi9jb3JlL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IGdldFZhbHVlVHlwZSB9IGZyb20gJy4uL2NvcmUvTm9kZVV0aWxzLmpzJztcclxuaW1wb3J0IEFycmF5RWxlbWVudE5vZGUgZnJvbSAnLi4vdXRpbHMvQXJyYXlFbGVtZW50Tm9kZS5qcyc7XHJcbmltcG9ydCBCdWZmZXJOb2RlIGZyb20gJy4vQnVmZmVyTm9kZS5qcyc7XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyB0aGUgZWxlbWVudCBhY2Nlc3Mgb24gdW5pZm9ybSBhcnJheSBub2Rlcy5cclxuICpcclxuICogQGF1Z21lbnRzIEFycmF5RWxlbWVudE5vZGVcclxuICovXHJcbmNsYXNzIFVuaWZvcm1BcnJheUVsZW1lbnROb2RlIGV4dGVuZHMgQXJyYXlFbGVtZW50Tm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ1VuaWZvcm1BcnJheUVsZW1lbnROb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGJ1ZmZlciBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtVbmlmb3JtQXJyYXlOb2RlfSB1bmlmb3JtQXJyYXlOb2RlIC0gVGhlIHVuaWZvcm0gYXJyYXkgbm9kZSB0byBhY2Nlc3MuXHJcblx0ICogQHBhcmFtIHtJbmRleE5vZGV9IGluZGV4Tm9kZSAtIFRoZSBpbmRleCBkYXRhIHRoYXQgZGVmaW5lIHRoZSBwb3NpdGlvbiBvZiB0aGUgYWNjZXNzZWQgZWxlbWVudCBpbiB0aGUgYXJyYXkuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHVuaWZvcm1BcnJheU5vZGUsIGluZGV4Tm9kZSApIHtcclxuXHJcblx0XHRzdXBlciggdW5pZm9ybUFycmF5Tm9kZSwgaW5kZXhOb2RlICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzQXJyYXlCdWZmZXJFbGVtZW50Tm9kZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0Z2VuZXJhdGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3Qgc25pcHBldCA9IHN1cGVyLmdlbmVyYXRlKCBidWlsZGVyICk7XHJcblx0XHRjb25zdCB0eXBlID0gdGhpcy5nZXROb2RlVHlwZSgpO1xyXG5cdFx0Y29uc3QgcGFkZGVkVHlwZSA9IHRoaXMubm9kZS5nZXRQYWRkZWRUeXBlKCk7XHJcblxyXG5cdFx0cmV0dXJuIGJ1aWxkZXIuZm9ybWF0KCBzbmlwcGV0LCBwYWRkZWRUeXBlLCB0eXBlICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTaW1pbGFyIHRvIHtAbGluayBCdWZmZXJOb2RlfSB0aGlzIG1vZHVsZSByZXByZXNlbnRzIGFycmF5LWxpa2UgZGF0YSBhc1xyXG4gKiB1bmlmb3JtIGJ1ZmZlcnMuIFVubGlrZSB7QGxpbmsgQnVmZmVyTm9kZX0sIGl0IGNhbiBoYW5kbGUgbW9yZSBjb21tb25cclxuICogZGF0YSB0eXBlcyBpbiB0aGUgYXJyYXkgKGUuZyBgdGhyZWUuanNgIHByaW1pdGl2ZXMpIGFuZCBhdXRvbWF0aWNhbGx5XHJcbiAqIG1hbmFnZSBidWZmZXIgcGFkZGluZy4gSXQgc2hvdWxkIGJlIHRoZSBmaXJzdCBjaG9pY2Ugd2hlbiB3b3JraW5nIHdpdGhcclxuICogdW5pZm9ybXMgYnVmZmVycy5cclxuICogYGBganNcclxuICogY29uc3QgdGludENvbG9ycyA9IHVuaWZvcm1BcnJheSggW1xyXG4gKiBcdG5ldyBDb2xvciggMSwgMCwgMCApLFxyXG4gKiBcdG5ldyBDb2xvciggMCwgMSwgMCApLFxyXG4gKiBcdG5ldyBDb2xvciggMCwgMCwgMSApXHJcbiAqIF0sICdjb2xvcicgKTtcclxuICpcclxuICogY29uc3QgcmVkQ29sb3IgPSB0aW50Q29sb3JzLmVsZW1lbnQoIDAgKTtcclxuICpcclxuICogQGF1Z21lbnRzIEJ1ZmZlck5vZGVcclxuICovXHJcbmNsYXNzIFVuaWZvcm1BcnJheU5vZGUgZXh0ZW5kcyBCdWZmZXJOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnVW5pZm9ybUFycmF5Tm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB1bmlmb3JtIGFycmF5IG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PGFueT59IHZhbHVlIC0gQXJyYXkgaG9sZGluZyB0aGUgYnVmZmVyIGRhdGEuXHJcblx0ICogQHBhcmFtIHs/c3RyaW5nfSBbZWxlbWVudFR5cGU9bnVsbF0gLSBUaGUgZGF0YSB0eXBlIG9mIGEgYnVmZmVyIGVsZW1lbnQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHZhbHVlLCBlbGVtZW50VHlwZSA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG51bGwgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFycmF5IGhvbGRpbmcgdGhlIGJ1ZmZlciBkYXRhLiBVbmxpa2Uge0BsaW5rIEJ1ZmZlck5vZGV9LCB0aGUgYXJyYXkgY2FuXHJcblx0XHQgKiBob2xkIG51bWJlciBwcmltaXRpdmVzIGFzIHdlbGwgYXMgdGhyZWUuanMgb2JqZWN0cyBsaWtlIHZlY3RvcnMsIG1hdHJpY2VzXHJcblx0XHQgKiBvciBjb2xvcnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PGFueT59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYXJyYXkgPSB2YWx1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBkYXRhIHR5cGUgb2YgYW4gYXJyYXkgZWxlbWVudC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmVsZW1lbnRUeXBlID0gZWxlbWVudFR5cGUgPT09IG51bGwgPyBnZXRWYWx1ZVR5cGUoIHZhbHVlWyAwIF0gKSA6IGVsZW1lbnRUeXBlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHBhZGRlZCB0eXBlLiBVbmlmb3JtIGJ1ZmZlcnMgbXVzdCBjb25mb3JtIHRvIGEgY2VydGFpbiBidWZmZXIgbGF5b3V0XHJcblx0XHQgKiBzbyBhIHNlcGFyYXRlIHR5cGUgaXMgY29tcHV0ZWQgdG8gZW5zdXJlIGNvcnJlY3QgYnVmZmVyIHNpemUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wYWRkZWRUeXBlID0gdGhpcy5nZXRQYWRkZWRUeXBlKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBPdmVyd3JpdHRlbiBzaW5jZSB1bmlmb3JtIGFycmF5IG5vZGVzIGFyZSB1cGRhdGVkIHBlciByZW5kZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqIEBkZWZhdWx0ICdyZW5kZXInXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXBkYXRlVHlwZSA9IE5vZGVVcGRhdGVUeXBlLlJFTkRFUjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNBcnJheUJ1ZmZlck5vZGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGlzIG92ZXJ3cml0dGVuIHNpbmNlIHRoZSBub2RlIHR5cGUgaXMgaW5mZXJyZWQgZnJvbSB0aGVcclxuXHQgKiB7QGxpbmsgVW5pZm9ybUFycmF5Tm9kZSNwYWRkZWRUeXBlfS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgbm9kZSB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldE5vZGVUeXBlKCAvKmJ1aWxkZXIqLyApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5wYWRkZWRUeXBlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGFycmF5IGVsZW1lbnRzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBlbGVtZW50IHR5cGUuXHJcblx0ICovXHJcblx0Z2V0RWxlbWVudFR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZWxlbWVudFR5cGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgcGFkZGVkIHR5cGUgYmFzZWQgb24gdGhlIGVsZW1lbnQgdHlwZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHBhZGRlZCB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldFBhZGRlZFR5cGUoKSB7XHJcblxyXG5cdFx0Y29uc3QgZWxlbWVudFR5cGUgPSB0aGlzLmVsZW1lbnRUeXBlO1xyXG5cclxuXHRcdGxldCBwYWRkZWRUeXBlID0gJ3ZlYzQnO1xyXG5cclxuXHRcdGlmICggZWxlbWVudFR5cGUgPT09ICdtYXQyJyApIHtcclxuXHJcblx0XHRcdHBhZGRlZFR5cGUgPSAnbWF0Mic7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggL21hdC8udGVzdCggZWxlbWVudFR5cGUgKSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdHBhZGRlZFR5cGUgPSAnbWF0NCc7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggZWxlbWVudFR5cGUuY2hhckF0KCAwICkgPT09ICdpJyApIHtcclxuXHJcblx0XHRcdHBhZGRlZFR5cGUgPSAnaXZlYzQnO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGVsZW1lbnRUeXBlLmNoYXJBdCggMCApID09PSAndScgKSB7XHJcblxyXG5cdFx0XHRwYWRkZWRUeXBlID0gJ3V2ZWM0JztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHBhZGRlZFR5cGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIHVwZGF0ZSBtYWtlcyBzdXJlIHRvIGNvcnJlY3RseSB0cmFuc2ZlciB0aGUgZGF0YSBmcm9tIHRoZSAoY29tcGxleCkgb2JqZWN0c1xyXG5cdCAqIGluIHRoZSBhcnJheSB0byB0aGUgaW50ZXJuYWwsIGNvcnJlY3RseSBwYWRkZWQgdmFsdWUgYnVmZmVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlRnJhbWV9IGZyYW1lIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgbm9kZSBmcmFtZS5cclxuXHQgKi9cclxuXHR1cGRhdGUoIC8qZnJhbWUqLyApIHtcclxuXHJcblx0XHRjb25zdCB7IGFycmF5LCB2YWx1ZSB9ID0gdGhpcztcclxuXHJcblx0XHRjb25zdCBlbGVtZW50VHlwZSA9IHRoaXMuZWxlbWVudFR5cGU7XHJcblxyXG5cdFx0aWYgKCBlbGVtZW50VHlwZSA9PT0gJ2Zsb2F0JyB8fCBlbGVtZW50VHlwZSA9PT0gJ2ludCcgfHwgZWxlbWVudFR5cGUgPT09ICd1aW50JyApIHtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgaW5kZXggPSBpICogNDtcclxuXHJcblx0XHRcdFx0dmFsdWVbIGluZGV4IF0gPSBhcnJheVsgaSBdO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGVsZW1lbnRUeXBlID09PSAnY29sb3InICkge1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBpbmRleCA9IGkgKiA0O1xyXG5cdFx0XHRcdGNvbnN0IHZlY3RvciA9IGFycmF5WyBpIF07XHJcblxyXG5cdFx0XHRcdHZhbHVlWyBpbmRleCBdID0gdmVjdG9yLnI7XHJcblx0XHRcdFx0dmFsdWVbIGluZGV4ICsgMSBdID0gdmVjdG9yLmc7XHJcblx0XHRcdFx0dmFsdWVbIGluZGV4ICsgMiBdID0gdmVjdG9yLmIgfHwgMDtcclxuXHRcdFx0XHQvL3ZhbHVlWyBpbmRleCArIDMgXSA9IHZlY3Rvci5hIHx8IDA7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmICggZWxlbWVudFR5cGUgPT09ICdtYXQyJyApIHtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgaW5kZXggPSBpICogNDtcclxuXHRcdFx0XHRjb25zdCBtYXRyaXggPSBhcnJheVsgaSBdO1xyXG5cclxuXHRcdFx0XHR2YWx1ZVsgaW5kZXggXSA9IG1hdHJpeC5lbGVtZW50c1sgMCBdO1xyXG5cdFx0XHRcdHZhbHVlWyBpbmRleCArIDEgXSA9IG1hdHJpeC5lbGVtZW50c1sgMSBdO1xyXG5cdFx0XHRcdHZhbHVlWyBpbmRleCArIDIgXSA9IG1hdHJpeC5lbGVtZW50c1sgMiBdO1xyXG5cdFx0XHRcdHZhbHVlWyBpbmRleCArIDMgXSA9IG1hdHJpeC5lbGVtZW50c1sgMyBdO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGVsZW1lbnRUeXBlID09PSAnbWF0MycgKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGluZGV4ID0gaSAqIDE2O1xyXG5cdFx0XHRcdGNvbnN0IG1hdHJpeCA9IGFycmF5WyBpIF07XHJcblxyXG5cdFx0XHRcdHZhbHVlWyBpbmRleCBdID0gbWF0cml4LmVsZW1lbnRzWyAwIF07XHJcblx0XHRcdFx0dmFsdWVbIGluZGV4ICsgMSBdID0gbWF0cml4LmVsZW1lbnRzWyAxIF07XHJcblx0XHRcdFx0dmFsdWVbIGluZGV4ICsgMiBdID0gbWF0cml4LmVsZW1lbnRzWyAyIF07XHJcblxyXG5cdFx0XHRcdHZhbHVlWyBpbmRleCArIDQgXSA9IG1hdHJpeC5lbGVtZW50c1sgMyBdO1xyXG5cdFx0XHRcdHZhbHVlWyBpbmRleCArIDUgXSA9IG1hdHJpeC5lbGVtZW50c1sgNCBdO1xyXG5cdFx0XHRcdHZhbHVlWyBpbmRleCArIDYgXSA9IG1hdHJpeC5lbGVtZW50c1sgNSBdO1xyXG5cclxuXHRcdFx0XHR2YWx1ZVsgaW5kZXggKyA4IF0gPSBtYXRyaXguZWxlbWVudHNbIDYgXTtcclxuXHRcdFx0XHR2YWx1ZVsgaW5kZXggKyA5IF0gPSBtYXRyaXguZWxlbWVudHNbIDcgXTtcclxuXHRcdFx0XHR2YWx1ZVsgaW5kZXggKyAxMCBdID0gbWF0cml4LmVsZW1lbnRzWyA4IF07XHJcblxyXG5cdFx0XHRcdHZhbHVlWyBpbmRleCArIDE1IF0gPSAxO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGVsZW1lbnRUeXBlID09PSAnbWF0NCcgKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGluZGV4ID0gaSAqIDE2O1xyXG5cdFx0XHRcdGNvbnN0IG1hdHJpeCA9IGFycmF5WyBpIF07XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IG1hdHJpeC5lbGVtZW50cy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0dmFsdWVbIGluZGV4ICsgaSBdID0gbWF0cml4LmVsZW1lbnRzWyBpIF07XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBpbmRleCA9IGkgKiA0O1xyXG5cdFx0XHRcdGNvbnN0IHZlY3RvciA9IGFycmF5WyBpIF07XHJcblxyXG5cdFx0XHRcdHZhbHVlWyBpbmRleCBdID0gdmVjdG9yLng7XHJcblx0XHRcdFx0dmFsdWVbIGluZGV4ICsgMSBdID0gdmVjdG9yLnk7XHJcblx0XHRcdFx0dmFsdWVbIGluZGV4ICsgMiBdID0gdmVjdG9yLnogfHwgMDtcclxuXHRcdFx0XHR2YWx1ZVsgaW5kZXggKyAzIF0gPSB2ZWN0b3IudyB8fCAwO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJbXBsZW1lbnQgdGhlIHZhbHVlIGJ1ZmZlciBjcmVhdGlvbiBiYXNlZCBvbiB0aGUgYXJyYXkgZGF0YS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7bnVsbH1cclxuXHQgKi9cclxuXHRzZXR1cCggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCBsZW5ndGggPSB0aGlzLmFycmF5Lmxlbmd0aDtcclxuXHRcdGNvbnN0IGVsZW1lbnRUeXBlID0gdGhpcy5lbGVtZW50VHlwZTtcclxuXHJcblx0XHRsZXQgYXJyYXlUeXBlID0gRmxvYXQzMkFycmF5O1xyXG5cclxuXHRcdGNvbnN0IHBhZGRlZFR5cGUgPSB0aGlzLnBhZGRlZFR5cGU7XHJcblx0XHRjb25zdCBwYWRkZWRFbGVtZW50TGVuZ3RoID0gYnVpbGRlci5nZXRUeXBlTGVuZ3RoKCBwYWRkZWRUeXBlICk7XHJcblxyXG5cdFx0aWYgKCBlbGVtZW50VHlwZS5jaGFyQXQoIDAgKSA9PT0gJ2knICkgYXJyYXlUeXBlID0gSW50MzJBcnJheTtcclxuXHRcdGlmICggZWxlbWVudFR5cGUuY2hhckF0KCAwICkgPT09ICd1JyApIGFycmF5VHlwZSA9IFVpbnQzMkFycmF5O1xyXG5cclxuXHRcdHRoaXMudmFsdWUgPSBuZXcgYXJyYXlUeXBlKCBsZW5ndGggKiBwYWRkZWRFbGVtZW50TGVuZ3RoICk7XHJcblx0XHR0aGlzLmJ1ZmZlckNvdW50ID0gbGVuZ3RoO1xyXG5cdFx0dGhpcy5idWZmZXJUeXBlID0gcGFkZGVkVHlwZTtcclxuXHJcblx0XHRyZXR1cm4gc3VwZXIuc2V0dXAoIGJ1aWxkZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBPdmVyd3JpdGVzIHRoZSBkZWZhdWx0IGBlbGVtZW50KClgIG1ldGhvZCB0byBwcm92aWRlIGVsZW1lbnQgYWNjZXNzXHJcblx0ICogYmFzZWQgb24ge0BsaW5rIFVuaWZvcm1BcnJheU5vZGV9LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtJbmRleE5vZGV9IGluZGV4Tm9kZSAtIFRoZSBpbmRleCBub2RlLlxyXG5cdCAqIEByZXR1cm4ge1VuaWZvcm1BcnJheUVsZW1lbnROb2RlfVxyXG5cdCAqL1xyXG5cdGVsZW1lbnQoIGluZGV4Tm9kZSApIHtcclxuXHJcblx0XHRyZXR1cm4gbm9kZU9iamVjdCggbmV3IFVuaWZvcm1BcnJheUVsZW1lbnROb2RlKCB0aGlzLCBub2RlT2JqZWN0KCBpbmRleE5vZGUgKSApICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFVuaWZvcm1BcnJheU5vZGU7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhbiB1bmlmb3JtIGFycmF5IG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7QXJyYXk8YW55Pn0gdmFsdWVzIC0gQXJyYXktbGlrZSBkYXRhLlxyXG4gKiBAcGFyYW0gez9zdHJpbmd9IFtub2RlVHlwZV0gLSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBhcnJheSBlbGVtZW50cy5cclxuICogQHJldHVybnMge1VuaWZvcm1BcnJheU5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdW5pZm9ybUFycmF5ID0gKCB2YWx1ZXMsIG5vZGVUeXBlICkgPT4gbm9kZU9iamVjdCggbmV3IFVuaWZvcm1BcnJheU5vZGUoIHZhbHVlcywgbm9kZVR5cGUgKSApO1xyXG5cclxuLyoqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBkZXByZWNhdGVkIHNpbmNlIHIxNjguIFVzZSB7QGxpbmsgdW5pZm9ybUFycmF5fSBpbnN0ZWFkLlxyXG4gKlxyXG4gKiBAcGFyYW0ge0FycmF5PGFueT59IHZhbHVlcyAtIEFycmF5LWxpa2UgZGF0YS5cclxuICogQHBhcmFtIHtzdHJpbmd9IG5vZGVUeXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUgYXJyYXkgZWxlbWVudHMuXHJcbiAqIEByZXR1cm5zIHtVbmlmb3JtQXJyYXlOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHVuaWZvcm1zID0gKCB2YWx1ZXMsIG5vZGVUeXBlICkgPT4geyAvLyBAZGVwcmVjYXRlZCwgcjE2OFxyXG5cclxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5UU0w6IHVuaWZvcm1zKCkgaGFzIGJlZW4gcmVuYW1lZCB0byB1bmlmb3JtQXJyYXkoKS4nICk7XHJcblx0cmV0dXJuIG5vZGVPYmplY3QoIG5ldyBVbmlmb3JtQXJyYXlOb2RlKCB2YWx1ZXMsIG5vZGVUeXBlICkgKTtcclxuXHJcbn07XHJcbiIsImltcG9ydCB7IHVuaWZvcm0gfSBmcm9tICcuLi9jb3JlL1VuaWZvcm1Ob2RlLmpzJztcclxuaW1wb3J0IHsgcmVuZGVyR3JvdXAsIHNoYXJlZFVuaWZvcm1Hcm91cCB9IGZyb20gJy4uL2NvcmUvVW5pZm9ybUdyb3VwTm9kZS5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBGbiB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuaW1wb3J0IHsgdW5pZm9ybUFycmF5IH0gZnJvbSAnLi9Vbmlmb3JtQXJyYXlOb2RlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgY3VycmVudCBgaW5kZXhgIHZhbHVlIG9mIHRoZSBjYW1lcmEgaWYgdXNlZCBBcnJheUNhbWVyYS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7VW5pZm9ybU5vZGU8dWludD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgY2FtZXJhSW5kZXggPSAvKkBfX1BVUkVfXyovIHVuaWZvcm0oIDAsICd1aW50JyApLnNldEdyb3VwKCBzaGFyZWRVbmlmb3JtR3JvdXAoICdjYW1lcmFJbmRleCcgKSApLnRvVmFyeWluZyggJ3ZfY2FtZXJhSW5kZXgnICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGBuZWFyYCB2YWx1ZSBvZiB0aGUgY2FtZXJhIHVzZWQgZm9yIHRoZSBjdXJyZW50IHJlbmRlci5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7VW5pZm9ybU5vZGU8ZmxvYXQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGNhbWVyYU5lYXIgPSAvKkBfX1BVUkVfXyovIHVuaWZvcm0oICdmbG9hdCcgKS5sYWJlbCggJ2NhbWVyYU5lYXInICkuc2V0R3JvdXAoIHJlbmRlckdyb3VwICkub25SZW5kZXJVcGRhdGUoICggeyBjYW1lcmEgfSApID0+IGNhbWVyYS5uZWFyICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGBmYXJgIHZhbHVlIG9mIHRoZSBjYW1lcmEgdXNlZCBmb3IgdGhlIGN1cnJlbnQgcmVuZGVyLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtVbmlmb3JtTm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgY2FtZXJhRmFyID0gLypAX19QVVJFX18qLyB1bmlmb3JtKCAnZmxvYXQnICkubGFiZWwoICdjYW1lcmFGYXInICkuc2V0R3JvdXAoIHJlbmRlckdyb3VwICkub25SZW5kZXJVcGRhdGUoICggeyBjYW1lcmEgfSApID0+IGNhbWVyYS5mYXIgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgcHJvamVjdGlvbiBtYXRyaXggb2YgdGhlIGNhbWVyYSB1c2VkIGZvciB0aGUgY3VycmVudCByZW5kZXIuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1VuaWZvcm1Ob2RlPG1hdDQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGNhbWVyYVByb2plY3Rpb25NYXRyaXggPSAvKkBfX1BVUkVfXyovICggRm4oICggeyBjYW1lcmEgfSApID0+IHtcclxuXHJcblx0bGV0IGNhbWVyYVByb2plY3Rpb25NYXRyaXg7XHJcblxyXG5cdGlmICggY2FtZXJhLmlzQXJyYXlDYW1lcmEgJiYgY2FtZXJhLmNhbWVyYXMubGVuZ3RoID4gMCApIHtcclxuXHJcblx0XHRjb25zdCBtYXRyaWNlcyA9IFtdO1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IHN1YkNhbWVyYSBvZiBjYW1lcmEuY2FtZXJhcyApIHtcclxuXHJcblx0XHRcdG1hdHJpY2VzLnB1c2goIHN1YkNhbWVyYS5wcm9qZWN0aW9uTWF0cml4ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGNhbWVyYVByb2plY3Rpb25NYXRyaWNlcyA9IHVuaWZvcm1BcnJheSggbWF0cmljZXMgKS5zZXRHcm91cCggcmVuZGVyR3JvdXAgKS5sYWJlbCggJ2NhbWVyYVByb2plY3Rpb25NYXRyaWNlcycgKTtcclxuXHJcblx0XHRjYW1lcmFQcm9qZWN0aW9uTWF0cml4ID0gY2FtZXJhUHJvamVjdGlvbk1hdHJpY2VzLmVsZW1lbnQoIGNhbWVyYUluZGV4ICkudG9WYXIoICdjYW1lcmFQcm9qZWN0aW9uTWF0cml4JyApO1xyXG5cclxuXHR9IGVsc2Uge1xyXG5cclxuXHRcdGNhbWVyYVByb2plY3Rpb25NYXRyaXggPSB1bmlmb3JtKCAnbWF0NCcgKS5sYWJlbCggJ2NhbWVyYVByb2plY3Rpb25NYXRyaXgnICkuc2V0R3JvdXAoIHJlbmRlckdyb3VwICkub25SZW5kZXJVcGRhdGUoICggeyBjYW1lcmEgfSApID0+IGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4ICk7XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIGNhbWVyYVByb2plY3Rpb25NYXRyaXg7XHJcblxyXG59ICkub25jZSgpICkoKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgaW52ZXJzZSBwcm9qZWN0aW9uIG1hdHJpeCBvZiB0aGUgY2FtZXJhIHVzZWQgZm9yIHRoZSBjdXJyZW50IHJlbmRlci5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7VW5pZm9ybU5vZGU8bWF0ND59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgY2FtZXJhUHJvamVjdGlvbk1hdHJpeEludmVyc2UgPSAvKkBfX1BVUkVfXyovIHVuaWZvcm0oICdtYXQ0JyApLmxhYmVsKCAnY2FtZXJhUHJvamVjdGlvbk1hdHJpeEludmVyc2UnICkuc2V0R3JvdXAoIHJlbmRlckdyb3VwICkub25SZW5kZXJVcGRhdGUoICggeyBjYW1lcmEgfSApID0+IGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSB2aWV3IG1hdHJpeCBvZiB0aGUgY2FtZXJhIHVzZWQgZm9yIHRoZSBjdXJyZW50IHJlbmRlci5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7VW5pZm9ybU5vZGU8bWF0ND59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgY2FtZXJhVmlld01hdHJpeCA9IC8qQF9fUFVSRV9fKi8gKCBGbiggKCB7IGNhbWVyYSB9ICkgPT4ge1xyXG5cclxuXHRsZXQgY2FtZXJhVmlld01hdHJpeDtcclxuXHJcblx0aWYgKCBjYW1lcmEuaXNBcnJheUNhbWVyYSAmJiBjYW1lcmEuY2FtZXJhcy5sZW5ndGggPiAwICkge1xyXG5cclxuXHRcdGNvbnN0IG1hdHJpY2VzID0gW107XHJcblxyXG5cdFx0Zm9yICggY29uc3Qgc3ViQ2FtZXJhIG9mIGNhbWVyYS5jYW1lcmFzICkge1xyXG5cclxuXHRcdFx0bWF0cmljZXMucHVzaCggc3ViQ2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBjYW1lcmFWaWV3TWF0cmljZXMgPSB1bmlmb3JtQXJyYXkoIG1hdHJpY2VzICkuc2V0R3JvdXAoIHJlbmRlckdyb3VwICkubGFiZWwoICdjYW1lcmFWaWV3TWF0cmljZXMnICk7XHJcblxyXG5cdFx0Y2FtZXJhVmlld01hdHJpeCA9IGNhbWVyYVZpZXdNYXRyaWNlcy5lbGVtZW50KCBjYW1lcmFJbmRleCApLnRvVmFyKCAnY2FtZXJhVmlld01hdHJpeCcgKTtcclxuXHJcblx0fSBlbHNlIHtcclxuXHJcblx0XHRjYW1lcmFWaWV3TWF0cml4ID0gdW5pZm9ybSggJ21hdDQnICkubGFiZWwoICdjYW1lcmFWaWV3TWF0cml4JyApLnNldEdyb3VwKCByZW5kZXJHcm91cCApLm9uUmVuZGVyVXBkYXRlKCAoIHsgY2FtZXJhIH0gKSA9PiBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlICk7XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIGNhbWVyYVZpZXdNYXRyaXg7XHJcblxyXG59ICkub25jZSgpICkoKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgd29ybGQgbWF0cml4IG9mIHRoZSBjYW1lcmEgdXNlZCBmb3IgdGhlIGN1cnJlbnQgcmVuZGVyLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtVbmlmb3JtTm9kZTxtYXQ0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBjYW1lcmFXb3JsZE1hdHJpeCA9IC8qQF9fUFVSRV9fKi8gdW5pZm9ybSggJ21hdDQnICkubGFiZWwoICdjYW1lcmFXb3JsZE1hdHJpeCcgKS5zZXRHcm91cCggcmVuZGVyR3JvdXAgKS5vblJlbmRlclVwZGF0ZSggKCB7IGNhbWVyYSB9ICkgPT4gY2FtZXJhLm1hdHJpeFdvcmxkICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIG5vcm1hbCBtYXRyaXggb2YgdGhlIGNhbWVyYSB1c2VkIGZvciB0aGUgY3VycmVudCByZW5kZXIuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1VuaWZvcm1Ob2RlPG1hdDM+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGNhbWVyYU5vcm1hbE1hdHJpeCA9IC8qQF9fUFVSRV9fKi8gdW5pZm9ybSggJ21hdDMnICkubGFiZWwoICdjYW1lcmFOb3JtYWxNYXRyaXgnICkuc2V0R3JvdXAoIHJlbmRlckdyb3VwICkub25SZW5kZXJVcGRhdGUoICggeyBjYW1lcmEgfSApID0+IGNhbWVyYS5ub3JtYWxNYXRyaXggKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgcG9zaXRpb24gaW4gd29ybGQgc3BhY2Ugb2YgdGhlIGNhbWVyYSB1c2VkIGZvciB0aGUgY3VycmVudCByZW5kZXIuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1VuaWZvcm1Ob2RlPHZlYzM+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGNhbWVyYVBvc2l0aW9uID0gLypAX19QVVJFX18qLyB1bmlmb3JtKCBuZXcgVmVjdG9yMygpICkubGFiZWwoICdjYW1lcmFQb3NpdGlvbicgKS5zZXRHcm91cCggcmVuZGVyR3JvdXAgKS5vblJlbmRlclVwZGF0ZSggKCB7IGNhbWVyYSB9LCBzZWxmICkgPT4gc2VsZi52YWx1ZS5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGNhbWVyYS5tYXRyaXhXb3JsZCApICk7XHJcbiIsImltcG9ydCBOb2RlIGZyb20gJy4uL2NvcmUvTm9kZS5qcyc7XHJcbmltcG9ydCB7IE5vZGVVcGRhdGVUeXBlIH0gZnJvbSAnLi4vY29yZS9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgVW5pZm9ybU5vZGUgZnJvbSAnLi4vY29yZS9Vbmlmb3JtTm9kZS5qcyc7XHJcbmltcG9ydCB7IG5vZGVQcm94eSB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcbmltcG9ydCB7IFNwaGVyZSB9IGZyb20gJy4uLy4uL21hdGgvU3BoZXJlLmpzJztcclxuXHJcbmNvbnN0IF9zcGhlcmUgPSAvKkBfX1BVUkVfXyovIG5ldyBTcGhlcmUoKTtcclxuXHJcbi8qKlxyXG4gKiBUaGlzIG5vZGUgY2FuIGJlIHVzZWQgdG8gYWNjZXNzIHRyYW5zZm9ybWF0aW9uIHJlbGF0ZWQgbWV0cmljcyBvZiAzRCBvYmplY3RzLlxyXG4gKiBEZXBlbmRpbmcgb24gdGhlIHNlbGVjdGVkIHNjb3BlLCBhIGRpZmZlcmVudCBtZXRyaWMgaXMgcmVwcmVzZW50ZWQgYXMgYSB1bmlmb3JtXHJcbiAqIGluIHRoZSBzaGFkZXIuIFRoZSBmb2xsb3dpbmcgc2NvcGVzIGFyZSBzdXBwb3J0ZWQ6XHJcbiAqXHJcbiAqIC0gYFBPU0lUSU9OYDogVGhlIG9iamVjdCdzIHBvc2l0aW9uIGluIHdvcmxkIHNwYWNlLlxyXG4gKiAtIGBWSUVXX1BPU0lUSU9OYDogVGhlIG9iamVjdCdzIHBvc2l0aW9uIGluIHZpZXcvY2FtZXJhIHNwYWNlLlxyXG4gKiAtIGBESVJFQ1RJT05gOiBUaGUgb2JqZWN0J3MgZGlyZWN0aW9uIGluIHdvcmxkIHNwYWNlLlxyXG4gKiAtIGBTQ0FMRWA6IFRoZSBvYmplY3QncyBzY2FsZSBpbiB3b3JsZCBzcGFjZS5cclxuICogLSBgV09STERfTUFUUklYYDogVGhlIG9iamVjdCdzIG1hdHJpeCBpbiB3b3JsZCBzcGFjZS5cclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVcclxuICovXHJcbmNsYXNzIE9iamVjdDNETm9kZSBleHRlbmRzIE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdPYmplY3QzRE5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgb2JqZWN0IDNEIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geygncG9zaXRpb24nfCd2aWV3UG9zaXRpb24nfCdkaXJlY3Rpb24nfCdzY2FsZSd8J3dvcmxkTWF0cml4Jyl9IHNjb3BlIC0gVGhlIG5vZGUgcmVwcmVzZW50cyBhIGRpZmZlcmVudCB0eXBlIG9mIHRyYW5zZm9ybWF0aW9uIGRlcGVuZGluZyBvbiB0aGUgc2NvcGUuXHJcblx0ICogQHBhcmFtIHs/T2JqZWN0M0R9IFtvYmplY3QzZD1udWxsXSAtIFRoZSAzRCBvYmplY3QuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHNjb3BlLCBvYmplY3QzZCA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBub2RlIHJlcG9ydHMgYSBkaWZmZXJlbnQgdHlwZSBvZiB0cmFuc2Zvcm1hdGlvbiBkZXBlbmRpbmcgb24gdGhlIHNjb3BlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoJ3Bvc2l0aW9uJ3wndmlld1Bvc2l0aW9uJ3wnZGlyZWN0aW9uJ3wnc2NhbGUnfCd3b3JsZE1hdHJpeCcpfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNjb3BlID0gc2NvcGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgM0Qgb2JqZWN0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/T2JqZWN0M0R9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMub2JqZWN0M2QgPSBvYmplY3QzZDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIE92ZXJ3cml0dGVuIHNpbmNlIHRoaXMgdHlwZSBvZiBub2RlIGlzIHVwZGF0ZWQgcGVyIG9iamVjdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICogQGRlZmF1bHQgJ29iamVjdCdcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51cGRhdGVUeXBlID0gTm9kZVVwZGF0ZVR5cGUuT0JKRUNUO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG9sZHMgdGhlIHZhbHVlIG9mIHRoZSBub2RlIGFzIGEgdW5pZm9ybS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge1VuaWZvcm1Ob2RlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl91bmlmb3JtTm9kZSA9IG5ldyBVbmlmb3JtTm9kZSggbnVsbCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE92ZXJ3cml0dGVuIHNpbmNlIHRoZSBub2RlIHR5cGUgaXMgaW5mZXJyZWQgZnJvbSB0aGUgc2NvcGUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBub2RlIHR5cGUuXHJcblx0ICovXHJcblx0Z2V0Tm9kZVR5cGUoKSB7XHJcblxyXG5cdFx0Y29uc3Qgc2NvcGUgPSB0aGlzLnNjb3BlO1xyXG5cclxuXHRcdGlmICggc2NvcGUgPT09IE9iamVjdDNETm9kZS5XT1JMRF9NQVRSSVggKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gJ21hdDQnO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHNjb3BlID09PSBPYmplY3QzRE5vZGUuUE9TSVRJT04gfHwgc2NvcGUgPT09IE9iamVjdDNETm9kZS5WSUVXX1BPU0lUSU9OIHx8IHNjb3BlID09PSBPYmplY3QzRE5vZGUuRElSRUNUSU9OIHx8IHNjb3BlID09PSBPYmplY3QzRE5vZGUuU0NBTEUgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gJ3ZlYzMnO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHNjb3BlID09PSBPYmplY3QzRE5vZGUuUkFESVVTICkge1xyXG5cclxuXHRcdFx0cmV0dXJuICdmbG9hdCc7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIHVuaWZvcm0gdmFsdWUgZGVwZW5kaW5nIG9uIHRoZSBzY29wZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUZyYW1lfSBmcmFtZSAtIFRoZSBjdXJyZW50IG5vZGUgZnJhbWUuXHJcblx0ICovXHJcblx0dXBkYXRlKCBmcmFtZSApIHtcclxuXHJcblx0XHRjb25zdCBvYmplY3QgPSB0aGlzLm9iamVjdDNkO1xyXG5cdFx0Y29uc3QgdW5pZm9ybU5vZGUgPSB0aGlzLl91bmlmb3JtTm9kZTtcclxuXHRcdGNvbnN0IHNjb3BlID0gdGhpcy5zY29wZTtcclxuXHJcblx0XHRpZiAoIHNjb3BlID09PSBPYmplY3QzRE5vZGUuV09STERfTUFUUklYICkge1xyXG5cclxuXHRcdFx0dW5pZm9ybU5vZGUudmFsdWUgPSBvYmplY3QubWF0cml4V29ybGQ7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggc2NvcGUgPT09IE9iamVjdDNETm9kZS5QT1NJVElPTiApIHtcclxuXHJcblx0XHRcdHVuaWZvcm1Ob2RlLnZhbHVlID0gdW5pZm9ybU5vZGUudmFsdWUgfHwgbmV3IFZlY3RvcjMoKTtcclxuXHJcblx0XHRcdHVuaWZvcm1Ob2RlLnZhbHVlLnNldEZyb21NYXRyaXhQb3NpdGlvbiggb2JqZWN0Lm1hdHJpeFdvcmxkICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggc2NvcGUgPT09IE9iamVjdDNETm9kZS5TQ0FMRSApIHtcclxuXHJcblx0XHRcdHVuaWZvcm1Ob2RlLnZhbHVlID0gdW5pZm9ybU5vZGUudmFsdWUgfHwgbmV3IFZlY3RvcjMoKTtcclxuXHJcblx0XHRcdHVuaWZvcm1Ob2RlLnZhbHVlLnNldEZyb21NYXRyaXhTY2FsZSggb2JqZWN0Lm1hdHJpeFdvcmxkICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggc2NvcGUgPT09IE9iamVjdDNETm9kZS5ESVJFQ1RJT04gKSB7XHJcblxyXG5cdFx0XHR1bmlmb3JtTm9kZS52YWx1ZSA9IHVuaWZvcm1Ob2RlLnZhbHVlIHx8IG5ldyBWZWN0b3IzKCk7XHJcblxyXG5cdFx0XHRvYmplY3QuZ2V0V29ybGREaXJlY3Rpb24oIHVuaWZvcm1Ob2RlLnZhbHVlICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggc2NvcGUgPT09IE9iamVjdDNETm9kZS5WSUVXX1BPU0lUSU9OICkge1xyXG5cclxuXHRcdFx0Y29uc3QgY2FtZXJhID0gZnJhbWUuY2FtZXJhO1xyXG5cclxuXHRcdFx0dW5pZm9ybU5vZGUudmFsdWUgPSB1bmlmb3JtTm9kZS52YWx1ZSB8fCBuZXcgVmVjdG9yMygpO1xyXG5cdFx0XHR1bmlmb3JtTm9kZS52YWx1ZS5zZXRGcm9tTWF0cml4UG9zaXRpb24oIG9iamVjdC5tYXRyaXhXb3JsZCApO1xyXG5cclxuXHRcdFx0dW5pZm9ybU5vZGUudmFsdWUuYXBwbHlNYXRyaXg0KCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggc2NvcGUgPT09IE9iamVjdDNETm9kZS5SQURJVVMgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBnZW9tZXRyeSA9IGZyYW1lLm9iamVjdC5nZW9tZXRyeTtcclxuXHJcblx0XHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSBnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcclxuXHJcblx0XHRcdF9zcGhlcmUuY29weSggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgKS5hcHBseU1hdHJpeDQoIG9iamVjdC5tYXRyaXhXb3JsZCApO1xyXG5cclxuXHRcdFx0dW5pZm9ybU5vZGUudmFsdWUgPSBfc3BoZXJlLnJhZGl1cztcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2VuZXJhdGVzIHRoZSBjb2RlIHNuaXBwZXQgb2YgdGhlIHVuaWZvcm0gbm9kZS4gVGhlIG5vZGUgdHlwZSBvZiB0aGUgdW5pZm9ybVxyXG5cdCAqIG5vZGUgYWxzbyBkZXBlbmRzIG9uIHRoZSBzZWxlY3RlZCBzY29wZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgZ2VuZXJhdGVkIGNvZGUgc25pcHBldC5cclxuXHQgKi9cclxuXHRnZW5lcmF0ZSggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCBzY29wZSA9IHRoaXMuc2NvcGU7XHJcblxyXG5cdFx0aWYgKCBzY29wZSA9PT0gT2JqZWN0M0ROb2RlLldPUkxEX01BVFJJWCApIHtcclxuXHJcblx0XHRcdHRoaXMuX3VuaWZvcm1Ob2RlLm5vZGVUeXBlID0gJ21hdDQnO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHNjb3BlID09PSBPYmplY3QzRE5vZGUuUE9TSVRJT04gfHwgc2NvcGUgPT09IE9iamVjdDNETm9kZS5WSUVXX1BPU0lUSU9OIHx8IHNjb3BlID09PSBPYmplY3QzRE5vZGUuRElSRUNUSU9OIHx8IHNjb3BlID09PSBPYmplY3QzRE5vZGUuU0NBTEUgKSB7XHJcblxyXG5cdFx0XHR0aGlzLl91bmlmb3JtTm9kZS5ub2RlVHlwZSA9ICd2ZWMzJztcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBzY29wZSA9PT0gT2JqZWN0M0ROb2RlLlJBRElVUyApIHtcclxuXHJcblx0XHRcdHRoaXMuX3VuaWZvcm1Ob2RlLm5vZGVUeXBlID0gJ2Zsb2F0JztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX3VuaWZvcm1Ob2RlLmJ1aWxkKCBidWlsZGVyICk7XHJcblxyXG5cdH1cclxuXHJcblx0c2VyaWFsaXplKCBkYXRhICkge1xyXG5cclxuXHRcdHN1cGVyLnNlcmlhbGl6ZSggZGF0YSApO1xyXG5cclxuXHRcdGRhdGEuc2NvcGUgPSB0aGlzLnNjb3BlO1xyXG5cclxuXHR9XHJcblxyXG5cdGRlc2VyaWFsaXplKCBkYXRhICkge1xyXG5cclxuXHRcdHN1cGVyLmRlc2VyaWFsaXplKCBkYXRhICk7XHJcblxyXG5cdFx0dGhpcy5zY29wZSA9IGRhdGEuc2NvcGU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbk9iamVjdDNETm9kZS5XT1JMRF9NQVRSSVggPSAnd29ybGRNYXRyaXgnO1xyXG5PYmplY3QzRE5vZGUuUE9TSVRJT04gPSAncG9zaXRpb24nO1xyXG5PYmplY3QzRE5vZGUuU0NBTEUgPSAnc2NhbGUnO1xyXG5PYmplY3QzRE5vZGUuVklFV19QT1NJVElPTiA9ICd2aWV3UG9zaXRpb24nO1xyXG5PYmplY3QzRE5vZGUuRElSRUNUSU9OID0gJ2RpcmVjdGlvbic7XHJcbk9iamVjdDNETm9kZS5SQURJVVMgPSAncmFkaXVzJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IE9iamVjdDNETm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGFuIG9iamVjdCAzRCBub2RlIHRoYXQgcmVwcmVzZW50cyB0aGUgb2JqZWN0J3MgZGlyZWN0aW9uIGluIHdvcmxkIHNwYWNlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0gez9PYmplY3QzRH0gW29iamVjdDNkXSAtIFRoZSAzRCBvYmplY3QuXHJcbiAqIEByZXR1cm5zIHtPYmplY3QzRE5vZGU8dmVjMz59XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgb2JqZWN0RGlyZWN0aW9uID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE9iamVjdDNETm9kZSwgT2JqZWN0M0ROb2RlLkRJUkVDVElPTiApLnNldFBhcmFtZXRlckxlbmd0aCggMSApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYW4gb2JqZWN0IDNEIG5vZGUgdGhhdCByZXByZXNlbnRzIHRoZSBvYmplY3QncyB3b3JsZCBtYXRyaXguXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7P09iamVjdDNEfSBbb2JqZWN0M2RdIC0gVGhlIDNEIG9iamVjdC5cclxuICogQHJldHVybnMge09iamVjdDNETm9kZTxtYXQ0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBvYmplY3RXb3JsZE1hdHJpeCA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBPYmplY3QzRE5vZGUsIE9iamVjdDNETm9kZS5XT1JMRF9NQVRSSVggKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDEgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGFuIG9iamVjdCAzRCBub2RlIHRoYXQgcmVwcmVzZW50cyB0aGUgb2JqZWN0J3MgcG9zaXRpb24gaW4gd29ybGQgc3BhY2UuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7P09iamVjdDNEfSBbb2JqZWN0M2RdIC0gVGhlIDNEIG9iamVjdC5cclxuICogQHJldHVybnMge09iamVjdDNETm9kZTx2ZWMzPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBvYmplY3RQb3NpdGlvbiA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBPYmplY3QzRE5vZGUsIE9iamVjdDNETm9kZS5QT1NJVElPTiApLnNldFBhcmFtZXRlckxlbmd0aCggMSApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYW4gb2JqZWN0IDNEIG5vZGUgdGhhdCByZXByZXNlbnRzIHRoZSBvYmplY3QncyBzY2FsZSBpbiB3b3JsZCBzcGFjZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHs/T2JqZWN0M0R9IFtvYmplY3QzZF0gLSBUaGUgM0Qgb2JqZWN0LlxyXG4gKiBAcmV0dXJucyB7T2JqZWN0M0ROb2RlPHZlYzM+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG9iamVjdFNjYWxlID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE9iamVjdDNETm9kZSwgT2JqZWN0M0ROb2RlLlNDQUxFICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAxICk7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhbiBvYmplY3QgM0Qgbm9kZSB0aGF0IHJlcHJlc2VudHMgdGhlIG9iamVjdCdzIHBvc2l0aW9uIGluIHZpZXcvY2FtZXJhIHNwYWNlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0gez9PYmplY3QzRH0gW29iamVjdDNkXSAtIFRoZSAzRCBvYmplY3QuXHJcbiAqIEByZXR1cm5zIHtPYmplY3QzRE5vZGU8dmVjMz59XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgb2JqZWN0Vmlld1Bvc2l0aW9uID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE9iamVjdDNETm9kZSwgT2JqZWN0M0ROb2RlLlZJRVdfUE9TSVRJT04gKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDEgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGFuIG9iamVjdCAzRCBub2RlIHRoYXQgcmVwcmVzZW50cyB0aGUgb2JqZWN0J3MgcmFkaXVzLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0gez9PYmplY3QzRH0gW29iamVjdDNkXSAtIFRoZSAzRCBvYmplY3QuXHJcbiAqIEByZXR1cm5zIHtPYmplY3QzRE5vZGU8dmVjMz59XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgb2JqZWN0UmFkaXVzID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE9iamVjdDNETm9kZSwgT2JqZWN0M0ROb2RlLlJBRElVUyApLnNldFBhcmFtZXRlckxlbmd0aCggMSApO1xyXG4iLCJpbXBvcnQgT2JqZWN0M0ROb2RlIGZyb20gJy4vT2JqZWN0M0ROb2RlLmpzJztcclxuaW1wb3J0IHsgRm4sIG5vZGVJbW11dGFibGUgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcbmltcG9ydCB7IHVuaWZvcm0gfSBmcm9tICcuLi9jb3JlL1VuaWZvcm1Ob2RlLmpzJztcclxuXHJcbmltcG9ydCB7IE1hdHJpeDQgfSBmcm9tICcuLi8uLi9tYXRoL01hdHJpeDQuanMnO1xyXG5pbXBvcnQgeyBjYW1lcmFWaWV3TWF0cml4IH0gZnJvbSAnLi9DYW1lcmEuanMnO1xyXG5pbXBvcnQgeyBNYXRyaXgzIH0gZnJvbSAnLi4vLi4vbWF0aC9NYXRyaXgzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIHR5cGUgb2Ygbm9kZSBpcyBhIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYE9iamVjdDNETm9kZWBcclxuICogd2l0aCBsYXJnZXIgc2V0IG9mIG1vZGVsIHJlbGF0ZWQgbWV0cmljcy4gVW5saWtlIGBPYmplY3QzRE5vZGVgLFxyXG4gKiBgTW9kZWxOb2RlYCBleHRyYWN0cyB0aGUgcmVmZXJlbmNlIHRvIHRoZSAzRCBvYmplY3QgZnJvbSB0aGVcclxuICogY3VycmVudCBub2RlIGZyYW1lIHN0YXRlLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgT2JqZWN0M0ROb2RlXHJcbiAqL1xyXG5jbGFzcyBNb2RlbE5vZGUgZXh0ZW5kcyBPYmplY3QzRE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdNb2RlbE5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgb2JqZWN0IG1vZGVsIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geygncG9zaXRpb24nfCd2aWV3UG9zaXRpb24nfCdkaXJlY3Rpb24nfCdzY2FsZSd8J3dvcmxkTWF0cml4Jyl9IHNjb3BlIC0gVGhlIG5vZGUgcmVwcmVzZW50cyBhIGRpZmZlcmVudCB0eXBlIG9mIHRyYW5zZm9ybWF0aW9uIGRlcGVuZGluZyBvbiB0aGUgc2NvcGUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHNjb3BlICkge1xyXG5cclxuXHRcdHN1cGVyKCBzY29wZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEV4dHJhY3RzIHRoZSBtb2RlbCByZWZlcmVuY2UgZnJvbSB0aGUgZnJhbWUgc3RhdGUgYW5kIHRoZW5cclxuXHQgKiB1cGRhdGVzIHRoZSB1bmlmb3JtIHZhbHVlIGRlcGVuZGluZyBvbiB0aGUgc2NvcGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVGcmFtZX0gZnJhbWUgLSBUaGUgY3VycmVudCBub2RlIGZyYW1lLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZSggZnJhbWUgKSB7XHJcblxyXG5cdFx0dGhpcy5vYmplY3QzZCA9IGZyYW1lLm9iamVjdDtcclxuXHJcblx0XHRzdXBlci51cGRhdGUoIGZyYW1lICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IE1vZGVsTm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgb2JqZWN0J3MgZGlyZWN0aW9uIGluIHdvcmxkIHNwYWNlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtNb2RlbE5vZGU8dmVjMz59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbW9kZWxEaXJlY3Rpb24gPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIE1vZGVsTm9kZSwgTW9kZWxOb2RlLkRJUkVDVElPTiApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBvYmplY3QncyB3b3JsZCBtYXRyaXguXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge01vZGVsTm9kZTxtYXQ0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBtb2RlbFdvcmxkTWF0cml4ID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBNb2RlbE5vZGUsIE1vZGVsTm9kZS5XT1JMRF9NQVRSSVggKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgb2JqZWN0J3MgcG9zaXRpb24gaW4gd29ybGQgc3BhY2UuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge01vZGVsTm9kZTx2ZWMzPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBtb2RlbFBvc2l0aW9uID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBNb2RlbE5vZGUsIE1vZGVsTm9kZS5QT1NJVElPTiApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBvYmplY3QncyBzY2FsZSBpbiB3b3JsZCBzcGFjZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7TW9kZWxOb2RlPHZlYzM+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG1vZGVsU2NhbGUgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIE1vZGVsTm9kZSwgTW9kZWxOb2RlLlNDQUxFICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIG9iamVjdCdzIHBvc2l0aW9uIGluIHZpZXcvY2FtZXJhIHNwYWNlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtNb2RlbE5vZGU8dmVjMz59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbW9kZWxWaWV3UG9zaXRpb24gPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIE1vZGVsTm9kZSwgTW9kZWxOb2RlLlZJRVdfUE9TSVRJT04gKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgb2JqZWN0J3MgcmFkaXVzLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtNb2RlbE5vZGU8ZmxvYXQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG1vZGVsUmFkaXVzID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBNb2RlbE5vZGUsIE1vZGVsTm9kZS5SQURJVVMgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgb2JqZWN0J3Mgbm9ybWFsIG1hdHJpeC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7VW5pZm9ybU5vZGU8bWF0Mz59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbW9kZWxOb3JtYWxNYXRyaXggPSAvKkBfX1BVUkVfXyovIHVuaWZvcm0oIG5ldyBNYXRyaXgzKCkgKS5vbk9iamVjdFVwZGF0ZSggKCB7IG9iamVjdCB9LCBzZWxmICkgPT4gc2VsZi52YWx1ZS5nZXROb3JtYWxNYXRyaXgoIG9iamVjdC5tYXRyaXhXb3JsZCApICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIG9iamVjdCdzIGludmVyc2Ugd29ybGQgbWF0cml4LlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtVbmlmb3JtTm9kZTxtYXQ0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBtb2RlbFdvcmxkTWF0cml4SW52ZXJzZSA9IC8qQF9fUFVSRV9fKi8gdW5pZm9ybSggbmV3IE1hdHJpeDQoKSApLm9uT2JqZWN0VXBkYXRlKCAoIHsgb2JqZWN0IH0sIHNlbGYgKSA9PiBzZWxmLnZhbHVlLmNvcHkoIG9iamVjdC5tYXRyaXhXb3JsZCApLmludmVydCgpICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIG9iamVjdCdzIG1vZGVsIHZpZXcgbWF0cml4LlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtOb2RlPG1hdDQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG1vZGVsVmlld01hdHJpeCA9IC8qQF9fUFVSRV9fKi8gKCBGbiggKCBidWlsZGVyICkgPT4ge1xyXG5cclxuXHRyZXR1cm4gYnVpbGRlci5yZW5kZXJlci5ub2Rlcy5tb2RlbFZpZXdNYXRyaXggfHwgbWVkaXVtcE1vZGVsVmlld01hdHJpeDtcclxuXHJcbn0gKS5vbmNlKCkgKSgpLnRvVmFyKCAnbW9kZWxWaWV3TWF0cml4JyApO1xyXG5cclxuLy8gR1BVIFByZWNpc2lvblxyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBvYmplY3QncyBtb2RlbCB2aWV3IGluIGBtZWRpdW1wYCBwcmVjaXNpb24uXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8bWF0ND59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbWVkaXVtcE1vZGVsVmlld01hdHJpeCA9IC8qQF9fUFVSRV9fKi8gY2FtZXJhVmlld01hdHJpeC5tdWwoIG1vZGVsV29ybGRNYXRyaXggKTtcclxuXHJcbi8vIENQVSBQcmVjaXNpb25cclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgb2JqZWN0J3MgbW9kZWwgdmlldyBpbiBgaGlnaHBgIHByZWNpc2lvblxyXG4gKiB3aGljaCBpcyBhY2hpZXZlZCBieSBjb21wdXRpbmcgdGhlIG1hdHJpeCBpbiBKUyBhbmQgbm90IGluIHRoZSBzaGFkZXIuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8bWF0ND59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgaGlnaHBNb2RlbFZpZXdNYXRyaXggPSAvKkBfX1BVUkVfXyovICggRm4oICggYnVpbGRlciApID0+IHtcclxuXHJcblx0YnVpbGRlci5jb250ZXh0LmlzSGlnaFByZWNpc2lvbk1vZGVsVmlld01hdHJpeCA9IHRydWU7XHJcblxyXG5cdHJldHVybiB1bmlmb3JtKCAnbWF0NCcgKS5vbk9iamVjdFVwZGF0ZSggKCB7IG9iamVjdCwgY2FtZXJhIH0gKSA9PiB7XHJcblxyXG5cdFx0cmV0dXJuIG9iamVjdC5tb2RlbFZpZXdNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSwgb2JqZWN0Lm1hdHJpeFdvcmxkICk7XHJcblxyXG5cdH0gKTtcclxuXHJcbn0gKS5vbmNlKCkgKSgpLnRvVmFyKCAnaGlnaHBNb2RlbFZpZXdNYXRyaXgnICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIG9iamVjdCdzIG1vZGVsIG5vcm1hbCB2aWV3IGluIGBoaWdocGAgcHJlY2lzaW9uXHJcbiAqIHdoaWNoIGlzIGFjaGlldmVkIGJ5IGNvbXB1dGluZyB0aGUgbWF0cml4IGluIEpTIGFuZCBub3QgaW4gdGhlIHNoYWRlci5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTxtYXQzPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBoaWdocE1vZGVsTm9ybWFsVmlld01hdHJpeCA9IC8qQF9fUFVSRV9fKi8gKCBGbiggKCBidWlsZGVyICkgPT4ge1xyXG5cclxuXHRjb25zdCBpc0hpZ2hQcmVjaXNpb25Nb2RlbFZpZXdNYXRyaXggPSBidWlsZGVyLmNvbnRleHQuaXNIaWdoUHJlY2lzaW9uTW9kZWxWaWV3TWF0cml4O1xyXG5cclxuXHRyZXR1cm4gdW5pZm9ybSggJ21hdDMnICkub25PYmplY3RVcGRhdGUoICggeyBvYmplY3QsIGNhbWVyYSB9ICkgPT4ge1xyXG5cclxuXHRcdGlmICggaXNIaWdoUHJlY2lzaW9uTW9kZWxWaWV3TWF0cml4ICE9PSB0cnVlICkge1xyXG5cclxuXHRcdFx0b2JqZWN0Lm1vZGVsVmlld01hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlLCBvYmplY3QubWF0cml4V29ybGQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG9iamVjdC5ub3JtYWxNYXRyaXguZ2V0Tm9ybWFsTWF0cml4KCBvYmplY3QubW9kZWxWaWV3TWF0cml4ICk7XHJcblxyXG5cdH0gKTtcclxuXHJcbn0gKS5vbmNlKCkgKSgpLnRvVmFyKCAnaGlnaHBNb2RlbE5vcm1hbFZpZXdNYXRyaXgnICk7XHJcbiIsImltcG9ydCB7IGF0dHJpYnV0ZSB9IGZyb20gJy4uL2NvcmUvQXR0cmlidXRlTm9kZS5qcyc7XHJcbmltcG9ydCB7IEZuIH0gZnJvbSAnLi4vdHNsL1RTTENvcmUuanMnO1xyXG5pbXBvcnQgeyBtb2RlbFdvcmxkTWF0cml4IH0gZnJvbSAnLi9Nb2RlbE5vZGUuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBwb3NpdGlvbiBhdHRyaWJ1dGUgb2YgdGhlIGN1cnJlbnQgcmVuZGVyZWQgb2JqZWN0LlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtBdHRyaWJ1dGVOb2RlPHZlYzM+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHBvc2l0aW9uR2VvbWV0cnkgPSAvKkBfX1BVUkVfXyovIGF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgJ3ZlYzMnICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHZlcnRleCBwb3NpdGlvbiBpbiBsb2NhbCBzcGFjZSBvZiB0aGUgY3VycmVudCByZW5kZXJlZCBvYmplY3QuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge0F0dHJpYnV0ZU5vZGU8dmVjMz59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcG9zaXRpb25Mb2NhbCA9IC8qQF9fUFVSRV9fKi8gcG9zaXRpb25HZW9tZXRyeS50b1ZhcnlpbmcoICdwb3NpdGlvbkxvY2FsJyApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBwcmV2aW91cyB2ZXJ0ZXggcG9zaXRpb24gaW4gbG9jYWwgc3BhY2Ugb2YgdGhlIGN1cnJlbnQgcmVuZGVyZWQgb2JqZWN0LlxyXG4gKiBVc2VkIGluIGNvbnRleHQgb2Yge0BsaW5rIFZlbG9jaXR5Tm9kZX0gZm9yIHJlbmRlcmluZyBtb3Rpb24gdmVjdG9ycy5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7QXR0cmlidXRlTm9kZTx2ZWMzPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBwb3NpdGlvblByZXZpb3VzID0gLypAX19QVVJFX18qLyBwb3NpdGlvbkdlb21ldHJ5LnRvVmFyeWluZyggJ3Bvc2l0aW9uUHJldmlvdXMnICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHZlcnRleCBwb3NpdGlvbiBpbiB3b3JsZCBzcGFjZSBvZiB0aGUgY3VycmVudCByZW5kZXJlZCBvYmplY3QuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1ZhcnlpbmdOb2RlPHZlYzM+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHBvc2l0aW9uV29ybGQgPSAvKkBfX1BVUkVfXyovIG1vZGVsV29ybGRNYXRyaXgubXVsKCBwb3NpdGlvbkxvY2FsICkueHl6LnRvVmFyeWluZyggJ3ZfcG9zaXRpb25Xb3JsZCcgKS5jb250ZXh0KCB7IG5lZWRzUG9zaXRpb25SZWFzc2lnbjogdHJ1ZSB9ICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHBvc2l0aW9uIHdvcmxkIGRpcmVjdGlvbiBvZiB0aGUgY3VycmVudCByZW5kZXJlZCBvYmplY3QuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8dmVjMz59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcG9zaXRpb25Xb3JsZERpcmVjdGlvbiA9IC8qQF9fUFVSRV9fKi8gcG9zaXRpb25Mb2NhbC50cmFuc2Zvcm1EaXJlY3Rpb24oIG1vZGVsV29ybGRNYXRyaXggKS50b1ZhcnlpbmcoICd2X3Bvc2l0aW9uV29ybGREaXJlY3Rpb24nICkubm9ybWFsaXplKCkudG9WYXIoICdwb3NpdGlvbldvcmxkRGlyZWN0aW9uJyApLmNvbnRleHQoIHsgbmVlZHNQb3NpdGlvblJlYXNzaWduOiB0cnVlIH0gKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgdmVydGV4IHBvc2l0aW9uIGluIHZpZXcgc3BhY2Ugb2YgdGhlIGN1cnJlbnQgcmVuZGVyZWQgb2JqZWN0LlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtWYXJ5aW5nTm9kZTx2ZWMzPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBwb3NpdGlvblZpZXcgPSAvKkBfX1BVUkVfXyovICggRm4oICggYnVpbGRlciApID0+IHtcclxuXHJcblx0cmV0dXJuIGJ1aWxkZXIuY29udGV4dC5zZXR1cFBvc2l0aW9uVmlldygpO1xyXG5cclxufSwgJ3ZlYzMnICkub25jZSgpICkoKS50b1ZhcnlpbmcoICd2X3Bvc2l0aW9uVmlldycgKS5jb250ZXh0KCB7IG5lZWRzUG9zaXRpb25SZWFzc2lnbjogdHJ1ZSB9ICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHBvc2l0aW9uIHZpZXcgZGlyZWN0aW9uIG9mIHRoZSBjdXJyZW50IHJlbmRlcmVkIG9iamVjdC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7VmFyeWluZ05vZGU8dmVjMz59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcG9zaXRpb25WaWV3RGlyZWN0aW9uID0gLypAX19QVVJFX18qLyBwb3NpdGlvblZpZXcubmVnYXRlKCkudG9WYXJ5aW5nKCAndl9wb3NpdGlvblZpZXdEaXJlY3Rpb24nICkubm9ybWFsaXplKCkudG9WYXIoICdwb3NpdGlvblZpZXdEaXJlY3Rpb24nICk7XHJcbiIsImltcG9ydCBOb2RlIGZyb20gJy4uL2NvcmUvTm9kZS5qcyc7XHJcbmltcG9ydCB7IG5vZGVJbW11dGFibGUsIGZsb2F0IH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5cclxuaW1wb3J0IHsgQmFja1NpZGUsIFdlYkdMQ29vcmRpbmF0ZVN5c3RlbSB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBub2RlIGNhbiBiZSB1c2VkIHRvIGV2YWx1YXRlIHdoZXRoZXIgYSBwcmltaXRpdmUgaXMgZnJvbnQgb3IgYmFjayBmYWNpbmcuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBOb2RlXHJcbiAqL1xyXG5jbGFzcyBGcm9udEZhY2luZ05vZGUgZXh0ZW5kcyBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnRnJvbnRGYWNpbmdOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGZyb250IGZhY2luZyBub2RlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cclxuXHRcdHN1cGVyKCAnYm9vbCcgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNGcm9udEZhY2luZ05vZGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdGdlbmVyYXRlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IHsgcmVuZGVyZXIsIG1hdGVyaWFsIH0gPSBidWlsZGVyO1xyXG5cclxuXHRcdGlmICggcmVuZGVyZXIuY29vcmRpbmF0ZVN5c3RlbSA9PT0gV2ViR0xDb29yZGluYXRlU3lzdGVtICkge1xyXG5cclxuXHRcdFx0aWYgKCBtYXRlcmlhbC5zaWRlID09PSBCYWNrU2lkZSApIHtcclxuXHJcblx0XHRcdFx0cmV0dXJuICdmYWxzZSc7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBidWlsZGVyLmdldEZyb250RmFjaW5nKCk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEZyb250RmFjaW5nTm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB3aGV0aGVyIGEgcHJpbWl0aXZlIGlzIGZyb250IG9yIGJhY2sgZmFjaW5nXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge0Zyb250RmFjaW5nTm9kZTxib29sPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBmcm9udEZhY2luZyA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggRnJvbnRGYWNpbmdOb2RlICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGZyb250IGZhY2luZyBzdGF0dXMgYXMgYSBudW1iZXIgaW5zdGVhZCBvZiBhIGJvb2wuXHJcbiAqIGAxYCBtZWFucyBmcm9udCBmYWNpbmcsIGAtMWAgbWVhbnMgYmFjayBmYWNpbmcuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8ZmxvYXQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGZhY2VEaXJlY3Rpb24gPSAvKkBfX1BVUkVfXyovIGZsb2F0KCBmcm9udEZhY2luZyApLm11bCggMi4wICkuc3ViKCAxLjAgKTtcclxuIiwiaW1wb3J0IHsgYXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9BdHRyaWJ1dGVOb2RlLmpzJztcclxuaW1wb3J0IHsgY2FtZXJhVmlld01hdHJpeCB9IGZyb20gJy4vQ2FtZXJhLmpzJztcclxuaW1wb3J0IHsgbW9kZWxOb3JtYWxNYXRyaXgsIG1vZGVsV29ybGRNYXRyaXggfSBmcm9tICcuL01vZGVsTm9kZS5qcyc7XHJcbmltcG9ydCB7IG1hdDMsIHZlYzMsIEZuLCB2YXJ5aW5nIH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5pbXBvcnQgeyBwb3NpdGlvblZpZXcgfSBmcm9tICcuL1Bvc2l0aW9uLmpzJztcclxuaW1wb3J0IHsgZmFjZURpcmVjdGlvbiB9IGZyb20gJy4uL2Rpc3BsYXkvRnJvbnRGYWNpbmdOb2RlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgbm9ybWFsIGF0dHJpYnV0ZSBvZiB0aGUgY3VycmVudCByZW5kZXJlZCBvYmplY3QuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8dmVjMz59XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgbm9ybWFsR2VvbWV0cnkgPSAvKkBfX1BVUkVfXyovIGF0dHJpYnV0ZSggJ25vcm1hbCcsICd2ZWMzJyApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSB2ZXJ0ZXggbm9ybWFsIGluIGxvY2FsIHNwYWNlIG9mIHRoZSBjdXJyZW50IHJlbmRlcmVkIG9iamVjdC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTx2ZWMzPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBub3JtYWxMb2NhbCA9IC8qQF9fUFVSRV9fKi8gKCBGbiggKCBidWlsZGVyICkgPT4ge1xyXG5cclxuXHRpZiAoIGJ1aWxkZXIuZ2VvbWV0cnkuaGFzQXR0cmlidXRlKCAnbm9ybWFsJyApID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5UU0w6IFZlcnRleCBhdHRyaWJ1dGUgXCJub3JtYWxcIiBub3QgZm91bmQgb24gZ2VvbWV0cnkuJyApO1xyXG5cclxuXHRcdHJldHVybiB2ZWMzKCAwLCAxLCAwICk7XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIG5vcm1hbEdlb21ldHJ5O1xyXG5cclxufSwgJ3ZlYzMnICkub25jZSgpICkoKS50b1ZhciggJ25vcm1hbExvY2FsJyApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBmbGF0IHZlcnRleCBub3JtYWwgaW4gdmlldyBzcGFjZSBvZiB0aGUgY3VycmVudCByZW5kZXJlZCBvYmplY3QuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8dmVjMz59XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgbm9ybWFsRmxhdCA9IC8qQF9fUFVSRV9fKi8gcG9zaXRpb25WaWV3LmRGZHgoKS5jcm9zcyggcG9zaXRpb25WaWV3LmRGZHkoKSApLm5vcm1hbGl6ZSgpLnRvVmFyKCAnbm9ybWFsRmxhdCcgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgdmVydGV4IG5vcm1hbCBpbiB2aWV3IHNwYWNlIG9mIHRoZSBjdXJyZW50IHJlbmRlcmVkIG9iamVjdC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTx2ZWMzPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBub3JtYWxWaWV3ID0gLypAX19QVVJFX18qLyAoIEZuKCAoIGJ1aWxkZXIgKSA9PiB7XHJcblxyXG5cdGxldCBub2RlO1xyXG5cclxuXHRpZiAoIGJ1aWxkZXIubWF0ZXJpYWwuZmxhdFNoYWRpbmcgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0bm9kZSA9IG5vcm1hbEZsYXQ7XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0bm9kZSA9IHZhcnlpbmcoIHRyYW5zZm9ybU5vcm1hbFRvVmlldyggbm9ybWFsTG9jYWwgKSwgJ3Zfbm9ybWFsVmlldycgKS5ub3JtYWxpemUoKTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gbm9kZTtcclxuXHJcbn0sICd2ZWMzJyApLm9uY2UoKSApKCkudG9WYXIoICdub3JtYWxWaWV3JyApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSB2ZXJ0ZXggbm9ybWFsIGluIHdvcmxkIHNwYWNlIG9mIHRoZSBjdXJyZW50IHJlbmRlcmVkIG9iamVjdC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTx2ZWMzPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBub3JtYWxXb3JsZCA9IC8qQF9fUFVSRV9fKi8gdmFyeWluZyggbm9ybWFsVmlldy50cmFuc2Zvcm1EaXJlY3Rpb24oIGNhbWVyYVZpZXdNYXRyaXggKSwgJ3Zfbm9ybWFsV29ybGQnICkubm9ybWFsaXplKCkudG9WYXIoICdub3JtYWxXb3JsZCcgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgdHJhbnNmb3JtZWQgdmVydGV4IG5vcm1hbCBpbiB2aWV3IHNwYWNlIG9mIHRoZSBjdXJyZW50IHJlbmRlcmVkIG9iamVjdC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTx2ZWMzPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCB0cmFuc2Zvcm1lZE5vcm1hbFZpZXcgPSAvKkBfX1BVUkVfXyovICggRm4oICggYnVpbGRlciApID0+IHtcclxuXHJcblx0Ly8gVXNlIGdldFVWIGNvbnRleHQgdG8gYXZvaWQgc2lkZSBlZmZlY3RzIGZyb20gbm9kZXMgb3ZlcndyaXRpbmcgZ2V0VVYgaW4gdGhlIGNvbnRleHQgKGUuZy4gRW52aXJvbm1lbnROb2RlKVxyXG5cclxuXHRyZXR1cm4gYnVpbGRlci5jb250ZXh0LnNldHVwTm9ybWFsKCkuY29udGV4dCggeyBnZXRVVjogbnVsbCB9ICk7XHJcblxyXG59LCAndmVjMycgKS5vbmNlKCkgKSgpLm11bCggZmFjZURpcmVjdGlvbiApLnRvVmFyKCAndHJhbnNmb3JtZWROb3JtYWxWaWV3JyApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSB0cmFuc2Zvcm1lZCB2ZXJ0ZXggbm9ybWFsIGluIHdvcmxkIHNwYWNlIG9mIHRoZSBjdXJyZW50IHJlbmRlcmVkIG9iamVjdC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTx2ZWMzPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCB0cmFuc2Zvcm1lZE5vcm1hbFdvcmxkID0gLypAX19QVVJFX18qLyB0cmFuc2Zvcm1lZE5vcm1hbFZpZXcudHJhbnNmb3JtRGlyZWN0aW9uKCBjYW1lcmFWaWV3TWF0cml4ICkudG9WYXIoICd0cmFuc2Zvcm1lZE5vcm1hbFdvcmxkJyApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSB0cmFuc2Zvcm1lZCBjbGVhcmNvYXQgdmVydGV4IG5vcm1hbCBpbiB2aWV3IHNwYWNlIG9mIHRoZSBjdXJyZW50IHJlbmRlcmVkIG9iamVjdC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTx2ZWMzPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCB0cmFuc2Zvcm1lZENsZWFyY29hdE5vcm1hbFZpZXcgPSAvKkBfX1BVUkVfXyovICggRm4oICggYnVpbGRlciApID0+IHtcclxuXHJcblx0Ly8gVXNlIGdldFVWIGNvbnRleHQgdG8gYXZvaWQgc2lkZSBlZmZlY3RzIGZyb20gbm9kZXMgb3ZlcndyaXRpbmcgZ2V0VVYgaW4gdGhlIGNvbnRleHQgKGUuZy4gRW52aXJvbm1lbnROb2RlKVxyXG5cclxuXHRyZXR1cm4gYnVpbGRlci5jb250ZXh0LnNldHVwQ2xlYXJjb2F0Tm9ybWFsKCkuY29udGV4dCggeyBnZXRVVjogbnVsbCB9ICk7XHJcblxyXG59LCAndmVjMycgKS5vbmNlKCkgKSgpLm11bCggZmFjZURpcmVjdGlvbiApLnRvVmFyKCAndHJhbnNmb3JtZWRDbGVhcmNvYXROb3JtYWxWaWV3JyApO1xyXG5cclxuLyoqXHJcbiAqIFRyYW5zZm9ybXMgdGhlIG5vcm1hbCB3aXRoIHRoZSBnaXZlbiBtYXRyaXguXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMzPn0gbm9ybWFsIC0gVGhlIG5vcm1hbC5cclxuICogQHBhcmFtIHtOb2RlPG1hdDM+fSBbbWF0cml4PW1vZGVsV29ybGRNYXRyaXhdIC0gVGhlIG1hdHJpeC5cclxuICogQHJldHVybiB7Tm9kZTx2ZWMzPn0gVGhlIHRyYW5zZm9ybWVkIG5vcm1hbC5cclxuICovXHJcbmV4cG9ydCBjb25zdCB0cmFuc2Zvcm1Ob3JtYWwgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgbm9ybWFsLCBtYXRyaXggPSBtb2RlbFdvcmxkTWF0cml4IF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IG0gPSBtYXQzKCBtYXRyaXggKTtcclxuXHJcblx0Y29uc3QgdHJhbnNmb3JtZWROb3JtYWwgPSBub3JtYWwuZGl2KCB2ZWMzKCBtWyAwIF0uZG90KCBtWyAwIF0gKSwgbVsgMSBdLmRvdCggbVsgMSBdICksIG1bIDIgXS5kb3QoIG1bIDIgXSApICkgKTtcclxuXHJcblx0cmV0dXJuIG0ubXVsKCB0cmFuc2Zvcm1lZE5vcm1hbCApLnh5ejtcclxuXHJcbn0gKTtcclxuXHJcbi8qKlxyXG4gKiBUcmFuc2Zvcm1zIHRoZSBnaXZlbiBub3JtYWwgZnJvbSBsb2NhbCB0byB2aWV3IHNwYWNlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGU8dmVjMz59IG5vcm1hbCAtIFRoZSBub3JtYWwuXHJcbiAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcbiAqIEByZXR1cm4ge05vZGU8dmVjMz59IFRoZSB0cmFuc2Zvcm1lZCBub3JtYWwuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdHJhbnNmb3JtTm9ybWFsVG9WaWV3ID0gLypAX19QVVJFX18qLyBGbiggKCBbIG5vcm1hbCBdLCBidWlsZGVyICkgPT4ge1xyXG5cclxuXHRjb25zdCBtb2RlbE5vcm1hbFZpZXdNYXRyaXggPSBidWlsZGVyLnJlbmRlcmVyLm5vZGVzLm1vZGVsTm9ybWFsVmlld01hdHJpeDtcclxuXHJcblx0aWYgKCBtb2RlbE5vcm1hbFZpZXdNYXRyaXggIT09IG51bGwgKSB7XHJcblxyXG5cdFx0cmV0dXJuIG1vZGVsTm9ybWFsVmlld01hdHJpeC50cmFuc2Zvcm1EaXJlY3Rpb24oIG5vcm1hbCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vXHJcblxyXG5cdGNvbnN0IHRyYW5zZm9ybWVkTm9ybWFsID0gbW9kZWxOb3JtYWxNYXRyaXgubXVsKCBub3JtYWwgKTtcclxuXHJcblx0cmV0dXJuIGNhbWVyYVZpZXdNYXRyaXgudHJhbnNmb3JtRGlyZWN0aW9uKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xyXG5cclxufSApO1xyXG4iLCJpbXBvcnQgeyBFdWxlciB9IGZyb20gJy4uLy4uL21hdGgvRXVsZXIuanMnO1xyXG5pbXBvcnQgeyBNYXRyaXg0IH0gZnJvbSAnLi4vLi4vbWF0aC9NYXRyaXg0LmpzJztcclxuaW1wb3J0IHsgdW5pZm9ybSB9IGZyb20gJy4uL2NvcmUvVW5pZm9ybU5vZGUuanMnO1xyXG5cclxuY29uc3QgX2UxID0gLypAX19QVVJFX18qLyBuZXcgRXVsZXIoKTtcclxuY29uc3QgX20xID0gLypAX19QVVJFX18qLyBuZXcgTWF0cml4NCgpO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSByZWZyYWN0aW9uIHJhdGlvIG9mIHRoZSBtYXRlcmlhbCB1c2VkIGZvciByZW5kZXJpbmcgdGhlIGN1cnJlbnQgb2JqZWN0LlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtVbmlmb3JtTm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbWF0ZXJpYWxSZWZyYWN0aW9uUmF0aW8gPSAvKkBfX1BVUkVfXyovIHVuaWZvcm0oIDAgKS5vblJlZmVyZW5jZSggKCB7IG1hdGVyaWFsIH0gKSA9PiBtYXRlcmlhbCApLm9uT2JqZWN0VXBkYXRlKCAoIHsgbWF0ZXJpYWwgfSApID0+IG1hdGVyaWFsLnJlZnJhY3Rpb25SYXRpbyApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBpbnRlbnNpdHkgb2YgZW52aXJvbm1lbnQgbWFwcyBvZiBQQlIgbWF0ZXJpYWxzLlxyXG4gKiBXaGVuIGBtYXRlcmlhbC5lbnZNYXBgIGlzIHNldCwgdGhlIHZhbHVlIGlzIGBtYXRlcmlhbC5lbnZNYXBJbnRlbnNpdHlgIG90aGVyd2lzZSBgc2NlbmUuZW52aXJvbm1lbnRJbnRlbnNpdHlgLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtOb2RlPGZsb2F0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBtYXRlcmlhbEVudkludGVuc2l0eSA9IC8qQF9fUFVSRV9fKi8gdW5pZm9ybSggMSApLm9uUmVmZXJlbmNlKCAoIHsgbWF0ZXJpYWwgfSApID0+IG1hdGVyaWFsICkub25PYmplY3RVcGRhdGUoIGZ1bmN0aW9uICggeyBtYXRlcmlhbCwgc2NlbmUgfSApIHtcclxuXHJcblx0cmV0dXJuIG1hdGVyaWFsLmVudk1hcCA/IG1hdGVyaWFsLmVudk1hcEludGVuc2l0eSA6IHNjZW5lLmVudmlyb25tZW50SW50ZW5zaXR5O1xyXG5cclxufSApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSByb3RhdGlvbiBvZiBlbnZpcm9ubWVudCBtYXBzLlxyXG4gKiBXaGVuIGBtYXRlcmlhbC5lbnZNYXBgIGlzIHNldCwgdGhlIHZhbHVlIGlzIGBtYXRlcmlhbC5lbnZNYXBSb3RhdGlvbmAuIGBzY2VuZS5lbnZpcm9ubWVudFJvdGF0aW9uYCBjb250cm9scyB0aGVcclxuICogcm90YXRpb24gb2YgYHNjZW5lLmVudmlyb25tZW50YCBpbnN0ZWFkLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtOb2RlPG1hdDQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG1hdGVyaWFsRW52Um90YXRpb24gPSAvKkBfX1BVUkVfXyovIHVuaWZvcm0oIG5ldyBNYXRyaXg0KCkgKS5vblJlZmVyZW5jZSggZnVuY3Rpb24gKCBmcmFtZSApIHtcclxuXHJcblx0cmV0dXJuIGZyYW1lLm1hdGVyaWFsO1xyXG5cclxufSApLm9uT2JqZWN0VXBkYXRlKCBmdW5jdGlvbiAoIHsgbWF0ZXJpYWwsIHNjZW5lIH0gKSB7XHJcblxyXG5cdGNvbnN0IHJvdGF0aW9uID0gKCBzY2VuZS5lbnZpcm9ubWVudCAhPT0gbnVsbCAmJiBtYXRlcmlhbC5lbnZNYXAgPT09IG51bGwgKSA/IHNjZW5lLmVudmlyb25tZW50Um90YXRpb24gOiBtYXRlcmlhbC5lbnZNYXBSb3RhdGlvbjtcclxuXHJcblx0aWYgKCByb3RhdGlvbiApIHtcclxuXHJcblx0XHRfZTEuY29weSggcm90YXRpb24gKTtcclxuXHJcblx0XHRfbTEubWFrZVJvdGF0aW9uRnJvbUV1bGVyKCBfZTEgKTtcclxuXHJcblx0fSBlbHNlIHtcclxuXHJcblx0XHRfbTEuaWRlbnRpdHkoKTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gX20xO1xyXG5cclxufSApO1xyXG4iLCJpbXBvcnQgeyBjYW1lcmFWaWV3TWF0cml4IH0gZnJvbSAnLi9DYW1lcmEuanMnO1xyXG5pbXBvcnQgeyB0cmFuc2Zvcm1lZE5vcm1hbFZpZXcgfSBmcm9tICcuL05vcm1hbC5qcyc7XHJcbmltcG9ydCB7IHBvc2l0aW9uVmlld0RpcmVjdGlvbiB9IGZyb20gJy4vUG9zaXRpb24uanMnO1xyXG5pbXBvcnQgeyBtYXRlcmlhbFJlZnJhY3Rpb25SYXRpbyB9IGZyb20gJy4vTWF0ZXJpYWxQcm9wZXJ0aWVzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGUgcmVmbGVjdCB2ZWN0b3IgaW4gdmlldyBzcGFjZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTx2ZWMzPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCByZWZsZWN0VmlldyA9IC8qQF9fUFVSRV9fKi8gcG9zaXRpb25WaWV3RGlyZWN0aW9uLm5lZ2F0ZSgpLnJlZmxlY3QoIHRyYW5zZm9ybWVkTm9ybWFsVmlldyApO1xyXG5cclxuLyoqXHJcbiAqIFRoZSByZWZyYWN0IHZlY3RvciBpbiB2aWV3IHNwYWNlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtOb2RlPHZlYzM+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHJlZnJhY3RWaWV3ID0gLypAX19QVVJFX18qLyBwb3NpdGlvblZpZXdEaXJlY3Rpb24ubmVnYXRlKCkucmVmcmFjdCggdHJhbnNmb3JtZWROb3JtYWxWaWV3LCBtYXRlcmlhbFJlZnJhY3Rpb25SYXRpbyApO1xyXG5cclxuLyoqXHJcbiAqIFVzZWQgZm9yIHNhbXBsaW5nIGN1YmUgbWFwcyB3aGVuIHVzaW5nIGN1YmUgcmVmbGVjdGlvbiBtYXBwaW5nLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtOb2RlPHZlYzM+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHJlZmxlY3RWZWN0b3IgPSAvKkBfX1BVUkVfXyovIHJlZmxlY3RWaWV3LnRyYW5zZm9ybURpcmVjdGlvbiggY2FtZXJhVmlld01hdHJpeCApLnRvVmFyKCAncmVmbGVjdFZlY3RvcicgKTtcclxuXHJcbi8qKlxyXG4gKiBVc2VkIGZvciBzYW1wbGluZyBjdWJlIG1hcHMgd2hlbiB1c2luZyBjdWJlIHJlZnJhY3Rpb24gbWFwcGluZy5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTx2ZWMzPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCByZWZyYWN0VmVjdG9yID0gLypAX19QVVJFX18qLyByZWZyYWN0Vmlldy50cmFuc2Zvcm1EaXJlY3Rpb24oIGNhbWVyYVZpZXdNYXRyaXggKS50b1ZhciggJ3JlZmxlY3RWZWN0b3InICk7XHJcbiIsImltcG9ydCBUZXh0dXJlTm9kZSBmcm9tICcuL1RleHR1cmVOb2RlLmpzJztcclxuaW1wb3J0IHsgcmVmbGVjdFZlY3RvciwgcmVmcmFjdFZlY3RvciB9IGZyb20gJy4vUmVmbGVjdFZlY3Rvci5qcyc7XHJcbmltcG9ydCB7IG5vZGVQcm94eSwgdmVjMyB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbmltcG9ydCB7IEN1YmVSZWZsZWN0aW9uTWFwcGluZywgQ3ViZVJlZnJhY3Rpb25NYXBwaW5nLCBXZWJHUFVDb29yZGluYXRlU3lzdGVtIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgbWF0ZXJpYWxFbnZSb3RhdGlvbiB9IGZyb20gJy4vTWF0ZXJpYWxQcm9wZXJ0aWVzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIHR5cGUgb2YgdW5pZm9ybSBub2RlIHJlcHJlc2VudHMgYSBjdWJlIHRleHR1cmUuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBUZXh0dXJlTm9kZVxyXG4gKi9cclxuY2xhc3MgQ3ViZVRleHR1cmVOb2RlIGV4dGVuZHMgVGV4dHVyZU5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdDdWJlVGV4dHVyZU5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgY3ViZSB0ZXh0dXJlIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0N1YmVUZXh0dXJlfSB2YWx1ZSAtIFRoZSBjdWJlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHs/Tm9kZTx2ZWMzPn0gW3V2Tm9kZT1udWxsXSAtIFRoZSB1diBub2RlLlxyXG5cdCAqIEBwYXJhbSB7P05vZGU8aW50Pn0gW2xldmVsTm9kZT1udWxsXSAtIFRoZSBsZXZlbCBub2RlLlxyXG5cdCAqIEBwYXJhbSB7P05vZGU8ZmxvYXQ+fSBbYmlhc05vZGU9bnVsbF0gLSBUaGUgYmlhcyBub2RlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCB2YWx1ZSwgdXZOb2RlID0gbnVsbCwgbGV2ZWxOb2RlID0gbnVsbCwgYmlhc05vZGUgPSBudWxsICkge1xyXG5cclxuXHRcdHN1cGVyKCB2YWx1ZSwgdXZOb2RlLCBsZXZlbE5vZGUsIGJpYXNOb2RlICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzQ3ViZVRleHR1cmVOb2RlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBPdmVyd3JpdGVzIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRvIHJldHVybiBhIGZpeGVkIHZhbHVlIGAnY3ViZVRleHR1cmUnYC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgaW5wdXQgdHlwZS5cclxuXHQgKi9cclxuXHRnZXRJbnB1dFR5cGUoIC8qYnVpbGRlciovICkge1xyXG5cclxuXHRcdHJldHVybiAnY3ViZVRleHR1cmUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBkZWZhdWx0IHV2cyBiYXNlZCBvbiB0aGUgbWFwcGluZyB0eXBlIG9mIHRoZSBjdWJlIHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtOb2RlPHZlYzM+fSBUaGUgZGVmYXVsdCB1diBhdHRyaWJ1dGUuXHJcblx0ICovXHJcblx0Z2V0RGVmYXVsdFVWKCkge1xyXG5cclxuXHRcdGNvbnN0IHRleHR1cmUgPSB0aGlzLnZhbHVlO1xyXG5cclxuXHRcdGlmICggdGV4dHVyZS5tYXBwaW5nID09PSBDdWJlUmVmbGVjdGlvbk1hcHBpbmcgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gcmVmbGVjdFZlY3RvcjtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCB0ZXh0dXJlLm1hcHBpbmcgPT09IEN1YmVSZWZyYWN0aW9uTWFwcGluZyApIHtcclxuXHJcblx0XHRcdHJldHVybiByZWZyYWN0VmVjdG9yO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuQ3ViZVRleHR1cmVOb2RlOiBNYXBwaW5nIFwiJXNcIiBub3Qgc3VwcG9ydGVkLicsIHRleHR1cmUubWFwcGluZyApO1xyXG5cclxuXHRcdFx0cmV0dXJuIHZlYzMoIDAsIDAsIDAgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogT3ZlcndyaXR0ZW4gd2l0aCBhbiBlbXB0eSBpbXBsZW1lbnRhdGlvbiBzaW5jZSB0aGUgYHVwZGF0ZU1hdHJpeGAgZmxhZyBpcyBpZ25vcmVkXHJcblx0ICogZm9yIGN1YmUgdGV4dHVyZXMuIFRoZSB1diB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggaXMgbm90IGFwcGxpZWQgdG8gY3ViZSB0ZXh0dXJlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsdWUgLSBUaGUgdXBkYXRlIHRvZ2dsZS5cclxuXHQgKi9cclxuXHRzZXRVcGRhdGVNYXRyaXgoIC8qdXBkYXRlTWF0cml4Ki8gKSB7IH0gLy8gSWdub3JlIC51cGRhdGVNYXRyaXggZm9yIEN1YmVUZXh0dXJlTm9kZVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXR1cHMgdGhlIHV2IG5vZGUuIERlcGVuZGluZyBvbiB0aGUgYmFja2VuZCBhcyB3ZWxsIGFzIHRoZSB0ZXh0dXJlIHR5cGUsIGl0IG1pZ2h0IGJlIG5lY2Vzc2FyeVxyXG5cdCAqIHRvIG1vZGlmeSB0aGUgdXYgbm9kZSBmb3IgY29ycmVjdCBzYW1wbGluZy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHBhcmFtIHtOb2RlfSB1dk5vZGUgLSBUaGUgdXYgbm9kZSB0byBzZXR1cC5cclxuXHQgKiBAcmV0dXJuIHtOb2RlfSBUaGUgdXBkYXRlZCB1diBub2RlLlxyXG5cdCAqL1xyXG5cdHNldHVwVVYoIGJ1aWxkZXIsIHV2Tm9kZSApIHtcclxuXHJcblx0XHRjb25zdCB0ZXh0dXJlID0gdGhpcy52YWx1ZTtcclxuXHJcblx0XHRpZiAoIGJ1aWxkZXIucmVuZGVyZXIuY29vcmRpbmF0ZVN5c3RlbSA9PT0gV2ViR1BVQ29vcmRpbmF0ZVN5c3RlbSB8fCAhIHRleHR1cmUuaXNSZW5kZXJUYXJnZXRUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0dXZOb2RlID0gdmVjMyggdXZOb2RlLngubmVnYXRlKCksIHV2Tm9kZS55eiApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbWF0ZXJpYWxFbnZSb3RhdGlvbi5tdWwoIHV2Tm9kZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyB0aGUgdXYgY29kZSBzbmlwcGV0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcGFyYW0ge05vZGV9IGN1YmVVViAtIFRoZSB1diBub2RlIHRvIGdlbmVyYXRlIGNvZGUgZm9yLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGdlbmVyYXRlZCBjb2RlIHNuaXBwZXQuXHJcblx0ICovXHJcblx0Z2VuZXJhdGVVViggYnVpbGRlciwgY3ViZVVWICkge1xyXG5cclxuXHRcdHJldHVybiBjdWJlVVYuYnVpbGQoIGJ1aWxkZXIsICd2ZWMzJyApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBDdWJlVGV4dHVyZU5vZGU7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIGN1YmUgdGV4dHVyZSBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge0N1YmVUZXh0dXJlfSB2YWx1ZSAtIFRoZSBjdWJlIHRleHR1cmUuXHJcbiAqIEBwYXJhbSB7P05vZGU8dmVjMz59IFt1dk5vZGU9bnVsbF0gLSBUaGUgdXYgbm9kZS5cclxuICogQHBhcmFtIHs/Tm9kZTxpbnQ+fSBbbGV2ZWxOb2RlPW51bGxdIC0gVGhlIGxldmVsIG5vZGUuXHJcbiAqIEBwYXJhbSB7P05vZGU8ZmxvYXQ+fSBbYmlhc05vZGU9bnVsbF0gLSBUaGUgYmlhcyBub2RlLlxyXG4gKiBAcmV0dXJucyB7Q3ViZVRleHR1cmVOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGN1YmVUZXh0dXJlID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIEN1YmVUZXh0dXJlTm9kZSApLnNldFBhcmFtZXRlckxlbmd0aCggMSwgNCApLnNldE5hbWUoICdjdWJlVGV4dHVyZScgKTtcclxuIiwiaW1wb3J0IE5vZGUgZnJvbSAnLi4vY29yZS9Ob2RlLmpzJztcclxuaW1wb3J0IHsgTm9kZVVwZGF0ZVR5cGUgfSBmcm9tICcuLi9jb3JlL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IHVuaWZvcm0gfSBmcm9tICcuLi9jb3JlL1VuaWZvcm1Ob2RlLmpzJztcclxuaW1wb3J0IHsgdGV4dHVyZSB9IGZyb20gJy4vVGV4dHVyZU5vZGUuanMnO1xyXG5pbXBvcnQgeyBjdWJlVGV4dHVyZSB9IGZyb20gJy4vQ3ViZVRleHR1cmVOb2RlLmpzJztcclxuaW1wb3J0IHsgYnVmZmVyIH0gZnJvbSAnLi9CdWZmZXJOb2RlLmpzJztcclxuaW1wb3J0IHsgbm9kZU9iamVjdCB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuaW1wb3J0IHsgdW5pZm9ybUFycmF5IH0gZnJvbSAnLi9Vbmlmb3JtQXJyYXlOb2RlLmpzJztcclxuaW1wb3J0IEFycmF5RWxlbWVudE5vZGUgZnJvbSAnLi4vdXRpbHMvQXJyYXlFbGVtZW50Tm9kZS5qcyc7XHJcblxyXG4vLyBUT0RPOiBBdm9pZCBkdXBsaWNhdGVkIGNvZGUgYW5kIHVlcyBvbmx5IFJlZmVyZW5jZUJhc2VOb2RlIG9yIFJlZmVyZW5jZU5vZGVcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGNsYXNzIGlzIG9ubHkgcmVsZXZhbnQgaWYgdGhlIHJlZmVyZW5jZWQgcHJvcGVydHkgaXMgYXJyYXktbGlrZS5cclxuICogSW4gdGhpcyBjYXNlLCBgUmVmZXJlbmNlRWxlbWVudE5vZGVgIGFsbG93cyB0byByZWZlciB0byBhIHNwZWNpZmljXHJcbiAqIGVsZW1lbnQgaW5zaWRlIHRoZSBkYXRhIHN0cnVjdHVyZSB2aWEgYW4gaW5kZXguXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBBcnJheUVsZW1lbnROb2RlXHJcbiAqL1xyXG5jbGFzcyBSZWZlcmVuY2VFbGVtZW50Tm9kZSBleHRlbmRzIEFycmF5RWxlbWVudE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdSZWZlcmVuY2VFbGVtZW50Tm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyByZWZlcmVuY2UgZWxlbWVudCBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHs/UmVmZXJlbmNlTm9kZX0gcmVmZXJlbmNlTm9kZSAtIFRoZSByZWZlcmVuY2Ugbm9kZS5cclxuXHQgKiBAcGFyYW0ge05vZGV9IGluZGV4Tm9kZSAtIFRoZSBpbmRleCBub2RlIHRoYXQgZGVmaW5lcyB0aGUgZWxlbWVudCBhY2Nlc3MuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHJlZmVyZW5jZU5vZGUsIGluZGV4Tm9kZSApIHtcclxuXHJcblx0XHRzdXBlciggcmVmZXJlbmNlTm9kZSwgaW5kZXhOb2RlICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTaW1pbGFyIHRvIHtAbGluayBSZWZlcmVuY2VOb2RlI3JlZmVyZW5jZX0sIGFuIGFkZGl0aW9uYWxcclxuXHRcdCAqIHByb3BlcnR5IHJlZmVyZW5jZXMgdG8gdGhlIGN1cnJlbnQgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1JlZmVyZW5jZU5vZGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVmZXJlbmNlTm9kZSA9IHJlZmVyZW5jZU5vZGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzUmVmZXJlbmNlRWxlbWVudE5vZGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGlzIG92ZXJ3cml0dGVuIHNpbmNlIHRoZSBub2RlIHR5cGUgaXMgaW5mZXJyZWQgZnJvbVxyXG5cdCAqIHRoZSB1bmlmb3JtIHR5cGUgb2YgdGhlIHJlZmVyZW5jZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgbm9kZSB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldE5vZGVUeXBlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnJlZmVyZW5jZU5vZGUudW5pZm9ybVR5cGU7XHJcblxyXG5cdH1cclxuXHJcblx0Z2VuZXJhdGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3Qgc25pcHBldCA9IHN1cGVyLmdlbmVyYXRlKCBidWlsZGVyICk7XHJcblx0XHRjb25zdCBhcnJheVR5cGUgPSB0aGlzLnJlZmVyZW5jZU5vZGUuZ2V0Tm9kZVR5cGUoKTtcclxuXHRcdGNvbnN0IGVsZW1lbnRUeXBlID0gdGhpcy5nZXROb2RlVHlwZSgpO1xyXG5cclxuXHRcdHJldHVybiBidWlsZGVyLmZvcm1hdCggc25pcHBldCwgYXJyYXlUeXBlLCBlbGVtZW50VHlwZSApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogVGhpcyB0eXBlIG9mIG5vZGUgZXN0YWJsaXNoZXMgYSByZWZlcmVuY2UgdG8gYSBwcm9wZXJ0eSBvZiBhbm90aGVyIG9iamVjdC5cclxuICogSW4gdGhpcyB3YXksIHRoZSB2YWx1ZSBvZiB0aGUgbm9kZSBpcyBhdXRvbWF0aWNhbGx5IGxpbmtlZCB0byB0aGUgdmFsdWUgb2ZcclxuICogcmVmZXJlbmNlZCBvYmplY3QuIFJlZmVyZW5jZSBub2RlcyBpbnRlcm5hbGx5IHJlcHJlc2VudCB0aGUgbGlua2VkIHZhbHVlXHJcbiAqIGFzIGEgdW5pZm9ybS5cclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVcclxuICovXHJcbmNsYXNzIFJlZmVyZW5jZU5vZGUgZXh0ZW5kcyBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnUmVmZXJlbmNlTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyByZWZlcmVuY2Ugbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGUgbm9kZSByZWZlcnMgdG8uXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHVuaWZvcm1UeXBlIC0gVGhlIHVuaWZvcm0gdHlwZSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgcHJvcGVydHkgdmFsdWUuXHJcblx0ICogQHBhcmFtIHs/T2JqZWN0fSBbb2JqZWN0PW51bGxdIC0gVGhlIG9iamVjdCB0aGUgcHJvcGVydHkgYmVsb25ncyB0by5cclxuXHQgKiBAcGFyYW0gez9udW1iZXJ9IFtjb3VudD1udWxsXSAtIFdoZW4gdGhlIGxpbmtlZCBwcm9wZXJ0eSBpcyBhbiBhcnJheS1saWtlLCB0aGlzIHBhcmFtZXRlciBkZWZpbmVzIGl0cyBsZW5ndGguXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHByb3BlcnR5LCB1bmlmb3JtVHlwZSwgb2JqZWN0ID0gbnVsbCwgY291bnQgPSBudWxsICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhlIG5vZGUgcmVmZXJzIHRvLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB1bmlmb3JtIHR5cGUgdGhhdCBzaG91bGQgYmUgdXNlZCB0byByZXByZXNlbnQgdGhlIHByb3BlcnR5IHZhbHVlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudW5pZm9ybVR5cGUgPSB1bmlmb3JtVHlwZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBvYmplY3QgdGhlIHByb3BlcnR5IGJlbG9uZ3MgdG8uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9PYmplY3R9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMub2JqZWN0ID0gb2JqZWN0O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hlbiB0aGUgbGlua2VkIHByb3BlcnR5IGlzIGFuIGFycmF5LCB0aGlzIHBhcmFtZXRlciBkZWZpbmVzIGl0cyBsZW5ndGguXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9udW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY291bnQgPSBjb3VudDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBwcm9wZXJ0eSBuYW1lIG1pZ2h0IGhhdmUgZG90cyBzbyBuZXN0ZWQgcHJvcGVydGllcyBjYW4gYmUgcmVmZXJyZWQuXHJcblx0XHQgKiBUaGUgaGllcmFyY2h5IG9mIHRoZSBuYW1lcyBpcyBzdG9yZWQgaW5zaWRlIHRoaXMgYXJyYXkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PHN0cmluZz59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucHJvcGVydGllcyA9IHByb3BlcnR5LnNwbGl0KCAnLicgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFBvaW50cyB0byB0aGUgY3VycmVudCByZWZlcnJlZCBvYmplY3QuIFRoaXMgcHJvcGVydHkgZXhpc3RzIG5leHQgdG8ge0BsaW5rIFJlZmVyZW5jZU5vZGUjb2JqZWN0fVxyXG5cdFx0ICogc2luY2UgdGhlIGZpbmFsIHJlZmVyZW5jZSBtaWdodCBiZSB1cGRhdGVkIGZyb20gY2FsbGluZyBjb2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/T2JqZWN0fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJlZmVyZW5jZSA9IG9iamVjdDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB1bmlmb3JtIG5vZGUgdGhhdCBob2xkcyB0aGUgdmFsdWUgb2YgdGhlIHJlZmVyZW5jZSBub2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtVbmlmb3JtTm9kZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub2RlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB1bmlmb3JtIGdyb3VwIG9mIHRoZSBpbnRlcm5hbCB1bmlmb3JtLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtVbmlmb3JtR3JvdXBOb2RlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdyb3VwID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIG9wdGlvbmFsIGxhYmVsIG9mIHRoZSBpbnRlcm5hbCB1bmlmb3JtIG5vZGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9zdHJpbmd9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubmFtZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBPdmVyd3JpdHRlbiBzaW5jZSByZWZlcmVuY2Ugbm9kZXMgYXJlIHVwZGF0ZWQgcGVyIG9iamVjdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICogQGRlZmF1bHQgJ29iamVjdCdcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51cGRhdGVUeXBlID0gTm9kZVVwZGF0ZVR5cGUuT0JKRUNUO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdoZW4gdGhlIHJlZmVycmVkIHByb3BlcnR5IGlzIGFycmF5LWxpa2UsIHRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkXHJcblx0ICogdG8gYWNjZXNzIGVsZW1lbnRzIHZpYSBhbiBpbmRleCBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtJbmRleE5vZGV9IGluZGV4Tm9kZSAtIGluZGV4Tm9kZS5cclxuXHQgKiBAcmV0dXJuIHtSZWZlcmVuY2VFbGVtZW50Tm9kZX0gQSByZWZlcmVuY2UgdG8gYW4gZWxlbWVudC5cclxuXHQgKi9cclxuXHRlbGVtZW50KCBpbmRleE5vZGUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5vZGVPYmplY3QoIG5ldyBSZWZlcmVuY2VFbGVtZW50Tm9kZSggdGhpcywgbm9kZU9iamVjdCggaW5kZXhOb2RlICkgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHVuaWZvcm0gZ3JvdXAgZm9yIHRoaXMgcmVmZXJlbmNlIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1VuaWZvcm1Hcm91cE5vZGV9IGdyb3VwIC0gVGhlIHVuaWZvcm0gZ3JvdXAgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge1JlZmVyZW5jZU5vZGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbm9kZS5cclxuXHQgKi9cclxuXHRzZXRHcm91cCggZ3JvdXAgKSB7XHJcblxyXG5cdFx0dGhpcy5ncm91cCA9IGdyb3VwO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGxhYmVsIGZvciB0aGUgaW50ZXJuYWwgdW5pZm9ybS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIGxhYmVsIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtSZWZlcmVuY2VOb2RlfSBBIHJlZmVyZW5jZSB0byB0aGlzIG5vZGUuXHJcblx0ICovXHJcblx0bGFiZWwoIG5hbWUgKSB7XHJcblxyXG5cdFx0dGhpcy5uYW1lID0gbmFtZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBub2RlIHR5cGUgd2hpY2ggYXV0b21hdGljYWxseSBkZWZpbmVzIHRoZSBpbnRlcm5hbFxyXG5cdCAqIHVuaWZvcm0gdHlwZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB1bmlmb3JtVHlwZSAtIFRoZSB0eXBlIHRvIHNldC5cclxuXHQgKi9cclxuXHRzZXROb2RlVHlwZSggdW5pZm9ybVR5cGUgKSB7XHJcblxyXG5cdFx0bGV0IG5vZGUgPSBudWxsO1xyXG5cclxuXHRcdGlmICggdGhpcy5jb3VudCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdG5vZGUgPSBidWZmZXIoIG51bGwsIHVuaWZvcm1UeXBlLCB0aGlzLmNvdW50ICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggQXJyYXkuaXNBcnJheSggdGhpcy5nZXRWYWx1ZUZyb21SZWZlcmVuY2UoKSApICkge1xyXG5cclxuXHRcdFx0bm9kZSA9IHVuaWZvcm1BcnJheSggbnVsbCwgdW5pZm9ybVR5cGUgKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCB1bmlmb3JtVHlwZSA9PT0gJ3RleHR1cmUnICkge1xyXG5cclxuXHRcdFx0bm9kZSA9IHRleHR1cmUoIG51bGwgKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCB1bmlmb3JtVHlwZSA9PT0gJ2N1YmVUZXh0dXJlJyApIHtcclxuXHJcblx0XHRcdG5vZGUgPSBjdWJlVGV4dHVyZSggbnVsbCApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRub2RlID0gdW5pZm9ybSggbnVsbCwgdW5pZm9ybVR5cGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aGlzLmdyb3VwICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0bm9kZS5zZXRHcm91cCggdGhpcy5ncm91cCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMubmFtZSAhPT0gbnVsbCApIG5vZGUubGFiZWwoIHRoaXMubmFtZSApO1xyXG5cclxuXHRcdHRoaXMubm9kZSA9IG5vZGUuZ2V0U2VsZigpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGlzIG92ZXJ3cml0dGVuIHNpbmNlIHRoZSBub2RlIHR5cGUgaXMgaW5mZXJyZWQgZnJvbVxyXG5cdCAqIHRoZSB0eXBlIG9mIHRoZSByZWZlcmVuY2Ugbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgbm9kZSB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldE5vZGVUeXBlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5ub2RlID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy51cGRhdGVSZWZlcmVuY2UoIGJ1aWxkZXIgKTtcclxuXHRcdFx0dGhpcy51cGRhdGVWYWx1ZSgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcy5ub2RlLmdldE5vZGVUeXBlKCBidWlsZGVyICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUgZnJvbSB0aGUgZ2l2ZW4gcmVmZXJyZWQgb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9dGhpcy5yZWZlcmVuY2VdIC0gVGhlIG9iamVjdCB0byByZXRyaWV2ZSB0aGUgcHJvcGVydHkgdmFsdWUgZnJvbS5cclxuXHQgKiBAcmV0dXJuIHthbnl9IFRoZSB2YWx1ZS5cclxuXHQgKi9cclxuXHRnZXRWYWx1ZUZyb21SZWZlcmVuY2UoIG9iamVjdCA9IHRoaXMucmVmZXJlbmNlICkge1xyXG5cclxuXHRcdGNvbnN0IHsgcHJvcGVydGllcyB9ID0gdGhpcztcclxuXHJcblx0XHRsZXQgdmFsdWUgPSBvYmplY3RbIHByb3BlcnRpZXNbIDAgXSBdO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMTsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0dmFsdWUgPSB2YWx1ZVsgcHJvcGVydGllc1sgaSBdIF07XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBbGxvd3MgdG8gdXBkYXRlIHRoZSByZWZlcmVuY2UgYmFzZWQgb24gdGhlIGdpdmVuIHN0YXRlLiBUaGUgc3RhdGUgaXMgb25seVxyXG5cdCAqIGV2YWx1YXRlZCB7QGxpbmsgUmVmZXJlbmNlTm9kZSNvYmplY3R9IGlzIG5vdCBzZXQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geyhOb2RlRnJhbWV8Tm9kZUJ1aWxkZXIpfSBzdGF0ZSAtIFRoZSBjdXJyZW50IHN0YXRlLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdH0gVGhlIHVwZGF0ZWQgcmVmZXJlbmNlLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZVJlZmVyZW5jZSggc3RhdGUgKSB7XHJcblxyXG5cdFx0dGhpcy5yZWZlcmVuY2UgPSB0aGlzLm9iamVjdCAhPT0gbnVsbCA/IHRoaXMub2JqZWN0IDogc3RhdGUub2JqZWN0O1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnJlZmVyZW5jZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgb3V0cHV0IG9mIHRoZSByZWZlcmVuY2Ugbm9kZSBpcyB0aGUgaW50ZXJuYWwgdW5pZm9ybSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtVbmlmb3JtTm9kZX0gVGhlIG91dHB1dCBub2RlLlxyXG5cdCAqL1xyXG5cdHNldHVwKCAvKiBidWlsZGVyICovICkge1xyXG5cclxuXHRcdHRoaXMudXBkYXRlVmFsdWUoKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5ub2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE92ZXJ3cml0dGVuIHRvIHRvIHVwZGF0ZSB0aGUgaW50ZXJuYWwgdW5pZm9ybSB2YWx1ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUZyYW1lfSBmcmFtZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IG5vZGUgZnJhbWUuXHJcblx0ICovXHJcblx0dXBkYXRlKCAvKmZyYW1lKi8gKSB7XHJcblxyXG5cdFx0dGhpcy51cGRhdGVWYWx1ZSgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHJpZXZlcyB0aGUgdmFsdWUgZnJvbSB0aGUgcmVmZXJyZWQgb2JqZWN0IHByb3BlcnR5IGFuZCB1c2VzIGl0XHJcblx0ICogdG8gdXBkYXRlZCB0aGUgaW50ZXJuYWwgdW5pZm9ybS5cclxuXHQgKi9cclxuXHR1cGRhdGVWYWx1ZSgpIHtcclxuXHJcblx0XHRpZiAoIHRoaXMubm9kZSA9PT0gbnVsbCApIHRoaXMuc2V0Tm9kZVR5cGUoIHRoaXMudW5pZm9ybVR5cGUgKTtcclxuXHJcblx0XHRjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWVGcm9tUmVmZXJlbmNlKCk7XHJcblxyXG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCB2YWx1ZSApICkge1xyXG5cclxuXHRcdFx0dGhpcy5ub2RlLmFycmF5ID0gdmFsdWU7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHRoaXMubm9kZS52YWx1ZSA9IHZhbHVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUmVmZXJlbmNlTm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgcmVmZXJlbmNlIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoZSBub2RlIHJlZmVycyB0by5cclxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBUaGUgdW5pZm9ybSB0eXBlIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBwcm9wZXJ0eSB2YWx1ZS5cclxuICogQHBhcmFtIHs/T2JqZWN0fSBbb2JqZWN0XSAtIFRoZSBvYmplY3QgdGhlIHByb3BlcnR5IGJlbG9uZ3MgdG8uXHJcbiAqIEByZXR1cm5zIHtSZWZlcmVuY2VOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHJlZmVyZW5jZSA9ICggbmFtZSwgdHlwZSwgb2JqZWN0ICkgPT4gbm9kZU9iamVjdCggbmV3IFJlZmVyZW5jZU5vZGUoIG5hbWUsIHR5cGUsIG9iamVjdCApICk7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIHJlZmVyZW5jZSBub2RlLiBVc2UgdGhpcyBmdW5jdGlvbiBpZiB5b3Ugd2FudCBuZWVkIGEgcmVmZXJlbmNlXHJcbiAqIHRvIGFuIGFycmF5LWxpa2UgcHJvcGVydHkgdGhhdCBzaG91bGQgYmUgcmVwcmVzZW50ZWQgYXMgYSB1bmlmb3JtIGJ1ZmZlci5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhlIG5vZGUgcmVmZXJzIHRvLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSB1bmlmb3JtIHR5cGUgdGhhdCBzaG91bGQgYmUgdXNlZCB0byByZXByZXNlbnQgdGhlIHByb3BlcnR5IHZhbHVlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gY291bnQgLSBUaGUgbnVtYmVyIG9mIHZhbHVlIGluc2lkZSB0aGUgYXJyYXktbGlrZSBvYmplY3QuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgLSBBbiBhcnJheS1saWtlIG9iamVjdCB0aGUgcHJvcGVydHkgYmVsb25ncyB0by5cclxuICogQHJldHVybnMge1JlZmVyZW5jZU5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcmVmZXJlbmNlQnVmZmVyID0gKCBuYW1lLCB0eXBlLCBjb3VudCwgb2JqZWN0ICkgPT4gbm9kZU9iamVjdCggbmV3IFJlZmVyZW5jZU5vZGUoIG5hbWUsIHR5cGUsIG9iamVjdCwgY291bnQgKSApO1xyXG4iLCJpbXBvcnQgUmVmZXJlbmNlTm9kZSBmcm9tICcuL1JlZmVyZW5jZU5vZGUuanMnO1xyXG5pbXBvcnQgeyBub2RlT2JqZWN0IH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgbm9kZSBpcyBhIHNwZWNpYWwgdHlwZSBvZiByZWZlcmVuY2Ugbm9kZSB3aGljaCBpcyBpbnRlbmRlZFxyXG4gKiBmb3IgbGlua2luZyBtYXRlcmlhbCBwcm9wZXJ0aWVzIHdpdGggbm9kZSB2YWx1ZXMuXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IG9wYWNpdHlOb2RlID0gbWF0ZXJpYWxSZWZlcmVuY2UoICdvcGFjaXR5JywgJ2Zsb2F0JywgbWF0ZXJpYWwgKTtcclxuICogYGBgXHJcbiAqIFdoZW4gY2hhbmdpbmcgYG1hdGVyaWFsLm9wYWNpdHlgLCB0aGUgbm9kZSB2YWx1ZSBvZiBgb3BhY2l0eU5vZGVgIHdpbGxcclxuICogYXV0b21hdGljYWxseSBiZSB1cGRhdGVkLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgUmVmZXJlbmNlTm9kZVxyXG4gKi9cclxuY2xhc3MgTWF0ZXJpYWxSZWZlcmVuY2VOb2RlIGV4dGVuZHMgUmVmZXJlbmNlTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ01hdGVyaWFsUmVmZXJlbmNlTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBtYXRlcmlhbCByZWZlcmVuY2Ugbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGUgbm9kZSByZWZlcnMgdG8uXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGlucHV0VHlwZSAtIFRoZSB1bmlmb3JtIHR5cGUgdGhhdCBzaG91bGQgYmUgdXNlZCB0byByZXByZXNlbnQgdGhlIHByb3BlcnR5IHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7P01hdGVyaWFsfSBbbWF0ZXJpYWw9bnVsbF0gLSBUaGUgbWF0ZXJpYWwgdGhlIHByb3BlcnR5IGJlbG9uZ3MgdG8uIFdoZW4gbm8gbWF0ZXJpYWwgaXMgc2V0LFxyXG5cdCAqIHRoZSBub2RlIHJlZmVycyB0byB0aGUgbWF0ZXJpYWwgb2YgdGhlIGN1cnJlbnQgcmVuZGVyZWQgb2JqZWN0LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwcm9wZXJ0eSwgaW5wdXRUeXBlLCBtYXRlcmlhbCA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoIHByb3BlcnR5LCBpbnB1dFR5cGUsIG1hdGVyaWFsICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbWF0ZXJpYWwgdGhlIHByb3BlcnR5IGJlbG9uZ3MgdG8uIFdoZW4gbm8gbWF0ZXJpYWwgaXMgc2V0LFxyXG5cdFx0ICogdGhlIG5vZGUgcmVmZXJzIHRvIHRoZSBtYXRlcmlhbCBvZiB0aGUgY3VycmVudCByZW5kZXJlZCBvYmplY3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9NYXRlcmlhbH1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tYXRlcmlhbCA9IG1hdGVyaWFsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc01hdGVyaWFsUmVmZXJlbmNlTm9kZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgcmVmZXJlbmNlIGJhc2VkIG9uIHRoZSBnaXZlbiBzdGF0ZS4gVGhlIHN0YXRlIGlzIG9ubHkgZXZhbHVhdGVkXHJcblx0ICoge0BsaW5rIE1hdGVyaWFsUmVmZXJlbmNlTm9kZSNtYXRlcmlhbH0gaXMgbm90IHNldC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7KE5vZGVGcmFtZXxOb2RlQnVpbGRlcil9IHN0YXRlIC0gVGhlIGN1cnJlbnQgc3RhdGUuXHJcblx0ICogQHJldHVybiB7T2JqZWN0fSBUaGUgdXBkYXRlZCByZWZlcmVuY2UuXHJcblx0ICovXHJcblx0dXBkYXRlUmVmZXJlbmNlKCBzdGF0ZSApIHtcclxuXHJcblx0XHR0aGlzLnJlZmVyZW5jZSA9IHRoaXMubWF0ZXJpYWwgIT09IG51bGwgPyB0aGlzLm1hdGVyaWFsIDogc3RhdGUubWF0ZXJpYWw7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMucmVmZXJlbmNlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBNYXRlcmlhbFJlZmVyZW5jZU5vZGU7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIG1hdGVyaWFsIHJlZmVyZW5jZSBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGUgbm9kZSByZWZlcnMgdG8uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIHVuaWZvcm0gdHlwZSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgcHJvcGVydHkgdmFsdWUuXHJcbiAqIEBwYXJhbSB7P01hdGVyaWFsfSBbbWF0ZXJpYWw9bnVsbF0gLSBUaGUgbWF0ZXJpYWwgdGhlIHByb3BlcnR5IGJlbG9uZ3MgdG8uXHJcbiAqIFdoZW4gbm8gbWF0ZXJpYWwgaXMgc2V0LCB0aGUgbm9kZSByZWZlcnMgdG8gdGhlIG1hdGVyaWFsIG9mIHRoZSBjdXJyZW50IHJlbmRlcmVkIG9iamVjdC5cclxuICogQHJldHVybnMge01hdGVyaWFsUmVmZXJlbmNlTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBtYXRlcmlhbFJlZmVyZW5jZSA9ICggbmFtZSwgdHlwZSwgbWF0ZXJpYWwgPSBudWxsICkgPT4gbm9kZU9iamVjdCggbmV3IE1hdGVyaWFsUmVmZXJlbmNlTm9kZSggbmFtZSwgdHlwZSwgbWF0ZXJpYWwgKSApO1xyXG4iLCJpbXBvcnQgeyBhdHRyaWJ1dGUgfSBmcm9tICcuLi9jb3JlL0F0dHJpYnV0ZU5vZGUuanMnO1xyXG5pbXBvcnQgeyBjYW1lcmFWaWV3TWF0cml4IH0gZnJvbSAnLi9DYW1lcmEuanMnO1xyXG5pbXBvcnQgeyBtb2RlbFZpZXdNYXRyaXggfSBmcm9tICcuL01vZGVsTm9kZS5qcyc7XHJcbmltcG9ydCB7IEZuLCB2ZWM0IH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSB0YW5nZW50IGF0dHJpYnV0ZSBvZiB0aGUgY3VycmVudCByZW5kZXJlZCBvYmplY3QuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8dmVjND59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdGFuZ2VudEdlb21ldHJ5ID0gLypAX19QVVJFX18qLyBGbiggKCBidWlsZGVyICkgPT4ge1xyXG5cclxuXHRpZiAoIGJ1aWxkZXIuZ2VvbWV0cnkuaGFzQXR0cmlidXRlKCAndGFuZ2VudCcgKSA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0YnVpbGRlci5nZW9tZXRyeS5jb21wdXRlVGFuZ2VudHMoKTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gYXR0cmlidXRlKCAndGFuZ2VudCcsICd2ZWM0JyApO1xyXG5cclxufSApKCk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHZlcnRleCB0YW5nZW50IGluIGxvY2FsIHNwYWNlIG9mIHRoZSBjdXJyZW50IHJlbmRlcmVkIG9iamVjdC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTx2ZWMzPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCB0YW5nZW50TG9jYWwgPSAvKkBfX1BVUkVfXyovIHRhbmdlbnRHZW9tZXRyeS54eXoudG9WYXIoICd0YW5nZW50TG9jYWwnICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHZlcnRleCB0YW5nZW50IGluIHZpZXcgc3BhY2Ugb2YgdGhlIGN1cnJlbnQgcmVuZGVyZWQgb2JqZWN0LlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtOb2RlPHZlYzM+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHRhbmdlbnRWaWV3ID0gLypAX19QVVJFX18qLyBtb2RlbFZpZXdNYXRyaXgubXVsKCB2ZWM0KCB0YW5nZW50TG9jYWwsIDAgKSApLnh5ei50b1ZhcnlpbmcoICd2X3RhbmdlbnRWaWV3JyApLm5vcm1hbGl6ZSgpLnRvVmFyKCAndGFuZ2VudFZpZXcnICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHZlcnRleCB0YW5nZW50IGluIHdvcmxkIHNwYWNlIG9mIHRoZSBjdXJyZW50IHJlbmRlcmVkIG9iamVjdC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTx2ZWMzPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCB0YW5nZW50V29ybGQgPSAvKkBfX1BVUkVfXyovIHRhbmdlbnRWaWV3LnRyYW5zZm9ybURpcmVjdGlvbiggY2FtZXJhVmlld01hdHJpeCApLnRvVmFyeWluZyggJ3ZfdGFuZ2VudFdvcmxkJyApLm5vcm1hbGl6ZSgpLnRvVmFyKCAndGFuZ2VudFdvcmxkJyApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSB0cmFuc2Zvcm1lZCB2ZXJ0ZXggdGFuZ2VudCBpbiB2aWV3IHNwYWNlIG9mIHRoZSBjdXJyZW50IHJlbmRlcmVkIG9iamVjdC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTx2ZWMzPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCB0cmFuc2Zvcm1lZFRhbmdlbnRWaWV3ID0gLypAX19QVVJFX18qLyB0YW5nZW50Vmlldy50b1ZhciggJ3RyYW5zZm9ybWVkVGFuZ2VudFZpZXcnICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHRyYW5zZm9ybWVkIHZlcnRleCB0YW5nZW50IGluIHdvcmxkIHNwYWNlIG9mIHRoZSBjdXJyZW50IHJlbmRlcmVkIG9iamVjdC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTx2ZWMzPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCB0cmFuc2Zvcm1lZFRhbmdlbnRXb3JsZCA9IC8qQF9fUFVSRV9fKi8gdHJhbnNmb3JtZWRUYW5nZW50Vmlldy50cmFuc2Zvcm1EaXJlY3Rpb24oIGNhbWVyYVZpZXdNYXRyaXggKS5ub3JtYWxpemUoKS50b1ZhciggJ3RyYW5zZm9ybWVkVGFuZ2VudFdvcmxkJyApO1xyXG4iLCJpbXBvcnQgeyB2YXJ5aW5nIH0gZnJvbSAnLi4vY29yZS9WYXJ5aW5nTm9kZS5qcyc7XHJcbmltcG9ydCB7IGNhbWVyYVZpZXdNYXRyaXggfSBmcm9tICcuL0NhbWVyYS5qcyc7XHJcbmltcG9ydCB7IG5vcm1hbEdlb21ldHJ5LCBub3JtYWxMb2NhbCwgbm9ybWFsVmlldywgbm9ybWFsV29ybGQsIHRyYW5zZm9ybWVkTm9ybWFsVmlldyB9IGZyb20gJy4vTm9ybWFsLmpzJztcclxuaW1wb3J0IHsgdGFuZ2VudEdlb21ldHJ5LCB0YW5nZW50TG9jYWwsIHRhbmdlbnRWaWV3LCB0YW5nZW50V29ybGQsIHRyYW5zZm9ybWVkVGFuZ2VudFZpZXcgfSBmcm9tICcuL1RhbmdlbnQuanMnO1xyXG5cclxuY29uc3QgZ2V0Qml0YW5nZW50ID0gKCBjcm9zc05vcm1hbFRhbmdlbnQgKSA9PiBjcm9zc05vcm1hbFRhbmdlbnQubXVsKCB0YW5nZW50R2VvbWV0cnkudyApLnh5ejtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgYml0YW5nZW50IGF0dHJpYnV0ZSBvZiB0aGUgY3VycmVudCByZW5kZXJlZCBvYmplY3QuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8dmVjMz59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYml0YW5nZW50R2VvbWV0cnkgPSAvKkBfX1BVUkVfXyovIHZhcnlpbmcoIGdldEJpdGFuZ2VudCggbm9ybWFsR2VvbWV0cnkuY3Jvc3MoIHRhbmdlbnRHZW9tZXRyeSApICksICd2X2JpdGFuZ2VudEdlb21ldHJ5JyApLm5vcm1hbGl6ZSgpLnRvVmFyKCAnYml0YW5nZW50R2VvbWV0cnknICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHZlcnRleCBiaXRhbmdlbnQgaW4gbG9jYWwgc3BhY2Ugb2YgdGhlIGN1cnJlbnQgcmVuZGVyZWQgb2JqZWN0LlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtOb2RlPHZlYzM+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGJpdGFuZ2VudExvY2FsID0gLypAX19QVVJFX18qLyB2YXJ5aW5nKCBnZXRCaXRhbmdlbnQoIG5vcm1hbExvY2FsLmNyb3NzKCB0YW5nZW50TG9jYWwgKSApLCAndl9iaXRhbmdlbnRMb2NhbCcgKS5ub3JtYWxpemUoKS50b1ZhciggJ2JpdGFuZ2VudExvY2FsJyApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSB2ZXJ0ZXggYml0YW5nZW50IGluIHZpZXcgc3BhY2Ugb2YgdGhlIGN1cnJlbnQgcmVuZGVyZWQgb2JqZWN0LlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtOb2RlPHZlYzQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGJpdGFuZ2VudFZpZXcgPSAvKkBfX1BVUkVfXyovIHZhcnlpbmcoIGdldEJpdGFuZ2VudCggbm9ybWFsVmlldy5jcm9zcyggdGFuZ2VudFZpZXcgKSApLCAndl9iaXRhbmdlbnRWaWV3JyApLm5vcm1hbGl6ZSgpLnRvVmFyKCAnYml0YW5nZW50VmlldycgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgdmVydGV4IGJpdGFuZ2VudCBpbiB3b3JsZCBzcGFjZSBvZiB0aGUgY3VycmVudCByZW5kZXJlZCBvYmplY3QuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8dmVjND59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYml0YW5nZW50V29ybGQgPSAvKkBfX1BVUkVfXyovIHZhcnlpbmcoIGdldEJpdGFuZ2VudCggbm9ybWFsV29ybGQuY3Jvc3MoIHRhbmdlbnRXb3JsZCApICksICd2X2JpdGFuZ2VudFdvcmxkJyApLm5vcm1hbGl6ZSgpLnRvVmFyKCAnYml0YW5nZW50V29ybGQnICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHRyYW5zZm9ybWVkIHZlcnRleCBiaXRhbmdlbnQgaW4gdmlldyBzcGFjZSBvZiB0aGUgY3VycmVudCByZW5kZXJlZCBvYmplY3QuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8dmVjND59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdHJhbnNmb3JtZWRCaXRhbmdlbnRWaWV3ID0gLypAX19QVVJFX18qLyBnZXRCaXRhbmdlbnQoIHRyYW5zZm9ybWVkTm9ybWFsVmlldy5jcm9zcyggdHJhbnNmb3JtZWRUYW5nZW50VmlldyApICkubm9ybWFsaXplKCkudG9WYXIoICd0cmFuc2Zvcm1lZEJpdGFuZ2VudFZpZXcnICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHRyYW5zZm9ybWVkIHZlcnRleCBiaXRhbmdlbnQgaW4gd29ybGQgc3BhY2Ugb2YgdGhlIGN1cnJlbnQgcmVuZGVyZWQgb2JqZWN0LlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtOb2RlPHZlYzQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHRyYW5zZm9ybWVkQml0YW5nZW50V29ybGQgPSAvKkBfX1BVUkVfXyovIHRyYW5zZm9ybWVkQml0YW5nZW50Vmlldy50cmFuc2Zvcm1EaXJlY3Rpb24oIGNhbWVyYVZpZXdNYXRyaXggKS5ub3JtYWxpemUoKS50b1ZhciggJ3RyYW5zZm9ybWVkQml0YW5nZW50V29ybGQnICk7XHJcbiIsImltcG9ydCB7IGJpdGFuZ2VudFZpZXcgfSBmcm9tICcuL0JpdGFuZ2VudC5qcyc7XHJcbmltcG9ydCB7IG5vcm1hbFZpZXcsIHRyYW5zZm9ybWVkTm9ybWFsVmlldyB9IGZyb20gJy4vTm9ybWFsLmpzJztcclxuaW1wb3J0IHsgdGFuZ2VudFZpZXcgfSBmcm9tICcuL1RhbmdlbnQuanMnO1xyXG5pbXBvcnQgeyBtYXQzIH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5pbXBvcnQgeyBtaXggfSBmcm9tICcuLi9tYXRoL01hdGhOb2RlLmpzJztcclxuaW1wb3J0IHsgYW5pc290cm9weSwgYW5pc290cm9weUIsIHJvdWdobmVzcyB9IGZyb20gJy4uL2NvcmUvUHJvcGVydHlOb2RlLmpzJztcclxuaW1wb3J0IHsgcG9zaXRpb25WaWV3RGlyZWN0aW9uIH0gZnJvbSAnLi9Qb3NpdGlvbi5qcyc7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIFRCTiBtYXRyaXggaW4gdmlldyBzcGFjZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTxtYXQzPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBUQk5WaWV3TWF0cml4ID0gLypAX19QVVJFX18qLyBtYXQzKCB0YW5nZW50VmlldywgYml0YW5nZW50Vmlldywgbm9ybWFsVmlldyApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBwYXJhbGxheCBkaXJlY3Rpb24uXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8bWF0Mz59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcGFyYWxsYXhEaXJlY3Rpb24gPSAvKkBfX1BVUkVfXyovIHBvc2l0aW9uVmlld0RpcmVjdGlvbi5tdWwoIFRCTlZpZXdNYXRyaXggKS8qLm5vcm1hbGl6ZSgpKi87XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjb21wdXRpbmcgcGFyYWxsYXggdXYgY29vcmRpbmF0ZXMuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMyPn0gdXYgLSBBIHV2IG5vZGUuXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMyPn0gc2NhbGUgLSBBIHNjYWxlIG5vZGUuXHJcbiAqIEByZXR1cm5zIHtOb2RlPHZlYzI+fSBQYXJhbGxheCB1diBjb29yZGluYXRlcy5cclxuICovXHJcbmV4cG9ydCBjb25zdCBwYXJhbGxheFVWID0gKCB1diwgc2NhbGUgKSA9PiB1di5zdWIoIHBhcmFsbGF4RGlyZWN0aW9uLm11bCggc2NhbGUgKSApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY29tcHV0aW5nIGJlbnQgbm9ybWFscy5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHJldHVybnMge05vZGU8dmVjMz59IEJlbnQgbm9ybWFscy5cclxuICovXHJcbmV4cG9ydCBjb25zdCB0cmFuc2Zvcm1lZEJlbnROb3JtYWxWaWV3ID0gLypAX19QVVJFX18qLyAoICgpID0+IHtcclxuXHJcblx0Ly8gaHR0cHM6Ly9nb29nbGUuZ2l0aHViLmlvL2ZpbGFtZW50L0ZpbGFtZW50Lm1kLmh0bWwjbGlnaHRpbmcvaW1hZ2ViYXNlZGxpZ2h0cy9hbmlzb3Ryb3B5XHJcblxyXG5cdGxldCBiZW50Tm9ybWFsID0gYW5pc290cm9weUIuY3Jvc3MoIHBvc2l0aW9uVmlld0RpcmVjdGlvbiApO1xyXG5cdGJlbnROb3JtYWwgPSBiZW50Tm9ybWFsLmNyb3NzKCBhbmlzb3Ryb3B5QiApLm5vcm1hbGl6ZSgpO1xyXG5cdGJlbnROb3JtYWwgPSBtaXgoIGJlbnROb3JtYWwsIHRyYW5zZm9ybWVkTm9ybWFsVmlldywgYW5pc290cm9weS5tdWwoIHJvdWdobmVzcy5vbmVNaW51cygpICkub25lTWludXMoKS5wb3cyKCkucG93MigpICkubm9ybWFsaXplKCk7XHJcblxyXG5cdHJldHVybiBiZW50Tm9ybWFsO1xyXG5cclxuXHJcbn0gKSgpO1xyXG4iLCJpbXBvcnQgVGVtcE5vZGUgZnJvbSAnLi4vY29yZS9UZW1wTm9kZS5qcyc7XHJcbmltcG9ydCB7IGFkZCB9IGZyb20gJy4uL21hdGgvT3BlcmF0b3JOb2RlLmpzJztcclxuXHJcbmltcG9ydCB7IG5vcm1hbFZpZXcsIHRyYW5zZm9ybU5vcm1hbFRvVmlldyB9IGZyb20gJy4uL2FjY2Vzc29ycy9Ob3JtYWwuanMnO1xyXG5pbXBvcnQgeyBwb3NpdGlvblZpZXcgfSBmcm9tICcuLi9hY2Nlc3NvcnMvUG9zaXRpb24uanMnO1xyXG5pbXBvcnQgeyBUQk5WaWV3TWF0cml4IH0gZnJvbSAnLi4vYWNjZXNzb3JzL0FjY2Vzc29yc1V0aWxzLmpzJztcclxuaW1wb3J0IHsgdXYgfSBmcm9tICcuLi9hY2Nlc3NvcnMvVVYuanMnO1xyXG5pbXBvcnQgeyBmYWNlRGlyZWN0aW9uIH0gZnJvbSAnLi9Gcm9udEZhY2luZ05vZGUuanMnO1xyXG5pbXBvcnQgeyBGbiwgbm9kZVByb3h5LCB2ZWMzIH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5cclxuaW1wb3J0IHsgVGFuZ2VudFNwYWNlTm9ybWFsTWFwLCBPYmplY3RTcGFjZU5vcm1hbE1hcCB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcblxyXG4vLyBOb3JtYWwgTWFwcGluZyBXaXRob3V0IFByZWNvbXB1dGVkIFRhbmdlbnRzXHJcbi8vIGh0dHA6Ly93d3cudGhldGVudGhwbGFuZXQuZGUvYXJjaGl2ZXMvMTE4MFxyXG5cclxuY29uc3QgcGVydHVyYk5vcm1hbDJBcmIgPSAvKkBfX1BVUkVfXyovIEZuKCAoIGlucHV0cyApID0+IHtcclxuXHJcblx0Y29uc3QgeyBleWVfcG9zLCBzdXJmX25vcm0sIG1hcE4sIHV2IH0gPSBpbnB1dHM7XHJcblxyXG5cdGNvbnN0IHEwID0gZXllX3Bvcy5kRmR4KCk7XHJcblx0Y29uc3QgcTEgPSBleWVfcG9zLmRGZHkoKTtcclxuXHRjb25zdCBzdDAgPSB1di5kRmR4KCk7XHJcblx0Y29uc3Qgc3QxID0gdXYuZEZkeSgpO1xyXG5cclxuXHRjb25zdCBOID0gc3VyZl9ub3JtOyAvLyBub3JtYWxpemVkXHJcblxyXG5cdGNvbnN0IHExcGVycCA9IHExLmNyb3NzKCBOICk7XHJcblx0Y29uc3QgcTBwZXJwID0gTi5jcm9zcyggcTAgKTtcclxuXHJcblx0Y29uc3QgVCA9IHExcGVycC5tdWwoIHN0MC54ICkuYWRkKCBxMHBlcnAubXVsKCBzdDEueCApICk7XHJcblx0Y29uc3QgQiA9IHExcGVycC5tdWwoIHN0MC55ICkuYWRkKCBxMHBlcnAubXVsKCBzdDEueSApICk7XHJcblxyXG5cdGNvbnN0IGRldCA9IFQuZG90KCBUICkubWF4KCBCLmRvdCggQiApICk7XHJcblx0Y29uc3Qgc2NhbGUgPSBmYWNlRGlyZWN0aW9uLm11bCggZGV0LmludmVyc2VTcXJ0KCkgKTtcclxuXHJcblx0cmV0dXJuIGFkZCggVC5tdWwoIG1hcE4ueCwgc2NhbGUgKSwgQi5tdWwoIG1hcE4ueSwgc2NhbGUgKSwgTi5tdWwoIG1hcE4ueiApICkubm9ybWFsaXplKCk7XHJcblxyXG59ICk7XHJcblxyXG4vKipcclxuICogVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCBmb3IgYXBwbHlpbmcgbm9ybWFscyBtYXBzIHRvIG1hdGVyaWFscy5cclxuICpcclxuICogYGBganNcclxuICogbWF0ZXJpYWwubm9ybWFsTm9kZSA9IG5vcm1hbE1hcCggdGV4dHVyZSggbm9ybWFsVGV4ICkgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBUZW1wTm9kZVxyXG4gKi9cclxuY2xhc3MgTm9ybWFsTWFwTm9kZSBleHRlbmRzIFRlbXBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnTm9ybWFsTWFwTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBub3JtYWwgbWFwIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGU8dmVjMz59IG5vZGUgLSBSZXByZXNlbnRzIHRoZSBub3JtYWwgbWFwIGRhdGEuXHJcblx0ICogQHBhcmFtIHs/Tm9kZTx2ZWMyPn0gW3NjYWxlTm9kZT1udWxsXSAtIENvbnRyb2xzIHRoZSBpbnRlbnNpdHkgb2YgdGhlIGVmZmVjdC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggbm9kZSwgc2NhbGVOb2RlID0gbnVsbCApIHtcclxuXHJcblx0XHRzdXBlciggJ3ZlYzMnICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXByZXNlbnRzIHRoZSBub3JtYWwgbWFwIGRhdGEuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGU8dmVjMz59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9kZSA9IG5vZGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDb250cm9scyB0aGUgaW50ZW5zaXR5IG9mIHRoZSBlZmZlY3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPHZlYzI+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNjYWxlTm9kZSA9IHNjYWxlTm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBub3JtYWwgbWFwIHR5cGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgeyhUYW5nZW50U3BhY2VOb3JtYWxNYXB8T2JqZWN0U3BhY2VOb3JtYWxNYXApfVxyXG5cdFx0ICogQGRlZmF1bHQgVGFuZ2VudFNwYWNlTm9ybWFsTWFwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9ybWFsTWFwVHlwZSA9IFRhbmdlbnRTcGFjZU5vcm1hbE1hcDtcclxuXHJcblx0fVxyXG5cclxuXHRzZXR1cCggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCB7IG5vcm1hbE1hcFR5cGUsIHNjYWxlTm9kZSB9ID0gdGhpcztcclxuXHJcblx0XHRsZXQgbm9ybWFsTWFwID0gdGhpcy5ub2RlLm11bCggMi4wICkuc3ViKCAxLjAgKTtcclxuXHJcblx0XHRpZiAoIHNjYWxlTm9kZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdG5vcm1hbE1hcCA9IHZlYzMoIG5vcm1hbE1hcC54eS5tdWwoIHNjYWxlTm9kZSApLCBub3JtYWxNYXAueiApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRsZXQgb3V0cHV0Tm9kZSA9IG51bGw7XHJcblxyXG5cdFx0aWYgKCBub3JtYWxNYXBUeXBlID09PSBPYmplY3RTcGFjZU5vcm1hbE1hcCApIHtcclxuXHJcblx0XHRcdG91dHB1dE5vZGUgPSB0cmFuc2Zvcm1Ob3JtYWxUb1ZpZXcoIG5vcm1hbE1hcCApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIG5vcm1hbE1hcFR5cGUgPT09IFRhbmdlbnRTcGFjZU5vcm1hbE1hcCApIHtcclxuXHJcblx0XHRcdGNvbnN0IHRhbmdlbnQgPSBidWlsZGVyLmhhc0dlb21ldHJ5QXR0cmlidXRlKCAndGFuZ2VudCcgKTtcclxuXHJcblx0XHRcdGlmICggdGFuZ2VudCA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0b3V0cHV0Tm9kZSA9IFRCTlZpZXdNYXRyaXgubXVsKCBub3JtYWxNYXAgKS5ub3JtYWxpemUoKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdG91dHB1dE5vZGUgPSBwZXJ0dXJiTm9ybWFsMkFyYigge1xyXG5cdFx0XHRcdFx0ZXllX3BvczogcG9zaXRpb25WaWV3LFxyXG5cdFx0XHRcdFx0c3VyZl9ub3JtOiBub3JtYWxWaWV3LFxyXG5cdFx0XHRcdFx0bWFwTjogbm9ybWFsTWFwLFxyXG5cdFx0XHRcdFx0dXY6IHV2KClcclxuXHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBvdXRwdXROb2RlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBOb3JtYWxNYXBOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSBub3JtYWwgbWFwIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMzPn0gbm9kZSAtIFJlcHJlc2VudHMgdGhlIG5vcm1hbCBtYXAgZGF0YS5cclxuICogQHBhcmFtIHs/Tm9kZTx2ZWMyPn0gW3NjYWxlTm9kZT1udWxsXSAtIENvbnRyb2xzIHRoZSBpbnRlbnNpdHkgb2YgdGhlIGVmZmVjdC5cclxuICogQHJldHVybnMge05vcm1hbE1hcE5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgbm9ybWFsTWFwID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE5vcm1hbE1hcE5vZGUgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDEsIDIgKTtcclxuIiwiaW1wb3J0IFRlbXBOb2RlIGZyb20gJy4uL2NvcmUvVGVtcE5vZGUuanMnO1xyXG5pbXBvcnQgeyB1diB9IGZyb20gJy4uL2FjY2Vzc29ycy9VVi5qcyc7XHJcbmltcG9ydCB7IG5vcm1hbFZpZXcgfSBmcm9tICcuLi9hY2Nlc3NvcnMvTm9ybWFsLmpzJztcclxuaW1wb3J0IHsgcG9zaXRpb25WaWV3IH0gZnJvbSAnLi4vYWNjZXNzb3JzL1Bvc2l0aW9uLmpzJztcclxuaW1wb3J0IHsgZmFjZURpcmVjdGlvbiB9IGZyb20gJy4vRnJvbnRGYWNpbmdOb2RlLmpzJztcclxuaW1wb3J0IHsgRm4sIG5vZGVQcm94eSwgZmxvYXQsIHZlYzIgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcblxyXG4vLyBCdW1wIE1hcHBpbmcgVW5wYXJhbWV0cml6ZWQgU3VyZmFjZXMgb24gdGhlIEdQVSBieSBNb3J0ZW4gUy4gTWlra2Vsc2VuXHJcbi8vIGh0dHBzOi8vbW1pa2suZ2l0aHViLmlvL3BhcGVyczNkL21tX3NmZ3JhZF9idW1wLnBkZlxyXG5cclxuY29uc3QgZEhkeHlfZndkID0gRm4oICggeyB0ZXh0dXJlTm9kZSwgYnVtcFNjYWxlIH0gKSA9PiB7XHJcblxyXG5cdC8vIEl0J3MgdXNlZCB0byBwcmVzZXJ2ZSB0aGUgc2FtZSBUZXh0dXJlTm9kZSBpbnN0YW5jZVxyXG5cdGNvbnN0IHNhbXBsZVRleHR1cmUgPSAoIGNhbGxiYWNrICkgPT4gdGV4dHVyZU5vZGUuY2FjaGUoKS5jb250ZXh0KCB7IGdldFVWOiAoIHRleE5vZGUgKSA9PiBjYWxsYmFjayggdGV4Tm9kZS51dk5vZGUgfHwgdXYoKSApLCBmb3JjZVVWQ29udGV4dDogdHJ1ZSB9ICk7XHJcblxyXG5cdGNvbnN0IEhsbCA9IGZsb2F0KCBzYW1wbGVUZXh0dXJlKCAoIHV2Tm9kZSApID0+IHV2Tm9kZSApICk7XHJcblxyXG5cdHJldHVybiB2ZWMyKFxyXG5cdFx0ZmxvYXQoIHNhbXBsZVRleHR1cmUoICggdXZOb2RlICkgPT4gdXZOb2RlLmFkZCggdXZOb2RlLmRGZHgoKSApICkgKS5zdWIoIEhsbCApLFxyXG5cdFx0ZmxvYXQoIHNhbXBsZVRleHR1cmUoICggdXZOb2RlICkgPT4gdXZOb2RlLmFkZCggdXZOb2RlLmRGZHkoKSApICkgKS5zdWIoIEhsbCApXHJcblx0KS5tdWwoIGJ1bXBTY2FsZSApO1xyXG5cclxufSApO1xyXG5cclxuLy8gRXZhbHVhdGUgdGhlIGRlcml2YXRpdmUgb2YgdGhlIGhlaWdodCB3LnIudC4gc2NyZWVuLXNwYWNlIHVzaW5nIGZvcndhcmQgZGlmZmVyZW5jaW5nIChsaXN0aW5nIDIpXHJcblxyXG5jb25zdCBwZXJ0dXJiTm9ybWFsQXJiID0gRm4oICggaW5wdXRzICkgPT4ge1xyXG5cclxuXHRjb25zdCB7IHN1cmZfcG9zLCBzdXJmX25vcm0sIGRIZHh5IH0gPSBpbnB1dHM7XHJcblxyXG5cdC8vIG5vcm1hbGl6ZSBpcyBkb25lIHRvIGVuc3VyZSB0aGF0IHRoZSBidW1wIG1hcCBsb29rcyB0aGUgc2FtZSByZWdhcmRsZXNzIG9mIHRoZSB0ZXh0dXJlJ3Mgc2NhbGVcclxuXHRjb25zdCB2U2lnbWFYID0gc3VyZl9wb3MuZEZkeCgpLm5vcm1hbGl6ZSgpO1xyXG5cdGNvbnN0IHZTaWdtYVkgPSBzdXJmX3Bvcy5kRmR5KCkubm9ybWFsaXplKCk7XHJcblx0Y29uc3Qgdk4gPSBzdXJmX25vcm07IC8vIG5vcm1hbGl6ZWRcclxuXHJcblx0Y29uc3QgUjEgPSB2U2lnbWFZLmNyb3NzKCB2TiApO1xyXG5cdGNvbnN0IFIyID0gdk4uY3Jvc3MoIHZTaWdtYVggKTtcclxuXHJcblx0Y29uc3QgZkRldCA9IHZTaWdtYVguZG90KCBSMSApLm11bCggZmFjZURpcmVjdGlvbiApO1xyXG5cclxuXHRjb25zdCB2R3JhZCA9IGZEZXQuc2lnbigpLm11bCggZEhkeHkueC5tdWwoIFIxICkuYWRkKCBkSGR4eS55Lm11bCggUjIgKSApICk7XHJcblxyXG5cdHJldHVybiBmRGV0LmFicygpLm11bCggc3VyZl9ub3JtICkuc3ViKCB2R3JhZCApLm5vcm1hbGl6ZSgpO1xyXG5cclxufSApO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgZm9yIGFwcGx5aW5nIGJ1bXAgbWFwcyB0byBtYXRlcmlhbHMuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIG1hdGVyaWFsLm5vcm1hbE5vZGUgPSBidW1wTWFwKCB0ZXh0dXJlKCBidW1wVGV4ICkgKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBUZW1wTm9kZVxyXG4gKi9cclxuY2xhc3MgQnVtcE1hcE5vZGUgZXh0ZW5kcyBUZW1wTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ0J1bXBNYXBOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGJ1bXAgbWFwIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSB0ZXh0dXJlTm9kZSAtIFJlcHJlc2VudHMgdGhlIGJ1bXAgbWFwIGRhdGEuXHJcblx0ICogQHBhcmFtIHs/Tm9kZTxmbG9hdD59IFtzY2FsZU5vZGU9bnVsbF0gLSBDb250cm9scyB0aGUgaW50ZW5zaXR5IG9mIHRoZSBidW1wIGVmZmVjdC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggdGV4dHVyZU5vZGUsIHNjYWxlTm9kZSA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoICd2ZWMzJyApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVwcmVzZW50cyB0aGUgYnVtcCBtYXAgZGF0YS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZTxmbG9hdD59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudGV4dHVyZU5vZGUgPSB0ZXh0dXJlTm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENvbnRyb2xzIHRoZSBpbnRlbnNpdHkgb2YgdGhlIGJ1bXAgZWZmZWN0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Tm9kZTxmbG9hdD59XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2NhbGVOb2RlID0gc2NhbGVOb2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdHNldHVwKCkge1xyXG5cclxuXHRcdGNvbnN0IGJ1bXBTY2FsZSA9IHRoaXMuc2NhbGVOb2RlICE9PSBudWxsID8gdGhpcy5zY2FsZU5vZGUgOiAxO1xyXG5cdFx0Y29uc3QgZEhkeHkgPSBkSGR4eV9md2QoIHsgdGV4dHVyZU5vZGU6IHRoaXMudGV4dHVyZU5vZGUsIGJ1bXBTY2FsZSB9ICk7XHJcblxyXG5cdFx0cmV0dXJuIHBlcnR1cmJOb3JtYWxBcmIoIHtcclxuXHRcdFx0c3VyZl9wb3M6IHBvc2l0aW9uVmlldyxcclxuXHRcdFx0c3VyZl9ub3JtOiBub3JtYWxWaWV3LFxyXG5cdFx0XHRkSGR4eVxyXG5cdFx0fSApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBCdW1wTWFwTm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgYnVtcCBtYXAgbm9kZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlPGZsb2F0Pn0gdGV4dHVyZU5vZGUgLSBSZXByZXNlbnRzIHRoZSBidW1wIG1hcCBkYXRhLlxyXG4gKiBAcGFyYW0gez9Ob2RlPGZsb2F0Pn0gW3NjYWxlTm9kZT1udWxsXSAtIENvbnRyb2xzIHRoZSBpbnRlbnNpdHkgb2YgdGhlIGJ1bXAgZWZmZWN0LlxyXG4gKiBAcmV0dXJucyB7QnVtcE1hcE5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYnVtcE1hcCA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBCdW1wTWFwTm9kZSApLnNldFBhcmFtZXRlckxlbmd0aCggMSwgMiApO1xyXG4iLCJpbXBvcnQgTm9kZSBmcm9tICcuLi9jb3JlL05vZGUuanMnO1xyXG5pbXBvcnQgeyByZWZlcmVuY2UgfSBmcm9tICcuL1JlZmVyZW5jZU5vZGUuanMnO1xyXG5pbXBvcnQgeyBtYXRlcmlhbFJlZmVyZW5jZSB9IGZyb20gJy4vTWF0ZXJpYWxSZWZlcmVuY2VOb2RlLmpzJztcclxuaW1wb3J0IHsgbm9ybWFsVmlldyB9IGZyb20gJy4vTm9ybWFsLmpzJztcclxuaW1wb3J0IHsgbm9kZUltbXV0YWJsZSwgZmxvYXQsIHZlYzIsIHZlYzMsIG1hdDIgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcbmltcG9ydCB7IHVuaWZvcm0gfSBmcm9tICcuLi9jb3JlL1VuaWZvcm1Ob2RlLmpzJztcclxuaW1wb3J0IHsgbm9ybWFsTWFwIH0gZnJvbSAnLi4vZGlzcGxheS9Ob3JtYWxNYXBOb2RlLmpzJztcclxuaW1wb3J0IHsgYnVtcE1hcCB9IGZyb20gJy4uL2Rpc3BsYXkvQnVtcE1hcE5vZGUuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IyLmpzJztcclxuXHJcbmNvbnN0IF9wcm9wZXJ0eUNhY2hlID0gbmV3IE1hcCgpO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgY2xhc3Mgc2hvdWxkIHNpbXBsaWZ5IHRoZSBub2RlIGFjY2VzcyB0byBtYXRlcmlhbCBwcm9wZXJ0aWVzLlxyXG4gKiBJdCBpbnRlcm5hbCB1c2VzIHJlZmVyZW5jZSBub2RlcyB0byBtYWtlIHN1cmUgIGNoYW5nZXMgdG8gbWF0ZXJpYWxcclxuICogcHJvcGVydGllcyBhcmUgYXV0b21hdGljYWxseSByZWZsZWN0ZWQgdG8gcHJlZGVmaW5lZCBUU0wgb2JqZWN0c1xyXG4gKiBsaWtlIGUuZy4gYG1hdGVyaWFsQ29sb3JgLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTm9kZVxyXG4gKi9cclxuY2xhc3MgTWF0ZXJpYWxOb2RlIGV4dGVuZHMgTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ01hdGVyaWFsTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBtYXRlcmlhbCBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNjb3BlIC0gVGhlIHNjb3BlIGRlZmluZXMgd2hhdCBraW5kIG9mIG1hdGVyaWFsIHByb3BlcnR5IGlzIHJlZmVycmVkIGJ5IHRoZSBub2RlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBzY29wZSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHNjb3BlIGRlZmluZXMgd2hhdCBtYXRlcmlhbCBwcm9wZXJ0eSBpcyByZWZlcnJlZCBieSB0aGUgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNjb3BlID0gc2NvcGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIGNhY2hlZCByZWZlcmVuY2Ugbm9kZSBmb3IgdGhlIGdpdmVuIHByb3BlcnR5IGFuZCB0eXBlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IC0gVGhlIG5hbWUgb2YgdGhlIG1hdGVyaWFsIHByb3BlcnR5LlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIHVuaWZvcm0gdHlwZSBvZiB0aGUgcHJvcGVydHkuXHJcblx0ICogQHJldHVybiB7TWF0ZXJpYWxSZWZlcmVuY2VOb2RlfSBBIG1hdGVyaWFsIHJlZmVyZW5jZSBub2RlIHJlcHJlc2VudGluZyB0aGUgcHJvcGVydHkgYWNjZXNzLlxyXG5cdCAqL1xyXG5cdGdldENhY2hlKCBwcm9wZXJ0eSwgdHlwZSApIHtcclxuXHJcblx0XHRsZXQgbm9kZSA9IF9wcm9wZXJ0eUNhY2hlLmdldCggcHJvcGVydHkgKTtcclxuXHJcblx0XHRpZiAoIG5vZGUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdG5vZGUgPSBtYXRlcmlhbFJlZmVyZW5jZSggcHJvcGVydHksIHR5cGUgKTtcclxuXHJcblx0XHRcdF9wcm9wZXJ0eUNhY2hlLnNldCggcHJvcGVydHksIG5vZGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG5vZGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIGZsb2F0LXR5cGVkIG1hdGVyaWFsIHJlZmVyZW5jZSBub2RlIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkgbmFtZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSAtIFRoZSBuYW1lIG9mIHRoZSBtYXRlcmlhbCBwcm9wZXJ0eS5cclxuXHQgKiBAcmV0dXJuIHtNYXRlcmlhbFJlZmVyZW5jZU5vZGU8ZmxvYXQ+fSBBIG1hdGVyaWFsIHJlZmVyZW5jZSBub2RlIHJlcHJlc2VudGluZyB0aGUgcHJvcGVydHkgYWNjZXNzLlxyXG5cdCAqL1xyXG5cdGdldEZsb2F0KCBwcm9wZXJ0eSApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5nZXRDYWNoZSggcHJvcGVydHksICdmbG9hdCcgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgY29sb3ItdHlwZWQgbWF0ZXJpYWwgcmVmZXJlbmNlIG5vZGUgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eSBuYW1lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IC0gVGhlIG5hbWUgb2YgdGhlIG1hdGVyaWFsIHByb3BlcnR5LlxyXG5cdCAqIEByZXR1cm4ge01hdGVyaWFsUmVmZXJlbmNlTm9kZTxjb2xvcj59IEEgbWF0ZXJpYWwgcmVmZXJlbmNlIG5vZGUgcmVwcmVzZW50aW5nIHRoZSBwcm9wZXJ0eSBhY2Nlc3MuXHJcblx0ICovXHJcblx0Z2V0Q29sb3IoIHByb3BlcnR5ICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmdldENhY2hlKCBwcm9wZXJ0eSwgJ2NvbG9yJyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSB0ZXh0dXJlLXR5cGVkIG1hdGVyaWFsIHJlZmVyZW5jZSBub2RlIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkgbmFtZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSAtIFRoZSBuYW1lIG9mIHRoZSBtYXRlcmlhbCBwcm9wZXJ0eS5cclxuXHQgKiBAcmV0dXJuIHtNYXRlcmlhbFJlZmVyZW5jZU5vZGV9IEEgbWF0ZXJpYWwgcmVmZXJlbmNlIG5vZGUgcmVwcmVzZW50aW5nIHRoZSBwcm9wZXJ0eSBhY2Nlc3MuXHJcblx0ICovXHJcblx0Z2V0VGV4dHVyZSggcHJvcGVydHkgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZ2V0Q2FjaGUoIHByb3BlcnR5ID09PSAnbWFwJyA/ICdtYXAnIDogcHJvcGVydHkgKyAnTWFwJywgJ3RleHR1cmUnICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIG5vZGUgc2V0dXAgaXMgZG9uZSBkZXBlbmRpbmcgb24gdGhlIHNlbGVjdGVkIHNjb3BlLiBNdWx0aXBsZSBtYXRlcmlhbCBwcm9wZXJ0aWVzXHJcblx0ICogbWlnaHQgYmUgZ3JvdXBlZCBpbnRvIGEgc2luZ2xlIG5vZGUgY29tcG9zaXRpb24gaWYgdGhleSBsb2dpY2FsbHkgYmVsb25nIHRvZ2V0aGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtOb2RlfSBUaGUgbm9kZSByZXByZXNlbnRpbmcgdGhlIHNlbGVjdGVkIHNjb3BlLlxyXG5cdCAqL1xyXG5cdHNldHVwKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IG1hdGVyaWFsID0gYnVpbGRlci5jb250ZXh0Lm1hdGVyaWFsO1xyXG5cdFx0Y29uc3Qgc2NvcGUgPSB0aGlzLnNjb3BlO1xyXG5cclxuXHRcdGxldCBub2RlID0gbnVsbDtcclxuXHJcblx0XHRpZiAoIHNjb3BlID09PSBNYXRlcmlhbE5vZGUuQ09MT1IgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBjb2xvck5vZGUgPSBtYXRlcmlhbC5jb2xvciAhPT0gdW5kZWZpbmVkID8gdGhpcy5nZXRDb2xvciggc2NvcGUgKSA6IHZlYzMoKTtcclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWwubWFwICYmIG1hdGVyaWFsLm1hcC5pc1RleHR1cmUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdG5vZGUgPSBjb2xvck5vZGUubXVsKCB0aGlzLmdldFRleHR1cmUoICdtYXAnICkgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdG5vZGUgPSBjb2xvck5vZGU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmICggc2NvcGUgPT09IE1hdGVyaWFsTm9kZS5PUEFDSVRZICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgb3BhY2l0eU5vZGUgPSB0aGlzLmdldEZsb2F0KCBzY29wZSApO1xyXG5cclxuXHRcdFx0aWYgKCBtYXRlcmlhbC5hbHBoYU1hcCAmJiBtYXRlcmlhbC5hbHBoYU1hcC5pc1RleHR1cmUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdG5vZGUgPSBvcGFjaXR5Tm9kZS5tdWwoIHRoaXMuZ2V0VGV4dHVyZSggJ2FscGhhJyApICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRub2RlID0gb3BhY2l0eU5vZGU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmICggc2NvcGUgPT09IE1hdGVyaWFsTm9kZS5TUEVDVUxBUl9TVFJFTkdUSCApIHtcclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWwuc3BlY3VsYXJNYXAgJiYgbWF0ZXJpYWwuc3BlY3VsYXJNYXAuaXNUZXh0dXJlID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRub2RlID0gdGhpcy5nZXRUZXh0dXJlKCAnc3BlY3VsYXInICkucjtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdG5vZGUgPSBmbG9hdCggMSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHNjb3BlID09PSBNYXRlcmlhbE5vZGUuU1BFQ1VMQVJfSU5URU5TSVRZICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgc3BlY3VsYXJJbnRlbnNpdHlOb2RlID0gdGhpcy5nZXRGbG9hdCggc2NvcGUgKTtcclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWwuc3BlY3VsYXJJbnRlbnNpdHlNYXAgJiYgbWF0ZXJpYWwuc3BlY3VsYXJJbnRlbnNpdHlNYXAuaXNUZXh0dXJlID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRub2RlID0gc3BlY3VsYXJJbnRlbnNpdHlOb2RlLm11bCggdGhpcy5nZXRUZXh0dXJlKCBzY29wZSApLmEgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdG5vZGUgPSBzcGVjdWxhckludGVuc2l0eU5vZGU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmICggc2NvcGUgPT09IE1hdGVyaWFsTm9kZS5TUEVDVUxBUl9DT0xPUiApIHtcclxuXHJcblx0XHRcdGNvbnN0IHNwZWN1bGFyQ29sb3JOb2RlID0gdGhpcy5nZXRDb2xvciggc2NvcGUgKTtcclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWwuc3BlY3VsYXJDb2xvck1hcCAmJiBtYXRlcmlhbC5zcGVjdWxhckNvbG9yTWFwLmlzVGV4dHVyZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0bm9kZSA9IHNwZWN1bGFyQ29sb3JOb2RlLm11bCggdGhpcy5nZXRUZXh0dXJlKCBzY29wZSApLnJnYiApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0bm9kZSA9IHNwZWN1bGFyQ29sb3JOb2RlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHNjb3BlID09PSBNYXRlcmlhbE5vZGUuUk9VR0hORVNTICkgeyAvLyBUT0RPOiBjbGVhbnVwIHNpbWlsYXIgYnJhbmNoZXNcclxuXHJcblx0XHRcdGNvbnN0IHJvdWdobmVzc05vZGUgPSB0aGlzLmdldEZsb2F0KCBzY29wZSApO1xyXG5cclxuXHRcdFx0aWYgKCBtYXRlcmlhbC5yb3VnaG5lc3NNYXAgJiYgbWF0ZXJpYWwucm91Z2huZXNzTWFwLmlzVGV4dHVyZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0bm9kZSA9IHJvdWdobmVzc05vZGUubXVsKCB0aGlzLmdldFRleHR1cmUoIHNjb3BlICkuZyApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0bm9kZSA9IHJvdWdobmVzc05vZGU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmICggc2NvcGUgPT09IE1hdGVyaWFsTm9kZS5NRVRBTE5FU1MgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBtZXRhbG5lc3NOb2RlID0gdGhpcy5nZXRGbG9hdCggc2NvcGUgKTtcclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWwubWV0YWxuZXNzTWFwICYmIG1hdGVyaWFsLm1ldGFsbmVzc01hcC5pc1RleHR1cmUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdG5vZGUgPSBtZXRhbG5lc3NOb2RlLm11bCggdGhpcy5nZXRUZXh0dXJlKCBzY29wZSApLmIgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdG5vZGUgPSBtZXRhbG5lc3NOb2RlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHNjb3BlID09PSBNYXRlcmlhbE5vZGUuRU1JU1NJVkUgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBlbWlzc2l2ZUludGVuc2l0eU5vZGUgPSB0aGlzLmdldEZsb2F0KCAnZW1pc3NpdmVJbnRlbnNpdHknICk7XHJcblx0XHRcdGNvbnN0IGVtaXNzaXZlTm9kZSA9IHRoaXMuZ2V0Q29sb3IoIHNjb3BlICkubXVsKCBlbWlzc2l2ZUludGVuc2l0eU5vZGUgKTtcclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWwuZW1pc3NpdmVNYXAgJiYgbWF0ZXJpYWwuZW1pc3NpdmVNYXAuaXNUZXh0dXJlID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRub2RlID0gZW1pc3NpdmVOb2RlLm11bCggdGhpcy5nZXRUZXh0dXJlKCBzY29wZSApICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRub2RlID0gZW1pc3NpdmVOb2RlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHNjb3BlID09PSBNYXRlcmlhbE5vZGUuTk9STUFMICkge1xyXG5cclxuXHRcdFx0aWYgKCBtYXRlcmlhbC5ub3JtYWxNYXAgKSB7XHJcblxyXG5cdFx0XHRcdG5vZGUgPSBub3JtYWxNYXAoIHRoaXMuZ2V0VGV4dHVyZSggJ25vcm1hbCcgKSwgdGhpcy5nZXRDYWNoZSggJ25vcm1hbFNjYWxlJywgJ3ZlYzInICkgKTtcclxuXHRcdFx0XHRub2RlLm5vcm1hbE1hcFR5cGUgPSBtYXRlcmlhbC5ub3JtYWxNYXBUeXBlO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuYnVtcE1hcCApIHtcclxuXHJcblx0XHRcdFx0bm9kZSA9IGJ1bXBNYXAoIHRoaXMuZ2V0VGV4dHVyZSggJ2J1bXAnICkuciwgdGhpcy5nZXRGbG9hdCggJ2J1bXBTY2FsZScgKSApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0bm9kZSA9IG5vcm1hbFZpZXc7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmICggc2NvcGUgPT09IE1hdGVyaWFsTm9kZS5DTEVBUkNPQVQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBjbGVhcmNvYXROb2RlID0gdGhpcy5nZXRGbG9hdCggc2NvcGUgKTtcclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWwuY2xlYXJjb2F0TWFwICYmIG1hdGVyaWFsLmNsZWFyY29hdE1hcC5pc1RleHR1cmUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdG5vZGUgPSBjbGVhcmNvYXROb2RlLm11bCggdGhpcy5nZXRUZXh0dXJlKCBzY29wZSApLnIgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdG5vZGUgPSBjbGVhcmNvYXROb2RlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHNjb3BlID09PSBNYXRlcmlhbE5vZGUuQ0xFQVJDT0FUX1JPVUdITkVTUyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGNsZWFyY29hdFJvdWdobmVzc05vZGUgPSB0aGlzLmdldEZsb2F0KCBzY29wZSApO1xyXG5cclxuXHRcdFx0aWYgKCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3NNYXAgJiYgbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzTWFwLmlzVGV4dHVyZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0bm9kZSA9IGNsZWFyY29hdFJvdWdobmVzc05vZGUubXVsKCB0aGlzLmdldFRleHR1cmUoIHNjb3BlICkuciApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0bm9kZSA9IGNsZWFyY29hdFJvdWdobmVzc05vZGU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmICggc2NvcGUgPT09IE1hdGVyaWFsTm9kZS5DTEVBUkNPQVRfTk9STUFMICkge1xyXG5cclxuXHRcdFx0aWYgKCBtYXRlcmlhbC5jbGVhcmNvYXROb3JtYWxNYXAgKSB7XHJcblxyXG5cdFx0XHRcdG5vZGUgPSBub3JtYWxNYXAoIHRoaXMuZ2V0VGV4dHVyZSggc2NvcGUgKSwgdGhpcy5nZXRDYWNoZSggc2NvcGUgKyAnU2NhbGUnLCAndmVjMicgKSApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0bm9kZSA9IG5vcm1hbFZpZXc7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmICggc2NvcGUgPT09IE1hdGVyaWFsTm9kZS5TSEVFTiApIHtcclxuXHJcblx0XHRcdGNvbnN0IHNoZWVuTm9kZSA9IHRoaXMuZ2V0Q29sb3IoICdzaGVlbkNvbG9yJyApLm11bCggdGhpcy5nZXRGbG9hdCggJ3NoZWVuJyApICk7IC8vIE1vdmUgdGhpcyBtdWwoKSB0byBDUFVcclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWwuc2hlZW5Db2xvck1hcCAmJiBtYXRlcmlhbC5zaGVlbkNvbG9yTWFwLmlzVGV4dHVyZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0bm9kZSA9IHNoZWVuTm9kZS5tdWwoIHRoaXMuZ2V0VGV4dHVyZSggJ3NoZWVuQ29sb3InICkucmdiICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRub2RlID0gc2hlZW5Ob2RlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHNjb3BlID09PSBNYXRlcmlhbE5vZGUuU0hFRU5fUk9VR0hORVNTICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgc2hlZW5Sb3VnaG5lc3NOb2RlID0gdGhpcy5nZXRGbG9hdCggc2NvcGUgKTtcclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWwuc2hlZW5Sb3VnaG5lc3NNYXAgJiYgbWF0ZXJpYWwuc2hlZW5Sb3VnaG5lc3NNYXAuaXNUZXh0dXJlID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRub2RlID0gc2hlZW5Sb3VnaG5lc3NOb2RlLm11bCggdGhpcy5nZXRUZXh0dXJlKCBzY29wZSApLmEgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdG5vZGUgPSBzaGVlblJvdWdobmVzc05vZGU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRub2RlID0gbm9kZS5jbGFtcCggMC4wNywgMS4wICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggc2NvcGUgPT09IE1hdGVyaWFsTm9kZS5BTklTT1RST1BZICkge1xyXG5cclxuXHRcdFx0aWYgKCBtYXRlcmlhbC5hbmlzb3Ryb3B5TWFwICYmIG1hdGVyaWFsLmFuaXNvdHJvcHlNYXAuaXNUZXh0dXJlID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBhbmlzb3Ryb3B5UG9sYXIgPSB0aGlzLmdldFRleHR1cmUoIHNjb3BlICk7XHJcblx0XHRcdFx0Y29uc3QgYW5pc290cm9weU1hdCA9IG1hdDIoIG1hdGVyaWFsQW5pc290cm9weVZlY3Rvci54LCBtYXRlcmlhbEFuaXNvdHJvcHlWZWN0b3IueSwgbWF0ZXJpYWxBbmlzb3Ryb3B5VmVjdG9yLnkubmVnYXRlKCksIG1hdGVyaWFsQW5pc290cm9weVZlY3Rvci54ICk7XHJcblxyXG5cdFx0XHRcdG5vZGUgPSBhbmlzb3Ryb3B5TWF0Lm11bCggYW5pc290cm9weVBvbGFyLnJnLm11bCggMi4wICkuc3ViKCB2ZWMyKCAxLjAgKSApLm5vcm1hbGl6ZSgpLm11bCggYW5pc290cm9weVBvbGFyLmIgKSApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0bm9kZSA9IG1hdGVyaWFsQW5pc290cm9weVZlY3RvcjtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2UgaWYgKCBzY29wZSA9PT0gTWF0ZXJpYWxOb2RlLklSSURFU0NFTkNFX1RISUNLTkVTUyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGlyaWRlc2NlbmNlVGhpY2tuZXNzTWF4aW11bSA9IHJlZmVyZW5jZSggJzEnLCAnZmxvYXQnLCBtYXRlcmlhbC5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlICk7XHJcblxyXG5cdFx0XHRpZiAoIG1hdGVyaWFsLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBpcmlkZXNjZW5jZVRoaWNrbmVzc01pbmltdW0gPSByZWZlcmVuY2UoICcwJywgJ2Zsb2F0JywgbWF0ZXJpYWwuaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZSApO1xyXG5cclxuXHRcdFx0XHRub2RlID0gaXJpZGVzY2VuY2VUaGlja25lc3NNYXhpbXVtLnN1YiggaXJpZGVzY2VuY2VUaGlja25lc3NNaW5pbXVtICkubXVsKCB0aGlzLmdldFRleHR1cmUoIHNjb3BlICkuZyApLmFkZCggaXJpZGVzY2VuY2VUaGlja25lc3NNaW5pbXVtICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRub2RlID0gaXJpZGVzY2VuY2VUaGlja25lc3NNYXhpbXVtO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHNjb3BlID09PSBNYXRlcmlhbE5vZGUuVFJBTlNNSVNTSU9OICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdHJhbnNtaXNzaW9uTm9kZSA9IHRoaXMuZ2V0RmxvYXQoIHNjb3BlICk7XHJcblxyXG5cdFx0XHRpZiAoIG1hdGVyaWFsLnRyYW5zbWlzc2lvbk1hcCApIHtcclxuXHJcblx0XHRcdFx0bm9kZSA9IHRyYW5zbWlzc2lvbk5vZGUubXVsKCB0aGlzLmdldFRleHR1cmUoIHNjb3BlICkuciApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0bm9kZSA9IHRyYW5zbWlzc2lvbk5vZGU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmICggc2NvcGUgPT09IE1hdGVyaWFsTm9kZS5USElDS05FU1MgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB0aGlja25lc3NOb2RlID0gdGhpcy5nZXRGbG9hdCggc2NvcGUgKTtcclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWwudGhpY2tuZXNzTWFwICkge1xyXG5cclxuXHRcdFx0XHRub2RlID0gdGhpY2tuZXNzTm9kZS5tdWwoIHRoaXMuZ2V0VGV4dHVyZSggc2NvcGUgKS5nICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRub2RlID0gdGhpY2tuZXNzTm9kZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2UgaWYgKCBzY29wZSA9PT0gTWF0ZXJpYWxOb2RlLklPUiApIHtcclxuXHJcblx0XHRcdG5vZGUgPSB0aGlzLmdldEZsb2F0KCBzY29wZSApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHNjb3BlID09PSBNYXRlcmlhbE5vZGUuTElHSFRfTUFQICkge1xyXG5cclxuXHRcdFx0bm9kZSA9IHRoaXMuZ2V0VGV4dHVyZSggc2NvcGUgKS5yZ2IubXVsKCB0aGlzLmdldEZsb2F0KCAnbGlnaHRNYXBJbnRlbnNpdHknICkgKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBzY29wZSA9PT0gTWF0ZXJpYWxOb2RlLkFPICkge1xyXG5cclxuXHRcdFx0bm9kZSA9IHRoaXMuZ2V0VGV4dHVyZSggc2NvcGUgKS5yLnN1YiggMS4wICkubXVsKCB0aGlzLmdldEZsb2F0KCAnYW9NYXBJbnRlbnNpdHknICkgKS5hZGQoIDEuMCApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRjb25zdCBvdXRwdXRUeXBlID0gdGhpcy5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cclxuXHRcdFx0bm9kZSA9IHRoaXMuZ2V0Q2FjaGUoIHNjb3BlLCBvdXRwdXRUeXBlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBub2RlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5NYXRlcmlhbE5vZGUuQUxQSEFfVEVTVCA9ICdhbHBoYVRlc3QnO1xyXG5NYXRlcmlhbE5vZGUuQ09MT1IgPSAnY29sb3InO1xyXG5NYXRlcmlhbE5vZGUuT1BBQ0lUWSA9ICdvcGFjaXR5JztcclxuTWF0ZXJpYWxOb2RlLlNISU5JTkVTUyA9ICdzaGluaW5lc3MnO1xyXG5NYXRlcmlhbE5vZGUuU1BFQ1VMQVIgPSAnc3BlY3VsYXInO1xyXG5NYXRlcmlhbE5vZGUuU1BFQ1VMQVJfU1RSRU5HVEggPSAnc3BlY3VsYXJTdHJlbmd0aCc7XHJcbk1hdGVyaWFsTm9kZS5TUEVDVUxBUl9JTlRFTlNJVFkgPSAnc3BlY3VsYXJJbnRlbnNpdHknO1xyXG5NYXRlcmlhbE5vZGUuU1BFQ1VMQVJfQ09MT1IgPSAnc3BlY3VsYXJDb2xvcic7XHJcbk1hdGVyaWFsTm9kZS5SRUZMRUNUSVZJVFkgPSAncmVmbGVjdGl2aXR5JztcclxuTWF0ZXJpYWxOb2RlLlJPVUdITkVTUyA9ICdyb3VnaG5lc3MnO1xyXG5NYXRlcmlhbE5vZGUuTUVUQUxORVNTID0gJ21ldGFsbmVzcyc7XHJcbk1hdGVyaWFsTm9kZS5OT1JNQUwgPSAnbm9ybWFsJztcclxuTWF0ZXJpYWxOb2RlLkNMRUFSQ09BVCA9ICdjbGVhcmNvYXQnO1xyXG5NYXRlcmlhbE5vZGUuQ0xFQVJDT0FUX1JPVUdITkVTUyA9ICdjbGVhcmNvYXRSb3VnaG5lc3MnO1xyXG5NYXRlcmlhbE5vZGUuQ0xFQVJDT0FUX05PUk1BTCA9ICdjbGVhcmNvYXROb3JtYWwnO1xyXG5NYXRlcmlhbE5vZGUuRU1JU1NJVkUgPSAnZW1pc3NpdmUnO1xyXG5NYXRlcmlhbE5vZGUuUk9UQVRJT04gPSAncm90YXRpb24nO1xyXG5NYXRlcmlhbE5vZGUuU0hFRU4gPSAnc2hlZW4nO1xyXG5NYXRlcmlhbE5vZGUuU0hFRU5fUk9VR0hORVNTID0gJ3NoZWVuUm91Z2huZXNzJztcclxuTWF0ZXJpYWxOb2RlLkFOSVNPVFJPUFkgPSAnYW5pc290cm9weSc7XHJcbk1hdGVyaWFsTm9kZS5JUklERVNDRU5DRSA9ICdpcmlkZXNjZW5jZSc7XHJcbk1hdGVyaWFsTm9kZS5JUklERVNDRU5DRV9JT1IgPSAnaXJpZGVzY2VuY2VJT1InO1xyXG5NYXRlcmlhbE5vZGUuSVJJREVTQ0VOQ0VfVEhJQ0tORVNTID0gJ2lyaWRlc2NlbmNlVGhpY2tuZXNzJztcclxuTWF0ZXJpYWxOb2RlLklPUiA9ICdpb3InO1xyXG5NYXRlcmlhbE5vZGUuVFJBTlNNSVNTSU9OID0gJ3RyYW5zbWlzc2lvbic7XHJcbk1hdGVyaWFsTm9kZS5USElDS05FU1MgPSAndGhpY2tuZXNzJztcclxuTWF0ZXJpYWxOb2RlLkFUVEVOVUFUSU9OX0RJU1RBTkNFID0gJ2F0dGVudWF0aW9uRGlzdGFuY2UnO1xyXG5NYXRlcmlhbE5vZGUuQVRURU5VQVRJT05fQ09MT1IgPSAnYXR0ZW51YXRpb25Db2xvcic7XHJcbk1hdGVyaWFsTm9kZS5MSU5FX1NDQUxFID0gJ3NjYWxlJztcclxuTWF0ZXJpYWxOb2RlLkxJTkVfREFTSF9TSVpFID0gJ2Rhc2hTaXplJztcclxuTWF0ZXJpYWxOb2RlLkxJTkVfR0FQX1NJWkUgPSAnZ2FwU2l6ZSc7XHJcbk1hdGVyaWFsTm9kZS5MSU5FX1dJRFRIID0gJ2xpbmV3aWR0aCc7XHJcbk1hdGVyaWFsTm9kZS5MSU5FX0RBU0hfT0ZGU0VUID0gJ2Rhc2hPZmZzZXQnO1xyXG5NYXRlcmlhbE5vZGUuUE9JTlRfU0laRSA9ICdzaXplJztcclxuTWF0ZXJpYWxOb2RlLkRJU1BFUlNJT04gPSAnZGlzcGVyc2lvbic7XHJcbk1hdGVyaWFsTm9kZS5MSUdIVF9NQVAgPSAnbGlnaHQnO1xyXG5NYXRlcmlhbE5vZGUuQU8gPSAnYW8nO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgTWF0ZXJpYWxOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIGFscGhhIHRlc3Qgb2YgdGhlIGN1cnJlbnQgbWF0ZXJpYWwuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8ZmxvYXQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG1hdGVyaWFsQWxwaGFUZXN0ID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBNYXRlcmlhbE5vZGUsIE1hdGVyaWFsTm9kZS5BTFBIQV9URVNUICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGRpZmZ1c2UgY29sb3Igb2YgdGhlIGN1cnJlbnQgbWF0ZXJpYWwuXHJcbiAqIFRoZSB2YWx1ZSBpcyBjb21wb3NlZCB2aWEgYGNvbG9yYCAqIGBtYXBgLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtOb2RlPHZlYzM+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG1hdGVyaWFsQ29sb3IgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIE1hdGVyaWFsTm9kZSwgTWF0ZXJpYWxOb2RlLkNPTE9SICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHNoaW5pbmVzcyBvZiB0aGUgY3VycmVudCBtYXRlcmlhbC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbWF0ZXJpYWxTaGluaW5lc3MgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIE1hdGVyaWFsTm9kZSwgTWF0ZXJpYWxOb2RlLlNISU5JTkVTUyApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBlbWlzc2l2ZSBjb2xvciBvZiB0aGUgY3VycmVudCBtYXRlcmlhbC5cclxuICogVGhlIHZhbHVlIGlzIGNvbXBvc2VkIHZpYSBgZW1pc3NpdmVgICogYGVtaXNzaXZlSW50ZW5zaXR5YCAqIGBlbWlzc2l2ZU1hcGAuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8dmVjMz59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbWF0ZXJpYWxFbWlzc2l2ZSA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggTWF0ZXJpYWxOb2RlLCBNYXRlcmlhbE5vZGUuRU1JU1NJVkUgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgb3BhY2l0eSBvZiB0aGUgY3VycmVudCBtYXRlcmlhbC5cclxuICogVGhlIHZhbHVlIGlzIGNvbXBvc2VkIHZpYSBgb3BhY2l0eWAgKiBgYWxwaGFNYXBgLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtOb2RlPGZsb2F0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBtYXRlcmlhbE9wYWNpdHkgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIE1hdGVyaWFsTm9kZSwgTWF0ZXJpYWxOb2RlLk9QQUNJVFkgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgc3BlY3VsYXIgb2YgdGhlIGN1cnJlbnQgbWF0ZXJpYWwuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8dmVjMz59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbWF0ZXJpYWxTcGVjdWxhciA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggTWF0ZXJpYWxOb2RlLCBNYXRlcmlhbE5vZGUuU1BFQ1VMQVIgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgc3BlY3VsYXIgaW50ZW5zaXR5IG9mIHRoZSBjdXJyZW50IG1hdGVyaWFsLlxyXG4gKiBUaGUgdmFsdWUgaXMgY29tcG9zZWQgdmlhIGBzcGVjdWxhckludGVuc2l0eWAgKiBgc3BlY3VsYXJNYXAuYWAuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8ZmxvYXQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG1hdGVyaWFsU3BlY3VsYXJJbnRlbnNpdHkgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIE1hdGVyaWFsTm9kZSwgTWF0ZXJpYWxOb2RlLlNQRUNVTEFSX0lOVEVOU0lUWSApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBzcGVjdWxhciBjb2xvciBvZiB0aGUgY3VycmVudCBtYXRlcmlhbC5cclxuICogVGhlIHZhbHVlIGlzIGNvbXBvc2VkIHZpYSBgc3BlY3VsYXJDb2xvcmAgKiBgc3BlY3VsYXJNYXAucmdiYC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTx2ZWMzPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBtYXRlcmlhbFNwZWN1bGFyQ29sb3IgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIE1hdGVyaWFsTm9kZSwgTWF0ZXJpYWxOb2RlLlNQRUNVTEFSX0NPTE9SICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHNwZWN1bGFyIHN0cmVuZ3RoIG9mIHRoZSBjdXJyZW50IG1hdGVyaWFsLlxyXG4gKiBUaGUgdmFsdWUgaXMgY29tcG9zZWQgdmlhIGBzcGVjdWxhck1hcC5yYC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbWF0ZXJpYWxTcGVjdWxhclN0cmVuZ3RoID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBNYXRlcmlhbE5vZGUsIE1hdGVyaWFsTm9kZS5TUEVDVUxBUl9TVFJFTkdUSCApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSByZWZsZWN0aXZpdHkgb2YgdGhlIGN1cnJlbnQgbWF0ZXJpYWwuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8ZmxvYXQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG1hdGVyaWFsUmVmbGVjdGl2aXR5ID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBNYXRlcmlhbE5vZGUsIE1hdGVyaWFsTm9kZS5SRUZMRUNUSVZJVFkgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgcm91Z2huZXNzIG9mIHRoZSBjdXJyZW50IG1hdGVyaWFsLlxyXG4gKiBUaGUgdmFsdWUgaXMgY29tcG9zZWQgdmlhIGByb3VnaG5lc3NgICogYHJvdWdobmVzc01hcC5nYC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbWF0ZXJpYWxSb3VnaG5lc3MgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIE1hdGVyaWFsTm9kZSwgTWF0ZXJpYWxOb2RlLlJPVUdITkVTUyApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBtZXRhbG5lc3Mgb2YgdGhlIGN1cnJlbnQgbWF0ZXJpYWwuXHJcbiAqIFRoZSB2YWx1ZSBpcyBjb21wb3NlZCB2aWEgYG1ldGFsbmVzc2AgKiBgbWV0YWxuZXNzTWFwLmJgLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtOb2RlPGZsb2F0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBtYXRlcmlhbE1ldGFsbmVzcyA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggTWF0ZXJpYWxOb2RlLCBNYXRlcmlhbE5vZGUuTUVUQUxORVNTICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIG5vcm1hbCBvZiB0aGUgY3VycmVudCBtYXRlcmlhbC5cclxuICogVGhlIHZhbHVlIHdpbGwgYmUgZWl0aGVyIGBub3JtYWxNYXBgICogYG5vcm1hbFNjYWxlYCwgYGJ1bXBNYXBgICogYGJ1bXBTY2FsZWAgb3IgYG5vcm1hbFZpZXdgLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtOb2RlPHZlYzM+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG1hdGVyaWFsTm9ybWFsID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBNYXRlcmlhbE5vZGUsIE1hdGVyaWFsTm9kZS5OT1JNQUwgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgY2xlYXJjb2F0IG9mIHRoZSBjdXJyZW50IG1hdGVyaWFsLlxyXG4gKiBUaGUgdmFsdWUgaXMgY29tcG9zZWQgdmlhIGBjbGVhcmNvYXRgICogYGNsZWFyY29hdE1hcC5yYFxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtOb2RlPGZsb2F0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBtYXRlcmlhbENsZWFyY29hdCA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggTWF0ZXJpYWxOb2RlLCBNYXRlcmlhbE5vZGUuQ0xFQVJDT0FUICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGNsZWFyY29hdCByb3VnaG5lc3Mgb2YgdGhlIGN1cnJlbnQgbWF0ZXJpYWwuXHJcbiAqIFRoZSB2YWx1ZSBpcyBjb21wb3NlZCB2aWEgYGNsZWFyY29hdFJvdWdobmVzc2AgKiBgY2xlYXJjb2F0Um91Z2huZXNzTWFwLnJgLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtOb2RlPGZsb2F0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBtYXRlcmlhbENsZWFyY29hdFJvdWdobmVzcyA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggTWF0ZXJpYWxOb2RlLCBNYXRlcmlhbE5vZGUuQ0xFQVJDT0FUX1JPVUdITkVTUyApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBjbGVhcmNvYXQgbm9ybWFsIG9mIHRoZSBjdXJyZW50IG1hdGVyaWFsLlxyXG4gKiBUaGUgdmFsdWUgd2lsbCBiZSBlaXRoZXIgYGNsZWFyY29hdE5vcm1hbE1hcGAgb3IgYG5vcm1hbFZpZXdgLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtOb2RlPHZlYzM+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG1hdGVyaWFsQ2xlYXJjb2F0Tm9ybWFsID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBNYXRlcmlhbE5vZGUsIE1hdGVyaWFsTm9kZS5DTEVBUkNPQVRfTk9STUFMICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHJvdGF0aW9uIG9mIHRoZSBjdXJyZW50IHNwcml0ZSBtYXRlcmlhbC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbWF0ZXJpYWxSb3RhdGlvbiA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggTWF0ZXJpYWxOb2RlLCBNYXRlcmlhbE5vZGUuUk9UQVRJT04gKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgc2hlZW4gY29sb3Igb2YgdGhlIGN1cnJlbnQgbWF0ZXJpYWwuXHJcbiAqIFRoZSB2YWx1ZSBpcyBjb21wb3NlZCB2aWEgYHNoZWVuYCAqIGBzaGVlbkNvbG9yYCAqIGBzaGVlbkNvbG9yTWFwYC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTx2ZWMzPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBtYXRlcmlhbFNoZWVuID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBNYXRlcmlhbE5vZGUsIE1hdGVyaWFsTm9kZS5TSEVFTiApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBzaGVlbiByb3VnaG5lc3Mgb2YgdGhlIGN1cnJlbnQgbWF0ZXJpYWwuXHJcbiAqIFRoZSB2YWx1ZSBpcyBjb21wb3NlZCB2aWEgYHNoZWVuUm91Z2huZXNzYCAqIGBzaGVlblJvdWdobmVzc01hcC5hYC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbWF0ZXJpYWxTaGVlblJvdWdobmVzcyA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggTWF0ZXJpYWxOb2RlLCBNYXRlcmlhbE5vZGUuU0hFRU5fUk9VR0hORVNTICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGFuaXNvdHJvcHkgb2YgdGhlIGN1cnJlbnQgbWF0ZXJpYWwuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8dmVjMj59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbWF0ZXJpYWxBbmlzb3Ryb3B5ID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBNYXRlcmlhbE5vZGUsIE1hdGVyaWFsTm9kZS5BTklTT1RST1BZICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGlyaWRlc2NlbmNlIG9mIHRoZSBjdXJyZW50IG1hdGVyaWFsLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtOb2RlPGZsb2F0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBtYXRlcmlhbElyaWRlc2NlbmNlID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBNYXRlcmlhbE5vZGUsIE1hdGVyaWFsTm9kZS5JUklERVNDRU5DRSApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBpcmlkZXNjZW5jZSBJT1Igb2YgdGhlIGN1cnJlbnQgbWF0ZXJpYWwuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8ZmxvYXQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG1hdGVyaWFsSXJpZGVzY2VuY2VJT1IgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIE1hdGVyaWFsTm9kZSwgTWF0ZXJpYWxOb2RlLklSSURFU0NFTkNFX0lPUiApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBpcmlkZXNjZW5jZSB0aGlja25lc3Mgb2YgdGhlIGN1cnJlbnQgbWF0ZXJpYWwuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8ZmxvYXQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG1hdGVyaWFsSXJpZGVzY2VuY2VUaGlja25lc3MgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIE1hdGVyaWFsTm9kZSwgTWF0ZXJpYWxOb2RlLklSSURFU0NFTkNFX1RISUNLTkVTUyApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSB0cmFuc21pc3Npb24gb2YgdGhlIGN1cnJlbnQgbWF0ZXJpYWwuXHJcbiAqIFRoZSB2YWx1ZSBpcyBjb21wb3NlZCB2aWEgYHRyYW5zbWlzc2lvbmAgKiBgdHJhbnNtaXNzaW9uTWFwLnJgLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtOb2RlPGZsb2F0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBtYXRlcmlhbFRyYW5zbWlzc2lvbiA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggTWF0ZXJpYWxOb2RlLCBNYXRlcmlhbE5vZGUuVFJBTlNNSVNTSU9OICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHRoaWNrbmVzcyBvZiB0aGUgY3VycmVudCBtYXRlcmlhbC5cclxuICogVGhlIHZhbHVlIGlzIGNvbXBvc2VkIHZpYSBgdGhpY2tuZXNzYCAqIGB0aGlja25lc3NNYXAuZ2AuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8ZmxvYXQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG1hdGVyaWFsVGhpY2tuZXNzID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBNYXRlcmlhbE5vZGUsIE1hdGVyaWFsTm9kZS5USElDS05FU1MgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgSU9SIG9mIHRoZSBjdXJyZW50IG1hdGVyaWFsLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtOb2RlPGZsb2F0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBtYXRlcmlhbElPUiA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggTWF0ZXJpYWxOb2RlLCBNYXRlcmlhbE5vZGUuSU9SICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGF0dGVudWF0aW9uIGRpc3RhbmNlIG9mIHRoZSBjdXJyZW50IG1hdGVyaWFsLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtOb2RlPGZsb2F0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBtYXRlcmlhbEF0dGVudWF0aW9uRGlzdGFuY2UgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIE1hdGVyaWFsTm9kZSwgTWF0ZXJpYWxOb2RlLkFUVEVOVUFUSU9OX0RJU1RBTkNFICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGF0dGVudWF0aW9uIGNvbG9yIG9mIHRoZSBjdXJyZW50IG1hdGVyaWFsLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtOb2RlPHZlYzM+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG1hdGVyaWFsQXR0ZW51YXRpb25Db2xvciA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggTWF0ZXJpYWxOb2RlLCBNYXRlcmlhbE5vZGUuQVRURU5VQVRJT05fQ09MT1IgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgc2NhbGUgb2YgdGhlIGN1cnJlbnQgZGFzaGVkIGxpbmUgbWF0ZXJpYWwuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8ZmxvYXQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG1hdGVyaWFsTGluZVNjYWxlID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBNYXRlcmlhbE5vZGUsIE1hdGVyaWFsTm9kZS5MSU5FX1NDQUxFICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGRhc2ggc2l6ZSBvZiB0aGUgY3VycmVudCBkYXNoZWQgbGluZSBtYXRlcmlhbC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbWF0ZXJpYWxMaW5lRGFzaFNpemUgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIE1hdGVyaWFsTm9kZSwgTWF0ZXJpYWxOb2RlLkxJTkVfREFTSF9TSVpFICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGdhcCBzaXplIG9mIHRoZSBjdXJyZW50IGRhc2hlZCBsaW5lIG1hdGVyaWFsLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtOb2RlPGZsb2F0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBtYXRlcmlhbExpbmVHYXBTaXplID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBNYXRlcmlhbE5vZGUsIE1hdGVyaWFsTm9kZS5MSU5FX0dBUF9TSVpFICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGxpbmUgd2lkdGggb2YgdGhlIGN1cnJlbnQgbGluZSBtYXRlcmlhbC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbWF0ZXJpYWxMaW5lV2lkdGggPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIE1hdGVyaWFsTm9kZSwgTWF0ZXJpYWxOb2RlLkxJTkVfV0lEVEggKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgZGFzaCBvZmZzZXQgb2YgdGhlIGN1cnJlbnQgbGluZSBtYXRlcmlhbC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbWF0ZXJpYWxMaW5lRGFzaE9mZnNldCA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggTWF0ZXJpYWxOb2RlLCBNYXRlcmlhbE5vZGUuTElORV9EQVNIX09GRlNFVCApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBwb2ludCBzaXplIG9mIHRoZSBjdXJyZW50IHBvaW50cyBtYXRlcmlhbC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbWF0ZXJpYWxQb2ludFNpemUgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIE1hdGVyaWFsTm9kZSwgTWF0ZXJpYWxOb2RlLlBPSU5UX1NJWkUgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgZGlzcGVyc2lvbiBvZiB0aGUgY3VycmVudCBtYXRlcmlhbC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbWF0ZXJpYWxEaXNwZXJzaW9uID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBNYXRlcmlhbE5vZGUsIE1hdGVyaWFsTm9kZS5ESVNQRVJTSU9OICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGxpZ2h0IG1hcCBvZiB0aGUgY3VycmVudCBtYXRlcmlhbC5cclxuICogVGhlIHZhbHVlIGlzIGNvbXBvc2VkIHZpYSBgbGlnaHRNYXBJbnRlbnNpdHlgICogYGxpZ2h0TWFwLnJnYmAuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8dmVjMz59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbWF0ZXJpYWxMaWdodE1hcCA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggTWF0ZXJpYWxOb2RlLCBNYXRlcmlhbE5vZGUuTElHSFRfTUFQICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGFtYmllbnQgb2NjbHVzaW9uIG1hcCBvZiB0aGUgY3VycmVudCBtYXRlcmlhbC5cclxuICogVGhlIHZhbHVlIGlzIGNvbXBvc2VkIHZpYSBgYW9NYXAucmAgLSAxICogYGFvTWFwSW50ZW5zaXR5YCArIDEuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8ZmxvYXQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG1hdGVyaWFsQU8gPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIE1hdGVyaWFsTm9kZSwgTWF0ZXJpYWxOb2RlLkFPICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGFuaXNvdHJvcHkgdmVjdG9yIG9mIHRoZSBjdXJyZW50IG1hdGVyaWFsLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtOb2RlPHZlYzI+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG1hdGVyaWFsQW5pc290cm9weVZlY3RvciA9IC8qQF9fUFVSRV9fKi8gdW5pZm9ybSggbmV3IFZlY3RvcjIoKSApLm9uUmVmZXJlbmNlKCBmdW5jdGlvbiAoIGZyYW1lICkge1xyXG5cclxuXHRyZXR1cm4gZnJhbWUubWF0ZXJpYWw7XHJcblxyXG59ICkub25SZW5kZXJVcGRhdGUoIGZ1bmN0aW9uICggeyBtYXRlcmlhbCB9ICkge1xyXG5cclxuXHR0aGlzLnZhbHVlLnNldCggbWF0ZXJpYWwuYW5pc290cm9weSAqIE1hdGguY29zKCBtYXRlcmlhbC5hbmlzb3Ryb3B5Um90YXRpb24gKSwgbWF0ZXJpYWwuYW5pc290cm9weSAqIE1hdGguc2luKCBtYXRlcmlhbC5hbmlzb3Ryb3B5Um90YXRpb24gKSApO1xyXG5cclxufSApO1xyXG4iLCJpbXBvcnQgeyBGbiB9IGZyb20gJy4uL3RzbC9UU0xDb3JlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgcG9zaXRpb24gaW4gY2xpcCBzcGFjZSBhZnRlciB0aGUgbW9kZWwtdmlldy1wcm9qZWN0aW9uIHRyYW5zZm9ybSBvZiB0aGUgY3VycmVudCByZW5kZXJlZCBvYmplY3QuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1ZhcnlpbmdOb2RlPHZlYzQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG1vZGVsVmlld1Byb2plY3Rpb24gPSAvKkBfX1BVUkVfXyovICggRm4oICggYnVpbGRlciApID0+IHtcclxuXHJcblx0cmV0dXJuIGJ1aWxkZXIuY29udGV4dC5zZXR1cE1vZGVsVmlld1Byb2plY3Rpb24oKTtcclxuXHJcbn0sICd2ZWM0JyApLm9uY2UoKSApKCkudG9WYXJ5aW5nKCAndl9tb2RlbFZpZXdQcm9qZWN0aW9uJyApO1xyXG4iLCJpbXBvcnQgTm9kZSBmcm9tICcuL05vZGUuanMnO1xyXG5pbXBvcnQgeyBub2RlSW1tdXRhYmxlLCB2YXJ5aW5nIH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBzaGFkZXIgaW5kaWNlcyBvZiBkaWZmZXJlbnQgdHlwZXMuIFRoZSBmb2xsb3dpbmcgcHJlZGVmaW5lZCBub2RlXHJcbiAqIG9iamVjdHMgY292ZXIgZnJlcXVlbnQgdXNlIGNhc2VzOlxyXG4gKlxyXG4gKiAtIGB2ZXJ0ZXhJbmRleGA6IFRoZSBpbmRleCBvZiBhIHZlcnRleCB3aXRoaW4gYSBtZXNoLlxyXG4gKiAtIGBpbnN0YW5jZUluZGV4YDogVGhlIGluZGV4IG9mIGVpdGhlciBhIG1lc2ggaW5zdGFuY2Ugb3IgYW4gaW52b2NhdGlvbiBvZiBhIGNvbXB1dGUgc2hhZGVyLlxyXG4gKiAtIGBkcmF3SW5kZXhgOiBUaGUgaW5kZXggb2YgYSBkcmF3IGNhbGwuXHJcbiAqIC0gYGludm9jYXRpb25Mb2NhbEluZGV4YDogVGhlIGluZGV4IG9mIGEgY29tcHV0ZSBpbnZvY2F0aW9uIHdpdGhpbiB0aGUgc2NvcGUgb2YgYSB3b3JrZ3JvdXAgbG9hZC5cclxuICogLSBgaW52b2NhdGlvblN1Ymdyb3VwSW5kZXhgOiBUaGUgaW5kZXggb2YgYSBjb21wdXRlIGludm9jYXRpb24gd2l0aGluIHRoZSBzY29wZSBvZiBhIHN1Ymdyb3VwLlxyXG4gKiAtIGBzdWJncm91cEluZGV4YDogVGhlIGluZGV4IG9mIHRoZSBzdWJncm91cCB0aGUgY3VycmVudCBjb21wdXRlIGludm9jYXRpb24gYmVsb25ncyB0by5cclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVcclxuICovXHJcbmNsYXNzIEluZGV4Tm9kZSBleHRlbmRzIE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdJbmRleE5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgaW5kZXggbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7KCd2ZXJ0ZXgnfCdpbnN0YW5jZSd8J3N1Ymdyb3VwJ3wnaW52b2NhdGlvbkxvY2FsJ3wnaW52b2NhdGlvblN1Ymdyb3VwJ3wnZHJhdycpfSBzY29wZSAtIFRoZSBzY29wZSBvZiB0aGUgaW5kZXggbm9kZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggc2NvcGUgKSB7XHJcblxyXG5cdFx0c3VwZXIoICd1aW50JyApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHNjb3BlIG9mIHRoZSBpbmRleCBub2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2NvcGUgPSBzY29wZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNJbmRleE5vZGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdGdlbmVyYXRlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IG5vZGVUeXBlID0gdGhpcy5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cdFx0Y29uc3Qgc2NvcGUgPSB0aGlzLnNjb3BlO1xyXG5cclxuXHRcdGxldCBwcm9wZXJ0eU5hbWU7XHJcblxyXG5cdFx0aWYgKCBzY29wZSA9PT0gSW5kZXhOb2RlLlZFUlRFWCApIHtcclxuXHJcblx0XHRcdHByb3BlcnR5TmFtZSA9IGJ1aWxkZXIuZ2V0VmVydGV4SW5kZXgoKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBzY29wZSA9PT0gSW5kZXhOb2RlLklOU1RBTkNFICkge1xyXG5cclxuXHRcdFx0cHJvcGVydHlOYW1lID0gYnVpbGRlci5nZXRJbnN0YW5jZUluZGV4KCk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggc2NvcGUgPT09IEluZGV4Tm9kZS5EUkFXICkge1xyXG5cclxuXHRcdFx0cHJvcGVydHlOYW1lID0gYnVpbGRlci5nZXREcmF3SW5kZXgoKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBzY29wZSA9PT0gSW5kZXhOb2RlLklOVk9DQVRJT05fTE9DQUwgKSB7XHJcblxyXG5cdFx0XHRwcm9wZXJ0eU5hbWUgPSBidWlsZGVyLmdldEludm9jYXRpb25Mb2NhbEluZGV4KCk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggc2NvcGUgPT09IEluZGV4Tm9kZS5JTlZPQ0FUSU9OX1NVQkdST1VQICkge1xyXG5cclxuXHRcdFx0cHJvcGVydHlOYW1lID0gYnVpbGRlci5nZXRJbnZvY2F0aW9uU3ViZ3JvdXBJbmRleCgpO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHNjb3BlID09PSBJbmRleE5vZGUuU1VCR1JPVVAgKSB7XHJcblxyXG5cdFx0XHRwcm9wZXJ0eU5hbWUgPSBidWlsZGVyLmdldFN1Ymdyb3VwSW5kZXgoKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuSW5kZXhOb2RlOiBVbmtub3duIHNjb3BlOiAnICsgc2NvcGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0bGV0IG91dHB1dDtcclxuXHJcblx0XHRpZiAoIGJ1aWxkZXIuc2hhZGVyU3RhZ2UgPT09ICd2ZXJ0ZXgnIHx8IGJ1aWxkZXIuc2hhZGVyU3RhZ2UgPT09ICdjb21wdXRlJyApIHtcclxuXHJcblx0XHRcdG91dHB1dCA9IHByb3BlcnR5TmFtZTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc3Qgbm9kZVZhcnlpbmcgPSB2YXJ5aW5nKCB0aGlzICk7XHJcblxyXG5cdFx0XHRvdXRwdXQgPSBub2RlVmFyeWluZy5idWlsZCggYnVpbGRlciwgbm9kZVR5cGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG91dHB1dDtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuSW5kZXhOb2RlLlZFUlRFWCA9ICd2ZXJ0ZXgnO1xyXG5JbmRleE5vZGUuSU5TVEFOQ0UgPSAnaW5zdGFuY2UnO1xyXG5JbmRleE5vZGUuU1VCR1JPVVAgPSAnc3ViZ3JvdXAnO1xyXG5JbmRleE5vZGUuSU5WT0NBVElPTl9MT0NBTCA9ICdpbnZvY2F0aW9uTG9jYWwnO1xyXG5JbmRleE5vZGUuSU5WT0NBVElPTl9TVUJHUk9VUCA9ICdpbnZvY2F0aW9uU3ViZ3JvdXAnO1xyXG5JbmRleE5vZGUuRFJBVyA9ICdkcmF3JztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IEluZGV4Tm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgaW5kZXggb2YgYSB2ZXJ0ZXggd2l0aGluIGEgbWVzaC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7SW5kZXhOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHZlcnRleEluZGV4ID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBJbmRleE5vZGUsIEluZGV4Tm9kZS5WRVJURVggKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgaW5kZXggb2YgZWl0aGVyIGEgbWVzaCBpbnN0YW5jZSBvciBhbiBpbnZvY2F0aW9uIG9mIGEgY29tcHV0ZSBzaGFkZXIuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge0luZGV4Tm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBpbnN0YW5jZUluZGV4ID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBJbmRleE5vZGUsIEluZGV4Tm9kZS5JTlNUQU5DRSApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBpbmRleCBvZiB0aGUgc3ViZ3JvdXAgdGhlIGN1cnJlbnQgY29tcHV0ZSBpbnZvY2F0aW9uIGJlbG9uZ3MgdG8uXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge0luZGV4Tm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBzdWJncm91cEluZGV4ID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBJbmRleE5vZGUsIEluZGV4Tm9kZS5TVUJHUk9VUCApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBpbmRleCBvZiBhIGNvbXB1dGUgaW52b2NhdGlvbiB3aXRoaW4gdGhlIHNjb3BlIG9mIGEgc3ViZ3JvdXAuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge0luZGV4Tm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBpbnZvY2F0aW9uU3ViZ3JvdXBJbmRleCA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggSW5kZXhOb2RlLCBJbmRleE5vZGUuSU5WT0NBVElPTl9TVUJHUk9VUCApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBpbmRleCBvZiBhIGNvbXB1dGUgaW52b2NhdGlvbiB3aXRoaW4gdGhlIHNjb3BlIG9mIGEgd29ya2dyb3VwIGxvYWQuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge0luZGV4Tm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBpbnZvY2F0aW9uTG9jYWxJbmRleCA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggSW5kZXhOb2RlLCBJbmRleE5vZGUuSU5WT0NBVElPTl9MT0NBTCApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBpbmRleCBvZiBhIGRyYXcgY2FsbC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7SW5kZXhOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGRyYXdJbmRleCA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggSW5kZXhOb2RlLCBJbmRleE5vZGUuRFJBVyApO1xyXG4iLCJpbXBvcnQgTm9kZSBmcm9tICcuLi9jb3JlL05vZGUuanMnO1xyXG5pbXBvcnQgeyB2YXJ5aW5nUHJvcGVydHkgfSBmcm9tICcuLi9jb3JlL1Byb3BlcnR5Tm9kZS5qcyc7XHJcbmltcG9ydCB7IGluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSwgaW5zdGFuY2VkRHluYW1pY0J1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4vQnVmZmVyQXR0cmlidXRlTm9kZS5qcyc7XHJcbmltcG9ydCB7IG5vcm1hbExvY2FsLCB0cmFuc2Zvcm1Ob3JtYWwgfSBmcm9tICcuL05vcm1hbC5qcyc7XHJcbmltcG9ydCB7IHBvc2l0aW9uTG9jYWwgfSBmcm9tICcuL1Bvc2l0aW9uLmpzJztcclxuaW1wb3J0IHsgbm9kZVByb3h5LCB2ZWMzLCBtYXQ0IH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5pbXBvcnQgeyBOb2RlVXBkYXRlVHlwZSB9IGZyb20gJy4uL2NvcmUvY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgYnVmZmVyIH0gZnJvbSAnLi4vYWNjZXNzb3JzL0J1ZmZlck5vZGUuanMnO1xyXG5pbXBvcnQgeyBpbnN0YW5jZUluZGV4IH0gZnJvbSAnLi4vY29yZS9JbmRleE5vZGUuanMnO1xyXG5cclxuaW1wb3J0IHsgSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIgfSBmcm9tICcuLi8uLi9jb3JlL0luc3RhbmNlZEludGVybGVhdmVkQnVmZmVyLmpzJztcclxuaW1wb3J0IHsgSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vLi4vY29yZS9JbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5pbXBvcnQgeyBEeW5hbWljRHJhd1VzYWdlIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIG5vZGUgaW1wbGVtZW50cyB0aGUgdmVydGV4IHNoYWRlciBsb2dpYyB3aGljaCBpcyByZXF1aXJlZFxyXG4gKiB3aGVuIHJlbmRlcmluZyAzRCBvYmplY3RzIHZpYSBpbnN0YW5jaW5nLiBUaGUgY29kZSBtYWtlcyBzdXJlXHJcbiAqIHZlcnRleCBwb3NpdGlvbnMsIG5vcm1hbHMgYW5kIGNvbG9ycyBjYW4gYmUgbW9kaWZpZWQgdmlhIGluc3RhbmNlZFxyXG4gKiBkYXRhLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTm9kZVxyXG4gKi9cclxuY2xhc3MgSW5zdGFuY2VOb2RlIGV4dGVuZHMgTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ0luc3RhbmNlTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGNvdW50IC0gVGhlIG51bWJlciBvZiBpbnN0YW5jZXMuXHJcblx0ICogQHBhcmFtIHtJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGV9IGluc3RhbmNlTWF0cml4IC0gSW5zdGFuY2VkIGJ1ZmZlciBhdHRyaWJ1dGUgcmVwcmVzZW50aW5nIHRoZSBpbnN0YW5jZSB0cmFuc2Zvcm1hdGlvbnMuXHJcblx0ICogQHBhcmFtIHtJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGV9IGluc3RhbmNlQ29sb3IgLSBJbnN0YW5jZWQgYnVmZmVyIGF0dHJpYnV0ZSByZXByZXNlbnRpbmcgdGhlIGluc3RhbmNlIGNvbG9ycy5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggY291bnQsIGluc3RhbmNlTWF0cml4LCBpbnN0YW5jZUNvbG9yICkge1xyXG5cclxuXHRcdHN1cGVyKCAndm9pZCcgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBudW1iZXIgb2YgaW5zdGFuY2VzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY291bnQgPSBjb3VudDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEluc3RhbmNlZCBidWZmZXIgYXR0cmlidXRlIHJlcHJlc2VudGluZyB0aGUgdHJhbnNmb3JtYXRpb24gb2YgaW5zdGFuY2VzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaW5zdGFuY2VNYXRyaXggPSBpbnN0YW5jZU1hdHJpeDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEluc3RhbmNlZCBidWZmZXIgYXR0cmlidXRlIHJlcHJlc2VudGluZyB0aGUgY29sb3Igb2YgaW5zdGFuY2VzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaW5zdGFuY2VDb2xvciA9IGluc3RhbmNlQ29sb3I7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbm9kZSB0aGF0IHJlcHJlc2VudHMgdGhlIGluc3RhbmNlIG1hdHJpeCBkYXRhLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Tm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pbnN0YW5jZU1hdHJpeE5vZGUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG5vZGUgdGhhdCByZXByZXNlbnRzIHRoZSBpbnN0YW5jZSBjb2xvciBkYXRhLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Tm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pbnN0YW5jZUNvbG9yTm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdXBkYXRlIHR5cGUgaXMgc2V0IHRvIGBmcmFtZWAgc2luY2UgYW4gdXBkYXRlXHJcblx0XHQgKiBvZiBpbnN0YW5jZWQgYnVmZmVyIGRhdGEgbXVzdCBiZSBjaGVja2VkIHBlciBmcmFtZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICogQGRlZmF1bHQgJ2ZyYW1lJ1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVwZGF0ZVR5cGUgPSBOb2RlVXBkYXRlVHlwZS5GUkFNRTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIGEgYnVmZmVyIHRoYXQgaXMgdXNlZCBieSBgaW5zdGFuY2VNYXRyaXhOb2RlYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P0luc3RhbmNlZEludGVybGVhdmVkQnVmZmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJ1ZmZlciA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZSB0byBhIGJ1ZmZlciB0aGF0IGlzIHVzZWQgYnkgYGluc3RhbmNlQ29sb3JOb2RlYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5idWZmZXJDb2xvciA9IG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0dXBzIHRoZSBpbnRlcm5hbCBidWZmZXJzIGFuZCBub2RlcyBhbmQgYXNzaWducyB0aGUgdHJhbnNmb3JtZWQgdmVydGV4IGRhdGFcclxuXHQgKiB0byBwcmVkZWZpbmVkIG5vZGUgdmFyaWFibGVzIGZvciBhY2N1bXVsYXRpb24uIFRoYXQgZm9sbG93cyB0aGUgc2FtZSBwYXR0ZXJuc1xyXG5cdCAqIGxpa2Ugd2l0aCBtb3JwaCBhbmQgc2tpbm5pbmcgbm9kZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqL1xyXG5cdHNldHVwKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IHsgY291bnQsIGluc3RhbmNlTWF0cml4LCBpbnN0YW5jZUNvbG9yIH0gPSB0aGlzO1xyXG5cclxuXHRcdGxldCB7IGluc3RhbmNlTWF0cml4Tm9kZSwgaW5zdGFuY2VDb2xvck5vZGUgfSA9IHRoaXM7XHJcblxyXG5cdFx0aWYgKCBpbnN0YW5jZU1hdHJpeE5vZGUgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHQvLyBCb3RoIFdlYkdQVSBhbmQgV2ViR0wgYmFja2VuZHMgaGF2ZSBVQk8gbWF4IGxpbWl0ZWQgdG8gNjRrYi4gTWF0cml4IGNvdW50IG51bWJlciBiaWdnZXIgdGhhbiAxMDAwICggMTYgKiA0ICogMTAwMCA9IDY0a2IgKSB3aWxsIGZhbGxiYWNrIHRvIGF0dHJpYnV0ZS5cclxuXHJcblx0XHRcdGlmICggY291bnQgPD0gMTAwMCApIHtcclxuXHJcblx0XHRcdFx0aW5zdGFuY2VNYXRyaXhOb2RlID0gYnVmZmVyKCBpbnN0YW5jZU1hdHJpeC5hcnJheSwgJ21hdDQnLCBNYXRoLm1heCggY291bnQsIDEgKSApLmVsZW1lbnQoIGluc3RhbmNlSW5kZXggKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGJ1ZmZlciA9IG5ldyBJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlciggaW5zdGFuY2VNYXRyaXguYXJyYXksIDE2LCAxICk7XHJcblxyXG5cdFx0XHRcdHRoaXMuYnVmZmVyID0gYnVmZmVyO1xyXG5cclxuXHRcdFx0XHRjb25zdCBidWZmZXJGbiA9IGluc3RhbmNlTWF0cml4LnVzYWdlID09PSBEeW5hbWljRHJhd1VzYWdlID8gaW5zdGFuY2VkRHluYW1pY0J1ZmZlckF0dHJpYnV0ZSA6IGluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZTtcclxuXHJcblx0XHRcdFx0Y29uc3QgaW5zdGFuY2VCdWZmZXJzID0gW1xyXG5cdFx0XHRcdFx0Ly8gRi5TaWduYXR1cmUgLT4gYnVmZmVyQXR0cmlidXRlKCBhcnJheSwgdHlwZSwgc3RyaWRlLCBvZmZzZXQgKVxyXG5cdFx0XHRcdFx0YnVmZmVyRm4oIGJ1ZmZlciwgJ3ZlYzQnLCAxNiwgMCApLFxyXG5cdFx0XHRcdFx0YnVmZmVyRm4oIGJ1ZmZlciwgJ3ZlYzQnLCAxNiwgNCApLFxyXG5cdFx0XHRcdFx0YnVmZmVyRm4oIGJ1ZmZlciwgJ3ZlYzQnLCAxNiwgOCApLFxyXG5cdFx0XHRcdFx0YnVmZmVyRm4oIGJ1ZmZlciwgJ3ZlYzQnLCAxNiwgMTIgKVxyXG5cdFx0XHRcdF07XHJcblxyXG5cdFx0XHRcdGluc3RhbmNlTWF0cml4Tm9kZSA9IG1hdDQoIC4uLmluc3RhbmNlQnVmZmVycyApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5pbnN0YW5jZU1hdHJpeE5vZGUgPSBpbnN0YW5jZU1hdHJpeE5vZGU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggaW5zdGFuY2VDb2xvciAmJiBpbnN0YW5jZUNvbG9yTm9kZSA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGJ1ZmZlciA9IG5ldyBJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUoIGluc3RhbmNlQ29sb3IuYXJyYXksIDMgKTtcclxuXHJcblx0XHRcdGNvbnN0IGJ1ZmZlckZuID0gaW5zdGFuY2VDb2xvci51c2FnZSA9PT0gRHluYW1pY0RyYXdVc2FnZSA/IGluc3RhbmNlZER5bmFtaWNCdWZmZXJBdHRyaWJ1dGUgOiBpbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU7XHJcblxyXG5cdFx0XHR0aGlzLmJ1ZmZlckNvbG9yID0gYnVmZmVyO1xyXG5cclxuXHRcdFx0aW5zdGFuY2VDb2xvck5vZGUgPSB2ZWMzKCBidWZmZXJGbiggYnVmZmVyLCAndmVjMycsIDMsIDAgKSApO1xyXG5cclxuXHRcdFx0dGhpcy5pbnN0YW5jZUNvbG9yTm9kZSA9IGluc3RhbmNlQ29sb3JOb2RlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBQT1NJVElPTlxyXG5cclxuXHRcdGNvbnN0IGluc3RhbmNlUG9zaXRpb24gPSBpbnN0YW5jZU1hdHJpeE5vZGUubXVsKCBwb3NpdGlvbkxvY2FsICkueHl6O1xyXG5cdFx0cG9zaXRpb25Mb2NhbC5hc3NpZ24oIGluc3RhbmNlUG9zaXRpb24gKTtcclxuXHJcblx0XHQvLyBOT1JNQUxcclxuXHJcblx0XHRpZiAoIGJ1aWxkZXIuaGFzR2VvbWV0cnlBdHRyaWJ1dGUoICdub3JtYWwnICkgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBpbnN0YW5jZU5vcm1hbCA9IHRyYW5zZm9ybU5vcm1hbCggbm9ybWFsTG9jYWwsIGluc3RhbmNlTWF0cml4Tm9kZSApO1xyXG5cclxuXHRcdFx0Ly8gQVNTSUdOU1xyXG5cclxuXHRcdFx0bm9ybWFsTG9jYWwuYXNzaWduKCBpbnN0YW5jZU5vcm1hbCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBDT0xPUlxyXG5cclxuXHRcdGlmICggdGhpcy5pbnN0YW5jZUNvbG9yTm9kZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHZhcnlpbmdQcm9wZXJ0eSggJ3ZlYzMnLCAndkluc3RhbmNlQ29sb3InICkuYXNzaWduKCB0aGlzLmluc3RhbmNlQ29sb3JOb2RlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENoZWNrcyBpZiB0aGUgaW50ZXJuYWwgYnVmZmVycyByZXF1aXJlZCBhbiB1cGRhdGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVGcmFtZX0gZnJhbWUgLSBUaGUgY3VycmVudCBub2RlIGZyYW1lLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZSggLypmcmFtZSovICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5pbnN0YW5jZU1hdHJpeC51c2FnZSAhPT0gRHluYW1pY0RyYXdVc2FnZSAmJiB0aGlzLmJ1ZmZlciAhPT0gbnVsbCAmJiB0aGlzLmluc3RhbmNlTWF0cml4LnZlcnNpb24gIT09IHRoaXMuYnVmZmVyLnZlcnNpb24gKSB7XHJcblxyXG5cdFx0XHR0aGlzLmJ1ZmZlci52ZXJzaW9uID0gdGhpcy5pbnN0YW5jZU1hdHJpeC52ZXJzaW9uO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMuaW5zdGFuY2VDb2xvciAmJiB0aGlzLmluc3RhbmNlQ29sb3IudXNhZ2UgIT09IER5bmFtaWNEcmF3VXNhZ2UgJiYgdGhpcy5idWZmZXJDb2xvciAhPT0gbnVsbCAmJiB0aGlzLmluc3RhbmNlQ29sb3IudmVyc2lvbiAhPT0gdGhpcy5idWZmZXJDb2xvci52ZXJzaW9uICkge1xyXG5cclxuXHRcdFx0dGhpcy5idWZmZXJDb2xvci52ZXJzaW9uID0gdGhpcy5pbnN0YW5jZUNvbG9yLnZlcnNpb247XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBJbnN0YW5jZU5vZGU7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhbiBpbnN0YW5jZSBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge251bWJlcn0gY291bnQgLSBUaGUgbnVtYmVyIG9mIGluc3RhbmNlcy5cclxuICogQHBhcmFtIHtJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGV9IGluc3RhbmNlTWF0cml4IC0gSW5zdGFuY2VkIGJ1ZmZlciBhdHRyaWJ1dGUgcmVwcmVzZW50aW5nIHRoZSBpbnN0YW5jZSB0cmFuc2Zvcm1hdGlvbnMuXHJcbiAqIEBwYXJhbSB7SW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlfSBpbnN0YW5jZUNvbG9yIC0gSW5zdGFuY2VkIGJ1ZmZlciBhdHRyaWJ1dGUgcmVwcmVzZW50aW5nIHRoZSBpbnN0YW5jZSBjb2xvcnMuXHJcbiAqIEByZXR1cm5zIHtJbnN0YW5jZU5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgaW5zdGFuY2UgPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggSW5zdGFuY2VOb2RlICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAzICk7XHJcbiIsImltcG9ydCBJbnN0YW5jZU5vZGUgZnJvbSAnLi9JbnN0YW5jZU5vZGUuanMnO1xyXG5pbXBvcnQgeyBub2RlUHJveHkgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBpcyBhIHNwZWNpYWwgdmVyc2lvbiBvZiBgSW5zdGFuY2VOb2RlYCB3aGljaCByZXF1aXJlcyB0aGUgdXNhZ2Ugb2Yge0BsaW5rIEluc3RhbmNlZE1lc2h9LlxyXG4gKiBJdCBhbGxvd3MgYW4gZWFzaWVyIHNldHVwIG9mIHRoZSBpbnN0YW5jZSBub2RlLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgSW5zdGFuY2VOb2RlXHJcbiAqL1xyXG5jbGFzcyBJbnN0YW5jZWRNZXNoTm9kZSBleHRlbmRzIEluc3RhbmNlTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ0luc3RhbmNlZE1lc2hOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlZCBtZXNoIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0luc3RhbmNlZE1lc2h9IGluc3RhbmNlZE1lc2ggLSBUaGUgaW5zdGFuY2VkIG1lc2guXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGluc3RhbmNlZE1lc2ggKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBjb3VudCwgaW5zdGFuY2VNYXRyaXgsIGluc3RhbmNlQ29sb3IgfSA9IGluc3RhbmNlZE1lc2g7XHJcblxyXG5cdFx0c3VwZXIoIGNvdW50LCBpbnN0YW5jZU1hdHJpeCwgaW5zdGFuY2VDb2xvciApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIGluc3RhbmNlZCBtZXNoLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtJbnN0YW5jZWRNZXNofVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmluc3RhbmNlZE1lc2ggPSBpbnN0YW5jZWRNZXNoO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBJbnN0YW5jZWRNZXNoTm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGFuIGluc3RhbmNlZCBtZXNoIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7SW5zdGFuY2VkTWVzaH0gaW5zdGFuY2VkTWVzaCAtIFRoZSBpbnN0YW5jZWRNZXNoLlxyXG4gKiBAcmV0dXJucyB7SW5zdGFuY2VkTWVzaE5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgaW5zdGFuY2VkTWVzaCA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBJbnN0YW5jZWRNZXNoTm9kZSApLnNldFBhcmFtZXRlckxlbmd0aCggMSApO1xyXG4iLCJpbXBvcnQgTm9kZSBmcm9tICcuLi9jb3JlL05vZGUuanMnO1xyXG5pbXBvcnQgeyBub3JtYWxMb2NhbCB9IGZyb20gJy4vTm9ybWFsLmpzJztcclxuaW1wb3J0IHsgcG9zaXRpb25Mb2NhbCB9IGZyb20gJy4vUG9zaXRpb24uanMnO1xyXG5pbXBvcnQgeyBub2RlUHJveHksIHZlYzMsIG1hdDMsIG1hdDQsIGludCwgaXZlYzIsIGZsb2F0LCBGbiB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuaW1wb3J0IHsgdGV4dHVyZUxvYWQgfSBmcm9tICcuL1RleHR1cmVOb2RlLmpzJztcclxuaW1wb3J0IHsgdGV4dHVyZVNpemUgfSBmcm9tICcuL1RleHR1cmVTaXplTm9kZS5qcyc7XHJcbmltcG9ydCB7IHRhbmdlbnRMb2NhbCB9IGZyb20gJy4vVGFuZ2VudC5qcyc7XHJcbmltcG9ydCB7IGluc3RhbmNlSW5kZXgsIGRyYXdJbmRleCB9IGZyb20gJy4uL2NvcmUvSW5kZXhOb2RlLmpzJztcclxuaW1wb3J0IHsgdmFyeWluZ1Byb3BlcnR5IH0gZnJvbSAnLi4vY29yZS9Qcm9wZXJ0eU5vZGUuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgbm9kZSBpbXBsZW1lbnRzIHRoZSB2ZXJ0ZXggc2hhZGVyIGxvZ2ljIHdoaWNoIGlzIHJlcXVpcmVkXHJcbiAqIHdoZW4gcmVuZGVyaW5nIDNEIG9iamVjdHMgdmlhIGJhdGNoaW5nLiBgQmF0Y2hOb2RlYCBtdXN0IGJlIHVzZWRcclxuICogd2l0aCBpbnN0YW5jZXMgb2Yge0BsaW5rIEJhdGNoZWRNZXNofS5cclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVcclxuICovXHJcbmNsYXNzIEJhdGNoTm9kZSBleHRlbmRzIE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdCYXRjaE5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYmF0Y2ggbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QmF0Y2hlZE1lc2h9IGJhdGNoTWVzaCAtIEEgcmVmZXJlbmNlIHRvIGJhdGNoZWQgbWVzaC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggYmF0Y2hNZXNoICkge1xyXG5cclxuXHRcdHN1cGVyKCAndm9pZCcgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIGJhdGNoZWQgbWVzaC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QmF0Y2hlZE1lc2h9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYmF0Y2hNZXNoID0gYmF0Y2hNZXNoO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGJhdGNoaW5nIGluZGV4IG5vZGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9JbmRleE5vZGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYmF0Y2hpbmdJZE5vZGUgPSBudWxsO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHVwcyB0aGUgaW50ZXJuYWwgYnVmZmVycyBhbmQgbm9kZXMgYW5kIGFzc2lnbnMgdGhlIHRyYW5zZm9ybWVkIHZlcnRleCBkYXRhXHJcblx0ICogdG8gcHJlZGVmaW5lZCBub2RlIHZhcmlhYmxlcyBmb3IgYWNjdW11bGF0aW9uLiBUaGF0IGZvbGxvd3MgdGhlIHNhbWUgcGF0dGVybnNcclxuXHQgKiBsaWtlIHdpdGggbW9ycGggYW5kIHNraW5uaW5nIG5vZGVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKi9cclxuXHRzZXR1cCggYnVpbGRlciApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuYmF0Y2hpbmdJZE5vZGUgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGJ1aWxkZXIuZ2V0RHJhd0luZGV4KCkgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdHRoaXMuYmF0Y2hpbmdJZE5vZGUgPSBpbnN0YW5jZUluZGV4O1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0dGhpcy5iYXRjaGluZ0lkTm9kZSA9IGRyYXdJbmRleDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgZ2V0SW5kaXJlY3RJbmRleCA9IEZuKCAoIFsgaWQgXSApID0+IHtcclxuXHJcblx0XHRcdGNvbnN0IHNpemUgPSBpbnQoIHRleHR1cmVTaXplKCB0ZXh0dXJlTG9hZCggdGhpcy5iYXRjaE1lc2guX2luZGlyZWN0VGV4dHVyZSApLCAwICkueCApO1xyXG5cdFx0XHRjb25zdCB4ID0gaW50KCBpZCApLm1vZCggc2l6ZSApO1xyXG5cdFx0XHRjb25zdCB5ID0gaW50KCBpZCApLmRpdiggc2l6ZSApO1xyXG5cdFx0XHRyZXR1cm4gdGV4dHVyZUxvYWQoIHRoaXMuYmF0Y2hNZXNoLl9pbmRpcmVjdFRleHR1cmUsIGl2ZWMyKCB4LCB5ICkgKS54O1xyXG5cclxuXHRcdH0gKS5zZXRMYXlvdXQoIHtcclxuXHRcdFx0bmFtZTogJ2dldEluZGlyZWN0SW5kZXgnLFxyXG5cdFx0XHR0eXBlOiAndWludCcsXHJcblx0XHRcdGlucHV0czogW1xyXG5cdFx0XHRcdHsgbmFtZTogJ2lkJywgdHlwZTogJ2ludCcgfVxyXG5cdFx0XHRdXHJcblx0XHR9ICk7XHJcblxyXG5cdFx0Y29uc3QgaW5kaXJlY3RJZCA9IGdldEluZGlyZWN0SW5kZXgoIGludCggdGhpcy5iYXRjaGluZ0lkTm9kZSApICk7XHJcblxyXG5cdFx0Y29uc3QgbWF0cmljZXNUZXh0dXJlID0gdGhpcy5iYXRjaE1lc2guX21hdHJpY2VzVGV4dHVyZTtcclxuXHJcblx0XHRjb25zdCBzaXplID0gaW50KCB0ZXh0dXJlU2l6ZSggdGV4dHVyZUxvYWQoIG1hdHJpY2VzVGV4dHVyZSApLCAwICkueCApO1xyXG5cdFx0Y29uc3QgaiA9IGZsb2F0KCBpbmRpcmVjdElkICkubXVsKCA0ICkudG9JbnQoKS50b1ZhcigpO1xyXG5cclxuXHRcdGNvbnN0IHggPSBqLm1vZCggc2l6ZSApO1xyXG5cdFx0Y29uc3QgeSA9IGouZGl2KCBzaXplICk7XHJcblx0XHRjb25zdCBiYXRjaGluZ01hdHJpeCA9IG1hdDQoXHJcblx0XHRcdHRleHR1cmVMb2FkKCBtYXRyaWNlc1RleHR1cmUsIGl2ZWMyKCB4LCB5ICkgKSxcclxuXHRcdFx0dGV4dHVyZUxvYWQoIG1hdHJpY2VzVGV4dHVyZSwgaXZlYzIoIHguYWRkKCAxICksIHkgKSApLFxyXG5cdFx0XHR0ZXh0dXJlTG9hZCggbWF0cmljZXNUZXh0dXJlLCBpdmVjMiggeC5hZGQoIDIgKSwgeSApICksXHJcblx0XHRcdHRleHR1cmVMb2FkKCBtYXRyaWNlc1RleHR1cmUsIGl2ZWMyKCB4LmFkZCggMyApLCB5ICkgKVxyXG5cdFx0KTtcclxuXHJcblxyXG5cdFx0Y29uc3QgY29sb3JzVGV4dHVyZSA9IHRoaXMuYmF0Y2hNZXNoLl9jb2xvcnNUZXh0dXJlO1xyXG5cclxuXHRcdGlmICggY29sb3JzVGV4dHVyZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGdldEJhdGNoaW5nQ29sb3IgPSBGbiggKCBbIGlkIF0gKSA9PiB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHNpemUgPSBpbnQoIHRleHR1cmVTaXplKCB0ZXh0dXJlTG9hZCggY29sb3JzVGV4dHVyZSApLCAwICkueCApO1xyXG5cdFx0XHRcdGNvbnN0IGogPSBpZDtcclxuXHRcdFx0XHRjb25zdCB4ID0gai5tb2QoIHNpemUgKTtcclxuXHRcdFx0XHRjb25zdCB5ID0gai5kaXYoIHNpemUgKTtcclxuXHRcdFx0XHRyZXR1cm4gdGV4dHVyZUxvYWQoIGNvbG9yc1RleHR1cmUsIGl2ZWMyKCB4LCB5ICkgKS5yZ2I7XHJcblxyXG5cdFx0XHR9ICkuc2V0TGF5b3V0KCB7XHJcblx0XHRcdFx0bmFtZTogJ2dldEJhdGNoaW5nQ29sb3InLFxyXG5cdFx0XHRcdHR5cGU6ICd2ZWMzJyxcclxuXHRcdFx0XHRpbnB1dHM6IFtcclxuXHRcdFx0XHRcdHsgbmFtZTogJ2lkJywgdHlwZTogJ2ludCcgfVxyXG5cdFx0XHRcdF1cclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdFx0Y29uc3QgY29sb3IgPSBnZXRCYXRjaGluZ0NvbG9yKCBpbmRpcmVjdElkICk7XHJcblxyXG5cdFx0XHR2YXJ5aW5nUHJvcGVydHkoICd2ZWMzJywgJ3ZCYXRjaENvbG9yJyApLmFzc2lnbiggY29sb3IgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgYm0gPSBtYXQzKCBiYXRjaGluZ01hdHJpeCApO1xyXG5cclxuXHRcdHBvc2l0aW9uTG9jYWwuYXNzaWduKCBiYXRjaGluZ01hdHJpeC5tdWwoIHBvc2l0aW9uTG9jYWwgKSApO1xyXG5cclxuXHRcdGNvbnN0IHRyYW5zZm9ybWVkTm9ybWFsID0gbm9ybWFsTG9jYWwuZGl2KCB2ZWMzKCBibVsgMCBdLmRvdCggYm1bIDAgXSApLCBibVsgMSBdLmRvdCggYm1bIDEgXSApLCBibVsgMiBdLmRvdCggYm1bIDIgXSApICkgKTtcclxuXHJcblx0XHRjb25zdCBiYXRjaGluZ05vcm1hbCA9IGJtLm11bCggdHJhbnNmb3JtZWROb3JtYWwgKS54eXo7XHJcblxyXG5cdFx0bm9ybWFsTG9jYWwuYXNzaWduKCBiYXRjaGluZ05vcm1hbCApO1xyXG5cclxuXHRcdGlmICggYnVpbGRlci5oYXNHZW9tZXRyeUF0dHJpYnV0ZSggJ3RhbmdlbnQnICkgKSB7XHJcblxyXG5cdFx0XHR0YW5nZW50TG9jYWwubXVsQXNzaWduKCBibSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQmF0Y2hOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSBiYXRjaCBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge0JhdGNoZWRNZXNofSBiYXRjaE1lc2ggLSBBIHJlZmVyZW5jZSB0byBiYXRjaGVkIG1lc2guXHJcbiAqIEByZXR1cm5zIHtCYXRjaE5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYmF0Y2ggPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggQmF0Y2hOb2RlICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAxICk7XHJcbiIsImltcG9ydCB7IG5vZGVQcm94eSB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuaW1wb3J0IEFycmF5RWxlbWVudE5vZGUgZnJvbSAnLi9BcnJheUVsZW1lbnROb2RlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGNsYXNzIGVuYWJsZXMgZWxlbWVudCBhY2Nlc3Mgb24gaW5zdGFuY2VzIG9mIHtAbGluayBTdG9yYWdlQnVmZmVyTm9kZX0uXHJcbiAqIEluIG1vc3QgY2FzZXMsIGl0IGlzIGluZGlyZWN0bHkgdXNlZCB3aGVuIGFjY2Vzc2luZyBlbGVtZW50cyB3aXRoIHRoZVxyXG4gKiB7QGxpbmsgU3RvcmFnZUJ1ZmZlck5vZGUjZWxlbWVudH0gbWV0aG9kLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBwb3NpdGlvbiA9IHBvc2l0aW9uU3RvcmFnZS5lbGVtZW50KCBpbnN0YW5jZUluZGV4ICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQXJyYXlFbGVtZW50Tm9kZVxyXG4gKi9cclxuY2xhc3MgU3RvcmFnZUFycmF5RWxlbWVudE5vZGUgZXh0ZW5kcyBBcnJheUVsZW1lbnROb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnU3RvcmFnZUFycmF5RWxlbWVudE5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgc3RvcmFnZSBidWZmZXIgZWxlbWVudCBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTdG9yYWdlQnVmZmVyTm9kZX0gc3RvcmFnZUJ1ZmZlck5vZGUgLSBUaGUgc3RvcmFnZSBidWZmZXIgbm9kZS5cclxuXHQgKiBAcGFyYW0ge05vZGV9IGluZGV4Tm9kZSAtIFRoZSBpbmRleCBub2RlIHRoYXQgZGVmaW5lcyB0aGUgZWxlbWVudCBhY2Nlc3MuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHN0b3JhZ2VCdWZmZXJOb2RlLCBpbmRleE5vZGUgKSB7XHJcblxyXG5cdFx0c3VwZXIoIHN0b3JhZ2VCdWZmZXJOb2RlLCBpbmRleE5vZGUgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNTdG9yYWdlQXJyYXlFbGVtZW50Tm9kZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIHN0b3JhZ2UgYnVmZmVyIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV9IHZhbHVlXHJcblx0ICogQHR5cGUge1N0b3JhZ2VCdWZmZXJOb2RlfVxyXG5cdCAqL1xyXG5cdHNldCBzdG9yYWdlQnVmZmVyTm9kZSggdmFsdWUgKSB7XHJcblxyXG5cdFx0dGhpcy5ub2RlID0gdmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0IHN0b3JhZ2VCdWZmZXJOb2RlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm5vZGU7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0TWVtYmVyVHlwZSggYnVpbGRlciwgbmFtZSApIHtcclxuXHJcblx0XHRjb25zdCBzdHJ1Y3RUeXBlTm9kZSA9IHRoaXMuc3RvcmFnZUJ1ZmZlck5vZGUuc3RydWN0VHlwZU5vZGU7XHJcblxyXG5cdFx0aWYgKCBzdHJ1Y3RUeXBlTm9kZSApIHtcclxuXHJcblx0XHRcdHJldHVybiBzdHJ1Y3RUeXBlTm9kZS5nZXRNZW1iZXJUeXBlKCBidWlsZGVyLCBuYW1lICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiAndm9pZCc7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXAoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0aWYgKCBidWlsZGVyLmlzQXZhaWxhYmxlKCAnc3RvcmFnZUJ1ZmZlcicgKSA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMubm9kZS5pc1BCTyA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0YnVpbGRlci5zZXR1cFBCTyggdGhpcy5ub2RlICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBzdXBlci5zZXR1cCggYnVpbGRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdGdlbmVyYXRlKCBidWlsZGVyLCBvdXRwdXQgKSB7XHJcblxyXG5cdFx0bGV0IHNuaXBwZXQ7XHJcblxyXG5cdFx0Y29uc3QgaXNBc3NpZ25Db250ZXh0ID0gYnVpbGRlci5jb250ZXh0LmFzc2lnbjtcclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGlmICggYnVpbGRlci5pc0F2YWlsYWJsZSggJ3N0b3JhZ2VCdWZmZXInICkgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLm5vZGUuaXNQQk8gPT09IHRydWUgJiYgaXNBc3NpZ25Db250ZXh0ICE9PSB0cnVlICYmICggdGhpcy5ub2RlLnZhbHVlLmlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlIHx8IGJ1aWxkZXIuc2hhZGVyU3RhZ2UgIT09ICdjb21wdXRlJyApICkge1xyXG5cclxuXHRcdFx0XHRzbmlwcGV0ID0gYnVpbGRlci5nZW5lcmF0ZVBCTyggdGhpcyApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0c25pcHBldCA9IHRoaXMubm9kZS5idWlsZCggYnVpbGRlciApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRzbmlwcGV0ID0gc3VwZXIuZ2VuZXJhdGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBpc0Fzc2lnbkNvbnRleHQgIT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB0eXBlID0gdGhpcy5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cclxuXHRcdFx0c25pcHBldCA9IGJ1aWxkZXIuZm9ybWF0KCBzbmlwcGV0LCB0eXBlLCBvdXRwdXQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHNuaXBwZXQ7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFN0b3JhZ2VBcnJheUVsZW1lbnROb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSBzdG9yYWdlIGVsZW1lbnQgbm9kZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtTdG9yYWdlQnVmZmVyTm9kZX0gc3RvcmFnZUJ1ZmZlck5vZGUgLSBUaGUgc3RvcmFnZSBidWZmZXIgbm9kZS5cclxuICogQHBhcmFtIHtOb2RlfSBpbmRleE5vZGUgLSBUaGUgaW5kZXggbm9kZSB0aGF0IGRlZmluZXMgdGhlIGVsZW1lbnQgYWNjZXNzLlxyXG4gKiBAcmV0dXJucyB7U3RvcmFnZUFycmF5RWxlbWVudE5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgc3RvcmFnZUVsZW1lbnQgPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggU3RvcmFnZUFycmF5RWxlbWVudE5vZGUgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDIgKTtcclxuIiwiaW1wb3J0IEJ1ZmZlck5vZGUgZnJvbSAnLi9CdWZmZXJOb2RlLmpzJztcclxuaW1wb3J0IHsgYnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi9CdWZmZXJBdHRyaWJ1dGVOb2RlLmpzJztcclxuaW1wb3J0IHsgbm9kZU9iamVjdCwgdmFyeWluZyB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuaW1wb3J0IHsgc3RvcmFnZUVsZW1lbnQgfSBmcm9tICcuLi91dGlscy9TdG9yYWdlQXJyYXlFbGVtZW50Tm9kZS5qcyc7XHJcbmltcG9ydCB7IE5vZGVBY2Nlc3MgfSBmcm9tICcuLi9jb3JlL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IGdldFR5cGVGcm9tTGVuZ3RoIH0gZnJvbSAnLi4vY29yZS9Ob2RlVXRpbHMuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgbm9kZSBpcyB1c2VkIGluIGNvbnRleHQgb2YgY29tcHV0ZSBzaGFkZXJzIGFuZCBhbGxvd3MgdG8gZGVmaW5lIGFcclxuICogc3RvcmFnZSBidWZmZXIgZm9yIGRhdGEuIEEgdHlwaWNhbCB3b3JrZmxvdyBpcyB0byBjcmVhdGUgaW5zdGFuY2VzIG9mXHJcbiAqIHRoaXMgbm9kZSB3aXRoIHRoZSBjb252ZW5pZW5jZSBmdW5jdGlvbnMgYGF0dHJpYnV0ZUFycmF5KClgIG9yIGBpbnN0YW5jZWRBcnJheSgpYCxcclxuICogc2V0dXAgdXAgYSBjb21wdXRlIHNoYWRlciB0aGF0IHdyaXRlcyBpbnRvIHRoZSBidWZmZXJzIGFuZCB0aGVuIGNvbnZlcnRcclxuICogdGhlIHN0b3JhZ2UgYnVmZmVycyB0byBhdHRyaWJ1dGUgbm9kZXMgZm9yIHJlbmRlcmluZy5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgcG9zaXRpb25CdWZmZXIgPSBpbnN0YW5jZWRBcnJheSggcGFydGljbGVDb3VudCwgJ3ZlYzMnICk7IC8vIHRoZSBzdG9yYWdlIGJ1ZmZlciBub2RlXHJcbiAqXHJcbiAqIGNvbnN0IGNvbXB1dGVJbml0ID0gRm4oICgpID0+IHsgLy8gdGhlIGNvbXB1dGUgc2hhZGVyXHJcbiAqXHJcbiAqIFx0Y29uc3QgcG9zaXRpb24gPSBwb3NpdGlvbkJ1ZmZlci5lbGVtZW50KCBpbnN0YW5jZUluZGV4ICk7XHJcbiAqXHJcbiAqIFx0Ly8gY29tcHV0ZSBwb3NpdGlvbiBkYXRhXHJcbiAqXHJcbiAqIFx0cG9zaXRpb24ueCA9IDE7XHJcbiAqIFx0cG9zaXRpb24ueSA9IDE7XHJcbiAqIFx0cG9zaXRpb24ueiA9IDE7XHJcbiAqXHJcbiAqIH0gKSgpLmNvbXB1dGUoIHBhcnRpY2xlQ291bnQgKTtcclxuICpcclxuICogY29uc3QgcGFydGljbGVNYXRlcmlhbCA9IG5ldyBUSFJFRS5TcHJpdGVOb2RlTWF0ZXJpYWwoKTtcclxuICogcGFydGljbGVNYXRlcmlhbC5wb3NpdGlvbk5vZGUgPSBwb3NpdGlvbkJ1ZmZlci50b0F0dHJpYnV0ZSgpO1xyXG4gKlxyXG4gKiByZW5kZXJlci5jb21wdXRlQXN5bmMoIGNvbXB1dGVJbml0ICk7XHJcbiAqXHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQnVmZmVyTm9kZVxyXG4gKi9cclxuY2xhc3MgU3RvcmFnZUJ1ZmZlck5vZGUgZXh0ZW5kcyBCdWZmZXJOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnU3RvcmFnZUJ1ZmZlck5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc3RvcmFnZSBidWZmZXIgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7U3RvcmFnZUJ1ZmZlckF0dHJpYnV0ZXxTdG9yYWdlSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlfEJ1ZmZlckF0dHJpYnV0ZX0gdmFsdWUgLSBUaGUgYnVmZmVyIGRhdGEuXHJcblx0ICogQHBhcmFtIHs/KHN0cmluZ3xTdHJ1Y3QpfSBbYnVmZmVyVHlwZT1udWxsXSAtIFRoZSBidWZmZXIgdHlwZSAoZS5nLiBgJ3ZlYzMnYCkuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtidWZmZXJDb3VudD0wXSAtIFRoZSBidWZmZXIgY291bnQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHZhbHVlLCBidWZmZXJUeXBlID0gbnVsbCwgYnVmZmVyQ291bnQgPSAwICkge1xyXG5cclxuXHRcdGxldCBub2RlVHlwZSwgc3RydWN0VHlwZU5vZGUgPSBudWxsO1xyXG5cclxuXHRcdGlmICggYnVmZmVyVHlwZSAmJiBidWZmZXJUeXBlLmlzU3RydWN0ICkge1xyXG5cclxuXHRcdFx0bm9kZVR5cGUgPSAnc3RydWN0JztcclxuXHRcdFx0c3RydWN0VHlwZU5vZGUgPSBidWZmZXJUeXBlLmxheW91dDtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBidWZmZXJUeXBlID09PSBudWxsICYmICggdmFsdWUuaXNTdG9yYWdlQnVmZmVyQXR0cmlidXRlIHx8IHZhbHVlLmlzU3RvcmFnZUluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSApICkge1xyXG5cclxuXHRcdFx0bm9kZVR5cGUgPSBnZXRUeXBlRnJvbUxlbmd0aCggdmFsdWUuaXRlbVNpemUgKTtcclxuXHRcdFx0YnVmZmVyQ291bnQgPSB2YWx1ZS5jb3VudDtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0bm9kZVR5cGUgPSBidWZmZXJUeXBlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRzdXBlciggdmFsdWUsIG5vZGVUeXBlLCBidWZmZXJDb3VudCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1N0b3JhZ2VCdWZmZXJOb2RlID0gdHJ1ZTtcclxuXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYnVmZmVyIHN0cnVjdCB0eXBlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/U3RydWN0VHlwZU5vZGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc3RydWN0VHlwZU5vZGUgPSBzdHJ1Y3RUeXBlTm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBhY2Nlc3MgdHlwZSBvZiB0aGUgdGV4dHVyZSBub2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKiBAZGVmYXVsdCAncmVhZFdyaXRlJ1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFjY2VzcyA9IE5vZGVBY2Nlc3MuUkVBRF9XUklURTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIG5vZGUgaXMgYXRvbWljIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNBdG9taWMgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIG5vZGUgcmVwcmVzZW50cyBhIFBCTyBvciBub3QuXHJcblx0XHQgKiBPbmx5IHJlbGV2YW50IGZvciBXZWJHTC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNQQk8gPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIHRoZSBpbnRlcm5hbCBidWZmZXIgYXR0cmlidXRlIG5vZGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9CdWZmZXJBdHRyaWJ1dGVOb2RlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9hdHRyaWJ1dGUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIGludGVybmFsIHZhcnlpbmcgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1ZhcnlpbmdOb2RlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl92YXJ5aW5nID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIGBTdG9yYWdlQnVmZmVyTm9kZWAgc2V0cyB0aGlzIHByb3BlcnR5IHRvIGB0cnVlYCBieSBkZWZhdWx0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdsb2JhbCA9IHRydWU7XHJcblxyXG5cdFx0aWYgKCB2YWx1ZS5pc1N0b3JhZ2VCdWZmZXJBdHRyaWJ1dGUgIT09IHRydWUgJiYgdmFsdWUuaXNTdG9yYWdlSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlICE9PSB0cnVlICkge1xyXG5cclxuXHRcdFx0Ly8gVE9ETzogSW1wcm92ZSBpdCwgcG9zc2libHkgYWRkaW5nIGEgbmV3IHByb3BlcnR5IHRvIHRoZSBCdWZmZXJBdHRyaWJ1dGUgdG8gaWRlbnRpZnkgaXQgYXMgYSBzdG9yYWdlIGJ1ZmZlciByZWFkLW9ubHkgYXR0cmlidXRlIGluIFJlbmRlcmVyXHJcblxyXG5cdFx0XHRpZiAoIHZhbHVlLmlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlICkgdmFsdWUuaXNTdG9yYWdlSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlID0gdHJ1ZTtcclxuXHRcdFx0ZWxzZSB2YWx1ZS5pc1N0b3JhZ2VCdWZmZXJBdHRyaWJ1dGUgPSB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyBvdmVyd3JpdHRlbiBzaW5jZSB0aGUgYnVmZmVyIGRhdGEgbWlnaHQgYmUgc2hhcmVkXHJcblx0ICogYW5kIHRodXMgdGhlIGhhc2ggc2hvdWxkIGJlIHNoYXJlZCBhcyB3ZWxsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBoYXNoLlxyXG5cdCAqL1xyXG5cdGdldEhhc2goIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmJ1ZmZlckNvdW50ID09PSAwICkge1xyXG5cclxuXHRcdFx0bGV0IGJ1ZmZlckRhdGEgPSBidWlsZGVyLmdsb2JhbENhY2hlLmdldERhdGEoIHRoaXMudmFsdWUgKTtcclxuXHJcblx0XHRcdGlmICggYnVmZmVyRGF0YSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRidWZmZXJEYXRhID0ge1xyXG5cdFx0XHRcdFx0bm9kZTogdGhpc1xyXG5cdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdGJ1aWxkZXIuZ2xvYmFsQ2FjaGUuc2V0RGF0YSggdGhpcy52YWx1ZSwgYnVmZmVyRGF0YSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIGJ1ZmZlckRhdGEubm9kZS51dWlkO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcy51dWlkO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE92ZXJ3cml0ZXMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gcmV0dXJuIGEgZml4ZWQgdmFsdWUgYCdpbmRpcmVjdFN0b3JhZ2VCdWZmZXInYCBvciBgJ3N0b3JhZ2VCdWZmZXInYC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgaW5wdXQgdHlwZS5cclxuXHQgKi9cclxuXHRnZXRJbnB1dFR5cGUoIC8qYnVpbGRlciovICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnZhbHVlLmlzSW5kaXJlY3RTdG9yYWdlQnVmZmVyQXR0cmlidXRlID8gJ2luZGlyZWN0U3RvcmFnZUJ1ZmZlcicgOiAnc3RvcmFnZUJ1ZmZlcic7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRW5hYmxlcyBlbGVtZW50IGFjY2VzcyB3aXRoIHRoZSBnaXZlbiBpbmRleCBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtJbmRleE5vZGV9IGluZGV4Tm9kZSAtIFRoZSBpbmRleCBub2RlLlxyXG5cdCAqIEByZXR1cm4ge1N0b3JhZ2VBcnJheUVsZW1lbnROb2RlfSBBIG5vZGUgcmVwcmVzZW50aW5nIHRoZSBlbGVtZW50IGFjY2Vzcy5cclxuXHQgKi9cclxuXHRlbGVtZW50KCBpbmRleE5vZGUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHN0b3JhZ2VFbGVtZW50KCB0aGlzLCBpbmRleE5vZGUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWZpbmVzIHdoZXRoZXIgdGhpcyBub2RlIGlzIGEgUEJPIG9yIG5vdC4gT25seSByZWxldmFudCBmb3IgV2ViR0wuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbHVlIC0gVGhlIHZhbHVlIHNvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtTdG9yYWdlQnVmZmVyTm9kZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBub2RlLlxyXG5cdCAqL1xyXG5cdHNldFBCTyggdmFsdWUgKSB7XHJcblxyXG5cdFx0dGhpcy5pc1BCTyA9IHZhbHVlO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGBpc1BCT2AgdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBub2RlIHJlcHJlc2VudHMgYSBQQk8gb3Igbm90LlxyXG5cdCAqL1xyXG5cdGdldFBCTygpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5pc1BCTztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWZpbmVzIHRoZSBub2RlIGFjY2Vzcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFRoZSBub2RlIGFjY2Vzcy5cclxuXHQgKiBAcmV0dXJuIHtTdG9yYWdlQnVmZmVyTm9kZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBub2RlLlxyXG5cdCAqL1xyXG5cdHNldEFjY2VzcyggdmFsdWUgKSB7XHJcblxyXG5cdFx0dGhpcy5hY2Nlc3MgPSB2YWx1ZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGNvbmZpZ3VyaW5nIGEgcmVhZC1vbmx5IG5vZGUgYWNjZXNzLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7U3RvcmFnZUJ1ZmZlck5vZGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbm9kZS5cclxuXHQgKi9cclxuXHR0b1JlYWRPbmx5KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnNldEFjY2VzcyggTm9kZUFjY2Vzcy5SRUFEX09OTFkgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWZpbmVzIHdoZXRoZXIgdGhlIG5vZGUgaXMgYXRvbWljIG9yIG5vdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsdWUgLSBUaGUgYXRvbWljIGZsYWcuXHJcblx0ICogQHJldHVybiB7U3RvcmFnZUJ1ZmZlck5vZGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbm9kZS5cclxuXHQgKi9cclxuXHRzZXRBdG9taWMoIHZhbHVlICkge1xyXG5cclxuXHRcdHRoaXMuaXNBdG9taWMgPSB2YWx1ZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIG1ha2luZyB0aGlzIG5vZGUgYXRvbWljLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7U3RvcmFnZUJ1ZmZlck5vZGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbm9kZS5cclxuXHQgKi9cclxuXHR0b0F0b21pYygpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5zZXRBdG9taWMoIHRydWUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGF0dHJpYnV0ZSBkYXRhIGZvciB0aGlzIHN0b3JhZ2UgYnVmZmVyIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHt7YXR0cmlidXRlOiBCdWZmZXJBdHRyaWJ1dGVOb2RlLCB2YXJ5aW5nOiBWYXJ5aW5nTm9kZX19IFRoZSBhdHRyaWJ1dGUgZGF0YS5cclxuXHQgKi9cclxuXHRnZXRBdHRyaWJ1dGVEYXRhKCkge1xyXG5cclxuXHRcdGlmICggdGhpcy5fYXR0cmlidXRlID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5fYXR0cmlidXRlID0gYnVmZmVyQXR0cmlidXRlKCB0aGlzLnZhbHVlICk7XHJcblx0XHRcdHRoaXMuX3ZhcnlpbmcgPSB2YXJ5aW5nKCB0aGlzLl9hdHRyaWJ1dGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHtcclxuXHRcdFx0YXR0cmlidXRlOiB0aGlzLl9hdHRyaWJ1dGUsXHJcblx0XHRcdHZhcnlpbmc6IHRoaXMuX3ZhcnlpbmdcclxuXHRcdH07XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgaXMgb3ZlcndyaXR0ZW4gc2luY2UgdGhlIG5vZGUgdHlwZSBmcm9tIHRoZSBhdmFpbGFiaWxpdHkgb2Ygc3RvcmFnZSBidWZmZXJzXHJcblx0ICogYW5kIHRoZSBhdHRyaWJ1dGUgZGF0YS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgbm9kZSB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldE5vZGVUeXBlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5zdHJ1Y3RUeXBlTm9kZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHJldHVybiB0aGlzLnN0cnVjdFR5cGVOb2RlLmdldE5vZGVUeXBlKCBidWlsZGVyICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggYnVpbGRlci5pc0F2YWlsYWJsZSggJ3N0b3JhZ2VCdWZmZXInICkgfHwgYnVpbGRlci5pc0F2YWlsYWJsZSggJ2luZGlyZWN0U3RvcmFnZUJ1ZmZlcicgKSApIHtcclxuXHJcblx0XHRcdHJldHVybiBzdXBlci5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCB7IGF0dHJpYnV0ZSB9ID0gdGhpcy5nZXRBdHRyaWJ1dGVEYXRhKCk7XHJcblxyXG5cdFx0cmV0dXJuIGF0dHJpYnV0ZS5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyB0aGUgY29kZSBzbmlwcGV0IG9mIHRoZSBzdG9yYWdlIGJ1ZmZlciBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBnZW5lcmF0ZWQgY29kZSBzbmlwcGV0LlxyXG5cdCAqL1xyXG5cdGdlbmVyYXRlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5zdHJ1Y3RUeXBlTm9kZSAhPT0gbnVsbCApIHRoaXMuc3RydWN0VHlwZU5vZGUuYnVpbGQoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRpZiAoIGJ1aWxkZXIuaXNBdmFpbGFibGUoICdzdG9yYWdlQnVmZmVyJyApIHx8IGJ1aWxkZXIuaXNBdmFpbGFibGUoICdpbmRpcmVjdFN0b3JhZ2VCdWZmZXInICkgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gc3VwZXIuZ2VuZXJhdGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgeyBhdHRyaWJ1dGUsIHZhcnlpbmcgfSA9IHRoaXMuZ2V0QXR0cmlidXRlRGF0YSgpO1xyXG5cclxuXHRcdGNvbnN0IG91dHB1dCA9IHZhcnlpbmcuYnVpbGQoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRidWlsZGVyLnJlZ2lzdGVyVHJhbnNmb3JtKCBvdXRwdXQsIGF0dHJpYnV0ZSApO1xyXG5cclxuXHRcdHJldHVybiBvdXRwdXQ7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFN0b3JhZ2VCdWZmZXJOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSBzdG9yYWdlIGJ1ZmZlciBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge1N0b3JhZ2VCdWZmZXJBdHRyaWJ1dGV8U3RvcmFnZUluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZXxCdWZmZXJBdHRyaWJ1dGV9IHZhbHVlIC0gVGhlIGJ1ZmZlciBkYXRhLlxyXG4gKiBAcGFyYW0gez8oc3RyaW5nfFN0cnVjdCl9IFt0eXBlPW51bGxdIC0gVGhlIGJ1ZmZlciB0eXBlIChlLmcuIGAndmVjMydgKS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtjb3VudD0wXSAtIFRoZSBidWZmZXIgY291bnQuXHJcbiAqIEByZXR1cm5zIHtTdG9yYWdlQnVmZmVyTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBzdG9yYWdlID0gKCB2YWx1ZSwgdHlwZSA9IG51bGwsIGNvdW50ID0gMCApID0+IG5vZGVPYmplY3QoIG5ldyBTdG9yYWdlQnVmZmVyTm9kZSggdmFsdWUsIHR5cGUsIGNvdW50ICkgKTtcclxuXHJcbi8qKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAZGVwcmVjYXRlZCBzaW5jZSByMTcxLiBVc2UgYHN0b3JhZ2UoKS5zZXRQQk8oIHRydWUgKWAgaW5zdGVhZC5cclxuICpcclxuICogQHBhcmFtIHtTdG9yYWdlQnVmZmVyQXR0cmlidXRlfFN0b3JhZ2VJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGV8QnVmZmVyQXR0cmlidXRlfSB2YWx1ZSAtIFRoZSBidWZmZXIgZGF0YS5cclxuICogQHBhcmFtIHs/c3RyaW5nfSB0eXBlIC0gVGhlIGJ1ZmZlciB0eXBlIChlLmcuIGAndmVjMydgKS5cclxuICogQHBhcmFtIHtudW1iZXJ9IGNvdW50IC0gVGhlIGJ1ZmZlciBjb3VudC5cclxuICogQHJldHVybnMge1N0b3JhZ2VCdWZmZXJOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHN0b3JhZ2VPYmplY3QgPSAoIHZhbHVlLCB0eXBlLCBjb3VudCApID0+IHsgLy8gQGRlcHJlY2F0ZWQsIHIxNzFcclxuXHJcblx0Y29uc29sZS53YXJuKCAnVEhSRUUuVFNMOiBcInN0b3JhZ2VPYmplY3QoKVwiIGlzIGRlcHJlY2F0ZWQuIFVzZSBcInN0b3JhZ2UoKS5zZXRQQk8oIHRydWUgKVwiIGluc3RlYWQuJyApO1xyXG5cclxuXHRyZXR1cm4gc3RvcmFnZSggdmFsdWUsIHR5cGUsIGNvdW50ICkuc2V0UEJPKCB0cnVlICk7XHJcblxyXG59O1xyXG4iLCJpbXBvcnQgTm9kZSBmcm9tICcuLi9jb3JlL05vZGUuanMnO1xyXG5pbXBvcnQgeyBOb2RlVXBkYXRlVHlwZSB9IGZyb20gJy4uL2NvcmUvY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgbm9kZU9iamVjdCB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuaW1wb3J0IHsgYXR0cmlidXRlIH0gZnJvbSAnLi4vY29yZS9BdHRyaWJ1dGVOb2RlLmpzJztcclxuaW1wb3J0IHsgcmVmZXJlbmNlLCByZWZlcmVuY2VCdWZmZXIgfSBmcm9tICcuL1JlZmVyZW5jZU5vZGUuanMnO1xyXG5pbXBvcnQgeyBhZGQgfSBmcm9tICcuLi9tYXRoL09wZXJhdG9yTm9kZS5qcyc7XHJcbmltcG9ydCB7IG5vcm1hbExvY2FsIH0gZnJvbSAnLi9Ob3JtYWwuanMnO1xyXG5pbXBvcnQgeyBwb3NpdGlvbkxvY2FsLCBwb3NpdGlvblByZXZpb3VzIH0gZnJvbSAnLi9Qb3NpdGlvbi5qcyc7XHJcbmltcG9ydCB7IHRhbmdlbnRMb2NhbCB9IGZyb20gJy4vVGFuZ2VudC5qcyc7XHJcbmltcG9ydCB7IHVuaWZvcm0gfSBmcm9tICcuLi9jb3JlL1VuaWZvcm1Ob2RlLmpzJztcclxuaW1wb3J0IHsgYnVmZmVyIH0gZnJvbSAnLi9CdWZmZXJOb2RlLmpzJztcclxuaW1wb3J0IHsgZ2V0RGF0YUZyb21PYmplY3QgfSBmcm9tICcuLi9jb3JlL05vZGVVdGlscy5qcyc7XHJcbmltcG9ydCB7IHN0b3JhZ2UgfSBmcm9tICcuL1N0b3JhZ2VCdWZmZXJOb2RlLmpzJztcclxuaW1wb3J0IHsgSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vLi4vY29yZS9JbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5pbXBvcnQgeyBpbnN0YW5jZUluZGV4IH0gZnJvbSAnLi4vY29yZS9JbmRleE5vZGUuanMnO1xyXG5cclxuY29uc3QgX2ZyYW1lSWQgPSBuZXcgV2Vha01hcCgpO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgbm9kZSBpbXBsZW1lbnRzIHRoZSB2ZXJ0ZXggdHJhbnNmb3JtYXRpb24gc2hhZGVyIGxvZ2ljIHdoaWNoIGlzIHJlcXVpcmVkXHJcbiAqIGZvciBza2lubmluZy9za2VsZXRhbCBhbmltYXRpb24uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBOb2RlXHJcbiAqL1xyXG5jbGFzcyBTa2lubmluZ05vZGUgZXh0ZW5kcyBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnU2tpbm5pbmdOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHNraW5uaW5nIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1NraW5uZWRNZXNofSBza2lubmVkTWVzaCAtIFRoZSBza2lubmVkIG1lc2guXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHNraW5uZWRNZXNoICkge1xyXG5cclxuXHRcdHN1cGVyKCAndm9pZCcgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBza2lubmVkIG1lc2guXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1NraW5uZWRNZXNofVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNraW5uZWRNZXNoID0gc2tpbm5lZE1lc2g7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdXBkYXRlIHR5cGUgb3ZlcndyaXR0ZW4gc2luY2Ugc2tpbm5pbmcgbm9kZXMgYXJlIHVwZGF0ZWQgcGVyIG9iamVjdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVwZGF0ZVR5cGUgPSBOb2RlVXBkYXRlVHlwZS5PQkpFQ1Q7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBza2luIGluZGV4IGF0dHJpYnV0ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXR0cmlidXRlTm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5za2luSW5kZXhOb2RlID0gYXR0cmlidXRlKCAnc2tpbkluZGV4JywgJ3V2ZWM0JyApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHNraW4gd2VpZ2h0IGF0dHJpYnV0ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXR0cmlidXRlTm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5za2luV2VpZ2h0Tm9kZSA9IGF0dHJpYnV0ZSggJ3NraW5XZWlnaHQnLCAndmVjNCcgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBiaW5kIG1hdHJpeCBub2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlPG1hdDQ+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJpbmRNYXRyaXhOb2RlID0gcmVmZXJlbmNlKCAnYmluZE1hdHJpeCcsICdtYXQ0JyApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGJpbmQgbWF0cml4IGludmVyc2Ugbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZTxtYXQ0Pn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5iaW5kTWF0cml4SW52ZXJzZU5vZGUgPSByZWZlcmVuY2UoICdiaW5kTWF0cml4SW52ZXJzZScsICdtYXQ0JyApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGJpbmQgbWF0cmljZXMgYXMgYSB1bmlmb3JtIGJ1ZmZlciBub2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJvbmVNYXRyaWNlc05vZGUgPSByZWZlcmVuY2VCdWZmZXIoICdza2VsZXRvbi5ib25lTWF0cmljZXMnLCAnbWF0NCcsIHNraW5uZWRNZXNoLnNrZWxldG9uLmJvbmVzLmxlbmd0aCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGN1cnJlbnQgdmVydGV4IHBvc2l0aW9uIGluIGxvY2FsIHNwYWNlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlPHZlYzM+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBvc2l0aW9uTm9kZSA9IHBvc2l0aW9uTG9jYWw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcmVzdWx0IG9mIHZlcnRleCBwb3NpdGlvbiBpbiBsb2NhbCBzcGFjZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZTx2ZWMzPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50b1Bvc2l0aW9uTm9kZSA9IHBvc2l0aW9uTG9jYWw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcHJldmlvdXMgYmluZCBtYXRyaWNlcyBhcyBhIHVuaWZvcm0gYnVmZmVyIG5vZGUuXHJcblx0XHQgKiBSZXF1aXJlZCBmb3IgY29tcHV0aW5nIG1vdGlvbiB2ZWN0b3JzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Tm9kZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wcmV2aW91c0JvbmVNYXRyaWNlc05vZGUgPSBudWxsO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRyYW5zZm9ybXMgdGhlIGdpdmVuIHZlcnRleCBwb3NpdGlvbiB2aWEgc2tpbm5pbmcuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV9IFtib25lTWF0cmljZXM9dGhpcy5ib25lTWF0cmljZXNOb2RlXSAtIFRoZSBib25lIG1hdHJpY2VzXHJcblx0ICogQHBhcmFtIHtOb2RlPHZlYzM+fSBbcG9zaXRpb249dGhpcy5wb3NpdGlvbk5vZGVdIC0gVGhlIHZlcnRleCBwb3NpdGlvbiBpbiBsb2NhbCBzcGFjZS5cclxuXHQgKiBAcmV0dXJuIHtOb2RlPHZlYzM+fSBUaGUgdHJhbnNmb3JtZWQgdmVydGV4IHBvc2l0aW9uLlxyXG5cdCAqL1xyXG5cdGdldFNraW5uZWRQb3NpdGlvbiggYm9uZU1hdHJpY2VzID0gdGhpcy5ib25lTWF0cmljZXNOb2RlLCBwb3NpdGlvbiA9IHRoaXMucG9zaXRpb25Ob2RlICkge1xyXG5cclxuXHRcdGNvbnN0IHsgc2tpbkluZGV4Tm9kZSwgc2tpbldlaWdodE5vZGUsIGJpbmRNYXRyaXhOb2RlLCBiaW5kTWF0cml4SW52ZXJzZU5vZGUgfSA9IHRoaXM7XHJcblxyXG5cdFx0Y29uc3QgYm9uZU1hdFggPSBib25lTWF0cmljZXMuZWxlbWVudCggc2tpbkluZGV4Tm9kZS54ICk7XHJcblx0XHRjb25zdCBib25lTWF0WSA9IGJvbmVNYXRyaWNlcy5lbGVtZW50KCBza2luSW5kZXhOb2RlLnkgKTtcclxuXHRcdGNvbnN0IGJvbmVNYXRaID0gYm9uZU1hdHJpY2VzLmVsZW1lbnQoIHNraW5JbmRleE5vZGUueiApO1xyXG5cdFx0Y29uc3QgYm9uZU1hdFcgPSBib25lTWF0cmljZXMuZWxlbWVudCggc2tpbkluZGV4Tm9kZS53ICk7XHJcblxyXG5cdFx0Ly8gUE9TSVRJT05cclxuXHJcblx0XHRjb25zdCBza2luVmVydGV4ID0gYmluZE1hdHJpeE5vZGUubXVsKCBwb3NpdGlvbiApO1xyXG5cclxuXHRcdGNvbnN0IHNraW5uZWQgPSBhZGQoXHJcblx0XHRcdGJvbmVNYXRYLm11bCggc2tpbldlaWdodE5vZGUueCApLm11bCggc2tpblZlcnRleCApLFxyXG5cdFx0XHRib25lTWF0WS5tdWwoIHNraW5XZWlnaHROb2RlLnkgKS5tdWwoIHNraW5WZXJ0ZXggKSxcclxuXHRcdFx0Ym9uZU1hdFoubXVsKCBza2luV2VpZ2h0Tm9kZS56ICkubXVsKCBza2luVmVydGV4ICksXHJcblx0XHRcdGJvbmVNYXRXLm11bCggc2tpbldlaWdodE5vZGUudyApLm11bCggc2tpblZlcnRleCApXHJcblx0XHQpO1xyXG5cclxuXHRcdHJldHVybiBiaW5kTWF0cml4SW52ZXJzZU5vZGUubXVsKCBza2lubmVkICkueHl6O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRyYW5zZm9ybXMgdGhlIGdpdmVuIHZlcnRleCBub3JtYWwgdmlhIHNraW5uaW5nLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlfSBbYm9uZU1hdHJpY2VzPXRoaXMuYm9uZU1hdHJpY2VzTm9kZV0gLSBUaGUgYm9uZSBtYXRyaWNlc1xyXG5cdCAqIEBwYXJhbSB7Tm9kZTx2ZWMzPn0gW25vcm1hbD1ub3JtYWxMb2NhbF0gLSBUaGUgdmVydGV4IG5vcm1hbCBpbiBsb2NhbCBzcGFjZS5cclxuXHQgKiBAcmV0dXJuIHtOb2RlPHZlYzM+fSBUaGUgdHJhbnNmb3JtZWQgdmVydGV4IG5vcm1hbC5cclxuXHQgKi9cclxuXHRnZXRTa2lubmVkTm9ybWFsKCBib25lTWF0cmljZXMgPSB0aGlzLmJvbmVNYXRyaWNlc05vZGUsIG5vcm1hbCA9IG5vcm1hbExvY2FsICkge1xyXG5cclxuXHRcdGNvbnN0IHsgc2tpbkluZGV4Tm9kZSwgc2tpbldlaWdodE5vZGUsIGJpbmRNYXRyaXhOb2RlLCBiaW5kTWF0cml4SW52ZXJzZU5vZGUgfSA9IHRoaXM7XHJcblxyXG5cdFx0Y29uc3QgYm9uZU1hdFggPSBib25lTWF0cmljZXMuZWxlbWVudCggc2tpbkluZGV4Tm9kZS54ICk7XHJcblx0XHRjb25zdCBib25lTWF0WSA9IGJvbmVNYXRyaWNlcy5lbGVtZW50KCBza2luSW5kZXhOb2RlLnkgKTtcclxuXHRcdGNvbnN0IGJvbmVNYXRaID0gYm9uZU1hdHJpY2VzLmVsZW1lbnQoIHNraW5JbmRleE5vZGUueiApO1xyXG5cdFx0Y29uc3QgYm9uZU1hdFcgPSBib25lTWF0cmljZXMuZWxlbWVudCggc2tpbkluZGV4Tm9kZS53ICk7XHJcblxyXG5cdFx0Ly8gTk9STUFMXHJcblxyXG5cdFx0bGV0IHNraW5NYXRyaXggPSBhZGQoXHJcblx0XHRcdHNraW5XZWlnaHROb2RlLngubXVsKCBib25lTWF0WCApLFxyXG5cdFx0XHRza2luV2VpZ2h0Tm9kZS55Lm11bCggYm9uZU1hdFkgKSxcclxuXHRcdFx0c2tpbldlaWdodE5vZGUuei5tdWwoIGJvbmVNYXRaICksXHJcblx0XHRcdHNraW5XZWlnaHROb2RlLncubXVsKCBib25lTWF0VyApXHJcblx0XHQpO1xyXG5cclxuXHRcdHNraW5NYXRyaXggPSBiaW5kTWF0cml4SW52ZXJzZU5vZGUubXVsKCBza2luTWF0cml4ICkubXVsKCBiaW5kTWF0cml4Tm9kZSApO1xyXG5cclxuXHRcdHJldHVybiBza2luTWF0cml4LnRyYW5zZm9ybURpcmVjdGlvbiggbm9ybWFsICkueHl6O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRyYW5zZm9ybXMgdGhlIGdpdmVuIHZlcnRleCBub3JtYWwgdmlhIHNraW5uaW5nLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtOb2RlPHZlYzM+fSBUaGUgc2tpbm5lZCBwb3NpdGlvbiBmcm9tIHRoZSBwcmV2aW91cyBmcmFtZS5cclxuXHQgKi9cclxuXHRnZXRQcmV2aW91c1NraW5uZWRQb3NpdGlvbiggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCBza2lubmVkTWVzaCA9IGJ1aWxkZXIub2JqZWN0O1xyXG5cclxuXHRcdGlmICggdGhpcy5wcmV2aW91c0JvbmVNYXRyaWNlc05vZGUgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRza2lubmVkTWVzaC5za2VsZXRvbi5wcmV2aW91c0JvbmVNYXRyaWNlcyA9IG5ldyBGbG9hdDMyQXJyYXkoIHNraW5uZWRNZXNoLnNrZWxldG9uLmJvbmVNYXRyaWNlcyApO1xyXG5cclxuXHRcdFx0dGhpcy5wcmV2aW91c0JvbmVNYXRyaWNlc05vZGUgPSByZWZlcmVuY2VCdWZmZXIoICdza2VsZXRvbi5wcmV2aW91c0JvbmVNYXRyaWNlcycsICdtYXQ0Jywgc2tpbm5lZE1lc2guc2tlbGV0b24uYm9uZXMubGVuZ3RoICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzLmdldFNraW5uZWRQb3NpdGlvbiggdGhpcy5wcmV2aW91c0JvbmVNYXRyaWNlc05vZGUsIHBvc2l0aW9uUHJldmlvdXMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiBib25lIG1hdHJpY2VzIGZyb20gdGhlIHByZXZpb3VzIGZyYW1lIGFyZSByZXF1aXJlZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciBib25lIG1hdHJpY2VzIGZyb20gdGhlIHByZXZpb3VzIGZyYW1lIGFyZSByZXF1aXJlZCBvciBub3QuXHJcblx0ICovXHJcblx0bmVlZHNQcmV2aW91c0JvbmVNYXRyaWNlcyggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCBtcnQgPSBidWlsZGVyLnJlbmRlcmVyLmdldE1SVCgpO1xyXG5cclxuXHRcdHJldHVybiAoIG1ydCAmJiBtcnQuaGFzKCAndmVsb2NpdHknICkgKSB8fCBnZXREYXRhRnJvbU9iamVjdCggYnVpbGRlci5vYmplY3QgKS51c2VWZWxvY2l0eSA9PT0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXR1cHMgdGhlIHNraW5uaW5nIG5vZGUgYnkgYXNzaWduaW5nIHRoZSB0cmFuc2Zvcm1lZCB2ZXJ0ZXggZGF0YSB0byBwcmVkZWZpbmVkIG5vZGUgdmFyaWFibGVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtOb2RlPHZlYzM+fSBUaGUgdHJhbnNmb3JtZWQgdmVydGV4IHBvc2l0aW9uLlxyXG5cdCAqL1xyXG5cdHNldHVwKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5uZWVkc1ByZXZpb3VzQm9uZU1hdHJpY2VzKCBidWlsZGVyICkgKSB7XHJcblxyXG5cdFx0XHRwb3NpdGlvblByZXZpb3VzLmFzc2lnbiggdGhpcy5nZXRQcmV2aW91c1NraW5uZWRQb3NpdGlvbiggYnVpbGRlciApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHNraW5Qb3NpdGlvbiA9IHRoaXMuZ2V0U2tpbm5lZFBvc2l0aW9uKCk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLnRvUG9zaXRpb25Ob2RlICkgdGhpcy50b1Bvc2l0aW9uTm9kZS5hc3NpZ24oIHNraW5Qb3NpdGlvbiApO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0aWYgKCBidWlsZGVyLmhhc0dlb21ldHJ5QXR0cmlidXRlKCAnbm9ybWFsJyApICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgc2tpbk5vcm1hbCA9IHRoaXMuZ2V0U2tpbm5lZE5vcm1hbCgpO1xyXG5cclxuXHRcdFx0bm9ybWFsTG9jYWwuYXNzaWduKCBza2luTm9ybWFsICk7XHJcblxyXG5cdFx0XHRpZiAoIGJ1aWxkZXIuaGFzR2VvbWV0cnlBdHRyaWJ1dGUoICd0YW5nZW50JyApICkge1xyXG5cclxuXHRcdFx0XHR0YW5nZW50TG9jYWwuYXNzaWduKCBza2luTm9ybWFsICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBza2luUG9zaXRpb247XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2VuZXJhdGVzIHRoZSBjb2RlIHNuaXBwZXQgb2YgdGhlIHNraW5uaW5nIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBvdXRwdXQgLSBUaGUgY3VycmVudCBvdXRwdXQuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgZ2VuZXJhdGVkIGNvZGUgc25pcHBldC5cclxuXHQgKi9cclxuXHRnZW5lcmF0ZSggYnVpbGRlciwgb3V0cHV0ICkge1xyXG5cclxuXHRcdGlmICggb3V0cHV0ICE9PSAndm9pZCcgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gc3VwZXIuZ2VuZXJhdGUoIGJ1aWxkZXIsIG91dHB1dCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoZSBzdGF0ZSBvZiB0aGUgc2tpbm5lZCBtZXNoIGJ5IHVwZGF0aW5nIHRoZSBza2VsZXRvbiBvbmNlIHBlciBmcmFtZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUZyYW1lfSBmcmFtZSAtIFRoZSBjdXJyZW50IG5vZGUgZnJhbWUuXHJcblx0ICovXHJcblx0dXBkYXRlKCBmcmFtZSApIHtcclxuXHJcblx0XHRjb25zdCBza2VsZXRvbiA9IGZyYW1lLm9iamVjdCAmJiBmcmFtZS5vYmplY3Quc2tlbGV0b24gPyBmcmFtZS5vYmplY3Quc2tlbGV0b24gOiB0aGlzLnNraW5uZWRNZXNoLnNrZWxldG9uO1xyXG5cclxuXHRcdGlmICggX2ZyYW1lSWQuZ2V0KCBza2VsZXRvbiApID09PSBmcmFtZS5mcmFtZUlkICkgcmV0dXJuO1xyXG5cclxuXHRcdF9mcmFtZUlkLnNldCggc2tlbGV0b24sIGZyYW1lLmZyYW1lSWQgKTtcclxuXHJcblx0XHRpZiAoIHRoaXMucHJldmlvdXNCb25lTWF0cmljZXNOb2RlICE9PSBudWxsICkgc2tlbGV0b24ucHJldmlvdXNCb25lTWF0cmljZXMuc2V0KCBza2VsZXRvbi5ib25lTWF0cmljZXMgKTtcclxuXHJcblx0XHRza2VsZXRvbi51cGRhdGUoKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgU2tpbm5pbmdOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSBza2lubmluZyBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge1NraW5uZWRNZXNofSBza2lubmVkTWVzaCAtIFRoZSBza2lubmVkIG1lc2guXHJcbiAqIEByZXR1cm5zIHtTa2lubmluZ05vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgc2tpbm5pbmcgPSAoIHNraW5uZWRNZXNoICkgPT4gbm9kZU9iamVjdCggbmV3IFNraW5uaW5nTm9kZSggc2tpbm5lZE1lc2ggKSApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY29tcHV0aW5nIHNraW5uaW5nLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge1NraW5uZWRNZXNofSBza2lubmVkTWVzaCAtIFRoZSBza2lubmVkIG1lc2guXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMzPn0gW3RvUG9zaXRpb249bnVsbF0gLSBUaGUgdGFyZ2V0IHBvc2l0aW9uLlxyXG4gKiBAcmV0dXJucyB7U2tpbm5pbmdOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGNvbXB1dGVTa2lubmluZyA9ICggc2tpbm5lZE1lc2gsIHRvUG9zaXRpb24gPSBudWxsICkgPT4ge1xyXG5cclxuXHRjb25zdCBub2RlID0gbmV3IFNraW5uaW5nTm9kZSggc2tpbm5lZE1lc2ggKTtcclxuXHRub2RlLnBvc2l0aW9uTm9kZSA9IHN0b3JhZ2UoIG5ldyBJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUoIHNraW5uZWRNZXNoLmdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJyApLmFycmF5LCAzICksICd2ZWMzJyApLnNldFBCTyggdHJ1ZSApLnRvUmVhZE9ubHkoKS5lbGVtZW50KCBpbnN0YW5jZUluZGV4ICkudG9WYXIoKTtcclxuXHRub2RlLnNraW5JbmRleE5vZGUgPSBzdG9yYWdlKCBuZXcgSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlKCBuZXcgVWludDMyQXJyYXkoIHNraW5uZWRNZXNoLmdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ3NraW5JbmRleCcgKS5hcnJheSApLCA0ICksICd1dmVjNCcgKS5zZXRQQk8oIHRydWUgKS50b1JlYWRPbmx5KCkuZWxlbWVudCggaW5zdGFuY2VJbmRleCApLnRvVmFyKCk7XHJcblx0bm9kZS5za2luV2VpZ2h0Tm9kZSA9IHN0b3JhZ2UoIG5ldyBJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUoIHNraW5uZWRNZXNoLmdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ3NraW5XZWlnaHQnICkuYXJyYXksIDQgKSwgJ3ZlYzQnICkuc2V0UEJPKCB0cnVlICkudG9SZWFkT25seSgpLmVsZW1lbnQoIGluc3RhbmNlSW5kZXggKS50b1ZhcigpO1xyXG5cdG5vZGUuYmluZE1hdHJpeE5vZGUgPSB1bmlmb3JtKCBza2lubmVkTWVzaC5iaW5kTWF0cml4LCAnbWF0NCcgKTtcclxuXHRub2RlLmJpbmRNYXRyaXhJbnZlcnNlTm9kZSA9IHVuaWZvcm0oIHNraW5uZWRNZXNoLmJpbmRNYXRyaXhJbnZlcnNlLCAnbWF0NCcgKTtcclxuXHRub2RlLmJvbmVNYXRyaWNlc05vZGUgPSBidWZmZXIoIHNraW5uZWRNZXNoLnNrZWxldG9uLmJvbmVNYXRyaWNlcywgJ21hdDQnLCBza2lubmVkTWVzaC5za2VsZXRvbi5ib25lcy5sZW5ndGggKTtcclxuXHRub2RlLnRvUG9zaXRpb25Ob2RlID0gdG9Qb3NpdGlvbjtcclxuXHJcblx0cmV0dXJuIG5vZGVPYmplY3QoIG5vZGUgKTtcclxuXHJcbn07XHJcbiIsImltcG9ydCBOb2RlIGZyb20gJy4uL2NvcmUvTm9kZS5qcyc7XHJcbmltcG9ydCB7IGV4cHJlc3Npb24gfSBmcm9tICcuLi9jb2RlL0V4cHJlc3Npb25Ob2RlLmpzJztcclxuaW1wb3J0IHsgbm9kZU9iamVjdCwgbm9kZUFycmF5IH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgbW9kdWxlIG9mZmVycyBhIHZhcmlldHkgb2Ygd2F5cyB0byBpbXBsZW1lbnQgbG9vcHMgaW4gVFNMLiBJbiBpdCdzIGJhc2ljIGZvcm0gaXQnczpcclxuICogYGBganNcclxuICogTG9vcCggY291bnQsICggeyBpIH0gKSA9PiB7XHJcbiAqXHJcbiAqIH0gKTtcclxuICogYGBgXHJcbiAqIEhvd2V2ZXIsIGl0IGlzIGFsc28gcG9zc2libGUgdG8gZGVmaW5lIGEgc3RhcnQgYW5kIGVuZCByYW5nZXMsIGRhdGEgdHlwZXMgYW5kIGxvb3AgY29uZGl0aW9uczpcclxuICogYGBganNcclxuICogTG9vcCggeyBzdGFydDogaW50KCAwICksIGVuZDogaW50KCAxMCApLCB0eXBlOiAnaW50JywgY29uZGl0aW9uOiAnPCcgfSwgKCB7IGkgfSApID0+IHtcclxuICpcclxuICogfSApO1xyXG4gKmBgYFxyXG4gKiBOZXN0ZWQgbG9vcHMgY2FuIGJlIGRlZmluZWQgaW4gYSBjb21wYWN0ZWQgZm9ybTpcclxuICogYGBganNcclxuICogTG9vcCggMTAsIDUsICggeyBpLCBqIH0gKSA9PiB7XHJcbiAqXHJcbiAqIH0gKTtcclxuICogYGBgXHJcbiAqIExvb3BzIHRoYXQgc2hvdWxkIHJ1biBiYWNrd2FyZHMgY2FuIGJlIGRlZmluZWQgbGlrZSBzbzpcclxuICogYGBganNcclxuICogTG9vcCggeyBzdGFydDogMTAgfSwgKCkgPT4ge30gKTtcclxuICogYGBgXHJcbiAqIEl0IGlzIHBvc3NpYmxlIHRvIGV4ZWN1dGUgd2l0aCBib29sZWFuIHZhbHVlcywgc2ltaWxhciB0byB0aGUgYHdoaWxlYCBzeW50YXguXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IHZhbHVlID0gZmxvYXQoIDAgKS50b1ZhcigpO1xyXG4gKlxyXG4gKiBMb29wKCB2YWx1ZS5sZXNzVGhhbiggMTAgKSwgKCkgPT4ge1xyXG4gKlxyXG4gKiBcdHZhbHVlLmFkZEFzc2lnbiggMSApO1xyXG4gKlxyXG4gKiB9ICk7XHJcbiAqIGBgYFxyXG4gKiBUaGUgbW9kdWxlIGFsc28gcHJvdmlkZXMgYEJyZWFrKClgIGFuZCBgQ29udGludWUoKWAgVFNMIGV4cHJlc3Npb24gZm9yIGxvb3AgY29udHJvbC5cclxuICogQGF1Z21lbnRzIE5vZGVcclxuICovXHJcbmNsYXNzIExvb3BOb2RlIGV4dGVuZHMgTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ0xvb3BOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGxvb3Agbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8YW55Pn0gcGFyYW1zIC0gRGVwZW5kaW5nIG9uIHRoZSBsb29wIHR5cGUsIGFycmF5IGhvbGRzIGRpZmZlcmVudCBwYXJhbWV0ZXJpemF0aW9uIHZhbHVlcyBmb3IgdGhlIGxvb3AuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHBhcmFtcyA9IFtdICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0dGhpcy5wYXJhbXMgPSBwYXJhbXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIGxvb3AgdmFyaWFibGUgbmFtZSBiYXNlZCBvbiBhbiBpbmRleC4gVGhlIHBhdHRlcm4gaXNcclxuXHQgKiBgMGAgPSBgaWAsIGAxYD0gYGpgLCBgMmA9IGBrYCBhbmQgc28gb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXguXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgbG9vcCB2YXJpYWJsZSBuYW1lLlxyXG5cdCAqL1xyXG5cdGdldFZhck5hbWUoIGluZGV4ICkge1xyXG5cclxuXHRcdHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKCAnaScuY2hhckNvZGVBdCggMCApICsgaW5kZXggKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHByb3BlcnRpZXMgYWJvdXQgdGhpcyBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBub2RlIHByb3BlcnRpZXMuXHJcblx0ICovXHJcblx0Z2V0UHJvcGVydGllcyggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCBwcm9wZXJ0aWVzID0gYnVpbGRlci5nZXROb2RlUHJvcGVydGllcyggdGhpcyApO1xyXG5cclxuXHRcdGlmICggcHJvcGVydGllcy5zdGFja05vZGUgIT09IHVuZGVmaW5lZCApIHJldHVybiBwcm9wZXJ0aWVzO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0Y29uc3QgaW5wdXRzID0ge307XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gdGhpcy5wYXJhbXMubGVuZ3RoIC0gMTsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBwYXJhbSA9IHRoaXMucGFyYW1zWyBpIF07XHJcblxyXG5cdFx0XHRjb25zdCBuYW1lID0gKCBwYXJhbS5pc05vZGUgIT09IHRydWUgJiYgcGFyYW0ubmFtZSApIHx8IHRoaXMuZ2V0VmFyTmFtZSggaSApO1xyXG5cdFx0XHRjb25zdCB0eXBlID0gKCBwYXJhbS5pc05vZGUgIT09IHRydWUgJiYgcGFyYW0udHlwZSApIHx8ICdpbnQnO1xyXG5cclxuXHRcdFx0aW5wdXRzWyBuYW1lIF0gPSBleHByZXNzaW9uKCBuYW1lLCB0eXBlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHN0YWNrID0gYnVpbGRlci5hZGRTdGFjaygpOyAvLyBUT0RPOiBjYWNoZSgpIGl0XHJcblxyXG5cdFx0cHJvcGVydGllcy5yZXR1cm5zTm9kZSA9IHRoaXMucGFyYW1zWyB0aGlzLnBhcmFtcy5sZW5ndGggLSAxIF0oIGlucHV0cywgc3RhY2ssIGJ1aWxkZXIgKTtcclxuXHRcdHByb3BlcnRpZXMuc3RhY2tOb2RlID0gc3RhY2s7XHJcblxyXG5cdFx0YnVpbGRlci5yZW1vdmVTdGFjaygpO1xyXG5cclxuXHRcdHJldHVybiBwcm9wZXJ0aWVzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGlzIG92ZXJ3cml0dGVuIHNpbmNlIHRoZSBub2RlIHR5cGUgaXMgaW5mZXJyZWQgYmFzZWQgb24gdGhlIGxvb3AgY29uZmlndXJhdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgbm9kZSB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldE5vZGVUeXBlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IHsgcmV0dXJuc05vZGUgfSA9IHRoaXMuZ2V0UHJvcGVydGllcyggYnVpbGRlciApO1xyXG5cclxuXHRcdHJldHVybiByZXR1cm5zTm9kZSA/IHJldHVybnNOb2RlLmdldE5vZGVUeXBlKCBidWlsZGVyICkgOiAndm9pZCc7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXAoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Ly8gc2V0dXAgcHJvcGVydGllc1xyXG5cclxuXHRcdHRoaXMuZ2V0UHJvcGVydGllcyggYnVpbGRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdGdlbmVyYXRlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IHByb3BlcnRpZXMgPSB0aGlzLmdldFByb3BlcnRpZXMoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRjb25zdCBwYXJhbXMgPSB0aGlzLnBhcmFtcztcclxuXHRcdGNvbnN0IHN0YWNrTm9kZSA9IHByb3BlcnRpZXMuc3RhY2tOb2RlO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHBhcmFtcy5sZW5ndGggLSAxOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHBhcmFtID0gcGFyYW1zWyBpIF07XHJcblxyXG5cdFx0XHRsZXQgaXNXaGlsZSA9IGZhbHNlLCBzdGFydCA9IG51bGwsIGVuZCA9IG51bGwsIG5hbWUgPSBudWxsLCB0eXBlID0gbnVsbCwgY29uZGl0aW9uID0gbnVsbCwgdXBkYXRlID0gbnVsbDtcclxuXHJcblx0XHRcdGlmICggcGFyYW0uaXNOb2RlICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIHBhcmFtLmdldE5vZGVUeXBlKCBidWlsZGVyICkgPT09ICdib29sJyApIHtcclxuXHJcblx0XHRcdFx0XHRpc1doaWxlID0gdHJ1ZTtcclxuXHRcdFx0XHRcdHR5cGUgPSAnYm9vbCc7XHJcblx0XHRcdFx0XHRlbmQgPSBwYXJhbS5idWlsZCggYnVpbGRlciwgdHlwZSApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdHR5cGUgPSAnaW50JztcclxuXHRcdFx0XHRcdG5hbWUgPSB0aGlzLmdldFZhck5hbWUoIGkgKTtcclxuXHRcdFx0XHRcdHN0YXJ0ID0gJzAnO1xyXG5cdFx0XHRcdFx0ZW5kID0gcGFyYW0uYnVpbGQoIGJ1aWxkZXIsIHR5cGUgKTtcclxuXHRcdFx0XHRcdGNvbmRpdGlvbiA9ICc8JztcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0dHlwZSA9IHBhcmFtLnR5cGUgfHwgJ2ludCc7XHJcblx0XHRcdFx0bmFtZSA9IHBhcmFtLm5hbWUgfHwgdGhpcy5nZXRWYXJOYW1lKCBpICk7XHJcblx0XHRcdFx0c3RhcnQgPSBwYXJhbS5zdGFydDtcclxuXHRcdFx0XHRlbmQgPSBwYXJhbS5lbmQ7XHJcblx0XHRcdFx0Y29uZGl0aW9uID0gcGFyYW0uY29uZGl0aW9uO1xyXG5cdFx0XHRcdHVwZGF0ZSA9IHBhcmFtLnVwZGF0ZTtcclxuXHJcblx0XHRcdFx0aWYgKCB0eXBlb2Ygc3RhcnQgPT09ICdudW1iZXInICkgc3RhcnQgPSBidWlsZGVyLmdlbmVyYXRlQ29uc3QoIHR5cGUsIHN0YXJ0ICk7XHJcblx0XHRcdFx0ZWxzZSBpZiAoIHN0YXJ0ICYmIHN0YXJ0LmlzTm9kZSApIHN0YXJ0ID0gc3RhcnQuYnVpbGQoIGJ1aWxkZXIsIHR5cGUgKTtcclxuXHJcblx0XHRcdFx0aWYgKCB0eXBlb2YgZW5kID09PSAnbnVtYmVyJyApIGVuZCA9IGJ1aWxkZXIuZ2VuZXJhdGVDb25zdCggdHlwZSwgZW5kICk7XHJcblx0XHRcdFx0ZWxzZSBpZiAoIGVuZCAmJiBlbmQuaXNOb2RlICkgZW5kID0gZW5kLmJ1aWxkKCBidWlsZGVyLCB0eXBlICk7XHJcblxyXG5cdFx0XHRcdGlmICggc3RhcnQgIT09IHVuZGVmaW5lZCAmJiBlbmQgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRzdGFydCA9IHN0YXJ0ICsgJyAtIDEnO1xyXG5cdFx0XHRcdFx0ZW5kID0gJzAnO1xyXG5cdFx0XHRcdFx0Y29uZGl0aW9uID0gJz49JztcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggZW5kICE9PSB1bmRlZmluZWQgJiYgc3RhcnQgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRzdGFydCA9ICcwJztcclxuXHRcdFx0XHRcdGNvbmRpdGlvbiA9ICc8JztcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoIGNvbmRpdGlvbiA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdGlmICggTnVtYmVyKCBzdGFydCApID4gTnVtYmVyKCBlbmQgKSApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbiA9ICc+PSc7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbiA9ICc8JztcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGxldCBsb29wU25pcHBldDtcclxuXHJcblx0XHRcdGlmICggaXNXaGlsZSApIHtcclxuXHJcblx0XHRcdFx0bG9vcFNuaXBwZXQgPSBgd2hpbGUgKCAkeyBlbmQgfSApYDtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGludGVybmFsUGFyYW0gPSB7IHN0YXJ0LCBlbmQsIGNvbmRpdGlvbiB9O1xyXG5cclxuXHRcdFx0XHQvL1xyXG5cclxuXHRcdFx0XHRjb25zdCBzdGFydFNuaXBwZXQgPSBpbnRlcm5hbFBhcmFtLnN0YXJ0O1xyXG5cdFx0XHRcdGNvbnN0IGVuZFNuaXBwZXQgPSBpbnRlcm5hbFBhcmFtLmVuZDtcclxuXHJcblx0XHRcdFx0bGV0IGRlY2xhcmF0aW9uU25pcHBldCA9ICcnO1xyXG5cdFx0XHRcdGxldCBjb25kaXRpb25hbFNuaXBwZXQgPSAnJztcclxuXHRcdFx0XHRsZXQgdXBkYXRlU25pcHBldCA9ICcnO1xyXG5cclxuXHRcdFx0XHRpZiAoICEgdXBkYXRlICkge1xyXG5cclxuXHRcdFx0XHRcdGlmICggdHlwZSA9PT0gJ2ludCcgfHwgdHlwZSA9PT0gJ3VpbnQnICkge1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCBjb25kaXRpb24uaW5jbHVkZXMoICc8JyApICkgdXBkYXRlID0gJysrJztcclxuXHRcdFx0XHRcdFx0ZWxzZSB1cGRhdGUgPSAnLS0nO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIGNvbmRpdGlvbi5pbmNsdWRlcyggJzwnICkgKSB1cGRhdGUgPSAnKz0gMS4nO1xyXG5cdFx0XHRcdFx0XHRlbHNlIHVwZGF0ZSA9ICctPSAxLic7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGRlY2xhcmF0aW9uU25pcHBldCArPSBidWlsZGVyLmdldFZhciggdHlwZSwgbmFtZSApICsgJyA9ICcgKyBzdGFydFNuaXBwZXQ7XHJcblxyXG5cdFx0XHRcdGNvbmRpdGlvbmFsU25pcHBldCArPSBuYW1lICsgJyAnICsgY29uZGl0aW9uICsgJyAnICsgZW5kU25pcHBldDtcclxuXHRcdFx0XHR1cGRhdGVTbmlwcGV0ICs9IG5hbWUgKyAnICcgKyB1cGRhdGU7XHJcblxyXG5cdFx0XHRcdGxvb3BTbmlwcGV0ID0gYGZvciAoICR7IGRlY2xhcmF0aW9uU25pcHBldCB9OyAkeyBjb25kaXRpb25hbFNuaXBwZXQgfTsgJHsgdXBkYXRlU25pcHBldCB9IClgO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0YnVpbGRlci5hZGRGbG93Q29kZSggKCBpID09PSAwID8gJ1xcbicgOiAnJyApICsgYnVpbGRlci50YWIgKyBsb29wU25pcHBldCArICcge1xcblxcbicgKS5hZGRGbG93VGFiKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHN0YWNrU25pcHBldCA9IHN0YWNrTm9kZS5idWlsZCggYnVpbGRlciwgJ3ZvaWQnICk7XHJcblxyXG5cdFx0Y29uc3QgcmV0dXJuc1NuaXBwZXQgPSBwcm9wZXJ0aWVzLnJldHVybnNOb2RlID8gcHJvcGVydGllcy5yZXR1cm5zTm9kZS5idWlsZCggYnVpbGRlciApIDogJyc7XHJcblxyXG5cdFx0YnVpbGRlci5yZW1vdmVGbG93VGFiKCkuYWRkRmxvd0NvZGUoICdcXG4nICsgYnVpbGRlci50YWIgKyBzdGFja1NuaXBwZXQgKTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSB0aGlzLnBhcmFtcy5sZW5ndGggLSAxOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdGJ1aWxkZXIuYWRkRmxvd0NvZGUoICggaSA9PT0gMCA/ICcnIDogYnVpbGRlci50YWIgKSArICd9XFxuXFxuJyApLnJlbW92ZUZsb3dUYWIoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0YnVpbGRlci5hZGRGbG93VGFiKCk7XHJcblxyXG5cdFx0cmV0dXJuIHJldHVybnNTbmlwcGV0O1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBMb29wTm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgbG9vcCBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0gey4uLmFueX0gcGFyYW1zIC0gQSBsaXN0IG9mIHBhcmFtZXRlcnMuXHJcbiAqIEByZXR1cm5zIHtMb29wTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBMb29wID0gKCAuLi5wYXJhbXMgKSA9PiBub2RlT2JqZWN0KCBuZXcgTG9vcE5vZGUoIG5vZGVBcnJheSggcGFyYW1zLCAnaW50JyApICkgKS5hcHBlbmQoKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgYENvbnRpbnVlKClgIGV4cHJlc3Npb24uXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBDb250aW51ZSA9ICgpID0+IGV4cHJlc3Npb24oICdjb250aW51ZScgKS5hcHBlbmQoKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgYEJyZWFrKClgIGV4cHJlc3Npb24uXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBCcmVhayA9ICgpID0+IGV4cHJlc3Npb24oICdicmVhaycgKS5hcHBlbmQoKTtcclxuXHJcbi8vIERlcHJlY2F0ZWRcclxuXHJcbi8qKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAZGVwcmVjYXRlZCBzaW5jZSByMTY4LiBVc2Uge0BsaW5rIExvb3B9IGluc3RlYWQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7Li4uYW55fSBwYXJhbXNcclxuICogQHJldHVybnMge0xvb3BOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGxvb3AgPSAoIC4uLnBhcmFtcyApID0+IHsgLy8gQGRlcHJlY2F0ZWQsIHIxNjhcclxuXHJcblx0Y29uc29sZS53YXJuKCAnVEhSRUUuVFNMOiBsb29wKCkgaGFzIGJlZW4gcmVuYW1lZCB0byBMb29wKCkuJyApO1xyXG5cdHJldHVybiBMb29wKCAuLi5wYXJhbXMgKTtcclxuXHJcbn07XHJcbiIsImltcG9ydCBOb2RlIGZyb20gJy4uL2NvcmUvTm9kZS5qcyc7XHJcbmltcG9ydCB7IE5vZGVVcGRhdGVUeXBlIH0gZnJvbSAnLi4vY29yZS9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBmbG9hdCwgbm9kZVByb3h5LCBGbiwgaXZlYzIsIGludCwgSWYgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcbmltcG9ydCB7IHVuaWZvcm0gfSBmcm9tICcuLi9jb3JlL1VuaWZvcm1Ob2RlLmpzJztcclxuaW1wb3J0IHsgcmVmZXJlbmNlIH0gZnJvbSAnLi9SZWZlcmVuY2VOb2RlLmpzJztcclxuaW1wb3J0IHsgcG9zaXRpb25Mb2NhbCB9IGZyb20gJy4vUG9zaXRpb24uanMnO1xyXG5pbXBvcnQgeyBub3JtYWxMb2NhbCB9IGZyb20gJy4vTm9ybWFsLmpzJztcclxuaW1wb3J0IHsgdGV4dHVyZUxvYWQgfSBmcm9tICcuL1RleHR1cmVOb2RlLmpzJztcclxuaW1wb3J0IHsgaW5zdGFuY2VJbmRleCwgdmVydGV4SW5kZXggfSBmcm9tICcuLi9jb3JlL0luZGV4Tm9kZS5qcyc7XHJcbmltcG9ydCB7IExvb3AgfSBmcm9tICcuLi91dGlscy9Mb29wTm9kZS5qcyc7XHJcblxyXG5pbXBvcnQgeyBEYXRhQXJyYXlUZXh0dXJlIH0gZnJvbSAnLi4vLi4vdGV4dHVyZXMvRGF0YUFycmF5VGV4dHVyZS5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjIuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3I0IH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3I0LmpzJztcclxuaW1wb3J0IHsgRmxvYXRUeXBlIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzLmpzJztcclxuXHJcbmNvbnN0IF9tb3JwaFRleHR1cmVzID0gLypAX19QVVJFX18qLyBuZXcgV2Vha01hcCgpO1xyXG5jb25zdCBfbW9ycGhWZWM0ID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yNCgpO1xyXG5cclxuY29uc3QgZ2V0TW9ycGggPSAvKkBfX1BVUkVfXyovIEZuKCAoIHsgYnVmZmVyTWFwLCBpbmZsdWVuY2UsIHN0cmlkZSwgd2lkdGgsIGRlcHRoLCBvZmZzZXQgfSApID0+IHtcclxuXHJcblx0Y29uc3QgdGV4ZWxJbmRleCA9IGludCggdmVydGV4SW5kZXggKS5tdWwoIHN0cmlkZSApLmFkZCggb2Zmc2V0ICk7XHJcblxyXG5cdGNvbnN0IHkgPSB0ZXhlbEluZGV4LmRpdiggd2lkdGggKTtcclxuXHRjb25zdCB4ID0gdGV4ZWxJbmRleC5zdWIoIHkubXVsKCB3aWR0aCApICk7XHJcblxyXG5cdGNvbnN0IGJ1ZmZlckF0dHJpYiA9IHRleHR1cmVMb2FkKCBidWZmZXJNYXAsIGl2ZWMyKCB4LCB5ICkgKS5kZXB0aCggZGVwdGggKS54eXo7XHJcblxyXG5cdHJldHVybiBidWZmZXJBdHRyaWIubXVsKCBpbmZsdWVuY2UgKTtcclxuXHJcbn0gKTtcclxuXHJcbmZ1bmN0aW9uIGdldEVudHJ5KCBnZW9tZXRyeSApIHtcclxuXHJcblx0Y29uc3QgaGFzTW9ycGhQb3NpdGlvbiA9IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbiAhPT0gdW5kZWZpbmVkO1xyXG5cdGNvbnN0IGhhc01vcnBoTm9ybWFscyA9IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5ub3JtYWwgIT09IHVuZGVmaW5lZDtcclxuXHRjb25zdCBoYXNNb3JwaENvbG9ycyA9IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5jb2xvciAhPT0gdW5kZWZpbmVkO1xyXG5cclxuXHQvLyBpbnN0ZWFkIG9mIHVzaW5nIGF0dHJpYnV0ZXMsIHRoZSBXZWJHTCAyIGNvZGUgcGF0aCBlbmNvZGVzIG1vcnBoIHRhcmdldHNcclxuXHQvLyBpbnRvIGFuIGFycmF5IG9mIGRhdGEgdGV4dHVyZXMuIEVhY2ggbGF5ZXIgcmVwcmVzZW50cyBhIHNpbmdsZSBtb3JwaCB0YXJnZXQuXHJcblxyXG5cdGNvbnN0IG1vcnBoQXR0cmlidXRlID0gZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uIHx8IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5ub3JtYWwgfHwgZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLmNvbG9yO1xyXG5cdGNvbnN0IG1vcnBoVGFyZ2V0c0NvdW50ID0gKCBtb3JwaEF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkgPyBtb3JwaEF0dHJpYnV0ZS5sZW5ndGggOiAwO1xyXG5cclxuXHRsZXQgZW50cnkgPSBfbW9ycGhUZXh0dXJlcy5nZXQoIGdlb21ldHJ5ICk7XHJcblxyXG5cdGlmICggZW50cnkgPT09IHVuZGVmaW5lZCB8fCBlbnRyeS5jb3VudCAhPT0gbW9ycGhUYXJnZXRzQ291bnQgKSB7XHJcblxyXG5cdFx0aWYgKCBlbnRyeSAhPT0gdW5kZWZpbmVkICkgZW50cnkudGV4dHVyZS5kaXNwb3NlKCk7XHJcblxyXG5cdFx0Y29uc3QgbW9ycGhUYXJnZXRzID0gZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uIHx8IFtdO1xyXG5cdFx0Y29uc3QgbW9ycGhOb3JtYWxzID0gZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbCB8fCBbXTtcclxuXHRcdGNvbnN0IG1vcnBoQ29sb3JzID0gZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLmNvbG9yIHx8IFtdO1xyXG5cclxuXHRcdGxldCB2ZXJ0ZXhEYXRhQ291bnQgPSAwO1xyXG5cclxuXHRcdGlmICggaGFzTW9ycGhQb3NpdGlvbiA9PT0gdHJ1ZSApIHZlcnRleERhdGFDb3VudCA9IDE7XHJcblx0XHRpZiAoIGhhc01vcnBoTm9ybWFscyA9PT0gdHJ1ZSApIHZlcnRleERhdGFDb3VudCA9IDI7XHJcblx0XHRpZiAoIGhhc01vcnBoQ29sb3JzID09PSB0cnVlICkgdmVydGV4RGF0YUNvdW50ID0gMztcclxuXHJcblx0XHRsZXQgd2lkdGggPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50ICogdmVydGV4RGF0YUNvdW50O1xyXG5cdFx0bGV0IGhlaWdodCA9IDE7XHJcblxyXG5cdFx0Y29uc3QgbWF4VGV4dHVyZVNpemUgPSA0MDk2OyAvLyBAVE9ETzogVXNlICdjYXBhYmlsaXRpZXMubWF4VGV4dHVyZVNpemUnXHJcblxyXG5cdFx0aWYgKCB3aWR0aCA+IG1heFRleHR1cmVTaXplICkge1xyXG5cclxuXHRcdFx0aGVpZ2h0ID0gTWF0aC5jZWlsKCB3aWR0aCAvIG1heFRleHR1cmVTaXplICk7XHJcblx0XHRcdHdpZHRoID0gbWF4VGV4dHVyZVNpemU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGJ1ZmZlciA9IG5ldyBGbG9hdDMyQXJyYXkoIHdpZHRoICogaGVpZ2h0ICogNCAqIG1vcnBoVGFyZ2V0c0NvdW50ICk7XHJcblxyXG5cdFx0Y29uc3QgYnVmZmVyVGV4dHVyZSA9IG5ldyBEYXRhQXJyYXlUZXh0dXJlKCBidWZmZXIsIHdpZHRoLCBoZWlnaHQsIG1vcnBoVGFyZ2V0c0NvdW50ICk7XHJcblx0XHRidWZmZXJUZXh0dXJlLnR5cGUgPSBGbG9hdFR5cGU7XHJcblx0XHRidWZmZXJUZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHQvLyBmaWxsIGJ1ZmZlclxyXG5cclxuXHRcdGNvbnN0IHZlcnRleERhdGFTdHJpZGUgPSB2ZXJ0ZXhEYXRhQ291bnQgKiA0O1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IG1vcnBoVGFyZ2V0c0NvdW50OyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgbW9ycGhUYXJnZXQgPSBtb3JwaFRhcmdldHNbIGkgXTtcclxuXHRcdFx0Y29uc3QgbW9ycGhOb3JtYWwgPSBtb3JwaE5vcm1hbHNbIGkgXTtcclxuXHRcdFx0Y29uc3QgbW9ycGhDb2xvciA9IG1vcnBoQ29sb3JzWyBpIF07XHJcblxyXG5cdFx0XHRjb25zdCBvZmZzZXQgPSB3aWR0aCAqIGhlaWdodCAqIDQgKiBpO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGogPSAwOyBqIDwgbW9ycGhUYXJnZXQuY291bnQ7IGogKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHN0cmlkZSA9IGogKiB2ZXJ0ZXhEYXRhU3RyaWRlO1xyXG5cclxuXHRcdFx0XHRpZiAoIGhhc01vcnBoUG9zaXRpb24gPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0X21vcnBoVmVjNC5mcm9tQnVmZmVyQXR0cmlidXRlKCBtb3JwaFRhcmdldCwgaiApO1xyXG5cclxuXHRcdFx0XHRcdGJ1ZmZlclsgb2Zmc2V0ICsgc3RyaWRlICsgMCBdID0gX21vcnBoVmVjNC54O1xyXG5cdFx0XHRcdFx0YnVmZmVyWyBvZmZzZXQgKyBzdHJpZGUgKyAxIF0gPSBfbW9ycGhWZWM0Lnk7XHJcblx0XHRcdFx0XHRidWZmZXJbIG9mZnNldCArIHN0cmlkZSArIDIgXSA9IF9tb3JwaFZlYzQuejtcclxuXHRcdFx0XHRcdGJ1ZmZlclsgb2Zmc2V0ICsgc3RyaWRlICsgMyBdID0gMDtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoIGhhc01vcnBoTm9ybWFscyA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0XHRfbW9ycGhWZWM0LmZyb21CdWZmZXJBdHRyaWJ1dGUoIG1vcnBoTm9ybWFsLCBqICk7XHJcblxyXG5cdFx0XHRcdFx0YnVmZmVyWyBvZmZzZXQgKyBzdHJpZGUgKyA0IF0gPSBfbW9ycGhWZWM0Lng7XHJcblx0XHRcdFx0XHRidWZmZXJbIG9mZnNldCArIHN0cmlkZSArIDUgXSA9IF9tb3JwaFZlYzQueTtcclxuXHRcdFx0XHRcdGJ1ZmZlclsgb2Zmc2V0ICsgc3RyaWRlICsgNiBdID0gX21vcnBoVmVjNC56O1xyXG5cdFx0XHRcdFx0YnVmZmVyWyBvZmZzZXQgKyBzdHJpZGUgKyA3IF0gPSAwO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICggaGFzTW9ycGhDb2xvcnMgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0X21vcnBoVmVjNC5mcm9tQnVmZmVyQXR0cmlidXRlKCBtb3JwaENvbG9yLCBqICk7XHJcblxyXG5cdFx0XHRcdFx0YnVmZmVyWyBvZmZzZXQgKyBzdHJpZGUgKyA4IF0gPSBfbW9ycGhWZWM0Lng7XHJcblx0XHRcdFx0XHRidWZmZXJbIG9mZnNldCArIHN0cmlkZSArIDkgXSA9IF9tb3JwaFZlYzQueTtcclxuXHRcdFx0XHRcdGJ1ZmZlclsgb2Zmc2V0ICsgc3RyaWRlICsgMTAgXSA9IF9tb3JwaFZlYzQuejtcclxuXHRcdFx0XHRcdGJ1ZmZlclsgb2Zmc2V0ICsgc3RyaWRlICsgMTEgXSA9ICggbW9ycGhDb2xvci5pdGVtU2l6ZSA9PT0gNCApID8gX21vcnBoVmVjNC53IDogMTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRlbnRyeSA9IHtcclxuXHRcdFx0Y291bnQ6IG1vcnBoVGFyZ2V0c0NvdW50LFxyXG5cdFx0XHR0ZXh0dXJlOiBidWZmZXJUZXh0dXJlLFxyXG5cdFx0XHRzdHJpZGU6IHZlcnRleERhdGFDb3VudCxcclxuXHRcdFx0c2l6ZTogbmV3IFZlY3RvcjIoIHdpZHRoLCBoZWlnaHQgKVxyXG5cdFx0fTtcclxuXHJcblx0XHRfbW9ycGhUZXh0dXJlcy5zZXQoIGdlb21ldHJ5LCBlbnRyeSApO1xyXG5cclxuXHRcdGZ1bmN0aW9uIGRpc3Bvc2VUZXh0dXJlKCkge1xyXG5cclxuXHRcdFx0YnVmZmVyVGV4dHVyZS5kaXNwb3NlKCk7XHJcblxyXG5cdFx0XHRfbW9ycGhUZXh0dXJlcy5kZWxldGUoIGdlb21ldHJ5ICk7XHJcblxyXG5cdFx0XHRnZW9tZXRyeS5yZW1vdmVFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIGRpc3Bvc2VUZXh0dXJlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGdlb21ldHJ5LmFkZEV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgZGlzcG9zZVRleHR1cmUgKTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gZW50cnk7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogVGhpcyBub2RlIGltcGxlbWVudHMgdGhlIHZlcnRleCB0cmFuc2Zvcm1hdGlvbiBzaGFkZXIgbG9naWMgd2hpY2ggaXMgcmVxdWlyZWRcclxuICogZm9yIG1vcnBoIHRhcmdldCBhbmltYXRpb24uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBOb2RlXHJcbiAqL1xyXG5jbGFzcyBNb3JwaE5vZGUgZXh0ZW5kcyBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnTW9ycGhOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG1vcnBoIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01lc2h9IG1lc2ggLSBUaGUgbWVzaCBob2xkaW5nIHRoZSBtb3JwaCB0YXJnZXRzLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBtZXNoICkge1xyXG5cclxuXHRcdHN1cGVyKCAndm9pZCcgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBtZXNoIGhvbGRpbmcgdGhlIG1vcnBoIHRhcmdldHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge01lc2h9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWVzaCA9IG1lc2g7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHVuaWZvcm0gbm9kZSB3aGljaCByZXByZXNlbnRzIHRoZSBtb3JwaCBiYXNlIGluZmx1ZW5jZSB2YWx1ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VW5pZm9ybU5vZGU8ZmxvYXQ+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1vcnBoQmFzZUluZmx1ZW5jZSA9IHVuaWZvcm0oIDEgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB1cGRhdGUgdHlwZSBvdmVyd3JpdHRlbiBzaW5jZSBtb3JwaCBub2RlcyBhcmUgdXBkYXRlZCBwZXIgb2JqZWN0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXBkYXRlVHlwZSA9IE5vZGVVcGRhdGVUeXBlLk9CSkVDVDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXR1cHMgdGhlIG1vcnBoIG5vZGUgYnkgYXNzaWduaW5nIHRoZSB0cmFuc2Zvcm1lZCB2ZXJ0ZXggZGF0YSB0byBwcmVkZWZpbmVkIG5vZGUgdmFyaWFibGVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKi9cclxuXHRzZXR1cCggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCB7IGdlb21ldHJ5IH0gPSBidWlsZGVyO1xyXG5cclxuXHRcdGNvbnN0IGhhc01vcnBoUG9zaXRpb24gPSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24gIT09IHVuZGVmaW5lZDtcclxuXHRcdGNvbnN0IGhhc01vcnBoTm9ybWFscyA9IGdlb21ldHJ5Lmhhc0F0dHJpYnV0ZSggJ25vcm1hbCcgKSAmJiBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMubm9ybWFsICE9PSB1bmRlZmluZWQ7XHJcblxyXG5cdFx0Y29uc3QgbW9ycGhBdHRyaWJ1dGUgPSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24gfHwgZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbCB8fCBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMuY29sb3I7XHJcblx0XHRjb25zdCBtb3JwaFRhcmdldHNDb3VudCA9ICggbW9ycGhBdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApID8gbW9ycGhBdHRyaWJ1dGUubGVuZ3RoIDogMDtcclxuXHJcblx0XHQvLyBub2Rlc1xyXG5cclxuXHRcdGNvbnN0IHsgdGV4dHVyZTogYnVmZmVyTWFwLCBzdHJpZGUsIHNpemUgfSA9IGdldEVudHJ5KCBnZW9tZXRyeSApO1xyXG5cclxuXHRcdGlmICggaGFzTW9ycGhQb3NpdGlvbiA9PT0gdHJ1ZSApIHBvc2l0aW9uTG9jYWwubXVsQXNzaWduKCB0aGlzLm1vcnBoQmFzZUluZmx1ZW5jZSApO1xyXG5cdFx0aWYgKCBoYXNNb3JwaE5vcm1hbHMgPT09IHRydWUgKSBub3JtYWxMb2NhbC5tdWxBc3NpZ24oIHRoaXMubW9ycGhCYXNlSW5mbHVlbmNlICk7XHJcblxyXG5cdFx0Y29uc3Qgd2lkdGggPSBpbnQoIHNpemUud2lkdGggKTtcclxuXHJcblx0XHRMb29wKCBtb3JwaFRhcmdldHNDb3VudCwgKCB7IGkgfSApID0+IHtcclxuXHJcblx0XHRcdGNvbnN0IGluZmx1ZW5jZSA9IGZsb2F0KCAwICkudG9WYXIoKTtcclxuXHJcblx0XHRcdGlmICggdGhpcy5tZXNoLmNvdW50ID4gMSAmJiAoIHRoaXMubWVzaC5tb3JwaFRleHR1cmUgIT09IG51bGwgJiYgdGhpcy5tZXNoLm1vcnBoVGV4dHVyZSAhPT0gdW5kZWZpbmVkICkgKSB7XHJcblxyXG5cdFx0XHRcdGluZmx1ZW5jZS5hc3NpZ24oIHRleHR1cmVMb2FkKCB0aGlzLm1lc2gubW9ycGhUZXh0dXJlLCBpdmVjMiggaW50KCBpICkuYWRkKCAxICksIGludCggaW5zdGFuY2VJbmRleCApICkgKS5yICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRpbmZsdWVuY2UuYXNzaWduKCByZWZlcmVuY2UoICdtb3JwaFRhcmdldEluZmx1ZW5jZXMnLCAnZmxvYXQnICkuZWxlbWVudCggaSApLnRvVmFyKCkgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdElmKCBpbmZsdWVuY2Uubm90RXF1YWwoIDAgKSwgKCkgPT4ge1xyXG5cclxuXHRcdFx0XHRpZiAoIGhhc01vcnBoUG9zaXRpb24gPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0cG9zaXRpb25Mb2NhbC5hZGRBc3NpZ24oIGdldE1vcnBoKCB7XHJcblx0XHRcdFx0XHRcdGJ1ZmZlck1hcCxcclxuXHRcdFx0XHRcdFx0aW5mbHVlbmNlLFxyXG5cdFx0XHRcdFx0XHRzdHJpZGUsXHJcblx0XHRcdFx0XHRcdHdpZHRoLFxyXG5cdFx0XHRcdFx0XHRkZXB0aDogaSxcclxuXHRcdFx0XHRcdFx0b2Zmc2V0OiBpbnQoIDAgKVxyXG5cdFx0XHRcdFx0fSApICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKCBoYXNNb3JwaE5vcm1hbHMgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0bm9ybWFsTG9jYWwuYWRkQXNzaWduKCBnZXRNb3JwaCgge1xyXG5cdFx0XHRcdFx0XHRidWZmZXJNYXAsXHJcblx0XHRcdFx0XHRcdGluZmx1ZW5jZSxcclxuXHRcdFx0XHRcdFx0c3RyaWRlLFxyXG5cdFx0XHRcdFx0XHR3aWR0aCxcclxuXHRcdFx0XHRcdFx0ZGVwdGg6IGksXHJcblx0XHRcdFx0XHRcdG9mZnNldDogaW50KCAxIClcclxuXHRcdFx0XHRcdH0gKSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0fSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIHN0YXRlIG9mIHRoZSBtb3JwaGVkIG1lc2ggYnkgdXBkYXRpbmcgdGhlIGJhc2UgaW5mbHVlbmNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlRnJhbWV9IGZyYW1lIC0gVGhlIGN1cnJlbnQgbm9kZSBmcmFtZS5cclxuXHQgKi9cclxuXHR1cGRhdGUoIC8qZnJhbWUqLyApIHtcclxuXHJcblx0XHRjb25zdCBtb3JwaEJhc2VJbmZsdWVuY2UgPSB0aGlzLm1vcnBoQmFzZUluZmx1ZW5jZTtcclxuXHJcblx0XHRpZiAoIHRoaXMubWVzaC5nZW9tZXRyeS5tb3JwaFRhcmdldHNSZWxhdGl2ZSApIHtcclxuXHJcblx0XHRcdG1vcnBoQmFzZUluZmx1ZW5jZS52YWx1ZSA9IDE7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdG1vcnBoQmFzZUluZmx1ZW5jZS52YWx1ZSA9IDEgLSB0aGlzLm1lc2gubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnJlZHVjZSggKCBhLCBiICkgPT4gYSArIGIsIDAgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IE1vcnBoTm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgbW9ycGggbm9kZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtNZXNofSBtZXNoIC0gVGhlIG1lc2ggaG9sZGluZyB0aGUgbW9ycGggdGFyZ2V0cy5cclxuICogQHJldHVybnMge01vcnBoTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBtb3JwaFJlZmVyZW5jZSA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBNb3JwaE5vZGUgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDEgKTtcclxuIiwiaW1wb3J0IE5vZGUgZnJvbSAnLi4vY29yZS9Ob2RlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBCYXNlIGNsYXNzIGZvciBsaWdodGluZyBub2Rlcy5cclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVcclxuICovXHJcbmNsYXNzIExpZ2h0aW5nTm9kZSBleHRlbmRzIE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdMaWdodGluZ05vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbGlnaHRpbmcgbm9kZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHJcblx0XHRzdXBlciggJ3ZlYzMnICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzTGlnaHRpbmdOb2RlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTGlnaHRpbmdOb2RlO1xyXG4iLCJpbXBvcnQgTGlnaHRpbmdOb2RlIGZyb20gJy4vTGlnaHRpbmdOb2RlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIGdlbmVyaWMgY2xhc3MgdGhhdCBjYW4gYmUgdXNlZCBieSBub2RlcyB3aGljaCBjb250cmlidXRlXHJcbiAqIGFtYmllbnQgb2NjbHVzaW9uIHRvIHRoZSBzY2VuZS4gRS5nLiBhbiBhbWJpZW50IG9jY2x1c2lvbiBtYXBcclxuICogbm9kZSBjYW4gYmUgdXNlZCBhcyBpbnB1dCBmb3IgdGhpcyBtb2R1bGUuIFVzZWQgaW4ge0BsaW5rIE5vZGVNYXRlcmlhbH0uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBMaWdodGluZ05vZGVcclxuICovXHJcbmNsYXNzIEFPTm9kZSBleHRlbmRzIExpZ2h0aW5nTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ0FPTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBBTyBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHs/Tm9kZTxmbG9hdD59IFthb05vZGU9bnVsbF0gLSBUaGUgYW1iaWVudCBvY2NsdXNpb24gbm9kZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggYW9Ob2RlID0gbnVsbCApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGFtYmllbnQgb2NjbHVzaW9uIG5vZGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPGZsb2F0Pn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hb05vZGUgPSBhb05vZGU7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXAoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0YnVpbGRlci5jb250ZXh0LmFtYmllbnRPY2NsdXNpb24ubXVsQXNzaWduKCB0aGlzLmFvTm9kZSApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBBT05vZGU7XHJcbiIsImltcG9ydCBDb250ZXh0Tm9kZSBmcm9tICcuLi9jb3JlL0NvbnRleHROb2RlLmpzJztcclxuaW1wb3J0IHsgbm9kZVByb3h5LCBmbG9hdCwgdmVjMyB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBgTGlnaHRpbmdDb250ZXh0Tm9kZWAgcmVwcmVzZW50cyBhbiBleHRlbnNpb24gb2YgdGhlIHtAbGluayBDb250ZXh0Tm9kZX0gbW9kdWxlXHJcbiAqIGJ5IGFkZGluZyBsaWdodGluZyBzcGVjaWZpYyBjb250ZXh0IGRhdGEuIEl0IHJlcHJlc2VudHMgdGhlIHJ1bnRpbWUgY29udGV4dCBvZlxyXG4gKiB7QGxpbmsgTGlnaHRzTm9kZX0uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBDb250ZXh0Tm9kZVxyXG4gKi9cclxuY2xhc3MgTGlnaHRpbmdDb250ZXh0Tm9kZSBleHRlbmRzIENvbnRleHROb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnTGlnaHRpbmdDb250ZXh0Tm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBsaWdodGluZyBjb250ZXh0IG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0xpZ2h0c05vZGV9IGxpZ2h0c05vZGUgLSBUaGUgbGlnaHRzIG5vZGUuXHJcblx0ICogQHBhcmFtIHs/TGlnaHRpbmdNb2RlbH0gW2xpZ2h0aW5nTW9kZWw9bnVsbF0gLSBUaGUgY3VycmVudCBsaWdodGluZyBtb2RlbC5cclxuXHQgKiBAcGFyYW0gez9Ob2RlPHZlYzM+fSBbYmFja2Ryb3BOb2RlPW51bGxdIC0gQSBiYWNrZHJvcCBub2RlLlxyXG5cdCAqIEBwYXJhbSB7P05vZGU8ZmxvYXQ+fSBbYmFja2Ryb3BBbHBoYU5vZGU9bnVsbF0gLSBBIGJhY2tkcm9wIGFscGhhIG5vZGUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGxpZ2h0c05vZGUsIGxpZ2h0aW5nTW9kZWwgPSBudWxsLCBiYWNrZHJvcE5vZGUgPSBudWxsLCBiYWNrZHJvcEFscGhhTm9kZSA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoIGxpZ2h0c05vZGUgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjdXJyZW50IGxpZ2h0aW5nIG1vZGVsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/TGlnaHRpbmdNb2RlbH1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5saWdodGluZ01vZGVsID0gbGlnaHRpbmdNb2RlbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgYmFja2Ryb3Agbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGU8dmVjMz59XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYmFja2Ryb3BOb2RlID0gYmFja2Ryb3BOb2RlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBiYWNrZHJvcCBhbHBoYSBub2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Tm9kZTxmbG9hdD59XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYmFja2Ryb3BBbHBoYU5vZGUgPSBiYWNrZHJvcEFscGhhTm9kZTtcclxuXHJcblx0XHR0aGlzLl92YWx1ZSA9IG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIGxpZ2h0aW5nIGNvbnRleHQgb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7e1xyXG5cdCAqIHJhZGlhbmNlOiBOb2RlPHZlYzM+LFxyXG5cdCAqIGlycmFkaWFuY2U6IE5vZGU8dmVjMz4sXHJcblx0ICogaWJsSXJyYWRpYW5jZTogTm9kZTx2ZWMzPixcclxuXHQgKiBhbWJpZW50T2NjbHVzaW9uOiBOb2RlPGZsb2F0PixcclxuXHQgKiByZWZsZWN0ZWRMaWdodDoge2RpcmVjdERpZmZ1c2U6IE5vZGU8dmVjMz4sIGRpcmVjdFNwZWN1bGFyOiBOb2RlPHZlYzM+LCBpbmRpcmVjdERpZmZ1c2U6IE5vZGU8dmVjMz4sIGluZGlyZWN0U3BlY3VsYXI6IE5vZGU8dmVjMz59LFxyXG5cdCAqIGJhY2tkcm9wOiBOb2RlPHZlYzM+LFxyXG5cdCAqIGJhY2tkcm9wQWxwaGE6IE5vZGU8ZmxvYXQ+XHJcblx0ICogfX0gVGhlIGxpZ2h0aW5nIGNvbnRleHQgb2JqZWN0LlxyXG5cdCAqL1xyXG5cdGdldENvbnRleHQoKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBiYWNrZHJvcE5vZGUsIGJhY2tkcm9wQWxwaGFOb2RlIH0gPSB0aGlzO1xyXG5cclxuXHRcdGNvbnN0IGRpcmVjdERpZmZ1c2UgPSB2ZWMzKCkudG9WYXIoICdkaXJlY3REaWZmdXNlJyApLFxyXG5cdFx0XHRkaXJlY3RTcGVjdWxhciA9IHZlYzMoKS50b1ZhciggJ2RpcmVjdFNwZWN1bGFyJyApLFxyXG5cdFx0XHRpbmRpcmVjdERpZmZ1c2UgPSB2ZWMzKCkudG9WYXIoICdpbmRpcmVjdERpZmZ1c2UnICksXHJcblx0XHRcdGluZGlyZWN0U3BlY3VsYXIgPSB2ZWMzKCkudG9WYXIoICdpbmRpcmVjdFNwZWN1bGFyJyApO1xyXG5cclxuXHRcdGNvbnN0IHJlZmxlY3RlZExpZ2h0ID0ge1xyXG5cdFx0XHRkaXJlY3REaWZmdXNlLFxyXG5cdFx0XHRkaXJlY3RTcGVjdWxhcixcclxuXHRcdFx0aW5kaXJlY3REaWZmdXNlLFxyXG5cdFx0XHRpbmRpcmVjdFNwZWN1bGFyXHJcblx0XHR9O1xyXG5cclxuXHRcdGNvbnN0IGNvbnRleHQgPSB7XHJcblx0XHRcdHJhZGlhbmNlOiB2ZWMzKCkudG9WYXIoICdyYWRpYW5jZScgKSxcclxuXHRcdFx0aXJyYWRpYW5jZTogdmVjMygpLnRvVmFyKCAnaXJyYWRpYW5jZScgKSxcclxuXHRcdFx0aWJsSXJyYWRpYW5jZTogdmVjMygpLnRvVmFyKCAnaWJsSXJyYWRpYW5jZScgKSxcclxuXHRcdFx0YW1iaWVudE9jY2x1c2lvbjogZmxvYXQoIDEgKS50b1ZhciggJ2FtYmllbnRPY2NsdXNpb24nICksXHJcblx0XHRcdHJlZmxlY3RlZExpZ2h0LFxyXG5cdFx0XHRiYWNrZHJvcDogYmFja2Ryb3BOb2RlLFxyXG5cdFx0XHRiYWNrZHJvcEFscGhhOiBiYWNrZHJvcEFscGhhTm9kZVxyXG5cdFx0fTtcclxuXHJcblx0XHRyZXR1cm4gY29udGV4dDtcclxuXHJcblx0fVxyXG5cclxuXHRzZXR1cCggYnVpbGRlciApIHtcclxuXHJcblx0XHR0aGlzLnZhbHVlID0gdGhpcy5fdmFsdWUgfHwgKCB0aGlzLl92YWx1ZSA9IHRoaXMuZ2V0Q29udGV4dCgpICk7XHJcblx0XHR0aGlzLnZhbHVlLmxpZ2h0aW5nTW9kZWwgPSB0aGlzLmxpZ2h0aW5nTW9kZWwgfHwgYnVpbGRlci5jb250ZXh0LmxpZ2h0aW5nTW9kZWw7XHJcblxyXG5cdFx0cmV0dXJuIHN1cGVyLnNldHVwKCBidWlsZGVyICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IExpZ2h0aW5nQ29udGV4dE5vZGU7XHJcblxyXG5leHBvcnQgY29uc3QgbGlnaHRpbmdDb250ZXh0ID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIExpZ2h0aW5nQ29udGV4dE5vZGUgKTtcclxuIiwiaW1wb3J0IExpZ2h0aW5nTm9kZSBmcm9tICcuL0xpZ2h0aW5nTm9kZS5qcyc7XHJcblxyXG4vKipcclxuICogQSBnZW5lcmljIGNsYXNzIHRoYXQgY2FuIGJlIHVzZWQgYnkgbm9kZXMgd2hpY2ggY29udHJpYnV0ZVxyXG4gKiBpcnJhZGlhbmNlIHRvIHRoZSBzY2VuZS4gRS5nLiBhIGxpZ2h0IG1hcCBub2RlIGNhbiBiZSB1c2VkXHJcbiAqIGFzIGlucHV0IGZvciB0aGlzIG1vZHVsZS4gVXNlZCBpbiB7QGxpbmsgTm9kZU1hdGVyaWFsfS5cclxuICpcclxuICogQGF1Z21lbnRzIExpZ2h0aW5nTm9kZVxyXG4gKi9cclxuY2xhc3MgSXJyYWRpYW5jZU5vZGUgZXh0ZW5kcyBMaWdodGluZ05vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdJcnJhZGlhbmNlTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBpcnJhZGlhbmNlIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGU8dmVjMz59IG5vZGUgLSBBIG5vZGUgY29udHJpYnV0aW5nIGlycmFkaWFuY2UuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5vZGUgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgbm9kZSBjb250cmlidXRpbmcgaXJyYWRpYW5jZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZTx2ZWMzPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub2RlID0gbm9kZTtcclxuXHJcblx0fVxyXG5cclxuXHRzZXR1cCggYnVpbGRlciApIHtcclxuXHJcblx0XHRidWlsZGVyLmNvbnRleHQuaXJyYWRpYW5jZS5hZGRBc3NpZ24oIHRoaXMubm9kZSApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBJcnJhZGlhbmNlTm9kZTtcclxuIiwiaW1wb3J0IE5vZGUgZnJvbSAnLi4vY29yZS9Ob2RlLmpzJztcclxuaW1wb3J0IHsgTm9kZVVwZGF0ZVR5cGUgfSBmcm9tICcuLi9jb3JlL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IHVuaWZvcm0gfSBmcm9tICcuLi9jb3JlL1VuaWZvcm1Ob2RlLmpzJztcclxuaW1wb3J0IHsgRm4sIG5vZGVJbW11dGFibGUsIHZlYzIgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcblxyXG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IyLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yNCB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yNC5qcyc7XHJcblxyXG5sZXQgc2NyZWVuU2l6ZVZlYywgdmlld3BvcnRWZWM7XHJcblxyXG4vKipcclxuICogVGhpcyBub2RlIHByb3ZpZGVzIGEgY29sbGVjdGlvbiBvZiBzY3JlZW4gcmVsYXRlZCBtZXRyaWNzLlxyXG4gKiBEZXBlbmRpbmcgb24ge0BsaW5rIFNjcmVlbk5vZGUjc2NvcGV9LCB0aGUgbm9kZXMgY2FuIHJlcHJlc2VudFxyXG4gKiByZXNvbHV0aW9uIG9yIHZpZXdwb3J0IGRhdGEgYXMgd2VsbCBhcyBmcmFnbWVudCBvciB1diBjb29yZGluYXRlcy5cclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVcclxuICovXHJcbmNsYXNzIFNjcmVlbk5vZGUgZXh0ZW5kcyBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnU2NyZWVuTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBzY3JlZW4gbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7KCdjb29yZGluYXRlJ3wndmlld3BvcnQnfCdzaXplJ3wndXYnKX0gc2NvcGUgLSBUaGUgbm9kZSdzIHNjb3BlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBzY29wZSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG5vZGUgcmVwcmVzZW50cyBkaWZmZXJlbnQgbWV0cmljIGRlcGVuZGluZyBvbiB3aGljaCBzY29wZSBpcyBzZWxlY3RlZC5cclxuXHRcdCAqXHJcblx0XHQgKiAtIGBTY3JlZW5Ob2RlLkNPT1JESU5BVEVgOiBXaW5kb3ctcmVsYXRpdmUgY29vcmRpbmF0ZXMgb2YgdGhlIGN1cnJlbnQgZnJhZ21lbnQgYWNjb3JkaW5nIHRvIFdlYkdQVSBzdGFuZGFyZHMuXHJcblx0XHQgKiAtIGBTY3JlZW5Ob2RlLlZJRVdQT1JUYDogVGhlIGN1cnJlbnQgdmlld3BvcnQgZGVmaW5lZCBhcyBhIGZvdXItZGltZW5zaW9uYWwgdmVjdG9yLlxyXG5cdFx0ICogLSBgU2NyZWVuTm9kZS5TSVpFYDogVGhlIGRpbWVuc2lvbnMgb2YgdGhlIGN1cnJlbnQgYm91bmQgZnJhbWVidWZmZXIuXHJcblx0XHQgKiAtIGBTY3JlZW5Ob2RlLlVWYDogTm9ybWFsaXplZCBjb29yZGluYXRlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KCdjb29yZGluYXRlJ3wndmlld3BvcnQnfCdzaXplJ3wndXYnKX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zY29wZSA9IHNjb3BlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1ZpZXdwb3J0Tm9kZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgaXMgb3ZlcndyaXR0ZW4gc2luY2UgdGhlIG5vZGUgdHlwZSBkZXBlbmRzIG9uIHRoZSBzZWxlY3RlZCBzY29wZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4geygndmVjMid8J3ZlYzQnKX0gVGhlIG5vZGUgdHlwZS5cclxuXHQgKi9cclxuXHRnZXROb2RlVHlwZSgpIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuc2NvcGUgPT09IFNjcmVlbk5vZGUuVklFV1BPUlQgKSByZXR1cm4gJ3ZlYzQnO1xyXG5cdFx0ZWxzZSByZXR1cm4gJ3ZlYzInO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGlzIG92ZXJ3cml0dGVuIHNpbmNlIHRoZSBub2RlJ3MgdXBkYXRlIHR5cGUgZGVwZW5kcyBvbiB0aGUgc2VsZWN0ZWQgc2NvcGUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtOb2RlVXBkYXRlVHlwZX0gVGhlIHVwZGF0ZSB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldFVwZGF0ZVR5cGUoKSB7XHJcblxyXG5cdFx0bGV0IHVwZGF0ZVR5cGUgPSBOb2RlVXBkYXRlVHlwZS5OT05FO1xyXG5cclxuXHRcdGlmICggdGhpcy5zY29wZSA9PT0gU2NyZWVuTm9kZS5TSVpFIHx8IHRoaXMuc2NvcGUgPT09IFNjcmVlbk5vZGUuVklFV1BPUlQgKSB7XHJcblxyXG5cdFx0XHR1cGRhdGVUeXBlID0gTm9kZVVwZGF0ZVR5cGUuUkVOREVSO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnVwZGF0ZVR5cGUgPSB1cGRhdGVUeXBlO1xyXG5cclxuXHRcdHJldHVybiB1cGRhdGVUeXBlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIGBTY3JlZW5Ob2RlYCBpbXBsZW1lbnRzIHtAbGluayBOb2RlI3VwZGF0ZX0gdG8gcmV0cmlldmUgdmlld3BvcnQgYW5kIHNpemUgaW5mb3JtYXRpb25cclxuXHQgKiBmcm9tIHRoZSBjdXJyZW50IHJlbmRlcmVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlRnJhbWV9IGZyYW1lIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgbm9kZSBmcmFtZS5cclxuXHQgKi9cclxuXHR1cGRhdGUoIHsgcmVuZGVyZXIgfSApIHtcclxuXHJcblx0XHRjb25zdCByZW5kZXJUYXJnZXQgPSByZW5kZXJlci5nZXRSZW5kZXJUYXJnZXQoKTtcclxuXHJcblx0XHRpZiAoIHRoaXMuc2NvcGUgPT09IFNjcmVlbk5vZGUuVklFV1BPUlQgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHJlbmRlclRhcmdldCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0dmlld3BvcnRWZWMuY29weSggcmVuZGVyVGFyZ2V0LnZpZXdwb3J0ICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRyZW5kZXJlci5nZXRWaWV3cG9ydCggdmlld3BvcnRWZWMgKTtcclxuXHJcblx0XHRcdFx0dmlld3BvcnRWZWMubXVsdGlwbHlTY2FsYXIoIHJlbmRlcmVyLmdldFBpeGVsUmF0aW8oKSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRpZiAoIHJlbmRlclRhcmdldCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0c2NyZWVuU2l6ZVZlYy53aWR0aCA9IHJlbmRlclRhcmdldC53aWR0aDtcclxuXHRcdFx0XHRzY3JlZW5TaXplVmVjLmhlaWdodCA9IHJlbmRlclRhcmdldC5oZWlnaHQ7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRyZW5kZXJlci5nZXREcmF3aW5nQnVmZmVyU2l6ZSggc2NyZWVuU2l6ZVZlYyApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRzZXR1cCggLypidWlsZGVyKi8gKSB7XHJcblxyXG5cdFx0Y29uc3Qgc2NvcGUgPSB0aGlzLnNjb3BlO1xyXG5cclxuXHRcdGxldCBvdXRwdXQgPSBudWxsO1xyXG5cclxuXHRcdGlmICggc2NvcGUgPT09IFNjcmVlbk5vZGUuU0laRSApIHtcclxuXHJcblx0XHRcdG91dHB1dCA9IHVuaWZvcm0oIHNjcmVlblNpemVWZWMgfHwgKCBzY3JlZW5TaXplVmVjID0gbmV3IFZlY3RvcjIoKSApICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggc2NvcGUgPT09IFNjcmVlbk5vZGUuVklFV1BPUlQgKSB7XHJcblxyXG5cdFx0XHRvdXRwdXQgPSB1bmlmb3JtKCB2aWV3cG9ydFZlYyB8fCAoIHZpZXdwb3J0VmVjID0gbmV3IFZlY3RvcjQoKSApICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdG91dHB1dCA9IHZlYzIoIHNjcmVlbkNvb3JkaW5hdGUuZGl2KCBzY3JlZW5TaXplICkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG91dHB1dDtcclxuXHJcblx0fVxyXG5cclxuXHRnZW5lcmF0ZSggYnVpbGRlciApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuc2NvcGUgPT09IFNjcmVlbk5vZGUuQ09PUkRJTkFURSApIHtcclxuXHJcblx0XHRcdGxldCBjb29yZCA9IGJ1aWxkZXIuZ2V0RnJhZ0Nvb3JkKCk7XHJcblxyXG5cdFx0XHRpZiAoIGJ1aWxkZXIuaXNGbGlwWSgpICkge1xyXG5cclxuXHRcdFx0XHQvLyBmb2xsb3cgd2ViZ3B1IHN0YW5kYXJkc1xyXG5cclxuXHRcdFx0XHRjb25zdCBzaXplID0gYnVpbGRlci5nZXROb2RlUHJvcGVydGllcyggc2NyZWVuU2l6ZSApLm91dHB1dE5vZGUuYnVpbGQoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRcdFx0Y29vcmQgPSBgJHsgYnVpbGRlci5nZXRUeXBlKCAndmVjMicgKSB9KCAkeyBjb29yZCB9LngsICR7IHNpemUgfS55IC0gJHsgY29vcmQgfS55IClgO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIGNvb3JkO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gc3VwZXIuZ2VuZXJhdGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuU2NyZWVuTm9kZS5DT09SRElOQVRFID0gJ2Nvb3JkaW5hdGUnO1xyXG5TY3JlZW5Ob2RlLlZJRVdQT1JUID0gJ3ZpZXdwb3J0JztcclxuU2NyZWVuTm9kZS5TSVpFID0gJ3NpemUnO1xyXG5TY3JlZW5Ob2RlLlVWID0gJ3V2JztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IFNjcmVlbk5vZGU7XHJcblxyXG4vLyBTY3JlZW5cclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyBub3JtYWxpemVkIHNjcmVlbiBjb29yZGluYXRlcywgdW5pdGxlc3MgaW4gYFswLCAxXWAuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1NjcmVlbk5vZGU8dmVjMj59XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgc2NyZWVuVVYgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIFNjcmVlbk5vZGUsIFNjcmVlbk5vZGUuVVYgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgc2NyZWVuIHJlc29sdXRpb24gaW4gcGh5c2ljYWwgcGl4ZWwgdW5pdHMuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1NjcmVlbk5vZGU8dmVjMj59XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgc2NyZWVuU2l6ZSA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggU2NyZWVuTm9kZSwgU2NyZWVuTm9kZS5TSVpFICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGN1cnJlbnQgYHhgL2B5YCBwaXhlbCBwb3NpdGlvbiBvbiB0aGUgc2NyZWVuIGluIHBoeXNpY2FsIHBpeGVsIHVuaXRzLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtTY3JlZW5Ob2RlPHZlYzI+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHNjcmVlbkNvb3JkaW5hdGUgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIFNjcmVlbk5vZGUsIFNjcmVlbk5vZGUuQ09PUkRJTkFURSApO1xyXG5cclxuLy8gVmlld3BvcnRcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgdmlld3BvcnQgcmVjdGFuZ2xlIGFzIGB4YCwgYHlgLCBgd2lkdGhgIGFuZCBgaGVpZ2h0YCBpbiBwaHlzaWNhbCBwaXhlbCB1bml0cy5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7U2NyZWVuTm9kZTx2ZWM0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCB2aWV3cG9ydCA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggU2NyZWVuTm9kZSwgU2NyZWVuTm9kZS5WSUVXUE9SVCApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSB2aWV3cG9ydCByZXNvbHV0aW9uIGluIHBoeXNpY2FsIHBpeGVsIHVuaXRzLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtTY3JlZW5Ob2RlPHZlYzI+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHZpZXdwb3J0U2l6ZSA9IHZpZXdwb3J0Lnp3O1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBjdXJyZW50IGB4YC9geWAgcGl4ZWwgcG9zaXRpb24gb24gdGhlIHZpZXdwb3J0IGluIHBoeXNpY2FsIHBpeGVsIHVuaXRzLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtTY3JlZW5Ob2RlPHZlYzI+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHZpZXdwb3J0Q29vcmRpbmF0ZSA9IC8qQF9fUFVSRV9fKi8gc2NyZWVuQ29vcmRpbmF0ZS5zdWIoIHZpZXdwb3J0Lnh5ICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgbm9ybWFsaXplZCB2aWV3cG9ydCBjb29yZGluYXRlcywgdW5pdGxlc3MgaW4gYFswLCAxXWAuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1NjcmVlbk5vZGU8dmVjMj59XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgdmlld3BvcnRVViA9IC8qQF9fUFVSRV9fKi8gdmlld3BvcnRDb29yZGluYXRlLmRpdiggdmlld3BvcnRTaXplICk7XHJcblxyXG4vLyBEZXByZWNhdGVkXHJcblxyXG4vKipcclxuICogQGRlcHJlY2F0ZWQgc2luY2UgcjE2OS4gVXNlIHtAbGluayBzY3JlZW5TaXplfSBpbnN0ZWFkLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHZpZXdwb3J0UmVzb2x1dGlvbiA9IC8qQF9fUFVSRV9fKi8gKCBGbiggKCkgPT4geyAvLyBAZGVwcmVjYXRlZCwgcjE2OVxyXG5cclxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5UU0w6IFwidmlld3BvcnRSZXNvbHV0aW9uXCIgaXMgZGVwcmVjYXRlZC4gVXNlIFwic2NyZWVuU2l6ZVwiIGluc3RlYWQuJyApO1xyXG5cclxuXHRyZXR1cm4gc2NyZWVuU2l6ZTtcclxuXHJcbn0sICd2ZWMyJyApLm9uY2UoKSApKCk7XHJcblxyXG4vKipcclxuICogQHRzbFxyXG4gKiBAZGVwcmVjYXRlZCBzaW5jZSByMTY4LiBVc2Uge0BsaW5rIHNjcmVlblVWfSBpbnN0ZWFkLlxyXG4gKiBAdHlwZSB7Tm9kZTx2ZWMyPn1cclxuICovXHJcbmV4cG9ydCBjb25zdCB2aWV3cG9ydFRvcExlZnQgPSAvKkBfX1BVUkVfXyovICggRm4oICgpID0+IHsgLy8gQGRlcHJlY2F0ZWQsIHIxNjhcclxuXHJcblx0Y29uc29sZS53YXJuKCAnVEhSRUUuVFNMOiBcInZpZXdwb3J0VG9wTGVmdFwiIGlzIGRlcHJlY2F0ZWQuIFVzZSBcInNjcmVlblVWXCIgaW5zdGVhZC4nICk7XHJcblxyXG5cdHJldHVybiBzY3JlZW5VVjtcclxuXHJcbn0sICd2ZWMyJyApLm9uY2UoKSApKCk7XHJcblxyXG4vKipcclxuICogQHRzbFxyXG4gKiBAZGVwcmVjYXRlZCBzaW5jZSByMTY4LiBVc2UgYHNjcmVlblVWLmZsaXBZKClgIGluc3RlYWQuXHJcbiAqIEB0eXBlIHtOb2RlPHZlYzI+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHZpZXdwb3J0Qm90dG9tTGVmdCA9IC8qQF9fUFVSRV9fKi8gKCBGbiggKCkgPT4geyAvLyBAZGVwcmVjYXRlZCwgcjE2OFxyXG5cclxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5UU0w6IFwidmlld3BvcnRCb3R0b21MZWZ0XCIgaXMgZGVwcmVjYXRlZC4gVXNlIFwic2NyZWVuVVYuZmxpcFkoKVwiIGluc3RlYWQuJyApO1xyXG5cclxuXHRyZXR1cm4gc2NyZWVuVVYuZmxpcFkoKTtcclxuXHJcbn0sICd2ZWMyJyApLm9uY2UoKSApKCk7XHJcbiIsImltcG9ydCBUZXh0dXJlTm9kZSBmcm9tICcuLi9hY2Nlc3NvcnMvVGV4dHVyZU5vZGUuanMnO1xyXG5pbXBvcnQgeyBOb2RlVXBkYXRlVHlwZSB9IGZyb20gJy4uL2NvcmUvY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgbm9kZVByb3h5IH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5pbXBvcnQgeyBzY3JlZW5VViB9IGZyb20gJy4vU2NyZWVuTm9kZS5qcyc7XHJcblxyXG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IyLmpzJztcclxuaW1wb3J0IHsgRnJhbWVidWZmZXJUZXh0dXJlIH0gZnJvbSAnLi4vLi4vdGV4dHVyZXMvRnJhbWVidWZmZXJUZXh0dXJlLmpzJztcclxuaW1wb3J0IHsgTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzLmpzJztcclxuXHJcbmNvbnN0IF9zaXplID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMigpO1xyXG5cclxuLyoqXHJcbiAqIEEgc3BlY2lhbCB0eXBlIG9mIHRleHR1cmUgbm9kZSB3aGljaCByZXByZXNlbnRzIHRoZSBkYXRhIG9mIHRoZSBjdXJyZW50IHZpZXdwb3J0XHJcbiAqIGFzIGEgdGV4dHVyZS4gVGhlIG1vZHVsZSBleHRyYWN0cyBkYXRhIGZyb20gdGhlIGN1cnJlbnQgYm91bmQgZnJhbWVidWZmZXIgd2l0aFxyXG4gKiBhIGNvcHkgb3BlcmF0aW9uIHNvIG5vIGV4dHJhIHJlbmRlciBwYXNzIGlzIHJlcXVpcmVkIHRvIHByb2R1Y2UgdGhlIHRleHR1cmUgZGF0YVxyXG4gKiAod2hpY2ggaXMgZ29vZCBmb3IgcGVyZm9ybWFuY2UpLiBgVmlld3BvcnRUZXh0dXJlTm9kZWAgY2FuIGJlIHVzZWQgYXMgYW4gaW5wdXQgZm9yIGFcclxuICogdmFyaWV0eSBvZiBlZmZlY3RzIGxpa2UgcmVmcmFjdGl2ZSBvciB0cmFuc21pc3NpdmUgbWF0ZXJpYWxzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgVGV4dHVyZU5vZGVcclxuICovXHJcbmNsYXNzIFZpZXdwb3J0VGV4dHVyZU5vZGUgZXh0ZW5kcyBUZXh0dXJlTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ1ZpZXdwb3J0VGV4dHVyZU5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgdmlld3BvcnQgdGV4dHVyZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlfSBbdXZOb2RlPXNjcmVlblVWXSAtIFRoZSB1diBub2RlLlxyXG5cdCAqIEBwYXJhbSB7P05vZGV9IFtsZXZlbE5vZGU9bnVsbF0gLSBUaGUgbGV2ZWwgbm9kZS5cclxuXHQgKiBAcGFyYW0gez9UZXh0dXJlfSBbZnJhbWVidWZmZXJUZXh0dXJlPW51bGxdIC0gQSBmcmFtZWJ1ZmZlciB0ZXh0dXJlIGhvbGRpbmcgdGhlIHZpZXdwb3J0IGRhdGEuIElmIG5vdCBwcm92aWRlZCwgYSBmcmFtZWJ1ZmZlciB0ZXh0dXJlIGlzIGNyZWF0ZWQgYXV0b21hdGljYWxseS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggdXZOb2RlID0gc2NyZWVuVVYsIGxldmVsTm9kZSA9IG51bGwsIGZyYW1lYnVmZmVyVGV4dHVyZSA9IG51bGwgKSB7XHJcblxyXG5cdFx0aWYgKCBmcmFtZWJ1ZmZlclRleHR1cmUgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRmcmFtZWJ1ZmZlclRleHR1cmUgPSBuZXcgRnJhbWVidWZmZXJUZXh0dXJlKCk7XHJcblx0XHRcdGZyYW1lYnVmZmVyVGV4dHVyZS5taW5GaWx0ZXIgPSBMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXI7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHN1cGVyKCBmcmFtZWJ1ZmZlclRleHR1cmUsIHV2Tm9kZSwgbGV2ZWxOb2RlICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRvIGdlbmVyYXRlIG1pcG1hcHMgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNPdXRwdXRUZXh0dXJlTm9kZSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYHVwZGF0ZUJlZm9yZVR5cGVgIGlzIHNldCB0byBgTm9kZVVwZGF0ZVR5cGUuRlJBTUVgIHNpbmNlIHRoZSBub2RlIHJlbmRlcnMgdGhlXHJcblx0XHQgKiBzY2VuZSBvbmNlIHBlciBmcmFtZSBpbiBpdHMge0BsaW5rIFZpZXdwb3J0VGV4dHVyZU5vZGUjdXBkYXRlQmVmb3JlfSBtZXRob2QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqIEBkZWZhdWx0ICdmcmFtZSdcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51cGRhdGVCZWZvcmVUeXBlID0gTm9kZVVwZGF0ZVR5cGUuRlJBTUU7XHJcblxyXG5cdH1cclxuXHJcblx0dXBkYXRlQmVmb3JlKCBmcmFtZSApIHtcclxuXHJcblx0XHRjb25zdCByZW5kZXJlciA9IGZyYW1lLnJlbmRlcmVyO1xyXG5cdFx0cmVuZGVyZXIuZ2V0RHJhd2luZ0J1ZmZlclNpemUoIF9zaXplICk7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCBmcmFtZWJ1ZmZlclRleHR1cmUgPSB0aGlzLnZhbHVlO1xyXG5cclxuXHRcdGlmICggZnJhbWVidWZmZXJUZXh0dXJlLmltYWdlLndpZHRoICE9PSBfc2l6ZS53aWR0aCB8fCBmcmFtZWJ1ZmZlclRleHR1cmUuaW1hZ2UuaGVpZ2h0ICE9PSBfc2l6ZS5oZWlnaHQgKSB7XHJcblxyXG5cdFx0XHRmcmFtZWJ1ZmZlclRleHR1cmUuaW1hZ2Uud2lkdGggPSBfc2l6ZS53aWR0aDtcclxuXHRcdFx0ZnJhbWVidWZmZXJUZXh0dXJlLmltYWdlLmhlaWdodCA9IF9zaXplLmhlaWdodDtcclxuXHRcdFx0ZnJhbWVidWZmZXJUZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCBjdXJyZW50R2VuZXJhdGVNaXBtYXBzID0gZnJhbWVidWZmZXJUZXh0dXJlLmdlbmVyYXRlTWlwbWFwcztcclxuXHRcdGZyYW1lYnVmZmVyVGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSB0aGlzLmdlbmVyYXRlTWlwbWFwcztcclxuXHJcblx0XHRyZW5kZXJlci5jb3B5RnJhbWVidWZmZXJUb1RleHR1cmUoIGZyYW1lYnVmZmVyVGV4dHVyZSApO1xyXG5cclxuXHRcdGZyYW1lYnVmZmVyVGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBjdXJyZW50R2VuZXJhdGVNaXBtYXBzO1xyXG5cclxuXHR9XHJcblxyXG5cdGNsb25lKCkge1xyXG5cclxuXHRcdGNvbnN0IHZpZXdwb3J0VGV4dHVyZU5vZGUgPSBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy51dk5vZGUsIHRoaXMubGV2ZWxOb2RlLCB0aGlzLnZhbHVlICk7XHJcblx0XHR2aWV3cG9ydFRleHR1cmVOb2RlLmdlbmVyYXRlTWlwbWFwcyA9IHRoaXMuZ2VuZXJhdGVNaXBtYXBzO1xyXG5cclxuXHRcdHJldHVybiB2aWV3cG9ydFRleHR1cmVOb2RlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBWaWV3cG9ydFRleHR1cmVOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSB2aWV3cG9ydCB0ZXh0dXJlIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7P05vZGV9IFt1dk5vZGU9c2NyZWVuVVZdIC0gVGhlIHV2IG5vZGUuXHJcbiAqIEBwYXJhbSB7P05vZGV9IFtsZXZlbE5vZGU9bnVsbF0gLSBUaGUgbGV2ZWwgbm9kZS5cclxuICogQHBhcmFtIHs/VGV4dHVyZX0gW2ZyYW1lYnVmZmVyVGV4dHVyZT1udWxsXSAtIEEgZnJhbWVidWZmZXIgdGV4dHVyZSBob2xkaW5nIHRoZSB2aWV3cG9ydCBkYXRhLiBJZiBub3QgcHJvdmlkZWQsIGEgZnJhbWVidWZmZXIgdGV4dHVyZSBpcyBjcmVhdGVkIGF1dG9tYXRpY2FsbHkuXHJcbiAqIEByZXR1cm5zIHtWaWV3cG9ydFRleHR1cmVOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHZpZXdwb3J0VGV4dHVyZSA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBWaWV3cG9ydFRleHR1cmVOb2RlICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAwLCAzICk7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIHZpZXdwb3J0IHRleHR1cmUgbm9kZSB3aXRoIGVuYWJsZWQgbWlwbWFwIGdlbmVyYXRpb24uXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7P05vZGV9IFt1dk5vZGU9c2NyZWVuVVZdIC0gVGhlIHV2IG5vZGUuXHJcbiAqIEBwYXJhbSB7P05vZGV9IFtsZXZlbE5vZGU9bnVsbF0gLSBUaGUgbGV2ZWwgbm9kZS5cclxuICogQHBhcmFtIHs/VGV4dHVyZX0gW2ZyYW1lYnVmZmVyVGV4dHVyZT1udWxsXSAtIEEgZnJhbWVidWZmZXIgdGV4dHVyZSBob2xkaW5nIHRoZSB2aWV3cG9ydCBkYXRhLiBJZiBub3QgcHJvdmlkZWQsIGEgZnJhbWVidWZmZXIgdGV4dHVyZSBpcyBjcmVhdGVkIGF1dG9tYXRpY2FsbHkuXHJcbiAqIEByZXR1cm5zIHtWaWV3cG9ydFRleHR1cmVOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHZpZXdwb3J0TWlwVGV4dHVyZSA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBWaWV3cG9ydFRleHR1cmVOb2RlLCBudWxsLCBudWxsLCB7IGdlbmVyYXRlTWlwbWFwczogdHJ1ZSB9ICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAwLCAzICk7XHJcbiIsImltcG9ydCBWaWV3cG9ydFRleHR1cmVOb2RlIGZyb20gJy4vVmlld3BvcnRUZXh0dXJlTm9kZS5qcyc7XHJcbmltcG9ydCB7IG5vZGVQcm94eSB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuaW1wb3J0IHsgc2NyZWVuVVYgfSBmcm9tICcuL1NjcmVlbk5vZGUuanMnO1xyXG5cclxuaW1wb3J0IHsgRGVwdGhUZXh0dXJlIH0gZnJvbSAnLi4vLi4vdGV4dHVyZXMvRGVwdGhUZXh0dXJlLmpzJztcclxuXHJcbmxldCBzaGFyZWREZXB0aGJ1ZmZlciA9IG51bGw7XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyB0aGUgZGVwdGggb2YgdGhlIGN1cnJlbnQgdmlld3BvcnQgYXMgYSB0ZXh0dXJlLiBUaGlzIG1vZHVsZVxyXG4gKiBjYW4gYmUgdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIHZpZXdwb3J0IHRleHR1cmUgdG8gYWNoaWV2ZSBlZmZlY3RzXHJcbiAqIHRoYXQgcmVxdWlyZSBkZXB0aCBldmFsdWF0aW9uLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgVmlld3BvcnRUZXh0dXJlTm9kZVxyXG4gKi9cclxuY2xhc3MgVmlld3BvcnREZXB0aFRleHR1cmVOb2RlIGV4dGVuZHMgVmlld3BvcnRUZXh0dXJlTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ1ZpZXdwb3J0RGVwdGhUZXh0dXJlTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB2aWV3cG9ydCBkZXB0aCB0ZXh0dXJlIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV9IFt1dk5vZGU9c2NyZWVuVVZdIC0gVGhlIHV2IG5vZGUuXHJcblx0ICogQHBhcmFtIHs/Tm9kZX0gW2xldmVsTm9kZT1udWxsXSAtIFRoZSBsZXZlbCBub2RlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCB1dk5vZGUgPSBzY3JlZW5VViwgbGV2ZWxOb2RlID0gbnVsbCApIHtcclxuXHJcblx0XHRpZiAoIHNoYXJlZERlcHRoYnVmZmVyID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0c2hhcmVkRGVwdGhidWZmZXIgPSBuZXcgRGVwdGhUZXh0dXJlKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHN1cGVyKCB1dk5vZGUsIGxldmVsTm9kZSwgc2hhcmVkRGVwdGhidWZmZXIgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgVmlld3BvcnREZXB0aFRleHR1cmVOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgYSB2aWV3cG9ydCBkZXB0aCB0ZXh0dXJlIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7P05vZGV9IFt1dk5vZGU9c2NyZWVuVVZdIC0gVGhlIHV2IG5vZGUuXHJcbiAqIEBwYXJhbSB7P05vZGV9IFtsZXZlbE5vZGU9bnVsbF0gLSBUaGUgbGV2ZWwgbm9kZS5cclxuICogQHJldHVybnMge1ZpZXdwb3J0RGVwdGhUZXh0dXJlTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCB2aWV3cG9ydERlcHRoVGV4dHVyZSA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBWaWV3cG9ydERlcHRoVGV4dHVyZU5vZGUgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDAsIDIgKTtcclxuIiwiaW1wb3J0IE5vZGUgZnJvbSAnLi4vY29yZS9Ob2RlLmpzJztcclxuaW1wb3J0IHsgZmxvYXQsIGxvZywgbG9nMiwgbm9kZUltbXV0YWJsZSwgbm9kZVByb3h5IH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5pbXBvcnQgeyBjYW1lcmFOZWFyLCBjYW1lcmFGYXIgfSBmcm9tICcuLi9hY2Nlc3NvcnMvQ2FtZXJhLmpzJztcclxuaW1wb3J0IHsgcG9zaXRpb25WaWV3IH0gZnJvbSAnLi4vYWNjZXNzb3JzL1Bvc2l0aW9uLmpzJztcclxuaW1wb3J0IHsgdmlld3BvcnREZXB0aFRleHR1cmUgfSBmcm9tICcuL1ZpZXdwb3J0RGVwdGhUZXh0dXJlTm9kZS5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBub2RlIG9mZmVycyBhIGNvbGxlY3Rpb24gb2YgZmVhdHVyZXMgaW4gY29udGV4dCBvZiB0aGUgZGVwdGggbG9naWMgaW4gdGhlIGZyYWdtZW50IHNoYWRlci5cclxuICogRGVwZW5kaW5nIG9uIHtAbGluayBWaWV3cG9ydERlcHRoTm9kZSNzY29wZX0sIGl0IGNhbiBiZSB1c2VkIHRvIGRlZmluZSBhIGRlcHRoIHZhbHVlIGZvciB0aGUgY3VycmVudFxyXG4gKiBmcmFnbWVudCBvciBmb3IgZGVwdGggZXZhbHVhdGlvbiBwdXJwb3Nlcy5cclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVcclxuICovXHJcbmNsYXNzIFZpZXdwb3J0RGVwdGhOb2RlIGV4dGVuZHMgTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ1ZpZXdwb3J0RGVwdGhOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHZpZXdwb3J0IGRlcHRoIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geygnZGVwdGgnfCdkZXB0aEJhc2UnfCdsaW5lYXJEZXB0aCcpfSBzY29wZSAtIFRoZSBub2RlJ3Mgc2NvcGUuXHJcblx0ICogQHBhcmFtIHs/Tm9kZX0gW3ZhbHVlTm9kZT1udWxsXSAtIFRoZSB2YWx1ZSBub2RlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBzY29wZSwgdmFsdWVOb2RlID0gbnVsbCApIHtcclxuXHJcblx0XHRzdXBlciggJ2Zsb2F0JyApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG5vZGUgYmVoYXZlcyBkaWZmZXJlbnRseSBkZXBlbmRpbmcgb24gd2hpY2ggc2NvcGUgaXMgc2VsZWN0ZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogLSBgVmlld3BvcnREZXB0aE5vZGUuREVQVEhfQkFTRWA6IEFsbG93cyB0byBkZWZpbmUgYSB2YWx1ZSBmb3IgdGhlIGN1cnJlbnQgZnJhZ21lbnQncyBkZXB0aC5cclxuXHRcdCAqIC0gYFZpZXdwb3J0RGVwdGhOb2RlLkRFUFRIYDogUmVwcmVzZW50cyB0aGUgZGVwdGggdmFsdWUgZm9yIHRoZSBjdXJyZW50IGZyYWdtZW50IChgdmFsdWVOb2RlYCBpcyBpZ25vcmVkKS5cclxuXHRcdCAqIC0gYFZpZXdwb3J0RGVwdGhOb2RlLkxJTkVBUl9ERVBUSGA6IFJlcHJlc2VudHMgdGhlIGxpbmVhciAob3J0aG9ncmFwaGljKSBkZXB0aCB2YWx1ZSBvZiB0aGUgY3VycmVudCBmcmFnbWVudC5cclxuXHRcdCAqIElmIGEgYHZhbHVlTm9kZWAgaXMgc2V0LCB0aGUgc2NvcGUgY2FuIGJlIHVzZWQgdG8gY29udmVydCBwZXJzcGVjdGl2ZSBkZXB0aCBkYXRhIHRvIGxpbmVhciBkYXRhLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoJ2RlcHRoJ3wnZGVwdGhCYXNlJ3wnbGluZWFyRGVwdGgnKX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zY29wZSA9IHNjb3BlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQ2FuIGJlIHVzZWQgdG8gZGVmaW5lIGEgY3VzdG9tIGRlcHRoIHZhbHVlLlxyXG5cdFx0ICogVGhlIHByb3BlcnR5IGlzIGlnbm9yZWQgaW4gdGhlIGBWaWV3cG9ydERlcHRoTm9kZS5ERVBUSGAgc2NvcGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnZhbHVlTm9kZSA9IHZhbHVlTm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNWaWV3cG9ydERlcHRoTm9kZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0Z2VuZXJhdGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBzY29wZSB9ID0gdGhpcztcclxuXHJcblx0XHRpZiAoIHNjb3BlID09PSBWaWV3cG9ydERlcHRoTm9kZS5ERVBUSF9CQVNFICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIGJ1aWxkZXIuZ2V0RnJhZ0RlcHRoKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBzdXBlci5nZW5lcmF0ZSggYnVpbGRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdHNldHVwKCB7IGNhbWVyYSB9ICkge1xyXG5cclxuXHRcdGNvbnN0IHsgc2NvcGUgfSA9IHRoaXM7XHJcblx0XHRjb25zdCB2YWx1ZSA9IHRoaXMudmFsdWVOb2RlO1xyXG5cclxuXHRcdGxldCBub2RlID0gbnVsbDtcclxuXHJcblx0XHRpZiAoIHNjb3BlID09PSBWaWV3cG9ydERlcHRoTm9kZS5ERVBUSF9CQVNFICkge1xyXG5cclxuXHRcdFx0aWYgKCB2YWx1ZSAhPT0gbnVsbCApIHtcclxuXHJcbiBcdFx0XHRcdG5vZGUgPSBkZXB0aEJhc2UoKS5hc3NpZ24oIHZhbHVlICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmICggc2NvcGUgPT09IFZpZXdwb3J0RGVwdGhOb2RlLkRFUFRIICkge1xyXG5cclxuXHRcdFx0aWYgKCBjYW1lcmEuaXNQZXJzcGVjdGl2ZUNhbWVyYSApIHtcclxuXHJcblx0XHRcdFx0bm9kZSA9IHZpZXdaVG9QZXJzcGVjdGl2ZURlcHRoKCBwb3NpdGlvblZpZXcueiwgY2FtZXJhTmVhciwgY2FtZXJhRmFyICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRub2RlID0gdmlld1pUb09ydGhvZ3JhcGhpY0RlcHRoKCBwb3NpdGlvblZpZXcueiwgY2FtZXJhTmVhciwgY2FtZXJhRmFyICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmICggc2NvcGUgPT09IFZpZXdwb3J0RGVwdGhOb2RlLkxJTkVBUl9ERVBUSCApIHtcclxuXHJcblx0XHRcdGlmICggdmFsdWUgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggY2FtZXJhLmlzUGVyc3BlY3RpdmVDYW1lcmEgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3Qgdmlld1ogPSBwZXJzcGVjdGl2ZURlcHRoVG9WaWV3WiggdmFsdWUsIGNhbWVyYU5lYXIsIGNhbWVyYUZhciApO1xyXG5cclxuXHRcdFx0XHRcdG5vZGUgPSB2aWV3WlRvT3J0aG9ncmFwaGljRGVwdGgoIHZpZXdaLCBjYW1lcmFOZWFyLCBjYW1lcmFGYXIgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRub2RlID0gdmFsdWU7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdG5vZGUgPSB2aWV3WlRvT3J0aG9ncmFwaGljRGVwdGgoIHBvc2l0aW9uVmlldy56LCBjYW1lcmFOZWFyLCBjYW1lcmFGYXIgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG5vZGU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblZpZXdwb3J0RGVwdGhOb2RlLkRFUFRIX0JBU0UgPSAnZGVwdGhCYXNlJztcclxuVmlld3BvcnREZXB0aE5vZGUuREVQVEggPSAnZGVwdGgnO1xyXG5WaWV3cG9ydERlcHRoTm9kZS5MSU5FQVJfREVQVEggPSAnbGluZWFyRGVwdGgnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgVmlld3BvcnREZXB0aE5vZGU7XHJcblxyXG4vLyBOT1RFOiB2aWV3WiwgdGhlIHotY29vcmRpbmF0ZSBpbiBjYW1lcmEgc3BhY2UsIGlzIG5lZ2F0aXZlIGZvciBwb2ludHMgaW4gZnJvbnQgb2YgdGhlIGNhbWVyYVxyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY29udmVydGluZyBhIHZpZXdaIHZhbHVlIHRvIGFuIG9ydGhvZ3JhcGhpYyBkZXB0aCB2YWx1ZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlPGZsb2F0Pn0gdmlld1ogLSBUaGUgdmlld1ogbm9kZS5cclxuICogQHBhcmFtIHtOb2RlPGZsb2F0Pn0gbmVhciAtIFRoZSBjYW1lcmEncyBuZWFyIHZhbHVlLlxyXG4gKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSBmYXIgLSBUaGUgY2FtZXJhJ3MgZmFyIHZhbHVlLlxyXG4gKiBAcmV0dXJucyB7Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgdmlld1pUb09ydGhvZ3JhcGhpY0RlcHRoID0gKCB2aWV3WiwgbmVhciwgZmFyICkgPT4gdmlld1ouYWRkKCBuZWFyICkuZGl2KCBuZWFyLnN1YiggZmFyICkgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNvbnZlcnRpbmcgYW4gb3J0aG9ncmFwaGljIGRlcHRoIHZhbHVlIHRvIGEgdmlld1ogdmFsdWUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTxmbG9hdD59IGRlcHRoIC0gVGhlIG9ydGhvZ3JhcGhpYyBkZXB0aC5cclxuICogQHBhcmFtIHtOb2RlPGZsb2F0Pn0gbmVhciAtIFRoZSBjYW1lcmEncyBuZWFyIHZhbHVlLlxyXG4gKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSBmYXIgLSBUaGUgY2FtZXJhJ3MgZmFyIHZhbHVlLlxyXG4gKiBAcmV0dXJucyB7Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgb3J0aG9ncmFwaGljRGVwdGhUb1ZpZXdaID0gKCBkZXB0aCwgbmVhciwgZmFyICkgPT4gbmVhci5zdWIoIGZhciApLm11bCggZGVwdGggKS5zdWIoIG5lYXIgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNvbnZlcnRpbmcgYSB2aWV3WiB2YWx1ZSB0byBhIHBlcnNwZWN0aXZlIGRlcHRoIHZhbHVlLlxyXG4gKlxyXG4gKiBOb3RlOiB7bGluayBodHRwczovL3R3aXR0ZXIuY29tL2dvbm5hdmlzL3N0YXR1cy8xMzc3MTgzNzg2OTQ5OTU5NjgyfS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlPGZsb2F0Pn0gdmlld1ogLSBUaGUgdmlld1ogbm9kZS5cclxuICogQHBhcmFtIHtOb2RlPGZsb2F0Pn0gbmVhciAtIFRoZSBjYW1lcmEncyBuZWFyIHZhbHVlLlxyXG4gKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSBmYXIgLSBUaGUgY2FtZXJhJ3MgZmFyIHZhbHVlLlxyXG4gKiBAcmV0dXJucyB7Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgdmlld1pUb1BlcnNwZWN0aXZlRGVwdGggPSAoIHZpZXdaLCBuZWFyLCBmYXIgKSA9PiBuZWFyLmFkZCggdmlld1ogKS5tdWwoIGZhciApLmRpdiggZmFyLnN1YiggbmVhciApLm11bCggdmlld1ogKSApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY29udmVydGluZyBhIHBlcnNwZWN0aXZlIGRlcHRoIHZhbHVlIHRvIGEgdmlld1ogdmFsdWUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTxmbG9hdD59IGRlcHRoIC0gVGhlIHBlcnNwZWN0aXZlIGRlcHRoLlxyXG4gKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSBuZWFyIC0gVGhlIGNhbWVyYSdzIG5lYXIgdmFsdWUuXHJcbiAqIEBwYXJhbSB7Tm9kZTxmbG9hdD59IGZhciAtIFRoZSBjYW1lcmEncyBmYXIgdmFsdWUuXHJcbiAqIEByZXR1cm5zIHtOb2RlPGZsb2F0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBwZXJzcGVjdGl2ZURlcHRoVG9WaWV3WiA9ICggZGVwdGgsIG5lYXIsIGZhciApID0+IG5lYXIubXVsKCBmYXIgKS5kaXYoIGZhci5zdWIoIG5lYXIgKS5tdWwoIGRlcHRoICkuc3ViKCBmYXIgKSApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY29udmVydGluZyBhIHZpZXdaIHZhbHVlIHRvIGEgbG9nYXJpdGhtaWMgZGVwdGggdmFsdWUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTxmbG9hdD59IHZpZXdaIC0gVGhlIHZpZXdaIG5vZGUuXHJcbiAqIEBwYXJhbSB7Tm9kZTxmbG9hdD59IG5lYXIgLSBUaGUgY2FtZXJhJ3MgbmVhciB2YWx1ZS5cclxuICogQHBhcmFtIHtOb2RlPGZsb2F0Pn0gZmFyIC0gVGhlIGNhbWVyYSdzIGZhciB2YWx1ZS5cclxuICogQHJldHVybnMge05vZGU8ZmxvYXQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHZpZXdaVG9Mb2dhcml0aG1pY0RlcHRoID0gKCB2aWV3WiwgbmVhciwgZmFyICkgPT4ge1xyXG5cclxuXHQvLyBOT1RFOiB2aWV3WiBtdXN0IGJlIG5lZ2F0aXZlLS1zZWUgZXhwbGFuYXRpb24gYXQgdGhlIGVuZCBvZiB0aGlzIGNvbW1lbnQgYmxvY2suXHJcblx0Ly8gVGhlIGZpbmFsIGxvZ2FyaXRobWljIGRlcHRoIGZvcm11bGEgdXNlZCBoZXJlIGlzIGFkYXB0ZWQgZnJvbSBvbmUgZGVzY3JpYmVkIGluIGFuXHJcblx0Ly8gYXJ0aWNsZSBieSBUaGF0Y2hlciBVbHJpY2ggKHNlZSBodHRwOi8vdHVscmljaC5jb20vZ2Vla3N0dWZmL2xvZ19kZXB0aF9idWZmZXIudHh0KSxcclxuXHQvLyB3aGljaCB3YXMgYW4gaW1wcm92ZW1lbnQgdXBvbiBhbiBlYXJsaWVyIGZvcm11bGEgb25lIGRlc2NyaWJlZCBpbiBhblxyXG5cdC8vIE91dGVycmEgYXJ0aWNsZSAoaHR0cHM6Ly9vdXRlcnJhLmJsb2dzcG90LmNvbS8yMDA5LzA4L2xvZ2FyaXRobWljLXotYnVmZmVyLmh0bWwpLlxyXG5cdC8vIFVscmljaCdzIGZvcm11bGEgaXMgdGhlIGZvbGxvd2luZzpcclxuXHQvLyAgICAgeiA9IEsgKiBsb2coIHcgLyBjYW1lcmFOZWFyICkgLyBsb2coIGNhbWVyYUZhciAvIGNhbWVyYU5lYXIgKVxyXG5cdC8vICAgICB3aGVyZSBLID0gMl5rIC0gMSwgYW5kIGsgaXMgdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBkZXB0aCBidWZmZXIuXHJcblx0Ly8gVGhlIE91dGVycmEgdmFyaWFudCBpZ25vcmVkIHRoZSBjYW1lcmEgbmVhciBwbGFuZSAoaXQgYXNzdW1lZCBpdCB3YXMgMCkgYW5kIGluc3RlYWRcclxuXHQvLyBvcHRlZCBmb3IgYSBcIkMtY29uc3RhbnRcIiBmb3IgcmVzb2x1dGlvbiBhZGp1c3RtZW50IG9mIG9iamVjdHMgbmVhciB0aGUgY2FtZXJhLlxyXG5cdC8vIE91dGVycmEgc3RhdGVzOiBcIk5vdGljZSB0aGF0IHRoZSAnQycgdmFyaWFudCBkb2VzbuKAmXQgdXNlIGEgbmVhciBwbGFuZSBkaXN0YW5jZSwgaXQgaGFzIGl0XHJcblx0Ly8gc2V0IGF0IDBcIiAocXVvdGUgZnJvbSBodHRwczovL291dGVycmEuYmxvZ3Nwb3QuY29tLzIwMTIvMTEvbWF4aW1pemluZy1kZXB0aC1idWZmZXItcmFuZ2UtYW5kLmh0bWwpLlxyXG5cdC8vIFVscmljaCdzIHZhcmlhbnQgaGFzIHRoZSBiZW5lZml0IG9mIGNvbnN0YW50IHJlbGF0aXZlIHByZWNpc2lvbiBvdmVyIHRoZSB3aG9sZSBuZWFyLWZhciByYW5nZS5cclxuXHQvLyBJdCB3YXMgZGViYXRlZCBoZXJlIHdoZXRoZXIgT3V0ZXJyYSdzIFwiQy1jb25zdGFudFwiIG9yIFVscmljaCdzIFwibmVhciBwbGFuZVwiIHZhcmlhbnQgc2hvdWxkXHJcblx0Ly8gYmUgdXNlZCwgYW5kIHVsdGltYXRlbHkgVWxyaWNoJ3MgXCJuZWFyIHBsYW5lXCIgdmVyc2lvbiB3YXMgY2hvc2VuLlxyXG5cdC8vIE91dGVycmEgZXZlbnR1YWxseSBtYWRlIGFub3RoZXIgaW1wcm92ZW1lbnQgdG8gdGhlaXIgb3JpZ2luYWwgXCJDLWNvbnN0YW50XCIgdmFyaWFudCxcclxuXHQvLyBidXQgaXQgc3RpbGwgZG9lcyBub3QgaW5jb3Jwb3JhdGUgdGhlIGNhbWVyYSBuZWFyIHBsYW5lIChmb3IgdGhpcyB2ZXJzaW9uLFxyXG5cdC8vIHNlZSBodHRwczovL291dGVycmEuYmxvZ3Nwb3QuY29tLzIwMTMvMDcvbG9nYXJpdGhtaWMtZGVwdGgtYnVmZmVyLW9wdGltaXphdGlvbnMuaHRtbCkuXHJcblx0Ly8gSGVyZSB3ZSBtYWtlIDQgY2hhbmdlcyB0byBVbHJpY2gncyBmb3JtdWxhOlxyXG5cdC8vIDEuIENsYW1wIHRoZSBjYW1lcmEgbmVhciBwbGFuZSBzbyB3ZSBkb24ndCBkaXZpZGUgYnkgMC5cclxuXHQvLyAyLiBVc2UgbG9nMiBpbnN0ZWFkIG9mIGxvZyB0byBhdm9pZCBhbiBleHRyYSBtdWx0aXBseSAoc2hhZGVycyBpbXBsZW1lbnQgbG9nIHVzaW5nIGxvZzIpLlxyXG5cdC8vIDMuIEFzc3VtZSBLIGlzIDEgKEsgPSBtYXhpbXVtIHZhbHVlIGluIGRlcHRoIGJ1ZmZlcjsgc2VlIFVscmljaCdzIGZvcm11bGEgYWJvdmUpLlxyXG5cdC8vIDQuIFRvIG1haW50YWluIGNvbnNpc3RlbmN5IHdpdGggdGhlIGZ1bmN0aW9ucyBcInZpZXdaVG9PcnRob2dyYXBoaWNEZXB0aFwiIGFuZCBcInZpZXdaVG9QZXJzcGVjdGl2ZURlcHRoXCIsXHJcblx0Ly8gICAgd2UgbW9kaWZ5IHRoZSBmb3JtdWxhIGhlcmUgdG8gdXNlICd2aWV3WicgaW5zdGVhZCBvZiAndycuIFRoZSBvdGhlciBmdW5jdGlvbnMgZXhwZWN0IGEgbmVnYXRpdmUgdmlld1osXHJcblx0Ly8gICAgc28gd2UgZG8gdGhlIHNhbWUgaGVyZSwgaGVuY2UgdGhlICd2aWV3Wi5uZWdhdGUoKScgY2FsbC5cclxuXHQvLyBGb3IgdmlzdWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgZGVwdGggY3VydmUsIHNlZSBodHRwczovL3d3dy5kZXNtb3MuY29tL2NhbGN1bGF0b3IvdXlxazB2ZXgxdVxyXG5cdG5lYXIgPSBuZWFyLm1heCggMWUtNiApLnRvVmFyKCk7XHJcblx0Y29uc3QgbnVtZXJhdG9yID0gbG9nMiggdmlld1oubmVnYXRlKCkuZGl2KCBuZWFyICkgKTtcclxuXHRjb25zdCBkZW5vbWluYXRvciA9IGxvZzIoIGZhci5kaXYoIG5lYXIgKSApO1xyXG5cdHJldHVybiBudW1lcmF0b3IuZGl2KCBkZW5vbWluYXRvciApO1xyXG5cclxufTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNvbnZlcnRpbmcgYSBsb2dhcml0aG1pYyBkZXB0aCB2YWx1ZSB0byBhIHZpZXdaIHZhbHVlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSBkZXB0aCAtIFRoZSBsb2dhcml0aG1pYyBkZXB0aC5cclxuICogQHBhcmFtIHtOb2RlPGZsb2F0Pn0gbmVhciAtIFRoZSBjYW1lcmEncyBuZWFyIHZhbHVlLlxyXG4gKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSBmYXIgLSBUaGUgY2FtZXJhJ3MgZmFyIHZhbHVlLlxyXG4gKiBAcmV0dXJucyB7Tm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbG9nYXJpdGhtaWNEZXB0aFRvVmlld1ogPSAoIGRlcHRoLCBuZWFyLCBmYXIgKSA9PiB7XHJcblxyXG5cdC8vIE5PVEU6IHdlIGFkZCBhICduZWdhdGUoKScgY2FsbCB0byB0aGUgcmV0dXJuIHZhbHVlIGhlcmUgdG8gbWFpbnRhaW4gY29uc2lzdGVuY3kgd2l0aFxyXG5cdC8vIHRoZSBmdW5jdGlvbnMgXCJvcnRob2dyYXBoaWNEZXB0aFRvVmlld1pcIiBhbmQgXCJwZXJzcGVjdGl2ZURlcHRoVG9WaWV3WlwiICh0aGV5IHJldHVyblxyXG5cdC8vIGEgbmVnYXRpdmUgdmlld1opLlxyXG5cdGNvbnN0IGV4cG9uZW50ID0gZGVwdGgubXVsKCBsb2coIGZhci5kaXYoIG5lYXIgKSApICk7XHJcblx0cmV0dXJuIGZsb2F0KCBNYXRoLkUgKS5wb3coIGV4cG9uZW50ICkubXVsKCBuZWFyICkubmVnYXRlKCk7XHJcblxyXG59O1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgZGVmaW5pbmcgYSB2YWx1ZSBmb3IgdGhlIGN1cnJlbnQgZnJhZ21lbnQncyBkZXB0aC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlPGZsb2F0Pn0gdmFsdWUgLSBUaGUgZGVwdGggdmFsdWUgdG8gc2V0LlxyXG4gKiBAcmV0dXJucyB7Vmlld3BvcnREZXB0aE5vZGU8ZmxvYXQ+fVxyXG4gKi9cclxuY29uc3QgZGVwdGhCYXNlID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIFZpZXdwb3J0RGVwdGhOb2RlLCBWaWV3cG9ydERlcHRoTm9kZS5ERVBUSF9CQVNFICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGRlcHRoIHZhbHVlIGZvciB0aGUgY3VycmVudCBmcmFnbWVudC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Vmlld3BvcnREZXB0aE5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZGVwdGggPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIFZpZXdwb3J0RGVwdGhOb2RlLCBWaWV3cG9ydERlcHRoTm9kZS5ERVBUSCApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY29udmVydGluZyBhIHBlcnNwZWN0aXZlIGRlcHRoIHZhbHVlIHRvIGxpbmVhciBkZXB0aC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHs/Tm9kZTxmbG9hdD59IFt2YWx1ZT1udWxsXSAtIFRoZSBwZXJzcGVjdGl2ZSBkZXB0aC4gSWYgYG51bGxgIGlzIHByb3ZpZGVkLCB0aGUgY3VycmVudCBmcmFnbWVudCdzIGRlcHRoIGlzIHVzZWQuXHJcbiAqIEByZXR1cm5zIHtWaWV3cG9ydERlcHRoTm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbGluZWFyRGVwdGggPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggVmlld3BvcnREZXB0aE5vZGUsIFZpZXdwb3J0RGVwdGhOb2RlLkxJTkVBUl9ERVBUSCApLnNldFBhcmFtZXRlckxlbmd0aCggMCwgMSApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBsaW5lYXIgKG9ydGhvZ3JhcGhpYykgZGVwdGggdmFsdWUgb2YgdGhlIGN1cnJlbnQgZnJhZ21lbnRcclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Vmlld3BvcnREZXB0aE5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgdmlld3BvcnRMaW5lYXJEZXB0aCA9IC8qQF9fUFVSRV9fKi8gbGluZWFyRGVwdGgoIHZpZXdwb3J0RGVwdGhUZXh0dXJlKCkgKTtcclxuXHJcbmRlcHRoLmFzc2lnbiA9ICggdmFsdWUgKSA9PiBkZXB0aEJhc2UoIHZhbHVlICk7XHJcbiIsImltcG9ydCBOb2RlIGZyb20gJy4uL2NvcmUvTm9kZS5qcyc7XHJcbmltcG9ydCB7IG5vZGVQcm94eSB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGUgbm9kZSBhbGxvd3MgdG8gc2V0IHZhbHVlcyBmb3IgYnVpbHQtaW4gc2hhZGVyIHZhcmlhYmxlcy4gVGhhdCBpc1xyXG4gKiByZXF1aXJlZCBmb3IgZmVhdHVyZXMgbGlrZSBoYXJkd2FyZS1hY2NlbGVyYXRlZCB2ZXJ0ZXggY2xpcHBpbmcuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBOb2RlXHJcbiAqL1xyXG5jbGFzcyBCdWlsdGluTm9kZSBleHRlbmRzIE5vZGUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGJ1aWx0aW4gbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGJ1aWx0LWluIHNoYWRlciB2YXJpYWJsZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbmFtZSApIHtcclxuXHJcblx0XHRzdXBlciggJ2Zsb2F0JyApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG5hbWUgb2YgdGhlIGJ1aWx0LWluIHNoYWRlciB2YXJpYWJsZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5hbWUgPSBuYW1lO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0J1aWx0aW5Ob2RlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZW5lcmF0ZXMgdGhlIGNvZGUgc25pcHBldCBvZiB0aGUgYnVpbHRpbiBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBnZW5lcmF0ZWQgY29kZSBzbmlwcGV0LlxyXG5cdCAqL1xyXG5cdGdlbmVyYXRlKCAvKiBidWlsZGVyICovICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm5hbWU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEJ1aWx0aW5Ob2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSBidWlsdGluIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGJ1aWx0LWluIHNoYWRlciB2YXJpYWJsZS5cclxuICogQHJldHVybnMge0J1aWx0aW5Ob2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGJ1aWx0aW4gPSBub2RlUHJveHkoIEJ1aWx0aW5Ob2RlICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAxICk7XHJcbiIsIlxyXG5pbXBvcnQgTm9kZSBmcm9tICcuLi9jb3JlL05vZGUuanMnO1xyXG5pbXBvcnQgeyBub2RlT2JqZWN0LCBGbiwgYm9vbCwgZmxvYXQgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcbmltcG9ydCB7IHBvc2l0aW9uVmlldyB9IGZyb20gJy4vUG9zaXRpb24uanMnO1xyXG5pbXBvcnQgeyBkaWZmdXNlQ29sb3IgfSBmcm9tICcuLi9jb3JlL1Byb3BlcnR5Tm9kZS5qcyc7XHJcbmltcG9ydCB7IExvb3AgfSBmcm9tICcuLi91dGlscy9Mb29wTm9kZS5qcyc7XHJcbmltcG9ydCB7IHNtb290aHN0ZXAgfSBmcm9tICcuLi9tYXRoL01hdGhOb2RlLmpzJztcclxuaW1wb3J0IHsgdW5pZm9ybUFycmF5IH0gZnJvbSAnLi9Vbmlmb3JtQXJyYXlOb2RlLmpzJztcclxuaW1wb3J0IHsgYnVpbHRpbiB9IGZyb20gJy4vQnVpbHRpbk5vZGUuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgbm9kZSBpcyB1c2VkIGluIHtAbGluayBOb2RlTWF0ZXJpYWx9IHRvIHNldHVwIHRoZSBjbGlwcGluZ1xyXG4gKiB3aGljaCBjYW4gaGFwcGVuIGhhcmR3YXJlLWFjY2VsZXJhdGVkIChpZiBzdXBwb3J0ZWQpIGFuZCBvcHRpb25hbGx5XHJcbiAqIHVzZSBhbHBoYS10by1jb3ZlcmFnZSBmb3IgYW50aS1hbGlhc2luZyBjbGlwcGVkIGVkZ2VzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTm9kZVxyXG4gKi9cclxuY2xhc3MgQ2xpcHBpbmdOb2RlIGV4dGVuZHMgTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ0NsaXBwaW5nTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBjbGlwcGluZyBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHsoJ2RlZmF1bHQnfCdoYXJkd2FyZSd8J2FscGhhVG9Db3ZlcmFnZScpfSBbc2NvcGU9J2RlZmF1bHQnXSAtIFRoZSBub2RlJ3Mgc2NvcGUuIFNpbWlsYXIgdG8gb3RoZXIgbm9kZXMsXHJcblx0ICogdGhlIHNlbGVjdGVkIHNjb3BlIGluZmx1ZW5jZXMgdGhlIGJlaGF2aW9yIG9mIHRoZSBub2RlIGFuZCB3aGF0IHR5cGUgb2YgY29kZSBpcyBnZW5lcmF0ZWQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHNjb3BlID0gQ2xpcHBpbmdOb2RlLkRFRkFVTFQgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBub2RlJ3Mgc2NvcGUuIFNpbWlsYXIgdG8gb3RoZXIgbm9kZXMsIHRoZSBzZWxlY3RlZCBzY29wZSBpbmZsdWVuY2VzXHJcblx0XHQgKiB0aGUgYmVoYXZpb3Igb2YgdGhlIG5vZGUgYW5kIHdoYXQgdHlwZSBvZiBjb2RlIGlzIGdlbmVyYXRlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KCdkZWZhdWx0J3wnaGFyZHdhcmUnfCdhbHBoYVRvQ292ZXJhZ2UnKX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zY29wZSA9IHNjb3BlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHVwcyB0aGUgbm9kZSBkZXBlbmRpbmcgb24gdGhlIHNlbGVjdGVkIHNjb3BlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtOb2RlfSBUaGUgcmVzdWx0IG5vZGUuXHJcblx0ICovXHJcblx0c2V0dXAoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0c3VwZXIuc2V0dXAoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRjb25zdCBjbGlwcGluZ0NvbnRleHQgPSBidWlsZGVyLmNsaXBwaW5nQ29udGV4dDtcclxuXHRcdGNvbnN0IHsgaW50ZXJzZWN0aW9uUGxhbmVzLCB1bmlvblBsYW5lcyB9ID0gY2xpcHBpbmdDb250ZXh0O1xyXG5cclxuXHRcdHRoaXMuaGFyZHdhcmVDbGlwcGluZyA9IGJ1aWxkZXIubWF0ZXJpYWwuaGFyZHdhcmVDbGlwcGluZztcclxuXHJcblx0XHRpZiAoIHRoaXMuc2NvcGUgPT09IENsaXBwaW5nTm9kZS5BTFBIQV9UT19DT1ZFUkFHRSApIHtcclxuXHJcblx0XHRcdHJldHVybiB0aGlzLnNldHVwQWxwaGFUb0NvdmVyYWdlKCBpbnRlcnNlY3Rpb25QbGFuZXMsIHVuaW9uUGxhbmVzICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggdGhpcy5zY29wZSA9PT0gQ2xpcHBpbmdOb2RlLkhBUkRXQVJFICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIHRoaXMuc2V0dXBIYXJkd2FyZUNsaXBwaW5nKCB1bmlvblBsYW5lcywgYnVpbGRlciApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gdGhpcy5zZXR1cERlZmF1bHQoIGludGVyc2VjdGlvblBsYW5lcywgdW5pb25QbGFuZXMgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0dXBzIGFscGhhIHRvIGNvdmVyYWdlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxWZWN0b3I0Pn0gaW50ZXJzZWN0aW9uUGxhbmVzIC0gVGhlIGludGVyc2VjdGlvbiBwbGFuZXMuXHJcblx0ICogQHBhcmFtIHtBcnJheTxWZWN0b3I0Pn0gdW5pb25QbGFuZXMgLSBUaGUgdW5pb24gcGxhbmVzLlxyXG5cdCAqIEByZXR1cm4ge05vZGV9IFRoZSByZXN1bHQgbm9kZS5cclxuXHQgKi9cclxuXHRzZXR1cEFscGhhVG9Db3ZlcmFnZSggaW50ZXJzZWN0aW9uUGxhbmVzLCB1bmlvblBsYW5lcyApIHtcclxuXHJcblx0XHRyZXR1cm4gRm4oICgpID0+IHtcclxuXHJcblx0XHRcdGNvbnN0IGRpc3RhbmNlVG9QbGFuZSA9IGZsb2F0KCkudG9WYXIoICdkaXN0YW5jZVRvUGxhbmUnICk7XHJcblx0XHRcdGNvbnN0IGRpc3RhbmNlR3JhZGllbnQgPSBmbG9hdCgpLnRvVmFyKCAnZGlzdGFuY2VUb0dyYWRpZW50JyApO1xyXG5cclxuXHRcdFx0Y29uc3QgY2xpcE9wYWNpdHkgPSBmbG9hdCggMSApLnRvVmFyKCAnY2xpcE9wYWNpdHknICk7XHJcblxyXG5cdFx0XHRjb25zdCBudW1VbmlvblBsYW5lcyA9IHVuaW9uUGxhbmVzLmxlbmd0aDtcclxuXHJcblx0XHRcdGlmICggdGhpcy5oYXJkd2FyZUNsaXBwaW5nID09PSBmYWxzZSAmJiBudW1VbmlvblBsYW5lcyA+IDAgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGNsaXBwaW5nUGxhbmVzID0gdW5pZm9ybUFycmF5KCB1bmlvblBsYW5lcyApO1xyXG5cclxuXHRcdFx0XHRMb29wKCBudW1VbmlvblBsYW5lcywgKCB7IGkgfSApID0+IHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBwbGFuZSA9IGNsaXBwaW5nUGxhbmVzLmVsZW1lbnQoIGkgKTtcclxuXHJcblx0XHRcdFx0XHRkaXN0YW5jZVRvUGxhbmUuYXNzaWduKCBwb3NpdGlvblZpZXcuZG90KCBwbGFuZS54eXogKS5uZWdhdGUoKS5hZGQoIHBsYW5lLncgKSApO1xyXG5cdFx0XHRcdFx0ZGlzdGFuY2VHcmFkaWVudC5hc3NpZ24oIGRpc3RhbmNlVG9QbGFuZS5md2lkdGgoKS5kaXYoIDIuMCApICk7XHJcblxyXG5cdFx0XHRcdFx0Y2xpcE9wYWNpdHkubXVsQXNzaWduKCBzbW9vdGhzdGVwKCBkaXN0YW5jZUdyYWRpZW50Lm5lZ2F0ZSgpLCBkaXN0YW5jZUdyYWRpZW50LCBkaXN0YW5jZVRvUGxhbmUgKSApO1xyXG5cclxuXHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBudW1JbnRlcnNlY3Rpb25QbGFuZXMgPSBpbnRlcnNlY3Rpb25QbGFuZXMubGVuZ3RoO1xyXG5cclxuXHRcdFx0aWYgKCBudW1JbnRlcnNlY3Rpb25QbGFuZXMgPiAwICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBjbGlwcGluZ1BsYW5lcyA9IHVuaWZvcm1BcnJheSggaW50ZXJzZWN0aW9uUGxhbmVzICk7XHJcblx0XHRcdFx0Y29uc3QgaW50ZXJzZWN0aW9uQ2xpcE9wYWNpdHkgPSBmbG9hdCggMSApLnRvVmFyKCAnaW50ZXJzZWN0aW9uQ2xpcE9wYWNpdHknICk7XHJcblxyXG5cdFx0XHRcdExvb3AoIG51bUludGVyc2VjdGlvblBsYW5lcywgKCB7IGkgfSApID0+IHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBwbGFuZSA9IGNsaXBwaW5nUGxhbmVzLmVsZW1lbnQoIGkgKTtcclxuXHJcblx0XHRcdFx0XHRkaXN0YW5jZVRvUGxhbmUuYXNzaWduKCBwb3NpdGlvblZpZXcuZG90KCBwbGFuZS54eXogKS5uZWdhdGUoKS5hZGQoIHBsYW5lLncgKSApO1xyXG5cdFx0XHRcdFx0ZGlzdGFuY2VHcmFkaWVudC5hc3NpZ24oIGRpc3RhbmNlVG9QbGFuZS5md2lkdGgoKS5kaXYoIDIuMCApICk7XHJcblxyXG5cdFx0XHRcdFx0aW50ZXJzZWN0aW9uQ2xpcE9wYWNpdHkubXVsQXNzaWduKCBzbW9vdGhzdGVwKCBkaXN0YW5jZUdyYWRpZW50Lm5lZ2F0ZSgpLCBkaXN0YW5jZUdyYWRpZW50LCBkaXN0YW5jZVRvUGxhbmUgKS5vbmVNaW51cygpICk7XHJcblxyXG5cdFx0XHRcdH0gKTtcclxuXHJcblx0XHRcdFx0Y2xpcE9wYWNpdHkubXVsQXNzaWduKCBpbnRlcnNlY3Rpb25DbGlwT3BhY2l0eS5vbmVNaW51cygpICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRkaWZmdXNlQ29sb3IuYS5tdWxBc3NpZ24oIGNsaXBPcGFjaXR5ICk7XHJcblxyXG5cdFx0XHRkaWZmdXNlQ29sb3IuYS5lcXVhbCggMC4wICkuZGlzY2FyZCgpO1xyXG5cclxuXHRcdH0gKSgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHVwcyB0aGUgZGVmYXVsdCBjbGlwcGluZy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8VmVjdG9yND59IGludGVyc2VjdGlvblBsYW5lcyAtIFRoZSBpbnRlcnNlY3Rpb24gcGxhbmVzLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8VmVjdG9yND59IHVuaW9uUGxhbmVzIC0gVGhlIHVuaW9uIHBsYW5lcy5cclxuXHQgKiBAcmV0dXJuIHtOb2RlfSBUaGUgcmVzdWx0IG5vZGUuXHJcblx0ICovXHJcblx0c2V0dXBEZWZhdWx0KCBpbnRlcnNlY3Rpb25QbGFuZXMsIHVuaW9uUGxhbmVzICkge1xyXG5cclxuXHRcdHJldHVybiBGbiggKCkgPT4ge1xyXG5cclxuXHRcdFx0Y29uc3QgbnVtVW5pb25QbGFuZXMgPSB1bmlvblBsYW5lcy5sZW5ndGg7XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMuaGFyZHdhcmVDbGlwcGluZyA9PT0gZmFsc2UgJiYgbnVtVW5pb25QbGFuZXMgPiAwICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBjbGlwcGluZ1BsYW5lcyA9IHVuaWZvcm1BcnJheSggdW5pb25QbGFuZXMgKTtcclxuXHJcblx0XHRcdFx0TG9vcCggbnVtVW5pb25QbGFuZXMsICggeyBpIH0gKSA9PiB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgcGxhbmUgPSBjbGlwcGluZ1BsYW5lcy5lbGVtZW50KCBpICk7XHJcblx0XHRcdFx0XHRwb3NpdGlvblZpZXcuZG90KCBwbGFuZS54eXogKS5ncmVhdGVyVGhhbiggcGxhbmUudyApLmRpc2NhcmQoKTtcclxuXHJcblx0XHRcdFx0fSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgbnVtSW50ZXJzZWN0aW9uUGxhbmVzID0gaW50ZXJzZWN0aW9uUGxhbmVzLmxlbmd0aDtcclxuXHJcblx0XHRcdGlmICggbnVtSW50ZXJzZWN0aW9uUGxhbmVzID4gMCApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgY2xpcHBpbmdQbGFuZXMgPSB1bmlmb3JtQXJyYXkoIGludGVyc2VjdGlvblBsYW5lcyApO1xyXG5cdFx0XHRcdGNvbnN0IGNsaXBwZWQgPSBib29sKCB0cnVlICkudG9WYXIoICdjbGlwcGVkJyApO1xyXG5cclxuXHRcdFx0XHRMb29wKCBudW1JbnRlcnNlY3Rpb25QbGFuZXMsICggeyBpIH0gKSA9PiB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgcGxhbmUgPSBjbGlwcGluZ1BsYW5lcy5lbGVtZW50KCBpICk7XHJcblx0XHRcdFx0XHRjbGlwcGVkLmFzc2lnbiggcG9zaXRpb25WaWV3LmRvdCggcGxhbmUueHl6ICkuZ3JlYXRlclRoYW4oIHBsYW5lLncgKS5hbmQoIGNsaXBwZWQgKSApO1xyXG5cclxuXHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRcdGNsaXBwZWQuZGlzY2FyZCgpO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gKSgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHVwcyBoYXJkd2FyZSBjbGlwcGluZy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8VmVjdG9yND59IHVuaW9uUGxhbmVzIC0gVGhlIHVuaW9uIHBsYW5lcy5cclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge05vZGV9IFRoZSByZXN1bHQgbm9kZS5cclxuXHQgKi9cclxuXHRzZXR1cEhhcmR3YXJlQ2xpcHBpbmcoIHVuaW9uUGxhbmVzLCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IG51bVVuaW9uUGxhbmVzID0gdW5pb25QbGFuZXMubGVuZ3RoO1xyXG5cclxuXHRcdGJ1aWxkZXIuZW5hYmxlSGFyZHdhcmVDbGlwcGluZyggbnVtVW5pb25QbGFuZXMgKTtcclxuXHJcblx0XHRyZXR1cm4gRm4oICgpID0+IHtcclxuXHJcblx0XHRcdGNvbnN0IGNsaXBwaW5nUGxhbmVzID0gdW5pZm9ybUFycmF5KCB1bmlvblBsYW5lcyApO1xyXG5cdFx0XHRjb25zdCBod19jbGlwX2Rpc3RhbmNlcyA9IGJ1aWx0aW4oIGJ1aWxkZXIuZ2V0Q2xpcERpc3RhbmNlKCkgKTtcclxuXHJcblx0XHRcdExvb3AoIG51bVVuaW9uUGxhbmVzLCAoIHsgaSB9ICkgPT4ge1xyXG5cclxuXHRcdFx0XHRjb25zdCBwbGFuZSA9IGNsaXBwaW5nUGxhbmVzLmVsZW1lbnQoIGkgKTtcclxuXHJcblx0XHRcdFx0Y29uc3QgZGlzdGFuY2UgPSBwb3NpdGlvblZpZXcuZG90KCBwbGFuZS54eXogKS5zdWIoIHBsYW5lLncgKS5uZWdhdGUoKTtcclxuXHRcdFx0XHRod19jbGlwX2Rpc3RhbmNlcy5lbGVtZW50KCBpICkuYXNzaWduKCBkaXN0YW5jZSApO1xyXG5cclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdH0gKSgpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5DbGlwcGluZ05vZGUuQUxQSEFfVE9fQ09WRVJBR0UgPSAnYWxwaGFUb0NvdmVyYWdlJztcclxuQ2xpcHBpbmdOb2RlLkRFRkFVTFQgPSAnZGVmYXVsdCc7XHJcbkNsaXBwaW5nTm9kZS5IQVJEV0FSRSA9ICdoYXJkd2FyZSc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBDbGlwcGluZ05vZGU7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBzZXR0aW5nIHVwIHRoZSBkZWZhdWx0IGNsaXBwaW5nIGxvZ2ljLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcmV0dXJucyB7Q2xpcHBpbmdOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGNsaXBwaW5nID0gKCkgPT4gbm9kZU9iamVjdCggbmV3IENsaXBwaW5nTm9kZSgpICk7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBzZXR0aW5nIHVwIGFscGhhIHRvIGNvdmVyYWdlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcmV0dXJucyB7Q2xpcHBpbmdOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGNsaXBwaW5nQWxwaGEgPSAoKSA9PiBub2RlT2JqZWN0KCBuZXcgQ2xpcHBpbmdOb2RlKCBDbGlwcGluZ05vZGUuQUxQSEFfVE9fQ09WRVJBR0UgKSApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3Igc2V0dGluZyB1cCBoYXJkd2FyZS1iYXNlZCBjbGlwcGluZy5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHJldHVybnMge0NsaXBwaW5nTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBoYXJkd2FyZUNsaXBwaW5nID0gKCkgPT4gbm9kZU9iamVjdCggbmV3IENsaXBwaW5nTm9kZSggQ2xpcHBpbmdOb2RlLkhBUkRXQVJFICkgKTtcclxuIiwiaW1wb3J0IHsgYWJzLCBhZGQsIGNlaWwsIGNsYW1wLCBkRmR4LCBkRmR5LCBleHAyLCBmbG9hdCwgZmxvb3IsIEZuLCBmcmFjdCwgbGVuZ3RoLCBsb2cyLCBtYXgsIG1pbiwgbXVsLCBzaW4sIHN1YiwgdmVjMiwgdmVjMyB9IGZyb20gJy4uLy4uL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbi8vIFNlZTogaHR0cHM6Ly9jYXN1YWwtZWZmZWN0cy5jb20vcmVzZWFyY2gvV3ltYW4yMDE3SGFzaGVkL2luZGV4Lmh0bWxcclxuXHJcbmNvbnN0IEFMUEhBX0hBU0hfU0NBTEUgPSAwLjA1OyAvLyBEZXJpdmVkIGZyb20gdHJpYWxzIG9ubHksIGFuZCBtYXkgYmUgY2hhbmdlZC5cclxuXHJcbmNvbnN0IGhhc2gyRCA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyB2YWx1ZSBdICkgPT4ge1xyXG5cclxuXHRyZXR1cm4gZnJhY3QoIG11bCggMS4wZTQsIHNpbiggbXVsKCAxNy4wLCB2YWx1ZS54ICkuYWRkKCBtdWwoIDAuMSwgdmFsdWUueSApICkgKSApLm11bCggYWRkKCAwLjEsIGFicyggc2luKCBtdWwoIDEzLjAsIHZhbHVlLnkgKS5hZGQoIHZhbHVlLnggKSApICkgKSApICk7XHJcblxyXG59ICk7XHJcblxyXG5jb25zdCBoYXNoM0QgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgdmFsdWUgXSApID0+IHtcclxuXHJcblx0cmV0dXJuIGhhc2gyRCggdmVjMiggaGFzaDJEKCB2YWx1ZS54eSApLCB2YWx1ZS56ICkgKTtcclxuXHJcbn0gKTtcclxuXHJcbmNvbnN0IGdldEFscGhhSGFzaFRocmVzaG9sZCA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyBwb3NpdGlvbiBdICkgPT4ge1xyXG5cclxuXHQvLyBGaW5kIHRoZSBkaXNjcmV0aXplZCBkZXJpdmF0aXZlcyBvZiBvdXIgY29vcmRpbmF0ZXNcclxuXHRjb25zdCBtYXhEZXJpdiA9IG1heChcclxuXHRcdGxlbmd0aCggZEZkeCggcG9zaXRpb24ueHl6ICkgKSxcclxuXHRcdGxlbmd0aCggZEZkeSggcG9zaXRpb24ueHl6ICkgKVxyXG5cdCk7XHJcblxyXG5cdGNvbnN0IHBpeFNjYWxlID0gZmxvYXQoIDEgKS5kaXYoIGZsb2F0KCBBTFBIQV9IQVNIX1NDQUxFICkubXVsKCBtYXhEZXJpdiApICkudG9WYXIoICdwaXhTY2FsZScgKTtcclxuXHJcblx0Ly8gRmluZCB0d28gbmVhcmVzdCBsb2ctZGlzY3JldGl6ZWQgbm9pc2Ugc2NhbGVzXHJcblx0Y29uc3QgcGl4U2NhbGVzID0gdmVjMihcclxuXHRcdGV4cDIoIGZsb29yKCBsb2cyKCBwaXhTY2FsZSApICkgKSxcclxuXHRcdGV4cDIoIGNlaWwoIGxvZzIoIHBpeFNjYWxlICkgKSApXHJcblx0KTtcclxuXHJcblx0Ly8gQ29tcHV0ZSBhbHBoYSB0aHJlc2hvbGRzIGF0IG91ciB0d28gbm9pc2Ugc2NhbGVzXHJcblx0Y29uc3QgYWxwaGEgPSB2ZWMyKFxyXG5cdFx0aGFzaDNEKCBmbG9vciggcGl4U2NhbGVzLngubXVsKCBwb3NpdGlvbi54eXogKSApICksXHJcblx0XHRoYXNoM0QoIGZsb29yKCBwaXhTY2FsZXMueS5tdWwoIHBvc2l0aW9uLnh5eiApICkgKSxcclxuXHQpO1xyXG5cclxuXHQvLyBGYWN0b3IgdG8gaW50ZXJwb2xhdGUgbGVycCB3aXRoXHJcblx0Y29uc3QgbGVycEZhY3RvciA9IGZyYWN0KCBsb2cyKCBwaXhTY2FsZSApICk7XHJcblxyXG5cdC8vIEludGVycG9sYXRlIGFscGhhIHRocmVzaG9sZCBmcm9tIG5vaXNlIGF0IHR3byBzY2FsZXNcclxuXHRjb25zdCB4ID0gYWRkKCBtdWwoIGxlcnBGYWN0b3Iub25lTWludXMoKSwgYWxwaGEueCApLCBtdWwoIGxlcnBGYWN0b3IsIGFscGhhLnkgKSApO1xyXG5cclxuXHQvLyBQYXNzIGludG8gQ0RGIHRvIGNvbXB1dGUgdW5pZm9ybWx5IGRpc3RyaWIgdGhyZXNob2xkXHJcblx0Y29uc3QgYSA9IG1pbiggbGVycEZhY3RvciwgbGVycEZhY3Rvci5vbmVNaW51cygpICk7XHJcblx0Y29uc3QgY2FzZXMgPSB2ZWMzKFxyXG5cdFx0eC5tdWwoIHggKS5kaXYoIG11bCggMi4wLCBhICkubXVsKCBzdWIoIDEuMCwgYSApICkgKSxcclxuXHRcdHguc3ViKCBtdWwoIDAuNSwgYSApICkuZGl2KCBzdWIoIDEuMCwgYSApICksXHJcblx0XHRzdWIoIDEuMCwgc3ViKCAxLjAsIHggKS5tdWwoIHN1YiggMS4wLCB4ICkgKS5kaXYoIG11bCggMi4wLCBhICkubXVsKCBzdWIoIDEuMCwgYSApICkgKSApICk7XHJcblxyXG5cdC8vIEZpbmQgb3VyIGZpbmFsLCB1bmlmb3JtbHkgZGlzdHJpYnV0ZWQgYWxwaGEgdGhyZXNob2xkICjOsc+EKVxyXG5cdGNvbnN0IHRocmVzaG9sZCA9IHgubGVzc1RoYW4oIGEub25lTWludXMoKSApLnNlbGVjdCggeC5sZXNzVGhhbiggYSApLnNlbGVjdCggY2FzZXMueCwgY2FzZXMueSApLCBjYXNlcy56ICk7XHJcblxyXG5cdC8vIEF2b2lkcyDOsc+EID09IDAuIENvdWxkIGFsc28gZG8gzrHPhCA9MS3Osc+EXHJcblx0cmV0dXJuIGNsYW1wKCB0aHJlc2hvbGQsIDEuMGUtNiwgMS4wICk7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ2dldEFscGhhSGFzaFRocmVzaG9sZCcsXHJcblx0dHlwZTogJ2Zsb2F0JyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ3Bvc2l0aW9uJywgdHlwZTogJ3ZlYzMnIH1cclxuXHRdXHJcbn0gKTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGdldEFscGhhSGFzaFRocmVzaG9sZDtcclxuIiwiaW1wb3J0IHsgTWF0ZXJpYWwgfSBmcm9tICcuLi9NYXRlcmlhbC5qcyc7XHJcbmltcG9ydCB7IE5vcm1hbEJsZW5kaW5nIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzLmpzJztcclxuXHJcbmltcG9ydCB7IGdldE5vZGVDaGlsZHJlbiwgZ2V0Q2FjaGVLZXkgfSBmcm9tICcuLi8uLi9ub2Rlcy9jb3JlL05vZGVVdGlscy5qcyc7XHJcbmltcG9ydCB7IGF0dHJpYnV0ZSB9IGZyb20gJy4uLy4uL25vZGVzL2NvcmUvQXR0cmlidXRlTm9kZS5qcyc7XHJcbmltcG9ydCB7IG91dHB1dCwgZGlmZnVzZUNvbG9yLCBlbWlzc2l2ZSwgdmFyeWluZ1Byb3BlcnR5IH0gZnJvbSAnLi4vLi4vbm9kZXMvY29yZS9Qcm9wZXJ0eU5vZGUuanMnO1xyXG5pbXBvcnQgeyBtYXRlcmlhbEFscGhhVGVzdCwgbWF0ZXJpYWxDb2xvciwgbWF0ZXJpYWxPcGFjaXR5LCBtYXRlcmlhbEVtaXNzaXZlLCBtYXRlcmlhbE5vcm1hbCwgbWF0ZXJpYWxMaWdodE1hcCwgbWF0ZXJpYWxBTyB9IGZyb20gJy4uLy4uL25vZGVzL2FjY2Vzc29ycy9NYXRlcmlhbE5vZGUuanMnO1xyXG5pbXBvcnQgeyBtb2RlbFZpZXdQcm9qZWN0aW9uIH0gZnJvbSAnLi4vLi4vbm9kZXMvYWNjZXNzb3JzL01vZGVsVmlld1Byb2plY3Rpb25Ob2RlLmpzJztcclxuaW1wb3J0IHsgbm9ybWFsTG9jYWwgfSBmcm9tICcuLi8uLi9ub2Rlcy9hY2Nlc3NvcnMvTm9ybWFsLmpzJztcclxuaW1wb3J0IHsgaW5zdGFuY2VkTWVzaCB9IGZyb20gJy4uLy4uL25vZGVzL2FjY2Vzc29ycy9JbnN0YW5jZWRNZXNoTm9kZS5qcyc7XHJcbmltcG9ydCB7IGJhdGNoIH0gZnJvbSAnLi4vLi4vbm9kZXMvYWNjZXNzb3JzL0JhdGNoTm9kZS5qcyc7XHJcbmltcG9ydCB7IG1hdGVyaWFsUmVmZXJlbmNlIH0gZnJvbSAnLi4vLi4vbm9kZXMvYWNjZXNzb3JzL01hdGVyaWFsUmVmZXJlbmNlTm9kZS5qcyc7XHJcbmltcG9ydCB7IHBvc2l0aW9uTG9jYWwsIHBvc2l0aW9uVmlldyB9IGZyb20gJy4uLy4uL25vZGVzL2FjY2Vzc29ycy9Qb3NpdGlvbi5qcyc7XHJcbmltcG9ydCB7IHNraW5uaW5nIH0gZnJvbSAnLi4vLi4vbm9kZXMvYWNjZXNzb3JzL1NraW5uaW5nTm9kZS5qcyc7XHJcbmltcG9ydCB7IG1vcnBoUmVmZXJlbmNlIH0gZnJvbSAnLi4vLi4vbm9kZXMvYWNjZXNzb3JzL01vcnBoTm9kZS5qcyc7XHJcbmltcG9ydCB7IG1peCB9IGZyb20gJy4uLy4uL25vZGVzL21hdGgvTWF0aE5vZGUuanMnO1xyXG5pbXBvcnQgeyBmbG9hdCwgdmVjMywgdmVjNCB9IGZyb20gJy4uLy4uL25vZGVzL3RzbC9UU0xCYXNlLmpzJztcclxuaW1wb3J0IEFPTm9kZSBmcm9tICcuLi8uLi9ub2Rlcy9saWdodGluZy9BT05vZGUuanMnO1xyXG5pbXBvcnQgeyBsaWdodGluZ0NvbnRleHQgfSBmcm9tICcuLi8uLi9ub2Rlcy9saWdodGluZy9MaWdodGluZ0NvbnRleHROb2RlLmpzJztcclxuaW1wb3J0IElycmFkaWFuY2VOb2RlIGZyb20gJy4uLy4uL25vZGVzL2xpZ2h0aW5nL0lycmFkaWFuY2VOb2RlLmpzJztcclxuaW1wb3J0IHsgZGVwdGgsIHZpZXdaVG9Mb2dhcml0aG1pY0RlcHRoLCB2aWV3WlRvT3J0aG9ncmFwaGljRGVwdGggfSBmcm9tICcuLi8uLi9ub2Rlcy9kaXNwbGF5L1ZpZXdwb3J0RGVwdGhOb2RlLmpzJztcclxuaW1wb3J0IHsgY2FtZXJhRmFyLCBjYW1lcmFOZWFyLCBjYW1lcmFQcm9qZWN0aW9uTWF0cml4IH0gZnJvbSAnLi4vLi4vbm9kZXMvYWNjZXNzb3JzL0NhbWVyYS5qcyc7XHJcbmltcG9ydCB7IGNsaXBwaW5nLCBjbGlwcGluZ0FscGhhLCBoYXJkd2FyZUNsaXBwaW5nIH0gZnJvbSAnLi4vLi4vbm9kZXMvYWNjZXNzb3JzL0NsaXBwaW5nTm9kZS5qcyc7XHJcbmltcG9ydCBOb2RlTWF0ZXJpYWxPYnNlcnZlciBmcm9tICcuL21hbmFnZXIvTm9kZU1hdGVyaWFsT2JzZXJ2ZXIuanMnO1xyXG5pbXBvcnQgZ2V0QWxwaGFIYXNoVGhyZXNob2xkIGZyb20gJy4uLy4uL25vZGVzL2Z1bmN0aW9ucy9tYXRlcmlhbC9nZXRBbHBoYUhhc2hUaHJlc2hvbGQuanMnO1xyXG5pbXBvcnQgeyBtb2RlbFZpZXdNYXRyaXggfSBmcm9tICcuLi8uLi9ub2Rlcy9hY2Nlc3NvcnMvTW9kZWxOb2RlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBCYXNlIGNsYXNzIGZvciBhbGwgbm9kZSBtYXRlcmlhbHMuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBNYXRlcmlhbFxyXG4gKi9cclxuY2xhc3MgTm9kZU1hdGVyaWFsIGV4dGVuZHMgTWF0ZXJpYWwge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdOb2RlTWF0ZXJpYWwnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlcHJlc2VudHMgdGhlIHR5cGUgb2YgdGhlIG5vZGUgbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdCAqL1xyXG5cdGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLnR5cGU7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0IHR5cGUoIF92YWx1ZSApIHsgLyogKi8gfVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG5vZGUgbWF0ZXJpYWwuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNOb2RlTWF0ZXJpYWwgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGlzIG1hdGVyaWFsIGlzIGFmZmVjdGVkIGJ5IGZvZyBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZm9nID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhpcyBtYXRlcmlhbCBpcyBhZmZlY3RlZCBieSBsaWdodHMgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5saWdodHMgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhpcyBtYXRlcmlhbCB1c2VzIGhhcmR3YXJlIGNsaXBwaW5nIG9yIG5vdC5cclxuXHRcdCAqIFRoaXMgcHJvcGVydHkgaXMgbWFuYWdlZCBieSB0aGUgZW5naW5lIGFuZCBzaG91bGQgbm90IGJlXHJcblx0XHQgKiBtb2RpZmllZCBieSBhcHBzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5oYXJkd2FyZUNsaXBwaW5nID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBOb2RlIG1hdGVyaWFscyB3aGljaCBzZXQgdGhlaXIgYGxpZ2h0c2AgcHJvcGVydHkgdG8gYHRydWVgXHJcblx0XHQgKiBhcmUgYWZmZWN0ZWQgYnkgYWxsIGxpZ2h0cyBvZiB0aGUgc2NlbmUuIFNvbWV0aW1lcyBzZWxlY3RpdmVcclxuXHRcdCAqIGxpZ2h0aW5nIGlzIHdhbnRlZCB3aGljaCBtZWFucyBvbmx5IF9zb21lXyBsaWdodHMgaW4gdGhlIHNjZW5lXHJcblx0XHQgKiBhZmZlY3QgYSBtYXRlcmlhbC4gVGhpcyBjYW4gYmUgYWNoaWV2ZWQgYnkgY3JlYXRpbmcgYW4gaW5zdGFuY2VcclxuXHRcdCAqIG9mIHtAbGluayBMaWdodHNOb2RlfSB3aXRoIGEgbGlzdCBvZiBzZWxlY3RpdmVcclxuXHRcdCAqIGxpZ2h0cyBhbmQgYXNzaWduIHRoZSBub2RlIHRvIHRoaXMgcHJvcGVydHkuXHJcblx0XHQgKlxyXG5cdFx0ICogYGBganNcclxuXHRcdCAqIGNvbnN0IGN1c3RvbUxpZ2h0c05vZGUgPSBsaWdodHMoIFsgbGlnaHQxLCBsaWdodDIgXSApO1xyXG5cdFx0ICogbWF0ZXJpYWwubGlnaHRzTm9kZSA9IGN1c3RvbUxpZ2h0c05vZGU7XHJcblx0XHQgKiBgYGBcclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P0xpZ2h0c05vZGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGlnaHRzTm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZW52aXJvbm1lbnQgb2Ygbm9kZSBtYXRlcmlhbHMgY2FuIGJlIGRlZmluZWQgYnkgYW4gZW52aXJvbm1lbnRcclxuXHRcdCAqIG1hcCBhc3NpZ25lZCB0byB0aGUgYGVudk1hcGAgcHJvcGVydHkgb3IgYnkgYFNjZW5lLmVudmlyb25tZW50YFxyXG5cdFx0ICogaWYgdGhlIG5vZGUgbWF0ZXJpYWwgaXMgYSBQQlIgbWF0ZXJpYWwuIFRoaXMgbm9kZSBwcm9wZXJ0eSBhbGxvd3MgdG8gb3ZlcndyaXRlXHJcblx0XHQgKiB0aGUgZGVmYXVsdCBiZWhhdmlvciBhbmQgZGVmaW5lIHRoZSBlbnZpcm9ubWVudCB3aXRoIGEgY3VzdG9tIG5vZGUuXHJcblx0XHQgKlxyXG5cdFx0ICogYGBganNcclxuXHRcdCAqIG1hdGVyaWFsLmVudk5vZGUgPSBwbXJlbVRleHR1cmUoIHJlbmRlclRhcmdldC50ZXh0dXJlICk7XHJcblx0XHQgKiBgYGBcclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGU8dmVjMz59XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZW52Tm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbGlnaHRpbmcgb2Ygbm9kZSBtYXRlcmlhbHMgbWlnaHQgYmUgaW5mbHVlbmNlZCBieSBhbWJpZW50IG9jY2x1c2lvbi5cclxuXHRcdCAqIFRoZSBkZWZhdWx0IEFPIGlzIGluZmVycmVkIGZyb20gYW4gYW1iaWVudCBvY2NsdXNpb24gbWFwIGFzc2lnbmVkIHRvIGBhb01hcGBcclxuXHRcdCAqIGFuZCB0aGUgcmVzcGVjdGl2ZSBgYW9NYXBJbnRlbnNpdHlgLiBUaGlzIG5vZGUgcHJvcGVydHkgYWxsb3dzIHRvIG92ZXJ3cml0ZVxyXG5cdFx0ICogdGhlIGRlZmF1bHQgYW5kIGRlZmluZSB0aGUgYW1iaWVudCBvY2NsdXNpb24gd2l0aCBhIGN1c3RvbSBub2RlIGluc3RlYWQuXHJcblx0XHQgKlxyXG5cdFx0ICogSWYgeW91IGRvbid0IHdhbnQgdG8gb3ZlcndyaXRlIHRoZSBkaWZmdXNlIGNvbG9yIGJ1dCBtb2RpZnkgdGhlIGV4aXN0aW5nXHJcblx0XHQgKiB2YWx1ZXMgaW5zdGVhZCwgdXNlIHtAbGluayBtYXRlcmlhbEFPfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGU8ZmxvYXQ+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFvTm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZGlmZnVzZSBjb2xvciBvZiBub2RlIG1hdGVyaWFscyBpcyBieSBkZWZhdWx0IGluZmVycmVkIGZyb20gdGhlXHJcblx0XHQgKiBgY29sb3JgIGFuZCBgbWFwYCBwcm9wZXJ0aWVzLiBUaGlzIG5vZGUgcHJvcGVydHkgYWxsb3dzIHRvIG92ZXJ3cml0ZSB0aGUgZGVmYXVsdFxyXG5cdFx0ICogYW5kIGRlZmluZSB0aGUgZGlmZnVzZSBjb2xvciB3aXRoIGEgbm9kZSBpbnN0ZWFkLlxyXG5cdFx0ICpcclxuXHRcdCAqIGBgYGpzXHJcblx0XHQgKiBtYXRlcmlhbC5jb2xvck5vZGUgPSBjb2xvciggMHhmZjAwMDAgKTsgLy8gZGVmaW5lIHJlZCBjb2xvclxyXG5cdFx0ICogYGBgXHJcblx0XHQgKlxyXG5cdFx0ICogSWYgeW91IGRvbid0IHdhbnQgdG8gb3ZlcndyaXRlIHRoZSBkaWZmdXNlIGNvbG9yIGJ1dCBtb2RpZnkgdGhlIGV4aXN0aW5nXHJcblx0XHQgKiB2YWx1ZXMgaW5zdGVhZCwgdXNlIHtAbGluayBtYXRlcmlhbENvbG9yfS5cclxuXHRcdCAqXHJcblx0XHQgKiBgYGBqc1xyXG5cdFx0ICogbWF0ZXJpYWwuY29sb3JOb2RlID0gbWF0ZXJpYWxDb2xvci5tdWwoIGNvbG9yKCAweGZmMDAwMCApICk7IC8vIGdpdmUgZGlmZnVzZSBjb2xvcnMgYSByZWQgdGludFxyXG5cdFx0ICogYGBgXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPHZlYzM+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvbG9yTm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbm9ybWFscyBvZiBub2RlIG1hdGVyaWFscyBhcmUgYnkgZGVmYXVsdCBpbmZlcnJlZCBmcm9tIHRoZSBgbm9ybWFsTWFwYC9gbm9ybWFsU2NhbGVgXHJcblx0XHQgKiBvciBgYnVtcE1hcGAvYGJ1bXBTY2FsZWAgcHJvcGVydGllcy4gVGhpcyBub2RlIHByb3BlcnR5IGFsbG93cyB0byBvdmVyd3JpdGUgdGhlIGRlZmF1bHRcclxuXHRcdCAqIGFuZCBkZWZpbmUgdGhlIG5vcm1hbHMgd2l0aCBhIG5vZGUgaW5zdGVhZC5cclxuXHRcdCAqXHJcblx0XHQgKiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBvdmVyd3JpdGUgdGhlIG5vcm1hbHMgYnV0IG1vZGlmeSB0aGUgZXhpc3RpbmcgdmFsdWVzIGluc3RlYWQsXHJcblx0XHQgKiB1c2Uge0BsaW5rIG1hdGVyaWFsTm9ybWFsfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGU8dmVjMz59XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9ybWFsTm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgb3BhY2l0eSBvZiBub2RlIG1hdGVyaWFscyBpcyBieSBkZWZhdWx0IGluZmVycmVkIGZyb20gdGhlIGBvcGFjaXR5YFxyXG5cdFx0ICogYW5kIGBhbHBoYU1hcGAgcHJvcGVydGllcy4gVGhpcyBub2RlIHByb3BlcnR5IGFsbG93cyB0byBvdmVyd3JpdGUgdGhlIGRlZmF1bHRcclxuXHRcdCAqIGFuZCBkZWZpbmUgdGhlIG9wYWNpdHkgd2l0aCBhIG5vZGUgaW5zdGVhZC5cclxuXHRcdCAqXHJcblx0XHQgKiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBvdmVyd3JpdGUgdGhlIG5vcm1hbHMgYnV0IG1vZGlmeSB0aGUgZXhpc3RpbmdcclxuXHRcdCAqIHZhbHVlIGluc3RlYWQsIHVzZSB7QGxpbmsgbWF0ZXJpYWxPcGFjaXR5fS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGU8ZmxvYXQ+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm9wYWNpdHlOb2RlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgbm9kZSBjYW4gYmUgdXNlZCB0byB0byBpbXBsZW1lbnQgYSB2YXJpZXR5IG9mIGZpbHRlci1saWtlIGVmZmVjdHMuIFRoZSBpZGVhIGlzXHJcblx0XHQgKiB0byBzdG9yZSB0aGUgY3VycmVudCByZW5kZXJpbmcgaW50byBhIHRleHR1cmUgZS5nLiB2aWEgYHZpZXdwb3J0U2hhcmVkVGV4dHVyZSgpYCwgdXNlIGl0XHJcblx0XHQgKiB0byBjcmVhdGUgYW4gYXJiaXRyYXJ5IGVmZmVjdCBhbmQgdGhlbiBhc3NpZ24gdGhlIG5vZGUgY29tcG9zaXRpb24gdG8gdGhpcyBwcm9wZXJ0eS5cclxuXHRcdCAqIEV2ZXJ5dGhpbmcgYmVoaW5kIHRoZSBvYmplY3QgdXNpbmcgdGhpcyBtYXRlcmlhbCB3aWxsIG5vdyBiZSBhZmZlY3RlZCBieSBhIGZpbHRlci5cclxuXHRcdCAqXHJcblx0XHQgKiBgYGBqc1xyXG5cdFx0ICogY29uc3QgbWF0ZXJpYWwgPSBuZXcgTm9kZU1hdGVyaWFsKClcclxuXHRcdCAqIG1hdGVyaWFsLnRyYW5zcGFyZW50ID0gdHJ1ZTtcclxuXHRcdCAqXHJcblx0XHQgKiAvLyBldmVyeXRoaW5nIGJlaGluZCB0aGUgb2JqZWN0IHdpbGwgYmUgbW9ub2Nocm9tYXRpY1xyXG5cdFx0ICogbWF0ZXJpYWwuYmFja2Ryb3BOb2RlID0gc2F0dXJhdGlvbiggdmlld3BvcnRTaGFyZWRUZXh0dXJlKCkucmdiLCAwICk7XHJcblx0XHQgKiBgYGBcclxuXHRcdCAqXHJcblx0XHQgKiBCYWNrZHJvcCBjb21wdXRhdGlvbnMgYXJlIHBhcnQgb2YgdGhlIGxpZ2h0aW5nIHNvIG9ubHkgbGl0IG1hdGVyaWFscyBjYW4gdXNlIHRoaXMgcHJvcGVydHkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPHZlYzM+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJhY2tkcm9wTm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIG5vZGUgYWxsb3dzIHRvIG1vZHVsYXRlIHRoZSBpbmZsdWVuY2Ugb2YgYGJhY2tkcm9wTm9kZWAgdG8gdGhlIG91dGdvaW5nIGxpZ2h0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Tm9kZTxmbG9hdD59XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYmFja2Ryb3BBbHBoYU5vZGUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGFscGhhIHRlc3Qgb2Ygbm9kZSBtYXRlcmlhbHMgaXMgYnkgZGVmYXVsdCBpbmZlcnJlZCBmcm9tIHRoZSBgYWxwaGFUZXN0YFxyXG5cdFx0ICogcHJvcGVydHkuIFRoaXMgbm9kZSBwcm9wZXJ0eSBhbGxvd3MgdG8gb3ZlcndyaXRlIHRoZSBkZWZhdWx0IGFuZCBkZWZpbmUgdGhlXHJcblx0XHQgKiBhbHBoYSB0ZXN0IHdpdGggYSBub2RlIGluc3RlYWQuXHJcblx0XHQgKlxyXG5cdFx0ICogSWYgeW91IGRvbid0IHdhbnQgdG8gb3ZlcndyaXRlIHRoZSBhbHBoYSB0ZXN0IGJ1dCBtb2RpZnkgdGhlIGV4aXN0aW5nXHJcblx0XHQgKiB2YWx1ZSBpbnN0ZWFkLCB1c2Uge0BsaW5rIG1hdGVyaWFsQWxwaGFUZXN0fS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGU8ZmxvYXQ+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFscGhhVGVzdE5vZGUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGxvY2FsIHZlcnRleCBwb3NpdGlvbnMgYXJlIGNvbXB1dGVkIGJhc2VkIG9uIG11bHRpcGxlIGZhY3RvcnMgbGlrZSB0aGVcclxuXHRcdCAqIGF0dHJpYnV0ZSBkYXRhLCBtb3JwaGluZyBvciBza2lubmluZy4gVGhpcyBub2RlIHByb3BlcnR5IGFsbG93cyB0byBvdmVyd3JpdGVcclxuXHRcdCAqIHRoZSBkZWZhdWx0IGFuZCBkZWZpbmUgbG9jYWwgdmVydGV4IHBvc2l0aW9ucyB3aXRoIG5vZGVzIGluc3RlYWQuXHJcblx0XHQgKlxyXG5cdFx0ICogSWYgeW91IGRvbid0IHdhbnQgdG8gb3ZlcndyaXRlIHRoZSB2ZXJ0ZXggcG9zaXRpb25zIGJ1dCBtb2RpZnkgdGhlIGV4aXN0aW5nXHJcblx0XHQgKiB2YWx1ZXMgaW5zdGVhZCwgdXNlIHtAbGluayBwb3NpdGlvbkxvY2FsfS5cclxuXHRcdCAqXHJcblx0XHQgKmBgYGpzXHJcblx0XHQgKiBtYXRlcmlhbC5wb3NpdGlvbk5vZGUgPSBwb3NpdGlvbkxvY2FsLmFkZCggZGlzcGxhY2UgKTtcclxuXHRcdCAqIGBgYFxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Tm9kZTx2ZWMzPn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wb3NpdGlvbk5vZGUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBub2RlIHByb3BlcnR5IGlzIGludGVuZGVkIGZvciBsb2dpYyB3aGljaCBtb2RpZmllcyBnZW9tZXRyeSBkYXRhIG9uY2Ugb3IgcGVyIGFuaW1hdGlvbiBzdGVwLlxyXG5cdFx0ICogQXBwcyB1c3VhbGx5IHBsYWNlIHN1Y2ggbG9naWMgcmFuZG9tbHkgaW4gaW5pdGlhbGl6YXRpb24gcm91dGluZXMgb3IgaW4gdGhlIGFuaW1hdGlvbiBsb29wLlxyXG5cdFx0ICogYGdlb21ldHJ5Tm9kZWAgaXMgaW50ZW5kZWQgYXMgYSBkZWRpY2F0ZWQgQVBJIHNvIHRoZXJlIGlzIGFuIGludGVuZGVkIHNwb3Qgd2hlcmUgZ2VvbWV0cnkgbW9kaWZpY2F0aW9uc1xyXG5cdFx0ICogY2FuIGJlIGltcGxlbWVudGVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIFRoZSBpZGVhIGlzIHRvIGFzc2lnbiBhIGBGbmAgZGVmaW5pdGlvbiB0aGF0IGhvbGRzIHRoZSBnZW9tZXRyeSBtb2RpZmljYXRpb24gbG9naWMuIEEgdHlwaWNhbCBleGFtcGxlXHJcblx0XHQgKiB3b3VsZCBiZSBhIEdQVSBiYXNlZCBwYXJ0aWNsZSBzeXN0ZW0gdGhhdCBwcm92aWRlcyBhIG5vZGUgbWF0ZXJpYWwgZm9yIHVzYWdlIG9uIGFwcCBsZXZlbC4gVGhlIHBhcnRpY2xlXHJcblx0XHQgKiBzaW11bGF0aW9uIHdvdWxkIGJlIGltcGxlbWVudGVkIGFzIGNvbXB1dGUgc2hhZGVycyBhbmQgbWFuYWdlZCBpbnNpZGUgYSBgRm5gIGZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIGlzXHJcblx0XHQgKiBldmVudHVhbGx5IGFzc2lnbmVkIHRvIGBnZW9tZXRyeU5vZGVgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/RnVuY3Rpb259XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ2VvbWV0cnlOb2RlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFsbG93cyB0byBvdmVyd3JpdGUgZGVwdGggdmFsdWVzIGluIHRoZSBmcmFnbWVudCBzaGFkZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPGZsb2F0Pn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kZXB0aE5vZGUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQWxsb3dzIHRvIG92ZXJ3cml0ZSB0aGUgcG9zaXRpb24gdXNlZCBmb3Igc2hhZG93IG1hcCByZW5kZXJpbmcgd2hpY2hcclxuXHRcdCAqIGlzIGJ5IGRlZmF1bHQge0BsaW5rIHBvc2l0aW9uV29ybGR9LCB0aGUgdmVydGV4IHBvc2l0aW9uXHJcblx0XHQgKiBpbiB3b3JsZCBzcGFjZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGU8ZmxvYXQ+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNoYWRvd1Bvc2l0aW9uTm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIG5vZGUgY2FuIGJlIHVzZWQgdG8gaW5mbHVlbmNlIGhvdyBhbiBvYmplY3QgdXNpbmcgdGhpcyBub2RlIG1hdGVyaWFsXHJcblx0XHQgKiByZWNlaXZlIHNoYWRvd3MuXHJcblx0XHQgKlxyXG5cdFx0ICogYGBganNcclxuXHRcdCAqIGNvbnN0IHRvdGFsU2hhZG93cyA9IGZsb2F0KCAxICkudG9WYXIoKTtcclxuXHRcdCAqIG1hdGVyaWFsLnJlY2VpdmVkU2hhZG93Tm9kZSA9IEZuKCAoIFsgc2hhZG93IF0gKSA9PiB7XHJcblx0XHQgKiBcdHRvdGFsU2hhZG93cy5tdWxBc3NpZ24oIHNoYWRvdyApO1xyXG5cdFx0ICogXHQvL3JldHVybiBmbG9hdCggMSApOyAvLyBieXBhc3MgcmVjZWl2ZWQgc2hhZG93c1xyXG5cdFx0ICogXHRyZXR1cm4gc2hhZG93Lm1peCggY29sb3IoIDB4ZmYwMDAwICksIDEgKTsgLy8gbW9kaWZ5IHNoYWRvdyBjb2xvclxyXG5cdFx0ICogfSApO1xyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/KEZ1bmN0aW9ufEZ1bmN0aW9uTm9kZTx2ZWM0Pil9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVjZWl2ZWRTaGFkb3dOb2RlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgbm9kZSBjYW4gYmUgdXNlZCB0byBpbmZsdWVuY2UgaG93IGFuIG9iamVjdCB1c2luZyB0aGlzIG5vZGUgbWF0ZXJpYWxcclxuXHRcdCAqIGNhc3RzIHNoYWRvd3MuIFRvIGFwcGx5IGEgY29sb3IgdG8gc2hhZG93cywgeW91IGNhbiBzaW1wbHkgZG86XHJcblx0XHQgKlxyXG5cdFx0ICogYGBganNcclxuXHRcdCAqIG1hdGVyaWFsLmNhc3RTaGFkb3dOb2RlID0gdmVjNCggMSwgMCwgMCwgMSApO1xyXG5cdFx0ICogYGBgXHJcblx0XHQgKlxyXG5cdFx0ICogV2hpY2ggY2FuIGJlIG5pY2UgdG8gZmFrZSBjb2xvcmVkIHNoYWRvd3Mgb2Ygc2VtaS10cmFuc3BhcmVudCBvYmplY3RzLiBJdFxyXG5cdFx0ICogaXMgYWxzbyBjb21tb24gdG8gdXNlIHRoZSBwcm9wZXJ0eSB3aXRoIGBGbmAgZnVuY3Rpb24gc28gY2hlY2tzIGFyZSBwZXJmb3JtZWRcclxuXHRcdCAqIHBlciBmcmFnbWVudC5cclxuXHRcdCAqXHJcblx0XHQgKiBgYGBqc1xyXG5cdFx0ICogbWF0ZXJpYWxDdXN0b21TaGFkb3cuY2FzdFNoYWRvd05vZGUgPSBGbiggKCkgPT4ge1xyXG5cdFx0ICogXHRoYXNoKCB2ZXJ0ZXhJbmRleCApLmdyZWF0ZXJUaGFuKCAwLjUgKS5kaXNjYXJkKCk7XHJcblx0XHQgKiBcdHJldHVybiBtYXRlcmlhbENvbG9yO1xyXG5cdFx0ICogfSApKCk7XHJcblx0XHQgKiAgYGBgXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPHZlYzQ+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNhc3RTaGFkb3dOb2RlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgbm9kZSBjYW4gYmUgdXNlZCB0byBkZWZpbmUgdGhlIGZpbmFsIG91dHB1dCBvZiB0aGUgbWF0ZXJpYWwuXHJcblx0XHQgKlxyXG5cdFx0ICogVE9ETzogRXhwbGFpbiB0aGUgZGlmZmVyZW5jZXMgdG8gYGZyYWdtZW50Tm9kZWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPHZlYzQ+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm91dHB1dE5vZGUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogTVJUIGNvbmZpZ3VyYXRpb24gaXMgZG9uZSBvbiByZW5kZXJlciBvciBwYXNzIGxldmVsLiBUaGlzIG5vZGUgYWxsb3dzIHRvXHJcblx0XHQgKiBvdmVyd3JpdGUgd2hhdCB2YWx1ZXMgYXJlIHdyaXR0ZW4gaW50byBNUlQgdGFyZ2V0cyBvbiBtYXRlcmlhbCBsZXZlbC4gVGhpc1xyXG5cdFx0ICogY2FuIGJlIHVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nIHNlbGVjdGl2ZSBGWCBmZWF0dXJlcyB0aGF0IHNob3VsZCBvbmx5IGFmZmVjdFxyXG5cdFx0ICogc3BlY2lmaWMgb2JqZWN0cy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P01SVE5vZGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubXJ0Tm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIG5vZGUgcHJvcGVydHkgY2FuIGJlIHVzZWQgaWYgeW91IG5lZWQgY29tcGxldGUgZnJlZWRvbSBpbiBpbXBsZW1lbnRpbmdcclxuXHRcdCAqIHRoZSBmcmFnbWVudCBzaGFkZXIuIEFzc2lnbmluZyBhIG5vZGUgd2lsbCByZXBsYWNlIHRoZSBidWlsdC1pbiBtYXRlcmlhbFxyXG5cdFx0ICogbG9naWMgdXNlZCBpbiB0aGUgZnJhZ21lbnQgc3RhZ2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPHZlYzQ+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZyYWdtZW50Tm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIG5vZGUgcHJvcGVydHkgY2FuIGJlIHVzZWQgaWYgeW91IG5lZWQgY29tcGxldGUgZnJlZWRvbSBpbiBpbXBsZW1lbnRpbmdcclxuXHRcdCAqIHRoZSB2ZXJ0ZXggc2hhZGVyLiBBc3NpZ25pbmcgYSBub2RlIHdpbGwgcmVwbGFjZSB0aGUgYnVpbHQtaW4gbWF0ZXJpYWwgbG9naWNcclxuXHRcdCAqIHVzZWQgaW4gdGhlIHZlcnRleCBzdGFnZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGU8dmVjND59XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudmVydGV4Tm9kZSA9IG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWxsb3dzIHRvIGRlZmluZSBhIGN1c3RvbSBjYWNoZSBrZXkgdGhhdCBpbmZsdWVuY2UgdGhlIG1hdGVyaWFsIGtleSBjb21wdXRhdGlvblxyXG5cdCAqIGZvciByZW5kZXIgb2JqZWN0cy5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGN1c3RvbSBjYWNoZSBrZXkuXHJcblx0ICovXHJcblx0Y3VzdG9tUHJvZ3JhbUNhY2hlS2V5KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnR5cGUgKyBnZXRDYWNoZUtleSggdGhpcyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEJ1aWxkcyB0aGlzIG1hdGVyaWFsIHdpdGggdGhlIGdpdmVuIG5vZGUgYnVpbGRlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICovXHJcblx0YnVpbGQoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0dGhpcy5zZXR1cCggYnVpbGRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHVwcyBhIG5vZGUgbWF0ZXJpYWwgb2JzZXJ2ZXIgd2l0aCB0aGUgZ2l2ZW4gYnVpbGRlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7Tm9kZU1hdGVyaWFsT2JzZXJ2ZXJ9IFRoZSBub2RlIG1hdGVyaWFsIG9ic2VydmVyLlxyXG5cdCAqL1xyXG5cdHNldHVwT2JzZXJ2ZXIoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBOb2RlTWF0ZXJpYWxPYnNlcnZlciggYnVpbGRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHVwcyB0aGUgdmVydGV4IGFuZCBmcmFnbWVudCBzdGFnZSBvZiB0aGlzIG5vZGUgbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqL1xyXG5cdHNldHVwKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGJ1aWxkZXIuY29udGV4dC5zZXR1cE5vcm1hbCA9ICgpID0+IHRoaXMuc2V0dXBOb3JtYWwoIGJ1aWxkZXIgKTtcclxuXHRcdGJ1aWxkZXIuY29udGV4dC5zZXR1cFBvc2l0aW9uVmlldyA9ICgpID0+IHRoaXMuc2V0dXBQb3NpdGlvblZpZXcoIGJ1aWxkZXIgKTtcclxuXHRcdGJ1aWxkZXIuY29udGV4dC5zZXR1cE1vZGVsVmlld1Byb2plY3Rpb24gPSAoKSA9PiB0aGlzLnNldHVwTW9kZWxWaWV3UHJvamVjdGlvbiggYnVpbGRlciApO1xyXG5cclxuXHRcdGNvbnN0IHJlbmRlcmVyID0gYnVpbGRlci5yZW5kZXJlcjtcclxuXHRcdGNvbnN0IHJlbmRlclRhcmdldCA9IHJlbmRlcmVyLmdldFJlbmRlclRhcmdldCgpO1xyXG5cclxuXHRcdC8vIDwgVkVSVEVYIFNUQUdFID5cclxuXHJcblx0XHRidWlsZGVyLmFkZFN0YWNrKCk7XHJcblxyXG5cdFx0Y29uc3QgdmVydGV4Tm9kZSA9IHRoaXMudmVydGV4Tm9kZSB8fCB0aGlzLnNldHVwVmVydGV4KCBidWlsZGVyICk7XHJcblxyXG5cdFx0YnVpbGRlci5zdGFjay5vdXRwdXROb2RlID0gdmVydGV4Tm9kZTtcclxuXHJcblx0XHR0aGlzLnNldHVwSGFyZHdhcmVDbGlwcGluZyggYnVpbGRlciApO1xyXG5cclxuXHRcdGlmICggdGhpcy5nZW9tZXRyeU5vZGUgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRidWlsZGVyLnN0YWNrLm91dHB1dE5vZGUgPSBidWlsZGVyLnN0YWNrLm91dHB1dE5vZGUuYnlwYXNzKCB0aGlzLmdlb21ldHJ5Tm9kZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRidWlsZGVyLmFkZEZsb3coICd2ZXJ0ZXgnLCBidWlsZGVyLnJlbW92ZVN0YWNrKCkgKTtcclxuXHJcblx0XHQvLyA8IEZSQUdNRU5UIFNUQUdFID5cclxuXHJcblx0XHRidWlsZGVyLmFkZFN0YWNrKCk7XHJcblxyXG5cdFx0bGV0IHJlc3VsdE5vZGU7XHJcblxyXG5cdFx0Y29uc3QgY2xpcHBpbmdOb2RlID0gdGhpcy5zZXR1cENsaXBwaW5nKCBidWlsZGVyICk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmRlcHRoV3JpdGUgPT09IHRydWUgfHwgdGhpcy5kZXB0aFRlc3QgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHQvLyBvbmx5IHdyaXRlIGRlcHRoIGlmIGRlcHRoIGJ1ZmZlciBpcyBjb25maWd1cmVkXHJcblxyXG5cdFx0XHRpZiAoIHJlbmRlclRhcmdldCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0aWYgKCByZW5kZXJUYXJnZXQuZGVwdGhCdWZmZXIgPT09IHRydWUgKSB0aGlzLnNldHVwRGVwdGgoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGlmICggcmVuZGVyZXIuZGVwdGggPT09IHRydWUgKSB0aGlzLnNldHVwRGVwdGgoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aGlzLmZyYWdtZW50Tm9kZSA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuc2V0dXBEaWZmdXNlQ29sb3IoIGJ1aWxkZXIgKTtcclxuXHRcdFx0dGhpcy5zZXR1cFZhcmlhbnRzKCBidWlsZGVyICk7XHJcblxyXG5cdFx0XHRjb25zdCBvdXRnb2luZ0xpZ2h0Tm9kZSA9IHRoaXMuc2V0dXBMaWdodGluZyggYnVpbGRlciApO1xyXG5cclxuXHRcdFx0aWYgKCBjbGlwcGluZ05vZGUgIT09IG51bGwgKSBidWlsZGVyLnN0YWNrLmFkZCggY2xpcHBpbmdOb2RlICk7XHJcblxyXG5cdFx0XHQvLyBmb3JjZSB1bnNpZ25lZCBmbG9hdHMgLSB1c2VmdWwgZm9yIFJlbmRlclRhcmdldHNcclxuXHJcblx0XHRcdGNvbnN0IGJhc2ljT3V0cHV0ID0gdmVjNCggb3V0Z29pbmdMaWdodE5vZGUsIGRpZmZ1c2VDb2xvci5hICkubWF4KCAwICk7XHJcblxyXG5cdFx0XHRyZXN1bHROb2RlID0gdGhpcy5zZXR1cE91dHB1dCggYnVpbGRlciwgYmFzaWNPdXRwdXQgKTtcclxuXHJcblx0XHRcdC8vIE9VVFBVVCBOT0RFXHJcblxyXG5cdFx0XHRvdXRwdXQuYXNzaWduKCByZXN1bHROb2RlICk7XHJcblxyXG5cdFx0XHQvL1xyXG5cclxuXHRcdFx0Y29uc3QgaXNDdXN0b21PdXRwdXQgPSB0aGlzLm91dHB1dE5vZGUgIT09IG51bGw7XHJcblxyXG5cdFx0XHRpZiAoIGlzQ3VzdG9tT3V0cHV0ICkgcmVzdWx0Tm9kZSA9IHRoaXMub3V0cHV0Tm9kZTtcclxuXHJcblx0XHRcdC8vIE1SVFxyXG5cclxuXHRcdFx0aWYgKCByZW5kZXJUYXJnZXQgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IG1ydCA9IHJlbmRlcmVyLmdldE1SVCgpO1xyXG5cdFx0XHRcdGNvbnN0IG1hdGVyaWFsTVJUID0gdGhpcy5tcnROb2RlO1xyXG5cclxuXHRcdFx0XHRpZiAoIG1ydCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGlzQ3VzdG9tT3V0cHV0ICkgb3V0cHV0LmFzc2lnbiggcmVzdWx0Tm9kZSApO1xyXG5cclxuXHRcdFx0XHRcdHJlc3VsdE5vZGUgPSBtcnQ7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBtYXRlcmlhbE1SVCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHRcdHJlc3VsdE5vZGUgPSBtcnQubWVyZ2UoIG1hdGVyaWFsTVJUICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbE1SVCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHRyZXN1bHROb2RlID0gbWF0ZXJpYWxNUlQ7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0bGV0IGZyYWdtZW50Tm9kZSA9IHRoaXMuZnJhZ21lbnROb2RlO1xyXG5cclxuXHRcdFx0aWYgKCBmcmFnbWVudE5vZGUuaXNPdXRwdXRTdHJ1Y3ROb2RlICE9PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRmcmFnbWVudE5vZGUgPSB2ZWM0KCBmcmFnbWVudE5vZGUgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJlc3VsdE5vZGUgPSB0aGlzLnNldHVwT3V0cHV0KCBidWlsZGVyLCBmcmFnbWVudE5vZGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0YnVpbGRlci5zdGFjay5vdXRwdXROb2RlID0gcmVzdWx0Tm9kZTtcclxuXHJcblx0XHRidWlsZGVyLmFkZEZsb3coICdmcmFnbWVudCcsIGJ1aWxkZXIucmVtb3ZlU3RhY2soKSApO1xyXG5cclxuXHRcdC8vIDwgT0JTRVJWRVIgPlxyXG5cclxuXHRcdGJ1aWxkZXIub2JzZXJ2ZXIgPSB0aGlzLnNldHVwT2JzZXJ2ZXIoIGJ1aWxkZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXR1cHMgdGhlIGNsaXBwaW5nIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge0NsaXBwaW5nTm9kZX0gVGhlIGNsaXBwaW5nIG5vZGUuXHJcblx0ICovXHJcblx0c2V0dXBDbGlwcGluZyggYnVpbGRlciApIHtcclxuXHJcblx0XHRpZiAoIGJ1aWxkZXIuY2xpcHBpbmdDb250ZXh0ID09PSBudWxsICkgcmV0dXJuIG51bGw7XHJcblxyXG5cdFx0Y29uc3QgeyB1bmlvblBsYW5lcywgaW50ZXJzZWN0aW9uUGxhbmVzIH0gPSBidWlsZGVyLmNsaXBwaW5nQ29udGV4dDtcclxuXHJcblx0XHRsZXQgcmVzdWx0ID0gbnVsbDtcclxuXHJcblx0XHRpZiAoIHVuaW9uUGxhbmVzLmxlbmd0aCA+IDAgfHwgaW50ZXJzZWN0aW9uUGxhbmVzLmxlbmd0aCA+IDAgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBzYW1wbGVzID0gYnVpbGRlci5yZW5kZXJlci5zYW1wbGVzO1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLmFscGhhVG9Db3ZlcmFnZSAmJiBzYW1wbGVzID4gMSApIHtcclxuXHJcblx0XHRcdFx0Ly8gdG8gYmUgYWRkZWQgdG8gZmxvdyB3aGVuIHRoZSBjb2xvci9hbHBoYSB2YWx1ZSBoYXMgYmVlbiBkZXRlcm1pbmVkXHJcblx0XHRcdFx0cmVzdWx0ID0gY2xpcHBpbmdBbHBoYSgpO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0YnVpbGRlci5zdGFjay5hZGQoIGNsaXBwaW5nKCkgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXR1cHMgdGhlIGhhcmR3YXJlIGNsaXBwaW5nIGlmIGF2YWlsYWJsZSBvbiB0aGUgY3VycmVudCBkZXZpY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqL1xyXG5cdHNldHVwSGFyZHdhcmVDbGlwcGluZyggYnVpbGRlciApIHtcclxuXHJcblx0XHR0aGlzLmhhcmR3YXJlQ2xpcHBpbmcgPSBmYWxzZTtcclxuXHJcblx0XHRpZiAoIGJ1aWxkZXIuY2xpcHBpbmdDb250ZXh0ID09PSBudWxsICkgcmV0dXJuO1xyXG5cclxuXHRcdGNvbnN0IGNhbmRpZGF0ZUNvdW50ID0gYnVpbGRlci5jbGlwcGluZ0NvbnRleHQudW5pb25QbGFuZXMubGVuZ3RoO1xyXG5cclxuXHRcdC8vIDggcGxhbmVzIHN1cHBvcnRlZCBieSBXZWJHTCBBTkdMRV9jbGlwX2N1bGxfZGlzdGFuY2UgYW5kIFdlYkdQVSBjbGlwLWRpc3RhbmNlc1xyXG5cclxuXHRcdGlmICggY2FuZGlkYXRlQ291bnQgPiAwICYmIGNhbmRpZGF0ZUNvdW50IDw9IDggJiYgYnVpbGRlci5pc0F2YWlsYWJsZSggJ2NsaXBEaXN0YW5jZScgKSApIHtcclxuXHJcblx0XHRcdGJ1aWxkZXIuc3RhY2suYWRkKCBoYXJkd2FyZUNsaXBwaW5nKCkgKTtcclxuXHJcblx0XHRcdHRoaXMuaGFyZHdhcmVDbGlwcGluZyA9IHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXR1cHMgdGhlIGRlcHRoIG9mIHRoaXMgbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqL1xyXG5cdHNldHVwRGVwdGgoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyByZW5kZXJlciwgY2FtZXJhIH0gPSBidWlsZGVyO1xyXG5cclxuXHRcdC8vIERlcHRoXHJcblxyXG5cdFx0bGV0IGRlcHRoTm9kZSA9IHRoaXMuZGVwdGhOb2RlO1xyXG5cclxuXHRcdGlmICggZGVwdGhOb2RlID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0Y29uc3QgbXJ0ID0gcmVuZGVyZXIuZ2V0TVJUKCk7XHJcblxyXG5cdFx0XHRpZiAoIG1ydCAmJiBtcnQuaGFzKCAnZGVwdGgnICkgKSB7XHJcblxyXG5cdFx0XHRcdGRlcHRoTm9kZSA9IG1ydC5nZXQoICdkZXB0aCcgKTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIHJlbmRlcmVyLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggY2FtZXJhLmlzUGVyc3BlY3RpdmVDYW1lcmEgKSB7XHJcblxyXG5cdFx0XHRcdFx0ZGVwdGhOb2RlID0gdmlld1pUb0xvZ2FyaXRobWljRGVwdGgoIHBvc2l0aW9uVmlldy56LCBjYW1lcmFOZWFyLCBjYW1lcmFGYXIgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRkZXB0aE5vZGUgPSB2aWV3WlRvT3J0aG9ncmFwaGljRGVwdGgoIHBvc2l0aW9uVmlldy56LCBjYW1lcmFOZWFyLCBjYW1lcmFGYXIgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGRlcHRoTm9kZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGRlcHRoLmFzc2lnbiggZGVwdGhOb2RlICkuYXBwZW5kKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHVwcyB0aGUgcG9zaXRpb24gbm9kZSBpbiB2aWV3IHNwYWNlLiBUaGlzIG1ldGhvZCBleGlzdHNcclxuXHQgKiBzbyBkZXJpdmVkIG5vZGUgbWF0ZXJpYWxzIGNhbiBtb2RpZnkgdGhlIGltcGxlbWVudGF0aW9uIGUuZy4gc3ByaXRlIG1hdGVyaWFscy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7Tm9kZTx2ZWMzPn0gVGhlIHBvc2l0aW9uIGluIHZpZXcgc3BhY2UuXHJcblx0ICovXHJcblx0c2V0dXBQb3NpdGlvblZpZXcoIC8qYnVpbGRlciovICkge1xyXG5cclxuXHRcdHJldHVybiBtb2RlbFZpZXdNYXRyaXgubXVsKCBwb3NpdGlvbkxvY2FsICkueHl6O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHVwcyB0aGUgcG9zaXRpb24gaW4gY2xpcCBzcGFjZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7Tm9kZTx2ZWM0Pn0gVGhlIHBvc2l0aW9uIGluIHZpZXcgc3BhY2UuXHJcblx0ICovXHJcblx0c2V0dXBNb2RlbFZpZXdQcm9qZWN0aW9uKCAvKmJ1aWxkZXIqLyApIHtcclxuXHJcblx0XHRyZXR1cm4gY2FtZXJhUHJvamVjdGlvbk1hdHJpeC5tdWwoIHBvc2l0aW9uVmlldyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHVwcyB0aGUgbG9naWMgZm9yIHRoZSB2ZXJ0ZXggc3RhZ2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge05vZGU8dmVjND59IFRoZSBwb3NpdGlvbiBpbiBjbGlwIHNwYWNlLlxyXG5cdCAqL1xyXG5cdHNldHVwVmVydGV4KCBidWlsZGVyICkge1xyXG5cclxuXHRcdGJ1aWxkZXIuYWRkU3RhY2soKTtcclxuXHJcblx0XHR0aGlzLnNldHVwUG9zaXRpb24oIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRidWlsZGVyLmNvbnRleHQudmVydGV4ID0gYnVpbGRlci5yZW1vdmVTdGFjaygpO1xyXG5cclxuXHRcdHJldHVybiBtb2RlbFZpZXdQcm9qZWN0aW9uO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHVwcyB0aGUgY29tcHV0YXRpb24gb2YgdGhlIHBvc2l0aW9uIGluIGxvY2FsIHNwYWNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtOb2RlPHZlYzM+fSBUaGUgcG9zaXRpb24gaW4gbG9jYWwgc3BhY2UuXHJcblx0ICovXHJcblx0c2V0dXBQb3NpdGlvbiggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCB7IG9iamVjdCwgZ2VvbWV0cnkgfSA9IGJ1aWxkZXI7XHJcblxyXG5cdFx0aWYgKCBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24gfHwgZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbCB8fCBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMuY29sb3IgKSB7XHJcblxyXG5cdFx0XHRtb3JwaFJlZmVyZW5jZSggb2JqZWN0ICkuYXBwZW5kKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggb2JqZWN0LmlzU2tpbm5lZE1lc2ggPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRza2lubmluZyggb2JqZWN0ICkuYXBwZW5kKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy5kaXNwbGFjZW1lbnRNYXAgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBkaXNwbGFjZW1lbnRNYXAgPSBtYXRlcmlhbFJlZmVyZW5jZSggJ2Rpc3BsYWNlbWVudE1hcCcsICd0ZXh0dXJlJyApO1xyXG5cdFx0XHRjb25zdCBkaXNwbGFjZW1lbnRTY2FsZSA9IG1hdGVyaWFsUmVmZXJlbmNlKCAnZGlzcGxhY2VtZW50U2NhbGUnLCAnZmxvYXQnICk7XHJcblx0XHRcdGNvbnN0IGRpc3BsYWNlbWVudEJpYXMgPSBtYXRlcmlhbFJlZmVyZW5jZSggJ2Rpc3BsYWNlbWVudEJpYXMnLCAnZmxvYXQnICk7XHJcblxyXG5cdFx0XHRwb3NpdGlvbkxvY2FsLmFkZEFzc2lnbiggbm9ybWFsTG9jYWwubm9ybWFsaXplKCkubXVsKCAoIGRpc3BsYWNlbWVudE1hcC54Lm11bCggZGlzcGxhY2VtZW50U2NhbGUgKS5hZGQoIGRpc3BsYWNlbWVudEJpYXMgKSApICkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBvYmplY3QuaXNCYXRjaGVkTWVzaCApIHtcclxuXHJcblx0XHRcdGJhdGNoKCBvYmplY3QgKS5hcHBlbmQoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCAoIG9iamVjdC5pc0luc3RhbmNlZE1lc2ggJiYgb2JqZWN0Lmluc3RhbmNlTWF0cml4ICYmIG9iamVjdC5pbnN0YW5jZU1hdHJpeC5pc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSA9PT0gdHJ1ZSApICkge1xyXG5cclxuXHRcdFx0aW5zdGFuY2VkTWVzaCggb2JqZWN0ICkuYXBwZW5kKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy5wb3NpdGlvbk5vZGUgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRwb3NpdGlvbkxvY2FsLmFzc2lnbiggdGhpcy5wb3NpdGlvbk5vZGUuY29udGV4dCggeyBpc1Bvc2l0aW9uTm9kZUlucHV0OiB0cnVlIH0gKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcG9zaXRpb25Mb2NhbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXR1cHMgdGhlIGNvbXB1dGF0aW9uIG9mIHRoZSBtYXRlcmlhbCdzIGRpZmZ1c2UgY29sb3IuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyR2VvbWV0cnl9IGdlb21ldHJ5IC0gVGhlIGdlb21ldHJ5LlxyXG5cdCAqL1xyXG5cdHNldHVwRGlmZnVzZUNvbG9yKCB7IG9iamVjdCwgZ2VvbWV0cnkgfSApIHtcclxuXHJcblx0XHRsZXQgY29sb3JOb2RlID0gdGhpcy5jb2xvck5vZGUgPyB2ZWM0KCB0aGlzLmNvbG9yTm9kZSApIDogbWF0ZXJpYWxDb2xvcjtcclxuXHJcblx0XHQvLyBWRVJURVggQ09MT1JTXHJcblxyXG5cdFx0aWYgKCB0aGlzLnZlcnRleENvbG9ycyA9PT0gdHJ1ZSAmJiBnZW9tZXRyeS5oYXNBdHRyaWJ1dGUoICdjb2xvcicgKSApIHtcclxuXHJcblx0XHRcdGNvbG9yTm9kZSA9IHZlYzQoIGNvbG9yTm9kZS54eXoubXVsKCBhdHRyaWJ1dGUoICdjb2xvcicsICd2ZWMzJyApICksIGNvbG9yTm9kZS5hICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEluc3RhbmNlZCBjb2xvcnNcclxuXHJcblx0XHRpZiAoIG9iamVjdC5pbnN0YW5jZUNvbG9yICkge1xyXG5cclxuXHRcdFx0Y29uc3QgaW5zdGFuY2VDb2xvciA9IHZhcnlpbmdQcm9wZXJ0eSggJ3ZlYzMnLCAndkluc3RhbmNlQ29sb3InICk7XHJcblxyXG5cdFx0XHRjb2xvck5vZGUgPSBpbnN0YW5jZUNvbG9yLm11bCggY29sb3JOb2RlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggb2JqZWN0LmlzQmF0Y2hlZE1lc2ggJiYgb2JqZWN0Ll9jb2xvcnNUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYmF0Y2hDb2xvciA9IHZhcnlpbmdQcm9wZXJ0eSggJ3ZlYzMnLCAndkJhdGNoQ29sb3InICk7XHJcblxyXG5cdFx0XHRjb2xvck5vZGUgPSBiYXRjaENvbG9yLm11bCggY29sb3JOb2RlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHJcblx0XHQvLyBDT0xPUlxyXG5cclxuXHRcdGRpZmZ1c2VDb2xvci5hc3NpZ24oIGNvbG9yTm9kZSApO1xyXG5cclxuXHRcdC8vIE9QQUNJVFlcclxuXHJcblx0XHRjb25zdCBvcGFjaXR5Tm9kZSA9IHRoaXMub3BhY2l0eU5vZGUgPyBmbG9hdCggdGhpcy5vcGFjaXR5Tm9kZSApIDogbWF0ZXJpYWxPcGFjaXR5O1xyXG5cdFx0ZGlmZnVzZUNvbG9yLmEuYXNzaWduKCBkaWZmdXNlQ29sb3IuYS5tdWwoIG9wYWNpdHlOb2RlICkgKTtcclxuXHJcblx0XHQvLyBBTFBIQSBURVNUXHJcblxyXG5cdFx0aWYgKCB0aGlzLmFscGhhVGVzdE5vZGUgIT09IG51bGwgfHwgdGhpcy5hbHBoYVRlc3QgPiAwICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYWxwaGFUZXN0Tm9kZSA9IHRoaXMuYWxwaGFUZXN0Tm9kZSAhPT0gbnVsbCA/IGZsb2F0KCB0aGlzLmFscGhhVGVzdE5vZGUgKSA6IG1hdGVyaWFsQWxwaGFUZXN0O1xyXG5cclxuXHRcdFx0ZGlmZnVzZUNvbG9yLmEubGVzc1RoYW5FcXVhbCggYWxwaGFUZXN0Tm9kZSApLmRpc2NhcmQoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQUxQSEEgSEFTSFxyXG5cclxuXHRcdGlmICggdGhpcy5hbHBoYUhhc2ggPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRkaWZmdXNlQ29sb3IuYS5sZXNzVGhhbiggZ2V0QWxwaGFIYXNoVGhyZXNob2xkKCBwb3NpdGlvbkxvY2FsICkgKS5kaXNjYXJkKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy50cmFuc3BhcmVudCA9PT0gZmFsc2UgJiYgdGhpcy5ibGVuZGluZyA9PT0gTm9ybWFsQmxlbmRpbmcgJiYgdGhpcy5hbHBoYVRvQ292ZXJhZ2UgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0ZGlmZnVzZUNvbG9yLmEuYXNzaWduKCAxLjAgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWJzdHJhY3QgaW50ZXJmYWNlIG1ldGhvZCB0aGF0IGNhbiBiZSBpbXBsZW1lbnRlZCBieSBkZXJpdmVkIG1hdGVyaWFsc1xyXG5cdCAqIHRvIHNldHVwIG1hdGVyaWFsLXNwZWNpZmljIG5vZGUgdmFyaWFibGVzLlxyXG5cdCAqXHJcblx0ICogQGFic3RyYWN0XHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKi9cclxuXHRzZXR1cFZhcmlhbnRzKCAvKmJ1aWxkZXIqLyApIHtcclxuXHJcblx0XHQvLyBJbnRlcmZhY2UgZnVuY3Rpb24uXHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0dXBzIHRoZSBvdXRnb2luZyBsaWdodCBub2RlIHZhcmlhYmxlXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtOb2RlPHZlYzM+fSBUaGUgb3V0Z29pbmcgbGlnaHQgbm9kZS5cclxuXHQgKi9cclxuXHRzZXR1cE91dGdvaW5nTGlnaHQoKSB7XHJcblxyXG5cdFx0cmV0dXJuICggdGhpcy5saWdodHMgPT09IHRydWUgKSA/IHZlYzMoIDAgKSA6IGRpZmZ1c2VDb2xvci5yZ2I7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0dXBzIHRoZSBub3JtYWwgbm9kZSBmcm9tIHRoZSBtYXRlcmlhbC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge05vZGU8dmVjMz59IFRoZSBub3JtYWwgbm9kZS5cclxuXHQgKi9cclxuXHRzZXR1cE5vcm1hbCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5ub3JtYWxOb2RlID8gdmVjMyggdGhpcy5ub3JtYWxOb2RlICkgOiBtYXRlcmlhbE5vcm1hbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXR1cHMgdGhlIGVudmlyb25tZW50IG5vZGUgZnJvbSB0aGUgbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge05vZGU8dmVjND59IFRoZSBlbnZpcm9ubWVudCBub2RlLlxyXG5cdCAqL1xyXG5cdHNldHVwRW52aXJvbm1lbnQoIC8qYnVpbGRlciovICkge1xyXG5cclxuXHRcdGxldCBub2RlID0gbnVsbDtcclxuXHJcblx0XHRpZiAoIHRoaXMuZW52Tm9kZSApIHtcclxuXHJcblx0XHRcdG5vZGUgPSB0aGlzLmVudk5vZGU7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggdGhpcy5lbnZNYXAgKSB7XHJcblxyXG5cdFx0XHRub2RlID0gdGhpcy5lbnZNYXAuaXNDdWJlVGV4dHVyZSA/IG1hdGVyaWFsUmVmZXJlbmNlKCAnZW52TWFwJywgJ2N1YmVUZXh0dXJlJyApIDogbWF0ZXJpYWxSZWZlcmVuY2UoICdlbnZNYXAnLCAndGV4dHVyZScgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG5vZGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0dXBzIHRoZSBsaWdodCBtYXAgbm9kZSBmcm9tIHRoZSBtYXRlcmlhbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7Tm9kZTx2ZWMzPn0gVGhlIGxpZ2h0IG1hcCBub2RlLlxyXG5cdCAqL1xyXG5cdHNldHVwTGlnaHRNYXAoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0bGV0IG5vZGUgPSBudWxsO1xyXG5cclxuXHRcdGlmICggYnVpbGRlci5tYXRlcmlhbC5saWdodE1hcCApIHtcclxuXHJcblx0XHRcdG5vZGUgPSBuZXcgSXJyYWRpYW5jZU5vZGUoIG1hdGVyaWFsTGlnaHRNYXAgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG5vZGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0dXBzIHRoZSBsaWdodHMgbm9kZSBiYXNlZCBvbiB0aGUgc2NlbmUsIGVudmlyb25tZW50IGFuZCBtYXRlcmlhbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7TGlnaHRzTm9kZX0gVGhlIGxpZ2h0cyBub2RlLlxyXG5cdCAqL1xyXG5cdHNldHVwTGlnaHRzKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IG1hdGVyaWFsTGlnaHRzTm9kZSA9IFtdO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0Y29uc3QgZW52Tm9kZSA9IHRoaXMuc2V0dXBFbnZpcm9ubWVudCggYnVpbGRlciApO1xyXG5cclxuXHRcdGlmICggZW52Tm9kZSAmJiBlbnZOb2RlLmlzTGlnaHRpbmdOb2RlICkge1xyXG5cclxuXHRcdFx0bWF0ZXJpYWxMaWdodHNOb2RlLnB1c2goIGVudk5vZGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgbGlnaHRNYXBOb2RlID0gdGhpcy5zZXR1cExpZ2h0TWFwKCBidWlsZGVyICk7XHJcblxyXG5cdFx0aWYgKCBsaWdodE1hcE5vZGUgJiYgbGlnaHRNYXBOb2RlLmlzTGlnaHRpbmdOb2RlICkge1xyXG5cclxuXHRcdFx0bWF0ZXJpYWxMaWdodHNOb2RlLnB1c2goIGxpZ2h0TWFwTm9kZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMuYW9Ob2RlICE9PSBudWxsIHx8IGJ1aWxkZXIubWF0ZXJpYWwuYW9NYXAgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBhb05vZGUgPSB0aGlzLmFvTm9kZSAhPT0gbnVsbCA/IHRoaXMuYW9Ob2RlIDogbWF0ZXJpYWxBTztcclxuXHJcblx0XHRcdG1hdGVyaWFsTGlnaHRzTm9kZS5wdXNoKCBuZXcgQU9Ob2RlKCBhb05vZGUgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRsZXQgbGlnaHRzTiA9IHRoaXMubGlnaHRzTm9kZSB8fCBidWlsZGVyLmxpZ2h0c05vZGU7XHJcblxyXG5cdFx0aWYgKCBtYXRlcmlhbExpZ2h0c05vZGUubGVuZ3RoID4gMCApIHtcclxuXHJcblx0XHRcdGxpZ2h0c04gPSBidWlsZGVyLnJlbmRlcmVyLmxpZ2h0aW5nLmNyZWF0ZU5vZGUoIFsgLi4ubGlnaHRzTi5nZXRMaWdodHMoKSwgLi4ubWF0ZXJpYWxMaWdodHNOb2RlIF0gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGxpZ2h0c047XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5IG1vc3QgZGVyaXZlZCBtYXRlcmlhbHNcclxuXHQgKiBzaW5jZSBpdCBkZWZpbmVzIHRoZSBtYXRlcmlhbCdzIGxpZ2h0aW5nIG1vZGVsLlxyXG5cdCAqXHJcblx0ICogQGFic3RyYWN0XHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtMaWdodGluZ01vZGVsfSBUaGUgbGlnaHRpbmcgbW9kZWwuXHJcblx0ICovXHJcblx0c2V0dXBMaWdodGluZ01vZGVsKCAvKmJ1aWxkZXIqLyApIHtcclxuXHJcblx0XHQvLyBJbnRlcmZhY2UgZnVuY3Rpb24uXHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0dXBzIHRoZSBvdXRnb2luZyBsaWdodCBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtOb2RlPHZlYzM+fSBUaGUgb3V0Z29pbmcgbGlnaHQgbm9kZS5cclxuXHQgKi9cclxuXHRzZXR1cExpZ2h0aW5nKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IHsgbWF0ZXJpYWwgfSA9IGJ1aWxkZXI7XHJcblx0XHRjb25zdCB7IGJhY2tkcm9wTm9kZSwgYmFja2Ryb3BBbHBoYU5vZGUsIGVtaXNzaXZlTm9kZSB9ID0gdGhpcztcclxuXHJcblx0XHQvLyBPVVRHT0lORyBMSUdIVFxyXG5cclxuXHRcdGNvbnN0IGxpZ2h0cyA9IHRoaXMubGlnaHRzID09PSB0cnVlIHx8IHRoaXMubGlnaHRzTm9kZSAhPT0gbnVsbDtcclxuXHJcblx0XHRjb25zdCBsaWdodHNOb2RlID0gbGlnaHRzID8gdGhpcy5zZXR1cExpZ2h0cyggYnVpbGRlciApIDogbnVsbDtcclxuXHJcblx0XHRsZXQgb3V0Z29pbmdMaWdodE5vZGUgPSB0aGlzLnNldHVwT3V0Z29pbmdMaWdodCggYnVpbGRlciApO1xyXG5cclxuXHRcdGlmICggbGlnaHRzTm9kZSAmJiBsaWdodHNOb2RlLmdldFNjb3BlKCkuaGFzTGlnaHRzICkge1xyXG5cclxuXHRcdFx0Y29uc3QgbGlnaHRpbmdNb2RlbCA9IHRoaXMuc2V0dXBMaWdodGluZ01vZGVsKCBidWlsZGVyICkgfHwgbnVsbDtcclxuXHJcblx0XHRcdG91dGdvaW5nTGlnaHROb2RlID0gbGlnaHRpbmdDb250ZXh0KCBsaWdodHNOb2RlLCBsaWdodGluZ01vZGVsLCBiYWNrZHJvcE5vZGUsIGJhY2tkcm9wQWxwaGFOb2RlICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggYmFja2Ryb3BOb2RlICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0b3V0Z29pbmdMaWdodE5vZGUgPSB2ZWMzKCBiYWNrZHJvcEFscGhhTm9kZSAhPT0gbnVsbCA/IG1peCggb3V0Z29pbmdMaWdodE5vZGUsIGJhY2tkcm9wTm9kZSwgYmFja2Ryb3BBbHBoYU5vZGUgKSA6IGJhY2tkcm9wTm9kZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBFTUlTU0lWRVxyXG5cclxuXHRcdGlmICggKCBlbWlzc2l2ZU5vZGUgJiYgZW1pc3NpdmVOb2RlLmlzTm9kZSA9PT0gdHJ1ZSApIHx8ICggbWF0ZXJpYWwuZW1pc3NpdmUgJiYgbWF0ZXJpYWwuZW1pc3NpdmUuaXNDb2xvciA9PT0gdHJ1ZSApICkge1xyXG5cclxuXHRcdFx0ZW1pc3NpdmUuYXNzaWduKCB2ZWMzKCBlbWlzc2l2ZU5vZGUgPyBlbWlzc2l2ZU5vZGUgOiBtYXRlcmlhbEVtaXNzaXZlICkgKTtcclxuXHJcblx0XHRcdG91dGdvaW5nTGlnaHROb2RlID0gb3V0Z29pbmdMaWdodE5vZGUuYWRkKCBlbWlzc2l2ZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gb3V0Z29pbmdMaWdodE5vZGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0dXAgdGhlIGZvZy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHBhcmFtIHtOb2RlPHZlYzQ+fSBvdXRwdXROb2RlIC0gVGhlIGV4aXN0aW5nIG91dHB1dCBub2RlLlxyXG5cdCAqIEByZXR1cm4ge05vZGU8dmVjND59IFRoZSBvdXRwdXQgbm9kZS5cclxuXHQgKi9cclxuXHRzZXR1cEZvZyggYnVpbGRlciwgb3V0cHV0Tm9kZSApIHtcclxuXHJcblx0XHRjb25zdCBmb2dOb2RlID0gYnVpbGRlci5mb2dOb2RlO1xyXG5cclxuXHRcdGlmICggZm9nTm9kZSApIHtcclxuXHJcblx0XHRcdG91dHB1dC5hc3NpZ24oIG91dHB1dE5vZGUgKTtcclxuXHJcblx0XHRcdG91dHB1dE5vZGUgPSB2ZWM0KCBmb2dOb2RlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBvdXRwdXROb2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHVwcyB0aGUgb3V0cHV0IG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEBwYXJhbSB7Tm9kZTx2ZWM0Pn0gb3V0cHV0Tm9kZSAtIFRoZSBleGlzdGluZyBvdXRwdXQgbm9kZS5cclxuXHQgKiBAcmV0dXJuIHtOb2RlPHZlYzQ+fSBUaGUgb3V0cHV0IG5vZGUuXHJcblx0ICovXHJcblx0c2V0dXBPdXRwdXQoIGJ1aWxkZXIsIG91dHB1dE5vZGUgKSB7XHJcblxyXG5cdFx0Ly8gRk9HXHJcblxyXG5cdFx0aWYgKCB0aGlzLmZvZyA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdG91dHB1dE5vZGUgPSB0aGlzLnNldHVwRm9nKCBidWlsZGVyLCBvdXRwdXROb2RlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBvdXRwdXROb2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE1vc3QgY2xhc3NpYyBtYXRlcmlhbCB0eXBlcyBoYXZlIGEgbm9kZSBwZW5kYW50IGUuZy4gZm9yIGBNZXNoQmFzaWNNYXRlcmlhbGBcclxuXHQgKiB0aGVyZSBpcyBgTWVzaEJhc2ljTm9kZU1hdGVyaWFsYC4gVGhpcyB1dGlsaXR5IG1ldGhvZCBpcyBpbnRlbmRlZCBmb3JcclxuXHQgKiBkZWZpbmluZyBhbGwgbWF0ZXJpYWwgcHJvcGVydGllcyBvZiB0aGUgY2xhc3NpYyB0eXBlIGluIHRoZSBub2RlIHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdGVyaWFsfSBtYXRlcmlhbCAtIFRoZSBtYXRlcmlhbCB0byBjb3B5IHByb3BlcnRpZXMgd2l0aCB0aGVpciB2YWx1ZXMgdG8gdGhpcyBub2RlIG1hdGVyaWFsLlxyXG5cdCAqL1xyXG5cdHNldERlZmF1bHRWYWx1ZXMoIG1hdGVyaWFsICkge1xyXG5cclxuXHRcdC8vIFRoaXMgYXBwcm9hY2ggaXMgdG8gcmV1c2UgdGhlIG5hdGl2ZSByZWZyZXNoVW5pZm9ybXMqXHJcblx0XHQvLyBhbmQgdHVybiBhdmFpbGFibGUgdGhlIHVzZSBvZiBmZWF0dXJlcyBsaWtlIHRyYW5zbWlzc2lvbiBhbmQgZW52aXJvbm1lbnQgaW4gY29yZVxyXG5cclxuXHRcdGZvciAoIGNvbnN0IHByb3BlcnR5IGluIG1hdGVyaWFsICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdmFsdWUgPSBtYXRlcmlhbFsgcHJvcGVydHkgXTtcclxuXHJcblx0XHRcdGlmICggdGhpc1sgcHJvcGVydHkgXSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHR0aGlzWyBwcm9wZXJ0eSBdID0gdmFsdWU7XHJcblxyXG5cdFx0XHRcdGlmICggdmFsdWUgJiYgdmFsdWUuY2xvbmUgKSB0aGlzWyBwcm9wZXJ0eSBdID0gdmFsdWUuY2xvbmUoKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgZGVzY3JpcHRvcnMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyggbWF0ZXJpYWwuY29uc3RydWN0b3IucHJvdG90eXBlICk7XHJcblxyXG5cdFx0Zm9yICggY29uc3Qga2V5IGluIGRlc2NyaXB0b3JzICkge1xyXG5cclxuXHRcdFx0aWYgKCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKCB0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwga2V5ICkgPT09IHVuZGVmaW5lZCAmJlxyXG5cdFx0XHQgICAgIGRlc2NyaXB0b3JzWyBrZXkgXS5nZXQgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwga2V5LCBkZXNjcmlwdG9yc1sga2V5IF0gKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2VyaWFsaXplcyB0aGlzIG1hdGVyaWFsIHRvIEpTT04uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gez8oT2JqZWN0fHN0cmluZyl9IG1ldGEgLSBUaGUgbWV0YSBpbmZvcm1hdGlvbiBmb3Igc2VyaWFsaXphdGlvbi5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBzZXJpYWxpemVkIG5vZGUuXHJcblx0ICovXHJcblx0dG9KU09OKCBtZXRhICkge1xyXG5cclxuXHRcdGNvbnN0IGlzUm9vdCA9ICggbWV0YSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBtZXRhID09PSAnc3RyaW5nJyApO1xyXG5cclxuXHRcdGlmICggaXNSb290ICkge1xyXG5cclxuXHRcdFx0bWV0YSA9IHtcclxuXHRcdFx0XHR0ZXh0dXJlczoge30sXHJcblx0XHRcdFx0aW1hZ2VzOiB7fSxcclxuXHRcdFx0XHRub2Rlczoge31cclxuXHRcdFx0fTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IE1hdGVyaWFsLnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcywgbWV0YSApO1xyXG5cdFx0Y29uc3Qgbm9kZUNoaWxkcmVuID0gZ2V0Tm9kZUNoaWxkcmVuKCB0aGlzICk7XHJcblxyXG5cdFx0ZGF0YS5pbnB1dE5vZGVzID0ge307XHJcblxyXG5cdFx0Zm9yICggY29uc3QgeyBwcm9wZXJ0eSwgY2hpbGROb2RlIH0gb2Ygbm9kZUNoaWxkcmVuICkge1xyXG5cclxuXHRcdFx0ZGF0YS5pbnB1dE5vZGVzWyBwcm9wZXJ0eSBdID0gY2hpbGROb2RlLnRvSlNPTiggbWV0YSApLnV1aWQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFRPRE86IENvcGllZCBmcm9tIE9iamVjdDNELnRvSlNPTlxyXG5cclxuXHRcdGZ1bmN0aW9uIGV4dHJhY3RGcm9tQ2FjaGUoIGNhY2hlICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdmFsdWVzID0gW107XHJcblxyXG5cdFx0XHRmb3IgKCBjb25zdCBrZXkgaW4gY2FjaGUgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGRhdGEgPSBjYWNoZVsga2V5IF07XHJcblx0XHRcdFx0ZGVsZXRlIGRhdGEubWV0YWRhdGE7XHJcblx0XHRcdFx0dmFsdWVzLnB1c2goIGRhdGEgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiB2YWx1ZXM7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggaXNSb290ICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdGV4dHVyZXMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLnRleHR1cmVzICk7XHJcblx0XHRcdGNvbnN0IGltYWdlcyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEuaW1hZ2VzICk7XHJcblx0XHRcdGNvbnN0IG5vZGVzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS5ub2RlcyApO1xyXG5cclxuXHRcdFx0aWYgKCB0ZXh0dXJlcy5sZW5ndGggPiAwICkgZGF0YS50ZXh0dXJlcyA9IHRleHR1cmVzO1xyXG5cdFx0XHRpZiAoIGltYWdlcy5sZW5ndGggPiAwICkgZGF0YS5pbWFnZXMgPSBpbWFnZXM7XHJcblx0XHRcdGlmICggbm9kZXMubGVuZ3RoID4gMCApIGRhdGEubm9kZXMgPSBub2RlcztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGRhdGE7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29waWVzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBub2RlIG1hdGVyaWFsIHRvIHRoaXMgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVNYXRlcmlhbH0gc291cmNlIC0gVGhlIG1hdGVyaWFsIHRvIGNvcHkuXHJcblx0ICogQHJldHVybiB7Tm9kZU1hdGVyaWFsfSBBIHJlZmVyZW5jZSB0byB0aGlzIG5vZGUgbWF0ZXJpYWwuXHJcblx0ICovXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHRoaXMubGlnaHRzTm9kZSA9IHNvdXJjZS5saWdodHNOb2RlO1xyXG5cdFx0dGhpcy5lbnZOb2RlID0gc291cmNlLmVudk5vZGU7XHJcblxyXG5cdFx0dGhpcy5jb2xvck5vZGUgPSBzb3VyY2UuY29sb3JOb2RlO1xyXG5cdFx0dGhpcy5ub3JtYWxOb2RlID0gc291cmNlLm5vcm1hbE5vZGU7XHJcblx0XHR0aGlzLm9wYWNpdHlOb2RlID0gc291cmNlLm9wYWNpdHlOb2RlO1xyXG5cdFx0dGhpcy5iYWNrZHJvcE5vZGUgPSBzb3VyY2UuYmFja2Ryb3BOb2RlO1xyXG5cdFx0dGhpcy5iYWNrZHJvcEFscGhhTm9kZSA9IHNvdXJjZS5iYWNrZHJvcEFscGhhTm9kZTtcclxuXHRcdHRoaXMuYWxwaGFUZXN0Tm9kZSA9IHNvdXJjZS5hbHBoYVRlc3ROb2RlO1xyXG5cclxuXHRcdHRoaXMucG9zaXRpb25Ob2RlID0gc291cmNlLnBvc2l0aW9uTm9kZTtcclxuXHRcdHRoaXMuZ2VvbWV0cnlOb2RlID0gc291cmNlLmdlb21ldHJ5Tm9kZTtcclxuXHJcblx0XHR0aGlzLmRlcHRoTm9kZSA9IHNvdXJjZS5kZXB0aE5vZGU7XHJcblx0XHR0aGlzLnNoYWRvd1Bvc2l0aW9uTm9kZSA9IHNvdXJjZS5zaGFkb3dQb3NpdGlvbk5vZGU7XHJcblx0XHR0aGlzLnJlY2VpdmVkU2hhZG93Tm9kZSA9IHNvdXJjZS5yZWNlaXZlZFNoYWRvd05vZGU7XHJcblx0XHR0aGlzLmNhc3RTaGFkb3dOb2RlID0gc291cmNlLmNhc3RTaGFkb3dOb2RlO1xyXG5cclxuXHRcdHRoaXMub3V0cHV0Tm9kZSA9IHNvdXJjZS5vdXRwdXROb2RlO1xyXG5cdFx0dGhpcy5tcnROb2RlID0gc291cmNlLm1ydE5vZGU7XHJcblxyXG5cdFx0dGhpcy5mcmFnbWVudE5vZGUgPSBzb3VyY2UuZnJhZ21lbnROb2RlO1xyXG5cdFx0dGhpcy52ZXJ0ZXhOb2RlID0gc291cmNlLnZlcnRleE5vZGU7XHJcblxyXG5cdFx0cmV0dXJuIHN1cGVyLmNvcHkoIHNvdXJjZSApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBOb2RlTWF0ZXJpYWw7XHJcbiIsImltcG9ydCBOb2RlTWF0ZXJpYWwgZnJvbSAnLi9Ob2RlTWF0ZXJpYWwuanMnO1xyXG5cclxuaW1wb3J0IHsgTGluZUJhc2ljTWF0ZXJpYWwgfSBmcm9tICcuLi9MaW5lQmFzaWNNYXRlcmlhbC5qcyc7XHJcblxyXG5jb25zdCBfZGVmYXVsdFZhbHVlcyA9IC8qQF9fUFVSRV9fKi8gbmV3IExpbmVCYXNpY01hdGVyaWFsKCk7XHJcblxyXG4vKipcclxuICogTm9kZSBtYXRlcmlhbCB2ZXJzaW9uIG9mIHtAbGluayBMaW5lQmFzaWNNYXRlcmlhbH0uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBOb2RlTWF0ZXJpYWxcclxuICovXHJcbmNsYXNzIExpbmVCYXNpY05vZGVNYXRlcmlhbCBleHRlbmRzIE5vZGVNYXRlcmlhbCB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ0xpbmVCYXNpY05vZGVNYXRlcmlhbCc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBsaW5lIGJhc2ljIG5vZGUgbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtZXRlcnNdIC0gVGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwYXJhbWV0ZXJzICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzTGluZUJhc2ljTm9kZU1hdGVyaWFsID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnNldERlZmF1bHRWYWx1ZXMoIF9kZWZhdWx0VmFsdWVzICk7XHJcblxyXG5cdFx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTGluZUJhc2ljTm9kZU1hdGVyaWFsO1xyXG4iLCJpbXBvcnQgTm9kZU1hdGVyaWFsIGZyb20gJy4vTm9kZU1hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgYXR0cmlidXRlIH0gZnJvbSAnLi4vLi4vbm9kZXMvY29yZS9BdHRyaWJ1dGVOb2RlLmpzJztcclxuaW1wb3J0IHsgbWF0ZXJpYWxMaW5lRGFzaE9mZnNldCwgbWF0ZXJpYWxMaW5lRGFzaFNpemUsIG1hdGVyaWFsTGluZUdhcFNpemUsIG1hdGVyaWFsTGluZVNjYWxlIH0gZnJvbSAnLi4vLi4vbm9kZXMvYWNjZXNzb3JzL01hdGVyaWFsTm9kZS5qcyc7XHJcbmltcG9ydCB7IGRhc2hTaXplLCBnYXBTaXplIH0gZnJvbSAnLi4vLi4vbm9kZXMvY29yZS9Qcm9wZXJ0eU5vZGUuanMnO1xyXG5pbXBvcnQgeyB2YXJ5aW5nLCBmbG9hdCB9IGZyb20gJy4uLy4uL25vZGVzL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbmltcG9ydCB7IExpbmVEYXNoZWRNYXRlcmlhbCB9IGZyb20gJy4uL0xpbmVEYXNoZWRNYXRlcmlhbC5qcyc7XHJcblxyXG5jb25zdCBfZGVmYXVsdFZhbHVlcyA9IC8qQF9fUFVSRV9fKi8gbmV3IExpbmVEYXNoZWRNYXRlcmlhbCgpO1xyXG5cclxuLyoqXHJcbiAqIE5vZGUgbWF0ZXJpYWwgdmVyc2lvbiBvZiAge0BsaW5rIExpbmVEYXNoZWRNYXRlcmlhbH0uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBOb2RlTWF0ZXJpYWxcclxuICovXHJcbmNsYXNzIExpbmVEYXNoZWROb2RlTWF0ZXJpYWwgZXh0ZW5kcyBOb2RlTWF0ZXJpYWwge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdMaW5lRGFzaGVkTm9kZU1hdGVyaWFsJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGxpbmUgZGFzaGVkIG5vZGUgbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtZXRlcnNdIC0gVGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwYXJhbWV0ZXJzICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzTGluZURhc2hlZE5vZGVNYXRlcmlhbCA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy5zZXREZWZhdWx0VmFsdWVzKCBfZGVmYXVsdFZhbHVlcyApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGRhc2ggb2Zmc2V0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGFzaE9mZnNldCA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgb2Zmc2V0IG9mIGRhc2ggbWF0ZXJpYWxzIGlzIGJ5IGRlZmF1bHQgaW5mZXJyZWQgZnJvbSB0aGUgYGRhc2hPZmZzZXRgXHJcblx0XHQgKiBwcm9wZXJ0eS4gVGhpcyBub2RlIHByb3BlcnR5IGFsbG93cyB0byBvdmVyd3JpdGUgdGhlIGRlZmF1bHRcclxuXHRcdCAqIGFuZCBkZWZpbmUgdGhlIG9mZnNldCB3aXRoIGEgbm9kZSBpbnN0ZWFkLlxyXG5cdFx0ICpcclxuXHRcdCAqIElmIHlvdSBkb24ndCB3YW50IHRvIG92ZXJ3cml0ZSB0aGUgb2Zmc2V0IGJ1dCBtb2RpZnkgdGhlIGV4aXN0aW5nXHJcblx0XHQgKiB2YWx1ZSBpbnN0ZWFkLCB1c2Uge0BsaW5rIG1hdGVyaWFsTGluZURhc2hPZmZzZXR9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Tm9kZTxmbG9hdD59XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMub2Zmc2V0Tm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc2NhbGUgb2YgZGFzaCBtYXRlcmlhbHMgaXMgYnkgZGVmYXVsdCBpbmZlcnJlZCBmcm9tIHRoZSBgc2NhbGVgXHJcblx0XHQgKiBwcm9wZXJ0eS4gVGhpcyBub2RlIHByb3BlcnR5IGFsbG93cyB0byBvdmVyd3JpdGUgdGhlIGRlZmF1bHRcclxuXHRcdCAqIGFuZCBkZWZpbmUgdGhlIHNjYWxlIHdpdGggYSBub2RlIGluc3RlYWQuXHJcblx0XHQgKlxyXG5cdFx0ICogSWYgeW91IGRvbid0IHdhbnQgdG8gb3ZlcndyaXRlIHRoZSBzY2FsZSBidXQgbW9kaWZ5IHRoZSBleGlzdGluZ1xyXG5cdFx0ICogdmFsdWUgaW5zdGVhZCwgdXNlIHtAbGluayBtYXRlcmlhbExpbmVTY2FsZX0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPGZsb2F0Pn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kYXNoU2NhbGVOb2RlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBkYXNoIHNpemUgb2YgZGFzaCBtYXRlcmlhbHMgaXMgYnkgZGVmYXVsdCBpbmZlcnJlZCBmcm9tIHRoZSBgZGFzaFNpemVgXHJcblx0XHQgKiBwcm9wZXJ0eS4gVGhpcyBub2RlIHByb3BlcnR5IGFsbG93cyB0byBvdmVyd3JpdGUgdGhlIGRlZmF1bHRcclxuXHRcdCAqIGFuZCBkZWZpbmUgdGhlIGRhc2ggc2l6ZSB3aXRoIGEgbm9kZSBpbnN0ZWFkLlxyXG5cdFx0ICpcclxuXHRcdCAqIElmIHlvdSBkb24ndCB3YW50IHRvIG92ZXJ3cml0ZSB0aGUgZGFzaCBzaXplIGJ1dCBtb2RpZnkgdGhlIGV4aXN0aW5nXHJcblx0XHQgKiB2YWx1ZSBpbnN0ZWFkLCB1c2Uge0BsaW5rIG1hdGVyaWFsTGluZURhc2hTaXplfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGU8ZmxvYXQ+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRhc2hTaXplTm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZ2FwIHNpemUgb2YgZGFzaCBtYXRlcmlhbHMgaXMgYnkgZGVmYXVsdCBpbmZlcnJlZCBmcm9tIHRoZSBgZ2FwU2l6ZWBcclxuXHRcdCAqIHByb3BlcnR5LiBUaGlzIG5vZGUgcHJvcGVydHkgYWxsb3dzIHRvIG92ZXJ3cml0ZSB0aGUgZGVmYXVsdFxyXG5cdFx0ICogYW5kIGRlZmluZSB0aGUgZ2FwIHNpemUgd2l0aCBhIG5vZGUgaW5zdGVhZC5cclxuXHRcdCAqXHJcblx0XHQgKiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBvdmVyd3JpdGUgdGhlIGdhcCBzaXplIGJ1dCBtb2RpZnkgdGhlIGV4aXN0aW5nXHJcblx0XHQgKiB2YWx1ZSBpbnN0ZWFkLCB1c2Uge0BsaW5rIG1hdGVyaWFsTGluZUdhcFNpemV9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Tm9kZTxmbG9hdD59XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ2FwU2l6ZU5vZGUgPSBudWxsO1xyXG5cclxuXHRcdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0dXBzIHRoZSBkYXNoIHNwZWNpZmljIG5vZGUgdmFyaWFibGVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKi9cclxuXHRzZXR1cFZhcmlhbnRzKCAvKiBidWlsZGVyICovICkge1xyXG5cclxuXHRcdGNvbnN0IG9mZnNldE5vZGUgPSB0aGlzLm9mZnNldE5vZGUgPyBmbG9hdCggdGhpcy5vZmZzZXROb2RlICkgOiBtYXRlcmlhbExpbmVEYXNoT2Zmc2V0O1xyXG5cdFx0Y29uc3QgZGFzaFNjYWxlTm9kZSA9IHRoaXMuZGFzaFNjYWxlTm9kZSA/IGZsb2F0KCB0aGlzLmRhc2hTY2FsZU5vZGUgKSA6IG1hdGVyaWFsTGluZVNjYWxlO1xyXG5cdFx0Y29uc3QgZGFzaFNpemVOb2RlID0gdGhpcy5kYXNoU2l6ZU5vZGUgPyBmbG9hdCggdGhpcy5kYXNoU2l6ZU5vZGUgKSA6IG1hdGVyaWFsTGluZURhc2hTaXplO1xyXG5cdFx0Y29uc3QgZ2FwU2l6ZU5vZGUgPSB0aGlzLmdhcFNpemVOb2RlID8gZmxvYXQoIHRoaXMuZ2FwU2l6ZU5vZGUgKSA6IG1hdGVyaWFsTGluZUdhcFNpemU7XHJcblxyXG5cdFx0ZGFzaFNpemUuYXNzaWduKCBkYXNoU2l6ZU5vZGUgKTtcclxuXHRcdGdhcFNpemUuYXNzaWduKCBnYXBTaXplTm9kZSApO1xyXG5cclxuXHRcdGNvbnN0IHZMaW5lRGlzdGFuY2UgPSB2YXJ5aW5nKCBhdHRyaWJ1dGUoICdsaW5lRGlzdGFuY2UnICkubXVsKCBkYXNoU2NhbGVOb2RlICkgKTtcclxuXHRcdGNvbnN0IHZMaW5lRGlzdGFuY2VPZmZzZXQgPSBvZmZzZXROb2RlID8gdkxpbmVEaXN0YW5jZS5hZGQoIG9mZnNldE5vZGUgKSA6IHZMaW5lRGlzdGFuY2U7XHJcblxyXG5cdFx0dkxpbmVEaXN0YW5jZU9mZnNldC5tb2QoIGRhc2hTaXplLmFkZCggZ2FwU2l6ZSApICkuZ3JlYXRlclRoYW4oIGRhc2hTaXplICkuZGlzY2FyZCgpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBMaW5lRGFzaGVkTm9kZU1hdGVyaWFsO1xyXG4iLCJpbXBvcnQgVmlld3BvcnRUZXh0dXJlTm9kZSBmcm9tICcuL1ZpZXdwb3J0VGV4dHVyZU5vZGUuanMnO1xyXG5pbXBvcnQgeyBub2RlUHJveHkgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcbmltcG9ydCB7IHNjcmVlblVWIH0gZnJvbSAnLi9TY3JlZW5Ob2RlLmpzJztcclxuXHJcbmltcG9ydCB7IEZyYW1lYnVmZmVyVGV4dHVyZSB9IGZyb20gJy4uLy4uL3RleHR1cmVzL0ZyYW1lYnVmZmVyVGV4dHVyZS5qcyc7XHJcblxyXG5sZXQgX3NoYXJlZEZyYW1lYnVmZmVyID0gbnVsbDtcclxuXHJcbi8qKlxyXG4gKiBgVmlld3BvcnRUZXh0dXJlTm9kZWAgY3JlYXRlcyBhbiBpbnRlcm5hbCB0ZXh0dXJlIGZvciBlYWNoIG5vZGUgaW5zdGFuY2UuIFRoaXMgbW9kdWxlXHJcbiAqIHNoYXJlcyBhIHRleHR1cmUgYWNyb3NzIGFsbCBpbnN0YW5jZXMgb2YgYFZpZXdwb3J0U2hhcmVkVGV4dHVyZU5vZGVgLiBJdCBzaG91bGRcclxuICogYmUgdGhlIGZpcnN0IGNob2ljZSB3aGVuIHVzaW5nIGRhdGEgb2YgdGhlIGRlZmF1bHQvc2NyZWVuIGZyYW1lYnVmZmVyIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgVmlld3BvcnRUZXh0dXJlTm9kZVxyXG4gKi9cclxuY2xhc3MgVmlld3BvcnRTaGFyZWRUZXh0dXJlTm9kZSBleHRlbmRzIFZpZXdwb3J0VGV4dHVyZU5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdWaWV3cG9ydFNoYXJlZFRleHR1cmVOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHZpZXdwb3J0IHNoYXJlZCB0ZXh0dXJlIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV9IFt1dk5vZGU9c2NyZWVuVVZdIC0gVGhlIHV2IG5vZGUuXHJcblx0ICogQHBhcmFtIHs/Tm9kZX0gW2xldmVsTm9kZT1udWxsXSAtIFRoZSBsZXZlbCBub2RlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCB1dk5vZGUgPSBzY3JlZW5VViwgbGV2ZWxOb2RlID0gbnVsbCApIHtcclxuXHJcblx0XHRpZiAoIF9zaGFyZWRGcmFtZWJ1ZmZlciA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdF9zaGFyZWRGcmFtZWJ1ZmZlciA9IG5ldyBGcmFtZWJ1ZmZlclRleHR1cmUoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0c3VwZXIoIHV2Tm9kZSwgbGV2ZWxOb2RlLCBfc2hhcmVkRnJhbWVidWZmZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHR1cGRhdGVSZWZlcmVuY2UoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFZpZXdwb3J0U2hhcmVkVGV4dHVyZU5vZGU7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIHNoYXJlZCB2aWV3cG9ydCB0ZXh0dXJlIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7P05vZGV9IFt1dk5vZGU9c2NyZWVuVVZdIC0gVGhlIHV2IG5vZGUuXHJcbiAqIEBwYXJhbSB7P05vZGV9IFtsZXZlbE5vZGU9bnVsbF0gLSBUaGUgbGV2ZWwgbm9kZS5cclxuICogQHJldHVybnMge1ZpZXdwb3J0U2hhcmVkVGV4dHVyZU5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgdmlld3BvcnRTaGFyZWRUZXh0dXJlID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIFZpZXdwb3J0U2hhcmVkVGV4dHVyZU5vZGUgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDAsIDIgKTtcclxuIiwiaW1wb3J0IE5vZGVNYXRlcmlhbCBmcm9tICcuL05vZGVNYXRlcmlhbC5qcyc7XHJcbmltcG9ydCB7IGRhc2hTaXplLCBnYXBTaXplLCB2YXJ5aW5nUHJvcGVydHkgfSBmcm9tICcuLi8uLi9ub2Rlcy9jb3JlL1Byb3BlcnR5Tm9kZS5qcyc7XHJcbmltcG9ydCB7IGF0dHJpYnV0ZSB9IGZyb20gJy4uLy4uL25vZGVzL2NvcmUvQXR0cmlidXRlTm9kZS5qcyc7XHJcbmltcG9ydCB7IGNhbWVyYVByb2plY3Rpb25NYXRyaXggfSBmcm9tICcuLi8uLi9ub2Rlcy9hY2Nlc3NvcnMvQ2FtZXJhLmpzJztcclxuaW1wb3J0IHsgbWF0ZXJpYWxDb2xvciwgbWF0ZXJpYWxMaW5lU2NhbGUsIG1hdGVyaWFsTGluZURhc2hTaXplLCBtYXRlcmlhbExpbmVHYXBTaXplLCBtYXRlcmlhbExpbmVEYXNoT2Zmc2V0LCBtYXRlcmlhbExpbmVXaWR0aCwgbWF0ZXJpYWxPcGFjaXR5IH0gZnJvbSAnLi4vLi4vbm9kZXMvYWNjZXNzb3JzL01hdGVyaWFsTm9kZS5qcyc7XHJcbmltcG9ydCB7IG1vZGVsVmlld01hdHJpeCB9IGZyb20gJy4uLy4uL25vZGVzL2FjY2Vzc29ycy9Nb2RlbE5vZGUuanMnO1xyXG5pbXBvcnQgeyBwb3NpdGlvbkdlb21ldHJ5IH0gZnJvbSAnLi4vLi4vbm9kZXMvYWNjZXNzb3JzL1Bvc2l0aW9uLmpzJztcclxuaW1wb3J0IHsgbWl4LCBzbW9vdGhzdGVwIH0gZnJvbSAnLi4vLi4vbm9kZXMvbWF0aC9NYXRoTm9kZS5qcyc7XHJcbmltcG9ydCB7IEZuLCBmbG9hdCwgdmVjMiwgdmVjMywgdmVjNCwgSWYgfSBmcm9tICcuLi8uLi9ub2Rlcy90c2wvVFNMQmFzZS5qcyc7XHJcbmltcG9ydCB7IHV2IH0gZnJvbSAnLi4vLi4vbm9kZXMvYWNjZXNzb3JzL1VWLmpzJztcclxuaW1wb3J0IHsgdmlld3BvcnQgfSBmcm9tICcuLi8uLi9ub2Rlcy9kaXNwbGF5L1NjcmVlbk5vZGUuanMnO1xyXG5pbXBvcnQgeyB2aWV3cG9ydFNoYXJlZFRleHR1cmUgfSBmcm9tICcuLi8uLi9ub2Rlcy9kaXNwbGF5L1ZpZXdwb3J0U2hhcmVkVGV4dHVyZU5vZGUuanMnO1xyXG5cclxuaW1wb3J0IHsgTGluZURhc2hlZE1hdGVyaWFsIH0gZnJvbSAnLi4vTGluZURhc2hlZE1hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgTm9CbGVuZGluZyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcblxyXG5jb25zdCBfZGVmYXVsdFZhbHVlcyA9IC8qQF9fUFVSRV9fKi8gbmV3IExpbmVEYXNoZWRNYXRlcmlhbCgpO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgbm9kZSBtYXRlcmlhbCBjYW4gYmUgdXNlZCB0byByZW5kZXIgbGluZXMgd2l0aCBhIHNpemUgbGFyZ2VyIHRoYW4gb25lXHJcbiAqIGJ5IHJlcHJlc2VudGluZyB0aGVtIGFzIGluc3RhbmNlZCBtZXNoZXMuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBOb2RlTWF0ZXJpYWxcclxuICovXHJcbmNsYXNzIExpbmUyTm9kZU1hdGVyaWFsIGV4dGVuZHMgTm9kZU1hdGVyaWFsIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnTGluZTJOb2RlTWF0ZXJpYWwnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbm9kZSBtYXRlcmlhbCBmb3Igd2lkZSBsaW5lIHJlbmRlcmluZy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1ldGVycz17fV0gLSBUaGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHBhcmFtZXRlcnMgPSB7fSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0xpbmUyTm9kZU1hdGVyaWFsID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnNldERlZmF1bHRWYWx1ZXMoIF9kZWZhdWx0VmFsdWVzICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHZlcnRleCBjb2xvcnMgc2hvdWxkIGJlIHVzZWQgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51c2VDb2xvciA9IHBhcmFtZXRlcnMudmVydGV4Q29sb3JzO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGRhc2ggb2Zmc2V0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGFzaE9mZnNldCA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbGluZSB3aWR0aC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxpbmVXaWR0aCA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIHRoZSBsaW5lcyBjb2xvci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGU8dmVjMz59XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGluZUNvbG9yTm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIHRoZSBvZmZzZXQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPGZsb2F0Pn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5vZmZzZXROb2RlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgdGhlIGRhc2ggc2NhbGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPGZsb2F0Pn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kYXNoU2NhbGVOb2RlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgdGhlIGRhc2ggc2l6ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGU8ZmxvYXQ+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRhc2hTaXplTm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIHRoZSBnYXAgc2l6ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGU8ZmxvYXQ+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdhcFNpemVOb2RlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEJsZW5kaW5nIGlzIHNldCB0byBgTm9CbGVuZGluZ2Agc2luY2UgdHJhbnNwYXJlbmN5XHJcblx0XHQgKiBpcyBub3Qgc3VwcG9ydGVkLCB5ZXQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ibGVuZGluZyA9IE5vQmxlbmRpbmc7XHJcblxyXG5cdFx0dGhpcy5fdXNlRGFzaCA9IHBhcmFtZXRlcnMuZGFzaGVkO1xyXG5cdFx0dGhpcy5fdXNlQWxwaGFUb0NvdmVyYWdlID0gdHJ1ZTtcclxuXHRcdHRoaXMuX3VzZVdvcmxkVW5pdHMgPSBmYWxzZTtcclxuXHJcblx0XHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHVwcyB0aGUgdmVydGV4IGFuZCBmcmFnbWVudCBzdGFnZSBvZiB0aGlzIG5vZGUgbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqL1xyXG5cdHNldHVwKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IHsgcmVuZGVyZXIgfSA9IGJ1aWxkZXI7XHJcblxyXG5cdFx0Y29uc3QgdXNlQWxwaGFUb0NvdmVyYWdlID0gdGhpcy5fdXNlQWxwaGFUb0NvdmVyYWdlO1xyXG5cdFx0Y29uc3QgdXNlQ29sb3IgPSB0aGlzLnVzZUNvbG9yO1xyXG5cdFx0Y29uc3QgdXNlRGFzaCA9IHRoaXMuX3VzZURhc2g7XHJcblx0XHRjb25zdCB1c2VXb3JsZFVuaXRzID0gdGhpcy5fdXNlV29ybGRVbml0cztcclxuXHJcblx0XHRjb25zdCB0cmltU2VnbWVudCA9IEZuKCAoIHsgc3RhcnQsIGVuZCB9ICkgPT4ge1xyXG5cclxuXHRcdFx0Y29uc3QgYSA9IGNhbWVyYVByb2plY3Rpb25NYXRyaXguZWxlbWVudCggMiApLmVsZW1lbnQoIDIgKTsgLy8gM25kIGVudHJ5IGluIDN0aCBjb2x1bW5cclxuXHRcdFx0Y29uc3QgYiA9IGNhbWVyYVByb2plY3Rpb25NYXRyaXguZWxlbWVudCggMyApLmVsZW1lbnQoIDIgKTsgLy8gM25kIGVudHJ5IGluIDR0aCBjb2x1bW5cclxuXHRcdFx0Y29uc3QgbmVhckVzdGltYXRlID0gYi5tdWwoIC0gMC41ICkuZGl2KCBhICk7XHJcblxyXG5cdFx0XHRjb25zdCBhbHBoYSA9IG5lYXJFc3RpbWF0ZS5zdWIoIHN0YXJ0LnogKS5kaXYoIGVuZC56LnN1Yiggc3RhcnQueiApICk7XHJcblxyXG5cdFx0XHRyZXR1cm4gdmVjNCggbWl4KCBzdGFydC54eXosIGVuZC54eXosIGFscGhhICksIGVuZC53ICk7XHJcblxyXG5cdFx0fSApLnNldExheW91dCgge1xyXG5cdFx0XHRuYW1lOiAndHJpbVNlZ21lbnQnLFxyXG5cdFx0XHR0eXBlOiAndmVjNCcsXHJcblx0XHRcdGlucHV0czogW1xyXG5cdFx0XHRcdHsgbmFtZTogJ3N0YXJ0JywgdHlwZTogJ3ZlYzQnIH0sXHJcblx0XHRcdFx0eyBuYW1lOiAnZW5kJywgdHlwZTogJ3ZlYzQnIH1cclxuXHRcdFx0XVxyXG5cdFx0fSApO1xyXG5cclxuXHRcdHRoaXMudmVydGV4Tm9kZSA9IEZuKCAoKSA9PiB7XHJcblxyXG5cdFx0XHRjb25zdCBpbnN0YW5jZVN0YXJ0ID0gYXR0cmlidXRlKCAnaW5zdGFuY2VTdGFydCcgKTtcclxuXHRcdFx0Y29uc3QgaW5zdGFuY2VFbmQgPSBhdHRyaWJ1dGUoICdpbnN0YW5jZUVuZCcgKTtcclxuXHJcblx0XHRcdC8vIGNhbWVyYSBzcGFjZVxyXG5cclxuXHRcdFx0Y29uc3Qgc3RhcnQgPSB2ZWM0KCBtb2RlbFZpZXdNYXRyaXgubXVsKCB2ZWM0KCBpbnN0YW5jZVN0YXJ0LCAxLjAgKSApICkudG9WYXIoICdzdGFydCcgKTtcclxuXHRcdFx0Y29uc3QgZW5kID0gdmVjNCggbW9kZWxWaWV3TWF0cml4Lm11bCggdmVjNCggaW5zdGFuY2VFbmQsIDEuMCApICkgKS50b1ZhciggJ2VuZCcgKTtcclxuXHJcblx0XHRcdGlmICggdXNlRGFzaCApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgZGFzaFNjYWxlTm9kZSA9IHRoaXMuZGFzaFNjYWxlTm9kZSA/IGZsb2F0KCB0aGlzLmRhc2hTY2FsZU5vZGUgKSA6IG1hdGVyaWFsTGluZVNjYWxlO1xyXG5cdFx0XHRcdGNvbnN0IG9mZnNldE5vZGUgPSB0aGlzLm9mZnNldE5vZGUgPyBmbG9hdCggdGhpcy5vZmZzZXROb2RlICkgOiBtYXRlcmlhbExpbmVEYXNoT2Zmc2V0O1xyXG5cclxuXHRcdFx0XHRjb25zdCBpbnN0YW5jZURpc3RhbmNlU3RhcnQgPSBhdHRyaWJ1dGUoICdpbnN0YW5jZURpc3RhbmNlU3RhcnQnICk7XHJcblx0XHRcdFx0Y29uc3QgaW5zdGFuY2VEaXN0YW5jZUVuZCA9IGF0dHJpYnV0ZSggJ2luc3RhbmNlRGlzdGFuY2VFbmQnICk7XHJcblxyXG5cdFx0XHRcdGxldCBsaW5lRGlzdGFuY2UgPSBwb3NpdGlvbkdlb21ldHJ5LnkubGVzc1RoYW4oIDAuNSApLnNlbGVjdCggZGFzaFNjYWxlTm9kZS5tdWwoIGluc3RhbmNlRGlzdGFuY2VTdGFydCApLCBkYXNoU2NhbGVOb2RlLm11bCggaW5zdGFuY2VEaXN0YW5jZUVuZCApICk7XHJcblx0XHRcdFx0bGluZURpc3RhbmNlID0gbGluZURpc3RhbmNlLmFkZCggb2Zmc2V0Tm9kZSApO1xyXG5cclxuXHRcdFx0XHR2YXJ5aW5nUHJvcGVydHkoICdmbG9hdCcsICdsaW5lRGlzdGFuY2UnICkuYXNzaWduKCBsaW5lRGlzdGFuY2UgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggdXNlV29ybGRVbml0cyApIHtcclxuXHJcblx0XHRcdFx0dmFyeWluZ1Byb3BlcnR5KCAndmVjMycsICd3b3JsZFN0YXJ0JyApLmFzc2lnbiggc3RhcnQueHl6ICk7XHJcblx0XHRcdFx0dmFyeWluZ1Byb3BlcnR5KCAndmVjMycsICd3b3JsZEVuZCcgKS5hc3NpZ24oIGVuZC54eXogKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IGFzcGVjdCA9IHZpZXdwb3J0LnouZGl2KCB2aWV3cG9ydC53ICk7XHJcblxyXG5cdFx0XHQvLyBzcGVjaWFsIGNhc2UgZm9yIHBlcnNwZWN0aXZlIHByb2plY3Rpb24sIGFuZCBzZWdtZW50cyB0aGF0IHRlcm1pbmF0ZSBlaXRoZXIgaW4sIG9yIGJlaGluZCwgdGhlIGNhbWVyYSBwbGFuZVxyXG5cdFx0XHQvLyBjbGVhcmx5IHRoZSBncHUgZmlybXdhcmUgaGFzIGEgd2F5IG9mIGFkZHJlc3NpbmcgdGhpcyBpc3N1ZSB3aGVuIHByb2plY3RpbmcgaW50byBuZGMgc3BhY2VcclxuXHRcdFx0Ly8gYnV0IHdlIG5lZWQgdG8gcGVyZm9ybSBuZGMtc3BhY2UgY2FsY3VsYXRpb25zIGluIHRoZSBzaGFkZXIsIHNvIHdlIG11c3QgYWRkcmVzcyB0aGlzIGlzc3VlIGRpcmVjdGx5XHJcblx0XHRcdC8vIHBlcmhhcHMgdGhlcmUgaXMgYSBtb3JlIGVsZWdhbnQgc29sdXRpb24gLS0gV2VzdExhbmdsZXlcclxuXHJcblx0XHRcdGNvbnN0IHBlcnNwZWN0aXZlID0gY2FtZXJhUHJvamVjdGlvbk1hdHJpeC5lbGVtZW50KCAyICkuZWxlbWVudCggMyApLmVxdWFsKCAtIDEuMCApOyAvLyA0dGggZW50cnkgaW4gdGhlIDNyZCBjb2x1bW5cclxuXHJcblx0XHRcdElmKCBwZXJzcGVjdGl2ZSwgKCkgPT4ge1xyXG5cclxuXHRcdFx0XHRJZiggc3RhcnQuei5sZXNzVGhhbiggMC4wICkuYW5kKCBlbmQuei5ncmVhdGVyVGhhbiggMC4wICkgKSwgKCkgPT4ge1xyXG5cclxuXHRcdFx0XHRcdGVuZC5hc3NpZ24oIHRyaW1TZWdtZW50KCB7IHN0YXJ0OiBzdGFydCwgZW5kOiBlbmQgfSApICk7XHJcblxyXG5cdFx0XHRcdH0gKS5FbHNlSWYoIGVuZC56Lmxlc3NUaGFuKCAwLjAgKS5hbmQoIHN0YXJ0LnouZ3JlYXRlclRoYW5FcXVhbCggMC4wICkgKSwgKCkgPT4ge1xyXG5cclxuXHRcdFx0XHRcdHN0YXJ0LmFzc2lnbiggdHJpbVNlZ21lbnQoIHsgc3RhcnQ6IGVuZCwgZW5kOiBzdGFydCB9ICkgKTtcclxuXHJcblx0XHRcdCBcdH0gKTtcclxuXHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHRcdC8vIGNsaXAgc3BhY2VcclxuXHRcdFx0Y29uc3QgY2xpcFN0YXJ0ID0gY2FtZXJhUHJvamVjdGlvbk1hdHJpeC5tdWwoIHN0YXJ0ICk7XHJcblx0XHRcdGNvbnN0IGNsaXBFbmQgPSBjYW1lcmFQcm9qZWN0aW9uTWF0cml4Lm11bCggZW5kICk7XHJcblxyXG5cdFx0XHQvLyBuZGMgc3BhY2VcclxuXHRcdFx0Y29uc3QgbmRjU3RhcnQgPSBjbGlwU3RhcnQueHl6LmRpdiggY2xpcFN0YXJ0LncgKTtcclxuXHRcdFx0Y29uc3QgbmRjRW5kID0gY2xpcEVuZC54eXouZGl2KCBjbGlwRW5kLncgKTtcclxuXHJcblx0XHRcdC8vIGRpcmVjdGlvblxyXG5cdFx0XHRjb25zdCBkaXIgPSBuZGNFbmQueHkuc3ViKCBuZGNTdGFydC54eSApLnRvVmFyKCk7XHJcblxyXG5cdFx0XHQvLyBhY2NvdW50IGZvciBjbGlwLXNwYWNlIGFzcGVjdCByYXRpb1xyXG5cdFx0XHRkaXIueC5hc3NpZ24oIGRpci54Lm11bCggYXNwZWN0ICkgKTtcclxuXHRcdFx0ZGlyLmFzc2lnbiggZGlyLm5vcm1hbGl6ZSgpICk7XHJcblxyXG5cdFx0XHRjb25zdCBjbGlwID0gdmVjNCgpLnRvVmFyKCk7XHJcblxyXG5cdFx0XHRpZiAoIHVzZVdvcmxkVW5pdHMgKSB7XHJcblxyXG5cdFx0XHRcdC8vIGdldCB0aGUgb2Zmc2V0IGRpcmVjdGlvbiBhcyBwZXJwZW5kaWN1bGFyIHRvIHRoZSB2aWV3IHZlY3RvclxyXG5cclxuXHRcdFx0XHRjb25zdCB3b3JsZERpciA9IGVuZC54eXouc3ViKCBzdGFydC54eXogKS5ub3JtYWxpemUoKTtcclxuXHRcdFx0XHRjb25zdCB0bXBGd2QgPSBtaXgoIHN0YXJ0Lnh5eiwgZW5kLnh5eiwgMC41ICkubm9ybWFsaXplKCk7XHJcblx0XHRcdFx0Y29uc3Qgd29ybGRVcCA9IHdvcmxkRGlyLmNyb3NzKCB0bXBGd2QgKS5ub3JtYWxpemUoKTtcclxuXHRcdFx0XHRjb25zdCB3b3JsZEZ3ZCA9IHdvcmxkRGlyLmNyb3NzKCB3b3JsZFVwICk7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHdvcmxkUG9zID0gdmFyeWluZ1Byb3BlcnR5KCAndmVjNCcsICd3b3JsZFBvcycgKTtcclxuXHJcblx0XHRcdFx0d29ybGRQb3MuYXNzaWduKCBwb3NpdGlvbkdlb21ldHJ5LnkubGVzc1RoYW4oIDAuNSApLnNlbGVjdCggc3RhcnQsIGVuZCApICk7XHJcblxyXG5cdFx0XHRcdC8vIGhlaWdodCBvZmZzZXRcclxuXHRcdFx0XHRjb25zdCBodyA9IG1hdGVyaWFsTGluZVdpZHRoLm11bCggMC41ICk7XHJcblx0XHRcdFx0d29ybGRQb3MuYWRkQXNzaWduKCB2ZWM0KCBwb3NpdGlvbkdlb21ldHJ5LngubGVzc1RoYW4oIDAuMCApLnNlbGVjdCggd29ybGRVcC5tdWwoIGh3ICksIHdvcmxkVXAubXVsKCBodyApLm5lZ2F0ZSgpICksIDAgKSApO1xyXG5cclxuXHRcdFx0XHQvLyBkb24ndCBleHRlbmQgdGhlIGxpbmUgaWYgd2UncmUgcmVuZGVyaW5nIGRhc2hlcyBiZWNhdXNlIHdlXHJcblx0XHRcdFx0Ly8gd29uJ3QgYmUgcmVuZGVyaW5nIHRoZSBlbmRjYXBzXHJcblx0XHRcdFx0aWYgKCAhIHVzZURhc2ggKSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gY2FwIGV4dGVuc2lvblxyXG5cdFx0XHRcdFx0d29ybGRQb3MuYWRkQXNzaWduKCB2ZWM0KCBwb3NpdGlvbkdlb21ldHJ5LnkubGVzc1RoYW4oIDAuNSApLnNlbGVjdCggd29ybGREaXIubXVsKCBodyApLm5lZ2F0ZSgpLCB3b3JsZERpci5tdWwoIGh3ICkgKSwgMCApICk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gYWRkIHdpZHRoIHRvIHRoZSBib3hcclxuXHRcdFx0XHRcdHdvcmxkUG9zLmFkZEFzc2lnbiggdmVjNCggd29ybGRGd2QubXVsKCBodyApLCAwICkgKTtcclxuXHJcblx0XHRcdFx0XHQvLyBlbmRjYXBzXHJcblx0XHRcdFx0XHRJZiggcG9zaXRpb25HZW9tZXRyeS55LmdyZWF0ZXJUaGFuKCAxLjAgKS5vciggcG9zaXRpb25HZW9tZXRyeS55Lmxlc3NUaGFuKCAwLjAgKSApLCAoKSA9PiB7XHJcblxyXG5cdFx0XHRcdFx0XHR3b3JsZFBvcy5zdWJBc3NpZ24oIHZlYzQoIHdvcmxkRndkLm11bCggMi4wICkubXVsKCBodyApLCAwICkgKTtcclxuXHJcblx0XHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Ly8gcHJvamVjdCB0aGUgd29ybGRwb3NcclxuXHRcdFx0XHRjbGlwLmFzc2lnbiggY2FtZXJhUHJvamVjdGlvbk1hdHJpeC5tdWwoIHdvcmxkUG9zICkgKTtcclxuXHJcblx0XHRcdFx0Ly8gc2hpZnQgdGhlIGRlcHRoIG9mIHRoZSBwcm9qZWN0ZWQgcG9pbnRzIHNvIHRoZSBsaW5lXHJcblx0XHRcdFx0Ly8gc2VnbWVudHMgb3ZlcmxhcCBuZWF0bHlcclxuXHRcdFx0XHRjb25zdCBjbGlwUG9zZSA9IHZlYzMoKS50b1ZhcigpO1xyXG5cclxuXHRcdFx0XHRjbGlwUG9zZS5hc3NpZ24oIHBvc2l0aW9uR2VvbWV0cnkueS5sZXNzVGhhbiggMC41ICkuc2VsZWN0KCBuZGNTdGFydCwgbmRjRW5kICkgKTtcclxuXHRcdFx0XHRjbGlwLnouYXNzaWduKCBjbGlwUG9zZS56Lm11bCggY2xpcC53ICkgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IG9mZnNldCA9IHZlYzIoIGRpci55LCBkaXIueC5uZWdhdGUoKSApLnRvVmFyKCAnb2Zmc2V0JyApO1xyXG5cclxuXHRcdFx0XHQvLyB1bmRvIGFzcGVjdCByYXRpbyBhZGp1c3RtZW50XHJcblx0XHRcdFx0ZGlyLnguYXNzaWduKCBkaXIueC5kaXYoIGFzcGVjdCApICk7XHJcblx0XHRcdFx0b2Zmc2V0LnguYXNzaWduKCBvZmZzZXQueC5kaXYoIGFzcGVjdCApICk7XHJcblxyXG5cdFx0XHRcdC8vIHNpZ24gZmxpcFxyXG5cdFx0XHRcdG9mZnNldC5hc3NpZ24oIHBvc2l0aW9uR2VvbWV0cnkueC5sZXNzVGhhbiggMC4wICkuc2VsZWN0KCBvZmZzZXQubmVnYXRlKCksIG9mZnNldCApICk7XHJcblxyXG5cdFx0XHRcdC8vIGVuZGNhcHNcclxuXHRcdFx0XHRJZiggcG9zaXRpb25HZW9tZXRyeS55Lmxlc3NUaGFuKCAwLjAgKSwgKCkgPT4ge1xyXG5cclxuXHRcdFx0XHRcdG9mZnNldC5hc3NpZ24oIG9mZnNldC5zdWIoIGRpciApICk7XHJcblxyXG5cdFx0XHRcdH0gKS5FbHNlSWYoIHBvc2l0aW9uR2VvbWV0cnkueS5ncmVhdGVyVGhhbiggMS4wICksICgpID0+IHtcclxuXHJcblx0XHRcdFx0XHRvZmZzZXQuYXNzaWduKCBvZmZzZXQuYWRkKCBkaXIgKSApO1xyXG5cclxuXHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRcdC8vIGFkanVzdCBmb3IgbGluZXdpZHRoXHJcblx0XHRcdFx0b2Zmc2V0LmFzc2lnbiggb2Zmc2V0Lm11bCggbWF0ZXJpYWxMaW5lV2lkdGggKSApO1xyXG5cclxuXHRcdFx0XHQvLyBhZGp1c3QgZm9yIGNsaXAtc3BhY2UgdG8gc2NyZWVuLXNwYWNlIGNvbnZlcnNpb24gLy8gbWF5YmUgcmVzb2x1dGlvbiBzaG91bGQgYmUgYmFzZWQgb24gdmlld3BvcnQgLi4uXHJcblx0XHRcdFx0b2Zmc2V0LmFzc2lnbiggb2Zmc2V0LmRpdiggdmlld3BvcnQudyApICk7XHJcblxyXG5cdFx0XHRcdC8vIHNlbGVjdCBlbmRcclxuXHRcdFx0XHRjbGlwLmFzc2lnbiggcG9zaXRpb25HZW9tZXRyeS55Lmxlc3NUaGFuKCAwLjUgKS5zZWxlY3QoIGNsaXBTdGFydCwgY2xpcEVuZCApICk7XHJcblxyXG5cdFx0XHRcdC8vIGJhY2sgdG8gY2xpcCBzcGFjZVxyXG5cdFx0XHRcdG9mZnNldC5hc3NpZ24oIG9mZnNldC5tdWwoIGNsaXAudyApICk7XHJcblxyXG5cdFx0XHRcdGNsaXAuYXNzaWduKCBjbGlwLmFkZCggdmVjNCggb2Zmc2V0LCAwLCAwICkgKSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIGNsaXA7XHJcblxyXG5cdFx0fSApKCk7XHJcblxyXG5cdFx0Y29uc3QgY2xvc2VzdExpbmVUb0xpbmUgPSBGbiggKCB7IHAxLCBwMiwgcDMsIHA0IH0gKSA9PiB7XHJcblxyXG5cdFx0XHRjb25zdCBwMTMgPSBwMS5zdWIoIHAzICk7XHJcblx0XHRcdGNvbnN0IHA0MyA9IHA0LnN1YiggcDMgKTtcclxuXHJcblx0XHRcdGNvbnN0IHAyMSA9IHAyLnN1YiggcDEgKTtcclxuXHJcblx0XHRcdGNvbnN0IGQxMzQzID0gcDEzLmRvdCggcDQzICk7XHJcblx0XHRcdGNvbnN0IGQ0MzIxID0gcDQzLmRvdCggcDIxICk7XHJcblx0XHRcdGNvbnN0IGQxMzIxID0gcDEzLmRvdCggcDIxICk7XHJcblx0XHRcdGNvbnN0IGQ0MzQzID0gcDQzLmRvdCggcDQzICk7XHJcblx0XHRcdGNvbnN0IGQyMTIxID0gcDIxLmRvdCggcDIxICk7XHJcblxyXG5cdFx0XHRjb25zdCBkZW5vbSA9IGQyMTIxLm11bCggZDQzNDMgKS5zdWIoIGQ0MzIxLm11bCggZDQzMjEgKSApO1xyXG5cdFx0XHRjb25zdCBudW1lciA9IGQxMzQzLm11bCggZDQzMjEgKS5zdWIoIGQxMzIxLm11bCggZDQzNDMgKSApO1xyXG5cclxuXHRcdFx0Y29uc3QgbXVhID0gbnVtZXIuZGl2KCBkZW5vbSApLmNsYW1wKCk7XHJcblx0XHRcdGNvbnN0IG11YiA9IGQxMzQzLmFkZCggZDQzMjEubXVsKCBtdWEgKSApLmRpdiggZDQzNDMgKS5jbGFtcCgpO1xyXG5cclxuXHRcdFx0cmV0dXJuIHZlYzIoIG11YSwgbXViICk7XHJcblxyXG5cdFx0fSApO1xyXG5cclxuXHRcdHRoaXMuY29sb3JOb2RlID0gRm4oICgpID0+IHtcclxuXHJcblx0XHRcdGNvbnN0IHZVdiA9IHV2KCk7XHJcblxyXG5cdFx0XHRpZiAoIHVzZURhc2ggKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGRhc2hTaXplTm9kZSA9IHRoaXMuZGFzaFNpemVOb2RlID8gZmxvYXQoIHRoaXMuZGFzaFNpemVOb2RlICkgOiBtYXRlcmlhbExpbmVEYXNoU2l6ZTtcclxuXHRcdFx0XHRjb25zdCBnYXBTaXplTm9kZSA9IHRoaXMuZ2FwU2l6ZU5vZGUgPyBmbG9hdCggdGhpcy5nYXBTaXplTm9kZSApIDogbWF0ZXJpYWxMaW5lR2FwU2l6ZTtcclxuXHJcblx0XHRcdFx0ZGFzaFNpemUuYXNzaWduKCBkYXNoU2l6ZU5vZGUgKTtcclxuXHRcdFx0XHRnYXBTaXplLmFzc2lnbiggZ2FwU2l6ZU5vZGUgKTtcclxuXHJcblx0XHRcdFx0Y29uc3QgdkxpbmVEaXN0YW5jZSA9IHZhcnlpbmdQcm9wZXJ0eSggJ2Zsb2F0JywgJ2xpbmVEaXN0YW5jZScgKTtcclxuXHJcblx0XHRcdFx0dlV2LnkubGVzc1RoYW4oIC0gMS4wICkub3IoIHZVdi55LmdyZWF0ZXJUaGFuKCAxLjAgKSApLmRpc2NhcmQoKTsgLy8gZGlzY2FyZCBlbmRjYXBzXHJcblx0XHRcdFx0dkxpbmVEaXN0YW5jZS5tb2QoIGRhc2hTaXplLmFkZCggZ2FwU2l6ZSApICkuZ3JlYXRlclRoYW4oIGRhc2hTaXplICkuZGlzY2FyZCgpOyAvLyB0b2RvIC0gRklYXHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBhbHBoYSA9IGZsb2F0KCAxICkudG9WYXIoICdhbHBoYScgKTtcclxuXHJcblx0XHRcdGlmICggdXNlV29ybGRVbml0cyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3Qgd29ybGRTdGFydCA9IHZhcnlpbmdQcm9wZXJ0eSggJ3ZlYzMnLCAnd29ybGRTdGFydCcgKTtcclxuXHRcdFx0XHRjb25zdCB3b3JsZEVuZCA9IHZhcnlpbmdQcm9wZXJ0eSggJ3ZlYzMnLCAnd29ybGRFbmQnICk7XHJcblxyXG5cdFx0XHRcdC8vIEZpbmQgdGhlIGNsb3Nlc3QgcG9pbnRzIG9uIHRoZSB2aWV3IHJheSBhbmQgdGhlIGxpbmUgc2VnbWVudFxyXG5cdFx0XHRcdGNvbnN0IHJheUVuZCA9IHZhcnlpbmdQcm9wZXJ0eSggJ3ZlYzQnLCAnd29ybGRQb3MnICkueHl6Lm5vcm1hbGl6ZSgpLm11bCggMWU1ICk7XHJcblx0XHRcdFx0Y29uc3QgbGluZURpciA9IHdvcmxkRW5kLnN1Yiggd29ybGRTdGFydCApO1xyXG5cdFx0XHRcdGNvbnN0IHBhcmFtcyA9IGNsb3Nlc3RMaW5lVG9MaW5lKCB7IHAxOiB3b3JsZFN0YXJ0LCBwMjogd29ybGRFbmQsIHAzOiB2ZWMzKCAwLjAsIDAuMCwgMC4wICksIHA0OiByYXlFbmQgfSApO1xyXG5cclxuXHRcdFx0XHRjb25zdCBwMSA9IHdvcmxkU3RhcnQuYWRkKCBsaW5lRGlyLm11bCggcGFyYW1zLnggKSApO1xyXG5cdFx0XHRcdGNvbnN0IHAyID0gcmF5RW5kLm11bCggcGFyYW1zLnkgKTtcclxuXHRcdFx0XHRjb25zdCBkZWx0YSA9IHAxLnN1YiggcDIgKTtcclxuXHRcdFx0XHRjb25zdCBsZW4gPSBkZWx0YS5sZW5ndGgoKTtcclxuXHRcdFx0XHRjb25zdCBub3JtID0gbGVuLmRpdiggbWF0ZXJpYWxMaW5lV2lkdGggKTtcclxuXHJcblx0XHRcdFx0aWYgKCAhIHVzZURhc2ggKSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCB1c2VBbHBoYVRvQ292ZXJhZ2UgJiYgcmVuZGVyZXIuc2FtcGxlcyA+IDEgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCBkbm9ybSA9IG5vcm0uZndpZHRoKCk7XHJcblx0XHRcdFx0XHRcdGFscGhhLmFzc2lnbiggc21vb3Roc3RlcCggZG5vcm0ubmVnYXRlKCkuYWRkKCAwLjUgKSwgZG5vcm0uYWRkKCAwLjUgKSwgbm9ybSApLm9uZU1pbnVzKCkgKTtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0bm9ybS5ncmVhdGVyVGhhbiggMC41ICkuZGlzY2FyZCgpO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0Ly8gcm91bmQgZW5kY2Fwc1xyXG5cclxuXHRcdFx0XHRpZiAoIHVzZUFscGhhVG9Db3ZlcmFnZSAmJiByZW5kZXJlci5zYW1wbGVzID4gMSApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBhID0gdlV2Lng7XHJcblx0XHRcdFx0XHRjb25zdCBiID0gdlV2LnkuZ3JlYXRlclRoYW4oIDAuMCApLnNlbGVjdCggdlV2Lnkuc3ViKCAxLjAgKSwgdlV2LnkuYWRkKCAxLjAgKSApO1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGxlbjIgPSBhLm11bCggYSApLmFkZCggYi5tdWwoIGIgKSApO1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGRsZW4gPSBmbG9hdCggbGVuMi5md2lkdGgoKSApLnRvVmFyKCAnZGxlbicgKTtcclxuXHJcblx0XHRcdFx0XHRJZiggdlV2LnkuYWJzKCkuZ3JlYXRlclRoYW4oIDEuMCApLCAoKSA9PiB7XHJcblxyXG5cdFx0XHRcdFx0XHRhbHBoYS5hc3NpZ24oIHNtb290aHN0ZXAoIGRsZW4ub25lTWludXMoKSwgZGxlbi5hZGQoIDEgKSwgbGVuMiApLm9uZU1pbnVzKCkgKTtcclxuXHJcblx0XHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0SWYoIHZVdi55LmFicygpLmdyZWF0ZXJUaGFuKCAxLjAgKSwgKCkgPT4ge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgYSA9IHZVdi54O1xyXG5cdFx0XHRcdFx0XHRjb25zdCBiID0gdlV2LnkuZ3JlYXRlclRoYW4oIDAuMCApLnNlbGVjdCggdlV2Lnkuc3ViKCAxLjAgKSwgdlV2LnkuYWRkKCAxLjAgKSApO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBsZW4yID0gYS5tdWwoIGEgKS5hZGQoIGIubXVsKCBiICkgKTtcclxuXHJcblx0XHRcdFx0XHRcdGxlbjIuZ3JlYXRlclRoYW4oIDEuMCApLmRpc2NhcmQoKTtcclxuXHJcblx0XHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGxldCBsaW5lQ29sb3JOb2RlO1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLmxpbmVDb2xvck5vZGUgKSB7XHJcblxyXG5cdFx0XHRcdGxpbmVDb2xvck5vZGUgPSB0aGlzLmxpbmVDb2xvck5vZGU7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRpZiAoIHVzZUNvbG9yICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGluc3RhbmNlQ29sb3JTdGFydCA9IGF0dHJpYnV0ZSggJ2luc3RhbmNlQ29sb3JTdGFydCcgKTtcclxuXHRcdFx0XHRcdGNvbnN0IGluc3RhbmNlQ29sb3JFbmQgPSBhdHRyaWJ1dGUoICdpbnN0YW5jZUNvbG9yRW5kJyApO1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGluc3RhbmNlQ29sb3IgPSBwb3NpdGlvbkdlb21ldHJ5LnkubGVzc1RoYW4oIDAuNSApLnNlbGVjdCggaW5zdGFuY2VDb2xvclN0YXJ0LCBpbnN0YW5jZUNvbG9yRW5kICk7XHJcblxyXG5cdFx0XHRcdFx0bGluZUNvbG9yTm9kZSA9IGluc3RhbmNlQ29sb3IubXVsKCBtYXRlcmlhbENvbG9yICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0bGluZUNvbG9yTm9kZSA9IG1hdGVyaWFsQ29sb3I7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiB2ZWM0KCBsaW5lQ29sb3JOb2RlLCBhbHBoYSApO1xyXG5cclxuXHRcdH0gKSgpO1xyXG5cclxuXHRcdGlmICggdGhpcy50cmFuc3BhcmVudCApIHtcclxuXHJcblx0XHRcdGNvbnN0IG9wYWNpdHlOb2RlID0gdGhpcy5vcGFjaXR5Tm9kZSA/IGZsb2F0KCB0aGlzLm9wYWNpdHlOb2RlICkgOiBtYXRlcmlhbE9wYWNpdHk7XHJcblxyXG5cdFx0XHR0aGlzLm91dHB1dE5vZGUgPSB2ZWM0KCB0aGlzLmNvbG9yTm9kZS5yZ2IubXVsKCBvcGFjaXR5Tm9kZSApLmFkZCggdmlld3BvcnRTaGFyZWRUZXh0dXJlKCkucmdiLm11bCggb3BhY2l0eU5vZGUub25lTWludXMoKSApICksIHRoaXMuY29sb3JOb2RlLmEgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0c3VwZXIuc2V0dXAoIGJ1aWxkZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBXaGV0aGVyIHRoZSBsaW5lcyBzaG91bGQgc2l6ZWQgaW4gd29ybGQgdW5pdHMgb3Igbm90LlxyXG5cdCAqIFdoZW4gc2V0IHRvIGBmYWxzZWAgdGhlIHVuaXQgaXMgcGl4ZWwuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdCAqL1xyXG5cdGdldCB3b3JsZFVuaXRzKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl91c2VXb3JsZFVuaXRzO1xyXG5cclxuXHR9XHJcblxyXG5cdHNldCB3b3JsZFVuaXRzKCB2YWx1ZSApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuX3VzZVdvcmxkVW5pdHMgIT09IHZhbHVlICkge1xyXG5cclxuXHRcdFx0dGhpcy5fdXNlV29ybGRVbml0cyA9IHZhbHVlO1xyXG5cdFx0XHR0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogV2hldGhlciB0aGUgbGluZXMgc2hvdWxkIGJlIGRhc2hlZCBvciBub3QuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdCAqL1xyXG5cdGdldCBkYXNoZWQoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX3VzZURhc2g7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0IGRhc2hlZCggdmFsdWUgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl91c2VEYXNoICE9PSB2YWx1ZSApIHtcclxuXHJcblx0XHRcdHRoaXMuX3VzZURhc2ggPSB2YWx1ZTtcclxuXHRcdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdoZXRoZXIgYWxwaGEgdG8gY292ZXJhZ2Ugc2hvdWxkIGJlIHVzZWQgb3Igbm90LlxyXG5cdCAqXHJcblx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdCAqL1xyXG5cdGdldCBhbHBoYVRvQ292ZXJhZ2UoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX3VzZUFscGhhVG9Db3ZlcmFnZTtcclxuXHJcblx0fVxyXG5cclxuXHRzZXQgYWxwaGFUb0NvdmVyYWdlKCB2YWx1ZSApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuX3VzZUFscGhhVG9Db3ZlcmFnZSAhPT0gdmFsdWUgKSB7XHJcblxyXG5cdFx0XHR0aGlzLl91c2VBbHBoYVRvQ292ZXJhZ2UgPSB2YWx1ZTtcclxuXHRcdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBMaW5lMk5vZGVNYXRlcmlhbDtcclxuIiwiaW1wb3J0IHsgbm9kZU9iamVjdCB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBQYWNrcyBhIGRpcmVjdGlvbiB2ZWN0b3IgaW50byBhIGNvbG9yIHZhbHVlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGU8dmVjMz59IG5vZGUgLSBUaGUgZGlyZWN0aW9uIHRvIHBhY2suXHJcbiAqIEByZXR1cm4ge05vZGU8dmVjMz59IFRoZSBjb2xvci5cclxuICovXHJcbmV4cG9ydCBjb25zdCBkaXJlY3Rpb25Ub0NvbG9yID0gKCBub2RlICkgPT4gbm9kZU9iamVjdCggbm9kZSApLm11bCggMC41ICkuYWRkKCAwLjUgKTtcclxuXHJcbi8qKlxyXG4gKiBVbnBhY2tzIGEgY29sb3IgdmFsdWUgaW50byBhIGRpcmVjdGlvbiB2ZWN0b3IuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMzPn0gbm9kZSAtIFRoZSBjb2xvciB0byB1bnBhY2suXHJcbiAqIEByZXR1cm4ge05vZGU8dmVjMz59IFRoZSBkaXJlY3Rpb24uXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgY29sb3JUb0RpcmVjdGlvbiA9ICggbm9kZSApID0+IG5vZGVPYmplY3QoIG5vZGUgKS5tdWwoIDIuMCApLnN1YiggMSApO1xyXG4iLCJpbXBvcnQgTm9kZU1hdGVyaWFsIGZyb20gJy4vTm9kZU1hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgZGlmZnVzZUNvbG9yIH0gZnJvbSAnLi4vLi4vbm9kZXMvY29yZS9Qcm9wZXJ0eU5vZGUuanMnO1xyXG5pbXBvcnQgeyBkaXJlY3Rpb25Ub0NvbG9yIH0gZnJvbSAnLi4vLi4vbm9kZXMvdXRpbHMvUGFja2luZy5qcyc7XHJcbmltcG9ydCB7IG1hdGVyaWFsT3BhY2l0eSB9IGZyb20gJy4uLy4uL25vZGVzL2FjY2Vzc29ycy9NYXRlcmlhbE5vZGUuanMnO1xyXG5pbXBvcnQgeyB0cmFuc2Zvcm1lZE5vcm1hbFZpZXcgfSBmcm9tICcuLi8uLi9ub2Rlcy9hY2Nlc3NvcnMvTm9ybWFsLmpzJztcclxuaW1wb3J0IHsgY29sb3JTcGFjZVRvV29ya2luZyB9IGZyb20gJy4uLy4uL25vZGVzL2Rpc3BsYXkvQ29sb3JTcGFjZU5vZGUuanMnO1xyXG5pbXBvcnQgeyBmbG9hdCwgdmVjNCB9IGZyb20gJy4uLy4uL25vZGVzL3RzbC9UU0xCYXNlLmpzJztcclxuaW1wb3J0IHsgU1JHQkNvbG9yU3BhY2UgfSBmcm9tICcuLi8uLi9jb25zdGFudHMuanMnO1xyXG5cclxuaW1wb3J0IHsgTWVzaE5vcm1hbE1hdGVyaWFsIH0gZnJvbSAnLi4vTWVzaE5vcm1hbE1hdGVyaWFsLmpzJztcclxuXHJcbmNvbnN0IF9kZWZhdWx0VmFsdWVzID0gLypAX19QVVJFX18qLyBuZXcgTWVzaE5vcm1hbE1hdGVyaWFsKCk7XHJcblxyXG4vKipcclxuICogTm9kZSBtYXRlcmlhbCB2ZXJzaW9uIG9mIHtAbGluayBNZXNoTm9ybWFsTWF0ZXJpYWx9LlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTm9kZU1hdGVyaWFsXHJcbiAqL1xyXG5jbGFzcyBNZXNoTm9ybWFsTm9kZU1hdGVyaWFsIGV4dGVuZHMgTm9kZU1hdGVyaWFsIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnTWVzaE5vcm1hbE5vZGVNYXRlcmlhbCc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBtZXNoIG5vcm1hbCBub2RlIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbWV0ZXJzXSAtIFRoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVycyApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc01lc2hOb3JtYWxOb2RlTWF0ZXJpYWwgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMuc2V0RGVmYXVsdFZhbHVlcyggX2RlZmF1bHRWYWx1ZXMgKTtcclxuXHJcblx0XHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE92ZXJ3cml0ZXMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gYnkgY29tcHV0aW5nIHRoZSBkaWZmdXNlIGNvbG9yXHJcblx0ICogYmFzZWQgb24gdGhlIG5vcm1hbCBkYXRhLlxyXG5cdCAqL1xyXG5cdHNldHVwRGlmZnVzZUNvbG9yKCkge1xyXG5cclxuXHRcdGNvbnN0IG9wYWNpdHlOb2RlID0gdGhpcy5vcGFjaXR5Tm9kZSA/IGZsb2F0KCB0aGlzLm9wYWNpdHlOb2RlICkgOiBtYXRlcmlhbE9wYWNpdHk7XHJcblxyXG5cdFx0Ly8gQnkgY29udmVudGlvbiwgYSBub3JtYWwgcGFja2VkIHRvIFJHQiBpcyBpbiBzUkdCIGNvbG9yIHNwYWNlLiBDb252ZXJ0IGl0IHRvIHdvcmtpbmcgY29sb3Igc3BhY2UuXHJcblxyXG5cdFx0ZGlmZnVzZUNvbG9yLmFzc2lnbiggY29sb3JTcGFjZVRvV29ya2luZyggdmVjNCggZGlyZWN0aW9uVG9Db2xvciggdHJhbnNmb3JtZWROb3JtYWxWaWV3ICksIG9wYWNpdHlOb2RlICksIFNSR0JDb2xvclNwYWNlICkgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTWVzaE5vcm1hbE5vZGVNYXRlcmlhbDtcclxuIiwiaW1wb3J0IFRlbXBOb2RlIGZyb20gJy4uL2NvcmUvVGVtcE5vZGUuanMnO1xyXG5pbXBvcnQgeyBwb3NpdGlvbldvcmxkRGlyZWN0aW9uIH0gZnJvbSAnLi4vYWNjZXNzb3JzL1Bvc2l0aW9uLmpzJztcclxuaW1wb3J0IHsgbm9kZVByb3h5LCB2ZWMyIH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5cclxuLyoqXHJcbiAqIENhbiBiZSB1c2VkIHRvIGNvbXB1dGUgdGV4dHVyZSBjb29yZGluYXRlcyBmb3IgcHJvamVjdGluZyBhblxyXG4gKiBlcXVpcmVjdGFuZ3VsYXIgdGV4dHVyZSBvbnRvIGEgbWVzaCBmb3IgdXNpbmcgaXQgYXMgdGhlIHNjZW5lJ3NcclxuICogYmFja2dyb3VuZC5cclxuICpcclxuICogYGBganNcclxuICogc2NlbmUuYmFja2dyb3VuZE5vZGUgPSB0ZXh0dXJlKCBlcXVpcmVjdFRleHR1cmUsIGVxdWlyZWN0VVYoKSApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIFRlbXBOb2RlXHJcbiAqL1xyXG5jbGFzcyBFcXVpcmVjdFVWTm9kZSBleHRlbmRzIFRlbXBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnRXF1aXJlY3RVVk5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgZXF1aXJlY3QgdXYgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZTx2ZWMzPn0gW2Rpck5vZGU9cG9zaXRpb25Xb3JsZERpcmVjdGlvbl0gLSBBIGRpcmVjdGlvbiB2ZWN0b3IgZm9yIHNhbXBsaW5nIHdoaWNoIGlzIGJ5IGRlZmF1bHQgYHBvc2l0aW9uV29ybGREaXJlY3Rpb25gLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBkaXJOb2RlID0gcG9zaXRpb25Xb3JsZERpcmVjdGlvbiApIHtcclxuXHJcblx0XHRzdXBlciggJ3ZlYzInICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGRpcmVjdGlvbiB2ZWN0b3IgZm9yIHNhbXBsaW5nIHdoeSBpcyBieSBkZWZhdWx0IGBwb3NpdGlvbldvcmxkRGlyZWN0aW9uYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZTx2ZWMzPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kaXJOb2RlID0gZGlyTm9kZTtcclxuXHJcblx0fVxyXG5cclxuXHRzZXR1cCgpIHtcclxuXHJcblx0XHRjb25zdCBkaXIgPSB0aGlzLmRpck5vZGU7XHJcblxyXG5cdFx0Y29uc3QgdSA9IGRpci56LmF0YW4oIGRpci54ICkubXVsKCAxIC8gKCBNYXRoLlBJICogMiApICkuYWRkKCAwLjUgKTtcclxuXHRcdGNvbnN0IHYgPSBkaXIueS5jbGFtcCggLSAxLjAsIDEuMCApLmFzaW4oKS5tdWwoIDEgLyBNYXRoLlBJICkuYWRkKCAwLjUgKTtcclxuXHJcblx0XHRyZXR1cm4gdmVjMiggdSwgdiApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBFcXVpcmVjdFVWTm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGFuIGVxdWlyZWN0IHV2IG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7P05vZGU8dmVjMz59IFtkaXJOb2RlPXBvc2l0aW9uV29ybGREaXJlY3Rpb25dIC0gQSBkaXJlY3Rpb24gdmVjdG9yIGZvciBzYW1wbGluZyB3aGljaCBpcyBieSBkZWZhdWx0IGBwb3NpdGlvbldvcmxkRGlyZWN0aW9uYC5cclxuICogQHJldHVybnMge0VxdWlyZWN0VVZOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGVxdWlyZWN0VVYgPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggRXF1aXJlY3RVVk5vZGUgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDAsIDEgKTtcclxuIiwiaW1wb3J0IHsgZXF1aXJlY3RVViB9IGZyb20gJy4uLy4uL25vZGVzL3V0aWxzL0VxdWlyZWN0VVZOb2RlLmpzJztcclxuaW1wb3J0IHsgdGV4dHVyZSBhcyBUU0xfVGV4dHVyZSB9IGZyb20gJy4uLy4uL25vZGVzL2FjY2Vzc29ycy9UZXh0dXJlTm9kZS5qcyc7XHJcbmltcG9ydCB7IHBvc2l0aW9uV29ybGREaXJlY3Rpb24gfSBmcm9tICcuLi8uLi9ub2Rlcy9hY2Nlc3NvcnMvUG9zaXRpb24uanMnO1xyXG5pbXBvcnQgTm9kZU1hdGVyaWFsIGZyb20gJy4uLy4uL21hdGVyaWFscy9ub2Rlcy9Ob2RlTWF0ZXJpYWwuanMnO1xyXG5cclxuaW1wb3J0IHsgV2ViR0xDdWJlUmVuZGVyVGFyZ2V0IH0gZnJvbSAnLi4vLi4vcmVuZGVyZXJzL1dlYkdMQ3ViZVJlbmRlclRhcmdldC5qcyc7XHJcbmltcG9ydCB7IFNjZW5lIH0gZnJvbSAnLi4vLi4vc2NlbmVzL1NjZW5lLmpzJztcclxuaW1wb3J0IHsgQ3ViZUNhbWVyYSB9IGZyb20gJy4uLy4uL2NhbWVyYXMvQ3ViZUNhbWVyYS5qcyc7XHJcbmltcG9ydCB7IEJveEdlb21ldHJ5IH0gZnJvbSAnLi4vLi4vZ2VvbWV0cmllcy9Cb3hHZW9tZXRyeS5qcyc7XHJcbmltcG9ydCB7IE1lc2ggfSBmcm9tICcuLi8uLi9vYmplY3RzL01lc2guanMnO1xyXG5pbXBvcnQgeyBCYWNrU2lkZSwgTm9CbGVuZGluZywgTGluZWFyRmlsdGVyLCBMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXIgfSBmcm9tICcuLi8uLi9jb25zdGFudHMuanMnO1xyXG5cclxuLy8gQFRPRE86IENvbnNpZGVyIHJlbmFtZSBXZWJHTEN1YmVSZW5kZXJUYXJnZXQgdG8ganVzdCBDdWJlUmVuZGVyVGFyZ2V0XHJcblxyXG4vKipcclxuICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgY3ViZSByZW5kZXIgdGFyZ2V0LiBJdCBpcyBhIHNwZWNpYWwgdmVyc2lvblxyXG4gKiBvZiBgV2ViR0xDdWJlUmVuZGVyVGFyZ2V0YCB3aGljaCBpcyBjb21wYXRpYmxlIHdpdGggYFdlYkdQVVJlbmRlcmVyYC5cclxuICpcclxuICogQGF1Z21lbnRzIFdlYkdMQ3ViZVJlbmRlclRhcmdldFxyXG4gKi9cclxuY2xhc3MgQ3ViZVJlbmRlclRhcmdldCBleHRlbmRzIFdlYkdMQ3ViZVJlbmRlclRhcmdldCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgY3ViZSByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtzaXplPTFdIC0gVGhlIHNpemUgb2YgdGhlIHJlbmRlciB0YXJnZXQuXHJcblx0ICogQHBhcmFtIHtSZW5kZXJUYXJnZXR+T3B0aW9uc30gW29wdGlvbnNdIC0gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBzaXplID0gMSwgb3B0aW9ucyA9IHt9ICkge1xyXG5cclxuXHRcdHN1cGVyKCBzaXplLCBvcHRpb25zICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzQ3ViZVJlbmRlclRhcmdldCA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29udmVydHMgdGhlIGdpdmVuIGVxdWlyZWN0YW5ndWxhciB0ZXh0dXJlIHRvIGEgY3ViZSBtYXAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgZXF1aXJlY3Rhbmd1bGFyIHRleHR1cmUuXHJcblx0ICogQHJldHVybiB7Q3ViZVJlbmRlclRhcmdldH0gQSByZWZlcmVuY2UgdG8gdGhpcyBjdWJlIHJlbmRlciB0YXJnZXQuXHJcblx0ICovXHJcblx0ZnJvbUVxdWlyZWN0YW5ndWxhclRleHR1cmUoIHJlbmRlcmVyLCB0ZXh0dXJlICkge1xyXG5cclxuXHRcdGNvbnN0IGN1cnJlbnRNaW5GaWx0ZXIgPSB0ZXh0dXJlLm1pbkZpbHRlcjtcclxuXHRcdGNvbnN0IGN1cnJlbnRHZW5lcmF0ZU1pcG1hcHMgPSB0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcztcclxuXHJcblx0XHR0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy50ZXh0dXJlLnR5cGUgPSB0ZXh0dXJlLnR5cGU7XHJcblx0XHR0aGlzLnRleHR1cmUuY29sb3JTcGFjZSA9IHRleHR1cmUuY29sb3JTcGFjZTtcclxuXHJcblx0XHR0aGlzLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gdGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM7XHJcblx0XHR0aGlzLnRleHR1cmUubWluRmlsdGVyID0gdGV4dHVyZS5taW5GaWx0ZXI7XHJcblx0XHR0aGlzLnRleHR1cmUubWFnRmlsdGVyID0gdGV4dHVyZS5tYWdGaWx0ZXI7XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSBuZXcgQm94R2VvbWV0cnkoIDUsIDUsIDUgKTtcclxuXHJcblx0XHRjb25zdCB1dk5vZGUgPSBlcXVpcmVjdFVWKCBwb3NpdGlvbldvcmxkRGlyZWN0aW9uICk7XHJcblxyXG5cdFx0Y29uc3QgbWF0ZXJpYWwgPSBuZXcgTm9kZU1hdGVyaWFsKCk7XHJcblx0XHRtYXRlcmlhbC5jb2xvck5vZGUgPSBUU0xfVGV4dHVyZSggdGV4dHVyZSwgdXZOb2RlLCAwICk7XHJcblx0XHRtYXRlcmlhbC5zaWRlID0gQmFja1NpZGU7XHJcblx0XHRtYXRlcmlhbC5ibGVuZGluZyA9IE5vQmxlbmRpbmc7XHJcblxyXG5cdFx0Y29uc3QgbWVzaCA9IG5ldyBNZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuXHJcblx0XHRjb25zdCBzY2VuZSA9IG5ldyBTY2VuZSgpO1xyXG5cdFx0c2NlbmUuYWRkKCBtZXNoICk7XHJcblxyXG5cdFx0Ly8gQXZvaWQgYmx1cnJlZCBwb2xlc1xyXG5cdFx0aWYgKCB0ZXh0dXJlLm1pbkZpbHRlciA9PT0gTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyICkgdGV4dHVyZS5taW5GaWx0ZXIgPSBMaW5lYXJGaWx0ZXI7XHJcblxyXG5cdFx0Y29uc3QgY2FtZXJhID0gbmV3IEN1YmVDYW1lcmEoIDEsIDEwLCB0aGlzICk7XHJcblxyXG5cdFx0Y29uc3QgY3VycmVudE1SVCA9IHJlbmRlcmVyLmdldE1SVCgpO1xyXG5cdFx0cmVuZGVyZXIuc2V0TVJUKCBudWxsICk7XHJcblxyXG5cdFx0Y2FtZXJhLnVwZGF0ZSggcmVuZGVyZXIsIHNjZW5lICk7XHJcblxyXG5cdFx0cmVuZGVyZXIuc2V0TVJUKCBjdXJyZW50TVJUICk7XHJcblxyXG5cdFx0dGV4dHVyZS5taW5GaWx0ZXIgPSBjdXJyZW50TWluRmlsdGVyO1xyXG5cdFx0dGV4dHVyZS5jdXJyZW50R2VuZXJhdGVNaXBtYXBzID0gY3VycmVudEdlbmVyYXRlTWlwbWFwcztcclxuXHJcblx0XHRtZXNoLmdlb21ldHJ5LmRpc3Bvc2UoKTtcclxuXHRcdG1lc2gubWF0ZXJpYWwuZGlzcG9zZSgpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBDdWJlUmVuZGVyVGFyZ2V0O1xyXG4iLCJpbXBvcnQgVGVtcE5vZGUgZnJvbSAnLi4vY29yZS9UZW1wTm9kZS5qcyc7XHJcbmltcG9ydCB7IE5vZGVVcGRhdGVUeXBlIH0gZnJvbSAnLi4vY29yZS9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBub2RlUHJveHkgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcbmltcG9ydCB7IEN1YmVUZXh0dXJlIH0gZnJvbSAnLi4vLi4vdGV4dHVyZXMvQ3ViZVRleHR1cmUuanMnO1xyXG5pbXBvcnQgeyBjdWJlVGV4dHVyZSB9IGZyb20gJy4uL2FjY2Vzc29ycy9DdWJlVGV4dHVyZU5vZGUuanMnO1xyXG5pbXBvcnQgQ3ViZVJlbmRlclRhcmdldCBmcm9tICcuLi8uLi9yZW5kZXJlcnMvY29tbW9uL0N1YmVSZW5kZXJUYXJnZXQuanMnO1xyXG5pbXBvcnQgeyBDdWJlUmVmbGVjdGlvbk1hcHBpbmcsIEN1YmVSZWZyYWN0aW9uTWFwcGluZywgRXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmcsIEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzLmpzJztcclxuXHJcbmNvbnN0IF9jYWNoZSA9IG5ldyBXZWFrTWFwKCk7XHJcblxyXG4vKipcclxuICogVGhpcyBub2RlIGNhbiBiZSB1c2VkIHRvIGF1dG9tYXRpY2FsbHkgY29udmVydCBlbnZpcm9ubWVudCBtYXBzIGluIHRoZVxyXG4gKiBlcXVpcmVjdGFuZ3VsYXIgZm9ybWF0IGludG8gdGhlIGN1YmUgbWFwIGZvcm1hdC5cclxuICpcclxuICogQGF1Z21lbnRzIFRlbXBOb2RlXHJcbiAqL1xyXG5jbGFzcyBDdWJlTWFwTm9kZSBleHRlbmRzIFRlbXBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnQ3ViZU1hcE5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgY3ViZSBtYXAgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gZW52Tm9kZSAtIFRoZSBub2RlIHJlcHJlc2VudGluZyB0aGUgZW52aXJvbm1lbnQgbWFwLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBlbnZOb2RlICkge1xyXG5cclxuXHRcdHN1cGVyKCAndmVjMycgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBub2RlIHJlcHJlc2VudGluZyB0aGUgZW52aXJvbm1lbnQgbWFwLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmVudk5vZGUgPSBlbnZOb2RlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIGludGVybmFsIGN1YmUgdGV4dHVyZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUgez9DdWJlVGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fY3ViZVRleHR1cmUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIGludGVybmFsIGN1YmUgdGV4dHVyZSBub2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7Q3ViZVRleHR1cmVOb2RlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9jdWJlVGV4dHVyZU5vZGUgPSBjdWJlVGV4dHVyZSggbnVsbCApO1xyXG5cclxuXHRcdGNvbnN0IGRlZmF1bHRUZXh0dXJlID0gbmV3IEN1YmVUZXh0dXJlKCk7XHJcblx0XHRkZWZhdWx0VGV4dHVyZS5pc1JlbmRlclRhcmdldFRleHR1cmUgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBkZWZhdWx0IGN1YmUgdGV4dHVyZSB0aGF0IGFjdHMgYXMgYSBwbGFjZWhvbGRlci5cclxuXHRcdCAqIEl0IGlzIHVzZWQgd2hlbiB0aGUgY29udmVyc2lvbiBmcm9tIGVxdWlyZWN0YW5ndWxhciB0byBjdWJlXHJcblx0XHQgKiBtYXAgaGFzIG5vdCBmaW5pc2hlZCB5ZXQgZm9yIGEgZ2l2ZW4gdGV4dHVyZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge0N1YmVUZXh0dXJlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9kZWZhdWx0VGV4dHVyZSA9IGRlZmF1bHRUZXh0dXJlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGB1cGRhdGVCZWZvcmVUeXBlYCBpcyBzZXQgdG8gYE5vZGVVcGRhdGVUeXBlLlJFTkRFUmAgc2luY2UgdGhlIG5vZGUgdXBkYXRlc1xyXG5cdFx0ICogdGhlIHRleHR1cmUgb25jZSBwZXIgcmVuZGVyIGluIGl0cyB7QGxpbmsgQ3ViZU1hcE5vZGUjdXBkYXRlQmVmb3JlfSBtZXRob2QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqIEBkZWZhdWx0ICdyZW5kZXInXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXBkYXRlQmVmb3JlVHlwZSA9IE5vZGVVcGRhdGVUeXBlLlJFTkRFUjtcclxuXHJcblx0fVxyXG5cclxuXHR1cGRhdGVCZWZvcmUoIGZyYW1lICkge1xyXG5cclxuXHRcdGNvbnN0IHsgcmVuZGVyZXIsIG1hdGVyaWFsIH0gPSBmcmFtZTtcclxuXHJcblx0XHRjb25zdCBlbnZOb2RlID0gdGhpcy5lbnZOb2RlO1xyXG5cclxuXHRcdGlmICggZW52Tm9kZS5pc1RleHR1cmVOb2RlIHx8IGVudk5vZGUuaXNNYXRlcmlhbFJlZmVyZW5jZU5vZGUgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB0ZXh0dXJlID0gKCBlbnZOb2RlLmlzVGV4dHVyZU5vZGUgKSA/IGVudk5vZGUudmFsdWUgOiBtYXRlcmlhbFsgZW52Tm9kZS5wcm9wZXJ0eSBdO1xyXG5cclxuXHRcdFx0aWYgKCB0ZXh0dXJlICYmIHRleHR1cmUuaXNUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBtYXBwaW5nID0gdGV4dHVyZS5tYXBwaW5nO1xyXG5cclxuXHRcdFx0XHRpZiAoIG1hcHBpbmcgPT09IEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nIHx8IG1hcHBpbmcgPT09IEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nICkge1xyXG5cclxuXHRcdFx0XHRcdC8vIGNoZWNrIGZvciBjb252ZXJ0ZWQgY3ViZW1hcCBtYXBcclxuXHJcblx0XHRcdFx0XHRpZiAoIF9jYWNoZS5oYXMoIHRleHR1cmUgKSApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnN0IGN1YmVNYXAgPSBfY2FjaGUuZ2V0KCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0XHRcdFx0XHRtYXBUZXh0dXJlTWFwcGluZyggY3ViZU1hcCwgdGV4dHVyZS5tYXBwaW5nICk7XHJcblx0XHRcdFx0XHRcdHRoaXMuX2N1YmVUZXh0dXJlID0gY3ViZU1hcDtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0Ly8gY3JlYXRlIGN1YmUgbWFwIGZyb20gZXF1aXJlY3Rhbmd1bGFyIG1hcFxyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgaW1hZ2UgPSB0ZXh0dXJlLmltYWdlO1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCBpc0VxdWlyZWN0YW5ndWxhck1hcFJlYWR5KCBpbWFnZSApICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRjb25zdCByZW5kZXJUYXJnZXQgPSBuZXcgQ3ViZVJlbmRlclRhcmdldCggaW1hZ2UuaGVpZ2h0ICk7XHJcblx0XHRcdFx0XHRcdFx0cmVuZGVyVGFyZ2V0LmZyb21FcXVpcmVjdGFuZ3VsYXJUZXh0dXJlKCByZW5kZXJlciwgdGV4dHVyZSApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRtYXBUZXh0dXJlTWFwcGluZyggcmVuZGVyVGFyZ2V0LnRleHR1cmUsIHRleHR1cmUubWFwcGluZyApO1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMuX2N1YmVUZXh0dXJlID0gcmVuZGVyVGFyZ2V0LnRleHR1cmU7XHJcblxyXG5cdFx0XHRcdFx0XHRcdF9jYWNoZS5zZXQoIHRleHR1cmUsIHJlbmRlclRhcmdldC50ZXh0dXJlICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdHRleHR1cmUuYWRkRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvblRleHR1cmVEaXNwb3NlICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0XHQvLyBkZWZhdWx0IGN1YmUgdGV4dHVyZSBhcyBmYWxsYmFjayB3aGVuIGVxdWlyZWN0YW5ndWxhciB0ZXh0dXJlIGlzIG5vdCB5ZXQgbG9hZGVkXHJcblxyXG5cdFx0XHRcdFx0XHRcdHRoaXMuX2N1YmVUZXh0dXJlID0gdGhpcy5fZGVmYXVsdFRleHR1cmU7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8vXHJcblxyXG5cdFx0XHRcdFx0dGhpcy5fY3ViZVRleHR1cmVOb2RlLnZhbHVlID0gdGhpcy5fY3ViZVRleHR1cmU7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gZW52Tm9kZSBhbHJlYWR5IHJlZmVycyB0byBhIGN1YmUgbWFwXHJcblxyXG5cdFx0XHRcdFx0dGhpcy5fY3ViZVRleHR1cmVOb2RlID0gdGhpcy5lbnZOb2RlO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdHNldHVwKCBidWlsZGVyICkge1xyXG5cclxuXHRcdHRoaXMudXBkYXRlQmVmb3JlKCBidWlsZGVyICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX2N1YmVUZXh0dXJlTm9kZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQ3ViZU1hcE5vZGU7XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBlcXVpcmVjdGFuZ3VsYXIgaW1hZ2UgaGFzIGJlZW4gZnVsbHkgbG9hZGVkXHJcbiAqIGFuZCBpcyByZWFkeSBmb3IgZnVydGhlciBwcm9jZXNzaW5nLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAcGFyYW0ge0ltYWdlfSBpbWFnZSAtIFRoZSBlcXVpcmVjdGFuZ3VsYXIgaW1hZ2UgdG8gY2hlY2suXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGltYWdlIGlzIHJlYWR5IG9yIG5vdC5cclxuICovXHJcbmZ1bmN0aW9uIGlzRXF1aXJlY3Rhbmd1bGFyTWFwUmVhZHkoIGltYWdlICkge1xyXG5cclxuXHRpZiAoIGltYWdlID09PSBudWxsIHx8IGltYWdlID09PSB1bmRlZmluZWQgKSByZXR1cm4gZmFsc2U7XHJcblxyXG5cdHJldHVybiBpbWFnZS5oZWlnaHQgPiAwO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFRoaXMgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgd2hlbiBgZGlzcG9zZSgpYCBpcyBjYWxsZWQgb24gdGhlIGVxdWlyZWN0YW5ndWxhclxyXG4gKiB0ZXh0dXJlLiBJbiB0aGlzIGNhc2UsIHRoZSBnZW5lcmF0ZWQgY3ViZSBtYXAgd2l0aCBpdHMgcmVuZGVyIHRhcmdldFxyXG4gKiBpcyBkZWxldGVkIGFzIHdlbGwuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBldmVudCAtIFRoZSBldmVudCBvYmplY3QuXHJcbiAqL1xyXG5mdW5jdGlvbiBvblRleHR1cmVEaXNwb3NlKCBldmVudCApIHtcclxuXHJcblx0Y29uc3QgdGV4dHVyZSA9IGV2ZW50LnRhcmdldDtcclxuXHJcblx0dGV4dHVyZS5yZW1vdmVFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uVGV4dHVyZURpc3Bvc2UgKTtcclxuXHJcblx0Y29uc3QgcmVuZGVyVGFyZ2V0ID0gX2NhY2hlLmdldCggdGV4dHVyZSApO1xyXG5cclxuXHRpZiAoIHJlbmRlclRhcmdldCAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdF9jYWNoZS5kZWxldGUoIHRleHR1cmUgKTtcclxuXHJcblx0XHRyZW5kZXJUYXJnZXQuZGlzcG9zZSgpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogVGhpcyBmdW5jdGlvbiBtYWtlcyBzdXJlIHRoZSBnZW5lcmF0ZWQgY3ViZSBtYXAgdXNlcyB0aGUgY29ycmVjdFxyXG4gKiB0ZXh0dXJlIG1hcHBpbmcgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZXF1aXJlY3Rhbmd1bGFyIG9yaWdpbmFsLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgY3ViZSB0ZXh0dXJlLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gbWFwcGluZyAtIFRoZSBvcmlnaW5hbCB0ZXh0dXJlIG1hcHBpbmcuXHJcbiAqL1xyXG5mdW5jdGlvbiBtYXBUZXh0dXJlTWFwcGluZyggdGV4dHVyZSwgbWFwcGluZyApIHtcclxuXHJcblx0aWYgKCBtYXBwaW5nID09PSBFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZyApIHtcclxuXHJcblx0XHR0ZXh0dXJlLm1hcHBpbmcgPSBDdWJlUmVmbGVjdGlvbk1hcHBpbmc7XHJcblxyXG5cdH0gZWxzZSBpZiAoIG1hcHBpbmcgPT09IEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nICkge1xyXG5cclxuXHRcdHRleHR1cmUubWFwcGluZyA9IEN1YmVSZWZyYWN0aW9uTWFwcGluZztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSBjdWJlIG1hcCBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IGVudk5vZGUgLSBUaGUgbm9kZSByZXByZXNlbnRpbmcgdGhlIGVudmlyb25tZW50IG1hcC5cclxuICogQHJldHVybnMge0N1YmVNYXBOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGN1YmVNYXBOb2RlID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIEN1YmVNYXBOb2RlICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAxICk7XHJcbiIsImltcG9ydCBMaWdodGluZ05vZGUgZnJvbSAnLi9MaWdodGluZ05vZGUuanMnO1xyXG5pbXBvcnQgeyBjdWJlTWFwTm9kZSB9IGZyb20gJy4uL3V0aWxzL0N1YmVNYXBOb2RlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIGEgYmFzaWMgbW9kZWwgZm9yIEltYWdlLWJhc2VkIGxpZ2h0aW5nIChJQkwpLiBUaGUgZW52aXJvbm1lbnRcclxuICogaXMgZGVmaW5lZCB2aWEgZW52aXJvbm1lbnQgbWFwcyBpbiB0aGUgZXF1aXJlY3Rhbmd1bGFyIG9yIGN1YmUgbWFwIGZvcm1hdC5cclxuICogYEJhc2ljRW52aXJvbm1lbnROb2RlYCBpcyBpbnRlbmRlZCBmb3Igbm9uLVBCUiBtYXRlcmlhbHMgbGlrZSB7QGxpbmsgTWVzaEJhc2ljTm9kZU1hdGVyaWFsfVxyXG4gKiBvciB7QGxpbmsgTWVzaFBob25nTm9kZU1hdGVyaWFsfS5cclxuICpcclxuICogQGF1Z21lbnRzIExpZ2h0aW5nTm9kZVxyXG4gKi9cclxuY2xhc3MgQmFzaWNFbnZpcm9ubWVudE5vZGUgZXh0ZW5kcyBMaWdodGluZ05vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdCYXNpY0Vudmlyb25tZW50Tm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBiYXNpYyBlbnZpcm9ubWVudCBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlfSBbZW52Tm9kZT1udWxsXSAtIEEgbm9kZSByZXByZXNlbnRpbmcgdGhlIGVudmlyb25tZW50LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBlbnZOb2RlID0gbnVsbCApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBub2RlIHJlcHJlc2VudGluZyB0aGUgZW52aXJvbm1lbnQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZW52Tm9kZSA9IGVudk5vZGU7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXAoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Ly8gZW52aXJvbm1lbnQgcHJvcGVydHkgaXMgdXNlZCBpbiB0aGUgZmluaXNoKCkgbWV0aG9kIG9mIEJhc2ljTGlnaHRpbmdNb2RlbFxyXG5cclxuXHRcdGJ1aWxkZXIuY29udGV4dC5lbnZpcm9ubWVudCA9IGN1YmVNYXBOb2RlKCB0aGlzLmVudk5vZGUgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQmFzaWNFbnZpcm9ubWVudE5vZGU7XHJcbiIsImltcG9ydCBMaWdodGluZ05vZGUgZnJvbSAnLi9MaWdodGluZ05vZGUuanMnO1xyXG5pbXBvcnQgeyBmbG9hdCB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIHNwZWNpZmljIHZlcnNpb24gb2Yge0BsaW5rIElycmFkaWFuY2VOb2RlfSB0aGF0IGlzIG9ubHkgcmVsZXZhbnRcclxuICogZm9yIHtAbGluayBNZXNoQmFzaWNOb2RlTWF0ZXJpYWx9LiBTaW5jZSB0aGUgbWF0ZXJpYWwgaXMgdW5saXQsIGl0XHJcbiAqIHJlcXVpcmVzIGEgc3BlY2lhbCBzY2FsaW5nIGZhY3RvciBmb3IgdGhlIGxpZ2h0IG1hcC5cclxuICpcclxuICogQGF1Z21lbnRzIExpZ2h0aW5nTm9kZVxyXG4gKi9cclxuY2xhc3MgQmFzaWNMaWdodE1hcE5vZGUgZXh0ZW5kcyBMaWdodGluZ05vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdCYXNpY0xpZ2h0TWFwTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBiYXNpYyBsaWdodCBtYXAgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7P05vZGU8dmVjMz59IFtsaWdodE1hcE5vZGU9bnVsbF0gLSBUaGUgbGlnaHQgbWFwIG5vZGUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGxpZ2h0TWFwTm9kZSA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBsaWdodCBtYXAgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGU8dmVjMz59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGlnaHRNYXBOb2RlID0gbGlnaHRNYXBOb2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdHNldHVwKCBidWlsZGVyICkge1xyXG5cclxuXHRcdC8vIGlycmFkaWFuY2VMaWdodE1hcCBwcm9wZXJ0eSBpcyB1c2VkIGluIHRoZSBpbmRpcmVjdERpZmZ1c2UoKSBtZXRob2Qgb2YgQmFzaWNMaWdodGluZ01vZGVsXHJcblxyXG5cdFx0Y29uc3QgUkVDSVBST0NBTF9QSSA9IGZsb2F0KCAxIC8gTWF0aC5QSSApO1xyXG5cclxuXHRcdGJ1aWxkZXIuY29udGV4dC5pcnJhZGlhbmNlTGlnaHRNYXAgPSB0aGlzLmxpZ2h0TWFwTm9kZS5tdWwoIFJFQ0lQUk9DQUxfUEkgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQmFzaWNMaWdodE1hcE5vZGU7XHJcbiIsIi8qKlxyXG4gKiBBYnN0cmFjdCBjbGFzcyBmb3IgaW1wbGVtZW50aW5nIGxpZ2h0aW5nIG1vZGVscy4gVGhlIG1vZHVsZSBkZWZpbmVzXHJcbiAqIG11bHRpcGxlIG1ldGhvZHMgdGhhdCBjb25jcmV0ZSBsaWdodGluZyBtb2RlbHMgY2FuIGltcGxlbWVudC4gVGhlc2VcclxuICogbWV0aG9kcyBhcmUgZXhlY3V0ZWQgYXQgZGlmZmVyZW50IHBvaW50cyBkdXJpbmcgdGhlIGxpZ2h0IGV2YWx1YXRpb25cclxuICogcHJvY2Vzcy5cclxuICovXHJcbmNsYXNzIExpZ2h0aW5nTW9kZWwge1xyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3Igc2V0dGluZyB1cCBsaWdodGluZyBtb2RlbCBhbmQgY29udGV4dCBkYXRhXHJcblx0ICogd2hpY2ggYXJlIGxhdGVyIHVzZWQgaW4gdGhlIGV2YWx1YXRpb24gcHJvY2Vzcy5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICovXHJcblx0c3RhcnQoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Ly8gbGlnaHRzICggZGlyZWN0IClcclxuXHJcblx0XHRidWlsZGVyLmxpZ2h0c05vZGUuc2V0dXBMaWdodHMoIGJ1aWxkZXIsIGJ1aWxkZXIubGlnaHRzTm9kZS5nZXRMaWdodE5vZGVzKCBidWlsZGVyICkgKTtcclxuXHJcblx0XHQvLyBpbmRpcmVjdFxyXG5cclxuXHRcdHRoaXMuaW5kaXJlY3QoIGJ1aWxkZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgZXhlY3V0aW5nIGZpbmFsIHRhc2tzIGxpa2UgZmluYWwgdXBkYXRlc1xyXG5cdCAqIHRvIHRoZSBvdXRnb2luZyBsaWdodC5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICovXHJcblx0ZmluaXNoKCAvKmJ1aWxkZXIqLyApIHsgfVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgaW1wbGVtZW50aW5nIHRoZSBkaXJlY3QgbGlnaHQgdGVybSBhbmRcclxuXHQgKiBleGVjdXRlZCBkdXJpbmcgdGhlIGJ1aWxkIHByb2Nlc3Mgb2YgZGlyZWN0aW9uYWwsIHBvaW50IGFuZCBzcG90IGxpZ2h0IG5vZGVzLlxyXG5cdCAqXHJcblx0ICogQGFic3RyYWN0XHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGxpZ2h0RGF0YSAtIFRoZSBsaWdodCBkYXRhLlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICovXHJcblx0ZGlyZWN0KCAvKmxpZ2h0RGF0YSwgYnVpbGRlciovICkgeyB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciBpbXBsZW1lbnRpbmcgdGhlIGRpcmVjdCBsaWdodCB0ZXJtIGZvclxyXG5cdCAqIHJlY3QgYXJlYSBsaWdodCBub2Rlcy5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBsaWdodERhdGEgLSBUaGUgbGlnaHQgZGF0YS5cclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqL1xyXG5cdGRpcmVjdFJlY3RBcmVhKCAvKmxpZ2h0RGF0YSwgYnVpbGRlciovICkge31cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIGltcGxlbWVudGluZyB0aGUgaW5kaXJlY3QgbGlnaHQgdGVybS5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICovXHJcblx0aW5kaXJlY3QoIC8qYnVpbGRlciovICkgeyB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciBpbXBsZW1lbnRpbmcgdGhlIGFtYmllbnQgb2NjbHVzaW9uIHRlcm0uXHJcblx0ICogVW5saWtlIG90aGVyIG1ldGhvZHMsIHRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIG1hbnVhbGx5IGJ5IHRoZSBsaWdodGluZ1xyXG5cdCAqIG1vZGVsIGluIGl0cyBpbmRpcmVjdCB0ZXJtLlxyXG5cdCAqXHJcblx0ICogQGFic3RyYWN0XHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKi9cclxuXHRhbWJpZW50T2NjbHVzaW9uKCAvKmlucHV0LCBzdGFjaywgYnVpbGRlciovICkgeyB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBMaWdodGluZ01vZGVsO1xyXG4iLCJpbXBvcnQgTGlnaHRpbmdNb2RlbCBmcm9tICcuLi9jb3JlL0xpZ2h0aW5nTW9kZWwuanMnO1xyXG5pbXBvcnQgeyBkaWZmdXNlQ29sb3IgfSBmcm9tICcuLi9jb3JlL1Byb3BlcnR5Tm9kZS5qcyc7XHJcbmltcG9ydCB7IE11bHRpcGx5T3BlcmF0aW9uLCBNaXhPcGVyYXRpb24sIEFkZE9wZXJhdGlvbiB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IG1hdGVyaWFsU3BlY3VsYXJTdHJlbmd0aCwgbWF0ZXJpYWxSZWZsZWN0aXZpdHkgfSBmcm9tICcuLi9hY2Nlc3NvcnMvTWF0ZXJpYWxOb2RlLmpzJztcclxuaW1wb3J0IHsgbWl4IH0gZnJvbSAnLi4vbWF0aC9NYXRoTm9kZS5qcyc7XHJcbmltcG9ydCB7IHZlYzQgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyB0aGUgbGlnaHRpbmcgbW9kZWwgZm9yIHVubGl0IG1hdGVyaWFscy4gVGhlIG9ubHkgbGlnaHQgY29udHJpYnV0aW9uXHJcbiAqIGlzIGJha2VkIGluZGlyZWN0IGxpZ2h0aW5nIG1vZHVsYXRlZCB3aXRoIGFtYmllbnQgb2NjbHVzaW9uIGFuZCB0aGUgbWF0ZXJpYWwnc1xyXG4gKiBkaWZmdXNlIGNvbG9yLiBFbnZpcm9ubWVudCBtYXBwaW5nIGlzIHN1cHBvcnRlZC4gVXNlZCBpbiB7QGxpbmsgTWVzaEJhc2ljTm9kZU1hdGVyaWFsfS5cclxuICpcclxuICogQGF1Z21lbnRzIExpZ2h0aW5nTW9kZWxcclxuICovXHJcbmNsYXNzIEJhc2ljTGlnaHRpbmdNb2RlbCBleHRlbmRzIExpZ2h0aW5nTW9kZWwge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGJhc2ljIGxpZ2h0aW5nIG1vZGVsLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW1wbGVtZW50cyB0aGUgYmFrZWQgaW5kaXJlY3QgbGlnaHRpbmcgd2l0aCBpdHMgbW9kdWxhdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICovXHJcblx0aW5kaXJlY3QoIHsgY29udGV4dCB9ICkge1xyXG5cclxuXHRcdGNvbnN0IGFtYmllbnRPY2NsdXNpb24gPSBjb250ZXh0LmFtYmllbnRPY2NsdXNpb247XHJcblx0XHRjb25zdCByZWZsZWN0ZWRMaWdodCA9IGNvbnRleHQucmVmbGVjdGVkTGlnaHQ7XHJcblx0XHRjb25zdCBpcnJhZGlhbmNlTGlnaHRNYXAgPSBjb250ZXh0LmlycmFkaWFuY2VMaWdodE1hcDtcclxuXHJcblx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UuYXNzaWduKCB2ZWM0KCAwLjAgKSApO1xyXG5cclxuXHRcdC8vIGFjY3VtdWxhdGlvbiAoYmFrZWQgaW5kaXJlY3QgbGlnaHRpbmcgb25seSlcclxuXHJcblx0XHRpZiAoIGlycmFkaWFuY2VMaWdodE1hcCApIHtcclxuXHJcblx0XHRcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZS5hZGRBc3NpZ24oIGlycmFkaWFuY2VMaWdodE1hcCApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UuYWRkQXNzaWduKCB2ZWM0KCAxLjAsIDEuMCwgMS4wLCAwLjAgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBtb2R1bGF0aW9uXHJcblxyXG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlLm11bEFzc2lnbiggYW1iaWVudE9jY2x1c2lvbiApO1xyXG5cclxuXHRcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZS5tdWxBc3NpZ24oIGRpZmZ1c2VDb2xvci5yZ2IgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJbXBsZW1lbnRzIHRoZSBlbnZpcm9ubWVudCBtYXBwaW5nLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKi9cclxuXHRmaW5pc2goIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBtYXRlcmlhbCwgY29udGV4dCB9ID0gYnVpbGRlcjtcclxuXHJcblx0XHRjb25zdCBvdXRnb2luZ0xpZ2h0ID0gY29udGV4dC5vdXRnb2luZ0xpZ2h0O1xyXG5cdFx0Y29uc3QgZW52Tm9kZSA9IGJ1aWxkZXIuY29udGV4dC5lbnZpcm9ubWVudDtcclxuXHJcblx0XHRpZiAoIGVudk5vZGUgKSB7XHJcblxyXG5cdFx0XHRzd2l0Y2ggKCBtYXRlcmlhbC5jb21iaW5lICkge1xyXG5cclxuXHRcdFx0XHRjYXNlIE11bHRpcGx5T3BlcmF0aW9uOlxyXG5cdFx0XHRcdFx0b3V0Z29pbmdMaWdodC5yZ2IuYXNzaWduKCBtaXgoIG91dGdvaW5nTGlnaHQucmdiLCBvdXRnb2luZ0xpZ2h0LnJnYi5tdWwoIGVudk5vZGUucmdiICksIG1hdGVyaWFsU3BlY3VsYXJTdHJlbmd0aC5tdWwoIG1hdGVyaWFsUmVmbGVjdGl2aXR5ICkgKSApO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdGNhc2UgTWl4T3BlcmF0aW9uOlxyXG5cdFx0XHRcdFx0b3V0Z29pbmdMaWdodC5yZ2IuYXNzaWduKCBtaXgoIG91dGdvaW5nTGlnaHQucmdiLCBlbnZOb2RlLnJnYiwgbWF0ZXJpYWxTcGVjdWxhclN0cmVuZ3RoLm11bCggbWF0ZXJpYWxSZWZsZWN0aXZpdHkgKSApICk7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0Y2FzZSBBZGRPcGVyYXRpb246XHJcblx0XHRcdFx0XHRvdXRnb2luZ0xpZ2h0LnJnYi5hZGRBc3NpZ24oIGVudk5vZGUucmdiLm11bCggbWF0ZXJpYWxTcGVjdWxhclN0cmVuZ3RoLm11bCggbWF0ZXJpYWxSZWZsZWN0aXZpdHkgKSApICk7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJhc2ljTGlnaHRpbmdNb2RlbDogVW5zdXBwb3J0ZWQgLmNvbWJpbmUgdmFsdWU6JywgbWF0ZXJpYWwuY29tYmluZSApO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBCYXNpY0xpZ2h0aW5nTW9kZWw7XHJcbiIsImltcG9ydCBOb2RlTWF0ZXJpYWwgZnJvbSAnLi9Ob2RlTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyBtYXRlcmlhbExpZ2h0TWFwIH0gZnJvbSAnLi4vLi4vbm9kZXMvYWNjZXNzb3JzL01hdGVyaWFsTm9kZS5qcyc7XHJcbmltcG9ydCBCYXNpY0Vudmlyb25tZW50Tm9kZSBmcm9tICcuLi8uLi9ub2Rlcy9saWdodGluZy9CYXNpY0Vudmlyb25tZW50Tm9kZS5qcyc7XHJcbmltcG9ydCBCYXNpY0xpZ2h0TWFwTm9kZSBmcm9tICcuLi8uLi9ub2Rlcy9saWdodGluZy9CYXNpY0xpZ2h0TWFwTm9kZS5qcyc7XHJcbmltcG9ydCBCYXNpY0xpZ2h0aW5nTW9kZWwgZnJvbSAnLi4vLi4vbm9kZXMvZnVuY3Rpb25zL0Jhc2ljTGlnaHRpbmdNb2RlbC5qcyc7XHJcbmltcG9ydCB7IG5vcm1hbFZpZXcgfSBmcm9tICcuLi8uLi9ub2Rlcy9hY2Nlc3NvcnMvTm9ybWFsLmpzJztcclxuaW1wb3J0IHsgZGlmZnVzZUNvbG9yIH0gZnJvbSAnLi4vLi4vbm9kZXMvY29yZS9Qcm9wZXJ0eU5vZGUuanMnO1xyXG5cclxuaW1wb3J0IHsgTWVzaEJhc2ljTWF0ZXJpYWwgfSBmcm9tICcuLi9NZXNoQmFzaWNNYXRlcmlhbC5qcyc7XHJcblxyXG5jb25zdCBfZGVmYXVsdFZhbHVlcyA9IC8qQF9fUFVSRV9fKi8gbmV3IE1lc2hCYXNpY01hdGVyaWFsKCk7XHJcblxyXG4vKipcclxuICogTm9kZSBtYXRlcmlhbCB2ZXJzaW9uIG9mIHtAbGluayBNZXNoQmFzaWNNYXRlcmlhbH0uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBOb2RlTWF0ZXJpYWxcclxuICovXHJcbmNsYXNzIE1lc2hCYXNpY05vZGVNYXRlcmlhbCBleHRlbmRzIE5vZGVNYXRlcmlhbCB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ01lc2hCYXNpY05vZGVNYXRlcmlhbCc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBtZXNoIGJhc2ljIG5vZGUgbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtZXRlcnNdIC0gVGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwYXJhbWV0ZXJzICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzTWVzaEJhc2ljTm9kZU1hdGVyaWFsID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFsdGhvdWdoIHRoZSBiYXNpYyBtYXRlcmlhbCBpcyBieSBkZWZpbml0aW9uIHVubGl0LCB3ZSBzZXRcclxuXHRcdCAqIHRoaXMgcHJvcGVydHkgdG8gYHRydWVgIHNpbmNlIHdlIHVzZSBhIGxpZ2h0aW5nIG1vZGVsIHRvIGNvbXB1dGVcclxuXHRcdCAqIHRoZSBvdXRnb2luZyBsaWdodCBvZiB0aGUgZnJhZ21lbnQgc2hhZGVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxpZ2h0cyA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy5zZXREZWZhdWx0VmFsdWVzKCBfZGVmYXVsdFZhbHVlcyApO1xyXG5cclxuXHRcdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQmFzaWMgbWF0ZXJpYWxzIGFyZSBub3QgYWZmZWN0ZWQgYnkgbm9ybWFsIGFuZCBidW1wIG1hcHMgc28gd2VcclxuXHQgKiByZXR1cm4gYnkgZGVmYXVsdCB7QGxpbmsgbm9ybWFsVmlld30uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtOb2RlPHZlYzM+fSBUaGUgbm9ybWFsIG5vZGUuXHJcblx0ICovXHJcblx0c2V0dXBOb3JtYWwoKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5vcm1hbFZpZXc7IC8vIHNlZSAjMjg4MzlcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBPdmVyd3JpdHRlbiBzaW5jZSB0aGlzIHR5cGUgb2YgbWF0ZXJpYWwgdXNlcyB7QGxpbmsgQmFzaWNFbnZpcm9ubWVudE5vZGV9XHJcblx0ICogdG8gaW1wbGVtZW50IHRoZSBkZWZhdWx0IGVudmlyb25tZW50IG1hcHBpbmcuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4gez9CYXNpY0Vudmlyb25tZW50Tm9kZTx2ZWMzPn0gVGhlIGVudmlyb25tZW50IG5vZGUuXHJcblx0ICovXHJcblx0c2V0dXBFbnZpcm9ubWVudCggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCBlbnZOb2RlID0gc3VwZXIuc2V0dXBFbnZpcm9ubWVudCggYnVpbGRlciApO1xyXG5cclxuXHRcdHJldHVybiBlbnZOb2RlID8gbmV3IEJhc2ljRW52aXJvbm1lbnROb2RlKCBlbnZOb2RlICkgOiBudWxsO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIG11c3QgYmUgb3ZlcndyaXR0ZW4gc2luY2UgbGlnaHQgbWFwcyBhcmUgZXZhbHVhdGVkXHJcblx0ICogd2l0aCBhIHNwZWNpYWwgc2NhbGluZyBmYWN0b3IgZm9yIGJhc2ljIG1hdGVyaWFscy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7P0Jhc2ljTGlnaHRNYXBOb2RlPHZlYzM+fSBUaGUgbGlnaHQgbWFwIG5vZGUuXHJcblx0ICovXHJcblx0c2V0dXBMaWdodE1hcCggYnVpbGRlciApIHtcclxuXHJcblx0XHRsZXQgbm9kZSA9IG51bGw7XHJcblxyXG5cdFx0aWYgKCBidWlsZGVyLm1hdGVyaWFsLmxpZ2h0TWFwICkge1xyXG5cclxuXHRcdFx0bm9kZSA9IG5ldyBCYXNpY0xpZ2h0TWFwTm9kZSggbWF0ZXJpYWxMaWdodE1hcCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbm9kZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgbWF0ZXJpYWwgb3ZlcndyaXRlcyB0aGlzIG1ldGhvZCBiZWNhdXNlIGBsaWdodHNgIGlzIHNldCB0byBgdHJ1ZWAgYnV0XHJcblx0ICogd2Ugc3RpbGwgd2FudCB0byByZXR1cm4gdGhlIGRpZmZ1c2UgY29sb3IgYXMgdGhlIG91dGdvaW5nIGxpZ2h0LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Tm9kZTx2ZWMzPn0gVGhlIG91dGdvaW5nIGxpZ2h0IG5vZGUuXHJcblx0ICovXHJcblx0c2V0dXBPdXRnb2luZ0xpZ2h0KCkge1xyXG5cclxuXHRcdHJldHVybiBkaWZmdXNlQ29sb3IucmdiO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHVwcyB0aGUgbGlnaHRpbmcgbW9kZWwuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtCYXNpY0xpZ2h0aW5nTW9kZWx9IFRoZSBsaWdodGluZyBtb2RlbC5cclxuXHQgKi9cclxuXHRzZXR1cExpZ2h0aW5nTW9kZWwoKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBCYXNpY0xpZ2h0aW5nTW9kZWwoKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTWVzaEJhc2ljTm9kZU1hdGVyaWFsO1xyXG4iLCJpbXBvcnQgeyBGbiB9IGZyb20gJy4uLy4uL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbmNvbnN0IEZfU2NobGljayA9IC8qQF9fUFVSRV9fKi8gRm4oICggeyBmMCwgZjkwLCBkb3RWSCB9ICkgPT4ge1xyXG5cclxuXHQvLyBPcmlnaW5hbCBhcHByb3hpbWF0aW9uIGJ5IENocmlzdG9waGUgU2NobGljayAnOTRcclxuXHQvLyBmbG9hdCBmcmVzbmVsID0gcG93KCAxLjAgLSBkb3RWSCwgNS4wICk7XHJcblxyXG5cdC8vIE9wdGltaXplZCB2YXJpYW50IChwcmVzZW50ZWQgYnkgRXBpYyBhdCBTSUdHUkFQSCAnMTMpXHJcblx0Ly8gaHR0cHM6Ly9jZG4yLnVucmVhbGVuZ2luZS5jb20vUmVzb3VyY2VzL2ZpbGVzLzIwMTNTaWdncmFwaFByZXNlbnRhdGlvbnNOb3Rlcy0yNjkxNTczOC5wZGZcclxuXHRjb25zdCBmcmVzbmVsID0gZG90VkgubXVsKCAtIDUuNTU0NzMgKS5zdWIoIDYuOTgzMTYgKS5tdWwoIGRvdFZIICkuZXhwMigpO1xyXG5cclxuXHRyZXR1cm4gZjAubXVsKCBmcmVzbmVsLm9uZU1pbnVzKCkgKS5hZGQoIGY5MC5tdWwoIGZyZXNuZWwgKSApO1xyXG5cclxufSApOyAvLyB2YWxpZGF0ZWRcclxuXHJcbmV4cG9ydCBkZWZhdWx0IEZfU2NobGljaztcclxuIiwiaW1wb3J0IHsgRm4gfSBmcm9tICcuLi8uLi90c2wvVFNMQmFzZS5qcyc7XHJcblxyXG5jb25zdCBCUkRGX0xhbWJlcnQgPSAvKkBfX1BVUkVfXyovIEZuKCAoIGlucHV0cyApID0+IHtcclxuXHJcblx0cmV0dXJuIGlucHV0cy5kaWZmdXNlQ29sb3IubXVsKCAxIC8gTWF0aC5QSSApOyAvLyBwdW5jdHVhbCBsaWdodFxyXG5cclxufSApOyAvLyB2YWxpZGF0ZWRcclxuXHJcbmV4cG9ydCBkZWZhdWx0IEJSREZfTGFtYmVydDtcclxuIiwiaW1wb3J0IEJhc2ljTGlnaHRpbmdNb2RlbCBmcm9tICcuL0Jhc2ljTGlnaHRpbmdNb2RlbC5qcyc7XHJcbmltcG9ydCBGX1NjaGxpY2sgZnJvbSAnLi9CU0RGL0ZfU2NobGljay5qcyc7XHJcbmltcG9ydCBCUkRGX0xhbWJlcnQgZnJvbSAnLi9CU0RGL0JSREZfTGFtYmVydC5qcyc7XHJcbmltcG9ydCB7IGRpZmZ1c2VDb2xvciwgc2hpbmluZXNzLCBzcGVjdWxhckNvbG9yIH0gZnJvbSAnLi4vY29yZS9Qcm9wZXJ0eU5vZGUuanMnO1xyXG5pbXBvcnQgeyB0cmFuc2Zvcm1lZE5vcm1hbFZpZXcgfSBmcm9tICcuLi9hY2Nlc3NvcnMvTm9ybWFsLmpzJztcclxuaW1wb3J0IHsgbWF0ZXJpYWxTcGVjdWxhclN0cmVuZ3RoIH0gZnJvbSAnLi4vYWNjZXNzb3JzL01hdGVyaWFsTm9kZS5qcyc7XHJcbmltcG9ydCB7IHBvc2l0aW9uVmlld0RpcmVjdGlvbiB9IGZyb20gJy4uL2FjY2Vzc29ycy9Qb3NpdGlvbi5qcyc7XHJcbmltcG9ydCB7IEZuLCBmbG9hdCB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbmNvbnN0IEdfQmxpbm5QaG9uZ19JbXBsaWNpdCA9ICgpID0+IGZsb2F0KCAwLjI1ICk7XHJcblxyXG5jb25zdCBEX0JsaW5uUGhvbmcgPSAvKkBfX1BVUkVfXyovIEZuKCAoIHsgZG90TkggfSApID0+IHtcclxuXHJcblx0cmV0dXJuIHNoaW5pbmVzcy5tdWwoIGZsb2F0KCAwLjUgKSApLmFkZCggMS4wICkubXVsKCBmbG9hdCggMSAvIE1hdGguUEkgKSApLm11bCggZG90TkgucG93KCBzaGluaW5lc3MgKSApO1xyXG5cclxufSApO1xyXG5cclxuY29uc3QgQlJERl9CbGlublBob25nID0gLypAX19QVVJFX18qLyBGbiggKCB7IGxpZ2h0RGlyZWN0aW9uIH0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IGhhbGZEaXIgPSBsaWdodERpcmVjdGlvbi5hZGQoIHBvc2l0aW9uVmlld0RpcmVjdGlvbiApLm5vcm1hbGl6ZSgpO1xyXG5cclxuXHRjb25zdCBkb3ROSCA9IHRyYW5zZm9ybWVkTm9ybWFsVmlldy5kb3QoIGhhbGZEaXIgKS5jbGFtcCgpO1xyXG5cdGNvbnN0IGRvdFZIID0gcG9zaXRpb25WaWV3RGlyZWN0aW9uLmRvdCggaGFsZkRpciApLmNsYW1wKCk7XHJcblxyXG5cdGNvbnN0IEYgPSBGX1NjaGxpY2soIHsgZjA6IHNwZWN1bGFyQ29sb3IsIGY5MDogMS4wLCBkb3RWSCB9ICk7XHJcblx0Y29uc3QgRyA9IEdfQmxpbm5QaG9uZ19JbXBsaWNpdCgpO1xyXG5cdGNvbnN0IEQgPSBEX0JsaW5uUGhvbmcoIHsgZG90TkggfSApO1xyXG5cclxuXHRyZXR1cm4gRi5tdWwoIEcgKS5tdWwoIEQgKTtcclxuXHJcbn0gKTtcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIHRoZSBsaWdodGluZyBtb2RlbCBmb3IgYSBwaG9uZyBtYXRlcmlhbC4gVXNlZCBpbiB7QGxpbmsgTWVzaFBob25nTm9kZU1hdGVyaWFsfS5cclxuICpcclxuICogQGF1Z21lbnRzIEJhc2ljTGlnaHRpbmdNb2RlbFxyXG4gKi9cclxuY2xhc3MgUGhvbmdMaWdodGluZ01vZGVsIGV4dGVuZHMgQmFzaWNMaWdodGluZ01vZGVsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBwaG9uZyBsaWdodGluZyBtb2RlbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW3NwZWN1bGFyPXRydWVdIC0gV2hldGhlciBzcGVjdWxhciBpcyBzdXBwb3J0ZWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBzcGVjdWxhciA9IHRydWUgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgc3BlY3VsYXIgaXMgc3VwcG9ydGVkIG9yIG5vdC4gU2V0IHRoaXMgdG8gYGZhbHNlYCBpZiB5b3UgYXJlXHJcblx0XHQgKiBsb29raW5nIGZvciBhIExhbWJlcnQtbGlrZSBtYXRlcmlhbCBtZWFuaW5nIGEgbWF0ZXJpYWwgZm9yIG5vbi1zaGlueVxyXG5cdFx0ICogc3VyZmFjZXMsIHdpdGhvdXQgc3BlY3VsYXIgaGlnaGxpZ2h0cy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zcGVjdWxhciA9IHNwZWN1bGFyO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEltcGxlbWVudHMgdGhlIGRpcmVjdCBsaWdodGluZy4gVGhlIHNwZWN1bGFyIHBvcnRpb24gaXMgb3B0aW9uYWwgYW4gY2FuIGJlIGNvbnRyb2xsZWRcclxuXHQgKiB3aXRoIHRoZSB7QGxpbmsgUGhvbmdMaWdodGluZ01vZGVsI3NwZWN1bGFyfSBmbGFnLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGxpZ2h0RGF0YSAtIFRoZSBsaWdodCBkYXRhLlxyXG5cdCAqL1xyXG5cdGRpcmVjdCggeyBsaWdodERpcmVjdGlvbiwgbGlnaHRDb2xvciwgcmVmbGVjdGVkTGlnaHQgfSApIHtcclxuXHJcblx0XHRjb25zdCBkb3ROTCA9IHRyYW5zZm9ybWVkTm9ybWFsVmlldy5kb3QoIGxpZ2h0RGlyZWN0aW9uICkuY2xhbXAoKTtcclxuXHRcdGNvbnN0IGlycmFkaWFuY2UgPSBkb3ROTC5tdWwoIGxpZ2h0Q29sb3IgKTtcclxuXHJcblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlLmFkZEFzc2lnbiggaXJyYWRpYW5jZS5tdWwoIEJSREZfTGFtYmVydCggeyBkaWZmdXNlQ29sb3I6IGRpZmZ1c2VDb2xvci5yZ2IgfSApICkgKTtcclxuXHJcblx0XHRpZiAoIHRoaXMuc3BlY3VsYXIgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhci5hZGRBc3NpZ24oIGlycmFkaWFuY2UubXVsKCBCUkRGX0JsaW5uUGhvbmcoIHsgbGlnaHREaXJlY3Rpb24gfSApICkubXVsKCBtYXRlcmlhbFNwZWN1bGFyU3RyZW5ndGggKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJbXBsZW1lbnRzIHRoZSBpbmRpcmVjdCBsaWdodGluZy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICovXHJcblx0aW5kaXJlY3QoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBhbWJpZW50T2NjbHVzaW9uLCBpcnJhZGlhbmNlLCByZWZsZWN0ZWRMaWdodCB9ID0gYnVpbGRlci5jb250ZXh0O1xyXG5cclxuXHRcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZS5hZGRBc3NpZ24oIGlycmFkaWFuY2UubXVsKCBCUkRGX0xhbWJlcnQoIHsgZGlmZnVzZUNvbG9yIH0gKSApICk7XHJcblxyXG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlLm11bEFzc2lnbiggYW1iaWVudE9jY2x1c2lvbiApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBQaG9uZ0xpZ2h0aW5nTW9kZWw7XHJcbiIsImltcG9ydCBOb2RlTWF0ZXJpYWwgZnJvbSAnLi9Ob2RlTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgQmFzaWNFbnZpcm9ubWVudE5vZGUgZnJvbSAnLi4vLi4vbm9kZXMvbGlnaHRpbmcvQmFzaWNFbnZpcm9ubWVudE5vZGUuanMnO1xyXG5pbXBvcnQgUGhvbmdMaWdodGluZ01vZGVsIGZyb20gJy4uLy4uL25vZGVzL2Z1bmN0aW9ucy9QaG9uZ0xpZ2h0aW5nTW9kZWwuanMnO1xyXG5cclxuaW1wb3J0IHsgTWVzaExhbWJlcnRNYXRlcmlhbCB9IGZyb20gJy4uL01lc2hMYW1iZXJ0TWF0ZXJpYWwuanMnO1xyXG5cclxuY29uc3QgX2RlZmF1bHRWYWx1ZXMgPSAvKkBfX1BVUkVfXyovIG5ldyBNZXNoTGFtYmVydE1hdGVyaWFsKCk7XHJcblxyXG4vKipcclxuICogTm9kZSBtYXRlcmlhbCB2ZXJzaW9uIG9mIHtAbGluayBNZXNoTGFtYmVydE1hdGVyaWFsfS5cclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVNYXRlcmlhbFxyXG4gKi9cclxuY2xhc3MgTWVzaExhbWJlcnROb2RlTWF0ZXJpYWwgZXh0ZW5kcyBOb2RlTWF0ZXJpYWwge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdNZXNoTGFtYmVydE5vZGVNYXRlcmlhbCc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBtZXNoIGxhbWJlcnQgbm9kZSBtYXRlcmlhbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1ldGVyc10gLSBUaGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHBhcmFtZXRlcnMgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNNZXNoTGFtYmVydE5vZGVNYXRlcmlhbCA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTZXQgdG8gYHRydWVgIGJlY2F1c2UgbGFtYmVydCBtYXRlcmlhbHMgcmVhY3Qgb24gbGlnaHRzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxpZ2h0cyA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy5zZXREZWZhdWx0VmFsdWVzKCBfZGVmYXVsdFZhbHVlcyApO1xyXG5cclxuXHRcdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogT3ZlcndyaXR0ZW4gc2luY2UgdGhpcyB0eXBlIG9mIG1hdGVyaWFsIHVzZXMge0BsaW5rIEJhc2ljRW52aXJvbm1lbnROb2RlfVxyXG5cdCAqIHRvIGltcGxlbWVudCB0aGUgZGVmYXVsdCBlbnZpcm9ubWVudCBtYXBwaW5nLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHs/QmFzaWNFbnZpcm9ubWVudE5vZGU8dmVjMz59IFRoZSBlbnZpcm9ubWVudCBub2RlLlxyXG5cdCAqL1xyXG5cdHNldHVwRW52aXJvbm1lbnQoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgZW52Tm9kZSA9IHN1cGVyLnNldHVwRW52aXJvbm1lbnQoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRyZXR1cm4gZW52Tm9kZSA/IG5ldyBCYXNpY0Vudmlyb25tZW50Tm9kZSggZW52Tm9kZSApIDogbnVsbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXR1cHMgdGhlIGxpZ2h0aW5nIG1vZGVsLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7UGhvbmdMaWdodGluZ01vZGVsfSBUaGUgbGlnaHRpbmcgbW9kZWwuXHJcblx0ICovXHJcblx0c2V0dXBMaWdodGluZ01vZGVsKCAvKmJ1aWxkZXIqLyApIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IFBob25nTGlnaHRpbmdNb2RlbCggZmFsc2UgKTsgLy8gKCBzcGVjdWxhciApIC0+IGZvcmNlIGxhbWJlcnRcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTWVzaExhbWJlcnROb2RlTWF0ZXJpYWw7XHJcbiIsImltcG9ydCBOb2RlTWF0ZXJpYWwgZnJvbSAnLi9Ob2RlTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyBzaGluaW5lc3MsIHNwZWN1bGFyQ29sb3IgfSBmcm9tICcuLi8uLi9ub2Rlcy9jb3JlL1Byb3BlcnR5Tm9kZS5qcyc7XHJcbmltcG9ydCB7IG1hdGVyaWFsU2hpbmluZXNzLCBtYXRlcmlhbFNwZWN1bGFyIH0gZnJvbSAnLi4vLi4vbm9kZXMvYWNjZXNzb3JzL01hdGVyaWFsTm9kZS5qcyc7XHJcbmltcG9ydCB7IGZsb2F0IH0gZnJvbSAnLi4vLi4vbm9kZXMvdHNsL1RTTEJhc2UuanMnO1xyXG5pbXBvcnQgQmFzaWNFbnZpcm9ubWVudE5vZGUgZnJvbSAnLi4vLi4vbm9kZXMvbGlnaHRpbmcvQmFzaWNFbnZpcm9ubWVudE5vZGUuanMnO1xyXG5pbXBvcnQgUGhvbmdMaWdodGluZ01vZGVsIGZyb20gJy4uLy4uL25vZGVzL2Z1bmN0aW9ucy9QaG9uZ0xpZ2h0aW5nTW9kZWwuanMnO1xyXG5cclxuaW1wb3J0IHsgTWVzaFBob25nTWF0ZXJpYWwgfSBmcm9tICcuLi9NZXNoUGhvbmdNYXRlcmlhbC5qcyc7XHJcblxyXG5jb25zdCBfZGVmYXVsdFZhbHVlcyA9IC8qQF9fUFVSRV9fKi8gbmV3IE1lc2hQaG9uZ01hdGVyaWFsKCk7XHJcblxyXG4vKipcclxuICogTm9kZSBtYXRlcmlhbCB2ZXJzaW9uIG9mIHtAbGluayBNZXNoUGhvbmdNYXRlcmlhbH0uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBOb2RlTWF0ZXJpYWxcclxuICovXHJcbmNsYXNzIE1lc2hQaG9uZ05vZGVNYXRlcmlhbCBleHRlbmRzIE5vZGVNYXRlcmlhbCB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ01lc2hQaG9uZ05vZGVNYXRlcmlhbCc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBtZXNoIGxhbWJlcnQgbm9kZSBtYXRlcmlhbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1ldGVyc10gLSBUaGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHBhcmFtZXRlcnMgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNNZXNoUGhvbmdOb2RlTWF0ZXJpYWwgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU2V0IHRvIGB0cnVlYCBiZWNhdXNlIHBob25nIG1hdGVyaWFscyByZWFjdCBvbiBsaWdodHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGlnaHRzID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBzaGluaW5lc3Mgb2YgcGhvbmcgbWF0ZXJpYWxzIGlzIGJ5IGRlZmF1bHQgaW5mZXJyZWQgZnJvbSB0aGUgYHNoaW5pbmVzc2BcclxuXHRcdCAqIHByb3BlcnR5LiBUaGlzIG5vZGUgcHJvcGVydHkgYWxsb3dzIHRvIG92ZXJ3cml0ZSB0aGUgZGVmYXVsdFxyXG5cdFx0ICogYW5kIGRlZmluZSB0aGUgc2hpbmluZXNzIHdpdGggYSBub2RlIGluc3RlYWQuXHJcblx0XHQgKlxyXG5cdFx0ICogSWYgeW91IGRvbid0IHdhbnQgdG8gb3ZlcndyaXRlIHRoZSBzaGluaW5lc3MgYnV0IG1vZGlmeSB0aGUgZXhpc3RpbmdcclxuXHRcdCAqIHZhbHVlIGluc3RlYWQsIHVzZSB7QGxpbmsgbWF0ZXJpYWxTaGluaW5lc3N9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Tm9kZTxmbG9hdD59XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2hpbmluZXNzTm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc3BlY3VsYXIgY29sb3Igb2YgcGhvbmcgbWF0ZXJpYWxzIGlzIGJ5IGRlZmF1bHQgaW5mZXJyZWQgZnJvbSB0aGVcclxuXHRcdCAqIGBzcGVjdWxhcmAgcHJvcGVydHkuIFRoaXMgbm9kZSBwcm9wZXJ0eSBhbGxvd3MgdG8gb3ZlcndyaXRlIHRoZSBkZWZhdWx0XHJcblx0XHQgKiBhbmQgZGVmaW5lIHRoZSBzcGVjdWxhciBjb2xvciB3aXRoIGEgbm9kZSBpbnN0ZWFkLlxyXG5cdFx0ICpcclxuXHRcdCAqIElmIHlvdSBkb24ndCB3YW50IHRvIG92ZXJ3cml0ZSB0aGUgc3BlY3VsYXIgY29sb3IgYnV0IG1vZGlmeSB0aGUgZXhpc3RpbmdcclxuXHRcdCAqIHZhbHVlIGluc3RlYWQsIHVzZSB7QGxpbmsgbWF0ZXJpYWxTcGVjdWxhcn0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPHZlYzM+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNwZWN1bGFyTm9kZSA9IG51bGw7XHJcblxyXG5cdFx0dGhpcy5zZXREZWZhdWx0VmFsdWVzKCBfZGVmYXVsdFZhbHVlcyApO1xyXG5cclxuXHRcdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogT3ZlcndyaXR0ZW4gc2luY2UgdGhpcyB0eXBlIG9mIG1hdGVyaWFsIHVzZXMge0BsaW5rIEJhc2ljRW52aXJvbm1lbnROb2RlfVxyXG5cdCAqIHRvIGltcGxlbWVudCB0aGUgZGVmYXVsdCBlbnZpcm9ubWVudCBtYXBwaW5nLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHs/QmFzaWNFbnZpcm9ubWVudE5vZGU8dmVjMz59IFRoZSBlbnZpcm9ubWVudCBub2RlLlxyXG5cdCAqL1xyXG5cdHNldHVwRW52aXJvbm1lbnQoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgZW52Tm9kZSA9IHN1cGVyLnNldHVwRW52aXJvbm1lbnQoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRyZXR1cm4gZW52Tm9kZSA/IG5ldyBCYXNpY0Vudmlyb25tZW50Tm9kZSggZW52Tm9kZSApIDogbnVsbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXR1cHMgdGhlIGxpZ2h0aW5nIG1vZGVsLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7UGhvbmdMaWdodGluZ01vZGVsfSBUaGUgbGlnaHRpbmcgbW9kZWwuXHJcblx0ICovXHJcblx0c2V0dXBMaWdodGluZ01vZGVsKCAvKmJ1aWxkZXIqLyApIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IFBob25nTGlnaHRpbmdNb2RlbCgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHVwcyB0aGUgcGhvbmcgc3BlY2lmaWMgbm9kZSB2YXJpYWJsZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqL1xyXG5cdHNldHVwVmFyaWFudHMoIC8qYnVpbGRlciovICkge1xyXG5cclxuXHRcdC8vIFNISU5JTkVTU1xyXG5cclxuXHRcdGNvbnN0IHNoaW5pbmVzc05vZGUgPSAoIHRoaXMuc2hpbmluZXNzTm9kZSA/IGZsb2F0KCB0aGlzLnNoaW5pbmVzc05vZGUgKSA6IG1hdGVyaWFsU2hpbmluZXNzICkubWF4KCAxZS00ICk7IC8vIHRvIHByZXZlbnQgcG93KCAwLjAsIDAuMCApXHJcblxyXG5cdFx0c2hpbmluZXNzLmFzc2lnbiggc2hpbmluZXNzTm9kZSApO1xyXG5cclxuXHRcdC8vIFNQRUNVTEFSIENPTE9SXHJcblxyXG5cdFx0Y29uc3Qgc3BlY3VsYXJOb2RlID0gdGhpcy5zcGVjdWxhck5vZGUgfHwgbWF0ZXJpYWxTcGVjdWxhcjtcclxuXHJcblx0XHRzcGVjdWxhckNvbG9yLmFzc2lnbiggc3BlY3VsYXJOb2RlICk7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHRoaXMuc2hpbmluZXNzTm9kZSA9IHNvdXJjZS5zaGluaW5lc3NOb2RlO1xyXG5cdFx0dGhpcy5zcGVjdWxhck5vZGUgPSBzb3VyY2Uuc3BlY3VsYXJOb2RlO1xyXG5cclxuXHRcdHJldHVybiBzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTWVzaFBob25nTm9kZU1hdGVyaWFsO1xyXG4iLCJpbXBvcnQgeyBub3JtYWxWaWV3IH0gZnJvbSAnLi4vLi4vYWNjZXNzb3JzL05vcm1hbC5qcyc7XHJcbmltcG9ydCB7IGZsb2F0LCBGbiB9IGZyb20gJy4uLy4uL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbmNvbnN0IGdldEdlb21ldHJ5Um91Z2huZXNzID0gLypAX19QVVJFX18qLyBGbiggKCBidWlsZGVyICkgPT4ge1xyXG5cclxuXHRpZiAoIGJ1aWxkZXIuZ2VvbWV0cnkuaGFzQXR0cmlidXRlKCAnbm9ybWFsJyApID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRyZXR1cm4gZmxvYXQoIDAgKTtcclxuXHJcblx0fVxyXG5cclxuXHRjb25zdCBkeHkgPSBub3JtYWxWaWV3LmRGZHgoKS5hYnMoKS5tYXgoIG5vcm1hbFZpZXcuZEZkeSgpLmFicygpICk7XHJcblx0Y29uc3QgZ2VvbWV0cnlSb3VnaG5lc3MgPSBkeHkueC5tYXgoIGR4eS55ICkubWF4KCBkeHkueiApO1xyXG5cclxuXHRyZXR1cm4gZ2VvbWV0cnlSb3VnaG5lc3M7XHJcblxyXG59ICk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBnZXRHZW9tZXRyeVJvdWdobmVzcztcclxuIiwiaW1wb3J0IGdldEdlb21ldHJ5Um91Z2huZXNzIGZyb20gJy4vZ2V0R2VvbWV0cnlSb3VnaG5lc3MuanMnO1xyXG5pbXBvcnQgeyBGbiB9IGZyb20gJy4uLy4uL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbmNvbnN0IGdldFJvdWdobmVzcyA9IC8qQF9fUFVSRV9fKi8gRm4oICggaW5wdXRzICkgPT4ge1xyXG5cclxuXHRjb25zdCB7IHJvdWdobmVzcyB9ID0gaW5wdXRzO1xyXG5cclxuXHRjb25zdCBnZW9tZXRyeVJvdWdobmVzcyA9IGdldEdlb21ldHJ5Um91Z2huZXNzKCk7XHJcblxyXG5cdGxldCByb3VnaG5lc3NGYWN0b3IgPSByb3VnaG5lc3MubWF4KCAwLjA1MjUgKTsgLy8gMC4wNTI1IGNvcnJlc3BvbmRzIHRvIHRoZSBiYXNlIG1pcCBvZiBhIDI1NiBjdWJlbWFwLlxyXG5cdHJvdWdobmVzc0ZhY3RvciA9IHJvdWdobmVzc0ZhY3Rvci5hZGQoIGdlb21ldHJ5Um91Z2huZXNzICk7XHJcblx0cm91Z2huZXNzRmFjdG9yID0gcm91Z2huZXNzRmFjdG9yLm1pbiggMS4wICk7XHJcblxyXG5cdHJldHVybiByb3VnaG5lc3NGYWN0b3I7XHJcblxyXG59ICk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBnZXRSb3VnaG5lc3M7XHJcbiIsImltcG9ydCB7IGRpdiB9IGZyb20gJy4uLy4uL21hdGgvT3BlcmF0b3JOb2RlLmpzJztcclxuaW1wb3J0IHsgRVBTSUxPTiB9IGZyb20gJy4uLy4uL21hdGgvTWF0aE5vZGUuanMnO1xyXG5pbXBvcnQgeyBGbiB9IGZyb20gJy4uLy4uL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbi8vIE1vdmluZyBGcm9zdGJpdGUgdG8gUGh5c2ljYWxseSBCYXNlZCBSZW5kZXJpbmcgMy4wIC0gcGFnZSAxMiwgbGlzdGluZyAyXHJcbi8vIGh0dHBzOi8vc2VibGFnYXJkZS5maWxlcy53b3JkcHJlc3MuY29tLzIwMTUvMDcvY291cnNlX25vdGVzX21vdmluZ19mcm9zdGJpdGVfdG9fcGJyX3YzMi5wZGZcclxuY29uc3QgVl9HR1hfU21pdGhDb3JyZWxhdGVkID0gLypAX19QVVJFX18qLyBGbiggKCB7IGFscGhhLCBkb3ROTCwgZG90TlYgfSApID0+IHtcclxuXHJcblx0Y29uc3QgYTIgPSBhbHBoYS5wb3cyKCk7XHJcblxyXG5cdGNvbnN0IGd2ID0gZG90TkwubXVsKCBhMi5hZGQoIGEyLm9uZU1pbnVzKCkubXVsKCBkb3ROVi5wb3cyKCkgKSApLnNxcnQoKSApO1xyXG5cdGNvbnN0IGdsID0gZG90TlYubXVsKCBhMi5hZGQoIGEyLm9uZU1pbnVzKCkubXVsKCBkb3ROTC5wb3cyKCkgKSApLnNxcnQoKSApO1xyXG5cclxuXHRyZXR1cm4gZGl2KCAwLjUsIGd2LmFkZCggZ2wgKS5tYXgoIEVQU0lMT04gKSApO1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdWX0dHWF9TbWl0aENvcnJlbGF0ZWQnLFxyXG5cdHR5cGU6ICdmbG9hdCcsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICdhbHBoYScsIHR5cGU6ICdmbG9hdCcgfSxcclxuXHRcdHsgbmFtZTogJ2RvdE5MJywgdHlwZTogJ2Zsb2F0JyB9LFxyXG5cdFx0eyBuYW1lOiAnZG90TlYnLCB0eXBlOiAnZmxvYXQnIH1cclxuXHRdXHJcbn0gKTsgLy8gdmFsaWRhdGVkXHJcblxyXG5leHBvcnQgZGVmYXVsdCBWX0dHWF9TbWl0aENvcnJlbGF0ZWQ7XHJcbiIsImltcG9ydCB7IGRpdiB9IGZyb20gJy4uLy4uL21hdGgvT3BlcmF0b3JOb2RlLmpzJztcclxuaW1wb3J0IHsgRm4sIHZlYzMgfSBmcm9tICcuLi8uLi90c2wvVFNMQmFzZS5qcyc7XHJcblxyXG4vLyBodHRwczovL2dvb2dsZS5naXRodWIuaW8vZmlsYW1lbnQvRmlsYW1lbnQubWQuaHRtbCNtYXRlcmlhbHN5c3RlbS9hbmlzb3Ryb3BpY21vZGVsL2FuaXNvdHJvcGljc3BlY3VsYXJicmRmXHJcblxyXG5jb25zdCBWX0dHWF9TbWl0aENvcnJlbGF0ZWRfQW5pc290cm9waWMgPSAvKkBfX1BVUkVfXyovIEZuKCAoIHsgYWxwaGFULCBhbHBoYUIsIGRvdFRWLCBkb3RCViwgZG90VEwsIGRvdEJMLCBkb3ROViwgZG90TkwgfSApID0+IHtcclxuXHJcblx0Y29uc3QgZ3YgPSBkb3ROTC5tdWwoIHZlYzMoIGFscGhhVC5tdWwoIGRvdFRWICksIGFscGhhQi5tdWwoIGRvdEJWICksIGRvdE5WICkubGVuZ3RoKCkgKTtcclxuXHRjb25zdCBnbCA9IGRvdE5WLm11bCggdmVjMyggYWxwaGFULm11bCggZG90VEwgKSwgYWxwaGFCLm11bCggZG90QkwgKSwgZG90TkwgKS5sZW5ndGgoKSApO1xyXG5cdGNvbnN0IHYgPSBkaXYoIDAuNSwgZ3YuYWRkKCBnbCApICk7XHJcblxyXG5cdHJldHVybiB2LnNhdHVyYXRlKCk7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ1ZfR0dYX1NtaXRoQ29ycmVsYXRlZF9Bbmlzb3Ryb3BpYycsXHJcblx0dHlwZTogJ2Zsb2F0JyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ2FscGhhVCcsIHR5cGU6ICdmbG9hdCcsIHF1YWxpZmllcjogJ2luJyB9LFxyXG5cdFx0eyBuYW1lOiAnYWxwaGFCJywgdHlwZTogJ2Zsb2F0JywgcXVhbGlmaWVyOiAnaW4nIH0sXHJcblx0XHR7IG5hbWU6ICdkb3RUVicsIHR5cGU6ICdmbG9hdCcsIHF1YWxpZmllcjogJ2luJyB9LFxyXG5cdFx0eyBuYW1lOiAnZG90QlYnLCB0eXBlOiAnZmxvYXQnLCBxdWFsaWZpZXI6ICdpbicgfSxcclxuXHRcdHsgbmFtZTogJ2RvdFRMJywgdHlwZTogJ2Zsb2F0JywgcXVhbGlmaWVyOiAnaW4nIH0sXHJcblx0XHR7IG5hbWU6ICdkb3RCTCcsIHR5cGU6ICdmbG9hdCcsIHF1YWxpZmllcjogJ2luJyB9LFxyXG5cdFx0eyBuYW1lOiAnZG90TlYnLCB0eXBlOiAnZmxvYXQnLCBxdWFsaWZpZXI6ICdpbicgfSxcclxuXHRcdHsgbmFtZTogJ2RvdE5MJywgdHlwZTogJ2Zsb2F0JywgcXVhbGlmaWVyOiAnaW4nIH1cclxuXHRdXHJcbn0gKTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IFZfR0dYX1NtaXRoQ29ycmVsYXRlZF9Bbmlzb3Ryb3BpYztcclxuIiwiaW1wb3J0IHsgRm4gfSBmcm9tICcuLi8uLi90c2wvVFNMQmFzZS5qcyc7XHJcblxyXG4vLyBNaWNyb2ZhY2V0IE1vZGVscyBmb3IgUmVmcmFjdGlvbiB0aHJvdWdoIFJvdWdoIFN1cmZhY2VzIC0gZXF1YXRpb24gKDMzKVxyXG4vLyBodHRwOi8vZ3JhcGhpY3JhbnRzLmJsb2dzcG90LmNvbS8yMDEzLzA4L3NwZWN1bGFyLWJyZGYtcmVmZXJlbmNlLmh0bWxcclxuLy8gYWxwaGEgaXMgXCJyb3VnaG5lc3Mgc3F1YXJlZFwiIGluIERpc25leeKAmXMgcmVwYXJhbWV0ZXJpemF0aW9uXHJcbmNvbnN0IERfR0dYID0gLypAX19QVVJFX18qLyBGbiggKCB7IGFscGhhLCBkb3ROSCB9ICkgPT4ge1xyXG5cclxuXHRjb25zdCBhMiA9IGFscGhhLnBvdzIoKTtcclxuXHJcblx0Y29uc3QgZGVub20gPSBkb3ROSC5wb3cyKCkubXVsKCBhMi5vbmVNaW51cygpICkub25lTWludXMoKTsgLy8gYXZvaWQgYWxwaGEgPSAwIHdpdGggZG90TkggPSAxXHJcblxyXG5cdHJldHVybiBhMi5kaXYoIGRlbm9tLnBvdzIoKSApLm11bCggMSAvIE1hdGguUEkgKTtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnRF9HR1gnLFxyXG5cdHR5cGU6ICdmbG9hdCcsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICdhbHBoYScsIHR5cGU6ICdmbG9hdCcgfSxcclxuXHRcdHsgbmFtZTogJ2RvdE5IJywgdHlwZTogJ2Zsb2F0JyB9XHJcblx0XVxyXG59ICk7IC8vIHZhbGlkYXRlZFxyXG5cclxuZXhwb3J0IGRlZmF1bHQgRF9HR1g7XHJcbiIsImltcG9ydCB7IEZuLCBmbG9hdCwgdmVjMyB9IGZyb20gJy4uLy4uL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbmNvbnN0IFJFQ0lQUk9DQUxfUEkgPSAvKkBfX1BVUkVfXyovIGZsb2F0KCAxIC8gTWF0aC5QSSApO1xyXG5cclxuLy8gaHR0cHM6Ly9nb29nbGUuZ2l0aHViLmlvL2ZpbGFtZW50L0ZpbGFtZW50Lm1kLmh0bWwjbWF0ZXJpYWxzeXN0ZW0vYW5pc290cm9waWNtb2RlbC9hbmlzb3Ryb3BpY3NwZWN1bGFyYnJkZlxyXG5cclxuY29uc3QgRF9HR1hfQW5pc290cm9waWMgPSAvKkBfX1BVUkVfXyovIEZuKCAoIHsgYWxwaGFULCBhbHBoYUIsIGRvdE5ILCBkb3RUSCwgZG90QkggfSApID0+IHtcclxuXHJcblx0Y29uc3QgYTIgPSBhbHBoYVQubXVsKCBhbHBoYUIgKTtcclxuXHRjb25zdCB2ID0gdmVjMyggYWxwaGFCLm11bCggZG90VEggKSwgYWxwaGFULm11bCggZG90QkggKSwgYTIubXVsKCBkb3ROSCApICk7XHJcblx0Y29uc3QgdjIgPSB2LmRvdCggdiApO1xyXG5cdGNvbnN0IHcyID0gYTIuZGl2KCB2MiApO1xyXG5cclxuXHRyZXR1cm4gUkVDSVBST0NBTF9QSS5tdWwoIGEyLm11bCggdzIucG93MigpICkgKTtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnRF9HR1hfQW5pc290cm9waWMnLFxyXG5cdHR5cGU6ICdmbG9hdCcsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICdhbHBoYVQnLCB0eXBlOiAnZmxvYXQnLCBxdWFsaWZpZXI6ICdpbicgfSxcclxuXHRcdHsgbmFtZTogJ2FscGhhQicsIHR5cGU6ICdmbG9hdCcsIHF1YWxpZmllcjogJ2luJyB9LFxyXG5cdFx0eyBuYW1lOiAnZG90TkgnLCB0eXBlOiAnZmxvYXQnLCBxdWFsaWZpZXI6ICdpbicgfSxcclxuXHRcdHsgbmFtZTogJ2RvdFRIJywgdHlwZTogJ2Zsb2F0JywgcXVhbGlmaWVyOiAnaW4nIH0sXHJcblx0XHR7IG5hbWU6ICdkb3RCSCcsIHR5cGU6ICdmbG9hdCcsIHF1YWxpZmllcjogJ2luJyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBEX0dHWF9Bbmlzb3Ryb3BpYztcclxuIiwiaW1wb3J0IEZfU2NobGljayBmcm9tICcuL0ZfU2NobGljay5qcyc7XHJcbmltcG9ydCBWX0dHWF9TbWl0aENvcnJlbGF0ZWQgZnJvbSAnLi9WX0dHWF9TbWl0aENvcnJlbGF0ZWQuanMnO1xyXG5pbXBvcnQgVl9HR1hfU21pdGhDb3JyZWxhdGVkX0FuaXNvdHJvcGljIGZyb20gJy4vVl9HR1hfU21pdGhDb3JyZWxhdGVkX0FuaXNvdHJvcGljLmpzJztcclxuaW1wb3J0IERfR0dYIGZyb20gJy4vRF9HR1guanMnO1xyXG5pbXBvcnQgRF9HR1hfQW5pc290cm9waWMgZnJvbSAnLi9EX0dHWF9Bbmlzb3Ryb3BpYy5qcyc7XHJcbmltcG9ydCB7IHRyYW5zZm9ybWVkTm9ybWFsVmlldyB9IGZyb20gJy4uLy4uL2FjY2Vzc29ycy9Ob3JtYWwuanMnO1xyXG5pbXBvcnQgeyBwb3NpdGlvblZpZXdEaXJlY3Rpb24gfSBmcm9tICcuLi8uLi9hY2Nlc3NvcnMvUG9zaXRpb24uanMnO1xyXG5pbXBvcnQgeyBpcmlkZXNjZW5jZSwgYWxwaGFULCBhbmlzb3Ryb3B5VCwgYW5pc290cm9weUIgfSBmcm9tICcuLi8uLi9jb3JlL1Byb3BlcnR5Tm9kZS5qcyc7XHJcbmltcG9ydCB7IEZuLCBkZWZpbmVkIH0gZnJvbSAnLi4vLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5cclxuLy8gR0dYIERpc3RyaWJ1dGlvbiwgU2NobGljayBGcmVzbmVsLCBHR1hfU21pdGhDb3JyZWxhdGVkIFZpc2liaWxpdHlcclxuY29uc3QgQlJERl9HR1ggPSAvKkBfX1BVUkVfXyovIEZuKCAoIGlucHV0cyApID0+IHtcclxuXHJcblx0Y29uc3QgeyBsaWdodERpcmVjdGlvbiwgZjAsIGY5MCwgcm91Z2huZXNzLCBmLCBVU0VfSVJJREVTQ0VOQ0UsIFVTRV9BTklTT1RST1BZIH0gPSBpbnB1dHM7XHJcblxyXG5cdGNvbnN0IG5vcm1hbFZpZXcgPSBpbnB1dHMubm9ybWFsVmlldyB8fCB0cmFuc2Zvcm1lZE5vcm1hbFZpZXc7XHJcblxyXG5cdGNvbnN0IGFscGhhID0gcm91Z2huZXNzLnBvdzIoKTsgLy8gVUU0J3Mgcm91Z2huZXNzXHJcblxyXG5cdGNvbnN0IGhhbGZEaXIgPSBsaWdodERpcmVjdGlvbi5hZGQoIHBvc2l0aW9uVmlld0RpcmVjdGlvbiApLm5vcm1hbGl6ZSgpO1xyXG5cclxuXHRjb25zdCBkb3ROTCA9IG5vcm1hbFZpZXcuZG90KCBsaWdodERpcmVjdGlvbiApLmNsYW1wKCk7XHJcblx0Y29uc3QgZG90TlYgPSBub3JtYWxWaWV3LmRvdCggcG9zaXRpb25WaWV3RGlyZWN0aW9uICkuY2xhbXAoKTsgLy8gQCBUT0RPOiBNb3ZlIHRvIGNvcmUgZG90TlZcclxuXHRjb25zdCBkb3ROSCA9IG5vcm1hbFZpZXcuZG90KCBoYWxmRGlyICkuY2xhbXAoKTtcclxuXHRjb25zdCBkb3RWSCA9IHBvc2l0aW9uVmlld0RpcmVjdGlvbi5kb3QoIGhhbGZEaXIgKS5jbGFtcCgpO1xyXG5cclxuXHRsZXQgRiA9IEZfU2NobGljayggeyBmMCwgZjkwLCBkb3RWSCB9ICk7XHJcblx0bGV0IFYsIEQ7XHJcblxyXG5cdGlmICggZGVmaW5lZCggVVNFX0lSSURFU0NFTkNFICkgKSB7XHJcblxyXG5cdFx0RiA9IGlyaWRlc2NlbmNlLm1peCggRiwgZiApO1xyXG5cclxuXHR9XHJcblxyXG5cdGlmICggZGVmaW5lZCggVVNFX0FOSVNPVFJPUFkgKSApIHtcclxuXHJcblx0XHRjb25zdCBkb3RUTCA9IGFuaXNvdHJvcHlULmRvdCggbGlnaHREaXJlY3Rpb24gKTtcclxuXHRcdGNvbnN0IGRvdFRWID0gYW5pc290cm9weVQuZG90KCBwb3NpdGlvblZpZXdEaXJlY3Rpb24gKTtcclxuXHRcdGNvbnN0IGRvdFRIID0gYW5pc290cm9weVQuZG90KCBoYWxmRGlyICk7XHJcblx0XHRjb25zdCBkb3RCTCA9IGFuaXNvdHJvcHlCLmRvdCggbGlnaHREaXJlY3Rpb24gKTtcclxuXHRcdGNvbnN0IGRvdEJWID0gYW5pc290cm9weUIuZG90KCBwb3NpdGlvblZpZXdEaXJlY3Rpb24gKTtcclxuXHRcdGNvbnN0IGRvdEJIID0gYW5pc290cm9weUIuZG90KCBoYWxmRGlyICk7XHJcblxyXG5cdFx0ViA9IFZfR0dYX1NtaXRoQ29ycmVsYXRlZF9Bbmlzb3Ryb3BpYyggeyBhbHBoYVQsIGFscGhhQjogYWxwaGEsIGRvdFRWLCBkb3RCViwgZG90VEwsIGRvdEJMLCBkb3ROViwgZG90TkwgfSApO1xyXG5cdFx0RCA9IERfR0dYX0FuaXNvdHJvcGljKCB7IGFscGhhVCwgYWxwaGFCOiBhbHBoYSwgZG90TkgsIGRvdFRILCBkb3RCSCB9ICk7XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0ViA9IFZfR0dYX1NtaXRoQ29ycmVsYXRlZCggeyBhbHBoYSwgZG90TkwsIGRvdE5WIH0gKTtcclxuXHRcdEQgPSBEX0dHWCggeyBhbHBoYSwgZG90TkggfSApO1xyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiBGLm11bCggViApLm11bCggRCApO1xyXG5cclxufSApOyAvLyB2YWxpZGF0ZWRcclxuXHJcbmV4cG9ydCBkZWZhdWx0IEJSREZfR0dYO1xyXG4iLCJpbXBvcnQgeyBGbiwgdmVjMiwgdmVjNCB9IGZyb20gJy4uLy4uL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbi8vIEFuYWx5dGljYWwgYXBwcm94aW1hdGlvbiBvZiB0aGUgREZHIExVVCwgb25lIGhhbGYgb2YgdGhlXHJcbi8vIHNwbGl0LXN1bSBhcHByb3hpbWF0aW9uIHVzZWQgaW4gaW5kaXJlY3Qgc3BlY3VsYXIgbGlnaHRpbmcuXHJcbi8vIHZpYSAnZW52aXJvbm1lbnRCUkRGJyBmcm9tIFwiUGh5c2ljYWxseSBCYXNlZCBTaGFkaW5nIG9uIE1vYmlsZVwiXHJcbi8vIGh0dHBzOi8vd3d3LnVucmVhbGVuZ2luZS5jb20vYmxvZy9waHlzaWNhbGx5LWJhc2VkLXNoYWRpbmctb24tbW9iaWxlXHJcbmNvbnN0IERGR0FwcHJveCA9IC8qQF9fUFVSRV9fKi8gRm4oICggeyByb3VnaG5lc3MsIGRvdE5WIH0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IGMwID0gdmVjNCggLSAxLCAtIDAuMDI3NSwgLSAwLjU3MiwgMC4wMjIgKTtcclxuXHJcblx0Y29uc3QgYzEgPSB2ZWM0KCAxLCAwLjA0MjUsIDEuMDQsIC0gMC4wNCApO1xyXG5cclxuXHRjb25zdCByID0gcm91Z2huZXNzLm11bCggYzAgKS5hZGQoIGMxICk7XHJcblxyXG5cdGNvbnN0IGEwMDQgPSByLngubXVsKCByLnggKS5taW4oIGRvdE5WLm11bCggLSA5LjI4ICkuZXhwMigpICkubXVsKCByLnggKS5hZGQoIHIueSApO1xyXG5cclxuXHRjb25zdCBmYWIgPSB2ZWMyKCAtIDEuMDQsIDEuMDQgKS5tdWwoIGEwMDQgKS5hZGQoIHIuencgKTtcclxuXHJcblx0cmV0dXJuIGZhYjtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnREZHQXBwcm94JyxcclxuXHR0eXBlOiAndmVjMicsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICdyb3VnaG5lc3MnLCB0eXBlOiAnZmxvYXQnIH0sXHJcblx0XHR7IG5hbWU6ICdkb3ROVicsIHR5cGU6ICd2ZWMzJyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBERkdBcHByb3g7XHJcbiIsImltcG9ydCBERkdBcHByb3ggZnJvbSAnLi9ERkdBcHByb3guanMnO1xyXG5pbXBvcnQgeyBGbiB9IGZyb20gJy4uLy4uL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbmNvbnN0IEVudmlyb25tZW50QlJERiA9IC8qQF9fUFVSRV9fKi8gRm4oICggaW5wdXRzICkgPT4ge1xyXG5cclxuXHRjb25zdCB7IGRvdE5WLCBzcGVjdWxhckNvbG9yLCBzcGVjdWxhckY5MCwgcm91Z2huZXNzIH0gPSBpbnB1dHM7XHJcblxyXG5cdGNvbnN0IGZhYiA9IERGR0FwcHJveCggeyBkb3ROViwgcm91Z2huZXNzIH0gKTtcclxuXHRyZXR1cm4gc3BlY3VsYXJDb2xvci5tdWwoIGZhYi54ICkuYWRkKCBzcGVjdWxhckY5MC5tdWwoIGZhYi55ICkgKTtcclxuXHJcbn0gKTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IEVudmlyb25tZW50QlJERjtcclxuIiwiaW1wb3J0IHsgRm4sIHZlYzMgfSBmcm9tICcuLi8uLi90c2wvVFNMQmFzZS5qcyc7XHJcblxyXG5jb25zdCBTY2hsaWNrX3RvX0YwID0gLypAX19QVVJFX18qLyBGbiggKCB7IGYsIGY5MCwgZG90VkggfSApID0+IHtcclxuXHJcblx0Y29uc3QgeCA9IGRvdFZILm9uZU1pbnVzKCkuc2F0dXJhdGUoKTtcclxuXHRjb25zdCB4MiA9IHgubXVsKCB4ICk7XHJcblx0Y29uc3QgeDUgPSB4Lm11bCggeDIsIHgyICkuY2xhbXAoIDAsIC45OTk5ICk7XHJcblxyXG5cdHJldHVybiBmLnN1YiggdmVjMyggZjkwICkubXVsKCB4NSApICkuZGl2KCB4NS5vbmVNaW51cygpICk7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ1NjaGxpY2tfdG9fRjAnLFxyXG5cdHR5cGU6ICd2ZWMzJyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ2YnLCB0eXBlOiAndmVjMycgfSxcclxuXHRcdHsgbmFtZTogJ2Y5MCcsIHR5cGU6ICdmbG9hdCcgfSxcclxuXHRcdHsgbmFtZTogJ2RvdFZIJywgdHlwZTogJ2Zsb2F0JyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTY2hsaWNrX3RvX0YwO1xyXG4iLCJpbXBvcnQgeyB0cmFuc2Zvcm1lZE5vcm1hbFZpZXcgfSBmcm9tICcuLi8uLi9hY2Nlc3NvcnMvTm9ybWFsLmpzJztcclxuaW1wb3J0IHsgcG9zaXRpb25WaWV3RGlyZWN0aW9uIH0gZnJvbSAnLi4vLi4vYWNjZXNzb3JzL1Bvc2l0aW9uLmpzJztcclxuaW1wb3J0IHsgc2hlZW4sIHNoZWVuUm91Z2huZXNzIH0gZnJvbSAnLi4vLi4vY29yZS9Qcm9wZXJ0eU5vZGUuanMnO1xyXG5pbXBvcnQgeyBGbiwgZmxvYXQgfSBmcm9tICcuLi8uLi90c2wvVFNMQmFzZS5qcyc7XHJcblxyXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2ZpbGFtZW50L2Jsb2IvbWFzdGVyL3NoYWRlcnMvc3JjL2JyZGYuZnNcclxuY29uc3QgRF9DaGFybGllID0gLypAX19QVVJFX18qLyBGbiggKCB7IHJvdWdobmVzcywgZG90TkggfSApID0+IHtcclxuXHJcblx0Y29uc3QgYWxwaGEgPSByb3VnaG5lc3MucG93MigpO1xyXG5cclxuXHQvLyBFc3RldmV6IGFuZCBLdWxsYSAyMDE3LCBcIlByb2R1Y3Rpb24gRnJpZW5kbHkgTWljcm9mYWNldCBTaGVlbiBCUkRGXCJcclxuXHRjb25zdCBpbnZBbHBoYSA9IGZsb2F0KCAxLjAgKS5kaXYoIGFscGhhICk7XHJcblx0Y29uc3QgY29zMmggPSBkb3ROSC5wb3cyKCk7XHJcblx0Y29uc3Qgc2luMmggPSBjb3MyaC5vbmVNaW51cygpLm1heCggMC4wMDc4MTI1ICk7IC8vIDJeKC0xNC8yKSwgc28gc2luMmheMiA+IDAgaW4gZnAxNlxyXG5cclxuXHRyZXR1cm4gZmxvYXQoIDIuMCApLmFkZCggaW52QWxwaGEgKS5tdWwoIHNpbjJoLnBvdyggaW52QWxwaGEubXVsKCAwLjUgKSApICkuZGl2KCAyLjAgKiBNYXRoLlBJICk7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ0RfQ2hhcmxpZScsXHJcblx0dHlwZTogJ2Zsb2F0JyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ3JvdWdobmVzcycsIHR5cGU6ICdmbG9hdCcgfSxcclxuXHRcdHsgbmFtZTogJ2RvdE5IJywgdHlwZTogJ2Zsb2F0JyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2ZpbGFtZW50L2Jsb2IvbWFzdGVyL3NoYWRlcnMvc3JjL2JyZGYuZnNcclxuY29uc3QgVl9OZXViZWx0ID0gLypAX19QVVJFX18qLyBGbiggKCB7IGRvdE5WLCBkb3ROTCB9ICkgPT4ge1xyXG5cclxuXHQvLyBOZXViZWx0IGFuZCBQZXR0aW5lbyAyMDEzLCBcIkNyYWZ0aW5nIGEgTmV4dC1nZW4gTWF0ZXJpYWwgUGlwZWxpbmUgZm9yIFRoZSBPcmRlcjogMTg4NlwiXHJcblx0cmV0dXJuIGZsb2F0KCAxLjAgKS5kaXYoIGZsb2F0KCA0LjAgKS5tdWwoIGRvdE5MLmFkZCggZG90TlYgKS5zdWIoIGRvdE5MLm11bCggZG90TlYgKSApICkgKTtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnVl9OZXViZWx0JyxcclxuXHR0eXBlOiAnZmxvYXQnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAnZG90TlYnLCB0eXBlOiAnZmxvYXQnIH0sXHJcblx0XHR7IG5hbWU6ICdkb3ROTCcsIHR5cGU6ICdmbG9hdCcgfVxyXG5cdF1cclxufSApO1xyXG5cclxuY29uc3QgQlJERl9TaGVlbiA9IC8qQF9fUFVSRV9fKi8gRm4oICggeyBsaWdodERpcmVjdGlvbiB9ICkgPT4ge1xyXG5cclxuXHRjb25zdCBoYWxmRGlyID0gbGlnaHREaXJlY3Rpb24uYWRkKCBwb3NpdGlvblZpZXdEaXJlY3Rpb24gKS5ub3JtYWxpemUoKTtcclxuXHJcblx0Y29uc3QgZG90TkwgPSB0cmFuc2Zvcm1lZE5vcm1hbFZpZXcuZG90KCBsaWdodERpcmVjdGlvbiApLmNsYW1wKCk7XHJcblx0Y29uc3QgZG90TlYgPSB0cmFuc2Zvcm1lZE5vcm1hbFZpZXcuZG90KCBwb3NpdGlvblZpZXdEaXJlY3Rpb24gKS5jbGFtcCgpO1xyXG5cdGNvbnN0IGRvdE5IID0gdHJhbnNmb3JtZWROb3JtYWxWaWV3LmRvdCggaGFsZkRpciApLmNsYW1wKCk7XHJcblxyXG5cdGNvbnN0IEQgPSBEX0NoYXJsaWUoIHsgcm91Z2huZXNzOiBzaGVlblJvdWdobmVzcywgZG90TkggfSApO1xyXG5cdGNvbnN0IFYgPSBWX05ldWJlbHQoIHsgZG90TlYsIGRvdE5MIH0gKTtcclxuXHJcblx0cmV0dXJuIHNoZWVuLm11bCggRCApLm11bCggViApO1xyXG5cclxufSApO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgQlJERl9TaGVlbjtcclxuIiwiaW1wb3J0IHsgRm4sIElmLCBtYXQzLCB2ZWMyLCB2ZWMzIH0gZnJvbSAnLi4vLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5pbXBvcnQgeyBtYXggfSBmcm9tICcuLi8uLi9tYXRoL01hdGhOb2RlLmpzJztcclxuXHJcbi8vIFJlY3QgQXJlYSBMaWdodFxyXG5cclxuLy8gUmVhbC1UaW1lIFBvbHlnb25hbC1MaWdodCBTaGFkaW5nIHdpdGggTGluZWFybHkgVHJhbnNmb3JtZWQgQ29zaW5lc1xyXG4vLyBieSBFcmljIEhlaXR6LCBKb25hdGhhbiBEdXB1eSwgU3RlcGhlbiBIaWxsIGFuZCBEYXZpZCBOZXViZWx0XHJcbi8vIGNvZGU6IGh0dHBzOi8vZ2l0aHViLmNvbS9zZWxmc2hhZG93L2x0Y19jb2RlL1xyXG5cclxuY29uc3QgTFRDX1V2ID0gLypAX19QVVJFX18qLyBGbiggKCB7IE4sIFYsIHJvdWdobmVzcyB9ICkgPT4ge1xyXG5cclxuXHRjb25zdCBMVVRfU0laRSA9IDY0LjA7XHJcblx0Y29uc3QgTFVUX1NDQUxFID0gKCBMVVRfU0laRSAtIDEuMCApIC8gTFVUX1NJWkU7XHJcblx0Y29uc3QgTFVUX0JJQVMgPSAwLjUgLyBMVVRfU0laRTtcclxuXHJcblx0Y29uc3QgZG90TlYgPSBOLmRvdCggViApLnNhdHVyYXRlKCk7XHJcblxyXG5cdC8vIHRleHR1cmUgcGFyYW1ldGVyaXplZCBieSBzcXJ0KCBHR1ggYWxwaGEgKSBhbmQgc3FydCggMSAtIGNvcyggdGhldGEgKSApXHJcblx0Y29uc3QgdXYgPSB2ZWMyKCByb3VnaG5lc3MsIGRvdE5WLm9uZU1pbnVzKCkuc3FydCgpICk7XHJcblxyXG5cdHV2LmFzc2lnbiggdXYubXVsKCBMVVRfU0NBTEUgKS5hZGQoIExVVF9CSUFTICkgKTtcclxuXHJcblx0cmV0dXJuIHV2O1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdMVENfVXYnLFxyXG5cdHR5cGU6ICd2ZWMyJyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ04nLCB0eXBlOiAndmVjMycgfSxcclxuXHRcdHsgbmFtZTogJ1YnLCB0eXBlOiAndmVjMycgfSxcclxuXHRcdHsgbmFtZTogJ3JvdWdobmVzcycsIHR5cGU6ICdmbG9hdCcgfVxyXG5cdF1cclxufSApO1xyXG5cclxuY29uc3QgTFRDX0NsaXBwZWRTcGhlcmVGb3JtRmFjdG9yID0gLypAX19QVVJFX18qLyBGbiggKCB7IGYgfSApID0+IHtcclxuXHJcblx0Ly8gUmVhbC1UaW1lIEFyZWEgTGlnaHRpbmc6IGEgSm91cm5leSBmcm9tIFJlc2VhcmNoIHRvIFByb2R1Y3Rpb24gKHAuMTAyKVxyXG5cdC8vIEFuIGFwcHJveGltYXRpb24gb2YgdGhlIGZvcm0gZmFjdG9yIG9mIGEgaG9yaXpvbi1jbGlwcGVkIHJlY3RhbmdsZS5cclxuXHJcblx0Y29uc3QgbCA9IGYubGVuZ3RoKCk7XHJcblxyXG5cdHJldHVybiBtYXgoIGwubXVsKCBsICkuYWRkKCBmLnogKS5kaXYoIGwuYWRkKCAxLjAgKSApLCAwICk7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ0xUQ19DbGlwcGVkU3BoZXJlRm9ybUZhY3RvcicsXHJcblx0dHlwZTogJ2Zsb2F0JyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ2YnLCB0eXBlOiAndmVjMycgfVxyXG5cdF1cclxufSApO1xyXG5cclxuY29uc3QgTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yID0gLypAX19QVVJFX18qLyBGbiggKCB7IHYxLCB2MiB9ICkgPT4ge1xyXG5cclxuXHRjb25zdCB4ID0gdjEuZG90KCB2MiApO1xyXG5cdGNvbnN0IHkgPSB4LmFicygpLnRvVmFyKCk7XHJcblxyXG5cdC8vIHJhdGlvbmFsIHBvbHlub21pYWwgYXBwcm94aW1hdGlvbiB0byB0aGV0YSAvIHNpbiggdGhldGEgKSAvIDJQSVxyXG5cdGNvbnN0IGEgPSB5Lm11bCggMC4wMTQ1MjA2ICkuYWRkKCAwLjQ5NjUxNTUgKS5tdWwoIHkgKS5hZGQoIDAuODU0Mzk4NSApLnRvVmFyKCk7XHJcblx0Y29uc3QgYiA9IHkuYWRkKCA0LjE2MTY3MjQgKS5tdWwoIHkgKS5hZGQoIDMuNDE3NTk0MCApLnRvVmFyKCk7XHJcblx0Y29uc3QgdiA9IGEuZGl2KCBiICk7XHJcblxyXG5cdGNvbnN0IHRoZXRhX3NpbnRoZXRhID0geC5ncmVhdGVyVGhhbiggMC4wICkuc2VsZWN0KCB2LCBtYXgoIHgubXVsKCB4ICkub25lTWludXMoKSwgMWUtNyApLmludmVyc2VTcXJ0KCkubXVsKCAwLjUgKS5zdWIoIHYgKSApO1xyXG5cclxuXHRyZXR1cm4gdjEuY3Jvc3MoIHYyICkubXVsKCB0aGV0YV9zaW50aGV0YSApO1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdMVENfRWRnZVZlY3RvckZvcm1GYWN0b3InLFxyXG5cdHR5cGU6ICd2ZWMzJyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ3YxJywgdHlwZTogJ3ZlYzMnIH0sXHJcblx0XHR7IG5hbWU6ICd2MicsIHR5cGU6ICd2ZWMzJyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5jb25zdCBMVENfRXZhbHVhdGUgPSAvKkBfX1BVUkVfXyovIEZuKCAoIHsgTiwgViwgUCwgbUludiwgcDAsIHAxLCBwMiwgcDMgfSApID0+IHtcclxuXHJcblx0Ly8gYmFpbCBpZiBwb2ludCBpcyBvbiBiYWNrIHNpZGUgb2YgcGxhbmUgb2YgbGlnaHRcclxuXHQvLyBhc3N1bWVzIGNjdyB3aW5kaW5nIG9yZGVyIG9mIGxpZ2h0IHZlcnRpY2VzXHJcblx0Y29uc3QgdjEgPSBwMS5zdWIoIHAwICkudG9WYXIoKTtcclxuXHRjb25zdCB2MiA9IHAzLnN1YiggcDAgKS50b1ZhcigpO1xyXG5cclxuXHRjb25zdCBsaWdodE5vcm1hbCA9IHYxLmNyb3NzKCB2MiApO1xyXG5cdGNvbnN0IHJlc3VsdCA9IHZlYzMoKS50b1ZhcigpO1xyXG5cclxuXHRJZiggbGlnaHROb3JtYWwuZG90KCBQLnN1YiggcDAgKSApLmdyZWF0ZXJUaGFuRXF1YWwoIDAuMCApLCAoKSA9PiB7XHJcblxyXG5cdFx0Ly8gY29uc3RydWN0IG9ydGhvbm9ybWFsIGJhc2lzIGFyb3VuZCBOXHJcblx0XHRjb25zdCBUMSA9IFYuc3ViKCBOLm11bCggVi5kb3QoIE4gKSApICkubm9ybWFsaXplKCk7XHJcblx0XHRjb25zdCBUMiA9IE4uY3Jvc3MoIFQxICkubmVnYXRlKCk7IC8vIG5lZ2F0ZWQgZnJvbSBwYXBlcjsgcG9zc2libHkgZHVlIHRvIGEgZGlmZmVyZW50IGhhbmRlZG5lc3Mgb2Ygd29ybGQgY29vcmRpbmF0ZSBzeXN0ZW1cclxuXHJcblx0XHQvLyBjb21wdXRlIHRyYW5zZm9ybVxyXG5cdFx0Y29uc3QgbWF0ID0gbUludi5tdWwoIG1hdDMoIFQxLCBUMiwgTiApLnRyYW5zcG9zZSgpICkudG9WYXIoKTtcclxuXHJcblx0XHQvLyB0cmFuc2Zvcm0gcmVjdFxyXG5cdFx0Ly8gJiBwcm9qZWN0IHJlY3Qgb250byBzcGhlcmVcclxuXHRcdGNvbnN0IGNvb3JkczAgPSBtYXQubXVsKCBwMC5zdWIoIFAgKSApLm5vcm1hbGl6ZSgpLnRvVmFyKCk7XHJcblx0XHRjb25zdCBjb29yZHMxID0gbWF0Lm11bCggcDEuc3ViKCBQICkgKS5ub3JtYWxpemUoKS50b1ZhcigpO1xyXG5cdFx0Y29uc3QgY29vcmRzMiA9IG1hdC5tdWwoIHAyLnN1YiggUCApICkubm9ybWFsaXplKCkudG9WYXIoKTtcclxuXHRcdGNvbnN0IGNvb3JkczMgPSBtYXQubXVsKCBwMy5zdWIoIFAgKSApLm5vcm1hbGl6ZSgpLnRvVmFyKCk7XHJcblxyXG5cdFx0Ly8gY2FsY3VsYXRlIHZlY3RvciBmb3JtIGZhY3RvclxyXG5cdFx0Y29uc3QgdmVjdG9yRm9ybUZhY3RvciA9IHZlYzMoIDAgKS50b1ZhcigpO1xyXG5cdFx0dmVjdG9yRm9ybUZhY3Rvci5hZGRBc3NpZ24oIExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggeyB2MTogY29vcmRzMCwgdjI6IGNvb3JkczEgfSApICk7XHJcblx0XHR2ZWN0b3JGb3JtRmFjdG9yLmFkZEFzc2lnbiggTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCB7IHYxOiBjb29yZHMxLCB2MjogY29vcmRzMiB9ICkgKTtcclxuXHRcdHZlY3RvckZvcm1GYWN0b3IuYWRkQXNzaWduKCBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIHsgdjE6IGNvb3JkczIsIHYyOiBjb29yZHMzIH0gKSApO1xyXG5cdFx0dmVjdG9yRm9ybUZhY3Rvci5hZGRBc3NpZ24oIExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggeyB2MTogY29vcmRzMywgdjI6IGNvb3JkczAgfSApICk7XHJcblxyXG5cdFx0Ly8gYWRqdXN0IGZvciBob3Jpem9uIGNsaXBwaW5nXHJcblx0XHRyZXN1bHQuYXNzaWduKCB2ZWMzKCBMVENfQ2xpcHBlZFNwaGVyZUZvcm1GYWN0b3IoIHsgZjogdmVjdG9yRm9ybUZhY3RvciB9ICkgKSApO1xyXG5cclxuXHR9ICk7XHJcblxyXG5cdHJldHVybiByZXN1bHQ7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ0xUQ19FdmFsdWF0ZScsXHJcblx0dHlwZTogJ3ZlYzMnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAnTicsIHR5cGU6ICd2ZWMzJyB9LFxyXG5cdFx0eyBuYW1lOiAnVicsIHR5cGU6ICd2ZWMzJyB9LFxyXG5cdFx0eyBuYW1lOiAnUCcsIHR5cGU6ICd2ZWMzJyB9LFxyXG5cdFx0eyBuYW1lOiAnbUludicsIHR5cGU6ICdtYXQzJyB9LFxyXG5cdFx0eyBuYW1lOiAncDAnLCB0eXBlOiAndmVjMycgfSxcclxuXHRcdHsgbmFtZTogJ3AxJywgdHlwZTogJ3ZlYzMnIH0sXHJcblx0XHR7IG5hbWU6ICdwMicsIHR5cGU6ICd2ZWMzJyB9LFxyXG5cdFx0eyBuYW1lOiAncDMnLCB0eXBlOiAndmVjMycgfVxyXG5cdF1cclxufSApO1xyXG5cclxuY29uc3QgTFRDX0V2YWx1YXRlX1ZvbHVtZSA9IC8qQF9fUFVSRV9fKi8gRm4oICggeyBQLCBwMCwgcDEsIHAyLCBwMyB9ICkgPT4ge1xyXG5cclxuXHQvLyBiYWlsIGlmIHBvaW50IGlzIG9uIGJhY2sgc2lkZSBvZiBwbGFuZSBvZiBsaWdodFxyXG5cdC8vIGFzc3VtZXMgY2N3IHdpbmRpbmcgb3JkZXIgb2YgbGlnaHQgdmVydGljZXNcclxuXHRjb25zdCB2MSA9IHAxLnN1YiggcDAgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHYyID0gcDMuc3ViKCBwMCApLnRvVmFyKCk7XHJcblxyXG5cdGNvbnN0IGxpZ2h0Tm9ybWFsID0gdjEuY3Jvc3MoIHYyICk7XHJcblx0Y29uc3QgcmVzdWx0ID0gdmVjMygpLnRvVmFyKCk7XHJcblxyXG5cdElmKCBsaWdodE5vcm1hbC5kb3QoIFAuc3ViKCBwMCApICkuZ3JlYXRlclRoYW5FcXVhbCggMC4wICksICgpID0+IHtcclxuXHJcblx0XHQvLyB0cmFuc2Zvcm0gcmVjdFxyXG5cdFx0Ly8gJiBwcm9qZWN0IHJlY3Qgb250byBzcGhlcmVcclxuXHRcdGNvbnN0IGNvb3JkczAgPSBwMC5zdWIoIFAgKS5ub3JtYWxpemUoKS50b1ZhcigpO1xyXG5cdFx0Y29uc3QgY29vcmRzMSA9IHAxLnN1YiggUCApLm5vcm1hbGl6ZSgpLnRvVmFyKCk7XHJcblx0XHRjb25zdCBjb29yZHMyID0gcDIuc3ViKCBQICkubm9ybWFsaXplKCkudG9WYXIoKTtcclxuXHRcdGNvbnN0IGNvb3JkczMgPSBwMy5zdWIoIFAgKS5ub3JtYWxpemUoKS50b1ZhcigpO1xyXG5cclxuXHRcdC8vIGNhbGN1bGF0ZSB2ZWN0b3IgZm9ybSBmYWN0b3JcclxuXHRcdGNvbnN0IHZlY3RvckZvcm1GYWN0b3IgPSB2ZWMzKCAwICkudG9WYXIoKTtcclxuXHRcdHZlY3RvckZvcm1GYWN0b3IuYWRkQXNzaWduKCBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIHsgdjE6IGNvb3JkczAsIHYyOiBjb29yZHMxIH0gKSApO1xyXG5cdFx0dmVjdG9yRm9ybUZhY3Rvci5hZGRBc3NpZ24oIExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggeyB2MTogY29vcmRzMSwgdjI6IGNvb3JkczIgfSApICk7XHJcblx0XHR2ZWN0b3JGb3JtRmFjdG9yLmFkZEFzc2lnbiggTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCB7IHYxOiBjb29yZHMyLCB2MjogY29vcmRzMyB9ICkgKTtcclxuXHRcdHZlY3RvckZvcm1GYWN0b3IuYWRkQXNzaWduKCBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIHsgdjE6IGNvb3JkczMsIHYyOiBjb29yZHMwIH0gKSApO1xyXG5cclxuXHRcdC8vIGFkanVzdCBmb3IgaG9yaXpvbiBjbGlwcGluZ1xyXG5cdFx0cmVzdWx0LmFzc2lnbiggdmVjMyggTFRDX0NsaXBwZWRTcGhlcmVGb3JtRmFjdG9yKCB7IGY6IHZlY3RvckZvcm1GYWN0b3IuYWJzKCkgfSApICkgKTtcclxuXHJcblx0fSApO1xyXG5cclxuXHRyZXR1cm4gcmVzdWx0O1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdMVENfRXZhbHVhdGUnLFxyXG5cdHR5cGU6ICd2ZWMzJyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ1AnLCB0eXBlOiAndmVjMycgfSxcclxuXHRcdHsgbmFtZTogJ3AwJywgdHlwZTogJ3ZlYzMnIH0sXHJcblx0XHR7IG5hbWU6ICdwMScsIHR5cGU6ICd2ZWMzJyB9LFxyXG5cdFx0eyBuYW1lOiAncDInLCB0eXBlOiAndmVjMycgfSxcclxuXHRcdHsgbmFtZTogJ3AzJywgdHlwZTogJ3ZlYzMnIH1cclxuXHRdXHJcbn0gKTtcclxuXHJcbmV4cG9ydCB7IExUQ19FdmFsdWF0ZSwgTFRDX0V2YWx1YXRlX1ZvbHVtZSwgTFRDX1V2IH07XHJcbiIsImltcG9ydCB7IGFkZCwgbXVsLCBkaXYgfSBmcm9tICcuLi9tYXRoL09wZXJhdG9yTm9kZS5qcyc7XHJcbmltcG9ydCB7IGZsb29yLCBjZWlsLCBmcmFjdCwgcG93IH0gZnJvbSAnLi4vbWF0aC9NYXRoTm9kZS5qcyc7XHJcbmltcG9ydCB7IEZuLCBmbG9hdCwgdmVjMiwgdmVjNCwgaW50IH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5cclxuLy8gTWlwcGVkIEJpY3ViaWMgVGV4dHVyZSBGaWx0ZXJpbmcgYnkgTjhcclxuLy8gaHR0cHM6Ly93d3cuc2hhZGVydG95LmNvbS92aWV3L0RsMlNEV1xyXG5cclxuY29uc3QgYkMgPSAxLjAgLyA2LjA7XHJcblxyXG5jb25zdCB3MCA9ICggYSApID0+IG11bCggYkMsIG11bCggYSwgbXVsKCBhLCBhLm5lZ2F0ZSgpLmFkZCggMy4wICkgKS5zdWIoIDMuMCApICkuYWRkKCAxLjAgKSApO1xyXG5cclxuY29uc3QgdzEgPSAoIGEgKSA9PiBtdWwoIGJDLCBtdWwoIGEsIG11bCggYSwgbXVsKCAzLjAsIGEgKS5zdWIoIDYuMCApICkgKS5hZGQoIDQuMCApICk7XHJcblxyXG5jb25zdCB3MiA9ICggYSApID0+IG11bCggYkMsIG11bCggYSwgbXVsKCBhLCBtdWwoIC0gMy4wLCBhICkuYWRkKCAzLjAgKSApLmFkZCggMy4wICkgKS5hZGQoIDEuMCApICk7XHJcblxyXG5jb25zdCB3MyA9ICggYSApID0+IG11bCggYkMsIHBvdyggYSwgMyApICk7XHJcblxyXG5jb25zdCBnMCA9ICggYSApID0+IHcwKCBhICkuYWRkKCB3MSggYSApICk7XHJcblxyXG5jb25zdCBnMSA9ICggYSApID0+IHcyKCBhICkuYWRkKCB3MyggYSApICk7XHJcblxyXG4vLyBoMCBhbmQgaDEgYXJlIHRoZSB0d28gb2Zmc2V0IGZ1bmN0aW9uc1xyXG5jb25zdCBoMCA9ICggYSApID0+IGFkZCggLSAxLjAsIHcxKCBhICkuZGl2KCB3MCggYSApLmFkZCggdzEoIGEgKSApICkgKTtcclxuXHJcbmNvbnN0IGgxID0gKCBhICkgPT4gYWRkKCAxLjAsIHczKCBhICkuZGl2KCB3MiggYSApLmFkZCggdzMoIGEgKSApICkgKTtcclxuXHJcbmNvbnN0IGJpY3ViaWMgPSAoIHRleHR1cmVOb2RlLCB0ZXhlbFNpemUsIGxvZCApID0+IHtcclxuXHJcblx0Y29uc3QgdXYgPSB0ZXh0dXJlTm9kZS51dk5vZGU7XHJcblx0Y29uc3QgdXZTY2FsZWQgPSBtdWwoIHV2LCB0ZXhlbFNpemUuencgKS5hZGQoIDAuNSApO1xyXG5cclxuXHRjb25zdCBpdXYgPSBmbG9vciggdXZTY2FsZWQgKTtcclxuXHRjb25zdCBmdXYgPSBmcmFjdCggdXZTY2FsZWQgKTtcclxuXHJcblx0Y29uc3QgZzB4ID0gZzAoIGZ1di54ICk7XHJcblx0Y29uc3QgZzF4ID0gZzEoIGZ1di54ICk7XHJcblx0Y29uc3QgaDB4ID0gaDAoIGZ1di54ICk7XHJcblx0Y29uc3QgaDF4ID0gaDEoIGZ1di54ICk7XHJcblx0Y29uc3QgaDB5ID0gaDAoIGZ1di55ICk7XHJcblx0Y29uc3QgaDF5ID0gaDEoIGZ1di55ICk7XHJcblxyXG5cdGNvbnN0IHAwID0gdmVjMiggaXV2LnguYWRkKCBoMHggKSwgaXV2LnkuYWRkKCBoMHkgKSApLnN1YiggMC41ICkubXVsKCB0ZXhlbFNpemUueHkgKTtcclxuXHRjb25zdCBwMSA9IHZlYzIoIGl1di54LmFkZCggaDF4ICksIGl1di55LmFkZCggaDB5ICkgKS5zdWIoIDAuNSApLm11bCggdGV4ZWxTaXplLnh5ICk7XHJcblx0Y29uc3QgcDIgPSB2ZWMyKCBpdXYueC5hZGQoIGgweCApLCBpdXYueS5hZGQoIGgxeSApICkuc3ViKCAwLjUgKS5tdWwoIHRleGVsU2l6ZS54eSApO1xyXG5cdGNvbnN0IHAzID0gdmVjMiggaXV2LnguYWRkKCBoMXggKSwgaXV2LnkuYWRkKCBoMXkgKSApLnN1YiggMC41ICkubXVsKCB0ZXhlbFNpemUueHkgKTtcclxuXHJcblx0Y29uc3QgYSA9IGcwKCBmdXYueSApLm11bCggYWRkKCBnMHgubXVsKCB0ZXh0dXJlTm9kZS5zYW1wbGUoIHAwICkubGV2ZWwoIGxvZCApICksIGcxeC5tdWwoIHRleHR1cmVOb2RlLnNhbXBsZSggcDEgKS5sZXZlbCggbG9kICkgKSApICk7XHJcblx0Y29uc3QgYiA9IGcxKCBmdXYueSApLm11bCggYWRkKCBnMHgubXVsKCB0ZXh0dXJlTm9kZS5zYW1wbGUoIHAyICkubGV2ZWwoIGxvZCApICksIGcxeC5tdWwoIHRleHR1cmVOb2RlLnNhbXBsZSggcDMgKS5sZXZlbCggbG9kICkgKSApICk7XHJcblxyXG5cdHJldHVybiBhLmFkZCggYiApO1xyXG5cclxufTtcclxuXHJcbi8qKlxyXG4gKiBBcHBsaWVzIG1pcHBlZCBiaWN1YmljIHRleHR1cmUgZmlsdGVyaW5nIHRvIHRoZSBnaXZlbiB0ZXh0dXJlIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7VGV4dHVyZU5vZGV9IHRleHR1cmVOb2RlIC0gVGhlIHRleHR1cmUgbm9kZSB0aGF0IHNob3VsZCBiZSBmaWx0ZXJlZC5cclxuICogQHBhcmFtIHtOb2RlPGZsb2F0Pn0gW2xvZE5vZGU9ZmxvYXQoMyldIC0gRGVmaW5lcyB0aGUgTE9EIHRvIHNhbXBsZSBmcm9tLlxyXG4gKiBAcmV0dXJuIHtOb2RlfSBUaGUgZmlsdGVyZWQgdGV4dHVyZSBzYW1wbGUuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdGV4dHVyZUJpY3ViaWMgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgdGV4dHVyZU5vZGUsIGxvZE5vZGUgPSBmbG9hdCggMyApIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IGZMb2RTaXplID0gdmVjMiggdGV4dHVyZU5vZGUuc2l6ZSggaW50KCBsb2ROb2RlICkgKSApO1xyXG5cdGNvbnN0IGNMb2RTaXplID0gdmVjMiggdGV4dHVyZU5vZGUuc2l6ZSggaW50KCBsb2ROb2RlLmFkZCggMS4wICkgKSApICk7XHJcblx0Y29uc3QgZkxvZFNpemVJbnYgPSBkaXYoIDEuMCwgZkxvZFNpemUgKTtcclxuXHRjb25zdCBjTG9kU2l6ZUludiA9IGRpdiggMS4wLCBjTG9kU2l6ZSApO1xyXG5cdGNvbnN0IGZTYW1wbGUgPSBiaWN1YmljKCB0ZXh0dXJlTm9kZSwgdmVjNCggZkxvZFNpemVJbnYsIGZMb2RTaXplICksIGZsb29yKCBsb2ROb2RlICkgKTtcclxuXHRjb25zdCBjU2FtcGxlID0gYmljdWJpYyggdGV4dHVyZU5vZGUsIHZlYzQoIGNMb2RTaXplSW52LCBjTG9kU2l6ZSApLCBjZWlsKCBsb2ROb2RlICkgKTtcclxuXHJcblx0cmV0dXJuIGZyYWN0KCBsb2ROb2RlICkubWl4KCBmU2FtcGxlLCBjU2FtcGxlICk7XHJcblxyXG59ICk7XHJcbiIsImltcG9ydCBCUkRGX0xhbWJlcnQgZnJvbSAnLi9CU0RGL0JSREZfTGFtYmVydC5qcyc7XHJcbmltcG9ydCBCUkRGX0dHWCBmcm9tICcuL0JTREYvQlJERl9HR1guanMnO1xyXG5pbXBvcnQgREZHQXBwcm94IGZyb20gJy4vQlNERi9ERkdBcHByb3guanMnO1xyXG5pbXBvcnQgRW52aXJvbm1lbnRCUkRGIGZyb20gJy4vQlNERi9FbnZpcm9ubWVudEJSREYuanMnO1xyXG5pbXBvcnQgRl9TY2hsaWNrIGZyb20gJy4vQlNERi9GX1NjaGxpY2suanMnO1xyXG5pbXBvcnQgU2NobGlja190b19GMCBmcm9tICcuL0JTREYvU2NobGlja190b19GMC5qcyc7XHJcbmltcG9ydCBCUkRGX1NoZWVuIGZyb20gJy4vQlNERi9CUkRGX1NoZWVuLmpzJztcclxuaW1wb3J0IHsgTFRDX0V2YWx1YXRlLCBMVENfVXYgfSBmcm9tICcuL0JTREYvTFRDLmpzJztcclxuaW1wb3J0IExpZ2h0aW5nTW9kZWwgZnJvbSAnLi4vY29yZS9MaWdodGluZ01vZGVsLmpzJztcclxuaW1wb3J0IHsgZGlmZnVzZUNvbG9yLCBzcGVjdWxhckNvbG9yLCBzcGVjdWxhckY5MCwgcm91Z2huZXNzLCBjbGVhcmNvYXQsIGNsZWFyY29hdFJvdWdobmVzcywgc2hlZW4sIHNoZWVuUm91Z2huZXNzLCBpcmlkZXNjZW5jZSwgaXJpZGVzY2VuY2VJT1IsIGlyaWRlc2NlbmNlVGhpY2tuZXNzLCBpb3IsIHRoaWNrbmVzcywgdHJhbnNtaXNzaW9uLCBhdHRlbnVhdGlvbkRpc3RhbmNlLCBhdHRlbnVhdGlvbkNvbG9yLCBkaXNwZXJzaW9uIH0gZnJvbSAnLi4vY29yZS9Qcm9wZXJ0eU5vZGUuanMnO1xyXG5pbXBvcnQgeyB0cmFuc2Zvcm1lZE5vcm1hbFZpZXcsIHRyYW5zZm9ybWVkQ2xlYXJjb2F0Tm9ybWFsVmlldywgdHJhbnNmb3JtZWROb3JtYWxXb3JsZCB9IGZyb20gJy4uL2FjY2Vzc29ycy9Ob3JtYWwuanMnO1xyXG5pbXBvcnQgeyBwb3NpdGlvblZpZXdEaXJlY3Rpb24sIHBvc2l0aW9uVmlldywgcG9zaXRpb25Xb3JsZCB9IGZyb20gJy4uL2FjY2Vzc29ycy9Qb3NpdGlvbi5qcyc7XHJcbmltcG9ydCB7IEZuLCBmbG9hdCwgdmVjMiwgdmVjMywgdmVjNCwgbWF0MywgSWYgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcbmltcG9ydCB7IHNlbGVjdCB9IGZyb20gJy4uL21hdGgvQ29uZGl0aW9uYWxOb2RlLmpzJztcclxuaW1wb3J0IHsgbWl4LCBub3JtYWxpemUsIHJlZnJhY3QsIGxlbmd0aCwgY2xhbXAsIGxvZzIsIGxvZywgZXhwLCBzbW9vdGhzdGVwIH0gZnJvbSAnLi4vbWF0aC9NYXRoTm9kZS5qcyc7XHJcbmltcG9ydCB7IGRpdiB9IGZyb20gJy4uL21hdGgvT3BlcmF0b3JOb2RlLmpzJztcclxuaW1wb3J0IHsgY2FtZXJhUG9zaXRpb24sIGNhbWVyYVByb2plY3Rpb25NYXRyaXgsIGNhbWVyYVZpZXdNYXRyaXggfSBmcm9tICcuLi9hY2Nlc3NvcnMvQ2FtZXJhLmpzJztcclxuaW1wb3J0IHsgbW9kZWxXb3JsZE1hdHJpeCB9IGZyb20gJy4uL2FjY2Vzc29ycy9Nb2RlbE5vZGUuanMnO1xyXG5pbXBvcnQgeyBzY3JlZW5TaXplIH0gZnJvbSAnLi4vZGlzcGxheS9TY3JlZW5Ob2RlLmpzJztcclxuaW1wb3J0IHsgdmlld3BvcnRNaXBUZXh0dXJlIH0gZnJvbSAnLi4vZGlzcGxheS9WaWV3cG9ydFRleHR1cmVOb2RlLmpzJztcclxuaW1wb3J0IHsgdGV4dHVyZUJpY3ViaWMgfSBmcm9tICcuLi9hY2Nlc3NvcnMvVGV4dHVyZUJpY3ViaWMuanMnO1xyXG5pbXBvcnQgeyBMb29wIH0gZnJvbSAnLi4vdXRpbHMvTG9vcE5vZGUuanMnO1xyXG5pbXBvcnQgeyBCYWNrU2lkZSB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcblxyXG4vL1xyXG4vLyBUcmFuc21pc3Npb25cclxuLy9cclxuXHJcbmNvbnN0IGdldFZvbHVtZVRyYW5zbWlzc2lvblJheSA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyBuLCB2LCB0aGlja25lc3MsIGlvciwgbW9kZWxNYXRyaXggXSApID0+IHtcclxuXHJcblx0Ly8gRGlyZWN0aW9uIG9mIHJlZnJhY3RlZCBsaWdodC5cclxuXHRjb25zdCByZWZyYWN0aW9uVmVjdG9yID0gdmVjMyggcmVmcmFjdCggdi5uZWdhdGUoKSwgbm9ybWFsaXplKCBuICksIGRpdiggMS4wLCBpb3IgKSApICk7XHJcblxyXG5cdC8vIENvbXB1dGUgcm90YXRpb24taW5kZXBlbmRlbnQgc2NhbGluZyBvZiB0aGUgbW9kZWwgbWF0cml4LlxyXG5cdGNvbnN0IG1vZGVsU2NhbGUgPSB2ZWMzKFxyXG5cdFx0bGVuZ3RoKCBtb2RlbE1hdHJpeFsgMCBdLnh5eiApLFxyXG5cdFx0bGVuZ3RoKCBtb2RlbE1hdHJpeFsgMSBdLnh5eiApLFxyXG5cdFx0bGVuZ3RoKCBtb2RlbE1hdHJpeFsgMiBdLnh5eiApXHJcblx0KTtcclxuXHJcblx0Ly8gVGhlIHRoaWNrbmVzcyBpcyBzcGVjaWZpZWQgaW4gbG9jYWwgc3BhY2UuXHJcblx0cmV0dXJuIG5vcm1hbGl6ZSggcmVmcmFjdGlvblZlY3RvciApLm11bCggdGhpY2tuZXNzLm11bCggbW9kZWxTY2FsZSApICk7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ2dldFZvbHVtZVRyYW5zbWlzc2lvblJheScsXHJcblx0dHlwZTogJ3ZlYzMnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAnbicsIHR5cGU6ICd2ZWMzJyB9LFxyXG5cdFx0eyBuYW1lOiAndicsIHR5cGU6ICd2ZWMzJyB9LFxyXG5cdFx0eyBuYW1lOiAndGhpY2tuZXNzJywgdHlwZTogJ2Zsb2F0JyB9LFxyXG5cdFx0eyBuYW1lOiAnaW9yJywgdHlwZTogJ2Zsb2F0JyB9LFxyXG5cdFx0eyBuYW1lOiAnbW9kZWxNYXRyaXgnLCB0eXBlOiAnbWF0NCcgfVxyXG5cdF1cclxufSApO1xyXG5cclxuY29uc3QgYXBwbHlJb3JUb1JvdWdobmVzcyA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyByb3VnaG5lc3MsIGlvciBdICkgPT4ge1xyXG5cclxuXHQvLyBTY2FsZSByb3VnaG5lc3Mgd2l0aCBJT1Igc28gdGhhdCBhbiBJT1Igb2YgMS4wIHJlc3VsdHMgaW4gbm8gbWljcm9mYWNldCByZWZyYWN0aW9uIGFuZFxyXG5cdC8vIGFuIElPUiBvZiAxLjUgcmVzdWx0cyBpbiB0aGUgZGVmYXVsdCBhbW91bnQgb2YgbWljcm9mYWNldCByZWZyYWN0aW9uLlxyXG5cdHJldHVybiByb3VnaG5lc3MubXVsKCBjbGFtcCggaW9yLm11bCggMi4wICkuc3ViKCAyLjAgKSwgMC4wLCAxLjAgKSApO1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdhcHBseUlvclRvUm91Z2huZXNzJyxcclxuXHR0eXBlOiAnZmxvYXQnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAncm91Z2huZXNzJywgdHlwZTogJ2Zsb2F0JyB9LFxyXG5cdFx0eyBuYW1lOiAnaW9yJywgdHlwZTogJ2Zsb2F0JyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5jb25zdCB2aWV3cG9ydEJhY2tTaWRlVGV4dHVyZSA9IC8qQF9fUFVSRV9fKi8gdmlld3BvcnRNaXBUZXh0dXJlKCk7XHJcbmNvbnN0IHZpZXdwb3J0RnJvbnRTaWRlVGV4dHVyZSA9IC8qQF9fUFVSRV9fKi8gdmlld3BvcnRNaXBUZXh0dXJlKCk7XHJcblxyXG5jb25zdCBnZXRUcmFuc21pc3Npb25TYW1wbGUgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgZnJhZ0Nvb3JkLCByb3VnaG5lc3MsIGlvciBdLCB7IG1hdGVyaWFsIH0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IHZUZXh0dXJlID0gbWF0ZXJpYWwuc2lkZSA9PT0gQmFja1NpZGUgPyB2aWV3cG9ydEJhY2tTaWRlVGV4dHVyZSA6IHZpZXdwb3J0RnJvbnRTaWRlVGV4dHVyZTtcclxuXHJcblx0Y29uc3QgdHJhbnNtaXNzaW9uU2FtcGxlID0gdlRleHR1cmUuc2FtcGxlKCBmcmFnQ29vcmQgKTtcclxuXHQvL2NvbnN0IHRyYW5zbWlzc2lvblNhbXBsZSA9IHZpZXdwb3J0TWlwVGV4dHVyZSggZnJhZ0Nvb3JkICk7XHJcblxyXG5cdGNvbnN0IGxvZCA9IGxvZzIoIHNjcmVlblNpemUueCApLm11bCggYXBwbHlJb3JUb1JvdWdobmVzcyggcm91Z2huZXNzLCBpb3IgKSApO1xyXG5cclxuXHRyZXR1cm4gdGV4dHVyZUJpY3ViaWMoIHRyYW5zbWlzc2lvblNhbXBsZSwgbG9kICk7XHJcblxyXG59ICk7XHJcblxyXG5jb25zdCB2b2x1bWVBdHRlbnVhdGlvbiA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyB0cmFuc21pc3Npb25EaXN0YW5jZSwgYXR0ZW51YXRpb25Db2xvciwgYXR0ZW51YXRpb25EaXN0YW5jZSBdICkgPT4ge1xyXG5cclxuXHRJZiggYXR0ZW51YXRpb25EaXN0YW5jZS5ub3RFcXVhbCggMCApLCAoKSA9PiB7XHJcblxyXG5cdFx0Ly8gQ29tcHV0ZSBsaWdodCBhdHRlbnVhdGlvbiB1c2luZyBCZWVyJ3MgbGF3LlxyXG5cdFx0Y29uc3QgYXR0ZW51YXRpb25Db2VmZmljaWVudCA9IGxvZyggYXR0ZW51YXRpb25Db2xvciApLm5lZ2F0ZSgpLmRpdiggYXR0ZW51YXRpb25EaXN0YW5jZSApO1xyXG5cdFx0Y29uc3QgdHJhbnNtaXR0YW5jZSA9IGV4cCggYXR0ZW51YXRpb25Db2VmZmljaWVudC5uZWdhdGUoKS5tdWwoIHRyYW5zbWlzc2lvbkRpc3RhbmNlICkgKTtcclxuXHJcblx0XHRyZXR1cm4gdHJhbnNtaXR0YW5jZTtcclxuXHJcblx0fSApO1xyXG5cclxuXHQvLyBBdHRlbnVhdGlvbiBkaXN0YW5jZSBpcyAr4oieLCBpLmUuIHRoZSB0cmFuc21pdHRlZCBjb2xvciBpcyBub3QgYXR0ZW51YXRlZCBhdCBhbGwuXHJcblx0cmV0dXJuIHZlYzMoIDEuMCApO1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICd2b2x1bWVBdHRlbnVhdGlvbicsXHJcblx0dHlwZTogJ3ZlYzMnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAndHJhbnNtaXNzaW9uRGlzdGFuY2UnLCB0eXBlOiAnZmxvYXQnIH0sXHJcblx0XHR7IG5hbWU6ICdhdHRlbnVhdGlvbkNvbG9yJywgdHlwZTogJ3ZlYzMnIH0sXHJcblx0XHR7IG5hbWU6ICdhdHRlbnVhdGlvbkRpc3RhbmNlJywgdHlwZTogJ2Zsb2F0JyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5jb25zdCBnZXRJQkxWb2x1bWVSZWZyYWN0aW9uID0gLypAX19QVVJFX18qLyBGbiggKCBbIG4sIHYsIHJvdWdobmVzcywgZGlmZnVzZUNvbG9yLCBzcGVjdWxhckNvbG9yLCBzcGVjdWxhckY5MCwgcG9zaXRpb24sIG1vZGVsTWF0cml4LCB2aWV3TWF0cml4LCBwcm9qTWF0cml4LCBpb3IsIHRoaWNrbmVzcywgYXR0ZW51YXRpb25Db2xvciwgYXR0ZW51YXRpb25EaXN0YW5jZSwgZGlzcGVyc2lvbiBdICkgPT4ge1xyXG5cclxuXHRsZXQgdHJhbnNtaXR0ZWRMaWdodCwgdHJhbnNtaXR0YW5jZTtcclxuXHJcblx0aWYgKCBkaXNwZXJzaW9uICkge1xyXG5cclxuXHRcdHRyYW5zbWl0dGVkTGlnaHQgPSB2ZWM0KCkudG9WYXIoKTtcclxuXHRcdHRyYW5zbWl0dGFuY2UgPSB2ZWMzKCkudG9WYXIoKTtcclxuXHJcblx0XHRjb25zdCBoYWxmU3ByZWFkID0gaW9yLnN1YiggMS4wICkubXVsKCBkaXNwZXJzaW9uLm11bCggMC4wMjUgKSApO1xyXG5cdFx0Y29uc3QgaW9ycyA9IHZlYzMoIGlvci5zdWIoIGhhbGZTcHJlYWQgKSwgaW9yLCBpb3IuYWRkKCBoYWxmU3ByZWFkICkgKTtcclxuXHJcblx0XHRMb29wKCB7IHN0YXJ0OiAwLCBlbmQ6IDMgfSwgKCB7IGkgfSApID0+IHtcclxuXHJcblx0XHRcdGNvbnN0IGlvciA9IGlvcnMuZWxlbWVudCggaSApO1xyXG5cclxuXHRcdFx0Y29uc3QgdHJhbnNtaXNzaW9uUmF5ID0gZ2V0Vm9sdW1lVHJhbnNtaXNzaW9uUmF5KCBuLCB2LCB0aGlja25lc3MsIGlvciwgbW9kZWxNYXRyaXggKTtcclxuXHRcdFx0Y29uc3QgcmVmcmFjdGVkUmF5RXhpdCA9IHBvc2l0aW9uLmFkZCggdHJhbnNtaXNzaW9uUmF5ICk7XHJcblxyXG5cdFx0XHQvLyBQcm9qZWN0IHJlZnJhY3RlZCB2ZWN0b3Igb24gdGhlIGZyYW1lYnVmZmVyLCB3aGlsZSBtYXBwaW5nIHRvIG5vcm1hbGl6ZWQgZGV2aWNlIGNvb3JkaW5hdGVzLlxyXG5cdFx0XHRjb25zdCBuZGNQb3MgPSBwcm9qTWF0cml4Lm11bCggdmlld01hdHJpeC5tdWwoIHZlYzQoIHJlZnJhY3RlZFJheUV4aXQsIDEuMCApICkgKTtcclxuXHRcdFx0Y29uc3QgcmVmcmFjdGlvbkNvb3JkcyA9IHZlYzIoIG5kY1Bvcy54eS5kaXYoIG5kY1Bvcy53ICkgKS50b1ZhcigpO1xyXG5cdFx0XHRyZWZyYWN0aW9uQ29vcmRzLmFkZEFzc2lnbiggMS4wICk7XHJcblx0XHRcdHJlZnJhY3Rpb25Db29yZHMuZGl2QXNzaWduKCAyLjAgKTtcclxuXHRcdFx0cmVmcmFjdGlvbkNvb3Jkcy5hc3NpZ24oIHZlYzIoIHJlZnJhY3Rpb25Db29yZHMueCwgcmVmcmFjdGlvbkNvb3Jkcy55Lm9uZU1pbnVzKCkgKSApOyAvLyB3ZWJncHVcclxuXHJcblx0XHRcdC8vIFNhbXBsZSBmcmFtZWJ1ZmZlciB0byBnZXQgcGl4ZWwgdGhlIHJlZnJhY3RlZCByYXkgaGl0cy5cclxuXHRcdFx0Y29uc3QgdHJhbnNtaXNzaW9uU2FtcGxlID0gZ2V0VHJhbnNtaXNzaW9uU2FtcGxlKCByZWZyYWN0aW9uQ29vcmRzLCByb3VnaG5lc3MsIGlvciApO1xyXG5cclxuXHRcdFx0dHJhbnNtaXR0ZWRMaWdodC5lbGVtZW50KCBpICkuYXNzaWduKCB0cmFuc21pc3Npb25TYW1wbGUuZWxlbWVudCggaSApICk7XHJcblx0XHRcdHRyYW5zbWl0dGVkTGlnaHQuYS5hZGRBc3NpZ24oIHRyYW5zbWlzc2lvblNhbXBsZS5hICk7XHJcblxyXG5cdFx0XHR0cmFuc21pdHRhbmNlLmVsZW1lbnQoIGkgKS5hc3NpZ24oIGRpZmZ1c2VDb2xvci5lbGVtZW50KCBpICkubXVsKCB2b2x1bWVBdHRlbnVhdGlvbiggbGVuZ3RoKCB0cmFuc21pc3Npb25SYXkgKSwgYXR0ZW51YXRpb25Db2xvciwgYXR0ZW51YXRpb25EaXN0YW5jZSApLmVsZW1lbnQoIGkgKSApICk7XHJcblxyXG5cdFx0fSApO1xyXG5cclxuXHRcdHRyYW5zbWl0dGVkTGlnaHQuYS5kaXZBc3NpZ24oIDMuMCApO1xyXG5cclxuXHR9IGVsc2Uge1xyXG5cclxuXHRcdGNvbnN0IHRyYW5zbWlzc2lvblJheSA9IGdldFZvbHVtZVRyYW5zbWlzc2lvblJheSggbiwgdiwgdGhpY2tuZXNzLCBpb3IsIG1vZGVsTWF0cml4ICk7XHJcblx0XHRjb25zdCByZWZyYWN0ZWRSYXlFeGl0ID0gcG9zaXRpb24uYWRkKCB0cmFuc21pc3Npb25SYXkgKTtcclxuXHJcblx0XHQvLyBQcm9qZWN0IHJlZnJhY3RlZCB2ZWN0b3Igb24gdGhlIGZyYW1lYnVmZmVyLCB3aGlsZSBtYXBwaW5nIHRvIG5vcm1hbGl6ZWQgZGV2aWNlIGNvb3JkaW5hdGVzLlxyXG5cdFx0Y29uc3QgbmRjUG9zID0gcHJvak1hdHJpeC5tdWwoIHZpZXdNYXRyaXgubXVsKCB2ZWM0KCByZWZyYWN0ZWRSYXlFeGl0LCAxLjAgKSApICk7XHJcblx0XHRjb25zdCByZWZyYWN0aW9uQ29vcmRzID0gdmVjMiggbmRjUG9zLnh5LmRpdiggbmRjUG9zLncgKSApLnRvVmFyKCk7XHJcblx0XHRyZWZyYWN0aW9uQ29vcmRzLmFkZEFzc2lnbiggMS4wICk7XHJcblx0XHRyZWZyYWN0aW9uQ29vcmRzLmRpdkFzc2lnbiggMi4wICk7XHJcblx0XHRyZWZyYWN0aW9uQ29vcmRzLmFzc2lnbiggdmVjMiggcmVmcmFjdGlvbkNvb3Jkcy54LCByZWZyYWN0aW9uQ29vcmRzLnkub25lTWludXMoKSApICk7IC8vIHdlYmdwdVxyXG5cclxuXHRcdC8vIFNhbXBsZSBmcmFtZWJ1ZmZlciB0byBnZXQgcGl4ZWwgdGhlIHJlZnJhY3RlZCByYXkgaGl0cy5cclxuXHRcdHRyYW5zbWl0dGVkTGlnaHQgPSBnZXRUcmFuc21pc3Npb25TYW1wbGUoIHJlZnJhY3Rpb25Db29yZHMsIHJvdWdobmVzcywgaW9yICk7XHJcblx0XHR0cmFuc21pdHRhbmNlID0gZGlmZnVzZUNvbG9yLm11bCggdm9sdW1lQXR0ZW51YXRpb24oIGxlbmd0aCggdHJhbnNtaXNzaW9uUmF5ICksIGF0dGVudWF0aW9uQ29sb3IsIGF0dGVudWF0aW9uRGlzdGFuY2UgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvbnN0IGF0dGVudWF0ZWRDb2xvciA9IHRyYW5zbWl0dGFuY2UucmdiLm11bCggdHJhbnNtaXR0ZWRMaWdodC5yZ2IgKTtcclxuXHRjb25zdCBkb3ROViA9IG4uZG90KCB2ICkuY2xhbXAoKTtcclxuXHJcblx0Ly8gR2V0IHRoZSBzcGVjdWxhciBjb21wb25lbnQuXHJcblx0Y29uc3QgRiA9IHZlYzMoIEVudmlyb25tZW50QlJERiggeyAvLyBuLCB2LCBzcGVjdWxhckNvbG9yLCBzcGVjdWxhckY5MCwgcm91Z2huZXNzXHJcblx0XHRkb3ROVixcclxuXHRcdHNwZWN1bGFyQ29sb3IsXHJcblx0XHRzcGVjdWxhckY5MCxcclxuXHRcdHJvdWdobmVzc1xyXG5cdH0gKSApO1xyXG5cclxuXHQvLyBBcyBsZXNzIGxpZ2h0IGlzIHRyYW5zbWl0dGVkLCB0aGUgb3BhY2l0eSBzaG91bGQgYmUgaW5jcmVhc2VkLiBUaGlzIHNpbXBsZSBhcHByb3hpbWF0aW9uIGRvZXMgYSBkZWNlbnQgam9iXHJcblx0Ly8gb2YgbW9kdWxhdGluZyBhIENTUyBiYWNrZ3JvdW5kLCBhbmQgaGFzIG5vIGVmZmVjdCB3aGVuIHRoZSBidWZmZXIgaXMgb3BhcXVlLCBkdWUgdG8gYSBzb2xpZCBvYmplY3Qgb3IgY2xlYXIgY29sb3IuXHJcblx0Y29uc3QgdHJhbnNtaXR0YW5jZUZhY3RvciA9IHRyYW5zbWl0dGFuY2Uuci5hZGQoIHRyYW5zbWl0dGFuY2UuZywgdHJhbnNtaXR0YW5jZS5iICkuZGl2KCAzLjAgKTtcclxuXHJcblx0cmV0dXJuIHZlYzQoIEYub25lTWludXMoKS5tdWwoIGF0dGVudWF0ZWRDb2xvciApLCB0cmFuc21pdHRlZExpZ2h0LmEub25lTWludXMoKS5tdWwoIHRyYW5zbWl0dGFuY2VGYWN0b3IgKS5vbmVNaW51cygpICk7XHJcblxyXG59ICk7XHJcblxyXG4vL1xyXG4vLyBJcmlkZXNjZW5jZVxyXG4vL1xyXG5cclxuLy8gWFlaIHRvIGxpbmVhci1zUkdCIGNvbG9yIHNwYWNlXHJcbmNvbnN0IFhZWl9UT19SRUM3MDkgPSAvKkBfX1BVUkVfXyovIG1hdDMoXHJcblx0My4yNDA0NTQyLCAtIDAuOTY5MjY2MCwgMC4wNTU2NDM0LFxyXG5cdC0gMS41MzcxMzg1LCAxLjg3NjAxMDgsIC0gMC4yMDQwMjU5LFxyXG5cdC0gMC40OTg1MzE0LCAwLjA0MTU1NjAsIDEuMDU3MjI1MlxyXG4pO1xyXG5cclxuLy8gQXNzdW1lIGFpciBpbnRlcmZhY2UgZm9yIHRvcFxyXG4vLyBOb3RlOiBXZSBkb24ndCBoYW5kbGUgdGhlIGNhc2UgZnJlc25lbDAgPT0gMVxyXG5jb25zdCBGcmVzbmVsMFRvSW9yID0gKCBmcmVzbmVsMCApID0+IHtcclxuXHJcblx0Y29uc3Qgc3FydEYwID0gZnJlc25lbDAuc3FydCgpO1xyXG5cdHJldHVybiB2ZWMzKCAxLjAgKS5hZGQoIHNxcnRGMCApLmRpdiggdmVjMyggMS4wICkuc3ViKCBzcXJ0RjAgKSApO1xyXG5cclxufTtcclxuXHJcbi8vIGlvciBpcyBhIHZhbHVlIGJldHdlZW4gMS4wIGFuZCAzLjAuIDEuMCBpcyBhaXIgaW50ZXJmYWNlXHJcbmNvbnN0IElvclRvRnJlc25lbDAgPSAoIHRyYW5zbWl0dGVkSW9yLCBpbmNpZGVudElvciApID0+IHtcclxuXHJcblx0cmV0dXJuIHRyYW5zbWl0dGVkSW9yLnN1YiggaW5jaWRlbnRJb3IgKS5kaXYoIHRyYW5zbWl0dGVkSW9yLmFkZCggaW5jaWRlbnRJb3IgKSApLnBvdzIoKTtcclxuXHJcbn07XHJcblxyXG4vLyBGcmVzbmVsIGVxdWF0aW9ucyBmb3IgZGllbGVjdHJpYy9kaWVsZWN0cmljIGludGVyZmFjZXMuXHJcbi8vIFJlZjogaHR0cHM6Ly9iZWxjb3VyLmdpdGh1Yi5pby9ibG9nL3Jlc2VhcmNoLzIwMTcvMDUvMDEvYnJkZi10aGluLWZpbG0uaHRtbFxyXG4vLyBFdmFsdWF0aW9uIFhZWiBzZW5zaXRpdml0eSBjdXJ2ZXMgaW4gRm91cmllciBzcGFjZVxyXG5jb25zdCBldmFsU2Vuc2l0aXZpdHkgPSAoIE9QRCwgc2hpZnQgKSA9PiB7XHJcblxyXG5cdGNvbnN0IHBoYXNlID0gT1BELm11bCggMi4wICogTWF0aC5QSSAqIDEuMGUtOSApO1xyXG5cdGNvbnN0IHZhbCA9IHZlYzMoIDUuNDg1NmUtMTMsIDQuNDIwMWUtMTMsIDUuMjQ4MWUtMTMgKTtcclxuXHRjb25zdCBwb3MgPSB2ZWMzKCAxLjY4MTBlKzA2LCAxLjc5NTNlKzA2LCAyLjIwODRlKzA2ICk7XHJcblx0Y29uc3QgVkFSID0gdmVjMyggNC4zMjc4ZSswOSwgOS4zMDQ2ZSswOSwgNi42MTIxZSswOSApO1xyXG5cclxuXHRjb25zdCB4ID0gZmxvYXQoIDkuNzQ3MGUtMTQgKiBNYXRoLnNxcnQoIDIuMCAqIE1hdGguUEkgKiA0LjUyODJlKzA5ICkgKS5tdWwoIHBoYXNlLm11bCggMi4yMzk5ZSswNiApLmFkZCggc2hpZnQueCApLmNvcygpICkubXVsKCBwaGFzZS5wb3cyKCkubXVsKCAtIDQuNTI4MmUrMDkgKS5leHAoKSApO1xyXG5cclxuXHRsZXQgeHl6ID0gdmFsLm11bCggVkFSLm11bCggMi4wICogTWF0aC5QSSApLnNxcnQoKSApLm11bCggcG9zLm11bCggcGhhc2UgKS5hZGQoIHNoaWZ0ICkuY29zKCkgKS5tdWwoIHBoYXNlLnBvdzIoKS5uZWdhdGUoKS5tdWwoIFZBUiApLmV4cCgpICk7XHJcblx0eHl6ID0gdmVjMyggeHl6LnguYWRkKCB4ICksIHh5ei55LCB4eXoueiApLmRpdiggMS4wNjg1ZS03ICk7XHJcblxyXG5cdGNvbnN0IHJnYiA9IFhZWl9UT19SRUM3MDkubXVsKCB4eXogKTtcclxuXHJcblx0cmV0dXJuIHJnYjtcclxuXHJcbn07XHJcblxyXG5jb25zdCBldmFsSXJpZGVzY2VuY2UgPSAvKkBfX1BVUkVfXyovIEZuKCAoIHsgb3V0c2lkZUlPUiwgZXRhMiwgY29zVGhldGExLCB0aGluRmlsbVRoaWNrbmVzcywgYmFzZUYwIH0gKSA9PiB7XHJcblxyXG5cdC8vIEZvcmNlIGlyaWRlc2NlbmNlSU9SIC0+IG91dHNpZGVJT1Igd2hlbiB0aGluRmlsbVRoaWNrbmVzcyAtPiAwLjBcclxuXHRjb25zdCBpcmlkZXNjZW5jZUlPUiA9IG1peCggb3V0c2lkZUlPUiwgZXRhMiwgc21vb3Roc3RlcCggMC4wLCAwLjAzLCB0aGluRmlsbVRoaWNrbmVzcyApICk7XHJcblx0Ly8gRXZhbHVhdGUgdGhlIGNvc1RoZXRhIG9uIHRoZSBiYXNlIGxheWVyIChTbmVsbCBsYXcpXHJcblx0Y29uc3Qgc2luVGhldGEyU3EgPSBvdXRzaWRlSU9SLmRpdiggaXJpZGVzY2VuY2VJT1IgKS5wb3cyKCkubXVsKCBjb3NUaGV0YTEucG93MigpLm9uZU1pbnVzKCkgKTtcclxuXHJcblx0Ly8gSGFuZGxlIFRJUjpcclxuXHRjb25zdCBjb3NUaGV0YTJTcSA9IHNpblRoZXRhMlNxLm9uZU1pbnVzKCk7XHJcblxyXG5cdElmKCBjb3NUaGV0YTJTcS5sZXNzVGhhbiggMCApLCAoKSA9PiB7XHJcblxyXG5cdFx0cmV0dXJuIHZlYzMoIDEuMCApO1xyXG5cclxuXHR9ICk7XHJcblxyXG5cdGNvbnN0IGNvc1RoZXRhMiA9IGNvc1RoZXRhMlNxLnNxcnQoKTtcclxuXHJcblx0Ly8gRmlyc3QgaW50ZXJmYWNlXHJcblx0Y29uc3QgUjAgPSBJb3JUb0ZyZXNuZWwwKCBpcmlkZXNjZW5jZUlPUiwgb3V0c2lkZUlPUiApO1xyXG5cdGNvbnN0IFIxMiA9IEZfU2NobGljayggeyBmMDogUjAsIGY5MDogMS4wLCBkb3RWSDogY29zVGhldGExIH0gKTtcclxuXHQvL2NvbnN0IFIyMSA9IFIxMjtcclxuXHRjb25zdCBUMTIxID0gUjEyLm9uZU1pbnVzKCk7XHJcblx0Y29uc3QgcGhpMTIgPSBpcmlkZXNjZW5jZUlPUi5sZXNzVGhhbiggb3V0c2lkZUlPUiApLnNlbGVjdCggTWF0aC5QSSwgMC4wICk7XHJcblx0Y29uc3QgcGhpMjEgPSBmbG9hdCggTWF0aC5QSSApLnN1YiggcGhpMTIgKTtcclxuXHJcblx0Ly8gU2Vjb25kIGludGVyZmFjZVxyXG5cdGNvbnN0IGJhc2VJT1IgPSBGcmVzbmVsMFRvSW9yKCBiYXNlRjAuY2xhbXAoIDAuMCwgMC45OTk5ICkgKTsgLy8gZ3VhcmQgYWdhaW5zdCAxLjBcclxuXHRjb25zdCBSMSA9IElvclRvRnJlc25lbDAoIGJhc2VJT1IsIGlyaWRlc2NlbmNlSU9SLnRvVmVjMygpICk7XHJcblx0Y29uc3QgUjIzID0gRl9TY2hsaWNrKCB7IGYwOiBSMSwgZjkwOiAxLjAsIGRvdFZIOiBjb3NUaGV0YTIgfSApO1xyXG5cdGNvbnN0IHBoaTIzID0gdmVjMyhcclxuXHRcdGJhc2VJT1IueC5sZXNzVGhhbiggaXJpZGVzY2VuY2VJT1IgKS5zZWxlY3QoIE1hdGguUEksIDAuMCApLFxyXG5cdFx0YmFzZUlPUi55Lmxlc3NUaGFuKCBpcmlkZXNjZW5jZUlPUiApLnNlbGVjdCggTWF0aC5QSSwgMC4wICksXHJcblx0XHRiYXNlSU9SLnoubGVzc1RoYW4oIGlyaWRlc2NlbmNlSU9SICkuc2VsZWN0KCBNYXRoLlBJLCAwLjAgKVxyXG5cdCk7XHJcblxyXG5cdC8vIFBoYXNlIHNoaWZ0XHJcblx0Y29uc3QgT1BEID0gaXJpZGVzY2VuY2VJT1IubXVsKCB0aGluRmlsbVRoaWNrbmVzcywgY29zVGhldGEyLCAyLjAgKTtcclxuXHRjb25zdCBwaGkgPSB2ZWMzKCBwaGkyMSApLmFkZCggcGhpMjMgKTtcclxuXHJcblx0Ly8gQ29tcG91bmQgdGVybXNcclxuXHRjb25zdCBSMTIzID0gUjEyLm11bCggUjIzICkuY2xhbXAoIDFlLTUsIDAuOTk5OSApO1xyXG5cdGNvbnN0IHIxMjMgPSBSMTIzLnNxcnQoKTtcclxuXHRjb25zdCBScyA9IFQxMjEucG93MigpLm11bCggUjIzICkuZGl2KCB2ZWMzKCAxLjAgKS5zdWIoIFIxMjMgKSApO1xyXG5cclxuXHQvLyBSZWZsZWN0YW5jZSB0ZXJtIGZvciBtID0gMCAoREMgdGVybSBhbXBsaXR1ZGUpXHJcblx0Y29uc3QgQzAgPSBSMTIuYWRkKCBScyApO1xyXG5cdGNvbnN0IEkgPSBDMC50b1ZhcigpO1xyXG5cclxuXHQvLyBSZWZsZWN0YW5jZSB0ZXJtIGZvciBtID4gMCAocGFpcnMgb2YgZGlyYWNzKVxyXG5cdGNvbnN0IENtID0gUnMuc3ViKCBUMTIxICkudG9WYXIoKTtcclxuXHJcblx0TG9vcCggeyBzdGFydDogMSwgZW5kOiAyLCBjb25kaXRpb246ICc8PScsIG5hbWU6ICdtJyB9LCAoIHsgbSB9ICkgPT4ge1xyXG5cclxuXHRcdENtLm11bEFzc2lnbiggcjEyMyApO1xyXG5cdFx0Y29uc3QgU20gPSBldmFsU2Vuc2l0aXZpdHkoIGZsb2F0KCBtICkubXVsKCBPUEQgKSwgZmxvYXQoIG0gKS5tdWwoIHBoaSApICkubXVsKCAyLjAgKTtcclxuXHRcdEkuYWRkQXNzaWduKCBDbS5tdWwoIFNtICkgKTtcclxuXHJcblx0fSApO1xyXG5cclxuXHQvLyBTaW5jZSBvdXQgb2YgZ2FtdXQgY29sb3JzIG1pZ2h0IGJlIHByb2R1Y2VkLCBuZWdhdGl2ZSBjb2xvciB2YWx1ZXMgYXJlIGNsYW1wZWQgdG8gMC5cclxuXHRyZXR1cm4gSS5tYXgoIHZlYzMoIDAuMCApICk7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ2V2YWxJcmlkZXNjZW5jZScsXHJcblx0dHlwZTogJ3ZlYzMnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAnb3V0c2lkZUlPUicsIHR5cGU6ICdmbG9hdCcgfSxcclxuXHRcdHsgbmFtZTogJ2V0YTInLCB0eXBlOiAnZmxvYXQnIH0sXHJcblx0XHR7IG5hbWU6ICdjb3NUaGV0YTEnLCB0eXBlOiAnZmxvYXQnIH0sXHJcblx0XHR7IG5hbWU6ICd0aGluRmlsbVRoaWNrbmVzcycsIHR5cGU6ICdmbG9hdCcgfSxcclxuXHRcdHsgbmFtZTogJ2Jhc2VGMCcsIHR5cGU6ICd2ZWMzJyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG4vL1xyXG4vL1x0U2hlZW5cclxuLy9cclxuXHJcbi8vIFRoaXMgaXMgYSBjdXJ2ZS1maXQgYXBwcm94aW1hdGlvbiB0byB0aGUgXCJDaGFybGllIHNoZWVuXCIgQlJERiBpbnRlZ3JhdGVkIG92ZXIgdGhlIGhlbWlzcGhlcmUgZnJvbVxyXG4vLyBFc3RldmV6IGFuZCBLdWxsYSAyMDE3LCBcIlByb2R1Y3Rpb24gRnJpZW5kbHkgTWljcm9mYWNldCBTaGVlbiBCUkRGXCIuIFRoZSBhbmFseXNpcyBjYW4gYmUgZm91bmRcclxuLy8gaW4gdGhlIFNoZWVuIHNlY3Rpb24gb2YgaHR0cHM6Ly9kcml2ZS5nb29nbGUuY29tL2ZpbGUvZC8xVDBEMVZTeVI0QWxscUlKVFFBcmFFSXpqbGI1aDRGS0gvdmlldz91c3A9c2hhcmluZ1xyXG5jb25zdCBJQkxTaGVlbkJSREYgPSAvKkBfX1BVUkVfXyovIEZuKCAoIHsgbm9ybWFsLCB2aWV3RGlyLCByb3VnaG5lc3MgfSApID0+IHtcclxuXHJcblx0Y29uc3QgZG90TlYgPSBub3JtYWwuZG90KCB2aWV3RGlyICkuc2F0dXJhdGUoKTtcclxuXHJcblx0Y29uc3QgcjIgPSByb3VnaG5lc3MucG93MigpO1xyXG5cclxuXHRjb25zdCBhID0gc2VsZWN0KFxyXG5cdFx0cm91Z2huZXNzLmxlc3NUaGFuKCAwLjI1ICksXHJcblx0XHRmbG9hdCggLSAzMzkuMiApLm11bCggcjIgKS5hZGQoIGZsb2F0KCAxNjEuNCApLm11bCggcm91Z2huZXNzICkgKS5zdWIoIDI1LjkgKSxcclxuXHRcdGZsb2F0KCAtIDguNDggKS5tdWwoIHIyICkuYWRkKCBmbG9hdCggMTQuMyApLm11bCggcm91Z2huZXNzICkgKS5zdWIoIDkuOTUgKVxyXG5cdCk7XHJcblxyXG5cdGNvbnN0IGIgPSBzZWxlY3QoXHJcblx0XHRyb3VnaG5lc3MubGVzc1RoYW4oIDAuMjUgKSxcclxuXHRcdGZsb2F0KCA0NC4wICkubXVsKCByMiApLnN1YiggZmxvYXQoIDIzLjcgKS5tdWwoIHJvdWdobmVzcyApICkuYWRkKCAzLjI2ICksXHJcblx0XHRmbG9hdCggMS45NyApLm11bCggcjIgKS5zdWIoIGZsb2F0KCAzLjI3ICkubXVsKCByb3VnaG5lc3MgKSApLmFkZCggMC43MiApXHJcblx0KTtcclxuXHJcblx0Y29uc3QgREcgPSBzZWxlY3QoIHJvdWdobmVzcy5sZXNzVGhhbiggMC4yNSApLCAwLjAsIGZsb2F0KCAwLjEgKS5tdWwoIHJvdWdobmVzcyApLnN1YiggMC4wMjUgKSApLmFkZCggYS5tdWwoIGRvdE5WICkuYWRkKCBiICkuZXhwKCkgKTtcclxuXHJcblx0cmV0dXJuIERHLm11bCggMS4wIC8gTWF0aC5QSSApLnNhdHVyYXRlKCk7XHJcblxyXG59ICk7XHJcblxyXG5jb25zdCBjbGVhcmNvYXRGMCA9IHZlYzMoIDAuMDQgKTtcclxuY29uc3QgY2xlYXJjb2F0RjkwID0gZmxvYXQoIDEgKTtcclxuXHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyB0aGUgbGlnaHRpbmcgbW9kZWwgZm9yIGEgUEJSIG1hdGVyaWFsLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTGlnaHRpbmdNb2RlbFxyXG4gKi9cclxuY2xhc3MgUGh5c2ljYWxMaWdodGluZ01vZGVsIGV4dGVuZHMgTGlnaHRpbmdNb2RlbCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcGh5c2ljYWwgbGlnaHRpbmcgbW9kZWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtjbGVhcmNvYXQ9ZmFsc2VdIC0gV2hldGhlciBjbGVhcmNvYXQgaXMgc3VwcG9ydGVkIG9yIG5vdC5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtzaGVlbj1mYWxzZV0gLSBXaGV0aGVyIHNoZWVuIGlzIHN1cHBvcnRlZCBvciBub3QuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbaXJpZGVzY2VuY2U9ZmFsc2VdIC0gV2hldGhlciBpcmlkZXNjZW5jZSBpcyBzdXBwb3J0ZWQgb3Igbm90LlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FuaXNvdHJvcHk9ZmFsc2VdIC0gV2hldGhlciBhbmlzb3Ryb3B5IGlzIHN1cHBvcnRlZCBvciBub3QuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbdHJhbnNtaXNzaW9uPWZhbHNlXSAtIFdoZXRoZXIgdHJhbnNtaXNzaW9uIGlzIHN1cHBvcnRlZCBvciBub3QuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbZGlzcGVyc2lvbj1mYWxzZV0gLSBXaGV0aGVyIGRpc3BlcnNpb24gaXMgc3VwcG9ydGVkIG9yIG5vdC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggY2xlYXJjb2F0ID0gZmFsc2UsIHNoZWVuID0gZmFsc2UsIGlyaWRlc2NlbmNlID0gZmFsc2UsIGFuaXNvdHJvcHkgPSBmYWxzZSwgdHJhbnNtaXNzaW9uID0gZmFsc2UsIGRpc3BlcnNpb24gPSBmYWxzZSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciBjbGVhcmNvYXQgaXMgc3VwcG9ydGVkIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2xlYXJjb2F0ID0gY2xlYXJjb2F0O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciBzaGVlbiBpcyBzdXBwb3J0ZWQgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zaGVlbiA9IHNoZWVuO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciBpcmlkZXNjZW5jZSBpcyBzdXBwb3J0ZWQgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pcmlkZXNjZW5jZSA9IGlyaWRlc2NlbmNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciBhbmlzb3Ryb3B5IGlzIHN1cHBvcnRlZCBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFuaXNvdHJvcHkgPSBhbmlzb3Ryb3B5O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0cmFuc21pc3Npb24gaXMgc3VwcG9ydGVkIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudHJhbnNtaXNzaW9uID0gdHJhbnNtaXNzaW9uO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciBkaXNwZXJzaW9uIGlzIHN1cHBvcnRlZCBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRpc3BlcnNpb24gPSBkaXNwZXJzaW9uO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNsZWFyIGNvYXQgcmFkaWFuY2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNsZWFyY29hdFJhZGlhbmNlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjbGVhciBjb2F0IHNwZWN1bGFyIGRpcmVjdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2xlYXJjb2F0U3BlY3VsYXJEaXJlY3QgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNsZWFyIGNvYXQgc3BlY3VsYXIgaW5kaXJlY3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNsZWFyY29hdFNwZWN1bGFySW5kaXJlY3QgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHNoZWVuIHNwZWN1bGFyIGRpcmVjdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2hlZW5TcGVjdWxhckRpcmVjdCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc2hlZW4gc3BlY3VsYXIgaW5kaXJlY3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNoZWVuU3BlY3VsYXJJbmRpcmVjdCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgaXJpZGVzY2VuY2UgRnJlc25lbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXJpZGVzY2VuY2VGcmVzbmVsID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBpcmlkZXNjZW5jZSBGMC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXJpZGVzY2VuY2VGMCA9IG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVwZW5kaW5nIG9uIHdoYXQgZmVhdHVyZXMgYXJlIHJlcXVlc3RlZCwgdGhlIG1ldGhvZCBwcmVwYXJlcyBjZXJ0YWluIG5vZGUgdmFyaWFibGVzXHJcblx0ICogd2hpY2ggYXJlIGxhdGVyIHVzZWQgZm9yIGxpZ2h0aW5nIGNvbXB1dGF0aW9ucy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICovXHJcblx0c3RhcnQoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmNsZWFyY29hdCA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdHRoaXMuY2xlYXJjb2F0UmFkaWFuY2UgPSB2ZWMzKCkudG9WYXIoICdjbGVhcmNvYXRSYWRpYW5jZScgKTtcclxuXHRcdFx0dGhpcy5jbGVhcmNvYXRTcGVjdWxhckRpcmVjdCA9IHZlYzMoKS50b1ZhciggJ2NsZWFyY29hdFNwZWN1bGFyRGlyZWN0JyApO1xyXG5cdFx0XHR0aGlzLmNsZWFyY29hdFNwZWN1bGFySW5kaXJlY3QgPSB2ZWMzKCkudG9WYXIoICdjbGVhcmNvYXRTcGVjdWxhckluZGlyZWN0JyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMuc2hlZW4gPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnNoZWVuU3BlY3VsYXJEaXJlY3QgPSB2ZWMzKCkudG9WYXIoICdzaGVlblNwZWN1bGFyRGlyZWN0JyApO1xyXG5cdFx0XHR0aGlzLnNoZWVuU3BlY3VsYXJJbmRpcmVjdCA9IHZlYzMoKS50b1ZhciggJ3NoZWVuU3BlY3VsYXJJbmRpcmVjdCcgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aGlzLmlyaWRlc2NlbmNlID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0Y29uc3QgZG90TlZpID0gdHJhbnNmb3JtZWROb3JtYWxWaWV3LmRvdCggcG9zaXRpb25WaWV3RGlyZWN0aW9uICkuY2xhbXAoKTtcclxuXHJcblx0XHRcdHRoaXMuaXJpZGVzY2VuY2VGcmVzbmVsID0gZXZhbElyaWRlc2NlbmNlKCB7XHJcblx0XHRcdFx0b3V0c2lkZUlPUjogZmxvYXQoIDEuMCApLFxyXG5cdFx0XHRcdGV0YTI6IGlyaWRlc2NlbmNlSU9SLFxyXG5cdFx0XHRcdGNvc1RoZXRhMTogZG90TlZpLFxyXG5cdFx0XHRcdHRoaW5GaWxtVGhpY2tuZXNzOiBpcmlkZXNjZW5jZVRoaWNrbmVzcyxcclxuXHRcdFx0XHRiYXNlRjA6IHNwZWN1bGFyQ29sb3JcclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdFx0dGhpcy5pcmlkZXNjZW5jZUYwID0gU2NobGlja190b19GMCggeyBmOiB0aGlzLmlyaWRlc2NlbmNlRnJlc25lbCwgZjkwOiAxLjAsIGRvdFZIOiBkb3ROVmkgfSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMudHJhbnNtaXNzaW9uID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0Y29uc3QgcG9zaXRpb24gPSBwb3NpdGlvbldvcmxkO1xyXG5cdFx0XHRjb25zdCB2ID0gY2FtZXJhUG9zaXRpb24uc3ViKCBwb3NpdGlvbldvcmxkICkubm9ybWFsaXplKCk7IC8vIFRPRE86IENyZWF0ZSBOb2RlIGZvciB0aGlzLCBzYW1lIGlzc3VlIGluIE1hdGVyaWFsWFxyXG5cdFx0XHRjb25zdCBuID0gdHJhbnNmb3JtZWROb3JtYWxXb3JsZDtcclxuXHJcblx0XHRcdGNvbnN0IGNvbnRleHQgPSBidWlsZGVyLmNvbnRleHQ7XHJcblxyXG5cdFx0XHRjb250ZXh0LmJhY2tkcm9wID0gZ2V0SUJMVm9sdW1lUmVmcmFjdGlvbihcclxuXHRcdFx0XHRuLFxyXG5cdFx0XHRcdHYsXHJcblx0XHRcdFx0cm91Z2huZXNzLFxyXG5cdFx0XHRcdGRpZmZ1c2VDb2xvcixcclxuXHRcdFx0XHRzcGVjdWxhckNvbG9yLFxyXG5cdFx0XHRcdHNwZWN1bGFyRjkwLCAvLyBzcGVjdWxhckY5MFxyXG5cdFx0XHRcdHBvc2l0aW9uLCAvLyBwb3NpdGlvbldvcmxkXHJcblx0XHRcdFx0bW9kZWxXb3JsZE1hdHJpeCwgLy8gbW9kZWxNYXRyaXhcclxuXHRcdFx0XHRjYW1lcmFWaWV3TWF0cml4LCAvLyB2aWV3TWF0cml4XHJcblx0XHRcdFx0Y2FtZXJhUHJvamVjdGlvbk1hdHJpeCwgLy8gcHJvak1hdHJpeFxyXG5cdFx0XHRcdGlvcixcclxuXHRcdFx0XHR0aGlja25lc3MsXHJcblx0XHRcdFx0YXR0ZW51YXRpb25Db2xvcixcclxuXHRcdFx0XHRhdHRlbnVhdGlvbkRpc3RhbmNlLFxyXG5cdFx0XHRcdHRoaXMuZGlzcGVyc2lvbiA/IGRpc3BlcnNpb24gOiBudWxsXHJcblx0XHRcdCk7XHJcblxyXG5cdFx0XHRjb250ZXh0LmJhY2tkcm9wQWxwaGEgPSB0cmFuc21pc3Npb247XHJcblxyXG5cdFx0XHRkaWZmdXNlQ29sb3IuYS5tdWxBc3NpZ24oIG1peCggMSwgY29udGV4dC5iYWNrZHJvcC5hLCB0cmFuc21pc3Npb24gKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRzdXBlci5zdGFydCggYnVpbGRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vIEZkZXotQWfDvGVyYSdzIFwiTXVsdGlwbGUtU2NhdHRlcmluZyBNaWNyb2ZhY2V0IE1vZGVsIGZvciBSZWFsLVRpbWUgSW1hZ2UgQmFzZWQgTGlnaHRpbmdcIlxyXG5cdC8vIEFwcHJveGltYXRlcyBtdWx0aS1zY2F0dGVyaW5nIGluIG9yZGVyIHRvIHByZXNlcnZlIGVuZXJneS5cclxuXHQvLyBodHRwOi8vd3d3LmpjZ3Qub3JnL3B1Ymxpc2hlZC8wMDA4LzAxLzAzL1xyXG5cclxuXHRjb21wdXRlTXVsdGlzY2F0dGVyaW5nKCBzaW5nbGVTY2F0dGVyLCBtdWx0aVNjYXR0ZXIsIHNwZWN1bGFyRjkwICkge1xyXG5cclxuXHRcdGNvbnN0IGRvdE5WID0gdHJhbnNmb3JtZWROb3JtYWxWaWV3LmRvdCggcG9zaXRpb25WaWV3RGlyZWN0aW9uICkuY2xhbXAoKTsgLy8gQCBUT0RPOiBNb3ZlIHRvIGNvcmUgZG90TlZcclxuXHJcblx0XHRjb25zdCBmYWIgPSBERkdBcHByb3goIHsgcm91Z2huZXNzLCBkb3ROViB9ICk7XHJcblxyXG5cdFx0Y29uc3QgRnIgPSB0aGlzLmlyaWRlc2NlbmNlRjAgPyBpcmlkZXNjZW5jZS5taXgoIHNwZWN1bGFyQ29sb3IsIHRoaXMuaXJpZGVzY2VuY2VGMCApIDogc3BlY3VsYXJDb2xvcjtcclxuXHJcblx0XHRjb25zdCBGc3NFc3MgPSBGci5tdWwoIGZhYi54ICkuYWRkKCBzcGVjdWxhckY5MC5tdWwoIGZhYi55ICkgKTtcclxuXHJcblx0XHRjb25zdCBFc3MgPSBmYWIueC5hZGQoIGZhYi55ICk7XHJcblx0XHRjb25zdCBFbXMgPSBFc3Mub25lTWludXMoKTtcclxuXHJcblx0XHRjb25zdCBGYXZnID0gc3BlY3VsYXJDb2xvci5hZGQoIHNwZWN1bGFyQ29sb3Iub25lTWludXMoKS5tdWwoIDAuMDQ3NjE5ICkgKTsgLy8gMS8yMVxyXG5cdFx0Y29uc3QgRm1zID0gRnNzRXNzLm11bCggRmF2ZyApLmRpdiggRW1zLm11bCggRmF2ZyApLm9uZU1pbnVzKCkgKTtcclxuXHJcblx0XHRzaW5nbGVTY2F0dGVyLmFkZEFzc2lnbiggRnNzRXNzICk7XHJcblx0XHRtdWx0aVNjYXR0ZXIuYWRkQXNzaWduKCBGbXMubXVsKCBFbXMgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEltcGxlbWVudHMgdGhlIGRpcmVjdCBsaWdodC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBsaWdodERhdGEgLSBUaGUgbGlnaHQgZGF0YS5cclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqL1xyXG5cdGRpcmVjdCggeyBsaWdodERpcmVjdGlvbiwgbGlnaHRDb2xvciwgcmVmbGVjdGVkTGlnaHQgfSApIHtcclxuXHJcblx0XHRjb25zdCBkb3ROTCA9IHRyYW5zZm9ybWVkTm9ybWFsVmlldy5kb3QoIGxpZ2h0RGlyZWN0aW9uICkuY2xhbXAoKTtcclxuXHRcdGNvbnN0IGlycmFkaWFuY2UgPSBkb3ROTC5tdWwoIGxpZ2h0Q29sb3IgKTtcclxuXHJcblx0XHRpZiAoIHRoaXMuc2hlZW4gPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnNoZWVuU3BlY3VsYXJEaXJlY3QuYWRkQXNzaWduKCBpcnJhZGlhbmNlLm11bCggQlJERl9TaGVlbiggeyBsaWdodERpcmVjdGlvbiB9ICkgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMuY2xlYXJjb2F0ID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0Y29uc3QgZG90TkxjYyA9IHRyYW5zZm9ybWVkQ2xlYXJjb2F0Tm9ybWFsVmlldy5kb3QoIGxpZ2h0RGlyZWN0aW9uICkuY2xhbXAoKTtcclxuXHRcdFx0Y29uc3QgY2NJcnJhZGlhbmNlID0gZG90TkxjYy5tdWwoIGxpZ2h0Q29sb3IgKTtcclxuXHJcblx0XHRcdHRoaXMuY2xlYXJjb2F0U3BlY3VsYXJEaXJlY3QuYWRkQXNzaWduKCBjY0lycmFkaWFuY2UubXVsKCBCUkRGX0dHWCggeyBsaWdodERpcmVjdGlvbiwgZjA6IGNsZWFyY29hdEYwLCBmOTA6IGNsZWFyY29hdEY5MCwgcm91Z2huZXNzOiBjbGVhcmNvYXRSb3VnaG5lc3MsIG5vcm1hbFZpZXc6IHRyYW5zZm9ybWVkQ2xlYXJjb2F0Tm9ybWFsVmlldyB9ICkgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlLmFkZEFzc2lnbiggaXJyYWRpYW5jZS5tdWwoIEJSREZfTGFtYmVydCggeyBkaWZmdXNlQ29sb3I6IGRpZmZ1c2VDb2xvci5yZ2IgfSApICkgKTtcclxuXHJcblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhci5hZGRBc3NpZ24oIGlycmFkaWFuY2UubXVsKCBCUkRGX0dHWCggeyBsaWdodERpcmVjdGlvbiwgZjA6IHNwZWN1bGFyQ29sb3IsIGY5MDogMSwgcm91Z2huZXNzLCBpcmlkZXNjZW5jZTogdGhpcy5pcmlkZXNjZW5jZSwgZjogdGhpcy5pcmlkZXNjZW5jZUZyZXNuZWwsIFVTRV9JUklERVNDRU5DRTogdGhpcy5pcmlkZXNjZW5jZSwgVVNFX0FOSVNPVFJPUFk6IHRoaXMuYW5pc290cm9weSB9ICkgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciBpbXBsZW1lbnRpbmcgdGhlIGRpcmVjdCBsaWdodCB0ZXJtIGZvclxyXG5cdCAqIHJlY3QgYXJlYSBsaWdodCBub2Rlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dCAtIFRoZSBpbnB1dCBkYXRhLlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICovXHJcblx0ZGlyZWN0UmVjdEFyZWEoIHsgbGlnaHRDb2xvciwgbGlnaHRQb3NpdGlvbiwgaGFsZldpZHRoLCBoYWxmSGVpZ2h0LCByZWZsZWN0ZWRMaWdodCwgbHRjXzEsIGx0Y18yIH0gKSB7XHJcblxyXG5cdFx0Y29uc3QgcDAgPSBsaWdodFBvc2l0aW9uLmFkZCggaGFsZldpZHRoICkuc3ViKCBoYWxmSGVpZ2h0ICk7IC8vIGNvdW50ZXJjbG9ja3dpc2U7IGxpZ2h0IHNoaW5lcyBpbiBsb2NhbCBuZWcgeiBkaXJlY3Rpb25cclxuXHRcdGNvbnN0IHAxID0gbGlnaHRQb3NpdGlvbi5zdWIoIGhhbGZXaWR0aCApLnN1YiggaGFsZkhlaWdodCApO1xyXG5cdFx0Y29uc3QgcDIgPSBsaWdodFBvc2l0aW9uLnN1YiggaGFsZldpZHRoICkuYWRkKCBoYWxmSGVpZ2h0ICk7XHJcblx0XHRjb25zdCBwMyA9IGxpZ2h0UG9zaXRpb24uYWRkKCBoYWxmV2lkdGggKS5hZGQoIGhhbGZIZWlnaHQgKTtcclxuXHJcblx0XHRjb25zdCBOID0gdHJhbnNmb3JtZWROb3JtYWxWaWV3O1xyXG5cdFx0Y29uc3QgViA9IHBvc2l0aW9uVmlld0RpcmVjdGlvbjtcclxuXHRcdGNvbnN0IFAgPSBwb3NpdGlvblZpZXcudG9WYXIoKTtcclxuXHJcblx0XHRjb25zdCB1diA9IExUQ19VdiggeyBOLCBWLCByb3VnaG5lc3MgfSApO1xyXG5cclxuXHRcdGNvbnN0IHQxID0gbHRjXzEuc2FtcGxlKCB1diApLnRvVmFyKCk7XHJcblx0XHRjb25zdCB0MiA9IGx0Y18yLnNhbXBsZSggdXYgKS50b1ZhcigpO1xyXG5cclxuXHRcdGNvbnN0IG1JbnYgPSBtYXQzKFxyXG5cdFx0XHR2ZWMzKCB0MS54LCAwLCB0MS55ICksXHJcblx0XHRcdHZlYzMoIDAsIDEsIDAgKSxcclxuXHRcdFx0dmVjMyggdDEueiwgMCwgdDEudyApXHJcblx0XHQpLnRvVmFyKCk7XHJcblxyXG5cdFx0Ly8gTFRDIEZyZXNuZWwgQXBwcm94aW1hdGlvbiBieSBTdGVwaGVuIEhpbGxcclxuXHRcdC8vIGh0dHA6Ly9ibG9nLnNlbGZzaGFkb3cuY29tL3B1YmxpY2F0aW9ucy9zMjAxNi1hZHZhbmNlcy9zMjAxNl9sdGNfZnJlc25lbC5wZGZcclxuXHRcdGNvbnN0IGZyZXNuZWwgPSBzcGVjdWxhckNvbG9yLm11bCggdDIueCApLmFkZCggc3BlY3VsYXJDb2xvci5vbmVNaW51cygpLm11bCggdDIueSApICkudG9WYXIoKTtcclxuXHJcblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhci5hZGRBc3NpZ24oIGxpZ2h0Q29sb3IubXVsKCBmcmVzbmVsICkubXVsKCBMVENfRXZhbHVhdGUoIHsgTiwgViwgUCwgbUludiwgcDAsIHAxLCBwMiwgcDMgfSApICkgKTtcclxuXHJcblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlLmFkZEFzc2lnbiggbGlnaHRDb2xvci5tdWwoIGRpZmZ1c2VDb2xvciApLm11bCggTFRDX0V2YWx1YXRlKCB7IE4sIFYsIFAsIG1JbnY6IG1hdDMoIDEsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDEgKSwgcDAsIHAxLCBwMiwgcDMgfSApICkgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJbXBsZW1lbnRzIHRoZSBpbmRpcmVjdCBsaWdodGluZy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICovXHJcblx0aW5kaXJlY3QoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0dGhpcy5pbmRpcmVjdERpZmZ1c2UoIGJ1aWxkZXIgKTtcclxuXHRcdHRoaXMuaW5kaXJlY3RTcGVjdWxhciggYnVpbGRlciApO1xyXG5cdFx0dGhpcy5hbWJpZW50T2NjbHVzaW9uKCBidWlsZGVyICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW1wbGVtZW50cyB0aGUgaW5kaXJlY3QgZGlmZnVzZSB0ZXJtLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKi9cclxuXHRpbmRpcmVjdERpZmZ1c2UoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBpcnJhZGlhbmNlLCByZWZsZWN0ZWRMaWdodCB9ID0gYnVpbGRlci5jb250ZXh0O1xyXG5cclxuXHRcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZS5hZGRBc3NpZ24oIGlycmFkaWFuY2UubXVsKCBCUkRGX0xhbWJlcnQoIHsgZGlmZnVzZUNvbG9yIH0gKSApICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW1wbGVtZW50cyB0aGUgaW5kaXJlY3Qgc3BlY3VsYXIgdGVybS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICovXHJcblx0aW5kaXJlY3RTcGVjdWxhciggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCB7IHJhZGlhbmNlLCBpYmxJcnJhZGlhbmNlLCByZWZsZWN0ZWRMaWdodCB9ID0gYnVpbGRlci5jb250ZXh0O1xyXG5cclxuXHRcdGlmICggdGhpcy5zaGVlbiA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdHRoaXMuc2hlZW5TcGVjdWxhckluZGlyZWN0LmFkZEFzc2lnbiggaWJsSXJyYWRpYW5jZS5tdWwoXHJcblx0XHRcdFx0c2hlZW4sXHJcblx0XHRcdFx0SUJMU2hlZW5CUkRGKCB7XHJcblx0XHRcdFx0XHRub3JtYWw6IHRyYW5zZm9ybWVkTm9ybWFsVmlldyxcclxuXHRcdFx0XHRcdHZpZXdEaXI6IHBvc2l0aW9uVmlld0RpcmVjdGlvbixcclxuXHRcdFx0XHRcdHJvdWdobmVzczogc2hlZW5Sb3VnaG5lc3NcclxuXHRcdFx0XHR9IClcclxuXHRcdFx0KSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMuY2xlYXJjb2F0ID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0Y29uc3QgZG90TlZjYyA9IHRyYW5zZm9ybWVkQ2xlYXJjb2F0Tm9ybWFsVmlldy5kb3QoIHBvc2l0aW9uVmlld0RpcmVjdGlvbiApLmNsYW1wKCk7XHJcblxyXG5cdFx0XHRjb25zdCBjbGVhcmNvYXRFbnYgPSBFbnZpcm9ubWVudEJSREYoIHtcclxuXHRcdFx0XHRkb3ROVjogZG90TlZjYyxcclxuXHRcdFx0XHRzcGVjdWxhckNvbG9yOiBjbGVhcmNvYXRGMCxcclxuXHRcdFx0XHRzcGVjdWxhckY5MDogY2xlYXJjb2F0RjkwLFxyXG5cdFx0XHRcdHJvdWdobmVzczogY2xlYXJjb2F0Um91Z2huZXNzXHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHRcdHRoaXMuY2xlYXJjb2F0U3BlY3VsYXJJbmRpcmVjdC5hZGRBc3NpZ24oIHRoaXMuY2xlYXJjb2F0UmFkaWFuY2UubXVsKCBjbGVhcmNvYXRFbnYgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBCb3RoIGluZGlyZWN0IHNwZWN1bGFyIGFuZCBpbmRpcmVjdCBkaWZmdXNlIGxpZ2h0IGFjY3VtdWxhdGUgaGVyZVxyXG5cclxuXHRcdGNvbnN0IHNpbmdsZVNjYXR0ZXJpbmcgPSB2ZWMzKCkudG9WYXIoICdzaW5nbGVTY2F0dGVyaW5nJyApO1xyXG5cdFx0Y29uc3QgbXVsdGlTY2F0dGVyaW5nID0gdmVjMygpLnRvVmFyKCAnbXVsdGlTY2F0dGVyaW5nJyApO1xyXG5cdFx0Y29uc3QgY29zaW5lV2VpZ2h0ZWRJcnJhZGlhbmNlID0gaWJsSXJyYWRpYW5jZS5tdWwoIDEgLyBNYXRoLlBJICk7XHJcblxyXG5cdFx0dGhpcy5jb21wdXRlTXVsdGlzY2F0dGVyaW5nKCBzaW5nbGVTY2F0dGVyaW5nLCBtdWx0aVNjYXR0ZXJpbmcsIHNwZWN1bGFyRjkwICk7XHJcblxyXG5cdFx0Y29uc3QgdG90YWxTY2F0dGVyaW5nID0gc2luZ2xlU2NhdHRlcmluZy5hZGQoIG11bHRpU2NhdHRlcmluZyApO1xyXG5cclxuXHRcdGNvbnN0IGRpZmZ1c2UgPSBkaWZmdXNlQ29sb3IubXVsKCB0b3RhbFNjYXR0ZXJpbmcuci5tYXgoIHRvdGFsU2NhdHRlcmluZy5nICkubWF4KCB0b3RhbFNjYXR0ZXJpbmcuYiApLm9uZU1pbnVzKCkgKTtcclxuXHJcblx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyLmFkZEFzc2lnbiggcmFkaWFuY2UubXVsKCBzaW5nbGVTY2F0dGVyaW5nICkgKTtcclxuXHRcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIuYWRkQXNzaWduKCBtdWx0aVNjYXR0ZXJpbmcubXVsKCBjb3NpbmVXZWlnaHRlZElycmFkaWFuY2UgKSApO1xyXG5cclxuXHRcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZS5hZGRBc3NpZ24oIGRpZmZ1c2UubXVsKCBjb3NpbmVXZWlnaHRlZElycmFkaWFuY2UgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEltcGxlbWVudHMgdGhlIGFtYmllbnQgb2NjbHVzaW9uIHRlcm0uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqL1xyXG5cdGFtYmllbnRPY2NsdXNpb24oIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBhbWJpZW50T2NjbHVzaW9uLCByZWZsZWN0ZWRMaWdodCB9ID0gYnVpbGRlci5jb250ZXh0O1xyXG5cclxuXHRcdGNvbnN0IGRvdE5WID0gdHJhbnNmb3JtZWROb3JtYWxWaWV3LmRvdCggcG9zaXRpb25WaWV3RGlyZWN0aW9uICkuY2xhbXAoKTsgLy8gQCBUT0RPOiBNb3ZlIHRvIGNvcmUgZG90TlZcclxuXHJcblx0XHRjb25zdCBhb05WID0gZG90TlYuYWRkKCBhbWJpZW50T2NjbHVzaW9uICk7XHJcblx0XHRjb25zdCBhb0V4cCA9IHJvdWdobmVzcy5tdWwoIC0gMTYuMCApLm9uZU1pbnVzKCkubmVnYXRlKCkuZXhwMigpO1xyXG5cclxuXHRcdGNvbnN0IGFvTm9kZSA9IGFtYmllbnRPY2NsdXNpb24uc3ViKCBhb05WLnBvdyggYW9FeHAgKS5vbmVNaW51cygpICkuY2xhbXAoKTtcclxuXHJcblx0XHRpZiAoIHRoaXMuY2xlYXJjb2F0ID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0dGhpcy5jbGVhcmNvYXRTcGVjdWxhckluZGlyZWN0Lm11bEFzc2lnbiggYW1iaWVudE9jY2x1c2lvbiApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMuc2hlZW4gPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnNoZWVuU3BlY3VsYXJJbmRpcmVjdC5tdWxBc3NpZ24oIGFtYmllbnRPY2NsdXNpb24gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlLm11bEFzc2lnbiggYW1iaWVudE9jY2x1c2lvbiApO1xyXG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhci5tdWxBc3NpZ24oIGFvTm9kZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVzZWQgZm9yIGZpbmFsIGxpZ2h0aW5nIGFjY3VtdWxhdGlvbnMgZGVwZW5kaW5nIG9uIHRoZSByZXF1ZXN0ZWQgZmVhdHVyZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqL1xyXG5cdGZpbmlzaCggeyBjb250ZXh0IH0gKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBvdXRnb2luZ0xpZ2h0IH0gPSBjb250ZXh0O1xyXG5cclxuXHRcdGlmICggdGhpcy5jbGVhcmNvYXQgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBkb3ROVmNjID0gdHJhbnNmb3JtZWRDbGVhcmNvYXROb3JtYWxWaWV3LmRvdCggcG9zaXRpb25WaWV3RGlyZWN0aW9uICkuY2xhbXAoKTtcclxuXHJcblx0XHRcdGNvbnN0IEZjYyA9IEZfU2NobGljaygge1xyXG5cdFx0XHRcdGRvdFZIOiBkb3ROVmNjLFxyXG5cdFx0XHRcdGYwOiBjbGVhcmNvYXRGMCxcclxuXHRcdFx0XHRmOTA6IGNsZWFyY29hdEY5MFxyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRjb25zdCBjbGVhcmNvYXRMaWdodCA9IG91dGdvaW5nTGlnaHQubXVsKCBjbGVhcmNvYXQubXVsKCBGY2MgKS5vbmVNaW51cygpICkuYWRkKCB0aGlzLmNsZWFyY29hdFNwZWN1bGFyRGlyZWN0LmFkZCggdGhpcy5jbGVhcmNvYXRTcGVjdWxhckluZGlyZWN0ICkubXVsKCBjbGVhcmNvYXQgKSApO1xyXG5cclxuXHRcdFx0b3V0Z29pbmdMaWdodC5hc3NpZ24oIGNsZWFyY29hdExpZ2h0ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy5zaGVlbiA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdGNvbnN0IHNoZWVuRW5lcmd5Q29tcCA9IHNoZWVuLnIubWF4KCBzaGVlbi5nICkubWF4KCBzaGVlbi5iICkubXVsKCAwLjE1NyApLm9uZU1pbnVzKCk7XHJcblx0XHRcdGNvbnN0IHNoZWVuTGlnaHQgPSBvdXRnb2luZ0xpZ2h0Lm11bCggc2hlZW5FbmVyZ3lDb21wICkuYWRkKCB0aGlzLnNoZWVuU3BlY3VsYXJEaXJlY3QsIHRoaXMuc2hlZW5TcGVjdWxhckluZGlyZWN0ICk7XHJcblxyXG5cdFx0XHRvdXRnb2luZ0xpZ2h0LmFzc2lnbiggc2hlZW5MaWdodCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUGh5c2ljYWxMaWdodGluZ01vZGVsO1xyXG4iLCJpbXBvcnQgeyBGbiwgaW50LCBmbG9hdCwgdmVjMiwgdmVjMywgdmVjNCwgSWYgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcbmltcG9ydCB7IGNvcywgc2luLCBhYnMsIG1heCwgZXhwMiwgbG9nMiwgY2xhbXAsIGZyYWN0LCBtaXgsIGZsb29yLCBub3JtYWxpemUsIGNyb3NzIH0gZnJvbSAnLi4vbWF0aC9NYXRoTm9kZS5qcyc7XHJcbmltcG9ydCB7IG11bCB9IGZyb20gJy4uL21hdGgvT3BlcmF0b3JOb2RlLmpzJztcclxuaW1wb3J0IHsgc2VsZWN0IH0gZnJvbSAnLi4vbWF0aC9Db25kaXRpb25hbE5vZGUuanMnO1xyXG5pbXBvcnQgeyBMb29wLCBCcmVhayB9IGZyb20gJy4uL3V0aWxzL0xvb3BOb2RlLmpzJztcclxuXHJcbi8vIFRoZXNlIGRlZmluZXMgbXVzdCBtYXRjaCB3aXRoIFBNUkVNR2VuZXJhdG9yXHJcblxyXG5jb25zdCBjdWJlVVZfcjAgPSAvKkBfX1BVUkVfXyovIGZsb2F0KCAxLjAgKTtcclxuY29uc3QgY3ViZVVWX20wID0gLypAX19QVVJFX18qLyBmbG9hdCggLSAyLjAgKTtcclxuY29uc3QgY3ViZVVWX3IxID0gLypAX19QVVJFX18qLyBmbG9hdCggMC44ICk7XHJcbmNvbnN0IGN1YmVVVl9tMSA9IC8qQF9fUFVSRV9fKi8gZmxvYXQoIC0gMS4wICk7XHJcbmNvbnN0IGN1YmVVVl9yNCA9IC8qQF9fUFVSRV9fKi8gZmxvYXQoIDAuNCApO1xyXG5jb25zdCBjdWJlVVZfbTQgPSAvKkBfX1BVUkVfXyovIGZsb2F0KCAyLjAgKTtcclxuY29uc3QgY3ViZVVWX3I1ID0gLypAX19QVVJFX18qLyBmbG9hdCggMC4zMDUgKTtcclxuY29uc3QgY3ViZVVWX201ID0gLypAX19QVVJFX18qLyBmbG9hdCggMy4wICk7XHJcbmNvbnN0IGN1YmVVVl9yNiA9IC8qQF9fUFVSRV9fKi8gZmxvYXQoIDAuMjEgKTtcclxuY29uc3QgY3ViZVVWX202ID0gLypAX19QVVJFX18qLyBmbG9hdCggNC4wICk7XHJcblxyXG5jb25zdCBjdWJlVVZfbWluTWlwTGV2ZWwgPSAvKkBfX1BVUkVfXyovIGZsb2F0KCA0LjAgKTtcclxuY29uc3QgY3ViZVVWX21pblRpbGVTaXplID0gLypAX19QVVJFX18qLyBmbG9hdCggMTYuMCApO1xyXG5cclxuLy8gVGhlc2Ugc2hhZGVyIGZ1bmN0aW9ucyBjb252ZXJ0IGJldHdlZW4gdGhlIFVWIGNvb3JkaW5hdGVzIG9mIGEgc2luZ2xlIGZhY2Ugb2ZcclxuLy8gYSBjdWJlbWFwLCB0aGUgMC01IGludGVnZXIgaW5kZXggb2YgYSBjdWJlIGZhY2UsIGFuZCB0aGUgZGlyZWN0aW9uIHZlY3RvciBmb3JcclxuLy8gc2FtcGxpbmcgYSB0ZXh0dXJlQ3ViZSAobm90IGdlbmVyYWxseSBub3JtYWxpemVkICkuXHJcblxyXG5jb25zdCBnZXRGYWNlID0gLypAX19QVVJFX18qLyBGbiggKCBbIGRpcmVjdGlvbiBdICkgPT4ge1xyXG5cclxuXHRjb25zdCBhYnNEaXJlY3Rpb24gPSB2ZWMzKCBhYnMoIGRpcmVjdGlvbiApICkudG9WYXIoKTtcclxuXHRjb25zdCBmYWNlID0gZmxvYXQoIC0gMS4wICkudG9WYXIoKTtcclxuXHJcblx0SWYoIGFic0RpcmVjdGlvbi54LmdyZWF0ZXJUaGFuKCBhYnNEaXJlY3Rpb24ueiApLCAoKSA9PiB7XHJcblxyXG5cdFx0SWYoIGFic0RpcmVjdGlvbi54LmdyZWF0ZXJUaGFuKCBhYnNEaXJlY3Rpb24ueSApLCAoKSA9PiB7XHJcblxyXG5cdFx0XHRmYWNlLmFzc2lnbiggc2VsZWN0KCBkaXJlY3Rpb24ueC5ncmVhdGVyVGhhbiggMC4wICksIDAuMCwgMy4wICkgKTtcclxuXHJcblx0XHR9ICkuRWxzZSggKCkgPT4ge1xyXG5cclxuXHRcdFx0ZmFjZS5hc3NpZ24oIHNlbGVjdCggZGlyZWN0aW9uLnkuZ3JlYXRlclRoYW4oIDAuMCApLCAxLjAsIDQuMCApICk7XHJcblxyXG5cdFx0fSApO1xyXG5cclxuXHR9ICkuRWxzZSggKCkgPT4ge1xyXG5cclxuXHRcdElmKCBhYnNEaXJlY3Rpb24uei5ncmVhdGVyVGhhbiggYWJzRGlyZWN0aW9uLnkgKSwgKCkgPT4ge1xyXG5cclxuXHRcdFx0ZmFjZS5hc3NpZ24oIHNlbGVjdCggZGlyZWN0aW9uLnouZ3JlYXRlclRoYW4oIDAuMCApLCAyLjAsIDUuMCApICk7XHJcblxyXG5cdFx0fSApLkVsc2UoICgpID0+IHtcclxuXHJcblx0XHRcdGZhY2UuYXNzaWduKCBzZWxlY3QoIGRpcmVjdGlvbi55LmdyZWF0ZXJUaGFuKCAwLjAgKSwgMS4wLCA0LjAgKSApO1xyXG5cclxuXHRcdH0gKTtcclxuXHJcblx0fSApO1xyXG5cclxuXHRyZXR1cm4gZmFjZTtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnZ2V0RmFjZScsXHJcblx0dHlwZTogJ2Zsb2F0JyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ2RpcmVjdGlvbicsIHR5cGU6ICd2ZWMzJyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG4vLyBSSCBjb29yZGluYXRlIHN5c3RlbTsgUE1SRU0gZmFjZS1pbmRleGluZyBjb252ZW50aW9uXHJcbmNvbnN0IGdldFVWID0gLypAX19QVVJFX18qLyBGbiggKCBbIGRpcmVjdGlvbiwgZmFjZSBdICkgPT4ge1xyXG5cclxuXHRjb25zdCB1diA9IHZlYzIoKS50b1ZhcigpO1xyXG5cclxuXHRJZiggZmFjZS5lcXVhbCggMC4wICksICgpID0+IHtcclxuXHJcblx0XHR1di5hc3NpZ24oIHZlYzIoIGRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueSApLmRpdiggYWJzKCBkaXJlY3Rpb24ueCApICkgKTsgLy8gcG9zIHhcclxuXHJcblx0fSApLkVsc2VJZiggZmFjZS5lcXVhbCggMS4wICksICgpID0+IHtcclxuXHJcblx0XHR1di5hc3NpZ24oIHZlYzIoIGRpcmVjdGlvbi54Lm5lZ2F0ZSgpLCBkaXJlY3Rpb24uei5uZWdhdGUoKSApLmRpdiggYWJzKCBkaXJlY3Rpb24ueSApICkgKTsgLy8gcG9zIHlcclxuXHJcblx0fSApLkVsc2VJZiggZmFjZS5lcXVhbCggMi4wICksICgpID0+IHtcclxuXHJcblx0XHR1di5hc3NpZ24oIHZlYzIoIGRpcmVjdGlvbi54Lm5lZ2F0ZSgpLCBkaXJlY3Rpb24ueSApLmRpdiggYWJzKCBkaXJlY3Rpb24ueiApICkgKTsgLy8gcG9zIHpcclxuXHJcblx0fSApLkVsc2VJZiggZmFjZS5lcXVhbCggMy4wICksICgpID0+IHtcclxuXHJcblx0XHR1di5hc3NpZ24oIHZlYzIoIGRpcmVjdGlvbi56Lm5lZ2F0ZSgpLCBkaXJlY3Rpb24ueSApLmRpdiggYWJzKCBkaXJlY3Rpb24ueCApICkgKTsgLy8gbmVnIHhcclxuXHJcblx0fSApLkVsc2VJZiggZmFjZS5lcXVhbCggNC4wICksICgpID0+IHtcclxuXHJcblx0XHR1di5hc3NpZ24oIHZlYzIoIGRpcmVjdGlvbi54Lm5lZ2F0ZSgpLCBkaXJlY3Rpb24ueiApLmRpdiggYWJzKCBkaXJlY3Rpb24ueSApICkgKTsgLy8gbmVnIHlcclxuXHJcblx0fSApLkVsc2UoICgpID0+IHtcclxuXHJcblx0XHR1di5hc3NpZ24oIHZlYzIoIGRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueSApLmRpdiggYWJzKCBkaXJlY3Rpb24ueiApICkgKTsgLy8gbmVnIHpcclxuXHJcblx0fSApO1xyXG5cclxuXHRyZXR1cm4gbXVsKCAwLjUsIHV2LmFkZCggMS4wICkgKTtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnZ2V0VVYnLFxyXG5cdHR5cGU6ICd2ZWMyJyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ2RpcmVjdGlvbicsIHR5cGU6ICd2ZWMzJyB9LFxyXG5cdFx0eyBuYW1lOiAnZmFjZScsIHR5cGU6ICdmbG9hdCcgfVxyXG5cdF1cclxufSApO1xyXG5cclxuY29uc3Qgcm91Z2huZXNzVG9NaXAgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgcm91Z2huZXNzIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IG1pcCA9IGZsb2F0KCAwLjAgKS50b1ZhcigpO1xyXG5cclxuXHRJZiggcm91Z2huZXNzLmdyZWF0ZXJUaGFuRXF1YWwoIGN1YmVVVl9yMSApLCAoKSA9PiB7XHJcblxyXG5cdFx0bWlwLmFzc2lnbiggY3ViZVVWX3IwLnN1Yiggcm91Z2huZXNzICkubXVsKCBjdWJlVVZfbTEuc3ViKCBjdWJlVVZfbTAgKSApLmRpdiggY3ViZVVWX3IwLnN1YiggY3ViZVVWX3IxICkgKS5hZGQoIGN1YmVVVl9tMCApICk7XHJcblxyXG5cdH0gKS5FbHNlSWYoIHJvdWdobmVzcy5ncmVhdGVyVGhhbkVxdWFsKCBjdWJlVVZfcjQgKSwgKCkgPT4ge1xyXG5cclxuXHRcdG1pcC5hc3NpZ24oIGN1YmVVVl9yMS5zdWIoIHJvdWdobmVzcyApLm11bCggY3ViZVVWX200LnN1YiggY3ViZVVWX20xICkgKS5kaXYoIGN1YmVVVl9yMS5zdWIoIGN1YmVVVl9yNCApICkuYWRkKCBjdWJlVVZfbTEgKSApO1xyXG5cclxuXHR9ICkuRWxzZUlmKCByb3VnaG5lc3MuZ3JlYXRlclRoYW5FcXVhbCggY3ViZVVWX3I1ICksICgpID0+IHtcclxuXHJcblx0XHRtaXAuYXNzaWduKCBjdWJlVVZfcjQuc3ViKCByb3VnaG5lc3MgKS5tdWwoIGN1YmVVVl9tNS5zdWIoIGN1YmVVVl9tNCApICkuZGl2KCBjdWJlVVZfcjQuc3ViKCBjdWJlVVZfcjUgKSApLmFkZCggY3ViZVVWX200ICkgKTtcclxuXHJcblx0fSApLkVsc2VJZiggcm91Z2huZXNzLmdyZWF0ZXJUaGFuRXF1YWwoIGN1YmVVVl9yNiApLCAoKSA9PiB7XHJcblxyXG5cdFx0bWlwLmFzc2lnbiggY3ViZVVWX3I1LnN1Yiggcm91Z2huZXNzICkubXVsKCBjdWJlVVZfbTYuc3ViKCBjdWJlVVZfbTUgKSApLmRpdiggY3ViZVVWX3I1LnN1YiggY3ViZVVWX3I2ICkgKS5hZGQoIGN1YmVVVl9tNSApICk7XHJcblxyXG5cdH0gKS5FbHNlKCAoKSA9PiB7XHJcblxyXG5cdFx0bWlwLmFzc2lnbiggZmxvYXQoIC0gMi4wICkubXVsKCBsb2cyKCBtdWwoIDEuMTYsIHJvdWdobmVzcyApICkgKSApOyAvLyAxLjE2ID0gMS43OV4wLjI1XHJcblxyXG5cdH0gKTtcclxuXHJcblx0cmV0dXJuIG1pcDtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAncm91Z2huZXNzVG9NaXAnLFxyXG5cdHR5cGU6ICdmbG9hdCcsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICdyb3VnaG5lc3MnLCB0eXBlOiAnZmxvYXQnIH1cclxuXHRdXHJcbn0gKTtcclxuXHJcbi8vIFJIIGNvb3JkaW5hdGUgc3lzdGVtOyBQTVJFTSBmYWNlLWluZGV4aW5nIGNvbnZlbnRpb25cclxuZXhwb3J0IGNvbnN0IGdldERpcmVjdGlvbiA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyB1dl9pbW11dGFibGUsIGZhY2UgXSApID0+IHtcclxuXHJcblx0Y29uc3QgdXYgPSB1dl9pbW11dGFibGUudG9WYXIoKTtcclxuXHR1di5hc3NpZ24oIG11bCggMi4wLCB1diApLnN1YiggMS4wICkgKTtcclxuXHRjb25zdCBkaXJlY3Rpb24gPSB2ZWMzKCB1diwgMS4wICkudG9WYXIoKTtcclxuXHJcblx0SWYoIGZhY2UuZXF1YWwoIDAuMCApLCAoKSA9PiB7XHJcblxyXG5cdFx0ZGlyZWN0aW9uLmFzc2lnbiggZGlyZWN0aW9uLnp5eCApOyAvLyAoIDEsIHYsIHUgKSBwb3MgeFxyXG5cclxuXHR9ICkuRWxzZUlmKCBmYWNlLmVxdWFsKCAxLjAgKSwgKCkgPT4ge1xyXG5cclxuXHRcdGRpcmVjdGlvbi5hc3NpZ24oIGRpcmVjdGlvbi54enkgKTtcclxuXHRcdGRpcmVjdGlvbi54ei5tdWxBc3NpZ24oIC0gMS4wICk7IC8vICggLXUsIDEsIC12ICkgcG9zIHlcclxuXHJcblx0fSApLkVsc2VJZiggZmFjZS5lcXVhbCggMi4wICksICgpID0+IHtcclxuXHJcblx0XHRkaXJlY3Rpb24ueC5tdWxBc3NpZ24oIC0gMS4wICk7IC8vICggLXUsIHYsIDEgKSBwb3MgelxyXG5cclxuXHR9ICkuRWxzZUlmKCBmYWNlLmVxdWFsKCAzLjAgKSwgKCkgPT4ge1xyXG5cclxuXHRcdGRpcmVjdGlvbi5hc3NpZ24oIGRpcmVjdGlvbi56eXggKTtcclxuXHRcdGRpcmVjdGlvbi54ei5tdWxBc3NpZ24oIC0gMS4wICk7IC8vICggLTEsIHYsIC11ICkgbmVnIHhcclxuXHJcblx0fSApLkVsc2VJZiggZmFjZS5lcXVhbCggNC4wICksICgpID0+IHtcclxuXHJcblx0XHRkaXJlY3Rpb24uYXNzaWduKCBkaXJlY3Rpb24ueHp5ICk7XHJcblx0XHRkaXJlY3Rpb24ueHkubXVsQXNzaWduKCAtIDEuMCApOyAvLyAoIC11LCAtMSwgdiApIG5lZyB5XHJcblxyXG5cdH0gKS5FbHNlSWYoIGZhY2UuZXF1YWwoIDUuMCApLCAoKSA9PiB7XHJcblxyXG5cdFx0ZGlyZWN0aW9uLnoubXVsQXNzaWduKCAtIDEuMCApOyAvLyAoIHUsIHYsIC0xICkgbmVnIHpTXHJcblxyXG5cdH0gKTtcclxuXHJcblx0cmV0dXJuIGRpcmVjdGlvbjtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnZ2V0RGlyZWN0aW9uJyxcclxuXHR0eXBlOiAndmVjMycsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICd1dicsIHR5cGU6ICd2ZWMyJyB9LFxyXG5cdFx0eyBuYW1lOiAnZmFjZScsIHR5cGU6ICdmbG9hdCcgfVxyXG5cdF1cclxufSApO1xyXG5cclxuLy9cclxuXHJcbmV4cG9ydCBjb25zdCB0ZXh0dXJlQ3ViZVVWID0gLypAX19QVVJFX18qLyBGbiggKCBbIGVudk1hcCwgc2FtcGxlRGlyX2ltbXV0YWJsZSwgcm91Z2huZXNzX2ltbXV0YWJsZSwgQ1VCRVVWX1RFWEVMX1dJRFRILCBDVUJFVVZfVEVYRUxfSEVJR0hULCBDVUJFVVZfTUFYX01JUCBdICkgPT4ge1xyXG5cclxuXHRjb25zdCByb3VnaG5lc3MgPSBmbG9hdCggcm91Z2huZXNzX2ltbXV0YWJsZSApO1xyXG5cdGNvbnN0IHNhbXBsZURpciA9IHZlYzMoIHNhbXBsZURpcl9pbW11dGFibGUgKTtcclxuXHJcblx0Y29uc3QgbWlwID0gY2xhbXAoIHJvdWdobmVzc1RvTWlwKCByb3VnaG5lc3MgKSwgY3ViZVVWX20wLCBDVUJFVVZfTUFYX01JUCApO1xyXG5cdGNvbnN0IG1pcEYgPSBmcmFjdCggbWlwICk7XHJcblx0Y29uc3QgbWlwSW50ID0gZmxvb3IoIG1pcCApO1xyXG5cdGNvbnN0IGNvbG9yMCA9IHZlYzMoIGJpbGluZWFyQ3ViZVVWKCBlbnZNYXAsIHNhbXBsZURpciwgbWlwSW50LCBDVUJFVVZfVEVYRUxfV0lEVEgsIENVQkVVVl9URVhFTF9IRUlHSFQsIENVQkVVVl9NQVhfTUlQICkgKS50b1ZhcigpO1xyXG5cclxuXHRJZiggbWlwRi5ub3RFcXVhbCggMC4wICksICgpID0+IHtcclxuXHJcblx0XHRjb25zdCBjb2xvcjEgPSB2ZWMzKCBiaWxpbmVhckN1YmVVViggZW52TWFwLCBzYW1wbGVEaXIsIG1pcEludC5hZGQoIDEuMCApLCBDVUJFVVZfVEVYRUxfV0lEVEgsIENVQkVVVl9URVhFTF9IRUlHSFQsIENVQkVVVl9NQVhfTUlQICkgKS50b1ZhcigpO1xyXG5cclxuXHRcdGNvbG9yMC5hc3NpZ24oIG1peCggY29sb3IwLCBjb2xvcjEsIG1pcEYgKSApO1xyXG5cclxuXHR9ICk7XHJcblxyXG5cdHJldHVybiBjb2xvcjA7XHJcblxyXG59ICk7XHJcblxyXG5jb25zdCBiaWxpbmVhckN1YmVVViA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyBlbnZNYXAsIGRpcmVjdGlvbl9pbW11dGFibGUsIG1pcEludF9pbW11dGFibGUsIENVQkVVVl9URVhFTF9XSURUSCwgQ1VCRVVWX1RFWEVMX0hFSUdIVCwgQ1VCRVVWX01BWF9NSVAgXSApID0+IHtcclxuXHJcblx0Y29uc3QgbWlwSW50ID0gZmxvYXQoIG1pcEludF9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IGRpcmVjdGlvbiA9IHZlYzMoIGRpcmVjdGlvbl9pbW11dGFibGUgKTtcclxuXHRjb25zdCBmYWNlID0gZmxvYXQoIGdldEZhY2UoIGRpcmVjdGlvbiApICkudG9WYXIoKTtcclxuXHRjb25zdCBmaWx0ZXJJbnQgPSBmbG9hdCggbWF4KCBjdWJlVVZfbWluTWlwTGV2ZWwuc3ViKCBtaXBJbnQgKSwgMC4wICkgKS50b1ZhcigpO1xyXG5cdG1pcEludC5hc3NpZ24oIG1heCggbWlwSW50LCBjdWJlVVZfbWluTWlwTGV2ZWwgKSApO1xyXG5cdGNvbnN0IGZhY2VTaXplID0gZmxvYXQoIGV4cDIoIG1pcEludCApICkudG9WYXIoKTtcclxuXHRjb25zdCB1diA9IHZlYzIoIGdldFVWKCBkaXJlY3Rpb24sIGZhY2UgKS5tdWwoIGZhY2VTaXplLnN1YiggMi4wICkgKS5hZGQoIDEuMCApICkudG9WYXIoKTtcclxuXHJcblx0SWYoIGZhY2UuZ3JlYXRlclRoYW4oIDIuMCApLCAoKSA9PiB7XHJcblxyXG5cdFx0dXYueS5hZGRBc3NpZ24oIGZhY2VTaXplICk7XHJcblx0XHRmYWNlLnN1YkFzc2lnbiggMy4wICk7XHJcblxyXG5cdH0gKTtcclxuXHJcblx0dXYueC5hZGRBc3NpZ24oIGZhY2UubXVsKCBmYWNlU2l6ZSApICk7XHJcblx0dXYueC5hZGRBc3NpZ24oIGZpbHRlckludC5tdWwoIG11bCggMy4wLCBjdWJlVVZfbWluVGlsZVNpemUgKSApICk7XHJcblx0dXYueS5hZGRBc3NpZ24oIG11bCggNC4wLCBleHAyKCBDVUJFVVZfTUFYX01JUCApLnN1YiggZmFjZVNpemUgKSApICk7XHJcblx0dXYueC5tdWxBc3NpZ24oIENVQkVVVl9URVhFTF9XSURUSCApO1xyXG5cdHV2LnkubXVsQXNzaWduKCBDVUJFVVZfVEVYRUxfSEVJR0hUICk7XHJcblxyXG5cdHJldHVybiBlbnZNYXAuc2FtcGxlKCB1diApLmdyYWQoIHZlYzIoKSwgdmVjMigpICk7IC8vIGRpc2FibGUgYW5pc290cm9waWMgZmlsdGVyaW5nXHJcblxyXG59ICk7XHJcblxyXG5jb25zdCBnZXRTYW1wbGUgPSAvKkBfX1BVUkVfXyovIEZuKCAoIHsgZW52TWFwLCBtaXBJbnQsIG91dHB1dERpcmVjdGlvbiwgdGhldGEsIGF4aXMsIENVQkVVVl9URVhFTF9XSURUSCwgQ1VCRVVWX1RFWEVMX0hFSUdIVCwgQ1VCRVVWX01BWF9NSVAgfSApID0+IHtcclxuXHJcblx0Y29uc3QgY29zVGhldGEgPSBjb3MoIHRoZXRhICk7XHJcblxyXG5cdC8vIFJvZHJpZ3VlcycgYXhpcy1hbmdsZSByb3RhdGlvblxyXG5cdGNvbnN0IHNhbXBsZURpcmVjdGlvbiA9IG91dHB1dERpcmVjdGlvbi5tdWwoIGNvc1RoZXRhIClcclxuXHRcdC5hZGQoIGF4aXMuY3Jvc3MoIG91dHB1dERpcmVjdGlvbiApLm11bCggc2luKCB0aGV0YSApICkgKVxyXG5cdFx0LmFkZCggYXhpcy5tdWwoIGF4aXMuZG90KCBvdXRwdXREaXJlY3Rpb24gKS5tdWwoIGNvc1RoZXRhLm9uZU1pbnVzKCkgKSApICk7XHJcblxyXG5cdHJldHVybiBiaWxpbmVhckN1YmVVViggZW52TWFwLCBzYW1wbGVEaXJlY3Rpb24sIG1pcEludCwgQ1VCRVVWX1RFWEVMX1dJRFRILCBDVUJFVVZfVEVYRUxfSEVJR0hULCBDVUJFVVZfTUFYX01JUCApO1xyXG5cclxufSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IGJsdXIgPSAvKkBfX1BVUkVfXyovIEZuKCAoIHsgbiwgbGF0aXR1ZGluYWwsIHBvbGVBeGlzLCBvdXRwdXREaXJlY3Rpb24sIHdlaWdodHMsIHNhbXBsZXMsIGRUaGV0YSwgbWlwSW50LCBlbnZNYXAsIENVQkVVVl9URVhFTF9XSURUSCwgQ1VCRVVWX1RFWEVMX0hFSUdIVCwgQ1VCRVVWX01BWF9NSVAgfSApID0+IHtcclxuXHJcblx0Y29uc3QgYXhpcyA9IHZlYzMoIHNlbGVjdCggbGF0aXR1ZGluYWwsIHBvbGVBeGlzLCBjcm9zcyggcG9sZUF4aXMsIG91dHB1dERpcmVjdGlvbiApICkgKS50b1ZhcigpO1xyXG5cclxuXHRJZiggYXhpcy5lcXVhbCggdmVjMyggMC4wICkgKSwgKCkgPT4ge1xyXG5cclxuXHRcdGF4aXMuYXNzaWduKCB2ZWMzKCBvdXRwdXREaXJlY3Rpb24ueiwgMC4wLCBvdXRwdXREaXJlY3Rpb24ueC5uZWdhdGUoKSApICk7XHJcblxyXG5cdH0gKTtcclxuXHJcblx0YXhpcy5hc3NpZ24oIG5vcm1hbGl6ZSggYXhpcyApICk7XHJcblxyXG5cdGNvbnN0IGdsX0ZyYWdDb2xvciA9IHZlYzMoKS50b1ZhcigpO1xyXG5cdGdsX0ZyYWdDb2xvci5hZGRBc3NpZ24oIHdlaWdodHMuZWxlbWVudCggMCApLm11bCggZ2V0U2FtcGxlKCB7IHRoZXRhOiAwLjAsIGF4aXMsIG91dHB1dERpcmVjdGlvbiwgbWlwSW50LCBlbnZNYXAsIENVQkVVVl9URVhFTF9XSURUSCwgQ1VCRVVWX1RFWEVMX0hFSUdIVCwgQ1VCRVVWX01BWF9NSVAgfSApICkgKTtcclxuXHJcblx0TG9vcCggeyBzdGFydDogaW50KCAxICksIGVuZDogbiB9LCAoIHsgaSB9ICkgPT4ge1xyXG5cclxuXHRcdElmKCBpLmdyZWF0ZXJUaGFuRXF1YWwoIHNhbXBsZXMgKSwgKCkgPT4ge1xyXG5cclxuXHRcdFx0QnJlYWsoKTtcclxuXHJcblx0XHR9ICk7XHJcblxyXG5cdFx0Y29uc3QgdGhldGEgPSBmbG9hdCggZFRoZXRhLm11bCggZmxvYXQoIGkgKSApICkudG9WYXIoKTtcclxuXHRcdGdsX0ZyYWdDb2xvci5hZGRBc3NpZ24oIHdlaWdodHMuZWxlbWVudCggaSApLm11bCggZ2V0U2FtcGxlKCB7IHRoZXRhOiB0aGV0YS5tdWwoIC0gMS4wICksIGF4aXMsIG91dHB1dERpcmVjdGlvbiwgbWlwSW50LCBlbnZNYXAsIENVQkVVVl9URVhFTF9XSURUSCwgQ1VCRVVWX1RFWEVMX0hFSUdIVCwgQ1VCRVVWX01BWF9NSVAgfSApICkgKTtcclxuXHRcdGdsX0ZyYWdDb2xvci5hZGRBc3NpZ24oIHdlaWdodHMuZWxlbWVudCggaSApLm11bCggZ2V0U2FtcGxlKCB7IHRoZXRhLCBheGlzLCBvdXRwdXREaXJlY3Rpb24sIG1pcEludCwgZW52TWFwLCBDVUJFVVZfVEVYRUxfV0lEVEgsIENVQkVVVl9URVhFTF9IRUlHSFQsIENVQkVVVl9NQVhfTUlQIH0gKSApICk7XHJcblxyXG5cdH0gKTtcclxuXHJcblx0cmV0dXJuIHZlYzQoIGdsX0ZyYWdDb2xvciwgMSApO1xyXG5cclxufSApO1xyXG4iLCJpbXBvcnQgTm9kZU1hdGVyaWFsIGZyb20gJy4uLy4uLy4uL21hdGVyaWFscy9ub2Rlcy9Ob2RlTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyBnZXREaXJlY3Rpb24sIGJsdXIgfSBmcm9tICcuLi8uLi8uLi9ub2Rlcy9wbXJlbS9QTVJFTVV0aWxzLmpzJztcclxuaW1wb3J0IHsgZXF1aXJlY3RVViB9IGZyb20gJy4uLy4uLy4uL25vZGVzL3V0aWxzL0VxdWlyZWN0VVZOb2RlLmpzJztcclxuaW1wb3J0IHsgdW5pZm9ybSB9IGZyb20gJy4uLy4uLy4uL25vZGVzL2NvcmUvVW5pZm9ybU5vZGUuanMnO1xyXG5pbXBvcnQgeyB1bmlmb3JtQXJyYXkgfSBmcm9tICcuLi8uLi8uLi9ub2Rlcy9hY2Nlc3NvcnMvVW5pZm9ybUFycmF5Tm9kZS5qcyc7XHJcbmltcG9ydCB7IHRleHR1cmUgfSBmcm9tICcuLi8uLi8uLi9ub2Rlcy9hY2Nlc3NvcnMvVGV4dHVyZU5vZGUuanMnO1xyXG5pbXBvcnQgeyBjdWJlVGV4dHVyZSB9IGZyb20gJy4uLy4uLy4uL25vZGVzL2FjY2Vzc29ycy9DdWJlVGV4dHVyZU5vZGUuanMnO1xyXG5pbXBvcnQgeyBmbG9hdCwgdmVjMyB9IGZyb20gJy4uLy4uLy4uL25vZGVzL3RzbC9UU0xCYXNlLmpzJztcclxuaW1wb3J0IHsgdXYgfSBmcm9tICcuLi8uLi8uLi9ub2Rlcy9hY2Nlc3NvcnMvVVYuanMnO1xyXG5pbXBvcnQgeyBhdHRyaWJ1dGUgfSBmcm9tICcuLi8uLi8uLi9ub2Rlcy9jb3JlL0F0dHJpYnV0ZU5vZGUuanMnO1xyXG5cclxuaW1wb3J0IHsgT3J0aG9ncmFwaGljQ2FtZXJhIH0gZnJvbSAnLi4vLi4vLi4vY2FtZXJhcy9PcnRob2dyYXBoaWNDYW1lcmEuanMnO1xyXG5pbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uLy4uLy4uL21hdGgvQ29sb3IuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vLi4vLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuaW1wb3J0IHsgQnVmZmVyR2VvbWV0cnkgfSBmcm9tICcuLi8uLi8uLi9jb3JlL0J1ZmZlckdlb21ldHJ5LmpzJztcclxuaW1wb3J0IHsgQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5pbXBvcnQgeyBSZW5kZXJUYXJnZXQgfSBmcm9tICcuLi8uLi8uLi9jb3JlL1JlbmRlclRhcmdldC5qcyc7XHJcbmltcG9ydCB7IE1lc2ggfSBmcm9tICcuLi8uLi8uLi9vYmplY3RzL01lc2guanMnO1xyXG5pbXBvcnQgeyBQZXJzcGVjdGl2ZUNhbWVyYSB9IGZyb20gJy4uLy4uLy4uL2NhbWVyYXMvUGVyc3BlY3RpdmVDYW1lcmEuanMnO1xyXG5pbXBvcnQgeyBNZXNoQmFzaWNNYXRlcmlhbCB9IGZyb20gJy4uLy4uLy4uL21hdGVyaWFscy9NZXNoQmFzaWNNYXRlcmlhbC5qcyc7XHJcbmltcG9ydCB7IEJveEdlb21ldHJ5IH0gZnJvbSAnLi4vLi4vLi4vZ2VvbWV0cmllcy9Cb3hHZW9tZXRyeS5qcyc7XHJcbmltcG9ydCB7XHJcblx0Q3ViZVJlZmxlY3Rpb25NYXBwaW5nLFxyXG5cdEN1YmVSZWZyYWN0aW9uTWFwcGluZyxcclxuXHRDdWJlVVZSZWZsZWN0aW9uTWFwcGluZyxcclxuXHRMaW5lYXJGaWx0ZXIsXHJcblx0Tm9CbGVuZGluZyxcclxuXHRSR0JBRm9ybWF0LFxyXG5cdEhhbGZGbG9hdFR5cGUsXHJcblx0QmFja1NpZGUsXHJcblx0TGluZWFyU1JHQkNvbG9yU3BhY2VcclxufSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMuanMnO1xyXG5cclxuY29uc3QgTE9EX01JTiA9IDQ7XHJcblxyXG4vLyBUaGUgc3RhbmRhcmQgZGV2aWF0aW9ucyAocmFkaWFucykgYXNzb2NpYXRlZCB3aXRoIHRoZSBleHRyYSBtaXBzLiBUaGVzZSBhcmVcclxuLy8gY2hvc2VuIHRvIGFwcHJveGltYXRlIGEgVHJvd2JyaWRnZS1SZWl0eiBkaXN0cmlidXRpb24gZnVuY3Rpb24gdGltZXMgdGhlXHJcbi8vIGdlb21ldHJpYyBzaGFkb3dpbmcgZnVuY3Rpb24uIFRoZXNlIHNpZ21hIHZhbHVlcyBzcXVhcmVkIG11c3QgbWF0Y2ggdGhlXHJcbi8vIHZhcmlhbmNlICNkZWZpbmVzIGluIGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudC5nbHNsLmpzLlxyXG5jb25zdCBFWFRSQV9MT0RfU0lHTUEgPSBbIDAuMTI1LCAwLjIxNSwgMC4zNSwgMC40NDYsIDAuNTI2LCAwLjU4MiBdO1xyXG5cclxuLy8gVGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBibHVyIGZvciBsb29wLiBTbWFsbGVyIHNpZ21hcyB3aWxsIHVzZSBmZXdlclxyXG4vLyBzYW1wbGVzIGFuZCBleGl0IGVhcmx5LCBidXQgbm90IHJlY29tcGlsZSB0aGUgc2hhZGVyLlxyXG5jb25zdCBNQVhfU0FNUExFUyA9IDIwO1xyXG5cclxuY29uc3QgX2ZsYXRDYW1lcmEgPSAvKkBfX1BVUkVfXyovIG5ldyBPcnRob2dyYXBoaWNDYW1lcmEoIC0gMSwgMSwgMSwgLSAxLCAwLCAxICk7XHJcbmNvbnN0IF9jdWJlQ2FtZXJhID0gLypAX19QVVJFX18qLyBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIDkwLCAxICk7XHJcbmNvbnN0IF9jbGVhckNvbG9yID0gLypAX19QVVJFX18qLyBuZXcgQ29sb3IoKTtcclxubGV0IF9vbGRUYXJnZXQgPSBudWxsO1xyXG5sZXQgX29sZEFjdGl2ZUN1YmVGYWNlID0gMDtcclxubGV0IF9vbGRBY3RpdmVNaXBtYXBMZXZlbCA9IDA7XHJcblxyXG4vLyBHb2xkZW4gUmF0aW9cclxuY29uc3QgUEhJID0gKCAxICsgTWF0aC5zcXJ0KCA1ICkgKSAvIDI7XHJcbmNvbnN0IElOVl9QSEkgPSAxIC8gUEhJO1xyXG5cclxuLy8gVmVydGljZXMgb2YgYSBkb2RlY2FoZWRyb24gKGV4Y2VwdCB0aGUgb3Bwb3NpdGVzLCB3aGljaCByZXByZXNlbnQgdGhlXHJcbi8vIHNhbWUgYXhpcyksIHVzZWQgYXMgYXhpcyBkaXJlY3Rpb25zIGV2ZW5seSBzcHJlYWQgb24gYSBzcGhlcmUuXHJcbmNvbnN0IF9heGlzRGlyZWN0aW9ucyA9IFtcclxuXHQvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCAtIFBISSwgSU5WX1BISSwgMCApLFxyXG5cdC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoIFBISSwgSU5WX1BISSwgMCApLFxyXG5cdC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoIC0gSU5WX1BISSwgMCwgUEhJICksXHJcblx0LypAX19QVVJFX18qLyBuZXcgVmVjdG9yMyggSU5WX1BISSwgMCwgUEhJICksXHJcblx0LypAX19QVVJFX18qLyBuZXcgVmVjdG9yMyggMCwgUEhJLCAtIElOVl9QSEkgKSxcclxuXHQvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCAwLCBQSEksIElOVl9QSEkgKSxcclxuXHQvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCAtIDEsIDEsIC0gMSApLFxyXG5cdC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoIDEsIDEsIC0gMSApLFxyXG5cdC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoIC0gMSwgMSwgMSApLFxyXG5cdC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoIDEsIDEsIDEgKVxyXG5dO1xyXG5cclxuY29uc3QgX29yaWdpbiA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuXHJcbi8vIG1hcHMgYmx1ciBtYXRlcmlhbHMgdG8gdGhlaXIgdW5pZm9ybXMgZGljdGlvbmFyeVxyXG5cclxuY29uc3QgX3VuaWZvcm1zTWFwID0gbmV3IFdlYWtNYXAoKTtcclxuXHJcbi8vIFdlYkdQVSBGYWNlIGluZGljZXNcclxuY29uc3QgX2ZhY2VMaWIgPSBbXHJcblx0MywgMSwgNSxcclxuXHQwLCA0LCAyXHJcbl07XHJcblxyXG5jb25zdCBfZGlyZWN0aW9uID0gLypAX19QVVJFX18qLyBnZXREaXJlY3Rpb24oIHV2KCksIGF0dHJpYnV0ZSggJ2ZhY2VJbmRleCcgKSApLm5vcm1hbGl6ZSgpO1xyXG5jb25zdCBfb3V0cHV0RGlyZWN0aW9uID0gLypAX19QVVJFX18qLyB2ZWMzKCBfZGlyZWN0aW9uLngsIF9kaXJlY3Rpb24ueSwgX2RpcmVjdGlvbi56ICk7XHJcblxyXG4vKipcclxuICogVGhpcyBjbGFzcyBnZW5lcmF0ZXMgYSBQcmVmaWx0ZXJlZCwgTWlwbWFwcGVkIFJhZGlhbmNlIEVudmlyb25tZW50IE1hcFxyXG4gKiAoUE1SRU0pIGZyb20gYSBjdWJlTWFwIGVudmlyb25tZW50IHRleHR1cmUuIFRoaXMgYWxsb3dzIGRpZmZlcmVudCBsZXZlbHMgb2ZcclxuICogYmx1ciB0byBiZSBxdWlja2x5IGFjY2Vzc2VkIGJhc2VkIG9uIG1hdGVyaWFsIHJvdWdobmVzcy4gSXQgaXMgcGFja2VkIGludG8gYVxyXG4gKiBzcGVjaWFsIEN1YmVVViBmb3JtYXQgdGhhdCBhbGxvd3MgdXMgdG8gcGVyZm9ybSBjdXN0b20gaW50ZXJwb2xhdGlvbiBzbyB0aGF0XHJcbiAqIHdlIGNhbiBzdXBwb3J0IG5vbmxpbmVhciBmb3JtYXRzIHN1Y2ggYXMgUkdCRS4gVW5saWtlIGEgdHJhZGl0aW9uYWwgbWlwbWFwXHJcbiAqIGNoYWluLCBpdCBvbmx5IGdvZXMgZG93biB0byB0aGUgTE9EX01JTiBsZXZlbCAoYWJvdmUpLCBhbmQgdGhlbiBjcmVhdGVzIGV4dHJhXHJcbiAqIGV2ZW4gbW9yZSBmaWx0ZXJlZCAnbWlwcycgYXQgdGhlIHNhbWUgTE9EX01JTiByZXNvbHV0aW9uLCBhc3NvY2lhdGVkIHdpdGhcclxuICogaGlnaGVyIHJvdWdobmVzcyBsZXZlbHMuIEluIHRoaXMgd2F5IHdlIG1haW50YWluIHJlc29sdXRpb24gdG8gc21vb3RobHlcclxuICogaW50ZXJwb2xhdGUgZGlmZnVzZSBsaWdodGluZyB3aGlsZSBsaW1pdGluZyBzYW1wbGluZyBjb21wdXRhdGlvbi5cclxuICpcclxuICogUGFwZXI6IEZhc3QsIEFjY3VyYXRlIEltYWdlLUJhc2VkIExpZ2h0aW5nOlxyXG4gKiB7QGxpbmsgaHR0cHM6Ly9kcml2ZS5nb29nbGUuY29tL2ZpbGUvZC8xNXk4cl9VcEtsVTlTdlY0SUxiMEMzcUNQZWNTOHB2THovdmlld31cclxuKi9cclxuY2xhc3MgUE1SRU1HZW5lcmF0b3Ige1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IFBNUkVNIGdlbmVyYXRvci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCByZW5kZXJlciApIHtcclxuXHJcblx0XHR0aGlzLl9yZW5kZXJlciA9IHJlbmRlcmVyO1xyXG5cdFx0dGhpcy5fcGluZ1BvbmdSZW5kZXJUYXJnZXQgPSBudWxsO1xyXG5cclxuXHRcdHRoaXMuX2xvZE1heCA9IDA7XHJcblx0XHR0aGlzLl9jdWJlU2l6ZSA9IDA7XHJcblx0XHR0aGlzLl9sb2RQbGFuZXMgPSBbXTtcclxuXHRcdHRoaXMuX3NpemVMb2RzID0gW107XHJcblx0XHR0aGlzLl9zaWdtYXMgPSBbXTtcclxuXHRcdHRoaXMuX2xvZE1lc2hlcyA9IFtdO1xyXG5cclxuXHRcdHRoaXMuX2JsdXJNYXRlcmlhbCA9IG51bGw7XHJcblx0XHR0aGlzLl9jdWJlbWFwTWF0ZXJpYWwgPSBudWxsO1xyXG5cdFx0dGhpcy5fZXF1aXJlY3RNYXRlcmlhbCA9IG51bGw7XHJcblx0XHR0aGlzLl9iYWNrZ3JvdW5kQm94ID0gbnVsbDtcclxuXHJcblx0fVxyXG5cclxuXHRnZXQgX2hhc0luaXRpYWxpemVkKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9yZW5kZXJlci5oYXNJbml0aWFsaXplZCgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyBhIFBNUkVNIGZyb20gYSBzdXBwbGllZCBTY2VuZSwgd2hpY2ggY2FuIGJlIGZhc3RlciB0aGFuIHVzaW5nIGFuXHJcblx0ICogaW1hZ2UgaWYgbmV0d29ya2luZyBiYW5kd2lkdGggaXMgbG93LiBPcHRpb25hbCBzaWdtYSBzcGVjaWZpZXMgYSBibHVyIHJhZGl1c1xyXG5cdCAqIGluIHJhZGlhbnMgdG8gYmUgYXBwbGllZCB0byB0aGUgc2NlbmUgYmVmb3JlIFBNUkVNIGdlbmVyYXRpb24uIE9wdGlvbmFsIG5lYXJcclxuXHQgKiBhbmQgZmFyIHBsYW5lcyBlbnN1cmUgdGhlIHNjZW5lIGlzIHJlbmRlcmVkIGluIGl0cyBlbnRpcmV0eS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7U2NlbmV9IHNjZW5lIC0gVGhlIHNjZW5lIHRvIGJlIGNhcHR1cmVkLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbc2lnbWE9MF0gLSBUaGUgYmx1ciByYWRpdXMgaW4gcmFkaWFucy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW25lYXI9MC4xXSAtIFRoZSBuZWFyIHBsYW5lIGRpc3RhbmNlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZmFyPTEwMF0gLSBUaGUgZmFyIHBsYW5lIGRpc3RhbmNlLlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gLSBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5zaXplPTI1Nl0gLSBUaGUgdGV4dHVyZSBzaXplIG9mIHRoZSBQTVJFTS5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IFtvcHRpb25zLnJlbmRlclRhcmdldD1vcmlnaW5dIC0gVGhlIHBvc2l0aW9uIG9mIHRoZSBpbnRlcm5hbCBjdWJlIGNhbWVyYSB0aGF0IHJlbmRlcnMgdGhlIHNjZW5lLlxyXG5cdCAqIEBwYXJhbSB7P1JlbmRlclRhcmdldH0gW29wdGlvbnMucmVuZGVyVGFyZ2V0PW51bGxdIC0gVGhlIHJlbmRlciB0YXJnZXQgdG8gdXNlLlxyXG5cdCAqIEByZXR1cm4ge1JlbmRlclRhcmdldH0gVGhlIHJlc3VsdGluZyBQTVJFTS5cclxuXHQgKiBAc2VlIHtAbGluayBQTVJFTUdlbmVyYXRvciNmcm9tU2NlbmVBc3luY31cclxuXHQgKi9cclxuXHRmcm9tU2NlbmUoIHNjZW5lLCBzaWdtYSA9IDAsIG5lYXIgPSAwLjEsIGZhciA9IDEwMCwgb3B0aW9ucyA9IHt9ICkge1xyXG5cclxuXHRcdGNvbnN0IHtcclxuXHRcdFx0c2l6ZSA9IDI1NixcclxuXHRcdFx0cG9zaXRpb24gPSBfb3JpZ2luLFxyXG5cdFx0XHRyZW5kZXJUYXJnZXQgPSBudWxsLFxyXG5cdFx0fSA9IG9wdGlvbnM7XHJcblxyXG5cdFx0dGhpcy5fc2V0U2l6ZSggc2l6ZSApO1xyXG5cclxuXHRcdGlmICggdGhpcy5faGFzSW5pdGlhbGl6ZWQgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUE1SRU1HZW5lcmF0b3I6IC5mcm9tU2NlbmUoKSBjYWxsZWQgYmVmb3JlIHRoZSBiYWNrZW5kIGlzIGluaXRpYWxpemVkLiBUcnkgdXNpbmcgLmZyb21TY2VuZUFzeW5jKCkgaW5zdGVhZC4nICk7XHJcblxyXG5cdFx0XHRjb25zdCBjdWJlVVZSZW5kZXJUYXJnZXQgPSByZW5kZXJUYXJnZXQgfHwgdGhpcy5fYWxsb2NhdGVUYXJnZXRzKCk7XHJcblxyXG5cdFx0XHRvcHRpb25zLnJlbmRlclRhcmdldCA9IGN1YmVVVlJlbmRlclRhcmdldDtcclxuXHJcblx0XHRcdHRoaXMuZnJvbVNjZW5lQXN5bmMoIHNjZW5lLCBzaWdtYSwgbmVhciwgZmFyLCBvcHRpb25zICk7XHJcblxyXG5cdFx0XHRyZXR1cm4gY3ViZVVWUmVuZGVyVGFyZ2V0O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRfb2xkVGFyZ2V0ID0gdGhpcy5fcmVuZGVyZXIuZ2V0UmVuZGVyVGFyZ2V0KCk7XHJcblx0XHRfb2xkQWN0aXZlQ3ViZUZhY2UgPSB0aGlzLl9yZW5kZXJlci5nZXRBY3RpdmVDdWJlRmFjZSgpO1xyXG5cdFx0X29sZEFjdGl2ZU1pcG1hcExldmVsID0gdGhpcy5fcmVuZGVyZXIuZ2V0QWN0aXZlTWlwbWFwTGV2ZWwoKTtcclxuXHJcblx0XHRjb25zdCBjdWJlVVZSZW5kZXJUYXJnZXQgPSByZW5kZXJUYXJnZXQgfHwgdGhpcy5fYWxsb2NhdGVUYXJnZXRzKCk7XHJcblx0XHRjdWJlVVZSZW5kZXJUYXJnZXQuZGVwdGhCdWZmZXIgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMuX3NjZW5lVG9DdWJlVVYoIHNjZW5lLCBuZWFyLCBmYXIsIGN1YmVVVlJlbmRlclRhcmdldCwgcG9zaXRpb24gKTtcclxuXHJcblx0XHRpZiAoIHNpZ21hID4gMCApIHtcclxuXHJcblx0XHRcdHRoaXMuX2JsdXIoIGN1YmVVVlJlbmRlclRhcmdldCwgMCwgMCwgc2lnbWEgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5fYXBwbHlQTVJFTSggY3ViZVVWUmVuZGVyVGFyZ2V0ICk7XHJcblxyXG5cdFx0dGhpcy5fY2xlYW51cCggY3ViZVVWUmVuZGVyVGFyZ2V0ICk7XHJcblxyXG5cdFx0cmV0dXJuIGN1YmVVVlJlbmRlclRhcmdldDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZW5lcmF0ZXMgYSBQTVJFTSBmcm9tIGEgc3VwcGxpZWQgU2NlbmUsIHdoaWNoIGNhbiBiZSBmYXN0ZXIgdGhhbiB1c2luZyBhblxyXG5cdCAqIGltYWdlIGlmIG5ldHdvcmtpbmcgYmFuZHdpZHRoIGlzIGxvdy4gT3B0aW9uYWwgc2lnbWEgc3BlY2lmaWVzIGEgYmx1ciByYWRpdXNcclxuXHQgKiBpbiByYWRpYW5zIHRvIGJlIGFwcGxpZWQgdG8gdGhlIHNjZW5lIGJlZm9yZSBQTVJFTSBnZW5lcmF0aW9uLiBPcHRpb25hbCBuZWFyXHJcblx0ICogYW5kIGZhciBwbGFuZXMgZW5zdXJlIHRoZSBzY2VuZSBpcyByZW5kZXJlZCBpbiBpdHMgZW50aXJldHkgKHRoZSBjdWJlQ2FtZXJhXHJcblx0ICogaXMgcGxhY2VkIGF0IHRoZSBvcmlnaW4pLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTY2VuZX0gc2NlbmUgLSBUaGUgc2NlbmUgdG8gYmUgY2FwdHVyZWQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtzaWdtYT0wXSAtIFRoZSBibHVyIHJhZGl1cyBpbiByYWRpYW5zLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbmVhcj0wLjFdIC0gVGhlIG5lYXIgcGxhbmUgZGlzdGFuY2UuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtmYXI9MTAwXSAtIFRoZSBmYXIgcGxhbmUgZGlzdGFuY2UuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSAtIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLnNpemU9MjU2XSAtIFRoZSB0ZXh0dXJlIHNpemUgb2YgdGhlIFBNUkVNLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gW29wdGlvbnMucG9zaXRpb249b3JpZ2luXSAtIFRoZSBwb3NpdGlvbiBvZiB0aGUgaW50ZXJuYWwgY3ViZSBjYW1lcmEgdGhhdCByZW5kZXJzIHRoZSBzY2VuZS5cclxuXHQgKiBAcGFyYW0gez9SZW5kZXJUYXJnZXR9IFtvcHRpb25zLnJlbmRlclRhcmdldD1udWxsXSAtIFRoZSByZW5kZXIgdGFyZ2V0IHRvIHVzZS5cclxuXHQgKiBAcmV0dXJuIHtQcm9taXNlPFJlbmRlclRhcmdldD59IEEgUHJvbWlzZSB0aGF0IHJlc29sdmUgd2l0aCB0aGUgUE1SRU0gd2hlbiB0aGUgZ2VuZXJhdGlvbiBoYXMgYmVlbiBmaW5pc2hlZC5cclxuXHQgKiBAc2VlIHtAbGluayBQTVJFTUdlbmVyYXRvciNmcm9tU2NlbmV9XHJcblx0ICovXHJcblx0YXN5bmMgZnJvbVNjZW5lQXN5bmMoIHNjZW5lLCBzaWdtYSA9IDAsIG5lYXIgPSAwLjEsIGZhciA9IDEwMCwgb3B0aW9ucyA9IHt9ICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5faGFzSW5pdGlhbGl6ZWQgPT09IGZhbHNlICkgYXdhaXQgdGhpcy5fcmVuZGVyZXIuaW5pdCgpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmZyb21TY2VuZSggc2NlbmUsIHNpZ21hLCBuZWFyLCBmYXIsIG9wdGlvbnMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZW5lcmF0ZXMgYSBQTVJFTSBmcm9tIGFuIGVxdWlyZWN0YW5ndWxhciB0ZXh0dXJlLCB3aGljaCBjYW4gYmUgZWl0aGVyIExEUlxyXG5cdCAqIG9yIEhEUi4gVGhlIGlkZWFsIGlucHV0IGltYWdlIHNpemUgaXMgMWsgKDEwMjQgeCA1MTIpLFxyXG5cdCAqIGFzIHRoaXMgbWF0Y2hlcyBiZXN0IHdpdGggdGhlIDI1NiB4IDI1NiBjdWJlbWFwIG91dHB1dC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gZXF1aXJlY3Rhbmd1bGFyIC0gVGhlIGVxdWlyZWN0YW5ndWxhciB0ZXh0dXJlIHRvIGJlIGNvbnZlcnRlZC5cclxuXHQgKiBAcGFyYW0gez9SZW5kZXJUYXJnZXR9IFtyZW5kZXJUYXJnZXQ9bnVsbF0gLSBUaGUgcmVuZGVyIHRhcmdldCB0byB1c2UuXHJcblx0ICogQHJldHVybiB7UmVuZGVyVGFyZ2V0fSBUaGUgcmVzdWx0aW5nIFBNUkVNLlxyXG5cdCAqIEBzZWUge0BsaW5rIFBNUkVNR2VuZXJhdG9yI2Zyb21FcXVpcmVjdGFuZ3VsYXJBc3luY31cclxuXHQgKi9cclxuXHRmcm9tRXF1aXJlY3Rhbmd1bGFyKCBlcXVpcmVjdGFuZ3VsYXIsIHJlbmRlclRhcmdldCA9IG51bGwgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9oYXNJbml0aWFsaXplZCA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5QTVJFTUdlbmVyYXRvcjogLmZyb21FcXVpcmVjdGFuZ3VsYXIoKSBjYWxsZWQgYmVmb3JlIHRoZSBiYWNrZW5kIGlzIGluaXRpYWxpemVkLiBUcnkgdXNpbmcgLmZyb21FcXVpcmVjdGFuZ3VsYXJBc3luYygpIGluc3RlYWQuJyApO1xyXG5cclxuXHRcdFx0dGhpcy5fc2V0U2l6ZUZyb21UZXh0dXJlKCBlcXVpcmVjdGFuZ3VsYXIgKTtcclxuXHJcblx0XHRcdGNvbnN0IGN1YmVVVlJlbmRlclRhcmdldCA9IHJlbmRlclRhcmdldCB8fCB0aGlzLl9hbGxvY2F0ZVRhcmdldHMoKTtcclxuXHJcblx0XHRcdHRoaXMuZnJvbUVxdWlyZWN0YW5ndWxhckFzeW5jKCBlcXVpcmVjdGFuZ3VsYXIsIGN1YmVVVlJlbmRlclRhcmdldCApO1xyXG5cclxuXHRcdFx0cmV0dXJuIGN1YmVVVlJlbmRlclRhcmdldDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX2Zyb21UZXh0dXJlKCBlcXVpcmVjdGFuZ3VsYXIsIHJlbmRlclRhcmdldCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyBhIFBNUkVNIGZyb20gYW4gZXF1aXJlY3Rhbmd1bGFyIHRleHR1cmUsIHdoaWNoIGNhbiBiZSBlaXRoZXIgTERSXHJcblx0ICogb3IgSERSLiBUaGUgaWRlYWwgaW5wdXQgaW1hZ2Ugc2l6ZSBpcyAxayAoMTAyNCB4IDUxMiksXHJcblx0ICogYXMgdGhpcyBtYXRjaGVzIGJlc3Qgd2l0aCB0aGUgMjU2IHggMjU2IGN1YmVtYXAgb3V0cHV0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSBlcXVpcmVjdGFuZ3VsYXIgLSBUaGUgZXF1aXJlY3Rhbmd1bGFyIHRleHR1cmUgdG8gYmUgY29udmVydGVkLlxyXG5cdCAqIEBwYXJhbSB7P1JlbmRlclRhcmdldH0gW3JlbmRlclRhcmdldD1udWxsXSAtIFRoZSByZW5kZXIgdGFyZ2V0IHRvIHVzZS5cclxuXHQgKiBAcmV0dXJuIHtQcm9taXNlPFJlbmRlclRhcmdldD59IFRoZSByZXN1bHRpbmcgUE1SRU0uXHJcblx0ICogQHNlZSB7QGxpbmsgUE1SRU1HZW5lcmF0b3IjZnJvbUVxdWlyZWN0YW5ndWxhcn1cclxuXHQgKi9cclxuXHRhc3luYyBmcm9tRXF1aXJlY3Rhbmd1bGFyQXN5bmMoIGVxdWlyZWN0YW5ndWxhciwgcmVuZGVyVGFyZ2V0ID0gbnVsbCApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuX2hhc0luaXRpYWxpemVkID09PSBmYWxzZSApIGF3YWl0IHRoaXMuX3JlbmRlcmVyLmluaXQoKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fZnJvbVRleHR1cmUoIGVxdWlyZWN0YW5ndWxhciwgcmVuZGVyVGFyZ2V0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2VuZXJhdGVzIGEgUE1SRU0gZnJvbSBhbiBjdWJlbWFwIHRleHR1cmUsIHdoaWNoIGNhbiBiZSBlaXRoZXIgTERSXHJcblx0ICogb3IgSERSLiBUaGUgaWRlYWwgaW5wdXQgY3ViZSBzaXplIGlzIDI1NiB4IDI1NixcclxuXHQgKiBhcyB0aGlzIG1hdGNoZXMgYmVzdCB3aXRoIHRoZSAyNTYgeCAyNTYgY3ViZW1hcCBvdXRwdXQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IGN1YmVtYXAgLSBUaGUgY3ViZW1hcCB0ZXh0dXJlIHRvIGJlIGNvbnZlcnRlZC5cclxuXHQgKiBAcGFyYW0gez9SZW5kZXJUYXJnZXR9IFtyZW5kZXJUYXJnZXQ9bnVsbF0gLSBUaGUgcmVuZGVyIHRhcmdldCB0byB1c2UuXHJcblx0ICogQHJldHVybiB7UmVuZGVyVGFyZ2V0fSBUaGUgcmVzdWx0aW5nIFBNUkVNLlxyXG5cdCAqIEBzZWUge0BsaW5rIFBNUkVNR2VuZXJhdG9yI2Zyb21DdWJlbWFwQXN5bmN9XHJcblx0ICovXHJcblx0ZnJvbUN1YmVtYXAoIGN1YmVtYXAsIHJlbmRlclRhcmdldCA9IG51bGwgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9oYXNJbml0aWFsaXplZCA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5QTVJFTUdlbmVyYXRvcjogLmZyb21DdWJlbWFwKCkgY2FsbGVkIGJlZm9yZSB0aGUgYmFja2VuZCBpcyBpbml0aWFsaXplZC4gVHJ5IHVzaW5nIC5mcm9tQ3ViZW1hcEFzeW5jKCkgaW5zdGVhZC4nICk7XHJcblxyXG5cdFx0XHR0aGlzLl9zZXRTaXplRnJvbVRleHR1cmUoIGN1YmVtYXAgKTtcclxuXHJcblx0XHRcdGNvbnN0IGN1YmVVVlJlbmRlclRhcmdldCA9IHJlbmRlclRhcmdldCB8fCB0aGlzLl9hbGxvY2F0ZVRhcmdldHMoKTtcclxuXHJcblx0XHRcdHRoaXMuZnJvbUN1YmVtYXBBc3luYyggY3ViZW1hcCwgcmVuZGVyVGFyZ2V0ICk7XHJcblxyXG5cdFx0XHRyZXR1cm4gY3ViZVVWUmVuZGVyVGFyZ2V0O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fZnJvbVRleHR1cmUoIGN1YmVtYXAsIHJlbmRlclRhcmdldCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyBhIFBNUkVNIGZyb20gYW4gY3ViZW1hcCB0ZXh0dXJlLCB3aGljaCBjYW4gYmUgZWl0aGVyIExEUlxyXG5cdCAqIG9yIEhEUi4gVGhlIGlkZWFsIGlucHV0IGN1YmUgc2l6ZSBpcyAyNTYgeCAyNTYsXHJcblx0ICogd2l0aCB0aGUgMjU2IHggMjU2IGN1YmVtYXAgb3V0cHV0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSBjdWJlbWFwIC0gVGhlIGN1YmVtYXAgdGV4dHVyZSB0byBiZSBjb252ZXJ0ZWQuXHJcblx0ICogQHBhcmFtIHs/UmVuZGVyVGFyZ2V0fSBbcmVuZGVyVGFyZ2V0PW51bGxdIC0gVGhlIHJlbmRlciB0YXJnZXQgdG8gdXNlLlxyXG5cdCAqIEByZXR1cm4ge1Byb21pc2U8UmVuZGVyVGFyZ2V0Pn0gVGhlIHJlc3VsdGluZyBQTVJFTS5cclxuXHQgKiBAc2VlIHtAbGluayBQTVJFTUdlbmVyYXRvciNmcm9tQ3ViZW1hcH1cclxuXHQgKi9cclxuXHRhc3luYyBmcm9tQ3ViZW1hcEFzeW5jKCBjdWJlbWFwLCByZW5kZXJUYXJnZXQgPSBudWxsICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5faGFzSW5pdGlhbGl6ZWQgPT09IGZhbHNlICkgYXdhaXQgdGhpcy5fcmVuZGVyZXIuaW5pdCgpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9mcm9tVGV4dHVyZSggY3ViZW1hcCwgcmVuZGVyVGFyZ2V0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUHJlLWNvbXBpbGVzIHRoZSBjdWJlbWFwIHNoYWRlci4gWW91IGNhbiBnZXQgZmFzdGVyIHN0YXJ0LXVwIGJ5IGludm9raW5nIHRoaXMgbWV0aG9kIGR1cmluZ1xyXG5cdCAqIHlvdXIgdGV4dHVyZSdzIG5ldHdvcmsgZmV0Y2ggZm9yIGluY3JlYXNlZCBjb25jdXJyZW5jeS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfVxyXG5cdCAqL1xyXG5cdGFzeW5jIGNvbXBpbGVDdWJlbWFwU2hhZGVyKCkge1xyXG5cclxuXHRcdGlmICggdGhpcy5fY3ViZW1hcE1hdGVyaWFsID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5fY3ViZW1hcE1hdGVyaWFsID0gX2dldEN1YmVtYXBNYXRlcmlhbCgpO1xyXG5cdFx0XHRhd2FpdCB0aGlzLl9jb21waWxlTWF0ZXJpYWwoIHRoaXMuX2N1YmVtYXBNYXRlcmlhbCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQcmUtY29tcGlsZXMgdGhlIGVxdWlyZWN0YW5ndWxhciBzaGFkZXIuIFlvdSBjYW4gZ2V0IGZhc3RlciBzdGFydC11cCBieSBpbnZva2luZyB0aGlzIG1ldGhvZCBkdXJpbmdcclxuXHQgKiB5b3VyIHRleHR1cmUncyBuZXR3b3JrIGZldGNoIGZvciBpbmNyZWFzZWQgY29uY3VycmVuY3kuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX1cclxuXHQgKi9cclxuXHRhc3luYyBjb21waWxlRXF1aXJlY3Rhbmd1bGFyU2hhZGVyKCkge1xyXG5cclxuXHRcdGlmICggdGhpcy5fZXF1aXJlY3RNYXRlcmlhbCA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuX2VxdWlyZWN0TWF0ZXJpYWwgPSBfZ2V0RXF1aXJlY3RNYXRlcmlhbCgpO1xyXG5cdFx0XHRhd2FpdCB0aGlzLl9jb21waWxlTWF0ZXJpYWwoIHRoaXMuX2VxdWlyZWN0TWF0ZXJpYWwgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGlzcG9zZXMgb2YgdGhlIFBNUkVNR2VuZXJhdG9yJ3MgaW50ZXJuYWwgbWVtb3J5LiBOb3RlIHRoYXQgUE1SRU1HZW5lcmF0b3IgaXMgYSBzdGF0aWMgY2xhc3MsXHJcblx0ICogc28geW91IHNob3VsZCBub3QgbmVlZCBtb3JlIHRoYW4gb25lIFBNUkVNR2VuZXJhdG9yIG9iamVjdC4gSWYgeW91IGRvLCBjYWxsaW5nIGRpc3Bvc2UoKSBvblxyXG5cdCAqIG9uZSBvZiB0aGVtIHdpbGwgY2F1c2UgYW55IG90aGVycyB0byBhbHNvIGJlY29tZSB1bnVzYWJsZS5cclxuXHQgKi9cclxuXHRkaXNwb3NlKCkge1xyXG5cclxuXHRcdHRoaXMuX2Rpc3Bvc2UoKTtcclxuXHJcblx0XHRpZiAoIHRoaXMuX2N1YmVtYXBNYXRlcmlhbCAhPT0gbnVsbCApIHRoaXMuX2N1YmVtYXBNYXRlcmlhbC5kaXNwb3NlKCk7XHJcblx0XHRpZiAoIHRoaXMuX2VxdWlyZWN0TWF0ZXJpYWwgIT09IG51bGwgKSB0aGlzLl9lcXVpcmVjdE1hdGVyaWFsLmRpc3Bvc2UoKTtcclxuXHRcdGlmICggdGhpcy5fYmFja2dyb3VuZEJveCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuX2JhY2tncm91bmRCb3guZ2VvbWV0cnkuZGlzcG9zZSgpO1xyXG5cdFx0XHR0aGlzLl9iYWNrZ3JvdW5kQm94Lm1hdGVyaWFsLmRpc3Bvc2UoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gcHJpdmF0ZSBpbnRlcmZhY2VcclxuXHJcblx0X3NldFNpemVGcm9tVGV4dHVyZSggdGV4dHVyZSApIHtcclxuXHJcblx0XHRpZiAoIHRleHR1cmUubWFwcGluZyA9PT0gQ3ViZVJlZmxlY3Rpb25NYXBwaW5nIHx8IHRleHR1cmUubWFwcGluZyA9PT0gQ3ViZVJlZnJhY3Rpb25NYXBwaW5nICkge1xyXG5cclxuXHRcdFx0dGhpcy5fc2V0U2l6ZSggdGV4dHVyZS5pbWFnZS5sZW5ndGggPT09IDAgPyAxNiA6ICggdGV4dHVyZS5pbWFnZVsgMCBdLndpZHRoIHx8IHRleHR1cmUuaW1hZ2VbIDAgXS5pbWFnZS53aWR0aCApICk7XHJcblxyXG5cdFx0fSBlbHNlIHsgLy8gRXF1aXJlY3Rhbmd1bGFyXHJcblxyXG5cdFx0XHR0aGlzLl9zZXRTaXplKCB0ZXh0dXJlLmltYWdlLndpZHRoIC8gNCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRfc2V0U2l6ZSggY3ViZVNpemUgKSB7XHJcblxyXG5cdFx0dGhpcy5fbG9kTWF4ID0gTWF0aC5mbG9vciggTWF0aC5sb2cyKCBjdWJlU2l6ZSApICk7XHJcblx0XHR0aGlzLl9jdWJlU2l6ZSA9IE1hdGgucG93KCAyLCB0aGlzLl9sb2RNYXggKTtcclxuXHJcblx0fVxyXG5cclxuXHRfZGlzcG9zZSgpIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuX2JsdXJNYXRlcmlhbCAhPT0gbnVsbCApIHRoaXMuX2JsdXJNYXRlcmlhbC5kaXNwb3NlKCk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9waW5nUG9uZ1JlbmRlclRhcmdldCAhPT0gbnVsbCApIHRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0LmRpc3Bvc2UoKTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB0aGlzLl9sb2RQbGFuZXMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0dGhpcy5fbG9kUGxhbmVzWyBpIF0uZGlzcG9zZSgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRfY2xlYW51cCggb3V0cHV0VGFyZ2V0ICkge1xyXG5cclxuXHRcdHRoaXMuX3JlbmRlcmVyLnNldFJlbmRlclRhcmdldCggX29sZFRhcmdldCwgX29sZEFjdGl2ZUN1YmVGYWNlLCBfb2xkQWN0aXZlTWlwbWFwTGV2ZWwgKTtcclxuXHRcdG91dHB1dFRhcmdldC5zY2lzc29yVGVzdCA9IGZhbHNlO1xyXG5cdFx0X3NldFZpZXdwb3J0KCBvdXRwdXRUYXJnZXQsIDAsIDAsIG91dHB1dFRhcmdldC53aWR0aCwgb3V0cHV0VGFyZ2V0LmhlaWdodCApO1xyXG5cclxuXHR9XHJcblxyXG5cdF9mcm9tVGV4dHVyZSggdGV4dHVyZSwgcmVuZGVyVGFyZ2V0ICkge1xyXG5cclxuXHRcdHRoaXMuX3NldFNpemVGcm9tVGV4dHVyZSggdGV4dHVyZSApO1xyXG5cclxuXHRcdF9vbGRUYXJnZXQgPSB0aGlzLl9yZW5kZXJlci5nZXRSZW5kZXJUYXJnZXQoKTtcclxuXHRcdF9vbGRBY3RpdmVDdWJlRmFjZSA9IHRoaXMuX3JlbmRlcmVyLmdldEFjdGl2ZUN1YmVGYWNlKCk7XHJcblx0XHRfb2xkQWN0aXZlTWlwbWFwTGV2ZWwgPSB0aGlzLl9yZW5kZXJlci5nZXRBY3RpdmVNaXBtYXBMZXZlbCgpO1xyXG5cclxuXHRcdGNvbnN0IGN1YmVVVlJlbmRlclRhcmdldCA9IHJlbmRlclRhcmdldCB8fCB0aGlzLl9hbGxvY2F0ZVRhcmdldHMoKTtcclxuXHRcdHRoaXMuX3RleHR1cmVUb0N1YmVVViggdGV4dHVyZSwgY3ViZVVWUmVuZGVyVGFyZ2V0ICk7XHJcblx0XHR0aGlzLl9hcHBseVBNUkVNKCBjdWJlVVZSZW5kZXJUYXJnZXQgKTtcclxuXHRcdHRoaXMuX2NsZWFudXAoIGN1YmVVVlJlbmRlclRhcmdldCApO1xyXG5cclxuXHRcdHJldHVybiBjdWJlVVZSZW5kZXJUYXJnZXQ7XHJcblxyXG5cdH1cclxuXHJcblx0X2FsbG9jYXRlVGFyZ2V0cygpIHtcclxuXHJcblx0XHRjb25zdCB3aWR0aCA9IDMgKiBNYXRoLm1heCggdGhpcy5fY3ViZVNpemUsIDE2ICogNyApO1xyXG5cdFx0Y29uc3QgaGVpZ2h0ID0gNCAqIHRoaXMuX2N1YmVTaXplO1xyXG5cclxuXHRcdGNvbnN0IHBhcmFtcyA9IHtcclxuXHRcdFx0bWFnRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXHJcblx0XHRcdG1pbkZpbHRlcjogTGluZWFyRmlsdGVyLFxyXG5cdFx0XHRnZW5lcmF0ZU1pcG1hcHM6IGZhbHNlLFxyXG5cdFx0XHR0eXBlOiBIYWxmRmxvYXRUeXBlLFxyXG5cdFx0XHRmb3JtYXQ6IFJHQkFGb3JtYXQsXHJcblx0XHRcdGNvbG9yU3BhY2U6IExpbmVhclNSR0JDb2xvclNwYWNlLFxyXG5cdFx0XHQvL2RlcHRoQnVmZmVyOiBmYWxzZVxyXG5cdFx0fTtcclxuXHJcblx0XHRjb25zdCBjdWJlVVZSZW5kZXJUYXJnZXQgPSBfY3JlYXRlUmVuZGVyVGFyZ2V0KCB3aWR0aCwgaGVpZ2h0LCBwYXJhbXMgKTtcclxuXHJcblx0XHRpZiAoIHRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0ID09PSBudWxsIHx8IHRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0LndpZHRoICE9PSB3aWR0aCB8fCB0aGlzLl9waW5nUG9uZ1JlbmRlclRhcmdldC5oZWlnaHQgIT09IGhlaWdodCApIHtcclxuXHJcblx0XHRcdGlmICggdGhpcy5fcGluZ1BvbmdSZW5kZXJUYXJnZXQgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdHRoaXMuX2Rpc3Bvc2UoKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0ID0gX2NyZWF0ZVJlbmRlclRhcmdldCggd2lkdGgsIGhlaWdodCwgcGFyYW1zICk7XHJcblxyXG5cdFx0XHRjb25zdCB7IF9sb2RNYXggfSA9IHRoaXM7XHJcblx0XHRcdCggeyBzaXplTG9kczogdGhpcy5fc2l6ZUxvZHMsIGxvZFBsYW5lczogdGhpcy5fbG9kUGxhbmVzLCBzaWdtYXM6IHRoaXMuX3NpZ21hcywgbG9kTWVzaGVzOiB0aGlzLl9sb2RNZXNoZXMgfSA9IF9jcmVhdGVQbGFuZXMoIF9sb2RNYXggKSApO1xyXG5cclxuXHRcdFx0dGhpcy5fYmx1ck1hdGVyaWFsID0gX2dldEJsdXJTaGFkZXIoIF9sb2RNYXgsIHdpZHRoLCBoZWlnaHQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGN1YmVVVlJlbmRlclRhcmdldDtcclxuXHJcblx0fVxyXG5cclxuXHRhc3luYyBfY29tcGlsZU1hdGVyaWFsKCBtYXRlcmlhbCApIHtcclxuXHJcblx0XHRjb25zdCB0bXBNZXNoID0gbmV3IE1lc2goIHRoaXMuX2xvZFBsYW5lc1sgMCBdLCBtYXRlcmlhbCApO1xyXG5cdFx0YXdhaXQgdGhpcy5fcmVuZGVyZXIuY29tcGlsZSggdG1wTWVzaCwgX2ZsYXRDYW1lcmEgKTtcclxuXHJcblx0fVxyXG5cclxuXHRfc2NlbmVUb0N1YmVVViggc2NlbmUsIG5lYXIsIGZhciwgY3ViZVVWUmVuZGVyVGFyZ2V0LCBwb3NpdGlvbiApIHtcclxuXHJcblx0XHRjb25zdCBjdWJlQ2FtZXJhID0gX2N1YmVDYW1lcmE7XHJcblx0XHRjdWJlQ2FtZXJhLm5lYXIgPSBuZWFyO1xyXG5cdFx0Y3ViZUNhbWVyYS5mYXIgPSBmYXI7XHJcblxyXG5cdFx0Ly8gcHgsIHB5LCBweiwgbngsIG55LCBuelxyXG5cdFx0Y29uc3QgdXBTaWduID0gWyAxLCAxLCAxLCAxLCAtIDEsIDEgXTtcclxuXHRcdGNvbnN0IGZvcndhcmRTaWduID0gWyAxLCAtIDEsIDEsIC0gMSwgMSwgLSAxIF07XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyZXIgPSB0aGlzLl9yZW5kZXJlcjtcclxuXHJcblx0XHRjb25zdCBvcmlnaW5hbEF1dG9DbGVhciA9IHJlbmRlcmVyLmF1dG9DbGVhcjtcclxuXHJcblx0XHRyZW5kZXJlci5nZXRDbGVhckNvbG9yKCBfY2xlYXJDb2xvciApO1xyXG5cclxuXHRcdHJlbmRlcmVyLmF1dG9DbGVhciA9IGZhbHNlO1xyXG5cclxuXHRcdGxldCBiYWNrZ3JvdW5kQm94ID0gdGhpcy5fYmFja2dyb3VuZEJveDtcclxuXHJcblx0XHRpZiAoIGJhY2tncm91bmRCb3ggPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBiYWNrZ3JvdW5kTWF0ZXJpYWwgPSBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoIHtcclxuXHRcdFx0XHRuYW1lOiAnUE1SRU0uQmFja2dyb3VuZCcsXHJcblx0XHRcdFx0c2lkZTogQmFja1NpZGUsXHJcblx0XHRcdFx0ZGVwdGhXcml0ZTogZmFsc2UsXHJcblx0XHRcdFx0ZGVwdGhUZXN0OiBmYWxzZVxyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRiYWNrZ3JvdW5kQm94ID0gbmV3IE1lc2goIG5ldyBCb3hHZW9tZXRyeSgpLCBiYWNrZ3JvdW5kTWF0ZXJpYWwgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0bGV0IHVzZVNvbGlkQ29sb3IgPSBmYWxzZTtcclxuXHRcdGNvbnN0IGJhY2tncm91bmQgPSBzY2VuZS5iYWNrZ3JvdW5kO1xyXG5cclxuXHRcdGlmICggYmFja2dyb3VuZCApIHtcclxuXHJcblx0XHRcdGlmICggYmFja2dyb3VuZC5pc0NvbG9yICkge1xyXG5cclxuXHRcdFx0XHRiYWNrZ3JvdW5kQm94Lm1hdGVyaWFsLmNvbG9yLmNvcHkoIGJhY2tncm91bmQgKTtcclxuXHRcdFx0XHRzY2VuZS5iYWNrZ3JvdW5kID0gbnVsbDtcclxuXHRcdFx0XHR1c2VTb2xpZENvbG9yID0gdHJ1ZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0YmFja2dyb3VuZEJveC5tYXRlcmlhbC5jb2xvci5jb3B5KCBfY2xlYXJDb2xvciApO1xyXG5cdFx0XHR1c2VTb2xpZENvbG9yID0gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCBjdWJlVVZSZW5kZXJUYXJnZXQgKTtcclxuXHJcblx0XHRyZW5kZXJlci5jbGVhcigpO1xyXG5cclxuXHRcdGlmICggdXNlU29saWRDb2xvciApIHtcclxuXHJcblx0XHRcdHJlbmRlcmVyLnJlbmRlciggYmFja2dyb3VuZEJveCwgY3ViZUNhbWVyYSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCA2OyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgY29sID0gaSAlIDM7XHJcblxyXG5cdFx0XHRpZiAoIGNvbCA9PT0gMCApIHtcclxuXHJcblx0XHRcdFx0Y3ViZUNhbWVyYS51cC5zZXQoIDAsIHVwU2lnblsgaSBdLCAwICk7XHJcblx0XHRcdFx0Y3ViZUNhbWVyYS5wb3NpdGlvbi5zZXQoIHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHBvc2l0aW9uLnogKTtcclxuXHRcdFx0XHRjdWJlQ2FtZXJhLmxvb2tBdCggcG9zaXRpb24ueCArIGZvcndhcmRTaWduWyBpIF0sIHBvc2l0aW9uLnksIHBvc2l0aW9uLnogKTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGNvbCA9PT0gMSApIHtcclxuXHJcblx0XHRcdFx0Y3ViZUNhbWVyYS51cC5zZXQoIDAsIDAsIHVwU2lnblsgaSBdICk7XHJcblx0XHRcdFx0Y3ViZUNhbWVyYS5wb3NpdGlvbi5zZXQoIHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHBvc2l0aW9uLnogKTtcclxuXHRcdFx0XHRjdWJlQ2FtZXJhLmxvb2tBdCggcG9zaXRpb24ueCwgcG9zaXRpb24ueSArIGZvcndhcmRTaWduWyBpIF0sIHBvc2l0aW9uLnogKTtcclxuXHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRjdWJlQ2FtZXJhLnVwLnNldCggMCwgdXBTaWduWyBpIF0sIDAgKTtcclxuXHRcdFx0XHRjdWJlQ2FtZXJhLnBvc2l0aW9uLnNldCggcG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24ueiApO1xyXG5cdFx0XHRcdGN1YmVDYW1lcmEubG9va0F0KCBwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56ICsgZm9yd2FyZFNpZ25bIGkgXSApO1xyXG5cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IHNpemUgPSB0aGlzLl9jdWJlU2l6ZTtcclxuXHJcblx0XHRcdF9zZXRWaWV3cG9ydCggY3ViZVVWUmVuZGVyVGFyZ2V0LCBjb2wgKiBzaXplLCBpID4gMiA/IHNpemUgOiAwLCBzaXplLCBzaXplICk7XHJcblxyXG5cdFx0XHRyZW5kZXJlci5yZW5kZXIoIHNjZW5lLCBjdWJlQ2FtZXJhICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJlbmRlcmVyLmF1dG9DbGVhciA9IG9yaWdpbmFsQXV0b0NsZWFyO1xyXG5cdFx0c2NlbmUuYmFja2dyb3VuZCA9IGJhY2tncm91bmQ7XHJcblxyXG5cdH1cclxuXHJcblx0X3RleHR1cmVUb0N1YmVVViggdGV4dHVyZSwgY3ViZVVWUmVuZGVyVGFyZ2V0ICkge1xyXG5cclxuXHRcdGNvbnN0IHJlbmRlcmVyID0gdGhpcy5fcmVuZGVyZXI7XHJcblxyXG5cdFx0Y29uc3QgaXNDdWJlVGV4dHVyZSA9ICggdGV4dHVyZS5tYXBwaW5nID09PSBDdWJlUmVmbGVjdGlvbk1hcHBpbmcgfHwgdGV4dHVyZS5tYXBwaW5nID09PSBDdWJlUmVmcmFjdGlvbk1hcHBpbmcgKTtcclxuXHJcblx0XHRpZiAoIGlzQ3ViZVRleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMuX2N1YmVtYXBNYXRlcmlhbCA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5fY3ViZW1hcE1hdGVyaWFsID0gX2dldEN1YmVtYXBNYXRlcmlhbCggdGV4dHVyZSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMuX2VxdWlyZWN0TWF0ZXJpYWwgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdHRoaXMuX2VxdWlyZWN0TWF0ZXJpYWwgPSBfZ2V0RXF1aXJlY3RNYXRlcmlhbCggdGV4dHVyZSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBtYXRlcmlhbCA9IGlzQ3ViZVRleHR1cmUgPyB0aGlzLl9jdWJlbWFwTWF0ZXJpYWwgOiB0aGlzLl9lcXVpcmVjdE1hdGVyaWFsO1xyXG5cdFx0bWF0ZXJpYWwuZnJhZ21lbnROb2RlLnZhbHVlID0gdGV4dHVyZTtcclxuXHJcblx0XHRjb25zdCBtZXNoID0gdGhpcy5fbG9kTWVzaGVzWyAwIF07XHJcblx0XHRtZXNoLm1hdGVyaWFsID0gbWF0ZXJpYWw7XHJcblxyXG5cdFx0Y29uc3Qgc2l6ZSA9IHRoaXMuX2N1YmVTaXplO1xyXG5cclxuXHRcdF9zZXRWaWV3cG9ydCggY3ViZVVWUmVuZGVyVGFyZ2V0LCAwLCAwLCAzICogc2l6ZSwgMiAqIHNpemUgKTtcclxuXHJcblx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIGN1YmVVVlJlbmRlclRhcmdldCApO1xyXG5cdFx0cmVuZGVyZXIucmVuZGVyKCBtZXNoLCBfZmxhdENhbWVyYSApO1xyXG5cclxuXHR9XHJcblxyXG5cdF9hcHBseVBNUkVNKCBjdWJlVVZSZW5kZXJUYXJnZXQgKSB7XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyZXIgPSB0aGlzLl9yZW5kZXJlcjtcclxuXHRcdGNvbnN0IGF1dG9DbGVhciA9IHJlbmRlcmVyLmF1dG9DbGVhcjtcclxuXHRcdHJlbmRlcmVyLmF1dG9DbGVhciA9IGZhbHNlO1xyXG5cdFx0Y29uc3QgbiA9IHRoaXMuX2xvZFBsYW5lcy5sZW5ndGg7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAxOyBpIDwgbjsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHNpZ21hID0gTWF0aC5zcXJ0KCB0aGlzLl9zaWdtYXNbIGkgXSAqIHRoaXMuX3NpZ21hc1sgaSBdIC0gdGhpcy5fc2lnbWFzWyBpIC0gMSBdICogdGhpcy5fc2lnbWFzWyBpIC0gMSBdICk7XHJcblxyXG5cdFx0XHRjb25zdCBwb2xlQXhpcyA9IF9heGlzRGlyZWN0aW9uc1sgKCBuIC0gaSAtIDEgKSAlIF9heGlzRGlyZWN0aW9ucy5sZW5ndGggXTtcclxuXHJcblx0XHRcdHRoaXMuX2JsdXIoIGN1YmVVVlJlbmRlclRhcmdldCwgaSAtIDEsIGksIHNpZ21hLCBwb2xlQXhpcyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZW5kZXJlci5hdXRvQ2xlYXIgPSBhdXRvQ2xlYXI7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBpcyBhIHR3by1wYXNzIEdhdXNzaWFuIGJsdXIgZm9yIGEgY3ViZW1hcC4gTm9ybWFsbHkgdGhpcyBpcyBkb25lXHJcblx0ICogdmVydGljYWxseSBhbmQgaG9yaXpvbnRhbGx5LCBidXQgdGhpcyBicmVha3MgZG93biBvbiBhIGN1YmUuIEhlcmUgd2UgYXBwbHlcclxuXHQgKiB0aGUgYmx1ciBsYXRpdHVkaW5hbGx5IChhcm91bmQgdGhlIHBvbGVzKSwgYW5kIHRoZW4gbG9uZ2l0dWRpbmFsbHkgKHRvd2FyZHNcclxuXHQgKiB0aGUgcG9sZXMpIHRvIGFwcHJveGltYXRlIHRoZSBvcnRob2dvbmFsbHktc2VwYXJhYmxlIGJsdXIuIEl0IGlzIGxlYXN0XHJcblx0ICogYWNjdXJhdGUgYXQgdGhlIHBvbGVzLCBidXQgc3RpbGwgZG9lcyBhIGRlY2VudCBqb2IuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyVGFyZ2V0fSBjdWJlVVZSZW5kZXJUYXJnZXQgLSBUaGUgY3ViZW1hcCByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBsb2RJbiAtIFRoZSBpbnB1dCBsZXZlbC1vZi1kZXRhaWwuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGxvZE91dCAtIFRoZSBvdXRwdXQgbGV2ZWwtb2YtZGV0YWlsLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzaWdtYSAtIFRoZSBibHVyIHJhZGl1cyBpbiByYWRpYW5zLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gW3BvbGVBeGlzXSAtIFRoZSBwb2xlIGF4aXMuXHJcblx0ICovXHJcblx0X2JsdXIoIGN1YmVVVlJlbmRlclRhcmdldCwgbG9kSW4sIGxvZE91dCwgc2lnbWEsIHBvbGVBeGlzICkge1xyXG5cclxuXHRcdGNvbnN0IHBpbmdQb25nUmVuZGVyVGFyZ2V0ID0gdGhpcy5fcGluZ1BvbmdSZW5kZXJUYXJnZXQ7XHJcblxyXG5cdFx0dGhpcy5faGFsZkJsdXIoXHJcblx0XHRcdGN1YmVVVlJlbmRlclRhcmdldCxcclxuXHRcdFx0cGluZ1BvbmdSZW5kZXJUYXJnZXQsXHJcblx0XHRcdGxvZEluLFxyXG5cdFx0XHRsb2RPdXQsXHJcblx0XHRcdHNpZ21hLFxyXG5cdFx0XHQnbGF0aXR1ZGluYWwnLFxyXG5cdFx0XHRwb2xlQXhpcyApO1xyXG5cclxuXHRcdHRoaXMuX2hhbGZCbHVyKFxyXG5cdFx0XHRwaW5nUG9uZ1JlbmRlclRhcmdldCxcclxuXHRcdFx0Y3ViZVVWUmVuZGVyVGFyZ2V0LFxyXG5cdFx0XHRsb2RPdXQsXHJcblx0XHRcdGxvZE91dCxcclxuXHRcdFx0c2lnbWEsXHJcblx0XHRcdCdsb25naXR1ZGluYWwnLFxyXG5cdFx0XHRwb2xlQXhpcyApO1xyXG5cclxuXHR9XHJcblxyXG5cdF9oYWxmQmx1ciggdGFyZ2V0SW4sIHRhcmdldE91dCwgbG9kSW4sIGxvZE91dCwgc2lnbWFSYWRpYW5zLCBkaXJlY3Rpb24sIHBvbGVBeGlzICkge1xyXG5cclxuXHRcdGNvbnN0IHJlbmRlcmVyID0gdGhpcy5fcmVuZGVyZXI7XHJcblx0XHRjb25zdCBibHVyTWF0ZXJpYWwgPSB0aGlzLl9ibHVyTWF0ZXJpYWw7XHJcblxyXG5cdFx0aWYgKCBkaXJlY3Rpb24gIT09ICdsYXRpdHVkaW5hbCcgJiYgZGlyZWN0aW9uICE9PSAnbG9uZ2l0dWRpbmFsJyApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoICdibHVyIGRpcmVjdGlvbiBtdXN0IGJlIGVpdGhlciBsYXRpdHVkaW5hbCBvciBsb25naXR1ZGluYWwhJyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBOdW1iZXIgb2Ygc3RhbmRhcmQgZGV2aWF0aW9ucyBhdCB3aGljaCB0byBjdXQgb2ZmIHRoZSBkaXNjcmV0ZSBhcHByb3hpbWF0aW9uLlxyXG5cdFx0Y29uc3QgU1RBTkRBUkRfREVWSUFUSU9OUyA9IDM7XHJcblxyXG5cdFx0Y29uc3QgYmx1ck1lc2ggPSB0aGlzLl9sb2RNZXNoZXNbIGxvZE91dCBdO1xyXG5cdFx0Ymx1ck1lc2gubWF0ZXJpYWwgPSBibHVyTWF0ZXJpYWw7XHJcblxyXG5cdFx0Y29uc3QgYmx1clVuaWZvcm1zID0gX3VuaWZvcm1zTWFwLmdldCggYmx1ck1hdGVyaWFsICk7XHJcblxyXG5cdFx0Y29uc3QgcGl4ZWxzID0gdGhpcy5fc2l6ZUxvZHNbIGxvZEluIF0gLSAxO1xyXG5cdFx0Y29uc3QgcmFkaWFuc1BlclBpeGVsID0gaXNGaW5pdGUoIHNpZ21hUmFkaWFucyApID8gTWF0aC5QSSAvICggMiAqIHBpeGVscyApIDogMiAqIE1hdGguUEkgLyAoIDIgKiBNQVhfU0FNUExFUyAtIDEgKTtcclxuXHRcdGNvbnN0IHNpZ21hUGl4ZWxzID0gc2lnbWFSYWRpYW5zIC8gcmFkaWFuc1BlclBpeGVsO1xyXG5cdFx0Y29uc3Qgc2FtcGxlcyA9IGlzRmluaXRlKCBzaWdtYVJhZGlhbnMgKSA/IDEgKyBNYXRoLmZsb29yKCBTVEFOREFSRF9ERVZJQVRJT05TICogc2lnbWFQaXhlbHMgKSA6IE1BWF9TQU1QTEVTO1xyXG5cclxuXHRcdGlmICggc2FtcGxlcyA+IE1BWF9TQU1QTEVTICkge1xyXG5cclxuXHRcdFx0Y29uc29sZS53YXJuKCBgc2lnbWFSYWRpYW5zLCAke1xyXG5cdFx0XHRcdHNpZ21hUmFkaWFuc30sIGlzIHRvbyBsYXJnZSBhbmQgd2lsbCBjbGlwLCBhcyBpdCByZXF1ZXN0ZWQgJHtcclxuXHRcdFx0XHRzYW1wbGVzfSBzYW1wbGVzIHdoZW4gdGhlIG1heGltdW0gaXMgc2V0IHRvICR7TUFYX1NBTVBMRVN9YCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCB3ZWlnaHRzID0gW107XHJcblx0XHRsZXQgc3VtID0gMDtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBNQVhfU0FNUExFUzsgKysgaSApIHtcclxuXHJcblx0XHRcdGNvbnN0IHggPSBpIC8gc2lnbWFQaXhlbHM7XHJcblx0XHRcdGNvbnN0IHdlaWdodCA9IE1hdGguZXhwKCAtIHggKiB4IC8gMiApO1xyXG5cdFx0XHR3ZWlnaHRzLnB1c2goIHdlaWdodCApO1xyXG5cclxuXHRcdFx0aWYgKCBpID09PSAwICkge1xyXG5cclxuXHRcdFx0XHRzdW0gKz0gd2VpZ2h0O1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggaSA8IHNhbXBsZXMgKSB7XHJcblxyXG5cdFx0XHRcdHN1bSArPSAyICogd2VpZ2h0O1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB3ZWlnaHRzLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdHdlaWdodHNbIGkgXSA9IHdlaWdodHNbIGkgXSAvIHN1bTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGFyZ2V0SW4udGV4dHVyZS5mcmFtZSA9ICggdGFyZ2V0SW4udGV4dHVyZS5mcmFtZSB8fCAwICkgKyAxO1xyXG5cclxuXHRcdGJsdXJVbmlmb3Jtcy5lbnZNYXAudmFsdWUgPSB0YXJnZXRJbi50ZXh0dXJlO1xyXG5cdFx0Ymx1clVuaWZvcm1zLnNhbXBsZXMudmFsdWUgPSBzYW1wbGVzO1xyXG5cdFx0Ymx1clVuaWZvcm1zLndlaWdodHMuYXJyYXkgPSB3ZWlnaHRzO1xyXG5cdFx0Ymx1clVuaWZvcm1zLmxhdGl0dWRpbmFsLnZhbHVlID0gZGlyZWN0aW9uID09PSAnbGF0aXR1ZGluYWwnID8gMSA6IDA7XHJcblxyXG5cdFx0aWYgKCBwb2xlQXhpcyApIHtcclxuXHJcblx0XHRcdGJsdXJVbmlmb3Jtcy5wb2xlQXhpcy52YWx1ZSA9IHBvbGVBeGlzO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCB7IF9sb2RNYXggfSA9IHRoaXM7XHJcblx0XHRibHVyVW5pZm9ybXMuZFRoZXRhLnZhbHVlID0gcmFkaWFuc1BlclBpeGVsO1xyXG5cdFx0Ymx1clVuaWZvcm1zLm1pcEludC52YWx1ZSA9IF9sb2RNYXggLSBsb2RJbjtcclxuXHJcblx0XHRjb25zdCBvdXRwdXRTaXplID0gdGhpcy5fc2l6ZUxvZHNbIGxvZE91dCBdO1xyXG5cdFx0Y29uc3QgeCA9IDMgKiBvdXRwdXRTaXplICogKCBsb2RPdXQgPiBfbG9kTWF4IC0gTE9EX01JTiA/IGxvZE91dCAtIF9sb2RNYXggKyBMT0RfTUlOIDogMCApO1xyXG5cdFx0Y29uc3QgeSA9IDQgKiAoIHRoaXMuX2N1YmVTaXplIC0gb3V0cHV0U2l6ZSApO1xyXG5cclxuXHRcdF9zZXRWaWV3cG9ydCggdGFyZ2V0T3V0LCB4LCB5LCAzICogb3V0cHV0U2l6ZSwgMiAqIG91dHB1dFNpemUgKTtcclxuXHRcdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggdGFyZ2V0T3V0ICk7XHJcblx0XHRyZW5kZXJlci5yZW5kZXIoIGJsdXJNZXNoLCBfZmxhdENhbWVyYSApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBfY3JlYXRlUGxhbmVzKCBsb2RNYXggKSB7XHJcblxyXG5cdGNvbnN0IGxvZFBsYW5lcyA9IFtdO1xyXG5cdGNvbnN0IHNpemVMb2RzID0gW107XHJcblx0Y29uc3Qgc2lnbWFzID0gW107XHJcblx0Y29uc3QgbG9kTWVzaGVzID0gW107XHJcblxyXG5cdGxldCBsb2QgPSBsb2RNYXg7XHJcblxyXG5cdGNvbnN0IHRvdGFsTG9kcyA9IGxvZE1heCAtIExPRF9NSU4gKyAxICsgRVhUUkFfTE9EX1NJR01BLmxlbmd0aDtcclxuXHJcblx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdG90YWxMb2RzOyBpICsrICkge1xyXG5cclxuXHRcdGNvbnN0IHNpemVMb2QgPSBNYXRoLnBvdyggMiwgbG9kICk7XHJcblx0XHRzaXplTG9kcy5wdXNoKCBzaXplTG9kICk7XHJcblx0XHRsZXQgc2lnbWEgPSAxLjAgLyBzaXplTG9kO1xyXG5cclxuXHRcdGlmICggaSA+IGxvZE1heCAtIExPRF9NSU4gKSB7XHJcblxyXG5cdFx0XHRzaWdtYSA9IEVYVFJBX0xPRF9TSUdNQVsgaSAtIGxvZE1heCArIExPRF9NSU4gLSAxIF07XHJcblxyXG5cdFx0fSBlbHNlIGlmICggaSA9PT0gMCApIHtcclxuXHJcblx0XHRcdHNpZ21hID0gMDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0c2lnbWFzLnB1c2goIHNpZ21hICk7XHJcblxyXG5cdFx0Y29uc3QgdGV4ZWxTaXplID0gMS4wIC8gKCBzaXplTG9kIC0gMiApO1xyXG5cdFx0Y29uc3QgbWluID0gLSB0ZXhlbFNpemU7XHJcblx0XHRjb25zdCBtYXggPSAxICsgdGV4ZWxTaXplO1xyXG5cdFx0Y29uc3QgdXYxID0gWyBtaW4sIG1pbiwgbWF4LCBtaW4sIG1heCwgbWF4LCBtaW4sIG1pbiwgbWF4LCBtYXgsIG1pbiwgbWF4IF07XHJcblxyXG5cdFx0Y29uc3QgY3ViZUZhY2VzID0gNjtcclxuXHRcdGNvbnN0IHZlcnRpY2VzID0gNjtcclxuXHRcdGNvbnN0IHBvc2l0aW9uU2l6ZSA9IDM7XHJcblx0XHRjb25zdCB1dlNpemUgPSAyO1xyXG5cdFx0Y29uc3QgZmFjZUluZGV4U2l6ZSA9IDE7XHJcblxyXG5cdFx0Y29uc3QgcG9zaXRpb24gPSBuZXcgRmxvYXQzMkFycmF5KCBwb3NpdGlvblNpemUgKiB2ZXJ0aWNlcyAqIGN1YmVGYWNlcyApO1xyXG5cdFx0Y29uc3QgdXYgPSBuZXcgRmxvYXQzMkFycmF5KCB1dlNpemUgKiB2ZXJ0aWNlcyAqIGN1YmVGYWNlcyApO1xyXG5cdFx0Y29uc3QgZmFjZUluZGV4ID0gbmV3IEZsb2F0MzJBcnJheSggZmFjZUluZGV4U2l6ZSAqIHZlcnRpY2VzICogY3ViZUZhY2VzICk7XHJcblxyXG5cdFx0Zm9yICggbGV0IGZhY2UgPSAwOyBmYWNlIDwgY3ViZUZhY2VzOyBmYWNlICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgeCA9ICggZmFjZSAlIDMgKSAqIDIgLyAzIC0gMTtcclxuXHRcdFx0Y29uc3QgeSA9IGZhY2UgPiAyID8gMCA6IC0gMTtcclxuXHRcdFx0Y29uc3QgY29vcmRpbmF0ZXMgPSBbXHJcblx0XHRcdFx0eCwgeSwgMCxcclxuXHRcdFx0XHR4ICsgMiAvIDMsIHksIDAsXHJcblx0XHRcdFx0eCArIDIgLyAzLCB5ICsgMSwgMCxcclxuXHRcdFx0XHR4LCB5LCAwLFxyXG5cdFx0XHRcdHggKyAyIC8gMywgeSArIDEsIDAsXHJcblx0XHRcdFx0eCwgeSArIDEsIDBcclxuXHRcdFx0XTtcclxuXHJcblx0XHRcdGNvbnN0IGZhY2VJZHggPSBfZmFjZUxpYlsgZmFjZSBdO1xyXG5cdFx0XHRwb3NpdGlvbi5zZXQoIGNvb3JkaW5hdGVzLCBwb3NpdGlvblNpemUgKiB2ZXJ0aWNlcyAqIGZhY2VJZHggKTtcclxuXHRcdFx0dXYuc2V0KCB1djEsIHV2U2l6ZSAqIHZlcnRpY2VzICogZmFjZUlkeCApO1xyXG5cdFx0XHRjb25zdCBmaWxsID0gWyBmYWNlSWR4LCBmYWNlSWR4LCBmYWNlSWR4LCBmYWNlSWR4LCBmYWNlSWR4LCBmYWNlSWR4IF07XHJcblx0XHRcdGZhY2VJbmRleC5zZXQoIGZpbGwsIGZhY2VJbmRleFNpemUgKiB2ZXJ0aWNlcyAqIGZhY2VJZHggKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgcGxhbmVzID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XHJcblx0XHRwbGFuZXMuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgcG9zaXRpb25TaXplICkgKTtcclxuXHRcdHBsYW5lcy5zZXRBdHRyaWJ1dGUoICd1dicsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIHV2LCB1dlNpemUgKSApO1xyXG5cdFx0cGxhbmVzLnNldEF0dHJpYnV0ZSggJ2ZhY2VJbmRleCcsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIGZhY2VJbmRleCwgZmFjZUluZGV4U2l6ZSApICk7XHJcblx0XHRsb2RQbGFuZXMucHVzaCggcGxhbmVzICk7XHJcblx0XHRsb2RNZXNoZXMucHVzaCggbmV3IE1lc2goIHBsYW5lcywgbnVsbCApICk7XHJcblxyXG5cdFx0aWYgKCBsb2QgPiBMT0RfTUlOICkge1xyXG5cclxuXHRcdFx0bG9kIC0tO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4geyBsb2RQbGFuZXMsIHNpemVMb2RzLCBzaWdtYXMsIGxvZE1lc2hlcyB9O1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gX2NyZWF0ZVJlbmRlclRhcmdldCggd2lkdGgsIGhlaWdodCwgcGFyYW1zICkge1xyXG5cclxuXHRjb25zdCBjdWJlVVZSZW5kZXJUYXJnZXQgPSBuZXcgUmVuZGVyVGFyZ2V0KCB3aWR0aCwgaGVpZ2h0LCBwYXJhbXMgKTtcclxuXHRjdWJlVVZSZW5kZXJUYXJnZXQudGV4dHVyZS5tYXBwaW5nID0gQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmc7XHJcblx0Y3ViZVVWUmVuZGVyVGFyZ2V0LnRleHR1cmUubmFtZSA9ICdQTVJFTS5jdWJlVXYnO1xyXG5cdGN1YmVVVlJlbmRlclRhcmdldC50ZXh0dXJlLmlzUE1SRU1UZXh0dXJlID0gdHJ1ZTtcclxuXHRjdWJlVVZSZW5kZXJUYXJnZXQuc2Npc3NvclRlc3QgPSB0cnVlO1xyXG5cdHJldHVybiBjdWJlVVZSZW5kZXJUYXJnZXQ7XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBfc2V0Vmlld3BvcnQoIHRhcmdldCwgeCwgeSwgd2lkdGgsIGhlaWdodCApIHtcclxuXHJcblx0dGFyZ2V0LnZpZXdwb3J0LnNldCggeCwgeSwgd2lkdGgsIGhlaWdodCApO1xyXG5cdHRhcmdldC5zY2lzc29yLnNldCggeCwgeSwgd2lkdGgsIGhlaWdodCApO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gX2dldE1hdGVyaWFsKCB0eXBlICkge1xyXG5cclxuXHRjb25zdCBtYXRlcmlhbCA9IG5ldyBOb2RlTWF0ZXJpYWwoKTtcclxuXHRtYXRlcmlhbC5kZXB0aFRlc3QgPSBmYWxzZTtcclxuXHRtYXRlcmlhbC5kZXB0aFdyaXRlID0gZmFsc2U7XHJcblx0bWF0ZXJpYWwuYmxlbmRpbmcgPSBOb0JsZW5kaW5nO1xyXG5cdG1hdGVyaWFsLm5hbWUgPSBgUE1SRU1fJHsgdHlwZSB9YDtcclxuXHJcblx0cmV0dXJuIG1hdGVyaWFsO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gX2dldEJsdXJTaGFkZXIoIGxvZE1heCwgd2lkdGgsIGhlaWdodCApIHtcclxuXHJcblx0Y29uc3Qgd2VpZ2h0cyA9IHVuaWZvcm1BcnJheSggbmV3IEFycmF5KCBNQVhfU0FNUExFUyApLmZpbGwoIDAgKSApO1xyXG5cdGNvbnN0IHBvbGVBeGlzID0gdW5pZm9ybSggbmV3IFZlY3RvcjMoIDAsIDEsIDAgKSApO1xyXG5cdGNvbnN0IGRUaGV0YSA9IHVuaWZvcm0oIDAgKTtcclxuXHRjb25zdCBuID0gZmxvYXQoIE1BWF9TQU1QTEVTICk7XHJcblx0Y29uc3QgbGF0aXR1ZGluYWwgPSB1bmlmb3JtKCAwICk7IC8vIGZhbHNlLCBib29sXHJcblx0Y29uc3Qgc2FtcGxlcyA9IHVuaWZvcm0oIDEgKTsgLy8gaW50XHJcblx0Y29uc3QgZW52TWFwID0gdGV4dHVyZSggbnVsbCApO1xyXG5cdGNvbnN0IG1pcEludCA9IHVuaWZvcm0oIDAgKTsgLy8gaW50XHJcblx0Y29uc3QgQ1VCRVVWX1RFWEVMX1dJRFRIID0gZmxvYXQoIDEgLyB3aWR0aCApO1xyXG5cdGNvbnN0IENVQkVVVl9URVhFTF9IRUlHSFQgPSBmbG9hdCggMSAvIGhlaWdodCApO1xyXG5cdGNvbnN0IENVQkVVVl9NQVhfTUlQID0gZmxvYXQoIGxvZE1heCApO1xyXG5cclxuXHRjb25zdCBtYXRlcmlhbFVuaWZvcm1zID0ge1xyXG5cdFx0bixcclxuXHRcdGxhdGl0dWRpbmFsLFxyXG5cdFx0d2VpZ2h0cyxcclxuXHRcdHBvbGVBeGlzLFxyXG5cdFx0b3V0cHV0RGlyZWN0aW9uOiBfb3V0cHV0RGlyZWN0aW9uLFxyXG5cdFx0ZFRoZXRhLFxyXG5cdFx0c2FtcGxlcyxcclxuXHRcdGVudk1hcCxcclxuXHRcdG1pcEludCxcclxuXHRcdENVQkVVVl9URVhFTF9XSURUSCxcclxuXHRcdENVQkVVVl9URVhFTF9IRUlHSFQsXHJcblx0XHRDVUJFVVZfTUFYX01JUFxyXG5cdH07XHJcblxyXG5cdGNvbnN0IG1hdGVyaWFsID0gX2dldE1hdGVyaWFsKCAnYmx1cicgKTtcclxuXHRtYXRlcmlhbC5mcmFnbWVudE5vZGUgPSBibHVyKCB7IC4uLm1hdGVyaWFsVW5pZm9ybXMsIGxhdGl0dWRpbmFsOiBsYXRpdHVkaW5hbC5lcXVhbCggMSApIH0gKTtcclxuXHJcblx0X3VuaWZvcm1zTWFwLnNldCggbWF0ZXJpYWwsIG1hdGVyaWFsVW5pZm9ybXMgKTtcclxuXHJcblx0cmV0dXJuIG1hdGVyaWFsO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gX2dldEN1YmVtYXBNYXRlcmlhbCggZW52VGV4dHVyZSApIHtcclxuXHJcblx0Y29uc3QgbWF0ZXJpYWwgPSBfZ2V0TWF0ZXJpYWwoICdjdWJlbWFwJyApO1xyXG5cdG1hdGVyaWFsLmZyYWdtZW50Tm9kZSA9IGN1YmVUZXh0dXJlKCBlbnZUZXh0dXJlLCBfb3V0cHV0RGlyZWN0aW9uICk7XHJcblxyXG5cdHJldHVybiBtYXRlcmlhbDtcclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIF9nZXRFcXVpcmVjdE1hdGVyaWFsKCBlbnZUZXh0dXJlICkge1xyXG5cclxuXHRjb25zdCBtYXRlcmlhbCA9IF9nZXRNYXRlcmlhbCggJ2VxdWlyZWN0JyApO1xyXG5cdG1hdGVyaWFsLmZyYWdtZW50Tm9kZSA9IHRleHR1cmUoIGVudlRleHR1cmUsIGVxdWlyZWN0VVYoIF9vdXRwdXREaXJlY3Rpb24gKSwgMCApO1xyXG5cclxuXHRyZXR1cm4gbWF0ZXJpYWw7XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBQTVJFTUdlbmVyYXRvcjtcclxuIiwiaW1wb3J0IFRlbXBOb2RlIGZyb20gJy4uL2NvcmUvVGVtcE5vZGUuanMnO1xyXG5pbXBvcnQgeyB0ZXh0dXJlIH0gZnJvbSAnLi4vYWNjZXNzb3JzL1RleHR1cmVOb2RlLmpzJztcclxuaW1wb3J0IHsgdGV4dHVyZUN1YmVVViB9IGZyb20gJy4vUE1SRU1VdGlscy5qcyc7XHJcbmltcG9ydCB7IHVuaWZvcm0gfSBmcm9tICcuLi9jb3JlL1VuaWZvcm1Ob2RlLmpzJztcclxuaW1wb3J0IHsgTm9kZVVwZGF0ZVR5cGUgfSBmcm9tICcuLi9jb3JlL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IG5vZGVQcm94eSwgdmVjMyB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbmltcG9ydCB7IFRleHR1cmUgfSBmcm9tICcuLi8uLi90ZXh0dXJlcy9UZXh0dXJlLmpzJztcclxuaW1wb3J0IFBNUkVNR2VuZXJhdG9yIGZyb20gJy4uLy4uL3JlbmRlcmVycy9jb21tb24vZXh0cmFzL1BNUkVNR2VuZXJhdG9yLmpzJztcclxuaW1wb3J0IHsgbWF0ZXJpYWxFbnZSb3RhdGlvbiB9IGZyb20gJy4uL2FjY2Vzc29ycy9NYXRlcmlhbFByb3BlcnRpZXMuanMnO1xyXG5cclxuY29uc3QgX2NhY2hlID0gbmV3IFdlYWtNYXAoKTtcclxuXHJcbi8qKlxyXG4gKiBHZW5lcmF0ZXMgdGhlIGN1YmVVViBzaXplIGJhc2VkIG9uIHRoZSBnaXZlbiBpbWFnZSBoZWlnaHQuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbWFnZUhlaWdodCAtIFRoZSBpbWFnZSBoZWlnaHQuXHJcbiAqIEByZXR1cm4ge3t0ZXhlbFdpZHRoOiBudW1iZXIsdGV4ZWxIZWlnaHQ6IG51bWJlciwgbWF4TWlwOiBudW1iZXJ9fSBUaGUgcmVzdWx0IG9iamVjdC5cclxuICovXHJcbmZ1bmN0aW9uIF9nZW5lcmF0ZUN1YmVVVlNpemUoIGltYWdlSGVpZ2h0ICkge1xyXG5cclxuXHRjb25zdCBtYXhNaXAgPSBNYXRoLmxvZzIoIGltYWdlSGVpZ2h0ICkgLSAyO1xyXG5cclxuXHRjb25zdCB0ZXhlbEhlaWdodCA9IDEuMCAvIGltYWdlSGVpZ2h0O1xyXG5cclxuXHRjb25zdCB0ZXhlbFdpZHRoID0gMS4wIC8gKCAzICogTWF0aC5tYXgoIE1hdGgucG93KCAyLCBtYXhNaXAgKSwgNyAqIDE2ICkgKTtcclxuXHJcblx0cmV0dXJuIHsgdGV4ZWxXaWR0aCwgdGV4ZWxIZWlnaHQsIG1heE1pcCB9O1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIEdlbmVyYXRlcyBhIFBNUkVNIGZyb20gdGhlIGdpdmVuIHRleHR1cmUuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlIHRvIGNyZWF0ZSB0aGUgUE1SRU0gZm9yLlxyXG4gKiBAcGFyYW0ge1JlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuICogQHBhcmFtIHtQTVJFTUdlbmVyYXRvcn0gZ2VuZXJhdG9yIC0gVGhlIFBNUkVNIGdlbmVyYXRvci5cclxuICogQHJldHVybiB7P1RleHR1cmV9IFRoZSBQTVJFTS5cclxuICovXHJcbmZ1bmN0aW9uIF9nZXRQTVJFTUZyb21UZXh0dXJlKCB0ZXh0dXJlLCByZW5kZXJlciwgZ2VuZXJhdG9yICkge1xyXG5cclxuXHRjb25zdCBjYWNoZSA9IF9nZXRDYWNoZSggcmVuZGVyZXIgKTtcclxuXHJcblx0bGV0IGNhY2hlVGV4dHVyZSA9IGNhY2hlLmdldCggdGV4dHVyZSApO1xyXG5cclxuXHRjb25zdCBwbXJlbVZlcnNpb24gPSBjYWNoZVRleHR1cmUgIT09IHVuZGVmaW5lZCA/IGNhY2hlVGV4dHVyZS5wbXJlbVZlcnNpb24gOiAtIDE7XHJcblxyXG5cdGlmICggcG1yZW1WZXJzaW9uICE9PSB0ZXh0dXJlLnBtcmVtVmVyc2lvbiApIHtcclxuXHJcblx0XHRjb25zdCBpbWFnZSA9IHRleHR1cmUuaW1hZ2U7XHJcblxyXG5cdFx0aWYgKCB0ZXh0dXJlLmlzQ3ViZVRleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGlzQ3ViZU1hcFJlYWR5KCBpbWFnZSApICkge1xyXG5cclxuXHRcdFx0XHRjYWNoZVRleHR1cmUgPSBnZW5lcmF0b3IuZnJvbUN1YmVtYXAoIHRleHR1cmUsIGNhY2hlVGV4dHVyZSApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0cmV0dXJuIG51bGw7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRpZiAoIGlzRXF1aXJlY3Rhbmd1bGFyTWFwUmVhZHkoIGltYWdlICkgKSB7XHJcblxyXG5cdFx0XHRcdGNhY2hlVGV4dHVyZSA9IGdlbmVyYXRvci5mcm9tRXF1aXJlY3Rhbmd1bGFyKCB0ZXh0dXJlLCBjYWNoZVRleHR1cmUgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHJldHVybiBudWxsO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjYWNoZVRleHR1cmUucG1yZW1WZXJzaW9uID0gdGV4dHVyZS5wbXJlbVZlcnNpb247XHJcblxyXG5cdFx0Y2FjaGUuc2V0KCB0ZXh0dXJlLCBjYWNoZVRleHR1cmUgKTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gY2FjaGVUZXh0dXJlLnRleHR1cmU7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIGNhY2hlIHRoYXQgc3RvcmVzIGdlbmVyYXRlZCBQTVJFTXMgZm9yIHRoZSByZXNwZWN0aXZlIHRleHR1cmVzLlxyXG4gKiBBIGNhY2hlIG11c3QgYmUgbWFpbnRhaW5lZCBwZXIgcmVuZGVyZXIgc2luY2UgUE1SRU1zIGFyZSByZW5kZXIgdGFyZ2V0IHRleHR1cmVzXHJcbiAqIHdoaWNoIGNhbid0IGJlIHNoYXJlZCBhY3Jvc3MgcmVuZGVyIGNvbnRleHRzLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAcGFyYW0ge1JlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuICogQHJldHVybiB7V2Vha01hcDxUZXh0dXJlLCBUZXh0dXJlPn0gVGhlIFBNUkVNIGNhY2hlLlxyXG4gKi9cclxuZnVuY3Rpb24gX2dldENhY2hlKCByZW5kZXJlciApIHtcclxuXHJcblx0bGV0IHJlbmRlcmVyQ2FjaGUgPSBfY2FjaGUuZ2V0KCByZW5kZXJlciApO1xyXG5cclxuXHRpZiAoIHJlbmRlcmVyQ2FjaGUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRyZW5kZXJlckNhY2hlID0gbmV3IFdlYWtNYXAoKTtcclxuXHRcdF9jYWNoZS5zZXQoIHJlbmRlcmVyLCByZW5kZXJlckNhY2hlICk7XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIHJlbmRlcmVyQ2FjaGU7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogVGhpcyBub2RlIHJlcHJlc2VudHMgYSBQTVJFTSB3aGljaCBpcyBhIHNwZWNpYWwgdHlwZSBvZiBwcmVwcm9jZXNzZWRcclxuICogZW52aXJvbm1lbnQgbWFwIGludGVuZGVkIGZvciBQQlIgbWF0ZXJpYWxzLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBtYXRlcmlhbCA9IG5ldyBNZXNoU3RhbmRhcmROb2RlTWF0ZXJpYWwoKTtcclxuICogbWF0ZXJpYWwuZW52Tm9kZSA9IHBtcmVtVGV4dHVyZSggZW52TWFwICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgVGVtcE5vZGVcclxuICovXHJcbmNsYXNzIFBNUkVNTm9kZSBleHRlbmRzIFRlbXBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnUE1SRU1Ob2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGZ1bmN0aW9uIG92ZXJsb2FkaW5nIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHZhbHVlIC0gVGhlIGlucHV0IHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtOb2RlPHZlYzI+fSBbdXZOb2RlPW51bGxdIC0gVGhlIHV2IG5vZGUuXHJcblx0ICogQHBhcmFtIHtOb2RlPGZsb2F0Pn0gW2xldmVsTm9kZT1udWxsXSAtIFRoZSBsZXZlbCBub2RlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCB2YWx1ZSwgdXZOb2RlID0gbnVsbCwgbGV2ZWxOb2RlID0gbnVsbCApIHtcclxuXHJcblx0XHRzdXBlciggJ3ZlYzMnICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZWZlcmVuY2UgdG8gdGhlIGlucHV0IHRleHR1cmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHtUZXh0dXJlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl92YWx1ZSA9IHZhbHVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVmZXJlbmNlIHRvIHRoZSBnZW5lcmF0ZWQgUE1SRU0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHtUZXh0dXJlIHwgbnVsbH1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fcG1yZW0gPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogIFRoZSB1diBub2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlPHZlYzI+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnV2Tm9kZSA9IHV2Tm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqICBUaGUgbGV2ZWwgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZTxmbG9hdD59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGV2ZWxOb2RlID0gbGV2ZWxOb2RlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVmZXJlbmNlIHRvIGEgUE1SRU0gZ2VuZXJhdG9yLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7P1BNUkVNR2VuZXJhdG9yfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9nZW5lcmF0b3IgPSBudWxsO1xyXG5cclxuXHRcdGNvbnN0IGRlZmF1bHRUZXh0dXJlID0gbmV3IFRleHR1cmUoKTtcclxuXHRcdGRlZmF1bHRUZXh0dXJlLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdGV4dHVyZSBub2RlIGhvbGRpbmcgdGhlIGdlbmVyYXRlZCBQTVJFTS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge1RleHR1cmVOb2RlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl90ZXh0dXJlID0gdGV4dHVyZSggZGVmYXVsdFRleHR1cmUgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgdW5pZm9ybSByZXByZXNlbnRpbmcgdGhlIFBNUkVNJ3Mgd2lkdGguXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHtVbmlmb3JtTm9kZTxmbG9hdD59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX3dpZHRoID0gdW5pZm9ybSggMCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSB1bmlmb3JtIHJlcHJlc2VudGluZyB0aGUgUE1SRU0ncyBoZWlnaHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHtVbmlmb3JtTm9kZTxmbG9hdD59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX2hlaWdodCA9IHVuaWZvcm0oIDAgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgdW5pZm9ybSByZXByZXNlbnRpbmcgdGhlIFBNUkVNJ3MgbWF4IE1pcC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge1VuaWZvcm1Ob2RlPGZsb2F0Pn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fbWF4TWlwID0gdW5pZm9ybSggMCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGB1cGRhdGVCZWZvcmVUeXBlYCBpcyBzZXQgdG8gYE5vZGVVcGRhdGVUeXBlLlJFTkRFUmAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqIEBkZWZhdWx0ICdyZW5kZXInXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXBkYXRlQmVmb3JlVHlwZSA9IE5vZGVVcGRhdGVUeXBlLlJFTkRFUjtcclxuXHJcblx0fVxyXG5cclxuXHRzZXQgdmFsdWUoIHZhbHVlICkge1xyXG5cclxuXHRcdHRoaXMuX3ZhbHVlID0gdmFsdWU7XHJcblx0XHR0aGlzLl9wbXJlbSA9IG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIG5vZGUncyB0ZXh0dXJlIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge1RleHR1cmV9XHJcblx0ICovXHJcblx0Z2V0IHZhbHVlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl92YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVc2VzIHRoZSBnaXZlbiBQTVJFTSB0ZXh0dXJlIHRvIHVwZGF0ZSBpbnRlcm5hbCB2YWx1ZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgUE1SRU0gdGV4dHVyZS5cclxuXHQgKi9cclxuXHR1cGRhdGVGcm9tVGV4dHVyZSggdGV4dHVyZSApIHtcclxuXHJcblx0XHRjb25zdCBjdWJlVVZTaXplID0gX2dlbmVyYXRlQ3ViZVVWU2l6ZSggdGV4dHVyZS5pbWFnZS5oZWlnaHQgKTtcclxuXHJcblx0XHR0aGlzLl90ZXh0dXJlLnZhbHVlID0gdGV4dHVyZTtcclxuXHRcdHRoaXMuX3dpZHRoLnZhbHVlID0gY3ViZVVWU2l6ZS50ZXhlbFdpZHRoO1xyXG5cdFx0dGhpcy5faGVpZ2h0LnZhbHVlID0gY3ViZVVWU2l6ZS50ZXhlbEhlaWdodDtcclxuXHRcdHRoaXMuX21heE1pcC52YWx1ZSA9IGN1YmVVVlNpemUubWF4TWlwO1xyXG5cclxuXHR9XHJcblxyXG5cdHVwZGF0ZUJlZm9yZSggZnJhbWUgKSB7XHJcblxyXG5cdFx0bGV0IHBtcmVtID0gdGhpcy5fcG1yZW07XHJcblxyXG5cdFx0Y29uc3QgcG1yZW1WZXJzaW9uID0gcG1yZW0gPyBwbXJlbS5wbXJlbVZlcnNpb24gOiAtIDE7XHJcblx0XHRjb25zdCB0ZXh0dXJlID0gdGhpcy5fdmFsdWU7XHJcblxyXG5cdFx0aWYgKCBwbXJlbVZlcnNpb24gIT09IHRleHR1cmUucG1yZW1WZXJzaW9uICkge1xyXG5cclxuXHRcdFx0aWYgKCB0ZXh0dXJlLmlzUE1SRU1UZXh0dXJlID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRwbXJlbSA9IHRleHR1cmU7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRwbXJlbSA9IF9nZXRQTVJFTUZyb21UZXh0dXJlKCB0ZXh0dXJlLCBmcmFtZS5yZW5kZXJlciwgdGhpcy5fZ2VuZXJhdG9yICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHBtcmVtICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLl9wbXJlbSA9IHBtcmVtO1xyXG5cclxuXHRcdFx0XHR0aGlzLnVwZGF0ZUZyb21UZXh0dXJlKCBwbXJlbSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRzZXR1cCggYnVpbGRlciApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuX2dlbmVyYXRvciA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuX2dlbmVyYXRvciA9IG5ldyBQTVJFTUdlbmVyYXRvciggYnVpbGRlci5yZW5kZXJlciApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnVwZGF0ZUJlZm9yZSggYnVpbGRlciApO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0bGV0IHV2Tm9kZSA9IHRoaXMudXZOb2RlO1xyXG5cclxuXHRcdGlmICggdXZOb2RlID09PSBudWxsICYmIGJ1aWxkZXIuY29udGV4dC5nZXRVViApIHtcclxuXHJcblx0XHRcdHV2Tm9kZSA9IGJ1aWxkZXIuY29udGV4dC5nZXRVViggdGhpcyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdHV2Tm9kZSA9IG1hdGVyaWFsRW52Um90YXRpb24ubXVsKCB2ZWMzKCB1dk5vZGUueCwgdXZOb2RlLnkubmVnYXRlKCksIHV2Tm9kZS56ICkgKTtcclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGxldCBsZXZlbE5vZGUgPSB0aGlzLmxldmVsTm9kZTtcclxuXHJcblx0XHRpZiAoIGxldmVsTm9kZSA9PT0gbnVsbCAmJiBidWlsZGVyLmNvbnRleHQuZ2V0VGV4dHVyZUxldmVsICkge1xyXG5cclxuXHRcdFx0bGV2ZWxOb2RlID0gYnVpbGRlci5jb250ZXh0LmdldFRleHR1cmVMZXZlbCggdGhpcyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdHJldHVybiB0ZXh0dXJlQ3ViZVVWKCB0aGlzLl90ZXh0dXJlLCB1dk5vZGUsIGxldmVsTm9kZSwgdGhpcy5fd2lkdGgsIHRoaXMuX2hlaWdodCwgdGhpcy5fbWF4TWlwICk7XHJcblxyXG5cdH1cclxuXHJcblx0ZGlzcG9zZSgpIHtcclxuXHJcblx0XHRzdXBlci5kaXNwb3NlKCk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9nZW5lcmF0b3IgIT09IG51bGwgKSB0aGlzLl9nZW5lcmF0b3IuZGlzcG9zZSgpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBQTVJFTU5vZGU7XHJcblxyXG4vKipcclxuICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIGN1YmUgbWFwIGltYWdlIGhhcyBiZWVuIGZ1bGx5IGxvYWRlZC5cclxuICpcclxuICogQHByaXZhdGVcclxuICogQHBhcmFtIHs/QXJyYXk8KEltYWdlfE9iamVjdCk+fSBbaW1hZ2VdIC0gVGhlIGN1YmUgbWFwIGltYWdlLlxyXG4gKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBnaXZlbiBjdWJlIG1hcCBpcyByZWFkeSBvciBub3QuXHJcbiAqL1xyXG5mdW5jdGlvbiBpc0N1YmVNYXBSZWFkeSggaW1hZ2UgKSB7XHJcblxyXG5cdGlmICggaW1hZ2UgPT09IG51bGwgfHwgaW1hZ2UgPT09IHVuZGVmaW5lZCApIHJldHVybiBmYWxzZTtcclxuXHJcblx0bGV0IGNvdW50ID0gMDtcclxuXHRjb25zdCBsZW5ndGggPSA2O1xyXG5cclxuXHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0aWYgKCBpbWFnZVsgaSBdICE9PSB1bmRlZmluZWQgKSBjb3VudCArKztcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gY291bnQgPT09IGxlbmd0aDtcclxuXHJcblxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIGVxdWlyZWN0YW5ndWxhciBpbWFnZSBoYXMgYmVlbiBmdWxseSBsb2FkZWQuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBwYXJhbSB7KEltYWdlfE9iamVjdCl9IGltYWdlIC0gVGhlIGVxdWlyZWN0YW5ndWxhciBpbWFnZS5cclxuICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZ2l2ZW4gY3ViZSBtYXAgaXMgcmVhZHkgb3Igbm90LlxyXG4gKi9cclxuZnVuY3Rpb24gaXNFcXVpcmVjdGFuZ3VsYXJNYXBSZWFkeSggaW1hZ2UgKSB7XHJcblxyXG5cdGlmICggaW1hZ2UgPT09IG51bGwgfHwgaW1hZ2UgPT09IHVuZGVmaW5lZCApIHJldHVybiBmYWxzZTtcclxuXHJcblx0cmV0dXJuIGltYWdlLmhlaWdodCA+IDA7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIFBNUkVNIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7VGV4dHVyZX0gdmFsdWUgLSBUaGUgaW5wdXQgdGV4dHVyZS5cclxuICogQHBhcmFtIHs/Tm9kZTx2ZWMyPn0gW3V2Tm9kZT1udWxsXSAtIFRoZSB1diBub2RlLlxyXG4gKiBAcGFyYW0gez9Ob2RlPGZsb2F0Pn0gW2xldmVsTm9kZT1udWxsXSAtIFRoZSBsZXZlbCBub2RlLlxyXG4gKiBAcmV0dXJucyB7UE1SRU1Ob2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHBtcmVtVGV4dHVyZSA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBQTVJFTU5vZGUgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDEsIDMgKTtcclxuIiwiaW1wb3J0IExpZ2h0aW5nTm9kZSBmcm9tICcuL0xpZ2h0aW5nTm9kZS5qcyc7XHJcbmltcG9ydCB7IGNhY2hlIH0gZnJvbSAnLi4vY29yZS9DYWNoZU5vZGUuanMnO1xyXG5pbXBvcnQgeyByb3VnaG5lc3MsIGNsZWFyY29hdFJvdWdobmVzcyB9IGZyb20gJy4uL2NvcmUvUHJvcGVydHlOb2RlLmpzJztcclxuaW1wb3J0IHsgY2FtZXJhVmlld01hdHJpeCB9IGZyb20gJy4uL2FjY2Vzc29ycy9DYW1lcmEuanMnO1xyXG5pbXBvcnQgeyB0cmFuc2Zvcm1lZENsZWFyY29hdE5vcm1hbFZpZXcsIHRyYW5zZm9ybWVkTm9ybWFsVmlldywgdHJhbnNmb3JtZWROb3JtYWxXb3JsZCB9IGZyb20gJy4uL2FjY2Vzc29ycy9Ob3JtYWwuanMnO1xyXG5pbXBvcnQgeyBwb3NpdGlvblZpZXdEaXJlY3Rpb24gfSBmcm9tICcuLi9hY2Nlc3NvcnMvUG9zaXRpb24uanMnO1xyXG5pbXBvcnQgeyBmbG9hdCB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuaW1wb3J0IHsgdHJhbnNmb3JtZWRCZW50Tm9ybWFsVmlldyB9IGZyb20gJy4uL2FjY2Vzc29ycy9BY2Nlc3NvcnNVdGlscy5qcyc7XHJcbmltcG9ydCB7IHBtcmVtVGV4dHVyZSB9IGZyb20gJy4uL3BtcmVtL1BNUkVNTm9kZS5qcyc7XHJcbmltcG9ydCB7IG1hdGVyaWFsRW52SW50ZW5zaXR5IH0gZnJvbSAnLi4vYWNjZXNzb3JzL01hdGVyaWFsUHJvcGVydGllcy5qcyc7XHJcblxyXG5jb25zdCBfZW52Tm9kZUNhY2hlID0gbmV3IFdlYWtNYXAoKTtcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIGEgcGh5c2ljYWwgbW9kZWwgZm9yIEltYWdlLWJhc2VkIGxpZ2h0aW5nIChJQkwpLiBUaGUgZW52aXJvbm1lbnRcclxuICogaXMgZGVmaW5lZCB2aWEgZW52aXJvbm1lbnQgbWFwcyBpbiB0aGUgZXF1aXJlY3Rhbmd1bGFyLCBjdWJlIG1hcCBvciBjdWJlVVYgKFBNUkVNKSBmb3JtYXQuXHJcbiAqIGBFbnZpcm9ubWVudE5vZGVgIGlzIGludGVuZGVkIGZvciBQQlIgbWF0ZXJpYWxzIGxpa2Uge0BsaW5rIE1lc2hTdGFuZGFyZE5vZGVNYXRlcmlhbH0uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBMaWdodGluZ05vZGVcclxuICovXHJcbmNsYXNzIEVudmlyb25tZW50Tm9kZSBleHRlbmRzIExpZ2h0aW5nTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ0Vudmlyb25tZW50Tm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBlbnZpcm9ubWVudCBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlfSBbZW52Tm9kZT1udWxsXSAtIEEgbm9kZSByZXByZXNlbnRpbmcgdGhlIGVudmlyb25tZW50LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBlbnZOb2RlID0gbnVsbCApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBub2RlIHJlcHJlc2VudGluZyB0aGUgZW52aXJvbm1lbnQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmVudk5vZGUgPSBlbnZOb2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdHNldHVwKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IHsgbWF0ZXJpYWwgfSA9IGJ1aWxkZXI7XHJcblxyXG5cdFx0bGV0IGVudk5vZGUgPSB0aGlzLmVudk5vZGU7XHJcblxyXG5cdFx0aWYgKCBlbnZOb2RlLmlzVGV4dHVyZU5vZGUgfHwgZW52Tm9kZS5pc01hdGVyaWFsUmVmZXJlbmNlTm9kZSApIHtcclxuXHJcblx0XHRcdGNvbnN0IHZhbHVlID0gKCBlbnZOb2RlLmlzVGV4dHVyZU5vZGUgKSA/IGVudk5vZGUudmFsdWUgOiBtYXRlcmlhbFsgZW52Tm9kZS5wcm9wZXJ0eSBdO1xyXG5cclxuXHRcdFx0bGV0IGNhY2hlRW52Tm9kZSA9IF9lbnZOb2RlQ2FjaGUuZ2V0KCB2YWx1ZSApO1xyXG5cclxuXHRcdFx0aWYgKCBjYWNoZUVudk5vZGUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0Y2FjaGVFbnZOb2RlID0gcG1yZW1UZXh0dXJlKCB2YWx1ZSApO1xyXG5cclxuXHRcdFx0XHRfZW52Tm9kZUNhY2hlLnNldCggdmFsdWUsIGNhY2hlRW52Tm9kZSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZW52Tm9kZVx0PSBjYWNoZUVudk5vZGU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0Y29uc3QgdXNlQW5pc290cm9weSA9IG1hdGVyaWFsLnVzZUFuaXNvdHJvcHkgPT09IHRydWUgfHwgbWF0ZXJpYWwuYW5pc290cm9weSA+IDA7XHJcblx0XHRjb25zdCByYWRpYW5jZU5vcm1hbFZpZXcgPSB1c2VBbmlzb3Ryb3B5ID8gdHJhbnNmb3JtZWRCZW50Tm9ybWFsVmlldyA6IHRyYW5zZm9ybWVkTm9ybWFsVmlldztcclxuXHJcblx0XHRjb25zdCByYWRpYW5jZSA9IGVudk5vZGUuY29udGV4dCggY3JlYXRlUmFkaWFuY2VDb250ZXh0KCByb3VnaG5lc3MsIHJhZGlhbmNlTm9ybWFsVmlldyApICkubXVsKCBtYXRlcmlhbEVudkludGVuc2l0eSApO1xyXG5cdFx0Y29uc3QgaXJyYWRpYW5jZSA9IGVudk5vZGUuY29udGV4dCggY3JlYXRlSXJyYWRpYW5jZUNvbnRleHQoIHRyYW5zZm9ybWVkTm9ybWFsV29ybGQgKSApLm11bCggTWF0aC5QSSApLm11bCggbWF0ZXJpYWxFbnZJbnRlbnNpdHkgKTtcclxuXHJcblx0XHRjb25zdCBpc29sYXRlUmFkaWFuY2UgPSBjYWNoZSggcmFkaWFuY2UgKTtcclxuXHRcdGNvbnN0IGlzb2xhdGVJcnJhZGlhbmNlID0gY2FjaGUoIGlycmFkaWFuY2UgKTtcclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGJ1aWxkZXIuY29udGV4dC5yYWRpYW5jZS5hZGRBc3NpZ24oIGlzb2xhdGVSYWRpYW5jZSApO1xyXG5cclxuXHRcdGJ1aWxkZXIuY29udGV4dC5pYmxJcnJhZGlhbmNlLmFkZEFzc2lnbiggaXNvbGF0ZUlycmFkaWFuY2UgKTtcclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGNvbnN0IGNsZWFyY29hdFJhZGlhbmNlID0gYnVpbGRlci5jb250ZXh0LmxpZ2h0aW5nTW9kZWwuY2xlYXJjb2F0UmFkaWFuY2U7XHJcblxyXG5cdFx0aWYgKCBjbGVhcmNvYXRSYWRpYW5jZSApIHtcclxuXHJcblx0XHRcdGNvbnN0IGNsZWFyY29hdFJhZGlhbmNlQ29udGV4dCA9IGVudk5vZGUuY29udGV4dCggY3JlYXRlUmFkaWFuY2VDb250ZXh0KCBjbGVhcmNvYXRSb3VnaG5lc3MsIHRyYW5zZm9ybWVkQ2xlYXJjb2F0Tm9ybWFsVmlldyApICkubXVsKCBtYXRlcmlhbEVudkludGVuc2l0eSApO1xyXG5cdFx0XHRjb25zdCBpc29sYXRlQ2xlYXJjb2F0UmFkaWFuY2UgPSBjYWNoZSggY2xlYXJjb2F0UmFkaWFuY2VDb250ZXh0ICk7XHJcblxyXG5cdFx0XHRjbGVhcmNvYXRSYWRpYW5jZS5hZGRBc3NpZ24oIGlzb2xhdGVDbGVhcmNvYXRSYWRpYW5jZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgRW52aXJvbm1lbnROb2RlO1xyXG5cclxuY29uc3QgY3JlYXRlUmFkaWFuY2VDb250ZXh0ID0gKCByb3VnaG5lc3NOb2RlLCBub3JtYWxWaWV3Tm9kZSApID0+IHtcclxuXHJcblx0bGV0IHJlZmxlY3RWZWMgPSBudWxsO1xyXG5cclxuXHRyZXR1cm4ge1xyXG5cdFx0Z2V0VVY6ICgpID0+IHtcclxuXHJcblx0XHRcdGlmICggcmVmbGVjdFZlYyA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0cmVmbGVjdFZlYyA9IHBvc2l0aW9uVmlld0RpcmVjdGlvbi5uZWdhdGUoKS5yZWZsZWN0KCBub3JtYWxWaWV3Tm9kZSApO1xyXG5cclxuXHRcdFx0XHQvLyBNaXhpbmcgdGhlIHJlZmxlY3Rpb24gd2l0aCB0aGUgbm9ybWFsIGlzIG1vcmUgYWNjdXJhdGUgYW5kIGtlZXBzIHJvdWdoIG9iamVjdHMgZnJvbSBnYXRoZXJpbmcgbGlnaHQgZnJvbSBiZWhpbmQgdGhlaXIgdGFuZ2VudCBwbGFuZS5cclxuXHRcdFx0XHRyZWZsZWN0VmVjID0gcm91Z2huZXNzTm9kZS5tdWwoIHJvdWdobmVzc05vZGUgKS5taXgoIHJlZmxlY3RWZWMsIG5vcm1hbFZpZXdOb2RlICkubm9ybWFsaXplKCk7XHJcblxyXG5cdFx0XHRcdHJlZmxlY3RWZWMgPSByZWZsZWN0VmVjLnRyYW5zZm9ybURpcmVjdGlvbiggY2FtZXJhVmlld01hdHJpeCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIHJlZmxlY3RWZWM7XHJcblxyXG5cdFx0fSxcclxuXHRcdGdldFRleHR1cmVMZXZlbDogKCkgPT4ge1xyXG5cclxuXHRcdFx0cmV0dXJuIHJvdWdobmVzc05vZGU7XHJcblxyXG5cdFx0fVxyXG5cdH07XHJcblxyXG59O1xyXG5cclxuY29uc3QgY3JlYXRlSXJyYWRpYW5jZUNvbnRleHQgPSAoIG5vcm1hbFdvcmxkTm9kZSApID0+IHtcclxuXHJcblx0cmV0dXJuIHtcclxuXHRcdGdldFVWOiAoKSA9PiB7XHJcblxyXG5cdFx0XHRyZXR1cm4gbm9ybWFsV29ybGROb2RlO1xyXG5cclxuXHRcdH0sXHJcblx0XHRnZXRUZXh0dXJlTGV2ZWw6ICgpID0+IHtcclxuXHJcblx0XHRcdHJldHVybiBmbG9hdCggMS4wICk7XHJcblxyXG5cdFx0fVxyXG5cdH07XHJcblxyXG59O1xyXG4iLCJpbXBvcnQgTm9kZU1hdGVyaWFsIGZyb20gJy4vTm9kZU1hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgZGlmZnVzZUNvbG9yLCBtZXRhbG5lc3MsIHJvdWdobmVzcywgc3BlY3VsYXJDb2xvciwgc3BlY3VsYXJGOTAgfSBmcm9tICcuLi8uLi9ub2Rlcy9jb3JlL1Byb3BlcnR5Tm9kZS5qcyc7XHJcbmltcG9ydCB7IG1peCB9IGZyb20gJy4uLy4uL25vZGVzL21hdGgvTWF0aE5vZGUuanMnO1xyXG5pbXBvcnQgeyBtYXRlcmlhbFJvdWdobmVzcywgbWF0ZXJpYWxNZXRhbG5lc3MgfSBmcm9tICcuLi8uLi9ub2Rlcy9hY2Nlc3NvcnMvTWF0ZXJpYWxOb2RlLmpzJztcclxuaW1wb3J0IGdldFJvdWdobmVzcyBmcm9tICcuLi8uLi9ub2Rlcy9mdW5jdGlvbnMvbWF0ZXJpYWwvZ2V0Um91Z2huZXNzLmpzJztcclxuaW1wb3J0IFBoeXNpY2FsTGlnaHRpbmdNb2RlbCBmcm9tICcuLi8uLi9ub2Rlcy9mdW5jdGlvbnMvUGh5c2ljYWxMaWdodGluZ01vZGVsLmpzJztcclxuaW1wb3J0IEVudmlyb25tZW50Tm9kZSBmcm9tICcuLi8uLi9ub2Rlcy9saWdodGluZy9FbnZpcm9ubWVudE5vZGUuanMnO1xyXG5pbXBvcnQgeyBmbG9hdCwgdmVjMywgdmVjNCB9IGZyb20gJy4uLy4uL25vZGVzL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbmltcG9ydCB7IE1lc2hTdGFuZGFyZE1hdGVyaWFsIH0gZnJvbSAnLi4vTWVzaFN0YW5kYXJkTWF0ZXJpYWwuanMnO1xyXG5cclxuY29uc3QgX2RlZmF1bHRWYWx1ZXMgPSAvKkBfX1BVUkVfXyovIG5ldyBNZXNoU3RhbmRhcmRNYXRlcmlhbCgpO1xyXG5cclxuLyoqXHJcbiAqIE5vZGUgbWF0ZXJpYWwgdmVyc2lvbiBvZiB7QGxpbmsgTWVzaFN0YW5kYXJkTWF0ZXJpYWx9LlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTm9kZU1hdGVyaWFsXHJcbiAqL1xyXG5jbGFzcyBNZXNoU3RhbmRhcmROb2RlTWF0ZXJpYWwgZXh0ZW5kcyBOb2RlTWF0ZXJpYWwge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdNZXNoU3RhbmRhcmROb2RlTWF0ZXJpYWwnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbWVzaCBzdGFuZGFyZCBub2RlIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbWV0ZXJzXSAtIFRoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVycyApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc01lc2hTdGFuZGFyZE5vZGVNYXRlcmlhbCA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTZXQgdG8gYHRydWVgIGJlY2F1c2Ugc3RhbmRhcmQgbWF0ZXJpYWxzIHJlYWN0IG9uIGxpZ2h0cy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5saWdodHMgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGVtaXNzaXZlIGNvbG9yIG9mIHN0YW5kYXJkIG1hdGVyaWFscyBpcyBieSBkZWZhdWx0IGluZmVycmVkIGZyb20gdGhlIGBlbWlzc2l2ZWAsXHJcblx0XHQgKiBgZW1pc3NpdmVJbnRlbnNpdHlgIGFuZCBgZW1pc3NpdmVNYXBgIHByb3BlcnRpZXMuIFRoaXMgbm9kZSBwcm9wZXJ0eSBhbGxvd3MgdG9cclxuXHRcdCAqIG92ZXJ3cml0ZSB0aGUgZGVmYXVsdCBhbmQgZGVmaW5lIHRoZSBlbWlzc2l2ZSBjb2xvciB3aXRoIGEgbm9kZSBpbnN0ZWFkLlxyXG5cdFx0ICpcclxuXHRcdCAqIElmIHlvdSBkb24ndCB3YW50IHRvIG92ZXJ3cml0ZSB0aGUgZW1pc3NpdmUgY29sb3IgYnV0IG1vZGlmeSB0aGUgZXhpc3RpbmdcclxuXHRcdCAqIHZhbHVlIGluc3RlYWQsIHVzZSB7QGxpbmsgbWF0ZXJpYWxFbWlzc2l2ZX0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPHZlYzM+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmVtaXNzaXZlTm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbWV0YWxuZXNzIG9mIHN0YW5kYXJkIG1hdGVyaWFscyBpcyBieSBkZWZhdWx0IGluZmVycmVkIGZyb20gdGhlIGBtZXRhbG5lc3NgLFxyXG5cdFx0ICogYW5kIGBtZXRhbG5lc3NNYXBgIHByb3BlcnRpZXMuIFRoaXMgbm9kZSBwcm9wZXJ0eSBhbGxvd3MgdG9cclxuXHRcdCAqIG92ZXJ3cml0ZSB0aGUgZGVmYXVsdCBhbmQgZGVmaW5lIHRoZSBtZXRhbG5lc3Mgd2l0aCBhIG5vZGUgaW5zdGVhZC5cclxuXHRcdCAqXHJcblx0XHQgKiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBvdmVyd3JpdGUgdGhlIG1ldGFsbmVzcyBidXQgbW9kaWZ5IHRoZSBleGlzdGluZ1xyXG5cdFx0ICogdmFsdWUgaW5zdGVhZCwgdXNlIHtAbGluayBtYXRlcmlhbE1ldGFsbmVzc30uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPGZsb2F0Pn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tZXRhbG5lc3NOb2RlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByb3VnaG5lc3Mgb2Ygc3RhbmRhcmQgbWF0ZXJpYWxzIGlzIGJ5IGRlZmF1bHQgaW5mZXJyZWQgZnJvbSB0aGUgYHJvdWdobmVzc2AsXHJcblx0XHQgKiBhbmQgYHJvdWdobmVzc01hcGAgcHJvcGVydGllcy4gVGhpcyBub2RlIHByb3BlcnR5IGFsbG93cyB0b1xyXG5cdFx0ICogb3ZlcndyaXRlIHRoZSBkZWZhdWx0IGFuZCBkZWZpbmUgdGhlIHJvdWdobmVzcyB3aXRoIGEgbm9kZSBpbnN0ZWFkLlxyXG5cdFx0ICpcclxuXHRcdCAqIElmIHlvdSBkb24ndCB3YW50IHRvIG92ZXJ3cml0ZSB0aGUgcm91Z2huZXNzIGJ1dCBtb2RpZnkgdGhlIGV4aXN0aW5nXHJcblx0XHQgKiB2YWx1ZSBpbnN0ZWFkLCB1c2Uge0BsaW5rIG1hdGVyaWFsUm91Z2huZXNzfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGU8ZmxvYXQ+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJvdWdobmVzc05vZGUgPSBudWxsO1xyXG5cclxuXHRcdHRoaXMuc2V0RGVmYXVsdFZhbHVlcyggX2RlZmF1bHRWYWx1ZXMgKTtcclxuXHJcblx0XHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE92ZXJ3cml0dGVuIHNpbmNlIHRoaXMgdHlwZSBvZiBtYXRlcmlhbCB1c2VzIHtAbGluayBFbnZpcm9ubWVudE5vZGV9XHJcblx0ICogdG8gaW1wbGVtZW50IHRoZSBQQlIgKFBNUkVNIGJhc2VkKSBlbnZpcm9ubWVudCBtYXBwaW5nLiBCZXNpZGVzLCB0aGVcclxuXHQgKiBtZXRob2QgaG9ub3JzIGBTY2VuZS5lbnZpcm9ubWVudGAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4gez9FbnZpcm9ubWVudE5vZGU8dmVjMz59IFRoZSBlbnZpcm9ubWVudCBub2RlLlxyXG5cdCAqL1xyXG5cdHNldHVwRW52aXJvbm1lbnQoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0bGV0IGVudk5vZGUgPSBzdXBlci5zZXR1cEVudmlyb25tZW50KCBidWlsZGVyICk7XHJcblxyXG5cdFx0aWYgKCBlbnZOb2RlID09PSBudWxsICYmIGJ1aWxkZXIuZW52aXJvbm1lbnROb2RlICkge1xyXG5cclxuXHRcdFx0ZW52Tm9kZSA9IGJ1aWxkZXIuZW52aXJvbm1lbnROb2RlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZW52Tm9kZSA/IG5ldyBFbnZpcm9ubWVudE5vZGUoIGVudk5vZGUgKSA6IG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0dXBzIHRoZSBsaWdodGluZyBtb2RlbC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1BoeXNpY2FsTGlnaHRpbmdNb2RlbH0gVGhlIGxpZ2h0aW5nIG1vZGVsLlxyXG5cdCAqL1xyXG5cdHNldHVwTGlnaHRpbmdNb2RlbCggLypidWlsZGVyKi8gKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBQaHlzaWNhbExpZ2h0aW5nTW9kZWwoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXR1cHMgdGhlIHNwZWN1bGFyIHJlbGF0ZWQgbm9kZSB2YXJpYWJsZXMuXHJcblx0ICovXHJcblx0c2V0dXBTcGVjdWxhcigpIHtcclxuXHJcblx0XHRjb25zdCBzcGVjdWxhckNvbG9yTm9kZSA9IG1peCggdmVjMyggMC4wNCApLCBkaWZmdXNlQ29sb3IucmdiLCBtZXRhbG5lc3MgKTtcclxuXHJcblx0XHRzcGVjdWxhckNvbG9yLmFzc2lnbiggc3BlY3VsYXJDb2xvck5vZGUgKTtcclxuXHRcdHNwZWN1bGFyRjkwLmFzc2lnbiggMS4wICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0dXBzIHRoZSBzdGFuZGFyZCBzcGVjaWZpYyBub2RlIHZhcmlhYmxlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICovXHJcblx0c2V0dXBWYXJpYW50cygpIHtcclxuXHJcblx0XHQvLyBNRVRBTE5FU1NcclxuXHJcblx0XHRjb25zdCBtZXRhbG5lc3NOb2RlID0gdGhpcy5tZXRhbG5lc3NOb2RlID8gZmxvYXQoIHRoaXMubWV0YWxuZXNzTm9kZSApIDogbWF0ZXJpYWxNZXRhbG5lc3M7XHJcblxyXG5cdFx0bWV0YWxuZXNzLmFzc2lnbiggbWV0YWxuZXNzTm9kZSApO1xyXG5cclxuXHRcdC8vIFJPVUdITkVTU1xyXG5cclxuXHRcdGxldCByb3VnaG5lc3NOb2RlID0gdGhpcy5yb3VnaG5lc3NOb2RlID8gZmxvYXQoIHRoaXMucm91Z2huZXNzTm9kZSApIDogbWF0ZXJpYWxSb3VnaG5lc3M7XHJcblx0XHRyb3VnaG5lc3NOb2RlID0gZ2V0Um91Z2huZXNzKCB7IHJvdWdobmVzczogcm91Z2huZXNzTm9kZSB9ICk7XHJcblxyXG5cdFx0cm91Z2huZXNzLmFzc2lnbiggcm91Z2huZXNzTm9kZSApO1xyXG5cclxuXHRcdC8vIFNQRUNVTEFSIENPTE9SXHJcblxyXG5cdFx0dGhpcy5zZXR1cFNwZWN1bGFyKCk7XHJcblxyXG5cdFx0Ly8gRElGRlVTRSBDT0xPUlxyXG5cclxuXHRcdGRpZmZ1c2VDb2xvci5hc3NpZ24oIHZlYzQoIGRpZmZ1c2VDb2xvci5yZ2IubXVsKCBtZXRhbG5lc3NOb2RlLm9uZU1pbnVzKCkgKSwgZGlmZnVzZUNvbG9yLmEgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHR0aGlzLmVtaXNzaXZlTm9kZSA9IHNvdXJjZS5lbWlzc2l2ZU5vZGU7XHJcblxyXG5cdFx0dGhpcy5tZXRhbG5lc3NOb2RlID0gc291cmNlLm1ldGFsbmVzc05vZGU7XHJcblx0XHR0aGlzLnJvdWdobmVzc05vZGUgPSBzb3VyY2Uucm91Z2huZXNzTm9kZTtcclxuXHJcblx0XHRyZXR1cm4gc3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IE1lc2hTdGFuZGFyZE5vZGVNYXRlcmlhbDtcclxuIiwiaW1wb3J0IHsgY2xlYXJjb2F0LCBjbGVhcmNvYXRSb3VnaG5lc3MsIHNoZWVuLCBzaGVlblJvdWdobmVzcywgaXJpZGVzY2VuY2UsIGlyaWRlc2NlbmNlSU9SLCBpcmlkZXNjZW5jZVRoaWNrbmVzcywgc3BlY3VsYXJDb2xvciwgc3BlY3VsYXJGOTAsIGRpZmZ1c2VDb2xvciwgbWV0YWxuZXNzLCByb3VnaG5lc3MsIGFuaXNvdHJvcHksIGFscGhhVCwgYW5pc290cm9weVQsIGFuaXNvdHJvcHlCLCBpb3IsIHRyYW5zbWlzc2lvbiwgdGhpY2tuZXNzLCBhdHRlbnVhdGlvbkRpc3RhbmNlLCBhdHRlbnVhdGlvbkNvbG9yLCBkaXNwZXJzaW9uIH0gZnJvbSAnLi4vLi4vbm9kZXMvY29yZS9Qcm9wZXJ0eU5vZGUuanMnO1xyXG5pbXBvcnQgeyBtYXRlcmlhbENsZWFyY29hdCwgbWF0ZXJpYWxDbGVhcmNvYXRSb3VnaG5lc3MsIG1hdGVyaWFsQ2xlYXJjb2F0Tm9ybWFsLCBtYXRlcmlhbFNoZWVuLCBtYXRlcmlhbFNoZWVuUm91Z2huZXNzLCBtYXRlcmlhbElyaWRlc2NlbmNlLCBtYXRlcmlhbElyaWRlc2NlbmNlSU9SLCBtYXRlcmlhbElyaWRlc2NlbmNlVGhpY2tuZXNzLCBtYXRlcmlhbFNwZWN1bGFySW50ZW5zaXR5LCBtYXRlcmlhbFNwZWN1bGFyQ29sb3IsIG1hdGVyaWFsQW5pc290cm9weSwgbWF0ZXJpYWxJT1IsIG1hdGVyaWFsVHJhbnNtaXNzaW9uLCBtYXRlcmlhbFRoaWNrbmVzcywgbWF0ZXJpYWxBdHRlbnVhdGlvbkRpc3RhbmNlLCBtYXRlcmlhbEF0dGVudWF0aW9uQ29sb3IsIG1hdGVyaWFsRGlzcGVyc2lvbiB9IGZyb20gJy4uLy4uL25vZGVzL2FjY2Vzc29ycy9NYXRlcmlhbE5vZGUuanMnO1xyXG5pbXBvcnQgeyBmbG9hdCwgdmVjMiwgdmVjMywgSWYgfSBmcm9tICcuLi8uLi9ub2Rlcy90c2wvVFNMQmFzZS5qcyc7XHJcbmltcG9ydCBnZXRSb3VnaG5lc3MgZnJvbSAnLi4vLi4vbm9kZXMvZnVuY3Rpb25zL21hdGVyaWFsL2dldFJvdWdobmVzcy5qcyc7XHJcbmltcG9ydCB7IFRCTlZpZXdNYXRyaXggfSBmcm9tICcuLi8uLi9ub2Rlcy9hY2Nlc3NvcnMvQWNjZXNzb3JzVXRpbHMuanMnO1xyXG5pbXBvcnQgUGh5c2ljYWxMaWdodGluZ01vZGVsIGZyb20gJy4uLy4uL25vZGVzL2Z1bmN0aW9ucy9QaHlzaWNhbExpZ2h0aW5nTW9kZWwuanMnO1xyXG5pbXBvcnQgTWVzaFN0YW5kYXJkTm9kZU1hdGVyaWFsIGZyb20gJy4vTWVzaFN0YW5kYXJkTm9kZU1hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgbWl4LCBwb3cyLCBtaW4gfSBmcm9tICcuLi8uLi9ub2Rlcy9tYXRoL01hdGhOb2RlLmpzJztcclxuXHJcbmltcG9ydCB7IE1lc2hQaHlzaWNhbE1hdGVyaWFsIH0gZnJvbSAnLi4vTWVzaFBoeXNpY2FsTWF0ZXJpYWwuanMnO1xyXG5cclxuY29uc3QgX2RlZmF1bHRWYWx1ZXMgPSAvKkBfX1BVUkVfXyovIG5ldyBNZXNoUGh5c2ljYWxNYXRlcmlhbCgpO1xyXG5cclxuLyoqXHJcbiAqIE5vZGUgbWF0ZXJpYWwgdmVyc2lvbiBvZiB7QGxpbmsgTWVzaFBoeXNpY2FsTWF0ZXJpYWx9LlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTWVzaFN0YW5kYXJkTm9kZU1hdGVyaWFsXHJcbiAqL1xyXG5jbGFzcyBNZXNoUGh5c2ljYWxOb2RlTWF0ZXJpYWwgZXh0ZW5kcyBNZXNoU3RhbmRhcmROb2RlTWF0ZXJpYWwge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdNZXNoUGh5c2ljYWxOb2RlTWF0ZXJpYWwnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbWVzaCBwaHlzaWNhbCBub2RlIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbWV0ZXJzXSAtIFRoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVycyApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc01lc2hQaHlzaWNhbE5vZGVNYXRlcmlhbCA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY2xlYXJjb2F0IG9mIHBoeXNpY2FsIG1hdGVyaWFscyBpcyBieSBkZWZhdWx0IGluZmVycmVkIGZyb20gdGhlIGBjbGVhcmNvYXRgXHJcblx0XHQgKiBhbmQgYGNsZWFyY29hdE1hcGAgcHJvcGVydGllcy4gVGhpcyBub2RlIHByb3BlcnR5IGFsbG93cyB0byBvdmVyd3JpdGUgdGhlIGRlZmF1bHRcclxuXHRcdCAqIGFuZCBkZWZpbmUgdGhlIGNsZWFyY29hdCB3aXRoIGEgbm9kZSBpbnN0ZWFkLlxyXG5cdFx0ICpcclxuXHRcdCAqIElmIHlvdSBkb24ndCB3YW50IHRvIG92ZXJ3cml0ZSB0aGUgY2xlYXJjb2F0IGJ1dCBtb2RpZnkgdGhlIGV4aXN0aW5nXHJcblx0XHQgKiB2YWx1ZSBpbnN0ZWFkLCB1c2Uge0BsaW5rIG1hdGVyaWFsQ2xlYXJjb2F0fS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGU8ZmxvYXQ+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNsZWFyY29hdE5vZGUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNsZWFyY29hdCByb3VnaG5lc3Mgb2YgcGh5c2ljYWwgbWF0ZXJpYWxzIGlzIGJ5IGRlZmF1bHQgaW5mZXJyZWQgZnJvbSB0aGUgYGNsZWFyY29hdFJvdWdobmVzc2BcclxuXHRcdCAqIGFuZCBgY2xlYXJjb2F0Um91Z2huZXNzTWFwYCBwcm9wZXJ0aWVzLiBUaGlzIG5vZGUgcHJvcGVydHkgYWxsb3dzIHRvIG92ZXJ3cml0ZSB0aGUgZGVmYXVsdFxyXG5cdFx0ICogYW5kIGRlZmluZSB0aGUgY2xlYXJjb2F0IHJvdWdobmVzcyB3aXRoIGEgbm9kZSBpbnN0ZWFkLlxyXG5cdFx0ICpcclxuXHRcdCAqIElmIHlvdSBkb24ndCB3YW50IHRvIG92ZXJ3cml0ZSB0aGUgY2xlYXJjb2F0IHJvdWdobmVzcyBidXQgbW9kaWZ5IHRoZSBleGlzdGluZ1xyXG5cdFx0ICogdmFsdWUgaW5zdGVhZCwgdXNlIHtAbGluayBtYXRlcmlhbENsZWFyY29hdFJvdWdobmVzc30uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPGZsb2F0Pn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3NOb2RlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjbGVhcmNvYXQgbm9ybWFsIG9mIHBoeXNpY2FsIG1hdGVyaWFscyBpcyBieSBkZWZhdWx0IGluZmVycmVkIGZyb20gdGhlIGBjbGVhcmNvYXROb3JtYWxNYXBgXHJcblx0XHQgKiBwcm9wZXJ0eS4gVGhpcyBub2RlIHByb3BlcnR5IGFsbG93cyB0byBvdmVyd3JpdGUgdGhlIGRlZmF1bHRcclxuXHRcdCAqIGFuZCBkZWZpbmUgdGhlIGNsZWFyY29hdCBub3JtYWwgd2l0aCBhIG5vZGUgaW5zdGVhZC5cclxuXHRcdCAqXHJcblx0XHQgKiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBvdmVyd3JpdGUgdGhlIGNsZWFyY29hdCBub3JtYWwgYnV0IG1vZGlmeSB0aGUgZXhpc3RpbmdcclxuXHRcdCAqIHZhbHVlIGluc3RlYWQsIHVzZSB7QGxpbmsgbWF0ZXJpYWxDbGVhcmNvYXROb3JtYWx9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Tm9kZTx2ZWMzPn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jbGVhcmNvYXROb3JtYWxOb2RlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBzaGVlbiBvZiBwaHlzaWNhbCBtYXRlcmlhbHMgaXMgYnkgZGVmYXVsdCBpbmZlcnJlZCBmcm9tIHRoZSBgc2hlZW5gLCBgc2hlZW5Db2xvcmBcclxuXHRcdCAqIGFuZCBgc2hlZW5Db2xvck1hcGAgcHJvcGVydGllcy4gVGhpcyBub2RlIHByb3BlcnR5IGFsbG93cyB0byBvdmVyd3JpdGUgdGhlIGRlZmF1bHRcclxuXHRcdCAqIGFuZCBkZWZpbmUgdGhlIHNoZWVuIHdpdGggYSBub2RlIGluc3RlYWQuXHJcblx0XHQgKlxyXG5cdFx0ICogSWYgeW91IGRvbid0IHdhbnQgdG8gb3ZlcndyaXRlIHRoZSBzaGVlbiBidXQgbW9kaWZ5IHRoZSBleGlzdGluZ1xyXG5cdFx0ICogdmFsdWUgaW5zdGVhZCwgdXNlIHtAbGluayBtYXRlcmlhbFNoZWVufS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGU8dmVjMz59XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2hlZW5Ob2RlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBzaGVlbiByb3VnaG5lc3Mgb2YgcGh5c2ljYWwgbWF0ZXJpYWxzIGlzIGJ5IGRlZmF1bHQgaW5mZXJyZWQgZnJvbSB0aGUgYHNoZWVuUm91Z2huZXNzYCBhbmRcclxuXHRcdCAqIGBzaGVlblJvdWdobmVzc01hcGAgcHJvcGVydGllcy4gVGhpcyBub2RlIHByb3BlcnR5IGFsbG93cyB0byBvdmVyd3JpdGUgdGhlIGRlZmF1bHRcclxuXHRcdCAqIGFuZCBkZWZpbmUgdGhlIHNoZWVuIHJvdWdobmVzcyB3aXRoIGEgbm9kZSBpbnN0ZWFkLlxyXG5cdFx0ICpcclxuXHRcdCAqIElmIHlvdSBkb24ndCB3YW50IHRvIG92ZXJ3cml0ZSB0aGUgc2hlZW4gcm91Z2huZXNzIGJ1dCBtb2RpZnkgdGhlIGV4aXN0aW5nXHJcblx0XHQgKiB2YWx1ZSBpbnN0ZWFkLCB1c2Uge0BsaW5rIG1hdGVyaWFsU2hlZW5Sb3VnaG5lc3N9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Tm9kZTxmbG9hdD59XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2hlZW5Sb3VnaG5lc3NOb2RlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBpcmlkZXNjZW5jZSBvZiBwaHlzaWNhbCBtYXRlcmlhbHMgaXMgYnkgZGVmYXVsdCBpbmZlcnJlZCBmcm9tIHRoZSBgaXJpZGVzY2VuY2VgXHJcblx0XHQgKiBwcm9wZXJ0eS4gVGhpcyBub2RlIHByb3BlcnR5IGFsbG93cyB0byBvdmVyd3JpdGUgdGhlIGRlZmF1bHRcclxuXHRcdCAqIGFuZCBkZWZpbmUgdGhlIGlyaWRlc2NlbmNlIHdpdGggYSBub2RlIGluc3RlYWQuXHJcblx0XHQgKlxyXG5cdFx0ICogSWYgeW91IGRvbid0IHdhbnQgdG8gb3ZlcndyaXRlIHRoZSBpcmlkZXNjZW5jZSBidXQgbW9kaWZ5IHRoZSBleGlzdGluZ1xyXG5cdFx0ICogdmFsdWUgaW5zdGVhZCwgdXNlIHtAbGluayBtYXRlcmlhbElyaWRlc2NlbmNlfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGU8ZmxvYXQ+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlyaWRlc2NlbmNlTm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgaXJpZGVzY2VuY2UgSU9SIG9mIHBoeXNpY2FsIG1hdGVyaWFscyBpcyBieSBkZWZhdWx0IGluZmVycmVkIGZyb20gdGhlIGBpcmlkZXNjZW5jZUlPUmBcclxuXHRcdCAqIHByb3BlcnR5LiBUaGlzIG5vZGUgcHJvcGVydHkgYWxsb3dzIHRvIG92ZXJ3cml0ZSB0aGUgZGVmYXVsdFxyXG5cdFx0ICogYW5kIGRlZmluZSB0aGUgaXJpZGVzY2VuY2UgSU9SIHdpdGggYSBub2RlIGluc3RlYWQuXHJcblx0XHQgKlxyXG5cdFx0ICogSWYgeW91IGRvbid0IHdhbnQgdG8gb3ZlcndyaXRlIHRoZSBpcmlkZXNjZW5jZSBJT1IgYnV0IG1vZGlmeSB0aGUgZXhpc3RpbmdcclxuXHRcdCAqIHZhbHVlIGluc3RlYWQsIHVzZSB7QGxpbmsgbWF0ZXJpYWxJcmlkZXNjZW5jZUlPUn0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPGZsb2F0Pn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pcmlkZXNjZW5jZUlPUk5vZGUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGlyaWRlc2NlbmNlIHRoaWNrbmVzcyBvZiBwaHlzaWNhbCBtYXRlcmlhbHMgaXMgYnkgZGVmYXVsdCBpbmZlcnJlZCBmcm9tIHRoZSBgaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZWBcclxuXHRcdCAqIGFuZCBgaXJpZGVzY2VuY2VUaGlja25lc3NNYXBgIHByb3BlcnRpZXMuIFRoaXMgbm9kZSBwcm9wZXJ0eSBhbGxvd3MgdG8gb3ZlcndyaXRlIHRoZSBkZWZhdWx0XHJcblx0XHQgKiBhbmQgZGVmaW5lIHRoZSBpcmlkZXNjZW5jZSB0aGlja25lc3Mgd2l0aCBhIG5vZGUgaW5zdGVhZC5cclxuXHRcdCAqXHJcblx0XHQgKiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBvdmVyd3JpdGUgdGhlIGlyaWRlc2NlbmNlIHRoaWNrbmVzcyBidXQgbW9kaWZ5IHRoZSBleGlzdGluZ1xyXG5cdFx0ICogdmFsdWUgaW5zdGVhZCwgdXNlIHtAbGluayBtYXRlcmlhbElyaWRlc2NlbmNlVGhpY2tuZXNzfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGU8ZmxvYXQ+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlyaWRlc2NlbmNlVGhpY2tuZXNzTm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc3BlY3VsYXIgaW50ZW5zaXR5IG9mIHBoeXNpY2FsIG1hdGVyaWFscyBpcyBieSBkZWZhdWx0IGluZmVycmVkIGZyb20gdGhlIGBzcGVjdWxhckludGVuc2l0eWBcclxuXHRcdCAqIGFuZCBgc3BlY3VsYXJJbnRlbnNpdHlNYXBgIHByb3BlcnRpZXMuIFRoaXMgbm9kZSBwcm9wZXJ0eSBhbGxvd3MgdG8gb3ZlcndyaXRlIHRoZSBkZWZhdWx0XHJcblx0XHQgKiBhbmQgZGVmaW5lIHRoZSBzcGVjdWxhciBpbnRlbnNpdHkgd2l0aCBhIG5vZGUgaW5zdGVhZC5cclxuXHRcdCAqXHJcblx0XHQgKiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBvdmVyd3JpdGUgdGhlIHNwZWN1bGFyIGludGVuc2l0eSBidXQgbW9kaWZ5IHRoZSBleGlzdGluZ1xyXG5cdFx0ICogdmFsdWUgaW5zdGVhZCwgdXNlIHtAbGluayBtYXRlcmlhbFNwZWN1bGFySW50ZW5zaXR5fS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGU8ZmxvYXQ+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNwZWN1bGFySW50ZW5zaXR5Tm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc3BlY3VsYXIgY29sb3Igb2YgcGh5c2ljYWwgbWF0ZXJpYWxzIGlzIGJ5IGRlZmF1bHQgaW5mZXJyZWQgZnJvbSB0aGUgYHNwZWN1bGFyQ29sb3JgXHJcblx0XHQgKiBhbmQgYHNwZWN1bGFyQ29sb3JNYXBgIHByb3BlcnRpZXMuIFRoaXMgbm9kZSBwcm9wZXJ0eSBhbGxvd3MgdG8gb3ZlcndyaXRlIHRoZSBkZWZhdWx0XHJcblx0XHQgKiBhbmQgZGVmaW5lIHRoZSBzcGVjdWxhciBjb2xvciB3aXRoIGEgbm9kZSBpbnN0ZWFkLlxyXG5cdFx0ICpcclxuXHRcdCAqIElmIHlvdSBkb24ndCB3YW50IHRvIG92ZXJ3cml0ZSB0aGUgc3BlY3VsYXIgY29sb3IgYnV0IG1vZGlmeSB0aGUgZXhpc3RpbmdcclxuXHRcdCAqIHZhbHVlIGluc3RlYWQsIHVzZSB7QGxpbmsgbWF0ZXJpYWxTcGVjdWxhckNvbG9yfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGU8dmVjMz59XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc3BlY3VsYXJDb2xvck5vZGUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGlvciBvZiBwaHlzaWNhbCBtYXRlcmlhbHMgaXMgYnkgZGVmYXVsdCBpbmZlcnJlZCBmcm9tIHRoZSBgaW9yYFxyXG5cdFx0ICogcHJvcGVydHkuIFRoaXMgbm9kZSBwcm9wZXJ0eSBhbGxvd3MgdG8gb3ZlcndyaXRlIHRoZSBkZWZhdWx0XHJcblx0XHQgKiBhbmQgZGVmaW5lIHRoZSBpb3Igd2l0aCBhIG5vZGUgaW5zdGVhZC5cclxuXHRcdCAqXHJcblx0XHQgKiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBvdmVyd3JpdGUgdGhlIGlvciBidXQgbW9kaWZ5IHRoZSBleGlzdGluZ1xyXG5cdFx0ICogdmFsdWUgaW5zdGVhZCwgdXNlIHtAbGluayBtYXRlcmlhbElPUn0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPGZsb2F0Pn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pb3JOb2RlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB0cmFuc21pc3Npb24gb2YgcGh5c2ljYWwgbWF0ZXJpYWxzIGlzIGJ5IGRlZmF1bHQgaW5mZXJyZWQgZnJvbSB0aGUgYHRyYW5zbWlzc2lvbmAgYW5kXHJcblx0XHQgKiBgdHJhbnNtaXNzaW9uTWFwYCBwcm9wZXJ0aWVzLiBUaGlzIG5vZGUgcHJvcGVydHkgYWxsb3dzIHRvIG92ZXJ3cml0ZSB0aGUgZGVmYXVsdFxyXG5cdFx0ICogYW5kIGRlZmluZSB0aGUgdHJhbnNtaXNzaW9uIHdpdGggYSBub2RlIGluc3RlYWQuXHJcblx0XHQgKlxyXG5cdFx0ICogSWYgeW91IGRvbid0IHdhbnQgdG8gb3ZlcndyaXRlIHRoZSB0cmFuc21pc3Npb24gYnV0IG1vZGlmeSB0aGUgZXhpc3RpbmdcclxuXHRcdCAqIHZhbHVlIGluc3RlYWQsIHVzZSB7QGxpbmsgbWF0ZXJpYWxUcmFuc21pc3Npb259LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Tm9kZTxmbG9hdD59XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudHJhbnNtaXNzaW9uTm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdGhpY2tuZXNzIG9mIHBoeXNpY2FsIG1hdGVyaWFscyBpcyBieSBkZWZhdWx0IGluZmVycmVkIGZyb20gdGhlIGB0aGlja25lc3NgIGFuZFxyXG5cdFx0ICogYHRoaWNrbmVzc01hcGAgcHJvcGVydGllcy4gVGhpcyBub2RlIHByb3BlcnR5IGFsbG93cyB0byBvdmVyd3JpdGUgdGhlIGRlZmF1bHRcclxuXHRcdCAqIGFuZCBkZWZpbmUgdGhlIHRoaWNrbmVzcyB3aXRoIGEgbm9kZSBpbnN0ZWFkLlxyXG5cdFx0ICpcclxuXHRcdCAqIElmIHlvdSBkb24ndCB3YW50IHRvIG92ZXJ3cml0ZSB0aGUgdGhpY2tuZXNzIGJ1dCBtb2RpZnkgdGhlIGV4aXN0aW5nXHJcblx0XHQgKiB2YWx1ZSBpbnN0ZWFkLCB1c2Uge0BsaW5rIG1hdGVyaWFsVGhpY2tuZXNzfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGU8ZmxvYXQ+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRoaWNrbmVzc05vZGUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGF0dGVudWF0aW9uIGRpc3RhbmNlIG9mIHBoeXNpY2FsIG1hdGVyaWFscyBpcyBieSBkZWZhdWx0IGluZmVycmVkIGZyb20gdGhlXHJcblx0XHQgKiBgYXR0ZW51YXRpb25EaXN0YW5jZWAgcHJvcGVydHkuIFRoaXMgbm9kZSBwcm9wZXJ0eSBhbGxvd3MgdG8gb3ZlcndyaXRlIHRoZSBkZWZhdWx0XHJcblx0XHQgKiBhbmQgZGVmaW5lIHRoZSBhdHRlbnVhdGlvbiBkaXN0YW5jZSB3aXRoIGEgbm9kZSBpbnN0ZWFkLlxyXG5cdFx0ICpcclxuXHRcdCAqIElmIHlvdSBkb24ndCB3YW50IHRvIG92ZXJ3cml0ZSB0aGUgYXR0ZW51YXRpb24gZGlzdGFuY2UgYnV0IG1vZGlmeSB0aGUgZXhpc3RpbmdcclxuXHRcdCAqIHZhbHVlIGluc3RlYWQsIHVzZSB7QGxpbmsgbWF0ZXJpYWxBdHRlbnVhdGlvbkRpc3RhbmNlfS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGU8ZmxvYXQ+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmF0dGVudWF0aW9uRGlzdGFuY2VOb2RlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBhdHRlbnVhdGlvbiBjb2xvciBvZiBwaHlzaWNhbCBtYXRlcmlhbHMgaXMgYnkgZGVmYXVsdCBpbmZlcnJlZCBmcm9tIHRoZVxyXG5cdFx0ICogYGF0dGVudWF0aW9uQ29sb3JgIHByb3BlcnR5LiBUaGlzIG5vZGUgcHJvcGVydHkgYWxsb3dzIHRvIG92ZXJ3cml0ZSB0aGUgZGVmYXVsdFxyXG5cdFx0ICogYW5kIGRlZmluZSB0aGUgYXR0ZW51YXRpb24gY29sb3Igd2l0aCBhIG5vZGUgaW5zdGVhZC5cclxuXHRcdCAqXHJcblx0XHQgKiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBvdmVyd3JpdGUgdGhlIGF0dGVudWF0aW9uIGNvbG9yIGJ1dCBtb2RpZnkgdGhlIGV4aXN0aW5nXHJcblx0XHQgKiB2YWx1ZSBpbnN0ZWFkLCB1c2Uge0BsaW5rIG1hdGVyaWFsQXR0ZW51YXRpb25Db2xvcn0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPHZlYzM+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmF0dGVudWF0aW9uQ29sb3JOb2RlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBkaXNwZXJzaW9uIG9mIHBoeXNpY2FsIG1hdGVyaWFscyBpcyBieSBkZWZhdWx0IGluZmVycmVkIGZyb20gdGhlXHJcblx0XHQgKiBgZGlzcGVyc2lvbmAgcHJvcGVydHkuIFRoaXMgbm9kZSBwcm9wZXJ0eSBhbGxvd3MgdG8gb3ZlcndyaXRlIHRoZSBkZWZhdWx0XHJcblx0XHQgKiBhbmQgZGVmaW5lIHRoZSBkaXNwZXJzaW9uIHdpdGggYSBub2RlIGluc3RlYWQuXHJcblx0XHQgKlxyXG5cdFx0ICogSWYgeW91IGRvbid0IHdhbnQgdG8gb3ZlcndyaXRlIHRoZSBkaXNwZXJzaW9uIGJ1dCBtb2RpZnkgdGhlIGV4aXN0aW5nXHJcblx0XHQgKiB2YWx1ZSBpbnN0ZWFkLCB1c2Uge0BsaW5rIG1hdGVyaWFsRGlzcGVyc2lvbn0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPGZsb2F0Pn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kaXNwZXJzaW9uTm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYW5pc290cm9weSBvZiBwaHlzaWNhbCBtYXRlcmlhbHMgaXMgYnkgZGVmYXVsdCBpbmZlcnJlZCBmcm9tIHRoZVxyXG5cdFx0ICogYGFuaXNvdHJvcHlgIHByb3BlcnR5LiBUaGlzIG5vZGUgcHJvcGVydHkgYWxsb3dzIHRvIG92ZXJ3cml0ZSB0aGUgZGVmYXVsdFxyXG5cdFx0ICogYW5kIGRlZmluZSB0aGUgYW5pc290cm9weSB3aXRoIGEgbm9kZSBpbnN0ZWFkLlxyXG5cdFx0ICpcclxuXHRcdCAqIElmIHlvdSBkb24ndCB3YW50IHRvIG92ZXJ3cml0ZSB0aGUgYW5pc290cm9weSBidXQgbW9kaWZ5IHRoZSBleGlzdGluZ1xyXG5cdFx0ICogdmFsdWUgaW5zdGVhZCwgdXNlIHtAbGluayBtYXRlcmlhbEFuaXNvdHJvcHl9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Tm9kZTxmbG9hdD59XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYW5pc290cm9weU5vZGUgPSBudWxsO1xyXG5cclxuXHRcdHRoaXMuc2V0RGVmYXVsdFZhbHVlcyggX2RlZmF1bHRWYWx1ZXMgKTtcclxuXHJcblx0XHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdoZXRoZXIgdGhlIGxpZ2h0aW5nIG1vZGVsIHNob3VsZCB1c2UgY2xlYXJjb2F0IG9yIG5vdC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdCAqIEBkZWZhdWx0IHRydWVcclxuXHQgKi9cclxuXHRnZXQgdXNlQ2xlYXJjb2F0KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmNsZWFyY29hdCA+IDAgfHwgdGhpcy5jbGVhcmNvYXROb2RlICE9PSBudWxsO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdoZXRoZXIgdGhlIGxpZ2h0aW5nIG1vZGVsIHNob3VsZCB1c2UgaXJpZGVzY2VuY2Ugb3Igbm90LlxyXG5cdCAqXHJcblx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdCAqL1xyXG5cdGdldCB1c2VJcmlkZXNjZW5jZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5pcmlkZXNjZW5jZSA+IDAgfHwgdGhpcy5pcmlkZXNjZW5jZU5vZGUgIT09IG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogV2hldGhlciB0aGUgbGlnaHRpbmcgbW9kZWwgc2hvdWxkIHVzZSBzaGVlbiBvciBub3QuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0ICovXHJcblx0Z2V0IHVzZVNoZWVuKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnNoZWVuID4gMCB8fCB0aGlzLnNoZWVuTm9kZSAhPT0gbnVsbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBXaGV0aGVyIHRoZSBsaWdodGluZyBtb2RlbCBzaG91bGQgdXNlIGFuaXNvdHJvcHkgb3Igbm90LlxyXG5cdCAqXHJcblx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdCAqL1xyXG5cdGdldCB1c2VBbmlzb3Ryb3B5KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmFuaXNvdHJvcHkgPiAwIHx8IHRoaXMuYW5pc290cm9weU5vZGUgIT09IG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogV2hldGhlciB0aGUgbGlnaHRpbmcgbW9kZWwgc2hvdWxkIHVzZSB0cmFuc21pc3Npb24gb3Igbm90LlxyXG5cdCAqXHJcblx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdCAqL1xyXG5cdGdldCB1c2VUcmFuc21pc3Npb24oKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMudHJhbnNtaXNzaW9uID4gMCB8fCB0aGlzLnRyYW5zbWlzc2lvbk5vZGUgIT09IG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogV2hldGhlciB0aGUgbGlnaHRpbmcgbW9kZWwgc2hvdWxkIHVzZSBkaXNwZXJzaW9uIG9yIG5vdC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdCAqIEBkZWZhdWx0IHRydWVcclxuXHQgKi9cclxuXHRnZXQgdXNlRGlzcGVyc2lvbigpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5kaXNwZXJzaW9uID4gMCB8fCB0aGlzLmRpc3BlcnNpb25Ob2RlICE9PSBudWxsO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHVwcyB0aGUgc3BlY3VsYXIgcmVsYXRlZCBub2RlIHZhcmlhYmxlcy5cclxuXHQgKi9cclxuXHRzZXR1cFNwZWN1bGFyKCkge1xyXG5cclxuXHRcdGNvbnN0IGlvck5vZGUgPSB0aGlzLmlvck5vZGUgPyBmbG9hdCggdGhpcy5pb3JOb2RlICkgOiBtYXRlcmlhbElPUjtcclxuXHJcblx0XHRpb3IuYXNzaWduKCBpb3JOb2RlICk7XHJcblx0XHRzcGVjdWxhckNvbG9yLmFzc2lnbiggbWl4KCBtaW4oIHBvdzIoIGlvci5zdWIoIDEuMCApLmRpdiggaW9yLmFkZCggMS4wICkgKSApLm11bCggbWF0ZXJpYWxTcGVjdWxhckNvbG9yICksIHZlYzMoIDEuMCApICkubXVsKCBtYXRlcmlhbFNwZWN1bGFySW50ZW5zaXR5ICksIGRpZmZ1c2VDb2xvci5yZ2IsIG1ldGFsbmVzcyApICk7XHJcblx0XHRzcGVjdWxhckY5MC5hc3NpZ24oIG1peCggbWF0ZXJpYWxTcGVjdWxhckludGVuc2l0eSwgMS4wLCBtZXRhbG5lc3MgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHVwcyB0aGUgbGlnaHRpbmcgbW9kZWwuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtQaHlzaWNhbExpZ2h0aW5nTW9kZWx9IFRoZSBsaWdodGluZyBtb2RlbC5cclxuXHQgKi9cclxuXHRzZXR1cExpZ2h0aW5nTW9kZWwoIC8qYnVpbGRlciovICkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgUGh5c2ljYWxMaWdodGluZ01vZGVsKCB0aGlzLnVzZUNsZWFyY29hdCwgdGhpcy51c2VTaGVlbiwgdGhpcy51c2VJcmlkZXNjZW5jZSwgdGhpcy51c2VBbmlzb3Ryb3B5LCB0aGlzLnVzZVRyYW5zbWlzc2lvbiwgdGhpcy51c2VEaXNwZXJzaW9uICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0dXBzIHRoZSBwaHlzaWNhbCBzcGVjaWZpYyBub2RlIHZhcmlhYmxlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICovXHJcblx0c2V0dXBWYXJpYW50cyggYnVpbGRlciApIHtcclxuXHJcblx0XHRzdXBlci5zZXR1cFZhcmlhbnRzKCBidWlsZGVyICk7XHJcblxyXG5cdFx0Ly8gQ0xFQVJDT0FUXHJcblxyXG5cdFx0aWYgKCB0aGlzLnVzZUNsZWFyY29hdCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGNsZWFyY29hdE5vZGUgPSB0aGlzLmNsZWFyY29hdE5vZGUgPyBmbG9hdCggdGhpcy5jbGVhcmNvYXROb2RlICkgOiBtYXRlcmlhbENsZWFyY29hdDtcclxuXHRcdFx0Y29uc3QgY2xlYXJjb2F0Um91Z2huZXNzTm9kZSA9IHRoaXMuY2xlYXJjb2F0Um91Z2huZXNzTm9kZSA/IGZsb2F0KCB0aGlzLmNsZWFyY29hdFJvdWdobmVzc05vZGUgKSA6IG1hdGVyaWFsQ2xlYXJjb2F0Um91Z2huZXNzO1xyXG5cclxuXHRcdFx0Y2xlYXJjb2F0LmFzc2lnbiggY2xlYXJjb2F0Tm9kZSApO1xyXG5cdFx0XHRjbGVhcmNvYXRSb3VnaG5lc3MuYXNzaWduKCBnZXRSb3VnaG5lc3MoIHsgcm91Z2huZXNzOiBjbGVhcmNvYXRSb3VnaG5lc3NOb2RlIH0gKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBTSEVFTlxyXG5cclxuXHRcdGlmICggdGhpcy51c2VTaGVlbiApIHtcclxuXHJcblx0XHRcdGNvbnN0IHNoZWVuTm9kZSA9IHRoaXMuc2hlZW5Ob2RlID8gdmVjMyggdGhpcy5zaGVlbk5vZGUgKSA6IG1hdGVyaWFsU2hlZW47XHJcblx0XHRcdGNvbnN0IHNoZWVuUm91Z2huZXNzTm9kZSA9IHRoaXMuc2hlZW5Sb3VnaG5lc3NOb2RlID8gZmxvYXQoIHRoaXMuc2hlZW5Sb3VnaG5lc3NOb2RlICkgOiBtYXRlcmlhbFNoZWVuUm91Z2huZXNzO1xyXG5cclxuXHRcdFx0c2hlZW4uYXNzaWduKCBzaGVlbk5vZGUgKTtcclxuXHRcdFx0c2hlZW5Sb3VnaG5lc3MuYXNzaWduKCBzaGVlblJvdWdobmVzc05vZGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gSVJJREVTQ0VOQ0VcclxuXHJcblx0XHRpZiAoIHRoaXMudXNlSXJpZGVzY2VuY2UgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBpcmlkZXNjZW5jZU5vZGUgPSB0aGlzLmlyaWRlc2NlbmNlTm9kZSA/IGZsb2F0KCB0aGlzLmlyaWRlc2NlbmNlTm9kZSApIDogbWF0ZXJpYWxJcmlkZXNjZW5jZTtcclxuXHRcdFx0Y29uc3QgaXJpZGVzY2VuY2VJT1JOb2RlID0gdGhpcy5pcmlkZXNjZW5jZUlPUk5vZGUgPyBmbG9hdCggdGhpcy5pcmlkZXNjZW5jZUlPUk5vZGUgKSA6IG1hdGVyaWFsSXJpZGVzY2VuY2VJT1I7XHJcblx0XHRcdGNvbnN0IGlyaWRlc2NlbmNlVGhpY2tuZXNzTm9kZSA9IHRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NOb2RlID8gZmxvYXQoIHRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NOb2RlICkgOiBtYXRlcmlhbElyaWRlc2NlbmNlVGhpY2tuZXNzO1xyXG5cclxuXHRcdFx0aXJpZGVzY2VuY2UuYXNzaWduKCBpcmlkZXNjZW5jZU5vZGUgKTtcclxuXHRcdFx0aXJpZGVzY2VuY2VJT1IuYXNzaWduKCBpcmlkZXNjZW5jZUlPUk5vZGUgKTtcclxuXHRcdFx0aXJpZGVzY2VuY2VUaGlja25lc3MuYXNzaWduKCBpcmlkZXNjZW5jZVRoaWNrbmVzc05vZGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQU5JU09UUk9QWVxyXG5cclxuXHRcdGlmICggdGhpcy51c2VBbmlzb3Ryb3B5ICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYW5pc290cm9weVYgPSAoIHRoaXMuYW5pc290cm9weU5vZGUgPyB2ZWMyKCB0aGlzLmFuaXNvdHJvcHlOb2RlICkgOiBtYXRlcmlhbEFuaXNvdHJvcHkgKS50b1ZhcigpO1xyXG5cclxuXHRcdFx0YW5pc290cm9weS5hc3NpZ24oIGFuaXNvdHJvcHlWLmxlbmd0aCgpICk7XHJcblxyXG5cdFx0XHRJZiggYW5pc290cm9weS5lcXVhbCggMC4wICksICgpID0+IHtcclxuXHJcblx0XHRcdFx0YW5pc290cm9weVYuYXNzaWduKCB2ZWMyKCAxLjAsIDAuMCApICk7XHJcblxyXG5cdFx0XHR9ICkuRWxzZSggKCkgPT4ge1xyXG5cclxuXHRcdFx0XHRhbmlzb3Ryb3B5Vi5kaXZBc3NpZ24oIHZlYzIoIGFuaXNvdHJvcHkgKSApO1xyXG5cdFx0XHRcdGFuaXNvdHJvcHkuYXNzaWduKCBhbmlzb3Ryb3B5LnNhdHVyYXRlKCkgKTtcclxuXHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHRcdC8vIFJvdWdobmVzcyBhbG9uZyB0aGUgYW5pc290cm9weSBiaXRhbmdlbnQgaXMgdGhlIG1hdGVyaWFsIHJvdWdobmVzcywgd2hpbGUgdGhlIHRhbmdlbnQgcm91Z2huZXNzIGluY3JlYXNlcyB3aXRoIGFuaXNvdHJvcHkuXHJcblx0XHRcdGFscGhhVC5hc3NpZ24oIGFuaXNvdHJvcHkucG93MigpLm1peCggcm91Z2huZXNzLnBvdzIoKSwgMS4wICkgKTtcclxuXHJcblx0XHRcdGFuaXNvdHJvcHlULmFzc2lnbiggVEJOVmlld01hdHJpeFsgMCBdLm11bCggYW5pc290cm9weVYueCApLmFkZCggVEJOVmlld01hdHJpeFsgMSBdLm11bCggYW5pc290cm9weVYueSApICkgKTtcclxuXHRcdFx0YW5pc290cm9weUIuYXNzaWduKCBUQk5WaWV3TWF0cml4WyAxIF0ubXVsKCBhbmlzb3Ryb3B5Vi54ICkuc3ViKCBUQk5WaWV3TWF0cml4WyAwIF0ubXVsKCBhbmlzb3Ryb3B5Vi55ICkgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBUUkFOU01JU1NJT05cclxuXHJcblx0XHRpZiAoIHRoaXMudXNlVHJhbnNtaXNzaW9uICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdHJhbnNtaXNzaW9uTm9kZSA9IHRoaXMudHJhbnNtaXNzaW9uTm9kZSA/IGZsb2F0KCB0aGlzLnRyYW5zbWlzc2lvbk5vZGUgKSA6IG1hdGVyaWFsVHJhbnNtaXNzaW9uO1xyXG5cdFx0XHRjb25zdCB0aGlja25lc3NOb2RlID0gdGhpcy50aGlja25lc3NOb2RlID8gZmxvYXQoIHRoaXMudGhpY2tuZXNzTm9kZSApIDogbWF0ZXJpYWxUaGlja25lc3M7XHJcblx0XHRcdGNvbnN0IGF0dGVudWF0aW9uRGlzdGFuY2VOb2RlID0gdGhpcy5hdHRlbnVhdGlvbkRpc3RhbmNlTm9kZSA/IGZsb2F0KCB0aGlzLmF0dGVudWF0aW9uRGlzdGFuY2VOb2RlICkgOiBtYXRlcmlhbEF0dGVudWF0aW9uRGlzdGFuY2U7XHJcblx0XHRcdGNvbnN0IGF0dGVudWF0aW9uQ29sb3JOb2RlID0gdGhpcy5hdHRlbnVhdGlvbkNvbG9yTm9kZSA/IHZlYzMoIHRoaXMuYXR0ZW51YXRpb25Db2xvck5vZGUgKSA6IG1hdGVyaWFsQXR0ZW51YXRpb25Db2xvcjtcclxuXHJcblx0XHRcdHRyYW5zbWlzc2lvbi5hc3NpZ24oIHRyYW5zbWlzc2lvbk5vZGUgKTtcclxuXHRcdFx0dGhpY2tuZXNzLmFzc2lnbiggdGhpY2tuZXNzTm9kZSApO1xyXG5cdFx0XHRhdHRlbnVhdGlvbkRpc3RhbmNlLmFzc2lnbiggYXR0ZW51YXRpb25EaXN0YW5jZU5vZGUgKTtcclxuXHRcdFx0YXR0ZW51YXRpb25Db2xvci5hc3NpZ24oIGF0dGVudWF0aW9uQ29sb3JOb2RlICk7XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMudXNlRGlzcGVyc2lvbiApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgZGlzcGVyc2lvbk5vZGUgPSB0aGlzLmRpc3BlcnNpb25Ob2RlID8gZmxvYXQoIHRoaXMuZGlzcGVyc2lvbk5vZGUgKSA6IG1hdGVyaWFsRGlzcGVyc2lvbjtcclxuXHJcblx0XHRcdFx0ZGlzcGVyc2lvbi5hc3NpZ24oIGRpc3BlcnNpb25Ob2RlICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHVwcyB0aGUgY2xlYXJjb2F0IG5vcm1hbCBub2RlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Tm9kZTx2ZWMzPn0gVGhlIGNsZWFyY29hdCBub3JtYWwuXHJcblx0ICovXHJcblx0c2V0dXBDbGVhcmNvYXROb3JtYWwoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuY2xlYXJjb2F0Tm9ybWFsTm9kZSA/IHZlYzMoIHRoaXMuY2xlYXJjb2F0Tm9ybWFsTm9kZSApIDogbWF0ZXJpYWxDbGVhcmNvYXROb3JtYWw7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXAoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0YnVpbGRlci5jb250ZXh0LnNldHVwQ2xlYXJjb2F0Tm9ybWFsID0gKCkgPT4gdGhpcy5zZXR1cENsZWFyY29hdE5vcm1hbCggYnVpbGRlciApO1xyXG5cclxuXHRcdHN1cGVyLnNldHVwKCBidWlsZGVyICk7XHJcblxyXG5cdH1cclxuXHJcblx0Y29weSggc291cmNlICkge1xyXG5cclxuXHRcdHRoaXMuY2xlYXJjb2F0Tm9kZSA9IHNvdXJjZS5jbGVhcmNvYXROb2RlO1xyXG5cdFx0dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3NOb2RlID0gc291cmNlLmNsZWFyY29hdFJvdWdobmVzc05vZGU7XHJcblx0XHR0aGlzLmNsZWFyY29hdE5vcm1hbE5vZGUgPSBzb3VyY2UuY2xlYXJjb2F0Tm9ybWFsTm9kZTtcclxuXHJcblx0XHR0aGlzLnNoZWVuTm9kZSA9IHNvdXJjZS5zaGVlbk5vZGU7XHJcblx0XHR0aGlzLnNoZWVuUm91Z2huZXNzTm9kZSA9IHNvdXJjZS5zaGVlblJvdWdobmVzc05vZGU7XHJcblxyXG5cdFx0dGhpcy5pcmlkZXNjZW5jZU5vZGUgPSBzb3VyY2UuaXJpZGVzY2VuY2VOb2RlO1xyXG5cdFx0dGhpcy5pcmlkZXNjZW5jZUlPUk5vZGUgPSBzb3VyY2UuaXJpZGVzY2VuY2VJT1JOb2RlO1xyXG5cdFx0dGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc05vZGUgPSBzb3VyY2UuaXJpZGVzY2VuY2VUaGlja25lc3NOb2RlO1xyXG5cclxuXHRcdHRoaXMuc3BlY3VsYXJJbnRlbnNpdHlOb2RlID0gc291cmNlLnNwZWN1bGFySW50ZW5zaXR5Tm9kZTtcclxuXHRcdHRoaXMuc3BlY3VsYXJDb2xvck5vZGUgPSBzb3VyY2Uuc3BlY3VsYXJDb2xvck5vZGU7XHJcblxyXG5cdFx0dGhpcy50cmFuc21pc3Npb25Ob2RlID0gc291cmNlLnRyYW5zbWlzc2lvbk5vZGU7XHJcblx0XHR0aGlzLnRoaWNrbmVzc05vZGUgPSBzb3VyY2UudGhpY2tuZXNzTm9kZTtcclxuXHRcdHRoaXMuYXR0ZW51YXRpb25EaXN0YW5jZU5vZGUgPSBzb3VyY2UuYXR0ZW51YXRpb25EaXN0YW5jZU5vZGU7XHJcblx0XHR0aGlzLmF0dGVudWF0aW9uQ29sb3JOb2RlID0gc291cmNlLmF0dGVudWF0aW9uQ29sb3JOb2RlO1xyXG5cdFx0dGhpcy5kaXNwZXJzaW9uTm9kZSA9IHNvdXJjZS5kaXNwZXJzaW9uTm9kZTtcclxuXHJcblx0XHR0aGlzLmFuaXNvdHJvcHlOb2RlID0gc291cmNlLmFuaXNvdHJvcHlOb2RlO1xyXG5cclxuXHRcdHJldHVybiBzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTWVzaFBoeXNpY2FsTm9kZU1hdGVyaWFsO1xyXG4iLCJpbXBvcnQgTWVzaFBoeXNpY2FsTm9kZU1hdGVyaWFsIGZyb20gJy4vTWVzaFBoeXNpY2FsTm9kZU1hdGVyaWFsLmpzJztcclxuaW1wb3J0IFBoeXNpY2FsTGlnaHRpbmdNb2RlbCBmcm9tICcuLi8uLi9ub2Rlcy9mdW5jdGlvbnMvUGh5c2ljYWxMaWdodGluZ01vZGVsLmpzJztcclxuaW1wb3J0IHsgdHJhbnNmb3JtZWROb3JtYWxWaWV3IH0gZnJvbSAnLi4vLi4vbm9kZXMvYWNjZXNzb3JzL05vcm1hbC5qcyc7XHJcbmltcG9ydCB7IHBvc2l0aW9uVmlld0RpcmVjdGlvbiB9IGZyb20gJy4uLy4uL25vZGVzL2FjY2Vzc29ycy9Qb3NpdGlvbi5qcyc7XHJcbmltcG9ydCB7IGZsb2F0LCB2ZWMzIH0gZnJvbSAnLi4vLi4vbm9kZXMvdHNsL1RTTEJhc2UuanMnO1xyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgdGhlIGxpZ2h0aW5nIG1vZGVsIGZvciB7QGxpbmsgTWVzaFNTU05vZGVNYXRlcmlhbH0uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBQaHlzaWNhbExpZ2h0aW5nTW9kZWxcclxuICovXHJcbmNsYXNzIFNTU0xpZ2h0aW5nTW9kZWwgZXh0ZW5kcyBQaHlzaWNhbExpZ2h0aW5nTW9kZWwge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHBoeXNpY2FsIGxpZ2h0aW5nIG1vZGVsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbY2xlYXJjb2F0PWZhbHNlXSAtIFdoZXRoZXIgY2xlYXJjb2F0IGlzIHN1cHBvcnRlZCBvciBub3QuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbc2hlZW49ZmFsc2VdIC0gV2hldGhlciBzaGVlbiBpcyBzdXBwb3J0ZWQgb3Igbm90LlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lyaWRlc2NlbmNlPWZhbHNlXSAtIFdoZXRoZXIgaXJpZGVzY2VuY2UgaXMgc3VwcG9ydGVkIG9yIG5vdC5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFthbmlzb3Ryb3B5PWZhbHNlXSAtIFdoZXRoZXIgYW5pc290cm9weSBpcyBzdXBwb3J0ZWQgb3Igbm90LlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW3RyYW5zbWlzc2lvbj1mYWxzZV0gLSBXaGV0aGVyIHRyYW5zbWlzc2lvbiBpcyBzdXBwb3J0ZWQgb3Igbm90LlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Rpc3BlcnNpb249ZmFsc2VdIC0gV2hldGhlciBkaXNwZXJzaW9uIGlzIHN1cHBvcnRlZCBvciBub3QuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbc3NzPWZhbHNlXSAtIFdoZXRoZXIgU1NTIGlzIHN1cHBvcnRlZCBvciBub3QuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGNsZWFyY29hdCA9IGZhbHNlLCBzaGVlbiA9IGZhbHNlLCBpcmlkZXNjZW5jZSA9IGZhbHNlLCBhbmlzb3Ryb3B5ID0gZmFsc2UsIHRyYW5zbWlzc2lvbiA9IGZhbHNlLCBkaXNwZXJzaW9uID0gZmFsc2UsIHNzcyA9IGZhbHNlICkge1xyXG5cclxuXHRcdHN1cGVyKCBjbGVhcmNvYXQsIHNoZWVuLCBpcmlkZXNjZW5jZSwgYW5pc290cm9weSwgdHJhbnNtaXNzaW9uLCBkaXNwZXJzaW9uICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSBsaWdodGluZyBtb2RlbCBzaG91bGQgdXNlIFNTUyBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVzZVNTUyA9IHNzcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFeHRlbmRzIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHdpdGggYSBTU1MgdGVybS5cclxuXHQgKlxyXG5cdCAqIFJlZmVyZW5jZTogW0FwcHJveGltYXRpbmcgVHJhbnNsdWNlbmN5IGZvciBhIEZhc3QsIENoZWFwIGFuZCBDb252aW5jaW5nIFN1YnN1cmZhY2UgU2NhdHRlcmluZyBMb29rXXtAbGluayBodHRwczovL2NvbGluYmFycmVicmlzZWJvaXMuY29tLzIwMTEvMDMvMDcvZ2RjLTIwMTEtYXBwcm94aW1hdGluZy10cmFuc2x1Y2VuY3ktZm9yLWEtZmFzdC1jaGVhcC1hbmQtY29udmluY2luZy1zdWJzdXJmYWNlLXNjYXR0ZXJpbmctbG9vay99XHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gaW5wdXQgLSBUaGUgaW5wdXQgZGF0YS5cclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqL1xyXG5cdGRpcmVjdCggeyBsaWdodERpcmVjdGlvbiwgbGlnaHRDb2xvciwgcmVmbGVjdGVkTGlnaHQgfSwgYnVpbGRlciApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMudXNlU1NTID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0Y29uc3QgbWF0ZXJpYWwgPSBidWlsZGVyLm1hdGVyaWFsO1xyXG5cclxuXHRcdFx0Y29uc3QgeyB0aGlja25lc3NDb2xvck5vZGUsIHRoaWNrbmVzc0Rpc3RvcnRpb25Ob2RlLCB0aGlja25lc3NBbWJpZW50Tm9kZSwgdGhpY2tuZXNzQXR0ZW51YXRpb25Ob2RlLCB0aGlja25lc3NQb3dlck5vZGUsIHRoaWNrbmVzc1NjYWxlTm9kZSB9ID0gbWF0ZXJpYWw7XHJcblxyXG5cdFx0XHRjb25zdCBzY2F0dGVyaW5nSGFsZiA9IGxpZ2h0RGlyZWN0aW9uLmFkZCggdHJhbnNmb3JtZWROb3JtYWxWaWV3Lm11bCggdGhpY2tuZXNzRGlzdG9ydGlvbk5vZGUgKSApLm5vcm1hbGl6ZSgpO1xyXG5cdFx0XHRjb25zdCBzY2F0dGVyaW5nRG90ID0gZmxvYXQoIHBvc2l0aW9uVmlld0RpcmVjdGlvbi5kb3QoIHNjYXR0ZXJpbmdIYWxmLm5lZ2F0ZSgpICkuc2F0dXJhdGUoKS5wb3coIHRoaWNrbmVzc1Bvd2VyTm9kZSApLm11bCggdGhpY2tuZXNzU2NhbGVOb2RlICkgKTtcclxuXHRcdFx0Y29uc3Qgc2NhdHRlcmluZ0lsbHUgPSB2ZWMzKCBzY2F0dGVyaW5nRG90LmFkZCggdGhpY2tuZXNzQW1iaWVudE5vZGUgKS5tdWwoIHRoaWNrbmVzc0NvbG9yTm9kZSApICk7XHJcblxyXG5cdFx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlLmFkZEFzc2lnbiggc2NhdHRlcmluZ0lsbHUubXVsKCB0aGlja25lc3NBdHRlbnVhdGlvbk5vZGUubXVsKCBsaWdodENvbG9yICkgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRzdXBlci5kaXJlY3QoIHsgbGlnaHREaXJlY3Rpb24sIGxpZ2h0Q29sb3IsIHJlZmxlY3RlZExpZ2h0IH0sIGJ1aWxkZXIgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFRoaXMgbm9kZSBtYXRlcmlhbCBpcyBhbiBleHBlcmltZW50YWwgZXh0ZW5zaW9uIG9mIHtAbGluayBNZXNoUGh5c2ljYWxOb2RlTWF0ZXJpYWx9XHJcbiAqIHRoYXQgaW1wbGVtZW50cyBhIFN1YnN1cmZhY2Ugc2NhdHRlcmluZyAoU1NTKSB0ZXJtLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTWVzaFBoeXNpY2FsTm9kZU1hdGVyaWFsXHJcbiAqL1xyXG5jbGFzcyBNZXNoU1NTTm9kZU1hdGVyaWFsIGV4dGVuZHMgTWVzaFBoeXNpY2FsTm9kZU1hdGVyaWFsIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnTWVzaFNTU05vZGVNYXRlcmlhbCc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBtZXNoIFNTUyBub2RlIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbWV0ZXJzXSAtIFRoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVycyApIHtcclxuXHJcblx0XHRzdXBlciggcGFyYW1ldGVycyApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVwcmVzZW50cyB0aGUgdGhpY2tuZXNzIGNvbG9yLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Tm9kZTx2ZWMzPn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50aGlja25lc3NDb2xvck5vZGUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVwcmVzZW50cyB0aGUgZGlzdG9ydGlvbiBmYWN0b3IuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPGZsb2F0Pn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50aGlja25lc3NEaXN0b3J0aW9uTm9kZSA9IGZsb2F0KCAwLjEgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlcHJlc2VudHMgdGhlIHRoaWNrbmVzcyBhbWJpZW50IGZhY3Rvci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGU8ZmxvYXQ+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRoaWNrbmVzc0FtYmllbnROb2RlID0gZmxvYXQoIDAuMCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVwcmVzZW50cyB0aGUgdGhpY2tuZXNzIGF0dGVudWF0aW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Tm9kZTxmbG9hdD59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudGhpY2tuZXNzQXR0ZW51YXRpb25Ob2RlID0gZmxvYXQoIC4xICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXByZXNlbnRzIHRoZSB0aGlja25lc3MgcG93ZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPGZsb2F0Pn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50aGlja25lc3NQb3dlck5vZGUgPSBmbG9hdCggMi4wICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXByZXNlbnRzIHRoZSB0aGlja25lc3Mgc2NhbGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPGZsb2F0Pn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50aGlja25lc3NTY2FsZU5vZGUgPSBmbG9hdCggMTAuMCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdoZXRoZXIgdGhlIGxpZ2h0aW5nIG1vZGVsIHNob3VsZCB1c2UgU1NTIG9yIG5vdC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdCAqIEBkZWZhdWx0IHRydWVcclxuXHQgKi9cclxuXHRnZXQgdXNlU1NTKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnRoaWNrbmVzc0NvbG9yTm9kZSAhPT0gbnVsbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXR1cHMgdGhlIGxpZ2h0aW5nIG1vZGVsLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7U1NTTGlnaHRpbmdNb2RlbH0gVGhlIGxpZ2h0aW5nIG1vZGVsLlxyXG5cdCAqL1xyXG5cdHNldHVwTGlnaHRpbmdNb2RlbCggLypidWlsZGVyKi8gKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBTU1NMaWdodGluZ01vZGVsKCB0aGlzLnVzZUNsZWFyY29hdCwgdGhpcy51c2VTaGVlbiwgdGhpcy51c2VJcmlkZXNjZW5jZSwgdGhpcy51c2VBbmlzb3Ryb3B5LCB0aGlzLnVzZVRyYW5zbWlzc2lvbiwgdGhpcy51c2VEaXNwZXJzaW9uLCB0aGlzLnVzZVNTUyApO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSApIHtcclxuXHJcblx0XHR0aGlzLnRoaWNrbmVzc0NvbG9yTm9kZSA9IHNvdXJjZS50aGlja25lc3NDb2xvck5vZGU7XHJcblx0XHR0aGlzLnRoaWNrbmVzc0Rpc3RvcnRpb25Ob2RlID0gc291cmNlLnRoaWNrbmVzc0Rpc3RvcnRpb25Ob2RlO1xyXG5cdFx0dGhpcy50aGlja25lc3NBbWJpZW50Tm9kZSA9IHNvdXJjZS50aGlja25lc3NBbWJpZW50Tm9kZTtcclxuXHRcdHRoaXMudGhpY2tuZXNzQXR0ZW51YXRpb25Ob2RlID0gc291cmNlLnRoaWNrbmVzc0F0dGVudWF0aW9uTm9kZTtcclxuXHRcdHRoaXMudGhpY2tuZXNzUG93ZXJOb2RlID0gc291cmNlLnRoaWNrbmVzc1Bvd2VyTm9kZTtcclxuXHRcdHRoaXMudGhpY2tuZXNzU2NhbGVOb2RlID0gc291cmNlLnRoaWNrbmVzc1NjYWxlTm9kZTtcclxuXHJcblx0XHRyZXR1cm4gc3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IE1lc2hTU1NOb2RlTWF0ZXJpYWw7XHJcbiIsImltcG9ydCBMaWdodGluZ01vZGVsIGZyb20gJy4uL2NvcmUvTGlnaHRpbmdNb2RlbC5qcyc7XHJcbmltcG9ydCBCUkRGX0xhbWJlcnQgZnJvbSAnLi9CU0RGL0JSREZfTGFtYmVydC5qcyc7XHJcbmltcG9ydCB7IGRpZmZ1c2VDb2xvciB9IGZyb20gJy4uL2NvcmUvUHJvcGVydHlOb2RlLmpzJztcclxuaW1wb3J0IHsgbm9ybWFsR2VvbWV0cnkgfSBmcm9tICcuLi9hY2Nlc3NvcnMvTm9ybWFsLmpzJztcclxuaW1wb3J0IHsgRm4sIGZsb2F0LCB2ZWMyLCB2ZWMzIH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5pbXBvcnQgeyBtaXgsIHNtb290aHN0ZXAgfSBmcm9tICcuLi9tYXRoL01hdGhOb2RlLmpzJztcclxuaW1wb3J0IHsgbWF0ZXJpYWxSZWZlcmVuY2UgfSBmcm9tICcuLi9hY2Nlc3NvcnMvTWF0ZXJpYWxSZWZlcmVuY2VOb2RlLmpzJztcclxuXHJcbmNvbnN0IGdldEdyYWRpZW50SXJyYWRpYW5jZSA9IC8qQF9fUFVSRV9fKi8gRm4oICggeyBub3JtYWwsIGxpZ2h0RGlyZWN0aW9uLCBidWlsZGVyIH0gKSA9PiB7XHJcblxyXG5cdC8vIGRvdE5MIHdpbGwgYmUgZnJvbSAtMS4wIHRvIDEuMFxyXG5cdGNvbnN0IGRvdE5MID0gbm9ybWFsLmRvdCggbGlnaHREaXJlY3Rpb24gKTtcclxuXHRjb25zdCBjb29yZCA9IHZlYzIoIGRvdE5MLm11bCggMC41ICkuYWRkKCAwLjUgKSwgMC4wICk7XHJcblxyXG5cdGlmICggYnVpbGRlci5tYXRlcmlhbC5ncmFkaWVudE1hcCApIHtcclxuXHJcblx0XHRjb25zdCBncmFkaWVudE1hcCA9IG1hdGVyaWFsUmVmZXJlbmNlKCAnZ3JhZGllbnRNYXAnLCAndGV4dHVyZScgKS5jb250ZXh0KCB7IGdldFVWOiAoKSA9PiBjb29yZCB9ICk7XHJcblxyXG5cdFx0cmV0dXJuIHZlYzMoIGdyYWRpZW50TWFwLnIgKTtcclxuXHJcblx0fSBlbHNlIHtcclxuXHJcblx0XHRjb25zdCBmdyA9IGNvb3JkLmZ3aWR0aCgpLm11bCggMC41ICk7XHJcblxyXG5cdFx0cmV0dXJuIG1peCggdmVjMyggMC43ICksIHZlYzMoIDEuMCApLCBzbW9vdGhzdGVwKCBmbG9hdCggMC43ICkuc3ViKCBmdy54ICksIGZsb2F0KCAwLjcgKS5hZGQoIGZ3LnggKSwgY29vcmQueCApICk7XHJcblxyXG5cdH1cclxuXHJcbn0gKTtcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIHRoZSBsaWdodGluZyBtb2RlbCBmb3IgYSB0b29uIG1hdGVyaWFsLiBVc2VkIGluIHtAbGluayBNZXNoVG9vbk5vZGVNYXRlcmlhbH0uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBMaWdodGluZ01vZGVsXHJcbiAqL1xyXG5jbGFzcyBUb29uTGlnaHRpbmdNb2RlbCBleHRlbmRzIExpZ2h0aW5nTW9kZWwge1xyXG5cclxuXHQvKipcclxuXHQgKiBJbXBsZW1lbnRzIHRoZSBkaXJlY3QgbGlnaHRpbmcuIEluc3RlYWQgb2YgdXNpbmcgYSBjb252ZW50aW9uYWwgc21vb3RoIGlycmFkaWFuY2UsIHRoZSBpcnJhZGlhbmNlIGlzXHJcblx0ICogcmVkdWNlZCB0byBhIHNtYWxsIG51bWJlciBvZiBkaXNjcmV0ZSBzaGFkZXMgdG8gY3JlYXRlIGEgY29taWMtbGlrZSwgZmxhdCBsb29rLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGxpZ2h0RGF0YSAtIFRoZSBsaWdodCBkYXRhLlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICovXHJcblx0ZGlyZWN0KCB7IGxpZ2h0RGlyZWN0aW9uLCBsaWdodENvbG9yLCByZWZsZWN0ZWRMaWdodCB9LCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IGlycmFkaWFuY2UgPSBnZXRHcmFkaWVudElycmFkaWFuY2UoIHsgbm9ybWFsOiBub3JtYWxHZW9tZXRyeSwgbGlnaHREaXJlY3Rpb24sIGJ1aWxkZXIgfSApLm11bCggbGlnaHRDb2xvciApO1xyXG5cclxuXHRcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UuYWRkQXNzaWduKCBpcnJhZGlhbmNlLm11bCggQlJERl9MYW1iZXJ0KCB7IGRpZmZ1c2VDb2xvcjogZGlmZnVzZUNvbG9yLnJnYiB9ICkgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEltcGxlbWVudHMgdGhlIGluZGlyZWN0IGxpZ2h0aW5nLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKi9cclxuXHRpbmRpcmVjdCggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCB7IGFtYmllbnRPY2NsdXNpb24sIGlycmFkaWFuY2UsIHJlZmxlY3RlZExpZ2h0IH0gPSBidWlsZGVyLmNvbnRleHQ7XHJcblxyXG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlLmFkZEFzc2lnbiggaXJyYWRpYW5jZS5tdWwoIEJSREZfTGFtYmVydCggeyBkaWZmdXNlQ29sb3IgfSApICkgKTtcclxuXHJcblx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UubXVsQXNzaWduKCBhbWJpZW50T2NjbHVzaW9uICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFRvb25MaWdodGluZ01vZGVsO1xyXG4iLCJpbXBvcnQgTm9kZU1hdGVyaWFsIGZyb20gJy4vTm9kZU1hdGVyaWFsLmpzJztcclxuaW1wb3J0IFRvb25MaWdodGluZ01vZGVsIGZyb20gJy4uLy4uL25vZGVzL2Z1bmN0aW9ucy9Ub29uTGlnaHRpbmdNb2RlbC5qcyc7XHJcblxyXG5pbXBvcnQgeyBNZXNoVG9vbk1hdGVyaWFsIH0gZnJvbSAnLi4vTWVzaFRvb25NYXRlcmlhbC5qcyc7XHJcblxyXG5jb25zdCBfZGVmYXVsdFZhbHVlcyA9IC8qQF9fUFVSRV9fKi8gbmV3IE1lc2hUb29uTWF0ZXJpYWwoKTtcclxuXHJcbi8qKlxyXG4gKiBOb2RlIG1hdGVyaWFsIHZlcnNpb24gb2Yge0BsaW5rIE1lc2hUb29uTWF0ZXJpYWx9LlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTm9kZU1hdGVyaWFsXHJcbiAqL1xyXG5jbGFzcyBNZXNoVG9vbk5vZGVNYXRlcmlhbCBleHRlbmRzIE5vZGVNYXRlcmlhbCB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ01lc2hUb29uTm9kZU1hdGVyaWFsJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG1lc2ggdG9vbiBub2RlIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbWV0ZXJzXSAtIFRoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVycyApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc01lc2hUb29uTm9kZU1hdGVyaWFsID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNldCB0byBgdHJ1ZWAgYmVjYXVzZSB0b29uIG1hdGVyaWFscyByZWFjdCBvbiBsaWdodHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGlnaHRzID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnNldERlZmF1bHRWYWx1ZXMoIF9kZWZhdWx0VmFsdWVzICk7XHJcblxyXG5cdFx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXR1cHMgdGhlIGxpZ2h0aW5nIG1vZGVsLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7VG9vbkxpZ2h0aW5nTW9kZWx9IFRoZSBsaWdodGluZyBtb2RlbC5cclxuXHQgKi9cclxuXHRzZXR1cExpZ2h0aW5nTW9kZWwoIC8qYnVpbGRlciovICkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgVG9vbkxpZ2h0aW5nTW9kZWwoKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTWVzaFRvb25Ob2RlTWF0ZXJpYWw7XHJcbiIsImltcG9ydCBUZW1wTm9kZSBmcm9tICcuLi9jb3JlL1RlbXBOb2RlLmpzJztcclxuaW1wb3J0IHsgdHJhbnNmb3JtZWROb3JtYWxWaWV3IH0gZnJvbSAnLi4vYWNjZXNzb3JzL05vcm1hbC5qcyc7XHJcbmltcG9ydCB7IHBvc2l0aW9uVmlld0RpcmVjdGlvbiB9IGZyb20gJy4uL2FjY2Vzc29ycy9Qb3NpdGlvbi5qcyc7XHJcbmltcG9ydCB7IG5vZGVJbW11dGFibGUsIHZlYzIsIHZlYzMgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcblxyXG4vKipcclxuICogQ2FuIGJlIHVzZWQgdG8gY29tcHV0ZSB0ZXh0dXJlIGNvb3JkaW5hdGVzIGZvciBwcm9qZWN0aW5nIGFcclxuICogbWF0Y2FwIG9udG8gYSBtZXNoLiBVc2VkIGJ5IHtAbGluayBNZXNoTWF0Y2FwTm9kZU1hdGVyaWFsfS5cclxuICpcclxuICogQGF1Z21lbnRzIFRlbXBOb2RlXHJcbiAqL1xyXG5jbGFzcyBNYXRjYXBVVk5vZGUgZXh0ZW5kcyBUZW1wTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ01hdGNhcFVWTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBtYXRjYXAgdXYgbm9kZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHJcblx0XHRzdXBlciggJ3ZlYzInICk7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXAoKSB7XHJcblxyXG5cdFx0Y29uc3QgeCA9IHZlYzMoIHBvc2l0aW9uVmlld0RpcmVjdGlvbi56LCAwLCBwb3NpdGlvblZpZXdEaXJlY3Rpb24ueC5uZWdhdGUoKSApLm5vcm1hbGl6ZSgpO1xyXG5cdFx0Y29uc3QgeSA9IHBvc2l0aW9uVmlld0RpcmVjdGlvbi5jcm9zcyggeCApO1xyXG5cclxuXHRcdHJldHVybiB2ZWMyKCB4LmRvdCggdHJhbnNmb3JtZWROb3JtYWxWaWV3ICksIHkuZG90KCB0cmFuc2Zvcm1lZE5vcm1hbFZpZXcgKSApLm11bCggMC40OTUgKS5hZGQoIDAuNSApOyAvLyAwLjQ5NSB0byByZW1vdmUgYXJ0aWZhY3RzIGNhdXNlZCBieSB1bmRlcnNpemVkIG1hdGNhcCBkaXNrc1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBNYXRjYXBVVk5vZGU7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIG1hdGNhcCB1diBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcmV0dXJucyB7TWF0Y2FwVVZOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG1hdGNhcFVWID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBNYXRjYXBVVk5vZGUgKTtcclxuIiwiaW1wb3J0IE5vZGVNYXRlcmlhbCBmcm9tICcuL05vZGVNYXRlcmlhbC5qcyc7XHJcbmltcG9ydCB7IG1hdGVyaWFsUmVmZXJlbmNlIH0gZnJvbSAnLi4vLi4vbm9kZXMvYWNjZXNzb3JzL01hdGVyaWFsUmVmZXJlbmNlTm9kZS5qcyc7XHJcbmltcG9ydCB7IGRpZmZ1c2VDb2xvciB9IGZyb20gJy4uLy4uL25vZGVzL2NvcmUvUHJvcGVydHlOb2RlLmpzJztcclxuaW1wb3J0IHsgdmVjMyB9IGZyb20gJy4uLy4uL25vZGVzL3RzbC9UU0xCYXNlLmpzJztcclxuaW1wb3J0IHsgbWl4IH0gZnJvbSAnLi4vLi4vbm9kZXMvbWF0aC9NYXRoTm9kZS5qcyc7XHJcbmltcG9ydCB7IG1hdGNhcFVWIH0gZnJvbSAnLi4vLi4vbm9kZXMvdXRpbHMvTWF0Y2FwVVZOb2RlLmpzJztcclxuXHJcbmltcG9ydCB7IE1lc2hNYXRjYXBNYXRlcmlhbCB9IGZyb20gJy4uL01lc2hNYXRjYXBNYXRlcmlhbC5qcyc7XHJcblxyXG5jb25zdCBfZGVmYXVsdFZhbHVlcyA9IC8qQF9fUFVSRV9fKi8gbmV3IE1lc2hNYXRjYXBNYXRlcmlhbCgpO1xyXG5cclxuLyoqXHJcbiAqIE5vZGUgbWF0ZXJpYWwgdmVyc2lvbiBvZiB7QGxpbmsgTWVzaE1hdGNhcE1hdGVyaWFsfS5cclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVNYXRlcmlhbFxyXG4gKi9cclxuY2xhc3MgTWVzaE1hdGNhcE5vZGVNYXRlcmlhbCBleHRlbmRzIE5vZGVNYXRlcmlhbCB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ01lc2hNYXRjYXBOb2RlTWF0ZXJpYWwnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbWVzaCBub3JtYWwgbm9kZSBtYXRlcmlhbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1ldGVyc10gLSBUaGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHBhcmFtZXRlcnMgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNNZXNoTWF0Y2FwTm9kZU1hdGVyaWFsID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnNldERlZmF1bHRWYWx1ZXMoIF9kZWZhdWx0VmFsdWVzICk7XHJcblxyXG5cdFx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXR1cHMgdGhlIG1hdGNhcCBzcGVjaWZpYyBub2RlIHZhcmlhYmxlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICovXHJcblx0c2V0dXBWYXJpYW50cyggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCB1diA9IG1hdGNhcFVWO1xyXG5cclxuXHRcdGxldCBtYXRjYXBDb2xvcjtcclxuXHJcblx0XHRpZiAoIGJ1aWxkZXIubWF0ZXJpYWwubWF0Y2FwICkge1xyXG5cclxuXHRcdFx0bWF0Y2FwQ29sb3IgPSBtYXRlcmlhbFJlZmVyZW5jZSggJ21hdGNhcCcsICd0ZXh0dXJlJyApLmNvbnRleHQoIHsgZ2V0VVY6ICgpID0+IHV2IH0gKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0bWF0Y2FwQ29sb3IgPSB2ZWMzKCBtaXgoIDAuMiwgMC44LCB1di55ICkgKTsgLy8gZGVmYXVsdCBpZiBtYXRjYXAgaXMgbWlzc2luZ1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRkaWZmdXNlQ29sb3IucmdiLm11bEFzc2lnbiggbWF0Y2FwQ29sb3IucmdiICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgZGVmYXVsdCBNZXNoTWF0Y2FwTm9kZU1hdGVyaWFsO1xyXG4iLCJpbXBvcnQgVGVtcE5vZGUgZnJvbSAnLi4vY29yZS9UZW1wTm9kZS5qcyc7XHJcbmltcG9ydCB7IG5vZGVQcm94eSwgdmVjNCwgbWF0MiwgbWF0NCB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuaW1wb3J0IHsgY29zLCBzaW4gfSBmcm9tICcuLi9tYXRoL01hdGhOb2RlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBcHBsaWVzIGEgcm90YXRpb24gdG8gdGhlIGdpdmVuIHBvc2l0aW9uIG5vZGUuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBUZW1wTm9kZVxyXG4gKi9cclxuY2xhc3MgUm90YXRlTm9kZSBleHRlbmRzIFRlbXBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnUm90YXRlTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyByb3RhdGUgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gcG9zaXRpb25Ob2RlIC0gVGhlIHBvc2l0aW9uIG5vZGUuXHJcblx0ICogQHBhcmFtIHtOb2RlfSByb3RhdGlvbk5vZGUgLSBSZXByZXNlbnRzIHRoZSByb3RhdGlvbiB0aGF0IGlzIGFwcGxpZWQgdG8gdGhlIHBvc2l0aW9uIG5vZGUuIERlcGVuZGluZ1xyXG5cdCAqIG9uIHdoZXRoZXIgdGhlIHBvc2l0aW9uIGRhdGEgYXJlIDJEIG9yIDNELCB0aGUgcm90YXRpb24gaXMgZXhwcmVzc2VkIGEgc2luZ2xlIGZsb2F0IHZhbHVlIG9yIGFuIEV1bGVyIHZhbHVlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwb3NpdGlvbk5vZGUsIHJvdGF0aW9uTm9kZSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHBvc2l0aW9uIG5vZGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucG9zaXRpb25Ob2RlID0gcG9zaXRpb25Ob2RlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogIFJlcHJlc2VudHMgdGhlIHJvdGF0aW9uIHRoYXQgaXMgYXBwbGllZCB0byB0aGUgcG9zaXRpb24gbm9kZS5cclxuXHRcdCAqICBEZXBlbmRpbmcgb24gd2hldGhlciB0aGUgcG9zaXRpb24gZGF0YSBhcmUgMkQgb3IgM0QsIHRoZSByb3RhdGlvbiBpcyBleHByZXNzZWQgYSBzaW5nbGUgZmxvYXQgdmFsdWUgb3IgYW4gRXVsZXIgdmFsdWUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucm90YXRpb25Ob2RlID0gcm90YXRpb25Ob2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSB0eXBlIG9mIHRoZSB7QGxpbmsgUm90YXRlTm9kZSNwb3NpdGlvbk5vZGV9IGRlZmluZXMgdGhlIG5vZGUncyB0eXBlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBub2RlJ3MgdHlwZS5cclxuXHQgKi9cclxuXHRnZXROb2RlVHlwZSggYnVpbGRlciApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5wb3NpdGlvbk5vZGUuZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHRzZXR1cCggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCB7IHJvdGF0aW9uTm9kZSwgcG9zaXRpb25Ob2RlIH0gPSB0aGlzO1xyXG5cclxuXHRcdGNvbnN0IG5vZGVUeXBlID0gdGhpcy5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cclxuXHRcdGlmICggbm9kZVR5cGUgPT09ICd2ZWMyJyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGNvc0FuZ2xlID0gcm90YXRpb25Ob2RlLmNvcygpO1xyXG5cdFx0XHRjb25zdCBzaW5BbmdsZSA9IHJvdGF0aW9uTm9kZS5zaW4oKTtcclxuXHJcblx0XHRcdGNvbnN0IHJvdGF0aW9uTWF0cml4ID0gbWF0MihcclxuXHRcdFx0XHRjb3NBbmdsZSwgc2luQW5nbGUsXHJcblx0XHRcdFx0c2luQW5nbGUubmVnYXRlKCksIGNvc0FuZ2xlXHJcblx0XHRcdCk7XHJcblxyXG5cdFx0XHRyZXR1cm4gcm90YXRpb25NYXRyaXgubXVsKCBwb3NpdGlvbk5vZGUgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc3Qgcm90YXRpb24gPSByb3RhdGlvbk5vZGU7XHJcblx0XHRcdGNvbnN0IHJvdGF0aW9uWE1hdHJpeCA9IG1hdDQoIHZlYzQoIDEuMCwgMC4wLCAwLjAsIDAuMCApLCB2ZWM0KCAwLjAsIGNvcyggcm90YXRpb24ueCApLCBzaW4oIHJvdGF0aW9uLnggKS5uZWdhdGUoKSwgMC4wICksIHZlYzQoIDAuMCwgc2luKCByb3RhdGlvbi54ICksIGNvcyggcm90YXRpb24ueCApLCAwLjAgKSwgdmVjNCggMC4wLCAwLjAsIDAuMCwgMS4wICkgKTtcclxuXHRcdFx0Y29uc3Qgcm90YXRpb25ZTWF0cml4ID0gbWF0NCggdmVjNCggY29zKCByb3RhdGlvbi55ICksIDAuMCwgc2luKCByb3RhdGlvbi55ICksIDAuMCApLCB2ZWM0KCAwLjAsIDEuMCwgMC4wLCAwLjAgKSwgdmVjNCggc2luKCByb3RhdGlvbi55ICkubmVnYXRlKCksIDAuMCwgY29zKCByb3RhdGlvbi55ICksIDAuMCApLCB2ZWM0KCAwLjAsIDAuMCwgMC4wLCAxLjAgKSApO1xyXG5cdFx0XHRjb25zdCByb3RhdGlvblpNYXRyaXggPSBtYXQ0KCB2ZWM0KCBjb3MoIHJvdGF0aW9uLnogKSwgc2luKCByb3RhdGlvbi56ICkubmVnYXRlKCksIDAuMCwgMC4wICksIHZlYzQoIHNpbiggcm90YXRpb24ueiApLCBjb3MoIHJvdGF0aW9uLnogKSwgMC4wLCAwLjAgKSwgdmVjNCggMC4wLCAwLjAsIDEuMCwgMC4wICksIHZlYzQoIDAuMCwgMC4wLCAwLjAsIDEuMCApICk7XHJcblxyXG5cdFx0XHRyZXR1cm4gcm90YXRpb25YTWF0cml4Lm11bCggcm90YXRpb25ZTWF0cml4ICkubXVsKCByb3RhdGlvblpNYXRyaXggKS5tdWwoIHZlYzQoIHBvc2l0aW9uTm9kZSwgMS4wICkgKS54eXo7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBSb3RhdGVOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSByb3RhdGUgbm9kZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlfSBwb3NpdGlvbk5vZGUgLSBUaGUgcG9zaXRpb24gbm9kZS5cclxuICogQHBhcmFtIHtOb2RlfSByb3RhdGlvbk5vZGUgLSBSZXByZXNlbnRzIHRoZSByb3RhdGlvbiB0aGF0IGlzIGFwcGxpZWQgdG8gdGhlIHBvc2l0aW9uIG5vZGUuIERlcGVuZGluZ1xyXG4gKiBvbiB3aGV0aGVyIHRoZSBwb3NpdGlvbiBkYXRhIGFyZSAyRCBvciAzRCwgdGhlIHJvdGF0aW9uIGlzIGV4cHJlc3NlZCBhIHNpbmdsZSBmbG9hdCB2YWx1ZSBvciBhbiBFdWxlciB2YWx1ZS5cclxuICogQHJldHVybnMge1JvdGF0ZU5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgcm90YXRlID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIFJvdGF0ZU5vZGUgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDIgKTtcclxuIiwiaW1wb3J0IE5vZGVNYXRlcmlhbCBmcm9tICcuL05vZGVNYXRlcmlhbC5qcyc7XHJcbmltcG9ydCB7IGNhbWVyYVByb2plY3Rpb25NYXRyaXggfSBmcm9tICcuLi8uLi9ub2Rlcy9hY2Nlc3NvcnMvQ2FtZXJhLmpzJztcclxuaW1wb3J0IHsgbWF0ZXJpYWxSb3RhdGlvbiB9IGZyb20gJy4uLy4uL25vZGVzL2FjY2Vzc29ycy9NYXRlcmlhbE5vZGUuanMnO1xyXG5pbXBvcnQgeyBtb2RlbFZpZXdNYXRyaXgsIG1vZGVsV29ybGRNYXRyaXggfSBmcm9tICcuLi8uLi9ub2Rlcy9hY2Nlc3NvcnMvTW9kZWxOb2RlLmpzJztcclxuaW1wb3J0IHsgcG9zaXRpb25HZW9tZXRyeSB9IGZyb20gJy4uLy4uL25vZGVzL2FjY2Vzc29ycy9Qb3NpdGlvbi5qcyc7XHJcbmltcG9ydCB7IHJvdGF0ZSB9IGZyb20gJy4uLy4uL25vZGVzL3V0aWxzL1JvdGF0ZU5vZGUuanMnO1xyXG5pbXBvcnQgeyBmbG9hdCwgdmVjMiwgdmVjMywgdmVjNCB9IGZyb20gJy4uLy4uL25vZGVzL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbmltcG9ydCB7IFNwcml0ZU1hdGVyaWFsIH0gZnJvbSAnLi4vU3ByaXRlTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyByZWZlcmVuY2UgfSBmcm9tICcuLi8uLi9ub2Rlcy9hY2Nlc3NvcnMvUmVmZXJlbmNlQmFzZU5vZGUuanMnO1xyXG5cclxuY29uc3QgX2RlZmF1bHRWYWx1ZXMgPSAvKkBfX1BVUkVfXyovIG5ldyBTcHJpdGVNYXRlcmlhbCgpO1xyXG5cclxuLyoqXHJcbiAqIE5vZGUgbWF0ZXJpYWwgdmVyc2lvbiBvZiB7QGxpbmsgU3ByaXRlTWF0ZXJpYWx9LlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTm9kZU1hdGVyaWFsXHJcbiAqL1xyXG5jbGFzcyBTcHJpdGVOb2RlTWF0ZXJpYWwgZXh0ZW5kcyBOb2RlTWF0ZXJpYWwge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdTcHJpdGVOb2RlTWF0ZXJpYWwnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc3ByaXRlIG5vZGUgbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtZXRlcnNdIC0gVGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwYXJhbWV0ZXJzICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzU3ByaXRlTm9kZU1hdGVyaWFsID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLl91c2VTaXplQXR0ZW51YXRpb24gPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBwcm9wZXJ0eSBtYWtlcyBpdCBwb3NzaWJsZSB0byBkZWZpbmUgdGhlIHBvc2l0aW9uIG9mIHRoZSBzcHJpdGUgd2l0aCBhXHJcblx0XHQgKiBub2RlLiBUaGF0IGNhbiBiZSB1c2VmdWwgd2hlbiB0aGUgbWF0ZXJpYWwgaXMgdXNlZCB3aXRoIGluc3RhbmNlZCByZW5kZXJpbmdcclxuXHRcdCAqIGFuZCBub2RlIGRhdGEgYXJlIGRlZmluZWQgd2l0aCBhbiBpbnN0YW5jZWQgYXR0cmlidXRlIG5vZGU6XHJcblx0XHQgKiBgYGBqc1xyXG5cdFx0ICogY29uc3QgcG9zaXRpb25BdHRyaWJ1dGUgPSBuZXcgSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlKCBuZXcgRmxvYXQzMkFycmF5KCBwb3NpdGlvbnMgKSwgMyApO1xyXG5cdFx0ICogbWF0ZXJpYWwucG9zaXRpb25Ob2RlID0gaW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbkF0dHJpYnV0ZSApO1xyXG5cdFx0ICogYGBgXHJcblx0XHQgKiBBbm90aGVyIHBvc3NpYmlsaXR5IGlzIHRvIGNvbXB1dGUgdGhlIGluc3RhbmNlZCBkYXRhIHdpdGggYSBjb21wdXRlIHNoYWRlcjpcclxuXHRcdCAqIGBgYGpzXHJcblx0XHQgKiBjb25zdCBwb3NpdGlvbkJ1ZmZlciA9IGluc3RhbmNlZEFycmF5KCBwYXJ0aWNsZUNvdW50LCAndmVjMycgKTtcclxuXHRcdCAqIHBhcnRpY2xlTWF0ZXJpYWwucG9zaXRpb25Ob2RlID0gcG9zaXRpb25CdWZmZXIudG9BdHRyaWJ1dGUoKTtcclxuXHRcdCAqIGBgYFxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Tm9kZTx2ZWMyPn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wb3NpdGlvbk5vZGUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJvdGF0aW9uIG9mIHNwcml0ZSBtYXRlcmlhbHMgaXMgYnkgZGVmYXVsdCBpbmZlcnJlZCBmcm9tIHRoZSBgcm90YXRpb25gLFxyXG5cdFx0ICogcHJvcGVydHkuIFRoaXMgbm9kZSBwcm9wZXJ0eSBhbGxvd3MgdG8gb3ZlcndyaXRlIHRoZSBkZWZhdWx0IGFuZCBkZWZpbmVcclxuXHRcdCAqIHRoZSByb3RhdGlvbiB3aXRoIGEgbm9kZSBpbnN0ZWFkLlxyXG5cdFx0ICpcclxuXHRcdCAqIElmIHlvdSBkb24ndCB3YW50IHRvIG92ZXJ3cml0ZSB0aGUgcm90YXRpb24gYnV0IG1vZGlmeSB0aGUgZXhpc3RpbmdcclxuXHRcdCAqIHZhbHVlIGluc3RlYWQsIHVzZSB7QGxpbmsgbWF0ZXJpYWxSb3RhdGlvbn0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPGZsb2F0Pn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yb3RhdGlvbk5vZGUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBub2RlIHByb3BlcnR5IHByb3ZpZGVzIGFuIGFkZGl0aW9uYWwgd2F5IHRvIHNjYWxlIHNwcml0ZXMgbmV4dCB0b1xyXG5cdFx0ICogYE9iamVjdDNELnNjYWxlYC4gVGhlIHNjYWxlIHRyYW5zZm9ybWF0aW9uIGJhc2VkIGluIGBPYmplY3QzRC5zY2FsZWBcclxuXHRcdCAqIGlzIG11bHRpcGxpZWQgd2l0aCB0aGUgc2NhbGUgdmFsdWUgb2YgdGhpcyBub2RlIGluIHRoZSB2ZXJ0ZXggc2hhZGVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Tm9kZTx2ZWMyPn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zY2FsZU5vZGUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSW4gU3ByaXRlcywgdGhlIHRyYW5zcGFyZW50IHByb3BlcnR5IGlzIGVuYWJsZWQgYnkgZGVmYXVsdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50cmFuc3BhcmVudCA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy5zZXREZWZhdWx0VmFsdWVzKCBfZGVmYXVsdFZhbHVlcyApO1xyXG5cclxuXHRcdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0dXBzIHRoZSBwb3NpdGlvbiBub2RlIGluIHZpZXcgc3BhY2UuIFRoaXMgbWV0aG9kIGltcGxlbWVudHNcclxuXHQgKiB0aGUgc3ByaXRlIHNwZWNpZmljIHZlcnRleCBzaGFkZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge05vZGU8dmVjMz59IFRoZSBwb3NpdGlvbiBpbiB2aWV3IHNwYWNlLlxyXG5cdCAqL1xyXG5cdHNldHVwUG9zaXRpb25WaWV3KCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IHsgb2JqZWN0LCBjYW1lcmEgfSA9IGJ1aWxkZXI7XHJcblxyXG5cdFx0Y29uc3Qgc2l6ZUF0dGVudWF0aW9uID0gdGhpcy5zaXplQXR0ZW51YXRpb247XHJcblxyXG5cdFx0Y29uc3QgeyBwb3NpdGlvbk5vZGUsIHJvdGF0aW9uTm9kZSwgc2NhbGVOb2RlIH0gPSB0aGlzO1xyXG5cclxuXHRcdGNvbnN0IG12UG9zaXRpb24gPSBtb2RlbFZpZXdNYXRyaXgubXVsKCB2ZWMzKCBwb3NpdGlvbk5vZGUgfHwgMCApICk7XHJcblxyXG5cdFx0bGV0IHNjYWxlID0gdmVjMiggbW9kZWxXb3JsZE1hdHJpeFsgMCBdLnh5ei5sZW5ndGgoKSwgbW9kZWxXb3JsZE1hdHJpeFsgMSBdLnh5ei5sZW5ndGgoKSApO1xyXG5cclxuXHRcdGlmICggc2NhbGVOb2RlICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0c2NhbGUgPSBzY2FsZS5tdWwoIHZlYzIoIHNjYWxlTm9kZSApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggc2l6ZUF0dGVudWF0aW9uID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdGlmICggY2FtZXJhLmlzUGVyc3BlY3RpdmVDYW1lcmEgKSB7XHJcblxyXG5cdFx0XHRcdHNjYWxlID0gc2NhbGUubXVsKCBtdlBvc2l0aW9uLnoubmVnYXRlKCkgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IG9ydGhvU2NhbGUgPSBmbG9hdCggMi4wICkuZGl2KCBjYW1lcmFQcm9qZWN0aW9uTWF0cml4LmVsZW1lbnQoIDEgKS5lbGVtZW50KCAxICkgKTtcclxuXHRcdFx0XHRzY2FsZSA9IHNjYWxlLm11bCggb3J0aG9TY2FsZS5tdWwoIDIgKSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRsZXQgYWxpZ25lZFBvc2l0aW9uID0gcG9zaXRpb25HZW9tZXRyeS54eTtcclxuXHJcblx0XHRpZiAoIG9iamVjdC5jZW50ZXIgJiYgb2JqZWN0LmNlbnRlci5pc1ZlY3RvcjIgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBjZW50ZXIgPSByZWZlcmVuY2UoICdjZW50ZXInLCAndmVjMicsIG9iamVjdCApO1xyXG5cclxuXHRcdFx0YWxpZ25lZFBvc2l0aW9uID0gYWxpZ25lZFBvc2l0aW9uLnN1YiggY2VudGVyLnN1YiggMC41ICkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0YWxpZ25lZFBvc2l0aW9uID0gYWxpZ25lZFBvc2l0aW9uLm11bCggc2NhbGUgKTtcclxuXHJcblx0XHRjb25zdCByb3RhdGlvbiA9IGZsb2F0KCByb3RhdGlvbk5vZGUgfHwgbWF0ZXJpYWxSb3RhdGlvbiApO1xyXG5cclxuXHRcdGNvbnN0IHJvdGF0ZWRQb3NpdGlvbiA9IHJvdGF0ZSggYWxpZ25lZFBvc2l0aW9uLCByb3RhdGlvbiApO1xyXG5cclxuXHRcdHJldHVybiB2ZWM0KCBtdlBvc2l0aW9uLnh5LmFkZCggcm90YXRlZFBvc2l0aW9uICksIG12UG9zaXRpb24uencgKTtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0dGhpcy5wb3NpdGlvbk5vZGUgPSBzb3VyY2UucG9zaXRpb25Ob2RlO1xyXG5cdFx0dGhpcy5yb3RhdGlvbk5vZGUgPSBzb3VyY2Uucm90YXRpb25Ob2RlO1xyXG5cdFx0dGhpcy5zY2FsZU5vZGUgPSBzb3VyY2Uuc2NhbGVOb2RlO1xyXG5cclxuXHRcdHJldHVybiBzdXBlci5jb3B5KCBzb3VyY2UgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBXaGV0aGVyIHRvIHVzZSBzaXplIGF0dGVudWF0aW9uIG9yIG5vdC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdCAqIEBkZWZhdWx0IHRydWVcclxuXHQgKi9cclxuXHRnZXQgc2l6ZUF0dGVudWF0aW9uKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl91c2VTaXplQXR0ZW51YXRpb247XHJcblxyXG5cdH1cclxuXHJcblx0c2V0IHNpemVBdHRlbnVhdGlvbiggdmFsdWUgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl91c2VTaXplQXR0ZW51YXRpb24gIT09IHZhbHVlICkge1xyXG5cclxuXHRcdFx0dGhpcy5fdXNlU2l6ZUF0dGVudWF0aW9uID0gdmFsdWU7XHJcblx0XHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgU3ByaXRlTm9kZU1hdGVyaWFsO1xyXG4iLCJpbXBvcnQgU3ByaXRlTm9kZU1hdGVyaWFsIGZyb20gJy4vU3ByaXRlTm9kZU1hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgdmlld3BvcnQgfSBmcm9tICcuLi8uLi9ub2Rlcy9kaXNwbGF5L1NjcmVlbk5vZGUuanMnO1xyXG5pbXBvcnQgeyBwb3NpdGlvbkdlb21ldHJ5LCBwb3NpdGlvbkxvY2FsLCBwb3NpdGlvblZpZXcgfSBmcm9tICcuLi8uLi9ub2Rlcy9hY2Nlc3NvcnMvUG9zaXRpb24uanMnO1xyXG5pbXBvcnQgeyBtb2RlbFZpZXdNYXRyaXggfSBmcm9tICcuLi8uLi9ub2Rlcy9hY2Nlc3NvcnMvTW9kZWxOb2RlLmpzJztcclxuaW1wb3J0IHsgbWF0ZXJpYWxQb2ludFNpemUgfSBmcm9tICcuLi8uLi9ub2Rlcy9hY2Nlc3NvcnMvTWF0ZXJpYWxOb2RlLmpzJztcclxuaW1wb3J0IHsgcm90YXRlIH0gZnJvbSAnLi4vLi4vbm9kZXMvdXRpbHMvUm90YXRlTm9kZS5qcyc7XHJcbmltcG9ydCB7IGZsb2F0LCB2ZWMyLCB2ZWMzLCB2ZWM0IH0gZnJvbSAnLi4vLi4vbm9kZXMvdHNsL1RTTEJhc2UuanMnO1xyXG5cclxuaW1wb3J0IHsgUG9pbnRzTWF0ZXJpYWwgfSBmcm9tICcuLi9Qb2ludHNNYXRlcmlhbC5qcyc7XHJcblxyXG5jb25zdCBfZGVmYXVsdFZhbHVlcyA9IC8qQF9fUFVSRV9fKi8gbmV3IFBvaW50c01hdGVyaWFsKCk7XHJcblxyXG4vKipcclxuICogTm9kZSBtYXRlcmlhbCB2ZXJzaW9uIG9mIHtAbGluayBQb2ludHNNYXRlcmlhbH0uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBTcHJpdGVOb2RlTWF0ZXJpYWxcclxuICovXHJcbmNsYXNzIFBvaW50c05vZGVNYXRlcmlhbCBleHRlbmRzIFNwcml0ZU5vZGVNYXRlcmlhbCB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ1BvaW50c05vZGVNYXRlcmlhbCc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBwb2ludHMgbm9kZSBtYXRlcmlhbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1ldGVyc10gLSBUaGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHBhcmFtZXRlcnMgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgbm9kZSBwcm9wZXJ0eSBwcm92aWRlcyBhbiBhZGRpdGlvbmFsIHdheSB0byBzZXQgdGhlIHBvaW50IHNpemUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlPHZlYzI+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNpemVOb2RlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNQb2ludHNOb2RlTWF0ZXJpYWwgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMuc2V0RGVmYXVsdFZhbHVlcyggX2RlZmF1bHRWYWx1ZXMgKTtcclxuXHJcblx0XHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xyXG5cclxuXHR9XHJcblxyXG5cdHNldHVwUG9zaXRpb25WaWV3KCkge1xyXG5cclxuXHRcdGNvbnN0IHsgcG9zaXRpb25Ob2RlIH0gPSB0aGlzO1xyXG5cclxuXHRcdHJldHVybiBtb2RlbFZpZXdNYXRyaXgubXVsKCB2ZWMzKCBwb3NpdGlvbk5vZGUgfHwgcG9zaXRpb25Mb2NhbCApICkueHl6O1xyXG5cclxuXHR9XHJcblxyXG5cdHNldHVwVmVydGV4KCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IG12cCA9IHN1cGVyLnNldHVwVmVydGV4KCBidWlsZGVyICk7XHJcblxyXG5cdFx0Ly8gc2tpcCBmdXJ0aGVyIHByb2Nlc3NpbmcgaWYgdGhlIG1hdGVyaWFsIGlzIG5vdCBhIG5vZGUgbWF0ZXJpYWxcclxuXHJcblx0XHRpZiAoIGJ1aWxkZXIubWF0ZXJpYWwuaXNOb2RlTWF0ZXJpYWwgIT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gbXZwO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBuZGMgc3BhY2VcclxuXHJcblx0XHRjb25zdCB7IHJvdGF0aW9uTm9kZSwgc2NhbGVOb2RlLCBzaXplTm9kZSB9ID0gdGhpcztcclxuXHJcblx0XHRjb25zdCBhbGlnbmVkUG9zaXRpb24gPSBwb3NpdGlvbkdlb21ldHJ5Lnh5LnRvVmFyKCk7XHJcblx0XHRjb25zdCBhc3BlY3QgPSB2aWV3cG9ydC56LmRpdiggdmlld3BvcnQudyApO1xyXG5cclxuXHRcdC8vIHJvdGF0aW9uXHJcblxyXG5cdFx0aWYgKCByb3RhdGlvbk5vZGUgJiYgcm90YXRpb25Ob2RlLmlzTm9kZSApIHtcclxuXHJcblx0XHRcdGNvbnN0IHJvdGF0aW9uID0gZmxvYXQoIHJvdGF0aW9uTm9kZSApO1xyXG5cclxuXHRcdFx0YWxpZ25lZFBvc2l0aW9uLmFzc2lnbiggcm90YXRlKCBhbGlnbmVkUG9zaXRpb24sIHJvdGF0aW9uICkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gcG9pbnQgc2l6ZVxyXG5cclxuXHRcdGxldCBwb2ludFNpemUgPSBzaXplTm9kZSAhPT0gbnVsbCA/IHZlYzIoIHNpemVOb2RlICkgOiBtYXRlcmlhbFBvaW50U2l6ZTtcclxuXHJcblx0XHRpZiAoIHRoaXMuc2l6ZUF0dGVudWF0aW9uID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0cG9pbnRTaXplID0gcG9pbnRTaXplLm11bCggcG9pbnRTaXplLmRpdiggcG9zaXRpb25WaWV3LnoubmVnYXRlKCkgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBzY2FsZVxyXG5cclxuXHRcdGlmICggc2NhbGVOb2RlICYmIHNjYWxlTm9kZS5pc05vZGUgKSB7XHJcblxyXG5cdFx0XHRwb2ludFNpemUgPSBwb2ludFNpemUubXVsKCB2ZWMyKCBzY2FsZU5vZGUgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRhbGlnbmVkUG9zaXRpb24ubXVsQXNzaWduKCBwb2ludFNpemUubXVsKCAyICkgKTtcclxuXHJcblx0XHRhbGlnbmVkUG9zaXRpb24uYXNzaWduKCBhbGlnbmVkUG9zaXRpb24uZGl2KCB2aWV3cG9ydC56ICkgKTtcclxuXHRcdGFsaWduZWRQb3NpdGlvbi55LmFzc2lnbiggYWxpZ25lZFBvc2l0aW9uLnkubXVsKCBhc3BlY3QgKSApO1xyXG5cclxuXHRcdC8vIGJhY2sgdG8gY2xpcCBzcGFjZVxyXG5cdFx0YWxpZ25lZFBvc2l0aW9uLmFzc2lnbiggYWxpZ25lZFBvc2l0aW9uLm11bCggbXZwLncgKSApO1xyXG5cclxuXHRcdC8vY2xpcFBvcy54eSArPSBvZmZzZXQ7XHJcblx0XHRtdnAuYWRkQXNzaWduKCB2ZWM0KCBhbGlnbmVkUG9zaXRpb24sIDAsIDAgKSApO1xyXG5cclxuXHRcdHJldHVybiBtdnA7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogV2hldGhlciBhbHBoYSB0byBjb3ZlcmFnZSBzaG91bGQgYmUgdXNlZCBvciBub3QuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0ICovXHJcblx0Z2V0IGFscGhhVG9Db3ZlcmFnZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fdXNlQWxwaGFUb0NvdmVyYWdlO1xyXG5cclxuXHR9XHJcblxyXG5cdHNldCBhbHBoYVRvQ292ZXJhZ2UoIHZhbHVlICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5fdXNlQWxwaGFUb0NvdmVyYWdlICE9PSB2YWx1ZSApIHtcclxuXHJcblx0XHRcdHRoaXMuX3VzZUFscGhhVG9Db3ZlcmFnZSA9IHZhbHVlO1xyXG5cdFx0XHR0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFBvaW50c05vZGVNYXRlcmlhbDtcclxuIiwiaW1wb3J0IExpZ2h0aW5nTW9kZWwgZnJvbSAnLi4vY29yZS9MaWdodGluZ01vZGVsLmpzJztcclxuaW1wb3J0IHsgZGlmZnVzZUNvbG9yIH0gZnJvbSAnLi4vY29yZS9Qcm9wZXJ0eU5vZGUuanMnO1xyXG5pbXBvcnQgeyBmbG9hdCB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIGxpZ2h0aW5nIG1vZGVsIGZvciBhIHNoYWRvdyBtYXRlcmlhbC4gVXNlZCBpbiB7QGxpbmsgU2hhZG93Tm9kZU1hdGVyaWFsfS5cclxuICpcclxuICogQGF1Z21lbnRzIExpZ2h0aW5nTW9kZWxcclxuICovXHJcbmNsYXNzIFNoYWRvd01hc2tNb2RlbCBleHRlbmRzIExpZ2h0aW5nTW9kZWwge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHNoYWRvdyBtYXNrIG1vZGVsLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc2hhZG93IG1hc2sgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zaGFkb3dOb2RlID0gZmxvYXQoIDEgKS50b1ZhciggJ3NoYWRvd01hc2snICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogT25seSB1c2VkIHRvIHNhdmUgdGhlIHNoYWRvdyBtYXNrLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGlucHV0IC0gVGhlIGlucHV0IGRhdGEuXHJcblx0ICovXHJcblx0ZGlyZWN0KCB7IGxpZ2h0Tm9kZSB9ICkge1xyXG5cclxuXHRcdHRoaXMuc2hhZG93Tm9kZS5tdWxBc3NpZ24oIGxpZ2h0Tm9kZS5zaGFkb3dOb2RlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXNlcyB0aGUgc2hhZG93IG1hc2sgdG8gcHJvZHVjZSB0aGUgZmluYWwgY29sb3IuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqL1xyXG5cdGZpbmlzaCggeyBjb250ZXh0IH0gKSB7XHJcblxyXG5cdFx0ZGlmZnVzZUNvbG9yLmEubXVsQXNzaWduKCB0aGlzLnNoYWRvd05vZGUub25lTWludXMoKSApO1xyXG5cclxuXHRcdGNvbnRleHQub3V0Z29pbmdMaWdodC5yZ2IuYXNzaWduKCBkaWZmdXNlQ29sb3IucmdiICk7IC8vIFRPRE86IE9wdGltaXplIExpZ2h0c05vZGUgdG8gYXZvaWQgdGhpcyBhc3NpZ25tZW50XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFNoYWRvd01hc2tNb2RlbDtcclxuIiwiaW1wb3J0IE5vZGVNYXRlcmlhbCBmcm9tICcuL05vZGVNYXRlcmlhbC5qcyc7XHJcbmltcG9ydCBTaGFkb3dNYXNrTW9kZWwgZnJvbSAnLi4vLi4vbm9kZXMvZnVuY3Rpb25zL1NoYWRvd01hc2tNb2RlbC5qcyc7XHJcblxyXG5pbXBvcnQgeyBTaGFkb3dNYXRlcmlhbCB9IGZyb20gJy4uL1NoYWRvd01hdGVyaWFsLmpzJztcclxuXHJcbmNvbnN0IF9kZWZhdWx0VmFsdWVzID0gLypAX19QVVJFX18qLyBuZXcgU2hhZG93TWF0ZXJpYWwoKTtcclxuXHJcbi8qKlxyXG4gKiBOb2RlIG1hdGVyaWFsIHZlcnNpb24gb2Yge0BsaW5rIFNoYWRvd01hdGVyaWFsfS5cclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVNYXRlcmlhbFxyXG4gKi9cclxuY2xhc3MgU2hhZG93Tm9kZU1hdGVyaWFsIGV4dGVuZHMgTm9kZU1hdGVyaWFsIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnU2hhZG93Tm9kZU1hdGVyaWFsJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHNoYWRvdyBub2RlIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbWV0ZXJzXSAtIFRoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVycyApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1NoYWRvd05vZGVNYXRlcmlhbCA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTZXQgdG8gYHRydWVgIGJlY2F1c2Ugc28gaXQncyBwb3NzaWJsZSB0byBpbXBsZW1lbnRcclxuXHRcdCAqIHRoZSBzaGFkb3cgbWFzayBlZmZlY3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGlnaHRzID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIE92ZXJ3cml0dGVuIHNpbmNlIHNoYWRvdyBtYXRlcmlhbHMgYXJlIHRyYW5zcGFyZW50XHJcblx0XHQgKiBieSBkZWZhdWx0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRyYW5zcGFyZW50ID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnNldERlZmF1bHRWYWx1ZXMoIF9kZWZhdWx0VmFsdWVzICk7XHJcblxyXG5cdFx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXR1cHMgdGhlIGxpZ2h0aW5nIG1vZGVsLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7U2hhZG93TWFza01vZGVsfSBUaGUgbGlnaHRpbmcgbW9kZWwuXHJcblx0ICovXHJcblx0c2V0dXBMaWdodGluZ01vZGVsKCAvKmJ1aWxkZXIqLyApIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IFNoYWRvd01hc2tNb2RlbCgpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTaGFkb3dOb2RlTWF0ZXJpYWw7XHJcbiIsImltcG9ydCBMaWdodGluZ01vZGVsIGZyb20gJy4uL2NvcmUvTGlnaHRpbmdNb2RlbC5qcyc7XHJcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnLi4vY29yZS9Qcm9wZXJ0eU5vZGUuanMnO1xyXG5pbXBvcnQgeyBmbG9hdCwgSWYsIHVuaWZvcm0sIHZlYzMsIHZlYzQgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcbmltcG9ydCB7IHBvc2l0aW9uV29ybGQgfSBmcm9tICcuLi9hY2Nlc3NvcnMvUG9zaXRpb24uanMnO1xyXG5pbXBvcnQgeyBjYW1lcmFGYXIsIGNhbWVyYU5lYXIsIGNhbWVyYVBvc2l0aW9uLCBjYW1lcmFWaWV3TWF0cml4IH0gZnJvbSAnLi4vYWNjZXNzb3JzL0NhbWVyYS5qcyc7XHJcbmltcG9ydCB7IExvb3AgfSBmcm9tICcuLi91dGlscy9Mb29wTm9kZS5qcyc7XHJcbmltcG9ydCB7IGxpbmVhckRlcHRoLCB2aWV3WlRvUGVyc3BlY3RpdmVEZXB0aCB9IGZyb20gJy4uL2Rpc3BsYXkvVmlld3BvcnREZXB0aE5vZGUuanMnO1xyXG5pbXBvcnQgeyBtb2RlbFJhZGl1cyB9IGZyb20gJy4uL2FjY2Vzc29ycy9Nb2RlbE5vZGUuanMnO1xyXG5pbXBvcnQgeyBMVENfRXZhbHVhdGVfVm9sdW1lIH0gZnJvbSAnLi9CU0RGL0xUQy5qcyc7XHJcblxyXG5jb25zdCBzY2F0dGVyaW5nRGVuc2l0eSA9IHByb3BlcnR5KCAndmVjMycgKTtcclxuY29uc3QgbGluZWFyRGVwdGhSYXkgPSBwcm9wZXJ0eSggJ3ZlYzMnICk7XHJcbmNvbnN0IG91dGdvaW5nUmF5TGlnaHQgPSBwcm9wZXJ0eSggJ3ZlYzMnICk7XHJcblxyXG4vKipcclxuICogVm9sdW1ldHJpY0xpZ2h0aW5nTW9kZWwgY2xhc3MgZXh0ZW5kcyB0aGUgTGlnaHRpbmdNb2RlbCB0byBpbXBsZW1lbnQgdm9sdW1ldHJpYyBsaWdodGluZyBlZmZlY3RzLlxyXG4gKiBUaGlzIG1vZGVsIGNhbGN1bGF0ZXMgdGhlIHNjYXR0ZXJpbmcgYW5kIHRyYW5zbWl0dGFuY2Ugb2YgbGlnaHQgdGhyb3VnaCBhIHZvbHVtZXRyaWMgbWVkaXVtLlxyXG4gKiBJdCBkeW5hbWljYWxseSBhZGp1c3RzIHRoZSBkaXJlY3Rpb24gb2YgdGhlIHJheSBiYXNlZCBvbiB0aGUgY2FtZXJhIGFuZCBvYmplY3QgcG9zaXRpb25zLlxyXG4gKiBUaGUgbW9kZWwgc3VwcG9ydHMgY3VzdG9tIHNjYXR0ZXJpbmcgYW5kIGRlcHRoIG5vZGVzIHRvIGVuaGFuY2UgdGhlIGxpZ2h0aW5nIGVmZmVjdHMuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBMaWdodGluZ01vZGVsXHJcbiAqL1xyXG5jbGFzcyBWb2x1bWV0cmljTGlnaHRpbmdNb2RlbCBleHRlbmRzIExpZ2h0aW5nTW9kZWwge1xyXG5cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHR9XHJcblxyXG5cdHN0YXJ0KCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IHsgbWF0ZXJpYWwsIGNvbnRleHQgfSA9IGJ1aWxkZXI7XHJcblxyXG5cdFx0Y29uc3Qgc3RhcnRQb3MgPSBwcm9wZXJ0eSggJ3ZlYzMnICk7XHJcblx0XHRjb25zdCBlbmRQb3MgPSBwcm9wZXJ0eSggJ3ZlYzMnICk7XHJcblxyXG5cdFx0Ly8gVGhpcyBhcHByb2FjaCBkeW5hbWljYWxseSBjaGFuZ2VzIHRoZSBkaXJlY3Rpb24gb2YgdGhlIHJheSxcclxuXHRcdC8vIHByaW9yaXRpemluZyB0aGUgcmF5IGZyb20gdGhlIGNhbWVyYSB0byB0aGUgb2JqZWN0IGlmIGl0IGlzIGluc2lkZSB0aGUgbWVzaCwgYW5kIGZyb20gdGhlIG9iamVjdCB0byB0aGUgY2FtZXJhIGlmIGl0IGlzIGZhciBhd2F5LlxyXG5cclxuXHRcdElmKCBjYW1lcmFQb3NpdGlvbi5zdWIoIHBvc2l0aW9uV29ybGQgKS5sZW5ndGgoKS5ncmVhdGVyVGhhbiggbW9kZWxSYWRpdXMubXVsKCAyICkgKSwgKCkgPT4ge1xyXG5cclxuXHRcdFx0c3RhcnRQb3MuYXNzaWduKCBjYW1lcmFQb3NpdGlvbiApO1xyXG5cdFx0XHRlbmRQb3MuYXNzaWduKCBwb3NpdGlvbldvcmxkICk7XHJcblxyXG5cdFx0fSApLkVsc2UoICgpID0+IHtcclxuXHJcblx0XHRcdHN0YXJ0UG9zLmFzc2lnbiggcG9zaXRpb25Xb3JsZCApO1xyXG5cdFx0XHRlbmRQb3MuYXNzaWduKCBjYW1lcmFQb3NpdGlvbiApO1xyXG5cclxuXHRcdH0gKTtcclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGNvbnN0IHZpZXdWZWN0b3IgPSBlbmRQb3Muc3ViKCBzdGFydFBvcyApO1xyXG5cclxuXHRcdGNvbnN0IHN0ZXBzID0gdW5pZm9ybSggJ2ludCcgKS5vblJlbmRlclVwZGF0ZSggKCB7IG1hdGVyaWFsIH0gKSA9PiBtYXRlcmlhbC5zdGVwcyApO1xyXG5cdFx0Y29uc3Qgc3RlcFNpemUgPSB2aWV3VmVjdG9yLmxlbmd0aCgpLmRpdiggc3RlcHMgKS50b1ZhcigpO1xyXG5cclxuXHRcdGNvbnN0IHJheURpciA9IHZpZXdWZWN0b3Iubm9ybWFsaXplKCkudG9WYXIoKTsgLy8gVE9ETzogdG9WYXIoKSBzaG91bGQgYmUgYXV0b21hdGljIGhlcmUgKCBpbiBsb29wIClcclxuXHJcblx0XHRjb25zdCBkaXN0VHJhdmVsbGVkID0gZmxvYXQoIDAuMCApLnRvVmFyKCk7XHJcblx0XHRjb25zdCB0cmFuc21pdHRhbmNlID0gdmVjMyggMSApLnRvVmFyKCk7XHJcblxyXG5cdFx0aWYgKCBtYXRlcmlhbC5vZmZzZXROb2RlICkge1xyXG5cclxuXHRcdFx0Ly8gcmVkdWNlIGJhbmRpbmdcclxuXHJcblx0XHRcdGRpc3RUcmF2ZWxsZWQuYWRkQXNzaWduKCBtYXRlcmlhbC5vZmZzZXROb2RlLm11bCggc3RlcFNpemUgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRMb29wKCBzdGVwcywgKCkgPT4ge1xyXG5cclxuXHRcdFx0Y29uc3QgcG9zaXRpb25SYXkgPSBzdGFydFBvcy5hZGQoIHJheURpci5tdWwoIGRpc3RUcmF2ZWxsZWQgKSApO1xyXG5cdFx0XHRjb25zdCBwb3NpdGlvblZpZXdSYXkgPSBjYW1lcmFWaWV3TWF0cml4Lm11bCggdmVjNCggcG9zaXRpb25SYXksIDEgKSApLnh5ejtcclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWwuZGVwdGhOb2RlICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRsaW5lYXJEZXB0aFJheS5hc3NpZ24oIGxpbmVhckRlcHRoKCB2aWV3WlRvUGVyc3BlY3RpdmVEZXB0aCggcG9zaXRpb25WaWV3UmF5LnosIGNhbWVyYU5lYXIsIGNhbWVyYUZhciApICkgKTtcclxuXHJcblx0XHRcdFx0Y29udGV4dC5zY2VuZURlcHRoTm9kZSA9IGxpbmVhckRlcHRoKCBtYXRlcmlhbC5kZXB0aE5vZGUgKS50b1ZhcigpO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29udGV4dC5wb3NpdGlvbldvcmxkID0gcG9zaXRpb25SYXk7XHJcblx0XHRcdGNvbnRleHQuc2hhZG93UG9zaXRpb25Xb3JsZCA9IHBvc2l0aW9uUmF5O1xyXG5cdFx0XHRjb250ZXh0LnBvc2l0aW9uVmlldyA9IHBvc2l0aW9uVmlld1JheTtcclxuXHJcblx0XHRcdHNjYXR0ZXJpbmdEZW5zaXR5LmFzc2lnbiggMCApO1xyXG5cclxuXHRcdFx0bGV0IHNjYXR0ZXJpbmdOb2RlO1xyXG5cclxuXHRcdFx0aWYgKCBtYXRlcmlhbC5zY2F0dGVyaW5nTm9kZSApIHtcclxuXHJcblx0XHRcdFx0c2NhdHRlcmluZ05vZGUgPSBtYXRlcmlhbC5zY2F0dGVyaW5nTm9kZSgge1xyXG5cdFx0XHRcdFx0cG9zaXRpb25SYXlcclxuXHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRzdXBlci5zdGFydCggYnVpbGRlciApO1xyXG5cclxuXHRcdFx0aWYgKCBzY2F0dGVyaW5nTm9kZSApIHtcclxuXHJcblx0XHRcdFx0c2NhdHRlcmluZ0RlbnNpdHkubXVsQXNzaWduKCBzY2F0dGVyaW5nTm9kZSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gYmVlcidzIGxhd1xyXG5cclxuXHRcdFx0Y29uc3QgZmFsbG9mZiA9IHNjYXR0ZXJpbmdEZW5zaXR5Lm11bCggLjAxICkubmVnYXRlKCkubXVsKCBzdGVwU2l6ZSApLmV4cCgpO1xyXG5cdFx0XHR0cmFuc21pdHRhbmNlLm11bEFzc2lnbiggZmFsbG9mZiApO1xyXG5cclxuXHRcdFx0Ly8gbW92ZSBhbG9uZyB0aGUgcmF5XHJcblxyXG5cdFx0XHRkaXN0VHJhdmVsbGVkLmFkZEFzc2lnbiggc3RlcFNpemUgKTtcclxuXHJcblx0XHR9ICk7XHJcblxyXG5cdFx0b3V0Z29pbmdSYXlMaWdodC5hZGRBc3NpZ24oIHRyYW5zbWl0dGFuY2Uuc2F0dXJhdGUoKS5vbmVNaW51cygpICk7XHJcblxyXG5cdH1cclxuXHJcblx0c2NhdHRlcmluZ0xpZ2h0KCBsaWdodENvbG9yLCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IHNjZW5lRGVwdGhOb2RlID0gYnVpbGRlci5jb250ZXh0LnNjZW5lRGVwdGhOb2RlO1xyXG5cclxuXHRcdGlmICggc2NlbmVEZXB0aE5vZGUgKSB7XHJcblxyXG5cdFx0XHRJZiggc2NlbmVEZXB0aE5vZGUuZ3JlYXRlclRoYW5FcXVhbCggbGluZWFyRGVwdGhSYXkgKSwgKCkgPT4ge1xyXG5cclxuXHRcdFx0XHRzY2F0dGVyaW5nRGVuc2l0eS5hZGRBc3NpZ24oIGxpZ2h0Q29sb3IgKTtcclxuXHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0c2NhdHRlcmluZ0RlbnNpdHkuYWRkQXNzaWduKCBsaWdodENvbG9yICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGRpcmVjdCggeyBsaWdodE5vZGUsIGxpZ2h0Q29sb3IgfSwgYnVpbGRlciApIHtcclxuXHJcblx0XHQvLyBJZ25vcmUgbGlnaHRzIHdpdGggaW5maW5pdGUgZGlzdGFuY2VcclxuXHJcblx0XHRpZiAoIGxpZ2h0Tm9kZS5saWdodC5kaXN0YW5jZSA9PT0gdW5kZWZpbmVkICkgcmV0dXJuO1xyXG5cclxuXHRcdC8vIFRPRE86IFdlIG5lZWQgYSB2aWV3cG9ydE9wYXF1ZSooKSAoIG91dHB1dCwgZGVwdGggKSB0byBmaXQgd2l0aCBtb2Rlcm4gcmVuZGVyaW5nIGFwcHJvYWNoZXNcclxuXHJcblx0XHRjb25zdCBkaXJlY3RMaWdodCA9IGxpZ2h0Q29sb3IueHl6LnRvVmFyKCk7XHJcblx0XHRkaXJlY3RMaWdodC5tdWxBc3NpZ24oIGxpZ2h0Tm9kZS5zaGFkb3dOb2RlICk7IC8vIGl0IG5vIHNob3VsZCBiZSBuZWNlc3NhcnkgaWYgdXNlZCBpbiB0aGUgc2FtZSByZW5kZXIgcGFzc1xyXG5cclxuXHRcdHRoaXMuc2NhdHRlcmluZ0xpZ2h0KCBkaXJlY3RMaWdodCwgYnVpbGRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdGRpcmVjdFJlY3RBcmVhKCB7IGxpZ2h0Q29sb3IsIGxpZ2h0UG9zaXRpb24sIGhhbGZXaWR0aCwgaGFsZkhlaWdodCB9LCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IHAwID0gbGlnaHRQb3NpdGlvbi5hZGQoIGhhbGZXaWR0aCApLnN1YiggaGFsZkhlaWdodCApOyAvLyBjb3VudGVyY2xvY2t3aXNlOyBsaWdodCBzaGluZXMgaW4gbG9jYWwgbmVnIHogZGlyZWN0aW9uXHJcblx0XHRjb25zdCBwMSA9IGxpZ2h0UG9zaXRpb24uc3ViKCBoYWxmV2lkdGggKS5zdWIoIGhhbGZIZWlnaHQgKTtcclxuXHRcdGNvbnN0IHAyID0gbGlnaHRQb3NpdGlvbi5zdWIoIGhhbGZXaWR0aCApLmFkZCggaGFsZkhlaWdodCApO1xyXG5cdFx0Y29uc3QgcDMgPSBsaWdodFBvc2l0aW9uLmFkZCggaGFsZldpZHRoICkuYWRkKCBoYWxmSGVpZ2h0ICk7XHJcblxyXG5cdFx0Y29uc3QgUCA9IGJ1aWxkZXIuY29udGV4dC5wb3NpdGlvblZpZXc7XHJcblxyXG5cdFx0Y29uc3QgZGlyZWN0TGlnaHQgPSBsaWdodENvbG9yLnh5ei5tdWwoIExUQ19FdmFsdWF0ZV9Wb2x1bWUoIHsgUCwgcDAsIHAxLCBwMiwgcDMgfSApICkucG93KCAxLjUgKTtcclxuXHJcblx0XHR0aGlzLnNjYXR0ZXJpbmdMaWdodCggZGlyZWN0TGlnaHQsIGJ1aWxkZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHRmaW5pc2goIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0YnVpbGRlci5jb250ZXh0Lm91dGdvaW5nTGlnaHQuYXNzaWduKCBvdXRnb2luZ1JheUxpZ2h0ICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFZvbHVtZXRyaWNMaWdodGluZ01vZGVsO1xyXG4iLCJpbXBvcnQgTm9kZU1hdGVyaWFsIGZyb20gJy4vTm9kZU1hdGVyaWFsLmpzJztcclxuaW1wb3J0IFZvbHVtZXRyaWNMaWdodGluZ01vZGVsIGZyb20gJy4uLy4uL25vZGVzL2Z1bmN0aW9ucy9Wb2x1bWV0cmljTGlnaHRpbmdNb2RlbC5qcyc7XHJcbmltcG9ydCB7IEJhY2tTaWRlIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBWb2x1bWUgbm9kZSBtYXRlcmlhbC5cclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVNYXRlcmlhbFxyXG4gKi9cclxuY2xhc3MgVm9sdW1lTm9kZU1hdGVyaWFsIGV4dGVuZHMgTm9kZU1hdGVyaWFsIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnVm9sdW1lTm9kZU1hdGVyaWFsJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHZvbHVtZSBub2RlIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbWV0ZXJzXSAtIFRoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVycyApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1ZvbHVtZU5vZGVNYXRlcmlhbCA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBOdW1iZXIgb2Ygc3RlcHMgdXNlZCBmb3IgcmF5bWFyY2hpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDI1XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc3RlcHMgPSAyNTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIE9mZnNldHMgdGhlIGRpc3RhbmNlIGEgcmF5IGhhcyBiZWVuIHRyYXZlbGVkIHRocm91Z2ggYSB2b2x1bWUuXHJcblx0XHQgKiBDYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgZGl0aGVyaW5nIHRvIHJlZHVjZSBiYW5kaW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlPGZsb2F0Pn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5vZmZzZXROb2RlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIE5vZGUgdXNlZCBmb3Igc2NhdHRlcmluZyBjYWxjdWxhdGlvbnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0Z1bmN0aW9ufEZ1bmN0aW9uTm9kZTx2ZWM0Pn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zY2F0dGVyaW5nTm9kZSA9IG51bGw7XHJcblxyXG5cdFx0dGhpcy5saWdodHMgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMudHJhbnNwYXJlbnQgPSB0cnVlO1xyXG5cdFx0dGhpcy5zaWRlID0gQmFja1NpZGU7XHJcblxyXG5cdFx0dGhpcy5kZXB0aFRlc3QgPSBmYWxzZTtcclxuXHRcdHRoaXMuZGVwdGhXcml0ZSA9IGZhbHNlO1xyXG5cclxuXHRcdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXBMaWdodGluZ01vZGVsKCkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgVm9sdW1ldHJpY0xpZ2h0aW5nTW9kZWwoKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgVm9sdW1lTm9kZU1hdGVyaWFsO1xyXG4iLCJcclxuLyoqXHJcbiAqIFRoaXMgbW9kdWxlIG1hbmFnZXMgdGhlIGludGVybmFsIGFuaW1hdGlvbiBsb29wIG9mIHRoZSByZW5kZXJlci5cclxuICpcclxuICogQHByaXZhdGVcclxuICovXHJcbmNsYXNzIEFuaW1hdGlvbiB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYW5pbWF0aW9uIGxvb3AgbWFuYWdlbWVudCBjb21wb25lbnQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVzfSBub2RlcyAtIFJlbmRlcmVyIGNvbXBvbmVudCBmb3IgbWFuYWdpbmcgbm9kZXMgcmVsYXRlZCBsb2dpYy5cclxuXHQgKiBAcGFyYW0ge0luZm99IGluZm8gLSBSZW5kZXJlciBjb21wb25lbnQgZm9yIG1hbmFnaW5nIG1ldHJpY3MgYW5kIG1vbml0b3JpbmcgZGF0YS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggbm9kZXMsIGluZm8gKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZW5kZXJlciBjb21wb25lbnQgZm9yIG1hbmFnaW5nIG5vZGVzIHJlbGF0ZWQgbG9naWMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGVzfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vZGVzID0gbm9kZXM7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZW5kZXJlciBjb21wb25lbnQgZm9yIG1hbmFnaW5nIG1ldHJpY3MgYW5kIG1vbml0b3JpbmcgZGF0YS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7SW5mb31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pbmZvID0gaW5mbztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIHRoZSBjb250ZXh0IGZyb20gYHJlcXVlc3RBbmltYXRpb25GcmFtZSgpYCBjYW5cclxuXHRcdCAqIGJlIGNhbGxlZCAodXN1YWxseSBgd2luZG93YCkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1dpbmRvd3xYUlNlc3Npb259XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX2NvbnRleHQgPSBzZWxmO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHVzZXItZGVmaW5lZCBhbmltYXRpb24gbG9vcC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P0Z1bmN0aW9ufVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9hbmltYXRpb25Mb29wID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByZXF1ZXN0SWQgd2hpY2ggaXMgcmV0dXJuZWQgZnJvbSB0aGUgYHJlcXVlc3RBbmltYXRpb25GcmFtZSgpYCBjYWxsLlxyXG5cdFx0ICogQ2FuIGJlIHVzZWQgdG8gY2FuY2VsIHRoZSBzdG9wIHRoZSBhbmltYXRpb24gbG9vcC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fcmVxdWVzdElkID0gbnVsbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTdGFydHMgdGhlIGludGVybmFsIGFuaW1hdGlvbiBsb29wLlxyXG5cdCAqL1xyXG5cdHN0YXJ0KCkge1xyXG5cclxuXHRcdGNvbnN0IHVwZGF0ZSA9ICggdGltZSwgeHJGcmFtZSApID0+IHtcclxuXHJcblx0XHRcdHRoaXMuX3JlcXVlc3RJZCA9IHRoaXMuX2NvbnRleHQucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCB1cGRhdGUgKTtcclxuXHJcblx0XHRcdGlmICggdGhpcy5pbmZvLmF1dG9SZXNldCA9PT0gdHJ1ZSApIHRoaXMuaW5mby5yZXNldCgpO1xyXG5cclxuXHRcdFx0dGhpcy5ub2Rlcy5ub2RlRnJhbWUudXBkYXRlKCk7XHJcblxyXG5cdFx0XHR0aGlzLmluZm8uZnJhbWUgPSB0aGlzLm5vZGVzLm5vZGVGcmFtZS5mcmFtZUlkO1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLl9hbmltYXRpb25Mb29wICE9PSBudWxsICkgdGhpcy5fYW5pbWF0aW9uTG9vcCggdGltZSwgeHJGcmFtZSApO1xyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0dXBkYXRlKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3RvcHMgdGhlIGludGVybmFsIGFuaW1hdGlvbiBsb29wLlxyXG5cdCAqL1xyXG5cdHN0b3AoKSB7XHJcblxyXG5cdFx0dGhpcy5fY29udGV4dC5jYW5jZWxBbmltYXRpb25GcmFtZSggdGhpcy5fcmVxdWVzdElkICk7XHJcblxyXG5cdFx0dGhpcy5fcmVxdWVzdElkID0gbnVsbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSB1c2VyLWxldmVsIGFuaW1hdGlvbiBsb29wLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7P0Z1bmN0aW9ufSBUaGUgYW5pbWF0aW9uIGxvb3AuXHJcblx0ICovXHJcblx0Z2V0QW5pbWF0aW9uTG9vcCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fYW5pbWF0aW9uTG9vcDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWZpbmVzIHRoZSB1c2VyLWxldmVsIGFuaW1hdGlvbiBsb29wLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHs/RnVuY3Rpb259IGNhbGxiYWNrIC0gVGhlIGFuaW1hdGlvbiBsb29wLlxyXG5cdCAqL1xyXG5cdHNldEFuaW1hdGlvbkxvb3AoIGNhbGxiYWNrICkge1xyXG5cclxuXHRcdHRoaXMuX2FuaW1hdGlvbkxvb3AgPSBjYWxsYmFjaztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBhbmltYXRpb24gY29udGV4dC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1dpbmRvd3xYUlNlc3Npb259IFRoZSBhbmltYXRpb24gY29udGV4dC5cclxuXHQgKi9cclxuXHRnZXRDb250ZXh0KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9jb250ZXh0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgdGhlIGNvbnRleHQgaW4gd2hpY2ggYHJlcXVlc3RBbmltYXRpb25GcmFtZSgpYCBpcyBleGVjdXRlZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7V2luZG93fFhSU2Vzc2lvbn0gY29udGV4dCAtIFRoZSBjb250ZXh0IHRvIHNldC5cclxuXHQgKi9cclxuXHRzZXRDb250ZXh0KCBjb250ZXh0ICkge1xyXG5cclxuXHRcdHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZyZWVzIGFsbCBpbnRlcm5hbCByZXNvdXJjZXMgYW5kIHN0b3BzIHRoZSBhbmltYXRpb24gbG9vcC5cclxuXHQgKi9cclxuXHRkaXNwb3NlKCkge1xyXG5cclxuXHRcdHRoaXMuc3RvcCgpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBBbmltYXRpb247XHJcbiIsIi8qKlxyXG4gKiBEYXRhIHN0cnVjdHVyZSBmb3IgdGhlIHJlbmRlcmVyLiBJdCBhbGxvd3MgZGVmaW5pbmcgdmFsdWVzXHJcbiAqIHdpdGggY2hhaW5lZCwgaGllcmFyY2hpY2FsIGtleXMuIEtleXMgYXJlIG1lYW50IHRvIGJlXHJcbiAqIG9iamVjdHMgc2luY2UgdGhlIG1vZHVsZSBpbnRlcm5hbGx5IHdvcmtzIHdpdGggV2VhayBNYXBzXHJcbiAqIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuY2xhc3MgQ2hhaW5NYXAge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IENoYWluIE1hcC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByb290IFdlYWsgTWFwLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtXZWFrTWFwfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLndlYWtNYXAgPSBuZXcgV2Vha01hcCgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gYXJyYXkgb2Yga2V5cy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8T2JqZWN0Pn0ga2V5cyAtIExpc3Qgb2Yga2V5cy5cclxuXHQgKiBAcmV0dXJuIHthbnl9IFRoZSB2YWx1ZS4gUmV0dXJucyBgdW5kZWZpbmVkYCBpZiBubyB2YWx1ZSB3YXMgZm91bmQuXHJcblx0ICovXHJcblx0Z2V0KCBrZXlzICkge1xyXG5cclxuXHRcdGxldCBtYXAgPSB0aGlzLndlYWtNYXA7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGggLSAxOyBpICsrICkge1xyXG5cclxuXHRcdFx0bWFwID0gbWFwLmdldCgga2V5c1sgaSBdICk7XHJcblxyXG5cdFx0XHRpZiAoIG1hcCA9PT0gdW5kZWZpbmVkICkgcmV0dXJuIHVuZGVmaW5lZDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG1hcC5nZXQoIGtleXNbIGtleXMubGVuZ3RoIC0gMSBdICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBrZXlzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxPYmplY3Q+fSBrZXlzIC0gTGlzdCBvZiBrZXlzLlxyXG5cdCAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBzZXQuXHJcblx0ICogQHJldHVybiB7Q2hhaW5NYXB9IEEgcmVmZXJlbmNlIHRvIHRoaXMgQ2hhaW4gTWFwLlxyXG5cdCAqL1xyXG5cdHNldCgga2V5cywgdmFsdWUgKSB7XHJcblxyXG5cdFx0bGV0IG1hcCA9IHRoaXMud2Vha01hcDtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aCAtIDE7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBrZXkgPSBrZXlzWyBpIF07XHJcblxyXG5cdFx0XHRpZiAoIG1hcC5oYXMoIGtleSApID09PSBmYWxzZSApIG1hcC5zZXQoIGtleSwgbmV3IFdlYWtNYXAoKSApO1xyXG5cclxuXHRcdFx0bWFwID0gbWFwLmdldCgga2V5ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdG1hcC5zZXQoIGtleXNbIGtleXMubGVuZ3RoIC0gMSBdLCB2YWx1ZSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlbGV0ZXMgYSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGtleXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PE9iamVjdD59IGtleXMgLSBUaGUga2V5cy5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWUgaGFzIGJlZW4gcmVtb3ZlZCBzdWNjZXNzZnVsbHkgYW5kIGBmYWxzZWAgaWYgdGhlIHZhbHVlIGhhcyBub3QgYmUgZm91bmQuXHJcblx0ICovXHJcblx0ZGVsZXRlKCBrZXlzICkge1xyXG5cclxuXHRcdGxldCBtYXAgPSB0aGlzLndlYWtNYXA7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGggLSAxOyBpICsrICkge1xyXG5cclxuXHRcdFx0bWFwID0gbWFwLmdldCgga2V5c1sgaSBdICk7XHJcblxyXG5cdFx0XHRpZiAoIG1hcCA9PT0gdW5kZWZpbmVkICkgcmV0dXJuIGZhbHNlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbWFwLmRlbGV0ZSgga2V5c1sga2V5cy5sZW5ndGggLSAxIF0gKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQ2hhaW5NYXA7XHJcbiIsImltcG9ydCB7IGhhc2gsIGhhc2hTdHJpbmcgfSBmcm9tICcuLi8uLi9ub2Rlcy9jb3JlL05vZGVVdGlscy5qcyc7XHJcblxyXG5sZXQgX2lkID0gMDtcclxuXHJcbmZ1bmN0aW9uIGdldEtleXMoIG9iaiApIHtcclxuXHJcblx0Y29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKCBvYmogKTtcclxuXHJcblx0bGV0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKCBvYmogKTtcclxuXHJcblx0d2hpbGUgKCBwcm90byApIHtcclxuXHJcblx0XHRjb25zdCBkZXNjcmlwdG9ycyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKCBwcm90byApO1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IGtleSBpbiBkZXNjcmlwdG9ycyApIHtcclxuXHJcblx0XHRcdGlmICggZGVzY3JpcHRvcnNbIGtleSBdICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yc1sga2V5IF07XHJcblxyXG5cdFx0XHRcdGlmICggZGVzY3JpcHRvciAmJiB0eXBlb2YgZGVzY3JpcHRvci5nZXQgPT09ICdmdW5jdGlvbicgKSB7XHJcblxyXG5cdFx0XHRcdFx0a2V5cy5wdXNoKCBrZXkgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiggcHJvdG8gKTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4ga2V5cztcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBIHJlbmRlciBvYmplY3QgaXMgdGhlIHJlbmRlcmVyJ3MgcmVwcmVzZW50YXRpb24gb2Ygc2luZ2xlIGVudGl0eSB0aGF0IGdldHMgZHJhd25cclxuICogd2l0aCBhIGRyYXcgY29tbWFuZC4gVGhlcmUgaXMgbm8gdW5pcXVlIG1hcHBpbmcgb2YgcmVuZGVyIG9iamVjdHMgdG8gM0Qgb2JqZWN0cyBpbiB0aGVcclxuICogc2NlbmUgc2luY2UgcmVuZGVyIG9iamVjdHMgYWxzbyBkZXBlbmQgZnJvbSB0aGUgdXNlZCBtYXRlcmlhbCwgdGhlIGN1cnJlbnQgcmVuZGVyIGNvbnRleHRcclxuICogYW5kIHRoZSBjdXJyZW50IHNjZW5lJ3MgbGlnaHRpbmcuXHJcbiAqXHJcbiAqIEluIGdlbmVyYWwsIHRoZSBiYXNpYyBwcm9jZXNzIG9mIHRoZSByZW5kZXJlciBpczpcclxuICpcclxuICogLSBBbmFseXplIHRoZSAzRCBvYmplY3RzIGluIHRoZSBzY2VuZSBhbmQgZ2VuZXJhdGUgcmVuZGVyIGxpc3RzIGNvbnRhaW5pbmcgcmVuZGVyIGl0ZW1zLlxyXG4gKiAtIFByb2Nlc3MgdGhlIHJlbmRlciBsaXN0cyBieSBjYWxsaW5nIG9uZSBvciBtb3JlIHJlbmRlciBjb21tYW5kcyBmb3IgZWFjaCByZW5kZXIgaXRlbS5cclxuICogLSBGb3IgZWFjaCByZW5kZXIgY29tbWFuZCwgcmVxdWVzdCBhIHJlbmRlciBvYmplY3QgYW5kIHBlcmZvcm0gdGhlIGRyYXcuXHJcbiAqXHJcbiAqIFRoZSBtb2R1bGUgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIHRvIGdldCBkYXRhIHJlcXVpcmVkIGZvciB0aGUgZHJhdyBjb21tYW5kIGxpa2UgdGhlIGFjdHVhbFxyXG4gKiBkcmF3IHBhcmFtZXRlcnMgb3IgdmVydGV4IGJ1ZmZlcnMuIEl0IGFsc28gaG9sZHMgYSBzZXJpZXMgb2YgY2FjaGluZyByZWxhdGVkIG1ldGhvZHMgc2luY2VcclxuICogY3JlYXRpbmcgcmVuZGVyIG9iamVjdHMgc2hvdWxkIG9ubHkgYmUgZG9uZSB3aGVuIG5lY2Vzc2FyeS5cclxuICpcclxuICogQHByaXZhdGVcclxuICovXHJcbmNsYXNzIFJlbmRlck9iamVjdCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcmVuZGVyIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZXN9IG5vZGVzIC0gUmVuZGVyZXIgY29tcG9uZW50IGZvciBtYW5hZ2luZyBub2RlcyByZWxhdGVkIGxvZ2ljLlxyXG5cdCAqIEBwYXJhbSB7R2VvbWV0cmllc30gZ2VvbWV0cmllcyAtIFJlbmRlcmVyIGNvbXBvbmVudCBmb3IgbWFuYWdpbmcgZ2VvbWV0cmllcy5cclxuXHQgKiBAcGFyYW0ge1JlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcGFyYW0ge09iamVjdDNEfSBvYmplY3QgLSBUaGUgM0Qgb2JqZWN0LlxyXG5cdCAqIEBwYXJhbSB7TWF0ZXJpYWx9IG1hdGVyaWFsIC0gVGhlIDNEIG9iamVjdCdzIG1hdGVyaWFsLlxyXG5cdCAqIEBwYXJhbSB7U2NlbmV9IHNjZW5lIC0gVGhlIHNjZW5lIHRoZSAzRCBvYmplY3QgYmVsb25ncyB0by5cclxuXHQgKiBAcGFyYW0ge0NhbWVyYX0gY2FtZXJhIC0gVGhlIGNhbWVyYSB0aGUgb2JqZWN0IHNob3VsZCBiZSByZW5kZXJlZCB3aXRoLlxyXG5cdCAqIEBwYXJhbSB7TGlnaHRzTm9kZX0gbGlnaHRzTm9kZSAtIFRoZSBsaWdodHMgbm9kZS5cclxuXHQgKiBAcGFyYW0ge1JlbmRlckNvbnRleHR9IHJlbmRlckNvbnRleHQgLSBUaGUgcmVuZGVyIGNvbnRleHQuXHJcblx0ICogQHBhcmFtIHtDbGlwcGluZ0NvbnRleHR9IGNsaXBwaW5nQ29udGV4dCAtIFRoZSBjbGlwcGluZyBjb250ZXh0LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBub2RlcywgZ2VvbWV0cmllcywgcmVuZGVyZXIsIG9iamVjdCwgbWF0ZXJpYWwsIHNjZW5lLCBjYW1lcmEsIGxpZ2h0c05vZGUsIHJlbmRlckNvbnRleHQsIGNsaXBwaW5nQ29udGV4dCApIHtcclxuXHJcblx0XHR0aGlzLmlkID0gX2lkICsrO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVuZGVyZXIgY29tcG9uZW50IGZvciBtYW5hZ2luZyBub2RlcyByZWxhdGVkIGxvZ2ljLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2Rlc31cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX25vZGVzID0gbm9kZXM7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZW5kZXJlciBjb21wb25lbnQgZm9yIG1hbmFnaW5nIGdlb21ldHJpZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0dlb21ldHJpZXN9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9nZW9tZXRyaWVzID0gZ2VvbWV0cmllcztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByZW5kZXJlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7UmVuZGVyZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSAzRCBvYmplY3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdDNEfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm9iamVjdCA9IG9iamVjdDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSAzRCBvYmplY3QncyBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7TWF0ZXJpYWx9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWF0ZXJpYWwgPSBtYXRlcmlhbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBzY2VuZSB0aGUgM0Qgb2JqZWN0IGJlbG9uZ3MgdG8uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1NjZW5lfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNjZW5lID0gc2NlbmU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY2FtZXJhIHRoZSAzRCBvYmplY3Qgc2hvdWxkIGJlIHJlbmRlcmVkIHdpdGguXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0NhbWVyYX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jYW1lcmEgPSBjYW1lcmE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbGlnaHRzIG5vZGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0xpZ2h0c05vZGV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGlnaHRzTm9kZSA9IGxpZ2h0c05vZGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcmVuZGVyIGNvbnRleHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1JlbmRlckNvbnRleHR9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29udGV4dCA9IHJlbmRlckNvbnRleHQ7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgM0Qgb2JqZWN0J3MgZ2VvbWV0cnkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0J1ZmZlckdlb21ldHJ5fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdlb21ldHJ5ID0gb2JqZWN0Lmdlb21ldHJ5O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJlbmRlciBvYmplY3QncyB2ZXJzaW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudmVyc2lvbiA9IG1hdGVyaWFsLnZlcnNpb247XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZHJhdyByYW5nZSBvZiB0aGUgZ2VvbWV0cnkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9PYmplY3R9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZHJhd1JhbmdlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIGFycmF5IGhvbGRpbmcgdGhlIGJ1ZmZlciBhdHRyaWJ1dGVzXHJcblx0XHQgKiBvZiB0aGUgcmVuZGVyIG9iamVjdC4gVGhpcyBlbnRhaWxzIGF0dHJpYnV0ZVxyXG5cdFx0ICogZGVmaW5pdGlvbnMgb24gZ2VvbWV0cnkgYW5kIG5vZGUgbGV2ZWwuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9BcnJheTxCdWZmZXJBdHRyaWJ1dGU+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmF0dHJpYnV0ZXMgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gYSByZW5kZXIgcGlwZWxpbmUgdGhlIHJlbmRlclxyXG5cdFx0ICogb2JqZWN0IGlzIHByb2Nlc3NlZCB3aXRoLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtSZW5kZXJQaXBlbGluZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5waXBlbGluZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBPbmx5IHJlbGV2YW50IGZvciBvYmplY3RzIHVzaW5nXHJcblx0XHQgKiBtdWx0aXBsZSBtYXRlcmlhbHMuIFRoaXMgcmVwcmVzZW50cyBhIGdyb3VwIGVudHJ5XHJcblx0XHQgKiBmcm9tIHRoZSByZXNwZWN0aXZlIGBCdWZmZXJHZW9tZXRyeWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez97c3RhcnQ6IG51bWJlciwgY291bnQ6IG51bWJlcn19XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ3JvdXAgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQW4gYXJyYXkgaG9sZGluZyB0aGUgdmVydGV4IGJ1ZmZlcnMgd2hpY2ggY2FuXHJcblx0XHQgKiBiZSBidWZmZXIgYXR0cmlidXRlcyBidXQgYWxzbyBpbnRlcmxlYXZlZCBidWZmZXJzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/QXJyYXk8QnVmZmVyQXR0cmlidXRlfEludGVybGVhdmVkQnVmZmVyPn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52ZXJ0ZXhCdWZmZXJzID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZHJhdyBjb21tYW5kLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/T2JqZWN0fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRyYXdQYXJhbXMgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSWYgdGhpcyByZW5kZXIgb2JqZWN0IGlzIHVzZWQgaW5zaWRlIGEgcmVuZGVyIGJ1bmRsZSxcclxuXHRcdCAqIHRoaXMgcHJvcGVydHkgcG9pbnRzIHRvIHRoZSByZXNwZWN0aXZlIGJ1bmRsZSBncm91cC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P0J1bmRsZUdyb3VwfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJ1bmRsZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY2xpcHBpbmcgY29udGV4dC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Q2xpcHBpbmdDb250ZXh0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNsaXBwaW5nQ29udGV4dCA9IGNsaXBwaW5nQ29udGV4dDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjbGlwcGluZyBjb250ZXh0J3MgY2FjaGUga2V5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2xpcHBpbmdDb250ZXh0Q2FjaGVLZXkgPSBjbGlwcGluZ0NvbnRleHQgIT09IG51bGwgPyBjbGlwcGluZ0NvbnRleHQuY2FjaGVLZXkgOiAnJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBpbml0aWFsIG5vZGUgY2FjaGUga2V5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaW5pdGlhbE5vZGVzQ2FjaGVLZXkgPSB0aGlzLmdldER5bmFtaWNDYWNoZUtleSgpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGluaXRpYWwgY2FjaGUga2V5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaW5pdGlhbENhY2hlS2V5ID0gdGhpcy5nZXRDYWNoZUtleSgpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG5vZGUgYnVpbGRlciBzdGF0ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGVCdWlsZGVyU3RhdGV9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9ub2RlQnVpbGRlclN0YXRlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIGFycmF5IG9mIGJpbmRpbmdzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/QXJyYXk8QmluZEdyb3VwPn1cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX2JpbmRpbmdzID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlZmVyZW5jZSB0byB0aGUgbm9kZSBtYXRlcmlhbCBvYnNlcnZlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGVNYXRlcmlhbE9ic2VydmVyfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fbW9uaXRvciA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBldmVudCBsaXN0ZW5lciB3aGljaCBpcyBkZWZpbmVkIGJ5IGBSZW5kZXJPYmplY3RzYC4gSXQgcGVyZm9ybXNcclxuXHRcdCAqIGNsZWFuIHVwIHRhc2tzIHdoZW4gYGRpc3Bvc2UoKWAgb24gdGhpcyByZW5kZXIgb2JqZWN0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEBtZXRob2RcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5vbkRpc3Bvc2UgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1JlbmRlck9iamVjdCA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBldmVudCBsaXN0ZW5lciB3aGljaCBpcyBleGVjdXRlZCB3aGVuIGBkaXNwb3NlKClgIGlzIGNhbGxlZCBvblxyXG5cdFx0ICogdGhlIHJlbmRlciBvYmplY3QncyBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAbWV0aG9kXHJcblx0XHQgKi9cclxuXHRcdHRoaXMub25NYXRlcmlhbERpc3Bvc2UgPSAoKSA9PiB7XHJcblxyXG5cdFx0XHR0aGlzLmRpc3Bvc2UoKTtcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdHRoaXMubWF0ZXJpYWwuYWRkRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCB0aGlzLm9uTWF0ZXJpYWxEaXNwb3NlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgY2xpcHBpbmcgY29udGV4dC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Q2xpcHBpbmdDb250ZXh0fSBjb250ZXh0IC0gVGhlIGNsaXBwaW5nIGNvbnRleHQgdG8gc2V0LlxyXG5cdCAqL1xyXG5cdHVwZGF0ZUNsaXBwaW5nKCBjb250ZXh0ICkge1xyXG5cclxuXHRcdHRoaXMuY2xpcHBpbmdDb250ZXh0ID0gY29udGV4dDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBXaGV0aGVyIHRoZSBjbGlwcGluZyByZXF1aXJlcyBhbiB1cGRhdGUgb3Igbm90LlxyXG5cdCAqXHJcblx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0ICogQHJlYWRvbmx5XHJcblx0ICovXHJcblx0Z2V0IGNsaXBwaW5nTmVlZHNVcGRhdGUoKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmNsaXBwaW5nQ29udGV4dCA9PT0gbnVsbCB8fCB0aGlzLmNsaXBwaW5nQ29udGV4dC5jYWNoZUtleSA9PT0gdGhpcy5jbGlwcGluZ0NvbnRleHRDYWNoZUtleSApIHJldHVybiBmYWxzZTtcclxuXHJcblx0XHR0aGlzLmNsaXBwaW5nQ29udGV4dENhY2hlS2V5ID0gdGhpcy5jbGlwcGluZ0NvbnRleHQuY2FjaGVLZXk7XHJcblxyXG5cdFx0cmV0dXJuIHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIG51bWJlciBvZiBjbGlwcGluZyBwbGFuZXMgZGVmaW5lZCBpbiBjb250ZXh0IG9mIGhhcmR3YXJlIGNsaXBwaW5nLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge251bWJlcn1cclxuXHQgKiBAcmVhZG9ubHlcclxuXHQgKi9cclxuXHRnZXQgaGFyZHdhcmVDbGlwcGluZ1BsYW5lcygpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5tYXRlcmlhbC5oYXJkd2FyZUNsaXBwaW5nID09PSB0cnVlID8gdGhpcy5jbGlwcGluZ0NvbnRleHQudW5pb25DbGlwcGluZ0NvdW50IDogMDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBub2RlIGJ1aWxkZXIgc3RhdGUgb2YgdGhpcyByZW5kZXIgb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Tm9kZUJ1aWxkZXJTdGF0ZX0gVGhlIG5vZGUgYnVpbGRlciBzdGF0ZS5cclxuXHQgKi9cclxuXHRnZXROb2RlQnVpbGRlclN0YXRlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9ub2RlQnVpbGRlclN0YXRlIHx8ICggdGhpcy5fbm9kZUJ1aWxkZXJTdGF0ZSA9IHRoaXMuX25vZGVzLmdldEZvclJlbmRlciggdGhpcyApICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgbm9kZSBtYXRlcmlhbCBvYnNlcnZlciBvZiB0aGlzIHJlbmRlciBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtOb2RlTWF0ZXJpYWxPYnNlcnZlcn0gVGhlIG5vZGUgbWF0ZXJpYWwgb2JzZXJ2ZXIuXHJcblx0ICovXHJcblx0Z2V0TW9uaXRvcigpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fbW9uaXRvciB8fCAoIHRoaXMuX21vbml0b3IgPSB0aGlzLmdldE5vZGVCdWlsZGVyU3RhdGUoKS5vYnNlcnZlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYW4gYXJyYXkgb2YgYmluZCBncm91cHMgb2YgdGhpcyByZW5kZXIgb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7QXJyYXk8QmluZEdyb3VwPn0gVGhlIGJpbmRpbmdzLlxyXG5cdCAqL1xyXG5cdGdldEJpbmRpbmdzKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9iaW5kaW5ncyB8fCAoIHRoaXMuX2JpbmRpbmdzID0gdGhpcy5nZXROb2RlQnVpbGRlclN0YXRlKCkuY3JlYXRlQmluZGluZ3MoKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBiaW5kaW5nIGdyb3VwIGJ5IGdyb3VwIG5hbWUgb2YgdGhpcyByZW5kZXIgb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgYmluZGluZyBncm91cC5cclxuXHQgKiBAcmV0dXJuIHs/QmluZEdyb3VwfSBUaGUgYmluZGluZ3MuXHJcblx0ICovXHJcblx0Z2V0QmluZGluZ0dyb3VwKCBuYW1lICkge1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IGJpbmRpbmdHcm91cCBvZiB0aGlzLmdldEJpbmRpbmdzKCkgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGJpbmRpbmdHcm91cC5uYW1lID09PSBuYW1lICkge1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gYmluZGluZ0dyb3VwO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgcmVuZGVyIG9iamVjdCdzIGdlb21ldHJ5LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7P0J1ZmZlckF0dHJpYnV0ZX0gVGhlIGluZGV4LiBSZXR1cm5zIGBudWxsYCBmb3Igbm9uLWluZGV4ZWQgZ2VvbWV0cmllcy5cclxuXHQgKi9cclxuXHRnZXRJbmRleCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fZ2VvbWV0cmllcy5nZXRJbmRleCggdGhpcyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGluZGlyZWN0IGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHs/QnVmZmVyQXR0cmlidXRlfSBUaGUgaW5kaXJlY3QgYXR0cmlidXRlLiBgbnVsbGAgaWYgbm8gaW5kaXJlY3QgZHJhd2luZyBpcyB1c2VkLlxyXG5cdCAqL1xyXG5cdGdldEluZGlyZWN0KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9nZW9tZXRyaWVzLmdldEluZGlyZWN0KCB0aGlzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhbiBhcnJheSB0aGF0IGFjdHMgYXMgYSBrZXkgZm9yIGlkZW50aWZ5aW5nIHRoZSByZW5kZXIgb2JqZWN0IGluIGEgY2hhaW4gbWFwLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7QXJyYXk8T2JqZWN0Pn0gQW4gYXJyYXkgd2l0aCBvYmplY3QgcmVmZXJlbmNlcy5cclxuXHQgKi9cclxuXHRnZXRDaGFpbkFycmF5KCkge1xyXG5cclxuXHRcdHJldHVybiBbIHRoaXMub2JqZWN0LCB0aGlzLm1hdGVyaWFsLCB0aGlzLmNvbnRleHQsIHRoaXMubGlnaHRzTm9kZSBdO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgd2hlbiB0aGUgZ2VvbWV0cnkgb2YgYSAzRCBvYmplY3QgaGFzIGJlZW4gZXhjaGFuZ2VkIGFuZCB0aGVcclxuXHQgKiByZXNwZWN0aXZlIHJlbmRlciBvYmplY3Qgbm93IHJlcXVpcmVzIGFuIHVwZGF0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyR2VvbWV0cnl9IGdlb21ldHJ5IC0gVGhlIGdlb21ldHJ5IHRvIHNldC5cclxuXHQgKi9cclxuXHRzZXRHZW9tZXRyeSggZ2VvbWV0cnkgKSB7XHJcblxyXG5cdFx0dGhpcy5nZW9tZXRyeSA9IGdlb21ldHJ5O1xyXG5cdFx0dGhpcy5hdHRyaWJ1dGVzID0gbnVsbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBidWZmZXIgYXR0cmlidXRlcyBvZiB0aGUgcmVuZGVyIG9iamVjdC4gVGhlIHJldHVybmVkIGFycmF5IGhvbGRzXHJcblx0ICogYXR0cmlidXRlIGRlZmluaXRpb25zIG9uIGdlb21ldHJ5IGFuZCBub2RlIGxldmVsLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7QXJyYXk8QnVmZmVyQXR0cmlidXRlPn0gQW4gYXJyYXkgd2l0aCBidWZmZXIgYXR0cmlidXRlcy5cclxuXHQgKi9cclxuXHRnZXRBdHRyaWJ1dGVzKCkge1xyXG5cclxuXHRcdGlmICggdGhpcy5hdHRyaWJ1dGVzICE9PSBudWxsICkgcmV0dXJuIHRoaXMuYXR0cmlidXRlcztcclxuXHJcblx0XHRjb25zdCBub2RlQXR0cmlidXRlcyA9IHRoaXMuZ2V0Tm9kZUJ1aWxkZXJTdGF0ZSgpLm5vZGVBdHRyaWJ1dGVzO1xyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xyXG5cclxuXHRcdGNvbnN0IGF0dHJpYnV0ZXMgPSBbXTtcclxuXHRcdGNvbnN0IHZlcnRleEJ1ZmZlcnMgPSBuZXcgU2V0KCk7XHJcblxyXG5cdFx0Zm9yICggY29uc3Qgbm9kZUF0dHJpYnV0ZSBvZiBub2RlQXR0cmlidXRlcyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGF0dHJpYnV0ZSA9IG5vZGVBdHRyaWJ1dGUubm9kZSAmJiBub2RlQXR0cmlidXRlLm5vZGUuYXR0cmlidXRlID8gbm9kZUF0dHJpYnV0ZS5ub2RlLmF0dHJpYnV0ZSA6IGdlb21ldHJ5LmdldEF0dHJpYnV0ZSggbm9kZUF0dHJpYnV0ZS5uYW1lICk7XHJcblxyXG5cdFx0XHRpZiAoIGF0dHJpYnV0ZSA9PT0gdW5kZWZpbmVkICkgY29udGludWU7XHJcblxyXG5cdFx0XHRhdHRyaWJ1dGVzLnB1c2goIGF0dHJpYnV0ZSApO1xyXG5cclxuXHRcdFx0Y29uc3QgYnVmZmVyQXR0cmlidXRlID0gYXR0cmlidXRlLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgPyBhdHRyaWJ1dGUuZGF0YSA6IGF0dHJpYnV0ZTtcclxuXHRcdFx0dmVydGV4QnVmZmVycy5hZGQoIGJ1ZmZlckF0dHJpYnV0ZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzO1xyXG5cdFx0dGhpcy52ZXJ0ZXhCdWZmZXJzID0gQXJyYXkuZnJvbSggdmVydGV4QnVmZmVycy52YWx1ZXMoKSApO1xyXG5cclxuXHRcdHJldHVybiBhdHRyaWJ1dGVzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHZlcnRleCBidWZmZXJzIG9mIHRoZSByZW5kZXIgb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7QXJyYXk8QnVmZmVyQXR0cmlidXRlfEludGVybGVhdmVkQnVmZmVyPn0gQW4gYXJyYXkgd2l0aCBidWZmZXIgYXR0cmlidXRlIG9yIGludGVybGVhdmVkIGJ1ZmZlcnMuXHJcblx0ICovXHJcblx0Z2V0VmVydGV4QnVmZmVycygpIHtcclxuXHJcblx0XHRpZiAoIHRoaXMudmVydGV4QnVmZmVycyA9PT0gbnVsbCApIHRoaXMuZ2V0QXR0cmlidXRlcygpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnZlcnRleEJ1ZmZlcnM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgZHJhdyBwYXJhbWV0ZXJzIGZvciB0aGUgcmVuZGVyIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4gez97dmVydGV4Q291bnQ6IG51bWJlciwgZmlyc3RWZXJ0ZXg6IG51bWJlciwgaW5zdGFuY2VDb3VudDogbnVtYmVyLCBmaXJzdEluc3RhbmNlOiBudW1iZXJ9fSBUaGUgZHJhdyBwYXJhbWV0ZXJzLlxyXG5cdCAqL1xyXG5cdGdldERyYXdQYXJhbWV0ZXJzKCkge1xyXG5cclxuXHRcdGNvbnN0IHsgb2JqZWN0LCBtYXRlcmlhbCwgZ2VvbWV0cnksIGdyb3VwLCBkcmF3UmFuZ2UgfSA9IHRoaXM7XHJcblxyXG5cdFx0Y29uc3QgZHJhd1BhcmFtcyA9IHRoaXMuZHJhd1BhcmFtcyB8fCAoIHRoaXMuZHJhd1BhcmFtcyA9IHtcclxuXHRcdFx0dmVydGV4Q291bnQ6IDAsXHJcblx0XHRcdGZpcnN0VmVydGV4OiAwLFxyXG5cdFx0XHRpbnN0YW5jZUNvdW50OiAwLFxyXG5cdFx0XHRmaXJzdEluc3RhbmNlOiAwXHJcblx0XHR9ICk7XHJcblxyXG5cdFx0Y29uc3QgaW5kZXggPSB0aGlzLmdldEluZGV4KCk7XHJcblx0XHRjb25zdCBoYXNJbmRleCA9ICggaW5kZXggIT09IG51bGwgKTtcclxuXHRcdGNvbnN0IGluc3RhbmNlQ291bnQgPSBnZW9tZXRyeS5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5ID8gZ2VvbWV0cnkuaW5zdGFuY2VDb3VudCA6ICggb2JqZWN0LmNvdW50ID4gMSA/IG9iamVjdC5jb3VudCA6IDEgKTtcclxuXHJcblx0XHRpZiAoIGluc3RhbmNlQ291bnQgPT09IDAgKSByZXR1cm4gbnVsbDtcclxuXHJcblx0XHRkcmF3UGFyYW1zLmluc3RhbmNlQ291bnQgPSBpbnN0YW5jZUNvdW50O1xyXG5cclxuXHRcdGlmICggb2JqZWN0LmlzQmF0Y2hlZE1lc2ggPT09IHRydWUgKSByZXR1cm4gZHJhd1BhcmFtcztcclxuXHJcblx0XHRsZXQgcmFuZ2VGYWN0b3IgPSAxO1xyXG5cclxuXHRcdGlmICggbWF0ZXJpYWwud2lyZWZyYW1lID09PSB0cnVlICYmICEgb2JqZWN0LmlzUG9pbnRzICYmICEgb2JqZWN0LmlzTGluZVNlZ21lbnRzICYmICEgb2JqZWN0LmlzTGluZSAmJiAhIG9iamVjdC5pc0xpbmVMb29wICkge1xyXG5cclxuXHRcdFx0cmFuZ2VGYWN0b3IgPSAyO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRsZXQgZmlyc3RWZXJ0ZXggPSBkcmF3UmFuZ2Uuc3RhcnQgKiByYW5nZUZhY3RvcjtcclxuXHRcdGxldCBsYXN0VmVydGV4ID0gKCBkcmF3UmFuZ2Uuc3RhcnQgKyBkcmF3UmFuZ2UuY291bnQgKSAqIHJhbmdlRmFjdG9yO1xyXG5cclxuXHRcdGlmICggZ3JvdXAgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRmaXJzdFZlcnRleCA9IE1hdGgubWF4KCBmaXJzdFZlcnRleCwgZ3JvdXAuc3RhcnQgKiByYW5nZUZhY3RvciApO1xyXG5cdFx0XHRsYXN0VmVydGV4ID0gTWF0aC5taW4oIGxhc3RWZXJ0ZXgsICggZ3JvdXAuc3RhcnQgKyBncm91cC5jb3VudCApICogcmFuZ2VGYWN0b3IgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgcG9zaXRpb24gPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xyXG5cdFx0bGV0IGl0ZW1Db3VudCA9IEluZmluaXR5O1xyXG5cclxuXHRcdGlmICggaGFzSW5kZXggKSB7XHJcblxyXG5cdFx0XHRpdGVtQ291bnQgPSBpbmRleC5jb3VudDtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBwb3NpdGlvbiAhPT0gdW5kZWZpbmVkICYmIHBvc2l0aW9uICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0aXRlbUNvdW50ID0gcG9zaXRpb24uY291bnQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZpcnN0VmVydGV4ID0gTWF0aC5tYXgoIGZpcnN0VmVydGV4LCAwICk7XHJcblx0XHRsYXN0VmVydGV4ID0gTWF0aC5taW4oIGxhc3RWZXJ0ZXgsIGl0ZW1Db3VudCApO1xyXG5cclxuXHRcdGNvbnN0IGNvdW50ID0gbGFzdFZlcnRleCAtIGZpcnN0VmVydGV4O1xyXG5cclxuXHRcdGlmICggY291bnQgPCAwIHx8IGNvdW50ID09PSBJbmZpbml0eSApIHJldHVybiBudWxsO1xyXG5cclxuXHRcdGRyYXdQYXJhbXMudmVydGV4Q291bnQgPSBjb3VudDtcclxuXHRcdGRyYXdQYXJhbXMuZmlyc3RWZXJ0ZXggPSBmaXJzdFZlcnRleDtcclxuXHJcblx0XHRyZXR1cm4gZHJhd1BhcmFtcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSByZW5kZXIgb2JqZWN0J3MgZ2VvbWV0cnkgY2FjaGUga2V5LlxyXG5cdCAqXHJcblx0ICogVGhlIGdlb21ldHJ5IGNhY2hlIGtleSBpcyBwYXJ0IG9mIHRoZSBtYXRlcmlhbCBjYWNoZSBrZXkuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBnZW9tZXRyeSBjYWNoZSBrZXkuXHJcblx0ICovXHJcblx0Z2V0R2VvbWV0cnlDYWNoZUtleSgpIHtcclxuXHJcblx0XHRjb25zdCB7IGdlb21ldHJ5IH0gPSB0aGlzO1xyXG5cclxuXHRcdGxldCBjYWNoZUtleSA9ICcnO1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoIGdlb21ldHJ5LmF0dHJpYnV0ZXMgKS5zb3J0KCkgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBhdHRyaWJ1dGUgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzWyBuYW1lIF07XHJcblxyXG5cdFx0XHRjYWNoZUtleSArPSBuYW1lICsgJywnO1xyXG5cclxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUuZGF0YSApIGNhY2hlS2V5ICs9IGF0dHJpYnV0ZS5kYXRhLnN0cmlkZSArICcsJztcclxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUub2Zmc2V0ICkgY2FjaGVLZXkgKz0gYXR0cmlidXRlLm9mZnNldCArICcsJztcclxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUuaXRlbVNpemUgKSBjYWNoZUtleSArPSBhdHRyaWJ1dGUuaXRlbVNpemUgKyAnLCc7XHJcblx0XHRcdGlmICggYXR0cmlidXRlLm5vcm1hbGl6ZWQgKSBjYWNoZUtleSArPSAnbiwnO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBzdHJ1Y3R1cmFsIGVxdWFsaXR5IGlzbid0IHN1ZmZpY2llbnQgZm9yIG1vcnBoIHRhcmdldHMgc2luY2UgdGhlXHJcblx0XHQvLyBkYXRhIGFyZSBtYWludGFpbmVkIGluIHRleHR1cmVzLiBvbmx5IGlmIHRoZSB0YXJnZXRzIGFyZSBhbGwgZXF1YWxcclxuXHRcdC8vIHRoZSB0ZXh0dXJlIGFuZCB0aHVzIHRoZSBpbnN0YW5jZSBvZiBgTW9ycGhOb2RlYCBjYW4gYmUgc2hhcmVkLlxyXG5cclxuXHRcdGZvciAoIGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoIGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcyApLnNvcnQoKSApIHtcclxuXHJcblx0XHRcdGNvbnN0IHRhcmdldHMgPSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXNbIG5hbWUgXTtcclxuXHJcblx0XHRcdGNhY2hlS2V5ICs9ICdtb3JwaC0nICsgbmFtZSArICcsJztcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHRhcmdldHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgYXR0cmlidXRlID0gdGFyZ2V0c1sgaSBdO1xyXG5cclxuXHRcdFx0XHRjYWNoZUtleSArPSBhdHRyaWJ1dGUuaWQgKyAnLCc7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggZ2VvbWV0cnkuaW5kZXggKSB7XHJcblxyXG5cdFx0XHRjYWNoZUtleSArPSAnaW5kZXgsJztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGNhY2hlS2V5O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHJlbmRlciBvYmplY3QncyBtYXRlcmlhbCBjYWNoZSBrZXkuXHJcblx0ICpcclxuXHQgKiBUaGUgbWF0ZXJpYWwgY2FjaGUga2V5IGlzIHBhcnQgb2YgdGhlIHJlbmRlciBvYmplY3QgY2FjaGUga2V5LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgbWF0ZXJpYWwgY2FjaGUga2V5LlxyXG5cdCAqL1xyXG5cdGdldE1hdGVyaWFsQ2FjaGVLZXkoKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBvYmplY3QsIG1hdGVyaWFsIH0gPSB0aGlzO1xyXG5cclxuXHRcdGxldCBjYWNoZUtleSA9IG1hdGVyaWFsLmN1c3RvbVByb2dyYW1DYWNoZUtleSgpO1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IHByb3BlcnR5IG9mIGdldEtleXMoIG1hdGVyaWFsICkgKSB7XHJcblxyXG5cdFx0XHRpZiAoIC9eKGlzW0EtWl18Xyl8Xih2aXNpYmxlfHZlcnNpb258dXVpZHxuYW1lfG9wYWNpdHl8dXNlckRhdGEpJC8udGVzdCggcHJvcGVydHkgKSApIGNvbnRpbnVlO1xyXG5cclxuXHRcdFx0Y29uc3QgdmFsdWUgPSBtYXRlcmlhbFsgcHJvcGVydHkgXTtcclxuXHJcblx0XHRcdGxldCB2YWx1ZUtleTtcclxuXHJcblx0XHRcdGlmICggdmFsdWUgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdC8vIHNvbWUgbWF0ZXJpYWwgdmFsdWVzIHJlcXVpcmUgYSBmb3JtYXR0aW5nXHJcblxyXG5cdFx0XHRcdGNvbnN0IHR5cGUgPSB0eXBlb2YgdmFsdWU7XHJcblxyXG5cdFx0XHRcdGlmICggdHlwZSA9PT0gJ251bWJlcicgKSB7XHJcblxyXG5cdFx0XHRcdFx0dmFsdWVLZXkgPSB2YWx1ZSAhPT0gMCA/ICcxJyA6ICcwJzsgLy8gQ29udmVydCB0byBvbi9vZmYsIGltcG9ydGFudCBmb3IgY2xlYXJjb2F0LCB0cmFuc21pc3Npb24sIGV0Y1xyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCB0eXBlID09PSAnb2JqZWN0JyApIHtcclxuXHJcblx0XHRcdFx0XHR2YWx1ZUtleSA9ICd7JztcclxuXHJcblx0XHRcdFx0XHRpZiAoIHZhbHVlLmlzVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdHZhbHVlS2V5ICs9IHZhbHVlLm1hcHBpbmc7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHZhbHVlS2V5ICs9ICd9JztcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHR2YWx1ZUtleSA9IFN0cmluZyggdmFsdWUgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0dmFsdWVLZXkgPSBTdHJpbmcoIHZhbHVlICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjYWNoZUtleSArPSAvKnByb3BlcnR5ICsgJzonICsqLyB2YWx1ZUtleSArICcsJztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y2FjaGVLZXkgKz0gdGhpcy5jbGlwcGluZ0NvbnRleHRDYWNoZUtleSArICcsJztcclxuXHJcblx0XHRpZiAoIG9iamVjdC5nZW9tZXRyeSApIHtcclxuXHJcblx0XHRcdGNhY2hlS2V5ICs9IHRoaXMuZ2V0R2VvbWV0cnlDYWNoZUtleSgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIG9iamVjdC5za2VsZXRvbiApIHtcclxuXHJcblx0XHRcdGNhY2hlS2V5ICs9IG9iamVjdC5za2VsZXRvbi5ib25lcy5sZW5ndGggKyAnLCc7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggb2JqZWN0LmlzQmF0Y2hlZE1lc2ggKSB7XHJcblxyXG5cdFx0XHRjYWNoZUtleSArPSBvYmplY3QuX21hdHJpY2VzVGV4dHVyZS51dWlkICsgJywnO1xyXG5cclxuXHRcdFx0aWYgKCBvYmplY3QuX2NvbG9yc1RleHR1cmUgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdGNhY2hlS2V5ICs9IG9iamVjdC5fY29sb3JzVGV4dHVyZS51dWlkICsgJywnO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIG9iamVjdC5jb3VudCA+IDEgKSB7XHJcblxyXG5cdFx0XHQvLyBUT0RPOiBodHRwczovL2dpdGh1Yi5jb20vbXJkb29iL3RocmVlLmpzL3B1bGwvMjkwNjYjaXNzdWVjb21tZW50LTIyNjk0MDA4NTBcclxuXHJcblx0XHRcdGNhY2hlS2V5ICs9IG9iamVjdC51dWlkICsgJywnO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjYWNoZUtleSArPSBvYmplY3QucmVjZWl2ZVNoYWRvdyArICcsJztcclxuXHJcblx0XHRyZXR1cm4gaGFzaFN0cmluZyggY2FjaGVLZXkgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBXaGV0aGVyIHRoZSBnZW9tZXRyeSByZXF1aXJlcyBhbiB1cGRhdGUgb3Igbm90LlxyXG5cdCAqXHJcblx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0ICogQHJlYWRvbmx5XHJcblx0ICovXHJcblx0Z2V0IG5lZWRzR2VvbWV0cnlVcGRhdGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZ2VvbWV0cnkuaWQgIT09IHRoaXMub2JqZWN0Lmdlb21ldHJ5LmlkO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdoZXRoZXIgdGhlIHJlbmRlciBvYmplY3QgcmVxdWlyZXMgYW4gdXBkYXRlIG9yIG5vdC5cclxuXHQgKlxyXG5cdCAqIE5vdGU6IFRoZXJlIGFyZSB0d28gZGlzdGluY3QgcGxhY2VzIHdoZXJlIHJlbmRlciBvYmplY3RzIGFyZSBjaGVja2VkIGZvciBhbiB1cGRhdGUuXHJcblx0ICpcclxuXHQgKiAxLiBJbiBgUmVuZGVyT2JqZWN0cy5nZXQoKWAgd2hpY2ggaXMgZXhlY3V0ZWQgd2hlbiB0aGUgcmVuZGVyIG9iamVjdCBpcyByZXF1ZXN0LiBUaGlzXHJcblx0ICogbWV0aG9kIGNoZWNrcyB0aGUgYG5lZWRzVXBkYXRlYCBmbGFnIGFuZCByZWNyZWF0ZXMgdGhlIHJlbmRlciBvYmplY3QgaWYgbmVjZXNzYXJ5LlxyXG5cdCAqIDIuIEluIGBSZW5kZXJlci5fcmVuZGVyT2JqZWN0RGlyZWN0KClgIHJpZ2h0IGFmdGVyIGdldHRpbmcgdGhlIHJlbmRlciBvYmplY3QgdmlhXHJcblx0ICogYFJlbmRlck9iamVjdHMuZ2V0KClgLiBUaGUgcmVuZGVyIG9iamVjdCdzIE5vZGVNYXRlcmlhbE9ic2VydmVyIGlzIHRoZW4gdXNlZCB0byBkZXRlY3RcclxuXHQgKiBhIG5lZWQgZm9yIGEgcmVmcmVzaCBkdWUgdG8gbWF0ZXJpYWwsIGdlb21ldHJ5IG9yIG9iamVjdCByZWxhdGVkIHZhbHVlIGNoYW5nZXMuXHJcblx0ICpcclxuXHQgKiBUT0RPOiBJbnZlc3RpZ2F0ZSBpZiBpdCdzIHBvc3NpYmxlIHRvIG1lcmdlIGJvdGggc3RlcHMgc28gdGhlcmUgaXMgb25seSBhIHNpbmdsZSBwbGFjZVxyXG5cdCAqIHRoYXQgcGVyZm9ybXMgdGhlICduZWVkc1VwZGF0ZScgY2hlY2suXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHQgKiBAcmVhZG9ubHlcclxuXHQgKi9cclxuXHRnZXQgbmVlZHNVcGRhdGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIC8qdGhpcy5vYmplY3Quc3RhdGljICE9PSB0cnVlICYmKi8gKCB0aGlzLmluaXRpYWxOb2Rlc0NhY2hlS2V5ICE9PSB0aGlzLmdldER5bmFtaWNDYWNoZUtleSgpIHx8IHRoaXMuY2xpcHBpbmdOZWVkc1VwZGF0ZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGR5bmFtaWMgY2FjaGUga2V5IHdoaWNoIHJlcHJlc2VudHMgYSBrZXkgdGhhdCBpcyBjb21wdXRlZCBwZXIgZHJhdyBjb21tYW5kLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgY2FjaGUga2V5LlxyXG5cdCAqL1xyXG5cdGdldER5bmFtaWNDYWNoZUtleSgpIHtcclxuXHJcblx0XHRsZXQgY2FjaGVLZXkgPSAwO1xyXG5cclxuXHRcdC8vIGBOb2Rlcy5nZXRDYWNoZUtleSgpYCByZXR1cm5zIGFuIGVudmlyb25tZW50IGNhY2hlIGtleSB3aGljaCBpcyBub3QgcmVsZXZhbnQgd2hlblxyXG5cdFx0Ly8gdGhlIHJlbmRlcmVyIGlzIGluc2lkZSBhIHNoYWRvdyBwYXNzLlxyXG5cclxuXHRcdGlmICggdGhpcy5tYXRlcmlhbC5pc1NoYWRvd1Bhc3NNYXRlcmlhbCAhPT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdGNhY2hlS2V5ID0gdGhpcy5fbm9kZXMuZ2V0Q2FjaGVLZXkoIHRoaXMuc2NlbmUsIHRoaXMubGlnaHRzTm9kZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMuY2FtZXJhLmlzQXJyYXlDYW1lcmEgKSB7XHJcblxyXG5cdFx0XHRjYWNoZUtleSA9IGhhc2goIGNhY2hlS2V5LCB0aGlzLmNhbWVyYS5jYW1lcmFzLmxlbmd0aCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMub2JqZWN0LnJlY2VpdmVTaGFkb3cgKSB7XHJcblxyXG5cdFx0XHRjYWNoZUtleSA9IGhhc2goIGNhY2hlS2V5LCAxICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBjYWNoZUtleTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSByZW5kZXIgb2JqZWN0J3MgY2FjaGUga2V5LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgY2FjaGUga2V5LlxyXG5cdCAqL1xyXG5cdGdldENhY2hlS2V5KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmdldE1hdGVyaWFsQ2FjaGVLZXkoKSArIHRoaXMuZ2V0RHluYW1pY0NhY2hlS2V5KCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRnJlZXMgaW50ZXJuYWwgcmVzb3VyY2VzLlxyXG5cdCAqL1xyXG5cdGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0dGhpcy5tYXRlcmlhbC5yZW1vdmVFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIHRoaXMub25NYXRlcmlhbERpc3Bvc2UgKTtcclxuXHJcblx0XHR0aGlzLm9uRGlzcG9zZSgpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBSZW5kZXJPYmplY3Q7XHJcbiIsImltcG9ydCBDaGFpbk1hcCBmcm9tICcuL0NoYWluTWFwLmpzJztcclxuaW1wb3J0IFJlbmRlck9iamVjdCBmcm9tICcuL1JlbmRlck9iamVjdC5qcyc7XHJcblxyXG5jb25zdCBfY2hhaW5LZXlzID0gW107XHJcblxyXG4vKipcclxuICogVGhpcyBtb2R1bGUgbWFuYWdlcyB0aGUgcmVuZGVyIG9iamVjdHMgb2YgdGhlIHJlbmRlcmVyLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuY2xhc3MgUmVuZGVyT2JqZWN0cyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcmVuZGVyIG9iamVjdCBtYW5hZ2VtZW50IGNvbXBvbmVudC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7Tm9kZXN9IG5vZGVzIC0gUmVuZGVyZXIgY29tcG9uZW50IGZvciBtYW5hZ2luZyBub2RlcyByZWxhdGVkIGxvZ2ljLlxyXG5cdCAqIEBwYXJhbSB7R2VvbWV0cmllc30gZ2VvbWV0cmllcyAtIFJlbmRlcmVyIGNvbXBvbmVudCBmb3IgbWFuYWdpbmcgZ2VvbWV0cmllcy5cclxuXHQgKiBAcGFyYW0ge1BpcGVsaW5lc30gcGlwZWxpbmVzIC0gUmVuZGVyZXIgY29tcG9uZW50IGZvciBtYW5hZ2luZyBwaXBlbGluZXMuXHJcblx0ICogQHBhcmFtIHtCaW5kaW5nc30gYmluZGluZ3MgLSBSZW5kZXJlciBjb21wb25lbnQgZm9yIG1hbmFnaW5nIGJpbmRpbmdzLlxyXG5cdCAqIEBwYXJhbSB7SW5mb30gaW5mbyAtIFJlbmRlcmVyIGNvbXBvbmVudCBmb3IgbWFuYWdpbmcgbWV0cmljcyBhbmQgbW9uaXRvcmluZyBkYXRhLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCByZW5kZXJlciwgbm9kZXMsIGdlb21ldHJpZXMsIHBpcGVsaW5lcywgYmluZGluZ3MsIGluZm8gKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcmVuZGVyZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1JlbmRlcmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZW5kZXJlciBjb21wb25lbnQgZm9yIG1hbmFnaW5nIG5vZGVzIHJlbGF0ZWQgbG9naWMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGVzfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vZGVzID0gbm9kZXM7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZW5kZXJlciBjb21wb25lbnQgZm9yIG1hbmFnaW5nIGdlb21ldHJpZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0dlb21ldHJpZXN9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ2VvbWV0cmllcyA9IGdlb21ldHJpZXM7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZW5kZXJlciBjb21wb25lbnQgZm9yIG1hbmFnaW5nIHBpcGVsaW5lcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7UGlwZWxpbmVzfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBpcGVsaW5lcyA9IHBpcGVsaW5lcztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlbmRlcmVyIGNvbXBvbmVudCBmb3IgbWFuYWdpbmcgYmluZGluZ3MuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0JpbmRpbmdzfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJpbmRpbmdzID0gYmluZGluZ3M7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZW5kZXJlciBjb21wb25lbnQgZm9yIG1hbmFnaW5nIG1ldHJpY3MgYW5kIG1vbml0b3JpbmcgZGF0YS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7SW5mb31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pbmZvID0gaW5mbztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgZGljdGlvbmFyeSB0aGF0IG1hbmFnZXMgcmVuZGVyIGNvbnRleHRzIGluIGNoYWluIG1hcHNcclxuXHRcdCAqIGZvciBlYWNoIHBhc3MgSUQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdDxzdHJpbmcsQ2hhaW5NYXA+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNoYWluTWFwcyA9IHt9O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSByZW5kZXIgb2JqZWN0IGZvciB0aGUgZ2l2ZW4gb2JqZWN0IGFuZCBzdGF0ZSBkYXRhLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3QzRH0gb2JqZWN0IC0gVGhlIDNEIG9iamVjdC5cclxuXHQgKiBAcGFyYW0ge01hdGVyaWFsfSBtYXRlcmlhbCAtIFRoZSAzRCBvYmplY3QncyBtYXRlcmlhbC5cclxuXHQgKiBAcGFyYW0ge1NjZW5lfSBzY2VuZSAtIFRoZSBzY2VuZSB0aGUgM0Qgb2JqZWN0IGJlbG9uZ3MgdG8uXHJcblx0ICogQHBhcmFtIHtDYW1lcmF9IGNhbWVyYSAtIFRoZSBjYW1lcmEgdGhlIDNEIG9iamVjdCBzaG91bGQgYmUgcmVuZGVyZWQgd2l0aC5cclxuXHQgKiBAcGFyYW0ge0xpZ2h0c05vZGV9IGxpZ2h0c05vZGUgLSBUaGUgbGlnaHRzIG5vZGUuXHJcblx0ICogQHBhcmFtIHtSZW5kZXJDb250ZXh0fSByZW5kZXJDb250ZXh0IC0gVGhlIHJlbmRlciBjb250ZXh0LlxyXG5cdCAqIEBwYXJhbSB7Q2xpcHBpbmdDb250ZXh0fSBjbGlwcGluZ0NvbnRleHQgLSBUaGUgY2xpcHBpbmcgY29udGV4dC5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW3Bhc3NJZF0gLSBBbiBvcHRpb25hbCBJRCBmb3IgaWRlbnRpZnlpbmcgdGhlIHBhc3MuXHJcblx0ICogQHJldHVybiB7UmVuZGVyT2JqZWN0fSBUaGUgcmVuZGVyIG9iamVjdC5cclxuXHQgKi9cclxuXHRnZXQoIG9iamVjdCwgbWF0ZXJpYWwsIHNjZW5lLCBjYW1lcmEsIGxpZ2h0c05vZGUsIHJlbmRlckNvbnRleHQsIGNsaXBwaW5nQ29udGV4dCwgcGFzc0lkICkge1xyXG5cclxuXHRcdGNvbnN0IGNoYWluTWFwID0gdGhpcy5nZXRDaGFpbk1hcCggcGFzc0lkICk7XHJcblxyXG5cdFx0Ly8gcmV1c2UgY2hhaW5BcnJheVxyXG5cdFx0X2NoYWluS2V5c1sgMCBdID0gb2JqZWN0O1xyXG5cdFx0X2NoYWluS2V5c1sgMSBdID0gbWF0ZXJpYWw7XHJcblx0XHRfY2hhaW5LZXlzWyAyIF0gPSByZW5kZXJDb250ZXh0O1xyXG5cdFx0X2NoYWluS2V5c1sgMyBdID0gbGlnaHRzTm9kZTtcclxuXHJcblx0XHRsZXQgcmVuZGVyT2JqZWN0ID0gY2hhaW5NYXAuZ2V0KCBfY2hhaW5LZXlzICk7XHJcblxyXG5cdFx0aWYgKCByZW5kZXJPYmplY3QgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHJlbmRlck9iamVjdCA9IHRoaXMuY3JlYXRlUmVuZGVyT2JqZWN0KCB0aGlzLm5vZGVzLCB0aGlzLmdlb21ldHJpZXMsIHRoaXMucmVuZGVyZXIsIG9iamVjdCwgbWF0ZXJpYWwsIHNjZW5lLCBjYW1lcmEsIGxpZ2h0c05vZGUsIHJlbmRlckNvbnRleHQsIGNsaXBwaW5nQ29udGV4dCwgcGFzc0lkICk7XHJcblxyXG5cdFx0XHRjaGFpbk1hcC5zZXQoIF9jaGFpbktleXMsIHJlbmRlck9iamVjdCApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRyZW5kZXJPYmplY3QudXBkYXRlQ2xpcHBpbmcoIGNsaXBwaW5nQ29udGV4dCApO1xyXG5cclxuXHRcdFx0aWYgKCByZW5kZXJPYmplY3QubmVlZHNHZW9tZXRyeVVwZGF0ZSApIHtcclxuXHJcblx0XHRcdFx0cmVuZGVyT2JqZWN0LnNldEdlb21ldHJ5KCBvYmplY3QuZ2VvbWV0cnkgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggcmVuZGVyT2JqZWN0LnZlcnNpb24gIT09IG1hdGVyaWFsLnZlcnNpb24gfHwgcmVuZGVyT2JqZWN0Lm5lZWRzVXBkYXRlICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIHJlbmRlck9iamVjdC5pbml0aWFsQ2FjaGVLZXkgIT09IHJlbmRlck9iamVjdC5nZXRDYWNoZUtleSgpICkge1xyXG5cclxuXHRcdFx0XHRcdHJlbmRlck9iamVjdC5kaXNwb3NlKCk7XHJcblxyXG5cdFx0XHRcdFx0cmVuZGVyT2JqZWN0ID0gdGhpcy5nZXQoIG9iamVjdCwgbWF0ZXJpYWwsIHNjZW5lLCBjYW1lcmEsIGxpZ2h0c05vZGUsIHJlbmRlckNvbnRleHQsIGNsaXBwaW5nQ29udGV4dCwgcGFzc0lkICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0cmVuZGVyT2JqZWN0LnZlcnNpb24gPSBtYXRlcmlhbC52ZXJzaW9uO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdF9jaGFpbktleXMubGVuZ3RoID0gMDtcclxuXHJcblx0XHRyZXR1cm4gcmVuZGVyT2JqZWN0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBjaGFpbiBtYXAgZm9yIHRoZSBnaXZlbiBwYXNzIElELlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtwYXNzSWQ9J2RlZmF1bHQnXSAtIFRoZSBwYXNzIElELlxyXG5cdCAqIEByZXR1cm4ge0NoYWluTWFwfSBUaGUgY2hhaW4gbWFwLlxyXG5cdCAqL1xyXG5cdGdldENoYWluTWFwKCBwYXNzSWQgPSAnZGVmYXVsdCcgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuY2hhaW5NYXBzWyBwYXNzSWQgXSB8fCAoIHRoaXMuY2hhaW5NYXBzWyBwYXNzSWQgXSA9IG5ldyBDaGFpbk1hcCgpICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRnJlZXMgaW50ZXJuYWwgcmVzb3VyY2VzLlxyXG5cdCAqL1xyXG5cdGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0dGhpcy5jaGFpbk1hcHMgPSB7fTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGYWN0b3J5IG1ldGhvZCBmb3IgY3JlYXRpbmcgcmVuZGVyIG9iamVjdHMgd2l0aCB0aGUgZ2l2ZW4gbGlzdCBvZiBwYXJhbWV0ZXJzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2Rlc30gbm9kZXMgLSBSZW5kZXJlciBjb21wb25lbnQgZm9yIG1hbmFnaW5nIG5vZGVzIHJlbGF0ZWQgbG9naWMuXHJcblx0ICogQHBhcmFtIHtHZW9tZXRyaWVzfSBnZW9tZXRyaWVzIC0gUmVuZGVyZXIgY29tcG9uZW50IGZvciBtYW5hZ2luZyBnZW9tZXRyaWVzLlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0M0R9IG9iamVjdCAtIFRoZSAzRCBvYmplY3QuXHJcblx0ICogQHBhcmFtIHtNYXRlcmlhbH0gbWF0ZXJpYWwgLSBUaGUgb2JqZWN0J3MgbWF0ZXJpYWwuXHJcblx0ICogQHBhcmFtIHtTY2VuZX0gc2NlbmUgLSBUaGUgc2NlbmUgdGhlIDNEIG9iamVjdCBiZWxvbmdzIHRvLlxyXG5cdCAqIEBwYXJhbSB7Q2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIHRoZSBvYmplY3Qgc2hvdWxkIGJlIHJlbmRlcmVkIHdpdGguXHJcblx0ICogQHBhcmFtIHtMaWdodHNOb2RlfSBsaWdodHNOb2RlIC0gVGhlIGxpZ2h0cyBub2RlLlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyQ29udGV4dH0gcmVuZGVyQ29udGV4dCAtIFRoZSByZW5kZXIgY29udGV4dC5cclxuXHQgKiBAcGFyYW0ge0NsaXBwaW5nQ29udGV4dH0gY2xpcHBpbmdDb250ZXh0IC0gVGhlIGNsaXBwaW5nIGNvbnRleHQuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtwYXNzSWRdIC0gQW4gb3B0aW9uYWwgSUQgZm9yIGlkZW50aWZ5aW5nIHRoZSBwYXNzLlxyXG5cdCAqIEByZXR1cm4ge1JlbmRlck9iamVjdH0gVGhlIHJlbmRlciBvYmplY3QuXHJcblx0ICovXHJcblx0Y3JlYXRlUmVuZGVyT2JqZWN0KCBub2RlcywgZ2VvbWV0cmllcywgcmVuZGVyZXIsIG9iamVjdCwgbWF0ZXJpYWwsIHNjZW5lLCBjYW1lcmEsIGxpZ2h0c05vZGUsIHJlbmRlckNvbnRleHQsIGNsaXBwaW5nQ29udGV4dCwgcGFzc0lkICkge1xyXG5cclxuXHRcdGNvbnN0IGNoYWluTWFwID0gdGhpcy5nZXRDaGFpbk1hcCggcGFzc0lkICk7XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyT2JqZWN0ID0gbmV3IFJlbmRlck9iamVjdCggbm9kZXMsIGdlb21ldHJpZXMsIHJlbmRlcmVyLCBvYmplY3QsIG1hdGVyaWFsLCBzY2VuZSwgY2FtZXJhLCBsaWdodHNOb2RlLCByZW5kZXJDb250ZXh0LCBjbGlwcGluZ0NvbnRleHQgKTtcclxuXHJcblx0XHRyZW5kZXJPYmplY3Qub25EaXNwb3NlID0gKCkgPT4ge1xyXG5cclxuXHRcdFx0dGhpcy5waXBlbGluZXMuZGVsZXRlKCByZW5kZXJPYmplY3QgKTtcclxuXHRcdFx0dGhpcy5iaW5kaW5ncy5kZWxldGUoIHJlbmRlck9iamVjdCApO1xyXG5cdFx0XHR0aGlzLm5vZGVzLmRlbGV0ZSggcmVuZGVyT2JqZWN0ICk7XHJcblxyXG5cdFx0XHRjaGFpbk1hcC5kZWxldGUoIHJlbmRlck9iamVjdC5nZXRDaGFpbkFycmF5KCkgKTtcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdHJldHVybiByZW5kZXJPYmplY3Q7XHJcblxyXG5cdH1cclxuXHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBSZW5kZXJPYmplY3RzO1xyXG4iLCIvKipcclxuICogRGF0YSBzdHJ1Y3R1cmUgZm9yIHRoZSByZW5kZXJlci4gSXQgaXMgaW50ZW5kZWQgdG8gbWFuYWdlXHJcbiAqIGRhdGEgb2Ygb2JqZWN0cyBpbiBkaWN0aW9uYXJpZXMuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5jbGFzcyBEYXRhTWFwIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBkYXRhIG1hcC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIGBEYXRhTWFwYCBpbnRlcm5hbGx5IHVzZXMgYSB3ZWFrIG1hcFxyXG5cdFx0ICogdG8gbWFuYWdlIGl0cyBkYXRhLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtXZWFrTWFwfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRhdGEgPSBuZXcgV2Vha01hcCgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGRpY3Rpb25hcnkgZm9yIHRoZSBnaXZlbiBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IC0gVGhlIG9iamVjdC5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBkaWN0aW9uYXJ5LlxyXG5cdCAqL1xyXG5cdGdldCggb2JqZWN0ICkge1xyXG5cclxuXHRcdGxldCBtYXAgPSB0aGlzLmRhdGEuZ2V0KCBvYmplY3QgKTtcclxuXHJcblx0XHRpZiAoIG1hcCA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0bWFwID0ge307XHJcblx0XHRcdHRoaXMuZGF0YS5zZXQoIG9iamVjdCwgbWFwICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBtYXA7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVsZXRlcyB0aGUgZGljdGlvbmFyeSBmb3IgdGhlIGdpdmVuIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgLSBUaGUgb2JqZWN0LlxyXG5cdCAqIEByZXR1cm4gez9PYmplY3R9IFRoZSBkZWxldGVkIGRpY3Rpb25hcnkuXHJcblx0ICovXHJcblx0ZGVsZXRlKCBvYmplY3QgKSB7XHJcblxyXG5cdFx0bGV0IG1hcCA9IG51bGw7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmRhdGEuaGFzKCBvYmplY3QgKSApIHtcclxuXHJcblx0XHRcdG1hcCA9IHRoaXMuZGF0YS5nZXQoIG9iamVjdCApO1xyXG5cclxuXHRcdFx0dGhpcy5kYXRhLmRlbGV0ZSggb2JqZWN0ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBtYXA7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIG9iamVjdCBoYXMgYSBkaWN0aW9uYXJ5IGRlZmluZWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IC0gVGhlIG9iamVjdCB0byB0ZXN0LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgYSBkaWN0aW9uYXJ5IGlzIGRlZmluZWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGhhcyggb2JqZWN0ICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmRhdGEuaGFzKCBvYmplY3QgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGcmVlcyBpbnRlcm5hbCByZXNvdXJjZXMuXHJcblx0ICovXHJcblx0ZGlzcG9zZSgpIHtcclxuXHJcblx0XHR0aGlzLmRhdGEgPSBuZXcgV2Vha01hcCgpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBEYXRhTWFwO1xyXG4iLCJleHBvcnQgY29uc3QgQXR0cmlidXRlVHlwZSA9IHtcclxuXHRWRVJURVg6IDEsXHJcblx0SU5ERVg6IDIsXHJcblx0U1RPUkFHRTogMyxcclxuXHRJTkRJUkVDVDogNFxyXG59O1xyXG5cclxuLy8gc2l6ZSBvZiBhIGNodW5rIGluIGJ5dGVzIChTVEQxNDAgbGF5b3V0KVxyXG5cclxuZXhwb3J0IGNvbnN0IEdQVV9DSFVOS19CWVRFUyA9IDE2O1xyXG5cclxuLy8gQFRPRE86IE1vdmUgdG8gc3JjL2NvbnN0YW50cy5qc1xyXG5cclxuZXhwb3J0IGNvbnN0IEJsZW5kQ29sb3JGYWN0b3IgPSAyMTE7XHJcbmV4cG9ydCBjb25zdCBPbmVNaW51c0JsZW5kQ29sb3JGYWN0b3IgPSAyMTI7XHJcbiIsImltcG9ydCBEYXRhTWFwIGZyb20gJy4vRGF0YU1hcC5qcyc7XHJcbmltcG9ydCB7IEF0dHJpYnV0ZVR5cGUgfSBmcm9tICcuL0NvbnN0YW50cy5qcyc7XHJcblxyXG5pbXBvcnQgeyBEeW5hbWljRHJhd1VzYWdlIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIHJlbmRlcmVyIG1vZHVsZSBtYW5hZ2VzIGdlb21ldHJ5IGF0dHJpYnV0ZXMuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBhdWdtZW50cyBEYXRhTWFwXHJcbiAqL1xyXG5jbGFzcyBBdHRyaWJ1dGVzIGV4dGVuZHMgRGF0YU1hcCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYXR0cmlidXRlIG1hbmFnZW1lbnQgY29tcG9uZW50LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCYWNrZW5kfSBiYWNrZW5kIC0gVGhlIHJlbmRlcmVyJ3MgYmFja2VuZC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggYmFja2VuZCApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJlbmRlcmVyJ3MgYmFja2VuZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QmFja2VuZH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5iYWNrZW5kID0gYmFja2VuZDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWxldGVzIHRoZSBkYXRhIGZvciB0aGUgZ2l2ZW4gYXR0cmlidXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCdWZmZXJBdHRyaWJ1dGV9IGF0dHJpYnV0ZSAtIFRoZSBhdHRyaWJ1dGUuXHJcblx0ICogQHJldHVybiB7T2JqZWN0fG51bGx9IFRoZSBkZWxldGVkIGF0dHJpYnV0ZSBkYXRhLlxyXG5cdCAqL1xyXG5cdGRlbGV0ZSggYXR0cmlidXRlICkge1xyXG5cclxuXHRcdGNvbnN0IGF0dHJpYnV0ZURhdGEgPSBzdXBlci5kZWxldGUoIGF0dHJpYnV0ZSApO1xyXG5cclxuXHRcdGlmICggYXR0cmlidXRlRGF0YSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuYmFja2VuZC5kZXN0cm95QXR0cmlidXRlKCBhdHRyaWJ1dGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGF0dHJpYnV0ZURhdGE7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgZ2l2ZW4gYXR0cmlidXRlLiBUaGlzIG1ldGhvZCBjcmVhdGVzIGF0dHJpYnV0ZSBidWZmZXJzXHJcblx0ICogZm9yIG5ldyBhdHRyaWJ1dGVzIGFuZCB1cGRhdGVzIGRhdGEgZm9yIGV4aXN0aW5nIG9uZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0J1ZmZlckF0dHJpYnV0ZX0gYXR0cmlidXRlIC0gVGhlIGF0dHJpYnV0ZSB0byB1cGRhdGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHR5cGUgLSBUaGUgYXR0cmlidXRlIHR5cGUuXHJcblx0ICovXHJcblx0dXBkYXRlKCBhdHRyaWJ1dGUsIHR5cGUgKSB7XHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IHRoaXMuZ2V0KCBhdHRyaWJ1dGUgKTtcclxuXHJcblx0XHRpZiAoIGRhdGEudmVyc2lvbiA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0aWYgKCB0eXBlID09PSBBdHRyaWJ1dGVUeXBlLlZFUlRFWCApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5iYWNrZW5kLmNyZWF0ZUF0dHJpYnV0ZSggYXR0cmlidXRlICk7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCB0eXBlID09PSBBdHRyaWJ1dGVUeXBlLklOREVYICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLmJhY2tlbmQuY3JlYXRlSW5kZXhBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggdHlwZSA9PT0gQXR0cmlidXRlVHlwZS5TVE9SQUdFICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLmJhY2tlbmQuY3JlYXRlU3RvcmFnZUF0dHJpYnV0ZSggYXR0cmlidXRlICk7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCB0eXBlID09PSBBdHRyaWJ1dGVUeXBlLklORElSRUNUICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLmJhY2tlbmQuY3JlYXRlSW5kaXJlY3RTdG9yYWdlQXR0cmlidXRlKCBhdHRyaWJ1dGUgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGRhdGEudmVyc2lvbiA9IHRoaXMuX2dldEJ1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlICkudmVyc2lvbjtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc3QgYnVmZmVyQXR0cmlidXRlID0gdGhpcy5fZ2V0QnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUgKTtcclxuXHJcblx0XHRcdGlmICggZGF0YS52ZXJzaW9uIDwgYnVmZmVyQXR0cmlidXRlLnZlcnNpb24gfHwgYnVmZmVyQXR0cmlidXRlLnVzYWdlID09PSBEeW5hbWljRHJhd1VzYWdlICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLmJhY2tlbmQudXBkYXRlQXR0cmlidXRlKCBhdHRyaWJ1dGUgKTtcclxuXHJcblx0XHRcdFx0ZGF0YS52ZXJzaW9uID0gYnVmZmVyQXR0cmlidXRlLnZlcnNpb247XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFV0aWxpdHkgbWV0aG9kIGZvciBoYW5kbGluZyBpbnRlcmxlYXZlZCBidWZmZXIgYXR0cmlidXRlcyBjb3JyZWN0bHkuXHJcblx0ICogVG8gcHJvY2VzcyB0aGVtLCB0aGVpciBgSW50ZXJsZWF2ZWRCdWZmZXJgIGlzIHJldHVybmVkLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCdWZmZXJBdHRyaWJ1dGV9IGF0dHJpYnV0ZSAtIFRoZSBhdHRyaWJ1dGUuXHJcblx0ICogQHJldHVybiB7QnVmZmVyQXR0cmlidXRlfEludGVybGVhdmVkQnVmZmVyfVxyXG5cdCAqL1xyXG5cdF9nZXRCdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApIHtcclxuXHJcblx0XHRpZiAoIGF0dHJpYnV0ZS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlICkgYXR0cmlidXRlID0gYXR0cmlidXRlLmRhdGE7XHJcblxyXG5cdFx0cmV0dXJuIGF0dHJpYnV0ZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQXR0cmlidXRlcztcclxuIiwiaW1wb3J0IERhdGFNYXAgZnJvbSAnLi9EYXRhTWFwLmpzJztcclxuaW1wb3J0IHsgQXR0cmlidXRlVHlwZSB9IGZyb20gJy4vQ29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgYXJyYXlOZWVkc1VpbnQzMiB9IGZyb20gJy4uLy4uL3V0aWxzLmpzJztcclxuXHJcbmltcG9ydCB7IFVpbnQxNkJ1ZmZlckF0dHJpYnV0ZSwgVWludDMyQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIHdpcmVmcmFtZSB2ZXJzaW9uIGZvciB0aGUgZ2l2ZW4gZ2VvbWV0cnkuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge0J1ZmZlckdlb21ldHJ5fSBnZW9tZXRyeSAtIFRoZSBnZW9tZXRyeS5cclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgdmVyc2lvbi5cclxuICovXHJcbmZ1bmN0aW9uIGdldFdpcmVmcmFtZVZlcnNpb24oIGdlb21ldHJ5ICkge1xyXG5cclxuXHRyZXR1cm4gKCBnZW9tZXRyeS5pbmRleCAhPT0gbnVsbCApID8gZ2VvbWV0cnkuaW5kZXgudmVyc2lvbiA6IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24udmVyc2lvbjtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgd2lyZWZyYW1lIGluZGV4IGF0dHJpYnV0ZSBmb3IgdGhlIGdpdmVuIGdlb21ldHJ5LlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtCdWZmZXJHZW9tZXRyeX0gZ2VvbWV0cnkgLSBUaGUgZ2VvbWV0cnkuXHJcbiAqIEByZXR1cm4ge0J1ZmZlckF0dHJpYnV0ZX0gVGhlIHdpcmVmcmFtZSBpbmRleCBhdHRyaWJ1dGUuXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRXaXJlZnJhbWVJbmRleCggZ2VvbWV0cnkgKSB7XHJcblxyXG5cdGNvbnN0IGluZGljZXMgPSBbXTtcclxuXHJcblx0Y29uc3QgZ2VvbWV0cnlJbmRleCA9IGdlb21ldHJ5LmluZGV4O1xyXG5cdGNvbnN0IGdlb21ldHJ5UG9zaXRpb24gPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xyXG5cclxuXHRpZiAoIGdlb21ldHJ5SW5kZXggIT09IG51bGwgKSB7XHJcblxyXG5cdFx0Y29uc3QgYXJyYXkgPSBnZW9tZXRyeUluZGV4LmFycmF5O1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGw7IGkgKz0gMyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGEgPSBhcnJheVsgaSArIDAgXTtcclxuXHRcdFx0Y29uc3QgYiA9IGFycmF5WyBpICsgMSBdO1xyXG5cdFx0XHRjb25zdCBjID0gYXJyYXlbIGkgKyAyIF07XHJcblxyXG5cdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGIsIGMsIGMsIGEgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0Y29uc3QgYXJyYXkgPSBnZW9tZXRyeVBvc2l0aW9uLmFycmF5O1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9ICggYXJyYXkubGVuZ3RoIC8gMyApIC0gMTsgaSA8IGw7IGkgKz0gMyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGEgPSBpICsgMDtcclxuXHRcdFx0Y29uc3QgYiA9IGkgKyAxO1xyXG5cdFx0XHRjb25zdCBjID0gaSArIDI7XHJcblxyXG5cdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGIsIGMsIGMsIGEgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0Y29uc3QgYXR0cmlidXRlID0gbmV3ICggYXJyYXlOZWVkc1VpbnQzMiggaW5kaWNlcyApID8gVWludDMyQnVmZmVyQXR0cmlidXRlIDogVWludDE2QnVmZmVyQXR0cmlidXRlICkoIGluZGljZXMsIDEgKTtcclxuXHRhdHRyaWJ1dGUudmVyc2lvbiA9IGdldFdpcmVmcmFtZVZlcnNpb24oIGdlb21ldHJ5ICk7XHJcblxyXG5cdHJldHVybiBhdHRyaWJ1dGU7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogVGhpcyByZW5kZXJlciBtb2R1bGUgbWFuYWdlcyBnZW9tZXRyaWVzLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAYXVnbWVudHMgRGF0YU1hcFxyXG4gKi9cclxuY2xhc3MgR2VvbWV0cmllcyBleHRlbmRzIERhdGFNYXAge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGdlb21ldHJ5IG1hbmFnZW1lbnQgY29tcG9uZW50LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBdHRyaWJ1dGVzfSBhdHRyaWJ1dGVzIC0gUmVuZGVyZXIgY29tcG9uZW50IGZvciBtYW5hZ2luZyBhdHRyaWJ1dGVzLlxyXG5cdCAqIEBwYXJhbSB7SW5mb30gaW5mbyAtIFJlbmRlcmVyIGNvbXBvbmVudCBmb3IgbWFuYWdpbmcgbWV0cmljcyBhbmQgbW9uaXRvcmluZyBkYXRhLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBhdHRyaWJ1dGVzLCBpbmZvICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZW5kZXJlciBjb21wb25lbnQgZm9yIG1hbmFnaW5nIGF0dHJpYnV0ZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0F0dHJpYnV0ZXN9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZW5kZXJlciBjb21wb25lbnQgZm9yIG1hbmFnaW5nIG1ldHJpY3MgYW5kIG1vbml0b3JpbmcgZGF0YS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7SW5mb31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pbmZvID0gaW5mbztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdlYWsgTWFwIGZvciBtYW5hZ2luZyBhdHRyaWJ1dGVzIGZvciB3aXJlZnJhbWUgcmVuZGVyaW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtXZWFrTWFwPEJ1ZmZlckdlb21ldHJ5LEJ1ZmZlckF0dHJpYnV0ZT59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMud2lyZWZyYW1lcyA9IG5ldyBXZWFrTWFwKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIFdlYWsgTWFwIGlzIHVzZWQgdG8gbWFrZSBzdXJlIGJ1ZmZlciBhdHRyaWJ1dGVzIGFyZVxyXG5cdFx0ICogdXBkYXRlZCBvbmx5IG9uY2UgcGVyIHJlbmRlciBjYWxsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtXZWFrTWFwPEJ1ZmZlckF0dHJpYnV0ZSxudW1iZXI+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmF0dHJpYnV0ZUNhbGwgPSBuZXcgV2Vha01hcCgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBnaXZlbiByZW5kZXIgb2JqZWN0IGhhcyBhbiBpbml0aWFsaXplZCBnZW9tZXRyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyT2JqZWN0fSByZW5kZXJPYmplY3QgLSBUaGUgcmVuZGVyIG9iamVjdC5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIGlmIHRoZSBnaXZlbiByZW5kZXIgb2JqZWN0IGhhcyBhbiBpbml0aWFsaXplZCBnZW9tZXRyeSBvciBub3QuXHJcblx0ICovXHJcblx0aGFzKCByZW5kZXJPYmplY3QgKSB7XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSByZW5kZXJPYmplY3QuZ2VvbWV0cnk7XHJcblxyXG5cdFx0cmV0dXJuIHN1cGVyLmhhcyggZ2VvbWV0cnkgKSAmJiB0aGlzLmdldCggZ2VvbWV0cnkgKS5pbml0aWFsaXplZCA9PT0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQcmVwYXJlcyB0aGUgZ2VvbWV0cnkgb2YgdGhlIGdpdmVuIHJlbmRlciBvYmplY3QgZm9yIHJlbmRlcmluZy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyT2JqZWN0fSByZW5kZXJPYmplY3QgLSBUaGUgcmVuZGVyIG9iamVjdC5cclxuXHQgKi9cclxuXHR1cGRhdGVGb3JSZW5kZXIoIHJlbmRlck9iamVjdCApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuaGFzKCByZW5kZXJPYmplY3QgKSA9PT0gZmFsc2UgKSB0aGlzLmluaXRHZW9tZXRyeSggcmVuZGVyT2JqZWN0ICk7XHJcblxyXG5cdFx0dGhpcy51cGRhdGVBdHRyaWJ1dGVzKCByZW5kZXJPYmplY3QgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJbml0aWFsaXplcyB0aGUgZ2VvbWV0cnkgb2YgdGhlIGdpdmVuIHJlbmRlciBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JlbmRlck9iamVjdH0gcmVuZGVyT2JqZWN0IC0gVGhlIHJlbmRlciBvYmplY3QuXHJcblx0ICovXHJcblx0aW5pdEdlb21ldHJ5KCByZW5kZXJPYmplY3QgKSB7XHJcblxyXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSByZW5kZXJPYmplY3QuZ2VvbWV0cnk7XHJcblx0XHRjb25zdCBnZW9tZXRyeURhdGEgPSB0aGlzLmdldCggZ2VvbWV0cnkgKTtcclxuXHJcblx0XHRnZW9tZXRyeURhdGEuaW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMuaW5mby5tZW1vcnkuZ2VvbWV0cmllcyArKztcclxuXHJcblx0XHRjb25zdCBvbkRpc3Bvc2UgPSAoKSA9PiB7XHJcblxyXG5cdFx0XHR0aGlzLmluZm8ubWVtb3J5Lmdlb21ldHJpZXMgLS07XHJcblxyXG5cdFx0XHRjb25zdCBpbmRleCA9IGdlb21ldHJ5LmluZGV4O1xyXG5cdFx0XHRjb25zdCBnZW9tZXRyeUF0dHJpYnV0ZXMgPSByZW5kZXJPYmplY3QuZ2V0QXR0cmlidXRlcygpO1xyXG5cclxuXHRcdFx0aWYgKCBpbmRleCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5hdHRyaWJ1dGVzLmRlbGV0ZSggaW5kZXggKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGZvciAoIGNvbnN0IGdlb21ldHJ5QXR0cmlidXRlIG9mIGdlb21ldHJ5QXR0cmlidXRlcyApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5hdHRyaWJ1dGVzLmRlbGV0ZSggZ2VvbWV0cnlBdHRyaWJ1dGUgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IHdpcmVmcmFtZUF0dHJpYnV0ZSA9IHRoaXMud2lyZWZyYW1lcy5nZXQoIGdlb21ldHJ5ICk7XHJcblxyXG5cdFx0XHRpZiAoIHdpcmVmcmFtZUF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLmF0dHJpYnV0ZXMuZGVsZXRlKCB3aXJlZnJhbWVBdHRyaWJ1dGUgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGdlb21ldHJ5LnJlbW92ZUV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25EaXNwb3NlICk7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHRnZW9tZXRyeS5hZGRFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uRGlzcG9zZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIGdlb21ldHJ5IGF0dHJpYnV0ZXMgb2YgdGhlIGdpdmVuIHJlbmRlciBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JlbmRlck9iamVjdH0gcmVuZGVyT2JqZWN0IC0gVGhlIHJlbmRlciBvYmplY3QuXHJcblx0ICovXHJcblx0dXBkYXRlQXR0cmlidXRlcyggcmVuZGVyT2JqZWN0ICkge1xyXG5cclxuXHRcdC8vIGF0dHJpYnV0ZXNcclxuXHJcblx0XHRjb25zdCBhdHRyaWJ1dGVzID0gcmVuZGVyT2JqZWN0LmdldEF0dHJpYnV0ZXMoKTtcclxuXHJcblx0XHRmb3IgKCBjb25zdCBhdHRyaWJ1dGUgb2YgYXR0cmlidXRlcyApIHtcclxuXHJcblx0XHRcdGlmICggYXR0cmlidXRlLmlzU3RvcmFnZUJ1ZmZlckF0dHJpYnV0ZSB8fCBhdHRyaWJ1dGUuaXNTdG9yYWdlSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLnVwZGF0ZUF0dHJpYnV0ZSggYXR0cmlidXRlLCBBdHRyaWJ1dGVUeXBlLlNUT1JBR0UgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHRoaXMudXBkYXRlQXR0cmlidXRlKCBhdHRyaWJ1dGUsIEF0dHJpYnV0ZVR5cGUuVkVSVEVYICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGluZGV4ZXNcclxuXHJcblx0XHRjb25zdCBpbmRleCA9IHRoaXMuZ2V0SW5kZXgoIHJlbmRlck9iamVjdCApO1xyXG5cclxuXHRcdGlmICggaW5kZXggIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnVwZGF0ZUF0dHJpYnV0ZSggaW5kZXgsIEF0dHJpYnV0ZVR5cGUuSU5ERVggKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gaW5kaXJlY3RcclxuXHJcblx0XHRjb25zdCBpbmRpcmVjdCA9IHJlbmRlck9iamVjdC5nZW9tZXRyeS5pbmRpcmVjdDtcclxuXHJcblx0XHRpZiAoIGluZGlyZWN0ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy51cGRhdGVBdHRyaWJ1dGUoIGluZGlyZWN0LCBBdHRyaWJ1dGVUeXBlLklORElSRUNUICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIGdpdmVuIGF0dHJpYnV0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyQXR0cmlidXRlfSBhdHRyaWJ1dGUgLSBUaGUgYXR0cmlidXRlIHRvIHVwZGF0ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdHlwZSAtIFRoZSBhdHRyaWJ1dGUgdHlwZS5cclxuXHQgKi9cclxuXHR1cGRhdGVBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgdHlwZSApIHtcclxuXHJcblx0XHRjb25zdCBjYWxsSWQgPSB0aGlzLmluZm8ucmVuZGVyLmNhbGxzO1xyXG5cclxuXHRcdGlmICggISBhdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApIHtcclxuXHJcblx0XHRcdGlmICggdGhpcy5hdHRyaWJ1dGVDYWxsLmdldCggYXR0cmlidXRlICkgIT09IGNhbGxJZCApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5hdHRyaWJ1dGVzLnVwZGF0ZSggYXR0cmlidXRlLCB0eXBlICk7XHJcblxyXG5cdFx0XHRcdHRoaXMuYXR0cmlidXRlQ2FsbC5zZXQoIGF0dHJpYnV0ZSwgY2FsbElkICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGlmICggdGhpcy5hdHRyaWJ1dGVDYWxsLmdldCggYXR0cmlidXRlICkgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5hdHRyaWJ1dGVzLnVwZGF0ZSggYXR0cmlidXRlLCB0eXBlICk7XHJcblxyXG5cdFx0XHRcdHRoaXMuYXR0cmlidXRlQ2FsbC5zZXQoIGF0dHJpYnV0ZSwgY2FsbElkICk7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCB0aGlzLmF0dHJpYnV0ZUNhbGwuZ2V0KCBhdHRyaWJ1dGUuZGF0YSApICE9PSBjYWxsSWQgKSB7XHJcblxyXG5cdFx0XHRcdHRoaXMuYXR0cmlidXRlcy51cGRhdGUoIGF0dHJpYnV0ZSwgdHlwZSApO1xyXG5cclxuXHRcdFx0XHR0aGlzLmF0dHJpYnV0ZUNhbGwuc2V0KCBhdHRyaWJ1dGUuZGF0YSwgY2FsbElkICk7XHJcblxyXG5cdFx0XHRcdHRoaXMuYXR0cmlidXRlQ2FsbC5zZXQoIGF0dHJpYnV0ZSwgY2FsbElkICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGluZGlyZWN0IGJ1ZmZlciBhdHRyaWJ1dGUgb2YgdGhlIGdpdmVuIHJlbmRlciBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JlbmRlck9iamVjdH0gcmVuZGVyT2JqZWN0IC0gVGhlIHJlbmRlciBvYmplY3QuXHJcblx0ICogQHJldHVybiB7P0J1ZmZlckF0dHJpYnV0ZX0gVGhlIGluZGlyZWN0IGF0dHJpYnV0ZS4gYG51bGxgIGlmIG5vIGluZGlyZWN0IGRyYXdpbmcgaXMgdXNlZC5cclxuXHQgKi9cclxuXHRnZXRJbmRpcmVjdCggcmVuZGVyT2JqZWN0ICkge1xyXG5cclxuXHRcdHJldHVybiByZW5kZXJPYmplY3QuZ2VvbWV0cnkuaW5kaXJlY3Q7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGdpdmVuIHJlbmRlciBvYmplY3QncyBnZW9tZXRyeS4gVGhpcyBpcyBpbXBsZW1lbnRlZFxyXG5cdCAqIGluIGEgbWV0aG9kIHRvIHJldHVybiBhIHdpcmVmcmFtZSBpbmRleCBpZiBuZWNlc3NhcnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JlbmRlck9iamVjdH0gcmVuZGVyT2JqZWN0IC0gVGhlIHJlbmRlciBvYmplY3QuXHJcblx0ICogQHJldHVybiB7P0J1ZmZlckF0dHJpYnV0ZX0gVGhlIGluZGV4LiBSZXR1cm5zIGBudWxsYCBmb3Igbm9uLWluZGV4ZWQgZ2VvbWV0cmllcy5cclxuXHQgKi9cclxuXHRnZXRJbmRleCggcmVuZGVyT2JqZWN0ICkge1xyXG5cclxuXHRcdGNvbnN0IHsgZ2VvbWV0cnksIG1hdGVyaWFsIH0gPSByZW5kZXJPYmplY3Q7XHJcblxyXG5cdFx0bGV0IGluZGV4ID0gZ2VvbWV0cnkuaW5kZXg7XHJcblxyXG5cdFx0aWYgKCBtYXRlcmlhbC53aXJlZnJhbWUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB3aXJlZnJhbWVzID0gdGhpcy53aXJlZnJhbWVzO1xyXG5cclxuXHRcdFx0bGV0IHdpcmVmcmFtZUF0dHJpYnV0ZSA9IHdpcmVmcmFtZXMuZ2V0KCBnZW9tZXRyeSApO1xyXG5cclxuXHRcdFx0aWYgKCB3aXJlZnJhbWVBdHRyaWJ1dGUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0d2lyZWZyYW1lQXR0cmlidXRlID0gZ2V0V2lyZWZyYW1lSW5kZXgoIGdlb21ldHJ5ICk7XHJcblxyXG5cdFx0XHRcdHdpcmVmcmFtZXMuc2V0KCBnZW9tZXRyeSwgd2lyZWZyYW1lQXR0cmlidXRlICk7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCB3aXJlZnJhbWVBdHRyaWJ1dGUudmVyc2lvbiAhPT0gZ2V0V2lyZWZyYW1lVmVyc2lvbiggZ2VvbWV0cnkgKSApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5hdHRyaWJ1dGVzLmRlbGV0ZSggd2lyZWZyYW1lQXR0cmlidXRlICk7XHJcblxyXG5cdFx0XHRcdHdpcmVmcmFtZUF0dHJpYnV0ZSA9IGdldFdpcmVmcmFtZUluZGV4KCBnZW9tZXRyeSApO1xyXG5cclxuXHRcdFx0XHR3aXJlZnJhbWVzLnNldCggZ2VvbWV0cnksIHdpcmVmcmFtZUF0dHJpYnV0ZSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aW5kZXggPSB3aXJlZnJhbWVBdHRyaWJ1dGU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBpbmRleDtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgR2VvbWV0cmllcztcclxuIiwiLyoqXHJcbiAqIFRoaXMgcmVuZGVyZXIgbW9kdWxlIHByb3ZpZGVzIGEgc2VyaWVzIG9mIHN0YXRpc3RpY2FsIGluZm9ybWF0aW9uXHJcbiAqIGFib3V0IHRoZSBHUFUgbWVtb3J5IGFuZCB0aGUgcmVuZGVyaW5nIHByb2Nlc3MuIFVzZWZ1bCBmb3IgZGVidWdnaW5nXHJcbiAqIGFuZCBtb25pdG9yaW5nLlxyXG4gKi9cclxuY2xhc3MgSW5mbyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgaW5mbyBjb21wb25lbnQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIGZyYW1lIHJlbGF0ZWQgbWV0cmljcyBzaG91bGQgYXV0b21hdGljYWxseVxyXG5cdFx0ICogYmUgcmVzZXR0ZWQgb3Igbm90LiBUaGlzIHByb3BlcnR5IHNob3VsZCBiZSBzZXQgdG8gYGZhbHNlYFxyXG5cdFx0ICogYnkgYXBwcyB3aGljaCBtYW5hZ2UgdGhlaXIgb3duIGFuaW1hdGlvbiBsb29wLiBUaGV5IG11c3RcclxuXHRcdCAqIHRoZW4gY2FsbCBgcmVuZGVyZXIuaW5mby5yZXNldCgpYCBvbmNlIHBlciBmcmFtZSBtYW51YWxseS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hdXRvUmVzZXQgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGN1cnJlbnQgZnJhbWUgSUQuIFRoaXMgSUQgaXMgbWFuYWdlZFxyXG5cdFx0ICogYnkgYE5vZGVGcmFtZWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZyYW1lID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBudW1iZXIgb2YgcmVuZGVyIGNhbGxzIHNpbmNlIHRoZVxyXG5cdFx0ICogYXBwIGhhcyBiZWVuIHN0YXJ0ZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNhbGxzID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlbmRlciByZWxhdGVkIG1ldHJpY3MuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQHByb3BlcnR5IHtudW1iZXJ9IGNhbGxzIC0gVGhlIG51bWJlciBvZiByZW5kZXIgY2FsbHMgc2luY2UgdGhlIGFwcCBoYXMgYmVlbiBzdGFydGVkLlxyXG5cdFx0ICogQHByb3BlcnR5IHtudW1iZXJ9IGZyYW1lQ2FsbHMgLSBUaGUgbnVtYmVyIG9mIHJlbmRlciBjYWxscyBvZiB0aGUgY3VycmVudCBmcmFtZS5cclxuXHRcdCAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBkcmF3Q2FsbHMgLSBUaGUgbnVtYmVyIG9mIGRyYXcgY2FsbHMgb2YgdGhlIGN1cnJlbnQgZnJhbWUuXHJcblx0XHQgKiBAcHJvcGVydHkge251bWJlcn0gdHJpYW5nbGVzIC0gVGhlIG51bWJlciBvZiByZW5kZXJlZCB0cmlhbmdsZSBwcmltaXRpdmVzIG9mIHRoZSBjdXJyZW50IGZyYW1lLlxyXG5cdFx0ICogQHByb3BlcnR5IHtudW1iZXJ9IHBvaW50cyAtIFRoZSBudW1iZXIgb2YgcmVuZGVyZWQgcG9pbnQgcHJpbWl0aXZlcyBvZiB0aGUgY3VycmVudCBmcmFtZS5cclxuXHRcdCAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsaW5lcyAtIFRoZSBudW1iZXIgb2YgcmVuZGVyZWQgbGluZSBwcmltaXRpdmVzIG9mIHRoZSBjdXJyZW50IGZyYW1lLlxyXG5cdFx0ICogQHByb3BlcnR5IHtudW1iZXJ9IHRpbWVzdGFtcCAtIFRoZSB0aW1lc3RhbXAgb2YgdGhlIGZyYW1lIHdoZW4gdXNpbmcgYHJlbmRlcmVyLnJlbmRlckFzeW5jKClgLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJlbmRlciA9IHtcclxuXHRcdFx0Y2FsbHM6IDAsXHJcblx0XHRcdGZyYW1lQ2FsbHM6IDAsXHJcblx0XHRcdGRyYXdDYWxsczogMCxcclxuXHRcdFx0dHJpYW5nbGVzOiAwLFxyXG5cdFx0XHRwb2ludHM6IDAsXHJcblx0XHRcdGxpbmVzOiAwLFxyXG5cdFx0XHR0aW1lc3RhbXA6IDAsXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQ29tcHV0ZSByZWxhdGVkIG1ldHJpY3MuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQHByb3BlcnR5IHtudW1iZXJ9IGNhbGxzIC0gVGhlIG51bWJlciBvZiBjb21wdXRlIGNhbGxzIHNpbmNlIHRoZSBhcHAgaGFzIGJlZW4gc3RhcnRlZC5cclxuXHRcdCAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBmcmFtZUNhbGxzIC0gVGhlIG51bWJlciBvZiBjb21wdXRlIGNhbGxzIG9mIHRoZSBjdXJyZW50IGZyYW1lLlxyXG5cdFx0ICogQHByb3BlcnR5IHtudW1iZXJ9IHRpbWVzdGFtcCAtIFRoZSB0aW1lc3RhbXAgb2YgdGhlIGZyYW1lIHdoZW4gdXNpbmcgYHJlbmRlcmVyLmNvbXB1dGVBc3luYygpYC5cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb21wdXRlID0ge1xyXG5cdFx0XHRjYWxsczogMCxcclxuXHRcdFx0ZnJhbWVDYWxsczogMCxcclxuXHRcdFx0dGltZXN0YW1wOiAwXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogTWVtb3J5IHJlbGF0ZWQgbWV0cmljcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAcHJvcGVydHkge251bWJlcn0gZ2VvbWV0cmllcyAtIFRoZSBudW1iZXIgb2YgYWN0aXZlIGdlb21ldHJpZXMuXHJcblx0XHQgKiBAcHJvcGVydHkge251bWJlcn0gZnJhbWVDYWxscyAtIFRoZSBudW1iZXIgb2YgYWN0aXZlIHRleHR1cmVzLlxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1lbW9yeSA9IHtcclxuXHRcdFx0Z2VvbWV0cmllczogMCxcclxuXHRcdFx0dGV4dHVyZXM6IDBcclxuXHRcdH07XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGV4ZWN1dGVkIHBlciBkcmF3IGNhbGwgYW5kIHVwZGF0ZXMgdGhlIGNvcnJlc3BvbmRpbmcgbWV0cmljcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0M0R9IG9iamVjdCAtIFRoZSAzRCBvYmplY3QgdGhhdCBpcyBnb2luZyB0byBiZSByZW5kZXJlZC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gY291bnQgLSBUaGUgdmVydGV4IG9yIGluZGV4IGNvdW50LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbnN0YW5jZUNvdW50IC0gVGhlIGluc3RhbmNlIGNvdW50LlxyXG5cdCAqL1xyXG5cdHVwZGF0ZSggb2JqZWN0LCBjb3VudCwgaW5zdGFuY2VDb3VudCApIHtcclxuXHJcblx0XHR0aGlzLnJlbmRlci5kcmF3Q2FsbHMgKys7XHJcblxyXG5cdFx0aWYgKCBvYmplY3QuaXNNZXNoIHx8IG9iamVjdC5pc1Nwcml0ZSApIHtcclxuXHJcblx0XHRcdHRoaXMucmVuZGVyLnRyaWFuZ2xlcyArPSBpbnN0YW5jZUNvdW50ICogKCBjb3VudCAvIDMgKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBvYmplY3QuaXNQb2ludHMgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnJlbmRlci5wb2ludHMgKz0gaW5zdGFuY2VDb3VudCAqIGNvdW50O1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc0xpbmVTZWdtZW50cyApIHtcclxuXHJcblx0XHRcdHRoaXMucmVuZGVyLmxpbmVzICs9IGluc3RhbmNlQ291bnQgKiAoIGNvdW50IC8gMiApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc0xpbmUgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnJlbmRlci5saW5lcyArPSBpbnN0YW5jZUNvdW50ICogKCBjb3VudCAtIDEgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdQVUluZm86IFVua25vd24gb2JqZWN0IHR5cGUuJyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXNldHMgZnJhbWUgcmVsYXRlZCBtZXRyaWNzLlxyXG5cdCAqL1xyXG5cdHJlc2V0KCkge1xyXG5cclxuXHRcdHRoaXMucmVuZGVyLmRyYXdDYWxscyA9IDA7XHJcblx0XHR0aGlzLnJlbmRlci5mcmFtZUNhbGxzID0gMDtcclxuXHRcdHRoaXMuY29tcHV0ZS5mcmFtZUNhbGxzID0gMDtcclxuXHJcblx0XHR0aGlzLnJlbmRlci50cmlhbmdsZXMgPSAwO1xyXG5cdFx0dGhpcy5yZW5kZXIucG9pbnRzID0gMDtcclxuXHRcdHRoaXMucmVuZGVyLmxpbmVzID0gMDtcclxuXHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUGVyZm9ybXMgYSBjb21wbGV0ZSByZXNldCBvZiB0aGUgb2JqZWN0LlxyXG5cdCAqL1xyXG5cdGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0dGhpcy5yZXNldCgpO1xyXG5cclxuXHRcdHRoaXMuY2FsbHMgPSAwO1xyXG5cclxuXHRcdHRoaXMucmVuZGVyLmNhbGxzID0gMDtcclxuXHRcdHRoaXMuY29tcHV0ZS5jYWxscyA9IDA7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXIudGltZXN0YW1wID0gMDtcclxuXHRcdHRoaXMuY29tcHV0ZS50aW1lc3RhbXAgPSAwO1xyXG5cdFx0dGhpcy5tZW1vcnkuZ2VvbWV0cmllcyA9IDA7XHJcblx0XHR0aGlzLm1lbW9yeS50ZXh0dXJlcyA9IDA7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgZGVmYXVsdCBJbmZvO1xyXG4iLCIvKipcclxuICogQWJzdHJhY3QgY2xhc3MgZm9yIHJlcHJlc2VudGluZyBwaXBlbGluZXMuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBhYnN0cmFjdFxyXG4gKi9cclxuY2xhc3MgUGlwZWxpbmUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHBpcGVsaW5lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGNhY2hlS2V5IC0gVGhlIHBpcGVsaW5lJ3MgY2FjaGUga2V5LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBjYWNoZUtleSApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBwaXBlbGluZSdzIGNhY2hlIGtleS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNhY2hlS2V5ID0gY2FjaGVLZXk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3cgb2Z0ZW4gdGhlIHBpcGVsaW5lIGlzIGN1cnJlbnRseSBpbiB1c2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51c2VkVGltZXMgPSAwO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBQaXBlbGluZTtcclxuIiwiaW1wb3J0IFBpcGVsaW5lIGZyb20gJy4vUGlwZWxpbmUuanMnO1xyXG5cclxuLyoqXHJcbiAqIENsYXNzIGZvciByZXByZXNlbnRpbmcgcmVuZGVyIHBpcGVsaW5lcy5cclxuICpcclxuICogQHByaXZhdGVcclxuICogQGF1Z21lbnRzIFBpcGVsaW5lXHJcbiAqL1xyXG5jbGFzcyBSZW5kZXJQaXBlbGluZSBleHRlbmRzIFBpcGVsaW5lIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyByZW5kZXIgcGlwZWxpbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gY2FjaGVLZXkgLSBUaGUgcGlwZWxpbmUncyBjYWNoZSBrZXkuXHJcblx0ICogQHBhcmFtIHtQcm9ncmFtbWFibGVTdGFnZX0gdmVydGV4UHJvZ3JhbSAtIFRoZSBwaXBlbGluZSdzIHZlcnRleCBzaGFkZXIuXHJcblx0ICogQHBhcmFtIHtQcm9ncmFtbWFibGVTdGFnZX0gZnJhZ21lbnRQcm9ncmFtIC0gVGhlIHBpcGVsaW5lJ3MgZnJhZ21lbnQgc2hhZGVyLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBjYWNoZUtleSwgdmVydGV4UHJvZ3JhbSwgZnJhZ21lbnRQcm9ncmFtICkge1xyXG5cclxuXHRcdHN1cGVyKCBjYWNoZUtleSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHBpcGVsaW5lJ3MgdmVydGV4IHNoYWRlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7UHJvZ3JhbW1hYmxlU3RhZ2V9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudmVydGV4UHJvZ3JhbSA9IHZlcnRleFByb2dyYW07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcGlwZWxpbmUncyBmcmFnbWVudCBzaGFkZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1Byb2dyYW1tYWJsZVN0YWdlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZyYWdtZW50UHJvZ3JhbSA9IGZyYWdtZW50UHJvZ3JhbTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUmVuZGVyUGlwZWxpbmU7XHJcbiIsImltcG9ydCBQaXBlbGluZSBmcm9tICcuL1BpcGVsaW5lLmpzJztcclxuXHJcbi8qKlxyXG4gKiBDbGFzcyBmb3IgcmVwcmVzZW50aW5nIGNvbXB1dGUgcGlwZWxpbmVzLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAYXVnbWVudHMgUGlwZWxpbmVcclxuICovXHJcbmNsYXNzIENvbXB1dGVQaXBlbGluZSBleHRlbmRzIFBpcGVsaW5lIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyByZW5kZXIgcGlwZWxpbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gY2FjaGVLZXkgLSBUaGUgcGlwZWxpbmUncyBjYWNoZSBrZXkuXHJcblx0ICogQHBhcmFtIHtQcm9ncmFtbWFibGVTdGFnZX0gY29tcHV0ZVByb2dyYW0gLSBUaGUgcGlwZWxpbmUncyBjb21wdXRlIHNoYWRlci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggY2FjaGVLZXksIGNvbXB1dGVQcm9ncmFtICkge1xyXG5cclxuXHRcdHN1cGVyKCBjYWNoZUtleSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHBpcGVsaW5lJ3MgY29tcHV0ZSBzaGFkZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1Byb2dyYW1tYWJsZVN0YWdlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvbXB1dGVQcm9ncmFtID0gY29tcHV0ZVByb2dyYW07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzQ29tcHV0ZVBpcGVsaW5lID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQ29tcHV0ZVBpcGVsaW5lO1xyXG4iLCJsZXQgX2lkID0gMDtcclxuXHJcbi8qKlxyXG4gKiBDbGFzcyBmb3IgcmVwcmVzZW50aW5nIHByb2dyYW1tYWJsZSBzdGFnZXMgd2hpY2ggYXJlIHZlcnRleCxcclxuICogZnJhZ21lbnQgb3IgY29tcHV0ZSBzaGFkZXJzLiBVbmxpa2UgZml4ZWQtZnVuY3Rpb24gc3RhdGVzIChsaWtlIGJsZW5kaW5nKSxcclxuICogdGhleSByZXByZXNlbnQgdGhlIHByb2dyYW1tYWJsZSBwYXJ0IG9mIGEgcGlwZWxpbmUuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5jbGFzcyBQcm9ncmFtbWFibGVTdGFnZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcHJvZ3JhbW1hYmxlIHN0YWdlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGNvZGUgLSBUaGUgc2hhZGVyIGNvZGUuXHJcblx0ICogQHBhcmFtIHsoJ3ZlcnRleCd8J2ZyYWdtZW50J3wnY29tcHV0ZScpfSBzdGFnZSAtIFRoZSB0eXBlIG9mIHN0YWdlLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHNoYWRlci5cclxuXHQgKiBAcGFyYW0gez9BcnJheTxPYmplY3Q+fSBbdHJhbnNmb3Jtcz1udWxsXSAtIFRoZSB0cmFuc2Zvcm1zIChvbmx5IHJlbGV2YW50IGZvciBjb21wdXRlIHN0YWdlcyB3aXRoIFdlYkdMIDIgd2hpY2ggdXNlcyBUcmFuc2Zvcm0gRmVlZGJhY2spLlxyXG5cdCAqIEBwYXJhbSB7P0FycmF5PE9iamVjdD59IFthdHRyaWJ1dGVzPW51bGxdIC0gVGhlIGF0dHJpYnV0ZXMgKG9ubHkgcmVsZXZhbnQgZm9yIGNvbXB1dGUgc3RhZ2VzIHdpdGggV2ViR0wgMiB3aGljaCB1c2VzIFRyYW5zZm9ybSBGZWVkYmFjaykuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGNvZGUsIHN0YWdlLCBuYW1lLCB0cmFuc2Zvcm1zID0gbnVsbCwgYXR0cmlidXRlcyA9IG51bGwgKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgaWQgb2YgdGhlIHByb2dyYW1tYWJsZSBzdGFnZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlkID0gX2lkICsrO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHNoYWRlciBjb2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29kZSA9IGNvZGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdHlwZSBvZiBzdGFnZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnN0YWdlID0gc3RhZ2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbmFtZSBvZiB0aGUgc3RhZ2UuXHJcblx0XHQgKiBUaGlzIGlzIHVzZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5hbWUgPSBuYW1lO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHRyYW5zZm9ybXMgKG9ubHkgcmVsZXZhbnQgZm9yIGNvbXB1dGUgc3RhZ2VzIHdpdGggV2ViR0wgMiB3aGljaCB1c2VzIFRyYW5zZm9ybSBGZWVkYmFjaykuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9BcnJheTxPYmplY3Q+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRyYW5zZm9ybXMgPSB0cmFuc2Zvcm1zO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGF0dHJpYnV0ZXMgKG9ubHkgcmVsZXZhbnQgZm9yIGNvbXB1dGUgc3RhZ2VzIHdpdGggV2ViR0wgMiB3aGljaCB1c2VzIFRyYW5zZm9ybSBGZWVkYmFjaykuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9BcnJheTxPYmplY3Q+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG93IG9mdGVuIHRoZSBwcm9ncmFtbWFibGUgc3RhZ2UgaXMgY3VycmVudGx5IGluIHVzZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVzZWRUaW1lcyA9IDA7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFByb2dyYW1tYWJsZVN0YWdlO1xyXG4iLCJpbXBvcnQgRGF0YU1hcCBmcm9tICcuL0RhdGFNYXAuanMnO1xyXG5pbXBvcnQgUmVuZGVyUGlwZWxpbmUgZnJvbSAnLi9SZW5kZXJQaXBlbGluZS5qcyc7XHJcbmltcG9ydCBDb21wdXRlUGlwZWxpbmUgZnJvbSAnLi9Db21wdXRlUGlwZWxpbmUuanMnO1xyXG5pbXBvcnQgUHJvZ3JhbW1hYmxlU3RhZ2UgZnJvbSAnLi9Qcm9ncmFtbWFibGVTdGFnZS5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyByZW5kZXJlciBtb2R1bGUgbWFuYWdlcyB0aGUgcGlwZWxpbmVzIG9mIHRoZSByZW5kZXJlci5cclxuICpcclxuICogQHByaXZhdGVcclxuICogQGF1Z21lbnRzIERhdGFNYXBcclxuICovXHJcbmNsYXNzIFBpcGVsaW5lcyBleHRlbmRzIERhdGFNYXAge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHBpcGVsaW5lIG1hbmFnZW1lbnQgY29tcG9uZW50LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCYWNrZW5kfSBiYWNrZW5kIC0gVGhlIHJlbmRlcmVyJ3MgYmFja2VuZC5cclxuXHQgKiBAcGFyYW0ge05vZGVzfSBub2RlcyAtIFJlbmRlcmVyIGNvbXBvbmVudCBmb3IgbWFuYWdpbmcgbm9kZXMgcmVsYXRlZCBsb2dpYy5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggYmFja2VuZCwgbm9kZXMgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByZW5kZXJlcidzIGJhY2tlbmQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0JhY2tlbmR9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYmFja2VuZCA9IGJhY2tlbmQ7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZW5kZXJlciBjb21wb25lbnQgZm9yIG1hbmFnaW5nIG5vZGVzIHJlbGF0ZWQgbG9naWMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGVzfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vZGVzID0gbm9kZXM7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZXMgdG8gdGhlIGJpbmRpbmdzIG1hbmFnZW1lbnQgY29tcG9uZW50LlxyXG5cdFx0ICogVGhpcyByZWZlcmVuY2Ugd2lsbCBiZSBzZXQgaW5zaWRlIHRoZSBgQmluZGluZ3NgXHJcblx0XHQgKiBjb25zdHJ1Y3Rvci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P0JpbmRpbmdzfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJpbmRpbmdzID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEludGVybmFsIGNhY2hlIGZvciBtYWludGFpbmluZyBwaXBlbGluZXMuXHJcblx0XHQgKiBUaGUga2V5IG9mIHRoZSBtYXAgaXMgYSBjYWNoZSBrZXksIHRoZSB2YWx1ZSB0aGUgcGlwZWxpbmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge01hcDxzdHJpbmcsUGlwZWxpbmU+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNhY2hlcyA9IG5ldyBNYXAoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZGljdGlvbmFyeSBtYWludGFpbnMgZm9yIGVhY2ggc2hhZGVyIHN0YWdlIHR5cGUgKHZlcnRleCxcclxuXHRcdCAqIGZyYWdtZW50IGFuZCBjb21wdXRlKSB0aGUgcHJvZ3JhbW1hYmxlIHN0YWdlIG9iamVjdHMgd2hpY2hcclxuXHRcdCAqIHJlcHJlc2VudCB0aGUgYWN0dWFsIHNoYWRlciBjb2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLE1hcD59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucHJvZ3JhbXMgPSB7XHJcblx0XHRcdHZlcnRleDogbmV3IE1hcCgpLFxyXG5cdFx0XHRmcmFnbWVudDogbmV3IE1hcCgpLFxyXG5cdFx0XHRjb21wdXRlOiBuZXcgTWFwKClcclxuXHRcdH07XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIGNvbXB1dGUgcGlwZWxpbmUgZm9yIHRoZSBnaXZlbiBjb21wdXRlIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV9IGNvbXB1dGVOb2RlIC0gVGhlIGNvbXB1dGUgbm9kZS5cclxuXHQgKiBAcGFyYW0ge0FycmF5PEJpbmRHcm91cD59IGJpbmRpbmdzIC0gVGhlIGJpbmRpbmdzLlxyXG5cdCAqIEByZXR1cm4ge0NvbXB1dGVQaXBlbGluZX0gVGhlIGNvbXB1dGUgcGlwZWxpbmUuXHJcblx0ICovXHJcblx0Z2V0Rm9yQ29tcHV0ZSggY29tcHV0ZU5vZGUsIGJpbmRpbmdzICkge1xyXG5cclxuXHRcdGNvbnN0IHsgYmFja2VuZCB9ID0gdGhpcztcclxuXHJcblx0XHRjb25zdCBkYXRhID0gdGhpcy5nZXQoIGNvbXB1dGVOb2RlICk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9uZWVkc0NvbXB1dGVVcGRhdGUoIGNvbXB1dGVOb2RlICkgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBwcmV2aW91c1BpcGVsaW5lID0gZGF0YS5waXBlbGluZTtcclxuXHJcblx0XHRcdGlmICggcHJldmlvdXNQaXBlbGluZSApIHtcclxuXHJcblx0XHRcdFx0cHJldmlvdXNQaXBlbGluZS51c2VkVGltZXMgLS07XHJcblx0XHRcdFx0cHJldmlvdXNQaXBlbGluZS5jb21wdXRlUHJvZ3JhbS51c2VkVGltZXMgLS07XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBnZXQgc2hhZGVyXHJcblxyXG5cdFx0XHRjb25zdCBub2RlQnVpbGRlclN0YXRlID0gdGhpcy5ub2Rlcy5nZXRGb3JDb21wdXRlKCBjb21wdXRlTm9kZSApO1xyXG5cclxuXHRcdFx0Ly8gcHJvZ3JhbW1hYmxlIHN0YWdlXHJcblxyXG5cdFx0XHRsZXQgc3RhZ2VDb21wdXRlID0gdGhpcy5wcm9ncmFtcy5jb21wdXRlLmdldCggbm9kZUJ1aWxkZXJTdGF0ZS5jb21wdXRlU2hhZGVyICk7XHJcblxyXG5cdFx0XHRpZiAoIHN0YWdlQ29tcHV0ZSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIHByZXZpb3VzUGlwZWxpbmUgJiYgcHJldmlvdXNQaXBlbGluZS5jb21wdXRlUHJvZ3JhbS51c2VkVGltZXMgPT09IDAgKSB0aGlzLl9yZWxlYXNlUHJvZ3JhbSggcHJldmlvdXNQaXBlbGluZS5jb21wdXRlUHJvZ3JhbSApO1xyXG5cclxuXHRcdFx0XHRzdGFnZUNvbXB1dGUgPSBuZXcgUHJvZ3JhbW1hYmxlU3RhZ2UoIG5vZGVCdWlsZGVyU3RhdGUuY29tcHV0ZVNoYWRlciwgJ2NvbXB1dGUnLCBjb21wdXRlTm9kZS5uYW1lLCBub2RlQnVpbGRlclN0YXRlLnRyYW5zZm9ybXMsIG5vZGVCdWlsZGVyU3RhdGUubm9kZUF0dHJpYnV0ZXMgKTtcclxuXHRcdFx0XHR0aGlzLnByb2dyYW1zLmNvbXB1dGUuc2V0KCBub2RlQnVpbGRlclN0YXRlLmNvbXB1dGVTaGFkZXIsIHN0YWdlQ29tcHV0ZSApO1xyXG5cclxuXHRcdFx0XHRiYWNrZW5kLmNyZWF0ZVByb2dyYW0oIHN0YWdlQ29tcHV0ZSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gZGV0ZXJtaW5lIGNvbXB1dGUgcGlwZWxpbmVcclxuXHJcblx0XHRcdGNvbnN0IGNhY2hlS2V5ID0gdGhpcy5fZ2V0Q29tcHV0ZUNhY2hlS2V5KCBjb21wdXRlTm9kZSwgc3RhZ2VDb21wdXRlICk7XHJcblxyXG5cdFx0XHRsZXQgcGlwZWxpbmUgPSB0aGlzLmNhY2hlcy5nZXQoIGNhY2hlS2V5ICk7XHJcblxyXG5cdFx0XHRpZiAoIHBpcGVsaW5lID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggcHJldmlvdXNQaXBlbGluZSAmJiBwcmV2aW91c1BpcGVsaW5lLnVzZWRUaW1lcyA9PT0gMCApIHRoaXMuX3JlbGVhc2VQaXBlbGluZSggcHJldmlvdXNQaXBlbGluZSApO1xyXG5cclxuXHRcdFx0XHRwaXBlbGluZSA9IHRoaXMuX2dldENvbXB1dGVQaXBlbGluZSggY29tcHV0ZU5vZGUsIHN0YWdlQ29tcHV0ZSwgY2FjaGVLZXksIGJpbmRpbmdzICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBrZWVwIHRyYWNrIG9mIGFsbCB1c2VkIHRpbWVzXHJcblxyXG5cdFx0XHRwaXBlbGluZS51c2VkVGltZXMgKys7XHJcblx0XHRcdHN0YWdlQ29tcHV0ZS51c2VkVGltZXMgKys7XHJcblxyXG5cdFx0XHQvL1xyXG5cclxuXHRcdFx0ZGF0YS52ZXJzaW9uID0gY29tcHV0ZU5vZGUudmVyc2lvbjtcclxuXHRcdFx0ZGF0YS5waXBlbGluZSA9IHBpcGVsaW5lO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZGF0YS5waXBlbGluZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgcmVuZGVyIHBpcGVsaW5lIGZvciB0aGUgZ2l2ZW4gcmVuZGVyIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyT2JqZWN0fSByZW5kZXJPYmplY3QgLSBUaGUgcmVuZGVyIG9iamVjdC5cclxuXHQgKiBAcGFyYW0gez9BcnJheTxQcm9taXNlPn0gW3Byb21pc2VzPW51bGxdIC0gQW4gYXJyYXkgb2YgY29tcGlsYXRpb24gcHJvbWlzZXMgd2hpY2ggaXMgb25seSByZWxldmFudCBpbiBjb250ZXh0IG9mIGBSZW5kZXJlci5jb21waWxlQXN5bmMoKWAuXHJcblx0ICogQHJldHVybiB7UmVuZGVyUGlwZWxpbmV9IFRoZSByZW5kZXIgcGlwZWxpbmUuXHJcblx0ICovXHJcblx0Z2V0Rm9yUmVuZGVyKCByZW5kZXJPYmplY3QsIHByb21pc2VzID0gbnVsbCApIHtcclxuXHJcblx0XHRjb25zdCB7IGJhY2tlbmQgfSA9IHRoaXM7XHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IHRoaXMuZ2V0KCByZW5kZXJPYmplY3QgKTtcclxuXHJcblx0XHRpZiAoIHRoaXMuX25lZWRzUmVuZGVyVXBkYXRlKCByZW5kZXJPYmplY3QgKSApIHtcclxuXHJcblx0XHRcdGNvbnN0IHByZXZpb3VzUGlwZWxpbmUgPSBkYXRhLnBpcGVsaW5lO1xyXG5cclxuXHRcdFx0aWYgKCBwcmV2aW91c1BpcGVsaW5lICkge1xyXG5cclxuXHRcdFx0XHRwcmV2aW91c1BpcGVsaW5lLnVzZWRUaW1lcyAtLTtcclxuXHRcdFx0XHRwcmV2aW91c1BpcGVsaW5lLnZlcnRleFByb2dyYW0udXNlZFRpbWVzIC0tO1xyXG5cdFx0XHRcdHByZXZpb3VzUGlwZWxpbmUuZnJhZ21lbnRQcm9ncmFtLnVzZWRUaW1lcyAtLTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIGdldCBzaGFkZXJcclxuXHJcblx0XHRcdGNvbnN0IG5vZGVCdWlsZGVyU3RhdGUgPSByZW5kZXJPYmplY3QuZ2V0Tm9kZUJ1aWxkZXJTdGF0ZSgpO1xyXG5cclxuXHRcdFx0Y29uc3QgbmFtZSA9IHJlbmRlck9iamVjdC5tYXRlcmlhbCA/IHJlbmRlck9iamVjdC5tYXRlcmlhbC5uYW1lIDogJyc7XHJcblxyXG5cdFx0XHQvLyBwcm9ncmFtbWFibGUgc3RhZ2VzXHJcblxyXG5cdFx0XHRsZXQgc3RhZ2VWZXJ0ZXggPSB0aGlzLnByb2dyYW1zLnZlcnRleC5nZXQoIG5vZGVCdWlsZGVyU3RhdGUudmVydGV4U2hhZGVyICk7XHJcblxyXG5cdFx0XHRpZiAoIHN0YWdlVmVydGV4ID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggcHJldmlvdXNQaXBlbGluZSAmJiBwcmV2aW91c1BpcGVsaW5lLnZlcnRleFByb2dyYW0udXNlZFRpbWVzID09PSAwICkgdGhpcy5fcmVsZWFzZVByb2dyYW0oIHByZXZpb3VzUGlwZWxpbmUudmVydGV4UHJvZ3JhbSApO1xyXG5cclxuXHRcdFx0XHRzdGFnZVZlcnRleCA9IG5ldyBQcm9ncmFtbWFibGVTdGFnZSggbm9kZUJ1aWxkZXJTdGF0ZS52ZXJ0ZXhTaGFkZXIsICd2ZXJ0ZXgnLCBuYW1lICk7XHJcblx0XHRcdFx0dGhpcy5wcm9ncmFtcy52ZXJ0ZXguc2V0KCBub2RlQnVpbGRlclN0YXRlLnZlcnRleFNoYWRlciwgc3RhZ2VWZXJ0ZXggKTtcclxuXHJcblx0XHRcdFx0YmFja2VuZC5jcmVhdGVQcm9ncmFtKCBzdGFnZVZlcnRleCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0bGV0IHN0YWdlRnJhZ21lbnQgPSB0aGlzLnByb2dyYW1zLmZyYWdtZW50LmdldCggbm9kZUJ1aWxkZXJTdGF0ZS5mcmFnbWVudFNoYWRlciApO1xyXG5cclxuXHRcdFx0aWYgKCBzdGFnZUZyYWdtZW50ID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggcHJldmlvdXNQaXBlbGluZSAmJiBwcmV2aW91c1BpcGVsaW5lLmZyYWdtZW50UHJvZ3JhbS51c2VkVGltZXMgPT09IDAgKSB0aGlzLl9yZWxlYXNlUHJvZ3JhbSggcHJldmlvdXNQaXBlbGluZS5mcmFnbWVudFByb2dyYW0gKTtcclxuXHJcblx0XHRcdFx0c3RhZ2VGcmFnbWVudCA9IG5ldyBQcm9ncmFtbWFibGVTdGFnZSggbm9kZUJ1aWxkZXJTdGF0ZS5mcmFnbWVudFNoYWRlciwgJ2ZyYWdtZW50JywgbmFtZSApO1xyXG5cdFx0XHRcdHRoaXMucHJvZ3JhbXMuZnJhZ21lbnQuc2V0KCBub2RlQnVpbGRlclN0YXRlLmZyYWdtZW50U2hhZGVyLCBzdGFnZUZyYWdtZW50ICk7XHJcblxyXG5cdFx0XHRcdGJhY2tlbmQuY3JlYXRlUHJvZ3JhbSggc3RhZ2VGcmFnbWVudCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gZGV0ZXJtaW5lIHJlbmRlciBwaXBlbGluZVxyXG5cclxuXHRcdFx0Y29uc3QgY2FjaGVLZXkgPSB0aGlzLl9nZXRSZW5kZXJDYWNoZUtleSggcmVuZGVyT2JqZWN0LCBzdGFnZVZlcnRleCwgc3RhZ2VGcmFnbWVudCApO1xyXG5cclxuXHRcdFx0bGV0IHBpcGVsaW5lID0gdGhpcy5jYWNoZXMuZ2V0KCBjYWNoZUtleSApO1xyXG5cclxuXHRcdFx0aWYgKCBwaXBlbGluZSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIHByZXZpb3VzUGlwZWxpbmUgJiYgcHJldmlvdXNQaXBlbGluZS51c2VkVGltZXMgPT09IDAgKSB0aGlzLl9yZWxlYXNlUGlwZWxpbmUoIHByZXZpb3VzUGlwZWxpbmUgKTtcclxuXHJcblx0XHRcdFx0cGlwZWxpbmUgPSB0aGlzLl9nZXRSZW5kZXJQaXBlbGluZSggcmVuZGVyT2JqZWN0LCBzdGFnZVZlcnRleCwgc3RhZ2VGcmFnbWVudCwgY2FjaGVLZXksIHByb21pc2VzICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRyZW5kZXJPYmplY3QucGlwZWxpbmUgPSBwaXBlbGluZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIGtlZXAgdHJhY2sgb2YgYWxsIHVzZWQgdGltZXNcclxuXHJcblx0XHRcdHBpcGVsaW5lLnVzZWRUaW1lcyArKztcclxuXHRcdFx0c3RhZ2VWZXJ0ZXgudXNlZFRpbWVzICsrO1xyXG5cdFx0XHRzdGFnZUZyYWdtZW50LnVzZWRUaW1lcyArKztcclxuXHJcblx0XHRcdC8vXHJcblxyXG5cdFx0XHRkYXRhLnBpcGVsaW5lID0gcGlwZWxpbmU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBkYXRhLnBpcGVsaW5lO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlbGV0ZXMgdGhlIHBpcGVsaW5lIGZvciB0aGUgZ2l2ZW4gcmVuZGVyIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyT2JqZWN0fSBvYmplY3QgLSBUaGUgcmVuZGVyIG9iamVjdC5cclxuXHQgKiBAcmV0dXJuIHs/T2JqZWN0fSBUaGUgZGVsZXRlZCBkaWN0aW9uYXJ5LlxyXG5cdCAqL1xyXG5cdGRlbGV0ZSggb2JqZWN0ICkge1xyXG5cclxuXHRcdGNvbnN0IHBpcGVsaW5lID0gdGhpcy5nZXQoIG9iamVjdCApLnBpcGVsaW5lO1xyXG5cclxuXHRcdGlmICggcGlwZWxpbmUgKSB7XHJcblxyXG5cdFx0XHQvLyBwaXBlbGluZVxyXG5cclxuXHRcdFx0cGlwZWxpbmUudXNlZFRpbWVzIC0tO1xyXG5cclxuXHRcdFx0aWYgKCBwaXBlbGluZS51c2VkVGltZXMgPT09IDAgKSB0aGlzLl9yZWxlYXNlUGlwZWxpbmUoIHBpcGVsaW5lICk7XHJcblxyXG5cdFx0XHQvLyBwcm9ncmFtc1xyXG5cclxuXHRcdFx0aWYgKCBwaXBlbGluZS5pc0NvbXB1dGVQaXBlbGluZSApIHtcclxuXHJcblx0XHRcdFx0cGlwZWxpbmUuY29tcHV0ZVByb2dyYW0udXNlZFRpbWVzIC0tO1xyXG5cclxuXHRcdFx0XHRpZiAoIHBpcGVsaW5lLmNvbXB1dGVQcm9ncmFtLnVzZWRUaW1lcyA9PT0gMCApIHRoaXMuX3JlbGVhc2VQcm9ncmFtKCBwaXBlbGluZS5jb21wdXRlUHJvZ3JhbSApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0cGlwZWxpbmUuZnJhZ21lbnRQcm9ncmFtLnVzZWRUaW1lcyAtLTtcclxuXHRcdFx0XHRwaXBlbGluZS52ZXJ0ZXhQcm9ncmFtLnVzZWRUaW1lcyAtLTtcclxuXHJcblx0XHRcdFx0aWYgKCBwaXBlbGluZS52ZXJ0ZXhQcm9ncmFtLnVzZWRUaW1lcyA9PT0gMCApIHRoaXMuX3JlbGVhc2VQcm9ncmFtKCBwaXBlbGluZS52ZXJ0ZXhQcm9ncmFtICk7XHJcblx0XHRcdFx0aWYgKCBwaXBlbGluZS5mcmFnbWVudFByb2dyYW0udXNlZFRpbWVzID09PSAwICkgdGhpcy5fcmVsZWFzZVByb2dyYW0oIHBpcGVsaW5lLmZyYWdtZW50UHJvZ3JhbSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gc3VwZXIuZGVsZXRlKCBvYmplY3QgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGcmVlcyBpbnRlcm5hbCByZXNvdXJjZXMuXHJcblx0ICovXHJcblx0ZGlzcG9zZSgpIHtcclxuXHJcblx0XHRzdXBlci5kaXNwb3NlKCk7XHJcblxyXG5cdFx0dGhpcy5jYWNoZXMgPSBuZXcgTWFwKCk7XHJcblx0XHR0aGlzLnByb2dyYW1zID0ge1xyXG5cdFx0XHR2ZXJ0ZXg6IG5ldyBNYXAoKSxcclxuXHRcdFx0ZnJhZ21lbnQ6IG5ldyBNYXAoKSxcclxuXHRcdFx0Y29tcHV0ZTogbmV3IE1hcCgpXHJcblx0XHR9O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIHBpcGVsaW5lIGZvciB0aGUgZ2l2ZW4gcmVuZGVyIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyT2JqZWN0fSByZW5kZXJPYmplY3QgLSBUaGUgcmVuZGVyIG9iamVjdC5cclxuXHQgKi9cclxuXHR1cGRhdGVGb3JSZW5kZXIoIHJlbmRlck9iamVjdCApIHtcclxuXHJcblx0XHR0aGlzLmdldEZvclJlbmRlciggcmVuZGVyT2JqZWN0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIGNvbXB1dGUgcGlwZWxpbmUgZm9yIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge05vZGV9IGNvbXB1dGVOb2RlIC0gVGhlIGNvbXB1dGUgbm9kZS5cclxuXHQgKiBAcGFyYW0ge1Byb2dyYW1tYWJsZVN0YWdlfSBzdGFnZUNvbXB1dGUgLSBUaGUgcHJvZ3JhbW1hYmxlIHN0YWdlIHJlcHJlc2VudGluZyB0aGUgY29tcHV0ZSBzaGFkZXIuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGNhY2hlS2V5IC0gVGhlIGNhY2hlIGtleS5cclxuXHQgKiBAcGFyYW0ge0FycmF5PEJpbmRHcm91cD59IGJpbmRpbmdzIC0gVGhlIGJpbmRpbmdzLlxyXG5cdCAqIEByZXR1cm4ge0NvbXB1dGVQaXBlbGluZX0gVGhlIGNvbXB1dGUgcGlwZWxpbmUuXHJcblx0ICovXHJcblx0X2dldENvbXB1dGVQaXBlbGluZSggY29tcHV0ZU5vZGUsIHN0YWdlQ29tcHV0ZSwgY2FjaGVLZXksIGJpbmRpbmdzICkge1xyXG5cclxuXHRcdC8vIGNoZWNrIGZvciBleGlzdGluZyBwaXBlbGluZVxyXG5cclxuXHRcdGNhY2hlS2V5ID0gY2FjaGVLZXkgfHwgdGhpcy5fZ2V0Q29tcHV0ZUNhY2hlS2V5KCBjb21wdXRlTm9kZSwgc3RhZ2VDb21wdXRlICk7XHJcblxyXG5cdFx0bGV0IHBpcGVsaW5lID0gdGhpcy5jYWNoZXMuZ2V0KCBjYWNoZUtleSApO1xyXG5cclxuXHRcdGlmICggcGlwZWxpbmUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHBpcGVsaW5lID0gbmV3IENvbXB1dGVQaXBlbGluZSggY2FjaGVLZXksIHN0YWdlQ29tcHV0ZSApO1xyXG5cclxuXHRcdFx0dGhpcy5jYWNoZXMuc2V0KCBjYWNoZUtleSwgcGlwZWxpbmUgKTtcclxuXHJcblx0XHRcdHRoaXMuYmFja2VuZC5jcmVhdGVDb21wdXRlUGlwZWxpbmUoIHBpcGVsaW5lLCBiaW5kaW5ncyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcGlwZWxpbmU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIHJlbmRlciBwaXBlbGluZSBmb3IgdGhlIGdpdmVuIHBhcmFtZXRlcnMuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyT2JqZWN0fSByZW5kZXJPYmplY3QgLSBUaGUgcmVuZGVyIG9iamVjdC5cclxuXHQgKiBAcGFyYW0ge1Byb2dyYW1tYWJsZVN0YWdlfSBzdGFnZVZlcnRleCAtIFRoZSBwcm9ncmFtbWFibGUgc3RhZ2UgcmVwcmVzZW50aW5nIHRoZSB2ZXJ0ZXggc2hhZGVyLlxyXG5cdCAqIEBwYXJhbSB7UHJvZ3JhbW1hYmxlU3RhZ2V9IHN0YWdlRnJhZ21lbnQgLSBUaGUgcHJvZ3JhbW1hYmxlIHN0YWdlIHJlcHJlc2VudGluZyB0aGUgZnJhZ21lbnQgc2hhZGVyLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBjYWNoZUtleSAtIFRoZSBjYWNoZSBrZXkuXHJcblx0ICogQHBhcmFtIHs/QXJyYXk8UHJvbWlzZT59IHByb21pc2VzIC0gQW4gYXJyYXkgb2YgY29tcGlsYXRpb24gcHJvbWlzZXMgd2hpY2ggaXMgb25seSByZWxldmFudCBpbiBjb250ZXh0IG9mIGBSZW5kZXJlci5jb21waWxlQXN5bmMoKWAuXHJcblx0ICogQHJldHVybiB7Q29tcHV0ZVBpcGVsaW5lfSBUaGUgY29tcHV0ZSBwaXBlbGluZS5cclxuXHQgKi9cclxuXHRfZ2V0UmVuZGVyUGlwZWxpbmUoIHJlbmRlck9iamVjdCwgc3RhZ2VWZXJ0ZXgsIHN0YWdlRnJhZ21lbnQsIGNhY2hlS2V5LCBwcm9taXNlcyApIHtcclxuXHJcblx0XHQvLyBjaGVjayBmb3IgZXhpc3RpbmcgcGlwZWxpbmVcclxuXHJcblx0XHRjYWNoZUtleSA9IGNhY2hlS2V5IHx8IHRoaXMuX2dldFJlbmRlckNhY2hlS2V5KCByZW5kZXJPYmplY3QsIHN0YWdlVmVydGV4LCBzdGFnZUZyYWdtZW50ICk7XHJcblxyXG5cdFx0bGV0IHBpcGVsaW5lID0gdGhpcy5jYWNoZXMuZ2V0KCBjYWNoZUtleSApO1xyXG5cclxuXHRcdGlmICggcGlwZWxpbmUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHBpcGVsaW5lID0gbmV3IFJlbmRlclBpcGVsaW5lKCBjYWNoZUtleSwgc3RhZ2VWZXJ0ZXgsIHN0YWdlRnJhZ21lbnQgKTtcclxuXHJcblx0XHRcdHRoaXMuY2FjaGVzLnNldCggY2FjaGVLZXksIHBpcGVsaW5lICk7XHJcblxyXG5cdFx0XHRyZW5kZXJPYmplY3QucGlwZWxpbmUgPSBwaXBlbGluZTtcclxuXHJcblx0XHRcdC8vIFRoZSBgcHJvbWlzZXNgIGFycmF5IGlzIGBudWxsYCBieSBkZWZhdWx0IGFuZCBvbmx5IHNldCB0byBhbiBlbXB0eSBhcnJheSB3aGVuXHJcblx0XHRcdC8vIGBSZW5kZXJlci5jb21waWxlQXN5bmMoKWAgaXMgdXNlZC4gVGhlIG5leHQgY2FsbCBhY3R1YWxseSBmaWxscyB0aGUgYXJyYXkgd2l0aFxyXG5cdFx0XHQvLyBwZW5kaW5nIHByb21pc2VzIHRoYXQgcmVzb2x2ZSB3aGVuIHRoZSByZW5kZXIgcGlwZWxpbmVzIGFyZSByZWFkeSBmb3IgcmVuZGVyaW5nLlxyXG5cclxuXHRcdFx0dGhpcy5iYWNrZW5kLmNyZWF0ZVJlbmRlclBpcGVsaW5lKCByZW5kZXJPYmplY3QsIHByb21pc2VzICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBwaXBlbGluZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyBhIGNhY2hlIGtleSByZXByZXNlbnRpbmcgYSBjb21wdXRlIHBpcGVsaW5lLlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge05vZGV9IGNvbXB1dGVOb2RlIC0gVGhlIGNvbXB1dGUgbm9kZS5cclxuXHQgKiBAcGFyYW0ge1Byb2dyYW1tYWJsZVN0YWdlfSBzdGFnZUNvbXB1dGUgLSBUaGUgcHJvZ3JhbW1hYmxlIHN0YWdlIHJlcHJlc2VudGluZyB0aGUgY29tcHV0ZSBzaGFkZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgY2FjaGUga2V5LlxyXG5cdCAqL1xyXG5cdF9nZXRDb21wdXRlQ2FjaGVLZXkoIGNvbXB1dGVOb2RlLCBzdGFnZUNvbXB1dGUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIGNvbXB1dGVOb2RlLmlkICsgJywnICsgc3RhZ2VDb21wdXRlLmlkO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIGEgY2FjaGUga2V5IHJlcHJlc2VudGluZyBhIHJlbmRlciBwaXBlbGluZS5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtSZW5kZXJPYmplY3R9IHJlbmRlck9iamVjdCAtIFRoZSByZW5kZXIgb2JqZWN0LlxyXG5cdCAqIEBwYXJhbSB7UHJvZ3JhbW1hYmxlU3RhZ2V9IHN0YWdlVmVydGV4IC0gVGhlIHByb2dyYW1tYWJsZSBzdGFnZSByZXByZXNlbnRpbmcgdGhlIHZlcnRleCBzaGFkZXIuXHJcblx0ICogQHBhcmFtIHtQcm9ncmFtbWFibGVTdGFnZX0gc3RhZ2VGcmFnbWVudCAtIFRoZSBwcm9ncmFtbWFibGUgc3RhZ2UgcmVwcmVzZW50aW5nIHRoZSBmcmFnbWVudCBzaGFkZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgY2FjaGUga2V5LlxyXG5cdCAqL1xyXG5cdF9nZXRSZW5kZXJDYWNoZUtleSggcmVuZGVyT2JqZWN0LCBzdGFnZVZlcnRleCwgc3RhZ2VGcmFnbWVudCApIHtcclxuXHJcblx0XHRyZXR1cm4gc3RhZ2VWZXJ0ZXguaWQgKyAnLCcgKyBzdGFnZUZyYWdtZW50LmlkICsgJywnICsgdGhpcy5iYWNrZW5kLmdldFJlbmRlckNhY2hlS2V5KCByZW5kZXJPYmplY3QgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZWxlYXNlcyB0aGUgZ2l2ZW4gcGlwZWxpbmUuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7UGlwZWxpbmV9IHBpcGVsaW5lIC0gVGhlIHBpcGVsaW5lIHRvIHJlbGVhc2UuXHJcblx0ICovXHJcblx0X3JlbGVhc2VQaXBlbGluZSggcGlwZWxpbmUgKSB7XHJcblxyXG5cdFx0dGhpcy5jYWNoZXMuZGVsZXRlKCBwaXBlbGluZS5jYWNoZUtleSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbGVhc2VzIHRoZSBzaGFkZXIgcHJvZ3JhbS5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IHByb2dyYW0gLSBUaGUgc2hhZGVyIHByb2dyYW0gdG8gcmVsZWFzZS5cclxuXHQgKi9cclxuXHRfcmVsZWFzZVByb2dyYW0oIHByb2dyYW0gKSB7XHJcblxyXG5cdFx0Y29uc3QgY29kZSA9IHByb2dyYW0uY29kZTtcclxuXHRcdGNvbnN0IHN0YWdlID0gcHJvZ3JhbS5zdGFnZTtcclxuXHJcblx0XHR0aGlzLnByb2dyYW1zWyBzdGFnZSBdLmRlbGV0ZSggY29kZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBjb21wdXRlIHBpcGVsaW5lIGZvciB0aGUgZ2l2ZW4gY29tcHV0ZSBub2RlIHJlcXVpcmVzIGFuIHVwZGF0ZS5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtOb2RlfSBjb21wdXRlTm9kZSAtIFRoZSBjb21wdXRlIG5vZGUuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgY29tcHV0ZSBwaXBlbGluZSBmb3IgdGhlIGdpdmVuIGNvbXB1dGUgbm9kZSByZXF1aXJlcyBhbiB1cGRhdGUgb3Igbm90LlxyXG5cdCAqL1xyXG5cdF9uZWVkc0NvbXB1dGVVcGRhdGUoIGNvbXB1dGVOb2RlICkge1xyXG5cclxuXHRcdGNvbnN0IGRhdGEgPSB0aGlzLmdldCggY29tcHV0ZU5vZGUgKTtcclxuXHJcblx0XHRyZXR1cm4gZGF0YS5waXBlbGluZSA9PT0gdW5kZWZpbmVkIHx8IGRhdGEudmVyc2lvbiAhPT0gY29tcHV0ZU5vZGUudmVyc2lvbjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgcmVuZGVyIHBpcGVsaW5lIGZvciB0aGUgZ2l2ZW4gcmVuZGVyIG9iamVjdCByZXF1aXJlcyBhbiB1cGRhdGUuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyT2JqZWN0fSByZW5kZXJPYmplY3QgLSBUaGUgcmVuZGVyIG9iamVjdC5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSByZW5kZXIgb2JqZWN0IGZvciB0aGUgZ2l2ZW4gcmVuZGVyIG9iamVjdCByZXF1aXJlcyBhbiB1cGRhdGUgb3Igbm90LlxyXG5cdCAqL1xyXG5cdF9uZWVkc1JlbmRlclVwZGF0ZSggcmVuZGVyT2JqZWN0ICkge1xyXG5cclxuXHRcdGNvbnN0IGRhdGEgPSB0aGlzLmdldCggcmVuZGVyT2JqZWN0ICk7XHJcblxyXG5cdFx0cmV0dXJuIGRhdGEucGlwZWxpbmUgPT09IHVuZGVmaW5lZCB8fCB0aGlzLmJhY2tlbmQubmVlZHNSZW5kZXJVcGRhdGUoIHJlbmRlck9iamVjdCApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBQaXBlbGluZXM7XHJcbiIsImltcG9ydCBEYXRhTWFwIGZyb20gJy4vRGF0YU1hcC5qcyc7XHJcbmltcG9ydCB7IEF0dHJpYnV0ZVR5cGUgfSBmcm9tICcuL0NvbnN0YW50cy5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyByZW5kZXJlciBtb2R1bGUgbWFuYWdlcyB0aGUgYmluZGluZ3Mgb2YgdGhlIHJlbmRlcmVyLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAYXVnbWVudHMgRGF0YU1hcFxyXG4gKi9cclxuY2xhc3MgQmluZGluZ3MgZXh0ZW5kcyBEYXRhTWFwIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBiaW5kaW5ncyBtYW5hZ2VtZW50IGNvbXBvbmVudC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QmFja2VuZH0gYmFja2VuZCAtIFRoZSByZW5kZXJlcidzIGJhY2tlbmQuXHJcblx0ICogQHBhcmFtIHtOb2Rlc30gbm9kZXMgLSBSZW5kZXJlciBjb21wb25lbnQgZm9yIG1hbmFnaW5nIG5vZGVzIHJlbGF0ZWQgbG9naWMuXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlc30gdGV4dHVyZXMgLSBSZW5kZXJlciBjb21wb25lbnQgZm9yIG1hbmFnaW5nIHRleHR1cmVzLlxyXG5cdCAqIEBwYXJhbSB7QXR0cmlidXRlc30gYXR0cmlidXRlcyAtIFJlbmRlcmVyIGNvbXBvbmVudCBmb3IgbWFuYWdpbmcgYXR0cmlidXRlcy5cclxuXHQgKiBAcGFyYW0ge1BpcGVsaW5lc30gcGlwZWxpbmVzIC0gUmVuZGVyZXIgY29tcG9uZW50IGZvciBtYW5hZ2luZyBwaXBlbGluZXMuXHJcblx0ICogQHBhcmFtIHtJbmZvfSBpbmZvIC0gUmVuZGVyZXIgY29tcG9uZW50IGZvciBtYW5hZ2luZyBtZXRyaWNzIGFuZCBtb25pdG9yaW5nIGRhdGEuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGJhY2tlbmQsIG5vZGVzLCB0ZXh0dXJlcywgYXR0cmlidXRlcywgcGlwZWxpbmVzLCBpbmZvICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcmVuZGVyZXIncyBiYWNrZW5kLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtCYWNrZW5kfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJhY2tlbmQgPSBiYWNrZW5kO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVuZGVyZXIgY29tcG9uZW50IGZvciBtYW5hZ2luZyB0ZXh0dXJlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VGV4dHVyZXN9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudGV4dHVyZXMgPSB0ZXh0dXJlcztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlbmRlcmVyIGNvbXBvbmVudCBmb3IgbWFuYWdpbmcgcGlwZWxpbmVzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtQaXBlbGluZXN9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucGlwZWxpbmVzID0gcGlwZWxpbmVzO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVuZGVyZXIgY29tcG9uZW50IGZvciBtYW5hZ2luZyBhdHRyaWJ1dGVzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBdHRyaWJ1dGVzfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVuZGVyZXIgY29tcG9uZW50IGZvciBtYW5hZ2luZyBub2RlcyByZWxhdGVkIGxvZ2ljLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2Rlc31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub2RlcyA9IG5vZGVzO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVuZGVyZXIgY29tcG9uZW50IGZvciBtYW5hZ2luZyBtZXRyaWNzIGFuZCBtb25pdG9yaW5nIGRhdGEuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0luZm99XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaW5mbyA9IGluZm87XHJcblxyXG5cdFx0dGhpcy5waXBlbGluZXMuYmluZGluZ3MgPSB0aGlzOyAvLyBhc3NpZ24gYmluZGluZ3MgdG8gcGlwZWxpbmVzXHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgYmluZCBncm91cHMgZm9yIHRoZSBnaXZlbiByZW5kZXIgb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSZW5kZXJPYmplY3R9IHJlbmRlck9iamVjdCAtIFRoZSByZW5kZXIgb2JqZWN0LlxyXG5cdCAqIEByZXR1cm4ge0FycmF5PEJpbmRHcm91cD59IFRoZSBiaW5kIGdyb3Vwcy5cclxuXHQgKi9cclxuXHRnZXRGb3JSZW5kZXIoIHJlbmRlck9iamVjdCApIHtcclxuXHJcblx0XHRjb25zdCBiaW5kaW5ncyA9IHJlbmRlck9iamVjdC5nZXRCaW5kaW5ncygpO1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IGJpbmRHcm91cCBvZiBiaW5kaW5ncyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGdyb3VwRGF0YSA9IHRoaXMuZ2V0KCBiaW5kR3JvdXAgKTtcclxuXHJcblx0XHRcdGlmICggZ3JvdXBEYXRhLmJpbmRHcm91cCA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHQvLyBlYWNoIG9iamVjdCBkZWZpbmVzIGFuIGFycmF5IG9mIGJpbmRpbmdzICh1Ym9zLCB0ZXh0dXJlcywgc2FtcGxlcnMgZXRjLilcclxuXHJcblx0XHRcdFx0dGhpcy5faW5pdCggYmluZEdyb3VwICk7XHJcblxyXG5cdFx0XHRcdHRoaXMuYmFja2VuZC5jcmVhdGVCaW5kaW5ncyggYmluZEdyb3VwLCBiaW5kaW5ncywgMCApO1xyXG5cclxuXHRcdFx0XHRncm91cERhdGEuYmluZEdyb3VwID0gYmluZEdyb3VwO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gYmluZGluZ3M7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgYmluZCBncm91cHMgZm9yIHRoZSBnaXZlbiBjb21wdXRlIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV9IGNvbXB1dGVOb2RlIC0gVGhlIGNvbXB1dGUgbm9kZS5cclxuXHQgKiBAcmV0dXJuIHtBcnJheTxCaW5kR3JvdXA+fSBUaGUgYmluZCBncm91cHMuXHJcblx0ICovXHJcblx0Z2V0Rm9yQ29tcHV0ZSggY29tcHV0ZU5vZGUgKSB7XHJcblxyXG5cdFx0Y29uc3QgYmluZGluZ3MgPSB0aGlzLm5vZGVzLmdldEZvckNvbXB1dGUoIGNvbXB1dGVOb2RlICkuYmluZGluZ3M7XHJcblxyXG5cdFx0Zm9yICggY29uc3QgYmluZEdyb3VwIG9mIGJpbmRpbmdzICkge1xyXG5cclxuXHRcdFx0Y29uc3QgZ3JvdXBEYXRhID0gdGhpcy5nZXQoIGJpbmRHcm91cCApO1xyXG5cclxuXHRcdFx0aWYgKCBncm91cERhdGEuYmluZEdyb3VwID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdHRoaXMuX2luaXQoIGJpbmRHcm91cCApO1xyXG5cclxuXHRcdFx0XHR0aGlzLmJhY2tlbmQuY3JlYXRlQmluZGluZ3MoIGJpbmRHcm91cCwgYmluZGluZ3MsIDAgKTtcclxuXHJcblx0XHRcdFx0Z3JvdXBEYXRhLmJpbmRHcm91cCA9IGJpbmRHcm91cDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGJpbmRpbmdzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIGJpbmRpbmdzIGZvciB0aGUgZ2l2ZW4gY29tcHV0ZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlfSBjb21wdXRlTm9kZSAtIFRoZSBjb21wdXRlIG5vZGUuXHJcblx0ICovXHJcblx0dXBkYXRlRm9yQ29tcHV0ZSggY29tcHV0ZU5vZGUgKSB7XHJcblxyXG5cdFx0dGhpcy5fdXBkYXRlQmluZGluZ3MoIHRoaXMuZ2V0Rm9yQ29tcHV0ZSggY29tcHV0ZU5vZGUgKSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIGJpbmRpbmdzIGZvciB0aGUgZ2l2ZW4gcmVuZGVyIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyT2JqZWN0fSByZW5kZXJPYmplY3QgLSBUaGUgcmVuZGVyIG9iamVjdC5cclxuXHQgKi9cclxuXHR1cGRhdGVGb3JSZW5kZXIoIHJlbmRlck9iamVjdCApIHtcclxuXHJcblx0XHR0aGlzLl91cGRhdGVCaW5kaW5ncyggdGhpcy5nZXRGb3JSZW5kZXIoIHJlbmRlck9iamVjdCApICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgZ2l2ZW4gYXJyYXkgb2YgYmluZGluZ3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PEJpbmRHcm91cD59IGJpbmRpbmdzIC0gVGhlIGJpbmQgZ3JvdXBzLlxyXG5cdCAqL1xyXG5cdF91cGRhdGVCaW5kaW5ncyggYmluZGluZ3MgKSB7XHJcblxyXG5cdFx0Zm9yICggY29uc3QgYmluZEdyb3VwIG9mIGJpbmRpbmdzICkge1xyXG5cclxuXHRcdFx0dGhpcy5fdXBkYXRlKCBiaW5kR3JvdXAsIGJpbmRpbmdzICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEluaXRpYWxpemVzIHRoZSBnaXZlbiBiaW5kIGdyb3VwLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCaW5kR3JvdXB9IGJpbmRHcm91cCAtIFRoZSBiaW5kIGdyb3VwIHRvIGluaXRpYWxpemUuXHJcblx0ICovXHJcblx0X2luaXQoIGJpbmRHcm91cCApIHtcclxuXHJcblx0XHRmb3IgKCBjb25zdCBiaW5kaW5nIG9mIGJpbmRHcm91cC5iaW5kaW5ncyApIHtcclxuXHJcblx0XHRcdGlmICggYmluZGluZy5pc1NhbXBsZWRUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLnRleHR1cmVzLnVwZGF0ZVRleHR1cmUoIGJpbmRpbmcudGV4dHVyZSApO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggYmluZGluZy5pc1N0b3JhZ2VCdWZmZXIgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGF0dHJpYnV0ZSA9IGJpbmRpbmcuYXR0cmlidXRlO1xyXG5cdFx0XHRcdGNvbnN0IGF0dHJpYnV0ZVR5cGUgPSBhdHRyaWJ1dGUuaXNJbmRpcmVjdFN0b3JhZ2VCdWZmZXJBdHRyaWJ1dGUgPyBBdHRyaWJ1dGVUeXBlLklORElSRUNUIDogQXR0cmlidXRlVHlwZS5TVE9SQUdFO1xyXG5cclxuXHRcdFx0XHR0aGlzLmF0dHJpYnV0ZXMudXBkYXRlKCBhdHRyaWJ1dGUsIGF0dHJpYnV0ZVR5cGUgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgZ2l2ZW4gYmluZCBncm91cC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QmluZEdyb3VwfSBiaW5kR3JvdXAgLSBUaGUgYmluZCBncm91cCB0byB1cGRhdGUuXHJcblx0ICogQHBhcmFtIHtBcnJheTxCaW5kR3JvdXA+fSBiaW5kaW5ncyAtIFRoZSBiaW5kIGdyb3Vwcy5cclxuXHQgKi9cclxuXHRfdXBkYXRlKCBiaW5kR3JvdXAsIGJpbmRpbmdzICkge1xyXG5cclxuXHRcdGNvbnN0IHsgYmFja2VuZCB9ID0gdGhpcztcclxuXHJcblx0XHRsZXQgbmVlZHNCaW5kaW5nc1VwZGF0ZSA9IGZhbHNlO1xyXG5cdFx0bGV0IGNhY2hlQmluZGluZ3MgPSB0cnVlO1xyXG5cdFx0bGV0IGNhY2hlSW5kZXggPSAwO1xyXG5cdFx0bGV0IHZlcnNpb24gPSAwO1xyXG5cclxuXHRcdC8vIGl0ZXJhdGUgb3ZlciBhbGwgYmluZGluZ3MgYW5kIGNoZWNrIGlmIGJ1ZmZlciB1cGRhdGVzIG9yIGEgbmV3IGJpbmRpbmcgZ3JvdXAgaXMgcmVxdWlyZWRcclxuXHJcblx0XHRmb3IgKCBjb25zdCBiaW5kaW5nIG9mIGJpbmRHcm91cC5iaW5kaW5ncyApIHtcclxuXHJcblx0XHRcdGlmICggYmluZGluZy5pc05vZGVVbmlmb3Jtc0dyb3VwICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB1cGRhdGVkID0gdGhpcy5ub2Rlcy51cGRhdGVHcm91cCggYmluZGluZyApO1xyXG5cclxuXHRcdFx0XHQvLyBldmVyeSB1bmlmb3JtcyBncm91cCBpcyBhIHVuaWZvcm0gYnVmZmVyLiBTbyBpZiBubyB1cGRhdGUgaXMgcmVxdWlyZWQsXHJcblx0XHRcdFx0Ly8gd2UgbW92ZSBvbmUgd2l0aCB0aGUgbmV4dCBiaW5kaW5nLiBPdGhlcndpc2UgdGhlIG5leHQgaWYgYmxvY2sgd2lsbCB1cGRhdGUgdGhlIGdyb3VwLlxyXG5cclxuXHRcdFx0XHRpZiAoIHVwZGF0ZWQgPT09IGZhbHNlICkgY29udGludWU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIGJpbmRpbmcuaXNTdG9yYWdlQnVmZmVyICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBhdHRyaWJ1dGUgPSBiaW5kaW5nLmF0dHJpYnV0ZTtcclxuXHRcdFx0XHRjb25zdCBhdHRyaWJ1dGVUeXBlID0gYXR0cmlidXRlLmlzSW5kaXJlY3RTdG9yYWdlQnVmZmVyQXR0cmlidXRlID8gQXR0cmlidXRlVHlwZS5JTkRJUkVDVCA6IEF0dHJpYnV0ZVR5cGUuU1RPUkFHRTtcclxuXHJcblx0XHRcdFx0dGhpcy5hdHRyaWJ1dGVzLnVwZGF0ZSggYXR0cmlidXRlLCBhdHRyaWJ1dGVUeXBlICk7XHJcblxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBiaW5kaW5nLmlzVW5pZm9ybUJ1ZmZlciApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgdXBkYXRlZCA9IGJpbmRpbmcudXBkYXRlKCk7XHJcblxyXG5cdFx0XHRcdGlmICggdXBkYXRlZCApIHtcclxuXHJcblx0XHRcdFx0XHRiYWNrZW5kLnVwZGF0ZUJpbmRpbmcoIGJpbmRpbmcgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggYmluZGluZy5pc1NhbXBsZXIgKSB7XHJcblxyXG5cdFx0XHRcdGJpbmRpbmcudXBkYXRlKCk7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBiaW5kaW5nLmlzU2FtcGxlZFRleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHRleHR1cmVzVGV4dHVyZURhdGEgPSB0aGlzLnRleHR1cmVzLmdldCggYmluZGluZy50ZXh0dXJlICk7XHJcblxyXG5cdFx0XHRcdGlmICggYmluZGluZy5uZWVkc0JpbmRpbmdzVXBkYXRlKCB0ZXh0dXJlc1RleHR1cmVEYXRhLmdlbmVyYXRpb24gKSApIG5lZWRzQmluZGluZ3NVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHRjb25zdCB1cGRhdGVkID0gYmluZGluZy51cGRhdGUoKTtcclxuXHJcblx0XHRcdFx0Y29uc3QgdGV4dHVyZSA9IGJpbmRpbmcudGV4dHVyZTtcclxuXHJcblx0XHRcdFx0aWYgKCB1cGRhdGVkICkge1xyXG5cclxuXHRcdFx0XHRcdHRoaXMudGV4dHVyZXMudXBkYXRlVGV4dHVyZSggdGV4dHVyZSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGNvbnN0IHRleHR1cmVEYXRhID0gYmFja2VuZC5nZXQoIHRleHR1cmUgKTtcclxuXHJcblx0XHRcdFx0aWYgKCB0ZXh0dXJlRGF0YS5leHRlcm5hbFRleHR1cmUgIT09IHVuZGVmaW5lZCB8fCB0ZXh0dXJlc1RleHR1cmVEYXRhLmlzRGVmYXVsdFRleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y2FjaGVCaW5kaW5ncyA9IGZhbHNlO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdGNhY2hlSW5kZXggPSBjYWNoZUluZGV4ICogMTAgKyB0ZXh0dXJlLmlkO1xyXG5cdFx0XHRcdFx0dmVyc2lvbiArPSB0ZXh0dXJlLnZlcnNpb247XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKCBiYWNrZW5kLmlzV2ViR1BVQmFja2VuZCA9PT0gdHJ1ZSAmJiB0ZXh0dXJlRGF0YS50ZXh0dXJlID09PSB1bmRlZmluZWQgJiYgdGV4dHVyZURhdGEuZXh0ZXJuYWxUZXh0dXJlID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gVE9ETzogUmVtb3ZlIHRoaXMgb25jZSB3ZSBmb3VuZCB3aHkgdXBkYXRlZCA9PT0gZmFsc2UgaXNuJ3QgYm91bmQgdG8gYSB0ZXh0dXJlIGluIHRoZSBXZWJHUFUgYmFja2VuZFxyXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ0JpbmRpbmdzLl91cGRhdGU6IGJpbmRpbmcgc2hvdWxkIGJlIGF2YWlsYWJsZTonLCBiaW5kaW5nLCB1cGRhdGVkLCB0ZXh0dXJlLCBiaW5kaW5nLnRleHR1cmVOb2RlLnZhbHVlLCBuZWVkc0JpbmRpbmdzVXBkYXRlICk7XHJcblxyXG5cdFx0XHRcdFx0dGhpcy50ZXh0dXJlcy51cGRhdGVUZXh0dXJlKCB0ZXh0dXJlICk7XHJcblx0XHRcdFx0XHRuZWVkc0JpbmRpbmdzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoIHRleHR1cmUuaXNTdG9yYWdlVGV4dHVyZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCB0ZXh0dXJlRGF0YSA9IHRoaXMuZ2V0KCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBiaW5kaW5nLnN0b3JlID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0dGV4dHVyZURhdGEubmVlZHNNaXBtYXAgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIHRoaXMudGV4dHVyZXMubmVlZHNNaXBtYXBzKCB0ZXh0dXJlICkgJiYgdGV4dHVyZURhdGEubmVlZHNNaXBtYXAgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHR0aGlzLmJhY2tlbmQuZ2VuZXJhdGVNaXBtYXBzKCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0XHRcdFx0XHR0ZXh0dXJlRGF0YS5uZWVkc01pcG1hcCA9IGZhbHNlO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIG5lZWRzQmluZGluZ3NVcGRhdGUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmJhY2tlbmQudXBkYXRlQmluZGluZ3MoIGJpbmRHcm91cCwgYmluZGluZ3MsIGNhY2hlQmluZGluZ3MgPyBjYWNoZUluZGV4IDogMCwgdmVyc2lvbiApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQmluZGluZ3M7XHJcbiIsImltcG9ydCB7IERvdWJsZVNpZGUgfSBmcm9tICcuLi8uLi9jb25zdGFudHMuanMnO1xyXG5cclxuLyoqXHJcbiAqIERlZmF1bHQgc29ydGluZyBmdW5jdGlvbiBmb3Igb3BhcXVlIHJlbmRlciBpdGVtcy5cclxuICpcclxuICogQHByaXZhdGVcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBhIC0gVGhlIGZpcnN0IHJlbmRlciBpdGVtLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gYiAtIFRoZSBzZWNvbmQgcmVuZGVyIGl0ZW0uXHJcbiAqIEByZXR1cm4ge251bWJlcn0gQSBudW1lcmljIHZhbHVlIHdoaWNoIGRlZmluZXMgdGhlIHNvcnQgb3JkZXIuXHJcbiAqL1xyXG5mdW5jdGlvbiBwYWludGVyU29ydFN0YWJsZSggYSwgYiApIHtcclxuXHJcblx0aWYgKCBhLmdyb3VwT3JkZXIgIT09IGIuZ3JvdXBPcmRlciApIHtcclxuXHJcblx0XHRyZXR1cm4gYS5ncm91cE9yZGVyIC0gYi5ncm91cE9yZGVyO1xyXG5cclxuXHR9IGVsc2UgaWYgKCBhLnJlbmRlck9yZGVyICE9PSBiLnJlbmRlck9yZGVyICkge1xyXG5cclxuXHRcdHJldHVybiBhLnJlbmRlck9yZGVyIC0gYi5yZW5kZXJPcmRlcjtcclxuXHJcblx0fSBlbHNlIGlmICggYS5tYXRlcmlhbC5pZCAhPT0gYi5tYXRlcmlhbC5pZCApIHtcclxuXHJcblx0XHRyZXR1cm4gYS5tYXRlcmlhbC5pZCAtIGIubWF0ZXJpYWwuaWQ7XHJcblxyXG5cdH0gZWxzZSBpZiAoIGEueiAhPT0gYi56ICkge1xyXG5cclxuXHRcdHJldHVybiBhLnogLSBiLno7XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0cmV0dXJuIGEuaWQgLSBiLmlkO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogRGVmYXVsdCBzb3J0aW5nIGZ1bmN0aW9uIGZvciB0cmFuc3BhcmVudCByZW5kZXIgaXRlbXMuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge09iamVjdH0gYSAtIFRoZSBmaXJzdCByZW5kZXIgaXRlbS5cclxuICogQHBhcmFtIHtPYmplY3R9IGIgLSBUaGUgc2Vjb25kIHJlbmRlciBpdGVtLlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IEEgbnVtZXJpYyB2YWx1ZSB3aGljaCBkZWZpbmVzIHRoZSBzb3J0IG9yZGVyLlxyXG4gKi9cclxuZnVuY3Rpb24gcmV2ZXJzZVBhaW50ZXJTb3J0U3RhYmxlKCBhLCBiICkge1xyXG5cclxuXHRpZiAoIGEuZ3JvdXBPcmRlciAhPT0gYi5ncm91cE9yZGVyICkge1xyXG5cclxuXHRcdHJldHVybiBhLmdyb3VwT3JkZXIgLSBiLmdyb3VwT3JkZXI7XHJcblxyXG5cdH0gZWxzZSBpZiAoIGEucmVuZGVyT3JkZXIgIT09IGIucmVuZGVyT3JkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIGEucmVuZGVyT3JkZXIgLSBiLnJlbmRlck9yZGVyO1xyXG5cclxuXHR9IGVsc2UgaWYgKCBhLnogIT09IGIueiApIHtcclxuXHJcblx0XHRyZXR1cm4gYi56IC0gYS56O1xyXG5cclxuXHR9IGVsc2Uge1xyXG5cclxuXHRcdHJldHVybiBhLmlkIC0gYi5pZDtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBnaXZlbiB0cmFuc3BhcmVudCBtYXRlcmlhbCByZXF1aXJlcyBhIGRvdWJsZSBwYXNzLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtNYXRlcmlhbH0gbWF0ZXJpYWwgLSBUaGUgdHJhbnNwYXJlbnQgbWF0ZXJpYWwuXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGdpdmVuIG1hdGVyaWFsIHJlcXVpcmVzIGEgZG91YmxlIHBhc3Mgb3Igbm90LlxyXG4gKi9cclxuZnVuY3Rpb24gbmVlZHNEb3VibGVQYXNzKCBtYXRlcmlhbCApIHtcclxuXHJcblx0Y29uc3QgaGFzVHJhbnNtaXNzaW9uID0gbWF0ZXJpYWwudHJhbnNtaXNzaW9uID4gMCB8fCBtYXRlcmlhbC50cmFuc21pc3Npb25Ob2RlO1xyXG5cclxuXHRyZXR1cm4gaGFzVHJhbnNtaXNzaW9uICYmIG1hdGVyaWFsLnNpZGUgPT09IERvdWJsZVNpZGUgJiYgbWF0ZXJpYWwuZm9yY2VTaW5nbGVQYXNzID09PSBmYWxzZTtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBXaGVuIHRoZSByZW5kZXJlciBhbmFseXplcyB0aGUgc2NlbmUgYXQgdGhlIGJlZ2lubmluZyBvZiBhIHJlbmRlciBjYWxsLFxyXG4gKiBpdCBzdG9yZXMgM0Qgb2JqZWN0IGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcgaW4gcmVuZGVyIGxpc3RzLiBEZXBlbmRpbmcgb24gdGhlXHJcbiAqIHByb3BlcnRpZXMgb2YgYSAzRCBvYmplY3RzIChsaWtlIHRoZWlyIHRyYW5zZm9ybWF0aW9uIG9yIG1hdGVyaWFsIHN0YXRlKSwgdGhlXHJcbiAqIG9iamVjdHMgYXJlIG1haW50YWluZWQgaW4gb3JkZXJlZCBsaXN0cyBmb3IgdGhlIGFjdHVhbCByZW5kZXJpbmcuXHJcbiAqXHJcbiAqIFJlbmRlciBsaXN0cyBhcmUgdW5pcXVlIHBlciBzY2VuZSBhbmQgY2FtZXJhIGNvbWJpbmF0aW9uLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAYXVnbWVudHMgUGlwZWxpbmVcclxuICovXHJcbmNsYXNzIFJlbmRlckxpc3Qge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgcmVuZGVyIGxpc3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0xpZ2h0aW5nfSBsaWdodGluZyAtIFRoZSBsaWdodGluZyBtYW5hZ2VtZW50IGNvbXBvbmVudC5cclxuXHQgKiBAcGFyYW0ge1NjZW5lfSBzY2VuZSAtIFRoZSBzY2VuZS5cclxuXHQgKiBAcGFyYW0ge0NhbWVyYX0gY2FtZXJhIC0gVGhlIGNhbWVyYSB0aGUgc2NlbmUgaXMgcmVuZGVyZWQgd2l0aC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbGlnaHRpbmcsIHNjZW5lLCBjYW1lcmEgKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiAzRCBvYmplY3RzIGFyZSB0cmFuc2Zvcm1lZCBpbnRvIHJlbmRlciBpdGVtcyBhbmQgc3RvcmVkIGluIHRoaXMgYXJyYXkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PE9iamVjdD59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVuZGVySXRlbXMgPSBbXTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjdXJyZW50IHJlbmRlciBpdGVtcyBpbmRleC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJlbmRlckl0ZW1zSW5kZXggPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBsaXN0IHdpdGggb3BhcXVlIHJlbmRlciBpdGVtcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8T2JqZWN0Pn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5vcGFxdWUgPSBbXTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgbGlzdCB3aXRoIHRyYW5zcGFyZW50IHJlbmRlciBpdGVtcyB3aGljaCByZXF1aXJlXHJcblx0XHQgKiBkb3VibGUgcGFzcyByZW5kZXJpbmcgKGUuZy4gdHJhbnNtaXNzaXZlIG9iamVjdHMpLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxPYmplY3Q+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRyYW5zcGFyZW50RG91YmxlUGFzcyA9IFtdO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBsaXN0IHdpdGggdHJhbnNwYXJlbnQgcmVuZGVyIGl0ZW1zLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxPYmplY3Q+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRyYW5zcGFyZW50ID0gW107XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGxpc3Qgd2l0aCB0cmFuc3BhcmVudCByZW5kZXIgYnVuZGxlIGRhdGEuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PE9iamVjdD59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYnVuZGxlcyA9IFtdO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJlbmRlciBsaXN0J3MgbGlnaHRzIG5vZGUuIFRoaXMgbm9kZSBpcyBsYXRlclxyXG5cdFx0ICogcmVsZXZhbnQgZm9yIHRoZSBhY3R1YWwgYW5hbHl0aWNhbCBsaWdodCBub2RlcyB3aGljaFxyXG5cdFx0ICogY29tcHV0ZSB0aGUgc2NlbmUncyBsaWdodGluZyBpbiB0aGUgc2hhZGVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtMaWdodHNOb2RlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxpZ2h0c05vZGUgPSBsaWdodGluZy5nZXROb2RlKCBzY2VuZSwgY2FtZXJhICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc2NlbmUncyBsaWdodHMgc3RvcmVkIGluIGFuIGFycmF5LiBUaGlzIGFycmF5XHJcblx0XHQgKiBpcyB1c2VkIHRvIHNldHVwIHRoZSBsaWdodHMgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8TGlnaHQ+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxpZ2h0c0FycmF5ID0gW107XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc2NlbmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1NjZW5lfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNjZW5lID0gc2NlbmU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY2FtZXJhIHRoZSBzY2VuZSBpcyByZW5kZXJlZCB3aXRoLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtDYW1lcmF9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2FtZXJhID0gY2FtZXJhO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSG93IG1hbnkgb2JqZWN0cyBwZXJmb3JtIG9jY2x1c2lvbiBxdWVyeSB0ZXN0cy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm9jY2x1c2lvblF1ZXJ5Q291bnQgPSAwO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCByaWdodCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgcmVuZGVyIGNhbGxcclxuXHQgKiBiZWZvcmUgdGhlIHNjZW5lIGlzIGFuYWx5emVkLiBJdCBwcmVwYXJlcyB0aGUgaW50ZXJuYWwgZGF0YVxyXG5cdCAqIHN0cnVjdHVyZXMgZm9yIHRoZSB1cGNvbWluZyByZW5kZXIgbGlzdHMgZ2VuZXJhdGlvbi5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1JlbmRlckxpc3R9IEEgcmVmZXJlbmNlIHRvIHRoaXMgcmVuZGVyIGxpc3QuXHJcblx0ICovXHJcblx0YmVnaW4oKSB7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJJdGVtc0luZGV4ID0gMDtcclxuXHJcblx0XHR0aGlzLm9wYXF1ZS5sZW5ndGggPSAwO1xyXG5cdFx0dGhpcy50cmFuc3BhcmVudERvdWJsZVBhc3MubGVuZ3RoID0gMDtcclxuXHRcdHRoaXMudHJhbnNwYXJlbnQubGVuZ3RoID0gMDtcclxuXHRcdHRoaXMuYnVuZGxlcy5sZW5ndGggPSAwO1xyXG5cclxuXHRcdHRoaXMubGlnaHRzQXJyYXkubGVuZ3RoID0gMDtcclxuXHJcblx0XHR0aGlzLm9jY2x1c2lvblF1ZXJ5Q291bnQgPSAwO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSByZW5kZXIgaXRlbSBmb3IgdGhlIGdpdmluZyByZW5kZXIgaXRlbSBzdGF0ZS4gVGhlIHN0YXRlIGlzIGRlZmluZWRcclxuXHQgKiBieSBhIHNlcmllcyBvZiBvYmplY3QtcmVsYXRlZCBwYXJhbWV0ZXJzLlxyXG5cdCAqXHJcblx0ICogVGhlIG1ldGhvZCBhdm9pZHMgb2JqZWN0IGNyZWF0aW9uIGJ5IGhvbGRpbmcgcmVuZGVyIGl0ZW1zIGFuZCByZXVzaW5nIHRoZW0gaW5cclxuXHQgKiBzdWJzZXF1ZW50IHJlbmRlciBjYWxscyAoanVzdCB3aXRoIGRpZmZlcmVudCBwcm9wZXJ0eSB2YWx1ZXMpLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3QzRH0gb2JqZWN0IC0gVGhlIDNEIG9iamVjdC5cclxuXHQgKiBAcGFyYW0ge0J1ZmZlckdlb21ldHJ5fSBnZW9tZXRyeSAtIFRoZSAzRCBvYmplY3QncyBnZW9tZXRyeS5cclxuXHQgKiBAcGFyYW0ge01hdGVyaWFsfSBtYXRlcmlhbCAtIFRoZSAzRCBvYmplY3QncyBtYXRlcmlhbC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZ3JvdXBPcmRlciAtIFRoZSBjdXJyZW50IGdyb3VwIG9yZGVyLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB6IC0gVGggM0Qgb2JqZWN0J3MgZGVwdGggdmFsdWUgKHogdmFsdWUgaW4gY2xpcCBzcGFjZSkuXHJcblx0ICogQHBhcmFtIHs/bnVtYmVyfSBncm91cCAtIHs/T2JqZWN0fSBncm91cCAtIE9ubHkgcmVsZXZhbnQgZm9yIG9iamVjdHMgdXNpbmcgbXVsdGlwbGUgbWF0ZXJpYWxzLiBUaGlzIHJlcHJlc2VudHMgYSBncm91cCBlbnRyeSBmcm9tIHRoZSByZXNwZWN0aXZlIGBCdWZmZXJHZW9tZXRyeWAuXHJcblx0ICogQHBhcmFtIHtDbGlwcGluZ0NvbnRleHR9IGNsaXBwaW5nQ29udGV4dCAtIFRoZSBjdXJyZW50IGNsaXBwaW5nIGNvbnRleHQuXHJcblx0ICogQHJldHVybiB7T2JqZWN0fSBUaGUgcmVuZGVyIGl0ZW0uXHJcblx0ICovXHJcblx0Z2V0TmV4dFJlbmRlckl0ZW0oIG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cE9yZGVyLCB6LCBncm91cCwgY2xpcHBpbmdDb250ZXh0ICkge1xyXG5cclxuXHRcdGxldCByZW5kZXJJdGVtID0gdGhpcy5yZW5kZXJJdGVtc1sgdGhpcy5yZW5kZXJJdGVtc0luZGV4IF07XHJcblxyXG5cdFx0aWYgKCByZW5kZXJJdGVtID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRyZW5kZXJJdGVtID0ge1xyXG5cdFx0XHRcdGlkOiBvYmplY3QuaWQsXHJcblx0XHRcdFx0b2JqZWN0OiBvYmplY3QsXHJcblx0XHRcdFx0Z2VvbWV0cnk6IGdlb21ldHJ5LFxyXG5cdFx0XHRcdG1hdGVyaWFsOiBtYXRlcmlhbCxcclxuXHRcdFx0XHRncm91cE9yZGVyOiBncm91cE9yZGVyLFxyXG5cdFx0XHRcdHJlbmRlck9yZGVyOiBvYmplY3QucmVuZGVyT3JkZXIsXHJcblx0XHRcdFx0ejogeixcclxuXHRcdFx0XHRncm91cDogZ3JvdXAsXHJcblx0XHRcdFx0Y2xpcHBpbmdDb250ZXh0OiBjbGlwcGluZ0NvbnRleHRcclxuXHRcdFx0fTtcclxuXHJcblx0XHRcdHRoaXMucmVuZGVySXRlbXNbIHRoaXMucmVuZGVySXRlbXNJbmRleCBdID0gcmVuZGVySXRlbTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0cmVuZGVySXRlbS5pZCA9IG9iamVjdC5pZDtcclxuXHRcdFx0cmVuZGVySXRlbS5vYmplY3QgPSBvYmplY3Q7XHJcblx0XHRcdHJlbmRlckl0ZW0uZ2VvbWV0cnkgPSBnZW9tZXRyeTtcclxuXHRcdFx0cmVuZGVySXRlbS5tYXRlcmlhbCA9IG1hdGVyaWFsO1xyXG5cdFx0XHRyZW5kZXJJdGVtLmdyb3VwT3JkZXIgPSBncm91cE9yZGVyO1xyXG5cdFx0XHRyZW5kZXJJdGVtLnJlbmRlck9yZGVyID0gb2JqZWN0LnJlbmRlck9yZGVyO1xyXG5cdFx0XHRyZW5kZXJJdGVtLnogPSB6O1xyXG5cdFx0XHRyZW5kZXJJdGVtLmdyb3VwID0gZ3JvdXA7XHJcblx0XHRcdHJlbmRlckl0ZW0uY2xpcHBpbmdDb250ZXh0ID0gY2xpcHBpbmdDb250ZXh0O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnJlbmRlckl0ZW1zSW5kZXggKys7XHJcblxyXG5cdFx0cmV0dXJuIHJlbmRlckl0ZW07XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUHVzaGVzIHRoZSBnaXZlbiBvYmplY3QgYXMgYSByZW5kZXIgaXRlbSB0byB0aGUgaW50ZXJuYWwgcmVuZGVyIGxpc3RzLlxyXG5cdCAqIFRoZSBzZWxlY3RlZCBsaXN0cyBkZXBlbmQgb24gdGhlIG9iamVjdCBwcm9wZXJ0aWVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3QzRH0gb2JqZWN0IC0gVGhlIDNEIG9iamVjdC5cclxuXHQgKiBAcGFyYW0ge0J1ZmZlckdlb21ldHJ5fSBnZW9tZXRyeSAtIFRoZSAzRCBvYmplY3QncyBnZW9tZXRyeS5cclxuXHQgKiBAcGFyYW0ge01hdGVyaWFsfSBtYXRlcmlhbCAtIFRoZSAzRCBvYmplY3QncyBtYXRlcmlhbC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZ3JvdXBPcmRlciAtIFRoZSBjdXJyZW50IGdyb3VwIG9yZGVyLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB6IC0gVGggM0Qgb2JqZWN0J3MgZGVwdGggdmFsdWUgKHogdmFsdWUgaW4gY2xpcCBzcGFjZSkuXHJcblx0ICogQHBhcmFtIHs/bnVtYmVyfSBncm91cCAtIHs/T2JqZWN0fSBncm91cCAtIE9ubHkgcmVsZXZhbnQgZm9yIG9iamVjdHMgdXNpbmcgbXVsdGlwbGUgbWF0ZXJpYWxzLiBUaGlzIHJlcHJlc2VudHMgYSBncm91cCBlbnRyeSBmcm9tIHRoZSByZXNwZWN0aXZlIGBCdWZmZXJHZW9tZXRyeWAuXHJcblx0ICogQHBhcmFtIHtDbGlwcGluZ0NvbnRleHR9IGNsaXBwaW5nQ29udGV4dCAtIFRoZSBjdXJyZW50IGNsaXBwaW5nIGNvbnRleHQuXHJcblx0ICovXHJcblx0cHVzaCggb2JqZWN0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwT3JkZXIsIHosIGdyb3VwLCBjbGlwcGluZ0NvbnRleHQgKSB7XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVySXRlbSA9IHRoaXMuZ2V0TmV4dFJlbmRlckl0ZW0oIG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cE9yZGVyLCB6LCBncm91cCwgY2xpcHBpbmdDb250ZXh0ICk7XHJcblxyXG5cdFx0aWYgKCBvYmplY3Qub2NjbHVzaW9uVGVzdCA9PT0gdHJ1ZSApIHRoaXMub2NjbHVzaW9uUXVlcnlDb3VudCArKztcclxuXHJcblx0XHRpZiAoIG1hdGVyaWFsLnRyYW5zcGFyZW50ID09PSB0cnVlIHx8IG1hdGVyaWFsLnRyYW5zbWlzc2lvbiA+IDAgKSB7XHJcblxyXG5cdFx0XHRpZiAoIG5lZWRzRG91YmxlUGFzcyggbWF0ZXJpYWwgKSApIHRoaXMudHJhbnNwYXJlbnREb3VibGVQYXNzLnB1c2goIHJlbmRlckl0ZW0gKTtcclxuXHJcblx0XHRcdHRoaXMudHJhbnNwYXJlbnQucHVzaCggcmVuZGVySXRlbSApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR0aGlzLm9wYXF1ZS5wdXNoKCByZW5kZXJJdGVtICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEluc2VydHMgdGhlIGdpdmVuIG9iamVjdCBhcyBhIHJlbmRlciBpdGVtIGF0IHRoZSBzdGFydCBvZiB0aGUgaW50ZXJuYWwgcmVuZGVyIGxpc3RzLlxyXG5cdCAqIFRoZSBzZWxlY3RlZCBsaXN0cyBkZXBlbmQgb24gdGhlIG9iamVjdCBwcm9wZXJ0aWVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3QzRH0gb2JqZWN0IC0gVGhlIDNEIG9iamVjdC5cclxuXHQgKiBAcGFyYW0ge0J1ZmZlckdlb21ldHJ5fSBnZW9tZXRyeSAtIFRoZSAzRCBvYmplY3QncyBnZW9tZXRyeS5cclxuXHQgKiBAcGFyYW0ge01hdGVyaWFsfSBtYXRlcmlhbCAtIFRoZSAzRCBvYmplY3QncyBtYXRlcmlhbC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZ3JvdXBPcmRlciAtIFRoZSBjdXJyZW50IGdyb3VwIG9yZGVyLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB6IC0gVGggM0Qgb2JqZWN0J3MgZGVwdGggdmFsdWUgKHogdmFsdWUgaW4gY2xpcCBzcGFjZSkuXHJcblx0ICogQHBhcmFtIHs/bnVtYmVyfSBncm91cCAtIHs/T2JqZWN0fSBncm91cCAtIE9ubHkgcmVsZXZhbnQgZm9yIG9iamVjdHMgdXNpbmcgbXVsdGlwbGUgbWF0ZXJpYWxzLiBUaGlzIHJlcHJlc2VudHMgYSBncm91cCBlbnRyeSBmcm9tIHRoZSByZXNwZWN0aXZlIGBCdWZmZXJHZW9tZXRyeWAuXHJcblx0ICogQHBhcmFtIHtDbGlwcGluZ0NvbnRleHR9IGNsaXBwaW5nQ29udGV4dCAtIFRoZSBjdXJyZW50IGNsaXBwaW5nIGNvbnRleHQuXHJcblx0ICovXHJcblx0dW5zaGlmdCggb2JqZWN0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwT3JkZXIsIHosIGdyb3VwLCBjbGlwcGluZ0NvbnRleHQgKSB7XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVySXRlbSA9IHRoaXMuZ2V0TmV4dFJlbmRlckl0ZW0oIG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cE9yZGVyLCB6LCBncm91cCwgY2xpcHBpbmdDb250ZXh0ICk7XHJcblxyXG5cdFx0aWYgKCBtYXRlcmlhbC50cmFuc3BhcmVudCA9PT0gdHJ1ZSB8fCBtYXRlcmlhbC50cmFuc21pc3Npb24gPiAwICkge1xyXG5cclxuXHRcdFx0aWYgKCBuZWVkc0RvdWJsZVBhc3MoIG1hdGVyaWFsICkgKSB0aGlzLnRyYW5zcGFyZW50RG91YmxlUGFzcy51bnNoaWZ0KCByZW5kZXJJdGVtICk7XHJcblxyXG5cdFx0XHR0aGlzLnRyYW5zcGFyZW50LnVuc2hpZnQoIHJlbmRlckl0ZW0gKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGhpcy5vcGFxdWUudW5zaGlmdCggcmVuZGVySXRlbSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQdXNoZXMgcmVuZGVyIGJ1bmRsZSBncm91cCBkYXRhIGludG8gdGhlIHJlbmRlciBsaXN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGdyb3VwIC0gQnVuZGxlIGdyb3VwIGRhdGEuXHJcblx0ICovXHJcblx0cHVzaEJ1bmRsZSggZ3JvdXAgKSB7XHJcblxyXG5cdFx0dGhpcy5idW5kbGVzLnB1c2goIGdyb3VwICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUHVzaGVzIGEgbGlnaHQgaW50byB0aGUgcmVuZGVyIGxpc3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0xpZ2h0fSBsaWdodCAtIFRoZSBsaWdodC5cclxuXHQgKi9cclxuXHRwdXNoTGlnaHQoIGxpZ2h0ICkge1xyXG5cclxuXHRcdHRoaXMubGlnaHRzQXJyYXkucHVzaCggbGlnaHQgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTb3J0cyB0aGUgaW50ZXJuYWwgcmVuZGVyIGxpc3RzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHs/ZnVuY3Rpb24oYW55LCBhbnkpOiBudW1iZXJ9IGN1c3RvbU9wYXF1ZVNvcnQgLSBBIGN1c3RvbSBzb3J0IGZ1bmN0aW9uIGZvciBvcGFxdWUgb2JqZWN0cy5cclxuXHQgKiBAcGFyYW0gez9mdW5jdGlvbihhbnksIGFueSk6IG51bWJlcn0gY3VzdG9tVHJhbnNwYXJlbnRTb3J0IC0gIEEgY3VzdG9tIHNvcnQgZnVuY3Rpb24gZm9yIHRyYW5zcGFyZW50IG9iamVjdHMuXHJcblx0ICovXHJcblx0c29ydCggY3VzdG9tT3BhcXVlU29ydCwgY3VzdG9tVHJhbnNwYXJlbnRTb3J0ICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5vcGFxdWUubGVuZ3RoID4gMSApIHRoaXMub3BhcXVlLnNvcnQoIGN1c3RvbU9wYXF1ZVNvcnQgfHwgcGFpbnRlclNvcnRTdGFibGUgKTtcclxuXHRcdGlmICggdGhpcy50cmFuc3BhcmVudERvdWJsZVBhc3MubGVuZ3RoID4gMSApIHRoaXMudHJhbnNwYXJlbnREb3VibGVQYXNzLnNvcnQoIGN1c3RvbVRyYW5zcGFyZW50U29ydCB8fCByZXZlcnNlUGFpbnRlclNvcnRTdGFibGUgKTtcclxuXHRcdGlmICggdGhpcy50cmFuc3BhcmVudC5sZW5ndGggPiAxICkgdGhpcy50cmFuc3BhcmVudC5zb3J0KCBjdXN0b21UcmFuc3BhcmVudFNvcnQgfHwgcmV2ZXJzZVBhaW50ZXJTb3J0U3RhYmxlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgcGVyZm9ybXMgZmluYWxpemluZyB0YXNrcyByaWdodCBhZnRlciB0aGUgcmVuZGVyIGxpc3RzXHJcblx0ICogaGF2ZSBiZWVuIGdlbmVyYXRlZC5cclxuXHQgKi9cclxuXHRmaW5pc2goKSB7XHJcblxyXG5cdFx0Ly8gdXBkYXRlIGxpZ2h0c1xyXG5cclxuXHRcdHRoaXMubGlnaHRzTm9kZS5zZXRMaWdodHMoIHRoaXMubGlnaHRzQXJyYXkgKTtcclxuXHJcblx0XHQvLyBDbGVhciByZWZlcmVuY2VzIGZyb20gaW5hY3RpdmUgcmVuZGVySXRlbXMgaW4gdGhlIGxpc3RcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IHRoaXMucmVuZGVySXRlbXNJbmRleCwgaWwgPSB0aGlzLnJlbmRlckl0ZW1zLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgcmVuZGVySXRlbSA9IHRoaXMucmVuZGVySXRlbXNbIGkgXTtcclxuXHJcblx0XHRcdGlmICggcmVuZGVySXRlbS5pZCA9PT0gbnVsbCApIGJyZWFrO1xyXG5cclxuXHRcdFx0cmVuZGVySXRlbS5pZCA9IG51bGw7XHJcblx0XHRcdHJlbmRlckl0ZW0ub2JqZWN0ID0gbnVsbDtcclxuXHRcdFx0cmVuZGVySXRlbS5nZW9tZXRyeSA9IG51bGw7XHJcblx0XHRcdHJlbmRlckl0ZW0ubWF0ZXJpYWwgPSBudWxsO1xyXG5cdFx0XHRyZW5kZXJJdGVtLmdyb3VwT3JkZXIgPSBudWxsO1xyXG5cdFx0XHRyZW5kZXJJdGVtLnJlbmRlck9yZGVyID0gbnVsbDtcclxuXHRcdFx0cmVuZGVySXRlbS56ID0gbnVsbDtcclxuXHRcdFx0cmVuZGVySXRlbS5ncm91cCA9IG51bGw7XHJcblx0XHRcdHJlbmRlckl0ZW0uY2xpcHBpbmdDb250ZXh0ID0gbnVsbDtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFJlbmRlckxpc3Q7XHJcbiIsImltcG9ydCBDaGFpbk1hcCBmcm9tICcuL0NoYWluTWFwLmpzJztcclxuaW1wb3J0IFJlbmRlckxpc3QgZnJvbSAnLi9SZW5kZXJMaXN0LmpzJztcclxuXHJcbmNvbnN0IF9jaGFpbktleXMgPSBbXTtcclxuXHJcbi8qKlxyXG4gKiBUaGlzIHJlbmRlcmVyIG1vZHVsZSBtYW5hZ2VzIHRoZSByZW5kZXIgbGlzdHMgd2hpY2ggYXJlIHVuaXF1ZVxyXG4gKiBwZXIgc2NlbmUgYW5kIGNhbWVyYSBjb21iaW5hdGlvbi5cclxuICpcclxuICogQHByaXZhdGVcclxuICovXHJcbmNsYXNzIFJlbmRlckxpc3RzIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIHJlbmRlciBsaXN0cyBtYW5hZ2VtZW50IGNvbXBvbmVudC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TGlnaHRpbmd9IGxpZ2h0aW5nIC0gVGhlIGxpZ2h0aW5nIG1hbmFnZW1lbnQgY29tcG9uZW50LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBsaWdodGluZyApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBsaWdodGluZyBtYW5hZ2VtZW50IGNvbXBvbmVudC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7TGlnaHRpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGlnaHRpbmcgPSBsaWdodGluZztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBpbnRlcm5hbCBjaGFpbiBtYXAgd2hpY2ggaG9sZHMgdGhlIHJlbmRlciBsaXN0cy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Q2hhaW5NYXB9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGlzdHMgPSBuZXcgQ2hhaW5NYXAoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgcmVuZGVyIGxpc3QgZm9yIHRoZSBnaXZlbiBzY2VuZSBhbmQgY2FtZXJhLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTY2VuZX0gc2NlbmUgLSBUaGUgc2NlbmUuXHJcblx0ICogQHBhcmFtIHtDYW1lcmF9IGNhbWVyYSAtIFRoZSBjYW1lcmEuXHJcblx0ICogQHJldHVybiB7UmVuZGVyTGlzdH0gVGhlIHJlbmRlciBsaXN0LlxyXG5cdCAqL1xyXG5cdGdldCggc2NlbmUsIGNhbWVyYSApIHtcclxuXHJcblx0XHRjb25zdCBsaXN0cyA9IHRoaXMubGlzdHM7XHJcblxyXG5cdFx0X2NoYWluS2V5c1sgMCBdID0gc2NlbmU7XHJcblx0XHRfY2hhaW5LZXlzWyAxIF0gPSBjYW1lcmE7XHJcblxyXG5cdFx0bGV0IGxpc3QgPSBsaXN0cy5nZXQoIF9jaGFpbktleXMgKTtcclxuXHJcblx0XHRpZiAoIGxpc3QgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGxpc3QgPSBuZXcgUmVuZGVyTGlzdCggdGhpcy5saWdodGluZywgc2NlbmUsIGNhbWVyYSApO1xyXG5cdFx0XHRsaXN0cy5zZXQoIF9jaGFpbktleXMsIGxpc3QgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0X2NoYWluS2V5cy5sZW5ndGggPSAwO1xyXG5cclxuXHRcdHJldHVybiBsaXN0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZyZWVzIGFsbCBpbnRlcm5hbCByZXNvdXJjZXMuXHJcblx0ICovXHJcblx0ZGlzcG9zZSgpIHtcclxuXHJcblx0XHR0aGlzLmxpc3RzID0gbmV3IENoYWluTWFwKCk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFJlbmRlckxpc3RzO1xyXG4iLCJpbXBvcnQgeyBWZWN0b3I0IH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3I0LmpzJztcclxuaW1wb3J0IHsgaGFzaEFycmF5IH0gZnJvbSAnLi4vLi4vbm9kZXMvY29yZS9Ob2RlVXRpbHMuanMnO1xyXG5cclxubGV0IF9pZCA9IDA7XHJcblxyXG4vKipcclxuICogQW55IHJlbmRlciBvciBjb21wdXRlIGNvbW1hbmQgaXMgZXhlY3V0ZWQgaW4gYSBzcGVjaWZpYyBjb250ZXh0IHRoYXQgZGVmaW5lc1xyXG4gKiB0aGUgc3RhdGUgb2YgdGhlIHJlbmRlcmVyIGFuZCBpdHMgYmFja2VuZC4gVHlwaWNhbCBleGFtcGxlcyBmb3Igc3VjaCBjb250ZXh0XHJcbiAqIGRhdGEgYXJlIHRoZSBjdXJyZW50IGNsZWFyIHZhbHVlcyBvciBkYXRhIGZyb20gdGhlIGFjdGl2ZSBmcmFtZWJ1ZmZlci4gVGhpc1xyXG4gKiBtb2R1bGUgaXMgdXNlZCB0byByZXByZXNlbnQgdGhlc2UgY29udGV4dHMgYXMgb2JqZWN0cy5cclxuICpcclxuICogQHByaXZhdGVcclxuICovXHJcbmNsYXNzIFJlbmRlckNvbnRleHQge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHJlbmRlciBjb250ZXh0LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNvbnRleHQncyBJRC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlkID0gX2lkICsrO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgY3VycmVudCBhY3RpdmUgZnJhbWVidWZmZXIgaGFzIGEgY29sb3IgYXR0YWNobWVudC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb2xvciA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSBjb2xvciBhdHRhY2htZW50IHNob3VsZCBiZSBjbGVhcmVkIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jbGVhckNvbG9yID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjbGVhciBjb2xvciB2YWx1ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNsZWFyQ29sb3JWYWx1ZSA9IHsgcjogMCwgZzogMCwgYjogMCwgYTogMSB9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgY3VycmVudCBhY3RpdmUgZnJhbWVidWZmZXIgaGFzIGEgZGVwdGggYXR0YWNobWVudC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kZXB0aCA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSBkZXB0aCBhdHRhY2htZW50IHNob3VsZCBiZSBjbGVhcmVkIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jbGVhckRlcHRoID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjbGVhciBkZXB0aCB2YWx1ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNsZWFyRGVwdGhWYWx1ZSA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSBjdXJyZW50IGFjdGl2ZSBmcmFtZWJ1ZmZlciBoYXMgYSBzdGVuY2lsIGF0dGFjaG1lbnQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnN0ZW5jaWwgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIHN0ZW5jaWwgYXR0YWNobWVudCBzaG91bGQgYmUgY2xlYXJlZCBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2xlYXJTdGVuY2lsID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjbGVhciBzdGVuY2lsIHZhbHVlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2xlYXJTdGVuY2lsVmFsdWUgPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQnkgZGVmYXVsdCB0aGUgdmlld3BvcnQgZW5jbG9zZXMgdGhlIGVudGlyZSBmcmFtZWJ1ZmZlciBJZiBhIHNtYWxsZXJcclxuXHRcdCAqIHZpZXdwb3J0IGlzIG1hbnVhbGx5IGRlZmluZWQsIHRoaXMgcHJvcGVydHkgaXMgdG8gYHRydWVgIGJ5IHRoZSByZW5kZXJlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudmlld3BvcnQgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB2aWV3cG9ydCB2YWx1ZS4gVGhpcyB2YWx1ZSBpcyBpbiBwaHlzaWNhbCBwaXhlbHMgbWVhbmluZyBpdCBpbmNvcnBvcmF0ZXNcclxuXHRcdCAqIHRoZSByZW5kZXJlcidzIHBpeGVsIHJhdGlvLiBUaGUgdmlld3BvcnQgcHJvcGVydHkgb2YgcmVuZGVyIHRhcmdldHMgb3JcclxuXHRcdCAqIHRoZSByZW5kZXJlciBpcyBpbiBsb2dpY2FsIHBpeGVscy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yNH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52aWV3cG9ydFZhbHVlID0gbmV3IFZlY3RvcjQoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZW4gdGhlIHNjaXNzb3IgdGVzdCBpcyBhY3RpdmUgYW5kIHNjaXNzb3IgcmVjdGFuZ2xlIHNtYWxsZXIgdGhhbiB0aGVcclxuXHRcdCAqIGZyYW1lYnVmZmVycyBkaW1lbnNpb25zLCB0aGlzIHByb3BlcnR5IGlzIHRvIGB0cnVlYCBieSB0aGUgcmVuZGVyZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNjaXNzb3IgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBzY2lzc29yIHJlY3RhbmdsZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yNH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zY2lzc29yVmFsdWUgPSBuZXcgVmVjdG9yNCgpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGFjdGl2ZSByZW5kZXIgdGFyZ2V0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/UmVuZGVyVGFyZ2V0fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJlbmRlclRhcmdldCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdGV4dHVyZXMgb2YgdGhlIGFjdGl2ZSByZW5kZXIgdGFyZ2V0LlxyXG5cdFx0ICogYG51bGxgIHdoZW4gbm8gcmVuZGVyIHRhcmdldCBpcyBzZXQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9BcnJheTxUZXh0dXJlPn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50ZXh0dXJlcyA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZGVwdGggdGV4dHVyZSBvZiB0aGUgYWN0aXZlIHJlbmRlciB0YXJnZXQuXHJcblx0XHQgKiBgbnVsbGAgd2hlbiBubyByZW5kZXIgdGFyZ2V0IGlzIHNldC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P0RlcHRoVGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kZXB0aFRleHR1cmUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGFjdGl2ZSBjdWJlIGZhY2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hY3RpdmVDdWJlRmFjZSA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYWN0aXZlIG1pcG1hcCBsZXZlbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmFjdGl2ZU1pcG1hcExldmVsID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBudW1iZXIgb2YgTVNBQSBzYW1wbGVzLiBUaGlzIHZhbHVlIGlzIGFsd2F5cyBgMWAgd2hlblxyXG5cdFx0ICogTVNBQSBpc24ndCB1c2VkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2FtcGxlQ291bnQgPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGFjdGl2ZSByZW5kZXIgdGFyZ2V0J3Mgd2lkdGggaW4gcGh5c2ljYWwgcGl4ZWxzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMud2lkdGggPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGFjdGl2ZSByZW5kZXIgdGFyZ2V0J3MgaGVpZ2h0IGluIHBoeXNpY2FsIHBpeGVscy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmhlaWdodCA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgb2NjbHVzaW9uIHF1ZXJ5IGNvdW50LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMub2NjbHVzaW9uUXVlcnlDb3VudCA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY3VycmVudCBjbGlwcGluZyBjb250ZXh0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Q2xpcHBpbmdDb250ZXh0fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNsaXBwaW5nQ29udGV4dCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzUmVuZGVyQ29udGV4dCA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgY2FjaGUga2V5IG9mIHRoaXMgcmVuZGVyIGNvbnRleHQuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBjYWNoZSBrZXkuXHJcblx0ICovXHJcblx0Z2V0Q2FjaGVLZXkoKSB7XHJcblxyXG5cdFx0cmV0dXJuIGdldENhY2hlS2V5KCB0aGlzICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb21wdXRlcyBhIGNhY2hlIGtleSBmb3IgdGhlIGdpdmVuIHJlbmRlciBjb250ZXh0LiBUaGlzIGtleVxyXG4gKiBzaG91bGQgaWRlbnRpZnkgdGhlIHJlbmRlciB0YXJnZXQgc3RhdGUgc28gaXQgaXMgcG9zc2libGUgdG9cclxuICogY29uZmlndXJlIHRoZSBjb3JyZWN0IGF0dGFjaG1lbnRzIGluIHRoZSByZXNwZWN0aXZlIGJhY2tlbmQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVuZGVyQ29udGV4dH0gcmVuZGVyQ29udGV4dCAtIFRoZSByZW5kZXIgY29udGV4dC5cclxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgY2FjaGUga2V5LlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldENhY2hlS2V5KCByZW5kZXJDb250ZXh0ICkge1xyXG5cclxuXHRjb25zdCB7IHRleHR1cmVzLCBhY3RpdmVDdWJlRmFjZSB9ID0gcmVuZGVyQ29udGV4dDtcclxuXHJcblx0Y29uc3QgdmFsdWVzID0gWyBhY3RpdmVDdWJlRmFjZSBdO1xyXG5cclxuXHRmb3IgKCBjb25zdCB0ZXh0dXJlIG9mIHRleHR1cmVzICkge1xyXG5cclxuXHRcdHZhbHVlcy5wdXNoKCB0ZXh0dXJlLmlkICk7XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIGhhc2hBcnJheSggdmFsdWVzICk7XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBSZW5kZXJDb250ZXh0O1xyXG4iLCJpbXBvcnQgQ2hhaW5NYXAgZnJvbSAnLi9DaGFpbk1hcC5qcyc7XHJcbmltcG9ydCBSZW5kZXJDb250ZXh0IGZyb20gJy4vUmVuZGVyQ29udGV4dC5qcyc7XHJcbmltcG9ydCB7IFNjZW5lIH0gZnJvbSAnLi4vLi4vc2NlbmVzL1NjZW5lLmpzJztcclxuaW1wb3J0IHsgQ2FtZXJhIH0gZnJvbSAnLi4vLi4vY2FtZXJhcy9DYW1lcmEuanMnO1xyXG5cclxuY29uc3QgX2NoYWluS2V5cyA9IFtdO1xyXG5jb25zdCBfZGVmYXVsdFNjZW5lID0gLypAX19QVVJFX18qLyBuZXcgU2NlbmUoKTtcclxuY29uc3QgX2RlZmF1bHRDYW1lcmEgPSAvKkBfX1BVUkVfXyovIG5ldyBDYW1lcmEoKTtcclxuXHJcbi8qKlxyXG4gKiBUaGlzIG1vZHVsZSBtYW5hZ2VzIHRoZSByZW5kZXIgY29udGV4dHMgb2YgdGhlIHJlbmRlcmVyLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuY2xhc3MgUmVuZGVyQ29udGV4dHMge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHJlbmRlciBjb250ZXh0IG1hbmFnZW1lbnQgY29tcG9uZW50LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBkaWN0aW9uYXJ5IHRoYXQgbWFuYWdlcyByZW5kZXIgY29udGV4dHMgaW4gY2hhaW4gbWFwc1xyXG5cdFx0ICogZm9yIGVhY2ggYXR0YWNobWVudCBzdGF0ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0PHN0cmluZyxDaGFpbk1hcD59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2hhaW5NYXBzID0ge307XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIHJlbmRlciBjb250ZXh0IGZvciB0aGUgZ2l2ZW4gc2NlbmUsIGNhbWVyYSBhbmQgcmVuZGVyIHRhcmdldC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7U2NlbmV9IHNjZW5lIC0gVGhlIHNjZW5lLlxyXG5cdCAqIEBwYXJhbSB7Q2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIHRoYXQgaXMgdXNlZCB0byByZW5kZXIgdGhlIHNjZW5lLlxyXG5cdCAqIEBwYXJhbSB7P1JlbmRlclRhcmdldH0gW3JlbmRlclRhcmdldD1udWxsXSAtIFRoZSBhY3RpdmUgcmVuZGVyIHRhcmdldC5cclxuXHQgKiBAcmV0dXJuIHtSZW5kZXJDb250ZXh0fSBUaGUgcmVuZGVyIGNvbnRleHQuXHJcblx0ICovXHJcblx0Z2V0KCBzY2VuZSwgY2FtZXJhLCByZW5kZXJUYXJnZXQgPSBudWxsICkge1xyXG5cclxuXHRcdF9jaGFpbktleXNbIDAgXSA9IHNjZW5lO1xyXG5cdFx0X2NoYWluS2V5c1sgMSBdID0gY2FtZXJhO1xyXG5cclxuXHRcdGxldCBhdHRhY2htZW50U3RhdGU7XHJcblxyXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRhdHRhY2htZW50U3RhdGUgPSAnZGVmYXVsdCc7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGNvbnN0IGZvcm1hdCA9IHJlbmRlclRhcmdldC50ZXh0dXJlLmZvcm1hdDtcclxuXHRcdFx0Y29uc3QgY291bnQgPSByZW5kZXJUYXJnZXQudGV4dHVyZXMubGVuZ3RoO1xyXG5cclxuXHRcdFx0YXR0YWNobWVudFN0YXRlID0gYCR7IGNvdW50IH06JHsgZm9ybWF0IH06JHsgcmVuZGVyVGFyZ2V0LnNhbXBsZXMgfTokeyByZW5kZXJUYXJnZXQuZGVwdGhCdWZmZXIgfTokeyByZW5kZXJUYXJnZXQuc3RlbmNpbEJ1ZmZlciB9YDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgY2hhaW5NYXAgPSB0aGlzLl9nZXRDaGFpbk1hcCggYXR0YWNobWVudFN0YXRlICk7XHJcblxyXG5cdFx0bGV0IHJlbmRlclN0YXRlID0gY2hhaW5NYXAuZ2V0KCBfY2hhaW5LZXlzICk7XHJcblxyXG5cdFx0aWYgKCByZW5kZXJTdGF0ZSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0cmVuZGVyU3RhdGUgPSBuZXcgUmVuZGVyQ29udGV4dCgpO1xyXG5cclxuXHRcdFx0Y2hhaW5NYXAuc2V0KCBfY2hhaW5LZXlzLCByZW5kZXJTdGF0ZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRfY2hhaW5LZXlzLmxlbmd0aCA9IDA7XHJcblxyXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQgIT09IG51bGwgKSByZW5kZXJTdGF0ZS5zYW1wbGVDb3VudCA9IHJlbmRlclRhcmdldC5zYW1wbGVzID09PSAwID8gMSA6IHJlbmRlclRhcmdldC5zYW1wbGVzO1xyXG5cclxuXHRcdHJldHVybiByZW5kZXJTdGF0ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgcmVuZGVyIGNvbnRleHQgaW50ZW5kZWQgZm9yIGNsZWFyIG9wZXJhdGlvbnMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gez9SZW5kZXJUYXJnZXR9IFtyZW5kZXJUYXJnZXQ9bnVsbF0gLSBUaGUgYWN0aXZlIHJlbmRlciB0YXJnZXQuXHJcblx0ICogQHJldHVybiB7UmVuZGVyQ29udGV4dH0gVGhlIHJlbmRlciBjb250ZXh0LlxyXG5cdCAqL1xyXG5cdGdldEZvckNsZWFyKCByZW5kZXJUYXJnZXQgPSBudWxsICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmdldCggX2RlZmF1bHRTY2VuZSwgX2RlZmF1bHRDYW1lcmEsIHJlbmRlclRhcmdldCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBjaGFpbiBtYXAgZm9yIHRoZSBnaXZlbiBhdHRhY2htZW50IHN0YXRlLlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gYXR0YWNobWVudFN0YXRlIC0gVGhlIGF0dGFjaG1lbnQgc3RhdGUuXHJcblx0ICogQHJldHVybiB7Q2hhaW5NYXB9IFRoZSBjaGFpbiBtYXAuXHJcblx0ICovXHJcblx0X2dldENoYWluTWFwKCBhdHRhY2htZW50U3RhdGUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuY2hhaW5NYXBzWyBhdHRhY2htZW50U3RhdGUgXSB8fCAoIHRoaXMuY2hhaW5NYXBzWyBhdHRhY2htZW50U3RhdGUgXSA9IG5ldyBDaGFpbk1hcCgpICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRnJlZXMgaW50ZXJuYWwgcmVzb3VyY2VzLlxyXG5cdCAqL1xyXG5cdGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0dGhpcy5jaGFpbk1hcHMgPSB7fTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUmVuZGVyQ29udGV4dHM7XHJcbiIsImltcG9ydCBEYXRhTWFwIGZyb20gJy4vRGF0YU1hcC5qcyc7XHJcblxyXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuaW1wb3J0IHsgRGVwdGhUZXh0dXJlIH0gZnJvbSAnLi4vLi4vdGV4dHVyZXMvRGVwdGhUZXh0dXJlLmpzJztcclxuaW1wb3J0IHsgRGVwdGhTdGVuY2lsRm9ybWF0LCBEZXB0aEZvcm1hdCwgVW5zaWduZWRJbnRUeXBlLCBVbnNpZ25lZEludDI0OFR5cGUsIEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nLCBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZywgQ3ViZVJlZmxlY3Rpb25NYXBwaW5nLCBDdWJlUmVmcmFjdGlvbk1hcHBpbmcsIFVuc2lnbmVkQnl0ZVR5cGUgfSBmcm9tICcuLi8uLi9jb25zdGFudHMuanMnO1xyXG5cclxuY29uc3QgX3NpemUgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XHJcblxyXG4vKipcclxuICogVGhpcyBtb2R1bGUgbWFuYWdlcyB0aGUgdGV4dHVyZXMgb2YgdGhlIHJlbmRlcmVyLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAYXVnbWVudHMgRGF0YU1hcFxyXG4gKi9cclxuY2xhc3MgVGV4dHVyZXMgZXh0ZW5kcyBEYXRhTWFwIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB0ZXh0dXJlIG1hbmFnZW1lbnQgY29tcG9uZW50LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcblx0ICogQHBhcmFtIHtCYWNrZW5kfSBiYWNrZW5kIC0gVGhlIHJlbmRlcmVyJ3MgYmFja2VuZC5cclxuXHQgKiBAcGFyYW0ge0luZm99IGluZm8gLSBSZW5kZXJlciBjb21wb25lbnQgZm9yIG1hbmFnaW5nIG1ldHJpY3MgYW5kIG1vbml0b3JpbmcgZGF0YS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcmVuZGVyZXIsIGJhY2tlbmQsIGluZm8gKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByZW5kZXJlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7UmVuZGVyZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBiYWNrZW5kLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtCYWNrZW5kfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJhY2tlbmQgPSBiYWNrZW5kO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVuZGVyZXIgY29tcG9uZW50IGZvciBtYW5hZ2luZyBtZXRyaWNzIGFuZCBtb25pdG9yaW5nIGRhdGEuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0luZm99XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaW5mbyA9IGluZm87XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgZ2l2ZW4gcmVuZGVyIHRhcmdldC4gQmFzZWQgb24gdGhlIGdpdmVuIHJlbmRlciB0YXJnZXQgY29uZmlndXJhdGlvbixcclxuXHQgKiBpdCB1cGRhdGVzIHRoZSB0ZXh0dXJlIHN0YXRlcyByZXByZXNlbnRpbmcgdGhlIGF0dGFjaG1lbnRzIG9mIHRoZSBmcmFtZWJ1ZmZlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyVGFyZ2V0fSByZW5kZXJUYXJnZXQgLSBUaGUgcmVuZGVyIHRhcmdldCB0byB1cGRhdGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFthY3RpdmVNaXBtYXBMZXZlbD0wXSAtIFRoZSBhY3RpdmUgbWlwbWFwIGxldmVsLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZVJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0LCBhY3RpdmVNaXBtYXBMZXZlbCA9IDAgKSB7XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyVGFyZ2V0RGF0YSA9IHRoaXMuZ2V0KCByZW5kZXJUYXJnZXQgKTtcclxuXHJcblx0XHRjb25zdCBzYW1wbGVDb3VudCA9IHJlbmRlclRhcmdldC5zYW1wbGVzID09PSAwID8gMSA6IHJlbmRlclRhcmdldC5zYW1wbGVzO1xyXG5cdFx0Y29uc3QgZGVwdGhUZXh0dXJlTWlwcyA9IHJlbmRlclRhcmdldERhdGEuZGVwdGhUZXh0dXJlTWlwcyB8fCAoIHJlbmRlclRhcmdldERhdGEuZGVwdGhUZXh0dXJlTWlwcyA9IHt9ICk7XHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZXMgPSByZW5kZXJUYXJnZXQudGV4dHVyZXM7XHJcblxyXG5cdFx0Y29uc3Qgc2l6ZSA9IHRoaXMuZ2V0U2l6ZSggdGV4dHVyZXNbIDAgXSApO1xyXG5cclxuXHRcdGNvbnN0IG1pcFdpZHRoID0gc2l6ZS53aWR0aCA+PiBhY3RpdmVNaXBtYXBMZXZlbDtcclxuXHRcdGNvbnN0IG1pcEhlaWdodCA9IHNpemUuaGVpZ2h0ID4+IGFjdGl2ZU1pcG1hcExldmVsO1xyXG5cclxuXHRcdGxldCBkZXB0aFRleHR1cmUgPSByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlIHx8IGRlcHRoVGV4dHVyZU1pcHNbIGFjdGl2ZU1pcG1hcExldmVsIF07XHJcblx0XHRjb25zdCB1c2VEZXB0aFRleHR1cmUgPSByZW5kZXJUYXJnZXQuZGVwdGhCdWZmZXIgPT09IHRydWUgfHwgcmVuZGVyVGFyZ2V0LnN0ZW5jaWxCdWZmZXIgPT09IHRydWU7XHJcblxyXG5cdFx0bGV0IHRleHR1cmVOZWVkc1VwZGF0ZSA9IGZhbHNlO1xyXG5cclxuXHRcdGlmICggZGVwdGhUZXh0dXJlID09PSB1bmRlZmluZWQgJiYgdXNlRGVwdGhUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0ZGVwdGhUZXh0dXJlID0gbmV3IERlcHRoVGV4dHVyZSgpO1xyXG5cdFx0XHRkZXB0aFRleHR1cmUuZm9ybWF0ID0gcmVuZGVyVGFyZ2V0LnN0ZW5jaWxCdWZmZXIgPyBEZXB0aFN0ZW5jaWxGb3JtYXQgOiBEZXB0aEZvcm1hdDtcclxuXHRcdFx0ZGVwdGhUZXh0dXJlLnR5cGUgPSByZW5kZXJUYXJnZXQuc3RlbmNpbEJ1ZmZlciA/IFVuc2lnbmVkSW50MjQ4VHlwZSA6IFVuc2lnbmVkSW50VHlwZTsgLy8gRmxvYXRUeXBlXHJcblx0XHRcdGRlcHRoVGV4dHVyZS5pbWFnZS53aWR0aCA9IG1pcFdpZHRoO1xyXG5cdFx0XHRkZXB0aFRleHR1cmUuaW1hZ2UuaGVpZ2h0ID0gbWlwSGVpZ2h0O1xyXG5cclxuXHRcdFx0ZGVwdGhUZXh0dXJlTWlwc1sgYWN0aXZlTWlwbWFwTGV2ZWwgXSA9IGRlcHRoVGV4dHVyZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCByZW5kZXJUYXJnZXREYXRhLndpZHRoICE9PSBzaXplLndpZHRoIHx8IHNpemUuaGVpZ2h0ICE9PSByZW5kZXJUYXJnZXREYXRhLmhlaWdodCApIHtcclxuXHJcblx0XHRcdHRleHR1cmVOZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0XHRpZiAoIGRlcHRoVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0ZGVwdGhUZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHRcdFx0XHRkZXB0aFRleHR1cmUuaW1hZ2Uud2lkdGggPSBtaXBXaWR0aDtcclxuXHRcdFx0XHRkZXB0aFRleHR1cmUuaW1hZ2UuaGVpZ2h0ID0gbWlwSGVpZ2h0O1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZW5kZXJUYXJnZXREYXRhLndpZHRoID0gc2l6ZS53aWR0aDtcclxuXHRcdHJlbmRlclRhcmdldERhdGEuaGVpZ2h0ID0gc2l6ZS5oZWlnaHQ7XHJcblx0XHRyZW5kZXJUYXJnZXREYXRhLnRleHR1cmVzID0gdGV4dHVyZXM7XHJcblx0XHRyZW5kZXJUYXJnZXREYXRhLmRlcHRoVGV4dHVyZSA9IGRlcHRoVGV4dHVyZSB8fCBudWxsO1xyXG5cdFx0cmVuZGVyVGFyZ2V0RGF0YS5kZXB0aCA9IHJlbmRlclRhcmdldC5kZXB0aEJ1ZmZlcjtcclxuXHRcdHJlbmRlclRhcmdldERhdGEuc3RlbmNpbCA9IHJlbmRlclRhcmdldC5zdGVuY2lsQnVmZmVyO1xyXG5cdFx0cmVuZGVyVGFyZ2V0RGF0YS5yZW5kZXJUYXJnZXQgPSByZW5kZXJUYXJnZXQ7XHJcblxyXG5cdFx0aWYgKCByZW5kZXJUYXJnZXREYXRhLnNhbXBsZUNvdW50ICE9PSBzYW1wbGVDb3VudCApIHtcclxuXHJcblx0XHRcdHRleHR1cmVOZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0XHRpZiAoIGRlcHRoVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0ZGVwdGhUZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJlbmRlclRhcmdldERhdGEuc2FtcGxlQ291bnQgPSBzYW1wbGVDb3VudDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly9cclxuXHJcblxyXG5cdFx0Y29uc3Qgb3B0aW9ucyA9IHsgc2FtcGxlQ291bnQgfTtcclxuXHJcblx0XHQvLyBYUiByZW5kZXIgdGFyZ2V0cyByZXF1aXJlIG5vIHRleHR1cmUgdXBkYXRlc1xyXG5cclxuXHRcdGlmICggcmVuZGVyVGFyZ2V0LmlzWFJSZW5kZXJUYXJnZXQgIT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB0ZXh0dXJlcy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHRleHR1cmUgPSB0ZXh0dXJlc1sgaSBdO1xyXG5cclxuXHRcdFx0XHRpZiAoIHRleHR1cmVOZWVkc1VwZGF0ZSApIHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHR0aGlzLnVwZGF0ZVRleHR1cmUoIHRleHR1cmUsIG9wdGlvbnMgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggZGVwdGhUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLnVwZGF0ZVRleHR1cmUoIGRlcHRoVGV4dHVyZSwgb3B0aW9ucyApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBkaXNwb3NlIGhhbmRsZXJcclxuXHJcblx0XHRpZiAoIHJlbmRlclRhcmdldERhdGEuaW5pdGlhbGl6ZWQgIT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRyZW5kZXJUYXJnZXREYXRhLmluaXRpYWxpemVkID0gdHJ1ZTtcclxuXHJcblx0XHRcdC8vIGRpc3Bvc2VcclxuXHJcblx0XHRcdGNvbnN0IG9uRGlzcG9zZSA9ICgpID0+IHtcclxuXHJcblx0XHRcdFx0cmVuZGVyVGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25EaXNwb3NlICk7XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHRleHR1cmVzLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHR0aGlzLl9kZXN0cm95VGV4dHVyZSggdGV4dHVyZXNbIGkgXSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICggZGVwdGhUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0XHRcdHRoaXMuX2Rlc3Ryb3lUZXh0dXJlKCBkZXB0aFRleHR1cmUgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR0aGlzLmRlbGV0ZSggcmVuZGVyVGFyZ2V0ICk7XHJcblxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0cmVuZGVyVGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25EaXNwb3NlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIGdpdmVuIHRleHR1cmUuIERlcGVuZGluZyBvbiB0aGUgdGV4dHVyZSBzdGF0ZSwgdGhpcyBtZXRob2RcclxuXHQgKiB0cmlnZ2VycyB0aGUgdXBsb2FkIG9mIHRleHR1cmUgZGF0YSB0byB0aGUgR1BVIG1lbW9yeS4gSWYgdGhlIHRleHR1cmUgZGF0YSBhcmVcclxuXHQgKiBub3QgeWV0IHJlYWR5IGZvciB0aGUgdXBsb2FkLCBpdCB1c2VzIGRlZmF1bHQgdGV4dHVyZSBkYXRhIGZvciBhcyBhIHBsYWNlaG9sZGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUgdG8gdXBkYXRlLlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gLSBUaGUgb3B0aW9ucy5cclxuXHQgKi9cclxuXHR1cGRhdGVUZXh0dXJlKCB0ZXh0dXJlLCBvcHRpb25zID0ge30gKSB7XHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZURhdGEgPSB0aGlzLmdldCggdGV4dHVyZSApO1xyXG5cdFx0aWYgKCB0ZXh0dXJlRGF0YS5pbml0aWFsaXplZCA9PT0gdHJ1ZSAmJiB0ZXh0dXJlRGF0YS52ZXJzaW9uID09PSB0ZXh0dXJlLnZlcnNpb24gKSByZXR1cm47XHJcblxyXG5cdFx0Y29uc3QgaXNSZW5kZXJUYXJnZXQgPSB0ZXh0dXJlLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSB8fCB0ZXh0dXJlLmlzRGVwdGhUZXh0dXJlIHx8IHRleHR1cmUuaXNGcmFtZWJ1ZmZlclRleHR1cmU7XHJcblx0XHRjb25zdCBiYWNrZW5kID0gdGhpcy5iYWNrZW5kO1xyXG5cclxuXHRcdGlmICggaXNSZW5kZXJUYXJnZXQgJiYgdGV4dHVyZURhdGEuaW5pdGlhbGl6ZWQgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHQvLyBpdCdzIGFuIHVwZGF0ZVxyXG5cclxuXHRcdFx0YmFja2VuZC5kZXN0cm95U2FtcGxlciggdGV4dHVyZSApO1xyXG5cdFx0XHRiYWNrZW5kLmRlc3Ryb3lUZXh0dXJlKCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0aWYgKCB0ZXh0dXJlLmlzRnJhbWVidWZmZXJUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0Y29uc3QgcmVuZGVyVGFyZ2V0ID0gdGhpcy5yZW5kZXJlci5nZXRSZW5kZXJUYXJnZXQoKTtcclxuXHJcblx0XHRcdGlmICggcmVuZGVyVGFyZ2V0ICkge1xyXG5cclxuXHRcdFx0XHR0ZXh0dXJlLnR5cGUgPSByZW5kZXJUYXJnZXQudGV4dHVyZS50eXBlO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0dGV4dHVyZS50eXBlID0gVW5zaWduZWRCeXRlVHlwZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCB7IHdpZHRoLCBoZWlnaHQsIGRlcHRoIH0gPSB0aGlzLmdldFNpemUoIHRleHR1cmUgKTtcclxuXHJcblx0XHRvcHRpb25zLndpZHRoID0gd2lkdGg7XHJcblx0XHRvcHRpb25zLmhlaWdodCA9IGhlaWdodDtcclxuXHRcdG9wdGlvbnMuZGVwdGggPSBkZXB0aDtcclxuXHRcdG9wdGlvbnMubmVlZHNNaXBtYXBzID0gdGhpcy5uZWVkc01pcG1hcHMoIHRleHR1cmUgKTtcclxuXHRcdG9wdGlvbnMubGV2ZWxzID0gb3B0aW9ucy5uZWVkc01pcG1hcHMgPyB0aGlzLmdldE1pcExldmVscyggdGV4dHVyZSwgd2lkdGgsIGhlaWdodCApIDogMTtcclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGlmICggaXNSZW5kZXJUYXJnZXQgfHwgdGV4dHVyZS5pc1N0b3JhZ2VUZXh0dXJlID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0YmFja2VuZC5jcmVhdGVTYW1wbGVyKCB0ZXh0dXJlICk7XHJcblx0XHRcdGJhY2tlbmQuY3JlYXRlVGV4dHVyZSggdGV4dHVyZSwgb3B0aW9ucyApO1xyXG5cclxuXHRcdFx0dGV4dHVyZURhdGEuZ2VuZXJhdGlvbiA9IHRleHR1cmUudmVyc2lvbjtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc3QgbmVlZHNDcmVhdGUgPSB0ZXh0dXJlRGF0YS5pbml0aWFsaXplZCAhPT0gdHJ1ZTtcclxuXHJcblx0XHRcdGlmICggbmVlZHNDcmVhdGUgKSBiYWNrZW5kLmNyZWF0ZVNhbXBsZXIoIHRleHR1cmUgKTtcclxuXHJcblx0XHRcdGlmICggdGV4dHVyZS52ZXJzaW9uID4gMCApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgaW1hZ2UgPSB0ZXh0dXJlLmltYWdlO1xyXG5cclxuXHRcdFx0XHRpZiAoIGltYWdlID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUmVuZGVyZXI6IFRleHR1cmUgbWFya2VkIGZvciB1cGRhdGUgYnV0IGltYWdlIGlzIHVuZGVmaW5lZC4nICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGltYWdlLmNvbXBsZXRlID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5SZW5kZXJlcjogVGV4dHVyZSBtYXJrZWQgZm9yIHVwZGF0ZSBidXQgaW1hZ2UgaXMgaW5jb21wbGV0ZS4nICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCB0ZXh0dXJlLmltYWdlcyApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnN0IGltYWdlcyA9IFtdO1xyXG5cclxuXHRcdFx0XHRcdFx0Zm9yICggY29uc3QgaW1hZ2Ugb2YgdGV4dHVyZS5pbWFnZXMgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGltYWdlcy5wdXNoKCBpbWFnZSApO1xyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0b3B0aW9ucy5pbWFnZXMgPSBpbWFnZXM7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdG9wdGlvbnMuaW1hZ2UgPSBpbWFnZTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aWYgKCB0ZXh0dXJlRGF0YS5pc0RlZmF1bHRUZXh0dXJlID09PSB1bmRlZmluZWQgfHwgdGV4dHVyZURhdGEuaXNEZWZhdWx0VGV4dHVyZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdGJhY2tlbmQuY3JlYXRlVGV4dHVyZSggdGV4dHVyZSwgb3B0aW9ucyApO1xyXG5cclxuXHRcdFx0XHRcdFx0dGV4dHVyZURhdGEuaXNEZWZhdWx0VGV4dHVyZSA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0XHR0ZXh0dXJlRGF0YS5nZW5lcmF0aW9uID0gdGV4dHVyZS52ZXJzaW9uO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRpZiAoIHRleHR1cmUuc291cmNlLmRhdGFSZWFkeSA9PT0gdHJ1ZSApIGJhY2tlbmQudXBkYXRlVGV4dHVyZSggdGV4dHVyZSwgb3B0aW9ucyApO1xyXG5cclxuXHRcdFx0XHRcdGlmICggb3B0aW9ucy5uZWVkc01pcG1hcHMgJiYgdGV4dHVyZS5taXBtYXBzLmxlbmd0aCA9PT0gMCApIGJhY2tlbmQuZ2VuZXJhdGVNaXBtYXBzKCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdC8vIGFzeW5jIHVwZGF0ZVxyXG5cclxuXHRcdFx0XHRiYWNrZW5kLmNyZWF0ZURlZmF1bHRUZXh0dXJlKCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0XHRcdHRleHR1cmVEYXRhLmlzRGVmYXVsdFRleHR1cmUgPSB0cnVlO1xyXG5cdFx0XHRcdHRleHR1cmVEYXRhLmdlbmVyYXRpb24gPSB0ZXh0dXJlLnZlcnNpb247XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGRpc3Bvc2UgaGFuZGxlclxyXG5cclxuXHRcdGlmICggdGV4dHVyZURhdGEuaW5pdGlhbGl6ZWQgIT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHR0ZXh0dXJlRGF0YS5pbml0aWFsaXplZCA9IHRydWU7XHJcblx0XHRcdHRleHR1cmVEYXRhLmdlbmVyYXRpb24gPSB0ZXh0dXJlLnZlcnNpb247XHJcblxyXG5cdFx0XHQvL1xyXG5cclxuXHRcdFx0dGhpcy5pbmZvLm1lbW9yeS50ZXh0dXJlcyArKztcclxuXHJcblx0XHRcdC8vIGRpc3Bvc2VcclxuXHJcblx0XHRcdGNvbnN0IG9uRGlzcG9zZSA9ICgpID0+IHtcclxuXHJcblx0XHRcdFx0dGV4dHVyZS5yZW1vdmVFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uRGlzcG9zZSApO1xyXG5cclxuXHRcdFx0XHR0aGlzLl9kZXN0cm95VGV4dHVyZSggdGV4dHVyZSApO1xyXG5cclxuXHRcdFx0XHR0aGlzLmluZm8ubWVtb3J5LnRleHR1cmVzIC0tO1xyXG5cclxuXHRcdFx0fTtcclxuXHJcblx0XHRcdHRleHR1cmUuYWRkRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvbkRpc3Bvc2UgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHR0ZXh0dXJlRGF0YS52ZXJzaW9uID0gdGV4dHVyZS52ZXJzaW9uO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSBzaXplIG9mIHRoZSBnaXZlbiB0ZXh0dXJlIGFuZCB3cml0ZXMgdGhlIHJlc3VsdFxyXG5cdCAqIGludG8gdGhlIHRhcmdldCB2ZWN0b3IuIFRoaXMgdmVjdG9yIGlzIGFsc28gcmV0dXJuZWQgYnkgdGhlXHJcblx0ICogbWV0aG9kLlxyXG5cdCAqXHJcblx0ICogSWYgbm8gdGV4dHVyZSBkYXRhIGFyZSBhdmFpbGFibGUgZm9yIHRoZSBjb21wdXRlIHlldCwgdGhlIG1ldGhvZFxyXG5cdCAqIHJldHVybnMgZGVmYXVsdCBzaXplIHZhbHVlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlIHRvIGNvbXB1dGUgdGhlIHNpemUgZm9yLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM30gdGFyZ2V0IC0gVGhlIHRhcmdldCB2ZWN0b3IuXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gVGhlIHRhcmdldCB2ZWN0b3IuXHJcblx0ICovXHJcblx0Z2V0U2l6ZSggdGV4dHVyZSwgdGFyZ2V0ID0gX3NpemUgKSB7XHJcblxyXG5cdFx0bGV0IGltYWdlID0gdGV4dHVyZS5pbWFnZXMgPyB0ZXh0dXJlLmltYWdlc1sgMCBdIDogdGV4dHVyZS5pbWFnZTtcclxuXHJcblx0XHRpZiAoIGltYWdlICkge1xyXG5cclxuXHRcdFx0aWYgKCBpbWFnZS5pbWFnZSAhPT0gdW5kZWZpbmVkICkgaW1hZ2UgPSBpbWFnZS5pbWFnZTtcclxuXHJcblx0XHRcdHRhcmdldC53aWR0aCA9IGltYWdlLndpZHRoIHx8IDE7XHJcblx0XHRcdHRhcmdldC5oZWlnaHQgPSBpbWFnZS5oZWlnaHQgfHwgMTtcclxuXHRcdFx0dGFyZ2V0LmRlcHRoID0gdGV4dHVyZS5pc0N1YmVUZXh0dXJlID8gNiA6ICggaW1hZ2UuZGVwdGggfHwgMSApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR0YXJnZXQud2lkdGggPSB0YXJnZXQuaGVpZ2h0ID0gdGFyZ2V0LmRlcHRoID0gMTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRhcmdldDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wdXRlcyB0aGUgbnVtYmVyIG9mIG1pcG1hcCBsZXZlbHMgZm9yIHRoZSBnaXZlbiB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIHRleHR1cmUncyB3aWR0aC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gVGhlIHRleHR1cmUncyBoZWlnaHQuXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgbnVtYmVyIG9mIG1pcG1hcCBsZXZlbHMuXHJcblx0ICovXHJcblx0Z2V0TWlwTGV2ZWxzKCB0ZXh0dXJlLCB3aWR0aCwgaGVpZ2h0ICkge1xyXG5cclxuXHRcdGxldCBtaXBMZXZlbENvdW50O1xyXG5cclxuXHRcdGlmICggdGV4dHVyZS5pc0NvbXByZXNzZWRUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0aWYgKCB0ZXh0dXJlLm1pcG1hcHMgKSB7XHJcblxyXG5cdFx0XHRcdG1pcExldmVsQ291bnQgPSB0ZXh0dXJlLm1pcG1hcHMubGVuZ3RoO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0bWlwTGV2ZWxDb3VudCA9IDE7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdG1pcExldmVsQ291bnQgPSBNYXRoLmZsb29yKCBNYXRoLmxvZzIoIE1hdGgubWF4KCB3aWR0aCwgaGVpZ2h0ICkgKSApICsgMTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG1pcExldmVsQ291bnQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIHRleHR1cmUgcmVxdWlyZXMgbWlwbWFwcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlLlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgbWlwbWFwcyBhcmUgcmVxdWlyZWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdG5lZWRzTWlwbWFwcyggdGV4dHVyZSApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5pc0Vudmlyb25tZW50VGV4dHVyZSggdGV4dHVyZSApIHx8IHRleHR1cmUuaXNDb21wcmVzc2VkVGV4dHVyZSA9PT0gdHJ1ZSB8fCB0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gdGV4dHVyZSBpcyBhbiBlbnZpcm9ubWVudCBtYXAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZS5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBnaXZlbiB0ZXh0dXJlIGlzIGFuIGVudmlyb25tZW50IG1hcCBvciBub3QuXHJcblx0ICovXHJcblx0aXNFbnZpcm9ubWVudFRleHR1cmUoIHRleHR1cmUgKSB7XHJcblxyXG5cdFx0Y29uc3QgbWFwcGluZyA9IHRleHR1cmUubWFwcGluZztcclxuXHJcblx0XHRyZXR1cm4gKCBtYXBwaW5nID09PSBFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZyB8fCBtYXBwaW5nID09PSBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZyApIHx8ICggbWFwcGluZyA9PT0gQ3ViZVJlZmxlY3Rpb25NYXBwaW5nIHx8IG1hcHBpbmcgPT09IEN1YmVSZWZyYWN0aW9uTWFwcGluZyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZyZWVzIGludGVybmFsIHJlc291cmNlIHdoZW4gdGhlIGdpdmVuIHRleHR1cmUgaXNuJ3RcclxuXHQgKiByZXF1aXJlZCBhbnltb3JlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUgdG8gZGVzdHJveS5cclxuXHQgKi9cclxuXHRfZGVzdHJveVRleHR1cmUoIHRleHR1cmUgKSB7XHJcblxyXG5cdFx0dGhpcy5iYWNrZW5kLmRlc3Ryb3lTYW1wbGVyKCB0ZXh0dXJlICk7XHJcblx0XHR0aGlzLmJhY2tlbmQuZGVzdHJveVRleHR1cmUoIHRleHR1cmUgKTtcclxuXHJcblx0XHR0aGlzLmRlbGV0ZSggdGV4dHVyZSApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBUZXh0dXJlcztcclxuIiwiaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi8uLi9tYXRoL0NvbG9yLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIGZvdXItY29tcG9uZW50IHZlcnNpb24gb2Yge0BsaW5rIENvbG9yfSB3aGljaCBpcyBpbnRlcm5hbGx5XHJcbiAqIHVzZWQgYnkgdGhlIHJlbmRlcmVyIHRvIHJlcHJlc2VudHMgY2xlYXIgY29sb3Igd2l0aCBhbHBoYSBhc1xyXG4gKiBvbmUgb2JqZWN0LlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAYXVnbWVudHMgQ29sb3JcclxuICovXHJcbmNsYXNzIENvbG9yNCBleHRlbmRzIENvbG9yIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBmb3VyLWNvbXBvbmVudCBjb2xvci5cclxuXHQgKiBZb3UgY2FuIGFsc28gcGFzcyBhIHNpbmdsZSBUSFJFRS5Db2xvciwgaGV4IG9yXHJcblx0ICogc3RyaW5nIGFyZ3VtZW50IHRvIHRoaXMgY29uc3RydWN0b3IuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IFtyPTFdIC0gVGhlIHJlZCB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2c9MV0gLSBUaGUgZ3JlZW4gdmFsdWUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtiPTFdIC0gVGhlIGJsdWUgdmFsdWUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFthPTFdIC0gVGhlIGFscGhhIHZhbHVlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCByLCBnLCBiLCBhID0gMSApIHtcclxuXHJcblx0XHRzdXBlciggciwgZywgYiApO1xyXG5cclxuXHRcdHRoaXMuYSA9IGE7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogT3ZlcndyaXRlcyB0aGUgZGVmYXVsdCB0byBob25vciBhbHBoYS5cclxuXHQgKiBZb3UgY2FuIGFsc28gcGFzcyBhIHNpbmdsZSBUSFJFRS5Db2xvciwgaGV4IG9yXHJcblx0ICogc3RyaW5nIGFyZ3VtZW50IHRvIHRoaXMgbWV0aG9kLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfENvbG9yfSByIC0gVGhlIHJlZCB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZyAtIFRoZSBncmVlbiB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYiAtIFRoZSBibHVlIHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbYT0xXSAtIFRoZSBhbHBoYSB2YWx1ZS5cclxuXHQgKiBAcmV0dXJuIHtDb2xvcjR9IEEgcmVmZXJlbmNlIHRvIHRoaXMgb2JqZWN0LlxyXG5cdCAqL1xyXG5cdHNldCggciwgZywgYiwgYSA9IDEgKSB7XHJcblxyXG5cdFx0dGhpcy5hID0gYTtcclxuXHJcblx0XHRyZXR1cm4gc3VwZXIuc2V0KCByLCBnLCBiICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogT3ZlcndyaXRlcyB0aGUgZGVmYXVsdCB0byBob25vciBhbHBoYS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Q29sb3I0fSBjb2xvciAtIFRoZSBjb2xvciB0byBjb3B5LlxyXG5cdCAqIEByZXR1cm4ge0NvbG9yNH0gQSByZWZlcmVuY2UgdG8gdGhpcyBvYmplY3QuXHJcblx0ICovXHJcblx0Y29weSggY29sb3IgKSB7XHJcblxyXG5cdFx0aWYgKCBjb2xvci5hICE9PSB1bmRlZmluZWQgKSB0aGlzLmEgPSBjb2xvci5hO1xyXG5cclxuXHRcdHJldHVybiBzdXBlci5jb3B5KCBjb2xvciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE92ZXJ3cml0ZXMgdGhlIGRlZmF1bHQgdG8gaG9ub3IgYWxwaGEuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtDb2xvcjR9IFRoZSBjbG9uZWQgY29sb3IuXHJcblx0ICovXHJcblx0Y2xvbmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLnIsIHRoaXMuZywgdGhpcy5iLCB0aGlzLmEgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQ29sb3I0O1xyXG4iLCJpbXBvcnQgeyBub2RlT2JqZWN0IH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5pbXBvcnQgUHJvcGVydHlOb2RlIGZyb20gJy4vUHJvcGVydHlOb2RlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBTcGVjaWFsIHZlcnNpb24gb2Yge0BsaW5rIFByb3BlcnR5Tm9kZX0gd2hpY2ggaXMgdXNlZCBmb3IgcGFyYW1ldGVycy5cclxuICpcclxuICogQGF1Z21lbnRzIFByb3BlcnR5Tm9kZVxyXG4gKi9cclxuY2xhc3MgUGFyYW1ldGVyTm9kZSBleHRlbmRzIFByb3BlcnR5Tm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ1BhcmFtZXRlck5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcGFyYW1ldGVyIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbm9kZVR5cGUgLSBUaGUgdHlwZSBvZiB0aGUgbm9kZS5cclxuXHQgKiBAcGFyYW0gez9zdHJpbmd9IFtuYW1lPW51bGxdIC0gVGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciBpbiB0aGUgc2hhZGVyLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBub2RlVHlwZSwgbmFtZSA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5vZGVUeXBlLCBuYW1lICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzUGFyYW1ldGVyTm9kZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0SGFzaCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy51dWlkO1xyXG5cclxuXHR9XHJcblxyXG5cdGdlbmVyYXRlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm5hbWU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFBhcmFtZXRlck5vZGU7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIHBhcmFtZXRlciBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSB0eXBlIG9mIHRoZSBub2RlLlxyXG4gKiBAcGFyYW0gez9zdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIGluIHRoZSBzaGFkZXIuXHJcbiAqIEByZXR1cm5zIHtQYXJhbWV0ZXJOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHBhcmFtZXRlciA9ICggdHlwZSwgbmFtZSApID0+IG5vZGVPYmplY3QoIG5ldyBQYXJhbWV0ZXJOb2RlKCB0eXBlLCBuYW1lICkgKTtcclxuIiwiaW1wb3J0IE5vZGUgZnJvbSAnLi9Ob2RlLmpzJztcclxuaW1wb3J0IHsgc2VsZWN0IH0gZnJvbSAnLi4vbWF0aC9Db25kaXRpb25hbE5vZGUuanMnO1xyXG5pbXBvcnQgeyBTaGFkZXJOb2RlLCBub2RlUHJveHksIGdldEN1cnJlbnRTdGFjaywgc2V0Q3VycmVudFN0YWNrIH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5cclxuLyoqXHJcbiAqIFN0YWNrIGlzIGEgaGVscGVyIGZvciBOb2RlcyB0aGF0IG5lZWQgdG8gcHJvZHVjZSBzdGFjay1iYXNlZCBjb2RlIGluc3RlYWQgb2YgY29udGludW91cyBmbG93LlxyXG4gKiBUaGV5IGFyZSB1c3VhbGx5IG5lZWRlZCBpbiBjYXNlcyBsaWtlIGBJZmAsIGBFbHNlYC5cclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVcclxuICovXHJcbmNsYXNzIFN0YWNrTm9kZSBleHRlbmRzIE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdTdGFja05vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc3RhY2sgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7P1N0YWNrTm9kZX0gW3BhcmVudD1udWxsXSAtIFRoZSBwYXJlbnQgc3RhY2sgbm9kZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcGFyZW50ID0gbnVsbCApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogTGlzdCBvZiBub2Rlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8Tm9kZT59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9kZXMgPSBbXTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBvdXRwdXQgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMub3V0cHV0Tm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcGFyZW50IHN0YWNrIG5vZGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9TdGFja05vZGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucGFyZW50ID0gcGFyZW50O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGN1cnJlbnQgY29uZGl0aW9uYWwgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge0NvbmRpdGlvbmFsTm9kZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fY3VycmVudENvbmQgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1N0YWNrTm9kZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMub3V0cHV0Tm9kZSA/IHRoaXMub3V0cHV0Tm9kZS5nZXROb2RlVHlwZSggYnVpbGRlciApIDogJ3ZvaWQnO1xyXG5cclxuXHR9XHJcblxyXG5cdGdldE1lbWJlclR5cGUoIGJ1aWxkZXIsIG5hbWUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMub3V0cHV0Tm9kZSA/IHRoaXMub3V0cHV0Tm9kZS5nZXRNZW1iZXJUeXBlKCBidWlsZGVyLCBuYW1lICkgOiAndm9pZCc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyBhIG5vZGUgdG8gdGhpcyBzdGFjay5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFRoZSBub2RlIHRvIGFkZC5cclxuXHQgKiBAcmV0dXJuIHtTdGFja05vZGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgc3RhY2sgbm9kZS5cclxuXHQgKi9cclxuXHRhZGQoIG5vZGUgKSB7XHJcblxyXG5cdFx0dGhpcy5ub2Rlcy5wdXNoKCBub2RlICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVwcmVzZW50IGFuIGBpZmAgc3RhdGVtZW50IGluIFRTTC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gYm9vbE5vZGUgLSBSZXByZXNlbnRzIHRoZSBjb25kaXRpb24uXHJcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gbWV0aG9kIC0gVFNMIGNvZGUgd2hpY2ggaXMgZXhlY3V0ZWQgaWYgdGhlIGNvbmRpdGlvbiBldmFsdWF0ZXMgdG8gYHRydWVgLlxyXG5cdCAqIEByZXR1cm4ge1N0YWNrTm9kZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBzdGFjayBub2RlLlxyXG5cdCAqL1xyXG5cdElmKCBib29sTm9kZSwgbWV0aG9kICkge1xyXG5cclxuXHRcdGNvbnN0IG1ldGhvZE5vZGUgPSBuZXcgU2hhZGVyTm9kZSggbWV0aG9kICk7XHJcblx0XHR0aGlzLl9jdXJyZW50Q29uZCA9IHNlbGVjdCggYm9vbE5vZGUsIG1ldGhvZE5vZGUgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5hZGQoIHRoaXMuX2N1cnJlbnRDb25kICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVwcmVzZW50IGFuIGBlbHNlaWZgIHN0YXRlbWVudCBpbiBUU0wuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV9IGJvb2xOb2RlIC0gUmVwcmVzZW50cyB0aGUgY29uZGl0aW9uLlxyXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IG1ldGhvZCAtIFRTTCBjb2RlIHdoaWNoIGlzIGV4ZWN1dGVkIGlmIHRoZSBjb25kaXRpb24gZXZhbHVhdGVzIHRvIGB0cnVlYC5cclxuXHQgKiBAcmV0dXJuIHtTdGFja05vZGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgc3RhY2sgbm9kZS5cclxuXHQgKi9cclxuXHRFbHNlSWYoIGJvb2xOb2RlLCBtZXRob2QgKSB7XHJcblxyXG5cdFx0Y29uc3QgbWV0aG9kTm9kZSA9IG5ldyBTaGFkZXJOb2RlKCBtZXRob2QgKTtcclxuXHRcdGNvbnN0IGlmTm9kZSA9IHNlbGVjdCggYm9vbE5vZGUsIG1ldGhvZE5vZGUgKTtcclxuXHJcblx0XHR0aGlzLl9jdXJyZW50Q29uZC5lbHNlTm9kZSA9IGlmTm9kZTtcclxuXHRcdHRoaXMuX2N1cnJlbnRDb25kID0gaWZOb2RlO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlcHJlc2VudCBhbiBgZWxzZWAgc3RhdGVtZW50IGluIFRTTC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IG1ldGhvZCAtIFRTTCBjb2RlIHdoaWNoIGlzIGV4ZWN1dGVkIGluIHRoZSBgZWxzZWAgY2FzZS5cclxuXHQgKiBAcmV0dXJuIHtTdGFja05vZGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgc3RhY2sgbm9kZS5cclxuXHQgKi9cclxuXHRFbHNlKCBtZXRob2QgKSB7XHJcblxyXG5cdFx0dGhpcy5fY3VycmVudENvbmQuZWxzZU5vZGUgPSBuZXcgU2hhZGVyTm9kZSggbWV0aG9kICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0YnVpbGQoIGJ1aWxkZXIsIC4uLnBhcmFtcyApIHtcclxuXHJcblx0XHRjb25zdCBwcmV2aW91c1N0YWNrID0gZ2V0Q3VycmVudFN0YWNrKCk7XHJcblxyXG5cdFx0c2V0Q3VycmVudFN0YWNrKCB0aGlzICk7XHJcblxyXG5cdFx0Zm9yICggY29uc3Qgbm9kZSBvZiB0aGlzLm5vZGVzICkge1xyXG5cclxuXHRcdFx0bm9kZS5idWlsZCggYnVpbGRlciwgJ3ZvaWQnICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHNldEN1cnJlbnRTdGFjayggcHJldmlvdXNTdGFjayApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm91dHB1dE5vZGUgPyB0aGlzLm91dHB1dE5vZGUuYnVpbGQoIGJ1aWxkZXIsIC4uLnBhcmFtcyApIDogc3VwZXIuYnVpbGQoIGJ1aWxkZXIsIC4uLnBhcmFtcyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vIERlcHJlY2F0ZWRcclxuXHJcblx0LyoqXHJcblx0ICogQGZ1bmN0aW9uXHJcblx0ICogQGRlcHJlY2F0ZWQgc2luY2UgcjE2OC4gVXNlIHtAbGluayBTdGFja05vZGUjRWxzZX0gaW5zdGVhZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Li4uYW55fSBwYXJhbXNcclxuXHQgKiBAcmV0dXJucyB7U3RhY2tOb2RlfVxyXG5cdCAqL1xyXG5cdGVsc2UoIC4uLnBhcmFtcyApIHsgLy8gQGRlcHJlY2F0ZWQsIHIxNjhcclxuXHJcblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5UU0w6IC5lbHNlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuRWxzZSgpLicgKTtcclxuXHRcdHJldHVybiB0aGlzLkVsc2UoIC4uLnBhcmFtcyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEBkZXByZWNhdGVkIHNpbmNlIHIxNjguIFVzZSB7QGxpbmsgU3RhY2tOb2RlI0Vsc2VJZn0gaW5zdGVhZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Li4uYW55fSBwYXJhbXNcclxuXHQgKiBAcmV0dXJucyB7U3RhY2tOb2RlfVxyXG5cdCAqL1xyXG5cdGVsc2VpZiggLi4ucGFyYW1zICkgeyAvLyBAZGVwcmVjYXRlZCwgcjE2OFxyXG5cclxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlRTTDogLmVsc2VpZigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLkVsc2VJZigpLicgKTtcclxuXHRcdHJldHVybiB0aGlzLkVsc2VJZiggLi4ucGFyYW1zICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFN0YWNrTm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgc3RhY2sgbm9kZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHs/U3RhY2tOb2RlfSBbcGFyZW50PW51bGxdIC0gVGhlIHBhcmVudCBzdGFjayBub2RlLlxyXG4gKiBAcmV0dXJucyB7U3RhY2tOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHN0YWNrID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIFN0YWNrTm9kZSApLnNldFBhcmFtZXRlckxlbmd0aCggMCwgMSApO1xyXG4iLCJcclxuaW1wb3J0IE5vZGUgZnJvbSAnLi9Ob2RlLmpzJztcclxuaW1wb3J0IHsgZ2V0TGVuZ3RoRnJvbVR5cGUgfSBmcm9tICcuL05vZGVVdGlscy5qcyc7XHJcblxyXG4vKipcclxuICogR2VuZXJhdGVzIGEgbGF5b3V0IGZvciBzdHJ1Y3QgbWVtYmVycy5cclxuICogVGhpcyBmdW5jdGlvbiB0YWtlcyBhbiBvYmplY3QgcmVwcmVzZW50aW5nIHN0cnVjdCBtZW1iZXJzIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIG1lbWJlciBsYXlvdXRzLlxyXG4gKiBFYWNoIG1lbWJlciBsYXlvdXQgaW5jbHVkZXMgdGhlIG1lbWJlcidzIG5hbWUsIHR5cGUsIGFuZCB3aGV0aGVyIGl0IGlzIGF0b21pYy5cclxuICpcclxuICogQHBhcmFtIHtPYmplY3QuPHN0cmluZywgc3RyaW5nfE9iamVjdD59IG1lbWJlcnMgLSBBbiBvYmplY3Qgd2hlcmUga2V5cyBhcmUgbWVtYmVyIG5hbWVzIGFuZCB2YWx1ZXMgYXJlIGVpdGhlciB0eXBlcyAoYXMgc3RyaW5ncykgb3Igb2JqZWN0cyB3aXRoIHR5cGUgYW5kIGF0b21pYyBwcm9wZXJ0aWVzLlxyXG4gKiBAcmV0dXJucyB7QXJyYXkuPHtuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZywgYXRvbWljOiBib29sZWFufT59IEFuIGFycmF5IG9mIG1lbWJlciBsYXlvdXRzLlxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0TWVtYmVyc0xheW91dCggbWVtYmVycyApIHtcclxuXHJcblx0cmV0dXJuIE9iamVjdC5lbnRyaWVzKCBtZW1iZXJzICkubWFwKCAoIFsgbmFtZSwgdmFsdWUgXSApID0+IHtcclxuXHJcblx0XHRpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4geyBuYW1lLCB0eXBlOiB2YWx1ZSwgYXRvbWljOiBmYWxzZSB9O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4geyBuYW1lLCB0eXBlOiB2YWx1ZS50eXBlLCBhdG9taWM6IHZhbHVlLmF0b21pYyB8fCBmYWxzZSB9O1xyXG5cclxuXHR9ICk7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyBhIHN0cnVjdCB0eXBlIG5vZGUgaW4gdGhlIG5vZGUtYmFzZWQgc3lzdGVtLlxyXG4gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gZGVmaW5lIGFuZCBtYW5hZ2UgdGhlIGxheW91dCBhbmQgdHlwZXMgb2Ygc3RydWN0IG1lbWJlcnMuXHJcbiAqIEl0IGV4dGVuZHMgdGhlIGJhc2UgTm9kZSBjbGFzcyBhbmQgcHJvdmlkZXMgbWV0aG9kcyB0byBnZXQgdGhlIGxlbmd0aCBvZiB0aGUgc3RydWN0LFxyXG4gKiByZXRyaWV2ZSBtZW1iZXIgdHlwZXMsIGFuZCBnZW5lcmF0ZSB0aGUgc3RydWN0IHR5cGUgZm9yIGEgYnVpbGRlci5cclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVcclxuICovXHJcbmNsYXNzIFN0cnVjdFR5cGVOb2RlIGV4dGVuZHMgTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ1N0cnVjdFR5cGVOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFN0cnVjdFR5cGVOb2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IG1lbWJlcnNMYXlvdXQgLSBUaGUgbGF5b3V0IG9mIHRoZSBtZW1iZXJzIGZvciB0aGUgc3RydWN0LlxyXG5cdCAqIEBwYXJhbSB7P3N0cmluZ30gW25hbWU9bnVsbF0gLSBUaGUgb3B0aW9uYWwgbmFtZSBvZiB0aGUgc3RydWN0LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBtZW1iZXJzTGF5b3V0LCBuYW1lID0gbnVsbCApIHtcclxuXHJcblx0XHRzdXBlciggJ3N0cnVjdCcgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBsYXlvdXQgb2YgdGhlIG1lbWJlcnMgZm9yIHRoZSBzdHJ1Y3RcclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXkuPHtuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZywgYXRvbWljOiBib29sZWFufT59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWVtYmVyc0xheW91dCA9IGdldE1lbWJlcnNMYXlvdXQoIG1lbWJlcnNMYXlvdXQgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBuYW1lIG9mIHRoZSBzdHJ1Y3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9zdHJpbmd9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubmFtZSA9IG5hbWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzU3RydWN0TGF5b3V0Tm9kZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJ1Y3QuXHJcblx0ICogVGhlIGxlbmd0aCBpcyBjYWxjdWxhdGVkIGJ5IHN1bW1pbmcgdGhlIGxlbmd0aHMgb2YgdGhlIHN0cnVjdCdzIG1lbWJlcnMuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgbGVuZ3RoIG9mIHRoZSBzdHJ1Y3QuXHJcblx0ICovXHJcblx0Z2V0TGVuZ3RoKCkge1xyXG5cclxuXHRcdGxldCBsZW5ndGggPSAwO1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IG1lbWJlciBvZiB0aGlzLm1lbWJlcnNMYXlvdXQgKSB7XHJcblxyXG5cdFx0XHRsZW5ndGggKz0gZ2V0TGVuZ3RoRnJvbVR5cGUoIG1lbWJlci50eXBlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBsZW5ndGg7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0TWVtYmVyVHlwZSggYnVpbGRlciwgbmFtZSApIHtcclxuXHJcblx0XHRjb25zdCBtZW1iZXIgPSB0aGlzLm1lbWJlcnNMYXlvdXQuZmluZCggbSA9PiBtLm5hbWUgPT09IG5hbWUgKTtcclxuXHJcblx0XHRyZXR1cm4gbWVtYmVyID8gbWVtYmVyLnR5cGUgOiAndm9pZCc7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3Qgc3RydWN0VHlwZSA9IGJ1aWxkZXIuZ2V0U3RydWN0VHlwZUZyb21Ob2RlKCB0aGlzLCB0aGlzLm1lbWJlcnNMYXlvdXQsIHRoaXMubmFtZSApO1xyXG5cclxuXHRcdHJldHVybiBzdHJ1Y3RUeXBlLm5hbWU7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXAoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0YnVpbGRlci5hZGRJbmNsdWRlKCB0aGlzICk7XHJcblxyXG5cdH1cclxuXHJcblx0Z2VuZXJhdGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgU3RydWN0VHlwZU5vZGU7XHJcbiIsImltcG9ydCBOb2RlIGZyb20gJy4vTm9kZS5qcyc7XHJcbmltcG9ydCBTdHJ1Y3RUeXBlTm9kZSBmcm9tICcuL1N0cnVjdFR5cGVOb2RlLmpzJztcclxuaW1wb3J0IHsgbm9kZU9iamVjdCB9IGZyb20gJy4uL3RzbC9UU0xDb3JlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBTdHJ1Y3ROb2RlIGFsbG93cyB0byBjcmVhdGUgY3VzdG9tIHN0cnVjdHVyZXMgd2l0aCBtdWx0aXBsZSBtZW1iZXJzLlxyXG4gKiBUaGlzIGNhbiBhbHNvIGJlIHVzZWQgdG8gZGVmaW5lIHN0cnVjdHVyZXMgaW4gYXR0cmlidXRlIGFuZCB1bmlmb3JtIGRhdGEuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIC8vIERlZmluZSBhIGN1c3RvbSBzdHJ1Y3RcclxuICogY29uc3QgQm91bmRpbmdCb3ggPSBzdHJ1Y3QoIHsgbWluOiAndmVjMycsIG1heDogJ3ZlYzMnIH0gKTtcclxuICpcclxuICogLy8gQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzdHJ1Y3RcclxuICogY29uc3QgYmIgPSBCb3VuZGluZ0JveCggdmVjMyggMCApLCB2ZWMzKCAxICkgKTsgLy8gc3R5bGUgMVxyXG4gKiBjb25zdCBiYiA9IEJvdW5kaW5nQm94KCB7IG1pbjogdmVjMyggMCApLCBtYXg6IHZlYzMoIDEgKSB9ICk7IC8vIHN0eWxlIDJcclxuICpcclxuICogLy8gQWNjZXNzIHRoZSBzdHJ1Y3QgbWVtYmVyc1xyXG4gKiBjb25zdCBtaW4gPSBiYi5nZXQoICdtaW4nICk7XHJcbiAqXHJcbiAqIC8vIEFzc2lnbiBhIG5ldyB2YWx1ZSB0byBhIG1lbWJlclxyXG4gKiBtaW4uYXNzaWduKCB2ZWMzKCkgKTtcclxuICogYGBgXHJcbiAqIEBhdWdtZW50cyBOb2RlXHJcbiAqL1xyXG5jbGFzcyBTdHJ1Y3ROb2RlIGV4dGVuZHMgTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ1N0cnVjdE5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvbnN0cnVjdG9yKCBzdHJ1Y3RMYXlvdXROb2RlLCB2YWx1ZXMgKSB7XHJcblxyXG5cdFx0c3VwZXIoICd2ZWMzJyApO1xyXG5cclxuXHRcdHRoaXMuc3RydWN0TGF5b3V0Tm9kZSA9IHN0cnVjdExheW91dE5vZGU7XHJcblx0XHR0aGlzLnZhbHVlcyA9IHZhbHVlcztcclxuXHJcblx0XHR0aGlzLmlzU3RydWN0Tm9kZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuc3RydWN0TGF5b3V0Tm9kZS5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdGdldE1lbWJlclR5cGUoIGJ1aWxkZXIsIG5hbWUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuc3RydWN0TGF5b3V0Tm9kZS5nZXRNZW1iZXJUeXBlKCBidWlsZGVyLCBuYW1lICk7XHJcblxyXG5cdH1cclxuXHJcblx0Z2VuZXJhdGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3Qgbm9kZVZhciA9IGJ1aWxkZXIuZ2V0VmFyRnJvbU5vZGUoIHRoaXMgKTtcclxuXHRcdGNvbnN0IHN0cnVjdFR5cGUgPSBub2RlVmFyLnR5cGU7XHJcblx0XHRjb25zdCBwcm9wZXJ0eU5hbWUgPSBidWlsZGVyLmdldFByb3BlcnR5TmFtZSggbm9kZVZhciApO1xyXG5cclxuXHRcdGJ1aWxkZXIuYWRkTGluZUZsb3dDb2RlKCBgJHsgcHJvcGVydHlOYW1lIH0gPSAkeyBidWlsZGVyLmdlbmVyYXRlU3RydWN0KCBzdHJ1Y3RUeXBlLCB0aGlzLnN0cnVjdExheW91dE5vZGUubWVtYmVyc0xheW91dCwgdGhpcy52YWx1ZXMgKSB9YCwgdGhpcyApO1xyXG5cclxuXHRcdHJldHVybiBub2RlVmFyLm5hbWU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFN0cnVjdE5vZGU7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIHN0cnVjdCBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge09iamVjdH0gbWVtYmVyc0xheW91dCAtIFRoZSBsYXlvdXQgb2YgdGhlIHN0cnVjdCBtZW1iZXJzLlxyXG4gKiBAcGFyYW0gez9zdHJpbmd9IFtuYW1lPW51bGxdIC0gVGhlIG5hbWUgb2YgdGhlIHN0cnVjdC5cclxuICogQHJldHVybnMge0Z1bmN0aW9ufSBUaGUgc3RydWN0IGZ1bmN0aW9uLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHN0cnVjdCA9ICggbWVtYmVyc0xheW91dCwgbmFtZSA9IG51bGwgKSA9PiB7XHJcblxyXG5cdGNvbnN0IHN0cnVjdExheW91dCA9IG5ldyBTdHJ1Y3RUeXBlTm9kZSggbWVtYmVyc0xheW91dCwgbmFtZSApO1xyXG5cclxuXHRjb25zdCBzdHJ1Y3QgPSAoIC4uLnBhcmFtcyApID0+IHtcclxuXHJcblx0XHRsZXQgdmFsdWVzID0gbnVsbDtcclxuXHJcblx0XHRpZiAoIHBhcmFtcy5sZW5ndGggPiAwICkge1xyXG5cclxuXHRcdFx0aWYgKCBwYXJhbXNbIDAgXS5pc05vZGUgKSB7XHJcblxyXG5cdFx0XHRcdHZhbHVlcyA9IHt9O1xyXG5cclxuXHRcdFx0XHRjb25zdCBuYW1lcyA9IE9iamVjdC5rZXlzKCBtZW1iZXJzTGF5b3V0ICk7XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0dmFsdWVzWyBuYW1lc1sgaSBdIF0gPSBwYXJhbXNbIGkgXTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0dmFsdWVzID0gcGFyYW1zWyAwIF07XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBub2RlT2JqZWN0KCBuZXcgU3RydWN0Tm9kZSggc3RydWN0TGF5b3V0LCB2YWx1ZXMgKSApO1xyXG5cclxuXHR9O1xyXG5cclxuXHRzdHJ1Y3QubGF5b3V0ID0gc3RydWN0TGF5b3V0O1xyXG5cdHN0cnVjdC5pc1N0cnVjdCA9IHRydWU7XHJcblxyXG5cdHJldHVybiBzdHJ1Y3Q7XHJcblxyXG59O1xyXG4iLCJpbXBvcnQgTm9kZSBmcm9tICcuL05vZGUuanMnO1xyXG5pbXBvcnQgeyBub2RlUHJveHkgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBub2RlIGNhbiBiZSB1c2VkIHRvIGRlZmluZSBtdWx0aXBsZSBvdXRwdXRzIGluIGEgc2hhZGVyIHByb2dyYW1zLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTm9kZVxyXG4gKi9cclxuY2xhc3MgT3V0cHV0U3RydWN0Tm9kZSBleHRlbmRzIE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdPdXRwdXRTdHJ1Y3ROb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG91dHB1dCBzdHJ1Y3Qgbm9kZS4gVGhlIGNvbnN0cnVjdG9yIGNhbiBiZSBpbnZva2VkIHdpdGggYW5cclxuXHQgKiBhcmJpdHJhcnkgbnVtYmVyIG9mIG5vZGVzIHJlcHJlc2VudGluZyB0aGUgbWVtYmVycy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Li4uTm9kZX0gbWVtYmVycyAtIEEgcGFyYW1ldGVyIGxpc3Qgb2Ygbm9kZXMuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIC4uLm1lbWJlcnMgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIGFycmF5IG9mIG5vZGVzIHdoaWNoIGRlZmluZXMgdGhlIG91dHB1dC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8Tm9kZT59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWVtYmVycyA9IG1lbWJlcnM7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzT3V0cHV0U3RydWN0Tm9kZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgcHJvcGVydGllcyA9IGJ1aWxkZXIuZ2V0Tm9kZVByb3BlcnRpZXMoIHRoaXMgKTtcclxuXHJcblx0XHRpZiAoIHByb3BlcnRpZXMubWVtYmVyc0xheW91dCA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Y29uc3QgbWVtYmVycyA9IHRoaXMubWVtYmVycztcclxuXHRcdFx0Y29uc3QgbWVtYmVyc0xheW91dCA9IFtdO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IG5hbWUgPSAnbScgKyBpO1xyXG5cdFx0XHRcdGNvbnN0IHR5cGUgPSBtZW1iZXJzWyBpIF0uZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRcdFx0bWVtYmVyc0xheW91dC5wdXNoKCB7IG5hbWUsIHR5cGUsIGluZGV4OiBpIH0gKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHByb3BlcnRpZXMubWVtYmVyc0xheW91dCA9IG1lbWJlcnNMYXlvdXQ7XHJcblx0XHRcdHByb3BlcnRpZXMuc3RydWN0VHlwZSA9IGJ1aWxkZXIuZ2V0T3V0cHV0U3RydWN0VHlwZUZyb21Ob2RlKCB0aGlzLCBwcm9wZXJ0aWVzLm1lbWJlcnNMYXlvdXQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHByb3BlcnRpZXMuc3RydWN0VHlwZS5uYW1lO1xyXG5cclxuXHR9XHJcblxyXG5cdGdlbmVyYXRlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IHByb3BlcnR5TmFtZSA9IGJ1aWxkZXIuZ2V0T3V0cHV0U3RydWN0TmFtZSgpO1xyXG5cdFx0Y29uc3QgbWVtYmVycyA9IHRoaXMubWVtYmVycztcclxuXHJcblx0XHRjb25zdCBzdHJ1Y3RQcmVmaXggPSBwcm9wZXJ0eU5hbWUgIT09ICcnID8gcHJvcGVydHlOYW1lICsgJy4nIDogJyc7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBzbmlwcGV0ID0gbWVtYmVyc1sgaSBdLmJ1aWxkKCBidWlsZGVyICk7XHJcblxyXG5cdFx0XHRidWlsZGVyLmFkZExpbmVGbG93Q29kZSggYCR7IHN0cnVjdFByZWZpeCB9bSR7IGkgfSA9ICR7IHNuaXBwZXQgfWAsIHRoaXMgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHByb3BlcnR5TmFtZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgT3V0cHV0U3RydWN0Tm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGFuIG91dHB1dCBzdHJ1Y3Qgbm9kZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHsuLi5Ob2RlfSBtZW1iZXJzIC0gQSBwYXJhbWV0ZXIgbGlzdCBvZiBub2Rlcy5cclxuICogQHJldHVybnMge091dHB1dFN0cnVjdE5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgb3V0cHV0U3RydWN0ID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIE91dHB1dFN0cnVjdE5vZGUgKTtcclxuIiwiaW1wb3J0IE91dHB1dFN0cnVjdE5vZGUgZnJvbSAnLi9PdXRwdXRTdHJ1Y3ROb2RlLmpzJztcclxuaW1wb3J0IHsgbm9kZVByb3h5LCB2ZWM0IH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIE1SVCB0ZXh0dXJlIGluZGV4IGZvciB0aGUgZ2l2ZW4gbmFtZS5cclxuICpcclxuICogQHBhcmFtIHtBcnJheTxUZXh0dXJlPn0gdGV4dHVyZXMgLSBUaGUgdGV4dHVyZXMgb2YgYSBNUlQtY29uZmlndXJlZCByZW5kZXIgdGFyZ2V0LlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBNUlQgdGV4dHVyZSB3aGljaCBpbmRleCBpcyByZXF1ZXN0ZWQuXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIHRleHR1cmUgaW5kZXguXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGV4dHVyZUluZGV4KCB0ZXh0dXJlcywgbmFtZSApIHtcclxuXHJcblx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdGV4dHVyZXMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdGlmICggdGV4dHVyZXNbIGkgXS5uYW1lID09PSBuYW1lICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIGk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdHJldHVybiAtIDE7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogVGhpcyBub2RlIGNhbiBiZSB1c2VkIHNldHVwIGEgTVJUIGNvbnRleHQgZm9yIHJlbmRlcmluZy4gQSB0eXBpY2FsIE1SVCBzZXR1cCBmb3JcclxuICogcG9zdC1wcm9jZXNzaW5nIGlzIHNob3duIGJlbG93OlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBtcnROb2RlID0gbXJ0KCB7XHJcbiAqICAgb3V0cHV0OiBvdXRwdXQsXHJcbiAqICAgbm9ybWFsOiBub3JtYWxWaWV3XHJcbiAqIH0gKSApO1xyXG4gKiBgYGBcclxuICogVGhlIE1SVCBvdXRwdXQgaXMgZGVmaW5lZCBhcyBhIGRpY3Rpb25hcnkuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBPdXRwdXRTdHJ1Y3ROb2RlXHJcbiAqL1xyXG5jbGFzcyBNUlROb2RlIGV4dGVuZHMgT3V0cHV0U3RydWN0Tm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ01SVE5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgb3V0cHV0IHN0cnVjdCBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3Q8c3RyaW5nLCBOb2RlPn0gb3V0cHV0Tm9kZXMgLSBUaGUgTVJUIG91dHB1dHMuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG91dHB1dE5vZGVzICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGRpY3Rpb25hcnkgcmVwcmVzZW50aW5nIHRoZSBNUlQgb3V0cHV0cy4gVGhlIGtleVxyXG5cdFx0ICogaXMgdGhlIG5hbWUgb2YgdGhlIG91dHB1dCwgdGhlIHZhbHVlIHRoZSBub2RlIHdoaWNoIHByb2R1Y2VzXHJcblx0XHQgKiB0aGUgb3V0cHV0IHJlc3VsdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0PHN0cmluZywgTm9kZT59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMub3V0cHV0Tm9kZXMgPSBvdXRwdXROb2RlcztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNNUlROb2RlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgTVJUIG5vZGUgaGFzIGFuIG91dHB1dCB3aXRoIHRoZSBnaXZlbiBuYW1lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgb3V0cHV0LlxyXG5cdCAqIEByZXR1cm4ge05vZGVCdWlsZGVyfSBXaGV0aGVyIHRoZSBNUlQgbm9kZSBoYXMgYW4gb3V0cHV0IGZvciB0aGUgZ2l2ZW4gbmFtZSBvciBub3QuXHJcblx0ICovXHJcblx0aGFzKCBuYW1lICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm91dHB1dE5vZGVzWyBuYW1lIF0gIT09IHVuZGVmaW5lZDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBvdXRwdXQgbm9kZSBmb3IgdGhlIGdpdmVuIG5hbWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBvdXRwdXQuXHJcblx0ICogQHJldHVybiB7Tm9kZX0gVGhlIG91dHB1dCBub2RlLlxyXG5cdCAqL1xyXG5cdGdldCggbmFtZSApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5vdXRwdXROb2Rlc1sgbmFtZSBdO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE1lcmdlcyB0aGUgb3V0cHV0cyBvZiB0aGUgZ2l2ZW4gTVJUIG5vZGUgd2l0aCB0aGUgb3V0cHV0cyBvZiB0aGlzIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01SVE5vZGV9IG1ydE5vZGUgLSBUaGUgTVJUIHRvIG1lcmdlLlxyXG5cdCAqIEByZXR1cm4ge01SVE5vZGV9IEEgbmV3IE1SVCBub2RlIHdpdGggbWVyZ2VkIG91dHB1dHMuLlxyXG5cdCAqL1xyXG5cdG1lcmdlKCBtcnROb2RlICkge1xyXG5cclxuXHRcdGNvbnN0IG91dHB1dHMgPSB7IC4uLnRoaXMub3V0cHV0Tm9kZXMsIC4uLm1ydE5vZGUub3V0cHV0Tm9kZXMgfTtcclxuXHJcblx0XHRyZXR1cm4gbXJ0KCBvdXRwdXRzICk7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXAoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3Qgb3V0cHV0Tm9kZXMgPSB0aGlzLm91dHB1dE5vZGVzO1xyXG5cdFx0Y29uc3QgbXJ0ID0gYnVpbGRlci5yZW5kZXJlci5nZXRSZW5kZXJUYXJnZXQoKTtcclxuXHJcblx0XHRjb25zdCBtZW1iZXJzID0gW107XHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZXMgPSBtcnQudGV4dHVyZXM7XHJcblxyXG5cdFx0Zm9yICggY29uc3QgbmFtZSBpbiBvdXRwdXROb2RlcyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGluZGV4ID0gZ2V0VGV4dHVyZUluZGV4KCB0ZXh0dXJlcywgbmFtZSApO1xyXG5cclxuXHRcdFx0bWVtYmVyc1sgaW5kZXggXSA9IHZlYzQoIG91dHB1dE5vZGVzWyBuYW1lIF0gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5tZW1iZXJzID0gbWVtYmVycztcclxuXHJcblx0XHRyZXR1cm4gc3VwZXIuc2V0dXAoIGJ1aWxkZXIgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTVJUTm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgTVJUIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7T2JqZWN0PHN0cmluZywgTm9kZT59IG91dHB1dE5vZGVzIC0gVGhlIE1SVCBvdXRwdXRzLlxyXG4gKiBAcmV0dXJucyB7TVJUTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBtcnQgPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggTVJUTm9kZSApO1xyXG4iLCJpbXBvcnQgeyBGbiB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBHZW5lcmF0ZXMgYSBoYXNoIHZhbHVlIGluIHRoZSByYW5nZSBgWzAsIDFdYCBmcm9tIHRoZSBnaXZlbiBzZWVkLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSBzZWVkIC0gVGhlIHNlZWQuXHJcbiAqIEByZXR1cm4ge05vZGU8ZmxvYXQ+fSBUaGUgaGFzaCB2YWx1ZS5cclxuICovXHJcbmV4cG9ydCBjb25zdCBoYXNoID0gLypAX19QVVJFX18qLyBGbiggKCBbIHNlZWQgXSApID0+IHtcclxuXHJcblx0Ly8gVGFrZW4gZnJvbSBodHRwczovL3d3dy5zaGFkZXJ0b3kuY29tL3ZpZXcvWGxHY1JoLCBvcmlnaW5hbGx5IGZyb20gcGNnLXJhbmRvbS5vcmdcclxuXHJcblx0Y29uc3Qgc3RhdGUgPSBzZWVkLnRvVWludCgpLm11bCggNzQ3Nzk2NDA1ICkuYWRkKCAyODkxMzM2NDUzICk7XHJcblx0Y29uc3Qgd29yZCA9IHN0YXRlLnNoaWZ0UmlnaHQoIHN0YXRlLnNoaWZ0UmlnaHQoIDI4ICkuYWRkKCA0ICkgKS5iaXRYb3IoIHN0YXRlICkubXVsKCAyNzc4MDM3MzcgKTtcclxuXHRjb25zdCByZXN1bHQgPSB3b3JkLnNoaWZ0UmlnaHQoIDIyICkuYml0WG9yKCB3b3JkICk7XHJcblxyXG5cdHJldHVybiByZXN1bHQudG9GbG9hdCgpLm11bCggMSAvIDIgKiogMzIgKTsgLy8gQ29udmVydCB0byByYW5nZSBbMCwgMSlcclxuXHJcbn0gKTtcclxuIiwiaW1wb3J0IHsgc3ViLCBtdWwsIGRpdiwgYWRkIH0gZnJvbSAnLi9PcGVyYXRvck5vZGUuanMnO1xyXG5pbXBvcnQgeyBQSSwgcG93LCBzaW4gfSBmcm9tICcuL01hdGhOb2RlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIGZ1bmN0aW9uIHRoYXQgcmVtYXBzIHRoZSBgWzAsMV1gIGludGVydmFsIGludG8gdGhlIGBbMCwxXWAgaW50ZXJ2YWwuXHJcbiAqIFRoZSBjb3JuZXJzIGFyZSBtYXBwZWQgdG8gYDBgIGFuZCB0aGUgY2VudGVyIHRvIGAxYC5cclxuICogUmVmZXJlbmNlOiB7QGxpbmsgaHR0cHM6Ly9pcXVpbGV6bGVzLm9yZy9hcnRpY2xlcy9mdW5jdGlvbnMvfS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlPGZsb2F0Pn0geCAtIFRoZSB2YWx1ZSB0byByZW1hcC5cclxuICogQHBhcmFtIHtOb2RlPGZsb2F0Pn0gayAtIEFsbG93cyB0byBjb250cm9sIHRoZSByZW1hcHBpbmcgZnVuY3Rpb25zIHNoYXBlIGJ5IHJpc2luZyB0aGUgcGFyYWJvbGEgdG8gYSBwb3dlciBga2AuXHJcbiAqIEByZXR1cm4ge05vZGU8ZmxvYXQ+fSBUaGUgcmVtYXBwZWQgdmFsdWUuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcGFyYWJvbGEgPSAoIHgsIGsgKSA9PiBwb3coIG11bCggNC4wLCB4Lm11bCggc3ViKCAxLjAsIHggKSApICksIGsgKTtcclxuXHJcbi8qKlxyXG4gKiBBIGZ1bmN0aW9uIHRoYXQgcmVtYXBzIHRoZSBgWzAsMV1gIGludGVydmFsIGludG8gdGhlIGBbMCwxXWAgaW50ZXJ2YWwuXHJcbiAqIEV4cGFuZHMgdGhlIHNpZGVzIGFuZCBjb21wcmVzc2VzIHRoZSBjZW50ZXIsIGFuZCBrZWVwcyBgMC41YCBtYXBwZWQgdG8gYDAuNWAuXHJcbiAqIFJlZmVyZW5jZToge0BsaW5rIGh0dHBzOi8vaXF1aWxlemxlcy5vcmcvYXJ0aWNsZXMvZnVuY3Rpb25zL30uXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTxmbG9hdD59IHggLSBUaGUgdmFsdWUgdG8gcmVtYXAuXHJcbiAqIEBwYXJhbSB7Tm9kZTxmbG9hdD59IGsgLSBgaz0xYCBpcyB0aGUgaWRlbnRpdHkgY3VydmUsYGs8MWAgcHJvZHVjZXMgdGhlIGNsYXNzaWMgYGdhaW4oKWAgc2hhcGUsIGFuZCBgaz4xYCBwcm9kdWNlcyBcInNcIiBzaGFwZWQgY3VydmVzLlxyXG4gKiBAcmV0dXJuIHtOb2RlPGZsb2F0Pn0gVGhlIHJlbWFwcGVkIHZhbHVlLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGdhaW4gPSAoIHgsIGsgKSA9PiB4Lmxlc3NUaGFuKCAwLjUgKSA/IHBhcmFib2xhKCB4Lm11bCggMi4wICksIGsgKS5kaXYoIDIuMCApIDogc3ViKCAxLjAsIHBhcmFib2xhKCBtdWwoIHN1YiggMS4wLCB4ICksIDIuMCApLCBrICkuZGl2KCAyLjAgKSApO1xyXG5cclxuLyoqXHJcbiAqIEEgZnVuY3Rpb24gdGhhdCByZW1hcHMgdGhlIGBbMCwxXWAgaW50ZXJ2YWwgaW50byB0aGUgYFswLDFdYCBpbnRlcnZhbC5cclxuICogQSBnZW5lcmFsaXphdGlvbiBvZiB0aGUgYHBhcmFib2xhKClgLiBLZWVwcyB0aGUgY29ybmVycyBtYXBwZWQgdG8gMCBidXQgYWxsb3dzIHRoZSBjb250cm9sIG9mIHRoZSBzaGFwZSBvbmUgZWl0aGVyIHNpZGUgb2YgdGhlIGN1cnZlLlxyXG4gKiBSZWZlcmVuY2U6IHtAbGluayBodHRwczovL2lxdWlsZXpsZXMub3JnL2FydGljbGVzL2Z1bmN0aW9ucy99LlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSB4IC0gVGhlIHZhbHVlIHRvIHJlbWFwLlxyXG4gKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSBhIC0gRmlyc3QgY29udHJvbCBwYXJhbWV0ZXIuXHJcbiAqIEBwYXJhbSB7Tm9kZTxmbG9hdD59IGIgLSBTZWNvbmQgY29udHJvbCBwYXJhbWV0ZXIuXHJcbiAqIEByZXR1cm4ge05vZGU8ZmxvYXQ+fSBUaGUgcmVtYXBwZWQgdmFsdWUuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcGN1cnZlID0gKCB4LCBhLCBiICkgPT4gcG93KCBkaXYoIHBvdyggeCwgYSApLCBhZGQoIHBvdyggeCwgYSApLCBwb3coIHN1YiggMS4wLCB4ICksIGIgKSApICksIDEuMCAvIGEgKTtcclxuXHJcbi8qKlxyXG4gKiBBIHBoYXNlIHNoaWZ0ZWQgc2ludXMgY3VydmUgdGhhdCBzdGFydHMgYXQgemVybyBhbmQgZW5kcyBhdCB6ZXJvLCB3aXRoIGJvdW5jaW5nIGJlaGF2aW9yLlxyXG4gKiBSZWZlcmVuY2U6IHtAbGluayBodHRwczovL2lxdWlsZXpsZXMub3JnL2FydGljbGVzL2Z1bmN0aW9ucy99LlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSB4IC0gVGhlIHZhbHVlIHRvIGNvbXB1dGUgdGhlIHNpbiBmb3IuXHJcbiAqIEBwYXJhbSB7Tm9kZTxmbG9hdD59IGsgLSBDb250cm9scyB0aGUgYW1vdW50IG9mIGJvdW5jZXMuXHJcbiAqIEByZXR1cm4ge05vZGU8ZmxvYXQ+fSBUaGUgcmVzdWx0IHZhbHVlLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHNpbmMgPSAoIHgsIGsgKSA9PiBzaW4oIFBJLm11bCggay5tdWwoIHggKS5zdWIoIDEuMCApICkgKS5kaXYoIFBJLm11bCggay5tdWwoIHggKS5zdWIoIDEuMCApICkgKTtcclxuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL2NhYmJpYm8vZ2xzbC10cmktbm9pc2UtM2RcclxuXHJcbmltcG9ydCB7IExvb3AgfSBmcm9tICcuLi91dGlscy9Mb29wTm9kZS5qcyc7XHJcbmltcG9ydCB7IGZsb2F0LCB2ZWMzLCBGbiB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbmNvbnN0IHRyaSA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyB4IF0gKSA9PiB7XHJcblxyXG5cdHJldHVybiB4LmZyYWN0KCkuc3ViKCAuNSApLmFicygpO1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICd0cmknLFxyXG5cdHR5cGU6ICdmbG9hdCcsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICd4JywgdHlwZTogJ2Zsb2F0JyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5jb25zdCB0cmkzID0gLypAX19QVVJFX18qLyBGbiggKCBbIHAgXSApID0+IHtcclxuXHJcblx0cmV0dXJuIHZlYzMoIHRyaSggcC56LmFkZCggdHJpKCBwLnkubXVsKCAxLiApICkgKSApLCB0cmkoIHAuei5hZGQoIHRyaSggcC54Lm11bCggMS4gKSApICkgKSwgdHJpKCBwLnkuYWRkKCB0cmkoIHAueC5tdWwoIDEuICkgKSApICkgKTtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAndHJpMycsXHJcblx0dHlwZTogJ3ZlYzMnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAncCcsIHR5cGU6ICd2ZWMzJyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG4vKipcclxuICogR2VuZXJhdGVzIGEgbm9pc2UgdmFsdWUgZnJvbSB0aGUgZ2l2ZW4gcG9zaXRpb24sIHNwZWVkIGFuZCB0aW1lIHBhcmFtZXRlcnMuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMzPn0gcG9zaXRpb24gLSBUaGUgcG9zaXRpb24uXHJcbiAqIEBwYXJhbSB7Tm9kZTxmbG9hdD59IHNwZWVkIC0gVGhlIHNwZWVkLlxyXG4gKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSB0aW1lIC0gVGhlIHRpbWUuXHJcbiAqIEByZXR1cm4ge05vZGU8ZmxvYXQ+fSBUaGUgZ2VuZXJhdGVkIG5vaXNlLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHRyaU5vaXNlM0QgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgcG9zaXRpb24sIHNwZWVkLCB0aW1lIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IHAgPSB2ZWMzKCBwb3NpdGlvbiApLnRvVmFyKCk7XHJcblx0Y29uc3QgeiA9IGZsb2F0KCAxLjQgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHJ6ID0gZmxvYXQoIDAuMCApLnRvVmFyKCk7XHJcblx0Y29uc3QgYnAgPSB2ZWMzKCBwICkudG9WYXIoKTtcclxuXHJcblx0TG9vcCggeyBzdGFydDogZmxvYXQoIDAuMCApLCBlbmQ6IGZsb2F0KCAzLjAgKSwgdHlwZTogJ2Zsb2F0JywgY29uZGl0aW9uOiAnPD0nIH0sICgpID0+IHtcclxuXHJcblx0XHRjb25zdCBkZyA9IHZlYzMoIHRyaTMoIGJwLm11bCggMi4wICkgKSApLnRvVmFyKCk7XHJcblx0XHRwLmFkZEFzc2lnbiggZGcuYWRkKCB0aW1lLm11bCggZmxvYXQoIDAuMSApLm11bCggc3BlZWQgKSApICkgKTtcclxuXHRcdGJwLm11bEFzc2lnbiggMS44ICk7XHJcblx0XHR6Lm11bEFzc2lnbiggMS41ICk7XHJcblx0XHRwLm11bEFzc2lnbiggMS4yICk7XHJcblxyXG5cdFx0Y29uc3QgdCA9IGZsb2F0KCB0cmkoIHAuei5hZGQoIHRyaSggcC54LmFkZCggdHJpKCBwLnkgKSApICkgKSApICkudG9WYXIoKTtcclxuXHRcdHJ6LmFkZEFzc2lnbiggdC5kaXYoIHogKSApO1xyXG5cdFx0YnAuYWRkQXNzaWduKCAwLjE0ICk7XHJcblxyXG5cdH0gKTtcclxuXHJcblx0cmV0dXJuIHJ6O1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICd0cmlOb2lzZTNEJyxcclxuXHR0eXBlOiAnZmxvYXQnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAncG9zaXRpb24nLCB0eXBlOiAndmVjMycgfSxcclxuXHRcdHsgbmFtZTogJ3NwZWVkJywgdHlwZTogJ2Zsb2F0JyB9LFxyXG5cdFx0eyBuYW1lOiAndGltZScsIHR5cGU6ICdmbG9hdCcgfVxyXG5cdF1cclxufSApO1xyXG4iLCJpbXBvcnQgTm9kZSBmcm9tICcuLi9jb3JlL05vZGUuanMnO1xyXG5pbXBvcnQgeyBub2RlUHJveHkgfSBmcm9tICcuLi90c2wvVFNMQ29yZS5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBjbGFzcyBhbGxvd3MgdG8gZGVmaW5lIG11bHRpcGxlIG92ZXJsb2FkZWQgdmVyc2lvbnNcclxuICogb2YgdGhlIHNhbWUgZnVuY3Rpb24uIERlcGVuZGluZyBvbiB0aGUgcGFyYW1ldGVycyBvZiB0aGUgZnVuY3Rpb25cclxuICogY2FsbCwgdGhlIG5vZGUgcGlja3MgdGhlIGJlc3QtZml0IG92ZXJsb2FkZWQgdmVyc2lvbi5cclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVcclxuICovXHJcbmNsYXNzIEZ1bmN0aW9uT3ZlcmxvYWRpbmdOb2RlIGV4dGVuZHMgTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ0Z1bmN0aW9uT3ZlcmxvYWRpbmdOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGZ1bmN0aW9uIG92ZXJsb2FkaW5nIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FycmF5PEZ1bmN0aW9uPn0gZnVuY3Rpb25Ob2RlcyAtIEFycmF5IG9mIGBGbmAgZnVuY3Rpb24gZGVmaW5pdGlvbnMuXHJcblx0ICogQHBhcmFtIHsuLi5Ob2RlfSBwYXJhbWV0ZXJzTm9kZXMgLSBBIGxpc3Qgb2YgcGFyYW1ldGVyIG5vZGVzLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBmdW5jdGlvbk5vZGVzID0gW10sIC4uLnBhcmFtZXRlcnNOb2RlcyApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQXJyYXkgb2YgYEZuYCBmdW5jdGlvbiBkZWZpbml0aW9ucy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8RnVuY3Rpb24+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZ1bmN0aW9uTm9kZXMgPSBmdW5jdGlvbk5vZGVzO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBsaXN0IG9mIHBhcmFtZXRlciBub2Rlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8Tm9kZT59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucGFyYW1ldGVyc05vZGVzID0gcGFyYW1ldGVyc05vZGVzO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHNlbGVjdGVkIG92ZXJsb2FkZWQgZnVuY3Rpb24gY2FsbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge1NoYWRlckNhbGxOb2RlSW50ZXJuYWx9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX2NhbmRpZGF0ZUZuQ2FsbCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIG5vZGUgaXMgbWFya2VkIGFzIGdsb2JhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nbG9iYWwgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGlzIG92ZXJ3cml0dGVuIHNpbmNlIHRoZSBub2RlIHR5cGUgaXMgaW5mZXJyZWQgZnJvbVxyXG5cdCAqIHRoZSBmdW5jdGlvbidzIHJldHVybiB0eXBlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBub2RlIHR5cGUuXHJcblx0ICovXHJcblx0Z2V0Tm9kZVR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZnVuY3Rpb25Ob2Rlc1sgMCBdLnNoYWRlck5vZGUubGF5b3V0LnR5cGU7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXAoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgcGFyYW1zID0gdGhpcy5wYXJhbWV0ZXJzTm9kZXM7XHJcblxyXG5cdFx0bGV0IGNhbmRpZGF0ZUZuQ2FsbCA9IHRoaXMuX2NhbmRpZGF0ZUZuQ2FsbDtcclxuXHJcblx0XHRpZiAoIGNhbmRpZGF0ZUZuQ2FsbCA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGxldCBjYW5kaWRhdGVGbiA9IG51bGw7XHJcblx0XHRcdGxldCBjYW5kaWRhdGVTY29yZSA9IC0gMTtcclxuXHJcblx0XHRcdGZvciAoIGNvbnN0IGZ1bmN0aW9uTm9kZSBvZiB0aGlzLmZ1bmN0aW9uTm9kZXMgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHNoYWRlck5vZGUgPSBmdW5jdGlvbk5vZGUuc2hhZGVyTm9kZTtcclxuXHRcdFx0XHRjb25zdCBsYXlvdXQgPSBzaGFkZXJOb2RlLmxheW91dDtcclxuXHJcblx0XHRcdFx0aWYgKCBsYXlvdXQgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnRnVuY3Rpb25PdmVybG9hZGluZ05vZGU6IEZ1bmN0aW9uTm9kZSBtdXN0IGJlIGEgbGF5b3V0LicgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRjb25zdCBpbnB1dHMgPSBsYXlvdXQuaW5wdXRzO1xyXG5cclxuXHRcdFx0XHRpZiAoIHBhcmFtcy5sZW5ndGggPT09IGlucHV0cy5sZW5ndGggKSB7XHJcblxyXG5cdFx0XHRcdFx0bGV0IHNjb3JlID0gMDtcclxuXHJcblx0XHRcdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgcGFyYW0gPSBwYXJhbXNbIGkgXTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgaW5wdXQgPSBpbnB1dHNbIGkgXTtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggcGFyYW0uZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKSA9PT0gaW5wdXQudHlwZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0c2NvcmUgKys7XHJcblxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRzY29yZSA9IDA7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGlmICggc2NvcmUgPiBjYW5kaWRhdGVTY29yZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNhbmRpZGF0ZUZuID0gZnVuY3Rpb25Ob2RlO1xyXG5cdFx0XHRcdFx0XHRjYW5kaWRhdGVTY29yZSA9IHNjb3JlO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5fY2FuZGlkYXRlRm5DYWxsID0gY2FuZGlkYXRlRm5DYWxsID0gY2FuZGlkYXRlRm4oIC4uLnBhcmFtcyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gY2FuZGlkYXRlRm5DYWxsO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBGdW5jdGlvbk92ZXJsb2FkaW5nTm9kZTtcclxuXHJcbmNvbnN0IG92ZXJsb2FkaW5nQmFzZUZuID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIEZ1bmN0aW9uT3ZlcmxvYWRpbmdOb2RlICk7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIGZ1bmN0aW9uIG92ZXJsb2FkaW5nIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7QXJyYXk8RnVuY3Rpb24+fSBmdW5jdGlvbk5vZGVzIC0gQXJyYXkgb2YgYEZuYCBmdW5jdGlvbiBkZWZpbml0aW9ucy5cclxuICogQHJldHVybnMge0Z1bmN0aW9uT3ZlcmxvYWRpbmdOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG92ZXJsb2FkaW5nRm4gPSAoIGZ1bmN0aW9uTm9kZXMgKSA9PiAoIC4uLnBhcmFtcyApID0+IG92ZXJsb2FkaW5nQmFzZUZuKCBmdW5jdGlvbk5vZGVzLCAuLi5wYXJhbXMgKTtcclxuIiwiaW1wb3J0IHsgcmVuZGVyR3JvdXAgfSBmcm9tICcuLi9jb3JlL1VuaWZvcm1Hcm91cE5vZGUuanMnO1xyXG5pbXBvcnQgeyB1bmlmb3JtIH0gZnJvbSAnLi4vY29yZS9Vbmlmb3JtTm9kZS5qcyc7XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyB0aGUgZWxhcHNlZCB0aW1lIGluIHNlY29uZHMuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1VuaWZvcm1Ob2RlPGZsb2F0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCB0aW1lID0gLypAX19QVVJFX18qLyB1bmlmb3JtKCAwICkuc2V0R3JvdXAoIHJlbmRlckdyb3VwICkub25SZW5kZXJVcGRhdGUoICggZnJhbWUgKSA9PiBmcmFtZS50aW1lICk7XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyB0aGUgZGVsdGEgdGltZSBpbiBzZWNvbmRzLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtVbmlmb3JtTm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZGVsdGFUaW1lID0gLypAX19QVVJFX18qLyB1bmlmb3JtKCAwICkuc2V0R3JvdXAoIHJlbmRlckdyb3VwICkub25SZW5kZXJVcGRhdGUoICggZnJhbWUgKSA9PiBmcmFtZS5kZWx0YVRpbWUgKTtcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIHRoZSBjdXJyZW50IGZyYW1lIElELlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtVbmlmb3JtTm9kZTx1aW50Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBmcmFtZUlkID0gLypAX19QVVJFX18qLyB1bmlmb3JtKCAwLCAndWludCcgKS5zZXRHcm91cCggcmVuZGVyR3JvdXAgKS5vblJlbmRlclVwZGF0ZSggKCBmcmFtZSApID0+IGZyYW1lLmZyYW1lSWQgKTtcclxuXHJcbi8vIERlcHJlY2F0ZWRcclxuXHJcbi8qKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAZGVwcmVjYXRlZCBzaW5jZSByMTcwLiBVc2Uge0BsaW5rIHRpbWV9IGluc3RlYWQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbdGltZVNjYWxlPTFdIC0gVGhlIHRpbWUgc2NhbGUuXHJcbiAqIEByZXR1cm5zIHtVbmlmb3JtTm9kZTxmbG9hdD59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdGltZXJMb2NhbCA9ICggdGltZVNjYWxlID0gMSApID0+IHsgLy8gQGRlcHJlY2F0ZWQsIHIxNzBcclxuXHJcblx0Y29uc29sZS53YXJuKCAnVFNMOiB0aW1lckxvY2FsKCkgaXMgZGVwcmVjYXRlZC4gVXNlIFwidGltZVwiIGluc3RlYWQuJyApO1xyXG5cdHJldHVybiB0aW1lLm11bCggdGltZVNjYWxlICk7XHJcblxyXG59O1xyXG5cclxuLyoqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBkZXByZWNhdGVkIHNpbmNlIHIxNzAuIFVzZSB7QGxpbmsgdGltZX0gaW5zdGVhZC5cclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IFt0aW1lU2NhbGU9MV0gLSBUaGUgdGltZSBzY2FsZS5cclxuICogQHJldHVybnMge1VuaWZvcm1Ob2RlPGZsb2F0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCB0aW1lckdsb2JhbCA9ICggdGltZVNjYWxlID0gMSApID0+IHsgLy8gQGRlcHJlY2F0ZWQsIHIxNzBcclxuXHJcblx0Y29uc29sZS53YXJuKCAnVFNMOiB0aW1lckdsb2JhbCgpIGlzIGRlcHJlY2F0ZWQuIFVzZSBcInRpbWVcIiBpbnN0ZWFkLicgKTtcclxuXHRyZXR1cm4gdGltZS5tdWwoIHRpbWVTY2FsZSApO1xyXG5cclxufTtcclxuXHJcbi8qKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAZGVwcmVjYXRlZCBzaW5jZSByMTcwLiBVc2Uge0BsaW5rIGRlbHRhVGltZX0gaW5zdGVhZC5cclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IFt0aW1lU2NhbGU9MV0gLSBUaGUgdGltZSBzY2FsZS5cclxuICogQHJldHVybnMge1VuaWZvcm1Ob2RlPGZsb2F0Pn1cclxuICovXHJcbmV4cG9ydCBjb25zdCB0aW1lckRlbHRhID0gKCB0aW1lU2NhbGUgPSAxICkgPT4geyAvLyBAZGVwcmVjYXRlZCwgcjE3MFxyXG5cclxuXHRjb25zb2xlLndhcm4oICdUU0w6IHRpbWVyRGVsdGEoKSBpcyBkZXByZWNhdGVkLiBVc2UgXCJkZWx0YVRpbWVcIiBpbnN0ZWFkLicgKTtcclxuXHRyZXR1cm4gZGVsdGFUaW1lLm11bCggdGltZVNjYWxlICk7XHJcblxyXG59O1xyXG4iLCJpbXBvcnQgeyB0aW1lIH0gZnJvbSAnLi9UaW1lci5qcyc7XHJcblxyXG4vKipcclxuICogR2VuZXJhdGVzIGEgc2luZSB3YXZlIG9zY2lsbGF0aW9uIGJhc2VkIG9uIGEgdGltZXIuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTxmbG9hdD59IHQgLSBUaGUgdGltZXIgdG8gZ2VuZXJhdGUgdGhlIG9zY2lsbGF0aW9uIHdpdGguXHJcbiAqIEByZXR1cm4ge05vZGU8ZmxvYXQ+fSBUaGUgb3NjaWxsYXRpb24gbm9kZS5cclxuICovXHJcbmV4cG9ydCBjb25zdCBvc2NTaW5lID0gKCB0ID0gdGltZSApID0+IHQuYWRkKCAwLjc1ICkubXVsKCBNYXRoLlBJICogMiApLnNpbigpLm11bCggMC41ICkuYWRkKCAwLjUgKTtcclxuXHJcbi8qKlxyXG4gKiBHZW5lcmF0ZXMgYSBzcXVhcmUgd2F2ZSBvc2NpbGxhdGlvbiBiYXNlZCBvbiBhIHRpbWVyLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSB0IC0gVGhlIHRpbWVyIHRvIGdlbmVyYXRlIHRoZSBvc2NpbGxhdGlvbiB3aXRoLlxyXG4gKiBAcmV0dXJuIHtOb2RlPGZsb2F0Pn0gVGhlIG9zY2lsbGF0aW9uIG5vZGUuXHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgb3NjU3F1YXJlID0gKCB0ID0gdGltZSApID0+IHQuZnJhY3QoKS5yb3VuZCgpO1xyXG5cclxuLyoqXHJcbiAqIEdlbmVyYXRlcyBhIHRyaWFuZ2xlIHdhdmUgb3NjaWxsYXRpb24gYmFzZWQgb24gYSB0aW1lci5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlPGZsb2F0Pn0gdCAtIFRoZSB0aW1lciB0byBnZW5lcmF0ZSB0aGUgb3NjaWxsYXRpb24gd2l0aC5cclxuICogQHJldHVybiB7Tm9kZTxmbG9hdD59IFRoZSBvc2NpbGxhdGlvbiBub2RlLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG9zY1RyaWFuZ2xlID0gKCB0ID0gdGltZSApID0+IHQuYWRkKCAwLjUgKS5mcmFjdCgpLm11bCggMiApLnN1YiggMSApLmFicygpO1xyXG5cclxuLyoqXHJcbiAqIEdlbmVyYXRlcyBhIHNhd3Rvb3RoIHdhdmUgb3NjaWxsYXRpb24gYmFzZWQgb24gYSB0aW1lci5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlPGZsb2F0Pn0gdCAtIFRoZSB0aW1lciB0byBnZW5lcmF0ZSB0aGUgb3NjaWxsYXRpb24gd2l0aC5cclxuICogQHJldHVybiB7Tm9kZTxmbG9hdD59IFRoZSBvc2NpbGxhdGlvbiBub2RlLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG9zY1Nhd3Rvb3RoID0gKCB0ID0gdGltZSApID0+IHQuZnJhY3QoKTtcclxuIiwiaW1wb3J0IHsgRm4sIHZlYzIgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcbmltcG9ydCB7IHJvdGF0ZSB9IGZyb20gJy4vUm90YXRlTm9kZS5qcyc7XHJcblxyXG4vKipcclxuICogUm90YXRlcyB0aGUgZ2l2ZW4gdXYgY29vcmRpbmF0ZXMgYXJvdW5kIGEgY2VudGVyIHBvaW50XHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMyPn0gdXYgLSBUaGUgdXYgY29vcmRpbmF0ZXMuXHJcbiAqIEBwYXJhbSB7Tm9kZTxmbG9hdD59IHJvdGF0aW9uIC0gVGhlIHJvdGF0aW9uIGRlZmluZWQgaW4gcmFkaWFucy5cclxuICogQHBhcmFtIHtOb2RlPHZlYzI+fSBjZW50ZXIgLSBUaGUgY2VudGVyIG9mIHJvdGF0aW9uXHJcbiAqIEByZXR1cm4ge05vZGU8dmVjMj59IFRoZSByb3RhdGVkIHV2IGNvb3JkaW5hdGVzLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHJvdGF0ZVVWID0gLypAX19QVVJFX18qLyBGbiggKCBbIHV2LCByb3RhdGlvbiwgY2VudGVyID0gdmVjMiggMC41ICkgXSApID0+IHtcclxuXHJcblx0cmV0dXJuIHJvdGF0ZSggdXYuc3ViKCBjZW50ZXIgKSwgcm90YXRpb24gKS5hZGQoIGNlbnRlciApO1xyXG5cclxufSApO1xyXG5cclxuLyoqXHJcbiAqIEFwcGxpZXMgYSBzcGhlcmljYWwgd2FycGluZyBlZmZlY3QgdG8gdGhlIGdpdmVuIHV2IGNvb3JkaW5hdGVzLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGU8dmVjMj59IHV2IC0gVGhlIHV2IGNvb3JkaW5hdGVzLlxyXG4gKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSBzdHJlbmd0aCAtIFRoZSBzdHJlbmd0aCBvZiB0aGUgZWZmZWN0LlxyXG4gKiBAcGFyYW0ge05vZGU8dmVjMj59IGNlbnRlciAtIFRoZSBjZW50ZXIgcG9pbnRcclxuICogQHJldHVybiB7Tm9kZTx2ZWMyPn0gVGhlIHVwZGF0ZWQgdXYgY29vcmRpbmF0ZXMuXHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgc3BoZXJpemVVViA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyB1diwgc3RyZW5ndGgsIGNlbnRlciA9IHZlYzIoIDAuNSApIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IGRlbHRhID0gdXYuc3ViKCBjZW50ZXIgKTtcclxuXHRjb25zdCBkZWx0YTIgPSBkZWx0YS5kb3QoIGRlbHRhICk7XHJcblx0Y29uc3QgZGVsdGE0ID0gZGVsdGEyLm11bCggZGVsdGEyICk7XHJcblx0Y29uc3QgZGVsdGFPZmZzZXQgPSBkZWx0YTQubXVsKCBzdHJlbmd0aCApO1xyXG5cclxuXHRyZXR1cm4gdXYuYWRkKCBkZWx0YS5tdWwoIGRlbHRhT2Zmc2V0ICkgKTtcclxuXHJcbn0gKTtcclxuIiwiaW1wb3J0IHsgbW9kZWxXb3JsZE1hdHJpeCB9IGZyb20gJy4uL2FjY2Vzc29ycy9Nb2RlbE5vZGUuanMnO1xyXG5pbXBvcnQgeyBjYW1lcmFWaWV3TWF0cml4LCBjYW1lcmFQcm9qZWN0aW9uTWF0cml4IH0gZnJvbSAnLi4vYWNjZXNzb3JzL0NhbWVyYS5qcyc7XHJcbmltcG9ydCB7IHBvc2l0aW9uTG9jYWwgfSBmcm9tICcuLi9hY2Nlc3NvcnMvUG9zaXRpb24uanMnO1xyXG5pbXBvcnQgeyBGbiwgZGVmaW5lZCB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGFjaGlldmUgYSBiaWxsYm9hcmRpbmcgYmVoYXZpb3IgZm9yIGZsYXQgbWVzaGVzLiBUaGF0IG1lYW5zIHRoZXkgYXJlXHJcbiAqIG9yaWVudGVkIGFsd2F5cyB0b3dhcmRzIHRoZSBjYW1lcmEuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIG1hdGVyaWFsLnZlcnRleE5vZGUgPSBiaWxsYm9hcmRpbmcoKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgLSBUaGUgY29uZmlndXJhdGlvbiBvYmplY3QuXHJcbiAqIEBwYXJhbSB7P05vZGU8dmVjMz59IFtjb25maWcucG9zaXRpb249bnVsbF0gLSBDYW4gYmUgdXNlZCB0byBkZWZpbmUgdGhlIHZlcnRleCBwb3NpdGlvbnMgaW4gd29ybGQgc3BhY2UuXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NvbmZpZy5ob3Jpem9udGFsPXRydWVdIC0gV2hldGhlciB0byBmb2xsb3cgdGhlIGNhbWVyYSByb3RhdGlvbiBob3Jpem9udGFsbHkgb3Igbm90LlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtjb25maWcudmVydGljYWw9ZmFsc2VdIC0gV2hldGhlciB0byBmb2xsb3cgdGhlIGNhbWVyYSByb3RhdGlvbiB2ZXJ0aWNhbGx5IG9yIG5vdC5cclxuICogQHJldHVybiB7Tm9kZTx2ZWMzPn0gVGhlIHVwZGF0ZWQgdmVydGV4IHBvc2l0aW9uIGluIGNsaXAgc3BhY2UuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYmlsbGJvYXJkaW5nID0gLypAX19QVVJFX18qLyBGbiggKCB7IHBvc2l0aW9uID0gbnVsbCwgaG9yaXpvbnRhbCA9IHRydWUsIHZlcnRpY2FsID0gZmFsc2UgfSApID0+IHtcclxuXHJcblx0bGV0IHdvcmxkTWF0cml4O1xyXG5cclxuXHRpZiAoIHBvc2l0aW9uICE9PSBudWxsICkge1xyXG5cclxuXHRcdHdvcmxkTWF0cml4ID0gbW9kZWxXb3JsZE1hdHJpeC50b1ZhcigpO1xyXG5cdFx0d29ybGRNYXRyaXhbIDMgXVsgMCBdID0gcG9zaXRpb24ueDtcclxuXHRcdHdvcmxkTWF0cml4WyAzIF1bIDEgXSA9IHBvc2l0aW9uLnk7XHJcblx0XHR3b3JsZE1hdHJpeFsgMyBdWyAyIF0gPSBwb3NpdGlvbi56O1xyXG5cclxuXHR9IGVsc2Uge1xyXG5cclxuXHRcdHdvcmxkTWF0cml4ID0gbW9kZWxXb3JsZE1hdHJpeDtcclxuXHJcblx0fVxyXG5cclxuXHRjb25zdCBtb2RlbFZpZXdNYXRyaXggPSBjYW1lcmFWaWV3TWF0cml4Lm11bCggd29ybGRNYXRyaXggKTtcclxuXHJcblx0aWYgKCBkZWZpbmVkKCBob3Jpem9udGFsICkgKSB7XHJcblxyXG5cdFx0bW9kZWxWaWV3TWF0cml4WyAwIF1bIDAgXSA9IG1vZGVsV29ybGRNYXRyaXhbIDAgXS5sZW5ndGgoKTtcclxuXHRcdG1vZGVsVmlld01hdHJpeFsgMCBdWyAxIF0gPSAwO1xyXG5cdFx0bW9kZWxWaWV3TWF0cml4WyAwIF1bIDIgXSA9IDA7XHJcblxyXG5cdH1cclxuXHJcblx0aWYgKCBkZWZpbmVkKCB2ZXJ0aWNhbCApICkge1xyXG5cclxuXHRcdG1vZGVsVmlld01hdHJpeFsgMSBdWyAwIF0gPSAwO1xyXG5cdFx0bW9kZWxWaWV3TWF0cml4WyAxIF1bIDEgXSA9IG1vZGVsV29ybGRNYXRyaXhbIDEgXS5sZW5ndGgoKTtcclxuXHRcdG1vZGVsVmlld01hdHJpeFsgMSBdWyAyIF0gPSAwO1xyXG5cclxuXHR9XHJcblxyXG5cdG1vZGVsVmlld01hdHJpeFsgMiBdWyAwIF0gPSAwO1xyXG5cdG1vZGVsVmlld01hdHJpeFsgMiBdWyAxIF0gPSAwO1xyXG5cdG1vZGVsVmlld01hdHJpeFsgMiBdWyAyIF0gPSAxO1xyXG5cclxuXHRyZXR1cm4gY2FtZXJhUHJvamVjdGlvbk1hdHJpeC5tdWwoIG1vZGVsVmlld01hdHJpeCApLm11bCggcG9zaXRpb25Mb2NhbCApO1xyXG5cclxufSApO1xyXG4iLCJpbXBvcnQgeyBGbiB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuaW1wb3J0IHsgc2NyZWVuVVYgfSBmcm9tICcuLi9kaXNwbGF5L1NjcmVlbk5vZGUuanMnO1xyXG5pbXBvcnQgeyB2aWV3cG9ydERlcHRoVGV4dHVyZSB9IGZyb20gJy4uL2Rpc3BsYXkvVmlld3BvcnREZXB0aFRleHR1cmVOb2RlLmpzJztcclxuaW1wb3J0IHsgbGluZWFyRGVwdGggfSBmcm9tICcuLi9kaXNwbGF5L1ZpZXdwb3J0RGVwdGhOb2RlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIHNwZWNpYWwgdmVyc2lvbiBvZiBhIHNjcmVlbiB1diBmdW5jdGlvbiB0aGF0IGludm9sdmVzIGEgZGVwdGggY29tcGFyaXNvblxyXG4gKiB3aGVuIGNvbXB1dGluZyB0aGUgZmluYWwgdXZzLiBUaGUgZnVuY3Rpb24gbWl0aWdhdGVzIHZpc3VhbCBlcnJvcnMgd2hlblxyXG4gKiB1c2luZyB2aWV3cG9ydCB0ZXh0dXJlIG5vZGVzIGZvciByZWZyYWN0aW9uIHB1cnBvc2VzLiBXaXRob3V0IHRoaXMgZnVuY3Rpb25cclxuICogb2JqZWN0cyBpbiBmcm9udCBvZiBhIHJlZnJhY3RpdmUgc3VyZmFjZSBtaWdodCBhcHBlYXIgb24gdGhlIHJlZnJhY3RpdmUgc3VyZmFjZVxyXG4gKiB3aGljaCBpcyBpbmNvcnJlY3QuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7P05vZGU8dmVjMj59IHV2IC0gT3B0aW9uYWwgdXYgY29vcmRpbmF0ZXMuIEJ5IGRlZmF1bHQgYHNjcmVlblVWYCBpcyB1c2VkLlxyXG4gKiBAcmV0dXJuIHtOb2RlPHZlYzI+fSBUaGUgdXBkYXRlIHV2IGNvb3JkaW5hdGVzLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHZpZXdwb3J0U2FmZVVWID0gLypAX19QVVJFX18qLyBGbiggKCBbIHV2ID0gbnVsbCBdICkgPT4ge1xyXG5cclxuXHRjb25zdCBkZXB0aCA9IGxpbmVhckRlcHRoKCk7XHJcblx0Y29uc3QgZGVwdGhEaWZmID0gbGluZWFyRGVwdGgoIHZpZXdwb3J0RGVwdGhUZXh0dXJlKCB1diApICkuc3ViKCBkZXB0aCApO1xyXG5cdGNvbnN0IGZpbmFsVVYgPSBkZXB0aERpZmYubGVzc1RoYW4oIDAgKS5zZWxlY3QoIHNjcmVlblVWLCB1diApO1xyXG5cclxuXHRyZXR1cm4gZmluYWxVVjtcclxuXHJcbn0gKTtcclxuIiwiaW1wb3J0IE5vZGUgZnJvbSAnLi4vY29yZS9Ob2RlLmpzJztcclxuaW1wb3J0IHsgdXYgfSBmcm9tICcuLi9hY2Nlc3NvcnMvVVYuanMnO1xyXG5pbXBvcnQgeyBub2RlUHJveHksIGZsb2F0LCB2ZWMyIH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5cclxuLyoqXHJcbiAqIENhbiBiZSB1c2VkIHRvIGNvbXB1dGUgdGV4dHVyZSBjb29yZGluYXRlcyBmb3IgYW5pbWF0ZWQgc3ByaXRlIHNoZWV0cy5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgdXZOb2RlID0gc3ByaXRlc2hlZXRVViggdmVjMiggNiwgNiApLCB1digpLCB0aW1lLm11bCggYW5pbWF0aW9uU3BlZWQgKSApO1xyXG4gKlxyXG4gKiBtYXRlcmlhbC5jb2xvck5vZGUgPSB0ZXh0dXJlKCBzcHJpdGVTaGVldCwgdXZOb2RlICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTm9kZVxyXG4gKi9cclxuY2xhc3MgU3ByaXRlU2hlZXRVVk5vZGUgZXh0ZW5kcyBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnU3ByaXRlU2hlZXRVVk5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc3ByaXRlIHNoZWV0IHV2IG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGU8dmVjMj59IGNvdW50Tm9kZSAtIFRoZSBub2RlIHRoYXQgZGVmaW5lcyB0aGUgbnVtYmVyIG9mIHNwcml0ZXMgaW4gdGhlIHggYW5kIHkgZGlyZWN0aW9uIChlLmcgNng2KS5cclxuXHQgKiBAcGFyYW0ge05vZGU8dmVjMj59IFt1dk5vZGU9dXYoKV0gLSBUaGUgdXYgbm9kZS5cclxuXHQgKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSBbZnJhbWVOb2RlPWZsb2F0KCldIC0gVGhlIG5vZGUgdGhhdCBkZWZpbmVzIHRoZSBjdXJyZW50IGZyYW1lL3Nwcml0ZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggY291bnROb2RlLCB1dk5vZGUgPSB1digpLCBmcmFtZU5vZGUgPSBmbG9hdCggMCApICkge1xyXG5cclxuXHRcdHN1cGVyKCAndmVjMicgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBub2RlIHRoYXQgZGVmaW5lcyB0aGUgbnVtYmVyIG9mIHNwcml0ZXMgaW4gdGhlIHggYW5kIHkgZGlyZWN0aW9uIChlLmcgNng2KS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZTx2ZWMyPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jb3VudE5vZGUgPSBjb3VudE5vZGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdXYgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZTx2ZWMyPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51dk5vZGUgPSB1dk5vZGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbm9kZSB0aGF0IGRlZmluZXMgdGhlIGN1cnJlbnQgZnJhbWUvc3ByaXRlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlPGZsb2F0Pn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5mcmFtZU5vZGUgPSBmcmFtZU5vZGU7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXAoKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBmcmFtZU5vZGUsIHV2Tm9kZSwgY291bnROb2RlIH0gPSB0aGlzO1xyXG5cclxuXHRcdGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gY291bnROb2RlO1xyXG5cclxuXHRcdGNvbnN0IGZyYW1lTnVtID0gZnJhbWVOb2RlLm1vZCggd2lkdGgubXVsKCBoZWlnaHQgKSApLmZsb29yKCk7XHJcblxyXG5cdFx0Y29uc3QgY29sdW1uID0gZnJhbWVOdW0ubW9kKCB3aWR0aCApO1xyXG5cdFx0Y29uc3Qgcm93ID0gaGVpZ2h0LnN1YiggZnJhbWVOdW0uYWRkKCAxICkuZGl2KCB3aWR0aCApLmNlaWwoKSApO1xyXG5cclxuXHRcdGNvbnN0IHNjYWxlID0gY291bnROb2RlLnJlY2lwcm9jYWwoKTtcclxuXHRcdGNvbnN0IHV2RnJhbWVPZmZzZXQgPSB2ZWMyKCBjb2x1bW4sIHJvdyApO1xyXG5cclxuXHRcdHJldHVybiB1dk5vZGUuYWRkKCB1dkZyYW1lT2Zmc2V0ICkubXVsKCBzY2FsZSApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTcHJpdGVTaGVldFVWTm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgc3ByaXRlIHNoZWV0IHV2IG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMyPn0gY291bnROb2RlIC0gVGhlIG5vZGUgdGhhdCBkZWZpbmVzIHRoZSBudW1iZXIgb2Ygc3ByaXRlcyBpbiB0aGUgeCBhbmQgeSBkaXJlY3Rpb24gKGUuZyA2eDYpLlxyXG4gKiBAcGFyYW0gez9Ob2RlPHZlYzI+fSBbdXZOb2RlPXV2KCldIC0gVGhlIHV2IG5vZGUuXHJcbiAqIEBwYXJhbSB7P05vZGU8ZmxvYXQ+fSBbZnJhbWVOb2RlPWZsb2F0KCldIC0gVGhlIG5vZGUgdGhhdCBkZWZpbmVzIHRoZSBjdXJyZW50IGZyYW1lL3Nwcml0ZS5cclxuICogQHJldHVybnMge1Nwcml0ZVNoZWV0VVZOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHNwcml0ZXNoZWV0VVYgPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggU3ByaXRlU2hlZXRVVk5vZGUgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDMgKTtcclxuIiwiaW1wb3J0IE5vZGUgZnJvbSAnLi4vY29yZS9Ob2RlLmpzJztcclxuaW1wb3J0IHsgYWRkIH0gZnJvbSAnLi4vbWF0aC9PcGVyYXRvck5vZGUuanMnO1xyXG5pbXBvcnQgeyBub3JtYWxMb2NhbCB9IGZyb20gJy4uL2FjY2Vzc29ycy9Ob3JtYWwuanMnO1xyXG5pbXBvcnQgeyBwb3NpdGlvbkxvY2FsIH0gZnJvbSAnLi4vYWNjZXNzb3JzL1Bvc2l0aW9uLmpzJztcclxuaW1wb3J0IHsgdGV4dHVyZSB9IGZyb20gJy4uL2FjY2Vzc29ycy9UZXh0dXJlTm9kZS5qcyc7XHJcbmltcG9ydCB7IG5vZGVQcm94eSwgZmxvYXQsIHZlYzMgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcblxyXG4vKipcclxuICogQ2FuIGJlIHVzZWQgZm9yIHRyaXBsYW5hciB0ZXh0dXJlIG1hcHBpbmcuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIG1hdGVyaWFsLmNvbG9yTm9kZSA9IHRyaXBsYW5hclRleHR1cmUoIHRleHR1cmUoIGRpZmZ1c2VNYXAgKSApO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVcclxuICovXHJcbmNsYXNzIFRyaXBsYW5hclRleHR1cmVzTm9kZSBleHRlbmRzIE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdUcmlwbGFuYXJUZXh0dXJlc05vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgdHJpcGxhbmFyIHRleHR1cmVzIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV9IHRleHR1cmVYTm9kZSAtIEZpcnN0IHRleHR1cmUgbm9kZS5cclxuXHQgKiBAcGFyYW0gez9Ob2RlfSBbdGV4dHVyZVlOb2RlPW51bGxdIC0gU2Vjb25kIHRleHR1cmUgbm9kZS4gV2hlbiBub3Qgc2V0LCB0aGUgc2hhZGVyIHdpbGwgc2FtcGxlIGZyb20gYHRleHR1cmVYTm9kZWAgaW5zdGVhZC5cclxuXHQgKiBAcGFyYW0gez9Ob2RlfSBbdGV4dHVyZVpOb2RlPW51bGxdIC0gVGhpcmQgdGV4dHVyZSBub2RlLiBXaGVuIG5vdCBzZXQsIHRoZSBzaGFkZXIgd2lsbCBzYW1wbGUgZnJvbSBgdGV4dHVyZVhOb2RlYCBpbnN0ZWFkLlxyXG5cdCAqIEBwYXJhbSB7P05vZGU8ZmxvYXQ+fSBbc2NhbGVOb2RlPWZsb2F0KDEpXSAtIFRoZSBzY2FsZSBub2RlLlxyXG5cdCAqIEBwYXJhbSB7P05vZGU8dmVjMz59IFtwb3NpdGlvbk5vZGU9cG9zaXRpb25Mb2NhbF0gLSBWZXJ0ZXggcG9zaXRpb25zIGluIGxvY2FsIHNwYWNlLlxyXG5cdCAqIEBwYXJhbSB7P05vZGU8dmVjMz59IFtub3JtYWxOb2RlPW5vcm1hbExvY2FsXSAtIE5vcm1hbHMgaW4gbG9jYWwgc3BhY2UuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHRleHR1cmVYTm9kZSwgdGV4dHVyZVlOb2RlID0gbnVsbCwgdGV4dHVyZVpOb2RlID0gbnVsbCwgc2NhbGVOb2RlID0gZmxvYXQoIDEgKSwgcG9zaXRpb25Ob2RlID0gcG9zaXRpb25Mb2NhbCwgbm9ybWFsTm9kZSA9IG5vcm1hbExvY2FsICkge1xyXG5cclxuXHRcdHN1cGVyKCAndmVjNCcgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEZpcnN0IHRleHR1cmUgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50ZXh0dXJlWE5vZGUgPSB0ZXh0dXJlWE5vZGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTZWNvbmQgdGV4dHVyZSBub2RlLiBXaGVuIG5vdCBzZXQsIHRoZSBzaGFkZXIgd2lsbCBzYW1wbGUgZnJvbSBgdGV4dHVyZVhOb2RlYCBpbnN0ZWFkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Tm9kZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50ZXh0dXJlWU5vZGUgPSB0ZXh0dXJlWU5vZGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlyZCB0ZXh0dXJlIG5vZGUuIFdoZW4gbm90IHNldCwgdGhlIHNoYWRlciB3aWxsIHNhbXBsZSBmcm9tIGB0ZXh0dXJlWE5vZGVgIGluc3RlYWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRleHR1cmVaTm9kZSA9IHRleHR1cmVaTm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBzY2FsZSBub2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlPGZsb2F0Pn1cclxuXHRcdCAqIEBkZWZhdWx0IGZsb2F0KDEpXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2NhbGVOb2RlID0gc2NhbGVOb2RlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVmVydGV4IHBvc2l0aW9ucyBpbiBsb2NhbCBzcGFjZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZTx2ZWMzPn1cclxuXHRcdCAqIEBkZWZhdWx0IHBvc2l0aW9uTG9jYWxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wb3NpdGlvbk5vZGUgPSBwb3NpdGlvbk5vZGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBOb3JtYWxzIGluIGxvY2FsIHNwYWNlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlPHZlYzM+fVxyXG5cdFx0ICogQGRlZmF1bHQgbm9ybWFsTG9jYWxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub3JtYWxOb2RlID0gbm9ybWFsTm9kZTtcclxuXHJcblx0fVxyXG5cclxuXHRzZXR1cCgpIHtcclxuXHJcblx0XHRjb25zdCB7IHRleHR1cmVYTm9kZSwgdGV4dHVyZVlOb2RlLCB0ZXh0dXJlWk5vZGUsIHNjYWxlTm9kZSwgcG9zaXRpb25Ob2RlLCBub3JtYWxOb2RlIH0gPSB0aGlzO1xyXG5cclxuXHRcdC8vIFJlZjogaHR0cHM6Ly9naXRodWIuY29tL2tlaWppcm8vU3RhbmRhcmRUcmlwbGFuYXJcclxuXHJcblx0XHQvLyBCbGVuZGluZyBmYWN0b3Igb2YgdHJpcGxhbmFyIG1hcHBpbmdcclxuXHRcdGxldCBiZiA9IG5vcm1hbE5vZGUuYWJzKCkubm9ybWFsaXplKCk7XHJcblx0XHRiZiA9IGJmLmRpdiggYmYuZG90KCB2ZWMzKCAxLjAgKSApICk7XHJcblxyXG5cdFx0Ly8gVHJpcGxhbmFyIG1hcHBpbmdcclxuXHRcdGNvbnN0IHR4ID0gcG9zaXRpb25Ob2RlLnl6Lm11bCggc2NhbGVOb2RlICk7XHJcblx0XHRjb25zdCB0eSA9IHBvc2l0aW9uTm9kZS56eC5tdWwoIHNjYWxlTm9kZSApO1xyXG5cdFx0Y29uc3QgdHogPSBwb3NpdGlvbk5vZGUueHkubXVsKCBzY2FsZU5vZGUgKTtcclxuXHJcblx0XHQvLyBCYXNlIGNvbG9yXHJcblx0XHRjb25zdCB0ZXh0dXJlWCA9IHRleHR1cmVYTm9kZS52YWx1ZTtcclxuXHRcdGNvbnN0IHRleHR1cmVZID0gdGV4dHVyZVlOb2RlICE9PSBudWxsID8gdGV4dHVyZVlOb2RlLnZhbHVlIDogdGV4dHVyZVg7XHJcblx0XHRjb25zdCB0ZXh0dXJlWiA9IHRleHR1cmVaTm9kZSAhPT0gbnVsbCA/IHRleHR1cmVaTm9kZS52YWx1ZSA6IHRleHR1cmVYO1xyXG5cclxuXHRcdGNvbnN0IGN4ID0gdGV4dHVyZSggdGV4dHVyZVgsIHR4ICkubXVsKCBiZi54ICk7XHJcblx0XHRjb25zdCBjeSA9IHRleHR1cmUoIHRleHR1cmVZLCB0eSApLm11bCggYmYueSApO1xyXG5cdFx0Y29uc3QgY3ogPSB0ZXh0dXJlKCB0ZXh0dXJlWiwgdHogKS5tdWwoIGJmLnogKTtcclxuXHJcblx0XHRyZXR1cm4gYWRkKCBjeCwgY3ksIGN6ICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFRyaXBsYW5hclRleHR1cmVzTm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgdHJpcGxhbmFyIHRleHR1cmVzIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZX0gdGV4dHVyZVhOb2RlIC0gRmlyc3QgdGV4dHVyZSBub2RlLlxyXG4gKiBAcGFyYW0gez9Ob2RlfSBbdGV4dHVyZVlOb2RlPW51bGxdIC0gU2Vjb25kIHRleHR1cmUgbm9kZS4gV2hlbiBub3Qgc2V0LCB0aGUgc2hhZGVyIHdpbGwgc2FtcGxlIGZyb20gYHRleHR1cmVYTm9kZWAgaW5zdGVhZC5cclxuICogQHBhcmFtIHs/Tm9kZX0gW3RleHR1cmVaTm9kZT1udWxsXSAtIFRoaXJkIHRleHR1cmUgbm9kZS4gV2hlbiBub3Qgc2V0LCB0aGUgc2hhZGVyIHdpbGwgc2FtcGxlIGZyb20gYHRleHR1cmVYTm9kZWAgaW5zdGVhZC5cclxuICogQHBhcmFtIHs/Tm9kZTxmbG9hdD59IFtzY2FsZU5vZGU9ZmxvYXQoMSldIC0gVGhlIHNjYWxlIG5vZGUuXHJcbiAqIEBwYXJhbSB7P05vZGU8dmVjMz59IFtwb3NpdGlvbk5vZGU9cG9zaXRpb25Mb2NhbF0gLSBWZXJ0ZXggcG9zaXRpb25zIGluIGxvY2FsIHNwYWNlLlxyXG4gKiBAcGFyYW0gez9Ob2RlPHZlYzM+fSBbbm9ybWFsTm9kZT1ub3JtYWxMb2NhbF0gLSBOb3JtYWxzIGluIGxvY2FsIHNwYWNlLlxyXG4gKiBAcmV0dXJucyB7VHJpcGxhbmFyVGV4dHVyZXNOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHRyaXBsYW5hclRleHR1cmVzID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIFRyaXBsYW5hclRleHR1cmVzTm9kZSApLnNldFBhcmFtZXRlckxlbmd0aCggMSwgNiApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSB0cmlwbGFuYXIgdGV4dHVyZXMgbm9kZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlfSB0ZXh0dXJlWE5vZGUgLSBGaXJzdCB0ZXh0dXJlIG5vZGUuXHJcbiAqIEBwYXJhbSB7P05vZGV9IFt0ZXh0dXJlWU5vZGU9bnVsbF0gLSBTZWNvbmQgdGV4dHVyZSBub2RlLiBXaGVuIG5vdCBzZXQsIHRoZSBzaGFkZXIgd2lsbCBzYW1wbGUgZnJvbSBgdGV4dHVyZVhOb2RlYCBpbnN0ZWFkLlxyXG4gKiBAcGFyYW0gez9Ob2RlfSBbdGV4dHVyZVpOb2RlPW51bGxdIC0gVGhpcmQgdGV4dHVyZSBub2RlLiBXaGVuIG5vdCBzZXQsIHRoZSBzaGFkZXIgd2lsbCBzYW1wbGUgZnJvbSBgdGV4dHVyZVhOb2RlYCBpbnN0ZWFkLlxyXG4gKiBAcGFyYW0gez9Ob2RlPGZsb2F0Pn0gW3NjYWxlTm9kZT1mbG9hdCgxKV0gLSBUaGUgc2NhbGUgbm9kZS5cclxuICogQHBhcmFtIHs/Tm9kZTx2ZWMzPn0gW3Bvc2l0aW9uTm9kZT1wb3NpdGlvbkxvY2FsXSAtIFZlcnRleCBwb3NpdGlvbnMgaW4gbG9jYWwgc3BhY2UuXHJcbiAqIEBwYXJhbSB7P05vZGU8dmVjMz59IFtub3JtYWxOb2RlPW5vcm1hbExvY2FsXSAtIE5vcm1hbHMgaW4gbG9jYWwgc3BhY2UuXHJcbiAqIEByZXR1cm5zIHtUcmlwbGFuYXJUZXh0dXJlc05vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdHJpcGxhbmFyVGV4dHVyZSA9ICggLi4ucGFyYW1zICkgPT4gdHJpcGxhbmFyVGV4dHVyZXMoIC4uLnBhcmFtcyApO1xyXG4iLCJpbXBvcnQgTm9kZSBmcm9tICcuLi9jb3JlL05vZGUuanMnO1xyXG5pbXBvcnQgVGV4dHVyZU5vZGUgZnJvbSAnLi4vYWNjZXNzb3JzL1RleHR1cmVOb2RlLmpzJztcclxuaW1wb3J0IHsgbm9kZU9iamVjdCB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuaW1wb3J0IHsgTm9kZVVwZGF0ZVR5cGUgfSBmcm9tICcuLi9jb3JlL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IHNjcmVlblVWIH0gZnJvbSAnLi4vZGlzcGxheS9TY3JlZW5Ob2RlLmpzJztcclxuXHJcbmltcG9ydCB7IEhhbGZGbG9hdFR5cGUsIExpbmVhck1pcE1hcExpbmVhckZpbHRlciwgV2ViR1BVQ29vcmRpbmF0ZVN5c3RlbSB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IFBsYW5lIH0gZnJvbSAnLi4vLi4vbWF0aC9QbGFuZS5qcyc7XHJcbmltcG9ydCB7IE9iamVjdDNEIH0gZnJvbSAnLi4vLi4vY29yZS9PYmplY3QzRC5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjIuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yNCB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yNC5qcyc7XHJcbmltcG9ydCB7IE1hdHJpeDQgfSBmcm9tICcuLi8uLi9tYXRoL01hdHJpeDQuanMnO1xyXG5pbXBvcnQgeyBSZW5kZXJUYXJnZXQgfSBmcm9tICcuLi8uLi9jb3JlL1JlbmRlclRhcmdldC5qcyc7XHJcbmltcG9ydCB7IERlcHRoVGV4dHVyZSB9IGZyb20gJy4uLy4uL3RleHR1cmVzL0RlcHRoVGV4dHVyZS5qcyc7XHJcblxyXG5jb25zdCBfcmVmbGVjdG9yUGxhbmUgPSBuZXcgUGxhbmUoKTtcclxuY29uc3QgX25vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF9yZWZsZWN0b3JXb3JsZFBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcclxuY29uc3QgX2NhbWVyYVdvcmxkUG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfcm90YXRpb25NYXRyaXggPSBuZXcgTWF0cml4NCgpO1xyXG5jb25zdCBfbG9va0F0UG9zaXRpb24gPSBuZXcgVmVjdG9yMyggMCwgMCwgLSAxICk7XHJcbmNvbnN0IGNsaXBQbGFuZSA9IG5ldyBWZWN0b3I0KCk7XHJcblxyXG5jb25zdCBfdmlldyA9IG5ldyBWZWN0b3IzKCk7XHJcbmNvbnN0IF90YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfcSA9IG5ldyBWZWN0b3I0KCk7XHJcblxyXG5jb25zdCBfc2l6ZSA9IG5ldyBWZWN0b3IyKCk7XHJcblxyXG5jb25zdCBfZGVmYXVsdFJUID0gbmV3IFJlbmRlclRhcmdldCgpO1xyXG5jb25zdCBfZGVmYXVsdFVWID0gc2NyZWVuVVYuZmxpcFgoKTtcclxuXHJcbl9kZWZhdWx0UlQuZGVwdGhUZXh0dXJlID0gbmV3IERlcHRoVGV4dHVyZSggMSwgMSApO1xyXG5cclxubGV0IF9pblJlZmxlY3RvciA9IGZhbHNlO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgbm9kZSBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgbWlycm9yLWxpa2UgZmxhdCByZWZsZWN0aXZlIHN1cmZhY2VzLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBncm91bmRSZWZsZWN0b3IgPSByZWZsZWN0b3IoKTtcclxuICogbWF0ZXJpYWwuY29sb3JOb2RlID0gZ3JvdW5kUmVmbGVjdG9yO1xyXG4gKlxyXG4gKiBjb25zdCBwbGFuZSA9IG5ldyBNZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuICogcGxhbmUuYWRkKCBncm91bmRSZWZsZWN0b3IudGFyZ2V0ICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgVGV4dHVyZU5vZGVcclxuICovXHJcbmNsYXNzIFJlZmxlY3Rvck5vZGUgZXh0ZW5kcyBUZXh0dXJlTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ1JlZmxlY3Rvck5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcmVmbGVjdG9yIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtZXRlcnM9e31dIC0gQW4gb2JqZWN0IGhvbGRpbmcgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0M0R9IFtwYXJhbWV0ZXJzLnRhcmdldD1uZXcgT2JqZWN0M0QoKV0gLSBUaGUgM0Qgb2JqZWN0IHRoZSByZWZsZWN0b3IgaXMgbGlua2VkIHRvLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbcGFyYW1ldGVycy5yZXNvbHV0aW9uPTFdIC0gVGhlIHJlc29sdXRpb24gc2NhbGUuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbcGFyYW1ldGVycy5nZW5lcmF0ZU1pcG1hcHM9ZmFsc2VdIC0gV2hldGhlciBtaXBtYXBzIHNob3VsZCBiZSBnZW5lcmF0ZWQgb3Igbm90LlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BhcmFtZXRlcnMuYm91bmNlcz10cnVlXSAtIFdoZXRoZXIgcmVmbGVjdG9ycyBjYW4gcmVuZGVyIG90aGVyIHJlZmxlY3RvciBub2RlcyBvciBub3QuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbcGFyYW1ldGVycy5kZXB0aD1mYWxzZV0gLSBXaGV0aGVyIGRlcHRoIGRhdGEgc2hvdWxkIGJlIGdlbmVyYXRlZCBvciBub3QuXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlTm9kZX0gW3BhcmFtZXRlcnMuZGVmYXVsdFRleHR1cmVdIC0gVGhlIGRlZmF1bHQgdGV4dHVyZSBub2RlLlxyXG5cdCAqIEBwYXJhbSB7UmVmbGVjdG9yQmFzZU5vZGV9IFtwYXJhbWV0ZXJzLnJlZmxlY3Rvcl0gLSBUaGUgcmVmbGVjdG9yIGJhc2Ugbm9kZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVycyA9IHt9ICkge1xyXG5cclxuXHRcdHN1cGVyKCBwYXJhbWV0ZXJzLmRlZmF1bHRUZXh0dXJlIHx8IF9kZWZhdWx0UlQudGV4dHVyZSwgX2RlZmF1bHRVViApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIGludGVybmFsIHJlZmxlY3RvciBiYXNlIG5vZGUgd2hpY2ggaG9sZHMgdGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge1JlZmxlY3RvckJhc2VOb2RlfVxyXG5cdFx0ICogQGRlZmF1bHQgUmVmbGVjdG9yQmFzZU5vZGVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fcmVmbGVjdG9yQmFzZU5vZGUgPSBwYXJhbWV0ZXJzLnJlZmxlY3RvciB8fCBuZXcgUmVmbGVjdG9yQmFzZU5vZGUoIHRoaXMsIHBhcmFtZXRlcnMgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIHRoZSBpbnRlcm5hbCBkZXB0aCBub2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7P05vZGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX2RlcHRoTm9kZSA9IG51bGw7XHJcblxyXG5cdFx0dGhpcy5zZXRVcGRhdGVNYXRyaXgoIGZhbHNlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQSByZWZlcmVuY2UgdG8gdGhlIGludGVybmFsIHJlZmxlY3RvciBub2RlLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge1JlZmxlY3RvckJhc2VOb2RlfVxyXG5cdCAqL1xyXG5cdGdldCByZWZsZWN0b3IoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX3JlZmxlY3RvckJhc2VOb2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEEgcmVmZXJlbmNlIHRvIDNEIG9iamVjdCB0aGUgcmVmbGVjdG9yIGlzIGxpbmtlZCB0by5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtPYmplY3QzRH1cclxuXHQgKi9cclxuXHRnZXQgdGFyZ2V0KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9yZWZsZWN0b3JCYXNlTm9kZS50YXJnZXQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIG5vZGUgcmVwcmVzZW50aW5nIHRoZSBtaXJyb3IncyBkZXB0aC4gVGhhdCBjYW4gYmUgdXNlZFxyXG5cdCAqIHRvIGltcGxlbWVudCBtb3JlIGFkdmFuY2VkIHJlZmxlY3Rpb24gZWZmZWN0cyBsaWtlIGRpc3RhbmNlIGF0dGVudWF0aW9uLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Tm9kZX0gVGhlIGRlcHRoIG5vZGUuXHJcblx0ICovXHJcblx0Z2V0RGVwdGhOb2RlKCkge1xyXG5cclxuXHRcdGlmICggdGhpcy5fZGVwdGhOb2RlID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLl9yZWZsZWN0b3JCYXNlTm9kZS5kZXB0aCAhPT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuUmVmbGVjdG9yTm9kZTogRGVwdGggbm9kZSBjYW4gb25seSBiZSByZXF1ZXN0ZWQgd2hlbiB0aGUgcmVmbGVjdG9yIGlzIGNyZWF0ZWQgd2l0aCB7IGRlcHRoOiB0cnVlIH0uICcgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuX2RlcHRoTm9kZSA9IG5vZGVPYmplY3QoIG5ldyBSZWZsZWN0b3JOb2RlKCB7XHJcblx0XHRcdFx0ZGVmYXVsdFRleHR1cmU6IF9kZWZhdWx0UlQuZGVwdGhUZXh0dXJlLFxyXG5cdFx0XHRcdHJlZmxlY3RvcjogdGhpcy5fcmVmbGVjdG9yQmFzZU5vZGVcclxuXHRcdFx0fSApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzLl9kZXB0aE5vZGU7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXAoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Ly8gaWdub3JlIGlmIHVzZWQgaW4gcG9zdC1wcm9jZXNzaW5nXHJcblx0XHRpZiAoICEgYnVpbGRlci5vYmplY3QuaXNRdWFkTWVzaCApIHRoaXMuX3JlZmxlY3RvckJhc2VOb2RlLmJ1aWxkKCBidWlsZGVyICk7XHJcblxyXG5cdFx0cmV0dXJuIHN1cGVyLnNldHVwKCBidWlsZGVyICk7XHJcblxyXG5cdH1cclxuXHJcblx0Y2xvbmUoKSB7XHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZSA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLnJlZmxlY3Rvck5vZGUgKTtcclxuXHRcdHRleHR1cmUuX3JlZmxlY3RvckJhc2VOb2RlID0gdGhpcy5fcmVmbGVjdG9yQmFzZU5vZGU7XHJcblxyXG5cdFx0cmV0dXJuIHRleHR1cmU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBIb2xkcyB0aGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSByZWZsZWN0b3IuXHJcbiAqXHJcbiAqIFRPRE86IEV4cGxhaW4gd2h5IGBSZWZsZWN0b3JCYXNlTm9kZWAuIE9yaWdpbmFsbHkgdGhlIGVudGlyZSBsb2dpYyB3YXMgaW1wbGVtZW50ZWRcclxuICogaW4gYFJlZmxlY3Rvck5vZGVgLCBzZWUgIzI5NjE5LlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAYXVnbWVudHMgTm9kZVxyXG4gKi9cclxuY2xhc3MgUmVmbGVjdG9yQmFzZU5vZGUgZXh0ZW5kcyBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnUmVmbGVjdG9yQmFzZU5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcmVmbGVjdG9yIGJhc2Ugbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZU5vZGV9IHRleHR1cmVOb2RlIC0gUmVwcmVzZW50cyB0aGUgcmVuZGVyZWQgcmVmbGVjdGlvbnMgYXMgYSB0ZXh0dXJlIG5vZGUuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbWV0ZXJzPXt9XSAtIEFuIG9iamVjdCBob2xkaW5nIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy5cclxuXHQgKiBAcGFyYW0ge09iamVjdDNEfSBbcGFyYW1ldGVycy50YXJnZXQ9bmV3IE9iamVjdDNEKCldIC0gVGhlIDNEIG9iamVjdCB0aGUgcmVmbGVjdG9yIGlzIGxpbmtlZCB0by5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3BhcmFtZXRlcnMucmVzb2x1dGlvbj0xXSAtIFRoZSByZXNvbHV0aW9uIHNjYWxlLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BhcmFtZXRlcnMuZ2VuZXJhdGVNaXBtYXBzPWZhbHNlXSAtIFdoZXRoZXIgbWlwbWFwcyBzaG91bGQgYmUgZ2VuZXJhdGVkIG9yIG5vdC5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtwYXJhbWV0ZXJzLmJvdW5jZXM9dHJ1ZV0gLSBXaGV0aGVyIHJlZmxlY3RvcnMgY2FuIHJlbmRlciBvdGhlciByZWZsZWN0b3Igbm9kZXMgb3Igbm90LlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BhcmFtZXRlcnMuZGVwdGg9ZmFsc2VdIC0gV2hldGhlciBkZXB0aCBkYXRhIHNob3VsZCBiZSBnZW5lcmF0ZWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCB0ZXh0dXJlTm9kZSwgcGFyYW1ldGVycyA9IHt9ICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0Y29uc3Qge1xyXG5cdFx0XHR0YXJnZXQgPSBuZXcgT2JqZWN0M0QoKSxcclxuXHRcdFx0cmVzb2x1dGlvbiA9IDEsXHJcblx0XHRcdGdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlLFxyXG5cdFx0XHRib3VuY2VzID0gdHJ1ZSxcclxuXHRcdFx0ZGVwdGggPSBmYWxzZVxyXG5cdFx0fSA9IHBhcmFtZXRlcnM7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXByZXNlbnRzIHRoZSByZW5kZXJlZCByZWZsZWN0aW9ucyBhcyBhIHRleHR1cmUgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VGV4dHVyZU5vZGV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudGV4dHVyZU5vZGUgPSB0ZXh0dXJlTm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSAzRCBvYmplY3QgdGhlIHJlZmxlY3RvciBpcyBsaW5rZWQgdG8uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdDNEfVxyXG5cdFx0ICogQGRlZmF1bHQge25ldyBPYmplY3QzRCgpfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRhcmdldCA9IHRhcmdldDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByZXNvbHV0aW9uIHNjYWxlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCB7MX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yZXNvbHV0aW9uID0gcmVzb2x1dGlvbjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgbWlwbWFwcyBzaG91bGQgYmUgZ2VuZXJhdGVkIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHtmYWxzZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSBnZW5lcmF0ZU1pcG1hcHM7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHJlZmxlY3RvcnMgY2FuIHJlbmRlciBvdGhlciByZWZsZWN0b3Igbm9kZXMgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQge3RydWV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYm91bmNlcyA9IGJvdW5jZXM7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIGRlcHRoIGRhdGEgc2hvdWxkIGJlIGdlbmVyYXRlZCBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB7ZmFsc2V9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGVwdGggPSBkZXB0aDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBgdXBkYXRlQmVmb3JlVHlwZWAgaXMgc2V0IHRvIGBOb2RlVXBkYXRlVHlwZS5SRU5ERVJgIHdoZW4ge0BsaW5rIFJlZmxlY3RvckJhc2VOb2RlI2JvdW5jZXN9XHJcblx0XHQgKiBpcyBgdHJ1ZWAuIE90aGVyd2lzZSBpdCdzIGBOb2RlVXBkYXRlVHlwZS5GUkFNRWAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqIEBkZWZhdWx0ICdyZW5kZXInXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXBkYXRlQmVmb3JlVHlwZSA9IGJvdW5jZXMgPyBOb2RlVXBkYXRlVHlwZS5SRU5ERVIgOiBOb2RlVXBkYXRlVHlwZS5GUkFNRTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdlYWsgbWFwIGZvciBtYW5hZ2luZyB2aXJ0dWFsIGNhbWVyYXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1dlYWtNYXA8Q2FtZXJhLCBDYW1lcmE+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnZpcnR1YWxDYW1lcmFzID0gbmV3IFdlYWtNYXAoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdlYWsgbWFwIGZvciBtYW5hZ2luZyByZW5kZXIgdGFyZ2V0cy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2Vha01hcDxDYW1lcmEsIFJlbmRlclRhcmdldD59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0cyA9IG5ldyBXZWFrTWFwKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBGb3JjZSByZW5kZXIgZXZlbiBpZiByZWZsZWN0b3IgaXMgZmFjaW5nIGF3YXkgZnJvbSBjYW1lcmEuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB7ZmFsc2V9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZm9yY2VVcGRhdGUgPSBmYWxzZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoZSByZXNvbHV0aW9uIG9mIHRoZSBpbnRlcm5hbCByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge1JlbmRlclRhcmdldH0gcmVuZGVyVGFyZ2V0IC0gVGhlIHJlbmRlciB0YXJnZXQgdG8gcmVzaXplLlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyIHRoYXQgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIG5ldyBzaXplLlxyXG5cdCAqL1xyXG5cdF91cGRhdGVSZXNvbHV0aW9uKCByZW5kZXJUYXJnZXQsIHJlbmRlcmVyICkge1xyXG5cclxuXHRcdGNvbnN0IHJlc29sdXRpb24gPSB0aGlzLnJlc29sdXRpb247XHJcblxyXG5cdFx0cmVuZGVyZXIuZ2V0RHJhd2luZ0J1ZmZlclNpemUoIF9zaXplICk7XHJcblxyXG5cdFx0cmVuZGVyVGFyZ2V0LnNldFNpemUoIE1hdGgucm91bmQoIF9zaXplLndpZHRoICogcmVzb2x1dGlvbiApLCBNYXRoLnJvdW5kKCBfc2l6ZS5oZWlnaHQgKiByZXNvbHV0aW9uICkgKTtcclxuXHJcblx0fVxyXG5cclxuXHRzZXR1cCggYnVpbGRlciApIHtcclxuXHJcblx0XHR0aGlzLl91cGRhdGVSZXNvbHV0aW9uKCBfZGVmYXVsdFJULCBidWlsZGVyLnJlbmRlcmVyICk7XHJcblxyXG5cdFx0cmV0dXJuIHN1cGVyLnNldHVwKCBidWlsZGVyICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIHZpcnR1YWwgY2FtZXJhIGZvciB0aGUgZ2l2ZW4gY2FtZXJhLiBUaGUgdmlydHVhbCBjYW1lcmEgaXMgdXNlZCB0b1xyXG5cdCAqIHJlbmRlciB0aGUgc2NlbmUgZnJvbSB0aGUgcmVmbGVjdG9yJ3MgdmlldyBzbyBjb3JyZWN0IHJlZmxlY3Rpb25zIGNhbiBiZSBwcm9kdWNlZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Q2FtZXJhfSBjYW1lcmEgLSBUaGUgc2NlbmUncyBjYW1lcmEuXHJcblx0ICogQHJldHVybiB7Q2FtZXJhfSBUaGUgY29ycmVzcG9uZGluZyB2aXJ0dWFsIGNhbWVyYS5cclxuXHQgKi9cclxuXHRnZXRWaXJ0dWFsQ2FtZXJhKCBjYW1lcmEgKSB7XHJcblxyXG5cdFx0bGV0IHZpcnR1YWxDYW1lcmEgPSB0aGlzLnZpcnR1YWxDYW1lcmFzLmdldCggY2FtZXJhICk7XHJcblxyXG5cdFx0aWYgKCB2aXJ0dWFsQ2FtZXJhID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHR2aXJ0dWFsQ2FtZXJhID0gY2FtZXJhLmNsb25lKCk7XHJcblxyXG5cdFx0XHR0aGlzLnZpcnR1YWxDYW1lcmFzLnNldCggY2FtZXJhLCB2aXJ0dWFsQ2FtZXJhICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB2aXJ0dWFsQ2FtZXJhO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSByZW5kZXIgdGFyZ2V0IGZvciB0aGUgZ2l2ZW4gY2FtZXJhLiBUaGUgcmVmbGVjdGlvbnMgYXJlIHJlbmRlcmVkXHJcblx0ICogaW50byB0aGlzIHJlbmRlciB0YXJnZXQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0NhbWVyYX0gY2FtZXJhIC0gVGhlIHNjZW5lJ3MgY2FtZXJhLlxyXG5cdCAqIEByZXR1cm4ge1JlbmRlclRhcmdldH0gVGhlIHJlbmRlciB0YXJnZXQuXHJcblx0ICovXHJcblx0Z2V0UmVuZGVyVGFyZ2V0KCBjYW1lcmEgKSB7XHJcblxyXG5cdFx0bGV0IHJlbmRlclRhcmdldCA9IHRoaXMucmVuZGVyVGFyZ2V0cy5nZXQoIGNhbWVyYSApO1xyXG5cclxuXHRcdGlmICggcmVuZGVyVGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRyZW5kZXJUYXJnZXQgPSBuZXcgUmVuZGVyVGFyZ2V0KCAwLCAwLCB7IHR5cGU6IEhhbGZGbG9hdFR5cGUgfSApO1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLmdlbmVyYXRlTWlwbWFwcyA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0cmVuZGVyVGFyZ2V0LnRleHR1cmUubWluRmlsdGVyID0gTGluZWFyTWlwTWFwTGluZWFyRmlsdGVyO1xyXG5cdFx0XHRcdHJlbmRlclRhcmdldC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IHRydWU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMuZGVwdGggPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUgPSBuZXcgRGVwdGhUZXh0dXJlKCk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0aGlzLnJlbmRlclRhcmdldHMuc2V0KCBjYW1lcmEsIHJlbmRlclRhcmdldCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcmVuZGVyVGFyZ2V0O1xyXG5cclxuXHR9XHJcblxyXG5cdHVwZGF0ZUJlZm9yZSggZnJhbWUgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmJvdW5jZXMgPT09IGZhbHNlICYmIF9pblJlZmxlY3RvciApIHJldHVybiBmYWxzZTtcclxuXHJcblx0XHRfaW5SZWZsZWN0b3IgPSB0cnVlO1xyXG5cclxuXHRcdGNvbnN0IHsgc2NlbmUsIGNhbWVyYSwgcmVuZGVyZXIsIG1hdGVyaWFsIH0gPSBmcmFtZTtcclxuXHRcdGNvbnN0IHsgdGFyZ2V0IH0gPSB0aGlzO1xyXG5cclxuXHRcdGNvbnN0IHZpcnR1YWxDYW1lcmEgPSB0aGlzLmdldFZpcnR1YWxDYW1lcmEoIGNhbWVyYSApO1xyXG5cdFx0Y29uc3QgcmVuZGVyVGFyZ2V0ID0gdGhpcy5nZXRSZW5kZXJUYXJnZXQoIHZpcnR1YWxDYW1lcmEgKTtcclxuXHJcblx0XHRyZW5kZXJlci5nZXREcmF3aW5nQnVmZmVyU2l6ZSggX3NpemUgKTtcclxuXHJcblx0XHR0aGlzLl91cGRhdGVSZXNvbHV0aW9uKCByZW5kZXJUYXJnZXQsIHJlbmRlcmVyICk7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRfcmVmbGVjdG9yV29ybGRQb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRhcmdldC5tYXRyaXhXb3JsZCApO1xyXG5cdFx0X2NhbWVyYVdvcmxkUG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBjYW1lcmEubWF0cml4V29ybGQgKTtcclxuXHJcblx0XHRfcm90YXRpb25NYXRyaXguZXh0cmFjdFJvdGF0aW9uKCB0YXJnZXQubWF0cml4V29ybGQgKTtcclxuXHJcblx0XHRfbm9ybWFsLnNldCggMCwgMCwgMSApO1xyXG5cdFx0X25vcm1hbC5hcHBseU1hdHJpeDQoIF9yb3RhdGlvbk1hdHJpeCApO1xyXG5cclxuXHRcdF92aWV3LnN1YlZlY3RvcnMoIF9yZWZsZWN0b3JXb3JsZFBvc2l0aW9uLCBfY2FtZXJhV29ybGRQb3NpdGlvbiApO1xyXG5cclxuXHRcdC8vIEF2b2lkIHJlbmRlcmluZyB3aGVuIHJlZmxlY3RvciBpcyBmYWNpbmcgYXdheSB1bmxlc3MgZm9yY2luZyBhbiB1cGRhdGVcclxuXHRcdGNvbnN0IGlzRmFjaW5nQXdheSA9IF92aWV3LmRvdCggX25vcm1hbCApID4gMDtcclxuXHJcblx0XHRpZiAoIGlzRmFjaW5nQXdheSA9PT0gdHJ1ZSAmJiB0aGlzLmZvcmNlVXBkYXRlID09PSBmYWxzZSApIHJldHVybjtcclxuXHJcblx0XHRfdmlldy5yZWZsZWN0KCBfbm9ybWFsICkubmVnYXRlKCk7XHJcblx0XHRfdmlldy5hZGQoIF9yZWZsZWN0b3JXb3JsZFBvc2l0aW9uICk7XHJcblxyXG5cdFx0X3JvdGF0aW9uTWF0cml4LmV4dHJhY3RSb3RhdGlvbiggY2FtZXJhLm1hdHJpeFdvcmxkICk7XHJcblxyXG5cdFx0X2xvb2tBdFBvc2l0aW9uLnNldCggMCwgMCwgLSAxICk7XHJcblx0XHRfbG9va0F0UG9zaXRpb24uYXBwbHlNYXRyaXg0KCBfcm90YXRpb25NYXRyaXggKTtcclxuXHRcdF9sb29rQXRQb3NpdGlvbi5hZGQoIF9jYW1lcmFXb3JsZFBvc2l0aW9uICk7XHJcblxyXG5cdFx0X3RhcmdldC5zdWJWZWN0b3JzKCBfcmVmbGVjdG9yV29ybGRQb3NpdGlvbiwgX2xvb2tBdFBvc2l0aW9uICk7XHJcblx0XHRfdGFyZ2V0LnJlZmxlY3QoIF9ub3JtYWwgKS5uZWdhdGUoKTtcclxuXHRcdF90YXJnZXQuYWRkKCBfcmVmbGVjdG9yV29ybGRQb3NpdGlvbiApO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0dmlydHVhbENhbWVyYS5jb29yZGluYXRlU3lzdGVtID0gY2FtZXJhLmNvb3JkaW5hdGVTeXN0ZW07XHJcblx0XHR2aXJ0dWFsQ2FtZXJhLnBvc2l0aW9uLmNvcHkoIF92aWV3ICk7XHJcblx0XHR2aXJ0dWFsQ2FtZXJhLnVwLnNldCggMCwgMSwgMCApO1xyXG5cdFx0dmlydHVhbENhbWVyYS51cC5hcHBseU1hdHJpeDQoIF9yb3RhdGlvbk1hdHJpeCApO1xyXG5cdFx0dmlydHVhbENhbWVyYS51cC5yZWZsZWN0KCBfbm9ybWFsICk7XHJcblx0XHR2aXJ0dWFsQ2FtZXJhLmxvb2tBdCggX3RhcmdldCApO1xyXG5cclxuXHRcdHZpcnR1YWxDYW1lcmEubmVhciA9IGNhbWVyYS5uZWFyO1xyXG5cdFx0dmlydHVhbENhbWVyYS5mYXIgPSBjYW1lcmEuZmFyO1xyXG5cclxuXHRcdHZpcnR1YWxDYW1lcmEudXBkYXRlTWF0cml4V29ybGQoKTtcclxuXHRcdHZpcnR1YWxDYW1lcmEucHJvamVjdGlvbk1hdHJpeC5jb3B5KCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeCApO1xyXG5cclxuXHRcdC8vIE5vdyB1cGRhdGUgcHJvamVjdGlvbiBtYXRyaXggd2l0aCBuZXcgY2xpcCBwbGFuZSwgaW1wbGVtZW50aW5nIGNvZGUgZnJvbTogaHR0cDovL3d3dy50ZXJhdGhvbi5jb20vY29kZS9vYmxpcXVlLmh0bWxcclxuXHRcdC8vIFBhcGVyIGV4cGxhaW5pbmcgdGhpcyB0ZWNobmlxdWU6IGh0dHA6Ly93d3cudGVyYXRob24uY29tL2xlbmd5ZWwvTGVuZ3llbC1PYmxpcXVlLnBkZlxyXG5cdFx0X3JlZmxlY3RvclBsYW5lLnNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50KCBfbm9ybWFsLCBfcmVmbGVjdG9yV29ybGRQb3NpdGlvbiApO1xyXG5cdFx0X3JlZmxlY3RvclBsYW5lLmFwcGx5TWF0cml4NCggdmlydHVhbENhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UgKTtcclxuXHJcblx0XHRjbGlwUGxhbmUuc2V0KCBfcmVmbGVjdG9yUGxhbmUubm9ybWFsLngsIF9yZWZsZWN0b3JQbGFuZS5ub3JtYWwueSwgX3JlZmxlY3RvclBsYW5lLm5vcm1hbC56LCBfcmVmbGVjdG9yUGxhbmUuY29uc3RhbnQgKTtcclxuXHJcblx0XHRjb25zdCBwcm9qZWN0aW9uTWF0cml4ID0gdmlydHVhbENhbWVyYS5wcm9qZWN0aW9uTWF0cml4O1xyXG5cclxuXHRcdF9xLnggPSAoIE1hdGguc2lnbiggY2xpcFBsYW5lLnggKSArIHByb2plY3Rpb25NYXRyaXguZWxlbWVudHNbIDggXSApIC8gcHJvamVjdGlvbk1hdHJpeC5lbGVtZW50c1sgMCBdO1xyXG5cdFx0X3EueSA9ICggTWF0aC5zaWduKCBjbGlwUGxhbmUueSApICsgcHJvamVjdGlvbk1hdHJpeC5lbGVtZW50c1sgOSBdICkgLyBwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWyA1IF07XHJcblx0XHRfcS56ID0gLSAxLjA7XHJcblx0XHRfcS53ID0gKCAxLjAgKyBwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWyAxMCBdICkgLyBwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWyAxNCBdO1xyXG5cclxuXHRcdC8vIENhbGN1bGF0ZSB0aGUgc2NhbGVkIHBsYW5lIHZlY3RvclxyXG5cdFx0Y2xpcFBsYW5lLm11bHRpcGx5U2NhbGFyKCAxLjAgLyBjbGlwUGxhbmUuZG90KCBfcSApICk7XHJcblxyXG5cdFx0Y29uc3QgY2xpcEJpYXMgPSAwO1xyXG5cclxuXHRcdC8vIFJlcGxhY2luZyB0aGUgdGhpcmQgcm93IG9mIHRoZSBwcm9qZWN0aW9uIG1hdHJpeFxyXG5cdFx0cHJvamVjdGlvbk1hdHJpeC5lbGVtZW50c1sgMiBdID0gY2xpcFBsYW5lLng7XHJcblx0XHRwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWyA2IF0gPSBjbGlwUGxhbmUueTtcclxuXHRcdHByb2plY3Rpb25NYXRyaXguZWxlbWVudHNbIDEwIF0gPSAoIHJlbmRlcmVyLmNvb3JkaW5hdGVTeXN0ZW0gPT09IFdlYkdQVUNvb3JkaW5hdGVTeXN0ZW0gKSA/ICggY2xpcFBsYW5lLnogLSBjbGlwQmlhcyApIDogKCBjbGlwUGxhbmUueiArIDEuMCAtIGNsaXBCaWFzICk7XHJcblx0XHRwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWyAxNCBdID0gY2xpcFBsYW5lLnc7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHR0aGlzLnRleHR1cmVOb2RlLnZhbHVlID0gcmVuZGVyVGFyZ2V0LnRleHR1cmU7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmRlcHRoID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0dGhpcy50ZXh0dXJlTm9kZS5nZXREZXB0aE5vZGUoKS52YWx1ZSA9IHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdG1hdGVyaWFsLnZpc2libGUgPSBmYWxzZTtcclxuXHJcblx0XHRjb25zdCBjdXJyZW50UmVuZGVyVGFyZ2V0ID0gcmVuZGVyZXIuZ2V0UmVuZGVyVGFyZ2V0KCk7XHJcblx0XHRjb25zdCBjdXJyZW50TVJUID0gcmVuZGVyZXIuZ2V0TVJUKCk7XHJcblx0XHRjb25zdCBjdXJyZW50QXV0b0NsZWFyID0gcmVuZGVyZXIuYXV0b0NsZWFyO1xyXG5cclxuXHRcdHJlbmRlcmVyLnNldE1SVCggbnVsbCApO1xyXG5cdFx0cmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQgKTtcclxuXHRcdHJlbmRlcmVyLmF1dG9DbGVhciA9IHRydWU7XHJcblxyXG5cdFx0cmVuZGVyZXIucmVuZGVyKCBzY2VuZSwgdmlydHVhbENhbWVyYSApO1xyXG5cclxuXHRcdHJlbmRlcmVyLnNldE1SVCggY3VycmVudE1SVCApO1xyXG5cdFx0cmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCBjdXJyZW50UmVuZGVyVGFyZ2V0ICk7XHJcblx0XHRyZW5kZXJlci5hdXRvQ2xlYXIgPSBjdXJyZW50QXV0b0NsZWFyO1xyXG5cclxuXHRcdG1hdGVyaWFsLnZpc2libGUgPSB0cnVlO1xyXG5cclxuXHRcdF9pblJlZmxlY3RvciA9IGZhbHNlO1xyXG5cclxuXHRcdHRoaXMuZm9yY2VVcGRhdGUgPSBmYWxzZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSByZWZsZWN0b3Igbm9kZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbWV0ZXJzPXt9XSAtIEFuIG9iamVjdCBob2xkaW5nIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy5cclxuICogQHBhcmFtIHtPYmplY3QzRH0gW3BhcmFtZXRlcnMudGFyZ2V0PW5ldyBPYmplY3QzRCgpXSAtIFRoZSAzRCBvYmplY3QgdGhlIHJlZmxlY3RvciBpcyBsaW5rZWQgdG8uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbcGFyYW1ldGVycy5yZXNvbHV0aW9uPTFdIC0gVGhlIHJlc29sdXRpb24gc2NhbGUuXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BhcmFtZXRlcnMuZ2VuZXJhdGVNaXBtYXBzPWZhbHNlXSAtIFdoZXRoZXIgbWlwbWFwcyBzaG91bGQgYmUgZ2VuZXJhdGVkIG9yIG5vdC5cclxuICogQHBhcmFtIHtib29sZWFufSBbcGFyYW1ldGVycy5ib3VuY2VzPXRydWVdIC0gV2hldGhlciByZWZsZWN0b3JzIGNhbiByZW5kZXIgb3RoZXIgcmVmbGVjdG9yIG5vZGVzIG9yIG5vdC5cclxuICogQHBhcmFtIHtib29sZWFufSBbcGFyYW1ldGVycy5kZXB0aD1mYWxzZV0gLSBXaGV0aGVyIGRlcHRoIGRhdGEgc2hvdWxkIGJlIGdlbmVyYXRlZCBvciBub3QuXHJcbiAqIEBwYXJhbSB7VGV4dHVyZU5vZGV9IFtwYXJhbWV0ZXJzLmRlZmF1bHRUZXh0dXJlXSAtIFRoZSBkZWZhdWx0IHRleHR1cmUgbm9kZS5cclxuICogQHBhcmFtIHtSZWZsZWN0b3JCYXNlTm9kZX0gW3BhcmFtZXRlcnMucmVmbGVjdG9yXSAtIFRoZSByZWZsZWN0b3IgYmFzZSBub2RlLlxyXG4gKiBAcmV0dXJucyB7UmVmbGVjdG9yTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCByZWZsZWN0b3IgPSAoIHBhcmFtZXRlcnMgKSA9PiBub2RlT2JqZWN0KCBuZXcgUmVmbGVjdG9yTm9kZSggcGFyYW1ldGVycyApICk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBSZWZsZWN0b3JOb2RlO1xyXG4iLCJpbXBvcnQgeyBCdWZmZXJHZW9tZXRyeSB9IGZyb20gJy4uLy4uL2NvcmUvQnVmZmVyR2VvbWV0cnkuanMnO1xyXG5pbXBvcnQgeyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vLi4vY29yZS9CdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5pbXBvcnQgeyBNZXNoIH0gZnJvbSAnLi4vLi4vb2JqZWN0cy9NZXNoLmpzJztcclxuaW1wb3J0IHsgT3J0aG9ncmFwaGljQ2FtZXJhIH0gZnJvbSAnLi4vLi4vY2FtZXJhcy9PcnRob2dyYXBoaWNDYW1lcmEuanMnO1xyXG5cclxuY29uc3QgX2NhbWVyYSA9IC8qQF9fUFVSRV9fKi8gbmV3IE9ydGhvZ3JhcGhpY0NhbWVyYSggLSAxLCAxLCAxLCAtIDEsIDAsIDEgKTtcclxuXHJcbi8qKlxyXG4gKiBUaGUgcHVycG9zZSBvZiB0aGlzIHNwZWNpYWwgZ2VvbWV0cnkgaXMgdG8gZmlsbCB0aGUgZW50aXJlIHZpZXdwb3J0IHdpdGggYSBzaW5nbGUgdHJpYW5nbGUuXHJcbiAqXHJcbiAqIFJlZmVyZW5jZToge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9tcmRvb2IvdGhyZWUuanMvcHVsbC8yMTM1OH1cclxuICpcclxuICogQHByaXZhdGVcclxuICogQGF1Z21lbnRzIEJ1ZmZlckdlb21ldHJ5XHJcbiAqL1xyXG5jbGFzcyBRdWFkR2VvbWV0cnkgZXh0ZW5kcyBCdWZmZXJHZW9tZXRyeSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcXVhZCBnZW9tZXRyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ZsaXBZPWZhbHNlXSAtIFdoZXRoZXIgdGhlIHV2IGNvb3JkaW5hdGVzIHNob3VsZCBiZSBmbGlwcGVkIGFsb25nIHRoZSB2ZXJ0aWNhbCBheGlzIG9yIG5vdC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggZmxpcFkgPSBmYWxzZSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdGNvbnN0IHV2ID0gZmxpcFkgPT09IGZhbHNlID8gWyAwLCAtIDEsIDAsIDEsIDIsIDEgXSA6IFsgMCwgMiwgMCwgMCwgMiwgMCBdO1xyXG5cclxuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggWyAtIDEsIDMsIDAsIC0gMSwgLSAxLCAwLCAzLCAtIDEsIDAgXSwgMyApICk7XHJcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2LCAyICkgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuY29uc3QgX2dlb21ldHJ5ID0gLypAX19QVVJFX18qLyBuZXcgUXVhZEdlb21ldHJ5KCk7XHJcblxyXG5cclxuLyoqXHJcbiAqIFRoaXMgbW9kdWxlIGlzIGEgaGVscGVyIGZvciBwYXNzZXMgd2hpY2ggbmVlZCB0byByZW5kZXIgYSBmdWxsXHJcbiAqIHNjcmVlbiBlZmZlY3Qgd2hpY2ggaXMgcXVpdGUgY29tbW9uIGluIGNvbnRleHQgb2YgcG9zdCBwcm9jZXNzaW5nLlxyXG4gKlxyXG4gKiBUaGUgaW50ZW5kZWQgdXNhZ2UgaXMgdG8gcmV1c2UgYSBzaW5nbGUgcXVhZCBtZXNoIGZvciByZW5kZXJpbmdcclxuICogc3Vic2VxdWVudCBwYXNzZXMgYnkganVzdCByZWFzc2lnbmluZyB0aGUgYG1hdGVyaWFsYCByZWZlcmVuY2UuXHJcbiAqXHJcbiAqIE5vdGU6IFRoaXMgbW9kdWxlIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBgV2ViR1BVUmVuZGVyZXJgLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTWVzaFxyXG4gKi9cclxuY2xhc3MgUXVhZE1lc2ggZXh0ZW5kcyBNZXNoIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBxdWFkIG1lc2guXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gez9NYXRlcmlhbH0gW21hdGVyaWFsPW51bGxdIC0gVGhlIG1hdGVyaWFsIHRvIHJlbmRlciB0aGUgcXVhZCBtZXNoIHdpdGguXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG1hdGVyaWFsID0gbnVsbCApIHtcclxuXHJcblx0XHRzdXBlciggX2dlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNhbWVyYSB0byByZW5kZXIgdGhlIHF1YWQgbWVzaCB3aXRoLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPcnRob2dyYXBoaWNDYW1lcmF9XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jYW1lcmEgPSBfY2FtZXJhO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1F1YWRNZXNoID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBc3luYyB2ZXJzaW9uIG9mIGByZW5kZXIoKWAuXHJcblx0ICpcclxuXHQgKiBAYXN5bmNcclxuXHQgKiBAcGFyYW0ge1JlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcmV0dXJuIHtQcm9taXNlfSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSByZW5kZXIgaGFzIGJlZW4gZmluaXNoZWQuXHJcblx0ICovXHJcblx0YXN5bmMgcmVuZGVyQXN5bmMoIHJlbmRlcmVyICkge1xyXG5cclxuXHRcdHJldHVybiByZW5kZXJlci5yZW5kZXJBc3luYyggdGhpcywgX2NhbWVyYSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbmRlcnMgdGhlIHF1YWQgbWVzaFxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcblx0ICovXHJcblx0cmVuZGVyKCByZW5kZXJlciApIHtcclxuXHJcblx0XHRyZW5kZXJlci5yZW5kZXIoIHRoaXMsIF9jYW1lcmEgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUXVhZE1lc2g7XHJcbiIsImltcG9ydCB7IG5vZGVPYmplY3QgfSBmcm9tICcuLi90c2wvVFNMQ29yZS5qcyc7XHJcbmltcG9ydCBUZXh0dXJlTm9kZSBmcm9tICcuLi9hY2Nlc3NvcnMvVGV4dHVyZU5vZGUuanMnO1xyXG5pbXBvcnQgeyBOb2RlVXBkYXRlVHlwZSB9IGZyb20gJy4uL2NvcmUvY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgdXYgfSBmcm9tICcuLi9hY2Nlc3NvcnMvVVYuanMnO1xyXG5pbXBvcnQgTm9kZU1hdGVyaWFsIGZyb20gJy4uLy4uL21hdGVyaWFscy9ub2Rlcy9Ob2RlTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgUXVhZE1lc2ggZnJvbSAnLi4vLi4vcmVuZGVyZXJzL2NvbW1vbi9RdWFkTWVzaC5qcyc7XHJcblxyXG5pbXBvcnQgeyBSZW5kZXJUYXJnZXQgfSBmcm9tICcuLi8uLi9jb3JlL1JlbmRlclRhcmdldC5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjIuanMnO1xyXG5pbXBvcnQgeyBIYWxmRmxvYXRUeXBlIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzLmpzJztcclxuXHJcbmNvbnN0IF9zaXplID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMigpO1xyXG5cclxuLyoqXHJcbiAqIGBSVFROb2RlYCB0YWtlcyBhbm90aGVyIG5vZGUgYW5kIHVzZXMgaXQgd2l0aCBhIGBRdWFkTWVzaGAgdG8gcmVuZGVyIGludG8gYSB0ZXh0dXJlIChSVFQpLlxyXG4gKiBUaGlzIG1vZHVsZSBpcyBlc3BlY2lhbGx5IHJlbGV2YW50IGluIGNvbnRleHQgb2YgcG9zdCBwcm9jZXNzaW5nIHdoZXJlIGNlcnRhaW4gbm9kZXMgcmVxdWlyZVxyXG4gKiB0ZXh0dXJlIGlucHV0IGZvciB0aGVpciBlZmZlY3RzLiBXaXRoIHRoZSBoZWxwZXIgZnVuY3Rpb24gYGNvbnZlcnRUb1RleHR1cmUoKWAgd2hpY2ggaXMgYmFzZWRcclxuICogb24gdGhpcyBtb2R1bGUsIHRoZSBub2RlIHN5c3RlbSBjYW4gYXV0b21hdGljYWxseSBlbnN1cmUgdGV4dHVyZSBpbnB1dCBpZiByZXF1aXJlZC5cclxuICpcclxuICogQGF1Z21lbnRzIFRleHR1cmVOb2RlXHJcbiAqL1xyXG5jbGFzcyBSVFROb2RlIGV4dGVuZHMgVGV4dHVyZU5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdSVFROb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IFJUVCBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIG5vZGUgdG8gcmVuZGVyIGEgdGV4dHVyZSB3aXRoLlxyXG5cdCAqIEBwYXJhbSB7P251bWJlcn0gW3dpZHRoPW51bGxdIC0gVGhlIHdpZHRoIG9mIHRoZSBpbnRlcm5hbCByZW5kZXIgdGFyZ2V0LiBJZiBub3Qgd2lkdGggaXMgYXBwbGllZCwgdGhlIHJlbmRlciB0YXJnZXQgaXMgYXV0b21hdGljYWxseSByZXNpemVkLlxyXG5cdCAqIEBwYXJhbSB7P251bWJlcn0gW2hlaWdodD1udWxsXSAtIFRoZSBoZWlnaHQgb2YgdGhlIGludGVybmFsIHJlbmRlciB0YXJnZXQuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt0eXBlOkhhbGZGbG9hdFR5cGV9XSAtIFRoZSBvcHRpb25zIGZvciB0aGUgaW50ZXJuYWwgcmVuZGVyIHRhcmdldC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggbm9kZSwgd2lkdGggPSBudWxsLCBoZWlnaHQgPSBudWxsLCBvcHRpb25zID0geyB0eXBlOiBIYWxmRmxvYXRUeXBlIH0gKSB7XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyVGFyZ2V0ID0gbmV3IFJlbmRlclRhcmdldCggd2lkdGgsIGhlaWdodCwgb3B0aW9ucyApO1xyXG5cclxuXHRcdHN1cGVyKCByZW5kZXJUYXJnZXQudGV4dHVyZSwgdXYoKSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG5vZGUgdG8gcmVuZGVyIGEgdGV4dHVyZSB3aXRoLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vZGUgPSBub2RlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHdpZHRoIG9mIHRoZSBpbnRlcm5hbCByZW5kZXIgdGFyZ2V0LlxyXG5cdFx0ICogSWYgbm90IHdpZHRoIGlzIGFwcGxpZWQsIHRoZSByZW5kZXIgdGFyZ2V0IGlzIGF1dG9tYXRpY2FsbHkgcmVzaXplZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy53aWR0aCA9IHdpZHRoO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGhlaWdodCBvZiB0aGUgaW50ZXJuYWwgcmVuZGVyIHRhcmdldC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5oZWlnaHQgPSBoZWlnaHQ7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcGl4ZWwgcmF0aW9cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBpeGVsUmF0aW8gPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJlbmRlciB0YXJnZXRcclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7UmVuZGVyVGFyZ2V0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJlbmRlclRhcmdldCA9IHJlbmRlclRhcmdldDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIHRleHR1cmUgcmVxdWlyZXMgYW4gdXBkYXRlIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50ZXh0dXJlTmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgdGV4dHVyZSBzaG91bGQgYXV0b21hdGljYWxseSBiZSB1cGRhdGVkIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hdXRvVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBub2RlIHdoaWNoIGlzIHVzZWQgd2l0aCB0aGUgcXVhZCBtZXNoIGZvciBSVFQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHtOb2RlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9ydHROb2RlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBpbnRlcm5hbCBxdWFkIG1lc2ggZm9yIFJUVC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge1F1YWRNZXNofVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9xdWFkTWVzaCA9IG5ldyBRdWFkTWVzaCggbmV3IE5vZGVNYXRlcmlhbCgpICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYHVwZGF0ZUJlZm9yZVR5cGVgIGlzIHNldCB0byBgTm9kZVVwZGF0ZVR5cGUuUkVOREVSYCBzaW5jZSB0aGUgbm9kZSB1cGRhdGVzXHJcblx0XHQgKiB0aGUgdGV4dHVyZSBvbmNlIHBlciByZW5kZXIgaW4gaXRzIHtAbGluayBSVFROb2RlI3VwZGF0ZUJlZm9yZX0gbWV0aG9kLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKiBAZGVmYXVsdCAncmVuZGVyJ1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVwZGF0ZUJlZm9yZVR5cGUgPSBOb2RlVXBkYXRlVHlwZS5SRU5ERVI7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogV2hldGhlciB0aGUgaW50ZXJuYWwgcmVuZGVyIHRhcmdldCBzaG91bGQgYXV0b21hdGljYWxseSBiZSByZXNpemVkIG9yIG5vdC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdCAqIEByZWFkb25seVxyXG5cdCAqIEBkZWZhdWx0IHRydWVcclxuXHQgKi9cclxuXHRnZXQgYXV0b1NpemUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMud2lkdGggPT09IG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXAoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0dGhpcy5fcnR0Tm9kZSA9IHRoaXMubm9kZS5jb250ZXh0KCBidWlsZGVyLmdldFNoYXJlZENvbnRleHQoKSApO1xyXG5cdFx0dGhpcy5fcXVhZE1lc2gubWF0ZXJpYWwubmFtZSA9ICdSVFQnO1xyXG5cdFx0dGhpcy5fcXVhZE1lc2gubWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdHJldHVybiBzdXBlci5zZXR1cCggYnVpbGRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHNpemUgb2YgdGhlIGludGVybmFsIHJlbmRlciB0YXJnZXRcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCB0byBzZXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSB3aWR0aCB0byBzZXQuXHJcblx0ICovXHJcblx0c2V0U2l6ZSggd2lkdGgsIGhlaWdodCApIHtcclxuXHJcblx0XHR0aGlzLndpZHRoID0gd2lkdGg7XHJcblx0XHR0aGlzLmhlaWdodCA9IGhlaWdodDtcclxuXHJcblx0XHRjb25zdCBlZmZlY3RpdmVXaWR0aCA9IHdpZHRoICogdGhpcy5waXhlbFJhdGlvO1xyXG5cdFx0Y29uc3QgZWZmZWN0aXZlSGVpZ2h0ID0gaGVpZ2h0ICogdGhpcy5waXhlbFJhdGlvO1xyXG5cclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0LnNldFNpemUoIGVmZmVjdGl2ZVdpZHRoLCBlZmZlY3RpdmVIZWlnaHQgKTtcclxuXHJcblx0XHR0aGlzLnRleHR1cmVOZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgcGl4ZWwgcmF0aW8uIFRoaXMgd2lsbCBhbHNvIHJlc2l6ZSB0aGUgcmVuZGVyIHRhcmdldC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBwaXhlbFJhdGlvIC0gVGhlIHBpeGVsIHJhdGlvIHRvIHNldC5cclxuXHQgKi9cclxuXHRzZXRQaXhlbFJhdGlvKCBwaXhlbFJhdGlvICkge1xyXG5cclxuXHRcdHRoaXMucGl4ZWxSYXRpbyA9IHBpeGVsUmF0aW87XHJcblxyXG5cdFx0dGhpcy5zZXRTaXplKCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCApO1xyXG5cclxuXHR9XHJcblxyXG5cdHVwZGF0ZUJlZm9yZSggeyByZW5kZXJlciB9ICkge1xyXG5cclxuXHRcdGlmICggdGhpcy50ZXh0dXJlTmVlZHNVcGRhdGUgPT09IGZhbHNlICYmIHRoaXMuYXV0b1VwZGF0ZSA9PT0gZmFsc2UgKSByZXR1cm47XHJcblxyXG5cdFx0dGhpcy50ZXh0dXJlTmVlZHNVcGRhdGUgPSBmYWxzZTtcclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGlmICggdGhpcy5hdXRvU2l6ZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdHRoaXMucGl4ZWxSYXRpbyA9IHJlbmRlcmVyLmdldFBpeGVsUmF0aW8oKTtcclxuXHJcblx0XHRcdGNvbnN0IHNpemUgPSByZW5kZXJlci5nZXRTaXplKCBfc2l6ZSApO1xyXG5cclxuXHRcdFx0dGhpcy5zZXRTaXplKCBzaXplLndpZHRoLCBzaXplLmhlaWdodCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdHRoaXMuX3F1YWRNZXNoLm1hdGVyaWFsLmZyYWdtZW50Tm9kZSA9IHRoaXMuX3J0dE5vZGU7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCBjdXJyZW50UmVuZGVyVGFyZ2V0ID0gcmVuZGVyZXIuZ2V0UmVuZGVyVGFyZ2V0KCk7XHJcblxyXG5cdFx0cmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCB0aGlzLnJlbmRlclRhcmdldCApO1xyXG5cclxuXHRcdHRoaXMuX3F1YWRNZXNoLnJlbmRlciggcmVuZGVyZXIgKTtcclxuXHJcblx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIGN1cnJlbnRSZW5kZXJUYXJnZXQgKTtcclxuXHJcblx0fVxyXG5cclxuXHRjbG9uZSgpIHtcclxuXHJcblx0XHRjb25zdCBuZXdOb2RlID0gbmV3IFRleHR1cmVOb2RlKCB0aGlzLnZhbHVlLCB0aGlzLnV2Tm9kZSwgdGhpcy5sZXZlbE5vZGUgKTtcclxuXHRcdG5ld05vZGUuc2FtcGxlciA9IHRoaXMuc2FtcGxlcjtcclxuXHRcdG5ld05vZGUucmVmZXJlbmNlTm9kZSA9IHRoaXM7XHJcblxyXG5cdFx0cmV0dXJuIG5ld05vZGU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFJUVE5vZGU7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIFJUVCBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBUaGUgbm9kZSB0byByZW5kZXIgYSB0ZXh0dXJlIHdpdGguXHJcbiAqIEBwYXJhbSB7P251bWJlcn0gW3dpZHRoPW51bGxdIC0gVGhlIHdpZHRoIG9mIHRoZSBpbnRlcm5hbCByZW5kZXIgdGFyZ2V0LiBJZiBub3Qgd2lkdGggaXMgYXBwbGllZCwgdGhlIHJlbmRlciB0YXJnZXQgaXMgYXV0b21hdGljYWxseSByZXNpemVkLlxyXG4gKiBAcGFyYW0gez9udW1iZXJ9IFtoZWlnaHQ9bnVsbF0gLSBUaGUgaGVpZ2h0IG9mIHRoZSBpbnRlcm5hbCByZW5kZXIgdGFyZ2V0LlxyXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e3R5cGU6SGFsZkZsb2F0VHlwZX1dIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBpbnRlcm5hbCByZW5kZXIgdGFyZ2V0LlxyXG4gKiBAcmV0dXJucyB7UlRUTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBydHQgPSAoIG5vZGUsIC4uLnBhcmFtcyApID0+IG5vZGVPYmplY3QoIG5ldyBSVFROb2RlKCBub2RlT2JqZWN0KCBub2RlICksIC4uLnBhcmFtcyApICk7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjb252ZXJ0aW5nIG5vZGVzIHRvIHRleHR1cmVzIG5vZGVzLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBUaGUgbm9kZSB0byByZW5kZXIgYSB0ZXh0dXJlIHdpdGguXHJcbiAqIEBwYXJhbSB7P251bWJlcn0gW3dpZHRoPW51bGxdIC0gVGhlIHdpZHRoIG9mIHRoZSBpbnRlcm5hbCByZW5kZXIgdGFyZ2V0LiBJZiBub3Qgd2lkdGggaXMgYXBwbGllZCwgdGhlIHJlbmRlciB0YXJnZXQgaXMgYXV0b21hdGljYWxseSByZXNpemVkLlxyXG4gKiBAcGFyYW0gez9udW1iZXJ9IFtoZWlnaHQ9bnVsbF0gLSBUaGUgaGVpZ2h0IG9mIHRoZSBpbnRlcm5hbCByZW5kZXIgdGFyZ2V0LlxyXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e3R5cGU6SGFsZkZsb2F0VHlwZX1dIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBpbnRlcm5hbCByZW5kZXIgdGFyZ2V0LlxyXG4gKiBAcmV0dXJucyB7UlRUTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBjb252ZXJ0VG9UZXh0dXJlID0gKCBub2RlLCAuLi5wYXJhbXMgKSA9PiB7XHJcblxyXG5cdGlmICggbm9kZS5pc1RleHR1cmVOb2RlICkgcmV0dXJuIG5vZGU7XHJcblx0aWYgKCBub2RlLmlzUGFzc05vZGUgKSByZXR1cm4gbm9kZS5nZXRUZXh0dXJlTm9kZSgpO1xyXG5cclxuXHRyZXR1cm4gcnR0KCBub2RlLCAuLi5wYXJhbXMgKTtcclxuXHJcbn07XHJcbiIsImltcG9ydCB7IGFicywgY3Jvc3MsIGZsb2F0LCBGbiwgbm9ybWFsaXplLCBpdmVjMiwgc3ViLCB2ZWMyLCB2ZWMzLCB2ZWM0IH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5pbXBvcnQgeyB0ZXh0dXJlU2l6ZSB9IGZyb20gJy4uL2FjY2Vzc29ycy9UZXh0dXJlU2l6ZU5vZGUuanMnO1xyXG5pbXBvcnQgeyB0ZXh0dXJlTG9hZCB9IGZyb20gJy4uL2FjY2Vzc29ycy9UZXh0dXJlTm9kZS5qcyc7XHJcbmltcG9ydCB7IFdlYkdQVUNvb3JkaW5hdGVTeXN0ZW0gfSBmcm9tICcuLi8uLi9jb25zdGFudHMuanMnO1xyXG5cclxuLyoqXHJcbiAqIENvbXB1dGVzIGEgcG9zaXRpb24gaW4gdmlldyBzcGFjZSBiYXNlZCBvbiBhIGZyYWdtZW50J3Mgc2NyZWVuIHBvc2l0aW9uIGV4cHJlc3NlZCBhcyB1diBjb29yZGluYXRlcywgdGhlIGZyYWdtZW50c1xyXG4gKiBkZXB0aCB2YWx1ZSBhbmQgdGhlIGNhbWVyYSdzIGludmVyc2UgcHJvamVjdGlvbiBtYXRyaXguXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMyPn0gc2NyZWVuUG9zaXRpb24gLSBUaGUgZnJhZ21lbnQncyBzY3JlZW4gcG9zaXRpb24gZXhwcmVzc2VkIGFzIHV2IGNvb3JkaW5hdGVzLlxyXG4gKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSBkZXB0aCAtIFRoZSBmcmFnbWVudCdzIGRlcHRoIHZhbHVlLlxyXG4gKiBAcGFyYW0ge05vZGU8bWF0ND59IHByb2plY3Rpb25NYXRyaXhJbnZlcnNlIC0gVGhlIGNhbWVyYSdzIGludmVyc2UgcHJvamVjdGlvbiBtYXRyaXguXHJcbiAqIEByZXR1cm4ge05vZGU8dmVjMz59IFRoZSBmcmFnbWVudHMgcG9zaXRpb24gaW4gdmlldyBzcGFjZS5cclxuICovXHJcbmV4cG9ydCBjb25zdCBnZXRWaWV3UG9zaXRpb24gPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgc2NyZWVuUG9zaXRpb24sIGRlcHRoLCBwcm9qZWN0aW9uTWF0cml4SW52ZXJzZSBdLCBidWlsZGVyICkgPT4ge1xyXG5cclxuXHRsZXQgY2xpcFNwYWNlUG9zaXRpb247XHJcblxyXG5cdGlmICggYnVpbGRlci5yZW5kZXJlci5jb29yZGluYXRlU3lzdGVtID09PSBXZWJHUFVDb29yZGluYXRlU3lzdGVtICkge1xyXG5cclxuXHRcdHNjcmVlblBvc2l0aW9uID0gdmVjMiggc2NyZWVuUG9zaXRpb24ueCwgc2NyZWVuUG9zaXRpb24ueS5vbmVNaW51cygpICkubXVsKCAyLjAgKS5zdWIoIDEuMCApO1xyXG5cdFx0Y2xpcFNwYWNlUG9zaXRpb24gPSB2ZWM0KCB2ZWMzKCBzY3JlZW5Qb3NpdGlvbiwgZGVwdGggKSwgMS4wICk7XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0Y2xpcFNwYWNlUG9zaXRpb24gPSB2ZWM0KCB2ZWMzKCBzY3JlZW5Qb3NpdGlvbi54LCBzY3JlZW5Qb3NpdGlvbi55Lm9uZU1pbnVzKCksIGRlcHRoICkubXVsKCAyLjAgKS5zdWIoIDEuMCApLCAxLjAgKTtcclxuXHJcblx0fVxyXG5cclxuXHRjb25zdCB2aWV3U3BhY2VQb3NpdGlvbiA9IHZlYzQoIHByb2plY3Rpb25NYXRyaXhJbnZlcnNlLm11bCggY2xpcFNwYWNlUG9zaXRpb24gKSApO1xyXG5cclxuXHRyZXR1cm4gdmlld1NwYWNlUG9zaXRpb24ueHl6LmRpdiggdmlld1NwYWNlUG9zaXRpb24udyApO1xyXG5cclxufSApO1xyXG5cclxuLyoqXHJcbiAqIENvbXB1dGVzIGEgc2NyZWVuIHBvc2l0aW9uIGV4cHJlc3NlZCBhcyB1diBjb29yZGluYXRlcyBiYXNlZCBvbiBhIGZyYWdtZW50J3MgcG9zaXRpb24gaW4gdmlldyBzcGFjZVxyXG4gKiBhbmQgdGhlIGNhbWVyYSdzIHByb2plY3Rpb24gbWF0cml4XHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMzPn0gdmlld1Bvc2l0aW9uIC0gVGhlIGZyYWdtZW50cyBwb3NpdGlvbiBpbiB2aWV3IHNwYWNlLlxyXG4gKiBAcGFyYW0ge05vZGU8bWF0ND59IHByb2plY3Rpb25NYXRyaXggLSBUaGUgY2FtZXJhJ3MgcHJvamVjdGlvbiBtYXRyaXguXHJcbiAqIEByZXR1cm4ge05vZGU8dmVjMj59IFRoZSBmcmFnbWVudCdzIHNjcmVlbiBwb3NpdGlvbiBleHByZXNzZWQgYXMgdXYgY29vcmRpbmF0ZXMuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZ2V0U2NyZWVuUG9zaXRpb24gPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgdmlld1Bvc2l0aW9uLCBwcm9qZWN0aW9uTWF0cml4IF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IHNhbXBsZUNsaXBQb3MgPSBwcm9qZWN0aW9uTWF0cml4Lm11bCggdmVjNCggdmlld1Bvc2l0aW9uLCAxLjAgKSApO1xyXG5cdGNvbnN0IHNhbXBsZVV2ID0gc2FtcGxlQ2xpcFBvcy54eS5kaXYoIHNhbXBsZUNsaXBQb3MudyApLm11bCggMC41ICkuYWRkKCAwLjUgKS50b1ZhcigpO1xyXG5cdHJldHVybiB2ZWMyKCBzYW1wbGVVdi54LCBzYW1wbGVVdi55Lm9uZU1pbnVzKCkgKTtcclxuXHJcbn0gKTtcclxuXHJcbi8qKlxyXG4gKiBDb21wdXRlcyBhIG5vcm1hbCB2ZWN0b3IgYmFzZWQgb24gZGVwdGggZGF0YS4gQ2FuIGJlIHVzZWQgYXMgYSBmYWxsYmFjayB3aGVuIG5vIG5vcm1hbCByZW5kZXJcclxuICogdGFyZ2V0IGlzIGF2YWlsYWJsZSBvciBpZiBmbGF0IHN1cmZhY2Ugbm9ybWFscyBhcmUgcmVxdWlyZWQuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMyPn0gdXYgLSBUaGUgdGV4dHVyZSBjb29yZGluYXRlLlxyXG4gKiBAcGFyYW0ge0RlcHRoVGV4dHVyZX0gZGVwdGhUZXh0dXJlIC0gVGhlIGRlcHRoIHRleHR1cmUuXHJcbiAqIEBwYXJhbSB7Tm9kZTxtYXQ0Pn0gcHJvamVjdGlvbk1hdHJpeEludmVyc2UgLSBUaGUgY2FtZXJhJ3MgaW52ZXJzZSBwcm9qZWN0aW9uIG1hdHJpeC5cclxuICogQHJldHVybiB7Tm9kZTx2ZWMzPn0gVGhlIGNvbXB1dGVkIG5vcm1hbCB2ZWN0b3IuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZ2V0Tm9ybWFsRnJvbURlcHRoID0gLypAX19QVVJFX18qLyBGbiggKCBbIHV2LCBkZXB0aFRleHR1cmUsIHByb2plY3Rpb25NYXRyaXhJbnZlcnNlIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IHNpemUgPSB0ZXh0dXJlU2l6ZSggdGV4dHVyZUxvYWQoIGRlcHRoVGV4dHVyZSApICk7XHJcblx0Y29uc3QgcCA9IGl2ZWMyKCB1di5tdWwoIHNpemUgKSApLnRvVmFyKCk7XHJcblxyXG5cdGNvbnN0IGMwID0gdGV4dHVyZUxvYWQoIGRlcHRoVGV4dHVyZSwgcCApLnRvVmFyKCk7XHJcblxyXG5cdGNvbnN0IGwyID0gdGV4dHVyZUxvYWQoIGRlcHRoVGV4dHVyZSwgcC5zdWIoIGl2ZWMyKCAyLCAwICkgKSApLnRvVmFyKCk7XHJcblx0Y29uc3QgbDEgPSB0ZXh0dXJlTG9hZCggZGVwdGhUZXh0dXJlLCBwLnN1YiggaXZlYzIoIDEsIDAgKSApICkudG9WYXIoKTtcclxuXHRjb25zdCByMSA9IHRleHR1cmVMb2FkKCBkZXB0aFRleHR1cmUsIHAuYWRkKCBpdmVjMiggMSwgMCApICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHIyID0gdGV4dHVyZUxvYWQoIGRlcHRoVGV4dHVyZSwgcC5hZGQoIGl2ZWMyKCAyLCAwICkgKSApLnRvVmFyKCk7XHJcblx0Y29uc3QgYjIgPSB0ZXh0dXJlTG9hZCggZGVwdGhUZXh0dXJlLCBwLmFkZCggaXZlYzIoIDAsIDIgKSApICkudG9WYXIoKTtcclxuXHRjb25zdCBiMSA9IHRleHR1cmVMb2FkKCBkZXB0aFRleHR1cmUsIHAuYWRkKCBpdmVjMiggMCwgMSApICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHQxID0gdGV4dHVyZUxvYWQoIGRlcHRoVGV4dHVyZSwgcC5zdWIoIGl2ZWMyKCAwLCAxICkgKSApLnRvVmFyKCk7XHJcblx0Y29uc3QgdDIgPSB0ZXh0dXJlTG9hZCggZGVwdGhUZXh0dXJlLCBwLnN1YiggaXZlYzIoIDAsIDIgKSApICkudG9WYXIoKTtcclxuXHJcblx0Y29uc3QgZGwgPSBhYnMoIHN1YiggZmxvYXQoIDIgKS5tdWwoIGwxICkuc3ViKCBsMiApLCBjMCApICkudG9WYXIoKTtcclxuXHRjb25zdCBkciA9IGFicyggc3ViKCBmbG9hdCggMiApLm11bCggcjEgKS5zdWIoIHIyICksIGMwICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IGRiID0gYWJzKCBzdWIoIGZsb2F0KCAyICkubXVsKCBiMSApLnN1YiggYjIgKSwgYzAgKSApLnRvVmFyKCk7XHJcblx0Y29uc3QgZHQgPSBhYnMoIHN1YiggZmxvYXQoIDIgKS5tdWwoIHQxICkuc3ViKCB0MiApLCBjMCApICkudG9WYXIoKTtcclxuXHJcblx0Y29uc3QgY2UgPSBnZXRWaWV3UG9zaXRpb24oIHV2LCBjMCwgcHJvamVjdGlvbk1hdHJpeEludmVyc2UgKS50b1ZhcigpO1xyXG5cclxuXHRjb25zdCBkcGR4ID0gZGwubGVzc1RoYW4oIGRyICkuc2VsZWN0KCBjZS5zdWIoIGdldFZpZXdQb3NpdGlvbiggdXYuc3ViKCB2ZWMyKCBmbG9hdCggMSApLmRpdiggc2l6ZS54ICksIDAgKSApLCBsMSwgcHJvamVjdGlvbk1hdHJpeEludmVyc2UgKSApLCBjZS5uZWdhdGUoKS5hZGQoIGdldFZpZXdQb3NpdGlvbiggdXYuYWRkKCB2ZWMyKCBmbG9hdCggMSApLmRpdiggc2l6ZS54ICksIDAgKSApLCByMSwgcHJvamVjdGlvbk1hdHJpeEludmVyc2UgKSApICk7XHJcblx0Y29uc3QgZHBkeSA9IGRiLmxlc3NUaGFuKCBkdCApLnNlbGVjdCggY2Uuc3ViKCBnZXRWaWV3UG9zaXRpb24oIHV2LmFkZCggdmVjMiggMCwgZmxvYXQoIDEgKS5kaXYoIHNpemUueSApICkgKSwgYjEsIHByb2plY3Rpb25NYXRyaXhJbnZlcnNlICkgKSwgY2UubmVnYXRlKCkuYWRkKCBnZXRWaWV3UG9zaXRpb24oIHV2LnN1YiggdmVjMiggMCwgZmxvYXQoIDEgKS5kaXYoIHNpemUueSApICkgKSwgdDEsIHByb2plY3Rpb25NYXRyaXhJbnZlcnNlICkgKSApO1xyXG5cclxuXHRyZXR1cm4gbm9ybWFsaXplKCBjcm9zcyggZHBkeCwgZHBkeSApICk7XHJcblxyXG59ICk7XHJcbiIsImltcG9ydCB7IEluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uLy4uL2NvcmUvSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIHNwZWNpYWwgdHlwZSBvZiBpbnN0YW5jZWQgYnVmZmVyIGF0dHJpYnV0ZSBpcyBpbnRlbmRlZCBmb3IgY29tcHV0ZSBzaGFkZXJzLlxyXG4gKiBJbiBlYXJsaWVyIHRocmVlLmpzIHZlcnNpb25zIGl0IHdhcyBvbmx5IHBvc3NpYmxlIHRvIHVwZGF0ZSBhdHRyaWJ1dGUgZGF0YVxyXG4gKiBvbiB0aGUgQ1BVIHZpYSBKYXZhU2NyaXB0IGFuZCB0aGVuIHVwbG9hZCB0aGUgZGF0YSB0byB0aGUgR1BVLiBXaXRoIHRoZVxyXG4gKiBuZXcgbWF0ZXJpYWwgc3lzdGVtIGFuZCByZW5kZXJlciBpdCBpcyBub3cgcG9zc2libGUgdG8gdXNlIGNvbXB1dGUgc2hhZGVyc1xyXG4gKiB0byBjb21wdXRlIHRoZSBkYXRhIGZvciBhbiBhdHRyaWJ1dGUgbW9yZSBlZmZpY2llbnRseSBvbiB0aGUgR1BVLlxyXG4gKlxyXG4gKiBUaGUgaWRlYSBpcyB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbmQgcHJvdmlkZSBpdCBhcyBhbiBpbnB1dFxyXG4gKiB0byB7QGxpbmsgU3RvcmFnZUJ1ZmZlck5vZGV9LlxyXG4gKlxyXG4gKiBOb3RlOiBUaGlzIHR5cGUgb2YgYnVmZmVyIGF0dHJpYnV0ZSBjYW4gb25seSBiZSB1c2VkIHdpdGggYFdlYkdQVVJlbmRlcmVyYC5cclxuICpcclxuICogQGF1Z21lbnRzIEluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZVxyXG4gKi9cclxuY2xhc3MgU3RvcmFnZUluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSBleHRlbmRzIEluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc3RvcmFnZSBpbnN0YW5jZWQgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfFR5cGVkQXJyYXl9IGNvdW50IC0gVGhlIGl0ZW0gY291bnQuIEl0IGlzIGFsc28gdmFsaWQgdG8gcGFzcyBhIHR5cGVkIGFycmF5IGFzIGFuIGFyZ3VtZW50LlxyXG5cdCAqIFRoZSBzdWJzZXF1ZW50IHBhcmFtZXRlcnMgYXJlIHRoZW4gb2Jzb2xldGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGl0ZW1TaXplIC0gVGhlIGl0ZW0gc2l6ZS5cclxuXHQgKiBAcGFyYW0ge1R5cGVkQXJyYXkuY29uc3RydWN0b3J9IFt0eXBlQ2xhc3M9RmxvYXQzMkFycmF5XSAtIEEgdHlwZWQgYXJyYXkgY29uc3RydWN0b3IuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGNvdW50LCBpdGVtU2l6ZSwgdHlwZUNsYXNzID0gRmxvYXQzMkFycmF5ICkge1xyXG5cclxuXHRcdGNvbnN0IGFycmF5ID0gQXJyYXlCdWZmZXIuaXNWaWV3KCBjb3VudCApID8gY291bnQgOiBuZXcgdHlwZUNsYXNzKCBjb3VudCAqIGl0ZW1TaXplICk7XHJcblxyXG5cdFx0c3VwZXIoIGFycmF5LCBpdGVtU2l6ZSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1N0b3JhZ2VJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTdG9yYWdlSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlO1xyXG4iLCJpbXBvcnQgeyBCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi8uLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBzcGVjaWFsIHR5cGUgb2YgYnVmZmVyIGF0dHJpYnV0ZSBpcyBpbnRlbmRlZCBmb3IgY29tcHV0ZSBzaGFkZXJzLlxyXG4gKiBJbiBlYXJsaWVyIHRocmVlLmpzIHZlcnNpb25zIGl0IHdhcyBvbmx5IHBvc3NpYmxlIHRvIHVwZGF0ZSBhdHRyaWJ1dGUgZGF0YVxyXG4gKiBvbiB0aGUgQ1BVIHZpYSBKYXZhU2NyaXB0IGFuZCB0aGVuIHVwbG9hZCB0aGUgZGF0YSB0byB0aGUgR1BVLiBXaXRoIHRoZVxyXG4gKiBuZXcgbWF0ZXJpYWwgc3lzdGVtIGFuZCByZW5kZXJlciBpdCBpcyBub3cgcG9zc2libGUgdG8gdXNlIGNvbXB1dGUgc2hhZGVyc1xyXG4gKiB0byBjb21wdXRlIHRoZSBkYXRhIGZvciBhbiBhdHRyaWJ1dGUgbW9yZSBlZmZpY2llbnRseSBvbiB0aGUgR1BVLlxyXG4gKlxyXG4gKiBUaGUgaWRlYSBpcyB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbmQgcHJvdmlkZSBpdCBhcyBhbiBpbnB1dFxyXG4gKiB0byB7QGxpbmsgU3RvcmFnZUJ1ZmZlck5vZGV9LlxyXG4gKlxyXG4gKiBOb3RlOiBUaGlzIHR5cGUgb2YgYnVmZmVyIGF0dHJpYnV0ZSBjYW4gb25seSBiZSB1c2VkIHdpdGggYFdlYkdQVVJlbmRlcmVyYC5cclxuICpcclxuICogQGF1Z21lbnRzIEJ1ZmZlckF0dHJpYnV0ZVxyXG4gKi9cclxuY2xhc3MgU3RvcmFnZUJ1ZmZlckF0dHJpYnV0ZSBleHRlbmRzIEJ1ZmZlckF0dHJpYnV0ZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc3RvcmFnZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ8VHlwZWRBcnJheX0gY291bnQgLSBUaGUgaXRlbSBjb3VudC4gSXQgaXMgYWxzbyB2YWxpZCB0byBwYXNzIGEgdHlwZWQgYXJyYXkgYXMgYW4gYXJndW1lbnQuXHJcblx0ICogVGhlIHN1YnNlcXVlbnQgcGFyYW1ldGVycyBhcmUgdGhlbiBvYnNvbGV0ZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaXRlbVNpemUgLSBUaGUgaXRlbSBzaXplLlxyXG5cdCAqIEBwYXJhbSB7VHlwZWRBcnJheS5jb25zdHJ1Y3Rvcn0gW3R5cGVDbGFzcz1GbG9hdDMyQXJyYXldIC0gQSB0eXBlZCBhcnJheSBjb25zdHJ1Y3Rvci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggY291bnQsIGl0ZW1TaXplLCB0eXBlQ2xhc3MgPSBGbG9hdDMyQXJyYXkgKSB7XHJcblxyXG5cdFx0Y29uc3QgYXJyYXkgPSBBcnJheUJ1ZmZlci5pc1ZpZXcoIGNvdW50ICkgPyBjb3VudCA6IG5ldyB0eXBlQ2xhc3MoIGNvdW50ICogaXRlbVNpemUgKTtcclxuXHJcblx0XHRzdXBlciggYXJyYXksIGl0ZW1TaXplICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzU3RvcmFnZUJ1ZmZlckF0dHJpYnV0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFN0b3JhZ2VCdWZmZXJBdHRyaWJ1dGU7XHJcbiIsImltcG9ydCBTdG9yYWdlSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlIGZyb20gJy4uLy4uL3JlbmRlcmVycy9jb21tb24vU3RvcmFnZUluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcbmltcG9ydCBTdG9yYWdlQnVmZmVyQXR0cmlidXRlIGZyb20gJy4uLy4uL3JlbmRlcmVycy9jb21tb24vU3RvcmFnZUJ1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcbmltcG9ydCB7IHN0b3JhZ2UgfSBmcm9tICcuL1N0b3JhZ2VCdWZmZXJOb2RlLmpzJztcclxuaW1wb3J0IHsgZ2V0TGVuZ3RoRnJvbVR5cGUsIGdldFR5cGVkQXJyYXlGcm9tVHlwZSB9IGZyb20gJy4uL2NvcmUvTm9kZVV0aWxzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgc3RvcmFnZSBidWZmZXIgbm9kZSB3aXRoIGEgY29uZmlndXJlZCBgU3RvcmFnZUJ1ZmZlckF0dHJpYnV0ZWAuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfFR5cGVkQXJyYXl9IGNvdW50IC0gVGhlIGRhdGEgY291bnQuIEl0IGlzIGFsc28gdmFsaWQgdG8gcGFzcyBhIHR5cGVkIGFycmF5IGFzIGFuIGFyZ3VtZW50LlxyXG4gKiBAcGFyYW0ge3N0cmluZ3xTdHJ1Y3R9IFt0eXBlPSdmbG9hdCddIC0gVGhlIGRhdGEgdHlwZS5cclxuICogQHJldHVybnMge1N0b3JhZ2VCdWZmZXJOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGF0dHJpYnV0ZUFycmF5ID0gKCBjb3VudCwgdHlwZSA9ICdmbG9hdCcgKSA9PiB7XHJcblxyXG5cdGxldCBpdGVtU2l6ZSwgdHlwZWRBcnJheTtcclxuXHJcblx0aWYgKCB0eXBlLmlzU3RydWN0ID09PSB0cnVlICkge1xyXG5cclxuXHRcdGl0ZW1TaXplID0gdHlwZS5sYXlvdXQuZ2V0TGVuZ3RoKCk7XHJcblx0XHR0eXBlZEFycmF5ID0gZ2V0VHlwZWRBcnJheUZyb21UeXBlKCAnZmxvYXQnICk7XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0aXRlbVNpemUgPSBnZXRMZW5ndGhGcm9tVHlwZSggdHlwZSApO1xyXG5cdFx0dHlwZWRBcnJheSA9IGdldFR5cGVkQXJyYXlGcm9tVHlwZSggdHlwZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvbnN0IGJ1ZmZlciA9IG5ldyBTdG9yYWdlQnVmZmVyQXR0cmlidXRlKCBjb3VudCwgaXRlbVNpemUsIHR5cGVkQXJyYXkgKTtcclxuXHRjb25zdCBub2RlID0gc3RvcmFnZSggYnVmZmVyLCB0eXBlLCBjb3VudCApO1xyXG5cclxuXHRyZXR1cm4gbm9kZTtcclxuXHJcbn07XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIHN0b3JhZ2UgYnVmZmVyIG5vZGUgd2l0aCBhIGNvbmZpZ3VyZWQgYFN0b3JhZ2VJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGVgLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge251bWJlcnxUeXBlZEFycmF5fSBjb3VudCAtIFRoZSBkYXRhIGNvdW50LiBJdCBpcyBhbHNvIHZhbGlkIHRvIHBhc3MgYSB0eXBlZCBhcnJheSBhcyBhbiBhcmd1bWVudC5cclxuICogQHBhcmFtIHtzdHJpbmd8U3RydWN0fSBbdHlwZT0nZmxvYXQnXSAtIFRoZSBkYXRhIHR5cGUuXHJcbiAqIEByZXR1cm5zIHtTdG9yYWdlQnVmZmVyTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBpbnN0YW5jZWRBcnJheSA9ICggY291bnQsIHR5cGUgPSAnZmxvYXQnICkgPT4ge1xyXG5cclxuXHRsZXQgaXRlbVNpemUsIHR5cGVkQXJyYXk7XHJcblxyXG5cdGlmICggdHlwZS5pc1N0cnVjdCA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRpdGVtU2l6ZSA9IHR5cGUubGF5b3V0LmdldExlbmd0aCgpO1xyXG5cdFx0dHlwZWRBcnJheSA9IGdldFR5cGVkQXJyYXlGcm9tVHlwZSggJ2Zsb2F0JyApO1xyXG5cclxuXHR9IGVsc2Uge1xyXG5cclxuXHRcdGl0ZW1TaXplID0gZ2V0TGVuZ3RoRnJvbVR5cGUoIHR5cGUgKTtcclxuXHRcdHR5cGVkQXJyYXkgPSBnZXRUeXBlZEFycmF5RnJvbVR5cGUoIHR5cGUgKTtcclxuXHJcblx0fVxyXG5cclxuXHRjb25zdCBidWZmZXIgPSBuZXcgU3RvcmFnZUluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSggY291bnQsIGl0ZW1TaXplLCB0eXBlZEFycmF5ICk7XHJcblx0Y29uc3Qgbm9kZSA9IHN0b3JhZ2UoIGJ1ZmZlciwgdHlwZSwgY291bnQgKTtcclxuXHJcblx0cmV0dXJuIG5vZGU7XHJcblxyXG59O1xyXG4iLCJpbXBvcnQgQXR0cmlidXRlTm9kZSBmcm9tICcuLi9jb3JlL0F0dHJpYnV0ZU5vZGUuanMnO1xyXG5pbXBvcnQgeyBub2RlT2JqZWN0IH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3I0IH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3I0LmpzJztcclxuXHJcbi8qKlxyXG4gKiBBbiBhdHRyaWJ1dGUgbm9kZSBmb3IgcmVwcmVzZW50aW5nIHZlcnRleCBjb2xvcnMuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBBdHRyaWJ1dGVOb2RlXHJcbiAqL1xyXG5jbGFzcyBWZXJ0ZXhDb2xvck5vZGUgZXh0ZW5kcyBBdHRyaWJ1dGVOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnVmVydGV4Q29sb3JOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHZlcnRleCBjb2xvciBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtpbmRleD0wXSAtIFRoZSBhdHRyaWJ1dGUgaW5kZXguXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGluZGV4ID0gMCApIHtcclxuXHJcblx0XHRzdXBlciggbnVsbCwgJ3ZlYzQnICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzVmVydGV4Q29sb3JOb2RlID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBhdHRyaWJ1dGUgaW5kZXggdG8gZW5hYmxlIG1vcmUgdGhhbiBvbmUgc2V0cyBvZiB2ZXJ0ZXggY29sb3JzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaW5kZXggPSBpbmRleDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBPdmVyd3JpdGVzIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGJ5IGhvbm9yaW5nIHRoZSBhdHRyaWJ1dGUgaW5kZXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGF0dHJpYnV0ZSBuYW1lLlxyXG5cdCAqL1xyXG5cdGdldEF0dHJpYnV0ZU5hbWUoIC8qYnVpbGRlciovICkge1xyXG5cclxuXHRcdGNvbnN0IGluZGV4ID0gdGhpcy5pbmRleDtcclxuXHJcblx0XHRyZXR1cm4gJ2NvbG9yJyArICggaW5kZXggPiAwID8gaW5kZXggOiAnJyApO1xyXG5cclxuXHR9XHJcblxyXG5cdGdlbmVyYXRlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IGF0dHJpYnV0ZU5hbWUgPSB0aGlzLmdldEF0dHJpYnV0ZU5hbWUoIGJ1aWxkZXIgKTtcclxuXHRcdGNvbnN0IGdlb21ldHJ5QXR0cmlidXRlID0gYnVpbGRlci5oYXNHZW9tZXRyeUF0dHJpYnV0ZSggYXR0cmlidXRlTmFtZSApO1xyXG5cclxuXHRcdGxldCByZXN1bHQ7XHJcblxyXG5cdFx0aWYgKCBnZW9tZXRyeUF0dHJpYnV0ZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdHJlc3VsdCA9IHN1cGVyLmdlbmVyYXRlKCBidWlsZGVyICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdC8vIFZlcnRleCBjb2xvciBmYWxsYmFjayBzaG91bGQgYmUgd2hpdGVcclxuXHRcdFx0cmVzdWx0ID0gYnVpbGRlci5nZW5lcmF0ZUNvbnN0KCB0aGlzLm5vZGVUeXBlLCBuZXcgVmVjdG9yNCggMSwgMSwgMSwgMSApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblxyXG5cdH1cclxuXHJcblx0c2VyaWFsaXplKCBkYXRhICkge1xyXG5cclxuXHRcdHN1cGVyLnNlcmlhbGl6ZSggZGF0YSApO1xyXG5cclxuXHRcdGRhdGEuaW5kZXggPSB0aGlzLmluZGV4O1xyXG5cclxuXHR9XHJcblxyXG5cdGRlc2VyaWFsaXplKCBkYXRhICkge1xyXG5cclxuXHRcdHN1cGVyLmRlc2VyaWFsaXplKCBkYXRhICk7XHJcblxyXG5cdFx0dGhpcy5pbmRleCA9IGRhdGEuaW5kZXg7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFZlcnRleENvbG9yTm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgcmVmZXJlbmNlIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBhdHRyaWJ1dGUgaW5kZXguXHJcbiAqIEByZXR1cm5zIHtWZXJ0ZXhDb2xvck5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdmVydGV4Q29sb3IgPSAoIGluZGV4ICkgPT4gbm9kZU9iamVjdCggbmV3IFZlcnRleENvbG9yTm9kZSggaW5kZXggKSApO1xyXG4iLCJpbXBvcnQgTm9kZSBmcm9tICcuLi9jb3JlL05vZGUuanMnO1xyXG5pbXBvcnQgeyBub2RlSW1tdXRhYmxlIH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgbm9kZSBmb3IgcmVwcmVzZW50aW5nIHRoZSB1diBjb29yZGluYXRlcyBvZiBwb2ludHMuXHJcbiAqXHJcbiAqIENhbiBvbmx5IGJlIHVzZWQgd2l0aCBhIFdlYkdMIGJhY2tlbmQuIEluIFdlYkdQVSwgcG9pbnRcclxuICogcHJpbWl0aXZlcyBhbHdheXMgaGF2ZSB0aGUgc2l6ZSBvZiBvbmUgcGl4ZWwgYW5kIGNhbiB0aHVzXHJcbiAqIGNhbid0IGJlIHVzZWQgYXMgc3ByaXRlLWxpa2Ugb2JqZWN0cyB0aGF0IGRpc3BsYXkgdGV4dHVyZXMuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBOb2RlXHJcbiAqL1xyXG5jbGFzcyBQb2ludFVWTm9kZSBleHRlbmRzIE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdQb2ludFVWTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBwb2ludCB1diBub2RlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cclxuXHRcdHN1cGVyKCAndmVjMicgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNQb2ludFVWTm9kZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0Z2VuZXJhdGUoIC8qYnVpbGRlciovICkge1xyXG5cclxuXHRcdHJldHVybiAndmVjMiggZ2xfUG9pbnRDb29yZC54LCAxLjAgLSBnbF9Qb2ludENvb3JkLnkgKSc7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFBvaW50VVZOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSB1diBjb29yZGluYXRlcyBvZiBwb2ludHMuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1BvaW50VVZOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHBvaW50VVYgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIFBvaW50VVZOb2RlICk7XHJcbiIsImltcG9ydCB7IFVWTWFwcGluZyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IEV1bGVyIH0gZnJvbSAnLi4vLi4vbWF0aC9FdWxlci5qcyc7XHJcbmltcG9ydCB7IE1hdHJpeDQgfSBmcm9tICcuLi8uLi9tYXRoL01hdHJpeDQuanMnO1xyXG5pbXBvcnQgTm9kZSBmcm9tICcuLi9jb3JlL05vZGUuanMnO1xyXG5pbXBvcnQgeyByZW5kZXJHcm91cCB9IGZyb20gJy4uL2NvcmUvVW5pZm9ybUdyb3VwTm9kZS5qcyc7XHJcbmltcG9ydCB7IG5vZGVJbW11dGFibGUsIHVuaWZvcm0gfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcbmltcG9ydCB7IHJlZmVyZW5jZSB9IGZyb20gJy4vUmVmZXJlbmNlTm9kZS5qcyc7XHJcblxyXG5jb25zdCBfZTEgPSAvKkBfX1BVUkVfXyovIG5ldyBFdWxlcigpO1xyXG5jb25zdCBfbTEgPSAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXg0KCk7XHJcblxyXG4vKipcclxuICogVGhpcyBtb2R1bGUgYWxsb3dzIGFjY2VzcyB0byBhIGNvbGxlY3Rpb24gb2Ygc2NlbmUgcHJvcGVydGllcy4gVGhlIGZvbGxvd2luZyBwcmVkZWZpbmVkIFRTTCBvYmplY3RzXHJcbiAqIGFyZSBhdmFpbGFibGUgZm9yIGVhc2llciB1c2U6XHJcbiAqXHJcbiAqIC0gYGJhY2tncm91bmRCbHVycmluZXNzYDogQSBub2RlIHRoYXQgcmVwcmVzZW50cyB0aGUgc2NlbmUncyBiYWNrZ3JvdW5kIGJsdXJyaW5lc3MuXHJcbiAqIC0gYGJhY2tncm91bmRJbnRlbnNpdHlgOiBBIG5vZGUgdGhhdCByZXByZXNlbnRzIHRoZSBzY2VuZSdzIGJhY2tncm91bmQgaW50ZW5zaXR5LlxyXG4gKiAtIGBiYWNrZ3JvdW5kUm90YXRpb25gOiBBIG5vZGUgdGhhdCByZXByZXNlbnRzIHRoZSBzY2VuZSdzIGJhY2tncm91bmQgcm90YXRpb24uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBOb2RlXHJcbiAqL1xyXG5jbGFzcyBTY2VuZU5vZGUgZXh0ZW5kcyBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnU2NlbmVOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHNjZW5lIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geygnYmFja2dyb3VuZEJsdXJyaW5lc3MnfCdiYWNrZ3JvdW5kSW50ZW5zaXR5J3wnYmFja2dyb3VuZFJvdGF0aW9uJyl9IHNjb3BlIC0gVGhlIHNjb3BlIGRlZmluZXMgdGhlIHR5cGUgb2Ygc2NlbmUgcHJvcGVydHkgdGhhdCBpcyBhY2Nlc3NlZC5cclxuXHQgKiBAcGFyYW0gez9TY2VuZX0gW3NjZW5lPW51bGxdIC0gQSByZWZlcmVuY2UgdG8gdGhlIHNjZW5lLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBzY29wZSA9IFNjZW5lTm9kZS5CQUNLR1JPVU5EX0JMVVJSSU5FU1MsIHNjZW5lID0gbnVsbCApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHNjb3BlIGRlZmluZXMgdGhlIHR5cGUgb2Ygc2NlbmUgcHJvcGVydHkgdGhhdCBpcyBhY2Nlc3NlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KCdiYWNrZ3JvdW5kQmx1cnJpbmVzcyd8J2JhY2tncm91bmRJbnRlbnNpdHknfCdiYWNrZ3JvdW5kUm90YXRpb24nKX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zY29wZSA9IHNjb3BlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIHNjZW5lIHRoYXQgaXMgZ29pbmcgdG8gYmUgYWNjZXNzZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9TY2VuZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zY2VuZSA9IHNjZW5lO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlcGVuZGluZyBvbiB0aGUgc2NvcGUsIHRoZSBtZXRob2QgcmV0dXJucyBhIGRpZmZlcmVudCB0eXBlIG9mIG5vZGUgdGhhdCByZXByZXNlbnRzXHJcblx0ICogdGhlIHJlc3BlY3RpdmUgc2NlbmUgcHJvcGVydHkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge05vZGV9IFRoZSBvdXRwdXQgbm9kZS5cclxuXHQgKi9cclxuXHRzZXR1cCggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCBzY29wZSA9IHRoaXMuc2NvcGU7XHJcblx0XHRjb25zdCBzY2VuZSA9IHRoaXMuc2NlbmUgIT09IG51bGwgPyB0aGlzLnNjZW5lIDogYnVpbGRlci5zY2VuZTtcclxuXHJcblx0XHRsZXQgb3V0cHV0O1xyXG5cclxuXHRcdGlmICggc2NvcGUgPT09IFNjZW5lTm9kZS5CQUNLR1JPVU5EX0JMVVJSSU5FU1MgKSB7XHJcblxyXG5cdFx0XHRvdXRwdXQgPSByZWZlcmVuY2UoICdiYWNrZ3JvdW5kQmx1cnJpbmVzcycsICdmbG9hdCcsIHNjZW5lICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggc2NvcGUgPT09IFNjZW5lTm9kZS5CQUNLR1JPVU5EX0lOVEVOU0lUWSApIHtcclxuXHJcblx0XHRcdG91dHB1dCA9IHJlZmVyZW5jZSggJ2JhY2tncm91bmRJbnRlbnNpdHknLCAnZmxvYXQnLCBzY2VuZSApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHNjb3BlID09PSBTY2VuZU5vZGUuQkFDS0dST1VORF9ST1RBVElPTiApIHtcclxuXHJcblx0XHRcdG91dHB1dCA9IHVuaWZvcm0oICdtYXQ0JyApLmxhYmVsKCAnYmFja2dyb3VuZFJvdGF0aW9uJyApLnNldEdyb3VwKCByZW5kZXJHcm91cCApLm9uUmVuZGVyVXBkYXRlKCAoKSA9PiB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGJhY2tncm91bmQgPSBzY2VuZS5iYWNrZ3JvdW5kO1xyXG5cclxuXHRcdFx0XHRpZiAoIGJhY2tncm91bmQgIT09IG51bGwgJiYgYmFja2dyb3VuZC5pc1RleHR1cmUgJiYgYmFja2dyb3VuZC5tYXBwaW5nICE9PSBVVk1hcHBpbmcgKSB7XHJcblxyXG5cdFx0XHRcdFx0X2UxLmNvcHkoIHNjZW5lLmJhY2tncm91bmRSb3RhdGlvbiApO1xyXG5cclxuXHRcdFx0XHRcdC8vIGFjY29tbW9kYXRlIGxlZnQtaGFuZGVkIGZyYW1lXHJcblx0XHRcdFx0XHRfZTEueCAqPSAtIDE7IF9lMS55ICo9IC0gMTsgX2UxLnogKj0gLSAxO1xyXG5cclxuXHRcdFx0XHRcdF9tMS5tYWtlUm90YXRpb25Gcm9tRXVsZXIoIF9lMSApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdF9tMS5pZGVudGl0eSgpO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHJldHVybiBfbTE7XHJcblxyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5TY2VuZU5vZGU6IFVua25vd24gc2NvcGU6Jywgc2NvcGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG91dHB1dDtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuU2NlbmVOb2RlLkJBQ0tHUk9VTkRfQkxVUlJJTkVTUyA9ICdiYWNrZ3JvdW5kQmx1cnJpbmVzcyc7XHJcblNjZW5lTm9kZS5CQUNLR1JPVU5EX0lOVEVOU0lUWSA9ICdiYWNrZ3JvdW5kSW50ZW5zaXR5JztcclxuU2NlbmVOb2RlLkJBQ0tHUk9VTkRfUk9UQVRJT04gPSAnYmFja2dyb3VuZFJvdGF0aW9uJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IFNjZW5lTm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgc2NlbmUncyBiYWNrZ3JvdW5kIGJsdXJyaW5lc3MuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1NjZW5lTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBiYWNrZ3JvdW5kQmx1cnJpbmVzcyA9IC8qQF9fUFVSRV9fKi8gbm9kZUltbXV0YWJsZSggU2NlbmVOb2RlLCBTY2VuZU5vZGUuQkFDS0dST1VORF9CTFVSUklORVNTICk7XHJcblxyXG4vKipcclxuICogVFNMIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHNjZW5lJ3MgYmFja2dyb3VuZCBpbnRlbnNpdHkuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1NjZW5lTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBiYWNrZ3JvdW5kSW50ZW5zaXR5ID0gLypAX19QVVJFX18qLyBub2RlSW1tdXRhYmxlKCBTY2VuZU5vZGUsIFNjZW5lTm9kZS5CQUNLR1JPVU5EX0lOVEVOU0lUWSApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBzY2VuZSdzIGJhY2tncm91bmQgcm90YXRpb24uXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge1NjZW5lTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBiYWNrZ3JvdW5kUm90YXRpb24gPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIFNjZW5lTm9kZSwgU2NlbmVOb2RlLkJBQ0tHUk9VTkRfUk9UQVRJT04gKTtcclxuIiwiaW1wb3J0IFRleHR1cmVOb2RlIGZyb20gJy4vVGV4dHVyZU5vZGUuanMnO1xyXG5pbXBvcnQgeyBub2RlUHJveHkgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcbmltcG9ydCB7IE5vZGVBY2Nlc3MgfSBmcm9tICcuLi9jb3JlL2NvbnN0YW50cy5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBzcGVjaWFsIHZlcnNpb24gb2YgYSB0ZXh0dXJlIG5vZGUgY2FuIGJlIHVzZWQgdG9cclxuICogd3JpdGUgZGF0YSBpbnRvIGEgc3RvcmFnZSB0ZXh0dXJlIHdpdGggYSBjb21wdXRlIHNoYWRlci5cclxuICpcclxuICogYGBganNcclxuICogY29uc3Qgc3RvcmFnZVRleHR1cmUgPSBuZXcgVEhSRUUuU3RvcmFnZVRleHR1cmUoIHdpZHRoLCBoZWlnaHQgKTtcclxuICpcclxuICogY29uc3QgY29tcHV0ZVRleHR1cmUgPSBGbiggKCB7IHN0b3JhZ2VUZXh0dXJlIH0gKSA9PiB7XHJcbiAqXHJcbiAqIFx0Y29uc3QgcG9zWCA9IGluc3RhbmNlSW5kZXgubW9kKCB3aWR0aCApO1xyXG4gKiBcdGNvbnN0IHBvc1kgPSBpbnN0YW5jZUluZGV4LmRpdiggd2lkdGggKTtcclxuICogXHRjb25zdCBpbmRleFVWID0gdXZlYzIoIHBvc1gsIHBvc1kgKTtcclxuICpcclxuICogXHQvLyBnZW5lcmF0ZSBSR0IgdmFsdWVzXHJcbiAqXHJcbiAqIFx0Y29uc3QgciA9IDE7XHJcbiAqIFx0Y29uc3QgZyA9IDE7XHJcbiAqIFx0Y29uc3QgYiA9IDE7XHJcbiAqXHJcbiAqIFx0dGV4dHVyZVN0b3JlKCBzdG9yYWdlVGV4dHVyZSwgaW5kZXhVViwgdmVjNCggciwgZywgYiwgMSApICkudG9Xcml0ZU9ubHkoKTtcclxuICpcclxuICogfSApO1xyXG4gKlxyXG4gKiBjb25zdCBjb21wdXRlTm9kZSA9IGNvbXB1dGVUZXh0dXJlKCB7IHN0b3JhZ2VUZXh0dXJlIH0gKS5jb21wdXRlKCB3aWR0aCAqIGhlaWdodCApO1xyXG4gKiByZW5kZXJlci5jb21wdXRlQXN5bmMoIGNvbXB1dGVOb2RlICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBUaGlzIG5vZGUgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIGEgV2ViR1BVIGJhY2tlbmQuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBUZXh0dXJlTm9kZVxyXG4gKi9cclxuY2xhc3MgU3RvcmFnZVRleHR1cmVOb2RlIGV4dGVuZHMgVGV4dHVyZU5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdTdG9yYWdlVGV4dHVyZU5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc3RvcmFnZSB0ZXh0dXJlIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1N0b3JhZ2VUZXh0dXJlfSB2YWx1ZSAtIFRoZSBzdG9yYWdlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtOb2RlPHZlYzJ8dmVjMz59IHV2Tm9kZSAtIFRoZSB1diBub2RlLlxyXG5cdCAqIEBwYXJhbSB7P05vZGV9IFtzdG9yZU5vZGU9bnVsbF0gLSBUaGUgdmFsdWUgbm9kZSB0aGF0IHNob3VsZCBiZSBzdG9yZWQgaW4gdGhlIHRleHR1cmUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHZhbHVlLCB1dk5vZGUsIHN0b3JlTm9kZSA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoIHZhbHVlLCB1dk5vZGUgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB2YWx1ZSBub2RlIHRoYXQgc2hvdWxkIGJlIHN0b3JlZCBpbiB0aGUgdGV4dHVyZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc3RvcmVOb2RlID0gc3RvcmVOb2RlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1N0b3JhZ2VUZXh0dXJlTm9kZSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYWNjZXNzIHR5cGUgb2YgdGhlIHRleHR1cmUgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICogQGRlZmF1bHQgJ3dyaXRlT25seSdcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hY2Nlc3MgPSBOb2RlQWNjZXNzLldSSVRFX09OTFk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogT3ZlcndyaXRlcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byByZXR1cm4gYSBmaXhlZCB2YWx1ZSBgJ3N0b3JhZ2VUZXh0dXJlJ2AuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGlucHV0IHR5cGUuXHJcblx0ICovXHJcblx0Z2V0SW5wdXRUeXBlKCAvKmJ1aWxkZXIqLyApIHtcclxuXHJcblx0XHRyZXR1cm4gJ3N0b3JhZ2VUZXh0dXJlJztcclxuXHJcblx0fVxyXG5cclxuXHRzZXR1cCggYnVpbGRlciApIHtcclxuXHJcblx0XHRzdXBlci5zZXR1cCggYnVpbGRlciApO1xyXG5cclxuXHRcdGNvbnN0IHByb3BlcnRpZXMgPSBidWlsZGVyLmdldE5vZGVQcm9wZXJ0aWVzKCB0aGlzICk7XHJcblx0XHRwcm9wZXJ0aWVzLnN0b3JlTm9kZSA9IHRoaXMuc3RvcmVOb2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgdGhlIG5vZGUgYWNjZXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gVGhlIG5vZGUgYWNjZXNzLlxyXG5cdCAqIEByZXR1cm4ge1N0b3JhZ2VUZXh0dXJlTm9kZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBub2RlLlxyXG5cdCAqL1xyXG5cdHNldEFjY2VzcyggdmFsdWUgKSB7XHJcblxyXG5cdFx0dGhpcy5hY2Nlc3MgPSB2YWx1ZTtcclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyB0aGUgY29kZSBzbmlwcGV0IG9mIHRoZSBzdG9yYWdlIG5vZGUuIElmIG5vIGBzdG9yZU5vZGVgXHJcblx0ICogaXMgZGVmaW5lZCwgdGhlIHRleHR1cmUgbm9kZSBpcyBnZW5lcmF0ZWQgYXMgbm9ybWFsIHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBvdXRwdXQgLSBUaGUgY3VycmVudCBvdXRwdXQuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgZ2VuZXJhdGVkIGNvZGUgc25pcHBldC5cclxuXHQgKi9cclxuXHRnZW5lcmF0ZSggYnVpbGRlciwgb3V0cHV0ICkge1xyXG5cclxuXHRcdGxldCBzbmlwcGV0O1xyXG5cclxuXHRcdGlmICggdGhpcy5zdG9yZU5vZGUgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRzbmlwcGV0ID0gdGhpcy5nZW5lcmF0ZVN0b3JlKCBidWlsZGVyICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHNuaXBwZXQgPSBzdXBlci5nZW5lcmF0ZSggYnVpbGRlciwgb3V0cHV0ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBzbmlwcGV0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgY29uZmlndXJpbmcgYSByZWFkL3dyaXRlIG5vZGUgYWNjZXNzLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7U3RvcmFnZVRleHR1cmVOb2RlfSBBIHJlZmVyZW5jZSB0byB0aGlzIG5vZGUuXHJcblx0ICovXHJcblx0dG9SZWFkV3JpdGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuc2V0QWNjZXNzKCBOb2RlQWNjZXNzLlJFQURfV1JJVEUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGNvbmZpZ3VyaW5nIGEgcmVhZC1vbmx5IG5vZGUgYWNjZXNzLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7U3RvcmFnZVRleHR1cmVOb2RlfSBBIHJlZmVyZW5jZSB0byB0aGlzIG5vZGUuXHJcblx0ICovXHJcblx0dG9SZWFkT25seSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5zZXRBY2Nlc3MoIE5vZGVBY2Nlc3MuUkVBRF9PTkxZICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBjb25maWd1cmluZyBhIHdyaXRlLW9ubHkgbm9kZSBhY2Nlc3MuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtTdG9yYWdlVGV4dHVyZU5vZGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbm9kZS5cclxuXHQgKi9cclxuXHR0b1dyaXRlT25seSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5zZXRBY2Nlc3MoIE5vZGVBY2Nlc3MuV1JJVEVfT05MWSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyB0aGUgY29kZSBzbmlwcGV0IG9mIHRoZSBzdG9yYWdlIHRleHR1cmUgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICovXHJcblx0Z2VuZXJhdGVTdG9yZSggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCBwcm9wZXJ0aWVzID0gYnVpbGRlci5nZXROb2RlUHJvcGVydGllcyggdGhpcyApO1xyXG5cclxuXHRcdGNvbnN0IHsgdXZOb2RlLCBzdG9yZU5vZGUgfSA9IHByb3BlcnRpZXM7XHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZVByb3BlcnR5ID0gc3VwZXIuZ2VuZXJhdGUoIGJ1aWxkZXIsICdwcm9wZXJ0eScgKTtcclxuXHRcdGNvbnN0IHV2U25pcHBldCA9IHV2Tm9kZS5idWlsZCggYnVpbGRlciwgJ3V2ZWMyJyApO1xyXG5cdFx0Y29uc3Qgc3RvcmVTbmlwcGV0ID0gc3RvcmVOb2RlLmJ1aWxkKCBidWlsZGVyLCAndmVjNCcgKTtcclxuXHJcblx0XHRjb25zdCBzbmlwcGV0ID0gYnVpbGRlci5nZW5lcmF0ZVRleHR1cmVTdG9yZSggYnVpbGRlciwgdGV4dHVyZVByb3BlcnR5LCB1dlNuaXBwZXQsIHN0b3JlU25pcHBldCApO1xyXG5cclxuXHRcdGJ1aWxkZXIuYWRkTGluZUZsb3dDb2RlKCBzbmlwcGV0LCB0aGlzICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFN0b3JhZ2VUZXh0dXJlTm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgc3RvcmFnZSB0ZXh0dXJlIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7U3RvcmFnZVRleHR1cmV9IHZhbHVlIC0gVGhlIHN0b3JhZ2UgdGV4dHVyZS5cclxuICogQHBhcmFtIHs/Tm9kZTx2ZWMyfHZlYzM+fSB1dk5vZGUgLSBUaGUgdXYgbm9kZS5cclxuICogQHBhcmFtIHs/Tm9kZX0gW3N0b3JlTm9kZT1udWxsXSAtIFRoZSB2YWx1ZSBub2RlIHRoYXQgc2hvdWxkIGJlIHN0b3JlZCBpbiB0aGUgdGV4dHVyZS5cclxuICogQHJldHVybnMge1N0b3JhZ2VUZXh0dXJlTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBzdG9yYWdlVGV4dHVyZSA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBTdG9yYWdlVGV4dHVyZU5vZGUgKS5zZXRQYXJhbWV0ZXJMZW5ndGgoIDEsIDMgKTtcclxuXHJcblxyXG4vKipcclxuICogVE9ETzogRXhwbGFpbiBkaWZmZXJlbmNlIHRvIGBzdG9yYWdlVGV4dHVyZSgpYC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtTdG9yYWdlVGV4dHVyZX0gdmFsdWUgLSBUaGUgc3RvcmFnZSB0ZXh0dXJlLlxyXG4gKiBAcGFyYW0ge05vZGU8dmVjMnx2ZWMzPn0gdXZOb2RlIC0gVGhlIHV2IG5vZGUuXHJcbiAqIEBwYXJhbSB7P05vZGV9IFtzdG9yZU5vZGU9bnVsbF0gLSBUaGUgdmFsdWUgbm9kZSB0aGF0IHNob3VsZCBiZSBzdG9yZWQgaW4gdGhlIHRleHR1cmUuXHJcbiAqIEByZXR1cm5zIHtTdG9yYWdlVGV4dHVyZU5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdGV4dHVyZVN0b3JlID0gKCB2YWx1ZSwgdXZOb2RlLCBzdG9yZU5vZGUgKSA9PiB7XHJcblxyXG5cdGNvbnN0IG5vZGUgPSBzdG9yYWdlVGV4dHVyZSggdmFsdWUsIHV2Tm9kZSwgc3RvcmVOb2RlICk7XHJcblxyXG5cdGlmICggc3RvcmVOb2RlICE9PSBudWxsICkgbm9kZS5hcHBlbmQoKTtcclxuXHJcblx0cmV0dXJuIG5vZGU7XHJcblxyXG59O1xyXG4iLCJpbXBvcnQgVGV4dHVyZU5vZGUgZnJvbSAnLi9UZXh0dXJlTm9kZS5qcyc7XHJcbmltcG9ydCB7IG5vZGVQcm94eSwgdmVjMywgRm4sIElmLCBpbnQgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcbmltcG9ydCB7IHRleHR1cmVTaXplIH0gZnJvbSAnLi9UZXh0dXJlU2l6ZU5vZGUuanMnO1xyXG5cclxuY29uc3Qgbm9ybWFsID0gRm4oICggeyB0ZXh0dXJlLCB1diB9ICkgPT4ge1xyXG5cclxuXHRjb25zdCBlcHNpbG9uID0gMC4wMDAxO1xyXG5cclxuXHRjb25zdCByZXQgPSB2ZWMzKCkudG9WYXIoKTtcclxuXHJcblx0SWYoIHV2LngubGVzc1RoYW4oIGVwc2lsb24gKSwgKCkgPT4ge1xyXG5cclxuXHRcdHJldC5hc3NpZ24oIHZlYzMoIDEsIDAsIDAgKSApO1xyXG5cclxuXHR9ICkuRWxzZUlmKCB1di55Lmxlc3NUaGFuKCBlcHNpbG9uICksICgpID0+IHtcclxuXHJcblx0XHRyZXQuYXNzaWduKCB2ZWMzKCAwLCAxLCAwICkgKTtcclxuXHJcblx0fSApLkVsc2VJZiggdXYuei5sZXNzVGhhbiggZXBzaWxvbiApLCAoKSA9PiB7XHJcblxyXG5cdFx0cmV0LmFzc2lnbiggdmVjMyggMCwgMCwgMSApICk7XHJcblxyXG5cdH0gKS5FbHNlSWYoIHV2LnguZ3JlYXRlclRoYW4oIDEgLSBlcHNpbG9uICksICgpID0+IHtcclxuXHJcblx0XHRyZXQuYXNzaWduKCB2ZWMzKCAtIDEsIDAsIDAgKSApO1xyXG5cclxuXHR9ICkuRWxzZUlmKCB1di55LmdyZWF0ZXJUaGFuKCAxIC0gZXBzaWxvbiApLCAoKSA9PiB7XHJcblxyXG5cdFx0cmV0LmFzc2lnbiggdmVjMyggMCwgLSAxLCAwICkgKTtcclxuXHJcblx0fSApLkVsc2VJZiggdXYuei5ncmVhdGVyVGhhbiggMSAtIGVwc2lsb24gKSwgKCkgPT4ge1xyXG5cclxuXHRcdHJldC5hc3NpZ24oIHZlYzMoIDAsIDAsIC0gMSApICk7XHJcblxyXG5cdH0gKS5FbHNlKCAoKSA9PiB7XHJcblxyXG5cdFx0Y29uc3Qgc3RlcCA9IDAuMDE7XHJcblxyXG5cdFx0Y29uc3QgeCA9IHRleHR1cmUuc2FtcGxlKCB1di5hZGQoIHZlYzMoIC0gc3RlcCwgMC4wLCAwLjAgKSApICkuci5zdWIoIHRleHR1cmUuc2FtcGxlKCB1di5hZGQoIHZlYzMoIHN0ZXAsIDAuMCwgMC4wICkgKSApLnIgKTtcclxuXHRcdGNvbnN0IHkgPSB0ZXh0dXJlLnNhbXBsZSggdXYuYWRkKCB2ZWMzKCAwLjAsIC0gc3RlcCwgMC4wICkgKSApLnIuc3ViKCB0ZXh0dXJlLnNhbXBsZSggdXYuYWRkKCB2ZWMzKCAwLjAsIHN0ZXAsIDAuMCApICkgKS5yICk7XHJcblx0XHRjb25zdCB6ID0gdGV4dHVyZS5zYW1wbGUoIHV2LmFkZCggdmVjMyggMC4wLCAwLjAsIC0gc3RlcCApICkgKS5yLnN1YiggdGV4dHVyZS5zYW1wbGUoIHV2LmFkZCggdmVjMyggMC4wLCAwLjAsIHN0ZXAgKSApICkuciApO1xyXG5cclxuXHRcdHJldC5hc3NpZ24oIHZlYzMoIHgsIHksIHogKSApO1xyXG5cclxuXHR9ICk7XHJcblxyXG5cdHJldHVybiByZXQubm9ybWFsaXplKCk7XHJcblxyXG59ICk7XHJcblxyXG4vKipcclxuICogVGhpcyB0eXBlIG9mIHVuaWZvcm0gbm9kZSByZXByZXNlbnRzIGEgM0QgdGV4dHVyZS5cclxuICpcclxuICogQGF1Z21lbnRzIFRleHR1cmVOb2RlXHJcbiAqL1xyXG5jbGFzcyBUZXh0dXJlM0ROb2RlIGV4dGVuZHMgVGV4dHVyZU5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdUZXh0dXJlM0ROb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IDNEIHRleHR1cmUgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7RGF0YTNEVGV4dHVyZX0gdmFsdWUgLSBUaGUgM0QgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0gez9Ob2RlPHZlYzJ8dmVjMz59IFt1dk5vZGU9bnVsbF0gLSBUaGUgdXYgbm9kZS5cclxuXHQgKiBAcGFyYW0gez9Ob2RlPGludD59IFtsZXZlbE5vZGU9bnVsbF0gLSBUaGUgbGV2ZWwgbm9kZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggdmFsdWUsIHV2Tm9kZSA9IG51bGwsIGxldmVsTm9kZSA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoIHZhbHVlLCB1dk5vZGUsIGxldmVsTm9kZSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1RleHR1cmUzRE5vZGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE92ZXJ3cml0ZXMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gcmV0dXJuIGEgZml4ZWQgdmFsdWUgYCd0ZXh0dXJlM0QnYC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgaW5wdXQgdHlwZS5cclxuXHQgKi9cclxuXHRnZXRJbnB1dFR5cGUoIC8qYnVpbGRlciovICkge1xyXG5cclxuXHRcdHJldHVybiAndGV4dHVyZTNEJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgZGVmYXVsdCB1diBub2RlIHdoaWNoIGlzIGluIGNvbnRleHQgb2YgM0QgdGV4dHVyZXMgYSB0aHJlZS1kaW1lbnNpb25hbFxyXG5cdCAqIHV2IG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtOb2RlPHZlYzM+fSBUaGUgZGVmYXVsdCB1diBub2RlLlxyXG5cdCAqL1xyXG5cdGdldERlZmF1bHRVVigpIHtcclxuXHJcblx0XHRyZXR1cm4gdmVjMyggMC41LCAwLjUsIDAuNSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE92ZXJ3cml0dGVuIHdpdGggYW4gZW1wdHkgaW1wbGVtZW50YXRpb24gc2luY2UgdGhlIGB1cGRhdGVNYXRyaXhgIGZsYWcgaXMgaWdub3JlZFxyXG5cdCAqIGZvciAzRCB0ZXh0dXJlcy4gVGhlIHV2IHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBpcyBub3QgYXBwbGllZCB0byAzRCB0ZXh0dXJlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsdWUgLSBUaGUgdXBkYXRlIHRvZ2dsZS5cclxuXHQgKi9cclxuXHRzZXRVcGRhdGVNYXRyaXgoIC8qdmFsdWUqLyApIHsgfSAvLyBJZ25vcmUgLnVwZGF0ZU1hdHJpeCBmb3IgM2QgVGV4dHVyZU5vZGVcclxuXHJcblx0LyoqXHJcblx0ICogT3ZlcndyaXRlcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byByZXR1cm4gdGhlIHVubW9kaWZpZWQgdXYgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHBhcmFtIHtOb2RlfSB1dk5vZGUgLSBUaGUgdXYgbm9kZSB0byBzZXR1cC5cclxuXHQgKiBAcmV0dXJuIHtOb2RlfSBUaGUgdW5tb2RpZmllZCB1diBub2RlLlxyXG5cdCAqL1xyXG5cdHNldHVwVVYoIGJ1aWxkZXIsIHV2Tm9kZSApIHtcclxuXHJcblx0XHRjb25zdCB0ZXh0dXJlID0gdGhpcy52YWx1ZTtcclxuXHJcblx0XHRpZiAoIGJ1aWxkZXIuaXNGbGlwWSgpICYmICggdGV4dHVyZS5pc1JlbmRlclRhcmdldFRleHR1cmUgPT09IHRydWUgfHwgdGV4dHVyZS5pc0ZyYW1lYnVmZmVyVGV4dHVyZSA9PT0gdHJ1ZSApICkge1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLnNhbXBsZXIgKSB7XHJcblxyXG5cdFx0XHRcdHV2Tm9kZSA9IHV2Tm9kZS5mbGlwWSgpO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0dXZOb2RlID0gdXZOb2RlLnNldFkoIGludCggdGV4dHVyZVNpemUoIHRoaXMsIHRoaXMubGV2ZWxOb2RlICkueSApLnN1YiggdXZOb2RlLnkgKS5zdWIoIDEgKSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdXZOb2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyB0aGUgdXYgY29kZSBzbmlwcGV0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcGFyYW0ge05vZGV9IHV2Tm9kZSAtIFRoZSB1diBub2RlIHRvIGdlbmVyYXRlIGNvZGUgZm9yLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGdlbmVyYXRlZCBjb2RlIHNuaXBwZXQuXHJcblx0ICovXHJcblx0Z2VuZXJhdGVVViggYnVpbGRlciwgdXZOb2RlICkge1xyXG5cclxuXHRcdHJldHVybiB1dk5vZGUuYnVpbGQoIGJ1aWxkZXIsICd2ZWMzJyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRPRE8uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGU8dmVjMz59IHV2Tm9kZSAtIFRoZSB1diBub2RlIC5cclxuXHQgKiBAcmV0dXJuIHtOb2RlPHZlYzM+fSBUT0RPLlxyXG5cdCAqL1xyXG5cdG5vcm1hbCggdXZOb2RlICkge1xyXG5cclxuXHRcdHJldHVybiBub3JtYWwoIHsgdGV4dHVyZTogdGhpcywgdXY6IHV2Tm9kZSB9ICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFRleHR1cmUzRE5vZGU7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIDNEIHRleHR1cmUgbm9kZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtEYXRhM0RUZXh0dXJlfSB2YWx1ZSAtIFRoZSAzRCB0ZXh0dXJlLlxyXG4gKiBAcGFyYW0gez9Ob2RlPHZlYzJ8dmVjMz59IFt1dk5vZGU9bnVsbF0gLSBUaGUgdXYgbm9kZS5cclxuICogQHBhcmFtIHs/Tm9kZTxpbnQ+fSBbbGV2ZWxOb2RlPW51bGxdIC0gVGhlIGxldmVsIG5vZGUuXHJcbiAqIEByZXR1cm5zIHtUZXh0dXJlM0ROb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHRleHR1cmUzRCA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBUZXh0dXJlM0ROb2RlICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAxLCAzICk7XHJcbiIsImltcG9ydCBSZWZlcmVuY2VOb2RlIGZyb20gJy4vUmVmZXJlbmNlTm9kZS5qcyc7XHJcbmltcG9ydCB7IG5vZGVPYmplY3QgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcblxyXG4vKipcclxuICogQSBzcGVjaWFsIHR5cGUgb2YgcmVmZXJlbmNlIG5vZGUgdGhhdCBhbGxvd3MgdG8gbGluayB2YWx1ZXMgaW5cclxuICogYHVzZXJEYXRhYCBmaWVsZHMgdG8gbm9kZSBvYmplY3RzLlxyXG4gKiBgYGBqc1xyXG4gKiBzcHJpdGUudXNlckRhdGEucm90YXRpb24gPSAxOyAvLyBzdG9yZXMgaW5kaXZpZHVhbCByb3RhdGlvbiBwZXIgc3ByaXRlXHJcbiAqXHJcbiAqIGNvbnN0IG1hdGVyaWFsID0gbmV3IFRIUkVFLlNwcml0ZU5vZGVNYXRlcmlhbCgpO1xyXG4gKiBtYXRlcmlhbC5yb3RhdGlvbk5vZGUgPSB1c2VyRGF0YSggJ3JvdGF0aW9uJywgJ2Zsb2F0JyApO1xyXG4gKiBgYGBcclxuICogU2luY2UgYFVzZXJEYXRhTm9kZWAgaXMgZXh0ZW5kZWQgZnJvbSB7QGxpbmsgUmVmZXJlbmNlTm9kZX0sIHRoZSBub2RlIHZhbHVlXHJcbiAqIHdpbGwgYXV0b21hdGljYWxseSBiZSB1cGRhdGVkIHdoZW4gdGhlIGByb3RhdGlvbmAgdXNlciBkYXRhIGZpZWxkIGNoYW5nZXMuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBSZWZlcmVuY2VOb2RlXHJcbiAqL1xyXG5jbGFzcyBVc2VyRGF0YU5vZGUgZXh0ZW5kcyBSZWZlcmVuY2VOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnVXNlckRhdGFOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHVzZXIgZGF0YSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IG5hbWUgdGhhdCBzaG91bGQgYmUgcmVmZXJlbmNlZCBieSB0aGUgbm9kZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gaW5wdXRUeXBlIC0gVGhlIG5vZGUgZGF0YSB0eXBlIG9mIHRoZSByZWZlcmVuY2UuXHJcblx0ICogQHBhcmFtIHs/T2JqZWN0fSBbdXNlckRhdGE9bnVsbF0gLSBBIHJlZmVyZW5jZSB0byB0aGUgYHVzZXJEYXRhYCBvYmplY3QuIElmIG5vdCBwcm92aWRlZCwgdGhlIGB1c2VyRGF0YWAgcHJvcGVydHkgb2YgdGhlIDNEIG9iamVjdCB0aGF0IHVzZXMgdGhlIG5vZGUgbWF0ZXJpYWwgaXMgZXZhbHVhdGVkLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwcm9wZXJ0eSwgaW5wdXRUeXBlLCB1c2VyRGF0YSA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoIHByb3BlcnR5LCBpbnB1dFR5cGUsIHVzZXJEYXRhICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZSB0byB0aGUgYHVzZXJEYXRhYCBvYmplY3QuIElmIG5vdCBwcm92aWRlZCwgdGhlIGB1c2VyRGF0YWBcclxuXHRcdCAqIHByb3BlcnR5IG9mIHRoZSAzRCBvYmplY3QgdGhhdCB1c2VzIHRoZSBub2RlIG1hdGVyaWFsIGlzIGV2YWx1YXRlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P09iamVjdH1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51c2VyRGF0YSA9IHVzZXJEYXRhO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE92ZXJ3cml0dGVuIHRvIG1ha2Ugc3VyZSB7QGxpbmsgUmVmZXJlbmNlTm9kZSNyZWZlcmVuY2V9IHBvaW50cyB0byB0aGUgY29ycmVjdFxyXG5cdCAqIGB1c2VyRGF0YWAgZmllbGQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geyhOb2RlRnJhbWV8Tm9kZUJ1aWxkZXIpfSBzdGF0ZSAtIFRoZSBjdXJyZW50IHN0YXRlIHRvIGV2YWx1YXRlLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdH0gQSByZWZlcmVuY2UgdG8gdGhlIGB1c2VyRGF0YWAgZmllbGQuXHJcblx0ICovXHJcblx0dXBkYXRlUmVmZXJlbmNlKCBzdGF0ZSApIHtcclxuXHJcblx0XHR0aGlzLnJlZmVyZW5jZSA9IHRoaXMudXNlckRhdGEgIT09IG51bGwgPyB0aGlzLnVzZXJEYXRhIDogc3RhdGUub2JqZWN0LnVzZXJEYXRhO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnJlZmVyZW5jZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgVXNlckRhdGFOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSB1c2VyIGRhdGEgbm9kZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgcHJvcGVydHkgbmFtZSB0aGF0IHNob3VsZCBiZSByZWZlcmVuY2VkIGJ5IHRoZSBub2RlLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5wdXRUeXBlIC0gVGhlIG5vZGUgZGF0YSB0eXBlIG9mIHRoZSByZWZlcmVuY2UuXHJcbiAqIEBwYXJhbSB7P09iamVjdH0gdXNlckRhdGEgLSBBIHJlZmVyZW5jZSB0byB0aGUgYHVzZXJEYXRhYCBvYmplY3QuIElmIG5vdCBwcm92aWRlZCwgdGhlIGB1c2VyRGF0YWAgcHJvcGVydHkgb2YgdGhlIDNEIG9iamVjdCB0aGF0IHVzZXMgdGhlIG5vZGUgbWF0ZXJpYWwgaXMgZXZhbHVhdGVkLlxyXG4gKiBAcmV0dXJucyB7VXNlckRhdGFOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHVzZXJEYXRhID0gKCBuYW1lLCBpbnB1dFR5cGUsIHVzZXJEYXRhICkgPT4gbm9kZU9iamVjdCggbmV3IFVzZXJEYXRhTm9kZSggbmFtZSwgaW5wdXRUeXBlLCB1c2VyRGF0YSApICk7XHJcbiIsImltcG9ydCBUZW1wTm9kZSBmcm9tICcuLi9jb3JlL1RlbXBOb2RlLmpzJztcclxuaW1wb3J0IHsgbW9kZWxWaWV3TWF0cml4IH0gZnJvbSAnLi9Nb2RlbE5vZGUuanMnO1xyXG5pbXBvcnQgeyBwb3NpdGlvbkxvY2FsLCBwb3NpdGlvblByZXZpb3VzIH0gZnJvbSAnLi9Qb3NpdGlvbi5qcyc7XHJcbmltcG9ydCB7IG5vZGVJbW11dGFibGUgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcbmltcG9ydCB7IE5vZGVVcGRhdGVUeXBlIH0gZnJvbSAnLi4vY29yZS9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBNYXRyaXg0IH0gZnJvbSAnLi4vLi4vbWF0aC9NYXRyaXg0LmpzJztcclxuaW1wb3J0IHsgdW5pZm9ybSB9IGZyb20gJy4uL2NvcmUvVW5pZm9ybU5vZGUuanMnO1xyXG5pbXBvcnQgeyBzdWIgfSBmcm9tICcuLi9tYXRoL09wZXJhdG9yTm9kZS5qcyc7XHJcbmltcG9ydCB7IGNhbWVyYVByb2plY3Rpb25NYXRyaXggfSBmcm9tICcuL0NhbWVyYS5qcyc7XHJcbmltcG9ydCB7IHJlbmRlckdyb3VwIH0gZnJvbSAnLi4vY29yZS9Vbmlmb3JtR3JvdXBOb2RlLmpzJztcclxuXHJcbmNvbnN0IF9vYmplY3REYXRhID0gbmV3IFdlYWtNYXAoKTtcclxuXHJcbi8qKlxyXG4gKiBBIG5vZGUgZm9yIHJlcHJlc2VudGluZyBtb3Rpb24gb3IgdmVsb2NpdHkgdmVjdG9ycy4gRm91bmRhdGlvblxyXG4gKiBmb3IgYWR2YW5jZWQgcG9zdCBwcm9jZXNzaW5nIGVmZmVjdHMgbGlrZSBtb3Rpb24gYmx1ciBvciBUUkFBLlxyXG4gKlxyXG4gKiBUaGUgbm9kZSBrZWVwcyB0cmFjayBvZiB0aGUgbW9kZWwsIHZpZXcgYW5kIHByb2plY3Rpb24gbWF0cmljZXNcclxuICogb2YgdGhlIHByZXZpb3VzIGZyYW1lIGFuZCB1c2VzIHRoZW0gdG8gY29tcHV0ZSBvZmZzZXRzIGluIE5EQyBzcGFjZS5cclxuICogVGhlc2Ugb2Zmc2V0cyByZXByZXNlbnQgdGhlIGZpbmFsIHZlbG9jaXR5LlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgVGVtcE5vZGVcclxuICovXHJcbmNsYXNzIFZlbG9jaXR5Tm9kZSBleHRlbmRzIFRlbXBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnVmVsb2NpdHlOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHZlcnRleCBjb2xvciBub2RlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cclxuXHRcdHN1cGVyKCAndmVjMicgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjdXJyZW50IHByb2plY3Rpb24gbWF0cml4LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/TWF0cml4NH1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wcm9qZWN0aW9uTWF0cml4ID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIE92ZXJ3cml0dGVuIHNpbmNlIHZlbG9jaXR5IG5vZGVzIGFyZSB1cGRhdGVkIHBlciBvYmplY3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqIEBkZWZhdWx0ICdvYmplY3QnXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXBkYXRlVHlwZSA9IE5vZGVVcGRhdGVUeXBlLk9CSkVDVDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIE92ZXJ3cml0dGVuIHNpbmNlIHZlbG9jaXR5IG5vZGVzIHNhdmUgZGF0YSBhZnRlciB0aGUgdXBkYXRlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKiBAZGVmYXVsdCAnb2JqZWN0J1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVwZGF0ZUFmdGVyVHlwZSA9IE5vZGVVcGRhdGVUeXBlLk9CSkVDVDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFVuaWZvcm0gbm9kZSByZXByZXNlbnRpbmcgdGhlIHByZXZpb3VzIG1vZGVsIG1hdHJpeCBpbiB3b3JsZCBzcGFjZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VW5pZm9ybU5vZGU8bWF0ND59XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucHJldmlvdXNNb2RlbFdvcmxkTWF0cml4ID0gdW5pZm9ybSggbmV3IE1hdHJpeDQoKSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVW5pZm9ybSBub2RlIHJlcHJlc2VudGluZyB0aGUgcHJldmlvdXMgcHJvamVjdGlvbiBtYXRyaXguXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1VuaWZvcm1Ob2RlPG1hdDQ+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnByZXZpb3VzUHJvamVjdGlvbk1hdHJpeCA9IHVuaWZvcm0oIG5ldyBNYXRyaXg0KCkgKS5zZXRHcm91cCggcmVuZGVyR3JvdXAgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFVuaWZvcm0gbm9kZSByZXByZXNlbnRpbmcgdGhlIHByZXZpb3VzIHZpZXcgbWF0cml4LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtVbmlmb3JtTm9kZTxtYXQ0Pn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wcmV2aW91c0NhbWVyYVZpZXdNYXRyaXggPSB1bmlmb3JtKCBuZXcgTWF0cml4NCgpICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZ2l2ZW4gcHJvamVjdGlvbiBtYXRyaXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDR9IHByb2plY3Rpb25NYXRyaXggLSBUaGUgcHJvamVjdGlvbiBtYXRyaXggdG8gc2V0LlxyXG5cdCAqL1xyXG5cdHNldFByb2plY3Rpb25NYXRyaXgoIHByb2plY3Rpb25NYXRyaXggKSB7XHJcblxyXG5cdFx0dGhpcy5wcm9qZWN0aW9uTWF0cml4ID0gcHJvamVjdGlvbk1hdHJpeDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHZlbG9jaXR5IHNwZWNpZmljIHVuaWZvcm1zLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlRnJhbWV9IGZyYW1lIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgbm9kZSBmcmFtZS5cclxuXHQgKi9cclxuXHR1cGRhdGUoIHsgZnJhbWVJZCwgY2FtZXJhLCBvYmplY3QgfSApIHtcclxuXHJcblx0XHRjb25zdCBwcmV2aW91c01vZGVsTWF0cml4ID0gZ2V0UHJldmlvdXNNYXRyaXgoIG9iamVjdCApO1xyXG5cclxuXHRcdHRoaXMucHJldmlvdXNNb2RlbFdvcmxkTWF0cml4LnZhbHVlLmNvcHkoIHByZXZpb3VzTW9kZWxNYXRyaXggKTtcclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGNvbnN0IGNhbWVyYURhdGEgPSBnZXREYXRhKCBjYW1lcmEgKTtcclxuXHJcblx0XHRpZiAoIGNhbWVyYURhdGEuZnJhbWVJZCAhPT0gZnJhbWVJZCApIHtcclxuXHJcblx0XHRcdGNhbWVyYURhdGEuZnJhbWVJZCA9IGZyYW1lSWQ7XHJcblxyXG5cdFx0XHRpZiAoIGNhbWVyYURhdGEucHJldmlvdXNQcm9qZWN0aW9uTWF0cml4ID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGNhbWVyYURhdGEucHJldmlvdXNQcm9qZWN0aW9uTWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcclxuXHRcdFx0XHRjYW1lcmFEYXRhLnByZXZpb3VzQ2FtZXJhVmlld01hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XHJcblxyXG5cdFx0XHRcdGNhbWVyYURhdGEuY3VycmVudFByb2plY3Rpb25NYXRyaXggPSBuZXcgTWF0cml4NCgpO1xyXG5cdFx0XHRcdGNhbWVyYURhdGEuY3VycmVudENhbWVyYVZpZXdNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xyXG5cclxuXHRcdFx0XHRjYW1lcmFEYXRhLnByZXZpb3VzUHJvamVjdGlvbk1hdHJpeC5jb3B5KCB0aGlzLnByb2plY3Rpb25NYXRyaXggfHwgY2FtZXJhLnByb2plY3Rpb25NYXRyaXggKTtcclxuXHRcdFx0XHRjYW1lcmFEYXRhLnByZXZpb3VzQ2FtZXJhVmlld01hdHJpeC5jb3B5KCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRjYW1lcmFEYXRhLnByZXZpb3VzUHJvamVjdGlvbk1hdHJpeC5jb3B5KCBjYW1lcmFEYXRhLmN1cnJlbnRQcm9qZWN0aW9uTWF0cml4ICk7XHJcblx0XHRcdFx0Y2FtZXJhRGF0YS5wcmV2aW91c0NhbWVyYVZpZXdNYXRyaXguY29weSggY2FtZXJhRGF0YS5jdXJyZW50Q2FtZXJhVmlld01hdHJpeCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y2FtZXJhRGF0YS5jdXJyZW50UHJvamVjdGlvbk1hdHJpeC5jb3B5KCB0aGlzLnByb2plY3Rpb25NYXRyaXggfHwgY2FtZXJhLnByb2plY3Rpb25NYXRyaXggKTtcclxuXHRcdFx0Y2FtZXJhRGF0YS5jdXJyZW50Q2FtZXJhVmlld01hdHJpeC5jb3B5KCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlICk7XHJcblxyXG5cdFx0XHR0aGlzLnByZXZpb3VzUHJvamVjdGlvbk1hdHJpeC52YWx1ZS5jb3B5KCBjYW1lcmFEYXRhLnByZXZpb3VzUHJvamVjdGlvbk1hdHJpeCApO1xyXG5cdFx0XHR0aGlzLnByZXZpb3VzQ2FtZXJhVmlld01hdHJpeC52YWx1ZS5jb3B5KCBjYW1lcmFEYXRhLnByZXZpb3VzQ2FtZXJhVmlld01hdHJpeCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBPdmVyd3JpdHRlbiB0byB1cGRhdGVkIHZlbG9jaXR5IHNwZWNpZmljIHVuaWZvcm1zLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlRnJhbWV9IGZyYW1lIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgbm9kZSBmcmFtZS5cclxuXHQgKi9cclxuXHR1cGRhdGVBZnRlciggeyBvYmplY3QgfSApIHtcclxuXHJcblx0XHRnZXRQcmV2aW91c01hdHJpeCggb2JqZWN0ICkuY29weSggb2JqZWN0Lm1hdHJpeFdvcmxkICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW1wbGVtZW50cyB0aGUgdmVsb2NpdHkgY29tcHV0YXRpb24gYmFzZWQgb24gdGhlIHByZXZpb3VzIGFuZCBjdXJyZW50IHZlcnRleCBkYXRhLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtOb2RlPHZlYzI+fSBUaGUgbW90aW9uIHZlY3Rvci5cclxuXHQgKi9cclxuXHRzZXR1cCggLypidWlsZGVyKi8gKSB7XHJcblxyXG5cdFx0Y29uc3QgcHJvamVjdGlvbk1hdHJpeCA9ICggdGhpcy5wcm9qZWN0aW9uTWF0cml4ID09PSBudWxsICkgPyBjYW1lcmFQcm9qZWN0aW9uTWF0cml4IDogdW5pZm9ybSggdGhpcy5wcm9qZWN0aW9uTWF0cml4ICk7XHJcblxyXG5cdFx0Y29uc3QgcHJldmlvdXNNb2RlbFZpZXdNYXRyaXggPSB0aGlzLnByZXZpb3VzQ2FtZXJhVmlld01hdHJpeC5tdWwoIHRoaXMucHJldmlvdXNNb2RlbFdvcmxkTWF0cml4ICk7XHJcblxyXG5cdFx0Y29uc3QgY2xpcFBvc2l0aW9uQ3VycmVudCA9IHByb2plY3Rpb25NYXRyaXgubXVsKCBtb2RlbFZpZXdNYXRyaXggKS5tdWwoIHBvc2l0aW9uTG9jYWwgKTtcclxuXHRcdGNvbnN0IGNsaXBQb3NpdGlvblByZXZpb3VzID0gdGhpcy5wcmV2aW91c1Byb2plY3Rpb25NYXRyaXgubXVsKCBwcmV2aW91c01vZGVsVmlld01hdHJpeCApLm11bCggcG9zaXRpb25QcmV2aW91cyApO1xyXG5cclxuXHRcdGNvbnN0IG5kY1Bvc2l0aW9uQ3VycmVudCA9IGNsaXBQb3NpdGlvbkN1cnJlbnQueHkuZGl2KCBjbGlwUG9zaXRpb25DdXJyZW50LncgKTtcclxuXHRcdGNvbnN0IG5kY1Bvc2l0aW9uUHJldmlvdXMgPSBjbGlwUG9zaXRpb25QcmV2aW91cy54eS5kaXYoIGNsaXBQb3NpdGlvblByZXZpb3VzLncgKTtcclxuXHJcblx0XHRjb25zdCB2ZWxvY2l0eSA9IHN1YiggbmRjUG9zaXRpb25DdXJyZW50LCBuZGNQb3NpdGlvblByZXZpb3VzICk7XHJcblxyXG5cdFx0cmV0dXJuIHZlbG9jaXR5O1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBnZXREYXRhKCBvYmplY3QgKSB7XHJcblxyXG5cdGxldCBvYmplY3REYXRhID0gX29iamVjdERhdGEuZ2V0KCBvYmplY3QgKTtcclxuXHJcblx0aWYgKCBvYmplY3REYXRhID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0b2JqZWN0RGF0YSA9IHt9O1xyXG5cdFx0X29iamVjdERhdGEuc2V0KCBvYmplY3QsIG9iamVjdERhdGEgKTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gb2JqZWN0RGF0YTtcclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldFByZXZpb3VzTWF0cml4KCBvYmplY3QsIGluZGV4ID0gMCApIHtcclxuXHJcblx0Y29uc3Qgb2JqZWN0RGF0YSA9IGdldERhdGEoIG9iamVjdCApO1xyXG5cclxuXHRsZXQgbWF0cml4ID0gb2JqZWN0RGF0YVsgaW5kZXggXTtcclxuXHJcblx0aWYgKCBtYXRyaXggPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRvYmplY3REYXRhWyBpbmRleCBdID0gbWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gbWF0cml4O1xyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgVmVsb2NpdHlOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSB2ZWxvY2l0eSBvZiBhIHJlbmRlciBwYXNzLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtWZWxvY2l0eU5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdmVsb2NpdHkgPSAvKkBfX1BVUkVfXyovIG5vZGVJbW11dGFibGUoIFZlbG9jaXR5Tm9kZSApO1xyXG4iLCJpbXBvcnQgeyBGbiwgdmVjNCB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuaW1wb3J0IHsgbWl4LCBtaW4sIHN0ZXAgfSBmcm9tICcuLi9tYXRoL01hdGhOb2RlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIGEgXCJDb2xvciBCdXJuXCIgYmxlbmQgbW9kZS5cclxuICpcclxuICogSXQncyBkZXNpZ25lZCB0byBkYXJrZW4gdGhlIGJhc2UgbGF5ZXIncyBjb2xvcnMgYmFzZWQgb24gdGhlIGNvbG9yIG9mIHRoZSBibGVuZCBsYXllci5cclxuICogSXQgc2lnbmlmaWNhbnRseSBpbmNyZWFzZXMgdGhlIGNvbnRyYXN0IG9mIHRoZSBiYXNlIGxheWVyLCBtYWtpbmcgdGhlIGNvbG9ycyBtb3JlIHZpYnJhbnQgYW5kIHNhdHVyYXRlZC5cclxuICogVGhlIGRhcmtlciB0aGUgY29sb3IgaW4gdGhlIGJsZW5kIGxheWVyLCB0aGUgc3Ryb25nZXIgdGhlIGRhcmtlbmluZyBhbmQgY29udHJhc3QgZWZmZWN0IG9uIHRoZSBiYXNlIGxheWVyLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGU8dmVjMz59IGJhc2UgLSBUaGUgYmFzZSBjb2xvci5cclxuICogQHBhcmFtIHtOb2RlPHZlYzM+fSBibGVuZCAtIFRoZSBibGVuZCBjb2xvci4gQSB3aGl0ZSAoI2ZmZmZmZikgYmxlbmQgY29sb3IgZG9lcyBub3QgYWx0ZXIgdGhlIGJhc2UgY29sb3IuXHJcbiAqIEByZXR1cm4ge05vZGU8dmVjMz59IFRoZSByZXN1bHQuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYmxlbmRCdXJuID0gLypAX19QVVJFX18qLyBGbiggKCBbIGJhc2UsIGJsZW5kIF0gKSA9PiB7XHJcblxyXG5cdHJldHVybiBtaW4oIDEuMCwgYmFzZS5vbmVNaW51cygpLmRpdiggYmxlbmQgKSApLm9uZU1pbnVzKCk7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ2JsZW5kQnVybicsXHJcblx0dHlwZTogJ3ZlYzMnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAnYmFzZScsIHR5cGU6ICd2ZWMzJyB9LFxyXG5cdFx0eyBuYW1lOiAnYmxlbmQnLCB0eXBlOiAndmVjMycgfVxyXG5cdF1cclxufSApO1xyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgYSBcIkNvbG9yIERvZGdlXCIgYmxlbmQgbW9kZS5cclxuICpcclxuICogSXQncyBkZXNpZ25lZCB0byBsaWdodGVuIHRoZSBiYXNlIGxheWVyJ3MgY29sb3JzIGJhc2VkIG9uIHRoZSBjb2xvciBvZiB0aGUgYmxlbmQgbGF5ZXIuXHJcbiAqIEl0IHNpZ25pZmljYW50bHkgaW5jcmVhc2VzIHRoZSBicmlnaHRuZXNzIG9mIHRoZSBiYXNlIGxheWVyLCBtYWtpbmcgdGhlIGNvbG9ycyBsaWdodGVyIGFuZCBtb3JlIHZpYnJhbnQuXHJcbiAqIFRoZSBicmlnaHRlciB0aGUgY29sb3IgaW4gdGhlIGJsZW5kIGxheWVyLCB0aGUgc3Ryb25nZXIgdGhlIGxpZ2h0ZW5pbmcgYW5kIGNvbnRyYXN0IGVmZmVjdCBvbiB0aGUgYmFzZSBsYXllci5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlPHZlYzM+fSBiYXNlIC0gVGhlIGJhc2UgY29sb3IuXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMzPn0gYmxlbmQgLSBUaGUgYmxlbmQgY29sb3IuIEEgYmxhY2sgKCMwMDAwMDApIGJsZW5kIGNvbG9yIGRvZXMgbm90IGFsdGVyIHRoZSBiYXNlIGNvbG9yLlxyXG4gKiBAcmV0dXJuIHtOb2RlPHZlYzM+fSBUaGUgcmVzdWx0LlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGJsZW5kRG9kZ2UgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgYmFzZSwgYmxlbmQgXSApID0+IHtcclxuXHJcblx0cmV0dXJuIG1pbiggYmFzZS5kaXYoIGJsZW5kLm9uZU1pbnVzKCkgKSwgMS4wICk7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ2JsZW5kRG9kZ2UnLFxyXG5cdHR5cGU6ICd2ZWMzJyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ2Jhc2UnLCB0eXBlOiAndmVjMycgfSxcclxuXHRcdHsgbmFtZTogJ2JsZW5kJywgdHlwZTogJ3ZlYzMnIH1cclxuXHRdXHJcbn0gKTtcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIGEgXCJTY3JlZW5cIiBibGVuZCBtb2RlLlxyXG4gKlxyXG4gKiBTaW1pbGFyIHRvIGBibGVuZERvZGdlKClgLCB0aGlzIG1vZGUgYWxzbyBsaWdodGVucyB0aGUgYmFzZSBsYXllcidzIGNvbG9ycyBiYXNlZCBvbiB0aGUgY29sb3Igb2YgdGhlIGJsZW5kIGxheWVyLlxyXG4gKiBUaGUgXCJTY3JlZW5cIiBibGVuZCBtb2RlIGlzIGJldHRlciBmb3IgZ2VuZXJhbCBicmlnaHRlbmluZyB3aGVyZWFzIHRoZSBcIkRvZGdlXCIgcmVzdWx0cyBpbiBtb3JlIHN1YnRsZSBhbmQgbnVhbmNlZFxyXG4gKiBlZmZlY3RzLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGU8dmVjMz59IGJhc2UgLSBUaGUgYmFzZSBjb2xvci5cclxuICogQHBhcmFtIHtOb2RlPHZlYzM+fSBibGVuZCAtIFRoZSBibGVuZCBjb2xvci4gQSBibGFjayAoIzAwMDAwMCkgYmxlbmQgY29sb3IgZG9lcyBub3QgYWx0ZXIgdGhlIGJhc2UgY29sb3IuXHJcbiAqIEByZXR1cm4ge05vZGU8dmVjMz59IFRoZSByZXN1bHQuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYmxlbmRTY3JlZW4gPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgYmFzZSwgYmxlbmQgXSApID0+IHtcclxuXHJcblx0cmV0dXJuIGJhc2Uub25lTWludXMoKS5tdWwoIGJsZW5kLm9uZU1pbnVzKCkgKS5vbmVNaW51cygpO1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdibGVuZFNjcmVlbicsXHJcblx0dHlwZTogJ3ZlYzMnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAnYmFzZScsIHR5cGU6ICd2ZWMzJyB9LFxyXG5cdFx0eyBuYW1lOiAnYmxlbmQnLCB0eXBlOiAndmVjMycgfVxyXG5cdF1cclxufSApO1xyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgYSBcIk92ZXJsYXlcIiBibGVuZCBtb2RlLlxyXG4gKlxyXG4gKiBJdCdzIGRlc2lnbmVkIHRvIGluY3JlYXNlIHRoZSBjb250cmFzdCBvZiB0aGUgYmFzZSBsYXllciBiYXNlZCBvbiB0aGUgY29sb3Igb2YgdGhlIGJsZW5kIGxheWVyLlxyXG4gKiBJdCBhbXBsaWZpZXMgdGhlIGV4aXN0aW5nIGNvbG9ycyBhbmQgY29udHJhc3QgaW4gdGhlIGJhc2UgbGF5ZXIsIG1ha2luZyBsaWdodGVyIGFyZWFzIGxpZ2h0ZXIgYW5kIGRhcmtlciBhcmVhcyBkYXJrZXIuXHJcbiAqIFRoZSBjb2xvciBvZiB0aGUgYmxlbmQgbGF5ZXIgc2lnbmlmaWNhbnRseSBpbmZsdWVuY2VzIHRoZSByZXN1bHRpbmcgY29udHJhc3QgYW5kIGNvbG9yIHNoaWZ0IGluIHRoZSBiYXNlIGxheWVyLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGU8dmVjMz59IGJhc2UgLSBUaGUgYmFzZSBjb2xvci5cclxuICogQHBhcmFtIHtOb2RlPHZlYzM+fSBibGVuZCAtIFRoZSBibGVuZCBjb2xvclxyXG4gKiBAcmV0dXJuIHtOb2RlPHZlYzM+fSBUaGUgcmVzdWx0LlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGJsZW5kT3ZlcmxheSA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyBiYXNlLCBibGVuZCBdICkgPT4ge1xyXG5cclxuXHRyZXR1cm4gbWl4KCBiYXNlLm11bCggMi4wICkubXVsKCBibGVuZCApLCBiYXNlLm9uZU1pbnVzKCkubXVsKCAyLjAgKS5tdWwoIGJsZW5kLm9uZU1pbnVzKCkgKS5vbmVNaW51cygpLCBzdGVwKCAwLjUsIGJhc2UgKSApO1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdibGVuZE92ZXJsYXknLFxyXG5cdHR5cGU6ICd2ZWMzJyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ2Jhc2UnLCB0eXBlOiAndmVjMycgfSxcclxuXHRcdHsgbmFtZTogJ2JsZW5kJywgdHlwZTogJ3ZlYzMnIH1cclxuXHRdXHJcbn0gKTtcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGZ1bmN0aW9uIGJsZW5kcyB0d28gY29sb3IgYmFzZWQgb24gdGhlaXIgYWxwaGEgdmFsdWVzIGJ5IHJlcGxpY2F0aW5nIHRoZSBiZWhhdmlvciBvZiBgVEhSRUUuTm9ybWFsQmxlbmRpbmdgLlxyXG4gKiBJdCBhc3N1bWVzIGJvdGggaW5wdXQgY29sb3JzIGhhdmUgbm9uLXByZW11bHRpcGxpZWQgYWxwaGEuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWM0Pn0gYmFzZSAtIFRoZSBiYXNlIGNvbG9yLlxyXG4gKiBAcGFyYW0ge05vZGU8dmVjND59IGJsZW5kIC0gVGhlIGJsZW5kIGNvbG9yXHJcbiAqIEByZXR1cm4ge05vZGU8dmVjND59IFRoZSByZXN1bHQuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYmxlbmRDb2xvciA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyBiYXNlLCBibGVuZCBdICkgPT4ge1xyXG5cclxuXHRjb25zdCBvdXRBbHBoYSA9IGJsZW5kLmEuYWRkKCBiYXNlLmEubXVsKCBibGVuZC5hLm9uZU1pbnVzKCkgKSApO1xyXG5cclxuXHRyZXR1cm4gdmVjNCggYmxlbmQucmdiLm11bCggYmxlbmQuYSApLmFkZCggYmFzZS5yZ2IubXVsKCBiYXNlLmEgKS5tdWwoIGJsZW5kLmEub25lTWludXMoKSApICkuZGl2KCBvdXRBbHBoYSApLCBvdXRBbHBoYSApO1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdibGVuZENvbG9yJyxcclxuXHR0eXBlOiAndmVjNCcsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICdiYXNlJywgdHlwZTogJ3ZlYzQnIH0sXHJcblx0XHR7IG5hbWU6ICdibGVuZCcsIHR5cGU6ICd2ZWM0JyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG4vLyBEZXByZWNhdGVkXHJcblxyXG4vKipcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQGRlcHJlY2F0ZWQgc2luY2UgcjE3MS4gVXNlIHtAbGluayBibGVuZEJ1cm59IGluc3RlYWQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7Li4uYW55fSBwYXJhbXNcclxuICogQHJldHVybnMge0Z1bmN0aW9ufVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGJ1cm4gPSAoIC4uLnBhcmFtcyApID0+IHsgLy8gQGRlcHJlY2F0ZWQsIHIxNzFcclxuXHJcblx0Y29uc29sZS53YXJuKCAnVEhSRUUuVFNMOiBcImJ1cm5cIiBoYXMgYmVlbiByZW5hbWVkLiBVc2UgXCJibGVuZEJ1cm5cIiBpbnN0ZWFkLicgKTtcclxuXHRyZXR1cm4gYmxlbmRCdXJuKCBwYXJhbXMgKTtcclxuXHJcbn07XHJcblxyXG4vKipcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQGRlcHJlY2F0ZWQgc2luY2UgcjE3MS4gVXNlIHtAbGluayBibGVuZERvZGdlfSBpbnN0ZWFkLlxyXG4gKlxyXG4gKiBAcGFyYW0gey4uLmFueX0gcGFyYW1zXHJcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBkb2RnZSA9ICggLi4ucGFyYW1zICkgPT4geyAvLyBAZGVwcmVjYXRlZCwgcjE3MVxyXG5cclxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5UU0w6IFwiZG9kZ2VcIiBoYXMgYmVlbiByZW5hbWVkLiBVc2UgXCJibGVuZERvZGdlXCIgaW5zdGVhZC4nICk7XHJcblx0cmV0dXJuIGJsZW5kRG9kZ2UoIHBhcmFtcyApO1xyXG5cclxufTtcclxuXHJcbi8qKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAZGVwcmVjYXRlZCBzaW5jZSByMTcxLiBVc2Uge0BsaW5rIGJsZW5kU2NyZWVufSBpbnN0ZWFkLlxyXG4gKlxyXG4gKiBAcGFyYW0gey4uLmFueX0gcGFyYW1zXHJcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn1cclxuICovXHJcbmV4cG9ydCBjb25zdCBzY3JlZW4gPSAoIC4uLnBhcmFtcyApID0+IHsgLy8gQGRlcHJlY2F0ZWQsIHIxNzFcclxuXHJcblx0Y29uc29sZS53YXJuKCAnVEhSRUUuVFNMOiBcInNjcmVlblwiIGhhcyBiZWVuIHJlbmFtZWQuIFVzZSBcImJsZW5kU2NyZWVuXCIgaW5zdGVhZC4nICk7XHJcblx0cmV0dXJuIGJsZW5kU2NyZWVuKCBwYXJhbXMgKTtcclxuXHJcbn07XHJcblxyXG4vKipcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQGRlcHJlY2F0ZWQgc2luY2UgcjE3MS4gVXNlIHtAbGluayBibGVuZE92ZXJsYXl9IGluc3RlYWQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7Li4uYW55fSBwYXJhbXNcclxuICogQHJldHVybnMge0Z1bmN0aW9ufVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG92ZXJsYXkgPSAoIC4uLnBhcmFtcyApID0+IHsgLy8gQGRlcHJlY2F0ZWQsIHIxNzFcclxuXHJcblx0Y29uc29sZS53YXJuKCAnVEhSRUUuVFNMOiBcIm92ZXJsYXlcIiBoYXMgYmVlbiByZW5hbWVkLiBVc2UgXCJibGVuZE92ZXJsYXlcIiBpbnN0ZWFkLicgKTtcclxuXHRyZXR1cm4gYmxlbmRPdmVybGF5KCBwYXJhbXMgKTtcclxuXHJcbn07XHJcbiIsImltcG9ydCB7IGRvdCwgbWF4LCBtaXggfSBmcm9tICcuLi9tYXRoL01hdGhOb2RlLmpzJztcclxuaW1wb3J0IHsgYWRkIH0gZnJvbSAnLi4vbWF0aC9PcGVyYXRvck5vZGUuanMnO1xyXG5pbXBvcnQgeyBGbiwgSWYsIGZsb2F0LCB2ZWMzLCB2ZWM0IH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5pbXBvcnQgeyBDb2xvck1hbmFnZW1lbnQgfSBmcm9tICcuLi8uLi9tYXRoL0NvbG9yTWFuYWdlbWVudC5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBMaW5lYXJTUkdCQ29sb3JTcGFjZSB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcblxyXG4vKipcclxuICogQ29tcHV0ZXMgYSBncmF5c2NhbGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBSR0IgY29sb3IgdmFsdWUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMzPn0gY29sb3IgLSBUaGUgY29sb3IgdmFsdWUgdG8gY29tcHV0ZSB0aGUgZ3JheXNjYWxlIGZvci5cclxuICogQHJldHVybiB7Tm9kZTx2ZWMzPn0gVGhlIGdyYXlzY2FsZSBjb2xvci5cclxuICovXHJcbmV4cG9ydCBjb25zdCBncmF5c2NhbGUgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgY29sb3IgXSApID0+IHtcclxuXHJcblx0cmV0dXJuIGx1bWluYW5jZSggY29sb3IucmdiICk7XHJcblxyXG59ICk7XHJcblxyXG4vKipcclxuICogU3VwZXItc2F0dXJhdGVzIG9yIGRlc2F0dXJhdGVzIHRoZSBnaXZlbiBSR0IgY29sb3IuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMzPn0gY29sb3IgLSBUaGUgaW5wdXQgY29sb3IuXHJcbiAqIEBwYXJhbSB7Tm9kZTxmbG9hdD59IFthZGp1c3RtZW50PTFdIC0gU3BlY2lmaWVzIHRoZSBhbW91bnQgb2YgdGhlIGNvbnZlcnNpb24uIEEgdmFsdWUgdW5kZXIgYDFgIGRlc2F0dXJhdGVzIHRoZSBjb2xvciwgYSB2YWx1ZSBvdmVyIGAxYCBzdXBlci1zYXR1cmF0ZXMgaXQuXHJcbiAqIEByZXR1cm4ge05vZGU8dmVjMz59IFRoZSBzYXR1cmF0ZWQgY29sb3IuXHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgc2F0dXJhdGlvbiA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyBjb2xvciwgYWRqdXN0bWVudCA9IGZsb2F0KCAxICkgXSApID0+IHtcclxuXHJcblx0cmV0dXJuIGFkanVzdG1lbnQubWl4KCBsdW1pbmFuY2UoIGNvbG9yLnJnYiApLCBjb2xvci5yZ2IgKTtcclxuXHJcbn0gKTtcclxuXHJcbi8qKlxyXG4gKiBTZWxlY3RpdmVseSBlbmhhbmNlIHRoZSBpbnRlbnNpdHkgb2YgbGVzcyBzYXR1cmF0ZWQgUkdCIGNvbG9ycy4gQ2FuIHJlc3VsdFxyXG4gKiBpbiBhIG1vcmUgbmF0dXJhbCBhbmQgdmlzdWFsbHkgYXBwZWFsaW5nIGltYWdlIHdpdGggZW5oYW5jZWQgY29sb3IgZGVwdGhcclxuICogY29tcGFyZWQgdG8ge0BsaW5rIENvbG9yQWRqdXN0bWVudCNzYXR1cmF0aW9ufS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlPHZlYzM+fSBjb2xvciAtIFRoZSBpbnB1dCBjb2xvci5cclxuICogQHBhcmFtIHtOb2RlPGZsb2F0Pn0gW2FkanVzdG1lbnQ9MV0gLSBDb250cm9scyB0aGUgaW50ZW5zaXR5IG9mIHRoZSB2aWJyYW5jZSBlZmZlY3QuXHJcbiAqIEByZXR1cm4ge05vZGU8dmVjMz59IFRoZSB1cGRhdGVkIGNvbG9yLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHZpYnJhbmNlID0gLypAX19QVVJFX18qLyBGbiggKCBbIGNvbG9yLCBhZGp1c3RtZW50ID0gZmxvYXQoIDEgKSBdICkgPT4ge1xyXG5cclxuXHRjb25zdCBhdmVyYWdlID0gYWRkKCBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iICkuZGl2KCAzLjAgKTtcclxuXHJcblx0Y29uc3QgbXggPSBjb2xvci5yLm1heCggY29sb3IuZy5tYXgoIGNvbG9yLmIgKSApO1xyXG5cdGNvbnN0IGFtdCA9IG14LnN1YiggYXZlcmFnZSApLm11bCggYWRqdXN0bWVudCApLm11bCggLSAzLjAgKTtcclxuXHJcblx0cmV0dXJuIG1peCggY29sb3IucmdiLCBteCwgYW10ICk7XHJcblxyXG59ICk7XHJcblxyXG4vKipcclxuICogVXBkYXRlcyB0aGUgaHVlIGNvbXBvbmVudCBvZiB0aGUgZ2l2ZW4gUkdCIGNvbG9yIHdoaWxlIHByZXNlcnZpbmcgaXRzIGx1bWluYW5jZSBhbmQgc2F0dXJhdGlvbi5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlPHZlYzM+fSBjb2xvciAtIFRoZSBpbnB1dCBjb2xvci5cclxuICogQHBhcmFtIHtOb2RlPGZsb2F0Pn0gW2FkanVzdG1lbnQ9MV0gLSBEZWZpbmVzIHRoZSBkZWdyZWUgb2YgaHVlIHJvdGF0aW9uIGluIHJhZGlhbnMuIEEgcG9zaXRpdmUgdmFsdWUgcm90YXRlcyB0aGUgaHVlIGNsb2Nrd2lzZSwgd2hpbGUgYSBuZWdhdGl2ZSB2YWx1ZSByb3RhdGVzIGl0IGNvdW50ZXJjbG9ja3dpc2UuXHJcbiAqIEByZXR1cm4ge05vZGU8dmVjMz59IFRoZSB1cGRhdGVkIGNvbG9yLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGh1ZSA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyBjb2xvciwgYWRqdXN0bWVudCA9IGZsb2F0KCAxICkgXSApID0+IHtcclxuXHJcblx0Y29uc3QgayA9IHZlYzMoIDAuNTc3MzUsIDAuNTc3MzUsIDAuNTc3MzUgKTtcclxuXHJcblx0Y29uc3QgY29zQW5nbGUgPSBhZGp1c3RtZW50LmNvcygpO1xyXG5cclxuXHRyZXR1cm4gdmVjMyggY29sb3IucmdiLm11bCggY29zQW5nbGUgKS5hZGQoIGsuY3Jvc3MoIGNvbG9yLnJnYiApLm11bCggYWRqdXN0bWVudC5zaW4oKSApLmFkZCggay5tdWwoIGRvdCggaywgY29sb3IucmdiICkubXVsKCBjb3NBbmdsZS5vbmVNaW51cygpICkgKSApICkgKTtcclxuXHJcbn0gKTtcclxuXHJcbi8qKlxyXG4gKiBDb21wdXRlcyB0aGUgbHVtaW5hbmNlIGZvciB0aGUgZ2l2ZW4gUkdCIGNvbG9yIHZhbHVlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGU8dmVjMz59IGNvbG9yIC0gVGhlIGNvbG9yIHZhbHVlIHRvIGNvbXB1dGUgdGhlIGx1bWluYW5jZSBmb3IuXHJcbiAqIEBwYXJhbSB7P05vZGU8dmVjMz59IGx1bWluYW5jZUNvZWZmaWNpZW50cyAtIFRoZSBsdW1pbmFuY2UgY29lZmZpY2llbnRzLiBCeSBkZWZhdWx0IHByZWRlZmluZWQgdmFsdWVzIG9mIHRoZSBjdXJyZW50IHdvcmtpbmcgY29sb3Igc3BhY2UgYXJlIHVzZWQuXHJcbiAqIEByZXR1cm4ge05vZGU8dmVjMz59IFRoZSBsdW1pbmFuY2UuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbHVtaW5hbmNlID0gKFxyXG5cdGNvbG9yLFxyXG5cdGx1bWluYW5jZUNvZWZmaWNpZW50cyA9IHZlYzMoIENvbG9yTWFuYWdlbWVudC5nZXRMdW1pbmFuY2VDb2VmZmljaWVudHMoIG5ldyBWZWN0b3IzKCkgKSApXHJcbikgPT4gZG90KCBjb2xvciwgbHVtaW5hbmNlQ29lZmZpY2llbnRzICk7XHJcblxyXG4vKipcclxuICogQ29sb3IgRGVjaXNpb24gTGlzdCAoQ0RMKSB2MS4yXHJcbiAqXHJcbiAqIENvbXBhY3QgcmVwcmVzZW50YXRpb24gb2YgY29sb3IgZ3JhZGluZyBpbmZvcm1hdGlvbiwgZGVmaW5lZCBieSBzbG9wZSwgb2Zmc2V0LCBwb3dlciwgYW5kXHJcbiAqIHNhdHVyYXRpb24uIFRoZSBDREwgc2hvdWxkIGJlIHR5cGljYWxseSBiZSBnaXZlbiBpbnB1dCBpbiBhIGxvZyBzcGFjZSAoc3VjaCBhcyBMb2dDLCBBQ0VTY2MsXHJcbiAqIG9yIEFnWCBMb2cpLCBhbmQgd2lsbCByZXR1cm4gb3V0cHV0IGluIHRoZSBzYW1lIHNwYWNlLiBPdXRwdXQgbWF5IHJlcXVpcmUgY2xhbXBpbmcgPj0wLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGU8dmVjND59IGNvbG9yIElucHV0ICgtSW5maW5pdHkgPCBpbnB1dCA8ICtJbmZpbml0eSlcclxuICogQHBhcmFtIHtOb2RlPHZlYzM+fSBzbG9wZSBTbG9wZSAoMCDiiaQgc2xvcGUgPCArSW5maW5pdHkpXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMzPn0gb2Zmc2V0IE9mZnNldCAoLUluZmluaXR5IDwgb2Zmc2V0IDwgK0luZmluaXR5OyB0eXBpY2FsbHkgLTEgPCBvZmZzZXQgPCAxKVxyXG4gKiBAcGFyYW0ge05vZGU8dmVjMz59IHBvd2VyIFBvd2VyICgwIDwgcG93ZXIgPCArSW5maW5pdHkpXHJcbiAqIEBwYXJhbSB7Tm9kZTxmbG9hdD59IHNhdHVyYXRpb24gU2F0dXJhdGlvbiAoMCDiiaQgc2F0dXJhdGlvbiA8ICtJbmZpbml0eTsgdHlwaWNhbGx5IDAg4omkIHNhdHVyYXRpb24gPCA0KVxyXG4gKiBAcGFyYW0ge05vZGU8dmVjMz59IGx1bWluYW5jZUNvZWZmaWNpZW50cyBMdW1pbmFuY2UgY29lZmZpY2llbnRzIGZvciBzYXR1cmF0aW9uIHRlcm0sIHR5cGljYWxseSBSZWMuIDcwOVxyXG4gKiBAcmV0dXJuIHtOb2RlPHZlYzQ+fSBPdXRwdXQsIC1JbmZpbml0eSA8IG91dHB1dCA8ICtJbmZpbml0eVxyXG4gKlxyXG4gKiBSZWZlcmVuY2VzOlxyXG4gKiAtIEFTQyBDREwgdjEuMlxyXG4gKiAtIHtAbGluayBodHRwczovL2JsZW5kZXIuc3RhY2tleGNoYW5nZS5jb20vYS81NTIzOS80MzkzMH1cclxuICogLSB7QGxpbmsgaHR0cHM6Ly9kb2NzLmFjZXNjZW50cmFsLmNvbS9zcGVjaWZpY2F0aW9ucy9hY2VzY2MvfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGNkbCA9IC8qQF9fUFVSRV9fKi8gRm4oICggW1xyXG5cdGNvbG9yLFxyXG5cdHNsb3BlID0gdmVjMyggMSApLFxyXG5cdG9mZnNldCA9IHZlYzMoIDAgKSxcclxuXHRwb3dlciA9IHZlYzMoIDEgKSxcclxuXHRzYXR1cmF0aW9uID0gZmxvYXQoIDEgKSxcclxuXHQvLyBBU0MgQ0RMIHYxLjIgZXhwbGljaXRseSByZXF1aXJlcyBSZWMuIDcwOSBsdW1pbmFuY2UgY29lZmZpY2llbnRzLlxyXG5cdGx1bWluYW5jZUNvZWZmaWNpZW50cyA9IHZlYzMoIENvbG9yTWFuYWdlbWVudC5nZXRMdW1pbmFuY2VDb2VmZmljaWVudHMoIG5ldyBWZWN0b3IzKCksIExpbmVhclNSR0JDb2xvclNwYWNlICkgKVxyXG5dICkgPT4ge1xyXG5cclxuXHQvLyBOT1RFOiBUaGUgQVNDIENETCB2MS4yIGRlZmluZXMgYSBbMCwgMV0gY2xhbXAgb24gdGhlIHNsb3BlK29mZnNldCB0ZXJtLCBhbmQgYW5vdGhlciBvbiB0aGVcclxuXHQvLyBzYXR1cmF0aW9uIHRlcm0uIFBlciB0aGUgQUNFU2NjIHNwZWNpZmljYXRpb24gYW5kIEZpbGFtZW50LCBsaW1pdHMgbWF5IGJlIG9taXR0ZWQgdG8gc3VwcG9ydFxyXG5cdC8vIHZhbHVlcyBvdXRzaWRlIFswLCAxXSwgcmVxdWlyaW5nIGEgd29ya2Fyb3VuZCBmb3IgbmVnYXRpdmUgdmFsdWVzIGluIHRoZSBwb3dlciBleHByZXNzaW9uLlxyXG5cclxuXHRjb25zdCBsdW1hID0gY29sb3IucmdiLmRvdCggdmVjMyggbHVtaW5hbmNlQ29lZmZpY2llbnRzICkgKTtcclxuXHJcblx0Y29uc3QgdiA9IG1heCggY29sb3IucmdiLm11bCggc2xvcGUgKS5hZGQoIG9mZnNldCApLCAwLjAgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHB2ID0gdi5wb3coIHBvd2VyICkudG9WYXIoKTtcclxuXHJcblx0SWYoIHYuci5ncmVhdGVyVGhhbiggMC4wICksICgpID0+IHsgdi5yLmFzc2lnbiggcHYuciApOyB9ICk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcclxuXHRJZiggdi5nLmdyZWF0ZXJUaGFuKCAwLjAgKSwgKCkgPT4geyB2LmcuYXNzaWduKCBwdi5nICk7IH0gKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxyXG5cdElmKCB2LmIuZ3JlYXRlclRoYW4oIDAuMCApLCAoKSA9PiB7IHYuYi5hc3NpZ24oIHB2LmIgKTsgfSApOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXHJcblxyXG5cdHYuYXNzaWduKCBsdW1hLmFkZCggdi5zdWIoIGx1bWEgKS5tdWwoIHNhdHVyYXRpb24gKSApICk7XHJcblxyXG5cdHJldHVybiB2ZWM0KCB2LnJnYiwgY29sb3IuYSApO1xyXG5cclxufSApO1xyXG4iLCJpbXBvcnQgVGVtcE5vZGUgZnJvbSAnLi4vY29yZS9UZW1wTm9kZS5qcyc7XHJcbmltcG9ydCB7IG5vZGVQcm94eSB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIGEgcG9zdGVyaXplIGVmZmVjdCB3aGljaCByZWR1Y2VzIHRoZSBudW1iZXIgb2YgY29sb3JzXHJcbiAqIGluIGFuIGltYWdlLCByZXN1bHRpbmcgaW4gYSBtb3JlIGJsb2NreSBhbmQgc3R5bGl6ZWQgYXBwZWFyYW5jZS5cclxuICpcclxuICogQGF1Z21lbnRzIFRlbXBOb2RlXHJcbiAqL1xyXG5jbGFzcyBQb3N0ZXJpemVOb2RlIGV4dGVuZHMgVGVtcE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdQb3N0ZXJpemVOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHBvc3Rlcml6ZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlfSBzb3VyY2VOb2RlIC0gVGhlIGlucHV0IGNvbG9yLlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gc3RlcHNOb2RlIC0gQ29udHJvbHMgdGhlIGludGVuc2l0eSBvZiB0aGUgcG9zdGVyaXphdGlvbiBlZmZlY3QuIEEgbG93ZXIgbnVtYmVyIHJlc3VsdHMgaW4gYSBtb3JlIGJsb2NreSBhcHBlYXJhbmNlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBzb3VyY2VOb2RlLCBzdGVwc05vZGUgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBpbnB1dCBjb2xvci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zb3VyY2VOb2RlID0gc291cmNlTm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENvbnRyb2xzIHRoZSBpbnRlbnNpdHkgb2YgdGhlIHBvc3Rlcml6YXRpb24gZWZmZWN0LiBBIGxvd2VyIG51bWJlciByZXN1bHRzIGluIGEgbW9yZSBibG9ja3kgYXBwZWFyYW5jZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zdGVwc05vZGUgPSBzdGVwc05vZGU7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXAoKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBzb3VyY2VOb2RlLCBzdGVwc05vZGUgfSA9IHRoaXM7XHJcblxyXG5cdFx0cmV0dXJuIHNvdXJjZU5vZGUubXVsKCBzdGVwc05vZGUgKS5mbG9vcigpLmRpdiggc3RlcHNOb2RlICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFBvc3Rlcml6ZU5vZGU7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIHBvc3Rlcml6ZSBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IHNvdXJjZU5vZGUgLSBUaGUgaW5wdXQgY29sb3IuXHJcbiAqIEBwYXJhbSB7Tm9kZX0gc3RlcHNOb2RlIC0gQ29udHJvbHMgdGhlIGludGVuc2l0eSBvZiB0aGUgcG9zdGVyaXphdGlvbiBlZmZlY3QuIEEgbG93ZXIgbnVtYmVyIHJlc3VsdHMgaW4gYSBtb3JlIGJsb2NreSBhcHBlYXJhbmNlLlxyXG4gKiBAcmV0dXJucyB7UG9zdGVyaXplTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBwb3N0ZXJpemUgPSAvKkBfX1BVUkVfXyovIG5vZGVQcm94eSggUG9zdGVyaXplTm9kZSApLnNldFBhcmFtZXRlckxlbmd0aCggMiApO1xyXG4iLCJpbXBvcnQgVGVtcE5vZGUgZnJvbSAnLi4vY29yZS9UZW1wTm9kZS5qcyc7XHJcbmltcG9ydCB7IGRlZmF1bHQgYXMgVGV4dHVyZU5vZGUvKiwgdGV4dHVyZSovIH0gZnJvbSAnLi4vYWNjZXNzb3JzL1RleHR1cmVOb2RlLmpzJztcclxuaW1wb3J0IHsgTm9kZVVwZGF0ZVR5cGUgfSBmcm9tICcuLi9jb3JlL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IG5vZGVPYmplY3QgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcbmltcG9ydCB7IHVuaWZvcm0gfSBmcm9tICcuLi9jb3JlL1VuaWZvcm1Ob2RlLmpzJztcclxuaW1wb3J0IHsgdmlld1pUb09ydGhvZ3JhcGhpY0RlcHRoLCBwZXJzcGVjdGl2ZURlcHRoVG9WaWV3WiB9IGZyb20gJy4vVmlld3BvcnREZXB0aE5vZGUuanMnO1xyXG5cclxuaW1wb3J0IHsgSGFsZkZsb2F0VHlwZS8qLCBGbG9hdFR5cGUqLyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjIuanMnO1xyXG5pbXBvcnQgeyBEZXB0aFRleHR1cmUgfSBmcm9tICcuLi8uLi90ZXh0dXJlcy9EZXB0aFRleHR1cmUuanMnO1xyXG5pbXBvcnQgeyBSZW5kZXJUYXJnZXQgfSBmcm9tICcuLi8uLi9jb3JlL1JlbmRlclRhcmdldC5qcyc7XHJcblxyXG5jb25zdCBfc2l6ZSA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjIoKTtcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIHRoZSB0ZXh0dXJlIG9mIGEgcGFzcyBub2RlLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgVGV4dHVyZU5vZGVcclxuICovXHJcbmNsYXNzIFBhc3NUZXh0dXJlTm9kZSBleHRlbmRzIFRleHR1cmVOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnUGFzc1RleHR1cmVOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHBhc3MgdGV4dHVyZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtQYXNzTm9kZX0gcGFzc05vZGUgLSBUaGUgcGFzcyBub2RlLlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSBvdXRwdXQgdGV4dHVyZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcGFzc05vZGUsIHRleHR1cmUgKSB7XHJcblxyXG5cdFx0c3VwZXIoIHRleHR1cmUgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIHRoZSBwYXNzIG5vZGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1Bhc3NOb2RlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBhc3NOb2RlID0gcGFzc05vZGU7XHJcblxyXG5cdFx0dGhpcy5zZXRVcGRhdGVNYXRyaXgoIGZhbHNlICk7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXAoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0aWYgKCBidWlsZGVyLm9iamVjdC5pc1F1YWRNZXNoICkgdGhpcy5wYXNzTm9kZS5idWlsZCggYnVpbGRlciApO1xyXG5cclxuXHRcdHJldHVybiBzdXBlci5zZXR1cCggYnVpbGRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdGNsb25lKCkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5wYXNzTm9kZSwgdGhpcy52YWx1ZSApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQW4gZXh0ZW5zaW9uIG9mIGBQYXNzVGV4dHVyZU5vZGVgIHdoaWNoIGFsbG93cyB0byBtYW5hZ2UgbW9yZSB0aGFuIG9uZVxyXG4gKiBpbnRlcm5hbCB0ZXh0dXJlLiBSZWxldmFudCBmb3IgdGhlIGBnZXRQcmV2aW91c1RleHR1cmUoKWAgcmVsYXRlZCBBUEkuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBQYXNzVGV4dHVyZU5vZGVcclxuICovXHJcbmNsYXNzIFBhc3NNdWx0aXBsZVRleHR1cmVOb2RlIGV4dGVuZHMgUGFzc1RleHR1cmVOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnUGFzc011bHRpcGxlVGV4dHVyZU5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcGFzcyB0ZXh0dXJlIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1Bhc3NOb2RlfSBwYXNzTm9kZSAtIFRoZSBwYXNzIG5vZGUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHRleHR1cmVOYW1lIC0gVGhlIG91dHB1dCB0ZXh0dXJlIG5hbWUuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbcHJldmlvdXNUZXh0dXJlPWZhbHNlXSAtIFdoZXRoZXIgcHJldmlvdXMgZnJhbWUgZGF0YSBzaG91bGQgYmUgdXNlZCBvciBub3QuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHBhc3NOb2RlLCB0ZXh0dXJlTmFtZSwgcHJldmlvdXNUZXh0dXJlID0gZmFsc2UgKSB7XHJcblxyXG5cdFx0Ly8gbnVsbCBpcyBwYXNzZWQgdG8gdGhlIHN1cGVyIGNhbGwgc2luY2UgdGhpcyBjbGFzcyBkb2VzIG5vdFxyXG5cdFx0Ly8gdXNlIGFuIGV4dGVybmFsIHRleHR1cmUgZm9yIHJlbmRlcmluZyBwYXNzIGRhdGEgaW50by4gSW5zdGVhZFxyXG5cdFx0Ly8gdGhlIHRleHR1cmUgaXMgbWFuYWdlZCBieSB0aGUgcGFzcyBub2RlIGl0c2VsZlxyXG5cclxuXHRcdHN1cGVyKCBwYXNzTm9kZSwgbnVsbCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG91dHB1dCB0ZXh0dXJlIG5hbWUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50ZXh0dXJlTmFtZSA9IHRleHR1cmVOYW1lO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciBwcmV2aW91cyBmcmFtZSBkYXRhIHNob3VsZCBiZSB1c2VkIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wcmV2aW91c1RleHR1cmUgPSBwcmV2aW91c1RleHR1cmU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgdGV4dHVyZSByZWZlcmVuY2Ugb2YgdGhpcyBub2RlLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZVRleHR1cmUoKSB7XHJcblxyXG5cdFx0dGhpcy52YWx1ZSA9IHRoaXMucHJldmlvdXNUZXh0dXJlID8gdGhpcy5wYXNzTm9kZS5nZXRQcmV2aW91c1RleHR1cmUoIHRoaXMudGV4dHVyZU5hbWUgKSA6IHRoaXMucGFzc05vZGUuZ2V0VGV4dHVyZSggdGhpcy50ZXh0dXJlTmFtZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdHNldHVwKCBidWlsZGVyICkge1xyXG5cclxuXHRcdHRoaXMudXBkYXRlVGV4dHVyZSgpO1xyXG5cclxuXHRcdHJldHVybiBzdXBlci5zZXR1cCggYnVpbGRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdGNsb25lKCkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5wYXNzTm9kZSwgdGhpcy50ZXh0dXJlTmFtZSwgdGhpcy5wcmV2aW91c1RleHR1cmUgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgYSByZW5kZXIgcGFzcyAoc29tZXRpbWVzIGNhbGxlZCBiZWF1dHkgcGFzcykgaW4gY29udGV4dCBvZiBwb3N0IHByb2Nlc3NpbmcuXHJcbiAqIFRoaXMgcGFzcyBwcm9kdWNlcyBhIHJlbmRlciBmb3IgdGhlIGdpdmVuIHNjZW5lIGFuZCBjYW1lcmEgYW5kIGNhbiBwcm92aWRlIG11bHRpcGxlIG91dHB1dHNcclxuICogdmlhIE1SVCBmb3IgZnVydGhlciBwcm9jZXNzaW5nLlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiBjb25zdCBwb3N0UHJvY2Vzc2luZyA9IG5ldyBQb3N0UHJvY2Vzc2luZyggcmVuZGVyZXIgKTtcclxuICpcclxuICogY29uc3Qgc2NlbmVQYXNzID0gcGFzcyggc2NlbmUsIGNhbWVyYSApO1xyXG4gKlxyXG4gKiBwb3N0UHJvY2Vzc2luZy5vdXRwdXROb2RlID0gc2NlbmVQYXNzO1xyXG4gKiBgYGBcclxuICpcclxuICogQGF1Z21lbnRzIFRlbXBOb2RlXHJcbiAqL1xyXG5jbGFzcyBQYXNzTm9kZSBleHRlbmRzIFRlbXBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnUGFzc05vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcGFzcyBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHsoJ2NvbG9yJ3wnZGVwdGgnKX0gc2NvcGUgLSBUaGUgc2NvcGUgb2YgdGhlIHBhc3MuIFRoZSBzY29wZSBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIG5vZGUgb3V0cHV0cyBjb2xvciBvciBkZXB0aC5cclxuXHQgKiBAcGFyYW0ge1NjZW5lfSBzY2VuZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBzY2VuZS5cclxuXHQgKiBAcGFyYW0ge0NhbWVyYX0gY2FtZXJhIC0gQSByZWZlcmVuY2UgdG8gdGhlIGNhbWVyYS5cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIHRoZSBpbnRlcm5hbCByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBzY29wZSwgc2NlbmUsIGNhbWVyYSwgb3B0aW9ucyA9IHt9ICkge1xyXG5cclxuXHRcdHN1cGVyKCAndmVjNCcgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBzY29wZSBvZiB0aGUgcGFzcy4gVGhlIHNjb3BlIGRldGVybWluZXMgd2hldGhlciB0aGUgbm9kZSBvdXRwdXRzIGNvbG9yIG9yIGRlcHRoLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoJ2NvbG9yJ3wnZGVwdGgnKX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zY29wZSA9IHNjb3BlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIHNjZW5lLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtTY2VuZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zY2VuZSA9IHNjZW5lO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIGNhbWVyYS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Q2FtZXJhfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNhbWVyYSA9IGNhbWVyYTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIE9wdGlvbnMgZm9yIHRoZSBpbnRlcm5hbCByZW5kZXIgdGFyZ2V0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcGFzcydzIHBpeGVsIHJhdGlvLiBXaWxsIGJlIGtlcHQgYXV0b21hdGljYWxseSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgcmVuZGVyZXIncyBwaXhlbCByYXRpby5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDFcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fcGl4ZWxSYXRpbyA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcGFzcydzIHBpeGVsIHdpZHRoLiBXaWxsIGJlIGtlcHQgYXV0b21hdGljYWxseSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgcmVuZGVyZXIncyB3aWR0aC5cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl93aWR0aCA9IDE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcGFzcydzIHBpeGVsIGhlaWdodC4gV2lsbCBiZSBrZXB0IGF1dG9tYXRpY2FsbHkga2VwdCBpbiBzeW5jIHdpdGggdGhlIHJlbmRlcmVyJ3MgaGVpZ2h0LlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX2hlaWdodCA9IDE7XHJcblxyXG5cdFx0Y29uc3QgZGVwdGhUZXh0dXJlID0gbmV3IERlcHRoVGV4dHVyZSgpO1xyXG5cdFx0ZGVwdGhUZXh0dXJlLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSA9IHRydWU7XHJcblx0XHQvL2RlcHRoVGV4dHVyZS50eXBlID0gRmxvYXRUeXBlO1xyXG5cdFx0ZGVwdGhUZXh0dXJlLm5hbWUgPSAnZGVwdGgnO1xyXG5cclxuXHRcdGNvbnN0IHJlbmRlclRhcmdldCA9IG5ldyBSZW5kZXJUYXJnZXQoIHRoaXMuX3dpZHRoICogdGhpcy5fcGl4ZWxSYXRpbywgdGhpcy5faGVpZ2h0ICogdGhpcy5fcGl4ZWxSYXRpbywgeyB0eXBlOiBIYWxmRmxvYXRUeXBlLCAuLi5vcHRpb25zLCB9ICk7XHJcblx0XHRyZW5kZXJUYXJnZXQudGV4dHVyZS5uYW1lID0gJ291dHB1dCc7XHJcblx0XHRyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlID0gZGVwdGhUZXh0dXJlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHBhc3MncyByZW5kZXIgdGFyZ2V0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtSZW5kZXJUYXJnZXR9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0ID0gcmVuZGVyVGFyZ2V0O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBkaWN0aW9uYXJ5IGhvbGRpbmcgdGhlIGludGVybmFsIHJlc3VsdCB0ZXh0dXJlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge09iamVjdDxzdHJpbmcsIFRleHR1cmU+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl90ZXh0dXJlcyA9IHtcclxuXHRcdFx0b3V0cHV0OiByZW5kZXJUYXJnZXQudGV4dHVyZSxcclxuXHRcdFx0ZGVwdGg6IGRlcHRoVGV4dHVyZVxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgZGljdGlvbmFyeSBob2xkaW5nIHRoZSBpbnRlcm5hbCB0ZXh0dXJlIG5vZGVzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0PHN0cmluZywgVGV4dHVyZU5vZGU+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl90ZXh0dXJlTm9kZXMgPSB7fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgZGljdGlvbmFyeSBob2xkaW5nIHRoZSBpbnRlcm5hbCBkZXB0aCBub2Rlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fbGluZWFyRGVwdGhOb2RlcyA9IHt9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBkaWN0aW9uYXJ5IGhvbGRpbmcgdGhlIGludGVybmFsIHZpZXdaIG5vZGVzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl92aWV3Wk5vZGVzID0ge307XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGRpY3Rpb25hcnkgaG9sZGluZyB0aGUgdGV4dHVyZSBkYXRhIG9mIHRoZSBwcmV2aW91cyBmcmFtZS5cclxuXHRcdCAqIFVzZWQgZm9yIGNvbXB1dGluZyB2ZWxvY2l0eS9tb3Rpb24gdmVjdG9ycy5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge09iamVjdDxzdHJpbmcsIFRleHR1cmU+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9wcmV2aW91c1RleHR1cmVzID0ge307XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGRpY3Rpb25hcnkgaG9sZGluZyB0aGUgdGV4dHVyZSBub2RlcyBvZiB0aGUgcHJldmlvdXMgZnJhbWUuXHJcblx0XHQgKiBVc2VkIGZvciBjb21wdXRpbmcgdmVsb2NpdHkvbW90aW9uIHZlY3RvcnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLCBUZXh0dXJlTm9kZT59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX3ByZXZpb3VzVGV4dHVyZU5vZGVzID0ge307XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYG5lYXJgIHByb3BlcnR5IG9mIHRoZSBjYW1lcmEgYXMgYSB1bmlmb3JtLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7VW5pZm9ybU5vZGV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX2NhbWVyYU5lYXIgPSB1bmlmb3JtKCAwICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYGZhcmAgcHJvcGVydHkgb2YgdGhlIGNhbWVyYSBhcyBhIHVuaWZvcm0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHtVbmlmb3JtTm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fY2FtZXJhRmFyID0gdW5pZm9ybSggMCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBNUlQgbm9kZSBjb25maWd1cmluZyB0aGUgTVJUIHNldHRpbmdzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7P01SVE5vZGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX21ydCA9IG51bGw7XHJcblxyXG5cdFx0dGhpcy5fbGF5ZXJzID0gbnVsbDtcclxuXHJcblx0XHR0aGlzLl9yZXNvbHV0aW9uID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNQYXNzTm9kZSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYHVwZGF0ZUJlZm9yZVR5cGVgIGlzIHNldCB0byBgTm9kZVVwZGF0ZVR5cGUuRlJBTUVgIHNpbmNlIHRoZSBub2RlIHJlbmRlcnMgdGhlXHJcblx0XHQgKiBzY2VuZSBvbmNlIHBlciBmcmFtZSBpbiBpdHMge0BsaW5rIFBhc3NOb2RlI3VwZGF0ZUJlZm9yZX0gbWV0aG9kLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKiBAZGVmYXVsdCAnZnJhbWUnXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXBkYXRlQmVmb3JlVHlwZSA9IE5vZGVVcGRhdGVUeXBlLkZSQU1FO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHJlc29sdXRpb24gZm9yIHRoZSBwYXNzLlxyXG5cdCAqIFRoZSByZXNvbHV0aW9uIGlzIGEgZmFjdG9yIHRoYXQgaXMgbXVsdGlwbGllZCB3aXRoIHRoZSByZW5kZXJlcidzIHdpZHRoIGFuZCBoZWlnaHQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gcmVzb2x1dGlvbiAtIFRoZSByZXNvbHV0aW9uIHRvIHNldC4gQSB2YWx1ZSBvZiBgMWAgbWVhbnMgZnVsbCByZXNvbHV0aW9uLlxyXG5cdCAqIEByZXR1cm4ge1Bhc3NOb2RlfSBBIHJlZmVyZW5jZSB0byB0aGlzIHBhc3MuXHJcblx0ICovXHJcblx0c2V0UmVzb2x1dGlvbiggcmVzb2x1dGlvbiApIHtcclxuXHJcblx0XHR0aGlzLl9yZXNvbHV0aW9uID0gcmVzb2x1dGlvbjtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZXRzIHRoZSBjdXJyZW50IHJlc29sdXRpb24gb2YgdGhlIHBhc3MuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBjdXJyZW50IHJlc29sdXRpb24uIEEgdmFsdWUgb2YgYDFgIG1lYW5zIGZ1bGwgcmVzb2x1dGlvbi5cclxuXHQgKiBAZGVmYXVsdCAxXHJcblx0ICovXHJcblx0Z2V0UmVzb2x1dGlvbigpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fcmVzb2x1dGlvbjtcclxuXHJcblx0fVxyXG5cclxuXHRzZXRMYXllcnMoIGxheWVycyApIHtcclxuXHJcblx0XHR0aGlzLl9sYXllcnMgPSBsYXllcnM7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0TGF5ZXJzKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9sYXllcnM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZ2l2ZW4gTVJUIG5vZGUgdG8gc2V0dXAgTVJUIGZvciB0aGlzIHBhc3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01SVE5vZGV9IG1ydCAtIFRoZSBNUlQgb2JqZWN0LlxyXG5cdCAqIEByZXR1cm4ge1Bhc3NOb2RlfSBBIHJlZmVyZW5jZSB0byB0aGlzIHBhc3MuXHJcblx0ICovXHJcblx0c2V0TVJUKCBtcnQgKSB7XHJcblxyXG5cdFx0dGhpcy5fbXJ0ID0gbXJ0O1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGN1cnJlbnQgTVJUIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtNUlROb2RlfSBUaGUgY3VycmVudCBNUlQgbm9kZS5cclxuXHQgKi9cclxuXHRnZXRNUlQoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX21ydDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgbWV0aG9kIGlzIG92ZXJ3cml0dGVuIHNvIGl0IGFsd2F5cyByZXR1cm5zIGB0cnVlYC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyBub2RlIGlzIGdsb2JhbCBvciBub3QuXHJcblx0ICovXHJcblx0aXNHbG9iYWwoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgdGV4dHVyZSBmb3IgdGhlIGdpdmVuIG91dHB1dCBuYW1lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgb3V0cHV0IG5hbWUgdG8gZ2V0IHRoZSB0ZXh0dXJlIGZvci5cclxuXHQgKiBAcmV0dXJuIHtUZXh0dXJlfSBUaGUgdGV4dHVyZS5cclxuXHQgKi9cclxuXHRnZXRUZXh0dXJlKCBuYW1lICkge1xyXG5cclxuXHRcdGxldCB0ZXh0dXJlID0gdGhpcy5fdGV4dHVyZXNbIG5hbWUgXTtcclxuXHJcblx0XHRpZiAoIHRleHR1cmUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGNvbnN0IHJlZlRleHR1cmUgPSB0aGlzLnJlbmRlclRhcmdldC50ZXh0dXJlO1xyXG5cclxuXHRcdFx0dGV4dHVyZSA9IHJlZlRleHR1cmUuY2xvbmUoKTtcclxuXHRcdFx0dGV4dHVyZS5uYW1lID0gbmFtZTtcclxuXHJcblx0XHRcdHRoaXMuX3RleHR1cmVzWyBuYW1lIF0gPSB0ZXh0dXJlO1xyXG5cclxuXHRcdFx0dGhpcy5yZW5kZXJUYXJnZXQudGV4dHVyZXMucHVzaCggdGV4dHVyZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGV4dHVyZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSB0ZXh0dXJlIGhvbGRpbmcgdGhlIGRhdGEgb2YgdGhlIHByZXZpb3VzIGZyYW1lIGZvciB0aGUgZ2l2ZW4gb3V0cHV0IG5hbWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBvdXRwdXQgbmFtZSB0byBnZXQgdGhlIHRleHR1cmUgZm9yLlxyXG5cdCAqIEByZXR1cm4ge1RleHR1cmV9IFRoZSB0ZXh0dXJlIGhvbGRpbmcgdGhlIGRhdGEgb2YgdGhlIHByZXZpb3VzIGZyYW1lLlxyXG5cdCAqL1xyXG5cdGdldFByZXZpb3VzVGV4dHVyZSggbmFtZSApIHtcclxuXHJcblx0XHRsZXQgdGV4dHVyZSA9IHRoaXMuX3ByZXZpb3VzVGV4dHVyZXNbIG5hbWUgXTtcclxuXHJcblx0XHRpZiAoIHRleHR1cmUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHRleHR1cmUgPSB0aGlzLmdldFRleHR1cmUoIG5hbWUgKS5jbG9uZSgpO1xyXG5cclxuXHRcdFx0dGhpcy5fcHJldmlvdXNUZXh0dXJlc1sgbmFtZSBdID0gdGV4dHVyZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRleHR1cmU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3dpdGNoZXMgY3VycmVudCBhbmQgcHJldmlvdXMgdGV4dHVyZXMgZm9yIHRoZSBnaXZlbiBvdXRwdXQgbmFtZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG91dHB1dCBuYW1lLlxyXG5cdCAqL1xyXG5cdHRvZ2dsZVRleHR1cmUoIG5hbWUgKSB7XHJcblxyXG5cdFx0Y29uc3QgcHJldlRleHR1cmUgPSB0aGlzLl9wcmV2aW91c1RleHR1cmVzWyBuYW1lIF07XHJcblxyXG5cdFx0aWYgKCBwcmV2VGV4dHVyZSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdGV4dHVyZSA9IHRoaXMuX3RleHR1cmVzWyBuYW1lIF07XHJcblxyXG5cdFx0XHRjb25zdCBpbmRleCA9IHRoaXMucmVuZGVyVGFyZ2V0LnRleHR1cmVzLmluZGV4T2YoIHRleHR1cmUgKTtcclxuXHRcdFx0dGhpcy5yZW5kZXJUYXJnZXQudGV4dHVyZXNbIGluZGV4IF0gPSBwcmV2VGV4dHVyZTtcclxuXHJcblx0XHRcdHRoaXMuX3RleHR1cmVzWyBuYW1lIF0gPSBwcmV2VGV4dHVyZTtcclxuXHRcdFx0dGhpcy5fcHJldmlvdXNUZXh0dXJlc1sgbmFtZSBdID0gdGV4dHVyZTtcclxuXHJcblx0XHRcdHRoaXMuX3RleHR1cmVOb2Rlc1sgbmFtZSBdLnVwZGF0ZVRleHR1cmUoKTtcclxuXHRcdFx0dGhpcy5fcHJldmlvdXNUZXh0dXJlTm9kZXNbIG5hbWUgXS51cGRhdGVUZXh0dXJlKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHRleHR1cmUgbm9kZSBmb3IgdGhlIGdpdmVuIG91dHB1dCBuYW1lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lPSdvdXRwdXQnXSAtIFRoZSBvdXRwdXQgbmFtZSB0byBnZXQgdGhlIHRleHR1cmUgbm9kZSBmb3IuXHJcblx0ICogQHJldHVybiB7VGV4dHVyZU5vZGV9IFRoZSB0ZXh0dXJlIG5vZGUuXHJcblx0ICovXHJcblx0Z2V0VGV4dHVyZU5vZGUoIG5hbWUgPSAnb3V0cHV0JyApIHtcclxuXHJcblx0XHRsZXQgdGV4dHVyZU5vZGUgPSB0aGlzLl90ZXh0dXJlTm9kZXNbIG5hbWUgXTtcclxuXHJcblx0XHRpZiAoIHRleHR1cmVOb2RlID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHR0ZXh0dXJlTm9kZSA9IG5vZGVPYmplY3QoIG5ldyBQYXNzTXVsdGlwbGVUZXh0dXJlTm9kZSggdGhpcywgbmFtZSApICk7XHJcblx0XHRcdHRleHR1cmVOb2RlLnVwZGF0ZVRleHR1cmUoKTtcclxuXHRcdFx0dGhpcy5fdGV4dHVyZU5vZGVzWyBuYW1lIF0gPSB0ZXh0dXJlTm9kZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRleHR1cmVOb2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHByZXZpb3VzIHRleHR1cmUgbm9kZSBmb3IgdGhlIGdpdmVuIG91dHB1dCBuYW1lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lPSdvdXRwdXQnXSAtIFRoZSBvdXRwdXQgbmFtZSB0byBnZXQgdGhlIHByZXZpb3VzIHRleHR1cmUgbm9kZSBmb3IuXHJcblx0ICogQHJldHVybiB7VGV4dHVyZU5vZGV9IFRoZSBwcmV2aW91cyB0ZXh0dXJlIG5vZGUuXHJcblx0ICovXHJcblx0Z2V0UHJldmlvdXNUZXh0dXJlTm9kZSggbmFtZSA9ICdvdXRwdXQnICkge1xyXG5cclxuXHRcdGxldCB0ZXh0dXJlTm9kZSA9IHRoaXMuX3ByZXZpb3VzVGV4dHVyZU5vZGVzWyBuYW1lIF07XHJcblxyXG5cdFx0aWYgKCB0ZXh0dXJlTm9kZSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLl90ZXh0dXJlTm9kZXNbIG5hbWUgXSA9PT0gdW5kZWZpbmVkICkgdGhpcy5nZXRUZXh0dXJlTm9kZSggbmFtZSApO1xyXG5cclxuXHRcdFx0dGV4dHVyZU5vZGUgPSBub2RlT2JqZWN0KCBuZXcgUGFzc011bHRpcGxlVGV4dHVyZU5vZGUoIHRoaXMsIG5hbWUsIHRydWUgKSApO1xyXG5cdFx0XHR0ZXh0dXJlTm9kZS51cGRhdGVUZXh0dXJlKCk7XHJcblx0XHRcdHRoaXMuX3ByZXZpb3VzVGV4dHVyZU5vZGVzWyBuYW1lIF0gPSB0ZXh0dXJlTm9kZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRleHR1cmVOb2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSB2aWV3WiBub2RlIG9mIHRoaXMgcGFzcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZT0nZGVwdGgnXSAtIFRoZSBvdXRwdXQgbmFtZSB0byBnZXQgdGhlIHZpZXdaIG5vZGUgZm9yLiBJbiBtb3N0IGNhc2VzIHRoZSBkZWZhdWx0IGAnZGVwdGgnYCBjYW4gYmUgdXNlZCBob3dldmVyIHRoZSBwYXJhbWV0ZXIgZXhpc3RzIGZvciBjdXN0b20gZGVwdGggb3V0cHV0cy5cclxuXHQgKiBAcmV0dXJuIHtOb2RlfSBUaGUgdmlld1ogbm9kZS5cclxuXHQgKi9cclxuXHRnZXRWaWV3Wk5vZGUoIG5hbWUgPSAnZGVwdGgnICkge1xyXG5cclxuXHRcdGxldCB2aWV3Wk5vZGUgPSB0aGlzLl92aWV3Wk5vZGVzWyBuYW1lIF07XHJcblxyXG5cdFx0aWYgKCB2aWV3Wk5vZGUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGNhbWVyYU5lYXIgPSB0aGlzLl9jYW1lcmFOZWFyO1xyXG5cdFx0XHRjb25zdCBjYW1lcmFGYXIgPSB0aGlzLl9jYW1lcmFGYXI7XHJcblxyXG5cdFx0XHR0aGlzLl92aWV3Wk5vZGVzWyBuYW1lIF0gPSB2aWV3Wk5vZGUgPSBwZXJzcGVjdGl2ZURlcHRoVG9WaWV3WiggdGhpcy5nZXRUZXh0dXJlTm9kZSggbmFtZSApLCBjYW1lcmFOZWFyLCBjYW1lcmFGYXIgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHZpZXdaTm9kZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbGluZWFyIGRlcHRoIG5vZGUgb2YgdGhpcyBwYXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lPSdkZXB0aCddIC0gVGhlIG91dHB1dCBuYW1lIHRvIGdldCB0aGUgbGluZWFyIGRlcHRoIG5vZGUgZm9yLiBJbiBtb3N0IGNhc2VzIHRoZSBkZWZhdWx0IGAnZGVwdGgnYCBjYW4gYmUgdXNlZCBob3dldmVyIHRoZSBwYXJhbWV0ZXIgZXhpc3RzIGZvciBjdXN0b20gZGVwdGggb3V0cHV0cy5cclxuXHQgKiBAcmV0dXJuIHtOb2RlfSBUaGUgbGluZWFyIGRlcHRoIG5vZGUuXHJcblx0ICovXHJcblx0Z2V0TGluZWFyRGVwdGhOb2RlKCBuYW1lID0gJ2RlcHRoJyApIHtcclxuXHJcblx0XHRsZXQgbGluZWFyRGVwdGhOb2RlID0gdGhpcy5fbGluZWFyRGVwdGhOb2Rlc1sgbmFtZSBdO1xyXG5cclxuXHRcdGlmICggbGluZWFyRGVwdGhOb2RlID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBjYW1lcmFOZWFyID0gdGhpcy5fY2FtZXJhTmVhcjtcclxuXHRcdFx0Y29uc3QgY2FtZXJhRmFyID0gdGhpcy5fY2FtZXJhRmFyO1xyXG5cdFx0XHRjb25zdCB2aWV3Wk5vZGUgPSB0aGlzLmdldFZpZXdaTm9kZSggbmFtZSApO1xyXG5cclxuXHRcdFx0Ly8gVE9ETzoganVzdCBpZiAoIGJ1aWxkZXIuY2FtZXJhLmlzUGVyc3BlY3RpdmVDYW1lcmEgKVxyXG5cclxuXHRcdFx0dGhpcy5fbGluZWFyRGVwdGhOb2Rlc1sgbmFtZSBdID0gbGluZWFyRGVwdGhOb2RlID0gdmlld1pUb09ydGhvZ3JhcGhpY0RlcHRoKCB2aWV3Wk5vZGUsIGNhbWVyYU5lYXIsIGNhbWVyYUZhciApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbGluZWFyRGVwdGhOb2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdHNldHVwKCB7IHJlbmRlcmVyIH0gKSB7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXQuc2FtcGxlcyA9IHRoaXMub3B0aW9ucy5zYW1wbGVzID09PSB1bmRlZmluZWQgPyByZW5kZXJlci5zYW1wbGVzIDogdGhpcy5vcHRpb25zLnNhbXBsZXM7XHJcblxyXG5cdFx0Ly8gVE9ETzogRGlzYWJsZSBNU0FBIGZvciBXZWJHTCBiYWNrZW5kIGZvciBub3dcclxuXHRcdGlmICggcmVuZGVyZXIuYmFja2VuZC5pc1dlYkdMQmFja2VuZCA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdHRoaXMucmVuZGVyVGFyZ2V0LnNhbXBsZXMgPSAwO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnJlbmRlclRhcmdldC50ZXh0dXJlLnR5cGUgPSByZW5kZXJlci5nZXRDb2xvckJ1ZmZlclR5cGUoKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5zY29wZSA9PT0gUGFzc05vZGUuQ09MT1IgPyB0aGlzLmdldFRleHR1cmVOb2RlKCkgOiB0aGlzLmdldExpbmVhckRlcHRoTm9kZSgpO1xyXG5cclxuXHR9XHJcblxyXG5cdHVwZGF0ZUJlZm9yZSggZnJhbWUgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyByZW5kZXJlciB9ID0gZnJhbWU7XHJcblx0XHRjb25zdCB7IHNjZW5lIH0gPSB0aGlzO1xyXG5cclxuXHRcdGxldCBjYW1lcmE7XHJcblx0XHRsZXQgcGl4ZWxSYXRpbztcclxuXHJcblx0XHRjb25zdCBvdXRwdXRSZW5kZXJUYXJnZXQgPSByZW5kZXJlci5nZXRPdXRwdXRSZW5kZXJUYXJnZXQoKTtcclxuXHJcblx0XHRpZiAoIG91dHB1dFJlbmRlclRhcmdldCAmJiBvdXRwdXRSZW5kZXJUYXJnZXQuaXNYUlJlbmRlclRhcmdldCA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdHBpeGVsUmF0aW8gPSAxO1xyXG5cdFx0XHRjYW1lcmEgPSByZW5kZXJlci54ci5nZXRDYW1lcmEoKTtcclxuXHJcblx0XHRcdHJlbmRlcmVyLnhyLnVwZGF0ZUNhbWVyYSggY2FtZXJhICk7XHJcblxyXG5cdFx0XHRfc2l6ZS5zZXQoIG91dHB1dFJlbmRlclRhcmdldC53aWR0aCwgb3V0cHV0UmVuZGVyVGFyZ2V0LmhlaWdodCApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRjYW1lcmEgPSB0aGlzLmNhbWVyYTtcclxuXHRcdFx0cGl4ZWxSYXRpbyA9IHJlbmRlcmVyLmdldFBpeGVsUmF0aW8oKTtcclxuXHJcblx0XHRcdHJlbmRlcmVyLmdldFNpemUoIF9zaXplICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuX3BpeGVsUmF0aW8gPSBwaXhlbFJhdGlvO1xyXG5cclxuXHRcdHRoaXMuc2V0U2l6ZSggX3NpemUud2lkdGgsIF9zaXplLmhlaWdodCApO1xyXG5cclxuXHRcdGNvbnN0IGN1cnJlbnRSZW5kZXJUYXJnZXQgPSByZW5kZXJlci5nZXRSZW5kZXJUYXJnZXQoKTtcclxuXHRcdGNvbnN0IGN1cnJlbnRNUlQgPSByZW5kZXJlci5nZXRNUlQoKTtcclxuXHRcdGNvbnN0IGN1cnJlbnRNYXNrID0gY2FtZXJhLmxheWVycy5tYXNrO1xyXG5cclxuXHRcdHRoaXMuX2NhbWVyYU5lYXIudmFsdWUgPSBjYW1lcmEubmVhcjtcclxuXHRcdHRoaXMuX2NhbWVyYUZhci52YWx1ZSA9IGNhbWVyYS5mYXI7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9sYXllcnMgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRjYW1lcmEubGF5ZXJzLm1hc2sgPSB0aGlzLl9sYXllcnMubWFzaztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Zm9yICggY29uc3QgbmFtZSBpbiB0aGlzLl9wcmV2aW91c1RleHR1cmVzICkge1xyXG5cclxuXHRcdFx0dGhpcy50b2dnbGVUZXh0dXJlKCBuYW1lICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggdGhpcy5yZW5kZXJUYXJnZXQgKTtcclxuXHRcdHJlbmRlcmVyLnNldE1SVCggdGhpcy5fbXJ0ICk7XHJcblxyXG5cdFx0cmVuZGVyZXIucmVuZGVyKCBzY2VuZSwgY2FtZXJhICk7XHJcblxyXG5cdFx0cmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCBjdXJyZW50UmVuZGVyVGFyZ2V0ICk7XHJcblx0XHRyZW5kZXJlci5zZXRNUlQoIGN1cnJlbnRNUlQgKTtcclxuXHJcblx0XHRjYW1lcmEubGF5ZXJzLm1hc2sgPSBjdXJyZW50TWFzaztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBzaXplIG9mIHRoZSBwYXNzJ3MgcmVuZGVyIHRhcmdldC4gSG9ub3JzIHRoZSBwaXhlbCByYXRpby5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCB0byBzZXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgdG8gc2V0LlxyXG5cdCAqL1xyXG5cdHNldFNpemUoIHdpZHRoLCBoZWlnaHQgKSB7XHJcblxyXG5cdFx0dGhpcy5fd2lkdGggPSB3aWR0aDtcclxuXHRcdHRoaXMuX2hlaWdodCA9IGhlaWdodDtcclxuXHJcblx0XHRjb25zdCBlZmZlY3RpdmVXaWR0aCA9IHRoaXMuX3dpZHRoICogdGhpcy5fcGl4ZWxSYXRpbyAqIHRoaXMuX3Jlc29sdXRpb247XHJcblx0XHRjb25zdCBlZmZlY3RpdmVIZWlnaHQgPSB0aGlzLl9oZWlnaHQgKiB0aGlzLl9waXhlbFJhdGlvICogdGhpcy5fcmVzb2x1dGlvbjtcclxuXHJcblx0XHR0aGlzLnJlbmRlclRhcmdldC5zZXRTaXplKCBlZmZlY3RpdmVXaWR0aCwgZWZmZWN0aXZlSGVpZ2h0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgcGl4ZWwgcmF0aW8gdGhlIHBhc3MncyByZW5kZXIgdGFyZ2V0IGFuZCB1cGRhdGVzIHRoZSBzaXplLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHBpeGVsUmF0aW8gLSBUaGUgcGl4ZWwgcmF0aW8gdG8gc2V0LlxyXG5cdCAqL1xyXG5cdHNldFBpeGVsUmF0aW8oIHBpeGVsUmF0aW8gKSB7XHJcblxyXG5cdFx0dGhpcy5fcGl4ZWxSYXRpbyA9IHBpeGVsUmF0aW87XHJcblxyXG5cdFx0dGhpcy5zZXRTaXplKCB0aGlzLl93aWR0aCwgdGhpcy5faGVpZ2h0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRnJlZXMgaW50ZXJuYWwgcmVzb3VyY2VzLiBTaG91bGQgYmUgY2FsbGVkIHdoZW4gdGhlIG5vZGUgaXMgbm8gbG9uZ2VyIGluIHVzZS5cclxuXHQgKi9cclxuXHRkaXNwb3NlKCkge1xyXG5cclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0LmRpc3Bvc2UoKTtcclxuXHJcblx0fVxyXG5cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAc3RhdGljXHJcbiAqIEB0eXBlIHsnY29sb3InfVxyXG4gKiBAZGVmYXVsdCAnY29sb3InXHJcbiAqL1xyXG5QYXNzTm9kZS5DT0xPUiA9ICdjb2xvcic7XHJcblxyXG4vKipcclxuICogQHN0YXRpY1xyXG4gKiBAdHlwZSB7J2RlcHRoJ31cclxuICogQGRlZmF1bHQgJ2RlcHRoJ1xyXG4gKi9cclxuUGFzc05vZGUuREVQVEggPSAnZGVwdGgnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgUGFzc05vZGU7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIHBhc3Mgbm9kZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtTY2VuZX0gc2NlbmUgLSBBIHJlZmVyZW5jZSB0byB0aGUgc2NlbmUuXHJcbiAqIEBwYXJhbSB7Q2FtZXJhfSBjYW1lcmEgLSBBIHJlZmVyZW5jZSB0byB0aGUgY2FtZXJhLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIHRoZSBpbnRlcm5hbCByZW5kZXIgdGFyZ2V0LlxyXG4gKiBAcmV0dXJucyB7UGFzc05vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcGFzcyA9ICggc2NlbmUsIGNhbWVyYSwgb3B0aW9ucyApID0+IG5vZGVPYmplY3QoIG5ldyBQYXNzTm9kZSggUGFzc05vZGUuQ09MT1IsIHNjZW5lLCBjYW1lcmEsIG9wdGlvbnMgKSApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSBwYXNzIHRleHR1cmUgbm9kZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtQYXNzTm9kZX0gcGFzcyAtIFRoZSBwYXNzIG5vZGUuXHJcbiAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSBvdXRwdXQgdGV4dHVyZS5cclxuICogQHJldHVybnMge1Bhc3NUZXh0dXJlTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBwYXNzVGV4dHVyZSA9ICggcGFzcywgdGV4dHVyZSApID0+IG5vZGVPYmplY3QoIG5ldyBQYXNzVGV4dHVyZU5vZGUoIHBhc3MsIHRleHR1cmUgKSApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSBkZXB0aCBwYXNzIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7U2NlbmV9IHNjZW5lIC0gQSByZWZlcmVuY2UgdG8gdGhlIHNjZW5lLlxyXG4gKiBAcGFyYW0ge0NhbWVyYX0gY2FtZXJhIC0gQSByZWZlcmVuY2UgdG8gdGhlIGNhbWVyYS5cclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBPcHRpb25zIGZvciB0aGUgaW50ZXJuYWwgcmVuZGVyIHRhcmdldC5cclxuICogQHJldHVybnMge1Bhc3NOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGRlcHRoUGFzcyA9ICggc2NlbmUsIGNhbWVyYSwgb3B0aW9ucyApID0+IG5vZGVPYmplY3QoIG5ldyBQYXNzTm9kZSggUGFzc05vZGUuREVQVEgsIHNjZW5lLCBjYW1lcmEsIG9wdGlvbnMgKSApO1xyXG4iLCJpbXBvcnQgeyBmbG9hdCwgbm9kZU9iamVjdCwgbm9ybWFsaXplLCB2ZWM0IH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5pbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uLy4uL21hdGgvQ29sb3IuanMnO1xyXG5pbXBvcnQgTm9kZU1hdGVyaWFsIGZyb20gJy4uLy4uL21hdGVyaWFscy9ub2Rlcy9Ob2RlTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyBjYW1lcmFQcm9qZWN0aW9uTWF0cml4IH0gZnJvbSAnLi4vLi4vbm9kZXMvYWNjZXNzb3JzL0NhbWVyYS5qcyc7XHJcbmltcG9ydCB7IG1vZGVsVmlld01hdHJpeCB9IGZyb20gJy4uLy4uL25vZGVzL2FjY2Vzc29ycy9Nb2RlbE5vZGUuanMnO1xyXG5pbXBvcnQgeyBwb3NpdGlvbkxvY2FsIH0gZnJvbSAnLi4vLi4vbm9kZXMvYWNjZXNzb3JzL1Bvc2l0aW9uLmpzJztcclxuaW1wb3J0IHsgbm9ybWFsTG9jYWwgfSBmcm9tICcuLi8uLi9ub2Rlcy9hY2Nlc3NvcnMvTm9ybWFsLmpzJztcclxuaW1wb3J0IHsgQmFja1NpZGUgfSBmcm9tICcuLi8uLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgUGFzc05vZGUgZnJvbSAnLi9QYXNzTm9kZS5qcyc7XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyBhIHJlbmRlciBwYXNzIGZvciBwcm9kdWNpbmcgYSB0b29uIG91dGxpbmUgZWZmZWN0IG9uIGNvbXBhdGlibGUgb2JqZWN0cy5cclxuICogT25seSAzRCBvYmplY3RzIHdpdGggbWF0ZXJpYWxzIG9mIHR5cGUgYE1lc2hUb29uTWF0ZXJpYWxgIGFuZCBgTWVzaFRvb25Ob2RlTWF0ZXJpYWxgXHJcbiAqIHdpbGwgcmVjZWl2ZSB0aGUgb3V0bGluZS5cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgcG9zdFByb2Nlc3NpbmcgPSBuZXcgUG9zdFByb2Nlc3NpbmcoIHJlbmRlcmVyICk7XHJcbiAqXHJcbiAqIGNvbnN0IHNjZW5lUGFzcyA9IHRvb25PdXRsaW5lUGFzcyggc2NlbmUsIGNhbWVyYSApO1xyXG4gKlxyXG4gKiBwb3N0UHJvY2Vzc2luZy5vdXRwdXROb2RlID0gc2NlbmVQYXNzO1xyXG4gKiBgYGBcclxuICogQGF1Z21lbnRzIFBhc3NOb2RlXHJcbiAqL1xyXG5jbGFzcyBUb29uT3V0bGluZVBhc3NOb2RlIGV4dGVuZHMgUGFzc05vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdUb29uT3V0bGluZVBhc3NOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG91dGxpbmUgcGFzcyBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTY2VuZX0gc2NlbmUgLSBBIHJlZmVyZW5jZSB0byB0aGUgc2NlbmUuXHJcblx0ICogQHBhcmFtIHtDYW1lcmF9IGNhbWVyYSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBjYW1lcmEuXHJcblx0ICogQHBhcmFtIHtOb2RlfSBjb2xvck5vZGUgLSBEZWZpbmVzIHRoZSBvdXRsaW5lJ3MgY29sb3IuXHJcblx0ICogQHBhcmFtIHtOb2RlfSB0aGlja25lc3NOb2RlIC0gRGVmaW5lcyB0aGUgb3V0bGluZSdzIHRoaWNrbmVzcy5cclxuXHQgKiBAcGFyYW0ge05vZGV9IGFscGhhTm9kZSAtIERlZmluZXMgdGhlIG91dGxpbmUncyBhbHBoYS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggc2NlbmUsIGNhbWVyYSwgY29sb3JOb2RlLCB0aGlja25lc3NOb2RlLCBhbHBoYU5vZGUgKSB7XHJcblxyXG5cdFx0c3VwZXIoIFBhc3NOb2RlLkNPTE9SLCBzY2VuZSwgY2FtZXJhICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEZWZpbmVzIHRoZSBvdXRsaW5lJ3MgY29sb3IuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29sb3JOb2RlID0gY29sb3JOb2RlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyB0aGUgb3V0bGluZSdzIHRoaWNrbmVzcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50aGlja25lc3NOb2RlID0gdGhpY2tuZXNzTm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgdGhlIG91dGxpbmUncyBhbHBoYS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hbHBoYU5vZGUgPSBhbHBoYU5vZGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBpbnRlcm5hbCBtYXRlcmlhbCBjYWNoZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge1dlYWtNYXA8TWF0ZXJpYWwsIE5vZGVNYXRlcmlhbD59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX21hdGVyaWFsQ2FjaGUgPSBuZXcgV2Vha01hcCgpO1xyXG5cclxuXHR9XHJcblxyXG5cdHVwZGF0ZUJlZm9yZSggZnJhbWUgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyByZW5kZXJlciB9ID0gZnJhbWU7XHJcblxyXG5cdFx0Y29uc3QgY3VycmVudFJlbmRlck9iamVjdEZ1bmN0aW9uID0gcmVuZGVyZXIuZ2V0UmVuZGVyT2JqZWN0RnVuY3Rpb24oKTtcclxuXHJcblx0XHRyZW5kZXJlci5zZXRSZW5kZXJPYmplY3RGdW5jdGlvbiggKCBvYmplY3QsIHNjZW5lLCBjYW1lcmEsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXAsIGxpZ2h0c05vZGUsIGNsaXBwaW5nQ29udGV4dCApID0+IHtcclxuXHJcblx0XHRcdC8vIG9ubHkgcmVuZGVyIG91dGxpbmUgZm9yIHN1cHBvcnRlZCBtYXRlcmlhbHNcclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWwuaXNNZXNoVG9vbk1hdGVyaWFsIHx8IG1hdGVyaWFsLmlzTWVzaFRvb25Ob2RlTWF0ZXJpYWwgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggbWF0ZXJpYWwud2lyZWZyYW1lID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBvdXRsaW5lTWF0ZXJpYWwgPSB0aGlzLl9nZXRPdXRsaW5lTWF0ZXJpYWwoIG1hdGVyaWFsICk7XHJcblx0XHRcdFx0XHRyZW5kZXJlci5yZW5kZXJPYmplY3QoIG9iamVjdCwgc2NlbmUsIGNhbWVyYSwgZ2VvbWV0cnksIG91dGxpbmVNYXRlcmlhbCwgZ3JvdXAsIGxpZ2h0c05vZGUsIGNsaXBwaW5nQ29udGV4dCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBkZWZhdWx0XHJcblxyXG5cdFx0XHRyZW5kZXJlci5yZW5kZXJPYmplY3QoIG9iamVjdCwgc2NlbmUsIGNhbWVyYSwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cCwgbGlnaHRzTm9kZSwgY2xpcHBpbmdDb250ZXh0ICk7XHJcblxyXG5cdFx0fSApO1xyXG5cclxuXHRcdHN1cGVyLnVwZGF0ZUJlZm9yZSggZnJhbWUgKTtcclxuXHJcblx0XHRyZW5kZXJlci5zZXRSZW5kZXJPYmplY3RGdW5jdGlvbiggY3VycmVudFJlbmRlck9iamVjdEZ1bmN0aW9uICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyB0aGUgbWF0ZXJpYWwgdXNlZCBmb3Igb3V0bGluZSByZW5kZXJpbmcuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEByZXR1cm4ge05vZGVNYXRlcmlhbH0gVGhlIG91dGxpbmUgbWF0ZXJpYWwuXHJcblx0ICovXHJcblx0X2NyZWF0ZU1hdGVyaWFsKCkge1xyXG5cclxuXHRcdGNvbnN0IG1hdGVyaWFsID0gbmV3IE5vZGVNYXRlcmlhbCgpO1xyXG5cdFx0bWF0ZXJpYWwuaXNNZXNoVG9vbk91dGxpbmVNYXRlcmlhbCA9IHRydWU7XHJcblx0XHRtYXRlcmlhbC5uYW1lID0gJ1Rvb25fT3V0bGluZSc7XHJcblx0XHRtYXRlcmlhbC5zaWRlID0gQmFja1NpZGU7XHJcblxyXG5cdFx0Ly8gdmVydGV4IG5vZGVcclxuXHJcblx0XHRjb25zdCBvdXRsaW5lTm9ybWFsID0gbm9ybWFsTG9jYWwubmVnYXRlKCk7XHJcblx0XHRjb25zdCBtdnAgPSBjYW1lcmFQcm9qZWN0aW9uTWF0cml4Lm11bCggbW9kZWxWaWV3TWF0cml4ICk7XHJcblxyXG5cdFx0Y29uc3QgcmF0aW8gPSBmbG9hdCggMS4wICk7IC8vIFRPRE86IHN1cHBvcnQgb3V0bGluZSB0aGlja25lc3MgcmF0aW8gZm9yIGVhY2ggdmVydGV4XHJcblx0XHRjb25zdCBwb3MgPSBtdnAubXVsKCB2ZWM0KCBwb3NpdGlvbkxvY2FsLCAxLjAgKSApO1xyXG5cdFx0Y29uc3QgcG9zMiA9IG12cC5tdWwoIHZlYzQoIHBvc2l0aW9uTG9jYWwuYWRkKCBvdXRsaW5lTm9ybWFsICksIDEuMCApICk7XHJcblx0XHRjb25zdCBub3JtID0gbm9ybWFsaXplKCBwb3Muc3ViKCBwb3MyICkgKTsgLy8gTk9URTogc3VidHJhY3QgcG9zMiBmcm9tIHBvcyBiZWNhdXNlIEJhY2tTaWRlIG9iamVjdE5vcm1hbCBpcyBuZWdhdGl2ZVxyXG5cclxuXHRcdG1hdGVyaWFsLnZlcnRleE5vZGUgPSBwb3MuYWRkKCBub3JtLm11bCggdGhpcy50aGlja25lc3NOb2RlICkubXVsKCBwb3MudyApLm11bCggcmF0aW8gKSApO1xyXG5cclxuXHRcdC8vIGNvbG9yIG5vZGVcclxuXHJcblx0XHRtYXRlcmlhbC5jb2xvck5vZGUgPSB2ZWM0KCB0aGlzLmNvbG9yTm9kZSwgdGhpcy5hbHBoYU5vZGUgKTtcclxuXHJcblx0XHRyZXR1cm4gbWF0ZXJpYWw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRm9yIHRoZSBnaXZlbiB0b29uIG1hdGVyaWFsLCB0aGlzIG1ldGhvZCByZXR1cm5zIGEgY29ycmVzcG9uZGluZ1xyXG5cdCAqIG91dGxpbmUgbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7KE1lc2hUb29uTWF0ZXJpYWx8TWVzaFRvb25Ob2RlTWF0ZXJpYWwpfSBvcmlnaW5hbE1hdGVyaWFsIC0gVGhlIHRvb24gbWF0ZXJpYWwuXHJcblx0ICogQHJldHVybiB7Tm9kZU1hdGVyaWFsfSBUaGUgb3V0bGluZSBtYXRlcmlhbC5cclxuXHQgKi9cclxuXHRfZ2V0T3V0bGluZU1hdGVyaWFsKCBvcmlnaW5hbE1hdGVyaWFsICkge1xyXG5cclxuXHRcdGxldCBvdXRsaW5lTWF0ZXJpYWwgPSB0aGlzLl9tYXRlcmlhbENhY2hlLmdldCggb3JpZ2luYWxNYXRlcmlhbCApO1xyXG5cclxuXHRcdGlmICggb3V0bGluZU1hdGVyaWFsID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRvdXRsaW5lTWF0ZXJpYWwgPSB0aGlzLl9jcmVhdGVNYXRlcmlhbCgpO1xyXG5cclxuXHRcdFx0dGhpcy5fbWF0ZXJpYWxDYWNoZS5zZXQoIG9yaWdpbmFsTWF0ZXJpYWwsIG91dGxpbmVNYXRlcmlhbCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gb3V0bGluZU1hdGVyaWFsO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBUb29uT3V0bGluZVBhc3NOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSB0b29uIG91dGxpbmUgcGFzcyBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge1NjZW5lfSBzY2VuZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBzY2VuZS5cclxuICogQHBhcmFtIHtDYW1lcmF9IGNhbWVyYSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBjYW1lcmEuXHJcbiAqIEBwYXJhbSB7Q29sb3J9IGNvbG9yIC0gRGVmaW5lcyB0aGUgb3V0bGluZSdzIGNvbG9yLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3RoaWNrbmVzcz0wLjAwM10gLSBEZWZpbmVzIHRoZSBvdXRsaW5lJ3MgdGhpY2tuZXNzLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW2FscGhhPTFdIC0gRGVmaW5lcyB0aGUgb3V0bGluZSdzIGFscGhhLlxyXG4gKiBAcmV0dXJucyB7VG9vbk91dGxpbmVQYXNzTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCB0b29uT3V0bGluZVBhc3MgPSAoIHNjZW5lLCBjYW1lcmEsIGNvbG9yID0gbmV3IENvbG9yKCAwLCAwLCAwICksIHRoaWNrbmVzcyA9IDAuMDAzLCBhbHBoYSA9IDEgKSA9PiBub2RlT2JqZWN0KCBuZXcgVG9vbk91dGxpbmVQYXNzTm9kZSggc2NlbmUsIGNhbWVyYSwgbm9kZU9iamVjdCggY29sb3IgKSwgbm9kZU9iamVjdCggdGhpY2tuZXNzICksIG5vZGVPYmplY3QoIGFscGhhICkgKSApO1xyXG4iLCJpbXBvcnQgeyBGbiwgZmxvYXQsIG1hdDMsIHZlYzMsIElmIH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5pbXBvcnQgeyBzZWxlY3QgfSBmcm9tICcuLi9tYXRoL0NvbmRpdGlvbmFsTm9kZS5qcyc7XHJcbmltcG9ydCB7IGNsYW1wLCBsb2cyLCBtYXgsIG1pbiwgcG93LCBtaXggfSBmcm9tICcuLi9tYXRoL01hdGhOb2RlLmpzJztcclxuaW1wb3J0IHsgbXVsLCBzdWIsIGRpdiB9IGZyb20gJy4uL21hdGgvT3BlcmF0b3JOb2RlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBMaW5lYXIgdG9uZSBtYXBwaW5nLCBleHBvc3VyZSBvbmx5LlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGU8dmVjMz59IGNvbG9yIC0gVGhlIGNvbG9yIHRoYXQgc2hvdWxkIGJlIHRvbmUgbWFwcGVkLlxyXG4gKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSBleHBvc3VyZSAtIFRoZSBleHBvc3VyZS5cclxuICogQHJldHVybiB7Tm9kZTx2ZWMzPn0gVGhlIHRvbmUgbWFwcGVkIGNvbG9yLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGxpbmVhclRvbmVNYXBwaW5nID0gLypAX19QVVJFX18qLyBGbiggKCBbIGNvbG9yLCBleHBvc3VyZSBdICkgPT4ge1xyXG5cclxuXHRyZXR1cm4gY29sb3IubXVsKCBleHBvc3VyZSApLmNsYW1wKCk7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ2xpbmVhclRvbmVNYXBwaW5nJyxcclxuXHR0eXBlOiAndmVjMycsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICdjb2xvcicsIHR5cGU6ICd2ZWMzJyB9LFxyXG5cdFx0eyBuYW1lOiAnZXhwb3N1cmUnLCB0eXBlOiAnZmxvYXQnIH1cclxuXHRdXHJcbn0gKTtcclxuXHJcbi8qKlxyXG4gKiBSZWluaGFyZCB0b25lIG1hcHBpbmcuXHJcbiAqXHJcbiAqIFJlZmVyZW5jZToge0BsaW5rIGh0dHBzOi8vd3d3LmNzLnV0YWguZWR1L2RvY3MvdGVjaHJlcG9ydHMvMjAwMi9wZGYvVVVDUy0wMi0wMDEucGRmfVxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGU8dmVjMz59IGNvbG9yIC0gVGhlIGNvbG9yIHRoYXQgc2hvdWxkIGJlIHRvbmUgbWFwcGVkLlxyXG4gKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSBleHBvc3VyZSAtIFRoZSBleHBvc3VyZS5cclxuICogQHJldHVybiB7Tm9kZTx2ZWMzPn0gVGhlIHRvbmUgbWFwcGVkIGNvbG9yLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHJlaW5oYXJkVG9uZU1hcHBpbmcgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgY29sb3IsIGV4cG9zdXJlIF0gKSA9PiB7XHJcblxyXG5cdGNvbG9yID0gY29sb3IubXVsKCBleHBvc3VyZSApO1xyXG5cclxuXHRyZXR1cm4gY29sb3IuZGl2KCBjb2xvci5hZGQoIDEuMCApICkuY2xhbXAoKTtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAncmVpbmhhcmRUb25lTWFwcGluZycsXHJcblx0dHlwZTogJ3ZlYzMnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAnY29sb3InLCB0eXBlOiAndmVjMycgfSxcclxuXHRcdHsgbmFtZTogJ2V4cG9zdXJlJywgdHlwZTogJ2Zsb2F0JyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG4vKipcclxuICogQ2luZW9uIHRvbmUgbWFwcGluZy5cclxuICpcclxuICogUmVmZXJlbmNlOiB7QGxpbmsgaHR0cDovL2ZpbG1pY3dvcmxkcy5jb20vYmxvZy9maWxtaWMtdG9uZW1hcHBpbmctb3BlcmF0b3JzL31cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlPHZlYzM+fSBjb2xvciAtIFRoZSBjb2xvciB0aGF0IHNob3VsZCBiZSB0b25lIG1hcHBlZC5cclxuICogQHBhcmFtIHtOb2RlPGZsb2F0Pn0gZXhwb3N1cmUgLSBUaGUgZXhwb3N1cmUuXHJcbiAqIEByZXR1cm4ge05vZGU8dmVjMz59IFRoZSB0b25lIG1hcHBlZCBjb2xvci5cclxuICovXHJcbmV4cG9ydCBjb25zdCBjaW5lb25Ub25lTWFwcGluZyA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyBjb2xvciwgZXhwb3N1cmUgXSApID0+IHtcclxuXHJcblx0Ly8gZmlsbWljIG9wZXJhdG9yIGJ5IEppbSBIZWpsIGFuZCBSaWNoYXJkIEJ1cmdlc3MtRGF3c29uXHJcblx0Y29sb3IgPSBjb2xvci5tdWwoIGV4cG9zdXJlICk7XHJcblx0Y29sb3IgPSBjb2xvci5zdWIoIDAuMDA0ICkubWF4KCAwLjAgKTtcclxuXHJcblx0Y29uc3QgYSA9IGNvbG9yLm11bCggY29sb3IubXVsKCA2LjIgKS5hZGQoIDAuNSApICk7XHJcblx0Y29uc3QgYiA9IGNvbG9yLm11bCggY29sb3IubXVsKCA2LjIgKS5hZGQoIDEuNyApICkuYWRkKCAwLjA2ICk7XHJcblxyXG5cdHJldHVybiBhLmRpdiggYiApLnBvdyggMi4yICk7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ2NpbmVvblRvbmVNYXBwaW5nJyxcclxuXHR0eXBlOiAndmVjMycsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICdjb2xvcicsIHR5cGU6ICd2ZWMzJyB9LFxyXG5cdFx0eyBuYW1lOiAnZXhwb3N1cmUnLCB0eXBlOiAnZmxvYXQnIH1cclxuXHRdXHJcbn0gKTtcclxuXHJcbi8vIHNvdXJjZTogaHR0cHM6Ly9naXRodWIuY29tL3NlbGZzaGFkb3cvbHRjX2NvZGUvYmxvYi9tYXN0ZXIvd2ViZ2wvc2hhZGVycy9sdGMvbHRjX2JsaXQuZnNcclxuXHJcbmNvbnN0IFJSVEFuZE9EVEZpdCA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyBjb2xvciBdICkgPT4ge1xyXG5cclxuXHRjb25zdCBhID0gY29sb3IubXVsKCBjb2xvci5hZGQoIDAuMDI0NTc4NiApICkuc3ViKCAwLjAwMDA5MDUzNyApO1xyXG5cdGNvbnN0IGIgPSBjb2xvci5tdWwoIGNvbG9yLmFkZCggMC40MzI5NTEwICkubXVsKCAwLjk4MzcyOSApICkuYWRkKCAwLjIzODA4MSApO1xyXG5cclxuXHRyZXR1cm4gYS5kaXYoIGIgKTtcclxuXHJcbn0gKTtcclxuXHJcbi8qKlxyXG4gKiBBQ0VTRmlsbWljIHRvbmUgbWFwcGluZy5cclxuICpcclxuICogUmVmZXJlbmNlOiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL3NlbGZzaGFkb3cvbHRjX2NvZGUvYmxvYi9tYXN0ZXIvd2ViZ2wvc2hhZGVycy9sdGMvbHRjX2JsaXQuZnN9XHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMzPn0gY29sb3IgLSBUaGUgY29sb3IgdGhhdCBzaG91bGQgYmUgdG9uZSBtYXBwZWQuXHJcbiAqIEBwYXJhbSB7Tm9kZTxmbG9hdD59IGV4cG9zdXJlIC0gVGhlIGV4cG9zdXJlLlxyXG4gKiBAcmV0dXJuIHtOb2RlPHZlYzM+fSBUaGUgdG9uZSBtYXBwZWQgY29sb3IuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYWNlc0ZpbG1pY1RvbmVNYXBwaW5nID0gLypAX19QVVJFX18qLyBGbiggKCBbIGNvbG9yLCBleHBvc3VyZSBdICkgPT4ge1xyXG5cclxuXHQvLyBzUkdCID0+IFhZWiA9PiBENjVfMl9ENjAgPT4gQVAxID0+IFJSVF9TQVRcclxuXHRjb25zdCBBQ0VTSW5wdXRNYXQgPSBtYXQzKFxyXG5cdFx0MC41OTcxOSwgMC4zNTQ1OCwgMC4wNDgyMyxcclxuXHRcdDAuMDc2MDAsIDAuOTA4MzQsIDAuMDE1NjYsXHJcblx0XHQwLjAyODQwLCAwLjEzMzgzLCAwLjgzNzc3XHJcblx0KTtcclxuXHJcblx0Ly8gT0RUX1NBVCA9PiBYWVogPT4gRDYwXzJfRDY1ID0+IHNSR0JcclxuXHRjb25zdCBBQ0VTT3V0cHV0TWF0ID0gbWF0MyhcclxuXHRcdDEuNjA0NzUsIC0gMC41MzEwOCwgLSAwLjA3MzY3LFxyXG5cdFx0LSAwLjEwMjA4LCAxLjEwODEzLCAtIDAuMDA2MDUsXHJcblx0XHQtIDAuMDAzMjcsIC0gMC4wNzI3NiwgMS4wNzYwMlxyXG5cdCk7XHJcblxyXG5cdGNvbG9yID0gY29sb3IubXVsKCBleHBvc3VyZSApLmRpdiggMC42ICk7XHJcblxyXG5cdGNvbG9yID0gQUNFU0lucHV0TWF0Lm11bCggY29sb3IgKTtcclxuXHJcblx0Ly8gQXBwbHkgUlJUIGFuZCBPRFRcclxuXHRjb2xvciA9IFJSVEFuZE9EVEZpdCggY29sb3IgKTtcclxuXHJcblx0Y29sb3IgPSBBQ0VTT3V0cHV0TWF0Lm11bCggY29sb3IgKTtcclxuXHJcblx0Ly8gQ2xhbXAgdG8gWzAsIDFdXHJcblx0cmV0dXJuIGNvbG9yLmNsYW1wKCk7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ2FjZXNGaWxtaWNUb25lTWFwcGluZycsXHJcblx0dHlwZTogJ3ZlYzMnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAnY29sb3InLCB0eXBlOiAndmVjMycgfSxcclxuXHRcdHsgbmFtZTogJ2V4cG9zdXJlJywgdHlwZTogJ2Zsb2F0JyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5jb25zdCBMSU5FQVJfUkVDMjAyMF9UT19MSU5FQVJfU1JHQiA9IC8qQF9fUFVSRV9fKi8gbWF0MyggdmVjMyggMS42NjA1LCAtIDAuMTI0NiwgLSAwLjAxODIgKSwgdmVjMyggLSAwLjU4NzYsIDEuMTMyOSwgLSAwLjEwMDYgKSwgdmVjMyggLSAwLjA3MjgsIC0gMC4wMDgzLCAxLjExODcgKSApO1xyXG5jb25zdCBMSU5FQVJfU1JHQl9UT19MSU5FQVJfUkVDMjAyMCA9IC8qQF9fUFVSRV9fKi8gbWF0MyggdmVjMyggMC42Mjc0LCAwLjA2OTEsIDAuMDE2NCApLCB2ZWMzKCAwLjMyOTMsIDAuOTE5NSwgMC4wODgwICksIHZlYzMoIDAuMDQzMywgMC4wMTEzLCAwLjg5NTYgKSApO1xyXG5cclxuY29uc3QgYWd4RGVmYXVsdENvbnRyYXN0QXBwcm94ID0gLypAX19QVVJFX18qLyBGbiggKCBbIHhfaW1tdXRhYmxlIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IHggPSB2ZWMzKCB4X2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgeDIgPSB2ZWMzKCB4Lm11bCggeCApICkudG9WYXIoKTtcclxuXHRjb25zdCB4NCA9IHZlYzMoIHgyLm11bCggeDIgKSApLnRvVmFyKCk7XHJcblxyXG5cdHJldHVybiBmbG9hdCggMTUuNSApLm11bCggeDQubXVsKCB4MiApICkuc3ViKCBtdWwoIDQwLjE0LCB4NC5tdWwoIHggKSApICkuYWRkKCBtdWwoIDMxLjk2LCB4NCApLnN1YiggbXVsKCA2Ljg2OCwgeDIubXVsKCB4ICkgKSApLmFkZCggbXVsKCAwLjQyOTgsIHgyICkuYWRkKCBtdWwoIDAuMTE5MSwgeCApLnN1YiggMC4wMDIzMiApICkgKSApO1xyXG5cclxufSApO1xyXG5cclxuLyoqXHJcbiAqIEFnWCB0b25lIG1hcHBpbmcuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMzPn0gY29sb3IgLSBUaGUgY29sb3IgdGhhdCBzaG91bGQgYmUgdG9uZSBtYXBwZWQuXHJcbiAqIEBwYXJhbSB7Tm9kZTxmbG9hdD59IGV4cG9zdXJlIC0gVGhlIGV4cG9zdXJlLlxyXG4gKiBAcmV0dXJuIHtOb2RlPHZlYzM+fSBUaGUgdG9uZSBtYXBwZWQgY29sb3IuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYWd4VG9uZU1hcHBpbmcgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgY29sb3IsIGV4cG9zdXJlIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IGNvbG9ydG9uZSA9IHZlYzMoIGNvbG9yICkudG9WYXIoKTtcclxuXHRjb25zdCBBZ1hJbnNldE1hdHJpeCA9IG1hdDMoIHZlYzMoIDAuODU2NjI3MTUzMzE1OTgzLCAwLjEzNzMxODk3MjkyOTg0NywgMC4xMTE4OTgyMTI5OTk5NSApLCB2ZWMzKCAwLjA5NTEyMTI0MDUzODE1ODgsIDAuNzYxMjQxOTkwNjAyNTkxLCAwLjA3Njc5OTQxODYwMzE5MDMgKSwgdmVjMyggMC4wNDgyNTE2MDYxNDU4NTgzLCAwLjEwMTQzOTAzNjQ2NzU2MiwgMC44MTEzMDIzNjgzOTY4NTkgKSApO1xyXG5cdGNvbnN0IEFnWE91dHNldE1hdHJpeCA9IG1hdDMoIHZlYzMoIDEuMTI3MTAwNTgxODE0NDM2OCwgLSAwLjE0MTMyOTc2MzQ5ODQzODMsIC0gMC4xNDEzMjk3NjM0OTg0MzgyNiApLCB2ZWMzKCAtIDAuMTEwNjA2NjQzMDk2NjAzMjMsIDEuMTU3ODIzNzAyMjE2MjcyLCAtIDAuMTEwNjA2NjQzMDk2NjAyOTQgKSwgdmVjMyggLSAwLjAxNjQ5MzkzODcxNzgzNDU3MywgLSAwLjAxNjQ5MzkzODcxNzgzNDI1NywgMS4yNTE5MzY0MDY1OTUwNDA1ICkgKTtcclxuXHRjb25zdCBBZ3hNaW5FdiA9IGZsb2F0KCAtIDEyLjQ3MzkzICk7XHJcblx0Y29uc3QgQWd4TWF4RXYgPSBmbG9hdCggNC4wMjYwNjkgKTtcclxuXHRjb2xvcnRvbmUubXVsQXNzaWduKCBleHBvc3VyZSApO1xyXG5cdGNvbG9ydG9uZS5hc3NpZ24oIExJTkVBUl9TUkdCX1RPX0xJTkVBUl9SRUMyMDIwLm11bCggY29sb3J0b25lICkgKTtcclxuXHRjb2xvcnRvbmUuYXNzaWduKCBBZ1hJbnNldE1hdHJpeC5tdWwoIGNvbG9ydG9uZSApICk7XHJcblx0Y29sb3J0b25lLmFzc2lnbiggbWF4KCBjb2xvcnRvbmUsIDFlLTEwICkgKTtcclxuXHRjb2xvcnRvbmUuYXNzaWduKCBsb2cyKCBjb2xvcnRvbmUgKSApO1xyXG5cdGNvbG9ydG9uZS5hc3NpZ24oIGNvbG9ydG9uZS5zdWIoIEFneE1pbkV2ICkuZGl2KCBBZ3hNYXhFdi5zdWIoIEFneE1pbkV2ICkgKSApO1xyXG5cdGNvbG9ydG9uZS5hc3NpZ24oIGNsYW1wKCBjb2xvcnRvbmUsIDAuMCwgMS4wICkgKTtcclxuXHRjb2xvcnRvbmUuYXNzaWduKCBhZ3hEZWZhdWx0Q29udHJhc3RBcHByb3goIGNvbG9ydG9uZSApICk7XHJcblx0Y29sb3J0b25lLmFzc2lnbiggQWdYT3V0c2V0TWF0cml4Lm11bCggY29sb3J0b25lICkgKTtcclxuXHRjb2xvcnRvbmUuYXNzaWduKCBwb3coIG1heCggdmVjMyggMC4wICksIGNvbG9ydG9uZSApLCB2ZWMzKCAyLjIgKSApICk7XHJcblx0Y29sb3J0b25lLmFzc2lnbiggTElORUFSX1JFQzIwMjBfVE9fTElORUFSX1NSR0IubXVsKCBjb2xvcnRvbmUgKSApO1xyXG5cdGNvbG9ydG9uZS5hc3NpZ24oIGNsYW1wKCBjb2xvcnRvbmUsIDAuMCwgMS4wICkgKTtcclxuXHJcblx0cmV0dXJuIGNvbG9ydG9uZTtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnYWd4VG9uZU1hcHBpbmcnLFxyXG5cdHR5cGU6ICd2ZWMzJyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ2NvbG9yJywgdHlwZTogJ3ZlYzMnIH0sXHJcblx0XHR7IG5hbWU6ICdleHBvc3VyZScsIHR5cGU6ICdmbG9hdCcgfVxyXG5cdF1cclxufSApO1xyXG5cclxuLyoqXHJcbiAqIE5ldXRyYWwgdG9uZSBtYXBwaW5nLlxyXG4gKlxyXG4gKiBSZWZlcmVuY2U6IHtAbGluayBodHRwczovL21vZGVsdmlld2VyLmRldi9leGFtcGxlcy90b25lLW1hcHBpbmd9XHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMzPn0gY29sb3IgLSBUaGUgY29sb3IgdGhhdCBzaG91bGQgYmUgdG9uZSBtYXBwZWQuXHJcbiAqIEBwYXJhbSB7Tm9kZTxmbG9hdD59IGV4cG9zdXJlIC0gVGhlIGV4cG9zdXJlLlxyXG4gKiBAcmV0dXJuIHtOb2RlPHZlYzM+fSBUaGUgdG9uZSBtYXBwZWQgY29sb3IuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbmV1dHJhbFRvbmVNYXBwaW5nID0gLypAX19QVVJFX18qLyBGbiggKCBbIGNvbG9yLCBleHBvc3VyZSBdICkgPT4ge1xyXG5cclxuXHRjb25zdCBTdGFydENvbXByZXNzaW9uID0gZmxvYXQoIDAuOCAtIDAuMDQgKTtcclxuXHRjb25zdCBEZXNhdHVyYXRpb24gPSBmbG9hdCggMC4xNSApO1xyXG5cclxuXHRjb2xvciA9IGNvbG9yLm11bCggZXhwb3N1cmUgKTtcclxuXHJcblx0Y29uc3QgeCA9IG1pbiggY29sb3IuciwgbWluKCBjb2xvci5nLCBjb2xvci5iICkgKTtcclxuXHRjb25zdCBvZmZzZXQgPSBzZWxlY3QoIHgubGVzc1RoYW4oIDAuMDggKSwgeC5zdWIoIG11bCggNi4yNSwgeC5tdWwoIHggKSApICksIDAuMDQgKTtcclxuXHJcblx0Y29sb3Iuc3ViQXNzaWduKCBvZmZzZXQgKTtcclxuXHJcblx0Y29uc3QgcGVhayA9IG1heCggY29sb3IuciwgbWF4KCBjb2xvci5nLCBjb2xvci5iICkgKTtcclxuXHJcblx0SWYoIHBlYWsubGVzc1RoYW4oIFN0YXJ0Q29tcHJlc3Npb24gKSwgKCkgPT4ge1xyXG5cclxuXHRcdHJldHVybiBjb2xvcjtcclxuXHJcblx0fSApO1xyXG5cclxuXHRjb25zdCBkID0gc3ViKCAxLCBTdGFydENvbXByZXNzaW9uICk7XHJcblx0Y29uc3QgbmV3UGVhayA9IHN1YiggMSwgZC5tdWwoIGQgKS5kaXYoIHBlYWsuYWRkKCBkLnN1YiggU3RhcnRDb21wcmVzc2lvbiApICkgKSApO1xyXG5cdGNvbG9yLm11bEFzc2lnbiggbmV3UGVhay5kaXYoIHBlYWsgKSApO1xyXG5cdGNvbnN0IGcgPSBzdWIoIDEsIGRpdiggMSwgRGVzYXR1cmF0aW9uLm11bCggcGVhay5zdWIoIG5ld1BlYWsgKSApLmFkZCggMSApICkgKTtcclxuXHJcblx0cmV0dXJuIG1peCggY29sb3IsIHZlYzMoIG5ld1BlYWsgKSwgZyApO1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICduZXV0cmFsVG9uZU1hcHBpbmcnLFxyXG5cdHR5cGU6ICd2ZWMzJyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ2NvbG9yJywgdHlwZTogJ3ZlYzMnIH0sXHJcblx0XHR7IG5hbWU6ICdleHBvc3VyZScsIHR5cGU6ICdmbG9hdCcgfVxyXG5cdF1cclxufSApO1xyXG4iLCJpbXBvcnQgTm9kZSBmcm9tICcuLi9jb3JlL05vZGUuanMnO1xyXG5pbXBvcnQgeyBub2RlUHJveHkgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBjbGFzcyByZXByZXNlbnRzIG5hdGl2ZSBjb2RlIHNlY3Rpb25zLiBJdCBpcyB0aGUgYmFzZVxyXG4gKiBjbGFzcyBmb3IgbW9kdWxlcyBsaWtlIHtAbGluayBGdW5jdGlvbk5vZGV9IHdoaWNoIGFsbG93cyB0byBpbXBsZW1lbnRcclxuICogZnVuY3Rpb25zIHdpdGggbmF0aXZlIHNoYWRlciBsYW5ndWFnZXMuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBOb2RlXHJcbiAqL1xyXG5jbGFzcyBDb2RlTm9kZSBleHRlbmRzIE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdDb2RlTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBjb2RlIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW2NvZGU9JyddIC0gVGhlIG5hdGl2ZSBjb2RlLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8Tm9kZT59IFtpbmNsdWRlcz1bXV0gLSBBbiBhcnJheSBvZiBpbmNsdWRlcy5cclxuXHQgKiBAcGFyYW0geygnanMnfCd3Z3NsJ3wnZ2xzbCcpfSBbbGFuZ3VhZ2U9JyddIC0gVGhlIHVzZWQgbGFuZ3VhZ2UuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGNvZGUgPSAnJywgaW5jbHVkZXMgPSBbXSwgbGFuZ3VhZ2UgPSAnJyApIHtcclxuXHJcblx0XHRzdXBlciggJ2NvZGUnICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzQ29kZU5vZGUgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG5hdGl2ZSBjb2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKiBAZGVmYXVsdCAnJ1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvZGUgPSBjb2RlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQW4gYXJyYXkgb2YgaW5jbHVkZXNcclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8Tm9kZT59XHJcblx0XHQgKiBAZGVmYXVsdCBbXVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmluY2x1ZGVzID0gaW5jbHVkZXM7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdXNlZCBsYW5ndWFnZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7KCdqcyd8J3dnc2wnfCdnbHNsJyl9XHJcblx0XHQgKiBAZGVmYXVsdCAnJ1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxhbmd1YWdlID0gbGFuZ3VhZ2U7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIG1ldGhvZCBpcyBvdmVyd3JpdHRlbiBzbyBpdCBhbHdheXMgcmV0dXJucyBgdHJ1ZWAuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoaXMgbm9kZSBpcyBnbG9iYWwgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGlzR2xvYmFsKCkge1xyXG5cclxuXHRcdHJldHVybiB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGluY2x1ZGVzIG9mIHRoaXMgY29kZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxOb2RlPn0gaW5jbHVkZXMgLSBUaGUgaW5jbHVkZXMgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge0NvZGVOb2RlfSBBIHJlZmVyZW5jZSB0byB0aGlzIG5vZGUuXHJcblx0ICovXHJcblx0c2V0SW5jbHVkZXMoIGluY2x1ZGVzICkge1xyXG5cclxuXHRcdHRoaXMuaW5jbHVkZXMgPSBpbmNsdWRlcztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBpbmNsdWRlcyBvZiB0aGlzIGNvZGUgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7QXJyYXk8Tm9kZT59IFRoZSBpbmNsdWRlcy5cclxuXHQgKi9cclxuXHRnZXRJbmNsdWRlcyggLypidWlsZGVyKi8gKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuaW5jbHVkZXM7XHJcblxyXG5cdH1cclxuXHJcblx0Z2VuZXJhdGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgaW5jbHVkZXMgPSB0aGlzLmdldEluY2x1ZGVzKCBidWlsZGVyICk7XHJcblxyXG5cdFx0Zm9yICggY29uc3QgaW5jbHVkZSBvZiBpbmNsdWRlcyApIHtcclxuXHJcblx0XHRcdGluY2x1ZGUuYnVpbGQoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3Qgbm9kZUNvZGUgPSBidWlsZGVyLmdldENvZGVGcm9tTm9kZSggdGhpcywgdGhpcy5nZXROb2RlVHlwZSggYnVpbGRlciApICk7XHJcblx0XHRub2RlQ29kZS5jb2RlID0gdGhpcy5jb2RlO1xyXG5cclxuXHRcdHJldHVybiBub2RlQ29kZS5jb2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdHNlcmlhbGl6ZSggZGF0YSApIHtcclxuXHJcblx0XHRzdXBlci5zZXJpYWxpemUoIGRhdGEgKTtcclxuXHJcblx0XHRkYXRhLmNvZGUgPSB0aGlzLmNvZGU7XHJcblx0XHRkYXRhLmxhbmd1YWdlID0gdGhpcy5sYW5ndWFnZTtcclxuXHJcblx0fVxyXG5cclxuXHRkZXNlcmlhbGl6ZSggZGF0YSApIHtcclxuXHJcblx0XHRzdXBlci5kZXNlcmlhbGl6ZSggZGF0YSApO1xyXG5cclxuXHRcdHRoaXMuY29kZSA9IGRhdGEuY29kZTtcclxuXHRcdHRoaXMubGFuZ3VhZ2UgPSBkYXRhLmxhbmd1YWdlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBDb2RlTm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgY29kZSBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NvZGVdIC0gVGhlIG5hdGl2ZSBjb2RlLlxyXG4gKiBAcGFyYW0gez9BcnJheTxOb2RlPn0gW2luY2x1ZGVzPVtdXSAtIEFuIGFycmF5IG9mIGluY2x1ZGVzLlxyXG4gKiBAcGFyYW0gez8oJ2pzJ3wnd2dzbCd8J2dsc2wnKX0gW2xhbmd1YWdlPScnXSAtIFRoZSB1c2VkIGxhbmd1YWdlLlxyXG4gKiBAcmV0dXJucyB7Q29kZU5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgY29kZSA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBDb2RlTm9kZSApLnNldFBhcmFtZXRlckxlbmd0aCggMSwgMyApO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSBKUyBjb2RlIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBzcmMgLSBUaGUgbmF0aXZlIGNvZGUuXHJcbiAqIEBwYXJhbSB7QXJyYXk8Tm9kZT59IGluY2x1ZGVzIC0gQW4gYXJyYXkgb2YgaW5jbHVkZXMuXHJcbiAqIEByZXR1cm5zIHtDb2RlTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBqcyA9ICggc3JjLCBpbmNsdWRlcyApID0+IGNvZGUoIHNyYywgaW5jbHVkZXMsICdqcycgKTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgV0dTTCBjb2RlIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBzcmMgLSBUaGUgbmF0aXZlIGNvZGUuXHJcbiAqIEBwYXJhbSB7QXJyYXk8Tm9kZT59IGluY2x1ZGVzIC0gQW4gYXJyYXkgb2YgaW5jbHVkZXMuXHJcbiAqIEByZXR1cm5zIHtDb2RlTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCB3Z3NsID0gKCBzcmMsIGluY2x1ZGVzICkgPT4gY29kZSggc3JjLCBpbmNsdWRlcywgJ3dnc2wnICk7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIEdMU0wgY29kZSBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge3N0cmluZ30gc3JjIC0gVGhlIG5hdGl2ZSBjb2RlLlxyXG4gKiBAcGFyYW0ge0FycmF5PE5vZGU+fSBpbmNsdWRlcyAtIEFuIGFycmF5IG9mIGluY2x1ZGVzLlxyXG4gKiBAcmV0dXJucyB7Q29kZU5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZ2xzbCA9ICggc3JjLCBpbmNsdWRlcyApID0+IGNvZGUoIHNyYywgaW5jbHVkZXMsICdnbHNsJyApO1xyXG4iLCJpbXBvcnQgQ29kZU5vZGUgZnJvbSAnLi9Db2RlTm9kZS5qcyc7XHJcbmltcG9ydCB7IG5vZGVPYmplY3QgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgbmF0aXZlIHNoYWRlciBmdW5jdGlvbi4gSXQgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50XHJcbiAqIGNlcnRhaW4gYXNwZWN0cyBvZiBhIG5vZGUgbWF0ZXJpYWwgd2l0aCBuYXRpdmUgc2hhZGVyIGNvZGUuIFRoZXJlIGFyZSB0d28gcHJlZGVmaW5lZFxyXG4gKiBUU0wgZnVuY3Rpb25zIGZvciBlYXNpZXIgdXNhZ2UuXHJcbiAqXHJcbiAqIC0gYHdnc2xGbmA6IENyZWF0ZXMgYSBXR1NMIGZ1bmN0aW9uIG5vZGUuXHJcbiAqIC0gYGdsc2xGbmA6IENyZWF0ZXMgYSBHTFNMIGZ1bmN0aW9uIG5vZGUuXHJcbiAqXHJcbiAqIEEgYmFzaWMgZXhhbXBsZSB3aXRoIG9uZSBpbmNsdWRlIGxvb2tzIGxpa2Ugc286XHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIGNvbnN0IGRlc2F0dXJhdGVXR1NMRm4gPSB3Z3NsRm4oIGBcclxuICpcdGZuIGRlc2F0dXJhdGUoIGNvbG9yOnZlYzM8ZjMyPiApIC0+IHZlYzM8ZjMyPiB7XHJcbiAqXHRcdGxldCBsdW0gPSB2ZWMzPGYzMj4oIDAuMjk5LCAwLjU4NywgMC4xMTQgKTtcclxuICpcdFx0cmV0dXJuIHZlYzM8ZjMyPiggZG90KCBsdW0sIGNvbG9yICkgKTtcclxuICpcdH1gXHJcbiAqKTtcclxuICogY29uc3Qgc29tZVdHU0xGbiA9IHdnc2xGbiggYFxyXG4gKlx0Zm4gc29tZUZuKCBjb2xvcjp2ZWMzPGYzMj4gKSAtPiB2ZWMzPGYzMj4ge1xyXG4gKiBcdFx0cmV0dXJuIGRlc2F0dXJhdGUoIGNvbG9yICk7XHJcbiAqIFx0fVxyXG4gKiBgLCBbIGRlc2F0dXJhdGVXR1NMRm4gXSApO1xyXG4gKiBtYXRlcmlhbC5jb2xvck5vZGUgPSBzb21lV0dTTEZuKCB7IGNvbG9yOiB0ZXh0dXJlKCBtYXAgKSB9ICk7XHJcbiAqYGBgXHJcbiAqIEBhdWdtZW50cyBDb2RlTm9kZVxyXG4gKi9cclxuY2xhc3MgRnVuY3Rpb25Ob2RlIGV4dGVuZHMgQ29kZU5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdGdW5jdGlvbk5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgZnVuY3Rpb24gbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbY29kZT0nJ10gLSBUaGUgbmF0aXZlIGNvZGUuXHJcblx0ICogQHBhcmFtIHtBcnJheTxOb2RlPn0gW2luY2x1ZGVzPVtdXSAtIEFuIGFycmF5IG9mIGluY2x1ZGVzLlxyXG5cdCAqIEBwYXJhbSB7KCdqcyd8J3dnc2wnfCdnbHNsJyl9IFtsYW5ndWFnZT0nJ10gLSBUaGUgdXNlZCBsYW5ndWFnZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggY29kZSA9ICcnLCBpbmNsdWRlcyA9IFtdLCBsYW5ndWFnZSA9ICcnICkge1xyXG5cclxuXHRcdHN1cGVyKCBjb2RlLCBpbmNsdWRlcywgbGFuZ3VhZ2UgKTtcclxuXHJcblx0fVxyXG5cclxuXHRnZXROb2RlVHlwZSggYnVpbGRlciApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5nZXROb2RlRnVuY3Rpb24oIGJ1aWxkZXIgKS50eXBlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGlucHV0cyBvZiB0aGlzIGZ1bmN0aW9uIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge0FycmF5PE5vZGVGdW5jdGlvbklucHV0Pn0gVGhlIGlucHV0cy5cclxuXHQgKi9cclxuXHRnZXRJbnB1dHMoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZ2V0Tm9kZUZ1bmN0aW9uKCBidWlsZGVyICkuaW5wdXRzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIG5vZGUgZnVuY3Rpb24gZm9yIHRoaXMgZnVuY3Rpb24gbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7Tm9kZUZ1bmN0aW9ufSBUaGUgbm9kZSBmdW5jdGlvbi5cclxuXHQgKi9cclxuXHRnZXROb2RlRnVuY3Rpb24oIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3Qgbm9kZURhdGEgPSBidWlsZGVyLmdldERhdGFGcm9tTm9kZSggdGhpcyApO1xyXG5cclxuXHRcdGxldCBub2RlRnVuY3Rpb24gPSBub2RlRGF0YS5ub2RlRnVuY3Rpb247XHJcblxyXG5cdFx0aWYgKCBub2RlRnVuY3Rpb24gPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdG5vZGVGdW5jdGlvbiA9IGJ1aWxkZXIucGFyc2VyLnBhcnNlRnVuY3Rpb24oIHRoaXMuY29kZSApO1xyXG5cclxuXHRcdFx0bm9kZURhdGEubm9kZUZ1bmN0aW9uID0gbm9kZUZ1bmN0aW9uO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbm9kZUZ1bmN0aW9uO1xyXG5cclxuXHR9XHJcblxyXG5cdGdlbmVyYXRlKCBidWlsZGVyLCBvdXRwdXQgKSB7XHJcblxyXG5cdFx0c3VwZXIuZ2VuZXJhdGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRjb25zdCBub2RlRnVuY3Rpb24gPSB0aGlzLmdldE5vZGVGdW5jdGlvbiggYnVpbGRlciApO1xyXG5cclxuXHRcdGNvbnN0IG5hbWUgPSBub2RlRnVuY3Rpb24ubmFtZTtcclxuXHRcdGNvbnN0IHR5cGUgPSBub2RlRnVuY3Rpb24udHlwZTtcclxuXHJcblx0XHRjb25zdCBub2RlQ29kZSA9IGJ1aWxkZXIuZ2V0Q29kZUZyb21Ob2RlKCB0aGlzLCB0eXBlICk7XHJcblxyXG5cdFx0aWYgKCBuYW1lICE9PSAnJyApIHtcclxuXHJcblx0XHRcdC8vIHVzZSBhIGN1c3RvbSBwcm9wZXJ0eSBuYW1lXHJcblxyXG5cdFx0XHRub2RlQ29kZS5uYW1lID0gbmFtZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgcHJvcGVydHlOYW1lID0gYnVpbGRlci5nZXRQcm9wZXJ0eU5hbWUoIG5vZGVDb2RlICk7XHJcblxyXG5cdFx0Y29uc3QgY29kZSA9IHRoaXMuZ2V0Tm9kZUZ1bmN0aW9uKCBidWlsZGVyICkuZ2V0Q29kZSggcHJvcGVydHlOYW1lICk7XHJcblxyXG5cdFx0bm9kZUNvZGUuY29kZSA9IGNvZGUgKyAnXFxuJztcclxuXHJcblx0XHRpZiAoIG91dHB1dCA9PT0gJ3Byb3BlcnR5JyApIHtcclxuXHJcblx0XHRcdHJldHVybiBwcm9wZXJ0eU5hbWU7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHJldHVybiBidWlsZGVyLmZvcm1hdCggYCR7IHByb3BlcnR5TmFtZSB9KClgLCB0eXBlLCBvdXRwdXQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEZ1bmN0aW9uTm9kZTtcclxuXHJcbmNvbnN0IG5hdGl2ZUZuID0gKCBjb2RlLCBpbmNsdWRlcyA9IFtdLCBsYW5ndWFnZSA9ICcnICkgPT4ge1xyXG5cclxuXHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBpbmNsdWRlcy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0Y29uc3QgaW5jbHVkZSA9IGluY2x1ZGVzWyBpIF07XHJcblxyXG5cdFx0Ly8gVFNMIEZ1bmN0aW9uOiBnbHNsRm4sIHdnc2xGblxyXG5cclxuXHRcdGlmICggdHlwZW9mIGluY2x1ZGUgPT09ICdmdW5jdGlvbicgKSB7XHJcblxyXG5cdFx0XHRpbmNsdWRlc1sgaSBdID0gaW5jbHVkZS5mdW5jdGlvbk5vZGU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGNvbnN0IGZ1bmN0aW9uTm9kZSA9IG5vZGVPYmplY3QoIG5ldyBGdW5jdGlvbk5vZGUoIGNvZGUsIGluY2x1ZGVzLCBsYW5ndWFnZSApICk7XHJcblxyXG5cdGNvbnN0IGZuID0gKCAuLi5wYXJhbXMgKSA9PiBmdW5jdGlvbk5vZGUuY2FsbCggLi4ucGFyYW1zICk7XHJcblx0Zm4uZnVuY3Rpb25Ob2RlID0gZnVuY3Rpb25Ob2RlO1xyXG5cclxuXHRyZXR1cm4gZm47XHJcblxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGdsc2xGbiA9ICggY29kZSwgaW5jbHVkZXMgKSA9PiBuYXRpdmVGbiggY29kZSwgaW5jbHVkZXMsICdnbHNsJyApO1xyXG5leHBvcnQgY29uc3Qgd2dzbEZuID0gKCBjb2RlLCBpbmNsdWRlcyApID0+IG5hdGl2ZUZuKCBjb2RlLCBpbmNsdWRlcywgJ3dnc2wnICk7XHJcbiIsImltcG9ydCBOb2RlIGZyb20gJy4uL2NvcmUvTm9kZS5qcyc7XHJcbmltcG9ydCB7IGFycmF5QnVmZmVyVG9CYXNlNjQsIGJhc2U2NFRvQXJyYXlCdWZmZXIgfSBmcm9tICcuLi9jb3JlL05vZGVVdGlscy5qcyc7XHJcbmltcG9ydCB7IG5vZGVQcm94eSwgZmxvYXQgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcblxyXG5pbXBvcnQgeyBFdmVudERpc3BhdGNoZXIgfSBmcm9tICcuLi8uLi9jb3JlL0V2ZW50RGlzcGF0Y2hlci5qcyc7XHJcblxyXG4vKipcclxuICogYFNjcmlwdGFibGVOb2RlYCB1c2VzIHRoaXMgY2xhc3MgdG8gbWFuYWdlIHNjcmlwdCBpbnB1dHMgYW5kIG91dHB1dHMuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBOb2RlXHJcbiAqL1xyXG5jbGFzcyBTY3JpcHRhYmxlVmFsdWVOb2RlIGV4dGVuZHMgTm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ1NjcmlwdGFibGVWYWx1ZU5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc2NyaXB0YWJsZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHthbnl9IFt2YWx1ZT1udWxsXSAtIFRoZSB2YWx1ZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggdmFsdWUgPSBudWxsICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZSB0byB0aGUgdmFsdWUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fdmFsdWUgPSB2YWx1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBgX3ZhbHVlYCwgdGhpcyBwcm9wZXJ0eSBtaWdodCBjYWNoZSBwYXJzZWQgZGF0YS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9jYWNoZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBJZiB0aGlzIG5vZGUgcmVwcmVzZW50cyBhbiBpbnB1dCwgdGhpcyBwcm9wZXJ0eSByZXByZXNlbnRzIHRoZSBpbnB1dCB0eXBlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/c3RyaW5nfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlucHV0VHlwZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBJZiB0aGlzIG5vZGUgcmVwcmVzZW50cyBhbiBvdXRwdXQsIHRoaXMgcHJvcGVydHkgcmVwcmVzZW50cyB0aGUgb3V0cHV0IHR5cGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9zdHJpbmd9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMub3V0cHV0VHlwZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBldmVudCBkaXNwYXRjaGVyIGZvciBtYW5hZ2luZyBldmVudHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0V2ZW50RGlzcGF0Y2hlcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ldmVudHMgPSBuZXcgRXZlbnREaXNwYXRjaGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzU2NyaXB0YWJsZVZhbHVlTm9kZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogV2hldGhlciB0aGlzIG5vZGUgcmVwcmVzZW50cyBhbiBvdXRwdXQgb3Igbm90LlxyXG5cdCAqXHJcblx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0ICogQHJlYWRvbmx5XHJcblx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdCAqL1xyXG5cdGdldCBpc1NjcmlwdGFibGVPdXRwdXROb2RlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm91dHB1dFR5cGUgIT09IG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0IHZhbHVlKCB2YWwgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl92YWx1ZSA9PT0gdmFsICkgcmV0dXJuO1xyXG5cclxuXHRcdGlmICggdGhpcy5fY2FjaGUgJiYgdGhpcy5pbnB1dFR5cGUgPT09ICdVUkwnICYmIHRoaXMudmFsdWUudmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciApIHtcclxuXHJcblx0XHRcdFVSTC5yZXZva2VPYmplY3RVUkwoIHRoaXMuX2NhY2hlICk7XHJcblxyXG5cdFx0XHR0aGlzLl9jYWNoZSA9IG51bGw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuX3ZhbHVlID0gdmFsO1xyXG5cclxuXHRcdHRoaXMuZXZlbnRzLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2NoYW5nZScgfSApO1xyXG5cclxuXHRcdHRoaXMucmVmcmVzaCgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBub2RlJ3MgdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7YW55fVxyXG5cdCAqL1xyXG5cdGdldCB2YWx1ZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fdmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGlzcGF0Y2hlcyB0aGUgYHJlZnJlc2hgIGV2ZW50LlxyXG5cdCAqL1xyXG5cdHJlZnJlc2goKSB7XHJcblxyXG5cdFx0dGhpcy5ldmVudHMuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAncmVmcmVzaCcgfSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBgdmFsdWVgIHByb3BlcnR5IHVzdWFsbHkgcmVwcmVzZW50cyBhIG5vZGUgb3IgZXZlbiBiaW5hcnkgZGF0YSBpbiBmb3JtIG9mIGFycmF5IGJ1ZmZlcnMuXHJcblx0ICogSW4gdGhpcyBjYXNlLCB0aGlzIG1ldGhvZCB0cmllcyB0byByZXR1cm4gdGhlIGFjdHVhbCB2YWx1ZSBiZWhpbmQgdGhlIGNvbXBsZXggdHlwZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge2FueX0gVGhlIHZhbHVlLlxyXG5cdCAqL1xyXG5cdGdldFZhbHVlKCkge1xyXG5cclxuXHRcdGNvbnN0IHZhbHVlID0gdGhpcy52YWx1ZTtcclxuXHJcblx0XHRpZiAoIHZhbHVlICYmIHRoaXMuX2NhY2hlID09PSBudWxsICYmIHRoaXMuaW5wdXRUeXBlID09PSAnVVJMJyAmJiB2YWx1ZS52YWx1ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyICkge1xyXG5cclxuXHRcdFx0dGhpcy5fY2FjaGUgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKCBuZXcgQmxvYiggWyB2YWx1ZS52YWx1ZSBdICkgKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCB2YWx1ZSAmJiB2YWx1ZS52YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIChcclxuXHRcdFx0KCAoIHRoaXMuaW5wdXRUeXBlID09PSAnVVJMJyB8fCB0aGlzLmlucHV0VHlwZSA9PT0gJ1N0cmluZycgKSAmJiB0eXBlb2YgdmFsdWUudmFsdWUgPT09ICdzdHJpbmcnICkgfHxcclxuXHRcdFx0KCB0aGlzLmlucHV0VHlwZSA9PT0gJ051bWJlcicgJiYgdHlwZW9mIHZhbHVlLnZhbHVlID09PSAnbnVtYmVyJyApIHx8XHJcblx0XHRcdCggdGhpcy5pbnB1dFR5cGUgPT09ICdWZWN0b3IyJyAmJiB2YWx1ZS52YWx1ZS5pc1ZlY3RvcjIgKSB8fFxyXG5cdFx0XHQoIHRoaXMuaW5wdXRUeXBlID09PSAnVmVjdG9yMycgJiYgdmFsdWUudmFsdWUuaXNWZWN0b3IzICkgfHxcclxuXHRcdFx0KCB0aGlzLmlucHV0VHlwZSA9PT0gJ1ZlY3RvcjQnICYmIHZhbHVlLnZhbHVlLmlzVmVjdG9yNCApIHx8XHJcblx0XHRcdCggdGhpcy5pbnB1dFR5cGUgPT09ICdDb2xvcicgJiYgdmFsdWUudmFsdWUuaXNDb2xvciApIHx8XHJcblx0XHRcdCggdGhpcy5pbnB1dFR5cGUgPT09ICdNYXRyaXgzJyAmJiB2YWx1ZS52YWx1ZS5pc01hdHJpeDMgKSB8fFxyXG5cdFx0XHQoIHRoaXMuaW5wdXRUeXBlID09PSAnTWF0cml4NCcgJiYgdmFsdWUudmFsdWUuaXNNYXRyaXg0IClcclxuXHRcdCkgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gdmFsdWUudmFsdWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzLl9jYWNoZSB8fCB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBPdmVyd3JpdHRlbiBzaW5jZSB0aGUgbm9kZSB0eXBlIGlzIGluZmVycmVkIGZyb20gdGhlIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBub2RlIHR5cGUuXHJcblx0ICovXHJcblx0Z2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMudmFsdWUgJiYgdGhpcy52YWx1ZS5pc05vZGUgPyB0aGlzLnZhbHVlLmdldE5vZGVUeXBlKCBidWlsZGVyICkgOiAnZmxvYXQnO1xyXG5cclxuXHR9XHJcblxyXG5cdHNldHVwKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnZhbHVlICYmIHRoaXMudmFsdWUuaXNOb2RlID8gdGhpcy52YWx1ZSA6IGZsb2F0KCk7XHJcblxyXG5cdH1cclxuXHJcblx0c2VyaWFsaXplKCBkYXRhICkge1xyXG5cclxuXHRcdHN1cGVyLnNlcmlhbGl6ZSggZGF0YSApO1xyXG5cclxuXHRcdGlmICggdGhpcy52YWx1ZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGlmICggdGhpcy5pbnB1dFR5cGUgPT09ICdBcnJheUJ1ZmZlcicgKSB7XHJcblxyXG5cdFx0XHRcdGRhdGEudmFsdWUgPSBhcnJheUJ1ZmZlclRvQmFzZTY0KCB0aGlzLnZhbHVlICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRkYXRhLnZhbHVlID0gdGhpcy52YWx1ZSA/IHRoaXMudmFsdWUudG9KU09OKCBkYXRhLm1ldGEgKS51dWlkIDogbnVsbDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0ZGF0YS52YWx1ZSA9IG51bGw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGRhdGEuaW5wdXRUeXBlID0gdGhpcy5pbnB1dFR5cGU7XHJcblx0XHRkYXRhLm91dHB1dFR5cGUgPSB0aGlzLm91dHB1dFR5cGU7XHJcblxyXG5cdH1cclxuXHJcblx0ZGVzZXJpYWxpemUoIGRhdGEgKSB7XHJcblxyXG5cdFx0c3VwZXIuZGVzZXJpYWxpemUoIGRhdGEgKTtcclxuXHJcblx0XHRsZXQgdmFsdWUgPSBudWxsO1xyXG5cclxuXHRcdGlmICggZGF0YS52YWx1ZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGlmICggZGF0YS5pbnB1dFR5cGUgPT09ICdBcnJheUJ1ZmZlcicgKSB7XHJcblxyXG5cdFx0XHRcdHZhbHVlID0gYmFzZTY0VG9BcnJheUJ1ZmZlciggZGF0YS52YWx1ZSApO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggZGF0YS5pbnB1dFR5cGUgPT09ICdUZXh0dXJlJyApIHtcclxuXHJcblx0XHRcdFx0dmFsdWUgPSBkYXRhLm1ldGEudGV4dHVyZXNbIGRhdGEudmFsdWUgXTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHZhbHVlID0gZGF0YS5tZXRhLm5vZGVzWyBkYXRhLnZhbHVlIF0gfHwgbnVsbDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy52YWx1ZSA9IHZhbHVlO1xyXG5cclxuXHRcdHRoaXMuaW5wdXRUeXBlID0gZGF0YS5pbnB1dFR5cGU7XHJcblx0XHR0aGlzLm91dHB1dFR5cGUgPSBkYXRhLm91dHB1dFR5cGU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFNjcmlwdGFibGVWYWx1ZU5vZGU7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIHNjcmlwdGFibGUgdmFsdWUgbm9kZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHthbnl9IFt2YWx1ZV0gLSBUaGUgdmFsdWUuXHJcbiAqIEByZXR1cm5zIHtTY3JpcHRhYmxlVmFsdWVOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHNjcmlwdGFibGVWYWx1ZSA9IC8qQF9fUFVSRV9fKi8gbm9kZVByb3h5KCBTY3JpcHRhYmxlVmFsdWVOb2RlICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAxICk7XHJcbiIsImltcG9ydCBOb2RlIGZyb20gJy4uL2NvcmUvTm9kZS5qcyc7XHJcbmltcG9ydCB7IHNjcmlwdGFibGVWYWx1ZSB9IGZyb20gJy4vU2NyaXB0YWJsZVZhbHVlTm9kZS5qcyc7XHJcbmltcG9ydCB7IG5vZGVQcm94eSwgZmxvYXQgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcbmltcG9ydCB7IGhhc2hBcnJheSwgaGFzaFN0cmluZyB9IGZyb20gJy4uL2NvcmUvTm9kZVV0aWxzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIE1hcC1saWtlIGRhdGEgc3RydWN0dXJlIGZvciBtYW5hZ2luZyByZXNvdXJjZXMgb2Ygc2NyaXB0YWJsZSBub2Rlcy5cclxuICpcclxuICogQGF1Z21lbnRzIE1hcFxyXG4gKi9cclxuY2xhc3MgUmVzb3VyY2VzIGV4dGVuZHMgTWFwIHtcclxuXHJcblx0Z2V0KCBrZXksIGNhbGxiYWNrID0gbnVsbCwgLi4ucGFyYW1zICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5oYXMoIGtleSApICkgcmV0dXJuIHN1cGVyLmdldCgga2V5ICk7XHJcblxyXG5cdFx0aWYgKCBjYWxsYmFjayAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGNvbnN0IHZhbHVlID0gY2FsbGJhY2soIC4uLnBhcmFtcyApO1xyXG5cdFx0XHR0aGlzLnNldCgga2V5LCB2YWx1ZSApO1xyXG5cdFx0XHRyZXR1cm4gdmFsdWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5jbGFzcyBQYXJhbWV0ZXJzIHtcclxuXHJcblx0Y29uc3RydWN0b3IoIHNjcmlwdGFibGVOb2RlICkge1xyXG5cclxuXHRcdHRoaXMuc2NyaXB0YWJsZU5vZGUgPSBzY3JpcHRhYmxlTm9kZTtcclxuXHJcblx0fVxyXG5cclxuXHRnZXQgcGFyYW1ldGVycygpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5zY3JpcHRhYmxlTm9kZS5wYXJhbWV0ZXJzO1xyXG5cclxuXHR9XHJcblxyXG5cdGdldCBsYXlvdXQoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuc2NyaXB0YWJsZU5vZGUuZ2V0TGF5b3V0KCk7XHJcblxyXG5cdH1cclxuXHJcblx0Z2V0SW5wdXRMYXlvdXQoIGlkICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnNjcmlwdGFibGVOb2RlLmdldElucHV0TGF5b3V0KCBpZCApO1xyXG5cclxuXHR9XHJcblxyXG5cdGdldCggbmFtZSApIHtcclxuXHJcblx0XHRjb25zdCBwYXJhbSA9IHRoaXMucGFyYW1ldGVyc1sgbmFtZSBdO1xyXG5cdFx0Y29uc3QgdmFsdWUgPSBwYXJhbSA/IHBhcmFtLmdldFZhbHVlKCkgOiBudWxsO1xyXG5cclxuXHRcdHJldHVybiB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIERlZmluZXMgdGhlIHJlc291cmNlcyAoZS5nLiBuYW1lc3BhY2VzKSBvZiBzY3JpcHRhYmxlIG5vZGVzLlxyXG4gKlxyXG4gKiBAdHlwZSB7UmVzb3VyY2VzfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFNjcmlwdGFibGVOb2RlUmVzb3VyY2VzID0gbmV3IFJlc291cmNlcygpO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgdHlwZSBvZiBub2RlIGFsbG93cyB0byBpbXBsZW1lbnQgbm9kZXMgd2l0aCBjdXN0b20gc2NyaXB0cy4gVGhlIHNjcmlwdFxyXG4gKiBzZWN0aW9uIGlzIHJlcHJlc2VudGVkIGFzIGFuIGluc3RhbmNlIG9mIGBDb2RlTm9kZWAgd3JpdHRlbiB3aXRoIEphdmFTY3JpcHQuXHJcbiAqIFRoZSBzY3JpcHQgaXRzZWxmIG11c3QgYWRoZXJlIHRvIGEgc3BlY2lmaWMgc3RydWN0dXJlLlxyXG4gKlxyXG4gKiAtIG1haW4oKTogRXhlY3V0ZWQgb25jZSBieSBkZWZhdWx0IGFuZCBldmVyeSB0aW1lIGBub2RlLm5lZWRzVXBkYXRlYCBpcyBzZXQuXHJcbiAqIC0gbGF5b3V0OiBUaGUgbGF5b3V0IG9iamVjdCBkZWZpbmVzIHRoZSBzY3JpcHQncyBpbnRlcmZhY2UgKGlucHV0cyBhbmQgb3V0cHV0cykuXHJcbiAqXHJcbiAqIGBgYGpzXHJcbiAqIFNjcmlwdGFibGVOb2RlUmVzb3VyY2VzLnNldCggJ1RTTCcsIFRTTCApO1xyXG4gKlxyXG4gKiBjb25zdCBzY3JpcHRhYmxlTm9kZSA9IHNjcmlwdGFibGUoIGpzKCBgXHJcbiAqIFx0bGF5b3V0ID0ge1xyXG4gKiBcdFx0b3V0cHV0VHlwZTogJ25vZGUnLFxyXG4gKiBcdFx0ZWxlbWVudHM6IFtcclxuICogXHRcdFx0eyBuYW1lOiAnc291cmNlJywgaW5wdXRUeXBlOiAnbm9kZScgfSxcclxuICogXHRcdF1cclxuICogXHR9O1xyXG4gKlxyXG4gKiBcdGNvbnN0IHsgbXVsLCBvc2NTaW5lIH0gPSBUU0w7XHJcbiAqXHJcbiAqIFx0ZnVuY3Rpb24gbWFpbigpIHtcclxuICogXHRcdGNvbnN0IHNvdXJjZSA9IHBhcmFtZXRlcnMuZ2V0KCAnc291cmNlJyApIHx8IGZsb2F0KCk7XHJcbiAqIFx0XHRyZXR1cm4gbXVsKCBzb3VyY2UsIG9zY1NpbmUoKSApICk7XHJcbiAqIFx0fVxyXG4gKlxyXG4gKiBgICkgKTtcclxuICpcclxuICogc2NyaXB0YWJsZU5vZGUuc2V0UGFyYW1ldGVyKCAnc291cmNlJywgY29sb3IoIDEsIDAsIDAgKSApO1xyXG4gKlxyXG4gKiBjb25zdCBtYXRlcmlhbCA9IG5ldyBUSFJFRS5NZXNoQmFzaWNOb2RlTWF0ZXJpYWwoKTtcclxuICogbWF0ZXJpYWwuY29sb3JOb2RlID0gc2NyaXB0YWJsZU5vZGU7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTm9kZVxyXG4gKi9cclxuY2xhc3MgU2NyaXB0YWJsZU5vZGUgZXh0ZW5kcyBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnU2NyaXB0YWJsZU5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc2NyaXB0YWJsZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHs/Q29kZU5vZGV9IFtjb2RlTm9kZT1udWxsXSAtIFRoZSBjb2RlIG5vZGUuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbWV0ZXJzPXt9XSAtIFRoZSBwYXJhbWV0ZXJzIGRlZmluaXRpb24uXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGNvZGVOb2RlID0gbnVsbCwgcGFyYW1ldGVycyA9IHt9ICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY29kZSBub2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Q29kZU5vZGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29kZU5vZGUgPSBjb2RlTm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBwYXJhbWV0ZXJzIGRlZmluaXRpb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqIEBkZWZhdWx0IHt9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7XHJcblxyXG5cdFx0dGhpcy5fbG9jYWwgPSBuZXcgUmVzb3VyY2VzKCk7XHJcblx0XHR0aGlzLl9vdXRwdXQgPSBzY3JpcHRhYmxlVmFsdWUoIG51bGwgKTtcclxuXHRcdHRoaXMuX291dHB1dHMgPSB7fTtcclxuXHRcdHRoaXMuX3NvdXJjZSA9IHRoaXMuc291cmNlO1xyXG5cdFx0dGhpcy5fbWV0aG9kID0gbnVsbDtcclxuXHRcdHRoaXMuX29iamVjdCA9IG51bGw7XHJcblx0XHR0aGlzLl92YWx1ZSA9IG51bGw7XHJcblx0XHR0aGlzLl9uZWVkc091dHB1dFVwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy5vblJlZnJlc2ggPSB0aGlzLm9uUmVmcmVzaC5iaW5kKCB0aGlzICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzU2NyaXB0YWJsZU5vZGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBzb3VyY2UgY29kZSBvZiB0aGUgc2NyaXB0YWJsZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge3N0cmluZ31cclxuXHQgKi9cclxuXHRnZXQgc291cmNlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmNvZGVOb2RlID8gdGhpcy5jb2RlTm9kZS5jb2RlIDogJyc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgcmVmZXJlbmNlIG9mIGEgbG9jYWwgc2NyaXB0IHZhcmlhYmxlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgdmFyaWFibGUgbmFtZS5cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gdmFsdWUgLSBUaGUgcmVmZXJlbmNlIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtSZXNvdXJjZXN9IFRoZSByZXNvdXJjZSBtYXBcclxuXHQgKi9cclxuXHRzZXRMb2NhbCggbmFtZSwgdmFsdWUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX2xvY2FsLnNldCggbmFtZSwgdmFsdWUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIGxvY2FsIHNjcmlwdCB2YXJpYWJsZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIHZhcmlhYmxlIG5hbWUuXHJcblx0ICogQHJldHVybiB7T2JqZWN0fSBUaGUgdmFsdWUuXHJcblx0ICovXHJcblx0Z2V0TG9jYWwoIG5hbWUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX2xvY2FsLmdldCggbmFtZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEV2ZW50IGxpc3RlbmVyIGZvciB0aGUgYHJlZnJlc2hgIGV2ZW50LlxyXG5cdCAqL1xyXG5cdG9uUmVmcmVzaCgpIHtcclxuXHJcblx0XHR0aGlzLl9yZWZyZXNoKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhbiBpbnB1dCBmcm9tIHRoZSBsYXlvdXQgd2l0aCB0aGUgZ2l2ZW4gaWQvbmFtZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIFRoZSBpZC9uYW1lIG9mIHRoZSBpbnB1dC5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBlbGVtZW50IGVudHJ5LlxyXG5cdCAqL1xyXG5cdGdldElucHV0TGF5b3V0KCBpZCApIHtcclxuXHJcblx0XHRmb3IgKCBjb25zdCBlbGVtZW50IG9mIHRoaXMuZ2V0TGF5b3V0KCkgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGVsZW1lbnQuaW5wdXRUeXBlICYmICggZWxlbWVudC5pZCA9PT0gaWQgfHwgZWxlbWVudC5uYW1lID09PSBpZCApICkge1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gZWxlbWVudDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhbiBvdXRwdXQgZnJvbSB0aGUgbGF5b3V0IHdpdGggdGhlIGdpdmVuIGlkL25hbWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBUaGUgaWQvbmFtZSBvZiB0aGUgb3V0cHV0LlxyXG5cdCAqIEByZXR1cm4ge09iamVjdH0gVGhlIGVsZW1lbnQgZW50cnkuXHJcblx0ICovXHJcblx0Z2V0T3V0cHV0TGF5b3V0KCBpZCApIHtcclxuXHJcblx0XHRmb3IgKCBjb25zdCBlbGVtZW50IG9mIHRoaXMuZ2V0TGF5b3V0KCkgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGVsZW1lbnQub3V0cHV0VHlwZSAmJiAoIGVsZW1lbnQuaWQgPT09IGlkIHx8IGVsZW1lbnQubmFtZSA9PT0gaWQgKSApIHtcclxuXHJcblx0XHRcdFx0cmV0dXJuIGVsZW1lbnQ7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgYSBzY3JpcHQgb3V0cHV0IGZvciB0aGUgZ2l2ZW4gbmFtZSBhbmQgdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBvdXRwdXQuXHJcblx0ICogQHBhcmFtIHtOb2RlfSB2YWx1ZSAtIFRoZSBub2RlIHZhbHVlLlxyXG5cdCAqIEByZXR1cm4ge1NjcmlwdGFibGVOb2RlfSBBIHJlZmVyZW5jZSB0byB0aGlzIG5vZGUuXHJcblx0ICovXHJcblx0c2V0T3V0cHV0KCBuYW1lLCB2YWx1ZSApIHtcclxuXHJcblx0XHRjb25zdCBvdXRwdXRzID0gdGhpcy5fb3V0cHV0cztcclxuXHJcblx0XHRpZiAoIG91dHB1dHNbIG5hbWUgXSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0b3V0cHV0c1sgbmFtZSBdID0gc2NyaXB0YWJsZVZhbHVlKCB2YWx1ZSApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRvdXRwdXRzWyBuYW1lIF0udmFsdWUgPSB2YWx1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIHNjcmlwdCBvdXRwdXQgZm9yIHRoZSBnaXZlbiBuYW1lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgb3V0cHV0LlxyXG5cdCAqIEByZXR1cm4ge1NjcmlwdGFibGVWYWx1ZU5vZGV9IFRoZSBub2RlIHZhbHVlLlxyXG5cdCAqL1xyXG5cdGdldE91dHB1dCggbmFtZSApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fb3V0cHV0c1sgbmFtZSBdO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBwYXJhbWV0ZXIgZm9yIHRoZSBnaXZlbiBuYW1lXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIuXHJcblx0ICogQHJldHVybiB7U2NyaXB0YWJsZVZhbHVlTm9kZX0gVGhlIG5vZGUgdmFsdWUuXHJcblx0ICovXHJcblx0Z2V0UGFyYW1ldGVyKCBuYW1lICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnBhcmFtZXRlcnNbIG5hbWUgXTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIGEgdmFsdWUgZm9yIHRoZSBnaXZlbiBwYXJhbWV0ZXIgbmFtZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIHBhcmFtZXRlciBuYW1lLlxyXG5cdCAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIFRoZSBwYXJhbWV0ZXIgdmFsdWUuXHJcblx0ICogQHJldHVybiB7U2NyaXB0YWJsZU5vZGV9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbm9kZS5cclxuXHQgKi9cclxuXHRzZXRQYXJhbWV0ZXIoIG5hbWUsIHZhbHVlICkge1xyXG5cclxuXHRcdGNvbnN0IHBhcmFtZXRlcnMgPSB0aGlzLnBhcmFtZXRlcnM7XHJcblxyXG5cdFx0aWYgKCB2YWx1ZSAmJiB2YWx1ZS5pc1NjcmlwdGFibGVOb2RlICkge1xyXG5cclxuXHRcdFx0dGhpcy5kZWxldGVQYXJhbWV0ZXIoIG5hbWUgKTtcclxuXHJcblx0XHRcdHBhcmFtZXRlcnNbIG5hbWUgXSA9IHZhbHVlO1xyXG5cdFx0XHRwYXJhbWV0ZXJzWyBuYW1lIF0uZ2V0RGVmYXVsdE91dHB1dCgpLmV2ZW50cy5hZGRFdmVudExpc3RlbmVyKCAncmVmcmVzaCcsIHRoaXMub25SZWZyZXNoICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggdmFsdWUgJiYgdmFsdWUuaXNTY3JpcHRhYmxlVmFsdWVOb2RlICkge1xyXG5cclxuXHRcdFx0dGhpcy5kZWxldGVQYXJhbWV0ZXIoIG5hbWUgKTtcclxuXHJcblx0XHRcdHBhcmFtZXRlcnNbIG5hbWUgXSA9IHZhbHVlO1xyXG5cdFx0XHRwYXJhbWV0ZXJzWyBuYW1lIF0uZXZlbnRzLmFkZEV2ZW50TGlzdGVuZXIoICdyZWZyZXNoJywgdGhpcy5vblJlZnJlc2ggKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBwYXJhbWV0ZXJzWyBuYW1lIF0gPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHBhcmFtZXRlcnNbIG5hbWUgXSA9IHNjcmlwdGFibGVWYWx1ZSggdmFsdWUgKTtcclxuXHRcdFx0cGFyYW1ldGVyc1sgbmFtZSBdLmV2ZW50cy5hZGRFdmVudExpc3RlbmVyKCAncmVmcmVzaCcsIHRoaXMub25SZWZyZXNoICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHBhcmFtZXRlcnNbIG5hbWUgXS52YWx1ZSA9IHZhbHVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGlzIG5vZGUgd2hpY2ggaXMgdGhlIHZhbHVlIG9mXHJcblx0ICogdGhlIGRlZmF1bHQgb3V0cHV0LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Tm9kZX0gVGhlIHZhbHVlLlxyXG5cdCAqL1xyXG5cdGdldFZhbHVlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmdldERlZmF1bHRPdXRwdXQoKS5nZXRWYWx1ZSgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlbGV0ZXMgYSBwYXJhbWV0ZXIgZnJvbSB0aGUgc2NyaXB0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgcGFyYW1ldGVyIHRvIHJlbW92ZS5cclxuXHQgKiBAcmV0dXJuIHtTY3JpcHRhYmxlTm9kZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBub2RlLlxyXG5cdCAqL1xyXG5cdGRlbGV0ZVBhcmFtZXRlciggbmFtZSApIHtcclxuXHJcblx0XHRsZXQgdmFsdWVOb2RlID0gdGhpcy5wYXJhbWV0ZXJzWyBuYW1lIF07XHJcblxyXG5cdFx0aWYgKCB2YWx1ZU5vZGUgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHZhbHVlTm9kZS5pc1NjcmlwdGFibGVOb2RlICkgdmFsdWVOb2RlID0gdmFsdWVOb2RlLmdldERlZmF1bHRPdXRwdXQoKTtcclxuXHJcblx0XHRcdHZhbHVlTm9kZS5ldmVudHMucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3JlZnJlc2gnLCB0aGlzLm9uUmVmcmVzaCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWxldGVzIGFsbCBwYXJhbWV0ZXJzIGZyb20gdGhlIHNjcmlwdC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1NjcmlwdGFibGVOb2RlfSBBIHJlZmVyZW5jZSB0byB0aGlzIG5vZGUuXHJcblx0ICovXHJcblx0Y2xlYXJQYXJhbWV0ZXJzKCkge1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoIHRoaXMucGFyYW1ldGVycyApICkge1xyXG5cclxuXHRcdFx0dGhpcy5kZWxldGVQYXJhbWV0ZXIoIG5hbWUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2FsbHMgYSBmdW5jdGlvbiBmcm9tIHRoZSBzY3JpcHQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBmdW5jdGlvbiBuYW1lLlxyXG5cdCAqIEBwYXJhbSB7Li4uYW55fSBwYXJhbXMgLSBBIGxpc3Qgb2YgcGFyYW1ldGVycy5cclxuXHQgKiBAcmV0dXJuIHthbnl9IFRoZSByZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwuXHJcblx0ICovXHJcblx0Y2FsbCggbmFtZSwgLi4ucGFyYW1zICkge1xyXG5cclxuXHRcdGNvbnN0IG9iamVjdCA9IHRoaXMuZ2V0T2JqZWN0KCk7XHJcblx0XHRjb25zdCBtZXRob2QgPSBvYmplY3RbIG5hbWUgXTtcclxuXHJcblx0XHRpZiAoIHR5cGVvZiBtZXRob2QgPT09ICdmdW5jdGlvbicgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gbWV0aG9kKCAuLi5wYXJhbXMgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQXN5bmNocm9ub3VzbHkgY2FsbHMgYSBmdW5jdGlvbiBmcm9tIHRoZSBzY3JpcHQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBmdW5jdGlvbiBuYW1lLlxyXG5cdCAqIEBwYXJhbSB7Li4uYW55fSBwYXJhbXMgLSBBIGxpc3Qgb2YgcGFyYW1ldGVycy5cclxuXHQgKiBAcmV0dXJuIHtQcm9taXNlPGFueT59IFRoZSByZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwuXHJcblx0ICovXHJcblx0YXN5bmMgY2FsbEFzeW5jKCBuYW1lLCAuLi5wYXJhbXMgKSB7XHJcblxyXG5cdFx0Y29uc3Qgb2JqZWN0ID0gdGhpcy5nZXRPYmplY3QoKTtcclxuXHRcdGNvbnN0IG1ldGhvZCA9IG9iamVjdFsgbmFtZSBdO1xyXG5cclxuXHRcdGlmICggdHlwZW9mIG1ldGhvZCA9PT0gJ2Z1bmN0aW9uJyApIHtcclxuXHJcblx0XHRcdHJldHVybiBtZXRob2QuY29uc3RydWN0b3IubmFtZSA9PT0gJ0FzeW5jRnVuY3Rpb24nID8gYXdhaXQgbWV0aG9kKCAuLi5wYXJhbXMgKSA6IG1ldGhvZCggLi4ucGFyYW1zICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE92ZXJ3cml0dGVuIHNpbmNlIHRoZSBub2RlIHR5cGVzIGlzIGluZmVycmVkIGZyb20gdGhlIHNjcmlwdCdzIG91dHB1dC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXJcclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBub2RlIHR5cGUuXHJcblx0ICovXHJcblx0Z2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZ2V0RGVmYXVsdE91dHB1dE5vZGUoKS5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlZnJlc2hlcyB0aGUgc2NyaXB0IG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gez9zdHJpbmd9IFtvdXRwdXQ9bnVsbF0gLSBBbiBvcHRpb25hbCBvdXRwdXQuXHJcblx0ICovXHJcblx0cmVmcmVzaCggb3V0cHV0ID0gbnVsbCApIHtcclxuXHJcblx0XHRpZiAoIG91dHB1dCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuZ2V0T3V0cHV0KCBvdXRwdXQgKS5yZWZyZXNoKCk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHRoaXMuX3JlZnJlc2goKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhbiBvYmplY3QgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNjcmlwdC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge09iamVjdH0gVGhlIHJlc3VsdCBvYmplY3QuXHJcblx0ICovXHJcblx0Z2V0T2JqZWN0KCkge1xyXG5cclxuXHRcdGlmICggdGhpcy5uZWVkc1VwZGF0ZSApIHRoaXMuZGlzcG9zZSgpO1xyXG5cdFx0aWYgKCB0aGlzLl9vYmplY3QgIT09IG51bGwgKSByZXR1cm4gdGhpcy5fb2JqZWN0O1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0Y29uc3QgcmVmcmVzaCA9ICgpID0+IHRoaXMucmVmcmVzaCgpO1xyXG5cdFx0Y29uc3Qgc2V0T3V0cHV0ID0gKCBpZCwgdmFsdWUgKSA9PiB0aGlzLnNldE91dHB1dCggaWQsIHZhbHVlICk7XHJcblxyXG5cdFx0Y29uc3QgcGFyYW1ldGVycyA9IG5ldyBQYXJhbWV0ZXJzKCB0aGlzICk7XHJcblxyXG5cdFx0Y29uc3QgVEhSRUUgPSBTY3JpcHRhYmxlTm9kZVJlc291cmNlcy5nZXQoICdUSFJFRScgKTtcclxuXHRcdGNvbnN0IFRTTCA9IFNjcmlwdGFibGVOb2RlUmVzb3VyY2VzLmdldCggJ1RTTCcgKTtcclxuXHJcblx0XHRjb25zdCBtZXRob2QgPSB0aGlzLmdldE1ldGhvZCgpO1xyXG5cdFx0Y29uc3QgcGFyYW1zID0gWyBwYXJhbWV0ZXJzLCB0aGlzLl9sb2NhbCwgU2NyaXB0YWJsZU5vZGVSZXNvdXJjZXMsIHJlZnJlc2gsIHNldE91dHB1dCwgVEhSRUUsIFRTTCBdO1xyXG5cclxuXHRcdHRoaXMuX29iamVjdCA9IG1ldGhvZCggLi4ucGFyYW1zICk7XHJcblxyXG5cdFx0Y29uc3QgbGF5b3V0ID0gdGhpcy5fb2JqZWN0LmxheW91dDtcclxuXHJcblx0XHRpZiAoIGxheW91dCApIHtcclxuXHJcblx0XHRcdGlmICggbGF5b3V0LmNhY2hlID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5fbG9jYWwuY2xlYXIoKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIGRlZmF1bHQgb3V0cHV0XHJcblx0XHRcdHRoaXMuX291dHB1dC5vdXRwdXRUeXBlID0gbGF5b3V0Lm91dHB1dFR5cGUgfHwgbnVsbDtcclxuXHJcblx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggbGF5b3V0LmVsZW1lbnRzICkgKSB7XHJcblxyXG5cdFx0XHRcdGZvciAoIGNvbnN0IGVsZW1lbnQgb2YgbGF5b3V0LmVsZW1lbnRzICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGlkID0gZWxlbWVudC5pZCB8fCBlbGVtZW50Lm5hbWU7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBlbGVtZW50LmlucHV0VHlwZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggdGhpcy5nZXRQYXJhbWV0ZXIoIGlkICkgPT09IHVuZGVmaW5lZCApIHRoaXMuc2V0UGFyYW1ldGVyKCBpZCwgbnVsbCApO1xyXG5cclxuXHRcdFx0XHRcdFx0dGhpcy5nZXRQYXJhbWV0ZXIoIGlkICkuaW5wdXRUeXBlID0gZWxlbWVudC5pbnB1dFR5cGU7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGlmICggZWxlbWVudC5vdXRwdXRUeXBlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCB0aGlzLmdldE91dHB1dCggaWQgKSA9PT0gdW5kZWZpbmVkICkgdGhpcy5zZXRPdXRwdXQoIGlkLCBudWxsICk7XHJcblxyXG5cdFx0XHRcdFx0XHR0aGlzLmdldE91dHB1dCggaWQgKS5vdXRwdXRUeXBlID0gZWxlbWVudC5vdXRwdXRUeXBlO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fb2JqZWN0O1xyXG5cclxuXHR9XHJcblxyXG5cdGRlc2VyaWFsaXplKCBkYXRhICkge1xyXG5cclxuXHRcdHN1cGVyLmRlc2VyaWFsaXplKCBkYXRhICk7XHJcblxyXG5cdFx0Zm9yICggY29uc3QgbmFtZSBpbiB0aGlzLnBhcmFtZXRlcnMgKSB7XHJcblxyXG5cdFx0XHRsZXQgdmFsdWVOb2RlID0gdGhpcy5wYXJhbWV0ZXJzWyBuYW1lIF07XHJcblxyXG5cdFx0XHRpZiAoIHZhbHVlTm9kZS5pc1NjcmlwdGFibGVOb2RlICkgdmFsdWVOb2RlID0gdmFsdWVOb2RlLmdldERlZmF1bHRPdXRwdXQoKTtcclxuXHJcblx0XHRcdHZhbHVlTm9kZS5ldmVudHMuYWRkRXZlbnRMaXN0ZW5lciggJ3JlZnJlc2gnLCB0aGlzLm9uUmVmcmVzaCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBsYXlvdXQgb2YgdGhlIHNjcmlwdC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge09iamVjdH0gVGhlIHNjcmlwdCdzIGxheW91dC5cclxuXHQgKi9cclxuXHRnZXRMYXlvdXQoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZ2V0T2JqZWN0KCkubGF5b3V0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgZGVmYXVsdCBub2RlIG91dHB1dCBvZiB0aGUgc2NyaXB0LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Tm9kZX0gVGhlIGRlZmF1bHQgbm9kZSBvdXRwdXQuXHJcblx0ICovXHJcblx0Z2V0RGVmYXVsdE91dHB1dE5vZGUoKSB7XHJcblxyXG5cdFx0Y29uc3Qgb3V0cHV0ID0gdGhpcy5nZXREZWZhdWx0T3V0cHV0KCkudmFsdWU7XHJcblxyXG5cdFx0aWYgKCBvdXRwdXQgJiYgb3V0cHV0LmlzTm9kZSApIHtcclxuXHJcblx0XHRcdHJldHVybiBvdXRwdXQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBmbG9hdCgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgZGVmYXVsdCBvdXRwdXQgb2YgdGhlIHNjcmlwdC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1NjcmlwdGFibGVWYWx1ZU5vZGV9IFRoZSBkZWZhdWx0IG91dHB1dC5cclxuXHQgKi9cclxuXHRnZXREZWZhdWx0T3V0cHV0KClcdHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fZXhlYygpLl9vdXRwdXQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIGZ1bmN0aW9uIGNyZWF0ZWQgZnJvbSB0aGUgbm9kZSdzIHNjcmlwdC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgZnVuY3Rpb24gcmVwcmVzZW50aW5nIHRoZSBub2RlJ3MgY29kZS5cclxuXHQgKi9cclxuXHRnZXRNZXRob2QoKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5lZWRzVXBkYXRlICkgdGhpcy5kaXNwb3NlKCk7XHJcblx0XHRpZiAoIHRoaXMuX21ldGhvZCAhPT0gbnVsbCApIHJldHVybiB0aGlzLl9tZXRob2Q7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCBwYXJhbWV0ZXJzUHJvcHMgPSBbICdwYXJhbWV0ZXJzJywgJ2xvY2FsJywgJ2dsb2JhbCcsICdyZWZyZXNoJywgJ3NldE91dHB1dCcsICdUSFJFRScsICdUU0wnIF07XHJcblx0XHRjb25zdCBpbnRlcmZhY2VQcm9wcyA9IFsgJ2xheW91dCcsICdpbml0JywgJ21haW4nLCAnZGlzcG9zZScgXTtcclxuXHJcblx0XHRjb25zdCBwcm9wZXJ0aWVzID0gaW50ZXJmYWNlUHJvcHMuam9pbiggJywgJyApO1xyXG5cdFx0Y29uc3QgZGVjbGFyYXRpb25zID0gJ3ZhciAnICsgcHJvcGVydGllcyArICc7IHZhciBvdXRwdXQgPSB7fTtcXG4nO1xyXG5cdFx0Y29uc3QgcmV0dXJucyA9ICdcXG5yZXR1cm4geyAuLi5vdXRwdXQsICcgKyBwcm9wZXJ0aWVzICsgJyB9Oyc7XHJcblxyXG5cdFx0Y29uc3QgY29kZSA9IGRlY2xhcmF0aW9ucyArIHRoaXMuY29kZU5vZGUuY29kZSArIHJldHVybnM7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHR0aGlzLl9tZXRob2QgPSBuZXcgRnVuY3Rpb24oIC4uLnBhcmFtZXRlcnNQcm9wcywgY29kZSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9tZXRob2Q7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRnJlZXMgYWxsIGludGVybmFsIHJlc291cmNlcy5cclxuXHQgKi9cclxuXHRkaXNwb3NlKCkge1xyXG5cclxuXHRcdGlmICggdGhpcy5fbWV0aG9kID09PSBudWxsICkgcmV0dXJuO1xyXG5cclxuXHRcdGlmICggdGhpcy5fb2JqZWN0ICYmIHR5cGVvZiB0aGlzLl9vYmplY3QuZGlzcG9zZSA9PT0gJ2Z1bmN0aW9uJyApIHtcclxuXHJcblx0XHRcdHRoaXMuX29iamVjdC5kaXNwb3NlKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuX21ldGhvZCA9IG51bGw7XHJcblx0XHR0aGlzLl9vYmplY3QgPSBudWxsO1xyXG5cdFx0dGhpcy5fc291cmNlID0gbnVsbDtcclxuXHRcdHRoaXMuX3ZhbHVlID0gbnVsbDtcclxuXHRcdHRoaXMuX25lZWRzT3V0cHV0VXBkYXRlID0gdHJ1ZTtcclxuXHRcdHRoaXMuX291dHB1dC52YWx1ZSA9IG51bGw7XHJcblx0XHR0aGlzLl9vdXRwdXRzID0ge307XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXAoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZ2V0RGVmYXVsdE91dHB1dE5vZGUoKTtcclxuXHJcblx0fVxyXG5cclxuXHRnZXRDYWNoZUtleSggZm9yY2UgKSB7XHJcblxyXG5cdFx0Y29uc3QgdmFsdWVzID0gWyBoYXNoU3RyaW5nKCB0aGlzLnNvdXJjZSApLCB0aGlzLmdldERlZmF1bHRPdXRwdXROb2RlKCkuZ2V0Q2FjaGVLZXkoIGZvcmNlICkgXTtcclxuXHJcblx0XHRmb3IgKCBjb25zdCBwYXJhbSBpbiB0aGlzLnBhcmFtZXRlcnMgKSB7XHJcblxyXG5cdFx0XHR2YWx1ZXMucHVzaCggdGhpcy5wYXJhbWV0ZXJzWyBwYXJhbSBdLmdldENhY2hlS2V5KCBmb3JjZSApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBoYXNoQXJyYXkoIHZhbHVlcyApO1xyXG5cclxuXHR9XHJcblxyXG5cdHNldCBuZWVkc1VwZGF0ZSggdmFsdWUgKSB7XHJcblxyXG5cdFx0aWYgKCB2YWx1ZSA9PT0gdHJ1ZSApIHRoaXMuZGlzcG9zZSgpO1xyXG5cclxuXHR9XHJcblxyXG5cdGdldCBuZWVkc1VwZGF0ZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5zb3VyY2UgIT09IHRoaXMuX3NvdXJjZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFeGVjdXRlcyB0aGUgYG1haW5gIGZ1bmN0aW9uIG9mIHRoZSBzY3JpcHQuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEByZXR1cm4ge1NjcmlwdGFibGVOb2RlfSBBIHJlZmVyZW5jZSB0byB0aGlzIG5vZGUuXHJcblx0ICovXHJcblx0X2V4ZWMoKVx0e1xyXG5cclxuXHRcdGlmICggdGhpcy5jb2RlTm9kZSA9PT0gbnVsbCApIHJldHVybiB0aGlzO1xyXG5cclxuXHRcdGlmICggdGhpcy5fbmVlZHNPdXRwdXRVcGRhdGUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHR0aGlzLl92YWx1ZSA9IHRoaXMuY2FsbCggJ21haW4nICk7XHJcblxyXG5cdFx0XHR0aGlzLl9uZWVkc091dHB1dFVwZGF0ZSA9IGZhbHNlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLl9vdXRwdXQudmFsdWUgPSB0aGlzLl92YWx1ZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFeGVjdXRlcyB0aGUgcmVmcmVzaC5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICovXHJcblx0X3JlZnJlc2goKSB7XHJcblxyXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy5fZXhlYygpO1xyXG5cclxuXHRcdHRoaXMuX291dHB1dC5yZWZyZXNoKCk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFNjcmlwdGFibGVOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSBzY3JpcHRhYmxlIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Q29kZU5vZGV9IFtjb2RlTm9kZV0gLSBUaGUgY29kZSBub2RlLlxyXG4gKiBAcGFyYW0gez9PYmplY3R9IFtwYXJhbWV0ZXJzPXt9XSAtIFRoZSBwYXJhbWV0ZXJzIGRlZmluaXRpb24uXHJcbiAqIEByZXR1cm5zIHtTY3JpcHRhYmxlTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBzY3JpcHRhYmxlID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIFNjcmlwdGFibGVOb2RlICkuc2V0UGFyYW1ldGVyTGVuZ3RoKCAxLCAyICk7XHJcbiIsImltcG9ydCB7IHBvc2l0aW9uVmlldyB9IGZyb20gJy4uL2FjY2Vzc29ycy9Qb3NpdGlvbi5qcyc7XHJcbmltcG9ydCB7IHNtb290aHN0ZXAgfSBmcm9tICcuLi9tYXRoL01hdGhOb2RlLmpzJztcclxuaW1wb3J0IHsgRm4sIG91dHB1dCwgdmVjNCB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgbm9kZSB0aGF0IHJlcHJlc2VudHMgdGhlIGB6YCBjb29yZGluYXRlIGluIHZpZXcgc3BhY2VcclxuICogZm9yIHRoZSBjdXJyZW50IGZyYWdtZW50LiBJdCdzIGEgZGlmZmVyZW50IHJlcHJlc2VudGF0aW9uIG9mIHRoZVxyXG4gKiBkZWZhdWx0IGRlcHRoIHZhbHVlLlxyXG4gKlxyXG4gKiBUaGlzIHZhbHVlIGNhbiBiZSBwYXJ0IG9mIGEgY29tcHV0YXRpb24gdGhhdCBkZWZpbmVzIGhvdyB0aGUgZm9nXHJcbiAqIGRlbnNpdHkgaW5jcmVhc2VzIHdoZW4gbW92aW5nIGF3YXkgZnJvbSB0aGUgY2FtZXJhLlxyXG4gKlxyXG4gKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG4gKiBAcmV0dXJuIHtOb2RlfSBUaGUgdmlld1ogbm9kZS5cclxuICovXHJcbmZ1bmN0aW9uIGdldFZpZXdaTm9kZSggYnVpbGRlciApIHtcclxuXHJcblx0bGV0IHZpZXdaO1xyXG5cclxuXHRjb25zdCBnZXRWaWV3WiA9IGJ1aWxkZXIuY29udGV4dC5nZXRWaWV3WjtcclxuXHJcblx0aWYgKCBnZXRWaWV3WiAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdHZpZXdaID0gZ2V0Vmlld1ooIHRoaXMgKTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gKCB2aWV3WiB8fCBwb3NpdGlvblZpZXcueiApLm5lZ2F0ZSgpO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIENvbnN0cnVjdHMgYSBuZXcgcmFuZ2UgZmFjdG9yIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZX0gbmVhciAtIERlZmluZXMgdGhlIG5lYXIgdmFsdWUuXHJcbiAqIEBwYXJhbSB7Tm9kZX0gZmFyIC0gRGVmaW5lcyB0aGUgZmFyIHZhbHVlLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHJhbmdlRm9nRmFjdG9yID0gRm4oICggWyBuZWFyLCBmYXIgXSwgYnVpbGRlciApID0+IHtcclxuXHJcblx0Y29uc3Qgdmlld1ogPSBnZXRWaWV3Wk5vZGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0cmV0dXJuIHNtb290aHN0ZXAoIG5lYXIsIGZhciwgdmlld1ogKTtcclxuXHJcbn0gKTtcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIGFuIGV4cG9uZW50aWFsIHNxdWFyZWQgZm9nLiBUaGlzIHR5cGUgb2YgZm9nIGdpdmVzXHJcbiAqIGEgY2xlYXIgdmlldyBuZWFyIHRoZSBjYW1lcmEgYW5kIGEgZmFzdGVyIHRoYW4gZXhwb25lbnRpYWxseVxyXG4gKiBkZW5zZW5pbmcgZm9nIGZhcnRoZXIgZnJvbSB0aGUgY2FtZXJhLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IGRlbnNpdHkgLSBEZWZpbmVzIHRoZSBmb2cgZGVuc2l0eS5cclxuICovXHJcbmV4cG9ydCBjb25zdCBkZW5zaXR5Rm9nRmFjdG9yID0gRm4oICggWyBkZW5zaXR5IF0sIGJ1aWxkZXIgKSA9PiB7XHJcblxyXG5cdGNvbnN0IHZpZXdaID0gZ2V0Vmlld1pOb2RlKCBidWlsZGVyICk7XHJcblxyXG5cdHJldHVybiBkZW5zaXR5Lm11bCggZGVuc2l0eSwgdmlld1osIHZpZXdaICkubmVnYXRlKCkuZXhwKCkub25lTWludXMoKTtcclxuXHJcbn0gKTtcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIHRvIGNvbmZpZ3VyZSBhIGZvZyBmb3IgdGhlIHNjZW5lLlxyXG4gKiBOb2RlcyBvZiB0aGlzIHR5cGUgYXJlIGFzc2lnbmVkIHRvIGBTY2VuZS5mb2dOb2RlYC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlfSBjb2xvciAtIERlZmluZXMgdGhlIGNvbG9yIG9mIHRoZSBmb2cuXHJcbiAqIEBwYXJhbSB7Tm9kZX0gZmFjdG9yIC0gRGVmaW5lcyBob3cgdGhlIGZvZyBpcyBmYWN0b3JlZCBpbiB0aGUgc2NlbmUuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZm9nID0gRm4oICggWyBjb2xvciwgZmFjdG9yIF0gKSA9PiB7XHJcblxyXG5cdHJldHVybiB2ZWM0KCBmYWN0b3IudG9GbG9hdCgpLm1peCggb3V0cHV0LnJnYiwgY29sb3IudG9WZWMzKCkgKSwgb3V0cHV0LmEgKTtcclxuXHJcbn0gKTtcclxuXHJcbi8vIERlcHJlY2F0ZWRcclxuXHJcbi8qKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAZGVwcmVjYXRlZCBzaW5jZSByMTcxLiBVc2UgYGZvZyggY29sb3IsIHJhbmdlRm9nRmFjdG9yKCBuZWFyLCBmYXIgKSApYCBpbnN0ZWFkLlxyXG4gKlxyXG4gKiBAcGFyYW0ge05vZGV9IGNvbG9yXHJcbiAqIEBwYXJhbSB7Tm9kZX0gbmVhclxyXG4gKiBAcGFyYW0ge05vZGV9IGZhclxyXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcmFuZ2VGb2coIGNvbG9yLCBuZWFyLCBmYXIgKSB7IC8vIEBkZXByZWNhdGVkLCByMTcxXHJcblxyXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlRTTDogXCJyYW5nZUZvZyggY29sb3IsIG5lYXIsIGZhciApXCIgaXMgZGVwcmVjYXRlZC4gVXNlIFwiZm9nKCBjb2xvciwgcmFuZ2VGb2dGYWN0b3IoIG5lYXIsIGZhciApIClcIiBpbnN0ZWFkLicgKTtcclxuXHRyZXR1cm4gZm9nKCBjb2xvciwgcmFuZ2VGb2dGYWN0b3IoIG5lYXIsIGZhciApICk7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQGRlcHJlY2F0ZWQgc2luY2UgcjE3MS4gVXNlIGBmb2coIGNvbG9yLCBkZW5zaXR5Rm9nRmFjdG9yKCBkZW5zaXR5ICkgKWAgaW5zdGVhZC5cclxuICpcclxuICogQHBhcmFtIHtOb2RlfSBjb2xvclxyXG4gKiBAcGFyYW0ge05vZGV9IGRlbnNpdHlcclxuICogQHJldHVybnMge0Z1bmN0aW9ufVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGRlbnNpdHlGb2coIGNvbG9yLCBkZW5zaXR5ICkgeyAvLyBAZGVwcmVjYXRlZCwgcjE3MVxyXG5cclxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5UU0w6IFwiZGVuc2l0eUZvZyggY29sb3IsIGRlbnNpdHkgKVwiIGlzIGRlcHJlY2F0ZWQuIFVzZSBcImZvZyggY29sb3IsIGRlbnNpdHlGb2dGYWN0b3IoIGRlbnNpdHkgKSApXCIgaW5zdGVhZC4nICk7XHJcblx0cmV0dXJuIGZvZyggY29sb3IsIGRlbnNpdHlGb2dGYWN0b3IoIGRlbnNpdHkgKSApO1xyXG5cclxufVxyXG4iLCJpbXBvcnQgTm9kZSBmcm9tICcuLi9jb3JlL05vZGUuanMnO1xyXG5pbXBvcnQgeyBnZXRWYWx1ZVR5cGUgfSBmcm9tICcuLi9jb3JlL05vZGVVdGlscy5qcyc7XHJcbmltcG9ydCB7IGJ1ZmZlciB9IGZyb20gJy4uL2FjY2Vzc29ycy9CdWZmZXJOb2RlLmpzJztcclxuaW1wb3J0IHsgaW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vYWNjZXNzb3JzL0J1ZmZlckF0dHJpYnV0ZU5vZGUuanMnO1xyXG5pbXBvcnQgeyBpbnN0YW5jZUluZGV4IH0gZnJvbSAnLi4vY29yZS9JbmRleE5vZGUuanMnO1xyXG5pbXBvcnQgeyBub2RlUHJveHksIGZsb2F0IH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5cclxuaW1wb3J0IHsgVmVjdG9yNCB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yNC5qcyc7XHJcbmltcG9ydCB7IE1hdGhVdGlscyB9IGZyb20gJy4uLy4uL21hdGgvTWF0aFV0aWxzLmpzJztcclxuaW1wb3J0IHsgSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlIH0gZnJvbSAnLi4vLi4vY29yZS9JbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUuanMnO1xyXG5cclxubGV0IG1pbiA9IG51bGw7XHJcbmxldCBtYXggPSBudWxsO1xyXG5cclxuLyoqXHJcbiAqIGBSYW5nZU5vZGVgIGdlbmVyYXRlcyByYW5kb20gaW5zdGFuY2VkIGF0dHJpYnV0ZSBkYXRhIGluIGEgZGVmaW5lZCByYW5nZS5cclxuICogQW4gZXhlbXBsYXJ5IHVzZSBjYXNlIGZvciB0aGlzIHV0aWxpdHkgbm9kZSBpcyB0byBnZW5lcmF0ZSByYW5kb20gcGVyLWluc3RhbmNlXHJcbiAqIGNvbG9yczpcclxuICogYGBganNcclxuICogY29uc3QgbWF0ZXJpYWwgPSBuZXcgTWVzaEJhc2ljTm9kZU1hdGVyaWFsKCk7XHJcbiAqIG1hdGVyaWFsLmNvbG9yTm9kZSA9IHJhbmdlKCBuZXcgQ29sb3IoIDB4MDAwMDAwICksIG5ldyBDb2xvciggMHhGRkZGRkYgKSApO1xyXG4gKiBjb25zdCBtZXNoID0gbmV3IEluc3RhbmNlZE1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCwgY291bnQgKTtcclxuICogYGBgXHJcbiAqIEBhdWdtZW50cyBOb2RlXHJcbiAqL1xyXG5jbGFzcyBSYW5nZU5vZGUgZXh0ZW5kcyBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnUmFuZ2VOb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHJhbmdlIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGU8YW55Pn0gW21pbk5vZGU9ZmxvYXQoKV0gLSBBIG5vZGUgZGVmaW5pbmcgdGhlIGxvd2VyIGJvdW5kIG9mIHRoZSByYW5nZS5cclxuXHQgKiBAcGFyYW0ge05vZGU8YW55Pn0gW21heE5vZGU9ZmxvYXQoKV0gLSBBIG5vZGUgZGVmaW5pbmcgdGhlIHVwcGVyIGJvdW5kIG9mIHRoZSByYW5nZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbWluTm9kZSA9IGZsb2F0KCksIG1heE5vZGUgPSBmbG9hdCgpICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiAgQSBub2RlIGRlZmluaW5nIHRoZSBsb3dlciBib3VuZCBvZiB0aGUgcmFuZ2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGU8YW55Pn1cclxuXHRcdCAqIEBkZWZhdWx0IGZsb2F0KClcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5taW5Ob2RlID0gbWluTm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqICBBIG5vZGUgZGVmaW5pbmcgdGhlIHVwcGVyIGJvdW5kIG9mIHRoZSByYW5nZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZTxhbnk+fVxyXG5cdFx0ICogQGRlZmF1bHQgZmxvYXQoKVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1heE5vZGUgPSBtYXhOb2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHZlY3RvciBsZW5ndGggd2hpY2ggaXMgY29tcHV0ZWQgYmFzZWQgb24gdGhlIHJhbmdlIGRlZmluaXRpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIHZlY3RvciBsZW5ndGguXHJcblx0ICovXHJcblx0Z2V0VmVjdG9yTGVuZ3RoKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IG1pbkxlbmd0aCA9IGJ1aWxkZXIuZ2V0VHlwZUxlbmd0aCggZ2V0VmFsdWVUeXBlKCB0aGlzLm1pbk5vZGUudmFsdWUgKSApO1xyXG5cdFx0Y29uc3QgbWF4TGVuZ3RoID0gYnVpbGRlci5nZXRUeXBlTGVuZ3RoKCBnZXRWYWx1ZVR5cGUoIHRoaXMubWF4Tm9kZS52YWx1ZSApICk7XHJcblxyXG5cdFx0cmV0dXJuIG1pbkxlbmd0aCA+IG1heExlbmd0aCA/IG1pbkxlbmd0aCA6IG1heExlbmd0aDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyBvdmVyd3JpdHRlbiBzaW5jZSB0aGUgbm9kZSB0eXBlIGlzIGluZmVycmVkIGZyb20gcmFuZ2UgZGVmaW5pdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgbm9kZSB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldE5vZGVUeXBlKCBidWlsZGVyICkge1xyXG5cclxuXHRcdHJldHVybiBidWlsZGVyLm9iamVjdC5jb3VudCA+IDEgPyBidWlsZGVyLmdldFR5cGVGcm9tTGVuZ3RoKCB0aGlzLmdldFZlY3Rvckxlbmd0aCggYnVpbGRlciApICkgOiAnZmxvYXQnO1xyXG5cclxuXHR9XHJcblxyXG5cdHNldHVwKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IG9iamVjdCA9IGJ1aWxkZXIub2JqZWN0O1xyXG5cclxuXHRcdGxldCBvdXRwdXQgPSBudWxsO1xyXG5cclxuXHRcdGlmICggb2JqZWN0LmNvdW50ID4gMSApIHtcclxuXHJcblx0XHRcdGNvbnN0IG1pblZhbHVlID0gdGhpcy5taW5Ob2RlLnZhbHVlO1xyXG5cdFx0XHRjb25zdCBtYXhWYWx1ZSA9IHRoaXMubWF4Tm9kZS52YWx1ZTtcclxuXHJcblx0XHRcdGNvbnN0IG1pbkxlbmd0aCA9IGJ1aWxkZXIuZ2V0VHlwZUxlbmd0aCggZ2V0VmFsdWVUeXBlKCBtaW5WYWx1ZSApICk7XHJcblx0XHRcdGNvbnN0IG1heExlbmd0aCA9IGJ1aWxkZXIuZ2V0VHlwZUxlbmd0aCggZ2V0VmFsdWVUeXBlKCBtYXhWYWx1ZSApICk7XHJcblxyXG5cdFx0XHRtaW4gPSBtaW4gfHwgbmV3IFZlY3RvcjQoKTtcclxuXHRcdFx0bWF4ID0gbWF4IHx8IG5ldyBWZWN0b3I0KCk7XHJcblxyXG5cdFx0XHRtaW4uc2V0U2NhbGFyKCAwICk7XHJcblx0XHRcdG1heC5zZXRTY2FsYXIoIDAgKTtcclxuXHJcblx0XHRcdGlmICggbWluTGVuZ3RoID09PSAxICkgbWluLnNldFNjYWxhciggbWluVmFsdWUgKTtcclxuXHRcdFx0ZWxzZSBpZiAoIG1pblZhbHVlLmlzQ29sb3IgKSBtaW4uc2V0KCBtaW5WYWx1ZS5yLCBtaW5WYWx1ZS5nLCBtaW5WYWx1ZS5iLCAxICk7XHJcblx0XHRcdGVsc2UgbWluLnNldCggbWluVmFsdWUueCwgbWluVmFsdWUueSwgbWluVmFsdWUueiB8fCAwLCBtaW5WYWx1ZS53IHx8IDAgKTtcclxuXHJcblx0XHRcdGlmICggbWF4TGVuZ3RoID09PSAxICkgbWF4LnNldFNjYWxhciggbWF4VmFsdWUgKTtcclxuXHRcdFx0ZWxzZSBpZiAoIG1heFZhbHVlLmlzQ29sb3IgKSBtYXguc2V0KCBtYXhWYWx1ZS5yLCBtYXhWYWx1ZS5nLCBtYXhWYWx1ZS5iLCAxICk7XHJcblx0XHRcdGVsc2UgbWF4LnNldCggbWF4VmFsdWUueCwgbWF4VmFsdWUueSwgbWF4VmFsdWUueiB8fCAwLCBtYXhWYWx1ZS53IHx8IDAgKTtcclxuXHJcblx0XHRcdGNvbnN0IHN0cmlkZSA9IDQ7XHJcblxyXG5cdFx0XHRjb25zdCBsZW5ndGggPSBzdHJpZGUgKiBvYmplY3QuY291bnQ7XHJcblx0XHRcdGNvbnN0IGFycmF5ID0gbmV3IEZsb2F0MzJBcnJheSggbGVuZ3RoICk7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGluZGV4ID0gaSAlIHN0cmlkZTtcclxuXHJcblx0XHRcdFx0Y29uc3QgbWluRWxlbWVudFZhbHVlID0gbWluLmdldENvbXBvbmVudCggaW5kZXggKTtcclxuXHRcdFx0XHRjb25zdCBtYXhFbGVtZW50VmFsdWUgPSBtYXguZ2V0Q29tcG9uZW50KCBpbmRleCApO1xyXG5cclxuXHRcdFx0XHRhcnJheVsgaSBdID0gTWF0aFV0aWxzLmxlcnAoIG1pbkVsZW1lbnRWYWx1ZSwgbWF4RWxlbWVudFZhbHVlLCBNYXRoLnJhbmRvbSgpICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBub2RlVHlwZSA9IHRoaXMuZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRcdGlmICggb2JqZWN0LmNvdW50IDw9IDQwOTYgKSB7XHJcblxyXG5cdFx0XHRcdG91dHB1dCA9IGJ1ZmZlciggYXJyYXksICd2ZWM0Jywgb2JqZWN0LmNvdW50ICkuZWxlbWVudCggaW5zdGFuY2VJbmRleCApLmNvbnZlcnQoIG5vZGVUeXBlICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHQvLyBUT0RPOiBJbXByb3ZlIGFub255bW91cyBidWZmZXIgYXR0cmlidXRlIGNyZWF0aW9uIHJlbW92aW5nIHRoaXMgcGFydFxyXG5cdFx0XHRcdGNvbnN0IGJ1ZmZlckF0dHJpYnV0ZSA9IG5ldyBJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCA0ICk7XHJcblx0XHRcdFx0YnVpbGRlci5nZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdfX3JhbmdlJyArIHRoaXMuaWQsIGJ1ZmZlckF0dHJpYnV0ZSApO1xyXG5cclxuXHRcdFx0XHRvdXRwdXQgPSBpbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUoIGJ1ZmZlckF0dHJpYnV0ZSApLmNvbnZlcnQoIG5vZGVUeXBlICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdG91dHB1dCA9IGZsb2F0KCAwICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBvdXRwdXQ7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFJhbmdlTm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgcmFuZ2Ugbm9kZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlPGFueT59IFttaW5Ob2RlPWZsb2F0KCldIC0gQSBub2RlIGRlZmluaW5nIHRoZSBsb3dlciBib3VuZCBvZiB0aGUgcmFuZ2UuXHJcbiAqIEBwYXJhbSB7Tm9kZTxhbnk+fSBbbWF4Tm9kZT1mbG9hdCgpXSAtIEEgbm9kZSBkZWZpbmluZyB0aGUgdXBwZXIgYm91bmQgb2YgdGhlIHJhbmdlLlxyXG4gKiBAcmV0dXJucyB7UmFuZ2VOb2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHJhbmdlID0gLypAX19QVVJFX18qLyBub2RlUHJveHkoIFJhbmdlTm9kZSApLnNldFBhcmFtZXRlckxlbmd0aCggMiApO1xyXG4iLCJpbXBvcnQgTm9kZSBmcm9tICcuLi9jb3JlL05vZGUuanMnO1xyXG5pbXBvcnQgeyBub2RlT2JqZWN0IH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5cclxuLyoqXHJcbiAqIGBDb21wdXRlQnVpbHRpbk5vZGVgIHJlcHJlc2VudHMgYSBjb21wdXRlLXNjb3BlIGJ1aWx0aW4gdmFsdWUgdGhhdCBleHBvc2UgaW5mb3JtYXRpb25cclxuICogYWJvdXQgdGhlIGN1cnJlbnRseSBydW5uaW5nIGRpc3BhdGNoIGFuZC9vciB0aGUgZGV2aWNlIGl0IGlzIHJ1bm5pbmcgb24uXHJcbiAqXHJcbiAqIFRoaXMgbm9kZSBjYW4gb25seSBiZSB1c2VkIHdpdGggYSBXZWJHUFUgYmFja2VuZC5cclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVcclxuICovXHJcbmNsYXNzIENvbXB1dGVCdWlsdGluTm9kZSBleHRlbmRzIE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdDb21wdXRlQnVpbHRpbk5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgY29tcHV0ZSBidWlsdGluIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gYnVpbHRpbk5hbWUgLSBUaGUgYnVpbHQtaW4gbmFtZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbm9kZVR5cGUgLSBUaGUgbm9kZSB0eXBlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBidWlsdGluTmFtZSwgbm9kZVR5cGUgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5vZGVUeXBlICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYnVpbHQtaW4gbmFtZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fYnVpbHRpbk5hbWUgPSBidWlsdGluTmFtZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyBvdmVyd3JpdHRlbiBzaW5jZSBoYXNoIGlzIGRlcml2ZWQgZnJvbSB0aGUgYnVpbHQtaW4gbmFtZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgaGFzaC5cclxuXHQgKi9cclxuXHRnZXRIYXNoKCBidWlsZGVyICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmdldEJ1aWx0aW5OYW1lKCBidWlsZGVyICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgaXMgb3ZlcndyaXR0ZW4gc2luY2UgdGhlIG5vZGUgdHlwZSBpcyBzaW1wbHkgZGVyaXZlZCBmcm9tIGBub2RlVHlwZWAuLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBub2RlIHR5cGUuXHJcblx0ICovXHJcblx0Z2V0Tm9kZVR5cGUoIC8qYnVpbGRlciovICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm5vZGVUeXBlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGJ1aWx0aW4gbmFtZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBidWlsdGluTmFtZSAtIFRoZSBidWlsdC1pbiBuYW1lLlxyXG5cdCAqIEByZXR1cm4ge0NvbXB1dGVCdWlsdGluTm9kZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBub2RlLlxyXG5cdCAqL1xyXG5cdHNldEJ1aWx0aW5OYW1lKCBidWlsdGluTmFtZSApIHtcclxuXHJcblx0XHR0aGlzLl9idWlsdGluTmFtZSA9IGJ1aWx0aW5OYW1lO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGJ1aWx0aW4gbmFtZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgYnVpbHRpbiBuYW1lLlxyXG5cdCAqL1xyXG5cdGdldEJ1aWx0aW5OYW1lKCAvKmJ1aWxkZXIqLyApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fYnVpbHRpbk5hbWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogV2hldGhlciB0aGUgY3VycmVudCBub2RlIGJ1aWxkZXIgaGFzIHRoZSBidWlsdGluIG9yIG5vdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgYnVpbGRlciBoYXMgdGhlIGJ1aWx0aW4gb3Igbm90LlxyXG5cdCAqL1xyXG5cdGhhc0J1aWx0aW4oIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIGJ1aWxkZXIuaGFzQnVpbHRpbiggdGhpcy5fYnVpbHRpbk5hbWUgKTtcclxuXHJcblx0fVxyXG5cclxuXHRnZW5lcmF0ZSggYnVpbGRlciwgb3V0cHV0ICkge1xyXG5cclxuXHRcdGNvbnN0IGJ1aWx0aW5OYW1lID0gdGhpcy5nZXRCdWlsdGluTmFtZSggYnVpbGRlciApO1xyXG5cdFx0Y29uc3Qgbm9kZVR5cGUgPSB0aGlzLmdldE5vZGVUeXBlKCBidWlsZGVyICk7XHJcblxyXG5cdFx0aWYgKCBidWlsZGVyLnNoYWRlclN0YWdlID09PSAnY29tcHV0ZScgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gYnVpbGRlci5mb3JtYXQoIGJ1aWx0aW5OYW1lLCBub2RlVHlwZSwgb3V0cHV0ICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGNvbnNvbGUud2FybiggYENvbXB1dGVCdWlsdGluTm9kZTogQ29tcHV0ZSBidWlsdC1pbiB2YWx1ZSAke2J1aWx0aW5OYW1lfSBjYW4gbm90IGJlIGFjY2Vzc2VkIGluIHRoZSAke2J1aWxkZXIuc2hhZGVyU3RhZ2V9IHN0YWdlYCApO1xyXG5cdFx0XHRyZXR1cm4gYnVpbGRlci5nZW5lcmF0ZUNvbnN0KCBub2RlVHlwZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRzZXJpYWxpemUoIGRhdGEgKSB7XHJcblxyXG5cdFx0c3VwZXIuc2VyaWFsaXplKCBkYXRhICk7XHJcblxyXG5cdFx0ZGF0YS5nbG9iYWwgPSB0aGlzLmdsb2JhbDtcclxuXHRcdGRhdGEuX2J1aWx0aW5OYW1lID0gdGhpcy5fYnVpbHRpbk5hbWU7XHJcblxyXG5cdH1cclxuXHJcblx0ZGVzZXJpYWxpemUoIGRhdGEgKSB7XHJcblxyXG5cdFx0c3VwZXIuZGVzZXJpYWxpemUoIGRhdGEgKTtcclxuXHJcblx0XHR0aGlzLmdsb2JhbCA9IGRhdGEuZ2xvYmFsO1xyXG5cdFx0dGhpcy5fYnVpbHRpbk5hbWUgPSBkYXRhLl9idWlsdGluTmFtZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQ29tcHV0ZUJ1aWx0aW5Ob2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSBjb21wdXRlIGJ1aWx0aW4gbm9kZS5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgYnVpbHQtaW4gbmFtZS5cclxuICogQHBhcmFtIHtzdHJpbmd9IG5vZGVUeXBlIC0gVGhlIG5vZGUgdHlwZS5cclxuICogQHJldHVybnMge0NvbXB1dGVCdWlsdGluTm9kZX1cclxuICovXHJcbmNvbnN0IGNvbXB1dGVCdWlsdGluID0gKCBuYW1lLCBub2RlVHlwZSApID0+IG5vZGVPYmplY3QoIG5ldyBDb21wdXRlQnVpbHRpbk5vZGUoIG5hbWUsIG5vZGVUeXBlICkgKTtcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIHRoZSBudW1iZXIgb2Ygd29ya2dyb3VwcyBkaXNwYXRjaGVkIGJ5IHRoZSBjb21wdXRlIHNoYWRlci5cclxuICogYGBganNcclxuICogLy8gUnVuIDUxMiBpbnZvY2F0aW9ucy90aHJlYWRzIHdpdGggYSB3b3JrZ3JvdXAgc2l6ZSBvZiAxMjguXHJcbiAqIGNvbnN0IGNvbXB1dGVGbiA9IEZuKCgpID0+IHtcclxuICpcclxuICogICAgIC8vIG51bVdvcmtncm91cHMueCA9IDRcclxuICogICAgIHN0b3JhZ2VCdWZmZXIuZWxlbWVudCgwKS5hc3NpZ24obnVtV29ya2dyb3Vwcy54KVxyXG4gKlxyXG4gKiB9KSgpLmNvbXB1dGUoNTEyLCBbMTI4XSk7XHJcbiAqXHJcbiAqIC8vIFJ1biA1MTIgaW52b2NhdGlvbnMvdGhyZWFkcyB3aXRoIHRoZSBkZWZhdWx0IHdvcmtncm91cCBzaXplIG9mIDY0LlxyXG4gKiBjb25zdCBjb21wdXRlRm4gPSBGbigoKSA9PiB7XHJcbiAqXHJcbiAqICAgICAvLyBudW1Xb3JrZ3JvdXBzLnggPSA4XHJcbiAqICAgICBzdG9yYWdlQnVmZmVyLmVsZW1lbnQoMCkuYXNzaWduKG51bVdvcmtncm91cHMueClcclxuICpcclxuICogfSkoKS5jb21wdXRlKDUxMik7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtDb21wdXRlQnVpbHRpbk5vZGU8dXZlYzM+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IG51bVdvcmtncm91cHMgPSAvKkBfX1BVUkVfXyovIGNvbXB1dGVCdWlsdGluKCAnbnVtV29ya2dyb3VwcycsICd1dmVjMycgKTtcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIHRoZSAzLWRpbWVuc2lvbmFsIGluZGV4IG9mIHRoZSB3b3JrZ3JvdXAgdGhlIGN1cnJlbnQgY29tcHV0ZSBpbnZvY2F0aW9uIGJlbG9uZ3MgdG8uXHJcbiAqIGBgYGpzXHJcbiAqIC8vIEV4ZWN1dGUgMTIgY29tcHV0ZSB0aHJlYWRzIHdpdGggYSB3b3JrZ3JvdXAgc2l6ZSBvZiAzLlxyXG4gKiBjb25zdCBjb21wdXRlRm4gPSBGbiggKCkgPT4ge1xyXG4gKlxyXG4gKiBcdElmKCB3b3JrZ3JvdXBJZC54Lm1vZCggMiApLmVxdWFsKCAwICksICgpID0+IHtcclxuICpcclxuICogXHRcdHN0b3JhZ2VCdWZmZXIuZWxlbWVudCggaW5zdGFuY2VJbmRleCApLmFzc2lnbiggaW5zdGFuY2VJbmRleCApO1xyXG4gKlxyXG4gKiBcdH0gKS5FbHNlKCAoKSA9PiB7XHJcbiAqXHJcbiAqIFx0XHRzdG9yYWdlQnVmZmVyLmVsZW1lbnQoIGluc3RhbmNlSW5kZXggKS5hc3NpZ24oIDAgKTtcclxuICpcclxuICogXHR9ICk7XHJcbiAqXHJcbiAqIH0gKSgpLmNvbXB1dGUoIDEyLCBbIDMgXSApO1xyXG4gKlxyXG4gKiAvLyB3b3JrZ3JvdXBJZC54ID0gIFswLCAwLCAwLCAxLCAxLCAxLCAyLCAyLCAyLCAzLCAzLCAzXTtcclxuICogLy8gQnVmZmVyIE91dHB1dCA9ICBbMCwgMSwgMiwgMCwgMCwgMCwgNiwgNywgOCwgMCwgMCwgMF07XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtDb21wdXRlQnVpbHRpbk5vZGU8dXZlYzM+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHdvcmtncm91cElkID0gLypAX19QVVJFX18qLyBjb21wdXRlQnVpbHRpbiggJ3dvcmtncm91cElkJywgJ3V2ZWMzJyApO1xyXG5cclxuLyoqXHJcbiAqIEEgbm9uLWxpbmVhcml6ZWQgMy1kaW1lbnNpb25hbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgY3VycmVudCBpbnZvY2F0aW9uJ3MgcG9zaXRpb24gd2l0aGluIGEgM0QgZ2xvYmFsIGdyaWQuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge0NvbXB1dGVCdWlsdGluTm9kZTx1dmVjMz59XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZ2xvYmFsSWQgPSAvKkBfX1BVUkVfXyovIGNvbXB1dGVCdWlsdGluKCAnZ2xvYmFsSWQnLCAndXZlYzMnICk7XHJcbi8qKlxyXG4gKiBBIG5vbi1saW5lYXJpemVkIDMtZGltZW5zaW9uYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGN1cnJlbnQgaW52b2NhdGlvbidzIHBvc2l0aW9uIHdpdGhpbiBhIDNEIHdvcmtncm91cCBncmlkLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEB0eXBlIHtDb21wdXRlQnVpbHRpbk5vZGU8dXZlYzM+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGxvY2FsSWQgPSAvKkBfX1BVUkVfXyovIGNvbXB1dGVCdWlsdGluKCAnbG9jYWxJZCcsICd1dmVjMycgKTtcclxuXHJcbi8qKlxyXG4gKiBBIGRldmljZSBkZXBlbmRlbnQgdmFyaWFibGUgdGhhdCBleHBvc2VzIHRoZSBzaXplIG9mIHRoZSBjdXJyZW50IGludm9jYXRpb24ncyBzdWJncm91cC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAdHlwZSB7Q29tcHV0ZUJ1aWx0aW5Ob2RlPHVpbnQ+fVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHN1Ymdyb3VwU2l6ZSA9IC8qQF9fUFVSRV9fKi8gY29tcHV0ZUJ1aWx0aW4oICdzdWJncm91cFNpemUnLCAndWludCcgKTtcclxuXHJcbiIsImltcG9ydCBOb2RlIGZyb20gJy4uL2NvcmUvTm9kZS5qcyc7XHJcbmltcG9ydCB7IG5vZGVQcm94eSB9IGZyb20gJy4uL3RzbC9UU0xDb3JlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIGEgR1BVIGNvbnRyb2wgYmFycmllciB0aGF0IHN5bmNocm9uaXplcyBjb21wdXRlIG9wZXJhdGlvbnMgd2l0aGluIGEgZ2l2ZW4gc2NvcGUuXHJcbiAqXHJcbiAqIFRoaXMgbm9kZSBjYW4gb25seSBiZSB1c2VkIHdpdGggYSBXZWJHUFUgYmFja2VuZC5cclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVcclxuICovXHJcbmNsYXNzIEJhcnJpZXJOb2RlIGV4dGVuZHMgTm9kZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYmFycmllciBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNjb3BlIC0gVGhlIHNjb3BlIGRlZmluZXMgdGhlIGJlaGF2aW9yIG9mIHRoZSBub2RlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBzY29wZSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdHRoaXMuc2NvcGUgPSBzY29wZTtcclxuXHJcblx0fVxyXG5cclxuXHRnZW5lcmF0ZSggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCB7IHNjb3BlIH0gPSB0aGlzO1xyXG5cdFx0Y29uc3QgeyByZW5kZXJlciB9ID0gYnVpbGRlcjtcclxuXHJcblx0XHRpZiAoIHJlbmRlcmVyLmJhY2tlbmQuaXNXZWJHTEJhY2tlbmQgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRidWlsZGVyLmFkZEZsb3dDb2RlKCBgXFx0Ly8gJHtzY29wZX1CYXJyaWVyIFxcbmAgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0YnVpbGRlci5hZGRMaW5lRmxvd0NvZGUoIGAke3Njb3BlfUJhcnJpZXIoKWAsIHRoaXMgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEJhcnJpZXJOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSBiYXJyaWVyIG5vZGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBzY29wZSAtIFRoZSBzY29wZSBkZWZpbmVzIHRoZSBiZWhhdmlvciBvZiB0aGUgbm9kZS4uXHJcbiAqIEByZXR1cm5zIHtCYXJyaWVyTm9kZX1cclxuICovXHJcbmNvbnN0IGJhcnJpZXIgPSBub2RlUHJveHkoIEJhcnJpZXJOb2RlICk7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIHdvcmtncm91cCBiYXJyaWVyLiBBbGwgY29tcHV0ZSBzaGFkZXJcclxuICogaW52b2NhdGlvbnMgbXVzdCB3YWl0IGZvciBlYWNoIGludm9jYXRpb24gd2l0aGluIGEgd29ya2dyb3VwIHRvXHJcbiAqIGNvbXBsZXRlIGJlZm9yZSB0aGUgYmFycmllciBjYW4gYmUgc3VycGFzc2VkLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcmV0dXJucyB7QmFycmllck5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgd29ya2dyb3VwQmFycmllciA9ICgpID0+IGJhcnJpZXIoICd3b3JrZ3JvdXAnICkuYXBwZW5kKCk7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIHN0b3JhZ2UgYmFycmllci4gQWxsIGludm9jYXRpb25zIG11c3RcclxuICogd2FpdCBmb3IgZWFjaCBhY2Nlc3MgdG8gdmFyaWFibGVzIHdpdGhpbiB0aGUgJ3N0b3JhZ2UnIGFkZHJlc3Mgc3BhY2VcclxuICogdG8gY29tcGxldGUgYmVmb3JlIHRoZSBiYXJyaWVyIGNhbiBiZSBwYXNzZWQuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEByZXR1cm5zIHtCYXJyaWVyTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBzdG9yYWdlQmFycmllciA9ICgpID0+IGJhcnJpZXIoICdzdG9yYWdlJyApLmFwcGVuZCgpO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSB0ZXh0dXJlIGJhcnJpZXIuIEFsbCBpbnZvY2F0aW9ucyBtdXN0XHJcbiAqIHdhaXQgZm9yIGVhY2ggYWNjZXNzIHRvIHZhcmlhYmxlcyB3aXRoaW4gdGhlICd0ZXh0dXJlJyBhZGRyZXNzIHNwYWNlXHJcbiAqIHRvIGNvbXBsZXRlIGJlZm9yZSB0aGUgYmFycmllciBjYW4gYmUgcGFzc2VkLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcmV0dXJucyB7QmFycmllck5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdGV4dHVyZUJhcnJpZXIgPSAoKSA9PiBiYXJyaWVyKCAndGV4dHVyZScgKS5hcHBlbmQoKTtcclxuXHJcbiIsImltcG9ydCBBcnJheUVsZW1lbnROb2RlIGZyb20gJy4uL3V0aWxzL0FycmF5RWxlbWVudE5vZGUuanMnO1xyXG5pbXBvcnQgeyBub2RlT2JqZWN0IH0gZnJvbSAnLi4vdHNsL1RTTENvcmUuanMnO1xyXG5pbXBvcnQgTm9kZSBmcm9tICcuLi9jb3JlL05vZGUuanMnO1xyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgYW4gZWxlbWVudCBvZiBhICd3b3JrZ3JvdXAnIHNjb3BlZCBidWZmZXIuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBBcnJheUVsZW1lbnROb2RlXHJcbiAqL1xyXG5jbGFzcyBXb3JrZ3JvdXBJbmZvRWxlbWVudE5vZGUgZXh0ZW5kcyBBcnJheUVsZW1lbnROb2RlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB3b3JrZ3JvdXAgaW5mbyBlbGVtZW50IG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV9IHdvcmtncm91cEluZm9Ob2RlIC0gVGhlIHdvcmtncm91cCBpbmZvIG5vZGUuXHJcblx0ICogQHBhcmFtIHtOb2RlfSBpbmRleE5vZGUgLSBUaGUgaW5kZXggbm9kZSB0aGF0IGRlZmluZXMgdGhlIGVsZW1lbnQgYWNjZXNzLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCB3b3JrZ3JvdXBJbmZvTm9kZSwgaW5kZXhOb2RlICkge1xyXG5cclxuXHRcdHN1cGVyKCB3b3JrZ3JvdXBJbmZvTm9kZSwgaW5kZXhOb2RlICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzV29ya2dyb3VwSW5mb0VsZW1lbnROb2RlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHRnZW5lcmF0ZSggYnVpbGRlciwgb3V0cHV0ICkge1xyXG5cclxuXHRcdGxldCBzbmlwcGV0O1xyXG5cclxuXHRcdGNvbnN0IGlzQXNzaWduQ29udGV4dCA9IGJ1aWxkZXIuY29udGV4dC5hc3NpZ247XHJcblx0XHRzbmlwcGV0ID0gc3VwZXIuZ2VuZXJhdGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRpZiAoIGlzQXNzaWduQ29udGV4dCAhPT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdGNvbnN0IHR5cGUgPSB0aGlzLmdldE5vZGVUeXBlKCBidWlsZGVyICk7XHJcblxyXG5cdFx0XHRzbmlwcGV0ID0gYnVpbGRlci5mb3JtYXQoIHNuaXBwZXQsIHR5cGUsIG91dHB1dCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBUT0RPOiBQb3NzaWJseSBhY3RpdmF0ZSBjbGlwIGRpc3RhbmNlIGluZGV4IG9uIGluZGV4IGFjY2VzcyByYXRoZXIgdGhhbiBmcm9tIGNsaXBwaW5nIGNvbnRleHRcclxuXHJcblx0XHRyZXR1cm4gc25pcHBldDtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIEEgbm9kZSBhbGxvd2luZyB0aGUgdXNlciB0byBjcmVhdGUgYSAnd29ya2dyb3VwJyBzY29wZWQgYnVmZmVyIHdpdGhpbiB0aGVcclxuICogY29udGV4dCBvZiBhIGNvbXB1dGUgc2hhZGVyLiBUeXBpY2FsbHksIHdvcmtncm91cCBzY29wZWQgYnVmZmVycyBhcmVcclxuICogY3JlYXRlZCB0byBob2xkIGRhdGEgdGhhdCBpcyB0cmFuc2ZlcnJlZCBmcm9tIGEgZ2xvYmFsIHN0b3JhZ2Ugc2NvcGUgaW50b1xyXG4gKiBhIGxvY2FsIHdvcmtncm91cCBzY29wZS4gRm9yIGludm9jYXRpb25zIHdpdGhpbiBhIHdvcmtncm91cCwgZGF0YVxyXG4gKiBhY2Nlc3Mgc3BlZWRzIG9uICd3b3JrZ3JvdXAnIHNjb3BlZCBidWZmZXJzIGNhbiBiZSBzaWduaWZpY2FudGx5IGZhc3RlclxyXG4gKiB0aGFuIHNpbWlsYXIgYWNjZXNzIG9wZXJhdGlvbnMgb24gZ2xvYmFsbHkgYWNjZXNzaWJsZSBzdG9yYWdlIGJ1ZmZlcnMuXHJcbiAqXHJcbiAqIFRoaXMgbm9kZSBjYW4gb25seSBiZSB1c2VkIHdpdGggYSBXZWJHUFUgYmFja2VuZC5cclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVcclxuICovXHJcbmNsYXNzIFdvcmtncm91cEluZm9Ob2RlIGV4dGVuZHMgTm9kZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYnVmZmVyIHNjb3BlZCB0byB0eXBlIHNjb3BlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNjb3BlIC0gVE9ETy5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gYnVmZmVyVHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgYSAnd29ya2dyb3VwJyBzY29wZWQgYnVmZmVyIGVsZW1lbnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtidWZmZXJDb3VudD0wXSAtIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGJ1ZmZlci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggc2NvcGUsIGJ1ZmZlclR5cGUsIGJ1ZmZlckNvdW50ID0gMCApIHtcclxuXHJcblx0XHRzdXBlciggYnVmZmVyVHlwZSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGJ1ZmZlciB0eXBlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYnVmZmVyVHlwZSA9IGJ1ZmZlclR5cGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYnVmZmVyIGNvdW50LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYnVmZmVyQ291bnQgPSBidWZmZXJDb3VudDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNXb3JrZ3JvdXBJbmZvTm9kZSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZGF0YSB0eXBlIG9mIHRoZSBhcnJheSBidWZmZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5lbGVtZW50VHlwZSA9IGJ1ZmZlclR5cGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUT0RPLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2NvcGUgPSBzY29wZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBuYW1lL2xhYmVsIG9mIHRoaXMgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge1dvcmtncm91cEluZm9Ob2RlfSBBIHJlZmVyZW5jZSB0byB0aGlzIG5vZGUuXHJcblx0ICovXHJcblx0bGFiZWwoIG5hbWUgKSB7XHJcblxyXG5cdFx0dGhpcy5uYW1lID0gbmFtZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBzY29wZSBvZiB0aGlzIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc2NvcGUgLSBUaGUgc2NvcGUgdG8gc2V0LlxyXG5cdCAqIEByZXR1cm4ge1dvcmtncm91cEluZm9Ob2RlfSBBIHJlZmVyZW5jZSB0byB0aGlzIG5vZGUuXHJcblx0ICovXHJcblx0c2V0U2NvcGUoIHNjb3BlICkge1xyXG5cclxuXHRcdHRoaXMuc2NvcGUgPSBzY29wZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGRhdGEgdHlwZSBvZiB0aGUgYXJyYXkgYnVmZmVyLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgZWxlbWVudCB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldEVsZW1lbnRUeXBlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmVsZW1lbnRUeXBlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE92ZXJ3cml0ZXMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2luY2UgdGhlIGlucHV0IHR5cGVcclxuXHQgKiBpcyBpbmZlcnJlZCBmcm9tIHRoZSBzY29wZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgaW5wdXQgdHlwZS5cclxuXHQgKi9cclxuXHRnZXRJbnB1dFR5cGUoIC8qYnVpbGRlciovICkge1xyXG5cclxuXHRcdHJldHVybiBgJHt0aGlzLnNjb3BlfUFycmF5YDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgZWxlbWVudHMgdmlhIGFuIGluZGV4IG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0luZGV4Tm9kZX0gaW5kZXhOb2RlIC0gaW5kZXhOb2RlLlxyXG5cdCAqIEByZXR1cm4ge1dvcmtncm91cEluZm9FbGVtZW50Tm9kZX0gQSByZWZlcmVuY2UgdG8gYW4gZWxlbWVudC5cclxuXHQgKi9cclxuXHRlbGVtZW50KCBpbmRleE5vZGUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5vZGVPYmplY3QoIG5ldyBXb3JrZ3JvdXBJbmZvRWxlbWVudE5vZGUoIHRoaXMsIGluZGV4Tm9kZSApICk7XHJcblxyXG5cdH1cclxuXHJcblx0Z2VuZXJhdGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIGJ1aWxkZXIuZ2V0U2NvcGVkQXJyYXkoIHRoaXMubmFtZSB8fCBgJHt0aGlzLnNjb3BlfUFycmF5XyR7dGhpcy5pZH1gLCB0aGlzLnNjb3BlLnRvTG93ZXJDYXNlKCksIHRoaXMuYnVmZmVyVHlwZSwgdGhpcy5idWZmZXJDb3VudCApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBXb3JrZ3JvdXBJbmZvTm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgd29ya2dyb3VwIGluZm8gbm9kZS5cclxuICogQ3JlYXRlcyBhIG5ldyAnd29ya2dyb3VwJyBzY29wZWQgYXJyYXkgYnVmZmVyLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgYSAnd29ya2dyb3VwJyBzY29wZWQgYnVmZmVyIGVsZW1lbnQuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbY291bnQ9MF0gLSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBidWZmZXIuXHJcbiAqIEByZXR1cm5zIHtXb3JrZ3JvdXBJbmZvTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCB3b3JrZ3JvdXBBcnJheSA9ICggdHlwZSwgY291bnQgKSA9PiBub2RlT2JqZWN0KCBuZXcgV29ya2dyb3VwSW5mb05vZGUoICdXb3JrZ3JvdXAnLCB0eXBlLCBjb3VudCApICk7XHJcblxyXG5cclxuIiwiaW1wb3J0IFRlbXBOb2RlIGZyb20gJy4uL2NvcmUvVGVtcE5vZGUuanMnO1xyXG5pbXBvcnQgeyBub2RlUHJveHkgfSBmcm9tICcuLi90c2wvVFNMQ29yZS5qcyc7XHJcblxyXG4vKipcclxuICogYEF0b21pY0Z1bmN0aW9uTm9kZWAgcmVwcmVzZW50cyBhbnkgZnVuY3Rpb24gdGhhdCBjYW4gb3BlcmF0ZSBvbiBhdG9taWMgdmFyaWFibGUgdHlwZXNcclxuICogd2l0aGluIGEgc2hhZGVyLiBJbiBhbiBhdG9taWMgZnVuY3Rpb24sIGFueSBtb2RpZmljYXRpb24gdG8gYW4gYXRvbWljIHZhcmlhYmxlIHdpbGxcclxuICogb2NjdXIgYXMgYW4gaW5kaXZpc2libGUgc3RlcCB3aXRoIGEgZGVmaW5lZCBvcmRlciByZWxhdGl2ZSB0byBvdGhlciBtb2RpZmljYXRpb25zLlxyXG4gKiBBY2NvcmRpbmdseSwgZXZlbiBpZiBtdWx0aXBsZSBhdG9taWMgZnVuY3Rpb25zIGFyZSBtb2RpZnlpbmcgYW4gYXRvbWljIHZhcmlhYmxlIGF0IG9uY2VcclxuICogYXRvbWljIG9wZXJhdGlvbnMgd2lsbCBub3QgaW50ZXJmZXJlIHdpdGggZWFjaCBvdGhlci5cclxuICpcclxuICogVGhpcyBub2RlIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBhIFdlYkdQVSBiYWNrZW5kLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgVGVtcE5vZGVcclxuICovXHJcbmNsYXNzIEF0b21pY0Z1bmN0aW9uTm9kZSBleHRlbmRzIFRlbXBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnQXRvbWljRnVuY3Rpb25Ob2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGF0b21pYyBmdW5jdGlvbiBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZCAtIFRoZSBzaWduYXR1cmUgb2YgdGhlIGF0b21pYyBmdW5jdGlvbiB0byBjb25zdHJ1Y3QuXHJcblx0ICogQHBhcmFtIHtOb2RlfSBwb2ludGVyTm9kZSAtIEFuIGF0b21pYyB2YXJpYWJsZSBvciBlbGVtZW50IG9mIGFuIGF0b21pYyBidWZmZXIuXHJcblx0ICogQHBhcmFtIHtOb2RlfSB2YWx1ZU5vZGUgLSBUaGUgdmFsdWUgdGhhdCBtdXRhdGVzIHRoZSBhdG9taWMgdmFyaWFibGUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG1ldGhvZCwgcG9pbnRlck5vZGUsIHZhbHVlTm9kZSApIHtcclxuXHJcblx0XHRzdXBlciggJ3VpbnQnICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc2lnbmF0dXJlIG9mIHRoZSBhdG9taWMgZnVuY3Rpb24gdG8gY29uc3RydWN0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWV0aG9kID0gbWV0aG9kO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQW4gYXRvbWljIHZhcmlhYmxlIG9yIGVsZW1lbnQgb2YgYW4gYXRvbWljIGJ1ZmZlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wb2ludGVyTm9kZSA9IHBvaW50ZXJOb2RlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSB2YWx1ZSB0aGF0IG1vZGlmaWVzIHRoZSBhdG9taWMgdmFyaWFibGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudmFsdWVOb2RlID0gdmFsdWVOb2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE92ZXJ3cml0ZXMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gcmV0dXJuIHRoZSB0eXBlIG9mXHJcblx0ICogdGhlIHBvaW50ZXIgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgaW5wdXQgdHlwZS5cclxuXHQgKi9cclxuXHRnZXRJbnB1dFR5cGUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMucG9pbnRlck5vZGUuZ2V0Tm9kZVR5cGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBPdmVyd3JpdHRlbiBzaW5jZSB0aGUgbm9kZSB0eXBlIGlzIGluZmVycmVkIGZyb20gdGhlIGlucHV0IHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG5vZGUgdHlwZS5cclxuXHQgKi9cclxuXHRnZXROb2RlVHlwZSggYnVpbGRlciApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5nZXRJbnB1dFR5cGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHRnZW5lcmF0ZSggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCBtZXRob2QgPSB0aGlzLm1ldGhvZDtcclxuXHJcblx0XHRjb25zdCB0eXBlID0gdGhpcy5nZXROb2RlVHlwZSggYnVpbGRlciApO1xyXG5cdFx0Y29uc3QgaW5wdXRUeXBlID0gdGhpcy5nZXRJbnB1dFR5cGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRjb25zdCBhID0gdGhpcy5wb2ludGVyTm9kZTtcclxuXHRcdGNvbnN0IGIgPSB0aGlzLnZhbHVlTm9kZTtcclxuXHJcblx0XHRjb25zdCBwYXJhbXMgPSBbXTtcclxuXHJcblx0XHRwYXJhbXMucHVzaCggYCYkeyBhLmJ1aWxkKCBidWlsZGVyLCBpbnB1dFR5cGUgKSB9YCApO1xyXG5cclxuXHRcdGlmICggYiAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHBhcmFtcy5wdXNoKCBiLmJ1aWxkKCBidWlsZGVyLCBpbnB1dFR5cGUgKSApO1xyXG5cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgbWV0aG9kU25pcHBldCA9IGAkeyBidWlsZGVyLmdldE1ldGhvZCggbWV0aG9kLCB0eXBlICkgfSggJHsgcGFyYW1zLmpvaW4oICcsICcgKSB9IClgO1xyXG5cclxuXHRcdGlmICggYiAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGJ1aWxkZXIuYWRkTGluZUZsb3dDb2RlKCBtZXRob2RTbmlwcGV0LCB0aGlzICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBtZXRob2RTbmlwcGV0O1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5BdG9taWNGdW5jdGlvbk5vZGUuQVRPTUlDX0xPQUQgPSAnYXRvbWljTG9hZCc7XHJcbkF0b21pY0Z1bmN0aW9uTm9kZS5BVE9NSUNfU1RPUkUgPSAnYXRvbWljU3RvcmUnO1xyXG5BdG9taWNGdW5jdGlvbk5vZGUuQVRPTUlDX0FERCA9ICdhdG9taWNBZGQnO1xyXG5BdG9taWNGdW5jdGlvbk5vZGUuQVRPTUlDX1NVQiA9ICdhdG9taWNTdWInO1xyXG5BdG9taWNGdW5jdGlvbk5vZGUuQVRPTUlDX01BWCA9ICdhdG9taWNNYXgnO1xyXG5BdG9taWNGdW5jdGlvbk5vZGUuQVRPTUlDX01JTiA9ICdhdG9taWNNaW4nO1xyXG5BdG9taWNGdW5jdGlvbk5vZGUuQVRPTUlDX0FORCA9ICdhdG9taWNBbmQnO1xyXG5BdG9taWNGdW5jdGlvbk5vZGUuQVRPTUlDX09SID0gJ2F0b21pY09yJztcclxuQXRvbWljRnVuY3Rpb25Ob2RlLkFUT01JQ19YT1IgPSAnYXRvbWljWG9yJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IEF0b21pY0Z1bmN0aW9uTm9kZTtcclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGFuIGF0b21pYyBmdW5jdGlvbiBub2RlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kIC0gVGhlIHNpZ25hdHVyZSBvZiB0aGUgYXRvbWljIGZ1bmN0aW9uIHRvIGNvbnN0cnVjdC5cclxuICogQHBhcmFtIHtOb2RlfSBwb2ludGVyTm9kZSAtIEFuIGF0b21pYyB2YXJpYWJsZSBvciBlbGVtZW50IG9mIGFuIGF0b21pYyBidWZmZXIuXHJcbiAqIEBwYXJhbSB7Tm9kZX0gdmFsdWVOb2RlIC0gVGhlIHZhbHVlIHRoYXQgbXV0YXRlcyB0aGUgYXRvbWljIHZhcmlhYmxlLlxyXG4gKiBAcmV0dXJucyB7QXRvbWljRnVuY3Rpb25Ob2RlfVxyXG4gKi9cclxuY29uc3QgYXRvbWljTm9kZSA9IG5vZGVQcm94eSggQXRvbWljRnVuY3Rpb25Ob2RlICk7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBhcHBlbmRpbmcgYW4gYXRvbWljIGZ1bmN0aW9uIGNhbGwgaW50byB0aGUgcHJvZ3JhbW1hdGljIGZsb3cgb2YgYSBjb21wdXRlIHNoYWRlci5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZCAtIFRoZSBzaWduYXR1cmUgb2YgdGhlIGF0b21pYyBmdW5jdGlvbiB0byBjb25zdHJ1Y3QuXHJcbiAqIEBwYXJhbSB7Tm9kZX0gcG9pbnRlck5vZGUgLSBBbiBhdG9taWMgdmFyaWFibGUgb3IgZWxlbWVudCBvZiBhbiBhdG9taWMgYnVmZmVyLlxyXG4gKiBAcGFyYW0ge05vZGV9IHZhbHVlTm9kZSAtIFRoZSB2YWx1ZSB0aGF0IG11dGF0ZXMgdGhlIGF0b21pYyB2YXJpYWJsZS5cclxuICogQHJldHVybnMge0F0b21pY0Z1bmN0aW9uTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBhdG9taWNGdW5jID0gKCBtZXRob2QsIHBvaW50ZXJOb2RlLCB2YWx1ZU5vZGUgKSA9PiB7XHJcblxyXG5cdGNvbnN0IG5vZGUgPSBhdG9taWNOb2RlKCBtZXRob2QsIHBvaW50ZXJOb2RlLCB2YWx1ZU5vZGUgKTtcclxuXHRub2RlLmFwcGVuZCgpO1xyXG5cclxuXHRyZXR1cm4gbm9kZTtcclxuXHJcbn07XHJcblxyXG4vKipcclxuICogTG9hZHMgdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgYXRvbWljIHZhcmlhYmxlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IHBvaW50ZXJOb2RlIC0gQW4gYXRvbWljIHZhcmlhYmxlIG9yIGVsZW1lbnQgb2YgYW4gYXRvbWljIGJ1ZmZlci5cclxuICogQHJldHVybnMge0F0b21pY0Z1bmN0aW9uTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBhdG9taWNMb2FkID0gKCBwb2ludGVyTm9kZSApID0+IGF0b21pY0Z1bmMoIEF0b21pY0Z1bmN0aW9uTm9kZS5BVE9NSUNfTE9BRCwgcG9pbnRlck5vZGUsIG51bGwgKTtcclxuXHJcbi8qKlxyXG4gKiBTdG9yZXMgYSB2YWx1ZSBpbiB0aGUgYXRvbWljIHZhcmlhYmxlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IHBvaW50ZXJOb2RlIC0gQW4gYXRvbWljIHZhcmlhYmxlIG9yIGVsZW1lbnQgb2YgYW4gYXRvbWljIGJ1ZmZlci5cclxuICogQHBhcmFtIHtOb2RlfSB2YWx1ZU5vZGUgLSBUaGUgdmFsdWUgdGhhdCBtdXRhdGVzIHRoZSBhdG9taWMgdmFyaWFibGUuXHJcbiAqIEByZXR1cm5zIHtBdG9taWNGdW5jdGlvbk5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYXRvbWljU3RvcmUgPSAoIHBvaW50ZXJOb2RlLCB2YWx1ZU5vZGUgKSA9PiBhdG9taWNGdW5jKCBBdG9taWNGdW5jdGlvbk5vZGUuQVRPTUlDX1NUT1JFLCBwb2ludGVyTm9kZSwgdmFsdWVOb2RlICk7XHJcblxyXG4vKipcclxuICogSW5jcmVtZW50cyB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBhdG9taWMgdmFyaWFibGUuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7Tm9kZX0gcG9pbnRlck5vZGUgLSBBbiBhdG9taWMgdmFyaWFibGUgb3IgZWxlbWVudCBvZiBhbiBhdG9taWMgYnVmZmVyLlxyXG4gKiBAcGFyYW0ge05vZGV9IHZhbHVlTm9kZSAtIFRoZSB2YWx1ZSB0aGF0IG11dGF0ZXMgdGhlIGF0b21pYyB2YXJpYWJsZS5cclxuICogQHJldHVybnMge0F0b21pY0Z1bmN0aW9uTm9kZX1cclxuICovXHJcbmV4cG9ydCBjb25zdCBhdG9taWNBZGQgPSAoIHBvaW50ZXJOb2RlLCB2YWx1ZU5vZGUgKSA9PiBhdG9taWNGdW5jKCBBdG9taWNGdW5jdGlvbk5vZGUuQVRPTUlDX0FERCwgcG9pbnRlck5vZGUsIHZhbHVlTm9kZSApO1xyXG5cclxuLyoqXHJcbiAqIERlY3JlbWVudHMgdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgYXRvbWljIHZhcmlhYmxlLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IHBvaW50ZXJOb2RlIC0gQW4gYXRvbWljIHZhcmlhYmxlIG9yIGVsZW1lbnQgb2YgYW4gYXRvbWljIGJ1ZmZlci5cclxuICogQHBhcmFtIHtOb2RlfSB2YWx1ZU5vZGUgLSBUaGUgdmFsdWUgdGhhdCBtdXRhdGVzIHRoZSBhdG9taWMgdmFyaWFibGUuXHJcbiAqIEByZXR1cm5zIHtBdG9taWNGdW5jdGlvbk5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYXRvbWljU3ViID0gKCBwb2ludGVyTm9kZSwgdmFsdWVOb2RlICkgPT4gYXRvbWljRnVuYyggQXRvbWljRnVuY3Rpb25Ob2RlLkFUT01JQ19TVUIsIHBvaW50ZXJOb2RlLCB2YWx1ZU5vZGUgKTtcclxuXHJcbi8qKlxyXG4gKiBTdG9yZXMgaW4gYW4gYXRvbWljIHZhcmlhYmxlIHRoZSBtYXhpbXVtIGJldHdlZW4gaXRzIGN1cnJlbnQgdmFsdWUgYW5kIGEgcGFyYW1ldGVyLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IHBvaW50ZXJOb2RlIC0gQW4gYXRvbWljIHZhcmlhYmxlIG9yIGVsZW1lbnQgb2YgYW4gYXRvbWljIGJ1ZmZlci5cclxuICogQHBhcmFtIHtOb2RlfSB2YWx1ZU5vZGUgLSBUaGUgdmFsdWUgdGhhdCBtdXRhdGVzIHRoZSBhdG9taWMgdmFyaWFibGUuXHJcbiAqIEByZXR1cm5zIHtBdG9taWNGdW5jdGlvbk5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYXRvbWljTWF4ID0gKCBwb2ludGVyTm9kZSwgdmFsdWVOb2RlICkgPT4gYXRvbWljRnVuYyggQXRvbWljRnVuY3Rpb25Ob2RlLkFUT01JQ19NQVgsIHBvaW50ZXJOb2RlLCB2YWx1ZU5vZGUgKTtcclxuXHJcbi8qKlxyXG4gKiBTdG9yZXMgaW4gYW4gYXRvbWljIHZhcmlhYmxlIHRoZSBtaW5pbXVtIGJldHdlZW4gaXRzIGN1cnJlbnQgdmFsdWUgYW5kIGEgcGFyYW1ldGVyLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IHBvaW50ZXJOb2RlIC0gQW4gYXRvbWljIHZhcmlhYmxlIG9yIGVsZW1lbnQgb2YgYW4gYXRvbWljIGJ1ZmZlci5cclxuICogQHBhcmFtIHtOb2RlfSB2YWx1ZU5vZGUgLSBUaGUgdmFsdWUgdGhhdCBtdXRhdGVzIHRoZSBhdG9taWMgdmFyaWFibGUuXHJcbiAqIEByZXR1cm5zIHtBdG9taWNGdW5jdGlvbk5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYXRvbWljTWluID0gKCBwb2ludGVyTm9kZSwgdmFsdWVOb2RlICkgPT4gYXRvbWljRnVuYyggQXRvbWljRnVuY3Rpb25Ob2RlLkFUT01JQ19NSU4sIHBvaW50ZXJOb2RlLCB2YWx1ZU5vZGUgKTtcclxuXHJcbi8qKlxyXG4gKiBTdG9yZXMgaW4gYW4gYXRvbWljIHZhcmlhYmxlIHRoZSBiaXR3aXNlIEFORCBvZiBpdHMgdmFsdWUgd2l0aCBhIHBhcmFtZXRlci5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlfSBwb2ludGVyTm9kZSAtIEFuIGF0b21pYyB2YXJpYWJsZSBvciBlbGVtZW50IG9mIGFuIGF0b21pYyBidWZmZXIuXHJcbiAqIEBwYXJhbSB7Tm9kZX0gdmFsdWVOb2RlIC0gVGhlIHZhbHVlIHRoYXQgbXV0YXRlcyB0aGUgYXRvbWljIHZhcmlhYmxlLlxyXG4gKiBAcmV0dXJucyB7QXRvbWljRnVuY3Rpb25Ob2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGF0b21pY0FuZCA9ICggcG9pbnRlck5vZGUsIHZhbHVlTm9kZSApID0+IGF0b21pY0Z1bmMoIEF0b21pY0Z1bmN0aW9uTm9kZS5BVE9NSUNfQU5ELCBwb2ludGVyTm9kZSwgdmFsdWVOb2RlICk7XHJcblxyXG4vKipcclxuICogU3RvcmVzIGluIGFuIGF0b21pYyB2YXJpYWJsZSB0aGUgYml0d2lzZSBPUiBvZiBpdHMgdmFsdWUgd2l0aCBhIHBhcmFtZXRlci5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtOb2RlfSBwb2ludGVyTm9kZSAtIEFuIGF0b21pYyB2YXJpYWJsZSBvciBlbGVtZW50IG9mIGFuIGF0b21pYyBidWZmZXIuXHJcbiAqIEBwYXJhbSB7Tm9kZX0gdmFsdWVOb2RlIC0gVGhlIHZhbHVlIHRoYXQgbXV0YXRlcyB0aGUgYXRvbWljIHZhcmlhYmxlLlxyXG4gKiBAcmV0dXJucyB7QXRvbWljRnVuY3Rpb25Ob2RlfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGF0b21pY09yID0gKCBwb2ludGVyTm9kZSwgdmFsdWVOb2RlICkgPT4gYXRvbWljRnVuYyggQXRvbWljRnVuY3Rpb25Ob2RlLkFUT01JQ19PUiwgcG9pbnRlck5vZGUsIHZhbHVlTm9kZSApO1xyXG5cclxuLyoqXHJcbiAqIFN0b3JlcyBpbiBhbiBhdG9taWMgdmFyaWFibGUgdGhlIGJpdHdpc2UgWE9SIG9mIGl0cyB2YWx1ZSB3aXRoIGEgcGFyYW1ldGVyLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGV9IHBvaW50ZXJOb2RlIC0gQW4gYXRvbWljIHZhcmlhYmxlIG9yIGVsZW1lbnQgb2YgYW4gYXRvbWljIGJ1ZmZlci5cclxuICogQHBhcmFtIHtOb2RlfSB2YWx1ZU5vZGUgLSBUaGUgdmFsdWUgdGhhdCBtdXRhdGVzIHRoZSBhdG9taWMgdmFyaWFibGUuXHJcbiAqIEByZXR1cm5zIHtBdG9taWNGdW5jdGlvbk5vZGV9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYXRvbWljWG9yID0gKCBwb2ludGVyTm9kZSwgdmFsdWVOb2RlICkgPT4gYXRvbWljRnVuYyggQXRvbWljRnVuY3Rpb25Ob2RlLkFUT01JQ19YT1IsIHBvaW50ZXJOb2RlLCB2YWx1ZU5vZGUgKTtcclxuIiwiaW1wb3J0IHsgdW5pZm9ybSB9IGZyb20gJy4uL2NvcmUvVW5pZm9ybU5vZGUuanMnO1xyXG5pbXBvcnQgeyByZW5kZXJHcm91cCB9IGZyb20gJy4uL2NvcmUvVW5pZm9ybUdyb3VwTm9kZS5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBjYW1lcmFWaWV3TWF0cml4IH0gZnJvbSAnLi9DYW1lcmEuanMnO1xyXG5pbXBvcnQgeyBwb3NpdGlvbldvcmxkIH0gZnJvbSAnLi9Qb3NpdGlvbi5qcyc7XHJcblxyXG5sZXQgdW5pZm9ybXNMaWI7XHJcblxyXG5mdW5jdGlvbiBnZXRMaWdodERhdGEoIGxpZ2h0ICkge1xyXG5cclxuXHR1bmlmb3Jtc0xpYiA9IHVuaWZvcm1zTGliIHx8IG5ldyBXZWFrTWFwKCk7XHJcblxyXG5cdGxldCB1bmlmb3JtcyA9IHVuaWZvcm1zTGliLmdldCggbGlnaHQgKTtcclxuXHJcblx0aWYgKCB1bmlmb3JtcyA9PT0gdW5kZWZpbmVkICkgdW5pZm9ybXNMaWIuc2V0KCBsaWdodCwgdW5pZm9ybXMgPSB7fSApO1xyXG5cclxuXHRyZXR1cm4gdW5pZm9ybXM7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBnZXR0aW5nIGEgc2hhZG93IG1hdHJpeCB1bmlmb3JtIG5vZGUgZm9yIHRoZSBnaXZlbiBsaWdodC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtMaWdodH0gbGlnaHQgLVRoZSBsaWdodCBzb3VyY2UuXHJcbiAqIEByZXR1cm5zIHtVbmlmb3JtTm9kZTxtYXQ0Pn0gVGhlIHNoYWRvdyBtYXRyaXggdW5pZm9ybSBub2RlLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGxpZ2h0U2hhZG93TWF0cml4KCBsaWdodCApIHtcclxuXHJcblx0Y29uc3QgZGF0YSA9IGdldExpZ2h0RGF0YSggbGlnaHQgKTtcclxuXHJcblx0cmV0dXJuIGRhdGEuc2hhZG93TWF0cml4IHx8ICggZGF0YS5zaGFkb3dNYXRyaXggPSB1bmlmb3JtKCAnbWF0NCcgKS5zZXRHcm91cCggcmVuZGVyR3JvdXAgKS5vblJlbmRlclVwZGF0ZSggKCkgPT4ge1xyXG5cclxuXHRcdGlmICggbGlnaHQuY2FzdFNoYWRvdyAhPT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdGxpZ2h0LnNoYWRvdy51cGRhdGVNYXRyaWNlcyggbGlnaHQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGxpZ2h0LnNoYWRvdy5tYXRyaXg7XHJcblxyXG5cdH0gKSApO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgZ2V0dGluZyBwcm9qZWN0ZWQgdXYgY29vcmRpbmF0ZXMgZm9yIHRoZSBnaXZlbiBsaWdodC5cclxuICogUmVsZXZhbnQgd2hlbiB1c2luZyBtYXBzIHdpdGggc3BvdCBsaWdodHMuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7TGlnaHR9IGxpZ2h0IC1UaGUgbGlnaHQgc291cmNlLlxyXG4gKiBAcGFyYW0ge05vZGU8dmVjMz59IFtwb3NpdGlvbj1wb3NpdGlvbldvcmxkXSAtVGhlIHBvc2l0aW9uIHRvIHByb2plY3QuXHJcbiAqIEByZXR1cm5zIHtOb2RlPHZlYzM+fSBUaGUgcHJvamVjdGVkIHV2cy5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBsaWdodFByb2plY3Rpb25VViggbGlnaHQsIHBvc2l0aW9uID0gcG9zaXRpb25Xb3JsZCApIHtcclxuXHJcblx0Y29uc3Qgc3BvdExpZ2h0Q29vcmQgPSBsaWdodFNoYWRvd01hdHJpeCggbGlnaHQgKS5tdWwoIHBvc2l0aW9uICk7XHJcblx0Y29uc3QgcHJvamVjdGlvblVWID0gc3BvdExpZ2h0Q29vcmQueHl6LmRpdiggc3BvdExpZ2h0Q29vcmQudyApO1xyXG5cclxuXHRyZXR1cm4gcHJvamVjdGlvblVWO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgZ2V0dGluZyB0aGUgcG9zaXRpb24gaW4gd29ybGQgc3BhY2UgZm9yIHRoZSBnaXZlbiBsaWdodC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtMaWdodH0gbGlnaHQgLVRoZSBsaWdodCBzb3VyY2UuXHJcbiAqIEByZXR1cm5zIHtVbmlmb3JtTm9kZTx2ZWMzPn0gVGhlIGxpZ2h0J3MgcG9zaXRpb24gaW4gd29ybGQgc3BhY2UuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gbGlnaHRQb3NpdGlvbiggbGlnaHQgKSB7XHJcblxyXG5cdGNvbnN0IGRhdGEgPSBnZXRMaWdodERhdGEoIGxpZ2h0ICk7XHJcblxyXG5cdHJldHVybiBkYXRhLnBvc2l0aW9uIHx8ICggZGF0YS5wb3NpdGlvbiA9IHVuaWZvcm0oIG5ldyBWZWN0b3IzKCkgKS5zZXRHcm91cCggcmVuZGVyR3JvdXAgKS5vblJlbmRlclVwZGF0ZSggKCBfLCBzZWxmICkgPT4gc2VsZi52YWx1ZS5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICkgKSApO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgZ2V0dGluZyB0aGUgbGlnaHQgdGFyZ2V0IHBvc2l0aW9uIGluIHdvcmxkIHNwYWNlIGZvciB0aGUgZ2l2ZW4gbGlnaHQuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7TGlnaHR9IGxpZ2h0IC1UaGUgbGlnaHQgc291cmNlLlxyXG4gKiBAcmV0dXJucyB7VW5pZm9ybU5vZGU8dmVjMz59IFRoZSBsaWdodCB0YXJnZXQgcG9zaXRpb24gaW4gd29ybGQgc3BhY2UuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gbGlnaHRUYXJnZXRQb3NpdGlvbiggbGlnaHQgKSB7XHJcblxyXG5cdGNvbnN0IGRhdGEgPSBnZXRMaWdodERhdGEoIGxpZ2h0ICk7XHJcblxyXG5cdHJldHVybiBkYXRhLnRhcmdldFBvc2l0aW9uIHx8ICggZGF0YS50YXJnZXRQb3NpdGlvbiA9IHVuaWZvcm0oIG5ldyBWZWN0b3IzKCkgKS5zZXRHcm91cCggcmVuZGVyR3JvdXAgKS5vblJlbmRlclVwZGF0ZSggKCBfLCBzZWxmICkgPT4gc2VsZi52YWx1ZS5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCApICkgKTtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGdldHRpbmcgdGhlIHBvc2l0aW9uIGluIHZpZXcgc3BhY2UgZm9yIHRoZSBnaXZlbiBsaWdodC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtMaWdodH0gbGlnaHQgLSBUaGUgbGlnaHQgc291cmNlLlxyXG4gKiBAcmV0dXJucyB7VW5pZm9ybU5vZGU8dmVjMz59IFRoZSBsaWdodCdzIHBvc2l0aW9uIGluIHZpZXcgc3BhY2UuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gbGlnaHRWaWV3UG9zaXRpb24oIGxpZ2h0ICkge1xyXG5cclxuXHRjb25zdCBkYXRhID0gZ2V0TGlnaHREYXRhKCBsaWdodCApO1xyXG5cclxuXHRyZXR1cm4gZGF0YS52aWV3UG9zaXRpb24gfHwgKCBkYXRhLnZpZXdQb3NpdGlvbiA9IHVuaWZvcm0oIG5ldyBWZWN0b3IzKCkgKS5zZXRHcm91cCggcmVuZGVyR3JvdXAgKS5vblJlbmRlclVwZGF0ZSggKCB7IGNhbWVyYSB9LCBzZWxmICkgPT4ge1xyXG5cclxuXHRcdHNlbGYudmFsdWUgPSBzZWxmLnZhbHVlIHx8IG5ldyBWZWN0b3IzKCk7XHJcblx0XHRzZWxmLnZhbHVlLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTtcclxuXHJcblx0XHRzZWxmLnZhbHVlLmFwcGx5TWF0cml4NCggY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSApO1xyXG5cclxuXHR9ICkgKTtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUU0wgZnVuY3Rpb24gZm9yIGdldHRpbmcgdGhlIGxpZ2h0IHRhcmdldCBkaXJlY3Rpb24gZm9yIHRoZSBnaXZlbiBsaWdodC5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtMaWdodH0gbGlnaHQgLVRoZSBsaWdodCBzb3VyY2UuXHJcbiAqIEByZXR1cm5zIHtOb2RlPHZlYzM+fSBUaGUgbGlnaHQncyB0YXJnZXQgZGlyZWN0aW9uLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGxpZ2h0VGFyZ2V0RGlyZWN0aW9uID0gKCBsaWdodCApID0+IGNhbWVyYVZpZXdNYXRyaXgudHJhbnNmb3JtRGlyZWN0aW9uKCBsaWdodFBvc2l0aW9uKCBsaWdodCApLnN1YiggbGlnaHRUYXJnZXRQb3NpdGlvbiggbGlnaHQgKSApICk7XHJcbiIsImltcG9ydCBOb2RlIGZyb20gJy4uL2NvcmUvTm9kZS5qcyc7XHJcbmltcG9ydCB7IG5vZGVPYmplY3QsIHZlYzMgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcbmltcG9ydCB7IGhhc2hBcnJheSB9IGZyb20gJy4uL2NvcmUvTm9kZVV0aWxzLmpzJztcclxuXHJcbmNvbnN0IHNvcnRMaWdodHMgPSAoIGxpZ2h0cyApID0+IHtcclxuXHJcblx0cmV0dXJuIGxpZ2h0cy5zb3J0KCAoIGEsIGIgKSA9PiBhLmlkIC0gYi5pZCApO1xyXG5cclxufTtcclxuXHJcbmNvbnN0IGdldExpZ2h0Tm9kZUJ5SWQgPSAoIGlkLCBsaWdodE5vZGVzICkgPT4ge1xyXG5cclxuXHRmb3IgKCBjb25zdCBsaWdodE5vZGUgb2YgbGlnaHROb2RlcyApIHtcclxuXHJcblx0XHRpZiAoIGxpZ2h0Tm9kZS5pc0FuYWx5dGljTGlnaHROb2RlICYmIGxpZ2h0Tm9kZS5saWdodC5pZCA9PT0gaWQgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gbGlnaHROb2RlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gbnVsbDtcclxuXHJcbn07XHJcblxyXG5jb25zdCBfbGlnaHRzTm9kZVJlZiA9IC8qQF9fUFVSRV9fKi8gbmV3IFdlYWtNYXAoKTtcclxuXHJcbi8qKlxyXG4gKiBUaGlzIG5vZGUgcmVwcmVzZW50cyB0aGUgc2NlbmUncyBsaWdodGluZyBhbmQgbWFuYWdlcyB0aGUgbGlnaHRpbmcgbW9kZWwncyBsaWZlIGN5Y2xlXHJcbiAqIGZvciB0aGUgY3VycmVudCBidWlsZCAzRCBvYmplY3QuIEl0IGlzIHJlc3BvbnNpYmxlIGZvciBjb21wdXRpbmcgdGhlIHRvdGFsIG91dGdvaW5nXHJcbiAqIGxpZ2h0IGluIGEgZ2l2ZW4gbGlnaHRpbmcgY29udGV4dC5cclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVcclxuICovXHJcbmNsYXNzIExpZ2h0c05vZGUgZXh0ZW5kcyBOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnTGlnaHRzTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBsaWdodHMgbm9kZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHJcblx0XHRzdXBlciggJ3ZlYzMnICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIG5vZGUgcmVwcmVzZW50aW5nIHRoZSB0b3RhbCBkaWZmdXNlIGxpZ2h0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlPHZlYzM+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRvdGFsRGlmZnVzZU5vZGUgPSB2ZWMzKCkudG9WYXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgbm9kZSByZXByZXNlbnRpbmcgdGhlIHRvdGFsIHNwZWN1bGFyIGxpZ2h0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlPHZlYzM+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRvdGFsU3BlY3VsYXJOb2RlID0gdmVjMygpLnRvVmFyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIG5vZGUgcmVwcmVzZW50aW5nIHRoZSBvdXRnb2luZyBsaWdodC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZTx2ZWMzPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5vdXRnb2luZ0xpZ2h0Tm9kZSA9IHZlYzMoKS50b1ZhcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQW4gYXJyYXkgcmVwcmVzZW50aW5nIHRoZSBsaWdodHMgaW4gdGhlIHNjZW5lLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8TGlnaHQ+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9saWdodHMgPSBbXTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEZvciBlYWNoIGxpZ2h0IGluIHRoZSBzY2VuZSwgdGhpcyBub2RlIHdpbGwgY3JlYXRlIGFcclxuXHRcdCAqIGNvcnJlc3BvbmRpbmcgbGlnaHQgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUgez9BcnJheTxMaWdodGluZ05vZGU+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9saWdodE5vZGVzID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgaGFzaCBmb3IgaWRlbnRpZnlpbmcgdGhlIGN1cnJlbnQgbGlnaHQgbm9kZXMgc2V0dXAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHs/c3RyaW5nfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9saWdodE5vZGVzSGFzaCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBgTGlnaHRzTm9kZWAgc2V0cyB0aGlzIHByb3BlcnR5IHRvIGB0cnVlYCBieSBkZWZhdWx0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdsb2JhbCA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogT3ZlcndyaXRlcyB0aGUgZGVmYXVsdCB7QGxpbmsgTm9kZSNjdXN0b21DYWNoZUtleX0gaW1wbGVtZW50YXRpb24gYnkgaW5jbHVkaW5nIHRoZVxyXG5cdCAqIGxpZ2h0IElEcyBpbnRvIHRoZSBjYWNoZSBrZXkuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBjdXN0b20gY2FjaGUga2V5LlxyXG5cdCAqL1xyXG5cdGN1c3RvbUNhY2hlS2V5KCkge1xyXG5cclxuXHRcdGNvbnN0IGxpZ2h0SURzID0gW107XHJcblx0XHRjb25zdCBsaWdodHMgPSB0aGlzLl9saWdodHM7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgbGlnaHRzLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdGxpZ2h0SURzLnB1c2goIGxpZ2h0c1sgaSBdLmlkICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBoYXNoQXJyYXkoIGxpZ2h0SURzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcHV0ZXMgYSBoYXNoIHZhbHVlIGZvciBpZGVudGlmeWluZyB0aGUgY3VycmVudCBsaWdodCBub2RlcyBzZXR1cC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgY29tcHV0ZWQgaGFzaC5cclxuXHQgKi9cclxuXHRnZXRIYXNoKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5fbGlnaHROb2Rlc0hhc2ggPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMuX2xpZ2h0Tm9kZXMgPT09IG51bGwgKSB0aGlzLnNldHVwTGlnaHRzTm9kZSggYnVpbGRlciApO1xyXG5cclxuXHRcdFx0Y29uc3QgaGFzaCA9IFtdO1xyXG5cclxuXHRcdFx0Zm9yICggY29uc3QgbGlnaHROb2RlIG9mIHRoaXMuX2xpZ2h0Tm9kZXMgKSB7XHJcblxyXG5cdFx0XHRcdGhhc2gucHVzaCggbGlnaHROb2RlLmdldFNlbGYoKS5nZXRIYXNoKCkgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuX2xpZ2h0Tm9kZXNIYXNoID0gJ2xpZ2h0cy0nICsgaGFzaC5qb2luKCAnLCcgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX2xpZ2h0Tm9kZXNIYXNoO1xyXG5cclxuXHR9XHJcblxyXG5cdGFuYWx5emUoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgcHJvcGVydGllcyA9IGJ1aWxkZXIuZ2V0RGF0YUZyb21Ob2RlKCB0aGlzICk7XHJcblxyXG5cdFx0Zm9yICggY29uc3Qgbm9kZSBvZiBwcm9wZXJ0aWVzLm5vZGVzICkge1xyXG5cclxuXHRcdFx0bm9kZS5idWlsZCggYnVpbGRlciApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGxpZ2h0aW5nIG5vZGVzIGZvciBlYWNoIHNjZW5lIGxpZ2h0LiBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGZ1cnRoZXJcclxuXHQgKiBwcm9jZXNzIGxpZ2h0cyBpbiB0aGUgbm9kZSBzeXN0ZW0uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqL1xyXG5cdHNldHVwTGlnaHRzTm9kZSggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCBsaWdodE5vZGVzID0gW107XHJcblxyXG5cdFx0Y29uc3QgcHJldmlvdXNMaWdodE5vZGVzID0gdGhpcy5fbGlnaHROb2RlcztcclxuXHJcblx0XHRjb25zdCBsaWdodHMgPSBzb3J0TGlnaHRzKCB0aGlzLl9saWdodHMgKTtcclxuXHRcdGNvbnN0IG5vZGVMaWJyYXJ5ID0gYnVpbGRlci5yZW5kZXJlci5saWJyYXJ5O1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IGxpZ2h0IG9mIGxpZ2h0cyApIHtcclxuXHJcblx0XHRcdGlmICggbGlnaHQuaXNOb2RlICkge1xyXG5cclxuXHRcdFx0XHRsaWdodE5vZGVzLnB1c2goIG5vZGVPYmplY3QoIGxpZ2h0ICkgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGxldCBsaWdodE5vZGUgPSBudWxsO1xyXG5cclxuXHRcdFx0XHRpZiAoIHByZXZpb3VzTGlnaHROb2RlcyAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHRsaWdodE5vZGUgPSBnZXRMaWdodE5vZGVCeUlkKCBsaWdodC5pZCwgcHJldmlvdXNMaWdodE5vZGVzICk7IC8vIHJldXNlIGV4aXN0aW5nIGxpZ2h0IG5vZGVcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoIGxpZ2h0Tm9kZSA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHQvLyBmaW5kIHRoZSBjb3JyZXNwb25kaW5nIG5vZGUgdHlwZSBmb3IgYSBnaXZlbiBsaWdodFxyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGxpZ2h0Tm9kZUNsYXNzID0gbm9kZUxpYnJhcnkuZ2V0TGlnaHROb2RlQ2xhc3MoIGxpZ2h0LmNvbnN0cnVjdG9yICk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBsaWdodE5vZGVDbGFzcyA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnNvbGUud2FybiggYExpZ2h0c05vZGUuc2V0dXBOb2RlTGlnaHRzOiBMaWdodCBub2RlIG5vdCBmb3VuZCBmb3IgJHsgbGlnaHQuY29uc3RydWN0b3IubmFtZSB9YCApO1xyXG5cdFx0XHRcdFx0XHRjb250aW51ZTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0bGV0IGxpZ2h0Tm9kZSA9IG51bGw7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCAhIF9saWdodHNOb2RlUmVmLmhhcyggbGlnaHQgKSApIHtcclxuXHJcblx0XHRcdFx0XHRcdGxpZ2h0Tm9kZSA9IG5vZGVPYmplY3QoIG5ldyBsaWdodE5vZGVDbGFzcyggbGlnaHQgKSApO1xyXG5cdFx0XHRcdFx0XHRfbGlnaHRzTm9kZVJlZi5zZXQoIGxpZ2h0LCBsaWdodE5vZGUgKTtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0bGlnaHROb2RlID0gX2xpZ2h0c05vZGVSZWYuZ2V0KCBsaWdodCApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRsaWdodE5vZGVzLnB1c2goIGxpZ2h0Tm9kZSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuX2xpZ2h0Tm9kZXMgPSBsaWdodE5vZGVzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdXAgYSBkaXJlY3QgbGlnaHQgaW4gdGhlIGxpZ2h0aW5nIG1vZGVsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGJ1aWxkZXIgLSBUaGUgYnVpbGRlciBvYmplY3QgY29udGFpbmluZyB0aGUgY29udGV4dCBhbmQgc3RhY2suXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGxpZ2h0Tm9kZSAtIFRoZSBsaWdodCBub2RlLlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBsaWdodERhdGEgLSBUaGUgbGlnaHQgb2JqZWN0IGNvbnRhaW5pbmcgY29sb3IgYW5kIGRpcmVjdGlvbiBwcm9wZXJ0aWVzLlxyXG5cdCAqL1xyXG5cdHNldHVwRGlyZWN0TGlnaHQoIGJ1aWxkZXIsIGxpZ2h0Tm9kZSwgbGlnaHREYXRhICkge1xyXG5cclxuXHRcdGNvbnN0IHsgbGlnaHRpbmdNb2RlbCwgcmVmbGVjdGVkTGlnaHQgfSA9IGJ1aWxkZXIuY29udGV4dDtcclxuXHJcblx0XHRsaWdodGluZ01vZGVsLmRpcmVjdCgge1xyXG5cdFx0XHQuLi5saWdodERhdGEsXHJcblx0XHRcdGxpZ2h0Tm9kZSxcclxuXHRcdFx0cmVmbGVjdGVkTGlnaHRcclxuXHRcdH0sIGJ1aWxkZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHRzZXR1cERpcmVjdFJlY3RBcmVhTGlnaHQoIGJ1aWxkZXIsIGxpZ2h0Tm9kZSwgbGlnaHREYXRhICkge1xyXG5cclxuXHRcdGNvbnN0IHsgbGlnaHRpbmdNb2RlbCwgcmVmbGVjdGVkTGlnaHQgfSA9IGJ1aWxkZXIuY29udGV4dDtcclxuXHJcblx0XHRsaWdodGluZ01vZGVsLmRpcmVjdFJlY3RBcmVhKCB7XHJcblx0XHRcdC4uLmxpZ2h0RGF0YSxcclxuXHRcdFx0bGlnaHROb2RlLFxyXG5cdFx0XHRyZWZsZWN0ZWRMaWdodFxyXG5cdFx0fSwgYnVpbGRlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHVwcyB0aGUgaW50ZXJuYWwgbGlnaHRzIGJ5IGJ1aWxkaW5nIGFsbCByZXNwZWN0aXZlXHJcblx0ICogbGlnaHQgbm9kZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8TGlnaHRpbmdOb2RlPn0gbGlnaHROb2RlcyAtIEFuIGFycmF5IG9mIGxpZ2h0aW5nIG5vZGVzLlxyXG5cdCAqL1xyXG5cdHNldHVwTGlnaHRzKCBidWlsZGVyLCBsaWdodE5vZGVzICkge1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IGxpZ2h0Tm9kZSBvZiBsaWdodE5vZGVzICkge1xyXG5cclxuXHRcdFx0bGlnaHROb2RlLmJ1aWxkKCBidWlsZGVyICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGdldExpZ2h0Tm9kZXMoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9saWdodE5vZGVzID09PSBudWxsICkgdGhpcy5zZXR1cExpZ2h0c05vZGUoIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fbGlnaHROb2RlcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgaW1wbGVtZW50YXRpb24gbWFrZXMgc3VyZSB0aGF0IGZvciBlYWNoIGxpZ2h0IGluIHRoZSBzY2VuZVxyXG5cdCAqIHRoZXJlIGlzIGEgY29ycmVzcG9uZGluZyBsaWdodCBub2RlLiBCeSBidWlsZGluZyB0aGUgbGlnaHQgbm9kZXNcclxuXHQgKiBhbmQgZXZhbHVhdGluZyB0aGUgbGlnaHRpbmcgbW9kZWwgdGhlIG91dGdvaW5nIGxpZ2h0IGlzIGNvbXB1dGVkLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtOb2RlPHZlYzM+fSBBIG5vZGUgcmVwcmVzZW50aW5nIHRoZSBvdXRnb2luZyBsaWdodC5cclxuXHQgKi9cclxuXHRzZXR1cCggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCBjdXJyZW50TGlnaHRzTm9kZSA9IGJ1aWxkZXIubGlnaHRzTm9kZTtcclxuXHJcblx0XHRidWlsZGVyLmxpZ2h0c05vZGUgPSB0aGlzO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0bGV0IG91dGdvaW5nTGlnaHROb2RlID0gdGhpcy5vdXRnb2luZ0xpZ2h0Tm9kZTtcclxuXHJcblx0XHRjb25zdCBjb250ZXh0ID0gYnVpbGRlci5jb250ZXh0O1xyXG5cdFx0Y29uc3QgbGlnaHRpbmdNb2RlbCA9IGNvbnRleHQubGlnaHRpbmdNb2RlbDtcclxuXHJcblx0XHRjb25zdCBwcm9wZXJ0aWVzID0gYnVpbGRlci5nZXREYXRhRnJvbU5vZGUoIHRoaXMgKTtcclxuXHJcblx0XHRpZiAoIGxpZ2h0aW5nTW9kZWwgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB7IHRvdGFsRGlmZnVzZU5vZGUsIHRvdGFsU3BlY3VsYXJOb2RlIH0gPSB0aGlzO1xyXG5cclxuXHRcdFx0Y29udGV4dC5vdXRnb2luZ0xpZ2h0ID0gb3V0Z29pbmdMaWdodE5vZGU7XHJcblxyXG5cdFx0XHRjb25zdCBzdGFjayA9IGJ1aWxkZXIuYWRkU3RhY2soKTtcclxuXHJcblx0XHRcdC8vXHJcblxyXG5cdFx0XHRwcm9wZXJ0aWVzLm5vZGVzID0gc3RhY2subm9kZXM7XHJcblxyXG5cdFx0XHQvL1xyXG5cclxuXHRcdFx0bGlnaHRpbmdNb2RlbC5zdGFydCggYnVpbGRlciApO1xyXG5cclxuXHRcdFx0Ly9cclxuXHJcblx0XHRcdGNvbnN0IHsgYmFja2Ryb3AsIGJhY2tkcm9wQWxwaGEgfSA9IGNvbnRleHQ7XHJcblx0XHRcdGNvbnN0IHsgZGlyZWN0RGlmZnVzZSwgZGlyZWN0U3BlY3VsYXIsIGluZGlyZWN0RGlmZnVzZSwgaW5kaXJlY3RTcGVjdWxhciB9ID0gY29udGV4dC5yZWZsZWN0ZWRMaWdodDtcclxuXHJcblx0XHRcdGxldCB0b3RhbERpZmZ1c2UgPSBkaXJlY3REaWZmdXNlLmFkZCggaW5kaXJlY3REaWZmdXNlICk7XHJcblxyXG5cdFx0XHRpZiAoIGJhY2tkcm9wICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIGJhY2tkcm9wQWxwaGEgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdFx0dG90YWxEaWZmdXNlID0gdmVjMyggYmFja2Ryb3BBbHBoYS5taXgoIHRvdGFsRGlmZnVzZSwgYmFja2Ryb3AgKSApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdHRvdGFsRGlmZnVzZSA9IHZlYzMoIGJhY2tkcm9wICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Y29udGV4dC5tYXRlcmlhbC50cmFuc3BhcmVudCA9IHRydWU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0b3RhbERpZmZ1c2VOb2RlLmFzc2lnbiggdG90YWxEaWZmdXNlICk7XHJcblx0XHRcdHRvdGFsU3BlY3VsYXJOb2RlLmFzc2lnbiggZGlyZWN0U3BlY3VsYXIuYWRkKCBpbmRpcmVjdFNwZWN1bGFyICkgKTtcclxuXHJcblx0XHRcdG91dGdvaW5nTGlnaHROb2RlLmFzc2lnbiggdG90YWxEaWZmdXNlTm9kZS5hZGQoIHRvdGFsU3BlY3VsYXJOb2RlICkgKTtcclxuXHJcblx0XHRcdC8vXHJcblxyXG5cdFx0XHRsaWdodGluZ01vZGVsLmZpbmlzaCggYnVpbGRlciApO1xyXG5cclxuXHRcdFx0Ly9cclxuXHJcblx0XHRcdG91dGdvaW5nTGlnaHROb2RlID0gb3V0Z29pbmdMaWdodE5vZGUuYnlwYXNzKCBidWlsZGVyLnJlbW92ZVN0YWNrKCkgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0cHJvcGVydGllcy5ub2RlcyA9IFtdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGJ1aWxkZXIubGlnaHRzTm9kZSA9IGN1cnJlbnRMaWdodHNOb2RlO1xyXG5cclxuXHRcdHJldHVybiBvdXRnb2luZ0xpZ2h0Tm9kZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25maWd1cmVzIHRoaXMgbm9kZSB3aXRoIGFuIGFycmF5IG9mIGxpZ2h0cy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8TGlnaHQ+fSBsaWdodHMgLSBBbiBhcnJheSBvZiBsaWdodHMuXHJcblx0ICogQHJldHVybiB7TGlnaHRzTm9kZX0gQSByZWZlcmVuY2UgdG8gdGhpcyBub2RlLlxyXG5cdCAqL1xyXG5cdHNldExpZ2h0cyggbGlnaHRzICkge1xyXG5cclxuXHRcdHRoaXMuX2xpZ2h0cyA9IGxpZ2h0cztcclxuXHJcblx0XHR0aGlzLl9saWdodE5vZGVzID0gbnVsbDtcclxuXHRcdHRoaXMuX2xpZ2h0Tm9kZXNIYXNoID0gbnVsbDtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHRoZSBzY2VuZSdzIGxpZ2h0cy5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0FycmF5PExpZ2h0Pn0gVGhlIHNjZW5lJ3MgbGlnaHRzLlxyXG5cdCAqL1xyXG5cdGdldExpZ2h0cygpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fbGlnaHRzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdoZXRoZXIgdGhlIHNjZW5lIGhhcyBsaWdodHMgb3Igbm90LlxyXG5cdCAqXHJcblx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0ICovXHJcblx0Z2V0IGhhc0xpZ2h0cygpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fbGlnaHRzLmxlbmd0aCA+IDA7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IExpZ2h0c05vZGU7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhbiBpbnN0YW5jZSBvZiBgTGlnaHRzTm9kZWAgYW5kIGNvbmZpZ3VyaW5nXHJcbiAqIGl0IHdpdGggdGhlIGdpdmVuIGFycmF5IG9mIGxpZ2h0cy5cclxuICpcclxuICogQHRzbFxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtBcnJheTxMaWdodD59IGxpZ2h0cyAtIEFuIGFycmF5IG9mIGxpZ2h0cy5cclxuICogQHJldHVybiB7TGlnaHRzTm9kZX0gVGhlIGNyZWF0ZWQgbGlnaHRzIG5vZGUuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgbGlnaHRzID0gKCBsaWdodHMgPSBbXSApID0+IG5vZGVPYmplY3QoIG5ldyBMaWdodHNOb2RlKCkgKS5zZXRMaWdodHMoIGxpZ2h0cyApO1xyXG4iLCJpbXBvcnQgTm9kZSBmcm9tICcuLi9jb3JlL05vZGUuanMnO1xyXG5pbXBvcnQgeyBOb2RlVXBkYXRlVHlwZSB9IGZyb20gJy4uL2NvcmUvY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcbmltcG9ydCB7IHBvc2l0aW9uV29ybGQgfSBmcm9tICcuLi9hY2Nlc3NvcnMvUG9zaXRpb24uanMnO1xyXG5cclxuLyoqXHJcbiAqIEJhc2UgY2xhc3MgZm9yIGFsbCBzaGFkb3cgbm9kZXMuXHJcbiAqXHJcbiAqIFNoYWRvdyBub2RlcyBlbmNhcHN1bGF0ZSBzaGFkb3cgcmVsYXRlZCBsb2dpYyBhbmQgYXJlIGFsd2F5cyBjb3VwbGVkIHRvIGxpZ2h0aW5nIG5vZGVzLlxyXG4gKiBMaWdodGluZyBub2RlcyBtaWdodCBzaGFyZSB0aGUgc2FtZSBzaGFkb3cgbm9kZSB0eXBlIG9yIHVzZSBzcGVjaWZpYyBvbmVzIGRlcGVuZGluZyBvblxyXG4gKiB0aGVpciByZXF1aXJlbWVudHMuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBOb2RlXHJcbiAqL1xyXG5jbGFzcyBTaGFkb3dCYXNlTm9kZSBleHRlbmRzIE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdTaGFkb3dCYXNlTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBzaGFkb3cgYmFzZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtMaWdodH0gbGlnaHQgLSBUaGUgc2hhZG93IGNhc3RpbmcgbGlnaHQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGxpZ2h0ICkge1xyXG5cclxuXHRcdHN1cGVyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc2hhZG93IGNhc3RpbmcgbGlnaHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0xpZ2h0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxpZ2h0ID0gbGlnaHQ7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBPdmVyd3JpdHRlbiBzaW5jZSBzaGFkb3dzIGFyZSB1cGRhdGVkIGJ5IGRlZmF1bHQgcGVyIHJlbmRlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICogQGRlZmF1bHQgJ3JlbmRlcidcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51cGRhdGVCZWZvcmVUeXBlID0gTm9kZVVwZGF0ZVR5cGUuUkVOREVSO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1NoYWRvd0Jhc2VOb2RlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXR1cHMgdGhlIHNoYWRvdyBwb3NpdGlvbiBub2RlIHdoaWNoIGlzIGJ5IGRlZmF1bHQgdGhlIHByZWRlZmluZWQgVFNMIG5vZGUgb2JqZWN0IGBzaGFkb3dQb3NpdGlvbldvcmxkYC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IG9iamVjdCAtIEEgY29uZmlndXJhdGlvbiBvYmplY3QgdGhhdCBtdXN0IGF0IGxlYXN0IGhvbGQgYSBtYXRlcmlhbCByZWZlcmVuY2UuXHJcblx0ICovXHJcblx0c2V0dXBTaGFkb3dQb3NpdGlvbiggeyBjb250ZXh0LCBtYXRlcmlhbCB9ICkge1xyXG5cclxuXHRcdC8vIFVzZSBhc3NpZ24gaW5zaWRlIGFuIEZuKClcclxuXHJcblx0XHRzaGFkb3dQb3NpdGlvbldvcmxkLmFzc2lnbiggbWF0ZXJpYWwuc2hhZG93UG9zaXRpb25Ob2RlIHx8IGNvbnRleHQuc2hhZG93UG9zaXRpb25Xb3JsZCB8fCBwb3NpdGlvbldvcmxkICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2FuIGJlIGNhbGxlZCB3aGVuIHRoZSBzaGFkb3cgaXNuJ3QgcmVxdWlyZWQgYW55bW9yZS4gVGhhdCBjYW4gaGFwcGVuIHdoZW5cclxuXHQgKiBhIGxpZ2h0aW5nIG5vZGUgc3RvcHMgY2FzdGluZyBzaGFkb3dzIGJ5IHNldHRpbmcge0BsaW5rIE9iamVjdDNEI2Nhc3RTaGFkb3d9XHJcblx0ICogdG8gYGZhbHNlYC5cclxuXHQgKi9cclxuXHRkaXNwb3NlKCkge1xyXG5cclxuXHRcdHRoaXMudXBkYXRlQmVmb3JlVHlwZSA9IE5vZGVVcGRhdGVUeXBlLk5PTkU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUU0wgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgdmVydGV4IHBvc2l0aW9uIGluIHdvcmxkIHNwYWNlIGR1cmluZyB0aGUgc2hhZG93IHBhc3MuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQHR5cGUge05vZGU8dmVjMz59XHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgc2hhZG93UG9zaXRpb25Xb3JsZCA9IC8qQF9fUFVSRV9fKi8gcHJvcGVydHkoICd2ZWMzJywgJ3NoYWRvd1Bvc2l0aW9uV29ybGQnICk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTaGFkb3dCYXNlTm9kZTtcclxuIiwiaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi8uLi9tYXRoL0NvbG9yLmpzJztcclxuXHJcbi8qKlxyXG4gKiBTYXZlcyB0aGUgc3RhdGUgb2YgdGhlIGdpdmVuIHJlbmRlcmVyIGFuZCBzdG9yZXMgaXQgaW50byB0aGUgZ2l2ZW4gc3RhdGUgb2JqZWN0LlxyXG4gKlxyXG4gKiBJZiBub3Qgc3RhdGUgb2JqZWN0IGlzIHByb3ZpZGVkLCB0aGUgZnVuY3Rpb24gY3JlYXRlcyBvbmUuXHJcbiAqXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge1JlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuICogQHBhcmFtIHtPYmplY3R9IFtzdGF0ZT17fV0gLSBUaGUgc3RhdGUuXHJcbiAqIEByZXR1cm4ge09iamVjdH0gVGhlIHN0YXRlLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHNhdmVSZW5kZXJlclN0YXRlKCByZW5kZXJlciwgc3RhdGUgPSB7fSApIHtcclxuXHJcblx0c3RhdGUudG9uZU1hcHBpbmcgPSByZW5kZXJlci50b25lTWFwcGluZztcclxuXHRzdGF0ZS50b25lTWFwcGluZ0V4cG9zdXJlID0gcmVuZGVyZXIudG9uZU1hcHBpbmdFeHBvc3VyZTtcclxuXHRzdGF0ZS5vdXRwdXRDb2xvclNwYWNlID0gcmVuZGVyZXIub3V0cHV0Q29sb3JTcGFjZTtcclxuXHRzdGF0ZS5yZW5kZXJUYXJnZXQgPSByZW5kZXJlci5nZXRSZW5kZXJUYXJnZXQoKTtcclxuXHRzdGF0ZS5hY3RpdmVDdWJlRmFjZSA9IHJlbmRlcmVyLmdldEFjdGl2ZUN1YmVGYWNlKCk7XHJcblx0c3RhdGUuYWN0aXZlTWlwbWFwTGV2ZWwgPSByZW5kZXJlci5nZXRBY3RpdmVNaXBtYXBMZXZlbCgpO1xyXG5cdHN0YXRlLnJlbmRlck9iamVjdEZ1bmN0aW9uID0gcmVuZGVyZXIuZ2V0UmVuZGVyT2JqZWN0RnVuY3Rpb24oKTtcclxuXHRzdGF0ZS5waXhlbFJhdGlvID0gcmVuZGVyZXIuZ2V0UGl4ZWxSYXRpbygpO1xyXG5cdHN0YXRlLm1ydCA9IHJlbmRlcmVyLmdldE1SVCgpO1xyXG5cdHN0YXRlLmNsZWFyQ29sb3IgPSByZW5kZXJlci5nZXRDbGVhckNvbG9yKCBzdGF0ZS5jbGVhckNvbG9yIHx8IG5ldyBDb2xvcigpICk7XHJcblx0c3RhdGUuY2xlYXJBbHBoYSA9IHJlbmRlcmVyLmdldENsZWFyQWxwaGEoKTtcclxuXHRzdGF0ZS5hdXRvQ2xlYXIgPSByZW5kZXJlci5hdXRvQ2xlYXI7XHJcblx0c3RhdGUuc2Npc3NvclRlc3QgPSByZW5kZXJlci5nZXRTY2lzc29yVGVzdCgpO1xyXG5cclxuXHRyZXR1cm4gc3RhdGU7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogU2F2ZXMgdGhlIHN0YXRlIG9mIHRoZSBnaXZlbiByZW5kZXJlciBhbmQgc3RvcmVzIGl0IGludG8gdGhlIGdpdmVuIHN0YXRlIG9iamVjdC5cclxuICogQmVzaWRlcywgdGhlIGZ1bmN0aW9uIGFsc28gcmVzZXRzIHRoZSBzdGF0ZSBvZiB0aGUgcmVuZGVyZXIgdG8gaXRzIGRlZmF1bHQgdmFsdWVzLlxyXG4gKlxyXG4gKiBJZiBub3Qgc3RhdGUgb2JqZWN0IGlzIHByb3ZpZGVkLCB0aGUgZnVuY3Rpb24gY3JlYXRlcyBvbmUuXHJcbiAqXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge1JlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuICogQHBhcmFtIHtPYmplY3R9IFtzdGF0ZT17fV0gLSBUaGUgc3RhdGUuXHJcbiAqIEByZXR1cm4ge09iamVjdH0gVGhlIHN0YXRlLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0UmVuZGVyZXJTdGF0ZSggcmVuZGVyZXIsIHN0YXRlICkge1xyXG5cclxuXHRzdGF0ZSA9IHNhdmVSZW5kZXJlclN0YXRlKCByZW5kZXJlciwgc3RhdGUgKTtcclxuXHJcblx0cmVuZGVyZXIuc2V0TVJUKCBudWxsICk7XHJcblx0cmVuZGVyZXIuc2V0UmVuZGVyT2JqZWN0RnVuY3Rpb24oIG51bGwgKTtcclxuXHRyZW5kZXJlci5zZXRDbGVhckNvbG9yKCAweDAwMDAwMCwgMSApO1xyXG5cdHJlbmRlcmVyLmF1dG9DbGVhciA9IHRydWU7XHJcblxyXG5cdHJldHVybiBzdGF0ZTtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXN0b3JlcyB0aGUgc3RhdGUgb2YgdGhlIGdpdmVuIHJlbmRlcmVyIGZyb20gdGhlIGdpdmVuIHN0YXRlIG9iamVjdC5cclxuICpcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7UmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhdGUgLSBUaGUgc3RhdGUgdG8gcmVzdG9yZS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiByZXN0b3JlUmVuZGVyZXJTdGF0ZSggcmVuZGVyZXIsIHN0YXRlICkge1xyXG5cclxuXHRyZW5kZXJlci50b25lTWFwcGluZyA9IHN0YXRlLnRvbmVNYXBwaW5nO1xyXG5cdHJlbmRlcmVyLnRvbmVNYXBwaW5nRXhwb3N1cmUgPSBzdGF0ZS50b25lTWFwcGluZ0V4cG9zdXJlO1xyXG5cdHJlbmRlcmVyLm91dHB1dENvbG9yU3BhY2UgPSBzdGF0ZS5vdXRwdXRDb2xvclNwYWNlO1xyXG5cdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggc3RhdGUucmVuZGVyVGFyZ2V0LCBzdGF0ZS5hY3RpdmVDdWJlRmFjZSwgc3RhdGUuYWN0aXZlTWlwbWFwTGV2ZWwgKTtcclxuXHRyZW5kZXJlci5zZXRSZW5kZXJPYmplY3RGdW5jdGlvbiggc3RhdGUucmVuZGVyT2JqZWN0RnVuY3Rpb24gKTtcclxuXHRyZW5kZXJlci5zZXRQaXhlbFJhdGlvKCBzdGF0ZS5waXhlbFJhdGlvICk7XHJcblx0cmVuZGVyZXIuc2V0TVJUKCBzdGF0ZS5tcnQgKTtcclxuXHRyZW5kZXJlci5zZXRDbGVhckNvbG9yKCBzdGF0ZS5jbGVhckNvbG9yLCBzdGF0ZS5jbGVhckFscGhhICk7XHJcblx0cmVuZGVyZXIuYXV0b0NsZWFyID0gc3RhdGUuYXV0b0NsZWFyO1xyXG5cdHJlbmRlcmVyLnNldFNjaXNzb3JUZXN0KCBzdGF0ZS5zY2lzc29yVGVzdCApO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFNhdmVzIHRoZSBzdGF0ZSBvZiB0aGUgZ2l2ZW4gc2NlbmUgYW5kIHN0b3JlcyBpdCBpbnRvIHRoZSBnaXZlbiBzdGF0ZSBvYmplY3QuXHJcbiAqXHJcbiAqIElmIG5vdCBzdGF0ZSBvYmplY3QgaXMgcHJvdmlkZWQsIHRoZSBmdW5jdGlvbiBjcmVhdGVzIG9uZS5cclxuICpcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7U2NlbmV9IHNjZW5lIC0gVGhlIHNjZW5lLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gW3N0YXRlPXt9XSAtIFRoZSBzdGF0ZS5cclxuICogQHJldHVybiB7T2JqZWN0fSBUaGUgc3RhdGUuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gc2F2ZVNjZW5lU3RhdGUoIHNjZW5lLCBzdGF0ZSA9IHt9ICkge1xyXG5cclxuXHRzdGF0ZS5iYWNrZ3JvdW5kID0gc2NlbmUuYmFja2dyb3VuZDtcclxuXHRzdGF0ZS5iYWNrZ3JvdW5kTm9kZSA9IHNjZW5lLmJhY2tncm91bmROb2RlO1xyXG5cdHN0YXRlLm92ZXJyaWRlTWF0ZXJpYWwgPSBzY2VuZS5vdmVycmlkZU1hdGVyaWFsO1xyXG5cclxuXHRyZXR1cm4gc3RhdGU7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogU2F2ZXMgdGhlIHN0YXRlIG9mIHRoZSBnaXZlbiBzY2VuZSBhbmQgc3RvcmVzIGl0IGludG8gdGhlIGdpdmVuIHN0YXRlIG9iamVjdC5cclxuICogQmVzaWRlcywgdGhlIGZ1bmN0aW9uIGFsc28gcmVzZXRzIHRoZSBzdGF0ZSBvZiB0aGUgc2NlbmUgdG8gaXRzIGRlZmF1bHQgdmFsdWVzLlxyXG4gKlxyXG4gKiBJZiBub3Qgc3RhdGUgb2JqZWN0IGlzIHByb3ZpZGVkLCB0aGUgZnVuY3Rpb24gY3JlYXRlcyBvbmUuXHJcbiAqXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge1NjZW5lfSBzY2VuZSAtIFRoZSBzY2VuZS5cclxuICogQHBhcmFtIHtPYmplY3R9IFtzdGF0ZT17fV0gLSBUaGUgc3RhdGUuXHJcbiAqIEByZXR1cm4ge09iamVjdH0gVGhlIHN0YXRlLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0U2NlbmVTdGF0ZSggc2NlbmUsIHN0YXRlICkge1xyXG5cclxuXHRzdGF0ZSA9IHNhdmVTY2VuZVN0YXRlKCBzY2VuZSwgc3RhdGUgKTtcclxuXHJcblx0c2NlbmUuYmFja2dyb3VuZCA9IG51bGw7XHJcblx0c2NlbmUuYmFja2dyb3VuZE5vZGUgPSBudWxsO1xyXG5cdHNjZW5lLm92ZXJyaWRlTWF0ZXJpYWwgPSBudWxsO1xyXG5cclxuXHRyZXR1cm4gc3RhdGU7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogUmVzdG9yZXMgdGhlIHN0YXRlIG9mIHRoZSBnaXZlbiBzY2VuZSBmcm9tIHRoZSBnaXZlbiBzdGF0ZSBvYmplY3QuXHJcbiAqXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge1NjZW5lfSBzY2VuZSAtIFRoZSBzY2VuZS5cclxuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlIC0gVGhlIHN0YXRlIHRvIHJlc3RvcmUuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcmVzdG9yZVNjZW5lU3RhdGUoIHNjZW5lLCBzdGF0ZSApIHtcclxuXHJcblx0c2NlbmUuYmFja2dyb3VuZCA9IHN0YXRlLmJhY2tncm91bmQ7XHJcblx0c2NlbmUuYmFja2dyb3VuZE5vZGUgPSBzdGF0ZS5iYWNrZ3JvdW5kTm9kZTtcclxuXHRzY2VuZS5vdmVycmlkZU1hdGVyaWFsID0gc3RhdGUub3ZlcnJpZGVNYXRlcmlhbDtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTYXZlcyB0aGUgc3RhdGUgb2YgdGhlIGdpdmVuIHJlbmRlcmVyIGFuZCBzY2VuZSBhbmQgc3RvcmVzIGl0IGludG8gdGhlIGdpdmVuIHN0YXRlIG9iamVjdC5cclxuICpcclxuICogSWYgbm90IHN0YXRlIG9iamVjdCBpcyBwcm92aWRlZCwgdGhlIGZ1bmN0aW9uIGNyZWF0ZXMgb25lLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcbiAqIEBwYXJhbSB7U2NlbmV9IHNjZW5lIC0gVGhlIHNjZW5lLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gW3N0YXRlPXt9XSAtIFRoZSBzdGF0ZS5cclxuICogQHJldHVybiB7T2JqZWN0fSBUaGUgc3RhdGUuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gc2F2ZVJlbmRlcmVyQW5kU2NlbmVTdGF0ZSggcmVuZGVyZXIsIHNjZW5lLCBzdGF0ZSA9IHt9ICkge1xyXG5cclxuXHRzdGF0ZSA9IHNhdmVSZW5kZXJlclN0YXRlKCByZW5kZXJlciwgc3RhdGUgKTtcclxuXHRzdGF0ZSA9IHNhdmVTY2VuZVN0YXRlKCBzY2VuZSwgc3RhdGUgKTtcclxuXHJcblx0cmV0dXJuIHN0YXRlO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFNhdmVzIHRoZSBzdGF0ZSBvZiB0aGUgZ2l2ZW4gcmVuZGVyZXIgYW5kIHNjZW5lIGFuZCBzdG9yZXMgaXQgaW50byB0aGUgZ2l2ZW4gc3RhdGUgb2JqZWN0LlxyXG4gKiBCZXNpZGVzLCB0aGUgZnVuY3Rpb24gYWxzbyByZXNldHMgdGhlIHN0YXRlIG9mIHRoZSByZW5kZXJlciBhbmQgc2NlbmUgdG8gaXRzIGRlZmF1bHQgdmFsdWVzLlxyXG4gKlxyXG4gKiBJZiBub3Qgc3RhdGUgb2JqZWN0IGlzIHByb3ZpZGVkLCB0aGUgZnVuY3Rpb24gY3JlYXRlcyBvbmUuXHJcbiAqXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge1JlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuICogQHBhcmFtIHtTY2VuZX0gc2NlbmUgLSBUaGUgc2NlbmUuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhdGU9e31dIC0gVGhlIHN0YXRlLlxyXG4gKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBzdGF0ZS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiByZXNldFJlbmRlcmVyQW5kU2NlbmVTdGF0ZSggcmVuZGVyZXIsIHNjZW5lLCBzdGF0ZSApIHtcclxuXHJcblx0c3RhdGUgPSByZXNldFJlbmRlcmVyU3RhdGUoIHJlbmRlcmVyLCBzdGF0ZSApO1xyXG5cdHN0YXRlID0gcmVzZXRTY2VuZVN0YXRlKCBzY2VuZSwgc3RhdGUgKTtcclxuXHJcblx0cmV0dXJuIHN0YXRlO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFJlc3RvcmVzIHRoZSBzdGF0ZSBvZiB0aGUgZ2l2ZW4gcmVuZGVyZXIgYW5kIHNjZW5lIGZyb20gdGhlIGdpdmVuIHN0YXRlIG9iamVjdC5cclxuICpcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7UmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG4gKiBAcGFyYW0ge1NjZW5lfSBzY2VuZSAtIFRoZSBzY2VuZS5cclxuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlIC0gVGhlIHN0YXRlIHRvIHJlc3RvcmUuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcmVzdG9yZVJlbmRlcmVyQW5kU2NlbmVTdGF0ZSggcmVuZGVyZXIsIHNjZW5lLCBzdGF0ZSApIHtcclxuXHJcblx0cmVzdG9yZVJlbmRlcmVyU3RhdGUoIHJlbmRlcmVyLCBzdGF0ZSApO1xyXG5cdHJlc3RvcmVTY2VuZVN0YXRlKCBzY2VuZSwgc3RhdGUgKTtcclxuXHJcbn1cclxuIiwiaW1wb3J0IFNoYWRvd0Jhc2VOb2RlLCB7IHNoYWRvd1Bvc2l0aW9uV29ybGQgfSBmcm9tICcuL1NoYWRvd0Jhc2VOb2RlLmpzJztcclxuaW1wb3J0IHsgZmxvYXQsIHZlYzIsIHZlYzMsIHZlYzQsIElmLCBpbnQsIEZuLCBub2RlT2JqZWN0IH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5pbXBvcnQgeyByZWZlcmVuY2UgfSBmcm9tICcuLi9hY2Nlc3NvcnMvUmVmZXJlbmNlTm9kZS5qcyc7XHJcbmltcG9ydCB7IHRleHR1cmUgfSBmcm9tICcuLi9hY2Nlc3NvcnMvVGV4dHVyZU5vZGUuanMnO1xyXG5pbXBvcnQgeyBwb3NpdGlvbldvcmxkIH0gZnJvbSAnLi4vYWNjZXNzb3JzL1Bvc2l0aW9uLmpzJztcclxuaW1wb3J0IHsgdHJhbnNmb3JtZWROb3JtYWxXb3JsZCB9IGZyb20gJy4uL2FjY2Vzc29ycy9Ob3JtYWwuanMnO1xyXG5pbXBvcnQgeyBtaXgsIGZyYWN0LCBzdGVwLCBtYXgsIGNsYW1wLCBzcXJ0IH0gZnJvbSAnLi4vbWF0aC9NYXRoTm9kZS5qcyc7XHJcbmltcG9ydCB7IGFkZCwgc3ViIH0gZnJvbSAnLi4vbWF0aC9PcGVyYXRvck5vZGUuanMnO1xyXG5pbXBvcnQgeyBEZXB0aFRleHR1cmUgfSBmcm9tICcuLi8uLi90ZXh0dXJlcy9EZXB0aFRleHR1cmUuanMnO1xyXG5pbXBvcnQgTm9kZU1hdGVyaWFsIGZyb20gJy4uLy4uL21hdGVyaWFscy9ub2Rlcy9Ob2RlTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgUXVhZE1lc2ggZnJvbSAnLi4vLi4vcmVuZGVyZXJzL2NvbW1vbi9RdWFkTWVzaC5qcyc7XHJcbmltcG9ydCB7IExvb3AgfSBmcm9tICcuLi91dGlscy9Mb29wTm9kZS5qcyc7XHJcbmltcG9ydCB7IHNjcmVlbkNvb3JkaW5hdGUgfSBmcm9tICcuLi9kaXNwbGF5L1NjcmVlbk5vZGUuanMnO1xyXG5pbXBvcnQgeyBIYWxmRmxvYXRUeXBlLCBMZXNzQ29tcGFyZSwgUkdGb3JtYXQsIFZTTVNoYWRvd01hcCwgV2ViR1BVQ29vcmRpbmF0ZVN5c3RlbSB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IHJlbmRlckdyb3VwIH0gZnJvbSAnLi4vY29yZS9Vbmlmb3JtR3JvdXBOb2RlLmpzJztcclxuaW1wb3J0IHsgdmlld1pUb0xvZ2FyaXRobWljRGVwdGggfSBmcm9tICcuLi9kaXNwbGF5L1ZpZXdwb3J0RGVwdGhOb2RlLmpzJztcclxuaW1wb3J0IHsgb2JqZWN0UG9zaXRpb24gfSBmcm9tICcuLi9hY2Nlc3NvcnMvT2JqZWN0M0ROb2RlLmpzJztcclxuaW1wb3J0IHsgbGlnaHRTaGFkb3dNYXRyaXggfSBmcm9tICcuLi9hY2Nlc3NvcnMvTGlnaHRzLmpzJztcclxuaW1wb3J0IHsgcmVzZXRSZW5kZXJlckFuZFNjZW5lU3RhdGUsIHJlc3RvcmVSZW5kZXJlckFuZFNjZW5lU3RhdGUgfSBmcm9tICcuLi8uLi9yZW5kZXJlcnMvY29tbW9uL1JlbmRlcmVyVXRpbHMuanMnO1xyXG5pbXBvcnQgeyBnZXREYXRhRnJvbU9iamVjdCB9IGZyb20gJy4uL2NvcmUvTm9kZVV0aWxzLmpzJztcclxuXHJcbmNvbnN0IHNoYWRvd01hdGVyaWFsTGliID0gLypAX19QVVJFX18qLyBuZXcgV2Vha01hcCgpO1xyXG5jb25zdCBsaW5lYXJEaXN0YW5jZSA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyBwb3NpdGlvbiwgY2FtZXJhTmVhciwgY2FtZXJhRmFyIF0gKSA9PiB7XHJcblxyXG5cdGxldCBkaXN0ID0gcG9zaXRpb25Xb3JsZC5zdWIoIHBvc2l0aW9uICkubGVuZ3RoKCk7XHJcblx0ZGlzdCA9IGRpc3Quc3ViKCBjYW1lcmFOZWFyICkuZGl2KCBjYW1lcmFGYXIuc3ViKCBjYW1lcmFOZWFyICkgKTtcclxuXHRkaXN0ID0gZGlzdC5zYXR1cmF0ZSgpOyAvLyBjbGFtcCB0byBbIDAsIDEgXVxyXG5cclxuXHRyZXR1cm4gZGlzdDtcclxuXHJcbn0gKTtcclxuXHJcbmNvbnN0IGxpbmVhclNoYWRvd0Rpc3RhbmNlID0gKCBsaWdodCApID0+IHtcclxuXHJcblx0Y29uc3QgY2FtZXJhID0gbGlnaHQuc2hhZG93LmNhbWVyYTtcclxuXHJcblx0Y29uc3QgbmVhckRpc3RhbmNlID0gcmVmZXJlbmNlKCAnbmVhcicsICdmbG9hdCcsIGNhbWVyYSApLnNldEdyb3VwKCByZW5kZXJHcm91cCApO1xyXG5cdGNvbnN0IGZhckRpc3RhbmNlID0gcmVmZXJlbmNlKCAnZmFyJywgJ2Zsb2F0JywgY2FtZXJhICkuc2V0R3JvdXAoIHJlbmRlckdyb3VwICk7XHJcblxyXG5cdGNvbnN0IHJlZmVyZW5jZVBvc2l0aW9uID0gb2JqZWN0UG9zaXRpb24oIGxpZ2h0ICk7XHJcblxyXG5cdHJldHVybiBsaW5lYXJEaXN0YW5jZSggcmVmZXJlbmNlUG9zaXRpb24sIG5lYXJEaXN0YW5jZSwgZmFyRGlzdGFuY2UgKTtcclxuXHJcbn07XHJcblxyXG5jb25zdCBnZXRTaGFkb3dNYXRlcmlhbCA9ICggbGlnaHQgKSA9PiB7XHJcblxyXG5cdGxldCBtYXRlcmlhbCA9IHNoYWRvd01hdGVyaWFsTGliLmdldCggbGlnaHQgKTtcclxuXHJcblx0aWYgKCBtYXRlcmlhbCA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdGNvbnN0IGRlcHRoTm9kZSA9IGxpZ2h0LmlzUG9pbnRMaWdodCA/IGxpbmVhclNoYWRvd0Rpc3RhbmNlKCBsaWdodCApIDogbnVsbDtcclxuXHJcblx0XHRtYXRlcmlhbCA9IG5ldyBOb2RlTWF0ZXJpYWwoKTtcclxuXHRcdG1hdGVyaWFsLmNvbG9yTm9kZSA9IHZlYzQoIDAsIDAsIDAsIDEgKTtcclxuXHRcdG1hdGVyaWFsLmRlcHRoTm9kZSA9IGRlcHRoTm9kZTtcclxuXHRcdG1hdGVyaWFsLmlzU2hhZG93UGFzc01hdGVyaWFsID0gdHJ1ZTsgLy8gVXNlIHRvIGF2b2lkIG90aGVyIG92ZXJyaWRlTWF0ZXJpYWwgb3ZlcnJpZGUgbWF0ZXJpYWwuY29sb3JOb2RlIHVuaW50ZW50aW9uYWxseSB3aGVuIHVzaW5nIG1hdGVyaWFsLnNoYWRvd05vZGVcclxuXHRcdG1hdGVyaWFsLm5hbWUgPSAnU2hhZG93TWF0ZXJpYWwnO1xyXG5cdFx0bWF0ZXJpYWwuZm9nID0gZmFsc2U7XHJcblxyXG5cdFx0c2hhZG93TWF0ZXJpYWxMaWIuc2V0KCBsaWdodCwgbWF0ZXJpYWwgKTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gbWF0ZXJpYWw7XHJcblxyXG59O1xyXG5cclxuLyoqXHJcbiAqIEEgc2hhZG93IGZpbHRlcmluZyBmdW5jdGlvbiBwZXJmb3JtaW5nIGJhc2ljIGZpbHRlcmluZy4gVGhpcyBpcyBpbiBmYWN0IGFuIHVuZmlsdGVyZWQgdmVyc2lvbiBvZiB0aGUgc2hhZG93IG1hcFxyXG4gKiB3aXRoIGEgYmluYXJ5IGBbMCwxXWAgcmVzdWx0LlxyXG4gKlxyXG4gKiBAbWV0aG9kXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dHMgLSBUaGUgaW5wdXQgcGFyYW1ldGVyIG9iamVjdC5cclxuICogQHBhcmFtIHtEZXB0aFRleHR1cmV9IGlucHV0cy5kZXB0aFRleHR1cmUgLSBBIHJlZmVyZW5jZSB0byB0aGUgc2hhZG93IG1hcCdzIHRleHR1cmUgZGF0YS5cclxuICogQHBhcmFtIHtOb2RlPHZlYzM+fSBpbnB1dHMuc2hhZG93Q29vcmQgLSBUaGUgc2hhZG93IGNvb3JkaW5hdGVzLlxyXG4gKiBAcmV0dXJuIHtOb2RlPGZsb2F0Pn0gVGhlIGZpbHRlcmluZyByZXN1bHQuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgQmFzaWNTaGFkb3dGaWx0ZXIgPSAvKkBfX1BVUkVfXyovIEZuKCAoIHsgZGVwdGhUZXh0dXJlLCBzaGFkb3dDb29yZCB9ICkgPT4ge1xyXG5cclxuXHRyZXR1cm4gdGV4dHVyZSggZGVwdGhUZXh0dXJlLCBzaGFkb3dDb29yZC54eSApLmNvbXBhcmUoIHNoYWRvd0Nvb3JkLnogKTtcclxuXHJcbn0gKTtcclxuXHJcbi8qKlxyXG4gKiBBIHNoYWRvdyBmaWx0ZXJpbmcgZnVuY3Rpb24gcGVyZm9ybWluZyBQQ0YgZmlsdGVyaW5nLlxyXG4gKlxyXG4gKiBAbWV0aG9kXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dHMgLSBUaGUgaW5wdXQgcGFyYW1ldGVyIG9iamVjdC5cclxuICogQHBhcmFtIHtEZXB0aFRleHR1cmV9IGlucHV0cy5kZXB0aFRleHR1cmUgLSBBIHJlZmVyZW5jZSB0byB0aGUgc2hhZG93IG1hcCdzIHRleHR1cmUgZGF0YS5cclxuICogQHBhcmFtIHtOb2RlPHZlYzM+fSBpbnB1dHMuc2hhZG93Q29vcmQgLSBUaGUgc2hhZG93IGNvb3JkaW5hdGVzLlxyXG4gKiBAcGFyYW0ge0xpZ2h0U2hhZG93fSBpbnB1dHMuc2hhZG93IC0gVGhlIGxpZ2h0IHNoYWRvdy5cclxuICogQHJldHVybiB7Tm9kZTxmbG9hdD59IFRoZSBmaWx0ZXJpbmcgcmVzdWx0LlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFBDRlNoYWRvd0ZpbHRlciA9IC8qQF9fUFVSRV9fKi8gRm4oICggeyBkZXB0aFRleHR1cmUsIHNoYWRvd0Nvb3JkLCBzaGFkb3cgfSApID0+IHtcclxuXHJcblx0Y29uc3QgZGVwdGhDb21wYXJlID0gKCB1diwgY29tcGFyZSApID0+IHRleHR1cmUoIGRlcHRoVGV4dHVyZSwgdXYgKS5jb21wYXJlKCBjb21wYXJlICk7XHJcblxyXG5cdGNvbnN0IG1hcFNpemUgPSByZWZlcmVuY2UoICdtYXBTaXplJywgJ3ZlYzInLCBzaGFkb3cgKS5zZXRHcm91cCggcmVuZGVyR3JvdXAgKTtcclxuXHRjb25zdCByYWRpdXMgPSByZWZlcmVuY2UoICdyYWRpdXMnLCAnZmxvYXQnLCBzaGFkb3cgKS5zZXRHcm91cCggcmVuZGVyR3JvdXAgKTtcclxuXHJcblx0Y29uc3QgdGV4ZWxTaXplID0gdmVjMiggMSApLmRpdiggbWFwU2l6ZSApO1xyXG5cdGNvbnN0IGR4MCA9IHRleGVsU2l6ZS54Lm5lZ2F0ZSgpLm11bCggcmFkaXVzICk7XHJcblx0Y29uc3QgZHkwID0gdGV4ZWxTaXplLnkubmVnYXRlKCkubXVsKCByYWRpdXMgKTtcclxuXHRjb25zdCBkeDEgPSB0ZXhlbFNpemUueC5tdWwoIHJhZGl1cyApO1xyXG5cdGNvbnN0IGR5MSA9IHRleGVsU2l6ZS55Lm11bCggcmFkaXVzICk7XHJcblx0Y29uc3QgZHgyID0gZHgwLmRpdiggMiApO1xyXG5cdGNvbnN0IGR5MiA9IGR5MC5kaXYoIDIgKTtcclxuXHRjb25zdCBkeDMgPSBkeDEuZGl2KCAyICk7XHJcblx0Y29uc3QgZHkzID0gZHkxLmRpdiggMiApO1xyXG5cclxuXHRyZXR1cm4gYWRkKFxyXG5cdFx0ZGVwdGhDb21wYXJlKCBzaGFkb3dDb29yZC54eS5hZGQoIHZlYzIoIGR4MCwgZHkwICkgKSwgc2hhZG93Q29vcmQueiApLFxyXG5cdFx0ZGVwdGhDb21wYXJlKCBzaGFkb3dDb29yZC54eS5hZGQoIHZlYzIoIDAsIGR5MCApICksIHNoYWRvd0Nvb3JkLnogKSxcclxuXHRcdGRlcHRoQ29tcGFyZSggc2hhZG93Q29vcmQueHkuYWRkKCB2ZWMyKCBkeDEsIGR5MCApICksIHNoYWRvd0Nvb3JkLnogKSxcclxuXHRcdGRlcHRoQ29tcGFyZSggc2hhZG93Q29vcmQueHkuYWRkKCB2ZWMyKCBkeDIsIGR5MiApICksIHNoYWRvd0Nvb3JkLnogKSxcclxuXHRcdGRlcHRoQ29tcGFyZSggc2hhZG93Q29vcmQueHkuYWRkKCB2ZWMyKCAwLCBkeTIgKSApLCBzaGFkb3dDb29yZC56ICksXHJcblx0XHRkZXB0aENvbXBhcmUoIHNoYWRvd0Nvb3JkLnh5LmFkZCggdmVjMiggZHgzLCBkeTIgKSApLCBzaGFkb3dDb29yZC56ICksXHJcblx0XHRkZXB0aENvbXBhcmUoIHNoYWRvd0Nvb3JkLnh5LmFkZCggdmVjMiggZHgwLCAwICkgKSwgc2hhZG93Q29vcmQueiApLFxyXG5cdFx0ZGVwdGhDb21wYXJlKCBzaGFkb3dDb29yZC54eS5hZGQoIHZlYzIoIGR4MiwgMCApICksIHNoYWRvd0Nvb3JkLnogKSxcclxuXHRcdGRlcHRoQ29tcGFyZSggc2hhZG93Q29vcmQueHksIHNoYWRvd0Nvb3JkLnogKSxcclxuXHRcdGRlcHRoQ29tcGFyZSggc2hhZG93Q29vcmQueHkuYWRkKCB2ZWMyKCBkeDMsIDAgKSApLCBzaGFkb3dDb29yZC56ICksXHJcblx0XHRkZXB0aENvbXBhcmUoIHNoYWRvd0Nvb3JkLnh5LmFkZCggdmVjMiggZHgxLCAwICkgKSwgc2hhZG93Q29vcmQueiApLFxyXG5cdFx0ZGVwdGhDb21wYXJlKCBzaGFkb3dDb29yZC54eS5hZGQoIHZlYzIoIGR4MiwgZHkzICkgKSwgc2hhZG93Q29vcmQueiApLFxyXG5cdFx0ZGVwdGhDb21wYXJlKCBzaGFkb3dDb29yZC54eS5hZGQoIHZlYzIoIDAsIGR5MyApICksIHNoYWRvd0Nvb3JkLnogKSxcclxuXHRcdGRlcHRoQ29tcGFyZSggc2hhZG93Q29vcmQueHkuYWRkKCB2ZWMyKCBkeDMsIGR5MyApICksIHNoYWRvd0Nvb3JkLnogKSxcclxuXHRcdGRlcHRoQ29tcGFyZSggc2hhZG93Q29vcmQueHkuYWRkKCB2ZWMyKCBkeDAsIGR5MSApICksIHNoYWRvd0Nvb3JkLnogKSxcclxuXHRcdGRlcHRoQ29tcGFyZSggc2hhZG93Q29vcmQueHkuYWRkKCB2ZWMyKCAwLCBkeTEgKSApLCBzaGFkb3dDb29yZC56ICksXHJcblx0XHRkZXB0aENvbXBhcmUoIHNoYWRvd0Nvb3JkLnh5LmFkZCggdmVjMiggZHgxLCBkeTEgKSApLCBzaGFkb3dDb29yZC56IClcclxuXHQpLm11bCggMSAvIDE3ICk7XHJcblxyXG59ICk7XHJcblxyXG4vKipcclxuICogQSBzaGFkb3cgZmlsdGVyaW5nIGZ1bmN0aW9uIHBlcmZvcm1pbmcgUENGIHNvZnQgZmlsdGVyaW5nLlxyXG4gKlxyXG4gKiBAbWV0aG9kXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dHMgLSBUaGUgaW5wdXQgcGFyYW1ldGVyIG9iamVjdC5cclxuICogQHBhcmFtIHtEZXB0aFRleHR1cmV9IGlucHV0cy5kZXB0aFRleHR1cmUgLSBBIHJlZmVyZW5jZSB0byB0aGUgc2hhZG93IG1hcCdzIHRleHR1cmUgZGF0YS5cclxuICogQHBhcmFtIHtOb2RlPHZlYzM+fSBpbnB1dHMuc2hhZG93Q29vcmQgLSBUaGUgc2hhZG93IGNvb3JkaW5hdGVzLlxyXG4gKiBAcGFyYW0ge0xpZ2h0U2hhZG93fSBpbnB1dHMuc2hhZG93IC0gVGhlIGxpZ2h0IHNoYWRvdy5cclxuICogQHJldHVybiB7Tm9kZTxmbG9hdD59IFRoZSBmaWx0ZXJpbmcgcmVzdWx0LlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFBDRlNvZnRTaGFkb3dGaWx0ZXIgPSAvKkBfX1BVUkVfXyovIEZuKCAoIHsgZGVwdGhUZXh0dXJlLCBzaGFkb3dDb29yZCwgc2hhZG93IH0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IGRlcHRoQ29tcGFyZSA9ICggdXYsIGNvbXBhcmUgKSA9PiB0ZXh0dXJlKCBkZXB0aFRleHR1cmUsIHV2ICkuY29tcGFyZSggY29tcGFyZSApO1xyXG5cclxuXHRjb25zdCBtYXBTaXplID0gcmVmZXJlbmNlKCAnbWFwU2l6ZScsICd2ZWMyJywgc2hhZG93ICkuc2V0R3JvdXAoIHJlbmRlckdyb3VwICk7XHJcblxyXG5cdGNvbnN0IHRleGVsU2l6ZSA9IHZlYzIoIDEgKS5kaXYoIG1hcFNpemUgKTtcclxuXHRjb25zdCBkeCA9IHRleGVsU2l6ZS54O1xyXG5cdGNvbnN0IGR5ID0gdGV4ZWxTaXplLnk7XHJcblxyXG5cdGNvbnN0IHV2ID0gc2hhZG93Q29vcmQueHk7XHJcblx0Y29uc3QgZiA9IGZyYWN0KCB1di5tdWwoIG1hcFNpemUgKS5hZGQoIDAuNSApICk7XHJcblx0dXYuc3ViQXNzaWduKCBmLm11bCggdGV4ZWxTaXplICkgKTtcclxuXHJcblx0cmV0dXJuIGFkZChcclxuXHRcdGRlcHRoQ29tcGFyZSggdXYsIHNoYWRvd0Nvb3JkLnogKSxcclxuXHRcdGRlcHRoQ29tcGFyZSggdXYuYWRkKCB2ZWMyKCBkeCwgMCApICksIHNoYWRvd0Nvb3JkLnogKSxcclxuXHRcdGRlcHRoQ29tcGFyZSggdXYuYWRkKCB2ZWMyKCAwLCBkeSApICksIHNoYWRvd0Nvb3JkLnogKSxcclxuXHRcdGRlcHRoQ29tcGFyZSggdXYuYWRkKCB0ZXhlbFNpemUgKSwgc2hhZG93Q29vcmQueiApLFxyXG5cdFx0bWl4KFxyXG5cdFx0XHRkZXB0aENvbXBhcmUoIHV2LmFkZCggdmVjMiggZHgubmVnYXRlKCksIDAgKSApLCBzaGFkb3dDb29yZC56ICksXHJcblx0XHRcdGRlcHRoQ29tcGFyZSggdXYuYWRkKCB2ZWMyKCBkeC5tdWwoIDIgKSwgMCApICksIHNoYWRvd0Nvb3JkLnogKSxcclxuXHRcdFx0Zi54XHJcblx0XHQpLFxyXG5cdFx0bWl4KFxyXG5cdFx0XHRkZXB0aENvbXBhcmUoIHV2LmFkZCggdmVjMiggZHgubmVnYXRlKCksIGR5ICkgKSwgc2hhZG93Q29vcmQueiApLFxyXG5cdFx0XHRkZXB0aENvbXBhcmUoIHV2LmFkZCggdmVjMiggZHgubXVsKCAyICksIGR5ICkgKSwgc2hhZG93Q29vcmQueiApLFxyXG5cdFx0XHRmLnhcclxuXHRcdCksXHJcblx0XHRtaXgoXHJcblx0XHRcdGRlcHRoQ29tcGFyZSggdXYuYWRkKCB2ZWMyKCAwLCBkeS5uZWdhdGUoKSApICksIHNoYWRvd0Nvb3JkLnogKSxcclxuXHRcdFx0ZGVwdGhDb21wYXJlKCB1di5hZGQoIHZlYzIoIDAsIGR5Lm11bCggMiApICkgKSwgc2hhZG93Q29vcmQueiApLFxyXG5cdFx0XHRmLnlcclxuXHRcdCksXHJcblx0XHRtaXgoXHJcblx0XHRcdGRlcHRoQ29tcGFyZSggdXYuYWRkKCB2ZWMyKCBkeCwgZHkubmVnYXRlKCkgKSApLCBzaGFkb3dDb29yZC56ICksXHJcblx0XHRcdGRlcHRoQ29tcGFyZSggdXYuYWRkKCB2ZWMyKCBkeCwgZHkubXVsKCAyICkgKSApLCBzaGFkb3dDb29yZC56ICksXHJcblx0XHRcdGYueVxyXG5cdFx0KSxcclxuXHRcdG1peChcclxuXHRcdFx0bWl4KFxyXG5cdFx0XHRcdGRlcHRoQ29tcGFyZSggdXYuYWRkKCB2ZWMyKCBkeC5uZWdhdGUoKSwgZHkubmVnYXRlKCkgKSApLCBzaGFkb3dDb29yZC56ICksXHJcblx0XHRcdFx0ZGVwdGhDb21wYXJlKCB1di5hZGQoIHZlYzIoIGR4Lm11bCggMiApLCBkeS5uZWdhdGUoKSApICksIHNoYWRvd0Nvb3JkLnogKSxcclxuXHRcdFx0XHRmLnhcclxuXHRcdFx0KSxcclxuXHRcdFx0bWl4KFxyXG5cdFx0XHRcdGRlcHRoQ29tcGFyZSggdXYuYWRkKCB2ZWMyKCBkeC5uZWdhdGUoKSwgZHkubXVsKCAyICkgKSApLCBzaGFkb3dDb29yZC56ICksXHJcblx0XHRcdFx0ZGVwdGhDb21wYXJlKCB1di5hZGQoIHZlYzIoIGR4Lm11bCggMiApLCBkeS5tdWwoIDIgKSApICksIHNoYWRvd0Nvb3JkLnogKSxcclxuXHRcdFx0XHRmLnhcclxuXHRcdFx0KSxcclxuXHRcdFx0Zi55XHJcblx0XHQpXHJcblx0KS5tdWwoIDEgLyA5ICk7XHJcblxyXG59ICk7XHJcblxyXG4vKipcclxuICogQSBzaGFkb3cgZmlsdGVyaW5nIGZ1bmN0aW9uIHBlcmZvcm1pbmcgVlNNIGZpbHRlcmluZy5cclxuICpcclxuICogQG1ldGhvZFxyXG4gKiBAcGFyYW0ge09iamVjdH0gaW5wdXRzIC0gVGhlIGlucHV0IHBhcmFtZXRlciBvYmplY3QuXHJcbiAqIEBwYXJhbSB7RGVwdGhUZXh0dXJlfSBpbnB1dHMuZGVwdGhUZXh0dXJlIC0gQSByZWZlcmVuY2UgdG8gdGhlIHNoYWRvdyBtYXAncyB0ZXh0dXJlIGRhdGEuXHJcbiAqIEBwYXJhbSB7Tm9kZTx2ZWMzPn0gaW5wdXRzLnNoYWRvd0Nvb3JkIC0gVGhlIHNoYWRvdyBjb29yZGluYXRlcy5cclxuICogQHJldHVybiB7Tm9kZTxmbG9hdD59IFRoZSBmaWx0ZXJpbmcgcmVzdWx0LlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFZTTVNoYWRvd0ZpbHRlciA9IC8qQF9fUFVSRV9fKi8gRm4oICggeyBkZXB0aFRleHR1cmUsIHNoYWRvd0Nvb3JkIH0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IG9jY2x1c2lvbiA9IGZsb2F0KCAxICkudG9WYXIoKTtcclxuXHJcblx0Y29uc3QgZGlzdHJpYnV0aW9uID0gdGV4dHVyZSggZGVwdGhUZXh0dXJlICkuc2FtcGxlKCBzaGFkb3dDb29yZC54eSApLnJnO1xyXG5cclxuXHRjb25zdCBoYXJkU2hhZG93ID0gc3RlcCggc2hhZG93Q29vcmQueiwgZGlzdHJpYnV0aW9uLnggKTtcclxuXHJcblx0SWYoIGhhcmRTaGFkb3cubm90RXF1YWwoIGZsb2F0KCAxLjAgKSApLCAoKSA9PiB7XHJcblxyXG5cdFx0Y29uc3QgZGlzdGFuY2UgPSBzaGFkb3dDb29yZC56LnN1YiggZGlzdHJpYnV0aW9uLnggKTtcclxuXHRcdGNvbnN0IHZhcmlhbmNlID0gbWF4KCAwLCBkaXN0cmlidXRpb24ueS5tdWwoIGRpc3RyaWJ1dGlvbi55ICkgKTtcclxuXHRcdGxldCBzb2Z0bmVzc1Byb2JhYmlsaXR5ID0gdmFyaWFuY2UuZGl2KCB2YXJpYW5jZS5hZGQoIGRpc3RhbmNlLm11bCggZGlzdGFuY2UgKSApICk7IC8vIENoZWJleXNoZXZzIGluZXF1YWxpdHlcclxuXHRcdHNvZnRuZXNzUHJvYmFiaWxpdHkgPSBjbGFtcCggc3ViKCBzb2Z0bmVzc1Byb2JhYmlsaXR5LCAwLjMgKS5kaXYoIDAuOTUgLSAwLjMgKSApO1xyXG5cdFx0b2NjbHVzaW9uLmFzc2lnbiggY2xhbXAoIG1heCggaGFyZFNoYWRvdywgc29mdG5lc3NQcm9iYWJpbGl0eSApICkgKTtcclxuXHJcblx0fSApO1xyXG5cclxuXHRyZXR1cm4gb2NjbHVzaW9uO1xyXG5cclxufSApO1xyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgdGhlIHNoYWRlciBjb2RlIGZvciB0aGUgZmlyc3QgVlNNIHJlbmRlciBwYXNzLlxyXG4gKlxyXG4gKiBAbWV0aG9kXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dHMgLSBUaGUgaW5wdXQgcGFyYW1ldGVyIG9iamVjdC5cclxuICogQHBhcmFtIHtOb2RlPGZsb2F0Pn0gaW5wdXRzLnNhbXBsZXMgLSBUaGUgbnVtYmVyIG9mIHNhbXBsZXNcclxuICogQHBhcmFtIHtOb2RlPGZsb2F0Pn0gaW5wdXRzLnJhZGl1cyAtIFRoZSByYWRpdXMuXHJcbiAqIEBwYXJhbSB7Tm9kZTxmbG9hdD59IGlucHV0cy5zaXplIC0gVGhlIHNpemUuXHJcbiAqIEBwYXJhbSB7VGV4dHVyZU5vZGV9IGlucHV0cy5zaGFkb3dQYXNzIC0gQSByZWZlcmVuY2UgdG8gdGhlIHJlbmRlciB0YXJnZXQncyBkZXB0aCBkYXRhLlxyXG4gKiBAcmV0dXJuIHtOb2RlPHZlYzI+fSBUaGUgVlNNIG91dHB1dC5cclxuICovXHJcbmNvbnN0IFZTTVBhc3NWZXJ0aWNhbCA9IC8qQF9fUFVSRV9fKi8gRm4oICggeyBzYW1wbGVzLCByYWRpdXMsIHNpemUsIHNoYWRvd1Bhc3MgfSApID0+IHtcclxuXHJcblx0Y29uc3QgbWVhbiA9IGZsb2F0KCAwICkudG9WYXIoKTtcclxuXHRjb25zdCBzcXVhcmVkTWVhbiA9IGZsb2F0KCAwICkudG9WYXIoKTtcclxuXHJcblx0Y29uc3QgdXZTdHJpZGUgPSBzYW1wbGVzLmxlc3NUaGFuRXF1YWwoIGZsb2F0KCAxICkgKS5zZWxlY3QoIGZsb2F0KCAwICksIGZsb2F0KCAyICkuZGl2KCBzYW1wbGVzLnN1YiggMSApICkgKTtcclxuXHRjb25zdCB1dlN0YXJ0ID0gc2FtcGxlcy5sZXNzVGhhbkVxdWFsKCBmbG9hdCggMSApICkuc2VsZWN0KCBmbG9hdCggMCApLCBmbG9hdCggLSAxICkgKTtcclxuXHJcblx0TG9vcCggeyBzdGFydDogaW50KCAwICksIGVuZDogaW50KCBzYW1wbGVzICksIHR5cGU6ICdpbnQnLCBjb25kaXRpb246ICc8JyB9LCAoIHsgaSB9ICkgPT4ge1xyXG5cclxuXHRcdGNvbnN0IHV2T2Zmc2V0ID0gdXZTdGFydC5hZGQoIGZsb2F0KCBpICkubXVsKCB1dlN0cmlkZSApICk7XHJcblxyXG5cdFx0Y29uc3QgZGVwdGggPSBzaGFkb3dQYXNzLnNhbXBsZSggYWRkKCBzY3JlZW5Db29yZGluYXRlLnh5LCB2ZWMyKCAwLCB1dk9mZnNldCApLm11bCggcmFkaXVzICkgKS5kaXYoIHNpemUgKSApLng7XHJcblx0XHRtZWFuLmFkZEFzc2lnbiggZGVwdGggKTtcclxuXHRcdHNxdWFyZWRNZWFuLmFkZEFzc2lnbiggZGVwdGgubXVsKCBkZXB0aCApICk7XHJcblxyXG5cdH0gKTtcclxuXHJcblx0bWVhbi5kaXZBc3NpZ24oIHNhbXBsZXMgKTtcclxuXHRzcXVhcmVkTWVhbi5kaXZBc3NpZ24oIHNhbXBsZXMgKTtcclxuXHJcblx0Y29uc3Qgc3RkX2RldiA9IHNxcnQoIHNxdWFyZWRNZWFuLnN1YiggbWVhbi5tdWwoIG1lYW4gKSApICk7XHJcblx0cmV0dXJuIHZlYzIoIG1lYW4sIHN0ZF9kZXYgKTtcclxuXHJcbn0gKTtcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIHRoZSBzaGFkZXIgY29kZSBmb3IgdGhlIHNlY29uZCBWU00gcmVuZGVyIHBhc3MuXHJcbiAqXHJcbiAqIEBtZXRob2RcclxuICogQHBhcmFtIHtPYmplY3R9IGlucHV0cyAtIFRoZSBpbnB1dCBwYXJhbWV0ZXIgb2JqZWN0LlxyXG4gKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSBpbnB1dHMuc2FtcGxlcyAtIFRoZSBudW1iZXIgb2Ygc2FtcGxlc1xyXG4gKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSBpbnB1dHMucmFkaXVzIC0gVGhlIHJhZGl1cy5cclxuICogQHBhcmFtIHtOb2RlPGZsb2F0Pn0gaW5wdXRzLnNpemUgLSBUaGUgc2l6ZS5cclxuICogQHBhcmFtIHtUZXh0dXJlTm9kZX0gaW5wdXRzLnNoYWRvd1Bhc3MgLSBUaGUgcmVzdWx0IG9mIHRoZSBmaXJzdCBWU00gcmVuZGVyIHBhc3MuXHJcbiAqIEByZXR1cm4ge05vZGU8dmVjMj59IFRoZSBWU00gb3V0cHV0LlxyXG4gKi9cclxuY29uc3QgVlNNUGFzc0hvcml6b250YWwgPSAvKkBfX1BVUkVfXyovIEZuKCAoIHsgc2FtcGxlcywgcmFkaXVzLCBzaXplLCBzaGFkb3dQYXNzIH0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IG1lYW4gPSBmbG9hdCggMCApLnRvVmFyKCk7XHJcblx0Y29uc3Qgc3F1YXJlZE1lYW4gPSBmbG9hdCggMCApLnRvVmFyKCk7XHJcblxyXG5cdGNvbnN0IHV2U3RyaWRlID0gc2FtcGxlcy5sZXNzVGhhbkVxdWFsKCBmbG9hdCggMSApICkuc2VsZWN0KCBmbG9hdCggMCApLCBmbG9hdCggMiApLmRpdiggc2FtcGxlcy5zdWIoIDEgKSApICk7XHJcblx0Y29uc3QgdXZTdGFydCA9IHNhbXBsZXMubGVzc1RoYW5FcXVhbCggZmxvYXQoIDEgKSApLnNlbGVjdCggZmxvYXQoIDAgKSwgZmxvYXQoIC0gMSApICk7XHJcblxyXG5cdExvb3AoIHsgc3RhcnQ6IGludCggMCApLCBlbmQ6IGludCggc2FtcGxlcyApLCB0eXBlOiAnaW50JywgY29uZGl0aW9uOiAnPCcgfSwgKCB7IGkgfSApID0+IHtcclxuXHJcblx0XHRjb25zdCB1dk9mZnNldCA9IHV2U3RhcnQuYWRkKCBmbG9hdCggaSApLm11bCggdXZTdHJpZGUgKSApO1xyXG5cclxuXHRcdGNvbnN0IGRpc3RyaWJ1dGlvbiA9IHNoYWRvd1Bhc3Muc2FtcGxlKCBhZGQoIHNjcmVlbkNvb3JkaW5hdGUueHksIHZlYzIoIHV2T2Zmc2V0LCAwICkubXVsKCByYWRpdXMgKSApLmRpdiggc2l6ZSApICk7XHJcblx0XHRtZWFuLmFkZEFzc2lnbiggZGlzdHJpYnV0aW9uLnggKTtcclxuXHRcdHNxdWFyZWRNZWFuLmFkZEFzc2lnbiggYWRkKCBkaXN0cmlidXRpb24ueS5tdWwoIGRpc3RyaWJ1dGlvbi55ICksIGRpc3RyaWJ1dGlvbi54Lm11bCggZGlzdHJpYnV0aW9uLnggKSApICk7XHJcblxyXG5cdH0gKTtcclxuXHJcblx0bWVhbi5kaXZBc3NpZ24oIHNhbXBsZXMgKTtcclxuXHRzcXVhcmVkTWVhbi5kaXZBc3NpZ24oIHNhbXBsZXMgKTtcclxuXHJcblx0Y29uc3Qgc3RkX2RldiA9IHNxcnQoIHNxdWFyZWRNZWFuLnN1YiggbWVhbi5tdWwoIG1lYW4gKSApICk7XHJcblx0cmV0dXJuIHZlYzIoIG1lYW4sIHN0ZF9kZXYgKTtcclxuXHJcbn0gKTtcclxuXHJcbmNvbnN0IF9zaGFkb3dGaWx0ZXJMaWIgPSBbIEJhc2ljU2hhZG93RmlsdGVyLCBQQ0ZTaGFkb3dGaWx0ZXIsIFBDRlNvZnRTaGFkb3dGaWx0ZXIsIFZTTVNoYWRvd0ZpbHRlciBdO1xyXG5cclxuLy9cclxuXHJcbmxldCBfcmVuZGVyZXJTdGF0ZTtcclxuY29uc3QgX3F1YWRNZXNoID0gLypAX19QVVJFX18qLyBuZXcgUXVhZE1lc2goKTtcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIHRoZSBkZWZhdWx0IHNoYWRvdyBpbXBsZW1lbnRhdGlvbiBmb3IgbGlnaHRpbmcgbm9kZXMuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBTaGFkb3dCYXNlTm9kZVxyXG4gKi9cclxuY2xhc3MgU2hhZG93Tm9kZSBleHRlbmRzIFNoYWRvd0Jhc2VOb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnU2hhZG93Tm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBzaGFkb3cgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TGlnaHR9IGxpZ2h0IC0gVGhlIHNoYWRvdyBjYXN0aW5nIGxpZ2h0LlxyXG5cdCAqIEBwYXJhbSB7P0xpZ2h0U2hhZG93fSBbc2hhZG93PW51bGxdIC0gQW4gb3B0aW9uYWwgbGlnaHQgc2hhZG93LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBsaWdodCwgc2hhZG93ID0gbnVsbCApIHtcclxuXHJcblx0XHRzdXBlciggbGlnaHQgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBsaWdodCBzaGFkb3cgd2hpY2ggZGVmaW5lcyB0aGUgcHJvcGVydGllcyBsaWdodCdzXHJcblx0XHQgKiBzaGFkb3cuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9MaWdodFNoYWRvd31cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zaGFkb3cgPSBzaGFkb3cgfHwgbGlnaHQuc2hhZG93O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIHNoYWRvdyBtYXAgd2hpY2ggaXMgYSByZW5kZXIgdGFyZ2V0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/UmVuZGVyVGFyZ2V0fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNoYWRvd01hcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBPbmx5IHJlbGV2YW50IGZvciBWU00gc2hhZG93cy4gUmVuZGVyIHRhcmdldCBmb3IgdGhlXHJcblx0XHQgKiBmaXJzdCBWU00gcmVuZGVyIHBhc3MuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9SZW5kZXJUYXJnZXR9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudnNtU2hhZG93TWFwVmVydGljYWwgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogT25seSByZWxldmFudCBmb3IgVlNNIHNoYWRvd3MuIFJlbmRlciB0YXJnZXQgZm9yIHRoZVxyXG5cdFx0ICogc2Vjb25kIFZTTSByZW5kZXIgcGFzcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1JlbmRlclRhcmdldH1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52c21TaGFkb3dNYXBIb3Jpem9udGFsID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIE9ubHkgcmVsZXZhbnQgZm9yIFZTTSBzaGFkb3dzLiBOb2RlIG1hdGVyaWFsIHdoaWNoXHJcblx0XHQgKiBpcyB1c2VkIHRvIHJlbmRlciB0aGUgZmlyc3QgVlNNIHBhc3MuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlTWF0ZXJpYWx9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudnNtTWF0ZXJpYWxWZXJ0aWNhbCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBPbmx5IHJlbGV2YW50IGZvciBWU00gc2hhZG93cy4gTm9kZSBtYXRlcmlhbCB3aGljaFxyXG5cdFx0ICogaXMgdXNlZCB0byByZW5kZXIgdGhlIHNlY29uZCBWU00gcGFzcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGVNYXRlcmlhbH1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52c21NYXRlcmlhbEhvcml6b250YWwgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIG91dHB1dCBub2RlIHdoaWNoIGRlZmluZXMgdGhlXHJcblx0XHQgKiBmaW5hbCByZXN1bHQgb2YgdGhpcyBzaGFkb3cgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGV9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9ub2RlID0gbnVsbDtcclxuXHJcblx0XHR0aGlzLl9jYW1lcmFGcmFtZUlkID0gbmV3IFdlYWtNYXAoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNTaGFkb3dOb2RlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXR1cHMgdGhlIHNoYWRvdyBmaWx0ZXJpbmcuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dHMgLSBBIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHRoYXQgZGVmaW5lcyB0aGUgc2hhZG93IGZpbHRlcmluZy5cclxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpbnB1dHMuZmlsdGVyRm4gLSBUaGlzIGZ1bmN0aW9uIGRlZmluZXMgdGhlIGZpbHRlcmluZyB0eXBlIG9mIHRoZSBzaGFkb3cgbWFwIGUuZy4gUENGLlxyXG5cdCAqIEBwYXJhbSB7RGVwdGhUZXh0dXJlfSBpbnB1dHMuZGVwdGhUZXh0dXJlIC0gQSByZWZlcmVuY2UgdG8gdGhlIHNoYWRvdyBtYXAncyB0ZXh0dXJlIGRhdGEuXHJcblx0ICogQHBhcmFtIHtOb2RlPHZlYzM+fSBpbnB1dHMuc2hhZG93Q29vcmQgLSBTaGFkb3cgY29vcmRpbmF0ZXMgd2hpY2ggYXJlIHVzZWQgdG8gc2FtcGxlIGZyb20gdGhlIHNoYWRvdyBtYXAuXHJcblx0ICogQHBhcmFtIHtMaWdodFNoYWRvd30gaW5wdXRzLnNoYWRvdyAtIFRoZSBsaWdodCBzaGFkb3cuXHJcblx0ICogQHJldHVybiB7Tm9kZTxmbG9hdD59IFRoZSByZXN1bHQgbm9kZSBvZiB0aGUgc2hhZG93IGZpbHRlcmluZy5cclxuXHQgKi9cclxuXHRzZXR1cFNoYWRvd0ZpbHRlciggYnVpbGRlciwgeyBmaWx0ZXJGbiwgZGVwdGhUZXh0dXJlLCBzaGFkb3dDb29yZCwgc2hhZG93IH0gKSB7XHJcblxyXG5cdFx0Y29uc3QgZnJ1c3R1bVRlc3QgPSBzaGFkb3dDb29yZC54LmdyZWF0ZXJUaGFuRXF1YWwoIDAgKVxyXG5cdFx0XHQuYW5kKCBzaGFkb3dDb29yZC54Lmxlc3NUaGFuRXF1YWwoIDEgKSApXHJcblx0XHRcdC5hbmQoIHNoYWRvd0Nvb3JkLnkuZ3JlYXRlclRoYW5FcXVhbCggMCApIClcclxuXHRcdFx0LmFuZCggc2hhZG93Q29vcmQueS5sZXNzVGhhbkVxdWFsKCAxICkgKVxyXG5cdFx0XHQuYW5kKCBzaGFkb3dDb29yZC56Lmxlc3NUaGFuRXF1YWwoIDEgKSApO1xyXG5cclxuXHRcdGNvbnN0IHNoYWRvd05vZGUgPSBmaWx0ZXJGbiggeyBkZXB0aFRleHR1cmUsIHNoYWRvd0Nvb3JkLCBzaGFkb3cgfSApO1xyXG5cclxuXHRcdHJldHVybiBmcnVzdHVtVGVzdC5zZWxlY3QoIHNoYWRvd05vZGUsIGZsb2F0KCAxICkgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXR1cHMgdGhlIHNoYWRvdyBjb29yZGluYXRlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHBhcmFtIHtOb2RlPHZlYzM+fSBzaGFkb3dQb3NpdGlvbiAtIEEgbm9kZSByZXByZXNlbnRpbmcgdGhlIHNoYWRvdyBwb3NpdGlvbi5cclxuXHQgKiBAcmV0dXJuIHtOb2RlPHZlYzM+fSBUaGUgc2hhZG93IGNvb3JkaW5hdGVzLlxyXG5cdCAqL1xyXG5cdHNldHVwU2hhZG93Q29vcmQoIGJ1aWxkZXIsIHNoYWRvd1Bvc2l0aW9uICkge1xyXG5cclxuXHRcdGNvbnN0IHsgc2hhZG93IH0gPSB0aGlzO1xyXG5cdFx0Y29uc3QgeyByZW5kZXJlciB9ID0gYnVpbGRlcjtcclxuXHJcblx0XHRjb25zdCBiaWFzID0gcmVmZXJlbmNlKCAnYmlhcycsICdmbG9hdCcsIHNoYWRvdyApLnNldEdyb3VwKCByZW5kZXJHcm91cCApO1xyXG5cclxuXHRcdGxldCBzaGFkb3dDb29yZCA9IHNoYWRvd1Bvc2l0aW9uO1xyXG5cdFx0bGV0IGNvb3JkWjtcclxuXHJcblx0XHRpZiAoIHNoYWRvdy5jYW1lcmEuaXNPcnRob2dyYXBoaWNDYW1lcmEgfHwgcmVuZGVyZXIubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciAhPT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdHNoYWRvd0Nvb3JkID0gc2hhZG93Q29vcmQueHl6LmRpdiggc2hhZG93Q29vcmQudyApO1xyXG5cclxuXHRcdFx0Y29vcmRaID0gc2hhZG93Q29vcmQuejtcclxuXHJcblx0XHRcdGlmICggcmVuZGVyZXIuY29vcmRpbmF0ZVN5c3RlbSA9PT0gV2ViR1BVQ29vcmRpbmF0ZVN5c3RlbSApIHtcclxuXHJcblx0XHRcdFx0Y29vcmRaID0gY29vcmRaLm11bCggMiApLnN1YiggMSApOyAvLyBXZWJHUFU6IENvbnZlcnNpb24gWyAwLCAxIF0gdG8gWyAtIDEsIDEgXVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRjb25zdCB3ID0gc2hhZG93Q29vcmQudztcclxuXHRcdFx0c2hhZG93Q29vcmQgPSBzaGFkb3dDb29yZC54eS5kaXYoIHcgKTsgLy8gPC0tIE9ubHkgZGl2aWRlIFgvWSBjb29yZHMgc2luY2Ugd2UgZG9uJ3QgbmVlZCBaXHJcblxyXG5cdFx0XHQvLyBUaGUgbm9ybWFsbHkgYXZhaWxhYmxlIFwiY2FtZXJhTmVhclwiIGFuZCBcImNhbWVyYUZhclwiIG5vZGVzIGNhbm5vdCBiZSB1c2VkIGhlcmUgYmVjYXVzZSB0aGV5IGRvIG5vdCBnZXRcclxuXHRcdFx0Ly8gdXBkYXRlZCB0byB1c2UgdGhlIHNoYWRvdyBjYW1lcmEuIFNvLCB3ZSBoYXZlIHRvIGRlY2xhcmUgb3VyIG93biBcImxvY2FsXCIgb25lcyBoZXJlLlxyXG5cdFx0XHQvLyBUT0RPOiBIb3cgZG8gd2UgZ2V0IHRoZSBjYW1lcmFOZWFyL2NhbWVyYUZhciBub2RlcyB0byB1c2UgdGhlIHNoYWRvdyBjYW1lcmEgc28gd2UgZG9uJ3QgaGF2ZSB0byBkZWNsYXJlIGxvY2FsIG9uZXMgaGVyZT9cclxuXHRcdFx0Y29uc3QgY2FtZXJhTmVhckxvY2FsID0gcmVmZXJlbmNlKCAnbmVhcicsICdmbG9hdCcsIHNoYWRvdy5jYW1lcmEgKS5zZXRHcm91cCggcmVuZGVyR3JvdXAgKTtcclxuXHRcdFx0Y29uc3QgY2FtZXJhRmFyTG9jYWwgPSByZWZlcmVuY2UoICdmYXInLCAnZmxvYXQnLCBzaGFkb3cuY2FtZXJhICkuc2V0R3JvdXAoIHJlbmRlckdyb3VwICk7XHJcblxyXG5cdFx0XHRjb29yZFogPSB2aWV3WlRvTG9nYXJpdGhtaWNEZXB0aCggdy5uZWdhdGUoKSwgY2FtZXJhTmVhckxvY2FsLCBjYW1lcmFGYXJMb2NhbCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRzaGFkb3dDb29yZCA9IHZlYzMoXHJcblx0XHRcdHNoYWRvd0Nvb3JkLngsXHJcblx0XHRcdHNoYWRvd0Nvb3JkLnkub25lTWludXMoKSwgLy8gZm9sbG93IHdlYmdwdSBzdGFuZGFyZHNcclxuXHRcdFx0Y29vcmRaLmFkZCggYmlhcyApXHJcblx0XHQpO1xyXG5cclxuXHRcdHJldHVybiBzaGFkb3dDb29yZDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBzaGFkb3cgZmlsdGVyaW5nIGZ1bmN0aW9uIGZvciB0aGUgZ2l2ZW4gc2hhZG93IHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdHlwZSAtIFRoZSBzaGFkb3cgdHlwZS5cclxuXHQgKiBAcmV0dXJuIHtGdW5jdGlvbn0gVGhlIGZpbHRlcmluZyBmdW5jdGlvbi5cclxuXHQgKi9cclxuXHRnZXRTaGFkb3dGaWx0ZXJGbiggdHlwZSApIHtcclxuXHJcblx0XHRyZXR1cm4gX3NoYWRvd0ZpbHRlckxpYlsgdHlwZSBdO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHVwcyB0aGUgc2hhZG93IG91dHB1dCBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtOb2RlPHZlYzM+fSBUaGUgc2hhZG93IG91dHB1dCBub2RlLlxyXG5cdCAqL1xyXG5cdHNldHVwU2hhZG93KCBidWlsZGVyICkge1xyXG5cclxuXHRcdGNvbnN0IHsgcmVuZGVyZXIgfSA9IGJ1aWxkZXI7XHJcblxyXG5cdFx0Y29uc3QgeyBsaWdodCwgc2hhZG93IH0gPSB0aGlzO1xyXG5cclxuXHRcdGNvbnN0IHNoYWRvd01hcFR5cGUgPSByZW5kZXJlci5zaGFkb3dNYXAudHlwZTtcclxuXHJcblx0XHRjb25zdCBkZXB0aFRleHR1cmUgPSBuZXcgRGVwdGhUZXh0dXJlKCBzaGFkb3cubWFwU2l6ZS53aWR0aCwgc2hhZG93Lm1hcFNpemUuaGVpZ2h0ICk7XHJcblx0XHRkZXB0aFRleHR1cmUuY29tcGFyZUZ1bmN0aW9uID0gTGVzc0NvbXBhcmU7XHJcblxyXG5cdFx0Y29uc3Qgc2hhZG93TWFwID0gYnVpbGRlci5jcmVhdGVSZW5kZXJUYXJnZXQoIHNoYWRvdy5tYXBTaXplLndpZHRoLCBzaGFkb3cubWFwU2l6ZS5oZWlnaHQgKTtcclxuXHRcdHNoYWRvd01hcC5kZXB0aFRleHR1cmUgPSBkZXB0aFRleHR1cmU7XHJcblxyXG5cdFx0c2hhZG93LmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XHJcblxyXG5cdFx0Ly8gVlNNXHJcblxyXG5cdFx0aWYgKCBzaGFkb3dNYXBUeXBlID09PSBWU01TaGFkb3dNYXAgKSB7XHJcblxyXG5cdFx0XHRkZXB0aFRleHR1cmUuY29tcGFyZUZ1bmN0aW9uID0gbnVsbDsgLy8gVlNNIGRvZXMgbm90IHVzZSB0ZXh0dXJlU2FtcGxlQ29tcGFyZSgpL3RleHR1cmUyRENvbXBhcmUoKVxyXG5cclxuXHRcdFx0dGhpcy52c21TaGFkb3dNYXBWZXJ0aWNhbCA9IGJ1aWxkZXIuY3JlYXRlUmVuZGVyVGFyZ2V0KCBzaGFkb3cubWFwU2l6ZS53aWR0aCwgc2hhZG93Lm1hcFNpemUuaGVpZ2h0LCB7IGZvcm1hdDogUkdGb3JtYXQsIHR5cGU6IEhhbGZGbG9hdFR5cGUgfSApO1xyXG5cdFx0XHR0aGlzLnZzbVNoYWRvd01hcEhvcml6b250YWwgPSBidWlsZGVyLmNyZWF0ZVJlbmRlclRhcmdldCggc2hhZG93Lm1hcFNpemUud2lkdGgsIHNoYWRvdy5tYXBTaXplLmhlaWdodCwgeyBmb3JtYXQ6IFJHRm9ybWF0LCB0eXBlOiBIYWxmRmxvYXRUeXBlIH0gKTtcclxuXHJcblx0XHRcdGNvbnN0IHNoYWRvd1Bhc3NWZXJ0aWNhbCA9IHRleHR1cmUoIGRlcHRoVGV4dHVyZSApO1xyXG5cdFx0XHRjb25zdCBzaGFkb3dQYXNzSG9yaXpvbnRhbCA9IHRleHR1cmUoIHRoaXMudnNtU2hhZG93TWFwVmVydGljYWwudGV4dHVyZSApO1xyXG5cclxuXHRcdFx0Y29uc3Qgc2FtcGxlcyA9IHJlZmVyZW5jZSggJ2JsdXJTYW1wbGVzJywgJ2Zsb2F0Jywgc2hhZG93ICkuc2V0R3JvdXAoIHJlbmRlckdyb3VwICk7XHJcblx0XHRcdGNvbnN0IHJhZGl1cyA9IHJlZmVyZW5jZSggJ3JhZGl1cycsICdmbG9hdCcsIHNoYWRvdyApLnNldEdyb3VwKCByZW5kZXJHcm91cCApO1xyXG5cdFx0XHRjb25zdCBzaXplID0gcmVmZXJlbmNlKCAnbWFwU2l6ZScsICd2ZWMyJywgc2hhZG93ICkuc2V0R3JvdXAoIHJlbmRlckdyb3VwICk7XHJcblxyXG5cdFx0XHRsZXQgbWF0ZXJpYWwgPSB0aGlzLnZzbU1hdGVyaWFsVmVydGljYWwgfHwgKCB0aGlzLnZzbU1hdGVyaWFsVmVydGljYWwgPSBuZXcgTm9kZU1hdGVyaWFsKCkgKTtcclxuXHRcdFx0bWF0ZXJpYWwuZnJhZ21lbnROb2RlID0gVlNNUGFzc1ZlcnRpY2FsKCB7IHNhbXBsZXMsIHJhZGl1cywgc2l6ZSwgc2hhZG93UGFzczogc2hhZG93UGFzc1ZlcnRpY2FsIH0gKS5jb250ZXh0KCBidWlsZGVyLmdldFNoYXJlZENvbnRleHQoKSApO1xyXG5cdFx0XHRtYXRlcmlhbC5uYW1lID0gJ1ZTTVZlcnRpY2FsJztcclxuXHJcblx0XHRcdG1hdGVyaWFsID0gdGhpcy52c21NYXRlcmlhbEhvcml6b250YWwgfHwgKCB0aGlzLnZzbU1hdGVyaWFsSG9yaXpvbnRhbCA9IG5ldyBOb2RlTWF0ZXJpYWwoKSApO1xyXG5cdFx0XHRtYXRlcmlhbC5mcmFnbWVudE5vZGUgPSBWU01QYXNzSG9yaXpvbnRhbCggeyBzYW1wbGVzLCByYWRpdXMsIHNpemUsIHNoYWRvd1Bhc3M6IHNoYWRvd1Bhc3NIb3Jpem9udGFsIH0gKS5jb250ZXh0KCBidWlsZGVyLmdldFNoYXJlZENvbnRleHQoKSApO1xyXG5cdFx0XHRtYXRlcmlhbC5uYW1lID0gJ1ZTTUhvcml6b250YWwnO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGNvbnN0IHNoYWRvd0ludGVuc2l0eSA9IHJlZmVyZW5jZSggJ2ludGVuc2l0eScsICdmbG9hdCcsIHNoYWRvdyApLnNldEdyb3VwKCByZW5kZXJHcm91cCApO1xyXG5cdFx0Y29uc3Qgbm9ybWFsQmlhcyA9IHJlZmVyZW5jZSggJ25vcm1hbEJpYXMnLCAnZmxvYXQnLCBzaGFkb3cgKS5zZXRHcm91cCggcmVuZGVyR3JvdXAgKTtcclxuXHJcblx0XHRjb25zdCBzaGFkb3dQb3NpdGlvbiA9IGxpZ2h0U2hhZG93TWF0cml4KCBsaWdodCApLm11bCggc2hhZG93UG9zaXRpb25Xb3JsZC5hZGQoIHRyYW5zZm9ybWVkTm9ybWFsV29ybGQubXVsKCBub3JtYWxCaWFzICkgKSApO1xyXG5cdFx0Y29uc3Qgc2hhZG93Q29vcmQgPSB0aGlzLnNldHVwU2hhZG93Q29vcmQoIGJ1aWxkZXIsIHNoYWRvd1Bvc2l0aW9uICk7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCBmaWx0ZXJGbiA9IHNoYWRvdy5maWx0ZXJOb2RlIHx8IHRoaXMuZ2V0U2hhZG93RmlsdGVyRm4oIHJlbmRlcmVyLnNoYWRvd01hcC50eXBlICkgfHwgbnVsbDtcclxuXHJcblx0XHRpZiAoIGZpbHRlckZuID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuV2ViR1BVUmVuZGVyZXI6IFNoYWRvdyBtYXAgdHlwZSBub3Qgc3VwcG9ydGVkIHlldC4nICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHNoYWRvd0RlcHRoVGV4dHVyZSA9ICggc2hhZG93TWFwVHlwZSA9PT0gVlNNU2hhZG93TWFwICkgPyB0aGlzLnZzbVNoYWRvd01hcEhvcml6b250YWwudGV4dHVyZSA6IGRlcHRoVGV4dHVyZTtcclxuXHJcblx0XHRjb25zdCBzaGFkb3dOb2RlID0gdGhpcy5zZXR1cFNoYWRvd0ZpbHRlciggYnVpbGRlciwgeyBmaWx0ZXJGbiwgc2hhZG93VGV4dHVyZTogc2hhZG93TWFwLnRleHR1cmUsIGRlcHRoVGV4dHVyZTogc2hhZG93RGVwdGhUZXh0dXJlLCBzaGFkb3dDb29yZCwgc2hhZG93IH0gKTtcclxuXHJcblx0XHRjb25zdCBzaGFkb3dDb2xvciA9IHRleHR1cmUoIHNoYWRvd01hcC50ZXh0dXJlLCBzaGFkb3dDb29yZCApO1xyXG5cdFx0Y29uc3Qgc2hhZG93T3V0cHV0ID0gbWl4KCAxLCBzaGFkb3dOb2RlLnJnYi5taXgoIHNoYWRvd0NvbG9yLCAxICksIHNoYWRvd0ludGVuc2l0eS5tdWwoIHNoYWRvd0NvbG9yLmEgKSApLnRvVmFyKCk7XHJcblxyXG5cdFx0dGhpcy5zaGFkb3dNYXAgPSBzaGFkb3dNYXA7XHJcblx0XHR0aGlzLnNoYWRvdy5tYXAgPSBzaGFkb3dNYXA7XHJcblxyXG5cdFx0cmV0dXJuIHNoYWRvd091dHB1dDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgaW1wbGVtZW50YXRpb24gcGVyZm9ybXMgdGhlIHNldHVwIG9mIHRoZSBvdXRwdXQgbm9kZS4gQW4gb3V0cHV0IGlzIG9ubHlcclxuXHQgKiBwcm9kdWNlcyBpZiBzaGFkb3cgbWFwcGluZyBpcyBnbG9iYWxseSBlbmFibGVkIGluIHRoZSByZW5kZXJlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHJldHVybiB7U2hhZGVyQ2FsbE5vZGVJbnRlcm5hbH0gVGhlIG91dHB1dCBub2RlLlxyXG5cdCAqL1xyXG5cdHNldHVwKCBidWlsZGVyICkge1xyXG5cclxuXHRcdGlmICggYnVpbGRlci5yZW5kZXJlci5zaGFkb3dNYXAuZW5hYmxlZCA9PT0gZmFsc2UgKSByZXR1cm47XHJcblxyXG5cdFx0cmV0dXJuIEZuKCAoKSA9PiB7XHJcblxyXG5cdFx0XHRsZXQgbm9kZSA9IHRoaXMuX25vZGU7XHJcblxyXG5cdFx0XHR0aGlzLnNldHVwU2hhZG93UG9zaXRpb24oIGJ1aWxkZXIgKTtcclxuXHJcblx0XHRcdGlmICggbm9kZSA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5fbm9kZSA9IG5vZGUgPSB0aGlzLnNldHVwU2hhZG93KCBidWlsZGVyICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIGJ1aWxkZXIubWF0ZXJpYWwuc2hhZG93Tm9kZSApIHsgLy8gQGRlcHJlY2F0ZWQsIHIxNzFcclxuXHJcblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTm9kZU1hdGVyaWFsOiBcIi5zaGFkb3dOb2RlXCIgaXMgZGVwcmVjYXRlZC4gVXNlIFwiLmNhc3RTaGFkb3dOb2RlXCIgaW5zdGVhZC4nICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIGJ1aWxkZXIubWF0ZXJpYWwucmVjZWl2ZWRTaGFkb3dOb2RlICkge1xyXG5cclxuXHRcdFx0XHRub2RlID0gYnVpbGRlci5tYXRlcmlhbC5yZWNlaXZlZFNoYWRvd05vZGUoIG5vZGUgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBub2RlO1xyXG5cclxuXHRcdH0gKSgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbmRlcnMgdGhlIHNoYWRvdy4gVGhlIGxvZ2ljIG9mIHRoaXMgZnVuY3Rpb24gY291bGQgYmUgaW5jbHVkZWRcclxuXHQgKiBpbnRvIHtAbGluayBTaGFkb3dOb2RlI3VwZGF0ZVNoYWRvd30gaG93ZXZlciBtb3JlIHNwZWNpYWxpemVkIHNoYWRvd1xyXG5cdCAqIG5vZGVzIG1pZ2h0IHJlcXVpcmUgYSBjdXN0b20gc2hhZG93IG1hcCByZW5kZXJpbmcuIEJ5IGhhdmluZyBhXHJcblx0ICogZGVkaWNhdGVkIG1ldGhvZCwgaXQncyBlYXNpZXIgdG8gb3ZlcndyaXRlIHRoZSBkZWZhdWx0IGJlaGF2aW9yLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlRnJhbWV9IGZyYW1lIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgbm9kZSBmcmFtZS5cclxuXHQgKi9cclxuXHRyZW5kZXJTaGFkb3coIGZyYW1lICkge1xyXG5cclxuXHRcdGNvbnN0IHsgc2hhZG93LCBzaGFkb3dNYXAsIGxpZ2h0IH0gPSB0aGlzO1xyXG5cdFx0Y29uc3QgeyByZW5kZXJlciwgc2NlbmUgfSA9IGZyYW1lO1xyXG5cclxuXHRcdHNoYWRvdy51cGRhdGVNYXRyaWNlcyggbGlnaHQgKTtcclxuXHJcblx0XHRzaGFkb3dNYXAuc2V0U2l6ZSggc2hhZG93Lm1hcFNpemUud2lkdGgsIHNoYWRvdy5tYXBTaXplLmhlaWdodCApO1xyXG5cclxuXHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIHNoYWRvdy5jYW1lcmEgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoZSBzaGFkb3cuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVGcmFtZX0gZnJhbWUgLSBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBub2RlIGZyYW1lLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZVNoYWRvdyggZnJhbWUgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBzaGFkb3dNYXAsIGxpZ2h0LCBzaGFkb3cgfSA9IHRoaXM7XHJcblx0XHRjb25zdCB7IHJlbmRlcmVyLCBzY2VuZSwgY2FtZXJhIH0gPSBmcmFtZTtcclxuXHJcblx0XHRjb25zdCBzaGFkb3dUeXBlID0gcmVuZGVyZXIuc2hhZG93TWFwLnR5cGU7XHJcblxyXG5cdFx0Y29uc3QgZGVwdGhWZXJzaW9uID0gc2hhZG93TWFwLmRlcHRoVGV4dHVyZS52ZXJzaW9uO1xyXG5cdFx0dGhpcy5fZGVwdGhWZXJzaW9uQ2FjaGVkID0gZGVwdGhWZXJzaW9uO1xyXG5cclxuXHRcdHNoYWRvdy5jYW1lcmEubGF5ZXJzLm1hc2sgPSBjYW1lcmEubGF5ZXJzLm1hc2s7XHJcblxyXG5cdFx0Y29uc3QgY3VycmVudFJlbmRlck9iamVjdEZ1bmN0aW9uID0gcmVuZGVyZXIuZ2V0UmVuZGVyT2JqZWN0RnVuY3Rpb24oKTtcclxuXHJcblx0XHRjb25zdCBjdXJyZW50TVJUID0gcmVuZGVyZXIuZ2V0TVJUKCk7XHJcblx0XHRjb25zdCB1c2VWZWxvY2l0eSA9IGN1cnJlbnRNUlQgPyBjdXJyZW50TVJULmhhcyggJ3ZlbG9jaXR5JyApIDogZmFsc2U7XHJcblxyXG5cdFx0X3JlbmRlcmVyU3RhdGUgPSByZXNldFJlbmRlcmVyQW5kU2NlbmVTdGF0ZSggcmVuZGVyZXIsIHNjZW5lLCBfcmVuZGVyZXJTdGF0ZSApO1xyXG5cclxuXHRcdHNjZW5lLm92ZXJyaWRlTWF0ZXJpYWwgPSBnZXRTaGFkb3dNYXRlcmlhbCggbGlnaHQgKTtcclxuXHJcblx0XHRyZW5kZXJlci5zZXRSZW5kZXJPYmplY3RGdW5jdGlvbiggKCBvYmplY3QsIHNjZW5lLCBfY2FtZXJhLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwLCAuLi5wYXJhbXMgKSA9PiB7XHJcblxyXG5cdFx0XHRpZiAoIG9iamVjdC5jYXN0U2hhZG93ID09PSB0cnVlIHx8ICggb2JqZWN0LnJlY2VpdmVTaGFkb3cgJiYgc2hhZG93VHlwZSA9PT0gVlNNU2hhZG93TWFwICkgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggdXNlVmVsb2NpdHkgKSB7XHJcblxyXG5cdFx0XHRcdFx0Z2V0RGF0YUZyb21PYmplY3QoIG9iamVjdCApLnVzZVZlbG9jaXR5ID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRvYmplY3Qub25CZWZvcmVTaGFkb3coIHJlbmRlcmVyLCBvYmplY3QsIGNhbWVyYSwgc2hhZG93LmNhbWVyYSwgZ2VvbWV0cnksIHNjZW5lLm92ZXJyaWRlTWF0ZXJpYWwsIGdyb3VwICk7XHJcblxyXG5cdFx0XHRcdHJlbmRlcmVyLnJlbmRlck9iamVjdCggb2JqZWN0LCBzY2VuZSwgX2NhbWVyYSwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cCwgLi4ucGFyYW1zICk7XHJcblxyXG5cdFx0XHRcdG9iamVjdC5vbkFmdGVyU2hhZG93KCByZW5kZXJlciwgb2JqZWN0LCBjYW1lcmEsIHNoYWRvdy5jYW1lcmEsIGdlb21ldHJ5LCBzY2VuZS5vdmVycmlkZU1hdGVyaWFsLCBncm91cCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gKTtcclxuXHJcblx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHNoYWRvd01hcCApO1xyXG5cclxuXHRcdHRoaXMucmVuZGVyU2hhZG93KCBmcmFtZSApO1xyXG5cclxuXHRcdHJlbmRlcmVyLnNldFJlbmRlck9iamVjdEZ1bmN0aW9uKCBjdXJyZW50UmVuZGVyT2JqZWN0RnVuY3Rpb24gKTtcclxuXHJcblx0XHQvLyB2c20gYmx1ciBwYXNzXHJcblxyXG5cdFx0aWYgKCBsaWdodC5pc1BvaW50TGlnaHQgIT09IHRydWUgJiYgc2hhZG93VHlwZSA9PT0gVlNNU2hhZG93TWFwICkge1xyXG5cclxuXHRcdFx0dGhpcy52c21QYXNzKCByZW5kZXJlciApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXN0b3JlUmVuZGVyZXJBbmRTY2VuZVN0YXRlKCByZW5kZXJlciwgc2NlbmUsIF9yZW5kZXJlclN0YXRlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRm9yIFZTTSBhZGRpdGlvbmFsIHJlbmRlciBwYXNzZXMgYXJlIHJlcXVpcmVkLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSZW5kZXJlcn0gcmVuZGVyZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCByZW5kZXJlci5cclxuXHQgKi9cclxuXHR2c21QYXNzKCByZW5kZXJlciApIHtcclxuXHJcblx0XHRjb25zdCB7IHNoYWRvdyB9ID0gdGhpcztcclxuXHJcblx0XHR0aGlzLnZzbVNoYWRvd01hcFZlcnRpY2FsLnNldFNpemUoIHNoYWRvdy5tYXBTaXplLndpZHRoLCBzaGFkb3cubWFwU2l6ZS5oZWlnaHQgKTtcclxuXHRcdHRoaXMudnNtU2hhZG93TWFwSG9yaXpvbnRhbC5zZXRTaXplKCBzaGFkb3cubWFwU2l6ZS53aWR0aCwgc2hhZG93Lm1hcFNpemUuaGVpZ2h0ICk7XHJcblxyXG5cdFx0cmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCB0aGlzLnZzbVNoYWRvd01hcFZlcnRpY2FsICk7XHJcblx0XHRfcXVhZE1lc2gubWF0ZXJpYWwgPSB0aGlzLnZzbU1hdGVyaWFsVmVydGljYWw7XHJcblx0XHRfcXVhZE1lc2gucmVuZGVyKCByZW5kZXJlciApO1xyXG5cclxuXHRcdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggdGhpcy52c21TaGFkb3dNYXBIb3Jpem9udGFsICk7XHJcblx0XHRfcXVhZE1lc2gubWF0ZXJpYWwgPSB0aGlzLnZzbU1hdGVyaWFsSG9yaXpvbnRhbDtcclxuXHRcdF9xdWFkTWVzaC5yZW5kZXIoIHJlbmRlcmVyICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRnJlZXMgdGhlIGludGVybmFsIHJlc291cmNlcyBvZiB0aGlzIHNoYWRvdyBub2RlLlxyXG5cdCAqL1xyXG5cdGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0dGhpcy5zaGFkb3dNYXAuZGlzcG9zZSgpO1xyXG5cdFx0dGhpcy5zaGFkb3dNYXAgPSBudWxsO1xyXG5cclxuXHRcdGlmICggdGhpcy52c21TaGFkb3dNYXBWZXJ0aWNhbCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMudnNtU2hhZG93TWFwVmVydGljYWwuZGlzcG9zZSgpO1xyXG5cdFx0XHR0aGlzLnZzbVNoYWRvd01hcFZlcnRpY2FsID0gbnVsbDtcclxuXHJcblx0XHRcdHRoaXMudnNtTWF0ZXJpYWxWZXJ0aWNhbC5kaXNwb3NlKCk7XHJcblx0XHRcdHRoaXMudnNtTWF0ZXJpYWxWZXJ0aWNhbCA9IG51bGw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy52c21TaGFkb3dNYXBIb3Jpem9udGFsICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy52c21TaGFkb3dNYXBIb3Jpem9udGFsLmRpc3Bvc2UoKTtcclxuXHRcdFx0dGhpcy52c21TaGFkb3dNYXBIb3Jpem9udGFsID0gbnVsbDtcclxuXHJcblx0XHRcdHRoaXMudnNtTWF0ZXJpYWxIb3Jpem9udGFsLmRpc3Bvc2UoKTtcclxuXHRcdFx0dGhpcy52c21NYXRlcmlhbEhvcml6b250YWwgPSBudWxsO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRzdXBlci5kaXNwb3NlKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGltcGxlbWVudGF0aW9uIHBlcmZvcm1zIHRoZSB1cGRhdGUgb2YgdGhlIHNoYWRvdyBtYXAgaWYgbmVjZXNzYXJ5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlRnJhbWV9IGZyYW1lIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgbm9kZSBmcmFtZS5cclxuXHQgKi9cclxuXHR1cGRhdGVCZWZvcmUoIGZyYW1lICkge1xyXG5cclxuXHRcdGNvbnN0IHsgc2hhZG93IH0gPSB0aGlzO1xyXG5cclxuXHRcdGxldCBuZWVkc1VwZGF0ZSA9IHNoYWRvdy5uZWVkc1VwZGF0ZSB8fCBzaGFkb3cuYXV0b1VwZGF0ZTtcclxuXHJcblx0XHRpZiAoIG5lZWRzVXBkYXRlICkge1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLl9jYW1lcmFGcmFtZUlkWyBmcmFtZS5jYW1lcmEgXSA9PT0gZnJhbWUuZnJhbWVJZCApIHtcclxuXHJcblx0XHRcdFx0bmVlZHNVcGRhdGUgPSBmYWxzZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuX2NhbWVyYUZyYW1lSWRbIGZyYW1lLmNhbWVyYSBdID0gZnJhbWUuZnJhbWVJZDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBuZWVkc1VwZGF0ZSApIHtcclxuXHJcblx0XHRcdHRoaXMudXBkYXRlU2hhZG93KCBmcmFtZSApO1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLnNoYWRvd01hcC5kZXB0aFRleHR1cmUudmVyc2lvbiA9PT0gdGhpcy5fZGVwdGhWZXJzaW9uQ2FjaGVkICkge1xyXG5cclxuXHRcdFx0XHRzaGFkb3cubmVlZHNVcGRhdGUgPSBmYWxzZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFNoYWRvd05vZGU7XHJcblxyXG4vKipcclxuICogVFNMIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhbiBpbnN0YW5jZSBvZiBgU2hhZG93Tm9kZWAuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7TGlnaHR9IGxpZ2h0IC0gVGhlIHNoYWRvdyBjYXN0aW5nIGxpZ2h0LlxyXG4gKiBAcGFyYW0gez9MaWdodFNoYWRvd30gW3NoYWRvd10gLSBUaGUgbGlnaHQgc2hhZG93LlxyXG4gKiBAcmV0dXJuIHtTaGFkb3dOb2RlfSBUaGUgY3JlYXRlZCBzaGFkb3cgbm9kZS5cclxuICovXHJcbmV4cG9ydCBjb25zdCBzaGFkb3cgPSAoIGxpZ2h0LCBzaGFkb3cgKSA9PiBub2RlT2JqZWN0KCBuZXcgU2hhZG93Tm9kZSggbGlnaHQsIHNoYWRvdyApICk7XHJcbiIsImltcG9ydCBTaGFkb3dOb2RlIGZyb20gJy4vU2hhZG93Tm9kZS5qcyc7XHJcbmltcG9ydCB7IHVuaWZvcm0gfSBmcm9tICcuLi9jb3JlL1VuaWZvcm1Ob2RlLmpzJztcclxuaW1wb3J0IHsgZmxvYXQsIHZlYzIsIElmLCBGbiwgbm9kZU9iamVjdCB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuaW1wb3J0IHsgcmVmZXJlbmNlIH0gZnJvbSAnLi4vYWNjZXNzb3JzL1JlZmVyZW5jZU5vZGUuanMnO1xyXG5pbXBvcnQgeyB0ZXh0dXJlIH0gZnJvbSAnLi4vYWNjZXNzb3JzL1RleHR1cmVOb2RlLmpzJztcclxuaW1wb3J0IHsgbWF4LCBhYnMsIHNpZ24gfSBmcm9tICcuLi9tYXRoL01hdGhOb2RlLmpzJztcclxuaW1wb3J0IHsgc3ViLCBkaXYgfSBmcm9tICcuLi9tYXRoL09wZXJhdG9yTm9kZS5qcyc7XHJcbmltcG9ydCB7IHJlbmRlckdyb3VwIH0gZnJvbSAnLi4vY29yZS9Vbmlmb3JtR3JvdXBOb2RlLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMi5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjQgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjQuanMnO1xyXG5pbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uLy4uL21hdGgvQ29sb3IuanMnO1xyXG5pbXBvcnQgeyBCYXNpY1NoYWRvd01hcCB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcblxyXG5jb25zdCBfY2xlYXJDb2xvciA9IC8qQF9fUFVSRV9fKi8gbmV3IENvbG9yKCk7XHJcblxyXG4vLyBjdWJlVG9VVigpIG1hcHMgYSAzRCBkaXJlY3Rpb24gdmVjdG9yIHN1aXRhYmxlIGZvciBjdWJlIHRleHR1cmUgbWFwcGluZyB0byBhIDJEXHJcbi8vIHZlY3RvciBzdWl0YWJsZSBmb3IgMkQgdGV4dHVyZSBtYXBwaW5nLiBUaGlzIGNvZGUgdXNlcyB0aGUgZm9sbG93aW5nIGxheW91dCBmb3IgdGhlXHJcbi8vIDJEIHRleHR1cmU6XHJcbi8vXHJcbi8vIHh6WFpcclxuLy8gIHkgWVxyXG4vL1xyXG4vLyBZIC0gUG9zaXRpdmUgeSBkaXJlY3Rpb25cclxuLy8geSAtIE5lZ2F0aXZlIHkgZGlyZWN0aW9uXHJcbi8vIFggLSBQb3NpdGl2ZSB4IGRpcmVjdGlvblxyXG4vLyB4IC0gTmVnYXRpdmUgeCBkaXJlY3Rpb25cclxuLy8gWiAtIFBvc2l0aXZlIHogZGlyZWN0aW9uXHJcbi8vIHogLSBOZWdhdGl2ZSB6IGRpcmVjdGlvblxyXG4vL1xyXG4vLyBTb3VyY2UgYW5kIHRlc3QgYmVkOlxyXG4vLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS90c2Nody9kYTEwYzQzYzQ2N2NlOGFmZDBjNFxyXG5cclxuZXhwb3J0IGNvbnN0IGN1YmVUb1VWID0gLypAX19QVVJFX18qLyBGbiggKCBbIHBvcywgdGV4ZWxTaXplWSBdICkgPT4ge1xyXG5cclxuXHRjb25zdCB2ID0gcG9zLnRvVmFyKCk7XHJcblxyXG5cdC8vIE51bWJlciBvZiB0ZXhlbHMgdG8gYXZvaWQgYXQgdGhlIGVkZ2Ugb2YgZWFjaCBzcXVhcmVcclxuXHJcblx0Y29uc3QgYWJzViA9IGFicyggdiApO1xyXG5cclxuXHQvLyBJbnRlcnNlY3QgdW5pdCBjdWJlXHJcblxyXG5cdGNvbnN0IHNjYWxlVG9DdWJlID0gZGl2KCAxLjAsIG1heCggYWJzVi54LCBtYXgoIGFic1YueSwgYWJzVi56ICkgKSApO1xyXG5cdGFic1YubXVsQXNzaWduKCBzY2FsZVRvQ3ViZSApO1xyXG5cclxuXHQvLyBBcHBseSBzY2FsZSB0byBhdm9pZCBzZWFtc1xyXG5cclxuXHQvLyB0d28gdGV4ZWxzIGxlc3MgcGVyIHNxdWFyZSAob25lIHRleGVsIHdpbGwgZG8gZm9yIE5FQVJFU1QpXHJcblx0di5tdWxBc3NpZ24oIHNjYWxlVG9DdWJlLm11bCggdGV4ZWxTaXplWS5tdWwoIDIgKS5vbmVNaW51cygpICkgKTtcclxuXHJcblx0Ly8gVW53cmFwXHJcblxyXG5cdC8vIHNwYWNlOiAtMSAuLi4gMSByYW5nZSBmb3IgZWFjaCBzcXVhcmVcclxuXHQvL1xyXG5cdC8vICNYIyNcdFx0ZGltICAgIDo9ICggNCAsIDIgKVxyXG5cdC8vICAjICNcdFx0Y2VudGVyIDo9ICggMSAsIDEgKVxyXG5cclxuXHRjb25zdCBwbGFuYXIgPSB2ZWMyKCB2Lnh5ICkudG9WYXIoKTtcclxuXHJcblx0Y29uc3QgYWxtb3N0QVRleGVsID0gdGV4ZWxTaXplWS5tdWwoIDEuNSApO1xyXG5cdGNvbnN0IGFsbW9zdE9uZSA9IGFsbW9zdEFUZXhlbC5vbmVNaW51cygpO1xyXG5cclxuXHRJZiggYWJzVi56LmdyZWF0ZXJUaGFuRXF1YWwoIGFsbW9zdE9uZSApLCAoKSA9PiB7XHJcblxyXG5cdFx0SWYoIHYuei5ncmVhdGVyVGhhbiggMC4wICksICgpID0+IHtcclxuXHJcblx0XHRcdHBsYW5hci54LmFzc2lnbiggc3ViKCA0LjAsIHYueCApICk7XHJcblxyXG5cdFx0fSApO1xyXG5cclxuXHR9ICkuRWxzZUlmKCBhYnNWLnguZ3JlYXRlclRoYW5FcXVhbCggYWxtb3N0T25lICksICgpID0+IHtcclxuXHJcblx0XHRjb25zdCBzaWduWCA9IHNpZ24oIHYueCApO1xyXG5cdFx0cGxhbmFyLnguYXNzaWduKCB2LnoubXVsKCBzaWduWCApLmFkZCggc2lnblgubXVsKCAyLjAgKSApICk7XHJcblxyXG5cdH0gKS5FbHNlSWYoIGFic1YueS5ncmVhdGVyVGhhbkVxdWFsKCBhbG1vc3RPbmUgKSwgKCkgPT4ge1xyXG5cclxuXHRcdGNvbnN0IHNpZ25ZID0gc2lnbiggdi55ICk7XHJcblx0XHRwbGFuYXIueC5hc3NpZ24oIHYueC5hZGQoIHNpZ25ZLm11bCggMi4wICkgKS5hZGQoIDIuMCApICk7XHJcblx0XHRwbGFuYXIueS5hc3NpZ24oIHYuei5tdWwoIHNpZ25ZICkuc3ViKCAyLjAgKSApO1xyXG5cclxuXHR9ICk7XHJcblxyXG5cdC8vIFRyYW5zZm9ybSB0byBVViBzcGFjZVxyXG5cclxuXHQvLyBzY2FsZSA6PSAwLjUgLyBkaW1cclxuXHQvLyB0cmFuc2xhdGUgOj0gKCBjZW50ZXIgKyAwLjUgKSAvIGRpbVxyXG5cdHJldHVybiB2ZWMyKCAwLjEyNSwgMC4yNSApLm11bCggcGxhbmFyICkuYWRkKCB2ZWMyKCAwLjM3NSwgMC43NSApICkuZmxpcFkoKTtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnY3ViZVRvVVYnLFxyXG5cdHR5cGU6ICd2ZWMyJyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ3BvcycsIHR5cGU6ICd2ZWMzJyB9LFxyXG5cdFx0eyBuYW1lOiAndGV4ZWxTaXplWScsIHR5cGU6ICdmbG9hdCcgfVxyXG5cdF1cclxufSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IEJhc2ljUG9pbnRTaGFkb3dGaWx0ZXIgPSAvKkBfX1BVUkVfXyovIEZuKCAoIHsgZGVwdGhUZXh0dXJlLCBiZDNELCBkcCwgdGV4ZWxTaXplIH0gKSA9PiB7XHJcblxyXG5cdHJldHVybiB0ZXh0dXJlKCBkZXB0aFRleHR1cmUsIGN1YmVUb1VWKCBiZDNELCB0ZXhlbFNpemUueSApICkuY29tcGFyZSggZHAgKTtcclxuXHJcbn0gKTtcclxuXHJcbmV4cG9ydCBjb25zdCBQb2ludFNoYWRvd0ZpbHRlciA9IC8qQF9fUFVSRV9fKi8gRm4oICggeyBkZXB0aFRleHR1cmUsIGJkM0QsIGRwLCB0ZXhlbFNpemUsIHNoYWRvdyB9ICkgPT4ge1xyXG5cclxuXHRjb25zdCByYWRpdXMgPSByZWZlcmVuY2UoICdyYWRpdXMnLCAnZmxvYXQnLCBzaGFkb3cgKS5zZXRHcm91cCggcmVuZGVyR3JvdXAgKTtcclxuXHRjb25zdCBvZmZzZXQgPSB2ZWMyKCAtIDEuMCwgMS4wICkubXVsKCByYWRpdXMgKS5tdWwoIHRleGVsU2l6ZS55ICk7XHJcblxyXG5cdHJldHVybiB0ZXh0dXJlKCBkZXB0aFRleHR1cmUsIGN1YmVUb1VWKCBiZDNELmFkZCggb2Zmc2V0Lnh5eSApLCB0ZXhlbFNpemUueSApICkuY29tcGFyZSggZHAgKVxyXG5cdFx0LmFkZCggdGV4dHVyZSggZGVwdGhUZXh0dXJlLCBjdWJlVG9VViggYmQzRC5hZGQoIG9mZnNldC55eXkgKSwgdGV4ZWxTaXplLnkgKSApLmNvbXBhcmUoIGRwICkgKVxyXG5cdFx0LmFkZCggdGV4dHVyZSggZGVwdGhUZXh0dXJlLCBjdWJlVG9VViggYmQzRC5hZGQoIG9mZnNldC54eXggKSwgdGV4ZWxTaXplLnkgKSApLmNvbXBhcmUoIGRwICkgKVxyXG5cdFx0LmFkZCggdGV4dHVyZSggZGVwdGhUZXh0dXJlLCBjdWJlVG9VViggYmQzRC5hZGQoIG9mZnNldC55eXggKSwgdGV4ZWxTaXplLnkgKSApLmNvbXBhcmUoIGRwICkgKVxyXG5cdFx0LmFkZCggdGV4dHVyZSggZGVwdGhUZXh0dXJlLCBjdWJlVG9VViggYmQzRCwgdGV4ZWxTaXplLnkgKSApLmNvbXBhcmUoIGRwICkgKVxyXG5cdFx0LmFkZCggdGV4dHVyZSggZGVwdGhUZXh0dXJlLCBjdWJlVG9VViggYmQzRC5hZGQoIG9mZnNldC54eHkgKSwgdGV4ZWxTaXplLnkgKSApLmNvbXBhcmUoIGRwICkgKVxyXG5cdFx0LmFkZCggdGV4dHVyZSggZGVwdGhUZXh0dXJlLCBjdWJlVG9VViggYmQzRC5hZGQoIG9mZnNldC55eHkgKSwgdGV4ZWxTaXplLnkgKSApLmNvbXBhcmUoIGRwICkgKVxyXG5cdFx0LmFkZCggdGV4dHVyZSggZGVwdGhUZXh0dXJlLCBjdWJlVG9VViggYmQzRC5hZGQoIG9mZnNldC54eHggKSwgdGV4ZWxTaXplLnkgKSApLmNvbXBhcmUoIGRwICkgKVxyXG5cdFx0LmFkZCggdGV4dHVyZSggZGVwdGhUZXh0dXJlLCBjdWJlVG9VViggYmQzRC5hZGQoIG9mZnNldC55eHggKSwgdGV4ZWxTaXplLnkgKSApLmNvbXBhcmUoIGRwICkgKVxyXG5cdFx0Lm11bCggMS4wIC8gOS4wICk7XHJcblxyXG59ICk7XHJcblxyXG5jb25zdCBwb2ludFNoYWRvd0ZpbHRlciA9IC8qQF9fUFVSRV9fKi8gRm4oICggeyBmaWx0ZXJGbiwgZGVwdGhUZXh0dXJlLCBzaGFkb3dDb29yZCwgc2hhZG93IH0gKSA9PiB7XHJcblxyXG5cdC8vIGZvciBwb2ludCBsaWdodHMsIHRoZSB1bmlmb3JtIEB2U2hhZG93Q29vcmQgaXMgcmUtcHVycG9zZWQgdG8gaG9sZFxyXG5cdC8vIHRoZSB2ZWN0b3IgZnJvbSB0aGUgbGlnaHQgdG8gdGhlIHdvcmxkLXNwYWNlIHBvc2l0aW9uIG9mIHRoZSBmcmFnbWVudC5cclxuXHRjb25zdCBsaWdodFRvUG9zaXRpb24gPSBzaGFkb3dDb29yZC54eXoudG9WYXIoKTtcclxuXHRjb25zdCBsaWdodFRvUG9zaXRpb25MZW5ndGggPSBsaWdodFRvUG9zaXRpb24ubGVuZ3RoKCk7XHJcblxyXG5cdGNvbnN0IGNhbWVyYU5lYXJMb2NhbCA9IHVuaWZvcm0oICdmbG9hdCcgKS5zZXRHcm91cCggcmVuZGVyR3JvdXAgKS5vblJlbmRlclVwZGF0ZSggKCkgPT4gc2hhZG93LmNhbWVyYS5uZWFyICk7XHJcblx0Y29uc3QgY2FtZXJhRmFyTG9jYWwgPSB1bmlmb3JtKCAnZmxvYXQnICkuc2V0R3JvdXAoIHJlbmRlckdyb3VwICkub25SZW5kZXJVcGRhdGUoICgpID0+IHNoYWRvdy5jYW1lcmEuZmFyICk7XHJcblx0Y29uc3QgYmlhcyA9IHJlZmVyZW5jZSggJ2JpYXMnLCAnZmxvYXQnLCBzaGFkb3cgKS5zZXRHcm91cCggcmVuZGVyR3JvdXAgKTtcclxuXHRjb25zdCBtYXBTaXplID0gdW5pZm9ybSggc2hhZG93Lm1hcFNpemUgKS5zZXRHcm91cCggcmVuZGVyR3JvdXAgKTtcclxuXHJcblx0Y29uc3QgcmVzdWx0ID0gZmxvYXQoIDEuMCApLnRvVmFyKCk7XHJcblxyXG5cdElmKCBsaWdodFRvUG9zaXRpb25MZW5ndGguc3ViKCBjYW1lcmFGYXJMb2NhbCApLmxlc3NUaGFuRXF1YWwoIDAuMCApLmFuZCggbGlnaHRUb1Bvc2l0aW9uTGVuZ3RoLnN1YiggY2FtZXJhTmVhckxvY2FsICkuZ3JlYXRlclRoYW5FcXVhbCggMC4wICkgKSwgKCkgPT4ge1xyXG5cclxuXHRcdC8vIGRwID0gbm9ybWFsaXplZCBkaXN0YW5jZSBmcm9tIGxpZ2h0IHRvIGZyYWdtZW50IHBvc2l0aW9uXHJcblx0XHRjb25zdCBkcCA9IGxpZ2h0VG9Qb3NpdGlvbkxlbmd0aC5zdWIoIGNhbWVyYU5lYXJMb2NhbCApLmRpdiggY2FtZXJhRmFyTG9jYWwuc3ViKCBjYW1lcmFOZWFyTG9jYWwgKSApLnRvVmFyKCk7IC8vIG5lZWQgdG8gY2xhbXA/XHJcblx0XHRkcC5hZGRBc3NpZ24oIGJpYXMgKTtcclxuXHJcblx0XHQvLyBiZDNEID0gYmFzZSBkaXJlY3Rpb24gM0RcclxuXHRcdGNvbnN0IGJkM0QgPSBsaWdodFRvUG9zaXRpb24ubm9ybWFsaXplKCk7XHJcblx0XHRjb25zdCB0ZXhlbFNpemUgPSB2ZWMyKCAxLjAgKS5kaXYoIG1hcFNpemUubXVsKCB2ZWMyKCA0LjAsIDIuMCApICkgKTtcclxuXHJcblx0XHQvLyBwZXJjZW50YWdlLWNsb3NlciBmaWx0ZXJpbmdcclxuXHRcdHJlc3VsdC5hc3NpZ24oIGZpbHRlckZuKCB7IGRlcHRoVGV4dHVyZSwgYmQzRCwgZHAsIHRleGVsU2l6ZSwgc2hhZG93IH0gKSApO1xyXG5cclxuXHR9ICk7XHJcblxyXG5cdHJldHVybiByZXN1bHQ7XHJcblxyXG59ICk7XHJcblxyXG5jb25zdCBfdmlld3BvcnQgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3I0KCk7XHJcbmNvbnN0IF92aWV3cG9ydFNpemUgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IyKCk7XHJcbmNvbnN0IF9zaGFkb3dNYXBTaXplID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMigpO1xyXG5cclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIHRoZSBzaGFkb3cgaW1wbGVtZW50YXRpb24gZm9yIHBvaW50IGxpZ2h0IG5vZGVzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgU2hhZG93Tm9kZVxyXG4gKi9cclxuY2xhc3MgUG9pbnRTaGFkb3dOb2RlIGV4dGVuZHMgU2hhZG93Tm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ1BvaW50U2hhZG93Tm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBwb2ludCBzaGFkb3cgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UG9pbnRMaWdodH0gbGlnaHQgLSBUaGUgc2hhZG93IGNhc3RpbmcgcG9pbnQgbGlnaHQuXHJcblx0ICogQHBhcmFtIHs/UG9pbnRMaWdodFNoYWRvd30gW3NoYWRvdz1udWxsXSAtIEFuIG9wdGlvbmFsIHBvaW50IGxpZ2h0IHNoYWRvdy5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbGlnaHQsIHNoYWRvdyA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoIGxpZ2h0LCBzaGFkb3cgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBPdmVyd3JpdGVzIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRvIHJldHVybiBwb2ludCBsaWdodCBzaGFkb3cgc3BlY2lmaWNcclxuXHQgKiBmaWx0ZXJpbmcgZnVuY3Rpb25zLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHR5cGUgLSBUaGUgc2hhZG93IHR5cGUuXHJcblx0ICogQHJldHVybiB7RnVuY3Rpb259IFRoZSBmaWx0ZXJpbmcgZnVuY3Rpb24uXHJcblx0ICovXHJcblx0Z2V0U2hhZG93RmlsdGVyRm4oIHR5cGUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHR5cGUgPT09IEJhc2ljU2hhZG93TWFwID8gQmFzaWNQb2ludFNoYWRvd0ZpbHRlciA6IFBvaW50U2hhZG93RmlsdGVyO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE92ZXJ3cml0ZXMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc28gdGhlIHVuYWx0ZXJlZCBzaGFkb3cgcG9zaXRpb24gaXMgdXNlZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBub2RlIGJ1aWxkZXIuXHJcblx0ICogQHBhcmFtIHtOb2RlPHZlYzM+fSBzaGFkb3dQb3NpdGlvbiAtIEEgbm9kZSByZXByZXNlbnRpbmcgdGhlIHNoYWRvdyBwb3NpdGlvbi5cclxuXHQgKiBAcmV0dXJuIHtOb2RlPHZlYzM+fSBUaGUgc2hhZG93IGNvb3JkaW5hdGVzLlxyXG5cdCAqL1xyXG5cdHNldHVwU2hhZG93Q29vcmQoIGJ1aWxkZXIsIHNoYWRvd1Bvc2l0aW9uICkge1xyXG5cclxuXHRcdHJldHVybiBzaGFkb3dQb3NpdGlvbjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBPdmVyd3JpdGVzIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRvIG9ubHkgdXNlIHBvaW50IGxpZ2h0IHNwZWNpZmljXHJcblx0ICogc2hhZG93IGZpbHRlciBmdW5jdGlvbnMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dHMgLSBBIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHRoYXQgZGVmaW5lcyB0aGUgc2hhZG93IGZpbHRlcmluZy5cclxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpbnB1dHMuZmlsdGVyRm4gLSBUaGlzIGZ1bmN0aW9uIGRlZmluZXMgdGhlIGZpbHRlcmluZyB0eXBlIG9mIHRoZSBzaGFkb3cgbWFwIGUuZy4gUENGLlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gaW5wdXRzLnNoYWRvd1RleHR1cmUgLSBBIHJlZmVyZW5jZSB0byB0aGUgc2hhZG93IG1hcCdzIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtEZXB0aFRleHR1cmV9IGlucHV0cy5kZXB0aFRleHR1cmUgLSBBIHJlZmVyZW5jZSB0byB0aGUgc2hhZG93IG1hcCdzIHRleHR1cmUgZGF0YS5cclxuXHQgKiBAcGFyYW0ge05vZGU8dmVjMz59IGlucHV0cy5zaGFkb3dDb29yZCAtIFNoYWRvdyBjb29yZGluYXRlcyB3aGljaCBhcmUgdXNlZCB0byBzYW1wbGUgZnJvbSB0aGUgc2hhZG93IG1hcC5cclxuXHQgKiBAcGFyYW0ge0xpZ2h0U2hhZG93fSBpbnB1dHMuc2hhZG93IC0gVGhlIGxpZ2h0IHNoYWRvdy5cclxuXHQgKiBAcmV0dXJuIHtOb2RlPGZsb2F0Pn0gVGhlIHJlc3VsdCBub2RlIG9mIHRoZSBzaGFkb3cgZmlsdGVyaW5nLlxyXG5cdCAqL1xyXG5cdHNldHVwU2hhZG93RmlsdGVyKCBidWlsZGVyLCB7IGZpbHRlckZuLCBzaGFkb3dUZXh0dXJlLCBkZXB0aFRleHR1cmUsIHNoYWRvd0Nvb3JkLCBzaGFkb3cgfSApIHtcclxuXHJcblx0XHRyZXR1cm4gcG9pbnRTaGFkb3dGaWx0ZXIoIHsgZmlsdGVyRm4sIHNoYWRvd1RleHR1cmUsIGRlcHRoVGV4dHVyZSwgc2hhZG93Q29vcmQsIHNoYWRvdyB9ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogT3ZlcndyaXRlcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB3aXRoIHBvaW50IGxpZ2h0IHNwZWNpZmljXHJcblx0ICogcmVuZGVyaW5nIGNvZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVGcmFtZX0gZnJhbWUgLSBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBub2RlIGZyYW1lLlxyXG5cdCAqL1xyXG5cdHJlbmRlclNoYWRvdyggZnJhbWUgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBzaGFkb3csIHNoYWRvd01hcCwgbGlnaHQgfSA9IHRoaXM7XHJcblx0XHRjb25zdCB7IHJlbmRlcmVyLCBzY2VuZSB9ID0gZnJhbWU7XHJcblxyXG5cdFx0Y29uc3Qgc2hhZG93RnJhbWVFeHRlbnRzID0gc2hhZG93LmdldEZyYW1lRXh0ZW50cygpO1xyXG5cclxuXHRcdF9zaGFkb3dNYXBTaXplLmNvcHkoIHNoYWRvdy5tYXBTaXplICk7XHJcblx0XHRfc2hhZG93TWFwU2l6ZS5tdWx0aXBseSggc2hhZG93RnJhbWVFeHRlbnRzICk7XHJcblxyXG5cdFx0c2hhZG93TWFwLnNldFNpemUoIF9zaGFkb3dNYXBTaXplLndpZHRoLCBfc2hhZG93TWFwU2l6ZS5oZWlnaHQgKTtcclxuXHJcblx0XHRfdmlld3BvcnRTaXplLmNvcHkoIHNoYWRvdy5tYXBTaXplICk7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCBwcmV2aW91c0F1dG9DbGVhciA9IHJlbmRlcmVyLmF1dG9DbGVhcjtcclxuXHJcblx0XHRjb25zdCBwcmV2aW91c0NsZWFyQ29sb3IgPSByZW5kZXJlci5nZXRDbGVhckNvbG9yKCBfY2xlYXJDb2xvciApO1xyXG5cdFx0Y29uc3QgcHJldmlvdXNDbGVhckFscGhhID0gcmVuZGVyZXIuZ2V0Q2xlYXJBbHBoYSgpO1xyXG5cclxuXHRcdHJlbmRlcmVyLmF1dG9DbGVhciA9IGZhbHNlO1xyXG5cdFx0cmVuZGVyZXIuc2V0Q2xlYXJDb2xvciggc2hhZG93LmNsZWFyQ29sb3IsIHNoYWRvdy5jbGVhckFscGhhICk7XHJcblx0XHRyZW5kZXJlci5jbGVhcigpO1xyXG5cclxuXHRcdGNvbnN0IHZpZXdwb3J0Q291bnQgPSBzaGFkb3cuZ2V0Vmlld3BvcnRDb3VudCgpO1xyXG5cclxuXHRcdGZvciAoIGxldCB2cCA9IDA7IHZwIDwgdmlld3BvcnRDb3VudDsgdnAgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB2aWV3cG9ydCA9IHNoYWRvdy5nZXRWaWV3cG9ydCggdnAgKTtcclxuXHJcblx0XHRcdGNvbnN0IHggPSBfdmlld3BvcnRTaXplLnggKiB2aWV3cG9ydC54O1xyXG5cdFx0XHRjb25zdCB5ID0gX3NoYWRvd01hcFNpemUueSAtIF92aWV3cG9ydFNpemUueSAtICggX3ZpZXdwb3J0U2l6ZS55ICogdmlld3BvcnQueSApO1xyXG5cclxuXHRcdFx0X3ZpZXdwb3J0LnNldChcclxuXHRcdFx0XHR4LFxyXG5cdFx0XHRcdHksXHJcblx0XHRcdFx0X3ZpZXdwb3J0U2l6ZS54ICogdmlld3BvcnQueixcclxuXHRcdFx0XHRfdmlld3BvcnRTaXplLnkgKiB2aWV3cG9ydC53XHJcblx0XHRcdCk7XHJcblxyXG5cdFx0XHRzaGFkb3dNYXAudmlld3BvcnQuY29weSggX3ZpZXdwb3J0ICk7XHJcblxyXG5cdFx0XHRzaGFkb3cudXBkYXRlTWF0cmljZXMoIGxpZ2h0LCB2cCApO1xyXG5cclxuXHRcdFx0cmVuZGVyZXIucmVuZGVyKCBzY2VuZSwgc2hhZG93LmNhbWVyYSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdHJlbmRlcmVyLmF1dG9DbGVhciA9IHByZXZpb3VzQXV0b0NsZWFyO1xyXG5cdFx0cmVuZGVyZXIuc2V0Q2xlYXJDb2xvciggcHJldmlvdXNDbGVhckNvbG9yLCBwcmV2aW91c0NsZWFyQWxwaGEgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUG9pbnRTaGFkb3dOb2RlO1xyXG5cclxuLyoqXHJcbiAqIFRTTCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYW4gaW5zdGFuY2Ugb2YgYFBvaW50U2hhZG93Tm9kZWAuXHJcbiAqXHJcbiAqIEB0c2xcclxuICogQGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSB7UG9pbnRMaWdodH0gbGlnaHQgLSBUaGUgc2hhZG93IGNhc3RpbmcgcG9pbnQgbGlnaHQuXHJcbiAqIEBwYXJhbSB7P1BvaW50TGlnaHRTaGFkb3d9IFtzaGFkb3c9bnVsbF0gLSBBbiBvcHRpb25hbCBwb2ludCBsaWdodCBzaGFkb3cuXHJcbiAqIEByZXR1cm4ge1BvaW50U2hhZG93Tm9kZX0gVGhlIGNyZWF0ZWQgcG9pbnQgc2hhZG93IG5vZGUuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgcG9pbnRTaGFkb3cgPSAoIGxpZ2h0LCBzaGFkb3cgKSA9PiBub2RlT2JqZWN0KCBuZXcgUG9pbnRTaGFkb3dOb2RlKCBsaWdodCwgc2hhZG93ICkgKTtcclxuIiwiaW1wb3J0IExpZ2h0aW5nTm9kZSBmcm9tICcuL0xpZ2h0aW5nTm9kZS5qcyc7XHJcbmltcG9ydCB7IE5vZGVVcGRhdGVUeXBlIH0gZnJvbSAnLi4vY29yZS9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyB1bmlmb3JtIH0gZnJvbSAnLi4vY29yZS9Vbmlmb3JtTm9kZS5qcyc7XHJcbmltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vLi4vbWF0aC9Db2xvci5qcyc7XHJcbmltcG9ydCB7IHJlbmRlckdyb3VwIH0gZnJvbSAnLi4vY29yZS9Vbmlmb3JtR3JvdXBOb2RlLmpzJztcclxuaW1wb3J0IHsgaGFzaCB9IGZyb20gJy4uL2NvcmUvTm9kZVV0aWxzLmpzJztcclxuaW1wb3J0IHsgc2hhZG93IH0gZnJvbSAnLi9TaGFkb3dOb2RlLmpzJztcclxuaW1wb3J0IHsgbm9kZU9iamVjdCB9IGZyb20gJy4uL3RzbC9UU0xDb3JlLmpzJztcclxuaW1wb3J0IHsgbGlnaHRWaWV3UG9zaXRpb24gfSBmcm9tICcuLi9hY2Nlc3NvcnMvTGlnaHRzLmpzJztcclxuaW1wb3J0IHsgcG9zaXRpb25WaWV3IH0gZnJvbSAnLi4vYWNjZXNzb3JzL1Bvc2l0aW9uLmpzJztcclxuXHJcbi8qKlxyXG4gKiBCYXNlIGNsYXNzIGZvciBhbmFseXRpYyBsaWdodCBub2Rlcy5cclxuICpcclxuICogQGF1Z21lbnRzIExpZ2h0aW5nTm9kZVxyXG4gKi9cclxuY2xhc3MgQW5hbHl0aWNMaWdodE5vZGUgZXh0ZW5kcyBMaWdodGluZ05vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdBbmFseXRpY0xpZ2h0Tm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBhbmFseXRpYyBsaWdodCBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHs/TGlnaHR9IFtsaWdodD1udWxsXSAtIFRoZSBsaWdodCBzb3VyY2UuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGxpZ2h0ID0gbnVsbCApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGxpZ2h0IHNvdXJjZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P0xpZ2h0fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxpZ2h0ID0gbGlnaHQ7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbGlnaHQncyBjb2xvciB2YWx1ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Q29sb3J9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBsaWdodCdzIGNvbG9yIG5vZGUuIFBvaW50cyB0byBgY29sb3JOb2RlYCBvZiB0aGUgbGlnaHQgc291cmNlLCBpZiBzZXQuIE90aGVyd2lzZVxyXG5cdFx0ICogaXQgY3JlYXRlcyBhIHVuaWZvcm0gbm9kZSBiYXNlZCBvbiB7QGxpbmsgQW5hbHl0aWNMaWdodE5vZGUjY29sb3J9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvbG9yTm9kZSA9ICggbGlnaHQgJiYgbGlnaHQuY29sb3JOb2RlICkgfHwgdW5pZm9ybSggdGhpcy5jb2xvciApLnNldEdyb3VwKCByZW5kZXJHcm91cCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIHRvIHJldGFpbiBhIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwgdmFsdWUgb2Yge0BsaW5rIEFuYWx5dGljTGlnaHROb2RlI2NvbG9yTm9kZX0uXHJcblx0XHQgKiBUaGUgZmluYWwgY29sb3Igbm9kZSBpcyByZXByZXNlbnRlZCBieSBhIGRpZmZlcmVudCBub2RlIHdoZW4gdXNpbmcgc2hhZG93cy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYmFzZUNvbG9yTm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXByZXNlbnRzIHRoZSBsaWdodCdzIHNoYWRvdy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1NoYWRvd05vZGV9XHJcbiAgIFx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2hhZG93Tm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXByZXNlbnRzIHRoZSBsaWdodCdzIHNoYWRvdyBjb2xvci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGV9XHJcbiAgIFx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2hhZG93Q29sb3JOb2RlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNBbmFseXRpY0xpZ2h0Tm9kZSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBPdmVyd3JpdHRlbiBzaW5jZSBhbmFseXRpYyBsaWdodCBub2RlcyBhcmUgdXBkYXRlZFxyXG5cdFx0ICogb25jZSBwZXIgZnJhbWUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqIEBkZWZhdWx0ICdmcmFtZSdcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51cGRhdGVUeXBlID0gTm9kZVVwZGF0ZVR5cGUuRlJBTUU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogT3ZlcndyaXRlcyB0aGUgZGVmYXVsdCB7QGxpbmsgTm9kZSNjdXN0b21DYWNoZUtleX0gaW1wbGVtZW50YXRpb24gYnkgaW5jbHVkaW5nIHRoZVxyXG5cdCAqIGBsaWdodC5pZGAgYW5kIGBsaWdodC5jYXN0U2hhZG93YCBpbnRvIHRoZSBjYWNoZSBrZXkuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBjdXN0b20gY2FjaGUga2V5LlxyXG5cdCAqL1xyXG5cdGN1c3RvbUNhY2hlS2V5KCkge1xyXG5cclxuXHRcdHJldHVybiBoYXNoKCB0aGlzLmxpZ2h0LmlkLCB0aGlzLmxpZ2h0LmNhc3RTaGFkb3cgPyAxIDogMCApO1xyXG5cclxuXHR9XHJcblxyXG5cdGdldEhhc2goKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubGlnaHQudXVpZDtcclxuXHJcblx0fVxyXG5cclxuXHRnZXRMaWdodFZlY3RvciggYnVpbGRlciApIHtcclxuXHJcblx0XHRyZXR1cm4gbGlnaHRWaWV3UG9zaXRpb24oIHRoaXMubGlnaHQgKS5zdWIoIGJ1aWxkZXIuY29udGV4dC5wb3NpdGlvblZpZXcgfHwgcG9zaXRpb25WaWV3ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB1cCB0aGUgZGlyZWN0IGxpZ2h0aW5nIGZvciB0aGUgYW5hbHl0aWMgbGlnaHQgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IGJ1aWxkZXIgLSBUaGUgYnVpbGRlciBvYmplY3QgdXNlZCBmb3Igc2V0dGluZyB1cCB0aGUgbGlnaHQuXHJcblx0ICogQHJldHVybiB7T2JqZWN0fHVuZGVmaW5lZH0gVGhlIGRpcmVjdCBsaWdodCBkYXRhIChjb2xvciBhbmQgZGlyZWN0aW9uKS5cclxuXHQgKi9cclxuXHRzZXR1cERpcmVjdCggLypidWlsZGVyKi8gKSB7IH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB1cCB0aGUgZGlyZWN0IHJlY3QgYXJlYSBsaWdodGluZyBmb3IgdGhlIGFuYWx5dGljIGxpZ2h0IG5vZGUuXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGJ1aWxkZXIgb2JqZWN0IHVzZWQgZm9yIHNldHRpbmcgdXAgdGhlIGxpZ2h0LlxyXG5cdCAqIEByZXR1cm4ge09iamVjdHx1bmRlZmluZWR9IFRoZSBkaXJlY3QgcmVjdCBhcmVhIGxpZ2h0IGRhdGEuXHJcblx0ICovXHJcblx0c2V0dXBEaXJlY3RSZWN0QXJlYSggLypidWlsZGVyKi8gKSB7IH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0dXBzIHRoZSBzaGFkb3cgbm9kZSBmb3IgdGhpcyBsaWdodC4gVGhlIG1ldGhvZCBleGlzdHMgc28gY29uY3JldGUgbGlnaHQgY2xhc3Nlc1xyXG5cdCAqIGNhbiBzZXR1cCBkaWZmZXJlbnQgdHlwZXMgb2Ygc2hhZG93IG5vZGVzLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7U2hhZG93Tm9kZX0gVGhlIGNyZWF0ZWQgc2hhZG93IG5vZGUuXHJcblx0ICovXHJcblx0c2V0dXBTaGFkb3dOb2RlKCkge1xyXG5cclxuXHRcdHJldHVybiBzaGFkb3coIHRoaXMubGlnaHQgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXR1cHMgdGhlIHNoYWRvdyBmb3IgdGhpcyBsaWdodC4gVGhpcyBtZXRob2QgaXMgb25seSBleGVjdXRlZCBpZiB0aGUgbGlnaHRcclxuXHQgKiBjYXN0IHNoYWRvd3MgYW5kIHRoZSBjdXJyZW50IGJ1aWxkIG9iamVjdCByZWNlaXZlcyBzaGFkb3dzLiBJdCBpbmNvcnBvcmF0ZXNcclxuXHQgKiBzaGFkb3dzIGludG8gdGhlIGxpZ2h0aW5nIGNvbXB1dGF0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQnVpbGRlcn0gYnVpbGRlciAtIFRoZSBjdXJyZW50IG5vZGUgYnVpbGRlci5cclxuXHQgKi9cclxuXHRzZXR1cFNoYWRvdyggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCB7IHJlbmRlcmVyIH0gPSBidWlsZGVyO1xyXG5cclxuXHRcdGlmICggcmVuZGVyZXIuc2hhZG93TWFwLmVuYWJsZWQgPT09IGZhbHNlICkgcmV0dXJuO1xyXG5cclxuXHRcdGxldCBzaGFkb3dDb2xvck5vZGUgPSB0aGlzLnNoYWRvd0NvbG9yTm9kZTtcclxuXHJcblx0XHRpZiAoIHNoYWRvd0NvbG9yTm9kZSA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGN1c3RvbVNoYWRvd05vZGUgPSB0aGlzLmxpZ2h0LnNoYWRvdy5zaGFkb3dOb2RlO1xyXG5cclxuXHRcdFx0bGV0IHNoYWRvd05vZGU7XHJcblxyXG5cdFx0XHRpZiAoIGN1c3RvbVNoYWRvd05vZGUgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0c2hhZG93Tm9kZSA9IG5vZGVPYmplY3QoIGN1c3RvbVNoYWRvd05vZGUgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHNoYWRvd05vZGUgPSB0aGlzLnNldHVwU2hhZG93Tm9kZSgpO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5zaGFkb3dOb2RlID0gc2hhZG93Tm9kZTtcclxuXHJcblx0XHRcdHRoaXMuc2hhZG93Q29sb3JOb2RlID0gc2hhZG93Q29sb3JOb2RlID0gdGhpcy5jb2xvck5vZGUubXVsKCBzaGFkb3dOb2RlICk7XHJcblxyXG5cdFx0XHR0aGlzLmJhc2VDb2xvck5vZGUgPSB0aGlzLmNvbG9yTm9kZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHR0aGlzLmNvbG9yTm9kZSA9IHNoYWRvd0NvbG9yTm9kZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVbmxpa2UgbW9zdCBvdGhlciBub2RlcywgbGlnaHRpbmcgbm9kZXMgZG8gbm90IHJldHVybiBhIG91dHB1dCBub2RlIGluIHtAbGluayBOb2RlI3NldHVwfS5cclxuXHQgKiBUaGUgbWFpbiBwdXJwb3NlIG9mIGxpZ2h0aW5nIG5vZGVzIGlzIHRvIGNvbmZpZ3VyZSB0aGUgY3VycmVudCB7QGxpbmsgTGlnaHRpbmdNb2RlbH0gYW5kL29yXHJcblx0ICogaW52b2NhdGUgdGhlIHJlc3BlY3RpdmUgaW50ZXJmYWNlIG1ldGhvZHMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGN1cnJlbnQgbm9kZSBidWlsZGVyLlxyXG5cdCAqL1xyXG5cdHNldHVwKCBidWlsZGVyICkge1xyXG5cclxuXHRcdHRoaXMuY29sb3JOb2RlID0gdGhpcy5iYXNlQ29sb3JOb2RlIHx8IHRoaXMuY29sb3JOb2RlO1xyXG5cclxuXHRcdGlmICggdGhpcy5saWdodC5jYXN0U2hhZG93ICkge1xyXG5cclxuXHRcdFx0aWYgKCBidWlsZGVyLm9iamVjdC5yZWNlaXZlU2hhZG93ICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLnNldHVwU2hhZG93KCBidWlsZGVyICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmICggdGhpcy5zaGFkb3dOb2RlICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5zaGFkb3dOb2RlLmRpc3Bvc2UoKTtcclxuXHRcdFx0dGhpcy5zaGFkb3dOb2RlID0gbnVsbDtcclxuXHRcdFx0dGhpcy5zaGFkb3dDb2xvck5vZGUgPSBudWxsO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBkaXJlY3RMaWdodERhdGEgPSB0aGlzLnNldHVwRGlyZWN0KCBidWlsZGVyICk7XHJcblx0XHRjb25zdCBkaXJlY3RSZWN0QXJlYUxpZ2h0RGF0YSA9IHRoaXMuc2V0dXBEaXJlY3RSZWN0QXJlYSggYnVpbGRlciApO1xyXG5cclxuXHRcdGlmICggZGlyZWN0TGlnaHREYXRhICkge1xyXG5cclxuXHRcdFx0YnVpbGRlci5saWdodHNOb2RlLnNldHVwRGlyZWN0TGlnaHQoIGJ1aWxkZXIsIHRoaXMsIGRpcmVjdExpZ2h0RGF0YSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGRpcmVjdFJlY3RBcmVhTGlnaHREYXRhICkge1xyXG5cclxuXHRcdFx0YnVpbGRlci5saWdodHNOb2RlLnNldHVwRGlyZWN0UmVjdEFyZWFMaWdodCggYnVpbGRlciwgdGhpcywgZGlyZWN0UmVjdEFyZWFMaWdodERhdGEgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIHVwZGF0ZSBtZXRob2QgaXMgdXNlZCB0byB1cGRhdGUgbGlnaHQgdW5pZm9ybXMgcGVyIGZyYW1lLlxyXG5cdCAqIFBvdGVudGlhbGx5IG92ZXJ3cml0dGVuIGluIGNvbmNyZXRlIGxpZ2h0IG5vZGVzIHRvIHVwZGF0ZSBsaWdodFxyXG5cdCAqIHNwZWNpZmljIHVuaWZvcm1zLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlRnJhbWV9IGZyYW1lIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgbm9kZSBmcmFtZS5cclxuXHQgKi9cclxuXHR1cGRhdGUoIC8qZnJhbWUqLyApIHtcclxuXHJcblx0XHRjb25zdCB7IGxpZ2h0IH0gPSB0aGlzO1xyXG5cclxuXHRcdHRoaXMuY29sb3IuY29weSggbGlnaHQuY29sb3IgKS5tdWx0aXBseVNjYWxhciggbGlnaHQuaW50ZW5zaXR5ICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEFuYWx5dGljTGlnaHROb2RlO1xyXG4iLCJpbXBvcnQgeyBGbiB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIGEgYGRpc2NhcmRgIHNoYWRlciBvcGVyYXRpb24gaW4gVFNMLlxyXG4gKlxyXG4gKiBAbWV0aG9kXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dHMgLSBUaGUgaW5wdXQgcGFyYW1ldGVyIG9iamVjdC5cclxuICogQHBhcmFtIHtOb2RlPGZsb2F0Pn0gaW5wdXRzLmxpZ2h0RGlzdGFuY2UgLSBUaGUgZGlzdGFuY2Ugb2YgdGhlIGxpZ2h0J3MgcG9zaXRpb24gdG8gdGhlIGN1cnJlbnQgZnJhZ21lbnQgcG9zaXRpb24uXHJcbiAqIEBwYXJhbSB7Tm9kZTxmbG9hdD59IGlucHV0cy5jdXRvZmZEaXN0YW5jZSAtIFRoZSBsaWdodCdzIGN1dG9mZiBkaXN0YW5jZS5cclxuICogQHBhcmFtIHtOb2RlPGZsb2F0Pn0gaW5wdXRzLmRlY2F5RXhwb25lbnQgLSBUaGUgbGlnaHQncyBkZWNheSBleHBvbmVudC5cclxuICogQHJldHVybiB7Tm9kZTxmbG9hdD59IFRoZSBkaXN0YW5jZSBmYWxsb2ZmLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGdldERpc3RhbmNlQXR0ZW51YXRpb24gPSAvKkBfX1BVUkVfXyovIEZuKCAoIHsgbGlnaHREaXN0YW5jZSwgY3V0b2ZmRGlzdGFuY2UsIGRlY2F5RXhwb25lbnQgfSApID0+IHtcclxuXHJcblx0Ly8gYmFzZWQgdXBvbiBGcm9zdGJpdGUgMyBNb3ZpbmcgdG8gUGh5c2ljYWxseS1iYXNlZCBSZW5kZXJpbmdcclxuXHQvLyBwYWdlIDMyLCBlcXVhdGlvbiAyNjogRVt3aW5kb3cxXVxyXG5cdC8vIGh0dHBzOi8vc2VibGFnYXJkZS5maWxlcy53b3JkcHJlc3MuY29tLzIwMTUvMDcvY291cnNlX25vdGVzX21vdmluZ19mcm9zdGJpdGVfdG9fcGJyX3YzMi5wZGZcclxuXHRjb25zdCBkaXN0YW5jZUZhbGxvZmYgPSBsaWdodERpc3RhbmNlLnBvdyggZGVjYXlFeHBvbmVudCApLm1heCggMC4wMSApLnJlY2lwcm9jYWwoKTtcclxuXHJcblx0cmV0dXJuIGN1dG9mZkRpc3RhbmNlLmdyZWF0ZXJUaGFuKCAwICkuc2VsZWN0KFxyXG5cdFx0ZGlzdGFuY2VGYWxsb2ZmLm11bCggbGlnaHREaXN0YW5jZS5kaXYoIGN1dG9mZkRpc3RhbmNlICkucG93NCgpLm9uZU1pbnVzKCkuY2xhbXAoKS5wb3cyKCkgKSxcclxuXHRcdGRpc3RhbmNlRmFsbG9mZlxyXG5cdCk7XHJcblxyXG59ICk7IC8vIHZhbGlkYXRlZFxyXG4iLCJpbXBvcnQgQW5hbHl0aWNMaWdodE5vZGUgZnJvbSAnLi9BbmFseXRpY0xpZ2h0Tm9kZS5qcyc7XHJcbmltcG9ydCB7IGdldERpc3RhbmNlQXR0ZW51YXRpb24gfSBmcm9tICcuL0xpZ2h0VXRpbHMuanMnO1xyXG5pbXBvcnQgeyB1bmlmb3JtIH0gZnJvbSAnLi4vY29yZS9Vbmlmb3JtTm9kZS5qcyc7XHJcbmltcG9ydCB7IHJlbmRlckdyb3VwIH0gZnJvbSAnLi4vY29yZS9Vbmlmb3JtR3JvdXBOb2RlLmpzJztcclxuaW1wb3J0IHsgcG9pbnRTaGFkb3cgfSBmcm9tICcuL1BvaW50U2hhZG93Tm9kZS5qcyc7XHJcblxyXG5leHBvcnQgY29uc3QgZGlyZWN0UG9pbnRMaWdodCA9ICggeyBjb2xvciwgbGlnaHRWZWN0b3IsIGN1dG9mZkRpc3RhbmNlLCBkZWNheUV4cG9uZW50IH0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IGxpZ2h0RGlyZWN0aW9uID0gbGlnaHRWZWN0b3Iubm9ybWFsaXplKCk7XHJcblx0Y29uc3QgbGlnaHREaXN0YW5jZSA9IGxpZ2h0VmVjdG9yLmxlbmd0aCgpO1xyXG5cclxuXHRjb25zdCBhdHRlbnVhdGlvbiA9IGdldERpc3RhbmNlQXR0ZW51YXRpb24oIHtcclxuXHRcdGxpZ2h0RGlzdGFuY2UsXHJcblx0XHRjdXRvZmZEaXN0YW5jZSxcclxuXHRcdGRlY2F5RXhwb25lbnRcclxuXHR9ICk7XHJcblxyXG5cdGNvbnN0IGxpZ2h0Q29sb3IgPSBjb2xvci5tdWwoIGF0dGVudWF0aW9uICk7XHJcblxyXG5cdHJldHVybiB7IGxpZ2h0RGlyZWN0aW9uLCBsaWdodENvbG9yIH07XHJcblxyXG59O1xyXG5cclxuLyoqXHJcbiAqIE1vZHVsZSBmb3IgcmVwcmVzZW50aW5nIHBvaW50IGxpZ2h0cyBhcyBub2Rlcy5cclxuICpcclxuICogQGF1Z21lbnRzIEFuYWx5dGljTGlnaHROb2RlXHJcbiAqL1xyXG5jbGFzcyBQb2ludExpZ2h0Tm9kZSBleHRlbmRzIEFuYWx5dGljTGlnaHROb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnUG9pbnRMaWdodE5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcG9pbnQgbGlnaHQgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7P1BvaW50TGlnaHR9IFtsaWdodD1udWxsXSAtIFRoZSBwb2ludCBsaWdodCBzb3VyY2UuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGxpZ2h0ID0gbnVsbCApIHtcclxuXHJcblx0XHRzdXBlciggbGlnaHQgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFVuaWZvcm0gbm9kZSByZXByZXNlbnRpbmcgdGhlIGN1dG9mZiBkaXN0YW5jZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VW5pZm9ybU5vZGU8ZmxvYXQ+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmN1dG9mZkRpc3RhbmNlTm9kZSA9IHVuaWZvcm0oIDAgKS5zZXRHcm91cCggcmVuZGVyR3JvdXAgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFVuaWZvcm0gbm9kZSByZXByZXNlbnRpbmcgdGhlIGRlY2F5IGV4cG9uZW50LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtVbmlmb3JtTm9kZTxmbG9hdD59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGVjYXlFeHBvbmVudE5vZGUgPSB1bmlmb3JtKCAyICkuc2V0R3JvdXAoIHJlbmRlckdyb3VwICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogT3ZlcndyaXR0ZW4gdG8gdXBkYXRlZCBwb2ludCBsaWdodCBzcGVjaWZpYyB1bmlmb3Jtcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUZyYW1lfSBmcmFtZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IG5vZGUgZnJhbWUuXHJcblx0ICovXHJcblx0dXBkYXRlKCBmcmFtZSApIHtcclxuXHJcblx0XHRjb25zdCB7IGxpZ2h0IH0gPSB0aGlzO1xyXG5cclxuXHRcdHN1cGVyLnVwZGF0ZSggZnJhbWUgKTtcclxuXHJcblx0XHR0aGlzLmN1dG9mZkRpc3RhbmNlTm9kZS52YWx1ZSA9IGxpZ2h0LmRpc3RhbmNlO1xyXG5cdFx0dGhpcy5kZWNheUV4cG9uZW50Tm9kZS52YWx1ZSA9IGxpZ2h0LmRlY2F5O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE92ZXJ3cml0dGVuIHRvIHNldHVwIHBvaW50IGxpZ2h0IHNwZWNpZmljIHNoYWRvdy5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1BvaW50U2hhZG93Tm9kZX1cclxuXHQgKi9cclxuXHRzZXR1cFNoYWRvd05vZGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHBvaW50U2hhZG93KCB0aGlzLmxpZ2h0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXBEaXJlY3QoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIGRpcmVjdFBvaW50TGlnaHQoIHtcclxuXHRcdFx0Y29sb3I6IHRoaXMuY29sb3JOb2RlLFxyXG5cdFx0XHRsaWdodFZlY3RvcjogdGhpcy5nZXRMaWdodFZlY3RvciggYnVpbGRlciApLFxyXG5cdFx0XHRjdXRvZmZEaXN0YW5jZTogdGhpcy5jdXRvZmZEaXN0YW5jZU5vZGUsXHJcblx0XHRcdGRlY2F5RXhwb25lbnQ6IHRoaXMuZGVjYXlFeHBvbmVudE5vZGVcclxuXHRcdH0gKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUG9pbnRMaWdodE5vZGU7XHJcbiIsImltcG9ydCB7IHV2IH0gZnJvbSAnLi4vYWNjZXNzb3JzL1VWLmpzJztcclxuaW1wb3J0IHsgRm4gfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIDJ4MiBjaGVja2VyYm9hcmQgcGF0dGVybiB0aGF0IGNhbiBiZSB1c2VkIGFzIHByb2NlZHVyYWwgdGV4dHVyZSBkYXRhLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGU8dmVjMj59IGNvb3JkIC0gVGhlIHV2IGNvb3JkaW5hdGVzLlxyXG4gKiBAcmV0dXJuIHtOb2RlPGZsb2F0Pn0gVGhlIHJlc3VsdCBkYXRhLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGNoZWNrZXIgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgY29vcmQgPSB1digpIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IHV2ID0gY29vcmQubXVsKCAyLjAgKTtcclxuXHJcblx0Y29uc3QgY3ggPSB1di54LmZsb29yKCk7XHJcblx0Y29uc3QgY3kgPSB1di55LmZsb29yKCk7XHJcblx0Y29uc3QgcmVzdWx0ID0gY3guYWRkKCBjeSApLm1vZCggMi4wICk7XHJcblxyXG5cdHJldHVybiByZXN1bHQuc2lnbigpO1xyXG5cclxufSApO1xyXG4iLCJpbXBvcnQgeyBGbiwgZmxvYXQgfSBmcm9tICcuLi90c2wvVFNMQmFzZS5qcyc7XHJcbmltcG9ydCB7IGxlbmd0aFNxLCBzbW9vdGhzdGVwIH0gZnJvbSAnLi4vbWF0aC9NYXRoTm9kZS5qcyc7XHJcbmltcG9ydCB7IHV2IH0gZnJvbSAnLi4vYWNjZXNzb3JzL1VWLmpzJztcclxuXHJcbi8qKlxyXG4gKiBHZW5lcmF0ZXMgYSBjaXJjbGUgYmFzZWQgb24gdGhlIHV2IGNvb3JkaW5hdGVzLlxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGU8dmVjMj59IGNvb3JkIC0gVGhlIHV2IHRvIGdlbmVyYXRlIHRoZSBjaXJjbGUuXHJcbiAqIEByZXR1cm4ge05vZGU8ZmxvYXQ+fSBUaGUgY2lyY2xlIHNoYXBlLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHNoYXBlQ2lyY2xlID0gRm4oICggWyBjb29yZCA9IHV2KCkgXSwgeyByZW5kZXJlciwgbWF0ZXJpYWwgfSApID0+IHtcclxuXHJcblx0Y29uc3QgYWxwaGEgPSBmbG9hdCggMSApLnRvVmFyKCk7XHJcblx0Y29uc3QgbGVuMiA9IGxlbmd0aFNxKCBjb29yZC5tdWwoIDIgKS5zdWIoIDEgKSApO1xyXG5cclxuXHRpZiAoIG1hdGVyaWFsLmFscGhhVG9Db3ZlcmFnZSAmJiByZW5kZXJlci5zYW1wbGVzID4gMSApIHtcclxuXHJcblx0XHRjb25zdCBkbGVuID0gZmxvYXQoIGxlbjIuZndpZHRoKCkgKS50b1ZhcigpO1xyXG5cclxuXHRcdGFscGhhLmFzc2lnbiggc21vb3Roc3RlcCggZGxlbi5vbmVNaW51cygpLCBkbGVuLmFkZCggMSApLCBsZW4yICkub25lTWludXMoKSApO1xyXG5cclxuXHR9IGVsc2Uge1xyXG5cclxuXHRcdGxlbjIuZ3JlYXRlclRoYW4oIDEuMCApLmRpc2NhcmQoKTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gYWxwaGE7XHJcblxyXG59ICk7XHJcbiIsIi8vIFRocmVlLmpzIFRyYW5zcGlsZXJcclxuLy8gaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL0FjYWRlbXlTb2Z0d2FyZUZvdW5kYXRpb24vTWF0ZXJpYWxYL21haW4vbGlicmFyaWVzL3N0ZGxpYi9nZW5nbHNsL2xpYi9teF9ub2lzZS5nbHNsXHJcblxyXG5pbXBvcnQgeyBpbnQsIHVpbnQsIGZsb2F0LCB2ZWMzLCBib29sLCB1dmVjMywgdmVjMiwgdmVjNCwgSWYsIEZuIH0gZnJvbSAnLi4vLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5pbXBvcnQgeyBzZWxlY3QgfSBmcm9tICcuLi8uLi9tYXRoL0NvbmRpdGlvbmFsTm9kZS5qcyc7XHJcbmltcG9ydCB7IHN1YiwgbXVsIH0gZnJvbSAnLi4vLi4vbWF0aC9PcGVyYXRvck5vZGUuanMnO1xyXG5pbXBvcnQgeyBmbG9vciwgYWJzLCBtYXgsIGRvdCwgbWluLCBzcXJ0IH0gZnJvbSAnLi4vLi4vbWF0aC9NYXRoTm9kZS5qcyc7XHJcbmltcG9ydCB7IG92ZXJsb2FkaW5nRm4gfSBmcm9tICcuLi8uLi91dGlscy9GdW5jdGlvbk92ZXJsb2FkaW5nTm9kZS5qcyc7XHJcbmltcG9ydCB7IExvb3AgfSBmcm9tICcuLi8uLi91dGlscy9Mb29wTm9kZS5qcyc7XHJcblxyXG5cclxuZXhwb3J0IGNvbnN0IG14X3NlbGVjdCA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyBiX2ltbXV0YWJsZSwgdF9pbW11dGFibGUsIGZfaW1tdXRhYmxlIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IGYgPSBmbG9hdCggZl9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHQgPSBmbG9hdCggdF9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IGIgPSBib29sKCBiX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblxyXG5cdHJldHVybiBzZWxlY3QoIGIsIHQsIGYgKTtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnbXhfc2VsZWN0JyxcclxuXHR0eXBlOiAnZmxvYXQnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAnYicsIHR5cGU6ICdib29sJyB9LFxyXG5cdFx0eyBuYW1lOiAndCcsIHR5cGU6ICdmbG9hdCcgfSxcclxuXHRcdHsgbmFtZTogJ2YnLCB0eXBlOiAnZmxvYXQnIH1cclxuXHRdXHJcbn0gKTtcclxuXHJcbmV4cG9ydCBjb25zdCBteF9uZWdhdGVfaWYgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgdmFsX2ltbXV0YWJsZSwgYl9pbW11dGFibGUgXSApID0+IHtcclxuXHJcblx0Y29uc3QgYiA9IGJvb2woIGJfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCB2YWwgPSBmbG9hdCggdmFsX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblxyXG5cdHJldHVybiBzZWxlY3QoIGIsIHZhbC5uZWdhdGUoKSwgdmFsICk7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ214X25lZ2F0ZV9pZicsXHJcblx0dHlwZTogJ2Zsb2F0JyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ3ZhbCcsIHR5cGU6ICdmbG9hdCcgfSxcclxuXHRcdHsgbmFtZTogJ2InLCB0eXBlOiAnYm9vbCcgfVxyXG5cdF1cclxufSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X2Zsb29yID0gLypAX19QVVJFX18qLyBGbiggKCBbIHhfaW1tdXRhYmxlIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IHggPSBmbG9hdCggeF9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cclxuXHRyZXR1cm4gaW50KCBmbG9vciggeCApICk7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ214X2Zsb29yJyxcclxuXHR0eXBlOiAnaW50JyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ3gnLCB0eXBlOiAnZmxvYXQnIH1cclxuXHRdXHJcbn0gKTtcclxuXHJcbmV4cG9ydCBjb25zdCBteF9mbG9vcmZyYWMgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgeF9pbW11dGFibGUsIGkgXSApID0+IHtcclxuXHJcblx0Y29uc3QgeCA9IGZsb2F0KCB4X2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0aS5hc3NpZ24oIG14X2Zsb29yKCB4ICkgKTtcclxuXHJcblx0cmV0dXJuIHguc3ViKCBmbG9hdCggaSApICk7XHJcblxyXG59ICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfYmlsZXJwXzAgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgdjBfaW1tdXRhYmxlLCB2MV9pbW11dGFibGUsIHYyX2ltbXV0YWJsZSwgdjNfaW1tdXRhYmxlLCBzX2ltbXV0YWJsZSwgdF9pbW11dGFibGUgXSApID0+IHtcclxuXHJcblx0Y29uc3QgdCA9IGZsb2F0KCB0X2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgcyA9IGZsb2F0KCBzX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgdjMgPSBmbG9hdCggdjNfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCB2MiA9IGZsb2F0KCB2Ml9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHYxID0gZmxvYXQoIHYxX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgdjAgPSBmbG9hdCggdjBfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBzMSA9IGZsb2F0KCBzdWIoIDEuMCwgcyApICkudG9WYXIoKTtcclxuXHJcblx0cmV0dXJuIHN1YiggMS4wLCB0ICkubXVsKCB2MC5tdWwoIHMxICkuYWRkKCB2MS5tdWwoIHMgKSApICkuYWRkKCB0Lm11bCggdjIubXVsKCBzMSApLmFkZCggdjMubXVsKCBzICkgKSApICk7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ214X2JpbGVycF8wJyxcclxuXHR0eXBlOiAnZmxvYXQnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAndjAnLCB0eXBlOiAnZmxvYXQnIH0sXHJcblx0XHR7IG5hbWU6ICd2MScsIHR5cGU6ICdmbG9hdCcgfSxcclxuXHRcdHsgbmFtZTogJ3YyJywgdHlwZTogJ2Zsb2F0JyB9LFxyXG5cdFx0eyBuYW1lOiAndjMnLCB0eXBlOiAnZmxvYXQnIH0sXHJcblx0XHR7IG5hbWU6ICdzJywgdHlwZTogJ2Zsb2F0JyB9LFxyXG5cdFx0eyBuYW1lOiAndCcsIHR5cGU6ICdmbG9hdCcgfVxyXG5cdF1cclxufSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X2JpbGVycF8xID0gLypAX19QVVJFX18qLyBGbiggKCBbIHYwX2ltbXV0YWJsZSwgdjFfaW1tdXRhYmxlLCB2Ml9pbW11dGFibGUsIHYzX2ltbXV0YWJsZSwgc19pbW11dGFibGUsIHRfaW1tdXRhYmxlIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IHQgPSBmbG9hdCggdF9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHMgPSBmbG9hdCggc19pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHYzID0gdmVjMyggdjNfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCB2MiA9IHZlYzMoIHYyX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgdjEgPSB2ZWMzKCB2MV9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHYwID0gdmVjMyggdjBfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBzMSA9IGZsb2F0KCBzdWIoIDEuMCwgcyApICkudG9WYXIoKTtcclxuXHJcblx0cmV0dXJuIHN1YiggMS4wLCB0ICkubXVsKCB2MC5tdWwoIHMxICkuYWRkKCB2MS5tdWwoIHMgKSApICkuYWRkKCB0Lm11bCggdjIubXVsKCBzMSApLmFkZCggdjMubXVsKCBzICkgKSApICk7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ214X2JpbGVycF8xJyxcclxuXHR0eXBlOiAndmVjMycsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICd2MCcsIHR5cGU6ICd2ZWMzJyB9LFxyXG5cdFx0eyBuYW1lOiAndjEnLCB0eXBlOiAndmVjMycgfSxcclxuXHRcdHsgbmFtZTogJ3YyJywgdHlwZTogJ3ZlYzMnIH0sXHJcblx0XHR7IG5hbWU6ICd2MycsIHR5cGU6ICd2ZWMzJyB9LFxyXG5cdFx0eyBuYW1lOiAncycsIHR5cGU6ICdmbG9hdCcgfSxcclxuXHRcdHsgbmFtZTogJ3QnLCB0eXBlOiAnZmxvYXQnIH1cclxuXHRdXHJcbn0gKTtcclxuXHJcbmV4cG9ydCBjb25zdCBteF9iaWxlcnAgPSAvKkBfX1BVUkVfXyovIG92ZXJsb2FkaW5nRm4oIFsgbXhfYmlsZXJwXzAsIG14X2JpbGVycF8xIF0gKTtcclxuXHJcbmV4cG9ydCBjb25zdCBteF90cmlsZXJwXzAgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgdjBfaW1tdXRhYmxlLCB2MV9pbW11dGFibGUsIHYyX2ltbXV0YWJsZSwgdjNfaW1tdXRhYmxlLCB2NF9pbW11dGFibGUsIHY1X2ltbXV0YWJsZSwgdjZfaW1tdXRhYmxlLCB2N19pbW11dGFibGUsIHNfaW1tdXRhYmxlLCB0X2ltbXV0YWJsZSwgcl9pbW11dGFibGUgXSApID0+IHtcclxuXHJcblx0Y29uc3QgciA9IGZsb2F0KCByX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgdCA9IGZsb2F0KCB0X2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgcyA9IGZsb2F0KCBzX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgdjcgPSBmbG9hdCggdjdfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCB2NiA9IGZsb2F0KCB2Nl9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHY1ID0gZmxvYXQoIHY1X2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgdjQgPSBmbG9hdCggdjRfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCB2MyA9IGZsb2F0KCB2M19pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHYyID0gZmxvYXQoIHYyX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgdjEgPSBmbG9hdCggdjFfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCB2MCA9IGZsb2F0KCB2MF9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHMxID0gZmxvYXQoIHN1YiggMS4wLCBzICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHQxID0gZmxvYXQoIHN1YiggMS4wLCB0ICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHIxID0gZmxvYXQoIHN1YiggMS4wLCByICkgKS50b1ZhcigpO1xyXG5cclxuXHRyZXR1cm4gcjEubXVsKCB0MS5tdWwoIHYwLm11bCggczEgKS5hZGQoIHYxLm11bCggcyApICkgKS5hZGQoIHQubXVsKCB2Mi5tdWwoIHMxICkuYWRkKCB2My5tdWwoIHMgKSApICkgKSApLmFkZCggci5tdWwoIHQxLm11bCggdjQubXVsKCBzMSApLmFkZCggdjUubXVsKCBzICkgKSApLmFkZCggdC5tdWwoIHY2Lm11bCggczEgKS5hZGQoIHY3Lm11bCggcyApICkgKSApICkgKTtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnbXhfdHJpbGVycF8wJyxcclxuXHR0eXBlOiAnZmxvYXQnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAndjAnLCB0eXBlOiAnZmxvYXQnIH0sXHJcblx0XHR7IG5hbWU6ICd2MScsIHR5cGU6ICdmbG9hdCcgfSxcclxuXHRcdHsgbmFtZTogJ3YyJywgdHlwZTogJ2Zsb2F0JyB9LFxyXG5cdFx0eyBuYW1lOiAndjMnLCB0eXBlOiAnZmxvYXQnIH0sXHJcblx0XHR7IG5hbWU6ICd2NCcsIHR5cGU6ICdmbG9hdCcgfSxcclxuXHRcdHsgbmFtZTogJ3Y1JywgdHlwZTogJ2Zsb2F0JyB9LFxyXG5cdFx0eyBuYW1lOiAndjYnLCB0eXBlOiAnZmxvYXQnIH0sXHJcblx0XHR7IG5hbWU6ICd2NycsIHR5cGU6ICdmbG9hdCcgfSxcclxuXHRcdHsgbmFtZTogJ3MnLCB0eXBlOiAnZmxvYXQnIH0sXHJcblx0XHR7IG5hbWU6ICd0JywgdHlwZTogJ2Zsb2F0JyB9LFxyXG5cdFx0eyBuYW1lOiAncicsIHR5cGU6ICdmbG9hdCcgfVxyXG5cdF1cclxufSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X3RyaWxlcnBfMSA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyB2MF9pbW11dGFibGUsIHYxX2ltbXV0YWJsZSwgdjJfaW1tdXRhYmxlLCB2M19pbW11dGFibGUsIHY0X2ltbXV0YWJsZSwgdjVfaW1tdXRhYmxlLCB2Nl9pbW11dGFibGUsIHY3X2ltbXV0YWJsZSwgc19pbW11dGFibGUsIHRfaW1tdXRhYmxlLCByX2ltbXV0YWJsZSBdICkgPT4ge1xyXG5cclxuXHRjb25zdCByID0gZmxvYXQoIHJfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCB0ID0gZmxvYXQoIHRfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBzID0gZmxvYXQoIHNfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCB2NyA9IHZlYzMoIHY3X2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgdjYgPSB2ZWMzKCB2Nl9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHY1ID0gdmVjMyggdjVfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCB2NCA9IHZlYzMoIHY0X2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgdjMgPSB2ZWMzKCB2M19pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHYyID0gdmVjMyggdjJfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCB2MSA9IHZlYzMoIHYxX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgdjAgPSB2ZWMzKCB2MF9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHMxID0gZmxvYXQoIHN1YiggMS4wLCBzICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHQxID0gZmxvYXQoIHN1YiggMS4wLCB0ICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHIxID0gZmxvYXQoIHN1YiggMS4wLCByICkgKS50b1ZhcigpO1xyXG5cclxuXHRyZXR1cm4gcjEubXVsKCB0MS5tdWwoIHYwLm11bCggczEgKS5hZGQoIHYxLm11bCggcyApICkgKS5hZGQoIHQubXVsKCB2Mi5tdWwoIHMxICkuYWRkKCB2My5tdWwoIHMgKSApICkgKSApLmFkZCggci5tdWwoIHQxLm11bCggdjQubXVsKCBzMSApLmFkZCggdjUubXVsKCBzICkgKSApLmFkZCggdC5tdWwoIHY2Lm11bCggczEgKS5hZGQoIHY3Lm11bCggcyApICkgKSApICkgKTtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnbXhfdHJpbGVycF8xJyxcclxuXHR0eXBlOiAndmVjMycsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICd2MCcsIHR5cGU6ICd2ZWMzJyB9LFxyXG5cdFx0eyBuYW1lOiAndjEnLCB0eXBlOiAndmVjMycgfSxcclxuXHRcdHsgbmFtZTogJ3YyJywgdHlwZTogJ3ZlYzMnIH0sXHJcblx0XHR7IG5hbWU6ICd2MycsIHR5cGU6ICd2ZWMzJyB9LFxyXG5cdFx0eyBuYW1lOiAndjQnLCB0eXBlOiAndmVjMycgfSxcclxuXHRcdHsgbmFtZTogJ3Y1JywgdHlwZTogJ3ZlYzMnIH0sXHJcblx0XHR7IG5hbWU6ICd2NicsIHR5cGU6ICd2ZWMzJyB9LFxyXG5cdFx0eyBuYW1lOiAndjcnLCB0eXBlOiAndmVjMycgfSxcclxuXHRcdHsgbmFtZTogJ3MnLCB0eXBlOiAnZmxvYXQnIH0sXHJcblx0XHR7IG5hbWU6ICd0JywgdHlwZTogJ2Zsb2F0JyB9LFxyXG5cdFx0eyBuYW1lOiAncicsIHR5cGU6ICdmbG9hdCcgfVxyXG5cdF1cclxufSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X3RyaWxlcnAgPSAvKkBfX1BVUkVfXyovIG92ZXJsb2FkaW5nRm4oIFsgbXhfdHJpbGVycF8wLCBteF90cmlsZXJwXzEgXSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X2dyYWRpZW50X2Zsb2F0XzAgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgaGFzaF9pbW11dGFibGUsIHhfaW1tdXRhYmxlLCB5X2ltbXV0YWJsZSBdICkgPT4ge1xyXG5cclxuXHRjb25zdCB5ID0gZmxvYXQoIHlfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCB4ID0gZmxvYXQoIHhfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBoYXNoID0gdWludCggaGFzaF9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IGggPSB1aW50KCBoYXNoLmJpdEFuZCggdWludCggNyApICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHUgPSBmbG9hdCggbXhfc2VsZWN0KCBoLmxlc3NUaGFuKCB1aW50KCA0ICkgKSwgeCwgeSApICkudG9WYXIoKTtcclxuXHRjb25zdCB2ID0gZmxvYXQoIG11bCggMi4wLCBteF9zZWxlY3QoIGgubGVzc1RoYW4oIHVpbnQoIDQgKSApLCB5LCB4ICkgKSApLnRvVmFyKCk7XHJcblxyXG5cdHJldHVybiBteF9uZWdhdGVfaWYoIHUsIGJvb2woIGguYml0QW5kKCB1aW50KCAxICkgKSApICkuYWRkKCBteF9uZWdhdGVfaWYoIHYsIGJvb2woIGguYml0QW5kKCB1aW50KCAyICkgKSApICkgKTtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnbXhfZ3JhZGllbnRfZmxvYXRfMCcsXHJcblx0dHlwZTogJ2Zsb2F0JyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ2hhc2gnLCB0eXBlOiAndWludCcgfSxcclxuXHRcdHsgbmFtZTogJ3gnLCB0eXBlOiAnZmxvYXQnIH0sXHJcblx0XHR7IG5hbWU6ICd5JywgdHlwZTogJ2Zsb2F0JyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfZ3JhZGllbnRfZmxvYXRfMSA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyBoYXNoX2ltbXV0YWJsZSwgeF9pbW11dGFibGUsIHlfaW1tdXRhYmxlLCB6X2ltbXV0YWJsZSBdICkgPT4ge1xyXG5cclxuXHRjb25zdCB6ID0gZmxvYXQoIHpfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCB5ID0gZmxvYXQoIHlfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCB4ID0gZmxvYXQoIHhfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBoYXNoID0gdWludCggaGFzaF9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IGggPSB1aW50KCBoYXNoLmJpdEFuZCggdWludCggMTUgKSApICkudG9WYXIoKTtcclxuXHRjb25zdCB1ID0gZmxvYXQoIG14X3NlbGVjdCggaC5sZXNzVGhhbiggdWludCggOCApICksIHgsIHkgKSApLnRvVmFyKCk7XHJcblx0Y29uc3QgdiA9IGZsb2F0KCBteF9zZWxlY3QoIGgubGVzc1RoYW4oIHVpbnQoIDQgKSApLCB5LCBteF9zZWxlY3QoIGguZXF1YWwoIHVpbnQoIDEyICkgKS5vciggaC5lcXVhbCggdWludCggMTQgKSApICksIHgsIHogKSApICkudG9WYXIoKTtcclxuXHJcblx0cmV0dXJuIG14X25lZ2F0ZV9pZiggdSwgYm9vbCggaC5iaXRBbmQoIHVpbnQoIDEgKSApICkgKS5hZGQoIG14X25lZ2F0ZV9pZiggdiwgYm9vbCggaC5iaXRBbmQoIHVpbnQoIDIgKSApICkgKSApO1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdteF9ncmFkaWVudF9mbG9hdF8xJyxcclxuXHR0eXBlOiAnZmxvYXQnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAnaGFzaCcsIHR5cGU6ICd1aW50JyB9LFxyXG5cdFx0eyBuYW1lOiAneCcsIHR5cGU6ICdmbG9hdCcgfSxcclxuXHRcdHsgbmFtZTogJ3knLCB0eXBlOiAnZmxvYXQnIH0sXHJcblx0XHR7IG5hbWU6ICd6JywgdHlwZTogJ2Zsb2F0JyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfZ3JhZGllbnRfZmxvYXQgPSAvKkBfX1BVUkVfXyovIG92ZXJsb2FkaW5nRm4oIFsgbXhfZ3JhZGllbnRfZmxvYXRfMCwgbXhfZ3JhZGllbnRfZmxvYXRfMSBdICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfZ3JhZGllbnRfdmVjM18wID0gLypAX19QVVJFX18qLyBGbiggKCBbIGhhc2hfaW1tdXRhYmxlLCB4X2ltbXV0YWJsZSwgeV9pbW11dGFibGUgXSApID0+IHtcclxuXHJcblx0Y29uc3QgeSA9IGZsb2F0KCB5X2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgeCA9IGZsb2F0KCB4X2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgaGFzaCA9IHV2ZWMzKCBoYXNoX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblxyXG5cdHJldHVybiB2ZWMzKCBteF9ncmFkaWVudF9mbG9hdCggaGFzaC54LCB4LCB5ICksIG14X2dyYWRpZW50X2Zsb2F0KCBoYXNoLnksIHgsIHkgKSwgbXhfZ3JhZGllbnRfZmxvYXQoIGhhc2gueiwgeCwgeSApICk7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ214X2dyYWRpZW50X3ZlYzNfMCcsXHJcblx0dHlwZTogJ3ZlYzMnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAnaGFzaCcsIHR5cGU6ICd1dmVjMycgfSxcclxuXHRcdHsgbmFtZTogJ3gnLCB0eXBlOiAnZmxvYXQnIH0sXHJcblx0XHR7IG5hbWU6ICd5JywgdHlwZTogJ2Zsb2F0JyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfZ3JhZGllbnRfdmVjM18xID0gLypAX19QVVJFX18qLyBGbiggKCBbIGhhc2hfaW1tdXRhYmxlLCB4X2ltbXV0YWJsZSwgeV9pbW11dGFibGUsIHpfaW1tdXRhYmxlIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IHogPSBmbG9hdCggel9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHkgPSBmbG9hdCggeV9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHggPSBmbG9hdCggeF9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IGhhc2ggPSB1dmVjMyggaGFzaF9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cclxuXHRyZXR1cm4gdmVjMyggbXhfZ3JhZGllbnRfZmxvYXQoIGhhc2gueCwgeCwgeSwgeiApLCBteF9ncmFkaWVudF9mbG9hdCggaGFzaC55LCB4LCB5LCB6ICksIG14X2dyYWRpZW50X2Zsb2F0KCBoYXNoLnosIHgsIHksIHogKSApO1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdteF9ncmFkaWVudF92ZWMzXzEnLFxyXG5cdHR5cGU6ICd2ZWMzJyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ2hhc2gnLCB0eXBlOiAndXZlYzMnIH0sXHJcblx0XHR7IG5hbWU6ICd4JywgdHlwZTogJ2Zsb2F0JyB9LFxyXG5cdFx0eyBuYW1lOiAneScsIHR5cGU6ICdmbG9hdCcgfSxcclxuXHRcdHsgbmFtZTogJ3onLCB0eXBlOiAnZmxvYXQnIH1cclxuXHRdXHJcbn0gKTtcclxuXHJcbmV4cG9ydCBjb25zdCBteF9ncmFkaWVudF92ZWMzID0gLypAX19QVVJFX18qLyBvdmVybG9hZGluZ0ZuKCBbIG14X2dyYWRpZW50X3ZlYzNfMCwgbXhfZ3JhZGllbnRfdmVjM18xIF0gKTtcclxuXHJcbmV4cG9ydCBjb25zdCBteF9ncmFkaWVudF9zY2FsZTJkXzAgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgdl9pbW11dGFibGUgXSApID0+IHtcclxuXHJcblx0Y29uc3QgdiA9IGZsb2F0KCB2X2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblxyXG5cdHJldHVybiBtdWwoIDAuNjYxNiwgdiApO1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdteF9ncmFkaWVudF9zY2FsZTJkXzAnLFxyXG5cdHR5cGU6ICdmbG9hdCcsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICd2JywgdHlwZTogJ2Zsb2F0JyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfZ3JhZGllbnRfc2NhbGUzZF8wID0gLypAX19QVVJFX18qLyBGbiggKCBbIHZfaW1tdXRhYmxlIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IHYgPSBmbG9hdCggdl9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cclxuXHRyZXR1cm4gbXVsKCAwLjk4MjAsIHYgKTtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnbXhfZ3JhZGllbnRfc2NhbGUzZF8wJyxcclxuXHR0eXBlOiAnZmxvYXQnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAndicsIHR5cGU6ICdmbG9hdCcgfVxyXG5cdF1cclxufSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X2dyYWRpZW50X3NjYWxlMmRfMSA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyB2X2ltbXV0YWJsZSBdICkgPT4ge1xyXG5cclxuXHRjb25zdCB2ID0gdmVjMyggdl9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cclxuXHRyZXR1cm4gbXVsKCAwLjY2MTYsIHYgKTtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnbXhfZ3JhZGllbnRfc2NhbGUyZF8xJyxcclxuXHR0eXBlOiAndmVjMycsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICd2JywgdHlwZTogJ3ZlYzMnIH1cclxuXHRdXHJcbn0gKTtcclxuXHJcbmV4cG9ydCBjb25zdCBteF9ncmFkaWVudF9zY2FsZTJkID0gLypAX19QVVJFX18qLyBvdmVybG9hZGluZ0ZuKCBbIG14X2dyYWRpZW50X3NjYWxlMmRfMCwgbXhfZ3JhZGllbnRfc2NhbGUyZF8xIF0gKTtcclxuXHJcbmV4cG9ydCBjb25zdCBteF9ncmFkaWVudF9zY2FsZTNkXzEgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgdl9pbW11dGFibGUgXSApID0+IHtcclxuXHJcblx0Y29uc3QgdiA9IHZlYzMoIHZfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHJcblx0cmV0dXJuIG11bCggMC45ODIwLCB2ICk7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ214X2dyYWRpZW50X3NjYWxlM2RfMScsXHJcblx0dHlwZTogJ3ZlYzMnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAndicsIHR5cGU6ICd2ZWMzJyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfZ3JhZGllbnRfc2NhbGUzZCA9IC8qQF9fUFVSRV9fKi8gb3ZlcmxvYWRpbmdGbiggWyBteF9ncmFkaWVudF9zY2FsZTNkXzAsIG14X2dyYWRpZW50X3NjYWxlM2RfMSBdICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfcm90bDMyID0gLypAX19QVVJFX18qLyBGbiggKCBbIHhfaW1tdXRhYmxlLCBrX2ltbXV0YWJsZSBdICkgPT4ge1xyXG5cclxuXHRjb25zdCBrID0gaW50KCBrX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgeCA9IHVpbnQoIHhfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHJcblx0cmV0dXJuIHguc2hpZnRMZWZ0KCBrICkuYml0T3IoIHguc2hpZnRSaWdodCggaW50KCAzMiApLnN1YiggayApICkgKTtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnbXhfcm90bDMyJyxcclxuXHR0eXBlOiAndWludCcsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICd4JywgdHlwZTogJ3VpbnQnIH0sXHJcblx0XHR7IG5hbWU6ICdrJywgdHlwZTogJ2ludCcgfVxyXG5cdF1cclxufSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X2JqbWl4ID0gLypAX19QVVJFX18qLyBGbiggKCBbIGEsIGIsIGMgXSApID0+IHtcclxuXHJcblx0YS5zdWJBc3NpZ24oIGMgKTtcclxuXHRhLmJpdFhvckFzc2lnbiggbXhfcm90bDMyKCBjLCBpbnQoIDQgKSApICk7XHJcblx0Yy5hZGRBc3NpZ24oIGIgKTtcclxuXHRiLnN1YkFzc2lnbiggYSApO1xyXG5cdGIuYml0WG9yQXNzaWduKCBteF9yb3RsMzIoIGEsIGludCggNiApICkgKTtcclxuXHRhLmFkZEFzc2lnbiggYyApO1xyXG5cdGMuc3ViQXNzaWduKCBiICk7XHJcblx0Yy5iaXRYb3JBc3NpZ24oIG14X3JvdGwzMiggYiwgaW50KCA4ICkgKSApO1xyXG5cdGIuYWRkQXNzaWduKCBhICk7XHJcblx0YS5zdWJBc3NpZ24oIGMgKTtcclxuXHRhLmJpdFhvckFzc2lnbiggbXhfcm90bDMyKCBjLCBpbnQoIDE2ICkgKSApO1xyXG5cdGMuYWRkQXNzaWduKCBiICk7XHJcblx0Yi5zdWJBc3NpZ24oIGEgKTtcclxuXHRiLmJpdFhvckFzc2lnbiggbXhfcm90bDMyKCBhLCBpbnQoIDE5ICkgKSApO1xyXG5cdGEuYWRkQXNzaWduKCBjICk7XHJcblx0Yy5zdWJBc3NpZ24oIGIgKTtcclxuXHRjLmJpdFhvckFzc2lnbiggbXhfcm90bDMyKCBiLCBpbnQoIDQgKSApICk7XHJcblx0Yi5hZGRBc3NpZ24oIGEgKTtcclxuXHJcbn0gKTtcclxuXHJcbmV4cG9ydCBjb25zdCBteF9iamZpbmFsID0gLypAX19QVVJFX18qLyBGbiggKCBbIGFfaW1tdXRhYmxlLCBiX2ltbXV0YWJsZSwgY19pbW11dGFibGUgXSApID0+IHtcclxuXHJcblx0Y29uc3QgYyA9IHVpbnQoIGNfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBiID0gdWludCggYl9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IGEgPSB1aW50KCBhX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Yy5iaXRYb3JBc3NpZ24oIGIgKTtcclxuXHRjLnN1YkFzc2lnbiggbXhfcm90bDMyKCBiLCBpbnQoIDE0ICkgKSApO1xyXG5cdGEuYml0WG9yQXNzaWduKCBjICk7XHJcblx0YS5zdWJBc3NpZ24oIG14X3JvdGwzMiggYywgaW50KCAxMSApICkgKTtcclxuXHRiLmJpdFhvckFzc2lnbiggYSApO1xyXG5cdGIuc3ViQXNzaWduKCBteF9yb3RsMzIoIGEsIGludCggMjUgKSApICk7XHJcblx0Yy5iaXRYb3JBc3NpZ24oIGIgKTtcclxuXHRjLnN1YkFzc2lnbiggbXhfcm90bDMyKCBiLCBpbnQoIDE2ICkgKSApO1xyXG5cdGEuYml0WG9yQXNzaWduKCBjICk7XHJcblx0YS5zdWJBc3NpZ24oIG14X3JvdGwzMiggYywgaW50KCA0ICkgKSApO1xyXG5cdGIuYml0WG9yQXNzaWduKCBhICk7XHJcblx0Yi5zdWJBc3NpZ24oIG14X3JvdGwzMiggYSwgaW50KCAxNCApICkgKTtcclxuXHRjLmJpdFhvckFzc2lnbiggYiApO1xyXG5cdGMuc3ViQXNzaWduKCBteF9yb3RsMzIoIGIsIGludCggMjQgKSApICk7XHJcblxyXG5cdHJldHVybiBjO1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdteF9iamZpbmFsJyxcclxuXHR0eXBlOiAndWludCcsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICdhJywgdHlwZTogJ3VpbnQnIH0sXHJcblx0XHR7IG5hbWU6ICdiJywgdHlwZTogJ3VpbnQnIH0sXHJcblx0XHR7IG5hbWU6ICdjJywgdHlwZTogJ3VpbnQnIH1cclxuXHRdXHJcbn0gKTtcclxuXHJcbmV4cG9ydCBjb25zdCBteF9iaXRzX3RvXzAxID0gLypAX19QVVJFX18qLyBGbiggKCBbIGJpdHNfaW1tdXRhYmxlIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IGJpdHMgPSB1aW50KCBiaXRzX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblxyXG5cdHJldHVybiBmbG9hdCggYml0cyApLmRpdiggZmxvYXQoIHVpbnQoIGludCggMHhmZmZmZmZmZiApICkgKSApO1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdteF9iaXRzX3RvXzAxJyxcclxuXHR0eXBlOiAnZmxvYXQnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAnYml0cycsIHR5cGU6ICd1aW50JyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfZmFkZSA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyB0X2ltbXV0YWJsZSBdICkgPT4ge1xyXG5cclxuXHRjb25zdCB0ID0gZmxvYXQoIHRfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHJcblx0cmV0dXJuIHQubXVsKCB0ICkubXVsKCB0ICkubXVsKCB0Lm11bCggdC5tdWwoIDYuMCApLnN1YiggMTUuMCApICkuYWRkKCAxMC4wICkgKTtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnbXhfZmFkZScsXHJcblx0dHlwZTogJ2Zsb2F0JyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ3QnLCB0eXBlOiAnZmxvYXQnIH1cclxuXHRdXHJcbn0gKTtcclxuXHJcbmV4cG9ydCBjb25zdCBteF9oYXNoX2ludF8wID0gLypAX19QVVJFX18qLyBGbiggKCBbIHhfaW1tdXRhYmxlIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IHggPSBpbnQoIHhfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBsZW4gPSB1aW50KCB1aW50KCAxICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHNlZWQgPSB1aW50KCB1aW50KCBpbnQoIDB4ZGVhZGJlZWYgKSApLmFkZCggbGVuLnNoaWZ0TGVmdCggdWludCggMiApICkgKS5hZGQoIHVpbnQoIDEzICkgKSApLnRvVmFyKCk7XHJcblxyXG5cdHJldHVybiBteF9iamZpbmFsKCBzZWVkLmFkZCggdWludCggeCApICksIHNlZWQsIHNlZWQgKTtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnbXhfaGFzaF9pbnRfMCcsXHJcblx0dHlwZTogJ3VpbnQnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAneCcsIHR5cGU6ICdpbnQnIH1cclxuXHRdXHJcbn0gKTtcclxuXHJcbmV4cG9ydCBjb25zdCBteF9oYXNoX2ludF8xID0gLypAX19QVVJFX18qLyBGbiggKCBbIHhfaW1tdXRhYmxlLCB5X2ltbXV0YWJsZSBdICkgPT4ge1xyXG5cclxuXHRjb25zdCB5ID0gaW50KCB5X2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgeCA9IGludCggeF9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IGxlbiA9IHVpbnQoIHVpbnQoIDIgKSApLnRvVmFyKCk7XHJcblx0Y29uc3QgYSA9IHVpbnQoKS50b1ZhcigpLCBiID0gdWludCgpLnRvVmFyKCksIGMgPSB1aW50KCkudG9WYXIoKTtcclxuXHRhLmFzc2lnbiggYi5hc3NpZ24oIGMuYXNzaWduKCB1aW50KCBpbnQoIDB4ZGVhZGJlZWYgKSApLmFkZCggbGVuLnNoaWZ0TGVmdCggdWludCggMiApICkgKS5hZGQoIHVpbnQoIDEzICkgKSApICkgKTtcclxuXHRhLmFkZEFzc2lnbiggdWludCggeCApICk7XHJcblx0Yi5hZGRBc3NpZ24oIHVpbnQoIHkgKSApO1xyXG5cclxuXHRyZXR1cm4gbXhfYmpmaW5hbCggYSwgYiwgYyApO1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdteF9oYXNoX2ludF8xJyxcclxuXHR0eXBlOiAndWludCcsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICd4JywgdHlwZTogJ2ludCcgfSxcclxuXHRcdHsgbmFtZTogJ3knLCB0eXBlOiAnaW50JyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfaGFzaF9pbnRfMiA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyB4X2ltbXV0YWJsZSwgeV9pbW11dGFibGUsIHpfaW1tdXRhYmxlIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IHogPSBpbnQoIHpfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCB5ID0gaW50KCB5X2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgeCA9IGludCggeF9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IGxlbiA9IHVpbnQoIHVpbnQoIDMgKSApLnRvVmFyKCk7XHJcblx0Y29uc3QgYSA9IHVpbnQoKS50b1ZhcigpLCBiID0gdWludCgpLnRvVmFyKCksIGMgPSB1aW50KCkudG9WYXIoKTtcclxuXHRhLmFzc2lnbiggYi5hc3NpZ24oIGMuYXNzaWduKCB1aW50KCBpbnQoIDB4ZGVhZGJlZWYgKSApLmFkZCggbGVuLnNoaWZ0TGVmdCggdWludCggMiApICkgKS5hZGQoIHVpbnQoIDEzICkgKSApICkgKTtcclxuXHRhLmFkZEFzc2lnbiggdWludCggeCApICk7XHJcblx0Yi5hZGRBc3NpZ24oIHVpbnQoIHkgKSApO1xyXG5cdGMuYWRkQXNzaWduKCB1aW50KCB6ICkgKTtcclxuXHJcblx0cmV0dXJuIG14X2JqZmluYWwoIGEsIGIsIGMgKTtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnbXhfaGFzaF9pbnRfMicsXHJcblx0dHlwZTogJ3VpbnQnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAneCcsIHR5cGU6ICdpbnQnIH0sXHJcblx0XHR7IG5hbWU6ICd5JywgdHlwZTogJ2ludCcgfSxcclxuXHRcdHsgbmFtZTogJ3onLCB0eXBlOiAnaW50JyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfaGFzaF9pbnRfMyA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyB4X2ltbXV0YWJsZSwgeV9pbW11dGFibGUsIHpfaW1tdXRhYmxlLCB4eF9pbW11dGFibGUgXSApID0+IHtcclxuXHJcblx0Y29uc3QgeHggPSBpbnQoIHh4X2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgeiA9IGludCggel9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHkgPSBpbnQoIHlfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCB4ID0gaW50KCB4X2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgbGVuID0gdWludCggdWludCggNCApICkudG9WYXIoKTtcclxuXHRjb25zdCBhID0gdWludCgpLnRvVmFyKCksIGIgPSB1aW50KCkudG9WYXIoKSwgYyA9IHVpbnQoKS50b1ZhcigpO1xyXG5cdGEuYXNzaWduKCBiLmFzc2lnbiggYy5hc3NpZ24oIHVpbnQoIGludCggMHhkZWFkYmVlZiApICkuYWRkKCBsZW4uc2hpZnRMZWZ0KCB1aW50KCAyICkgKSApLmFkZCggdWludCggMTMgKSApICkgKSApO1xyXG5cdGEuYWRkQXNzaWduKCB1aW50KCB4ICkgKTtcclxuXHRiLmFkZEFzc2lnbiggdWludCggeSApICk7XHJcblx0Yy5hZGRBc3NpZ24oIHVpbnQoIHogKSApO1xyXG5cdG14X2JqbWl4KCBhLCBiLCBjICk7XHJcblx0YS5hZGRBc3NpZ24oIHVpbnQoIHh4ICkgKTtcclxuXHJcblx0cmV0dXJuIG14X2JqZmluYWwoIGEsIGIsIGMgKTtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnbXhfaGFzaF9pbnRfMycsXHJcblx0dHlwZTogJ3VpbnQnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAneCcsIHR5cGU6ICdpbnQnIH0sXHJcblx0XHR7IG5hbWU6ICd5JywgdHlwZTogJ2ludCcgfSxcclxuXHRcdHsgbmFtZTogJ3onLCB0eXBlOiAnaW50JyB9LFxyXG5cdFx0eyBuYW1lOiAneHgnLCB0eXBlOiAnaW50JyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfaGFzaF9pbnRfNCA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyB4X2ltbXV0YWJsZSwgeV9pbW11dGFibGUsIHpfaW1tdXRhYmxlLCB4eF9pbW11dGFibGUsIHl5X2ltbXV0YWJsZSBdICkgPT4ge1xyXG5cclxuXHRjb25zdCB5eSA9IGludCggeXlfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCB4eCA9IGludCggeHhfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCB6ID0gaW50KCB6X2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgeSA9IGludCggeV9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHggPSBpbnQoIHhfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBsZW4gPSB1aW50KCB1aW50KCA1ICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IGEgPSB1aW50KCkudG9WYXIoKSwgYiA9IHVpbnQoKS50b1ZhcigpLCBjID0gdWludCgpLnRvVmFyKCk7XHJcblx0YS5hc3NpZ24oIGIuYXNzaWduKCBjLmFzc2lnbiggdWludCggaW50KCAweGRlYWRiZWVmICkgKS5hZGQoIGxlbi5zaGlmdExlZnQoIHVpbnQoIDIgKSApICkuYWRkKCB1aW50KCAxMyApICkgKSApICk7XHJcblx0YS5hZGRBc3NpZ24oIHVpbnQoIHggKSApO1xyXG5cdGIuYWRkQXNzaWduKCB1aW50KCB5ICkgKTtcclxuXHRjLmFkZEFzc2lnbiggdWludCggeiApICk7XHJcblx0bXhfYmptaXgoIGEsIGIsIGMgKTtcclxuXHRhLmFkZEFzc2lnbiggdWludCggeHggKSApO1xyXG5cdGIuYWRkQXNzaWduKCB1aW50KCB5eSApICk7XHJcblxyXG5cdHJldHVybiBteF9iamZpbmFsKCBhLCBiLCBjICk7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ214X2hhc2hfaW50XzQnLFxyXG5cdHR5cGU6ICd1aW50JyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ3gnLCB0eXBlOiAnaW50JyB9LFxyXG5cdFx0eyBuYW1lOiAneScsIHR5cGU6ICdpbnQnIH0sXHJcblx0XHR7IG5hbWU6ICd6JywgdHlwZTogJ2ludCcgfSxcclxuXHRcdHsgbmFtZTogJ3h4JywgdHlwZTogJ2ludCcgfSxcclxuXHRcdHsgbmFtZTogJ3l5JywgdHlwZTogJ2ludCcgfVxyXG5cdF1cclxufSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X2hhc2hfaW50ID0gLypAX19QVVJFX18qLyBvdmVybG9hZGluZ0ZuKCBbIG14X2hhc2hfaW50XzAsIG14X2hhc2hfaW50XzEsIG14X2hhc2hfaW50XzIsIG14X2hhc2hfaW50XzMsIG14X2hhc2hfaW50XzQgXSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X2hhc2hfdmVjM18wID0gLypAX19QVVJFX18qLyBGbiggKCBbIHhfaW1tdXRhYmxlLCB5X2ltbXV0YWJsZSBdICkgPT4ge1xyXG5cclxuXHRjb25zdCB5ID0gaW50KCB5X2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgeCA9IGludCggeF9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IGggPSB1aW50KCBteF9oYXNoX2ludCggeCwgeSApICkudG9WYXIoKTtcclxuXHRjb25zdCByZXN1bHQgPSB1dmVjMygpLnRvVmFyKCk7XHJcblx0cmVzdWx0LnguYXNzaWduKCBoLmJpdEFuZCggaW50KCAweEZGICkgKSApO1xyXG5cdHJlc3VsdC55LmFzc2lnbiggaC5zaGlmdFJpZ2h0KCBpbnQoIDggKSApLmJpdEFuZCggaW50KCAweEZGICkgKSApO1xyXG5cdHJlc3VsdC56LmFzc2lnbiggaC5zaGlmdFJpZ2h0KCBpbnQoIDE2ICkgKS5iaXRBbmQoIGludCggMHhGRiApICkgKTtcclxuXHJcblx0cmV0dXJuIHJlc3VsdDtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnbXhfaGFzaF92ZWMzXzAnLFxyXG5cdHR5cGU6ICd1dmVjMycsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICd4JywgdHlwZTogJ2ludCcgfSxcclxuXHRcdHsgbmFtZTogJ3knLCB0eXBlOiAnaW50JyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfaGFzaF92ZWMzXzEgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgeF9pbW11dGFibGUsIHlfaW1tdXRhYmxlLCB6X2ltbXV0YWJsZSBdICkgPT4ge1xyXG5cclxuXHRjb25zdCB6ID0gaW50KCB6X2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgeSA9IGludCggeV9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHggPSBpbnQoIHhfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBoID0gdWludCggbXhfaGFzaF9pbnQoIHgsIHksIHogKSApLnRvVmFyKCk7XHJcblx0Y29uc3QgcmVzdWx0ID0gdXZlYzMoKS50b1ZhcigpO1xyXG5cdHJlc3VsdC54LmFzc2lnbiggaC5iaXRBbmQoIGludCggMHhGRiApICkgKTtcclxuXHRyZXN1bHQueS5hc3NpZ24oIGguc2hpZnRSaWdodCggaW50KCA4ICkgKS5iaXRBbmQoIGludCggMHhGRiApICkgKTtcclxuXHRyZXN1bHQuei5hc3NpZ24oIGguc2hpZnRSaWdodCggaW50KCAxNiApICkuYml0QW5kKCBpbnQoIDB4RkYgKSApICk7XHJcblxyXG5cdHJldHVybiByZXN1bHQ7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ214X2hhc2hfdmVjM18xJyxcclxuXHR0eXBlOiAndXZlYzMnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAneCcsIHR5cGU6ICdpbnQnIH0sXHJcblx0XHR7IG5hbWU6ICd5JywgdHlwZTogJ2ludCcgfSxcclxuXHRcdHsgbmFtZTogJ3onLCB0eXBlOiAnaW50JyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfaGFzaF92ZWMzID0gLypAX19QVVJFX18qLyBvdmVybG9hZGluZ0ZuKCBbIG14X2hhc2hfdmVjM18wLCBteF9oYXNoX3ZlYzNfMSBdICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfcGVybGluX25vaXNlX2Zsb2F0XzAgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgcF9pbW11dGFibGUgXSApID0+IHtcclxuXHJcblx0Y29uc3QgcCA9IHZlYzIoIHBfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBYID0gaW50KCkudG9WYXIoKSwgWSA9IGludCgpLnRvVmFyKCk7XHJcblx0Y29uc3QgZnggPSBmbG9hdCggbXhfZmxvb3JmcmFjKCBwLngsIFggKSApLnRvVmFyKCk7XHJcblx0Y29uc3QgZnkgPSBmbG9hdCggbXhfZmxvb3JmcmFjKCBwLnksIFkgKSApLnRvVmFyKCk7XHJcblx0Y29uc3QgdSA9IGZsb2F0KCBteF9mYWRlKCBmeCApICkudG9WYXIoKTtcclxuXHRjb25zdCB2ID0gZmxvYXQoIG14X2ZhZGUoIGZ5ICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHJlc3VsdCA9IGZsb2F0KCBteF9iaWxlcnAoIG14X2dyYWRpZW50X2Zsb2F0KCBteF9oYXNoX2ludCggWCwgWSApLCBmeCwgZnkgKSwgbXhfZ3JhZGllbnRfZmxvYXQoIG14X2hhc2hfaW50KCBYLmFkZCggaW50KCAxICkgKSwgWSApLCBmeC5zdWIoIDEuMCApLCBmeSApLCBteF9ncmFkaWVudF9mbG9hdCggbXhfaGFzaF9pbnQoIFgsIFkuYWRkKCBpbnQoIDEgKSApICksIGZ4LCBmeS5zdWIoIDEuMCApICksIG14X2dyYWRpZW50X2Zsb2F0KCBteF9oYXNoX2ludCggWC5hZGQoIGludCggMSApICksIFkuYWRkKCBpbnQoIDEgKSApICksIGZ4LnN1YiggMS4wICksIGZ5LnN1YiggMS4wICkgKSwgdSwgdiApICkudG9WYXIoKTtcclxuXHJcblx0cmV0dXJuIG14X2dyYWRpZW50X3NjYWxlMmQoIHJlc3VsdCApO1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdteF9wZXJsaW5fbm9pc2VfZmxvYXRfMCcsXHJcblx0dHlwZTogJ2Zsb2F0JyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ3AnLCB0eXBlOiAndmVjMicgfVxyXG5cdF1cclxufSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X3Blcmxpbl9ub2lzZV9mbG9hdF8xID0gLypAX19QVVJFX18qLyBGbiggKCBbIHBfaW1tdXRhYmxlIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IHAgPSB2ZWMzKCBwX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgWCA9IGludCgpLnRvVmFyKCksIFkgPSBpbnQoKS50b1ZhcigpLCBaID0gaW50KCkudG9WYXIoKTtcclxuXHRjb25zdCBmeCA9IGZsb2F0KCBteF9mbG9vcmZyYWMoIHAueCwgWCApICkudG9WYXIoKTtcclxuXHRjb25zdCBmeSA9IGZsb2F0KCBteF9mbG9vcmZyYWMoIHAueSwgWSApICkudG9WYXIoKTtcclxuXHRjb25zdCBmeiA9IGZsb2F0KCBteF9mbG9vcmZyYWMoIHAueiwgWiApICkudG9WYXIoKTtcclxuXHRjb25zdCB1ID0gZmxvYXQoIG14X2ZhZGUoIGZ4ICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHYgPSBmbG9hdCggbXhfZmFkZSggZnkgKSApLnRvVmFyKCk7XHJcblx0Y29uc3QgdyA9IGZsb2F0KCBteF9mYWRlKCBmeiApICkudG9WYXIoKTtcclxuXHRjb25zdCByZXN1bHQgPSBmbG9hdCggbXhfdHJpbGVycCggbXhfZ3JhZGllbnRfZmxvYXQoIG14X2hhc2hfaW50KCBYLCBZLCBaICksIGZ4LCBmeSwgZnogKSwgbXhfZ3JhZGllbnRfZmxvYXQoIG14X2hhc2hfaW50KCBYLmFkZCggaW50KCAxICkgKSwgWSwgWiApLCBmeC5zdWIoIDEuMCApLCBmeSwgZnogKSwgbXhfZ3JhZGllbnRfZmxvYXQoIG14X2hhc2hfaW50KCBYLCBZLmFkZCggaW50KCAxICkgKSwgWiApLCBmeCwgZnkuc3ViKCAxLjAgKSwgZnogKSwgbXhfZ3JhZGllbnRfZmxvYXQoIG14X2hhc2hfaW50KCBYLmFkZCggaW50KCAxICkgKSwgWS5hZGQoIGludCggMSApICksIFogKSwgZnguc3ViKCAxLjAgKSwgZnkuc3ViKCAxLjAgKSwgZnogKSwgbXhfZ3JhZGllbnRfZmxvYXQoIG14X2hhc2hfaW50KCBYLCBZLCBaLmFkZCggaW50KCAxICkgKSApLCBmeCwgZnksIGZ6LnN1YiggMS4wICkgKSwgbXhfZ3JhZGllbnRfZmxvYXQoIG14X2hhc2hfaW50KCBYLmFkZCggaW50KCAxICkgKSwgWSwgWi5hZGQoIGludCggMSApICkgKSwgZnguc3ViKCAxLjAgKSwgZnksIGZ6LnN1YiggMS4wICkgKSwgbXhfZ3JhZGllbnRfZmxvYXQoIG14X2hhc2hfaW50KCBYLCBZLmFkZCggaW50KCAxICkgKSwgWi5hZGQoIGludCggMSApICkgKSwgZngsIGZ5LnN1YiggMS4wICksIGZ6LnN1YiggMS4wICkgKSwgbXhfZ3JhZGllbnRfZmxvYXQoIG14X2hhc2hfaW50KCBYLmFkZCggaW50KCAxICkgKSwgWS5hZGQoIGludCggMSApICksIFouYWRkKCBpbnQoIDEgKSApICksIGZ4LnN1YiggMS4wICksIGZ5LnN1YiggMS4wICksIGZ6LnN1YiggMS4wICkgKSwgdSwgdiwgdyApICkudG9WYXIoKTtcclxuXHJcblx0cmV0dXJuIG14X2dyYWRpZW50X3NjYWxlM2QoIHJlc3VsdCApO1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdteF9wZXJsaW5fbm9pc2VfZmxvYXRfMScsXHJcblx0dHlwZTogJ2Zsb2F0JyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ3AnLCB0eXBlOiAndmVjMycgfVxyXG5cdF1cclxufSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X3Blcmxpbl9ub2lzZV9mbG9hdCA9IC8qQF9fUFVSRV9fKi8gb3ZlcmxvYWRpbmdGbiggWyBteF9wZXJsaW5fbm9pc2VfZmxvYXRfMCwgbXhfcGVybGluX25vaXNlX2Zsb2F0XzEgXSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X3Blcmxpbl9ub2lzZV92ZWMzXzAgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgcF9pbW11dGFibGUgXSApID0+IHtcclxuXHJcblx0Y29uc3QgcCA9IHZlYzIoIHBfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBYID0gaW50KCkudG9WYXIoKSwgWSA9IGludCgpLnRvVmFyKCk7XHJcblx0Y29uc3QgZnggPSBmbG9hdCggbXhfZmxvb3JmcmFjKCBwLngsIFggKSApLnRvVmFyKCk7XHJcblx0Y29uc3QgZnkgPSBmbG9hdCggbXhfZmxvb3JmcmFjKCBwLnksIFkgKSApLnRvVmFyKCk7XHJcblx0Y29uc3QgdSA9IGZsb2F0KCBteF9mYWRlKCBmeCApICkudG9WYXIoKTtcclxuXHRjb25zdCB2ID0gZmxvYXQoIG14X2ZhZGUoIGZ5ICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHJlc3VsdCA9IHZlYzMoIG14X2JpbGVycCggbXhfZ3JhZGllbnRfdmVjMyggbXhfaGFzaF92ZWMzKCBYLCBZICksIGZ4LCBmeSApLCBteF9ncmFkaWVudF92ZWMzKCBteF9oYXNoX3ZlYzMoIFguYWRkKCBpbnQoIDEgKSApLCBZICksIGZ4LnN1YiggMS4wICksIGZ5ICksIG14X2dyYWRpZW50X3ZlYzMoIG14X2hhc2hfdmVjMyggWCwgWS5hZGQoIGludCggMSApICkgKSwgZngsIGZ5LnN1YiggMS4wICkgKSwgbXhfZ3JhZGllbnRfdmVjMyggbXhfaGFzaF92ZWMzKCBYLmFkZCggaW50KCAxICkgKSwgWS5hZGQoIGludCggMSApICkgKSwgZnguc3ViKCAxLjAgKSwgZnkuc3ViKCAxLjAgKSApLCB1LCB2ICkgKS50b1ZhcigpO1xyXG5cclxuXHRyZXR1cm4gbXhfZ3JhZGllbnRfc2NhbGUyZCggcmVzdWx0ICk7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ214X3Blcmxpbl9ub2lzZV92ZWMzXzAnLFxyXG5cdHR5cGU6ICd2ZWMzJyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ3AnLCB0eXBlOiAndmVjMicgfVxyXG5cdF1cclxufSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X3Blcmxpbl9ub2lzZV92ZWMzXzEgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgcF9pbW11dGFibGUgXSApID0+IHtcclxuXHJcblx0Y29uc3QgcCA9IHZlYzMoIHBfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBYID0gaW50KCkudG9WYXIoKSwgWSA9IGludCgpLnRvVmFyKCksIFogPSBpbnQoKS50b1ZhcigpO1xyXG5cdGNvbnN0IGZ4ID0gZmxvYXQoIG14X2Zsb29yZnJhYyggcC54LCBYICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IGZ5ID0gZmxvYXQoIG14X2Zsb29yZnJhYyggcC55LCBZICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IGZ6ID0gZmxvYXQoIG14X2Zsb29yZnJhYyggcC56LCBaICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHUgPSBmbG9hdCggbXhfZmFkZSggZnggKSApLnRvVmFyKCk7XHJcblx0Y29uc3QgdiA9IGZsb2F0KCBteF9mYWRlKCBmeSApICkudG9WYXIoKTtcclxuXHRjb25zdCB3ID0gZmxvYXQoIG14X2ZhZGUoIGZ6ICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHJlc3VsdCA9IHZlYzMoIG14X3RyaWxlcnAoIG14X2dyYWRpZW50X3ZlYzMoIG14X2hhc2hfdmVjMyggWCwgWSwgWiApLCBmeCwgZnksIGZ6ICksIG14X2dyYWRpZW50X3ZlYzMoIG14X2hhc2hfdmVjMyggWC5hZGQoIGludCggMSApICksIFksIFogKSwgZnguc3ViKCAxLjAgKSwgZnksIGZ6ICksIG14X2dyYWRpZW50X3ZlYzMoIG14X2hhc2hfdmVjMyggWCwgWS5hZGQoIGludCggMSApICksIFogKSwgZngsIGZ5LnN1YiggMS4wICksIGZ6ICksIG14X2dyYWRpZW50X3ZlYzMoIG14X2hhc2hfdmVjMyggWC5hZGQoIGludCggMSApICksIFkuYWRkKCBpbnQoIDEgKSApLCBaICksIGZ4LnN1YiggMS4wICksIGZ5LnN1YiggMS4wICksIGZ6ICksIG14X2dyYWRpZW50X3ZlYzMoIG14X2hhc2hfdmVjMyggWCwgWSwgWi5hZGQoIGludCggMSApICkgKSwgZngsIGZ5LCBmei5zdWIoIDEuMCApICksIG14X2dyYWRpZW50X3ZlYzMoIG14X2hhc2hfdmVjMyggWC5hZGQoIGludCggMSApICksIFksIFouYWRkKCBpbnQoIDEgKSApICksIGZ4LnN1YiggMS4wICksIGZ5LCBmei5zdWIoIDEuMCApICksIG14X2dyYWRpZW50X3ZlYzMoIG14X2hhc2hfdmVjMyggWCwgWS5hZGQoIGludCggMSApICksIFouYWRkKCBpbnQoIDEgKSApICksIGZ4LCBmeS5zdWIoIDEuMCApLCBmei5zdWIoIDEuMCApICksIG14X2dyYWRpZW50X3ZlYzMoIG14X2hhc2hfdmVjMyggWC5hZGQoIGludCggMSApICksIFkuYWRkKCBpbnQoIDEgKSApLCBaLmFkZCggaW50KCAxICkgKSApLCBmeC5zdWIoIDEuMCApLCBmeS5zdWIoIDEuMCApLCBmei5zdWIoIDEuMCApICksIHUsIHYsIHcgKSApLnRvVmFyKCk7XHJcblxyXG5cdHJldHVybiBteF9ncmFkaWVudF9zY2FsZTNkKCByZXN1bHQgKTtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnbXhfcGVybGluX25vaXNlX3ZlYzNfMScsXHJcblx0dHlwZTogJ3ZlYzMnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAncCcsIHR5cGU6ICd2ZWMzJyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfcGVybGluX25vaXNlX3ZlYzMgPSAvKkBfX1BVUkVfXyovIG92ZXJsb2FkaW5nRm4oIFsgbXhfcGVybGluX25vaXNlX3ZlYzNfMCwgbXhfcGVybGluX25vaXNlX3ZlYzNfMSBdICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfY2VsbF9ub2lzZV9mbG9hdF8wID0gLypAX19QVVJFX18qLyBGbiggKCBbIHBfaW1tdXRhYmxlIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IHAgPSBmbG9hdCggcF9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IGl4ID0gaW50KCBteF9mbG9vciggcCApICkudG9WYXIoKTtcclxuXHJcblx0cmV0dXJuIG14X2JpdHNfdG9fMDEoIG14X2hhc2hfaW50KCBpeCApICk7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ214X2NlbGxfbm9pc2VfZmxvYXRfMCcsXHJcblx0dHlwZTogJ2Zsb2F0JyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ3AnLCB0eXBlOiAnZmxvYXQnIH1cclxuXHRdXHJcbn0gKTtcclxuXHJcbmV4cG9ydCBjb25zdCBteF9jZWxsX25vaXNlX2Zsb2F0XzEgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgcF9pbW11dGFibGUgXSApID0+IHtcclxuXHJcblx0Y29uc3QgcCA9IHZlYzIoIHBfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBpeCA9IGludCggbXhfZmxvb3IoIHAueCApICkudG9WYXIoKTtcclxuXHRjb25zdCBpeSA9IGludCggbXhfZmxvb3IoIHAueSApICkudG9WYXIoKTtcclxuXHJcblx0cmV0dXJuIG14X2JpdHNfdG9fMDEoIG14X2hhc2hfaW50KCBpeCwgaXkgKSApO1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdteF9jZWxsX25vaXNlX2Zsb2F0XzEnLFxyXG5cdHR5cGU6ICdmbG9hdCcsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICdwJywgdHlwZTogJ3ZlYzInIH1cclxuXHRdXHJcbn0gKTtcclxuXHJcbmV4cG9ydCBjb25zdCBteF9jZWxsX25vaXNlX2Zsb2F0XzIgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgcF9pbW11dGFibGUgXSApID0+IHtcclxuXHJcblx0Y29uc3QgcCA9IHZlYzMoIHBfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBpeCA9IGludCggbXhfZmxvb3IoIHAueCApICkudG9WYXIoKTtcclxuXHRjb25zdCBpeSA9IGludCggbXhfZmxvb3IoIHAueSApICkudG9WYXIoKTtcclxuXHRjb25zdCBpeiA9IGludCggbXhfZmxvb3IoIHAueiApICkudG9WYXIoKTtcclxuXHJcblx0cmV0dXJuIG14X2JpdHNfdG9fMDEoIG14X2hhc2hfaW50KCBpeCwgaXksIGl6ICkgKTtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnbXhfY2VsbF9ub2lzZV9mbG9hdF8yJyxcclxuXHR0eXBlOiAnZmxvYXQnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAncCcsIHR5cGU6ICd2ZWMzJyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfY2VsbF9ub2lzZV9mbG9hdF8zID0gLypAX19QVVJFX18qLyBGbiggKCBbIHBfaW1tdXRhYmxlIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IHAgPSB2ZWM0KCBwX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgaXggPSBpbnQoIG14X2Zsb29yKCBwLnggKSApLnRvVmFyKCk7XHJcblx0Y29uc3QgaXkgPSBpbnQoIG14X2Zsb29yKCBwLnkgKSApLnRvVmFyKCk7XHJcblx0Y29uc3QgaXogPSBpbnQoIG14X2Zsb29yKCBwLnogKSApLnRvVmFyKCk7XHJcblx0Y29uc3QgaXcgPSBpbnQoIG14X2Zsb29yKCBwLncgKSApLnRvVmFyKCk7XHJcblxyXG5cdHJldHVybiBteF9iaXRzX3RvXzAxKCBteF9oYXNoX2ludCggaXgsIGl5LCBpeiwgaXcgKSApO1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdteF9jZWxsX25vaXNlX2Zsb2F0XzMnLFxyXG5cdHR5cGU6ICdmbG9hdCcsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICdwJywgdHlwZTogJ3ZlYzQnIH1cclxuXHRdXHJcbn0gKTtcclxuXHJcbmV4cG9ydCBjb25zdCBteF9jZWxsX25vaXNlX2Zsb2F0ID0gLypAX19QVVJFX18qLyBvdmVybG9hZGluZ0ZuKCBbIG14X2NlbGxfbm9pc2VfZmxvYXRfMCwgbXhfY2VsbF9ub2lzZV9mbG9hdF8xLCBteF9jZWxsX25vaXNlX2Zsb2F0XzIsIG14X2NlbGxfbm9pc2VfZmxvYXRfMyBdICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfY2VsbF9ub2lzZV92ZWMzXzAgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgcF9pbW11dGFibGUgXSApID0+IHtcclxuXHJcblx0Y29uc3QgcCA9IGZsb2F0KCBwX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgaXggPSBpbnQoIG14X2Zsb29yKCBwICkgKS50b1ZhcigpO1xyXG5cclxuXHRyZXR1cm4gdmVjMyggbXhfYml0c190b18wMSggbXhfaGFzaF9pbnQoIGl4LCBpbnQoIDAgKSApICksIG14X2JpdHNfdG9fMDEoIG14X2hhc2hfaW50KCBpeCwgaW50KCAxICkgKSApLCBteF9iaXRzX3RvXzAxKCBteF9oYXNoX2ludCggaXgsIGludCggMiApICkgKSApO1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdteF9jZWxsX25vaXNlX3ZlYzNfMCcsXHJcblx0dHlwZTogJ3ZlYzMnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAncCcsIHR5cGU6ICdmbG9hdCcgfVxyXG5cdF1cclxufSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X2NlbGxfbm9pc2VfdmVjM18xID0gLypAX19QVVJFX18qLyBGbiggKCBbIHBfaW1tdXRhYmxlIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IHAgPSB2ZWMyKCBwX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgaXggPSBpbnQoIG14X2Zsb29yKCBwLnggKSApLnRvVmFyKCk7XHJcblx0Y29uc3QgaXkgPSBpbnQoIG14X2Zsb29yKCBwLnkgKSApLnRvVmFyKCk7XHJcblxyXG5cdHJldHVybiB2ZWMzKCBteF9iaXRzX3RvXzAxKCBteF9oYXNoX2ludCggaXgsIGl5LCBpbnQoIDAgKSApICksIG14X2JpdHNfdG9fMDEoIG14X2hhc2hfaW50KCBpeCwgaXksIGludCggMSApICkgKSwgbXhfYml0c190b18wMSggbXhfaGFzaF9pbnQoIGl4LCBpeSwgaW50KCAyICkgKSApICk7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ214X2NlbGxfbm9pc2VfdmVjM18xJyxcclxuXHR0eXBlOiAndmVjMycsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICdwJywgdHlwZTogJ3ZlYzInIH1cclxuXHRdXHJcbn0gKTtcclxuXHJcbmV4cG9ydCBjb25zdCBteF9jZWxsX25vaXNlX3ZlYzNfMiA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyBwX2ltbXV0YWJsZSBdICkgPT4ge1xyXG5cclxuXHRjb25zdCBwID0gdmVjMyggcF9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IGl4ID0gaW50KCBteF9mbG9vciggcC54ICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IGl5ID0gaW50KCBteF9mbG9vciggcC55ICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IGl6ID0gaW50KCBteF9mbG9vciggcC56ICkgKS50b1ZhcigpO1xyXG5cclxuXHRyZXR1cm4gdmVjMyggbXhfYml0c190b18wMSggbXhfaGFzaF9pbnQoIGl4LCBpeSwgaXosIGludCggMCApICkgKSwgbXhfYml0c190b18wMSggbXhfaGFzaF9pbnQoIGl4LCBpeSwgaXosIGludCggMSApICkgKSwgbXhfYml0c190b18wMSggbXhfaGFzaF9pbnQoIGl4LCBpeSwgaXosIGludCggMiApICkgKSApO1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdteF9jZWxsX25vaXNlX3ZlYzNfMicsXHJcblx0dHlwZTogJ3ZlYzMnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAncCcsIHR5cGU6ICd2ZWMzJyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfY2VsbF9ub2lzZV92ZWMzXzMgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgcF9pbW11dGFibGUgXSApID0+IHtcclxuXHJcblx0Y29uc3QgcCA9IHZlYzQoIHBfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBpeCA9IGludCggbXhfZmxvb3IoIHAueCApICkudG9WYXIoKTtcclxuXHRjb25zdCBpeSA9IGludCggbXhfZmxvb3IoIHAueSApICkudG9WYXIoKTtcclxuXHRjb25zdCBpeiA9IGludCggbXhfZmxvb3IoIHAueiApICkudG9WYXIoKTtcclxuXHRjb25zdCBpdyA9IGludCggbXhfZmxvb3IoIHAudyApICkudG9WYXIoKTtcclxuXHJcblx0cmV0dXJuIHZlYzMoIG14X2JpdHNfdG9fMDEoIG14X2hhc2hfaW50KCBpeCwgaXksIGl6LCBpdywgaW50KCAwICkgKSApLCBteF9iaXRzX3RvXzAxKCBteF9oYXNoX2ludCggaXgsIGl5LCBpeiwgaXcsIGludCggMSApICkgKSwgbXhfYml0c190b18wMSggbXhfaGFzaF9pbnQoIGl4LCBpeSwgaXosIGl3LCBpbnQoIDIgKSApICkgKTtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnbXhfY2VsbF9ub2lzZV92ZWMzXzMnLFxyXG5cdHR5cGU6ICd2ZWMzJyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ3AnLCB0eXBlOiAndmVjNCcgfVxyXG5cdF1cclxufSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X2NlbGxfbm9pc2VfdmVjMyA9IC8qQF9fUFVSRV9fKi8gb3ZlcmxvYWRpbmdGbiggWyBteF9jZWxsX25vaXNlX3ZlYzNfMCwgbXhfY2VsbF9ub2lzZV92ZWMzXzEsIG14X2NlbGxfbm9pc2VfdmVjM18yLCBteF9jZWxsX25vaXNlX3ZlYzNfMyBdICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfZnJhY3RhbF9ub2lzZV9mbG9hdCA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyBwX2ltbXV0YWJsZSwgb2N0YXZlc19pbW11dGFibGUsIGxhY3VuYXJpdHlfaW1tdXRhYmxlLCBkaW1pbmlzaF9pbW11dGFibGUgXSApID0+IHtcclxuXHJcblx0Y29uc3QgZGltaW5pc2ggPSBmbG9hdCggZGltaW5pc2hfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBsYWN1bmFyaXR5ID0gZmxvYXQoIGxhY3VuYXJpdHlfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBvY3RhdmVzID0gaW50KCBvY3RhdmVzX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgcCA9IHZlYzMoIHBfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCByZXN1bHQgPSBmbG9hdCggMC4wICkudG9WYXIoKTtcclxuXHRjb25zdCBhbXBsaXR1ZGUgPSBmbG9hdCggMS4wICkudG9WYXIoKTtcclxuXHJcblx0TG9vcCggb2N0YXZlcywgKCkgPT4ge1xyXG5cclxuXHRcdHJlc3VsdC5hZGRBc3NpZ24oIGFtcGxpdHVkZS5tdWwoIG14X3Blcmxpbl9ub2lzZV9mbG9hdCggcCApICkgKTtcclxuXHRcdGFtcGxpdHVkZS5tdWxBc3NpZ24oIGRpbWluaXNoICk7XHJcblx0XHRwLm11bEFzc2lnbiggbGFjdW5hcml0eSApO1xyXG5cclxuXHR9ICk7XHJcblxyXG5cdHJldHVybiByZXN1bHQ7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ214X2ZyYWN0YWxfbm9pc2VfZmxvYXQnLFxyXG5cdHR5cGU6ICdmbG9hdCcsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICdwJywgdHlwZTogJ3ZlYzMnIH0sXHJcblx0XHR7IG5hbWU6ICdvY3RhdmVzJywgdHlwZTogJ2ludCcgfSxcclxuXHRcdHsgbmFtZTogJ2xhY3VuYXJpdHknLCB0eXBlOiAnZmxvYXQnIH0sXHJcblx0XHR7IG5hbWU6ICdkaW1pbmlzaCcsIHR5cGU6ICdmbG9hdCcgfVxyXG5cdF1cclxufSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X2ZyYWN0YWxfbm9pc2VfdmVjMyA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyBwX2ltbXV0YWJsZSwgb2N0YXZlc19pbW11dGFibGUsIGxhY3VuYXJpdHlfaW1tdXRhYmxlLCBkaW1pbmlzaF9pbW11dGFibGUgXSApID0+IHtcclxuXHJcblx0Y29uc3QgZGltaW5pc2ggPSBmbG9hdCggZGltaW5pc2hfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBsYWN1bmFyaXR5ID0gZmxvYXQoIGxhY3VuYXJpdHlfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBvY3RhdmVzID0gaW50KCBvY3RhdmVzX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgcCA9IHZlYzMoIHBfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCByZXN1bHQgPSB2ZWMzKCAwLjAgKS50b1ZhcigpO1xyXG5cdGNvbnN0IGFtcGxpdHVkZSA9IGZsb2F0KCAxLjAgKS50b1ZhcigpO1xyXG5cclxuXHRMb29wKCBvY3RhdmVzLCAoKSA9PiB7XHJcblxyXG5cdFx0cmVzdWx0LmFkZEFzc2lnbiggYW1wbGl0dWRlLm11bCggbXhfcGVybGluX25vaXNlX3ZlYzMoIHAgKSApICk7XHJcblx0XHRhbXBsaXR1ZGUubXVsQXNzaWduKCBkaW1pbmlzaCApO1xyXG5cdFx0cC5tdWxBc3NpZ24oIGxhY3VuYXJpdHkgKTtcclxuXHJcblx0fSApO1xyXG5cclxuXHRyZXR1cm4gcmVzdWx0O1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdteF9mcmFjdGFsX25vaXNlX3ZlYzMnLFxyXG5cdHR5cGU6ICd2ZWMzJyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ3AnLCB0eXBlOiAndmVjMycgfSxcclxuXHRcdHsgbmFtZTogJ29jdGF2ZXMnLCB0eXBlOiAnaW50JyB9LFxyXG5cdFx0eyBuYW1lOiAnbGFjdW5hcml0eScsIHR5cGU6ICdmbG9hdCcgfSxcclxuXHRcdHsgbmFtZTogJ2RpbWluaXNoJywgdHlwZTogJ2Zsb2F0JyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfZnJhY3RhbF9ub2lzZV92ZWMyID0gLypAX19QVVJFX18qLyBGbiggKCBbIHBfaW1tdXRhYmxlLCBvY3RhdmVzX2ltbXV0YWJsZSwgbGFjdW5hcml0eV9pbW11dGFibGUsIGRpbWluaXNoX2ltbXV0YWJsZSBdICkgPT4ge1xyXG5cclxuXHRjb25zdCBkaW1pbmlzaCA9IGZsb2F0KCBkaW1pbmlzaF9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IGxhY3VuYXJpdHkgPSBmbG9hdCggbGFjdW5hcml0eV9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IG9jdGF2ZXMgPSBpbnQoIG9jdGF2ZXNfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBwID0gdmVjMyggcF9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cclxuXHRyZXR1cm4gdmVjMiggbXhfZnJhY3RhbF9ub2lzZV9mbG9hdCggcCwgb2N0YXZlcywgbGFjdW5hcml0eSwgZGltaW5pc2ggKSwgbXhfZnJhY3RhbF9ub2lzZV9mbG9hdCggcC5hZGQoIHZlYzMoIGludCggMTkgKSwgaW50KCAxOTMgKSwgaW50KCAxNyApICkgKSwgb2N0YXZlcywgbGFjdW5hcml0eSwgZGltaW5pc2ggKSApO1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdteF9mcmFjdGFsX25vaXNlX3ZlYzInLFxyXG5cdHR5cGU6ICd2ZWMyJyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ3AnLCB0eXBlOiAndmVjMycgfSxcclxuXHRcdHsgbmFtZTogJ29jdGF2ZXMnLCB0eXBlOiAnaW50JyB9LFxyXG5cdFx0eyBuYW1lOiAnbGFjdW5hcml0eScsIHR5cGU6ICdmbG9hdCcgfSxcclxuXHRcdHsgbmFtZTogJ2RpbWluaXNoJywgdHlwZTogJ2Zsb2F0JyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfZnJhY3RhbF9ub2lzZV92ZWM0ID0gLypAX19QVVJFX18qLyBGbiggKCBbIHBfaW1tdXRhYmxlLCBvY3RhdmVzX2ltbXV0YWJsZSwgbGFjdW5hcml0eV9pbW11dGFibGUsIGRpbWluaXNoX2ltbXV0YWJsZSBdICkgPT4ge1xyXG5cclxuXHRjb25zdCBkaW1pbmlzaCA9IGZsb2F0KCBkaW1pbmlzaF9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IGxhY3VuYXJpdHkgPSBmbG9hdCggbGFjdW5hcml0eV9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IG9jdGF2ZXMgPSBpbnQoIG9jdGF2ZXNfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBwID0gdmVjMyggcF9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IGMgPSB2ZWMzKCBteF9mcmFjdGFsX25vaXNlX3ZlYzMoIHAsIG9jdGF2ZXMsIGxhY3VuYXJpdHksIGRpbWluaXNoICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IGYgPSBmbG9hdCggbXhfZnJhY3RhbF9ub2lzZV9mbG9hdCggcC5hZGQoIHZlYzMoIGludCggMTkgKSwgaW50KCAxOTMgKSwgaW50KCAxNyApICkgKSwgb2N0YXZlcywgbGFjdW5hcml0eSwgZGltaW5pc2ggKSApLnRvVmFyKCk7XHJcblxyXG5cdHJldHVybiB2ZWM0KCBjLCBmICk7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ214X2ZyYWN0YWxfbm9pc2VfdmVjNCcsXHJcblx0dHlwZTogJ3ZlYzQnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAncCcsIHR5cGU6ICd2ZWMzJyB9LFxyXG5cdFx0eyBuYW1lOiAnb2N0YXZlcycsIHR5cGU6ICdpbnQnIH0sXHJcblx0XHR7IG5hbWU6ICdsYWN1bmFyaXR5JywgdHlwZTogJ2Zsb2F0JyB9LFxyXG5cdFx0eyBuYW1lOiAnZGltaW5pc2gnLCB0eXBlOiAnZmxvYXQnIH1cclxuXHRdXHJcbn0gKTtcclxuXHJcbmV4cG9ydCBjb25zdCBteF93b3JsZXlfZGlzdGFuY2VfMCA9IC8qQF9fUFVSRV9fKi8gRm4oICggWyBwX2ltbXV0YWJsZSwgeF9pbW11dGFibGUsIHlfaW1tdXRhYmxlLCB4b2ZmX2ltbXV0YWJsZSwgeW9mZl9pbW11dGFibGUsIGppdHRlcl9pbW11dGFibGUsIG1ldHJpY19pbW11dGFibGUgXSApID0+IHtcclxuXHJcblx0Y29uc3QgbWV0cmljID0gaW50KCBtZXRyaWNfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBqaXR0ZXIgPSBmbG9hdCggaml0dGVyX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgeW9mZiA9IGludCggeW9mZl9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHhvZmYgPSBpbnQoIHhvZmZfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCB5ID0gaW50KCB5X2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgeCA9IGludCggeF9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHAgPSB2ZWMyKCBwX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgdG1wID0gdmVjMyggbXhfY2VsbF9ub2lzZV92ZWMzKCB2ZWMyKCB4LmFkZCggeG9mZiApLCB5LmFkZCggeW9mZiApICkgKSApLnRvVmFyKCk7XHJcblx0Y29uc3Qgb2ZmID0gdmVjMiggdG1wLngsIHRtcC55ICkudG9WYXIoKTtcclxuXHRvZmYuc3ViQXNzaWduKCAwLjUgKTtcclxuXHRvZmYubXVsQXNzaWduKCBqaXR0ZXIgKTtcclxuXHRvZmYuYWRkQXNzaWduKCAwLjUgKTtcclxuXHRjb25zdCBjZWxscG9zID0gdmVjMiggdmVjMiggZmxvYXQoIHggKSwgZmxvYXQoIHkgKSApLmFkZCggb2ZmICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IGRpZmYgPSB2ZWMyKCBjZWxscG9zLnN1YiggcCApICkudG9WYXIoKTtcclxuXHJcblx0SWYoIG1ldHJpYy5lcXVhbCggaW50KCAyICkgKSwgKCkgPT4ge1xyXG5cclxuXHRcdHJldHVybiBhYnMoIGRpZmYueCApLmFkZCggYWJzKCBkaWZmLnkgKSApO1xyXG5cclxuXHR9ICk7XHJcblxyXG5cdElmKCBtZXRyaWMuZXF1YWwoIGludCggMyApICksICgpID0+IHtcclxuXHJcblx0XHRyZXR1cm4gbWF4KCBhYnMoIGRpZmYueCApLCBhYnMoIGRpZmYueSApICk7XHJcblxyXG5cdH0gKTtcclxuXHJcblx0cmV0dXJuIGRvdCggZGlmZiwgZGlmZiApO1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdteF93b3JsZXlfZGlzdGFuY2VfMCcsXHJcblx0dHlwZTogJ2Zsb2F0JyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ3AnLCB0eXBlOiAndmVjMicgfSxcclxuXHRcdHsgbmFtZTogJ3gnLCB0eXBlOiAnaW50JyB9LFxyXG5cdFx0eyBuYW1lOiAneScsIHR5cGU6ICdpbnQnIH0sXHJcblx0XHR7IG5hbWU6ICd4b2ZmJywgdHlwZTogJ2ludCcgfSxcclxuXHRcdHsgbmFtZTogJ3lvZmYnLCB0eXBlOiAnaW50JyB9LFxyXG5cdFx0eyBuYW1lOiAnaml0dGVyJywgdHlwZTogJ2Zsb2F0JyB9LFxyXG5cdFx0eyBuYW1lOiAnbWV0cmljJywgdHlwZTogJ2ludCcgfVxyXG5cdF1cclxufSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X3dvcmxleV9kaXN0YW5jZV8xID0gLypAX19QVVJFX18qLyBGbiggKCBbIHBfaW1tdXRhYmxlLCB4X2ltbXV0YWJsZSwgeV9pbW11dGFibGUsIHpfaW1tdXRhYmxlLCB4b2ZmX2ltbXV0YWJsZSwgeW9mZl9pbW11dGFibGUsIHpvZmZfaW1tdXRhYmxlLCBqaXR0ZXJfaW1tdXRhYmxlLCBtZXRyaWNfaW1tdXRhYmxlIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IG1ldHJpYyA9IGludCggbWV0cmljX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3Qgaml0dGVyID0gZmxvYXQoIGppdHRlcl9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHpvZmYgPSBpbnQoIHpvZmZfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCB5b2ZmID0gaW50KCB5b2ZmX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgeG9mZiA9IGludCggeG9mZl9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHogPSBpbnQoIHpfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCB5ID0gaW50KCB5X2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgeCA9IGludCggeF9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHAgPSB2ZWMzKCBwX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3Qgb2ZmID0gdmVjMyggbXhfY2VsbF9ub2lzZV92ZWMzKCB2ZWMzKCB4LmFkZCggeG9mZiApLCB5LmFkZCggeW9mZiApLCB6LmFkZCggem9mZiApICkgKSApLnRvVmFyKCk7XHJcblx0b2ZmLnN1YkFzc2lnbiggMC41ICk7XHJcblx0b2ZmLm11bEFzc2lnbiggaml0dGVyICk7XHJcblx0b2ZmLmFkZEFzc2lnbiggMC41ICk7XHJcblx0Y29uc3QgY2VsbHBvcyA9IHZlYzMoIHZlYzMoIGZsb2F0KCB4ICksIGZsb2F0KCB5ICksIGZsb2F0KCB6ICkgKS5hZGQoIG9mZiApICkudG9WYXIoKTtcclxuXHRjb25zdCBkaWZmID0gdmVjMyggY2VsbHBvcy5zdWIoIHAgKSApLnRvVmFyKCk7XHJcblxyXG5cdElmKCBtZXRyaWMuZXF1YWwoIGludCggMiApICksICgpID0+IHtcclxuXHJcblx0XHRyZXR1cm4gYWJzKCBkaWZmLnggKS5hZGQoIGFicyggZGlmZi55ICkgKS5hZGQoIGFicyggZGlmZi56ICkgKTtcclxuXHJcblx0fSApO1xyXG5cclxuXHRJZiggbWV0cmljLmVxdWFsKCBpbnQoIDMgKSApLCAoKSA9PiB7XHJcblxyXG5cdFx0cmV0dXJuIG1heCggbWF4KCBhYnMoIGRpZmYueCApLCBhYnMoIGRpZmYueSApICksIGFicyggZGlmZi56ICkgKTtcclxuXHJcblx0fSApO1xyXG5cclxuXHRyZXR1cm4gZG90KCBkaWZmLCBkaWZmICk7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ214X3dvcmxleV9kaXN0YW5jZV8xJyxcclxuXHR0eXBlOiAnZmxvYXQnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAncCcsIHR5cGU6ICd2ZWMzJyB9LFxyXG5cdFx0eyBuYW1lOiAneCcsIHR5cGU6ICdpbnQnIH0sXHJcblx0XHR7IG5hbWU6ICd5JywgdHlwZTogJ2ludCcgfSxcclxuXHRcdHsgbmFtZTogJ3onLCB0eXBlOiAnaW50JyB9LFxyXG5cdFx0eyBuYW1lOiAneG9mZicsIHR5cGU6ICdpbnQnIH0sXHJcblx0XHR7IG5hbWU6ICd5b2ZmJywgdHlwZTogJ2ludCcgfSxcclxuXHRcdHsgbmFtZTogJ3pvZmYnLCB0eXBlOiAnaW50JyB9LFxyXG5cdFx0eyBuYW1lOiAnaml0dGVyJywgdHlwZTogJ2Zsb2F0JyB9LFxyXG5cdFx0eyBuYW1lOiAnbWV0cmljJywgdHlwZTogJ2ludCcgfVxyXG5cdF1cclxufSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X3dvcmxleV9kaXN0YW5jZSA9IC8qQF9fUFVSRV9fKi8gb3ZlcmxvYWRpbmdGbiggWyBteF93b3JsZXlfZGlzdGFuY2VfMCwgbXhfd29ybGV5X2Rpc3RhbmNlXzEgXSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X3dvcmxleV9ub2lzZV9mbG9hdF8wID0gLypAX19QVVJFX18qLyBGbiggKCBbIHBfaW1tdXRhYmxlLCBqaXR0ZXJfaW1tdXRhYmxlLCBtZXRyaWNfaW1tdXRhYmxlIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IG1ldHJpYyA9IGludCggbWV0cmljX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3Qgaml0dGVyID0gZmxvYXQoIGppdHRlcl9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHAgPSB2ZWMyKCBwX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgWCA9IGludCgpLnRvVmFyKCksIFkgPSBpbnQoKS50b1ZhcigpO1xyXG5cdGNvbnN0IGxvY2FscG9zID0gdmVjMiggbXhfZmxvb3JmcmFjKCBwLngsIFggKSwgbXhfZmxvb3JmcmFjKCBwLnksIFkgKSApLnRvVmFyKCk7XHJcblx0Y29uc3Qgc3FkaXN0ID0gZmxvYXQoIDFlNiApLnRvVmFyKCk7XHJcblxyXG5cdExvb3AoIHsgc3RhcnQ6IC0gMSwgZW5kOiBpbnQoIDEgKSwgbmFtZTogJ3gnLCBjb25kaXRpb246ICc8PScgfSwgKCB7IHggfSApID0+IHtcclxuXHJcblx0XHRMb29wKCB7IHN0YXJ0OiAtIDEsIGVuZDogaW50KCAxICksIG5hbWU6ICd5JywgY29uZGl0aW9uOiAnPD0nIH0sICggeyB5IH0gKSA9PiB7XHJcblxyXG5cdFx0XHRjb25zdCBkaXN0ID0gZmxvYXQoIG14X3dvcmxleV9kaXN0YW5jZSggbG9jYWxwb3MsIHgsIHksIFgsIFksIGppdHRlciwgbWV0cmljICkgKS50b1ZhcigpO1xyXG5cdFx0XHRzcWRpc3QuYXNzaWduKCBtaW4oIHNxZGlzdCwgZGlzdCApICk7XHJcblxyXG5cdFx0fSApO1xyXG5cclxuXHR9ICk7XHJcblxyXG5cdElmKCBtZXRyaWMuZXF1YWwoIGludCggMCApICksICgpID0+IHtcclxuXHJcblx0XHRzcWRpc3QuYXNzaWduKCBzcXJ0KCBzcWRpc3QgKSApO1xyXG5cclxuXHR9ICk7XHJcblxyXG5cdHJldHVybiBzcWRpc3Q7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ214X3dvcmxleV9ub2lzZV9mbG9hdF8wJyxcclxuXHR0eXBlOiAnZmxvYXQnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAncCcsIHR5cGU6ICd2ZWMyJyB9LFxyXG5cdFx0eyBuYW1lOiAnaml0dGVyJywgdHlwZTogJ2Zsb2F0JyB9LFxyXG5cdFx0eyBuYW1lOiAnbWV0cmljJywgdHlwZTogJ2ludCcgfVxyXG5cdF1cclxufSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X3dvcmxleV9ub2lzZV92ZWMyXzAgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgcF9pbW11dGFibGUsIGppdHRlcl9pbW11dGFibGUsIG1ldHJpY19pbW11dGFibGUgXSApID0+IHtcclxuXHJcblx0Y29uc3QgbWV0cmljID0gaW50KCBtZXRyaWNfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBqaXR0ZXIgPSBmbG9hdCggaml0dGVyX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgcCA9IHZlYzIoIHBfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBYID0gaW50KCkudG9WYXIoKSwgWSA9IGludCgpLnRvVmFyKCk7XHJcblx0Y29uc3QgbG9jYWxwb3MgPSB2ZWMyKCBteF9mbG9vcmZyYWMoIHAueCwgWCApLCBteF9mbG9vcmZyYWMoIHAueSwgWSApICkudG9WYXIoKTtcclxuXHRjb25zdCBzcWRpc3QgPSB2ZWMyKCAxZTYsIDFlNiApLnRvVmFyKCk7XHJcblxyXG5cdExvb3AoIHsgc3RhcnQ6IC0gMSwgZW5kOiBpbnQoIDEgKSwgbmFtZTogJ3gnLCBjb25kaXRpb246ICc8PScgfSwgKCB7IHggfSApID0+IHtcclxuXHJcblx0XHRMb29wKCB7IHN0YXJ0OiAtIDEsIGVuZDogaW50KCAxICksIG5hbWU6ICd5JywgY29uZGl0aW9uOiAnPD0nIH0sICggeyB5IH0gKSA9PiB7XHJcblxyXG5cdFx0XHRjb25zdCBkaXN0ID0gZmxvYXQoIG14X3dvcmxleV9kaXN0YW5jZSggbG9jYWxwb3MsIHgsIHksIFgsIFksIGppdHRlciwgbWV0cmljICkgKS50b1ZhcigpO1xyXG5cclxuXHRcdFx0SWYoIGRpc3QubGVzc1RoYW4oIHNxZGlzdC54ICksICgpID0+IHtcclxuXHJcblx0XHRcdFx0c3FkaXN0LnkuYXNzaWduKCBzcWRpc3QueCApO1xyXG5cdFx0XHRcdHNxZGlzdC54LmFzc2lnbiggZGlzdCApO1xyXG5cclxuXHRcdFx0fSApLkVsc2VJZiggZGlzdC5sZXNzVGhhbiggc3FkaXN0LnkgKSwgKCkgPT4ge1xyXG5cclxuXHRcdFx0XHRzcWRpc3QueS5hc3NpZ24oIGRpc3QgKTtcclxuXHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHR9ICk7XHJcblxyXG5cdH0gKTtcclxuXHJcblx0SWYoIG1ldHJpYy5lcXVhbCggaW50KCAwICkgKSwgKCkgPT4ge1xyXG5cclxuXHRcdHNxZGlzdC5hc3NpZ24oIHNxcnQoIHNxZGlzdCApICk7XHJcblxyXG5cdH0gKTtcclxuXHJcblx0cmV0dXJuIHNxZGlzdDtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnbXhfd29ybGV5X25vaXNlX3ZlYzJfMCcsXHJcblx0dHlwZTogJ3ZlYzInLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAncCcsIHR5cGU6ICd2ZWMyJyB9LFxyXG5cdFx0eyBuYW1lOiAnaml0dGVyJywgdHlwZTogJ2Zsb2F0JyB9LFxyXG5cdFx0eyBuYW1lOiAnbWV0cmljJywgdHlwZTogJ2ludCcgfVxyXG5cdF1cclxufSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X3dvcmxleV9ub2lzZV92ZWMzXzAgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgcF9pbW11dGFibGUsIGppdHRlcl9pbW11dGFibGUsIG1ldHJpY19pbW11dGFibGUgXSApID0+IHtcclxuXHJcblx0Y29uc3QgbWV0cmljID0gaW50KCBtZXRyaWNfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBqaXR0ZXIgPSBmbG9hdCggaml0dGVyX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgcCA9IHZlYzIoIHBfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBYID0gaW50KCkudG9WYXIoKSwgWSA9IGludCgpLnRvVmFyKCk7XHJcblx0Y29uc3QgbG9jYWxwb3MgPSB2ZWMyKCBteF9mbG9vcmZyYWMoIHAueCwgWCApLCBteF9mbG9vcmZyYWMoIHAueSwgWSApICkudG9WYXIoKTtcclxuXHRjb25zdCBzcWRpc3QgPSB2ZWMzKCAxZTYsIDFlNiwgMWU2ICkudG9WYXIoKTtcclxuXHJcblx0TG9vcCggeyBzdGFydDogLSAxLCBlbmQ6IGludCggMSApLCBuYW1lOiAneCcsIGNvbmRpdGlvbjogJzw9JyB9LCAoIHsgeCB9ICkgPT4ge1xyXG5cclxuXHRcdExvb3AoIHsgc3RhcnQ6IC0gMSwgZW5kOiBpbnQoIDEgKSwgbmFtZTogJ3knLCBjb25kaXRpb246ICc8PScgfSwgKCB7IHkgfSApID0+IHtcclxuXHJcblx0XHRcdGNvbnN0IGRpc3QgPSBmbG9hdCggbXhfd29ybGV5X2Rpc3RhbmNlKCBsb2NhbHBvcywgeCwgeSwgWCwgWSwgaml0dGVyLCBtZXRyaWMgKSApLnRvVmFyKCk7XHJcblxyXG5cdFx0XHRJZiggZGlzdC5sZXNzVGhhbiggc3FkaXN0LnggKSwgKCkgPT4ge1xyXG5cclxuXHRcdFx0XHRzcWRpc3Quei5hc3NpZ24oIHNxZGlzdC55ICk7XHJcblx0XHRcdFx0c3FkaXN0LnkuYXNzaWduKCBzcWRpc3QueCApO1xyXG5cdFx0XHRcdHNxZGlzdC54LmFzc2lnbiggZGlzdCApO1xyXG5cclxuXHRcdFx0fSApLkVsc2VJZiggZGlzdC5sZXNzVGhhbiggc3FkaXN0LnkgKSwgKCkgPT4ge1xyXG5cclxuXHRcdFx0XHRzcWRpc3Quei5hc3NpZ24oIHNxZGlzdC55ICk7XHJcblx0XHRcdFx0c3FkaXN0LnkuYXNzaWduKCBkaXN0ICk7XHJcblxyXG5cdFx0XHR9ICkuRWxzZUlmKCBkaXN0Lmxlc3NUaGFuKCBzcWRpc3QueiApLCAoKSA9PiB7XHJcblxyXG5cdFx0XHRcdHNxZGlzdC56LmFzc2lnbiggZGlzdCApO1xyXG5cclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdH0gKTtcclxuXHJcblx0fSApO1xyXG5cclxuXHRJZiggbWV0cmljLmVxdWFsKCBpbnQoIDAgKSApLCAoKSA9PiB7XHJcblxyXG5cdFx0c3FkaXN0LmFzc2lnbiggc3FydCggc3FkaXN0ICkgKTtcclxuXHJcblx0fSApO1xyXG5cclxuXHRyZXR1cm4gc3FkaXN0O1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdteF93b3JsZXlfbm9pc2VfdmVjM18wJyxcclxuXHR0eXBlOiAndmVjMycsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICdwJywgdHlwZTogJ3ZlYzInIH0sXHJcblx0XHR7IG5hbWU6ICdqaXR0ZXInLCB0eXBlOiAnZmxvYXQnIH0sXHJcblx0XHR7IG5hbWU6ICdtZXRyaWMnLCB0eXBlOiAnaW50JyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfd29ybGV5X25vaXNlX2Zsb2F0XzEgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgcF9pbW11dGFibGUsIGppdHRlcl9pbW11dGFibGUsIG1ldHJpY19pbW11dGFibGUgXSApID0+IHtcclxuXHJcblx0Y29uc3QgbWV0cmljID0gaW50KCBtZXRyaWNfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBqaXR0ZXIgPSBmbG9hdCggaml0dGVyX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgcCA9IHZlYzMoIHBfaW1tdXRhYmxlICkudG9WYXIoKTtcclxuXHRjb25zdCBYID0gaW50KCkudG9WYXIoKSwgWSA9IGludCgpLnRvVmFyKCksIFogPSBpbnQoKS50b1ZhcigpO1xyXG5cdGNvbnN0IGxvY2FscG9zID0gdmVjMyggbXhfZmxvb3JmcmFjKCBwLngsIFggKSwgbXhfZmxvb3JmcmFjKCBwLnksIFkgKSwgbXhfZmxvb3JmcmFjKCBwLnosIFogKSApLnRvVmFyKCk7XHJcblx0Y29uc3Qgc3FkaXN0ID0gZmxvYXQoIDFlNiApLnRvVmFyKCk7XHJcblxyXG5cdExvb3AoIHsgc3RhcnQ6IC0gMSwgZW5kOiBpbnQoIDEgKSwgbmFtZTogJ3gnLCBjb25kaXRpb246ICc8PScgfSwgKCB7IHggfSApID0+IHtcclxuXHJcblx0XHRMb29wKCB7IHN0YXJ0OiAtIDEsIGVuZDogaW50KCAxICksIG5hbWU6ICd5JywgY29uZGl0aW9uOiAnPD0nIH0sICggeyB5IH0gKSA9PiB7XHJcblxyXG5cdFx0XHRMb29wKCB7IHN0YXJ0OiAtIDEsIGVuZDogaW50KCAxICksIG5hbWU6ICd6JywgY29uZGl0aW9uOiAnPD0nIH0sICggeyB6IH0gKSA9PiB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGRpc3QgPSBmbG9hdCggbXhfd29ybGV5X2Rpc3RhbmNlKCBsb2NhbHBvcywgeCwgeSwgeiwgWCwgWSwgWiwgaml0dGVyLCBtZXRyaWMgKSApLnRvVmFyKCk7XHJcblx0XHRcdFx0c3FkaXN0LmFzc2lnbiggbWluKCBzcWRpc3QsIGRpc3QgKSApO1xyXG5cclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdH0gKTtcclxuXHJcblx0fSApO1xyXG5cclxuXHRJZiggbWV0cmljLmVxdWFsKCBpbnQoIDAgKSApLCAoKSA9PiB7XHJcblxyXG5cdFx0c3FkaXN0LmFzc2lnbiggc3FydCggc3FkaXN0ICkgKTtcclxuXHJcblx0fSApO1xyXG5cclxuXHRyZXR1cm4gc3FkaXN0O1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdteF93b3JsZXlfbm9pc2VfZmxvYXRfMScsXHJcblx0dHlwZTogJ2Zsb2F0JyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ3AnLCB0eXBlOiAndmVjMycgfSxcclxuXHRcdHsgbmFtZTogJ2ppdHRlcicsIHR5cGU6ICdmbG9hdCcgfSxcclxuXHRcdHsgbmFtZTogJ21ldHJpYycsIHR5cGU6ICdpbnQnIH1cclxuXHRdXHJcbn0gKTtcclxuXHJcbmV4cG9ydCBjb25zdCBteF93b3JsZXlfbm9pc2VfZmxvYXQgPSAvKkBfX1BVUkVfXyovIG92ZXJsb2FkaW5nRm4oIFsgbXhfd29ybGV5X25vaXNlX2Zsb2F0XzAsIG14X3dvcmxleV9ub2lzZV9mbG9hdF8xIF0gKTtcclxuXHJcbmV4cG9ydCBjb25zdCBteF93b3JsZXlfbm9pc2VfdmVjMl8xID0gLypAX19QVVJFX18qLyBGbiggKCBbIHBfaW1tdXRhYmxlLCBqaXR0ZXJfaW1tdXRhYmxlLCBtZXRyaWNfaW1tdXRhYmxlIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IG1ldHJpYyA9IGludCggbWV0cmljX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3Qgaml0dGVyID0gZmxvYXQoIGppdHRlcl9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHAgPSB2ZWMzKCBwX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgWCA9IGludCgpLnRvVmFyKCksIFkgPSBpbnQoKS50b1ZhcigpLCBaID0gaW50KCkudG9WYXIoKTtcclxuXHRjb25zdCBsb2NhbHBvcyA9IHZlYzMoIG14X2Zsb29yZnJhYyggcC54LCBYICksIG14X2Zsb29yZnJhYyggcC55LCBZICksIG14X2Zsb29yZnJhYyggcC56LCBaICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHNxZGlzdCA9IHZlYzIoIDFlNiwgMWU2ICkudG9WYXIoKTtcclxuXHJcblx0TG9vcCggeyBzdGFydDogLSAxLCBlbmQ6IGludCggMSApLCBuYW1lOiAneCcsIGNvbmRpdGlvbjogJzw9JyB9LCAoIHsgeCB9ICkgPT4ge1xyXG5cclxuXHRcdExvb3AoIHsgc3RhcnQ6IC0gMSwgZW5kOiBpbnQoIDEgKSwgbmFtZTogJ3knLCBjb25kaXRpb246ICc8PScgfSwgKCB7IHkgfSApID0+IHtcclxuXHJcblx0XHRcdExvb3AoIHsgc3RhcnQ6IC0gMSwgZW5kOiBpbnQoIDEgKSwgbmFtZTogJ3onLCBjb25kaXRpb246ICc8PScgfSwgKCB7IHogfSApID0+IHtcclxuXHJcblx0XHRcdFx0Y29uc3QgZGlzdCA9IGZsb2F0KCBteF93b3JsZXlfZGlzdGFuY2UoIGxvY2FscG9zLCB4LCB5LCB6LCBYLCBZLCBaLCBqaXR0ZXIsIG1ldHJpYyApICkudG9WYXIoKTtcclxuXHJcblx0XHRcdFx0SWYoIGRpc3QubGVzc1RoYW4oIHNxZGlzdC54ICksICgpID0+IHtcclxuXHJcblx0XHRcdFx0XHRzcWRpc3QueS5hc3NpZ24oIHNxZGlzdC54ICk7XHJcblx0XHRcdFx0XHRzcWRpc3QueC5hc3NpZ24oIGRpc3QgKTtcclxuXHJcblx0XHRcdFx0fSApLkVsc2VJZiggZGlzdC5sZXNzVGhhbiggc3FkaXN0LnkgKSwgKCkgPT4ge1xyXG5cclxuXHRcdFx0XHRcdHNxZGlzdC55LmFzc2lnbiggZGlzdCApO1xyXG5cclxuXHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0fSApO1xyXG5cclxuXHR9ICk7XHJcblxyXG5cdElmKCBtZXRyaWMuZXF1YWwoIGludCggMCApICksICgpID0+IHtcclxuXHJcblx0XHRzcWRpc3QuYXNzaWduKCBzcXJ0KCBzcWRpc3QgKSApO1xyXG5cclxuXHR9ICk7XHJcblxyXG5cdHJldHVybiBzcWRpc3Q7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ214X3dvcmxleV9ub2lzZV92ZWMyXzEnLFxyXG5cdHR5cGU6ICd2ZWMyJyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ3AnLCB0eXBlOiAndmVjMycgfSxcclxuXHRcdHsgbmFtZTogJ2ppdHRlcicsIHR5cGU6ICdmbG9hdCcgfSxcclxuXHRcdHsgbmFtZTogJ21ldHJpYycsIHR5cGU6ICdpbnQnIH1cclxuXHRdXHJcbn0gKTtcclxuXHJcbmV4cG9ydCBjb25zdCBteF93b3JsZXlfbm9pc2VfdmVjMiA9IC8qQF9fUFVSRV9fKi8gb3ZlcmxvYWRpbmdGbiggWyBteF93b3JsZXlfbm9pc2VfdmVjMl8wLCBteF93b3JsZXlfbm9pc2VfdmVjMl8xIF0gKTtcclxuXHJcbmV4cG9ydCBjb25zdCBteF93b3JsZXlfbm9pc2VfdmVjM18xID0gLypAX19QVVJFX18qLyBGbiggKCBbIHBfaW1tdXRhYmxlLCBqaXR0ZXJfaW1tdXRhYmxlLCBtZXRyaWNfaW1tdXRhYmxlIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IG1ldHJpYyA9IGludCggbWV0cmljX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3Qgaml0dGVyID0gZmxvYXQoIGppdHRlcl9pbW11dGFibGUgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHAgPSB2ZWMzKCBwX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgWCA9IGludCgpLnRvVmFyKCksIFkgPSBpbnQoKS50b1ZhcigpLCBaID0gaW50KCkudG9WYXIoKTtcclxuXHRjb25zdCBsb2NhbHBvcyA9IHZlYzMoIG14X2Zsb29yZnJhYyggcC54LCBYICksIG14X2Zsb29yZnJhYyggcC55LCBZICksIG14X2Zsb29yZnJhYyggcC56LCBaICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHNxZGlzdCA9IHZlYzMoIDFlNiwgMWU2LCAxZTYgKS50b1ZhcigpO1xyXG5cclxuXHRMb29wKCB7IHN0YXJ0OiAtIDEsIGVuZDogaW50KCAxICksIG5hbWU6ICd4JywgY29uZGl0aW9uOiAnPD0nIH0sICggeyB4IH0gKSA9PiB7XHJcblxyXG5cdFx0TG9vcCggeyBzdGFydDogLSAxLCBlbmQ6IGludCggMSApLCBuYW1lOiAneScsIGNvbmRpdGlvbjogJzw9JyB9LCAoIHsgeSB9ICkgPT4ge1xyXG5cclxuXHRcdFx0TG9vcCggeyBzdGFydDogLSAxLCBlbmQ6IGludCggMSApLCBuYW1lOiAneicsIGNvbmRpdGlvbjogJzw9JyB9LCAoIHsgeiB9ICkgPT4ge1xyXG5cclxuXHRcdFx0XHRjb25zdCBkaXN0ID0gZmxvYXQoIG14X3dvcmxleV9kaXN0YW5jZSggbG9jYWxwb3MsIHgsIHksIHosIFgsIFksIFosIGppdHRlciwgbWV0cmljICkgKS50b1ZhcigpO1xyXG5cclxuXHRcdFx0XHRJZiggZGlzdC5sZXNzVGhhbiggc3FkaXN0LnggKSwgKCkgPT4ge1xyXG5cclxuXHRcdFx0XHRcdHNxZGlzdC56LmFzc2lnbiggc3FkaXN0LnkgKTtcclxuXHRcdFx0XHRcdHNxZGlzdC55LmFzc2lnbiggc3FkaXN0LnggKTtcclxuXHRcdFx0XHRcdHNxZGlzdC54LmFzc2lnbiggZGlzdCApO1xyXG5cclxuXHRcdFx0XHR9ICkuRWxzZUlmKCBkaXN0Lmxlc3NUaGFuKCBzcWRpc3QueSApLCAoKSA9PiB7XHJcblxyXG5cdFx0XHRcdFx0c3FkaXN0LnouYXNzaWduKCBzcWRpc3QueSApO1xyXG5cdFx0XHRcdFx0c3FkaXN0LnkuYXNzaWduKCBkaXN0ICk7XHJcblxyXG5cdFx0XHRcdH0gKS5FbHNlSWYoIGRpc3QubGVzc1RoYW4oIHNxZGlzdC56ICksICgpID0+IHtcclxuXHJcblx0XHRcdFx0XHRzcWRpc3Quei5hc3NpZ24oIGRpc3QgKTtcclxuXHJcblx0XHRcdFx0fSApO1xyXG5cclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdH0gKTtcclxuXHJcblx0fSApO1xyXG5cclxuXHRJZiggbWV0cmljLmVxdWFsKCBpbnQoIDAgKSApLCAoKSA9PiB7XHJcblxyXG5cdFx0c3FkaXN0LmFzc2lnbiggc3FydCggc3FkaXN0ICkgKTtcclxuXHJcblx0fSApO1xyXG5cclxuXHRyZXR1cm4gc3FkaXN0O1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdteF93b3JsZXlfbm9pc2VfdmVjM18xJyxcclxuXHR0eXBlOiAndmVjMycsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICdwJywgdHlwZTogJ3ZlYzMnIH0sXHJcblx0XHR7IG5hbWU6ICdqaXR0ZXInLCB0eXBlOiAnZmxvYXQnIH0sXHJcblx0XHR7IG5hbWU6ICdtZXRyaWMnLCB0eXBlOiAnaW50JyB9XHJcblx0XVxyXG59ICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfd29ybGV5X25vaXNlX3ZlYzMgPSAvKkBfX1BVUkVfXyovIG92ZXJsb2FkaW5nRm4oIFsgbXhfd29ybGV5X25vaXNlX3ZlYzNfMCwgbXhfd29ybGV5X25vaXNlX3ZlYzNfMSBdICk7XHJcbiIsIi8vIFRocmVlLmpzIFRyYW5zcGlsZXJcclxuLy8gaHR0cHM6Ly9naXRodWIuY29tL0FjYWRlbXlTb2Z0d2FyZUZvdW5kYXRpb24vTWF0ZXJpYWxYL2Jsb2IvbWFpbi9saWJyYXJpZXMvc3RkbGliL2dlbmdsc2wvbGliL214X2hzdi5nbHNsXHJcblxyXG5pbXBvcnQgeyBpbnQsIGZsb2F0LCB2ZWMzLCBJZiwgRm4gfSBmcm9tICcuLi8uLi90c2wvVFNMQmFzZS5qcyc7XHJcbmltcG9ydCB7IGFkZCB9IGZyb20gJy4uLy4uL21hdGgvT3BlcmF0b3JOb2RlLmpzJztcclxuaW1wb3J0IHsgZmxvb3IsIHRydW5jLCBtYXgsIG1pbiB9IGZyb20gJy4uLy4uL21hdGgvTWF0aE5vZGUuanMnO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X2hzdnRvcmdiID0gLypAX19QVVJFX18qLyBGbiggKCBbIGhzdiBdICkgPT4ge1xyXG5cclxuXHRjb25zdCBzID0gaHN2Lnk7XHJcblx0Y29uc3QgdiA9IGhzdi56O1xyXG5cclxuXHRjb25zdCByZXN1bHQgPSB2ZWMzKCkudG9WYXIoKTtcclxuXHJcblx0SWYoIHMubGVzc1RoYW4oIDAuMDAwMSApLCAoKSA9PiB7XHJcblxyXG5cdFx0cmVzdWx0LmFzc2lnbiggdmVjMyggdiwgdiwgdiApICk7XHJcblxyXG5cdH0gKS5FbHNlKCAoKSA9PiB7XHJcblxyXG5cdFx0bGV0IGggPSBoc3YueDtcclxuXHRcdGggPSBoLnN1YiggZmxvb3IoIGggKSApLm11bCggNi4wICkudG9WYXIoKTsgLy8gVE9ETzogY2hlY2sgd2hhdCAudG9WYXIoKSBpcyBuZWVkZWQgaW4gbm9kZSBzeXN0ZW0gY2FjaGVcclxuXHRcdGNvbnN0IGhpID0gaW50KCB0cnVuYyggaCApICk7XHJcblx0XHRjb25zdCBmID0gaC5zdWIoIGZsb2F0KCBoaSApICk7XHJcblx0XHRjb25zdCBwID0gdi5tdWwoIHMub25lTWludXMoKSApO1xyXG5cdFx0Y29uc3QgcSA9IHYubXVsKCBzLm11bCggZiApLm9uZU1pbnVzKCkgKTtcclxuXHRcdGNvbnN0IHQgPSB2Lm11bCggcy5tdWwoIGYub25lTWludXMoKSApLm9uZU1pbnVzKCkgKTtcclxuXHJcblx0XHRJZiggaGkuZXF1YWwoIGludCggMCApICksICgpID0+IHtcclxuXHJcblx0XHRcdHJlc3VsdC5hc3NpZ24oIHZlYzMoIHYsIHQsIHAgKSApO1xyXG5cclxuXHRcdH0gKS5FbHNlSWYoIGhpLmVxdWFsKCBpbnQoIDEgKSApLCAoKSA9PiB7XHJcblxyXG5cdFx0XHRyZXN1bHQuYXNzaWduKCB2ZWMzKCBxLCB2LCBwICkgKTtcclxuXHJcblx0XHR9ICkuRWxzZUlmKCBoaS5lcXVhbCggaW50KCAyICkgKSwgKCkgPT4ge1xyXG5cclxuXHRcdFx0cmVzdWx0LmFzc2lnbiggdmVjMyggcCwgdiwgdCApICk7XHJcblxyXG5cdFx0fSApLkVsc2VJZiggaGkuZXF1YWwoIGludCggMyApICksICgpID0+IHtcclxuXHJcblx0XHRcdHJlc3VsdC5hc3NpZ24oIHZlYzMoIHAsIHEsIHYgKSApO1xyXG5cclxuXHRcdH0gKS5FbHNlSWYoIGhpLmVxdWFsKCBpbnQoIDQgKSApLCAoKSA9PiB7XHJcblxyXG5cdFx0XHRyZXN1bHQuYXNzaWduKCB2ZWMzKCB0LCBwLCB2ICkgKTtcclxuXHJcblx0XHR9ICkuRWxzZSggKCkgPT4ge1xyXG5cclxuXHRcdFx0cmVzdWx0LmFzc2lnbiggdmVjMyggdiwgcCwgcSApICk7XHJcblxyXG5cdFx0fSApO1xyXG5cclxuXHR9ICk7XHJcblxyXG5cdHJldHVybiByZXN1bHQ7XHJcblxyXG59ICkuc2V0TGF5b3V0KCB7XHJcblx0bmFtZTogJ214X2hzdnRvcmdiJyxcclxuXHR0eXBlOiAndmVjMycsXHJcblx0aW5wdXRzOiBbXHJcblx0XHR7IG5hbWU6ICdoc3YnLCB0eXBlOiAndmVjMycgfVxyXG5cdF1cclxufSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X3JnYnRvaHN2ID0gLypAX19QVVJFX18qLyBGbiggKCBbIGNfaW1tdXRhYmxlIF0gKSA9PiB7XHJcblxyXG5cdGNvbnN0IGMgPSB2ZWMzKCBjX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgciA9IGZsb2F0KCBjLnggKS50b1ZhcigpO1xyXG5cdGNvbnN0IGcgPSBmbG9hdCggYy55ICkudG9WYXIoKTtcclxuXHRjb25zdCBiID0gZmxvYXQoIGMueiApLnRvVmFyKCk7XHJcblx0Y29uc3QgbWluY29tcCA9IGZsb2F0KCBtaW4oIHIsIG1pbiggZywgYiApICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IG1heGNvbXAgPSBmbG9hdCggbWF4KCByLCBtYXgoIGcsIGIgKSApICkudG9WYXIoKTtcclxuXHRjb25zdCBkZWx0YSA9IGZsb2F0KCBtYXhjb21wLnN1YiggbWluY29tcCApICkudG9WYXIoKTtcclxuXHRjb25zdCBoID0gZmxvYXQoKS50b1ZhcigpLCBzID0gZmxvYXQoKS50b1ZhcigpLCB2ID0gZmxvYXQoKS50b1ZhcigpO1xyXG5cdHYuYXNzaWduKCBtYXhjb21wICk7XHJcblxyXG5cdElmKCBtYXhjb21wLmdyZWF0ZXJUaGFuKCAwLjAgKSwgKCkgPT4ge1xyXG5cclxuXHRcdHMuYXNzaWduKCBkZWx0YS5kaXYoIG1heGNvbXAgKSApO1xyXG5cclxuXHR9ICkuRWxzZSggKCkgPT4ge1xyXG5cclxuXHRcdHMuYXNzaWduKCAwLjAgKTtcclxuXHJcblx0fSApO1xyXG5cclxuXHRJZiggcy5sZXNzVGhhbkVxdWFsKCAwLjAgKSwgKCkgPT4ge1xyXG5cclxuXHRcdGguYXNzaWduKCAwLjAgKTtcclxuXHJcblx0fSApLkVsc2UoICgpID0+IHtcclxuXHJcblx0XHRJZiggci5ncmVhdGVyVGhhbkVxdWFsKCBtYXhjb21wICksICgpID0+IHtcclxuXHJcblx0XHRcdGguYXNzaWduKCBnLnN1YiggYiApLmRpdiggZGVsdGEgKSApO1xyXG5cclxuXHRcdH0gKS5FbHNlSWYoIGcuZ3JlYXRlclRoYW5FcXVhbCggbWF4Y29tcCApLCAoKSA9PiB7XHJcblxyXG5cdFx0XHRoLmFzc2lnbiggYWRkKCAyLjAsIGIuc3ViKCByICkuZGl2KCBkZWx0YSApICkgKTtcclxuXHJcblx0XHR9ICkuRWxzZSggKCkgPT4ge1xyXG5cclxuXHRcdFx0aC5hc3NpZ24oIGFkZCggNC4wLCByLnN1YiggZyApLmRpdiggZGVsdGEgKSApICk7XHJcblxyXG5cdFx0fSApO1xyXG5cclxuXHRcdGgubXVsQXNzaWduKCAxLjAgLyA2LjAgKTtcclxuXHJcblx0XHRJZiggaC5sZXNzVGhhbiggMC4wICksICgpID0+IHtcclxuXHJcblx0XHRcdGguYWRkQXNzaWduKCAxLjAgKTtcclxuXHJcblx0XHR9ICk7XHJcblxyXG5cdH0gKTtcclxuXHJcblx0cmV0dXJuIHZlYzMoIGgsIHMsIHYgKTtcclxuXHJcbn0gKS5zZXRMYXlvdXQoIHtcclxuXHRuYW1lOiAnbXhfcmdidG9oc3YnLFxyXG5cdHR5cGU6ICd2ZWMzJyxcclxuXHRpbnB1dHM6IFtcclxuXHRcdHsgbmFtZTogJ2MnLCB0eXBlOiAndmVjMycgfVxyXG5cdF1cclxufSApO1xyXG4iLCIvLyBUaHJlZS5qcyBUcmFuc3BpbGVyXHJcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9BY2FkZW15U29mdHdhcmVGb3VuZGF0aW9uL01hdGVyaWFsWC9ibG9iL21haW4vbGlicmFyaWVzL3N0ZGxpYi9nZW5nbHNsL2xpYi9teF90cmFuc2Zvcm1fY29sb3IuZ2xzbFxyXG5cclxuaW1wb3J0IHsgYnZlYzMsIHZlYzMsIEZuIH0gZnJvbSAnLi4vLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5pbXBvcnQgeyBncmVhdGVyVGhhbiB9IGZyb20gJy4uLy4uL21hdGgvT3BlcmF0b3JOb2RlLmpzJztcclxuaW1wb3J0IHsgbWF4LCBwb3csIG1peCB9IGZyb20gJy4uLy4uL21hdGgvTWF0aE5vZGUuanMnO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X3NyZ2JfdGV4dHVyZV90b19saW5fcmVjNzA5ID0gLypAX19QVVJFX18qLyBGbiggKCBbIGNvbG9yX2ltbXV0YWJsZSBdICkgPT4ge1xyXG5cclxuXHRjb25zdCBjb2xvciA9IHZlYzMoIGNvbG9yX2ltbXV0YWJsZSApLnRvVmFyKCk7XHJcblx0Y29uc3QgaXNBYm92ZSA9IGJ2ZWMzKCBncmVhdGVyVGhhbiggY29sb3IsIHZlYzMoIDAuMDQwNDUgKSApICkudG9WYXIoKTtcclxuXHRjb25zdCBsaW5TZWcgPSB2ZWMzKCBjb2xvci5kaXYoIDEyLjkyICkgKS50b1ZhcigpO1xyXG5cdGNvbnN0IHBvd1NlZyA9IHZlYzMoIHBvdyggbWF4KCBjb2xvci5hZGQoIHZlYzMoIDAuMDU1ICkgKSwgdmVjMyggMC4wICkgKS5kaXYoIDEuMDU1ICksIHZlYzMoIDIuNCApICkgKS50b1ZhcigpO1xyXG5cclxuXHRyZXR1cm4gbWl4KCBsaW5TZWcsIHBvd1NlZywgaXNBYm92ZSApO1xyXG5cclxufSApLnNldExheW91dCgge1xyXG5cdG5hbWU6ICdteF9zcmdiX3RleHR1cmVfdG9fbGluX3JlYzcwOScsXHJcblx0dHlwZTogJ3ZlYzMnLFxyXG5cdGlucHV0czogW1xyXG5cdFx0eyBuYW1lOiAnY29sb3InLCB0eXBlOiAndmVjMycgfVxyXG5cdF1cclxufSApO1xyXG4iLCJpbXBvcnQge1xyXG5cdG14X3Blcmxpbl9ub2lzZV9mbG9hdCwgbXhfcGVybGluX25vaXNlX3ZlYzMsXHJcblx0bXhfd29ybGV5X25vaXNlX2Zsb2F0IGFzIHdvcmxleV9ub2lzZV9mbG9hdCwgbXhfd29ybGV5X25vaXNlX3ZlYzIgYXMgd29ybGV5X25vaXNlX3ZlYzIsIG14X3dvcmxleV9ub2lzZV92ZWMzIGFzIHdvcmxleV9ub2lzZV92ZWMzLFxyXG5cdG14X2NlbGxfbm9pc2VfZmxvYXQgYXMgY2VsbF9ub2lzZV9mbG9hdCxcclxuXHRteF9mcmFjdGFsX25vaXNlX2Zsb2F0IGFzIGZyYWN0YWxfbm9pc2VfZmxvYXQsIG14X2ZyYWN0YWxfbm9pc2VfdmVjMiBhcyBmcmFjdGFsX25vaXNlX3ZlYzIsIG14X2ZyYWN0YWxfbm9pc2VfdmVjMyBhcyBmcmFjdGFsX25vaXNlX3ZlYzMsIG14X2ZyYWN0YWxfbm9pc2VfdmVjNCBhcyBmcmFjdGFsX25vaXNlX3ZlYzRcclxufSBmcm9tICcuL2xpYi9teF9ub2lzZS5qcyc7XHJcbmltcG9ydCB7IG14X2hzdnRvcmdiLCBteF9yZ2J0b2hzdiB9IGZyb20gJy4vbGliL214X2hzdi5qcyc7XHJcbmltcG9ydCB7IG14X3NyZ2JfdGV4dHVyZV90b19saW5fcmVjNzA5IH0gZnJvbSAnLi9saWIvbXhfdHJhbnNmb3JtX2NvbG9yLmpzJztcclxuaW1wb3J0IHsgbWl4LCBzbW9vdGhzdGVwIH0gZnJvbSAnLi4vbWF0aC9NYXRoTm9kZS5qcyc7XHJcbmltcG9ydCB7IHV2IH0gZnJvbSAnLi4vYWNjZXNzb3JzL1VWLmpzJztcclxuaW1wb3J0IHsgZmxvYXQsIHZlYzIsIHZlYzQsIGludCB9IGZyb20gJy4uL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbmV4cG9ydCBjb25zdCBteF9hYXN0ZXAgPSAoIHRocmVzaG9sZCwgdmFsdWUgKSA9PiB7XHJcblxyXG5cdHRocmVzaG9sZCA9IGZsb2F0KCB0aHJlc2hvbGQgKTtcclxuXHR2YWx1ZSA9IGZsb2F0KCB2YWx1ZSApO1xyXG5cclxuXHRjb25zdCBhZndpZHRoID0gdmVjMiggdmFsdWUuZEZkeCgpLCB2YWx1ZS5kRmR5KCkgKS5sZW5ndGgoKS5tdWwoIDAuNzA3MTA2NzgxMTg2NTQ3NTcgKTtcclxuXHJcblx0cmV0dXJuIHNtb290aHN0ZXAoIHRocmVzaG9sZC5zdWIoIGFmd2lkdGggKSwgdGhyZXNob2xkLmFkZCggYWZ3aWR0aCApLCB2YWx1ZSApO1xyXG5cclxufTtcclxuXHJcbmNvbnN0IF9yYW1wID0gKCBhLCBiLCB1diwgcCApID0+IG1peCggYSwgYiwgdXZbIHAgXS5jbGFtcCgpICk7XHJcbmV4cG9ydCBjb25zdCBteF9yYW1wbHIgPSAoIHZhbHVlbCwgdmFsdWVyLCB0ZXhjb29yZCA9IHV2KCkgKSA9PiBfcmFtcCggdmFsdWVsLCB2YWx1ZXIsIHRleGNvb3JkLCAneCcgKTtcclxuZXhwb3J0IGNvbnN0IG14X3JhbXB0YiA9ICggdmFsdWV0LCB2YWx1ZWIsIHRleGNvb3JkID0gdXYoKSApID0+IF9yYW1wKCB2YWx1ZXQsIHZhbHVlYiwgdGV4Y29vcmQsICd5JyApO1xyXG5cclxuY29uc3QgX3NwbGl0ID0gKCBhLCBiLCBjZW50ZXIsIHV2LCBwICkgPT4gbWl4KCBhLCBiLCBteF9hYXN0ZXAoIGNlbnRlciwgdXZbIHAgXSApICk7XHJcbmV4cG9ydCBjb25zdCBteF9zcGxpdGxyID0gKCB2YWx1ZWwsIHZhbHVlciwgY2VudGVyLCB0ZXhjb29yZCA9IHV2KCkgKSA9PiBfc3BsaXQoIHZhbHVlbCwgdmFsdWVyLCBjZW50ZXIsIHRleGNvb3JkLCAneCcgKTtcclxuZXhwb3J0IGNvbnN0IG14X3NwbGl0dGIgPSAoIHZhbHVldCwgdmFsdWViLCBjZW50ZXIsIHRleGNvb3JkID0gdXYoKSApID0+IF9zcGxpdCggdmFsdWV0LCB2YWx1ZWIsIGNlbnRlciwgdGV4Y29vcmQsICd5JyApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X3RyYW5zZm9ybV91diA9ICggdXZfc2NhbGUgPSAxLCB1dl9vZmZzZXQgPSAwLCB1dl9nZW8gPSB1digpICkgPT4gdXZfZ2VvLm11bCggdXZfc2NhbGUgKS5hZGQoIHV2X29mZnNldCApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X3NhZmVwb3dlciA9ICggaW4xLCBpbjIgPSAxICkgPT4ge1xyXG5cclxuXHRpbjEgPSBmbG9hdCggaW4xICk7XHJcblxyXG5cdHJldHVybiBpbjEuYWJzKCkucG93KCBpbjIgKS5tdWwoIGluMS5zaWduKCkgKTtcclxuXHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgbXhfY29udHJhc3QgPSAoIGlucHV0LCBhbW91bnQgPSAxLCBwaXZvdCA9IC41ICkgPT4gZmxvYXQoIGlucHV0ICkuc3ViKCBwaXZvdCApLm11bCggYW1vdW50ICkuYWRkKCBwaXZvdCApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X25vaXNlX2Zsb2F0ID0gKCB0ZXhjb29yZCA9IHV2KCksIGFtcGxpdHVkZSA9IDEsIHBpdm90ID0gMCApID0+IG14X3Blcmxpbl9ub2lzZV9mbG9hdCggdGV4Y29vcmQuY29udmVydCggJ3ZlYzJ8dmVjMycgKSApLm11bCggYW1wbGl0dWRlICkuYWRkKCBwaXZvdCApO1xyXG4vL2V4cG9ydCBjb25zdCBteF9ub2lzZV92ZWMyID0gKCB0ZXhjb29yZCA9IHV2KCksIGFtcGxpdHVkZSA9IDEsIHBpdm90ID0gMCApID0+IG14X3Blcmxpbl9ub2lzZV92ZWMzKCB0ZXhjb29yZC5jb252ZXJ0KCAndmVjMnx2ZWMzJyApICkubXVsKCBhbXBsaXR1ZGUgKS5hZGQoIHBpdm90ICk7XHJcbmV4cG9ydCBjb25zdCBteF9ub2lzZV92ZWMzID0gKCB0ZXhjb29yZCA9IHV2KCksIGFtcGxpdHVkZSA9IDEsIHBpdm90ID0gMCApID0+IG14X3Blcmxpbl9ub2lzZV92ZWMzKCB0ZXhjb29yZC5jb252ZXJ0KCAndmVjMnx2ZWMzJyApICkubXVsKCBhbXBsaXR1ZGUgKS5hZGQoIHBpdm90ICk7XHJcbmV4cG9ydCBjb25zdCBteF9ub2lzZV92ZWM0ID0gKCB0ZXhjb29yZCA9IHV2KCksIGFtcGxpdHVkZSA9IDEsIHBpdm90ID0gMCApID0+IHtcclxuXHJcblx0dGV4Y29vcmQgPSB0ZXhjb29yZC5jb252ZXJ0KCAndmVjMnx2ZWMzJyApOyAvLyBvdmVybG9hZGluZyB0eXBlXHJcblxyXG5cdGNvbnN0IG5vaXNlX3ZlYzQgPSB2ZWM0KCBteF9wZXJsaW5fbm9pc2VfdmVjMyggdGV4Y29vcmQgKSwgbXhfcGVybGluX25vaXNlX2Zsb2F0KCB0ZXhjb29yZC5hZGQoIHZlYzIoIDE5LCA3MyApICkgKSApO1xyXG5cclxuXHRyZXR1cm4gbm9pc2VfdmVjNC5tdWwoIGFtcGxpdHVkZSApLmFkZCggcGl2b3QgKTtcclxuXHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgbXhfd29ybGV5X25vaXNlX2Zsb2F0ID0gKCB0ZXhjb29yZCA9IHV2KCksIGppdHRlciA9IDEgKSA9PiB3b3JsZXlfbm9pc2VfZmxvYXQoIHRleGNvb3JkLmNvbnZlcnQoICd2ZWMyfHZlYzMnICksIGppdHRlciwgaW50KCAxICkgKTtcclxuZXhwb3J0IGNvbnN0IG14X3dvcmxleV9ub2lzZV92ZWMyID0gKCB0ZXhjb29yZCA9IHV2KCksIGppdHRlciA9IDEgKSA9PiB3b3JsZXlfbm9pc2VfdmVjMiggdGV4Y29vcmQuY29udmVydCggJ3ZlYzJ8dmVjMycgKSwgaml0dGVyLCBpbnQoIDEgKSApO1xyXG5leHBvcnQgY29uc3QgbXhfd29ybGV5X25vaXNlX3ZlYzMgPSAoIHRleGNvb3JkID0gdXYoKSwgaml0dGVyID0gMSApID0+IHdvcmxleV9ub2lzZV92ZWMzKCB0ZXhjb29yZC5jb252ZXJ0KCAndmVjMnx2ZWMzJyApLCBqaXR0ZXIsIGludCggMSApICk7XHJcblxyXG5leHBvcnQgY29uc3QgbXhfY2VsbF9ub2lzZV9mbG9hdCA9ICggdGV4Y29vcmQgPSB1digpICkgPT4gY2VsbF9ub2lzZV9mbG9hdCggdGV4Y29vcmQuY29udmVydCggJ3ZlYzJ8dmVjMycgKSApO1xyXG5cclxuZXhwb3J0IGNvbnN0IG14X2ZyYWN0YWxfbm9pc2VfZmxvYXQgPSAoIHBvc2l0aW9uID0gdXYoKSwgb2N0YXZlcyA9IDMsIGxhY3VuYXJpdHkgPSAyLCBkaW1pbmlzaCA9IC41LCBhbXBsaXR1ZGUgPSAxICkgPT4gZnJhY3RhbF9ub2lzZV9mbG9hdCggcG9zaXRpb24sIGludCggb2N0YXZlcyApLCBsYWN1bmFyaXR5LCBkaW1pbmlzaCApLm11bCggYW1wbGl0dWRlICk7XHJcbmV4cG9ydCBjb25zdCBteF9mcmFjdGFsX25vaXNlX3ZlYzIgPSAoIHBvc2l0aW9uID0gdXYoKSwgb2N0YXZlcyA9IDMsIGxhY3VuYXJpdHkgPSAyLCBkaW1pbmlzaCA9IC41LCBhbXBsaXR1ZGUgPSAxICkgPT4gZnJhY3RhbF9ub2lzZV92ZWMyKCBwb3NpdGlvbiwgaW50KCBvY3RhdmVzICksIGxhY3VuYXJpdHksIGRpbWluaXNoICkubXVsKCBhbXBsaXR1ZGUgKTtcclxuZXhwb3J0IGNvbnN0IG14X2ZyYWN0YWxfbm9pc2VfdmVjMyA9ICggcG9zaXRpb24gPSB1digpLCBvY3RhdmVzID0gMywgbGFjdW5hcml0eSA9IDIsIGRpbWluaXNoID0gLjUsIGFtcGxpdHVkZSA9IDEgKSA9PiBmcmFjdGFsX25vaXNlX3ZlYzMoIHBvc2l0aW9uLCBpbnQoIG9jdGF2ZXMgKSwgbGFjdW5hcml0eSwgZGltaW5pc2ggKS5tdWwoIGFtcGxpdHVkZSApO1xyXG5leHBvcnQgY29uc3QgbXhfZnJhY3RhbF9ub2lzZV92ZWM0ID0gKCBwb3NpdGlvbiA9IHV2KCksIG9jdGF2ZXMgPSAzLCBsYWN1bmFyaXR5ID0gMiwgZGltaW5pc2ggPSAuNSwgYW1wbGl0dWRlID0gMSApID0+IGZyYWN0YWxfbm9pc2VfdmVjNCggcG9zaXRpb24sIGludCggb2N0YXZlcyApLCBsYWN1bmFyaXR5LCBkaW1pbmlzaCApLm11bCggYW1wbGl0dWRlICk7XHJcblxyXG5leHBvcnQgeyBteF9oc3Z0b3JnYiwgbXhfcmdidG9oc3YsIG14X3NyZ2JfdGV4dHVyZV90b19saW5fcmVjNzA5IH07XHJcbiIsImltcG9ydCB7IHBvc2l0aW9uV29ybGQgfSBmcm9tICcuLi8uLi9hY2Nlc3NvcnMvUG9zaXRpb24uanMnO1xyXG5pbXBvcnQgeyBmbG9hdCwgRm4sIG1pbiwgbm9ybWFsaXplLCBzdWIsIHZlYzMgfSBmcm9tICcuLi8uLi90c2wvVFNMQmFzZS5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBjb21wdXRlcyBhIHBhcmFsbGF4IGNvcnJlY3RlZCBub3JtYWwgd2hpY2ggaXMgdXNlZCBmb3IgYm94LXByb2plY3RlZCBjdWJlIG1hcHBpbmcgKEJQQ0VNKS5cclxuICpcclxuICogUmVmZXJlbmNlOiB7QGxpbmsgaHR0cHM6Ly9kZXZsb2ctbWFydGluc2guYmxvZ3Nwb3QuY29tLzIwMTEvMDkvYm94LXByb2plY3RlZC1jdWJlLWVudmlyb25tZW50LW1hcHBpbmcuaHRtbH1cclxuICpcclxuICogYGBganNcclxuICogY29uc3QgdXZOb2RlID0gZ2V0UGFyYWxsYXhDb3JyZWN0Tm9ybWFsKCByZWZsZWN0VmVjdG9yLCB2ZWMzKCAyMDAsIDEwMCwgMTAwICksIHZlYzMoIDAsIC0gNTAsIDAgKSApO1xyXG4gKiBtYXRlcmlhbC5lbnZOb2RlID0gcG1yZW1UZXh0dXJlKCByZW5kZXJUYXJnZXQudGV4dHVyZSwgdXZOb2RlICk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAdHNsXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge05vZGU8dmVjMz59IG5vcm1hbCAtIFRoZSBub3JtYWwgdG8gY29ycmVjdC5cclxuICogQHBhcmFtIHtOb2RlPHZlYzM+fSBjdWJlU2l6ZSAtIFRoZSBjdWJlIHNpemUgc2hvdWxkIHJlZmxlY3QgdGhlIHNpemUgb2YgdGhlIGVudmlyb25tZW50IChCUENFTSBpcyB1c3VhbGx5IGFwcGxpZWQgaW4gY2xvc2VkIGVudmlyb25tZW50cyBsaWtlIHJvb21zKS5cclxuICogQHBhcmFtIHtOb2RlPHZlYzM+fSBjdWJlUG9zIC0gVGhlIGN1YmUgcG9zaXRpb24uXHJcbiAqIEByZXR1cm4ge05vZGU8dmVjMz59IFRoZSBwYXJhbGxheCBjb3JyZWN0ZWQgbm9ybWFsLlxyXG4gKi9cclxuY29uc3QgZ2V0UGFyYWxsYXhDb3JyZWN0Tm9ybWFsID0gLypAX19QVVJFX18qLyBGbiggKCBbIG5vcm1hbCwgY3ViZVNpemUsIGN1YmVQb3MgXSApID0+IHtcclxuXHJcblx0Y29uc3QgbkRpciA9IG5vcm1hbGl6ZSggbm9ybWFsICkudG9WYXIoKTtcclxuXHRjb25zdCByYm1heCA9IHN1YiggZmxvYXQoIDAuNSApLm11bCggY3ViZVNpemUuc3ViKCBjdWJlUG9zICkgKSwgcG9zaXRpb25Xb3JsZCApLmRpdiggbkRpciApLnRvVmFyKCk7XHJcblx0Y29uc3QgcmJtaW4gPSBzdWIoIGZsb2F0KCAtIDAuNSApLm11bCggY3ViZVNpemUuc3ViKCBjdWJlUG9zICkgKSwgcG9zaXRpb25Xb3JsZCApLmRpdiggbkRpciApLnRvVmFyKCk7XHJcblx0Y29uc3QgcmJtaW5tYXggPSB2ZWMzKCkudG9WYXIoKTtcclxuXHRyYm1pbm1heC54ID0gbkRpci54LmdyZWF0ZXJUaGFuKCBmbG9hdCggMCApICkuc2VsZWN0KCByYm1heC54LCByYm1pbi54ICk7XHJcblx0cmJtaW5tYXgueSA9IG5EaXIueS5ncmVhdGVyVGhhbiggZmxvYXQoIDAgKSApLnNlbGVjdCggcmJtYXgueSwgcmJtaW4ueSApO1xyXG5cdHJibWlubWF4LnogPSBuRGlyLnouZ3JlYXRlclRoYW4oIGZsb2F0KCAwICkgKS5zZWxlY3QoIHJibWF4LnosIHJibWluLnogKTtcclxuXHJcblx0Y29uc3QgY29ycmVjdGlvbiA9IG1pbiggbWluKCByYm1pbm1heC54LCByYm1pbm1heC55ICksIHJibWlubWF4LnogKS50b1ZhcigpO1xyXG5cdGNvbnN0IGJveEludGVyc2VjdGlvbiA9IHBvc2l0aW9uV29ybGQuYWRkKCBuRGlyLm11bCggY29ycmVjdGlvbiApICkudG9WYXIoKTtcclxuXHRyZXR1cm4gYm94SW50ZXJzZWN0aW9uLnN1YiggY3ViZVBvcyApO1xyXG5cclxufSApO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZ2V0UGFyYWxsYXhDb3JyZWN0Tm9ybWFsO1xyXG4iLCJpbXBvcnQgeyBGbiwgbXVsIH0gZnJvbSAnLi4vLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5cclxuY29uc3QgZ2V0U2hJcnJhZGlhbmNlQXQgPSAvKkBfX1BVUkVfXyovIEZuKCAoIFsgbm9ybWFsLCBzaENvZWZmaWNpZW50cyBdICkgPT4ge1xyXG5cclxuXHQvLyBub3JtYWwgaXMgYXNzdW1lZCB0byBoYXZlIHVuaXQgbGVuZ3RoXHJcblxyXG5cdGNvbnN0IHggPSBub3JtYWwueCwgeSA9IG5vcm1hbC55LCB6ID0gbm9ybWFsLno7XHJcblxyXG5cdC8vIGJhbmQgMFxyXG5cdGxldCByZXN1bHQgPSBzaENvZWZmaWNpZW50cy5lbGVtZW50KCAwICkubXVsKCAwLjg4NjIyNyApO1xyXG5cclxuXHQvLyBiYW5kIDFcclxuXHRyZXN1bHQgPSByZXN1bHQuYWRkKCBzaENvZWZmaWNpZW50cy5lbGVtZW50KCAxICkubXVsKCAyLjAgKiAwLjUxMTY2NCApLm11bCggeSApICk7XHJcblx0cmVzdWx0ID0gcmVzdWx0LmFkZCggc2hDb2VmZmljaWVudHMuZWxlbWVudCggMiApLm11bCggMi4wICogMC41MTE2NjQgKS5tdWwoIHogKSApO1xyXG5cdHJlc3VsdCA9IHJlc3VsdC5hZGQoIHNoQ29lZmZpY2llbnRzLmVsZW1lbnQoIDMgKS5tdWwoIDIuMCAqIDAuNTExNjY0ICkubXVsKCB4ICkgKTtcclxuXHJcblx0Ly8gYmFuZCAyXHJcblx0cmVzdWx0ID0gcmVzdWx0LmFkZCggc2hDb2VmZmljaWVudHMuZWxlbWVudCggNCApLm11bCggMi4wICogMC40MjkwNDMgKS5tdWwoIHggKS5tdWwoIHkgKSApO1xyXG5cdHJlc3VsdCA9IHJlc3VsdC5hZGQoIHNoQ29lZmZpY2llbnRzLmVsZW1lbnQoIDUgKS5tdWwoIDIuMCAqIDAuNDI5MDQzICkubXVsKCB5ICkubXVsKCB6ICkgKTtcclxuXHRyZXN1bHQgPSByZXN1bHQuYWRkKCBzaENvZWZmaWNpZW50cy5lbGVtZW50KCA2ICkubXVsKCB6Lm11bCggeiApLm11bCggMC43NDMxMjUgKS5zdWIoIDAuMjQ3NzA4ICkgKSApO1xyXG5cdHJlc3VsdCA9IHJlc3VsdC5hZGQoIHNoQ29lZmZpY2llbnRzLmVsZW1lbnQoIDcgKS5tdWwoIDIuMCAqIDAuNDI5MDQzICkubXVsKCB4ICkubXVsKCB6ICkgKTtcclxuXHRyZXN1bHQgPSByZXN1bHQuYWRkKCBzaENvZWZmaWNpZW50cy5lbGVtZW50KCA4ICkubXVsKCAwLjQyOTA0MyApLm11bCggbXVsKCB4LCB4ICkuc3ViKCBtdWwoIHksIHkgKSApICkgKTtcclxuXHJcblx0cmV0dXJuIHJlc3VsdDtcclxuXHJcbn0gKTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGdldFNoSXJyYWRpYW5jZUF0O1xyXG4iLCIvLyBjb25zdGFudHNcclxuZXhwb3J0ICogZnJvbSAnLi9jb3JlL2NvbnN0YW50cy5qcyc7XHJcblxyXG4vLyBjb3JlXHJcbmV4cG9ydCAqIGZyb20gJy4vY29yZS9Bc3NpZ25Ob2RlLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi9jb3JlL0F0dHJpYnV0ZU5vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2NvcmUvQnlwYXNzTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vY29yZS9DYWNoZU5vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2NvcmUvQ29udGV4dE5vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2NvcmUvSW5kZXhOb2RlLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi9jb3JlL1BhcmFtZXRlck5vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2NvcmUvUHJvcGVydHlOb2RlLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi9jb3JlL1N0YWNrTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vY29yZS9TdHJ1Y3ROb2RlLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi9jb3JlL1VuaWZvcm1Hcm91cE5vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2NvcmUvVW5pZm9ybU5vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2NvcmUvVmFyeWluZ05vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2NvcmUvT3V0cHV0U3RydWN0Tm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vY29yZS9NUlROb2RlLmpzJztcclxuXHJcbi8vIG1hdGhcclxuZXhwb3J0ICogZnJvbSAnLi9tYXRoL0hhc2guanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL21hdGgvTWF0aFV0aWxzLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi9tYXRoL1RyaU5vaXNlM0QuanMnO1xyXG5cclxuLy8gdXRpbHNcclxuZXhwb3J0ICogZnJvbSAnLi91dGlscy9FcXVpcmVjdFVWTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvRnVuY3Rpb25PdmVybG9hZGluZ05vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL0xvb3BOb2RlLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi91dGlscy9NYXRjYXBVVk5vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL01heE1pcExldmVsTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvT3NjaWxsYXRvcnMuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL1BhY2tpbmcuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL1JlbWFwTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvVVZVdGlscy5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvU3ByaXRlVXRpbHMuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL1ZpZXdwb3J0VXRpbHMuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL1JvdGF0ZU5vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL1Nwcml0ZVNoZWV0VVZOb2RlLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi91dGlscy9UaW1lci5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvVHJpcGxhbmFyVGV4dHVyZXNOb2RlLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi91dGlscy9SZWZsZWN0b3JOb2RlLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi91dGlscy9SVFROb2RlLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi91dGlscy9Qb3N0UHJvY2Vzc2luZ1V0aWxzLmpzJztcclxuXHJcbi8vIHRocmVlLmpzIHNoYWRpbmcgbGFuZ3VhZ2VcclxuZXhwb3J0ICogZnJvbSAnLi90c2wvVFNMQmFzZS5qcyc7XHJcblxyXG4vLyBhY2Nlc3NvcnNcclxuZXhwb3J0ICogZnJvbSAnLi9hY2Nlc3NvcnMvQWNjZXNzb3JzVXRpbHMuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2FjY2Vzc29ycy9BcnJheXMuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2FjY2Vzc29ycy9Vbmlmb3JtQXJyYXlOb2RlLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi9hY2Nlc3NvcnMvQml0YW5nZW50LmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi9hY2Nlc3NvcnMvQnVmZmVyQXR0cmlidXRlTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vYWNjZXNzb3JzL0J1ZmZlck5vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2FjY2Vzc29ycy9DYW1lcmEuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2FjY2Vzc29ycy9WZXJ0ZXhDb2xvck5vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2FjY2Vzc29ycy9DdWJlVGV4dHVyZU5vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2FjY2Vzc29ycy9JbnN0YW5jZU5vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2FjY2Vzc29ycy9JbnN0YW5jZWRNZXNoTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vYWNjZXNzb3JzL0JhdGNoTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vYWNjZXNzb3JzL01hdGVyaWFsTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vYWNjZXNzb3JzL01hdGVyaWFsUHJvcGVydGllcy5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vYWNjZXNzb3JzL01hdGVyaWFsUmVmZXJlbmNlTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vYWNjZXNzb3JzL1JlbmRlcmVyUmVmZXJlbmNlTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vYWNjZXNzb3JzL01vcnBoTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vYWNjZXNzb3JzL1RleHR1cmVCaWN1YmljLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi9hY2Nlc3NvcnMvTW9kZWxOb2RlLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi9hY2Nlc3NvcnMvTW9kZWxWaWV3UHJvamVjdGlvbk5vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2FjY2Vzc29ycy9Ob3JtYWwuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2FjY2Vzc29ycy9PYmplY3QzRE5vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2FjY2Vzc29ycy9Qb2ludFVWTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vYWNjZXNzb3JzL1Bvc2l0aW9uLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi9hY2Nlc3NvcnMvUmVmZXJlbmNlTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vYWNjZXNzb3JzL1JlZmxlY3RWZWN0b3IuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2FjY2Vzc29ycy9Ta2lubmluZ05vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2FjY2Vzc29ycy9TY2VuZU5vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2FjY2Vzc29ycy9TdG9yYWdlQnVmZmVyTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vYWNjZXNzb3JzL1RhbmdlbnQuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2FjY2Vzc29ycy9UZXh0dXJlTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vYWNjZXNzb3JzL1RleHR1cmVTaXplTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vYWNjZXNzb3JzL1N0b3JhZ2VUZXh0dXJlTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vYWNjZXNzb3JzL1RleHR1cmUzRE5vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2FjY2Vzc29ycy9VVi5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vYWNjZXNzb3JzL1VzZXJEYXRhTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vYWNjZXNzb3JzL1ZlbG9jaXR5Tm9kZS5qcyc7XHJcblxyXG4vLyBkaXNwbGF5XHJcbmV4cG9ydCAqIGZyb20gJy4vZGlzcGxheS9CbGVuZE1vZGVzLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi9kaXNwbGF5L0J1bXBNYXBOb2RlLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi9kaXNwbGF5L0NvbG9yQWRqdXN0bWVudC5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vZGlzcGxheS9Db2xvclNwYWNlTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vZGlzcGxheS9Gcm9udEZhY2luZ05vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2Rpc3BsYXkvTm9ybWFsTWFwTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vZGlzcGxheS9Qb3N0ZXJpemVOb2RlLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi9kaXNwbGF5L1RvbmVNYXBwaW5nTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vZGlzcGxheS9TY3JlZW5Ob2RlLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi9kaXNwbGF5L1ZpZXdwb3J0VGV4dHVyZU5vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2Rpc3BsYXkvVmlld3BvcnRTaGFyZWRUZXh0dXJlTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vZGlzcGxheS9WaWV3cG9ydERlcHRoVGV4dHVyZU5vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2Rpc3BsYXkvVmlld3BvcnREZXB0aE5vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2Rpc3BsYXkvUmVuZGVyT3V0cHV0Tm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vZGlzcGxheS9Ub29uT3V0bGluZVBhc3NOb2RlLmpzJztcclxuXHJcbmV4cG9ydCAqIGZyb20gJy4vZGlzcGxheS9QYXNzTm9kZS5qcyc7XHJcblxyXG5leHBvcnQgKiBmcm9tICcuL2Rpc3BsYXkvQ29sb3JTcGFjZUZ1bmN0aW9ucy5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vZGlzcGxheS9Ub25lTWFwcGluZ0Z1bmN0aW9ucy5qcyc7XHJcblxyXG4vLyBjb2RlXHJcbmV4cG9ydCAqIGZyb20gJy4vY29kZS9FeHByZXNzaW9uTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vY29kZS9Db2RlTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vY29kZS9GdW5jdGlvbkNhbGxOb2RlLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi9jb2RlL0Z1bmN0aW9uTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vY29kZS9TY3JpcHRhYmxlTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vY29kZS9TY3JpcHRhYmxlVmFsdWVOb2RlLmpzJztcclxuXHJcbi8vIGZvZ1xyXG5leHBvcnQgKiBmcm9tICcuL2ZvZy9Gb2cuanMnO1xyXG5cclxuLy8gZ2VvbWV0cnlcclxuZXhwb3J0ICogZnJvbSAnLi9nZW9tZXRyeS9SYW5nZU5vZGUuanMnO1xyXG5cclxuLy8gZ3BncHVcclxuZXhwb3J0ICogZnJvbSAnLi9ncGdwdS9Db21wdXRlTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vZ3BncHUvQ29tcHV0ZUJ1aWx0aW5Ob2RlLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi9ncGdwdS9CYXJyaWVyTm9kZS5qcyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vZ3BncHUvV29ya2dyb3VwSW5mb05vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2dwZ3B1L0F0b21pY0Z1bmN0aW9uTm9kZS5qcyc7XHJcblxyXG4vLyBsaWdodGluZ1xyXG5leHBvcnQgKiBmcm9tICcuL2FjY2Vzc29ycy9MaWdodHMuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpZ2h0aW5nL0xpZ2h0c05vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpZ2h0aW5nL0xpZ2h0aW5nQ29udGV4dE5vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpZ2h0aW5nL1NoYWRvd0Jhc2VOb2RlLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWdodGluZy9TaGFkb3dOb2RlLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWdodGluZy9Qb2ludFNoYWRvd05vZGUuanMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpZ2h0aW5nL1BvaW50TGlnaHROb2RlLmpzJztcclxuXHJcbi8vIHBtcmVtXHJcbmV4cG9ydCAqIGZyb20gJy4vcG1yZW0vUE1SRU1Ob2RlLmpzJztcclxuZXhwb3J0ICogZnJvbSAnLi9wbXJlbS9QTVJFTVV0aWxzLmpzJztcclxuXHJcbi8vIHByb2NlZHVyYWxcclxuZXhwb3J0ICogZnJvbSAnLi9wcm9jZWR1cmFsL0NoZWNrZXIuanMnO1xyXG5cclxuLy8gc2hhcGVzXHJcbmV4cG9ydCAqIGZyb20gJy4vc2hhcGVzL1NoYXBlcy5qcyc7XHJcblxyXG4vLyBtYXRlcmlhbFhcclxuZXhwb3J0ICogZnJvbSAnLi9tYXRlcmlhbHgvTWF0ZXJpYWxYTm9kZXMuanMnO1xyXG5cclxuLy8gZnVuY3Rpb25zXHJcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQlJERl9HR1ggfSBmcm9tICcuL2Z1bmN0aW9ucy9CU0RGL0JSREZfR0dYLmpzJztcclxuZXhwb3J0IHsgZGVmYXVsdCBhcyBCUkRGX0xhbWJlcnQgfSBmcm9tICcuL2Z1bmN0aW9ucy9CU0RGL0JSREZfTGFtYmVydC5qcyc7XHJcbmV4cG9ydCB7IGRlZmF1bHQgYXMgRF9HR1ggfSBmcm9tICcuL2Z1bmN0aW9ucy9CU0RGL0RfR0dYLmpzJztcclxuZXhwb3J0IHsgZGVmYXVsdCBhcyBERkdBcHByb3ggfSBmcm9tICcuL2Z1bmN0aW9ucy9CU0RGL0RGR0FwcHJveC5qcyc7XHJcbmV4cG9ydCB7IGRlZmF1bHQgYXMgRl9TY2hsaWNrIH0gZnJvbSAnLi9mdW5jdGlvbnMvQlNERi9GX1NjaGxpY2suanMnO1xyXG5leHBvcnQgeyBkZWZhdWx0IGFzIFNjaGxpY2tfdG9fRjAgfSBmcm9tICcuL2Z1bmN0aW9ucy9CU0RGL1NjaGxpY2tfdG9fRjAuanMnO1xyXG5leHBvcnQgeyBkZWZhdWx0IGFzIFZfR0dYX1NtaXRoQ29ycmVsYXRlZCB9IGZyb20gJy4vZnVuY3Rpb25zL0JTREYvVl9HR1hfU21pdGhDb3JyZWxhdGVkLmpzJztcclxuXHJcbmV4cG9ydCAqIGZyb20gJy4vbGlnaHRpbmcvTGlnaHRVdGlscy5qcyc7XHJcblxyXG5leHBvcnQgeyBkZWZhdWx0IGFzIGdldEdlb21ldHJ5Um91Z2huZXNzIH0gZnJvbSAnLi9mdW5jdGlvbnMvbWF0ZXJpYWwvZ2V0R2VvbWV0cnlSb3VnaG5lc3MuanMnO1xyXG5leHBvcnQgeyBkZWZhdWx0IGFzIGdldFBhcmFsbGF4Q29ycmVjdE5vcm1hbCB9IGZyb20gJy4vZnVuY3Rpb25zL21hdGVyaWFsL2dldFBhcmFsbGF4Q29ycmVjdE5vcm1hbC5qcyc7XHJcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZ2V0Um91Z2huZXNzIH0gZnJvbSAnLi9mdW5jdGlvbnMvbWF0ZXJpYWwvZ2V0Um91Z2huZXNzLmpzJztcclxuZXhwb3J0IHsgZGVmYXVsdCBhcyBnZXRTaElycmFkaWFuY2VBdCB9IGZyb20gJy4vZnVuY3Rpb25zL21hdGVyaWFsL2dldFNoSXJyYWRpYW5jZUF0LmpzJztcclxuIiwiaW1wb3J0IERhdGFNYXAgZnJvbSAnLi9EYXRhTWFwLmpzJztcclxuaW1wb3J0IENvbG9yNCBmcm9tICcuL0NvbG9yNC5qcyc7XHJcbmltcG9ydCB7IHZlYzQsIGNvbnRleHQsIG5vcm1hbFdvcmxkLCBiYWNrZ3JvdW5kQmx1cnJpbmVzcywgYmFja2dyb3VuZEludGVuc2l0eSwgYmFja2dyb3VuZFJvdGF0aW9uLCBtb2RlbFZpZXdQcm9qZWN0aW9uIH0gZnJvbSAnLi4vLi4vbm9kZXMvVFNMLmpzJztcclxuaW1wb3J0IE5vZGVNYXRlcmlhbCBmcm9tICcuLi8uLi9tYXRlcmlhbHMvbm9kZXMvTm9kZU1hdGVyaWFsLmpzJztcclxuXHJcbmltcG9ydCB7IE1lc2ggfSBmcm9tICcuLi8uLi9vYmplY3RzL01lc2guanMnO1xyXG5pbXBvcnQgeyBTcGhlcmVHZW9tZXRyeSB9IGZyb20gJy4uLy4uL2dlb21ldHJpZXMvU3BoZXJlR2VvbWV0cnkuanMnO1xyXG5pbXBvcnQgeyBCYWNrU2lkZSB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcblxyXG5jb25zdCBfY2xlYXJDb2xvciA9IC8qQF9fUFVSRV9fKi8gbmV3IENvbG9yNCgpO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgcmVuZGVyZXIgbW9kdWxlIG1hbmFnZXMgdGhlIGJhY2tncm91bmQuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBhdWdtZW50cyBEYXRhTWFwXHJcbiAqL1xyXG5jbGFzcyBCYWNrZ3JvdW5kIGV4dGVuZHMgRGF0YU1hcCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYmFja2dyb3VuZCBtYW5hZ2VtZW50IGNvbXBvbmVudC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7Tm9kZXN9IG5vZGVzIC0gUmVuZGVyZXIgY29tcG9uZW50IGZvciBtYW5hZ2luZyBub2RlcyByZWxhdGVkIGxvZ2ljLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCByZW5kZXJlciwgbm9kZXMgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByZW5kZXJlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7UmVuZGVyZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlbmRlcmVyIGNvbXBvbmVudCBmb3IgbWFuYWdpbmcgbm9kZXMgcmVsYXRlZCBsb2dpYy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZXN9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9kZXMgPSBub2RlcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoZSBiYWNrZ3JvdW5kIGZvciB0aGUgZ2l2ZW4gc2NlbmUuIERlcGVuZGluZyBvbiBob3cgYFNjZW5lLmJhY2tncm91bmRgXHJcblx0ICogb3IgYFNjZW5lLmJhY2tncm91bmROb2RlYCBhcmUgY29uZmlndXJlZCwgdGhpcyBtZXRob2QgbWlnaHQgY29uZmlndXJlIGEgc2ltcGxlIGNsZWFyXHJcblx0ICogb3IgYWRkIGEgbWVzaCB0byB0aGUgcmVuZGVyIGxpc3QgZm9yIHJlbmRlcmluZyB0aGUgYmFja2dyb3VuZCBhcyBhIHRleHR1cmVkIHBsYW5lXHJcblx0ICogb3Igc2t5Ym94LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTY2VuZX0gc2NlbmUgLSBUaGUgc2NlbmUuXHJcblx0ICogQHBhcmFtIHtSZW5kZXJMaXN0fSByZW5kZXJMaXN0IC0gVGhlIGN1cnJlbnQgcmVuZGVyIGxpc3QuXHJcblx0ICogQHBhcmFtIHtSZW5kZXJDb250ZXh0fSByZW5kZXJDb250ZXh0IC0gVGhlIGN1cnJlbnQgcmVuZGVyIGNvbnRleHQuXHJcblx0ICovXHJcblx0dXBkYXRlKCBzY2VuZSwgcmVuZGVyTGlzdCwgcmVuZGVyQ29udGV4dCApIHtcclxuXHJcblx0XHRjb25zdCByZW5kZXJlciA9IHRoaXMucmVuZGVyZXI7XHJcblx0XHRjb25zdCBiYWNrZ3JvdW5kID0gdGhpcy5ub2Rlcy5nZXRCYWNrZ3JvdW5kTm9kZSggc2NlbmUgKSB8fCBzY2VuZS5iYWNrZ3JvdW5kO1xyXG5cclxuXHRcdGxldCBmb3JjZUNsZWFyID0gZmFsc2U7XHJcblxyXG5cdFx0aWYgKCBiYWNrZ3JvdW5kID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0Ly8gbm8gYmFja2dyb3VuZCBzZXR0aW5ncywgdXNlIGNsZWFyIGNvbG9yIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgcmVuZGVyZXJcclxuXHJcblx0XHRcdHJlbmRlcmVyLl9jbGVhckNvbG9yLmdldFJHQiggX2NsZWFyQ29sb3IgKTtcclxuXHRcdFx0X2NsZWFyQ29sb3IuYSA9IHJlbmRlcmVyLl9jbGVhckNvbG9yLmE7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggYmFja2dyb3VuZC5pc0NvbG9yID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0Ly8gYmFja2dyb3VuZCBpcyBhbiBvcGFxdWUgY29sb3JcclxuXHJcblx0XHRcdGJhY2tncm91bmQuZ2V0UkdCKCBfY2xlYXJDb2xvciApO1xyXG5cdFx0XHRfY2xlYXJDb2xvci5hID0gMTtcclxuXHJcblx0XHRcdGZvcmNlQ2xlYXIgPSB0cnVlO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGJhY2tncm91bmQuaXNOb2RlID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgc2NlbmVEYXRhID0gdGhpcy5nZXQoIHNjZW5lICk7XHJcblx0XHRcdGNvbnN0IGJhY2tncm91bmROb2RlID0gYmFja2dyb3VuZDtcclxuXHJcblx0XHRcdF9jbGVhckNvbG9yLmNvcHkoIHJlbmRlcmVyLl9jbGVhckNvbG9yICk7XHJcblxyXG5cdFx0XHRsZXQgYmFja2dyb3VuZE1lc2ggPSBzY2VuZURhdGEuYmFja2dyb3VuZE1lc2g7XHJcblxyXG5cdFx0XHRpZiAoIGJhY2tncm91bmRNZXNoID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGJhY2tncm91bmRNZXNoTm9kZSA9IGNvbnRleHQoIHZlYzQoIGJhY2tncm91bmROb2RlICkubXVsKCBiYWNrZ3JvdW5kSW50ZW5zaXR5ICksIHtcclxuXHRcdFx0XHRcdC8vIEBUT0RPOiBBZGQgVGV4dHVyZTJEIHN1cHBvcnQgdXNpbmcgbm9kZSBjb250ZXh0XHJcblx0XHRcdFx0XHRnZXRVVjogKCkgPT4gYmFja2dyb3VuZFJvdGF0aW9uLm11bCggbm9ybWFsV29ybGQgKSxcclxuXHRcdFx0XHRcdGdldFRleHR1cmVMZXZlbDogKCkgPT4gYmFja2dyb3VuZEJsdXJyaW5lc3NcclxuXHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRcdGxldCB2aWV3UHJvaiA9IG1vZGVsVmlld1Byb2plY3Rpb247XHJcblx0XHRcdFx0dmlld1Byb2ogPSB2aWV3UHJvai5zZXRaKCB2aWV3UHJvai53ICk7XHJcblxyXG5cdFx0XHRcdGNvbnN0IG5vZGVNYXRlcmlhbCA9IG5ldyBOb2RlTWF0ZXJpYWwoKTtcclxuXHRcdFx0XHRub2RlTWF0ZXJpYWwubmFtZSA9ICdCYWNrZ3JvdW5kLm1hdGVyaWFsJztcclxuXHRcdFx0XHRub2RlTWF0ZXJpYWwuc2lkZSA9IEJhY2tTaWRlO1xyXG5cdFx0XHRcdG5vZGVNYXRlcmlhbC5kZXB0aFRlc3QgPSBmYWxzZTtcclxuXHRcdFx0XHRub2RlTWF0ZXJpYWwuZGVwdGhXcml0ZSA9IGZhbHNlO1xyXG5cdFx0XHRcdG5vZGVNYXRlcmlhbC5hbGxvd092ZXJyaWRlID0gZmFsc2U7XHJcblx0XHRcdFx0bm9kZU1hdGVyaWFsLmZvZyA9IGZhbHNlO1xyXG5cdFx0XHRcdG5vZGVNYXRlcmlhbC5saWdodHMgPSBmYWxzZTtcclxuXHRcdFx0XHRub2RlTWF0ZXJpYWwudmVydGV4Tm9kZSA9IHZpZXdQcm9qO1xyXG5cdFx0XHRcdG5vZGVNYXRlcmlhbC5jb2xvck5vZGUgPSBiYWNrZ3JvdW5kTWVzaE5vZGU7XHJcblxyXG5cdFx0XHRcdHNjZW5lRGF0YS5iYWNrZ3JvdW5kTWVzaE5vZGUgPSBiYWNrZ3JvdW5kTWVzaE5vZGU7XHJcblx0XHRcdFx0c2NlbmVEYXRhLmJhY2tncm91bmRNZXNoID0gYmFja2dyb3VuZE1lc2ggPSBuZXcgTWVzaCggbmV3IFNwaGVyZUdlb21ldHJ5KCAxLCAzMiwgMzIgKSwgbm9kZU1hdGVyaWFsICk7XHJcblx0XHRcdFx0YmFja2dyb3VuZE1lc2guZnJ1c3R1bUN1bGxlZCA9IGZhbHNlO1xyXG5cdFx0XHRcdGJhY2tncm91bmRNZXNoLm5hbWUgPSAnQmFja2dyb3VuZC5tZXNoJztcclxuXHJcblx0XHRcdFx0YmFja2dyb3VuZE1lc2gub25CZWZvcmVSZW5kZXIgPSBmdW5jdGlvbiAoIHJlbmRlcmVyLCBzY2VuZSwgY2FtZXJhICkge1xyXG5cclxuXHRcdFx0XHRcdHRoaXMubWF0cml4V29ybGQuY29weVBvc2l0aW9uKCBjYW1lcmEubWF0cml4V29ybGQgKTtcclxuXHJcblx0XHRcdFx0fTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IGJhY2tncm91bmRDYWNoZUtleSA9IGJhY2tncm91bmROb2RlLmdldENhY2hlS2V5KCk7XHJcblxyXG5cdFx0XHRpZiAoIHNjZW5lRGF0YS5iYWNrZ3JvdW5kQ2FjaGVLZXkgIT09IGJhY2tncm91bmRDYWNoZUtleSApIHtcclxuXHJcblx0XHRcdFx0c2NlbmVEYXRhLmJhY2tncm91bmRNZXNoTm9kZS5ub2RlID0gdmVjNCggYmFja2dyb3VuZE5vZGUgKS5tdWwoIGJhY2tncm91bmRJbnRlbnNpdHkgKTtcclxuXHRcdFx0XHRzY2VuZURhdGEuYmFja2dyb3VuZE1lc2hOb2RlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0YmFja2dyb3VuZE1lc2gubWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHRzY2VuZURhdGEuYmFja2dyb3VuZENhY2hlS2V5ID0gYmFja2dyb3VuZENhY2hlS2V5O1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmVuZGVyTGlzdC51bnNoaWZ0KCBiYWNrZ3JvdW5kTWVzaCwgYmFja2dyb3VuZE1lc2guZ2VvbWV0cnksIGJhY2tncm91bmRNZXNoLm1hdGVyaWFsLCAwLCAwLCBudWxsLCBudWxsICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5SZW5kZXJlcjogVW5zdXBwb3J0ZWQgYmFja2dyb3VuZCBjb25maWd1cmF0aW9uLicsIGJhY2tncm91bmQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCBlbnZpcm9ubWVudEJsZW5kTW9kZSA9IHJlbmRlcmVyLnhyLmdldEVudmlyb25tZW50QmxlbmRNb2RlKCk7XHJcblxyXG5cdFx0aWYgKCBlbnZpcm9ubWVudEJsZW5kTW9kZSA9PT0gJ2FkZGl0aXZlJyApIHtcclxuXHJcblx0XHRcdF9jbGVhckNvbG9yLnNldCggMCwgMCwgMCwgMSApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGVudmlyb25tZW50QmxlbmRNb2RlID09PSAnYWxwaGEtYmxlbmQnICkge1xyXG5cclxuXHRcdFx0X2NsZWFyQ29sb3Iuc2V0KCAwLCAwLCAwLCAwICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0aWYgKCByZW5kZXJlci5hdXRvQ2xlYXIgPT09IHRydWUgfHwgZm9yY2VDbGVhciA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdGNvbnN0IGNsZWFyQ29sb3JWYWx1ZSA9IHJlbmRlckNvbnRleHQuY2xlYXJDb2xvclZhbHVlO1xyXG5cclxuXHRcdFx0Y2xlYXJDb2xvclZhbHVlLnIgPSBfY2xlYXJDb2xvci5yO1xyXG5cdFx0XHRjbGVhckNvbG9yVmFsdWUuZyA9IF9jbGVhckNvbG9yLmc7XHJcblx0XHRcdGNsZWFyQ29sb3JWYWx1ZS5iID0gX2NsZWFyQ29sb3IuYjtcclxuXHRcdFx0Y2xlYXJDb2xvclZhbHVlLmEgPSBfY2xlYXJDb2xvci5hO1xyXG5cclxuXHRcdFx0Ly8gcHJlbXVsdGlwbHkgYWxwaGFcclxuXHJcblx0XHRcdGlmICggcmVuZGVyZXIuYmFja2VuZC5pc1dlYkdMQmFja2VuZCA9PT0gdHJ1ZSB8fCByZW5kZXJlci5hbHBoYSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0Y2xlYXJDb2xvclZhbHVlLnIgKj0gY2xlYXJDb2xvclZhbHVlLmE7XHJcblx0XHRcdFx0Y2xlYXJDb2xvclZhbHVlLmcgKj0gY2xlYXJDb2xvclZhbHVlLmE7XHJcblx0XHRcdFx0Y2xlYXJDb2xvclZhbHVlLmIgKj0gY2xlYXJDb2xvclZhbHVlLmE7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvL1xyXG5cclxuXHRcdFx0cmVuZGVyQ29udGV4dC5kZXB0aENsZWFyVmFsdWUgPSByZW5kZXJlci5fY2xlYXJEZXB0aDtcclxuXHRcdFx0cmVuZGVyQ29udGV4dC5zdGVuY2lsQ2xlYXJWYWx1ZSA9IHJlbmRlcmVyLl9jbGVhclN0ZW5jaWw7XHJcblxyXG5cdFx0XHRyZW5kZXJDb250ZXh0LmNsZWFyQ29sb3IgPSByZW5kZXJlci5hdXRvQ2xlYXJDb2xvciA9PT0gdHJ1ZTtcclxuXHRcdFx0cmVuZGVyQ29udGV4dC5jbGVhckRlcHRoID0gcmVuZGVyZXIuYXV0b0NsZWFyRGVwdGggPT09IHRydWU7XHJcblx0XHRcdHJlbmRlckNvbnRleHQuY2xlYXJTdGVuY2lsID0gcmVuZGVyZXIuYXV0b0NsZWFyU3RlbmNpbCA9PT0gdHJ1ZTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0cmVuZGVyQ29udGV4dC5jbGVhckNvbG9yID0gZmFsc2U7XHJcblx0XHRcdHJlbmRlckNvbnRleHQuY2xlYXJEZXB0aCA9IGZhbHNlO1xyXG5cdFx0XHRyZW5kZXJDb250ZXh0LmNsZWFyU3RlbmNpbCA9IGZhbHNlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQmFja2dyb3VuZDtcclxuIiwibGV0IF9pZCA9IDA7XHJcblxyXG4vKipcclxuICogQSBiaW5kIGdyb3VwIHJlcHJlc2VudHMgYSBjb2xsZWN0aW9uIG9mIGJpbmRpbmdzIGFuZCB0aHVzIGEgY29sbGVjdGlvblxyXG4gKiBvciByZXNvdXJjZXMuIEJpbmQgZ3JvdXBzIGFyZSBhc3NpZ25lZCB0byBwaXBlbGluZXMgdG8gcHJvdmlkZSB0aGVtXHJcbiAqIHdpdGggdGhlIHJlcXVpcmVkIHJlc291cmNlcyAobGlrZSB1bmlmb3JtIGJ1ZmZlcnMgb3IgdGV4dHVyZXMpLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuY2xhc3MgQmluZEdyb3VwIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBiaW5kIGdyb3VwLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgYmluZCBncm91cCdzIG5hbWUuXHJcblx0ICogQHBhcmFtIHtBcnJheTxCaW5kaW5nPn0gYmluZGluZ3MgLSBBbiBhcnJheSBvZiBiaW5kaW5ncy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgZ3JvdXAgaW5kZXguXHJcblx0ICogQHBhcmFtIHtBcnJheTxCaW5kaW5nPn0gYmluZGluZ3NSZWZlcmVuY2UgLSBBbiBhcnJheSBvZiByZWZlcmVuY2UgYmluZGluZ3MuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5hbWUgPSAnJywgYmluZGluZ3MgPSBbXSwgaW5kZXggPSAwLCBiaW5kaW5nc1JlZmVyZW5jZSA9IFtdICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGJpbmQgZ3JvdXAncyBuYW1lLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubmFtZSA9IG5hbWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBhcnJheSBvZiBiaW5kaW5ncy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8QmluZGluZz59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYmluZGluZ3MgPSBiaW5kaW5ncztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBncm91cCBpbmRleC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmluZGV4ID0gaW5kZXg7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBhcnJheSBvZiByZWZlcmVuY2UgYmluZGluZ3MuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PEJpbmRpbmc+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJpbmRpbmdzUmVmZXJlbmNlID0gYmluZGluZ3NSZWZlcmVuY2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZ3JvdXAncyBJRC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlkID0gX2lkICsrO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBCaW5kR3JvdXA7XHJcbiIsImltcG9ydCBCaW5kR3JvdXAgZnJvbSAnLi4vQmluZEdyb3VwLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIG1vZHVsZSByZXByZXNlbnRzIHRoZSBzdGF0ZSBvZiBhIG5vZGUgYnVpbGRlciBhZnRlciBpdCB3YXNcclxuICogdXNlZCB0byBidWlsZCB0aGUgbm9kZXMgZm9yIGEgcmVuZGVyIG9iamVjdC4gVGhlIHN0YXRlIGhvbGRzIHRoZVxyXG4gKiByZXN1bHRzIG9mIHRoZSBidWlsZCBmb3IgZnVydGhlciBwcm9jZXNzaW5nIGluIHRoZSByZW5kZXJlci5cclxuICpcclxuICogUmVuZGVyIG9iamVjdHMgd2l0aCBpZGVudGljYWwgY2FjaGUga2V5cyBzaGFyZSB0aGUgc2FtZSBub2RlIGJ1aWxkZXIgc3RhdGUuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5jbGFzcyBOb2RlQnVpbGRlclN0YXRlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBub2RlIGJ1aWxkZXIgc3RhdGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdmVydGV4U2hhZGVyIC0gVGhlIG5hdGl2ZSB2ZXJ0ZXggc2hhZGVyIGNvZGUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGZyYWdtZW50U2hhZGVyIC0gVGhlIG5hdGl2ZSBmcmFnbWVudCBzaGFkZXIgY29kZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gY29tcHV0ZVNoYWRlciAtIFRoZSBuYXRpdmUgY29tcHV0ZSBzaGFkZXIgY29kZS5cclxuXHQgKiBAcGFyYW0ge0FycmF5PE5vZGVBdHRyaWJ1dGU+fSBub2RlQXR0cmlidXRlcyAtIEFuIGFycmF5IG9mIG5vZGUgYXR0cmlidXRlcy5cclxuXHQgKiBAcGFyYW0ge0FycmF5PEJpbmRHcm91cD59IGJpbmRpbmdzIC0gQW4gYXJyYXkgb2YgYmluZCBncm91cHMuXHJcblx0ICogQHBhcmFtIHtBcnJheTxOb2RlPn0gdXBkYXRlTm9kZXMgLSBBbiBhcnJheSBvZiBub2RlcyB0aGF0IGltcGxlbWVudCB0aGVpciBgdXBkYXRlKClgIG1ldGhvZC5cclxuXHQgKiBAcGFyYW0ge0FycmF5PE5vZGU+fSB1cGRhdGVCZWZvcmVOb2RlcyAtIEFuIGFycmF5IG9mIG5vZGVzIHRoYXQgaW1wbGVtZW50IHRoZWlyIGB1cGRhdGVCZWZvcmUoKWAgbWV0aG9kLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8Tm9kZT59IHVwZGF0ZUFmdGVyTm9kZXMgLSBBbiBhcnJheSBvZiBub2RlcyB0aGF0IGltcGxlbWVudCB0aGVpciBgdXBkYXRlQWZ0ZXIoKWAgbWV0aG9kLlxyXG5cdCAqIEBwYXJhbSB7Tm9kZU1hdGVyaWFsT2JzZXJ2ZXJ9IG9ic2VydmVyIC0gQSBub2RlIG1hdGVyaWFsIG9ic2VydmVyLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8T2JqZWN0Pn0gdHJhbnNmb3JtcyAtIEFuIGFycmF5IHdpdGggdHJhbnNmb3JtIGF0dHJpYnV0ZSBvYmplY3RzLiBPbmx5IHJlbGV2YW50IHdoZW4gdXNpbmcgY29tcHV0ZSBzaGFkZXJzIHdpdGggV2ViR0wgMi5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggdmVydGV4U2hhZGVyLCBmcmFnbWVudFNoYWRlciwgY29tcHV0ZVNoYWRlciwgbm9kZUF0dHJpYnV0ZXMsIGJpbmRpbmdzLCB1cGRhdGVOb2RlcywgdXBkYXRlQmVmb3JlTm9kZXMsIHVwZGF0ZUFmdGVyTm9kZXMsIG9ic2VydmVyLCB0cmFuc2Zvcm1zID0gW10gKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbmF0aXZlIHZlcnRleCBzaGFkZXIgY29kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnZlcnRleFNoYWRlciA9IHZlcnRleFNoYWRlcjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBuYXRpdmUgZnJhZ21lbnQgc2hhZGVyIGNvZGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5mcmFnbWVudFNoYWRlciA9IGZyYWdtZW50U2hhZGVyO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG5hdGl2ZSBjb21wdXRlIHNoYWRlciBjb2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29tcHV0ZVNoYWRlciA9IGNvbXB1dGVTaGFkZXI7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBhcnJheSB3aXRoIHRyYW5zZm9ybSBhdHRyaWJ1dGUgb2JqZWN0cy5cclxuXHRcdCAqIE9ubHkgcmVsZXZhbnQgd2hlbiB1c2luZyBjb21wdXRlIHNoYWRlcnMgd2l0aCBXZWJHTCAyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxPYmplY3Q+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRyYW5zZm9ybXMgPSB0cmFuc2Zvcm1zO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQW4gYXJyYXkgb2Ygbm9kZSBhdHRyaWJ1dGVzIHJlcHJlc2VudGluZ1xyXG5cdFx0ICogdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIHNoYWRlcnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PE5vZGVBdHRyaWJ1dGU+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vZGVBdHRyaWJ1dGVzID0gbm9kZUF0dHJpYnV0ZXM7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBhcnJheSBvZiBiaW5kIGdyb3VwcyByZXByZXNlbnRpbmcgdGhlIHVuaWZvcm0gb3Igc3RvcmFnZVxyXG5cdFx0ICogYnVmZmVycywgdGV4dHVyZSBvciBzYW1wbGVycyBvZiB0aGUgc2hhZGVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxCaW5kR3JvdXA+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJpbmRpbmdzID0gYmluZGluZ3M7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBhcnJheSBvZiBub2RlcyB0aGF0IGltcGxlbWVudCB0aGVpciBgdXBkYXRlKClgIG1ldGhvZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8Tm9kZT59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXBkYXRlTm9kZXMgPSB1cGRhdGVOb2RlcztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIGFycmF5IG9mIG5vZGVzIHRoYXQgaW1wbGVtZW50IHRoZWlyIGB1cGRhdGVCZWZvcmUoKWAgbWV0aG9kLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxOb2RlPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51cGRhdGVCZWZvcmVOb2RlcyA9IHVwZGF0ZUJlZm9yZU5vZGVzO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQW4gYXJyYXkgb2Ygbm9kZXMgdGhhdCBpbXBsZW1lbnQgdGhlaXIgYHVwZGF0ZUFmdGVyKClgIG1ldGhvZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8Tm9kZT59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXBkYXRlQWZ0ZXJOb2RlcyA9IHVwZGF0ZUFmdGVyTm9kZXM7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIG5vZGUgbWF0ZXJpYWwgb2JzZXJ2ZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGVNYXRlcmlhbE9ic2VydmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm9ic2VydmVyID0gb2JzZXJ2ZXI7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3cgb2Z0ZW4gdGhpcyBzdGF0ZSBpcyB1c2VkIGJ5IHJlbmRlciBvYmplY3RzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXNlZFRpbWVzID0gMDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGNyZWF0ZSBhIGFycmF5IG9mIGJpbmQgZ3JvdXBzIGJhc2VkXHJcblx0ICogb24gdGhlIGV4aXN0aW5nIGJpbmQgZ3JvdXBzIG9mIHRoaXMgc3RhdGUuIFNoYXJlZCBncm91cHMgYXJlXHJcblx0ICogbm90IGNsb25lZC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0FycmF5PEJpbmRHcm91cD59IEEgYXJyYXkgb2YgYmluZCBncm91cHMuXHJcblx0ICovXHJcblx0Y3JlYXRlQmluZGluZ3MoKSB7XHJcblxyXG5cdFx0Y29uc3QgYmluZGluZ3MgPSBbXTtcclxuXHJcblx0XHRmb3IgKCBjb25zdCBpbnN0YW5jZUdyb3VwIG9mIHRoaXMuYmluZGluZ3MgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBzaGFyZWQgPSBpbnN0YW5jZUdyb3VwLmJpbmRpbmdzWyAwIF0uZ3JvdXBOb2RlLnNoYXJlZDsgLy8gQWxsIGJpbmRpbmdzIGluIHRoZSBncm91cCBtdXN0IGhhdmUgdGhlIHNhbWUgZ3JvdXBOb2RlLlxyXG5cclxuXHRcdFx0aWYgKCBzaGFyZWQgIT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGJpbmRpbmdzR3JvdXAgPSBuZXcgQmluZEdyb3VwKCBpbnN0YW5jZUdyb3VwLm5hbWUsIFtdLCBpbnN0YW5jZUdyb3VwLmluZGV4LCBpbnN0YW5jZUdyb3VwICk7XHJcblx0XHRcdFx0YmluZGluZ3MucHVzaCggYmluZGluZ3NHcm91cCApO1xyXG5cclxuXHRcdFx0XHRmb3IgKCBjb25zdCBpbnN0YW5jZUJpbmRpbmcgb2YgaW5zdGFuY2VHcm91cC5iaW5kaW5ncyApIHtcclxuXHJcblx0XHRcdFx0XHRiaW5kaW5nc0dyb3VwLmJpbmRpbmdzLnB1c2goIGluc3RhbmNlQmluZGluZy5jbG9uZSgpICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGJpbmRpbmdzLnB1c2goIGluc3RhbmNlR3JvdXAgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGJpbmRpbmdzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBOb2RlQnVpbGRlclN0YXRlO1xyXG4iLCIvKipcclxuICoge0BsaW5rIE5vZGVCdWlsZGVyfSBpcyBnb2luZyB0byBjcmVhdGUgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgZHVyaW5nIHRoZSBidWlsZCBwcm9jZXNzXHJcbiAqIG9mIG5vZGVzLiBUaGV5IHJlcHJlc2VudCB0aGUgZmluYWwgc2hhZGVyIGF0dHJpYnV0ZXMgdGhhdCBhcmUgZ29pbmcgdG8gYmUgZ2VuZXJhdGVkXHJcbiAqIGJ5IHRoZSBidWlsZGVyLiBBcnJheXMgb2Ygbm9kZSBhdHRyaWJ1dGVzIGlzIG1haW50YWluZWQgaW4ge0BsaW5rIE5vZGVCdWlsZGVyI2F0dHJpYnV0ZXN9XHJcbiAqIGFuZCB7QGxpbmsgTm9kZUJ1aWxkZXIjYnVmZmVyQXR0cmlidXRlc30gZm9yIHRoaXMgcHVycG9zZS5cclxuICovXHJcbmNsYXNzIE5vZGVBdHRyaWJ1dGUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG5vZGUgYXR0cmlidXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZS5cclxuXHQgKiBAcGFyYW0gez9Ob2RlfSBub2RlIC0gQW4gb3B0aW9uYWwgcmVmZXJlbmNlIHRvIHRoZSBub2RlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBuYW1lLCB0eXBlLCBub2RlID0gbnVsbCApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNOb2RlQXR0cmlidXRlID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5uYW1lID0gbmFtZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50eXBlID0gdHlwZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIG9wdGlvbmFsIHJlZmVyZW5jZSB0byB0aGUgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9kZSA9IG5vZGU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IE5vZGVBdHRyaWJ1dGU7XHJcbiIsIi8qKlxyXG4gKiB7QGxpbmsgTm9kZUJ1aWxkZXJ9IGlzIGdvaW5nIHRvIGNyZWF0ZSBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBkdXJpbmcgdGhlIGJ1aWxkIHByb2Nlc3NcclxuICogb2Ygbm9kZXMuIFRoZXkgcmVwcmVzZW50IHRoZSBmaW5hbCBzaGFkZXIgdW5pZm9ybXMgdGhhdCBhcmUgZ29pbmcgdG8gYmUgZ2VuZXJhdGVkXHJcbiAqIGJ5IHRoZSBidWlsZGVyLiBBIGRpY3Rpb25hcnkgb2Ygbm9kZSB1bmlmb3JtcyBpcyBtYWludGFpbmVkIGluIHtAbGluayBOb2RlQnVpbGRlciN1bmlmb3Jtc31cclxuICogZm9yIHRoaXMgcHVycG9zZS5cclxuICovXHJcbmNsYXNzIE5vZGVVbmlmb3JtIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBub2RlIHVuaWZvcm0uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB1bmlmb3JtLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIHR5cGUgb2YgdGhlIHVuaWZvcm0uXHJcblx0ICogQHBhcmFtIHtVbmlmb3JtTm9kZX0gbm9kZSAtIEFuIHJlZmVyZW5jZSB0byB0aGUgbm9kZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbmFtZSwgdHlwZSwgbm9kZSApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNOb2RlVW5pZm9ybSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbmFtZSBvZiB0aGUgdW5pZm9ybS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5hbWUgPSBuYW1lO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHR5cGUgb2YgdGhlIHVuaWZvcm0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50eXBlID0gdHlwZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIHJlZmVyZW5jZSB0byB0aGUgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VW5pZm9ybU5vZGV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9kZSA9IG5vZGUuZ2V0U2VsZigpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSB2YWx1ZSBvZiB0aGUgdW5pZm9ybSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge2FueX1cclxuXHQgKi9cclxuXHRnZXQgdmFsdWUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubm9kZS52YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHRzZXQgdmFsdWUoIHZhbCApIHtcclxuXHJcblx0XHR0aGlzLm5vZGUudmFsdWUgPSB2YWw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGlkIG9mIHRoZSB1bmlmb3JtIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdCAqL1xyXG5cdGdldCBpZCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5ub2RlLmlkO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSB1bmlmb3JtIG5vZGUncyBncm91cC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtVbmlmb3JtR3JvdXBOb2RlfVxyXG5cdCAqL1xyXG5cdGdldCBncm91cE5vZGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubm9kZS5ncm91cE5vZGU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IE5vZGVVbmlmb3JtO1xyXG4iLCIvKipcclxuICoge0BsaW5rIE5vZGVCdWlsZGVyfSBpcyBnb2luZyB0byBjcmVhdGUgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgZHVyaW5nIHRoZSBidWlsZCBwcm9jZXNzXHJcbiAqIG9mIG5vZGVzLiBUaGV5IHJlcHJlc2VudCB0aGUgZmluYWwgc2hhZGVyIHZhcmlhYmxlcyB0aGF0IGFyZSBnb2luZyB0byBiZSBnZW5lcmF0ZWRcclxuICogYnkgdGhlIGJ1aWxkZXIuIEEgZGljdGlvbmFyeSBvZiBub2RlIHZhcmlhYmxlcyBpcyBtYWludGFpbmVkIGluIHtAbGluayBOb2RlQnVpbGRlciN2YXJzfSBmb3JcclxuICogdGhpcyBwdXJwb3NlLlxyXG4gKi9cclxuY2xhc3MgTm9kZVZhciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbm9kZSB2YXJpYWJsZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIHR5cGUgb2YgdGhlIHZhcmlhYmxlLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JlYWRPbmx5PWZhbHNlXSAtIFRoZSByZWFkLW9ubHkgZmxhZy5cclxuXHQgKiBAcGFyYW0gez9udW1iZXJ9IFtjb3VudD1udWxsXSAtIFRoZSBzaXplLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBuYW1lLCB0eXBlLCByZWFkT25seSA9IGZhbHNlLCBjb3VudCA9IG51bGwgKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzTm9kZVZhciA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5uYW1lID0gbmFtZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB0eXBlIG9mIHRoZSB2YXJpYWJsZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnR5cGUgPSB0eXBlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogIFRoZSByZWFkLW9ubHkgZmxhZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yZWFkT25seSA9IHJlYWRPbmx5O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHNpemUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9udW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY291bnQgPSBjb3VudDtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTm9kZVZhcjtcclxuIiwiaW1wb3J0IE5vZGVWYXIgZnJvbSAnLi9Ob2RlVmFyLmpzJztcclxuXHJcbi8qKlxyXG4gKiB7QGxpbmsgTm9kZUJ1aWxkZXJ9IGlzIGdvaW5nIHRvIGNyZWF0ZSBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBkdXJpbmcgdGhlIGJ1aWxkIHByb2Nlc3NcclxuICogb2Ygbm9kZXMuIFRoZXkgcmVwcmVzZW50IHRoZSBmaW5hbCBzaGFkZXIgdmFyeWluZ3MgdGhhdCBhcmUgZ29pbmcgdG8gYmUgZ2VuZXJhdGVkXHJcbiAqIGJ5IHRoZSBidWlsZGVyLiBBbiBhcnJheSBvZiBub2RlIHZhcnlpbmdzIGlzIG1haW50YWluZWQgaW4ge0BsaW5rIE5vZGVCdWlsZGVyI3ZhcnlpbmdzfSBmb3JcclxuICogdGhpcyBwdXJwb3NlLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTm9kZVZhclxyXG4gKi9cclxuY2xhc3MgTm9kZVZhcnlpbmcgZXh0ZW5kcyBOb2RlVmFyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBub2RlIHZhcnlpbmcuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB2YXJ5aW5nLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIHR5cGUgb2YgdGhlIHZhcnlpbmcuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5hbWUsIHR5cGUgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5hbWUsIHR5cGUgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhpcyB2YXJ5aW5nIHJlcXVpcmVzIGludGVycG9sYXRpb24gb3Igbm90LiBUaGlzIHByb3BlcnR5IGNhbiBiZSB1c2VkXHJcblx0XHQgKiB0byBjaGVjayBpZiB0aGUgdmFyeWluZyBjYW4gYmUgb3B0aW1pemVkIGZvciBhIHZhcmlhYmxlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5uZWVkc0ludGVycG9sYXRpb24gPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNOb2RlVmFyeWluZyA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IE5vZGVWYXJ5aW5nO1xyXG4iLCIvKipcclxuICoge0BsaW5rIE5vZGVCdWlsZGVyfSBpcyBnb2luZyB0byBjcmVhdGUgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgZHVyaW5nIHRoZSBidWlsZCBwcm9jZXNzXHJcbiAqIG9mIG5vZGVzLiBUaGV5IHJlcHJlc2VudCB1c2VyLWRlZmluZWQsIG5hdGl2ZSBzaGFkZXIgY29kZSBwb3J0aW9ucyB0aGF0IGFyZSBnb2luZyB0byBiZVxyXG4gKiBpbmplY3RlZCBieSB0aGUgYnVpbGRlci4gQSBkaWN0aW9uYXJ5IG9mIG5vZGUgY29kZXMgaXMgbWFpbnRhaW5lZCBpbiB7QGxpbmsgTm9kZUJ1aWxkZXIjY29kZXN9XHJcbiAqIGZvciB0aGlzIHB1cnBvc2UuXHJcbiAqL1xyXG5jbGFzcyBOb2RlQ29kZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgY29kZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgY29kZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSBub2RlIHR5cGUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtjb2RlPScnXSAtIFRoZSBuYXRpdmUgc2hhZGVyIGNvZGUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5hbWUsIHR5cGUsIGNvZGUgPSAnJyApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBuYW1lIG9mIHRoZSBjb2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubmFtZSA9IG5hbWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbm9kZSB0eXBlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudHlwZSA9IHR5cGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbmF0aXZlIHNoYWRlciBjb2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKiBAZGVmYXVsdCAnJ1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvZGUgPSBjb2RlO1xyXG5cclxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ2lzTm9kZUNvZGUnLCB7IHZhbHVlOiB0cnVlIH0gKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTm9kZUNvZGU7XHJcbiIsImxldCBfaWQgPSAwO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgdXRpbGl0eSBjbGFzcyBpcyB1c2VkIGluIHtAbGluayBOb2RlQnVpbGRlcn0gYXMgYW4gaW50ZXJuYWxcclxuICogY2FjaGUgZGF0YSBzdHJ1Y3R1cmUgZm9yIG5vZGUgZGF0YS5cclxuICovXHJcbmNsYXNzIE5vZGVDYWNoZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbm9kZSBjYWNoZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7P05vZGVDYWNoZX0gcGFyZW50IC0gQSByZWZlcmVuY2UgdG8gYSBwYXJlbnQgY2FjaGUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHBhcmVudCA9IG51bGwgKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgaWQgb2YgdGhlIGNhY2hlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pZCA9IF9pZCArKztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgd2VhayBtYXAgZm9yIG1hbmFnaW5nIG5vZGUgZGF0YS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2Vha01hcDxOb2RlLCBPYmplY3Q+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vZGVzRGF0YSA9IG5ldyBXZWFrTWFwKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZWZlcmVuY2UgdG8gYSBwYXJlbnQgbm9kZSBjYWNoZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGVDYWNoZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wYXJlbnQgPSBwYXJlbnQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgZGF0YSBmb3IgdGhlIGdpdmVuIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBUaGUgbm9kZS5cclxuXHQgKiBAcmV0dXJuIHs/T2JqZWN0fSBUaGUgZGF0YSBmb3IgdGhlIG5vZGUuXHJcblx0ICovXHJcblx0Z2V0RGF0YSggbm9kZSApIHtcclxuXHJcblx0XHRsZXQgZGF0YSA9IHRoaXMubm9kZXNEYXRhLmdldCggbm9kZSApO1xyXG5cclxuXHRcdGlmICggZGF0YSA9PT0gdW5kZWZpbmVkICYmIHRoaXMucGFyZW50ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0ZGF0YSA9IHRoaXMucGFyZW50LmdldERhdGEoIG5vZGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGRhdGE7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZGF0YSBmb3IgYSBnaXZlbiBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIG5vZGUuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBUaGUgZGF0YSB0aGF0IHNob3VsZCBiZSBjYWNoZWQuXHJcblx0ICovXHJcblx0c2V0RGF0YSggbm9kZSwgZGF0YSApIHtcclxuXHJcblx0XHR0aGlzLm5vZGVzRGF0YS5zZXQoIG5vZGUsIGRhdGEgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTm9kZUNhY2hlO1xyXG4iLCJjbGFzcyBTdHJ1Y3RUeXBlIHtcclxuXHJcblx0Y29uc3RydWN0b3IoIG5hbWUsIG1lbWJlcnMgKSB7XHJcblxyXG5cdFx0dGhpcy5uYW1lID0gbmFtZTtcclxuXHRcdHRoaXMubWVtYmVycyA9IG1lbWJlcnM7XHJcblx0XHR0aGlzLm91dHB1dCA9IGZhbHNlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTdHJ1Y3RUeXBlO1xyXG4iLCJpbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uLy4uL21hdGgvQ29sb3IuanMnO1xyXG5pbXBvcnQgeyBNYXRyaXgyIH0gZnJvbSAnLi4vLi4vbWF0aC9NYXRyaXgyLmpzJztcclxuaW1wb3J0IHsgTWF0cml4MyB9IGZyb20gJy4uLy4uL21hdGgvTWF0cml4My5qcyc7XHJcbmltcG9ydCB7IE1hdHJpeDQgfSBmcm9tICcuLi8uLi9tYXRoL01hdHJpeDQuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IyIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IyLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMy5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjQgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjQuanMnO1xyXG5cclxuLyoqXHJcbiAqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHVuaWZvcm1zLlxyXG4gKlxyXG4gKiBAYWJzdHJhY3RcclxuICogQHByaXZhdGVcclxuICovXHJcbmNsYXNzIFVuaWZvcm0ge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHVuaWZvcm0uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSB1bmlmb3JtJ3MgbmFtZS5cclxuXHQgKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBUaGUgdW5pZm9ybSdzIHZhbHVlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBuYW1lLCB2YWx1ZSApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB1bmlmb3JtJ3MgbmFtZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5hbWUgPSBuYW1lO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHVuaWZvcm0ncyB2YWx1ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7YW55fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnZhbHVlID0gdmFsdWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBVc2VkIHRvIGJ1aWxkIHRoZSB1bmlmb3JtIGJ1ZmZlciBhY2NvcmRpbmcgdG8gdGhlIFNURDE0MCBsYXlvdXQuXHJcblx0XHQgKiBEZXJpdmVkIHVuaWZvcm1zIHdpbGwgc2V0IHRoaXMgcHJvcGVydHkgdG8gYSBkYXRhIHR5cGUgc3BlY2lmaWNcclxuXHRcdCAqIHZhbHVlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYm91bmRhcnkgPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGl0ZW0gc2l6ZS4gRGVyaXZlZCB1bmlmb3JtcyB3aWxsIHNldCB0aGlzIHByb3BlcnR5IHRvIGEgZGF0YVxyXG5cdFx0ICogdHlwZSBzcGVjaWZpYyB2YWx1ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLml0ZW1TaXplID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgcHJvcGVydHkgaXMgc2V0IGJ5IHtAbGluayBVbmlmb3Jtc0dyb3VwfSBhbmQgbWFya3NcclxuXHRcdCAqIHRoZSBzdGFydCBwb3NpdGlvbiBpbiB0aGUgdW5pZm9ybSBidWZmZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5vZmZzZXQgPSAwO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHVuaWZvcm0ncyB2YWx1ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBzZXQuXHJcblx0ICovXHJcblx0c2V0VmFsdWUoIHZhbHVlICkge1xyXG5cclxuXHRcdHRoaXMudmFsdWUgPSB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSB1bmlmb3JtJ3MgdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHthbnl9IFRoZSB2YWx1ZS5cclxuXHQgKi9cclxuXHRnZXRWYWx1ZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy52YWx1ZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgYSBOdW1iZXIgdW5pZm9ybS5cclxuICpcclxuICogQHByaXZhdGVcclxuICogQGF1Z21lbnRzIFVuaWZvcm1cclxuICovXHJcbmNsYXNzIE51bWJlclVuaWZvcm0gZXh0ZW5kcyBVbmlmb3JtIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBOdW1iZXIgdW5pZm9ybS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIHVuaWZvcm0ncyBuYW1lLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSB1bmlmb3JtJ3MgdmFsdWUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5hbWUsIHZhbHVlID0gMCApIHtcclxuXHJcblx0XHRzdXBlciggbmFtZSwgdmFsdWUgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNOdW1iZXJVbmlmb3JtID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLmJvdW5kYXJ5ID0gNDtcclxuXHRcdHRoaXMuaXRlbVNpemUgPSAxO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyBhIFZlY3RvcjIgdW5pZm9ybS5cclxuICpcclxuICogQHByaXZhdGVcclxuICogQGF1Z21lbnRzIFVuaWZvcm1cclxuICovXHJcbmNsYXNzIFZlY3RvcjJVbmlmb3JtIGV4dGVuZHMgVW5pZm9ybSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgTnVtYmVyIHVuaWZvcm0uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSB1bmlmb3JtJ3MgbmFtZS5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IHZhbHVlIC0gVGhlIHVuaWZvcm0ncyB2YWx1ZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbmFtZSwgdmFsdWUgPSBuZXcgVmVjdG9yMigpICkge1xyXG5cclxuXHRcdHN1cGVyKCBuYW1lLCB2YWx1ZSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1ZlY3RvcjJVbmlmb3JtID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLmJvdW5kYXJ5ID0gODtcclxuXHRcdHRoaXMuaXRlbVNpemUgPSAyO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyBhIFZlY3RvcjMgdW5pZm9ybS5cclxuICpcclxuICogQHByaXZhdGVcclxuICogQGF1Z21lbnRzIFVuaWZvcm1cclxuICovXHJcbmNsYXNzIFZlY3RvcjNVbmlmb3JtIGV4dGVuZHMgVW5pZm9ybSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgTnVtYmVyIHVuaWZvcm0uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSB1bmlmb3JtJ3MgbmFtZS5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IHZhbHVlIC0gVGhlIHVuaWZvcm0ncyB2YWx1ZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbmFtZSwgdmFsdWUgPSBuZXcgVmVjdG9yMygpICkge1xyXG5cclxuXHRcdHN1cGVyKCBuYW1lLCB2YWx1ZSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1ZlY3RvcjNVbmlmb3JtID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLmJvdW5kYXJ5ID0gMTY7XHJcblx0XHR0aGlzLml0ZW1TaXplID0gMztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgYSBWZWN0b3I0IHVuaWZvcm0uXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBhdWdtZW50cyBVbmlmb3JtXHJcbiAqL1xyXG5jbGFzcyBWZWN0b3I0VW5pZm9ybSBleHRlbmRzIFVuaWZvcm0ge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IE51bWJlciB1bmlmb3JtLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgdW5pZm9ybSdzIG5hbWUuXHJcblx0ICogQHBhcmFtIHtWZWN0b3I0fSB2YWx1ZSAtIFRoZSB1bmlmb3JtJ3MgdmFsdWUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5hbWUsIHZhbHVlID0gbmV3IFZlY3RvcjQoKSApIHtcclxuXHJcblx0XHRzdXBlciggbmFtZSwgdmFsdWUgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNWZWN0b3I0VW5pZm9ybSA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy5ib3VuZGFyeSA9IDE2O1xyXG5cdFx0dGhpcy5pdGVtU2l6ZSA9IDQ7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIGEgQ29sb3IgdW5pZm9ybS5cclxuICpcclxuICogQHByaXZhdGVcclxuICogQGF1Z21lbnRzIFVuaWZvcm1cclxuICovXHJcbmNsYXNzIENvbG9yVW5pZm9ybSBleHRlbmRzIFVuaWZvcm0ge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IE51bWJlciB1bmlmb3JtLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgdW5pZm9ybSdzIG5hbWUuXHJcblx0ICogQHBhcmFtIHtDb2xvcn0gdmFsdWUgLSBUaGUgdW5pZm9ybSdzIHZhbHVlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBuYW1lLCB2YWx1ZSA9IG5ldyBDb2xvcigpICkge1xyXG5cclxuXHRcdHN1cGVyKCBuYW1lLCB2YWx1ZSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0NvbG9yVW5pZm9ybSA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy5ib3VuZGFyeSA9IDE2O1xyXG5cdFx0dGhpcy5pdGVtU2l6ZSA9IDM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIGEgTWF0cml4MiB1bmlmb3JtLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAYXVnbWVudHMgVW5pZm9ybVxyXG4gKi9cclxuY2xhc3MgTWF0cml4MlVuaWZvcm0gZXh0ZW5kcyBVbmlmb3JtIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBOdW1iZXIgdW5pZm9ybS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIHVuaWZvcm0ncyBuYW1lLlxyXG5cdCAqIEBwYXJhbSB7TWF0cml4Mn0gdmFsdWUgLSBUaGUgdW5pZm9ybSdzIHZhbHVlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBuYW1lLCB2YWx1ZSA9IG5ldyBNYXRyaXgyKCkgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5hbWUsIHZhbHVlICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzTWF0cml4MlVuaWZvcm0gPSB0cnVlO1xyXG5cclxuXHRcdHRoaXMuYm91bmRhcnkgPSAxNjtcclxuXHRcdHRoaXMuaXRlbVNpemUgPSA0O1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgYSBNYXRyaXgzIHVuaWZvcm0uXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBhdWdtZW50cyBVbmlmb3JtXHJcbiAqL1xyXG5jbGFzcyBNYXRyaXgzVW5pZm9ybSBleHRlbmRzIFVuaWZvcm0ge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IE51bWJlciB1bmlmb3JtLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgdW5pZm9ybSdzIG5hbWUuXHJcblx0ICogQHBhcmFtIHtNYXRyaXgzfSB2YWx1ZSAtIFRoZSB1bmlmb3JtJ3MgdmFsdWUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5hbWUsIHZhbHVlID0gbmV3IE1hdHJpeDMoKSApIHtcclxuXHJcblx0XHRzdXBlciggbmFtZSwgdmFsdWUgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNNYXRyaXgzVW5pZm9ybSA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy5ib3VuZGFyeSA9IDQ4O1xyXG5cdFx0dGhpcy5pdGVtU2l6ZSA9IDEyO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyBhIE1hdHJpeDQgdW5pZm9ybS5cclxuICpcclxuICogQHByaXZhdGVcclxuICogQGF1Z21lbnRzIFVuaWZvcm1cclxuICovXHJcbmNsYXNzIE1hdHJpeDRVbmlmb3JtIGV4dGVuZHMgVW5pZm9ybSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgTnVtYmVyIHVuaWZvcm0uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSB1bmlmb3JtJ3MgbmFtZS5cclxuXHQgKiBAcGFyYW0ge01hdHJpeDR9IHZhbHVlIC0gVGhlIHVuaWZvcm0ncyB2YWx1ZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbmFtZSwgdmFsdWUgPSBuZXcgTWF0cml4NCgpICkge1xyXG5cclxuXHRcdHN1cGVyKCBuYW1lLCB2YWx1ZSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc01hdHJpeDRVbmlmb3JtID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLmJvdW5kYXJ5ID0gNjQ7XHJcblx0XHR0aGlzLml0ZW1TaXplID0gMTY7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7XHJcblx0TnVtYmVyVW5pZm9ybSxcclxuXHRWZWN0b3IyVW5pZm9ybSwgVmVjdG9yM1VuaWZvcm0sIFZlY3RvcjRVbmlmb3JtLCBDb2xvclVuaWZvcm0sXHJcblx0TWF0cml4MlVuaWZvcm0sIE1hdHJpeDNVbmlmb3JtLCBNYXRyaXg0VW5pZm9ybVxyXG59O1xyXG4iLCJpbXBvcnQge1xyXG5cdE51bWJlclVuaWZvcm0sIFZlY3RvcjJVbmlmb3JtLCBWZWN0b3IzVW5pZm9ybSwgVmVjdG9yNFVuaWZvcm0sXHJcblx0Q29sb3JVbmlmb3JtLCBNYXRyaXgyVW5pZm9ybSwgTWF0cml4M1VuaWZvcm0sIE1hdHJpeDRVbmlmb3JtXHJcbn0gZnJvbSAnLi4vVW5pZm9ybS5qcyc7XHJcblxyXG4vKipcclxuICogQSBzcGVjaWFsIGZvcm0gb2YgTnVtYmVyIHVuaWZvcm0gYmluZGluZyB0eXBlLlxyXG4gKiBJdCdzIHZhbHVlIGlzIG1hbmFnZWQgYnkgYSBub2RlIG9iamVjdC5cclxuICpcclxuICogQHByaXZhdGVcclxuICogQGF1Z21lbnRzIE51bWJlclVuaWZvcm1cclxuICovXHJcbmNsYXNzIE51bWJlck5vZGVVbmlmb3JtIGV4dGVuZHMgTnVtYmVyVW5pZm9ybSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbm9kZS1iYXNlZCBOdW1iZXIgdW5pZm9ybS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZVVuaWZvcm19IG5vZGVVbmlmb3JtIC0gVGhlIG5vZGUgdW5pZm9ybS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggbm9kZVVuaWZvcm0gKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5vZGVVbmlmb3JtLm5hbWUsIG5vZGVVbmlmb3JtLnZhbHVlICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbm9kZSB1bmlmb3JtLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlVW5pZm9ybX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub2RlVW5pZm9ybSA9IG5vZGVVbmlmb3JtO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE92ZXJ3cml0dGVuIHRvIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIG5vZGUgdW5pZm9ybS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIHZhbHVlLlxyXG5cdCAqL1xyXG5cdGdldFZhbHVlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm5vZGVVbmlmb3JtLnZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIG5vZGUgdW5pZm9ybSBkYXRhIHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBkYXRhIHR5cGUuXHJcblx0ICovXHJcblx0Z2V0VHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5ub2RlVW5pZm9ybS50eXBlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQSBzcGVjaWFsIGZvcm0gb2YgVmVjdG9yMiB1bmlmb3JtIGJpbmRpbmcgdHlwZS5cclxuICogSXQncyB2YWx1ZSBpcyBtYW5hZ2VkIGJ5IGEgbm9kZSBvYmplY3QuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBhdWdtZW50cyBWZWN0b3IyVW5pZm9ybVxyXG4gKi9cclxuY2xhc3MgVmVjdG9yMk5vZGVVbmlmb3JtIGV4dGVuZHMgVmVjdG9yMlVuaWZvcm0ge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG5vZGUtYmFzZWQgVmVjdG9yMiB1bmlmb3JtLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlVW5pZm9ybX0gbm9kZVVuaWZvcm0gLSBUaGUgbm9kZSB1bmlmb3JtLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBub2RlVW5pZm9ybSApIHtcclxuXHJcblx0XHRzdXBlciggbm9kZVVuaWZvcm0ubmFtZSwgbm9kZVVuaWZvcm0udmFsdWUgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBub2RlIHVuaWZvcm0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGVVbmlmb3JtfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vZGVVbmlmb3JtID0gbm9kZVVuaWZvcm07XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogT3ZlcndyaXR0ZW4gdG8gcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgbm9kZSB1bmlmb3JtLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gVGhlIHZhbHVlLlxyXG5cdCAqL1xyXG5cdGdldFZhbHVlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm5vZGVVbmlmb3JtLnZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIG5vZGUgdW5pZm9ybSBkYXRhIHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBkYXRhIHR5cGUuXHJcblx0ICovXHJcblx0Z2V0VHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5ub2RlVW5pZm9ybS50eXBlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQSBzcGVjaWFsIGZvcm0gb2YgVmVjdG9yMyB1bmlmb3JtIGJpbmRpbmcgdHlwZS5cclxuICogSXQncyB2YWx1ZSBpcyBtYW5hZ2VkIGJ5IGEgbm9kZSBvYmplY3QuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBhdWdtZW50cyBWZWN0b3IzVW5pZm9ybVxyXG4gKi9cclxuY2xhc3MgVmVjdG9yM05vZGVVbmlmb3JtIGV4dGVuZHMgVmVjdG9yM1VuaWZvcm0ge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG5vZGUtYmFzZWQgVmVjdG9yMyB1bmlmb3JtLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlVW5pZm9ybX0gbm9kZVVuaWZvcm0gLSBUaGUgbm9kZSB1bmlmb3JtLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBub2RlVW5pZm9ybSApIHtcclxuXHJcblx0XHRzdXBlciggbm9kZVVuaWZvcm0ubmFtZSwgbm9kZVVuaWZvcm0udmFsdWUgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBub2RlIHVuaWZvcm0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGVVbmlmb3JtfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vZGVVbmlmb3JtID0gbm9kZVVuaWZvcm07XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogT3ZlcndyaXR0ZW4gdG8gcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgbm9kZSB1bmlmb3JtLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7VmVjdG9yM30gVGhlIHZhbHVlLlxyXG5cdCAqL1xyXG5cdGdldFZhbHVlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm5vZGVVbmlmb3JtLnZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIG5vZGUgdW5pZm9ybSBkYXRhIHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBkYXRhIHR5cGUuXHJcblx0ICovXHJcblx0Z2V0VHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5ub2RlVW5pZm9ybS50eXBlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQSBzcGVjaWFsIGZvcm0gb2YgVmVjdG9yNCB1bmlmb3JtIGJpbmRpbmcgdHlwZS5cclxuICogSXQncyB2YWx1ZSBpcyBtYW5hZ2VkIGJ5IGEgbm9kZSBvYmplY3QuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBhdWdtZW50cyBWZWN0b3I0VW5pZm9ybVxyXG4gKi9cclxuY2xhc3MgVmVjdG9yNE5vZGVVbmlmb3JtIGV4dGVuZHMgVmVjdG9yNFVuaWZvcm0ge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG5vZGUtYmFzZWQgVmVjdG9yNCB1bmlmb3JtLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlVW5pZm9ybX0gbm9kZVVuaWZvcm0gLSBUaGUgbm9kZSB1bmlmb3JtLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBub2RlVW5pZm9ybSApIHtcclxuXHJcblx0XHRzdXBlciggbm9kZVVuaWZvcm0ubmFtZSwgbm9kZVVuaWZvcm0udmFsdWUgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBub2RlIHVuaWZvcm0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGVVbmlmb3JtfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vZGVVbmlmb3JtID0gbm9kZVVuaWZvcm07XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogT3ZlcndyaXR0ZW4gdG8gcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgbm9kZSB1bmlmb3JtLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7VmVjdG9yNH0gVGhlIHZhbHVlLlxyXG5cdCAqL1xyXG5cdGdldFZhbHVlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm5vZGVVbmlmb3JtLnZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIG5vZGUgdW5pZm9ybSBkYXRhIHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBkYXRhIHR5cGUuXHJcblx0ICovXHJcblx0Z2V0VHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5ub2RlVW5pZm9ybS50eXBlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQSBzcGVjaWFsIGZvcm0gb2YgQ29sb3IgdW5pZm9ybSBiaW5kaW5nIHR5cGUuXHJcbiAqIEl0J3MgdmFsdWUgaXMgbWFuYWdlZCBieSBhIG5vZGUgb2JqZWN0LlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAYXVnbWVudHMgQ29sb3JVbmlmb3JtXHJcbiAqL1xyXG5jbGFzcyBDb2xvck5vZGVVbmlmb3JtIGV4dGVuZHMgQ29sb3JVbmlmb3JtIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBub2RlLWJhc2VkIENvbG9yIHVuaWZvcm0uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVVbmlmb3JtfSBub2RlVW5pZm9ybSAtIFRoZSBub2RlIHVuaWZvcm0uXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5vZGVVbmlmb3JtICkge1xyXG5cclxuXHRcdHN1cGVyKCBub2RlVW5pZm9ybS5uYW1lLCBub2RlVW5pZm9ybS52YWx1ZSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG5vZGUgdW5pZm9ybS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZVVuaWZvcm19XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9kZVVuaWZvcm0gPSBub2RlVW5pZm9ybTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBPdmVyd3JpdHRlbiB0byByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBub2RlIHVuaWZvcm0uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtDb2xvcn0gVGhlIHZhbHVlLlxyXG5cdCAqL1xyXG5cdGdldFZhbHVlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm5vZGVVbmlmb3JtLnZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIG5vZGUgdW5pZm9ybSBkYXRhIHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBkYXRhIHR5cGUuXHJcblx0ICovXHJcblx0Z2V0VHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5ub2RlVW5pZm9ybS50eXBlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5cclxuLyoqXHJcbiAqIEEgc3BlY2lhbCBmb3JtIG9mIE1hdHJpeDIgdW5pZm9ybSBiaW5kaW5nIHR5cGUuXHJcbiAqIEl0J3MgdmFsdWUgaXMgbWFuYWdlZCBieSBhIG5vZGUgb2JqZWN0LlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAYXVnbWVudHMgTWF0cml4MlVuaWZvcm1cclxuICovXHJcbmNsYXNzIE1hdHJpeDJOb2RlVW5pZm9ybSBleHRlbmRzIE1hdHJpeDJVbmlmb3JtIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBub2RlLWJhc2VkIE1hdHJpeDIgdW5pZm9ybS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZVVuaWZvcm19IG5vZGVVbmlmb3JtIC0gVGhlIG5vZGUgdW5pZm9ybS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggbm9kZVVuaWZvcm0gKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5vZGVVbmlmb3JtLm5hbWUsIG5vZGVVbmlmb3JtLnZhbHVlICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbm9kZSB1bmlmb3JtLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlVW5pZm9ybX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub2RlVW5pZm9ybSA9IG5vZGVVbmlmb3JtO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE92ZXJ3cml0dGVuIHRvIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIG5vZGUgdW5pZm9ybS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDJ9IFRoZSB2YWx1ZS5cclxuXHQgKi9cclxuXHRnZXRWYWx1ZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5ub2RlVW5pZm9ybS52YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBub2RlIHVuaWZvcm0gZGF0YSB0eXBlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgZGF0YSB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldFR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubm9kZVVuaWZvcm0udHlwZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIEEgc3BlY2lhbCBmb3JtIG9mIE1hdHJpeDMgdW5pZm9ybSBiaW5kaW5nIHR5cGUuXHJcbiAqIEl0J3MgdmFsdWUgaXMgbWFuYWdlZCBieSBhIG5vZGUgb2JqZWN0LlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAYXVnbWVudHMgTWF0cml4M1VuaWZvcm1cclxuICovXHJcbmNsYXNzIE1hdHJpeDNOb2RlVW5pZm9ybSBleHRlbmRzIE1hdHJpeDNVbmlmb3JtIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBub2RlLWJhc2VkIE1hdHJpeDMgdW5pZm9ybS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZVVuaWZvcm19IG5vZGVVbmlmb3JtIC0gVGhlIG5vZGUgdW5pZm9ybS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggbm9kZVVuaWZvcm0gKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5vZGVVbmlmb3JtLm5hbWUsIG5vZGVVbmlmb3JtLnZhbHVlICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbm9kZSB1bmlmb3JtLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlVW5pZm9ybX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub2RlVW5pZm9ybSA9IG5vZGVVbmlmb3JtO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE92ZXJ3cml0dGVuIHRvIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIG5vZGUgdW5pZm9ybS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDN9IFRoZSB2YWx1ZS5cclxuXHQgKi9cclxuXHRnZXRWYWx1ZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5ub2RlVW5pZm9ybS52YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBub2RlIHVuaWZvcm0gZGF0YSB0eXBlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgZGF0YSB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldFR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubm9kZVVuaWZvcm0udHlwZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIEEgc3BlY2lhbCBmb3JtIG9mIE1hdHJpeDQgdW5pZm9ybSBiaW5kaW5nIHR5cGUuXHJcbiAqIEl0J3MgdmFsdWUgaXMgbWFuYWdlZCBieSBhIG5vZGUgb2JqZWN0LlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAYXVnbWVudHMgTWF0cml4NFVuaWZvcm1cclxuICovXHJcbmNsYXNzIE1hdHJpeDROb2RlVW5pZm9ybSBleHRlbmRzIE1hdHJpeDRVbmlmb3JtIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBub2RlLWJhc2VkIE1hdHJpeDQgdW5pZm9ybS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZVVuaWZvcm19IG5vZGVVbmlmb3JtIC0gVGhlIG5vZGUgdW5pZm9ybS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggbm9kZVVuaWZvcm0gKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5vZGVVbmlmb3JtLm5hbWUsIG5vZGVVbmlmb3JtLnZhbHVlICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbm9kZSB1bmlmb3JtLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOb2RlVW5pZm9ybX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub2RlVW5pZm9ybSA9IG5vZGVVbmlmb3JtO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE92ZXJ3cml0dGVuIHRvIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIG5vZGUgdW5pZm9ybS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge01hdHJpeDR9IFRoZSB2YWx1ZS5cclxuXHQgKi9cclxuXHRnZXRWYWx1ZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5ub2RlVW5pZm9ybS52YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBub2RlIHVuaWZvcm0gZGF0YSB0eXBlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgZGF0YSB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldFR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubm9kZVVuaWZvcm0udHlwZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHtcclxuXHROdW1iZXJOb2RlVW5pZm9ybSwgVmVjdG9yMk5vZGVVbmlmb3JtLCBWZWN0b3IzTm9kZVVuaWZvcm0sIFZlY3RvcjROb2RlVW5pZm9ybSxcclxuXHRDb2xvck5vZGVVbmlmb3JtLCBNYXRyaXgyTm9kZVVuaWZvcm0sIE1hdHJpeDNOb2RlVW5pZm9ybSwgTWF0cml4NE5vZGVVbmlmb3JtXHJcbn07XHJcbiIsImltcG9ydCBOb2RlVW5pZm9ybSBmcm9tICcuL05vZGVVbmlmb3JtLmpzJztcclxuaW1wb3J0IE5vZGVBdHRyaWJ1dGUgZnJvbSAnLi9Ob2RlQXR0cmlidXRlLmpzJztcclxuaW1wb3J0IE5vZGVWYXJ5aW5nIGZyb20gJy4vTm9kZVZhcnlpbmcuanMnO1xyXG5pbXBvcnQgTm9kZVZhciBmcm9tICcuL05vZGVWYXIuanMnO1xyXG5pbXBvcnQgTm9kZUNvZGUgZnJvbSAnLi9Ob2RlQ29kZS5qcyc7XHJcbmltcG9ydCBOb2RlQ2FjaGUgZnJvbSAnLi9Ob2RlQ2FjaGUuanMnO1xyXG5pbXBvcnQgUGFyYW1ldGVyTm9kZSBmcm9tICcuL1BhcmFtZXRlck5vZGUuanMnO1xyXG5pbXBvcnQgU3RydWN0VHlwZSBmcm9tICcuL1N0cnVjdFR5cGUuanMnO1xyXG5pbXBvcnQgRnVuY3Rpb25Ob2RlIGZyb20gJy4uL2NvZGUvRnVuY3Rpb25Ob2RlLmpzJztcclxuaW1wb3J0IE5vZGVNYXRlcmlhbCBmcm9tICcuLi8uLi9tYXRlcmlhbHMvbm9kZXMvTm9kZU1hdGVyaWFsLmpzJztcclxuaW1wb3J0IHsgZ2V0VHlwZUZyb21MZW5ndGggfSBmcm9tICcuL05vZGVVdGlscy5qcyc7XHJcbmltcG9ydCB7IE5vZGVVcGRhdGVUeXBlLCBkZWZhdWx0QnVpbGRTdGFnZXMsIHNoYWRlclN0YWdlcyB9IGZyb20gJy4vY29uc3RhbnRzLmpzJztcclxuXHJcbmltcG9ydCB7XHJcblx0TnVtYmVyTm9kZVVuaWZvcm0sIFZlY3RvcjJOb2RlVW5pZm9ybSwgVmVjdG9yM05vZGVVbmlmb3JtLCBWZWN0b3I0Tm9kZVVuaWZvcm0sXHJcblx0Q29sb3JOb2RlVW5pZm9ybSwgTWF0cml4Mk5vZGVVbmlmb3JtLCBNYXRyaXgzTm9kZVVuaWZvcm0sIE1hdHJpeDROb2RlVW5pZm9ybVxyXG59IGZyb20gJy4uLy4uL3JlbmRlcmVycy9jb21tb24vbm9kZXMvTm9kZVVuaWZvcm0uanMnO1xyXG5cclxuaW1wb3J0IHsgc3RhY2sgfSBmcm9tICcuL1N0YWNrTm9kZS5qcyc7XHJcbmltcG9ydCB7IGdldEN1cnJlbnRTdGFjaywgc2V0Q3VycmVudFN0YWNrIH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5cclxuaW1wb3J0IEN1YmVSZW5kZXJUYXJnZXQgZnJvbSAnLi4vLi4vcmVuZGVyZXJzL2NvbW1vbi9DdWJlUmVuZGVyVGFyZ2V0LmpzJztcclxuaW1wb3J0IENoYWluTWFwIGZyb20gJy4uLy4uL3JlbmRlcmVycy9jb21tb24vQ2hhaW5NYXAuanMnO1xyXG5cclxuaW1wb3J0IEJpbmRHcm91cCBmcm9tICcuLi8uLi9yZW5kZXJlcnMvY29tbW9uL0JpbmRHcm91cC5qcyc7XHJcblxyXG5pbXBvcnQgeyBSRVZJU0lPTiwgSW50VHlwZSwgVW5zaWduZWRJbnRUeXBlLCBMaW5lYXJGaWx0ZXIsIExpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXIsIE5lYXJlc3RNaXBtYXBMaW5lYXJGaWx0ZXIsIExpbmVhck1pcG1hcExpbmVhckZpbHRlciB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IFJlbmRlclRhcmdldCB9IGZyb20gJy4uLy4uL2NvcmUvUmVuZGVyVGFyZ2V0LmpzJztcclxuaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi8uLi9tYXRoL0NvbG9yLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMi5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3I0IH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3I0LmpzJztcclxuaW1wb3J0IHsgRmxvYXQxNkJ1ZmZlckF0dHJpYnV0ZSB9IGZyb20gJy4uLy4uL2NvcmUvQnVmZmVyQXR0cmlidXRlLmpzJztcclxuXHJcbmNvbnN0IHJlbmRlcmVyQ2FjaGUgPSBuZXcgV2Vha01hcCgpO1xyXG5cclxuY29uc3QgdHlwZUZyb21BcnJheSA9IG5ldyBNYXAoIFtcclxuXHRbIEludDhBcnJheSwgJ2ludCcgXSxcclxuXHRbIEludDE2QXJyYXksICdpbnQnIF0sXHJcblx0WyBJbnQzMkFycmF5LCAnaW50JyBdLFxyXG5cdFsgVWludDhBcnJheSwgJ3VpbnQnIF0sXHJcblx0WyBVaW50MTZBcnJheSwgJ3VpbnQnIF0sXHJcblx0WyBVaW50MzJBcnJheSwgJ3VpbnQnIF0sXHJcblx0WyBGbG9hdDMyQXJyYXksICdmbG9hdCcgXVxyXG5dICk7XHJcblxyXG5jb25zdCB0b0Zsb2F0ID0gKCB2YWx1ZSApID0+IHtcclxuXHJcblx0aWYgKCAvZS9nLnRlc3QoIHZhbHVlICkgKSB7XHJcblxyXG5cdFx0cmV0dXJuIFN0cmluZyggdmFsdWUgKS5yZXBsYWNlKCAvXFwrL2csICcnICk7XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0dmFsdWUgPSBOdW1iZXIoIHZhbHVlICk7XHJcblxyXG5cdFx0cmV0dXJuIHZhbHVlICsgKCB2YWx1ZSAlIDEgPyAnJyA6ICcuMCcgKTtcclxuXHJcblx0fVxyXG5cclxufTtcclxuXHJcbi8qKlxyXG4gKiBCYXNlIGNsYXNzIGZvciBidWlsZGVycyB3aGljaCBnZW5lcmF0ZSBhIHNoYWRlciBwcm9ncmFtIGJhc2VkXHJcbiAqIG9uIGEgM0Qgb2JqZWN0IGFuZCBpdHMgbm9kZSBtYXRlcmlhbCBkZWZpbml0aW9uLlxyXG4gKi9cclxuY2xhc3MgTm9kZUJ1aWxkZXIge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG5vZGUgYnVpbGRlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0M0R9IG9iamVjdCAtIFRoZSAzRCBvYmplY3QuXHJcblx0ICogQHBhcmFtIHtSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgY3VycmVudCByZW5kZXJlci5cclxuXHQgKiBAcGFyYW0ge05vZGVQYXJzZXJ9IHBhcnNlciAtIEEgcmVmZXJlbmNlIHRvIGEgbm9kZSBwYXJzZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG9iamVjdCwgcmVuZGVyZXIsIHBhcnNlciApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSAzRCBvYmplY3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdDNEfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm9iamVjdCA9IG9iamVjdDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBtYXRlcmlhbCBvZiB0aGUgM0Qgb2JqZWN0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/TWF0ZXJpYWx9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWF0ZXJpYWwgPSAoIG9iamVjdCAmJiBvYmplY3QubWF0ZXJpYWwgKSB8fCBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGdlb21ldHJ5IG9mIHRoZSAzRCBvYmplY3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9CdWZmZXJHZW9tZXRyeX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nZW9tZXRyeSA9ICggb2JqZWN0ICYmIG9iamVjdC5nZW9tZXRyeSApIHx8IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY3VycmVudCByZW5kZXJlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7UmVuZGVyZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIGEgbm9kZSBwYXJzZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGVQYXJzZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucGFyc2VyID0gcGFyc2VyO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHNjZW5lIHRoZSAzRCBvYmplY3QgYmVsb25ncyB0by5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1NjZW5lfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNjZW5lID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjYW1lcmEgdGhlIDNEIG9iamVjdCBpcyByZW5kZXJlZCB3aXRoLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Q2FtZXJhfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNhbWVyYSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGxpc3Qgb2YgYWxsIG5vZGVzIHRoZSBidWlsZGVyIGlzIHByb2Nlc3NpbmdcclxuXHRcdCAqIGZvciB0aGlzIDNEIG9iamVjdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8Tm9kZT59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9kZXMgPSBbXTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgbGlzdCBvZiBhbGwgc2VxdWVudGlhbCBub2Rlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8Tm9kZT59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2VxdWVudGlhbE5vZGVzID0gW107XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGxpc3Qgb2YgYWxsIG5vZGVzIHdoaWNoIHtAbGluayBOb2RlI3VwZGF0ZX0gbWV0aG9kIHNob3VsZCBiZSBleGVjdXRlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8Tm9kZT59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXBkYXRlTm9kZXMgPSBbXTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgbGlzdCBvZiBhbGwgbm9kZXMgd2hpY2gge0BsaW5rIE5vZGUjdXBkYXRlQmVmb3JlfSBtZXRob2Qgc2hvdWxkIGJlIGV4ZWN1dGVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxOb2RlPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51cGRhdGVCZWZvcmVOb2RlcyA9IFtdO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBsaXN0IG9mIGFsbCBub2RlcyB3aGljaCB7QGxpbmsgTm9kZSN1cGRhdGVBZnRlcn0gbWV0aG9kIHNob3VsZCBiZSBleGVjdXRlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8Tm9kZT59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXBkYXRlQWZ0ZXJOb2RlcyA9IFtdO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBkaWN0aW9uYXJ5IHRoYXQgYXNzaWducyBlYWNoIG5vZGUgdG8gYSB1bmlxdWUgaGFzaC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0PG51bWJlcixOb2RlPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5oYXNoTm9kZXMgPSB7fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIGEgbm9kZSBtYXRlcmlhbCBvYnNlcnZlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P05vZGVNYXRlcmlhbE9ic2VydmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm9ic2VydmVyID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGxpZ2h0cyBub2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/TGlnaHRzTm9kZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5saWdodHNOb2RlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGVudmlyb25tZW50IG5vZGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9Ob2RlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmVudmlyb25tZW50Tm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBmb2cgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P0ZvZ05vZGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZm9nTm9kZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY3VycmVudCBjbGlwcGluZyBjb250ZXh0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/Q2xpcHBpbmdDb250ZXh0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNsaXBwaW5nQ29udGV4dCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZ2VuZXJhdGVkIHZlcnRleCBzaGFkZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9zdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudmVydGV4U2hhZGVyID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBnZW5lcmF0ZWQgZnJhZ21lbnQgc2hhZGVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZyYWdtZW50U2hhZGVyID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBnZW5lcmF0ZWQgY29tcHV0ZSBzaGFkZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9zdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29tcHV0ZVNoYWRlciA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBOb2RlcyB1c2VkIGluIHRoZSBwcmltYXJ5IGZsb3cgb2YgY29kZSBnZW5lcmF0aW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLEFycmF5PE5vZGU+Pn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5mbG93Tm9kZXMgPSB7IHZlcnRleDogW10sIGZyYWdtZW50OiBbXSwgY29tcHV0ZTogW10gfTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIE5vZGVzIGNvZGUgZnJvbSBgLmZsb3dOb2Rlc2AuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdDxzdHJpbmcsc3RyaW5nPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5mbG93Q29kZSA9IHsgdmVydGV4OiAnJywgZnJhZ21lbnQ6ICcnLCBjb21wdXRlOiAnJyB9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBkaWN0aW9uYXJ5IGhvbGRzIHRoZSBub2RlIHVuaWZvcm1zIG9mIHRoZSBidWlsZGVyLlxyXG5cdFx0ICogVGhlIHVuaWZvcm1zIGFyZSBtYWludGFpbmVkIGluIGFuIGFycmF5IGZvciBlYWNoIHNoYWRlciBzdGFnZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVuaWZvcm1zID0geyB2ZXJ0ZXg6IFtdLCBmcmFnbWVudDogW10sIGNvbXB1dGU6IFtdLCBpbmRleDogMCB9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBkaWN0aW9uYXJ5IGhvbGRzIHRoZSBvdXRwdXQgc3RydWN0cyBvZiB0aGUgYnVpbGRlci5cclxuXHRcdCAqIFRoZSBzdHJ1Y3RzIGFyZSBtYWludGFpbmVkIGluIGFuIGFycmF5IGZvciBlYWNoIHNoYWRlciBzdGFnZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnN0cnVjdHMgPSB7IHZlcnRleDogW10sIGZyYWdtZW50OiBbXSwgY29tcHV0ZTogW10sIGluZGV4OiAwIH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGRpY3Rpb25hcnkgaG9sZHMgdGhlIGJpbmRpbmdzIGZvciBlYWNoIHNoYWRlciBzdGFnZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJpbmRpbmdzID0geyB2ZXJ0ZXg6IHt9LCBmcmFnbWVudDoge30sIGNvbXB1dGU6IHt9IH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGRpY3Rpb25hcnkgbWFpbnRhaW5zIHRoZSBiaW5kaW5nIGluZGljZXMgcGVyIGJpbmQgZ3JvdXAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5iaW5kaW5nc0luZGV4ZXMgPSB7fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlZmVyZW5jZSB0byB0aGUgYXJyYXkgb2YgYmluZCBncm91cHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9BcnJheTxCaW5kR3JvdXA+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJpbmRHcm91cHMgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBhcnJheSBob2xkcyB0aGUgbm9kZSBhdHRyaWJ1dGVzIG9mIHRoaXMgYnVpbGRlclxyXG5cdFx0ICogY3JlYXRlZCB2aWEge0BsaW5rIEF0dHJpYnV0ZU5vZGV9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxOb2RlQXR0cmlidXRlPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hdHRyaWJ1dGVzID0gW107XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBub2RlIGF0dHJpYnV0ZXMgb2YgdGhpcyBidWlsZGVyXHJcblx0XHQgKiBjcmVhdGVkIHZpYSB7QGxpbmsgQnVmZmVyQXR0cmlidXRlTm9kZX0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PE5vZGVBdHRyaWJ1dGU+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJ1ZmZlckF0dHJpYnV0ZXMgPSBbXTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgYXJyYXkgaG9sZHMgdGhlIG5vZGUgdmFyeWluZ3Mgb2YgdGhpcyBidWlsZGVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxOb2RlVmFyeWluZz59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudmFyeWluZ3MgPSBbXTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZGljdGlvbmFyeSBob2xkcyB0aGUgKG5hdGl2ZSkgbm9kZSBjb2RlcyBvZiB0aGlzIGJ1aWxkZXIuXHJcblx0XHQgKiBUaGUgY29kZXMgYXJlIG1haW50YWluZWQgaW4gYW4gYXJyYXkgZm9yIGVhY2ggc2hhZGVyIHN0YWdlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLEFycmF5PE5vZGVDb2RlPj59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29kZXMgPSB7fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZGljdGlvbmFyeSBob2xkcyB0aGUgbm9kZSB2YXJpYWJsZXMgb2YgdGhpcyBidWlsZGVyLlxyXG5cdFx0ICogVGhlIHZhcmlhYmxlcyBhcmUgbWFpbnRhaW5lZCBpbiBhbiBhcnJheSBmb3IgZWFjaCBzaGFkZXIgc3RhZ2UuXHJcblx0XHQgKiBUaGlzIGRpY3Rpb25hcnkgaXMgYWxzbyB1c2VkIHRvIGNvdW50IHRoZSBudW1iZXIgb2YgdmFyaWFibGVzXHJcblx0XHQgKiBhY2NvcmRpbmcgdG8gdGhlaXIgdHlwZSAoY29uc3QsIHZhcnMpLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLEFycmF5PE5vZGVWYXI+fG51bWJlcj59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudmFycyA9IHt9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBkaWN0aW9uYXJ5IGhvbGRzIHRoZSBkZWNsYXJhdGlvbnMgZm9yIGVhY2ggc2hhZGVyIHN0YWdlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGVjbGFyYXRpb25zID0ge307XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDdXJyZW50IGNvZGUgZmxvdy5cclxuXHRcdCAqIEFsbCBjb2RlIGdlbmVyYXRlZCBpbiB0aGlzIHN0YWNrIHdpbGwgYmUgc3RvcmVkIGluIGAuZmxvd2AuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3tjb2RlOiBzdHJpbmd9fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZsb3cgPSB7IGNvZGU6ICcnIH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGNoYWluIG9mIG5vZGVzLlxyXG5cdFx0ICogVXNlZCB0byBjaGVjayByZWN1cnNpdmUgY2FsbHMgaW4gbm9kZS1ncmFwaC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8Tm9kZT59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2hhaW5pbmcgPSBbXTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjdXJyZW50IHN0YWNrLlxyXG5cdFx0ICogVGhpcyByZWZsZWN0cyB0aGUgY3VycmVudCBwcm9jZXNzIGluIHRoZSBjb2RlIGJsb2NrIGhpZXJhcmNoeSxcclxuXHRcdCAqIGl0IGlzIHVzZWZ1bCB0byBrbm93IGlmIHRoZSBjdXJyZW50IHByb2Nlc3MgaXMgaW5zaWRlIGEgY29uZGl0aW9uYWwgZm9yIGV4YW1wbGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1N0YWNrTm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zdGFjayA9IHN0YWNrKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBMaXN0IG9mIHN0YWNrIG5vZGVzLlxyXG5cdFx0ICogVGhlIGN1cnJlbnQgc3RhY2sgaGllcmFyY2h5IGlzIHN0b3JlZCBpbiBhbiBhcnJheS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8U3RhY2tOb2RlPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zdGFja3MgPSBbXTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgdGFiIHZhbHVlLiBVc2VkIGZvciBzaGFkZXIgc3RyaW5nIGdlbmVyYXRpb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqIEBkZWZhdWx0ICdcXHQnXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudGFiID0gJ1xcdCc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgZnVuY3Rpb24gbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P0Z1bmN0aW9uTm9kZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jdXJyZW50RnVuY3Rpb25Ob2RlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBidWlsZGVyJ3MgY29udGV4dC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNvbnRleHQgPSB7XHJcblx0XHRcdG1hdGVyaWFsOiB0aGlzLm1hdGVyaWFsXHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGJ1aWxkZXIncyBjYWNoZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZUNhY2hlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNhY2hlID0gbmV3IE5vZGVDYWNoZSgpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU2luY2UgdGhlIHtAbGluayBOb2RlQnVpbGRlciNjYWNoZX0gbWlnaHQgYmUgdGVtcG9yYXJpbHlcclxuXHRcdCAqIG92ZXJ3cml0dGVuIGJ5IG90aGVyIGNhY2hlcywgdGhpcyBtZW1iZXIgcmV0YWlucyB0aGUgcmVmZXJlbmNlXHJcblx0XHQgKiB0byB0aGUgYnVpbGRlcidzIG93biBjYWNoZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZUNhY2hlfVxyXG5cdFx0ICogQGRlZmF1bHQgdGhpcy5jYWNoZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdsb2JhbENhY2hlID0gdGhpcy5jYWNoZTtcclxuXHJcblx0XHR0aGlzLmZsb3dzRGF0YSA9IG5ldyBXZWFrTWFwKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY3VycmVudCBzaGFkZXIgc3RhZ2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez8oJ3ZlcnRleCd8J2ZyYWdtZW50J3wnY29tcHV0ZSd8J2FueScpfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNoYWRlclN0YWdlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjdXJyZW50IGJ1aWxkIHN0YWdlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/KCdzZXR1cCd8J2FuYWx5emUnfCdnZW5lcmF0ZScpfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJ1aWxkU3RhZ2UgPSBudWxsO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGJpbmQgZ3JvdXBzIG9mIHRoZSBjdXJyZW50IHJlbmRlcmVyLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Q2hhaW5NYXB9IFRoZSBjYWNoZS5cclxuXHQgKi9cclxuXHRnZXRCaW5kR3JvdXBzQ2FjaGUoKSB7XHJcblxyXG5cdFx0bGV0IGJpbmRHcm91cHNDYWNoZSA9IHJlbmRlcmVyQ2FjaGUuZ2V0KCB0aGlzLnJlbmRlcmVyICk7XHJcblxyXG5cdFx0aWYgKCBiaW5kR3JvdXBzQ2FjaGUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGJpbmRHcm91cHNDYWNoZSA9IG5ldyBDaGFpbk1hcCgpO1xyXG5cclxuXHRcdFx0cmVuZGVyZXJDYWNoZS5zZXQoIHRoaXMucmVuZGVyZXIsIGJpbmRHcm91cHNDYWNoZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gYmluZEdyb3Vwc0NhY2hlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgUmVuZGVyVGFyZ2V0fSB3aXRoIHRoZSBnaXZlblxyXG5cdCAqIGRpbWVuc2lvbnMgYW5kIG9wdGlvbnMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIHJlbmRlciB0YXJnZXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIHJlbmRlciB0YXJnZXQuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBvZiB0aGUgcmVuZGVyIHRhcmdldC5cclxuXHQgKiBAcmV0dXJuIHtSZW5kZXJUYXJnZXR9IFRoZSByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqL1xyXG5cdGNyZWF0ZVJlbmRlclRhcmdldCggd2lkdGgsIGhlaWdodCwgb3B0aW9ucyApIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IFJlbmRlclRhcmdldCggd2lkdGgsIGhlaWdodCwgb3B0aW9ucyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgQ3ViZVJlbmRlclRhcmdldH0gd2l0aCB0aGUgZ2l2ZW5cclxuXHQgKiBkaW1lbnNpb25zIGFuZCBvcHRpb25zLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHNpemUgLSBUaGUgc2l6ZSBvZiB0aGUgY3ViZSByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgb2YgdGhlIGN1YmUgcmVuZGVyIHRhcmdldC5cclxuXHQgKiBAcmV0dXJuIHtDdWJlUmVuZGVyVGFyZ2V0fSBUaGUgY3ViZSByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqL1xyXG5cdGNyZWF0ZUN1YmVSZW5kZXJUYXJnZXQoIHNpemUsIG9wdGlvbnMgKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBDdWJlUmVuZGVyVGFyZ2V0KCBzaXplLCBvcHRpb25zICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogV2hldGhlciB0aGUgZ2l2ZW4gbm9kZSBpcyBpbmNsdWRlZCBpbiB0aGUgaW50ZXJuYWwgYXJyYXkgb2Ygbm9kZXMgb3Igbm90LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIG5vZGUgdG8gdGVzdC5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBnaXZlbiBub2RlIGlzIGluY2x1ZGVkIGluIHRoZSBpbnRlcm5hbCBhcnJheSBvZiBub2RlcyBvciBub3QuXHJcblx0ICovXHJcblx0aW5jbHVkZXMoIG5vZGUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubm9kZXMuaW5jbHVkZXMoIG5vZGUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBvdXRwdXQgc3RydWN0IG5hbWUgd2hpY2ggaXMgcmVxdWlyZWQgYnlcclxuXHQgKiB7QGxpbmsgT3V0cHV0U3RydWN0Tm9kZX0uXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBuYW1lIG9mIHRoZSBvdXRwdXQgc3RydWN0LlxyXG5cdCAqL1xyXG5cdGdldE91dHB1dFN0cnVjdE5hbWUoKSB7fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgYmluZCBncm91cCBmb3IgdGhlIGdpdmVuIGdyb3VwIG5hbWUgYW5kIGJpbmRpbmcuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBncm91cE5hbWUgLSBUaGUgZ3JvdXAgbmFtZS5cclxuXHQgKiBAcGFyYW0ge0FycmF5PE5vZGVVbmlmb3Jtc0dyb3VwPn0gYmluZGluZ3MgLSBMaXN0IG9mIGJpbmRpbmdzLlxyXG5cdCAqIEByZXR1cm4ge0JpbmRHcm91cH0gVGhlIGJpbmQgZ3JvdXBcclxuXHQgKi9cclxuXHRfZ2V0QmluZEdyb3VwKCBncm91cE5hbWUsIGJpbmRpbmdzICkge1xyXG5cclxuXHRcdGNvbnN0IGJpbmRHcm91cHNDYWNoZSA9IHRoaXMuZ2V0QmluZEdyb3Vwc0NhY2hlKCk7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCBiaW5kaW5nc0FycmF5ID0gW107XHJcblxyXG5cdFx0bGV0IHNoYXJlZEdyb3VwID0gdHJ1ZTtcclxuXHJcblx0XHRmb3IgKCBjb25zdCBiaW5kaW5nIG9mIGJpbmRpbmdzICkge1xyXG5cclxuXHRcdFx0YmluZGluZ3NBcnJheS5wdXNoKCBiaW5kaW5nICk7XHJcblxyXG5cdFx0XHRzaGFyZWRHcm91cCA9IHNoYXJlZEdyb3VwICYmIGJpbmRpbmcuZ3JvdXBOb2RlLnNoYXJlZCAhPT0gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRsZXQgYmluZEdyb3VwO1xyXG5cclxuXHRcdGlmICggc2hhcmVkR3JvdXAgKSB7XHJcblxyXG5cdFx0XHRiaW5kR3JvdXAgPSBiaW5kR3JvdXBzQ2FjaGUuZ2V0KCBiaW5kaW5nc0FycmF5ICk7XHJcblxyXG5cdFx0XHRpZiAoIGJpbmRHcm91cCA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRiaW5kR3JvdXAgPSBuZXcgQmluZEdyb3VwKCBncm91cE5hbWUsIGJpbmRpbmdzQXJyYXksIHRoaXMuYmluZGluZ3NJbmRleGVzWyBncm91cE5hbWUgXS5ncm91cCwgYmluZGluZ3NBcnJheSApO1xyXG5cclxuXHRcdFx0XHRiaW5kR3JvdXBzQ2FjaGUuc2V0KCBiaW5kaW5nc0FycmF5LCBiaW5kR3JvdXAgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0YmluZEdyb3VwID0gbmV3IEJpbmRHcm91cCggZ3JvdXBOYW1lLCBiaW5kaW5nc0FycmF5LCB0aGlzLmJpbmRpbmdzSW5kZXhlc1sgZ3JvdXBOYW1lIF0uZ3JvdXAsIGJpbmRpbmdzQXJyYXkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGJpbmRHcm91cDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGFuIGFycmF5IG9mIG5vZGUgdW5pZm9ybSBncm91cHMgZm9yIHRoZSBnaXZlbiBncm91cCBuYW1lIGFuZCBzaGFkZXIgc3RhZ2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gZ3JvdXBOYW1lIC0gVGhlIGdyb3VwIG5hbWUuXHJcblx0ICogQHBhcmFtIHsoJ3ZlcnRleCd8J2ZyYWdtZW50J3wnY29tcHV0ZSd8J2FueScpfSBzaGFkZXJTdGFnZSAtIFRoZSBzaGFkZXIgc3RhZ2UuXHJcblx0ICogQHJldHVybiB7QXJyYXk8Tm9kZVVuaWZvcm1zR3JvdXA+fSBUaGUgYXJyYXkgb2Ygbm9kZSB1bmlmb3JtIGdyb3Vwcy5cclxuXHQgKi9cclxuXHRnZXRCaW5kR3JvdXBBcnJheSggZ3JvdXBOYW1lLCBzaGFkZXJTdGFnZSApIHtcclxuXHJcblx0XHRjb25zdCBiaW5kaW5ncyA9IHRoaXMuYmluZGluZ3NbIHNoYWRlclN0YWdlIF07XHJcblxyXG5cdFx0bGV0IGJpbmRHcm91cCA9IGJpbmRpbmdzWyBncm91cE5hbWUgXTtcclxuXHJcblx0XHRpZiAoIGJpbmRHcm91cCA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLmJpbmRpbmdzSW5kZXhlc1sgZ3JvdXBOYW1lIF0gPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5iaW5kaW5nc0luZGV4ZXNbIGdyb3VwTmFtZSBdID0geyBiaW5kaW5nOiAwLCBncm91cDogT2JqZWN0LmtleXMoIHRoaXMuYmluZGluZ3NJbmRleGVzICkubGVuZ3RoIH07XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRiaW5kaW5nc1sgZ3JvdXBOYW1lIF0gPSBiaW5kR3JvdXAgPSBbXTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGJpbmRHcm91cDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbGlzdCBiaW5kaW5ncyBvZiBhbGwgc2hhZGVyIHN0YWdlcyBzZXBhcmF0ZWQgYnkgZ3JvdXBzLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7QXJyYXk8QmluZEdyb3VwPn0gVGhlIGxpc3Qgb2YgYmluZGluZ3MuXHJcblx0ICovXHJcblx0Z2V0QmluZGluZ3MoKSB7XHJcblxyXG5cdFx0bGV0IGJpbmRpbmdzR3JvdXBzID0gdGhpcy5iaW5kR3JvdXBzO1xyXG5cclxuXHRcdGlmICggYmluZGluZ3NHcm91cHMgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBncm91cHMgPSB7fTtcclxuXHRcdFx0Y29uc3QgYmluZGluZ3MgPSB0aGlzLmJpbmRpbmdzO1xyXG5cclxuXHRcdFx0Zm9yICggY29uc3Qgc2hhZGVyU3RhZ2Ugb2Ygc2hhZGVyU3RhZ2VzICkge1xyXG5cclxuXHRcdFx0XHRmb3IgKCBjb25zdCBncm91cE5hbWUgaW4gYmluZGluZ3NbIHNoYWRlclN0YWdlIF0gKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgdW5pZm9ybXMgPSBiaW5kaW5nc1sgc2hhZGVyU3RhZ2UgXVsgZ3JvdXBOYW1lIF07XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgZ3JvdXBVbmlmb3JtcyA9IGdyb3Vwc1sgZ3JvdXBOYW1lIF0gfHwgKCBncm91cHNbIGdyb3VwTmFtZSBdID0gW10gKTtcclxuXHRcdFx0XHRcdGdyb3VwVW5pZm9ybXMucHVzaCggLi4udW5pZm9ybXMgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0YmluZGluZ3NHcm91cHMgPSBbXTtcclxuXHJcblx0XHRcdGZvciAoIGNvbnN0IGdyb3VwTmFtZSBpbiBncm91cHMgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGdyb3VwID0gZ3JvdXBzWyBncm91cE5hbWUgXTtcclxuXHJcblx0XHRcdFx0Y29uc3QgYmluZGluZ3NHcm91cCA9IHRoaXMuX2dldEJpbmRHcm91cCggZ3JvdXBOYW1lLCBncm91cCApO1xyXG5cclxuXHRcdFx0XHRiaW5kaW5nc0dyb3Vwcy5wdXNoKCBiaW5kaW5nc0dyb3VwICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0aGlzLmJpbmRHcm91cHMgPSBiaW5kaW5nc0dyb3VwcztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGJpbmRpbmdzR3JvdXBzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNvcnRzIHRoZSBiaW5kIGdyb3VwcyBhbmQgdXBkYXRlcyB7QGxpbmsgTm9kZUJ1aWxkZXIjYmluZGluZ3NJbmRleGVzfS5cclxuXHQgKi9cclxuXHRzb3J0QmluZGluZ0dyb3VwcygpIHtcclxuXHJcblx0XHRjb25zdCBiaW5kaW5nc0dyb3VwcyA9IHRoaXMuZ2V0QmluZGluZ3MoKTtcclxuXHJcblx0XHRiaW5kaW5nc0dyb3Vwcy5zb3J0KCAoIGEsIGIgKSA9PiAoIGEuYmluZGluZ3NbIDAgXS5ncm91cE5vZGUub3JkZXIgLSBiLmJpbmRpbmdzWyAwIF0uZ3JvdXBOb2RlLm9yZGVyICkgKTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBiaW5kaW5nc0dyb3Vwcy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBiaW5kaW5nR3JvdXAgPSBiaW5kaW5nc0dyb3Vwc1sgaSBdO1xyXG5cdFx0XHR0aGlzLmJpbmRpbmdzSW5kZXhlc1sgYmluZGluZ0dyb3VwLm5hbWUgXS5ncm91cCA9IGk7XHJcblxyXG5cdFx0XHRiaW5kaW5nR3JvdXAuaW5kZXggPSBpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgYnVpbGRlciBtYWludGFpbnMgZWFjaCBub2RlIGluIGEgaGFzaC1iYXNlZCBkaWN0aW9uYXJ5LlxyXG5cdCAqIFRoaXMgbWV0aG9kIHNldHMgdGhlIGdpdmVuIG5vZGUgKHZhbHVlKSB3aXRoIHRoZSBnaXZlbiBoYXNoIChrZXkpIGludG8gdGhpcyBkaWN0aW9uYXJ5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIG5vZGUgdG8gYWRkLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBoYXNoIC0gVGhlIGhhc2ggb2YgdGhlIG5vZGUuXHJcblx0ICovXHJcblx0c2V0SGFzaE5vZGUoIG5vZGUsIGhhc2ggKSB7XHJcblxyXG5cdFx0dGhpcy5oYXNoTm9kZXNbIGhhc2ggXSA9IG5vZGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyBhIG5vZGUgdG8gdGhpcyBidWlsZGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIG5vZGUgdG8gYWRkLlxyXG5cdCAqL1xyXG5cdGFkZE5vZGUoIG5vZGUgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm5vZGVzLmluY2x1ZGVzKCBub2RlICkgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0dGhpcy5ub2Rlcy5wdXNoKCBub2RlICk7XHJcblxyXG5cdFx0XHR0aGlzLnNldEhhc2hOb2RlKCBub2RlLCBub2RlLmdldEhhc2goIHRoaXMgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJdCBpcyB1c2VkIHRvIGFkZCBOb2RlcyB0aGF0IHdpbGwgYmUgdXNlZCBhcyBGUkFNRSBhbmQgUkVOREVSIGV2ZW50cyxcclxuXHQgKiBhbmQgbmVlZCB0byBmb2xsb3cgYSBjZXJ0YWluIHNlcXVlbmNlIGluIHRoZSBjYWxscyB0byB3b3JrIGNvcnJlY3RseS5cclxuXHQgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgJ3NldHVwKCknIGluIHRoZSAnYnVpbGQoKScgcHJvY2VzcyB0byBlbnN1cmUgdGhhdCB0aGUgY2hpbGQgbm9kZXMgYXJlIHByb2Nlc3NlZCBmaXJzdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFRoZSBub2RlIHRvIGFkZC5cclxuXHQgKi9cclxuXHRhZGRTZXF1ZW50aWFsTm9kZSggbm9kZSApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuc2VxdWVudGlhbE5vZGVzLmluY2x1ZGVzKCBub2RlICkgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0dGhpcy5zZXF1ZW50aWFsTm9kZXMucHVzaCggbm9kZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDaGVja3MgdGhlIHVwZGF0ZSB0eXBlcyBvZiBub2Rlc1xyXG5cdCAqL1xyXG5cdGJ1aWxkVXBkYXRlTm9kZXMoKSB7XHJcblxyXG5cdFx0Zm9yICggY29uc3Qgbm9kZSBvZiB0aGlzLm5vZGVzICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdXBkYXRlVHlwZSA9IG5vZGUuZ2V0VXBkYXRlVHlwZSgpO1xyXG5cclxuXHRcdFx0aWYgKCB1cGRhdGVUeXBlICE9PSBOb2RlVXBkYXRlVHlwZS5OT05FICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLnVwZGF0ZU5vZGVzLnB1c2goIG5vZGUuZ2V0U2VsZigpICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZvciAoIGNvbnN0IG5vZGUgb2YgdGhpcy5zZXF1ZW50aWFsTm9kZXMgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB1cGRhdGVCZWZvcmVUeXBlID0gbm9kZS5nZXRVcGRhdGVCZWZvcmVUeXBlKCk7XHJcblx0XHRcdGNvbnN0IHVwZGF0ZUFmdGVyVHlwZSA9IG5vZGUuZ2V0VXBkYXRlQWZ0ZXJUeXBlKCk7XHJcblxyXG5cdFx0XHRpZiAoIHVwZGF0ZUJlZm9yZVR5cGUgIT09IE5vZGVVcGRhdGVUeXBlLk5PTkUgKSB7XHJcblxyXG5cdFx0XHRcdHRoaXMudXBkYXRlQmVmb3JlTm9kZXMucHVzaCggbm9kZS5nZXRTZWxmKCkgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggdXBkYXRlQWZ0ZXJUeXBlICE9PSBOb2RlVXBkYXRlVHlwZS5OT05FICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLnVwZGF0ZUFmdGVyTm9kZXMucHVzaCggbm9kZS5nZXRTZWxmKCkgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQSByZWZlcmVuY2UgdGhlIGN1cnJlbnQgbm9kZSB3aGljaCBpcyB0aGVcclxuXHQgKiBsYXN0IG5vZGUgaW4gdGhlIGNoYWluIG9mIG5vZGVzLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge05vZGV9XHJcblx0ICovXHJcblx0Z2V0IGN1cnJlbnROb2RlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmNoYWluaW5nWyB0aGlzLmNoYWluaW5nLmxlbmd0aCAtIDEgXTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBXaGV0aGVyIHRoZSBnaXZlbiB0ZXh0dXJlIGlzIGZpbHRlcmVkIG9yIG5vdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlIHRvIGNoZWNrLlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGdpdmVuIHRleHR1cmUgaXMgZmlsdGVyZWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGlzRmlsdGVyZWRUZXh0dXJlKCB0ZXh0dXJlICkge1xyXG5cclxuXHRcdHJldHVybiAoIHRleHR1cmUubWFnRmlsdGVyID09PSBMaW5lYXJGaWx0ZXIgfHwgdGV4dHVyZS5tYWdGaWx0ZXIgPT09IExpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXIgfHwgdGV4dHVyZS5tYWdGaWx0ZXIgPT09IE5lYXJlc3RNaXBtYXBMaW5lYXJGaWx0ZXIgfHwgdGV4dHVyZS5tYWdGaWx0ZXIgPT09IExpbmVhck1pcG1hcExpbmVhckZpbHRlciB8fFxyXG5cdFx0XHR0ZXh0dXJlLm1pbkZpbHRlciA9PT0gTGluZWFyRmlsdGVyIHx8IHRleHR1cmUubWluRmlsdGVyID09PSBMaW5lYXJNaXBtYXBOZWFyZXN0RmlsdGVyIHx8IHRleHR1cmUubWluRmlsdGVyID09PSBOZWFyZXN0TWlwbWFwTGluZWFyRmlsdGVyIHx8IHRleHR1cmUubWluRmlsdGVyID09PSBMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIHRoZSBnaXZlbiBub2RlIHRvIHRoZSBpbnRlcm5hbCBub2RlIGNoYWluLlxyXG5cdCAqIFRoaXMgaXMgdXNlZCB0byBjaGVjayByZWN1cnNpdmUgY2FsbHMgaW4gbm9kZS1ncmFwaC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFRoZSBub2RlIHRvIGFkZC5cclxuXHQgKi9cclxuXHRhZGRDaGFpbiggbm9kZSApIHtcclxuXHJcblx0XHQvKlxyXG5cdFx0aWYgKCB0aGlzLmNoYWluaW5nLmluZGV4T2YoIG5vZGUgKSAhPT0gLSAxICkge1xyXG5cclxuXHRcdFx0Y29uc29sZS53YXJuKCAnUmVjdXJzaXZlIG5vZGU6ICcsIG5vZGUgKTtcclxuXHJcblx0XHR9XHJcblx0XHQqL1xyXG5cclxuXHRcdHRoaXMuY2hhaW5pbmcucHVzaCggbm9kZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbW92ZXMgdGhlIGdpdmVuIG5vZGUgZnJvbSB0aGUgaW50ZXJuYWwgbm9kZSBjaGFpbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFRoZSBub2RlIHRvIHJlbW92ZS5cclxuXHQgKi9cclxuXHRyZW1vdmVDaGFpbiggbm9kZSApIHtcclxuXHJcblx0XHRjb25zdCBsYXN0Q2hhaW4gPSB0aGlzLmNoYWluaW5nLnBvcCgpO1xyXG5cclxuXHRcdGlmICggbGFzdENoYWluICE9PSBub2RlICkge1xyXG5cclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnTm9kZUJ1aWxkZXI6IEludmFsaWQgbm9kZSBjaGFpbmluZyEnICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIG5hdGl2ZSBzaGFkZXIgbWV0aG9kIG5hbWUgZm9yIGEgZ2l2ZW4gZ2VuZXJpYyBuYW1lLiBFLmcuXHJcblx0ICogdGhlIG1ldGhvZCBuYW1lIGB0ZXh0dXJlRGltZW5zaW9uc2AgbWF0Y2hlcyB0aGUgV0dTTCBuYW1lIGJ1dCBtdXN0IGJlXHJcblx0ICogcmVzb2x2ZWQgdG8gYHRleHR1cmVTaXplYCBpbiBHTFNMLlxyXG5cdCAqXHJcblx0ICogQGFic3RyYWN0XHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZCAtIFRoZSBtZXRob2QgbmFtZSB0byByZXNvbHZlLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHJlc29sdmVkIG1ldGhvZCBuYW1lLlxyXG5cdCAqL1xyXG5cdGdldE1ldGhvZCggbWV0aG9kICkge1xyXG5cclxuXHRcdHJldHVybiBtZXRob2Q7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIG5vZGUgZm9yIHRoZSBnaXZlbiBoYXNoLCBzZWUge0BsaW5rIE5vZGVCdWlsZGVyI3NldEhhc2hOb2RlfS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBoYXNoIC0gVGhlIGhhc2ggb2YgdGhlIG5vZGUuXHJcblx0ICogQHJldHVybiB7Tm9kZX0gVGhlIGZvdW5kIG5vZGUuXHJcblx0ICovXHJcblx0Z2V0Tm9kZUZyb21IYXNoKCBoYXNoICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmhhc2hOb2Rlc1sgaGFzaCBdO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgdGhlIE5vZGUgdG8gYSB0YXJnZXQgZmxvdyBzbyB0aGF0IGl0IGNhbiBnZW5lcmF0ZSBjb2RlIGluIHRoZSAnZ2VuZXJhdGUnIHByb2Nlc3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geygndmVydGV4J3wnZnJhZ21lbnQnfCdjb21wdXRlJyl9IHNoYWRlclN0YWdlIC0gVGhlIHNoYWRlciBzdGFnZS5cclxuXHQgKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBUaGUgbm9kZSB0byBhZGQuXHJcblx0ICogQHJldHVybiB7Tm9kZX0gVGhlIG5vZGUuXHJcblx0ICovXHJcblx0YWRkRmxvdyggc2hhZGVyU3RhZ2UsIG5vZGUgKSB7XHJcblxyXG5cdFx0dGhpcy5mbG93Tm9kZXNbIHNoYWRlclN0YWdlIF0ucHVzaCggbm9kZSApO1xyXG5cclxuXHRcdHJldHVybiBub2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgYnVpbGRlcidzIGNvbnRleHQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dCAtIFRoZSBjb250ZXh0IHRvIHNldC5cclxuXHQgKi9cclxuXHRzZXRDb250ZXh0KCBjb250ZXh0ICkge1xyXG5cclxuXHRcdHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgYnVpbGRlcidzIGN1cnJlbnQgY29udGV4dC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge09iamVjdH0gVGhlIGJ1aWxkZXIncyBjdXJyZW50IGNvbnRleHQuXHJcblx0ICovXHJcblx0Z2V0Q29udGV4dCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5jb250ZXh0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdldHMgYSBjb250ZXh0IHVzZWQgaW4gc2hhZGVyIGNvbnN0cnVjdGlvbiB0aGF0IGNhbiBiZSBzaGFyZWQgYWNyb3NzIGRpZmZlcmVudCBtYXRlcmlhbHMuXHJcblx0ICogVGhpcyBpcyBuZWNlc3Nhcnkgc2luY2UgdGhlIHJlbmRlcmVyIGNhY2hlIGNhbiByZXVzZSBzaGFkZXJzIGdlbmVyYXRlZCBpbiBvbmUgbWF0ZXJpYWwgYW5kIHVzZSB0aGVtIGluIGFub3RoZXIuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBidWlsZGVyJ3MgY3VycmVudCBjb250ZXh0IHdpdGhvdXQgbWF0ZXJpYWwuXHJcblx0ICovXHJcblx0Z2V0U2hhcmVkQ29udGV4dCgpIHtcclxuXHJcblx0XHRjb25zdCBjb250ZXh0ID0geyAuLi50aGlzLmNvbnRleHQgfTtcclxuXHJcblx0XHRkZWxldGUgY29udGV4dC5tYXRlcmlhbDtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5jb250ZXh0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgYnVpbGRlcidzIGNhY2hlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlQ2FjaGV9IGNhY2hlIC0gVGhlIGNhY2hlIHRvIHNldC5cclxuXHQgKi9cclxuXHRzZXRDYWNoZSggY2FjaGUgKSB7XHJcblxyXG5cdFx0dGhpcy5jYWNoZSA9IGNhY2hlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGJ1aWxkZXIncyBjdXJyZW50IGNhY2hlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Tm9kZUNhY2hlfSBUaGUgYnVpbGRlcidzIGN1cnJlbnQgY2FjaGUuXHJcblx0ICovXHJcblx0Z2V0Q2FjaGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuY2FjaGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIGNhY2hlIGZvciB0aGUgZ2l2ZW4gbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFRoZSBub2RlLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BhcmVudD10cnVlXSAtIFdoZXRoZXIgdGhpcyBub2RlIHJlZmVycyB0byBhIHNoYXJlZCBwYXJlbnQgY2FjaGUgb3Igbm90LlxyXG5cdCAqIEByZXR1cm4ge05vZGVDYWNoZX0gVGhlIGNhY2hlLlxyXG5cdCAqL1xyXG5cdGdldENhY2hlRnJvbU5vZGUoIG5vZGUsIHBhcmVudCA9IHRydWUgKSB7XHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IHRoaXMuZ2V0RGF0YUZyb21Ob2RlKCBub2RlICk7XHJcblx0XHRpZiAoIGRhdGEuY2FjaGUgPT09IHVuZGVmaW5lZCApIGRhdGEuY2FjaGUgPSBuZXcgTm9kZUNhY2hlKCBwYXJlbnQgPyB0aGlzLmdldENhY2hlKCkgOiBudWxsICk7XHJcblxyXG5cdFx0cmV0dXJuIGRhdGEuY2FjaGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogV2hldGhlciB0aGUgcmVxdWVzdGVkIGZlYXR1cmUgaXMgYXZhaWxhYmxlIG9yIG5vdC5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIHJlcXVlc3RlZCBmZWF0dXJlLlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHJlcXVlc3RlZCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBvciBub3QuXHJcblx0ICovXHJcblx0aXNBdmFpbGFibGUoIC8qbmFtZSovICkge1xyXG5cclxuXHRcdHJldHVybiBmYWxzZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSB2ZXJ0ZXhJbmRleCBpbnB1dCB2YXJpYWJsZSBhcyBhIG5hdGl2ZSBzaGFkZXIgc3RyaW5nLlxyXG5cdCAqXHJcblx0ICogQGFic3RyYWN0XHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgaW5zdGFuY2VJbmRleCBzaGFkZXIgc3RyaW5nLlxyXG5cdCAqL1xyXG5cdGdldFZlcnRleEluZGV4KCkge1xyXG5cclxuXHRcdGNvbnNvbGUud2FybiggJ0Fic3RyYWN0IGZ1bmN0aW9uLicgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBpbnN0YW5jZUluZGV4IGlucHV0IHZhcmlhYmxlIGFzIGEgbmF0aXZlIHNoYWRlciBzdHJpbmcuXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBpbnN0YW5jZUluZGV4IHNoYWRlciBzdHJpbmcuXHJcblx0ICovXHJcblx0Z2V0SW5zdGFuY2VJbmRleCgpIHtcclxuXHJcblx0XHRjb25zb2xlLndhcm4oICdBYnN0cmFjdCBmdW5jdGlvbi4nICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgZHJhd0luZGV4IGlucHV0IHZhcmlhYmxlIGFzIGEgbmF0aXZlIHNoYWRlciBzdHJpbmcuXHJcblx0ICogT25seSByZWxldmFudCBmb3IgV2ViR0wgYW5kIGl0cyBgV0VCR0xfbXVsdGlfZHJhd2AgZXh0ZW5zaW9uLlxyXG5cdCAqXHJcblx0ICogQGFic3RyYWN0XHJcblx0ICogQHJldHVybiB7P3N0cmluZ30gVGhlIGRyYXdJbmRleCBzaGFkZXIgc3RyaW5nLlxyXG5cdCAqL1xyXG5cdGdldERyYXdJbmRleCgpIHtcclxuXHJcblx0XHRjb25zb2xlLndhcm4oICdBYnN0cmFjdCBmdW5jdGlvbi4nICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgZnJvbnRGYWNpbmcgaW5wdXQgdmFyaWFibGUgYXMgYSBuYXRpdmUgc2hhZGVyIHN0cmluZy5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGZyb250RmFjaW5nIHNoYWRlciBzdHJpbmcuXHJcblx0ICovXHJcblx0Z2V0RnJvbnRGYWNpbmcoKSB7XHJcblxyXG5cdFx0Y29uc29sZS53YXJuKCAnQWJzdHJhY3QgZnVuY3Rpb24uJyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGZyYWdDb29yZCBpbnB1dCB2YXJpYWJsZSBhcyBhIG5hdGl2ZSBzaGFkZXIgc3RyaW5nLlxyXG5cdCAqXHJcblx0ICogQGFic3RyYWN0XHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgZnJhZ0Nvb3JkIHNoYWRlciBzdHJpbmcuXHJcblx0ICovXHJcblx0Z2V0RnJhZ0Nvb3JkKCkge1xyXG5cclxuXHRcdGNvbnNvbGUud2FybiggJ0Fic3RyYWN0IGZ1bmN0aW9uLicgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBXaGV0aGVyIHRvIGZsaXAgdGV4dHVyZSBkYXRhIGFsb25nIGl0cyB2ZXJ0aWNhbCBheGlzIG9yIG5vdC4gV2ViR0wgbmVlZHNcclxuXHQgKiB0aGlzIG1ldGhvZCBldmFsdWF0ZSB0byBgdHJ1ZWAsIFdlYkdQVSB0byBgZmFsc2VgLlxyXG5cdCAqXHJcblx0ICogQGFic3RyYWN0XHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0byBmbGlwIHRleHR1cmUgZGF0YSBhbG9uZyBpdHMgdmVydGljYWwgYXhpcyBvciBub3QuXHJcblx0ICovXHJcblx0aXNGbGlwWSgpIHtcclxuXHJcblx0XHRyZXR1cm4gZmFsc2U7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2FsbGluZyB0aGlzIG1ldGhvZCBpbmNyZWFzZXMgdGhlIHVzYWdlIGNvdW50IGZvciB0aGUgZ2l2ZW4gbm9kZSBieSBvbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBUaGUgbm9kZSB0byBpbmNyZWFzZSB0aGUgdXNhZ2UgY291bnQgZm9yLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIHVwZGF0ZWQgdXNhZ2UgY291bnQuXHJcblx0ICovXHJcblx0aW5jcmVhc2VVc2FnZSggbm9kZSApIHtcclxuXHJcblx0XHRjb25zdCBub2RlRGF0YSA9IHRoaXMuZ2V0RGF0YUZyb21Ob2RlKCBub2RlICk7XHJcblx0XHRub2RlRGF0YS51c2FnZUNvdW50ID0gbm9kZURhdGEudXNhZ2VDb3VudCA9PT0gdW5kZWZpbmVkID8gMSA6IG5vZGVEYXRhLnVzYWdlQ291bnQgKyAxO1xyXG5cclxuXHRcdHJldHVybiBub2RlRGF0YS51c2FnZUNvdW50O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyBhIHRleHR1cmUgc2FtcGxlIHNoYWRlciBzdHJpbmcgZm9yIHRoZSBnaXZlbiB0ZXh0dXJlIGRhdGEuXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdGV4dHVyZVByb3BlcnR5IC0gVGhlIHRleHR1cmUgcHJvcGVydHkgbmFtZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdXZTbmlwcGV0IC0gU25pcHBldCBkZWZpbmluZyB0aGUgdGV4dHVyZSBjb29yZGluYXRlcy5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBnZW5lcmF0ZWQgc2hhZGVyIHN0cmluZy5cclxuXHQgKi9cclxuXHRnZW5lcmF0ZVRleHR1cmUoIC8qIHRleHR1cmUsIHRleHR1cmVQcm9wZXJ0eSwgdXZTbmlwcGV0ICovICkge1xyXG5cclxuXHRcdGNvbnNvbGUud2FybiggJ0Fic3RyYWN0IGZ1bmN0aW9uLicgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZW5lcmF0ZXMgYSB0ZXh0dXJlIExPRCBzaGFkZXIgc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdGV4dHVyZSBkYXRhLlxyXG5cdCAqXHJcblx0ICogQGFic3RyYWN0XHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHRleHR1cmVQcm9wZXJ0eSAtIFRoZSB0ZXh0dXJlIHByb3BlcnR5IG5hbWUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHV2U25pcHBldCAtIFNuaXBwZXQgZGVmaW5pbmcgdGhlIHRleHR1cmUgY29vcmRpbmF0ZXMuXHJcblx0ICogQHBhcmFtIHs/c3RyaW5nfSBkZXB0aFNuaXBwZXQgLSBTbmlwcGV0IGRlZmluaW5nIHRoZSAwLWJhc2VkIHRleHR1cmUgYXJyYXkgaW5kZXggdG8gc2FtcGxlLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBsZXZlbFNuaXBwZXQgLSBTbmlwcGV0IGRlZmluaW5nIHRoZSBtaXAgbGV2ZWwuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgZ2VuZXJhdGVkIHNoYWRlciBzdHJpbmcuXHJcblx0ICovXHJcblx0Z2VuZXJhdGVUZXh0dXJlTG9kKCAvKiB0ZXh0dXJlLCB0ZXh0dXJlUHJvcGVydHksIHV2U25pcHBldCwgZGVwdGhTbmlwcGV0LCBsZXZlbFNuaXBwZXQgKi8gKSB7XHJcblxyXG5cdFx0Y29uc29sZS53YXJuKCAnQWJzdHJhY3QgZnVuY3Rpb24uJyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyB0aGUgYXJyYXkgZGVjbGFyYXRpb24gc3RyaW5nLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBUaGUgdHlwZS5cclxuXHQgKiBAcGFyYW0gez9udW1iZXJ9IFtjb3VudF0gLSBUaGUgY291bnQuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgZ2VuZXJhdGVkIHZhbHVlIGFzIGEgc2hhZGVyIHN0cmluZy5cclxuXHQgKi9cclxuXHRnZW5lcmF0ZUFycmF5RGVjbGFyYXRpb24oIHR5cGUsIGNvdW50ICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmdldFR5cGUoIHR5cGUgKSArICdbICcgKyBjb3VudCArICcgXSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2VuZXJhdGVzIHRoZSBhcnJheSBzaGFkZXIgc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZSBhbmQgdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSB0eXBlLlxyXG5cdCAqIEBwYXJhbSB7P251bWJlcn0gW2NvdW50XSAtIFRoZSBjb3VudC5cclxuXHQgKiBAcGFyYW0gez9BcnJheTxOb2RlPn0gW3ZhbHVlcz1udWxsXSAtIFRoZSBkZWZhdWx0IHZhbHVlcy5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBnZW5lcmF0ZWQgdmFsdWUgYXMgYSBzaGFkZXIgc3RyaW5nLlxyXG5cdCAqL1xyXG5cdGdlbmVyYXRlQXJyYXkoIHR5cGUsIGNvdW50LCB2YWx1ZXMgPSBudWxsICkge1xyXG5cclxuXHRcdGxldCBzbmlwcGV0ID0gdGhpcy5nZW5lcmF0ZUFycmF5RGVjbGFyYXRpb24oIHR5cGUsIGNvdW50ICkgKyAnKCAnO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGNvdW50OyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdmFsdWUgPSB2YWx1ZXMgPyB2YWx1ZXNbIGkgXSA6IG51bGw7XHJcblxyXG5cdFx0XHRpZiAoIHZhbHVlICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRzbmlwcGV0ICs9IHZhbHVlLmJ1aWxkKCB0aGlzLCB0eXBlICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRzbmlwcGV0ICs9IHRoaXMuZ2VuZXJhdGVDb25zdCggdHlwZSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBpIDwgY291bnQgLSAxICkgc25pcHBldCArPSAnLCAnO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRzbmlwcGV0ICs9ICcgKSc7XHJcblxyXG5cdFx0cmV0dXJuIHNuaXBwZXQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2VuZXJhdGVzIHRoZSBzdHJ1Y3Qgc2hhZGVyIHN0cmluZy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIHR5cGUuXHJcblx0ICogQHBhcmFtIHtBcnJheTxPYmplY3Q+fSBbbWVtYmVyc0xheW91dF0gLSBUaGUgY291bnQuXHJcblx0ICogQHBhcmFtIHs/QXJyYXk8Tm9kZT59IFt2YWx1ZXM9bnVsbF0gLSBUaGUgZGVmYXVsdCB2YWx1ZXMuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgZ2VuZXJhdGVkIHZhbHVlIGFzIGEgc2hhZGVyIHN0cmluZy5cclxuXHQgKi9cclxuXHRnZW5lcmF0ZVN0cnVjdCggdHlwZSwgbWVtYmVyc0xheW91dCwgdmFsdWVzID0gbnVsbCApIHtcclxuXHJcblx0XHRjb25zdCBzbmlwcGV0cyA9IFtdO1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IG1lbWJlciBvZiBtZW1iZXJzTGF5b3V0ICkge1xyXG5cclxuXHRcdFx0Y29uc3QgeyBuYW1lLCB0eXBlIH0gPSBtZW1iZXI7XHJcblxyXG5cdFx0XHRpZiAoIHZhbHVlcyAmJiB2YWx1ZXNbIG5hbWUgXSAmJiB2YWx1ZXNbIG5hbWUgXS5pc05vZGUgKSB7XHJcblxyXG5cdFx0XHRcdHNuaXBwZXRzLnB1c2goIHZhbHVlc1sgbmFtZSBdLmJ1aWxkKCB0aGlzLCB0eXBlICkgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHNuaXBwZXRzLnB1c2goIHRoaXMuZ2VuZXJhdGVDb25zdCggdHlwZSApICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0eXBlICsgJyggJyArIHNuaXBwZXRzLmpvaW4oICcsICcgKSArICcgKSc7XHJcblxyXG5cdH1cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyB0aGUgc2hhZGVyIHN0cmluZyBmb3IgdGhlIGdpdmVuIHR5cGUgYW5kIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBUaGUgdHlwZS5cclxuXHQgKiBAcGFyYW0gez9hbnl9IFt2YWx1ZT1udWxsXSAtIFRoZSB2YWx1ZS5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBnZW5lcmF0ZWQgdmFsdWUgYXMgYSBzaGFkZXIgc3RyaW5nLlxyXG5cdCAqL1xyXG5cdGdlbmVyYXRlQ29uc3QoIHR5cGUsIHZhbHVlID0gbnVsbCApIHtcclxuXHJcblx0XHRpZiAoIHZhbHVlID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0aWYgKCB0eXBlID09PSAnZmxvYXQnIHx8IHR5cGUgPT09ICdpbnQnIHx8IHR5cGUgPT09ICd1aW50JyApIHZhbHVlID0gMDtcclxuXHRcdFx0ZWxzZSBpZiAoIHR5cGUgPT09ICdib29sJyApIHZhbHVlID0gZmFsc2U7XHJcblx0XHRcdGVsc2UgaWYgKCB0eXBlID09PSAnY29sb3InICkgdmFsdWUgPSBuZXcgQ29sb3IoKTtcclxuXHRcdFx0ZWxzZSBpZiAoIHR5cGUgPT09ICd2ZWMyJyApIHZhbHVlID0gbmV3IFZlY3RvcjIoKTtcclxuXHRcdFx0ZWxzZSBpZiAoIHR5cGUgPT09ICd2ZWMzJyApIHZhbHVlID0gbmV3IFZlY3RvcjMoKTtcclxuXHRcdFx0ZWxzZSBpZiAoIHR5cGUgPT09ICd2ZWM0JyApIHZhbHVlID0gbmV3IFZlY3RvcjQoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0eXBlID09PSAnZmxvYXQnICkgcmV0dXJuIHRvRmxvYXQoIHZhbHVlICk7XHJcblx0XHRpZiAoIHR5cGUgPT09ICdpbnQnICkgcmV0dXJuIGAkeyBNYXRoLnJvdW5kKCB2YWx1ZSApIH1gO1xyXG5cdFx0aWYgKCB0eXBlID09PSAndWludCcgKSByZXR1cm4gdmFsdWUgPj0gMCA/IGAkeyBNYXRoLnJvdW5kKCB2YWx1ZSApIH11YCA6ICcwdSc7XHJcblx0XHRpZiAoIHR5cGUgPT09ICdib29sJyApIHJldHVybiB2YWx1ZSA/ICd0cnVlJyA6ICdmYWxzZSc7XHJcblx0XHRpZiAoIHR5cGUgPT09ICdjb2xvcicgKSByZXR1cm4gYCR7IHRoaXMuZ2V0VHlwZSggJ3ZlYzMnICkgfSggJHsgdG9GbG9hdCggdmFsdWUuciApIH0sICR7IHRvRmxvYXQoIHZhbHVlLmcgKSB9LCAkeyB0b0Zsb2F0KCB2YWx1ZS5iICkgfSApYDtcclxuXHJcblx0XHRjb25zdCB0eXBlTGVuZ3RoID0gdGhpcy5nZXRUeXBlTGVuZ3RoKCB0eXBlICk7XHJcblxyXG5cdFx0Y29uc3QgY29tcG9uZW50VHlwZSA9IHRoaXMuZ2V0Q29tcG9uZW50VHlwZSggdHlwZSApO1xyXG5cclxuXHRcdGNvbnN0IGdlbmVyYXRlQ29uc3QgPSB2YWx1ZSA9PiB0aGlzLmdlbmVyYXRlQ29uc3QoIGNvbXBvbmVudFR5cGUsIHZhbHVlICk7XHJcblxyXG5cdFx0aWYgKCB0eXBlTGVuZ3RoID09PSAyICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIGAkeyB0aGlzLmdldFR5cGUoIHR5cGUgKSB9KCAkeyBnZW5lcmF0ZUNvbnN0KCB2YWx1ZS54ICkgfSwgJHsgZ2VuZXJhdGVDb25zdCggdmFsdWUueSApIH0gKWA7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggdHlwZUxlbmd0aCA9PT0gMyApIHtcclxuXHJcblx0XHRcdHJldHVybiBgJHsgdGhpcy5nZXRUeXBlKCB0eXBlICkgfSggJHsgZ2VuZXJhdGVDb25zdCggdmFsdWUueCApIH0sICR7IGdlbmVyYXRlQ29uc3QoIHZhbHVlLnkgKSB9LCAkeyBnZW5lcmF0ZUNvbnN0KCB2YWx1ZS56ICkgfSApYDtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCB0eXBlTGVuZ3RoID09PSA0ICYmIHR5cGUgIT09ICdtYXQyJyApIHtcclxuXHJcblx0XHRcdHJldHVybiBgJHsgdGhpcy5nZXRUeXBlKCB0eXBlICkgfSggJHsgZ2VuZXJhdGVDb25zdCggdmFsdWUueCApIH0sICR7IGdlbmVyYXRlQ29uc3QoIHZhbHVlLnkgKSB9LCAkeyBnZW5lcmF0ZUNvbnN0KCB2YWx1ZS56ICkgfSwgJHsgZ2VuZXJhdGVDb25zdCggdmFsdWUudyApIH0gKWA7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggdHlwZUxlbmd0aCA+PSA0ICYmIHZhbHVlICYmICggdmFsdWUuaXNNYXRyaXgyIHx8IHZhbHVlLmlzTWF0cml4MyB8fCB2YWx1ZS5pc01hdHJpeDQgKSApIHtcclxuXHJcblx0XHRcdHJldHVybiBgJHsgdGhpcy5nZXRUeXBlKCB0eXBlICkgfSggJHsgdmFsdWUuZWxlbWVudHMubWFwKCBnZW5lcmF0ZUNvbnN0ICkuam9pbiggJywgJyApIH0gKWA7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggdHlwZUxlbmd0aCA+IDQgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gYCR7IHRoaXMuZ2V0VHlwZSggdHlwZSApIH0oKWA7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRocm93IG5ldyBFcnJvciggYE5vZGVCdWlsZGVyOiBUeXBlICcke3R5cGV9JyBub3QgZm91bmQgaW4gZ2VuZXJhdGUgY29uc3RhbnQgYXR0ZW1wdC5gICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSXQgbWlnaHQgYmUgbmVjZXNzYXJ5IHRvIGNvbnZlcnQgY2VydGFpbiBkYXRhIHR5cGVzIHRvIGRpZmZlcmVudCBvbmVzXHJcblx0ICogc28gdGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gaGlkZSB0aGUgY29udmVyc2lvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIHR5cGUuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgdXBkYXRlZCB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldFR5cGUoIHR5cGUgKSB7XHJcblxyXG5cdFx0aWYgKCB0eXBlID09PSAnY29sb3InICkgcmV0dXJuICd2ZWMzJztcclxuXHJcblx0XHRyZXR1cm4gdHlwZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBXaGV0aGVyIHRoZSBnaXZlbiBhdHRyaWJ1dGUgbmFtZSBpcyBkZWZpbmVkIGluIHRoZSBnZW9tZXRyeSBvciBub3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBhdHRyaWJ1dGUgbmFtZS5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBnaXZlbiBhdHRyaWJ1dGUgbmFtZSBpcyBkZWZpbmVkIGluIHRoZSBnZW9tZXRyeS5cclxuXHQgKi9cclxuXHRoYXNHZW9tZXRyeUF0dHJpYnV0ZSggbmFtZSApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5nZW9tZXRyeSAmJiB0aGlzLmdlb21ldHJ5LmdldEF0dHJpYnV0ZSggbmFtZSApICE9PSB1bmRlZmluZWQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIG5vZGUgYXR0cmlidXRlIGZvciB0aGUgZ2l2ZW4gbmFtZSBhbmQgdHlwZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIGF0dHJpYnV0ZSdzIG5hbWUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBUaGUgYXR0cmlidXRlJ3MgdHlwZS5cclxuXHQgKiBAcmV0dXJuIHtOb2RlQXR0cmlidXRlfSBUaGUgbm9kZSBhdHRyaWJ1dGUuXHJcblx0ICovXHJcblx0Z2V0QXR0cmlidXRlKCBuYW1lLCB0eXBlICkge1xyXG5cclxuXHRcdGNvbnN0IGF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZXM7XHJcblxyXG5cdFx0Ly8gZmluZCBhdHRyaWJ1dGVcclxuXHJcblx0XHRmb3IgKCBjb25zdCBhdHRyaWJ1dGUgb2YgYXR0cmlidXRlcyApIHtcclxuXHJcblx0XHRcdGlmICggYXR0cmlidXRlLm5hbWUgPT09IG5hbWUgKSB7XHJcblxyXG5cdFx0XHRcdHJldHVybiBhdHRyaWJ1dGU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGNyZWF0ZSBhIG5ldyBpZiBubyBleGlzdFxyXG5cclxuXHRcdGNvbnN0IGF0dHJpYnV0ZSA9IG5ldyBOb2RlQXR0cmlidXRlKCBuYW1lLCB0eXBlICk7XHJcblxyXG5cdFx0dGhpcy5yZWdpc3RlckRlY2xhcmF0aW9uKCBhdHRyaWJ1dGUgKTtcclxuXHJcblx0XHRhdHRyaWJ1dGVzLnB1c2goIGF0dHJpYnV0ZSApO1xyXG5cclxuXHRcdHJldHVybiBhdHRyaWJ1dGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBmb3IgdGhlIGdpdmVuIG5vZGUgYW5kIHNoYWRlciBzdGFnZSB0aGUgcHJvcGVydHkgbmFtZSBmb3IgdGhlIHNoYWRlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFRoZSBub2RlLlxyXG5cdCAqIEBwYXJhbSB7KCd2ZXJ0ZXgnfCdmcmFnbWVudCd8J2NvbXB1dGUnfCdhbnknKX0gc2hhZGVyU3RhZ2UgLSBUaGUgc2hhZGVyIHN0YWdlLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHByb3BlcnR5IG5hbWUuXHJcblx0ICovXHJcblx0Z2V0UHJvcGVydHlOYW1lKCBub2RlLyosIHNoYWRlclN0YWdlKi8gKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5vZGUubmFtZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBXaGV0aGVyIHRoZSBnaXZlbiB0eXBlIGlzIGEgdmVjdG9yIHR5cGUgb3Igbm90LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBUaGUgdHlwZSB0byBjaGVjay5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBnaXZlbiB0eXBlIGlzIGEgdmVjdG9yIHR5cGUgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGlzVmVjdG9yKCB0eXBlICkge1xyXG5cclxuXHRcdHJldHVybiAvdmVjXFxkLy50ZXN0KCB0eXBlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogV2hldGhlciB0aGUgZ2l2ZW4gdHlwZSBpcyBhIG1hdHJpeCB0eXBlIG9yIG5vdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIHR5cGUgdG8gY2hlY2suXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZ2l2ZW4gdHlwZSBpcyBhIG1hdHJpeCB0eXBlIG9yIG5vdC5cclxuXHQgKi9cclxuXHRpc01hdHJpeCggdHlwZSApIHtcclxuXHJcblx0XHRyZXR1cm4gL21hdFxcZC8udGVzdCggdHlwZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdoZXRoZXIgdGhlIGdpdmVuIHR5cGUgaXMgYSByZWZlcmVuY2UgdHlwZSBvciBub3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSB0eXBlIHRvIGNoZWNrLlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGdpdmVuIHR5cGUgaXMgYSByZWZlcmVuY2UgdHlwZSBvciBub3QuXHJcblx0ICovXHJcblx0aXNSZWZlcmVuY2UoIHR5cGUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHR5cGUgPT09ICd2b2lkJyB8fCB0eXBlID09PSAncHJvcGVydHknIHx8IHR5cGUgPT09ICdzYW1wbGVyJyB8fCB0eXBlID09PSAnc2FtcGxlckNvbXBhcmlzb24nIHx8IHR5cGUgPT09ICd0ZXh0dXJlJyB8fCB0eXBlID09PSAnY3ViZVRleHR1cmUnIHx8IHR5cGUgPT09ICdzdG9yYWdlVGV4dHVyZScgfHwgdHlwZSA9PT0gJ2RlcHRoVGV4dHVyZScgfHwgdHlwZSA9PT0gJ3RleHR1cmUzRCc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2hlY2tzIGlmIHRoZSBnaXZlbiB0ZXh0dXJlIHJlcXVpcmVzIGEgbWFudWFsIGNvbnZlcnNpb24gdG8gdGhlIHdvcmtpbmcgY29sb3Igc3BhY2UuXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZSB0byBjaGVjay5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBnaXZlbiB0ZXh0dXJlIHJlcXVpcmVzIGEgY29udmVyc2lvbiB0byB3b3JraW5nIGNvbG9yIHNwYWNlIG9yIG5vdC5cclxuXHQgKi9cclxuXHRuZWVkc1RvV29ya2luZ0NvbG9yU3BhY2UoIC8qdGV4dHVyZSovICkge1xyXG5cclxuXHRcdHJldHVybiBmYWxzZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBjb21wb25lbnQgdHlwZSBvZiBhIGdpdmVuIHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZS5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBjb21wb25lbnQgdHlwZS5cclxuXHQgKi9cclxuXHRnZXRDb21wb25lbnRUeXBlRnJvbVRleHR1cmUoIHRleHR1cmUgKSB7XHJcblxyXG5cdFx0Y29uc3QgdHlwZSA9IHRleHR1cmUudHlwZTtcclxuXHJcblx0XHRpZiAoIHRleHR1cmUuaXNEYXRhVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdGlmICggdHlwZSA9PT0gSW50VHlwZSApIHJldHVybiAnaW50JztcclxuXHRcdFx0aWYgKCB0eXBlID09PSBVbnNpZ25lZEludFR5cGUgKSByZXR1cm4gJ3VpbnQnO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gJ2Zsb2F0JztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBlbGVtZW50IHR5cGUgZm9yIGEgZ2l2ZW4gdHlwZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIHR5cGUuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgZWxlbWVudCB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldEVsZW1lbnRUeXBlKCB0eXBlICkge1xyXG5cclxuXHRcdGlmICggdHlwZSA9PT0gJ21hdDInICkgcmV0dXJuICd2ZWMyJztcclxuXHRcdGlmICggdHlwZSA9PT0gJ21hdDMnICkgcmV0dXJuICd2ZWMzJztcclxuXHRcdGlmICggdHlwZSA9PT0gJ21hdDQnICkgcmV0dXJuICd2ZWM0JztcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5nZXRDb21wb25lbnRUeXBlKCB0eXBlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgY29tcG9uZW50IHR5cGUgZm9yIGEgZ2l2ZW4gdHlwZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIHR5cGUuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgY29tcG9uZW50IHR5cGUuXHJcblx0ICovXHJcblx0Z2V0Q29tcG9uZW50VHlwZSggdHlwZSApIHtcclxuXHJcblx0XHR0eXBlID0gdGhpcy5nZXRWZWN0b3JUeXBlKCB0eXBlICk7XHJcblxyXG5cdFx0aWYgKCB0eXBlID09PSAnZmxvYXQnIHx8IHR5cGUgPT09ICdib29sJyB8fCB0eXBlID09PSAnaW50JyB8fCB0eXBlID09PSAndWludCcgKSByZXR1cm4gdHlwZTtcclxuXHJcblx0XHRjb25zdCBjb21wb25lbnRUeXBlID0gLyhifGl8dXwpKHZlY3xtYXQpKFsyLTRdKS8uZXhlYyggdHlwZSApO1xyXG5cclxuXHRcdGlmICggY29tcG9uZW50VHlwZSA9PT0gbnVsbCApIHJldHVybiBudWxsO1xyXG5cclxuXHRcdGlmICggY29tcG9uZW50VHlwZVsgMSBdID09PSAnYicgKSByZXR1cm4gJ2Jvb2wnO1xyXG5cdFx0aWYgKCBjb21wb25lbnRUeXBlWyAxIF0gPT09ICdpJyApIHJldHVybiAnaW50JztcclxuXHRcdGlmICggY29tcG9uZW50VHlwZVsgMSBdID09PSAndScgKSByZXR1cm4gJ3VpbnQnO1xyXG5cclxuXHRcdHJldHVybiAnZmxvYXQnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHZlY3RvciB0eXBlIGZvciBhIGdpdmVuIHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSB0eXBlLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHZlY3RvciB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldFZlY3RvclR5cGUoIHR5cGUgKSB7XHJcblxyXG5cdFx0aWYgKCB0eXBlID09PSAnY29sb3InICkgcmV0dXJuICd2ZWMzJztcclxuXHRcdGlmICggdHlwZSA9PT0gJ3RleHR1cmUnIHx8IHR5cGUgPT09ICdjdWJlVGV4dHVyZScgfHwgdHlwZSA9PT0gJ3N0b3JhZ2VUZXh0dXJlJyB8fCB0eXBlID09PSAndGV4dHVyZTNEJyApIHJldHVybiAndmVjNCc7XHJcblxyXG5cdFx0cmV0dXJuIHR5cGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgZGF0YSB0eXBlIGZvciB0aGUgZ2l2ZW4gdGhlIGxlbmd0aCBhbmQgY29tcG9uZW50IHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIC0gVGhlIGxlbmd0aC5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW2NvbXBvbmVudFR5cGU9J2Zsb2F0J10gLSBUaGUgY29tcG9uZW50IHR5cGUuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgdHlwZS5cclxuXHQgKi9cclxuXHRnZXRUeXBlRnJvbUxlbmd0aCggbGVuZ3RoLCBjb21wb25lbnRUeXBlID0gJ2Zsb2F0JyApIHtcclxuXHJcblx0XHRpZiAoIGxlbmd0aCA9PT0gMSApIHJldHVybiBjb21wb25lbnRUeXBlO1xyXG5cclxuXHRcdGxldCBiYXNlVHlwZSA9IGdldFR5cGVGcm9tTGVuZ3RoKCBsZW5ndGggKTtcclxuXHRcdGNvbnN0IHByZWZpeCA9IGNvbXBvbmVudFR5cGUgPT09ICdmbG9hdCcgPyAnJyA6IGNvbXBvbmVudFR5cGVbIDAgXTtcclxuXHJcblx0XHQvLyBmaXggZWRnZSBjYXNlIGZvciBtYXQyeDIgYmVpbmcgc2FtZSBzaXplIGFzIHZlYzRcclxuXHRcdGlmICggL21hdDIvLnRlc3QoIGNvbXBvbmVudFR5cGUgKSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdGJhc2VUeXBlID0gYmFzZVR5cGUucmVwbGFjZSggJ3ZlYycsICdtYXQnICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBwcmVmaXggKyBiYXNlVHlwZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSB0eXBlIGZvciBhIGdpdmVuIHR5cGVkIGFycmF5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUeXBlZEFycmF5fSBhcnJheSAtIFRoZSB0eXBlZCBhcnJheS5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldFR5cGVGcm9tQXJyYXkoIGFycmF5ICkge1xyXG5cclxuXHRcdHJldHVybiB0eXBlRnJvbUFycmF5LmdldCggYXJyYXkuY29uc3RydWN0b3IgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSB0eXBlIGlzIGFuIGludGVnZXIgdHlwZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIHR5cGUuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgdHlwZSBpcyBhbiBpbnRlZ2VyIHR5cGUgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGlzSW50ZWdlciggdHlwZSApIHtcclxuXHJcblx0XHRyZXR1cm4gL2ludHx1aW50fChpfHUpdmVjLy50ZXN0KCB0eXBlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgdHlwZSBmb3IgYSBnaXZlbiBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCdWZmZXJBdHRyaWJ1dGV9IGF0dHJpYnV0ZSAtIFRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHR5cGUuXHJcblx0ICovXHJcblx0Z2V0VHlwZUZyb21BdHRyaWJ1dGUoIGF0dHJpYnV0ZSApIHtcclxuXHJcblx0XHRsZXQgZGF0YUF0dHJpYnV0ZSA9IGF0dHJpYnV0ZTtcclxuXHJcblx0XHRpZiAoIGF0dHJpYnV0ZS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlICkgZGF0YUF0dHJpYnV0ZSA9IGF0dHJpYnV0ZS5kYXRhO1xyXG5cclxuXHRcdGNvbnN0IGFycmF5ID0gZGF0YUF0dHJpYnV0ZS5hcnJheTtcclxuXHRcdGNvbnN0IGl0ZW1TaXplID0gYXR0cmlidXRlLml0ZW1TaXplO1xyXG5cdFx0Y29uc3Qgbm9ybWFsaXplZCA9IGF0dHJpYnV0ZS5ub3JtYWxpemVkO1xyXG5cclxuXHRcdGxldCBhcnJheVR5cGU7XHJcblxyXG5cdFx0aWYgKCAhICggYXR0cmlidXRlIGluc3RhbmNlb2YgRmxvYXQxNkJ1ZmZlckF0dHJpYnV0ZSApICYmIG5vcm1hbGl6ZWQgIT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRhcnJheVR5cGUgPSB0aGlzLmdldFR5cGVGcm9tQXJyYXkoIGFycmF5ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzLmdldFR5cGVGcm9tTGVuZ3RoKCBpdGVtU2l6ZSwgYXJyYXlUeXBlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgbGVuZ3RoIGZvciB0aGUgZ2l2ZW4gZGF0YSB0eXBlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBUaGUgZGF0YSB0eXBlLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGxlbmd0aC5cclxuXHQgKi9cclxuXHRnZXRUeXBlTGVuZ3RoKCB0eXBlICkge1xyXG5cclxuXHRcdGNvbnN0IHZlY1R5cGUgPSB0aGlzLmdldFZlY3RvclR5cGUoIHR5cGUgKTtcclxuXHRcdGNvbnN0IHZlY051bSA9IC92ZWMoWzItNF0pLy5leGVjKCB2ZWNUeXBlICk7XHJcblxyXG5cdFx0aWYgKCB2ZWNOdW0gIT09IG51bGwgKSByZXR1cm4gTnVtYmVyKCB2ZWNOdW1bIDEgXSApO1xyXG5cdFx0aWYgKCB2ZWNUeXBlID09PSAnZmxvYXQnIHx8IHZlY1R5cGUgPT09ICdib29sJyB8fCB2ZWNUeXBlID09PSAnaW50JyB8fCB2ZWNUeXBlID09PSAndWludCcgKSByZXR1cm4gMTtcclxuXHRcdGlmICggL21hdDIvLnRlc3QoIHR5cGUgKSA9PT0gdHJ1ZSApIHJldHVybiA0O1xyXG5cdFx0aWYgKCAvbWF0My8udGVzdCggdHlwZSApID09PSB0cnVlICkgcmV0dXJuIDk7XHJcblx0XHRpZiAoIC9tYXQ0Ly50ZXN0KCB0eXBlICkgPT09IHRydWUgKSByZXR1cm4gMTY7XHJcblxyXG5cdFx0cmV0dXJuIDA7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgdmVjdG9yIHR5cGUgZm9yIGEgZ2l2ZW4gbWF0cml4IHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSBtYXRyaXggdHlwZS5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB2ZWN0b3IgdHlwZS5cclxuXHQgKi9cclxuXHRnZXRWZWN0b3JGcm9tTWF0cml4KCB0eXBlICkge1xyXG5cclxuXHRcdHJldHVybiB0eXBlLnJlcGxhY2UoICdtYXQnLCAndmVjJyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZvciBhIGdpdmVuIHR5cGUgdGhpcyBtZXRob2QgY2hhbmdlcyB0aGUgY29tcG9uZW50IHR5cGUgdG8gdGhlXHJcblx0ICogZ2l2ZW4gdmFsdWUuIEUuZy4gYHZlYzRgIHNob3VsZCBiZSBjaGFuZ2VkIHRvIHRoZSBuZXcgY29tcG9uZW50IHR5cGVcclxuXHQgKiBgdWludGAgd2hpY2ggcmVzdWx0cyBpbiBgdXZlYzRgLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBUaGUgdHlwZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmV3Q29tcG9uZW50VHlwZSAtIFRoZSBuZXcgY29tcG9uZW50IHR5cGUuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgbmV3IHR5cGUuXHJcblx0ICovXHJcblx0Y2hhbmdlQ29tcG9uZW50VHlwZSggdHlwZSwgbmV3Q29tcG9uZW50VHlwZSApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5nZXRUeXBlRnJvbUxlbmd0aCggdGhpcy5nZXRUeXBlTGVuZ3RoKCB0eXBlICksIG5ld0NvbXBvbmVudFR5cGUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBpbnRlZ2VyIHR5cGUgcGVuZGFudCBmb3IgdGhlIGdpdmVuIHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSB0eXBlLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGludGVnZXIgdHlwZS5cclxuXHQgKi9cclxuXHRnZXRJbnRlZ2VyVHlwZSggdHlwZSApIHtcclxuXHJcblx0XHRjb25zdCBjb21wb25lbnRUeXBlID0gdGhpcy5nZXRDb21wb25lbnRUeXBlKCB0eXBlICk7XHJcblxyXG5cdFx0aWYgKCBjb21wb25lbnRUeXBlID09PSAnaW50JyB8fCBjb21wb25lbnRUeXBlID09PSAndWludCcgKSByZXR1cm4gdHlwZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5jaGFuZ2VDb21wb25lbnRUeXBlKCB0eXBlLCAnaW50JyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgYSBzdGFjayBub2RlIHRvIHRoZSBpbnRlcm5hbCBzdGFjay5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge1N0YWNrTm9kZX0gVGhlIGFkZGVkIHN0YWNrIG5vZGUuXHJcblx0ICovXHJcblx0YWRkU3RhY2soKSB7XHJcblxyXG5cdFx0dGhpcy5zdGFjayA9IHN0YWNrKCB0aGlzLnN0YWNrICk7XHJcblxyXG5cdFx0dGhpcy5zdGFja3MucHVzaCggZ2V0Q3VycmVudFN0YWNrKCkgfHwgdGhpcy5zdGFjayApO1xyXG5cdFx0c2V0Q3VycmVudFN0YWNrKCB0aGlzLnN0YWNrICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuc3RhY2s7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVtb3ZlcyB0aGUgbGFzdCBzdGFjayBub2RlIGZyb20gdGhlIGludGVybmFsIHN0YWNrLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7U3RhY2tOb2RlfSBUaGUgcmVtb3ZlZCBzdGFjayBub2RlLlxyXG5cdCAqL1xyXG5cdHJlbW92ZVN0YWNrKCkge1xyXG5cclxuXHRcdGNvbnN0IGxhc3RTdGFjayA9IHRoaXMuc3RhY2s7XHJcblx0XHR0aGlzLnN0YWNrID0gbGFzdFN0YWNrLnBhcmVudDtcclxuXHJcblx0XHRzZXRDdXJyZW50U3RhY2soIHRoaXMuc3RhY2tzLnBvcCgpICk7XHJcblxyXG5cdFx0cmV0dXJuIGxhc3RTdGFjaztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgYnVpbGRlciBtYWludGFpbnMgKGNhY2hlZCkgZGF0YSBmb3IgZWFjaCBub2RlIGR1cmluZyB0aGUgYnVpbGRpbmcgcHJvY2Vzcy4gVGhpcyBtZXRob2RcclxuXHQgKiBjYW4gYmUgdXNlZCB0byBnZXQgdGhlc2UgZGF0YSBmb3IgYSBzcGVjaWZpYyBzaGFkZXIgc3RhZ2UgYW5kIGNhY2hlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIG5vZGUgdG8gZ2V0IHRoZSBkYXRhIGZvci5cclxuXHQgKiBAcGFyYW0geygndmVydGV4J3wnZnJhZ21lbnQnfCdjb21wdXRlJ3wnYW55Jyl9IFtzaGFkZXJTdGFnZT10aGlzLnNoYWRlclN0YWdlXSAtIFRoZSBzaGFkZXIgc3RhZ2UuXHJcblx0ICogQHBhcmFtIHs/Tm9kZUNhY2hlfSBjYWNoZSAtIEFuIG9wdGlvbmFsIGNhY2hlLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdH0gVGhlIG5vZGUgZGF0YS5cclxuXHQgKi9cclxuXHRnZXREYXRhRnJvbU5vZGUoIG5vZGUsIHNoYWRlclN0YWdlID0gdGhpcy5zaGFkZXJTdGFnZSwgY2FjaGUgPSBudWxsICkge1xyXG5cclxuXHRcdGNhY2hlID0gY2FjaGUgPT09IG51bGwgPyAoIG5vZGUuaXNHbG9iYWwoIHRoaXMgKSA/IHRoaXMuZ2xvYmFsQ2FjaGUgOiB0aGlzLmNhY2hlICkgOiBjYWNoZTtcclxuXHJcblx0XHRsZXQgbm9kZURhdGEgPSBjYWNoZS5nZXREYXRhKCBub2RlICk7XHJcblxyXG5cdFx0aWYgKCBub2RlRGF0YSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0bm9kZURhdGEgPSB7fTtcclxuXHJcblx0XHRcdGNhY2hlLnNldERhdGEoIG5vZGUsIG5vZGVEYXRhICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggbm9kZURhdGFbIHNoYWRlclN0YWdlIF0gPT09IHVuZGVmaW5lZCApIG5vZGVEYXRhWyBzaGFkZXJTdGFnZSBdID0ge307XHJcblxyXG5cdFx0cmV0dXJuIG5vZGVEYXRhWyBzaGFkZXJTdGFnZSBdO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHByb3BlcnRpZXMgZm9yIHRoZSBnaXZlbiBub2RlIGFuZCBzaGFkZXIgc3RhZ2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBUaGUgbm9kZSB0byBnZXQgdGhlIHByb3BlcnRpZXMgZm9yLlxyXG5cdCAqIEBwYXJhbSB7KCd2ZXJ0ZXgnfCdmcmFnbWVudCd8J2NvbXB1dGUnfCdhbnknKX0gW3NoYWRlclN0YWdlPSdhbnknXSAtIFRoZSBzaGFkZXIgc3RhZ2UuXHJcblx0ICogQHJldHVybiB7T2JqZWN0fSBUaGUgbm9kZSBwcm9wZXJ0aWVzLlxyXG5cdCAqL1xyXG5cdGdldE5vZGVQcm9wZXJ0aWVzKCBub2RlLCBzaGFkZXJTdGFnZSA9ICdhbnknICkge1xyXG5cclxuXHRcdGNvbnN0IG5vZGVEYXRhID0gdGhpcy5nZXREYXRhRnJvbU5vZGUoIG5vZGUsIHNoYWRlclN0YWdlICk7XHJcblxyXG5cdFx0cmV0dXJuIG5vZGVEYXRhLnByb3BlcnRpZXMgfHwgKCBub2RlRGF0YS5wcm9wZXJ0aWVzID0geyBvdXRwdXROb2RlOiBudWxsIH0gKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIHtAbGluayBOb2RlQXR0cmlidXRlfSBmb3IgdGhlIGdpdmVuIGJ1ZmZlciBhdHRyaWJ1dGUgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyQXR0cmlidXRlTm9kZX0gbm9kZSAtIFRoZSBidWZmZXIgYXR0cmlidXRlIG5vZGUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBUaGUgbm9kZSB0eXBlLlxyXG5cdCAqIEByZXR1cm4ge05vZGVBdHRyaWJ1dGV9IFRoZSBub2RlIGF0dHJpYnV0ZS5cclxuXHQgKi9cclxuXHRnZXRCdWZmZXJBdHRyaWJ1dGVGcm9tTm9kZSggbm9kZSwgdHlwZSApIHtcclxuXHJcblx0XHRjb25zdCBub2RlRGF0YSA9IHRoaXMuZ2V0RGF0YUZyb21Ob2RlKCBub2RlICk7XHJcblxyXG5cdFx0bGV0IGJ1ZmZlckF0dHJpYnV0ZSA9IG5vZGVEYXRhLmJ1ZmZlckF0dHJpYnV0ZTtcclxuXHJcblx0XHRpZiAoIGJ1ZmZlckF0dHJpYnV0ZSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Y29uc3QgaW5kZXggPSB0aGlzLnVuaWZvcm1zLmluZGV4ICsrO1xyXG5cclxuXHRcdFx0YnVmZmVyQXR0cmlidXRlID0gbmV3IE5vZGVBdHRyaWJ1dGUoICdub2RlQXR0cmlidXRlJyArIGluZGV4LCB0eXBlLCBub2RlICk7XHJcblxyXG5cdFx0XHR0aGlzLmJ1ZmZlckF0dHJpYnV0ZXMucHVzaCggYnVmZmVyQXR0cmlidXRlICk7XHJcblxyXG5cdFx0XHRub2RlRGF0YS5idWZmZXJBdHRyaWJ1dGUgPSBidWZmZXJBdHRyaWJ1dGU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBidWZmZXJBdHRyaWJ1dGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgU3RydWN0VHlwZX0gZm9yIHRoZSBnaXZlbiBvdXRwdXQgc3RydWN0IG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge091dHB1dFN0cnVjdE5vZGV9IG5vZGUgLSBUaGUgb3V0cHV0IHN0cnVjdCBub2RlLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8T2JqZWN0Pn0gbWVtYmVyc0xheW91dCAtIFRoZSBvdXRwdXQgc3RydWN0IHR5cGVzLlxyXG5cdCAqIEBwYXJhbSB7P3N0cmluZ30gW25hbWU9bnVsbF0gLSBUaGUgbmFtZSBvZiB0aGUgc3RydWN0LlxyXG5cdCAqIEBwYXJhbSB7KCd2ZXJ0ZXgnfCdmcmFnbWVudCd8J2NvbXB1dGUnfCdhbnknKX0gW3NoYWRlclN0YWdlPXRoaXMuc2hhZGVyU3RhZ2VdIC0gVGhlIHNoYWRlciBzdGFnZS5cclxuXHQgKiBAcmV0dXJuIHtTdHJ1Y3RUeXBlfSBUaGUgc3RydWN0IHR5cGUgYXR0cmlidXRlLlxyXG5cdCAqL1xyXG5cdGdldFN0cnVjdFR5cGVGcm9tTm9kZSggbm9kZSwgbWVtYmVyc0xheW91dCwgbmFtZSA9IG51bGwsIHNoYWRlclN0YWdlID0gdGhpcy5zaGFkZXJTdGFnZSApIHtcclxuXHJcblx0XHRjb25zdCBub2RlRGF0YSA9IHRoaXMuZ2V0RGF0YUZyb21Ob2RlKCBub2RlLCBzaGFkZXJTdGFnZSwgdGhpcy5nbG9iYWxDYWNoZSApO1xyXG5cclxuXHRcdGxldCBzdHJ1Y3RUeXBlID0gbm9kZURhdGEuc3RydWN0VHlwZTtcclxuXHJcblx0XHRpZiAoIHN0cnVjdFR5cGUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGluZGV4ID0gdGhpcy5zdHJ1Y3RzLmluZGV4ICsrO1xyXG5cclxuXHRcdFx0aWYgKCBuYW1lID09PSBudWxsICkgbmFtZSA9ICdTdHJ1Y3RUeXBlJyArIGluZGV4O1xyXG5cclxuXHRcdFx0c3RydWN0VHlwZSA9IG5ldyBTdHJ1Y3RUeXBlKCBuYW1lLCBtZW1iZXJzTGF5b3V0ICk7XHJcblxyXG5cdFx0XHR0aGlzLnN0cnVjdHNbIHNoYWRlclN0YWdlIF0ucHVzaCggc3RydWN0VHlwZSApO1xyXG5cclxuXHRcdFx0bm9kZURhdGEuc3RydWN0VHlwZSA9IHN0cnVjdFR5cGU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBzdHJ1Y3RUeXBlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFN0cnVjdFR5cGV9IGZvciB0aGUgZ2l2ZW4gb3V0cHV0IHN0cnVjdCBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPdXRwdXRTdHJ1Y3ROb2RlfSBub2RlIC0gVGhlIG91dHB1dCBzdHJ1Y3Qgbm9kZS5cclxuXHQgKiBAcGFyYW0ge0FycmF5PE9iamVjdD59IG1lbWJlcnNMYXlvdXQgLSBUaGUgb3V0cHV0IHN0cnVjdCB0eXBlcy5cclxuXHQgKiBAcmV0dXJuIHtTdHJ1Y3RUeXBlfSBUaGUgc3RydWN0IHR5cGUgYXR0cmlidXRlLlxyXG5cdCAqL1xyXG5cdGdldE91dHB1dFN0cnVjdFR5cGVGcm9tTm9kZSggbm9kZSwgbWVtYmVyc0xheW91dCApIHtcclxuXHJcblx0XHRjb25zdCBzdHJ1Y3RUeXBlID0gdGhpcy5nZXRTdHJ1Y3RUeXBlRnJvbU5vZGUoIG5vZGUsIG1lbWJlcnNMYXlvdXQsICdPdXRwdXRUeXBlJywgJ2ZyYWdtZW50JyApO1xyXG5cdFx0c3RydWN0VHlwZS5vdXRwdXQgPSB0cnVlO1xyXG5cclxuXHRcdHJldHVybiBzdHJ1Y3RUeXBlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIE5vZGVVbmlmb3JtfSBmb3IgdGhlIGdpdmVuIHVuaWZvcm0gbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VW5pZm9ybU5vZGV9IG5vZGUgLSBUaGUgdW5pZm9ybSBub2RlLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIHVuaWZvcm0gdHlwZS5cclxuXHQgKiBAcGFyYW0geygndmVydGV4J3wnZnJhZ21lbnQnfCdjb21wdXRlJ3wnYW55Jyl9IFtzaGFkZXJTdGFnZT10aGlzLnNoYWRlclN0YWdlXSAtIFRoZSBzaGFkZXIgc3RhZ2UuXHJcblx0ICogQHBhcmFtIHs/c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHVuaWZvcm0uXHJcblx0ICogQHJldHVybiB7Tm9kZVVuaWZvcm19IFRoZSBub2RlIHVuaWZvcm0uXHJcblx0ICovXHJcblx0Z2V0VW5pZm9ybUZyb21Ob2RlKCBub2RlLCB0eXBlLCBzaGFkZXJTdGFnZSA9IHRoaXMuc2hhZGVyU3RhZ2UsIG5hbWUgPSBudWxsICkge1xyXG5cclxuXHRcdGNvbnN0IG5vZGVEYXRhID0gdGhpcy5nZXREYXRhRnJvbU5vZGUoIG5vZGUsIHNoYWRlclN0YWdlLCB0aGlzLmdsb2JhbENhY2hlICk7XHJcblxyXG5cdFx0bGV0IG5vZGVVbmlmb3JtID0gbm9kZURhdGEudW5pZm9ybTtcclxuXHJcblx0XHRpZiAoIG5vZGVVbmlmb3JtID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBpbmRleCA9IHRoaXMudW5pZm9ybXMuaW5kZXggKys7XHJcblxyXG5cdFx0XHRub2RlVW5pZm9ybSA9IG5ldyBOb2RlVW5pZm9ybSggbmFtZSB8fCAoICdub2RlVW5pZm9ybScgKyBpbmRleCApLCB0eXBlLCBub2RlICk7XHJcblxyXG5cdFx0XHR0aGlzLnVuaWZvcm1zWyBzaGFkZXJTdGFnZSBdLnB1c2goIG5vZGVVbmlmb3JtICk7XHJcblxyXG5cdFx0XHR0aGlzLnJlZ2lzdGVyRGVjbGFyYXRpb24oIG5vZGVVbmlmb3JtICk7XHJcblxyXG5cdFx0XHRub2RlRGF0YS51bmlmb3JtID0gbm9kZVVuaWZvcm07XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBub2RlVW5pZm9ybTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBhcnJheSBsZW5ndGguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBUaGUgbm9kZS5cclxuXHQgKiBAcmV0dXJuIHs/bnVtYmVyfSBUaGUgYXJyYXkgbGVuZ3RoLlxyXG5cdCAqL1xyXG5cdGdldEFycmF5Q291bnQoIG5vZGUgKSB7XHJcblxyXG5cdFx0bGV0IGNvdW50ID0gbnVsbDtcclxuXHJcblx0XHRpZiAoIG5vZGUuaXNBcnJheU5vZGUgKSBjb3VudCA9IG5vZGUuY291bnQ7XHJcblx0XHRlbHNlIGlmICggbm9kZS5pc1Zhck5vZGUgJiYgbm9kZS5ub2RlLmlzQXJyYXlOb2RlICkgY291bnQgPSBub2RlLm5vZGUuY291bnQ7XHJcblxyXG5cdFx0cmV0dXJuIGNvdW50O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIE5vZGVWYXJ9IGZvciB0aGUgZ2l2ZW4gdmFyaWFibGUgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmFyTm9kZX0gbm9kZSAtIFRoZSB2YXJpYWJsZSBub2RlLlxyXG5cdCAqIEBwYXJhbSB7P3N0cmluZ30gbmFtZSAtIFRoZSB2YXJpYWJsZSdzIG5hbWUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFt0eXBlPW5vZGUuZ2V0Tm9kZVR5cGUoIHRoaXMgKV0gLSBUaGUgdmFyaWFibGUncyB0eXBlLlxyXG5cdCAqIEBwYXJhbSB7KCd2ZXJ0ZXgnfCdmcmFnbWVudCd8J2NvbXB1dGUnfCdhbnknKX0gW3NoYWRlclN0YWdlPXRoaXMuc2hhZGVyU3RhZ2VdIC0gVGhlIHNoYWRlciBzdGFnZS5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZWFkT25seT1mYWxzZV0gLSBXaGV0aGVyIHRoZSB2YXJpYWJsZSBpcyByZWFkLW9ubHkgb3Igbm90LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Tm9kZVZhcn0gVGhlIG5vZGUgdmFyaWFibGUuXHJcblx0ICovXHJcblx0Z2V0VmFyRnJvbU5vZGUoIG5vZGUsIG5hbWUgPSBudWxsLCB0eXBlID0gbm9kZS5nZXROb2RlVHlwZSggdGhpcyApLCBzaGFkZXJTdGFnZSA9IHRoaXMuc2hhZGVyU3RhZ2UsIHJlYWRPbmx5ID0gZmFsc2UgKSB7XHJcblxyXG5cdFx0Y29uc3Qgbm9kZURhdGEgPSB0aGlzLmdldERhdGFGcm9tTm9kZSggbm9kZSwgc2hhZGVyU3RhZ2UgKTtcclxuXHJcblx0XHRsZXQgbm9kZVZhciA9IG5vZGVEYXRhLnZhcmlhYmxlO1xyXG5cclxuXHRcdGlmICggbm9kZVZhciA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Y29uc3QgaWROUyA9IHJlYWRPbmx5ID8gJ19jb25zdCcgOiAnX3Zhcic7XHJcblxyXG5cdFx0XHRjb25zdCB2YXJzID0gdGhpcy52YXJzWyBzaGFkZXJTdGFnZSBdIHx8ICggdGhpcy52YXJzWyBzaGFkZXJTdGFnZSBdID0gW10gKTtcclxuXHRcdFx0Y29uc3QgaWQgPSB0aGlzLnZhcnNbIGlkTlMgXSB8fCAoIHRoaXMudmFyc1sgaWROUyBdID0gMCApO1xyXG5cclxuXHRcdFx0aWYgKCBuYW1lID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRuYW1lID0gKCByZWFkT25seSA/ICdub2RlQ29uc3QnIDogJ25vZGVWYXInICkgKyBpZDtcclxuXHJcblx0XHRcdFx0dGhpcy52YXJzWyBpZE5TIF0gKys7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvL1xyXG5cclxuXHRcdFx0Y29uc3QgY291bnQgPSB0aGlzLmdldEFycmF5Q291bnQoIG5vZGUgKTtcclxuXHJcblx0XHRcdG5vZGVWYXIgPSBuZXcgTm9kZVZhciggbmFtZSwgdHlwZSwgcmVhZE9ubHksIGNvdW50ICk7XHJcblxyXG5cdFx0XHRpZiAoICEgcmVhZE9ubHkgKSB7XHJcblxyXG5cdFx0XHRcdHZhcnMucHVzaCggbm9kZVZhciApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5yZWdpc3RlckRlY2xhcmF0aW9uKCBub2RlVmFyICk7XHJcblxyXG5cdFx0XHRub2RlRGF0YS52YXJpYWJsZSA9IG5vZGVWYXI7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBub2RlVmFyO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgd2hldGhlciBhIE5vZGUgb3IgaXRzIGZsb3cgaXMgZGV0ZXJtaW5pc3RpYywgdXNlZnVsIGZvciB1c2UgaW4gYGNvbnN0YC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFRoZSB2YXJ5aW5nIG5vZGUuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIGRldGVybWluaXN0aWMuXHJcblx0ICovXHJcblx0aXNEZXRlcm1pbmlzdGljKCBub2RlICkge1xyXG5cclxuXHRcdGlmICggbm9kZS5pc01hdGhOb2RlICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIHRoaXMuaXNEZXRlcm1pbmlzdGljKCBub2RlLmFOb2RlICkgJiZcclxuXHRcdFx0XHQoIG5vZGUuYk5vZGUgPyB0aGlzLmlzRGV0ZXJtaW5pc3RpYyggbm9kZS5iTm9kZSApIDogdHJ1ZSApICYmXHJcblx0XHRcdFx0KCBub2RlLmNOb2RlID8gdGhpcy5pc0RldGVybWluaXN0aWMoIG5vZGUuY05vZGUgKSA6IHRydWUgKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBub2RlLmlzT3BlcmF0b3JOb2RlICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIHRoaXMuaXNEZXRlcm1pbmlzdGljKCBub2RlLmFOb2RlICkgJiZcclxuXHRcdFx0XHQoIG5vZGUuYk5vZGUgPyB0aGlzLmlzRGV0ZXJtaW5pc3RpYyggbm9kZS5iTm9kZSApIDogdHJ1ZSApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIG5vZGUuaXNBcnJheU5vZGUgKSB7XHJcblxyXG5cdFx0XHRpZiAoIG5vZGUudmFsdWVzICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRmb3IgKCBjb25zdCBuIG9mIG5vZGUudmFsdWVzICkge1xyXG5cclxuXHRcdFx0XHRcdGlmICggISB0aGlzLmlzRGV0ZXJtaW5pc3RpYyggbiApICkge1xyXG5cclxuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggbm9kZS5pc0NvbnN0Tm9kZSApIHtcclxuXHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZmFsc2U7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgTm9kZVZhcnlpbmd9IGZvciB0aGUgZ2l2ZW4gdmFyeWluZyBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHsoVmFyeWluZ05vZGV8UHJvcGVydHlOb2RlKX0gbm9kZSAtIFRoZSB2YXJ5aW5nIG5vZGUuXHJcblx0ICogQHBhcmFtIHs/c3RyaW5nfSBuYW1lIC0gVGhlIHZhcnlpbmcncyBuYW1lLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbdHlwZT1ub2RlLmdldE5vZGVUeXBlKCB0aGlzICldIC0gVGhlIHZhcnlpbmcncyB0eXBlLlxyXG5cdCAqIEByZXR1cm4ge05vZGVWYXJ9IFRoZSBub2RlIHZhcnlpbmcuXHJcblx0ICovXHJcblx0Z2V0VmFyeWluZ0Zyb21Ob2RlKCBub2RlLCBuYW1lID0gbnVsbCwgdHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoIHRoaXMgKSApIHtcclxuXHJcblx0XHRjb25zdCBub2RlRGF0YSA9IHRoaXMuZ2V0RGF0YUZyb21Ob2RlKCBub2RlLCAnYW55JyApO1xyXG5cclxuXHRcdGxldCBub2RlVmFyeWluZyA9IG5vZGVEYXRhLnZhcnlpbmc7XHJcblxyXG5cdFx0aWYgKCBub2RlVmFyeWluZyA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdmFyeWluZ3MgPSB0aGlzLnZhcnlpbmdzO1xyXG5cdFx0XHRjb25zdCBpbmRleCA9IHZhcnlpbmdzLmxlbmd0aDtcclxuXHJcblx0XHRcdGlmICggbmFtZSA9PT0gbnVsbCApIG5hbWUgPSAnbm9kZVZhcnlpbmcnICsgaW5kZXg7XHJcblxyXG5cdFx0XHRub2RlVmFyeWluZyA9IG5ldyBOb2RlVmFyeWluZyggbmFtZSwgdHlwZSApO1xyXG5cclxuXHRcdFx0dmFyeWluZ3MucHVzaCggbm9kZVZhcnlpbmcgKTtcclxuXHJcblx0XHRcdHRoaXMucmVnaXN0ZXJEZWNsYXJhdGlvbiggbm9kZVZhcnlpbmcgKTtcclxuXHJcblx0XHRcdG5vZGVEYXRhLnZhcnlpbmcgPSBub2RlVmFyeWluZztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG5vZGVWYXJ5aW5nO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlZ2lzdGVycyBhIG5vZGUgZGVjbGFyYXRpb24gaW4gdGhlIGN1cnJlbnQgc2hhZGVyIHN0YWdlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IG5vZGUgLSBUaGUgbm9kZSB0byBiZSByZWdpc3RlcmVkLlxyXG5cdCAqL1xyXG5cdHJlZ2lzdGVyRGVjbGFyYXRpb24oIG5vZGUgKSB7XHJcblxyXG5cdFx0Y29uc3Qgc2hhZGVyU3RhZ2UgPSB0aGlzLnNoYWRlclN0YWdlO1xyXG5cdFx0Y29uc3QgZGVjbGFyYXRpb25zID0gdGhpcy5kZWNsYXJhdGlvbnNbIHNoYWRlclN0YWdlIF0gfHwgKCB0aGlzLmRlY2xhcmF0aW9uc1sgc2hhZGVyU3RhZ2UgXSA9IHt9ICk7XHJcblxyXG5cdFx0Y29uc3QgcHJvcGVydHkgPSB0aGlzLmdldFByb3BlcnR5TmFtZSggbm9kZSApO1xyXG5cclxuXHRcdGxldCBpbmRleCA9IDE7XHJcblx0XHRsZXQgbmFtZSA9IHByb3BlcnR5O1xyXG5cclxuXHRcdC8vIEF1dG9tYXRpY2FsbHkgcmVuYW1lcyB0aGUgcHJvcGVydHkgaWYgdGhlIG5hbWUgaXMgYWxyZWFkeSBpbiB1c2UuXHJcblxyXG5cdFx0d2hpbGUgKCBkZWNsYXJhdGlvbnNbIG5hbWUgXSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0bmFtZSA9IHByb3BlcnR5ICsgJ18nICsgaW5kZXggKys7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGRlY2xhcmF0aW9uc1sgbmFtZSBdID0gbm9kZTtcclxuXHJcblx0XHRpZiAoIGluZGV4ID4gMSApIHtcclxuXHJcblx0XHRcdG5vZGUubmFtZSA9IG5hbWU7XHJcblxyXG5cdFx0XHRjb25zb2xlLndhcm4oIGBUSFJFRS5UU0w6IERlY2xhcmF0aW9uIG5hbWUgJyR7IHByb3BlcnR5IH0nIG9mICckeyBub2RlLnR5cGUgfScgYWxyZWFkeSBpbiB1c2UuIFJlbmFtZWQgdG8gJyR7IG5hbWUgfScuYCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIHtAbGluayBOb2RlQ29kZX0gZm9yIHRoZSBnaXZlbiBjb2RlIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0NvZGVOb2RlfSBub2RlIC0gVGhlIGNvZGUgbm9kZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSBub2RlIHR5cGUuXHJcblx0ICogQHBhcmFtIHsoJ3ZlcnRleCd8J2ZyYWdtZW50J3wnY29tcHV0ZSd8J2FueScpfSBbc2hhZGVyU3RhZ2U9dGhpcy5zaGFkZXJTdGFnZV0gLSBUaGUgc2hhZGVyIHN0YWdlLlxyXG5cdCAqIEByZXR1cm4ge05vZGVDb2RlfSBUaGUgbm9kZSBjb2RlLlxyXG5cdCAqL1xyXG5cdGdldENvZGVGcm9tTm9kZSggbm9kZSwgdHlwZSwgc2hhZGVyU3RhZ2UgPSB0aGlzLnNoYWRlclN0YWdlICkge1xyXG5cclxuXHRcdGNvbnN0IG5vZGVEYXRhID0gdGhpcy5nZXREYXRhRnJvbU5vZGUoIG5vZGUgKTtcclxuXHJcblx0XHRsZXQgbm9kZUNvZGUgPSBub2RlRGF0YS5jb2RlO1xyXG5cclxuXHRcdGlmICggbm9kZUNvZGUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGNvZGVzID0gdGhpcy5jb2Rlc1sgc2hhZGVyU3RhZ2UgXSB8fCAoIHRoaXMuY29kZXNbIHNoYWRlclN0YWdlIF0gPSBbXSApO1xyXG5cdFx0XHRjb25zdCBpbmRleCA9IGNvZGVzLmxlbmd0aDtcclxuXHJcblx0XHRcdG5vZGVDb2RlID0gbmV3IE5vZGVDb2RlKCAnbm9kZUNvZGUnICsgaW5kZXgsIHR5cGUgKTtcclxuXHJcblx0XHRcdGNvZGVzLnB1c2goIG5vZGVDb2RlICk7XHJcblxyXG5cdFx0XHRub2RlRGF0YS5jb2RlID0gbm9kZUNvZGU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBub2RlQ29kZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIGEgY29kZSBmbG93IGJhc2VkIG9uIHRoZSBjb2RlLWJsb2NrIGhpZXJhcmNoeS5cclxuXHJcblx0ICogVGhpcyBpcyB1c2VkIHNvIHRoYXQgY29kZS1ibG9ja3MgbGlrZSBJZixFbHNlIGNyZWF0ZSB0aGVpciB2YXJpYWJsZXMgbG9jYWxseSBpZiB0aGUgTm9kZVxyXG5cdCAqIGlzIG9ubHkgdXNlZCBpbnNpZGUgb25lIG9mIHRoZXNlIGNvbmRpdGlvbmFscyBpbiB0aGUgY3VycmVudCBzaGFkZXIgc3RhZ2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBUaGUgbm9kZSB0byBhZGQuXHJcblx0ICogQHBhcmFtIHtOb2RlfSBub2RlQmxvY2sgLSBOb2RlLWJhc2VkIGNvZGUtYmxvY2suIFVzdWFsbHkgJ0NvbmRpdGlvbmFsTm9kZScuXHJcblx0ICovXHJcblx0YWRkRmxvd0NvZGVIaWVyYXJjaHkoIG5vZGUsIG5vZGVCbG9jayApIHtcclxuXHJcblx0XHRjb25zdCB7IGZsb3dDb2RlcywgZmxvd0NvZGVCbG9jayB9ID0gdGhpcy5nZXREYXRhRnJvbU5vZGUoIG5vZGUgKTtcclxuXHJcblx0XHRsZXQgbmVlZHNGbG93Q29kZSA9IHRydWU7XHJcblx0XHRsZXQgbm9kZUJsb2NrSGllcmFyY2h5ID0gbm9kZUJsb2NrO1xyXG5cclxuXHRcdHdoaWxlICggbm9kZUJsb2NrSGllcmFyY2h5ICkge1xyXG5cclxuXHRcdFx0aWYgKCBmbG93Q29kZUJsb2NrLmdldCggbm9kZUJsb2NrSGllcmFyY2h5ICkgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdG5lZWRzRmxvd0NvZGUgPSBmYWxzZTtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdG5vZGVCbG9ja0hpZXJhcmNoeSA9IHRoaXMuZ2V0RGF0YUZyb21Ob2RlKCBub2RlQmxvY2tIaWVyYXJjaHkgKS5wYXJlbnROb2RlQmxvY2s7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggbmVlZHNGbG93Q29kZSApIHtcclxuXHJcblx0XHRcdGZvciAoIGNvbnN0IGZsb3dDb2RlIG9mIGZsb3dDb2RlcyApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5hZGRMaW5lRmxvd0NvZGUoIGZsb3dDb2RlICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZCBhIGlubGluZS1jb2RlIHRvIHRoZSBjdXJyZW50IGZsb3cgY29kZS1ibG9jay5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFRoZSBub2RlIHRvIGFkZC5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gY29kZSAtIFRoZSBjb2RlIHRvIGFkZC5cclxuXHQgKiBAcGFyYW0ge05vZGV9IG5vZGVCbG9jayAtIEN1cnJlbnQgQ29uZGl0aW9uYWxOb2RlXHJcblx0ICovXHJcblx0YWRkTGluZUZsb3dDb2RlQmxvY2soIG5vZGUsIGNvZGUsIG5vZGVCbG9jayApIHtcclxuXHJcblx0XHRjb25zdCBub2RlRGF0YSA9IHRoaXMuZ2V0RGF0YUZyb21Ob2RlKCBub2RlICk7XHJcblx0XHRjb25zdCBmbG93Q29kZXMgPSBub2RlRGF0YS5mbG93Q29kZXMgfHwgKCBub2RlRGF0YS5mbG93Q29kZXMgPSBbXSApO1xyXG5cdFx0Y29uc3QgY29kZUJsb2NrID0gbm9kZURhdGEuZmxvd0NvZGVCbG9jayB8fCAoIG5vZGVEYXRhLmZsb3dDb2RlQmxvY2sgPSBuZXcgV2Vha01hcCgpICk7XHJcblxyXG5cdFx0Zmxvd0NvZGVzLnB1c2goIGNvZGUgKTtcclxuXHRcdGNvZGVCbG9jay5zZXQoIG5vZGVCbG9jaywgdHJ1ZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZCBhIGlubGluZS1jb2RlIHRvIHRoZSBjdXJyZW50IGZsb3cuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gY29kZSAtIFRoZSBjb2RlIHRvIGFkZC5cclxuXHQgKiBAcGFyYW0gez9Ob2RlfSBbbm9kZT0gbnVsbF0gLSBPcHRpb25hbCBOb2RlLCBjYW4gaGVscCB0aGUgc3lzdGVtIHVuZGVyc3RhbmQgaWYgdGhlIE5vZGUgaXMgcGFydCBvZiBhIGNvZGUtYmxvY2suXHJcblx0ICogQHJldHVybiB7Tm9kZUJ1aWxkZXJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbm9kZSBidWlsZGVyLlxyXG5cdCAqL1xyXG5cdGFkZExpbmVGbG93Q29kZSggY29kZSwgbm9kZSA9IG51bGwgKSB7XHJcblxyXG5cdFx0aWYgKCBjb2RlID09PSAnJyApIHJldHVybiB0aGlzO1xyXG5cclxuXHRcdGlmICggbm9kZSAhPT0gbnVsbCAmJiB0aGlzLmNvbnRleHQubm9kZUJsb2NrICkge1xyXG5cclxuXHRcdFx0dGhpcy5hZGRMaW5lRmxvd0NvZGVCbG9jayggbm9kZSwgY29kZSwgdGhpcy5jb250ZXh0Lm5vZGVCbG9jayApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb2RlID0gdGhpcy50YWIgKyBjb2RlO1xyXG5cclxuXHRcdGlmICggISAvO1xccyokLy50ZXN0KCBjb2RlICkgKSB7XHJcblxyXG5cdFx0XHRjb2RlID0gY29kZSArICc7XFxuJztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5mbG93LmNvZGUgKz0gY29kZTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIGEgY29kZSB0byB0aGUgY3VycmVudCBjb2RlIGZsb3cuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gY29kZSAtIFNoYWRlciBjb2RlLlxyXG5cdCAqIEByZXR1cm4ge05vZGVCdWlsZGVyfSBBIHJlZmVyZW5jZSB0byB0aGlzIG5vZGUgYnVpbGRlci5cclxuXHQgKi9cclxuXHRhZGRGbG93Q29kZSggY29kZSApIHtcclxuXHJcblx0XHR0aGlzLmZsb3cuY29kZSArPSBjb2RlO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZCB0YWIgaW4gdGhlIGNvZGUgdGhhdCB3aWxsIGJlIGdlbmVyYXRlZCBzbyB0aGF0IG90aGVyIHNuaXBwZXRzIHJlc3BlY3QgdGhlIGN1cnJlbnQgdGFidWxhdGlvbi5cclxuXHQgKiBUeXBpY2FsbHkgdXNlZCBpbiBjb2RlcyB3aXRoIElmLEVsc2UuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtOb2RlQnVpbGRlcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBub2RlIGJ1aWxkZXIuXHJcblx0ICovXHJcblx0YWRkRmxvd1RhYigpIHtcclxuXHJcblx0XHR0aGlzLnRhYiArPSAnXFx0JztcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW1vdmVzIGEgdGFiLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Tm9kZUJ1aWxkZXJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbm9kZSBidWlsZGVyLlxyXG5cdCAqL1xyXG5cdHJlbW92ZUZsb3dUYWIoKSB7XHJcblxyXG5cdFx0dGhpcy50YWIgPSB0aGlzLnRhYi5zbGljZSggMCwgLSAxICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2V0cyB0aGUgY3VycmVudCBmbG93IGRhdGEgYmFzZWQgb24gYSBOb2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlfSBub2RlIC0gTm9kZSB0aGF0IHRoZSBmbG93IHdhcyBzdGFydGVkLlxyXG5cdCAqIEBwYXJhbSB7KCd2ZXJ0ZXgnfCdmcmFnbWVudCd8J2NvbXB1dGUnfCdhbnknKX0gc2hhZGVyU3RhZ2UgLSBUaGUgc2hhZGVyIHN0YWdlLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdH0gVGhlIGZsb3cgZGF0YS5cclxuXHQgKi9cclxuXHRnZXRGbG93RGF0YSggbm9kZS8qLCBzaGFkZXJTdGFnZSovICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmZsb3dzRGF0YS5nZXQoIG5vZGUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFeGVjdXRlcyB0aGUgbm9kZSBmbG93IGJhc2VkIG9uIGEgcm9vdCBub2RlIHRvIGdlbmVyYXRlIHRoZSBmaW5hbCBzaGFkZXIgY29kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFRoZSBub2RlIHRvIGV4ZWN1dGUuXHJcblx0ICogQHJldHVybiB7T2JqZWN0fSBUaGUgY29kZSBmbG93LlxyXG5cdCAqL1xyXG5cdGZsb3dOb2RlKCBub2RlICkge1xyXG5cclxuXHRcdGNvbnN0IG91dHB1dCA9IG5vZGUuZ2V0Tm9kZVR5cGUoIHRoaXMgKTtcclxuXHJcblx0XHRjb25zdCBmbG93RGF0YSA9IHRoaXMuZmxvd0NoaWxkTm9kZSggbm9kZSwgb3V0cHV0ICk7XHJcblxyXG5cdFx0dGhpcy5mbG93c0RhdGEuc2V0KCBub2RlLCBmbG93RGF0YSApO1xyXG5cclxuXHRcdHJldHVybiBmbG93RGF0YTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJbmNsdWRlcyBhIG5vZGUgaW4gdGhlIGN1cnJlbnQgZnVuY3Rpb24gbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFRoZSBub2RlIHRvIGluY2x1ZGUuXHJcblx0ICogQHJldHVybnMge3ZvaWR9XHJcblx0ICovXHJcblx0YWRkSW5jbHVkZSggbm9kZSApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuY3VycmVudEZ1bmN0aW9uTm9kZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuY3VycmVudEZ1bmN0aW9uTm9kZS5pbmNsdWRlcy5wdXNoKCBub2RlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIG5hdGl2ZSBzaGFkZXIgb3BlcmF0b3IgbmFtZSBmb3IgYSBnaXZlbiBnZW5lcmljIG5hbWUuXHJcblx0ICogSXQgaXMgYSBzaW1pbGFyIHR5cGUgb2YgbWV0aG9kIGxpa2Uge0BsaW5rIE5vZGVCdWlsZGVyI2dldE1ldGhvZH0uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1NoYWRlck5vZGVJbnRlcm5hbH0gc2hhZGVyTm9kZSAtIFRoZSBzaGFkZXIgbm9kZSB0byBidWlsZCB0aGUgZnVuY3Rpb24gbm9kZSB3aXRoLlxyXG5cdCAqIEByZXR1cm4ge0Z1bmN0aW9uTm9kZX0gVGhlIGJ1aWxkIGZ1bmN0aW9uIG5vZGUuXHJcblx0ICovXHJcblx0YnVpbGRGdW5jdGlvbk5vZGUoIHNoYWRlck5vZGUgKSB7XHJcblxyXG5cdFx0Y29uc3QgZm4gPSBuZXcgRnVuY3Rpb25Ob2RlKCk7XHJcblxyXG5cdFx0Y29uc3QgcHJldmlvdXMgPSB0aGlzLmN1cnJlbnRGdW5jdGlvbk5vZGU7XHJcblxyXG5cdFx0dGhpcy5jdXJyZW50RnVuY3Rpb25Ob2RlID0gZm47XHJcblxyXG5cdFx0Zm4uY29kZSA9IHRoaXMuYnVpbGRGdW5jdGlvbkNvZGUoIHNoYWRlck5vZGUgKTtcclxuXHJcblx0XHR0aGlzLmN1cnJlbnRGdW5jdGlvbk5vZGUgPSBwcmV2aW91cztcclxuXHJcblx0XHRyZXR1cm4gZm47XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2VuZXJhdGVzIGEgY29kZSBmbG93IGJhc2VkIG9uIGEgVFNMIGZ1bmN0aW9uOiBGbigpLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTaGFkZXJOb2RlSW50ZXJuYWx9IHNoYWRlck5vZGUgLSBBIGZ1bmN0aW9uIGNvZGUgd2lsbCBiZSBnZW5lcmF0ZWQgYmFzZWQgb24gdGhlIGlucHV0LlxyXG5cdCAqIEByZXR1cm4ge09iamVjdH1cclxuXHQgKi9cclxuXHRmbG93U2hhZGVyTm9kZSggc2hhZGVyTm9kZSApIHtcclxuXHJcblx0XHRjb25zdCBsYXlvdXQgPSBzaGFkZXJOb2RlLmxheW91dDtcclxuXHJcblx0XHRjb25zdCBpbnB1dHMgPSB7XHJcblx0XHRcdFsgU3ltYm9sLml0ZXJhdG9yIF0oKSB7XHJcblxyXG5cdFx0XHRcdGxldCBpbmRleCA9IDA7XHJcblx0XHRcdFx0Y29uc3QgdmFsdWVzID0gT2JqZWN0LnZhbHVlcyggdGhpcyApO1xyXG5cdFx0XHRcdHJldHVybiB7XHJcblx0XHRcdFx0XHRuZXh0OiAoKSA9PiAoIHtcclxuXHRcdFx0XHRcdFx0dmFsdWU6IHZhbHVlc1sgaW5kZXggXSxcclxuXHRcdFx0XHRcdFx0ZG9uZTogaW5kZXggKysgPj0gdmFsdWVzLmxlbmd0aFxyXG5cdFx0XHRcdFx0fSApXHJcblx0XHRcdFx0fTtcclxuXHJcblx0XHRcdH1cclxuXHRcdH07XHJcblxyXG5cdFx0Zm9yICggY29uc3QgaW5wdXQgb2YgbGF5b3V0LmlucHV0cyApIHtcclxuXHJcblx0XHRcdGlucHV0c1sgaW5wdXQubmFtZSBdID0gbmV3IFBhcmFtZXRlck5vZGUoIGlucHV0LnR5cGUsIGlucHV0Lm5hbWUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRzaGFkZXJOb2RlLmxheW91dCA9IG51bGw7XHJcblxyXG5cdFx0Y29uc3QgY2FsbE5vZGUgPSBzaGFkZXJOb2RlLmNhbGwoIGlucHV0cyApO1xyXG5cdFx0Y29uc3QgZmxvd0RhdGEgPSB0aGlzLmZsb3dTdGFnZXNOb2RlKCBjYWxsTm9kZSwgbGF5b3V0LnR5cGUgKTtcclxuXHJcblx0XHRzaGFkZXJOb2RlLmxheW91dCA9IGxheW91dDtcclxuXHJcblx0XHRyZXR1cm4gZmxvd0RhdGE7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUnVucyB0aGUgbm9kZSBmbG93IHRocm91Z2ggYWxsIHRoZSBzdGVwcyBvZiBjcmVhdGlvbiwgJ3NldHVwJywgJ2FuYWx5emUnLCAnZ2VuZXJhdGUnLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIG5vZGUgdG8gZXhlY3V0ZS5cclxuXHQgKiBAcGFyYW0gez9zdHJpbmd9IG91dHB1dCAtIEV4cGVjdGVkIG91dHB1dCB0eXBlLiBGb3IgZXhhbXBsZSAndmVjMycuXHJcblx0ICogQHJldHVybiB7T2JqZWN0fVxyXG5cdCAqL1xyXG5cdGZsb3dTdGFnZXNOb2RlKCBub2RlLCBvdXRwdXQgPSBudWxsICkge1xyXG5cclxuXHRcdGNvbnN0IHByZXZpb3VzRmxvdyA9IHRoaXMuZmxvdztcclxuXHRcdGNvbnN0IHByZXZpb3VzVmFycyA9IHRoaXMudmFycztcclxuXHRcdGNvbnN0IHByZXZpb3VzRGVjbGFyYXRpb25zID0gdGhpcy5kZWNsYXJhdGlvbnM7XHJcblx0XHRjb25zdCBwcmV2aW91c0NhY2hlID0gdGhpcy5jYWNoZTtcclxuXHRcdGNvbnN0IHByZXZpb3VzQnVpbGRTdGFnZSA9IHRoaXMuYnVpbGRTdGFnZTtcclxuXHRcdGNvbnN0IHByZXZpb3VzU3RhY2sgPSB0aGlzLnN0YWNrO1xyXG5cclxuXHRcdGNvbnN0IGZsb3cgPSB7XHJcblx0XHRcdGNvZGU6ICcnXHJcblx0XHR9O1xyXG5cclxuXHRcdHRoaXMuZmxvdyA9IGZsb3c7XHJcblx0XHR0aGlzLnZhcnMgPSB7fTtcclxuXHRcdHRoaXMuZGVjbGFyYXRpb25zID0ge307XHJcblx0XHR0aGlzLmNhY2hlID0gbmV3IE5vZGVDYWNoZSgpO1xyXG5cdFx0dGhpcy5zdGFjayA9IHN0YWNrKCk7XHJcblxyXG5cdFx0Zm9yICggY29uc3QgYnVpbGRTdGFnZSBvZiBkZWZhdWx0QnVpbGRTdGFnZXMgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnNldEJ1aWxkU3RhZ2UoIGJ1aWxkU3RhZ2UgKTtcclxuXHJcblx0XHRcdGZsb3cucmVzdWx0ID0gbm9kZS5idWlsZCggdGhpcywgb3V0cHV0ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZsb3cudmFycyA9IHRoaXMuZ2V0VmFycyggdGhpcy5zaGFkZXJTdGFnZSApO1xyXG5cclxuXHRcdHRoaXMuZmxvdyA9IHByZXZpb3VzRmxvdztcclxuXHRcdHRoaXMudmFycyA9IHByZXZpb3VzVmFycztcclxuXHRcdHRoaXMuZGVjbGFyYXRpb25zID0gcHJldmlvdXNEZWNsYXJhdGlvbnM7XHJcblx0XHR0aGlzLmNhY2hlID0gcHJldmlvdXNDYWNoZTtcclxuXHRcdHRoaXMuc3RhY2sgPSBwcmV2aW91c1N0YWNrO1xyXG5cclxuXHRcdHRoaXMuc2V0QnVpbGRTdGFnZSggcHJldmlvdXNCdWlsZFN0YWdlICk7XHJcblxyXG5cdFx0cmV0dXJuIGZsb3c7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgbmF0aXZlIHNoYWRlciBvcGVyYXRvciBuYW1lIGZvciBhIGdpdmVuIGdlbmVyaWMgbmFtZS5cclxuXHQgKiBJdCBpcyBhIHNpbWlsYXIgdHlwZSBvZiBtZXRob2QgbGlrZSB7QGxpbmsgTm9kZUJ1aWxkZXIjZ2V0TWV0aG9kfS5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBvcCAtIFRoZSBvcGVyYXRvciBuYW1lIHRvIHJlc29sdmUuXHJcblx0ICogQHJldHVybiB7P3N0cmluZ30gVGhlIHJlc29sdmVkIG9wZXJhdG9yIG5hbWUuXHJcblx0ICovXHJcblx0Z2V0RnVuY3Rpb25PcGVyYXRvciggLyogb3AgKi8gKSB7XHJcblxyXG5cdFx0cmV0dXJuIG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQnVpbGRzIHRoZSBnaXZlbiBzaGFkZXIgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7U2hhZGVyTm9kZUludGVybmFsfSBzaGFkZXJOb2RlIC0gVGhlIHNoYWRlciBub2RlLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGZ1bmN0aW9uIGNvZGUuXHJcblx0ICovXHJcblx0YnVpbGRGdW5jdGlvbkNvZGUoIC8qIHNoYWRlck5vZGUgKi8gKSB7XHJcblxyXG5cdFx0Y29uc29sZS53YXJuKCAnQWJzdHJhY3QgZnVuY3Rpb24uJyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyBhIGNvZGUgZmxvdyBiYXNlZCBvbiBhIGNoaWxkIE5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBUaGUgbm9kZSB0byBleGVjdXRlLlxyXG5cdCAqIEBwYXJhbSB7P3N0cmluZ30gb3V0cHV0IC0gRXhwZWN0ZWQgb3V0cHV0IHR5cGUuIEZvciBleGFtcGxlICd2ZWMzJy5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBjb2RlIGZsb3cuXHJcblx0ICovXHJcblx0Zmxvd0NoaWxkTm9kZSggbm9kZSwgb3V0cHV0ID0gbnVsbCApIHtcclxuXHJcblx0XHRjb25zdCBwcmV2aW91c0Zsb3cgPSB0aGlzLmZsb3c7XHJcblxyXG5cdFx0Y29uc3QgZmxvdyA9IHtcclxuXHRcdFx0Y29kZTogJydcclxuXHRcdH07XHJcblxyXG5cdFx0dGhpcy5mbG93ID0gZmxvdztcclxuXHJcblx0XHRmbG93LnJlc3VsdCA9IG5vZGUuYnVpbGQoIHRoaXMsIG91dHB1dCApO1xyXG5cclxuXHRcdHRoaXMuZmxvdyA9IHByZXZpb3VzRmxvdztcclxuXHJcblx0XHRyZXR1cm4gZmxvdztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFeGVjdXRlcyBhIGZsb3cgb2YgY29kZSBpbiBhIGRpZmZlcmVudCBzdGFnZS5cclxuXHQgKlxyXG5cdCAqIFNvbWUgbm9kZXMgbGlrZSBgdmFyeWluZygpYCBoYXZlIHRoZSBhYmlsaXR5IHRvIGNvbXB1dGUgY29kZSBpbiB2ZXJ0ZXgtc3RhZ2UgYW5kXHJcblx0ICogcmV0dXJuIHRoZSB2YWx1ZSBpbiBmcmFnbWVudC1zdGFnZSBldmVuIGlmIGl0IGlzIGJlaW5nIGV4ZWN1dGVkIGluIGFuIGlucHV0IGZyYWdtZW50LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHsoJ3ZlcnRleCd8J2ZyYWdtZW50J3wnY29tcHV0ZSd8J2FueScpfSBzaGFkZXJTdGFnZSAtIFRoZSBzaGFkZXIgc3RhZ2UuXHJcblx0ICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIG5vZGUgdG8gZXhlY3V0ZS5cclxuXHQgKiBAcGFyYW0gez9zdHJpbmd9IG91dHB1dCAtIEV4cGVjdGVkIG91dHB1dCB0eXBlLiBGb3IgZXhhbXBsZSAndmVjMycuXHJcblx0ICogQHBhcmFtIHs/c3RyaW5nfSBwcm9wZXJ0eU5hbWUgLSBUaGUgcHJvcGVydHkgbmFtZSB0byBhc3NpZ24gdGhlIHJlc3VsdC5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3R9XHJcblx0ICovXHJcblx0Zmxvd05vZGVGcm9tU2hhZGVyU3RhZ2UoIHNoYWRlclN0YWdlLCBub2RlLCBvdXRwdXQgPSBudWxsLCBwcm9wZXJ0eU5hbWUgPSBudWxsICkge1xyXG5cclxuXHRcdGNvbnN0IHByZXZpb3VzU2hhZGVyU3RhZ2UgPSB0aGlzLnNoYWRlclN0YWdlO1xyXG5cclxuXHRcdHRoaXMuc2V0U2hhZGVyU3RhZ2UoIHNoYWRlclN0YWdlICk7XHJcblxyXG5cdFx0Y29uc3QgZmxvd0RhdGEgPSB0aGlzLmZsb3dDaGlsZE5vZGUoIG5vZGUsIG91dHB1dCApO1xyXG5cclxuXHRcdGlmICggcHJvcGVydHlOYW1lICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0Zmxvd0RhdGEuY29kZSArPSBgJHsgdGhpcy50YWIgKyBwcm9wZXJ0eU5hbWUgfSA9ICR7IGZsb3dEYXRhLnJlc3VsdCB9O1xcbmA7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuZmxvd0NvZGVbIHNoYWRlclN0YWdlIF0gPSB0aGlzLmZsb3dDb2RlWyBzaGFkZXJTdGFnZSBdICsgZmxvd0RhdGEuY29kZTtcclxuXHJcblx0XHR0aGlzLnNldFNoYWRlclN0YWdlKCBwcmV2aW91c1NoYWRlclN0YWdlICk7XHJcblxyXG5cdFx0cmV0dXJuIGZsb3dEYXRhO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYW4gYXJyYXkgaG9sZGluZyBhbGwgbm9kZSBhdHRyaWJ1dGVzIG9mIHRoaXMgbm9kZSBidWlsZGVyLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7QXJyYXk8Tm9kZUF0dHJpYnV0ZT59IFRoZSBub2RlIGF0dHJpYnV0ZXMgb2YgdGhpcyBidWlsZGVyLlxyXG5cdCAqL1xyXG5cdGdldEF0dHJpYnV0ZXNBcnJheSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzLmNvbmNhdCggdGhpcy5idWZmZXJBdHRyaWJ1dGVzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgYXR0cmlidXRlIGRlZmluaXRpb25zIGFzIGEgc2hhZGVyIHN0cmluZyBmb3IgdGhlIGdpdmVuIHNoYWRlciBzdGFnZS5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7KCd2ZXJ0ZXgnfCdmcmFnbWVudCd8J2NvbXB1dGUnfCdhbnknKX0gc2hhZGVyU3RhZ2UgLSBUaGUgc2hhZGVyIHN0YWdlLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGF0dHJpYnV0ZSBjb2RlIHNlY3Rpb24uXHJcblx0ICovXHJcblx0Z2V0QXR0cmlidXRlcyggLypzaGFkZXJTdGFnZSovICkge1xyXG5cclxuXHRcdGNvbnNvbGUud2FybiggJ0Fic3RyYWN0IGZ1bmN0aW9uLicgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSB2YXJ5aW5nIGRlZmluaXRpb25zIGFzIGEgc2hhZGVyIHN0cmluZyBmb3IgdGhlIGdpdmVuIHNoYWRlciBzdGFnZS5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7KCd2ZXJ0ZXgnfCdmcmFnbWVudCd8J2NvbXB1dGUnfCdhbnknKX0gc2hhZGVyU3RhZ2UgLSBUaGUgc2hhZGVyIHN0YWdlLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHZhcnlpbmcgY29kZSBzZWN0aW9uLlxyXG5cdCAqL1xyXG5cdGdldFZhcnlpbmdzKCAvKnNoYWRlclN0YWdlKi8gKSB7XHJcblxyXG5cdFx0Y29uc29sZS53YXJuKCAnQWJzdHJhY3QgZnVuY3Rpb24uJyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBzaW5nbGUgdmFyaWFibGUgZGVmaW5pdGlvbiBhcyBhIHNoYWRlciBzdHJpbmcgZm9yIHRoZSBnaXZlbiB2YXJpYWJsZSB0eXBlIGFuZCBuYW1lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBUaGUgdmFyaWFibGUncyB0eXBlLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIHZhcmlhYmxlJ3MgbmFtZS5cclxuXHQgKiBAcGFyYW0gez9udW1iZXJ9IFtjb3VudD1udWxsXSAtIFRoZSBhcnJheSBsZW5ndGguXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgc2hhZGVyIHN0cmluZy5cclxuXHQgKi9cclxuXHRnZXRWYXIoIHR5cGUsIG5hbWUsIGNvdW50ID0gbnVsbCApIHtcclxuXHJcblx0XHRyZXR1cm4gYCR7IGNvdW50ICE9PSBudWxsID8gdGhpcy5nZW5lcmF0ZUFycmF5RGVjbGFyYXRpb24oIHR5cGUsIGNvdW50ICkgOiB0aGlzLmdldFR5cGUoIHR5cGUgKSB9ICR7IG5hbWUgfWA7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgdmFyaWFibGUgZGVmaW5pdGlvbnMgYXMgYSBzaGFkZXIgc3RyaW5nIGZvciB0aGUgZ2l2ZW4gc2hhZGVyIHN0YWdlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHsoJ3ZlcnRleCd8J2ZyYWdtZW50J3wnY29tcHV0ZSd8J2FueScpfSBzaGFkZXJTdGFnZSAtIFRoZSBzaGFkZXIgc3RhZ2UuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgdmFyaWFibGUgY29kZSBzZWN0aW9uLlxyXG5cdCAqL1xyXG5cdGdldFZhcnMoIHNoYWRlclN0YWdlICkge1xyXG5cclxuXHRcdGxldCBzbmlwcGV0ID0gJyc7XHJcblxyXG5cdFx0Y29uc3QgdmFycyA9IHRoaXMudmFyc1sgc2hhZGVyU3RhZ2UgXTtcclxuXHJcblx0XHRpZiAoIHZhcnMgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGZvciAoIGNvbnN0IHZhcmlhYmxlIG9mIHZhcnMgKSB7XHJcblxyXG5cdFx0XHRcdHNuaXBwZXQgKz0gYCR7IHRoaXMuZ2V0VmFyKCB2YXJpYWJsZS50eXBlLCB2YXJpYWJsZS5uYW1lICkgfTsgYDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHNuaXBwZXQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgdW5pZm9ybSBkZWZpbml0aW9ucyBhcyBhIHNoYWRlciBzdHJpbmcgZm9yIHRoZSBnaXZlbiBzaGFkZXIgc3RhZ2UuXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcGFyYW0geygndmVydGV4J3wnZnJhZ21lbnQnfCdjb21wdXRlJ3wnYW55Jyl9IHNoYWRlclN0YWdlIC0gVGhlIHNoYWRlciBzdGFnZS5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB1bmlmb3JtIGNvZGUgc2VjdGlvbi5cclxuXHQgKi9cclxuXHRnZXRVbmlmb3JtcyggLypzaGFkZXJTdGFnZSovICkge1xyXG5cclxuXHRcdGNvbnNvbGUud2FybiggJ0Fic3RyYWN0IGZ1bmN0aW9uLicgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBuYXRpdmUgY29kZSBkZWZpbml0aW9ucyBhcyBhIHNoYWRlciBzdHJpbmcgZm9yIHRoZSBnaXZlbiBzaGFkZXIgc3RhZ2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geygndmVydGV4J3wnZnJhZ21lbnQnfCdjb21wdXRlJ3wnYW55Jyl9IHNoYWRlclN0YWdlIC0gVGhlIHNoYWRlciBzdGFnZS5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBuYXRpdmUgY29kZSBzZWN0aW9uLlxyXG5cdCAqL1xyXG5cdGdldENvZGVzKCBzaGFkZXJTdGFnZSApIHtcclxuXHJcblx0XHRjb25zdCBjb2RlcyA9IHRoaXMuY29kZXNbIHNoYWRlclN0YWdlIF07XHJcblxyXG5cdFx0bGV0IGNvZGUgPSAnJztcclxuXHJcblx0XHRpZiAoIGNvZGVzICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBjb25zdCBub2RlQ29kZSBvZiBjb2RlcyApIHtcclxuXHJcblx0XHRcdFx0Y29kZSArPSBub2RlQ29kZS5jb2RlICsgJ1xcbic7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBjb2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGhhc2ggb2YgdGhpcyBub2RlIGJ1aWxkZXIuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBoYXNoLlxyXG5cdCAqL1xyXG5cdGdldEhhc2goKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMudmVydGV4U2hhZGVyICsgdGhpcy5mcmFnbWVudFNoYWRlciArIHRoaXMuY29tcHV0ZVNoYWRlcjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBjdXJyZW50IHNoYWRlciBzdGFnZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7PygndmVydGV4J3wnZnJhZ21lbnQnfCdjb21wdXRlJ3wnYW55Jyl9IHNoYWRlclN0YWdlIC0gVGhlIHNoYWRlciBzdGFnZSB0byBzZXQuXHJcblx0ICovXHJcblx0c2V0U2hhZGVyU3RhZ2UoIHNoYWRlclN0YWdlICkge1xyXG5cclxuXHRcdHRoaXMuc2hhZGVyU3RhZ2UgPSBzaGFkZXJTdGFnZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNoYWRlciBzdGFnZS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4gez8oJ3ZlcnRleCd8J2ZyYWdtZW50J3wnY29tcHV0ZSd8J2FueScpfSBUaGUgY3VycmVudCBzaGFkZXIgc3RhZ2UuXHJcblx0ICovXHJcblx0Z2V0U2hhZGVyU3RhZ2UoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuc2hhZGVyU3RhZ2U7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgY3VycmVudCBidWlsZCBzdGFnZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Pygnc2V0dXAnfCdhbmFseXplJ3wnZ2VuZXJhdGUnKX0gYnVpbGRTdGFnZSAtIFRoZSBidWlsZCBzdGFnZSB0byBzZXQuXHJcblx0ICovXHJcblx0c2V0QnVpbGRTdGFnZSggYnVpbGRTdGFnZSApIHtcclxuXHJcblx0XHR0aGlzLmJ1aWxkU3RhZ2UgPSBidWlsZFN0YWdlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGN1cnJlbnQgYnVpbGQgc3RhZ2UuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHs/KCdzZXR1cCd8J2FuYWx5emUnfCdnZW5lcmF0ZScpfSBUaGUgY3VycmVudCBidWlsZCBzdGFnZS5cclxuXHQgKi9cclxuXHRnZXRCdWlsZFN0YWdlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmJ1aWxkU3RhZ2U7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29udHJvbHMgdGhlIGNvZGUgYnVpbGQgb2YgdGhlIHNoYWRlciBzdGFnZXMuXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKi9cclxuXHRidWlsZENvZGUoKSB7XHJcblxyXG5cdFx0Y29uc29sZS53YXJuKCAnQWJzdHJhY3QgZnVuY3Rpb24uJyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENlbnRyYWwgYnVpbGQgbWV0aG9kIHdoaWNoIGNvbnRyb2xzIHRoZSBidWlsZCBmb3IgdGhlIGdpdmVuIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge05vZGVCdWlsZGVyfSBBIHJlZmVyZW5jZSB0byB0aGlzIG5vZGUgYnVpbGRlci5cclxuXHQgKi9cclxuXHRidWlsZCgpIHtcclxuXHJcblx0XHRjb25zdCB7IG9iamVjdCwgbWF0ZXJpYWwsIHJlbmRlcmVyIH0gPSB0aGlzO1xyXG5cclxuXHRcdGlmICggbWF0ZXJpYWwgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRsZXQgbm9kZU1hdGVyaWFsID0gcmVuZGVyZXIubGlicmFyeS5mcm9tTWF0ZXJpYWwoIG1hdGVyaWFsICk7XHJcblxyXG5cdFx0XHRpZiAoIG5vZGVNYXRlcmlhbCA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0Y29uc29sZS5lcnJvciggYE5vZGVNYXRlcmlhbDogTWF0ZXJpYWwgXCIkeyBtYXRlcmlhbC50eXBlIH1cIiBpcyBub3QgY29tcGF0aWJsZS5gICk7XHJcblxyXG5cdFx0XHRcdG5vZGVNYXRlcmlhbCA9IG5ldyBOb2RlTWF0ZXJpYWwoKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdG5vZGVNYXRlcmlhbC5idWlsZCggdGhpcyApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR0aGlzLmFkZEZsb3coICdjb21wdXRlJywgb2JqZWN0ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIHNldHVwKCkgLT4gc3RhZ2UgMTogY3JlYXRlIHBvc3NpYmxlIG5ldyBub2RlcyBhbmQgcmV0dXJucyBhbiBvdXRwdXQgcmVmZXJlbmNlIG5vZGVcclxuXHRcdC8vIGFuYWx5emUoKSAgIC0+IHN0YWdlIDI6IGFuYWx5emUgbm9kZXMgdG8gcG9zc2libGUgb3B0aW1pemF0aW9uIGFuZCB2YWxpZGF0aW9uXHJcblx0XHQvLyBnZW5lcmF0ZSgpICAtPiBzdGFnZSAzOiBnZW5lcmF0ZSBzaGFkZXJcclxuXHJcblx0XHRmb3IgKCBjb25zdCBidWlsZFN0YWdlIG9mIGRlZmF1bHRCdWlsZFN0YWdlcyApIHtcclxuXHJcblx0XHRcdHRoaXMuc2V0QnVpbGRTdGFnZSggYnVpbGRTdGFnZSApO1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLmNvbnRleHQudmVydGV4ICYmIHRoaXMuY29udGV4dC52ZXJ0ZXguaXNOb2RlICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLmZsb3dOb2RlRnJvbVNoYWRlclN0YWdlKCAndmVydGV4JywgdGhpcy5jb250ZXh0LnZlcnRleCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Zm9yICggY29uc3Qgc2hhZGVyU3RhZ2Ugb2Ygc2hhZGVyU3RhZ2VzICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLnNldFNoYWRlclN0YWdlKCBzaGFkZXJTdGFnZSApO1xyXG5cclxuXHRcdFx0XHRjb25zdCBmbG93Tm9kZXMgPSB0aGlzLmZsb3dOb2Rlc1sgc2hhZGVyU3RhZ2UgXTtcclxuXHJcblx0XHRcdFx0Zm9yICggY29uc3Qgbm9kZSBvZiBmbG93Tm9kZXMgKSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBidWlsZFN0YWdlID09PSAnZ2VuZXJhdGUnICkge1xyXG5cclxuXHRcdFx0XHRcdFx0dGhpcy5mbG93Tm9kZSggbm9kZSApO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRub2RlLmJ1aWxkKCB0aGlzICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuc2V0QnVpbGRTdGFnZSggbnVsbCApO1xyXG5cdFx0dGhpcy5zZXRTaGFkZXJTdGFnZSggbnVsbCApO1xyXG5cclxuXHRcdC8vIHN0YWdlIDQ6IGJ1aWxkIGNvZGUgZm9yIGEgc3BlY2lmaWMgb3V0cHV0XHJcblxyXG5cdFx0dGhpcy5idWlsZENvZGUoKTtcclxuXHRcdHRoaXMuYnVpbGRVcGRhdGVOb2RlcygpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSB1bmlmb3JtIHJlcHJlc2VudGF0aW9uIHdoaWNoIGlzIGxhdGVyIHVzZWQgZm9yIFVCTyBnZW5lcmF0aW9uIGFuZCByZW5kZXJpbmcuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGVVbmlmb3JtfSB1bmlmb3JtTm9kZSAtIFRoZSB1bmlmb3JtIG5vZGUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBUaGUgcmVxdWVzdGVkIHR5cGUuXHJcblx0ICogQHJldHVybiB7VW5pZm9ybX0gVGhlIHVuaWZvcm0uXHJcblx0ICovXHJcblx0Z2V0Tm9kZVVuaWZvcm0oIHVuaWZvcm1Ob2RlLCB0eXBlICkge1xyXG5cclxuXHRcdGlmICggdHlwZSA9PT0gJ2Zsb2F0JyB8fCB0eXBlID09PSAnaW50JyB8fCB0eXBlID09PSAndWludCcgKSByZXR1cm4gbmV3IE51bWJlck5vZGVVbmlmb3JtKCB1bmlmb3JtTm9kZSApO1xyXG5cdFx0aWYgKCB0eXBlID09PSAndmVjMicgfHwgdHlwZSA9PT0gJ2l2ZWMyJyB8fCB0eXBlID09PSAndXZlYzInICkgcmV0dXJuIG5ldyBWZWN0b3IyTm9kZVVuaWZvcm0oIHVuaWZvcm1Ob2RlICk7XHJcblx0XHRpZiAoIHR5cGUgPT09ICd2ZWMzJyB8fCB0eXBlID09PSAnaXZlYzMnIHx8IHR5cGUgPT09ICd1dmVjMycgKSByZXR1cm4gbmV3IFZlY3RvcjNOb2RlVW5pZm9ybSggdW5pZm9ybU5vZGUgKTtcclxuXHRcdGlmICggdHlwZSA9PT0gJ3ZlYzQnIHx8IHR5cGUgPT09ICdpdmVjNCcgfHwgdHlwZSA9PT0gJ3V2ZWM0JyApIHJldHVybiBuZXcgVmVjdG9yNE5vZGVVbmlmb3JtKCB1bmlmb3JtTm9kZSApO1xyXG5cdFx0aWYgKCB0eXBlID09PSAnY29sb3InICkgcmV0dXJuIG5ldyBDb2xvck5vZGVVbmlmb3JtKCB1bmlmb3JtTm9kZSApO1xyXG5cdFx0aWYgKCB0eXBlID09PSAnbWF0MicgKSByZXR1cm4gbmV3IE1hdHJpeDJOb2RlVW5pZm9ybSggdW5pZm9ybU5vZGUgKTtcclxuXHRcdGlmICggdHlwZSA9PT0gJ21hdDMnICkgcmV0dXJuIG5ldyBNYXRyaXgzTm9kZVVuaWZvcm0oIHVuaWZvcm1Ob2RlICk7XHJcblx0XHRpZiAoIHR5cGUgPT09ICdtYXQ0JyApIHJldHVybiBuZXcgTWF0cml4NE5vZGVVbmlmb3JtKCB1bmlmb3JtTm9kZSApO1xyXG5cclxuXHRcdHRocm93IG5ldyBFcnJvciggYFVuaWZvcm0gXCIke3R5cGV9XCIgbm90IGRlY2xhcmVkLmAgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGb3JtYXRzIHRoZSBnaXZlbiBzaGFkZXIgc25pcHBldCBmcm9tIGEgZ2l2ZW4gdHlwZSBpbnRvIGFub3RoZXIgb25lLiBFLmcuXHJcblx0ICogdGhpcyBtZXRob2QgbWlnaHQgYmUgdXNlZCB0byBjb252ZXJ0IGEgc2ltcGxlIGZsb2F0IHN0cmluZyBgXCIxLjBcImAgaW50byBhXHJcblx0ICogYHZlYzNgIHJlcHJlc2VudGF0aW9uOiBgXCJ2ZWMzPGYzMj4oIDEuMCApXCJgLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNuaXBwZXQgLSBUaGUgc2hhZGVyIHNuaXBwZXQuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGZyb21UeXBlIC0gVGhlIHNvdXJjZSB0eXBlLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0b1R5cGUgLSBUaGUgdGFyZ2V0IHR5cGUuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgdXBkYXRlZCBzaGFkZXIgc3RyaW5nLlxyXG5cdCAqL1xyXG5cdGZvcm1hdCggc25pcHBldCwgZnJvbVR5cGUsIHRvVHlwZSApIHtcclxuXHJcblx0XHRmcm9tVHlwZSA9IHRoaXMuZ2V0VmVjdG9yVHlwZSggZnJvbVR5cGUgKTtcclxuXHRcdHRvVHlwZSA9IHRoaXMuZ2V0VmVjdG9yVHlwZSggdG9UeXBlICk7XHJcblxyXG5cdFx0aWYgKCBmcm9tVHlwZSA9PT0gdG9UeXBlIHx8IHRvVHlwZSA9PT0gbnVsbCB8fCB0aGlzLmlzUmVmZXJlbmNlKCB0b1R5cGUgKSApIHtcclxuXHJcblx0XHRcdHJldHVybiBzbmlwcGV0O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBmcm9tVHlwZUxlbmd0aCA9IHRoaXMuZ2V0VHlwZUxlbmd0aCggZnJvbVR5cGUgKTtcclxuXHRcdGNvbnN0IHRvVHlwZUxlbmd0aCA9IHRoaXMuZ2V0VHlwZUxlbmd0aCggdG9UeXBlICk7XHJcblxyXG5cdFx0aWYgKCBmcm9tVHlwZUxlbmd0aCA9PT0gMTYgJiYgdG9UeXBlTGVuZ3RoID09PSA5ICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIGAkeyB0aGlzLmdldFR5cGUoIHRvVHlwZSApIH0oICR7IHNuaXBwZXQgfVsgMCBdLnh5eiwgJHsgc25pcHBldCB9WyAxIF0ueHl6LCAkeyBzbmlwcGV0IH1bIDIgXS54eXogKWA7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggZnJvbVR5cGVMZW5ndGggPT09IDkgJiYgdG9UeXBlTGVuZ3RoID09PSA0ICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIGAkeyB0aGlzLmdldFR5cGUoIHRvVHlwZSApIH0oICR7IHNuaXBwZXQgfVsgMCBdLnh5LCAkeyBzbmlwcGV0IH1bIDEgXS54eSApYDtcclxuXHJcblx0XHR9XHJcblxyXG5cclxuXHRcdGlmICggZnJvbVR5cGVMZW5ndGggPiA0ICkgeyAvLyBmcm9tVHlwZSBpcyBtYXRyaXgtbGlrZVxyXG5cclxuXHRcdFx0Ly8gQFRPRE86IGlnbm9yZSBmb3Igbm93XHJcblxyXG5cdFx0XHRyZXR1cm4gc25pcHBldDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0b1R5cGVMZW5ndGggPiA0IHx8IHRvVHlwZUxlbmd0aCA9PT0gMCApIHsgLy8gdG9UeXBlIGlzIG1hdHJpeC1saWtlIG9yIHVua25vd25cclxuXHJcblx0XHRcdC8vIEBUT0RPOiBpZ25vcmUgZm9yIG5vd1xyXG5cclxuXHRcdFx0cmV0dXJuIHNuaXBwZXQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggZnJvbVR5cGVMZW5ndGggPT09IHRvVHlwZUxlbmd0aCApIHtcclxuXHJcblx0XHRcdHJldHVybiBgJHsgdGhpcy5nZXRUeXBlKCB0b1R5cGUgKSB9KCAkeyBzbmlwcGV0IH0gKWA7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggZnJvbVR5cGVMZW5ndGggPiB0b1R5cGVMZW5ndGggKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gdGhpcy5mb3JtYXQoIGAkeyBzbmlwcGV0IH0uJHsgJ3h5eicuc2xpY2UoIDAsIHRvVHlwZUxlbmd0aCApIH1gLCB0aGlzLmdldFR5cGVGcm9tTGVuZ3RoKCB0b1R5cGVMZW5ndGgsIHRoaXMuZ2V0Q29tcG9uZW50VHlwZSggZnJvbVR5cGUgKSApLCB0b1R5cGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0b1R5cGVMZW5ndGggPT09IDQgJiYgZnJvbVR5cGVMZW5ndGggPiAxICkgeyAvLyB0b1R5cGUgaXMgdmVjNC1saWtlXHJcblxyXG5cdFx0XHRyZXR1cm4gYCR7IHRoaXMuZ2V0VHlwZSggdG9UeXBlICkgfSggJHsgdGhpcy5mb3JtYXQoIHNuaXBwZXQsIGZyb21UeXBlLCAndmVjMycgKSB9LCAxLjAgKWA7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggZnJvbVR5cGVMZW5ndGggPT09IDIgKSB7IC8vIGZyb21UeXBlIGlzIHZlYzItbGlrZSBhbmQgdG9UeXBlIGlzIHZlYzMtbGlrZVxyXG5cclxuXHRcdFx0cmV0dXJuIGAkeyB0aGlzLmdldFR5cGUoIHRvVHlwZSApIH0oICR7IHRoaXMuZm9ybWF0KCBzbmlwcGV0LCBmcm9tVHlwZSwgJ3ZlYzInICkgfSwgMC4wIClgO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGZyb21UeXBlTGVuZ3RoID09PSAxICYmIHRvVHlwZUxlbmd0aCA+IDEgJiYgZnJvbVR5cGUgIT09IHRoaXMuZ2V0Q29tcG9uZW50VHlwZSggdG9UeXBlICkgKSB7IC8vIGZyb21UeXBlIGlzIGZsb2F0LWxpa2VcclxuXHJcblx0XHRcdC8vIGNvbnZlcnQgYSBudW1iZXIgdmFsdWUgdG8gdmVjdG9yIHR5cGUsIGUuZzpcclxuXHRcdFx0Ly8gdmVjMyggMXUgKSAtPiB2ZWMzKCBmbG9hdCggMXUgKSApXHJcblxyXG5cdFx0XHRzbmlwcGV0ID0gYCR7IHRoaXMuZ2V0VHlwZSggdGhpcy5nZXRDb21wb25lbnRUeXBlKCB0b1R5cGUgKSApIH0oICR7IHNuaXBwZXQgfSApYDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGAkeyB0aGlzLmdldFR5cGUoIHRvVHlwZSApIH0oICR7IHNuaXBwZXQgfSApYDsgLy8gZnJvbVR5cGUgaXMgZmxvYXQtbGlrZVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBzaWduYXR1cmUgd2l0aCB0aGUgZW5naW5lJ3MgY3VycmVudCByZXZpc2lvbi5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHNpZ25hdHVyZS5cclxuXHQgKi9cclxuXHRnZXRTaWduYXR1cmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIGAvLyBUaHJlZS5qcyByJHsgUkVWSVNJT04gfSAtIE5vZGUgU3lzdGVtXFxuYDtcclxuXHJcblx0fVxyXG5cclxuXHQvLyBEZXByZWNhdGVkXHJcblxyXG5cdC8qKlxyXG5cdCAqIEBmdW5jdGlvblxyXG5cdCAqIEBkZXByZWNhdGVkIHNpbmNlIHIxNjguIFVzZSBgbmV3IE5vZGVNYXRlcmlhbCgpYCBpbnN0ZWFkLCB3aXRoIHRhcmdldGVkIG5vZGUgbWF0ZXJpYWwgbmFtZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbdHlwZT0nTm9kZU1hdGVyaWFsJ10gLSBUaGUgbm9kZSBtYXRlcmlhbCB0eXBlLlxyXG5cdCAqIEB0aHJvd3Mge0Vycm9yfVxyXG5cdCAqL1xyXG5cdGNyZWF0ZU5vZGVNYXRlcmlhbCggdHlwZSA9ICdOb2RlTWF0ZXJpYWwnICkgeyAvLyBAZGVwcmVjYXRlZCwgcjE2OFxyXG5cclxuXHRcdHRocm93IG5ldyBFcnJvciggYFRIUkVFLk5vZGVCdWlsZGVyOiBjcmVhdGVOb2RlTWF0ZXJpYWwoKSB3YXMgZGVwcmVjYXRlZC4gVXNlIG5ldyAkeyB0eXBlIH0oKSBpbnN0ZWFkLmAgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTm9kZUJ1aWxkZXI7XHJcbiIsImltcG9ydCB7IE5vZGVVcGRhdGVUeXBlIH0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xyXG5cclxuLyoqXHJcbiAqIE1hbmFnZW1lbnQgY2xhc3MgZm9yIHVwZGF0aW5nIG5vZGVzLiBUaGUgbW9kdWxlIHRyYWNrcyBtZXRyaWNzIGxpa2VcclxuICogdGhlIGVsYXBzZWQgdGltZSwgZGVsdGEgdGltZSwgdGhlIHJlbmRlciBhbmQgZnJhbWUgSUQgdG8gY29ycmVjdGx5XHJcbiAqIGNhbGwgdGhlIG5vZGUgdXBkYXRlIG1ldGhvZHMge0BsaW5rIE5vZGUjdXBkYXRlQmVmb3JlfSwge0BsaW5rIE5vZGUjdXBkYXRlfVxyXG4gKiBhbmQge0BsaW5rIE5vZGUjdXBkYXRlQWZ0ZXJ9IGRlcGVuZGluZyBvbiB0aGUgbm9kZSdzIGNvbmZpZ3VyYXRpb24uXHJcbiAqL1xyXG5jbGFzcyBOb2RlRnJhbWUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG5vZGUgZmFtZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBlbGFwc2VkIHRpbWUgaW4gc2Vjb25kcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRpbWUgPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGRlbHRhIHRpbWUgaW4gc2Vjb25kcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRlbHRhVGltZSA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZnJhbWUgSUQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5mcmFtZUlkID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByZW5kZXIgSUQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yZW5kZXJJZCA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBVc2VkIHRvIGNvbnRyb2wgdGhlIHtAbGluayBOb2RlI3VwZGF0ZX0gY2FsbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2Vha01hcDxOb2RlLCBPYmplY3Q+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVwZGF0ZU1hcCA9IG5ldyBXZWFrTWFwKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBVc2VkIHRvIGNvbnRyb2wgdGhlIHtAbGluayBOb2RlI3VwZGF0ZUJlZm9yZX0gY2FsbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2Vha01hcDxOb2RlLCBPYmplY3Q+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVwZGF0ZUJlZm9yZU1hcCA9IG5ldyBXZWFrTWFwKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBVc2VkIHRvIGNvbnRyb2wgdGhlIHtAbGluayBOb2RlI3VwZGF0ZUFmdGVyfSBjYWxsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtXZWFrTWFwPE5vZGUsIE9iamVjdD59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudXBkYXRlQWZ0ZXJNYXAgPSBuZXcgV2Vha01hcCgpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgcmVuZGVyZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9SZW5kZXJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yZW5kZXJlciA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P01hdGVyaWFsfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1hdGVyaWFsID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGNhbWVyYS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P0NhbWVyYX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jYW1lcmEgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgM0Qgb2JqZWN0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/T2JqZWN0M0R9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMub2JqZWN0ID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IHNjZW5lLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/U2NlbmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2NlbmUgPSBudWxsO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBkaWN0aW9uYXJ5IGZvciBhIGdpdmVuIG5vZGUgYW5kIHVwZGF0ZSBtYXAgd2hpY2hcclxuXHQgKiBpcyB1c2VkIHRvIGNvcnJlY3RseSBjYWxsIG5vZGUgdXBkYXRlIG1ldGhvZHMgcGVyIGZyYW1lIG9yIHJlbmRlci5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtXZWFrTWFwPE5vZGUsIE9iamVjdD59IHJlZmVyZW5jZU1hcCAtIFRoZSByZWZlcmVuY2Ugd2VhayBtYXAuXHJcblx0ICogQHBhcmFtIHtOb2RlfSBub2RlUmVmIC0gVGhlIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBub2RlLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdDxzdHJpbmcsV2Vha01hcD59IFRoZSBkaWN0aW9uYXJ5LlxyXG5cdCAqL1xyXG5cdF9nZXRNYXBzKCByZWZlcmVuY2VNYXAsIG5vZGVSZWYgKSB7XHJcblxyXG5cdFx0bGV0IG1hcHMgPSByZWZlcmVuY2VNYXAuZ2V0KCBub2RlUmVmICk7XHJcblxyXG5cdFx0aWYgKCBtYXBzID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRtYXBzID0ge1xyXG5cdFx0XHRcdHJlbmRlck1hcDogbmV3IFdlYWtNYXAoKSxcclxuXHRcdFx0XHRmcmFtZU1hcDogbmV3IFdlYWtNYXAoKVxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0cmVmZXJlbmNlTWFwLnNldCggbm9kZVJlZiwgbWFwcyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbWFwcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBleGVjdXRlcyB0aGUge0BsaW5rIE5vZGUjdXBkYXRlQmVmb3JlfSBmb3IgdGhlIGdpdmVuIG5vZGUuXHJcblx0ICogSXQgbWFrZXMgc3VyZSB7QGxpbmsgTm9kZSN1cGRhdGVCZWZvcmVUeXBlfSBpcyBob25vcmVkIG1lYW5pbmcgdGhlIHVwZGF0ZVxyXG5cdCAqIGlzIG9ubHkgZXhlY3V0ZWQgb25jZSBwZXIgZnJhbWUsIHJlbmRlciBvciBvYmplY3QgZGVwZW5kaW5nIG9uIHRoZSB1cGRhdGVcclxuXHQgKiB0eXBlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIG5vZGUgdGhhdCBzaG91bGQgYmUgdXBkYXRlZC5cclxuXHQgKi9cclxuXHR1cGRhdGVCZWZvcmVOb2RlKCBub2RlICkge1xyXG5cclxuXHRcdGNvbnN0IHVwZGF0ZVR5cGUgPSBub2RlLmdldFVwZGF0ZUJlZm9yZVR5cGUoKTtcclxuXHRcdGNvbnN0IHJlZmVyZW5jZSA9IG5vZGUudXBkYXRlUmVmZXJlbmNlKCB0aGlzICk7XHJcblxyXG5cdFx0aWYgKCB1cGRhdGVUeXBlID09PSBOb2RlVXBkYXRlVHlwZS5GUkFNRSApIHtcclxuXHJcblx0XHRcdGNvbnN0IHsgZnJhbWVNYXAgfSA9IHRoaXMuX2dldE1hcHMoIHRoaXMudXBkYXRlQmVmb3JlTWFwLCByZWZlcmVuY2UgKTtcclxuXHJcblx0XHRcdGlmICggZnJhbWVNYXAuZ2V0KCByZWZlcmVuY2UgKSAhPT0gdGhpcy5mcmFtZUlkICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIG5vZGUudXBkYXRlQmVmb3JlKCB0aGlzICkgIT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0XHRcdGZyYW1lTWFwLnNldCggcmVmZXJlbmNlLCB0aGlzLmZyYW1lSWQgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHVwZGF0ZVR5cGUgPT09IE5vZGVVcGRhdGVUeXBlLlJFTkRFUiApIHtcclxuXHJcblx0XHRcdGNvbnN0IHsgcmVuZGVyTWFwIH0gPSB0aGlzLl9nZXRNYXBzKCB0aGlzLnVwZGF0ZUJlZm9yZU1hcCwgcmVmZXJlbmNlICk7XHJcblxyXG5cdFx0XHRpZiAoIHJlbmRlck1hcC5nZXQoIHJlZmVyZW5jZSApICE9PSB0aGlzLnJlbmRlcklkICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIG5vZGUudXBkYXRlQmVmb3JlKCB0aGlzICkgIT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0XHRcdHJlbmRlck1hcC5zZXQoIHJlZmVyZW5jZSwgdGhpcy5yZW5kZXJJZCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmICggdXBkYXRlVHlwZSA9PT0gTm9kZVVwZGF0ZVR5cGUuT0JKRUNUICkge1xyXG5cclxuXHRcdFx0bm9kZS51cGRhdGVCZWZvcmUoIHRoaXMgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgZXhlY3V0ZXMgdGhlIHtAbGluayBOb2RlI3VwZGF0ZUFmdGVyfSBmb3IgdGhlIGdpdmVuIG5vZGUuXHJcblx0ICogSXQgbWFrZXMgc3VyZSB7QGxpbmsgTm9kZSN1cGRhdGVBZnRlclR5cGV9IGlzIGhvbm9yZWQgbWVhbmluZyB0aGUgdXBkYXRlXHJcblx0ICogaXMgb25seSBleGVjdXRlZCBvbmNlIHBlciBmcmFtZSwgcmVuZGVyIG9yIG9iamVjdCBkZXBlbmRpbmcgb24gdGhlIHVwZGF0ZVxyXG5cdCAqIHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBUaGUgbm9kZSB0aGF0IHNob3VsZCBiZSB1cGRhdGVkLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZUFmdGVyTm9kZSggbm9kZSApIHtcclxuXHJcblx0XHRjb25zdCB1cGRhdGVUeXBlID0gbm9kZS5nZXRVcGRhdGVBZnRlclR5cGUoKTtcclxuXHRcdGNvbnN0IHJlZmVyZW5jZSA9IG5vZGUudXBkYXRlUmVmZXJlbmNlKCB0aGlzICk7XHJcblxyXG5cdFx0aWYgKCB1cGRhdGVUeXBlID09PSBOb2RlVXBkYXRlVHlwZS5GUkFNRSApIHtcclxuXHJcblx0XHRcdGNvbnN0IHsgZnJhbWVNYXAgfSA9IHRoaXMuX2dldE1hcHMoIHRoaXMudXBkYXRlQWZ0ZXJNYXAsIHJlZmVyZW5jZSApO1xyXG5cclxuXHRcdFx0aWYgKCBmcmFtZU1hcC5nZXQoIHJlZmVyZW5jZSApICE9PSB0aGlzLmZyYW1lSWQgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggbm9kZS51cGRhdGVBZnRlciggdGhpcyApICE9PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdFx0XHRmcmFtZU1hcC5zZXQoIHJlZmVyZW5jZSwgdGhpcy5mcmFtZUlkICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2UgaWYgKCB1cGRhdGVUeXBlID09PSBOb2RlVXBkYXRlVHlwZS5SRU5ERVIgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB7IHJlbmRlck1hcCB9ID0gdGhpcy5fZ2V0TWFwcyggdGhpcy51cGRhdGVBZnRlck1hcCwgcmVmZXJlbmNlICk7XHJcblxyXG5cdFx0XHRpZiAoIHJlbmRlck1hcC5nZXQoIHJlZmVyZW5jZSApICE9PSB0aGlzLnJlbmRlcklkICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIG5vZGUudXBkYXRlQWZ0ZXIoIHRoaXMgKSAhPT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRcdFx0cmVuZGVyTWFwLnNldCggcmVmZXJlbmNlLCB0aGlzLnJlbmRlcklkICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2UgaWYgKCB1cGRhdGVUeXBlID09PSBOb2RlVXBkYXRlVHlwZS5PQkpFQ1QgKSB7XHJcblxyXG5cdFx0XHRub2RlLnVwZGF0ZUFmdGVyKCB0aGlzICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGV4ZWN1dGVzIHRoZSB7QGxpbmsgTm9kZSN1cGRhdGV9IGZvciB0aGUgZ2l2ZW4gbm9kZS5cclxuXHQgKiBJdCBtYWtlcyBzdXJlIHtAbGluayBOb2RlI3VwZGF0ZVR5cGV9IGlzIGhvbm9yZWQgbWVhbmluZyB0aGUgdXBkYXRlXHJcblx0ICogaXMgb25seSBleGVjdXRlZCBvbmNlIHBlciBmcmFtZSwgcmVuZGVyIG9yIG9iamVjdCBkZXBlbmRpbmcgb24gdGhlIHVwZGF0ZVxyXG5cdCAqIHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBUaGUgbm9kZSB0aGF0IHNob3VsZCBiZSB1cGRhdGVkLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZU5vZGUoIG5vZGUgKSB7XHJcblxyXG5cdFx0Y29uc3QgdXBkYXRlVHlwZSA9IG5vZGUuZ2V0VXBkYXRlVHlwZSgpO1xyXG5cdFx0Y29uc3QgcmVmZXJlbmNlID0gbm9kZS51cGRhdGVSZWZlcmVuY2UoIHRoaXMgKTtcclxuXHJcblx0XHRpZiAoIHVwZGF0ZVR5cGUgPT09IE5vZGVVcGRhdGVUeXBlLkZSQU1FICkge1xyXG5cclxuXHRcdFx0Y29uc3QgeyBmcmFtZU1hcCB9ID0gdGhpcy5fZ2V0TWFwcyggdGhpcy51cGRhdGVNYXAsIHJlZmVyZW5jZSApO1xyXG5cclxuXHRcdFx0aWYgKCBmcmFtZU1hcC5nZXQoIHJlZmVyZW5jZSApICE9PSB0aGlzLmZyYW1lSWQgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggbm9kZS51cGRhdGUoIHRoaXMgKSAhPT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRcdFx0ZnJhbWVNYXAuc2V0KCByZWZlcmVuY2UsIHRoaXMuZnJhbWVJZCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmICggdXBkYXRlVHlwZSA9PT0gTm9kZVVwZGF0ZVR5cGUuUkVOREVSICkge1xyXG5cclxuXHRcdFx0Y29uc3QgeyByZW5kZXJNYXAgfSA9IHRoaXMuX2dldE1hcHMoIHRoaXMudXBkYXRlTWFwLCByZWZlcmVuY2UgKTtcclxuXHJcblx0XHRcdGlmICggcmVuZGVyTWFwLmdldCggcmVmZXJlbmNlICkgIT09IHRoaXMucmVuZGVySWQgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggbm9kZS51cGRhdGUoIHRoaXMgKSAhPT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRcdFx0cmVuZGVyTWFwLnNldCggcmVmZXJlbmNlLCB0aGlzLnJlbmRlcklkICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2UgaWYgKCB1cGRhdGVUeXBlID09PSBOb2RlVXBkYXRlVHlwZS5PQkpFQ1QgKSB7XHJcblxyXG5cdFx0XHRub2RlLnVwZGF0ZSggdGhpcyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgbm9kZSBmcmFtZS4gVGhpcyBtZXRob2QgaXNcclxuXHQgKiBjYWxsZWQgYnkgdGhlIHJlbmRlcmVyIGluIGl0cyBpbnRlcm5hbCBhbmltYXRpb24gbG9vcC5cclxuXHQgKi9cclxuXHR1cGRhdGUoKSB7XHJcblxyXG5cdFx0dGhpcy5mcmFtZUlkICsrO1xyXG5cclxuXHRcdGlmICggdGhpcy5sYXN0VGltZSA9PT0gdW5kZWZpbmVkICkgdGhpcy5sYXN0VGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xyXG5cclxuXHRcdHRoaXMuZGVsdGFUaW1lID0gKCBwZXJmb3JtYW5jZS5ub3coKSAtIHRoaXMubGFzdFRpbWUgKSAvIDEwMDA7XHJcblxyXG5cdFx0dGhpcy5sYXN0VGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xyXG5cclxuXHRcdHRoaXMudGltZSArPSB0aGlzLmRlbHRhVGltZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTm9kZUZyYW1lO1xyXG4iLCIvKipcclxuICogRGVzY3JpYmVzIHRoZSBpbnB1dCBvZiBhIHtAbGluayBOb2RlRnVuY3Rpb259LlxyXG4gKi9cclxuY2xhc3MgTm9kZUZ1bmN0aW9uSW5wdXQge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG5vZGUgZnVuY3Rpb24gaW5wdXQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSBpbnB1dCB0eXBlLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIGlucHV0IG5hbWUuXHJcblx0ICogQHBhcmFtIHs/bnVtYmVyfSBbY291bnQ9bnVsbF0gLSBJZiB0aGUgaW5wdXQgaXMgYW4gQXJyYXksIGNvdW50IHdpbGwgYmUgdGhlIGxlbmd0aC5cclxuXHQgKiBAcGFyYW0geygnaW4nfCdvdXQnfCdpbm91dCcpfSBbcXVhbGlmaWVyPScnXSAtIFRoZSBwYXJhbWV0ZXIgcXVhbGlmaWVyIChvbmx5IHJlbGV2YW50IGZvciBHTFNMKS5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0NvbnN0PWZhbHNlXSAtIFdoZXRoZXIgdGhlIGlucHV0IHVzZXMgYSBjb25zdCBxdWFsaWZpZXIgb3Igbm90IChvbmx5IHJlbGV2YW50IGZvciBHTFNMKS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggdHlwZSwgbmFtZSwgY291bnQgPSBudWxsLCBxdWFsaWZpZXIgPSAnJywgaXNDb25zdCA9IGZhbHNlICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogIFRoZSBpbnB1dCB0eXBlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudHlwZSA9IHR5cGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgaW5wdXQgbmFtZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5hbWUgPSBuYW1lO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSWYgdGhlIGlucHV0IGlzIGFuIEFycmF5LCBjb3VudCB3aWxsIGJlIHRoZSBsZW5ndGguXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9udW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY291bnQgPSBjb3VudDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqVGhlIHBhcmFtZXRlciBxdWFsaWZpZXIgKG9ubHkgcmVsZXZhbnQgZm9yIEdMU0wpLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHsoJ2luJ3wnb3V0J3wnaW5vdXQnKX1cclxuXHRcdCAqIEBkZWZhdWx0ICcnXHJcblx0XHQgKi9cclxuXHRcdHRoaXMucXVhbGlmaWVyID0gcXVhbGlmaWVyO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgaW5wdXQgdXNlcyBhIGNvbnN0IHF1YWxpZmllciBvciBub3QgKG9ubHkgcmVsZXZhbnQgZm9yIEdMU0wpLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0NvbnN0ID0gaXNDb25zdDtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuTm9kZUZ1bmN0aW9uSW5wdXQuaXNOb2RlRnVuY3Rpb25JbnB1dCA9IHRydWU7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBOb2RlRnVuY3Rpb25JbnB1dDtcclxuIiwiaW1wb3J0IEFuYWx5dGljTGlnaHROb2RlIGZyb20gJy4vQW5hbHl0aWNMaWdodE5vZGUuanMnO1xyXG5pbXBvcnQgeyBsaWdodFRhcmdldERpcmVjdGlvbiB9IGZyb20gJy4uL2FjY2Vzc29ycy9MaWdodHMuanMnO1xyXG5cclxuLyoqXHJcbiAqIE1vZHVsZSBmb3IgcmVwcmVzZW50aW5nIGRpcmVjdGlvbmFsIGxpZ2h0cyBhcyBub2Rlcy5cclxuICpcclxuICogQGF1Z21lbnRzIEFuYWx5dGljTGlnaHROb2RlXHJcbiAqL1xyXG5jbGFzcyBEaXJlY3Rpb25hbExpZ2h0Tm9kZSBleHRlbmRzIEFuYWx5dGljTGlnaHROb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnRGlyZWN0aW9uYWxMaWdodE5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgZGlyZWN0aW9uYWwgbGlnaHQgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7P0RpcmVjdGlvbmFsTGlnaHR9IFtsaWdodD1udWxsXSAtIFRoZSBkaXJlY3Rpb25hbCBsaWdodCBzb3VyY2UuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGxpZ2h0ID0gbnVsbCApIHtcclxuXHJcblx0XHRzdXBlciggbGlnaHQgKTtcclxuXHJcblx0fVxyXG5cclxuXHRzZXR1cERpcmVjdCgpIHtcclxuXHJcblx0XHRjb25zdCBsaWdodENvbG9yID0gdGhpcy5jb2xvck5vZGU7XHJcblx0XHRjb25zdCBsaWdodERpcmVjdGlvbiA9IGxpZ2h0VGFyZ2V0RGlyZWN0aW9uKCB0aGlzLmxpZ2h0ICk7XHJcblxyXG5cdFx0cmV0dXJuIHsgbGlnaHREaXJlY3Rpb24sIGxpZ2h0Q29sb3IgfTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgRGlyZWN0aW9uYWxMaWdodE5vZGU7XHJcbiIsImltcG9ydCBBbmFseXRpY0xpZ2h0Tm9kZSBmcm9tICcuL0FuYWx5dGljTGlnaHROb2RlLmpzJztcclxuaW1wb3J0IHsgdGV4dHVyZSB9IGZyb20gJy4uL2FjY2Vzc29ycy9UZXh0dXJlTm9kZS5qcyc7XHJcbmltcG9ydCB7IHVuaWZvcm0gfSBmcm9tICcuLi9jb3JlL1VuaWZvcm1Ob2RlLmpzJztcclxuaW1wb3J0IHsgbGlnaHRWaWV3UG9zaXRpb24gfSBmcm9tICcuLi9hY2Nlc3NvcnMvTGlnaHRzLmpzJztcclxuaW1wb3J0IHsgcmVuZGVyR3JvdXAgfSBmcm9tICcuLi9jb3JlL1VuaWZvcm1Hcm91cE5vZGUuanMnO1xyXG5cclxuaW1wb3J0IHsgTWF0cml4NCB9IGZyb20gJy4uLy4uL21hdGgvTWF0cml4NC5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBOb2RlVXBkYXRlVHlwZSB9IGZyb20gJy4uL2NvcmUvY29uc3RhbnRzLmpzJztcclxuXHJcbmNvbnN0IF9tYXRyaXg0MSA9IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDQoKTtcclxuY29uc3QgX21hdHJpeDQyID0gLypAX19QVVJFX18qLyBuZXcgTWF0cml4NCgpO1xyXG5cclxubGV0IF9sdGNMaWIgPSBudWxsO1xyXG5cclxuLyoqXHJcbiAqIE1vZHVsZSBmb3IgcmVwcmVzZW50aW5nIHJlY3QgYXJlYSBsaWdodHMgYXMgbm9kZXMuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBBbmFseXRpY0xpZ2h0Tm9kZVxyXG4gKi9cclxuY2xhc3MgUmVjdEFyZWFMaWdodE5vZGUgZXh0ZW5kcyBBbmFseXRpY0xpZ2h0Tm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ1JlY3RBcmVhTGlnaHROb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHJlY3QgYXJlYSBsaWdodCBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHs/UmVjdEFyZWFMaWdodH0gW2xpZ2h0PW51bGxdIC0gVGhlIHJlY3QgYXJlYSBsaWdodCBzb3VyY2UuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGxpZ2h0ID0gbnVsbCApIHtcclxuXHJcblx0XHRzdXBlciggbGlnaHQgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFVuaWZvcm0gbm9kZSByZXByZXNlbnRpbmcgdGhlIGhhbGYgaGVpZ2h0IG9mIHRoZSBhcmUgbGlnaHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1VuaWZvcm1Ob2RlPHZlYzM+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmhhbGZIZWlnaHQgPSB1bmlmb3JtKCBuZXcgVmVjdG9yMygpICkuc2V0R3JvdXAoIHJlbmRlckdyb3VwICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBVbmlmb3JtIG5vZGUgcmVwcmVzZW50aW5nIHRoZSBoYWxmIHdpZHRoIG9mIHRoZSBhcmUgbGlnaHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1VuaWZvcm1Ob2RlPHZlYzM+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmhhbGZXaWR0aCA9IHVuaWZvcm0oIG5ldyBWZWN0b3IzKCkgKS5zZXRHcm91cCggcmVuZGVyR3JvdXAgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBgdXBkYXRlVHlwZWAgaXMgc2V0IHRvIGBOb2RlVXBkYXRlVHlwZS5SRU5ERVJgIHNpbmNlIHRoZSBsaWdodFxyXG5cdFx0ICogcmVsaWVzIG9uIGB2aWV3TWF0cml4YCB3aGljaCBtaWdodCB2YXJ5IHBlciByZW5kZXIgY2FsbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICogQGRlZmF1bHQgJ3JlbmRlcidcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51cGRhdGVUeXBlID0gTm9kZVVwZGF0ZVR5cGUuUkVOREVSO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE92ZXJ3cml0dGVuIHRvIHVwZGF0ZWQgcmVjdCBhcmVhIGxpZ2h0IHNwZWNpZmljIHVuaWZvcm1zLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlRnJhbWV9IGZyYW1lIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgbm9kZSBmcmFtZS5cclxuXHQgKi9cclxuXHR1cGRhdGUoIGZyYW1lICkge1xyXG5cclxuXHRcdHN1cGVyLnVwZGF0ZSggZnJhbWUgKTtcclxuXHJcblx0XHRjb25zdCB7IGxpZ2h0IH0gPSB0aGlzO1xyXG5cclxuXHRcdGNvbnN0IHZpZXdNYXRyaXggPSBmcmFtZS5jYW1lcmEubWF0cml4V29ybGRJbnZlcnNlO1xyXG5cclxuXHRcdF9tYXRyaXg0Mi5pZGVudGl0eSgpO1xyXG5cdFx0X21hdHJpeDQxLmNvcHkoIGxpZ2h0Lm1hdHJpeFdvcmxkICk7XHJcblx0XHRfbWF0cml4NDEucHJlbXVsdGlwbHkoIHZpZXdNYXRyaXggKTtcclxuXHRcdF9tYXRyaXg0Mi5leHRyYWN0Um90YXRpb24oIF9tYXRyaXg0MSApO1xyXG5cclxuXHRcdHRoaXMuaGFsZldpZHRoLnZhbHVlLnNldCggbGlnaHQud2lkdGggKiAwLjUsIDAuMCwgMC4wICk7XHJcblx0XHR0aGlzLmhhbGZIZWlnaHQudmFsdWUuc2V0KCAwLjAsIGxpZ2h0LmhlaWdodCAqIDAuNSwgMC4wICk7XHJcblxyXG5cdFx0dGhpcy5oYWxmV2lkdGgudmFsdWUuYXBwbHlNYXRyaXg0KCBfbWF0cml4NDIgKTtcclxuXHRcdHRoaXMuaGFsZkhlaWdodC52YWx1ZS5hcHBseU1hdHJpeDQoIF9tYXRyaXg0MiApO1xyXG5cclxuXHR9XHJcblxyXG5cdHNldHVwRGlyZWN0UmVjdEFyZWEoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0bGV0IGx0Y18xLCBsdGNfMjtcclxuXHJcblx0XHRpZiAoIGJ1aWxkZXIuaXNBdmFpbGFibGUoICdmbG9hdDMyRmlsdGVyYWJsZScgKSApIHtcclxuXHJcblx0XHRcdGx0Y18xID0gdGV4dHVyZSggX2x0Y0xpYi5MVENfRkxPQVRfMSApO1xyXG5cdFx0XHRsdGNfMiA9IHRleHR1cmUoIF9sdGNMaWIuTFRDX0ZMT0FUXzIgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0bHRjXzEgPSB0ZXh0dXJlKCBfbHRjTGliLkxUQ19IQUxGXzEgKTtcclxuXHRcdFx0bHRjXzIgPSB0ZXh0dXJlKCBfbHRjTGliLkxUQ19IQUxGXzIgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgeyBjb2xvck5vZGUsIGxpZ2h0IH0gPSB0aGlzO1xyXG5cclxuXHRcdGNvbnN0IGxpZ2h0UG9zaXRpb24gPSBsaWdodFZpZXdQb3NpdGlvbiggbGlnaHQgKTtcclxuXHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHRsaWdodENvbG9yOiBjb2xvck5vZGUsXHJcblx0XHRcdGxpZ2h0UG9zaXRpb24sXHJcblx0XHRcdGhhbGZXaWR0aDogdGhpcy5oYWxmV2lkdGgsXHJcblx0XHRcdGhhbGZIZWlnaHQ6IHRoaXMuaGFsZkhlaWdodCxcclxuXHRcdFx0bHRjXzEsXHJcblx0XHRcdGx0Y18yXHJcblx0XHR9O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVzZWQgdG8gY29uZmlndXJlIHRoZSBpbnRlcm5hbCBCUkRGIGFwcHJveGltYXRpb24gdGV4dHVyZSBkYXRhLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSZWN0QXJlYUxpZ2h0VGV4dHVyZXNMaWJ9IGx0YyAtIFRoZSBCUkRGIGFwcHJveGltYXRpb24gdGV4dHVyZSBkYXRhLlxyXG5cdCAqL1xyXG5cdHN0YXRpYyBzZXRMVEMoIGx0YyApIHtcclxuXHJcblx0XHRfbHRjTGliID0gbHRjO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBSZWN0QXJlYUxpZ2h0Tm9kZTtcclxuIiwiaW1wb3J0IEFuYWx5dGljTGlnaHROb2RlIGZyb20gJy4vQW5hbHl0aWNMaWdodE5vZGUuanMnO1xyXG5pbXBvcnQgeyBnZXREaXN0YW5jZUF0dGVudWF0aW9uIH0gZnJvbSAnLi9MaWdodFV0aWxzLmpzJztcclxuaW1wb3J0IHsgdW5pZm9ybSB9IGZyb20gJy4uL2NvcmUvVW5pZm9ybU5vZGUuanMnO1xyXG5pbXBvcnQgeyBzbW9vdGhzdGVwIH0gZnJvbSAnLi4vbWF0aC9NYXRoTm9kZS5qcyc7XHJcbmltcG9ydCB7IHJlbmRlckdyb3VwIH0gZnJvbSAnLi4vY29yZS9Vbmlmb3JtR3JvdXBOb2RlLmpzJztcclxuaW1wb3J0IHsgbGlnaHRUYXJnZXREaXJlY3Rpb24sIGxpZ2h0UHJvamVjdGlvblVWIH0gZnJvbSAnLi4vYWNjZXNzb3JzL0xpZ2h0cy5qcyc7XHJcbmltcG9ydCB7IHRleHR1cmUgfSBmcm9tICcuLi9hY2Nlc3NvcnMvVGV4dHVyZU5vZGUuanMnO1xyXG5cclxuLyoqXHJcbiAqIE1vZHVsZSBmb3IgcmVwcmVzZW50aW5nIHNwb3QgbGlnaHRzIGFzIG5vZGVzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQW5hbHl0aWNMaWdodE5vZGVcclxuICovXHJcbmNsYXNzIFNwb3RMaWdodE5vZGUgZXh0ZW5kcyBBbmFseXRpY0xpZ2h0Tm9kZSB7XHJcblxyXG5cdHN0YXRpYyBnZXQgdHlwZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ1Nwb3RMaWdodE5vZGUnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc3BvdCBsaWdodCBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHs/U3BvdExpZ2h0fSBbbGlnaHQ9bnVsbF0gLSBUaGUgc3BvdCBsaWdodCBzb3VyY2UuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGxpZ2h0ID0gbnVsbCApIHtcclxuXHJcblx0XHRzdXBlciggbGlnaHQgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFVuaWZvcm0gbm9kZSByZXByZXNlbnRpbmcgdGhlIGNvbmUgY29zaW5lLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtVbmlmb3JtTm9kZTxmbG9hdD59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29uZUNvc05vZGUgPSB1bmlmb3JtKCAwICkuc2V0R3JvdXAoIHJlbmRlckdyb3VwICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBVbmlmb3JtIG5vZGUgcmVwcmVzZW50aW5nIHRoZSBwZW51bWJyYSBjb3NpbmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1VuaWZvcm1Ob2RlPGZsb2F0Pn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wZW51bWJyYUNvc05vZGUgPSB1bmlmb3JtKCAwICkuc2V0R3JvdXAoIHJlbmRlckdyb3VwICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBVbmlmb3JtIG5vZGUgcmVwcmVzZW50aW5nIHRoZSBjdXRvZmYgZGlzdGFuY2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1VuaWZvcm1Ob2RlPGZsb2F0Pn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jdXRvZmZEaXN0YW5jZU5vZGUgPSB1bmlmb3JtKCAwICkuc2V0R3JvdXAoIHJlbmRlckdyb3VwICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBVbmlmb3JtIG5vZGUgcmVwcmVzZW50aW5nIHRoZSBkZWNheSBleHBvbmVudC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VW5pZm9ybU5vZGU8ZmxvYXQ+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRlY2F5RXhwb25lbnROb2RlID0gdW5pZm9ybSggMCApLnNldEdyb3VwKCByZW5kZXJHcm91cCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE92ZXJ3cml0dGVuIHRvIHVwZGF0ZWQgc3BvdCBsaWdodCBzcGVjaWZpYyB1bmlmb3Jtcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUZyYW1lfSBmcmFtZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IG5vZGUgZnJhbWUuXHJcblx0ICovXHJcblx0dXBkYXRlKCBmcmFtZSApIHtcclxuXHJcblx0XHRzdXBlci51cGRhdGUoIGZyYW1lICk7XHJcblxyXG5cdFx0Y29uc3QgeyBsaWdodCB9ID0gdGhpcztcclxuXHJcblx0XHR0aGlzLmNvbmVDb3NOb2RlLnZhbHVlID0gTWF0aC5jb3MoIGxpZ2h0LmFuZ2xlICk7XHJcblx0XHR0aGlzLnBlbnVtYnJhQ29zTm9kZS52YWx1ZSA9IE1hdGguY29zKCBsaWdodC5hbmdsZSAqICggMSAtIGxpZ2h0LnBlbnVtYnJhICkgKTtcclxuXHJcblx0XHR0aGlzLmN1dG9mZkRpc3RhbmNlTm9kZS52YWx1ZSA9IGxpZ2h0LmRpc3RhbmNlO1xyXG5cdFx0dGhpcy5kZWNheUV4cG9uZW50Tm9kZS52YWx1ZSA9IGxpZ2h0LmRlY2F5O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSBzcG90IGF0dGVudWF0aW9uIGZvciB0aGUgZ2l2ZW4gYW5nbGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSBhbmdsZUNvc2luZSAtIFRoZSBhbmdsZSB0byBjb21wdXRlIHRoZSBzcG90IGF0dGVudWF0aW9uIGZvci5cclxuXHQgKiBAcmV0dXJuIHtOb2RlPGZsb2F0Pn0gVGhlIHNwb3QgYXR0ZW51YXRpb24uXHJcblx0ICovXHJcblx0Z2V0U3BvdEF0dGVudWF0aW9uKCBhbmdsZUNvc2luZSApIHtcclxuXHJcblx0XHRjb25zdCB7IGNvbmVDb3NOb2RlLCBwZW51bWJyYUNvc05vZGUgfSA9IHRoaXM7XHJcblxyXG5cdFx0cmV0dXJuIHNtb290aHN0ZXAoIGNvbmVDb3NOb2RlLCBwZW51bWJyYUNvc05vZGUsIGFuZ2xlQ29zaW5lICk7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXBEaXJlY3QoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBjb2xvck5vZGUsIGN1dG9mZkRpc3RhbmNlTm9kZSwgZGVjYXlFeHBvbmVudE5vZGUsIGxpZ2h0IH0gPSB0aGlzO1xyXG5cclxuXHRcdGNvbnN0IGxpZ2h0VmVjdG9yID0gdGhpcy5nZXRMaWdodFZlY3RvciggYnVpbGRlciApO1xyXG5cclxuXHRcdGNvbnN0IGxpZ2h0RGlyZWN0aW9uID0gbGlnaHRWZWN0b3Iubm9ybWFsaXplKCk7XHJcblx0XHRjb25zdCBhbmdsZUNvcyA9IGxpZ2h0RGlyZWN0aW9uLmRvdCggbGlnaHRUYXJnZXREaXJlY3Rpb24oIGxpZ2h0ICkgKTtcclxuXHRcdGNvbnN0IHNwb3RBdHRlbnVhdGlvbiA9IHRoaXMuZ2V0U3BvdEF0dGVudWF0aW9uKCBhbmdsZUNvcyApO1xyXG5cclxuXHRcdGNvbnN0IGxpZ2h0RGlzdGFuY2UgPSBsaWdodFZlY3Rvci5sZW5ndGgoKTtcclxuXHJcblx0XHRjb25zdCBsaWdodEF0dGVudWF0aW9uID0gZ2V0RGlzdGFuY2VBdHRlbnVhdGlvbigge1xyXG5cdFx0XHRsaWdodERpc3RhbmNlLFxyXG5cdFx0XHRjdXRvZmZEaXN0YW5jZTogY3V0b2ZmRGlzdGFuY2VOb2RlLFxyXG5cdFx0XHRkZWNheUV4cG9uZW50OiBkZWNheUV4cG9uZW50Tm9kZVxyXG5cdFx0fSApO1xyXG5cclxuXHRcdGxldCBsaWdodENvbG9yID0gY29sb3JOb2RlLm11bCggc3BvdEF0dGVudWF0aW9uICkubXVsKCBsaWdodEF0dGVudWF0aW9uICk7XHJcblxyXG5cdFx0aWYgKCBsaWdodC5tYXAgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBzcG90TGlnaHRDb29yZCA9IGxpZ2h0UHJvamVjdGlvblVWKCBsaWdodCwgYnVpbGRlci5jb250ZXh0LnBvc2l0aW9uV29ybGQgKTtcclxuXHRcdFx0Y29uc3QgcHJvamVjdGVkVGV4dHVyZSA9IHRleHR1cmUoIGxpZ2h0Lm1hcCwgc3BvdExpZ2h0Q29vcmQueHkgKS5vblJlbmRlclVwZGF0ZSggKCkgPT4gbGlnaHQubWFwICk7XHJcblxyXG5cdFx0XHRjb25zdCBpblNwb3RMaWdodE1hcCA9IHNwb3RMaWdodENvb3JkLm11bCggMi4gKS5zdWIoIDEuICkuYWJzKCkubGVzc1RoYW4oIDEuICkuYWxsKCk7XHJcblxyXG5cdFx0XHRsaWdodENvbG9yID0gaW5TcG90TGlnaHRNYXAuc2VsZWN0KCBsaWdodENvbG9yLm11bCggcHJvamVjdGVkVGV4dHVyZSApLCBsaWdodENvbG9yICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB7IGxpZ2h0Q29sb3IsIGxpZ2h0RGlyZWN0aW9uIH07XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFNwb3RMaWdodE5vZGU7XHJcbiIsImltcG9ydCBTcG90TGlnaHROb2RlIGZyb20gJy4vU3BvdExpZ2h0Tm9kZS5qcyc7XHJcbmltcG9ydCB7IHRleHR1cmUgfSBmcm9tICcuLi9hY2Nlc3NvcnMvVGV4dHVyZU5vZGUuanMnO1xyXG5pbXBvcnQgeyB2ZWMyIH0gZnJvbSAnLi4vdHNsL1RTTEJhc2UuanMnO1xyXG5cclxuLyoqXHJcbiAqIEFuIElFUyB2ZXJzaW9uIG9mIHRoZSBkZWZhdWx0IHNwb3QgbGlnaHQgbm9kZS5cclxuICpcclxuICogQGF1Z21lbnRzIFNwb3RMaWdodE5vZGVcclxuICovXHJcbmNsYXNzIElFU1Nwb3RMaWdodE5vZGUgZXh0ZW5kcyBTcG90TGlnaHROb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnSUVTU3BvdExpZ2h0Tm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogT3ZlcndyaXRlcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byBjb21wdXRlIGFuIElFUyBjb25mb3JtIHNwb3QgYXR0ZW51YXRpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGU8ZmxvYXQ+fSBhbmdsZUNvc2luZSAtIFRoZSBhbmdsZSB0byBjb21wdXRlIHRoZSBzcG90IGF0dGVudWF0aW9uIGZvci5cclxuXHQgKiBAcmV0dXJuIHtOb2RlPGZsb2F0Pn0gVGhlIHNwb3QgYXR0ZW51YXRpb24uXHJcblx0ICovXHJcblx0Z2V0U3BvdEF0dGVudWF0aW9uKCBhbmdsZUNvc2luZSApIHtcclxuXHJcblx0XHRjb25zdCBpZXNNYXAgPSB0aGlzLmxpZ2h0Lmllc01hcDtcclxuXHJcblx0XHRsZXQgc3BvdEF0dGVudWF0aW9uID0gbnVsbDtcclxuXHJcblx0XHRpZiAoIGllc01hcCAmJiBpZXNNYXAuaXNUZXh0dXJlID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYW5nbGUgPSBhbmdsZUNvc2luZS5hY29zKCkubXVsKCAxLjAgLyBNYXRoLlBJICk7XHJcblxyXG5cdFx0XHRzcG90QXR0ZW51YXRpb24gPSB0ZXh0dXJlKCBpZXNNYXAsIHZlYzIoIGFuZ2xlLCAwICksIDAgKS5yO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRzcG90QXR0ZW51YXRpb24gPSBzdXBlci5nZXRTcG90QXR0ZW51YXRpb24oIGFuZ2xlQ29zaW5lICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBzcG90QXR0ZW51YXRpb247XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IElFU1Nwb3RMaWdodE5vZGU7XHJcbiIsImltcG9ydCBBbmFseXRpY0xpZ2h0Tm9kZSBmcm9tICcuL0FuYWx5dGljTGlnaHROb2RlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBNb2R1bGUgZm9yIHJlcHJlc2VudGluZyBhbWJpZW50IGxpZ2h0cyBhcyBub2Rlcy5cclxuICpcclxuICogQGF1Z21lbnRzIEFuYWx5dGljTGlnaHROb2RlXHJcbiAqL1xyXG5jbGFzcyBBbWJpZW50TGlnaHROb2RlIGV4dGVuZHMgQW5hbHl0aWNMaWdodE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdBbWJpZW50TGlnaHROb2RlJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGFtYmllbnQgbGlnaHQgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7P0FtYmllbnRMaWdodH0gW2xpZ2h0PW51bGxdIC0gVGhlIGFtYmllbnQgbGlnaHQgc291cmNlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBsaWdodCA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoIGxpZ2h0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXAoIHsgY29udGV4dCB9ICkge1xyXG5cclxuXHRcdGNvbnRleHQuaXJyYWRpYW5jZS5hZGRBc3NpZ24oIHRoaXMuY29sb3JOb2RlICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEFtYmllbnRMaWdodE5vZGU7XHJcbiIsImltcG9ydCBBbmFseXRpY0xpZ2h0Tm9kZSBmcm9tICcuL0FuYWx5dGljTGlnaHROb2RlLmpzJztcclxuaW1wb3J0IHsgdW5pZm9ybSB9IGZyb20gJy4uL2NvcmUvVW5pZm9ybU5vZGUuanMnO1xyXG5pbXBvcnQgeyBtaXggfSBmcm9tICcuLi9tYXRoL01hdGhOb2RlLmpzJztcclxuaW1wb3J0IHsgbm9ybWFsVmlldyB9IGZyb20gJy4uL2FjY2Vzc29ycy9Ob3JtYWwuanMnO1xyXG5pbXBvcnQgeyBsaWdodFBvc2l0aW9uIH0gZnJvbSAnLi4vYWNjZXNzb3JzL0xpZ2h0cy5qcyc7XHJcbmltcG9ydCB7IHJlbmRlckdyb3VwIH0gZnJvbSAnLi4vY29yZS9Vbmlmb3JtR3JvdXBOb2RlLmpzJztcclxuXHJcbmltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vLi4vbWF0aC9Db2xvci5qcyc7XHJcblxyXG4vKipcclxuICogTW9kdWxlIGZvciByZXByZXNlbnRpbmcgaGVtaXNwaGVyZSBsaWdodHMgYXMgbm9kZXMuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBBbmFseXRpY0xpZ2h0Tm9kZVxyXG4gKi9cclxuY2xhc3MgSGVtaXNwaGVyZUxpZ2h0Tm9kZSBleHRlbmRzIEFuYWx5dGljTGlnaHROb2RlIHtcclxuXHJcblx0c3RhdGljIGdldCB0eXBlKCkge1xyXG5cclxuXHRcdHJldHVybiAnSGVtaXNwaGVyZUxpZ2h0Tm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBoZW1pc3BoZXJlIGxpZ2h0IG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gez9IZW1pc3BoZXJlTGlnaHR9IFtsaWdodD1udWxsXSAtIFRoZSBoZW1pc3BoZXJlIGxpZ2h0IHNvdXJjZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbGlnaHQgPSBudWxsICkge1xyXG5cclxuXHRcdHN1cGVyKCBsaWdodCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVW5pZm9ybSBub2RlIHJlcHJlc2VudGluZyB0aGUgbGlnaHQncyBwb3NpdGlvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VW5pZm9ybU5vZGU8dmVjMz59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGlnaHRQb3NpdGlvbk5vZGUgPSBsaWdodFBvc2l0aW9uKCBsaWdodCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBub2RlIHJlcHJlc2VudGluZyB0aGUgbGlnaHQncyBkaXJlY3Rpb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge05vZGU8dmVjMz59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGlnaHREaXJlY3Rpb25Ob2RlID0gdGhpcy5saWdodFBvc2l0aW9uTm9kZS5ub3JtYWxpemUoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFVuaWZvcm0gbm9kZSByZXByZXNlbnRpbmcgdGhlIGxpZ2h0J3MgZ3JvdW5kIGNvbG9yLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtVbmlmb3JtTm9kZTx2ZWMzPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ncm91bmRDb2xvck5vZGUgPSB1bmlmb3JtKCBuZXcgQ29sb3IoKSApLnNldEdyb3VwKCByZW5kZXJHcm91cCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE92ZXJ3cml0dGVuIHRvIHVwZGF0ZWQgaGVtaXNwaGVyZSBsaWdodCBzcGVjaWZpYyB1bmlmb3Jtcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZUZyYW1lfSBmcmFtZSAtIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IG5vZGUgZnJhbWUuXHJcblx0ICovXHJcblx0dXBkYXRlKCBmcmFtZSApIHtcclxuXHJcblx0XHRjb25zdCB7IGxpZ2h0IH0gPSB0aGlzO1xyXG5cclxuXHRcdHN1cGVyLnVwZGF0ZSggZnJhbWUgKTtcclxuXHJcblx0XHR0aGlzLmxpZ2h0UG9zaXRpb25Ob2RlLm9iamVjdDNkID0gbGlnaHQ7XHJcblxyXG5cdFx0dGhpcy5ncm91bmRDb2xvck5vZGUudmFsdWUuY29weSggbGlnaHQuZ3JvdW5kQ29sb3IgKS5tdWx0aXBseVNjYWxhciggbGlnaHQuaW50ZW5zaXR5ICk7XHJcblxyXG5cdH1cclxuXHJcblx0c2V0dXAoIGJ1aWxkZXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBjb2xvck5vZGUsIGdyb3VuZENvbG9yTm9kZSwgbGlnaHREaXJlY3Rpb25Ob2RlIH0gPSB0aGlzO1xyXG5cclxuXHRcdGNvbnN0IGRvdE5MID0gbm9ybWFsVmlldy5kb3QoIGxpZ2h0RGlyZWN0aW9uTm9kZSApO1xyXG5cdFx0Y29uc3QgaGVtaURpZmZ1c2VXZWlnaHQgPSBkb3ROTC5tdWwoIDAuNSApLmFkZCggMC41ICk7XHJcblxyXG5cdFx0Y29uc3QgaXJyYWRpYW5jZSA9IG1peCggZ3JvdW5kQ29sb3JOb2RlLCBjb2xvck5vZGUsIGhlbWlEaWZmdXNlV2VpZ2h0ICk7XHJcblxyXG5cdFx0YnVpbGRlci5jb250ZXh0LmlycmFkaWFuY2UuYWRkQXNzaWduKCBpcnJhZGlhbmNlICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEhlbWlzcGhlcmVMaWdodE5vZGU7XHJcbiIsImltcG9ydCBBbmFseXRpY0xpZ2h0Tm9kZSBmcm9tICcuL0FuYWx5dGljTGlnaHROb2RlLmpzJztcclxuaW1wb3J0IHsgbm9ybWFsV29ybGQgfSBmcm9tICcuLi9hY2Nlc3NvcnMvTm9ybWFsLmpzJztcclxuaW1wb3J0IHsgdW5pZm9ybUFycmF5IH0gZnJvbSAnLi4vYWNjZXNzb3JzL1VuaWZvcm1BcnJheU5vZGUuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3IzLmpzJztcclxuaW1wb3J0IGdldFNoSXJyYWRpYW5jZUF0IGZyb20gJy4uL2Z1bmN0aW9ucy9tYXRlcmlhbC9nZXRTaElycmFkaWFuY2VBdC5qcyc7XHJcblxyXG4vKipcclxuICogTW9kdWxlIGZvciByZXByZXNlbnRpbmcgbGlnaHQgcHJvYmVzIGFzIG5vZGVzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgQW5hbHl0aWNMaWdodE5vZGVcclxuICovXHJcbmNsYXNzIExpZ2h0UHJvYmVOb2RlIGV4dGVuZHMgQW5hbHl0aWNMaWdodE5vZGUge1xyXG5cclxuXHRzdGF0aWMgZ2V0IHR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdMaWdodFByb2JlTm9kZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBsaWdodCBwcm9iZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHs/TGlnaHRQcm9iZX0gW2xpZ2h0PW51bGxdIC0gVGhlIGxpZ2h0IHByb2JlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBsaWdodCA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoIGxpZ2h0ICk7XHJcblxyXG5cdFx0Y29uc3QgYXJyYXkgPSBbXTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCA5OyBpICsrICkgYXJyYXkucHVzaCggbmV3IFZlY3RvcjMoKSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogTGlnaHQgcHJvYmUgcmVwcmVzZW50ZWQgYXMgYSB1bmlmb3JtIG9mIHNwaGVyaWNhbCBoYXJtb25pY3MuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1VuaWZvcm1BcnJheU5vZGV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGlnaHRQcm9iZSA9IHVuaWZvcm1BcnJheSggYXJyYXkgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBPdmVyd3JpdHRlbiB0byB1cGRhdGVkIGxpZ2h0IHByb2JlIHNwZWNpZmljIHVuaWZvcm1zLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlRnJhbWV9IGZyYW1lIC0gQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgbm9kZSBmcmFtZS5cclxuXHQgKi9cclxuXHR1cGRhdGUoIGZyYW1lICkge1xyXG5cclxuXHRcdGNvbnN0IHsgbGlnaHQgfSA9IHRoaXM7XHJcblxyXG5cdFx0c3VwZXIudXBkYXRlKCBmcmFtZSApO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgOTsgaSArKyApIHtcclxuXHJcblx0XHRcdHRoaXMubGlnaHRQcm9iZS5hcnJheVsgaSBdLmNvcHkoIGxpZ2h0LnNoLmNvZWZmaWNpZW50c1sgaSBdICkubXVsdGlwbHlTY2FsYXIoIGxpZ2h0LmludGVuc2l0eSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRzZXR1cCggYnVpbGRlciApIHtcclxuXHJcblx0XHRjb25zdCBpcnJhZGlhbmNlID0gZ2V0U2hJcnJhZGlhbmNlQXQoIG5vcm1hbFdvcmxkLCB0aGlzLmxpZ2h0UHJvYmUgKTtcclxuXHJcblx0XHRidWlsZGVyLmNvbnRleHQuaXJyYWRpYW5jZS5hZGRBc3NpZ24oIGlycmFkaWFuY2UgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTGlnaHRQcm9iZU5vZGU7XHJcbiIsIi8qKlxyXG4gKiBCYXNlIGNsYXNzIGZvciBub2RlIHBhcnNlcnMuIEEgZGVyaXZlZCBwYXJzZXIgbXVzdCBiZSBpbXBsZW1lbnRlZFxyXG4gKiBmb3IgZWFjaCBzdXBwb3J0ZWQgbmF0aXZlIHNoYWRlciBsYW5ndWFnZS5cclxuICovXHJcbmNsYXNzIE5vZGVQYXJzZXIge1xyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgbWV0aG9kIHBhcnNlcyB0aGUgZ2l2ZW4gbmF0aXZlIGNvZGUgYW4gcmV0dXJucyBhIG5vZGUgZnVuY3Rpb24uXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gVGhlIG5hdGl2ZSBzaGFkZXIgY29kZS5cclxuXHQgKiBAcmV0dXJuIHtOb2RlRnVuY3Rpb259IEEgbm9kZSBmdW5jdGlvbi5cclxuXHQgKi9cclxuXHRwYXJzZUZ1bmN0aW9uKCAvKnNvdXJjZSovICkge1xyXG5cclxuXHRcdGNvbnNvbGUud2FybiggJ0Fic3RyYWN0IGZ1bmN0aW9uLicgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTm9kZVBhcnNlcjtcclxuIiwiLyoqXHJcbiAqIEJhc2UgY2xhc3MgZm9yIG5vZGUgZnVuY3Rpb25zLiBBIGRlcml2ZWQgbW9kdWxlIG11c3QgYmUgaW1wbGVtZW50ZWRcclxuICogZm9yIGVhY2ggc3VwcG9ydGVkIG5hdGl2ZSBzaGFkZXIgbGFuZ3VhZ2UuIFNpbWlsYXIgdG8gb3RoZXIgYE5vZGUqYCBtb2R1bGVzLFxyXG4gKiB0aGlzIGNsYXNzIGlzIG9ubHkgcmVsZXZhbnQgZHVyaW5nIHRoZSBidWlsZGluZyBwcm9jZXNzIGFuZCBub3QgdXNlZFxyXG4gKiBpbiB1c2VyLWxldmVsIGNvZGUuXHJcbiAqL1xyXG5jbGFzcyBOb2RlRnVuY3Rpb24ge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG5vZGUgZnVuY3Rpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSBub2RlIHR5cGUuIFRoaXMgdHlwZSBpcyB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIG5vZGUgZnVuY3Rpb24uXHJcblx0ICogQHBhcmFtIHtBcnJheTxOb2RlRnVuY3Rpb25JbnB1dD59IGlucHV0cyAtIFRoZSBmdW5jdGlvbidzIGlucHV0cy5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW25hbWU9JyddIC0gVGhlIGZ1bmN0aW9uJ3MgbmFtZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW3ByZWNpc2lvbj0nJ10gLSBUaGUgcHJlY2lzaW9uIHF1YWxpZmllci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggdHlwZSwgaW5wdXRzLCBuYW1lID0gJycsIHByZWNpc2lvbiA9ICcnICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG5vZGUgdHlwZS4gVGhpcyB0eXBlIGlzIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgbm9kZSBmdW5jdGlvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnR5cGUgPSB0eXBlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGZ1bmN0aW9uJ3MgaW5wdXRzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxOb2RlRnVuY3Rpb25JbnB1dD59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaW5wdXRzID0gaW5wdXRzO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG5hbWUgb2YgdGhlIHVuaWZvcm0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqIEBkZWZhdWx0ICcnXHJcblx0XHQgKi9cclxuXHRcdHRoaXMubmFtZSA9IG5hbWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcHJlY2lzaW9uIHF1YWxpZmllci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICogQGRlZmF1bHQgJydcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wcmVjaXNpb24gPSBwcmVjaXNpb247XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbmF0aXZlIGNvZGUgb2YgdGhlIG5vZGUgZnVuY3Rpb24uXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBmdW5jdGlvbidzIG5hbWUuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBBIHNoYWRlciBjb2RlLlxyXG5cdCAqL1xyXG5cdGdldENvZGUoIC8qbmFtZSA9IHRoaXMubmFtZSovICkge1xyXG5cclxuXHRcdGNvbnNvbGUud2FybiggJ0Fic3RyYWN0IGZ1bmN0aW9uLicgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuTm9kZUZ1bmN0aW9uLmlzTm9kZUZ1bmN0aW9uID0gdHJ1ZTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IE5vZGVGdW5jdGlvbjtcclxuIiwiaW1wb3J0IE5vZGVGdW5jdGlvbiBmcm9tICcuLi9jb3JlL05vZGVGdW5jdGlvbi5qcyc7XHJcbmltcG9ydCBOb2RlRnVuY3Rpb25JbnB1dCBmcm9tICcuLi9jb3JlL05vZGVGdW5jdGlvbklucHV0LmpzJztcclxuXHJcbmNvbnN0IGRlY2xhcmF0aW9uUmVnZXhwID0gL15cXHMqKGhpZ2hwfG1lZGl1bXB8bG93cCk/XFxzKihbYS16XzAtOV0rKVxccyooW2Etel8wLTldKyk/XFxzKlxcKChbXFxzXFxTXSo/KVxcKS9pO1xyXG5jb25zdCBwcm9wZXJ0aWVzUmVnZXhwID0gL1thLXpfMC05XSsvaWc7XHJcblxyXG5jb25zdCBwcmFnbWFNYWluID0gJyNwcmFnbWEgbWFpbic7XHJcblxyXG5jb25zdCBwYXJzZSA9ICggc291cmNlICkgPT4ge1xyXG5cclxuXHRzb3VyY2UgPSBzb3VyY2UudHJpbSgpO1xyXG5cclxuXHRjb25zdCBwcmFnbWFNYWluSW5kZXggPSBzb3VyY2UuaW5kZXhPZiggcHJhZ21hTWFpbiApO1xyXG5cclxuXHRjb25zdCBtYWluQ29kZSA9IHByYWdtYU1haW5JbmRleCAhPT0gLSAxID8gc291cmNlLnNsaWNlKCBwcmFnbWFNYWluSW5kZXggKyBwcmFnbWFNYWluLmxlbmd0aCApIDogc291cmNlO1xyXG5cclxuXHRjb25zdCBkZWNsYXJhdGlvbiA9IG1haW5Db2RlLm1hdGNoKCBkZWNsYXJhdGlvblJlZ2V4cCApO1xyXG5cclxuXHRpZiAoIGRlY2xhcmF0aW9uICE9PSBudWxsICYmIGRlY2xhcmF0aW9uLmxlbmd0aCA9PT0gNSApIHtcclxuXHJcblx0XHQvLyB0b2tlbml6ZXJcclxuXHJcblx0XHRjb25zdCBpbnB1dHNDb2RlID0gZGVjbGFyYXRpb25bIDQgXTtcclxuXHRcdGNvbnN0IHByb3BzTWF0Y2hlcyA9IFtdO1xyXG5cclxuXHRcdGxldCBuYW1lTWF0Y2ggPSBudWxsO1xyXG5cclxuXHRcdHdoaWxlICggKCBuYW1lTWF0Y2ggPSBwcm9wZXJ0aWVzUmVnZXhwLmV4ZWMoIGlucHV0c0NvZGUgKSApICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0cHJvcHNNYXRjaGVzLnB1c2goIG5hbWVNYXRjaCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBwYXJzZXJcclxuXHJcblx0XHRjb25zdCBpbnB1dHMgPSBbXTtcclxuXHJcblx0XHRsZXQgaSA9IDA7XHJcblxyXG5cdFx0d2hpbGUgKCBpIDwgcHJvcHNNYXRjaGVzLmxlbmd0aCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGlzQ29uc3QgPSBwcm9wc01hdGNoZXNbIGkgXVsgMCBdID09PSAnY29uc3QnO1xyXG5cclxuXHRcdFx0aWYgKCBpc0NvbnN0ID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRpICsrO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0bGV0IHF1YWxpZmllciA9IHByb3BzTWF0Y2hlc1sgaSBdWyAwIF07XHJcblxyXG5cdFx0XHRpZiAoIHF1YWxpZmllciA9PT0gJ2luJyB8fCBxdWFsaWZpZXIgPT09ICdvdXQnIHx8IHF1YWxpZmllciA9PT0gJ2lub3V0JyApIHtcclxuXHJcblx0XHRcdFx0aSArKztcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHF1YWxpZmllciA9ICcnO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgdHlwZSA9IHByb3BzTWF0Y2hlc1sgaSArKyBdWyAwIF07XHJcblxyXG5cdFx0XHRsZXQgY291bnQgPSBOdW1iZXIucGFyc2VJbnQoIHByb3BzTWF0Y2hlc1sgaSBdWyAwIF0gKTtcclxuXHJcblx0XHRcdGlmICggTnVtYmVyLmlzTmFOKCBjb3VudCApID09PSBmYWxzZSApIGkgKys7XHJcblx0XHRcdGVsc2UgY291bnQgPSBudWxsO1xyXG5cclxuXHRcdFx0Y29uc3QgbmFtZSA9IHByb3BzTWF0Y2hlc1sgaSArKyBdWyAwIF07XHJcblxyXG5cdFx0XHRpbnB1dHMucHVzaCggbmV3IE5vZGVGdW5jdGlvbklucHV0KCB0eXBlLCBuYW1lLCBjb3VudCwgcXVhbGlmaWVyLCBpc0NvbnN0ICkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCBibG9ja0NvZGUgPSBtYWluQ29kZS5zdWJzdHJpbmcoIGRlY2xhcmF0aW9uWyAwIF0ubGVuZ3RoICk7XHJcblxyXG5cdFx0Y29uc3QgbmFtZSA9IGRlY2xhcmF0aW9uWyAzIF0gIT09IHVuZGVmaW5lZCA/IGRlY2xhcmF0aW9uWyAzIF0gOiAnJztcclxuXHRcdGNvbnN0IHR5cGUgPSBkZWNsYXJhdGlvblsgMiBdO1xyXG5cclxuXHRcdGNvbnN0IHByZWNpc2lvbiA9IGRlY2xhcmF0aW9uWyAxIF0gIT09IHVuZGVmaW5lZCA/IGRlY2xhcmF0aW9uWyAxIF0gOiAnJztcclxuXHJcblx0XHRjb25zdCBoZWFkZXJDb2RlID0gcHJhZ21hTWFpbkluZGV4ICE9PSAtIDEgPyBzb3VyY2Uuc2xpY2UoIDAsIHByYWdtYU1haW5JbmRleCApIDogJyc7XHJcblxyXG5cdFx0cmV0dXJuIHtcclxuXHRcdFx0dHlwZSxcclxuXHRcdFx0aW5wdXRzLFxyXG5cdFx0XHRuYW1lLFxyXG5cdFx0XHRwcmVjaXNpb24sXHJcblx0XHRcdGlucHV0c0NvZGUsXHJcblx0XHRcdGJsb2NrQ29kZSxcclxuXHRcdFx0aGVhZGVyQ29kZVxyXG5cdFx0fTtcclxuXHJcblx0fSBlbHNlIHtcclxuXHJcblx0XHR0aHJvdyBuZXcgRXJyb3IoICdGdW5jdGlvbk5vZGU6IEZ1bmN0aW9uIGlzIG5vdCBhIEdMU0wgY29kZS4nICk7XHJcblxyXG5cdH1cclxuXHJcbn07XHJcblxyXG4vKipcclxuICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgR0xTTCBub2RlIGZ1bmN0aW9uLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTm9kZUZ1bmN0aW9uXHJcbiAqL1xyXG5jbGFzcyBHTFNMTm9kZUZ1bmN0aW9uIGV4dGVuZHMgTm9kZUZ1bmN0aW9uIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBHTFNMIG5vZGUgZnVuY3Rpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gVGhlIEdMU0wgc291cmNlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyB0eXBlLCBpbnB1dHMsIG5hbWUsIHByZWNpc2lvbiwgaW5wdXRzQ29kZSwgYmxvY2tDb2RlLCBoZWFkZXJDb2RlIH0gPSBwYXJzZSggc291cmNlICk7XHJcblxyXG5cdFx0c3VwZXIoIHR5cGUsIGlucHV0cywgbmFtZSwgcHJlY2lzaW9uICk7XHJcblxyXG5cdFx0dGhpcy5pbnB1dHNDb2RlID0gaW5wdXRzQ29kZTtcclxuXHRcdHRoaXMuYmxvY2tDb2RlID0gYmxvY2tDb2RlO1xyXG5cdFx0dGhpcy5oZWFkZXJDb2RlID0gaGVhZGVyQ29kZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBHTFNMIGNvZGUgb2YgdGhlIG5vZGUgZnVuY3Rpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW25hbWU9dGhpcy5uYW1lXSAtIFRoZSBmdW5jdGlvbidzIG5hbWUuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgc2hhZGVyIGNvZGUuXHJcblx0ICovXHJcblx0Z2V0Q29kZSggbmFtZSA9IHRoaXMubmFtZSApIHtcclxuXHJcblx0XHRsZXQgY29kZTtcclxuXHJcblx0XHRjb25zdCBibG9ja0NvZGUgPSB0aGlzLmJsb2NrQ29kZTtcclxuXHJcblx0XHRpZiAoIGJsb2NrQ29kZSAhPT0gJycgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB7IHR5cGUsIGlucHV0c0NvZGUsIGhlYWRlckNvZGUsIHByZWNpc2lvbiB9ID0gdGhpcztcclxuXHJcblx0XHRcdGxldCBkZWNsYXJhdGlvbkNvZGUgPSBgJHsgdHlwZSB9ICR7IG5hbWUgfSAoICR7IGlucHV0c0NvZGUudHJpbSgpIH0gKWA7XHJcblxyXG5cdFx0XHRpZiAoIHByZWNpc2lvbiAhPT0gJycgKSB7XHJcblxyXG5cdFx0XHRcdGRlY2xhcmF0aW9uQ29kZSA9IGAkeyBwcmVjaXNpb24gfSAkeyBkZWNsYXJhdGlvbkNvZGUgfWA7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb2RlID0gaGVhZGVyQ29kZSArIGRlY2xhcmF0aW9uQ29kZSArIGJsb2NrQ29kZTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Ly8gaW50ZXJmYWNlIGZ1bmN0aW9uXHJcblxyXG5cdFx0XHRjb2RlID0gJyc7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBjb2RlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBHTFNMTm9kZUZ1bmN0aW9uO1xyXG4iLCJpbXBvcnQgTm9kZVBhcnNlciBmcm9tICcuLi9jb3JlL05vZGVQYXJzZXIuanMnO1xyXG5pbXBvcnQgR0xTTE5vZGVGdW5jdGlvbiBmcm9tICcuL0dMU0xOb2RlRnVuY3Rpb24uanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgR0xTTCBub2RlIHBhcnNlci5cclxuICpcclxuICogQGF1Z21lbnRzIE5vZGVQYXJzZXJcclxuICovXHJcbmNsYXNzIEdMU0xOb2RlUGFyc2VyIGV4dGVuZHMgTm9kZVBhcnNlciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBtZXRob2QgcGFyc2VzIHRoZSBnaXZlbiBHTFNMIGNvZGUgYW4gcmV0dXJucyBhIG5vZGUgZnVuY3Rpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gVGhlIEdMU0wgY29kZS5cclxuXHQgKiBAcmV0dXJuIHtHTFNMTm9kZUZ1bmN0aW9ufSBBIG5vZGUgZnVuY3Rpb24uXHJcblx0ICovXHJcblx0cGFyc2VGdW5jdGlvbiggc291cmNlICkge1xyXG5cclxuXHRcdHJldHVybiBuZXcgR0xTTE5vZGVGdW5jdGlvbiggc291cmNlICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEdMU0xOb2RlUGFyc2VyO1xyXG4iLCJpbXBvcnQgRGF0YU1hcCBmcm9tICcuLi9EYXRhTWFwLmpzJztcclxuaW1wb3J0IENoYWluTWFwIGZyb20gJy4uL0NoYWluTWFwLmpzJztcclxuaW1wb3J0IE5vZGVCdWlsZGVyU3RhdGUgZnJvbSAnLi9Ob2RlQnVpbGRlclN0YXRlLmpzJztcclxuaW1wb3J0IHsgY3ViZU1hcE5vZGUgfSBmcm9tICcuLi8uLi8uLi9ub2Rlcy91dGlscy9DdWJlTWFwTm9kZS5qcyc7XHJcbmltcG9ydCB7IE5vZGVGcmFtZSB9IGZyb20gJy4uLy4uLy4uL25vZGVzL05vZGVzLmpzJztcclxuaW1wb3J0IHsgb2JqZWN0R3JvdXAsIHJlbmRlckdyb3VwLCBmcmFtZUdyb3VwLCBjdWJlVGV4dHVyZSwgdGV4dHVyZSwgZm9nLCByYW5nZUZvZ0ZhY3RvciwgZGVuc2l0eUZvZ0ZhY3RvciwgcmVmZXJlbmNlLCBwbXJlbVRleHR1cmUsIHNjcmVlblVWIH0gZnJvbSAnLi4vLi4vLi4vbm9kZXMvVFNMLmpzJztcclxuXHJcbmltcG9ydCB7IEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nLCBFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZywgRXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmcgfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBoYXNoQXJyYXkgfSBmcm9tICcuLi8uLi8uLi9ub2Rlcy9jb3JlL05vZGVVdGlscy5qcyc7XHJcblxyXG5jb25zdCBfb3V0cHV0Tm9kZU1hcCA9IG5ldyBXZWFrTWFwKCk7XHJcbmNvbnN0IF9jaGFpbktleXMgPSBbXTtcclxuY29uc3QgX2NhY2hlS2V5VmFsdWVzID0gW107XHJcblxyXG4vKipcclxuICogVGhpcyByZW5kZXJlciBtb2R1bGUgbWFuYWdlcyBub2RlLXJlbGF0ZWQgb2JqZWN0cyBhbmQgaXMgdGhlXHJcbiAqIHByaW1hcnkgaW50ZXJmYWNlIGJldHdlZW4gdGhlIHJlbmRlcmVyIGFuZCB0aGUgbm9kZSBzeXN0ZW0uXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBhdWdtZW50cyBEYXRhTWFwXHJcbiAqL1xyXG5jbGFzcyBOb2RlcyBleHRlbmRzIERhdGFNYXAge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG5vZGVzIG1hbmFnZW1lbnQgY29tcG9uZW50LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcblx0ICogQHBhcmFtIHtCYWNrZW5kfSBiYWNrZW5kIC0gVGhlIHJlbmRlcmVyJ3MgYmFja2VuZC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcmVuZGVyZXIsIGJhY2tlbmQgKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByZW5kZXJlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7UmVuZGVyZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByZW5kZXJlcidzIGJhY2tlbmQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0JhY2tlbmR9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYmFja2VuZCA9IGJhY2tlbmQ7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbm9kZSBmcmFtZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7UmVuZGVyZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9kZUZyYW1lID0gbmV3IE5vZGVGcmFtZSgpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBjYWNoZSBmb3IgbWFuYWdpbmcgbm9kZSBidWlsZGVyIHN0YXRlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7TWFwPG51bWJlcixOb2RlQnVpbGRlclN0YXRlPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub2RlQnVpbGRlckNhY2hlID0gbmV3IE1hcCgpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBjYWNoZSBmb3IgbWFuYWdpbmcgZGF0YSBjYWNoZSBrZXkgZGF0YS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Q2hhaW5NYXB9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2FsbEhhc2hDYWNoZSA9IG5ldyBDaGFpbk1hcCgpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBjYWNoZSBmb3IgbWFuYWdpbmcgbm9kZSB1bmlmb3JtcyBncm91cCBkYXRhLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtDaGFpbk1hcH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ncm91cHNEYXRhID0gbmV3IENoYWluTWFwKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGNhY2hlIGZvciBtYW5hZ2luZyBub2RlIG9iamVjdHMgb2ZcclxuXHRcdCAqIHNjZW5lIHByb3BlcnRpZXMgbGlrZSBmb2cgb3IgZW52aXJvbm1lbnRzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLFdlYWtNYXA+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNhY2hlTGliID0ge307XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIG5vZGUgdW5pZm9ybXMgZ3JvdXAgbXVzdCBiZSB1cGRhdGVkIG9yIG5vdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZVVuaWZvcm1zR3JvdXB9IG5vZGVVbmlmb3Jtc0dyb3VwIC0gVGhlIG5vZGUgdW5pZm9ybXMgZ3JvdXAuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgbm9kZSB1bmlmb3JtcyBncm91cCByZXF1aXJlcyBhbiB1cGRhdGUgb3Igbm90LlxyXG5cdCAqL1xyXG5cdHVwZGF0ZUdyb3VwKCBub2RlVW5pZm9ybXNHcm91cCApIHtcclxuXHJcblx0XHRjb25zdCBncm91cE5vZGUgPSBub2RlVW5pZm9ybXNHcm91cC5ncm91cE5vZGU7XHJcblx0XHRjb25zdCBuYW1lID0gZ3JvdXBOb2RlLm5hbWU7XHJcblxyXG5cdFx0Ly8gb2JqZWN0R3JvdXAgaXMgYWx3YXlzIHVwZGF0ZWRcclxuXHJcblx0XHRpZiAoIG5hbWUgPT09IG9iamVjdEdyb3VwLm5hbWUgKSByZXR1cm4gdHJ1ZTtcclxuXHJcblx0XHQvLyByZW5kZXJHcm91cCBpcyB1cGRhdGVkIG9uY2UgcGVyIHJlbmRlci9jb21wdXRlIGNhbGxcclxuXHJcblx0XHRpZiAoIG5hbWUgPT09IHJlbmRlckdyb3VwLm5hbWUgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB1bmlmb3Jtc0dyb3VwRGF0YSA9IHRoaXMuZ2V0KCBub2RlVW5pZm9ybXNHcm91cCApO1xyXG5cdFx0XHRjb25zdCByZW5kZXJJZCA9IHRoaXMubm9kZUZyYW1lLnJlbmRlcklkO1xyXG5cclxuXHRcdFx0aWYgKCB1bmlmb3Jtc0dyb3VwRGF0YS5yZW5kZXJJZCAhPT0gcmVuZGVySWQgKSB7XHJcblxyXG5cdFx0XHRcdHVuaWZvcm1zR3JvdXBEYXRhLnJlbmRlcklkID0gcmVuZGVySWQ7XHJcblxyXG5cdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBmcmFtZUdyb3VwIGlzIHVwZGF0ZWQgb25jZSBwZXIgZnJhbWVcclxuXHJcblx0XHRpZiAoIG5hbWUgPT09IGZyYW1lR3JvdXAubmFtZSApIHtcclxuXHJcblx0XHRcdGNvbnN0IHVuaWZvcm1zR3JvdXBEYXRhID0gdGhpcy5nZXQoIG5vZGVVbmlmb3Jtc0dyb3VwICk7XHJcblx0XHRcdGNvbnN0IGZyYW1lSWQgPSB0aGlzLm5vZGVGcmFtZS5mcmFtZUlkO1xyXG5cclxuXHRcdFx0aWYgKCB1bmlmb3Jtc0dyb3VwRGF0YS5mcmFtZUlkICE9PSBmcmFtZUlkICkge1xyXG5cclxuXHRcdFx0XHR1bmlmb3Jtc0dyb3VwRGF0YS5mcmFtZUlkID0gZnJhbWVJZDtcclxuXHJcblx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIG90aGVyIGdyb3VwcyBhcmUgdXBkYXRlZCBqdXN0IHdoZW4gZ3JvdXBOb2RlLm5lZWRzVXBkYXRlIGlzIHRydWVcclxuXHJcblx0XHRfY2hhaW5LZXlzWyAwIF0gPSBncm91cE5vZGU7XHJcblx0XHRfY2hhaW5LZXlzWyAxIF0gPSBub2RlVW5pZm9ybXNHcm91cDtcclxuXHJcblx0XHRsZXQgZ3JvdXBEYXRhID0gdGhpcy5ncm91cHNEYXRhLmdldCggX2NoYWluS2V5cyApO1xyXG5cdFx0aWYgKCBncm91cERhdGEgPT09IHVuZGVmaW5lZCApIHRoaXMuZ3JvdXBzRGF0YS5zZXQoIF9jaGFpbktleXMsIGdyb3VwRGF0YSA9IHt9ICk7XHJcblxyXG5cdFx0X2NoYWluS2V5cy5sZW5ndGggPSAwO1xyXG5cclxuXHRcdGlmICggZ3JvdXBEYXRhLnZlcnNpb24gIT09IGdyb3VwTm9kZS52ZXJzaW9uICkge1xyXG5cclxuXHRcdFx0Z3JvdXBEYXRhLnZlcnNpb24gPSBncm91cE5vZGUudmVyc2lvbjtcclxuXHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZmFsc2U7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgY2FjaGUga2V5IGZvciB0aGUgZ2l2ZW4gcmVuZGVyIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyT2JqZWN0fSByZW5kZXJPYmplY3QgLSBUaGUgcmVuZGVyIG9iamVjdC5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBjYWNoZSBrZXkuXHJcblx0ICovXHJcblx0Z2V0Rm9yUmVuZGVyQ2FjaGVLZXkoIHJlbmRlck9iamVjdCApIHtcclxuXHJcblx0XHRyZXR1cm4gcmVuZGVyT2JqZWN0LmluaXRpYWxDYWNoZUtleTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbm9kZSBidWlsZGVyIHN0YXRlIGZvciB0aGUgZ2l2ZW4gcmVuZGVyIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyT2JqZWN0fSByZW5kZXJPYmplY3QgLSBUaGUgcmVuZGVyIG9iamVjdC5cclxuXHQgKiBAcmV0dXJuIHtOb2RlQnVpbGRlclN0YXRlfSBUaGUgbm9kZSBidWlsZGVyIHN0YXRlLlxyXG5cdCAqL1xyXG5cdGdldEZvclJlbmRlciggcmVuZGVyT2JqZWN0ICkge1xyXG5cclxuXHRcdGNvbnN0IHJlbmRlck9iamVjdERhdGEgPSB0aGlzLmdldCggcmVuZGVyT2JqZWN0ICk7XHJcblxyXG5cdFx0bGV0IG5vZGVCdWlsZGVyU3RhdGUgPSByZW5kZXJPYmplY3REYXRhLm5vZGVCdWlsZGVyU3RhdGU7XHJcblxyXG5cdFx0aWYgKCBub2RlQnVpbGRlclN0YXRlID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB7IG5vZGVCdWlsZGVyQ2FjaGUgfSA9IHRoaXM7XHJcblxyXG5cdFx0XHRjb25zdCBjYWNoZUtleSA9IHRoaXMuZ2V0Rm9yUmVuZGVyQ2FjaGVLZXkoIHJlbmRlck9iamVjdCApO1xyXG5cclxuXHRcdFx0bm9kZUJ1aWxkZXJTdGF0ZSA9IG5vZGVCdWlsZGVyQ2FjaGUuZ2V0KCBjYWNoZUtleSApO1xyXG5cclxuXHRcdFx0aWYgKCBub2RlQnVpbGRlclN0YXRlID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IG5vZGVCdWlsZGVyID0gdGhpcy5iYWNrZW5kLmNyZWF0ZU5vZGVCdWlsZGVyKCByZW5kZXJPYmplY3Qub2JqZWN0LCB0aGlzLnJlbmRlcmVyICk7XHJcblx0XHRcdFx0bm9kZUJ1aWxkZXIuc2NlbmUgPSByZW5kZXJPYmplY3Quc2NlbmU7XHJcblx0XHRcdFx0bm9kZUJ1aWxkZXIubWF0ZXJpYWwgPSByZW5kZXJPYmplY3QubWF0ZXJpYWw7XHJcblx0XHRcdFx0bm9kZUJ1aWxkZXIuY2FtZXJhID0gcmVuZGVyT2JqZWN0LmNhbWVyYTtcclxuXHRcdFx0XHRub2RlQnVpbGRlci5jb250ZXh0Lm1hdGVyaWFsID0gcmVuZGVyT2JqZWN0Lm1hdGVyaWFsO1xyXG5cdFx0XHRcdG5vZGVCdWlsZGVyLmxpZ2h0c05vZGUgPSByZW5kZXJPYmplY3QubGlnaHRzTm9kZTtcclxuXHRcdFx0XHRub2RlQnVpbGRlci5lbnZpcm9ubWVudE5vZGUgPSB0aGlzLmdldEVudmlyb25tZW50Tm9kZSggcmVuZGVyT2JqZWN0LnNjZW5lICk7XHJcblx0XHRcdFx0bm9kZUJ1aWxkZXIuZm9nTm9kZSA9IHRoaXMuZ2V0Rm9nTm9kZSggcmVuZGVyT2JqZWN0LnNjZW5lICk7XHJcblx0XHRcdFx0bm9kZUJ1aWxkZXIuY2xpcHBpbmdDb250ZXh0ID0gcmVuZGVyT2JqZWN0LmNsaXBwaW5nQ29udGV4dDtcclxuXHRcdFx0XHRub2RlQnVpbGRlci5idWlsZCgpO1xyXG5cclxuXHRcdFx0XHRub2RlQnVpbGRlclN0YXRlID0gdGhpcy5fY3JlYXRlTm9kZUJ1aWxkZXJTdGF0ZSggbm9kZUJ1aWxkZXIgKTtcclxuXHJcblx0XHRcdFx0bm9kZUJ1aWxkZXJDYWNoZS5zZXQoIGNhY2hlS2V5LCBub2RlQnVpbGRlclN0YXRlICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRub2RlQnVpbGRlclN0YXRlLnVzZWRUaW1lcyArKztcclxuXHJcblx0XHRcdHJlbmRlck9iamVjdERhdGEubm9kZUJ1aWxkZXJTdGF0ZSA9IG5vZGVCdWlsZGVyU3RhdGU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBub2RlQnVpbGRlclN0YXRlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlbGV0ZXMgdGhlIGdpdmVuIG9iamVjdCBmcm9tIHRoZSBpbnRlcm5hbCBkYXRhIG1hcFxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHthbnl9IG9iamVjdCAtIFRoZSBvYmplY3QgdG8gZGVsZXRlLlxyXG5cdCAqIEByZXR1cm4gez9PYmplY3R9IFRoZSBkZWxldGVkIGRpY3Rpb25hcnkuXHJcblx0ICovXHJcblx0ZGVsZXRlKCBvYmplY3QgKSB7XHJcblxyXG5cdFx0aWYgKCBvYmplY3QuaXNSZW5kZXJPYmplY3QgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBub2RlQnVpbGRlclN0YXRlID0gdGhpcy5nZXQoIG9iamVjdCApLm5vZGVCdWlsZGVyU3RhdGU7XHJcblx0XHRcdG5vZGVCdWlsZGVyU3RhdGUudXNlZFRpbWVzIC0tO1xyXG5cclxuXHRcdFx0aWYgKCBub2RlQnVpbGRlclN0YXRlLnVzZWRUaW1lcyA9PT0gMCApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5ub2RlQnVpbGRlckNhY2hlLmRlbGV0ZSggdGhpcy5nZXRGb3JSZW5kZXJDYWNoZUtleSggb2JqZWN0ICkgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHN1cGVyLmRlbGV0ZSggb2JqZWN0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIG5vZGUgYnVpbGRlciBzdGF0ZSBmb3IgdGhlIGdpdmVuIGNvbXB1dGUgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gY29tcHV0ZU5vZGUgLSBUaGUgY29tcHV0ZSBub2RlLlxyXG5cdCAqIEByZXR1cm4ge05vZGVCdWlsZGVyU3RhdGV9IFRoZSBub2RlIGJ1aWxkZXIgc3RhdGUuXHJcblx0ICovXHJcblx0Z2V0Rm9yQ29tcHV0ZSggY29tcHV0ZU5vZGUgKSB7XHJcblxyXG5cdFx0Y29uc3QgY29tcHV0ZURhdGEgPSB0aGlzLmdldCggY29tcHV0ZU5vZGUgKTtcclxuXHJcblx0XHRsZXQgbm9kZUJ1aWxkZXJTdGF0ZSA9IGNvbXB1dGVEYXRhLm5vZGVCdWlsZGVyU3RhdGU7XHJcblxyXG5cdFx0aWYgKCBub2RlQnVpbGRlclN0YXRlID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBub2RlQnVpbGRlciA9IHRoaXMuYmFja2VuZC5jcmVhdGVOb2RlQnVpbGRlciggY29tcHV0ZU5vZGUsIHRoaXMucmVuZGVyZXIgKTtcclxuXHRcdFx0bm9kZUJ1aWxkZXIuYnVpbGQoKTtcclxuXHJcblx0XHRcdG5vZGVCdWlsZGVyU3RhdGUgPSB0aGlzLl9jcmVhdGVOb2RlQnVpbGRlclN0YXRlKCBub2RlQnVpbGRlciApO1xyXG5cclxuXHRcdFx0Y29tcHV0ZURhdGEubm9kZUJ1aWxkZXJTdGF0ZSA9IG5vZGVCdWlsZGVyU3RhdGU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBub2RlQnVpbGRlclN0YXRlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgYSBub2RlIGJ1aWxkZXIgc3RhdGUgZm9yIHRoZSBnaXZlbiBub2RlIGJ1aWxkZXIuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7Tm9kZUJ1aWxkZXJ9IG5vZGVCdWlsZGVyIC0gVGhlIG5vZGUgYnVpbGRlci5cclxuXHQgKiBAcmV0dXJuIHtOb2RlQnVpbGRlclN0YXRlfSBUaGUgbm9kZSBidWlsZGVyIHN0YXRlLlxyXG5cdCAqL1xyXG5cdF9jcmVhdGVOb2RlQnVpbGRlclN0YXRlKCBub2RlQnVpbGRlciApIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IE5vZGVCdWlsZGVyU3RhdGUoXHJcblx0XHRcdG5vZGVCdWlsZGVyLnZlcnRleFNoYWRlcixcclxuXHRcdFx0bm9kZUJ1aWxkZXIuZnJhZ21lbnRTaGFkZXIsXHJcblx0XHRcdG5vZGVCdWlsZGVyLmNvbXB1dGVTaGFkZXIsXHJcblx0XHRcdG5vZGVCdWlsZGVyLmdldEF0dHJpYnV0ZXNBcnJheSgpLFxyXG5cdFx0XHRub2RlQnVpbGRlci5nZXRCaW5kaW5ncygpLFxyXG5cdFx0XHRub2RlQnVpbGRlci51cGRhdGVOb2RlcyxcclxuXHRcdFx0bm9kZUJ1aWxkZXIudXBkYXRlQmVmb3JlTm9kZXMsXHJcblx0XHRcdG5vZGVCdWlsZGVyLnVwZGF0ZUFmdGVyTm9kZXMsXHJcblx0XHRcdG5vZGVCdWlsZGVyLm9ic2VydmVyLFxyXG5cdFx0XHRub2RlQnVpbGRlci50cmFuc2Zvcm1zXHJcblx0XHQpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYW4gZW52aXJvbm1lbnQgbm9kZSBmb3IgdGhlIGN1cnJlbnQgY29uZmlndXJlZFxyXG5cdCAqIHNjZW5lIGVudmlyb25tZW50LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTY2VuZX0gc2NlbmUgLSBUaGUgc2NlbmUuXHJcblx0ICogQHJldHVybiB7Tm9kZX0gQSBub2RlIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBzY2VuZSBlbnZpcm9ubWVudC5cclxuXHQgKi9cclxuXHRnZXRFbnZpcm9ubWVudE5vZGUoIHNjZW5lICkge1xyXG5cclxuXHRcdHRoaXMudXBkYXRlRW52aXJvbm1lbnQoIHNjZW5lICk7XHJcblxyXG5cdFx0bGV0IGVudmlyb25tZW50Tm9kZSA9IG51bGw7XHJcblxyXG5cdFx0aWYgKCBzY2VuZS5lbnZpcm9ubWVudE5vZGUgJiYgc2NlbmUuZW52aXJvbm1lbnROb2RlLmlzTm9kZSApIHtcclxuXHJcblx0XHRcdGVudmlyb25tZW50Tm9kZSA9IHNjZW5lLmVudmlyb25tZW50Tm9kZTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc3Qgc2NlbmVEYXRhID0gdGhpcy5nZXQoIHNjZW5lICk7XHJcblxyXG5cdFx0XHRpZiAoIHNjZW5lRGF0YS5lbnZpcm9ubWVudE5vZGUgKSB7XHJcblxyXG5cdFx0XHRcdGVudmlyb25tZW50Tm9kZSA9IHNjZW5lRGF0YS5lbnZpcm9ubWVudE5vZGU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBlbnZpcm9ubWVudE5vZGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIGJhY2tncm91bmQgbm9kZSBmb3IgdGhlIGN1cnJlbnQgY29uZmlndXJlZFxyXG5cdCAqIHNjZW5lIGJhY2tncm91bmQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1NjZW5lfSBzY2VuZSAtIFRoZSBzY2VuZS5cclxuXHQgKiBAcmV0dXJuIHtOb2RlfSBBIG5vZGUgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IHNjZW5lIGJhY2tncm91bmQuXHJcblx0ICovXHJcblx0Z2V0QmFja2dyb3VuZE5vZGUoIHNjZW5lICkge1xyXG5cclxuXHRcdHRoaXMudXBkYXRlQmFja2dyb3VuZCggc2NlbmUgKTtcclxuXHJcblx0XHRsZXQgYmFja2dyb3VuZE5vZGUgPSBudWxsO1xyXG5cclxuXHRcdGlmICggc2NlbmUuYmFja2dyb3VuZE5vZGUgJiYgc2NlbmUuYmFja2dyb3VuZE5vZGUuaXNOb2RlICkge1xyXG5cclxuXHRcdFx0YmFja2dyb3VuZE5vZGUgPSBzY2VuZS5iYWNrZ3JvdW5kTm9kZTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc3Qgc2NlbmVEYXRhID0gdGhpcy5nZXQoIHNjZW5lICk7XHJcblxyXG5cdFx0XHRpZiAoIHNjZW5lRGF0YS5iYWNrZ3JvdW5kTm9kZSApIHtcclxuXHJcblx0XHRcdFx0YmFja2dyb3VuZE5vZGUgPSBzY2VuZURhdGEuYmFja2dyb3VuZE5vZGU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBiYWNrZ3JvdW5kTm9kZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgZm9nIG5vZGUgZm9yIHRoZSBjdXJyZW50IGNvbmZpZ3VyZWQgc2NlbmUgZm9nLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTY2VuZX0gc2NlbmUgLSBUaGUgc2NlbmUuXHJcblx0ICogQHJldHVybiB7Tm9kZX0gQSBub2RlIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBzY2VuZSBmb2cuXHJcblx0ICovXHJcblx0Z2V0Rm9nTm9kZSggc2NlbmUgKSB7XHJcblxyXG5cdFx0dGhpcy51cGRhdGVGb2coIHNjZW5lICk7XHJcblxyXG5cdFx0cmV0dXJuIHNjZW5lLmZvZ05vZGUgfHwgdGhpcy5nZXQoIHNjZW5lICkuZm9nTm9kZSB8fCBudWxsO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBjYWNoZSBrZXkgZm9yIHRoZSBnaXZlbiBzY2VuZSBhbmQgbGlnaHRzIG5vZGUuXHJcblx0ICogVGhpcyBrZXkgaXMgdXNlZCBieSBgUmVuZGVyT2JqZWN0YCBhcyBhIHBhcnQgb2YgdGhlIGR5bmFtaWNcclxuXHQgKiBjYWNoZSBrZXkgKGEga2V5IHRoYXQgbXVzdCBiZSBjaGVja2VkIGV2ZXJ5IHRpbWUgdGhlIHJlbmRlclxyXG5cdCAqIG9iamVjdHMgaXMgZHJhd24pLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTY2VuZX0gc2NlbmUgLSBUaGUgc2NlbmUuXHJcblx0ICogQHBhcmFtIHtMaWdodHNOb2RlfSBsaWdodHNOb2RlIC0gVGhlIGxpZ2h0cyBub2RlLlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGNhY2hlIGtleS5cclxuXHQgKi9cclxuXHRnZXRDYWNoZUtleSggc2NlbmUsIGxpZ2h0c05vZGUgKSB7XHJcblxyXG5cdFx0X2NoYWluS2V5c1sgMCBdID0gc2NlbmU7XHJcblx0XHRfY2hhaW5LZXlzWyAxIF0gPSBsaWdodHNOb2RlO1xyXG5cclxuXHRcdGNvbnN0IGNhbGxJZCA9IHRoaXMucmVuZGVyZXIuaW5mby5jYWxscztcclxuXHJcblx0XHRjb25zdCBjYWNoZUtleURhdGEgPSB0aGlzLmNhbGxIYXNoQ2FjaGUuZ2V0KCBfY2hhaW5LZXlzICkgfHwge307XHJcblxyXG5cdFx0aWYgKCBjYWNoZUtleURhdGEuY2FsbElkICE9PSBjYWxsSWQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBlbnZpcm9ubWVudE5vZGUgPSB0aGlzLmdldEVudmlyb25tZW50Tm9kZSggc2NlbmUgKTtcclxuXHRcdFx0Y29uc3QgZm9nTm9kZSA9IHRoaXMuZ2V0Rm9nTm9kZSggc2NlbmUgKTtcclxuXHJcblx0XHRcdGlmICggbGlnaHRzTm9kZSApIF9jYWNoZUtleVZhbHVlcy5wdXNoKCBsaWdodHNOb2RlLmdldENhY2hlS2V5KCB0cnVlICkgKTtcclxuXHRcdFx0aWYgKCBlbnZpcm9ubWVudE5vZGUgKSBfY2FjaGVLZXlWYWx1ZXMucHVzaCggZW52aXJvbm1lbnROb2RlLmdldENhY2hlS2V5KCkgKTtcclxuXHRcdFx0aWYgKCBmb2dOb2RlICkgX2NhY2hlS2V5VmFsdWVzLnB1c2goIGZvZ05vZGUuZ2V0Q2FjaGVLZXkoKSApO1xyXG5cclxuXHRcdFx0X2NhY2hlS2V5VmFsdWVzLnB1c2goIHRoaXMucmVuZGVyZXIuc2hhZG93TWFwLmVuYWJsZWQgPyAxIDogMCApO1xyXG5cclxuXHRcdFx0Y2FjaGVLZXlEYXRhLmNhbGxJZCA9IGNhbGxJZDtcclxuXHRcdFx0Y2FjaGVLZXlEYXRhLmNhY2hlS2V5ID0gaGFzaEFycmF5KCBfY2FjaGVLZXlWYWx1ZXMgKTtcclxuXHJcblx0XHRcdHRoaXMuY2FsbEhhc2hDYWNoZS5zZXQoIF9jaGFpbktleXMsIGNhY2hlS2V5RGF0YSApO1xyXG5cclxuXHRcdFx0X2NhY2hlS2V5VmFsdWVzLmxlbmd0aCA9IDA7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdF9jaGFpbktleXMubGVuZ3RoID0gMDtcclxuXHJcblx0XHRyZXR1cm4gY2FjaGVLZXlEYXRhLmNhY2hlS2V5O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEEgYm9vbGVhbiB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRvbmUgbWFwcGluZyBzaG91bGQgYmUgZW5hYmxlZFxyXG5cdCAqIG9yIG5vdC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdCAqL1xyXG5cdGdldCBpc1RvbmVNYXBwaW5nU3RhdGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMucmVuZGVyZXIuZ2V0UmVuZGVyVGFyZ2V0KCkgPyBmYWxzZSA6IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSWYgYSBzY2VuZSBiYWNrZ3JvdW5kIGlzIGNvbmZpZ3VyZWQsIHRoaXMgbWV0aG9kIG1ha2VzIHN1cmUgdG9cclxuXHQgKiByZXByZXNlbnQgdGhlIGJhY2tncm91bmQgd2l0aCBhIGNvcnJlc3BvbmRpbmcgbm9kZS1iYXNlZCBpbXBsZW1lbnRhdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7U2NlbmV9IHNjZW5lIC0gVGhlIHNjZW5lLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZUJhY2tncm91bmQoIHNjZW5lICkge1xyXG5cclxuXHRcdGNvbnN0IHNjZW5lRGF0YSA9IHRoaXMuZ2V0KCBzY2VuZSApO1xyXG5cdFx0Y29uc3QgYmFja2dyb3VuZCA9IHNjZW5lLmJhY2tncm91bmQ7XHJcblxyXG5cdFx0aWYgKCBiYWNrZ3JvdW5kICkge1xyXG5cclxuXHRcdFx0Y29uc3QgZm9yY2VVcGRhdGUgPSAoIHNjZW5lLmJhY2tncm91bmRCbHVycmluZXNzID09PSAwICYmIHNjZW5lRGF0YS5iYWNrZ3JvdW5kQmx1cnJpbmVzcyA+IDAgKSB8fCAoIHNjZW5lLmJhY2tncm91bmRCbHVycmluZXNzID4gMCAmJiBzY2VuZURhdGEuYmFja2dyb3VuZEJsdXJyaW5lc3MgPT09IDAgKTtcclxuXHJcblx0XHRcdGlmICggc2NlbmVEYXRhLmJhY2tncm91bmQgIT09IGJhY2tncm91bmQgfHwgZm9yY2VVcGRhdGUgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGJhY2tncm91bmROb2RlID0gdGhpcy5nZXRDYWNoZU5vZGUoICdiYWNrZ3JvdW5kJywgYmFja2dyb3VuZCwgKCkgPT4ge1xyXG5cclxuXHRcdFx0XHRcdGlmICggYmFja2dyb3VuZC5pc0N1YmVUZXh0dXJlID09PSB0cnVlIHx8ICggYmFja2dyb3VuZC5tYXBwaW5nID09PSBFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZyB8fCBiYWNrZ3JvdW5kLm1hcHBpbmcgPT09IEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nIHx8IGJhY2tncm91bmQubWFwcGluZyA9PT0gQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmcgKSApIHtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggc2NlbmUuYmFja2dyb3VuZEJsdXJyaW5lc3MgPiAwIHx8IGJhY2tncm91bmQubWFwcGluZyA9PT0gQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmcgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdHJldHVybiBwbXJlbVRleHR1cmUoIGJhY2tncm91bmQgKTtcclxuXHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGxldCBlbnZNYXA7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmICggYmFja2dyb3VuZC5pc0N1YmVUZXh0dXJlID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGVudk1hcCA9IGN1YmVUZXh0dXJlKCBiYWNrZ3JvdW5kICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0ZW52TWFwID0gdGV4dHVyZSggYmFja2dyb3VuZCApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdHJldHVybiBjdWJlTWFwTm9kZSggZW52TWFwICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIGlmICggYmFja2dyb3VuZC5pc1RleHR1cmUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gdGV4dHVyZSggYmFja2dyb3VuZCwgc2NyZWVuVVYuZmxpcFkoKSApLnNldFVwZGF0ZU1hdHJpeCggdHJ1ZSApO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIGJhY2tncm91bmQuaXNDb2xvciAhPT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdXZWJHUFVOb2RlczogVW5zdXBwb3J0ZWQgYmFja2dyb3VuZCBjb25maWd1cmF0aW9uLicsIGJhY2tncm91bmQgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH0sIGZvcmNlVXBkYXRlICk7XHJcblxyXG5cdFx0XHRcdHNjZW5lRGF0YS5iYWNrZ3JvdW5kTm9kZSA9IGJhY2tncm91bmROb2RlO1xyXG5cdFx0XHRcdHNjZW5lRGF0YS5iYWNrZ3JvdW5kID0gYmFja2dyb3VuZDtcclxuXHRcdFx0XHRzY2VuZURhdGEuYmFja2dyb3VuZEJsdXJyaW5lc3MgPSBzY2VuZS5iYWNrZ3JvdW5kQmx1cnJpbmVzcztcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2UgaWYgKCBzY2VuZURhdGEuYmFja2dyb3VuZE5vZGUgKSB7XHJcblxyXG5cdFx0XHRkZWxldGUgc2NlbmVEYXRhLmJhY2tncm91bmROb2RlO1xyXG5cdFx0XHRkZWxldGUgc2NlbmVEYXRhLmJhY2tncm91bmQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgdGhlIGNhY2hpbmcgb2Ygbm9kZXMgd2hpY2ggYXJlIHVzZWQgdG8gcmVwcmVzZW50cyB0aGVcclxuXHQgKiBzY2VuZSdzIGJhY2tncm91bmQsIGZvZyBvciBlbnZpcm9ubWVudC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIHR5cGUgb2Ygb2JqZWN0IHRvIGNhY2hlLlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgLSBUaGUgb2JqZWN0LlxyXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIC0gQSBjYWxsYmFjayB0aGF0IHByb2R1Y2VzIGEgbm9kZSByZXByZXNlbnRhdGlvbiBmb3IgdGhlIGdpdmVuIG9iamVjdC5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtmb3JjZVVwZGF0ZT1mYWxzZV0gLSBXaGV0aGVyIGFuIHVwZGF0ZSBzaG91bGQgYmUgZW5mb3JjZWQgb3Igbm90LlxyXG5cdCAqIEByZXR1cm4ge05vZGV9IFRoZSBub2RlIHJlcHJlc2VudGF0aW9uLlxyXG5cdCAqL1xyXG5cdGdldENhY2hlTm9kZSggdHlwZSwgb2JqZWN0LCBjYWxsYmFjaywgZm9yY2VVcGRhdGUgPSBmYWxzZSApIHtcclxuXHJcblx0XHRjb25zdCBub2RlQ2FjaGUgPSB0aGlzLmNhY2hlTGliWyB0eXBlIF0gfHwgKCB0aGlzLmNhY2hlTGliWyB0eXBlIF0gPSBuZXcgV2Vha01hcCgpICk7XHJcblxyXG5cdFx0bGV0IG5vZGUgPSBub2RlQ2FjaGUuZ2V0KCBvYmplY3QgKTtcclxuXHJcblx0XHRpZiAoIG5vZGUgPT09IHVuZGVmaW5lZCB8fCBmb3JjZVVwZGF0ZSApIHtcclxuXHJcblx0XHRcdG5vZGUgPSBjYWxsYmFjaygpO1xyXG5cdFx0XHRub2RlQ2FjaGUuc2V0KCBvYmplY3QsIG5vZGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG5vZGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSWYgYSBzY2VuZSBmb2cgaXMgY29uZmlndXJlZCwgdGhpcyBtZXRob2QgbWFrZXMgc3VyZSB0b1xyXG5cdCAqIHJlcHJlc2VudCB0aGUgZm9nIHdpdGggYSBjb3JyZXNwb25kaW5nIG5vZGUtYmFzZWQgaW1wbGVtZW50YXRpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1NjZW5lfSBzY2VuZSAtIFRoZSBzY2VuZS5cclxuXHQgKi9cclxuXHR1cGRhdGVGb2coIHNjZW5lICkge1xyXG5cclxuXHRcdGNvbnN0IHNjZW5lRGF0YSA9IHRoaXMuZ2V0KCBzY2VuZSApO1xyXG5cdFx0Y29uc3Qgc2NlbmVGb2cgPSBzY2VuZS5mb2c7XHJcblxyXG5cdFx0aWYgKCBzY2VuZUZvZyApIHtcclxuXHJcblx0XHRcdGlmICggc2NlbmVEYXRhLmZvZyAhPT0gc2NlbmVGb2cgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGZvZ05vZGUgPSB0aGlzLmdldENhY2hlTm9kZSggJ2ZvZycsIHNjZW5lRm9nLCAoKSA9PiB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBzY2VuZUZvZy5pc0ZvZ0V4cDIgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCBjb2xvciA9IHJlZmVyZW5jZSggJ2NvbG9yJywgJ2NvbG9yJywgc2NlbmVGb2cgKS5zZXRHcm91cCggcmVuZGVyR3JvdXAgKTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgZGVuc2l0eSA9IHJlZmVyZW5jZSggJ2RlbnNpdHknLCAnZmxvYXQnLCBzY2VuZUZvZyApLnNldEdyb3VwKCByZW5kZXJHcm91cCApO1xyXG5cclxuXHRcdFx0XHRcdFx0cmV0dXJuIGZvZyggY29sb3IsIGRlbnNpdHlGb2dGYWN0b3IoIGRlbnNpdHkgKSApO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIHNjZW5lRm9nLmlzRm9nICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgY29sb3IgPSByZWZlcmVuY2UoICdjb2xvcicsICdjb2xvcicsIHNjZW5lRm9nICkuc2V0R3JvdXAoIHJlbmRlckdyb3VwICk7XHJcblx0XHRcdFx0XHRcdGNvbnN0IG5lYXIgPSByZWZlcmVuY2UoICduZWFyJywgJ2Zsb2F0Jywgc2NlbmVGb2cgKS5zZXRHcm91cCggcmVuZGVyR3JvdXAgKTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgZmFyID0gcmVmZXJlbmNlKCAnZmFyJywgJ2Zsb2F0Jywgc2NlbmVGb2cgKS5zZXRHcm91cCggcmVuZGVyR3JvdXAgKTtcclxuXHJcblx0XHRcdFx0XHRcdHJldHVybiBmb2coIGNvbG9yLCByYW5nZUZvZ0ZhY3RvciggbmVhciwgZmFyICkgKTtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlJlbmRlcmVyOiBVbnN1cHBvcnRlZCBmb2cgY29uZmlndXJhdGlvbi4nLCBzY2VuZUZvZyApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fSApO1xyXG5cclxuXHRcdFx0XHRzY2VuZURhdGEuZm9nTm9kZSA9IGZvZ05vZGU7XHJcblx0XHRcdFx0c2NlbmVEYXRhLmZvZyA9IHNjZW5lRm9nO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRkZWxldGUgc2NlbmVEYXRhLmZvZ05vZGU7XHJcblx0XHRcdGRlbGV0ZSBzY2VuZURhdGEuZm9nO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJZiBhIHNjZW5lIGVudmlyb25tZW50IGlzIGNvbmZpZ3VyZWQsIHRoaXMgbWV0aG9kIG1ha2VzIHN1cmUgdG9cclxuXHQgKiByZXByZXNlbnQgdGhlIGVudmlyb25tZW50IHdpdGggYSBjb3JyZXNwb25kaW5nIG5vZGUtYmFzZWQgaW1wbGVtZW50YXRpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1NjZW5lfSBzY2VuZSAtIFRoZSBzY2VuZS5cclxuXHQgKi9cclxuXHR1cGRhdGVFbnZpcm9ubWVudCggc2NlbmUgKSB7XHJcblxyXG5cdFx0Y29uc3Qgc2NlbmVEYXRhID0gdGhpcy5nZXQoIHNjZW5lICk7XHJcblx0XHRjb25zdCBlbnZpcm9ubWVudCA9IHNjZW5lLmVudmlyb25tZW50O1xyXG5cclxuXHRcdGlmICggZW52aXJvbm1lbnQgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHNjZW5lRGF0YS5lbnZpcm9ubWVudCAhPT0gZW52aXJvbm1lbnQgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGVudmlyb25tZW50Tm9kZSA9IHRoaXMuZ2V0Q2FjaGVOb2RlKCAnZW52aXJvbm1lbnQnLCBlbnZpcm9ubWVudCwgKCkgPT4ge1xyXG5cclxuXHRcdFx0XHRcdGlmICggZW52aXJvbm1lbnQuaXNDdWJlVGV4dHVyZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdHJldHVybiBjdWJlVGV4dHVyZSggZW52aXJvbm1lbnQgKTtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKCBlbnZpcm9ubWVudC5pc1RleHR1cmUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gdGV4dHVyZSggZW52aXJvbm1lbnQgKTtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ05vZGVzOiBVbnN1cHBvcnRlZCBlbnZpcm9ubWVudCBjb25maWd1cmF0aW9uLicsIGVudmlyb25tZW50ICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRcdHNjZW5lRGF0YS5lbnZpcm9ubWVudE5vZGUgPSBlbnZpcm9ubWVudE5vZGU7XHJcblx0XHRcdFx0c2NlbmVEYXRhLmVudmlyb25tZW50ID0gZW52aXJvbm1lbnQ7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmICggc2NlbmVEYXRhLmVudmlyb25tZW50Tm9kZSApIHtcclxuXHJcblx0XHRcdGRlbGV0ZSBzY2VuZURhdGEuZW52aXJvbm1lbnROb2RlO1xyXG5cdFx0XHRkZWxldGUgc2NlbmVEYXRhLmVudmlyb25tZW50O1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHRnZXROb2RlRnJhbWUoIHJlbmRlcmVyID0gdGhpcy5yZW5kZXJlciwgc2NlbmUgPSBudWxsLCBvYmplY3QgPSBudWxsLCBjYW1lcmEgPSBudWxsLCBtYXRlcmlhbCA9IG51bGwgKSB7XHJcblxyXG5cdFx0Y29uc3Qgbm9kZUZyYW1lID0gdGhpcy5ub2RlRnJhbWU7XHJcblx0XHRub2RlRnJhbWUucmVuZGVyZXIgPSByZW5kZXJlcjtcclxuXHRcdG5vZGVGcmFtZS5zY2VuZSA9IHNjZW5lO1xyXG5cdFx0bm9kZUZyYW1lLm9iamVjdCA9IG9iamVjdDtcclxuXHRcdG5vZGVGcmFtZS5jYW1lcmEgPSBjYW1lcmE7XHJcblx0XHRub2RlRnJhbWUubWF0ZXJpYWwgPSBtYXRlcmlhbDtcclxuXHJcblx0XHRyZXR1cm4gbm9kZUZyYW1lO1xyXG5cclxuXHR9XHJcblxyXG5cdGdldE5vZGVGcmFtZUZvclJlbmRlciggcmVuZGVyT2JqZWN0ICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmdldE5vZGVGcmFtZSggcmVuZGVyT2JqZWN0LnJlbmRlcmVyLCByZW5kZXJPYmplY3Quc2NlbmUsIHJlbmRlck9iamVjdC5vYmplY3QsIHJlbmRlck9iamVjdC5jYW1lcmEsIHJlbmRlck9iamVjdC5tYXRlcmlhbCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGN1cnJlbnQgb3V0cHV0IGNhY2hlIGtleS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG91dHB1dCBjYWNoZSBrZXkuXHJcblx0ICovXHJcblx0Z2V0T3V0cHV0Q2FjaGVLZXkoKSB7XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyZXIgPSB0aGlzLnJlbmRlcmVyO1xyXG5cclxuXHRcdHJldHVybiByZW5kZXJlci50b25lTWFwcGluZyArICcsJyArIHJlbmRlcmVyLmN1cnJlbnRDb2xvclNwYWNlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENoZWNrcyBpZiB0aGUgb3V0cHV0IGNvbmZpZ3VyYXRpb24gKHRvbmUgbWFwcGluZyBhbmQgY29sb3Igc3BhY2UpIGZvclxyXG5cdCAqIHRoZSBnaXZlbiB0YXJnZXQgaGFzIGNoYW5nZWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IG91dHB1dFRhcmdldCAtIFRoZSBvdXRwdXQgdGFyZ2V0LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIG91dHB1dCBjb25maWd1cmF0aW9uIGhhcyBjaGFuZ2VkIG9yIG5vdC5cclxuXHQgKi9cclxuXHRoYXNPdXRwdXRDaGFuZ2UoIG91dHB1dFRhcmdldCApIHtcclxuXHJcblx0XHRjb25zdCBjYWNoZUtleSA9IF9vdXRwdXROb2RlTWFwLmdldCggb3V0cHV0VGFyZ2V0ICk7XHJcblxyXG5cdFx0cmV0dXJuIGNhY2hlS2V5ICE9PSB0aGlzLmdldE91dHB1dENhY2hlS2V5KCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIG5vZGUgdGhhdCByZXByZXNlbnRzIHRoZSBvdXRwdXQgY29uZmlndXJhdGlvbiAodG9uZSBtYXBwaW5nIGFuZFxyXG5cdCAqIGNvbG9yIHNwYWNlKSBmb3IgdGhlIGN1cnJlbnQgdGFyZ2V0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSBvdXRwdXRUYXJnZXQgLSBUaGUgb3V0cHV0IHRhcmdldC5cclxuXHQgKiBAcmV0dXJuIHtOb2RlfSBUaGUgb3V0cHV0IG5vZGUuXHJcblx0ICovXHJcblx0Z2V0T3V0cHV0Tm9kZSggb3V0cHV0VGFyZ2V0ICkge1xyXG5cclxuXHRcdGNvbnN0IHJlbmRlcmVyID0gdGhpcy5yZW5kZXJlcjtcclxuXHRcdGNvbnN0IGNhY2hlS2V5ID0gdGhpcy5nZXRPdXRwdXRDYWNoZUtleSgpO1xyXG5cclxuXHRcdGNvbnN0IG91dHB1dCA9IHRleHR1cmUoIG91dHB1dFRhcmdldCwgc2NyZWVuVVYgKS5yZW5kZXJPdXRwdXQoIHJlbmRlcmVyLnRvbmVNYXBwaW5nLCByZW5kZXJlci5jdXJyZW50Q29sb3JTcGFjZSApO1xyXG5cclxuXHRcdF9vdXRwdXROb2RlTWFwLnNldCggb3V0cHV0VGFyZ2V0LCBjYWNoZUtleSApO1xyXG5cclxuXHRcdHJldHVybiBvdXRwdXQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVHJpZ2dlcnMgdGhlIGNhbGwgb2YgYHVwZGF0ZUJlZm9yZSgpYCBtZXRob2RzXHJcblx0ICogZm9yIGFsbCBub2RlcyBvZiB0aGUgZ2l2ZW4gcmVuZGVyIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyT2JqZWN0fSByZW5kZXJPYmplY3QgLSBUaGUgcmVuZGVyIG9iamVjdC5cclxuXHQgKi9cclxuXHR1cGRhdGVCZWZvcmUoIHJlbmRlck9iamVjdCApIHtcclxuXHJcblx0XHRjb25zdCBub2RlQnVpbGRlciA9IHJlbmRlck9iamVjdC5nZXROb2RlQnVpbGRlclN0YXRlKCk7XHJcblxyXG5cdFx0Zm9yICggY29uc3Qgbm9kZSBvZiBub2RlQnVpbGRlci51cGRhdGVCZWZvcmVOb2RlcyApIHtcclxuXHJcblx0XHRcdC8vIHVwZGF0ZSBmcmFtZSBzdGF0ZSBmb3IgZWFjaCBub2RlXHJcblxyXG5cdFx0XHR0aGlzLmdldE5vZGVGcmFtZUZvclJlbmRlciggcmVuZGVyT2JqZWN0ICkudXBkYXRlQmVmb3JlTm9kZSggbm9kZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUcmlnZ2VycyB0aGUgY2FsbCBvZiBgdXBkYXRlQWZ0ZXIoKWAgbWV0aG9kc1xyXG5cdCAqIGZvciBhbGwgbm9kZXMgb2YgdGhlIGdpdmVuIHJlbmRlciBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JlbmRlck9iamVjdH0gcmVuZGVyT2JqZWN0IC0gVGhlIHJlbmRlciBvYmplY3QuXHJcblx0ICovXHJcblx0dXBkYXRlQWZ0ZXIoIHJlbmRlck9iamVjdCApIHtcclxuXHJcblx0XHRjb25zdCBub2RlQnVpbGRlciA9IHJlbmRlck9iamVjdC5nZXROb2RlQnVpbGRlclN0YXRlKCk7XHJcblxyXG5cdFx0Zm9yICggY29uc3Qgbm9kZSBvZiBub2RlQnVpbGRlci51cGRhdGVBZnRlck5vZGVzICkge1xyXG5cclxuXHRcdFx0Ly8gdXBkYXRlIGZyYW1lIHN0YXRlIGZvciBlYWNoIG5vZGVcclxuXHJcblx0XHRcdHRoaXMuZ2V0Tm9kZUZyYW1lRm9yUmVuZGVyKCByZW5kZXJPYmplY3QgKS51cGRhdGVBZnRlck5vZGUoIG5vZGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVHJpZ2dlcnMgdGhlIGNhbGwgb2YgYHVwZGF0ZSgpYCBtZXRob2RzXHJcblx0ICogZm9yIGFsbCBub2RlcyBvZiB0aGUgZ2l2ZW4gY29tcHV0ZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlfSBjb21wdXRlTm9kZSAtIFRoZSBjb21wdXRlIG5vZGUuXHJcblx0ICovXHJcblx0dXBkYXRlRm9yQ29tcHV0ZSggY29tcHV0ZU5vZGUgKSB7XHJcblxyXG5cdFx0Y29uc3Qgbm9kZUZyYW1lID0gdGhpcy5nZXROb2RlRnJhbWUoKTtcclxuXHRcdGNvbnN0IG5vZGVCdWlsZGVyID0gdGhpcy5nZXRGb3JDb21wdXRlKCBjb21wdXRlTm9kZSApO1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IG5vZGUgb2Ygbm9kZUJ1aWxkZXIudXBkYXRlTm9kZXMgKSB7XHJcblxyXG5cdFx0XHRub2RlRnJhbWUudXBkYXRlTm9kZSggbm9kZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUcmlnZ2VycyB0aGUgY2FsbCBvZiBgdXBkYXRlKClgIG1ldGhvZHNcclxuXHQgKiBmb3IgYWxsIG5vZGVzIG9mIHRoZSBnaXZlbiBjb21wdXRlIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JlbmRlck9iamVjdH0gcmVuZGVyT2JqZWN0IC0gVGhlIHJlbmRlciBvYmplY3QuXHJcblx0ICovXHJcblx0dXBkYXRlRm9yUmVuZGVyKCByZW5kZXJPYmplY3QgKSB7XHJcblxyXG5cdFx0Y29uc3Qgbm9kZUZyYW1lID0gdGhpcy5nZXROb2RlRnJhbWVGb3JSZW5kZXIoIHJlbmRlck9iamVjdCApO1xyXG5cdFx0Y29uc3Qgbm9kZUJ1aWxkZXIgPSByZW5kZXJPYmplY3QuZ2V0Tm9kZUJ1aWxkZXJTdGF0ZSgpO1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IG5vZGUgb2Ygbm9kZUJ1aWxkZXIudXBkYXRlTm9kZXMgKSB7XHJcblxyXG5cdFx0XHRub2RlRnJhbWUudXBkYXRlTm9kZSggbm9kZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gcmVuZGVyIG9iamVjdCByZXF1aXJlcyBhIHJlZnJlc2guXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JlbmRlck9iamVjdH0gcmVuZGVyT2JqZWN0IC0gVGhlIHJlbmRlciBvYmplY3QuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZ2l2ZW4gcmVuZGVyIG9iamVjdCByZXF1aXJlcyBhIHJlZnJlc2ggb3Igbm90LlxyXG5cdCAqL1xyXG5cdG5lZWRzUmVmcmVzaCggcmVuZGVyT2JqZWN0ICkge1xyXG5cclxuXHRcdGNvbnN0IG5vZGVGcmFtZSA9IHRoaXMuZ2V0Tm9kZUZyYW1lRm9yUmVuZGVyKCByZW5kZXJPYmplY3QgKTtcclxuXHRcdGNvbnN0IG1vbml0b3IgPSByZW5kZXJPYmplY3QuZ2V0TW9uaXRvcigpO1xyXG5cclxuXHRcdHJldHVybiBtb25pdG9yLm5lZWRzUmVmcmVzaCggcmVuZGVyT2JqZWN0LCBub2RlRnJhbWUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGcmVlcyB0aGUgaW50ZXJuYWwgcmVzb3VyY2VzLlxyXG5cdCAqL1xyXG5cdGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0c3VwZXIuZGlzcG9zZSgpO1xyXG5cclxuXHRcdHRoaXMubm9kZUZyYW1lID0gbmV3IE5vZGVGcmFtZSgpO1xyXG5cdFx0dGhpcy5ub2RlQnVpbGRlckNhY2hlID0gbmV3IE1hcCgpO1xyXG5cdFx0dGhpcy5jYWNoZUxpYiA9IHt9O1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBOb2RlcztcclxuIiwiaW1wb3J0IHsgTWF0cml4MyB9IGZyb20gJy4uLy4uL21hdGgvTWF0cml4My5qcyc7XHJcbmltcG9ydCB7IFBsYW5lIH0gZnJvbSAnLi4vLi4vbWF0aC9QbGFuZS5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjQgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjQuanMnO1xyXG5cclxuY29uc3QgX3BsYW5lID0gLypAX19QVVJFX18qLyBuZXcgUGxhbmUoKTtcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIHRoZSBzdGF0ZSB0aGF0IGlzIHVzZWQgdG8gcGVyZm9ybSBjbGlwcGluZyB2aWEgY2xpcHBpbmcgcGxhbmVzLlxyXG4gKiBUaGVyZSBpcyBhIGRlZmF1bHQgY2xpcHBpbmcgY29udGV4dCBmb3IgZWFjaCByZW5kZXIgY29udGV4dC4gV2hlbiB0aGVcclxuICogc2NlbmUgaG9sZHMgaW5zdGFuY2VzIG9mIGBDbGlwcGluZ0dyb3VwYCwgdGhlcmUgd2lsbCBiZSBhIGNvbnRleHQgZm9yIGVhY2hcclxuICogZ3JvdXAuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5jbGFzcyBDbGlwcGluZ0NvbnRleHQge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGNsaXBwaW5nIGNvbnRleHQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gez9DbGlwcGluZ0NvbnRleHR9IFtwYXJlbnRDb250ZXh0PW51bGxdIC0gQSByZWZlcmVuY2UgdG8gdGhlIHBhcmVudCBjbGlwcGluZyBjb250ZXh0LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwYXJlbnRDb250ZXh0ID0gbnVsbCApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjbGlwcGluZyBjb250ZXh0J3MgdmVyc2lvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudmVyc2lvbiA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIGNsaXBwaW5nIHBsYW5lcyBpcyB1c2VkIHRvIGNsaXAgb2JqZWN0cywgcmF0aGVyIHRoYW4gdGhlaXIgdW5pb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9ib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNsaXBJbnRlcnNlY3Rpb24gPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNsaXBwaW5nIGNvbnRleHQncyBjYWNoZSBrZXkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jYWNoZUtleSA9ICcnO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgc2hhZG93IHBhc3MgaXMgYWN0aXZlIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc2hhZG93UGFzcyA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHZpZXcgbm9ybWFsIG1hdHJpeC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7TWF0cml4M31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52aWV3Tm9ybWFsTWF0cml4ID0gbmV3IE1hdHJpeDMoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEludGVybmFsIGNhY2hlIGZvciBtYWludGFpbmluZyBjbGlwcGluZyBjb250ZXh0cy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2Vha01hcDxDbGlwcGluZ0dyb3VwLENsaXBwaW5nQ29udGV4dD59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2xpcHBpbmdHcm91cENvbnRleHRzID0gbmV3IFdlYWtNYXAoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBpbnRlcnNlY3Rpb24gcGxhbmVzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxWZWN0b3I0Pn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pbnRlcnNlY3Rpb25QbGFuZXMgPSBbXTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBpbnRlcnNlY3Rpb24gcGxhbmVzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxWZWN0b3I0Pn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51bmlvblBsYW5lcyA9IFtdO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHZlcnNpb24gb2YgdGhlIGNsaXBwaW5nIGNvbnRleHQncyBwYXJlbnQgY29udGV4dC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P251bWJlcn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBhcmVudFZlcnNpb24gPSBudWxsO1xyXG5cclxuXHRcdGlmICggcGFyZW50Q29udGV4dCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMudmlld05vcm1hbE1hdHJpeCA9IHBhcmVudENvbnRleHQudmlld05vcm1hbE1hdHJpeDtcclxuXHRcdFx0dGhpcy5jbGlwcGluZ0dyb3VwQ29udGV4dHMgPSBwYXJlbnRDb250ZXh0LmNsaXBwaW5nR3JvdXBDb250ZXh0cztcclxuXHJcblx0XHRcdHRoaXMuc2hhZG93UGFzcyA9IHBhcmVudENvbnRleHQuc2hhZG93UGFzcztcclxuXHRcdFx0dGhpcy52aWV3TWF0cml4ID0gcGFyZW50Q29udGV4dC52aWV3TWF0cml4O1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQcm9qZWN0cyB0aGUgZ2l2ZW4gc291cmNlIGNsaXBwaW5nIHBsYW5lcyBhbmQgd3JpdGVzIHRoZSByZXN1bHQgaW50byB0aGVcclxuXHQgKiBkZXN0aW5hdGlvbiBhcnJheS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8UGxhbmU+fSBzb3VyY2UgLSBUaGUgc291cmNlIGNsaXBwaW5nIHBsYW5lcy5cclxuXHQgKiBAcGFyYW0ge0FycmF5PFZlY3RvcjQ+fSBkZXN0aW5hdGlvbiAtIFRoZSBkZXN0aW5hdGlvbi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0IC0gVGhlIG9mZnNldC5cclxuXHQgKi9cclxuXHRwcm9qZWN0UGxhbmVzKCBzb3VyY2UsIGRlc3RpbmF0aW9uLCBvZmZzZXQgKSB7XHJcblxyXG5cdFx0Y29uc3QgbCA9IHNvdXJjZS5sZW5ndGg7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdF9wbGFuZS5jb3B5KCBzb3VyY2VbIGkgXSApLmFwcGx5TWF0cml4NCggdGhpcy52aWV3TWF0cml4LCB0aGlzLnZpZXdOb3JtYWxNYXRyaXggKTtcclxuXHJcblx0XHRcdGNvbnN0IHYgPSBkZXN0aW5hdGlvblsgb2Zmc2V0ICsgaSBdO1xyXG5cdFx0XHRjb25zdCBub3JtYWwgPSBfcGxhbmUubm9ybWFsO1xyXG5cclxuXHRcdFx0di54ID0gLSBub3JtYWwueDtcclxuXHRcdFx0di55ID0gLSBub3JtYWwueTtcclxuXHRcdFx0di56ID0gLSBub3JtYWwuejtcclxuXHRcdFx0di53ID0gX3BsYW5lLmNvbnN0YW50O1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoZSByb290IGNsaXBwaW5nIGNvbnRleHQgb2YgYSBzY2VuZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7U2NlbmV9IHNjZW5lIC0gVGhlIHNjZW5lLlxyXG5cdCAqIEBwYXJhbSB7Q2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIHRoYXQgaXMgdXNlZCB0byByZW5kZXIgdGhlIHNjZW5lLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZUdsb2JhbCggc2NlbmUsIGNhbWVyYSApIHtcclxuXHJcblx0XHR0aGlzLnNoYWRvd1Bhc3MgPSAoIHNjZW5lLm92ZXJyaWRlTWF0ZXJpYWwgIT09IG51bGwgJiYgc2NlbmUub3ZlcnJpZGVNYXRlcmlhbC5pc1NoYWRvd1Bhc3NNYXRlcmlhbCApO1xyXG5cdFx0dGhpcy52aWV3TWF0cml4ID0gY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZTtcclxuXHJcblx0XHR0aGlzLnZpZXdOb3JtYWxNYXRyaXguZ2V0Tm9ybWFsTWF0cml4KCB0aGlzLnZpZXdNYXRyaXggKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoZSBjbGlwcGluZyBjb250ZXh0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtDbGlwcGluZ0NvbnRleHR9IHBhcmVudENvbnRleHQgLSBUaGUgcGFyZW50IGNvbnRleHQuXHJcblx0ICogQHBhcmFtIHtDbGlwcGluZ0dyb3VwfSBjbGlwcGluZ0dyb3VwIC0gVGhlIGNsaXBwaW5nIGdyb3VwIHRoaXMgY29udGV4dCBiZWxvbmdzIHRvLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZSggcGFyZW50Q29udGV4dCwgY2xpcHBpbmdHcm91cCApIHtcclxuXHJcblx0XHRsZXQgdXBkYXRlID0gZmFsc2U7XHJcblxyXG5cdFx0aWYgKCBwYXJlbnRDb250ZXh0LnZlcnNpb24gIT09IHRoaXMucGFyZW50VmVyc2lvbiApIHtcclxuXHJcblx0XHRcdHRoaXMuaW50ZXJzZWN0aW9uUGxhbmVzID0gQXJyYXkuZnJvbSggcGFyZW50Q29udGV4dC5pbnRlcnNlY3Rpb25QbGFuZXMgKTtcclxuXHRcdFx0dGhpcy51bmlvblBsYW5lcyA9IEFycmF5LmZyb20oIHBhcmVudENvbnRleHQudW5pb25QbGFuZXMgKTtcclxuXHRcdFx0dGhpcy5wYXJlbnRWZXJzaW9uID0gcGFyZW50Q29udGV4dC52ZXJzaW9uO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMuY2xpcEludGVyc2VjdGlvbiAhPT0gY2xpcHBpbmdHcm91cC5jbGlwSW50ZXJzZWN0aW9uICkge1xyXG5cclxuXHRcdFx0dGhpcy5jbGlwSW50ZXJzZWN0aW9uID0gY2xpcHBpbmdHcm91cC5jbGlwSW50ZXJzZWN0aW9uO1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLmNsaXBJbnRlcnNlY3Rpb24gKSB7XHJcblxyXG5cdFx0XHRcdHRoaXMudW5pb25QbGFuZXMubGVuZ3RoID0gcGFyZW50Q29udGV4dC51bmlvblBsYW5lcy5sZW5ndGg7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHR0aGlzLmludGVyc2VjdGlvblBsYW5lcy5sZW5ndGggPSBwYXJlbnRDb250ZXh0LmludGVyc2VjdGlvblBsYW5lcy5sZW5ndGg7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHNyY0NsaXBwaW5nUGxhbmVzID0gY2xpcHBpbmdHcm91cC5jbGlwcGluZ1BsYW5lcztcclxuXHRcdGNvbnN0IGwgPSBzcmNDbGlwcGluZ1BsYW5lcy5sZW5ndGg7XHJcblxyXG5cdFx0bGV0IGRzdENsaXBwaW5nUGxhbmVzO1xyXG5cdFx0bGV0IG9mZnNldDtcclxuXHJcblx0XHRpZiAoIHRoaXMuY2xpcEludGVyc2VjdGlvbiApIHtcclxuXHJcblx0XHRcdGRzdENsaXBwaW5nUGxhbmVzID0gdGhpcy5pbnRlcnNlY3Rpb25QbGFuZXM7XHJcblx0XHRcdG9mZnNldCA9IHBhcmVudENvbnRleHQuaW50ZXJzZWN0aW9uUGxhbmVzLmxlbmd0aDtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0ZHN0Q2xpcHBpbmdQbGFuZXMgPSB0aGlzLnVuaW9uUGxhbmVzO1xyXG5cdFx0XHRvZmZzZXQgPSBwYXJlbnRDb250ZXh0LnVuaW9uUGxhbmVzLmxlbmd0aDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBkc3RDbGlwcGluZ1BsYW5lcy5sZW5ndGggIT09IG9mZnNldCArIGwgKSB7XHJcblxyXG5cdFx0XHRkc3RDbGlwcGluZ1BsYW5lcy5sZW5ndGggPSBvZmZzZXQgKyBsO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0ZHN0Q2xpcHBpbmdQbGFuZXNbIG9mZnNldCArIGkgXSA9IG5ldyBWZWN0b3I0KCk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR1cGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnByb2plY3RQbGFuZXMoIHNyY0NsaXBwaW5nUGxhbmVzLCBkc3RDbGlwcGluZ1BsYW5lcywgb2Zmc2V0ICk7XHJcblxyXG5cdFx0aWYgKCB1cGRhdGUgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnZlcnNpb24gKys7XHJcblx0XHRcdHRoaXMuY2FjaGVLZXkgPSBgJHsgdGhpcy5pbnRlcnNlY3Rpb25QbGFuZXMubGVuZ3RoIH06JHsgdGhpcy51bmlvblBsYW5lcy5sZW5ndGggfWA7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBjbGlwcGluZyBjb250ZXh0IGZvciB0aGUgZ2l2ZW4gY2xpcHBpbmcgZ3JvdXAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0NsaXBwaW5nR3JvdXB9IGNsaXBwaW5nR3JvdXAgLSBUaGUgY2xpcHBpbmcgZ3JvdXAuXHJcblx0ICogQHJldHVybiB7Q2xpcHBpbmdDb250ZXh0fSBUaGUgY2xpcHBpbmcgY29udGV4dC5cclxuXHQgKi9cclxuXHRnZXRHcm91cENvbnRleHQoIGNsaXBwaW5nR3JvdXAgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLnNoYWRvd1Bhc3MgJiYgISBjbGlwcGluZ0dyb3VwLmNsaXBTaGFkb3dzICkgcmV0dXJuIHRoaXM7XHJcblxyXG5cdFx0bGV0IGNvbnRleHQgPSB0aGlzLmNsaXBwaW5nR3JvdXBDb250ZXh0cy5nZXQoIGNsaXBwaW5nR3JvdXAgKTtcclxuXHJcblx0XHRpZiAoIGNvbnRleHQgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGNvbnRleHQgPSBuZXcgQ2xpcHBpbmdDb250ZXh0KCB0aGlzICk7XHJcblx0XHRcdHRoaXMuY2xpcHBpbmdHcm91cENvbnRleHRzLnNldCggY2xpcHBpbmdHcm91cCwgY29udGV4dCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb250ZXh0LnVwZGF0ZSggdGhpcywgY2xpcHBpbmdHcm91cCApO1xyXG5cclxuXHRcdHJldHVybiBjb250ZXh0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBjb3VudCBvZiB1bmlvbiBjbGlwcGluZyBwbGFuZXMuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdCAqIEByZWFkb25seVxyXG5cdCAqL1xyXG5cdGdldCB1bmlvbkNsaXBwaW5nQ291bnQoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMudW5pb25QbGFuZXMubGVuZ3RoO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBDbGlwcGluZ0NvbnRleHQ7XHJcbiIsIi8qKlxyXG4gKiBUaGlzIG1vZHVsZSBpcyB1c2VkIHRvIHJlcHJlc2VudCByZW5kZXIgYnVuZGxlcyBpbnNpZGUgdGhlIHJlbmRlcmVyXHJcbiAqIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5jbGFzcyBSZW5kZXJCdW5kbGUge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGJ1bmRsZSBncm91cC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QnVuZGxlR3JvdXB9IGJ1bmRsZUdyb3VwIC0gVGhlIGJ1bmRsZSBncm91cC5cclxuXHQgKiBAcGFyYW0ge0NhbWVyYX0gY2FtZXJhIC0gVGhlIGNhbWVyYSB0aGUgYnVuZGxlIGdyb3VwIGlzIHJlbmRlcmVkIHdpdGguXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGJ1bmRsZUdyb3VwLCBjYW1lcmEgKSB7XHJcblxyXG5cdFx0dGhpcy5idW5kbGVHcm91cCA9IGJ1bmRsZUdyb3VwO1xyXG5cdFx0dGhpcy5jYW1lcmEgPSBjYW1lcmE7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFJlbmRlckJ1bmRsZTtcclxuIiwiaW1wb3J0IENoYWluTWFwIGZyb20gJy4vQ2hhaW5NYXAuanMnO1xyXG5pbXBvcnQgUmVuZGVyQnVuZGxlIGZyb20gJy4vUmVuZGVyQnVuZGxlLmpzJztcclxuXHJcbmNvbnN0IF9jaGFpbktleXMgPSBbXTtcclxuXHJcbi8qKlxyXG4gKiBUaGlzIHJlbmRlcmVyIG1vZHVsZSBtYW5hZ2VzIHJlbmRlciBidW5kbGVzLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuY2xhc3MgUmVuZGVyQnVuZGxlcyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcmVuZGVyIGJ1bmRsZSBtYW5hZ2VtZW50IGNvbXBvbmVudC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgY2hhaW4gbWFwIGZvciBtYWludGFpbmluZyB0aGUgcmVuZGVyIGJ1bmRsZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0NoYWluTWFwfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJ1bmRsZXMgPSBuZXcgQ2hhaW5NYXAoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgcmVuZGVyIGJ1bmRsZSBmb3IgdGhlIGdpdmVuIGJ1bmRsZSBncm91cCBhbmQgY2FtZXJhLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCdW5kbGVHcm91cH0gYnVuZGxlR3JvdXAgLSBUaGUgYnVuZGxlIGdyb3VwLlxyXG5cdCAqIEBwYXJhbSB7Q2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIHRoZSBidW5kbGUgZ3JvdXAgaXMgcmVuZGVyZWQgd2l0aC5cclxuXHQgKiBAcmV0dXJuIHtSZW5kZXJCdW5kbGV9IFRoZSByZW5kZXIgYnVuZGxlLlxyXG5cdCAqL1xyXG5cdGdldCggYnVuZGxlR3JvdXAsIGNhbWVyYSApIHtcclxuXHJcblx0XHRjb25zdCBidW5kbGVzID0gdGhpcy5idW5kbGVzO1xyXG5cclxuXHRcdF9jaGFpbktleXNbIDAgXSA9IGJ1bmRsZUdyb3VwO1xyXG5cdFx0X2NoYWluS2V5c1sgMSBdID0gY2FtZXJhO1xyXG5cclxuXHRcdGxldCBidW5kbGUgPSBidW5kbGVzLmdldCggX2NoYWluS2V5cyApO1xyXG5cclxuXHRcdGlmICggYnVuZGxlID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRidW5kbGUgPSBuZXcgUmVuZGVyQnVuZGxlKCBidW5kbGVHcm91cCwgY2FtZXJhICk7XHJcblx0XHRcdGJ1bmRsZXMuc2V0KCBfY2hhaW5LZXlzLCBidW5kbGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0X2NoYWluS2V5cy5sZW5ndGggPSAwO1xyXG5cclxuXHRcdHJldHVybiBidW5kbGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRnJlZXMgYWxsIGludGVybmFsIHJlc291cmNlcy5cclxuXHQgKi9cclxuXHRkaXNwb3NlKCkge1xyXG5cclxuXHRcdHRoaXMuYnVuZGxlcyA9IG5ldyBDaGFpbk1hcCgpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBSZW5kZXJCdW5kbGVzO1xyXG4iLCIvKipcclxuICogVGhlIHB1cnBvc2Ugb2YgYSBub2RlIGxpYnJhcnkgaXMgdG8gYXNzaWduIG5vZGUgaW1wbGVtZW50YXRpb25zXHJcbiAqIHRvIGV4aXN0aW5nIGxpYnJhcnkgZmVhdHVyZXMuIEluIGBXZWJHUFVSZW5kZXJlcmAgbGlnaHRzLCBtYXRlcmlhbHNcclxuICogd2hpY2ggYXJlIG5vdCBiYXNlZCBvbiBgTm9kZU1hdGVyaWFsYCBhcyB3ZWxsIGFzIHRvbmUgbWFwcGluZyB0ZWNobmlxdWVzXHJcbiAqIGFyZSBpbXBsZW1lbnRlZCB3aXRoIG5vZGUtYmFzZWQgbW9kdWxlcy5cclxuICpcclxuICogQHByaXZhdGVcclxuICovXHJcbmNsYXNzIE5vZGVMaWJyYXJ5IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBub2RlIGxpYnJhcnkuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHdlYWsgbWFwIHRoYXQgbWFwcyBsaWdodHMgdG8gbGlnaHQgbm9kZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1dlYWtNYXA8TGlnaHQuY29uc3RydWN0b3IsQW5hbHl0aWNMaWdodE5vZGUuY29uc3RydWN0b3I+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmxpZ2h0Tm9kZXMgPSBuZXcgV2Vha01hcCgpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBtYXAgdGhhdCBtYXBzIG1hdGVyaWFscyB0byBub2RlIG1hdGVyaWFscy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7TWFwPHN0cmluZyxOb2RlTWF0ZXJpYWwuY29uc3RydWN0b3I+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm1hdGVyaWFsTm9kZXMgPSBuZXcgTWFwKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIG1hcCB0aGF0IG1hcHMgdG9uZSBtYXBwaW5nIHRlY2huaXF1ZXMgKGNvbnN0YW50cylcclxuXHRcdCAqIHRvIHRvbmUgbWFwcGluZyBub2RlIGZ1bmN0aW9ucy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7TWFwPG51bWJlcixGdW5jdGlvbj59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudG9uZU1hcHBpbmdOb2RlcyA9IG5ldyBNYXAoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbWF0Y2hpbmcgbm9kZSBtYXRlcmlhbCBpbnN0YW5jZSBmb3IgdGhlIGdpdmVuIG1hdGVyaWFsIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGFsc28gYXNzaWducy9jb3BpZXMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuIG1hdGVyaWFsIG9iamVjdFxyXG5cdCAqIHRvIHRoZSBub2RlIG1hdGVyaWFsLiBUaGlzIGlzIGRvbmUgdG8gbWFrZSBzdXJlIHRoZSBjdXJyZW50IG1hdGVyaWFsXHJcblx0ICogY29uZmlndXJhdGlvbiBjYXJyaWVzIG92ZXIgdG8gdGhlIG5vZGUgdmVyc2lvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TWF0ZXJpYWx9IG1hdGVyaWFsIC0gQSBtYXRlcmlhbC5cclxuXHQgKiBAcmV0dXJuIHtOb2RlTWF0ZXJpYWx9IFRoZSBjb3JyZXNwb25kaW5nIG5vZGUgbWF0ZXJpYWwuXHJcblx0ICovXHJcblx0ZnJvbU1hdGVyaWFsKCBtYXRlcmlhbCApIHtcclxuXHJcblx0XHRpZiAoIG1hdGVyaWFsLmlzTm9kZU1hdGVyaWFsICkgcmV0dXJuIG1hdGVyaWFsO1xyXG5cclxuXHRcdGxldCBub2RlTWF0ZXJpYWwgPSBudWxsO1xyXG5cclxuXHRcdGNvbnN0IG5vZGVNYXRlcmlhbENsYXNzID0gdGhpcy5nZXRNYXRlcmlhbE5vZGVDbGFzcyggbWF0ZXJpYWwudHlwZSApO1xyXG5cclxuXHRcdGlmICggbm9kZU1hdGVyaWFsQ2xhc3MgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRub2RlTWF0ZXJpYWwgPSBuZXcgbm9kZU1hdGVyaWFsQ2xhc3MoKTtcclxuXHJcblx0XHRcdGZvciAoIGNvbnN0IGtleSBpbiBtYXRlcmlhbCApIHtcclxuXHJcblx0XHRcdFx0bm9kZU1hdGVyaWFsWyBrZXkgXSA9IG1hdGVyaWFsWyBrZXkgXTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG5vZGVNYXRlcmlhbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIGEgdG9uZSBtYXBwaW5nIG5vZGUgZnVuY3Rpb24gZm9yIGEgdG9uZSBtYXBwaW5nIHRlY2huaXF1ZSAoY29uc3RhbnQpLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gdG9uZU1hcHBpbmdOb2RlIC0gVGhlIHRvbmUgbWFwcGluZyBub2RlIGZ1bmN0aW9uLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0b25lTWFwcGluZyAtIFRoZSB0b25lIG1hcHBpbmcuXHJcblx0ICovXHJcblx0YWRkVG9uZU1hcHBpbmcoIHRvbmVNYXBwaW5nTm9kZSwgdG9uZU1hcHBpbmcgKSB7XHJcblxyXG5cdFx0dGhpcy5hZGRUeXBlKCB0b25lTWFwcGluZ05vZGUsIHRvbmVNYXBwaW5nLCB0aGlzLnRvbmVNYXBwaW5nTm9kZXMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgdG9uZSBtYXBwaW5nIG5vZGUgZnVuY3Rpb24gZm9yIGEgdG9uZSBtYXBwaW5nIHRlY2huaXF1ZSAoY29uc3RhbnQpLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHRvbmVNYXBwaW5nIC0gVGhlIHRvbmUgbWFwcGluZy5cclxuXHQgKiBAcmV0dXJuIHs/RnVuY3Rpb259IFRoZSB0b25lIG1hcHBpbmcgbm9kZSBmdW5jdGlvbi4gUmV0dXJucyBgbnVsbGAgaWYgbm8gbm9kZSBmdW5jdGlvbiBpcyBmb3VuZC5cclxuXHQgKi9cclxuXHRnZXRUb25lTWFwcGluZ0Z1bmN0aW9uKCB0b25lTWFwcGluZyApIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy50b25lTWFwcGluZ05vZGVzLmdldCggdG9uZU1hcHBpbmcgKSB8fCBudWxsO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBub2RlIG1hdGVyaWFsIGNsYXNzIGRlZmluaXRpb24gZm9yIGEgbWF0ZXJpYWwgdHlwZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBtYXRlcmlhbFR5cGUgLSBUaGUgbWF0ZXJpYWwgdHlwZS5cclxuXHQgKiBAcmV0dXJuIHs/Tm9kZU1hdGVyaWFsLmNvbnN0cnVjdG9yfSBUaGUgbm9kZSBtYXRlcmlhbCBjbGFzcyBkZWZpbml0aW9uLiBSZXR1cm5zIGBudWxsYCBpZiBubyBub2RlIG1hdGVyaWFsIGlzIGZvdW5kLlxyXG5cdCAqL1xyXG5cdGdldE1hdGVyaWFsTm9kZUNsYXNzKCBtYXRlcmlhbFR5cGUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubWF0ZXJpYWxOb2Rlcy5nZXQoIG1hdGVyaWFsVHlwZSApIHx8IG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyBhIG5vZGUgbWF0ZXJpYWwgY2xhc3MgZGVmaW5pdGlvbiBmb3IgYSBnaXZlbiBtYXRlcmlhbCB0eXBlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlTWF0ZXJpYWwuY29uc3RydWN0b3J9IG1hdGVyaWFsTm9kZUNsYXNzIC0gVGhlIG5vZGUgbWF0ZXJpYWwgY2xhc3MgZGVmaW5pdGlvbi5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbWF0ZXJpYWxDbGFzc1R5cGUgLSBUaGUgbWF0ZXJpYWwgdHlwZS5cclxuXHQgKi9cclxuXHRhZGRNYXRlcmlhbCggbWF0ZXJpYWxOb2RlQ2xhc3MsIG1hdGVyaWFsQ2xhc3NUeXBlICkge1xyXG5cclxuXHRcdHRoaXMuYWRkVHlwZSggbWF0ZXJpYWxOb2RlQ2xhc3MsIG1hdGVyaWFsQ2xhc3NUeXBlLCB0aGlzLm1hdGVyaWFsTm9kZXMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbGlnaHQgbm9kZSBjbGFzcyBkZWZpbml0aW9uIGZvciBhIGxpZ2h0IGNsYXNzIGRlZmluaXRpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0xpZ2h0LmNvbnN0cnVjdG9yfSBsaWdodCAtIFRoZSBsaWdodCBjbGFzcyBkZWZpbml0aW9uLlxyXG5cdCAqIEByZXR1cm4gez9BbmFseXRpY0xpZ2h0Tm9kZS5jb25zdHJ1Y3Rvcn0gVGhlIGxpZ2h0IG5vZGUgY2xhc3MgZGVmaW5pdGlvbi4gUmV0dXJucyBgbnVsbGAgaWYgbm8gbGlnaHQgbm9kZSBpcyBmb3VuZC5cclxuXHQgKi9cclxuXHRnZXRMaWdodE5vZGVDbGFzcyggbGlnaHQgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubGlnaHROb2Rlcy5nZXQoIGxpZ2h0ICkgfHwgbnVsbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIGEgbGlnaHQgbm9kZSBjbGFzcyBkZWZpbml0aW9uIGZvciBhIGdpdmVuIGxpZ2h0IGNsYXNzIGRlZmluaXRpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0FuYWx5dGljTGlnaHROb2RlLmNvbnN0cnVjdG9yfSBsaWdodE5vZGVDbGFzcyAtIFRoZSBsaWdodCBub2RlIGNsYXNzIGRlZmluaXRpb24uXHJcblx0ICogQHBhcmFtIHtMaWdodC5jb25zdHJ1Y3Rvcn0gbGlnaHRDbGFzcyAtIFRoZSBsaWdodCBjbGFzcyBkZWZpbml0aW9uLlxyXG5cdCAqL1xyXG5cdGFkZExpZ2h0KCBsaWdodE5vZGVDbGFzcywgbGlnaHRDbGFzcyApIHtcclxuXHJcblx0XHR0aGlzLmFkZENsYXNzKCBsaWdodE5vZGVDbGFzcywgbGlnaHRDbGFzcywgdGhpcy5saWdodE5vZGVzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyBhIG5vZGUgY2xhc3MgZGVmaW5pdGlvbiBmb3IgdGhlIGdpdmVuIHR5cGUgdG8gdGhlIHByb3ZpZGVkIHR5cGUgbGlicmFyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7YW55fSBub2RlQ2xhc3MgLSBUaGUgbm9kZSBjbGFzcyBkZWZpbml0aW9uLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gdHlwZSAtIFRoZSBvYmplY3QgdHlwZS5cclxuXHQgKiBAcGFyYW0ge01hcH0gbGlicmFyeSAtIFRoZSB0eXBlIGxpYnJhcnkuXHJcblx0ICovXHJcblx0YWRkVHlwZSggbm9kZUNsYXNzLCB0eXBlLCBsaWJyYXJ5ICkge1xyXG5cclxuXHRcdGlmICggbGlicmFyeS5oYXMoIHR5cGUgKSApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUud2FybiggYFJlZGVmaW5pdGlvbiBvZiBub2RlICR7IHR5cGUgfWAgKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHR5cGVvZiBub2RlQ2xhc3MgIT09ICdmdW5jdGlvbicgKSB0aHJvdyBuZXcgRXJyb3IoIGBOb2RlIGNsYXNzICR7IG5vZGVDbGFzcy5uYW1lIH0gaXMgbm90IGEgY2xhc3MuYCApO1xyXG5cdFx0aWYgKCB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgKSB0aHJvdyBuZXcgRXJyb3IoIGBCYXNlIGNsYXNzICR7IHR5cGUgfSBpcyBub3QgYSBjbGFzcy5gICk7XHJcblxyXG5cdFx0bGlicmFyeS5zZXQoIHR5cGUsIG5vZGVDbGFzcyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgYSBub2RlIGNsYXNzIGRlZmluaXRpb24gZm9yIHRoZSBnaXZlbiBjbGFzcyBkZWZpbml0aW9uIHRvIHRoZSBwcm92aWRlZCB0eXBlIGxpYnJhcnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge2FueX0gbm9kZUNsYXNzIC0gVGhlIG5vZGUgY2xhc3MgZGVmaW5pdGlvbi5cclxuXHQgKiBAcGFyYW0ge2FueX0gYmFzZUNsYXNzIC0gVGhlIGNsYXNzIGRlZmluaXRpb24uXHJcblx0ICogQHBhcmFtIHtXZWFrTWFwfSBsaWJyYXJ5IC0gVGhlIHR5cGUgbGlicmFyeS5cclxuXHQgKi9cclxuXHRhZGRDbGFzcyggbm9kZUNsYXNzLCBiYXNlQ2xhc3MsIGxpYnJhcnkgKSB7XHJcblxyXG5cdFx0aWYgKCBsaWJyYXJ5LmhhcyggYmFzZUNsYXNzICkgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLndhcm4oIGBSZWRlZmluaXRpb24gb2Ygbm9kZSAkeyBiYXNlQ2xhc3MubmFtZSB9YCApO1xyXG5cdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdHlwZW9mIG5vZGVDbGFzcyAhPT0gJ2Z1bmN0aW9uJyApIHRocm93IG5ldyBFcnJvciggYE5vZGUgY2xhc3MgJHsgbm9kZUNsYXNzLm5hbWUgfSBpcyBub3QgYSBjbGFzcy5gICk7XHJcblx0XHRpZiAoIHR5cGVvZiBiYXNlQ2xhc3MgIT09ICdmdW5jdGlvbicgKSB0aHJvdyBuZXcgRXJyb3IoIGBCYXNlIGNsYXNzICR7IGJhc2VDbGFzcy5uYW1lIH0gaXMgbm90IGEgY2xhc3MuYCApO1xyXG5cclxuXHRcdGxpYnJhcnkuc2V0KCBiYXNlQ2xhc3MsIG5vZGVDbGFzcyApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBOb2RlTGlicmFyeTtcclxuIiwiaW1wb3J0IHsgTGlnaHRzTm9kZSB9IGZyb20gJy4uLy4uL25vZGVzL05vZGVzLmpzJztcclxuaW1wb3J0IENoYWluTWFwIGZyb20gJy4vQ2hhaW5NYXAuanMnO1xyXG5cclxuY29uc3QgX2RlZmF1bHRMaWdodHMgPSAvKkBfX1BVUkVfXyovIG5ldyBMaWdodHNOb2RlKCk7XHJcbmNvbnN0IF9jaGFpbktleXMgPSBbXTtcclxuXHJcbi8qKlxyXG4gKiBUaGlzIHJlbmRlcmVyIG1vZHVsZSBtYW5hZ2VzIHRoZSBsaWdodHMgbm9kZXMgd2hpY2ggYXJlIHVuaXF1ZVxyXG4gKiBwZXIgc2NlbmUgYW5kIGNhbWVyYSBjb21iaW5hdGlvbi5cclxuICpcclxuICogVGhlIGxpZ2h0cyBub2RlIGl0c2VsZiBpcyBsYXRlciBjb25maWd1cmVkIGluIHRoZSByZW5kZXIgbGlzdFxyXG4gKiB3aXRoIHRoZSBhY3R1YWwgbGlnaHRzIGZyb20gdGhlIHNjZW5lLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAYXVnbWVudHMgQ2hhaW5NYXBcclxuICovXHJcbmNsYXNzIExpZ2h0aW5nIGV4dGVuZHMgQ2hhaW5NYXAge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbGlnaHRpbmcgbWFuYWdlbWVudCBjb21wb25lbnQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGEgbmV3IGxpZ2h0cyBub2RlIGZvciB0aGUgZ2l2ZW4gYXJyYXkgb2YgbGlnaHRzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtBcnJheTxMaWdodD59IGxpZ2h0cyAtIFRoZSByZW5kZXIgb2JqZWN0LlxyXG5cdCAqIEByZXR1cm4ge0xpZ2h0c05vZGV9IFRoZSBsaWdodHMgbm9kZS5cclxuXHQgKi9cclxuXHRjcmVhdGVOb2RlKCBsaWdodHMgPSBbXSApIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IExpZ2h0c05vZGUoKS5zZXRMaWdodHMoIGxpZ2h0cyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBsaWdodHMgbm9kZSBmb3IgdGhlIGdpdmVuIHNjZW5lIGFuZCBjYW1lcmEuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1NjZW5lfSBzY2VuZSAtIFRoZSBzY2VuZS5cclxuXHQgKiBAcGFyYW0ge0NhbWVyYX0gY2FtZXJhIC0gVGhlIGNhbWVyYS5cclxuXHQgKiBAcmV0dXJuIHtMaWdodHNOb2RlfSBUaGUgbGlnaHRzIG5vZGUuXHJcblx0ICovXHJcblx0Z2V0Tm9kZSggc2NlbmUsIGNhbWVyYSApIHtcclxuXHJcblx0XHQvLyBpZ25vcmUgcG9zdC1wcm9jZXNzaW5nXHJcblxyXG5cdFx0aWYgKCBzY2VuZS5pc1F1YWRNZXNoICkgcmV0dXJuIF9kZWZhdWx0TGlnaHRzO1xyXG5cclxuXHRcdF9jaGFpbktleXNbIDAgXSA9IHNjZW5lO1xyXG5cdFx0X2NoYWluS2V5c1sgMSBdID0gY2FtZXJhO1xyXG5cclxuXHRcdGxldCBub2RlID0gdGhpcy5nZXQoIF9jaGFpbktleXMgKTtcclxuXHJcblx0XHRpZiAoIG5vZGUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcclxuXHRcdFx0dGhpcy5zZXQoIF9jaGFpbktleXMsIG5vZGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0X2NoYWluS2V5cy5sZW5ndGggPSAwO1xyXG5cclxuXHRcdHJldHVybiBub2RlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBMaWdodGluZztcclxuIiwiaW1wb3J0IHsgUmVuZGVyVGFyZ2V0IH0gZnJvbSAnLi4vLi4vY29yZS9SZW5kZXJUYXJnZXQuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgc3BlY2lhbCB0eXBlIG9mIHJlbmRlciB0YXJnZXQgdGhhdCBpcyB1c2VkIHdoZW4gcmVuZGVyaW5nXHJcbiAqIHdpdGggdGhlIFdlYlhSIERldmljZSBBUEkuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBhdWdtZW50cyBSZW5kZXJUYXJnZXRcclxuICovXHJcbmNsYXNzIFhSUmVuZGVyVGFyZ2V0IGV4dGVuZHMgUmVuZGVyVGFyZ2V0IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBYUiByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt3aWR0aD0xXSAtIFRoZSB3aWR0aCBvZiB0aGUgcmVuZGVyIHRhcmdldC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2hlaWdodD0xXSAtIFRoZSBoZWlnaHQgb2YgdGhlIHJlbmRlciB0YXJnZXQuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSAtIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHdpZHRoID0gMSwgaGVpZ2h0ID0gMSwgb3B0aW9ucyA9IHt9ICkge1xyXG5cclxuXHRcdHN1cGVyKCB3aWR0aCwgaGVpZ2h0LCBvcHRpb25zICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzWFJSZW5kZXJUYXJnZXQgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgYXR0YWNobWVudHMgb2YgdGhlIHJlbmRlciB0YXJnZXRcclxuXHRcdCAqIGFyZSBkZWZpbmVkIGJ5IGV4dGVybmFsIHRleHR1cmVzLiBUaGlzIGZsYWcgaXNcclxuXHRcdCAqIHNldCB0byBgdHJ1ZWAgd2hlbiB1c2luZyB0aGUgV2ViWFIgTGF5ZXJzIEFQSS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaGFzRXh0ZXJuYWxUZXh0dXJlcyA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciBhIGRlcHRoIGJ1ZmZlciBzaG91bGQgYXV0b21hdGljYWxseSBiZSBhbGxvY2F0ZWRcclxuXHRcdCAqIGZvciB0aGlzIFhSIHJlbmRlciB0YXJnZXQgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEFsbG9jYXRpbmcgYSBkZXB0aCBidWZmZXIgaXMgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgWFIgcmVuZGVyXHJcblx0XHQgKiB0YXJnZXRzLiBIb3dldmVyLCB3aGVuIHVzaW5nIHRoZSBXZWJYUiBMYXllcnMgQVBJLCB0aGlzIGZsYWdcclxuXHRcdCAqIG11c3QgYmUgc2V0IHRvIGBmYWxzZWAgd2hlbiB0aGUgYGlnbm9yZURlcHRoVmFsdWVzYCBwcm9wZXJ0eSBvZlxyXG5cdFx0ICogdGhlIHByb2plY3Rpb24gbGF5ZXJzIGV2YWx1YXRlcyB0byBgZmFsc2VgLlxyXG5cdFx0ICpcclxuXHRcdCAqIFJlZmVyZW5jZToge0BsaW5rIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJ4cmxheWVycy0xLyNkb20teHJwcm9qZWN0aW9ubGF5ZXItaWdub3JlZGVwdGh2YWx1ZXN9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmF1dG9BbGxvY2F0ZURlcHRoQnVmZmVyID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHRjb3B5KCBzb3VyY2UgKSB7XHJcblxyXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XHJcblxyXG5cdFx0dGhpcy5oYXNFeHRlcm5hbFRleHR1cmVzID0gc291cmNlLmhhc0V4dGVybmFsVGV4dHVyZXM7XHJcblx0XHR0aGlzLmF1dG9BbGxvY2F0ZURlcHRoQnVmZmVyID0gc291cmNlLmF1dG9BbGxvY2F0ZURlcHRoQnVmZmVyO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgWFJSZW5kZXJUYXJnZXQgfTtcclxuIiwiaW1wb3J0IHsgQXJyYXlDYW1lcmEgfSBmcm9tICcuLi8uLi9jYW1lcmFzL0FycmF5Q2FtZXJhLmpzJztcclxuaW1wb3J0IHsgRXZlbnREaXNwYXRjaGVyIH0gZnJvbSAnLi4vLi4vY29yZS9FdmVudERpc3BhdGNoZXIuanMnO1xyXG5pbXBvcnQgeyBQZXJzcGVjdGl2ZUNhbWVyYSB9IGZyb20gJy4uLy4uL2NhbWVyYXMvUGVyc3BlY3RpdmVDYW1lcmEuanMnO1xyXG5pbXBvcnQgeyBRdWF0ZXJuaW9uIH0gZnJvbSAnLi4vLi4vbWF0aC9RdWF0ZXJuaW9uLmpzJztcclxuaW1wb3J0IHsgUkFEMkRFRyB9IGZyb20gJy4uLy4uL21hdGgvTWF0aFV0aWxzLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMi5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjMuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3I0IH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3I0LmpzJztcclxuaW1wb3J0IHsgV2ViWFJDb250cm9sbGVyIH0gZnJvbSAnLi4vd2VieHIvV2ViWFJDb250cm9sbGVyLmpzJztcclxuaW1wb3J0IHsgQWRkRXF1YXRpb24sIEJhY2tTaWRlLCBDdXN0b21CbGVuZGluZywgRGVwdGhGb3JtYXQsIERlcHRoU3RlbmNpbEZvcm1hdCwgRnJvbnRTaWRlLCBSR0JBRm9ybWF0LCBVbnNpZ25lZEJ5dGVUeXBlLCBVbnNpZ25lZEludDI0OFR5cGUsIFVuc2lnbmVkSW50VHlwZSwgWmVyb0ZhY3RvciB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IERlcHRoVGV4dHVyZSB9IGZyb20gJy4uLy4uL3RleHR1cmVzL0RlcHRoVGV4dHVyZS5qcyc7XHJcbmltcG9ydCB7IFhSUmVuZGVyVGFyZ2V0IH0gZnJvbSAnLi9YUlJlbmRlclRhcmdldC5qcyc7XHJcbmltcG9ydCB7IEN5bGluZGVyR2VvbWV0cnkgfSBmcm9tICcuLi8uLi9nZW9tZXRyaWVzL0N5bGluZGVyR2VvbWV0cnkuanMnO1xyXG5pbXBvcnQgeyBQbGFuZUdlb21ldHJ5IH0gZnJvbSAnLi4vLi4vZ2VvbWV0cmllcy9QbGFuZUdlb21ldHJ5LmpzJztcclxuaW1wb3J0IHsgTWVzaEJhc2ljTWF0ZXJpYWwgfSBmcm9tICcuLi8uLi9tYXRlcmlhbHMvTWVzaEJhc2ljTWF0ZXJpYWwuanMnO1xyXG5pbXBvcnQgeyBNZXNoIH0gZnJvbSAnLi4vLi4vb2JqZWN0cy9NZXNoLmpzJztcclxuXHJcbmNvbnN0IF9jYW1lcmFMUG9zID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xyXG5jb25zdCBfY2FtZXJhUlBvcyA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcclxuXHJcbi8qKlxyXG4gKiBUaGUgWFIgbWFuYWdlciBpcyBidWlsdCBvbiB0b3Agb2YgdGhlIFdlYlhSIERldmljZSBBUEkgdG9cclxuICogbWFuYWdlIFhSIHNlc3Npb25zIHdpdGggYFdlYkdQVVJlbmRlcmVyYC5cclxuICpcclxuICogWFIgaXMgY3VycmVudGx5IG9ubHkgc3VwcG9ydGVkIHdpdGggYSBXZWJHTCAyIGJhY2tlbmQuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBFdmVudERpc3BhdGNoZXJcclxuICovXHJcbmNsYXNzIFhSTWFuYWdlciBleHRlbmRzIEV2ZW50RGlzcGF0Y2hlciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgWFIgbWFuYWdlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCByZW5kZXJlciApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGdsb2JhbGx5IGVuYWJsZXMgWFIgcmVuZGVyaW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5lbmFibGVkID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSBYUiBkZXZpY2UgaXMgY3VycmVudGx5IHByZXNlbnRpbmcgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzUHJlc2VudGluZyA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgWFIgY2FtZXJhIHNob3VsZCBhdXRvbWF0aWNhbGx5IGJlIHVwZGF0ZWQgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNhbWVyYUF1dG9VcGRhdGUgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJlbmRlcmVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7UmVuZGVyZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX3JlbmRlcmVyID0gcmVuZGVyZXI7XHJcblxyXG5cdFx0Ly8gY2FtZXJhXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXByZXNlbnRzIHRoZSBjYW1lcmEgZm9yIHRoZSBsZWZ0IGV5ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge1BlcnNwZWN0aXZlQ2FtZXJhfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9jYW1lcmFMID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCk7XHJcblx0XHR0aGlzLl9jYW1lcmFMLnZpZXdwb3J0ID0gbmV3IFZlY3RvcjQoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlcHJlc2VudHMgdGhlIGNhbWVyYSBmb3IgdGhlIHJpZ2h0IGV5ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge1BlcnNwZWN0aXZlQ2FtZXJhfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9jYW1lcmFSID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCk7XHJcblx0XHR0aGlzLl9jYW1lcmFSLnZpZXdwb3J0ID0gbmV3IFZlY3RvcjQoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgbGlzdCBvZiBjYW1lcmFzIHVzZWQgZm9yIHJlbmRlcmluZyB0aGUgWFIgdmlld3MuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxDYW1lcmE+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9jYW1lcmFzID0gWyB0aGlzLl9jYW1lcmFMLCB0aGlzLl9jYW1lcmFSIF07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbWFpbiBYUiBjYW1lcmEuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHtBcnJheUNhbWVyYX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fY2FtZXJhWFIgPSBuZXcgQXJyYXlDYW1lcmEoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjdXJyZW50IG5lYXIgdmFsdWUgb2YgdGhlIFhSIGNhbWVyYS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUgez9udW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX2N1cnJlbnREZXB0aE5lYXIgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGN1cnJlbnQgZmFyIHZhbHVlIG9mIHRoZSBYUiBjYW1lcmEuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHs/bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9jdXJyZW50RGVwdGhGYXIgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBsaXN0IG9mIFdlYlhSIGNvbnRyb2xsZXJzIHJlcXVlc3RlZCBieSB0aGUgYXBwbGljYXRpb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxXZWJYUkNvbnRyb2xsZXI+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9jb250cm9sbGVycyA9IFtdO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBsaXN0IG9mIFhSIGlucHV0IHNvdXJjZS4gRWFjaCBpbnB1dCBzb3VyY2UgYmVsb25ncyB0b1xyXG5cdFx0ICogYW4gaW5zdGFuY2Ugb2YgV2ViWFJDb250cm9sbGVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8WFJJbnB1dFNvdXJjZT8+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9jb250cm9sbGVySW5wdXRTb3VyY2VzID0gW107XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgWFIgcmVuZGVyIHRhcmdldCB0aGF0IHJlcHJlc2VudHMgdGhlIHJlbmRlcmluZyBkZXN0aW5hdGlvblxyXG5cdFx0ICogZHVyaW5nIGFuIGFjdGl2ZSBYUiBzZXNzaW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7P1JlbmRlclRhcmdldH1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5feHJSZW5kZXJUYXJnZXQgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQW4gYXJyYXkgaG9sZGluZyBhbGwgdGhlIG5vbi1wcm9qZWN0aW9uIGxheWVyc1xyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8T2JqZWN0Pn1cclxuXHRcdCAqIEBkZWZhdWx0IFtdXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX2xheWVycyA9IFtdO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgZGV2aWNlIGhhcyBzdXBwb3J0IGZvciBhbGwgbGF5ZXIgdHlwZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9zdXBwb3J0c0xheWVycyA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBuYXRpdmUgV2ViWFIgTGF5ZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHtGdW5jdGlvbn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fY3JlYXRlWFJMYXllciA9IGNyZWF0ZVhSTGF5ZXIuYmluZCggdGhpcyApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0KiBUaGUgY3VycmVudCBXZWJHTCBjb250ZXh0LlxyXG5cdFx0KlxyXG5cdFx0KiBAcHJpdmF0ZVxyXG5cdFx0KiBAdHlwZSB7P1dlYkdMMlJlbmRlcmluZ0NvbnRleHR9XHJcblx0XHQqIEBkZWZhdWx0IG51bGxcclxuXHRcdCovXHJcblx0XHR0aGlzLl9nbCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY3VycmVudCBhbmltYXRpb24gY29udGV4dC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUgez9XaW5kb3d9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX2N1cnJlbnRBbmltYXRpb25Db250ZXh0ID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjdXJyZW50IGFuaW1hdGlvbiBsb29wLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7P0Z1bmN0aW9ufVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9jdXJyZW50QW5pbWF0aW9uTG9vcCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY3VycmVudCBwaXhlbCByYXRpby5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUgez9udW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX2N1cnJlbnRQaXhlbFJhdGlvID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjdXJyZW50IHNpemUgb2YgdGhlIHJlbmRlcmVyJ3MgY2FudmFzXHJcblx0XHQgKiBpbiBsb2dpY2FsIHBpeGVsIHVuaXQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3IyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9jdXJyZW50U2l6ZSA9IG5ldyBWZWN0b3IyKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZGVmYXVsdCBldmVudCBsaXN0ZW5lciBmb3IgaGFuZGxpbmcgZXZlbnRzIGluc2lkZSBhIFhSIHNlc3Npb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHtGdW5jdGlvbn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fb25TZXNzaW9uRXZlbnQgPSBvblNlc3Npb25FdmVudC5iaW5kKCB0aGlzICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZXZlbnQgbGlzdGVuZXIgZm9yIGhhbmRsaW5nIHRoZSBlbmQgb2YgYSBYUiBzZXNzaW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7RnVuY3Rpb259XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX29uU2Vzc2lvbkVuZCA9IG9uU2Vzc2lvbkVuZC5iaW5kKCB0aGlzICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZXZlbnQgbGlzdGVuZXIgZm9yIGhhbmRsaW5nIHRoZSBgaW5wdXRzb3VyY2VzY2hhbmdlYCBldmVudC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge0Z1bmN0aW9ufVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9vbklucHV0U291cmNlc0NoYW5nZSA9IG9uSW5wdXRTb3VyY2VzQ2hhbmdlLmJpbmQoIHRoaXMgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBhbmltYXRpb24gbG9vcCB3aGljaCBpcyB1c2VkIGFzIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBkZWZhdWx0XHJcblx0XHQgKiBhbmltYXRpb24gbG9vcCBvZiB0aGUgYXBwbGljYXRpb24uIEl0IGlzIG9ubHkgdXNlZCB3aGVuIGEgWFIgc2Vzc2lvblxyXG5cdFx0ICogaXMgYWN0aXZlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7RnVuY3Rpb259XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX29uQW5pbWF0aW9uRnJhbWUgPSBvbkFuaW1hdGlvbkZyYW1lLmJpbmQoIHRoaXMgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjdXJyZW50IFhSIHJlZmVyZW5jZSBzcGFjZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUgez9YUlJlZmVyZW5jZVNwYWNlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9yZWZlcmVuY2VTcGFjZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgY3VycmVudCBYUiByZWZlcmVuY2Ugc3BhY2UgdHlwZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge1hSUmVmZXJlbmNlU3BhY2VUeXBlfVxyXG5cdFx0ICogQGRlZmF1bHQgJ2xvY2FsLWZsb29yJ1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9yZWZlcmVuY2VTcGFjZVR5cGUgPSAnbG9jYWwtZmxvb3InO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBjdXN0b20gcmVmZXJlbmNlIHNwYWNlIGRlZmluZWQgYnkgdGhlIGFwcGxpY2F0aW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7P1hSUmVmZXJlbmNlU3BhY2V9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX2N1c3RvbVJlZmVyZW5jZVNwYWNlID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBmcmFtZWJ1ZmZlciBzY2FsZSBmYWN0b3IuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX2ZyYW1lYnVmZmVyU2NhbGVGYWN0b3IgPSAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGZvdmVhdGlvbiBmYWN0b3IuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAxXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX2ZvdmVhdGlvbiA9IDEuMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IFhSIHNlc3Npb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHs/WFJTZXNzaW9ufVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9zZXNzaW9uID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IFhSIGJhc2UgbGF5ZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHs/WFJXZWJHTExheWVyfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9nbEJhc2VMYXllciA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBYUiBiaW5kaW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7P1hSV2ViR0xCaW5kaW5nfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9nbEJpbmRpbmcgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgWFIgcHJvamVjdGlvbiBsYXllci5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUgez9YUlByb2plY3Rpb25MYXllcn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fZ2xQcm9qTGF5ZXIgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgWFIgZnJhbWUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHs/WFJGcmFtZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5feHJGcmFtZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRvIHVzZSB0aGUgV2ViWFIgTGF5ZXJzIEFQSSBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX3VzZUxheWVycyA9ICggdHlwZW9mIFhSV2ViR0xCaW5kaW5nICE9PSAndW5kZWZpbmVkJyAmJiAnY3JlYXRlUHJvamVjdGlvbkxheWVyJyBpbiBYUldlYkdMQmluZGluZy5wcm90b3R5cGUgKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjb21wYXQvY29tcGF0XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiBgVEhSRUUuR3JvdXBgIHRoYXQgcmVwcmVzZW50cyB0aGUgdHJhbnNmb3JtYXRpb25cclxuXHQgKiBvZiBhIFhSIGNvbnRyb2xsZXIgaW4gdGFyZ2V0IHJheSBzcGFjZS4gVGhlIHJlcXVlc3RlZCBjb250cm9sbGVyIGlzIGRlZmluZWRcclxuXHQgKiBieSB0aGUgZ2l2ZW4gaW5kZXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIFhSIGNvbnRyb2xsZXIuXHJcblx0ICogQHJldHVybiB7R3JvdXB9IEEgZ3JvdXAgdGhhdCByZXByZXNlbnRzIHRoZSBjb250cm9sbGVyJ3MgdHJhbnNmb3JtYXRpb24uXHJcblx0ICovXHJcblx0Z2V0Q29udHJvbGxlciggaW5kZXggKSB7XHJcblxyXG5cdFx0Y29uc3QgY29udHJvbGxlciA9IHRoaXMuX2dldENvbnRyb2xsZXIoIGluZGV4ICk7XHJcblxyXG5cdFx0cmV0dXJuIGNvbnRyb2xsZXIuZ2V0VGFyZ2V0UmF5U3BhY2UoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIGBUSFJFRS5Hcm91cGAgdGhhdCByZXByZXNlbnRzIHRoZSB0cmFuc2Zvcm1hdGlvblxyXG5cdCAqIG9mIGEgWFIgY29udHJvbGxlciBpbiBncmlwIHNwYWNlLiBUaGUgcmVxdWVzdGVkIGNvbnRyb2xsZXIgaXMgZGVmaW5lZFxyXG5cdCAqIGJ5IHRoZSBnaXZlbiBpbmRleC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgWFIgY29udHJvbGxlci5cclxuXHQgKiBAcmV0dXJuIHtHcm91cH0gQSBncm91cCB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbnRyb2xsZXIncyB0cmFuc2Zvcm1hdGlvbi5cclxuXHQgKi9cclxuXHRnZXRDb250cm9sbGVyR3JpcCggaW5kZXggKSB7XHJcblxyXG5cdFx0Y29uc3QgY29udHJvbGxlciA9IHRoaXMuX2dldENvbnRyb2xsZXIoIGluZGV4ICk7XHJcblxyXG5cdFx0cmV0dXJuIGNvbnRyb2xsZXIuZ2V0R3JpcFNwYWNlKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiBgVEhSRUUuR3JvdXBgIHRoYXQgcmVwcmVzZW50cyB0aGUgdHJhbnNmb3JtYXRpb25cclxuXHQgKiBvZiBhIFhSIGNvbnRyb2xsZXIgaW4gaGFuZCBzcGFjZS4gVGhlIHJlcXVlc3RlZCBjb250cm9sbGVyIGlzIGRlZmluZWRcclxuXHQgKiBieSB0aGUgZ2l2ZW4gaW5kZXguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIFhSIGNvbnRyb2xsZXIuXHJcblx0ICogQHJldHVybiB7R3JvdXB9IEEgZ3JvdXAgdGhhdCByZXByZXNlbnRzIHRoZSBjb250cm9sbGVyJ3MgdHJhbnNmb3JtYXRpb24uXHJcblx0ICovXHJcblx0Z2V0SGFuZCggaW5kZXggKSB7XHJcblxyXG5cdFx0Y29uc3QgY29udHJvbGxlciA9IHRoaXMuX2dldENvbnRyb2xsZXIoIGluZGV4ICk7XHJcblxyXG5cdFx0cmV0dXJuIGNvbnRyb2xsZXIuZ2V0SGFuZFNwYWNlKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgZm92ZWF0aW9uIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfHVuZGVmaW5lZH0gVGhlIGZvdmVhdGlvbiB2YWx1ZS4gUmV0dXJucyBgdW5kZWZpbmVkYCBpZiBubyBiYXNlIG9yIHByb2plY3Rpb24gbGF5ZXIgaXMgZGVmaW5lZC5cclxuXHQgKi9cclxuXHRnZXRGb3ZlYXRpb24oKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9nbFByb2pMYXllciA9PT0gbnVsbCAmJiB0aGlzLl9nbEJhc2VMYXllciA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzLl9mb3ZlYXRpb247XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZm92ZWF0aW9uIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGZvdmVhdGlvbiAtIEEgbnVtYmVyIGluIHRoZSByYW5nZSBgWzAsMV1gIHdoZXJlIGAwYCBtZWFucyBubyBmb3ZlYXRpb24gKGZ1bGwgcmVzb2x1dGlvbilcclxuXHQgKiBhbmQgYDFgIG1lYW5zIG1heGltdW0gZm92ZWF0aW9uICh0aGUgZWRnZXMgcmVuZGVyIGF0IGxvd2VyIHJlc29sdXRpb24pLlxyXG5cdCAqL1xyXG5cdHNldEZvdmVhdGlvbiggZm92ZWF0aW9uICkge1xyXG5cclxuXHRcdHRoaXMuX2ZvdmVhdGlvbiA9IGZvdmVhdGlvbjtcclxuXHJcblx0XHRpZiAoIHRoaXMuX2dsUHJvakxheWVyICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5fZ2xQcm9qTGF5ZXIuZml4ZWRGb3ZlYXRpb24gPSBmb3ZlYXRpb247XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy5fZ2xCYXNlTGF5ZXIgIT09IG51bGwgJiYgdGhpcy5fZ2xCYXNlTGF5ZXIuZml4ZWRGb3ZlYXRpb24gIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHRoaXMuX2dsQmFzZUxheWVyLmZpeGVkRm92ZWF0aW9uID0gZm92ZWF0aW9uO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBmcmFtZWJ1ZmZlciBzY2FsZSBmYWN0b3IuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBmcmFtZWJ1ZmZlciBzY2FsZSBmYWN0b3IuXHJcblx0ICovXHJcblx0Z2V0RnJhbWVidWZmZXJTY2FsZUZhY3RvcigpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fZnJhbWVidWZmZXJTY2FsZUZhY3RvcjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBmcmFtZWJ1ZmZlciBzY2FsZSBmYWN0b3IuXHJcblx0ICpcclxuXHQgKiBUaGlzIG1ldGhvZCBjYW4gbm90IGJlIHVzZWQgZHVyaW5nIGEgWFIgc2Vzc2lvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBmYWN0b3IgLSBUaGUgZnJhbWVidWZmZXIgc2NhbGUgZmFjdG9yLlxyXG5cdCAqL1xyXG5cdHNldEZyYW1lYnVmZmVyU2NhbGVGYWN0b3IoIGZhY3RvciApIHtcclxuXHJcblx0XHR0aGlzLl9mcmFtZWJ1ZmZlclNjYWxlRmFjdG9yID0gZmFjdG9yO1xyXG5cclxuXHRcdGlmICggdGhpcy5pc1ByZXNlbnRpbmcgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5YUk1hbmFnZXI6IENhbm5vdCBjaGFuZ2UgZnJhbWVidWZmZXIgc2NhbGUgd2hpbGUgcHJlc2VudGluZy4nICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHJlZmVyZW5jZSBzcGFjZSB0eXBlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7WFJSZWZlcmVuY2VTcGFjZVR5cGV9IFRoZSByZWZlcmVuY2Ugc3BhY2UgdHlwZS5cclxuXHQgKi9cclxuXHRnZXRSZWZlcmVuY2VTcGFjZVR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX3JlZmVyZW5jZVNwYWNlVHlwZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSByZWZlcmVuY2Ugc3BhY2UgdHlwZS5cclxuXHQgKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGNhbiBub3QgYmUgdXNlZCBkdXJpbmcgYSBYUiBzZXNzaW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtYUlJlZmVyZW5jZVNwYWNlVHlwZX0gdHlwZSAtIFRoZSByZWZlcmVuY2Ugc3BhY2UgdHlwZS5cclxuXHQgKi9cclxuXHRzZXRSZWZlcmVuY2VTcGFjZVR5cGUoIHR5cGUgKSB7XHJcblxyXG5cdFx0dGhpcy5fcmVmZXJlbmNlU3BhY2VUeXBlID0gdHlwZTtcclxuXHJcblx0XHRpZiAoIHRoaXMuaXNQcmVzZW50aW5nID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuWFJNYW5hZ2VyOiBDYW5ub3QgY2hhbmdlIHJlZmVyZW5jZSBzcGFjZSB0eXBlIHdoaWxlIHByZXNlbnRpbmcuJyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBYUiByZWZlcmVuY2Ugc3BhY2UuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtYUlJlZmVyZW5jZVNwYWNlfSBUaGUgWFIgcmVmZXJlbmNlIHNwYWNlLlxyXG5cdCAqL1xyXG5cdGdldFJlZmVyZW5jZVNwYWNlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9jdXN0b21SZWZlcmVuY2VTcGFjZSB8fCB0aGlzLl9yZWZlcmVuY2VTcGFjZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIGEgY3VzdG9tIFhSIHJlZmVyZW5jZSBzcGFjZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7WFJSZWZlcmVuY2VTcGFjZX0gc3BhY2UgLSBUaGUgWFIgcmVmZXJlbmNlIHNwYWNlLlxyXG5cdCAqL1xyXG5cdHNldFJlZmVyZW5jZVNwYWNlKCBzcGFjZSApIHtcclxuXHJcblx0XHR0aGlzLl9jdXN0b21SZWZlcmVuY2VTcGFjZSA9IHNwYWNlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIFhSIGNhbWVyYS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0FycmF5Q2FtZXJhfSBUaGUgWFIgY2FtZXJhLlxyXG5cdCAqL1xyXG5cdGdldENhbWVyYSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fY2FtZXJhWFI7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgZW52aXJvbm1lbnQgYmxlbmQgbW9kZSBmcm9tIHRoZSBjdXJyZW50IFhSIHNlc3Npb24uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHsnb3BhcXVlJ3wnYWRkaXRpdmUnfCdhbHBoYS1ibGVuZCd8dW5kZWZpbmVkfSBUaGUgZW52aXJvbm1lbnQgYmxlbmQgbW9kZS4gUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHVzZWQgb3V0c2lkZSBvZiBhIFhSIHNlc3Npb24uXHJcblx0ICovXHJcblx0Z2V0RW52aXJvbm1lbnRCbGVuZE1vZGUoKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9zZXNzaW9uICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIHRoaXMuX3Nlc3Npb24uZW52aXJvbm1lbnRCbGVuZE1vZGU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGN1cnJlbnQgWFIgZnJhbWUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHs/WFJGcmFtZX0gVGhlIFhSIGZyYW1lLiBSZXR1cm5zIGBudWxsYCB3aGVuIHVzZWQgb3V0c2lkZSBhIFhSIHNlc3Npb24uXHJcblx0ICovXHJcblx0Z2V0RnJhbWUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX3hyRnJhbWU7XHJcblxyXG5cdH1cclxuXHJcblx0Y3JlYXRlUXVhZExheWVyKCB3aWR0aCwgaGVpZ2h0LCB0cmFuc2xhdGlvbiwgcXVhdGVybmlvbiwgcGl4ZWx3aWR0aCwgcGl4ZWxoZWlnaHQsIHJlbmRlcmNhbGwsIGF0dHJpYnV0ZXMgPSBbXSApIHtcclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeSA9IG5ldyBQbGFuZUdlb21ldHJ5KCB3aWR0aCwgaGVpZ2h0ICk7XHJcblx0XHRjb25zdCByZW5kZXJUYXJnZXQgPSBuZXcgWFJSZW5kZXJUYXJnZXQoXHJcblx0XHRcdHBpeGVsd2lkdGgsXHJcblx0XHRcdHBpeGVsaGVpZ2h0LFxyXG5cdFx0XHR7XHJcblx0XHRcdFx0Zm9ybWF0OiBSR0JBRm9ybWF0LFxyXG5cdFx0XHRcdHR5cGU6IFVuc2lnbmVkQnl0ZVR5cGUsXHJcblx0XHRcdFx0ZGVwdGhUZXh0dXJlOiBuZXcgRGVwdGhUZXh0dXJlKFxyXG5cdFx0XHRcdFx0cGl4ZWx3aWR0aCxcclxuXHRcdFx0XHRcdHBpeGVsaGVpZ2h0LFxyXG5cdFx0XHRcdFx0YXR0cmlidXRlcy5zdGVuY2lsID8gVW5zaWduZWRJbnQyNDhUeXBlIDogVW5zaWduZWRJbnRUeXBlLFxyXG5cdFx0XHRcdFx0dW5kZWZpbmVkLFxyXG5cdFx0XHRcdFx0dW5kZWZpbmVkLFxyXG5cdFx0XHRcdFx0dW5kZWZpbmVkLFxyXG5cdFx0XHRcdFx0dW5kZWZpbmVkLFxyXG5cdFx0XHRcdFx0dW5kZWZpbmVkLFxyXG5cdFx0XHRcdFx0dW5kZWZpbmVkLFxyXG5cdFx0XHRcdFx0YXR0cmlidXRlcy5zdGVuY2lsID8gRGVwdGhTdGVuY2lsRm9ybWF0IDogRGVwdGhGb3JtYXRcclxuXHRcdFx0XHQpLFxyXG5cdFx0XHRcdHN0ZW5jaWxCdWZmZXI6IGF0dHJpYnV0ZXMuc3RlbmNpbCxcclxuXHRcdFx0XHRyZXNvbHZlRGVwdGhCdWZmZXI6IGZhbHNlLFxyXG5cdFx0XHRcdHJlc29sdmVTdGVuY2lsQnVmZmVyOiBmYWxzZVxyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0Y29uc3QgbWF0ZXJpYWwgPSBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IDB4ZmZmZmZmLCBzaWRlOiBGcm9udFNpZGUgfSApO1xyXG5cdFx0bWF0ZXJpYWwubWFwID0gcmVuZGVyVGFyZ2V0LnRleHR1cmU7XHJcblx0XHRtYXRlcmlhbC5tYXAub2Zmc2V0LnkgPSAxO1xyXG5cdFx0bWF0ZXJpYWwubWFwLnJlcGVhdC55ID0gLSAxO1xyXG5cdFx0Y29uc3QgcGxhbmUgPSBuZXcgTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcblx0XHRwbGFuZS5wb3NpdGlvbi5jb3B5KCB0cmFuc2xhdGlvbiApO1xyXG5cdFx0cGxhbmUucXVhdGVybmlvbi5jb3B5KCBxdWF0ZXJuaW9uICk7XHJcblxyXG5cdFx0Y29uc3QgbGF5ZXIgPSB7XHJcblx0XHRcdHR5cGU6ICdxdWFkJyxcclxuXHRcdFx0d2lkdGg6IHdpZHRoLFxyXG5cdFx0XHRoZWlnaHQ6IGhlaWdodCxcclxuXHRcdFx0dHJhbnNsYXRpb246IHRyYW5zbGF0aW9uLFxyXG5cdFx0XHRxdWF0ZXJuaW9uOiBxdWF0ZXJuaW9uLFxyXG5cdFx0XHRwaXhlbHdpZHRoOiBwaXhlbHdpZHRoLFxyXG5cdFx0XHRwaXhlbGhlaWdodDogcGl4ZWxoZWlnaHQsXHJcblx0XHRcdHBsYW5lOiBwbGFuZSxcclxuXHRcdFx0bWF0ZXJpYWw6IG1hdGVyaWFsLFxyXG5cdFx0XHRyZW5kZXJjYWxsOiByZW5kZXJjYWxsLFxyXG5cdFx0XHRyZW5kZXJUYXJnZXQ6IHJlbmRlclRhcmdldCB9O1xyXG5cclxuXHRcdHRoaXMuX2xheWVycy5wdXNoKCBsYXllciApO1xyXG5cclxuXHRcdGlmICggdGhpcy5fc2Vzc2lvbiAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGxheWVyLnBsYW5lLm1hdGVyaWFsID0gbmV3IE1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiAweGZmZmZmZiwgc2lkZTogRnJvbnRTaWRlIH0gKTtcclxuXHRcdFx0bGF5ZXIucGxhbmUubWF0ZXJpYWwuYmxlbmRpbmcgPSBDdXN0b21CbGVuZGluZztcclxuXHRcdFx0bGF5ZXIucGxhbmUubWF0ZXJpYWwuYmxlbmRFcXVhdGlvbiA9IEFkZEVxdWF0aW9uO1xyXG5cdFx0XHRsYXllci5wbGFuZS5tYXRlcmlhbC5ibGVuZFNyYyA9IFplcm9GYWN0b3I7XHJcblx0XHRcdGxheWVyLnBsYW5lLm1hdGVyaWFsLmJsZW5kRHN0ID0gWmVyb0ZhY3RvcjtcclxuXHJcblx0XHRcdGxheWVyLnhybGF5ZXIgPSB0aGlzLl9jcmVhdGVYUkxheWVyKCBsYXllciApO1xyXG5cclxuXHRcdFx0Y29uc3QgeHJsYXllcnMgPSB0aGlzLl9zZXNzaW9uLnJlbmRlclN0YXRlLmxheWVycztcclxuXHRcdFx0eHJsYXllcnMudW5zaGlmdCggbGF5ZXIueHJsYXllciApO1xyXG5cdFx0XHR0aGlzLl9zZXNzaW9uLnVwZGF0ZVJlbmRlclN0YXRlKCB7IGxheWVyczogeHJsYXllcnMgfSApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRyZW5kZXJUYXJnZXQuaXNYUlJlbmRlclRhcmdldCA9IGZhbHNlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcGxhbmU7XHJcblxyXG5cdH1cclxuXHJcblx0Y3JlYXRlQ3lsaW5kZXJMYXllciggcmFkaXVzLCBjZW50cmFsQW5nbGUsIGFzcGVjdHJhdGlvLCB0cmFuc2xhdGlvbiwgcXVhdGVybmlvbiwgcGl4ZWx3aWR0aCwgcGl4ZWxoZWlnaHQsIHJlbmRlcmNhbGwsIGF0dHJpYnV0ZXMgPSBbXSApIHtcclxuXHJcblx0XHRjb25zdCBnZW9tZXRyeSA9IG5ldyBDeWxpbmRlckdlb21ldHJ5KCByYWRpdXMsIHJhZGl1cywgcmFkaXVzICogY2VudHJhbEFuZ2xlIC8gYXNwZWN0cmF0aW8sIDY0LCA2NCwgdHJ1ZSwgTWF0aC5QSSAtIGNlbnRyYWxBbmdsZSAvIDIsIGNlbnRyYWxBbmdsZSApO1xyXG5cdFx0Y29uc3QgcmVuZGVyVGFyZ2V0ID0gbmV3IFhSUmVuZGVyVGFyZ2V0KFxyXG5cdFx0XHRwaXhlbHdpZHRoLFxyXG5cdFx0XHRwaXhlbGhlaWdodCxcclxuXHRcdFx0e1xyXG5cdFx0XHRcdGZvcm1hdDogUkdCQUZvcm1hdCxcclxuXHRcdFx0XHR0eXBlOiBVbnNpZ25lZEJ5dGVUeXBlLFxyXG5cdFx0XHRcdGRlcHRoVGV4dHVyZTogbmV3IERlcHRoVGV4dHVyZShcclxuXHRcdFx0XHRcdHBpeGVsd2lkdGgsXHJcblx0XHRcdFx0XHRwaXhlbGhlaWdodCxcclxuXHRcdFx0XHRcdGF0dHJpYnV0ZXMuc3RlbmNpbCA/IFVuc2lnbmVkSW50MjQ4VHlwZSA6IFVuc2lnbmVkSW50VHlwZSxcclxuXHRcdFx0XHRcdHVuZGVmaW5lZCxcclxuXHRcdFx0XHRcdHVuZGVmaW5lZCxcclxuXHRcdFx0XHRcdHVuZGVmaW5lZCxcclxuXHRcdFx0XHRcdHVuZGVmaW5lZCxcclxuXHRcdFx0XHRcdHVuZGVmaW5lZCxcclxuXHRcdFx0XHRcdHVuZGVmaW5lZCxcclxuXHRcdFx0XHRcdGF0dHJpYnV0ZXMuc3RlbmNpbCA/IERlcHRoU3RlbmNpbEZvcm1hdCA6IERlcHRoRm9ybWF0XHJcblx0XHRcdFx0KSxcclxuXHRcdFx0XHRzdGVuY2lsQnVmZmVyOiBhdHRyaWJ1dGVzLnN0ZW5jaWwsXHJcblx0XHRcdFx0cmVzb2x2ZURlcHRoQnVmZmVyOiBmYWxzZSxcclxuXHRcdFx0XHRyZXNvbHZlU3RlbmNpbEJ1ZmZlcjogZmFsc2VcclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdGNvbnN0IG1hdGVyaWFsID0gbmV3IE1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiAweGZmZmZmZiwgc2lkZTogQmFja1NpZGUgfSApO1xyXG5cdFx0bWF0ZXJpYWwubWFwID0gcmVuZGVyVGFyZ2V0LnRleHR1cmU7XHJcblx0XHRtYXRlcmlhbC5tYXAub2Zmc2V0LnkgPSAxO1xyXG5cdFx0bWF0ZXJpYWwubWFwLnJlcGVhdC55ID0gLSAxO1xyXG5cdFx0Y29uc3QgcGxhbmUgPSBuZXcgTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICk7XHJcblx0XHRwbGFuZS5wb3NpdGlvbi5jb3B5KCB0cmFuc2xhdGlvbiApO1xyXG5cdFx0cGxhbmUucXVhdGVybmlvbi5jb3B5KCBxdWF0ZXJuaW9uICk7XHJcblxyXG5cdFx0Y29uc3QgbGF5ZXIgPSB7XHJcblx0XHRcdHR5cGU6ICdjeWxpbmRlcicsXHJcblx0XHRcdHJhZGl1czogcmFkaXVzLFxyXG5cdFx0XHRjZW50cmFsQW5nbGU6IGNlbnRyYWxBbmdsZSxcclxuXHRcdFx0YXNwZWN0cmF0aW86IGFzcGVjdHJhdGlvLFxyXG5cdFx0XHR0cmFuc2xhdGlvbjogdHJhbnNsYXRpb24sXHJcblx0XHRcdHF1YXRlcm5pb246IHF1YXRlcm5pb24sXHJcblx0XHRcdHBpeGVsd2lkdGg6IHBpeGVsd2lkdGgsXHJcblx0XHRcdHBpeGVsaGVpZ2h0OiBwaXhlbGhlaWdodCxcclxuXHRcdFx0cGxhbmU6IHBsYW5lLFxyXG5cdFx0XHRtYXRlcmlhbDogbWF0ZXJpYWwsXHJcblx0XHRcdHJlbmRlcmNhbGw6IHJlbmRlcmNhbGwsXHJcblx0XHRcdHJlbmRlclRhcmdldDogcmVuZGVyVGFyZ2V0IH07XHJcblxyXG5cdFx0dGhpcy5fbGF5ZXJzLnB1c2goIGxheWVyICk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9zZXNzaW9uICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0bGF5ZXIucGxhbmUubWF0ZXJpYWwgPSBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IDB4ZmZmZmZmLCBzaWRlOiBCYWNrU2lkZSB9ICk7XHJcblx0XHRcdGxheWVyLnBsYW5lLm1hdGVyaWFsLmJsZW5kaW5nID0gQ3VzdG9tQmxlbmRpbmc7XHJcblx0XHRcdGxheWVyLnBsYW5lLm1hdGVyaWFsLmJsZW5kRXF1YXRpb24gPSBBZGRFcXVhdGlvbjtcclxuXHRcdFx0bGF5ZXIucGxhbmUubWF0ZXJpYWwuYmxlbmRTcmMgPSBaZXJvRmFjdG9yO1xyXG5cdFx0XHRsYXllci5wbGFuZS5tYXRlcmlhbC5ibGVuZERzdCA9IFplcm9GYWN0b3I7XHJcblxyXG5cdFx0XHRsYXllci54cmxheWVyID0gdGhpcy5fY3JlYXRlWFJMYXllciggbGF5ZXIgKTtcclxuXHJcblx0XHRcdGNvbnN0IHhybGF5ZXJzID0gdGhpcy5fc2Vzc2lvbi5yZW5kZXJTdGF0ZS5sYXllcnM7XHJcblx0XHRcdHhybGF5ZXJzLnVuc2hpZnQoIGxheWVyLnhybGF5ZXIgKTtcclxuXHRcdFx0dGhpcy5fc2Vzc2lvbi51cGRhdGVSZW5kZXJTdGF0ZSggeyBsYXllcnM6IHhybGF5ZXJzIH0gKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0cmVuZGVyVGFyZ2V0LmlzWFJSZW5kZXJUYXJnZXQgPSBmYWxzZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHBsYW5lO1xyXG5cclxuXHR9XHJcblxyXG5cdHJlbmRlckxheWVycyggKSB7XHJcblxyXG5cdFx0Y29uc3QgdHJhbnNsYXRpb25PYmplY3QgPSBuZXcgVmVjdG9yMygpO1xyXG5cdFx0Y29uc3QgcXVhdGVybmlvbk9iamVjdCA9IG5ldyBRdWF0ZXJuaW9uKCk7XHJcblxyXG5cdFx0Y29uc3Qgd2FzUHJlc2VudGluZyA9IHRoaXMuaXNQcmVzZW50aW5nO1xyXG5cdFx0dGhpcy5pc1ByZXNlbnRpbmcgPSBmYWxzZTtcclxuXHJcblx0XHRmb3IgKCBjb25zdCBsYXllciBvZiB0aGlzLl9sYXllcnMgKSB7XHJcblxyXG5cdFx0XHRsYXllci5yZW5kZXJUYXJnZXQuaXNYUlJlbmRlclRhcmdldCA9IHRoaXMuX3Nlc3Npb24gIT09IG51bGw7XHJcblx0XHRcdGxheWVyLnJlbmRlclRhcmdldC5oYXNFeHRlcm5hbFRleHR1cmVzID0gbGF5ZXIucmVuZGVyVGFyZ2V0LmlzWFJSZW5kZXJUYXJnZXQ7XHJcblx0XHRcdGxheWVyLnJlbmRlclRhcmdldC5hdXRvQWxsb2NhdGVEZXB0aEJ1ZmZlciA9ICEgbGF5ZXIucmVuZGVyVGFyZ2V0LmlzWFJSZW5kZXJUYXJnZXQ7XHJcblxyXG5cdFx0XHRpZiAoIGxheWVyLnJlbmRlclRhcmdldC5pc1hSUmVuZGVyVGFyZ2V0ICYmIHRoaXMuX3N1cHBvcnRzTGF5ZXJzICkge1xyXG5cclxuXHRcdFx0XHRsYXllci54cmxheWVyLnRyYW5zZm9ybSA9IG5ldyBYUlJpZ2lkVHJhbnNmb3JtKCBsYXllci5wbGFuZS5nZXRXb3JsZFBvc2l0aW9uKCB0cmFuc2xhdGlvbk9iamVjdCApLCBsYXllci5wbGFuZS5nZXRXb3JsZFF1YXRlcm5pb24oIHF1YXRlcm5pb25PYmplY3QgKSApO1xyXG5cclxuXHRcdFx0XHRjb25zdCBnbFN1YkltYWdlID0gdGhpcy5fZ2xCaW5kaW5nLmdldFN1YkltYWdlKCBsYXllci54cmxheWVyLCB0aGlzLl94ckZyYW1lICk7XHJcblx0XHRcdFx0dGhpcy5fcmVuZGVyZXIuYmFja2VuZC5zZXRYUlJlbmRlclRhcmdldFRleHR1cmVzKFxyXG5cdFx0XHRcdFx0bGF5ZXIucmVuZGVyVGFyZ2V0LFxyXG5cdFx0XHRcdFx0Z2xTdWJJbWFnZS5jb2xvclRleHR1cmUsXHJcblx0XHRcdFx0XHRnbFN1YkltYWdlLmRlcHRoU3RlbmNpbFRleHR1cmUgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuX3JlbmRlcmVyLnNldFJlbmRlclRhcmdldCggbGF5ZXIucmVuZGVyVGFyZ2V0ICk7XHJcblx0XHRcdGxheWVyLnJlbmRlcmNhbGwoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5pc1ByZXNlbnRpbmcgPSB3YXNQcmVzZW50aW5nO1xyXG5cdFx0dGhpcy5fcmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCBudWxsICk7XHJcblxyXG5cdH1cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGN1cnJlbnQgWFIgc2Vzc2lvbi5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4gez9YUlNlc3Npb259IFRoZSBYUiBzZXNzaW9uLiBSZXR1cm5zIGBudWxsYCB3aGVuIHVzZWQgb3V0c2lkZSBhIFhSIHNlc3Npb24uXHJcblx0ICovXHJcblx0Z2V0U2Vzc2lvbigpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fc2Vzc2lvbjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZnRlciBhIFhSIHNlc3Npb24gaGFzIGJlZW4gcmVxdWVzdGVkIHVzdWFsbHkgd2l0aCBvbmUgb2YgdGhlIGAqQnV0dG9uYCBtb2R1bGVzLCBpdFxyXG5cdCAqIGlzIGluamVjdGVkIGludG8gdGhlIHJlbmRlcmVyIHdpdGggdGhpcyBtZXRob2QuIFRoaXMgbWV0aG9kIHRyaWdnZXJzIHRoZSBzdGFydCBvZlxyXG5cdCAqIHRoZSBhY3R1YWwgWFIgcmVuZGVyaW5nLlxyXG5cdCAqXHJcblx0ICogQGFzeW5jXHJcblx0ICogQHBhcmFtIHtYUlNlc3Npb259IHNlc3Npb24gLSBUaGUgWFIgc2Vzc2lvbiB0byBzZXQuXHJcblx0ICogQHJldHVybiB7UHJvbWlzZX0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgc2Vzc2lvbiBoYXMgYmVlbiBzZXQuXHJcblx0ICovXHJcblx0YXN5bmMgc2V0U2Vzc2lvbiggc2Vzc2lvbiApIHtcclxuXHJcblx0XHRjb25zdCByZW5kZXJlciA9IHRoaXMuX3JlbmRlcmVyO1xyXG5cdFx0Y29uc3QgYmFja2VuZCA9IHJlbmRlcmVyLmJhY2tlbmQ7XHJcblxyXG5cdFx0dGhpcy5fZ2wgPSByZW5kZXJlci5nZXRDb250ZXh0KCk7XHJcblx0XHRjb25zdCBnbCA9IHRoaXMuX2dsO1xyXG5cdFx0Y29uc3QgYXR0cmlidXRlcyA9IGdsLmdldENvbnRleHRBdHRyaWJ1dGVzKCk7XHJcblxyXG5cdFx0dGhpcy5fc2Vzc2lvbiA9IHNlc3Npb247XHJcblxyXG5cdFx0aWYgKCBzZXNzaW9uICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0aWYgKCBiYWNrZW5kLmlzV2ViR1BVQmFja2VuZCA9PT0gdHJ1ZSApIHRocm93IG5ldyBFcnJvciggJ1RIUkVFLlhSTWFuYWdlcjogWFIgaXMgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgd2l0aCBhIFdlYkdQVSBiYWNrZW5kLiBVc2UgV2ViR0wgYnkgcGFzc2luZyBcInsgZm9yY2VXZWJHTDogdHJ1ZSB9XCIgdG8gdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSByZW5kZXJlci4nICk7XHJcblxyXG5cdFx0XHRzZXNzaW9uLmFkZEV2ZW50TGlzdGVuZXIoICdzZWxlY3QnLCB0aGlzLl9vblNlc3Npb25FdmVudCApO1xyXG5cdFx0XHRzZXNzaW9uLmFkZEV2ZW50TGlzdGVuZXIoICdzZWxlY3RzdGFydCcsIHRoaXMuX29uU2Vzc2lvbkV2ZW50ICk7XHJcblx0XHRcdHNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lciggJ3NlbGVjdGVuZCcsIHRoaXMuX29uU2Vzc2lvbkV2ZW50ICk7XHJcblx0XHRcdHNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lciggJ3NxdWVlemUnLCB0aGlzLl9vblNlc3Npb25FdmVudCApO1xyXG5cdFx0XHRzZXNzaW9uLmFkZEV2ZW50TGlzdGVuZXIoICdzcXVlZXplc3RhcnQnLCB0aGlzLl9vblNlc3Npb25FdmVudCApO1xyXG5cdFx0XHRzZXNzaW9uLmFkZEV2ZW50TGlzdGVuZXIoICdzcXVlZXplZW5kJywgdGhpcy5fb25TZXNzaW9uRXZlbnQgKTtcclxuXHRcdFx0c2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCAnZW5kJywgdGhpcy5fb25TZXNzaW9uRW5kICk7XHJcblx0XHRcdHNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lciggJ2lucHV0c291cmNlc2NoYW5nZScsIHRoaXMuX29uSW5wdXRTb3VyY2VzQ2hhbmdlICk7XHJcblxyXG5cdFx0XHRhd2FpdCBiYWNrZW5kLm1ha2VYUkNvbXBhdGlibGUoKTtcclxuXHJcblx0XHRcdHRoaXMuX2N1cnJlbnRQaXhlbFJhdGlvID0gcmVuZGVyZXIuZ2V0UGl4ZWxSYXRpbygpO1xyXG5cdFx0XHRyZW5kZXJlci5nZXRTaXplKCB0aGlzLl9jdXJyZW50U2l6ZSApO1xyXG5cclxuXHRcdFx0dGhpcy5fY3VycmVudEFuaW1hdGlvbkNvbnRleHQgPSByZW5kZXJlci5fYW5pbWF0aW9uLmdldENvbnRleHQoKTtcclxuXHRcdFx0dGhpcy5fY3VycmVudEFuaW1hdGlvbkxvb3AgPSByZW5kZXJlci5fYW5pbWF0aW9uLmdldEFuaW1hdGlvbkxvb3AoKTtcclxuXHRcdFx0cmVuZGVyZXIuX2FuaW1hdGlvbi5zdG9wKCk7XHJcblxyXG5cdFx0XHQvL1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLl91c2VMYXllcnMgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdC8vIGRlZmF1bHQgcGF0aCB1c2luZyBYUldlYkdMQmluZGluZy9YUlByb2plY3Rpb25MYXllclxyXG5cclxuXHRcdFx0XHRsZXQgZGVwdGhGb3JtYXQgPSBudWxsO1xyXG5cdFx0XHRcdGxldCBkZXB0aFR5cGUgPSBudWxsO1xyXG5cdFx0XHRcdGxldCBnbERlcHRoRm9ybWF0ID0gbnVsbDtcclxuXHJcblx0XHRcdFx0aWYgKCByZW5kZXJlci5kZXB0aCApIHtcclxuXHJcblx0XHRcdFx0XHRnbERlcHRoRm9ybWF0ID0gcmVuZGVyZXIuc3RlbmNpbCA/IGdsLkRFUFRIMjRfU1RFTkNJTDggOiBnbC5ERVBUSF9DT01QT05FTlQyNDtcclxuXHRcdFx0XHRcdGRlcHRoRm9ybWF0ID0gcmVuZGVyZXIuc3RlbmNpbCA/IERlcHRoU3RlbmNpbEZvcm1hdCA6IERlcHRoRm9ybWF0O1xyXG5cdFx0XHRcdFx0ZGVwdGhUeXBlID0gcmVuZGVyZXIuc3RlbmNpbCA/IFVuc2lnbmVkSW50MjQ4VHlwZSA6IFVuc2lnbmVkSW50VHlwZTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRjb25zdCBwcm9qZWN0aW9ubGF5ZXJJbml0ID0ge1xyXG5cdFx0XHRcdFx0Y29sb3JGb3JtYXQ6IGdsLlJHQkE4LFxyXG5cdFx0XHRcdFx0ZGVwdGhGb3JtYXQ6IGdsRGVwdGhGb3JtYXQsXHJcblx0XHRcdFx0XHRzY2FsZUZhY3RvcjogdGhpcy5fZnJhbWVidWZmZXJTY2FsZUZhY3RvclxyXG5cdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdGNvbnN0IGdsQmluZGluZyA9IG5ldyBYUldlYkdMQmluZGluZyggc2Vzc2lvbiwgZ2wgKTtcclxuXHRcdFx0XHRjb25zdCBnbFByb2pMYXllciA9IGdsQmluZGluZy5jcmVhdGVQcm9qZWN0aW9uTGF5ZXIoIHByb2plY3Rpb25sYXllckluaXQgKTtcclxuXHRcdFx0XHRjb25zdCBsYXllcnNBcnJheSA9IFsgZ2xQcm9qTGF5ZXIgXTtcclxuXHJcblx0XHRcdFx0dGhpcy5fZ2xCaW5kaW5nID0gZ2xCaW5kaW5nO1xyXG5cdFx0XHRcdHRoaXMuX2dsUHJvakxheWVyID0gZ2xQcm9qTGF5ZXI7XHJcblxyXG5cdFx0XHRcdHJlbmRlcmVyLnNldFBpeGVsUmF0aW8oIDEgKTtcclxuXHRcdFx0XHRyZW5kZXJlci5zZXRTaXplKCBnbFByb2pMYXllci50ZXh0dXJlV2lkdGgsIGdsUHJvakxheWVyLnRleHR1cmVIZWlnaHQsIGZhbHNlICk7XHJcblxyXG5cdFx0XHRcdHRoaXMuX3hyUmVuZGVyVGFyZ2V0ID0gbmV3IFhSUmVuZGVyVGFyZ2V0KFxyXG5cdFx0XHRcdFx0Z2xQcm9qTGF5ZXIudGV4dHVyZVdpZHRoLFxyXG5cdFx0XHRcdFx0Z2xQcm9qTGF5ZXIudGV4dHVyZUhlaWdodCxcclxuXHRcdFx0XHRcdHtcclxuXHRcdFx0XHRcdFx0Zm9ybWF0OiBSR0JBRm9ybWF0LFxyXG5cdFx0XHRcdFx0XHR0eXBlOiBVbnNpZ25lZEJ5dGVUeXBlLFxyXG5cdFx0XHRcdFx0XHRjb2xvclNwYWNlOiByZW5kZXJlci5vdXRwdXRDb2xvclNwYWNlLFxyXG5cdFx0XHRcdFx0XHRkZXB0aFRleHR1cmU6IG5ldyBEZXB0aFRleHR1cmUoIGdsUHJvakxheWVyLnRleHR1cmVXaWR0aCwgZ2xQcm9qTGF5ZXIudGV4dHVyZUhlaWdodCwgZGVwdGhUeXBlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBkZXB0aEZvcm1hdCApLFxyXG5cdFx0XHRcdFx0XHRzdGVuY2lsQnVmZmVyOiByZW5kZXJlci5zdGVuY2lsLFxyXG5cdFx0XHRcdFx0XHRzYW1wbGVzOiBhdHRyaWJ1dGVzLmFudGlhbGlhcyA/IDQgOiAwLFxyXG5cdFx0XHRcdFx0XHRyZXNvbHZlRGVwdGhCdWZmZXI6ICggZ2xQcm9qTGF5ZXIuaWdub3JlRGVwdGhWYWx1ZXMgPT09IGZhbHNlICksXHJcblx0XHRcdFx0XHRcdHJlc29sdmVTdGVuY2lsQnVmZmVyOiAoIGdsUHJvakxheWVyLmlnbm9yZURlcHRoVmFsdWVzID09PSBmYWxzZSApLFxyXG5cdFx0XHRcdFx0fSApO1xyXG5cclxuXHRcdFx0XHR0aGlzLl94clJlbmRlclRhcmdldC5oYXNFeHRlcm5hbFRleHR1cmVzID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0dGhpcy5fcmVmZXJlbmNlU3BhY2UgPSBhd2FpdCBzZXNzaW9uLnJlcXVlc3RSZWZlcmVuY2VTcGFjZSggdGhpcy5nZXRSZWZlcmVuY2VTcGFjZVR5cGUoKSApO1xyXG5cclxuXHRcdFx0XHR0aGlzLl9zdXBwb3J0c0xheWVycyA9IHNlc3Npb24uZW5hYmxlZEZlYXR1cmVzLmluY2x1ZGVzKCAnbGF5ZXJzJyApO1xyXG5cclxuXHRcdFx0XHRpZiAoIHRoaXMuX3N1cHBvcnRzTGF5ZXJzICkge1xyXG5cclxuXHRcdFx0XHRcdC8vIHN3aXRjaCBsYXllcnMgdG8gbmF0aXZlXHJcblx0XHRcdFx0XHRmb3IgKCBjb25zdCBsYXllciBvZiB0aGlzLl9sYXllcnMgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBjaGFuZ2UgbWF0ZXJpYWwgc28gaXQgXCJwdW5jaGVzXCIgb3V0IGEgaG9sZSB0byBzaG93IHRoZSBYUiBMYXllci5cclxuXHRcdFx0XHRcdFx0bGF5ZXIucGxhbmUubWF0ZXJpYWwgPSBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IDB4ZmZmZmZmLCBzaWRlOiBsYXllci50eXBlID09PSAnY3lsaW5kZXInID8gQmFja1NpZGUgOiBGcm9udFNpZGUgfSApO1xyXG5cdFx0XHRcdFx0XHRsYXllci5wbGFuZS5tYXRlcmlhbC5ibGVuZGluZyA9IEN1c3RvbUJsZW5kaW5nO1xyXG5cdFx0XHRcdFx0XHRsYXllci5wbGFuZS5tYXRlcmlhbC5ibGVuZEVxdWF0aW9uID0gQWRkRXF1YXRpb247XHJcblx0XHRcdFx0XHRcdGxheWVyLnBsYW5lLm1hdGVyaWFsLmJsZW5kU3JjID0gWmVyb0ZhY3RvcjtcclxuXHRcdFx0XHRcdFx0bGF5ZXIucGxhbmUubWF0ZXJpYWwuYmxlbmREc3QgPSBaZXJvRmFjdG9yO1xyXG5cclxuXHRcdFx0XHRcdFx0bGF5ZXIueHJsYXllciA9IHRoaXMuX2NyZWF0ZVhSTGF5ZXIoIGxheWVyICk7XHJcblxyXG5cdFx0XHRcdFx0XHRsYXllcnNBcnJheS51bnNoaWZ0KCBsYXllci54cmxheWVyICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHNlc3Npb24udXBkYXRlUmVuZGVyU3RhdGUoIHsgbGF5ZXJzOiBsYXllcnNBcnJheSB9ICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHQvLyBmYWxsYmFjayB0byBYUldlYkdMTGF5ZXJcclxuXHJcblx0XHRcdFx0Y29uc3QgbGF5ZXJJbml0ID0ge1xyXG5cdFx0XHRcdFx0YW50aWFsaWFzOiByZW5kZXJlci5zYW1wbGVzID4gMCxcclxuXHRcdFx0XHRcdGFscGhhOiB0cnVlLFxyXG5cdFx0XHRcdFx0ZGVwdGg6IHJlbmRlcmVyLmRlcHRoLFxyXG5cdFx0XHRcdFx0c3RlbmNpbDogcmVuZGVyZXIuc3RlbmNpbCxcclxuXHRcdFx0XHRcdGZyYW1lYnVmZmVyU2NhbGVGYWN0b3I6IHRoaXMuZ2V0RnJhbWVidWZmZXJTY2FsZUZhY3RvcigpXHJcblx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0Y29uc3QgZ2xCYXNlTGF5ZXIgPSBuZXcgWFJXZWJHTExheWVyKCBzZXNzaW9uLCBnbCwgbGF5ZXJJbml0ICk7XHJcblx0XHRcdFx0dGhpcy5fZ2xCYXNlTGF5ZXIgPSBnbEJhc2VMYXllcjtcclxuXHJcblx0XHRcdFx0c2Vzc2lvbi51cGRhdGVSZW5kZXJTdGF0ZSggeyBiYXNlTGF5ZXI6IGdsQmFzZUxheWVyIH0gKTtcclxuXHJcblx0XHRcdFx0cmVuZGVyZXIuc2V0UGl4ZWxSYXRpbyggMSApO1xyXG5cdFx0XHRcdHJlbmRlcmVyLnNldFNpemUoIGdsQmFzZUxheWVyLmZyYW1lYnVmZmVyV2lkdGgsIGdsQmFzZUxheWVyLmZyYW1lYnVmZmVySGVpZ2h0LCBmYWxzZSApO1xyXG5cclxuXHRcdFx0XHR0aGlzLl94clJlbmRlclRhcmdldCA9IG5ldyBYUlJlbmRlclRhcmdldChcclxuXHRcdFx0XHRcdGdsQmFzZUxheWVyLmZyYW1lYnVmZmVyV2lkdGgsXHJcblx0XHRcdFx0XHRnbEJhc2VMYXllci5mcmFtZWJ1ZmZlckhlaWdodCxcclxuXHRcdFx0XHRcdHtcclxuXHRcdFx0XHRcdFx0Zm9ybWF0OiBSR0JBRm9ybWF0LFxyXG5cdFx0XHRcdFx0XHR0eXBlOiBVbnNpZ25lZEJ5dGVUeXBlLFxyXG5cdFx0XHRcdFx0XHRjb2xvclNwYWNlOiByZW5kZXJlci5vdXRwdXRDb2xvclNwYWNlLFxyXG5cdFx0XHRcdFx0XHRzdGVuY2lsQnVmZmVyOiByZW5kZXJlci5zdGVuY2lsLFxyXG5cdFx0XHRcdFx0XHRyZXNvbHZlRGVwdGhCdWZmZXI6ICggZ2xCYXNlTGF5ZXIuaWdub3JlRGVwdGhWYWx1ZXMgPT09IGZhbHNlICksXHJcblx0XHRcdFx0XHRcdHJlc29sdmVTdGVuY2lsQnVmZmVyOiAoIGdsQmFzZUxheWVyLmlnbm9yZURlcHRoVmFsdWVzID09PSBmYWxzZSApLFxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdCk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvL1xyXG5cclxuXHRcdFx0dGhpcy5zZXRGb3ZlYXRpb24oIHRoaXMuZ2V0Rm92ZWF0aW9uKCkgKTtcclxuXHJcblx0XHRcdHJlbmRlcmVyLl9hbmltYXRpb24uc2V0QW5pbWF0aW9uTG9vcCggdGhpcy5fb25BbmltYXRpb25GcmFtZSApO1xyXG5cdFx0XHRyZW5kZXJlci5fYW5pbWF0aW9uLnNldENvbnRleHQoIHNlc3Npb24gKTtcclxuXHRcdFx0cmVuZGVyZXIuX2FuaW1hdGlvbi5zdGFydCgpO1xyXG5cclxuXHRcdFx0dGhpcy5pc1ByZXNlbnRpbmcgPSB0cnVlO1xyXG5cclxuXHRcdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdzZXNzaW9uc3RhcnQnIH0gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSByZW5kZXJlciBwZXIgZnJhbWUgYW5kIHVwZGF0ZXMgdGhlIFhSIGNhbWVyYVxyXG5cdCAqIGFuZCBpdCBzdWIgY2FtZXJhcyBiYXNlZCBvbiB0aGUgZ2l2ZW4gY2FtZXJhLiBUaGUgZ2l2ZW4gY2FtZXJhIGlzIHRoZSBcInVzZXJcIlxyXG5cdCAqIGNhbWVyYSBjcmVhdGVkIG9uIGFwcGxpY2F0aW9uIGxldmVsIGFuZCB1c2VkIGZvciBub24tWFIgcmVuZGVyaW5nLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtQZXJzcGVjdGl2ZUNhbWVyYX0gY2FtZXJhIC0gVGhlIGNhbWVyYS5cclxuXHQgKi9cclxuXHR1cGRhdGVDYW1lcmEoIGNhbWVyYSApIHtcclxuXHJcblx0XHRjb25zdCBzZXNzaW9uID0gdGhpcy5fc2Vzc2lvbjtcclxuXHJcblx0XHRpZiAoIHNlc3Npb24gPT09IG51bGwgKSByZXR1cm47XHJcblxyXG5cdFx0Y29uc3QgZGVwdGhOZWFyID0gY2FtZXJhLm5lYXI7XHJcblx0XHRjb25zdCBkZXB0aEZhciA9IGNhbWVyYS5mYXI7XHJcblxyXG5cdFx0Y29uc3QgY2FtZXJhWFIgPSB0aGlzLl9jYW1lcmFYUjtcclxuXHRcdGNvbnN0IGNhbWVyYUwgPSB0aGlzLl9jYW1lcmFMO1xyXG5cdFx0Y29uc3QgY2FtZXJhUiA9IHRoaXMuX2NhbWVyYVI7XHJcblxyXG5cdFx0Y2FtZXJhWFIubmVhciA9IGNhbWVyYVIubmVhciA9IGNhbWVyYUwubmVhciA9IGRlcHRoTmVhcjtcclxuXHRcdGNhbWVyYVhSLmZhciA9IGNhbWVyYVIuZmFyID0gY2FtZXJhTC5mYXIgPSBkZXB0aEZhcjtcclxuXHJcblx0XHRpZiAoIHRoaXMuX2N1cnJlbnREZXB0aE5lYXIgIT09IGNhbWVyYVhSLm5lYXIgfHwgdGhpcy5fY3VycmVudERlcHRoRmFyICE9PSBjYW1lcmFYUi5mYXIgKSB7XHJcblxyXG5cdFx0XHQvLyBOb3RlIHRoYXQgdGhlIG5ldyByZW5kZXJTdGF0ZSB3b24ndCBhcHBseSB1bnRpbCB0aGUgbmV4dCBmcmFtZS4gU2VlICMxODMyMFxyXG5cclxuXHRcdFx0c2Vzc2lvbi51cGRhdGVSZW5kZXJTdGF0ZSgge1xyXG5cdFx0XHRcdGRlcHRoTmVhcjogY2FtZXJhWFIubmVhcixcclxuXHRcdFx0XHRkZXB0aEZhcjogY2FtZXJhWFIuZmFyXHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHRcdHRoaXMuX2N1cnJlbnREZXB0aE5lYXIgPSBjYW1lcmFYUi5uZWFyO1xyXG5cdFx0XHR0aGlzLl9jdXJyZW50RGVwdGhGYXIgPSBjYW1lcmFYUi5mYXI7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNhbWVyYUwubGF5ZXJzLm1hc2sgPSBjYW1lcmEubGF5ZXJzLm1hc2sgfCAwYjAxMDtcclxuXHRcdGNhbWVyYVIubGF5ZXJzLm1hc2sgPSBjYW1lcmEubGF5ZXJzLm1hc2sgfCAwYjEwMDtcclxuXHRcdGNhbWVyYVhSLmxheWVycy5tYXNrID0gY2FtZXJhTC5sYXllcnMubWFzayB8IGNhbWVyYVIubGF5ZXJzLm1hc2s7XHJcblxyXG5cdFx0Y29uc3QgcGFyZW50ID0gY2FtZXJhLnBhcmVudDtcclxuXHRcdGNvbnN0IGNhbWVyYXMgPSBjYW1lcmFYUi5jYW1lcmFzO1xyXG5cclxuXHRcdHVwZGF0ZUNhbWVyYSggY2FtZXJhWFIsIHBhcmVudCApO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGNhbWVyYXMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0dXBkYXRlQ2FtZXJhKCBjYW1lcmFzWyBpIF0sIHBhcmVudCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyB1cGRhdGUgcHJvamVjdGlvbiBtYXRyaXggZm9yIHByb3BlciB2aWV3IGZydXN0dW0gY3VsbGluZ1xyXG5cclxuXHRcdGlmICggY2FtZXJhcy5sZW5ndGggPT09IDIgKSB7XHJcblxyXG5cdFx0XHRzZXRQcm9qZWN0aW9uRnJvbVVuaW9uKCBjYW1lcmFYUiwgY2FtZXJhTCwgY2FtZXJhUiApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHQvLyBhc3N1bWUgc2luZ2xlIGNhbWVyYSBzZXR1cCAoQVIpXHJcblxyXG5cdFx0XHRjYW1lcmFYUi5wcm9qZWN0aW9uTWF0cml4LmNvcHkoIGNhbWVyYUwucHJvamVjdGlvbk1hdHJpeCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyB1cGRhdGUgdXNlciBjYW1lcmEgYW5kIGl0cyBjaGlsZHJlblxyXG5cclxuXHRcdHVwZGF0ZVVzZXJDYW1lcmEoIGNhbWVyYSwgY2FtZXJhWFIsIHBhcmVudCApO1xyXG5cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgV2ViWFIgY29udHJvbGxlciBmb3IgdGhlIGdpdmVuIGNvbnRyb2xsZXIgaW5kZXguXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBjb250cm9sbGVyIGluZGV4LlxyXG5cdCAqIEByZXR1cm4ge1dlYlhSQ29udHJvbGxlcn0gVGhlIFhSIGNvbnRyb2xsZXIuXHJcblx0ICovXHJcblx0X2dldENvbnRyb2xsZXIoIGluZGV4ICkge1xyXG5cclxuXHRcdGxldCBjb250cm9sbGVyID0gdGhpcy5fY29udHJvbGxlcnNbIGluZGV4IF07XHJcblxyXG5cdFx0aWYgKCBjb250cm9sbGVyID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRjb250cm9sbGVyID0gbmV3IFdlYlhSQ29udHJvbGxlcigpO1xyXG5cdFx0XHR0aGlzLl9jb250cm9sbGVyc1sgaW5kZXggXSA9IGNvbnRyb2xsZXI7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBjb250cm9sbGVyO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQXNzdW1lcyAyIGNhbWVyYXMgdGhhdCBhcmUgcGFyYWxsZWwgYW5kIHNoYXJlIGFuIFgtYXhpcywgYW5kIHRoYXRcclxuICogdGhlIGNhbWVyYXMnIHByb2plY3Rpb24gYW5kIHdvcmxkIG1hdHJpY2VzIGhhdmUgYWxyZWFkeSBiZWVuIHNldC5cclxuICogQW5kIHRoYXQgbmVhciBhbmQgZmFyIHBsYW5lcyBhcmUgaWRlbnRpY2FsIGZvciBib3RoIGNhbWVyYXMuXHJcbiAqIFZpc3VhbGl6YXRpb24gb2YgdGhpcyB0ZWNobmlxdWU6IGh0dHBzOi8vY29tcHV0ZXJncmFwaGljcy5zdGFja2V4Y2hhbmdlLmNvbS9hLzQ3NjVcclxuICpcclxuICogQHBhcmFtIHtBcnJheUNhbWVyYX0gY2FtZXJhIC0gVGhlIGNhbWVyYSB0byB1cGRhdGUuXHJcbiAqIEBwYXJhbSB7UGVyc3BlY3RpdmVDYW1lcmF9IGNhbWVyYUwgLSBUaGUgbGVmdCBjYW1lcmEuXHJcbiAqIEBwYXJhbSB7UGVyc3BlY3RpdmVDYW1lcmF9IGNhbWVyYVIgLSBUaGUgcmlnaHQgY2FtZXJhLlxyXG4gKi9cclxuZnVuY3Rpb24gc2V0UHJvamVjdGlvbkZyb21VbmlvbiggY2FtZXJhLCBjYW1lcmFMLCBjYW1lcmFSICkge1xyXG5cclxuXHRfY2FtZXJhTFBvcy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGNhbWVyYUwubWF0cml4V29ybGQgKTtcclxuXHRfY2FtZXJhUlBvcy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGNhbWVyYVIubWF0cml4V29ybGQgKTtcclxuXHJcblx0Y29uc3QgaXBkID0gX2NhbWVyYUxQb3MuZGlzdGFuY2VUbyggX2NhbWVyYVJQb3MgKTtcclxuXHJcblx0Y29uc3QgcHJvakwgPSBjYW1lcmFMLnByb2plY3Rpb25NYXRyaXguZWxlbWVudHM7XHJcblx0Y29uc3QgcHJvalIgPSBjYW1lcmFSLnByb2plY3Rpb25NYXRyaXguZWxlbWVudHM7XHJcblxyXG5cdC8vIFZSIHN5c3RlbXMgd2lsbCBoYXZlIGlkZW50aWNhbCBmYXIgYW5kIG5lYXIgcGxhbmVzLCBhbmRcclxuXHQvLyBtb3N0IGxpa2VseSBpZGVudGljYWwgdG9wIGFuZCBib3R0b20gZnJ1c3R1bSBleHRlbnRzLlxyXG5cdC8vIFVzZSB0aGUgbGVmdCBjYW1lcmEgZm9yIHRoZXNlIHZhbHVlcy5cclxuXHRjb25zdCBuZWFyID0gcHJvakxbIDE0IF0gLyAoIHByb2pMWyAxMCBdIC0gMSApO1xyXG5cdGNvbnN0IGZhciA9IHByb2pMWyAxNCBdIC8gKCBwcm9qTFsgMTAgXSArIDEgKTtcclxuXHRjb25zdCB0b3BGb3YgPSAoIHByb2pMWyA5IF0gKyAxICkgLyBwcm9qTFsgNSBdO1xyXG5cdGNvbnN0IGJvdHRvbUZvdiA9ICggcHJvakxbIDkgXSAtIDEgKSAvIHByb2pMWyA1IF07XHJcblxyXG5cdGNvbnN0IGxlZnRGb3YgPSAoIHByb2pMWyA4IF0gLSAxICkgLyBwcm9qTFsgMCBdO1xyXG5cdGNvbnN0IHJpZ2h0Rm92ID0gKCBwcm9qUlsgOCBdICsgMSApIC8gcHJvalJbIDAgXTtcclxuXHRjb25zdCBsZWZ0ID0gbmVhciAqIGxlZnRGb3Y7XHJcblx0Y29uc3QgcmlnaHQgPSBuZWFyICogcmlnaHRGb3Y7XHJcblxyXG5cdC8vIENhbGN1bGF0ZSB0aGUgbmV3IGNhbWVyYSdzIHBvc2l0aW9uIG9mZnNldCBmcm9tIHRoZVxyXG5cdC8vIGxlZnQgY2FtZXJhLiB4T2Zmc2V0IHNob3VsZCBiZSByb3VnaGx5IGhhbGYgYGlwZGAuXHJcblx0Y29uc3Qgek9mZnNldCA9IGlwZCAvICggLSBsZWZ0Rm92ICsgcmlnaHRGb3YgKTtcclxuXHRjb25zdCB4T2Zmc2V0ID0gek9mZnNldCAqIC0gbGVmdEZvdjtcclxuXHJcblx0Ly8gVE9ETzogQmV0dGVyIHdheSB0byBhcHBseSB0aGlzIG9mZnNldD9cclxuXHRjYW1lcmFMLm1hdHJpeFdvcmxkLmRlY29tcG9zZSggY2FtZXJhLnBvc2l0aW9uLCBjYW1lcmEucXVhdGVybmlvbiwgY2FtZXJhLnNjYWxlICk7XHJcblx0Y2FtZXJhLnRyYW5zbGF0ZVgoIHhPZmZzZXQgKTtcclxuXHRjYW1lcmEudHJhbnNsYXRlWiggek9mZnNldCApO1xyXG5cdGNhbWVyYS5tYXRyaXhXb3JsZC5jb21wb3NlKCBjYW1lcmEucG9zaXRpb24sIGNhbWVyYS5xdWF0ZXJuaW9uLCBjYW1lcmEuc2NhbGUgKTtcclxuXHRjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlLmNvcHkoIGNhbWVyYS5tYXRyaXhXb3JsZCApLmludmVydCgpO1xyXG5cclxuXHQvLyBDaGVjayBpZiB0aGUgcHJvamVjdGlvbiB1c2VzIGFuIGluZmluaXRlIGZhciBwbGFuZS5cclxuXHRpZiAoIHByb2pMWyAxMCBdID09PSAtIDEuMCApIHtcclxuXHJcblx0XHQvLyBVc2UgdGhlIHByb2plY3Rpb24gbWF0cml4IGZyb20gdGhlIGxlZnQgZXllLlxyXG5cdFx0Ly8gVGhlIGNhbWVyYSBvZmZzZXQgaXMgc3VmZmljaWVudCB0byBpbmNsdWRlIHRoZSB2aWV3IHZvbHVtZXNcclxuXHRcdC8vIG9mIGJvdGggZXllcyAoYXNzdW1pbmcgc3ltbWV0cmljIHByb2plY3Rpb25zKS5cclxuXHRcdGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LmNvcHkoIGNhbWVyYUwucHJvamVjdGlvbk1hdHJpeCApO1xyXG5cdFx0Y2FtZXJhLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkoIGNhbWVyYUwucHJvamVjdGlvbk1hdHJpeEludmVyc2UgKTtcclxuXHJcblx0fSBlbHNlIHtcclxuXHJcblx0XHQvLyBGaW5kIHRoZSB1bmlvbiBvZiB0aGUgZnJ1c3R1bSB2YWx1ZXMgb2YgdGhlIGNhbWVyYXMgYW5kIHNjYWxlXHJcblx0XHQvLyB0aGUgdmFsdWVzIHNvIHRoYXQgdGhlIG5lYXIgcGxhbmUncyBwb3NpdGlvbiBkb2VzIG5vdCBjaGFuZ2UgaW4gd29ybGQgc3BhY2UsXHJcblx0XHQvLyBhbHRob3VnaCBtdXN0IG5vdyBiZSByZWxhdGl2ZSB0byB0aGUgbmV3IHVuaW9uIGNhbWVyYS5cclxuXHRcdGNvbnN0IG5lYXIyID0gbmVhciArIHpPZmZzZXQ7XHJcblx0XHRjb25zdCBmYXIyID0gZmFyICsgek9mZnNldDtcclxuXHRcdGNvbnN0IGxlZnQyID0gbGVmdCAtIHhPZmZzZXQ7XHJcblx0XHRjb25zdCByaWdodDIgPSByaWdodCArICggaXBkIC0geE9mZnNldCApO1xyXG5cdFx0Y29uc3QgdG9wMiA9IHRvcEZvdiAqIGZhciAvIGZhcjIgKiBuZWFyMjtcclxuXHRcdGNvbnN0IGJvdHRvbTIgPSBib3R0b21Gb3YgKiBmYXIgLyBmYXIyICogbmVhcjI7XHJcblxyXG5cdFx0Y2FtZXJhLnByb2plY3Rpb25NYXRyaXgubWFrZVBlcnNwZWN0aXZlKCBsZWZ0MiwgcmlnaHQyLCB0b3AyLCBib3R0b20yLCBuZWFyMiwgZmFyMiApO1xyXG5cdFx0Y2FtZXJhLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkoIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4ICkuaW52ZXJ0KCk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBVcGRhdGVzIHRoZSB3b3JsZCBtYXRyaWNlcyBmb3IgdGhlIGdpdmVuIGNhbWVyYSBiYXNlZCBvbiB0aGUgcGFyZW50IDNEIG9iamVjdC5cclxuICpcclxuICogQGlubmVyXHJcbiAqIEBwYXJhbSB7Q2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIHRvIHVwZGF0ZS5cclxuICogQHBhcmFtIHtPYmplY3QzRH0gcGFyZW50IC0gVGhlIHBhcmVudCAzRCBvYmplY3QuXHJcbiAqL1xyXG5mdW5jdGlvbiB1cGRhdGVDYW1lcmEoIGNhbWVyYSwgcGFyZW50ICkge1xyXG5cclxuXHRpZiAoIHBhcmVudCA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRjYW1lcmEubWF0cml4V29ybGQuY29weSggY2FtZXJhLm1hdHJpeCApO1xyXG5cclxuXHR9IGVsc2Uge1xyXG5cclxuXHRcdGNhbWVyYS5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKCBwYXJlbnQubWF0cml4V29ybGQsIGNhbWVyYS5tYXRyaXggKTtcclxuXHJcblx0fVxyXG5cclxuXHRjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlLmNvcHkoIGNhbWVyYS5tYXRyaXhXb3JsZCApLmludmVydCgpO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFVwZGF0ZXMgdGhlIGdpdmVuIGNhbWVyYSB3aXRoIHRoZSB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgWFIgY2FtZXJhIGFuZCBwYXJlbnQgb2JqZWN0LlxyXG4gKlxyXG4gKiBAaW5uZXJcclxuICogQHBhcmFtIHtDYW1lcmF9IGNhbWVyYSAtIFRoZSBjYW1lcmEgdG8gdXBkYXRlLlxyXG4gKiBAcGFyYW0ge0FycmF5Q2FtZXJhfSBjYW1lcmFYUiAtIFRoZSBYUiBjYW1lcmEuXHJcbiAqIEBwYXJhbSB7T2JqZWN0M0R9IHBhcmVudCAtIFRoZSBwYXJlbnQgM0Qgb2JqZWN0LlxyXG4gKi9cclxuZnVuY3Rpb24gdXBkYXRlVXNlckNhbWVyYSggY2FtZXJhLCBjYW1lcmFYUiwgcGFyZW50ICkge1xyXG5cclxuXHRpZiAoIHBhcmVudCA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRjYW1lcmEubWF0cml4LmNvcHkoIGNhbWVyYVhSLm1hdHJpeFdvcmxkICk7XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0Y2FtZXJhLm1hdHJpeC5jb3B5KCBwYXJlbnQubWF0cml4V29ybGQgKTtcclxuXHRcdGNhbWVyYS5tYXRyaXguaW52ZXJ0KCk7XHJcblx0XHRjYW1lcmEubWF0cml4Lm11bHRpcGx5KCBjYW1lcmFYUi5tYXRyaXhXb3JsZCApO1xyXG5cclxuXHR9XHJcblxyXG5cdGNhbWVyYS5tYXRyaXguZGVjb21wb3NlKCBjYW1lcmEucG9zaXRpb24sIGNhbWVyYS5xdWF0ZXJuaW9uLCBjYW1lcmEuc2NhbGUgKTtcclxuXHRjYW1lcmEudXBkYXRlTWF0cml4V29ybGQoIHRydWUgKTtcclxuXHJcblx0Y2FtZXJhLnByb2plY3Rpb25NYXRyaXguY29weSggY2FtZXJhWFIucHJvamVjdGlvbk1hdHJpeCApO1xyXG5cdGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5jb3B5KCBjYW1lcmFYUi5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSApO1xyXG5cclxuXHRpZiAoIGNhbWVyYS5pc1BlcnNwZWN0aXZlQ2FtZXJhICkge1xyXG5cclxuXHRcdGNhbWVyYS5mb3YgPSBSQUQyREVHICogMiAqIE1hdGguYXRhbiggMSAvIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWyA1IF0gKTtcclxuXHRcdGNhbWVyYS56b29tID0gMTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gb25TZXNzaW9uRXZlbnQoIGV2ZW50ICkge1xyXG5cclxuXHRjb25zdCBjb250cm9sbGVySW5kZXggPSB0aGlzLl9jb250cm9sbGVySW5wdXRTb3VyY2VzLmluZGV4T2YoIGV2ZW50LmlucHV0U291cmNlICk7XHJcblxyXG5cdGlmICggY29udHJvbGxlckluZGV4ID09PSAtIDEgKSB7XHJcblxyXG5cdFx0cmV0dXJuO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvbnN0IGNvbnRyb2xsZXIgPSB0aGlzLl9jb250cm9sbGVyc1sgY29udHJvbGxlckluZGV4IF07XHJcblxyXG5cdGlmICggY29udHJvbGxlciAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdGNvbnN0IHJlZmVyZW5jZVNwYWNlID0gdGhpcy5nZXRSZWZlcmVuY2VTcGFjZSgpO1xyXG5cclxuXHRcdGNvbnRyb2xsZXIudXBkYXRlKCBldmVudC5pbnB1dFNvdXJjZSwgZXZlbnQuZnJhbWUsIHJlZmVyZW5jZVNwYWNlICk7XHJcblx0XHRjb250cm9sbGVyLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogZXZlbnQudHlwZSwgZGF0YTogZXZlbnQuaW5wdXRTb3VyY2UgfSApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBvblNlc3Npb25FbmQoKSB7XHJcblxyXG5cdGNvbnN0IHNlc3Npb24gPSB0aGlzLl9zZXNzaW9uO1xyXG5cdGNvbnN0IHJlbmRlcmVyID0gdGhpcy5fcmVuZGVyZXI7XHJcblxyXG5cdHNlc3Npb24ucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3NlbGVjdCcsIHRoaXMuX29uU2Vzc2lvbkV2ZW50ICk7XHJcblx0c2Vzc2lvbi5yZW1vdmVFdmVudExpc3RlbmVyKCAnc2VsZWN0c3RhcnQnLCB0aGlzLl9vblNlc3Npb25FdmVudCApO1xyXG5cdHNlc3Npb24ucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3NlbGVjdGVuZCcsIHRoaXMuX29uU2Vzc2lvbkV2ZW50ICk7XHJcblx0c2Vzc2lvbi5yZW1vdmVFdmVudExpc3RlbmVyKCAnc3F1ZWV6ZScsIHRoaXMuX29uU2Vzc2lvbkV2ZW50ICk7XHJcblx0c2Vzc2lvbi5yZW1vdmVFdmVudExpc3RlbmVyKCAnc3F1ZWV6ZXN0YXJ0JywgdGhpcy5fb25TZXNzaW9uRXZlbnQgKTtcclxuXHRzZXNzaW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdzcXVlZXplZW5kJywgdGhpcy5fb25TZXNzaW9uRXZlbnQgKTtcclxuXHRzZXNzaW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdlbmQnLCB0aGlzLl9vblNlc3Npb25FbmQgKTtcclxuXHRzZXNzaW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdpbnB1dHNvdXJjZXNjaGFuZ2UnLCB0aGlzLl9vbklucHV0U291cmNlc0NoYW5nZSApO1xyXG5cclxuXHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB0aGlzLl9jb250cm9sbGVycy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0Y29uc3QgaW5wdXRTb3VyY2UgPSB0aGlzLl9jb250cm9sbGVySW5wdXRTb3VyY2VzWyBpIF07XHJcblxyXG5cdFx0aWYgKCBpbnB1dFNvdXJjZSA9PT0gbnVsbCApIGNvbnRpbnVlO1xyXG5cclxuXHRcdHRoaXMuX2NvbnRyb2xsZXJJbnB1dFNvdXJjZXNbIGkgXSA9IG51bGw7XHJcblxyXG5cdFx0dGhpcy5fY29udHJvbGxlcnNbIGkgXS5kaXNjb25uZWN0KCBpbnB1dFNvdXJjZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdHRoaXMuX2N1cnJlbnREZXB0aE5lYXIgPSBudWxsO1xyXG5cdHRoaXMuX2N1cnJlbnREZXB0aEZhciA9IG51bGw7XHJcblxyXG5cdC8vIHJlc3RvcmUgZnJhbWVidWZmZXIvcmVuZGVyaW5nIHN0YXRlXHJcblxyXG5cdHJlbmRlcmVyLmJhY2tlbmQuc2V0WFJUYXJnZXQoIG51bGwgKTtcclxuXHRyZW5kZXJlci5zZXRPdXRwdXRSZW5kZXJUYXJnZXQoIG51bGwgKTtcclxuXHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIG51bGwgKTtcclxuXHJcblx0dGhpcy5fc2Vzc2lvbiA9IG51bGw7XHJcblx0dGhpcy5feHJSZW5kZXJUYXJnZXQgPSBudWxsO1xyXG5cclxuXHQvLyBzd2l0Y2ggbGF5ZXJzIGJhY2sgdG8gZW11bGF0ZWRcclxuXHRpZiAoIHRoaXMuX3N1cHBvcnRzTGF5ZXJzID09PSB0cnVlICkge1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IGxheWVyIG9mIHRoaXMuX2xheWVycyApIHtcclxuXHJcblx0XHRcdC8vIFJlY3JlYXRlIGxheWVyIHJlbmRlciB0YXJnZXQgdG8gcmVzZXQgc3RhdGVcclxuXHRcdFx0bGF5ZXIucmVuZGVyVGFyZ2V0ID0gbmV3IFhSUmVuZGVyVGFyZ2V0KFxyXG5cdFx0XHRcdGxheWVyLnBpeGVsd2lkdGgsXHJcblx0XHRcdFx0bGF5ZXIucGl4ZWxoZWlnaHQsXHJcblx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0Zm9ybWF0OiBSR0JBRm9ybWF0LFxyXG5cdFx0XHRcdFx0dHlwZTogVW5zaWduZWRCeXRlVHlwZSxcclxuXHRcdFx0XHRcdGRlcHRoVGV4dHVyZTogbmV3IERlcHRoVGV4dHVyZShcclxuXHRcdFx0XHRcdFx0bGF5ZXIucGl4ZWx3aWR0aCxcclxuXHRcdFx0XHRcdFx0bGF5ZXIucGl4ZWxoZWlnaHQsXHJcblx0XHRcdFx0XHRcdGxheWVyLnN0ZW5jaWxCdWZmZXIgPyBVbnNpZ25lZEludDI0OFR5cGUgOiBVbnNpZ25lZEludFR5cGUsXHJcblx0XHRcdFx0XHRcdHVuZGVmaW5lZCxcclxuXHRcdFx0XHRcdFx0dW5kZWZpbmVkLFxyXG5cdFx0XHRcdFx0XHR1bmRlZmluZWQsXHJcblx0XHRcdFx0XHRcdHVuZGVmaW5lZCxcclxuXHRcdFx0XHRcdFx0dW5kZWZpbmVkLFxyXG5cdFx0XHRcdFx0XHR1bmRlZmluZWQsXHJcblx0XHRcdFx0XHRcdGxheWVyLnN0ZW5jaWxCdWZmZXIgPyBEZXB0aFN0ZW5jaWxGb3JtYXQgOiBEZXB0aEZvcm1hdFxyXG5cdFx0XHRcdFx0KSxcclxuXHRcdFx0XHRcdHN0ZW5jaWxCdWZmZXI6IGxheWVyLnN0ZW5jaWxCdWZmZXIsXHJcblx0XHRcdFx0XHRyZXNvbHZlRGVwdGhCdWZmZXI6IGZhbHNlLFxyXG5cdFx0XHRcdFx0cmVzb2x2ZVN0ZW5jaWxCdWZmZXI6IGZhbHNlXHJcblx0XHRcdFx0fSApO1xyXG5cclxuXHRcdFx0bGF5ZXIucmVuZGVyVGFyZ2V0LmlzWFJSZW5kZXJUYXJnZXQgPSBmYWxzZTtcclxuXHJcblx0XHRcdGxheWVyLnBsYW5lLm1hdGVyaWFsID0gbGF5ZXIubWF0ZXJpYWw7XHJcblx0XHRcdGxheWVyLm1hdGVyaWFsLm1hcCA9IGxheWVyLnJlbmRlclRhcmdldC50ZXh0dXJlO1xyXG5cdFx0XHRkZWxldGUgbGF5ZXIueHJsYXllcjtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0Ly9cclxuXHJcblx0dGhpcy5pc1ByZXNlbnRpbmcgPSBmYWxzZTtcclxuXHJcblx0cmVuZGVyZXIuX2FuaW1hdGlvbi5zdG9wKCk7XHJcblxyXG5cdHJlbmRlcmVyLl9hbmltYXRpb24uc2V0QW5pbWF0aW9uTG9vcCggdGhpcy5fY3VycmVudEFuaW1hdGlvbkxvb3AgKTtcclxuXHRyZW5kZXJlci5fYW5pbWF0aW9uLnNldENvbnRleHQoIHRoaXMuX2N1cnJlbnRBbmltYXRpb25Db250ZXh0ICk7XHJcblx0cmVuZGVyZXIuX2FuaW1hdGlvbi5zdGFydCgpO1xyXG5cclxuXHRyZW5kZXJlci5zZXRQaXhlbFJhdGlvKCB0aGlzLl9jdXJyZW50UGl4ZWxSYXRpbyApO1xyXG5cdHJlbmRlcmVyLnNldFNpemUoIHRoaXMuX2N1cnJlbnRTaXplLndpZHRoLCB0aGlzLl9jdXJyZW50U2l6ZS5oZWlnaHQsIGZhbHNlICk7XHJcblxyXG5cdHRoaXMuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnc2Vzc2lvbmVuZCcgfSApO1xyXG5cclxufVxyXG5cclxuZnVuY3Rpb24gb25JbnB1dFNvdXJjZXNDaGFuZ2UoIGV2ZW50ICkge1xyXG5cclxuXHRjb25zdCBjb250cm9sbGVycyA9IHRoaXMuX2NvbnRyb2xsZXJzO1xyXG5cdGNvbnN0IGNvbnRyb2xsZXJJbnB1dFNvdXJjZXMgPSB0aGlzLl9jb250cm9sbGVySW5wdXRTb3VyY2VzO1xyXG5cclxuXHQvLyBOb3RpZnkgZGlzY29ubmVjdGVkXHJcblxyXG5cdGZvciAoIGxldCBpID0gMDsgaSA8IGV2ZW50LnJlbW92ZWQubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdGNvbnN0IGlucHV0U291cmNlID0gZXZlbnQucmVtb3ZlZFsgaSBdO1xyXG5cdFx0Y29uc3QgaW5kZXggPSBjb250cm9sbGVySW5wdXRTb3VyY2VzLmluZGV4T2YoIGlucHV0U291cmNlICk7XHJcblxyXG5cdFx0aWYgKCBpbmRleCA+PSAwICkge1xyXG5cclxuXHRcdFx0Y29udHJvbGxlcklucHV0U291cmNlc1sgaW5kZXggXSA9IG51bGw7XHJcblx0XHRcdGNvbnRyb2xsZXJzWyBpbmRleCBdLmRpc2Nvbm5lY3QoIGlucHV0U291cmNlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8vIE5vdGlmeSBjb25uZWN0ZWRcclxuXHJcblx0Zm9yICggbGV0IGkgPSAwOyBpIDwgZXZlbnQuYWRkZWQubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdGNvbnN0IGlucHV0U291cmNlID0gZXZlbnQuYWRkZWRbIGkgXTtcclxuXHJcblx0XHRsZXQgY29udHJvbGxlckluZGV4ID0gY29udHJvbGxlcklucHV0U291cmNlcy5pbmRleE9mKCBpbnB1dFNvdXJjZSApO1xyXG5cclxuXHRcdGlmICggY29udHJvbGxlckluZGV4ID09PSAtIDEgKSB7XHJcblxyXG5cdFx0XHQvLyBBc3NpZ24gaW5wdXQgc291cmNlIGEgY29udHJvbGxlciB0aGF0IGN1cnJlbnRseSBoYXMgbm8gaW5wdXQgc291cmNlXHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBjb250cm9sbGVycy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggaSA+PSBjb250cm9sbGVySW5wdXRTb3VyY2VzLmxlbmd0aCApIHtcclxuXHJcblx0XHRcdFx0XHRjb250cm9sbGVySW5wdXRTb3VyY2VzLnB1c2goIGlucHV0U291cmNlICk7XHJcblx0XHRcdFx0XHRjb250cm9sbGVySW5kZXggPSBpO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGNvbnRyb2xsZXJJbnB1dFNvdXJjZXNbIGkgXSA9PT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHRjb250cm9sbGVySW5wdXRTb3VyY2VzWyBpIF0gPSBpbnB1dFNvdXJjZTtcclxuXHRcdFx0XHRcdGNvbnRyb2xsZXJJbmRleCA9IGk7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gSWYgYWxsIGNvbnRyb2xsZXJzIGRvIGN1cnJlbnRseSByZWNlaXZlIGlucHV0IHdlIGlnbm9yZSBuZXcgb25lc1xyXG5cclxuXHRcdFx0aWYgKCBjb250cm9sbGVySW5kZXggPT09IC0gMSApIGJyZWFrO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBjb250cm9sbGVyID0gY29udHJvbGxlcnNbIGNvbnRyb2xsZXJJbmRleCBdO1xyXG5cclxuXHRcdGlmICggY29udHJvbGxlciApIHtcclxuXHJcblx0XHRcdGNvbnRyb2xsZXIuY29ubmVjdCggaW5wdXRTb3VyY2UgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8vIENyZWF0aW9uIG1ldGhvZCBmb3IgbmF0aXZlIFdlYlhSIGxheWVyc1xyXG5mdW5jdGlvbiBjcmVhdGVYUkxheWVyKCBsYXllciApIHtcclxuXHJcblx0aWYgKCBsYXllci50eXBlID09PSAncXVhZCcgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX2dsQmluZGluZy5jcmVhdGVRdWFkTGF5ZXIoIHtcclxuXHRcdFx0dHJhbnNmb3JtOiBuZXcgWFJSaWdpZFRyYW5zZm9ybSggbGF5ZXIudHJhbnNsYXRpb24sIGxheWVyLnF1YXRlcm5pb24gKSxcclxuXHRcdFx0ZGVwdGhGb3JtYXQ6IHRoaXMuX2dsLkRFUFRIX0NPTVBPTkVOVCxcclxuXHRcdFx0d2lkdGg6IGxheWVyLndpZHRoIC8gMixcclxuXHRcdFx0aGVpZ2h0OiBsYXllci5oZWlnaHQgLyAyLFxyXG5cdFx0XHRzcGFjZTogdGhpcy5fcmVmZXJlbmNlU3BhY2UsXHJcblx0XHRcdHZpZXdQaXhlbFdpZHRoOiBsYXllci5waXhlbHdpZHRoLFxyXG5cdFx0XHR2aWV3UGl4ZWxIZWlnaHQ6IGxheWVyLnBpeGVsaGVpZ2h0XHJcblx0XHR9ICk7XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX2dsQmluZGluZy5jcmVhdGVDeWxpbmRlckxheWVyKCB7XHJcblx0XHRcdHRyYW5zZm9ybTogbmV3IFhSUmlnaWRUcmFuc2Zvcm0oIGxheWVyLnRyYW5zbGF0aW9uLCBsYXllci5xdWF0ZXJuaW9uICksXHJcblx0XHRcdGRlcHRoRm9ybWF0OiB0aGlzLl9nbC5ERVBUSF9DT01QT05FTlQsXHJcblx0XHRcdHJhZGl1czogbGF5ZXIucmFkaXVzLFxyXG5cdFx0XHRjZW50cmFsQW5nbGU6IGxheWVyLmNlbnRyYWxBbmdsZSxcclxuXHRcdFx0YXNwZWN0UmF0aW86IGxheWVyLmFzcGVjdFJhdGlvLFxyXG5cdFx0XHRzcGFjZTogdGhpcy5fcmVmZXJlbmNlU3BhY2UsXHJcblx0XHRcdHZpZXdQaXhlbFdpZHRoOiBsYXllci5waXhlbHdpZHRoLFxyXG5cdFx0XHR2aWV3UGl4ZWxIZWlnaHQ6IGxheWVyLnBpeGVsaGVpZ2h0XHJcblx0XHR9ICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8vIEFuaW1hdGlvbiBMb29wXHJcblxyXG5mdW5jdGlvbiBvbkFuaW1hdGlvbkZyYW1lKCB0aW1lLCBmcmFtZSApIHtcclxuXHJcblx0aWYgKCBmcmFtZSA9PT0gdW5kZWZpbmVkICkgcmV0dXJuO1xyXG5cclxuXHRjb25zdCBjYW1lcmFYUiA9IHRoaXMuX2NhbWVyYVhSO1xyXG5cdGNvbnN0IHJlbmRlcmVyID0gdGhpcy5fcmVuZGVyZXI7XHJcblx0Y29uc3QgYmFja2VuZCA9IHJlbmRlcmVyLmJhY2tlbmQ7XHJcblxyXG5cdGNvbnN0IGdsQmFzZUxheWVyID0gdGhpcy5fZ2xCYXNlTGF5ZXI7XHJcblxyXG5cdGNvbnN0IHJlZmVyZW5jZVNwYWNlID0gdGhpcy5nZXRSZWZlcmVuY2VTcGFjZSgpO1xyXG5cdGNvbnN0IHBvc2UgPSBmcmFtZS5nZXRWaWV3ZXJQb3NlKCByZWZlcmVuY2VTcGFjZSApO1xyXG5cclxuXHR0aGlzLl94ckZyYW1lID0gZnJhbWU7XHJcblxyXG5cdGlmICggcG9zZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRjb25zdCB2aWV3cyA9IHBvc2Uudmlld3M7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9nbEJhc2VMYXllciAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGJhY2tlbmQuc2V0WFJUYXJnZXQoIGdsQmFzZUxheWVyLmZyYW1lYnVmZmVyICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGxldCBjYW1lcmFYUk5lZWRzVXBkYXRlID0gZmFsc2U7XHJcblxyXG5cdFx0Ly8gY2hlY2sgaWYgaXQncyBuZWNlc3NhcnkgdG8gcmVidWlsZCBjYW1lcmFYUidzIGNhbWVyYSBsaXN0XHJcblxyXG5cdFx0aWYgKCB2aWV3cy5sZW5ndGggIT09IGNhbWVyYVhSLmNhbWVyYXMubGVuZ3RoICkge1xyXG5cclxuXHRcdFx0Y2FtZXJhWFIuY2FtZXJhcy5sZW5ndGggPSAwO1xyXG5cdFx0XHRjYW1lcmFYUk5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdmlld3MubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdmlldyA9IHZpZXdzWyBpIF07XHJcblxyXG5cdFx0XHRsZXQgdmlld3BvcnQ7XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMuX3VzZUxheWVycyA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgZ2xTdWJJbWFnZSA9IHRoaXMuX2dsQmluZGluZy5nZXRWaWV3U3ViSW1hZ2UoIHRoaXMuX2dsUHJvakxheWVyLCB2aWV3ICk7XHJcblx0XHRcdFx0dmlld3BvcnQgPSBnbFN1YkltYWdlLnZpZXdwb3J0O1xyXG5cclxuXHRcdFx0XHQvLyBGb3Igc2lkZS1ieS1zaWRlIHByb2plY3Rpb24sIHdlIG9ubHkgcHJvZHVjZSBhIHNpbmdsZSB0ZXh0dXJlIGZvciBib3RoIGV5ZXMuXHJcblx0XHRcdFx0aWYgKCBpID09PSAwICkge1xyXG5cclxuXHRcdFx0XHRcdGJhY2tlbmQuc2V0WFJSZW5kZXJUYXJnZXRUZXh0dXJlcyhcclxuXHRcdFx0XHRcdFx0dGhpcy5feHJSZW5kZXJUYXJnZXQsXHJcblx0XHRcdFx0XHRcdGdsU3ViSW1hZ2UuY29sb3JUZXh0dXJlLFxyXG5cdFx0XHRcdFx0XHR0aGlzLl9nbFByb2pMYXllci5pZ25vcmVEZXB0aFZhbHVlcyA/IHVuZGVmaW5lZCA6IGdsU3ViSW1hZ2UuZGVwdGhTdGVuY2lsVGV4dHVyZVxyXG5cdFx0XHRcdFx0KTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0dmlld3BvcnQgPSBnbEJhc2VMYXllci5nZXRWaWV3cG9ydCggdmlldyApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0bGV0IGNhbWVyYSA9IHRoaXMuX2NhbWVyYXNbIGkgXTtcclxuXHJcblx0XHRcdGlmICggY2FtZXJhID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGNhbWVyYSA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSgpO1xyXG5cdFx0XHRcdGNhbWVyYS5sYXllcnMuZW5hYmxlKCBpICk7XHJcblx0XHRcdFx0Y2FtZXJhLnZpZXdwb3J0ID0gbmV3IFZlY3RvcjQoKTtcclxuXHRcdFx0XHR0aGlzLl9jYW1lcmFzWyBpIF0gPSBjYW1lcmE7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjYW1lcmEubWF0cml4LmZyb21BcnJheSggdmlldy50cmFuc2Zvcm0ubWF0cml4ICk7XHJcblx0XHRcdGNhbWVyYS5tYXRyaXguZGVjb21wb3NlKCBjYW1lcmEucG9zaXRpb24sIGNhbWVyYS5xdWF0ZXJuaW9uLCBjYW1lcmEuc2NhbGUgKTtcclxuXHRcdFx0Y2FtZXJhLnByb2plY3Rpb25NYXRyaXguZnJvbUFycmF5KCB2aWV3LnByb2plY3Rpb25NYXRyaXggKTtcclxuXHRcdFx0Y2FtZXJhLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkoIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4ICkuaW52ZXJ0KCk7XHJcblx0XHRcdGNhbWVyYS52aWV3cG9ydC5zZXQoIHZpZXdwb3J0LngsIHZpZXdwb3J0LnksIHZpZXdwb3J0LndpZHRoLCB2aWV3cG9ydC5oZWlnaHQgKTtcclxuXHJcblx0XHRcdGlmICggaSA9PT0gMCApIHtcclxuXHJcblx0XHRcdFx0Y2FtZXJhWFIubWF0cml4LmNvcHkoIGNhbWVyYS5tYXRyaXggKTtcclxuXHRcdFx0XHRjYW1lcmFYUi5tYXRyaXguZGVjb21wb3NlKCBjYW1lcmFYUi5wb3NpdGlvbiwgY2FtZXJhWFIucXVhdGVybmlvbiwgY2FtZXJhWFIuc2NhbGUgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggY2FtZXJhWFJOZWVkc1VwZGF0ZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0Y2FtZXJhWFIuY2FtZXJhcy5wdXNoKCBjYW1lcmEgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmVuZGVyZXIuc2V0T3V0cHV0UmVuZGVyVGFyZ2V0KCB0aGlzLl94clJlbmRlclRhcmdldCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vXHJcblxyXG5cdGZvciAoIGxldCBpID0gMDsgaSA8IHRoaXMuX2NvbnRyb2xsZXJzLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRjb25zdCBpbnB1dFNvdXJjZSA9IHRoaXMuX2NvbnRyb2xsZXJJbnB1dFNvdXJjZXNbIGkgXTtcclxuXHRcdGNvbnN0IGNvbnRyb2xsZXIgPSB0aGlzLl9jb250cm9sbGVyc1sgaSBdO1xyXG5cclxuXHRcdGlmICggaW5wdXRTb3VyY2UgIT09IG51bGwgJiYgY29udHJvbGxlciAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Y29udHJvbGxlci51cGRhdGUoIGlucHV0U291cmNlLCBmcmFtZSwgcmVmZXJlbmNlU3BhY2UgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0aWYgKCB0aGlzLl9jdXJyZW50QW5pbWF0aW9uTG9vcCApIHRoaXMuX2N1cnJlbnRBbmltYXRpb25Mb29wKCB0aW1lLCBmcmFtZSApO1xyXG5cclxuXHRpZiAoIGZyYW1lLmRldGVjdGVkUGxhbmVzICkge1xyXG5cclxuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAncGxhbmVzZGV0ZWN0ZWQnLCBkYXRhOiBmcmFtZSB9ICk7XHJcblxyXG5cdH1cclxuXHJcblx0dGhpcy5feHJGcmFtZSA9IG51bGw7XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBYUk1hbmFnZXI7XHJcbiIsImltcG9ydCBBbmltYXRpb24gZnJvbSAnLi9BbmltYXRpb24uanMnO1xyXG5pbXBvcnQgUmVuZGVyT2JqZWN0cyBmcm9tICcuL1JlbmRlck9iamVjdHMuanMnO1xyXG5pbXBvcnQgQXR0cmlidXRlcyBmcm9tICcuL0F0dHJpYnV0ZXMuanMnO1xyXG5pbXBvcnQgR2VvbWV0cmllcyBmcm9tICcuL0dlb21ldHJpZXMuanMnO1xyXG5pbXBvcnQgSW5mbyBmcm9tICcuL0luZm8uanMnO1xyXG5pbXBvcnQgUGlwZWxpbmVzIGZyb20gJy4vUGlwZWxpbmVzLmpzJztcclxuaW1wb3J0IEJpbmRpbmdzIGZyb20gJy4vQmluZGluZ3MuanMnO1xyXG5pbXBvcnQgUmVuZGVyTGlzdHMgZnJvbSAnLi9SZW5kZXJMaXN0cy5qcyc7XHJcbmltcG9ydCBSZW5kZXJDb250ZXh0cyBmcm9tICcuL1JlbmRlckNvbnRleHRzLmpzJztcclxuaW1wb3J0IFRleHR1cmVzIGZyb20gJy4vVGV4dHVyZXMuanMnO1xyXG5pbXBvcnQgQmFja2dyb3VuZCBmcm9tICcuL0JhY2tncm91bmQuanMnO1xyXG5pbXBvcnQgTm9kZXMgZnJvbSAnLi9ub2Rlcy9Ob2Rlcy5qcyc7XHJcbmltcG9ydCBDb2xvcjQgZnJvbSAnLi9Db2xvcjQuanMnO1xyXG5pbXBvcnQgQ2xpcHBpbmdDb250ZXh0IGZyb20gJy4vQ2xpcHBpbmdDb250ZXh0LmpzJztcclxuaW1wb3J0IFF1YWRNZXNoIGZyb20gJy4vUXVhZE1lc2guanMnO1xyXG5pbXBvcnQgUmVuZGVyQnVuZGxlcyBmcm9tICcuL1JlbmRlckJ1bmRsZXMuanMnO1xyXG5pbXBvcnQgTm9kZUxpYnJhcnkgZnJvbSAnLi9ub2Rlcy9Ob2RlTGlicmFyeS5qcyc7XHJcbmltcG9ydCBMaWdodGluZyBmcm9tICcuL0xpZ2h0aW5nLmpzJztcclxuaW1wb3J0IFhSTWFuYWdlciBmcm9tICcuL1hSTWFuYWdlci5qcyc7XHJcblxyXG5pbXBvcnQgTm9kZU1hdGVyaWFsIGZyb20gJy4uLy4uL21hdGVyaWFscy9ub2Rlcy9Ob2RlTWF0ZXJpYWwuanMnO1xyXG5cclxuaW1wb3J0IHsgU2NlbmUgfSBmcm9tICcuLi8uLi9zY2VuZXMvU2NlbmUuanMnO1xyXG5pbXBvcnQgeyBGcnVzdHVtIH0gZnJvbSAnLi4vLi4vbWF0aC9GcnVzdHVtLmpzJztcclxuaW1wb3J0IHsgTWF0cml4NCB9IGZyb20gJy4uLy4uL21hdGgvTWF0cml4NC5qcyc7XHJcbmltcG9ydCB7IFZlY3RvcjIgfSBmcm9tICcuLi8uLi9tYXRoL1ZlY3RvcjIuanMnO1xyXG5pbXBvcnQgeyBWZWN0b3I0IH0gZnJvbSAnLi4vLi4vbWF0aC9WZWN0b3I0LmpzJztcclxuaW1wb3J0IHsgUmVuZGVyVGFyZ2V0IH0gZnJvbSAnLi4vLi4vY29yZS9SZW5kZXJUYXJnZXQuanMnO1xyXG5pbXBvcnQgeyBEb3VibGVTaWRlLCBCYWNrU2lkZSwgRnJvbnRTaWRlLCBTUkdCQ29sb3JTcGFjZSwgTm9Ub25lTWFwcGluZywgTGluZWFyRmlsdGVyLCBMaW5lYXJTUkdCQ29sb3JTcGFjZSwgSGFsZkZsb2F0VHlwZSwgUkdCQUZvcm1hdCwgUENGU2hhZG93TWFwIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzLmpzJztcclxuXHJcbmNvbnN0IF9zY2VuZSA9IC8qQF9fUFVSRV9fKi8gbmV3IFNjZW5lKCk7XHJcbmNvbnN0IF9kcmF3aW5nQnVmZmVyU2l6ZSA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjIoKTtcclxuY29uc3QgX3NjcmVlbiA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjQoKTtcclxuY29uc3QgX2ZydXN0dW0gPSAvKkBfX1BVUkVfXyovIG5ldyBGcnVzdHVtKCk7XHJcbmNvbnN0IF9wcm9qU2NyZWVuTWF0cml4ID0gLypAX19QVVJFX18qLyBuZXcgTWF0cml4NCgpO1xyXG5jb25zdCBfdmVjdG9yNCA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjQoKTtcclxuXHJcbi8qKlxyXG4gKiBCYXNlIGNsYXNzIGZvciByZW5kZXJlcnMuXHJcbiAqL1xyXG5jbGFzcyBSZW5kZXJlciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbmRlcmVyIG9wdGlvbnMuXHJcblx0ICpcclxuXHQgKiBAdHlwZWRlZiB7T2JqZWN0fSBSZW5kZXJlcn5PcHRpb25zXHJcblx0ICogQHByb3BlcnR5IHtib29sZWFufSBbbG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcj1mYWxzZV0gLSBXaGV0aGVyIGxvZ2FyaXRobWljIGRlcHRoIGJ1ZmZlciBpcyBlbmFibGVkIG9yIG5vdC5cclxuXHQgKiBAcHJvcGVydHkge2Jvb2xlYW59IFthbHBoYT10cnVlXSAtIFdoZXRoZXIgdGhlIGRlZmF1bHQgZnJhbWVidWZmZXIgKHdoaWNoIHJlcHJlc2VudHMgdGhlIGZpbmFsIGNvbnRlbnRzIG9mIHRoZSBjYW52YXMpIHNob3VsZCBiZSB0cmFuc3BhcmVudCBvciBvcGFxdWUuXHJcblx0ICogQHByb3BlcnR5IHtib29sZWFufSBbZGVwdGg9dHJ1ZV0gLSBXaGV0aGVyIHRoZSBkZWZhdWx0IGZyYW1lYnVmZmVyIHNob3VsZCBoYXZlIGEgZGVwdGggYnVmZmVyIG9yIG5vdC5cclxuXHQgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtzdGVuY2lsPWZhbHNlXSAtIFdoZXRoZXIgdGhlIGRlZmF1bHQgZnJhbWVidWZmZXIgc2hvdWxkIGhhdmUgYSBzdGVuY2lsIGJ1ZmZlciBvciBub3QuXHJcblx0ICogQHByb3BlcnR5IHtib29sZWFufSBbYW50aWFsaWFzPWZhbHNlXSAtIFdoZXRoZXIgTVNBQSBhcyB0aGUgZGVmYXVsdCBhbnRpLWFsaWFzaW5nIHNob3VsZCBiZSBlbmFibGVkIG9yIG5vdC5cclxuXHQgKiBAcHJvcGVydHkge251bWJlcn0gW3NhbXBsZXM9MF0gLSBXaGVuIGBhbnRpYWxpYXNgIGlzIGB0cnVlYCwgYDRgIHNhbXBsZXMgYXJlIHVzZWQgYnkgZGVmYXVsdC4gVGhpcyBwYXJhbWV0ZXIgY2FuIHNldCB0byBhbnkgb3RoZXIgaW50ZWdlciB2YWx1ZSB0aGFuIDBcclxuXHQgKiB0byBvdmVyd3JpdGUgdGhlIGRlZmF1bHQuXHJcblx0ICogQHByb3BlcnR5IHs/RnVuY3Rpb259IFtnZXRGYWxsYmFjaz1udWxsXSAtIFRoaXMgY2FsbGJhY2sgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBhIGZhbGxiYWNrIGJhY2tlbmQsIGlmIHRoZSBwcmltYXJ5IGJhY2tlbmQgY2FuJ3QgYmUgdGFyZ2V0ZWQuXHJcblx0ICogQHByb3BlcnR5IHtudW1iZXJ9IFtjb2xvckJ1ZmZlclR5cGU9SGFsZkZsb2F0VHlwZV0gLSBEZWZpbmVzIHRoZSB0eXBlIG9mIGNvbG9yIGJ1ZmZlcnMuIFRoZSBkZWZhdWx0IGBIYWxmRmxvYXRUeXBlYCBpcyByZWNvbW1lbmQgZm9yIGJlc3RcclxuXHQgKiBxdWFsaXR5LiBUbyBzYXZlIG1lbW9yeSBhbmQgYmFuZHdpZHRoLCBgVW5zaWduZWRCeXRlVHlwZWAgbWlnaHQgYmUgdXNlZC4gVGhpcyB3aWxsIHJlZHVjZSByZW5kZXJpbmcgcXVhbGl0eSB0aG91Z2guXHJcblx0ICovXHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgcmVuZGVyZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0JhY2tlbmR9IGJhY2tlbmQgLSBUaGUgYmFja2VuZCB0aGUgcmVuZGVyZXIgaXMgdGFyZ2V0aW5nIChlLmcuIFdlYkdQVSBvciBXZWJHTCAyKS5cclxuXHQgKiBAcGFyYW0ge1JlbmRlcmVyfk9wdGlvbnN9IFtwYXJhbWV0ZXJzXSAtIFRoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlci5cclxuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGJhY2tlbmQsIHBhcmFtZXRlcnMgPSB7fSApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNSZW5kZXJlciA9IHRydWU7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCB7XHJcblx0XHRcdGxvZ2FyaXRobWljRGVwdGhCdWZmZXIgPSBmYWxzZSxcclxuXHRcdFx0YWxwaGEgPSB0cnVlLFxyXG5cdFx0XHRkZXB0aCA9IHRydWUsXHJcblx0XHRcdHN0ZW5jaWwgPSBmYWxzZSxcclxuXHRcdFx0YW50aWFsaWFzID0gZmFsc2UsXHJcblx0XHRcdHNhbXBsZXMgPSAwLFxyXG5cdFx0XHRnZXRGYWxsYmFjayA9IG51bGwsXHJcblx0XHRcdGNvbG9yQnVmZmVyVHlwZSA9IEhhbGZGbG9hdFR5cGVcclxuXHRcdH0gPSBwYXJhbWV0ZXJzO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIGNhbnZhcyBlbGVtZW50IHRoZSByZW5kZXJlciBpcyBkcmF3aW5nIHRvLlxyXG5cdFx0ICogVGhpcyB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5IHdpbGwgYXV0b21hdGljYWxseSBiZSBjcmVhdGVkIGJ5XHJcblx0XHQgKiB0aGUgcmVuZGVyZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0hUTUxDYW52YXNFbGVtZW50fE9mZnNjcmVlbkNhbnZhc31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kb21FbGVtZW50ID0gYmFja2VuZC5nZXREb21FbGVtZW50KCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBiYWNrZW5kLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtCYWNrZW5kfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJhY2tlbmQgPSBiYWNrZW5kO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG51bWJlciBvZiBNU0FBIHNhbXBsZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zYW1wbGVzID0gc2FtcGxlcyB8fCAoIGFudGlhbGlhcyA9PT0gdHJ1ZSApID8gNCA6IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSByZW5kZXJlciBzaG91bGQgYXV0b21hdGljYWxseSBjbGVhciB0aGUgY3VycmVudCByZW5kZXJpbmcgdGFyZ2V0XHJcblx0XHQgKiBiZWZvcmUgZXhlY3V0ZSBhIGByZW5kZXIoKWAgY2FsbC4gVGhlIHRhcmdldCBjYW4gYmUgdGhlIGNhbnZhcyAoZGVmYXVsdCBmcmFtZWJ1ZmZlcilcclxuXHRcdCAqIG9yIHRoZSBjdXJyZW50IGJvdW5kIHJlbmRlciB0YXJnZXQgKGN1c3RvbSBmcmFtZWJ1ZmZlcikuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYXV0b0NsZWFyID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZW4gYGF1dG9DbGVhcmAgaXMgc2V0IHRvIGB0cnVlYCwgdGhpcyBwcm9wZXJ0eSBkZWZpbmVzIHdoZXRoZXIgdGhlIHJlbmRlcmVyXHJcblx0XHQgKiBzaG91bGQgY2xlYXIgdGhlIGNvbG9yIGJ1ZmZlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hdXRvQ2xlYXJDb2xvciA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGVuIGBhdXRvQ2xlYXJgIGlzIHNldCB0byBgdHJ1ZWAsIHRoaXMgcHJvcGVydHkgZGVmaW5lcyB3aGV0aGVyIHRoZSByZW5kZXJlclxyXG5cdFx0ICogc2hvdWxkIGNsZWFyIHRoZSBkZXB0aCBidWZmZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYXV0b0NsZWFyRGVwdGggPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hlbiBgYXV0b0NsZWFyYCBpcyBzZXQgdG8gYHRydWVgLCB0aGlzIHByb3BlcnR5IGRlZmluZXMgd2hldGhlciB0aGUgcmVuZGVyZXJcclxuXHRcdCAqIHNob3VsZCBjbGVhciB0aGUgc3RlbmNpbCBidWZmZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYXV0b0NsZWFyU3RlbmNpbCA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSBkZWZhdWx0IGZyYW1lYnVmZmVyIHNob3VsZCBiZSB0cmFuc3BhcmVudCBvciBvcGFxdWUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYWxwaGEgPSBhbHBoYTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgbG9nYXJpdGhtaWMgZGVwdGggYnVmZmVyIGlzIGVuYWJsZWQgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyID0gbG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgdGhlIG91dHB1dCBjb2xvciBzcGFjZSBvZiB0aGUgcmVuZGVyZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3N0cmluZ31cclxuXHRcdCAqIEBkZWZhdWx0IFNSR0JDb2xvclNwYWNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMub3V0cHV0Q29sb3JTcGFjZSA9IFNSR0JDb2xvclNwYWNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVmaW5lcyB0aGUgdG9uZSBtYXBwaW5nIG9mIHRoZSByZW5kZXJlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgTm9Ub25lTWFwcGluZ1xyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRvbmVNYXBwaW5nID0gTm9Ub25lTWFwcGluZztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgdGhlIHRvbmUgbWFwcGluZyBleHBvc3VyZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRvbmVNYXBwaW5nRXhwb3N1cmUgPSAxLjA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSByZW5kZXJlciBzaG91bGQgc29ydCBpdHMgcmVuZGVyIGxpc3RzIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBOb3RlOiBTb3J0aW5nIGlzIHVzZWQgdG8gYXR0ZW1wdCB0byBwcm9wZXJseSByZW5kZXIgb2JqZWN0cyB0aGF0IGhhdmUgc29tZSBkZWdyZWUgb2YgdHJhbnNwYXJlbmN5LlxyXG5cdFx0ICogQnkgZGVmaW5pdGlvbiwgc29ydGluZyBvYmplY3RzIG1heSBub3Qgd29yayBpbiBhbGwgY2FzZXMuIERlcGVuZGluZyBvbiB0aGUgbmVlZHMgb2YgYXBwbGljYXRpb24sXHJcblx0XHQgKiBpdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIHR1cm4gb2ZmIHNvcnRpbmcgYW5kIHVzZSBvdGhlciBtZXRob2RzIHRvIGRlYWwgd2l0aCB0cmFuc3BhcmVuY3kgcmVuZGVyaW5nXHJcblx0XHQgKiBlLmcuIG1hbnVhbGx5IGRldGVybWluaW5nIGVhY2ggb2JqZWN0J3MgcmVuZGVyaW5nIG9yZGVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNvcnRPYmplY3RzID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIGRlZmF1bHQgZnJhbWVidWZmZXIgc2hvdWxkIGhhdmUgYSBkZXB0aCBidWZmZXIgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRlcHRoID0gZGVwdGg7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSBkZWZhdWx0IGZyYW1lYnVmZmVyIHNob3VsZCBoYXZlIGEgc3RlbmNpbCBidWZmZXIgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zdGVuY2lsID0gc3RlbmNpbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEhvbGRzIGEgc2VyaWVzIG9mIHN0YXRpc3RpY2FsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBHUFUgbWVtb3J5XHJcblx0XHQgKiBhbmQgdGhlIHJlbmRlcmluZyBwcm9jZXNzLiBVc2VmdWwgZm9yIGRlYnVnZ2luZyBhbmQgbW9uaXRvcmluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7SW5mb31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pbmZvID0gbmV3IEluZm8oKTtcclxuXHJcblx0XHR0aGlzLm5vZGVzID0ge1xyXG5cdFx0XHRtb2RlbFZpZXdNYXRyaXg6IG51bGwsXHJcblx0XHRcdG1vZGVsTm9ybWFsVmlld01hdHJpeDogbnVsbFxyXG5cdFx0fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBub2RlIGxpYnJhcnkgZGVmaW5lcyBob3cgY2VydGFpbiBsaWJyYXJ5IG9iamVjdHMgbGlrZSBtYXRlcmlhbHMsIGxpZ2h0c1xyXG5cdFx0ICogb3IgdG9uZSBtYXBwaW5nIGZ1bmN0aW9ucyBhcmUgbWFwcGVkIHRvIG5vZGUgdHlwZXMuIFRoaXMgaXMgcmVxdWlyZWQgc2luY2VcclxuXHRcdCAqIGFsdGhvdWdoIGluc3RhbmNlcyBvZiBjbGFzc2VzIGxpa2UgYE1lc2hCYXNpY01hdGVyaWFsYCBvciBgUG9pbnRMaWdodGAgY2FuXHJcblx0XHQgKiBiZSBwYXJ0IG9mIHRoZSBzY2VuZSBncmFwaCwgdGhleSBhcmUgaW50ZXJuYWxseSByZXByZXNlbnRlZCBhcyBub2RlcyBmb3JcclxuXHRcdCAqIGZ1cnRoZXIgcHJvY2Vzc2luZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZUxpYnJhcnl9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubGlicmFyeSA9IG5ldyBOb2RlTGlicmFyeSgpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBtYXAtbGlrZSBkYXRhIHN0cnVjdHVyZSBmb3IgbWFuYWdpbmcgbGlnaHRzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtMaWdodGluZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5saWdodGluZyA9IG5ldyBMaWdodGluZygpO1xyXG5cclxuXHRcdC8vIGludGVybmFsc1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBjYWxsYmFjayBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBwcm92aWRlIGEgZmFsbGJhY2sgYmFja2VuZCwgaWYgdGhlIHByaW1hcnkgYmFja2VuZCBjYW4ndCBiZSB0YXJnZXRlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUgez9GdW5jdGlvbn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fZ2V0RmFsbGJhY2sgPSBnZXRGYWxsYmFjaztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByZW5kZXJlcidzIHBpeGVsIHJhdGlvLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9waXhlbFJhdGlvID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB3aWR0aCBvZiB0aGUgcmVuZGVyZXIncyBkZWZhdWx0IGZyYW1lYnVmZmVyIGluIGxvZ2ljYWwgcGl4ZWwgdW5pdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fd2lkdGggPSB0aGlzLmRvbUVsZW1lbnQud2lkdGg7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgaGVpZ2h0IG9mIHRoZSByZW5kZXJlcidzIGRlZmF1bHQgZnJhbWVidWZmZXIgaW4gbG9naWNhbCBwaXhlbCB1bml0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9oZWlnaHQgPSB0aGlzLmRvbUVsZW1lbnQuaGVpZ2h0O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHZpZXdwb3J0IG9mIHRoZSByZW5kZXJlciBpbiBsb2dpY2FsIHBpeGVsIHVuaXQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHtWZWN0b3I0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl92aWV3cG9ydCA9IG5ldyBWZWN0b3I0KCAwLCAwLCB0aGlzLl93aWR0aCwgdGhpcy5faGVpZ2h0ICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc2Npc3NvciByZWN0YW5nbGUgb2YgdGhlIHJlbmRlcmVyIGluIGxvZ2ljYWwgcGl4ZWwgdW5pdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjR9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX3NjaXNzb3IgPSBuZXcgVmVjdG9yNCggMCwgMCwgdGhpcy5fd2lkdGgsIHRoaXMuX2hlaWdodCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgc2Npc3NvciB0ZXN0IHNob3VsZCBiZSBlbmFibGVkIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX3NjaXNzb3JUZXN0ID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZSB0byBhIHJlbmRlcmVyIG1vZHVsZSBmb3IgbWFuYWdpbmcgc2hhZGVyIGF0dHJpYnV0ZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHs/QXR0cmlidXRlc31cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fYXR0cmlidXRlcyA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZSB0byBhIHJlbmRlcmVyIG1vZHVsZSBmb3IgbWFuYWdpbmcgZ2VvbWV0cmllcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUgez9HZW9tZXRyaWVzfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9nZW9tZXRyaWVzID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIGEgcmVuZGVyZXIgbW9kdWxlIGZvciBtYW5hZ2luZyBub2RlIHJlbGF0ZWQgbG9naWMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHs/Tm9kZXN9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX25vZGVzID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIGEgcmVuZGVyZXIgbW9kdWxlIGZvciBtYW5hZ2luZyB0aGUgaW50ZXJuYWwgYW5pbWF0aW9uIGxvb3AuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHs/QW5pbWF0aW9ufVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9hbmltYXRpb24gPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gYSByZW5kZXJlciBtb2R1bGUgZm9yIG1hbmFnaW5nIHNoYWRlciBwcm9ncmFtIGJpbmRpbmdzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7P0JpbmRpbmdzfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9iaW5kaW5ncyA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZSB0byBhIHJlbmRlcmVyIG1vZHVsZSBmb3IgbWFuYWdpbmcgcmVuZGVyIG9iamVjdHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHs/UmVuZGVyT2JqZWN0c31cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fb2JqZWN0cyA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZSB0byBhIHJlbmRlcmVyIG1vZHVsZSBmb3IgbWFuYWdpbmcgcmVuZGVyIGFuZCBjb21wdXRlIHBpcGVsaW5lcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUgez9QaXBlbGluZXN9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX3BpcGVsaW5lcyA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZSB0byBhIHJlbmRlcmVyIG1vZHVsZSBmb3IgbWFuYWdpbmcgcmVuZGVyIGJ1bmRsZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHs/UmVuZGVyQnVuZGxlc31cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fYnVuZGxlcyA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZSB0byBhIHJlbmRlcmVyIG1vZHVsZSBmb3IgbWFuYWdpbmcgcmVuZGVyIGxpc3RzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7P1JlbmRlckxpc3RzfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9yZW5kZXJMaXN0cyA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZSB0byBhIHJlbmRlcmVyIG1vZHVsZSBmb3IgbWFuYWdpbmcgcmVuZGVyIGNvbnRleHRzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7P1JlbmRlckNvbnRleHRzfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9yZW5kZXJDb250ZXh0cyA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZSB0byBhIHJlbmRlcmVyIG1vZHVsZSBmb3IgbWFuYWdpbmcgdGV4dHVyZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZXN9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX3RleHR1cmVzID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIGEgcmVuZGVyZXIgbW9kdWxlIGZvciBiYWNrZ3JvdW5kcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUgez9CYWNrZ3JvdW5kfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9iYWNrZ3JvdW5kID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZnVsbHNjcmVlbiBxdWFkIGlzIHVzZWQgZm9yIGludGVybmFsIHJlbmRlciBwYXNzZXNcclxuXHRcdCAqIGxpa2UgdGhlIHRvbmUgbWFwcGluZyBhbmQgY29sb3Igc3BhY2Ugb3V0cHV0IHBhc3MuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHtRdWFkTWVzaH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fcXVhZCA9IG5ldyBRdWFkTWVzaCggbmV3IE5vZGVNYXRlcmlhbCgpICk7XHJcblx0XHR0aGlzLl9xdWFkLm1hdGVyaWFsLm5hbWUgPSAnUmVuZGVyZXJfb3V0cHV0JztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IHJlbmRlciBjb250ZXh0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7P1JlbmRlckNvbnRleHR9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX2N1cnJlbnRSZW5kZXJDb250ZXh0ID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgY3VzdG9tIHNvcnQgZnVuY3Rpb24gZm9yIHRoZSBvcGFxdWUgcmVuZGVyIGxpc3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHs/RnVuY3Rpb259XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX29wYXF1ZVNvcnQgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBjdXN0b20gc29ydCBmdW5jdGlvbiBmb3IgdGhlIHRyYW5zcGFyZW50IHJlbmRlciBsaXN0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7P0Z1bmN0aW9ufVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl90cmFuc3BhcmVudFNvcnQgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGZyYW1lYnVmZmVyIHRhcmdldC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUgez9SZW5kZXJUYXJnZXR9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX2ZyYW1lQnVmZmVyVGFyZ2V0ID0gbnVsbDtcclxuXHJcblx0XHRjb25zdCBhbHBoYUNsZWFyID0gdGhpcy5hbHBoYSA9PT0gdHJ1ZSA/IDAgOiAxO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNsZWFyIGNvbG9yIHZhbHVlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7Q29sb3I0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9jbGVhckNvbG9yID0gbmV3IENvbG9yNCggMCwgMCwgMCwgYWxwaGFDbGVhciApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNsZWFyIGRlcHRoIHZhbHVlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9jbGVhckRlcHRoID0gMTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjbGVhciBzdGVuY2lsIHZhbHVlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9jbGVhclN0ZW5jaWwgPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGN1cnJlbnQgcmVuZGVyIHRhcmdldC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUgez9SZW5kZXJUYXJnZXR9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX3JlbmRlclRhcmdldCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYWN0aXZlIGN1YmUgZmFjZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fYWN0aXZlQ3ViZUZhY2UgPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGFjdGl2ZSBtaXBtYXAgbGV2ZWwuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX2FjdGl2ZU1pcG1hcExldmVsID0gMDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjdXJyZW50IG91dHB1dCByZW5kZXIgdGFyZ2V0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7P1JlbmRlclRhcmdldH1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fb3V0cHV0UmVuZGVyVGFyZ2V0ID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBNUlQgc2V0dGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUgez9NUlROb2RlfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9tcnQgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmdW5jdGlvbiBkZWZpbmVzIGhvdyBhIHJlbmRlciBvYmplY3QgaXMgZ29pbmdcclxuXHRcdCAqIHRvIGJlIHJlbmRlcmVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7P0Z1bmN0aW9ufVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9yZW5kZXJPYmplY3RGdW5jdGlvbiA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBVc2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnQgcmVuZGVyIG9iamVjdCBmdW5jdGlvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUgez9GdW5jdGlvbn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fY3VycmVudFJlbmRlck9iamVjdEZ1bmN0aW9uID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFVzZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgY3VycmVudCByZW5kZXIgYnVuZGxlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7P1JlbmRlckJ1bmRsZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fY3VycmVudFJlbmRlckJ1bmRsZSA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBOZXh0IHRvIGBfcmVuZGVyT2JqZWN0RnVuY3Rpb24oKWAsIHRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYW5vdGhlciBob29rXHJcblx0XHQgKiBmb3IgaW5mbHVlbmNpbmcgdGhlIHJlbmRlciBwcm9jZXNzIG9mIGEgcmVuZGVyIG9iamVjdC4gSXQgaXMgbWVhbnQgZm9yIGludGVybmFsXHJcblx0XHQgKiB1c2UgYW5kIG9ubHkgcmVsZXZhbnQgZm9yIGBjb21waWxlQXN5bmMoKWAgcmlnaHQgbm93LiBJbnN0ZWFkIG9mIHVzaW5nXHJcblx0XHQgKiB0aGUgZGVmYXVsdCBsb2dpYyBvZiBgX3JlbmRlck9iamVjdERpcmVjdCgpYCB3aGljaCBhY3R1YWxseSBkcmF3cyB0aGUgcmVuZGVyIG9iamVjdCxcclxuXHRcdCAqIGEgZGlmZmVyZW50IGZ1bmN0aW9uIG1pZ2h0IGJlIHVzZWQgd2hpY2ggcGVyZm9ybXMgbm8gZHJhdyBidXQganVzdCB0aGUgbm9kZVxyXG5cdFx0ICogYW5kIHBpcGVsaW5lIHVwZGF0ZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHs/RnVuY3Rpb259XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX2hhbmRsZU9iamVjdEZ1bmN0aW9uID0gdGhpcy5fcmVuZGVyT2JqZWN0RGlyZWN0O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRldmljZSBoYXMgYmVlbiBsb3N0IG9yIG5vdC4gSW4gV2ViR0wgdGVybXMsIHRoZSBkZXZpY2VcclxuXHRcdCAqIGxvc3QgaXMgY29uc2lkZXJlZCBhcyBhIGNvbnRleHQgbG9zdC4gV2hlbiB0aGlzIGlzIHNldCB0byBgdHJ1ZWAsIHJlbmRlcmluZ1xyXG5cdFx0ICogaXNuJ3QgcG9zc2libGUgYW55bW9yZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl9pc0RldmljZUxvc3QgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBkZWZpbmVzIHdoYXQgc2hvdWxkIGhhcHBlbiB3aGVuIGEgZGV2aWNlL2NvbnRleHQgbG9zdCBvY2N1cnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0Z1bmN0aW9ufVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm9uRGV2aWNlTG9zdCA9IHRoaXMuX29uRGV2aWNlTG9zdDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERlZmluZXMgdGhlIHR5cGUgb2YgY29sb3IgYnVmZmVycy4gVGhlIGRlZmF1bHQgYEhhbGZGbG9hdFR5cGVgIGlzIHJlY29tbWVuZCBmb3JcclxuXHRcdCAqIGJlc3QgcXVhbGl0eS4gVG8gc2F2ZSBtZW1vcnkgYW5kIGJhbmR3aWR0aCwgYFVuc2lnbmVkQnl0ZVR5cGVgIG1pZ2h0IGJlIHVzZWQuXHJcblx0XHQgKiBUaGlzIHdpbGwgcmVkdWNlIHJlbmRlcmluZyBxdWFsaXR5IHRob3VnaC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IEhhbGZGbG9hdFR5cGVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fY29sb3JCdWZmZXJUeXBlID0gY29sb3JCdWZmZXJUeXBlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgcmVuZGVyZXIgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX2luaXRpYWxpemVkID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZSB0byB0aGUgcHJvbWlzZSB3aGljaCBpbml0aWFsaXplcyB0aGUgcmVuZGVyZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0eXBlIHs/UHJvbWlzZTx0aGlzPn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5faW5pdFByb21pc2UgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQW4gYXJyYXkgb2YgY29tcGlsYXRpb24gcHJvbWlzZXMgd2hpY2ggYXJlIHVzZWQgaW4gYGNvbXBpbGVBc3luYygpYC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUgez9BcnJheTxQcm9taXNlPn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fY29tcGlsYXRpb25Qcm9taXNlcyA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSByZW5kZXJlciBzaG91bGQgcmVuZGVyIHRyYW5zcGFyZW50IHJlbmRlciBvYmplY3RzIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50cmFuc3BhcmVudCA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSByZW5kZXJlciBzaG91bGQgcmVuZGVyIG9wYXF1ZSByZW5kZXIgb2JqZWN0cyBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMub3BhcXVlID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNoYWRvdyBtYXAgY29uZmlndXJhdGlvblxyXG5cdFx0ICogQHR5cGVkZWYge09iamVjdH0gU2hhZG93TWFwQ29uZmlnXHJcblx0XHQgKiBAcHJvcGVydHkge2Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRvIGdsb2JhbGx5IGVuYWJsZSBzaGFkb3dzIG9yIG5vdC5cclxuXHRcdCAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0eXBlIC0gVGhlIHNoYWRvdyBtYXAgdHlwZS5cclxuXHRcdCAqL1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJlbmRlcmVyJ3Mgc2hhZG93IGNvbmZpZ3VyYXRpb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1NoYWRvd01hcENvbmZpZ31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5zaGFkb3dNYXAgPSB7XHJcblx0XHRcdGVuYWJsZWQ6IGZhbHNlLFxyXG5cdFx0XHR0eXBlOiBQQ0ZTaGFkb3dNYXBcclxuXHRcdH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBYUiBjb25maWd1cmF0aW9uLlxyXG5cdFx0ICogQHR5cGVkZWYge09iamVjdH0gWFJDb25maWdcclxuXHRcdCAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZW5hYmxlZCAtIFdoZXRoZXIgdG8gZ2xvYmFsbHkgZW5hYmxlIFhSIG9yIG5vdC5cclxuXHRcdCAqL1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJlbmRlcmVyJ3MgWFIgbWFuYWdlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7WFJNYW5hZ2VyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnhyID0gbmV3IFhSTWFuYWdlciggdGhpcyApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGVidWcgY29uZmlndXJhdGlvbi5cclxuXHRcdCAqIEB0eXBlZGVmIHtPYmplY3R9IERlYnVnQ29uZmlnXHJcblx0XHQgKiBAcHJvcGVydHkge2Jvb2xlYW59IGNoZWNrU2hhZGVyRXJyb3JzIC0gV2hldGhlciBzaGFkZXIgZXJyb3JzIHNob3VsZCBiZSBjaGVja2VkIG9yIG5vdC5cclxuXHRcdCAqIEBwcm9wZXJ0eSB7P0Z1bmN0aW9ufSBvblNoYWRlckVycm9yIC0gQSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGV4ZWN1dGVkIHdoZW4gYSBzaGFkZXIgZXJyb3IgaGFwcGVucy4gT25seSBzdXBwb3J0ZWQgd2l0aCBXZWJHTCAyIHJpZ2h0IG5vdy5cclxuXHRcdCAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGdldFNoYWRlckFzeW5jIC0gQWxsb3dzIHRoZSBnZXQgdGhlIHJhdyBzaGFkZXIgY29kZSBmb3IgdGhlIGdpdmVuIHNjZW5lLCBjYW1lcmEgYW5kIDNEIG9iamVjdC5cclxuXHRcdCAqL1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJlbmRlcmVyJ3MgZGVidWcgY29uZmlndXJhdGlvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7RGVidWdDb25maWd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGVidWcgPSB7XHJcblx0XHRcdGNoZWNrU2hhZGVyRXJyb3JzOiB0cnVlLFxyXG5cdFx0XHRvblNoYWRlckVycm9yOiBudWxsLFxyXG5cdFx0XHRnZXRTaGFkZXJBc3luYzogYXN5bmMgKCBzY2VuZSwgY2FtZXJhLCBvYmplY3QgKSA9PiB7XHJcblxyXG5cdFx0XHRcdGF3YWl0IHRoaXMuY29tcGlsZUFzeW5jKCBzY2VuZSwgY2FtZXJhICk7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHJlbmRlckxpc3QgPSB0aGlzLl9yZW5kZXJMaXN0cy5nZXQoIHNjZW5lLCBjYW1lcmEgKTtcclxuXHRcdFx0XHRjb25zdCByZW5kZXJDb250ZXh0ID0gdGhpcy5fcmVuZGVyQ29udGV4dHMuZ2V0KCBzY2VuZSwgY2FtZXJhLCB0aGlzLl9yZW5kZXJUYXJnZXQgKTtcclxuXHJcblx0XHRcdFx0Y29uc3QgbWF0ZXJpYWwgPSBzY2VuZS5vdmVycmlkZU1hdGVyaWFsIHx8IG9iamVjdC5tYXRlcmlhbDtcclxuXHJcblx0XHRcdFx0Y29uc3QgcmVuZGVyT2JqZWN0ID0gdGhpcy5fb2JqZWN0cy5nZXQoIG9iamVjdCwgbWF0ZXJpYWwsIHNjZW5lLCBjYW1lcmEsIHJlbmRlckxpc3QubGlnaHRzTm9kZSwgcmVuZGVyQ29udGV4dCwgcmVuZGVyQ29udGV4dC5jbGlwcGluZ0NvbnRleHQgKTtcclxuXHJcblx0XHRcdFx0Y29uc3QgeyBmcmFnbWVudFNoYWRlciwgdmVydGV4U2hhZGVyIH0gPSByZW5kZXJPYmplY3QuZ2V0Tm9kZUJ1aWxkZXJTdGF0ZSgpO1xyXG5cclxuXHRcdFx0XHRyZXR1cm4geyBmcmFnbWVudFNoYWRlciwgdmVydGV4U2hhZGVyIH07XHJcblxyXG5cdFx0XHR9XHJcblx0XHR9O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEluaXRpYWxpemVzIHRoZSByZW5kZXJlciBzbyBpdCBpcyByZWFkeSBmb3IgdXNhZ2UuXHJcblx0ICpcclxuXHQgKiBAYXN5bmNcclxuXHQgKiBAcmV0dXJuIHtQcm9taXNlPHRoaXM+fSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSByZW5kZXJlciBoYXMgYmVlbiBpbml0aWFsaXplZC5cclxuXHQgKi9cclxuXHRhc3luYyBpbml0KCkge1xyXG5cclxuXHRcdGlmICggdGhpcy5faW5pdGlhbGl6ZWQgKSB7XHJcblxyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdSZW5kZXJlcjogQmFja2VuZCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLicgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9pbml0UHJvbWlzZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHJldHVybiB0aGlzLl9pbml0UHJvbWlzZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5faW5pdFByb21pc2UgPSBuZXcgUHJvbWlzZSggYXN5bmMgKCByZXNvbHZlLCByZWplY3QgKSA9PiB7XHJcblxyXG5cdFx0XHRsZXQgYmFja2VuZCA9IHRoaXMuYmFja2VuZDtcclxuXHJcblx0XHRcdHRyeSB7XHJcblxyXG5cdFx0XHRcdGF3YWl0IGJhY2tlbmQuaW5pdCggdGhpcyApO1xyXG5cclxuXHRcdFx0fSBjYXRjaCAoIGVycm9yICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIHRoaXMuX2dldEZhbGxiYWNrICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRcdC8vIHRyeSB0aGUgZmFsbGJhY2tcclxuXHJcblx0XHRcdFx0XHR0cnkge1xyXG5cclxuXHRcdFx0XHRcdFx0dGhpcy5iYWNrZW5kID0gYmFja2VuZCA9IHRoaXMuX2dldEZhbGxiYWNrKCBlcnJvciApO1xyXG5cdFx0XHRcdFx0XHRhd2FpdCBiYWNrZW5kLmluaXQoIHRoaXMgKTtcclxuXHJcblx0XHRcdFx0XHR9IGNhdGNoICggZXJyb3IgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRyZWplY3QoIGVycm9yICk7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0cmVqZWN0KCBlcnJvciApO1xyXG5cdFx0XHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0aGlzLl9ub2RlcyA9IG5ldyBOb2RlcyggdGhpcywgYmFja2VuZCApO1xyXG5cdFx0XHR0aGlzLl9hbmltYXRpb24gPSBuZXcgQW5pbWF0aW9uKCB0aGlzLl9ub2RlcywgdGhpcy5pbmZvICk7XHJcblx0XHRcdHRoaXMuX2F0dHJpYnV0ZXMgPSBuZXcgQXR0cmlidXRlcyggYmFja2VuZCApO1xyXG5cdFx0XHR0aGlzLl9iYWNrZ3JvdW5kID0gbmV3IEJhY2tncm91bmQoIHRoaXMsIHRoaXMuX25vZGVzICk7XHJcblx0XHRcdHRoaXMuX2dlb21ldHJpZXMgPSBuZXcgR2VvbWV0cmllcyggdGhpcy5fYXR0cmlidXRlcywgdGhpcy5pbmZvICk7XHJcblx0XHRcdHRoaXMuX3RleHR1cmVzID0gbmV3IFRleHR1cmVzKCB0aGlzLCBiYWNrZW5kLCB0aGlzLmluZm8gKTtcclxuXHRcdFx0dGhpcy5fcGlwZWxpbmVzID0gbmV3IFBpcGVsaW5lcyggYmFja2VuZCwgdGhpcy5fbm9kZXMgKTtcclxuXHRcdFx0dGhpcy5fYmluZGluZ3MgPSBuZXcgQmluZGluZ3MoIGJhY2tlbmQsIHRoaXMuX25vZGVzLCB0aGlzLl90ZXh0dXJlcywgdGhpcy5fYXR0cmlidXRlcywgdGhpcy5fcGlwZWxpbmVzLCB0aGlzLmluZm8gKTtcclxuXHRcdFx0dGhpcy5fb2JqZWN0cyA9IG5ldyBSZW5kZXJPYmplY3RzKCB0aGlzLCB0aGlzLl9ub2RlcywgdGhpcy5fZ2VvbWV0cmllcywgdGhpcy5fcGlwZWxpbmVzLCB0aGlzLl9iaW5kaW5ncywgdGhpcy5pbmZvICk7XHJcblx0XHRcdHRoaXMuX3JlbmRlckxpc3RzID0gbmV3IFJlbmRlckxpc3RzKCB0aGlzLmxpZ2h0aW5nICk7XHJcblx0XHRcdHRoaXMuX2J1bmRsZXMgPSBuZXcgUmVuZGVyQnVuZGxlcygpO1xyXG5cdFx0XHR0aGlzLl9yZW5kZXJDb250ZXh0cyA9IG5ldyBSZW5kZXJDb250ZXh0cygpO1xyXG5cclxuXHRcdFx0Ly9cclxuXHJcblx0XHRcdHRoaXMuX2FuaW1hdGlvbi5zdGFydCgpO1xyXG5cdFx0XHR0aGlzLl9pbml0aWFsaXplZCA9IHRydWU7XHJcblxyXG5cdFx0XHRyZXNvbHZlKCB0aGlzICk7XHJcblxyXG5cdFx0fSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9pbml0UHJvbWlzZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgY29vcmRpbmF0ZSBzeXN0ZW0gb2YgdGhlIHJlbmRlcmVyLiBUaGUgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eVxyXG5cdCAqIGRlcGVuZHMgb24gdGhlIHNlbGVjdGVkIGJhY2tlbmQuIEVpdGhlciBgVEhSRUUuV2ViR0xDb29yZGluYXRlU3lzdGVtYCBvclxyXG5cdCAqIGBUSFJFRS5XZWJHUFVDb29yZGluYXRlU3lzdGVtYC5cclxuXHQgKlxyXG5cdCAqIEByZWFkb25seVxyXG5cdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0ICovXHJcblx0Z2V0IGNvb3JkaW5hdGVTeXN0ZW0oKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuYmFja2VuZC5jb29yZGluYXRlU3lzdGVtO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXBpbGVzIGFsbCBtYXRlcmlhbHMgaW4gdGhlIGdpdmVuIHNjZW5lLiBUaGlzIGNhbiBiZSB1c2VmdWwgdG8gYXZvaWQgYVxyXG5cdCAqIHBoZW5vbWVub24gd2hpY2ggaXMgY2FsbGVkIFwic2hhZGVyIGNvbXBpbGF0aW9uIHN0dXR0ZXJcIiwgd2hpY2ggb2NjdXJzIHdoZW5cclxuXHQgKiByZW5kZXJpbmcgYW4gb2JqZWN0IHdpdGggYSBuZXcgc2hhZGVyIGZvciB0aGUgZmlyc3QgdGltZS5cclxuXHQgKlxyXG5cdCAqIElmIHlvdSB3YW50IHRvIGFkZCBhIDNEIG9iamVjdCB0byBhbiBleGlzdGluZyBzY2VuZSwgdXNlIHRoZSB0aGlyZCBvcHRpb25hbFxyXG5cdCAqIHBhcmFtZXRlciBmb3IgYXBwbHlpbmcgdGhlIHRhcmdldCBzY2VuZS4gTm90ZSB0aGF0IHRoZSAodGFyZ2V0KSBzY2VuZSdzIGxpZ2h0aW5nXHJcblx0ICogYW5kIGVudmlyb25tZW50IG11c3QgYmUgY29uZmlndXJlZCBiZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZC5cclxuXHQgKlxyXG5cdCAqIEBhc3luY1xyXG5cdCAqIEBwYXJhbSB7T2JqZWN0M0R9IHNjZW5lIC0gVGhlIHNjZW5lIG9yIDNEIG9iamVjdCB0byBwcmVjb21waWxlLlxyXG5cdCAqIEBwYXJhbSB7Q2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIHRoYXQgaXMgdXNlZCB0byByZW5kZXIgdGhlIHNjZW5lLlxyXG5cdCAqIEBwYXJhbSB7P1NjZW5lfSB0YXJnZXRTY2VuZSAtIElmIHRoZSBmaXJzdCBhcmd1bWVudCBpcyBhIDNEIG9iamVjdCwgdGhpcyBwYXJhbWV0ZXIgbXVzdCByZXByZXNlbnQgdGhlIHNjZW5lIHRoZSAzRCBvYmplY3QgaXMgZ29pbmcgdG8gYmUgYWRkZWQuXHJcblx0ICogQHJldHVybiB7UHJvbWlzZTxBcnJheXx1bmRlZmluZWQ+fSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjb21waWxlIGhhcyBiZWVuIGZpbmlzaGVkLlxyXG5cdCAqL1xyXG5cdGFzeW5jIGNvbXBpbGVBc3luYyggc2NlbmUsIGNhbWVyYSwgdGFyZ2V0U2NlbmUgPSBudWxsICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5faXNEZXZpY2VMb3N0ID09PSB0cnVlICkgcmV0dXJuO1xyXG5cclxuXHRcdGlmICggdGhpcy5faW5pdGlhbGl6ZWQgPT09IGZhbHNlICkgYXdhaXQgdGhpcy5pbml0KCk7XHJcblxyXG5cdFx0Ly8gcHJlc2VydmUgcmVuZGVyIHRyZWVcclxuXHJcblx0XHRjb25zdCBub2RlRnJhbWUgPSB0aGlzLl9ub2Rlcy5ub2RlRnJhbWU7XHJcblxyXG5cdFx0Y29uc3QgcHJldmlvdXNSZW5kZXJJZCA9IG5vZGVGcmFtZS5yZW5kZXJJZDtcclxuXHRcdGNvbnN0IHByZXZpb3VzUmVuZGVyQ29udGV4dCA9IHRoaXMuX2N1cnJlbnRSZW5kZXJDb250ZXh0O1xyXG5cdFx0Y29uc3QgcHJldmlvdXNSZW5kZXJPYmplY3RGdW5jdGlvbiA9IHRoaXMuX2N1cnJlbnRSZW5kZXJPYmplY3RGdW5jdGlvbjtcclxuXHRcdGNvbnN0IHByZXZpb3VzQ29tcGlsYXRpb25Qcm9taXNlcyA9IHRoaXMuX2NvbXBpbGF0aW9uUHJvbWlzZXM7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCBzY2VuZVJlZiA9ICggc2NlbmUuaXNTY2VuZSA9PT0gdHJ1ZSApID8gc2NlbmUgOiBfc2NlbmU7XHJcblxyXG5cdFx0aWYgKCB0YXJnZXRTY2VuZSA9PT0gbnVsbCApIHRhcmdldFNjZW5lID0gc2NlbmU7XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyVGFyZ2V0ID0gdGhpcy5fcmVuZGVyVGFyZ2V0O1xyXG5cdFx0Y29uc3QgcmVuZGVyQ29udGV4dCA9IHRoaXMuX3JlbmRlckNvbnRleHRzLmdldCggdGFyZ2V0U2NlbmUsIGNhbWVyYSwgcmVuZGVyVGFyZ2V0ICk7XHJcblx0XHRjb25zdCBhY3RpdmVNaXBtYXBMZXZlbCA9IHRoaXMuX2FjdGl2ZU1pcG1hcExldmVsO1xyXG5cclxuXHRcdGNvbnN0IGNvbXBpbGF0aW9uUHJvbWlzZXMgPSBbXTtcclxuXHJcblx0XHR0aGlzLl9jdXJyZW50UmVuZGVyQ29udGV4dCA9IHJlbmRlckNvbnRleHQ7XHJcblx0XHR0aGlzLl9jdXJyZW50UmVuZGVyT2JqZWN0RnVuY3Rpb24gPSB0aGlzLnJlbmRlck9iamVjdDtcclxuXHJcblx0XHR0aGlzLl9oYW5kbGVPYmplY3RGdW5jdGlvbiA9IHRoaXMuX2NyZWF0ZU9iamVjdFBpcGVsaW5lO1xyXG5cclxuXHRcdHRoaXMuX2NvbXBpbGF0aW9uUHJvbWlzZXMgPSBjb21waWxhdGlvblByb21pc2VzO1xyXG5cclxuXHRcdG5vZGVGcmFtZS5yZW5kZXJJZCArKztcclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdG5vZGVGcmFtZS51cGRhdGUoKTtcclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdHJlbmRlckNvbnRleHQuZGVwdGggPSB0aGlzLmRlcHRoO1xyXG5cdFx0cmVuZGVyQ29udGV4dC5zdGVuY2lsID0gdGhpcy5zdGVuY2lsO1xyXG5cclxuXHRcdGlmICggISByZW5kZXJDb250ZXh0LmNsaXBwaW5nQ29udGV4dCApIHJlbmRlckNvbnRleHQuY2xpcHBpbmdDb250ZXh0ID0gbmV3IENsaXBwaW5nQ29udGV4dCgpO1xyXG5cdFx0cmVuZGVyQ29udGV4dC5jbGlwcGluZ0NvbnRleHQudXBkYXRlR2xvYmFsKCBzY2VuZVJlZiwgY2FtZXJhICk7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRzY2VuZVJlZi5vbkJlZm9yZVJlbmRlciggdGhpcywgc2NlbmUsIGNhbWVyYSwgcmVuZGVyVGFyZ2V0ICk7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCByZW5kZXJMaXN0ID0gdGhpcy5fcmVuZGVyTGlzdHMuZ2V0KCBzY2VuZSwgY2FtZXJhICk7XHJcblx0XHRyZW5kZXJMaXN0LmJlZ2luKCk7XHJcblxyXG5cdFx0dGhpcy5fcHJvamVjdE9iamVjdCggc2NlbmUsIGNhbWVyYSwgMCwgcmVuZGVyTGlzdCwgcmVuZGVyQ29udGV4dC5jbGlwcGluZ0NvbnRleHQgKTtcclxuXHJcblx0XHQvLyBpbmNsdWRlIGxpZ2h0cyBmcm9tIHRhcmdldCBzY2VuZVxyXG5cdFx0aWYgKCB0YXJnZXRTY2VuZSAhPT0gc2NlbmUgKSB7XHJcblxyXG5cdFx0XHR0YXJnZXRTY2VuZS50cmF2ZXJzZVZpc2libGUoIGZ1bmN0aW9uICggb2JqZWN0ICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIG9iamVjdC5pc0xpZ2h0ICYmIG9iamVjdC5sYXllcnMudGVzdCggY2FtZXJhLmxheWVycyApICkge1xyXG5cclxuXHRcdFx0XHRcdHJlbmRlckxpc3QucHVzaExpZ2h0KCBvYmplY3QgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZW5kZXJMaXN0LmZpbmlzaCgpO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLl90ZXh0dXJlcy51cGRhdGVSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCwgYWN0aXZlTWlwbWFwTGV2ZWwgKTtcclxuXHJcblx0XHRcdGNvbnN0IHJlbmRlclRhcmdldERhdGEgPSB0aGlzLl90ZXh0dXJlcy5nZXQoIHJlbmRlclRhcmdldCApO1xyXG5cclxuXHRcdFx0cmVuZGVyQ29udGV4dC50ZXh0dXJlcyA9IHJlbmRlclRhcmdldERhdGEudGV4dHVyZXM7XHJcblx0XHRcdHJlbmRlckNvbnRleHQuZGVwdGhUZXh0dXJlID0gcmVuZGVyVGFyZ2V0RGF0YS5kZXB0aFRleHR1cmU7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHJlbmRlckNvbnRleHQudGV4dHVyZXMgPSBudWxsO1xyXG5cdFx0XHRyZW5kZXJDb250ZXh0LmRlcHRoVGV4dHVyZSA9IG51bGw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0dGhpcy5fYmFja2dyb3VuZC51cGRhdGUoIHNjZW5lUmVmLCByZW5kZXJMaXN0LCByZW5kZXJDb250ZXh0ICk7XHJcblxyXG5cdFx0Ly8gcHJvY2VzcyByZW5kZXIgbGlzdHNcclxuXHJcblx0XHRjb25zdCBvcGFxdWVPYmplY3RzID0gcmVuZGVyTGlzdC5vcGFxdWU7XHJcblx0XHRjb25zdCB0cmFuc3BhcmVudE9iamVjdHMgPSByZW5kZXJMaXN0LnRyYW5zcGFyZW50O1xyXG5cdFx0Y29uc3QgdHJhbnNwYXJlbnREb3VibGVQYXNzT2JqZWN0cyA9IHJlbmRlckxpc3QudHJhbnNwYXJlbnREb3VibGVQYXNzO1xyXG5cdFx0Y29uc3QgbGlnaHRzTm9kZSA9IHJlbmRlckxpc3QubGlnaHRzTm9kZTtcclxuXHJcblx0XHRpZiAoIHRoaXMub3BhcXVlID09PSB0cnVlICYmIG9wYXF1ZU9iamVjdHMubGVuZ3RoID4gMCApIHRoaXMuX3JlbmRlck9iamVjdHMoIG9wYXF1ZU9iamVjdHMsIGNhbWVyYSwgc2NlbmVSZWYsIGxpZ2h0c05vZGUgKTtcclxuXHRcdGlmICggdGhpcy50cmFuc3BhcmVudCA9PT0gdHJ1ZSAmJiB0cmFuc3BhcmVudE9iamVjdHMubGVuZ3RoID4gMCApIHRoaXMuX3JlbmRlclRyYW5zcGFyZW50cyggdHJhbnNwYXJlbnRPYmplY3RzLCB0cmFuc3BhcmVudERvdWJsZVBhc3NPYmplY3RzLCBjYW1lcmEsIHNjZW5lUmVmLCBsaWdodHNOb2RlICk7XHJcblxyXG5cdFx0Ly8gcmVzdG9yZSByZW5kZXIgdHJlZVxyXG5cclxuXHRcdG5vZGVGcmFtZS5yZW5kZXJJZCA9IHByZXZpb3VzUmVuZGVySWQ7XHJcblxyXG5cdFx0dGhpcy5fY3VycmVudFJlbmRlckNvbnRleHQgPSBwcmV2aW91c1JlbmRlckNvbnRleHQ7XHJcblx0XHR0aGlzLl9jdXJyZW50UmVuZGVyT2JqZWN0RnVuY3Rpb24gPSBwcmV2aW91c1JlbmRlck9iamVjdEZ1bmN0aW9uO1xyXG5cdFx0dGhpcy5fY29tcGlsYXRpb25Qcm9taXNlcyA9IHByZXZpb3VzQ29tcGlsYXRpb25Qcm9taXNlcztcclxuXHJcblx0XHR0aGlzLl9oYW5kbGVPYmplY3RGdW5jdGlvbiA9IHRoaXMuX3JlbmRlck9iamVjdERpcmVjdDtcclxuXHJcblx0XHQvLyB3YWl0IGZvciBhbGwgcHJvbWlzZXMgc2V0dXAgYnkgYmFja2VuZHMgYXdhaXRpbmcgY29tcGlsYXRpb24vbGlua2luZy9waXBlbGluZSBjcmVhdGlvbiB0byBjb21wbGV0ZVxyXG5cclxuXHRcdGF3YWl0IFByb21pc2UuYWxsKCBjb21waWxhdGlvblByb21pc2VzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVuZGVycyB0aGUgc2NlbmUgaW4gYW4gYXN5bmMgZmFzaGlvbi5cclxuXHQgKlxyXG5cdCAqIEBhc3luY1xyXG5cdCAqIEBwYXJhbSB7T2JqZWN0M0R9IHNjZW5lIC0gVGhlIHNjZW5lIG9yIDNEIG9iamVjdCB0byByZW5kZXIuXHJcblx0ICogQHBhcmFtIHtDYW1lcmF9IGNhbWVyYSAtIFRoZSBjYW1lcmEuXHJcblx0ICogQHJldHVybiB7UHJvbWlzZX0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgcmVuZGVyIGhhcyBiZWVuIGZpbmlzaGVkLlxyXG5cdCAqL1xyXG5cdGFzeW5jIHJlbmRlckFzeW5jKCBzY2VuZSwgY2FtZXJhICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5faW5pdGlhbGl6ZWQgPT09IGZhbHNlICkgYXdhaXQgdGhpcy5pbml0KCk7XHJcblxyXG5cdFx0dGhpcy5fcmVuZGVyU2NlbmUoIHNjZW5lLCBjYW1lcmEgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDYW4gYmUgdXNlZCB0byBzeW5jaHJvbml6ZSBDUFUgb3BlcmF0aW9ucyB3aXRoIEdQVSB0YXNrcy4gU28gd2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsXHJcblx0ICogdGhlIENQVSB3YWl0cyBmb3IgdGhlIEdQVSB0byBjb21wbGV0ZSBpdHMgb3BlcmF0aW9uIChlLmcuIGEgY29tcHV0ZSB0YXNrKS5cclxuXHQgKlxyXG5cdCAqIEBhc3luY1xyXG5cdCAqIEByZXR1cm4ge1Byb21pc2V9IEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gc3luY2hyb25pemF0aW9uIGhhcyBiZWVuIGZpbmlzaGVkLlxyXG5cdCAqL1xyXG5cdGFzeW5jIHdhaXRGb3JHUFUoKSB7XHJcblxyXG5cdFx0YXdhaXQgdGhpcy5iYWNrZW5kLndhaXRGb3JHUFUoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBnaXZlbiBNUlQgY29uZmlndXJhdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TVJUTm9kZX0gbXJ0IC0gVGhlIE1SVCBub2RlIHRvIHNldC5cclxuXHQgKiBAcmV0dXJuIHtSZW5kZXJlcn0gQSByZWZlcmVuY2UgdG8gdGhpcyByZW5kZXJlci5cclxuXHQgKi9cclxuXHRzZXRNUlQoIG1ydCApIHtcclxuXHJcblx0XHR0aGlzLl9tcnQgPSBtcnQ7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgTVJUIGNvbmZpZ3VyYXRpb24uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtNUlROb2RlfSBUaGUgTVJUIGNvbmZpZ3VyYXRpb24uXHJcblx0ICovXHJcblx0Z2V0TVJUKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9tcnQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgY29sb3IgYnVmZmVyIHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBjb2xvciBidWZmZXIgdHlwZS5cclxuXHQgKi9cclxuXHRnZXRDb2xvckJ1ZmZlclR5cGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX2NvbG9yQnVmZmVyVHlwZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBkZXZpY2UgbG9zdCBjYWxsYmFjay5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGluZm8gLSBJbmZvcm1hdGlvbiBhYm91dCB0aGUgY29udGV4dCBsb3N0LlxyXG5cdCAqL1xyXG5cdF9vbkRldmljZUxvc3QoIGluZm8gKSB7XHJcblxyXG5cdFx0bGV0IGVycm9yTWVzc2FnZSA9IGBUSFJFRS5XZWJHUFVSZW5kZXJlcjogJHtpbmZvLmFwaX0gRGV2aWNlIExvc3Q6XFxuXFxuTWVzc2FnZTogJHtpbmZvLm1lc3NhZ2V9YDtcclxuXHJcblx0XHRpZiAoIGluZm8ucmVhc29uICkge1xyXG5cclxuXHRcdFx0ZXJyb3JNZXNzYWdlICs9IGBcXG5SZWFzb246ICR7aW5mby5yZWFzb259YDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc29sZS5lcnJvciggZXJyb3JNZXNzYWdlICk7XHJcblxyXG5cdFx0dGhpcy5faXNEZXZpY2VMb3N0ID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW5kZXJzIHRoZSBnaXZlbiByZW5kZXIgYnVuZGxlLlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gYnVuZGxlIC0gUmVuZGVyIGJ1bmRsZSBkYXRhLlxyXG5cdCAqIEBwYXJhbSB7U2NlbmV9IHNjZW5lUmVmIC0gVGhlIHNjZW5lIHRoZSByZW5kZXIgYnVuZGxlIGJlbG9uZ3MgdG8uXHJcblx0ICogQHBhcmFtIHtMaWdodHNOb2RlfSBsaWdodHNOb2RlIC0gVGhlIGxpZ2h0cyBub2RlLlxyXG5cdCAqL1xyXG5cdF9yZW5kZXJCdW5kbGUoIGJ1bmRsZSwgc2NlbmVSZWYsIGxpZ2h0c05vZGUgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBidW5kbGVHcm91cCwgY2FtZXJhLCByZW5kZXJMaXN0IH0gPSBidW5kbGU7XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyQ29udGV4dCA9IHRoaXMuX2N1cnJlbnRSZW5kZXJDb250ZXh0O1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyQnVuZGxlID0gdGhpcy5fYnVuZGxlcy5nZXQoIGJ1bmRsZUdyb3VwLCBjYW1lcmEgKTtcclxuXHRcdGNvbnN0IHJlbmRlckJ1bmRsZURhdGEgPSB0aGlzLmJhY2tlbmQuZ2V0KCByZW5kZXJCdW5kbGUgKTtcclxuXHJcblx0XHRpZiAoIHJlbmRlckJ1bmRsZURhdGEucmVuZGVyQ29udGV4dHMgPT09IHVuZGVmaW5lZCApIHJlbmRlckJ1bmRsZURhdGEucmVuZGVyQ29udGV4dHMgPSBuZXcgU2V0KCk7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCBuZWVkc1VwZGF0ZSA9IGJ1bmRsZUdyb3VwLnZlcnNpb24gIT09IHJlbmRlckJ1bmRsZURhdGEudmVyc2lvbjtcclxuXHRcdGNvbnN0IHJlbmRlckJ1bmRsZU5lZWRzVXBkYXRlID0gcmVuZGVyQnVuZGxlRGF0YS5yZW5kZXJDb250ZXh0cy5oYXMoIHJlbmRlckNvbnRleHQgKSA9PT0gZmFsc2UgfHwgbmVlZHNVcGRhdGU7XHJcblxyXG5cdFx0cmVuZGVyQnVuZGxlRGF0YS5yZW5kZXJDb250ZXh0cy5hZGQoIHJlbmRlckNvbnRleHQgKTtcclxuXHJcblx0XHRpZiAoIHJlbmRlckJ1bmRsZU5lZWRzVXBkYXRlICkge1xyXG5cclxuXHRcdFx0dGhpcy5iYWNrZW5kLmJlZ2luQnVuZGxlKCByZW5kZXJDb250ZXh0ICk7XHJcblxyXG5cdFx0XHRpZiAoIHJlbmRlckJ1bmRsZURhdGEucmVuZGVyT2JqZWN0cyA9PT0gdW5kZWZpbmVkIHx8IG5lZWRzVXBkYXRlICkge1xyXG5cclxuXHRcdFx0XHRyZW5kZXJCdW5kbGVEYXRhLnJlbmRlck9iamVjdHMgPSBbXTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuX2N1cnJlbnRSZW5kZXJCdW5kbGUgPSByZW5kZXJCdW5kbGU7XHJcblxyXG5cdFx0XHRjb25zdCB7XHJcblx0XHRcdFx0dHJhbnNwYXJlbnREb3VibGVQYXNzOiB0cmFuc3BhcmVudERvdWJsZVBhc3NPYmplY3RzLFxyXG5cdFx0XHRcdHRyYW5zcGFyZW50OiB0cmFuc3BhcmVudE9iamVjdHMsXHJcblx0XHRcdFx0b3BhcXVlOiBvcGFxdWVPYmplY3RzXHJcblx0XHRcdH0gPSByZW5kZXJMaXN0O1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLm9wYXF1ZSA9PT0gdHJ1ZSAmJiBvcGFxdWVPYmplY3RzLmxlbmd0aCA+IDAgKSB0aGlzLl9yZW5kZXJPYmplY3RzKCBvcGFxdWVPYmplY3RzLCBjYW1lcmEsIHNjZW5lUmVmLCBsaWdodHNOb2RlICk7XHJcblx0XHRcdGlmICggdGhpcy50cmFuc3BhcmVudCA9PT0gdHJ1ZSAmJiB0cmFuc3BhcmVudE9iamVjdHMubGVuZ3RoID4gMCApIHRoaXMuX3JlbmRlclRyYW5zcGFyZW50cyggdHJhbnNwYXJlbnRPYmplY3RzLCB0cmFuc3BhcmVudERvdWJsZVBhc3NPYmplY3RzLCBjYW1lcmEsIHNjZW5lUmVmLCBsaWdodHNOb2RlICk7XHJcblxyXG5cdFx0XHR0aGlzLl9jdXJyZW50UmVuZGVyQnVuZGxlID0gbnVsbDtcclxuXHJcblx0XHRcdC8vXHJcblxyXG5cdFx0XHR0aGlzLmJhY2tlbmQuZmluaXNoQnVuZGxlKCByZW5kZXJDb250ZXh0LCByZW5kZXJCdW5kbGUgKTtcclxuXHJcblx0XHRcdHJlbmRlckJ1bmRsZURhdGEudmVyc2lvbiA9IGJ1bmRsZUdyb3VwLnZlcnNpb247XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGNvbnN0IHsgcmVuZGVyT2JqZWN0cyB9ID0gcmVuZGVyQnVuZGxlRGF0YTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHJlbmRlck9iamVjdHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgcmVuZGVyT2JqZWN0ID0gcmVuZGVyT2JqZWN0c1sgaSBdO1xyXG5cclxuXHRcdFx0XHRpZiAoIHRoaXMuX25vZGVzLm5lZWRzUmVmcmVzaCggcmVuZGVyT2JqZWN0ICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0dGhpcy5fbm9kZXMudXBkYXRlQmVmb3JlKCByZW5kZXJPYmplY3QgKTtcclxuXHJcblx0XHRcdFx0XHR0aGlzLl9ub2Rlcy51cGRhdGVGb3JSZW5kZXIoIHJlbmRlck9iamVjdCApO1xyXG5cdFx0XHRcdFx0dGhpcy5fYmluZGluZ3MudXBkYXRlRm9yUmVuZGVyKCByZW5kZXJPYmplY3QgKTtcclxuXHJcblx0XHRcdFx0XHR0aGlzLl9ub2Rlcy51cGRhdGVBZnRlciggcmVuZGVyT2JqZWN0ICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5iYWNrZW5kLmFkZEJ1bmRsZSggcmVuZGVyQ29udGV4dCwgcmVuZGVyQnVuZGxlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVuZGVycyB0aGUgc2NlbmUgb3IgM0Qgb2JqZWN0IHdpdGggdGhlIGdpdmVuIGNhbWVyYS4gVGhpcyBtZXRob2QgY2FuIG9ubHkgYmUgY2FsbGVkXHJcblx0ICogaWYgdGhlIHJlbmRlcmVyIGhhcyBiZWVuIGluaXRpYWxpemVkLlxyXG5cdCAqXHJcblx0ICogVGhlIHRhcmdldCBvZiB0aGUgbWV0aG9kIGlzIHRoZSBkZWZhdWx0IGZyYW1lYnVmZmVyIChtZWFuaW5nIHRoZSBjYW52YXMpXHJcblx0ICogb3IgYWx0ZXJuYXRpdmVseSBhIHJlbmRlciB0YXJnZXQgd2hlbiBzcGVjaWZpZWQgdmlhIGBzZXRSZW5kZXJUYXJnZXQoKWAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdDNEfSBzY2VuZSAtIFRoZSBzY2VuZSBvciAzRCBvYmplY3QgdG8gcmVuZGVyLlxyXG5cdCAqIEBwYXJhbSB7Q2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIHRvIHJlbmRlciB0aGUgc2NlbmUgd2l0aC5cclxuXHQgKiBAcmV0dXJuIHs/UHJvbWlzZX0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZSB3aGVuIHRoZSBzY2VuZSBoYXMgYmVlbiByZW5kZXJlZC5cclxuXHQgKiBPbmx5IHJldHVybmVkIHdoZW4gdGhlIHJlbmRlcmVyIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZC5cclxuXHQgKi9cclxuXHRyZW5kZXIoIHNjZW5lLCBjYW1lcmEgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9pbml0aWFsaXplZCA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5SZW5kZXJlcjogLnJlbmRlcigpIGNhbGxlZCBiZWZvcmUgdGhlIGJhY2tlbmQgaXMgaW5pdGlhbGl6ZWQuIFRyeSB1c2luZyAucmVuZGVyQXN5bmMoKSBpbnN0ZWFkLicgKTtcclxuXHJcblx0XHRcdHJldHVybiB0aGlzLnJlbmRlckFzeW5jKCBzY2VuZSwgY2FtZXJhICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuX3JlbmRlclNjZW5lKCBzY2VuZSwgY2FtZXJhICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhbiBpbnRlcm5hbCByZW5kZXIgdGFyZ2V0IHdoaWNoIGlzIHVzZWQgd2hlbiBjb21wdXRpbmcgdGhlIG91dHB1dCB0b25lIG1hcHBpbmdcclxuXHQgKiBhbmQgY29sb3Igc3BhY2UgY29udmVyc2lvbi4gVW5saWtlIGluIGBXZWJHTFJlbmRlcmVyYCwgdGhpcyBpcyBkb25lIGluIGEgc2VwYXJhdGUgcmVuZGVyXHJcblx0ICogcGFzcyBhbmQgbm90IGlubGluZSB0byBhY2hpZXZlIG1vcmUgY29ycmVjdCByZXN1bHRzLlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcmV0dXJuIHs/UmVuZGVyVGFyZ2V0fSBUaGUgcmVuZGVyIHRhcmdldC4gVGhlIG1ldGhvZCByZXR1cm5zIGBudWxsYCBpZiBubyBvdXRwdXQgY29udmVyc2lvbiBzaG91bGQgYmUgYXBwbGllZC5cclxuXHQgKi9cclxuXHRfZ2V0RnJhbWVCdWZmZXJUYXJnZXQoKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBjdXJyZW50VG9uZU1hcHBpbmcsIGN1cnJlbnRDb2xvclNwYWNlIH0gPSB0aGlzO1xyXG5cclxuXHRcdGNvbnN0IHVzZVRvbmVNYXBwaW5nID0gY3VycmVudFRvbmVNYXBwaW5nICE9PSBOb1RvbmVNYXBwaW5nO1xyXG5cdFx0Y29uc3QgdXNlQ29sb3JTcGFjZSA9IGN1cnJlbnRDb2xvclNwYWNlICE9PSBMaW5lYXJTUkdCQ29sb3JTcGFjZTtcclxuXHJcblx0XHRpZiAoIHVzZVRvbmVNYXBwaW5nID09PSBmYWxzZSAmJiB1c2VDb2xvclNwYWNlID09PSBmYWxzZSApIHJldHVybiBudWxsO1xyXG5cclxuXHRcdGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gdGhpcy5nZXREcmF3aW5nQnVmZmVyU2l6ZSggX2RyYXdpbmdCdWZmZXJTaXplICk7XHJcblx0XHRjb25zdCB7IGRlcHRoLCBzdGVuY2lsIH0gPSB0aGlzO1xyXG5cclxuXHRcdGxldCBmcmFtZUJ1ZmZlclRhcmdldCA9IHRoaXMuX2ZyYW1lQnVmZmVyVGFyZ2V0O1xyXG5cclxuXHRcdGlmICggZnJhbWVCdWZmZXJUYXJnZXQgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRmcmFtZUJ1ZmZlclRhcmdldCA9IG5ldyBSZW5kZXJUYXJnZXQoIHdpZHRoLCBoZWlnaHQsIHtcclxuXHRcdFx0XHRkZXB0aEJ1ZmZlcjogZGVwdGgsXHJcblx0XHRcdFx0c3RlbmNpbEJ1ZmZlcjogc3RlbmNpbCxcclxuXHRcdFx0XHR0eXBlOiB0aGlzLl9jb2xvckJ1ZmZlclR5cGUsXHJcblx0XHRcdFx0Zm9ybWF0OiBSR0JBRm9ybWF0LFxyXG5cdFx0XHRcdGNvbG9yU3BhY2U6IExpbmVhclNSR0JDb2xvclNwYWNlLFxyXG5cdFx0XHRcdGdlbmVyYXRlTWlwbWFwczogZmFsc2UsXHJcblx0XHRcdFx0bWluRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXHJcblx0XHRcdFx0bWFnRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXHJcblx0XHRcdFx0c2FtcGxlczogdGhpcy5zYW1wbGVzXHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHRcdGZyYW1lQnVmZmVyVGFyZ2V0LmlzUG9zdFByb2Nlc3NpbmdSZW5kZXJUYXJnZXQgPSB0cnVlO1xyXG5cclxuXHRcdFx0dGhpcy5fZnJhbWVCdWZmZXJUYXJnZXQgPSBmcmFtZUJ1ZmZlclRhcmdldDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0ZnJhbWVCdWZmZXJUYXJnZXQuZGVwdGhCdWZmZXIgPSBkZXB0aDtcclxuXHRcdGZyYW1lQnVmZmVyVGFyZ2V0LnN0ZW5jaWxCdWZmZXIgPSBzdGVuY2lsO1xyXG5cdFx0ZnJhbWVCdWZmZXJUYXJnZXQuc2V0U2l6ZSggd2lkdGgsIGhlaWdodCApO1xyXG5cdFx0ZnJhbWVCdWZmZXJUYXJnZXQudmlld3BvcnQuY29weSggdGhpcy5fdmlld3BvcnQgKTtcclxuXHRcdGZyYW1lQnVmZmVyVGFyZ2V0LnNjaXNzb3IuY29weSggdGhpcy5fc2Npc3NvciApO1xyXG5cdFx0ZnJhbWVCdWZmZXJUYXJnZXQudmlld3BvcnQubXVsdGlwbHlTY2FsYXIoIHRoaXMuX3BpeGVsUmF0aW8gKTtcclxuXHRcdGZyYW1lQnVmZmVyVGFyZ2V0LnNjaXNzb3IubXVsdGlwbHlTY2FsYXIoIHRoaXMuX3BpeGVsUmF0aW8gKTtcclxuXHRcdGZyYW1lQnVmZmVyVGFyZ2V0LnNjaXNzb3JUZXN0ID0gdGhpcy5fc2Npc3NvclRlc3Q7XHJcblxyXG5cdFx0cmV0dXJuIGZyYW1lQnVmZmVyVGFyZ2V0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbmRlcnMgdGhlIHNjZW5lIG9yIDNEIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBjYW1lcmEuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0M0R9IHNjZW5lIC0gVGhlIHNjZW5lIG9yIDNEIG9iamVjdCB0byByZW5kZXIuXHJcblx0ICogQHBhcmFtIHtDYW1lcmF9IGNhbWVyYSAtIFRoZSBjYW1lcmEgdG8gcmVuZGVyIHRoZSBzY2VuZSB3aXRoLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW3VzZUZyYW1lQnVmZmVyVGFyZ2V0PXRydWVdIC0gV2hldGhlciB0byB1c2UgYSBmcmFtZWJ1ZmZlciB0YXJnZXQgb3Igbm90LlxyXG5cdCAqIEByZXR1cm4ge1JlbmRlckNvbnRleHR9IFRoZSBjdXJyZW50IHJlbmRlciBjb250ZXh0LlxyXG5cdCAqL1xyXG5cdF9yZW5kZXJTY2VuZSggc2NlbmUsIGNhbWVyYSwgdXNlRnJhbWVCdWZmZXJUYXJnZXQgPSB0cnVlICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5faXNEZXZpY2VMb3N0ID09PSB0cnVlICkgcmV0dXJuO1xyXG5cclxuXHRcdGNvbnN0IGZyYW1lQnVmZmVyVGFyZ2V0ID0gdXNlRnJhbWVCdWZmZXJUYXJnZXQgPyB0aGlzLl9nZXRGcmFtZUJ1ZmZlclRhcmdldCgpIDogbnVsbDtcclxuXHJcblx0XHQvLyBwcmVzZXJ2ZSByZW5kZXIgdHJlZVxyXG5cclxuXHRcdGNvbnN0IG5vZGVGcmFtZSA9IHRoaXMuX25vZGVzLm5vZGVGcmFtZTtcclxuXHJcblx0XHRjb25zdCBwcmV2aW91c1JlbmRlcklkID0gbm9kZUZyYW1lLnJlbmRlcklkO1xyXG5cdFx0Y29uc3QgcHJldmlvdXNSZW5kZXJDb250ZXh0ID0gdGhpcy5fY3VycmVudFJlbmRlckNvbnRleHQ7XHJcblx0XHRjb25zdCBwcmV2aW91c1JlbmRlck9iamVjdEZ1bmN0aW9uID0gdGhpcy5fY3VycmVudFJlbmRlck9iamVjdEZ1bmN0aW9uO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0Y29uc3Qgc2NlbmVSZWYgPSAoIHNjZW5lLmlzU2NlbmUgPT09IHRydWUgKSA/IHNjZW5lIDogX3NjZW5lO1xyXG5cclxuXHRcdGNvbnN0IG91dHB1dFJlbmRlclRhcmdldCA9IHRoaXMuX3JlbmRlclRhcmdldCB8fCB0aGlzLl9vdXRwdXRSZW5kZXJUYXJnZXQ7XHJcblxyXG5cdFx0Y29uc3QgYWN0aXZlQ3ViZUZhY2UgPSB0aGlzLl9hY3RpdmVDdWJlRmFjZTtcclxuXHRcdGNvbnN0IGFjdGl2ZU1pcG1hcExldmVsID0gdGhpcy5fYWN0aXZlTWlwbWFwTGV2ZWw7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRsZXQgcmVuZGVyVGFyZ2V0O1xyXG5cclxuXHRcdGlmICggZnJhbWVCdWZmZXJUYXJnZXQgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRyZW5kZXJUYXJnZXQgPSBmcmFtZUJ1ZmZlclRhcmdldDtcclxuXHJcblx0XHRcdHRoaXMuc2V0UmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0cmVuZGVyVGFyZ2V0ID0gb3V0cHV0UmVuZGVyVGFyZ2V0O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGNvbnN0IHJlbmRlckNvbnRleHQgPSB0aGlzLl9yZW5kZXJDb250ZXh0cy5nZXQoIHNjZW5lLCBjYW1lcmEsIHJlbmRlclRhcmdldCApO1xyXG5cclxuXHRcdHRoaXMuX2N1cnJlbnRSZW5kZXJDb250ZXh0ID0gcmVuZGVyQ29udGV4dDtcclxuXHRcdHRoaXMuX2N1cnJlbnRSZW5kZXJPYmplY3RGdW5jdGlvbiA9IHRoaXMuX3JlbmRlck9iamVjdEZ1bmN0aW9uIHx8IHRoaXMucmVuZGVyT2JqZWN0O1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0dGhpcy5pbmZvLmNhbGxzICsrO1xyXG5cdFx0dGhpcy5pbmZvLnJlbmRlci5jYWxscyArKztcclxuXHRcdHRoaXMuaW5mby5yZW5kZXIuZnJhbWVDYWxscyArKztcclxuXHJcblx0XHRub2RlRnJhbWUucmVuZGVySWQgPSB0aGlzLmluZm8uY2FsbHM7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCBjb29yZGluYXRlU3lzdGVtID0gdGhpcy5jb29yZGluYXRlU3lzdGVtO1xyXG5cdFx0Y29uc3QgeHIgPSB0aGlzLnhyO1xyXG5cclxuXHRcdGlmICggY2FtZXJhLmNvb3JkaW5hdGVTeXN0ZW0gIT09IGNvb3JkaW5hdGVTeXN0ZW0gJiYgeHIuaXNQcmVzZW50aW5nID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdGNhbWVyYS5jb29yZGluYXRlU3lzdGVtID0gY29vcmRpbmF0ZVN5c3RlbTtcclxuXHRcdFx0Y2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcclxuXHJcblx0XHRcdGlmICggY2FtZXJhLmlzQXJyYXlDYW1lcmEgKSB7XHJcblxyXG5cdFx0XHRcdGZvciAoIGNvbnN0IHN1YkNhbWVyYSBvZiBjYW1lcmEuY2FtZXJhcyApIHtcclxuXHJcblx0XHRcdFx0XHRzdWJDYW1lcmEuY29vcmRpbmF0ZVN5c3RlbSA9IGNvb3JkaW5hdGVTeXN0ZW07XHJcblx0XHRcdFx0XHRzdWJDYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0aWYgKCBzY2VuZS5tYXRyaXhXb3JsZEF1dG9VcGRhdGUgPT09IHRydWUgKSBzY2VuZS51cGRhdGVNYXRyaXhXb3JsZCgpO1xyXG5cclxuXHRcdGlmICggY2FtZXJhLnBhcmVudCA9PT0gbnVsbCAmJiBjYW1lcmEubWF0cml4V29ybGRBdXRvVXBkYXRlID09PSB0cnVlICkgY2FtZXJhLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XHJcblxyXG5cdFx0aWYgKCB4ci5lbmFibGVkID09PSB0cnVlICYmIHhyLmlzUHJlc2VudGluZyA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdGlmICggeHIuY2FtZXJhQXV0b1VwZGF0ZSA9PT0gdHJ1ZSApIHhyLnVwZGF0ZUNhbWVyYSggY2FtZXJhICk7XHJcblx0XHRcdGNhbWVyYSA9IHhyLmdldENhbWVyYSgpOyAvLyB1c2UgWFIgY2FtZXJhIGZvciByZW5kZXJpbmdcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRsZXQgdmlld3BvcnQgPSB0aGlzLl92aWV3cG9ydDtcclxuXHRcdGxldCBzY2lzc29yID0gdGhpcy5fc2Npc3NvcjtcclxuXHRcdGxldCBwaXhlbFJhdGlvID0gdGhpcy5fcGl4ZWxSYXRpbztcclxuXHJcblx0XHRpZiAoIHJlbmRlclRhcmdldCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHZpZXdwb3J0ID0gcmVuZGVyVGFyZ2V0LnZpZXdwb3J0O1xyXG5cdFx0XHRzY2lzc29yID0gcmVuZGVyVGFyZ2V0LnNjaXNzb3I7XHJcblx0XHRcdHBpeGVsUmF0aW8gPSAxO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmdldERyYXdpbmdCdWZmZXJTaXplKCBfZHJhd2luZ0J1ZmZlclNpemUgKTtcclxuXHJcblx0XHRfc2NyZWVuLnNldCggMCwgMCwgX2RyYXdpbmdCdWZmZXJTaXplLndpZHRoLCBfZHJhd2luZ0J1ZmZlclNpemUuaGVpZ2h0ICk7XHJcblxyXG5cdFx0Y29uc3QgbWluRGVwdGggPSAoIHZpZXdwb3J0Lm1pbkRlcHRoID09PSB1bmRlZmluZWQgKSA/IDAgOiB2aWV3cG9ydC5taW5EZXB0aDtcclxuXHRcdGNvbnN0IG1heERlcHRoID0gKCB2aWV3cG9ydC5tYXhEZXB0aCA9PT0gdW5kZWZpbmVkICkgPyAxIDogdmlld3BvcnQubWF4RGVwdGg7XHJcblxyXG5cdFx0cmVuZGVyQ29udGV4dC52aWV3cG9ydFZhbHVlLmNvcHkoIHZpZXdwb3J0ICkubXVsdGlwbHlTY2FsYXIoIHBpeGVsUmF0aW8gKS5mbG9vcigpO1xyXG5cdFx0cmVuZGVyQ29udGV4dC52aWV3cG9ydFZhbHVlLndpZHRoID4+PSBhY3RpdmVNaXBtYXBMZXZlbDtcclxuXHRcdHJlbmRlckNvbnRleHQudmlld3BvcnRWYWx1ZS5oZWlnaHQgPj49IGFjdGl2ZU1pcG1hcExldmVsO1xyXG5cdFx0cmVuZGVyQ29udGV4dC52aWV3cG9ydFZhbHVlLm1pbkRlcHRoID0gbWluRGVwdGg7XHJcblx0XHRyZW5kZXJDb250ZXh0LnZpZXdwb3J0VmFsdWUubWF4RGVwdGggPSBtYXhEZXB0aDtcclxuXHRcdHJlbmRlckNvbnRleHQudmlld3BvcnQgPSByZW5kZXJDb250ZXh0LnZpZXdwb3J0VmFsdWUuZXF1YWxzKCBfc2NyZWVuICkgPT09IGZhbHNlO1xyXG5cclxuXHRcdHJlbmRlckNvbnRleHQuc2Npc3NvclZhbHVlLmNvcHkoIHNjaXNzb3IgKS5tdWx0aXBseVNjYWxhciggcGl4ZWxSYXRpbyApLmZsb29yKCk7XHJcblx0XHRyZW5kZXJDb250ZXh0LnNjaXNzb3IgPSB0aGlzLl9zY2lzc29yVGVzdCAmJiByZW5kZXJDb250ZXh0LnNjaXNzb3JWYWx1ZS5lcXVhbHMoIF9zY3JlZW4gKSA9PT0gZmFsc2U7XHJcblx0XHRyZW5kZXJDb250ZXh0LnNjaXNzb3JWYWx1ZS53aWR0aCA+Pj0gYWN0aXZlTWlwbWFwTGV2ZWw7XHJcblx0XHRyZW5kZXJDb250ZXh0LnNjaXNzb3JWYWx1ZS5oZWlnaHQgPj49IGFjdGl2ZU1pcG1hcExldmVsO1xyXG5cclxuXHRcdGlmICggISByZW5kZXJDb250ZXh0LmNsaXBwaW5nQ29udGV4dCApIHJlbmRlckNvbnRleHQuY2xpcHBpbmdDb250ZXh0ID0gbmV3IENsaXBwaW5nQ29udGV4dCgpO1xyXG5cdFx0cmVuZGVyQ29udGV4dC5jbGlwcGluZ0NvbnRleHQudXBkYXRlR2xvYmFsKCBzY2VuZVJlZiwgY2FtZXJhICk7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRzY2VuZVJlZi5vbkJlZm9yZVJlbmRlciggdGhpcywgc2NlbmUsIGNhbWVyYSwgcmVuZGVyVGFyZ2V0ICk7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRfcHJvalNjcmVlbk1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeCwgY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSApO1xyXG5cdFx0X2ZydXN0dW0uc2V0RnJvbVByb2plY3Rpb25NYXRyaXgoIF9wcm9qU2NyZWVuTWF0cml4LCBjb29yZGluYXRlU3lzdGVtICk7XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyTGlzdCA9IHRoaXMuX3JlbmRlckxpc3RzLmdldCggc2NlbmUsIGNhbWVyYSApO1xyXG5cdFx0cmVuZGVyTGlzdC5iZWdpbigpO1xyXG5cclxuXHRcdHRoaXMuX3Byb2plY3RPYmplY3QoIHNjZW5lLCBjYW1lcmEsIDAsIHJlbmRlckxpc3QsIHJlbmRlckNvbnRleHQuY2xpcHBpbmdDb250ZXh0ICk7XHJcblxyXG5cdFx0cmVuZGVyTGlzdC5maW5pc2goKTtcclxuXHJcblx0XHRpZiAoIHRoaXMuc29ydE9iamVjdHMgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRyZW5kZXJMaXN0LnNvcnQoIHRoaXMuX29wYXF1ZVNvcnQsIHRoaXMuX3RyYW5zcGFyZW50U29ydCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGlmICggcmVuZGVyVGFyZ2V0ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5fdGV4dHVyZXMudXBkYXRlUmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQsIGFjdGl2ZU1pcG1hcExldmVsICk7XHJcblxyXG5cdFx0XHRjb25zdCByZW5kZXJUYXJnZXREYXRhID0gdGhpcy5fdGV4dHVyZXMuZ2V0KCByZW5kZXJUYXJnZXQgKTtcclxuXHJcblx0XHRcdHJlbmRlckNvbnRleHQudGV4dHVyZXMgPSByZW5kZXJUYXJnZXREYXRhLnRleHR1cmVzO1xyXG5cdFx0XHRyZW5kZXJDb250ZXh0LmRlcHRoVGV4dHVyZSA9IHJlbmRlclRhcmdldERhdGEuZGVwdGhUZXh0dXJlO1xyXG5cdFx0XHRyZW5kZXJDb250ZXh0LndpZHRoID0gcmVuZGVyVGFyZ2V0RGF0YS53aWR0aDtcclxuXHRcdFx0cmVuZGVyQ29udGV4dC5oZWlnaHQgPSByZW5kZXJUYXJnZXREYXRhLmhlaWdodDtcclxuXHRcdFx0cmVuZGVyQ29udGV4dC5yZW5kZXJUYXJnZXQgPSByZW5kZXJUYXJnZXQ7XHJcblx0XHRcdHJlbmRlckNvbnRleHQuZGVwdGggPSByZW5kZXJUYXJnZXQuZGVwdGhCdWZmZXI7XHJcblx0XHRcdHJlbmRlckNvbnRleHQuc3RlbmNpbCA9IHJlbmRlclRhcmdldC5zdGVuY2lsQnVmZmVyO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRyZW5kZXJDb250ZXh0LnRleHR1cmVzID0gbnVsbDtcclxuXHRcdFx0cmVuZGVyQ29udGV4dC5kZXB0aFRleHR1cmUgPSBudWxsO1xyXG5cdFx0XHRyZW5kZXJDb250ZXh0LndpZHRoID0gdGhpcy5kb21FbGVtZW50LndpZHRoO1xyXG5cdFx0XHRyZW5kZXJDb250ZXh0LmhlaWdodCA9IHRoaXMuZG9tRWxlbWVudC5oZWlnaHQ7XHJcblx0XHRcdHJlbmRlckNvbnRleHQuZGVwdGggPSB0aGlzLmRlcHRoO1xyXG5cdFx0XHRyZW5kZXJDb250ZXh0LnN0ZW5jaWwgPSB0aGlzLnN0ZW5jaWw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJlbmRlckNvbnRleHQud2lkdGggPj49IGFjdGl2ZU1pcG1hcExldmVsO1xyXG5cdFx0cmVuZGVyQ29udGV4dC5oZWlnaHQgPj49IGFjdGl2ZU1pcG1hcExldmVsO1xyXG5cdFx0cmVuZGVyQ29udGV4dC5hY3RpdmVDdWJlRmFjZSA9IGFjdGl2ZUN1YmVGYWNlO1xyXG5cdFx0cmVuZGVyQ29udGV4dC5hY3RpdmVNaXBtYXBMZXZlbCA9IGFjdGl2ZU1pcG1hcExldmVsO1xyXG5cdFx0cmVuZGVyQ29udGV4dC5vY2NsdXNpb25RdWVyeUNvdW50ID0gcmVuZGVyTGlzdC5vY2NsdXNpb25RdWVyeUNvdW50O1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0dGhpcy5fYmFja2dyb3VuZC51cGRhdGUoIHNjZW5lUmVmLCByZW5kZXJMaXN0LCByZW5kZXJDb250ZXh0ICk7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHR0aGlzLmJhY2tlbmQuYmVnaW5SZW5kZXIoIHJlbmRlckNvbnRleHQgKTtcclxuXHJcblx0XHQvLyBwcm9jZXNzIHJlbmRlciBsaXN0c1xyXG5cclxuXHRcdGNvbnN0IHtcclxuXHRcdFx0YnVuZGxlcyxcclxuXHRcdFx0bGlnaHRzTm9kZSxcclxuXHRcdFx0dHJhbnNwYXJlbnREb3VibGVQYXNzOiB0cmFuc3BhcmVudERvdWJsZVBhc3NPYmplY3RzLFxyXG5cdFx0XHR0cmFuc3BhcmVudDogdHJhbnNwYXJlbnRPYmplY3RzLFxyXG5cdFx0XHRvcGFxdWU6IG9wYXF1ZU9iamVjdHNcclxuXHRcdH0gPSByZW5kZXJMaXN0O1xyXG5cclxuXHRcdGlmICggYnVuZGxlcy5sZW5ndGggPiAwICkgdGhpcy5fcmVuZGVyQnVuZGxlcyggYnVuZGxlcywgc2NlbmVSZWYsIGxpZ2h0c05vZGUgKTtcclxuXHRcdGlmICggdGhpcy5vcGFxdWUgPT09IHRydWUgJiYgb3BhcXVlT2JqZWN0cy5sZW5ndGggPiAwICkgdGhpcy5fcmVuZGVyT2JqZWN0cyggb3BhcXVlT2JqZWN0cywgY2FtZXJhLCBzY2VuZVJlZiwgbGlnaHRzTm9kZSApO1xyXG5cdFx0aWYgKCB0aGlzLnRyYW5zcGFyZW50ID09PSB0cnVlICYmIHRyYW5zcGFyZW50T2JqZWN0cy5sZW5ndGggPiAwICkgdGhpcy5fcmVuZGVyVHJhbnNwYXJlbnRzKCB0cmFuc3BhcmVudE9iamVjdHMsIHRyYW5zcGFyZW50RG91YmxlUGFzc09iamVjdHMsIGNhbWVyYSwgc2NlbmVSZWYsIGxpZ2h0c05vZGUgKTtcclxuXHJcblx0XHQvLyBmaW5pc2ggcmVuZGVyIHBhc3NcclxuXHJcblx0XHR0aGlzLmJhY2tlbmQuZmluaXNoUmVuZGVyKCByZW5kZXJDb250ZXh0ICk7XHJcblxyXG5cdFx0Ly8gcmVzdG9yZSByZW5kZXIgdHJlZVxyXG5cclxuXHRcdG5vZGVGcmFtZS5yZW5kZXJJZCA9IHByZXZpb3VzUmVuZGVySWQ7XHJcblxyXG5cdFx0dGhpcy5fY3VycmVudFJlbmRlckNvbnRleHQgPSBwcmV2aW91c1JlbmRlckNvbnRleHQ7XHJcblx0XHR0aGlzLl9jdXJyZW50UmVuZGVyT2JqZWN0RnVuY3Rpb24gPSBwcmV2aW91c1JlbmRlck9iamVjdEZ1bmN0aW9uO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0aWYgKCBmcmFtZUJ1ZmZlclRhcmdldCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuc2V0UmVuZGVyVGFyZ2V0KCBvdXRwdXRSZW5kZXJUYXJnZXQsIGFjdGl2ZUN1YmVGYWNlLCBhY3RpdmVNaXBtYXBMZXZlbCApO1xyXG5cclxuXHRcdFx0dGhpcy5fcmVuZGVyT3V0cHV0KCByZW5kZXJUYXJnZXQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRzY2VuZVJlZi5vbkFmdGVyUmVuZGVyKCB0aGlzLCBzY2VuZSwgY2FtZXJhLCByZW5kZXJUYXJnZXQgKTtcclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdHJldHVybiByZW5kZXJDb250ZXh0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBvdXRwdXQgcGFzcyBwZXJmb3JtcyB0b25lIG1hcHBpbmcgYW5kIGNvbG9yIHNwYWNlIGNvbnZlcnNpb24uXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyVGFyZ2V0fSByZW5kZXJUYXJnZXQgLSBUaGUgY3VycmVudCByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqL1xyXG5cdF9yZW5kZXJPdXRwdXQoIHJlbmRlclRhcmdldCApIHtcclxuXHJcblx0XHRjb25zdCBxdWFkID0gdGhpcy5fcXVhZDtcclxuXHJcblx0XHRpZiAoIHRoaXMuX25vZGVzLmhhc091dHB1dENoYW5nZSggcmVuZGVyVGFyZ2V0LnRleHR1cmUgKSApIHtcclxuXHJcblx0XHRcdHF1YWQubWF0ZXJpYWwuZnJhZ21lbnROb2RlID0gdGhpcy5fbm9kZXMuZ2V0T3V0cHV0Tm9kZSggcmVuZGVyVGFyZ2V0LnRleHR1cmUgKTtcclxuXHRcdFx0cXVhZC5tYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGEgY2xlYXIgb3BlcmF0aW9uIGNsZWFycyB0aGUgaW50ZXJtZWRpYXRlIHJlbmRlclRhcmdldCB0ZXh0dXJlLCBidXQgc2hvdWxkIG5vdCB1cGRhdGUgdGhlIHNjcmVlbiBjYW52YXMuXHJcblxyXG5cdFx0Y29uc3QgY3VycmVudEF1dG9DbGVhciA9IHRoaXMuYXV0b0NsZWFyO1xyXG5cdFx0Y29uc3QgY3VycmVudFhSID0gdGhpcy54ci5lbmFibGVkO1xyXG5cclxuXHRcdHRoaXMuYXV0b0NsZWFyID0gZmFsc2U7XHJcblx0XHR0aGlzLnhyLmVuYWJsZWQgPSBmYWxzZTtcclxuXHJcblx0XHR0aGlzLl9yZW5kZXJTY2VuZSggcXVhZCwgcXVhZC5jYW1lcmEsIGZhbHNlICk7XHJcblxyXG5cdFx0dGhpcy5hdXRvQ2xlYXIgPSBjdXJyZW50QXV0b0NsZWFyO1xyXG5cdFx0dGhpcy54ci5lbmFibGVkID0gY3VycmVudFhSO1xyXG5cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIGF2YWlsYWJsZSBhbmlzb3Ryb3B5IGZvciB0ZXh0dXJlIGZpbHRlcmluZy5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIG1heGltdW0gYXZhaWxhYmxlIGFuaXNvdHJvcHkuXHJcblx0ICovXHJcblx0Z2V0TWF4QW5pc290cm9weSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5iYWNrZW5kLmdldE1heEFuaXNvdHJvcHkoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBhY3RpdmUgY3ViZSBmYWNlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgYWN0aXZlIGN1YmUgZmFjZS5cclxuXHQgKi9cclxuXHRnZXRBY3RpdmVDdWJlRmFjZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fYWN0aXZlQ3ViZUZhY2U7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgYWN0aXZlIG1pcG1hcCBsZXZlbC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGFjdGl2ZSBtaXBtYXAgbGV2ZWwuXHJcblx0ICovXHJcblx0Z2V0QWN0aXZlTWlwbWFwTGV2ZWwoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX2FjdGl2ZU1pcG1hcExldmVsO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFwcGxpY2F0aW9ucyBhcmUgYWR2aXNlZCB0byBhbHdheXMgZGVmaW5lIHRoZSBhbmltYXRpb24gbG9vcFxyXG5cdCAqIHdpdGggdGhpcyBtZXRob2QgYW5kIG5vdCBtYW51YWxseSB3aXRoIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKWBcclxuXHQgKiBmb3IgYmVzdCBjb21wYXRpYmlsaXR5LlxyXG5cdCAqXHJcblx0ICogQGFzeW5jXHJcblx0ICogQHBhcmFtIHs/RnVuY3Rpb259IGNhbGxiYWNrIC0gVGhlIGFwcGxpY2F0aW9uJ3MgYW5pbWF0aW9uIGxvb3AuXHJcblx0ICogQHJldHVybiB7UHJvbWlzZX0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgc2V0IGhhcyBiZWVuIGV4ZWN1dGVkLlxyXG5cdCAqL1xyXG5cdGFzeW5jIHNldEFuaW1hdGlvbkxvb3AoIGNhbGxiYWNrICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5faW5pdGlhbGl6ZWQgPT09IGZhbHNlICkgYXdhaXQgdGhpcy5pbml0KCk7XHJcblxyXG5cdFx0dGhpcy5fYW5pbWF0aW9uLnNldEFuaW1hdGlvbkxvb3AoIGNhbGxiYWNrICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2FuIGJlIHVzZWQgdG8gdHJhbnNmZXIgYnVmZmVyIGRhdGEgZnJvbSBhIHN0b3JhZ2UgYnVmZmVyIGF0dHJpYnV0ZVxyXG5cdCAqIGZyb20gdGhlIEdQVSB0byB0aGUgQ1BVIGluIGNvbnRleHQgb2YgY29tcHV0ZSBzaGFkZXJzLlxyXG5cdCAqXHJcblx0ICogQGFzeW5jXHJcblx0ICogQHBhcmFtIHtTdG9yYWdlQnVmZmVyQXR0cmlidXRlfSBhdHRyaWJ1dGUgLSBUaGUgc3RvcmFnZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqIEByZXR1cm4ge1Byb21pc2U8QXJyYXlCdWZmZXI+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBidWZmZXIgZGF0YSB3aGVuIHRoZSBkYXRhIGFyZSByZWFkeS5cclxuXHQgKi9cclxuXHRhc3luYyBnZXRBcnJheUJ1ZmZlckFzeW5jKCBhdHRyaWJ1dGUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIGF3YWl0IHRoaXMuYmFja2VuZC5nZXRBcnJheUJ1ZmZlckFzeW5jKCBhdHRyaWJ1dGUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSByZW5kZXJpbmcgY29udGV4dC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0dQVUNhbnZhc0NvbnRleHR8V2ViR0wyUmVuZGVyaW5nQ29udGV4dH0gVGhlIHJlbmRlcmluZyBjb250ZXh0LlxyXG5cdCAqL1xyXG5cdGdldENvbnRleHQoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuYmFja2VuZC5nZXRDb250ZXh0KCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgcGl4ZWwgcmF0aW8uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBwaXhlbCByYXRpby5cclxuXHQgKi9cclxuXHRnZXRQaXhlbFJhdGlvKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9waXhlbFJhdGlvO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGRyYXdpbmcgYnVmZmVyIHNpemUgaW4gcGh5c2ljYWwgcGl4ZWxzLiBUaGlzIG1ldGhvZCBob25vcnMgdGhlIHBpeGVsIHJhdGlvLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSB0YXJnZXQgLSBUaGUgbWV0aG9kIHdyaXRlcyB0aGUgcmVzdWx0IGluIHRoaXMgdGFyZ2V0IG9iamVjdC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBUaGUgZHJhd2luZyBidWZmZXIgc2l6ZS5cclxuXHQgKi9cclxuXHRnZXREcmF3aW5nQnVmZmVyU2l6ZSggdGFyZ2V0ICkge1xyXG5cclxuXHRcdHJldHVybiB0YXJnZXQuc2V0KCB0aGlzLl93aWR0aCAqIHRoaXMuX3BpeGVsUmF0aW8sIHRoaXMuX2hlaWdodCAqIHRoaXMuX3BpeGVsUmF0aW8gKS5mbG9vcigpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHJlbmRlcmVyJ3Mgc2l6ZSBpbiBsb2dpY2FsIHBpeGVscy4gVGhpcyBtZXRob2QgZG9lcyBub3QgaG9ub3IgdGhlIHBpeGVsIHJhdGlvLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSB0YXJnZXQgLSBUaGUgbWV0aG9kIHdyaXRlcyB0aGUgcmVzdWx0IGluIHRoaXMgdGFyZ2V0IG9iamVjdC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3IyfSBUaGUgcmVuZGVyZXIncyBzaXplIGluIGxvZ2ljYWwgcGl4ZWxzLlxyXG5cdCAqL1xyXG5cdGdldFNpemUoIHRhcmdldCApIHtcclxuXHJcblx0XHRyZXR1cm4gdGFyZ2V0LnNldCggdGhpcy5fd2lkdGgsIHRoaXMuX2hlaWdodCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGdpdmVuIHBpeGVsIHJhdGlvIGFuZCByZXNpemVzIHRoZSBjYW52YXMgaWYgbmVjZXNzYXJ5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt2YWx1ZT0xXSAtIFRoZSBwaXhlbCByYXRpby5cclxuXHQgKi9cclxuXHRzZXRQaXhlbFJhdGlvKCB2YWx1ZSA9IDEgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9waXhlbFJhdGlvID09PSB2YWx1ZSApIHJldHVybjtcclxuXHJcblx0XHR0aGlzLl9waXhlbFJhdGlvID0gdmFsdWU7XHJcblxyXG5cdFx0dGhpcy5zZXRTaXplKCB0aGlzLl93aWR0aCwgdGhpcy5faGVpZ2h0LCBmYWxzZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGFsbG93cyB0byBkZWZpbmUgdGhlIGRyYXdpbmcgYnVmZmVyIHNpemUgYnkgc3BlY2lmeWluZ1xyXG5cdCAqIHdpZHRoLCBoZWlnaHQgYW5kIHBpeGVsIHJhdGlvIGFsbCBhdCBvbmNlLiBUaGUgc2l6ZSBvZiB0aGUgZHJhd2luZ1xyXG5cdCAqIGJ1ZmZlciBpcyBjb21wdXRlZCB3aXRoIHRoaXMgZm9ybXVsYTpcclxuXHQgKiBgYGBqc1xyXG5cdCAqIHNpemUueCA9IHdpZHRoICogcGl4ZWxSYXRpbztcclxuXHQgKiBzaXplLnkgPSBoZWlnaHQgKiBwaXhlbFJhdGlvO1xyXG5cdCAqIGBgYFxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIGluIGxvZ2ljYWwgcGl4ZWxzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IGluIGxvZ2ljYWwgcGl4ZWxzLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBwaXhlbFJhdGlvIC0gVGhlIHBpeGVsIHJhdGlvLlxyXG5cdCAqL1xyXG5cdHNldERyYXdpbmdCdWZmZXJTaXplKCB3aWR0aCwgaGVpZ2h0LCBwaXhlbFJhdGlvICkge1xyXG5cclxuXHRcdC8vIFJlbmRlcmVyIGNhbid0IGJlIHJlc2l6ZWQgd2hpbGUgcHJlc2VudGluZyBpbiBYUi5cclxuXHRcdGlmICggdGhpcy54ciAmJiB0aGlzLnhyLmlzUHJlc2VudGluZyApIHJldHVybjtcclxuXHJcblx0XHR0aGlzLl93aWR0aCA9IHdpZHRoO1xyXG5cdFx0dGhpcy5faGVpZ2h0ID0gaGVpZ2h0O1xyXG5cclxuXHRcdHRoaXMuX3BpeGVsUmF0aW8gPSBwaXhlbFJhdGlvO1xyXG5cclxuXHRcdHRoaXMuZG9tRWxlbWVudC53aWR0aCA9IE1hdGguZmxvb3IoIHdpZHRoICogcGl4ZWxSYXRpbyApO1xyXG5cdFx0dGhpcy5kb21FbGVtZW50LmhlaWdodCA9IE1hdGguZmxvb3IoIGhlaWdodCAqIHBpeGVsUmF0aW8gKTtcclxuXHJcblx0XHR0aGlzLnNldFZpZXdwb3J0KCAwLCAwLCB3aWR0aCwgaGVpZ2h0ICk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9pbml0aWFsaXplZCApIHRoaXMuYmFja2VuZC51cGRhdGVTaXplKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgc2l6ZSBvZiB0aGUgcmVuZGVyZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggaW4gbG9naWNhbCBwaXhlbHMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgaW4gbG9naWNhbCBwaXhlbHMuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbdXBkYXRlU3R5bGU9dHJ1ZV0gLSBXaGV0aGVyIHRvIHVwZGF0ZSB0aGUgYHN0eWxlYCBhdHRyaWJ1dGUgb2YgdGhlIGNhbnZhcyBvciBub3QuXHJcblx0ICovXHJcblx0c2V0U2l6ZSggd2lkdGgsIGhlaWdodCwgdXBkYXRlU3R5bGUgPSB0cnVlICkge1xyXG5cclxuXHRcdC8vIFJlbmRlcmVyIGNhbid0IGJlIHJlc2l6ZWQgd2hpbGUgcHJlc2VudGluZyBpbiBYUi5cclxuXHRcdGlmICggdGhpcy54ciAmJiB0aGlzLnhyLmlzUHJlc2VudGluZyApIHJldHVybjtcclxuXHJcblx0XHR0aGlzLl93aWR0aCA9IHdpZHRoO1xyXG5cdFx0dGhpcy5faGVpZ2h0ID0gaGVpZ2h0O1xyXG5cclxuXHRcdHRoaXMuZG9tRWxlbWVudC53aWR0aCA9IE1hdGguZmxvb3IoIHdpZHRoICogdGhpcy5fcGl4ZWxSYXRpbyApO1xyXG5cdFx0dGhpcy5kb21FbGVtZW50LmhlaWdodCA9IE1hdGguZmxvb3IoIGhlaWdodCAqIHRoaXMuX3BpeGVsUmF0aW8gKTtcclxuXHJcblx0XHRpZiAoIHVwZGF0ZVN0eWxlID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0dGhpcy5kb21FbGVtZW50LnN0eWxlLndpZHRoID0gd2lkdGggKyAncHgnO1xyXG5cdFx0XHR0aGlzLmRvbUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5zZXRWaWV3cG9ydCggMCwgMCwgd2lkdGgsIGhlaWdodCApO1xyXG5cclxuXHRcdGlmICggdGhpcy5faW5pdGlhbGl6ZWQgKSB0aGlzLmJhY2tlbmQudXBkYXRlU2l6ZSgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgYSBtYW51YWwgc29ydCBmdW5jdGlvbiBmb3IgdGhlIG9wYXF1ZSByZW5kZXIgbGlzdC5cclxuXHQgKiBQYXNzIGBudWxsYCB0byB1c2UgdGhlIGRlZmF1bHQgc29ydC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IG1ldGhvZCAtIFRoZSBzb3J0IGZ1bmN0aW9uLlxyXG5cdCAqL1xyXG5cdHNldE9wYXF1ZVNvcnQoIG1ldGhvZCApIHtcclxuXHJcblx0XHR0aGlzLl9vcGFxdWVTb3J0ID0gbWV0aG9kO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgYSBtYW51YWwgc29ydCBmdW5jdGlvbiBmb3IgdGhlIHRyYW5zcGFyZW50IHJlbmRlciBsaXN0LlxyXG5cdCAqIFBhc3MgYG51bGxgIHRvIHVzZSB0aGUgZGVmYXVsdCBzb3J0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gbWV0aG9kIC0gVGhlIHNvcnQgZnVuY3Rpb24uXHJcblx0ICovXHJcblx0c2V0VHJhbnNwYXJlbnRTb3J0KCBtZXRob2QgKSB7XHJcblxyXG5cdFx0dGhpcy5fdHJhbnNwYXJlbnRTb3J0ID0gbWV0aG9kO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHNjaXNzb3IgcmVjdGFuZ2xlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3I0fSB0YXJnZXQgLSBUaGUgbWV0aG9kIHdyaXRlcyB0aGUgcmVzdWx0IGluIHRoaXMgdGFyZ2V0IG9iamVjdC5cclxuXHQgKiBAcmV0dXJuIHtWZWN0b3I0fSBUaGUgc2Npc3NvciByZWN0YW5nbGUuXHJcblx0ICovXHJcblx0Z2V0U2Npc3NvciggdGFyZ2V0ICkge1xyXG5cclxuXHRcdGNvbnN0IHNjaXNzb3IgPSB0aGlzLl9zY2lzc29yO1xyXG5cclxuXHRcdHRhcmdldC54ID0gc2Npc3Nvci54O1xyXG5cdFx0dGFyZ2V0LnkgPSBzY2lzc29yLnk7XHJcblx0XHR0YXJnZXQud2lkdGggPSBzY2lzc29yLndpZHRoO1xyXG5cdFx0dGFyZ2V0LmhlaWdodCA9IHNjaXNzb3IuaGVpZ2h0O1xyXG5cclxuXHRcdHJldHVybiB0YXJnZXQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVmaW5lcyB0aGUgc2Npc3NvciByZWN0YW5nbGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlciB8IFZlY3RvcjR9IHggLSBUaGUgaG9yaXpvbnRhbCBjb29yZGluYXRlIGZvciB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIGJveCBpbiBsb2dpY2FsIHBpeGVsIHVuaXQuXHJcblx0ICogSW5zdGVhZCBvZiBwYXNzaW5nIGZvdXIgYXJndW1lbnRzLCB0aGUgbWV0aG9kIGFsc28gd29ya3Mgd2l0aCBhIHNpbmdsZSBmb3VyLWRpbWVuc2lvbmFsIHZlY3Rvci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB2ZXJ0aWNhbCBjb29yZGluYXRlIGZvciB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIGJveCBpbiBsb2dpY2FsIHBpeGVsIHVuaXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSBzY2lzc29yIGJveCBpbiBsb2dpY2FsIHBpeGVsIHVuaXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIHNjaXNzb3IgYm94IGluIGxvZ2ljYWwgcGl4ZWwgdW5pdC5cclxuXHQgKi9cclxuXHRzZXRTY2lzc29yKCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICkge1xyXG5cclxuXHRcdGNvbnN0IHNjaXNzb3IgPSB0aGlzLl9zY2lzc29yO1xyXG5cclxuXHRcdGlmICggeC5pc1ZlY3RvcjQgKSB7XHJcblxyXG5cdFx0XHRzY2lzc29yLmNvcHkoIHggKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0c2Npc3Nvci5zZXQoIHgsIHksIHdpZHRoLCBoZWlnaHQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgc2Npc3NvciB0ZXN0IHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgc2Npc3NvciB0ZXN0IHNob3VsZCBiZSBlbmFibGVkIG9yIG5vdC5cclxuXHQgKi9cclxuXHRnZXRTY2lzc29yVGVzdCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fc2Npc3NvclRlc3Q7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVmaW5lcyB0aGUgc2Npc3NvciB0ZXN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBib29sZWFuIC0gV2hldGhlciB0aGUgc2Npc3NvciB0ZXN0IHNob3VsZCBiZSBlbmFibGVkIG9yIG5vdC5cclxuXHQgKi9cclxuXHRzZXRTY2lzc29yVGVzdCggYm9vbGVhbiApIHtcclxuXHJcblx0XHR0aGlzLl9zY2lzc29yVGVzdCA9IGJvb2xlYW47XHJcblxyXG5cdFx0dGhpcy5iYWNrZW5kLnNldFNjaXNzb3JUZXN0KCBib29sZWFuICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgdmlld3BvcnQgZGVmaW5pdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yNH0gdGFyZ2V0IC0gVGhlIG1ldGhvZCB3cml0ZXMgdGhlIHJlc3VsdCBpbiB0aGlzIHRhcmdldCBvYmplY3QuXHJcblx0ICogQHJldHVybiB7VmVjdG9yNH0gVGhlIHZpZXdwb3J0IGRlZmluaXRpb24uXHJcblx0ICovXHJcblx0Z2V0Vmlld3BvcnQoIHRhcmdldCApIHtcclxuXHJcblx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIHRoaXMuX3ZpZXdwb3J0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVmaW5lcyB0aGUgdmlld3BvcnQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlciB8IFZlY3RvcjR9IHggLSBUaGUgaG9yaXpvbnRhbCBjb29yZGluYXRlIGZvciB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHZpZXdwb3J0IG9yaWdpbiBpbiBsb2dpY2FsIHBpeGVsIHVuaXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHkgLSBUaGUgdmVydGljYWwgY29vcmRpbmF0ZSBmb3IgdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSB2aWV3cG9ydCBvcmlnaW4gIGluIGxvZ2ljYWwgcGl4ZWwgdW5pdC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIHZpZXdwb3J0IGluIGxvZ2ljYWwgcGl4ZWwgdW5pdC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgdmlld3BvcnQgaW4gbG9naWNhbCBwaXhlbCB1bml0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBtaW5EZXB0aCAtIFRoZSBtaW5pbXVtIGRlcHRoIHZhbHVlIG9mIHRoZSB2aWV3cG9ydC4gV2ViR1BVIG9ubHkuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IG1heERlcHRoIC0gVGhlIG1heGltdW0gZGVwdGggdmFsdWUgb2YgdGhlIHZpZXdwb3J0LiBXZWJHUFUgb25seS5cclxuXHQgKi9cclxuXHRzZXRWaWV3cG9ydCggeCwgeSwgd2lkdGgsIGhlaWdodCwgbWluRGVwdGggPSAwLCBtYXhEZXB0aCA9IDEgKSB7XHJcblxyXG5cdFx0Y29uc3Qgdmlld3BvcnQgPSB0aGlzLl92aWV3cG9ydDtcclxuXHJcblx0XHRpZiAoIHguaXNWZWN0b3I0ICkge1xyXG5cclxuXHRcdFx0dmlld3BvcnQuY29weSggeCApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR2aWV3cG9ydC5zZXQoIHgsIHksIHdpZHRoLCBoZWlnaHQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dmlld3BvcnQubWluRGVwdGggPSBtaW5EZXB0aDtcclxuXHRcdHZpZXdwb3J0Lm1heERlcHRoID0gbWF4RGVwdGg7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgY2xlYXIgY29sb3IuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0NvbG9yfSB0YXJnZXQgLSBUaGUgbWV0aG9kIHdyaXRlcyB0aGUgcmVzdWx0IGluIHRoaXMgdGFyZ2V0IG9iamVjdC5cclxuXHQgKiBAcmV0dXJuIHtDb2xvcn0gVGhlIGNsZWFyIGNvbG9yLlxyXG5cdCAqL1xyXG5cdGdldENsZWFyQ29sb3IoIHRhcmdldCApIHtcclxuXHJcblx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIHRoaXMuX2NsZWFyQ29sb3IgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWZpbmVzIHRoZSBjbGVhciBjb2xvciBhbmQgb3B0aW9uYWxseSB0aGUgY2xlYXIgYWxwaGEuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0NvbG9yfSBjb2xvciAtIFRoZSBjbGVhciBjb2xvci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2FscGhhPTFdIC0gVGhlIGNsZWFyIGFscGhhLlxyXG5cdCAqL1xyXG5cdHNldENsZWFyQ29sb3IoIGNvbG9yLCBhbHBoYSA9IDEgKSB7XHJcblxyXG5cdFx0dGhpcy5fY2xlYXJDb2xvci5zZXQoIGNvbG9yICk7XHJcblx0XHR0aGlzLl9jbGVhckNvbG9yLmEgPSBhbHBoYTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBjbGVhciBhbHBoYS5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGNsZWFyIGFscGhhLlxyXG5cdCAqL1xyXG5cdGdldENsZWFyQWxwaGEoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX2NsZWFyQ29sb3IuYTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWZpbmVzIHRoZSBjbGVhciBhbHBoYS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBhbHBoYSAtIFRoZSBjbGVhciBhbHBoYS5cclxuXHQgKi9cclxuXHRzZXRDbGVhckFscGhhKCBhbHBoYSApIHtcclxuXHJcblx0XHR0aGlzLl9jbGVhckNvbG9yLmEgPSBhbHBoYTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBjbGVhciBkZXB0aC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIGNsZWFyIGRlcHRoLlxyXG5cdCAqL1xyXG5cdGdldENsZWFyRGVwdGgoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX2NsZWFyRGVwdGg7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVmaW5lcyB0aGUgY2xlYXIgZGVwdGguXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZGVwdGggLSBUaGUgY2xlYXIgZGVwdGguXHJcblx0ICovXHJcblx0c2V0Q2xlYXJEZXB0aCggZGVwdGggKSB7XHJcblxyXG5cdFx0dGhpcy5fY2xlYXJEZXB0aCA9IGRlcHRoO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGNsZWFyIHN0ZW5jaWwuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBjbGVhciBzdGVuY2lsLlxyXG5cdCAqL1xyXG5cdGdldENsZWFyU3RlbmNpbCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fY2xlYXJTdGVuY2lsO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgdGhlIGNsZWFyIHN0ZW5jaWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc3RlbmNpbCAtIFRoZSBjbGVhciBzdGVuY2lsLlxyXG5cdCAqL1xyXG5cdHNldENsZWFyU3RlbmNpbCggc3RlbmNpbCApIHtcclxuXHJcblx0XHR0aGlzLl9jbGVhclN0ZW5jaWwgPSBzdGVuY2lsO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIHBlcmZvcm1zIGFuIG9jY2x1c2lvbiBxdWVyeSBmb3IgdGhlIGdpdmVuIDNEIG9iamVjdC5cclxuXHQgKiBJdCByZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gM0Qgb2JqZWN0IGlzIGZ1bGx5IG9jY2x1ZGVkIGJ5IG90aGVyXHJcblx0ICogM0Qgb2JqZWN0cyBpbiB0aGUgc2NlbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdDNEfSBvYmplY3QgLSBUaGUgM0Qgb2JqZWN0IHRvIHRlc3QuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgM0Qgb2JqZWN0IGlzIGZ1bGx5IG9jY2x1ZGVkIG9yIG5vdC5cclxuXHQgKi9cclxuXHRpc09jY2x1ZGVkKCBvYmplY3QgKSB7XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyQ29udGV4dCA9IHRoaXMuX2N1cnJlbnRSZW5kZXJDb250ZXh0O1xyXG5cclxuXHRcdHJldHVybiByZW5kZXJDb250ZXh0ICYmIHRoaXMuYmFja2VuZC5pc09jY2x1ZGVkKCByZW5kZXJDb250ZXh0LCBvYmplY3QgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQZXJmb3JtcyBhIG1hbnVhbCBjbGVhciBvcGVyYXRpb24uIFRoaXMgbWV0aG9kIGlnbm9yZXMgYGF1dG9DbGVhcmAgcHJvcGVydGllcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NvbG9yPXRydWVdIC0gV2hldGhlciB0aGUgY29sb3IgYnVmZmVyIHNob3VsZCBiZSBjbGVhcmVkIG9yIG5vdC5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtkZXB0aD10cnVlXSAtIFdoZXRoZXIgdGhlIGRlcHRoIGJ1ZmZlciBzaG91bGQgYmUgY2xlYXJlZCBvciBub3QuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbc3RlbmNpbD10cnVlXSAtIFdoZXRoZXIgdGhlIHN0ZW5jaWwgYnVmZmVyIHNob3VsZCBiZSBjbGVhcmVkIG9yIG5vdC5cclxuXHQgKiBAcmV0dXJuIHtQcm9taXNlfSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjbGVhciBvcGVyYXRpb24gaGFzIGJlZW4gZXhlY3V0ZWQuXHJcblx0ICogT25seSByZXR1cm5lZCB3aGVuIHRoZSByZW5kZXJlciBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQuXHJcblx0ICovXHJcblx0Y2xlYXIoIGNvbG9yID0gdHJ1ZSwgZGVwdGggPSB0cnVlLCBzdGVuY2lsID0gdHJ1ZSApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuX2luaXRpYWxpemVkID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlJlbmRlcmVyOiAuY2xlYXIoKSBjYWxsZWQgYmVmb3JlIHRoZSBiYWNrZW5kIGlzIGluaXRpYWxpemVkLiBUcnkgdXNpbmcgLmNsZWFyQXN5bmMoKSBpbnN0ZWFkLicgKTtcclxuXHJcblx0XHRcdHJldHVybiB0aGlzLmNsZWFyQXN5bmMoIGNvbG9yLCBkZXB0aCwgc3RlbmNpbCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCByZW5kZXJUYXJnZXQgPSB0aGlzLl9yZW5kZXJUYXJnZXQgfHwgdGhpcy5fZ2V0RnJhbWVCdWZmZXJUYXJnZXQoKTtcclxuXHJcblx0XHRsZXQgcmVuZGVyQ29udGV4dCA9IG51bGw7XHJcblxyXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLl90ZXh0dXJlcy51cGRhdGVSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCApO1xyXG5cclxuXHRcdFx0Y29uc3QgcmVuZGVyVGFyZ2V0RGF0YSA9IHRoaXMuX3RleHR1cmVzLmdldCggcmVuZGVyVGFyZ2V0ICk7XHJcblxyXG5cdFx0XHRyZW5kZXJDb250ZXh0ID0gdGhpcy5fcmVuZGVyQ29udGV4dHMuZ2V0Rm9yQ2xlYXIoIHJlbmRlclRhcmdldCApO1xyXG5cdFx0XHRyZW5kZXJDb250ZXh0LnRleHR1cmVzID0gcmVuZGVyVGFyZ2V0RGF0YS50ZXh0dXJlcztcclxuXHRcdFx0cmVuZGVyQ29udGV4dC5kZXB0aFRleHR1cmUgPSByZW5kZXJUYXJnZXREYXRhLmRlcHRoVGV4dHVyZTtcclxuXHRcdFx0cmVuZGVyQ29udGV4dC53aWR0aCA9IHJlbmRlclRhcmdldERhdGEud2lkdGg7XHJcblx0XHRcdHJlbmRlckNvbnRleHQuaGVpZ2h0ID0gcmVuZGVyVGFyZ2V0RGF0YS5oZWlnaHQ7XHJcblx0XHRcdHJlbmRlckNvbnRleHQucmVuZGVyVGFyZ2V0ID0gcmVuZGVyVGFyZ2V0O1xyXG5cdFx0XHRyZW5kZXJDb250ZXh0LmRlcHRoID0gcmVuZGVyVGFyZ2V0LmRlcHRoQnVmZmVyO1xyXG5cdFx0XHRyZW5kZXJDb250ZXh0LnN0ZW5jaWwgPSByZW5kZXJUYXJnZXQuc3RlbmNpbEJ1ZmZlcjtcclxuXHRcdFx0Ly8gIzMwMzI5XHJcblx0XHRcdHJlbmRlckNvbnRleHQuY2xlYXJDb2xvclZhbHVlID0gdGhpcy5iYWNrZW5kLmdldENsZWFyQ29sb3IoKTtcclxuXHRcdFx0cmVuZGVyQ29udGV4dC5hY3RpdmVDdWJlRmFjZSA9IHRoaXMuZ2V0QWN0aXZlQ3ViZUZhY2UoKTtcclxuXHRcdFx0cmVuZGVyQ29udGV4dC5hY3RpdmVNaXBtYXBMZXZlbCA9IHRoaXMuZ2V0QWN0aXZlTWlwbWFwTGV2ZWwoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5iYWNrZW5kLmNsZWFyKCBjb2xvciwgZGVwdGgsIHN0ZW5jaWwsIHJlbmRlckNvbnRleHQgKTtcclxuXHJcblx0XHRpZiAoIHJlbmRlclRhcmdldCAhPT0gbnVsbCAmJiB0aGlzLl9yZW5kZXJUYXJnZXQgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLl9yZW5kZXJPdXRwdXQoIHJlbmRlclRhcmdldCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQZXJmb3JtcyBhIG1hbnVhbCBjbGVhciBvcGVyYXRpb24gb2YgdGhlIGNvbG9yIGJ1ZmZlci4gVGhpcyBtZXRob2QgaWdub3JlcyBgYXV0b0NsZWFyYCBwcm9wZXJ0aWVzLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7UHJvbWlzZX0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY2xlYXIgb3BlcmF0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkLlxyXG5cdCAqIE9ubHkgcmV0dXJuZWQgd2hlbiB0aGUgcmVuZGVyZXIgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLlxyXG5cdCAqL1xyXG5cdGNsZWFyQ29sb3IoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuY2xlYXIoIHRydWUsIGZhbHNlLCBmYWxzZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBlcmZvcm1zIGEgbWFudWFsIGNsZWFyIG9wZXJhdGlvbiBvZiB0aGUgZGVwdGggYnVmZmVyLiBUaGlzIG1ldGhvZCBpZ25vcmVzIGBhdXRvQ2xlYXJgIHByb3BlcnRpZXMuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtQcm9taXNlfSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjbGVhciBvcGVyYXRpb24gaGFzIGJlZW4gZXhlY3V0ZWQuXHJcblx0ICogT25seSByZXR1cm5lZCB3aGVuIHRoZSByZW5kZXJlciBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQuXHJcblx0ICovXHJcblx0Y2xlYXJEZXB0aCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5jbGVhciggZmFsc2UsIHRydWUsIGZhbHNlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUGVyZm9ybXMgYSBtYW51YWwgY2xlYXIgb3BlcmF0aW9uIG9mIHRoZSBzdGVuY2lsIGJ1ZmZlci4gVGhpcyBtZXRob2QgaWdub3JlcyBgYXV0b0NsZWFyYCBwcm9wZXJ0aWVzLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7UHJvbWlzZX0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY2xlYXIgb3BlcmF0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkLlxyXG5cdCAqIE9ubHkgcmV0dXJuZWQgd2hlbiB0aGUgcmVuZGVyZXIgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLlxyXG5cdCAqL1xyXG5cdGNsZWFyU3RlbmNpbCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5jbGVhciggZmFsc2UsIGZhbHNlLCB0cnVlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQXN5bmMgdmVyc2lvbiBvZiB7QGxpbmsgUmVuZGVyZXIjY2xlYXJ9LlxyXG5cdCAqXHJcblx0ICogQGFzeW5jXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbY29sb3I9dHJ1ZV0gLSBXaGV0aGVyIHRoZSBjb2xvciBidWZmZXIgc2hvdWxkIGJlIGNsZWFyZWQgb3Igbm90LlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW2RlcHRoPXRydWVdIC0gV2hldGhlciB0aGUgZGVwdGggYnVmZmVyIHNob3VsZCBiZSBjbGVhcmVkIG9yIG5vdC5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtzdGVuY2lsPXRydWVdIC0gV2hldGhlciB0aGUgc3RlbmNpbCBidWZmZXIgc2hvdWxkIGJlIGNsZWFyZWQgb3Igbm90LlxyXG5cdCAqIEByZXR1cm4ge1Byb21pc2V9IEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNsZWFyIG9wZXJhdGlvbiBoYXMgYmVlbiBleGVjdXRlZC5cclxuXHQgKi9cclxuXHRhc3luYyBjbGVhckFzeW5jKCBjb2xvciA9IHRydWUsIGRlcHRoID0gdHJ1ZSwgc3RlbmNpbCA9IHRydWUgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9pbml0aWFsaXplZCA9PT0gZmFsc2UgKSBhd2FpdCB0aGlzLmluaXQoKTtcclxuXHJcblx0XHR0aGlzLmNsZWFyKCBjb2xvciwgZGVwdGgsIHN0ZW5jaWwgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBc3luYyB2ZXJzaW9uIG9mIHtAbGluayBSZW5kZXJlciNjbGVhckNvbG9yfS5cclxuXHQgKlxyXG5cdCAqIEBhc3luY1xyXG5cdCAqIEByZXR1cm4ge1Byb21pc2V9IEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNsZWFyIG9wZXJhdGlvbiBoYXMgYmVlbiBleGVjdXRlZC5cclxuXHQgKi9cclxuXHRhc3luYyBjbGVhckNvbG9yQXN5bmMoKSB7XHJcblxyXG5cdFx0dGhpcy5jbGVhckFzeW5jKCB0cnVlLCBmYWxzZSwgZmFsc2UgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBc3luYyB2ZXJzaW9uIG9mIHtAbGluayBSZW5kZXJlciNjbGVhckRlcHRofS5cclxuXHQgKlxyXG5cdCAqIEBhc3luY1xyXG5cdCAqIEByZXR1cm4ge1Byb21pc2V9IEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNsZWFyIG9wZXJhdGlvbiBoYXMgYmVlbiBleGVjdXRlZC5cclxuXHQgKi9cclxuXHRhc3luYyBjbGVhckRlcHRoQXN5bmMoKSB7XHJcblxyXG5cdFx0dGhpcy5jbGVhckFzeW5jKCBmYWxzZSwgdHJ1ZSwgZmFsc2UgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBc3luYyB2ZXJzaW9uIG9mIHtAbGluayBSZW5kZXJlciNjbGVhclN0ZW5jaWx9LlxyXG5cdCAqXHJcblx0ICogQGFzeW5jXHJcblx0ICogQHJldHVybiB7UHJvbWlzZX0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY2xlYXIgb3BlcmF0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkLlxyXG5cdCAqL1xyXG5cdGFzeW5jIGNsZWFyU3RlbmNpbEFzeW5jKCkge1xyXG5cclxuXHRcdHRoaXMuY2xlYXJBc3luYyggZmFsc2UsIGZhbHNlLCB0cnVlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGN1cnJlbnQgb3V0cHV0IHRvbmUgbWFwcGluZyBvZiB0aGUgcmVuZGVyZXIuIFdoZW4gYSByZW5kZXIgdGFyZ2V0IGlzIHNldCxcclxuXHQgKiB0aGUgb3V0cHV0IHRvbmUgbWFwcGluZyBpcyBhbHdheXMgYE5vVG9uZU1hcHBpbmdgLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge251bWJlcn1cclxuXHQgKi9cclxuXHRnZXQgY3VycmVudFRvbmVNYXBwaW5nKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmlzT3V0cHV0VGFyZ2V0ID8gdGhpcy50b25lTWFwcGluZyA6IE5vVG9uZU1hcHBpbmc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGN1cnJlbnQgb3V0cHV0IGNvbG9yIHNwYWNlIG9mIHRoZSByZW5kZXJlci4gV2hlbiBhIHJlbmRlciB0YXJnZXQgaXMgc2V0LFxyXG5cdCAqIHRoZSBvdXRwdXQgY29sb3Igc3BhY2UgaXMgYWx3YXlzIGBMaW5lYXJTUkdCQ29sb3JTcGFjZWAuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdCAqL1xyXG5cdGdldCBjdXJyZW50Q29sb3JTcGFjZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5pc091dHB1dFRhcmdldCA/IHRoaXMub3V0cHV0Q29sb3JTcGFjZSA6IExpbmVhclNSR0JDb2xvclNwYWNlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSByZW5kZXJpbmcgc2V0dGluZ3MgYXJlIHNldCB0byBzY3JlZW4gb3V0cHV0LlxyXG5cdCAqXHJcblx0ICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIGN1cnJlbnQgcmVuZGVyIHRhcmdldCBpcyB0aGUgc2FtZSBvZiBvdXRwdXQgcmVuZGVyIHRhcmdldCBvciBgbnVsbGAsIG90aGVyd2lzZSBmYWxzZS5cclxuXHQgKi9cclxuXHRnZXQgaXNPdXRwdXRUYXJnZXQoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX3JlbmRlclRhcmdldCA9PT0gdGhpcy5fb3V0cHV0UmVuZGVyVGFyZ2V0IHx8IHRoaXMuX3JlbmRlclRhcmdldCA9PT0gbnVsbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGcmVlcyBhbGwgaW50ZXJuYWwgcmVzb3VyY2VzIG9mIHRoZSByZW5kZXJlci4gQ2FsbCB0aGlzIG1ldGhvZCBpZiB0aGUgcmVuZGVyZXJcclxuXHQgKiBpcyBubyBsb25nZXIgaW4gdXNlIGJ5IHlvdXIgYXBwLlxyXG5cdCAqL1xyXG5cdGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0dGhpcy5pbmZvLmRpc3Bvc2UoKTtcclxuXHRcdHRoaXMuYmFja2VuZC5kaXNwb3NlKCk7XHJcblxyXG5cdFx0dGhpcy5fYW5pbWF0aW9uLmRpc3Bvc2UoKTtcclxuXHRcdHRoaXMuX29iamVjdHMuZGlzcG9zZSgpO1xyXG5cdFx0dGhpcy5fcGlwZWxpbmVzLmRpc3Bvc2UoKTtcclxuXHRcdHRoaXMuX25vZGVzLmRpc3Bvc2UoKTtcclxuXHRcdHRoaXMuX2JpbmRpbmdzLmRpc3Bvc2UoKTtcclxuXHRcdHRoaXMuX3JlbmRlckxpc3RzLmRpc3Bvc2UoKTtcclxuXHRcdHRoaXMuX3JlbmRlckNvbnRleHRzLmRpc3Bvc2UoKTtcclxuXHRcdHRoaXMuX3RleHR1cmVzLmRpc3Bvc2UoKTtcclxuXHJcblx0XHRpZiAoIHRoaXMuX2ZyYW1lQnVmZmVyVGFyZ2V0ICE9PSBudWxsICkgdGhpcy5fZnJhbWVCdWZmZXJUYXJnZXQuZGlzcG9zZSgpO1xyXG5cclxuXHRcdE9iamVjdC52YWx1ZXMoIHRoaXMuYmFja2VuZC50aW1lc3RhbXBRdWVyeVBvb2wgKS5mb3JFYWNoKCBxdWVyeVBvb2wgPT4ge1xyXG5cclxuXHRcdFx0aWYgKCBxdWVyeVBvb2wgIT09IG51bGwgKSBxdWVyeVBvb2wuZGlzcG9zZSgpO1xyXG5cclxuXHRcdH0gKTtcclxuXHJcblx0XHR0aGlzLnNldFJlbmRlclRhcmdldCggbnVsbCApO1xyXG5cdFx0dGhpcy5zZXRBbmltYXRpb25Mb29wKCBudWxsICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZ2l2ZW4gcmVuZGVyIHRhcmdldC4gQ2FsbGluZyB0aGlzIG1ldGhvZCBtZWFucyB0aGUgcmVuZGVyZXIgZG9lcyBub3RcclxuXHQgKiB0YXJnZXQgdGhlIGRlZmF1bHQgZnJhbWVidWZmZXIgKG1lYW5pbmcgdGhlIGNhbnZhcykgYW55bW9yZSBidXQgYSBjdXN0b20gZnJhbWVidWZmZXIuXHJcblx0ICogVXNlIGBudWxsYCBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gcmVzZXQgdGhlIHN0YXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHs/UmVuZGVyVGFyZ2V0fSByZW5kZXJUYXJnZXQgLSBUaGUgcmVuZGVyIHRhcmdldCB0byBzZXQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFthY3RpdmVDdWJlRmFjZT0wXSAtIFRoZSBhY3RpdmUgY3ViZSBmYWNlLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbYWN0aXZlTWlwbWFwTGV2ZWw9MF0gLSBUaGUgYWN0aXZlIG1pcG1hcCBsZXZlbC5cclxuXHQgKi9cclxuXHRzZXRSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCwgYWN0aXZlQ3ViZUZhY2UgPSAwLCBhY3RpdmVNaXBtYXBMZXZlbCA9IDAgKSB7XHJcblxyXG5cdFx0dGhpcy5fcmVuZGVyVGFyZ2V0ID0gcmVuZGVyVGFyZ2V0O1xyXG5cdFx0dGhpcy5fYWN0aXZlQ3ViZUZhY2UgPSBhY3RpdmVDdWJlRmFjZTtcclxuXHRcdHRoaXMuX2FjdGl2ZU1pcG1hcExldmVsID0gYWN0aXZlTWlwbWFwTGV2ZWw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgY3VycmVudCByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7P1JlbmRlclRhcmdldH0gVGhlIHJlbmRlciB0YXJnZXQuIFJldHVybnMgYG51bGxgIGlmIG5vIHJlbmRlciB0YXJnZXQgaXMgc2V0LlxyXG5cdCAqL1xyXG5cdGdldFJlbmRlclRhcmdldCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fcmVuZGVyVGFyZ2V0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIG91dHB1dCByZW5kZXIgdGFyZ2V0IGZvciB0aGUgcmVuZGVyZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gcmVuZGVyVGFyZ2V0IC0gVGhlIHJlbmRlciB0YXJnZXQgdG8gc2V0IGFzIHRoZSBvdXRwdXQgdGFyZ2V0LlxyXG5cdCAqL1xyXG5cdHNldE91dHB1dFJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICkge1xyXG5cclxuXHRcdHRoaXMuX291dHB1dFJlbmRlclRhcmdldCA9IHJlbmRlclRhcmdldDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBjdXJyZW50IG91dHB1dCB0YXJnZXQuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHs/UmVuZGVyVGFyZ2V0fSBUaGUgY3VycmVudCBvdXRwdXQgcmVuZGVyIHRhcmdldC4gUmV0dXJucyBgbnVsbGAgaWYgbm8gb3V0cHV0IHRhcmdldCBpcyBzZXQuXHJcblx0ICovXHJcblx0Z2V0T3V0cHV0UmVuZGVyVGFyZ2V0KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9vdXRwdXRSZW5kZXJUYXJnZXQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2FsbGJhY2sgZm9yIHtAbGluayBSZW5kZXJlciNzZXRSZW5kZXJPYmplY3RGdW5jdGlvbn0uXHJcblx0ICpcclxuXHQgKiBAY2FsbGJhY2sgcmVuZGVyT2JqZWN0RnVuY3Rpb25cclxuXHQgKiBAcGFyYW0ge09iamVjdDNEfSBvYmplY3QgLSBUaGUgM0Qgb2JqZWN0LlxyXG5cdCAqIEBwYXJhbSB7U2NlbmV9IHNjZW5lIC0gVGhlIHNjZW5lIHRoZSAzRCBvYmplY3QgYmVsb25ncyB0by5cclxuXHQgKiBAcGFyYW0ge0NhbWVyYX0gY2FtZXJhIC0gVGhlIGNhbWVyYSB0aGUgb2JqZWN0IHNob3VsZCBiZSByZW5kZXJlZCB3aXRoLlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyR2VvbWV0cnl9IGdlb21ldHJ5IC0gVGhlIG9iamVjdCdzIGdlb21ldHJ5LlxyXG5cdCAqIEBwYXJhbSB7TWF0ZXJpYWx9IG1hdGVyaWFsIC0gVGhlIG9iamVjdCdzIG1hdGVyaWFsLlxyXG5cdCAqIEBwYXJhbSB7P09iamVjdH0gZ3JvdXAgLSBPbmx5IHJlbGV2YW50IGZvciBvYmplY3RzIHVzaW5nIG11bHRpcGxlIG1hdGVyaWFscy4gVGhpcyByZXByZXNlbnRzIGEgZ3JvdXAgZW50cnkgZnJvbSB0aGUgcmVzcGVjdGl2ZSBgQnVmZmVyR2VvbWV0cnlgLlxyXG5cdCAqIEBwYXJhbSB7TGlnaHRzTm9kZX0gbGlnaHRzTm9kZSAtIFRoZSBjdXJyZW50IGxpZ2h0cyBub2RlLlxyXG5cdCAqIEBwYXJhbSB7Q2xpcHBpbmdDb250ZXh0fSBjbGlwcGluZ0NvbnRleHQgLSBUaGUgY2xpcHBpbmcgY29udGV4dC5cclxuXHQgKiBAcGFyYW0gez9zdHJpbmd9IFtwYXNzSWQ9bnVsbF0gLSBBbiBvcHRpb25hbCBJRCBmb3IgaWRlbnRpZnlpbmcgdGhlIHBhc3MuXHJcblx0ICovXHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIGdpdmVuIHJlbmRlciBvYmplY3QgZnVuY3Rpb24uIENhbGxpbmcgdGhpcyBtZXRob2Qgb3ZlcndyaXRlcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvblxyXG5cdCAqIHdoaWNoIGlzIHtAbGluayBSZW5kZXJlciNyZW5kZXJPYmplY3R9LiBEZWZpbmluZyBhIGN1c3RvbSBmdW5jdGlvbiBjYW4gYmUgdXNlZnVsXHJcblx0ICogaWYgeW91IHdhbnQgdG8gbW9kaWZ5IHRoZSB3YXkgb2JqZWN0cyBhcmUgcmVuZGVyZWQuIEZvciBleGFtcGxlIHlvdSBjYW4gZGVmaW5lIHRoaW5ncyBsaWtlIFwiZXZlcnlcclxuXHQgKiBvYmplY3QgdGhhdCBoYXMgbWF0ZXJpYWwgb2YgYSBjZXJ0YWluIHR5cGUgc2hvdWxkIHBlcmZvcm0gYSBwcmUtcGFzcyB3aXRoIGEgc3BlY2lhbCBvdmVyd3JpdGUgbWF0ZXJpYWxcIi5cclxuXHQgKiBUaGUgY3VzdG9tIGZ1bmN0aW9uIG11c3QgYWx3YXlzIGNhbGwgYHJlbmRlck9iamVjdCgpYCBpbiBpdHMgaW1wbGVtZW50YXRpb24uXHJcblx0ICpcclxuXHQgKiBVc2UgYG51bGxgIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byByZXNldCB0aGUgc3RhdGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gez9yZW5kZXJPYmplY3RGdW5jdGlvbn0gcmVuZGVyT2JqZWN0RnVuY3Rpb24gLSBUaGUgcmVuZGVyIG9iamVjdCBmdW5jdGlvbi5cclxuXHQgKi9cclxuXHRzZXRSZW5kZXJPYmplY3RGdW5jdGlvbiggcmVuZGVyT2JqZWN0RnVuY3Rpb24gKSB7XHJcblxyXG5cdFx0dGhpcy5fcmVuZGVyT2JqZWN0RnVuY3Rpb24gPSByZW5kZXJPYmplY3RGdW5jdGlvbjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHJlbmRlciBvYmplY3QgZnVuY3Rpb24uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHs/RnVuY3Rpb259IFRoZSBjdXJyZW50IHJlbmRlciBvYmplY3QgZnVuY3Rpb24uIFJldHVybnMgYG51bGxgIGlmIG5vIGZ1bmN0aW9uIGlzIHNldC5cclxuXHQgKi9cclxuXHRnZXRSZW5kZXJPYmplY3RGdW5jdGlvbigpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5fcmVuZGVyT2JqZWN0RnVuY3Rpb247XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRXhlY3V0ZSBhIHNpbmdsZSBvciBhbiBhcnJheSBvZiBjb21wdXRlIG5vZGVzLiBUaGlzIG1ldGhvZCBjYW4gb25seSBiZSBjYWxsZWRcclxuXHQgKiBpZiB0aGUgcmVuZGVyZXIgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV8QXJyYXk8Tm9kZT59IGNvbXB1dGVOb2RlcyAtIFRoZSBjb21wdXRlIG5vZGUocykuXHJcblx0ICogQHJldHVybiB7UHJvbWlzZXx1bmRlZmluZWR9IEEgUHJvbWlzZSB0aGF0IHJlc29sdmUgd2hlbiB0aGUgY29tcHV0ZSBoYXMgZmluaXNoZWQuIE9ubHkgcmV0dXJuZWQgd2hlbiB0aGUgcmVuZGVyZXIgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLlxyXG5cdCAqL1xyXG5cdGNvbXB1dGUoIGNvbXB1dGVOb2RlcyApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuX2lzRGV2aWNlTG9zdCA9PT0gdHJ1ZSApIHJldHVybjtcclxuXHJcblx0XHRpZiAoIHRoaXMuX2luaXRpYWxpemVkID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlJlbmRlcmVyOiAuY29tcHV0ZSgpIGNhbGxlZCBiZWZvcmUgdGhlIGJhY2tlbmQgaXMgaW5pdGlhbGl6ZWQuIFRyeSB1c2luZyAuY29tcHV0ZUFzeW5jKCkgaW5zdGVhZC4nICk7XHJcblxyXG5cdFx0XHRyZXR1cm4gdGhpcy5jb21wdXRlQXN5bmMoIGNvbXB1dGVOb2RlcyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGNvbnN0IG5vZGVGcmFtZSA9IHRoaXMuX25vZGVzLm5vZGVGcmFtZTtcclxuXHJcblx0XHRjb25zdCBwcmV2aW91c1JlbmRlcklkID0gbm9kZUZyYW1lLnJlbmRlcklkO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0dGhpcy5pbmZvLmNhbGxzICsrO1xyXG5cdFx0dGhpcy5pbmZvLmNvbXB1dGUuY2FsbHMgKys7XHJcblx0XHR0aGlzLmluZm8uY29tcHV0ZS5mcmFtZUNhbGxzICsrO1xyXG5cclxuXHRcdG5vZGVGcmFtZS5yZW5kZXJJZCA9IHRoaXMuaW5mby5jYWxscztcclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGNvbnN0IGJhY2tlbmQgPSB0aGlzLmJhY2tlbmQ7XHJcblx0XHRjb25zdCBwaXBlbGluZXMgPSB0aGlzLl9waXBlbGluZXM7XHJcblx0XHRjb25zdCBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzO1xyXG5cdFx0Y29uc3Qgbm9kZXMgPSB0aGlzLl9ub2RlcztcclxuXHJcblx0XHRjb25zdCBjb21wdXRlTGlzdCA9IEFycmF5LmlzQXJyYXkoIGNvbXB1dGVOb2RlcyApID8gY29tcHV0ZU5vZGVzIDogWyBjb21wdXRlTm9kZXMgXTtcclxuXHJcblx0XHRpZiAoIGNvbXB1dGVMaXN0WyAwIF0gPT09IHVuZGVmaW5lZCB8fCBjb21wdXRlTGlzdFsgMCBdLmlzQ29tcHV0ZU5vZGUgIT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5SZW5kZXJlcjogLmNvbXB1dGUoKSBleHBlY3RzIGEgQ29tcHV0ZU5vZGUuJyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRiYWNrZW5kLmJlZ2luQ29tcHV0ZSggY29tcHV0ZU5vZGVzICk7XHJcblxyXG5cdFx0Zm9yICggY29uc3QgY29tcHV0ZU5vZGUgb2YgY29tcHV0ZUxpc3QgKSB7XHJcblxyXG5cdFx0XHQvLyBvbkluaXRcclxuXHJcblx0XHRcdGlmICggcGlwZWxpbmVzLmhhcyggY29tcHV0ZU5vZGUgKSA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGRpc3Bvc2UgPSAoKSA9PiB7XHJcblxyXG5cdFx0XHRcdFx0Y29tcHV0ZU5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBkaXNwb3NlICk7XHJcblxyXG5cdFx0XHRcdFx0cGlwZWxpbmVzLmRlbGV0ZSggY29tcHV0ZU5vZGUgKTtcclxuXHRcdFx0XHRcdGJpbmRpbmdzLmRlbGV0ZSggY29tcHV0ZU5vZGUgKTtcclxuXHRcdFx0XHRcdG5vZGVzLmRlbGV0ZSggY29tcHV0ZU5vZGUgKTtcclxuXHJcblx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0Y29tcHV0ZU5vZGUuYWRkRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBkaXNwb3NlICk7XHJcblxyXG5cdFx0XHRcdC8vXHJcblxyXG5cdFx0XHRcdGNvbnN0IG9uSW5pdEZuID0gY29tcHV0ZU5vZGUub25Jbml0RnVuY3Rpb247XHJcblxyXG5cdFx0XHRcdGlmICggb25Jbml0Rm4gIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdFx0b25Jbml0Rm4uY2FsbCggY29tcHV0ZU5vZGUsIHsgcmVuZGVyZXI6IHRoaXMgfSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRub2Rlcy51cGRhdGVGb3JDb21wdXRlKCBjb21wdXRlTm9kZSApO1xyXG5cdFx0XHRiaW5kaW5ncy51cGRhdGVGb3JDb21wdXRlKCBjb21wdXRlTm9kZSApO1xyXG5cclxuXHRcdFx0Y29uc3QgY29tcHV0ZUJpbmRpbmdzID0gYmluZGluZ3MuZ2V0Rm9yQ29tcHV0ZSggY29tcHV0ZU5vZGUgKTtcclxuXHRcdFx0Y29uc3QgY29tcHV0ZVBpcGVsaW5lID0gcGlwZWxpbmVzLmdldEZvckNvbXB1dGUoIGNvbXB1dGVOb2RlLCBjb21wdXRlQmluZGluZ3MgKTtcclxuXHJcblx0XHRcdGJhY2tlbmQuY29tcHV0ZSggY29tcHV0ZU5vZGVzLCBjb21wdXRlTm9kZSwgY29tcHV0ZUJpbmRpbmdzLCBjb21wdXRlUGlwZWxpbmUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0YmFja2VuZC5maW5pc2hDb21wdXRlKCBjb21wdXRlTm9kZXMgKTtcclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdG5vZGVGcmFtZS5yZW5kZXJJZCA9IHByZXZpb3VzUmVuZGVySWQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRXhlY3V0ZSBhIHNpbmdsZSBvciBhbiBhcnJheSBvZiBjb21wdXRlIG5vZGVzLlxyXG5cdCAqXHJcblx0ICogQGFzeW5jXHJcblx0ICogQHBhcmFtIHtOb2RlfEFycmF5PE5vZGU+fSBjb21wdXRlTm9kZXMgLSBUaGUgY29tcHV0ZSBub2RlKHMpLlxyXG5cdCAqIEByZXR1cm4ge1Byb21pc2V9IEEgUHJvbWlzZSB0aGF0IHJlc29sdmUgd2hlbiB0aGUgY29tcHV0ZSBoYXMgZmluaXNoZWQuXHJcblx0ICovXHJcblx0YXN5bmMgY29tcHV0ZUFzeW5jKCBjb21wdXRlTm9kZXMgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9pbml0aWFsaXplZCA9PT0gZmFsc2UgKSBhd2FpdCB0aGlzLmluaXQoKTtcclxuXHJcblx0XHR0aGlzLmNvbXB1dGUoIGNvbXB1dGVOb2RlcyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIHNlbGVjdGVkIGJhY2tlbmQuXHJcblx0ICpcclxuXHQgKiBAYXN5bmNcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBmZWF0dXJlJ3MgbmFtZS5cclxuXHQgKiBAcmV0dXJuIHtQcm9taXNlPGJvb2xlYW4+fSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGEgYm9vbCB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBvciBub3QuXHJcblx0ICovXHJcblx0YXN5bmMgaGFzRmVhdHVyZUFzeW5jKCBuYW1lICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5faW5pdGlhbGl6ZWQgPT09IGZhbHNlICkgYXdhaXQgdGhpcy5pbml0KCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuYmFja2VuZC5oYXNGZWF0dXJlKCBuYW1lICk7XHJcblxyXG5cdH1cclxuXHJcblx0YXN5bmMgcmVzb2x2ZVRpbWVzdGFtcHNBc3luYyggdHlwZSA9ICdyZW5kZXInICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5faW5pdGlhbGl6ZWQgPT09IGZhbHNlICkgYXdhaXQgdGhpcy5pbml0KCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuYmFja2VuZC5yZXNvbHZlVGltZXN0YW1wc0FzeW5jKCB0eXBlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgc2VsZWN0ZWQgYmFja2VuZC4gSWYgdGhlXHJcblx0ICogcmVuZGVyZXIgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLCB0aGlzIG1ldGhvZCBhbHdheXMgcmV0dXJucyBgZmFsc2VgLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgZmVhdHVyZSdzIG5hbWUuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGhhc0ZlYXR1cmUoIG5hbWUgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9pbml0aWFsaXplZCA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5SZW5kZXJlcjogLmhhc0ZlYXR1cmUoKSBjYWxsZWQgYmVmb3JlIHRoZSBiYWNrZW5kIGlzIGluaXRpYWxpemVkLiBUcnkgdXNpbmcgLmhhc0ZlYXR1cmVBc3luYygpIGluc3RlYWQuJyApO1xyXG5cclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcy5iYWNrZW5kLmhhc0ZlYXR1cmUoIG5hbWUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSByZW5kZXJlciBoYXMgYmVlbiBpbml0aWFsaXplZC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHJlbmRlcmVyIGhhcyBiZWVuIGluaXRpYWxpemVkIG9yIG5vdC5cclxuXHQgKi9cclxuXHRoYXNJbml0aWFsaXplZCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5faW5pdGlhbGl6ZWQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW5pdGlhbGl6ZXMgdGhlIGdpdmVuIHRleHR1cmVzLiBVc2VmdWwgZm9yIHByZWxvYWRpbmcgYSB0ZXh0dXJlIHJhdGhlciB0aGFuIHdhaXRpbmcgdW50aWwgZmlyc3QgcmVuZGVyXHJcblx0ICogKHdoaWNoIGNhbiBjYXVzZSBub3RpY2VhYmxlIGxhZ3MgZHVlIHRvIGRlY29kZSBhbmQgR1BVIHVwbG9hZCBvdmVyaGVhZCkuXHJcblx0ICpcclxuXHQgKiBAYXN5bmNcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZS5cclxuXHQgKiBAcmV0dXJuIHtQcm9taXNlfSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSB0ZXh0dXJlIGhhcyBiZWVuIGluaXRpYWxpemVkLlxyXG5cdCAqL1xyXG5cdGFzeW5jIGluaXRUZXh0dXJlQXN5bmMoIHRleHR1cmUgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9pbml0aWFsaXplZCA9PT0gZmFsc2UgKSBhd2FpdCB0aGlzLmluaXQoKTtcclxuXHJcblx0XHR0aGlzLl90ZXh0dXJlcy51cGRhdGVUZXh0dXJlKCB0ZXh0dXJlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW5pdGlhbGl6ZXMgdGhlIGdpdmVuIHRleHR1cmUuIFVzZWZ1bCBmb3IgcHJlbG9hZGluZyBhIHRleHR1cmUgcmF0aGVyIHRoYW4gd2FpdGluZyB1bnRpbCBmaXJzdCByZW5kZXJcclxuXHQgKiAod2hpY2ggY2FuIGNhdXNlIG5vdGljZWFibGUgbGFncyBkdWUgdG8gZGVjb2RlIGFuZCBHUFUgdXBsb2FkIG92ZXJoZWFkKS5cclxuXHQgKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGNhbiBvbmx5IGJlIHVzZWQgaWYgdGhlIHJlbmRlcmVyIGhhcyBiZWVuIGluaXRpYWxpemVkLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUuXHJcblx0ICovXHJcblx0aW5pdFRleHR1cmUoIHRleHR1cmUgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9pbml0aWFsaXplZCA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5SZW5kZXJlcjogLmluaXRUZXh0dXJlKCkgY2FsbGVkIGJlZm9yZSB0aGUgYmFja2VuZCBpcyBpbml0aWFsaXplZC4gVHJ5IHVzaW5nIC5pbml0VGV4dHVyZUFzeW5jKCkgaW5zdGVhZC4nICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuX3RleHR1cmVzLnVwZGF0ZVRleHR1cmUoIHRleHR1cmUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb3BpZXMgdGhlIGN1cnJlbnQgYm91bmQgZnJhbWVidWZmZXIgaW50byB0aGUgZ2l2ZW4gdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7RnJhbWVidWZmZXJUZXh0dXJlfSBmcmFtZWJ1ZmZlclRleHR1cmUgLSBUaGUgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0gez9WZWN0b3IyfFZlY3RvcjR9IFtyZWN0YW5nbGU9bnVsbF0gLSBBIHR3byBvciBmb3VyIGRpbWVuc2lvbmFsIHZlY3RvciB0aGF0IGRlZmluZXMgdGhlIHJlY3Rhbmd1bGFyIHBvcnRpb24gb2YgdGhlIGZyYW1lYnVmZmVyIHRoYXQgc2hvdWxkIGJlIGNvcGllZC5cclxuXHQgKi9cclxuXHRjb3B5RnJhbWVidWZmZXJUb1RleHR1cmUoIGZyYW1lYnVmZmVyVGV4dHVyZSwgcmVjdGFuZ2xlID0gbnVsbCApIHtcclxuXHJcblx0XHRpZiAoIHJlY3RhbmdsZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGlmICggcmVjdGFuZ2xlLmlzVmVjdG9yMiApIHtcclxuXHJcblx0XHRcdFx0cmVjdGFuZ2xlID0gX3ZlY3RvcjQuc2V0KCByZWN0YW5nbGUueCwgcmVjdGFuZ2xlLnksIGZyYW1lYnVmZmVyVGV4dHVyZS5pbWFnZS53aWR0aCwgZnJhbWVidWZmZXJUZXh0dXJlLmltYWdlLmhlaWdodCApLmZsb29yKCk7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCByZWN0YW5nbGUuaXNWZWN0b3I0ICkge1xyXG5cclxuXHRcdFx0XHRyZWN0YW5nbGUgPSBfdmVjdG9yNC5jb3B5KCByZWN0YW5nbGUgKS5mbG9vcigpO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlJlbmRlcmVyLmNvcHlGcmFtZWJ1ZmZlclRvVGV4dHVyZTogSW52YWxpZCByZWN0YW5nbGUuJyApO1xyXG5cclxuXHRcdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHJlY3RhbmdsZSA9IF92ZWN0b3I0LnNldCggMCwgMCwgZnJhbWVidWZmZXJUZXh0dXJlLmltYWdlLndpZHRoLCBmcmFtZWJ1ZmZlclRleHR1cmUuaW1hZ2UuaGVpZ2h0ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0bGV0IHJlbmRlckNvbnRleHQgPSB0aGlzLl9jdXJyZW50UmVuZGVyQ29udGV4dDtcclxuXHRcdGxldCByZW5kZXJUYXJnZXQ7XHJcblxyXG5cdFx0aWYgKCByZW5kZXJDb250ZXh0ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0cmVuZGVyVGFyZ2V0ID0gcmVuZGVyQ29udGV4dC5yZW5kZXJUYXJnZXQ7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHJlbmRlclRhcmdldCA9IHRoaXMuX3JlbmRlclRhcmdldCB8fCB0aGlzLl9nZXRGcmFtZUJ1ZmZlclRhcmdldCgpO1xyXG5cclxuXHRcdFx0aWYgKCByZW5kZXJUYXJnZXQgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdHRoaXMuX3RleHR1cmVzLnVwZGF0ZVJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICk7XHJcblxyXG5cdFx0XHRcdHJlbmRlckNvbnRleHQgPSB0aGlzLl90ZXh0dXJlcy5nZXQoIHJlbmRlclRhcmdldCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdHRoaXMuX3RleHR1cmVzLnVwZGF0ZVRleHR1cmUoIGZyYW1lYnVmZmVyVGV4dHVyZSwgeyByZW5kZXJUYXJnZXQgfSApO1xyXG5cclxuXHRcdHRoaXMuYmFja2VuZC5jb3B5RnJhbWVidWZmZXJUb1RleHR1cmUoIGZyYW1lYnVmZmVyVGV4dHVyZSwgcmVuZGVyQ29udGV4dCwgcmVjdGFuZ2xlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29waWVzIGRhdGEgb2YgdGhlIGdpdmVuIHNvdXJjZSB0ZXh0dXJlIGludG8gYSBkZXN0aW5hdGlvbiB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSBzcmNUZXh0dXJlIC0gVGhlIHNvdXJjZSB0ZXh0dXJlLlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gZHN0VGV4dHVyZSAtIFRoZSBkZXN0aW5hdGlvbiB0ZXh0dXJlLlxyXG5cdCAqIEBwYXJhbSB7Qm94MnxCb3gzfSBbc3JjUmVnaW9uPW51bGxdIC0gQSBib3VuZGluZyBib3ggd2hpY2ggZGVzY3JpYmVzIHRoZSBzb3VyY2UgcmVnaW9uLiBDYW4gYmUgdHdvIG9yIHRocmVlLWRpbWVuc2lvbmFsLlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMnxWZWN0b3IzfSBbZHN0UG9zaXRpb249bnVsbF0gLSBBIHZlY3RvciB0aGF0IHJlcHJlc2VudHMgdGhlIG9yaWdpbiBvZiB0aGUgZGVzdGluYXRpb24gcmVnaW9uLiBDYW4gYmUgdHdvIG9yIHRocmVlLWRpbWVuc2lvbmFsLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbc3JjTGV2ZWw9MF0gLSBUaGUgc291cmNlIG1pcCBsZXZlbCB0byBjb3B5IGZyb20uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtkc3RMZXZlbD0wXSAtIFRoZSBkZXN0aW5hdGlvbiBtaXAgbGV2ZWwgdG8gY29weSB0by5cclxuXHQgKi9cclxuXHRjb3B5VGV4dHVyZVRvVGV4dHVyZSggc3JjVGV4dHVyZSwgZHN0VGV4dHVyZSwgc3JjUmVnaW9uID0gbnVsbCwgZHN0UG9zaXRpb24gPSBudWxsLCBzcmNMZXZlbCA9IDAsIGRzdExldmVsID0gMCApIHtcclxuXHJcblx0XHR0aGlzLl90ZXh0dXJlcy51cGRhdGVUZXh0dXJlKCBzcmNUZXh0dXJlICk7XHJcblx0XHR0aGlzLl90ZXh0dXJlcy51cGRhdGVUZXh0dXJlKCBkc3RUZXh0dXJlICk7XHJcblxyXG5cdFx0dGhpcy5iYWNrZW5kLmNvcHlUZXh0dXJlVG9UZXh0dXJlKCBzcmNUZXh0dXJlLCBkc3RUZXh0dXJlLCBzcmNSZWdpb24sIGRzdFBvc2l0aW9uLCBzcmNMZXZlbCwgZHN0TGV2ZWwgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZWFkcyBwaXhlbCBkYXRhIGZyb20gdGhlIGdpdmVuIHJlbmRlciB0YXJnZXQuXHJcblx0ICpcclxuXHQgKiBAYXN5bmNcclxuXHQgKiBAcGFyYW0ge1JlbmRlclRhcmdldH0gcmVuZGVyVGFyZ2V0IC0gVGhlIHJlbmRlciB0YXJnZXQgdG8gcmVhZCBmcm9tLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIGB4YCBjb29yZGluYXRlIG9mIHRoZSBjb3B5IHJlZ2lvbidzIG9yaWdpbi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSBgeWAgY29vcmRpbmF0ZSBvZiB0aGUgY29weSByZWdpb24ncyBvcmlnaW4uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSBjb3B5IHJlZ2lvbi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgY29weSByZWdpb24uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt0ZXh0dXJlSW5kZXg9MF0gLSBUaGUgdGV4dHVyZSBpbmRleCBvZiBhIE1SVCByZW5kZXIgdGFyZ2V0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZmFjZUluZGV4PTBdIC0gVGhlIGFjdGl2ZSBjdWJlIGZhY2UgaW5kZXguXHJcblx0ICogQHJldHVybiB7UHJvbWlzZTxUeXBlZEFycmF5Pn0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgcmVhZCBoYXMgYmVlbiBmaW5pc2hlZC4gVGhlIHJlc29sdmUgcHJvdmlkZXMgdGhlIHJlYWQgZGF0YSBhcyBhIHR5cGVkIGFycmF5LlxyXG5cdCAqL1xyXG5cdGFzeW5jIHJlYWRSZW5kZXJUYXJnZXRQaXhlbHNBc3luYyggcmVuZGVyVGFyZ2V0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCB0ZXh0dXJlSW5kZXggPSAwLCBmYWNlSW5kZXggPSAwICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmJhY2tlbmQuY29weVRleHR1cmVUb0J1ZmZlciggcmVuZGVyVGFyZ2V0LnRleHR1cmVzWyB0ZXh0dXJlSW5kZXggXSwgeCwgeSwgd2lkdGgsIGhlaWdodCwgZmFjZUluZGV4ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQW5hbHl6ZXMgdGhlIGdpdmVuIDNEIG9iamVjdCdzIGhpZXJhcmNoeSBhbmQgYnVpbGRzIHJlbmRlciBsaXN0cyBmcm9tIHRoZVxyXG5cdCAqIHByb2Nlc3NlZCBoaWVyYXJjaHkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdDNEfSBvYmplY3QgLSBUaGUgM0Qgb2JqZWN0IHRvIHByb2Nlc3MgKHVzdWFsbHkgYSBzY2VuZSkuXHJcblx0ICogQHBhcmFtIHtDYW1lcmF9IGNhbWVyYSAtIFRoZSBjYW1lcmEgdGhlIG9iamVjdCBpcyByZW5kZXJlZCB3aXRoLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBncm91cE9yZGVyIC0gVGhlIGdyb3VwIG9yZGVyIGlzIGRlcml2ZWQgZnJvbSB0aGUgYHJlbmRlck9yZGVyYCBvZiBncm91cHMgYW5kIGlzIHVzZWQgdG8gZ3JvdXAgM0Qgb2JqZWN0cyB3aXRoaW4gZ3JvdXBzLlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyTGlzdH0gcmVuZGVyTGlzdCAtIFRoZSBjdXJyZW50IHJlbmRlciBsaXN0LlxyXG5cdCAqIEBwYXJhbSB7Q2xpcHBpbmdDb250ZXh0fSBjbGlwcGluZ0NvbnRleHQgLSBUaGUgY3VycmVudCBjbGlwcGluZyBjb250ZXh0LlxyXG5cdCAqL1xyXG5cdF9wcm9qZWN0T2JqZWN0KCBvYmplY3QsIGNhbWVyYSwgZ3JvdXBPcmRlciwgcmVuZGVyTGlzdCwgY2xpcHBpbmdDb250ZXh0ICkge1xyXG5cclxuXHRcdGlmICggb2JqZWN0LnZpc2libGUgPT09IGZhbHNlICkgcmV0dXJuO1xyXG5cclxuXHRcdGNvbnN0IHZpc2libGUgPSBvYmplY3QubGF5ZXJzLnRlc3QoIGNhbWVyYS5sYXllcnMgKTtcclxuXHJcblx0XHRpZiAoIHZpc2libGUgKSB7XHJcblxyXG5cdFx0XHRpZiAoIG9iamVjdC5pc0dyb3VwICkge1xyXG5cclxuXHRcdFx0XHRncm91cE9yZGVyID0gb2JqZWN0LnJlbmRlck9yZGVyO1xyXG5cclxuXHRcdFx0XHRpZiAoIG9iamVjdC5pc0NsaXBwaW5nR3JvdXAgJiYgb2JqZWN0LmVuYWJsZWQgKSBjbGlwcGluZ0NvbnRleHQgPSBjbGlwcGluZ0NvbnRleHQuZ2V0R3JvdXBDb250ZXh0KCBvYmplY3QgKTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc0xPRCApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBvYmplY3QuYXV0b1VwZGF0ZSA9PT0gdHJ1ZSApIG9iamVjdC51cGRhdGUoIGNhbWVyYSApO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzTGlnaHQgKSB7XHJcblxyXG5cdFx0XHRcdHJlbmRlckxpc3QucHVzaExpZ2h0KCBvYmplY3QgKTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc1Nwcml0ZSApIHtcclxuXHJcblx0XHRcdFx0aWYgKCAhIG9iamVjdC5mcnVzdHVtQ3VsbGVkIHx8IF9mcnVzdHVtLmludGVyc2VjdHNTcHJpdGUoIG9iamVjdCApICkge1xyXG5cclxuXHRcdFx0XHRcdGlmICggdGhpcy5zb3J0T2JqZWN0cyA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdF92ZWN0b3I0LnNldEZyb21NYXRyaXhQb3NpdGlvbiggb2JqZWN0Lm1hdHJpeFdvcmxkICkuYXBwbHlNYXRyaXg0KCBfcHJvalNjcmVlbk1hdHJpeCApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRjb25zdCB7IGdlb21ldHJ5LCBtYXRlcmlhbCB9ID0gb2JqZWN0O1xyXG5cclxuXHRcdFx0XHRcdGlmICggbWF0ZXJpYWwudmlzaWJsZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdHJlbmRlckxpc3QucHVzaCggb2JqZWN0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwT3JkZXIsIF92ZWN0b3I0LnosIG51bGwsIGNsaXBwaW5nQ29udGV4dCApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzTGluZUxvb3AgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5SZW5kZXJlcjogT2JqZWN0cyBvZiB0eXBlIFRIUkVFLkxpbmVMb29wIGFyZSBub3Qgc3VwcG9ydGVkLiBQbGVhc2UgdXNlIFRIUkVFLkxpbmUgb3IgVEhSRUUuTGluZVNlZ21lbnRzLicgKTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc01lc2ggfHwgb2JqZWN0LmlzTGluZSB8fCBvYmplY3QuaXNQb2ludHMgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggISBvYmplY3QuZnJ1c3R1bUN1bGxlZCB8fCBfZnJ1c3R1bS5pbnRlcnNlY3RzT2JqZWN0KCBvYmplY3QgKSApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCB7IGdlb21ldHJ5LCBtYXRlcmlhbCB9ID0gb2JqZWN0O1xyXG5cclxuXHRcdFx0XHRcdGlmICggdGhpcy5zb3J0T2JqZWN0cyA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSBnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcclxuXHJcblx0XHRcdFx0XHRcdF92ZWN0b3I0XHJcblx0XHRcdFx0XHRcdFx0LmNvcHkoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlLmNlbnRlciApXHJcblx0XHRcdFx0XHRcdFx0LmFwcGx5TWF0cml4NCggb2JqZWN0Lm1hdHJpeFdvcmxkIClcclxuXHRcdFx0XHRcdFx0XHQuYXBwbHlNYXRyaXg0KCBfcHJvalNjcmVlbk1hdHJpeCApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIG1hdGVyaWFsICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCBncm91cHMgPSBnZW9tZXRyeS5ncm91cHM7XHJcblxyXG5cdFx0XHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBncm91cHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgZ3JvdXAgPSBncm91cHNbIGkgXTtcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBncm91cE1hdGVyaWFsID0gbWF0ZXJpYWxbIGdyb3VwLm1hdGVyaWFsSW5kZXggXTtcclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKCBncm91cE1hdGVyaWFsICYmIGdyb3VwTWF0ZXJpYWwudmlzaWJsZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRyZW5kZXJMaXN0LnB1c2goIG9iamVjdCwgZ2VvbWV0cnksIGdyb3VwTWF0ZXJpYWwsIGdyb3VwT3JkZXIsIF92ZWN0b3I0LnosIGdyb3VwLCBjbGlwcGluZ0NvbnRleHQgKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLnZpc2libGUgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRyZW5kZXJMaXN0LnB1c2goIG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cE9yZGVyLCBfdmVjdG9yNC56LCBudWxsLCBjbGlwcGluZ0NvbnRleHQgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBvYmplY3QuaXNCdW5kbGVHcm91cCA9PT0gdHJ1ZSAmJiB0aGlzLmJhY2tlbmQuYmVnaW5CdW5kbGUgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGJhc2VSZW5kZXJMaXN0ID0gcmVuZGVyTGlzdDtcclxuXHJcblx0XHRcdC8vIHJlcGxhY2UgcmVuZGVyIGxpc3RcclxuXHRcdFx0cmVuZGVyTGlzdCA9IHRoaXMuX3JlbmRlckxpc3RzLmdldCggb2JqZWN0LCBjYW1lcmEgKTtcclxuXHJcblx0XHRcdHJlbmRlckxpc3QuYmVnaW4oKTtcclxuXHJcblx0XHRcdGJhc2VSZW5kZXJMaXN0LnB1c2hCdW5kbGUoIHtcclxuXHRcdFx0XHRidW5kbGVHcm91cDogb2JqZWN0LFxyXG5cdFx0XHRcdGNhbWVyYSxcclxuXHRcdFx0XHRyZW5kZXJMaXN0LFxyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRyZW5kZXJMaXN0LmZpbmlzaCgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBjaGlsZHJlbiA9IG9iamVjdC5jaGlsZHJlbjtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0dGhpcy5fcHJvamVjdE9iamVjdCggY2hpbGRyZW5bIGkgXSwgY2FtZXJhLCBncm91cE9yZGVyLCByZW5kZXJMaXN0LCBjbGlwcGluZ0NvbnRleHQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVuZGVycyB0aGUgZ2l2ZW4gcmVuZGVyIGJ1bmRsZXMuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8T2JqZWN0Pn0gYnVuZGxlcyAtIEFycmF5IHdpdGggcmVuZGVyIGJ1bmRsZSBkYXRhLlxyXG5cdCAqIEBwYXJhbSB7U2NlbmV9IHNjZW5lUmVmIC0gVGhlIHNjZW5lIHRoZSByZW5kZXIgYnVuZGxlcyBiZWxvbmcgdG8uXHJcblx0ICogQHBhcmFtIHtMaWdodHNOb2RlfSBsaWdodHNOb2RlIC0gVGhlIGN1cnJlbnQgbGlnaHRzIG5vZGUuXHJcblx0ICovXHJcblx0X3JlbmRlckJ1bmRsZXMoIGJ1bmRsZXMsIHNjZW5lUmVmLCBsaWdodHNOb2RlICkge1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IGJ1bmRsZSBvZiBidW5kbGVzICkge1xyXG5cclxuXHRcdFx0dGhpcy5fcmVuZGVyQnVuZGxlKCBidW5kbGUsIHNjZW5lUmVmLCBsaWdodHNOb2RlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbmRlcnMgdGhlIHRyYW5zcGFyZW50IG9iamVjdHMgZnJvbSB0aGUgZ2l2ZW4gcmVuZGVyIGxpc3RzLlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge0FycmF5PE9iamVjdD59IHJlbmRlckxpc3QgLSBUaGUgdHJhbnNwYXJlbnQgcmVuZGVyIGxpc3QuXHJcblx0ICogQHBhcmFtIHtBcnJheTxPYmplY3Q+fSBkb3VibGVQYXNzTGlzdCAtIFRoZSBsaXN0IG9mIHRyYW5zcGFyZW50IG9iamVjdHMgd2hpY2ggcmVxdWlyZSBhIGRvdWJsZSBwYXNzIChlLmcuIGJlY2F1c2Ugb2YgdHJhbnNtaXNzaW9uKS5cclxuXHQgKiBAcGFyYW0ge0NhbWVyYX0gY2FtZXJhIC0gVGhlIGNhbWVyYSB0aGUgcmVuZGVyIGxpc3Qgc2hvdWxkIGJlIHJlbmRlcmVkIHdpdGguXHJcblx0ICogQHBhcmFtIHtTY2VuZX0gc2NlbmUgLSBUaGUgc2NlbmUgdGhlIHJlbmRlciBsaXN0IGJlbG9uZ3MgdG8uXHJcblx0ICogQHBhcmFtIHtMaWdodHNOb2RlfSBsaWdodHNOb2RlIC0gVGhlIGN1cnJlbnQgbGlnaHRzIG5vZGUuXHJcblx0ICovXHJcblx0X3JlbmRlclRyYW5zcGFyZW50cyggcmVuZGVyTGlzdCwgZG91YmxlUGFzc0xpc3QsIGNhbWVyYSwgc2NlbmUsIGxpZ2h0c05vZGUgKSB7XHJcblxyXG5cdFx0aWYgKCBkb3VibGVQYXNzTGlzdC5sZW5ndGggPiAwICkge1xyXG5cclxuXHRcdFx0Ly8gcmVuZGVyIGJhY2sgc2lkZVxyXG5cclxuXHRcdFx0Zm9yICggY29uc3QgeyBtYXRlcmlhbCB9IG9mIGRvdWJsZVBhc3NMaXN0ICkge1xyXG5cclxuXHRcdFx0XHRtYXRlcmlhbC5zaWRlID0gQmFja1NpZGU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0aGlzLl9yZW5kZXJPYmplY3RzKCBkb3VibGVQYXNzTGlzdCwgY2FtZXJhLCBzY2VuZSwgbGlnaHRzTm9kZSwgJ2JhY2tTaWRlJyApO1xyXG5cclxuXHRcdFx0Ly8gcmVuZGVyIGZyb250IHNpZGVcclxuXHJcblx0XHRcdGZvciAoIGNvbnN0IHsgbWF0ZXJpYWwgfSBvZiBkb3VibGVQYXNzTGlzdCApIHtcclxuXHJcblx0XHRcdFx0bWF0ZXJpYWwuc2lkZSA9IEZyb250U2lkZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuX3JlbmRlck9iamVjdHMoIHJlbmRlckxpc3QsIGNhbWVyYSwgc2NlbmUsIGxpZ2h0c05vZGUgKTtcclxuXHJcblx0XHRcdC8vIHJlc3RvcmVcclxuXHJcblx0XHRcdGZvciAoIGNvbnN0IHsgbWF0ZXJpYWwgfSBvZiBkb3VibGVQYXNzTGlzdCApIHtcclxuXHJcblx0XHRcdFx0bWF0ZXJpYWwuc2lkZSA9IERvdWJsZVNpZGU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHRoaXMuX3JlbmRlck9iamVjdHMoIHJlbmRlckxpc3QsIGNhbWVyYSwgc2NlbmUsIGxpZ2h0c05vZGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVuZGVycyB0aGUgb2JqZWN0cyBmcm9tIHRoZSBnaXZlbiByZW5kZXIgbGlzdC5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtBcnJheTxPYmplY3Q+fSByZW5kZXJMaXN0IC0gVGhlIHJlbmRlciBsaXN0LlxyXG5cdCAqIEBwYXJhbSB7Q2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIHRoZSByZW5kZXIgbGlzdCBzaG91bGQgYmUgcmVuZGVyZWQgd2l0aC5cclxuXHQgKiBAcGFyYW0ge1NjZW5lfSBzY2VuZSAtIFRoZSBzY2VuZSB0aGUgcmVuZGVyIGxpc3QgYmVsb25ncyB0by5cclxuXHQgKiBAcGFyYW0ge0xpZ2h0c05vZGV9IGxpZ2h0c05vZGUgLSBUaGUgY3VycmVudCBsaWdodHMgbm9kZS5cclxuXHQgKiBAcGFyYW0gez9zdHJpbmd9IFtwYXNzSWQ9bnVsbF0gLSBBbiBvcHRpb25hbCBJRCBmb3IgaWRlbnRpZnlpbmcgdGhlIHBhc3MuXHJcblx0ICovXHJcblx0X3JlbmRlck9iamVjdHMoIHJlbmRlckxpc3QsIGNhbWVyYSwgc2NlbmUsIGxpZ2h0c05vZGUsIHBhc3NJZCA9IG51bGwgKSB7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IHJlbmRlckxpc3QubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB7IG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cCwgY2xpcHBpbmdDb250ZXh0IH0gPSByZW5kZXJMaXN0WyBpIF07XHJcblxyXG5cdFx0XHR0aGlzLl9jdXJyZW50UmVuZGVyT2JqZWN0RnVuY3Rpb24oIG9iamVjdCwgc2NlbmUsIGNhbWVyYSwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cCwgbGlnaHRzTm9kZSwgY2xpcHBpbmdDb250ZXh0LCBwYXNzSWQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgcmVwcmVzZW50cyB0aGUgZGVmYXVsdCByZW5kZXIgb2JqZWN0IGZ1bmN0aW9uIHRoYXQgbWFuYWdlcyB0aGUgcmVuZGVyIGxpZmVjeWNsZVxyXG5cdCAqIG9mIHRoZSBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdDNEfSBvYmplY3QgLSBUaGUgM0Qgb2JqZWN0LlxyXG5cdCAqIEBwYXJhbSB7U2NlbmV9IHNjZW5lIC0gVGhlIHNjZW5lIHRoZSAzRCBvYmplY3QgYmVsb25ncyB0by5cclxuXHQgKiBAcGFyYW0ge0NhbWVyYX0gY2FtZXJhIC0gVGhlIGNhbWVyYSB0aGUgb2JqZWN0IHNob3VsZCBiZSByZW5kZXJlZCB3aXRoLlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyR2VvbWV0cnl9IGdlb21ldHJ5IC0gVGhlIG9iamVjdCdzIGdlb21ldHJ5LlxyXG5cdCAqIEBwYXJhbSB7TWF0ZXJpYWx9IG1hdGVyaWFsIC0gVGhlIG9iamVjdCdzIG1hdGVyaWFsLlxyXG5cdCAqIEBwYXJhbSB7P09iamVjdH0gZ3JvdXAgLSBPbmx5IHJlbGV2YW50IGZvciBvYmplY3RzIHVzaW5nIG11bHRpcGxlIG1hdGVyaWFscy4gVGhpcyByZXByZXNlbnRzIGEgZ3JvdXAgZW50cnkgZnJvbSB0aGUgcmVzcGVjdGl2ZSBgQnVmZmVyR2VvbWV0cnlgLlxyXG5cdCAqIEBwYXJhbSB7TGlnaHRzTm9kZX0gbGlnaHRzTm9kZSAtIFRoZSBjdXJyZW50IGxpZ2h0cyBub2RlLlxyXG5cdCAqIEBwYXJhbSB7P0NsaXBwaW5nQ29udGV4dH0gY2xpcHBpbmdDb250ZXh0IC0gVGhlIGNsaXBwaW5nIGNvbnRleHQuXHJcblx0ICogQHBhcmFtIHs/c3RyaW5nfSBbcGFzc0lkPW51bGxdIC0gQW4gb3B0aW9uYWwgSUQgZm9yIGlkZW50aWZ5aW5nIHRoZSBwYXNzLlxyXG5cdCAqL1xyXG5cdHJlbmRlck9iamVjdCggb2JqZWN0LCBzY2VuZSwgY2FtZXJhLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwLCBsaWdodHNOb2RlLCBjbGlwcGluZ0NvbnRleHQgPSBudWxsLCBwYXNzSWQgPSBudWxsICkge1xyXG5cclxuXHRcdGxldCBvdmVycmlkZVBvc2l0aW9uTm9kZTtcclxuXHRcdGxldCBvdmVycmlkZUNvbG9yTm9kZTtcclxuXHRcdGxldCBvdmVycmlkZURlcHRoTm9kZTtcclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdG9iamVjdC5vbkJlZm9yZVJlbmRlciggdGhpcywgc2NlbmUsIGNhbWVyYSwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cCApO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0aWYgKCBtYXRlcmlhbC5hbGxvd092ZXJyaWRlID09PSB0cnVlICYmIHNjZW5lLm92ZXJyaWRlTWF0ZXJpYWwgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBvdmVycmlkZU1hdGVyaWFsID0gc2NlbmUub3ZlcnJpZGVNYXRlcmlhbDtcclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWwucG9zaXRpb25Ob2RlICYmIG1hdGVyaWFsLnBvc2l0aW9uTm9kZS5pc05vZGUgKSB7XHJcblxyXG5cdFx0XHRcdG92ZXJyaWRlUG9zaXRpb25Ob2RlID0gb3ZlcnJpZGVNYXRlcmlhbC5wb3NpdGlvbk5vZGU7XHJcblx0XHRcdFx0b3ZlcnJpZGVNYXRlcmlhbC5wb3NpdGlvbk5vZGUgPSBtYXRlcmlhbC5wb3NpdGlvbk5vZGU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRvdmVycmlkZU1hdGVyaWFsLmFscGhhVGVzdCA9IG1hdGVyaWFsLmFscGhhVGVzdDtcclxuXHRcdFx0b3ZlcnJpZGVNYXRlcmlhbC5hbHBoYU1hcCA9IG1hdGVyaWFsLmFscGhhTWFwO1xyXG5cdFx0XHRvdmVycmlkZU1hdGVyaWFsLnRyYW5zcGFyZW50ID0gbWF0ZXJpYWwudHJhbnNwYXJlbnQgfHwgbWF0ZXJpYWwudHJhbnNtaXNzaW9uID4gMDtcclxuXHJcblx0XHRcdGlmICggb3ZlcnJpZGVNYXRlcmlhbC5pc1NoYWRvd1Bhc3NNYXRlcmlhbCApIHtcclxuXHJcblx0XHRcdFx0b3ZlcnJpZGVNYXRlcmlhbC5zaWRlID0gbWF0ZXJpYWwuc2hhZG93U2lkZSA9PT0gbnVsbCA/IG1hdGVyaWFsLnNpZGUgOiBtYXRlcmlhbC5zaGFkb3dTaWRlO1xyXG5cclxuXHRcdFx0XHRpZiAoIG1hdGVyaWFsLmRlcHRoTm9kZSAmJiBtYXRlcmlhbC5kZXB0aE5vZGUuaXNOb2RlICkge1xyXG5cclxuXHRcdFx0XHRcdG92ZXJyaWRlRGVwdGhOb2RlID0gb3ZlcnJpZGVNYXRlcmlhbC5kZXB0aE5vZGU7XHJcblx0XHRcdFx0XHRvdmVycmlkZU1hdGVyaWFsLmRlcHRoTm9kZSA9IG1hdGVyaWFsLmRlcHRoTm9kZTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoIG1hdGVyaWFsLmNhc3RTaGFkb3dOb2RlICYmIG1hdGVyaWFsLmNhc3RTaGFkb3dOb2RlLmlzTm9kZSApIHtcclxuXHJcblx0XHRcdFx0XHRvdmVycmlkZUNvbG9yTm9kZSA9IG92ZXJyaWRlTWF0ZXJpYWwuY29sb3JOb2RlO1xyXG5cdFx0XHRcdFx0b3ZlcnJpZGVNYXRlcmlhbC5jb2xvck5vZGUgPSBtYXRlcmlhbC5jYXN0U2hhZG93Tm9kZTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0bWF0ZXJpYWwgPSBvdmVycmlkZU1hdGVyaWFsO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGlmICggbWF0ZXJpYWwudHJhbnNwYXJlbnQgPT09IHRydWUgJiYgbWF0ZXJpYWwuc2lkZSA9PT0gRG91YmxlU2lkZSAmJiBtYXRlcmlhbC5mb3JjZVNpbmdsZVBhc3MgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0bWF0ZXJpYWwuc2lkZSA9IEJhY2tTaWRlO1xyXG5cdFx0XHR0aGlzLl9oYW5kbGVPYmplY3RGdW5jdGlvbiggb2JqZWN0LCBtYXRlcmlhbCwgc2NlbmUsIGNhbWVyYSwgbGlnaHRzTm9kZSwgZ3JvdXAsIGNsaXBwaW5nQ29udGV4dCwgJ2JhY2tTaWRlJyApOyAvLyBjcmVhdGUgYmFja1NpZGUgcGFzcyBpZFxyXG5cclxuXHRcdFx0bWF0ZXJpYWwuc2lkZSA9IEZyb250U2lkZTtcclxuXHRcdFx0dGhpcy5faGFuZGxlT2JqZWN0RnVuY3Rpb24oIG9iamVjdCwgbWF0ZXJpYWwsIHNjZW5lLCBjYW1lcmEsIGxpZ2h0c05vZGUsIGdyb3VwLCBjbGlwcGluZ0NvbnRleHQsIHBhc3NJZCApOyAvLyB1c2UgZGVmYXVsdCBwYXNzIGlkXHJcblxyXG5cdFx0XHRtYXRlcmlhbC5zaWRlID0gRG91YmxlU2lkZTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGhpcy5faGFuZGxlT2JqZWN0RnVuY3Rpb24oIG9iamVjdCwgbWF0ZXJpYWwsIHNjZW5lLCBjYW1lcmEsIGxpZ2h0c05vZGUsIGdyb3VwLCBjbGlwcGluZ0NvbnRleHQsIHBhc3NJZCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGlmICggb3ZlcnJpZGVQb3NpdGlvbk5vZGUgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHNjZW5lLm92ZXJyaWRlTWF0ZXJpYWwucG9zaXRpb25Ob2RlID0gb3ZlcnJpZGVQb3NpdGlvbk5vZGU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggb3ZlcnJpZGVEZXB0aE5vZGUgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHNjZW5lLm92ZXJyaWRlTWF0ZXJpYWwuZGVwdGhOb2RlID0gb3ZlcnJpZGVEZXB0aE5vZGU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggb3ZlcnJpZGVDb2xvck5vZGUgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdHNjZW5lLm92ZXJyaWRlTWF0ZXJpYWwuY29sb3JOb2RlID0gb3ZlcnJpZGVDb2xvck5vZGU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0b2JqZWN0Lm9uQWZ0ZXJSZW5kZXIoIHRoaXMsIHNjZW5lLCBjYW1lcmEsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXAgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCByZXByZXNlbnRzIHRoZSBkZWZhdWx0IGBfaGFuZGxlT2JqZWN0RnVuY3Rpb25gIGltcGxlbWVudGF0aW9uIHdoaWNoIGNyZWF0ZXNcclxuXHQgKiBhIHJlbmRlciBvYmplY3QgZnJvbSB0aGUgZ2l2ZW4gZGF0YSBhbmQgcGVyZm9ybXMgdGhlIGRyYXcgY29tbWFuZCB3aXRoIHRoZSBzZWxlY3RlZCBiYWNrZW5kLlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge09iamVjdDNEfSBvYmplY3QgLSBUaGUgM0Qgb2JqZWN0LlxyXG5cdCAqIEBwYXJhbSB7TWF0ZXJpYWx9IG1hdGVyaWFsIC0gVGhlIG9iamVjdCdzIG1hdGVyaWFsLlxyXG5cdCAqIEBwYXJhbSB7U2NlbmV9IHNjZW5lIC0gVGhlIHNjZW5lIHRoZSAzRCBvYmplY3QgYmVsb25ncyB0by5cclxuXHQgKiBAcGFyYW0ge0NhbWVyYX0gY2FtZXJhIC0gVGhlIGNhbWVyYSB0aGUgb2JqZWN0IHNob3VsZCBiZSByZW5kZXJlZCB3aXRoLlxyXG5cdCAqIEBwYXJhbSB7TGlnaHRzTm9kZX0gbGlnaHRzTm9kZSAtIFRoZSBjdXJyZW50IGxpZ2h0cyBub2RlLlxyXG5cdCAqIEBwYXJhbSB7P3tzdGFydDogbnVtYmVyLCBjb3VudDogbnVtYmVyfX0gZ3JvdXAgLSBPbmx5IHJlbGV2YW50IGZvciBvYmplY3RzIHVzaW5nIG11bHRpcGxlIG1hdGVyaWFscy4gVGhpcyByZXByZXNlbnRzIGEgZ3JvdXAgZW50cnkgZnJvbSB0aGUgcmVzcGVjdGl2ZSBgQnVmZmVyR2VvbWV0cnlgLlxyXG5cdCAqIEBwYXJhbSB7Q2xpcHBpbmdDb250ZXh0fSBjbGlwcGluZ0NvbnRleHQgLSBUaGUgY2xpcHBpbmcgY29udGV4dC5cclxuXHQgKiBAcGFyYW0gez9zdHJpbmd9IFtwYXNzSWQ9bnVsbF0gLSBBbiBvcHRpb25hbCBJRCBmb3IgaWRlbnRpZnlpbmcgdGhlIHBhc3MuXHJcblx0ICovXHJcblx0X3JlbmRlck9iamVjdERpcmVjdCggb2JqZWN0LCBtYXRlcmlhbCwgc2NlbmUsIGNhbWVyYSwgbGlnaHRzTm9kZSwgZ3JvdXAsIGNsaXBwaW5nQ29udGV4dCwgcGFzc0lkICkge1xyXG5cclxuXHRcdGNvbnN0IHJlbmRlck9iamVjdCA9IHRoaXMuX29iamVjdHMuZ2V0KCBvYmplY3QsIG1hdGVyaWFsLCBzY2VuZSwgY2FtZXJhLCBsaWdodHNOb2RlLCB0aGlzLl9jdXJyZW50UmVuZGVyQ29udGV4dCwgY2xpcHBpbmdDb250ZXh0LCBwYXNzSWQgKTtcclxuXHRcdHJlbmRlck9iamVjdC5kcmF3UmFuZ2UgPSBvYmplY3QuZ2VvbWV0cnkuZHJhd1JhbmdlO1xyXG5cdFx0cmVuZGVyT2JqZWN0Lmdyb3VwID0gZ3JvdXA7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCBuZWVkc1JlZnJlc2ggPSB0aGlzLl9ub2Rlcy5uZWVkc1JlZnJlc2goIHJlbmRlck9iamVjdCApO1xyXG5cclxuXHRcdGlmICggbmVlZHNSZWZyZXNoICkge1xyXG5cclxuXHRcdFx0dGhpcy5fbm9kZXMudXBkYXRlQmVmb3JlKCByZW5kZXJPYmplY3QgKTtcclxuXHJcblx0XHRcdHRoaXMuX2dlb21ldHJpZXMudXBkYXRlRm9yUmVuZGVyKCByZW5kZXJPYmplY3QgKTtcclxuXHJcblx0XHRcdHRoaXMuX25vZGVzLnVwZGF0ZUZvclJlbmRlciggcmVuZGVyT2JqZWN0ICk7XHJcblx0XHRcdHRoaXMuX2JpbmRpbmdzLnVwZGF0ZUZvclJlbmRlciggcmVuZGVyT2JqZWN0ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuX3BpcGVsaW5lcy51cGRhdGVGb3JSZW5kZXIoIHJlbmRlck9iamVjdCApO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0aWYgKCB0aGlzLl9jdXJyZW50UmVuZGVyQnVuZGxlICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0Y29uc3QgcmVuZGVyQnVuZGxlRGF0YSA9IHRoaXMuYmFja2VuZC5nZXQoIHRoaXMuX2N1cnJlbnRSZW5kZXJCdW5kbGUgKTtcclxuXHJcblx0XHRcdHJlbmRlckJ1bmRsZURhdGEucmVuZGVyT2JqZWN0cy5wdXNoKCByZW5kZXJPYmplY3QgKTtcclxuXHJcblx0XHRcdHJlbmRlck9iamVjdC5idW5kbGUgPSB0aGlzLl9jdXJyZW50UmVuZGVyQnVuZGxlLmJ1bmRsZUdyb3VwO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmJhY2tlbmQuZHJhdyggcmVuZGVyT2JqZWN0LCB0aGlzLmluZm8gKTtcclxuXHJcblx0XHRpZiAoIG5lZWRzUmVmcmVzaCApIHRoaXMuX25vZGVzLnVwZGF0ZUFmdGVyKCByZW5kZXJPYmplY3QgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbiBmb3IgYF9oYW5kbGVPYmplY3RGdW5jdGlvbmAgd2hpY2ggb25seSBtYWtlcyBzdXJlIHRoZSBvYmplY3QgaXMgcmVhZHkgZm9yIHJlbmRlcmluZy5cclxuXHQgKiBVc2VkIGluIGBjb21waWxlQXN5bmMoKWAuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0M0R9IG9iamVjdCAtIFRoZSAzRCBvYmplY3QuXHJcblx0ICogQHBhcmFtIHtNYXRlcmlhbH0gbWF0ZXJpYWwgLSBUaGUgb2JqZWN0J3MgbWF0ZXJpYWwuXHJcblx0ICogQHBhcmFtIHtTY2VuZX0gc2NlbmUgLSBUaGUgc2NlbmUgdGhlIDNEIG9iamVjdCBiZWxvbmdzIHRvLlxyXG5cdCAqIEBwYXJhbSB7Q2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIHRoZSBvYmplY3Qgc2hvdWxkIGJlIHJlbmRlcmVkIHdpdGguXHJcblx0ICogQHBhcmFtIHtMaWdodHNOb2RlfSBsaWdodHNOb2RlIC0gVGhlIGN1cnJlbnQgbGlnaHRzIG5vZGUuXHJcblx0ICogQHBhcmFtIHs/e3N0YXJ0OiBudW1iZXIsIGNvdW50OiBudW1iZXJ9fSBncm91cCAtIE9ubHkgcmVsZXZhbnQgZm9yIG9iamVjdHMgdXNpbmcgbXVsdGlwbGUgbWF0ZXJpYWxzLiBUaGlzIHJlcHJlc2VudHMgYSBncm91cCBlbnRyeSBmcm9tIHRoZSByZXNwZWN0aXZlIGBCdWZmZXJHZW9tZXRyeWAuXHJcblx0ICogQHBhcmFtIHtDbGlwcGluZ0NvbnRleHR9IGNsaXBwaW5nQ29udGV4dCAtIFRoZSBjbGlwcGluZyBjb250ZXh0LlxyXG5cdCAqIEBwYXJhbSB7P3N0cmluZ30gW3Bhc3NJZD1udWxsXSAtIEFuIG9wdGlvbmFsIElEIGZvciBpZGVudGlmeWluZyB0aGUgcGFzcy5cclxuXHQgKi9cclxuXHRfY3JlYXRlT2JqZWN0UGlwZWxpbmUoIG9iamVjdCwgbWF0ZXJpYWwsIHNjZW5lLCBjYW1lcmEsIGxpZ2h0c05vZGUsIGdyb3VwLCBjbGlwcGluZ0NvbnRleHQsIHBhc3NJZCApIHtcclxuXHJcblx0XHRjb25zdCByZW5kZXJPYmplY3QgPSB0aGlzLl9vYmplY3RzLmdldCggb2JqZWN0LCBtYXRlcmlhbCwgc2NlbmUsIGNhbWVyYSwgbGlnaHRzTm9kZSwgdGhpcy5fY3VycmVudFJlbmRlckNvbnRleHQsIGNsaXBwaW5nQ29udGV4dCwgcGFzc0lkICk7XHJcblx0XHRyZW5kZXJPYmplY3QuZHJhd1JhbmdlID0gb2JqZWN0Lmdlb21ldHJ5LmRyYXdSYW5nZTtcclxuXHRcdHJlbmRlck9iamVjdC5ncm91cCA9IGdyb3VwO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0dGhpcy5fbm9kZXMudXBkYXRlQmVmb3JlKCByZW5kZXJPYmplY3QgKTtcclxuXHJcblx0XHR0aGlzLl9nZW9tZXRyaWVzLnVwZGF0ZUZvclJlbmRlciggcmVuZGVyT2JqZWN0ICk7XHJcblxyXG5cdFx0dGhpcy5fbm9kZXMudXBkYXRlRm9yUmVuZGVyKCByZW5kZXJPYmplY3QgKTtcclxuXHRcdHRoaXMuX2JpbmRpbmdzLnVwZGF0ZUZvclJlbmRlciggcmVuZGVyT2JqZWN0ICk7XHJcblxyXG5cdFx0dGhpcy5fcGlwZWxpbmVzLmdldEZvclJlbmRlciggcmVuZGVyT2JqZWN0LCB0aGlzLl9jb21waWxhdGlvblByb21pc2VzICk7XHJcblxyXG5cdFx0dGhpcy5fbm9kZXMudXBkYXRlQWZ0ZXIoIHJlbmRlck9iamVjdCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFsaWFzIGZvciBgY29tcGlsZUFzeW5jKClgLlxyXG5cdCAqXHJcblx0ICogQG1ldGhvZFxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0M0R9IHNjZW5lIC0gVGhlIHNjZW5lIG9yIDNEIG9iamVjdCB0byBwcmVjb21waWxlLlxyXG5cdCAqIEBwYXJhbSB7Q2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIHRoYXQgaXMgdXNlZCB0byByZW5kZXIgdGhlIHNjZW5lLlxyXG5cdCAqIEBwYXJhbSB7U2NlbmV9IHRhcmdldFNjZW5lIC0gSWYgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGEgM0Qgb2JqZWN0LCB0aGlzIHBhcmFtZXRlciBtdXN0IHJlcHJlc2VudCB0aGUgc2NlbmUgdGhlIDNEIG9iamVjdCBpcyBnb2luZyB0byBiZSBhZGRlZC5cclxuXHQgKiBAcmV0dXJuIHtmdW5jdGlvbihPYmplY3QzRCwgQ2FtZXJhLCA/U2NlbmUpOiBQcm9taXNlfHVuZGVmaW5lZH0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY29tcGlsZSBoYXMgYmVlbiBmaW5pc2hlZC5cclxuXHQgKi9cclxuXHRnZXQgY29tcGlsZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5jb21waWxlQXN5bmM7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFJlbmRlcmVyO1xyXG4iLCIvKipcclxuICogQSBiaW5kaW5nIHJlcHJlc2VudHMgdGhlIGNvbm5lY3Rpb24gYmV0d2VlbiBhIHJlc291cmNlIChsaWtlIGEgdGV4dHVyZSwgc2FtcGxlclxyXG4gKiBvciB1bmlmb3JtIGJ1ZmZlcikgYW5kIHRoZSByZXNvdXJjZSBkZWZpbml0aW9uIGluIGEgc2hhZGVyIHN0YWdlLlxyXG4gKlxyXG4gKiBUaGlzIG1vZHVsZSBpcyBhbiBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhbGwgY29uY3JldGUgYmluZGluZ3MgdHlwZXMuXHJcbiAqXHJcbiAqIEBhYnN0cmFjdFxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuY2xhc3MgQmluZGluZyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYmluZGluZy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZT0nJ10gLSBUaGUgYmluZGluZydzIG5hbWUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5hbWUgPSAnJyApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBiaW5kaW5nJ3MgbmFtZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5hbWUgPSBuYW1lO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBiaXRtYXNrIHRoYXQgZGVmaW5lcyBpbiB3aGF0IHNoYWRlciBzdGFnZXMgdGhlXHJcblx0XHQgKiBiaW5kaW5nJ3MgcmVzb3VyY2UgaXMgYWNjZXNzaWJsZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnZpc2liaWxpdHkgPSAwO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE1ha2VzIHN1cmUgYmluZGluZydzIHJlc291cmNlIGlzIHZpc2libGUgZm9yIHRoZSBnaXZlbiBzaGFkZXIgc3RhZ2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdmlzaWJpbGl0eSAtIFRoZSBzaGFkZXIgc3RhZ2UuXHJcblx0ICovXHJcblx0c2V0VmlzaWJpbGl0eSggdmlzaWJpbGl0eSApIHtcclxuXHJcblx0XHR0aGlzLnZpc2liaWxpdHkgfD0gdmlzaWJpbGl0eTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDbG9uZXMgdGhlIGJpbmRpbmcuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtCaW5kaW5nfSBUaGUgY2xvbmVkIGJpbmRpbmcuXHJcblx0ICovXHJcblx0Y2xvbmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIE9iamVjdC5hc3NpZ24oIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCksIHRoaXMgKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQmluZGluZztcclxuIiwiaW1wb3J0IHsgR1BVX0NIVU5LX0JZVEVTIH0gZnJvbSAnLi9Db25zdGFudHMuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgZnVuY3Rpb24gaXMgdXN1YWxseSBjYWxsZWQgd2l0aCB0aGUgbGVuZ3RoIGluIGJ5dGVzIG9mIGFuIGFycmF5IGJ1ZmZlci5cclxuICogSXQgcmV0dXJucyBhbiBwYWRkZWQgdmFsdWUgd2hpY2ggZW5zdXJlIGNodW5rIHNpemUgYWxpZ25tZW50IGFjY29yZGluZyB0byBTVEQxNDAgbGF5b3V0LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtudW1iZXJ9IGZsb2F0TGVuZ3RoIC0gVGhlIGJ1ZmZlciBsZW5ndGguXHJcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIHBhZGRlZCBsZW5ndGguXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRGbG9hdExlbmd0aCggZmxvYXRMZW5ndGggKSB7XHJcblxyXG5cdC8vIGVuc3VyZSBjaHVuayBzaXplIGFsaWdubWVudCAoU1REMTQwIGxheW91dClcclxuXHJcblx0cmV0dXJuIGZsb2F0TGVuZ3RoICsgKCAoIEdQVV9DSFVOS19CWVRFUyAtICggZmxvYXRMZW5ndGggJSBHUFVfQ0hVTktfQllURVMgKSApICUgR1BVX0NIVU5LX0JZVEVTICk7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogR2l2ZW4gdGhlIGNvdW50IG9mIHZlY3RvcnMgYW5kIHRoZWlyIHZlY3RvciBsZW5ndGgsIHRoaXMgZnVuY3Rpb24gY29tcHV0ZXNcclxuICogYSB0b3RhbCBsZW5ndGggaW4gYnl0ZXMgd2l0aCBidWZmZXIgYWxpZ25tZW50IGFjY29yZGluZyB0byBTVEQxNDAgbGF5b3V0LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtudW1iZXJ9IGNvdW50IC0gVGhlIG51bWJlciBvZiB2ZWN0b3JzLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW3ZlY3Rvckxlbmd0aD00XSAtIFRoZSB2ZWN0b3IgbGVuZ3RoLlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBwYWRkZWQgbGVuZ3RoLlxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0VmVjdG9yTGVuZ3RoKCBjb3VudCwgdmVjdG9yTGVuZ3RoID0gNCApIHtcclxuXHJcblx0Y29uc3Qgc3RyaWRlTGVuZ3RoID0gZ2V0U3RyaWRlTGVuZ3RoKCB2ZWN0b3JMZW5ndGggKTtcclxuXHJcblx0Y29uc3QgZmxvYXRMZW5ndGggPSBzdHJpZGVMZW5ndGggKiBjb3VudDtcclxuXHJcblx0cmV0dXJuIGdldEZsb2F0TGVuZ3RoKCBmbG9hdExlbmd0aCApO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggYSB2ZWN0b3IgbGVuZ3RoIGFuZCBlbnN1cmUgdGhlIGNvbXB1dGVkIGxlbmd0aFxyXG4gKiBtYXRjaGVzIGEgcHJlZGVmaW5lZCBzdHJpZGUgKGluIHRoaXMgY2FzZSBgNGApLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb25cclxuICogQHBhcmFtIHtudW1iZXJ9IHZlY3Rvckxlbmd0aCAtIFRoZSB2ZWN0b3IgbGVuZ3RoLlxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBwYWRkZWQgbGVuZ3RoLlxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0U3RyaWRlTGVuZ3RoKCB2ZWN0b3JMZW5ndGggKSB7XHJcblxyXG5cdGNvbnN0IHN0cmlkZUxlbmd0aCA9IDQ7XHJcblxyXG5cdHJldHVybiB2ZWN0b3JMZW5ndGggKyAoICggc3RyaWRlTGVuZ3RoIC0gKCB2ZWN0b3JMZW5ndGggJSBzdHJpZGVMZW5ndGggKSApICUgc3RyaWRlTGVuZ3RoICk7XHJcblxyXG59XHJcblxyXG5leHBvcnQge1xyXG5cdGdldEZsb2F0TGVuZ3RoLFxyXG5cdGdldFZlY3Rvckxlbmd0aCxcclxuXHRnZXRTdHJpZGVMZW5ndGhcclxufTtcclxuIiwiaW1wb3J0IEJpbmRpbmcgZnJvbSAnLi9CaW5kaW5nLmpzJztcclxuaW1wb3J0IHsgZ2V0RmxvYXRMZW5ndGggfSBmcm9tICcuL0J1ZmZlclV0aWxzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIGEgYnVmZmVyIGJpbmRpbmcgdHlwZS5cclxuICpcclxuICogQHByaXZhdGVcclxuICogQGFic3RyYWN0XHJcbiAqIEBhdWdtZW50cyBCaW5kaW5nXHJcbiAqL1xyXG5jbGFzcyBCdWZmZXIgZXh0ZW5kcyBCaW5kaW5nIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBidWZmZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBidWZmZXIncyBuYW1lLlxyXG5cdCAqIEBwYXJhbSB7VHlwZWRBcnJheX0gW2J1ZmZlcj1udWxsXSAtIFRoZSBidWZmZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5hbWUsIGJ1ZmZlciA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5hbWUgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNCdWZmZXIgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGJ5dGVzIHBlciBlbGVtZW50LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYnl0ZXNQZXJFbGVtZW50ID0gRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIGludGVybmFsIGJ1ZmZlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge1R5cGVkQXJyYXl9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX2J1ZmZlciA9IGJ1ZmZlcjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgYnVmZmVyJ3MgYnl0ZSBsZW5ndGguXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdCAqIEByZWFkb25seVxyXG5cdCAqL1xyXG5cdGdldCBieXRlTGVuZ3RoKCkge1xyXG5cclxuXHRcdHJldHVybiBnZXRGbG9hdExlbmd0aCggdGhpcy5fYnVmZmVyLmJ5dGVMZW5ndGggKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBIHJlZmVyZW5jZSB0byB0aGUgaW50ZXJuYWwgYnVmZmVyLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge0Zsb2F0MzJBcnJheX1cclxuXHQgKiBAcmVhZG9ubHlcclxuXHQgKi9cclxuXHRnZXQgYnVmZmVyKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9idWZmZXI7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgYmluZGluZy5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGJ1ZmZlciBoYXMgYmVlbiB1cGRhdGVkIGFuZCBtdXN0IGJlXHJcblx0ICogdXBsb2FkZWQgdG8gdGhlIEdQVS5cclxuXHQgKi9cclxuXHR1cGRhdGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRydWU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEJ1ZmZlcjtcclxuIiwiaW1wb3J0IEJ1ZmZlciBmcm9tICcuL0J1ZmZlci5qcyc7XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyBhIHVuaWZvcm0gYnVmZmVyIGJpbmRpbmcgdHlwZS5cclxuICpcclxuICogQHByaXZhdGVcclxuICogQGF1Z21lbnRzIEJ1ZmZlclxyXG4gKi9cclxuY2xhc3MgVW5pZm9ybUJ1ZmZlciBleHRlbmRzIEJ1ZmZlciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgdW5pZm9ybSBidWZmZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBidWZmZXIncyBuYW1lLlxyXG5cdCAqIEBwYXJhbSB7VHlwZWRBcnJheX0gW2J1ZmZlcj1udWxsXSAtIFRoZSBidWZmZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5hbWUsIGJ1ZmZlciA9IG51bGwgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5hbWUsIGJ1ZmZlciApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1VuaWZvcm1CdWZmZXIgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBVbmlmb3JtQnVmZmVyO1xyXG4iLCJpbXBvcnQgVW5pZm9ybUJ1ZmZlciBmcm9tICcuLi9Vbmlmb3JtQnVmZmVyLmpzJztcclxuXHJcbmxldCBfaWQgPSAwO1xyXG5cclxuLyoqXHJcbiAqIEEgc3BlY2lhbCBmb3JtIG9mIHVuaWZvcm0gYnVmZmVyIGJpbmRpbmcgdHlwZS5cclxuICogSXQncyBidWZmZXIgdmFsdWUgaXMgbWFuYWdlZCBieSBhIG5vZGUgb2JqZWN0LlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAYXVnbWVudHMgVW5pZm9ybUJ1ZmZlclxyXG4gKi9cclxuY2xhc3MgTm9kZVVuaWZvcm1CdWZmZXIgZXh0ZW5kcyBVbmlmb3JtQnVmZmVyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBub2RlLWJhc2VkIHVuaWZvcm0gYnVmZmVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCdWZmZXJOb2RlfSBub2RlVW5pZm9ybSAtIFRoZSB1bmlmb3JtIGJ1ZmZlciBub2RlLlxyXG5cdCAqIEBwYXJhbSB7VW5pZm9ybUdyb3VwTm9kZX0gZ3JvdXBOb2RlIC0gVGhlIHVuaWZvcm0gZ3JvdXAgbm9kZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvciggbm9kZVVuaWZvcm0sIGdyb3VwTm9kZSApIHtcclxuXHJcblx0XHRzdXBlciggJ1VuaWZvcm1CdWZmZXJfJyArIF9pZCArKywgbm9kZVVuaWZvcm0gPyBub2RlVW5pZm9ybS52YWx1ZSA6IG51bGwgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB1bmlmb3JtIGJ1ZmZlciBub2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtCdWZmZXJOb2RlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vZGVVbmlmb3JtID0gbm9kZVVuaWZvcm07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdW5pZm9ybSBncm91cCBub2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtVbmlmb3JtR3JvdXBOb2RlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdyb3VwTm9kZSA9IGdyb3VwTm9kZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgdW5pZm9ybSBidWZmZXIuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7RmxvYXQzMkFycmF5fVxyXG5cdCAqL1xyXG5cdGdldCBidWZmZXIoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubm9kZVVuaWZvcm0udmFsdWU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IE5vZGVVbmlmb3JtQnVmZmVyO1xyXG4iLCJpbXBvcnQgVW5pZm9ybUJ1ZmZlciBmcm9tICcuL1VuaWZvcm1CdWZmZXIuanMnO1xyXG5pbXBvcnQgeyBHUFVfQ0hVTktfQllURVMgfSBmcm9tICcuL0NvbnN0YW50cy5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgdW5pZm9ybSBidWZmZXIgYmluZGluZyBidXQgd2l0aFxyXG4gKiBhbiBBUEkgdGhhdCBhbGxvd3MgdG8gbWFpbnRhaW4gaW5kaXZpZHVhbCB1bmlmb3JtIG9iamVjdHMuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBhdWdtZW50cyBVbmlmb3JtQnVmZmVyXHJcbiAqL1xyXG5jbGFzcyBVbmlmb3Jtc0dyb3VwIGV4dGVuZHMgVW5pZm9ybUJ1ZmZlciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgdW5pZm9ybXMgZ3JvdXAuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBncm91cCdzIG5hbWUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5hbWUgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5hbWUgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNVbmlmb3Jtc0dyb3VwID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIGFycmF5IHdpdGggdGhlIHJhdyB1bmlmb3JtIHZhbHVlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUgez9BcnJheTxudW1iZXI+fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLl92YWx1ZXMgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQW4gYXJyYXkgb2YgdW5pZm9ybSBvYmplY3RzLlxyXG5cdFx0ICpcclxuXHRcdCAqIFRoZSBvcmRlciBvZiB1bmlmb3JtcyBpbiB0aGlzIGFycmF5IG11c3QgbWF0Y2ggdGhlIG9yZGVyIG9mIHVuaWZvcm1zIGluIHRoZSBzaGFkZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PFVuaWZvcm0+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVuaWZvcm1zID0gW107XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyBhIHVuaWZvcm0gdG8gdGhpcyBncm91cC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VW5pZm9ybX0gdW5pZm9ybSAtIFRoZSB1bmlmb3JtIHRvIGFkZC5cclxuXHQgKiBAcmV0dXJuIHtVbmlmb3Jtc0dyb3VwfSBBIHJlZmVyZW5jZSB0byB0aGlzIGdyb3VwLlxyXG5cdCAqL1xyXG5cdGFkZFVuaWZvcm0oIHVuaWZvcm0gKSB7XHJcblxyXG5cdFx0dGhpcy51bmlmb3Jtcy5wdXNoKCB1bmlmb3JtICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVtb3ZlcyBhIHVuaWZvcm0gZnJvbSB0aGlzIGdyb3VwLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtVbmlmb3JtfSB1bmlmb3JtIC0gVGhlIHVuaWZvcm0gdG8gcmVtb3ZlLlxyXG5cdCAqIEByZXR1cm4ge1VuaWZvcm1zR3JvdXB9IEEgcmVmZXJlbmNlIHRvIHRoaXMgZ3JvdXAuXHJcblx0ICovXHJcblx0cmVtb3ZlVW5pZm9ybSggdW5pZm9ybSApIHtcclxuXHJcblx0XHRjb25zdCBpbmRleCA9IHRoaXMudW5pZm9ybXMuaW5kZXhPZiggdW5pZm9ybSApO1xyXG5cclxuXHRcdGlmICggaW5kZXggIT09IC0gMSApIHtcclxuXHJcblx0XHRcdHRoaXMudW5pZm9ybXMuc3BsaWNlKCBpbmRleCwgMSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBbiBhcnJheSB3aXRoIHRoZSByYXcgdW5pZm9ybSB2YWx1ZXMuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7QXJyYXk8bnVtYmVyPn1cclxuXHQgKi9cclxuXHRnZXQgdmFsdWVzKCkge1xyXG5cclxuXHRcdGlmICggdGhpcy5fdmFsdWVzID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0dGhpcy5fdmFsdWVzID0gQXJyYXkuZnJvbSggdGhpcy5idWZmZXIgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX3ZhbHVlcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBIEZsb2F0MzIgYXJyYXkgYnVmZmVyIHdpdGggdGhlIHVuaWZvcm0gdmFsdWVzLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge0Zsb2F0MzJBcnJheX1cclxuXHQgKi9cclxuXHRnZXQgYnVmZmVyKCkge1xyXG5cclxuXHRcdGxldCBidWZmZXIgPSB0aGlzLl9idWZmZXI7XHJcblxyXG5cdFx0aWYgKCBidWZmZXIgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBieXRlTGVuZ3RoID0gdGhpcy5ieXRlTGVuZ3RoO1xyXG5cclxuXHRcdFx0YnVmZmVyID0gbmV3IEZsb2F0MzJBcnJheSggbmV3IEFycmF5QnVmZmVyKCBieXRlTGVuZ3RoICkgKTtcclxuXHJcblx0XHRcdHRoaXMuX2J1ZmZlciA9IGJ1ZmZlcjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGJ1ZmZlcjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgYnl0ZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciB3aXRoIGNvcnJlY3QgYnVmZmVyIGFsaWdubWVudC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0ICovXHJcblx0Z2V0IGJ5dGVMZW5ndGgoKSB7XHJcblxyXG5cdFx0bGV0IG9mZnNldCA9IDA7IC8vIGdsb2JhbCBidWZmZXIgb2Zmc2V0IGluIGJ5dGVzXHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gdGhpcy51bmlmb3Jtcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdW5pZm9ybSA9IHRoaXMudW5pZm9ybXNbIGkgXTtcclxuXHJcblx0XHRcdGNvbnN0IHsgYm91bmRhcnksIGl0ZW1TaXplIH0gPSB1bmlmb3JtO1xyXG5cclxuXHRcdFx0Ly8gb2Zmc2V0IHdpdGhpbiBhIHNpbmdsZSBjaHVuayBpbiBieXRlc1xyXG5cclxuXHRcdFx0Y29uc3QgY2h1bmtPZmZzZXQgPSBvZmZzZXQgJSBHUFVfQ0hVTktfQllURVM7XHJcblx0XHRcdGNvbnN0IHJlbWFpbmluZ1NpemVJbkNodW5rID0gR1BVX0NIVU5LX0JZVEVTIC0gY2h1bmtPZmZzZXQ7XHJcblxyXG5cdFx0XHQvLyBjb25mb3JtYW5jZSB0ZXN0c1xyXG5cclxuXHRcdFx0aWYgKCBjaHVua09mZnNldCAhPT0gMCAmJiAoIHJlbWFpbmluZ1NpemVJbkNodW5rIC0gYm91bmRhcnkgKSA8IDAgKSB7XHJcblxyXG5cdFx0XHRcdC8vIGNoZWNrIGZvciBjaHVuayBvdmVyZmxvd1xyXG5cclxuXHRcdFx0XHRvZmZzZXQgKz0gKCBHUFVfQ0hVTktfQllURVMgLSBjaHVua09mZnNldCApO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggY2h1bmtPZmZzZXQgJSBib3VuZGFyeSAhPT0gMCApIHtcclxuXHJcblx0XHRcdFx0Ly8gY2hlY2sgZm9yIGNvcnJlY3QgYWxpZ25tZW50XHJcblxyXG5cdFx0XHRcdG9mZnNldCArPSAoIGNodW5rT2Zmc2V0ICUgYm91bmRhcnkgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHVuaWZvcm0ub2Zmc2V0ID0gKCBvZmZzZXQgLyB0aGlzLmJ5dGVzUGVyRWxlbWVudCApO1xyXG5cclxuXHRcdFx0b2Zmc2V0ICs9ICggaXRlbVNpemUgKiB0aGlzLmJ5dGVzUGVyRWxlbWVudCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gTWF0aC5jZWlsKCBvZmZzZXQgLyBHUFVfQ0hVTktfQllURVMgKSAqIEdQVV9DSFVOS19CWVRFUztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoaXMgZ3JvdXAgYnkgdXBkYXRpbmcgZWFjaCB1bmlmb3JtIG9iamVjdCBvZlxyXG5cdCAqIHRoZSBpbnRlcm5hbCB1bmlmb3JtIGxpc3QuIFRoZSB1bmlmb3JtIG9iamVjdHMgY2hlY2sgaWYgdGhlaXJcclxuXHQgKiB2YWx1ZXMgaGFzIGFjdHVhbGx5IGNoYW5nZWQgc28gdGhpcyBtZXRob2Qgb25seSByZXR1cm5zXHJcblx0ICogYHRydWVgIGlmIHRoZXJlIGlzIGEgcmVhbCB2YWx1ZSBjaGFuZ2UuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSB1bmlmb3JtcyBoYXZlIGJlZW4gdXBkYXRlZCBhbmRcclxuXHQgKiBtdXN0IGJlIHVwbG9hZGVkIHRvIHRoZSBHUFUuXHJcblx0ICovXHJcblx0dXBkYXRlKCkge1xyXG5cclxuXHRcdGxldCB1cGRhdGVkID0gZmFsc2U7XHJcblxyXG5cdFx0Zm9yICggY29uc3QgdW5pZm9ybSBvZiB0aGlzLnVuaWZvcm1zICkge1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLnVwZGF0ZUJ5VHlwZSggdW5pZm9ybSApID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHR1cGRhdGVkID0gdHJ1ZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHVwZGF0ZWQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyBhIGdpdmVuIHVuaWZvcm0gYnkgY2FsbGluZyBhbiB1cGRhdGUgbWV0aG9kIG1hdGNoaW5nXHJcblx0ICogdGhlIHVuaWZvcm1zIHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1VuaWZvcm19IHVuaWZvcm0gLSBUaGUgdW5pZm9ybSB0byB1cGRhdGUuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgdW5pZm9ybSBoYXMgYmVlbiB1cGRhdGVkIG9yIG5vdC5cclxuXHQgKi9cclxuXHR1cGRhdGVCeVR5cGUoIHVuaWZvcm0gKSB7XHJcblxyXG5cdFx0aWYgKCB1bmlmb3JtLmlzTnVtYmVyVW5pZm9ybSApIHJldHVybiB0aGlzLnVwZGF0ZU51bWJlciggdW5pZm9ybSApO1xyXG5cdFx0aWYgKCB1bmlmb3JtLmlzVmVjdG9yMlVuaWZvcm0gKSByZXR1cm4gdGhpcy51cGRhdGVWZWN0b3IyKCB1bmlmb3JtICk7XHJcblx0XHRpZiAoIHVuaWZvcm0uaXNWZWN0b3IzVW5pZm9ybSApIHJldHVybiB0aGlzLnVwZGF0ZVZlY3RvcjMoIHVuaWZvcm0gKTtcclxuXHRcdGlmICggdW5pZm9ybS5pc1ZlY3RvcjRVbmlmb3JtICkgcmV0dXJuIHRoaXMudXBkYXRlVmVjdG9yNCggdW5pZm9ybSApO1xyXG5cdFx0aWYgKCB1bmlmb3JtLmlzQ29sb3JVbmlmb3JtICkgcmV0dXJuIHRoaXMudXBkYXRlQ29sb3IoIHVuaWZvcm0gKTtcclxuXHRcdGlmICggdW5pZm9ybS5pc01hdHJpeDNVbmlmb3JtICkgcmV0dXJuIHRoaXMudXBkYXRlTWF0cml4MyggdW5pZm9ybSApO1xyXG5cdFx0aWYgKCB1bmlmb3JtLmlzTWF0cml4NFVuaWZvcm0gKSByZXR1cm4gdGhpcy51cGRhdGVNYXRyaXg0KCB1bmlmb3JtICk7XHJcblxyXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdQVVVuaWZvcm1zR3JvdXA6IFVuc3VwcG9ydGVkIHVuaWZvcm0gdHlwZS4nLCB1bmlmb3JtICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyBhIGdpdmVuIE51bWJlciB1bmlmb3JtLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOdW1iZXJVbmlmb3JtfSB1bmlmb3JtIC0gVGhlIE51bWJlciB1bmlmb3JtLlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHVuaWZvcm0gaGFzIGJlZW4gdXBkYXRlZCBvciBub3QuXHJcblx0ICovXHJcblx0dXBkYXRlTnVtYmVyKCB1bmlmb3JtICkge1xyXG5cclxuXHRcdGxldCB1cGRhdGVkID0gZmFsc2U7XHJcblxyXG5cdFx0Y29uc3QgYSA9IHRoaXMudmFsdWVzO1xyXG5cdFx0Y29uc3QgdiA9IHVuaWZvcm0uZ2V0VmFsdWUoKTtcclxuXHRcdGNvbnN0IG9mZnNldCA9IHVuaWZvcm0ub2Zmc2V0O1xyXG5cdFx0Y29uc3QgdHlwZSA9IHVuaWZvcm0uZ2V0VHlwZSgpO1xyXG5cclxuXHRcdGlmICggYVsgb2Zmc2V0IF0gIT09IHYgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBiID0gdGhpcy5fZ2V0QnVmZmVyRm9yVHlwZSggdHlwZSApO1xyXG5cclxuXHRcdFx0Ylsgb2Zmc2V0IF0gPSBhWyBvZmZzZXQgXSA9IHY7XHJcblx0XHRcdHVwZGF0ZWQgPSB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdXBkYXRlZDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIGEgZ2l2ZW4gVmVjdG9yMiB1bmlmb3JtLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyVW5pZm9ybX0gdW5pZm9ybSAtIFRoZSBWZWN0b3IyIHVuaWZvcm0uXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgdW5pZm9ybSBoYXMgYmVlbiB1cGRhdGVkIG9yIG5vdC5cclxuXHQgKi9cclxuXHR1cGRhdGVWZWN0b3IyKCB1bmlmb3JtICkge1xyXG5cclxuXHRcdGxldCB1cGRhdGVkID0gZmFsc2U7XHJcblxyXG5cdFx0Y29uc3QgYSA9IHRoaXMudmFsdWVzO1xyXG5cdFx0Y29uc3QgdiA9IHVuaWZvcm0uZ2V0VmFsdWUoKTtcclxuXHRcdGNvbnN0IG9mZnNldCA9IHVuaWZvcm0ub2Zmc2V0O1xyXG5cdFx0Y29uc3QgdHlwZSA9IHVuaWZvcm0uZ2V0VHlwZSgpO1xyXG5cclxuXHRcdGlmICggYVsgb2Zmc2V0ICsgMCBdICE9PSB2LnggfHwgYVsgb2Zmc2V0ICsgMSBdICE9PSB2LnkgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBiID0gdGhpcy5fZ2V0QnVmZmVyRm9yVHlwZSggdHlwZSApO1xyXG5cclxuXHRcdFx0Ylsgb2Zmc2V0ICsgMCBdID0gYVsgb2Zmc2V0ICsgMCBdID0gdi54O1xyXG5cdFx0XHRiWyBvZmZzZXQgKyAxIF0gPSBhWyBvZmZzZXQgKyAxIF0gPSB2Lnk7XHJcblxyXG5cdFx0XHR1cGRhdGVkID0gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHVwZGF0ZWQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyBhIGdpdmVuIFZlY3RvcjMgdW5pZm9ybS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yM1VuaWZvcm19IHVuaWZvcm0gLSBUaGUgVmVjdG9yMyB1bmlmb3JtLlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHVuaWZvcm0gaGFzIGJlZW4gdXBkYXRlZCBvciBub3QuXHJcblx0ICovXHJcblx0dXBkYXRlVmVjdG9yMyggdW5pZm9ybSApIHtcclxuXHJcblx0XHRsZXQgdXBkYXRlZCA9IGZhbHNlO1xyXG5cclxuXHRcdGNvbnN0IGEgPSB0aGlzLnZhbHVlcztcclxuXHRcdGNvbnN0IHYgPSB1bmlmb3JtLmdldFZhbHVlKCk7XHJcblx0XHRjb25zdCBvZmZzZXQgPSB1bmlmb3JtLm9mZnNldDtcclxuXHRcdGNvbnN0IHR5cGUgPSB1bmlmb3JtLmdldFR5cGUoKTtcclxuXHJcblx0XHRpZiAoIGFbIG9mZnNldCArIDAgXSAhPT0gdi54IHx8IGFbIG9mZnNldCArIDEgXSAhPT0gdi55IHx8IGFbIG9mZnNldCArIDIgXSAhPT0gdi56ICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYiA9IHRoaXMuX2dldEJ1ZmZlckZvclR5cGUoIHR5cGUgKTtcclxuXHJcblx0XHRcdGJbIG9mZnNldCArIDAgXSA9IGFbIG9mZnNldCArIDAgXSA9IHYueDtcclxuXHRcdFx0Ylsgb2Zmc2V0ICsgMSBdID0gYVsgb2Zmc2V0ICsgMSBdID0gdi55O1xyXG5cdFx0XHRiWyBvZmZzZXQgKyAyIF0gPSBhWyBvZmZzZXQgKyAyIF0gPSB2Lno7XHJcblxyXG5cdFx0XHR1cGRhdGVkID0gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHVwZGF0ZWQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyBhIGdpdmVuIFZlY3RvcjQgdW5pZm9ybS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yNFVuaWZvcm19IHVuaWZvcm0gLSBUaGUgVmVjdG9yNCB1bmlmb3JtLlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHVuaWZvcm0gaGFzIGJlZW4gdXBkYXRlZCBvciBub3QuXHJcblx0ICovXHJcblx0dXBkYXRlVmVjdG9yNCggdW5pZm9ybSApIHtcclxuXHJcblx0XHRsZXQgdXBkYXRlZCA9IGZhbHNlO1xyXG5cclxuXHRcdGNvbnN0IGEgPSB0aGlzLnZhbHVlcztcclxuXHRcdGNvbnN0IHYgPSB1bmlmb3JtLmdldFZhbHVlKCk7XHJcblx0XHRjb25zdCBvZmZzZXQgPSB1bmlmb3JtLm9mZnNldDtcclxuXHRcdGNvbnN0IHR5cGUgPSB1bmlmb3JtLmdldFR5cGUoKTtcclxuXHJcblx0XHRpZiAoIGFbIG9mZnNldCArIDAgXSAhPT0gdi54IHx8IGFbIG9mZnNldCArIDEgXSAhPT0gdi55IHx8IGFbIG9mZnNldCArIDIgXSAhPT0gdi56IHx8IGFbIG9mZnNldCArIDQgXSAhPT0gdi53ICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYiA9IHRoaXMuX2dldEJ1ZmZlckZvclR5cGUoIHR5cGUgKTtcclxuXHJcblx0XHRcdGJbIG9mZnNldCArIDAgXSA9IGFbIG9mZnNldCArIDAgXSA9IHYueDtcclxuXHRcdFx0Ylsgb2Zmc2V0ICsgMSBdID0gYVsgb2Zmc2V0ICsgMSBdID0gdi55O1xyXG5cdFx0XHRiWyBvZmZzZXQgKyAyIF0gPSBhWyBvZmZzZXQgKyAyIF0gPSB2Lno7XHJcblx0XHRcdGJbIG9mZnNldCArIDMgXSA9IGFbIG9mZnNldCArIDMgXSA9IHYudztcclxuXHJcblx0XHRcdHVwZGF0ZWQgPSB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdXBkYXRlZDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIGEgZ2l2ZW4gQ29sb3IgdW5pZm9ybS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Q29sb3JVbmlmb3JtfSB1bmlmb3JtIC0gVGhlIENvbG9yIHVuaWZvcm0uXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgdW5pZm9ybSBoYXMgYmVlbiB1cGRhdGVkIG9yIG5vdC5cclxuXHQgKi9cclxuXHR1cGRhdGVDb2xvciggdW5pZm9ybSApIHtcclxuXHJcblx0XHRsZXQgdXBkYXRlZCA9IGZhbHNlO1xyXG5cclxuXHRcdGNvbnN0IGEgPSB0aGlzLnZhbHVlcztcclxuXHRcdGNvbnN0IGMgPSB1bmlmb3JtLmdldFZhbHVlKCk7XHJcblx0XHRjb25zdCBvZmZzZXQgPSB1bmlmb3JtLm9mZnNldDtcclxuXHJcblx0XHRpZiAoIGFbIG9mZnNldCArIDAgXSAhPT0gYy5yIHx8IGFbIG9mZnNldCArIDEgXSAhPT0gYy5nIHx8IGFbIG9mZnNldCArIDIgXSAhPT0gYy5iICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYiA9IHRoaXMuYnVmZmVyO1xyXG5cclxuXHRcdFx0Ylsgb2Zmc2V0ICsgMCBdID0gYVsgb2Zmc2V0ICsgMCBdID0gYy5yO1xyXG5cdFx0XHRiWyBvZmZzZXQgKyAxIF0gPSBhWyBvZmZzZXQgKyAxIF0gPSBjLmc7XHJcblx0XHRcdGJbIG9mZnNldCArIDIgXSA9IGFbIG9mZnNldCArIDIgXSA9IGMuYjtcclxuXHJcblx0XHRcdHVwZGF0ZWQgPSB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdXBkYXRlZDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIGEgZ2l2ZW4gTWF0cml4MyB1bmlmb3JtLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtNYXRyaXgzVW5pZm9ybX0gdW5pZm9ybSAtIFRoZSBNYXRyaXgzIHVuaWZvcm0uXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgdW5pZm9ybSBoYXMgYmVlbiB1cGRhdGVkIG9yIG5vdC5cclxuXHQgKi9cclxuXHR1cGRhdGVNYXRyaXgzKCB1bmlmb3JtICkge1xyXG5cclxuXHRcdGxldCB1cGRhdGVkID0gZmFsc2U7XHJcblxyXG5cdFx0Y29uc3QgYSA9IHRoaXMudmFsdWVzO1xyXG5cdFx0Y29uc3QgZSA9IHVuaWZvcm0uZ2V0VmFsdWUoKS5lbGVtZW50cztcclxuXHRcdGNvbnN0IG9mZnNldCA9IHVuaWZvcm0ub2Zmc2V0O1xyXG5cclxuXHRcdGlmICggYVsgb2Zmc2V0ICsgMCBdICE9PSBlWyAwIF0gfHwgYVsgb2Zmc2V0ICsgMSBdICE9PSBlWyAxIF0gfHwgYVsgb2Zmc2V0ICsgMiBdICE9PSBlWyAyIF0gfHxcclxuXHRcdFx0YVsgb2Zmc2V0ICsgNCBdICE9PSBlWyAzIF0gfHwgYVsgb2Zmc2V0ICsgNSBdICE9PSBlWyA0IF0gfHwgYVsgb2Zmc2V0ICsgNiBdICE9PSBlWyA1IF0gfHxcclxuXHRcdFx0YVsgb2Zmc2V0ICsgOCBdICE9PSBlWyA2IF0gfHwgYVsgb2Zmc2V0ICsgOSBdICE9PSBlWyA3IF0gfHwgYVsgb2Zmc2V0ICsgMTAgXSAhPT0gZVsgOCBdICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYiA9IHRoaXMuYnVmZmVyO1xyXG5cclxuXHRcdFx0Ylsgb2Zmc2V0ICsgMCBdID0gYVsgb2Zmc2V0ICsgMCBdID0gZVsgMCBdO1xyXG5cdFx0XHRiWyBvZmZzZXQgKyAxIF0gPSBhWyBvZmZzZXQgKyAxIF0gPSBlWyAxIF07XHJcblx0XHRcdGJbIG9mZnNldCArIDIgXSA9IGFbIG9mZnNldCArIDIgXSA9IGVbIDIgXTtcclxuXHRcdFx0Ylsgb2Zmc2V0ICsgNCBdID0gYVsgb2Zmc2V0ICsgNCBdID0gZVsgMyBdO1xyXG5cdFx0XHRiWyBvZmZzZXQgKyA1IF0gPSBhWyBvZmZzZXQgKyA1IF0gPSBlWyA0IF07XHJcblx0XHRcdGJbIG9mZnNldCArIDYgXSA9IGFbIG9mZnNldCArIDYgXSA9IGVbIDUgXTtcclxuXHRcdFx0Ylsgb2Zmc2V0ICsgOCBdID0gYVsgb2Zmc2V0ICsgOCBdID0gZVsgNiBdO1xyXG5cdFx0XHRiWyBvZmZzZXQgKyA5IF0gPSBhWyBvZmZzZXQgKyA5IF0gPSBlWyA3IF07XHJcblx0XHRcdGJbIG9mZnNldCArIDEwIF0gPSBhWyBvZmZzZXQgKyAxMCBdID0gZVsgOCBdO1xyXG5cclxuXHRcdFx0dXBkYXRlZCA9IHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB1cGRhdGVkO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgYSBnaXZlbiBNYXRyaXg0IHVuaWZvcm0uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdHJpeDRVbmlmb3JtfSB1bmlmb3JtIC0gVGhlIE1hdHJpeDQgdW5pZm9ybS5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSB1bmlmb3JtIGhhcyBiZWVuIHVwZGF0ZWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdHVwZGF0ZU1hdHJpeDQoIHVuaWZvcm0gKSB7XHJcblxyXG5cdFx0bGV0IHVwZGF0ZWQgPSBmYWxzZTtcclxuXHJcblx0XHRjb25zdCBhID0gdGhpcy52YWx1ZXM7XHJcblx0XHRjb25zdCBlID0gdW5pZm9ybS5nZXRWYWx1ZSgpLmVsZW1lbnRzO1xyXG5cdFx0Y29uc3Qgb2Zmc2V0ID0gdW5pZm9ybS5vZmZzZXQ7XHJcblxyXG5cdFx0aWYgKCBhcnJheXNFcXVhbCggYSwgZSwgb2Zmc2V0ICkgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYiA9IHRoaXMuYnVmZmVyO1xyXG5cdFx0XHRiLnNldCggZSwgb2Zmc2V0ICk7XHJcblx0XHRcdHNldEFycmF5KCBhLCBlLCBvZmZzZXQgKTtcclxuXHRcdFx0dXBkYXRlZCA9IHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB1cGRhdGVkO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSB0eXBlZCBhcnJheSB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIGRhdGEgdHlwZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIGRhdGEgdHlwZS5cclxuXHQgKiBAcmV0dXJuIHtUeXBlZEFycmF5fSBUaGUgdHlwZWQgYXJyYXkuXHJcblx0ICovXHJcblx0X2dldEJ1ZmZlckZvclR5cGUoIHR5cGUgKSB7XHJcblxyXG5cdFx0aWYgKCB0eXBlID09PSAnaW50JyB8fCB0eXBlID09PSAnaXZlYzInIHx8IHR5cGUgPT09ICdpdmVjMycgfHwgdHlwZSA9PT0gJ2l2ZWM0JyApIHJldHVybiBuZXcgSW50MzJBcnJheSggdGhpcy5idWZmZXIuYnVmZmVyICk7XHJcblx0XHRpZiAoIHR5cGUgPT09ICd1aW50JyB8fCB0eXBlID09PSAndXZlYzInIHx8IHR5cGUgPT09ICd1dmVjMycgfHwgdHlwZSA9PT0gJ3V2ZWM0JyApIHJldHVybiBuZXcgVWludDMyQXJyYXkoIHRoaXMuYnVmZmVyLmJ1ZmZlciApO1xyXG5cdFx0cmV0dXJuIHRoaXMuYnVmZmVyO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogU2V0cyB0aGUgdmFsdWVzIG9mIHRoZSBzZWNvbmQgYXJyYXkgdG8gdGhlIGZpcnN0IGFycmF5LlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAcGFyYW0ge1R5cGVkQXJyYXl9IGEgLSBUaGUgZmlyc3QgYXJyYXkuXHJcbiAqIEBwYXJhbSB7VHlwZWRBcnJheX0gYiAtIFRoZSBzZWNvbmQgYXJyYXkuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBvZmZzZXQgLSBBbiBpbmRleCBvZmZzZXQgZm9yIHRoZSBmaXJzdCBhcnJheS5cclxuICovXHJcbmZ1bmN0aW9uIHNldEFycmF5KCBhLCBiLCBvZmZzZXQgKSB7XHJcblxyXG5cdGZvciAoIGxldCBpID0gMCwgbCA9IGIubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRhWyBvZmZzZXQgKyBpIF0gPSBiWyBpIF07XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gYXJyYXlzIGFyZSBlcXVhbC5cclxuICpcclxuICogQHByaXZhdGVcclxuICogQHBhcmFtIHtUeXBlZEFycmF5fSBhIC0gVGhlIGZpcnN0IGFycmF5LlxyXG4gKiBAcGFyYW0ge1R5cGVkQXJyYXl9IGIgLSBUaGUgc2Vjb25kIGFycmF5LlxyXG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0IC0gQW4gaW5kZXggb2Zmc2V0IGZvciB0aGUgZmlyc3QgYXJyYXkuXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGdpdmVuIGFycmF5cyBhcmUgZXF1YWwgb3Igbm90LlxyXG4gKi9cclxuZnVuY3Rpb24gYXJyYXlzRXF1YWwoIGEsIGIsIG9mZnNldCApIHtcclxuXHJcblx0Zm9yICggbGV0IGkgPSAwLCBsID0gYi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdGlmICggYVsgb2Zmc2V0ICsgaSBdICE9PSBiWyBpIF0gKSByZXR1cm4gZmFsc2U7XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIHRydWU7XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBVbmlmb3Jtc0dyb3VwO1xyXG4iLCJpbXBvcnQgVW5pZm9ybXNHcm91cCBmcm9tICcuLi9Vbmlmb3Jtc0dyb3VwLmpzJztcclxuXHJcbmxldCBfaWQgPSAwO1xyXG5cclxuLyoqXHJcbiAqIEEgc3BlY2lhbCBmb3JtIG9mIHVuaWZvcm1zIGdyb3VwIHRoYXQgcmVwcmVzZW50c1xyXG4gKiB0aGUgaW5kaXZpZHVhbCB1bmlmb3JtcyBhcyBub2RlLWJhc2VkIHVuaWZvcm1zLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAYXVnbWVudHMgVW5pZm9ybXNHcm91cFxyXG4gKi9cclxuY2xhc3MgTm9kZVVuaWZvcm1zR3JvdXAgZXh0ZW5kcyBVbmlmb3Jtc0dyb3VwIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBub2RlLWJhc2VkIHVuaWZvcm1zIGdyb3VwLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgZ3JvdXAncyBuYW1lLlxyXG5cdCAqIEBwYXJhbSB7VW5pZm9ybUdyb3VwTm9kZX0gZ3JvdXBOb2RlIC0gVGhlIHVuaWZvcm0gZ3JvdXAgbm9kZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbmFtZSwgZ3JvdXBOb2RlICkge1xyXG5cclxuXHRcdHN1cGVyKCBuYW1lICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZ3JvdXAncyBJRC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlkID0gX2lkICsrO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHVuaWZvcm0gZ3JvdXAgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VW5pZm9ybUdyb3VwTm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ncm91cE5vZGUgPSBncm91cE5vZGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzTm9kZVVuaWZvcm1zR3JvdXAgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBOb2RlVW5pZm9ybXNHcm91cDtcclxuIiwiaW1wb3J0IEJpbmRpbmcgZnJvbSAnLi9CaW5kaW5nLmpzJztcclxuXHJcbmxldCBfaWQgPSAwO1xyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgYSBzYW1wbGVkIHRleHR1cmUgYmluZGluZyB0eXBlLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAYXVnbWVudHMgQmluZGluZ1xyXG4gKi9cclxuY2xhc3MgU2FtcGxlZFRleHR1cmUgZXh0ZW5kcyBCaW5kaW5nIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBzYW1wbGVkIHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBzYW1wbGVkIHRleHR1cmUncyBuYW1lLlxyXG5cdCAqIEBwYXJhbSB7P1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZSB0aGlzIGJpbmRpbmcgaXMgcmVmZXJyaW5nIHRvLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBuYW1lLCB0ZXh0dXJlICkge1xyXG5cclxuXHRcdHN1cGVyKCBuYW1lICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGlkZW50aWZpZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pZCA9IF9pZCArKztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB0ZXh0dXJlIHRoaXMgYmluZGluZyBpcyByZWZlcnJpbmcgdG8uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRleHR1cmUgPSB0ZXh0dXJlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGJpbmRpbmcncyB2ZXJzaW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudmVyc2lvbiA9IHRleHR1cmUgPyB0ZXh0dXJlLnZlcnNpb24gOiAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0aGUgdGV4dHVyZSBpcyBhIHN0b3JhZ2UgdGV4dHVyZSBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnN0b3JlID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYmluZGluZydzIGdlbmVyYXRpb24gd2hpY2ggaXMgYW4gYWRkaXRpb25hbCB2ZXJzaW9uXHJcblx0XHQgKiBxdWFsaWZpZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9udW1iZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ2VuZXJhdGlvbiA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzU2FtcGxlZFRleHR1cmUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIHdoZXRoZXIgdGhpcyBiaW5kaW5nIHJlcXVpcmVzIGFuIHVwZGF0ZSBmb3IgdGhlXHJcblx0ICogZ2l2ZW4gZ2VuZXJhdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBnZW5lcmF0aW9uIC0gVGhlIGdlbmVyYXRpb24uXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciBhbiB1cGRhdGUgaXMgcmVxdWlyZWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdG5lZWRzQmluZGluZ3NVcGRhdGUoIGdlbmVyYXRpb24gKSB7XHJcblxyXG5cdFx0Y29uc3QgeyB0ZXh0dXJlIH0gPSB0aGlzO1xyXG5cclxuXHRcdGlmICggZ2VuZXJhdGlvbiAhPT0gdGhpcy5nZW5lcmF0aW9uICkge1xyXG5cclxuXHRcdFx0dGhpcy5nZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjtcclxuXHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGV4dHVyZS5pc1ZpZGVvVGV4dHVyZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoZSBiaW5kaW5nLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgdGV4dHVyZSBoYXMgYmVlbiB1cGRhdGVkIGFuZCBtdXN0IGJlXHJcblx0ICogdXBsb2FkZWQgdG8gdGhlIEdQVS5cclxuXHQgKi9cclxuXHR1cGRhdGUoKSB7XHJcblxyXG5cdFx0Y29uc3QgeyB0ZXh0dXJlLCB2ZXJzaW9uIH0gPSB0aGlzO1xyXG5cclxuXHRcdGlmICggdmVyc2lvbiAhPT0gdGV4dHVyZS52ZXJzaW9uICkge1xyXG5cclxuXHRcdFx0dGhpcy52ZXJzaW9uID0gdGV4dHVyZS52ZXJzaW9uO1xyXG5cclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBmYWxzZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgYSBzYW1wbGVkIGFycmF5IHRleHR1cmUgYmluZGluZyB0eXBlLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAYXVnbWVudHMgU2FtcGxlZFRleHR1cmVcclxuICovXHJcbmNsYXNzIFNhbXBsZWRBcnJheVRleHR1cmUgZXh0ZW5kcyBTYW1wbGVkVGV4dHVyZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc2FtcGxlZCBhcnJheSB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgc2FtcGxlZCBhcnJheSB0ZXh0dXJlJ3MgbmFtZS5cclxuXHQgKiBAcGFyYW0gez8oRGF0YUFycmF5VGV4dHVyZXxDb21wcmVzc2VkQXJyYXlUZXh0dXJlKX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlIHRoaXMgYmluZGluZyBpcyByZWZlcnJpbmcgdG8uXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5hbWUsIHRleHR1cmUgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5hbWUsIHRleHR1cmUgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNTYW1wbGVkQXJyYXlUZXh0dXJlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgYSBzYW1wbGVkIDNEIHRleHR1cmUgYmluZGluZyB0eXBlLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAYXVnbWVudHMgU2FtcGxlZFRleHR1cmVcclxuICovXHJcbmNsYXNzIFNhbXBsZWQzRFRleHR1cmUgZXh0ZW5kcyBTYW1wbGVkVGV4dHVyZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc2FtcGxlZCAzRCB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgc2FtcGxlZCAzRCB0ZXh0dXJlJ3MgbmFtZS5cclxuXHQgKiBAcGFyYW0gez9EYXRhM0RUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUgdGhpcyBiaW5kaW5nIGlzIHJlZmVycmluZyB0by5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbmFtZSwgdGV4dHVyZSApIHtcclxuXHJcblx0XHRzdXBlciggbmFtZSwgdGV4dHVyZSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1NhbXBsZWQzRFRleHR1cmUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogUmVwcmVzZW50cyBhIHNhbXBsZWQgY3ViZSB0ZXh0dXJlIGJpbmRpbmcgdHlwZS5cclxuICpcclxuICogQHByaXZhdGVcclxuICogQGF1Z21lbnRzIFNhbXBsZWRUZXh0dXJlXHJcbiAqL1xyXG5jbGFzcyBTYW1wbGVkQ3ViZVRleHR1cmUgZXh0ZW5kcyBTYW1wbGVkVGV4dHVyZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc2FtcGxlZCBjdWJlIHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBzYW1wbGVkIGN1YmUgdGV4dHVyZSdzIG5hbWUuXHJcblx0ICogQHBhcmFtIHs/KEN1YmVUZXh0dXJlfENvbXByZXNzZWRDdWJlVGV4dHVyZSl9IHRleHR1cmUgLSBUaGUgdGV4dHVyZSB0aGlzIGJpbmRpbmcgaXMgcmVmZXJyaW5nIHRvLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBuYW1lLCB0ZXh0dXJlICkge1xyXG5cclxuXHRcdHN1cGVyKCBuYW1lLCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzU2FtcGxlZEN1YmVUZXh0dXJlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgU2FtcGxlZFRleHR1cmUsIFNhbXBsZWRBcnJheVRleHR1cmUsIFNhbXBsZWQzRFRleHR1cmUsIFNhbXBsZWRDdWJlVGV4dHVyZSB9O1xyXG4iLCJpbXBvcnQgeyBTYW1wbGVkVGV4dHVyZSB9IGZyb20gJy4uL1NhbXBsZWRUZXh0dXJlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIHNwZWNpYWwgZm9ybSBvZiBzYW1wbGVkIHRleHR1cmUgYmluZGluZyB0eXBlLlxyXG4gKiBJdCdzIHRleHR1cmUgdmFsdWUgaXMgbWFuYWdlZCBieSBhIG5vZGUgb2JqZWN0LlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAYXVnbWVudHMgU2FtcGxlZFRleHR1cmVcclxuICovXHJcbmNsYXNzIE5vZGVTYW1wbGVkVGV4dHVyZSBleHRlbmRzIFNhbXBsZWRUZXh0dXJlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBub2RlLWJhc2VkIHNhbXBsZWQgdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIHRleHR1cmVzJ3MgbmFtZS5cclxuXHQgKiBAcGFyYW0ge1RleHR1cmVOb2RlfSB0ZXh0dXJlTm9kZSAtIFRoZSB0ZXh0dXJlIG5vZGUuXHJcblx0ICogQHBhcmFtIHtVbmlmb3JtR3JvdXBOb2RlfSBncm91cE5vZGUgLSBUaGUgdW5pZm9ybSBncm91cCBub2RlLlxyXG5cdCAqIEBwYXJhbSB7P3N0cmluZ30gW2FjY2Vzcz1udWxsXSAtIFRoZSBhY2Nlc3MgdHlwZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbmFtZSwgdGV4dHVyZU5vZGUsIGdyb3VwTm9kZSwgYWNjZXNzID0gbnVsbCApIHtcclxuXHJcblx0XHRzdXBlciggbmFtZSwgdGV4dHVyZU5vZGUgPyB0ZXh0dXJlTm9kZS52YWx1ZSA6IG51bGwgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSB0ZXh0dXJlIG5vZGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1RleHR1cmVOb2RlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRleHR1cmVOb2RlID0gdGV4dHVyZU5vZGU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdW5pZm9ybSBncm91cCBub2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtVbmlmb3JtR3JvdXBOb2RlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdyb3VwTm9kZSA9IGdyb3VwTm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBhY2Nlc3MgdHlwZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P3N0cmluZ31cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hY2Nlc3MgPSBhY2Nlc3M7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogT3ZlcndyaXRlcyB0aGUgZGVmYXVsdCB0byBhZGRpdGlvbmFsbHkgY2hlY2sgaWYgdGhlIG5vZGUgdmFsdWUgaGFzIGNoYW5nZWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZ2VuZXJhdGlvbiAtIFRoZSBnZW5lcmF0aW9uLlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgYW4gdXBkYXRlIGlzIHJlcXVpcmVkIG9yIG5vdC5cclxuXHQgKi9cclxuXHRuZWVkc0JpbmRpbmdzVXBkYXRlKCBnZW5lcmF0aW9uICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnRleHR1cmVOb2RlLnZhbHVlICE9PSB0aGlzLnRleHR1cmUgfHwgc3VwZXIubmVlZHNCaW5kaW5nc1VwZGF0ZSggZ2VuZXJhdGlvbiApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIGJpbmRpbmcuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSB0ZXh0dXJlIGhhcyBiZWVuIHVwZGF0ZWQgYW5kIG11c3QgYmVcclxuXHQgKiB1cGxvYWRlZCB0byB0aGUgR1BVLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZSgpIHtcclxuXHJcblx0XHRjb25zdCB7IHRleHR1cmVOb2RlIH0gPSB0aGlzO1xyXG5cclxuXHRcdGlmICggdGhpcy50ZXh0dXJlICE9PSB0ZXh0dXJlTm9kZS52YWx1ZSApIHtcclxuXHJcblx0XHRcdHRoaXMudGV4dHVyZSA9IHRleHR1cmVOb2RlLnZhbHVlO1xyXG5cclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBzdXBlci51cGRhdGUoKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIEEgc3BlY2lhbCBmb3JtIG9mIHNhbXBsZWQgY3ViZSB0ZXh0dXJlIGJpbmRpbmcgdHlwZS5cclxuICogSXQncyB0ZXh0dXJlIHZhbHVlIGlzIG1hbmFnZWQgYnkgYSBub2RlIG9iamVjdC5cclxuICpcclxuICogQHByaXZhdGVcclxuICogQGF1Z21lbnRzIE5vZGVTYW1wbGVkVGV4dHVyZVxyXG4gKi9cclxuY2xhc3MgTm9kZVNhbXBsZWRDdWJlVGV4dHVyZSBleHRlbmRzIE5vZGVTYW1wbGVkVGV4dHVyZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbm9kZS1iYXNlZCBzYW1wbGVkIGN1YmUgdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIHRleHR1cmVzJ3MgbmFtZS5cclxuXHQgKiBAcGFyYW0ge1RleHR1cmVOb2RlfSB0ZXh0dXJlTm9kZSAtIFRoZSB0ZXh0dXJlIG5vZGUuXHJcblx0ICogQHBhcmFtIHtVbmlmb3JtR3JvdXBOb2RlfSBncm91cE5vZGUgLSBUaGUgdW5pZm9ybSBncm91cCBub2RlLlxyXG5cdCAqIEBwYXJhbSB7P3N0cmluZ30gW2FjY2Vzcz1udWxsXSAtIFRoZSBhY2Nlc3MgdHlwZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbmFtZSwgdGV4dHVyZU5vZGUsIGdyb3VwTm9kZSwgYWNjZXNzID0gbnVsbCApIHtcclxuXHJcblx0XHRzdXBlciggbmFtZSwgdGV4dHVyZU5vZGUsIGdyb3VwTm9kZSwgYWNjZXNzICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzU2FtcGxlZEN1YmVUZXh0dXJlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIEEgc3BlY2lhbCBmb3JtIG9mIHNhbXBsZWQgM0QgdGV4dHVyZSBiaW5kaW5nIHR5cGUuXHJcbiAqIEl0J3MgdGV4dHVyZSB2YWx1ZSBpcyBtYW5hZ2VkIGJ5IGEgbm9kZSBvYmplY3QuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBhdWdtZW50cyBOb2RlU2FtcGxlZFRleHR1cmVcclxuICovXHJcbmNsYXNzIE5vZGVTYW1wbGVkVGV4dHVyZTNEIGV4dGVuZHMgTm9kZVNhbXBsZWRUZXh0dXJlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBub2RlLWJhc2VkIHNhbXBsZWQgM0QgdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIHRleHR1cmVzJ3MgbmFtZS5cclxuXHQgKiBAcGFyYW0ge1RleHR1cmVOb2RlfSB0ZXh0dXJlTm9kZSAtIFRoZSB0ZXh0dXJlIG5vZGUuXHJcblx0ICogQHBhcmFtIHtVbmlmb3JtR3JvdXBOb2RlfSBncm91cE5vZGUgLSBUaGUgdW5pZm9ybSBncm91cCBub2RlLlxyXG5cdCAqIEBwYXJhbSB7P3N0cmluZ30gW2FjY2Vzcz1udWxsXSAtIFRoZSBhY2Nlc3MgdHlwZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbmFtZSwgdGV4dHVyZU5vZGUsIGdyb3VwTm9kZSwgYWNjZXNzID0gbnVsbCApIHtcclxuXHJcblx0XHRzdXBlciggbmFtZSwgdGV4dHVyZU5vZGUsIGdyb3VwTm9kZSwgYWNjZXNzICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzU2FtcGxlZFRleHR1cmUzRCA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IE5vZGVTYW1wbGVkVGV4dHVyZSwgTm9kZVNhbXBsZWRDdWJlVGV4dHVyZSwgTm9kZVNhbXBsZWRUZXh0dXJlM0QgfTtcclxuIiwiaW1wb3J0IHsgR0xTTE5vZGVQYXJzZXIsIE5vZGVCdWlsZGVyLCBUZXh0dXJlTm9kZSwgdmVjdG9yQ29tcG9uZW50cyB9IGZyb20gJy4uLy4uLy4uL25vZGVzL05vZGVzLmpzJztcclxuXHJcbmltcG9ydCBOb2RlVW5pZm9ybUJ1ZmZlciBmcm9tICcuLi8uLi9jb21tb24vbm9kZXMvTm9kZVVuaWZvcm1CdWZmZXIuanMnO1xyXG5pbXBvcnQgTm9kZVVuaWZvcm1zR3JvdXAgZnJvbSAnLi4vLi4vY29tbW9uL25vZGVzL05vZGVVbmlmb3Jtc0dyb3VwLmpzJztcclxuXHJcbmltcG9ydCB7IE5vZGVTYW1wbGVkVGV4dHVyZSwgTm9kZVNhbXBsZWRDdWJlVGV4dHVyZSwgTm9kZVNhbXBsZWRUZXh0dXJlM0QgfSBmcm9tICcuLi8uLi9jb21tb24vbm9kZXMvTm9kZVNhbXBsZWRUZXh0dXJlLmpzJztcclxuXHJcbmltcG9ydCB7IE5vQ29sb3JTcGFjZSwgQnl0ZVR5cGUsIFNob3J0VHlwZSwgUkdCQUludGVnZXJGb3JtYXQsIFJHQkludGVnZXJGb3JtYXQsIFJlZEludGVnZXJGb3JtYXQsIFJHSW50ZWdlckZvcm1hdCwgVW5zaWduZWRCeXRlVHlwZSwgVW5zaWduZWRJbnRUeXBlLCBVbnNpZ25lZFNob3J0VHlwZSwgUmVkRm9ybWF0LCBSR0Zvcm1hdCwgSW50VHlwZSwgUkdCRm9ybWF0LCBSR0JBRm9ybWF0LCBGbG9hdFR5cGUgfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBEYXRhVGV4dHVyZSB9IGZyb20gJy4uLy4uLy4uL3RleHR1cmVzL0RhdGFUZXh0dXJlLmpzJztcclxuXHJcbmNvbnN0IGdsc2xNZXRob2RzID0ge1xyXG5cdHRleHR1cmVEaW1lbnNpb25zOiAndGV4dHVyZVNpemUnLFxyXG5cdGVxdWFsczogJ2VxdWFsJ1xyXG59O1xyXG5cclxuY29uc3QgcHJlY2lzaW9uTGliID0ge1xyXG5cdGxvdzogJ2xvd3AnLFxyXG5cdG1lZGl1bTogJ21lZGl1bXAnLFxyXG5cdGhpZ2g6ICdoaWdocCdcclxufTtcclxuXHJcbmNvbnN0IHN1cHBvcnRzID0ge1xyXG5cdHN3aXp6bGVBc3NpZ246IHRydWUsXHJcblx0c3RvcmFnZUJ1ZmZlcjogZmFsc2VcclxufTtcclxuXHJcbmNvbnN0IGRlZmF1bHRQcmVjaXNpb25zID0gYFxyXG5wcmVjaXNpb24gaGlnaHAgZmxvYXQ7XHJcbnByZWNpc2lvbiBoaWdocCBpbnQ7XHJcbnByZWNpc2lvbiBoaWdocCBzYW1wbGVyMkQ7XHJcbnByZWNpc2lvbiBoaWdocCBzYW1wbGVyM0Q7XHJcbnByZWNpc2lvbiBoaWdocCBzYW1wbGVyQ3ViZTtcclxucHJlY2lzaW9uIGhpZ2hwIHNhbXBsZXIyREFycmF5O1xyXG5cclxucHJlY2lzaW9uIGhpZ2hwIHVzYW1wbGVyMkQ7XHJcbnByZWNpc2lvbiBoaWdocCB1c2FtcGxlcjNEO1xyXG5wcmVjaXNpb24gaGlnaHAgdXNhbXBsZXJDdWJlO1xyXG5wcmVjaXNpb24gaGlnaHAgdXNhbXBsZXIyREFycmF5O1xyXG5cclxucHJlY2lzaW9uIGhpZ2hwIGlzYW1wbGVyMkQ7XHJcbnByZWNpc2lvbiBoaWdocCBpc2FtcGxlcjNEO1xyXG5wcmVjaXNpb24gaGlnaHAgaXNhbXBsZXJDdWJlO1xyXG5wcmVjaXNpb24gaGlnaHAgaXNhbXBsZXIyREFycmF5O1xyXG5cclxucHJlY2lzaW9uIGxvd3Agc2FtcGxlcjJEU2hhZG93O1xyXG5gO1xyXG5cclxuLyoqXHJcbiAqIEEgbm9kZSBidWlsZGVyIHRhcmdldGluZyBHTFNMLlxyXG4gKlxyXG4gKiBUaGlzIG1vZHVsZSBnZW5lcmF0ZXMgR0xTTCBzaGFkZXIgY29kZSBmcm9tIG5vZGUgbWF0ZXJpYWxzIGFuZCBhbHNvXHJcbiAqIGdlbmVyYXRlcyB0aGUgcmVzcGVjdGl2ZSBiaW5kaW5ncyBhbmQgdmVydGV4IGJ1ZmZlciBkZWZpbml0aW9ucy4gVGhlc2VcclxuICogZGF0YSBhcmUgbGF0ZXIgdXNlZCBieSB0aGUgcmVuZGVyZXIgdG8gY3JlYXRlIHJlbmRlciBhbmQgY29tcHV0ZSBwaXBlbGluZXNcclxuICogZm9yIHJlbmRlciBvYmplY3RzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTm9kZUJ1aWxkZXJcclxuICovXHJcbmNsYXNzIEdMU0xOb2RlQnVpbGRlciBleHRlbmRzIE5vZGVCdWlsZGVyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBHTFNMIG5vZGUgYnVpbGRlciByZW5kZXJlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0M0R9IG9iamVjdCAtIFRoZSAzRCBvYmplY3QuXHJcblx0ICogQHBhcmFtIHtSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG9iamVjdCwgcmVuZGVyZXIgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG9iamVjdCwgcmVuZGVyZXIsIG5ldyBHTFNMTm9kZVBhcnNlcigpICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGRpY3Rpb25hcnkgaG9sZHMgZm9yIGVhY2ggc2hhZGVyIHN0YWdlICgndmVydGV4JywgJ2ZyYWdtZW50JywgJ2NvbXB1dGUnKVxyXG5cdFx0ICogYW5vdGhlciBkaWN0aW9uYXJ5IHdoaWNoIG1hbmFnZXMgVUJPcyBwZXIgZ3JvdXAgKCdyZW5kZXInLCdmcmFtZScsJ29iamVjdCcpLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLE9iamVjdDxzdHJpbmcsTm9kZVVuaWZvcm1zR3JvdXA+Pn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy51bmlmb3JtR3JvdXBzID0ge307XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBhcnJheSB0aGF0IGhvbGRzIG9iamVjdHMgZGVmaW5pbmcgdGhlIHZhcnlpbmcgYW5kIGF0dHJpYnV0ZSBkYXRhIGluXHJcblx0XHQgKiBjb250ZXh0IG9mIFRyYW5zZm9ybSBGZWVkYmFjay5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QXJyYXk8T2JqZWN0PHN0cmluZyxBdHRyaWJ1dGVOb2RlfHN0cmluZz4+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRyYW5zZm9ybXMgPSBbXTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgZGljdGlvbmFyeSB0aGF0IGhvbGRzIGZvciBlYWNoIHNoYWRlciBzdGFnZSBhIE1hcCBvZiB1c2VkIGV4dGVuc2lvbnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdDxzdHJpbmcsTWFwPHN0cmluZyxPYmplY3Q+Pn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5leHRlbnNpb25zID0ge307XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGRpY3Rpb25hcnkgdGhhdCBob2xkcyBmb3IgZWFjaCBzaGFkZXIgc3RhZ2UgYW4gQXJyYXkgb2YgdXNlZCBidWlsdGlucy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0PHN0cmluZyxBcnJheTxzdHJpbmc+Pn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5idWlsdGlucyA9IHsgdmVydGV4OiBbXSwgZnJhZ21lbnQ6IFtdLCBjb21wdXRlOiBbXSB9O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gdGV4dHVyZSByZXF1aXJlcyBhIG1hbnVhbCBjb252ZXJzaW9uIHRvIHRoZSB3b3JraW5nIGNvbG9yIHNwYWNlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUgdG8gY2hlY2suXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZ2l2ZW4gdGV4dHVyZSByZXF1aXJlcyBhIGNvbnZlcnNpb24gdG8gd29ya2luZyBjb2xvciBzcGFjZSBvciBub3QuXHJcblx0ICovXHJcblx0bmVlZHNUb1dvcmtpbmdDb2xvclNwYWNlKCB0ZXh0dXJlICkge1xyXG5cclxuXHRcdHJldHVybiB0ZXh0dXJlLmlzVmlkZW9UZXh0dXJlID09PSB0cnVlICYmIHRleHR1cmUuY29sb3JTcGFjZSAhPT0gTm9Db2xvclNwYWNlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIG5hdGl2ZSBzaGFkZXIgbWV0aG9kIG5hbWUgZm9yIGEgZ2l2ZW4gZ2VuZXJpYyBuYW1lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZCAtIFRoZSBtZXRob2QgbmFtZSB0byByZXNvbHZlLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHJlc29sdmVkIEdMU0wgbWV0aG9kIG5hbWUuXHJcblx0ICovXHJcblx0Z2V0TWV0aG9kKCBtZXRob2QgKSB7XHJcblxyXG5cdFx0cmV0dXJuIGdsc2xNZXRob2RzWyBtZXRob2QgXSB8fCBtZXRob2Q7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgb3V0cHV0IHN0cnVjdCBuYW1lLiBOb3QgcmVsZXZhbnQgZm9yIEdMU0wuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9XHJcblx0ICovXHJcblx0Z2V0T3V0cHV0U3RydWN0TmFtZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJyc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQnVpbGRzIHRoZSBnaXZlbiBzaGFkZXIgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7U2hhZGVyTm9kZUludGVybmFsfSBzaGFkZXJOb2RlIC0gVGhlIHNoYWRlciBub2RlLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIEdMU0wgZnVuY3Rpb24gY29kZS5cclxuXHQgKi9cclxuXHRidWlsZEZ1bmN0aW9uQ29kZSggc2hhZGVyTm9kZSApIHtcclxuXHJcblx0XHRjb25zdCBsYXlvdXQgPSBzaGFkZXJOb2RlLmxheW91dDtcclxuXHRcdGNvbnN0IGZsb3dEYXRhID0gdGhpcy5mbG93U2hhZGVyTm9kZSggc2hhZGVyTm9kZSApO1xyXG5cclxuXHRcdGNvbnN0IHBhcmFtZXRlcnMgPSBbXTtcclxuXHJcblx0XHRmb3IgKCBjb25zdCBpbnB1dCBvZiBsYXlvdXQuaW5wdXRzICkge1xyXG5cclxuXHRcdFx0cGFyYW1ldGVycy5wdXNoKCB0aGlzLmdldFR5cGUoIGlucHV0LnR5cGUgKSArICcgJyArIGlucHV0Lm5hbWUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCBjb2RlID0gYCR7IHRoaXMuZ2V0VHlwZSggbGF5b3V0LnR5cGUgKSB9ICR7IGxheW91dC5uYW1lIH0oICR7IHBhcmFtZXRlcnMuam9pbiggJywgJyApIH0gKSB7XHJcblxyXG5cdCR7IGZsb3dEYXRhLnZhcnMgfVxyXG5cclxuJHsgZmxvd0RhdGEuY29kZSB9XHJcblx0cmV0dXJuICR7IGZsb3dEYXRhLnJlc3VsdCB9O1xyXG5cclxufWA7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRyZXR1cm4gY29kZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXR1cHMgdGhlIFBpeGVsIEJ1ZmZlciBPYmplY3QgKFBCTykgZm9yIHRoZSBnaXZlbiBzdG9yYWdlXHJcblx0ICogYnVmZmVyIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1N0b3JhZ2VCdWZmZXJOb2RlfSBzdG9yYWdlQnVmZmVyTm9kZSAtIFRoZSBzdG9yYWdlIGJ1ZmZlciBub2RlLlxyXG5cdCAqL1xyXG5cdHNldHVwUEJPKCBzdG9yYWdlQnVmZmVyTm9kZSApIHtcclxuXHJcblx0XHRjb25zdCBhdHRyaWJ1dGUgPSBzdG9yYWdlQnVmZmVyTm9kZS52YWx1ZTtcclxuXHJcblx0XHRpZiAoIGF0dHJpYnV0ZS5wYm8gPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGNvbnN0IG9yaWdpbmFsQXJyYXkgPSBhdHRyaWJ1dGUuYXJyYXk7XHJcblx0XHRcdGNvbnN0IG51bUVsZW1lbnRzID0gYXR0cmlidXRlLmNvdW50ICogYXR0cmlidXRlLml0ZW1TaXplO1xyXG5cclxuXHRcdFx0Y29uc3QgeyBpdGVtU2l6ZSB9ID0gYXR0cmlidXRlO1xyXG5cclxuXHRcdFx0Y29uc3QgaXNJbnRlZ2VyID0gYXR0cmlidXRlLmFycmF5LmNvbnN0cnVjdG9yLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyggJ2ludCcgKTtcclxuXHJcblx0XHRcdGxldCBmb3JtYXQgPSBpc0ludGVnZXIgPyBSZWRJbnRlZ2VyRm9ybWF0IDogUmVkRm9ybWF0O1xyXG5cclxuXHRcdFx0aWYgKCBpdGVtU2l6ZSA9PT0gMiApIHtcclxuXHJcblx0XHRcdFx0Zm9ybWF0ID0gaXNJbnRlZ2VyID8gUkdJbnRlZ2VyRm9ybWF0IDogUkdGb3JtYXQ7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBpdGVtU2l6ZSA9PT0gMyApIHtcclxuXHJcblx0XHRcdFx0Zm9ybWF0ID0gaXNJbnRlZ2VyID8gUkdCSW50ZWdlckZvcm1hdCA6IFJHQkZvcm1hdDtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGl0ZW1TaXplID09PSA0ICkge1xyXG5cclxuXHRcdFx0XHRmb3JtYXQgPSBpc0ludGVnZXIgPyBSR0JBSW50ZWdlckZvcm1hdCA6IFJHQkFGb3JtYXQ7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCB0eXBlTWFwID0ge1xyXG5cdFx0XHRcdEZsb2F0MzJBcnJheTogRmxvYXRUeXBlLFxyXG5cdFx0XHRcdFVpbnQ4QXJyYXk6IFVuc2lnbmVkQnl0ZVR5cGUsXHJcblx0XHRcdFx0VWludDE2QXJyYXk6IFVuc2lnbmVkU2hvcnRUeXBlLFxyXG5cdFx0XHRcdFVpbnQzMkFycmF5OiBVbnNpZ25lZEludFR5cGUsXHJcblx0XHRcdFx0SW50OEFycmF5OiBCeXRlVHlwZSxcclxuXHRcdFx0XHRJbnQxNkFycmF5OiBTaG9ydFR5cGUsXHJcblx0XHRcdFx0SW50MzJBcnJheTogSW50VHlwZSxcclxuXHRcdFx0XHRVaW50OENsYW1wZWRBcnJheTogVW5zaWduZWRCeXRlVHlwZSxcclxuXHRcdFx0fTtcclxuXHJcblx0XHRcdGNvbnN0IHdpZHRoID0gTWF0aC5wb3coIDIsIE1hdGguY2VpbCggTWF0aC5sb2cyKCBNYXRoLnNxcnQoIG51bUVsZW1lbnRzIC8gaXRlbVNpemUgKSApICkgKTtcclxuXHRcdFx0bGV0IGhlaWdodCA9IE1hdGguY2VpbCggKCBudW1FbGVtZW50cyAvIGl0ZW1TaXplICkgLyB3aWR0aCApO1xyXG5cdFx0XHRpZiAoIHdpZHRoICogaGVpZ2h0ICogaXRlbVNpemUgPCBudW1FbGVtZW50cyApIGhlaWdodCArKzsgLy8gRW5zdXJlIGVub3VnaCBzcGFjZVxyXG5cclxuXHRcdFx0Y29uc3QgbmV3U2l6ZSA9IHdpZHRoICogaGVpZ2h0ICogaXRlbVNpemU7XHJcblxyXG5cdFx0XHRjb25zdCBuZXdBcnJheSA9IG5ldyBvcmlnaW5hbEFycmF5LmNvbnN0cnVjdG9yKCBuZXdTaXplICk7XHJcblxyXG5cdFx0XHRuZXdBcnJheS5zZXQoIG9yaWdpbmFsQXJyYXksIDAgKTtcclxuXHJcblx0XHRcdGF0dHJpYnV0ZS5hcnJheSA9IG5ld0FycmF5O1xyXG5cclxuXHRcdFx0Y29uc3QgcGJvVGV4dHVyZSA9IG5ldyBEYXRhVGV4dHVyZSggYXR0cmlidXRlLmFycmF5LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGVNYXBbIGF0dHJpYnV0ZS5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lIF0gfHwgRmxvYXRUeXBlICk7XHJcblx0XHRcdHBib1RleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cdFx0XHRwYm9UZXh0dXJlLmlzUEJPVGV4dHVyZSA9IHRydWU7XHJcblxyXG5cdFx0XHRjb25zdCBwYm8gPSBuZXcgVGV4dHVyZU5vZGUoIHBib1RleHR1cmUsIG51bGwsIG51bGwgKTtcclxuXHRcdFx0cGJvLnNldFByZWNpc2lvbiggJ2hpZ2gnICk7XHJcblxyXG5cdFx0XHRhdHRyaWJ1dGUucGJvTm9kZSA9IHBibztcclxuXHRcdFx0YXR0cmlidXRlLnBibyA9IHBiby52YWx1ZTtcclxuXHJcblx0XHRcdHRoaXMuZ2V0VW5pZm9ybUZyb21Ob2RlKCBhdHRyaWJ1dGUucGJvTm9kZSwgJ3RleHR1cmUnLCB0aGlzLnNoYWRlclN0YWdlLCB0aGlzLmNvbnRleHQubGFiZWwgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIEdMU0wgc25pcHBldCB0aGF0IHJlcHJlc2VudHMgdGhlIHByb3BlcnR5IG5hbWUgb2YgdGhlIGdpdmVuIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBUaGUgbm9kZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW3NoYWRlclN0YWdlPXRoaXMuc2hhZGVyU3RhZ2VdIC0gVGhlIHNoYWRlciBzdGFnZSB0aGlzIGNvZGUgc25pcHBldCBpcyBnZW5lcmF0ZWQgZm9yLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHByb3BlcnR5IG5hbWUuXHJcblx0ICovXHJcblx0Z2V0UHJvcGVydHlOYW1lKCBub2RlLCBzaGFkZXJTdGFnZSA9IHRoaXMuc2hhZGVyU3RhZ2UgKSB7XHJcblxyXG5cdFx0aWYgKCBub2RlLmlzTm9kZVVuaWZvcm0gJiYgbm9kZS5ub2RlLmlzVGV4dHVyZU5vZGUgIT09IHRydWUgJiYgbm9kZS5ub2RlLmlzQnVmZmVyTm9kZSAhPT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdHJldHVybiBzaGFkZXJTdGFnZS5jaGFyQXQoIDAgKSArICdfJyArIG5vZGUubmFtZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHN1cGVyLmdldFByb3BlcnR5TmFtZSggbm9kZSwgc2hhZGVyU3RhZ2UgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXR1cHMgdGhlIFBpeGVsIEJ1ZmZlciBPYmplY3QgKFBCTykgZm9yIHRoZSBnaXZlbiBzdG9yYWdlXHJcblx0ICogYnVmZmVyIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1N0b3JhZ2VBcnJheUVsZW1lbnROb2RlfSBzdG9yYWdlQXJyYXlFbGVtZW50Tm9kZSAtIFRoZSBzdG9yYWdlIGFycmF5IGVsZW1lbnQgbm9kZS5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBwcm9wZXJ0eSBuYW1lLlxyXG5cdCAqL1xyXG5cdGdlbmVyYXRlUEJPKCBzdG9yYWdlQXJyYXlFbGVtZW50Tm9kZSApIHtcclxuXHJcblx0XHRjb25zdCB7IG5vZGUsIGluZGV4Tm9kZSB9ID0gc3RvcmFnZUFycmF5RWxlbWVudE5vZGU7XHJcblx0XHRjb25zdCBhdHRyaWJ1dGUgPSBub2RlLnZhbHVlO1xyXG5cclxuXHRcdGlmICggdGhpcy5yZW5kZXJlci5iYWNrZW5kLmhhcyggYXR0cmlidXRlICkgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBhdHRyaWJ1dGVEYXRhID0gdGhpcy5yZW5kZXJlci5iYWNrZW5kLmdldCggYXR0cmlidXRlICk7XHJcblx0XHRcdGF0dHJpYnV0ZURhdGEucGJvID0gYXR0cmlidXRlLnBibztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3Qgbm9kZVVuaWZvcm0gPSB0aGlzLmdldFVuaWZvcm1Gcm9tTm9kZSggYXR0cmlidXRlLnBib05vZGUsICd0ZXh0dXJlJywgdGhpcy5zaGFkZXJTdGFnZSwgdGhpcy5jb250ZXh0LmxhYmVsICk7XHJcblx0XHRjb25zdCB0ZXh0dXJlTmFtZSA9IHRoaXMuZ2V0UHJvcGVydHlOYW1lKCBub2RlVW5pZm9ybSApO1xyXG5cclxuXHRcdHRoaXMuaW5jcmVhc2VVc2FnZSggaW5kZXhOb2RlICk7IC8vIGZvcmNlIGNhY2hlIGdlbmVyYXRlIHRvIGJlIHVzZWQgYXMgaW5kZXggaW4geCx5XHJcblx0XHRjb25zdCBpbmRleFNuaXBwZXQgPSBpbmRleE5vZGUuYnVpbGQoIHRoaXMsICd1aW50JyApO1xyXG5cclxuXHRcdGNvbnN0IGVsZW1lbnROb2RlRGF0YSA9IHRoaXMuZ2V0RGF0YUZyb21Ob2RlKCBzdG9yYWdlQXJyYXlFbGVtZW50Tm9kZSApO1xyXG5cclxuXHRcdGxldCBwcm9wZXJ0eU5hbWUgPSBlbGVtZW50Tm9kZURhdGEucHJvcGVydHlOYW1lO1xyXG5cclxuXHRcdGlmICggcHJvcGVydHlOYW1lID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHQvLyBwcm9wZXJ0eSBlbGVtZW50XHJcblxyXG5cdFx0XHRjb25zdCBub2RlVmFyID0gdGhpcy5nZXRWYXJGcm9tTm9kZSggc3RvcmFnZUFycmF5RWxlbWVudE5vZGUgKTtcclxuXHJcblx0XHRcdHByb3BlcnR5TmFtZSA9IHRoaXMuZ2V0UHJvcGVydHlOYW1lKCBub2RlVmFyICk7XHJcblxyXG5cdFx0XHQvLyBwcm9wZXJ0eSBzaXplXHJcblxyXG5cdFx0XHRjb25zdCBidWZmZXJOb2RlRGF0YSA9IHRoaXMuZ2V0RGF0YUZyb21Ob2RlKCBub2RlICk7XHJcblxyXG5cdFx0XHRsZXQgcHJvcGVydHlTaXplTmFtZSA9IGJ1ZmZlck5vZGVEYXRhLnByb3BlcnR5U2l6ZU5hbWU7XHJcblxyXG5cdFx0XHRpZiAoIHByb3BlcnR5U2l6ZU5hbWUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0cHJvcGVydHlTaXplTmFtZSA9IHByb3BlcnR5TmFtZSArICdTaXplJztcclxuXHJcblx0XHRcdFx0dGhpcy5nZXRWYXJGcm9tTm9kZSggbm9kZSwgcHJvcGVydHlTaXplTmFtZSwgJ3VpbnQnICk7XHJcblxyXG5cdFx0XHRcdHRoaXMuYWRkTGluZUZsb3dDb2RlKCBgJHsgcHJvcGVydHlTaXplTmFtZSB9ID0gdWludCggdGV4dHVyZVNpemUoICR7IHRleHR1cmVOYW1lIH0sIDAgKS54IClgLCBzdG9yYWdlQXJyYXlFbGVtZW50Tm9kZSApO1xyXG5cclxuXHRcdFx0XHRidWZmZXJOb2RlRGF0YS5wcm9wZXJ0eVNpemVOYW1lID0gcHJvcGVydHlTaXplTmFtZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vXHJcblxyXG5cdFx0XHRjb25zdCB7IGl0ZW1TaXplIH0gPSBhdHRyaWJ1dGU7XHJcblxyXG5cdFx0XHRjb25zdCBjaGFubmVsID0gJy4nICsgdmVjdG9yQ29tcG9uZW50cy5qb2luKCAnJyApLnNsaWNlKCAwLCBpdGVtU2l6ZSApO1xyXG5cdFx0XHRjb25zdCB1dlNuaXBwZXQgPSBgaXZlYzIoJHtpbmRleFNuaXBwZXR9ICUgJHsgcHJvcGVydHlTaXplTmFtZSB9LCAke2luZGV4U25pcHBldH0gLyAkeyBwcm9wZXJ0eVNpemVOYW1lIH0pYDtcclxuXHJcblx0XHRcdGNvbnN0IHNuaXBwZXQgPSB0aGlzLmdlbmVyYXRlVGV4dHVyZUxvYWQoIG51bGwsIHRleHR1cmVOYW1lLCB1dlNuaXBwZXQsIG51bGwsICcwJyApO1xyXG5cclxuXHRcdFx0Ly9cclxuXHJcblxyXG5cdFx0XHRsZXQgcHJlZml4ID0gJ3ZlYzQnO1xyXG5cclxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUucGJvLnR5cGUgPT09IFVuc2lnbmVkSW50VHlwZSApIHtcclxuXHJcblx0XHRcdFx0cHJlZml4ID0gJ3V2ZWM0JztcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGF0dHJpYnV0ZS5wYm8udHlwZSA9PT0gSW50VHlwZSApIHtcclxuXHJcblx0XHRcdFx0cHJlZml4ID0gJ2l2ZWM0JztcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuYWRkTGluZUZsb3dDb2RlKCBgJHsgcHJvcGVydHlOYW1lIH0gPSAke3ByZWZpeH0oJHsgc25pcHBldCB9KSR7Y2hhbm5lbH1gLCBzdG9yYWdlQXJyYXlFbGVtZW50Tm9kZSApO1xyXG5cclxuXHRcdFx0ZWxlbWVudE5vZGVEYXRhLnByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHByb3BlcnR5TmFtZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZW5lcmF0ZXMgdGhlIEdMU0wgc25pcHBldCB0aGF0IHJlYWRzIGEgc2luZ2xlIHRleGVsIGZyb20gYSB0ZXh0dXJlIHdpdGhvdXQgc2FtcGxpbmcgb3IgZmlsdGVyaW5nLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHRleHR1cmVQcm9wZXJ0eSAtIFRoZSBuYW1lIG9mIHRoZSB0ZXh0dXJlIHVuaWZvcm0gaW4gdGhlIHNoYWRlci5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdXZJbmRleFNuaXBwZXQgLSBBIEdMU0wgc25pcHBldCB0aGF0IHJlcHJlc2VudHMgdGV4dHVyZSBjb29yZGluYXRlcyB1c2VkIGZvciBzYW1wbGluZy5cclxuXHQgKiBAcGFyYW0gez9zdHJpbmd9IGRlcHRoU25pcHBldCAtIEEgR0xTTCBzbmlwcGV0IHRoYXQgcmVwcmVzZW50cyB0aGUgMC1iYXNlZCB0ZXh0dXJlIGFycmF5IGluZGV4IHRvIHNhbXBsZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW2xldmVsU25pcHBldD0nMHUnXSAtIEEgR0xTTCBzbmlwcGV0IHRoYXQgcmVwcmVzZW50cyB0aGUgbWlwIGxldmVsLCB3aXRoIGxldmVsIDAgY29udGFpbmluZyBhIGZ1bGwgc2l6ZSB2ZXJzaW9uIG9mIHRoZSB0ZXh0dXJlLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIEdMU0wgc25pcHBldC5cclxuXHQgKi9cclxuXHRnZW5lcmF0ZVRleHR1cmVMb2FkKCB0ZXh0dXJlLCB0ZXh0dXJlUHJvcGVydHksIHV2SW5kZXhTbmlwcGV0LCBkZXB0aFNuaXBwZXQsIGxldmVsU25pcHBldCA9ICcwJyApIHtcclxuXHJcblx0XHRpZiAoIGRlcHRoU25pcHBldCApIHtcclxuXHJcblx0XHRcdHJldHVybiBgdGV4ZWxGZXRjaCggJHsgdGV4dHVyZVByb3BlcnR5IH0sIGl2ZWMzKCAkeyB1dkluZGV4U25pcHBldCB9LCAkeyBkZXB0aFNuaXBwZXQgfSApLCAkeyBsZXZlbFNuaXBwZXQgfSApYDtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0cmV0dXJuIGB0ZXhlbEZldGNoKCAkeyB0ZXh0dXJlUHJvcGVydHkgfSwgJHsgdXZJbmRleFNuaXBwZXQgfSwgJHsgbGV2ZWxTbmlwcGV0IH0gKWA7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyB0aGUgR0xTTCBzbmlwcGV0IGZvciBzYW1wbGluZy9sb2FkaW5nIHRoZSBnaXZlbiB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHRleHR1cmVQcm9wZXJ0eSAtIFRoZSBuYW1lIG9mIHRoZSB0ZXh0dXJlIHVuaWZvcm0gaW4gdGhlIHNoYWRlci5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdXZTbmlwcGV0IC0gQSBHTFNMIHNuaXBwZXQgdGhhdCByZXByZXNlbnRzIHRleHR1cmUgY29vcmRpbmF0ZXMgdXNlZCBmb3Igc2FtcGxpbmcuXHJcblx0ICogQHBhcmFtIHs/c3RyaW5nfSBkZXB0aFNuaXBwZXQgLSAgQSBHTFNMIHNuaXBwZXQgdGhhdCByZXByZXNlbnRzIHRoZSAwLWJhc2VkIHRleHR1cmUgYXJyYXkgaW5kZXggdG8gc2FtcGxlLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIEdMU0wgc25pcHBldC5cclxuXHQgKi9cclxuXHRnZW5lcmF0ZVRleHR1cmUoIHRleHR1cmUsIHRleHR1cmVQcm9wZXJ0eSwgdXZTbmlwcGV0LCBkZXB0aFNuaXBwZXQgKSB7XHJcblxyXG5cdFx0aWYgKCB0ZXh0dXJlLmlzRGVwdGhUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIGB0ZXh0dXJlKCAkeyB0ZXh0dXJlUHJvcGVydHkgfSwgJHsgdXZTbmlwcGV0IH0gKS54YDtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0aWYgKCBkZXB0aFNuaXBwZXQgKSB1dlNuaXBwZXQgPSBgdmVjMyggJHsgdXZTbmlwcGV0IH0sICR7IGRlcHRoU25pcHBldCB9IClgO1xyXG5cclxuXHRcdFx0cmV0dXJuIGB0ZXh0dXJlKCAkeyB0ZXh0dXJlUHJvcGVydHkgfSwgJHsgdXZTbmlwcGV0IH0gKWA7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyB0aGUgR0xTTCBzbmlwcGV0IHdoZW4gc2FtcGxpbmcgdGV4dHVyZXMgd2l0aCBleHBsaWNpdCBtaXAgbGV2ZWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdGV4dHVyZVByb3BlcnR5IC0gVGhlIG5hbWUgb2YgdGhlIHRleHR1cmUgdW5pZm9ybSBpbiB0aGUgc2hhZGVyLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB1dlNuaXBwZXQgLSBBIEdMU0wgc25pcHBldCB0aGF0IHJlcHJlc2VudHMgdGV4dHVyZSBjb29yZGluYXRlcyB1c2VkIGZvciBzYW1wbGluZy5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbGV2ZWxTbmlwcGV0IC0gQSBHTFNMIHNuaXBwZXQgdGhhdCByZXByZXNlbnRzIHRoZSBtaXAgbGV2ZWwsIHdpdGggbGV2ZWwgMCBjb250YWluaW5nIGEgZnVsbCBzaXplIHZlcnNpb24gb2YgdGhlIHRleHR1cmUuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgR0xTTCBzbmlwcGV0LlxyXG5cdCAqL1xyXG5cdGdlbmVyYXRlVGV4dHVyZUxldmVsKCB0ZXh0dXJlLCB0ZXh0dXJlUHJvcGVydHksIHV2U25pcHBldCwgbGV2ZWxTbmlwcGV0ICkge1xyXG5cclxuXHRcdHJldHVybiBgdGV4dHVyZUxvZCggJHsgdGV4dHVyZVByb3BlcnR5IH0sICR7IHV2U25pcHBldCB9LCAkeyBsZXZlbFNuaXBwZXQgfSApYDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZW5lcmF0ZXMgdGhlIEdMU0wgc25pcHBldCB3aGVuIHNhbXBsaW5nIHRleHR1cmVzIHdpdGggYSBiaWFzIHRvIHRoZSBtaXAgbGV2ZWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdGV4dHVyZVByb3BlcnR5IC0gVGhlIG5hbWUgb2YgdGhlIHRleHR1cmUgdW5pZm9ybSBpbiB0aGUgc2hhZGVyLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB1dlNuaXBwZXQgLSBBIEdMU0wgc25pcHBldCB0aGF0IHJlcHJlc2VudHMgdGV4dHVyZSBjb29yZGluYXRlcyB1c2VkIGZvciBzYW1wbGluZy5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gYmlhc1NuaXBwZXQgLSBBIEdMU0wgc25pcHBldCB0aGF0IHJlcHJlc2VudHMgdGhlIGJpYXMgdG8gYXBwbHkgdG8gdGhlIG1pcCBsZXZlbCBiZWZvcmUgc2FtcGxpbmcuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgR0xTTCBzbmlwcGV0LlxyXG5cdCAqL1xyXG5cdGdlbmVyYXRlVGV4dHVyZUJpYXMoIHRleHR1cmUsIHRleHR1cmVQcm9wZXJ0eSwgdXZTbmlwcGV0LCBiaWFzU25pcHBldCApIHtcclxuXHJcblx0XHRyZXR1cm4gYHRleHR1cmUoICR7IHRleHR1cmVQcm9wZXJ0eSB9LCAkeyB1dlNuaXBwZXQgfSwgJHsgYmlhc1NuaXBwZXQgfSApYDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZW5lcmF0ZXMgdGhlIEdMU0wgc25pcHBldCBmb3Igc2FtcGxpbmcvbG9hZGluZyB0aGUgZ2l2ZW4gdGV4dHVyZSB1c2luZyBleHBsaWNpdCBncmFkaWVudHMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdGV4dHVyZVByb3BlcnR5IC0gVGhlIG5hbWUgb2YgdGhlIHRleHR1cmUgdW5pZm9ybSBpbiB0aGUgc2hhZGVyLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB1dlNuaXBwZXQgLSBBIEdMU0wgc25pcHBldCB0aGF0IHJlcHJlc2VudHMgdGV4dHVyZSBjb29yZGluYXRlcyB1c2VkIGZvciBzYW1wbGluZy5cclxuXHQgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGdyYWRTbmlwcGV0IC0gQW4gYXJyYXkgaG9sZGluZyBib3RoIGdyYWRpZW50IEdMU0wgc25pcHBldHMuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgR0xTTCBzbmlwcGV0LlxyXG5cdCAqL1xyXG5cdGdlbmVyYXRlVGV4dHVyZUdyYWQoIHRleHR1cmUsIHRleHR1cmVQcm9wZXJ0eSwgdXZTbmlwcGV0LCBncmFkU25pcHBldCApIHtcclxuXHJcblx0XHRyZXR1cm4gYHRleHR1cmVHcmFkKCAkeyB0ZXh0dXJlUHJvcGVydHkgfSwgJHsgdXZTbmlwcGV0IH0sICR7IGdyYWRTbmlwcGV0WyAwIF0gfSwgJHsgZ3JhZFNuaXBwZXRbIDEgXSB9IClgO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyB0aGUgR0xTTCBzbmlwcGV0IGZvciBzYW1wbGluZyBhIGRlcHRoIHRleHR1cmUgYW5kIGNvbXBhcmluZyB0aGUgc2FtcGxlZCBkZXB0aCB2YWx1ZXNcclxuXHQgKiBhZ2FpbnN0IGEgcmVmZXJlbmNlIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHRleHR1cmVQcm9wZXJ0eSAtIFRoZSBuYW1lIG9mIHRoZSB0ZXh0dXJlIHVuaWZvcm0gaW4gdGhlIHNoYWRlci5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdXZTbmlwcGV0IC0gQSBHTFNMIHNuaXBwZXQgdGhhdCByZXByZXNlbnRzIHRleHR1cmUgY29vcmRpbmF0ZXMgdXNlZCBmb3Igc2FtcGxpbmcuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGNvbXBhcmVTbmlwcGV0IC0gIEEgR0xTTCBzbmlwcGV0IHRoYXQgcmVwcmVzZW50cyB0aGUgcmVmZXJlbmNlIHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7P3N0cmluZ30gZGVwdGhTbmlwcGV0IC0gQSBHTFNMIHNuaXBwZXQgdGhhdCByZXByZXNlbnRzIDAtYmFzZWQgdGV4dHVyZSBhcnJheSBpbmRleCB0byBzYW1wbGUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtzaGFkZXJTdGFnZT10aGlzLnNoYWRlclN0YWdlXSAtIFRoZSBzaGFkZXIgc3RhZ2UgdGhpcyBjb2RlIHNuaXBwZXQgaXMgZ2VuZXJhdGVkIGZvci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBHTFNMIHNuaXBwZXQuXHJcblx0ICovXHJcblx0Z2VuZXJhdGVUZXh0dXJlQ29tcGFyZSggdGV4dHVyZSwgdGV4dHVyZVByb3BlcnR5LCB1dlNuaXBwZXQsIGNvbXBhcmVTbmlwcGV0LCBkZXB0aFNuaXBwZXQsIHNoYWRlclN0YWdlID0gdGhpcy5zaGFkZXJTdGFnZSApIHtcclxuXHJcblx0XHRpZiAoIHNoYWRlclN0YWdlID09PSAnZnJhZ21lbnQnICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIGB0ZXh0dXJlKCAkeyB0ZXh0dXJlUHJvcGVydHkgfSwgdmVjMyggJHsgdXZTbmlwcGV0IH0sICR7IGNvbXBhcmVTbmlwcGV0IH0gKSApYDtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc29sZS5lcnJvciggYFdlYkdQVVJlbmRlcmVyOiBUSFJFRS5EZXB0aFRleHR1cmUuY29tcGFyZUZ1bmN0aW9uKCkgZG9lcyBub3Qgc3VwcG9ydCAkeyBzaGFkZXJTdGFnZSB9IHNoYWRlci5gICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHZhcmlhYmxlcyBvZiB0aGUgZ2l2ZW4gc2hhZGVyIHN0YWdlIGFzIGEgR0xTTCBzdHJpbmcuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc2hhZGVyU3RhZ2UgLSBUaGUgc2hhZGVyIHN0YWdlLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIEdMU0wgc25pcHBldCB0aGF0IGRlZmluZXMgdGhlIHZhcmlhYmxlcy5cclxuXHQgKi9cclxuXHRnZXRWYXJzKCBzaGFkZXJTdGFnZSApIHtcclxuXHJcblx0XHRjb25zdCBzbmlwcGV0cyA9IFtdO1xyXG5cclxuXHRcdGNvbnN0IHZhcnMgPSB0aGlzLnZhcnNbIHNoYWRlclN0YWdlIF07XHJcblxyXG5cdFx0aWYgKCB2YXJzICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBjb25zdCB2YXJpYWJsZSBvZiB2YXJzICkge1xyXG5cclxuXHRcdFx0XHRzbmlwcGV0cy5wdXNoKCBgJHsgdGhpcy5nZXRWYXIoIHZhcmlhYmxlLnR5cGUsIHZhcmlhYmxlLm5hbWUsIHZhcmlhYmxlLmNvdW50ICkgfTtgICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBzbmlwcGV0cy5qb2luKCAnXFxuXFx0JyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHVuaWZvcm1zIG9mIHRoZSBnaXZlbiBzaGFkZXIgc3RhZ2UgYXMgYSBHTFNMIHN0cmluZy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzaGFkZXJTdGFnZSAtIFRoZSBzaGFkZXIgc3RhZ2UuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgR0xTTCBzbmlwcGV0IHRoYXQgZGVmaW5lcyB0aGUgdW5pZm9ybXMuXHJcblx0ICovXHJcblx0Z2V0VW5pZm9ybXMoIHNoYWRlclN0YWdlICkge1xyXG5cclxuXHRcdGNvbnN0IHVuaWZvcm1zID0gdGhpcy51bmlmb3Jtc1sgc2hhZGVyU3RhZ2UgXTtcclxuXHJcblx0XHRjb25zdCBiaW5kaW5nU25pcHBldHMgPSBbXTtcclxuXHRcdGNvbnN0IHVuaWZvcm1Hcm91cHMgPSB7fTtcclxuXHJcblx0XHRmb3IgKCBjb25zdCB1bmlmb3JtIG9mIHVuaWZvcm1zICkge1xyXG5cclxuXHRcdFx0bGV0IHNuaXBwZXQgPSBudWxsO1xyXG5cdFx0XHRsZXQgZ3JvdXAgPSBmYWxzZTtcclxuXHJcblx0XHRcdGlmICggdW5pZm9ybS50eXBlID09PSAndGV4dHVyZScgfHwgdW5pZm9ybS50eXBlID09PSAndGV4dHVyZTNEJyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgdGV4dHVyZSA9IHVuaWZvcm0ubm9kZS52YWx1ZTtcclxuXHJcblx0XHRcdFx0bGV0IHR5cGVQcmVmaXggPSAnJztcclxuXHJcblx0XHRcdFx0aWYgKCB0ZXh0dXJlLmlzRGF0YVRleHR1cmUgPT09IHRydWUgfHwgdGV4dHVyZS5pc0RhdGEzRFRleHR1cmUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCB0ZXh0dXJlLnR5cGUgPT09IFVuc2lnbmVkSW50VHlwZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdHR5cGVQcmVmaXggPSAndSc7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIGlmICggdGV4dHVyZS50eXBlID09PSBJbnRUeXBlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0dHlwZVByZWZpeCA9ICdpJztcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKCB1bmlmb3JtLnR5cGUgPT09ICd0ZXh0dXJlM0QnICkge1xyXG5cclxuXHRcdFx0XHRcdHNuaXBwZXQgPSBgJHt0eXBlUHJlZml4fXNhbXBsZXIzRCAkeyB1bmlmb3JtLm5hbWUgfTtgO1xyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCB0ZXh0dXJlLmNvbXBhcmVGdW5jdGlvbiApIHtcclxuXHJcblx0XHRcdFx0XHRzbmlwcGV0ID0gYHNhbXBsZXIyRFNoYWRvdyAkeyB1bmlmb3JtLm5hbWUgfTtgO1xyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCB0ZXh0dXJlLmlzRGF0YUFycmF5VGV4dHVyZSA9PT0gdHJ1ZSB8fCB0ZXh0dXJlLmlzQ29tcHJlc3NlZEFycmF5VGV4dHVyZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0XHRzbmlwcGV0ID0gYCR7dHlwZVByZWZpeH1zYW1wbGVyMkRBcnJheSAkeyB1bmlmb3JtLm5hbWUgfTtgO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdHNuaXBwZXQgPSBgJHt0eXBlUHJlZml4fXNhbXBsZXIyRCAkeyB1bmlmb3JtLm5hbWUgfTtgO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCB1bmlmb3JtLnR5cGUgPT09ICdjdWJlVGV4dHVyZScgKSB7XHJcblxyXG5cdFx0XHRcdHNuaXBwZXQgPSBgc2FtcGxlckN1YmUgJHsgdW5pZm9ybS5uYW1lIH07YDtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIHVuaWZvcm0udHlwZSA9PT0gJ2J1ZmZlcicgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGJ1ZmZlck5vZGUgPSB1bmlmb3JtLm5vZGU7XHJcblx0XHRcdFx0Y29uc3QgYnVmZmVyVHlwZSA9IHRoaXMuZ2V0VHlwZSggYnVmZmVyTm9kZS5idWZmZXJUeXBlICk7XHJcblx0XHRcdFx0Y29uc3QgYnVmZmVyQ291bnQgPSBidWZmZXJOb2RlLmJ1ZmZlckNvdW50O1xyXG5cclxuXHRcdFx0XHRjb25zdCBidWZmZXJDb3VudFNuaXBwZXQgPSBidWZmZXJDb3VudCA+IDAgPyBidWZmZXJDb3VudCA6ICcnO1xyXG5cdFx0XHRcdHNuaXBwZXQgPSBgJHtidWZmZXJOb2RlLm5hbWV9IHtcXG5cXHQkeyBidWZmZXJUeXBlIH0gJHsgdW5pZm9ybS5uYW1lIH1bJHsgYnVmZmVyQ291bnRTbmlwcGV0IH1dO1xcbn07XFxuYDtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHZlY3RvclR5cGUgPSB0aGlzLmdldFZlY3RvclR5cGUoIHVuaWZvcm0udHlwZSApO1xyXG5cclxuXHRcdFx0XHRzbmlwcGV0ID0gYCR7IHZlY3RvclR5cGUgfSAkeyB0aGlzLmdldFByb3BlcnR5TmFtZSggdW5pZm9ybSwgc2hhZGVyU3RhZ2UgKSB9O2A7XHJcblxyXG5cdFx0XHRcdGdyb3VwID0gdHJ1ZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IHByZWNpc2lvbiA9IHVuaWZvcm0ubm9kZS5wcmVjaXNpb247XHJcblxyXG5cdFx0XHRpZiAoIHByZWNpc2lvbiAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0c25pcHBldCA9IHByZWNpc2lvbkxpYlsgcHJlY2lzaW9uIF0gKyAnICcgKyBzbmlwcGV0O1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBncm91cCApIHtcclxuXHJcblx0XHRcdFx0c25pcHBldCA9ICdcXHQnICsgc25pcHBldDtcclxuXHJcblx0XHRcdFx0Y29uc3QgZ3JvdXBOYW1lID0gdW5pZm9ybS5ncm91cE5vZGUubmFtZTtcclxuXHRcdFx0XHRjb25zdCBncm91cFNuaXBwZXRzID0gdW5pZm9ybUdyb3Vwc1sgZ3JvdXBOYW1lIF0gfHwgKCB1bmlmb3JtR3JvdXBzWyBncm91cE5hbWUgXSA9IFtdICk7XHJcblxyXG5cdFx0XHRcdGdyb3VwU25pcHBldHMucHVzaCggc25pcHBldCApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0c25pcHBldCA9ICd1bmlmb3JtICcgKyBzbmlwcGV0O1xyXG5cclxuXHRcdFx0XHRiaW5kaW5nU25pcHBldHMucHVzaCggc25pcHBldCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRsZXQgb3V0cHV0ID0gJyc7XHJcblxyXG5cdFx0Zm9yICggY29uc3QgbmFtZSBpbiB1bmlmb3JtR3JvdXBzICkge1xyXG5cclxuXHRcdFx0Y29uc3QgZ3JvdXBTbmlwcGV0cyA9IHVuaWZvcm1Hcm91cHNbIG5hbWUgXTtcclxuXHJcblx0XHRcdG91dHB1dCArPSB0aGlzLl9nZXRHTFNMVW5pZm9ybVN0cnVjdCggc2hhZGVyU3RhZ2UgKyAnXycgKyBuYW1lLCBncm91cFNuaXBwZXRzLmpvaW4oICdcXG4nICkgKSArICdcXG4nO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRvdXRwdXQgKz0gYmluZGluZ1NuaXBwZXRzLmpvaW4oICdcXG4nICk7XHJcblxyXG5cdFx0cmV0dXJuIG91dHB1dDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSB0eXBlIGZvciBhIGdpdmVuIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0J1ZmZlckF0dHJpYnV0ZX0gYXR0cmlidXRlIC0gVGhlIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgdHlwZS5cclxuXHQgKi9cclxuXHRnZXRUeXBlRnJvbUF0dHJpYnV0ZSggYXR0cmlidXRlICkge1xyXG5cclxuXHRcdGxldCBub2RlVHlwZSA9IHN1cGVyLmdldFR5cGVGcm9tQXR0cmlidXRlKCBhdHRyaWJ1dGUgKTtcclxuXHJcblx0XHRpZiAoIC9eW2l1XS8udGVzdCggbm9kZVR5cGUgKSAmJiBhdHRyaWJ1dGUuZ3B1VHlwZSAhPT0gSW50VHlwZSApIHtcclxuXHJcblx0XHRcdGxldCBkYXRhQXR0cmlidXRlID0gYXR0cmlidXRlO1xyXG5cclxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApIGRhdGFBdHRyaWJ1dGUgPSBhdHRyaWJ1dGUuZGF0YTtcclxuXHJcblx0XHRcdGNvbnN0IGFycmF5ID0gZGF0YUF0dHJpYnV0ZS5hcnJheTtcclxuXHJcblx0XHRcdGlmICggKCBhcnJheSBpbnN0YW5jZW9mIFVpbnQzMkFycmF5IHx8IGFycmF5IGluc3RhbmNlb2YgSW50MzJBcnJheSApID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdFx0bm9kZVR5cGUgPSBub2RlVHlwZS5zbGljZSggMSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbm9kZVR5cGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgc2hhZGVyIGF0dHJpYnV0ZXMgb2YgdGhlIGdpdmVuIHNoYWRlciBzdGFnZSBhcyBhIEdMU0wgc3RyaW5nLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNoYWRlclN0YWdlIC0gVGhlIHNoYWRlciBzdGFnZS5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBHTFNMIHNuaXBwZXQgdGhhdCBkZWZpbmVzIHRoZSBzaGFkZXIgYXR0cmlidXRlcy5cclxuXHQgKi9cclxuXHRnZXRBdHRyaWJ1dGVzKCBzaGFkZXJTdGFnZSApIHtcclxuXHJcblx0XHRsZXQgc25pcHBldCA9ICcnO1xyXG5cclxuXHRcdGlmICggc2hhZGVyU3RhZ2UgPT09ICd2ZXJ0ZXgnIHx8IHNoYWRlclN0YWdlID09PSAnY29tcHV0ZScgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBhdHRyaWJ1dGVzID0gdGhpcy5nZXRBdHRyaWJ1dGVzQXJyYXkoKTtcclxuXHJcblx0XHRcdGxldCBsb2NhdGlvbiA9IDA7XHJcblxyXG5cdFx0XHRmb3IgKCBjb25zdCBhdHRyaWJ1dGUgb2YgYXR0cmlidXRlcyApIHtcclxuXHJcblx0XHRcdFx0c25pcHBldCArPSBgbGF5b3V0KCBsb2NhdGlvbiA9ICR7IGxvY2F0aW9uICsrIH0gKSBpbiAkeyBhdHRyaWJ1dGUudHlwZSB9ICR7IGF0dHJpYnV0ZS5uYW1lIH07XFxuYDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHNuaXBwZXQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgbWVtYmVycyBvZiB0aGUgZ2l2ZW4gc3RydWN0IHR5cGUgbm9kZSBhcyBhIEdMU0wgc3RyaW5nLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTdHJ1Y3RUeXBlTm9kZX0gc3RydWN0IC0gVGhlIHN0cnVjdCB0eXBlIG5vZGUuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgR0xTTCBzbmlwcGV0IHRoYXQgZGVmaW5lcyB0aGUgc3RydWN0IG1lbWJlcnMuXHJcblx0ICovXHJcblx0Z2V0U3RydWN0TWVtYmVycyggc3RydWN0ICkge1xyXG5cclxuXHRcdGNvbnN0IHNuaXBwZXRzID0gW107XHJcblxyXG5cdFx0Zm9yICggY29uc3QgbWVtYmVyIG9mIHN0cnVjdC5tZW1iZXJzICkge1xyXG5cclxuXHRcdFx0c25pcHBldHMucHVzaCggYFxcdCR7IG1lbWJlci50eXBlIH0gJHsgbWVtYmVyLm5hbWUgfTtgICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBzbmlwcGV0cy5qb2luKCAnXFxuJyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHN0cnVjdHMgb2YgdGhlIGdpdmVuIHNoYWRlciBzdGFnZSBhcyBhIEdMU0wgc3RyaW5nLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNoYWRlclN0YWdlIC0gVGhlIHNoYWRlciBzdGFnZS5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBHTFNMIHNuaXBwZXQgdGhhdCBkZWZpbmVzIHRoZSBzdHJ1Y3RzLlxyXG5cdCAqL1xyXG5cdGdldFN0cnVjdHMoIHNoYWRlclN0YWdlICkge1xyXG5cclxuXHRcdGNvbnN0IHNuaXBwZXRzID0gW107XHJcblx0XHRjb25zdCBzdHJ1Y3RzID0gdGhpcy5zdHJ1Y3RzWyBzaGFkZXJTdGFnZSBdO1xyXG5cclxuXHRcdGNvbnN0IG91dHB1dFNuaXBwZXQgPSBbXTtcclxuXHJcblx0XHRmb3IgKCBjb25zdCBzdHJ1Y3Qgb2Ygc3RydWN0cyApIHtcclxuXHJcblx0XHRcdGlmICggc3RydWN0Lm91dHB1dCApIHtcclxuXHJcblx0XHRcdFx0Zm9yICggY29uc3QgbWVtYmVyIG9mIHN0cnVjdC5tZW1iZXJzICkge1xyXG5cclxuXHRcdFx0XHRcdG91dHB1dFNuaXBwZXQucHVzaCggYGxheW91dCggbG9jYXRpb24gPSAkeyBtZW1iZXIuaW5kZXggfSApIG91dCAkeyBtZW1iZXIudHlwZSB9ICR7IG1lbWJlci5uYW1lIH07YCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRsZXQgc25pcHBldCA9ICdzdHJ1Y3QgJyArIHN0cnVjdC5uYW1lICsgJyB7XFxuJztcclxuXHRcdFx0XHRzbmlwcGV0ICs9IHRoaXMuZ2V0U3RydWN0TWVtYmVycyggc3RydWN0ICk7XHJcblx0XHRcdFx0c25pcHBldCArPSAnXFxufTtcXG4nO1xyXG5cclxuXHRcdFx0XHRzbmlwcGV0cy5wdXNoKCBzbmlwcGV0ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggb3V0cHV0U25pcHBldC5sZW5ndGggPT09IDAgKSB7XHJcblxyXG5cdFx0XHRvdXRwdXRTbmlwcGV0LnB1c2goICdsYXlvdXQoIGxvY2F0aW9uID0gMCApIG91dCB2ZWM0IGZyYWdDb2xvcjsnICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiAnXFxuJyArIG91dHB1dFNuaXBwZXQuam9pbiggJ1xcbicgKSArICdcXG5cXG4nICsgc25pcHBldHMuam9pbiggJ1xcbicgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSB2YXJ5aW5ncyBvZiB0aGUgZ2l2ZW4gc2hhZGVyIHN0YWdlIGFzIGEgR0xTTCBzdHJpbmcuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc2hhZGVyU3RhZ2UgLSBUaGUgc2hhZGVyIHN0YWdlLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIEdMU0wgc25pcHBldCB0aGF0IGRlZmluZXMgdGhlIHZhcnlpbmdzLlxyXG5cdCAqL1xyXG5cdGdldFZhcnlpbmdzKCBzaGFkZXJTdGFnZSApIHtcclxuXHJcblx0XHRsZXQgc25pcHBldCA9ICcnO1xyXG5cclxuXHRcdGNvbnN0IHZhcnlpbmdzID0gdGhpcy52YXJ5aW5ncztcclxuXHJcblx0XHRpZiAoIHNoYWRlclN0YWdlID09PSAndmVydGV4JyB8fCBzaGFkZXJTdGFnZSA9PT0gJ2NvbXB1dGUnICkge1xyXG5cclxuXHRcdFx0Zm9yICggY29uc3QgdmFyeWluZyBvZiB2YXJ5aW5ncyApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBzaGFkZXJTdGFnZSA9PT0gJ2NvbXB1dGUnICkgdmFyeWluZy5uZWVkc0ludGVycG9sYXRpb24gPSB0cnVlO1xyXG5cclxuXHRcdFx0XHRjb25zdCB0eXBlID0gdGhpcy5nZXRUeXBlKCB2YXJ5aW5nLnR5cGUgKTtcclxuXHJcblx0XHRcdFx0aWYgKCB2YXJ5aW5nLm5lZWRzSW50ZXJwb2xhdGlvbiApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBmbGF0ID0gdHlwZS5pbmNsdWRlcyggJ2ludCcgKSB8fCB0eXBlLmluY2x1ZGVzKCAndXYnICkgfHwgdHlwZS5pbmNsdWRlcyggJ2l2JyApID8gJ2ZsYXQgJyA6ICcnO1xyXG5cclxuXHRcdFx0XHRcdHNuaXBwZXQgKz0gYCR7ZmxhdH1vdXQgJHt0eXBlfSAke3ZhcnlpbmcubmFtZX07XFxuYDtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRzbmlwcGV0ICs9IGAke3R5cGV9ICR7dmFyeWluZy5uYW1lfTtcXG5gOyAvLyBnZW5lcmF0ZSB2YXJpYWJsZSAobm8gdmFyeWluZyByZXF1aXJlZClcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHNoYWRlclN0YWdlID09PSAnZnJhZ21lbnQnICkge1xyXG5cclxuXHRcdFx0Zm9yICggY29uc3QgdmFyeWluZyBvZiB2YXJ5aW5ncyApIHtcclxuXHJcblx0XHRcdFx0aWYgKCB2YXJ5aW5nLm5lZWRzSW50ZXJwb2xhdGlvbiApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCB0eXBlID0gdGhpcy5nZXRUeXBlKCB2YXJ5aW5nLnR5cGUgKTtcclxuXHRcdFx0XHRcdGNvbnN0IGZsYXQgPSB0eXBlLmluY2x1ZGVzKCAnaW50JyApIHx8IHR5cGUuaW5jbHVkZXMoICd1dicgKSB8fCB0eXBlLmluY2x1ZGVzKCAnaXYnICkgPyAnZmxhdCAnIDogJyc7XHJcblxyXG5cdFx0XHRcdFx0c25pcHBldCArPSBgJHtmbGF0fWluICR7dHlwZX0gJHt2YXJ5aW5nLm5hbWV9O1xcbmA7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Zm9yICggY29uc3QgYnVpbHRpbiBvZiB0aGlzLmJ1aWx0aW5zWyBzaGFkZXJTdGFnZSBdICkge1xyXG5cclxuXHRcdFx0c25pcHBldCArPSBgJHtidWlsdGlufTtcXG5gO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gc25pcHBldDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSB2ZXJ0ZXggaW5kZXggYnVpbHRpbi5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHZlcnRleCBpbmRleC5cclxuXHQgKi9cclxuXHRnZXRWZXJ0ZXhJbmRleCgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ3VpbnQoIGdsX1ZlcnRleElEICknO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGluc3RhbmNlIGluZGV4IGJ1aWx0aW4uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBpbnN0YW5jZSBpbmRleC5cclxuXHQgKi9cclxuXHRnZXRJbnN0YW5jZUluZGV4KCkge1xyXG5cclxuXHRcdHJldHVybiAndWludCggZ2xfSW5zdGFuY2VJRCApJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBpbnZvY2F0aW9uIGxvY2FsIGluZGV4IGJ1aWx0aW4uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBpbnZvY2F0aW9uIGxvY2FsIGluZGV4LlxyXG5cdCAqL1xyXG5cdGdldEludm9jYXRpb25Mb2NhbEluZGV4KCkge1xyXG5cclxuXHRcdGNvbnN0IHdvcmtncm91cFNpemUgPSB0aGlzLm9iamVjdC53b3JrZ3JvdXBTaXplO1xyXG5cclxuXHRcdGNvbnN0IHNpemUgPSB3b3JrZ3JvdXBTaXplLnJlZHVjZSggKCBhY2MsIGN1cnIgKSA9PiBhY2MgKiBjdXJyLCAxICk7XHJcblxyXG5cdFx0cmV0dXJuIGB1aW50KCBnbF9JbnN0YW5jZUlEICkgJSAke3NpemV9dWA7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgZHJhdyBpbmRleCBidWlsdGluLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7P3N0cmluZ30gVGhlIGRyYXdJbmRleCBzaGFkZXIgc3RyaW5nLiBSZXR1cm5zIGBudWxsYCBpZiBgV0VCR0xfbXVsdGlfZHJhd2AgaXNuJ3Qgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UuXHJcblx0ICovXHJcblx0Z2V0RHJhd0luZGV4KCkge1xyXG5cclxuXHRcdGNvbnN0IGV4dGVuc2lvbnMgPSB0aGlzLnJlbmRlcmVyLmJhY2tlbmQuZXh0ZW5zaW9ucztcclxuXHJcblx0XHRpZiAoIGV4dGVuc2lvbnMuaGFzKCAnV0VCR0xfbXVsdGlfZHJhdycgKSApIHtcclxuXHJcblx0XHRcdHJldHVybiAndWludCggZ2xfRHJhd0lEICknO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBmcm9udCBmYWNpbmcgYnVpbHRpbi5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGZyb250IGZhY2luZyBidWlsdGluLlxyXG5cdCAqL1xyXG5cdGdldEZyb250RmFjaW5nKCkge1xyXG5cclxuXHRcdHJldHVybiAnZ2xfRnJvbnRGYWNpbmcnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGZyYWcgY29vcmQgYnVpbHRpbi5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGZyYWcgY29vcmQgYnVpbHRpbi5cclxuXHQgKi9cclxuXHRnZXRGcmFnQ29vcmQoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdnbF9GcmFnQ29vcmQueHknO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGZyYWcgZGVwdGggYnVpbHRpbi5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGZyYWcgZGVwdGggYnVpbHRpbi5cclxuXHQgKi9cclxuXHRnZXRGcmFnRGVwdGgoKSB7XHJcblxyXG5cdFx0cmV0dXJuICdnbF9GcmFnRGVwdGgnO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEVuYWJsZXMgdGhlIGdpdmVuIGV4dGVuc2lvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIGV4dGVuc2lvbiBuYW1lLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBiZWhhdmlvciAtIFRoZSBleHRlbnNpb24gYmVoYXZpb3IuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtzaGFkZXJTdGFnZT10aGlzLnNoYWRlclN0YWdlXSAtIFRoZSBzaGFkZXIgc3RhZ2UuXHJcblx0ICovXHJcblx0ZW5hYmxlRXh0ZW5zaW9uKCBuYW1lLCBiZWhhdmlvciwgc2hhZGVyU3RhZ2UgPSB0aGlzLnNoYWRlclN0YWdlICkge1xyXG5cclxuXHRcdGNvbnN0IG1hcCA9IHRoaXMuZXh0ZW5zaW9uc1sgc2hhZGVyU3RhZ2UgXSB8fCAoIHRoaXMuZXh0ZW5zaW9uc1sgc2hhZGVyU3RhZ2UgXSA9IG5ldyBNYXAoKSApO1xyXG5cclxuXHRcdGlmICggbWFwLmhhcyggbmFtZSApID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdG1hcC5zZXQoIG5hbWUsIHtcclxuXHRcdFx0XHRuYW1lLFxyXG5cdFx0XHRcdGJlaGF2aW9yXHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgZW5hYmxlZCBleHRlbnNpb25zIG9mIHRoZSBnaXZlbiBzaGFkZXIgc3RhZ2UgYXMgYSBHTFNMIHN0cmluZy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzaGFkZXJTdGFnZSAtIFRoZSBzaGFkZXIgc3RhZ2UuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgR0xTTCBzbmlwcGV0IHRoYXQgZGVmaW5lcyB0aGUgZW5hYmxlZCBleHRlbnNpb25zLlxyXG5cdCAqL1xyXG5cdGdldEV4dGVuc2lvbnMoIHNoYWRlclN0YWdlICkge1xyXG5cclxuXHRcdGNvbnN0IHNuaXBwZXRzID0gW107XHJcblxyXG5cdFx0aWYgKCBzaGFkZXJTdGFnZSA9PT0gJ3ZlcnRleCcgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBleHQgPSB0aGlzLnJlbmRlcmVyLmJhY2tlbmQuZXh0ZW5zaW9ucztcclxuXHRcdFx0Y29uc3QgaXNCYXRjaGVkTWVzaCA9IHRoaXMub2JqZWN0LmlzQmF0Y2hlZE1lc2g7XHJcblxyXG5cdFx0XHRpZiAoIGlzQmF0Y2hlZE1lc2ggJiYgZXh0LmhhcyggJ1dFQkdMX211bHRpX2RyYXcnICkgKSB7XHJcblxyXG5cdFx0XHRcdHRoaXMuZW5hYmxlRXh0ZW5zaW9uKCAnR0xfQU5HTEVfbXVsdGlfZHJhdycsICdyZXF1aXJlJywgc2hhZGVyU3RhZ2UgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgZXh0ZW5zaW9ucyA9IHRoaXMuZXh0ZW5zaW9uc1sgc2hhZGVyU3RhZ2UgXTtcclxuXHJcblx0XHRpZiAoIGV4dGVuc2lvbnMgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGZvciAoIGNvbnN0IHsgbmFtZSwgYmVoYXZpb3IgfSBvZiBleHRlbnNpb25zLnZhbHVlcygpICkge1xyXG5cclxuXHRcdFx0XHRzbmlwcGV0cy5wdXNoKCBgI2V4dGVuc2lvbiAke25hbWV9IDogJHtiZWhhdmlvcn1gICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBzbmlwcGV0cy5qb2luKCAnXFxuJyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGNsaXAgZGlzdGFuY2VzIGJ1aWx0aW4uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBjbGlwIGRpc3RhbmNlcyBidWlsdGluLlxyXG5cdCAqL1xyXG5cdGdldENsaXBEaXN0YW5jZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ2dsX0NsaXBEaXN0YW5jZSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogV2hldGhlciB0aGUgcmVxdWVzdGVkIGZlYXR1cmUgaXMgYXZhaWxhYmxlIG9yIG5vdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIHJlcXVlc3RlZCBmZWF0dXJlLlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHJlcXVlc3RlZCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBvciBub3QuXHJcblx0ICovXHJcblx0aXNBdmFpbGFibGUoIG5hbWUgKSB7XHJcblxyXG5cdFx0bGV0IHJlc3VsdCA9IHN1cHBvcnRzWyBuYW1lIF07XHJcblxyXG5cdFx0aWYgKCByZXN1bHQgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGxldCBleHRlbnNpb25OYW1lO1xyXG5cclxuXHRcdFx0cmVzdWx0ID0gZmFsc2U7XHJcblxyXG5cdFx0XHRzd2l0Y2ggKCBuYW1lICkge1xyXG5cclxuXHRcdFx0XHRjYXNlICdmbG9hdDMyRmlsdGVyYWJsZSc6XHJcblx0XHRcdFx0XHRleHRlbnNpb25OYW1lID0gJ09FU190ZXh0dXJlX2Zsb2F0X2xpbmVhcic7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0Y2FzZSAnY2xpcERpc3RhbmNlJzpcclxuXHRcdFx0XHRcdGV4dGVuc2lvbk5hbWUgPSAnV0VCR0xfY2xpcF9jdWxsX2Rpc3RhbmNlJztcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBleHRlbnNpb25OYW1lICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGV4dGVuc2lvbnMgPSB0aGlzLnJlbmRlcmVyLmJhY2tlbmQuZXh0ZW5zaW9ucztcclxuXHJcblx0XHRcdFx0aWYgKCBleHRlbnNpb25zLmhhcyggZXh0ZW5zaW9uTmFtZSApICkge1xyXG5cclxuXHRcdFx0XHRcdGV4dGVuc2lvbnMuZ2V0KCBleHRlbnNpb25OYW1lICk7XHJcblx0XHRcdFx0XHRyZXN1bHQgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRzdXBwb3J0c1sgbmFtZSBdID0gcmVzdWx0O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdoZXRoZXIgdG8gZmxpcCB0ZXh0dXJlIGRhdGEgYWxvbmcgaXRzIHZlcnRpY2FsIGF4aXMgb3Igbm90LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyBhbHdheXMgYHRydWVgIGluIGNvbnRleHQgb2YgR0xTTC5cclxuXHQgKi9cclxuXHRpc0ZsaXBZKCkge1xyXG5cclxuXHRcdHJldHVybiB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEVuYWJsZXMgaGFyZHdhcmUgY2xpcHBpbmcuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcGxhbmVDb3VudCAtIFRoZSBjbGlwcGluZyBwbGFuZSBjb3VudC5cclxuXHQgKi9cclxuXHRlbmFibGVIYXJkd2FyZUNsaXBwaW5nKCBwbGFuZUNvdW50ICkge1xyXG5cclxuXHRcdHRoaXMuZW5hYmxlRXh0ZW5zaW9uKCAnR0xfQU5HTEVfY2xpcF9jdWxsX2Rpc3RhbmNlJywgJ3JlcXVpcmUnICk7XHJcblxyXG5cdFx0dGhpcy5idWlsdGluc1sgJ3ZlcnRleCcgXS5wdXNoKCBgb3V0IGZsb2F0IGdsX0NsaXBEaXN0YW5jZVsgJHsgcGxhbmVDb3VudCB9IF1gICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVnaXN0ZXJzIGEgdHJhbnNmb3JtIGluIGNvbnRleHQgb2YgVHJhbnNmb3JtIEZlZWRiYWNrLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHZhcnlpbmdOYW1lIC0gVGhlIHZhcnlpbmcgbmFtZS5cclxuXHQgKiBAcGFyYW0ge0F0dHJpYnV0ZU5vZGV9IGF0dHJpYnV0ZU5vZGUgLSBUaGUgYXR0cmlidXRlIG5vZGUuXHJcblx0ICovXHJcblx0cmVnaXN0ZXJUcmFuc2Zvcm0oIHZhcnlpbmdOYW1lLCBhdHRyaWJ1dGVOb2RlICkge1xyXG5cclxuXHRcdHRoaXMudHJhbnNmb3Jtcy5wdXNoKCB7IHZhcnlpbmdOYW1lLCBhdHRyaWJ1dGVOb2RlIH0gKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSB0cmFuc2Zvcm1zIG9mIHRoZSBnaXZlbiBzaGFkZXIgc3RhZ2UgYXMgYSBHTFNMIHN0cmluZy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzaGFkZXJTdGFnZSAtIFRoZSBzaGFkZXIgc3RhZ2UuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgR0xTTCBzbmlwcGV0IHRoYXQgZGVmaW5lcyB0aGUgdHJhbnNmb3Jtcy5cclxuXHQgKi9cclxuXHRnZXRUcmFuc2Zvcm1zKCAvKiBzaGFkZXJTdGFnZSAgKi8gKSB7XHJcblxyXG5cdFx0Y29uc3QgdHJhbnNmb3JtcyA9IHRoaXMudHJhbnNmb3JtcztcclxuXHJcblx0XHRsZXQgc25pcHBldCA9ICcnO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHRyYW5zZm9ybXMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdHJhbnNmb3JtID0gdHJhbnNmb3Jtc1sgaSBdO1xyXG5cdFx0XHRjb25zdCBhdHRyaWJ1dGVOYW1lID0gdGhpcy5nZXRQcm9wZXJ0eU5hbWUoIHRyYW5zZm9ybS5hdHRyaWJ1dGVOb2RlICk7XHJcblxyXG5cdFx0XHRpZiAoIGF0dHJpYnV0ZU5hbWUgKSBzbmlwcGV0ICs9IGAkeyB0cmFuc2Zvcm0udmFyeWluZ05hbWUgfSA9ICR7IGF0dHJpYnV0ZU5hbWUgfTtcXG5cXHRgO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gc25pcHBldDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgR0xTTCBzdHJ1Y3QgYmFzZWQgb24gdGhlIGdpdmVuIG5hbWUgYW5kIHZhcmlhYmxlcy5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgc3RydWN0IG5hbWUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHZhcnMgLSBUaGUgc3RydWN0IHZhcmlhYmxlcy5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBHTFNMIHNuaXBwZXQgcmVwcmVzZW50aW5nIGEgc3RydWN0LlxyXG5cdCAqL1xyXG5cdF9nZXRHTFNMVW5pZm9ybVN0cnVjdCggbmFtZSwgdmFycyApIHtcclxuXHJcblx0XHRyZXR1cm4gYFxyXG5sYXlvdXQoIHN0ZDE0MCApIHVuaWZvcm0gJHtuYW1lfSB7XHJcbiR7dmFyc31cclxufTtgO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBHTFNMIHZlcnRleCBzaGFkZXIgYmFzZWQgb24gdGhlIGdpdmVuIHNoYWRlciBkYXRhLlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gc2hhZGVyRGF0YSAtIFRoZSBzaGFkZXIgZGF0YS5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB2ZXJ0ZXggc2hhZGVyLlxyXG5cdCAqL1xyXG5cdF9nZXRHTFNMVmVydGV4Q29kZSggc2hhZGVyRGF0YSApIHtcclxuXHJcblx0XHRyZXR1cm4gYCN2ZXJzaW9uIDMwMCBlc1xyXG5cclxuJHsgdGhpcy5nZXRTaWduYXR1cmUoKSB9XHJcblxyXG4vLyBleHRlbnNpb25zXHJcbiR7c2hhZGVyRGF0YS5leHRlbnNpb25zfVxyXG5cclxuLy8gcHJlY2lzaW9uXHJcbiR7IGRlZmF1bHRQcmVjaXNpb25zIH1cclxuXHJcbi8vIHVuaWZvcm1zXHJcbiR7c2hhZGVyRGF0YS51bmlmb3Jtc31cclxuXHJcbi8vIHZhcnlpbmdzXHJcbiR7c2hhZGVyRGF0YS52YXJ5aW5nc31cclxuXHJcbi8vIGF0dHJpYnV0ZXNcclxuJHtzaGFkZXJEYXRhLmF0dHJpYnV0ZXN9XHJcblxyXG4vLyBjb2Rlc1xyXG4ke3NoYWRlckRhdGEuY29kZXN9XHJcblxyXG52b2lkIG1haW4oKSB7XHJcblxyXG5cdC8vIHZhcnNcclxuXHQke3NoYWRlckRhdGEudmFyc31cclxuXHJcblx0Ly8gdHJhbnNmb3Jtc1xyXG5cdCR7c2hhZGVyRGF0YS50cmFuc2Zvcm1zfVxyXG5cclxuXHQvLyBmbG93XHJcblx0JHtzaGFkZXJEYXRhLmZsb3d9XHJcblxyXG5cdGdsX1BvaW50U2l6ZSA9IDEuMDtcclxuXHJcbn1cclxuYDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgR0xTTCBmcmFnbWVudCBzaGFkZXIgYmFzZWQgb24gdGhlIGdpdmVuIHNoYWRlciBkYXRhLlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gc2hhZGVyRGF0YSAtIFRoZSBzaGFkZXIgZGF0YS5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB2ZXJ0ZXggc2hhZGVyLlxyXG5cdCAqL1xyXG5cdF9nZXRHTFNMRnJhZ21lbnRDb2RlKCBzaGFkZXJEYXRhICkge1xyXG5cclxuXHRcdHJldHVybiBgI3ZlcnNpb24gMzAwIGVzXHJcblxyXG4keyB0aGlzLmdldFNpZ25hdHVyZSgpIH1cclxuXHJcbi8vIHByZWNpc2lvblxyXG4keyBkZWZhdWx0UHJlY2lzaW9ucyB9XHJcblxyXG4vLyB1bmlmb3Jtc1xyXG4ke3NoYWRlckRhdGEudW5pZm9ybXN9XHJcblxyXG4vLyB2YXJ5aW5nc1xyXG4ke3NoYWRlckRhdGEudmFyeWluZ3N9XHJcblxyXG4vLyBjb2Rlc1xyXG4ke3NoYWRlckRhdGEuY29kZXN9XHJcblxyXG4vLyBzdHJ1Y3RzXHJcbiR7c2hhZGVyRGF0YS5zdHJ1Y3RzfVxyXG5cclxudm9pZCBtYWluKCkge1xyXG5cclxuXHQvLyB2YXJzXHJcblx0JHtzaGFkZXJEYXRhLnZhcnN9XHJcblxyXG5cdC8vIGZsb3dcclxuXHQke3NoYWRlckRhdGEuZmxvd31cclxuXHJcbn1cclxuYDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb250cm9scyB0aGUgY29kZSBidWlsZCBvZiB0aGUgc2hhZGVyIHN0YWdlcy5cclxuXHQgKi9cclxuXHRidWlsZENvZGUoKSB7XHJcblxyXG5cdFx0Y29uc3Qgc2hhZGVyc0RhdGEgPSB0aGlzLm1hdGVyaWFsICE9PSBudWxsID8geyBmcmFnbWVudDoge30sIHZlcnRleDoge30gfSA6IHsgY29tcHV0ZToge30gfTtcclxuXHJcblx0XHR0aGlzLnNvcnRCaW5kaW5nR3JvdXBzKCk7XHJcblxyXG5cdFx0Zm9yICggY29uc3Qgc2hhZGVyU3RhZ2UgaW4gc2hhZGVyc0RhdGEgKSB7XHJcblxyXG5cdFx0XHRsZXQgZmxvdyA9ICcvLyBjb2RlXFxuXFxuJztcclxuXHRcdFx0ZmxvdyArPSB0aGlzLmZsb3dDb2RlWyBzaGFkZXJTdGFnZSBdO1xyXG5cclxuXHRcdFx0Y29uc3QgZmxvd05vZGVzID0gdGhpcy5mbG93Tm9kZXNbIHNoYWRlclN0YWdlIF07XHJcblx0XHRcdGNvbnN0IG1haW5Ob2RlID0gZmxvd05vZGVzWyBmbG93Tm9kZXMubGVuZ3RoIC0gMSBdO1xyXG5cclxuXHRcdFx0Zm9yICggY29uc3Qgbm9kZSBvZiBmbG93Tm9kZXMgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGZsb3dTbG90RGF0YSA9IHRoaXMuZ2V0Rmxvd0RhdGEoIG5vZGUvKiwgc2hhZGVyU3RhZ2UqLyApO1xyXG5cdFx0XHRcdGNvbnN0IHNsb3ROYW1lID0gbm9kZS5uYW1lO1xyXG5cclxuXHRcdFx0XHRpZiAoIHNsb3ROYW1lICkge1xyXG5cclxuXHRcdFx0XHRcdGlmICggZmxvdy5sZW5ndGggPiAwICkgZmxvdyArPSAnXFxuJztcclxuXHJcblx0XHRcdFx0XHRmbG93ICs9IGBcXHQvLyBmbG93IC0+ICR7IHNsb3ROYW1lIH1cXG5cXHRgO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGZsb3cgKz0gYCR7IGZsb3dTbG90RGF0YS5jb2RlIH1cXG5cXHRgO1xyXG5cclxuXHRcdFx0XHRpZiAoIG5vZGUgPT09IG1haW5Ob2RlICYmIHNoYWRlclN0YWdlICE9PSAnY29tcHV0ZScgKSB7XHJcblxyXG5cdFx0XHRcdFx0ZmxvdyArPSAnLy8gcmVzdWx0XFxuXFx0JztcclxuXHJcblx0XHRcdFx0XHRpZiAoIHNoYWRlclN0YWdlID09PSAndmVydGV4JyApIHtcclxuXHJcblx0XHRcdFx0XHRcdGZsb3cgKz0gJ2dsX1Bvc2l0aW9uID0gJztcclxuXHRcdFx0XHRcdFx0ZmxvdyArPSBgJHsgZmxvd1Nsb3REYXRhLnJlc3VsdCB9O2A7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIGlmICggc2hhZGVyU3RhZ2UgPT09ICdmcmFnbWVudCcgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoICEgbm9kZS5vdXRwdXROb2RlLmlzT3V0cHV0U3RydWN0Tm9kZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0ZmxvdyArPSAnZnJhZ0NvbG9yID0gJztcclxuXHRcdFx0XHRcdFx0XHRmbG93ICs9IGAkeyBmbG93U2xvdERhdGEucmVzdWx0IH07YDtcclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IHN0YWdlRGF0YSA9IHNoYWRlcnNEYXRhWyBzaGFkZXJTdGFnZSBdO1xyXG5cclxuXHRcdFx0c3RhZ2VEYXRhLmV4dGVuc2lvbnMgPSB0aGlzLmdldEV4dGVuc2lvbnMoIHNoYWRlclN0YWdlICk7XHJcblx0XHRcdHN0YWdlRGF0YS51bmlmb3JtcyA9IHRoaXMuZ2V0VW5pZm9ybXMoIHNoYWRlclN0YWdlICk7XHJcblx0XHRcdHN0YWdlRGF0YS5hdHRyaWJ1dGVzID0gdGhpcy5nZXRBdHRyaWJ1dGVzKCBzaGFkZXJTdGFnZSApO1xyXG5cdFx0XHRzdGFnZURhdGEudmFyeWluZ3MgPSB0aGlzLmdldFZhcnlpbmdzKCBzaGFkZXJTdGFnZSApO1xyXG5cdFx0XHRzdGFnZURhdGEudmFycyA9IHRoaXMuZ2V0VmFycyggc2hhZGVyU3RhZ2UgKTtcclxuXHRcdFx0c3RhZ2VEYXRhLnN0cnVjdHMgPSB0aGlzLmdldFN0cnVjdHMoIHNoYWRlclN0YWdlICk7XHJcblx0XHRcdHN0YWdlRGF0YS5jb2RlcyA9IHRoaXMuZ2V0Q29kZXMoIHNoYWRlclN0YWdlICk7XHJcblx0XHRcdHN0YWdlRGF0YS50cmFuc2Zvcm1zID0gdGhpcy5nZXRUcmFuc2Zvcm1zKCBzaGFkZXJTdGFnZSApO1xyXG5cdFx0XHRzdGFnZURhdGEuZmxvdyA9IGZsb3c7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpcy5tYXRlcmlhbCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMudmVydGV4U2hhZGVyID0gdGhpcy5fZ2V0R0xTTFZlcnRleENvZGUoIHNoYWRlcnNEYXRhLnZlcnRleCApO1xyXG5cdFx0XHR0aGlzLmZyYWdtZW50U2hhZGVyID0gdGhpcy5fZ2V0R0xTTEZyYWdtZW50Q29kZSggc2hhZGVyc0RhdGEuZnJhZ21lbnQgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGhpcy5jb21wdXRlU2hhZGVyID0gdGhpcy5fZ2V0R0xTTFZlcnRleENvZGUoIHNoYWRlcnNEYXRhLmNvbXB1dGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgaXMgb25lIG9mIHRoZSBtb3JlIGltcG9ydGFudCBvbmVzIHNpbmNlIGl0J3MgcmVzcG9uc2libGVcclxuXHQgKiBmb3IgZ2VuZXJhdGluZyBhIG1hdGNoaW5nIGJpbmRpbmcgaW5zdGFuY2UgZm9yIHRoZSBnaXZlbiB1bmlmb3JtIG5vZGUuXHJcblx0ICpcclxuXHQgKiBUaGVzZSBiaW5kaW5ncyBhcmUgbGF0ZXIgdXNlZCBpbiB0aGUgcmVuZGVyZXIgdG8gY3JlYXRlIGJpbmQgZ3JvdXBzXHJcblx0ICogYW5kIGxheW91dHMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1VuaWZvcm1Ob2RlfSBub2RlIC0gVGhlIHVuaWZvcm0gbm9kZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSBub2RlIGRhdGEgdHlwZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc2hhZGVyU3RhZ2UgLSBUaGUgc2hhZGVyIHN0YWdlLlxyXG5cdCAqIEBwYXJhbSB7P3N0cmluZ30gW25hbWU9bnVsbF0gLSBBbiBvcHRpb25hbCB1bmlmb3JtIG5hbWUuXHJcblx0ICogQHJldHVybiB7Tm9kZVVuaWZvcm19IFRoZSBub2RlIHVuaWZvcm0gb2JqZWN0LlxyXG5cdCAqL1xyXG5cdGdldFVuaWZvcm1Gcm9tTm9kZSggbm9kZSwgdHlwZSwgc2hhZGVyU3RhZ2UsIG5hbWUgPSBudWxsICkge1xyXG5cclxuXHRcdGNvbnN0IHVuaWZvcm1Ob2RlID0gc3VwZXIuZ2V0VW5pZm9ybUZyb21Ob2RlKCBub2RlLCB0eXBlLCBzaGFkZXJTdGFnZSwgbmFtZSApO1xyXG5cdFx0Y29uc3Qgbm9kZURhdGEgPSB0aGlzLmdldERhdGFGcm9tTm9kZSggbm9kZSwgc2hhZGVyU3RhZ2UsIHRoaXMuZ2xvYmFsQ2FjaGUgKTtcclxuXHJcblx0XHRsZXQgdW5pZm9ybUdQVSA9IG5vZGVEYXRhLnVuaWZvcm1HUFU7XHJcblxyXG5cdFx0aWYgKCB1bmlmb3JtR1BVID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBncm91cCA9IG5vZGUuZ3JvdXBOb2RlO1xyXG5cdFx0XHRjb25zdCBncm91cE5hbWUgPSBncm91cC5uYW1lO1xyXG5cclxuXHRcdFx0Y29uc3QgYmluZGluZ3MgPSB0aGlzLmdldEJpbmRHcm91cEFycmF5KCBncm91cE5hbWUsIHNoYWRlclN0YWdlICk7XHJcblxyXG5cdFx0XHRpZiAoIHR5cGUgPT09ICd0ZXh0dXJlJyApIHtcclxuXHJcblx0XHRcdFx0dW5pZm9ybUdQVSA9IG5ldyBOb2RlU2FtcGxlZFRleHR1cmUoIHVuaWZvcm1Ob2RlLm5hbWUsIHVuaWZvcm1Ob2RlLm5vZGUsIGdyb3VwICk7XHJcblx0XHRcdFx0YmluZGluZ3MucHVzaCggdW5pZm9ybUdQVSApO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggdHlwZSA9PT0gJ2N1YmVUZXh0dXJlJyApIHtcclxuXHJcblx0XHRcdFx0dW5pZm9ybUdQVSA9IG5ldyBOb2RlU2FtcGxlZEN1YmVUZXh0dXJlKCB1bmlmb3JtTm9kZS5uYW1lLCB1bmlmb3JtTm9kZS5ub2RlLCBncm91cCApO1xyXG5cdFx0XHRcdGJpbmRpbmdzLnB1c2goIHVuaWZvcm1HUFUgKTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIHR5cGUgPT09ICd0ZXh0dXJlM0QnICkge1xyXG5cclxuXHRcdFx0XHR1bmlmb3JtR1BVID0gbmV3IE5vZGVTYW1wbGVkVGV4dHVyZTNEKCB1bmlmb3JtTm9kZS5uYW1lLCB1bmlmb3JtTm9kZS5ub2RlLCBncm91cCApO1xyXG5cdFx0XHRcdGJpbmRpbmdzLnB1c2goIHVuaWZvcm1HUFUgKTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIHR5cGUgPT09ICdidWZmZXInICkge1xyXG5cclxuXHRcdFx0XHRub2RlLm5hbWUgPSBgTm9kZUJ1ZmZlcl8keyBub2RlLmlkIH1gO1xyXG5cdFx0XHRcdHVuaWZvcm1Ob2RlLm5hbWUgPSBgYnVmZmVyJHsgbm9kZS5pZCB9YDtcclxuXHJcblx0XHRcdFx0Y29uc3QgYnVmZmVyID0gbmV3IE5vZGVVbmlmb3JtQnVmZmVyKCBub2RlLCBncm91cCApO1xyXG5cdFx0XHRcdGJ1ZmZlci5uYW1lID0gbm9kZS5uYW1lO1xyXG5cclxuXHRcdFx0XHRiaW5kaW5ncy5wdXNoKCBidWZmZXIgKTtcclxuXHJcblx0XHRcdFx0dW5pZm9ybUdQVSA9IGJ1ZmZlcjtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHVuaWZvcm1zU3RhZ2UgPSB0aGlzLnVuaWZvcm1Hcm91cHNbIHNoYWRlclN0YWdlIF0gfHwgKCB0aGlzLnVuaWZvcm1Hcm91cHNbIHNoYWRlclN0YWdlIF0gPSB7fSApO1xyXG5cclxuXHRcdFx0XHRsZXQgdW5pZm9ybXNHcm91cCA9IHVuaWZvcm1zU3RhZ2VbIGdyb3VwTmFtZSBdO1xyXG5cclxuXHRcdFx0XHRpZiAoIHVuaWZvcm1zR3JvdXAgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHR1bmlmb3Jtc0dyb3VwID0gbmV3IE5vZGVVbmlmb3Jtc0dyb3VwKCBzaGFkZXJTdGFnZSArICdfJyArIGdyb3VwTmFtZSwgZ3JvdXAgKTtcclxuXHRcdFx0XHRcdC8vdW5pZm9ybXNHcm91cC5zZXRWaXNpYmlsaXR5KCBncHVTaGFkZXJTdGFnZUxpYlsgc2hhZGVyU3RhZ2UgXSApO1xyXG5cclxuXHRcdFx0XHRcdHVuaWZvcm1zU3RhZ2VbIGdyb3VwTmFtZSBdID0gdW5pZm9ybXNHcm91cDtcclxuXHJcblx0XHRcdFx0XHRiaW5kaW5ncy5wdXNoKCB1bmlmb3Jtc0dyb3VwICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0dW5pZm9ybUdQVSA9IHRoaXMuZ2V0Tm9kZVVuaWZvcm0oIHVuaWZvcm1Ob2RlLCB0eXBlICk7XHJcblxyXG5cdFx0XHRcdHVuaWZvcm1zR3JvdXAuYWRkVW5pZm9ybSggdW5pZm9ybUdQVSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0bm9kZURhdGEudW5pZm9ybUdQVSA9IHVuaWZvcm1HUFU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB1bmlmb3JtTm9kZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgR0xTTE5vZGVCdWlsZGVyO1xyXG4iLCJsZXQgX3ZlY3RvcjIgPSBudWxsO1xyXG5sZXQgX2NvbG9yNCA9IG51bGw7XHJcblxyXG5pbXBvcnQgQ29sb3I0IGZyb20gJy4vQ29sb3I0LmpzJztcclxuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gJy4uLy4uL21hdGgvVmVjdG9yMi5qcyc7XHJcbmltcG9ydCB7IGNyZWF0ZUNhbnZhc0VsZW1lbnQsIHdhcm5PbmNlIH0gZnJvbSAnLi4vLi4vdXRpbHMuanMnO1xyXG5pbXBvcnQgeyBSRVZJU0lPTiB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcblxyXG4vKipcclxuICogTW9zdCBvZiB0aGUgcmVuZGVyaW5nIHJlbGF0ZWQgbG9naWMgaXMgaW1wbGVtZW50ZWQgaW4gdGhlXHJcbiAqIHtAbGluayBSZW5kZXJlcn0gbW9kdWxlIGFuZCByZWxhdGVkIG1hbmFnZW1lbnQgY29tcG9uZW50cy5cclxuICogU29tZXRpbWVzIGl0IGlzIHJlcXVpcmVkIHRob3VnaCB0byBleGVjdXRlIGNvbW1hbmRzIHdoaWNoIGFyZVxyXG4gKiBzcGVjaWZpYyB0byB0aGUgY3VycmVudCAzRCBiYWNrZW5kICh3aGljaCBpcyBXZWJHUFUgb3IgV2ViR0wgMikuXHJcbiAqIFRoaXMgYWJzdHJhY3QgYmFzZSBjbGFzcyBkZWZpbmVzIGFuIGludGVyZmFjZSB0aGF0IGVuY2Fwc3VsYXRlc1xyXG4gKiBhbGwgYmFja2VuZC1yZWxhdGVkIGxvZ2ljLiBEZXJpdmVkIGNsYXNzZXMgZm9yIGVhY2ggYmFja2VuZCBtdXN0XHJcbiAqIGltcGxlbWVudCB0aGUgaW50ZXJmYWNlLlxyXG4gKlxyXG4gKiBAYWJzdHJhY3RcclxuICogQHByaXZhdGVcclxuICovXHJcbmNsYXNzIEJhY2tlbmQge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGJhY2tlbmQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1ldGVycyAtIEFuIG9iamVjdCBob2xkaW5nIHBhcmFtZXRlcnMgZm9yIHRoZSBiYWNrZW5kLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwYXJhbWV0ZXJzID0ge30gKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcGFyYW1ldGVycyBvZiB0aGUgYmFja2VuZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnBhcmFtZXRlcnMgPSBPYmplY3QuYXNzaWduKCB7fSwgcGFyYW1ldGVycyApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyB3ZWFrIG1hcCBob2xkcyBiYWNrZW5kLXNwZWNpZmljIGRhdGEgb2Ygb2JqZWN0c1xyXG5cdFx0ICogbGlrZSB0ZXh0dXJlcywgYXR0cmlidXRlcyBvciByZW5kZXIgdGFyZ2V0cy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2Vha01hcH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kYXRhID0gbmV3IFdlYWtNYXAoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIHRoZSByZW5kZXJlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1JlbmRlcmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnJlbmRlcmVyID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIHRoZSBjYW52YXMgZWxlbWVudCB0aGUgcmVuZGVyZXIgaXMgZHJhd2luZyB0by5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7PyhIVE1MQ2FudmFzRWxlbWVudHxPZmZzY3JlZW5DYW52YXMpfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRvbUVsZW1lbnQgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIHRpbWVzdGFtcCBxdWVyeSBwb29sLlxyXG4gICBcdFx0ICpcclxuICAgXHRcdCAqIEB0eXBlIHt7cmVuZGVyOiA/VGltZXN0YW1wUXVlcnlQb29sLCBjb21wdXRlOiA/VGltZXN0YW1wUXVlcnlQb29sfX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50aW1lc3RhbXBRdWVyeVBvb2wgPSB7XHJcblx0XHRcdCdyZW5kZXInOiBudWxsLFxyXG5cdFx0XHQnY29tcHV0ZSc6IG51bGxcclxuXHRcdH07XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRvIHRyYWNrIHRpbWVzdGFtcHMgd2l0aCBhIFRpbWVzdGFtcCBRdWVyeSBBUEkgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50cmFja1RpbWVzdGFtcCA9ICggcGFyYW1ldGVycy50cmFja1RpbWVzdGFtcCA9PT0gdHJ1ZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEluaXRpYWxpemVzIHRoZSBiYWNrZW5kIHNvIGl0IGlzIHJlYWR5IGZvciB1c2FnZS4gQ29uY3JldGUgYmFja2VuZHNcclxuXHQgKiBhcmUgc3VwcG9zZWQgdG8gaW1wbGVtZW50IHRoZWlyIHJlbmRlcmluZyBjb250ZXh0IGNyZWF0aW9uIGFuZCByZWxhdGVkXHJcblx0ICogb3BlcmF0aW9ucyBpbiB0aGlzIG1ldGhvZC5cclxuXHQgKlxyXG5cdCAqIEBhc3luY1xyXG5cdCAqIEBwYXJhbSB7UmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEByZXR1cm4ge1Byb21pc2V9IEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGJhY2tlbmQgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuXHJcblx0ICovXHJcblx0YXN5bmMgaW5pdCggcmVuZGVyZXIgKSB7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBjb29yZGluYXRlIHN5c3RlbSBvZiB0aGUgYmFja2VuZC5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0ICogQHJlYWRvbmx5XHJcblx0ICovXHJcblx0Z2V0IGNvb3JkaW5hdGVTeXN0ZW0oKSB7fVxyXG5cclxuXHQvLyByZW5kZXIgY29udGV4dFxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyBleGVjdXRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgcmVuZGVyIGNhbGwgYW5kXHJcblx0ICogY2FuIGJlIHVzZWQgYnkgdGhlIGJhY2tlbmQgdG8gcHJlcGFyZSB0aGUgc3RhdGUgZm9yIHVwY29taW5nXHJcblx0ICogZHJhdyBjYWxscy5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyQ29udGV4dH0gcmVuZGVyQ29udGV4dCAtIFRoZSByZW5kZXIgY29udGV4dC5cclxuXHQgKi9cclxuXHRiZWdpblJlbmRlciggLypyZW5kZXJDb250ZXh0Ki8gKSB7fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyBleGVjdXRlZCBhdCB0aGUgZW5kIG9mIGEgcmVuZGVyIGNhbGwgYW5kXHJcblx0ICogY2FuIGJlIHVzZWQgYnkgdGhlIGJhY2tlbmQgdG8gZmluYWxpemUgd29yayBhZnRlciBkcmF3XHJcblx0ICogY2FsbHMuXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcGFyYW0ge1JlbmRlckNvbnRleHR9IHJlbmRlckNvbnRleHQgLSBUaGUgcmVuZGVyIGNvbnRleHQuXHJcblx0ICovXHJcblx0ZmluaXNoUmVuZGVyKCAvKnJlbmRlckNvbnRleHQqLyApIHt9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGlzIGV4ZWN1dGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBjb21wdXRlIGNhbGwgYW5kXHJcblx0ICogY2FuIGJlIHVzZWQgYnkgdGhlIGJhY2tlbmQgdG8gcHJlcGFyZSB0aGUgc3RhdGUgZm9yIHVwY29taW5nXHJcblx0ICogY29tcHV0ZSB0YXNrcy5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7Tm9kZXxBcnJheTxOb2RlPn0gY29tcHV0ZUdyb3VwIC0gVGhlIGNvbXB1dGUgbm9kZShzKS5cclxuXHQgKi9cclxuXHRiZWdpbkNvbXB1dGUoIC8qY29tcHV0ZUdyb3VwKi8gKSB7fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyBleGVjdXRlZCBhdCB0aGUgZW5kIG9mIGEgY29tcHV0ZSBjYWxsIGFuZFxyXG5cdCAqIGNhbiBiZSB1c2VkIGJ5IHRoZSBiYWNrZW5kIHRvIGZpbmFsaXplIHdvcmsgYWZ0ZXIgY29tcHV0ZVxyXG5cdCAqIHRhc2tzLlxyXG5cdCAqXHJcblx0ICogQGFic3RyYWN0XHJcblx0ICogQHBhcmFtIHtOb2RlfEFycmF5PE5vZGU+fSBjb21wdXRlR3JvdXAgLSBUaGUgY29tcHV0ZSBub2RlKHMpLlxyXG5cdCAqL1xyXG5cdGZpbmlzaENvbXB1dGUoIC8qY29tcHV0ZUdyb3VwKi8gKSB7fVxyXG5cclxuXHQvLyByZW5kZXIgb2JqZWN0XHJcblxyXG5cdC8qKlxyXG5cdCAqIEV4ZWN1dGVzIGEgZHJhdyBjb21tYW5kIGZvciB0aGUgZ2l2ZW4gcmVuZGVyIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyT2JqZWN0fSByZW5kZXJPYmplY3QgLSBUaGUgcmVuZGVyIG9iamVjdCB0byBkcmF3LlxyXG5cdCAqIEBwYXJhbSB7SW5mb30gaW5mbyAtIEhvbGRzIGEgc2VyaWVzIG9mIHN0YXRpc3RpY2FsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBHUFUgbWVtb3J5IGFuZCB0aGUgcmVuZGVyaW5nIHByb2Nlc3MuXHJcblx0ICovXHJcblx0ZHJhdyggLypyZW5kZXJPYmplY3QsIGluZm8qLyApIHsgfVxyXG5cclxuXHQvLyBjb21wdXRlIG5vZGVcclxuXHJcblx0LyoqXHJcblx0ICogRXhlY3V0ZXMgYSBjb21wdXRlIGNvbW1hbmQgZm9yIHRoZSBnaXZlbiBjb21wdXRlIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcGFyYW0ge05vZGV8QXJyYXk8Tm9kZT59IGNvbXB1dGVHcm91cCAtIFRoZSBncm91cCBvZiBjb21wdXRlIG5vZGVzIG9mIGEgY29tcHV0ZSBjYWxsLiBDYW4gYmUgYSBzaW5nbGUgY29tcHV0ZSBub2RlLlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gY29tcHV0ZU5vZGUgLSBUaGUgY29tcHV0ZSBub2RlLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8QmluZEdyb3VwPn0gYmluZGluZ3MgLSBUaGUgYmluZGluZ3MuXHJcblx0ICogQHBhcmFtIHtDb21wdXRlUGlwZWxpbmV9IGNvbXB1dGVQaXBlbGluZSAtIFRoZSBjb21wdXRlIHBpcGVsaW5lLlxyXG5cdCAqL1xyXG5cdGNvbXB1dGUoIC8qY29tcHV0ZUdyb3VwLCBjb21wdXRlTm9kZSwgY29tcHV0ZUJpbmRpbmdzLCBjb21wdXRlUGlwZWxpbmUqLyApIHsgfVxyXG5cclxuXHQvLyBwcm9ncmFtXHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgYSBzaGFkZXIgcHJvZ3JhbSBmcm9tIHRoZSBnaXZlbiBwcm9ncmFtbWFibGUgc3RhZ2UuXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcGFyYW0ge1Byb2dyYW1tYWJsZVN0YWdlfSBwcm9ncmFtIC0gVGhlIHByb2dyYW1tYWJsZSBzdGFnZS5cclxuXHQgKi9cclxuXHRjcmVhdGVQcm9ncmFtKCAvKnByb2dyYW0qLyApIHsgfVxyXG5cclxuXHQvKipcclxuXHQgKiBEZXN0cm95cyB0aGUgc2hhZGVyIHByb2dyYW0gb2YgdGhlIGdpdmVuIHByb2dyYW1tYWJsZSBzdGFnZS5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7UHJvZ3JhbW1hYmxlU3RhZ2V9IHByb2dyYW0gLSBUaGUgcHJvZ3JhbW1hYmxlIHN0YWdlLlxyXG5cdCAqL1xyXG5cdGRlc3Ryb3lQcm9ncmFtKCAvKnByb2dyYW0qLyApIHsgfVxyXG5cclxuXHQvLyBiaW5kaW5nc1xyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGJpbmRpbmdzIGZyb20gdGhlIGdpdmVuIGJpbmQgZ3JvdXAgZGVmaW5pdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7QmluZEdyb3VwfSBiaW5kR3JvdXAgLSBUaGUgYmluZCBncm91cC5cclxuXHQgKiBAcGFyYW0ge0FycmF5PEJpbmRHcm91cD59IGJpbmRpbmdzIC0gQXJyYXkgb2YgYmluZCBncm91cHMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGNhY2hlSW5kZXggLSBUaGUgY2FjaGUgaW5kZXguXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHZlcnNpb24gLSBUaGUgdmVyc2lvbi5cclxuXHQgKi9cclxuXHRjcmVhdGVCaW5kaW5ncyggLypiaW5kR3JvdXAsIGJpbmRpbmdzLCBjYWNoZUluZGV4LCB2ZXJzaW9uKi8gKSB7IH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgZ2l2ZW4gYmluZCBncm91cCBkZWZpbml0aW9uLlxyXG5cdCAqXHJcblx0ICogQGFic3RyYWN0XHJcblx0ICogQHBhcmFtIHtCaW5kR3JvdXB9IGJpbmRHcm91cCAtIFRoZSBiaW5kIGdyb3VwLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8QmluZEdyb3VwPn0gYmluZGluZ3MgLSBBcnJheSBvZiBiaW5kIGdyb3Vwcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gY2FjaGVJbmRleCAtIFRoZSBjYWNoZSBpbmRleC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdmVyc2lvbiAtIFRoZSB2ZXJzaW9uLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZUJpbmRpbmdzKCAvKmJpbmRHcm91cCwgYmluZGluZ3MsIGNhY2hlSW5kZXgsIHZlcnNpb24qLyApIHsgfVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIGEgYnVmZmVyIGJpbmRpbmcuXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcGFyYW0ge0J1ZmZlcn0gYmluZGluZyAtIFRoZSBidWZmZXIgYmluZGluZyB0byB1cGRhdGUuXHJcblx0ICovXHJcblx0dXBkYXRlQmluZGluZyggLypiaW5kaW5nKi8gKSB7IH1cclxuXHJcblx0Ly8gcGlwZWxpbmVcclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyBhIHJlbmRlciBwaXBlbGluZSBmb3IgdGhlIGdpdmVuIHJlbmRlciBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcGFyYW0ge1JlbmRlck9iamVjdH0gcmVuZGVyT2JqZWN0IC0gVGhlIHJlbmRlciBvYmplY3QuXHJcblx0ICogQHBhcmFtIHtBcnJheTxQcm9taXNlPn0gcHJvbWlzZXMgLSBBbiBhcnJheSBvZiBjb21waWxhdGlvbiBwcm9taXNlcyB3aGljaCBhcmUgdXNlZCBpbiBgY29tcGlsZUFzeW5jKClgLlxyXG5cdCAqL1xyXG5cdGNyZWF0ZVJlbmRlclBpcGVsaW5lKCAvKnJlbmRlck9iamVjdCwgcHJvbWlzZXMqLyApIHsgfVxyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGEgY29tcHV0ZSBwaXBlbGluZSBmb3IgdGhlIGdpdmVuIGNvbXB1dGUgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7Q29tcHV0ZVBpcGVsaW5lfSBjb21wdXRlUGlwZWxpbmUgLSBUaGUgY29tcHV0ZSBwaXBlbGluZS5cclxuXHQgKiBAcGFyYW0ge0FycmF5PEJpbmRHcm91cD59IGJpbmRpbmdzIC0gVGhlIGJpbmRpbmdzLlxyXG5cdCAqL1xyXG5cdGNyZWF0ZUNvbXB1dGVQaXBlbGluZSggLypjb21wdXRlUGlwZWxpbmUsIGJpbmRpbmdzKi8gKSB7IH1cclxuXHJcblx0Ly8gY2FjaGUga2V5XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSByZW5kZXIgcGlwZWxpbmUgcmVxdWlyZXMgYW4gdXBkYXRlLlxyXG5cdCAqXHJcblx0ICogQGFic3RyYWN0XHJcblx0ICogQHBhcmFtIHtSZW5kZXJPYmplY3R9IHJlbmRlck9iamVjdCAtIFRoZSByZW5kZXIgb2JqZWN0LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHJlbmRlciBwaXBlbGluZSByZXF1aXJlcyBhbiB1cGRhdGUgb3Igbm90LlxyXG5cdCAqL1xyXG5cdG5lZWRzUmVuZGVyVXBkYXRlKCAvKnJlbmRlck9iamVjdCovICkgeyB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBjYWNoZSBrZXkgdGhhdCBpcyB1c2VkIHRvIGlkZW50aWZ5IHJlbmRlciBwaXBlbGluZXMuXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcGFyYW0ge1JlbmRlck9iamVjdH0gcmVuZGVyT2JqZWN0IC0gVGhlIHJlbmRlciBvYmplY3QuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgY2FjaGUga2V5LlxyXG5cdCAqL1xyXG5cdGdldFJlbmRlckNhY2hlS2V5KCAvKnJlbmRlck9iamVjdCovICkgeyB9XHJcblxyXG5cdC8vIG5vZGUgYnVpbGRlclxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbm9kZSBidWlsZGVyIGZvciB0aGUgZ2l2ZW4gcmVuZGVyIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyT2JqZWN0fSByZW5kZXJPYmplY3QgLSBUaGUgcmVuZGVyIG9iamVjdC5cclxuXHQgKiBAcGFyYW0ge1JlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcmV0dXJuIHtOb2RlQnVpbGRlcn0gVGhlIG5vZGUgYnVpbGRlci5cclxuXHQgKi9cclxuXHRjcmVhdGVOb2RlQnVpbGRlciggLypyZW5kZXJPYmplY3QsIHJlbmRlcmVyKi8gKSB7IH1cclxuXHJcblx0Ly8gdGV4dHVyZXNcclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyBhIEdQVSBzYW1wbGVyIGZvciB0aGUgZ2l2ZW4gdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlIHRvIGNyZWF0ZSB0aGUgc2FtcGxlciBmb3IuXHJcblx0ICovXHJcblx0Y3JlYXRlU2FtcGxlciggLyp0ZXh0dXJlKi8gKSB7IH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVzdHJveXMgdGhlIEdQVSBzYW1wbGVyIGZvciB0aGUgZ2l2ZW4gdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlIHRvIGRlc3Ryb3kgdGhlIHNhbXBsZXIgZm9yLlxyXG5cdCAqL1xyXG5cdGRlc3Ryb3lTYW1wbGVyKCAvKnRleHR1cmUqLyApIHt9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgYSBkZWZhdWx0IHRleHR1cmUgZm9yIHRoZSBnaXZlbiB0ZXh0dXJlIHRoYXQgY2FuIGJlIHVzZWRcclxuXHQgKiBhcyBhIHBsYWNlaG9sZGVyIHVudGlsIHRoZSBhY3R1YWwgdGV4dHVyZSBpcyByZWFkeSBmb3IgdXNhZ2UuXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZSB0byBjcmVhdGUgYSBkZWZhdWx0IHRleHR1cmUgZm9yLlxyXG5cdCAqL1xyXG5cdGNyZWF0ZURlZmF1bHRUZXh0dXJlKCAvKnRleHR1cmUqLyApIHsgfVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWZpbmVzIGEgdGV4dHVyZSBvbiB0aGUgR1BVIGZvciB0aGUgZ2l2ZW4gdGV4dHVyZSBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIuXHJcblx0ICovXHJcblx0Y3JlYXRlVGV4dHVyZSggLyp0ZXh0dXJlLCBvcHRpb25zPXt9Ki8gKSB7IH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBsb2FkcyB0aGUgdXBkYXRlZCB0ZXh0dXJlIGRhdGEgdG8gdGhlIEdQVS5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlLlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIHBhcmFtZXRlci5cclxuXHQgKi9cclxuXHR1cGRhdGVUZXh0dXJlKCAvKnRleHR1cmUsIG9wdGlvbnMgPSB7fSovICkgeyB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyBtaXBtYXBzIGZvciB0aGUgZ2l2ZW4gdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlLlxyXG5cdCAqL1xyXG5cdGdlbmVyYXRlTWlwbWFwcyggLyp0ZXh0dXJlKi8gKSB7IH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVzdHJveXMgdGhlIEdQVSBkYXRhIGZvciB0aGUgZ2l2ZW4gdGV4dHVyZSBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZS5cclxuXHQgKi9cclxuXHRkZXN0cm95VGV4dHVyZSggLyp0ZXh0dXJlKi8gKSB7IH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0ZXh0dXJlIGRhdGEgYXMgYSB0eXBlZCBhcnJheS5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBhc3luY1xyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlIHRvIGNvcHkuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBjb3B5IG9yaWdpbi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGNvcHkgb3JpZ2luLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgY29weS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgY29weS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZmFjZUluZGV4IC0gVGhlIGZhY2UgaW5kZXguXHJcblx0ICogQHJldHVybiB7UHJvbWlzZTxUeXBlZEFycmF5Pn0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCBhIHR5cGVkIGFycmF5IHdoZW4gdGhlIGNvcHkgb3BlcmF0aW9uIGhhcyBmaW5pc2hlZC5cclxuXHQgKi9cclxuXHRhc3luYyBjb3B5VGV4dHVyZVRvQnVmZmVyKCAvKnRleHR1cmUsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGZhY2VJbmRleCovICkge31cclxuXHJcblx0LyoqXHJcblx0ICogQ29waWVzIGRhdGEgb2YgdGhlIGdpdmVuIHNvdXJjZSB0ZXh0dXJlIHRvIHRoZSBnaXZlbiBkZXN0aW5hdGlvbiB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQGFic3RyYWN0XHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSBzcmNUZXh0dXJlIC0gVGhlIHNvdXJjZSB0ZXh0dXJlLlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gZHN0VGV4dHVyZSAtIFRoZSBkZXN0aW5hdGlvbiB0ZXh0dXJlLlxyXG5cdCAqIEBwYXJhbSB7PyhCb3gzfEJveDIpfSBbc3JjUmVnaW9uPW51bGxdIC0gVGhlIHJlZ2lvbiBvZiB0aGUgc291cmNlIHRleHR1cmUgdG8gY29weS5cclxuXHQgKiBAcGFyYW0gez8oVmVjdG9yMnxWZWN0b3IzKX0gW2RzdFBvc2l0aW9uPW51bGxdIC0gVGhlIGRlc3RpbmF0aW9uIHBvc2l0aW9uIG9mIHRoZSBjb3B5LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbc3JjTGV2ZWw9MF0gLSBUaGUgc291cmNlIG1pcCBsZXZlbCB0byBjb3B5IGZyb20uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtkc3RMZXZlbD0wXSAtIFRoZSBkZXN0aW5hdGlvbiBtaXAgbGV2ZWwgdG8gY29weSB0by5cclxuXHQgKi9cclxuXHRjb3B5VGV4dHVyZVRvVGV4dHVyZSggLypzcmNUZXh0dXJlLCBkc3RUZXh0dXJlLCBzcmNSZWdpb24gPSBudWxsLCBkc3RQb3NpdGlvbiA9IG51bGwsIHNyY0xldmVsID0gMCwgZHN0TGV2ZWwgPSAwKi8gKSB7fVxyXG5cclxuXHQvKipcclxuXHQqIENvcGllcyB0aGUgY3VycmVudCBib3VuZCBmcmFtZWJ1ZmZlciB0byB0aGUgZ2l2ZW4gdGV4dHVyZS5cclxuXHQqXHJcblx0KiBAYWJzdHJhY3RcclxuXHQqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSBkZXN0aW5hdGlvbiB0ZXh0dXJlLlxyXG5cdCogQHBhcmFtIHtSZW5kZXJDb250ZXh0fSByZW5kZXJDb250ZXh0IC0gVGhlIHJlbmRlciBjb250ZXh0LlxyXG5cdCogQHBhcmFtIHtWZWN0b3I0fSByZWN0YW5nbGUgLSBBIGZvdXIgZGltZW5zaW9uYWwgdmVjdG9yIGRlZmluaW5nIHRoZSBvcmlnaW4gYW5kIGRpbWVuc2lvbiBvZiB0aGUgY29weS5cclxuXHQqL1xyXG5cdGNvcHlGcmFtZWJ1ZmZlclRvVGV4dHVyZSggLyp0ZXh0dXJlLCByZW5kZXJDb250ZXh0LCByZWN0YW5nbGUqLyApIHt9XHJcblxyXG5cdC8vIGF0dHJpYnV0ZXNcclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyB0aGUgR1BVIGJ1ZmZlciBvZiBhIHNoYWRlciBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcGFyYW0ge0J1ZmZlckF0dHJpYnV0ZX0gYXR0cmlidXRlIC0gVGhlIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICovXHJcblx0Y3JlYXRlQXR0cmlidXRlKCAvKmF0dHJpYnV0ZSovICkgeyB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgdGhlIEdQVSBidWZmZXIgb2YgYW4gaW5kZXhlZCBzaGFkZXIgYXR0cmlidXRlLlxyXG5cdCAqXHJcblx0ICogQGFic3RyYWN0XHJcblx0ICogQHBhcmFtIHtCdWZmZXJBdHRyaWJ1dGV9IGF0dHJpYnV0ZSAtIFRoZSBpbmRleGVkIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICovXHJcblx0Y3JlYXRlSW5kZXhBdHRyaWJ1dGUoIC8qYXR0cmlidXRlKi8gKSB7IH1cclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyB0aGUgR1BVIGJ1ZmZlciBvZiBhIHN0b3JhZ2UgYXR0cmlidXRlLlxyXG5cdCAqXHJcblx0ICogQGFic3RyYWN0XHJcblx0ICogQHBhcmFtIHtCdWZmZXJBdHRyaWJ1dGV9IGF0dHJpYnV0ZSAtIFRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqL1xyXG5cdGNyZWF0ZVN0b3JhZ2VBdHRyaWJ1dGUoIC8qYXR0cmlidXRlKi8gKSB7IH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgR1BVIGJ1ZmZlciBvZiBhIHNoYWRlciBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcGFyYW0ge0J1ZmZlckF0dHJpYnV0ZX0gYXR0cmlidXRlIC0gVGhlIGJ1ZmZlciBhdHRyaWJ1dGUgdG8gdXBkYXRlLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZUF0dHJpYnV0ZSggLyphdHRyaWJ1dGUqLyApIHsgfVxyXG5cclxuXHQvKipcclxuXHQgKiBEZXN0cm95cyB0aGUgR1BVIGJ1ZmZlciBvZiBhIHNoYWRlciBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcGFyYW0ge0J1ZmZlckF0dHJpYnV0ZX0gYXR0cmlidXRlIC0gVGhlIGJ1ZmZlciBhdHRyaWJ1dGUgdG8gZGVzdHJveS5cclxuXHQgKi9cclxuXHRkZXN0cm95QXR0cmlidXRlKCAvKmF0dHJpYnV0ZSovICkgeyB9XHJcblxyXG5cdC8vIGNhbnZhc1xyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBiYWNrZW5kJ3MgcmVuZGVyaW5nIGNvbnRleHQuXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSByZW5kZXJpbmcgY29udGV4dC5cclxuXHQgKi9cclxuXHRnZXRDb250ZXh0KCkgeyB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEJhY2tlbmRzIGNhbiB1c2UgdGhpcyBtZXRob2QgaWYgdGhleSBoYXZlIHRvIHJ1blxyXG5cdCAqIGxvZ2ljIHdoZW4gdGhlIHJlbmRlcmVyIGdldHMgcmVzaXplZC5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqL1xyXG5cdHVwZGF0ZVNpemUoKSB7IH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgdmlld3BvcnQgd2l0aCB0aGUgdmFsdWVzIGZyb20gdGhlIGdpdmVuIHJlbmRlciBjb250ZXh0LlxyXG5cdCAqXHJcblx0ICogQGFic3RyYWN0XHJcblx0ICogQHBhcmFtIHtSZW5kZXJDb250ZXh0fSByZW5kZXJDb250ZXh0IC0gVGhlIHJlbmRlciBjb250ZXh0LlxyXG5cdCAqL1xyXG5cdHVwZGF0ZVZpZXdwb3J0KCAvKnJlbmRlckNvbnRleHQqLyApIHt9XHJcblxyXG5cdC8vIHV0aWxzXHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBnaXZlbiAzRCBvYmplY3QgaXMgZnVsbHkgb2NjbHVkZWQgYnkgb3RoZXJcclxuXHQgKiAzRCBvYmplY3RzIGluIHRoZSBzY2VuZS4gQmFja2VuZHMgbXVzdCBpbXBsZW1lbnQgdGhpcyBtZXRob2QgYnkgdXNpbmdcclxuXHQgKiBhIE9jY2x1c2lvbiBRdWVyeSBBUEkuXHJcblx0ICpcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcGFyYW0ge1JlbmRlckNvbnRleHR9IHJlbmRlckNvbnRleHQgLSBUaGUgcmVuZGVyIGNvbnRleHQuXHJcblx0ICogQHBhcmFtIHtPYmplY3QzRH0gb2JqZWN0IC0gVGhlIDNEIG9iamVjdCB0byB0ZXN0LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIDNEIG9iamVjdCBpcyBmdWxseSBvY2NsdWRlZCBvciBub3QuXHJcblx0ICovXHJcblx0aXNPY2NsdWRlZCggLypyZW5kZXJDb250ZXh0LCBvYmplY3QqLyApIHt9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlc29sdmVzIHRoZSB0aW1lIHN0YW1wIGZvciB0aGUgZ2l2ZW4gcmVuZGVyIGNvbnRleHQgYW5kIHR5cGUuXHJcblx0ICpcclxuXHQgKiBAYXN5bmNcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW3R5cGU9J3JlbmRlciddIC0gVGhlIHR5cGUgb2YgdGhlIHRpbWUgc3RhbXAuXHJcblx0ICogQHJldHVybiB7UHJvbWlzZTxudW1iZXI+fSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSB0aW1lIHN0YW1wLlxyXG5cdCAqL1xyXG5cdGFzeW5jIHJlc29sdmVUaW1lc3RhbXBzQXN5bmMoIHR5cGUgPSAncmVuZGVyJyApIHtcclxuXHJcblx0XHRpZiAoICEgdGhpcy50cmFja1RpbWVzdGFtcCApIHtcclxuXHJcblx0XHRcdHdhcm5PbmNlKCAnV2ViR1BVUmVuZGVyZXI6IFRpbWVzdGFtcCB0cmFja2luZyBpcyBkaXNhYmxlZC4nICk7XHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgcXVlcnlQb29sID0gdGhpcy50aW1lc3RhbXBRdWVyeVBvb2xbIHR5cGUgXTtcclxuXHRcdGlmICggISBxdWVyeVBvb2wgKSB7XHJcblxyXG5cdFx0XHR3YXJuT25jZSggYFdlYkdQVVJlbmRlcmVyOiBObyB0aW1lc3RhbXAgcXVlcnkgcG9vbCBmb3IgdHlwZSAnJHt0eXBlfScgZm91bmQuYCApO1xyXG5cdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGR1cmF0aW9uID0gYXdhaXQgcXVlcnlQb29sLnJlc29sdmVRdWVyaWVzQXN5bmMoKTtcclxuXHJcblx0XHR0aGlzLnJlbmRlcmVyLmluZm9bIHR5cGUgXS50aW1lc3RhbXAgPSBkdXJhdGlvbjtcclxuXHJcblx0XHRyZXR1cm4gZHVyYXRpb247XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2FuIGJlIHVzZWQgdG8gc3luY2hyb25pemUgQ1BVIG9wZXJhdGlvbnMgd2l0aCBHUFUgdGFza3MuIFNvIHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLFxyXG5cdCAqIHRoZSBDUFUgd2FpdHMgZm9yIHRoZSBHUFUgdG8gY29tcGxldGUgaXRzIG9wZXJhdGlvbiAoZS5nLiBhIGNvbXB1dGUgdGFzaykuXHJcblx0ICpcclxuXHQgKiBAYXN5bmNcclxuXHQgKiBAYWJzdHJhY3RcclxuXHQgKiBAcmV0dXJuIHtQcm9taXNlfSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHN5bmNocm9uaXphdGlvbiBoYXMgYmVlbiBmaW5pc2hlZC5cclxuXHQgKi9cclxuXHRhc3luYyB3YWl0Rm9yR1BVKCkge31cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgcGVyZm9ybXMgYSByZWFkYmFjayBvcGVyYXRpb24gYnkgbW92aW5nIGJ1ZmZlciBkYXRhIGZyb21cclxuXHQgKiBhIHN0b3JhZ2UgYnVmZmVyIGF0dHJpYnV0ZSBmcm9tIHRoZSBHUFUgdG8gdGhlIENQVS5cclxuXHQgKlxyXG5cdCAqIEBhc3luY1xyXG5cdCAqIEBwYXJhbSB7U3RvcmFnZUJ1ZmZlckF0dHJpYnV0ZX0gYXR0cmlidXRlIC0gVGhlIHN0b3JhZ2UgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKiBAcmV0dXJuIHtQcm9taXNlPEFycmF5QnVmZmVyPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgYnVmZmVyIGRhdGEgd2hlbiB0aGUgZGF0YSBhcmUgcmVhZHkuXHJcblx0ICovXHJcblx0YXN5bmMgZ2V0QXJyYXlCdWZmZXJBc3luYyggLyogYXR0cmlidXRlICovICkge31cclxuXHJcblx0LyoqXHJcblx0ICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgYmFja2VuZC5cclxuXHQgKlxyXG5cdCAqIEBhc3luY1xyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIGZlYXR1cmUncyBuYW1lLlxyXG5cdCAqIEByZXR1cm4ge1Byb21pc2U8Ym9vbGVhbj59IEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggYSBib29sIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIG9yIG5vdC5cclxuXHQgKi9cclxuXHRhc3luYyBoYXNGZWF0dXJlQXN5bmMoIC8qbmFtZSovICkgeyB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgIGJ5IHRoZSBiYWNrZW5kLlxyXG5cdCAqXHJcblx0ICogQGFic3RyYWN0XHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgZmVhdHVyZSdzIG5hbWUuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGhhc0ZlYXR1cmUoIC8qbmFtZSovICkge31cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgbWF4aW11bSBhbmlzb3Ryb3B5IHRleHR1cmUgZmlsdGVyaW5nIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQGFic3RyYWN0XHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgbWF4aW11bSBhbmlzb3Ryb3B5IHRleHR1cmUgZmlsdGVyaW5nIHZhbHVlLlxyXG5cdCAqL1xyXG5cdGdldE1heEFuaXNvdHJvcHkoKSB7fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBkcmF3aW5nIGJ1ZmZlciBzaXplLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7VmVjdG9yMn0gVGhlIGRyYXdpbmcgYnVmZmVyIHNpemUuXHJcblx0ICovXHJcblx0Z2V0RHJhd2luZ0J1ZmZlclNpemUoKSB7XHJcblxyXG5cdFx0X3ZlY3RvcjIgPSBfdmVjdG9yMiB8fCBuZXcgVmVjdG9yMigpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLnJlbmRlcmVyLmdldERyYXdpbmdCdWZmZXJTaXplKCBfdmVjdG9yMiApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgdGhlIHNjaXNzb3IgdGVzdC5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gYm9vbGVhbiAtIFdoZXRoZXIgdGhlIHNjaXNzb3IgdGVzdCBzaG91bGQgYmUgZW5hYmxlZCBvciBub3QuXHJcblx0ICovXHJcblx0c2V0U2Npc3NvclRlc3QoIC8qYm9vbGVhbiovICkgeyB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGNsZWFyIGNvbG9yIGFuZCBhbHBoYSBpbnRvIGEgc2luZ2xlXHJcblx0ICogY29sb3Igb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Q29sb3I0fSBUaGUgY2xlYXIgY29sb3IuXHJcblx0ICovXHJcblx0Z2V0Q2xlYXJDb2xvcigpIHtcclxuXHJcblx0XHRjb25zdCByZW5kZXJlciA9IHRoaXMucmVuZGVyZXI7XHJcblxyXG5cdFx0X2NvbG9yNCA9IF9jb2xvcjQgfHwgbmV3IENvbG9yNCgpO1xyXG5cclxuXHRcdHJlbmRlcmVyLmdldENsZWFyQ29sb3IoIF9jb2xvcjQgKTtcclxuXHJcblx0XHRfY29sb3I0LmdldFJHQiggX2NvbG9yNCApO1xyXG5cclxuXHRcdHJldHVybiBfY29sb3I0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIERPTSBlbGVtZW50LiBJZiBubyBET00gZWxlbWVudCBleGlzdHMsIHRoZSBiYWNrZW5kXHJcblx0ICogY3JlYXRlcyBhIG5ldyBvbmUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtIVE1MQ2FudmFzRWxlbWVudH0gVGhlIERPTSBlbGVtZW50LlxyXG5cdCAqL1xyXG5cdGdldERvbUVsZW1lbnQoKSB7XHJcblxyXG5cdFx0bGV0IGRvbUVsZW1lbnQgPSB0aGlzLmRvbUVsZW1lbnQ7XHJcblxyXG5cdFx0aWYgKCBkb21FbGVtZW50ID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0ZG9tRWxlbWVudCA9ICggdGhpcy5wYXJhbWV0ZXJzLmNhbnZhcyAhPT0gdW5kZWZpbmVkICkgPyB0aGlzLnBhcmFtZXRlcnMuY2FudmFzIDogY3JlYXRlQ2FudmFzRWxlbWVudCgpO1xyXG5cclxuXHRcdFx0Ly8gT2Zmc2NyZWVuQ2FudmFzIGRvZXMgbm90IGhhdmUgc2V0QXR0cmlidXRlLCBzZWUgIzIyODExXHJcblx0XHRcdGlmICggJ3NldEF0dHJpYnV0ZScgaW4gZG9tRWxlbWVudCApIGRvbUVsZW1lbnQuc2V0QXR0cmlidXRlKCAnZGF0YS1lbmdpbmUnLCBgdGhyZWUuanMgciR7UkVWSVNJT059IHdlYmdwdWAgKTtcclxuXHJcblx0XHRcdHRoaXMuZG9tRWxlbWVudCA9IGRvbUVsZW1lbnQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBkb21FbGVtZW50O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgYSBkaWN0aW9uYXJ5IGZvciB0aGUgZ2l2ZW4gb2JqZWN0IGludG8gdGhlXHJcblx0ICogaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IC0gVGhlIG9iamVjdC5cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gdmFsdWUgLSBUaGUgZGljdGlvbmFyeSB0byBzZXQuXHJcblx0ICovXHJcblx0c2V0KCBvYmplY3QsIHZhbHVlICkge1xyXG5cclxuXHRcdHRoaXMuZGF0YS5zZXQoIG9iamVjdCwgdmFsdWUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBkaWN0aW9uYXJ5IGZvciB0aGUgZ2l2ZW4gb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCAtIFRoZSBvYmplY3QuXHJcblx0ICogQHJldHVybiB7T2JqZWN0fSBUaGUgb2JqZWN0J3MgZGljdGlvbmFyeS5cclxuXHQgKi9cclxuXHRnZXQoIG9iamVjdCApIHtcclxuXHJcblx0XHRsZXQgbWFwID0gdGhpcy5kYXRhLmdldCggb2JqZWN0ICk7XHJcblxyXG5cdFx0aWYgKCBtYXAgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdG1hcCA9IHt9O1xyXG5cdFx0XHR0aGlzLmRhdGEuc2V0KCBvYmplY3QsIG1hcCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbWFwO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGhhcyBhIGRpY3Rpb25hcnlcclxuXHQgKiB3aXRoIGRhdGEgZGVmaW5lZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgLSBUaGUgb2JqZWN0LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgYSBkaWN0aW9uYXJ5IGZvciB0aGUgZ2l2ZW4gb2JqZWN0IGFzIGJlZW4gZGVmaW5lZCBvciBub3QuXHJcblx0ICovXHJcblx0aGFzKCBvYmplY3QgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5oYXMoIG9iamVjdCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlbGV0ZXMgYW4gb2JqZWN0IGZyb20gdGhlIGludGVybmFsIGRhdGEgc3RydWN0dXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCAtIFRoZSBvYmplY3QgdG8gZGVsZXRlLlxyXG5cdCAqL1xyXG5cdGRlbGV0ZSggb2JqZWN0ICkge1xyXG5cclxuXHRcdHRoaXMuZGF0YS5kZWxldGUoIG9iamVjdCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZyZWVzIGludGVybmFsIHJlc291cmNlcy5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqL1xyXG5cdGRpc3Bvc2UoKSB7IH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEJhY2tlbmQ7XHJcbiIsImltcG9ydCB7IEludFR5cGUgfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMuanMnO1xyXG5cclxubGV0IF9pZCA9IDA7XHJcblxyXG4vKipcclxuICogVGhpcyBtb2R1bGUgaXMgaW50ZXJuYWxseSB1c2VkIGluIGNvbnRleHQgb2YgY29tcHV0ZSBzaGFkZXJzLlxyXG4gKiBUaGlzIHR5cGUgb2Ygc2hhZGVyIGlzIG5vdCBuYXRpdmVseSBzdXBwb3J0ZWQgaW4gV2ViR0wgMiBhbmRcclxuICogdGh1cyBpbXBsZW1lbnRlZCB2aWEgVHJhbnNmb3JtIEZlZWRiYWNrLiBgRHVhbEF0dHJpYnV0ZURhdGFgXHJcbiAqIG1hbmFnZXMgdGhlIHJlbGF0ZWQgZGF0YS5cclxuICpcclxuICogQHByaXZhdGVcclxuICovXHJcbmNsYXNzIER1YWxBdHRyaWJ1dGVEYXRhIHtcclxuXHJcblx0Y29uc3RydWN0b3IoIGF0dHJpYnV0ZURhdGEsIGR1YWxCdWZmZXIgKSB7XHJcblxyXG5cdFx0dGhpcy5idWZmZXJzID0gWyBhdHRyaWJ1dGVEYXRhLmJ1ZmZlckdQVSwgZHVhbEJ1ZmZlciBdO1xyXG5cdFx0dGhpcy50eXBlID0gYXR0cmlidXRlRGF0YS50eXBlO1xyXG5cdFx0dGhpcy5idWZmZXJUeXBlID0gYXR0cmlidXRlRGF0YS5idWZmZXJUeXBlO1xyXG5cdFx0dGhpcy5wYm8gPSBhdHRyaWJ1dGVEYXRhLnBibztcclxuXHRcdHRoaXMuYnl0ZUxlbmd0aCA9IGF0dHJpYnV0ZURhdGEuYnl0ZUxlbmd0aDtcclxuXHRcdHRoaXMuYnl0ZXNQZXJFbGVtZW50ID0gYXR0cmlidXRlRGF0YS5CWVRFU19QRVJfRUxFTUVOVDtcclxuXHRcdHRoaXMudmVyc2lvbiA9IGF0dHJpYnV0ZURhdGEudmVyc2lvbjtcclxuXHRcdHRoaXMuaXNJbnRlZ2VyID0gYXR0cmlidXRlRGF0YS5pc0ludGVnZXI7XHJcblx0XHR0aGlzLmFjdGl2ZUJ1ZmZlckluZGV4ID0gMDtcclxuXHRcdHRoaXMuYmFzZUlkID0gYXR0cmlidXRlRGF0YS5pZDtcclxuXHJcblx0fVxyXG5cclxuXHJcblx0Z2V0IGlkKCkge1xyXG5cclxuXHRcdHJldHVybiBgJHsgdGhpcy5iYXNlSWQgfXwkeyB0aGlzLmFjdGl2ZUJ1ZmZlckluZGV4IH1gO1xyXG5cclxuXHR9XHJcblxyXG5cdGdldCBidWZmZXJHUFUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuYnVmZmVyc1sgdGhpcy5hY3RpdmVCdWZmZXJJbmRleCBdO1xyXG5cclxuXHR9XHJcblxyXG5cdGdldCB0cmFuc2Zvcm1CdWZmZXIoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuYnVmZmVyc1sgdGhpcy5hY3RpdmVCdWZmZXJJbmRleCBeIDEgXTtcclxuXHJcblx0fVxyXG5cclxuXHRzd2l0Y2hCdWZmZXJzKCkge1xyXG5cclxuXHRcdHRoaXMuYWN0aXZlQnVmZmVySW5kZXggXj0gMTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIEEgV2ViR0wgMiBiYWNrZW5kIHV0aWxpdHkgbW9kdWxlIGZvciBtYW5hZ2luZyBzaGFkZXIgYXR0cmlidXRlcy5cclxuICpcclxuICogQHByaXZhdGVcclxuICovXHJcbmNsYXNzIFdlYkdMQXR0cmlidXRlVXRpbHMge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHV0aWxpdHkgb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHTEJhY2tlbmR9IGJhY2tlbmQgLSBUaGUgV2ViR0wgMiBiYWNrZW5kLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBiYWNrZW5kICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIFdlYkdMIDIgYmFja2VuZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2ViR0xCYWNrZW5kfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJhY2tlbmQgPSBiYWNrZW5kO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgdGhlIEdQVSBidWZmZXIgZm9yIHRoZSBnaXZlbiBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCdWZmZXJBdHRyaWJ1dGV9IGF0dHJpYnV0ZSAtIFRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqIEBwYXJhbSB7R0xlbnVtIH0gYnVmZmVyVHlwZSAtIEEgZmxhZyB0aGF0IGluZGljYXRlcyB0aGUgYnVmZmVyIHR5cGUgYW5kIHRodXMgYmluZGluZyBwb2ludCB0YXJnZXQuXHJcblx0ICovXHJcblx0Y3JlYXRlQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGJ1ZmZlclR5cGUgKSB7XHJcblxyXG5cdFx0Y29uc3QgYmFja2VuZCA9IHRoaXMuYmFja2VuZDtcclxuXHRcdGNvbnN0IHsgZ2wgfSA9IGJhY2tlbmQ7XHJcblxyXG5cdFx0Y29uc3QgYXJyYXkgPSBhdHRyaWJ1dGUuYXJyYXk7XHJcblx0XHRjb25zdCB1c2FnZSA9IGF0dHJpYnV0ZS51c2FnZSB8fCBnbC5TVEFUSUNfRFJBVztcclxuXHJcblx0XHRjb25zdCBidWZmZXJBdHRyaWJ1dGUgPSBhdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSA/IGF0dHJpYnV0ZS5kYXRhIDogYXR0cmlidXRlO1xyXG5cdFx0Y29uc3QgYnVmZmVyRGF0YSA9IGJhY2tlbmQuZ2V0KCBidWZmZXJBdHRyaWJ1dGUgKTtcclxuXHJcblx0XHRsZXQgYnVmZmVyR1BVID0gYnVmZmVyRGF0YS5idWZmZXJHUFU7XHJcblxyXG5cdFx0aWYgKCBidWZmZXJHUFUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGJ1ZmZlckdQVSA9IHRoaXMuX2NyZWF0ZUJ1ZmZlciggZ2wsIGJ1ZmZlclR5cGUsIGFycmF5LCB1c2FnZSApO1xyXG5cclxuXHRcdFx0YnVmZmVyRGF0YS5idWZmZXJHUFUgPSBidWZmZXJHUFU7XHJcblx0XHRcdGJ1ZmZlckRhdGEuYnVmZmVyVHlwZSA9IGJ1ZmZlclR5cGU7XHJcblx0XHRcdGJ1ZmZlckRhdGEudmVyc2lvbiA9IGJ1ZmZlckF0dHJpYnV0ZS52ZXJzaW9uO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvL2F0dHJpYnV0ZS5vblVwbG9hZENhbGxiYWNrKCk7XHJcblxyXG5cdFx0bGV0IHR5cGU7XHJcblxyXG5cdFx0aWYgKCBhcnJheSBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSApIHtcclxuXHJcblx0XHRcdHR5cGUgPSBnbC5GTE9BVDtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIFVpbnQxNkFycmF5ICkge1xyXG5cclxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUuaXNGbG9hdDE2QnVmZmVyQXR0cmlidXRlICkge1xyXG5cclxuXHRcdFx0XHR0eXBlID0gZ2wuSEFMRl9GTE9BVDtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHR5cGUgPSBnbC5VTlNJR05FRF9TSE9SVDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIEludDE2QXJyYXkgKSB7XHJcblxyXG5cdFx0XHR0eXBlID0gZ2wuU0hPUlQ7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBVaW50MzJBcnJheSApIHtcclxuXHJcblx0XHRcdHR5cGUgPSBnbC5VTlNJR05FRF9JTlQ7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBJbnQzMkFycmF5ICkge1xyXG5cclxuXHRcdFx0dHlwZSA9IGdsLklOVDtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIEludDhBcnJheSApIHtcclxuXHJcblx0XHRcdHR5cGUgPSBnbC5CWVRFO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGFycmF5IGluc3RhbmNlb2YgVWludDhBcnJheSApIHtcclxuXHJcblx0XHRcdHR5cGUgPSBnbC5VTlNJR05FRF9CWVRFO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGFycmF5IGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXkgKSB7XHJcblxyXG5cdFx0XHR0eXBlID0gZ2wuVU5TSUdORURfQllURTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuV2ViR0xCYWNrZW5kOiBVbnN1cHBvcnRlZCBidWZmZXIgZGF0YSBmb3JtYXQ6ICcgKyBhcnJheSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRsZXQgYXR0cmlidXRlRGF0YSA9IHtcclxuXHRcdFx0YnVmZmVyR1BVLFxyXG5cdFx0XHRidWZmZXJUeXBlLFxyXG5cdFx0XHR0eXBlLFxyXG5cdFx0XHRieXRlTGVuZ3RoOiBhcnJheS5ieXRlTGVuZ3RoLFxyXG5cdFx0XHRieXRlc1BlckVsZW1lbnQ6IGFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULFxyXG5cdFx0XHR2ZXJzaW9uOiBhdHRyaWJ1dGUudmVyc2lvbixcclxuXHRcdFx0cGJvOiBhdHRyaWJ1dGUucGJvLFxyXG5cdFx0XHRpc0ludGVnZXI6IHR5cGUgPT09IGdsLklOVCB8fCB0eXBlID09PSBnbC5VTlNJR05FRF9JTlQgfHwgYXR0cmlidXRlLmdwdVR5cGUgPT09IEludFR5cGUsXHJcblx0XHRcdGlkOiBfaWQgKytcclxuXHRcdH07XHJcblxyXG5cdFx0aWYgKCBhdHRyaWJ1dGUuaXNTdG9yYWdlQnVmZmVyQXR0cmlidXRlIHx8IGF0dHJpYnV0ZS5pc1N0b3JhZ2VJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUgKSB7XHJcblxyXG5cdFx0XHQvLyBjcmVhdGUgYnVmZmVyIGZvciB0cmFuc2Zvcm0gZmVlZGJhY2sgdXNlXHJcblx0XHRcdGNvbnN0IGJ1ZmZlckdQVUR1YWwgPSB0aGlzLl9jcmVhdGVCdWZmZXIoIGdsLCBidWZmZXJUeXBlLCBhcnJheSwgdXNhZ2UgKTtcclxuXHRcdFx0YXR0cmlidXRlRGF0YSA9IG5ldyBEdWFsQXR0cmlidXRlRGF0YSggYXR0cmlidXRlRGF0YSwgYnVmZmVyR1BVRHVhbCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRiYWNrZW5kLnNldCggYXR0cmlidXRlLCBhdHRyaWJ1dGVEYXRhICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgR1BVIGJ1ZmZlciBvZiB0aGUgZ2l2ZW4gYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyQXR0cmlidXRlfSBhdHRyaWJ1dGUgLSBUaGUgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKi9cclxuXHR1cGRhdGVBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApIHtcclxuXHJcblx0XHRjb25zdCBiYWNrZW5kID0gdGhpcy5iYWNrZW5kO1xyXG5cdFx0Y29uc3QgeyBnbCB9ID0gYmFja2VuZDtcclxuXHJcblx0XHRjb25zdCBhcnJheSA9IGF0dHJpYnV0ZS5hcnJheTtcclxuXHRcdGNvbnN0IGJ1ZmZlckF0dHJpYnV0ZSA9IGF0dHJpYnV0ZS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlID8gYXR0cmlidXRlLmRhdGEgOiBhdHRyaWJ1dGU7XHJcblx0XHRjb25zdCBidWZmZXJEYXRhID0gYmFja2VuZC5nZXQoIGJ1ZmZlckF0dHJpYnV0ZSApO1xyXG5cdFx0Y29uc3QgYnVmZmVyVHlwZSA9IGJ1ZmZlckRhdGEuYnVmZmVyVHlwZTtcclxuXHRcdGNvbnN0IHVwZGF0ZVJhbmdlcyA9IGF0dHJpYnV0ZS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlID8gYXR0cmlidXRlLmRhdGEudXBkYXRlUmFuZ2VzIDogYXR0cmlidXRlLnVwZGF0ZVJhbmdlcztcclxuXHJcblx0XHRnbC5iaW5kQnVmZmVyKCBidWZmZXJUeXBlLCBidWZmZXJEYXRhLmJ1ZmZlckdQVSApO1xyXG5cclxuXHRcdGlmICggdXBkYXRlUmFuZ2VzLmxlbmd0aCA9PT0gMCApIHtcclxuXHJcblx0XHRcdC8vIE5vdCB1c2luZyB1cGRhdGUgcmFuZ2VzXHJcblxyXG5cdFx0XHRnbC5idWZmZXJTdWJEYXRhKCBidWZmZXJUeXBlLCAwLCBhcnJheSApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSB1cGRhdGVSYW5nZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgcmFuZ2UgPSB1cGRhdGVSYW5nZXNbIGkgXTtcclxuXHRcdFx0XHRnbC5idWZmZXJTdWJEYXRhKCBidWZmZXJUeXBlLCByYW5nZS5zdGFydCAqIGFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULFxyXG5cdFx0XHRcdFx0YXJyYXksIHJhbmdlLnN0YXJ0LCByYW5nZS5jb3VudCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0YnVmZmVyQXR0cmlidXRlLmNsZWFyVXBkYXRlUmFuZ2VzKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGdsLmJpbmRCdWZmZXIoIGJ1ZmZlclR5cGUsIG51bGwgKTtcclxuXHJcblx0XHRidWZmZXJEYXRhLnZlcnNpb24gPSBidWZmZXJBdHRyaWJ1dGUudmVyc2lvbjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZXN0cm95cyB0aGUgR1BVIGJ1ZmZlciBvZiB0aGUgZ2l2ZW4gYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyQXR0cmlidXRlfSBhdHRyaWJ1dGUgLSBUaGUgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKi9cclxuXHRkZXN0cm95QXR0cmlidXRlKCBhdHRyaWJ1dGUgKSB7XHJcblxyXG5cdFx0Y29uc3QgYmFja2VuZCA9IHRoaXMuYmFja2VuZDtcclxuXHRcdGNvbnN0IHsgZ2wgfSA9IGJhY2tlbmQ7XHJcblxyXG5cdFx0aWYgKCBhdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApIHtcclxuXHJcblx0XHRcdGJhY2tlbmQuZGVsZXRlKCBhdHRyaWJ1dGUuZGF0YSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBhdHRyaWJ1dGVEYXRhID0gYmFja2VuZC5nZXQoIGF0dHJpYnV0ZSApO1xyXG5cclxuXHRcdGdsLmRlbGV0ZUJ1ZmZlciggYXR0cmlidXRlRGF0YS5idWZmZXJHUFUgKTtcclxuXHJcblx0XHRiYWNrZW5kLmRlbGV0ZSggYXR0cmlidXRlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgcGVyZm9ybXMgYSByZWFkYmFjayBvcGVyYXRpb24gYnkgbW92aW5nIGJ1ZmZlciBkYXRhIGZyb21cclxuXHQgKiBhIHN0b3JhZ2UgYnVmZmVyIGF0dHJpYnV0ZSBmcm9tIHRoZSBHUFUgdG8gdGhlIENQVS5cclxuXHQgKlxyXG5cdCAqIEBhc3luY1xyXG5cdCAqIEBwYXJhbSB7U3RvcmFnZUJ1ZmZlckF0dHJpYnV0ZX0gYXR0cmlidXRlIC0gVGhlIHN0b3JhZ2UgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKiBAcmV0dXJuIHtQcm9taXNlPEFycmF5QnVmZmVyPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgYnVmZmVyIGRhdGEgd2hlbiB0aGUgZGF0YSBhcmUgcmVhZHkuXHJcblx0ICovXHJcblx0YXN5bmMgZ2V0QXJyYXlCdWZmZXJBc3luYyggYXR0cmlidXRlICkge1xyXG5cclxuXHRcdGNvbnN0IGJhY2tlbmQgPSB0aGlzLmJhY2tlbmQ7XHJcblx0XHRjb25zdCB7IGdsIH0gPSBiYWNrZW5kO1xyXG5cclxuXHRcdGNvbnN0IGJ1ZmZlckF0dHJpYnV0ZSA9IGF0dHJpYnV0ZS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlID8gYXR0cmlidXRlLmRhdGEgOiBhdHRyaWJ1dGU7XHJcblx0XHRjb25zdCB7IGJ1ZmZlckdQVSB9ID0gYmFja2VuZC5nZXQoIGJ1ZmZlckF0dHJpYnV0ZSApO1xyXG5cclxuXHRcdGNvbnN0IGFycmF5ID0gYXR0cmlidXRlLmFycmF5O1xyXG5cdFx0Y29uc3QgYnl0ZUxlbmd0aCA9IGFycmF5LmJ5dGVMZW5ndGg7XHJcblxyXG5cdFx0Z2wuYmluZEJ1ZmZlciggZ2wuQ09QWV9SRUFEX0JVRkZFUiwgYnVmZmVyR1BVICk7XHJcblxyXG5cdFx0Y29uc3Qgd3JpdGVCdWZmZXIgPSBnbC5jcmVhdGVCdWZmZXIoKTtcclxuXHJcblx0XHRnbC5iaW5kQnVmZmVyKCBnbC5DT1BZX1dSSVRFX0JVRkZFUiwgd3JpdGVCdWZmZXIgKTtcclxuXHRcdGdsLmJ1ZmZlckRhdGEoIGdsLkNPUFlfV1JJVEVfQlVGRkVSLCBieXRlTGVuZ3RoLCBnbC5TVFJFQU1fUkVBRCApO1xyXG5cclxuXHRcdGdsLmNvcHlCdWZmZXJTdWJEYXRhKCBnbC5DT1BZX1JFQURfQlVGRkVSLCBnbC5DT1BZX1dSSVRFX0JVRkZFUiwgMCwgMCwgYnl0ZUxlbmd0aCApO1xyXG5cclxuXHRcdGF3YWl0IGJhY2tlbmQudXRpbHMuX2NsaWVudFdhaXRBc3luYygpO1xyXG5cclxuXHRcdGNvbnN0IGRzdEJ1ZmZlciA9IG5ldyBhdHRyaWJ1dGUuYXJyYXkuY29uc3RydWN0b3IoIGFycmF5Lmxlbmd0aCApO1xyXG5cclxuXHRcdC8vIEVuc3VyZSB0aGUgYnVmZmVyIGlzIGJvdW5kIGJlZm9yZSByZWFkaW5nXHJcblx0XHRnbC5iaW5kQnVmZmVyKCBnbC5DT1BZX1dSSVRFX0JVRkZFUiwgd3JpdGVCdWZmZXIgKTtcclxuXHJcblx0XHRnbC5nZXRCdWZmZXJTdWJEYXRhKCBnbC5DT1BZX1dSSVRFX0JVRkZFUiwgMCwgZHN0QnVmZmVyICk7XHJcblxyXG5cdFx0Z2wuZGVsZXRlQnVmZmVyKCB3cml0ZUJ1ZmZlciApO1xyXG5cclxuXHRcdGdsLmJpbmRCdWZmZXIoIGdsLkNPUFlfUkVBRF9CVUZGRVIsIG51bGwgKTtcclxuXHRcdGdsLmJpbmRCdWZmZXIoIGdsLkNPUFlfV1JJVEVfQlVGRkVSLCBudWxsICk7XHJcblxyXG5cdFx0cmV0dXJuIGRzdEJ1ZmZlci5idWZmZXI7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyBhIFdlYkdMIGJ1ZmZlciB3aXRoIHRoZSBnaXZlbiBkYXRhLlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge1dlYkdMMlJlbmRlcmluZ0NvbnRleHR9IGdsIC0gVGhlIHJlbmRlcmluZyBjb250ZXh0LlxyXG5cdCAqIEBwYXJhbSB7R0xlbnVtIH0gYnVmZmVyVHlwZSAtIEEgZmxhZyB0aGF0IGluZGljYXRlcyB0aGUgYnVmZmVyIHR5cGUgYW5kIHRodXMgYmluZGluZyBwb2ludCB0YXJnZXQuXHJcblx0ICogQHBhcmFtIHtUeXBlZEFycmF5fSBhcnJheSAtIFRoZSBhcnJheSBvZiB0aGUgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKiBAcGFyYW0ge0dMZW51bX0gdXNhZ2UgLSBUaGUgdXNhZ2UuXHJcblx0ICogQHJldHVybiB7V2ViR0xCdWZmZXJ9IFRoZSBXZWJHTCBidWZmZXIuXHJcblx0ICovXHJcblx0X2NyZWF0ZUJ1ZmZlciggZ2wsIGJ1ZmZlclR5cGUsIGFycmF5LCB1c2FnZSApIHtcclxuXHJcblx0XHRjb25zdCBidWZmZXJHUFUgPSBnbC5jcmVhdGVCdWZmZXIoKTtcclxuXHJcblx0XHRnbC5iaW5kQnVmZmVyKCBidWZmZXJUeXBlLCBidWZmZXJHUFUgKTtcclxuXHRcdGdsLmJ1ZmZlckRhdGEoIGJ1ZmZlclR5cGUsIGFycmF5LCB1c2FnZSApO1xyXG5cdFx0Z2wuYmluZEJ1ZmZlciggYnVmZmVyVHlwZSwgbnVsbCApO1xyXG5cclxuXHRcdHJldHVybiBidWZmZXJHUFU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFdlYkdMQXR0cmlidXRlVXRpbHM7XHJcbiIsImltcG9ydCB7XHJcblx0Q3VsbEZhY2VOb25lLCBDdWxsRmFjZUJhY2ssIEN1bGxGYWNlRnJvbnQsIERvdWJsZVNpZGUsIEJhY2tTaWRlLFxyXG5cdE5vcm1hbEJsZW5kaW5nLCBOb0JsZW5kaW5nLCBDdXN0b21CbGVuZGluZywgQWRkRXF1YXRpb24sXHJcblx0QWRkaXRpdmVCbGVuZGluZywgU3VidHJhY3RpdmVCbGVuZGluZywgTXVsdGlwbHlCbGVuZGluZywgU3VidHJhY3RFcXVhdGlvbiwgUmV2ZXJzZVN1YnRyYWN0RXF1YXRpb24sXHJcblx0WmVyb0ZhY3RvciwgT25lRmFjdG9yLCBTcmNDb2xvckZhY3RvciwgU3JjQWxwaGFGYWN0b3IsIFNyY0FscGhhU2F0dXJhdGVGYWN0b3IsIERzdENvbG9yRmFjdG9yLCBEc3RBbHBoYUZhY3RvcixcclxuXHRPbmVNaW51c1NyY0NvbG9yRmFjdG9yLCBPbmVNaW51c1NyY0FscGhhRmFjdG9yLCBPbmVNaW51c0RzdENvbG9yRmFjdG9yLCBPbmVNaW51c0RzdEFscGhhRmFjdG9yLFxyXG5cdE5ldmVyRGVwdGgsIEFsd2F5c0RlcHRoLCBMZXNzRGVwdGgsIExlc3NFcXVhbERlcHRoLCBFcXVhbERlcHRoLCBHcmVhdGVyRXF1YWxEZXB0aCwgR3JlYXRlckRlcHRoLCBOb3RFcXVhbERlcHRoXHJcbn0gZnJvbSAnLi4vLi4vLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgVmVjdG9yNCB9IGZyb20gJy4uLy4uLy4uL21hdGgvVmVjdG9yNC5qcyc7XHJcblxyXG5sZXQgZXF1YXRpb25Ub0dMLCBmYWN0b3JUb0dMO1xyXG5cclxuLyoqXHJcbiAqIEEgV2ViR0wgMiBiYWNrZW5kIHV0aWxpdHkgbW9kdWxlIGZvciBtYW5hZ2luZyB0aGUgV2ViR0wgc3RhdGUuXHJcbiAqXHJcbiAqIFRoZSBtYWpvciBnb2FsIG9mIHRoaXMgbW9kdWxlIGlzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHN0YXRlIGNoYW5nZXNcclxuICogYnkgY2FjaGluZyB0aGUgV0ViR0wgc3RhdGUgd2l0aCBhIHNlcmllcyBvZiB2YXJpYWJsZXMuIEluIHRoaXMgd2F5LCB0aGVcclxuICogcmVuZGVyZXIgb25seSBleGVjdXRlcyBzdGF0ZSBjaGFuZ2UgY29tbWFuZHMgd2hlbiBuZWNlc3Nhcnkgd2hpY2hcclxuICogaW1wcm92ZXMgdGhlIG92ZXJhbGwgcGVyZm9ybWFuY2UuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5jbGFzcyBXZWJHTFN0YXRlIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB1dGlsaXR5IG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xCYWNrZW5kfSBiYWNrZW5kIC0gVGhlIFdlYkdMIDIgYmFja2VuZC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggYmFja2VuZCApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIHRoZSBXZWJHTCAyIGJhY2tlbmQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1dlYkdMQmFja2VuZH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5iYWNrZW5kID0gYmFja2VuZDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIHRoZSByZW5kZXJpbmcgY29udGV4dC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2ViR0wyUmVuZGVyaW5nQ29udGV4dH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5nbCA9IHRoaXMuYmFja2VuZC5nbDtcclxuXHJcblx0XHQvLyBCZWxvdyBwcm9wZXJ0aWVzIGFyZSBpbnRlbmRlZCB0byBjYWNoZVxyXG5cdFx0Ly8gdGhlIFdlYkdMIHN0YXRlIGFuZCBhcmUgbm90IGV4cGxpY2l0bHlcclxuXHRcdC8vIGRvY3VtZW50ZWQgZm9yIGNvbnZlbmllbmNlIHJlYXNvbnMuXHJcblxyXG5cdFx0dGhpcy5lbmFibGVkID0ge307XHJcblx0XHR0aGlzLmN1cnJlbnRGbGlwU2lkZWQgPSBudWxsO1xyXG5cdFx0dGhpcy5jdXJyZW50Q3VsbEZhY2UgPSBudWxsO1xyXG5cdFx0dGhpcy5jdXJyZW50UHJvZ3JhbSA9IG51bGw7XHJcblx0XHR0aGlzLmN1cnJlbnRCbGVuZGluZ0VuYWJsZWQgPSBmYWxzZTtcclxuXHRcdHRoaXMuY3VycmVudEJsZW5kaW5nID0gbnVsbDtcclxuXHRcdHRoaXMuY3VycmVudEJsZW5kU3JjID0gbnVsbDtcclxuXHRcdHRoaXMuY3VycmVudEJsZW5kRHN0ID0gbnVsbDtcclxuXHRcdHRoaXMuY3VycmVudEJsZW5kU3JjQWxwaGEgPSBudWxsO1xyXG5cdFx0dGhpcy5jdXJyZW50QmxlbmREc3RBbHBoYSA9IG51bGw7XHJcblx0XHR0aGlzLmN1cnJlbnRQcmVtdWx0aXBsZWRBbHBoYSA9IG51bGw7XHJcblx0XHR0aGlzLmN1cnJlbnRQb2x5Z29uT2Zmc2V0RmFjdG9yID0gbnVsbDtcclxuXHRcdHRoaXMuY3VycmVudFBvbHlnb25PZmZzZXRVbml0cyA9IG51bGw7XHJcblx0XHR0aGlzLmN1cnJlbnRDb2xvck1hc2sgPSBudWxsO1xyXG5cdFx0dGhpcy5jdXJyZW50RGVwdGhGdW5jID0gbnVsbDtcclxuXHRcdHRoaXMuY3VycmVudERlcHRoTWFzayA9IG51bGw7XHJcblx0XHR0aGlzLmN1cnJlbnRTdGVuY2lsRnVuYyA9IG51bGw7XHJcblx0XHR0aGlzLmN1cnJlbnRTdGVuY2lsUmVmID0gbnVsbDtcclxuXHRcdHRoaXMuY3VycmVudFN0ZW5jaWxGdW5jTWFzayA9IG51bGw7XHJcblx0XHR0aGlzLmN1cnJlbnRTdGVuY2lsRmFpbCA9IG51bGw7XHJcblx0XHR0aGlzLmN1cnJlbnRTdGVuY2lsWkZhaWwgPSBudWxsO1xyXG5cdFx0dGhpcy5jdXJyZW50U3RlbmNpbFpQYXNzID0gbnVsbDtcclxuXHRcdHRoaXMuY3VycmVudFN0ZW5jaWxNYXNrID0gbnVsbDtcclxuXHRcdHRoaXMuY3VycmVudExpbmVXaWR0aCA9IG51bGw7XHJcblx0XHR0aGlzLmN1cnJlbnRDbGlwcGluZ1BsYW5lcyA9IDA7XHJcblxyXG5cdFx0dGhpcy5jdXJyZW50VkFPID0gbnVsbDtcclxuXHRcdHRoaXMuY3VycmVudEluZGV4ID0gbnVsbDtcclxuXHJcblx0XHR0aGlzLmN1cnJlbnRCb3VuZEZyYW1lYnVmZmVycyA9IHt9O1xyXG5cdFx0dGhpcy5jdXJyZW50RHJhd2J1ZmZlcnMgPSBuZXcgV2Vha01hcCgpO1xyXG5cclxuXHRcdHRoaXMubWF4VGV4dHVyZXMgPSB0aGlzLmdsLmdldFBhcmFtZXRlciggdGhpcy5nbC5NQVhfVEVYVFVSRV9JTUFHRV9VTklUUyApO1xyXG5cdFx0dGhpcy5jdXJyZW50VGV4dHVyZVNsb3QgPSBudWxsO1xyXG5cdFx0dGhpcy5jdXJyZW50Qm91bmRUZXh0dXJlcyA9IHt9O1xyXG5cdFx0dGhpcy5jdXJyZW50Qm91bmRCdWZmZXJCYXNlcyA9IHt9O1xyXG5cclxuXHJcblx0XHR0aGlzLl9pbml0KCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW5pdHMgdGhlIHN0YXRlIG9mIHRoZSB1dGlsaXR5LlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKi9cclxuXHRfaW5pdCgpIHtcclxuXHJcblx0XHRjb25zdCBnbCA9IHRoaXMuZ2w7XHJcblxyXG5cdFx0Ly8gU3RvcmUgb25seSBXZWJHTCBjb25zdGFudHMgaGVyZS5cclxuXHJcblx0XHRlcXVhdGlvblRvR0wgPSB7XHJcblx0XHRcdFsgQWRkRXF1YXRpb24gXTogZ2wuRlVOQ19BREQsXHJcblx0XHRcdFsgU3VidHJhY3RFcXVhdGlvbiBdOiBnbC5GVU5DX1NVQlRSQUNULFxyXG5cdFx0XHRbIFJldmVyc2VTdWJ0cmFjdEVxdWF0aW9uIF06IGdsLkZVTkNfUkVWRVJTRV9TVUJUUkFDVFxyXG5cdFx0fTtcclxuXHJcblx0XHRmYWN0b3JUb0dMID0ge1xyXG5cdFx0XHRbIFplcm9GYWN0b3IgXTogZ2wuWkVSTyxcclxuXHRcdFx0WyBPbmVGYWN0b3IgXTogZ2wuT05FLFxyXG5cdFx0XHRbIFNyY0NvbG9yRmFjdG9yIF06IGdsLlNSQ19DT0xPUixcclxuXHRcdFx0WyBTcmNBbHBoYUZhY3RvciBdOiBnbC5TUkNfQUxQSEEsXHJcblx0XHRcdFsgU3JjQWxwaGFTYXR1cmF0ZUZhY3RvciBdOiBnbC5TUkNfQUxQSEFfU0FUVVJBVEUsXHJcblx0XHRcdFsgRHN0Q29sb3JGYWN0b3IgXTogZ2wuRFNUX0NPTE9SLFxyXG5cdFx0XHRbIERzdEFscGhhRmFjdG9yIF06IGdsLkRTVF9BTFBIQSxcclxuXHRcdFx0WyBPbmVNaW51c1NyY0NvbG9yRmFjdG9yIF06IGdsLk9ORV9NSU5VU19TUkNfQ09MT1IsXHJcblx0XHRcdFsgT25lTWludXNTcmNBbHBoYUZhY3RvciBdOiBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBLFxyXG5cdFx0XHRbIE9uZU1pbnVzRHN0Q29sb3JGYWN0b3IgXTogZ2wuT05FX01JTlVTX0RTVF9DT0xPUixcclxuXHRcdFx0WyBPbmVNaW51c0RzdEFscGhhRmFjdG9yIF06IGdsLk9ORV9NSU5VU19EU1RfQUxQSEFcclxuXHRcdH07XHJcblxyXG5cdFx0Y29uc3Qgc2Npc3NvclBhcmFtID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5TQ0lTU09SX0JPWCApO1xyXG5cdFx0Y29uc3Qgdmlld3BvcnRQYXJhbSA9IGdsLmdldFBhcmFtZXRlciggZ2wuVklFV1BPUlQgKTtcclxuXHJcblx0XHR0aGlzLmN1cnJlbnRTY2lzc29yID0gbmV3IFZlY3RvcjQoKS5mcm9tQXJyYXkoIHNjaXNzb3JQYXJhbSApO1xyXG5cdFx0dGhpcy5jdXJyZW50Vmlld3BvcnQgPSBuZXcgVmVjdG9yNCgpLmZyb21BcnJheSggdmlld3BvcnRQYXJhbSApO1xyXG5cclxuXHRcdHRoaXMuX3RlbXBWZWM0ID0gbmV3IFZlY3RvcjQoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFbmFibGVzIHRoZSBnaXZlbiBXZWJHTCBjYXBhYmlsaXR5LlxyXG5cdCAqXHJcblx0ICogVGhpcyBtZXRob2QgY2FjaGVzIHRoZSBjYXBhYmlsaXR5IHN0YXRlIHNvXHJcblx0ICogYGdsLmVuYWJsZSgpYCBpcyBvbmx5IGNhbGxlZCB3aGVuIG5lY2Vzc2FyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7R0xlbnVtfSBpZCAtIFRoZSBjYXBhYmlsaXR5IHRvIGVuYWJsZS5cclxuXHQgKi9cclxuXHRlbmFibGUoIGlkICkge1xyXG5cclxuXHRcdGNvbnN0IHsgZW5hYmxlZCB9ID0gdGhpcztcclxuXHJcblx0XHRpZiAoIGVuYWJsZWRbIGlkIF0gIT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmdsLmVuYWJsZSggaWQgKTtcclxuXHRcdFx0ZW5hYmxlZFsgaWQgXSA9IHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERpc2FibGVzIHRoZSBnaXZlbiBXZWJHTCBjYXBhYmlsaXR5LlxyXG5cdCAqXHJcblx0ICogVGhpcyBtZXRob2QgY2FjaGVzIHRoZSBjYXBhYmlsaXR5IHN0YXRlIHNvXHJcblx0ICogYGdsLmRpc2FibGUoKWAgaXMgb25seSBjYWxsZWQgd2hlbiBuZWNlc3NhcnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0dMZW51bX0gaWQgLSBUaGUgY2FwYWJpbGl0eSB0byBlbmFibGUuXHJcblx0ICovXHJcblx0ZGlzYWJsZSggaWQgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBlbmFibGVkIH0gPSB0aGlzO1xyXG5cclxuXHRcdGlmICggZW5hYmxlZFsgaWQgXSAhPT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmdsLmRpc2FibGUoIGlkICk7XHJcblx0XHRcdGVuYWJsZWRbIGlkIF0gPSBmYWxzZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3BlY2lmaWVzIHdoZXRoZXIgcG9seWdvbnMgYXJlIGZyb250LSBvciBiYWNrLWZhY2luZ1xyXG5cdCAqIGJ5IHNldHRpbmcgdGhlIHdpbmRpbmcgb3JpZW50YXRpb24uXHJcblx0ICpcclxuXHQgKiBUaGlzIG1ldGhvZCBjYWNoZXMgdGhlIHN0YXRlIHNvIGBnbC5mcm9udEZhY2UoKWAgaXMgb25seVxyXG5cdCAqIGNhbGxlZCB3aGVuIG5lY2Vzc2FyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gZmxpcFNpZGVkIC0gV2hldGhlciB0cmlhbmdsZXMgZmxpcHBlZCB0aGVpciBzaWRlcyBvciBub3QuXHJcblx0ICovXHJcblx0c2V0RmxpcFNpZGVkKCBmbGlwU2lkZWQgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmN1cnJlbnRGbGlwU2lkZWQgIT09IGZsaXBTaWRlZCApIHtcclxuXHJcblx0XHRcdGNvbnN0IHsgZ2wgfSA9IHRoaXM7XHJcblxyXG5cdFx0XHRpZiAoIGZsaXBTaWRlZCApIHtcclxuXHJcblx0XHRcdFx0Z2wuZnJvbnRGYWNlKCBnbC5DVyApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0Z2wuZnJvbnRGYWNlKCBnbC5DQ1cgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuY3VycmVudEZsaXBTaWRlZCA9IGZsaXBTaWRlZDtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IGZyb250LSBhbmQvb3IgYmFjay1mYWNpbmdcclxuXHQgKiBwb2x5Z29ucyBjYW4gYmUgY3VsbGVkLlxyXG5cdCAqXHJcblx0ICogVGhpcyBtZXRob2QgY2FjaGVzIHRoZSBzdGF0ZSBzbyBgZ2wuY3VsbEZhY2UoKWAgaXMgb25seVxyXG5cdCAqIGNhbGxlZCB3aGVuIG5lY2Vzc2FyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBjdWxsRmFjZSAtIERlZmluZXMgd2hpY2ggcG9seWdvbnMgYXJlIGNhbmRpZGF0ZXMgZm9yIGN1bGxpbmcuXHJcblx0ICovXHJcblx0c2V0Q3VsbEZhY2UoIGN1bGxGYWNlICkge1xyXG5cclxuXHRcdGNvbnN0IHsgZ2wgfSA9IHRoaXM7XHJcblxyXG5cdFx0aWYgKCBjdWxsRmFjZSAhPT0gQ3VsbEZhY2VOb25lICkge1xyXG5cclxuXHRcdFx0dGhpcy5lbmFibGUoIGdsLkNVTExfRkFDRSApO1xyXG5cclxuXHRcdFx0aWYgKCBjdWxsRmFjZSAhPT0gdGhpcy5jdXJyZW50Q3VsbEZhY2UgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggY3VsbEZhY2UgPT09IEN1bGxGYWNlQmFjayApIHtcclxuXHJcblx0XHRcdFx0XHRnbC5jdWxsRmFjZSggZ2wuQkFDSyApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCBjdWxsRmFjZSA9PT0gQ3VsbEZhY2VGcm9udCApIHtcclxuXHJcblx0XHRcdFx0XHRnbC5jdWxsRmFjZSggZ2wuRlJPTlQgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRnbC5jdWxsRmFjZSggZ2wuRlJPTlRfQU5EX0JBQ0sgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR0aGlzLmRpc2FibGUoIGdsLkNVTExfRkFDRSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmN1cnJlbnRDdWxsRmFjZSA9IGN1bGxGYWNlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNwZWNpZmllcyB0aGUgd2lkdGggb2YgbGluZSBwcmltaXRpdmVzLlxyXG5cdCAqXHJcblx0ICogVGhpcyBtZXRob2QgY2FjaGVzIHRoZSBzdGF0ZSBzbyBgZ2wubGluZVdpZHRoKClgIGlzIG9ubHlcclxuXHQgKiBjYWxsZWQgd2hlbiBuZWNlc3NhcnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgbGluZSB3aWR0aC5cclxuXHQgKi9cclxuXHRzZXRMaW5lV2lkdGgoIHdpZHRoICkge1xyXG5cclxuXHRcdGNvbnN0IHsgY3VycmVudExpbmVXaWR0aCwgZ2wgfSA9IHRoaXM7XHJcblxyXG5cdFx0aWYgKCB3aWR0aCAhPT0gY3VycmVudExpbmVXaWR0aCApIHtcclxuXHJcblx0XHRcdGdsLmxpbmVXaWR0aCggd2lkdGggKTtcclxuXHJcblx0XHRcdHRoaXMuY3VycmVudExpbmVXaWR0aCA9IHdpZHRoO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWZpbmVzIHRoZSBibGVuZGluZy5cclxuXHQgKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGNhY2hlcyB0aGUgc3RhdGUgc28gYGdsLmJsZW5kRXF1YXRpb24oKWAsIGBnbC5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoKWAsXHJcblx0ICogYGdsLmJsZW5kRnVuYygpYCBhbmQgIGBnbC5ibGVuZEZ1bmNTZXBhcmF0ZSgpYCBhcmUgb25seSBjYWxsZWQgd2hlbiBuZWNlc3NhcnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYmxlbmRpbmcgLSBUaGUgYmxlbmRpbmcgdHlwZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYmxlbmRFcXVhdGlvbiAtIFRoZSBibGVuZGluZyBlcXVhdGlvbi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYmxlbmRTcmMgLSBPbmx5IHJlbGV2YW50IGZvciBjdXN0b20gYmxlbmRpbmcuIFRoZSBSR0Igc291cmNlIGJsZW5kaW5nIGZhY3Rvci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYmxlbmREc3QgLSBPbmx5IHJlbGV2YW50IGZvciBjdXN0b20gYmxlbmRpbmcuIFRoZSBSR0IgZGVzdGluYXRpb24gYmxlbmRpbmcgZmFjdG9yLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBibGVuZEVxdWF0aW9uQWxwaGEgLSBPbmx5IHJlbGV2YW50IGZvciBjdXN0b20gYmxlbmRpbmcuIFRoZSBibGVuZGluZyBlcXVhdGlvbiBmb3IgYWxwaGEuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGJsZW5kU3JjQWxwaGEgLSBPbmx5IHJlbGV2YW50IGZvciBjdXN0b20gYmxlbmRpbmcuIFRoZSBhbHBoYSBzb3VyY2UgYmxlbmRpbmcgZmFjdG9yLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBibGVuZERzdEFscGhhIC0gT25seSByZWxldmFudCBmb3IgY3VzdG9tIGJsZW5kaW5nLiBUaGUgYWxwaGEgZGVzdGluYXRpb24gYmxlbmRpbmcgZmFjdG9yLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gcHJlbXVsdGlwbGllZEFscGhhIC0gV2hldGhlciBwcmVtdWx0aXBsaWVkIGFscGhhIGlzIGVuYWJsZWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdHNldEJsZW5kaW5nKCBibGVuZGluZywgYmxlbmRFcXVhdGlvbiwgYmxlbmRTcmMsIGJsZW5kRHN0LCBibGVuZEVxdWF0aW9uQWxwaGEsIGJsZW5kU3JjQWxwaGEsIGJsZW5kRHN0QWxwaGEsIHByZW11bHRpcGxpZWRBbHBoYSApIHtcclxuXHJcblx0XHRjb25zdCB7IGdsIH0gPSB0aGlzO1xyXG5cclxuXHRcdGlmICggYmxlbmRpbmcgPT09IE5vQmxlbmRpbmcgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMuY3VycmVudEJsZW5kaW5nRW5hYmxlZCA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5kaXNhYmxlKCBnbC5CTEVORCApO1xyXG5cdFx0XHRcdHRoaXMuY3VycmVudEJsZW5kaW5nRW5hYmxlZCA9IGZhbHNlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMuY3VycmVudEJsZW5kaW5nRW5hYmxlZCA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmVuYWJsZSggZ2wuQkxFTkQgKTtcclxuXHRcdFx0dGhpcy5jdXJyZW50QmxlbmRpbmdFbmFibGVkID0gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBibGVuZGluZyAhPT0gQ3VzdG9tQmxlbmRpbmcgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGJsZW5kaW5nICE9PSB0aGlzLmN1cnJlbnRCbGVuZGluZyB8fCBwcmVtdWx0aXBsaWVkQWxwaGEgIT09IHRoaXMuY3VycmVudFByZW11bHRpcGxlZEFscGhhICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIHRoaXMuY3VycmVudEJsZW5kRXF1YXRpb24gIT09IEFkZEVxdWF0aW9uIHx8IHRoaXMuY3VycmVudEJsZW5kRXF1YXRpb25BbHBoYSAhPT0gQWRkRXF1YXRpb24gKSB7XHJcblxyXG5cdFx0XHRcdFx0Z2wuYmxlbmRFcXVhdGlvbiggZ2wuRlVOQ19BREQgKTtcclxuXHJcblx0XHRcdFx0XHR0aGlzLmN1cnJlbnRCbGVuZEVxdWF0aW9uID0gQWRkRXF1YXRpb247XHJcblx0XHRcdFx0XHR0aGlzLmN1cnJlbnRCbGVuZEVxdWF0aW9uQWxwaGEgPSBBZGRFcXVhdGlvbjtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoIHByZW11bHRpcGxpZWRBbHBoYSApIHtcclxuXHJcblx0XHRcdFx0XHRzd2l0Y2ggKCBibGVuZGluZyApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNhc2UgTm9ybWFsQmxlbmRpbmc6XHJcblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRGdW5jU2VwYXJhdGUoIGdsLk9ORSwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSwgZ2wuT05FLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBICk7XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0XHRjYXNlIEFkZGl0aXZlQmxlbmRpbmc6XHJcblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRGdW5jKCBnbC5PTkUsIGdsLk9ORSApO1xyXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdFx0Y2FzZSBTdWJ0cmFjdGl2ZUJsZW5kaW5nOlxyXG5cdFx0XHRcdFx0XHRcdGdsLmJsZW5kRnVuY1NlcGFyYXRlKCBnbC5aRVJPLCBnbC5PTkVfTUlOVVNfU1JDX0NPTE9SLCBnbC5aRVJPLCBnbC5PTkUgKTtcclxuXHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRcdGNhc2UgTXVsdGlwbHlCbGVuZGluZzpcclxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEZ1bmNTZXBhcmF0ZSggZ2wuWkVSTywgZ2wuU1JDX0NPTE9SLCBnbC5aRVJPLCBnbC5TUkNfQUxQSEEgKTtcclxuXHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMU3RhdGU6IEludmFsaWQgYmxlbmRpbmc6ICcsIGJsZW5kaW5nICk7XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdHN3aXRjaCAoIGJsZW5kaW5nICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y2FzZSBOb3JtYWxCbGVuZGluZzpcclxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEZ1bmNTZXBhcmF0ZSggZ2wuU1JDX0FMUEhBLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBLCBnbC5PTkUsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEgKTtcclxuXHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRcdGNhc2UgQWRkaXRpdmVCbGVuZGluZzpcclxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEZ1bmMoIGdsLlNSQ19BTFBIQSwgZ2wuT05FICk7XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0XHRjYXNlIFN1YnRyYWN0aXZlQmxlbmRpbmc6XHJcblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRGdW5jU2VwYXJhdGUoIGdsLlpFUk8sIGdsLk9ORV9NSU5VU19TUkNfQ09MT1IsIGdsLlpFUk8sIGdsLk9ORSApO1xyXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdFx0Y2FzZSBNdWx0aXBseUJsZW5kaW5nOlxyXG5cdFx0XHRcdFx0XHRcdGdsLmJsZW5kRnVuYyggZ2wuWkVSTywgZ2wuU1JDX0NPTE9SICk7XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFN0YXRlOiBJbnZhbGlkIGJsZW5kaW5nOiAnLCBibGVuZGluZyApO1xyXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR0aGlzLmN1cnJlbnRCbGVuZFNyYyA9IG51bGw7XHJcblx0XHRcdFx0dGhpcy5jdXJyZW50QmxlbmREc3QgPSBudWxsO1xyXG5cdFx0XHRcdHRoaXMuY3VycmVudEJsZW5kU3JjQWxwaGEgPSBudWxsO1xyXG5cdFx0XHRcdHRoaXMuY3VycmVudEJsZW5kRHN0QWxwaGEgPSBudWxsO1xyXG5cclxuXHRcdFx0XHR0aGlzLmN1cnJlbnRCbGVuZGluZyA9IGJsZW5kaW5nO1xyXG5cdFx0XHRcdHRoaXMuY3VycmVudFByZW11bHRpcGxlZEFscGhhID0gcHJlbXVsdGlwbGllZEFscGhhO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBjdXN0b20gYmxlbmRpbmdcclxuXHJcblx0XHRibGVuZEVxdWF0aW9uQWxwaGEgPSBibGVuZEVxdWF0aW9uQWxwaGEgfHwgYmxlbmRFcXVhdGlvbjtcclxuXHRcdGJsZW5kU3JjQWxwaGEgPSBibGVuZFNyY0FscGhhIHx8IGJsZW5kU3JjO1xyXG5cdFx0YmxlbmREc3RBbHBoYSA9IGJsZW5kRHN0QWxwaGEgfHwgYmxlbmREc3Q7XHJcblxyXG5cdFx0aWYgKCBibGVuZEVxdWF0aW9uICE9PSB0aGlzLmN1cnJlbnRCbGVuZEVxdWF0aW9uIHx8IGJsZW5kRXF1YXRpb25BbHBoYSAhPT0gdGhpcy5jdXJyZW50QmxlbmRFcXVhdGlvbkFscGhhICkge1xyXG5cclxuXHRcdFx0Z2wuYmxlbmRFcXVhdGlvblNlcGFyYXRlKCBlcXVhdGlvblRvR0xbIGJsZW5kRXF1YXRpb24gXSwgZXF1YXRpb25Ub0dMWyBibGVuZEVxdWF0aW9uQWxwaGEgXSApO1xyXG5cclxuXHRcdFx0dGhpcy5jdXJyZW50QmxlbmRFcXVhdGlvbiA9IGJsZW5kRXF1YXRpb247XHJcblx0XHRcdHRoaXMuY3VycmVudEJsZW5kRXF1YXRpb25BbHBoYSA9IGJsZW5kRXF1YXRpb25BbHBoYTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBibGVuZFNyYyAhPT0gdGhpcy5jdXJyZW50QmxlbmRTcmMgfHwgYmxlbmREc3QgIT09IHRoaXMuY3VycmVudEJsZW5kRHN0IHx8IGJsZW5kU3JjQWxwaGEgIT09IHRoaXMuY3VycmVudEJsZW5kU3JjQWxwaGEgfHwgYmxlbmREc3RBbHBoYSAhPT0gdGhpcy5jdXJyZW50QmxlbmREc3RBbHBoYSApIHtcclxuXHJcblx0XHRcdGdsLmJsZW5kRnVuY1NlcGFyYXRlKCBmYWN0b3JUb0dMWyBibGVuZFNyYyBdLCBmYWN0b3JUb0dMWyBibGVuZERzdCBdLCBmYWN0b3JUb0dMWyBibGVuZFNyY0FscGhhIF0sIGZhY3RvclRvR0xbIGJsZW5kRHN0QWxwaGEgXSApO1xyXG5cclxuXHRcdFx0dGhpcy5jdXJyZW50QmxlbmRTcmMgPSBibGVuZFNyYztcclxuXHRcdFx0dGhpcy5jdXJyZW50QmxlbmREc3QgPSBibGVuZERzdDtcclxuXHRcdFx0dGhpcy5jdXJyZW50QmxlbmRTcmNBbHBoYSA9IGJsZW5kU3JjQWxwaGE7XHJcblx0XHRcdHRoaXMuY3VycmVudEJsZW5kRHN0QWxwaGEgPSBibGVuZERzdEFscGhhO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmN1cnJlbnRCbGVuZGluZyA9IGJsZW5kaW5nO1xyXG5cdFx0dGhpcy5jdXJyZW50UHJlbXVsdGlwbGVkQWxwaGEgPSBmYWxzZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTcGVjaWZpZXMgd2hldGhlciBjb2xvcnMgY2FuIGJlIHdyaXR0ZW4gd2hlbiByZW5kZXJpbmdcclxuXHQgKiBpbnRvIGEgZnJhbWVidWZmZXIgb3Igbm90LlxyXG5cdCAqXHJcblx0ICogVGhpcyBtZXRob2QgY2FjaGVzIHRoZSBzdGF0ZSBzbyBgZ2wuY29sb3JNYXNrKClgIGlzIG9ubHlcclxuXHQgKiBjYWxsZWQgd2hlbiBuZWNlc3NhcnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IGNvbG9yTWFzayAtIFRoZSBjb2xvciBtYXNrLlxyXG5cdCAqL1xyXG5cdHNldENvbG9yTWFzayggY29sb3JNYXNrICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5jdXJyZW50Q29sb3JNYXNrICE9PSBjb2xvck1hc2sgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmdsLmNvbG9yTWFzayggY29sb3JNYXNrLCBjb2xvck1hc2ssIGNvbG9yTWFzaywgY29sb3JNYXNrICk7XHJcblx0XHRcdHRoaXMuY3VycmVudENvbG9yTWFzayA9IGNvbG9yTWFzaztcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGRlcHRoIHRlc3QgaXMgZW5hYmxlZCBvciBub3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IGRlcHRoVGVzdCAtIFdoZXRoZXIgdGhlIGRlcHRoIHRlc3QgaXMgZW5hYmxlZCBvciBub3QuXHJcblx0ICovXHJcblx0c2V0RGVwdGhUZXN0KCBkZXB0aFRlc3QgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBnbCB9ID0gdGhpcztcclxuXHJcblx0XHRpZiAoIGRlcHRoVGVzdCApIHtcclxuXHJcblx0XHRcdHRoaXMuZW5hYmxlKCBnbC5ERVBUSF9URVNUICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHRoaXMuZGlzYWJsZSggZ2wuREVQVEhfVEVTVCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTcGVjaWZpZXMgd2hldGhlciBkZXB0aCB2YWx1ZXMgY2FuIGJlIHdyaXR0ZW4gd2hlbiByZW5kZXJpbmdcclxuXHQgKiBpbnRvIGEgZnJhbWVidWZmZXIgb3Igbm90LlxyXG5cdCAqXHJcblx0ICogVGhpcyBtZXRob2QgY2FjaGVzIHRoZSBzdGF0ZSBzbyBgZ2wuZGVwdGhNYXNrKClgIGlzIG9ubHlcclxuXHQgKiBjYWxsZWQgd2hlbiBuZWNlc3NhcnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IGRlcHRoTWFzayAtIFRoZSBkZXB0aCBtYXNrLlxyXG5cdCAqL1xyXG5cdHNldERlcHRoTWFzayggZGVwdGhNYXNrICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5jdXJyZW50RGVwdGhNYXNrICE9PSBkZXB0aE1hc2sgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmdsLmRlcHRoTWFzayggZGVwdGhNYXNrICk7XHJcblx0XHRcdHRoaXMuY3VycmVudERlcHRoTWFzayA9IGRlcHRoTWFzaztcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3BlY2lmaWVzIHRoZSBkZXB0aCBjb21wYXJlIGZ1bmN0aW9uLlxyXG5cdCAqXHJcblx0ICogVGhpcyBtZXRob2QgY2FjaGVzIHRoZSBzdGF0ZSBzbyBgZ2wuZGVwdGhGdW5jKClgIGlzIG9ubHlcclxuXHQgKiBjYWxsZWQgd2hlbiBuZWNlc3NhcnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZGVwdGhGdW5jIC0gVGhlIGRlcHRoIGNvbXBhcmUgZnVuY3Rpb24uXHJcblx0ICovXHJcblx0c2V0RGVwdGhGdW5jKCBkZXB0aEZ1bmMgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmN1cnJlbnREZXB0aEZ1bmMgIT09IGRlcHRoRnVuYyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHsgZ2wgfSA9IHRoaXM7XHJcblxyXG5cdFx0XHRzd2l0Y2ggKCBkZXB0aEZ1bmMgKSB7XHJcblxyXG5cdFx0XHRcdGNhc2UgTmV2ZXJEZXB0aDpcclxuXHJcblx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIGdsLk5FVkVSICk7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0Y2FzZSBBbHdheXNEZXB0aDpcclxuXHJcblx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIGdsLkFMV0FZUyApO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdGNhc2UgTGVzc0RlcHRoOlxyXG5cclxuXHRcdFx0XHRcdGdsLmRlcHRoRnVuYyggZ2wuTEVTUyApO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdGNhc2UgTGVzc0VxdWFsRGVwdGg6XHJcblxyXG5cdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5MRVFVQUwgKTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRjYXNlIEVxdWFsRGVwdGg6XHJcblxyXG5cdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5FUVVBTCApO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdGNhc2UgR3JlYXRlckVxdWFsRGVwdGg6XHJcblxyXG5cdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5HRVFVQUwgKTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRjYXNlIEdyZWF0ZXJEZXB0aDpcclxuXHJcblx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIGdsLkdSRUFURVIgKTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRjYXNlIE5vdEVxdWFsRGVwdGg6XHJcblxyXG5cdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5OT1RFUVVBTCApO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdGRlZmF1bHQ6XHJcblxyXG5cdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5MRVFVQUwgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuY3VycmVudERlcHRoRnVuYyA9IGRlcHRoRnVuYztcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3BlY2lmaWVzIHRoZSBzY2lzc29yIGJveC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB4IC0gVGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHZpZXdwb3J0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHZpZXdwb3J0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgdmlld3BvcnQuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIHZpZXdwb3J0LlxyXG5cdCAqXHJcblx0ICovXHJcblx0c2Npc3NvciggeCwgeSwgd2lkdGgsIGhlaWdodCApIHtcclxuXHJcblx0XHRjb25zdCBzY2lzc29yID0gdGhpcy5fdGVtcFZlYzQuc2V0KCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmN1cnJlbnRTY2lzc29yLmVxdWFscyggc2Npc3NvciApID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdGNvbnN0IHsgZ2wgfSA9IHRoaXM7XHJcblxyXG5cdFx0XHRnbC5zY2lzc29yKCBzY2lzc29yLngsIHNjaXNzb3IueSwgc2Npc3Nvci56LCBzY2lzc29yLncgKTtcclxuXHRcdFx0dGhpcy5jdXJyZW50U2Npc3Nvci5jb3B5KCBzY2lzc29yICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNwZWNpZmllcyB0aGUgdmlld3BvcnQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSB2aWV3cG9ydC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSB2aWV3cG9ydC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIHZpZXdwb3J0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSB2aWV3cG9ydC5cclxuXHQgKlxyXG5cdCAqL1xyXG5cdHZpZXdwb3J0KCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICkge1xyXG5cclxuXHRcdGNvbnN0IHZpZXdwb3J0ID0gdGhpcy5fdGVtcFZlYzQuc2V0KCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmN1cnJlbnRWaWV3cG9ydC5lcXVhbHMoIHZpZXdwb3J0ICkgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0Y29uc3QgeyBnbCB9ID0gdGhpcztcclxuXHJcblx0XHRcdGdsLnZpZXdwb3J0KCB2aWV3cG9ydC54LCB2aWV3cG9ydC55LCB2aWV3cG9ydC56LCB2aWV3cG9ydC53ICk7XHJcblx0XHRcdHRoaXMuY3VycmVudFZpZXdwb3J0LmNvcHkoIHZpZXdwb3J0ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgdGhlIHNjaXNzb3IgdGVzdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gYm9vbGVhbiAtIFdoZXRoZXIgdGhlIHNjaXNzb3IgdGVzdCBzaG91bGQgYmUgZW5hYmxlZCBvciBub3QuXHJcblx0ICovXHJcblx0c2V0U2Npc3NvclRlc3QoIGJvb2xlYW4gKSB7XHJcblxyXG5cdFx0Y29uc3QgZ2wgPSB0aGlzLmdsO1xyXG5cclxuXHRcdGlmICggYm9vbGVhbiApIHtcclxuXHJcblx0XHRcdGdsLmVuYWJsZSggZ2wuU0NJU1NPUl9URVNUICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGdsLmRpc2FibGUoIGdsLlNDSVNTT1JfVEVTVCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgc3RlbmNpbCB0ZXN0IGlzIGVuYWJsZWQgb3Igbm90LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBzdGVuY2lsVGVzdCAtIFdoZXRoZXIgdGhlIHN0ZW5jaWwgdGVzdCBpcyBlbmFibGVkIG9yIG5vdC5cclxuXHQgKi9cclxuXHRzZXRTdGVuY2lsVGVzdCggc3RlbmNpbFRlc3QgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBnbCB9ID0gdGhpcztcclxuXHJcblx0XHRpZiAoIHN0ZW5jaWxUZXN0ICkge1xyXG5cclxuXHRcdFx0dGhpcy5lbmFibGUoIGdsLlNURU5DSUxfVEVTVCApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR0aGlzLmRpc2FibGUoIGdsLlNURU5DSUxfVEVTVCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTcGVjaWZpZXMgd2hldGhlciBzdGVuY2lsIHZhbHVlcyBjYW4gYmUgd3JpdHRlbiB3aGVuIHJlbmRlcmluZ1xyXG5cdCAqIGludG8gYSBmcmFtZWJ1ZmZlciBvciBub3QuXHJcblx0ICpcclxuXHQgKiBUaGlzIG1ldGhvZCBjYWNoZXMgdGhlIHN0YXRlIHNvIGBnbC5zdGVuY2lsTWFzaygpYCBpcyBvbmx5XHJcblx0ICogY2FsbGVkIHdoZW4gbmVjZXNzYXJ5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBzdGVuY2lsTWFzayAtIFRoZSBzdGVuY2lsIG1hc2suXHJcblx0ICovXHJcblx0c2V0U3RlbmNpbE1hc2soIHN0ZW5jaWxNYXNrICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5jdXJyZW50U3RlbmNpbE1hc2sgIT09IHN0ZW5jaWxNYXNrICkge1xyXG5cclxuXHRcdFx0dGhpcy5nbC5zdGVuY2lsTWFzayggc3RlbmNpbE1hc2sgKTtcclxuXHRcdFx0dGhpcy5jdXJyZW50U3RlbmNpbE1hc2sgPSBzdGVuY2lsTWFzaztcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHN0ZW5jaWwgdGVzdCBmdW5jdGlvbnMuXHJcblx0ICpcclxuXHQgKiBUaGlzIG1ldGhvZCBjYWNoZXMgdGhlIHN0YXRlIHNvIGBnbC5zdGVuY2lsRnVuYygpYCBpcyBvbmx5XHJcblx0ICogY2FsbGVkIHdoZW4gbmVjZXNzYXJ5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHN0ZW5jaWxGdW5jIC0gVGhlIHN0ZW5jaWwgY29tcGFyZSBmdW5jdGlvbi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc3RlbmNpbFJlZiAtIFRoZSByZWZlcmVuY2UgdmFsdWUgZm9yIHRoZSBzdGVuY2lsIHRlc3QuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHN0ZW5jaWxNYXNrIC0gQSBiaXQtd2lzZSBtYXNrIHRoYXQgaXMgdXNlZCB0byBBTkQgdGhlIHJlZmVyZW5jZSB2YWx1ZSBhbmQgdGhlIHN0b3JlZCBzdGVuY2lsIHZhbHVlIHdoZW4gdGhlIHRlc3QgaXMgZG9uZS5cclxuXHQgKi9cclxuXHRzZXRTdGVuY2lsRnVuYyggc3RlbmNpbEZ1bmMsIHN0ZW5jaWxSZWYsIHN0ZW5jaWxNYXNrICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5jdXJyZW50U3RlbmNpbEZ1bmMgIT09IHN0ZW5jaWxGdW5jIHx8XHJcblx0XHRcdCB0aGlzLmN1cnJlbnRTdGVuY2lsUmVmICE9PSBzdGVuY2lsUmVmIHx8XHJcblx0XHRcdCB0aGlzLmN1cnJlbnRTdGVuY2lsRnVuY01hc2sgIT09IHN0ZW5jaWxNYXNrICkge1xyXG5cclxuXHRcdFx0dGhpcy5nbC5zdGVuY2lsRnVuYyggc3RlbmNpbEZ1bmMsIHN0ZW5jaWxSZWYsIHN0ZW5jaWxNYXNrICk7XHJcblxyXG5cdFx0XHR0aGlzLmN1cnJlbnRTdGVuY2lsRnVuYyA9IHN0ZW5jaWxGdW5jO1xyXG5cdFx0XHR0aGlzLmN1cnJlbnRTdGVuY2lsUmVmID0gc3RlbmNpbFJlZjtcclxuXHRcdFx0dGhpcy5jdXJyZW50U3RlbmNpbEZ1bmNNYXNrID0gc3RlbmNpbE1hc2s7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBzdGVuY2lsIHRlc3Qgb3BlcmF0aW9uLlxyXG5cdCAqXHJcblx0ICogVGhpcyBtZXRob2QgY2FjaGVzIHRoZSBzdGF0ZSBzbyBgZ2wuc3RlbmNpbE9wKClgIGlzIG9ubHlcclxuXHQgKiBjYWxsZWQgd2hlbiBuZWNlc3NhcnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc3RlbmNpbEZhaWwgLSBUaGUgZnVuY3Rpb24gdG8gdXNlIHdoZW4gdGhlIHN0ZW5jaWwgdGVzdCBmYWlscy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc3RlbmNpbFpGYWlsIC0gVGhlIGZ1bmN0aW9uIHRvIHVzZSB3aGVuIHRoZSBzdGVuY2lsIHRlc3QgcGFzc2VzLCBidXQgdGhlIGRlcHRoIHRlc3QgZmFpbC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gc3RlbmNpbFpQYXNzIC0gVGhlIGZ1bmN0aW9uIHRvIHVzZSB3aGVuIGJvdGggdGhlIHN0ZW5jaWwgdGVzdCBhbmQgdGhlIGRlcHRoIHRlc3QgcGFzcyxcclxuXHQgKiBvciB3aGVuIHRoZSBzdGVuY2lsIHRlc3QgcGFzc2VzIGFuZCB0aGVyZSBpcyBubyBkZXB0aCBidWZmZXIgb3IgZGVwdGggdGVzdGluZyBpcyBkaXNhYmxlZC5cclxuXHQgKi9cclxuXHRzZXRTdGVuY2lsT3AoIHN0ZW5jaWxGYWlsLCBzdGVuY2lsWkZhaWwsIHN0ZW5jaWxaUGFzcyApIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuY3VycmVudFN0ZW5jaWxGYWlsICE9PSBzdGVuY2lsRmFpbCB8fFxyXG5cdFx0XHQgdGhpcy5jdXJyZW50U3RlbmNpbFpGYWlsICE9PSBzdGVuY2lsWkZhaWwgfHxcclxuXHRcdFx0IHRoaXMuY3VycmVudFN0ZW5jaWxaUGFzcyAhPT0gc3RlbmNpbFpQYXNzICkge1xyXG5cclxuXHRcdFx0dGhpcy5nbC5zdGVuY2lsT3AoIHN0ZW5jaWxGYWlsLCBzdGVuY2lsWkZhaWwsIHN0ZW5jaWxaUGFzcyApO1xyXG5cclxuXHRcdFx0dGhpcy5jdXJyZW50U3RlbmNpbEZhaWwgPSBzdGVuY2lsRmFpbDtcclxuXHRcdFx0dGhpcy5jdXJyZW50U3RlbmNpbFpGYWlsID0gc3RlbmNpbFpGYWlsO1xyXG5cdFx0XHR0aGlzLmN1cnJlbnRTdGVuY2lsWlBhc3MgPSBzdGVuY2lsWlBhc3M7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbmZpZ3VyZXMgdGhlIFdlYkdMIHN0YXRlIGZvciB0aGUgZ2l2ZW4gbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge01hdGVyaWFsfSBtYXRlcmlhbCAtIFRoZSBtYXRlcmlhbCB0byBjb25maWd1cmUgdGhlIHN0YXRlIGZvci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZnJvbnRGYWNlQ1cgLSBXaGV0aGVyIHRoZSBmcm9udCBmYWNlcyBhcmUgY291bnRlci1jbG9ja3dpc2Ugb3Igbm90LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBoYXJkd2FyZUNsaXBwaW5nUGxhbmVzIC0gVGhlIG51bWJlciBvZiBoYXJkd2FyZSBjbGlwcGluZyBwbGFuZXMuXHJcblx0ICovXHJcblx0c2V0TWF0ZXJpYWwoIG1hdGVyaWFsLCBmcm9udEZhY2VDVywgaGFyZHdhcmVDbGlwcGluZ1BsYW5lcyApIHtcclxuXHJcblx0XHRjb25zdCB7IGdsIH0gPSB0aGlzO1xyXG5cclxuXHRcdG1hdGVyaWFsLnNpZGUgPT09IERvdWJsZVNpZGVcclxuXHRcdFx0PyB0aGlzLmRpc2FibGUoIGdsLkNVTExfRkFDRSApXHJcblx0XHRcdDogdGhpcy5lbmFibGUoIGdsLkNVTExfRkFDRSApO1xyXG5cclxuXHRcdGxldCBmbGlwU2lkZWQgPSAoIG1hdGVyaWFsLnNpZGUgPT09IEJhY2tTaWRlICk7XHJcblx0XHRpZiAoIGZyb250RmFjZUNXICkgZmxpcFNpZGVkID0gISBmbGlwU2lkZWQ7XHJcblxyXG5cdFx0dGhpcy5zZXRGbGlwU2lkZWQoIGZsaXBTaWRlZCApO1xyXG5cclxuXHRcdCggbWF0ZXJpYWwuYmxlbmRpbmcgPT09IE5vcm1hbEJsZW5kaW5nICYmIG1hdGVyaWFsLnRyYW5zcGFyZW50ID09PSBmYWxzZSApXHJcblx0XHRcdD8gdGhpcy5zZXRCbGVuZGluZyggTm9CbGVuZGluZyApXHJcblx0XHRcdDogdGhpcy5zZXRCbGVuZGluZyggbWF0ZXJpYWwuYmxlbmRpbmcsIG1hdGVyaWFsLmJsZW5kRXF1YXRpb24sIG1hdGVyaWFsLmJsZW5kU3JjLCBtYXRlcmlhbC5ibGVuZERzdCwgbWF0ZXJpYWwuYmxlbmRFcXVhdGlvbkFscGhhLCBtYXRlcmlhbC5ibGVuZFNyY0FscGhhLCBtYXRlcmlhbC5ibGVuZERzdEFscGhhLCBtYXRlcmlhbC5wcmVtdWx0aXBsaWVkQWxwaGEgKTtcclxuXHJcblx0XHR0aGlzLnNldERlcHRoRnVuYyggbWF0ZXJpYWwuZGVwdGhGdW5jICk7XHJcblx0XHR0aGlzLnNldERlcHRoVGVzdCggbWF0ZXJpYWwuZGVwdGhUZXN0ICk7XHJcblx0XHR0aGlzLnNldERlcHRoTWFzayggbWF0ZXJpYWwuZGVwdGhXcml0ZSApO1xyXG5cdFx0dGhpcy5zZXRDb2xvck1hc2soIG1hdGVyaWFsLmNvbG9yV3JpdGUgKTtcclxuXHJcblx0XHRjb25zdCBzdGVuY2lsV3JpdGUgPSBtYXRlcmlhbC5zdGVuY2lsV3JpdGU7XHJcblx0XHR0aGlzLnNldFN0ZW5jaWxUZXN0KCBzdGVuY2lsV3JpdGUgKTtcclxuXHRcdGlmICggc3RlbmNpbFdyaXRlICkge1xyXG5cclxuXHRcdFx0dGhpcy5zZXRTdGVuY2lsTWFzayggbWF0ZXJpYWwuc3RlbmNpbFdyaXRlTWFzayApO1xyXG5cdFx0XHR0aGlzLnNldFN0ZW5jaWxGdW5jKCBtYXRlcmlhbC5zdGVuY2lsRnVuYywgbWF0ZXJpYWwuc3RlbmNpbFJlZiwgbWF0ZXJpYWwuc3RlbmNpbEZ1bmNNYXNrICk7XHJcblx0XHRcdHRoaXMuc2V0U3RlbmNpbE9wKCBtYXRlcmlhbC5zdGVuY2lsRmFpbCwgbWF0ZXJpYWwuc3RlbmNpbFpGYWlsLCBtYXRlcmlhbC5zdGVuY2lsWlBhc3MgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5zZXRQb2x5Z29uT2Zmc2V0KCBtYXRlcmlhbC5wb2x5Z29uT2Zmc2V0LCBtYXRlcmlhbC5wb2x5Z29uT2Zmc2V0RmFjdG9yLCBtYXRlcmlhbC5wb2x5Z29uT2Zmc2V0VW5pdHMgKTtcclxuXHJcblx0XHRtYXRlcmlhbC5hbHBoYVRvQ292ZXJhZ2UgPT09IHRydWUgJiYgdGhpcy5iYWNrZW5kLnJlbmRlcmVyLnNhbXBsZXMgPiAxXHJcblx0XHRcdD8gdGhpcy5lbmFibGUoIGdsLlNBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSApXHJcblx0XHRcdDogdGhpcy5kaXNhYmxlKCBnbC5TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UgKTtcclxuXHJcblx0XHRpZiAoIGhhcmR3YXJlQ2xpcHBpbmdQbGFuZXMgPiAwICkge1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLmN1cnJlbnRDbGlwcGluZ1BsYW5lcyAhPT0gaGFyZHdhcmVDbGlwcGluZ1BsYW5lcyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgQ0xJUF9ESVNUQU5DRTBfV0VCR0wgPSAweDMwMDA7XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBpIDwgaGFyZHdhcmVDbGlwcGluZ1BsYW5lcyApIHtcclxuXHJcblx0XHRcdFx0XHRcdHRoaXMuZW5hYmxlKCBDTElQX0RJU1RBTkNFMF9XRUJHTCArIGkgKTtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0dGhpcy5kaXNhYmxlKCBDTElQX0RJU1RBTkNFMF9XRUJHTCArIGkgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3BlY2lmaWVzIHRoZSBwb2x5Z29uIG9mZnNldC5cclxuXHQgKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGNhY2hlcyB0aGUgc3RhdGUgc28gYGdsLnBvbHlnb25PZmZzZXQoKWAgaXMgb25seVxyXG5cdCAqIGNhbGxlZCB3aGVuIG5lY2Vzc2FyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gcG9seWdvbk9mZnNldCAtIFdoZXRoZXIgcG9seWdvbiBvZmZzZXQgaXMgZW5hYmxlZCBvciBub3QuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGZhY3RvciAtIFRoZSBzY2FsZSBmYWN0b3IgZm9yIHRoZSB2YXJpYWJsZSBkZXB0aCBvZmZzZXQgZm9yIGVhY2ggcG9seWdvbi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdW5pdHMgLSBUaGUgbXVsdGlwbGllciBieSB3aGljaCBhbiBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyB2YWx1ZSBpcyBtdWx0aXBsaWVkIHdpdGggdG8gY3JlYXRlIGEgY29uc3RhbnQgZGVwdGggb2Zmc2V0LlxyXG5cdCAqL1xyXG5cdHNldFBvbHlnb25PZmZzZXQoIHBvbHlnb25PZmZzZXQsIGZhY3RvciwgdW5pdHMgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBnbCB9ID0gdGhpcztcclxuXHJcblx0XHRpZiAoIHBvbHlnb25PZmZzZXQgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmVuYWJsZSggZ2wuUE9MWUdPTl9PRkZTRVRfRklMTCApO1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLmN1cnJlbnRQb2x5Z29uT2Zmc2V0RmFjdG9yICE9PSBmYWN0b3IgfHwgdGhpcy5jdXJyZW50UG9seWdvbk9mZnNldFVuaXRzICE9PSB1bml0cyApIHtcclxuXHJcblx0XHRcdFx0Z2wucG9seWdvbk9mZnNldCggZmFjdG9yLCB1bml0cyApO1xyXG5cclxuXHRcdFx0XHR0aGlzLmN1cnJlbnRQb2x5Z29uT2Zmc2V0RmFjdG9yID0gZmFjdG9yO1xyXG5cdFx0XHRcdHRoaXMuY3VycmVudFBvbHlnb25PZmZzZXRVbml0cyA9IHVuaXRzO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR0aGlzLmRpc2FibGUoIGdsLlBPTFlHT05fT0ZGU0VUX0ZJTEwgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVmaW5lcyB0aGUgdXNhZ2Ugb2YgdGhlIGdpdmVuIFdlYkdMIHByb2dyYW0uXHJcblx0ICpcclxuXHQgKiBUaGlzIG1ldGhvZCBjYWNoZXMgdGhlIHN0YXRlIHNvIGBnbC51c2VQcm9ncmFtKClgIGlzIG9ubHlcclxuXHQgKiBjYWxsZWQgd2hlbiBuZWNlc3NhcnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMUHJvZ3JhbX0gcHJvZ3JhbSAtIFRoZSBXZWJHTCBwcm9ncmFtIHRvIHVzZS5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIGEgcHJvZ3JhbSBjaGFuZ2UgaGFzIGJlZW4gZXhlY3V0ZWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdHVzZVByb2dyYW0oIHByb2dyYW0gKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmN1cnJlbnRQcm9ncmFtICE9PSBwcm9ncmFtICkge1xyXG5cclxuXHRcdFx0dGhpcy5nbC51c2VQcm9ncmFtKCBwcm9ncmFtICk7XHJcblxyXG5cdFx0XHR0aGlzLmN1cnJlbnRQcm9ncmFtID0gcHJvZ3JhbTtcclxuXHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZmFsc2U7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdmVydGV4IHN0YXRlIGJ5IGJpbmRpbmcgdGhlIGdpdmVuIFZBTyBhbmQgZWxlbWVudCBidWZmZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMVmVydGV4QXJyYXlPYmplY3R9IHZhbyAtIFRoZSBWQU8uXHJcblx0ICogQHBhcmFtIHtXZWJHTEJ1ZmZlcn0gaW5kZXhCdWZmZXIgLSBUaGUgaW5kZXggYnVmZmVyLlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgYSB2ZXJ0ZXggc3RhdGUgaGFzIGJlZW4gY2hhbmdlZCBvciBub3QuXHJcblx0ICovXHJcblx0c2V0VmVydGV4U3RhdGUoIHZhbywgaW5kZXhCdWZmZXIgPSBudWxsICkge1xyXG5cclxuXHRcdGNvbnN0IGdsID0gdGhpcy5nbDtcclxuXHJcblx0XHRpZiAoIHRoaXMuY3VycmVudFZBTyAhPT0gdmFvIHx8IHRoaXMuY3VycmVudEluZGV4ICE9PSBpbmRleEJ1ZmZlciApIHtcclxuXHJcblx0XHRcdGdsLmJpbmRWZXJ0ZXhBcnJheSggdmFvICk7XHJcblxyXG5cdFx0XHRpZiAoIGluZGV4QnVmZmVyICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRnbC5iaW5kQnVmZmVyKCBnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgaW5kZXhCdWZmZXIgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuY3VycmVudFZBTyA9IHZhbztcclxuXHRcdFx0dGhpcy5jdXJyZW50SW5kZXggPSBpbmRleEJ1ZmZlcjtcclxuXHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZmFsc2U7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVzZXRzIHRoZSB2ZXJ0ZXggYXJyYXkgc3RhdGUgYnkgcmVzZXR0aW5nIHRoZSBWQU8gYW5kIGVsZW1lbnQgYnVmZmVyLlxyXG5cdCAqL1xyXG5cdHJlc2V0VmVydGV4U3RhdGUoKSB7XHJcblxyXG5cdFx0Y29uc3QgZ2wgPSB0aGlzLmdsO1xyXG5cclxuXHRcdGdsLmJpbmRWZXJ0ZXhBcnJheSggbnVsbCApO1xyXG5cdFx0Z2wuYmluZEJ1ZmZlciggZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIG51bGwgKTtcclxuXHJcblx0XHR0aGlzLmN1cnJlbnRWQU8gPSBudWxsO1xyXG5cdFx0dGhpcy5jdXJyZW50SW5kZXggPSBudWxsO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vIGZyYW1lYnVmZmVyXHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBCaW5kcyB0aGUgZ2l2ZW4gZnJhbWVidWZmZXIuXHJcblx0ICpcclxuXHQgKiBUaGlzIG1ldGhvZCBjYWNoZXMgdGhlIHN0YXRlIHNvIGBnbC5iaW5kRnJhbWVidWZmZXIoKWAgaXMgb25seVxyXG5cdCAqIGNhbGxlZCB3aGVuIG5lY2Vzc2FyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0YXJnZXQgLSBUaGUgYmluZGluZyBwb2ludCAodGFyZ2V0KS5cclxuXHQgKiBAcGFyYW0ge1dlYkdMRnJhbWVidWZmZXJ9IGZyYW1lYnVmZmVyIC0gVGhlIFdlYkdMIGZyYW1lYnVmZmVyIHRvIGJpbmQuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciBhIGJpbmQgaGFzIGJlZW4gZXhlY3V0ZWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGJpbmRGcmFtZWJ1ZmZlciggdGFyZ2V0LCBmcmFtZWJ1ZmZlciApIHtcclxuXHJcblx0XHRjb25zdCB7IGdsLCBjdXJyZW50Qm91bmRGcmFtZWJ1ZmZlcnMgfSA9IHRoaXM7XHJcblxyXG5cdFx0aWYgKCBjdXJyZW50Qm91bmRGcmFtZWJ1ZmZlcnNbIHRhcmdldCBdICE9PSBmcmFtZWJ1ZmZlciApIHtcclxuXHJcblx0XHRcdGdsLmJpbmRGcmFtZWJ1ZmZlciggdGFyZ2V0LCBmcmFtZWJ1ZmZlciApO1xyXG5cclxuXHRcdFx0Y3VycmVudEJvdW5kRnJhbWVidWZmZXJzWyB0YXJnZXQgXSA9IGZyYW1lYnVmZmVyO1xyXG5cclxuXHRcdFx0Ly8gZ2wuRFJBV19GUkFNRUJVRkZFUiBpcyBlcXVpdmFsZW50IHRvIGdsLkZSQU1FQlVGRkVSXHJcblxyXG5cdFx0XHRpZiAoIHRhcmdldCA9PT0gZ2wuRFJBV19GUkFNRUJVRkZFUiApIHtcclxuXHJcblx0XHRcdFx0Y3VycmVudEJvdW5kRnJhbWVidWZmZXJzWyBnbC5GUkFNRUJVRkZFUiBdID0gZnJhbWVidWZmZXI7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHRhcmdldCA9PT0gZ2wuRlJBTUVCVUZGRVIgKSB7XHJcblxyXG5cdFx0XHRcdGN1cnJlbnRCb3VuZEZyYW1lYnVmZmVyc1sgZ2wuRFJBV19GUkFNRUJVRkZFUiBdID0gZnJhbWVidWZmZXI7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGZhbHNlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgZHJhdyBidWZmZXJzIHRvIHdoaWNoIGZyYWdtZW50IGNvbG9ycyBhcmUgd3JpdHRlbiBpbnRvLlxyXG5cdCAqIENvbmZpZ3VyZXMgdGhlIE1SVCBzZXR1cCBvZiBjdXN0b20gZnJhbWVidWZmZXJzLlxyXG5cdCAqXHJcblx0ICogVGhpcyBtZXRob2QgY2FjaGVzIHRoZSBzdGF0ZSBzbyBgZ2wuZHJhd0J1ZmZlcnMoKWAgaXMgb25seVxyXG5cdCAqIGNhbGxlZCB3aGVuIG5lY2Vzc2FyeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyQ29udGV4dH0gcmVuZGVyQ29udGV4dCAtIFRoZSByZW5kZXIgY29udGV4dC5cclxuXHQgKiBAcGFyYW0ge1dlYkdMRnJhbWVidWZmZXJ9IGZyYW1lYnVmZmVyIC0gVGhlIFdlYkdMIGZyYW1lYnVmZmVyLlxyXG5cdCAqL1xyXG5cdGRyYXdCdWZmZXJzKCByZW5kZXJDb250ZXh0LCBmcmFtZWJ1ZmZlciApIHtcclxuXHJcblx0XHRjb25zdCB7IGdsIH0gPSB0aGlzO1xyXG5cclxuXHRcdGxldCBkcmF3QnVmZmVycyA9IFtdO1xyXG5cclxuXHRcdGxldCBuZWVkc1VwZGF0ZSA9IGZhbHNlO1xyXG5cclxuXHRcdGlmICggcmVuZGVyQ29udGV4dC50ZXh0dXJlcyAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGRyYXdCdWZmZXJzID0gdGhpcy5jdXJyZW50RHJhd2J1ZmZlcnMuZ2V0KCBmcmFtZWJ1ZmZlciApO1xyXG5cclxuXHRcdFx0aWYgKCBkcmF3QnVmZmVycyA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRkcmF3QnVmZmVycyA9IFtdO1xyXG5cdFx0XHRcdHRoaXMuY3VycmVudERyYXdidWZmZXJzLnNldCggZnJhbWVidWZmZXIsIGRyYXdCdWZmZXJzICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cclxuXHRcdFx0Y29uc3QgdGV4dHVyZXMgPSByZW5kZXJDb250ZXh0LnRleHR1cmVzO1xyXG5cclxuXHRcdFx0aWYgKCBkcmF3QnVmZmVycy5sZW5ndGggIT09IHRleHR1cmVzLmxlbmd0aCB8fCBkcmF3QnVmZmVyc1sgMCBdICE9PSBnbC5DT0xPUl9BVFRBQ0hNRU5UMCApIHtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IHRleHR1cmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdGRyYXdCdWZmZXJzWyBpIF0gPSBnbC5DT0xPUl9BVFRBQ0hNRU5UMCArIGk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0ZHJhd0J1ZmZlcnMubGVuZ3RoID0gdGV4dHVyZXMubGVuZ3RoO1xyXG5cclxuXHRcdFx0XHRuZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRpZiAoIGRyYXdCdWZmZXJzWyAwIF0gIT09IGdsLkJBQ0sgKSB7XHJcblxyXG5cdFx0XHRcdGRyYXdCdWZmZXJzWyAwIF0gPSBnbC5CQUNLO1xyXG5cclxuXHRcdFx0XHRuZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggbmVlZHNVcGRhdGUgKSB7XHJcblxyXG5cdFx0XHRnbC5kcmF3QnVmZmVycyggZHJhd0J1ZmZlcnMgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblxyXG5cdC8vIHRleHR1cmVcclxuXHJcblx0LyoqXHJcblx0ICogTWFrZXMgdGhlIGdpdmVuIHRleHR1cmUgdW5pdCBhY3RpdmUuXHJcblx0ICpcclxuXHQgKiBUaGlzIG1ldGhvZCBjYWNoZXMgdGhlIHN0YXRlIHNvIGBnbC5hY3RpdmVUZXh0dXJlKClgIGlzIG9ubHlcclxuXHQgKiBjYWxsZWQgd2hlbiBuZWNlc3NhcnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gd2ViZ2xTbG90IC0gVGhlIHRleHR1cmUgdW5pdCB0byBtYWtlIGFjdGl2ZS5cclxuXHQgKi9cclxuXHRhY3RpdmVUZXh0dXJlKCB3ZWJnbFNsb3QgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBnbCwgY3VycmVudFRleHR1cmVTbG90LCBtYXhUZXh0dXJlcyB9ID0gdGhpcztcclxuXHJcblx0XHRpZiAoIHdlYmdsU2xvdCA9PT0gdW5kZWZpbmVkICkgd2ViZ2xTbG90ID0gZ2wuVEVYVFVSRTAgKyBtYXhUZXh0dXJlcyAtIDE7XHJcblxyXG5cdFx0aWYgKCBjdXJyZW50VGV4dHVyZVNsb3QgIT09IHdlYmdsU2xvdCApIHtcclxuXHJcblx0XHRcdGdsLmFjdGl2ZVRleHR1cmUoIHdlYmdsU2xvdCApO1xyXG5cdFx0XHR0aGlzLmN1cnJlbnRUZXh0dXJlU2xvdCA9IHdlYmdsU2xvdDtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQmluZHMgdGhlIGdpdmVuIFdlYkdMIHRleHR1cmUgdG8gYSB0YXJnZXQuXHJcblx0ICpcclxuXHQgKiBUaGlzIG1ldGhvZCBjYWNoZXMgdGhlIHN0YXRlIHNvIGBnbC5iaW5kVGV4dHVyZSgpYCBpcyBvbmx5XHJcblx0ICogY2FsbGVkIHdoZW4gbmVjZXNzYXJ5LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHdlYmdsVHlwZSAtIFRoZSBiaW5kaW5nIHBvaW50ICh0YXJnZXQpLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xUZXh0dXJlfSB3ZWJnbFRleHR1cmUgLSBUaGUgV2ViR0wgdGV4dHVyZSB0byBiaW5kLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB3ZWJnbFNsb3QgLSBUaGUgdGV4dHVyZS5cclxuXHQgKi9cclxuXHRiaW5kVGV4dHVyZSggd2ViZ2xUeXBlLCB3ZWJnbFRleHR1cmUsIHdlYmdsU2xvdCApIHtcclxuXHJcblx0XHRjb25zdCB7IGdsLCBjdXJyZW50VGV4dHVyZVNsb3QsIGN1cnJlbnRCb3VuZFRleHR1cmVzLCBtYXhUZXh0dXJlcyB9ID0gdGhpcztcclxuXHJcblx0XHRpZiAoIHdlYmdsU2xvdCA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0aWYgKCBjdXJyZW50VGV4dHVyZVNsb3QgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdHdlYmdsU2xvdCA9IGdsLlRFWFRVUkUwICsgbWF4VGV4dHVyZXMgLSAxO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0d2ViZ2xTbG90ID0gY3VycmVudFRleHR1cmVTbG90O1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRsZXQgYm91bmRUZXh0dXJlID0gY3VycmVudEJvdW5kVGV4dHVyZXNbIHdlYmdsU2xvdCBdO1xyXG5cclxuXHRcdGlmICggYm91bmRUZXh0dXJlID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRib3VuZFRleHR1cmUgPSB7IHR5cGU6IHVuZGVmaW5lZCwgdGV4dHVyZTogdW5kZWZpbmVkIH07XHJcblx0XHRcdGN1cnJlbnRCb3VuZFRleHR1cmVzWyB3ZWJnbFNsb3QgXSA9IGJvdW5kVGV4dHVyZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBib3VuZFRleHR1cmUudHlwZSAhPT0gd2ViZ2xUeXBlIHx8IGJvdW5kVGV4dHVyZS50ZXh0dXJlICE9PSB3ZWJnbFRleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGN1cnJlbnRUZXh0dXJlU2xvdCAhPT0gd2ViZ2xTbG90ICkge1xyXG5cclxuXHRcdFx0XHRnbC5hY3RpdmVUZXh0dXJlKCB3ZWJnbFNsb3QgKTtcclxuXHRcdFx0XHR0aGlzLmN1cnJlbnRUZXh0dXJlU2xvdCA9IHdlYmdsU2xvdDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGdsLmJpbmRUZXh0dXJlKCB3ZWJnbFR5cGUsIHdlYmdsVGV4dHVyZSApO1xyXG5cclxuXHRcdFx0Ym91bmRUZXh0dXJlLnR5cGUgPSB3ZWJnbFR5cGU7XHJcblx0XHRcdGJvdW5kVGV4dHVyZS50ZXh0dXJlID0gd2ViZ2xUZXh0dXJlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBCaW5kcyBhIGdpdmVuIFdlYkdMIGJ1ZmZlciB0byBhIGdpdmVuIGJpbmRpbmcgcG9pbnQgKHRhcmdldCkgYXQgYSBnaXZlbiBpbmRleC5cclxuXHQgKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGNhY2hlcyB0aGUgc3RhdGUgc28gYGdsLmJpbmRCdWZmZXJCYXNlKClgIGlzIG9ubHlcclxuXHQgKiBjYWxsZWQgd2hlbiBuZWNlc3NhcnkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdGFyZ2V0IC0gVGhlIHRhcmdldCBmb3IgdGhlIGJpbmQgb3BlcmF0aW9uLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgdGFyZ2V0LlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xCdWZmZXJ9IGJ1ZmZlciAtIFRoZSBXZWJHTCBidWZmZXIuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciBhIGJpbmQgaGFzIGJlZW4gZXhlY3V0ZWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGJpbmRCdWZmZXJCYXNlKCB0YXJnZXQsIGluZGV4LCBidWZmZXIgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBnbCB9ID0gdGhpcztcclxuXHJcblx0XHRjb25zdCBrZXkgPSBgJHt0YXJnZXR9LSR7aW5kZXh9YDtcclxuXHJcblx0XHRpZiAoIHRoaXMuY3VycmVudEJvdW5kQnVmZmVyQmFzZXNbIGtleSBdICE9PSBidWZmZXIgKSB7XHJcblxyXG5cdFx0XHRnbC5iaW5kQnVmZmVyQmFzZSggdGFyZ2V0LCBpbmRleCwgYnVmZmVyICk7XHJcblx0XHRcdHRoaXMuY3VycmVudEJvdW5kQnVmZmVyQmFzZXNbIGtleSBdID0gYnVmZmVyO1xyXG5cclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBmYWxzZTtcclxuXHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogVW5iaW5kcyB0aGUgY3VycmVudCBib3VuZCB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogVGhpcyBtZXRob2QgY2FjaGVzIHRoZSBzdGF0ZSBzbyBgZ2wuYmluZFRleHR1cmUoKWAgaXMgb25seVxyXG5cdCAqIGNhbGxlZCB3aGVuIG5lY2Vzc2FyeS5cclxuXHQgKi9cclxuXHR1bmJpbmRUZXh0dXJlKCkge1xyXG5cclxuXHRcdGNvbnN0IHsgZ2wsIGN1cnJlbnRUZXh0dXJlU2xvdCwgY3VycmVudEJvdW5kVGV4dHVyZXMgfSA9IHRoaXM7XHJcblxyXG5cdFx0Y29uc3QgYm91bmRUZXh0dXJlID0gY3VycmVudEJvdW5kVGV4dHVyZXNbIGN1cnJlbnRUZXh0dXJlU2xvdCBdO1xyXG5cclxuXHRcdGlmICggYm91bmRUZXh0dXJlICE9PSB1bmRlZmluZWQgJiYgYm91bmRUZXh0dXJlLnR5cGUgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGdsLmJpbmRUZXh0dXJlKCBib3VuZFRleHR1cmUudHlwZSwgbnVsbCApO1xyXG5cclxuXHRcdFx0Ym91bmRUZXh0dXJlLnR5cGUgPSB1bmRlZmluZWQ7XHJcblx0XHRcdGJvdW5kVGV4dHVyZS50ZXh0dXJlID0gdW5kZWZpbmVkO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgV2ViR0xTdGF0ZTtcclxuIiwiaW1wb3J0IHsgUkdCQV9BU1RDXzR4NF9Gb3JtYXQsIFJHQkFfQVNUQ181eDRfRm9ybWF0LCBSR0JBX0FTVENfNXg1X0Zvcm1hdCwgUkdCQV9BU1RDXzZ4NV9Gb3JtYXQsIFJHQkFfQVNUQ182eDZfRm9ybWF0LCBSR0JBX0FTVENfOHg1X0Zvcm1hdCwgUkdCQV9BU1RDXzh4Nl9Gb3JtYXQsIFJHQkFfQVNUQ184eDhfRm9ybWF0LCBSR0JBX0FTVENfMTB4NV9Gb3JtYXQsIFJHQkFfQVNUQ18xMHg2X0Zvcm1hdCwgUkdCQV9BU1RDXzEweDhfRm9ybWF0LCBSR0JBX0FTVENfMTB4MTBfRm9ybWF0LCBSR0JBX0FTVENfMTJ4MTBfRm9ybWF0LCBSR0JBX0FTVENfMTJ4MTJfRm9ybWF0LCBSR0JfRVRDMV9Gb3JtYXQsIFJHQl9FVEMyX0Zvcm1hdCwgUkdCQV9FVEMyX0VBQ19Gb3JtYXQsIFJHQkFfUFZSVENfMkJQUFYxX0Zvcm1hdCwgUkdCQV9QVlJUQ180QlBQVjFfRm9ybWF0LCBSR0JfUFZSVENfMkJQUFYxX0Zvcm1hdCwgUkdCX1BWUlRDXzRCUFBWMV9Gb3JtYXQsIFJHQkFfUzNUQ19EWFQ1X0Zvcm1hdCwgUkdCQV9TM1RDX0RYVDNfRm9ybWF0LCBSR0JBX1MzVENfRFhUMV9Gb3JtYXQsIFJHQl9TM1RDX0RYVDFfRm9ybWF0LCBEZXB0aEZvcm1hdCwgRGVwdGhTdGVuY2lsRm9ybWF0LCBMdW1pbmFuY2VBbHBoYUZvcm1hdCwgTHVtaW5hbmNlRm9ybWF0LCBSZWRGb3JtYXQsIFJHQkZvcm1hdCwgUkdCQUZvcm1hdCwgQWxwaGFGb3JtYXQsIFJlZEludGVnZXJGb3JtYXQsIFJHRm9ybWF0LCBSR0ludGVnZXJGb3JtYXQsIFJHQkFJbnRlZ2VyRm9ybWF0LCBIYWxmRmxvYXRUeXBlLCBGbG9hdFR5cGUsIFVuc2lnbmVkSW50VHlwZSwgSW50VHlwZSwgVW5zaWduZWRTaG9ydFR5cGUsIFNob3J0VHlwZSwgQnl0ZVR5cGUsIFVuc2lnbmVkSW50MjQ4VHlwZSwgVW5zaWduZWRJbnQ1OTk5VHlwZSwgVW5zaWduZWRTaG9ydDU1NTFUeXBlLCBVbnNpZ25lZFNob3J0NDQ0NFR5cGUsIFVuc2lnbmVkQnl0ZVR5cGUsIFJHQkFfQlBUQ19Gb3JtYXQsIFJFRF9SR1RDMV9Gb3JtYXQsIFNJR05FRF9SRURfUkdUQzFfRm9ybWF0LCBSRURfR1JFRU5fUkdUQzJfRm9ybWF0LCBTSUdORURfUkVEX0dSRUVOX1JHVEMyX0Zvcm1hdCwgU1JHQkNvbG9yU3BhY2UsIE5vQ29sb3JTcGFjZSB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcblxyXG4vKipcclxuICogQSBXZWJHTCAyIGJhY2tlbmQgdXRpbGl0eSBtb2R1bGUgd2l0aCBjb21tb24gaGVscGVycy5cclxuICpcclxuICogQHByaXZhdGVcclxuICovXHJcbmNsYXNzIFdlYkdMVXRpbHMge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHV0aWxpdHkgb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHTEJhY2tlbmR9IGJhY2tlbmQgLSBUaGUgV2ViR0wgMiBiYWNrZW5kLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBiYWNrZW5kICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIFdlYkdMIDIgYmFja2VuZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2ViR0xCYWNrZW5kfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJhY2tlbmQgPSBiYWNrZW5kO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIHJlbmRlcmluZyBjb250ZXh0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtXZWJHTDJSZW5kZXJpbmdDb250ZXh0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdsID0gdGhpcy5iYWNrZW5kLmdsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gYSBiYWNrZW5kIG1vZHVsZSBob2xkaW5nIGV4dGVuc2lvbi1yZWxhdGVkXHJcblx0XHQgKiB1dGlsaXR5IGZ1bmN0aW9ucy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2ViR0xFeHRlbnNpb25zfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmV4dGVuc2lvbnMgPSBiYWNrZW5kLmV4dGVuc2lvbnM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29udmVydHMgdGhlIGdpdmVuIHRocmVlLmpzIGNvbnN0YW50IGludG8gYSBXZWJHTCBjb25zdGFudC5cclxuXHQgKiBUaGUgbWV0aG9kIGN1cnJlbnRseSBzdXBwb3J0cyB0aGUgY29udmVyc2lvbiBvZiB0ZXh0dXJlIGZvcm1hdHNcclxuXHQgKiBhbmQgdHlwZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gcCAtIFRoZSB0aHJlZS5qcyBjb25zdGFudC5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW2NvbG9yU3BhY2U9Tm9Db2xvclNwYWNlXSAtIFRoZSBjb2xvciBzcGFjZS5cclxuXHQgKiBAcmV0dXJuIHs/bnVtYmVyfSBUaGUgY29ycmVzcG9uZGluZyBXZWJHTCBjb25zdGFudC5cclxuXHQgKi9cclxuXHRjb252ZXJ0KCBwLCBjb2xvclNwYWNlID0gTm9Db2xvclNwYWNlICkge1xyXG5cclxuXHRcdGNvbnN0IHsgZ2wsIGV4dGVuc2lvbnMgfSA9IHRoaXM7XHJcblxyXG5cdFx0bGV0IGV4dGVuc2lvbjtcclxuXHJcblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkQnl0ZVR5cGUgKSByZXR1cm4gZ2wuVU5TSUdORURfQllURTtcclxuXHRcdGlmICggcCA9PT0gVW5zaWduZWRTaG9ydDQ0NDRUeXBlICkgcmV0dXJuIGdsLlVOU0lHTkVEX1NIT1JUXzRfNF80XzQ7XHJcblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkU2hvcnQ1NTUxVHlwZSApIHJldHVybiBnbC5VTlNJR05FRF9TSE9SVF81XzVfNV8xO1xyXG5cdFx0aWYgKCBwID09PSBVbnNpZ25lZEludDU5OTlUeXBlICkgcmV0dXJuIGdsLlVOU0lHTkVEX0lOVF81XzlfOV85X1JFVjtcclxuXHJcblx0XHRpZiAoIHAgPT09IEJ5dGVUeXBlICkgcmV0dXJuIGdsLkJZVEU7XHJcblx0XHRpZiAoIHAgPT09IFNob3J0VHlwZSApIHJldHVybiBnbC5TSE9SVDtcclxuXHRcdGlmICggcCA9PT0gVW5zaWduZWRTaG9ydFR5cGUgKSByZXR1cm4gZ2wuVU5TSUdORURfU0hPUlQ7XHJcblx0XHRpZiAoIHAgPT09IEludFR5cGUgKSByZXR1cm4gZ2wuSU5UO1xyXG5cdFx0aWYgKCBwID09PSBVbnNpZ25lZEludFR5cGUgKSByZXR1cm4gZ2wuVU5TSUdORURfSU5UO1xyXG5cdFx0aWYgKCBwID09PSBGbG9hdFR5cGUgKSByZXR1cm4gZ2wuRkxPQVQ7XHJcblxyXG5cdFx0aWYgKCBwID09PSBIYWxmRmxvYXRUeXBlICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIGdsLkhBTEZfRkxPQVQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggcCA9PT0gQWxwaGFGb3JtYXQgKSByZXR1cm4gZ2wuQUxQSEE7XHJcblx0XHRpZiAoIHAgPT09IFJHQkZvcm1hdCApIHJldHVybiBnbC5SR0I7XHJcblx0XHRpZiAoIHAgPT09IFJHQkFGb3JtYXQgKSByZXR1cm4gZ2wuUkdCQTtcclxuXHRcdGlmICggcCA9PT0gTHVtaW5hbmNlRm9ybWF0ICkgcmV0dXJuIGdsLkxVTUlOQU5DRTtcclxuXHRcdGlmICggcCA9PT0gTHVtaW5hbmNlQWxwaGFGb3JtYXQgKSByZXR1cm4gZ2wuTFVNSU5BTkNFX0FMUEhBO1xyXG5cdFx0aWYgKCBwID09PSBEZXB0aEZvcm1hdCApIHJldHVybiBnbC5ERVBUSF9DT01QT05FTlQ7XHJcblx0XHRpZiAoIHAgPT09IERlcHRoU3RlbmNpbEZvcm1hdCApIHJldHVybiBnbC5ERVBUSF9TVEVOQ0lMO1xyXG5cclxuXHRcdC8vIFdlYkdMMiBmb3JtYXRzLlxyXG5cclxuXHRcdGlmICggcCA9PT0gUmVkRm9ybWF0ICkgcmV0dXJuIGdsLlJFRDtcclxuXHRcdGlmICggcCA9PT0gUmVkSW50ZWdlckZvcm1hdCApIHJldHVybiBnbC5SRURfSU5URUdFUjtcclxuXHRcdGlmICggcCA9PT0gUkdGb3JtYXQgKSByZXR1cm4gZ2wuUkc7XHJcblx0XHRpZiAoIHAgPT09IFJHSW50ZWdlckZvcm1hdCApIHJldHVybiBnbC5SR19JTlRFR0VSO1xyXG5cdFx0aWYgKCBwID09PSBSR0JBSW50ZWdlckZvcm1hdCApIHJldHVybiBnbC5SR0JBX0lOVEVHRVI7XHJcblxyXG5cdFx0Ly8gUzNUQ1xyXG5cclxuXHRcdGlmICggcCA9PT0gUkdCX1MzVENfRFhUMV9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9TM1RDX0RYVDFfRm9ybWF0IHx8IHAgPT09IFJHQkFfUzNUQ19EWFQzX0Zvcm1hdCB8fCBwID09PSBSR0JBX1MzVENfRFhUNV9Gb3JtYXQgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGNvbG9yU3BhY2UgPT09IFNSR0JDb2xvclNwYWNlICkge1xyXG5cclxuXHRcdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjX3NyZ2InICk7XHJcblxyXG5cdFx0XHRcdGlmICggZXh0ZW5zaW9uICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRcdGlmICggcCA9PT0gUkdCX1MzVENfRFhUMV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU1JHQl9TM1RDX0RYVDFfRVhUO1xyXG5cdFx0XHRcdFx0aWYgKCBwID09PSBSR0JBX1MzVENfRFhUMV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU1JHQl9BTFBIQV9TM1RDX0RYVDFfRVhUO1xyXG5cdFx0XHRcdFx0aWYgKCBwID09PSBSR0JBX1MzVENfRFhUM19Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU1JHQl9BTFBIQV9TM1RDX0RYVDNfRVhUO1xyXG5cdFx0XHRcdFx0aWYgKCBwID09PSBSR0JBX1MzVENfRFhUNV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU1JHQl9BTFBIQV9TM1RDX0RYVDVfRVhUO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdHJldHVybiBudWxsO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApO1xyXG5cclxuXHRcdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIHAgPT09IFJHQl9TM1RDX0RYVDFfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhUO1xyXG5cdFx0XHRcdFx0aWYgKCBwID09PSBSR0JBX1MzVENfRFhUMV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDFfRVhUO1xyXG5cdFx0XHRcdFx0aWYgKCBwID09PSBSR0JBX1MzVENfRFhUM19Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDNfRVhUO1xyXG5cdFx0XHRcdFx0aWYgKCBwID09PSBSR0JBX1MzVENfRFhUNV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhUO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdHJldHVybiBudWxsO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFBWUlRDXHJcblxyXG5cdFx0aWYgKCBwID09PSBSR0JfUFZSVENfNEJQUFYxX0Zvcm1hdCB8fCBwID09PSBSR0JfUFZSVENfMkJQUFYxX0Zvcm1hdCB8fCBwID09PSBSR0JBX1BWUlRDXzRCUFBWMV9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9QVlJUQ18yQlBQVjFfRm9ybWF0ICkge1xyXG5cclxuXHRcdFx0ZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnICk7XHJcblxyXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBwID09PSBSR0JfUFZSVENfNEJQUFYxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JfUFZSVENfNEJQUFYxX0lNRztcclxuXHRcdFx0XHRpZiAoIHAgPT09IFJHQl9QVlJUQ18yQlBQVjFfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQl9QVlJUQ18yQlBQVjFfSU1HO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9QVlJUQ180QlBQVjFfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfUFZSVENfNEJQUFYxX0lNRztcclxuXHRcdFx0XHRpZiAoIHAgPT09IFJHQkFfUFZSVENfMkJQUFYxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzJCUFBWMV9JTUc7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gRVRDXHJcblxyXG5cdFx0aWYgKCBwID09PSBSR0JfRVRDMV9Gb3JtYXQgfHwgcCA9PT0gUkdCX0VUQzJfRm9ybWF0IHx8IHAgPT09IFJHQkFfRVRDMl9FQUNfRm9ybWF0ICkge1xyXG5cclxuXHRcdFx0ZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfZXRjJyApO1xyXG5cclxuXHRcdFx0aWYgKCBleHRlbnNpb24gIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCX0VUQzFfRm9ybWF0IHx8IHAgPT09IFJHQl9FVEMyX0Zvcm1hdCApIHJldHVybiAoIGNvbG9yU3BhY2UgPT09IFNSR0JDb2xvclNwYWNlICkgPyBleHRlbnNpb24uQ09NUFJFU1NFRF9TUkdCOF9FVEMyIDogZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCOF9FVEMyO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9FVEMyX0VBQ19Gb3JtYXQgKSByZXR1cm4gKCBjb2xvclNwYWNlID09PSBTUkdCQ29sb3JTcGFjZSApID8gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0VUQzJfRUFDIDogZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQThfRVRDMl9FQUM7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQVNUQ1xyXG5cclxuXHRcdGlmICggcCA9PT0gUkdCQV9BU1RDXzR4NF9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzV4NF9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzV4NV9Gb3JtYXQgfHxcclxuXHRcdFx0cCA9PT0gUkdCQV9BU1RDXzZ4NV9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzZ4Nl9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzh4NV9Gb3JtYXQgfHxcclxuXHRcdFx0cCA9PT0gUkdCQV9BU1RDXzh4Nl9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzh4OF9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzEweDVfRm9ybWF0IHx8XHJcblx0XHRcdHAgPT09IFJHQkFfQVNUQ18xMHg2X0Zvcm1hdCB8fCBwID09PSBSR0JBX0FTVENfMTB4OF9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzEweDEwX0Zvcm1hdCB8fFxyXG5cdFx0XHRwID09PSBSR0JBX0FTVENfMTJ4MTBfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ18xMngxMl9Gb3JtYXQgKSB7XHJcblxyXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9hc3RjJyApO1xyXG5cclxuXHRcdFx0aWYgKCBleHRlbnNpb24gIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9BU1RDXzR4NF9Gb3JtYXQgKSByZXR1cm4gKCBjb2xvclNwYWNlID09PSBTUkdCQ29sb3JTcGFjZSApID8gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfNHg0X0tIUiA6IGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfQVNUQ180eDRfS0hSO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9BU1RDXzV4NF9Gb3JtYXQgKSByZXR1cm4gKCBjb2xvclNwYWNlID09PSBTUkdCQ29sb3JTcGFjZSApID8gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfNXg0X0tIUiA6IGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfQVNUQ181eDRfS0hSO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9BU1RDXzV4NV9Gb3JtYXQgKSByZXR1cm4gKCBjb2xvclNwYWNlID09PSBTUkdCQ29sb3JTcGFjZSApID8gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfNXg1X0tIUiA6IGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfQVNUQ181eDVfS0hSO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9BU1RDXzZ4NV9Gb3JtYXQgKSByZXR1cm4gKCBjb2xvclNwYWNlID09PSBTUkdCQ29sb3JTcGFjZSApID8gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfNng1X0tIUiA6IGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfQVNUQ182eDVfS0hSO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9BU1RDXzZ4Nl9Gb3JtYXQgKSByZXR1cm4gKCBjb2xvclNwYWNlID09PSBTUkdCQ29sb3JTcGFjZSApID8gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfNng2X0tIUiA6IGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfQVNUQ182eDZfS0hSO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9BU1RDXzh4NV9Gb3JtYXQgKSByZXR1cm4gKCBjb2xvclNwYWNlID09PSBTUkdCQ29sb3JTcGFjZSApID8gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfOHg1X0tIUiA6IGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfQVNUQ184eDVfS0hSO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9BU1RDXzh4Nl9Gb3JtYXQgKSByZXR1cm4gKCBjb2xvclNwYWNlID09PSBTUkdCQ29sb3JTcGFjZSApID8gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfOHg2X0tIUiA6IGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfQVNUQ184eDZfS0hSO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9BU1RDXzh4OF9Gb3JtYXQgKSByZXR1cm4gKCBjb2xvclNwYWNlID09PSBTUkdCQ29sb3JTcGFjZSApID8gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfOHg4X0tIUiA6IGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfQVNUQ184eDhfS0hSO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9BU1RDXzEweDVfRm9ybWF0ICkgcmV0dXJuICggY29sb3JTcGFjZSA9PT0gU1JHQkNvbG9yU3BhY2UgKSA/IGV4dGVuc2lvbi5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzEweDVfS0hSIDogZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9BU1RDXzEweDVfS0hSO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9BU1RDXzEweDZfRm9ybWF0ICkgcmV0dXJuICggY29sb3JTcGFjZSA9PT0gU1JHQkNvbG9yU3BhY2UgKSA/IGV4dGVuc2lvbi5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzEweDZfS0hSIDogZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9BU1RDXzEweDZfS0hSO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9BU1RDXzEweDhfRm9ybWF0ICkgcmV0dXJuICggY29sb3JTcGFjZSA9PT0gU1JHQkNvbG9yU3BhY2UgKSA/IGV4dGVuc2lvbi5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzEweDhfS0hSIDogZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9BU1RDXzEweDhfS0hSO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9BU1RDXzEweDEwX0Zvcm1hdCApIHJldHVybiAoIGNvbG9yU3BhY2UgPT09IFNSR0JDb2xvclNwYWNlICkgPyBleHRlbnNpb24uQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ18xMHgxMF9LSFIgOiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX0FTVENfMTB4MTBfS0hSO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9BU1RDXzEyeDEwX0Zvcm1hdCApIHJldHVybiAoIGNvbG9yU3BhY2UgPT09IFNSR0JDb2xvclNwYWNlICkgPyBleHRlbnNpb24uQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ18xMngxMF9LSFIgOiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX0FTVENfMTJ4MTBfS0hSO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9BU1RDXzEyeDEyX0Zvcm1hdCApIHJldHVybiAoIGNvbG9yU3BhY2UgPT09IFNSR0JDb2xvclNwYWNlICkgPyBleHRlbnNpb24uQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ18xMngxMl9LSFIgOiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX0FTVENfMTJ4MTJfS0hSO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0cmV0dXJuIG51bGw7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEJQVENcclxuXHJcblx0XHRpZiAoIHAgPT09IFJHQkFfQlBUQ19Gb3JtYXQgKSB7XHJcblxyXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ0VYVF90ZXh0dXJlX2NvbXByZXNzaW9uX2JwdGMnICk7XHJcblxyXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBwID09PSBSR0JBX0JQVENfRm9ybWF0ICkgcmV0dXJuICggY29sb3JTcGFjZSA9PT0gU1JHQkNvbG9yU3BhY2UgKSA/IGV4dGVuc2lvbi5DT01QUkVTU0VEX1NSR0JfQUxQSEFfQlBUQ19VTk9STV9FWFQgOiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX0JQVENfVU5PUk1fRVhUO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0cmV0dXJuIG51bGw7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFJHVENcclxuXHJcblx0XHRpZiAoIHAgPT09IFJFRF9SR1RDMV9Gb3JtYXQgfHwgcCA9PT0gU0lHTkVEX1JFRF9SR1RDMV9Gb3JtYXQgfHwgcCA9PT0gUkVEX0dSRUVOX1JHVEMyX0Zvcm1hdCB8fCBwID09PSBTSUdORURfUkVEX0dSRUVOX1JHVEMyX0Zvcm1hdCApIHtcclxuXHJcblx0XHRcdGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnRVhUX3RleHR1cmVfY29tcHJlc3Npb25fcmd0YycgKTtcclxuXHJcblx0XHRcdGlmICggZXh0ZW5zaW9uICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIHAgPT09IFJHQkFfQlBUQ19Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkVEX1JHVEMxX0VYVDtcclxuXHRcdFx0XHRpZiAoIHAgPT09IFNJR05FRF9SRURfUkdUQzFfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1NJR05FRF9SRURfUkdUQzFfRVhUO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gUkVEX0dSRUVOX1JHVEMyX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SRURfR1JFRU5fUkdUQzJfRVhUO1xyXG5cdFx0XHRcdGlmICggcCA9PT0gU0lHTkVEX1JFRF9HUkVFTl9SR1RDMl9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU0lHTkVEX1JFRF9HUkVFTl9SR1RDMl9FWFQ7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkSW50MjQ4VHlwZSApIHtcclxuXHJcblx0XHRcdHJldHVybiBnbC5VTlNJR05FRF9JTlRfMjRfODtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gaWYgXCJwXCIgY2FuJ3QgYmUgcmVzb2x2ZWQsIGFzc3VtZSB0aGUgdXNlciBkZWZpbmVzIGEgV2ViR0wgY29uc3RhbnQgYXMgYSBzdHJpbmcgKGZhbGxiYWNrL3dvcmthcm91bmQgZm9yIHBhY2tlZCBSR0IgZm9ybWF0cylcclxuXHJcblx0XHRyZXR1cm4gKCBnbFsgcCBdICE9PSB1bmRlZmluZWQgKSA/IGdsWyBwIF0gOiBudWxsO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIHN5bmNocm9uaXplIHRoZSBDUFUgd2l0aCB0aGUgR1BVIGJ5IHdhaXRpbmcgdW50aWxcclxuXHQgKiBvbmdvaW5nIEdQVSBjb21tYW5kcyBoYXZlIGJlZW4gY29tcGxldGVkLlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcmV0dXJuIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBvbmdvaW5nIEdQVSBjb21tYW5kcyBoYXZlIGJlZW4gY29tcGxldGVkLlxyXG5cdCAqL1xyXG5cdF9jbGllbnRXYWl0QXN5bmMoKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBnbCB9ID0gdGhpcztcclxuXHJcblx0XHRjb25zdCBzeW5jID0gZ2wuZmVuY2VTeW5jKCBnbC5TWU5DX0dQVV9DT01NQU5EU19DT01QTEVURSwgMCApO1xyXG5cclxuXHRcdGdsLmZsdXNoKCk7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKCAoIHJlc29sdmUsIHJlamVjdCApID0+IHtcclxuXHJcblx0XHRcdGZ1bmN0aW9uIHRlc3QoKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHJlcyA9IGdsLmNsaWVudFdhaXRTeW5jKCBzeW5jLCBnbC5TWU5DX0ZMVVNIX0NPTU1BTkRTX0JJVCwgMCApO1xyXG5cclxuXHRcdFx0XHRpZiAoIHJlcyA9PT0gZ2wuV0FJVF9GQUlMRUQgKSB7XHJcblxyXG5cdFx0XHRcdFx0Z2wuZGVsZXRlU3luYyggc3luYyApO1xyXG5cclxuXHRcdFx0XHRcdHJlamVjdCgpO1xyXG5cdFx0XHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICggcmVzID09PSBnbC5USU1FT1VUX0VYUElSRUQgKSB7XHJcblxyXG5cdFx0XHRcdFx0cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCB0ZXN0ICk7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Z2wuZGVsZXRlU3luYyggc3luYyApO1xyXG5cclxuXHRcdFx0XHRyZXNvbHZlKCk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0ZXN0KCk7XHJcblxyXG5cdFx0fSApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBXZWJHTFV0aWxzO1xyXG4iLCJpbXBvcnQgeyBMaW5lYXJGaWx0ZXIsIExpbmVhck1pcG1hcExpbmVhckZpbHRlciwgTGluZWFyTWlwbWFwTmVhcmVzdEZpbHRlciwgTmVhcmVzdEZpbHRlciwgTmVhcmVzdE1pcG1hcExpbmVhckZpbHRlciwgTmVhcmVzdE1pcG1hcE5lYXJlc3RGaWx0ZXIsIEZsb2F0VHlwZSwgTWlycm9yZWRSZXBlYXRXcmFwcGluZywgQ2xhbXBUb0VkZ2VXcmFwcGluZywgUmVwZWF0V3JhcHBpbmcsIFNSR0JDb2xvclNwYWNlLCBOZXZlckNvbXBhcmUsIEFsd2F5c0NvbXBhcmUsIExlc3NDb21wYXJlLCBMZXNzRXF1YWxDb21wYXJlLCBFcXVhbENvbXBhcmUsIEdyZWF0ZXJFcXVhbENvbXBhcmUsIEdyZWF0ZXJDb21wYXJlLCBOb3RFcXVhbENvbXBhcmUgfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMuanMnO1xyXG5cclxubGV0IGluaXRpYWxpemVkID0gZmFsc2UsIHdyYXBwaW5nVG9HTCwgZmlsdGVyVG9HTCwgY29tcGFyZVRvR0w7XHJcblxyXG4vKipcclxuICogQSBXZWJHTCAyIGJhY2tlbmQgdXRpbGl0eSBtb2R1bGUgZm9yIG1hbmFnaW5nIHRleHR1cmVzLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuY2xhc3MgV2ViR0xUZXh0dXJlVXRpbHMge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHV0aWxpdHkgb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHTEJhY2tlbmR9IGJhY2tlbmQgLSBUaGUgV2ViR0wgMiBiYWNrZW5kLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBiYWNrZW5kICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIFdlYkdMIDIgYmFja2VuZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2ViR0xCYWNrZW5kfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJhY2tlbmQgPSBiYWNrZW5kO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIHJlbmRlcmluZyBjb250ZXh0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtXZWJHTDJSZW5kZXJpbmdDb250ZXh0fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdsID0gYmFja2VuZC5nbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIGEgYmFja2VuZCBtb2R1bGUgaG9sZGluZyBleHRlbnNpb24tcmVsYXRlZFxyXG5cdFx0ICogdXRpbGl0eSBmdW5jdGlvbnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1dlYkdMRXh0ZW5zaW9uc31cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5leHRlbnNpb25zID0gYmFja2VuZC5leHRlbnNpb25zO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBkaWN0aW9uYXJ5IGZvciBtYW5hZ2luZyBkZWZhdWx0IHRleHR1cmVzLiBUaGUga2V5XHJcblx0XHQgKiBpcyB0aGUgYmluZGluZyBwb2ludCAodGFyZ2V0KSwgdGhlIHZhbHVlIHRoZSBXRWJHTCB0ZXh0dXJlIG9iamVjdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0PEdMZW51bSxXZWJHTFRleHR1cmU+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRlZmF1bHRUZXh0dXJlcyA9IHt9O1xyXG5cclxuXHRcdGlmICggaW5pdGlhbGl6ZWQgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0dGhpcy5faW5pdCgpO1xyXG5cclxuXHRcdFx0aW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJbml0cyB0aGUgc3RhdGUgb2YgdGhlIHV0aWxpdHkuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqL1xyXG5cdF9pbml0KCkge1xyXG5cclxuXHRcdGNvbnN0IGdsID0gdGhpcy5nbDtcclxuXHJcblx0XHQvLyBTdG9yZSBvbmx5IFdlYkdMIGNvbnN0YW50cyBoZXJlLlxyXG5cclxuXHRcdHdyYXBwaW5nVG9HTCA9IHtcclxuXHRcdFx0WyBSZXBlYXRXcmFwcGluZyBdOiBnbC5SRVBFQVQsXHJcblx0XHRcdFsgQ2xhbXBUb0VkZ2VXcmFwcGluZyBdOiBnbC5DTEFNUF9UT19FREdFLFxyXG5cdFx0XHRbIE1pcnJvcmVkUmVwZWF0V3JhcHBpbmcgXTogZ2wuTUlSUk9SRURfUkVQRUFUXHJcblx0XHR9O1xyXG5cclxuXHRcdGZpbHRlclRvR0wgPSB7XHJcblx0XHRcdFsgTmVhcmVzdEZpbHRlciBdOiBnbC5ORUFSRVNULFxyXG5cdFx0XHRbIE5lYXJlc3RNaXBtYXBOZWFyZXN0RmlsdGVyIF06IGdsLk5FQVJFU1RfTUlQTUFQX05FQVJFU1QsXHJcblx0XHRcdFsgTmVhcmVzdE1pcG1hcExpbmVhckZpbHRlciBdOiBnbC5ORUFSRVNUX01JUE1BUF9MSU5FQVIsXHJcblxyXG5cdFx0XHRbIExpbmVhckZpbHRlciBdOiBnbC5MSU5FQVIsXHJcblx0XHRcdFsgTGluZWFyTWlwbWFwTmVhcmVzdEZpbHRlciBdOiBnbC5MSU5FQVJfTUlQTUFQX05FQVJFU1QsXHJcblx0XHRcdFsgTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyIF06IGdsLkxJTkVBUl9NSVBNQVBfTElORUFSXHJcblx0XHR9O1xyXG5cclxuXHRcdGNvbXBhcmVUb0dMID0ge1xyXG5cdFx0XHRbIE5ldmVyQ29tcGFyZSBdOiBnbC5ORVZFUixcclxuXHRcdFx0WyBBbHdheXNDb21wYXJlIF06IGdsLkFMV0FZUyxcclxuXHRcdFx0WyBMZXNzQ29tcGFyZSBdOiBnbC5MRVNTLFxyXG5cdFx0XHRbIExlc3NFcXVhbENvbXBhcmUgXTogZ2wuTEVRVUFMLFxyXG5cdFx0XHRbIEVxdWFsQ29tcGFyZSBdOiBnbC5FUVVBTCxcclxuXHRcdFx0WyBHcmVhdGVyRXF1YWxDb21wYXJlIF06IGdsLkdFUVVBTCxcclxuXHRcdFx0WyBHcmVhdGVyQ29tcGFyZSBdOiBnbC5HUkVBVEVSLFxyXG5cdFx0XHRbIE5vdEVxdWFsQ29tcGFyZSBdOiBnbC5OT1RFUVVBTFxyXG5cdFx0fTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBuYXRpdmUgdGV4dHVyZSB0eXBlIGZvciB0aGUgZ2l2ZW4gdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlLlxyXG5cdCAqIEByZXR1cm4ge0dMZW51bX0gVGhlIG5hdGl2ZSB0ZXh0dXJlIHR5cGUuXHJcblx0ICovXHJcblx0Z2V0R0xUZXh0dXJlVHlwZSggdGV4dHVyZSApIHtcclxuXHJcblx0XHRjb25zdCB7IGdsIH0gPSB0aGlzO1xyXG5cclxuXHRcdGxldCBnbFRleHR1cmVUeXBlO1xyXG5cclxuXHRcdGlmICggdGV4dHVyZS5pc0N1YmVUZXh0dXJlID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0Z2xUZXh0dXJlVHlwZSA9IGdsLlRFWFRVUkVfQ1VCRV9NQVA7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggdGV4dHVyZS5pc0RhdGFBcnJheVRleHR1cmUgPT09IHRydWUgfHwgdGV4dHVyZS5pc0NvbXByZXNzZWRBcnJheVRleHR1cmUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRnbFRleHR1cmVUeXBlID0gZ2wuVEVYVFVSRV8yRF9BUlJBWTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCB0ZXh0dXJlLmlzRGF0YTNEVGV4dHVyZSA9PT0gdHJ1ZSApIHsgLy8gVE9ETzogaXNDb21wcmVzc2VkM0RUZXh0dXJlLCB3YWl0IGZvciAjMjY2NDJcclxuXHJcblx0XHRcdGdsVGV4dHVyZVR5cGUgPSBnbC5URVhUVVJFXzNEO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRnbFRleHR1cmVUeXBlID0gZ2wuVEVYVFVSRV8yRDtcclxuXHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBnbFRleHR1cmVUeXBlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIG5hdGl2ZSB0ZXh0dXJlIHR5cGUgZm9yIHRoZSBnaXZlbiB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHs/c3RyaW5nfSBpbnRlcm5hbEZvcm1hdE5hbWUgLSBUaGUgaW50ZXJuYWwgZm9ybWF0IG5hbWUuIFdoZW4gYG51bGxgLCB0aGUgaW50ZXJuYWwgZm9ybWF0IGlzIGRlcml2ZWQgZnJvbSB0aGUgc3Vic2VxdWVudCBwYXJhbWV0ZXJzLlxyXG5cdCAqIEBwYXJhbSB7R0xlbnVtfSBnbEZvcm1hdCAtIFRoZSBXZWJHTCBmb3JtYXQuXHJcblx0ICogQHBhcmFtIHtHTGVudW19IGdsVHlwZSAtIFRoZSBXZWJHTCB0eXBlLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBjb2xvclNwYWNlIC0gVGhlIHRleHR1cmUncyBjb2xvciBzcGFjZS5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtmb3JjZUxpbmVhclRyYW5zZmVyPWZhbHNlXSAtIFdoZXRoZXIgdG8gZm9yY2UgYSBsaW5lYXIgdHJhbnNmZXIgb3Igbm90LlxyXG5cdCAqIEByZXR1cm4ge0dMZW51bX0gVGhlIGludGVybmFsIGZvcm1hdC5cclxuXHQgKi9cclxuXHRnZXRJbnRlcm5hbEZvcm1hdCggaW50ZXJuYWxGb3JtYXROYW1lLCBnbEZvcm1hdCwgZ2xUeXBlLCBjb2xvclNwYWNlLCBmb3JjZUxpbmVhclRyYW5zZmVyID0gZmFsc2UgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBnbCwgZXh0ZW5zaW9ucyB9ID0gdGhpcztcclxuXHJcblx0XHRpZiAoIGludGVybmFsRm9ybWF0TmFtZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGlmICggZ2xbIGludGVybmFsRm9ybWF0TmFtZSBdICE9PSB1bmRlZmluZWQgKSByZXR1cm4gZ2xbIGludGVybmFsRm9ybWF0TmFtZSBdO1xyXG5cclxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogQXR0ZW1wdCB0byB1c2Ugbm9uLWV4aXN0aW5nIFdlYkdMIGludGVybmFsIGZvcm1hdCBcXCcnICsgaW50ZXJuYWxGb3JtYXROYW1lICsgJ1xcJycgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0bGV0IGludGVybmFsRm9ybWF0ID0gZ2xGb3JtYXQ7XHJcblxyXG5cdFx0aWYgKCBnbEZvcm1hdCA9PT0gZ2wuUkVEICkge1xyXG5cclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IGdsLkZMT0FUICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SMzJGO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuSEFMRl9GTE9BVCApIGludGVybmFsRm9ybWF0ID0gZ2wuUjE2RjtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IGdsLlVOU0lHTkVEX0JZVEUgKSBpbnRlcm5hbEZvcm1hdCA9IGdsLlI4O1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuVU5TSUdORURfU0hPUlQgKSBpbnRlcm5hbEZvcm1hdCA9IGdsLlIxNjtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IGdsLlVOU0lHTkVEX0lOVCApIGludGVybmFsRm9ybWF0ID0gZ2wuUjMyVUk7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBnbC5CWVRFICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SOEk7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBnbC5TSE9SVCApIGludGVybmFsRm9ybWF0ID0gZ2wuUjE2STtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IGdsLklOVCApIGludGVybmFsRm9ybWF0ID0gZ2wuUjMySTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBnbEZvcm1hdCA9PT0gZ2wuUkVEX0lOVEVHRVIgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuVU5TSUdORURfQllURSApIGludGVybmFsRm9ybWF0ID0gZ2wuUjhVSTtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IGdsLlVOU0lHTkVEX1NIT1JUICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SMTZVSTtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IGdsLlVOU0lHTkVEX0lOVCApIGludGVybmFsRm9ybWF0ID0gZ2wuUjMyVUk7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBnbC5CWVRFICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SOEk7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBnbC5TSE9SVCApIGludGVybmFsRm9ybWF0ID0gZ2wuUjE2STtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IGdsLklOVCApIGludGVybmFsRm9ybWF0ID0gZ2wuUjMySTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBnbEZvcm1hdCA9PT0gZ2wuUkcgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuRkxPQVQgKSBpbnRlcm5hbEZvcm1hdCA9IGdsLlJHMzJGO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuSEFMRl9GTE9BVCApIGludGVybmFsRm9ybWF0ID0gZ2wuUkcxNkY7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBnbC5VTlNJR05FRF9CWVRFICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SRzg7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBnbC5VTlNJR05FRF9TSE9SVCApIGludGVybmFsRm9ybWF0ID0gZ2wuUkcxNjtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IGdsLlVOU0lHTkVEX0lOVCApIGludGVybmFsRm9ybWF0ID0gZ2wuUkczMlVJO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuQllURSApIGludGVybmFsRm9ybWF0ID0gZ2wuUkc4STtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IGdsLlNIT1JUICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SRzE2STtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IGdsLklOVCApIGludGVybmFsRm9ybWF0ID0gZ2wuUkczMkk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggZ2xGb3JtYXQgPT09IGdsLlJHX0lOVEVHRVIgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuVU5TSUdORURfQllURSApIGludGVybmFsRm9ybWF0ID0gZ2wuUkc4VUk7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBnbC5VTlNJR05FRF9TSE9SVCApIGludGVybmFsRm9ybWF0ID0gZ2wuUkcxNlVJO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuVU5TSUdORURfSU5UICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SRzMyVUk7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBnbC5CWVRFICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SRzhJO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuU0hPUlQgKSBpbnRlcm5hbEZvcm1hdCA9IGdsLlJHMTZJO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuSU5UICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SRzMySTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBnbEZvcm1hdCA9PT0gZ2wuUkdCICkge1xyXG5cclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IGdsLkZMT0FUICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SR0IzMkY7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBnbC5IQUxGX0ZMT0FUICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SR0IxNkY7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBnbC5VTlNJR05FRF9CWVRFICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SR0I4O1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuVU5TSUdORURfU0hPUlQgKSBpbnRlcm5hbEZvcm1hdCA9IGdsLlJHQjE2O1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuVU5TSUdORURfSU5UICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SR0IzMlVJO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuQllURSApIGludGVybmFsRm9ybWF0ID0gZ2wuUkdCOEk7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBnbC5TSE9SVCApIGludGVybmFsRm9ybWF0ID0gZ2wuUkdCMTZJO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuSU5UICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SR0IzMkk7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBnbC5VTlNJR05FRF9CWVRFICkgaW50ZXJuYWxGb3JtYXQgPSAoIGNvbG9yU3BhY2UgPT09IFNSR0JDb2xvclNwYWNlICYmIGZvcmNlTGluZWFyVHJhbnNmZXIgPT09IGZhbHNlICkgPyBnbC5TUkdCOCA6IGdsLlJHQjg7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBnbC5VTlNJR05FRF9TSE9SVF81XzZfNSApIGludGVybmFsRm9ybWF0ID0gZ2wuUkdCNTY1O1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuVU5TSUdORURfU0hPUlRfNV81XzVfMSApIGludGVybmFsRm9ybWF0ID0gZ2wuUkdCNV9BMTtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IGdsLlVOU0lHTkVEX1NIT1JUXzRfNF80XzQgKSBpbnRlcm5hbEZvcm1hdCA9IGdsLlJHQjQ7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBnbC5VTlNJR05FRF9JTlRfNV85XzlfOV9SRVYgKSBpbnRlcm5hbEZvcm1hdCA9IGdsLlJHQjlfRTU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggZ2xGb3JtYXQgPT09IGdsLlJHQl9JTlRFR0VSICkge1xyXG5cclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IGdsLlVOU0lHTkVEX0JZVEUgKSBpbnRlcm5hbEZvcm1hdCA9IGdsLlJHQjhVSTtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IGdsLlVOU0lHTkVEX1NIT1JUICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SR0IxNlVJO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuVU5TSUdORURfSU5UICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SR0IzMlVJO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuQllURSApIGludGVybmFsRm9ybWF0ID0gZ2wuUkdCOEk7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBnbC5TSE9SVCApIGludGVybmFsRm9ybWF0ID0gZ2wuUkdCMTZJO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuSU5UICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SR0IzMkk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggZ2xGb3JtYXQgPT09IGdsLlJHQkEgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuRkxPQVQgKSBpbnRlcm5hbEZvcm1hdCA9IGdsLlJHQkEzMkY7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBnbC5IQUxGX0ZMT0FUICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SR0JBMTZGO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuVU5TSUdORURfQllURSApIGludGVybmFsRm9ybWF0ID0gZ2wuUkdCQTg7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBnbC5VTlNJR05FRF9TSE9SVCApIGludGVybmFsRm9ybWF0ID0gZ2wuUkdCQTE2O1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuVU5TSUdORURfSU5UICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SR0JBMzJVSTtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IGdsLkJZVEUgKSBpbnRlcm5hbEZvcm1hdCA9IGdsLlJHQkE4STtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IGdsLlNIT1JUICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SR0JBMTZJO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuSU5UICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SR0JBMzJJO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuVU5TSUdORURfQllURSApIGludGVybmFsRm9ybWF0ID0gKCBjb2xvclNwYWNlID09PSBTUkdCQ29sb3JTcGFjZSAmJiBmb3JjZUxpbmVhclRyYW5zZmVyID09PSBmYWxzZSApID8gZ2wuU1JHQjhfQUxQSEE4IDogZ2wuUkdCQTg7XHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBnbC5VTlNJR05FRF9TSE9SVF80XzRfNF80ICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SR0JBNDtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IGdsLlVOU0lHTkVEX1NIT1JUXzVfNV81XzEgKSBpbnRlcm5hbEZvcm1hdCA9IGdsLlJHQjVfQTE7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggZ2xGb3JtYXQgPT09IGdsLlJHQkFfSU5URUdFUiApIHtcclxuXHJcblx0XHRcdGlmICggZ2xUeXBlID09PSBnbC5VTlNJR05FRF9CWVRFICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SR0JBOFVJO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuVU5TSUdORURfU0hPUlQgKSBpbnRlcm5hbEZvcm1hdCA9IGdsLlJHQkExNlVJO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuVU5TSUdORURfSU5UICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SR0JBMzJVSTtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IGdsLkJZVEUgKSBpbnRlcm5hbEZvcm1hdCA9IGdsLlJHQkE4STtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IGdsLlNIT1JUICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SR0JBMTZJO1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuSU5UICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5SR0JBMzJJO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGdsRm9ybWF0ID09PSBnbC5ERVBUSF9DT01QT05FTlQgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuVU5TSUdORURfU0hPUlQgKSBpbnRlcm5hbEZvcm1hdCA9IGdsLkRFUFRIX0NPTVBPTkVOVDE2O1xyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuVU5TSUdORURfSU5UICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5ERVBUSF9DT01QT05FTlQyNDtcclxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IGdsLkZMT0FUICkgaW50ZXJuYWxGb3JtYXQgPSBnbC5ERVBUSF9DT01QT05FTlQzMkY7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggZ2xGb3JtYXQgPT09IGdsLkRFUFRIX1NURU5DSUwgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuVU5TSUdORURfSU5UXzI0XzggKSBpbnRlcm5hbEZvcm1hdCA9IGdsLkRFUFRIMjRfU1RFTkNJTDg7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggaW50ZXJuYWxGb3JtYXQgPT09IGdsLlIxNkYgfHwgaW50ZXJuYWxGb3JtYXQgPT09IGdsLlIzMkYgfHxcclxuXHRcdFx0aW50ZXJuYWxGb3JtYXQgPT09IGdsLlJHMTZGIHx8IGludGVybmFsRm9ybWF0ID09PSBnbC5SRzMyRiB8fFxyXG5cdFx0XHRpbnRlcm5hbEZvcm1hdCA9PT0gZ2wuUkdCQTE2RiB8fCBpbnRlcm5hbEZvcm1hdCA9PT0gZ2wuUkdCQTMyRiApIHtcclxuXHJcblx0XHRcdGV4dGVuc2lvbnMuZ2V0KCAnRVhUX2NvbG9yX2J1ZmZlcl9mbG9hdCcgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGludGVybmFsRm9ybWF0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHRleHR1cmUgcGFyYW1ldGVycyBmb3IgdGhlIGdpdmVuIHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0dMZW51bX0gdGV4dHVyZVR5cGUgLSBUaGUgdGV4dHVyZSB0eXBlLlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlLlxyXG5cdCAqL1xyXG5cdHNldFRleHR1cmVQYXJhbWV0ZXJzKCB0ZXh0dXJlVHlwZSwgdGV4dHVyZSApIHtcclxuXHJcblx0XHRjb25zdCB7IGdsLCBleHRlbnNpb25zLCBiYWNrZW5kIH0gPSB0aGlzO1xyXG5cclxuXHJcblx0XHRnbC5waXhlbFN0b3JlaSggZ2wuVU5QQUNLX0ZMSVBfWV9XRUJHTCwgdGV4dHVyZS5mbGlwWSApO1xyXG5cdFx0Z2wucGl4ZWxTdG9yZWkoIGdsLlVOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTCwgdGV4dHVyZS5wcmVtdWx0aXBseUFscGhhICk7XHJcblx0XHRnbC5waXhlbFN0b3JlaSggZ2wuVU5QQUNLX0FMSUdOTUVOVCwgdGV4dHVyZS51bnBhY2tBbGlnbm1lbnQgKTtcclxuXHRcdGdsLnBpeGVsU3RvcmVpKCBnbC5VTlBBQ0tfQ09MT1JTUEFDRV9DT05WRVJTSU9OX1dFQkdMLCBnbC5OT05FICk7XHJcblxyXG5cdFx0Z2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIGdsLlRFWFRVUkVfV1JBUF9TLCB3cmFwcGluZ1RvR0xbIHRleHR1cmUud3JhcFMgXSApO1xyXG5cdFx0Z2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIGdsLlRFWFRVUkVfV1JBUF9ULCB3cmFwcGluZ1RvR0xbIHRleHR1cmUud3JhcFQgXSApO1xyXG5cclxuXHRcdGlmICggdGV4dHVyZVR5cGUgPT09IGdsLlRFWFRVUkVfM0QgfHwgdGV4dHVyZVR5cGUgPT09IGdsLlRFWFRVUkVfMkRfQVJSQVkgKSB7XHJcblxyXG5cdFx0XHRnbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgZ2wuVEVYVFVSRV9XUkFQX1IsIHdyYXBwaW5nVG9HTFsgdGV4dHVyZS53cmFwUiBdICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGdsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCBnbC5URVhUVVJFX01BR19GSUxURVIsIGZpbHRlclRvR0xbIHRleHR1cmUubWFnRmlsdGVyIF0gKTtcclxuXHJcblxyXG5cdFx0Y29uc3QgaGFzTWlwbWFwcyA9IHRleHR1cmUubWlwbWFwcyAhPT0gdW5kZWZpbmVkICYmIHRleHR1cmUubWlwbWFwcy5sZW5ndGggPiAwO1xyXG5cclxuXHRcdC8vIGZvbGxvdyBXZWJHUFUgYmFja2VuZCBtYXBwaW5nIGZvciB0ZXh0dXJlIGZpbHRlcmluZ1xyXG5cdFx0Y29uc3QgbWluRmlsdGVyID0gdGV4dHVyZS5taW5GaWx0ZXIgPT09IExpbmVhckZpbHRlciAmJiBoYXNNaXBtYXBzID8gTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyIDogdGV4dHVyZS5taW5GaWx0ZXI7XHJcblxyXG5cdFx0Z2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZmlsdGVyVG9HTFsgbWluRmlsdGVyIF0gKTtcclxuXHJcblx0XHRpZiAoIHRleHR1cmUuY29tcGFyZUZ1bmN0aW9uICkge1xyXG5cclxuXHRcdFx0Z2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIGdsLlRFWFRVUkVfQ09NUEFSRV9NT0RFLCBnbC5DT01QQVJFX1JFRl9UT19URVhUVVJFICk7XHJcblx0XHRcdGdsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCBnbC5URVhUVVJFX0NPTVBBUkVfRlVOQywgY29tcGFyZVRvR0xbIHRleHR1cmUuY29tcGFyZUZ1bmN0aW9uIF0gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBleHRlbnNpb25zLmhhcyggJ0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYycgKSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdGlmICggdGV4dHVyZS5tYWdGaWx0ZXIgPT09IE5lYXJlc3RGaWx0ZXIgKSByZXR1cm47XHJcblx0XHRcdGlmICggdGV4dHVyZS5taW5GaWx0ZXIgIT09IE5lYXJlc3RNaXBtYXBMaW5lYXJGaWx0ZXIgJiYgdGV4dHVyZS5taW5GaWx0ZXIgIT09IExpbmVhck1pcG1hcExpbmVhckZpbHRlciApIHJldHVybjtcclxuXHRcdFx0aWYgKCB0ZXh0dXJlLnR5cGUgPT09IEZsb2F0VHlwZSAmJiBleHRlbnNpb25zLmhhcyggJ09FU190ZXh0dXJlX2Zsb2F0X2xpbmVhcicgKSA9PT0gZmFsc2UgKSByZXR1cm47IC8vIHZlcmlmeSBleHRlbnNpb24gZm9yIFdlYkdMIDEgYW5kIFdlYkdMIDJcclxuXHJcblx0XHRcdGlmICggdGV4dHVyZS5hbmlzb3Ryb3B5ID4gMSApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnICk7XHJcblx0XHRcdFx0Z2wudGV4UGFyYW1ldGVyZiggdGV4dHVyZVR5cGUsIGV4dGVuc2lvbi5URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCwgTWF0aC5taW4oIHRleHR1cmUuYW5pc290cm9weSwgYmFja2VuZC5nZXRNYXhBbmlzb3Ryb3B5KCkgKSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGEgZGVmYXVsdCB0ZXh0dXJlIGZvciB0aGUgZ2l2ZW4gdGV4dHVyZSB0aGF0IGNhbiBiZSB1c2VkXHJcblx0ICogYXMgYSBwbGFjZWhvbGRlciB1bnRpbCB0aGUgYWN0dWFsIHRleHR1cmUgaXMgcmVhZHkgZm9yIHVzYWdlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUgdG8gY3JlYXRlIGEgZGVmYXVsdCB0ZXh0dXJlIGZvci5cclxuXHQgKi9cclxuXHRjcmVhdGVEZWZhdWx0VGV4dHVyZSggdGV4dHVyZSApIHtcclxuXHJcblx0XHRjb25zdCB7IGdsLCBiYWNrZW5kLCBkZWZhdWx0VGV4dHVyZXMgfSA9IHRoaXM7XHJcblxyXG5cclxuXHRcdGNvbnN0IGdsVGV4dHVyZVR5cGUgPSB0aGlzLmdldEdMVGV4dHVyZVR5cGUoIHRleHR1cmUgKTtcclxuXHJcblx0XHRsZXQgdGV4dHVyZUdQVSA9IGRlZmF1bHRUZXh0dXJlc1sgZ2xUZXh0dXJlVHlwZSBdO1xyXG5cclxuXHRcdGlmICggdGV4dHVyZUdQVSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0dGV4dHVyZUdQVSA9IGdsLmNyZWF0ZVRleHR1cmUoKTtcclxuXHJcblx0XHRcdGJhY2tlbmQuc3RhdGUuYmluZFRleHR1cmUoIGdsVGV4dHVyZVR5cGUsIHRleHR1cmVHUFUgKTtcclxuXHRcdFx0Z2wudGV4UGFyYW1ldGVyaSggZ2xUZXh0dXJlVHlwZSwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBnbC5ORUFSRVNUICk7XHJcblx0XHRcdGdsLnRleFBhcmFtZXRlcmkoIGdsVGV4dHVyZVR5cGUsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTkVBUkVTVCApO1xyXG5cclxuXHRcdFx0Ly8gZ2wudGV4SW1hZ2UyRCggZ2xUZXh0dXJlVHlwZSwgMCwgZ2wuUkdCQSwgMSwgMSwgMCwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgZGF0YSApO1xyXG5cclxuXHRcdFx0ZGVmYXVsdFRleHR1cmVzWyBnbFRleHR1cmVUeXBlIF0gPSB0ZXh0dXJlR1BVO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRiYWNrZW5kLnNldCggdGV4dHVyZSwge1xyXG5cdFx0XHR0ZXh0dXJlR1BVLFxyXG5cdFx0XHRnbFRleHR1cmVUeXBlLFxyXG5cdFx0XHRpc0RlZmF1bHQ6IHRydWVcclxuXHRcdH0gKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWZpbmVzIGEgdGV4dHVyZSBvbiB0aGUgR1BVIGZvciB0aGUgZ2l2ZW4gdGV4dHVyZSBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIuXHJcblx0ICogQHJldHVybiB7dW5kZWZpbmVkfVxyXG5cdCAqL1xyXG5cdGNyZWF0ZVRleHR1cmUoIHRleHR1cmUsIG9wdGlvbnMgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBnbCwgYmFja2VuZCB9ID0gdGhpcztcclxuXHRcdGNvbnN0IHsgbGV2ZWxzLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCB9ID0gb3B0aW9ucztcclxuXHJcblx0XHRjb25zdCBnbEZvcm1hdCA9IGJhY2tlbmQudXRpbHMuY29udmVydCggdGV4dHVyZS5mb3JtYXQsIHRleHR1cmUuY29sb3JTcGFjZSApO1xyXG5cdFx0Y29uc3QgZ2xUeXBlID0gYmFja2VuZC51dGlscy5jb252ZXJ0KCB0ZXh0dXJlLnR5cGUgKTtcclxuXHRcdGNvbnN0IGdsSW50ZXJuYWxGb3JtYXQgPSB0aGlzLmdldEludGVybmFsRm9ybWF0KCB0ZXh0dXJlLmludGVybmFsRm9ybWF0LCBnbEZvcm1hdCwgZ2xUeXBlLCB0ZXh0dXJlLmNvbG9yU3BhY2UsIHRleHR1cmUuaXNWaWRlb1RleHR1cmUgKTtcclxuXHJcblx0XHRjb25zdCB0ZXh0dXJlR1BVID0gZ2wuY3JlYXRlVGV4dHVyZSgpO1xyXG5cdFx0Y29uc3QgZ2xUZXh0dXJlVHlwZSA9IHRoaXMuZ2V0R0xUZXh0dXJlVHlwZSggdGV4dHVyZSApO1xyXG5cclxuXHRcdGJhY2tlbmQuc3RhdGUuYmluZFRleHR1cmUoIGdsVGV4dHVyZVR5cGUsIHRleHR1cmVHUFUgKTtcclxuXHJcblx0XHR0aGlzLnNldFRleHR1cmVQYXJhbWV0ZXJzKCBnbFRleHR1cmVUeXBlLCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0aWYgKCB0ZXh0dXJlLmlzRGF0YUFycmF5VGV4dHVyZSB8fCB0ZXh0dXJlLmlzQ29tcHJlc3NlZEFycmF5VGV4dHVyZSApIHtcclxuXHJcblx0XHRcdGdsLnRleFN0b3JhZ2UzRCggZ2wuVEVYVFVSRV8yRF9BUlJBWSwgbGV2ZWxzLCBnbEludGVybmFsRm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHRleHR1cmUuaXNEYXRhM0RUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0Z2wudGV4U3RvcmFnZTNEKCBnbC5URVhUVVJFXzNELCBsZXZlbHMsIGdsSW50ZXJuYWxGb3JtYXQsIHdpZHRoLCBoZWlnaHQsIGRlcHRoICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggISB0ZXh0dXJlLmlzVmlkZW9UZXh0dXJlICkge1xyXG5cclxuXHRcdFx0Z2wudGV4U3RvcmFnZTJEKCBnbFRleHR1cmVUeXBlLCBsZXZlbHMsIGdsSW50ZXJuYWxGb3JtYXQsIHdpZHRoLCBoZWlnaHQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0YmFja2VuZC5zZXQoIHRleHR1cmUsIHtcclxuXHRcdFx0dGV4dHVyZUdQVSxcclxuXHRcdFx0Z2xUZXh0dXJlVHlwZSxcclxuXHRcdFx0Z2xGb3JtYXQsXHJcblx0XHRcdGdsVHlwZSxcclxuXHRcdFx0Z2xJbnRlcm5hbEZvcm1hdFxyXG5cdFx0fSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwbG9hZHMgdGV4dHVyZSBidWZmZXIgZGF0YSB0byB0aGUgR1BVIG1lbW9yeS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xCdWZmZXJ9IGJ1ZmZlciAtIFRoZSBidWZmZXIgZGF0YS5cclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZSxcclxuXHQgKi9cclxuXHRjb3B5QnVmZmVyVG9UZXh0dXJlKCBidWZmZXIsIHRleHR1cmUgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBnbCwgYmFja2VuZCB9ID0gdGhpcztcclxuXHJcblx0XHRjb25zdCB7IHRleHR1cmVHUFUsIGdsVGV4dHVyZVR5cGUsIGdsRm9ybWF0LCBnbFR5cGUgfSA9IGJhY2tlbmQuZ2V0KCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0Y29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSB0ZXh0dXJlLnNvdXJjZS5kYXRhO1xyXG5cclxuXHRcdGdsLmJpbmRCdWZmZXIoIGdsLlBJWEVMX1VOUEFDS19CVUZGRVIsIGJ1ZmZlciApO1xyXG5cclxuXHRcdGJhY2tlbmQuc3RhdGUuYmluZFRleHR1cmUoIGdsVGV4dHVyZVR5cGUsIHRleHR1cmVHUFUgKTtcclxuXHJcblx0XHRnbC5waXhlbFN0b3JlaSggZ2wuVU5QQUNLX0ZMSVBfWV9XRUJHTCwgZmFsc2UgKTtcclxuXHRcdGdsLnBpeGVsU3RvcmVpKCBnbC5VTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wsIGZhbHNlICk7XHJcblx0XHRnbC50ZXhTdWJJbWFnZTJEKCBnbFRleHR1cmVUeXBlLCAwLCAwLCAwLCB3aWR0aCwgaGVpZ2h0LCBnbEZvcm1hdCwgZ2xUeXBlLCAwICk7XHJcblxyXG5cdFx0Z2wuYmluZEJ1ZmZlciggZ2wuUElYRUxfVU5QQUNLX0JVRkZFUiwgbnVsbCApO1xyXG5cclxuXHRcdGJhY2tlbmQuc3RhdGUudW5iaW5kVGV4dHVyZSgpO1xyXG5cdFx0Ly8gZGVidWdcclxuXHRcdC8vIGNvbnN0IGZyYW1lYnVmZmVyID0gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTtcclxuXHRcdC8vIGdsLmJpbmRGcmFtZWJ1ZmZlciggZ2wuRlJBTUVCVUZGRVIsIGZyYW1lYnVmZmVyICk7XHJcblx0XHQvLyBnbC5mcmFtZWJ1ZmZlclRleHR1cmUyRCggZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbFRleHR1cmVUeXBlLCB0ZXh0dXJlR1BVLCAwICk7XHJcblxyXG5cdFx0Ly8gY29uc3QgcmVhZG91dCA9IG5ldyBGbG9hdDMyQXJyYXkoIHdpZHRoICogaGVpZ2h0ICogNCApO1xyXG5cclxuXHRcdC8vIGNvbnN0IGFsdEZvcm1hdCA9IGdsLmdldFBhcmFtZXRlciggZ2wuSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVQgKTtcclxuXHRcdC8vIGNvbnN0IGFsdFR5cGUgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLklNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfVFlQRSApO1xyXG5cclxuXHRcdC8vIGdsLnJlYWRQaXhlbHMoIDAsIDAsIHdpZHRoLCBoZWlnaHQsIGFsdEZvcm1hdCwgYWx0VHlwZSwgcmVhZG91dCApO1xyXG5cdFx0Ly8gZ2wuYmluZEZyYW1lYnVmZmVyKCBnbC5GUkFNRUJVRkZFUiwgbnVsbCApO1xyXG5cdFx0Ly8gY29uc29sZS5sb2coIHJlYWRvdXQgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGxvYWRzIHRoZSB1cGRhdGVkIHRleHR1cmUgZGF0YSB0byB0aGUgR1BVLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZVRleHR1cmUoIHRleHR1cmUsIG9wdGlvbnMgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBnbCB9ID0gdGhpcztcclxuXHRcdGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gb3B0aW9ucztcclxuXHRcdGNvbnN0IHsgdGV4dHVyZUdQVSwgZ2xUZXh0dXJlVHlwZSwgZ2xGb3JtYXQsIGdsVHlwZSwgZ2xJbnRlcm5hbEZvcm1hdCB9ID0gdGhpcy5iYWNrZW5kLmdldCggdGV4dHVyZSApO1xyXG5cclxuXHRcdGlmICggdGV4dHVyZS5pc1JlbmRlclRhcmdldFRleHR1cmUgfHwgKCB0ZXh0dXJlR1BVID09PSB1bmRlZmluZWQgLyogdW5zdXBwb3J0ZWQgdGV4dHVyZSBmb3JtYXQgKi8gKSApXHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHRjb25zdCBnZXRJbWFnZSA9ICggc291cmNlICkgPT4ge1xyXG5cclxuXHRcdFx0aWYgKCBzb3VyY2UuaXNEYXRhVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0cmV0dXJuIHNvdXJjZS5pbWFnZS5kYXRhO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggKCB0eXBlb2YgSFRNTEltYWdlRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgc291cmNlIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCApIHx8XHJcblx0XHRcdFx0KCB0eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHNvdXJjZSBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50ICkgfHxcclxuXHRcdFx0XHQoIHR5cGVvZiBJbWFnZUJpdG1hcCAhPT0gJ3VuZGVmaW5lZCcgJiYgc291cmNlIGluc3RhbmNlb2YgSW1hZ2VCaXRtYXAgKSB8fFxyXG5cdFx0XHRcdHNvdXJjZSBpbnN0YW5jZW9mIE9mZnNjcmVlbkNhbnZhcyApIHtcclxuXHJcblx0XHRcdFx0cmV0dXJuIHNvdXJjZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBzb3VyY2UuZGF0YTtcclxuXHJcblx0XHR9O1xyXG5cclxuXHRcdHRoaXMuYmFja2VuZC5zdGF0ZS5iaW5kVGV4dHVyZSggZ2xUZXh0dXJlVHlwZSwgdGV4dHVyZUdQVSApO1xyXG5cclxuXHRcdHRoaXMuc2V0VGV4dHVyZVBhcmFtZXRlcnMoIGdsVGV4dHVyZVR5cGUsIHRleHR1cmUgKTtcclxuXHJcblx0XHRpZiAoIHRleHR1cmUuaXNDb21wcmVzc2VkVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdGNvbnN0IG1pcG1hcHMgPSB0ZXh0dXJlLm1pcG1hcHM7XHJcblx0XHRcdGNvbnN0IGltYWdlID0gb3B0aW9ucy5pbWFnZTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IG1pcG1hcHMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBtaXBtYXAgPSBtaXBtYXBzWyBpIF07XHJcblxyXG5cdFx0XHRcdGlmICggdGV4dHVyZS5pc0NvbXByZXNzZWRBcnJheVRleHR1cmUgKSB7XHJcblxyXG5cclxuXHRcdFx0XHRcdGlmICggdGV4dHVyZS5mb3JtYXQgIT09IGdsLlJHQkEgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIGdsRm9ybWF0ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRnbC5jb21wcmVzc2VkVGV4U3ViSW1hZ2UzRCggZ2wuVEVYVFVSRV8yRF9BUlJBWSwgaSwgMCwgMCwgMCwgbWlwbWFwLndpZHRoLCBtaXBtYXAuaGVpZ2h0LCBpbWFnZS5kZXB0aCwgZ2xGb3JtYXQsIG1pcG1hcC5kYXRhICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBBdHRlbXB0IHRvIGxvYWQgdW5zdXBwb3J0ZWQgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdCBpbiAudXBsb2FkVGV4dHVyZSgpJyApO1xyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRnbC50ZXhTdWJJbWFnZTNEKCBnbC5URVhUVVJFXzJEX0FSUkFZLCBpLCAwLCAwLCAwLCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIGltYWdlLmRlcHRoLCBnbEZvcm1hdCwgZ2xUeXBlLCBtaXBtYXAuZGF0YSApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGdsRm9ybWF0ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Z2wuY29tcHJlc3NlZFRleFN1YkltYWdlMkQoIGdsLlRFWFRVUkVfMkQsIGksIDAsIDAsIG1pcG1hcC53aWR0aCwgbWlwbWFwLmhlaWdodCwgZ2xGb3JtYXQsIG1pcG1hcC5kYXRhICk7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1Vuc3VwcG9ydGVkIGNvbXByZXNzZWQgdGV4dHVyZSBmb3JtYXQnICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHRleHR1cmUuaXNDdWJlVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdGNvbnN0IGltYWdlcyA9IG9wdGlvbnMuaW1hZ2VzO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgNjsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgaW1hZ2UgPSBnZXRJbWFnZSggaW1hZ2VzWyBpIF0gKTtcclxuXHJcblx0XHRcdFx0Z2wudGV4U3ViSW1hZ2UyRCggZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaSwgMCwgMCwgMCwgd2lkdGgsIGhlaWdodCwgZ2xGb3JtYXQsIGdsVHlwZSwgaW1hZ2UgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2UgaWYgKCB0ZXh0dXJlLmlzRGF0YUFycmF5VGV4dHVyZSApIHtcclxuXHJcblx0XHRcdGNvbnN0IGltYWdlID0gb3B0aW9ucy5pbWFnZTtcclxuXHJcblx0XHRcdGdsLnRleFN1YkltYWdlM0QoIGdsLlRFWFRVUkVfMkRfQVJSQVksIDAsIDAsIDAsIDAsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQsIGltYWdlLmRlcHRoLCBnbEZvcm1hdCwgZ2xUeXBlLCBpbWFnZS5kYXRhICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggdGV4dHVyZS5pc0RhdGEzRFRleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBpbWFnZSA9IG9wdGlvbnMuaW1hZ2U7XHJcblxyXG5cdFx0XHRnbC50ZXhTdWJJbWFnZTNEKCBnbC5URVhUVVJFXzNELCAwLCAwLCAwLCAwLCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0LCBpbWFnZS5kZXB0aCwgZ2xGb3JtYXQsIGdsVHlwZSwgaW1hZ2UuZGF0YSApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHRleHR1cmUuaXNWaWRlb1RleHR1cmUgKSB7XHJcblxyXG5cdFx0XHR0ZXh0dXJlLnVwZGF0ZSgpO1xyXG5cclxuXHRcdFx0Z2wudGV4SW1hZ2UyRCggZ2xUZXh0dXJlVHlwZSwgMCwgZ2xJbnRlcm5hbEZvcm1hdCwgZ2xGb3JtYXQsIGdsVHlwZSwgb3B0aW9ucy5pbWFnZSApO1xyXG5cclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc3QgaW1hZ2UgPSBnZXRJbWFnZSggb3B0aW9ucy5pbWFnZSApO1xyXG5cclxuXHRcdFx0Z2wudGV4U3ViSW1hZ2UyRCggZ2xUZXh0dXJlVHlwZSwgMCwgMCwgMCwgd2lkdGgsIGhlaWdodCwgZ2xGb3JtYXQsIGdsVHlwZSwgaW1hZ2UgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2VuZXJhdGVzIG1pcG1hcHMgZm9yIHRoZSBnaXZlbiB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUuXHJcblx0ICovXHJcblx0Z2VuZXJhdGVNaXBtYXBzKCB0ZXh0dXJlICkge1xyXG5cclxuXHRcdGNvbnN0IHsgZ2wsIGJhY2tlbmQgfSA9IHRoaXM7XHJcblx0XHRjb25zdCB7IHRleHR1cmVHUFUsIGdsVGV4dHVyZVR5cGUgfSA9IGJhY2tlbmQuZ2V0KCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0YmFja2VuZC5zdGF0ZS5iaW5kVGV4dHVyZSggZ2xUZXh0dXJlVHlwZSwgdGV4dHVyZUdQVSApO1xyXG5cdFx0Z2wuZ2VuZXJhdGVNaXBtYXAoIGdsVGV4dHVyZVR5cGUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWFsbG9jYXRlcyB0aGUgcmVuZGVyIGJ1ZmZlcnMgb2YgdGhlIGdpdmVuIHJlbmRlciB0YXJnZXQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JlbmRlclRhcmdldH0gcmVuZGVyVGFyZ2V0IC0gVGhlIHJlbmRlciB0YXJnZXQuXHJcblx0ICovXHJcblx0ZGVhbGxvY2F0ZVJlbmRlckJ1ZmZlcnMoIHJlbmRlclRhcmdldCApIHtcclxuXHJcblx0XHRjb25zdCB7IGdsLCBiYWNrZW5kIH0gPSB0aGlzO1xyXG5cclxuXHRcdC8vIHJlbW92ZSBmcmFtZWJ1ZmZlciByZWZlcmVuY2VcclxuXHRcdGlmICggcmVuZGVyVGFyZ2V0ICkge1xyXG5cclxuXHRcdFx0Y29uc3QgcmVuZGVyQ29udGV4dERhdGEgPSBiYWNrZW5kLmdldCggcmVuZGVyVGFyZ2V0ICk7XHJcblxyXG5cdFx0XHRyZW5kZXJDb250ZXh0RGF0YS5yZW5kZXJCdWZmZXJTdG9yYWdlU2V0dXAgPSB1bmRlZmluZWQ7XHJcblxyXG5cdFx0XHRpZiAoIHJlbmRlckNvbnRleHREYXRhLmZyYW1lYnVmZmVycyApIHtcclxuXHJcblx0XHRcdFx0Zm9yICggY29uc3QgY2FjaGVLZXkgaW4gcmVuZGVyQ29udGV4dERhdGEuZnJhbWVidWZmZXJzICkge1xyXG5cclxuXHRcdFx0XHRcdGdsLmRlbGV0ZUZyYW1lYnVmZmVyKCByZW5kZXJDb250ZXh0RGF0YS5mcmFtZWJ1ZmZlcnNbIGNhY2hlS2V5IF0gKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRkZWxldGUgcmVuZGVyQ29udGV4dERhdGEuZnJhbWVidWZmZXJzO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCByZW5kZXJDb250ZXh0RGF0YS5kZXB0aFJlbmRlcmJ1ZmZlciApIHtcclxuXHJcblx0XHRcdFx0Z2wuZGVsZXRlUmVuZGVyYnVmZmVyKCByZW5kZXJDb250ZXh0RGF0YS5kZXB0aFJlbmRlcmJ1ZmZlciApO1xyXG5cdFx0XHRcdGRlbGV0ZSByZW5kZXJDb250ZXh0RGF0YS5kZXB0aFJlbmRlcmJ1ZmZlcjtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggcmVuZGVyQ29udGV4dERhdGEuc3RlbmNpbFJlbmRlcmJ1ZmZlciApIHtcclxuXHJcblx0XHRcdFx0Z2wuZGVsZXRlUmVuZGVyYnVmZmVyKCByZW5kZXJDb250ZXh0RGF0YS5zdGVuY2lsUmVuZGVyYnVmZmVyICk7XHJcblx0XHRcdFx0ZGVsZXRlIHJlbmRlckNvbnRleHREYXRhLnN0ZW5jaWxSZW5kZXJidWZmZXI7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHJlbmRlckNvbnRleHREYXRhLm1zYWFGcmFtZUJ1ZmZlciApIHtcclxuXHJcblx0XHRcdFx0Z2wuZGVsZXRlRnJhbWVidWZmZXIoIHJlbmRlckNvbnRleHREYXRhLm1zYWFGcmFtZUJ1ZmZlciApO1xyXG5cdFx0XHRcdGRlbGV0ZSByZW5kZXJDb250ZXh0RGF0YS5tc2FhRnJhbWVCdWZmZXI7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHJlbmRlckNvbnRleHREYXRhLm1zYWFSZW5kZXJidWZmZXJzICkge1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCByZW5kZXJDb250ZXh0RGF0YS5tc2FhUmVuZGVyYnVmZmVycy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0Z2wuZGVsZXRlUmVuZGVyYnVmZmVyKCByZW5kZXJDb250ZXh0RGF0YS5tc2FhUmVuZGVyYnVmZmVyc1sgaSBdICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0ZGVsZXRlIHJlbmRlckNvbnRleHREYXRhLm1zYWFSZW5kZXJidWZmZXJzO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZXN0cm95cyB0aGUgR1BVIGRhdGEgZm9yIHRoZSBnaXZlbiB0ZXh0dXJlIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlLlxyXG5cdCAqL1xyXG5cdGRlc3Ryb3lUZXh0dXJlKCB0ZXh0dXJlICkge1xyXG5cclxuXHRcdGNvbnN0IHsgZ2wsIGJhY2tlbmQgfSA9IHRoaXM7XHJcblx0XHRjb25zdCB7IHRleHR1cmVHUFUsIHJlbmRlclRhcmdldCB9ID0gYmFja2VuZC5nZXQoIHRleHR1cmUgKTtcclxuXHJcblx0XHR0aGlzLmRlYWxsb2NhdGVSZW5kZXJCdWZmZXJzKCByZW5kZXJUYXJnZXQgKTtcclxuXHRcdGdsLmRlbGV0ZVRleHR1cmUoIHRleHR1cmVHUFUgKTtcclxuXHJcblx0XHRiYWNrZW5kLmRlbGV0ZSggdGV4dHVyZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvcGllcyBkYXRhIG9mIHRoZSBnaXZlbiBzb3VyY2UgdGV4dHVyZSB0byB0aGUgZ2l2ZW4gZGVzdGluYXRpb24gdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gc3JjVGV4dHVyZSAtIFRoZSBzb3VyY2UgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IGRzdFRleHR1cmUgLSBUaGUgZGVzdGluYXRpb24gdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0gez8oQm94M3xCb3gyKX0gW3NyY1JlZ2lvbj1udWxsXSAtIFRoZSByZWdpb24gb2YgdGhlIHNvdXJjZSB0ZXh0dXJlIHRvIGNvcHkuXHJcblx0ICogQHBhcmFtIHs/KFZlY3RvcjJ8VmVjdG9yMyl9IFtkc3RQb3NpdGlvbj1udWxsXSAtIFRoZSBkZXN0aW5hdGlvbiBwb3NpdGlvbiBvZiB0aGUgY29weS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3NyY0xldmVsPTBdIC0gVGhlIHNvdXJjZSBtaXAgbGV2ZWwgdG8gY29weSBmcm9tLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZHN0TGV2ZWw9MF0gLSBUaGUgZGVzdGluYXRpb24gbWlwIGxldmVsIHRvIGNvcHkgdG8uXHJcblx0ICovXHJcblx0Y29weVRleHR1cmVUb1RleHR1cmUoIHNyY1RleHR1cmUsIGRzdFRleHR1cmUsIHNyY1JlZ2lvbiA9IG51bGwsIGRzdFBvc2l0aW9uID0gbnVsbCwgc3JjTGV2ZWwgPSAwLCBkc3RMZXZlbCA9IDAgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBnbCwgYmFja2VuZCB9ID0gdGhpcztcclxuXHRcdGNvbnN0IHsgc3RhdGUgfSA9IHRoaXMuYmFja2VuZDtcclxuXHJcblx0XHRjb25zdCB7IHRleHR1cmVHUFU6IGRzdFRleHR1cmVHUFUsIGdsVGV4dHVyZVR5cGUsIGdsVHlwZSwgZ2xGb3JtYXQgfSA9IGJhY2tlbmQuZ2V0KCBkc3RUZXh0dXJlICk7XHJcblxyXG5cdFx0c3RhdGUuYmluZFRleHR1cmUoIGdsVGV4dHVyZVR5cGUsIGRzdFRleHR1cmVHUFUgKTtcclxuXHJcblx0XHQvLyBnYXRoZXIgdGhlIG5lY2Vzc2FyeSBkaW1lbnNpb25zIHRvIGNvcHlcclxuXHRcdGxldCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgbWluWCwgbWluWSwgbWluWjtcclxuXHRcdGxldCBkc3RYLCBkc3RZLCBkc3RaO1xyXG5cdFx0Y29uc3QgaW1hZ2UgPSBzcmNUZXh0dXJlLmlzQ29tcHJlc3NlZFRleHR1cmUgPyBzcmNUZXh0dXJlLm1pcG1hcHNbIGRzdExldmVsIF0gOiBzcmNUZXh0dXJlLmltYWdlO1xyXG5cclxuXHRcdGlmICggc3JjUmVnaW9uICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0d2lkdGggPSBzcmNSZWdpb24ubWF4LnggLSBzcmNSZWdpb24ubWluLng7XHJcblx0XHRcdGhlaWdodCA9IHNyY1JlZ2lvbi5tYXgueSAtIHNyY1JlZ2lvbi5taW4ueTtcclxuXHRcdFx0ZGVwdGggPSBzcmNSZWdpb24uaXNCb3gzID8gc3JjUmVnaW9uLm1heC56IC0gc3JjUmVnaW9uLm1pbi56IDogMTtcclxuXHRcdFx0bWluWCA9IHNyY1JlZ2lvbi5taW4ueDtcclxuXHRcdFx0bWluWSA9IHNyY1JlZ2lvbi5taW4ueTtcclxuXHRcdFx0bWluWiA9IHNyY1JlZ2lvbi5pc0JveDMgPyBzcmNSZWdpb24ubWluLnogOiAwO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRjb25zdCBsZXZlbFNjYWxlID0gTWF0aC5wb3coIDIsIC0gc3JjTGV2ZWwgKTtcclxuXHRcdFx0d2lkdGggPSBNYXRoLmZsb29yKCBpbWFnZS53aWR0aCAqIGxldmVsU2NhbGUgKTtcclxuXHRcdFx0aGVpZ2h0ID0gTWF0aC5mbG9vciggaW1hZ2UuaGVpZ2h0ICogbGV2ZWxTY2FsZSApO1xyXG5cclxuXHRcdFx0aWYgKCBzcmNUZXh0dXJlLmlzRGF0YUFycmF5VGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0ZGVwdGggPSBpbWFnZS5kZXB0aDtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIHNyY1RleHR1cmUuaXNEYXRhM0RUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0XHRkZXB0aCA9IE1hdGguZmxvb3IoIGltYWdlLmRlcHRoICogbGV2ZWxTY2FsZSApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0ZGVwdGggPSAxO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0bWluWCA9IDA7XHJcblx0XHRcdG1pblkgPSAwO1xyXG5cdFx0XHRtaW5aID0gMDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBkc3RQb3NpdGlvbiAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGRzdFggPSBkc3RQb3NpdGlvbi54O1xyXG5cdFx0XHRkc3RZID0gZHN0UG9zaXRpb24ueTtcclxuXHRcdFx0ZHN0WiA9IGRzdFBvc2l0aW9uLno7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGRzdFggPSAwO1xyXG5cdFx0XHRkc3RZID0gMDtcclxuXHRcdFx0ZHN0WiA9IDA7XHJcblxyXG5cdFx0fVxyXG5cclxuXHJcblx0XHRnbC5waXhlbFN0b3JlaSggZ2wuVU5QQUNLX0ZMSVBfWV9XRUJHTCwgZHN0VGV4dHVyZS5mbGlwWSApO1xyXG5cdFx0Z2wucGl4ZWxTdG9yZWkoIGdsLlVOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTCwgZHN0VGV4dHVyZS5wcmVtdWx0aXBseUFscGhhICk7XHJcblx0XHRnbC5waXhlbFN0b3JlaSggZ2wuVU5QQUNLX0FMSUdOTUVOVCwgZHN0VGV4dHVyZS51bnBhY2tBbGlnbm1lbnQgKTtcclxuXHJcblx0XHQvLyB1c2VkIGZvciBjb3B5aW5nIGRhdGEgZnJvbSBjcHVcclxuXHRcdGNvbnN0IGN1cnJlbnRVbnBhY2tSb3dMZW4gPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLlVOUEFDS19ST1dfTEVOR1RIICk7XHJcblx0XHRjb25zdCBjdXJyZW50VW5wYWNrSW1hZ2VIZWlnaHQgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLlVOUEFDS19JTUFHRV9IRUlHSFQgKTtcclxuXHRcdGNvbnN0IGN1cnJlbnRVbnBhY2tTa2lwUGl4ZWxzID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5VTlBBQ0tfU0tJUF9QSVhFTFMgKTtcclxuXHRcdGNvbnN0IGN1cnJlbnRVbnBhY2tTa2lwUm93cyA9IGdsLmdldFBhcmFtZXRlciggZ2wuVU5QQUNLX1NLSVBfUk9XUyApO1xyXG5cdFx0Y29uc3QgY3VycmVudFVucGFja1NraXBJbWFnZXMgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLlVOUEFDS19TS0lQX0lNQUdFUyApO1xyXG5cclxuXHRcdGdsLnBpeGVsU3RvcmVpKCBnbC5VTlBBQ0tfUk9XX0xFTkdUSCwgaW1hZ2Uud2lkdGggKTtcclxuXHRcdGdsLnBpeGVsU3RvcmVpKCBnbC5VTlBBQ0tfSU1BR0VfSEVJR0hULCBpbWFnZS5oZWlnaHQgKTtcclxuXHRcdGdsLnBpeGVsU3RvcmVpKCBnbC5VTlBBQ0tfU0tJUF9QSVhFTFMsIG1pblggKTtcclxuXHRcdGdsLnBpeGVsU3RvcmVpKCBnbC5VTlBBQ0tfU0tJUF9ST1dTLCBtaW5ZICk7XHJcblx0XHRnbC5waXhlbFN0b3JlaSggZ2wuVU5QQUNLX1NLSVBfSU1BR0VTLCBtaW5aICk7XHJcblxyXG5cdFx0Ly8gc2V0IHVwIHRoZSBzcmMgdGV4dHVyZVxyXG5cdFx0Y29uc3QgaXNEc3QzRCA9IGRzdFRleHR1cmUuaXNEYXRhQXJyYXlUZXh0dXJlIHx8IGRzdFRleHR1cmUuaXNEYXRhM0RUZXh0dXJlO1xyXG5cdFx0aWYgKCBzcmNUZXh0dXJlLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSB8fCBzcmNUZXh0dXJlLmlzRGVwdGhUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgc3JjVGV4dHVyZURhdGEgPSBiYWNrZW5kLmdldCggc3JjVGV4dHVyZSApO1xyXG5cdFx0XHRjb25zdCBkc3RUZXh0dXJlRGF0YSA9IGJhY2tlbmQuZ2V0KCBkc3RUZXh0dXJlICk7XHJcblxyXG5cdFx0XHRjb25zdCBzcmNSZW5kZXJDb250ZXh0RGF0YSA9IGJhY2tlbmQuZ2V0KCBzcmNUZXh0dXJlRGF0YS5yZW5kZXJUYXJnZXQgKTtcclxuXHRcdFx0Y29uc3QgZHN0UmVuZGVyQ29udGV4dERhdGEgPSBiYWNrZW5kLmdldCggZHN0VGV4dHVyZURhdGEucmVuZGVyVGFyZ2V0ICk7XHJcblxyXG5cdFx0XHRjb25zdCBzcmNGcmFtZWJ1ZmZlciA9IHNyY1JlbmRlckNvbnRleHREYXRhLmZyYW1lYnVmZmVyc1sgc3JjVGV4dHVyZURhdGEuY2FjaGVLZXkgXTtcclxuXHRcdFx0Y29uc3QgZHN0RnJhbWVidWZmZXIgPSBkc3RSZW5kZXJDb250ZXh0RGF0YS5mcmFtZWJ1ZmZlcnNbIGRzdFRleHR1cmVEYXRhLmNhY2hlS2V5IF07XHJcblxyXG5cdFx0XHRzdGF0ZS5iaW5kRnJhbWVidWZmZXIoIGdsLlJFQURfRlJBTUVCVUZGRVIsIHNyY0ZyYW1lYnVmZmVyICk7XHJcblx0XHRcdHN0YXRlLmJpbmRGcmFtZWJ1ZmZlciggZ2wuRFJBV19GUkFNRUJVRkZFUiwgZHN0RnJhbWVidWZmZXIgKTtcclxuXHJcblx0XHRcdGxldCBtYXNrID0gZ2wuQ09MT1JfQlVGRkVSX0JJVDtcclxuXHJcblx0XHRcdGlmICggc3JjVGV4dHVyZS5pc0RlcHRoVGV4dHVyZSApIG1hc2sgPSBnbC5ERVBUSF9CVUZGRVJfQklUO1xyXG5cclxuXHRcdFx0Z2wuYmxpdEZyYW1lYnVmZmVyKCBtaW5YLCBtaW5ZLCB3aWR0aCwgaGVpZ2h0LCBkc3RYLCBkc3RZLCB3aWR0aCwgaGVpZ2h0LCBtYXNrLCBnbC5ORUFSRVNUICk7XHJcblxyXG5cdFx0XHRzdGF0ZS5iaW5kRnJhbWVidWZmZXIoIGdsLlJFQURfRlJBTUVCVUZGRVIsIG51bGwgKTtcclxuXHRcdFx0c3RhdGUuYmluZEZyYW1lYnVmZmVyKCBnbC5EUkFXX0ZSQU1FQlVGRkVSLCBudWxsICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGlmICggaXNEc3QzRCApIHtcclxuXHJcblx0XHRcdFx0Ly8gY29weSBkYXRhIGludG8gdGhlIDNkIHRleHR1cmVcclxuXHRcdFx0XHRpZiAoIHNyY1RleHR1cmUuaXNEYXRhVGV4dHVyZSB8fCBzcmNUZXh0dXJlLmlzRGF0YTNEVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0XHRnbC50ZXhTdWJJbWFnZTNEKCBnbFRleHR1cmVUeXBlLCBkc3RMZXZlbCwgZHN0WCwgZHN0WSwgZHN0Wiwgd2lkdGgsIGhlaWdodCwgZGVwdGgsIGdsRm9ybWF0LCBnbFR5cGUsIGltYWdlLmRhdGEgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggZHN0VGV4dHVyZS5pc0NvbXByZXNzZWRBcnJheVRleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRcdFx0Z2wuY29tcHJlc3NlZFRleFN1YkltYWdlM0QoIGdsVGV4dHVyZVR5cGUsIGRzdExldmVsLCBkc3RYLCBkc3RZLCBkc3RaLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgZ2xGb3JtYXQsIGltYWdlLmRhdGEgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRnbC50ZXhTdWJJbWFnZTNEKCBnbFRleHR1cmVUeXBlLCBkc3RMZXZlbCwgZHN0WCwgZHN0WSwgZHN0Wiwgd2lkdGgsIGhlaWdodCwgZGVwdGgsIGdsRm9ybWF0LCBnbFR5cGUsIGltYWdlICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdC8vIGNvcHkgZGF0YSBpbnRvIHRoZSAyZCB0ZXh0dXJlXHJcblx0XHRcdFx0aWYgKCBzcmNUZXh0dXJlLmlzRGF0YVRleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRcdFx0Z2wudGV4U3ViSW1hZ2UyRCggZ2xUZXh0dXJlVHlwZSwgZHN0TGV2ZWwsIGRzdFgsIGRzdFksIHdpZHRoLCBoZWlnaHQsIGdsRm9ybWF0LCBnbFR5cGUsIGltYWdlLmRhdGEgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggc3JjVGV4dHVyZS5pc0NvbXByZXNzZWRUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0XHRcdGdsLmNvbXByZXNzZWRUZXhTdWJJbWFnZTJEKCBnbFRleHR1cmVUeXBlLCBkc3RMZXZlbCwgZHN0WCwgZHN0WSwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCwgZ2xGb3JtYXQsIGltYWdlLmRhdGEgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRnbC50ZXhTdWJJbWFnZTJEKCBnbFRleHR1cmVUeXBlLCBkc3RMZXZlbCwgZHN0WCwgZHN0WSwgd2lkdGgsIGhlaWdodCwgZ2xGb3JtYXQsIGdsVHlwZSwgaW1hZ2UgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyByZXNldCB2YWx1ZXNcclxuXHRcdGdsLnBpeGVsU3RvcmVpKCBnbC5VTlBBQ0tfUk9XX0xFTkdUSCwgY3VycmVudFVucGFja1Jvd0xlbiApO1xyXG5cdFx0Z2wucGl4ZWxTdG9yZWkoIGdsLlVOUEFDS19JTUFHRV9IRUlHSFQsIGN1cnJlbnRVbnBhY2tJbWFnZUhlaWdodCApO1xyXG5cdFx0Z2wucGl4ZWxTdG9yZWkoIGdsLlVOUEFDS19TS0lQX1BJWEVMUywgY3VycmVudFVucGFja1NraXBQaXhlbHMgKTtcclxuXHRcdGdsLnBpeGVsU3RvcmVpKCBnbC5VTlBBQ0tfU0tJUF9ST1dTLCBjdXJyZW50VW5wYWNrU2tpcFJvd3MgKTtcclxuXHRcdGdsLnBpeGVsU3RvcmVpKCBnbC5VTlBBQ0tfU0tJUF9JTUFHRVMsIGN1cnJlbnRVbnBhY2tTa2lwSW1hZ2VzICk7XHJcblxyXG5cdFx0Ly8gR2VuZXJhdGUgbWlwbWFwcyBvbmx5IHdoZW4gY29weWluZyBsZXZlbCAwXHJcblx0XHRpZiAoIGRzdExldmVsID09PSAwICYmIGRzdFRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzICkge1xyXG5cclxuXHRcdFx0Z2wuZ2VuZXJhdGVNaXBtYXAoIGdsVGV4dHVyZVR5cGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0c3RhdGUudW5iaW5kVGV4dHVyZSgpO1xyXG5cclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBDb3BpZXMgdGhlIGN1cnJlbnQgYm91bmQgZnJhbWVidWZmZXIgdG8gdGhlIGdpdmVuIHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgZGVzdGluYXRpb24gdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge1JlbmRlckNvbnRleHR9IHJlbmRlckNvbnRleHQgLSBUaGUgcmVuZGVyIGNvbnRleHQuXHJcblx0ICogQHBhcmFtIHtWZWN0b3I0fSByZWN0YW5nbGUgLSBBIGZvdXIgZGltZW5zaW9uYWwgdmVjdG9yIGRlZmluaW5nIHRoZSBvcmlnaW4gYW5kIGRpbWVuc2lvbiBvZiB0aGUgY29weS5cclxuXHQgKi9cclxuXHRjb3B5RnJhbWVidWZmZXJUb1RleHR1cmUoIHRleHR1cmUsIHJlbmRlckNvbnRleHQsIHJlY3RhbmdsZSApIHtcclxuXHJcblx0XHRjb25zdCB7IGdsIH0gPSB0aGlzO1xyXG5cdFx0Y29uc3QgeyBzdGF0ZSB9ID0gdGhpcy5iYWNrZW5kO1xyXG5cclxuXHRcdGNvbnN0IHsgdGV4dHVyZUdQVSB9ID0gdGhpcy5iYWNrZW5kLmdldCggdGV4dHVyZSApO1xyXG5cclxuXHRcdGNvbnN0IHsgeCwgeSwgejogd2lkdGgsIHc6IGhlaWdodCB9ID0gcmVjdGFuZ2xlO1xyXG5cclxuXHRcdGNvbnN0IHJlcXVpcmVEcmF3RnJhbWVCdWZmZXIgPSB0ZXh0dXJlLmlzRGVwdGhUZXh0dXJlID09PSB0cnVlIHx8ICggcmVuZGVyQ29udGV4dC5yZW5kZXJUYXJnZXQgJiYgcmVuZGVyQ29udGV4dC5yZW5kZXJUYXJnZXQuc2FtcGxlcyA+IDAgKTtcclxuXHJcblx0XHRjb25zdCBzcmNIZWlnaHQgPSByZW5kZXJDb250ZXh0LnJlbmRlclRhcmdldCA/IHJlbmRlckNvbnRleHQucmVuZGVyVGFyZ2V0LmhlaWdodCA6IHRoaXMuYmFja2VuZC5nZXREcmF3aW5nQnVmZmVyU2l6ZSgpLnk7XHJcblxyXG5cdFx0aWYgKCByZXF1aXJlRHJhd0ZyYW1lQnVmZmVyICkge1xyXG5cclxuXHRcdFx0Y29uc3QgcGFydGlhbCA9ICggeCAhPT0gMCB8fCB5ICE9PSAwICk7XHJcblx0XHRcdGxldCBtYXNrO1xyXG5cdFx0XHRsZXQgYXR0YWNobWVudDtcclxuXHJcblx0XHRcdGlmICggdGV4dHVyZS5pc0RlcHRoVGV4dHVyZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0bWFzayA9IGdsLkRFUFRIX0JVRkZFUl9CSVQ7XHJcblx0XHRcdFx0YXR0YWNobWVudCA9IGdsLkRFUFRIX0FUVEFDSE1FTlQ7XHJcblxyXG5cdFx0XHRcdGlmICggcmVuZGVyQ29udGV4dC5zdGVuY2lsICkge1xyXG5cclxuXHRcdFx0XHRcdG1hc2sgfD0gZ2wuU1RFTkNJTF9CVUZGRVJfQklUO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRtYXNrID0gZ2wuQ09MT1JfQlVGRkVSX0JJVDtcclxuXHRcdFx0XHRhdHRhY2htZW50ID0gZ2wuQ09MT1JfQVRUQUNITUVOVDA7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHBhcnRpYWwgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHJlbmRlclRhcmdldENvbnRleHREYXRhID0gdGhpcy5iYWNrZW5kLmdldCggcmVuZGVyQ29udGV4dC5yZW5kZXJUYXJnZXQgKTtcclxuXHJcblx0XHRcdFx0Y29uc3QgZmIgPSByZW5kZXJUYXJnZXRDb250ZXh0RGF0YS5mcmFtZWJ1ZmZlcnNbIHJlbmRlckNvbnRleHQuZ2V0Q2FjaGVLZXkoKSBdO1xyXG5cdFx0XHRcdGNvbnN0IG1zYWFGcmFtZUJ1ZmZlciA9IHJlbmRlclRhcmdldENvbnRleHREYXRhLm1zYWFGcmFtZUJ1ZmZlcjtcclxuXHJcblx0XHRcdFx0c3RhdGUuYmluZEZyYW1lYnVmZmVyKCBnbC5EUkFXX0ZSQU1FQlVGRkVSLCBmYiApO1xyXG5cdFx0XHRcdHN0YXRlLmJpbmRGcmFtZWJ1ZmZlciggZ2wuUkVBRF9GUkFNRUJVRkZFUiwgbXNhYUZyYW1lQnVmZmVyICk7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGZsaXBwZWRZID0gc3JjSGVpZ2h0IC0geSAtIGhlaWdodDtcclxuXHJcblx0XHRcdFx0Z2wuYmxpdEZyYW1lYnVmZmVyKCB4LCBmbGlwcGVkWSwgeCArIHdpZHRoLCBmbGlwcGVkWSArIGhlaWdodCwgeCwgZmxpcHBlZFksIHggKyB3aWR0aCwgZmxpcHBlZFkgKyBoZWlnaHQsIG1hc2ssIGdsLk5FQVJFU1QgKTtcclxuXHJcblx0XHRcdFx0c3RhdGUuYmluZEZyYW1lYnVmZmVyKCBnbC5SRUFEX0ZSQU1FQlVGRkVSLCBmYiApO1xyXG5cclxuXHRcdFx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZUdQVSApO1xyXG5cclxuXHRcdFx0XHRnbC5jb3B5VGV4U3ViSW1hZ2UyRCggZ2wuVEVYVFVSRV8yRCwgMCwgMCwgMCwgeCwgZmxpcHBlZFksIHdpZHRoLCBoZWlnaHQgKTtcclxuXHJcblx0XHRcdFx0c3RhdGUudW5iaW5kVGV4dHVyZSgpO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgZmIgPSBnbC5jcmVhdGVGcmFtZWJ1ZmZlcigpO1xyXG5cclxuXHRcdFx0XHRzdGF0ZS5iaW5kRnJhbWVidWZmZXIoIGdsLkRSQVdfRlJBTUVCVUZGRVIsIGZiICk7XHJcblxyXG5cdFx0XHRcdGdsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKCBnbC5EUkFXX0ZSQU1FQlVGRkVSLCBhdHRhY2htZW50LCBnbC5URVhUVVJFXzJELCB0ZXh0dXJlR1BVLCAwICk7XHJcblx0XHRcdFx0Z2wuYmxpdEZyYW1lYnVmZmVyKCAwLCAwLCB3aWR0aCwgaGVpZ2h0LCAwLCAwLCB3aWR0aCwgaGVpZ2h0LCBtYXNrLCBnbC5ORUFSRVNUICk7XHJcblxyXG5cdFx0XHRcdGdsLmRlbGV0ZUZyYW1lYnVmZmVyKCBmYiApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZUdQVSApO1xyXG5cdFx0XHRnbC5jb3B5VGV4U3ViSW1hZ2UyRCggZ2wuVEVYVFVSRV8yRCwgMCwgMCwgMCwgeCwgc3JjSGVpZ2h0IC0gaGVpZ2h0IC0geSwgd2lkdGgsIGhlaWdodCApO1xyXG5cclxuXHRcdFx0c3RhdGUudW5iaW5kVGV4dHVyZSgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzICkgdGhpcy5nZW5lcmF0ZU1pcG1hcHMoIHRleHR1cmUgKTtcclxuXHJcblx0XHR0aGlzLmJhY2tlbmQuX3NldEZyYW1lYnVmZmVyKCByZW5kZXJDb250ZXh0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0dXBTIHN0b3JhZ2UgZm9yIGludGVybmFsIGRlcHRoL3N0ZW5jaWwgYnVmZmVycyBhbmQgYmluZCB0byBjb3JyZWN0IGZyYW1lYnVmZmVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlcmJ1ZmZlcn0gcmVuZGVyYnVmZmVyIC0gVGhlIHJlbmRlciBidWZmZXIuXHJcblx0ICogQHBhcmFtIHtSZW5kZXJDb250ZXh0fSByZW5kZXJDb250ZXh0IC0gVGhlIHJlbmRlciBjb250ZXh0LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzYW1wbGVzIC0gVGhlIE1TQUEgc2FtcGxlIGNvdW50LlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW3VzZU11bHRpc2FtcGxlZFJUVD1mYWxzZV0gLSBXaGV0aGVyIHRvIHVzZSBXRUJHTF9tdWx0aXNhbXBsZWRfcmVuZGVyX3RvX3RleHR1cmUgb3Igbm90LlxyXG5cdCAqL1xyXG5cdHNldHVwUmVuZGVyQnVmZmVyU3RvcmFnZSggcmVuZGVyYnVmZmVyLCByZW5kZXJDb250ZXh0LCBzYW1wbGVzLCB1c2VNdWx0aXNhbXBsZWRSVFQgPSBmYWxzZSApIHtcclxuXHJcblx0XHRjb25zdCB7IGdsIH0gPSB0aGlzO1xyXG5cdFx0Y29uc3QgcmVuZGVyVGFyZ2V0ID0gcmVuZGVyQ29udGV4dC5yZW5kZXJUYXJnZXQ7XHJcblxyXG5cdFx0Y29uc3QgeyBkZXB0aFRleHR1cmUsIGRlcHRoQnVmZmVyLCBzdGVuY2lsQnVmZmVyLCB3aWR0aCwgaGVpZ2h0IH0gPSByZW5kZXJUYXJnZXQ7XHJcblxyXG5cdFx0Z2wuYmluZFJlbmRlcmJ1ZmZlciggZ2wuUkVOREVSQlVGRkVSLCByZW5kZXJidWZmZXIgKTtcclxuXHJcblx0XHRpZiAoIGRlcHRoQnVmZmVyICYmICEgc3RlbmNpbEJ1ZmZlciApIHtcclxuXHJcblx0XHRcdGxldCBnbEludGVybmFsRm9ybWF0ID0gZ2wuREVQVEhfQ09NUE9ORU5UMjQ7XHJcblxyXG5cdFx0XHRpZiAoIHVzZU11bHRpc2FtcGxlZFJUVCA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgbXVsdGlzYW1wbGVkUlRURXh0ID0gdGhpcy5leHRlbnNpb25zLmdldCggJ1dFQkdMX211bHRpc2FtcGxlZF9yZW5kZXJfdG9fdGV4dHVyZScgKTtcclxuXHJcblx0XHRcdFx0bXVsdGlzYW1wbGVkUlRURXh0LnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUVYVCggZ2wuUkVOREVSQlVGRkVSLCByZW5kZXJUYXJnZXQuc2FtcGxlcywgZ2xJbnRlcm5hbEZvcm1hdCwgd2lkdGgsIGhlaWdodCApO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggc2FtcGxlcyA+IDAgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggZGVwdGhUZXh0dXJlICYmIGRlcHRoVGV4dHVyZS5pc0RlcHRoVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGRlcHRoVGV4dHVyZS50eXBlID09PSBnbC5GTE9BVCApIHtcclxuXHJcblx0XHRcdFx0XHRcdGdsSW50ZXJuYWxGb3JtYXQgPSBnbC5ERVBUSF9DT01QT05FTlQzMkY7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGdsLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZSggZ2wuUkVOREVSQlVGRkVSLCBzYW1wbGVzLCBnbEludGVybmFsRm9ybWF0LCB3aWR0aCwgaGVpZ2h0ICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRnbC5yZW5kZXJidWZmZXJTdG9yYWdlKCBnbC5SRU5ERVJCVUZGRVIsIGdsSW50ZXJuYWxGb3JtYXQsIHdpZHRoLCBoZWlnaHQgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGdsLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKCBnbC5GUkFNRUJVRkZFUiwgZ2wuREVQVEhfQVRUQUNITUVOVCwgZ2wuUkVOREVSQlVGRkVSLCByZW5kZXJidWZmZXIgKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBkZXB0aEJ1ZmZlciAmJiBzdGVuY2lsQnVmZmVyICkge1xyXG5cclxuXHRcdFx0aWYgKCBzYW1wbGVzID4gMCApIHtcclxuXHJcblx0XHRcdFx0Z2wucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKCBnbC5SRU5ERVJCVUZGRVIsIHNhbXBsZXMsIGdsLkRFUFRIMjRfU1RFTkNJTDgsIHdpZHRoLCBoZWlnaHQgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGdsLnJlbmRlcmJ1ZmZlclN0b3JhZ2UoIGdsLlJFTkRFUkJVRkZFUiwgZ2wuREVQVEhfU1RFTkNJTCwgd2lkdGgsIGhlaWdodCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHJcblx0XHRcdGdsLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKCBnbC5GUkFNRUJVRkZFUiwgZ2wuREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5ULCBnbC5SRU5ERVJCVUZGRVIsIHJlbmRlcmJ1ZmZlciApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRleHR1cmUgZGF0YSBhcyBhIHR5cGVkIGFycmF5LlxyXG5cdCAqXHJcblx0ICogQGFzeW5jXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUgdG8gY29weS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geCAtIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGNvcHkgb3JpZ2luLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB5IC0gVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgY29weSBvcmlnaW4uXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSBjb3B5LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSBjb3B5LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBmYWNlSW5kZXggLSBUaGUgZmFjZSBpbmRleC5cclxuXHQgKiBAcmV0dXJuIHtQcm9taXNlPFR5cGVkQXJyYXk+fSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGEgdHlwZWQgYXJyYXkgd2hlbiB0aGUgY29weSBvcGVyYXRpb24gaGFzIGZpbmlzaGVkLlxyXG5cdCAqL1xyXG5cdGFzeW5jIGNvcHlUZXh0dXJlVG9CdWZmZXIoIHRleHR1cmUsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGZhY2VJbmRleCApIHtcclxuXHJcblx0XHRjb25zdCB7IGJhY2tlbmQsIGdsIH0gPSB0aGlzO1xyXG5cclxuXHRcdGNvbnN0IHsgdGV4dHVyZUdQVSwgZ2xGb3JtYXQsIGdsVHlwZSB9ID0gdGhpcy5iYWNrZW5kLmdldCggdGV4dHVyZSApO1xyXG5cclxuXHRcdGNvbnN0IGZiID0gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTtcclxuXHJcblx0XHRnbC5iaW5kRnJhbWVidWZmZXIoIGdsLlJFQURfRlJBTUVCVUZGRVIsIGZiICk7XHJcblxyXG5cdFx0Y29uc3QgdGFyZ2V0ID0gdGV4dHVyZS5pc0N1YmVUZXh0dXJlID8gZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgZmFjZUluZGV4IDogZ2wuVEVYVFVSRV8yRDtcclxuXHJcblx0XHRnbC5mcmFtZWJ1ZmZlclRleHR1cmUyRCggZ2wuUkVBRF9GUkFNRUJVRkZFUiwgZ2wuQ09MT1JfQVRUQUNITUVOVDAsIHRhcmdldCwgdGV4dHVyZUdQVSwgMCApO1xyXG5cclxuXHRcdGNvbnN0IHR5cGVkQXJyYXlUeXBlID0gdGhpcy5fZ2V0VHlwZWRBcnJheVR5cGUoIGdsVHlwZSApO1xyXG5cdFx0Y29uc3QgYnl0ZXNQZXJUZXhlbCA9IHRoaXMuX2dldEJ5dGVzUGVyVGV4ZWwoIGdsVHlwZSwgZ2xGb3JtYXQgKTtcclxuXHJcblx0XHRjb25zdCBlbGVtZW50Q291bnQgPSB3aWR0aCAqIGhlaWdodDtcclxuXHRcdGNvbnN0IGJ5dGVMZW5ndGggPSBlbGVtZW50Q291bnQgKiBieXRlc1BlclRleGVsO1xyXG5cclxuXHRcdGNvbnN0IGJ1ZmZlciA9IGdsLmNyZWF0ZUJ1ZmZlcigpO1xyXG5cclxuXHRcdGdsLmJpbmRCdWZmZXIoIGdsLlBJWEVMX1BBQ0tfQlVGRkVSLCBidWZmZXIgKTtcclxuXHRcdGdsLmJ1ZmZlckRhdGEoIGdsLlBJWEVMX1BBQ0tfQlVGRkVSLCBieXRlTGVuZ3RoLCBnbC5TVFJFQU1fUkVBRCApO1xyXG5cdFx0Z2wucmVhZFBpeGVscyggeCwgeSwgd2lkdGgsIGhlaWdodCwgZ2xGb3JtYXQsIGdsVHlwZSwgMCApO1xyXG5cdFx0Z2wuYmluZEJ1ZmZlciggZ2wuUElYRUxfUEFDS19CVUZGRVIsIG51bGwgKTtcclxuXHJcblx0XHRhd2FpdCBiYWNrZW5kLnV0aWxzLl9jbGllbnRXYWl0QXN5bmMoKTtcclxuXHJcblx0XHRjb25zdCBkc3RCdWZmZXIgPSBuZXcgdHlwZWRBcnJheVR5cGUoIGJ5dGVMZW5ndGggLyB0eXBlZEFycmF5VHlwZS5CWVRFU19QRVJfRUxFTUVOVCApO1xyXG5cclxuXHRcdGdsLmJpbmRCdWZmZXIoIGdsLlBJWEVMX1BBQ0tfQlVGRkVSLCBidWZmZXIgKTtcclxuXHRcdGdsLmdldEJ1ZmZlclN1YkRhdGEoIGdsLlBJWEVMX1BBQ0tfQlVGRkVSLCAwLCBkc3RCdWZmZXIgKTtcclxuXHRcdGdsLmJpbmRCdWZmZXIoIGdsLlBJWEVMX1BBQ0tfQlVGRkVSLCBudWxsICk7XHJcblxyXG5cdFx0Z2wuZGVsZXRlRnJhbWVidWZmZXIoIGZiICk7XHJcblxyXG5cdFx0cmV0dXJuIGRzdEJ1ZmZlcjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHR5cGVkIGFycmF5IHR5cGUgZm9yIHRoZSBnaXZlbiBXZWJHTCBkYXRhIHR5cGUuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7R0xlbnVtfSBnbFR5cGUgLSBUaGUgV2ViR0wgZGF0YSB0eXBlLlxyXG5cdCAqIEByZXR1cm4ge1R5cGVkQXJyYXkuY29uc3RydWN0b3J9IFRoZSB0eXBlZCBhcnJheSB0eXBlLlxyXG5cdCAqL1xyXG5cdF9nZXRUeXBlZEFycmF5VHlwZSggZ2xUeXBlICkge1xyXG5cclxuXHRcdGNvbnN0IHsgZ2wgfSA9IHRoaXM7XHJcblxyXG5cdFx0aWYgKCBnbFR5cGUgPT09IGdsLlVOU0lHTkVEX0JZVEUgKSByZXR1cm4gVWludDhBcnJheTtcclxuXHJcblx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuVU5TSUdORURfU0hPUlRfNF80XzRfNCApIHJldHVybiBVaW50MTZBcnJheTtcclxuXHRcdGlmICggZ2xUeXBlID09PSBnbC5VTlNJR05FRF9TSE9SVF81XzVfNV8xICkgcmV0dXJuIFVpbnQxNkFycmF5O1xyXG5cdFx0aWYgKCBnbFR5cGUgPT09IGdsLlVOU0lHTkVEX1NIT1JUXzVfNl81ICkgcmV0dXJuIFVpbnQxNkFycmF5O1xyXG5cdFx0aWYgKCBnbFR5cGUgPT09IGdsLlVOU0lHTkVEX1NIT1JUICkgcmV0dXJuIFVpbnQxNkFycmF5O1xyXG5cdFx0aWYgKCBnbFR5cGUgPT09IGdsLlVOU0lHTkVEX0lOVCApIHJldHVybiBVaW50MzJBcnJheTtcclxuXHJcblx0XHRpZiAoIGdsVHlwZSA9PT0gZ2wuSEFMRl9GTE9BVCApIHJldHVybiBVaW50MTZBcnJheTtcclxuXHRcdGlmICggZ2xUeXBlID09PSBnbC5GTE9BVCApIHJldHVybiBGbG9hdDMyQXJyYXk7XHJcblxyXG5cdFx0dGhyb3cgbmV3IEVycm9yKCBgVW5zdXBwb3J0ZWQgV2ViR0wgdHlwZTogJHtnbFR5cGV9YCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGJ5dGVzLXBlci10ZXhlbCB2YWx1ZSBmb3IgdGhlIGdpdmVuIFdlYkdMIGRhdGEgdHlwZSBhbmQgdGV4dHVyZSBmb3JtYXQuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7R0xlbnVtfSBnbFR5cGUgLSBUaGUgV2ViR0wgZGF0YSB0eXBlLlxyXG5cdCAqIEBwYXJhbSB7R0xlbnVtfSBnbEZvcm1hdCAtIFRoZSBXZWJHTCB0ZXh0dXJlIGZvcm1hdC5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBieXRlcy1wZXItdGV4ZWwuXHJcblx0ICovXHJcblx0X2dldEJ5dGVzUGVyVGV4ZWwoIGdsVHlwZSwgZ2xGb3JtYXQgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBnbCB9ID0gdGhpcztcclxuXHJcblx0XHRsZXQgYnl0ZXNQZXJDb21wb25lbnQgPSAwO1xyXG5cclxuXHRcdGlmICggZ2xUeXBlID09PSBnbC5VTlNJR05FRF9CWVRFICkgYnl0ZXNQZXJDb21wb25lbnQgPSAxO1xyXG5cclxuXHRcdGlmICggZ2xUeXBlID09PSBnbC5VTlNJR05FRF9TSE9SVF80XzRfNF80IHx8XHJcblx0XHRcdGdsVHlwZSA9PT0gZ2wuVU5TSUdORURfU0hPUlRfNV81XzVfMSB8fFxyXG5cdFx0XHRnbFR5cGUgPT09IGdsLlVOU0lHTkVEX1NIT1JUXzVfNl81IHx8XHJcblx0XHRcdGdsVHlwZSA9PT0gZ2wuVU5TSUdORURfU0hPUlQgfHxcclxuXHRcdFx0Z2xUeXBlID09PSBnbC5IQUxGX0ZMT0FUICkgYnl0ZXNQZXJDb21wb25lbnQgPSAyO1xyXG5cclxuXHRcdGlmICggZ2xUeXBlID09PSBnbC5VTlNJR05FRF9JTlQgfHxcclxuXHRcdFx0Z2xUeXBlID09PSBnbC5GTE9BVCApIGJ5dGVzUGVyQ29tcG9uZW50ID0gNDtcclxuXHJcblx0XHRpZiAoIGdsRm9ybWF0ID09PSBnbC5SR0JBICkgcmV0dXJuIGJ5dGVzUGVyQ29tcG9uZW50ICogNDtcclxuXHRcdGlmICggZ2xGb3JtYXQgPT09IGdsLlJHQiApIHJldHVybiBieXRlc1BlckNvbXBvbmVudCAqIDM7XHJcblx0XHRpZiAoIGdsRm9ybWF0ID09PSBnbC5BTFBIQSApIHJldHVybiBieXRlc1BlckNvbXBvbmVudDtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgV2ViR0xUZXh0dXJlVXRpbHM7XHJcbiIsIi8qKlxyXG4gKiBBIFdlYkdMIDIgYmFja2VuZCB1dGlsaXR5IG1vZHVsZSBmb3IgbWFuYWdpbmcgZXh0ZW5zaW9ucy5cclxuICpcclxuICogQHByaXZhdGVcclxuICovXHJcbmNsYXNzIFdlYkdMRXh0ZW5zaW9ucyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgdXRpbGl0eSBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMQmFja2VuZH0gYmFja2VuZCAtIFRoZSBXZWJHTCAyIGJhY2tlbmQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGJhY2tlbmQgKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZSB0byB0aGUgV2ViR0wgMiBiYWNrZW5kLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtXZWJHTEJhY2tlbmR9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYmFja2VuZCA9IGJhY2tlbmQ7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZSB0byB0aGUgcmVuZGVyaW5nIGNvbnRleHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1dlYkdMMlJlbmRlcmluZ0NvbnRleHR9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZ2wgPSB0aGlzLmJhY2tlbmQuZ2w7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGxpc3Qgd2l0aCBhbGwgdGhlIHN1cHBvcnRlZCBXZWJHTCBleHRlbnNpb25zLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmF2YWlsYWJsZUV4dGVuc2lvbnMgPSB0aGlzLmdsLmdldFN1cHBvcnRlZEV4dGVuc2lvbnMoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgZGljdGlvbmFyeSB3aXRoIHJlcXVlc3RlZCBXZWJHTCBleHRlbnNpb25zLlxyXG5cdFx0ICogVGhlIGtleSBpcyB0aGUgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uLCB0aGUgdmFsdWVcclxuXHRcdCAqIHRoZSByZXF1ZXN0ZWQgZXh0ZW5zaW9uIG9iamVjdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0PHN0cmluZyxPYmplY3Q+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmV4dGVuc2lvbnMgPSB7fTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBleHRlbnNpb24gb2JqZWN0IGZvciB0aGUgZ2l2ZW4gZXh0ZW5zaW9uIG5hbWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBleHRlbnNpb24gbmFtZS5cclxuXHQgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBleHRlbnNpb24gb2JqZWN0LlxyXG5cdCAqL1xyXG5cdGdldCggbmFtZSApIHtcclxuXHJcblx0XHRsZXQgZXh0ZW5zaW9uID0gdGhpcy5leHRlbnNpb25zWyBuYW1lIF07XHJcblxyXG5cdFx0aWYgKCBleHRlbnNpb24gPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGV4dGVuc2lvbiA9IHRoaXMuZ2wuZ2V0RXh0ZW5zaW9uKCBuYW1lICk7XHJcblxyXG5cdFx0XHR0aGlzLmV4dGVuc2lvbnNbIG5hbWUgXSA9IGV4dGVuc2lvbjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGV4dGVuc2lvbjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgcmVxdWVzdGVkIGV4dGVuc2lvbiBpcyBhdmFpbGFibGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBleHRlbnNpb24gbmFtZS5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBnaXZlbiBleHRlbnNpb24gaXMgYXZhaWxhYmxlIG9yIG5vdC5cclxuXHQgKi9cclxuXHRoYXMoIG5hbWUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuYXZhaWxhYmxlRXh0ZW5zaW9ucy5pbmNsdWRlcyggbmFtZSApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBXZWJHTEV4dGVuc2lvbnM7XHJcbiIsIi8qKlxyXG4gKiBBIFdlYkdMIDIgYmFja2VuZCB1dGlsaXR5IG1vZHVsZSBmb3IgbWFuYWdpbmcgdGhlIGRldmljZSdzIGNhcGFiaWxpdGllcy5cclxuICpcclxuICogQHByaXZhdGVcclxuICovXHJcbmNsYXNzIFdlYkdMQ2FwYWJpbGl0aWVzIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB1dGlsaXR5IG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xCYWNrZW5kfSBiYWNrZW5kIC0gVGhlIFdlYkdMIDIgYmFja2VuZC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggYmFja2VuZCApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIHRoZSBXZWJHTCAyIGJhY2tlbmQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1dlYkdMQmFja2VuZH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5iYWNrZW5kID0gYmFja2VuZDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgdmFsdWUgaG9sZHMgdGhlIGNhY2hlZCBtYXggYW5pc290cm9weSB2YWx1ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5tYXhBbmlzb3Ryb3B5ID0gbnVsbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIGFuaXNvdHJvcHkgdGV4dHVyZSBmaWx0ZXJpbmcgdmFsdWUuIFRoaXMgdmFsdWVcclxuXHQgKiBkZXBlbmRzIG9uIHRoZSBkZXZpY2UgYW5kIGlzIHJlcG9ydGVkIGJ5IHRoZSBgRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljYFxyXG5cdCAqIFdlYkdMIGV4dGVuc2lvbi5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge251bWJlcn0gVGhlIG1heGltdW0gYW5pc290cm9weSB0ZXh0dXJlIGZpbHRlcmluZyB2YWx1ZS5cclxuXHQgKi9cclxuXHRnZXRNYXhBbmlzb3Ryb3B5KCkge1xyXG5cclxuXHRcdGlmICggdGhpcy5tYXhBbmlzb3Ryb3B5ICE9PSBudWxsICkgcmV0dXJuIHRoaXMubWF4QW5pc290cm9weTtcclxuXHJcblx0XHRjb25zdCBnbCA9IHRoaXMuYmFja2VuZC5nbDtcclxuXHRcdGNvbnN0IGV4dGVuc2lvbnMgPSB0aGlzLmJhY2tlbmQuZXh0ZW5zaW9ucztcclxuXHJcblx0XHRpZiAoIGV4dGVuc2lvbnMuaGFzKCAnRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJyApID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0Y29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnICk7XHJcblxyXG5cdFx0XHR0aGlzLm1heEFuaXNvdHJvcHkgPSBnbC5nZXRQYXJhbWV0ZXIoIGV4dGVuc2lvbi5NQVhfVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGhpcy5tYXhBbmlzb3Ryb3B5ID0gMDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubWF4QW5pc290cm9weTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgV2ViR0xDYXBhYmlsaXRpZXM7XHJcbiIsImV4cG9ydCBjb25zdCBHTEZlYXR1cmVOYW1lID0ge1xyXG5cclxuXHQnV0VCR0xfbXVsdGlfZHJhdyc6ICdXRUJHTF9tdWx0aV9kcmF3JyxcclxuXHQnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2FzdGMnOiAndGV4dHVyZS1jb21wcmVzc2lvbi1hc3RjJyxcclxuXHQnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2V0Yyc6ICd0ZXh0dXJlLWNvbXByZXNzaW9uLWV0YzInLFxyXG5cdCdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfZXRjMSc6ICd0ZXh0dXJlLWNvbXByZXNzaW9uLWV0YzEnLFxyXG5cdCdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnOiAndGV4dHVyZS1jb21wcmVzc2lvbi1wdnJ0YycsXHJcblx0J1dFQktJVF9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnOiAndGV4dHVyZS1jb21wcmVzc2lvbi1wdnJ0YycsXHJcblx0J1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJzogJ3RleHR1cmUtY29tcHJlc3Npb24tYmMnLFxyXG5cdCdFWFRfdGV4dHVyZV9jb21wcmVzc2lvbl9icHRjJzogJ3RleHR1cmUtY29tcHJlc3Npb24tYnB0YycsXHJcblx0J0VYVF9kaXNqb2ludF90aW1lcl9xdWVyeV93ZWJnbDInOiAndGltZXN0YW1wLXF1ZXJ5JyxcclxuXHJcbn07XHJcbiIsImNsYXNzIFdlYkdMQnVmZmVyUmVuZGVyZXIge1xyXG5cclxuXHRjb25zdHJ1Y3RvciggYmFja2VuZCApIHtcclxuXHJcblx0XHR0aGlzLmdsID0gYmFja2VuZC5nbDtcclxuXHRcdHRoaXMuZXh0ZW5zaW9ucyA9IGJhY2tlbmQuZXh0ZW5zaW9ucztcclxuXHRcdHRoaXMuaW5mbyA9IGJhY2tlbmQucmVuZGVyZXIuaW5mbztcclxuXHRcdHRoaXMubW9kZSA9IG51bGw7XHJcblx0XHR0aGlzLmluZGV4ID0gMDtcclxuXHRcdHRoaXMudHlwZSA9IG51bGw7XHJcblx0XHR0aGlzLm9iamVjdCA9IG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0cmVuZGVyKCBzdGFydCwgY291bnQgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBnbCwgbW9kZSwgb2JqZWN0LCB0eXBlLCBpbmZvLCBpbmRleCB9ID0gdGhpcztcclxuXHJcblx0XHRpZiAoIGluZGV4ICE9PSAwICkge1xyXG5cclxuXHRcdFx0Z2wuZHJhd0VsZW1lbnRzKCBtb2RlLCBjb3VudCwgdHlwZSwgc3RhcnQgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Z2wuZHJhd0FycmF5cyggbW9kZSwgc3RhcnQsIGNvdW50ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGluZm8udXBkYXRlKCBvYmplY3QsIGNvdW50LCAxICk7XHJcblxyXG5cdH1cclxuXHJcblx0cmVuZGVySW5zdGFuY2VzKCBzdGFydCwgY291bnQsIHByaW1jb3VudCApIHtcclxuXHJcblx0XHRjb25zdCB7IGdsLCBtb2RlLCB0eXBlLCBpbmRleCwgb2JqZWN0LCBpbmZvIH0gPSB0aGlzO1xyXG5cclxuXHRcdGlmICggcHJpbWNvdW50ID09PSAwICkgcmV0dXJuO1xyXG5cclxuXHRcdGlmICggaW5kZXggIT09IDAgKSB7XHJcblxyXG5cdFx0XHRnbC5kcmF3RWxlbWVudHNJbnN0YW5jZWQoIG1vZGUsIGNvdW50LCB0eXBlLCBzdGFydCwgcHJpbWNvdW50ICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGdsLmRyYXdBcnJheXNJbnN0YW5jZWQoIG1vZGUsIHN0YXJ0LCBjb3VudCwgcHJpbWNvdW50ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGluZm8udXBkYXRlKCBvYmplY3QsIGNvdW50LCBwcmltY291bnQgKTtcclxuXHJcblx0fVxyXG5cclxuXHRyZW5kZXJNdWx0aURyYXcoIHN0YXJ0cywgY291bnRzLCBkcmF3Q291bnQgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBleHRlbnNpb25zLCBtb2RlLCBvYmplY3QsIGluZm8gfSA9IHRoaXM7XHJcblxyXG5cdFx0aWYgKCBkcmF3Q291bnQgPT09IDAgKSByZXR1cm47XHJcblxyXG5cdFx0Y29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9tdWx0aV9kcmF3JyApO1xyXG5cclxuXHRcdGlmICggZXh0ZW5zaW9uID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgZHJhd0NvdW50OyBpICsrICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLnJlbmRlciggc3RhcnRzWyBpIF0sIGNvdW50c1sgaSBdICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGlmICggdGhpcy5pbmRleCAhPT0gMCApIHtcclxuXHJcblx0XHRcdFx0ZXh0ZW5zaW9uLm11bHRpRHJhd0VsZW1lbnRzV0VCR0woIG1vZGUsIGNvdW50cywgMCwgdGhpcy50eXBlLCBzdGFydHMsIDAsIGRyYXdDb3VudCApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0ZXh0ZW5zaW9uLm11bHRpRHJhd0FycmF5c1dFQkdMKCBtb2RlLCBzdGFydHMsIDAsIGNvdW50cywgMCwgZHJhd0NvdW50ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRsZXQgZWxlbWVudENvdW50ID0gMDtcclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgZHJhd0NvdW50OyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRlbGVtZW50Q291bnQgKz0gY291bnRzWyBpIF07XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpbmZvLnVwZGF0ZSggb2JqZWN0LCBlbGVtZW50Q291bnQsIDEgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0cmVuZGVyTXVsdGlEcmF3SW5zdGFuY2VzKCBzdGFydHMsIGNvdW50cywgZHJhd0NvdW50LCBwcmltY291bnQgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBleHRlbnNpb25zLCBtb2RlLCBvYmplY3QsIGluZm8gfSA9IHRoaXM7XHJcblxyXG5cdFx0aWYgKCBkcmF3Q291bnQgPT09IDAgKSByZXR1cm47XHJcblxyXG5cdFx0Y29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9tdWx0aV9kcmF3JyApO1xyXG5cclxuXHRcdGlmICggZXh0ZW5zaW9uID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgZHJhd0NvdW50OyBpICsrICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLnJlbmRlckluc3RhbmNlcyggc3RhcnRzWyBpIF0sIGNvdW50c1sgaSBdLCBwcmltY291bnRbIGkgXSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMuaW5kZXggIT09IDAgKSB7XHJcblxyXG5cdFx0XHRcdGV4dGVuc2lvbi5tdWx0aURyYXdFbGVtZW50c0luc3RhbmNlZFdFQkdMKCBtb2RlLCBjb3VudHMsIDAsIHRoaXMudHlwZSwgc3RhcnRzLCAwLCBwcmltY291bnQsIDAsIGRyYXdDb3VudCApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0ZXh0ZW5zaW9uLm11bHRpRHJhd0FycmF5c0luc3RhbmNlZFdFQkdMKCBtb2RlLCBzdGFydHMsIDAsIGNvdW50cywgMCwgcHJpbWNvdW50LCAwLCBkcmF3Q291bnQgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGxldCBlbGVtZW50Q291bnQgPSAwO1xyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBkcmF3Q291bnQ7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGVsZW1lbnRDb3VudCArPSBjb3VudHNbIGkgXSAqIHByaW1jb3VudFsgaSBdO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aW5mby51cGRhdGUoIG9iamVjdCwgZWxlbWVudENvdW50LCAxICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8vXHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IHsgV2ViR0xCdWZmZXJSZW5kZXJlciB9O1xyXG4iLCIvKipcclxuICogQWJzdHJhY3QgYmFzZSBjbGFzcyBvZiBhIHRpbWVzdGFtcCBxdWVyeSBwb29sLlxyXG4gKlxyXG4gKiBAYWJzdHJhY3RcclxuICovXHJcbmNsYXNzIFRpbWVzdGFtcFF1ZXJ5UG9vbCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgYSBuZXcgdGltZXN0YW1wIHF1ZXJ5IHBvb2wuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW21heFF1ZXJpZXM9MjU2XSAtIE1heGltdW0gbnVtYmVyIG9mIHF1ZXJpZXMgdGhpcyBwb29sIGNhbiBob2xkLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBtYXhRdWVyaWVzID0gMjU2ICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciB0byB0cmFjayB0aW1lc3RhbXBzIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50cmFja1RpbWVzdGFtcCA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBNYXhpbXVtIG51bWJlciBvZiBxdWVyaWVzIHRoaXMgcG9vbCBjYW4gaG9sZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQGRlZmF1bHQgMjU2XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWF4UXVlcmllcyA9IG1heFF1ZXJpZXM7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIb3cgbWFueSBxdWVyaWVzIGFsbG9jYXRlZCBzbyBmYXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jdXJyZW50UXVlcnlJbmRleCA9IDA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUcmFja3Mgb2Zmc2V0cyBmb3IgZGlmZmVyZW50IGNvbnRleHRzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtNYXA8c3RyaW5nLCBudW1iZXI+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnF1ZXJ5T2Zmc2V0cyA9IG5ldyBNYXAoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIHBvb2wgaGFzIGJlZW4gZGlzcG9zZWQgb3Igbm90LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0Rpc3Bvc2VkID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUT0RPXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IDBcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5sYXN0VmFsdWUgPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVE9ET1xyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5wZW5kaW5nUmVzb2x2ZSA9IGZhbHNlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFsbG9jYXRlIHF1ZXJpZXMgZm9yIGEgc3BlY2lmaWMgcmVuZGVyQ29udGV4dC5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSByZW5kZXJDb250ZXh0IC0gVGhlIHJlbmRlciBjb250ZXh0IHRvIGFsbG9jYXRlIHF1ZXJpZXMgZm9yLlxyXG5cdCAqL1xyXG5cdGFsbG9jYXRlUXVlcmllc0ZvckNvbnRleHQoIC8qIHJlbmRlckNvbnRleHQgKi8gKSB7fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXNvbHZlIGFsbCB0aW1lc3RhbXBzIGFuZCByZXR1cm4gZGF0YSAob3IgcHJvY2VzcyB0aGVtKS5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEBhc3luY1xyXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlcj58bnVtYmVyfSBUaGUgcmVzb2x2ZWQgdGltZXN0YW1wIHZhbHVlLlxyXG5cdCAqL1xyXG5cdGFzeW5jIHJlc29sdmVRdWVyaWVzQXN5bmMoKSB7fVxyXG5cclxuXHQvKipcclxuXHQgKiBEaXNwb3NlIG9mIHRoZSBxdWVyeSBwb29sLlxyXG5cdCAqXHJcblx0ICogQGFic3RyYWN0XHJcblx0ICovXHJcblx0ZGlzcG9zZSgpIHt9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBUaW1lc3RhbXBRdWVyeVBvb2w7XHJcbiIsImltcG9ydCB7IHdhcm5PbmNlIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMuanMnO1xyXG5pbXBvcnQgVGltZXN0YW1wUXVlcnlQb29sIGZyb20gJy4uLy4uL2NvbW1vbi9UaW1lc3RhbXBRdWVyeVBvb2wuanMnO1xyXG5cclxuLyoqXHJcbiAqIE1hbmFnZXMgYSBwb29sIG9mIFdlYkdMIHRpbWVzdGFtcCBxdWVyaWVzIGZvciBwZXJmb3JtYW5jZSBtZWFzdXJlbWVudC5cclxuICogSGFuZGxlcyBjcmVhdGlvbiwgZXhlY3V0aW9uLCBhbmQgcmVzb2x1dGlvbiBvZiB0aW1lciBxdWVyaWVzIHVzaW5nIFdlYkdMIGV4dGVuc2lvbnMuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBUaW1lc3RhbXBRdWVyeVBvb2xcclxuICovXHJcbmNsYXNzIFdlYkdMVGltZXN0YW1wUXVlcnlQb29sIGV4dGVuZHMgVGltZXN0YW1wUXVlcnlQb29sIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyBhIG5ldyBXZWJHTCB0aW1lc3RhbXAgcXVlcnkgcG9vbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJpbmdDb250ZXh0fFdlYkdMMlJlbmRlcmluZ0NvbnRleHR9IGdsIC0gVGhlIFdlYkdMIGNvbnRleHQuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBUaGUgdHlwZSBpZGVudGlmaWVyIGZvciB0aGlzIHF1ZXJ5IHBvb2wuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFttYXhRdWVyaWVzPTIwNDhdIC0gTWF4aW11bSBudW1iZXIgb2YgcXVlcmllcyB0aGlzIHBvb2wgY2FuIGhvbGQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGdsLCB0eXBlLCBtYXhRdWVyaWVzID0gMjA0OCApIHtcclxuXHJcblx0XHRzdXBlciggbWF4UXVlcmllcyApO1xyXG5cclxuXHRcdHRoaXMuZ2wgPSBnbDtcclxuXHRcdHRoaXMudHlwZSA9IHR5cGU7XHJcblxyXG5cdFx0Ly8gQ2hlY2sgZm9yIHRpbWVyIHF1ZXJ5IGV4dGVuc2lvbnNcclxuXHRcdHRoaXMuZXh0ID0gZ2wuZ2V0RXh0ZW5zaW9uKCAnRVhUX2Rpc2pvaW50X3RpbWVyX3F1ZXJ5X3dlYmdsMicgKSB8fFxyXG5cdFx0XHRcdCAgZ2wuZ2V0RXh0ZW5zaW9uKCAnRVhUX2Rpc2pvaW50X3RpbWVyX3F1ZXJ5JyApO1xyXG5cclxuXHRcdGlmICggISB0aGlzLmV4dCApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUud2FybiggJ0VYVF9kaXNqb2ludF90aW1lcl9xdWVyeSBub3Qgc3VwcG9ydGVkOyB0aW1lc3RhbXBzIHdpbGwgYmUgZGlzYWJsZWQuJyApO1xyXG5cdFx0XHR0aGlzLnRyYWNrVGltZXN0YW1wID0gZmFsc2U7XHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQ3JlYXRlIHF1ZXJ5IG9iamVjdHNcclxuXHRcdHRoaXMucXVlcmllcyA9IFtdO1xyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdGhpcy5tYXhRdWVyaWVzOyBpICsrICkge1xyXG5cclxuXHRcdFx0dGhpcy5xdWVyaWVzLnB1c2goIGdsLmNyZWF0ZVF1ZXJ5KCkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5hY3RpdmVRdWVyeSA9IG51bGw7XHJcblx0XHR0aGlzLnF1ZXJ5U3RhdGVzID0gbmV3IE1hcCgpOyAvLyBUcmFjayBzdGF0ZSBvZiBlYWNoIHF1ZXJ5OiAnaW5hY3RpdmUnLCAnc3RhcnRlZCcsICdlbmRlZCdcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBbGxvY2F0ZXMgYSBwYWlyIG9mIHF1ZXJpZXMgZm9yIGEgZ2l2ZW4gcmVuZGVyIGNvbnRleHQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gcmVuZGVyQ29udGV4dCAtIFRoZSByZW5kZXIgY29udGV4dCB0byBhbGxvY2F0ZSBxdWVyaWVzIGZvci5cclxuXHQgKiBAcmV0dXJucyB7P251bWJlcn0gVGhlIGJhc2Ugb2Zmc2V0IGZvciB0aGUgYWxsb2NhdGVkIHF1ZXJpZXMsIG9yIG51bGwgaWYgYWxsb2NhdGlvbiBmYWlsZWQuXHJcblx0ICovXHJcblx0YWxsb2NhdGVRdWVyaWVzRm9yQ29udGV4dCggcmVuZGVyQ29udGV4dCApIHtcclxuXHJcblx0XHRpZiAoICEgdGhpcy50cmFja1RpbWVzdGFtcCApIHJldHVybiBudWxsO1xyXG5cclxuXHRcdC8vIENoZWNrIGlmIHdlIGhhdmUgZW5vdWdoIHNwYWNlIGZvciBhIG5ldyBxdWVyeSBwYWlyXHJcblx0XHRpZiAoIHRoaXMuY3VycmVudFF1ZXJ5SW5kZXggKyAyID4gdGhpcy5tYXhRdWVyaWVzICkge1xyXG5cclxuXHRcdFx0d2Fybk9uY2UoIGBXZWJHUFVUaW1lc3RhbXBRdWVyeVBvb2wgWyR7IHRoaXMudHlwZSB9XTogTWF4aW11bSBudW1iZXIgb2YgcXVlcmllcyBleGNlZWRlZCwgd2hlbiB1c2luZyB0cmFja1RpbWVzdGFtcCBpdCBpcyBuZWNlc3NhcnkgdG8gcmVzb2x2ZXMgdGhlIHF1ZXJpZXMgdmlhIHJlbmRlcmVyLnJlc29sdmVUaW1lc3RhbXBzQXN5bmMoIFRIUkVFLlRpbWVzdGFtcFF1ZXJ5LiR7IHRoaXMudHlwZS50b1VwcGVyQ2FzZSgpIH0gKS5gICk7XHJcblx0XHRcdHJldHVybiBudWxsO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBiYXNlT2Zmc2V0ID0gdGhpcy5jdXJyZW50UXVlcnlJbmRleDtcclxuXHRcdHRoaXMuY3VycmVudFF1ZXJ5SW5kZXggKz0gMjtcclxuXHJcblx0XHQvLyBJbml0aWFsaXplIHF1ZXJ5IHN0YXRlc1xyXG5cdFx0dGhpcy5xdWVyeVN0YXRlcy5zZXQoIGJhc2VPZmZzZXQsICdpbmFjdGl2ZScgKTtcclxuXHRcdHRoaXMucXVlcnlPZmZzZXRzLnNldCggcmVuZGVyQ29udGV4dC5pZCwgYmFzZU9mZnNldCApO1xyXG5cclxuXHRcdHJldHVybiBiYXNlT2Zmc2V0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEJlZ2lucyBhIHRpbWVzdGFtcCBxdWVyeSBmb3IgdGhlIHNwZWNpZmllZCByZW5kZXIgY29udGV4dC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSByZW5kZXJDb250ZXh0IC0gVGhlIHJlbmRlciBjb250ZXh0IHRvIGJlZ2luIHRpbWluZyBmb3IuXHJcblx0ICovXHJcblx0YmVnaW5RdWVyeSggcmVuZGVyQ29udGV4dCApIHtcclxuXHJcblx0XHRpZiAoICEgdGhpcy50cmFja1RpbWVzdGFtcCB8fCB0aGlzLmlzRGlzcG9zZWQgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGJhc2VPZmZzZXQgPSB0aGlzLnF1ZXJ5T2Zmc2V0cy5nZXQoIHJlbmRlckNvbnRleHQuaWQgKTtcclxuXHRcdGlmICggYmFzZU9mZnNldCA9PSBudWxsICkge1xyXG5cclxuXHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBEb24ndCBzdGFydCBhIG5ldyBxdWVyeSBpZiB0aGVyZSdzIGFuIGFjdGl2ZSBvbmVcclxuXHRcdGlmICggdGhpcy5hY3RpdmVRdWVyeSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgcXVlcnkgPSB0aGlzLnF1ZXJpZXNbIGJhc2VPZmZzZXQgXTtcclxuXHRcdGlmICggISBxdWVyeSApIHtcclxuXHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dHJ5IHtcclxuXHJcblx0XHRcdC8vIE9ubHkgYmVnaW4gaWYgcXVlcnkgaXMgaW5hY3RpdmVcclxuXHRcdFx0aWYgKCB0aGlzLnF1ZXJ5U3RhdGVzLmdldCggYmFzZU9mZnNldCApID09PSAnaW5hY3RpdmUnICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLmdsLmJlZ2luUXVlcnkoIHRoaXMuZXh0LlRJTUVfRUxBUFNFRF9FWFQsIHF1ZXJ5ICk7XHJcblx0XHRcdFx0dGhpcy5hY3RpdmVRdWVyeSA9IGJhc2VPZmZzZXQ7XHJcblx0XHRcdFx0dGhpcy5xdWVyeVN0YXRlcy5zZXQoIGJhc2VPZmZzZXQsICdzdGFydGVkJyApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gY2F0Y2ggKCBlcnJvciApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoICdFcnJvciBpbiBiZWdpblF1ZXJ5OicsIGVycm9yICk7XHJcblx0XHRcdHRoaXMuYWN0aXZlUXVlcnkgPSBudWxsO1xyXG5cdFx0XHR0aGlzLnF1ZXJ5U3RhdGVzLnNldCggYmFzZU9mZnNldCwgJ2luYWN0aXZlJyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFbmRzIHRoZSBhY3RpdmUgdGltZXN0YW1wIHF1ZXJ5IGZvciB0aGUgc3BlY2lmaWVkIHJlbmRlciBjb250ZXh0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IHJlbmRlckNvbnRleHQgLSBUaGUgcmVuZGVyIGNvbnRleHQgdG8gZW5kIHRpbWluZyBmb3IuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHJlbmRlckNvbnRleHQuaWQgLSBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlbmRlciBjb250ZXh0LlxyXG5cdCAqL1xyXG5cdGVuZFF1ZXJ5KCByZW5kZXJDb250ZXh0ICkge1xyXG5cclxuXHRcdGlmICggISB0aGlzLnRyYWNrVGltZXN0YW1wIHx8IHRoaXMuaXNEaXNwb3NlZCApIHtcclxuXHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgYmFzZU9mZnNldCA9IHRoaXMucXVlcnlPZmZzZXRzLmdldCggcmVuZGVyQ29udGV4dC5pZCApO1xyXG5cdFx0aWYgKCBiYXNlT2Zmc2V0ID09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIE9ubHkgZW5kIGlmIHRoaXMgaXMgdGhlIGFjdGl2ZSBxdWVyeVxyXG5cdFx0aWYgKCB0aGlzLmFjdGl2ZVF1ZXJ5ICE9PSBiYXNlT2Zmc2V0ICkge1xyXG5cclxuXHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0cnkge1xyXG5cclxuXHRcdFx0dGhpcy5nbC5lbmRRdWVyeSggdGhpcy5leHQuVElNRV9FTEFQU0VEX0VYVCApO1xyXG5cdFx0XHR0aGlzLnF1ZXJ5U3RhdGVzLnNldCggYmFzZU9mZnNldCwgJ2VuZGVkJyApO1xyXG5cdFx0XHR0aGlzLmFjdGl2ZVF1ZXJ5ID0gbnVsbDtcclxuXHJcblx0XHR9IGNhdGNoICggZXJyb3IgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnRXJyb3IgaW4gZW5kUXVlcnk6JywgZXJyb3IgKTtcclxuXHRcdFx0Ly8gUmVzZXQgc3RhdGUgb24gZXJyb3JcclxuXHRcdFx0dGhpcy5xdWVyeVN0YXRlcy5zZXQoIGJhc2VPZmZzZXQsICdpbmFjdGl2ZScgKTtcclxuXHRcdFx0dGhpcy5hY3RpdmVRdWVyeSA9IG51bGw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFzeW5jaHJvbm91c2x5IHJlc29sdmVzIGFsbCBjb21wbGV0ZWQgcXVlcmllcyBhbmQgcmV0dXJucyB0aGUgdG90YWwgZHVyYXRpb24uXHJcblx0ICpcclxuXHQgKiBAYXN5bmNcclxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSBUaGUgdG90YWwgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzLCBvciB0aGUgbGFzdCB2YWxpZCB2YWx1ZSBpZiByZXNvbHV0aW9uIGZhaWxzLlxyXG5cdCAqL1xyXG5cdGFzeW5jIHJlc29sdmVRdWVyaWVzQXN5bmMoKSB7XHJcblxyXG5cdFx0aWYgKCAhIHRoaXMudHJhY2tUaW1lc3RhbXAgfHwgdGhpcy5wZW5kaW5nUmVzb2x2ZSApIHtcclxuXHJcblx0XHRcdHJldHVybiB0aGlzLmxhc3RWYWx1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5wZW5kaW5nUmVzb2x2ZSA9IHRydWU7XHJcblxyXG5cdFx0dHJ5IHtcclxuXHJcblx0XHRcdC8vIFdhaXQgZm9yIGFsbCBlbmRlZCBxdWVyaWVzIHRvIGNvbXBsZXRlXHJcblx0XHRcdGNvbnN0IHJlc29sdmVQcm9taXNlcyA9IFtdO1xyXG5cclxuXHRcdFx0Zm9yICggY29uc3QgWyBiYXNlT2Zmc2V0LCBzdGF0ZSBdIG9mIHRoaXMucXVlcnlTdGF0ZXMgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggc3RhdGUgPT09ICdlbmRlZCcgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgcXVlcnkgPSB0aGlzLnF1ZXJpZXNbIGJhc2VPZmZzZXQgXTtcclxuXHRcdFx0XHRcdHJlc29sdmVQcm9taXNlcy5wdXNoKCB0aGlzLnJlc29sdmVRdWVyeSggcXVlcnkgKSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHJlc29sdmVQcm9taXNlcy5sZW5ndGggPT09IDAgKSB7XHJcblxyXG5cdFx0XHRcdHJldHVybiB0aGlzLmxhc3RWYWx1ZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbCggcmVzb2x2ZVByb21pc2VzICk7XHJcblx0XHRcdGNvbnN0IHRvdGFsRHVyYXRpb24gPSByZXN1bHRzLnJlZHVjZSggKCBhY2MsIHZhbCApID0+IGFjYyArIHZhbCwgMCApO1xyXG5cclxuXHRcdFx0Ly8gU3RvcmUgdGhlIGxhc3QgdmFsaWQgcmVzdWx0XHJcblx0XHRcdHRoaXMubGFzdFZhbHVlID0gdG90YWxEdXJhdGlvbjtcclxuXHJcblx0XHRcdC8vIFJlc2V0IHN0YXRlc1xyXG5cdFx0XHR0aGlzLmN1cnJlbnRRdWVyeUluZGV4ID0gMDtcclxuXHRcdFx0dGhpcy5xdWVyeU9mZnNldHMuY2xlYXIoKTtcclxuXHRcdFx0dGhpcy5xdWVyeVN0YXRlcy5jbGVhcigpO1xyXG5cdFx0XHR0aGlzLmFjdGl2ZVF1ZXJ5ID0gbnVsbDtcclxuXHJcblx0XHRcdHJldHVybiB0b3RhbER1cmF0aW9uO1xyXG5cclxuXHRcdH0gY2F0Y2ggKCBlcnJvciApIHtcclxuXHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoICdFcnJvciByZXNvbHZpbmcgcXVlcmllczonLCBlcnJvciApO1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5sYXN0VmFsdWU7XHJcblxyXG5cdFx0fSBmaW5hbGx5IHtcclxuXHJcblx0XHRcdHRoaXMucGVuZGluZ1Jlc29sdmUgPSBmYWxzZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVzb2x2ZXMgYSBzaW5nbGUgcXVlcnksIGNoZWNraW5nIGZvciBjb21wbGV0aW9uIGFuZCBkaXNqb2ludCBvcGVyYXRpb24uXHJcblx0ICpcclxuXHQgKiBAYXN5bmNcclxuXHQgKiBAcGFyYW0ge1dlYkdMUXVlcnl9IHF1ZXJ5IC0gVGhlIHF1ZXJ5IG9iamVjdCB0byByZXNvbHZlLlxyXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlcj59IFRoZSBlbGFwc2VkIHRpbWUgaW4gbWlsbGlzZWNvbmRzLlxyXG5cdCAqL1xyXG5cdGFzeW5jIHJlc29sdmVRdWVyeSggcXVlcnkgKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKCAoIHJlc29sdmUgKSA9PiB7XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMuaXNEaXNwb3NlZCApIHtcclxuXHJcblx0XHRcdFx0cmVzb2x2ZSggdGhpcy5sYXN0VmFsdWUgKTtcclxuXHRcdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRsZXQgdGltZW91dElkO1xyXG5cdFx0XHRsZXQgaXNSZXNvbHZlZCA9IGZhbHNlO1xyXG5cclxuXHRcdFx0Y29uc3QgY2xlYW51cCA9ICgpID0+IHtcclxuXHJcblx0XHRcdFx0aWYgKCB0aW1lb3V0SWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y2xlYXJUaW1lb3V0KCB0aW1lb3V0SWQgKTtcclxuXHRcdFx0XHRcdHRpbWVvdXRJZCA9IG51bGw7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHRjb25zdCBmaW5hbGl6ZVJlc29sdXRpb24gPSAoIHZhbHVlICkgPT4ge1xyXG5cclxuXHRcdFx0XHRpZiAoICEgaXNSZXNvbHZlZCApIHtcclxuXHJcblx0XHRcdFx0XHRpc1Jlc29sdmVkID0gdHJ1ZTtcclxuXHRcdFx0XHRcdGNsZWFudXAoKTtcclxuXHRcdFx0XHRcdHJlc29sdmUoIHZhbHVlICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHRjb25zdCBjaGVja1F1ZXJ5ID0gKCkgPT4ge1xyXG5cclxuXHRcdFx0XHRpZiAoIHRoaXMuaXNEaXNwb3NlZCApIHtcclxuXHJcblx0XHRcdFx0XHRmaW5hbGl6ZVJlc29sdXRpb24oIHRoaXMubGFzdFZhbHVlICk7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0dHJ5IHtcclxuXHJcblx0XHRcdFx0XHQvLyBDaGVjayBpZiB0aGUgR1BVIHRpbWVyIHdhcyBkaXNqb2ludCAoaS5lLiwgdGltaW5nIHdhcyB1bnJlbGlhYmxlKVxyXG5cdFx0XHRcdFx0Y29uc3QgZGlzam9pbnQgPSB0aGlzLmdsLmdldFBhcmFtZXRlciggdGhpcy5leHQuR1BVX0RJU0pPSU5UX0VYVCApO1xyXG5cdFx0XHRcdFx0aWYgKCBkaXNqb2ludCApIHtcclxuXHJcblx0XHRcdFx0XHRcdGZpbmFsaXplUmVzb2x1dGlvbiggdGhpcy5sYXN0VmFsdWUgKTtcclxuXHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRjb25zdCBhdmFpbGFibGUgPSB0aGlzLmdsLmdldFF1ZXJ5UGFyYW1ldGVyKCBxdWVyeSwgdGhpcy5nbC5RVUVSWV9SRVNVTFRfQVZBSUxBQkxFICk7XHJcblx0XHRcdFx0XHRpZiAoICEgYXZhaWxhYmxlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0dGltZW91dElkID0gc2V0VGltZW91dCggY2hlY2tRdWVyeSwgMSApO1xyXG5cdFx0XHRcdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGVsYXBzZWQgPSB0aGlzLmdsLmdldFF1ZXJ5UGFyYW1ldGVyKCBxdWVyeSwgdGhpcy5nbC5RVUVSWV9SRVNVTFQgKTtcclxuXHRcdFx0XHRcdHJlc29sdmUoIE51bWJlciggZWxhcHNlZCApIC8gMWU2ICk7IC8vIENvbnZlcnQgbmFub3NlY29uZHMgdG8gbWlsbGlzZWNvbmRzXHJcblxyXG5cdFx0XHRcdH0gY2F0Y2ggKCBlcnJvciApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnRXJyb3IgY2hlY2tpbmcgcXVlcnk6JywgZXJyb3IgKTtcclxuXHRcdFx0XHRcdHJlc29sdmUoIHRoaXMubGFzdFZhbHVlICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHRjaGVja1F1ZXJ5KCk7XHJcblxyXG5cdFx0fSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbGVhc2VzIGFsbCByZXNvdXJjZXMgaGVsZCBieSB0aGlzIHF1ZXJ5IHBvb2wuXHJcblx0ICogVGhpcyBpbmNsdWRlcyBkZWxldGluZyBhbGwgcXVlcnkgb2JqZWN0cyBhbmQgY2xlYXJpbmcgaW50ZXJuYWwgc3RhdGUuXHJcblx0ICovXHJcblx0ZGlzcG9zZSgpIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuaXNEaXNwb3NlZCApIHtcclxuXHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5pc0Rpc3Bvc2VkID0gdHJ1ZTtcclxuXHJcblx0XHRpZiAoICEgdGhpcy50cmFja1RpbWVzdGFtcCApIHJldHVybjtcclxuXHJcblx0XHRmb3IgKCBjb25zdCBxdWVyeSBvZiB0aGlzLnF1ZXJpZXMgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmdsLmRlbGV0ZVF1ZXJ5KCBxdWVyeSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnF1ZXJpZXMgPSBbXTtcclxuXHRcdHRoaXMucXVlcnlTdGF0ZXMuY2xlYXIoKTtcclxuXHRcdHRoaXMucXVlcnlPZmZzZXRzLmNsZWFyKCk7XHJcblx0XHR0aGlzLmxhc3RWYWx1ZSA9IDA7XHJcblx0XHR0aGlzLmFjdGl2ZVF1ZXJ5ID0gbnVsbDtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgV2ViR0xUaW1lc3RhbXBRdWVyeVBvb2w7XHJcbiIsImltcG9ydCBHTFNMTm9kZUJ1aWxkZXIgZnJvbSAnLi9ub2Rlcy9HTFNMTm9kZUJ1aWxkZXIuanMnO1xyXG5pbXBvcnQgQmFja2VuZCBmcm9tICcuLi9jb21tb24vQmFja2VuZC5qcyc7XHJcbmltcG9ydCB7IGdldENhY2hlS2V5IH0gZnJvbSAnLi4vY29tbW9uL1JlbmRlckNvbnRleHQuanMnO1xyXG5cclxuaW1wb3J0IFdlYkdMQXR0cmlidXRlVXRpbHMgZnJvbSAnLi91dGlscy9XZWJHTEF0dHJpYnV0ZVV0aWxzLmpzJztcclxuaW1wb3J0IFdlYkdMU3RhdGUgZnJvbSAnLi91dGlscy9XZWJHTFN0YXRlLmpzJztcclxuaW1wb3J0IFdlYkdMVXRpbHMgZnJvbSAnLi91dGlscy9XZWJHTFV0aWxzLmpzJztcclxuaW1wb3J0IFdlYkdMVGV4dHVyZVV0aWxzIGZyb20gJy4vdXRpbHMvV2ViR0xUZXh0dXJlVXRpbHMuanMnO1xyXG5pbXBvcnQgV2ViR0xFeHRlbnNpb25zIGZyb20gJy4vdXRpbHMvV2ViR0xFeHRlbnNpb25zLmpzJztcclxuaW1wb3J0IFdlYkdMQ2FwYWJpbGl0aWVzIGZyb20gJy4vdXRpbHMvV2ViR0xDYXBhYmlsaXRpZXMuanMnO1xyXG5pbXBvcnQgeyBHTEZlYXR1cmVOYW1lIH0gZnJvbSAnLi91dGlscy9XZWJHTENvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IFdlYkdMQnVmZmVyUmVuZGVyZXIgfSBmcm9tICcuL1dlYkdMQnVmZmVyUmVuZGVyZXIuanMnO1xyXG5cclxuaW1wb3J0IHsgd2Fybk9uY2UgfSBmcm9tICcuLi8uLi91dGlscy5qcyc7XHJcbmltcG9ydCB7IFdlYkdMQ29vcmRpbmF0ZVN5c3RlbSB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCBXZWJHTFRpbWVzdGFtcFF1ZXJ5UG9vbCBmcm9tICcuL3V0aWxzL1dlYkdMVGltZXN0YW1wUXVlcnlQb29sLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIGJhY2tlbmQgaW1wbGVtZW50YXRpb24gdGFyZ2V0aW5nIFdlYkdMIDIuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBhdWdtZW50cyBCYWNrZW5kXHJcbiAqL1xyXG5jbGFzcyBXZWJHTEJhY2tlbmQgZXh0ZW5kcyBCYWNrZW5kIHtcclxuXHJcblx0LyoqXHJcblx0ICogV2ViR0xCYWNrZW5kIG9wdGlvbnMuXHJcblx0ICpcclxuXHQgKiBAdHlwZWRlZiB7T2JqZWN0fSBXZWJHTEJhY2tlbmR+T3B0aW9uc1xyXG5cdCAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2xvZ2FyaXRobWljRGVwdGhCdWZmZXI9ZmFsc2VdIC0gV2hldGhlciBsb2dhcml0aG1pYyBkZXB0aCBidWZmZXIgaXMgZW5hYmxlZCBvciBub3QuXHJcblx0ICogQHByb3BlcnR5IHtib29sZWFufSBbYWxwaGE9dHJ1ZV0gLSBXaGV0aGVyIHRoZSBkZWZhdWx0IGZyYW1lYnVmZmVyICh3aGljaCByZXByZXNlbnRzIHRoZSBmaW5hbCBjb250ZW50cyBvZiB0aGUgY2FudmFzKSBzaG91bGQgYmUgdHJhbnNwYXJlbnQgb3Igb3BhcXVlLlxyXG5cdCAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2RlcHRoPXRydWVdIC0gV2hldGhlciB0aGUgZGVmYXVsdCBmcmFtZWJ1ZmZlciBzaG91bGQgaGF2ZSBhIGRlcHRoIGJ1ZmZlciBvciBub3QuXHJcblx0ICogQHByb3BlcnR5IHtib29sZWFufSBbc3RlbmNpbD1mYWxzZV0gLSBXaGV0aGVyIHRoZSBkZWZhdWx0IGZyYW1lYnVmZmVyIHNob3VsZCBoYXZlIGEgc3RlbmNpbCBidWZmZXIgb3Igbm90LlxyXG5cdCAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2FudGlhbGlhcz1mYWxzZV0gLSBXaGV0aGVyIE1TQUEgYXMgdGhlIGRlZmF1bHQgYW50aS1hbGlhc2luZyBzaG91bGQgYmUgZW5hYmxlZCBvciBub3QuXHJcblx0ICogQHByb3BlcnR5IHtudW1iZXJ9IFtzYW1wbGVzPTBdIC0gV2hlbiBgYW50aWFsaWFzYCBpcyBgdHJ1ZWAsIGA0YCBzYW1wbGVzIGFyZSB1c2VkIGJ5IGRlZmF1bHQuIFNldCB0aGlzIHBhcmFtZXRlciB0byBhbnkgb3RoZXIgaW50ZWdlciB2YWx1ZSB0aGFuIDAgdG8gb3ZlcndyaXRlIHRoZSBkZWZhdWx0LlxyXG5cdCAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2ZvcmNlV2ViR0w9ZmFsc2VdIC0gSWYgc2V0IHRvIGB0cnVlYCwgdGhlIHJlbmRlcmVyIHVzZXMgYSBXZWJHTCAyIGJhY2tlbmQgbm8gbWF0dGVyIGlmIFdlYkdQVSBpcyBzdXBwb3J0ZWQgb3Igbm90LlxyXG5cdCAqIEBwcm9wZXJ0eSB7V2ViR0wyUmVuZGVyaW5nQ29udGV4dH0gW2NvbnRleHQ9dW5kZWZpbmVkXSAtIEEgV2ViR0wgMiByZW5kZXJpbmcgY29udGV4dC5cclxuXHQgKi9cclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBXZWJHUFUgYmFja2VuZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xCYWNrZW5kfk9wdGlvbnN9IFtwYXJhbWV0ZXJzXSAtIFRoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVycyA9IHt9ICkge1xyXG5cclxuXHRcdHN1cGVyKCBwYXJhbWV0ZXJzICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzV2ViR0xCYWNrZW5kID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIGEgYmFja2VuZCBtb2R1bGUgaG9sZGluZyBzaGFkZXIgYXR0cmlidXRlLXJlbGF0ZWRcclxuXHRcdCAqIHV0aWxpdHkgZnVuY3Rpb25zLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/V2ViR0xBdHRyaWJ1dGVVdGlsc31cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5hdHRyaWJ1dGVVdGlscyA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZSB0byBhIGJhY2tlbmQgbW9kdWxlIGhvbGRpbmcgZXh0ZW5zaW9uLXJlbGF0ZWRcclxuXHRcdCAqIHV0aWxpdHkgZnVuY3Rpb25zLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/V2ViR0xFeHRlbnNpb25zfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmV4dGVuc2lvbnMgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gYSBiYWNrZW5kIG1vZHVsZSBob2xkaW5nIGNhcGFiaWxpdHktcmVsYXRlZFxyXG5cdFx0ICogdXRpbGl0eSBmdW5jdGlvbnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9XZWJHTENhcGFiaWxpdGllc31cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jYXBhYmlsaXRpZXMgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gYSBiYWNrZW5kIG1vZHVsZSBob2xkaW5nIHRleHR1cmUtcmVsYXRlZFxyXG5cdFx0ICogdXRpbGl0eSBmdW5jdGlvbnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9XZWJHTFRleHR1cmVVdGlsc31cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50ZXh0dXJlVXRpbHMgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gYSBiYWNrZW5kIG1vZHVsZSBob2xkaW5nIHJlbmRlcmVyLXJlbGF0ZWRcclxuXHRcdCAqIHV0aWxpdHkgZnVuY3Rpb25zLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/V2ViR0xCdWZmZXJSZW5kZXJlcn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5idWZmZXJSZW5kZXJlciA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZSB0byB0aGUgcmVuZGVyaW5nIGNvbnRleHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9XZWJHTDJSZW5kZXJpbmdDb250ZXh0fVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdsID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIGEgYmFja2VuZCBtb2R1bGUgaG9sZGluZyBzdGF0ZS1yZWxhdGVkXHJcblx0XHQgKiB1dGlsaXR5IGZ1bmN0aW9ucy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1dlYkdMU3RhdGV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuc3RhdGUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gYSBiYWNrZW5kIG1vZHVsZSBob2xkaW5nIGNvbW1vblxyXG5cdFx0ICogdXRpbGl0eSBmdW5jdGlvbnMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9XZWJHTFV0aWxzfVxyXG5cdFx0ICogQGRlZmF1bHQgbnVsbFxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnV0aWxzID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERpY3Rpb25hcnkgZm9yIGNhY2hpbmcgVkFPcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0PHN0cmluZyxXZWJHTFZlcnRleEFycmF5T2JqZWN0Pn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy52YW9DYWNoZSA9IHt9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRGljdGlvbmFyeSBmb3IgY2FjaGluZyB0cmFuc2Zvcm0gZmVlZGJhY2sgb2JqZWN0cy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0PHN0cmluZyxXZWJHTFRyYW5zZm9ybUZlZWRiYWNrPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50cmFuc2Zvcm1GZWVkYmFja0NhY2hlID0ge307XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDb250cm9scyBpZiBgZ2wuUkFTVEVSSVpFUl9ESVNDQVJEYCBzaG91bGQgYmUgZW5hYmxlZCBvciBub3QuXHJcblx0XHQgKiBPbmx5IHJlbGV2YW50IHdoZW4gdXNpbmcgY29tcHV0ZSBzaGFkZXJzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgZmFsc2VcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kaXNjYXJkID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZSB0byB0aGUgYEVYVF9kaXNqb2ludF90aW1lcl9xdWVyeV93ZWJnbDJgIGV4dGVuc2lvbi4gYG51bGxgIGlmIHRoZVxyXG5cdFx0ICogZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhlIGV4dGVuc2lvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P0VYVERpc2pvaW50VGltZXJRdWVyeVdlYkdMMn1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kaXNqb2ludCA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQqIEEgcmVmZXJlbmNlIHRvIHRoZSBgS0hSX3BhcmFsbGVsX3NoYWRlcl9jb21waWxlYCBleHRlbnNpb24uIGBudWxsYCBpZiB0aGVcclxuXHRcdCogZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhlIGV4dGVuc2lvbi5cclxuXHRcdCpcclxuXHRcdCogQHR5cGUgez9LSFJQYXJhbGxlbFNoYWRlckNvbXBpbGV9XHJcblx0XHQqIEBkZWZhdWx0IG51bGxcclxuXHRcdCovXHJcblx0XHR0aGlzLnBhcmFsbGVsID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IHJlbmRlciBjb250ZXh0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7UmVuZGVyQ29udGV4dH1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fY3VycmVudENvbnRleHQgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSB1bmlxdWUgY29sbGVjdGlvbiBvZiBiaW5kaW5ncy5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge1dlYWtTZXR9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX2tub3duQmluZGluZ3MgPSBuZXcgV2Vha1NldCgpO1xyXG5cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIGRldmljZSBzdXBwb3J0cyBmcmFtZWJ1ZmZlcnMgaW52YWxpZGF0aW9uIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX3N1cHBvcnRzSW52YWxpZGF0ZUZyYW1lYnVmZmVyID0gdHlwZW9mIG5hdmlnYXRvciA9PT0gJ3VuZGVmaW5lZCcgPyBmYWxzZSA6IC9PY3VsdXNCcm93c2VyL2cudGVzdCggbmF2aWdhdG9yLnVzZXJBZ2VudCApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHRhcmdldCBmcmFtZWJ1ZmZlciB3aGVuIHJlbmRlcmluZyB3aXRoXHJcblx0XHQgKiB0aGUgV2ViWFIgZGV2aWNlIEFQSS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUge1dlYkdMRnJhbWVidWZmZXJ9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX3hyRnJhbWVidWZmZXIgPSBudWxsO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEluaXRpYWxpemVzIHRoZSBiYWNrZW5kIHNvIGl0IGlzIHJlYWR5IGZvciB1c2FnZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqL1xyXG5cdGluaXQoIHJlbmRlcmVyICkge1xyXG5cclxuXHRcdHN1cGVyLmluaXQoIHJlbmRlcmVyICk7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCBwYXJhbWV0ZXJzID0gdGhpcy5wYXJhbWV0ZXJzO1xyXG5cclxuXHRcdGNvbnN0IGNvbnRleHRBdHRyaWJ1dGVzID0ge1xyXG5cdFx0XHRhbnRpYWxpYXM6IHJlbmRlcmVyLnNhbXBsZXMgPiAwLFxyXG5cdFx0XHRhbHBoYTogdHJ1ZSwgLy8gYWx3YXlzIHRydWUgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnNcclxuXHRcdFx0ZGVwdGg6IHJlbmRlcmVyLmRlcHRoLFxyXG5cdFx0XHRzdGVuY2lsOiByZW5kZXJlci5zdGVuY2lsXHJcblx0XHR9O1xyXG5cclxuXHRcdGNvbnN0IGdsQ29udGV4dCA9ICggcGFyYW1ldGVycy5jb250ZXh0ICE9PSB1bmRlZmluZWQgKSA/IHBhcmFtZXRlcnMuY29udGV4dCA6IHJlbmRlcmVyLmRvbUVsZW1lbnQuZ2V0Q29udGV4dCggJ3dlYmdsMicsIGNvbnRleHRBdHRyaWJ1dGVzICk7XHJcblxyXG5cdCBcdGZ1bmN0aW9uIG9uQ29udGV4dExvc3QoIGV2ZW50ICkge1xyXG5cclxuXHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcblx0XHRcdGNvbnN0IGNvbnRleHRMb3NzSW5mbyA9IHtcclxuXHRcdFx0XHRhcGk6ICdXZWJHTCcsXHJcblx0XHRcdFx0bWVzc2FnZTogZXZlbnQuc3RhdHVzTWVzc2FnZSB8fCAnVW5rbm93biByZWFzb24nLFxyXG5cdFx0XHRcdHJlYXNvbjogbnVsbCxcclxuXHRcdFx0XHRvcmlnaW5hbEV2ZW50OiBldmVudFxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0cmVuZGVyZXIub25EZXZpY2VMb3N0KCBjb250ZXh0TG9zc0luZm8gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5fb25Db250ZXh0TG9zdCA9IG9uQ29udGV4dExvc3Q7XHJcblxyXG5cdFx0cmVuZGVyZXIuZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCAnd2ViZ2xjb250ZXh0bG9zdCcsIG9uQ29udGV4dExvc3QsIGZhbHNlICk7XHJcblxyXG5cdFx0dGhpcy5nbCA9IGdsQ29udGV4dDtcclxuXHJcblx0XHR0aGlzLmV4dGVuc2lvbnMgPSBuZXcgV2ViR0xFeHRlbnNpb25zKCB0aGlzICk7XHJcblx0XHR0aGlzLmNhcGFiaWxpdGllcyA9IG5ldyBXZWJHTENhcGFiaWxpdGllcyggdGhpcyApO1xyXG5cdFx0dGhpcy5hdHRyaWJ1dGVVdGlscyA9IG5ldyBXZWJHTEF0dHJpYnV0ZVV0aWxzKCB0aGlzICk7XHJcblx0XHR0aGlzLnRleHR1cmVVdGlscyA9IG5ldyBXZWJHTFRleHR1cmVVdGlscyggdGhpcyApO1xyXG5cdFx0dGhpcy5idWZmZXJSZW5kZXJlciA9IG5ldyBXZWJHTEJ1ZmZlclJlbmRlcmVyKCB0aGlzICk7XHJcblxyXG5cdFx0dGhpcy5zdGF0ZSA9IG5ldyBXZWJHTFN0YXRlKCB0aGlzICk7XHJcblx0XHR0aGlzLnV0aWxzID0gbmV3IFdlYkdMVXRpbHMoIHRoaXMgKTtcclxuXHJcblx0XHR0aGlzLmV4dGVuc2lvbnMuZ2V0KCAnRVhUX2NvbG9yX2J1ZmZlcl9mbG9hdCcgKTtcclxuXHRcdHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jbGlwX2N1bGxfZGlzdGFuY2UnICk7XHJcblx0XHR0aGlzLmV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyJyApO1xyXG5cdFx0dGhpcy5leHRlbnNpb25zLmdldCggJ0VYVF9jb2xvcl9idWZmZXJfaGFsZl9mbG9hdCcgKTtcclxuXHRcdHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9tdWx0aXNhbXBsZWRfcmVuZGVyX3RvX3RleHR1cmUnICk7XHJcblx0XHR0aGlzLmV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfcmVuZGVyX3NoYXJlZF9leHBvbmVudCcgKTtcclxuXHRcdHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9tdWx0aV9kcmF3JyApO1xyXG5cclxuXHRcdHRoaXMuZGlzam9pbnQgPSB0aGlzLmV4dGVuc2lvbnMuZ2V0KCAnRVhUX2Rpc2pvaW50X3RpbWVyX3F1ZXJ5X3dlYmdsMicgKTtcclxuXHRcdHRoaXMucGFyYWxsZWwgPSB0aGlzLmV4dGVuc2lvbnMuZ2V0KCAnS0hSX3BhcmFsbGVsX3NoYWRlcl9jb21waWxlJyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBjb29yZGluYXRlIHN5c3RlbSBvZiB0aGUgYmFja2VuZC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0ICogQHJlYWRvbmx5XHJcblx0ICovXHJcblx0Z2V0IGNvb3JkaW5hdGVTeXN0ZW0oKSB7XHJcblxyXG5cdFx0cmV0dXJuIFdlYkdMQ29vcmRpbmF0ZVN5c3RlbTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBwZXJmb3JtcyBhIHJlYWRiYWNrIG9wZXJhdGlvbiBieSBtb3ZpbmcgYnVmZmVyIGRhdGEgZnJvbVxyXG5cdCAqIGEgc3RvcmFnZSBidWZmZXIgYXR0cmlidXRlIGZyb20gdGhlIEdQVSB0byB0aGUgQ1BVLlxyXG5cdCAqXHJcblx0ICogQGFzeW5jXHJcblx0ICogQHBhcmFtIHtTdG9yYWdlQnVmZmVyQXR0cmlidXRlfSBhdHRyaWJ1dGUgLSBUaGUgc3RvcmFnZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqIEByZXR1cm4ge1Byb21pc2U8QXJyYXlCdWZmZXI+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBidWZmZXIgZGF0YSB3aGVuIHRoZSBkYXRhIGFyZSByZWFkeS5cclxuXHQgKi9cclxuXHRhc3luYyBnZXRBcnJheUJ1ZmZlckFzeW5jKCBhdHRyaWJ1dGUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIGF3YWl0IHRoaXMuYXR0cmlidXRlVXRpbHMuZ2V0QXJyYXlCdWZmZXJBc3luYyggYXR0cmlidXRlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2FuIGJlIHVzZWQgdG8gc3luY2hyb25pemUgQ1BVIG9wZXJhdGlvbnMgd2l0aCBHUFUgdGFza3MuIFNvIHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLFxyXG5cdCAqIHRoZSBDUFUgd2FpdHMgZm9yIHRoZSBHUFUgdG8gY29tcGxldGUgaXRzIG9wZXJhdGlvbiAoZS5nLiBhIGNvbXB1dGUgdGFzaykuXHJcblx0ICpcclxuXHQgKiBAYXN5bmNcclxuXHQgKiBAcmV0dXJuIHtQcm9taXNlfSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHN5bmNocm9uaXphdGlvbiBoYXMgYmVlbiBmaW5pc2hlZC5cclxuXHQgKi9cclxuXHRhc3luYyB3YWl0Rm9yR1BVKCkge1xyXG5cclxuXHRcdGF3YWl0IHRoaXMudXRpbHMuX2NsaWVudFdhaXRBc3luYygpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEVuc3VyZXMgdGhlIGJhY2tlbmQgaXMgWFIgY29tcGF0aWJsZS5cclxuXHQgKlxyXG5cdCAqIEBhc3luY1xyXG5cdCAqIEByZXR1cm4ge1Byb21pc2V9IEEgUHJvbWlzZSB0aGF0IHJlc29sdmUgd2hlbiB0aGUgcmVuZGVyZXIgaXMgWFIgY29tcGF0aWJsZS5cclxuXHQgKi9cclxuXHRhc3luYyBtYWtlWFJDb21wYXRpYmxlKCkge1xyXG5cclxuXHRcdGNvbnN0IGF0dHJpYnV0ZXMgPSB0aGlzLmdsLmdldENvbnRleHRBdHRyaWJ1dGVzKCk7XHJcblxyXG5cdFx0aWYgKCBhdHRyaWJ1dGVzLnhyQ29tcGF0aWJsZSAhPT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdGF3YWl0IHRoaXMuZ2wubWFrZVhSQ29tcGF0aWJsZSgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIFhSIHJlbmRlcmluZyBkZXN0aW5hdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xGcmFtZWJ1ZmZlcn0geHJGcmFtZWJ1ZmZlciAtIFRoZSBYUiBmcmFtZWJ1ZmZlci5cclxuXHQgKi9cclxuXHRzZXRYUlRhcmdldCggeHJGcmFtZWJ1ZmZlciApIHtcclxuXHJcblx0XHR0aGlzLl94ckZyYW1lYnVmZmVyID0geHJGcmFtZWJ1ZmZlcjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25maWd1cmVzIHRoZSBnaXZlbiBYUiByZW5kZXIgdGFyZ2V0IHdpdGggZXh0ZXJuYWwgdGV4dHVyZXMuXHJcblx0ICpcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyBvbmx5IHJlbGV2YW50IHdoZW4gdXNpbmcgdGhlIFdlYlhSIExheWVycyBBUEkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1hSUmVuZGVyVGFyZ2V0fSByZW5kZXJUYXJnZXQgLSBUaGUgWFIgcmVuZGVyIHRhcmdldC5cclxuXHQgKiBAcGFyYW0ge1dlYkdMVGV4dHVyZX0gY29sb3JUZXh0dXJlIC0gQSBuYXRpdmUgY29sb3IgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0gez9XZWJHTFRleHR1cmV9IFtkZXB0aFRleHR1cmU9bnVsbF0gLSBBIG5hdGl2ZSBkZXB0aCB0ZXh0dXJlLlxyXG5cdCAqL1xyXG5cdHNldFhSUmVuZGVyVGFyZ2V0VGV4dHVyZXMoIHJlbmRlclRhcmdldCwgY29sb3JUZXh0dXJlLCBkZXB0aFRleHR1cmUgPSBudWxsICkge1xyXG5cclxuXHRcdGNvbnN0IGdsID0gdGhpcy5nbDtcclxuXHJcblx0XHR0aGlzLnNldCggcmVuZGVyVGFyZ2V0LnRleHR1cmUsIHsgdGV4dHVyZUdQVTogY29sb3JUZXh0dXJlLCBnbEludGVybmFsRm9ybWF0OiBnbC5SR0JBOCB9ICk7IC8vIHNlZSAjMjQ2OTggd2h5IFJHQkE4IGFuZCBub3QgU1JHQjhfQUxQSEE4IGlzIHVzZWRcclxuXHJcblx0XHRpZiAoIGRlcHRoVGV4dHVyZSAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGdsSW50ZXJuYWxGb3JtYXQgPSByZW5kZXJUYXJnZXQuc3RlbmNpbEJ1ZmZlciA/IGdsLkRFUFRIMjRfU1RFTkNJTDggOiBnbC5ERVBUSF9DT01QT05FTlQyNDtcclxuXHJcblx0XHRcdHRoaXMuc2V0KCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLCB7IHRleHR1cmVHUFU6IGRlcHRoVGV4dHVyZSwgZ2xJbnRlcm5hbEZvcm1hdDogZ2xJbnRlcm5hbEZvcm1hdCB9ICk7XHJcblxyXG5cdFx0XHQvLyBUaGUgbXVsdGlzYW1wbGVfcmVuZGVyX3RvX3RleHR1cmUgZXh0ZW5zaW9uIGRvZXNuJ3Qgd29yayBwcm9wZXJseSBpZiB0aGVyZVxyXG5cdFx0XHQvLyBhcmUgbWlkZnJhbWUgZmx1c2hlcyBhbmQgYW4gZXh0ZXJuYWwgZGVwdGggdGV4dHVyZS5cclxuXHRcdFx0aWYgKCAoIHRoaXMuZXh0ZW5zaW9ucy5oYXMoICdXRUJHTF9tdWx0aXNhbXBsZWRfcmVuZGVyX3RvX3RleHR1cmUnICkgPT09IHRydWUgKSAmJiByZW5kZXJUYXJnZXQuYXV0b0FsbG9jYXRlRGVwdGhCdWZmZXIgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMQmFja2VuZDogUmVuZGVyLXRvLXRleHR1cmUgZXh0ZW5zaW9uIHdhcyBkaXNhYmxlZCBiZWNhdXNlIGFuIGV4dGVybmFsIHRleHR1cmUgd2FzIHByb3ZpZGVkJyApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmVuZGVyVGFyZ2V0LmF1dG9BbGxvY2F0ZURlcHRoQnVmZmVyID0gZmFsc2U7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEluaXRzIGEgdGltZSBzdGFtcCBxdWVyeSBmb3IgdGhlIGdpdmVuIHJlbmRlciBjb250ZXh0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSZW5kZXJDb250ZXh0fSByZW5kZXJDb250ZXh0IC0gVGhlIHJlbmRlciBjb250ZXh0LlxyXG5cdCAqL1xyXG5cdGluaXRUaW1lc3RhbXBRdWVyeSggcmVuZGVyQ29udGV4dCApIHtcclxuXHJcblx0XHRpZiAoICEgdGhpcy5kaXNqb2ludCB8fCAhIHRoaXMudHJhY2tUaW1lc3RhbXAgKSByZXR1cm47XHJcblxyXG5cdFx0Y29uc3QgdHlwZSA9IHJlbmRlckNvbnRleHQuaXNDb21wdXRlTm9kZSA/ICdjb21wdXRlJyA6ICdyZW5kZXInO1xyXG5cclxuXHRcdGlmICggISB0aGlzLnRpbWVzdGFtcFF1ZXJ5UG9vbFsgdHlwZSBdICkge1xyXG5cclxuXHRcdFx0Ly8gVE9ETzogVmFyaWFibGUgbWF4UXVlcmllcz9cclxuXHRcdFx0dGhpcy50aW1lc3RhbXBRdWVyeVBvb2xbIHR5cGUgXSA9IG5ldyBXZWJHTFRpbWVzdGFtcFF1ZXJ5UG9vbCggdGhpcy5nbCwgdHlwZSwgMjA0OCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCB0aW1lc3RhbXBRdWVyeVBvb2wgPSB0aGlzLnRpbWVzdGFtcFF1ZXJ5UG9vbFsgdHlwZSBdO1xyXG5cclxuXHRcdGNvbnN0IGJhc2VPZmZzZXQgPSB0aW1lc3RhbXBRdWVyeVBvb2wuYWxsb2NhdGVRdWVyaWVzRm9yQ29udGV4dCggcmVuZGVyQ29udGV4dCApO1xyXG5cclxuXHRcdGlmICggYmFzZU9mZnNldCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRpbWVzdGFtcFF1ZXJ5UG9vbC5iZWdpblF1ZXJ5KCByZW5kZXJDb250ZXh0ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8vIHRpbWVzdGFtcCB1dGlsc1xyXG5cclxuXHQvKipcclxuXHQgKiBQcmVwYXJlcyB0aGUgdGltZXN0YW1wIGJ1ZmZlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyQ29udGV4dH0gcmVuZGVyQ29udGV4dCAtIFRoZSByZW5kZXIgY29udGV4dC5cclxuXHQgKi9cclxuXHRwcmVwYXJlVGltZXN0YW1wQnVmZmVyKCByZW5kZXJDb250ZXh0ICkge1xyXG5cclxuXHRcdGlmICggISB0aGlzLmRpc2pvaW50IHx8ICEgdGhpcy50cmFja1RpbWVzdGFtcCApIHJldHVybjtcclxuXHJcblx0XHRjb25zdCB0eXBlID0gcmVuZGVyQ29udGV4dC5pc0NvbXB1dGVOb2RlID8gJ2NvbXB1dGUnIDogJ3JlbmRlcic7XHJcblx0XHRjb25zdCB0aW1lc3RhbXBRdWVyeVBvb2wgPSB0aGlzLnRpbWVzdGFtcFF1ZXJ5UG9vbFsgdHlwZSBdO1xyXG5cclxuXHRcdHRpbWVzdGFtcFF1ZXJ5UG9vbC5lbmRRdWVyeSggcmVuZGVyQ29udGV4dCApO1xyXG5cclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBiYWNrZW5kJ3MgcmVuZGVyaW5nIGNvbnRleHQuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtXZWJHTDJSZW5kZXJpbmdDb250ZXh0fSBUaGUgcmVuZGVyaW5nIGNvbnRleHQuXHJcblx0ICovXHJcblx0Z2V0Q29udGV4dCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5nbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyBleGVjdXRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgcmVuZGVyIGNhbGwgYW5kIHByZXBhcmVzXHJcblx0ICogdGhlIFdlYkdMIHN0YXRlIGZvciB1cGNvbWluZyByZW5kZXIgY2FsbHNcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyQ29udGV4dH0gcmVuZGVyQ29udGV4dCAtIFRoZSByZW5kZXIgY29udGV4dC5cclxuXHQgKi9cclxuXHRiZWdpblJlbmRlciggcmVuZGVyQ29udGV4dCApIHtcclxuXHJcblx0XHRjb25zdCB7IHN0YXRlLCBnbCB9ID0gdGhpcztcclxuXHRcdGNvbnN0IHJlbmRlckNvbnRleHREYXRhID0gdGhpcy5nZXQoIHJlbmRlckNvbnRleHQgKTtcclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGlmICggcmVuZGVyQ29udGV4dC52aWV3cG9ydCApIHtcclxuXHJcblx0XHRcdHRoaXMudXBkYXRlVmlld3BvcnQoIHJlbmRlckNvbnRleHQgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0c3RhdGUudmlld3BvcnQoIDAsIDAsIGdsLmRyYXdpbmdCdWZmZXJXaWR0aCwgZ2wuZHJhd2luZ0J1ZmZlckhlaWdodCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHJlbmRlckNvbnRleHQuc2Npc3NvciApIHtcclxuXHJcblx0XHRcdGNvbnN0IHsgeCwgeSwgd2lkdGgsIGhlaWdodCB9ID0gcmVuZGVyQ29udGV4dC5zY2lzc29yVmFsdWU7XHJcblxyXG5cdFx0XHRzdGF0ZS5zY2lzc29yKCB4LCByZW5kZXJDb250ZXh0LmhlaWdodCAtIGhlaWdodCAtIHksIHdpZHRoLCBoZWlnaHQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHR0aGlzLmluaXRUaW1lc3RhbXBRdWVyeSggcmVuZGVyQ29udGV4dCApO1xyXG5cclxuXHRcdHJlbmRlckNvbnRleHREYXRhLnByZXZpb3VzQ29udGV4dCA9IHRoaXMuX2N1cnJlbnRDb250ZXh0O1xyXG5cdFx0dGhpcy5fY3VycmVudENvbnRleHQgPSByZW5kZXJDb250ZXh0O1xyXG5cclxuXHRcdHRoaXMuX3NldEZyYW1lYnVmZmVyKCByZW5kZXJDb250ZXh0ICk7XHJcblxyXG5cdFx0dGhpcy5jbGVhciggcmVuZGVyQ29udGV4dC5jbGVhckNvbG9yLCByZW5kZXJDb250ZXh0LmNsZWFyRGVwdGgsIHJlbmRlckNvbnRleHQuY2xlYXJTdGVuY2lsLCByZW5kZXJDb250ZXh0LCBmYWxzZSApO1xyXG5cclxuXHJcblx0XHRjb25zdCBvY2NsdXNpb25RdWVyeUNvdW50ID0gcmVuZGVyQ29udGV4dC5vY2NsdXNpb25RdWVyeUNvdW50O1xyXG5cclxuXHRcdGlmICggb2NjbHVzaW9uUXVlcnlDb3VudCA+IDAgKSB7XHJcblxyXG5cdFx0XHQvLyBHZXQgYSByZWZlcmVuY2UgdG8gdGhlIGFycmF5IG9mIG9iamVjdHMgd2l0aCBxdWVyaWVzLiBUaGUgcmVuZGVyQ29udGV4dERhdGEgcHJvcGVydHlcclxuXHRcdFx0Ly8gY2FuIGJlIGNoYW5nZWQgYnkgYW5vdGhlciByZW5kZXIgcGFzcyBiZWZvcmUgdGhlIGFzeW5jIHJlYWRpbmcgb2YgYWxsIHByZXZpb3VzIHF1ZXJpZXMgY29tcGxldGVcclxuXHRcdFx0cmVuZGVyQ29udGV4dERhdGEuY3VycmVudE9jY2x1c2lvblF1ZXJpZXMgPSByZW5kZXJDb250ZXh0RGF0YS5vY2NsdXNpb25RdWVyaWVzO1xyXG5cdFx0XHRyZW5kZXJDb250ZXh0RGF0YS5jdXJyZW50T2NjbHVzaW9uUXVlcnlPYmplY3RzID0gcmVuZGVyQ29udGV4dERhdGEub2NjbHVzaW9uUXVlcnlPYmplY3RzO1xyXG5cclxuXHRcdFx0cmVuZGVyQ29udGV4dERhdGEubGFzdE9jY2x1c2lvbk9iamVjdCA9IG51bGw7XHJcblx0XHRcdHJlbmRlckNvbnRleHREYXRhLm9jY2x1c2lvblF1ZXJpZXMgPSBuZXcgQXJyYXkoIG9jY2x1c2lvblF1ZXJ5Q291bnQgKTtcclxuXHRcdFx0cmVuZGVyQ29udGV4dERhdGEub2NjbHVzaW9uUXVlcnlPYmplY3RzID0gbmV3IEFycmF5KCBvY2NsdXNpb25RdWVyeUNvdW50ICk7XHJcblx0XHRcdHJlbmRlckNvbnRleHREYXRhLm9jY2x1c2lvblF1ZXJ5SW5kZXggPSAwO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyBleGVjdXRlZCBhdCB0aGUgZW5kIG9mIGEgcmVuZGVyIGNhbGwgYW5kIGZpbmFsaXplcyB3b3JrXHJcblx0ICogYWZ0ZXIgZHJhdyBjYWxscy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyQ29udGV4dH0gcmVuZGVyQ29udGV4dCAtIFRoZSByZW5kZXIgY29udGV4dC5cclxuXHQgKi9cclxuXHRmaW5pc2hSZW5kZXIoIHJlbmRlckNvbnRleHQgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBnbCwgc3RhdGUgfSA9IHRoaXM7XHJcblx0XHRjb25zdCByZW5kZXJDb250ZXh0RGF0YSA9IHRoaXMuZ2V0KCByZW5kZXJDb250ZXh0ICk7XHJcblx0XHRjb25zdCBwcmV2aW91c0NvbnRleHQgPSByZW5kZXJDb250ZXh0RGF0YS5wcmV2aW91c0NvbnRleHQ7XHJcblxyXG5cdFx0c3RhdGUucmVzZXRWZXJ0ZXhTdGF0ZSgpO1xyXG5cclxuXHRcdGNvbnN0IG9jY2x1c2lvblF1ZXJ5Q291bnQgPSByZW5kZXJDb250ZXh0Lm9jY2x1c2lvblF1ZXJ5Q291bnQ7XHJcblxyXG5cdFx0aWYgKCBvY2NsdXNpb25RdWVyeUNvdW50ID4gMCApIHtcclxuXHJcblx0XHRcdGlmICggb2NjbHVzaW9uUXVlcnlDb3VudCA+IHJlbmRlckNvbnRleHREYXRhLm9jY2x1c2lvblF1ZXJ5SW5kZXggKSB7XHJcblxyXG5cdFx0XHRcdGdsLmVuZFF1ZXJ5KCBnbC5BTllfU0FNUExFU19QQVNTRUQgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMucmVzb2x2ZU9jY2x1ZGVkQXN5bmMoIHJlbmRlckNvbnRleHQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZXMgPSByZW5kZXJDb250ZXh0LnRleHR1cmVzO1xyXG5cclxuXHRcdGlmICggdGV4dHVyZXMgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB0ZXh0dXJlcy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHRleHR1cmUgPSB0ZXh0dXJlc1sgaSBdO1xyXG5cclxuXHRcdFx0XHRpZiAoIHRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzICkge1xyXG5cclxuXHRcdFx0XHRcdHRoaXMuZ2VuZXJhdGVNaXBtYXBzKCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5fY3VycmVudENvbnRleHQgPSBwcmV2aW91c0NvbnRleHQ7XHJcblxyXG5cdFx0aWYgKCByZW5kZXJDb250ZXh0LnRleHR1cmVzICE9PSBudWxsICYmIHJlbmRlckNvbnRleHQucmVuZGVyVGFyZ2V0ICkge1xyXG5cclxuXHRcdFx0Y29uc3QgcmVuZGVyVGFyZ2V0Q29udGV4dERhdGEgPSB0aGlzLmdldCggcmVuZGVyQ29udGV4dC5yZW5kZXJUYXJnZXQgKTtcclxuXHJcblx0XHRcdGNvbnN0IHsgc2FtcGxlcyB9ID0gcmVuZGVyQ29udGV4dC5yZW5kZXJUYXJnZXQ7XHJcblxyXG5cdFx0XHRpZiAoIHNhbXBsZXMgPiAwICYmIHRoaXMuX3VzZU11bHRpc2FtcGxlZFJUVCggcmVuZGVyQ29udGV4dC5yZW5kZXJUYXJnZXQgKSA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGZiID0gcmVuZGVyVGFyZ2V0Q29udGV4dERhdGEuZnJhbWVidWZmZXJzWyByZW5kZXJDb250ZXh0LmdldENhY2hlS2V5KCkgXTtcclxuXHJcblx0XHRcdFx0Y29uc3QgbWFzayA9IGdsLkNPTE9SX0JVRkZFUl9CSVQ7XHJcblxyXG5cdFx0XHRcdGNvbnN0IG1zYWFGcmFtZUJ1ZmZlciA9IHJlbmRlclRhcmdldENvbnRleHREYXRhLm1zYWFGcmFtZUJ1ZmZlcjtcclxuXHJcblx0XHRcdFx0Y29uc3QgdGV4dHVyZXMgPSByZW5kZXJDb250ZXh0LnRleHR1cmVzO1xyXG5cclxuXHRcdFx0XHRzdGF0ZS5iaW5kRnJhbWVidWZmZXIoIGdsLlJFQURfRlJBTUVCVUZGRVIsIG1zYWFGcmFtZUJ1ZmZlciApO1xyXG5cdFx0XHRcdHN0YXRlLmJpbmRGcmFtZWJ1ZmZlciggZ2wuRFJBV19GUkFNRUJVRkZFUiwgZmIgKTtcclxuXHJcblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdGV4dHVyZXMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdC8vIFRPRE8gQWRkIHN1cHBvcnQgZm9yIE1SVFxyXG5cclxuXHRcdFx0XHRcdGlmICggcmVuZGVyQ29udGV4dC5zY2lzc29yICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgeyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH0gPSByZW5kZXJDb250ZXh0LnNjaXNzb3JWYWx1ZTtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnN0IHZpZXdZID0gcmVuZGVyQ29udGV4dC5oZWlnaHQgLSBoZWlnaHQgLSB5O1xyXG5cclxuXHRcdFx0XHRcdFx0Z2wuYmxpdEZyYW1lYnVmZmVyKCB4LCB2aWV3WSwgeCArIHdpZHRoLCB2aWV3WSArIGhlaWdodCwgeCwgdmlld1ksIHggKyB3aWR0aCwgdmlld1kgKyBoZWlnaHQsIG1hc2ssIGdsLk5FQVJFU1QgKTtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggdGhpcy5fc3VwcG9ydHNJbnZhbGlkYXRlRnJhbWVidWZmZXIgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGdsLmludmFsaWRhdGVTdWJGcmFtZWJ1ZmZlciggZ2wuUkVBRF9GUkFNRUJVRkZFUiwgcmVuZGVyVGFyZ2V0Q29udGV4dERhdGEuaW52YWxpZGF0aW9uQXJyYXksIHgsIHZpZXdZLCB3aWR0aCwgaGVpZ2h0ICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdGdsLmJsaXRGcmFtZWJ1ZmZlciggMCwgMCwgcmVuZGVyQ29udGV4dC53aWR0aCwgcmVuZGVyQ29udGV4dC5oZWlnaHQsIDAsIDAsIHJlbmRlckNvbnRleHQud2lkdGgsIHJlbmRlckNvbnRleHQuaGVpZ2h0LCBtYXNrLCBnbC5ORUFSRVNUICk7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIHRoaXMuX3N1cHBvcnRzSW52YWxpZGF0ZUZyYW1lYnVmZmVyID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRnbC5pbnZhbGlkYXRlRnJhbWVidWZmZXIoIGdsLlJFQURfRlJBTUVCVUZGRVIsIHJlbmRlclRhcmdldENvbnRleHREYXRhLmludmFsaWRhdGlvbkFycmF5ICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHByZXZpb3VzQ29udGV4dCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHRoaXMuX3NldEZyYW1lYnVmZmVyKCBwcmV2aW91c0NvbnRleHQgKTtcclxuXHJcblx0XHRcdGlmICggcHJldmlvdXNDb250ZXh0LnZpZXdwb3J0ICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLnVwZGF0ZVZpZXdwb3J0KCBwcmV2aW91c0NvbnRleHQgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHN0YXRlLnZpZXdwb3J0KCAwLCAwLCBnbC5kcmF3aW5nQnVmZmVyV2lkdGgsIGdsLmRyYXdpbmdCdWZmZXJIZWlnaHQgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5wcmVwYXJlVGltZXN0YW1wQnVmZmVyKCByZW5kZXJDb250ZXh0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgcHJvY2Vzc2VzIHRoZSByZXN1bHQgb2Ygb2NjbHVzaW9uIHF1ZXJpZXMgYW5kIHdyaXRlcyBpdFxyXG5cdCAqIGludG8gcmVuZGVyIGNvbnRleHQgZGF0YS5cclxuXHQgKlxyXG5cdCAqIEBhc3luY1xyXG5cdCAqIEBwYXJhbSB7UmVuZGVyQ29udGV4dH0gcmVuZGVyQ29udGV4dCAtIFRoZSByZW5kZXIgY29udGV4dC5cclxuXHQgKi9cclxuXHRyZXNvbHZlT2NjbHVkZWRBc3luYyggcmVuZGVyQ29udGV4dCApIHtcclxuXHJcblx0XHRjb25zdCByZW5kZXJDb250ZXh0RGF0YSA9IHRoaXMuZ2V0KCByZW5kZXJDb250ZXh0ICk7XHJcblxyXG5cdFx0Ly8gaGFuZGxlIG9jY2x1c2lvbiBxdWVyeSByZXN1bHRzXHJcblxyXG5cdFx0Y29uc3QgeyBjdXJyZW50T2NjbHVzaW9uUXVlcmllcywgY3VycmVudE9jY2x1c2lvblF1ZXJ5T2JqZWN0cyB9ID0gcmVuZGVyQ29udGV4dERhdGE7XHJcblxyXG5cdFx0aWYgKCBjdXJyZW50T2NjbHVzaW9uUXVlcmllcyAmJiBjdXJyZW50T2NjbHVzaW9uUXVlcnlPYmplY3RzICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgb2NjbHVkZWQgPSBuZXcgV2Vha1NldCgpO1xyXG5cdFx0XHRjb25zdCB7IGdsIH0gPSB0aGlzO1xyXG5cclxuXHRcdFx0cmVuZGVyQ29udGV4dERhdGEuY3VycmVudE9jY2x1c2lvblF1ZXJ5T2JqZWN0cyA9IG51bGw7XHJcblx0XHRcdHJlbmRlckNvbnRleHREYXRhLmN1cnJlbnRPY2NsdXNpb25RdWVyaWVzID0gbnVsbDtcclxuXHJcblx0XHRcdGNvbnN0IGNoZWNrID0gKCkgPT4ge1xyXG5cclxuXHRcdFx0XHRsZXQgY29tcGxldGVkID0gMDtcclxuXHJcblx0XHRcdFx0Ly8gY2hlY2sgYWxsIHF1ZXJpZXMgYW5kIHJlcXVldWUgYXMgYXBwcm9wcmlhdGVcclxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBjdXJyZW50T2NjbHVzaW9uUXVlcmllcy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgcXVlcnkgPSBjdXJyZW50T2NjbHVzaW9uUXVlcmllc1sgaSBdO1xyXG5cclxuXHRcdFx0XHRcdGlmICggcXVlcnkgPT09IG51bGwgKSBjb250aW51ZTtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGdsLmdldFF1ZXJ5UGFyYW1ldGVyKCBxdWVyeSwgZ2wuUVVFUllfUkVTVUxUX0FWQUlMQUJMRSApICkge1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCBnbC5nZXRRdWVyeVBhcmFtZXRlciggcXVlcnksIGdsLlFVRVJZX1JFU1VMVCApID09PSAwICkgb2NjbHVkZWQuYWRkKCBjdXJyZW50T2NjbHVzaW9uUXVlcnlPYmplY3RzWyBpIF0gKTtcclxuXHJcblx0XHRcdFx0XHRcdGN1cnJlbnRPY2NsdXNpb25RdWVyaWVzWyBpIF0gPSBudWxsO1xyXG5cdFx0XHRcdFx0XHRnbC5kZWxldGVRdWVyeSggcXVlcnkgKTtcclxuXHJcblx0XHRcdFx0XHRcdGNvbXBsZXRlZCArKztcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKCBjb21wbGV0ZWQgPCBjdXJyZW50T2NjbHVzaW9uUXVlcmllcy5sZW5ndGggKSB7XHJcblxyXG5cdFx0XHRcdFx0cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCBjaGVjayApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdHJlbmRlckNvbnRleHREYXRhLm9jY2x1ZGVkID0gb2NjbHVkZWQ7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHRjaGVjaygpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gM0Qgb2JqZWN0IGlzIGZ1bGx5IG9jY2x1ZGVkIGJ5IG90aGVyXHJcblx0ICogM0Qgb2JqZWN0cyBpbiB0aGUgc2NlbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JlbmRlckNvbnRleHR9IHJlbmRlckNvbnRleHQgLSBUaGUgcmVuZGVyIGNvbnRleHQuXHJcblx0ICogQHBhcmFtIHtPYmplY3QzRH0gb2JqZWN0IC0gVGhlIDNEIG9iamVjdCB0byB0ZXN0LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIDNEIG9iamVjdCBpcyBmdWxseSBvY2NsdWRlZCBvciBub3QuXHJcblx0ICovXHJcblx0aXNPY2NsdWRlZCggcmVuZGVyQ29udGV4dCwgb2JqZWN0ICkge1xyXG5cclxuXHRcdGNvbnN0IHJlbmRlckNvbnRleHREYXRhID0gdGhpcy5nZXQoIHJlbmRlckNvbnRleHQgKTtcclxuXHJcblx0XHRyZXR1cm4gcmVuZGVyQ29udGV4dERhdGEub2NjbHVkZWQgJiYgcmVuZGVyQ29udGV4dERhdGEub2NjbHVkZWQuaGFzKCBvYmplY3QgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoZSB2aWV3cG9ydCB3aXRoIHRoZSB2YWx1ZXMgZnJvbSB0aGUgZ2l2ZW4gcmVuZGVyIGNvbnRleHQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JlbmRlckNvbnRleHR9IHJlbmRlckNvbnRleHQgLSBUaGUgcmVuZGVyIGNvbnRleHQuXHJcblx0ICovXHJcblx0dXBkYXRlVmlld3BvcnQoIHJlbmRlckNvbnRleHQgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBzdGF0ZSB9ID0gdGhpcztcclxuXHRcdGNvbnN0IHsgeCwgeSwgd2lkdGgsIGhlaWdodCB9ID0gcmVuZGVyQ29udGV4dC52aWV3cG9ydFZhbHVlO1xyXG5cclxuXHRcdHN0YXRlLnZpZXdwb3J0KCB4LCByZW5kZXJDb250ZXh0LmhlaWdodCAtIGhlaWdodCAtIHksIHdpZHRoLCBoZWlnaHQgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWZpbmVzIHRoZSBzY2lzc29yIHRlc3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IGJvb2xlYW4gLSBXaGV0aGVyIHRoZSBzY2lzc29yIHRlc3Qgc2hvdWxkIGJlIGVuYWJsZWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdHNldFNjaXNzb3JUZXN0KCBib29sZWFuICkge1xyXG5cclxuXHRcdGNvbnN0IHN0YXRlID0gdGhpcy5zdGF0ZTtcclxuXHJcblx0XHRzdGF0ZS5zZXRTY2lzc29yVGVzdCggYm9vbGVhbiApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGNsZWFyIGNvbG9yIGFuZCBhbHBoYSBpbnRvIGEgc2luZ2xlXHJcblx0ICogY29sb3Igb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7Q29sb3I0fSBUaGUgY2xlYXIgY29sb3IuXHJcblx0ICovXHJcblx0Z2V0Q2xlYXJDb2xvcigpIHtcclxuXHJcblx0XHRjb25zdCBjbGVhckNvbG9yID0gc3VwZXIuZ2V0Q2xlYXJDb2xvcigpO1xyXG5cclxuXHRcdC8vIFNpbmNlIHRoZSBjYW52YXMgaXMgYWx3YXlzIGNyZWF0ZWQgd2l0aCBhbHBoYTogdHJ1ZSxcclxuXHRcdC8vIFdlYkdMIG11c3QgYWx3YXlzIHByZW11bHRpcGx5IHRoZSBjbGVhciBjb2xvci5cclxuXHJcblx0XHRjbGVhckNvbG9yLnIgKj0gY2xlYXJDb2xvci5hO1xyXG5cdFx0Y2xlYXJDb2xvci5nICo9IGNsZWFyQ29sb3IuYTtcclxuXHRcdGNsZWFyQ29sb3IuYiAqPSBjbGVhckNvbG9yLmE7XHJcblxyXG5cdFx0cmV0dXJuIGNsZWFyQ29sb3I7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUGVyZm9ybXMgYSBjbGVhciBvcGVyYXRpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IGNvbG9yIC0gV2hldGhlciB0aGUgY29sb3IgYnVmZmVyIHNob3VsZCBiZSBjbGVhcmVkIG9yIG5vdC5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IGRlcHRoIC0gV2hldGhlciB0aGUgZGVwdGggYnVmZmVyIHNob3VsZCBiZSBjbGVhcmVkIG9yIG5vdC5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IHN0ZW5jaWwgLSBXaGV0aGVyIHRoZSBzdGVuY2lsIGJ1ZmZlciBzaG91bGQgYmUgY2xlYXJlZCBvciBub3QuXHJcblx0ICogQHBhcmFtIHs/T2JqZWN0fSBbZGVzY3JpcHRvcj1udWxsXSAtIFRoZSByZW5kZXIgY29udGV4dCBvZiB0aGUgY3VycmVudCBzZXQgcmVuZGVyIHRhcmdldC5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtzZXRGcmFtZUJ1ZmZlcj10cnVlXSAtIFRPRE8uXHJcblx0ICovXHJcblx0Y2xlYXIoIGNvbG9yLCBkZXB0aCwgc3RlbmNpbCwgZGVzY3JpcHRvciA9IG51bGwsIHNldEZyYW1lQnVmZmVyID0gdHJ1ZSApIHtcclxuXHJcblx0XHRjb25zdCB7IGdsLCByZW5kZXJlciB9ID0gdGhpcztcclxuXHJcblx0XHRpZiAoIGRlc2NyaXB0b3IgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBjbGVhckNvbG9yID0gdGhpcy5nZXRDbGVhckNvbG9yKCk7XHJcblxyXG5cdFx0XHRkZXNjcmlwdG9yID0ge1xyXG5cdFx0XHRcdHRleHR1cmVzOiBudWxsLFxyXG5cdFx0XHRcdGNsZWFyQ29sb3JWYWx1ZTogY2xlYXJDb2xvclxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGxldCBjbGVhciA9IDA7XHJcblxyXG5cdFx0aWYgKCBjb2xvciApIGNsZWFyIHw9IGdsLkNPTE9SX0JVRkZFUl9CSVQ7XHJcblx0XHRpZiAoIGRlcHRoICkgY2xlYXIgfD0gZ2wuREVQVEhfQlVGRkVSX0JJVDtcclxuXHRcdGlmICggc3RlbmNpbCApIGNsZWFyIHw9IGdsLlNURU5DSUxfQlVGRkVSX0JJVDtcclxuXHJcblx0XHRpZiAoIGNsZWFyICE9PSAwICkge1xyXG5cclxuXHRcdFx0bGV0IGNsZWFyQ29sb3I7XHJcblxyXG5cdFx0XHRpZiAoIGRlc2NyaXB0b3IuY2xlYXJDb2xvclZhbHVlICkge1xyXG5cclxuXHRcdFx0XHRjbGVhckNvbG9yID0gZGVzY3JpcHRvci5jbGVhckNvbG9yVmFsdWU7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRjbGVhckNvbG9yID0gdGhpcy5nZXRDbGVhckNvbG9yKCk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBjbGVhckRlcHRoID0gcmVuZGVyZXIuZ2V0Q2xlYXJEZXB0aCgpO1xyXG5cdFx0XHRjb25zdCBjbGVhclN0ZW5jaWwgPSByZW5kZXJlci5nZXRDbGVhclN0ZW5jaWwoKTtcclxuXHJcblx0XHRcdGlmICggZGVwdGggKSB0aGlzLnN0YXRlLnNldERlcHRoTWFzayggdHJ1ZSApO1xyXG5cclxuXHRcdFx0aWYgKCBkZXNjcmlwdG9yLnRleHR1cmVzID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRnbC5jbGVhckNvbG9yKCBjbGVhckNvbG9yLnIsIGNsZWFyQ29sb3IuZywgY2xlYXJDb2xvci5iLCBjbGVhckNvbG9yLmEgKTtcclxuXHRcdFx0XHRnbC5jbGVhciggY2xlYXIgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGlmICggc2V0RnJhbWVCdWZmZXIgKSB0aGlzLl9zZXRGcmFtZWJ1ZmZlciggZGVzY3JpcHRvciApO1xyXG5cclxuXHRcdFx0XHRpZiAoIGNvbG9yICkge1xyXG5cclxuXHRcdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGRlc2NyaXB0b3IudGV4dHVyZXMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCBpID09PSAwICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRnbC5jbGVhckJ1ZmZlcmZ2KCBnbC5DT0xPUiwgaSwgWyBjbGVhckNvbG9yLnIsIGNsZWFyQ29sb3IuZywgY2xlYXJDb2xvci5iLCBjbGVhckNvbG9yLmEgXSApO1xyXG5cclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0Z2wuY2xlYXJCdWZmZXJmdiggZ2wuQ09MT1IsIGksIFsgMCwgMCwgMCwgMSBdICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICggZGVwdGggJiYgc3RlbmNpbCApIHtcclxuXHJcblx0XHRcdFx0XHRnbC5jbGVhckJ1ZmZlcmZpKCBnbC5ERVBUSF9TVEVOQ0lMLCAwLCBjbGVhckRlcHRoLCBjbGVhclN0ZW5jaWwgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggZGVwdGggKSB7XHJcblxyXG5cdFx0XHRcdFx0Z2wuY2xlYXJCdWZmZXJmdiggZ2wuREVQVEgsIDAsIFsgY2xlYXJEZXB0aCBdICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIHN0ZW5jaWwgKSB7XHJcblxyXG5cdFx0XHRcdFx0Z2wuY2xlYXJCdWZmZXJpdiggZ2wuU1RFTkNJTCwgMCwgWyBjbGVhclN0ZW5jaWwgXSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGlzIGV4ZWN1dGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBjb21wdXRlIGNhbGwgYW5kXHJcblx0ICogcHJlcGFyZXMgdGhlIHN0YXRlIGZvciB1cGNvbWluZyBjb21wdXRlIHRhc2tzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlfEFycmF5PE5vZGU+fSBjb21wdXRlR3JvdXAgLSBUaGUgY29tcHV0ZSBub2RlKHMpLlxyXG5cdCAqL1xyXG5cdGJlZ2luQ29tcHV0ZSggY29tcHV0ZUdyb3VwICkge1xyXG5cclxuXHRcdGNvbnN0IHsgc3RhdGUsIGdsIH0gPSB0aGlzO1xyXG5cclxuXHRcdHN0YXRlLmJpbmRGcmFtZWJ1ZmZlciggZ2wuRlJBTUVCVUZGRVIsIG51bGwgKTtcclxuXHRcdHRoaXMuaW5pdFRpbWVzdGFtcFF1ZXJ5KCBjb21wdXRlR3JvdXAgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFeGVjdXRlcyBhIGNvbXB1dGUgY29tbWFuZCBmb3IgdGhlIGdpdmVuIGNvbXB1dGUgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZXxBcnJheTxOb2RlPn0gY29tcHV0ZUdyb3VwIC0gVGhlIGdyb3VwIG9mIGNvbXB1dGUgbm9kZXMgb2YgYSBjb21wdXRlIGNhbGwuIENhbiBiZSBhIHNpbmdsZSBjb21wdXRlIG5vZGUuXHJcblx0ICogQHBhcmFtIHtOb2RlfSBjb21wdXRlTm9kZSAtIFRoZSBjb21wdXRlIG5vZGUuXHJcblx0ICogQHBhcmFtIHtBcnJheTxCaW5kR3JvdXA+fSBiaW5kaW5ncyAtIFRoZSBiaW5kaW5ncy5cclxuXHQgKiBAcGFyYW0ge0NvbXB1dGVQaXBlbGluZX0gcGlwZWxpbmUgLSBUaGUgY29tcHV0ZSBwaXBlbGluZS5cclxuXHQgKi9cclxuXHRjb21wdXRlKCBjb21wdXRlR3JvdXAsIGNvbXB1dGVOb2RlLCBiaW5kaW5ncywgcGlwZWxpbmUgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBzdGF0ZSwgZ2wgfSA9IHRoaXM7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmRpc2NhcmQgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0Ly8gcmVxdWlyZWQgaGVyZSB0byBoYW5kbGUgYXN5bmMgYmVoYXZpb3VyIG9mIHJlbmRlci5jb21wdXRlKClcclxuXHRcdFx0Z2wuZW5hYmxlKCBnbC5SQVNURVJJWkVSX0RJU0NBUkQgKTtcclxuXHRcdFx0dGhpcy5kaXNjYXJkID0gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgeyBwcm9ncmFtR1BVLCB0cmFuc2Zvcm1CdWZmZXJzLCBhdHRyaWJ1dGVzIH0gPSB0aGlzLmdldCggcGlwZWxpbmUgKTtcclxuXHJcblx0XHRjb25zdCB2YW9LZXkgPSB0aGlzLl9nZXRWYW9LZXkoIGF0dHJpYnV0ZXMgKTtcclxuXHJcblx0XHRjb25zdCB2YW9HUFUgPSB0aGlzLnZhb0NhY2hlWyB2YW9LZXkgXTtcclxuXHJcblx0XHRpZiAoIHZhb0dQVSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0dGhpcy5fY3JlYXRlVmFvKCBhdHRyaWJ1dGVzICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHN0YXRlLnNldFZlcnRleFN0YXRlKCB2YW9HUFUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0c3RhdGUudXNlUHJvZ3JhbSggcHJvZ3JhbUdQVSApO1xyXG5cclxuXHRcdHRoaXMuX2JpbmRVbmlmb3JtcyggYmluZGluZ3MgKTtcclxuXHJcblx0XHRjb25zdCB0cmFuc2Zvcm1GZWVkYmFja0dQVSA9IHRoaXMuX2dldFRyYW5zZm9ybUZlZWRiYWNrKCB0cmFuc2Zvcm1CdWZmZXJzICk7XHJcblxyXG5cdFx0Z2wuYmluZFRyYW5zZm9ybUZlZWRiYWNrKCBnbC5UUkFOU0ZPUk1fRkVFREJBQ0ssIHRyYW5zZm9ybUZlZWRiYWNrR1BVICk7XHJcblx0XHRnbC5iZWdpblRyYW5zZm9ybUZlZWRiYWNrKCBnbC5QT0lOVFMgKTtcclxuXHJcblx0XHRpZiAoIGF0dHJpYnV0ZXNbIDAgXS5pc1N0b3JhZ2VJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUgKSB7XHJcblxyXG5cdFx0XHRnbC5kcmF3QXJyYXlzSW5zdGFuY2VkKCBnbC5QT0lOVFMsIDAsIDEsIGNvbXB1dGVOb2RlLmNvdW50ICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGdsLmRyYXdBcnJheXMoIGdsLlBPSU5UUywgMCwgY29tcHV0ZU5vZGUuY291bnQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Z2wuZW5kVHJhbnNmb3JtRmVlZGJhY2soKTtcclxuXHRcdGdsLmJpbmRUcmFuc2Zvcm1GZWVkYmFjayggZ2wuVFJBTlNGT1JNX0ZFRURCQUNLLCBudWxsICk7XHJcblxyXG5cdFx0Ly8gc3dpdGNoIGFjdGl2ZSBidWZmZXJzXHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdHJhbnNmb3JtQnVmZmVycy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBkdWFsQXR0cmlidXRlRGF0YSA9IHRyYW5zZm9ybUJ1ZmZlcnNbIGkgXTtcclxuXHJcblx0XHRcdGlmICggZHVhbEF0dHJpYnV0ZURhdGEucGJvICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLnRleHR1cmVVdGlscy5jb3B5QnVmZmVyVG9UZXh0dXJlKCBkdWFsQXR0cmlidXRlRGF0YS50cmFuc2Zvcm1CdWZmZXIsIGR1YWxBdHRyaWJ1dGVEYXRhLnBibyApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZHVhbEF0dHJpYnV0ZURhdGEuc3dpdGNoQnVmZmVycygpO1xyXG5cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgaXMgZXhlY3V0ZWQgYXQgdGhlIGVuZCBvZiBhIGNvbXB1dGUgY2FsbCBhbmRcclxuXHQgKiBmaW5hbGl6ZXMgd29yayBhZnRlciBjb21wdXRlIHRhc2tzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlfEFycmF5PE5vZGU+fSBjb21wdXRlR3JvdXAgLSBUaGUgY29tcHV0ZSBub2RlKHMpLlxyXG5cdCAqL1xyXG5cdGZpbmlzaENvbXB1dGUoIGNvbXB1dGVHcm91cCApIHtcclxuXHJcblx0XHRjb25zdCBnbCA9IHRoaXMuZ2w7XHJcblxyXG5cdFx0dGhpcy5kaXNjYXJkID0gZmFsc2U7XHJcblxyXG5cdFx0Z2wuZGlzYWJsZSggZ2wuUkFTVEVSSVpFUl9ESVNDQVJEICk7XHJcblxyXG5cdFx0dGhpcy5wcmVwYXJlVGltZXN0YW1wQnVmZmVyKCBjb21wdXRlR3JvdXAgKTtcclxuXHJcblx0XHRpZiAoIHRoaXMuX2N1cnJlbnRDb250ZXh0ICkge1xyXG5cclxuXHRcdFx0dGhpcy5fc2V0RnJhbWVidWZmZXIoIHRoaXMuX2N1cnJlbnRDb250ZXh0ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEV4ZWN1dGVzIGEgZHJhdyBjb21tYW5kIGZvciB0aGUgZ2l2ZW4gcmVuZGVyIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyT2JqZWN0fSByZW5kZXJPYmplY3QgLSBUaGUgcmVuZGVyIG9iamVjdCB0byBkcmF3LlxyXG5cdCAqIEBwYXJhbSB7SW5mb30gaW5mbyAtIEhvbGRzIGEgc2VyaWVzIG9mIHN0YXRpc3RpY2FsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBHUFUgbWVtb3J5IGFuZCB0aGUgcmVuZGVyaW5nIHByb2Nlc3MuXHJcblx0ICovXHJcblx0ZHJhdyggcmVuZGVyT2JqZWN0LyosIGluZm8qLyApIHtcclxuXHJcblx0XHRjb25zdCB7IG9iamVjdCwgcGlwZWxpbmUsIG1hdGVyaWFsLCBjb250ZXh0LCBoYXJkd2FyZUNsaXBwaW5nUGxhbmVzIH0gPSByZW5kZXJPYmplY3Q7XHJcblx0XHRjb25zdCB7IHByb2dyYW1HUFUgfSA9IHRoaXMuZ2V0KCBwaXBlbGluZSApO1xyXG5cclxuXHRcdGNvbnN0IHsgZ2wsIHN0YXRlIH0gPSB0aGlzO1xyXG5cclxuXHRcdGNvbnN0IGNvbnRleHREYXRhID0gdGhpcy5nZXQoIGNvbnRleHQgKTtcclxuXHJcblx0XHRjb25zdCBkcmF3UGFyYW1zID0gcmVuZGVyT2JqZWN0LmdldERyYXdQYXJhbWV0ZXJzKCk7XHJcblxyXG5cdFx0aWYgKCBkcmF3UGFyYW1zID09PSBudWxsICkgcmV0dXJuO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0dGhpcy5fYmluZFVuaWZvcm1zKCByZW5kZXJPYmplY3QuZ2V0QmluZGluZ3MoKSApO1xyXG5cclxuXHRcdGNvbnN0IGZyb250RmFjZUNXID0gKCBvYmplY3QuaXNNZXNoICYmIG9iamVjdC5tYXRyaXhXb3JsZC5kZXRlcm1pbmFudCgpIDwgMCApO1xyXG5cclxuXHRcdHN0YXRlLnNldE1hdGVyaWFsKCBtYXRlcmlhbCwgZnJvbnRGYWNlQ1csIGhhcmR3YXJlQ2xpcHBpbmdQbGFuZXMgKTtcclxuXHJcblx0XHRzdGF0ZS51c2VQcm9ncmFtKCBwcm9ncmFtR1BVICk7XHJcblxyXG5cdFx0Ly8gdmVydGV4IHN0YXRlXHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyT2JqZWN0RGF0YSA9IHRoaXMuZ2V0KCByZW5kZXJPYmplY3QgKTtcclxuXHJcblx0XHRsZXQgdmFvR1BVID0gcmVuZGVyT2JqZWN0RGF0YS5zdGF0aWNWYW87XHJcblxyXG5cdFx0aWYgKCB2YW9HUFUgPT09IHVuZGVmaW5lZCB8fCByZW5kZXJPYmplY3REYXRhLmdlb21ldHJ5SWQgIT09IHJlbmRlck9iamVjdC5nZW9tZXRyeS5pZCApIHtcclxuXHJcblx0XHRcdGNvbnN0IHZhb0tleSA9IHRoaXMuX2dldFZhb0tleSggcmVuZGVyT2JqZWN0LmdldEF0dHJpYnV0ZXMoKSApO1xyXG5cclxuXHRcdFx0dmFvR1BVID0gdGhpcy52YW9DYWNoZVsgdmFvS2V5IF07XHJcblxyXG5cdFx0XHRpZiAoIHZhb0dQVSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRsZXQgc3RhdGljVmFvO1xyXG5cclxuXHRcdFx0XHQoIHsgdmFvR1BVLCBzdGF0aWNWYW8gfSA9IHRoaXMuX2NyZWF0ZVZhbyggcmVuZGVyT2JqZWN0LmdldEF0dHJpYnV0ZXMoKSApICk7XHJcblxyXG5cdFx0XHRcdGlmICggc3RhdGljVmFvICkge1xyXG5cclxuXHRcdFx0XHRcdHJlbmRlck9iamVjdERhdGEuc3RhdGljVmFvID0gdmFvR1BVO1xyXG5cdFx0XHRcdFx0cmVuZGVyT2JqZWN0RGF0YS5nZW9tZXRyeUlkID0gcmVuZGVyT2JqZWN0Lmdlb21ldHJ5LmlkO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGluZGV4ID0gcmVuZGVyT2JqZWN0LmdldEluZGV4KCk7XHJcblx0XHRjb25zdCBpbmRleEdQVSA9ICggaW5kZXggIT09IG51bGwgKSA/IHRoaXMuZ2V0KCBpbmRleCApLmJ1ZmZlckdQVSA6IG51bGw7XHJcblxyXG5cdFx0c3RhdGUuc2V0VmVydGV4U3RhdGUoIHZhb0dQVSwgaW5kZXhHUFUgKTtcclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGNvbnN0IGxhc3RPYmplY3QgPSBjb250ZXh0RGF0YS5sYXN0T2NjbHVzaW9uT2JqZWN0O1xyXG5cclxuXHRcdGlmICggbGFzdE9iamVjdCAhPT0gb2JqZWN0ICYmIGxhc3RPYmplY3QgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGlmICggbGFzdE9iamVjdCAhPT0gbnVsbCAmJiBsYXN0T2JqZWN0Lm9jY2x1c2lvblRlc3QgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdGdsLmVuZFF1ZXJ5KCBnbC5BTllfU0FNUExFU19QQVNTRUQgKTtcclxuXHJcblx0XHRcdFx0Y29udGV4dERhdGEub2NjbHVzaW9uUXVlcnlJbmRleCArKztcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggb2JqZWN0Lm9jY2x1c2lvblRlc3QgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHF1ZXJ5ID0gZ2wuY3JlYXRlUXVlcnkoKTtcclxuXHJcblx0XHRcdFx0Z2wuYmVnaW5RdWVyeSggZ2wuQU5ZX1NBTVBMRVNfUEFTU0VELCBxdWVyeSApO1xyXG5cclxuXHRcdFx0XHRjb250ZXh0RGF0YS5vY2NsdXNpb25RdWVyaWVzWyBjb250ZXh0RGF0YS5vY2NsdXNpb25RdWVyeUluZGV4IF0gPSBxdWVyeTtcclxuXHRcdFx0XHRjb250ZXh0RGF0YS5vY2NsdXNpb25RdWVyeU9iamVjdHNbIGNvbnRleHREYXRhLm9jY2x1c2lvblF1ZXJ5SW5kZXggXSA9IG9iamVjdDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnRleHREYXRhLmxhc3RPY2NsdXNpb25PYmplY3QgPSBvYmplY3Q7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vXHJcblx0XHRjb25zdCByZW5kZXJlciA9IHRoaXMuYnVmZmVyUmVuZGVyZXI7XHJcblxyXG5cdFx0aWYgKCBvYmplY3QuaXNQb2ludHMgKSByZW5kZXJlci5tb2RlID0gZ2wuUE9JTlRTO1xyXG5cdFx0ZWxzZSBpZiAoIG9iamVjdC5pc0xpbmVTZWdtZW50cyApIHJlbmRlcmVyLm1vZGUgPSBnbC5MSU5FUztcclxuXHRcdGVsc2UgaWYgKCBvYmplY3QuaXNMaW5lICkgcmVuZGVyZXIubW9kZSA9IGdsLkxJTkVfU1RSSVA7XHJcblx0XHRlbHNlIGlmICggb2JqZWN0LmlzTGluZUxvb3AgKSByZW5kZXJlci5tb2RlID0gZ2wuTElORV9MT09QO1xyXG5cdFx0ZWxzZSB7XHJcblxyXG5cdFx0XHRpZiAoIG1hdGVyaWFsLndpcmVmcmFtZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0c3RhdGUuc2V0TGluZVdpZHRoKCBtYXRlcmlhbC53aXJlZnJhbWVMaW5ld2lkdGggKiB0aGlzLnJlbmRlcmVyLmdldFBpeGVsUmF0aW8oKSApO1xyXG5cdFx0XHRcdHJlbmRlcmVyLm1vZGUgPSBnbC5MSU5FUztcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHJlbmRlcmVyLm1vZGUgPSBnbC5UUklBTkdMRVM7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0Y29uc3QgeyB2ZXJ0ZXhDb3VudCwgaW5zdGFuY2VDb3VudCB9ID0gZHJhd1BhcmFtcztcclxuXHRcdGxldCB7IGZpcnN0VmVydGV4IH0gPSBkcmF3UGFyYW1zO1xyXG5cclxuXHRcdHJlbmRlcmVyLm9iamVjdCA9IG9iamVjdDtcclxuXHJcblx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0Zmlyc3RWZXJ0ZXggKj0gaW5kZXguYXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7XHJcblxyXG5cdFx0XHRjb25zdCBpbmRleERhdGEgPSB0aGlzLmdldCggaW5kZXggKTtcclxuXHJcblx0XHRcdHJlbmRlcmVyLmluZGV4ID0gaW5kZXguY291bnQ7XHJcblx0XHRcdHJlbmRlcmVyLnR5cGUgPSBpbmRleERhdGEudHlwZTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0cmVuZGVyZXIuaW5kZXggPSAwO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBkcmF3ID0gKCkgPT4ge1xyXG5cclxuXHRcdFx0aWYgKCBvYmplY3QuaXNCYXRjaGVkTWVzaCApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBvYmplY3QuX211bHRpRHJhd0luc3RhbmNlcyAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHQvLyBAZGVwcmVjYXRlZCwgcjE3NFxyXG5cdFx0XHRcdFx0d2Fybk9uY2UoICdUSFJFRS5XZWJHTEJhY2tlbmQ6IHJlbmRlck11bHRpRHJhd0luc3RhbmNlcyBoYXMgYmVlbiBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gcjE4NC4gQXBwZW5kIHRvIHJlbmRlck11bHRpRHJhdyBhcmd1bWVudHMgYW5kIHVzZSBpbmRpcmVjdGlvbi4nICk7XHJcblx0XHRcdFx0XHRyZW5kZXJlci5yZW5kZXJNdWx0aURyYXdJbnN0YW5jZXMoIG9iamVjdC5fbXVsdGlEcmF3U3RhcnRzLCBvYmplY3QuX211bHRpRHJhd0NvdW50cywgb2JqZWN0Ll9tdWx0aURyYXdDb3VudCwgb2JqZWN0Ll9tdWx0aURyYXdJbnN0YW5jZXMgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggISB0aGlzLmhhc0ZlYXR1cmUoICdXRUJHTF9tdWx0aV9kcmF3JyApICkge1xyXG5cclxuXHRcdFx0XHRcdHdhcm5PbmNlKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogV0VCR0xfbXVsdGlfZHJhdyBub3Qgc3VwcG9ydGVkLicgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRyZW5kZXJlci5yZW5kZXJNdWx0aURyYXcoIG9iamVjdC5fbXVsdGlEcmF3U3RhcnRzLCBvYmplY3QuX211bHRpRHJhd0NvdW50cywgb2JqZWN0Ll9tdWx0aURyYXdDb3VudCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBpbnN0YW5jZUNvdW50ID4gMSApIHtcclxuXHJcblx0XHRcdFx0cmVuZGVyZXIucmVuZGVySW5zdGFuY2VzKCBmaXJzdFZlcnRleCwgdmVydGV4Q291bnQsIGluc3RhbmNlQ291bnQgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHJlbmRlcmVyLnJlbmRlciggZmlyc3RWZXJ0ZXgsIHZlcnRleENvdW50ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHRpZiAoIHJlbmRlck9iamVjdC5jYW1lcmEuaXNBcnJheUNhbWVyYSAmJiByZW5kZXJPYmplY3QuY2FtZXJhLmNhbWVyYXMubGVuZ3RoID4gMCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGNhbWVyYURhdGEgPSB0aGlzLmdldCggcmVuZGVyT2JqZWN0LmNhbWVyYSApO1xyXG5cdFx0XHRjb25zdCBjYW1lcmFzID0gcmVuZGVyT2JqZWN0LmNhbWVyYS5jYW1lcmFzO1xyXG5cdFx0XHRjb25zdCBjYW1lcmFJbmRleCA9IHJlbmRlck9iamVjdC5nZXRCaW5kaW5nR3JvdXAoICdjYW1lcmFJbmRleCcgKS5iaW5kaW5nc1sgMCBdO1xyXG5cclxuXHRcdFx0aWYgKCBjYW1lcmFEYXRhLmluZGV4ZXNHUFUgPT09IHVuZGVmaW5lZCB8fCBjYW1lcmFEYXRhLmluZGV4ZXNHUFUubGVuZ3RoICE9PSBjYW1lcmFzLmxlbmd0aCApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgZGF0YSA9IG5ldyBVaW50MzJBcnJheSggWyAwLCAwLCAwLCAwIF0gKTtcclxuXHRcdFx0XHRjb25zdCBpbmRleGVzR1BVID0gW107XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMCwgbGVuID0gY2FtZXJhcy5sZW5ndGg7IGkgPCBsZW47IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgYnVmZmVyR1BVID0gZ2wuY3JlYXRlQnVmZmVyKCk7XHJcblxyXG5cdFx0XHRcdFx0ZGF0YVsgMCBdID0gaTtcclxuXHJcblx0XHRcdFx0XHRnbC5iaW5kQnVmZmVyKCBnbC5VTklGT1JNX0JVRkZFUiwgYnVmZmVyR1BVICk7XHJcblx0XHRcdFx0XHRnbC5idWZmZXJEYXRhKCBnbC5VTklGT1JNX0JVRkZFUiwgZGF0YSwgZ2wuU1RBVElDX0RSQVcgKTtcclxuXHJcblx0XHRcdFx0XHRpbmRleGVzR1BVLnB1c2goIGJ1ZmZlckdQVSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGNhbWVyYURhdGEuaW5kZXhlc0dQVSA9IGluZGV4ZXNHUFU7IC8vIFRPRE86IENyZWF0ZSBhIGdsb2JhbCBsaWJyYXJ5IGZvciB0aGlzXHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBjYW1lcmFJbmRleERhdGEgPSB0aGlzLmdldCggY2FtZXJhSW5kZXggKTtcclxuXHRcdFx0Y29uc3QgcGl4ZWxSYXRpbyA9IHRoaXMucmVuZGVyZXIuZ2V0UGl4ZWxSYXRpbygpO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsZW4gPSBjYW1lcmFzLmxlbmd0aDsgaSA8IGxlbjsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3Qgc3ViQ2FtZXJhID0gY2FtZXJhc1sgaSBdO1xyXG5cclxuXHRcdFx0XHRpZiAoIG9iamVjdC5sYXllcnMudGVzdCggc3ViQ2FtZXJhLmxheWVycyApICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHZwID0gc3ViQ2FtZXJhLnZpZXdwb3J0O1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHggPSB2cC54ICogcGl4ZWxSYXRpbztcclxuXHRcdFx0XHRcdGNvbnN0IHkgPSB2cC55ICogcGl4ZWxSYXRpbztcclxuXHRcdFx0XHRcdGNvbnN0IHdpZHRoID0gdnAud2lkdGggKiBwaXhlbFJhdGlvO1xyXG5cdFx0XHRcdFx0Y29uc3QgaGVpZ2h0ID0gdnAuaGVpZ2h0ICogcGl4ZWxSYXRpbztcclxuXHJcblx0XHRcdFx0XHRzdGF0ZS52aWV3cG9ydChcclxuXHRcdFx0XHRcdFx0TWF0aC5mbG9vciggeCApLFxyXG5cdFx0XHRcdFx0XHRNYXRoLmZsb29yKCByZW5kZXJPYmplY3QuY29udGV4dC5oZWlnaHQgLSBoZWlnaHQgLSB5ICksXHJcblx0XHRcdFx0XHRcdE1hdGguZmxvb3IoIHdpZHRoICksXHJcblx0XHRcdFx0XHRcdE1hdGguZmxvb3IoIGhlaWdodCApXHJcblx0XHRcdFx0XHQpO1xyXG5cclxuXHRcdFx0XHRcdHN0YXRlLmJpbmRCdWZmZXJCYXNlKCBnbC5VTklGT1JNX0JVRkZFUiwgY2FtZXJhSW5kZXhEYXRhLmluZGV4LCBjYW1lcmFEYXRhLmluZGV4ZXNHUFVbIGkgXSApO1xyXG5cclxuXHRcdFx0XHRcdGRyYXcoKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRkcmF3KCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEV4cGxhaW4gd2h5IGFsd2F5cyBudWxsIGlzIHJldHVybmVkLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSZW5kZXJPYmplY3R9IHJlbmRlck9iamVjdCAtIFRoZSByZW5kZXIgb2JqZWN0LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHJlbmRlciBwaXBlbGluZSByZXF1aXJlcyBhbiB1cGRhdGUgb3Igbm90LlxyXG5cdCAqL1xyXG5cdG5lZWRzUmVuZGVyVXBkYXRlKCAvKnJlbmRlck9iamVjdCovICkge1xyXG5cclxuXHRcdHJldHVybiBmYWxzZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFeHBsYWluIHdoeSBubyBjYWNoZSBrZXkgaXMgY29tcHV0ZWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JlbmRlck9iamVjdH0gcmVuZGVyT2JqZWN0IC0gVGhlIHJlbmRlciBvYmplY3QuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgY2FjaGUga2V5LlxyXG5cdCAqL1xyXG5cdGdldFJlbmRlckNhY2hlS2V5KCAvKnJlbmRlck9iamVjdCovICkge1xyXG5cclxuXHRcdHJldHVybiAnJztcclxuXHJcblx0fVxyXG5cclxuXHQvLyB0ZXh0dXJlc1xyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGEgZGVmYXVsdCB0ZXh0dXJlIGZvciB0aGUgZ2l2ZW4gdGV4dHVyZSB0aGF0IGNhbiBiZSB1c2VkXHJcblx0ICogYXMgYSBwbGFjZWhvbGRlciB1bnRpbCB0aGUgYWN0dWFsIHRleHR1cmUgaXMgcmVhZHkgZm9yIHVzYWdlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUgdG8gY3JlYXRlIGEgZGVmYXVsdCB0ZXh0dXJlIGZvci5cclxuXHQgKi9cclxuXHRjcmVhdGVEZWZhdWx0VGV4dHVyZSggdGV4dHVyZSApIHtcclxuXHJcblx0XHR0aGlzLnRleHR1cmVVdGlscy5jcmVhdGVEZWZhdWx0VGV4dHVyZSggdGV4dHVyZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgYSB0ZXh0dXJlIG9uIHRoZSBHUFUgZm9yIHRoZSBnaXZlbiB0ZXh0dXJlIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlLlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIHBhcmFtZXRlci5cclxuXHQgKi9cclxuXHRjcmVhdGVUZXh0dXJlKCB0ZXh0dXJlLCBvcHRpb25zICkge1xyXG5cclxuXHRcdHRoaXMudGV4dHVyZVV0aWxzLmNyZWF0ZVRleHR1cmUoIHRleHR1cmUsIG9wdGlvbnMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGxvYWRzIHRoZSB1cGRhdGVkIHRleHR1cmUgZGF0YSB0byB0aGUgR1BVLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZVRleHR1cmUoIHRleHR1cmUsIG9wdGlvbnMgKSB7XHJcblxyXG5cdFx0dGhpcy50ZXh0dXJlVXRpbHMudXBkYXRlVGV4dHVyZSggdGV4dHVyZSwgb3B0aW9ucyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyBtaXBtYXBzIGZvciB0aGUgZ2l2ZW4gdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlLlxyXG5cdCAqL1xyXG5cdGdlbmVyYXRlTWlwbWFwcyggdGV4dHVyZSApIHtcclxuXHJcblx0XHR0aGlzLnRleHR1cmVVdGlscy5nZW5lcmF0ZU1pcG1hcHMoIHRleHR1cmUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZXN0cm95cyB0aGUgR1BVIGRhdGEgZm9yIHRoZSBnaXZlbiB0ZXh0dXJlIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlLlxyXG5cdCAqL1xyXG5cdGRlc3Ryb3lUZXh0dXJlKCB0ZXh0dXJlICkge1xyXG5cclxuXHRcdHRoaXMudGV4dHVyZVV0aWxzLmRlc3Ryb3lUZXh0dXJlKCB0ZXh0dXJlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0ZXh0dXJlIGRhdGEgYXMgYSB0eXBlZCBhcnJheS5cclxuXHQgKlxyXG5cdCAqIEBhc3luY1xyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlIHRvIGNvcHkuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBjb3B5IG9yaWdpbi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGNvcHkgb3JpZ2luLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgY29weS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgY29weS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZmFjZUluZGV4IC0gVGhlIGZhY2UgaW5kZXguXHJcblx0ICogQHJldHVybiB7UHJvbWlzZTxUeXBlZEFycmF5Pn0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCBhIHR5cGVkIGFycmF5IHdoZW4gdGhlIGNvcHkgb3BlcmF0aW9uIGhhcyBmaW5pc2hlZC5cclxuXHQgKi9cclxuXHRhc3luYyBjb3B5VGV4dHVyZVRvQnVmZmVyKCB0ZXh0dXJlLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmYWNlSW5kZXggKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMudGV4dHVyZVV0aWxzLmNvcHlUZXh0dXJlVG9CdWZmZXIoIHRleHR1cmUsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGZhY2VJbmRleCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIGRvZXMgbm90aGluZyBzaW5jZSBXZWJHTCAyIGhhcyBubyBjb25jZXB0IG9mIHNhbXBsZXJzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUgdG8gY3JlYXRlIHRoZSBzYW1wbGVyIGZvci5cclxuXHQgKi9cclxuXHRjcmVhdGVTYW1wbGVyKCAvKnRleHR1cmUqLyApIHtcclxuXHJcblx0XHQvL2NvbnNvbGUud2FybiggJ0Fic3RyYWN0IGNsYXNzLicgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcgc2luY2UgV2ViR0wgMiBoYXMgbm8gY29uY2VwdCBvZiBzYW1wbGVycy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlIHRvIGRlc3Ryb3kgdGhlIHNhbXBsZXIgZm9yLlxyXG5cdCAqL1xyXG5cdGRlc3Ryb3lTYW1wbGVyKCAvKnRleHR1cmUqLyApIHt9XHJcblxyXG5cdC8vIG5vZGUgYnVpbGRlclxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgbm9kZSBidWlsZGVyIGZvciB0aGUgZ2l2ZW4gcmVuZGVyIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyT2JqZWN0fSBvYmplY3QgLSBUaGUgcmVuZGVyIG9iamVjdC5cclxuXHQgKiBAcGFyYW0ge1JlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcmV0dXJuIHtHTFNMTm9kZUJ1aWxkZXJ9IFRoZSBub2RlIGJ1aWxkZXIuXHJcblx0ICovXHJcblx0Y3JlYXRlTm9kZUJ1aWxkZXIoIG9iamVjdCwgcmVuZGVyZXIgKSB7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBHTFNMTm9kZUJ1aWxkZXIoIG9iamVjdCwgcmVuZGVyZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvLyBwcm9ncmFtXHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgYSBzaGFkZXIgcHJvZ3JhbSBmcm9tIHRoZSBnaXZlbiBwcm9ncmFtbWFibGUgc3RhZ2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1Byb2dyYW1tYWJsZVN0YWdlfSBwcm9ncmFtIC0gVGhlIHByb2dyYW1tYWJsZSBzdGFnZS5cclxuXHQgKi9cclxuXHRjcmVhdGVQcm9ncmFtKCBwcm9ncmFtICkge1xyXG5cclxuXHRcdGNvbnN0IGdsID0gdGhpcy5nbDtcclxuXHRcdGNvbnN0IHsgc3RhZ2UsIGNvZGUgfSA9IHByb2dyYW07XHJcblxyXG5cdFx0Y29uc3Qgc2hhZGVyID0gc3RhZ2UgPT09ICdmcmFnbWVudCcgPyBnbC5jcmVhdGVTaGFkZXIoIGdsLkZSQUdNRU5UX1NIQURFUiApIDogZ2wuY3JlYXRlU2hhZGVyKCBnbC5WRVJURVhfU0hBREVSICk7XHJcblxyXG5cdFx0Z2wuc2hhZGVyU291cmNlKCBzaGFkZXIsIGNvZGUgKTtcclxuXHRcdGdsLmNvbXBpbGVTaGFkZXIoIHNoYWRlciApO1xyXG5cclxuXHRcdHRoaXMuc2V0KCBwcm9ncmFtLCB7XHJcblx0XHRcdHNoYWRlckdQVTogc2hhZGVyXHJcblx0XHR9ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVzdHJveXMgdGhlIHNoYWRlciBwcm9ncmFtIG9mIHRoZSBnaXZlbiBwcm9ncmFtbWFibGUgc3RhZ2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1Byb2dyYW1tYWJsZVN0YWdlfSBwcm9ncmFtIC0gVGhlIHByb2dyYW1tYWJsZSBzdGFnZS5cclxuXHQgKi9cclxuXHRkZXN0cm95UHJvZ3JhbSggcHJvZ3JhbSApIHtcclxuXHJcblx0XHR0aGlzLmRlbGV0ZSggcHJvZ3JhbSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgYSByZW5kZXIgcGlwZWxpbmUgZm9yIHRoZSBnaXZlbiByZW5kZXIgb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSZW5kZXJPYmplY3R9IHJlbmRlck9iamVjdCAtIFRoZSByZW5kZXIgb2JqZWN0LlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8UHJvbWlzZT59IHByb21pc2VzIC0gQW4gYXJyYXkgb2YgY29tcGlsYXRpb24gcHJvbWlzZXMgd2hpY2ggYXJlIHVzZWQgaW4gYGNvbXBpbGVBc3luYygpYC5cclxuXHQgKi9cclxuXHRjcmVhdGVSZW5kZXJQaXBlbGluZSggcmVuZGVyT2JqZWN0LCBwcm9taXNlcyApIHtcclxuXHJcblx0XHRjb25zdCBnbCA9IHRoaXMuZ2w7XHJcblx0XHRjb25zdCBwaXBlbGluZSA9IHJlbmRlck9iamVjdC5waXBlbGluZTtcclxuXHJcblx0XHQvLyBQcm9ncmFtXHJcblxyXG5cdFx0Y29uc3QgeyBmcmFnbWVudFByb2dyYW0sIHZlcnRleFByb2dyYW0gfSA9IHBpcGVsaW5lO1xyXG5cclxuXHRcdGNvbnN0IHByb2dyYW1HUFUgPSBnbC5jcmVhdGVQcm9ncmFtKCk7XHJcblxyXG5cdFx0Y29uc3QgZnJhZ21lbnRTaGFkZXIgPSB0aGlzLmdldCggZnJhZ21lbnRQcm9ncmFtICkuc2hhZGVyR1BVO1xyXG5cdFx0Y29uc3QgdmVydGV4U2hhZGVyID0gdGhpcy5nZXQoIHZlcnRleFByb2dyYW0gKS5zaGFkZXJHUFU7XHJcblxyXG5cdFx0Z2wuYXR0YWNoU2hhZGVyKCBwcm9ncmFtR1BVLCBmcmFnbWVudFNoYWRlciApO1xyXG5cdFx0Z2wuYXR0YWNoU2hhZGVyKCBwcm9ncmFtR1BVLCB2ZXJ0ZXhTaGFkZXIgKTtcclxuXHRcdGdsLmxpbmtQcm9ncmFtKCBwcm9ncmFtR1BVICk7XHJcblxyXG5cdFx0dGhpcy5zZXQoIHBpcGVsaW5lLCB7XHJcblx0XHRcdHByb2dyYW1HUFUsXHJcblx0XHRcdGZyYWdtZW50U2hhZGVyLFxyXG5cdFx0XHR2ZXJ0ZXhTaGFkZXJcclxuXHRcdH0gKTtcclxuXHJcblx0XHRpZiAoIHByb21pc2VzICE9PSBudWxsICYmIHRoaXMucGFyYWxsZWwgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBwID0gbmV3IFByb21pc2UoICggcmVzb2x2ZSAvKiwgcmVqZWN0Ki8gKSA9PiB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHBhcmFsbGVsID0gdGhpcy5wYXJhbGxlbDtcclxuXHRcdFx0XHRjb25zdCBjaGVja1N0YXR1cyA9ICgpID0+IHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGdsLmdldFByb2dyYW1QYXJhbWV0ZXIoIHByb2dyYW1HUFUsIHBhcmFsbGVsLkNPTVBMRVRJT05fU1RBVFVTX0tIUiApICkge1xyXG5cclxuXHRcdFx0XHRcdFx0dGhpcy5fY29tcGxldGVDb21waWxlKCByZW5kZXJPYmplY3QsIHBpcGVsaW5lICk7XHJcblx0XHRcdFx0XHRcdHJlc29sdmUoKTtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCBjaGVja1N0YXR1cyApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0Y2hlY2tTdGF0dXMoKTtcclxuXHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHRcdHByb21pc2VzLnB1c2goIHAgKTtcclxuXHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5fY29tcGxldGVDb21waWxlKCByZW5kZXJPYmplY3QsIHBpcGVsaW5lICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRm9ybWF0cyB0aGUgc291cmNlIGNvZGUgb2YgZXJyb3IgbWVzc2FnZXMuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgLSBUaGUgY29kZS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZXJyb3JMaW5lIC0gVGhlIGVycm9yIGxpbmUuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgZm9ybWF0dGVkIGNvZGUuXHJcblx0ICovXHJcblx0X2hhbmRsZVNvdXJjZSggc3RyaW5nLCBlcnJvckxpbmUgKSB7XHJcblxyXG5cdFx0Y29uc3QgbGluZXMgPSBzdHJpbmcuc3BsaXQoICdcXG4nICk7XHJcblx0XHRjb25zdCBsaW5lczIgPSBbXTtcclxuXHJcblx0XHRjb25zdCBmcm9tID0gTWF0aC5tYXgoIGVycm9yTGluZSAtIDYsIDAgKTtcclxuXHRcdGNvbnN0IHRvID0gTWF0aC5taW4oIGVycm9yTGluZSArIDYsIGxpbmVzLmxlbmd0aCApO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gZnJvbTsgaSA8IHRvOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgbGluZSA9IGkgKyAxO1xyXG5cdFx0XHRsaW5lczIucHVzaCggYCR7bGluZSA9PT0gZXJyb3JMaW5lID8gJz4nIDogJyAnfSAke2xpbmV9OiAke2xpbmVzWyBpIF19YCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbGluZXMyLmpvaW4oICdcXG4nICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2V0cyB0aGUgc2hhZGVyIGNvbXBpbGF0aW9uIGVycm9ycyBmcm9tIHRoZSBpbmZvIGxvZy5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtXZWJHTDJSZW5kZXJpbmdDb250ZXh0fSBnbCAtIFRoZSByZW5kZXJpbmcgY29udGV4dC5cclxuXHQgKiBAcGFyYW0ge1dlYkdMU2hhZGVyfSBzaGFkZXIgLSBUaGUgV2ViR0wgc2hhZGVyIG9iamVjdC5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSBzaGFkZXIgdHlwZS5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBzaGFkZXIgZXJyb3JzLlxyXG5cdCAqL1xyXG5cdF9nZXRTaGFkZXJFcnJvcnMoIGdsLCBzaGFkZXIsIHR5cGUgKSB7XHJcblxyXG5cdFx0Y29uc3Qgc3RhdHVzID0gZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKCBzaGFkZXIsIGdsLkNPTVBJTEVfU1RBVFVTICk7XHJcblx0XHRjb25zdCBlcnJvcnMgPSBnbC5nZXRTaGFkZXJJbmZvTG9nKCBzaGFkZXIgKS50cmltKCk7XHJcblxyXG5cdFx0aWYgKCBzdGF0dXMgJiYgZXJyb3JzID09PSAnJyApIHJldHVybiAnJztcclxuXHJcblx0XHRjb25zdCBlcnJvck1hdGNoZXMgPSAvRVJST1I6IDA6KFxcZCspLy5leGVjKCBlcnJvcnMgKTtcclxuXHRcdGlmICggZXJyb3JNYXRjaGVzICkge1xyXG5cclxuXHRcdFx0Y29uc3QgZXJyb3JMaW5lID0gcGFyc2VJbnQoIGVycm9yTWF0Y2hlc1sgMSBdICk7XHJcblx0XHRcdHJldHVybiB0eXBlLnRvVXBwZXJDYXNlKCkgKyAnXFxuXFxuJyArIGVycm9ycyArICdcXG5cXG4nICsgdGhpcy5faGFuZGxlU291cmNlKCBnbC5nZXRTaGFkZXJTb3VyY2UoIHNoYWRlciApLCBlcnJvckxpbmUgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0cmV0dXJuIGVycm9ycztcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTG9ncyBzaGFkZXIgY29tcGlsYXRpb24gZXJyb3JzLlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge1dlYkdMUHJvZ3JhbX0gcHJvZ3JhbUdQVSAtIFRoZSBXZWJHTCBwcm9ncmFtLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xTaGFkZXJ9IGdsRnJhZ21lbnRTaGFkZXIgLSBUaGUgZnJhZ21lbnQgc2hhZGVyIGFzIGEgbmF0aXZlIFdlYkdMIHNoYWRlciBvYmplY3QuXHJcblx0ICogQHBhcmFtIHtXZWJHTFNoYWRlcn0gZ2xWZXJ0ZXhTaGFkZXIgLSBUaGUgdmVydGV4IHNoYWRlciBhcyBhIG5hdGl2ZSBXZWJHTCBzaGFkZXIgb2JqZWN0LlxyXG5cdCAqL1xyXG5cdF9sb2dQcm9ncmFtRXJyb3IoIHByb2dyYW1HUFUsIGdsRnJhZ21lbnRTaGFkZXIsIGdsVmVydGV4U2hhZGVyICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5yZW5kZXJlci5kZWJ1Zy5jaGVja1NoYWRlckVycm9ycyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGdsID0gdGhpcy5nbDtcclxuXHJcblx0XHRcdGNvbnN0IHByb2dyYW1Mb2cgPSBnbC5nZXRQcm9ncmFtSW5mb0xvZyggcHJvZ3JhbUdQVSApLnRyaW0oKTtcclxuXHJcblx0XHRcdGlmICggZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlciggcHJvZ3JhbUdQVSwgZ2wuTElOS19TVEFUVVMgKSA9PT0gZmFsc2UgKSB7XHJcblxyXG5cclxuXHRcdFx0XHRpZiAoIHR5cGVvZiB0aGlzLnJlbmRlcmVyLmRlYnVnLm9uU2hhZGVyRXJyb3IgPT09ICdmdW5jdGlvbicgKSB7XHJcblxyXG5cdFx0XHRcdFx0dGhpcy5yZW5kZXJlci5kZWJ1Zy5vblNoYWRlckVycm9yKCBnbCwgcHJvZ3JhbUdQVSwgZ2xWZXJ0ZXhTaGFkZXIsIGdsRnJhZ21lbnRTaGFkZXIgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHQvLyBkZWZhdWx0IGVycm9yIHJlcG9ydGluZ1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHZlcnRleEVycm9ycyA9IHRoaXMuX2dldFNoYWRlckVycm9ycyggZ2wsIGdsVmVydGV4U2hhZGVyLCAndmVydGV4JyApO1xyXG5cdFx0XHRcdFx0Y29uc3QgZnJhZ21lbnRFcnJvcnMgPSB0aGlzLl9nZXRTaGFkZXJFcnJvcnMoIGdsLCBnbEZyYWdtZW50U2hhZGVyLCAnZnJhZ21lbnQnICk7XHJcblxyXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvcihcclxuXHRcdFx0XHRcdFx0J1RIUkVFLldlYkdMUHJvZ3JhbTogU2hhZGVyIEVycm9yICcgKyBnbC5nZXRFcnJvcigpICsgJyAtICcgK1xyXG5cdFx0XHRcdFx0XHQnVkFMSURBVEVfU1RBVFVTICcgKyBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKCBwcm9ncmFtR1BVLCBnbC5WQUxJREFURV9TVEFUVVMgKSArICdcXG5cXG4nICtcclxuXHRcdFx0XHRcdFx0J1Byb2dyYW0gSW5mbyBMb2c6ICcgKyBwcm9ncmFtTG9nICsgJ1xcbicgK1xyXG5cdFx0XHRcdFx0XHR2ZXJ0ZXhFcnJvcnMgKyAnXFxuJyArXHJcblx0XHRcdFx0XHRcdGZyYWdtZW50RXJyb3JzXHJcblx0XHRcdFx0XHQpO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBwcm9ncmFtTG9nICE9PSAnJyApIHtcclxuXHJcblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xQcm9ncmFtOiBQcm9ncmFtIEluZm8gTG9nOicsIHByb2dyYW1Mb2cgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29tcGxldGVzIHRoZSBzaGFkZXIgcHJvZ3JhbSBzZXR1cCBmb3IgdGhlIGdpdmVuIHJlbmRlciBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyT2JqZWN0fSByZW5kZXJPYmplY3QgLSBUaGUgcmVuZGVyIG9iamVjdC5cclxuXHQgKiBAcGFyYW0ge1JlbmRlclBpcGVsaW5lfSBwaXBlbGluZSAtIFRoZSByZW5kZXIgcGlwZWxpbmUuXHJcblx0ICovXHJcblx0X2NvbXBsZXRlQ29tcGlsZSggcmVuZGVyT2JqZWN0LCBwaXBlbGluZSApIHtcclxuXHJcblx0XHRjb25zdCB7IHN0YXRlLCBnbCB9ID0gdGhpcztcclxuXHRcdGNvbnN0IHBpcGVsaW5lRGF0YSA9IHRoaXMuZ2V0KCBwaXBlbGluZSApO1xyXG5cdFx0Y29uc3QgeyBwcm9ncmFtR1BVLCBmcmFnbWVudFNoYWRlciwgdmVydGV4U2hhZGVyIH0gPSBwaXBlbGluZURhdGE7XHJcblxyXG5cdFx0aWYgKCBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKCBwcm9ncmFtR1BVLCBnbC5MSU5LX1NUQVRVUyApID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdHRoaXMuX2xvZ1Byb2dyYW1FcnJvciggcHJvZ3JhbUdQVSwgZnJhZ21lbnRTaGFkZXIsIHZlcnRleFNoYWRlciApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRzdGF0ZS51c2VQcm9ncmFtKCBwcm9ncmFtR1BVICk7XHJcblxyXG5cdFx0Ly8gQmluZGluZ3NcclxuXHJcblx0XHRjb25zdCBiaW5kaW5ncyA9IHJlbmRlck9iamVjdC5nZXRCaW5kaW5ncygpO1xyXG5cclxuXHRcdHRoaXMuX3NldHVwQmluZGluZ3MoIGJpbmRpbmdzLCBwcm9ncmFtR1BVICk7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHR0aGlzLnNldCggcGlwZWxpbmUsIHtcclxuXHRcdFx0cHJvZ3JhbUdQVVxyXG5cdFx0fSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgYSBjb21wdXRlIHBpcGVsaW5lIGZvciB0aGUgZ2l2ZW4gY29tcHV0ZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtDb21wdXRlUGlwZWxpbmV9IGNvbXB1dGVQaXBlbGluZSAtIFRoZSBjb21wdXRlIHBpcGVsaW5lLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8QmluZEdyb3VwPn0gYmluZGluZ3MgLSBUaGUgYmluZGluZ3MuXHJcblx0ICovXHJcblx0Y3JlYXRlQ29tcHV0ZVBpcGVsaW5lKCBjb21wdXRlUGlwZWxpbmUsIGJpbmRpbmdzICkge1xyXG5cclxuXHRcdGNvbnN0IHsgc3RhdGUsIGdsIH0gPSB0aGlzO1xyXG5cclxuXHRcdC8vIFByb2dyYW1cclxuXHJcblx0XHRjb25zdCBmcmFnbWVudFByb2dyYW0gPSB7XHJcblx0XHRcdHN0YWdlOiAnZnJhZ21lbnQnLFxyXG5cdFx0XHRjb2RlOiAnI3ZlcnNpb24gMzAwIGVzXFxucHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xcbnZvaWQgbWFpbigpIHt9J1xyXG5cdFx0fTtcclxuXHJcblx0XHR0aGlzLmNyZWF0ZVByb2dyYW0oIGZyYWdtZW50UHJvZ3JhbSApO1xyXG5cclxuXHRcdGNvbnN0IHsgY29tcHV0ZVByb2dyYW0gfSA9IGNvbXB1dGVQaXBlbGluZTtcclxuXHJcblx0XHRjb25zdCBwcm9ncmFtR1BVID0gZ2wuY3JlYXRlUHJvZ3JhbSgpO1xyXG5cclxuXHRcdGNvbnN0IGZyYWdtZW50U2hhZGVyID0gdGhpcy5nZXQoIGZyYWdtZW50UHJvZ3JhbSApLnNoYWRlckdQVTtcclxuXHRcdGNvbnN0IHZlcnRleFNoYWRlciA9IHRoaXMuZ2V0KCBjb21wdXRlUHJvZ3JhbSApLnNoYWRlckdQVTtcclxuXHJcblx0XHRjb25zdCB0cmFuc2Zvcm1zID0gY29tcHV0ZVByb2dyYW0udHJhbnNmb3JtcztcclxuXHJcblx0XHRjb25zdCB0cmFuc2Zvcm1WYXJ5aW5nTmFtZXMgPSBbXTtcclxuXHRcdGNvbnN0IHRyYW5zZm9ybUF0dHJpYnV0ZU5vZGVzID0gW107XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdHJhbnNmb3Jtcy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB0cmFuc2Zvcm0gPSB0cmFuc2Zvcm1zWyBpIF07XHJcblxyXG5cdFx0XHR0cmFuc2Zvcm1WYXJ5aW5nTmFtZXMucHVzaCggdHJhbnNmb3JtLnZhcnlpbmdOYW1lICk7XHJcblx0XHRcdHRyYW5zZm9ybUF0dHJpYnV0ZU5vZGVzLnB1c2goIHRyYW5zZm9ybS5hdHRyaWJ1dGVOb2RlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGdsLmF0dGFjaFNoYWRlciggcHJvZ3JhbUdQVSwgZnJhZ21lbnRTaGFkZXIgKTtcclxuXHRcdGdsLmF0dGFjaFNoYWRlciggcHJvZ3JhbUdQVSwgdmVydGV4U2hhZGVyICk7XHJcblxyXG5cdFx0Z2wudHJhbnNmb3JtRmVlZGJhY2tWYXJ5aW5ncyhcclxuXHRcdFx0cHJvZ3JhbUdQVSxcclxuXHRcdFx0dHJhbnNmb3JtVmFyeWluZ05hbWVzLFxyXG5cdFx0XHRnbC5TRVBBUkFURV9BVFRSSUJTXHJcblx0XHQpO1xyXG5cclxuXHRcdGdsLmxpbmtQcm9ncmFtKCBwcm9ncmFtR1BVICk7XHJcblxyXG5cdFx0aWYgKCBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKCBwcm9ncmFtR1BVLCBnbC5MSU5LX1NUQVRVUyApID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdHRoaXMuX2xvZ1Byb2dyYW1FcnJvciggcHJvZ3JhbUdQVSwgZnJhZ21lbnRTaGFkZXIsIHZlcnRleFNoYWRlciApO1xyXG5cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0c3RhdGUudXNlUHJvZ3JhbSggcHJvZ3JhbUdQVSApO1xyXG5cclxuXHRcdC8vIEJpbmRpbmdzXHJcblxyXG5cdFx0dGhpcy5fc2V0dXBCaW5kaW5ncyggYmluZGluZ3MsIHByb2dyYW1HUFUgKTtcclxuXHJcblx0XHRjb25zdCBhdHRyaWJ1dGVOb2RlcyA9IGNvbXB1dGVQcm9ncmFtLmF0dHJpYnV0ZXM7XHJcblx0XHRjb25zdCBhdHRyaWJ1dGVzID0gW107XHJcblx0XHRjb25zdCB0cmFuc2Zvcm1CdWZmZXJzID0gW107XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgYXR0cmlidXRlTm9kZXMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYXR0cmlidXRlID0gYXR0cmlidXRlTm9kZXNbIGkgXS5ub2RlLmF0dHJpYnV0ZTtcclxuXHJcblx0XHRcdGF0dHJpYnV0ZXMucHVzaCggYXR0cmlidXRlICk7XHJcblxyXG5cdFx0XHRpZiAoICEgdGhpcy5oYXMoIGF0dHJpYnV0ZSApICkgdGhpcy5hdHRyaWJ1dGVVdGlscy5jcmVhdGVBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgZ2wuQVJSQVlfQlVGRkVSICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHRyYW5zZm9ybUF0dHJpYnV0ZU5vZGVzLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGF0dHJpYnV0ZSA9IHRyYW5zZm9ybUF0dHJpYnV0ZU5vZGVzWyBpIF0uYXR0cmlidXRlO1xyXG5cclxuXHRcdFx0aWYgKCAhIHRoaXMuaGFzKCBhdHRyaWJ1dGUgKSApIHRoaXMuYXR0cmlidXRlVXRpbHMuY3JlYXRlQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGdsLkFSUkFZX0JVRkZFUiApO1xyXG5cclxuXHRcdFx0Y29uc3QgYXR0cmlidXRlRGF0YSA9IHRoaXMuZ2V0KCBhdHRyaWJ1dGUgKTtcclxuXHJcblx0XHRcdHRyYW5zZm9ybUJ1ZmZlcnMucHVzaCggYXR0cmlidXRlRGF0YSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdHRoaXMuc2V0KCBjb21wdXRlUGlwZWxpbmUsIHtcclxuXHRcdFx0cHJvZ3JhbUdQVSxcclxuXHRcdFx0dHJhbnNmb3JtQnVmZmVycyxcclxuXHRcdFx0YXR0cmlidXRlc1xyXG5cdFx0fSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgYmluZGluZ3MgZnJvbSB0aGUgZ2l2ZW4gYmluZCBncm91cCBkZWZpbml0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCaW5kR3JvdXB9IGJpbmRHcm91cCAtIFRoZSBiaW5kIGdyb3VwLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8QmluZEdyb3VwPn0gYmluZGluZ3MgLSBBcnJheSBvZiBiaW5kIGdyb3Vwcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gY2FjaGVJbmRleCAtIFRoZSBjYWNoZSBpbmRleC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdmVyc2lvbiAtIFRoZSB2ZXJzaW9uLlxyXG5cdCAqL1xyXG5cdGNyZWF0ZUJpbmRpbmdzKCBiaW5kR3JvdXAsIGJpbmRpbmdzIC8qLCBjYWNoZUluZGV4LCB2ZXJzaW9uKi8gKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLl9rbm93bkJpbmRpbmdzLmhhcyggYmluZGluZ3MgKSA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHR0aGlzLl9rbm93bkJpbmRpbmdzLmFkZCggYmluZGluZ3MgKTtcclxuXHJcblx0XHRcdGxldCB1bmlmb3JtQnVmZmVycyA9IDA7XHJcblx0XHRcdGxldCB0ZXh0dXJlcyA9IDA7XHJcblxyXG5cdFx0XHRmb3IgKCBjb25zdCBiaW5kR3JvdXAgb2YgYmluZGluZ3MgKSB7XHJcblxyXG5cdFx0XHRcdHRoaXMuc2V0KCBiaW5kR3JvdXAsIHtcclxuXHRcdFx0XHRcdHRleHR1cmVzOiB0ZXh0dXJlcyxcclxuXHRcdFx0XHRcdHVuaWZvcm1CdWZmZXJzOiB1bmlmb3JtQnVmZmVyc1xyXG5cdFx0XHRcdH0gKTtcclxuXHJcblx0XHRcdFx0Zm9yICggY29uc3QgYmluZGluZyBvZiBiaW5kR3JvdXAuYmluZGluZ3MgKSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBiaW5kaW5nLmlzVW5pZm9ybUJ1ZmZlciApIHVuaWZvcm1CdWZmZXJzICsrO1xyXG5cdFx0XHRcdFx0aWYgKCBiaW5kaW5nLmlzU2FtcGxlZFRleHR1cmUgKSB0ZXh0dXJlcyArKztcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnVwZGF0ZUJpbmRpbmdzKCBiaW5kR3JvdXAsIGJpbmRpbmdzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgZ2l2ZW4gYmluZCBncm91cCBkZWZpbml0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCaW5kR3JvdXB9IGJpbmRHcm91cCAtIFRoZSBiaW5kIGdyb3VwLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8QmluZEdyb3VwPn0gYmluZGluZ3MgLSBBcnJheSBvZiBiaW5kIGdyb3Vwcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gY2FjaGVJbmRleCAtIFRoZSBjYWNoZSBpbmRleC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdmVyc2lvbiAtIFRoZSB2ZXJzaW9uLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZUJpbmRpbmdzKCBiaW5kR3JvdXAgLyosIGJpbmRpbmdzLCBjYWNoZUluZGV4LCB2ZXJzaW9uKi8gKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBnbCB9ID0gdGhpcztcclxuXHJcblx0XHRjb25zdCBiaW5kR3JvdXBEYXRhID0gdGhpcy5nZXQoIGJpbmRHcm91cCApO1xyXG5cclxuXHRcdGxldCBpID0gYmluZEdyb3VwRGF0YS51bmlmb3JtQnVmZmVycztcclxuXHRcdGxldCB0ID0gYmluZEdyb3VwRGF0YS50ZXh0dXJlcztcclxuXHJcblx0XHRmb3IgKCBjb25zdCBiaW5kaW5nIG9mIGJpbmRHcm91cC5iaW5kaW5ncyApIHtcclxuXHJcblx0XHRcdGlmICggYmluZGluZy5pc1VuaWZvcm1zR3JvdXAgfHwgYmluZGluZy5pc1VuaWZvcm1CdWZmZXIgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGRhdGEgPSBiaW5kaW5nLmJ1ZmZlcjtcclxuXHRcdFx0XHRjb25zdCBidWZmZXJHUFUgPSBnbC5jcmVhdGVCdWZmZXIoKTtcclxuXHJcblx0XHRcdFx0Z2wuYmluZEJ1ZmZlciggZ2wuVU5JRk9STV9CVUZGRVIsIGJ1ZmZlckdQVSApO1xyXG5cdFx0XHRcdGdsLmJ1ZmZlckRhdGEoIGdsLlVOSUZPUk1fQlVGRkVSLCBkYXRhLCBnbC5EWU5BTUlDX0RSQVcgKTtcclxuXHJcblx0XHRcdFx0dGhpcy5zZXQoIGJpbmRpbmcsIHtcclxuXHRcdFx0XHRcdGluZGV4OiBpICsrLFxyXG5cdFx0XHRcdFx0YnVmZmVyR1BVXHJcblx0XHRcdFx0fSApO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggYmluZGluZy5pc1NhbXBsZWRUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB7IHRleHR1cmVHUFUsIGdsVGV4dHVyZVR5cGUgfSA9IHRoaXMuZ2V0KCBiaW5kaW5nLnRleHR1cmUgKTtcclxuXHJcblx0XHRcdFx0dGhpcy5zZXQoIGJpbmRpbmcsIHtcclxuXHRcdFx0XHRcdGluZGV4OiB0ICsrLFxyXG5cdFx0XHRcdFx0dGV4dHVyZUdQVSxcclxuXHRcdFx0XHRcdGdsVGV4dHVyZVR5cGVcclxuXHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgYSBidWZmZXIgYmluZGluZy5cclxuXHQgKlxyXG5cdCAqICBAcGFyYW0ge0J1ZmZlcn0gYmluZGluZyAtIFRoZSBidWZmZXIgYmluZGluZyB0byB1cGRhdGUuXHJcblx0ICovXHJcblx0dXBkYXRlQmluZGluZyggYmluZGluZyApIHtcclxuXHJcblx0XHRjb25zdCBnbCA9IHRoaXMuZ2w7XHJcblxyXG5cdFx0aWYgKCBiaW5kaW5nLmlzVW5pZm9ybXNHcm91cCB8fCBiaW5kaW5nLmlzVW5pZm9ybUJ1ZmZlciApIHtcclxuXHJcblx0XHRcdGNvbnN0IGJpbmRpbmdEYXRhID0gdGhpcy5nZXQoIGJpbmRpbmcgKTtcclxuXHRcdFx0Y29uc3QgYnVmZmVyR1BVID0gYmluZGluZ0RhdGEuYnVmZmVyR1BVO1xyXG5cdFx0XHRjb25zdCBkYXRhID0gYmluZGluZy5idWZmZXI7XHJcblxyXG5cdFx0XHRnbC5iaW5kQnVmZmVyKCBnbC5VTklGT1JNX0JVRkZFUiwgYnVmZmVyR1BVICk7XHJcblx0XHRcdGdsLmJ1ZmZlckRhdGEoIGdsLlVOSUZPUk1fQlVGRkVSLCBkYXRhLCBnbC5EWU5BTUlDX0RSQVcgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gYXR0cmlidXRlc1xyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIHRoZSBHUFUgYnVmZmVyIG9mIGFuIGluZGV4ZWQgc2hhZGVyIGF0dHJpYnV0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyQXR0cmlidXRlfSBhdHRyaWJ1dGUgLSBUaGUgaW5kZXhlZCBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqL1xyXG5cdGNyZWF0ZUluZGV4QXR0cmlidXRlKCBhdHRyaWJ1dGUgKSB7XHJcblxyXG5cdFx0Y29uc3QgZ2wgPSB0aGlzLmdsO1xyXG5cclxuXHRcdHRoaXMuYXR0cmlidXRlVXRpbHMuY3JlYXRlQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyB0aGUgR1BVIGJ1ZmZlciBvZiBhIHNoYWRlciBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0J1ZmZlckF0dHJpYnV0ZX0gYXR0cmlidXRlIC0gVGhlIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICovXHJcblx0Y3JlYXRlQXR0cmlidXRlKCBhdHRyaWJ1dGUgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmhhcyggYXR0cmlidXRlICkgKSByZXR1cm47XHJcblxyXG5cdFx0Y29uc3QgZ2wgPSB0aGlzLmdsO1xyXG5cclxuXHRcdHRoaXMuYXR0cmlidXRlVXRpbHMuY3JlYXRlQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGdsLkFSUkFZX0JVRkZFUiApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgdGhlIEdQVSBidWZmZXIgb2YgYSBzdG9yYWdlIGF0dHJpYnV0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyQXR0cmlidXRlfSBhdHRyaWJ1dGUgLSBUaGUgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKi9cclxuXHRjcmVhdGVTdG9yYWdlQXR0cmlidXRlKCBhdHRyaWJ1dGUgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmhhcyggYXR0cmlidXRlICkgKSByZXR1cm47XHJcblxyXG5cdFx0Y29uc3QgZ2wgPSB0aGlzLmdsO1xyXG5cclxuXHRcdHRoaXMuYXR0cmlidXRlVXRpbHMuY3JlYXRlQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGdsLkFSUkFZX0JVRkZFUiApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIEdQVSBidWZmZXIgb2YgYSBzaGFkZXIgYXR0cmlidXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCdWZmZXJBdHRyaWJ1dGV9IGF0dHJpYnV0ZSAtIFRoZSBidWZmZXIgYXR0cmlidXRlIHRvIHVwZGF0ZS5cclxuXHQgKi9cclxuXHR1cGRhdGVBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApIHtcclxuXHJcblx0XHR0aGlzLmF0dHJpYnV0ZVV0aWxzLnVwZGF0ZUF0dHJpYnV0ZSggYXR0cmlidXRlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVzdHJveXMgdGhlIEdQVSBidWZmZXIgb2YgYSBzaGFkZXIgYXR0cmlidXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCdWZmZXJBdHRyaWJ1dGV9IGF0dHJpYnV0ZSAtIFRoZSBidWZmZXIgYXR0cmlidXRlIHRvIGRlc3Ryb3kuXHJcblx0ICovXHJcblx0ZGVzdHJveUF0dHJpYnV0ZSggYXR0cmlidXRlICkge1xyXG5cclxuXHRcdHRoaXMuYXR0cmlidXRlVXRpbHMuZGVzdHJveUF0dHJpYnV0ZSggYXR0cmlidXRlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBmZWF0dXJlIGlzIHN1cHBvcnRlZCAgYnkgdGhlIGJhY2tlbmQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBmZWF0dXJlJ3MgbmFtZS5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBvciBub3QuXHJcblx0ICovXHJcblx0aGFzRmVhdHVyZSggbmFtZSApIHtcclxuXHJcblx0XHRjb25zdCBrZXlzTWF0Y2hpbmcgPSBPYmplY3Qua2V5cyggR0xGZWF0dXJlTmFtZSApLmZpbHRlcigga2V5ID0+IEdMRmVhdHVyZU5hbWVbIGtleSBdID09PSBuYW1lICk7XHJcblxyXG5cdFx0Y29uc3QgZXh0ZW5zaW9ucyA9IHRoaXMuZXh0ZW5zaW9ucztcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBrZXlzTWF0Y2hpbmcubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0aWYgKCBleHRlbnNpb25zLmhhcygga2V5c01hdGNoaW5nWyBpIF0gKSApIHJldHVybiB0cnVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZmFsc2U7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgbWF4aW11bSBhbmlzb3Ryb3B5IHRleHR1cmUgZmlsdGVyaW5nIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgbWF4aW11bSBhbmlzb3Ryb3B5IHRleHR1cmUgZmlsdGVyaW5nIHZhbHVlLlxyXG5cdCAqL1xyXG5cdGdldE1heEFuaXNvdHJvcHkoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuY2FwYWJpbGl0aWVzLmdldE1heEFuaXNvdHJvcHkoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb3BpZXMgZGF0YSBvZiB0aGUgZ2l2ZW4gc291cmNlIHRleHR1cmUgdG8gdGhlIGdpdmVuIGRlc3RpbmF0aW9uIHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHNyY1RleHR1cmUgLSBUaGUgc291cmNlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSBkc3RUZXh0dXJlIC0gVGhlIGRlc3RpbmF0aW9uIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHs/KEJveDN8Qm94Mil9IFtzcmNSZWdpb249bnVsbF0gLSBUaGUgcmVnaW9uIG9mIHRoZSBzb3VyY2UgdGV4dHVyZSB0byBjb3B5LlxyXG5cdCAqIEBwYXJhbSB7PyhWZWN0b3IyfFZlY3RvcjMpfSBbZHN0UG9zaXRpb249bnVsbF0gLSBUaGUgZGVzdGluYXRpb24gcG9zaXRpb24gb2YgdGhlIGNvcHkuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtzcmNMZXZlbD0wXSAtIFRoZSBzb3VyY2UgbWlwIGxldmVsIHRvIGNvcHkgZnJvbS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2RzdExldmVsPTBdIC0gVGhlIGRlc3RpbmF0aW9uIG1pcCBsZXZlbCB0byBjb3B5IHRvLlxyXG5cdCAqL1xyXG5cdGNvcHlUZXh0dXJlVG9UZXh0dXJlKCBzcmNUZXh0dXJlLCBkc3RUZXh0dXJlLCBzcmNSZWdpb24gPSBudWxsLCBkc3RQb3NpdGlvbiA9IG51bGwsIHNyY0xldmVsID0gMCwgZHN0TGV2ZWwgPSAwICkge1xyXG5cclxuXHRcdHRoaXMudGV4dHVyZVV0aWxzLmNvcHlUZXh0dXJlVG9UZXh0dXJlKCBzcmNUZXh0dXJlLCBkc3RUZXh0dXJlLCBzcmNSZWdpb24sIGRzdFBvc2l0aW9uLCBzcmNMZXZlbCwgZHN0TGV2ZWwgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb3BpZXMgdGhlIGN1cnJlbnQgYm91bmQgZnJhbWVidWZmZXIgdG8gdGhlIGdpdmVuIHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgZGVzdGluYXRpb24gdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge1JlbmRlckNvbnRleHR9IHJlbmRlckNvbnRleHQgLSBUaGUgcmVuZGVyIGNvbnRleHQuXHJcblx0ICogQHBhcmFtIHtWZWN0b3I0fSByZWN0YW5nbGUgLSBBIGZvdXIgZGltZW5zaW9uYWwgdmVjdG9yIGRlZmluaW5nIHRoZSBvcmlnaW4gYW5kIGRpbWVuc2lvbiBvZiB0aGUgY29weS5cclxuXHQgKi9cclxuXHRjb3B5RnJhbWVidWZmZXJUb1RleHR1cmUoIHRleHR1cmUsIHJlbmRlckNvbnRleHQsIHJlY3RhbmdsZSApIHtcclxuXHJcblx0XHR0aGlzLnRleHR1cmVVdGlscy5jb3B5RnJhbWVidWZmZXJUb1RleHR1cmUoIHRleHR1cmUsIHJlbmRlckNvbnRleHQsIHJlY3RhbmdsZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbmZpZ3VyZXMgdGhlIGFjdGl2ZSBmcmFtZWJ1ZmZlciBmcm9tIHRoZSBnaXZlbiByZW5kZXIgY29udGV4dC5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtSZW5kZXJDb250ZXh0fSBkZXNjcmlwdG9yIC0gVGhlIHJlbmRlciBjb250ZXh0LlxyXG5cdCAqL1xyXG5cdF9zZXRGcmFtZWJ1ZmZlciggZGVzY3JpcHRvciApIHtcclxuXHJcblx0XHRjb25zdCB7IGdsLCBzdGF0ZSB9ID0gdGhpcztcclxuXHJcblx0XHRsZXQgY3VycmVudEZyYW1lQnVmZmVyID0gbnVsbDtcclxuXHJcblx0XHRpZiAoIGRlc2NyaXB0b3IudGV4dHVyZXMgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRjb25zdCByZW5kZXJUYXJnZXQgPSBkZXNjcmlwdG9yLnJlbmRlclRhcmdldDtcclxuXHRcdFx0Y29uc3QgcmVuZGVyVGFyZ2V0Q29udGV4dERhdGEgPSB0aGlzLmdldCggcmVuZGVyVGFyZ2V0ICk7XHJcblx0XHRcdGNvbnN0IHsgc2FtcGxlcywgZGVwdGhCdWZmZXIsIHN0ZW5jaWxCdWZmZXIgfSA9IHJlbmRlclRhcmdldDtcclxuXHJcblx0XHRcdGNvbnN0IGlzQ3ViZSA9IHJlbmRlclRhcmdldC5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldCA9PT0gdHJ1ZTtcclxuXHRcdFx0Y29uc3QgaXNSZW5kZXJUYXJnZXQzRCA9IHJlbmRlclRhcmdldC5pc1JlbmRlclRhcmdldDNEID09PSB0cnVlO1xyXG5cdFx0XHRjb25zdCBpc1JlbmRlclRhcmdldEFycmF5ID0gcmVuZGVyVGFyZ2V0LmlzUmVuZGVyVGFyZ2V0QXJyYXkgPT09IHRydWU7XHJcblx0XHRcdGNvbnN0IGlzWFJSZW5kZXJUYXJnZXQgPSByZW5kZXJUYXJnZXQuaXNYUlJlbmRlclRhcmdldCA9PT0gdHJ1ZTtcclxuXHRcdFx0Y29uc3QgaGFzRXh0ZXJuYWxUZXh0dXJlcyA9ICggaXNYUlJlbmRlclRhcmdldCA9PT0gdHJ1ZSAmJiByZW5kZXJUYXJnZXQuaGFzRXh0ZXJuYWxUZXh0dXJlcyA9PT0gdHJ1ZSApO1xyXG5cclxuXHRcdFx0bGV0IG1zYWFGYiA9IHJlbmRlclRhcmdldENvbnRleHREYXRhLm1zYWFGcmFtZUJ1ZmZlcjtcclxuXHRcdFx0bGV0IGRlcHRoUmVuZGVyYnVmZmVyID0gcmVuZGVyVGFyZ2V0Q29udGV4dERhdGEuZGVwdGhSZW5kZXJidWZmZXI7XHJcblx0XHRcdGNvbnN0IG11bHRpc2FtcGxlZFJUVEV4dCA9IHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9tdWx0aXNhbXBsZWRfcmVuZGVyX3RvX3RleHR1cmUnICk7XHJcblx0XHRcdGNvbnN0IHVzZU11bHRpc2FtcGxlZFJUVCA9IHRoaXMuX3VzZU11bHRpc2FtcGxlZFJUVCggcmVuZGVyVGFyZ2V0ICk7XHJcblxyXG5cdFx0XHRjb25zdCBjYWNoZUtleSA9IGdldENhY2hlS2V5KCBkZXNjcmlwdG9yICk7XHJcblxyXG5cdFx0XHRsZXQgZmI7XHJcblxyXG5cdFx0XHRpZiAoIGlzQ3ViZSApIHtcclxuXHJcblx0XHRcdFx0cmVuZGVyVGFyZ2V0Q29udGV4dERhdGEuY3ViZUZyYW1lYnVmZmVycyB8fCAoIHJlbmRlclRhcmdldENvbnRleHREYXRhLmN1YmVGcmFtZWJ1ZmZlcnMgPSB7fSApO1xyXG5cclxuXHRcdFx0XHRmYiA9IHJlbmRlclRhcmdldENvbnRleHREYXRhLmN1YmVGcmFtZWJ1ZmZlcnNbIGNhY2hlS2V5IF07XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBpc1hSUmVuZGVyVGFyZ2V0ICYmIGhhc0V4dGVybmFsVGV4dHVyZXMgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0XHRmYiA9IHRoaXMuX3hyRnJhbWVidWZmZXI7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRyZW5kZXJUYXJnZXRDb250ZXh0RGF0YS5mcmFtZWJ1ZmZlcnMgfHwgKCByZW5kZXJUYXJnZXRDb250ZXh0RGF0YS5mcmFtZWJ1ZmZlcnMgPSB7fSApO1xyXG5cclxuXHRcdFx0XHRmYiA9IHJlbmRlclRhcmdldENvbnRleHREYXRhLmZyYW1lYnVmZmVyc1sgY2FjaGVLZXkgXTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggZmIgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0ZmIgPSBnbC5jcmVhdGVGcmFtZWJ1ZmZlcigpO1xyXG5cclxuXHRcdFx0XHRzdGF0ZS5iaW5kRnJhbWVidWZmZXIoIGdsLkZSQU1FQlVGRkVSLCBmYiApO1xyXG5cclxuXHRcdFx0XHRjb25zdCB0ZXh0dXJlcyA9IGRlc2NyaXB0b3IudGV4dHVyZXM7XHJcblxyXG5cdFx0XHRcdGlmICggaXNDdWJlICkge1xyXG5cclxuXHRcdFx0XHRcdHJlbmRlclRhcmdldENvbnRleHREYXRhLmN1YmVGcmFtZWJ1ZmZlcnNbIGNhY2hlS2V5IF0gPSBmYjtcclxuXHJcblx0XHRcdFx0XHRjb25zdCB7IHRleHR1cmVHUFUgfSA9IHRoaXMuZ2V0KCB0ZXh0dXJlc1sgMCBdICk7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgY3ViZUZhY2UgPSB0aGlzLnJlbmRlcmVyLl9hY3RpdmVDdWJlRmFjZTtcclxuXHJcblx0XHRcdFx0XHRnbC5mcmFtZWJ1ZmZlclRleHR1cmUyRCggZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBjdWJlRmFjZSwgdGV4dHVyZUdQVSwgMCApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdHJlbmRlclRhcmdldENvbnRleHREYXRhLmZyYW1lYnVmZmVyc1sgY2FjaGVLZXkgXSA9IGZiO1xyXG5cclxuXHRcdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHRleHR1cmVzLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnN0IHRleHR1cmUgPSB0ZXh0dXJlc1sgaSBdO1xyXG5cdFx0XHRcdFx0XHRjb25zdCB0ZXh0dXJlRGF0YSA9IHRoaXMuZ2V0KCB0ZXh0dXJlICk7XHJcblx0XHRcdFx0XHRcdHRleHR1cmVEYXRhLnJlbmRlclRhcmdldCA9IGRlc2NyaXB0b3IucmVuZGVyVGFyZ2V0O1xyXG5cdFx0XHRcdFx0XHR0ZXh0dXJlRGF0YS5jYWNoZUtleSA9IGNhY2hlS2V5OyAvLyByZXF1aXJlZCBmb3IgY29weVRleHR1cmVUb1RleHR1cmUoKVxyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgYXR0YWNobWVudCA9IGdsLkNPTE9SX0FUVEFDSE1FTlQwICsgaTtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggaXNSZW5kZXJUYXJnZXQzRCB8fCBpc1JlbmRlclRhcmdldEFycmF5ICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRjb25zdCBsYXllciA9IHRoaXMucmVuZGVyZXIuX2FjdGl2ZUN1YmVGYWNlO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRnbC5mcmFtZWJ1ZmZlclRleHR1cmVMYXllciggZ2wuRlJBTUVCVUZGRVIsIGF0dGFjaG1lbnQsIHRleHR1cmVEYXRhLnRleHR1cmVHUFUsIDAsIGxheWVyICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoIGhhc0V4dGVybmFsVGV4dHVyZXMgJiYgdXNlTXVsdGlzYW1wbGVkUlRUICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdG11bHRpc2FtcGxlZFJUVEV4dC5mcmFtZWJ1ZmZlclRleHR1cmUyRE11bHRpc2FtcGxlRVhUKCBnbC5GUkFNRUJVRkZFUiwgYXR0YWNobWVudCwgZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZURhdGEudGV4dHVyZUdQVSwgMCwgc2FtcGxlcyApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGdsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKCBnbC5GUkFNRUJVRkZFUiwgYXR0YWNobWVudCwgZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZURhdGEudGV4dHVyZUdQVSwgMCApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHN0YXRlLmRyYXdCdWZmZXJzKCBkZXNjcmlwdG9yLCBmYiApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICggcmVuZGVyVGFyZ2V0LmlzWFJSZW5kZXJUYXJnZXQgJiYgcmVuZGVyVGFyZ2V0LmF1dG9BbGxvY2F0ZURlcHRoQnVmZmVyID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHJlbmRlcmJ1ZmZlciA9IGdsLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpO1xyXG5cdFx0XHRcdFx0dGhpcy50ZXh0dXJlVXRpbHMuc2V0dXBSZW5kZXJCdWZmZXJTdG9yYWdlKCByZW5kZXJidWZmZXIsIGRlc2NyaXB0b3IsIDAsIHVzZU11bHRpc2FtcGxlZFJUVCApO1xyXG5cdFx0XHRcdFx0cmVuZGVyVGFyZ2V0Q29udGV4dERhdGEueHJEZXB0aFJlbmRlcmJ1ZmZlciA9IHJlbmRlcmJ1ZmZlcjtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGRlc2NyaXB0b3IuZGVwdGhUZXh0dXJlICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgdGV4dHVyZURhdGEgPSB0aGlzLmdldCggZGVzY3JpcHRvci5kZXB0aFRleHR1cmUgKTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgZGVwdGhTdHlsZSA9IHN0ZW5jaWxCdWZmZXIgPyBnbC5ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQgOiBnbC5ERVBUSF9BVFRBQ0hNRU5UO1xyXG5cdFx0XHRcdFx0XHR0ZXh0dXJlRGF0YS5yZW5kZXJUYXJnZXQgPSBkZXNjcmlwdG9yLnJlbmRlclRhcmdldDtcclxuXHRcdFx0XHRcdFx0dGV4dHVyZURhdGEuY2FjaGVLZXkgPSBjYWNoZUtleTsgLy8gcmVxdWlyZWQgZm9yIGNvcHlUZXh0dXJlVG9UZXh0dXJlKClcclxuXHJcblx0XHRcdFx0XHRcdGlmICggaGFzRXh0ZXJuYWxUZXh0dXJlcyAmJiB1c2VNdWx0aXNhbXBsZWRSVFQgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdG11bHRpc2FtcGxlZFJUVEV4dC5mcmFtZWJ1ZmZlclRleHR1cmUyRE11bHRpc2FtcGxlRVhUKCBnbC5GUkFNRUJVRkZFUiwgZGVwdGhTdHlsZSwgZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZURhdGEudGV4dHVyZUdQVSwgMCwgc2FtcGxlcyApO1xyXG5cclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0Z2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoIGdsLkZSQU1FQlVGRkVSLCBkZXB0aFN0eWxlLCBnbC5URVhUVVJFXzJELCB0ZXh0dXJlRGF0YS50ZXh0dXJlR1BVLCAwICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHQvLyByZWJpbmQgZXh0ZXJuYWwgWFIgdGV4dHVyZXNcclxuXHJcblx0XHRcdFx0aWYgKCBpc1hSUmVuZGVyVGFyZ2V0ICYmIGhhc0V4dGVybmFsVGV4dHVyZXMgKSB7XHJcblxyXG5cdFx0XHRcdFx0c3RhdGUuYmluZEZyYW1lYnVmZmVyKCBnbC5GUkFNRUJVRkZFUiwgZmIgKTtcclxuXHJcblx0XHRcdFx0XHQvLyByZWJpbmQgY29sb3JcclxuXHJcblx0XHRcdFx0XHRjb25zdCB0ZXh0dXJlRGF0YSA9IHRoaXMuZ2V0KCBkZXNjcmlwdG9yLnRleHR1cmVzWyAwIF0gKTtcclxuXHJcblx0XHRcdFx0XHRpZiAoIHVzZU11bHRpc2FtcGxlZFJUVCApIHtcclxuXHJcblx0XHRcdFx0XHRcdG11bHRpc2FtcGxlZFJUVEV4dC5mcmFtZWJ1ZmZlclRleHR1cmUyRE11bHRpc2FtcGxlRVhUKCBnbC5GUkFNRUJVRkZFUiwgZ2wuQ09MT1JfQVRUQUNITUVOVDAsIGdsLlRFWFRVUkVfMkQsIHRleHR1cmVEYXRhLnRleHR1cmVHUFUsIDAsIHNhbXBsZXMgKTtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0Z2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoIGdsLkZSQU1FQlVGRkVSLCBnbC5DT0xPUl9BVFRBQ0hNRU5UMCwgZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZURhdGEudGV4dHVyZUdQVSwgMCApO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvLyByZWJpbmQgZGVwdGhcclxuXHJcblx0XHRcdFx0XHRjb25zdCBkZXB0aFN0eWxlID0gc3RlbmNpbEJ1ZmZlciA/IGdsLkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVCA6IGdsLkRFUFRIX0FUVEFDSE1FTlQ7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCByZW5kZXJUYXJnZXQuYXV0b0FsbG9jYXRlRGVwdGhCdWZmZXIgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCByZW5kZXJidWZmZXIgPSByZW5kZXJUYXJnZXRDb250ZXh0RGF0YS54ckRlcHRoUmVuZGVyYnVmZmVyO1xyXG5cdFx0XHRcdFx0XHRnbC5iaW5kUmVuZGVyYnVmZmVyKCBnbC5SRU5ERVJCVUZGRVIsIHJlbmRlcmJ1ZmZlciApO1xyXG5cdFx0XHRcdFx0XHRnbC5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlciggZ2wuRlJBTUVCVUZGRVIsIGRlcHRoU3R5bGUsIGdsLlJFTkRFUkJVRkZFUiwgcmVuZGVyYnVmZmVyICk7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnN0IHRleHR1cmVEYXRhID0gdGhpcy5nZXQoIGRlc2NyaXB0b3IuZGVwdGhUZXh0dXJlICk7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIHVzZU11bHRpc2FtcGxlZFJUVCApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0bXVsdGlzYW1wbGVkUlRURXh0LmZyYW1lYnVmZmVyVGV4dHVyZTJETXVsdGlzYW1wbGVFWFQoIGdsLkZSQU1FQlVGRkVSLCBkZXB0aFN0eWxlLCBnbC5URVhUVVJFXzJELCB0ZXh0dXJlRGF0YS50ZXh0dXJlR1BVLCAwLCBzYW1wbGVzICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRnbC5mcmFtZWJ1ZmZlclRleHR1cmUyRCggZ2wuRlJBTUVCVUZGRVIsIGRlcHRoU3R5bGUsIGdsLlRFWFRVUkVfMkQsIHRleHR1cmVEYXRhLnRleHR1cmVHUFUsIDAgKTtcclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggc2FtcGxlcyA+IDAgJiYgdXNlTXVsdGlzYW1wbGVkUlRUID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdFx0aWYgKCBtc2FhRmIgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBpbnZhbGlkYXRpb25BcnJheSA9IFtdO1xyXG5cclxuXHRcdFx0XHRcdG1zYWFGYiA9IGdsLmNyZWF0ZUZyYW1lYnVmZmVyKCk7XHJcblxyXG5cdFx0XHRcdFx0c3RhdGUuYmluZEZyYW1lYnVmZmVyKCBnbC5GUkFNRUJVRkZFUiwgbXNhYUZiICk7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgbXNhYVJlbmRlcmJ1ZmZlcnMgPSBbXTtcclxuXHJcblx0XHRcdFx0XHRjb25zdCB0ZXh0dXJlcyA9IGRlc2NyaXB0b3IudGV4dHVyZXM7XHJcblxyXG5cdFx0XHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdGV4dHVyZXMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdFx0bXNhYVJlbmRlcmJ1ZmZlcnNbIGkgXSA9IGdsLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpO1xyXG5cclxuXHRcdFx0XHRcdFx0Z2wuYmluZFJlbmRlcmJ1ZmZlciggZ2wuUkVOREVSQlVGRkVSLCBtc2FhUmVuZGVyYnVmZmVyc1sgaSBdICk7XHJcblxyXG5cdFx0XHRcdFx0XHRpbnZhbGlkYXRpb25BcnJheS5wdXNoKCBnbC5DT0xPUl9BVFRBQ0hNRU5UMCArIGkgKTtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggZGVwdGhCdWZmZXIgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGRlcHRoU3R5bGUgPSBzdGVuY2lsQnVmZmVyID8gZ2wuREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UIDogZ2wuREVQVEhfQVRUQUNITUVOVDtcclxuXHRcdFx0XHRcdFx0XHRpbnZhbGlkYXRpb25BcnJheS5wdXNoKCBkZXB0aFN0eWxlICk7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRjb25zdCB0ZXh0dXJlID0gZGVzY3JpcHRvci50ZXh0dXJlc1sgaSBdO1xyXG5cdFx0XHRcdFx0XHRjb25zdCB0ZXh0dXJlRGF0YSA9IHRoaXMuZ2V0KCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0XHRcdFx0XHRnbC5yZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGUoIGdsLlJFTkRFUkJVRkZFUiwgc2FtcGxlcywgdGV4dHVyZURhdGEuZ2xJbnRlcm5hbEZvcm1hdCwgZGVzY3JpcHRvci53aWR0aCwgZGVzY3JpcHRvci5oZWlnaHQgKTtcclxuXHRcdFx0XHRcdFx0Z2wuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoIGdsLkZSQU1FQlVGRkVSLCBnbC5DT0xPUl9BVFRBQ0hNRU5UMCArIGksIGdsLlJFTkRFUkJVRkZFUiwgbXNhYVJlbmRlcmJ1ZmZlcnNbIGkgXSApO1xyXG5cclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0cmVuZGVyVGFyZ2V0Q29udGV4dERhdGEubXNhYUZyYW1lQnVmZmVyID0gbXNhYUZiO1xyXG5cdFx0XHRcdFx0cmVuZGVyVGFyZ2V0Q29udGV4dERhdGEubXNhYVJlbmRlcmJ1ZmZlcnMgPSBtc2FhUmVuZGVyYnVmZmVycztcclxuXHJcblx0XHRcdFx0XHRpZiAoIGRlcHRoUmVuZGVyYnVmZmVyID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRkZXB0aFJlbmRlcmJ1ZmZlciA9IGdsLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpO1xyXG5cdFx0XHRcdFx0XHR0aGlzLnRleHR1cmVVdGlscy5zZXR1cFJlbmRlckJ1ZmZlclN0b3JhZ2UoIGRlcHRoUmVuZGVyYnVmZmVyLCBkZXNjcmlwdG9yLCBzYW1wbGVzICk7XHJcblxyXG5cdFx0XHRcdFx0XHRyZW5kZXJUYXJnZXRDb250ZXh0RGF0YS5kZXB0aFJlbmRlcmJ1ZmZlciA9IGRlcHRoUmVuZGVyYnVmZmVyO1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgZGVwdGhTdHlsZSA9IHN0ZW5jaWxCdWZmZXIgPyBnbC5ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQgOiBnbC5ERVBUSF9BVFRBQ0hNRU5UO1xyXG5cdFx0XHRcdFx0XHRpbnZhbGlkYXRpb25BcnJheS5wdXNoKCBkZXB0aFN0eWxlICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHJlbmRlclRhcmdldENvbnRleHREYXRhLmludmFsaWRhdGlvbkFycmF5ID0gaW52YWxpZGF0aW9uQXJyYXk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Y3VycmVudEZyYW1lQnVmZmVyID0gcmVuZGVyVGFyZ2V0Q29udGV4dERhdGEubXNhYUZyYW1lQnVmZmVyO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0Y3VycmVudEZyYW1lQnVmZmVyID0gZmI7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHN0YXRlLmJpbmRGcmFtZWJ1ZmZlciggZ2wuRlJBTUVCVUZGRVIsIGN1cnJlbnRGcmFtZUJ1ZmZlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXB1dGVzIHRoZSBWQU8ga2V5IGZvciB0aGUgZ2l2ZW4gaW5kZXggYW5kIGF0dHJpYnV0ZXMuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8QnVmZmVyQXR0cmlidXRlPn0gYXR0cmlidXRlcyAtIEFuIGFycmF5IG9mIGJ1ZmZlciBhdHRyaWJ1dGVzLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIFZBTyBrZXkuXHJcblx0ICovXHJcblx0X2dldFZhb0tleSggYXR0cmlidXRlcyApIHtcclxuXHJcblx0XHRsZXQga2V5ID0gJyc7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBhdHRyaWJ1dGVEYXRhID0gdGhpcy5nZXQoIGF0dHJpYnV0ZXNbIGkgXSApO1xyXG5cclxuXHRcdFx0a2V5ICs9ICc6JyArIGF0dHJpYnV0ZURhdGEuaWQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBrZXk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyBhIFZBTyBmcm9tIHRoZSBpbmRleCBhbmQgYXR0cmlidXRlcy5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtBcnJheTxCdWZmZXJBdHRyaWJ1dGU+fSBhdHRyaWJ1dGVzIC0gQW4gYXJyYXkgb2YgYnVmZmVyIGF0dHJpYnV0ZXMuXHJcblx0ICogQHJldHVybiB7T2JqZWN0fSBUaGUgVkFPIGRhdGEuXHJcblx0ICovXHJcblx0X2NyZWF0ZVZhbyggYXR0cmlidXRlcyApIHtcclxuXHJcblx0XHRjb25zdCB7IGdsIH0gPSB0aGlzO1xyXG5cclxuXHRcdGNvbnN0IHZhb0dQVSA9IGdsLmNyZWF0ZVZlcnRleEFycmF5KCk7XHJcblx0XHRsZXQga2V5ID0gJyc7XHJcblxyXG5cdFx0bGV0IHN0YXRpY1ZhbyA9IHRydWU7XHJcblxyXG5cdFx0Z2wuYmluZFZlcnRleEFycmF5KCB2YW9HUFUgKTtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbIGkgXTtcclxuXHRcdFx0Y29uc3QgYXR0cmlidXRlRGF0YSA9IHRoaXMuZ2V0KCBhdHRyaWJ1dGUgKTtcclxuXHJcblx0XHRcdGtleSArPSAnOicgKyBhdHRyaWJ1dGVEYXRhLmlkO1xyXG5cclxuXHRcdFx0Z2wuYmluZEJ1ZmZlciggZ2wuQVJSQVlfQlVGRkVSLCBhdHRyaWJ1dGVEYXRhLmJ1ZmZlckdQVSApO1xyXG5cdFx0XHRnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSggaSApO1xyXG5cclxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUuaXNTdG9yYWdlQnVmZmVyQXR0cmlidXRlIHx8IGF0dHJpYnV0ZS5pc1N0b3JhZ2VJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUgKSBzdGF0aWNWYW8gPSBmYWxzZTtcclxuXHJcblx0XHRcdGxldCBzdHJpZGUsIG9mZnNldDtcclxuXHJcblx0XHRcdGlmICggYXR0cmlidXRlLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdHN0cmlkZSA9IGF0dHJpYnV0ZS5kYXRhLnN0cmlkZSAqIGF0dHJpYnV0ZURhdGEuYnl0ZXNQZXJFbGVtZW50O1xyXG5cdFx0XHRcdG9mZnNldCA9IGF0dHJpYnV0ZS5vZmZzZXQgKiBhdHRyaWJ1dGVEYXRhLmJ5dGVzUGVyRWxlbWVudDtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdHN0cmlkZSA9IDA7XHJcblx0XHRcdFx0b2Zmc2V0ID0gMDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggYXR0cmlidXRlRGF0YS5pc0ludGVnZXIgKSB7XHJcblxyXG5cdFx0XHRcdGdsLnZlcnRleEF0dHJpYklQb2ludGVyKCBpLCBhdHRyaWJ1dGUuaXRlbVNpemUsIGF0dHJpYnV0ZURhdGEudHlwZSwgc3RyaWRlLCBvZmZzZXQgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoIGksIGF0dHJpYnV0ZS5pdGVtU2l6ZSwgYXR0cmlidXRlRGF0YS50eXBlLCBhdHRyaWJ1dGUubm9ybWFsaXplZCwgc3RyaWRlLCBvZmZzZXQgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggYXR0cmlidXRlLmlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlICYmICEgYXR0cmlidXRlLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgKSB7XHJcblxyXG5cdFx0XHRcdGdsLnZlcnRleEF0dHJpYkRpdmlzb3IoIGksIGF0dHJpYnV0ZS5tZXNoUGVyQXR0cmlidXRlICk7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBhdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSAmJiBhdHRyaWJ1dGUuZGF0YS5pc0luc3RhbmNlZEludGVybGVhdmVkQnVmZmVyICkge1xyXG5cclxuXHRcdFx0XHRnbC52ZXJ0ZXhBdHRyaWJEaXZpc29yKCBpLCBhdHRyaWJ1dGUuZGF0YS5tZXNoUGVyQXR0cmlidXRlICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGdsLmJpbmRCdWZmZXIoIGdsLkFSUkFZX0JVRkZFUiwgbnVsbCApO1xyXG5cclxuXHRcdHRoaXMudmFvQ2FjaGVbIGtleSBdID0gdmFvR1BVO1xyXG5cclxuXHRcdHJldHVybiB7IHZhb0dQVSwgc3RhdGljVmFvIH07XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyBhIHRyYW5zZm9ybSBmZWVkYmFjayBmcm9tIHRoZSBnaXZlbiB0cmFuc2Zvcm0gYnVmZmVycy5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtBcnJheTxEdWFsQXR0cmlidXRlRGF0YT59IHRyYW5zZm9ybUJ1ZmZlcnMgLSBUaGUgdHJhbnNmb3JtIGJ1ZmZlcnMuXHJcblx0ICogQHJldHVybiB7V2ViR0xUcmFuc2Zvcm1GZWVkYmFja30gVGhlIHRyYW5zZm9ybSBmZWVkYmFjay5cclxuXHQgKi9cclxuXHRfZ2V0VHJhbnNmb3JtRmVlZGJhY2soIHRyYW5zZm9ybUJ1ZmZlcnMgKSB7XHJcblxyXG5cdFx0bGV0IGtleSA9ICcnO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHRyYW5zZm9ybUJ1ZmZlcnMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0a2V5ICs9ICc6JyArIHRyYW5zZm9ybUJ1ZmZlcnNbIGkgXS5pZDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0bGV0IHRyYW5zZm9ybUZlZWRiYWNrR1BVID0gdGhpcy50cmFuc2Zvcm1GZWVkYmFja0NhY2hlWyBrZXkgXTtcclxuXHJcblx0XHRpZiAoIHRyYW5zZm9ybUZlZWRiYWNrR1BVICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gdHJhbnNmb3JtRmVlZGJhY2tHUFU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHsgZ2wgfSA9IHRoaXM7XHJcblxyXG5cdFx0dHJhbnNmb3JtRmVlZGJhY2tHUFUgPSBnbC5jcmVhdGVUcmFuc2Zvcm1GZWVkYmFjaygpO1xyXG5cclxuXHRcdGdsLmJpbmRUcmFuc2Zvcm1GZWVkYmFjayggZ2wuVFJBTlNGT1JNX0ZFRURCQUNLLCB0cmFuc2Zvcm1GZWVkYmFja0dQVSApO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHRyYW5zZm9ybUJ1ZmZlcnMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYXR0cmlidXRlRGF0YSA9IHRyYW5zZm9ybUJ1ZmZlcnNbIGkgXTtcclxuXHJcblx0XHRcdGdsLmJpbmRCdWZmZXJCYXNlKCBnbC5UUkFOU0ZPUk1fRkVFREJBQ0tfQlVGRkVSLCBpLCBhdHRyaWJ1dGVEYXRhLnRyYW5zZm9ybUJ1ZmZlciApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRnbC5iaW5kVHJhbnNmb3JtRmVlZGJhY2soIGdsLlRSQU5TRk9STV9GRUVEQkFDSywgbnVsbCApO1xyXG5cclxuXHRcdHRoaXMudHJhbnNmb3JtRmVlZGJhY2tDYWNoZVsga2V5IF0gPSB0cmFuc2Zvcm1GZWVkYmFja0dQVTtcclxuXHJcblx0XHRyZXR1cm4gdHJhbnNmb3JtRmVlZGJhY2tHUFU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0dXBzIHRoZSBnaXZlbiBiaW5kaW5ncy5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtBcnJheTxCaW5kR3JvdXA+fSBiaW5kaW5ncyAtIFRoZSBiaW5kaW5ncy5cclxuXHQgKiBAcGFyYW0ge1dlYkdMUHJvZ3JhbX0gcHJvZ3JhbUdQVSAtIFRoZSBXZWJHTCBwcm9ncmFtLlxyXG5cdCAqL1xyXG5cdF9zZXR1cEJpbmRpbmdzKCBiaW5kaW5ncywgcHJvZ3JhbUdQVSApIHtcclxuXHJcblx0XHRjb25zdCBnbCA9IHRoaXMuZ2w7XHJcblxyXG5cdFx0Zm9yICggY29uc3QgYmluZEdyb3VwIG9mIGJpbmRpbmdzICkge1xyXG5cclxuXHRcdFx0Zm9yICggY29uc3QgYmluZGluZyBvZiBiaW5kR3JvdXAuYmluZGluZ3MgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGJpbmRpbmdEYXRhID0gdGhpcy5nZXQoIGJpbmRpbmcgKTtcclxuXHRcdFx0XHRjb25zdCBpbmRleCA9IGJpbmRpbmdEYXRhLmluZGV4O1xyXG5cclxuXHRcdFx0XHRpZiAoIGJpbmRpbmcuaXNVbmlmb3Jtc0dyb3VwIHx8IGJpbmRpbmcuaXNVbmlmb3JtQnVmZmVyICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGxvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUJsb2NrSW5kZXgoIHByb2dyYW1HUFUsIGJpbmRpbmcubmFtZSApO1xyXG5cdFx0XHRcdFx0Z2wudW5pZm9ybUJsb2NrQmluZGluZyggcHJvZ3JhbUdQVSwgbG9jYXRpb24sIGluZGV4ICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGJpbmRpbmcuaXNTYW1wbGVkVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBsb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbUdQVSwgYmluZGluZy5uYW1lICk7XHJcblx0XHRcdFx0XHRnbC51bmlmb3JtMWkoIGxvY2F0aW9uLCBpbmRleCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEJpbmRzIHRoZSBnaXZlbiB1bmlmb3Jtcy5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtBcnJheTxCaW5kR3JvdXA+fSBiaW5kaW5ncyAtIFRoZSBiaW5kaW5ncy5cclxuXHQgKi9cclxuXHRfYmluZFVuaWZvcm1zKCBiaW5kaW5ncyApIHtcclxuXHJcblx0XHRjb25zdCB7IGdsLCBzdGF0ZSB9ID0gdGhpcztcclxuXHJcblx0XHRmb3IgKCBjb25zdCBiaW5kR3JvdXAgb2YgYmluZGluZ3MgKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBjb25zdCBiaW5kaW5nIG9mIGJpbmRHcm91cC5iaW5kaW5ncyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgYmluZGluZ0RhdGEgPSB0aGlzLmdldCggYmluZGluZyApO1xyXG5cdFx0XHRcdGNvbnN0IGluZGV4ID0gYmluZGluZ0RhdGEuaW5kZXg7XHJcblxyXG5cdFx0XHRcdGlmICggYmluZGluZy5pc1VuaWZvcm1zR3JvdXAgfHwgYmluZGluZy5pc1VuaWZvcm1CdWZmZXIgKSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gVE9ETyBVU0UgYmluZEJ1ZmZlclJhbmdlIHRvIGdyb3VwIG11bHRpcGxlIHVuaWZvcm0gYnVmZmVyc1xyXG5cdFx0XHRcdFx0c3RhdGUuYmluZEJ1ZmZlckJhc2UoIGdsLlVOSUZPUk1fQlVGRkVSLCBpbmRleCwgYmluZGluZ0RhdGEuYnVmZmVyR1BVICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGJpbmRpbmcuaXNTYW1wbGVkVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggYmluZGluZ0RhdGEuZ2xUZXh0dXJlVHlwZSwgYmluZGluZ0RhdGEudGV4dHVyZUdQVSwgZ2wuVEVYVFVSRTAgKyBpbmRleCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBgV0VCR0xfbXVsdGlzYW1wbGVkX3JlbmRlcl90b190ZXh0dXJlYCBleHRlbnNpb25cclxuXHQgKiBzaG91bGQgYmUgdXNlZCB3aGVuIE1TQUEgaXMgZW5hYmxlZC5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtSZW5kZXJUYXJnZXR9IHJlbmRlclRhcmdldCAtIFRoZSByZW5kZXIgdGFyZ2V0IHRoYXQgc2hvdWxkIGJlIG11bHRpc2FtcGxlZC5cclxuXHQgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRvIHVzZSB0aGUgYFdFQkdMX211bHRpc2FtcGxlZF9yZW5kZXJfdG9fdGV4dHVyZWAgZXh0ZW5zaW9uIGZvciBNU0FBIG9yIG5vdC5cclxuXHQgKi9cclxuXHRfdXNlTXVsdGlzYW1wbGVkUlRUKCByZW5kZXJUYXJnZXQgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHJlbmRlclRhcmdldC5zYW1wbGVzID4gMCAmJiB0aGlzLmV4dGVuc2lvbnMuaGFzKCAnV0VCR0xfbXVsdGlzYW1wbGVkX3JlbmRlcl90b190ZXh0dXJlJyApID09PSB0cnVlICYmIHJlbmRlclRhcmdldC5hdXRvQWxsb2NhdGVEZXB0aEJ1ZmZlciAhPT0gZmFsc2U7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRnJlZXMgaW50ZXJuYWwgcmVzb3VyY2VzLlxyXG5cdCAqL1xyXG5cdGRpc3Bvc2UoKSB7XHJcblxyXG5cdFx0Y29uc3QgZXh0ZW5zaW9uID0gdGhpcy5leHRlbnNpb25zLmdldCggJ1dFQkdMX2xvc2VfY29udGV4dCcgKTtcclxuXHRcdGlmICggZXh0ZW5zaW9uICkgZXh0ZW5zaW9uLmxvc2VDb250ZXh0KCk7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICd3ZWJnbGNvbnRleHRsb3N0JywgdGhpcy5fb25Db250ZXh0TG9zdCApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBXZWJHTEJhY2tlbmQ7XHJcbiIsImV4cG9ydCBjb25zdCBHUFVQcmltaXRpdmVUb3BvbG9neSA9IHtcclxuXHRQb2ludExpc3Q6ICdwb2ludC1saXN0JyxcclxuXHRMaW5lTGlzdDogJ2xpbmUtbGlzdCcsXHJcblx0TGluZVN0cmlwOiAnbGluZS1zdHJpcCcsXHJcblx0VHJpYW5nbGVMaXN0OiAndHJpYW5nbGUtbGlzdCcsXHJcblx0VHJpYW5nbGVTdHJpcDogJ3RyaWFuZ2xlLXN0cmlwJyxcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBHUFVDb21wYXJlRnVuY3Rpb24gPSB7XHJcblx0TmV2ZXI6ICduZXZlcicsXHJcblx0TGVzczogJ2xlc3MnLFxyXG5cdEVxdWFsOiAnZXF1YWwnLFxyXG5cdExlc3NFcXVhbDogJ2xlc3MtZXF1YWwnLFxyXG5cdEdyZWF0ZXI6ICdncmVhdGVyJyxcclxuXHROb3RFcXVhbDogJ25vdC1lcXVhbCcsXHJcblx0R3JlYXRlckVxdWFsOiAnZ3JlYXRlci1lcXVhbCcsXHJcblx0QWx3YXlzOiAnYWx3YXlzJ1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IEdQVVN0b3JlT3AgPSB7XHJcblx0U3RvcmU6ICdzdG9yZScsXHJcblx0RGlzY2FyZDogJ2Rpc2NhcmQnXHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgR1BVTG9hZE9wID0ge1xyXG5cdExvYWQ6ICdsb2FkJyxcclxuXHRDbGVhcjogJ2NsZWFyJ1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IEdQVUZyb250RmFjZSA9IHtcclxuXHRDQ1c6ICdjY3cnLFxyXG5cdENXOiAnY3cnXHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgR1BVQ3VsbE1vZGUgPSB7XHJcblx0Tm9uZTogJ25vbmUnLFxyXG5cdEZyb250OiAnZnJvbnQnLFxyXG5cdEJhY2s6ICdiYWNrJ1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IEdQVUluZGV4Rm9ybWF0ID0ge1xyXG5cdFVpbnQxNjogJ3VpbnQxNicsXHJcblx0VWludDMyOiAndWludDMyJ1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IEdQVVZlcnRleEZvcm1hdCA9IHtcclxuXHRVaW50OHgyOiAndWludDh4MicsXHJcblx0VWludDh4NDogJ3VpbnQ4eDQnLFxyXG5cdFNpbnQ4eDI6ICdzaW50OHgyJyxcclxuXHRTaW50OHg0OiAnc2ludDh4NCcsXHJcblx0VW5vcm04eDI6ICd1bm9ybTh4MicsXHJcblx0VW5vcm04eDQ6ICd1bm9ybTh4NCcsXHJcblx0U25vcm04eDI6ICdzbm9ybTh4MicsXHJcblx0U25vcm04eDQ6ICdzbm9ybTh4NCcsXHJcblx0VWludDE2eDI6ICd1aW50MTZ4MicsXHJcblx0VWludDE2eDQ6ICd1aW50MTZ4NCcsXHJcblx0U2ludDE2eDI6ICdzaW50MTZ4MicsXHJcblx0U2ludDE2eDQ6ICdzaW50MTZ4NCcsXHJcblx0VW5vcm0xNngyOiAndW5vcm0xNngyJyxcclxuXHRVbm9ybTE2eDQ6ICd1bm9ybTE2eDQnLFxyXG5cdFNub3JtMTZ4MjogJ3Nub3JtMTZ4MicsXHJcblx0U25vcm0xNng0OiAnc25vcm0xNng0JyxcclxuXHRGbG9hdDE2eDI6ICdmbG9hdDE2eDInLFxyXG5cdEZsb2F0MTZ4NDogJ2Zsb2F0MTZ4NCcsXHJcblx0RmxvYXQzMjogJ2Zsb2F0MzInLFxyXG5cdEZsb2F0MzJ4MjogJ2Zsb2F0MzJ4MicsXHJcblx0RmxvYXQzMngzOiAnZmxvYXQzMngzJyxcclxuXHRGbG9hdDMyeDQ6ICdmbG9hdDMyeDQnLFxyXG5cdFVpbnQzMjogJ3VpbnQzMicsXHJcblx0VWludDMyeDI6ICd1aW50MzJ4MicsXHJcblx0VWludDMyeDM6ICd1aW50MzJ4MycsXHJcblx0VWludDMyeDQ6ICd1aW50MzJ4NCcsXHJcblx0U2ludDMyOiAnc2ludDMyJyxcclxuXHRTaW50MzJ4MjogJ3NpbnQzMngyJyxcclxuXHRTaW50MzJ4MzogJ3NpbnQzMngzJyxcclxuXHRTaW50MzJ4NDogJ3NpbnQzMng0J1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IEdQVVRleHR1cmVGb3JtYXQgPSB7XHJcblxyXG5cdC8vIDgtYml0IGZvcm1hdHNcclxuXHJcblx0UjhVbm9ybTogJ3I4dW5vcm0nLFxyXG5cdFI4U25vcm06ICdyOHNub3JtJyxcclxuXHRSOFVpbnQ6ICdyOHVpbnQnLFxyXG5cdFI4U2ludDogJ3I4c2ludCcsXHJcblxyXG5cdC8vIDE2LWJpdCBmb3JtYXRzXHJcblxyXG5cdFIxNlVpbnQ6ICdyMTZ1aW50JyxcclxuXHRSMTZTaW50OiAncjE2c2ludCcsXHJcblx0UjE2RmxvYXQ6ICdyMTZmbG9hdCcsXHJcblx0Ukc4VW5vcm06ICdyZzh1bm9ybScsXHJcblx0Ukc4U25vcm06ICdyZzhzbm9ybScsXHJcblx0Ukc4VWludDogJ3JnOHVpbnQnLFxyXG5cdFJHOFNpbnQ6ICdyZzhzaW50JyxcclxuXHJcblx0Ly8gMzItYml0IGZvcm1hdHNcclxuXHJcblx0UjMyVWludDogJ3IzMnVpbnQnLFxyXG5cdFIzMlNpbnQ6ICdyMzJzaW50JyxcclxuXHRSMzJGbG9hdDogJ3IzMmZsb2F0JyxcclxuXHRSRzE2VWludDogJ3JnMTZ1aW50JyxcclxuXHRSRzE2U2ludDogJ3JnMTZzaW50JyxcclxuXHRSRzE2RmxvYXQ6ICdyZzE2ZmxvYXQnLFxyXG5cdFJHQkE4VW5vcm06ICdyZ2JhOHVub3JtJyxcclxuXHRSR0JBOFVub3JtU1JHQjogJ3JnYmE4dW5vcm0tc3JnYicsXHJcblx0UkdCQThTbm9ybTogJ3JnYmE4c25vcm0nLFxyXG5cdFJHQkE4VWludDogJ3JnYmE4dWludCcsXHJcblx0UkdCQThTaW50OiAncmdiYThzaW50JyxcclxuXHRCR1JBOFVub3JtOiAnYmdyYTh1bm9ybScsXHJcblx0QkdSQThVbm9ybVNSR0I6ICdiZ3JhOHVub3JtLXNyZ2InLFxyXG5cdC8vIFBhY2tlZCAzMi1iaXQgZm9ybWF0c1xyXG5cdFJHQjlFNVVGbG9hdDogJ3JnYjllNXVmbG9hdCcsXHJcblx0UkdCMTBBMlVub3JtOiAncmdiMTBhMnVub3JtJyxcclxuXHRSRzExQjEwVUZsb2F0OiAncmdiMTBhMnVub3JtJyxcclxuXHJcblx0Ly8gNjQtYml0IGZvcm1hdHNcclxuXHJcblx0UkczMlVpbnQ6ICdyZzMydWludCcsXHJcblx0UkczMlNpbnQ6ICdyZzMyc2ludCcsXHJcblx0UkczMkZsb2F0OiAncmczMmZsb2F0JyxcclxuXHRSR0JBMTZVaW50OiAncmdiYTE2dWludCcsXHJcblx0UkdCQTE2U2ludDogJ3JnYmExNnNpbnQnLFxyXG5cdFJHQkExNkZsb2F0OiAncmdiYTE2ZmxvYXQnLFxyXG5cclxuXHQvLyAxMjgtYml0IGZvcm1hdHNcclxuXHJcblx0UkdCQTMyVWludDogJ3JnYmEzMnVpbnQnLFxyXG5cdFJHQkEzMlNpbnQ6ICdyZ2JhMzJzaW50JyxcclxuXHRSR0JBMzJGbG9hdDogJ3JnYmEzMmZsb2F0JyxcclxuXHJcblx0Ly8gRGVwdGggYW5kIHN0ZW5jaWwgZm9ybWF0c1xyXG5cclxuXHRTdGVuY2lsODogJ3N0ZW5jaWw4JyxcclxuXHREZXB0aDE2VW5vcm06ICdkZXB0aDE2dW5vcm0nLFxyXG5cdERlcHRoMjRQbHVzOiAnZGVwdGgyNHBsdXMnLFxyXG5cdERlcHRoMjRQbHVzU3RlbmNpbDg6ICdkZXB0aDI0cGx1cy1zdGVuY2lsOCcsXHJcblx0RGVwdGgzMkZsb2F0OiAnZGVwdGgzMmZsb2F0JyxcclxuXHJcblx0Ly8gJ2RlcHRoMzJmbG9hdC1zdGVuY2lsOCcgZXh0ZW5zaW9uXHJcblxyXG5cdERlcHRoMzJGbG9hdFN0ZW5jaWw4OiAnZGVwdGgzMmZsb2F0LXN0ZW5jaWw4JyxcclxuXHJcblx0Ly8gQkMgY29tcHJlc3NlZCBmb3JtYXRzIHVzYWJsZSBpZiAndGV4dHVyZS1jb21wcmVzc2lvbi1iYycgaXMgYm90aFxyXG5cdC8vIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlL3VzZXIgYWdlbnQgYW5kIGVuYWJsZWQgaW4gcmVxdWVzdERldmljZS5cclxuXHJcblx0QkMxUkdCQVVub3JtOiAnYmMxLXJnYmEtdW5vcm0nLFxyXG5cdEJDMVJHQkFVbm9ybVNSR0I6ICdiYzEtcmdiYS11bm9ybS1zcmdiJyxcclxuXHRCQzJSR0JBVW5vcm06ICdiYzItcmdiYS11bm9ybScsXHJcblx0QkMyUkdCQVVub3JtU1JHQjogJ2JjMi1yZ2JhLXVub3JtLXNyZ2InLFxyXG5cdEJDM1JHQkFVbm9ybTogJ2JjMy1yZ2JhLXVub3JtJyxcclxuXHRCQzNSR0JBVW5vcm1TUkdCOiAnYmMzLXJnYmEtdW5vcm0tc3JnYicsXHJcblx0QkM0UlVub3JtOiAnYmM0LXItdW5vcm0nLFxyXG5cdEJDNFJTbm9ybTogJ2JjNC1yLXNub3JtJyxcclxuXHRCQzVSR1Vub3JtOiAnYmM1LXJnLXVub3JtJyxcclxuXHRCQzVSR1Nub3JtOiAnYmM1LXJnLXNub3JtJyxcclxuXHRCQzZIUkdCVUZsb2F0OiAnYmM2aC1yZ2ItdWZsb2F0JyxcclxuXHRCQzZIUkdCRmxvYXQ6ICdiYzZoLXJnYi1mbG9hdCcsXHJcblx0QkM3UkdCQVVub3JtOiAnYmM3LXJnYmEtdW5vcm0nLFxyXG5cdEJDN1JHQkFVbm9ybVNSR0I6ICdiYzctcmdiYS1zcmdiJyxcclxuXHJcblx0Ly8gRVRDMiBjb21wcmVzc2VkIGZvcm1hdHMgdXNhYmxlIGlmICd0ZXh0dXJlLWNvbXByZXNzaW9uLWV0YzInIGlzIGJvdGhcclxuXHQvLyBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZS91c2VyIGFnZW50IGFuZCBlbmFibGVkIGluIHJlcXVlc3REZXZpY2UuXHJcblxyXG5cdEVUQzJSR0I4VW5vcm06ICdldGMyLXJnYjh1bm9ybScsXHJcblx0RVRDMlJHQjhVbm9ybVNSR0I6ICdldGMyLXJnYjh1bm9ybS1zcmdiJyxcclxuXHRFVEMyUkdCOEExVW5vcm06ICdldGMyLXJnYjhhMXVub3JtJyxcclxuXHRFVEMyUkdCOEExVW5vcm1TUkdCOiAnZXRjMi1yZ2I4YTF1bm9ybS1zcmdiJyxcclxuXHRFVEMyUkdCQThVbm9ybTogJ2V0YzItcmdiYTh1bm9ybScsXHJcblx0RVRDMlJHQkE4VW5vcm1TUkdCOiAnZXRjMi1yZ2JhOHVub3JtLXNyZ2InLFxyXG5cdEVBQ1IxMVVub3JtOiAnZWFjLXIxMXVub3JtJyxcclxuXHRFQUNSMTFTbm9ybTogJ2VhYy1yMTFzbm9ybScsXHJcblx0RUFDUkcxMVVub3JtOiAnZWFjLXJnMTF1bm9ybScsXHJcblx0RUFDUkcxMVNub3JtOiAnZWFjLXJnMTFzbm9ybScsXHJcblxyXG5cdC8vIEFTVEMgY29tcHJlc3NlZCBmb3JtYXRzIHVzYWJsZSBpZiAndGV4dHVyZS1jb21wcmVzc2lvbi1hc3RjJyBpcyBib3RoXHJcblx0Ly8gc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UvdXNlciBhZ2VudCBhbmQgZW5hYmxlZCBpbiByZXF1ZXN0RGV2aWNlLlxyXG5cclxuXHRBU1RDNHg0VW5vcm06ICdhc3RjLTR4NC11bm9ybScsXHJcblx0QVNUQzR4NFVub3JtU1JHQjogJ2FzdGMtNHg0LXVub3JtLXNyZ2InLFxyXG5cdEFTVEM1eDRVbm9ybTogJ2FzdGMtNXg0LXVub3JtJyxcclxuXHRBU1RDNXg0VW5vcm1TUkdCOiAnYXN0Yy01eDQtdW5vcm0tc3JnYicsXHJcblx0QVNUQzV4NVVub3JtOiAnYXN0Yy01eDUtdW5vcm0nLFxyXG5cdEFTVEM1eDVVbm9ybVNSR0I6ICdhc3RjLTV4NS11bm9ybS1zcmdiJyxcclxuXHRBU1RDNng1VW5vcm06ICdhc3RjLTZ4NS11bm9ybScsXHJcblx0QVNUQzZ4NVVub3JtU1JHQjogJ2FzdGMtNng1LXVub3JtLXNyZ2InLFxyXG5cdEFTVEM2eDZVbm9ybTogJ2FzdGMtNng2LXVub3JtJyxcclxuXHRBU1RDNng2VW5vcm1TUkdCOiAnYXN0Yy02eDYtdW5vcm0tc3JnYicsXHJcblx0QVNUQzh4NVVub3JtOiAnYXN0Yy04eDUtdW5vcm0nLFxyXG5cdEFTVEM4eDVVbm9ybVNSR0I6ICdhc3RjLTh4NS11bm9ybS1zcmdiJyxcclxuXHRBU1RDOHg2VW5vcm06ICdhc3RjLTh4Ni11bm9ybScsXHJcblx0QVNUQzh4NlVub3JtU1JHQjogJ2FzdGMtOHg2LXVub3JtLXNyZ2InLFxyXG5cdEFTVEM4eDhVbm9ybTogJ2FzdGMtOHg4LXVub3JtJyxcclxuXHRBU1RDOHg4VW5vcm1TUkdCOiAnYXN0Yy04eDgtdW5vcm0tc3JnYicsXHJcblx0QVNUQzEweDVVbm9ybTogJ2FzdGMtMTB4NS11bm9ybScsXHJcblx0QVNUQzEweDVVbm9ybVNSR0I6ICdhc3RjLTEweDUtdW5vcm0tc3JnYicsXHJcblx0QVNUQzEweDZVbm9ybTogJ2FzdGMtMTB4Ni11bm9ybScsXHJcblx0QVNUQzEweDZVbm9ybVNSR0I6ICdhc3RjLTEweDYtdW5vcm0tc3JnYicsXHJcblx0QVNUQzEweDhVbm9ybTogJ2FzdGMtMTB4OC11bm9ybScsXHJcblx0QVNUQzEweDhVbm9ybVNSR0I6ICdhc3RjLTEweDgtdW5vcm0tc3JnYicsXHJcblx0QVNUQzEweDEwVW5vcm06ICdhc3RjLTEweDEwLXVub3JtJyxcclxuXHRBU1RDMTB4MTBVbm9ybVNSR0I6ICdhc3RjLTEweDEwLXVub3JtLXNyZ2InLFxyXG5cdEFTVEMxMngxMFVub3JtOiAnYXN0Yy0xMngxMC11bm9ybScsXHJcblx0QVNUQzEyeDEwVW5vcm1TUkdCOiAnYXN0Yy0xMngxMC11bm9ybS1zcmdiJyxcclxuXHRBU1RDMTJ4MTJVbm9ybTogJ2FzdGMtMTJ4MTItdW5vcm0nLFxyXG5cdEFTVEMxMngxMlVub3JtU1JHQjogJ2FzdGMtMTJ4MTItdW5vcm0tc3JnYicsXHJcblxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IEdQVUFkZHJlc3NNb2RlID0ge1xyXG5cdENsYW1wVG9FZGdlOiAnY2xhbXAtdG8tZWRnZScsXHJcblx0UmVwZWF0OiAncmVwZWF0JyxcclxuXHRNaXJyb3JSZXBlYXQ6ICdtaXJyb3ItcmVwZWF0J1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IEdQVUZpbHRlck1vZGUgPSB7XHJcblx0TGluZWFyOiAnbGluZWFyJyxcclxuXHROZWFyZXN0OiAnbmVhcmVzdCdcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBHUFVCbGVuZEZhY3RvciA9IHtcclxuXHRaZXJvOiAnemVybycsXHJcblx0T25lOiAnb25lJyxcclxuXHRTcmM6ICdzcmMnLFxyXG5cdE9uZU1pbnVzU3JjOiAnb25lLW1pbnVzLXNyYycsXHJcblx0U3JjQWxwaGE6ICdzcmMtYWxwaGEnLFxyXG5cdE9uZU1pbnVzU3JjQWxwaGE6ICdvbmUtbWludXMtc3JjLWFscGhhJyxcclxuXHREc3Q6ICdkc3QnLFxyXG5cdE9uZU1pbnVzRHN0Q29sb3I6ICdvbmUtbWludXMtZHN0JyxcclxuXHREc3RBbHBoYTogJ2RzdC1hbHBoYScsXHJcblx0T25lTWludXNEc3RBbHBoYTogJ29uZS1taW51cy1kc3QtYWxwaGEnLFxyXG5cdFNyY0FscGhhU2F0dXJhdGVkOiAnc3JjLWFscGhhLXNhdHVyYXRlZCcsXHJcblx0Q29uc3RhbnQ6ICdjb25zdGFudCcsXHJcblx0T25lTWludXNDb25zdGFudDogJ29uZS1taW51cy1jb25zdGFudCdcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBHUFVCbGVuZE9wZXJhdGlvbiA9IHtcclxuXHRBZGQ6ICdhZGQnLFxyXG5cdFN1YnRyYWN0OiAnc3VidHJhY3QnLFxyXG5cdFJldmVyc2VTdWJ0cmFjdDogJ3JldmVyc2Utc3VidHJhY3QnLFxyXG5cdE1pbjogJ21pbicsXHJcblx0TWF4OiAnbWF4J1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IEdQVUNvbG9yV3JpdGVGbGFncyA9IHtcclxuXHROb25lOiAwLFxyXG5cdFJlZDogMHgxLFxyXG5cdEdyZWVuOiAweDIsXHJcblx0Qmx1ZTogMHg0LFxyXG5cdEFscGhhOiAweDgsXHJcblx0QWxsOiAweEZcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBHUFVTdGVuY2lsT3BlcmF0aW9uID0ge1xyXG5cdEtlZXA6ICdrZWVwJyxcclxuXHRaZXJvOiAnemVybycsXHJcblx0UmVwbGFjZTogJ3JlcGxhY2UnLFxyXG5cdEludmVydDogJ2ludmVydCcsXHJcblx0SW5jcmVtZW50Q2xhbXA6ICdpbmNyZW1lbnQtY2xhbXAnLFxyXG5cdERlY3JlbWVudENsYW1wOiAnZGVjcmVtZW50LWNsYW1wJyxcclxuXHRJbmNyZW1lbnRXcmFwOiAnaW5jcmVtZW50LXdyYXAnLFxyXG5cdERlY3JlbWVudFdyYXA6ICdkZWNyZW1lbnQtd3JhcCdcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBHUFVCdWZmZXJCaW5kaW5nVHlwZSA9IHtcclxuXHRVbmlmb3JtOiAndW5pZm9ybScsXHJcblx0U3RvcmFnZTogJ3N0b3JhZ2UnLFxyXG5cdFJlYWRPbmx5U3RvcmFnZTogJ3JlYWQtb25seS1zdG9yYWdlJ1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IEdQVVN0b3JhZ2VUZXh0dXJlQWNjZXNzID0ge1xyXG5cdFdyaXRlT25seTogJ3dyaXRlLW9ubHknLFxyXG5cdFJlYWRPbmx5OiAncmVhZC1vbmx5JyxcclxuXHRSZWFkV3JpdGU6ICdyZWFkLXdyaXRlJyxcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBHUFVTYW1wbGVyQmluZGluZ1R5cGUgPSB7XHJcblx0RmlsdGVyaW5nOiAnZmlsdGVyaW5nJyxcclxuXHROb25GaWx0ZXJpbmc6ICdub24tZmlsdGVyaW5nJyxcclxuXHRDb21wYXJpc29uOiAnY29tcGFyaXNvbidcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBHUFVUZXh0dXJlU2FtcGxlVHlwZSA9IHtcclxuXHRGbG9hdDogJ2Zsb2F0JyxcclxuXHRVbmZpbHRlcmFibGVGbG9hdDogJ3VuZmlsdGVyYWJsZS1mbG9hdCcsXHJcblx0RGVwdGg6ICdkZXB0aCcsXHJcblx0U0ludDogJ3NpbnQnLFxyXG5cdFVJbnQ6ICd1aW50J1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IEdQVVRleHR1cmVEaW1lbnNpb24gPSB7XHJcblx0T25lRDogJzFkJyxcclxuXHRUd29EOiAnMmQnLFxyXG5cdFRocmVlRDogJzNkJ1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IEdQVVRleHR1cmVWaWV3RGltZW5zaW9uID0ge1xyXG5cdE9uZUQ6ICcxZCcsXHJcblx0VHdvRDogJzJkJyxcclxuXHRUd29EQXJyYXk6ICcyZC1hcnJheScsXHJcblx0Q3ViZTogJ2N1YmUnLFxyXG5cdEN1YmVBcnJheTogJ2N1YmUtYXJyYXknLFxyXG5cdFRocmVlRDogJzNkJ1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IEdQVVRleHR1cmVBc3BlY3QgPSB7XHJcblx0QWxsOiAnYWxsJyxcclxuXHRTdGVuY2lsT25seTogJ3N0ZW5jaWwtb25seScsXHJcblx0RGVwdGhPbmx5OiAnZGVwdGgtb25seSdcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBHUFVJbnB1dFN0ZXBNb2RlID0ge1xyXG5cdFZlcnRleDogJ3ZlcnRleCcsXHJcblx0SW5zdGFuY2U6ICdpbnN0YW5jZSdcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBHUFVGZWF0dXJlTmFtZSA9IHtcclxuXHREZXB0aENsaXBDb250cm9sOiAnZGVwdGgtY2xpcC1jb250cm9sJyxcclxuXHREZXB0aDMyRmxvYXRTdGVuY2lsODogJ2RlcHRoMzJmbG9hdC1zdGVuY2lsOCcsXHJcblx0VGV4dHVyZUNvbXByZXNzaW9uQkM6ICd0ZXh0dXJlLWNvbXByZXNzaW9uLWJjJyxcclxuXHRUZXh0dXJlQ29tcHJlc3Npb25FVEMyOiAndGV4dHVyZS1jb21wcmVzc2lvbi1ldGMyJyxcclxuXHRUZXh0dXJlQ29tcHJlc3Npb25BU1RDOiAndGV4dHVyZS1jb21wcmVzc2lvbi1hc3RjJyxcclxuXHRUaW1lc3RhbXBRdWVyeTogJ3RpbWVzdGFtcC1xdWVyeScsXHJcblx0SW5kaXJlY3RGaXJzdEluc3RhbmNlOiAnaW5kaXJlY3QtZmlyc3QtaW5zdGFuY2UnLFxyXG5cdFNoYWRlckYxNjogJ3NoYWRlci1mMTYnLFxyXG5cdFJHMTFCMTBVRmxvYXQ6ICdyZzExYjEwdWZsb2F0LXJlbmRlcmFibGUnLFxyXG5cdEJHUkE4VU5vcm1TdG9yYWdlOiAnYmdyYTh1bm9ybS1zdG9yYWdlJyxcclxuXHRGbG9hdDMyRmlsdGVyYWJsZTogJ2Zsb2F0MzItZmlsdGVyYWJsZScsXHJcblx0Q2xpcERpc3RhbmNlczogJ2NsaXAtZGlzdGFuY2VzJyxcclxuXHREdWFsU291cmNlQmxlbmRpbmc6ICdkdWFsLXNvdXJjZS1ibGVuZGluZycsXHJcblx0U3ViZ3JvdXBzOiAnc3ViZ3JvdXBzJ1xyXG59O1xyXG4iLCJpbXBvcnQgQmluZGluZyBmcm9tICcuL0JpbmRpbmcuanMnO1xyXG5cclxuLyoqXHJcbiAqIFJlcHJlc2VudHMgYSBzYW1wbGVyIGJpbmRpbmcgdHlwZS5cclxuICpcclxuICogQHByaXZhdGVcclxuICogQGF1Z21lbnRzIEJpbmRpbmdcclxuICovXHJcbmNsYXNzIFNhbXBsZXIgZXh0ZW5kcyBCaW5kaW5nIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBzYW1wbGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgc2FtcGxlcnMncyBuYW1lLlxyXG5cdCAqIEBwYXJhbSB7P1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZSB0aGlzIGJpbmRpbmcgaXMgcmVmZXJyaW5nIHRvLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBuYW1lLCB0ZXh0dXJlICkge1xyXG5cclxuXHRcdHN1cGVyKCBuYW1lICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdGV4dHVyZSB0aGUgc2FtcGxlciBpcyByZWZlcnJpbmcgdG8uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUgez9UZXh0dXJlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRleHR1cmUgPSB0ZXh0dXJlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGJpbmRpbmcncyB2ZXJzaW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMudmVyc2lvbiA9IHRleHR1cmUgPyB0ZXh0dXJlLnZlcnNpb24gOiAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1NhbXBsZXIgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTYW1wbGVyO1xyXG4iLCJpbXBvcnQgU2FtcGxlciBmcm9tICcuLi9TYW1wbGVyLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIHNwZWNpYWwgZm9ybSBvZiBzYW1wbGVyIGJpbmRpbmcgdHlwZS5cclxuICogSXQncyB0ZXh0dXJlIHZhbHVlIGlzIG1hbmFnZWQgYnkgYSBub2RlIG9iamVjdC5cclxuICpcclxuICogQHByaXZhdGVcclxuICogQGF1Z21lbnRzIFNhbXBsZXJcclxuICovXHJcbmNsYXNzIE5vZGVTYW1wbGVyIGV4dGVuZHMgU2FtcGxlciB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbm9kZS1iYXNlZCBzYW1wbGVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgc2FtcGxlcnMncyBuYW1lLlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZU5vZGV9IHRleHR1cmVOb2RlIC0gVGhlIHRleHR1cmUgbm9kZS5cclxuXHQgKiBAcGFyYW0ge1VuaWZvcm1Hcm91cE5vZGV9IGdyb3VwTm9kZSAtIFRoZSB1bmlmb3JtIGdyb3VwIG5vZGUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5hbWUsIHRleHR1cmVOb2RlLCBncm91cE5vZGUgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5hbWUsIHRleHR1cmVOb2RlID8gdGV4dHVyZU5vZGUudmFsdWUgOiBudWxsICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdGV4dHVyZSBub2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtUZXh0dXJlTm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50ZXh0dXJlTm9kZSA9IHRleHR1cmVOb2RlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHVuaWZvcm0gZ3JvdXAgbm9kZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VW5pZm9ybUdyb3VwTm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ncm91cE5vZGUgPSBncm91cE5vZGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgdGV4dHVyZSB2YWx1ZSBvZiB0aGlzIHNhbXBsZXIuXHJcblx0ICovXHJcblx0dXBkYXRlKCkge1xyXG5cclxuXHRcdHRoaXMudGV4dHVyZSA9IHRoaXMudGV4dHVyZU5vZGUudmFsdWU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IE5vZGVTYW1wbGVyO1xyXG4iLCJpbXBvcnQgQnVmZmVyIGZyb20gJy4vQnVmZmVyLmpzJztcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIGEgc3RvcmFnZSBidWZmZXIgYmluZGluZyB0eXBlLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAYXVnbWVudHMgQnVmZmVyXHJcbiAqL1xyXG5jbGFzcyBTdG9yYWdlQnVmZmVyIGV4dGVuZHMgQnVmZmVyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB1bmlmb3JtIGJ1ZmZlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIGJ1ZmZlcidzIG5hbWUuXHJcblx0ICogQHBhcmFtIHtCdWZmZXJBdHRyaWJ1dGV9IGF0dHJpYnV0ZSAtIFRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBuYW1lLCBhdHRyaWJ1dGUgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG5hbWUsIGF0dHJpYnV0ZSA/IGF0dHJpYnV0ZS5hcnJheSA6IG51bGwgKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtCdWZmZXJBdHRyaWJ1dGV9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYXR0cmlidXRlID0gYXR0cmlidXRlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc1N0b3JhZ2VCdWZmZXIgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTdG9yYWdlQnVmZmVyO1xyXG4iLCJpbXBvcnQgU3RvcmFnZUJ1ZmZlciBmcm9tICcuLi9TdG9yYWdlQnVmZmVyLmpzJztcclxuaW1wb3J0IHsgTm9kZUFjY2VzcyB9IGZyb20gJy4uLy4uLy4uL25vZGVzL2NvcmUvY29uc3RhbnRzLmpzJztcclxuXHJcbmxldCBfaWQgPSAwO1xyXG5cclxuLyoqXHJcbiAqIEEgc3BlY2lhbCBmb3JtIG9mIHN0b3JhZ2UgYnVmZmVyIGJpbmRpbmcgdHlwZS5cclxuICogSXQncyBidWZmZXIgdmFsdWUgaXMgbWFuYWdlZCBieSBhIG5vZGUgb2JqZWN0LlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAYXVnbWVudHMgU3RvcmFnZUJ1ZmZlclxyXG4gKi9cclxuY2xhc3MgTm9kZVN0b3JhZ2VCdWZmZXIgZXh0ZW5kcyBTdG9yYWdlQnVmZmVyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBub2RlLWJhc2VkIHN0b3JhZ2UgYnVmZmVyLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTdG9yYWdlQnVmZmVyTm9kZX0gbm9kZVVuaWZvcm0gLSBUaGUgc3RvcmFnZSBidWZmZXIgbm9kZS5cclxuXHQgKiBAcGFyYW0ge1VuaWZvcm1Hcm91cE5vZGV9IGdyb3VwTm9kZSAtIFRoZSB1bmlmb3JtIGdyb3VwIG5vZGUuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG5vZGVVbmlmb3JtLCBncm91cE5vZGUgKSB7XHJcblxyXG5cdFx0c3VwZXIoICdTdG9yYWdlQnVmZmVyXycgKyBfaWQgKyssIG5vZGVVbmlmb3JtID8gbm9kZVVuaWZvcm0udmFsdWUgOiBudWxsICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbm9kZSB1bmlmb3JtLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtTdG9yYWdlQnVmZmVyTm9kZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub2RlVW5pZm9ybSA9IG5vZGVVbmlmb3JtO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGFjY2VzcyB0eXBlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYWNjZXNzID0gbm9kZVVuaWZvcm0gPyBub2RlVW5pZm9ybS5hY2Nlc3MgOiBOb2RlQWNjZXNzLlJFQURfV1JJVEU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgdW5pZm9ybSBncm91cCBub2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtVbmlmb3JtR3JvdXBOb2RlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmdyb3VwTm9kZSA9IGdyb3VwTm9kZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgc3RvcmFnZSBidWZmZXIuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7QnVmZmVyQXR0cmlidXRlfVxyXG5cdCAqL1xyXG5cdGdldCBidWZmZXIoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubm9kZVVuaWZvcm0udmFsdWU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IE5vZGVTdG9yYWdlQnVmZmVyO1xyXG4iLCJpbXBvcnQgRGF0YU1hcCBmcm9tICcuLi8uLi9jb21tb24vRGF0YU1hcC5qcyc7XHJcbmltcG9ydCB7IEdQVVRleHR1cmVWaWV3RGltZW5zaW9uLCBHUFVJbmRleEZvcm1hdCwgR1BVRmlsdGVyTW9kZSwgR1BVUHJpbWl0aXZlVG9wb2xvZ3ksIEdQVUxvYWRPcCwgR1BVU3RvcmVPcCB9IGZyb20gJy4vV2ViR1BVQ29uc3RhbnRzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIFdlYkdQVSBiYWNrZW5kIHV0aWxpdHkgbW9kdWxlIHVzZWQgYnkge0BsaW5rIFdlYkdQVVRleHR1cmVVdGlsc30uXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5jbGFzcyBXZWJHUFVUZXh0dXJlUGFzc1V0aWxzIGV4dGVuZHMgRGF0YU1hcCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgdXRpbGl0eSBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0dQVURldmljZX0gZGV2aWNlIC0gVGhlIFdlYkdQVSBkZXZpY2UuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGRldmljZSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIFdlYkdQVSBkZXZpY2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0dQVURldmljZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kZXZpY2UgPSBkZXZpY2U7XHJcblxyXG5cdFx0Y29uc3QgbWlwbWFwVmVydGV4U291cmNlID0gYFxyXG5zdHJ1Y3QgVmFyeXNTdHJ1Y3Qge1xyXG5cdEBidWlsdGluKCBwb3NpdGlvbiApIFBvc2l0aW9uOiB2ZWM0PGYzMj4sXHJcblx0QGxvY2F0aW9uKCAwICkgdlRleCA6IHZlYzI8ZjMyPlxyXG59O1xyXG5cclxuQHZlcnRleFxyXG5mbiBtYWluKCBAYnVpbHRpbiggdmVydGV4X2luZGV4ICkgdmVydGV4SW5kZXggOiB1MzIgKSAtPiBWYXJ5c1N0cnVjdCB7XHJcblxyXG5cdHZhciBWYXJ5cyA6IFZhcnlzU3RydWN0O1xyXG5cclxuXHR2YXIgcG9zID0gYXJyYXk8IHZlYzI8ZjMyPiwgNCA+KFxyXG5cdFx0dmVjMjxmMzI+KCAtMS4wLCAgMS4wICksXHJcblx0XHR2ZWMyPGYzMj4oICAxLjAsICAxLjAgKSxcclxuXHRcdHZlYzI8ZjMyPiggLTEuMCwgLTEuMCApLFxyXG5cdFx0dmVjMjxmMzI+KCAgMS4wLCAtMS4wIClcclxuXHQpO1xyXG5cclxuXHR2YXIgdGV4ID0gYXJyYXk8IHZlYzI8ZjMyPiwgNCA+KFxyXG5cdFx0dmVjMjxmMzI+KCAwLjAsIDAuMCApLFxyXG5cdFx0dmVjMjxmMzI+KCAxLjAsIDAuMCApLFxyXG5cdFx0dmVjMjxmMzI+KCAwLjAsIDEuMCApLFxyXG5cdFx0dmVjMjxmMzI+KCAxLjAsIDEuMCApXHJcblx0KTtcclxuXHJcblx0VmFyeXMudlRleCA9IHRleFsgdmVydGV4SW5kZXggXTtcclxuXHRWYXJ5cy5Qb3NpdGlvbiA9IHZlYzQ8ZjMyPiggcG9zWyB2ZXJ0ZXhJbmRleCBdLCAwLjAsIDEuMCApO1xyXG5cclxuXHRyZXR1cm4gVmFyeXM7XHJcblxyXG59XHJcbmA7XHJcblxyXG5cdFx0Y29uc3QgbWlwbWFwRnJhZ21lbnRTb3VyY2UgPSBgXHJcbkBncm91cCggMCApIEBiaW5kaW5nKCAwIClcclxudmFyIGltZ1NhbXBsZXIgOiBzYW1wbGVyO1xyXG5cclxuQGdyb3VwKCAwICkgQGJpbmRpbmcoIDEgKVxyXG52YXIgaW1nIDogdGV4dHVyZV8yZDxmMzI+O1xyXG5cclxuQGZyYWdtZW50XHJcbmZuIG1haW4oIEBsb2NhdGlvbiggMCApIHZUZXggOiB2ZWMyPGYzMj4gKSAtPiBAbG9jYXRpb24oIDAgKSB2ZWM0PGYzMj4ge1xyXG5cclxuXHRyZXR1cm4gdGV4dHVyZVNhbXBsZSggaW1nLCBpbWdTYW1wbGVyLCB2VGV4ICk7XHJcblxyXG59XHJcbmA7XHJcblxyXG5cdFx0Y29uc3QgZmxpcFlGcmFnbWVudFNvdXJjZSA9IGBcclxuQGdyb3VwKCAwICkgQGJpbmRpbmcoIDAgKVxyXG52YXIgaW1nU2FtcGxlciA6IHNhbXBsZXI7XHJcblxyXG5AZ3JvdXAoIDAgKSBAYmluZGluZyggMSApXHJcbnZhciBpbWcgOiB0ZXh0dXJlXzJkPGYzMj47XHJcblxyXG5AZnJhZ21lbnRcclxuZm4gbWFpbiggQGxvY2F0aW9uKCAwICkgdlRleCA6IHZlYzI8ZjMyPiApIC0+IEBsb2NhdGlvbiggMCApIHZlYzQ8ZjMyPiB7XHJcblxyXG5cdHJldHVybiB0ZXh0dXJlU2FtcGxlKCBpbWcsIGltZ1NhbXBsZXIsIHZlYzIoIHZUZXgueCwgMS4wIC0gdlRleC55ICkgKTtcclxuXHJcbn1cclxuYDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBtaXBtYXAgR1BVIHNhbXBsZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0dQVVNhbXBsZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWlwbWFwU2FtcGxlciA9IGRldmljZS5jcmVhdGVTYW1wbGVyKCB7IG1pbkZpbHRlcjogR1BVRmlsdGVyTW9kZS5MaW5lYXIgfSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGZsaXBZIEdQVSBzYW1wbGVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtHUFVTYW1wbGVyfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZsaXBZU2FtcGxlciA9IGRldmljZS5jcmVhdGVTYW1wbGVyKCB7IG1pbkZpbHRlcjogR1BVRmlsdGVyTW9kZS5OZWFyZXN0IH0gKTsgLy9AVE9ETz86IENvbnNpZGVyIHVzaW5nIHRleHR1cmVMb2FkKClcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgY2FjaGUgZm9yIEdQVSByZW5kZXIgcGlwZWxpbmVzIHVzZWQgZm9yIGNvcHkvdHJhbnNmZXIgcGFzc2VzLlxyXG5cdFx0ICogRXZlcnkgdGV4dHVyZSBmb3JtYXQgcmVxdWlyZXMgYSB1bmlxdWUgcGlwZWxpbmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdDxzdHJpbmcsR1BVUmVuZGVyUGlwZWxpbmU+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnRyYW5zZmVyUGlwZWxpbmVzID0ge307XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGNhY2hlIGZvciBHUFUgcmVuZGVyIHBpcGVsaW5lcyB1c2VkIGZvciBmbGlwWSBwYXNzZXMuXHJcblx0XHQgKiBFdmVyeSB0ZXh0dXJlIGZvcm1hdCByZXF1aXJlcyBhIHVuaXF1ZSBwaXBlbGluZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0PHN0cmluZyxHUFVSZW5kZXJQaXBlbGluZT59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZmxpcFlQaXBlbGluZXMgPSB7fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBtaXBtYXAgdmVydGV4IHNoYWRlciBtb2R1bGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0dQVVNoYWRlck1vZHVsZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5taXBtYXBWZXJ0ZXhTaGFkZXJNb2R1bGUgPSBkZXZpY2UuY3JlYXRlU2hhZGVyTW9kdWxlKCB7XHJcblx0XHRcdGxhYmVsOiAnbWlwbWFwVmVydGV4JyxcclxuXHRcdFx0Y29kZTogbWlwbWFwVmVydGV4U291cmNlXHJcblx0XHR9ICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbWlwbWFwIGZyYWdtZW50IHNoYWRlciBtb2R1bGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0dQVVNoYWRlck1vZHVsZX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5taXBtYXBGcmFnbWVudFNoYWRlck1vZHVsZSA9IGRldmljZS5jcmVhdGVTaGFkZXJNb2R1bGUoIHtcclxuXHRcdFx0bGFiZWw6ICdtaXBtYXBGcmFnbWVudCcsXHJcblx0XHRcdGNvZGU6IG1pcG1hcEZyYWdtZW50U291cmNlXHJcblx0XHR9ICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZmxpcFkgZnJhZ21lbnQgc2hhZGVyIG1vZHVsZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7R1BVU2hhZGVyTW9kdWxlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmZsaXBZRnJhZ21lbnRTaGFkZXJNb2R1bGUgPSBkZXZpY2UuY3JlYXRlU2hhZGVyTW9kdWxlKCB7XHJcblx0XHRcdGxhYmVsOiAnZmxpcFlGcmFnbWVudCcsXHJcblx0XHRcdGNvZGU6IGZsaXBZRnJhZ21lbnRTb3VyY2VcclxuXHRcdH0gKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgcmVuZGVyIHBpcGVsaW5lIGZvciB0aGUgaW50ZXJuYWwgY29weSByZW5kZXIgcGFzcy4gVGhlIHBhc3NcclxuXHQgKiByZXF1aXJlcyBhIHVuaXF1ZSByZW5kZXIgcGlwZWxpbmUgZm9yIGVhY2ggdGV4dHVyZSBmb3JtYXQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gZm9ybWF0IC0gVGhlIEdQVSB0ZXh0dXJlIGZvcm1hdFxyXG5cdCAqIEByZXR1cm4ge0dQVVJlbmRlclBpcGVsaW5lfSBUaGUgR1BVIHJlbmRlciBwaXBlbGluZS5cclxuXHQgKi9cclxuXHRnZXRUcmFuc2ZlclBpcGVsaW5lKCBmb3JtYXQgKSB7XHJcblxyXG5cdFx0bGV0IHBpcGVsaW5lID0gdGhpcy50cmFuc2ZlclBpcGVsaW5lc1sgZm9ybWF0IF07XHJcblxyXG5cdFx0aWYgKCBwaXBlbGluZSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0cGlwZWxpbmUgPSB0aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZSgge1xyXG5cdFx0XHRcdGxhYmVsOiBgbWlwbWFwLSR7IGZvcm1hdCB9YCxcclxuXHRcdFx0XHR2ZXJ0ZXg6IHtcclxuXHRcdFx0XHRcdG1vZHVsZTogdGhpcy5taXBtYXBWZXJ0ZXhTaGFkZXJNb2R1bGUsXHJcblx0XHRcdFx0XHRlbnRyeVBvaW50OiAnbWFpbidcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdGZyYWdtZW50OiB7XHJcblx0XHRcdFx0XHRtb2R1bGU6IHRoaXMubWlwbWFwRnJhZ21lbnRTaGFkZXJNb2R1bGUsXHJcblx0XHRcdFx0XHRlbnRyeVBvaW50OiAnbWFpbicsXHJcblx0XHRcdFx0XHR0YXJnZXRzOiBbIHsgZm9ybWF0IH0gXVxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0cHJpbWl0aXZlOiB7XHJcblx0XHRcdFx0XHR0b3BvbG9neTogR1BVUHJpbWl0aXZlVG9wb2xvZ3kuVHJpYW5nbGVTdHJpcCxcclxuXHRcdFx0XHRcdHN0cmlwSW5kZXhGb3JtYXQ6IEdQVUluZGV4Rm9ybWF0LlVpbnQzMlxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0bGF5b3V0OiAnYXV0bydcclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdFx0dGhpcy50cmFuc2ZlclBpcGVsaW5lc1sgZm9ybWF0IF0gPSBwaXBlbGluZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHBpcGVsaW5lO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSByZW5kZXIgcGlwZWxpbmUgZm9yIHRoZSBmbGlwWSByZW5kZXIgcGFzcy4gVGhlIHBhc3NcclxuXHQgKiByZXF1aXJlcyBhIHVuaXF1ZSByZW5kZXIgcGlwZWxpbmUgZm9yIGVhY2ggdGV4dHVyZSBmb3JtYXQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gZm9ybWF0IC0gVGhlIEdQVSB0ZXh0dXJlIGZvcm1hdFxyXG5cdCAqIEByZXR1cm4ge0dQVVJlbmRlclBpcGVsaW5lfSBUaGUgR1BVIHJlbmRlciBwaXBlbGluZS5cclxuXHQgKi9cclxuXHRnZXRGbGlwWVBpcGVsaW5lKCBmb3JtYXQgKSB7XHJcblxyXG5cdFx0bGV0IHBpcGVsaW5lID0gdGhpcy5mbGlwWVBpcGVsaW5lc1sgZm9ybWF0IF07XHJcblxyXG5cdFx0aWYgKCBwaXBlbGluZSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0cGlwZWxpbmUgPSB0aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZSgge1xyXG5cdFx0XHRcdGxhYmVsOiBgZmxpcFktJHsgZm9ybWF0IH1gLFxyXG5cdFx0XHRcdHZlcnRleDoge1xyXG5cdFx0XHRcdFx0bW9kdWxlOiB0aGlzLm1pcG1hcFZlcnRleFNoYWRlck1vZHVsZSxcclxuXHRcdFx0XHRcdGVudHJ5UG9pbnQ6ICdtYWluJ1xyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0ZnJhZ21lbnQ6IHtcclxuXHRcdFx0XHRcdG1vZHVsZTogdGhpcy5mbGlwWUZyYWdtZW50U2hhZGVyTW9kdWxlLFxyXG5cdFx0XHRcdFx0ZW50cnlQb2ludDogJ21haW4nLFxyXG5cdFx0XHRcdFx0dGFyZ2V0czogWyB7IGZvcm1hdCB9IF1cclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdHByaW1pdGl2ZToge1xyXG5cdFx0XHRcdFx0dG9wb2xvZ3k6IEdQVVByaW1pdGl2ZVRvcG9sb2d5LlRyaWFuZ2xlU3RyaXAsXHJcblx0XHRcdFx0XHRzdHJpcEluZGV4Rm9ybWF0OiBHUFVJbmRleEZvcm1hdC5VaW50MzJcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdGxheW91dDogJ2F1dG8nXHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHRcdHRoaXMuZmxpcFlQaXBlbGluZXNbIGZvcm1hdCBdID0gcGlwZWxpbmU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBwaXBlbGluZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGbGlwIHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4gR1BVIHRleHR1cmUgYWxvbmcgaXRzIHZlcnRpY2FsIGF4aXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0dQVVRleHR1cmV9IHRleHR1cmVHUFUgLSBUaGUgR1BVIHRleHR1cmUgb2JqZWN0LlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSB0ZXh0dXJlR1BVRGVzY3JpcHRvciAtIFRoZSB0ZXh0dXJlIGRlc2NyaXB0b3IuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtiYXNlQXJyYXlMYXllcj0wXSAtIFRoZSBpbmRleCBvZiB0aGUgZmlyc3QgYXJyYXkgbGF5ZXIgYWNjZXNzaWJsZSB0byB0aGUgdGV4dHVyZSB2aWV3LlxyXG5cdCAqL1xyXG5cdGZsaXBZKCB0ZXh0dXJlR1BVLCB0ZXh0dXJlR1BVRGVzY3JpcHRvciwgYmFzZUFycmF5TGF5ZXIgPSAwICkge1xyXG5cclxuXHRcdGNvbnN0IGZvcm1hdCA9IHRleHR1cmVHUFVEZXNjcmlwdG9yLmZvcm1hdDtcclxuXHRcdGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gdGV4dHVyZUdQVURlc2NyaXB0b3Iuc2l6ZTtcclxuXHJcblx0XHRjb25zdCB0cmFuc2ZlclBpcGVsaW5lID0gdGhpcy5nZXRUcmFuc2ZlclBpcGVsaW5lKCBmb3JtYXQgKTtcclxuXHRcdGNvbnN0IGZsaXBZUGlwZWxpbmUgPSB0aGlzLmdldEZsaXBZUGlwZWxpbmUoIGZvcm1hdCApO1xyXG5cclxuXHRcdGNvbnN0IHRlbXBUZXh0dXJlID0gdGhpcy5kZXZpY2UuY3JlYXRlVGV4dHVyZSgge1xyXG5cdFx0XHRzaXplOiB7IHdpZHRoLCBoZWlnaHQsIGRlcHRoT3JBcnJheUxheWVyczogMSB9LFxyXG5cdFx0XHRmb3JtYXQsXHJcblx0XHRcdHVzYWdlOiBHUFVUZXh0dXJlVXNhZ2UuUkVOREVSX0FUVEFDSE1FTlQgfCBHUFVUZXh0dXJlVXNhZ2UuVEVYVFVSRV9CSU5ESU5HXHJcblx0XHR9ICk7XHJcblxyXG5cdFx0Y29uc3Qgc3JjVmlldyA9IHRleHR1cmVHUFUuY3JlYXRlVmlldygge1xyXG5cdFx0XHRiYXNlTWlwTGV2ZWw6IDAsXHJcblx0XHRcdG1pcExldmVsQ291bnQ6IDEsXHJcblx0XHRcdGRpbWVuc2lvbjogR1BVVGV4dHVyZVZpZXdEaW1lbnNpb24uVHdvRCxcclxuXHRcdFx0YmFzZUFycmF5TGF5ZXJcclxuXHRcdH0gKTtcclxuXHJcblx0XHRjb25zdCBkc3RWaWV3ID0gdGVtcFRleHR1cmUuY3JlYXRlVmlldygge1xyXG5cdFx0XHRiYXNlTWlwTGV2ZWw6IDAsXHJcblx0XHRcdG1pcExldmVsQ291bnQ6IDEsXHJcblx0XHRcdGRpbWVuc2lvbjogR1BVVGV4dHVyZVZpZXdEaW1lbnNpb24uVHdvRCxcclxuXHRcdFx0YmFzZUFycmF5TGF5ZXI6IDBcclxuXHRcdH0gKTtcclxuXHJcblx0XHRjb25zdCBjb21tYW5kRW5jb2RlciA9IHRoaXMuZGV2aWNlLmNyZWF0ZUNvbW1hbmRFbmNvZGVyKCB7fSApO1xyXG5cclxuXHRcdGNvbnN0IHBhc3MgPSAoIHBpcGVsaW5lLCBzb3VyY2VWaWV3LCBkZXN0aW5hdGlvblZpZXcgKSA9PiB7XHJcblxyXG5cdFx0XHRjb25zdCBiaW5kR3JvdXBMYXlvdXQgPSBwaXBlbGluZS5nZXRCaW5kR3JvdXBMYXlvdXQoIDAgKTsgLy8gQFRPRE86IENvbnNpZGVyIG1ha2luZyB0aGlzIHN0YXRpYy5cclxuXHJcblx0XHRcdGNvbnN0IGJpbmRHcm91cCA9IHRoaXMuZGV2aWNlLmNyZWF0ZUJpbmRHcm91cCgge1xyXG5cdFx0XHRcdGxheW91dDogYmluZEdyb3VwTGF5b3V0LFxyXG5cdFx0XHRcdGVudHJpZXM6IFsge1xyXG5cdFx0XHRcdFx0YmluZGluZzogMCxcclxuXHRcdFx0XHRcdHJlc291cmNlOiB0aGlzLmZsaXBZU2FtcGxlclxyXG5cdFx0XHRcdH0sIHtcclxuXHRcdFx0XHRcdGJpbmRpbmc6IDEsXHJcblx0XHRcdFx0XHRyZXNvdXJjZTogc291cmNlVmlld1xyXG5cdFx0XHRcdH0gXVxyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRjb25zdCBwYXNzRW5jb2RlciA9IGNvbW1hbmRFbmNvZGVyLmJlZ2luUmVuZGVyUGFzcygge1xyXG5cdFx0XHRcdGNvbG9yQXR0YWNobWVudHM6IFsge1xyXG5cdFx0XHRcdFx0dmlldzogZGVzdGluYXRpb25WaWV3LFxyXG5cdFx0XHRcdFx0bG9hZE9wOiBHUFVMb2FkT3AuQ2xlYXIsXHJcblx0XHRcdFx0XHRzdG9yZU9wOiBHUFVTdG9yZU9wLlN0b3JlLFxyXG5cdFx0XHRcdFx0Y2xlYXJWYWx1ZTogWyAwLCAwLCAwLCAwIF1cclxuXHRcdFx0XHR9IF1cclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdFx0cGFzc0VuY29kZXIuc2V0UGlwZWxpbmUoIHBpcGVsaW5lICk7XHJcblx0XHRcdHBhc3NFbmNvZGVyLnNldEJpbmRHcm91cCggMCwgYmluZEdyb3VwICk7XHJcblx0XHRcdHBhc3NFbmNvZGVyLmRyYXcoIDQsIDEsIDAsIDAgKTtcclxuXHRcdFx0cGFzc0VuY29kZXIuZW5kKCk7XHJcblxyXG5cdFx0fTtcclxuXHJcblx0XHRwYXNzKCB0cmFuc2ZlclBpcGVsaW5lLCBzcmNWaWV3LCBkc3RWaWV3ICk7XHJcblx0XHRwYXNzKCBmbGlwWVBpcGVsaW5lLCBkc3RWaWV3LCBzcmNWaWV3ICk7XHJcblxyXG5cdFx0dGhpcy5kZXZpY2UucXVldWUuc3VibWl0KCBbIGNvbW1hbmRFbmNvZGVyLmZpbmlzaCgpIF0gKTtcclxuXHJcblx0XHR0ZW1wVGV4dHVyZS5kZXN0cm95KCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2VuZXJhdGVzIG1pcG1hcHMgZm9yIHRoZSBnaXZlbiBHUFUgdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7R1BVVGV4dHVyZX0gdGV4dHVyZUdQVSAtIFRoZSBHUFUgdGV4dHVyZSBvYmplY3QuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IHRleHR1cmVHUFVEZXNjcmlwdG9yIC0gVGhlIHRleHR1cmUgZGVzY3JpcHRvci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2Jhc2VBcnJheUxheWVyPTBdIC0gVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBhcnJheSBsYXllciBhY2Nlc3NpYmxlIHRvIHRoZSB0ZXh0dXJlIHZpZXcuXHJcblx0ICovXHJcblx0Z2VuZXJhdGVNaXBtYXBzKCB0ZXh0dXJlR1BVLCB0ZXh0dXJlR1BVRGVzY3JpcHRvciwgYmFzZUFycmF5TGF5ZXIgPSAwICkge1xyXG5cclxuXHRcdGNvbnN0IHRleHR1cmVEYXRhID0gdGhpcy5nZXQoIHRleHR1cmVHUFUgKTtcclxuXHJcblx0XHRpZiAoIHRleHR1cmVEYXRhLnVzZUNvdW50ID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHR0ZXh0dXJlRGF0YS51c2VDb3VudCA9IDA7XHJcblx0XHRcdHRleHR1cmVEYXRhLmxheWVycyA9IFtdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBwYXNzZXMgPSB0ZXh0dXJlRGF0YS5sYXllcnNbIGJhc2VBcnJheUxheWVyIF0gfHwgdGhpcy5fbWlwbWFwQ3JlYXRlQnVuZGxlcyggdGV4dHVyZUdQVSwgdGV4dHVyZUdQVURlc2NyaXB0b3IsIGJhc2VBcnJheUxheWVyICk7XHJcblxyXG5cdFx0Y29uc3QgY29tbWFuZEVuY29kZXIgPSB0aGlzLmRldmljZS5jcmVhdGVDb21tYW5kRW5jb2Rlcigge30gKTtcclxuXHJcblx0XHR0aGlzLl9taXBtYXBSdW5CdW5kbGVzKCBjb21tYW5kRW5jb2RlciwgcGFzc2VzICk7XHJcblxyXG5cdFx0dGhpcy5kZXZpY2UucXVldWUuc3VibWl0KCBbIGNvbW1hbmRFbmNvZGVyLmZpbmlzaCgpIF0gKTtcclxuXHJcblx0XHRpZiAoIHRleHR1cmVEYXRhLnVzZUNvdW50ICE9PSAwICkgdGV4dHVyZURhdGEubGF5ZXJzWyBiYXNlQXJyYXlMYXllciBdID0gcGFzc2VzO1xyXG5cclxuXHRcdHRleHR1cmVEYXRhLnVzZUNvdW50ICsrO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNpbmNlIG11bHRpcGxlIGNvcHkgcmVuZGVyIHBhc3NlcyBhcmUgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgbWlwbWFwcywgdGhlIHBhc3Nlc1xyXG5cdCAqIGFyZSBtYW5hZ2VkIGFzIHJlbmRlciBidW5kbGVzIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0dQVVRleHR1cmV9IHRleHR1cmVHUFUgLSBUaGUgR1BVIHRleHR1cmUgb2JqZWN0LlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSB0ZXh0dXJlR1BVRGVzY3JpcHRvciAtIFRoZSB0ZXh0dXJlIGRlc2NyaXB0b3IuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGJhc2VBcnJheUxheWVyIC0gVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBhcnJheSBsYXllciBhY2Nlc3NpYmxlIHRvIHRoZSB0ZXh0dXJlIHZpZXcuXHJcblx0ICogQHJldHVybiB7QXJyYXk8T2JqZWN0Pn0gQW4gYXJyYXkgb2YgcmVuZGVyIGJ1bmRsZXMuXHJcblx0ICovXHJcblx0X21pcG1hcENyZWF0ZUJ1bmRsZXMoIHRleHR1cmVHUFUsIHRleHR1cmVHUFVEZXNjcmlwdG9yLCBiYXNlQXJyYXlMYXllciApIHtcclxuXHJcblx0XHRjb25zdCBwaXBlbGluZSA9IHRoaXMuZ2V0VHJhbnNmZXJQaXBlbGluZSggdGV4dHVyZUdQVURlc2NyaXB0b3IuZm9ybWF0ICk7XHJcblxyXG5cdFx0Y29uc3QgYmluZEdyb3VwTGF5b3V0ID0gcGlwZWxpbmUuZ2V0QmluZEdyb3VwTGF5b3V0KCAwICk7IC8vIEBUT0RPOiBDb25zaWRlciBtYWtpbmcgdGhpcyBzdGF0aWMuXHJcblxyXG5cdFx0bGV0IHNyY1ZpZXcgPSB0ZXh0dXJlR1BVLmNyZWF0ZVZpZXcoIHtcclxuXHRcdFx0YmFzZU1pcExldmVsOiAwLFxyXG5cdFx0XHRtaXBMZXZlbENvdW50OiAxLFxyXG5cdFx0XHRkaW1lbnNpb246IEdQVVRleHR1cmVWaWV3RGltZW5zaW9uLlR3b0QsXHJcblx0XHRcdGJhc2VBcnJheUxheWVyXHJcblx0XHR9ICk7XHJcblxyXG5cdFx0Y29uc3QgcGFzc2VzID0gW107XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAxOyBpIDwgdGV4dHVyZUdQVURlc2NyaXB0b3IubWlwTGV2ZWxDb3VudDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGJpbmRHcm91cCA9IHRoaXMuZGV2aWNlLmNyZWF0ZUJpbmRHcm91cCgge1xyXG5cdFx0XHRcdGxheW91dDogYmluZEdyb3VwTGF5b3V0LFxyXG5cdFx0XHRcdGVudHJpZXM6IFsge1xyXG5cdFx0XHRcdFx0YmluZGluZzogMCxcclxuXHRcdFx0XHRcdHJlc291cmNlOiB0aGlzLm1pcG1hcFNhbXBsZXJcclxuXHRcdFx0XHR9LCB7XHJcblx0XHRcdFx0XHRiaW5kaW5nOiAxLFxyXG5cdFx0XHRcdFx0cmVzb3VyY2U6IHNyY1ZpZXdcclxuXHRcdFx0XHR9IF1cclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdFx0Y29uc3QgZHN0VmlldyA9IHRleHR1cmVHUFUuY3JlYXRlVmlldygge1xyXG5cdFx0XHRcdGJhc2VNaXBMZXZlbDogaSxcclxuXHRcdFx0XHRtaXBMZXZlbENvdW50OiAxLFxyXG5cdFx0XHRcdGRpbWVuc2lvbjogR1BVVGV4dHVyZVZpZXdEaW1lbnNpb24uVHdvRCxcclxuXHRcdFx0XHRiYXNlQXJyYXlMYXllclxyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRjb25zdCBwYXNzRGVzY3JpcHRvciA9IHtcclxuXHRcdFx0XHRjb2xvckF0dGFjaG1lbnRzOiBbIHtcclxuXHRcdFx0XHRcdHZpZXc6IGRzdFZpZXcsXHJcblx0XHRcdFx0XHRsb2FkT3A6IEdQVUxvYWRPcC5DbGVhcixcclxuXHRcdFx0XHRcdHN0b3JlT3A6IEdQVVN0b3JlT3AuU3RvcmUsXHJcblx0XHRcdFx0XHRjbGVhclZhbHVlOiBbIDAsIDAsIDAsIDAgXVxyXG5cdFx0XHRcdH0gXVxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0Y29uc3QgcGFzc0VuY29kZXIgPSB0aGlzLmRldmljZS5jcmVhdGVSZW5kZXJCdW5kbGVFbmNvZGVyKCB7XHJcblx0XHRcdFx0Y29sb3JGb3JtYXRzOiBbIHRleHR1cmVHUFVEZXNjcmlwdG9yLmZvcm1hdCBdXHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHRcdHBhc3NFbmNvZGVyLnNldFBpcGVsaW5lKCBwaXBlbGluZSApO1xyXG5cdFx0XHRwYXNzRW5jb2Rlci5zZXRCaW5kR3JvdXAoIDAsIGJpbmRHcm91cCApO1xyXG5cdFx0XHRwYXNzRW5jb2Rlci5kcmF3KCA0LCAxLCAwLCAwICk7XHJcblxyXG5cdFx0XHRwYXNzZXMucHVzaCgge1xyXG5cdFx0XHRcdHJlbmRlckJ1bmRsZXM6IFsgcGFzc0VuY29kZXIuZmluaXNoKCkgXSxcclxuXHRcdFx0XHRwYXNzRGVzY3JpcHRvclxyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRzcmNWaWV3ID0gZHN0VmlldztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHBhc3NlcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFeGVjdXRlcyB0aGUgcmVuZGVyIGJ1bmRsZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0dQVUNvbW1hbmRFbmNvZGVyfSBjb21tYW5kRW5jb2RlciAtIFRoZSBHUFUgY29tbWFuZCBlbmNvZGVyLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8T2JqZWN0Pn0gcGFzc2VzIC0gQW4gYXJyYXkgb2YgcmVuZGVyIGJ1bmRsZXMuXHJcblx0ICovXHJcblx0X21pcG1hcFJ1bkJ1bmRsZXMoIGNvbW1hbmRFbmNvZGVyLCBwYXNzZXMgKSB7XHJcblxyXG5cdFx0Y29uc3QgbGV2ZWxzID0gcGFzc2VzLmxlbmd0aDtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBsZXZlbHM7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBwYXNzID0gcGFzc2VzWyBpIF07XHJcblxyXG5cdFx0XHRjb25zdCBwYXNzRW5jb2RlciA9IGNvbW1hbmRFbmNvZGVyLmJlZ2luUmVuZGVyUGFzcyggcGFzcy5wYXNzRGVzY3JpcHRvciApO1xyXG5cclxuXHRcdFx0cGFzc0VuY29kZXIuZXhlY3V0ZUJ1bmRsZXMoIHBhc3MucmVuZGVyQnVuZGxlcyApO1xyXG5cclxuXHRcdFx0cGFzc0VuY29kZXIuZW5kKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBXZWJHUFVUZXh0dXJlUGFzc1V0aWxzO1xyXG4iLCJpbXBvcnQge1xyXG5cdEdQVVRleHR1cmVGb3JtYXQsIEdQVUFkZHJlc3NNb2RlLCBHUFVGaWx0ZXJNb2RlLCBHUFVUZXh0dXJlRGltZW5zaW9uLCBHUFVGZWF0dXJlTmFtZVxyXG59IGZyb20gJy4vV2ViR1BVQ29uc3RhbnRzLmpzJztcclxuXHJcbmltcG9ydCBXZWJHUFVUZXh0dXJlUGFzc1V0aWxzIGZyb20gJy4vV2ViR1BVVGV4dHVyZVBhc3NVdGlscy5qcyc7XHJcblxyXG5pbXBvcnQge1xyXG5cdEJ5dGVUeXBlLCBTaG9ydFR5cGUsXHJcblx0TmVhcmVzdEZpbHRlciwgTmVhcmVzdE1pcG1hcE5lYXJlc3RGaWx0ZXIsIE5lYXJlc3RNaXBtYXBMaW5lYXJGaWx0ZXIsXHJcblx0UmVwZWF0V3JhcHBpbmcsIE1pcnJvcmVkUmVwZWF0V3JhcHBpbmcsXHJcblx0UkdCX0VUQzJfRm9ybWF0LCBSR0JBX0VUQzJfRUFDX0Zvcm1hdCxcclxuXHRSR0JBRm9ybWF0LCBSR0JGb3JtYXQsIFJlZEZvcm1hdCwgUkdGb3JtYXQsIFJHQkFfUzNUQ19EWFQxX0Zvcm1hdCwgUkdCQV9TM1RDX0RYVDNfRm9ybWF0LCBSR0JBX1MzVENfRFhUNV9Gb3JtYXQsIFVuc2lnbmVkQnl0ZVR5cGUsIEZsb2F0VHlwZSwgSGFsZkZsb2F0VHlwZSwgU1JHQkNvbG9yU3BhY2UsIERlcHRoRm9ybWF0LCBEZXB0aFN0ZW5jaWxGb3JtYXQsXHJcblx0UkdCQV9BU1RDXzR4NF9Gb3JtYXQsIFJHQkFfQVNUQ181eDRfRm9ybWF0LCBSR0JBX0FTVENfNXg1X0Zvcm1hdCwgUkdCQV9BU1RDXzZ4NV9Gb3JtYXQsIFJHQkFfQVNUQ182eDZfRm9ybWF0LCBSR0JBX0FTVENfOHg1X0Zvcm1hdCwgUkdCQV9BU1RDXzh4Nl9Gb3JtYXQsIFJHQkFfQVNUQ184eDhfRm9ybWF0LCBSR0JBX0FTVENfMTB4NV9Gb3JtYXQsXHJcblx0UkdCQV9BU1RDXzEweDZfRm9ybWF0LCBSR0JBX0FTVENfMTB4OF9Gb3JtYXQsIFJHQkFfQVNUQ18xMHgxMF9Gb3JtYXQsIFJHQkFfQVNUQ18xMngxMF9Gb3JtYXQsIFJHQkFfQVNUQ18xMngxMl9Gb3JtYXQsIFVuc2lnbmVkSW50VHlwZSwgVW5zaWduZWRTaG9ydFR5cGUsIFVuc2lnbmVkSW50MjQ4VHlwZSwgVW5zaWduZWRJbnQ1OTk5VHlwZSxcclxuXHROZXZlckNvbXBhcmUsIEFsd2F5c0NvbXBhcmUsIExlc3NDb21wYXJlLCBMZXNzRXF1YWxDb21wYXJlLCBFcXVhbENvbXBhcmUsIEdyZWF0ZXJFcXVhbENvbXBhcmUsIEdyZWF0ZXJDb21wYXJlLCBOb3RFcXVhbENvbXBhcmUsIEludFR5cGUsIFJlZEludGVnZXJGb3JtYXQsIFJHSW50ZWdlckZvcm1hdCwgUkdCQUludGVnZXJGb3JtYXQsXHJcblx0Q3ViZVJlZmxlY3Rpb25NYXBwaW5nLCBDdWJlUmVmcmFjdGlvbk1hcHBpbmcsIEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nLCBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZ1xyXG59IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcbmltcG9ydCB7IEN1YmVUZXh0dXJlIH0gZnJvbSAnLi4vLi4vLi4vdGV4dHVyZXMvQ3ViZVRleHR1cmUuanMnO1xyXG5pbXBvcnQgeyBEZXB0aFRleHR1cmUgfSBmcm9tICcuLi8uLi8uLi90ZXh0dXJlcy9EZXB0aFRleHR1cmUuanMnO1xyXG5pbXBvcnQgeyBUZXh0dXJlIH0gZnJvbSAnLi4vLi4vLi4vdGV4dHVyZXMvVGV4dHVyZS5qcyc7XHJcblxyXG5jb25zdCBfY29tcGFyZVRvV2ViR1BVID0ge1xyXG5cdFsgTmV2ZXJDb21wYXJlIF06ICduZXZlcicsXHJcblx0WyBMZXNzQ29tcGFyZSBdOiAnbGVzcycsXHJcblx0WyBFcXVhbENvbXBhcmUgXTogJ2VxdWFsJyxcclxuXHRbIExlc3NFcXVhbENvbXBhcmUgXTogJ2xlc3MtZXF1YWwnLFxyXG5cdFsgR3JlYXRlckNvbXBhcmUgXTogJ2dyZWF0ZXInLFxyXG5cdFsgR3JlYXRlckVxdWFsQ29tcGFyZSBdOiAnZ3JlYXRlci1lcXVhbCcsXHJcblx0WyBBbHdheXNDb21wYXJlIF06ICdhbHdheXMnLFxyXG5cdFsgTm90RXF1YWxDb21wYXJlIF06ICdub3QtZXF1YWwnXHJcbn07XHJcblxyXG5jb25zdCBfZmxpcE1hcCA9IFsgMCwgMSwgMywgMiwgNCwgNSBdO1xyXG5cclxuLyoqXHJcbiAqIEEgV2ViR1BVIGJhY2tlbmQgdXRpbGl0eSBtb2R1bGUgZm9yIG1hbmFnaW5nIHRleHR1cmVzLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuY2xhc3MgV2ViR1BVVGV4dHVyZVV0aWxzIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB1dGlsaXR5IG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7V2ViR1BVQmFja2VuZH0gYmFja2VuZCAtIFRoZSBXZWJHUFUgYmFja2VuZC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggYmFja2VuZCApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIHRoZSBXZWJHUFUgYmFja2VuZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2ViR1BVQmFja2VuZH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5iYWNrZW5kID0gYmFja2VuZDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIHRoZSBwYXNzIHV0aWxzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/V2ViR1BVVGV4dHVyZVBhc3NVdGlsc31cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5fcGFzc1V0aWxzID0gbnVsbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgZGljdGlvbmFyeSBmb3IgbWFuYWdpbmcgZGVmYXVsdCB0ZXh0dXJlcy4gVGhlIGtleVxyXG5cdFx0ICogaXMgdGhlIHRleHR1cmUgZm9ybWF0LCB0aGUgdmFsdWUgdGhlIHRleHR1cmUgb2JqZWN0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLFRleHR1cmU+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRlZmF1bHRUZXh0dXJlID0ge307XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGRpY3Rpb25hcnkgZm9yIG1hbmFnaW5nIGRlZmF1bHQgY3ViZSB0ZXh0dXJlcy4gVGhlIGtleVxyXG5cdFx0ICogaXMgdGhlIHRleHR1cmUgZm9ybWF0LCB0aGUgdmFsdWUgdGhlIHRleHR1cmUgb2JqZWN0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLEN1YmVUZXh0dXJlPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5kZWZhdWx0Q3ViZVRleHR1cmUgPSB7fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgZGVmYXVsdCB2aWRlbyBmcmFtZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P1ZpZGVvRnJhbWV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGVmYXVsdFZpZGVvRnJhbWUgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVwcmVzZW50cyB0aGUgY29sb3IgYXR0YWNobWVudCBvZiB0aGUgZGVmYXVsdCBmcmFtZWJ1ZmZlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7P0dQVVRleHR1cmV9XHJcblx0XHQgKiBAZGVmYXVsdCBudWxsXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY29sb3JCdWZmZXIgPSBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVwcmVzZW50cyB0aGUgZGVwdGggYXR0YWNobWVudCBvZiB0aGUgZGVmYXVsdCBmcmFtZWJ1ZmZlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7RGVwdGhUZXh0dXJlfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmRlcHRoVGV4dHVyZSA9IG5ldyBEZXB0aFRleHR1cmUoKTtcclxuXHRcdHRoaXMuZGVwdGhUZXh0dXJlLm5hbWUgPSAnZGVwdGhCdWZmZXInO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgYSBHUFUgc2FtcGxlciBmb3IgdGhlIGdpdmVuIHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZSB0byBjcmVhdGUgdGhlIHNhbXBsZXIgZm9yLlxyXG5cdCAqL1xyXG5cdGNyZWF0ZVNhbXBsZXIoIHRleHR1cmUgKSB7XHJcblxyXG5cdFx0Y29uc3QgYmFja2VuZCA9IHRoaXMuYmFja2VuZDtcclxuXHRcdGNvbnN0IGRldmljZSA9IGJhY2tlbmQuZGV2aWNlO1xyXG5cclxuXHRcdGNvbnN0IHRleHR1cmVHUFUgPSBiYWNrZW5kLmdldCggdGV4dHVyZSApO1xyXG5cclxuXHRcdGNvbnN0IHNhbXBsZXJEZXNjcmlwdG9yR1BVID0ge1xyXG5cdFx0XHRhZGRyZXNzTW9kZVU6IHRoaXMuX2NvbnZlcnRBZGRyZXNzTW9kZSggdGV4dHVyZS53cmFwUyApLFxyXG5cdFx0XHRhZGRyZXNzTW9kZVY6IHRoaXMuX2NvbnZlcnRBZGRyZXNzTW9kZSggdGV4dHVyZS53cmFwVCApLFxyXG5cdFx0XHRhZGRyZXNzTW9kZVc6IHRoaXMuX2NvbnZlcnRBZGRyZXNzTW9kZSggdGV4dHVyZS53cmFwUiApLFxyXG5cdFx0XHRtYWdGaWx0ZXI6IHRoaXMuX2NvbnZlcnRGaWx0ZXJNb2RlKCB0ZXh0dXJlLm1hZ0ZpbHRlciApLFxyXG5cdFx0XHRtaW5GaWx0ZXI6IHRoaXMuX2NvbnZlcnRGaWx0ZXJNb2RlKCB0ZXh0dXJlLm1pbkZpbHRlciApLFxyXG5cdFx0XHRtaXBtYXBGaWx0ZXI6IHRoaXMuX2NvbnZlcnRGaWx0ZXJNb2RlKCB0ZXh0dXJlLm1pbkZpbHRlciApLFxyXG5cdFx0XHRtYXhBbmlzb3Ryb3B5OiAxXHJcblx0XHR9O1xyXG5cclxuXHRcdC8vIGFuaXNvdHJvcHkgY2FuIG9ubHkgYmUgdXNlZCB3aGVuIGFsbCBmaWx0ZXIgbW9kZXMgYXJlIHNldCB0byBsaW5lYXIuXHJcblxyXG5cdFx0aWYgKCBzYW1wbGVyRGVzY3JpcHRvckdQVS5tYWdGaWx0ZXIgPT09IEdQVUZpbHRlck1vZGUuTGluZWFyICYmIHNhbXBsZXJEZXNjcmlwdG9yR1BVLm1pbkZpbHRlciA9PT0gR1BVRmlsdGVyTW9kZS5MaW5lYXIgJiYgc2FtcGxlckRlc2NyaXB0b3JHUFUubWlwbWFwRmlsdGVyID09PSBHUFVGaWx0ZXJNb2RlLkxpbmVhciApIHtcclxuXHJcblx0XHRcdHNhbXBsZXJEZXNjcmlwdG9yR1BVLm1heEFuaXNvdHJvcHkgPSB0ZXh0dXJlLmFuaXNvdHJvcHk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGV4dHVyZS5pc0RlcHRoVGV4dHVyZSAmJiB0ZXh0dXJlLmNvbXBhcmVGdW5jdGlvbiAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHNhbXBsZXJEZXNjcmlwdG9yR1BVLmNvbXBhcmUgPSBfY29tcGFyZVRvV2ViR1BVWyB0ZXh0dXJlLmNvbXBhcmVGdW5jdGlvbiBdO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0ZXh0dXJlR1BVLnNhbXBsZXIgPSBkZXZpY2UuY3JlYXRlU2FtcGxlciggc2FtcGxlckRlc2NyaXB0b3JHUFUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGEgZGVmYXVsdCB0ZXh0dXJlIGZvciB0aGUgZ2l2ZW4gdGV4dHVyZSB0aGF0IGNhbiBiZSB1c2VkXHJcblx0ICogYXMgYSBwbGFjZWhvbGRlciB1bnRpbCB0aGUgYWN0dWFsIHRleHR1cmUgaXMgcmVhZHkgZm9yIHVzYWdlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUgdG8gY3JlYXRlIGEgZGVmYXVsdCB0ZXh0dXJlIGZvci5cclxuXHQgKi9cclxuXHRjcmVhdGVEZWZhdWx0VGV4dHVyZSggdGV4dHVyZSApIHtcclxuXHJcblx0XHRsZXQgdGV4dHVyZUdQVTtcclxuXHJcblx0XHRjb25zdCBmb3JtYXQgPSBnZXRGb3JtYXQoIHRleHR1cmUgKTtcclxuXHJcblx0XHRpZiAoIHRleHR1cmUuaXNDdWJlVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdHRleHR1cmVHUFUgPSB0aGlzLl9nZXREZWZhdWx0Q3ViZVRleHR1cmVHUFUoIGZvcm1hdCApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHRleHR1cmUuaXNWaWRlb1RleHR1cmUgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmJhY2tlbmQuZ2V0KCB0ZXh0dXJlICkuZXh0ZXJuYWxUZXh0dXJlID0gdGhpcy5fZ2V0RGVmYXVsdFZpZGVvRnJhbWUoKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGV4dHVyZUdQVSA9IHRoaXMuX2dldERlZmF1bHRUZXh0dXJlR1BVKCBmb3JtYXQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5iYWNrZW5kLmdldCggdGV4dHVyZSApLnRleHR1cmUgPSB0ZXh0dXJlR1BVO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgYSB0ZXh0dXJlIG9uIHRoZSBHUFUgZm9yIHRoZSBnaXZlbiB0ZXh0dXJlIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlLlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIHBhcmFtZXRlci5cclxuXHQgKi9cclxuXHRjcmVhdGVUZXh0dXJlKCB0ZXh0dXJlLCBvcHRpb25zID0ge30gKSB7XHJcblxyXG5cdFx0Y29uc3QgYmFja2VuZCA9IHRoaXMuYmFja2VuZDtcclxuXHRcdGNvbnN0IHRleHR1cmVEYXRhID0gYmFja2VuZC5nZXQoIHRleHR1cmUgKTtcclxuXHJcblx0XHRpZiAoIHRleHR1cmVEYXRhLmluaXRpYWxpemVkICkge1xyXG5cclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnV2ViR1BVVGV4dHVyZVV0aWxzOiBUZXh0dXJlIGFscmVhZHkgaW5pdGlhbGl6ZWQuJyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIG9wdGlvbnMubmVlZHNNaXBtYXBzID09PSB1bmRlZmluZWQgKSBvcHRpb25zLm5lZWRzTWlwbWFwcyA9IGZhbHNlO1xyXG5cdFx0aWYgKCBvcHRpb25zLmxldmVscyA9PT0gdW5kZWZpbmVkICkgb3B0aW9ucy5sZXZlbHMgPSAxO1xyXG5cdFx0aWYgKCBvcHRpb25zLmRlcHRoID09PSB1bmRlZmluZWQgKSBvcHRpb25zLmRlcHRoID0gMTtcclxuXHJcblx0XHRjb25zdCB7IHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBsZXZlbHMgfSA9IG9wdGlvbnM7XHJcblxyXG5cdFx0aWYgKCB0ZXh0dXJlLmlzRnJhbWVidWZmZXJUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0aWYgKCBvcHRpb25zLnJlbmRlclRhcmdldCApIHtcclxuXHJcblx0XHRcdFx0b3B0aW9ucy5mb3JtYXQgPSB0aGlzLmJhY2tlbmQudXRpbHMuZ2V0Q3VycmVudENvbG9yRm9ybWF0KCBvcHRpb25zLnJlbmRlclRhcmdldCApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0b3B0aW9ucy5mb3JtYXQgPSB0aGlzLmJhY2tlbmQudXRpbHMuZ2V0UHJlZmVycmVkQ2FudmFzRm9ybWF0KCk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGRpbWVuc2lvbiA9IHRoaXMuX2dldERpbWVuc2lvbiggdGV4dHVyZSApO1xyXG5cdFx0Y29uc3QgZm9ybWF0ID0gdGV4dHVyZS5pbnRlcm5hbEZvcm1hdCB8fCBvcHRpb25zLmZvcm1hdCB8fCBnZXRGb3JtYXQoIHRleHR1cmUsIGJhY2tlbmQuZGV2aWNlICk7XHJcblxyXG5cdFx0dGV4dHVyZURhdGEuZm9ybWF0ID0gZm9ybWF0O1xyXG5cclxuXHRcdGNvbnN0IHsgc2FtcGxlcywgcHJpbWFyeVNhbXBsZXMsIGlzTVNBQSB9ID0gYmFja2VuZC51dGlscy5nZXRUZXh0dXJlU2FtcGxlRGF0YSggdGV4dHVyZSApO1xyXG5cclxuXHRcdGxldCB1c2FnZSA9IEdQVVRleHR1cmVVc2FnZS5URVhUVVJFX0JJTkRJTkcgfCBHUFVUZXh0dXJlVXNhZ2UuQ09QWV9EU1QgfCBHUFVUZXh0dXJlVXNhZ2UuQ09QWV9TUkM7XHJcblxyXG5cdFx0aWYgKCB0ZXh0dXJlLmlzU3RvcmFnZVRleHR1cmUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHR1c2FnZSB8PSBHUFVUZXh0dXJlVXNhZ2UuU1RPUkFHRV9CSU5ESU5HO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRleHR1cmUuaXNDb21wcmVzc2VkVGV4dHVyZSAhPT0gdHJ1ZSAmJiB0ZXh0dXJlLmlzQ29tcHJlc3NlZEFycmF5VGV4dHVyZSAhPT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdHVzYWdlIHw9IEdQVVRleHR1cmVVc2FnZS5SRU5ERVJfQVRUQUNITUVOVDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgdGV4dHVyZURlc2NyaXB0b3JHUFUgPSB7XHJcblx0XHRcdGxhYmVsOiB0ZXh0dXJlLm5hbWUsXHJcblx0XHRcdHNpemU6IHtcclxuXHRcdFx0XHR3aWR0aDogd2lkdGgsXHJcblx0XHRcdFx0aGVpZ2h0OiBoZWlnaHQsXHJcblx0XHRcdFx0ZGVwdGhPckFycmF5TGF5ZXJzOiBkZXB0aCxcclxuXHRcdFx0fSxcclxuXHRcdFx0bWlwTGV2ZWxDb3VudDogbGV2ZWxzLFxyXG5cdFx0XHRzYW1wbGVDb3VudDogcHJpbWFyeVNhbXBsZXMsXHJcblx0XHRcdGRpbWVuc2lvbjogZGltZW5zaW9uLFxyXG5cdFx0XHRmb3JtYXQ6IGZvcm1hdCxcclxuXHRcdFx0dXNhZ2U6IHVzYWdlXHJcblx0XHR9O1xyXG5cclxuXHRcdC8vIHRleHR1cmUgY3JlYXRpb25cclxuXHJcblx0XHRpZiAoIHRleHR1cmUuaXNWaWRlb1RleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB2aWRlbyA9IHRleHR1cmUuc291cmNlLmRhdGE7XHJcblx0XHRcdGNvbnN0IHZpZGVvRnJhbWUgPSBuZXcgVmlkZW9GcmFtZSggdmlkZW8gKTtcclxuXHJcblx0XHRcdHRleHR1cmVEZXNjcmlwdG9yR1BVLnNpemUud2lkdGggPSB2aWRlb0ZyYW1lLmRpc3BsYXlXaWR0aDtcclxuXHRcdFx0dGV4dHVyZURlc2NyaXB0b3JHUFUuc2l6ZS5oZWlnaHQgPSB2aWRlb0ZyYW1lLmRpc3BsYXlIZWlnaHQ7XHJcblxyXG5cdFx0XHR2aWRlb0ZyYW1lLmNsb3NlKCk7XHJcblxyXG5cdFx0XHR0ZXh0dXJlRGF0YS5leHRlcm5hbFRleHR1cmUgPSB2aWRlbztcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0aWYgKCBmb3JtYXQgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0Y29uc29sZS53YXJuKCAnV2ViR1BVUmVuZGVyZXI6IFRleHR1cmUgZm9ybWF0IG5vdCBzdXBwb3J0ZWQuJyApO1xyXG5cclxuXHRcdFx0XHR0aGlzLmNyZWF0ZURlZmF1bHRUZXh0dXJlKCB0ZXh0dXJlICk7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGV4dHVyZURhdGEudGV4dHVyZSA9IGJhY2tlbmQuZGV2aWNlLmNyZWF0ZVRleHR1cmUoIHRleHR1cmVEZXNjcmlwdG9yR1BVICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggaXNNU0FBICkge1xyXG5cclxuXHRcdFx0Y29uc3QgbXNhYVRleHR1cmVEZXNjcmlwdG9yR1BVID0gT2JqZWN0LmFzc2lnbigge30sIHRleHR1cmVEZXNjcmlwdG9yR1BVICk7XHJcblxyXG5cdFx0XHRtc2FhVGV4dHVyZURlc2NyaXB0b3JHUFUubGFiZWwgPSBtc2FhVGV4dHVyZURlc2NyaXB0b3JHUFUubGFiZWwgKyAnLW1zYWEnO1xyXG5cdFx0XHRtc2FhVGV4dHVyZURlc2NyaXB0b3JHUFUuc2FtcGxlQ291bnQgPSBzYW1wbGVzO1xyXG5cclxuXHRcdFx0dGV4dHVyZURhdGEubXNhYVRleHR1cmUgPSBiYWNrZW5kLmRldmljZS5jcmVhdGVUZXh0dXJlKCBtc2FhVGV4dHVyZURlc2NyaXB0b3JHUFUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGV4dHVyZURhdGEuaW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG5cclxuXHRcdHRleHR1cmVEYXRhLnRleHR1cmVEZXNjcmlwdG9yR1BVID0gdGV4dHVyZURlc2NyaXB0b3JHUFU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVzdHJveXMgdGhlIEdQVSBkYXRhIGZvciB0aGUgZ2l2ZW4gdGV4dHVyZSBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZS5cclxuXHQgKi9cclxuXHRkZXN0cm95VGV4dHVyZSggdGV4dHVyZSApIHtcclxuXHJcblx0XHRjb25zdCBiYWNrZW5kID0gdGhpcy5iYWNrZW5kO1xyXG5cdFx0Y29uc3QgdGV4dHVyZURhdGEgPSBiYWNrZW5kLmdldCggdGV4dHVyZSApO1xyXG5cclxuXHRcdGlmICggdGV4dHVyZURhdGEudGV4dHVyZSAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZURhdGEudGV4dHVyZS5kZXN0cm95KCk7XHJcblxyXG5cdFx0aWYgKCB0ZXh0dXJlRGF0YS5tc2FhVGV4dHVyZSAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZURhdGEubXNhYVRleHR1cmUuZGVzdHJveSgpO1xyXG5cclxuXHRcdGJhY2tlbmQuZGVsZXRlKCB0ZXh0dXJlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVzdHJveXMgdGhlIEdQVSBzYW1wbGVyIGZvciB0aGUgZ2l2ZW4gdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlIHRvIGRlc3Ryb3kgdGhlIHNhbXBsZXIgZm9yLlxyXG5cdCAqL1xyXG5cdGRlc3Ryb3lTYW1wbGVyKCB0ZXh0dXJlICkge1xyXG5cclxuXHRcdGNvbnN0IGJhY2tlbmQgPSB0aGlzLmJhY2tlbmQ7XHJcblx0XHRjb25zdCB0ZXh0dXJlRGF0YSA9IGJhY2tlbmQuZ2V0KCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0ZGVsZXRlIHRleHR1cmVEYXRhLnNhbXBsZXI7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2VuZXJhdGVzIG1pcG1hcHMgZm9yIHRoZSBnaXZlbiB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUuXHJcblx0ICovXHJcblx0Z2VuZXJhdGVNaXBtYXBzKCB0ZXh0dXJlICkge1xyXG5cclxuXHRcdGNvbnN0IHRleHR1cmVEYXRhID0gdGhpcy5iYWNrZW5kLmdldCggdGV4dHVyZSApO1xyXG5cclxuXHRcdGlmICggdGV4dHVyZS5pc0N1YmVUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgNjsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5fZ2VuZXJhdGVNaXBtYXBzKCB0ZXh0dXJlRGF0YS50ZXh0dXJlLCB0ZXh0dXJlRGF0YS50ZXh0dXJlRGVzY3JpcHRvckdQVSwgaSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRjb25zdCBkZXB0aCA9IHRleHR1cmUuaW1hZ2UuZGVwdGggfHwgMTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGRlcHRoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLl9nZW5lcmF0ZU1pcG1hcHMoIHRleHR1cmVEYXRhLnRleHR1cmUsIHRleHR1cmVEYXRhLnRleHR1cmVEZXNjcmlwdG9yR1BVLCBpICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGNvbG9yIGJ1ZmZlciByZXByZXNlbnRpbmcgdGhlIGNvbG9yXHJcblx0ICogYXR0YWNobWVudCBvZiB0aGUgZGVmYXVsdCBmcmFtZWJ1ZmZlci5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0dQVVRleHR1cmV9IFRoZSBjb2xvciBidWZmZXIuXHJcblx0ICovXHJcblx0Z2V0Q29sb3JCdWZmZXIoKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmNvbG9yQnVmZmVyICkgdGhpcy5jb2xvckJ1ZmZlci5kZXN0cm95KCk7XHJcblxyXG5cdFx0Y29uc3QgYmFja2VuZCA9IHRoaXMuYmFja2VuZDtcclxuXHRcdGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gYmFja2VuZC5nZXREcmF3aW5nQnVmZmVyU2l6ZSgpO1xyXG5cclxuXHRcdHRoaXMuY29sb3JCdWZmZXIgPSBiYWNrZW5kLmRldmljZS5jcmVhdGVUZXh0dXJlKCB7XHJcblx0XHRcdGxhYmVsOiAnY29sb3JCdWZmZXInLFxyXG5cdFx0XHRzaXplOiB7XHJcblx0XHRcdFx0d2lkdGg6IHdpZHRoLFxyXG5cdFx0XHRcdGhlaWdodDogaGVpZ2h0LFxyXG5cdFx0XHRcdGRlcHRoT3JBcnJheUxheWVyczogMVxyXG5cdFx0XHR9LFxyXG5cdFx0XHRzYW1wbGVDb3VudDogYmFja2VuZC51dGlscy5nZXRTYW1wbGVDb3VudCggYmFja2VuZC5yZW5kZXJlci5zYW1wbGVzICksXHJcblx0XHRcdGZvcm1hdDogYmFja2VuZC51dGlscy5nZXRQcmVmZXJyZWRDYW52YXNGb3JtYXQoKSxcclxuXHRcdFx0dXNhZ2U6IEdQVVRleHR1cmVVc2FnZS5SRU5ERVJfQVRUQUNITUVOVCB8IEdQVVRleHR1cmVVc2FnZS5DT1BZX1NSQ1xyXG5cdFx0fSApO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmNvbG9yQnVmZmVyO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGRlcHRoIGJ1ZmZlciByZXByZXNlbnRpbmcgdGhlIGRlcHRoXHJcblx0ICogYXR0YWNobWVudCBvZiB0aGUgZGVmYXVsdCBmcmFtZWJ1ZmZlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW2RlcHRoPXRydWVdIC0gV2hldGhlciBkZXB0aCBpcyBlbmFibGVkIG9yIG5vdC5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtzdGVuY2lsPWZhbHNlXSAtICBXaGV0aGVyIHN0ZW5jaWwgaXMgZW5hYmxlZCBvciBub3QuXHJcblx0ICogQHJldHVybiB7R1BVVGV4dHVyZX0gVGhlIGRlcHRoIGJ1ZmZlci5cclxuXHQgKi9cclxuXHRnZXREZXB0aEJ1ZmZlciggZGVwdGggPSB0cnVlLCBzdGVuY2lsID0gZmFsc2UgKSB7XHJcblxyXG5cdFx0Y29uc3QgYmFja2VuZCA9IHRoaXMuYmFja2VuZDtcclxuXHRcdGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gYmFja2VuZC5nZXREcmF3aW5nQnVmZmVyU2l6ZSgpO1xyXG5cclxuXHRcdGNvbnN0IGRlcHRoVGV4dHVyZSA9IHRoaXMuZGVwdGhUZXh0dXJlO1xyXG5cdFx0Y29uc3QgZGVwdGhUZXh0dXJlR1BVID0gYmFja2VuZC5nZXQoIGRlcHRoVGV4dHVyZSApLnRleHR1cmU7XHJcblxyXG5cdFx0bGV0IGZvcm1hdCwgdHlwZTtcclxuXHJcblx0XHRpZiAoIHN0ZW5jaWwgKSB7XHJcblxyXG5cdFx0XHRmb3JtYXQgPSBEZXB0aFN0ZW5jaWxGb3JtYXQ7XHJcblx0XHRcdHR5cGUgPSBVbnNpZ25lZEludDI0OFR5cGU7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggZGVwdGggKSB7XHJcblxyXG5cdFx0XHRmb3JtYXQgPSBEZXB0aEZvcm1hdDtcclxuXHRcdFx0dHlwZSA9IFVuc2lnbmVkSW50VHlwZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBkZXB0aFRleHR1cmVHUFUgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGlmICggZGVwdGhUZXh0dXJlLmltYWdlLndpZHRoID09PSB3aWR0aCAmJiBkZXB0aFRleHR1cmUuaW1hZ2UuaGVpZ2h0ID09PSBoZWlnaHQgJiYgZGVwdGhUZXh0dXJlLmZvcm1hdCA9PT0gZm9ybWF0ICYmIGRlcHRoVGV4dHVyZS50eXBlID09PSB0eXBlICkge1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gZGVwdGhUZXh0dXJlR1BVO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5kZXN0cm95VGV4dHVyZSggZGVwdGhUZXh0dXJlICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGRlcHRoVGV4dHVyZS5uYW1lID0gJ2RlcHRoQnVmZmVyJztcclxuXHRcdGRlcHRoVGV4dHVyZS5mb3JtYXQgPSBmb3JtYXQ7XHJcblx0XHRkZXB0aFRleHR1cmUudHlwZSA9IHR5cGU7XHJcblx0XHRkZXB0aFRleHR1cmUuaW1hZ2Uud2lkdGggPSB3aWR0aDtcclxuXHRcdGRlcHRoVGV4dHVyZS5pbWFnZS5oZWlnaHQgPSBoZWlnaHQ7XHJcblxyXG5cdFx0dGhpcy5jcmVhdGVUZXh0dXJlKCBkZXB0aFRleHR1cmUsIHsgd2lkdGgsIGhlaWdodCB9ICk7XHJcblxyXG5cdFx0cmV0dXJuIGJhY2tlbmQuZ2V0KCBkZXB0aFRleHR1cmUgKS50ZXh0dXJlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwbG9hZHMgdGhlIHVwZGF0ZWQgdGV4dHVyZSBkYXRhIHRvIHRoZSBHUFUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIuXHJcblx0ICovXHJcblx0dXBkYXRlVGV4dHVyZSggdGV4dHVyZSwgb3B0aW9ucyApIHtcclxuXHJcblx0XHRjb25zdCB0ZXh0dXJlRGF0YSA9IHRoaXMuYmFja2VuZC5nZXQoIHRleHR1cmUgKTtcclxuXHJcblx0XHRjb25zdCB7IHRleHR1cmVEZXNjcmlwdG9yR1BVIH0gPSB0ZXh0dXJlRGF0YTtcclxuXHJcblx0XHRpZiAoIHRleHR1cmUuaXNSZW5kZXJUYXJnZXRUZXh0dXJlIHx8ICggdGV4dHVyZURlc2NyaXB0b3JHUFUgPT09IHVuZGVmaW5lZCAvKiB1bnN1cHBvcnRlZCB0ZXh0dXJlIGZvcm1hdCAqLyApIClcclxuXHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdC8vIHRyYW5zZmVyIHRleHR1cmUgZGF0YVxyXG5cclxuXHRcdGlmICggdGV4dHVyZS5pc0RhdGFUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0dGhpcy5fY29weUJ1ZmZlclRvVGV4dHVyZSggb3B0aW9ucy5pbWFnZSwgdGV4dHVyZURhdGEudGV4dHVyZSwgdGV4dHVyZURlc2NyaXB0b3JHUFUsIDAsIHRleHR1cmUuZmxpcFkgKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCB0ZXh0dXJlLmlzRGF0YUFycmF5VGV4dHVyZSB8fCB0ZXh0dXJlLmlzRGF0YTNEVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IG9wdGlvbnMuaW1hZ2UuZGVwdGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdHRoaXMuX2NvcHlCdWZmZXJUb1RleHR1cmUoIG9wdGlvbnMuaW1hZ2UsIHRleHR1cmVEYXRhLnRleHR1cmUsIHRleHR1cmVEZXNjcmlwdG9yR1BVLCBpLCB0ZXh0dXJlLmZsaXBZLCBpICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmICggdGV4dHVyZS5pc0NvbXByZXNzZWRUZXh0dXJlIHx8IHRleHR1cmUuaXNDb21wcmVzc2VkQXJyYXlUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0dGhpcy5fY29weUNvbXByZXNzZWRCdWZmZXJUb1RleHR1cmUoIHRleHR1cmUubWlwbWFwcywgdGV4dHVyZURhdGEudGV4dHVyZSwgdGV4dHVyZURlc2NyaXB0b3JHUFUgKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCB0ZXh0dXJlLmlzQ3ViZVRleHR1cmUgKSB7XHJcblxyXG5cdFx0XHR0aGlzLl9jb3B5Q3ViZU1hcFRvVGV4dHVyZSggb3B0aW9ucy5pbWFnZXMsIHRleHR1cmVEYXRhLnRleHR1cmUsIHRleHR1cmVEZXNjcmlwdG9yR1BVLCB0ZXh0dXJlLmZsaXBZICk7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggdGV4dHVyZS5pc1ZpZGVvVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdGNvbnN0IHZpZGVvID0gdGV4dHVyZS5zb3VyY2UuZGF0YTtcclxuXHJcblx0XHRcdHRleHR1cmVEYXRhLmV4dGVybmFsVGV4dHVyZSA9IHZpZGVvO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHR0aGlzLl9jb3B5SW1hZ2VUb1RleHR1cmUoIG9wdGlvbnMuaW1hZ2UsIHRleHR1cmVEYXRhLnRleHR1cmUsIHRleHR1cmVEZXNjcmlwdG9yR1BVLCAwLCB0ZXh0dXJlLmZsaXBZICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0dGV4dHVyZURhdGEudmVyc2lvbiA9IHRleHR1cmUudmVyc2lvbjtcclxuXHJcblx0XHRpZiAoIHRleHR1cmUub25VcGRhdGUgKSB0ZXh0dXJlLm9uVXBkYXRlKCB0ZXh0dXJlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0ZXh0dXJlIGRhdGEgYXMgYSB0eXBlZCBhcnJheS5cclxuXHQgKlxyXG5cdCAqIEBhc3luY1xyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlIHRvIGNvcHkuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBjb3B5IG9yaWdpbi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGNvcHkgb3JpZ2luLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgY29weS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgY29weS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZmFjZUluZGV4IC0gVGhlIGZhY2UgaW5kZXguXHJcblx0ICogQHJldHVybiB7UHJvbWlzZTxUeXBlZEFycmF5Pn0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCBhIHR5cGVkIGFycmF5IHdoZW4gdGhlIGNvcHkgb3BlcmF0aW9uIGhhcyBmaW5pc2hlZC5cclxuXHQgKi9cclxuXHRhc3luYyBjb3B5VGV4dHVyZVRvQnVmZmVyKCB0ZXh0dXJlLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmYWNlSW5kZXggKSB7XHJcblxyXG5cdFx0Y29uc3QgZGV2aWNlID0gdGhpcy5iYWNrZW5kLmRldmljZTtcclxuXHJcblx0XHRjb25zdCB0ZXh0dXJlRGF0YSA9IHRoaXMuYmFja2VuZC5nZXQoIHRleHR1cmUgKTtcclxuXHRcdGNvbnN0IHRleHR1cmVHUFUgPSB0ZXh0dXJlRGF0YS50ZXh0dXJlO1xyXG5cdFx0Y29uc3QgZm9ybWF0ID0gdGV4dHVyZURhdGEudGV4dHVyZURlc2NyaXB0b3JHUFUuZm9ybWF0O1xyXG5cdFx0Y29uc3QgYnl0ZXNQZXJUZXhlbCA9IHRoaXMuX2dldEJ5dGVzUGVyVGV4ZWwoIGZvcm1hdCApO1xyXG5cclxuXHRcdGxldCBieXRlc1BlclJvdyA9IHdpZHRoICogYnl0ZXNQZXJUZXhlbDtcclxuXHRcdGJ5dGVzUGVyUm93ID0gTWF0aC5jZWlsKCBieXRlc1BlclJvdyAvIDI1NiApICogMjU2OyAvLyBBbGlnbiB0byAyNTYgYnl0ZXNcclxuXHJcblx0XHRjb25zdCByZWFkQnVmZmVyID0gZGV2aWNlLmNyZWF0ZUJ1ZmZlcihcclxuXHRcdFx0e1xyXG5cdFx0XHRcdHNpemU6IHdpZHRoICogaGVpZ2h0ICogYnl0ZXNQZXJUZXhlbCxcclxuXHRcdFx0XHR1c2FnZTogR1BVQnVmZmVyVXNhZ2UuQ09QWV9EU1QgfCBHUFVCdWZmZXJVc2FnZS5NQVBfUkVBRFxyXG5cdFx0XHR9XHJcblx0XHQpO1xyXG5cclxuXHRcdGNvbnN0IGVuY29kZXIgPSBkZXZpY2UuY3JlYXRlQ29tbWFuZEVuY29kZXIoKTtcclxuXHJcblx0XHRlbmNvZGVyLmNvcHlUZXh0dXJlVG9CdWZmZXIoXHJcblx0XHRcdHtcclxuXHRcdFx0XHR0ZXh0dXJlOiB0ZXh0dXJlR1BVLFxyXG5cdFx0XHRcdG9yaWdpbjogeyB4LCB5LCB6OiBmYWNlSW5kZXggfSxcclxuXHRcdFx0fSxcclxuXHRcdFx0e1xyXG5cdFx0XHRcdGJ1ZmZlcjogcmVhZEJ1ZmZlcixcclxuXHRcdFx0XHRieXRlc1BlclJvdzogYnl0ZXNQZXJSb3dcclxuXHRcdFx0fSxcclxuXHRcdFx0e1xyXG5cdFx0XHRcdHdpZHRoOiB3aWR0aCxcclxuXHRcdFx0XHRoZWlnaHQ6IGhlaWdodFxyXG5cdFx0XHR9XHJcblxyXG5cdFx0KTtcclxuXHJcblx0XHRjb25zdCB0eXBlZEFycmF5VHlwZSA9IHRoaXMuX2dldFR5cGVkQXJyYXlUeXBlKCBmb3JtYXQgKTtcclxuXHJcblx0XHRkZXZpY2UucXVldWUuc3VibWl0KCBbIGVuY29kZXIuZmluaXNoKCkgXSApO1xyXG5cclxuXHRcdGF3YWl0IHJlYWRCdWZmZXIubWFwQXN5bmMoIEdQVU1hcE1vZGUuUkVBRCApO1xyXG5cclxuXHRcdGNvbnN0IGJ1ZmZlciA9IHJlYWRCdWZmZXIuZ2V0TWFwcGVkUmFuZ2UoKTtcclxuXHJcblx0XHRyZXR1cm4gbmV3IHR5cGVkQXJyYXlUeXBlKCBidWZmZXIgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gdGV4dHVyZSBpcyBhbiBlbnZpcm9ubWVudCBtYXAuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlLlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGdpdmVuIHRleHR1cmUgaXMgYW4gZW52aXJvbm1lbnQgbWFwIG9yIG5vdC5cclxuXHQgKi9cclxuXHRfaXNFbnZpcm9ubWVudFRleHR1cmUoIHRleHR1cmUgKSB7XHJcblxyXG5cdFx0Y29uc3QgbWFwcGluZyA9IHRleHR1cmUubWFwcGluZztcclxuXHJcblx0XHRyZXR1cm4gKCBtYXBwaW5nID09PSBFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZyB8fCBtYXBwaW5nID09PSBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZyApIHx8ICggbWFwcGluZyA9PT0gQ3ViZVJlZmxlY3Rpb25NYXBwaW5nIHx8IG1hcHBpbmcgPT09IEN1YmVSZWZyYWN0aW9uTWFwcGluZyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGRlZmF1bHQgR1BVIHRleHR1cmUgZm9yIHRoZSBnaXZlbiBmb3JtYXQuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtYXQgLSBUaGUgR1BVIGZvcm1hdC5cclxuXHQgKiBAcmV0dXJuIHtHUFVUZXh0dXJlfSBUaGUgR1BVIHRleHR1cmUuXHJcblx0ICovXHJcblx0X2dldERlZmF1bHRUZXh0dXJlR1BVKCBmb3JtYXQgKSB7XHJcblxyXG5cdFx0bGV0IGRlZmF1bHRUZXh0dXJlID0gdGhpcy5kZWZhdWx0VGV4dHVyZVsgZm9ybWF0IF07XHJcblxyXG5cdFx0aWYgKCBkZWZhdWx0VGV4dHVyZSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdGV4dHVyZSA9IG5ldyBUZXh0dXJlKCk7XHJcblx0XHRcdHRleHR1cmUubWluRmlsdGVyID0gTmVhcmVzdEZpbHRlcjtcclxuXHRcdFx0dGV4dHVyZS5tYWdGaWx0ZXIgPSBOZWFyZXN0RmlsdGVyO1xyXG5cclxuXHRcdFx0dGhpcy5jcmVhdGVUZXh0dXJlKCB0ZXh0dXJlLCB7IHdpZHRoOiAxLCBoZWlnaHQ6IDEsIGZvcm1hdCB9ICk7XHJcblxyXG5cdFx0XHR0aGlzLmRlZmF1bHRUZXh0dXJlWyBmb3JtYXQgXSA9IGRlZmF1bHRUZXh0dXJlID0gdGV4dHVyZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuYmFja2VuZC5nZXQoIGRlZmF1bHRUZXh0dXJlICkudGV4dHVyZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IEdQVSBjdWJlIHRleHR1cmUgZm9yIHRoZSBnaXZlbiBmb3JtYXQuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtYXQgLSBUaGUgR1BVIGZvcm1hdC5cclxuXHQgKiBAcmV0dXJuIHtHUFVUZXh0dXJlfSBUaGUgR1BVIHRleHR1cmUuXHJcblx0ICovXHJcblx0X2dldERlZmF1bHRDdWJlVGV4dHVyZUdQVSggZm9ybWF0ICkge1xyXG5cclxuXHRcdGxldCBkZWZhdWx0Q3ViZVRleHR1cmUgPSB0aGlzLmRlZmF1bHRUZXh0dXJlWyBmb3JtYXQgXTtcclxuXHJcblx0XHRpZiAoIGRlZmF1bHRDdWJlVGV4dHVyZSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdGV4dHVyZSA9IG5ldyBDdWJlVGV4dHVyZSgpO1xyXG5cdFx0XHR0ZXh0dXJlLm1pbkZpbHRlciA9IE5lYXJlc3RGaWx0ZXI7XHJcblx0XHRcdHRleHR1cmUubWFnRmlsdGVyID0gTmVhcmVzdEZpbHRlcjtcclxuXHJcblx0XHRcdHRoaXMuY3JlYXRlVGV4dHVyZSggdGV4dHVyZSwgeyB3aWR0aDogMSwgaGVpZ2h0OiAxLCBkZXB0aDogNiB9ICk7XHJcblxyXG5cdFx0XHR0aGlzLmRlZmF1bHRDdWJlVGV4dHVyZVsgZm9ybWF0IF0gPSBkZWZhdWx0Q3ViZVRleHR1cmUgPSB0ZXh0dXJlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcy5iYWNrZW5kLmdldCggZGVmYXVsdEN1YmVUZXh0dXJlICkudGV4dHVyZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHZpZGVvIGZyYW1lIHVzZWQgYXMgZGVmYXVsdCBkYXRhIGluIGNvbnRleHQgb2YgdmlkZW8gdGV4dHVyZXMuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEByZXR1cm4ge1ZpZGVvRnJhbWV9IFRoZSB2aWRlbyBmcmFtZS5cclxuXHQgKi9cclxuXHRfZ2V0RGVmYXVsdFZpZGVvRnJhbWUoKSB7XHJcblxyXG5cdFx0bGV0IGRlZmF1bHRWaWRlb0ZyYW1lID0gdGhpcy5kZWZhdWx0VmlkZW9GcmFtZTtcclxuXHJcblx0XHRpZiAoIGRlZmF1bHRWaWRlb0ZyYW1lID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0Y29uc3QgaW5pdCA9IHtcclxuXHRcdFx0XHR0aW1lc3RhbXA6IDAsXHJcblx0XHRcdFx0Y29kZWRXaWR0aDogMSxcclxuXHRcdFx0XHRjb2RlZEhlaWdodDogMSxcclxuXHRcdFx0XHRmb3JtYXQ6ICdSR0JBJyxcclxuXHRcdFx0fTtcclxuXHJcblx0XHRcdHRoaXMuZGVmYXVsdFZpZGVvRnJhbWUgPSBkZWZhdWx0VmlkZW9GcmFtZSA9IG5ldyBWaWRlb0ZyYW1lKCBuZXcgVWludDhBcnJheSggWyAwLCAwLCAwLCAweGZmIF0gKSwgaW5pdCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZGVmYXVsdFZpZGVvRnJhbWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBsb2FkcyBjdWJlIHRleHR1cmUgaW1hZ2UgZGF0YSB0byB0aGUgR1BVIG1lbW9yeS5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtBcnJheX0gaW1hZ2VzIC0gVGhlIGN1YmUgaW1hZ2UgZGF0YS5cclxuXHQgKiBAcGFyYW0ge0dQVVRleHR1cmV9IHRleHR1cmVHUFUgLSBUaGUgR1BVIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IHRleHR1cmVEZXNjcmlwdG9yR1BVIC0gVGhlIEdQVSB0ZXh0dXJlIGRlc2NyaXB0b3IuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBmbGlwWSAtIFdoZXRoZXIgdG8gZmxpcCB0ZXh0dXJlIGRhdGEgYWxvbmcgdGhlaXIgdmVydGljYWwgYXhpcyBvciBub3QuXHJcblx0ICovXHJcblx0X2NvcHlDdWJlTWFwVG9UZXh0dXJlKCBpbWFnZXMsIHRleHR1cmVHUFUsIHRleHR1cmVEZXNjcmlwdG9yR1BVLCBmbGlwWSApIHtcclxuXHJcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCA2OyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgaW1hZ2UgPSBpbWFnZXNbIGkgXTtcclxuXHJcblx0XHRcdGNvbnN0IGZsaXBJbmRleCA9IGZsaXBZID09PSB0cnVlID8gX2ZsaXBNYXBbIGkgXSA6IGk7XHJcblxyXG5cdFx0XHRpZiAoIGltYWdlLmlzRGF0YVRleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRcdHRoaXMuX2NvcHlCdWZmZXJUb1RleHR1cmUoIGltYWdlLmltYWdlLCB0ZXh0dXJlR1BVLCB0ZXh0dXJlRGVzY3JpcHRvckdQVSwgZmxpcEluZGV4LCBmbGlwWSApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0dGhpcy5fY29weUltYWdlVG9UZXh0dXJlKCBpbWFnZSwgdGV4dHVyZUdQVSwgdGV4dHVyZURlc2NyaXB0b3JHUFUsIGZsaXBJbmRleCwgZmxpcFkgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBsb2FkcyB0ZXh0dXJlIGltYWdlIGRhdGEgdG8gdGhlIEdQVSBtZW1vcnkuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7SFRNTEltYWdlRWxlbWVudHxJbWFnZUJpdG1hcHxIVE1MQ2FudmFzRWxlbWVudH0gaW1hZ2UgLSBUaGUgaW1hZ2UgZGF0YS5cclxuXHQgKiBAcGFyYW0ge0dQVVRleHR1cmV9IHRleHR1cmVHUFUgLSBUaGUgR1BVIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IHRleHR1cmVEZXNjcmlwdG9yR1BVIC0gVGhlIEdQVSB0ZXh0dXJlIGRlc2NyaXB0b3IuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IG9yaWdpbkRlcHRoIC0gVGhlIG9yaWdpbiBkZXB0aC5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IGZsaXBZIC0gV2hldGhlciB0byBmbGlwIHRleHR1cmUgZGF0YSBhbG9uZyB0aGVpciB2ZXJ0aWNhbCBheGlzIG9yIG5vdC5cclxuXHQgKi9cclxuXHRfY29weUltYWdlVG9UZXh0dXJlKCBpbWFnZSwgdGV4dHVyZUdQVSwgdGV4dHVyZURlc2NyaXB0b3JHUFUsIG9yaWdpbkRlcHRoLCBmbGlwWSApIHtcclxuXHJcblx0XHRjb25zdCBkZXZpY2UgPSB0aGlzLmJhY2tlbmQuZGV2aWNlO1xyXG5cclxuXHRcdGRldmljZS5xdWV1ZS5jb3B5RXh0ZXJuYWxJbWFnZVRvVGV4dHVyZShcclxuXHRcdFx0e1xyXG5cdFx0XHRcdHNvdXJjZTogaW1hZ2UsXHJcblx0XHRcdFx0ZmxpcFk6IGZsaXBZXHJcblx0XHRcdH0sIHtcclxuXHRcdFx0XHR0ZXh0dXJlOiB0ZXh0dXJlR1BVLFxyXG5cdFx0XHRcdG1pcExldmVsOiAwLFxyXG5cdFx0XHRcdG9yaWdpbjogeyB4OiAwLCB5OiAwLCB6OiBvcmlnaW5EZXB0aCB9XHJcblx0XHRcdH0sIHtcclxuXHRcdFx0XHR3aWR0aDogaW1hZ2Uud2lkdGgsXHJcblx0XHRcdFx0aGVpZ2h0OiBpbWFnZS5oZWlnaHQsXHJcblx0XHRcdFx0ZGVwdGhPckFycmF5TGF5ZXJzOiAxXHJcblx0XHRcdH1cclxuXHRcdCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgcGFzcyB1dGlscyBzaW5nbGV0b24uXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEByZXR1cm4ge1dlYkdQVVRleHR1cmVQYXNzVXRpbHN9IFRoZSB1dGlscyBpbnN0YW5jZS5cclxuXHQgKi9cclxuXHRfZ2V0UGFzc1V0aWxzKCkge1xyXG5cclxuXHRcdGxldCBwYXNzVXRpbHMgPSB0aGlzLl9wYXNzVXRpbHM7XHJcblxyXG5cdFx0aWYgKCBwYXNzVXRpbHMgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLl9wYXNzVXRpbHMgPSBwYXNzVXRpbHMgPSBuZXcgV2ViR1BVVGV4dHVyZVBhc3NVdGlscyggdGhpcy5iYWNrZW5kLmRldmljZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcGFzc1V0aWxzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyBtaXBtYXBzIGZvciB0aGUgZ2l2ZW4gR1BVIHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7R1BVVGV4dHVyZX0gdGV4dHVyZUdQVSAtIFRoZSBHUFUgdGV4dHVyZSBvYmplY3QuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IHRleHR1cmVEZXNjcmlwdG9yR1BVIC0gVGhlIHRleHR1cmUgZGVzY3JpcHRvci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2Jhc2VBcnJheUxheWVyPTBdIC0gVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBhcnJheSBsYXllciBhY2Nlc3NpYmxlIHRvIHRoZSB0ZXh0dXJlIHZpZXcuXHJcblx0ICovXHJcblx0X2dlbmVyYXRlTWlwbWFwcyggdGV4dHVyZUdQVSwgdGV4dHVyZURlc2NyaXB0b3JHUFUsIGJhc2VBcnJheUxheWVyID0gMCApIHtcclxuXHJcblx0XHR0aGlzLl9nZXRQYXNzVXRpbHMoKS5nZW5lcmF0ZU1pcG1hcHMoIHRleHR1cmVHUFUsIHRleHR1cmVEZXNjcmlwdG9yR1BVLCBiYXNlQXJyYXlMYXllciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZsaXAgdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBHUFUgdGV4dHVyZSBhbG9uZyBpdHMgdmVydGljYWwgYXhpcy5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtHUFVUZXh0dXJlfSB0ZXh0dXJlR1BVIC0gVGhlIEdQVSB0ZXh0dXJlIG9iamVjdC5cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gdGV4dHVyZURlc2NyaXB0b3JHUFUgLSBUaGUgdGV4dHVyZSBkZXNjcmlwdG9yLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbb3JpZ2luRGVwdGg9MF0gLSBUaGUgb3JpZ2luIGRlcHRoLlxyXG5cdCAqL1xyXG5cdF9mbGlwWSggdGV4dHVyZUdQVSwgdGV4dHVyZURlc2NyaXB0b3JHUFUsIG9yaWdpbkRlcHRoID0gMCApIHtcclxuXHJcblx0XHR0aGlzLl9nZXRQYXNzVXRpbHMoKS5mbGlwWSggdGV4dHVyZUdQVSwgdGV4dHVyZURlc2NyaXB0b3JHUFUsIG9yaWdpbkRlcHRoICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBsb2FkcyB0ZXh0dXJlIGJ1ZmZlciBkYXRhIHRvIHRoZSBHUFUgbWVtb3J5LlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gaW1hZ2UgLSBBbiBvYmplY3QgZGVmaW5pbmcgdGhlIGltYWdlIGJ1ZmZlciBkYXRhLlxyXG5cdCAqIEBwYXJhbSB7R1BVVGV4dHVyZX0gdGV4dHVyZUdQVSAtIFRoZSBHUFUgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gdGV4dHVyZURlc2NyaXB0b3JHUFUgLSBUaGUgR1BVIHRleHR1cmUgZGVzY3JpcHRvci5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gb3JpZ2luRGVwdGggLSBUaGUgb3JpZ2luIGRlcHRoLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gZmxpcFkgLSBXaGV0aGVyIHRvIGZsaXAgdGV4dHVyZSBkYXRhIGFsb25nIHRoZWlyIHZlcnRpY2FsIGF4aXMgb3Igbm90LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZGVwdGg9MF0gLSBUT0RPLlxyXG5cdCAqL1xyXG5cdF9jb3B5QnVmZmVyVG9UZXh0dXJlKCBpbWFnZSwgdGV4dHVyZUdQVSwgdGV4dHVyZURlc2NyaXB0b3JHUFUsIG9yaWdpbkRlcHRoLCBmbGlwWSwgZGVwdGggPSAwICkge1xyXG5cclxuXHRcdC8vIEBUT0RPOiBDb25zaWRlciB0byB1c2UgR1BVQ29tbWFuZEVuY29kZXIuY29weUJ1ZmZlclRvVGV4dHVyZSgpXHJcblx0XHQvLyBAVE9ETzogQ29uc2lkZXIgdG8gc3VwcG9ydCB2YWxpZCBidWZmZXIgbGF5b3V0cyB3aXRoIG90aGVyIGZvcm1hdHMgbGlrZSBSR0JcclxuXHJcblx0XHRjb25zdCBkZXZpY2UgPSB0aGlzLmJhY2tlbmQuZGV2aWNlO1xyXG5cclxuXHRcdGNvbnN0IGRhdGEgPSBpbWFnZS5kYXRhO1xyXG5cclxuXHRcdGNvbnN0IGJ5dGVzUGVyVGV4ZWwgPSB0aGlzLl9nZXRCeXRlc1BlclRleGVsKCB0ZXh0dXJlRGVzY3JpcHRvckdQVS5mb3JtYXQgKTtcclxuXHRcdGNvbnN0IGJ5dGVzUGVyUm93ID0gaW1hZ2Uud2lkdGggKiBieXRlc1BlclRleGVsO1xyXG5cclxuXHRcdGRldmljZS5xdWV1ZS53cml0ZVRleHR1cmUoXHJcblx0XHRcdHtcclxuXHRcdFx0XHR0ZXh0dXJlOiB0ZXh0dXJlR1BVLFxyXG5cdFx0XHRcdG1pcExldmVsOiAwLFxyXG5cdFx0XHRcdG9yaWdpbjogeyB4OiAwLCB5OiAwLCB6OiBvcmlnaW5EZXB0aCB9XHJcblx0XHRcdH0sXHJcblx0XHRcdGRhdGEsXHJcblx0XHRcdHtcclxuXHRcdFx0XHRvZmZzZXQ6IGltYWdlLndpZHRoICogaW1hZ2UuaGVpZ2h0ICogYnl0ZXNQZXJUZXhlbCAqIGRlcHRoLFxyXG5cdFx0XHRcdGJ5dGVzUGVyUm93XHJcblx0XHRcdH0sXHJcblx0XHRcdHtcclxuXHRcdFx0XHR3aWR0aDogaW1hZ2Uud2lkdGgsXHJcblx0XHRcdFx0aGVpZ2h0OiBpbWFnZS5oZWlnaHQsXHJcblx0XHRcdFx0ZGVwdGhPckFycmF5TGF5ZXJzOiAxXHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHRpZiAoIGZsaXBZID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0dGhpcy5fZmxpcFkoIHRleHR1cmVHUFUsIHRleHR1cmVEZXNjcmlwdG9yR1BVLCBvcmlnaW5EZXB0aCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGxvYWRzIGNvbXByZXNzZWQgdGV4dHVyZSBkYXRhIHRvIHRoZSBHUFUgbWVtb3J5LlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge0FycmF5PE9iamVjdD59IG1pcG1hcHMgLSBBbiBhcnJheSB3aXRoIG1pcG1hcCBkYXRhLlxyXG5cdCAqIEBwYXJhbSB7R1BVVGV4dHVyZX0gdGV4dHVyZUdQVSAtIFRoZSBHUFUgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gdGV4dHVyZURlc2NyaXB0b3JHUFUgLSBUaGUgR1BVIHRleHR1cmUgZGVzY3JpcHRvci5cclxuXHQgKi9cclxuXHRfY29weUNvbXByZXNzZWRCdWZmZXJUb1RleHR1cmUoIG1pcG1hcHMsIHRleHR1cmVHUFUsIHRleHR1cmVEZXNjcmlwdG9yR1BVICkge1xyXG5cclxuXHRcdC8vIEBUT0RPOiBDb25zaWRlciB0byB1c2UgR1BVQ29tbWFuZEVuY29kZXIuY29weUJ1ZmZlclRvVGV4dHVyZSgpXHJcblxyXG5cdFx0Y29uc3QgZGV2aWNlID0gdGhpcy5iYWNrZW5kLmRldmljZTtcclxuXHJcblx0XHRjb25zdCBibG9ja0RhdGEgPSB0aGlzLl9nZXRCbG9ja0RhdGEoIHRleHR1cmVEZXNjcmlwdG9yR1BVLmZvcm1hdCApO1xyXG5cdFx0Y29uc3QgaXNUZXh0dXJlQXJyYXkgPSB0ZXh0dXJlRGVzY3JpcHRvckdQVS5zaXplLmRlcHRoT3JBcnJheUxheWVycyA+IDE7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgbWlwbWFwcy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBtaXBtYXAgPSBtaXBtYXBzWyBpIF07XHJcblxyXG5cdFx0XHRjb25zdCB3aWR0aCA9IG1pcG1hcC53aWR0aDtcclxuXHRcdFx0Y29uc3QgaGVpZ2h0ID0gbWlwbWFwLmhlaWdodDtcclxuXHRcdFx0Y29uc3QgZGVwdGggPSBpc1RleHR1cmVBcnJheSA/IHRleHR1cmVEZXNjcmlwdG9yR1BVLnNpemUuZGVwdGhPckFycmF5TGF5ZXJzIDogMTtcclxuXHJcblx0XHRcdGNvbnN0IGJ5dGVzUGVyUm93ID0gTWF0aC5jZWlsKCB3aWR0aCAvIGJsb2NrRGF0YS53aWR0aCApICogYmxvY2tEYXRhLmJ5dGVMZW5ndGg7XHJcblx0XHRcdGNvbnN0IGJ5dGVzUGVySW1hZ2UgPSBieXRlc1BlclJvdyAqIE1hdGguY2VpbCggaGVpZ2h0IC8gYmxvY2tEYXRhLmhlaWdodCApO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGogPSAwOyBqIDwgZGVwdGg7IGogKysgKSB7XHJcblxyXG5cdFx0XHRcdGRldmljZS5xdWV1ZS53cml0ZVRleHR1cmUoXHJcblx0XHRcdFx0XHR7XHJcblx0XHRcdFx0XHRcdHRleHR1cmU6IHRleHR1cmVHUFUsXHJcblx0XHRcdFx0XHRcdG1pcExldmVsOiBpLFxyXG5cdFx0XHRcdFx0XHRvcmlnaW46IHsgeDogMCwgeTogMCwgejogaiB9XHJcblx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0bWlwbWFwLmRhdGEsXHJcblx0XHRcdFx0XHR7XHJcblx0XHRcdFx0XHRcdG9mZnNldDogaiAqIGJ5dGVzUGVySW1hZ2UsXHJcblx0XHRcdFx0XHRcdGJ5dGVzUGVyUm93LFxyXG5cdFx0XHRcdFx0XHRyb3dzUGVySW1hZ2U6IE1hdGguY2VpbCggaGVpZ2h0IC8gYmxvY2tEYXRhLmhlaWdodCApXHJcblx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0XHR3aWR0aDogTWF0aC5jZWlsKCB3aWR0aCAvIGJsb2NrRGF0YS53aWR0aCApICogYmxvY2tEYXRhLndpZHRoLFxyXG5cdFx0XHRcdFx0XHRoZWlnaHQ6IE1hdGguY2VpbCggaGVpZ2h0IC8gYmxvY2tEYXRhLmhlaWdodCApICogYmxvY2tEYXRhLmhlaWdodCxcclxuXHRcdFx0XHRcdFx0ZGVwdGhPckFycmF5TGF5ZXJzOiAxXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0KTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgaXMgb25seSByZWxldmFudCBmb3IgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdHMuIEl0IHJldHVybnMgYSBibG9ja1xyXG5cdCAqIGRhdGEgZGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIEdQVSBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0LlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gZm9ybWF0IC0gVGhlIEdQVSBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0LlxyXG5cdCAqIEByZXR1cm4ge09iamVjdH0gVGhlIGJsb2NrIGRhdGEgZGVzY3JpcHRvci5cclxuXHQgKi9cclxuXHRfZ2V0QmxvY2tEYXRhKCBmb3JtYXQgKSB7XHJcblxyXG5cdFx0aWYgKCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuQkMxUkdCQVVub3JtIHx8IGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5CQzFSR0JBVW5vcm1TUkdCICkgcmV0dXJuIHsgYnl0ZUxlbmd0aDogOCwgd2lkdGg6IDQsIGhlaWdodDogNCB9OyAvLyBEWFQxXHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5CQzJSR0JBVW5vcm0gfHwgZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LkJDMlJHQkFVbm9ybVNSR0IgKSByZXR1cm4geyBieXRlTGVuZ3RoOiAxNiwgd2lkdGg6IDQsIGhlaWdodDogNCB9OyAvLyBEWFQzXHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5CQzNSR0JBVW5vcm0gfHwgZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LkJDM1JHQkFVbm9ybVNSR0IgKSByZXR1cm4geyBieXRlTGVuZ3RoOiAxNiwgd2lkdGg6IDQsIGhlaWdodDogNCB9OyAvLyBEWFQ1XHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5CQzRSVW5vcm0gfHwgZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LkJDNFJTbm9ybSApIHJldHVybiB7IGJ5dGVMZW5ndGg6IDgsIHdpZHRoOiA0LCBoZWlnaHQ6IDQgfTsgLy8gUkdUQzFcclxuXHRcdGlmICggZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LkJDNVJHVW5vcm0gfHwgZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LkJDNVJHU25vcm0gKSByZXR1cm4geyBieXRlTGVuZ3RoOiAxNiwgd2lkdGg6IDQsIGhlaWdodDogNCB9OyAvLyBSR1RDMlxyXG5cdFx0aWYgKCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuQkM2SFJHQlVGbG9hdCB8fCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuQkM2SFJHQkZsb2F0ICkgcmV0dXJuIHsgYnl0ZUxlbmd0aDogMTYsIHdpZHRoOiA0LCBoZWlnaHQ6IDQgfTsgLy8gQlBUQyAoZmxvYXQpXHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5CQzdSR0JBVW5vcm0gfHwgZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LkJDN1JHQkFVbm9ybVNSR0IgKSByZXR1cm4geyBieXRlTGVuZ3RoOiAxNiwgd2lkdGg6IDQsIGhlaWdodDogNCB9OyAvLyBCUFRDICh1bm9ybSlcclxuXHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5FVEMyUkdCOFVub3JtIHx8IGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5FVEMyUkdCOFVub3JtU1JHQiApIHJldHVybiB7IGJ5dGVMZW5ndGg6IDgsIHdpZHRoOiA0LCBoZWlnaHQ6IDQgfTtcclxuXHRcdGlmICggZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LkVUQzJSR0I4QTFVbm9ybSB8fCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuRVRDMlJHQjhBMVVub3JtU1JHQiApIHJldHVybiB7IGJ5dGVMZW5ndGg6IDgsIHdpZHRoOiA0LCBoZWlnaHQ6IDQgfTtcclxuXHRcdGlmICggZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LkVUQzJSR0JBOFVub3JtIHx8IGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5FVEMyUkdCQThVbm9ybVNSR0IgKSByZXR1cm4geyBieXRlTGVuZ3RoOiAxNiwgd2lkdGg6IDQsIGhlaWdodDogNCB9O1xyXG5cdFx0aWYgKCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuRUFDUjExVW5vcm0gKSByZXR1cm4geyBieXRlTGVuZ3RoOiA4LCB3aWR0aDogNCwgaGVpZ2h0OiA0IH07XHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5FQUNSMTFTbm9ybSApIHJldHVybiB7IGJ5dGVMZW5ndGg6IDgsIHdpZHRoOiA0LCBoZWlnaHQ6IDQgfTtcclxuXHRcdGlmICggZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LkVBQ1JHMTFVbm9ybSApIHJldHVybiB7IGJ5dGVMZW5ndGg6IDE2LCB3aWR0aDogNCwgaGVpZ2h0OiA0IH07XHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5FQUNSRzExU25vcm0gKSByZXR1cm4geyBieXRlTGVuZ3RoOiAxNiwgd2lkdGg6IDQsIGhlaWdodDogNCB9O1xyXG5cclxuXHRcdGlmICggZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LkFTVEM0eDRVbm9ybSB8fCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuQVNUQzR4NFVub3JtU1JHQiApIHJldHVybiB7IGJ5dGVMZW5ndGg6IDE2LCB3aWR0aDogNCwgaGVpZ2h0OiA0IH07XHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5BU1RDNXg0VW5vcm0gfHwgZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LkFTVEM1eDRVbm9ybVNSR0IgKSByZXR1cm4geyBieXRlTGVuZ3RoOiAxNiwgd2lkdGg6IDUsIGhlaWdodDogNCB9O1xyXG5cdFx0aWYgKCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuQVNUQzV4NVVub3JtIHx8IGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5BU1RDNXg1VW5vcm1TUkdCICkgcmV0dXJuIHsgYnl0ZUxlbmd0aDogMTYsIHdpZHRoOiA1LCBoZWlnaHQ6IDUgfTtcclxuXHRcdGlmICggZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LkFTVEM2eDVVbm9ybSB8fCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuQVNUQzZ4NVVub3JtU1JHQiApIHJldHVybiB7IGJ5dGVMZW5ndGg6IDE2LCB3aWR0aDogNiwgaGVpZ2h0OiA1IH07XHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5BU1RDNng2VW5vcm0gfHwgZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LkFTVEM2eDZVbm9ybVNSR0IgKSByZXR1cm4geyBieXRlTGVuZ3RoOiAxNiwgd2lkdGg6IDYsIGhlaWdodDogNiB9O1xyXG5cdFx0aWYgKCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuQVNUQzh4NVVub3JtIHx8IGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5BU1RDOHg1VW5vcm1TUkdCICkgcmV0dXJuIHsgYnl0ZUxlbmd0aDogMTYsIHdpZHRoOiA4LCBoZWlnaHQ6IDUgfTtcclxuXHRcdGlmICggZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LkFTVEM4eDZVbm9ybSB8fCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuQVNUQzh4NlVub3JtU1JHQiApIHJldHVybiB7IGJ5dGVMZW5ndGg6IDE2LCB3aWR0aDogOCwgaGVpZ2h0OiA2IH07XHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5BU1RDOHg4VW5vcm0gfHwgZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LkFTVEM4eDhVbm9ybVNSR0IgKSByZXR1cm4geyBieXRlTGVuZ3RoOiAxNiwgd2lkdGg6IDgsIGhlaWdodDogOCB9O1xyXG5cdFx0aWYgKCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuQVNUQzEweDVVbm9ybSB8fCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuQVNUQzEweDVVbm9ybVNSR0IgKSByZXR1cm4geyBieXRlTGVuZ3RoOiAxNiwgd2lkdGg6IDEwLCBoZWlnaHQ6IDUgfTtcclxuXHRcdGlmICggZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LkFTVEMxMHg2VW5vcm0gfHwgZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LkFTVEMxMHg2VW5vcm1TUkdCICkgcmV0dXJuIHsgYnl0ZUxlbmd0aDogMTYsIHdpZHRoOiAxMCwgaGVpZ2h0OiA2IH07XHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5BU1RDMTB4OFVub3JtIHx8IGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5BU1RDMTB4OFVub3JtU1JHQiApIHJldHVybiB7IGJ5dGVMZW5ndGg6IDE2LCB3aWR0aDogMTAsIGhlaWdodDogOCB9O1xyXG5cdFx0aWYgKCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuQVNUQzEweDEwVW5vcm0gfHwgZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LkFTVEMxMHgxMFVub3JtU1JHQiApIHJldHVybiB7IGJ5dGVMZW5ndGg6IDE2LCB3aWR0aDogMTAsIGhlaWdodDogMTAgfTtcclxuXHRcdGlmICggZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LkFTVEMxMngxMFVub3JtIHx8IGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5BU1RDMTJ4MTBVbm9ybVNSR0IgKSByZXR1cm4geyBieXRlTGVuZ3RoOiAxNiwgd2lkdGg6IDEyLCBoZWlnaHQ6IDEwIH07XHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5BU1RDMTJ4MTJVbm9ybSB8fCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuQVNUQzEyeDEyVW5vcm1TUkdCICkgcmV0dXJuIHsgYnl0ZUxlbmd0aDogMTYsIHdpZHRoOiAxMiwgaGVpZ2h0OiAxMiB9O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnZlcnRzIHRoZSB0aHJlZS5qcyB1diB3cmFwcGluZyBjb25zdGFudHMgdG8gR1BVIGFkZHJlc3MgbW9kZSBjb25zdGFudHMuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSB0aHJlZS5qcyBjb25zdGFudCBkZWZpbmluZyBhIHV2IHdyYXBwaW5nIG1vZGUuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgR1BVIGFkZHJlc3MgbW9kZS5cclxuXHQgKi9cclxuXHRfY29udmVydEFkZHJlc3NNb2RlKCB2YWx1ZSApIHtcclxuXHJcblx0XHRsZXQgYWRkcmVzc01vZGUgPSBHUFVBZGRyZXNzTW9kZS5DbGFtcFRvRWRnZTtcclxuXHJcblx0XHRpZiAoIHZhbHVlID09PSBSZXBlYXRXcmFwcGluZyApIHtcclxuXHJcblx0XHRcdGFkZHJlc3NNb2RlID0gR1BVQWRkcmVzc01vZGUuUmVwZWF0O1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHZhbHVlID09PSBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nICkge1xyXG5cclxuXHRcdFx0YWRkcmVzc01vZGUgPSBHUFVBZGRyZXNzTW9kZS5NaXJyb3JSZXBlYXQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBhZGRyZXNzTW9kZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb252ZXJ0cyB0aGUgdGhyZWUuanMgZmlsdGVyIGNvbnN0YW50cyB0byBHUFUgZmlsdGVyIGNvbnN0YW50cy5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIHRocmVlLmpzIGNvbnN0YW50IGRlZmluaW5nIGEgZmlsdGVyIG1vZGUuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgR1BVIGZpbHRlciBtb2RlLlxyXG5cdCAqL1xyXG5cdF9jb252ZXJ0RmlsdGVyTW9kZSggdmFsdWUgKSB7XHJcblxyXG5cdFx0bGV0IGZpbHRlck1vZGUgPSBHUFVGaWx0ZXJNb2RlLkxpbmVhcjtcclxuXHJcblx0XHRpZiAoIHZhbHVlID09PSBOZWFyZXN0RmlsdGVyIHx8IHZhbHVlID09PSBOZWFyZXN0TWlwbWFwTmVhcmVzdEZpbHRlciB8fCB2YWx1ZSA9PT0gTmVhcmVzdE1pcG1hcExpbmVhckZpbHRlciApIHtcclxuXHJcblx0XHRcdGZpbHRlck1vZGUgPSBHUFVGaWx0ZXJNb2RlLk5lYXJlc3Q7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBmaWx0ZXJNb2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGJ5dGVzLXBlci10ZXhlbCB2YWx1ZSBmb3IgdGhlIGdpdmVuIEdQVSB0ZXh0dXJlIGZvcm1hdC5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGZvcm1hdCAtIFRoZSBHUFUgdGV4dHVyZSBmb3JtYXQuXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgYnl0ZXMtcGVyLXRleGVsLlxyXG5cdCAqL1xyXG5cdF9nZXRCeXRlc1BlclRleGVsKCBmb3JtYXQgKSB7XHJcblxyXG5cdFx0Ly8gOC1iaXQgZm9ybWF0c1xyXG5cdFx0aWYgKCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuUjhVbm9ybSB8fFxyXG5cdFx0XHRmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuUjhTbm9ybSB8fFxyXG5cdFx0XHRmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuUjhVaW50IHx8XHJcblx0XHRcdGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5SOFNpbnQgKSByZXR1cm4gMTtcclxuXHJcblx0XHQvLyAxNi1iaXQgZm9ybWF0c1xyXG5cdFx0aWYgKCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuUjE2VWludCB8fFxyXG5cdFx0XHRmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuUjE2U2ludCB8fFxyXG5cdFx0XHRmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuUjE2RmxvYXQgfHxcclxuXHRcdFx0Zm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LlJHOFVub3JtIHx8XHJcblx0XHRcdGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5SRzhTbm9ybSB8fFxyXG5cdFx0XHRmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuUkc4VWludCB8fFxyXG5cdFx0XHRmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuUkc4U2ludCApIHJldHVybiAyO1xyXG5cclxuXHRcdC8vIDMyLWJpdCBmb3JtYXRzXHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5SMzJVaW50IHx8XHJcblx0XHRcdGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5SMzJTaW50IHx8XHJcblx0XHRcdGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5SMzJGbG9hdCB8fFxyXG5cdFx0XHRmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuUkcxNlVpbnQgfHxcclxuXHRcdFx0Zm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LlJHMTZTaW50IHx8XHJcblx0XHRcdGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5SRzE2RmxvYXQgfHxcclxuXHRcdFx0Zm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LlJHQkE4VW5vcm0gfHxcclxuXHRcdFx0Zm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LlJHQkE4VW5vcm1TUkdCIHx8XHJcblx0XHRcdGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5SR0JBOFNub3JtIHx8XHJcblx0XHRcdGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5SR0JBOFVpbnQgfHxcclxuXHRcdFx0Zm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LlJHQkE4U2ludCB8fFxyXG5cdFx0XHRmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuQkdSQThVbm9ybSB8fFxyXG5cdFx0XHRmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuQkdSQThVbm9ybVNSR0IgfHxcclxuXHRcdFx0Ly8gUGFja2VkIDMyLWJpdCBmb3JtYXRzXHJcblx0XHRcdGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5SR0I5RTVVRmxvYXQgfHxcclxuXHRcdFx0Zm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LlJHQjEwQTJVbm9ybSB8fFxyXG5cdFx0XHRmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuUkcxMUIxMFVGbG9hdCB8fFxyXG5cdFx0XHRmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuRGVwdGgzMkZsb2F0IHx8XHJcblx0XHRcdGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5EZXB0aDI0UGx1cyB8fFxyXG5cdFx0XHRmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuRGVwdGgyNFBsdXNTdGVuY2lsOCB8fFxyXG5cdFx0XHRmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuRGVwdGgzMkZsb2F0U3RlbmNpbDggKSByZXR1cm4gNDtcclxuXHJcblx0XHQvLyA2NC1iaXQgZm9ybWF0c1xyXG5cdFx0aWYgKCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuUkczMlVpbnQgfHxcclxuXHRcdFx0Zm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LlJHMzJTaW50IHx8XHJcblx0XHRcdGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5SRzMyRmxvYXQgfHxcclxuXHRcdFx0Zm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LlJHQkExNlVpbnQgfHxcclxuXHRcdFx0Zm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LlJHQkExNlNpbnQgfHxcclxuXHRcdFx0Zm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LlJHQkExNkZsb2F0ICkgcmV0dXJuIDg7XHJcblxyXG5cdFx0Ly8gMTI4LWJpdCBmb3JtYXRzXHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5SR0JBMzJVaW50IHx8XHJcblx0XHRcdGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5SR0JBMzJTaW50IHx8XHJcblx0XHRcdGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5SR0JBMzJGbG9hdCApIHJldHVybiAxNjtcclxuXHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyB0eXBlZCBhcnJheSB0eXBlIGZvciB0aGUgZ2l2ZW4gR1BVIHRleHR1cmUgZm9ybWF0LlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gZm9ybWF0IC0gVGhlIEdQVSB0ZXh0dXJlIGZvcm1hdC5cclxuXHQgKiBAcmV0dXJuIHtUeXBlZEFycmF5LmNvbnN0cnVjdG9yfSBUaGUgdHlwZWQgYXJyYXkgdHlwZS5cclxuXHQgKi9cclxuXHRfZ2V0VHlwZWRBcnJheVR5cGUoIGZvcm1hdCApIHtcclxuXHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5SOFVpbnQgKSByZXR1cm4gVWludDhBcnJheTtcclxuXHRcdGlmICggZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LlI4U2ludCApIHJldHVybiBJbnQ4QXJyYXk7XHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5SOFVub3JtICkgcmV0dXJuIFVpbnQ4QXJyYXk7XHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5SOFNub3JtICkgcmV0dXJuIEludDhBcnJheTtcclxuXHRcdGlmICggZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LlJHOFVpbnQgKSByZXR1cm4gVWludDhBcnJheTtcclxuXHRcdGlmICggZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LlJHOFNpbnQgKSByZXR1cm4gSW50OEFycmF5O1xyXG5cdFx0aWYgKCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuUkc4VW5vcm0gKSByZXR1cm4gVWludDhBcnJheTtcclxuXHRcdGlmICggZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LlJHOFNub3JtICkgcmV0dXJuIEludDhBcnJheTtcclxuXHRcdGlmICggZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LlJHQkE4VWludCApIHJldHVybiBVaW50OEFycmF5O1xyXG5cdFx0aWYgKCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuUkdCQThTaW50ICkgcmV0dXJuIEludDhBcnJheTtcclxuXHRcdGlmICggZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LlJHQkE4VW5vcm0gKSByZXR1cm4gVWludDhBcnJheTtcclxuXHRcdGlmICggZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LlJHQkE4U25vcm0gKSByZXR1cm4gSW50OEFycmF5O1xyXG5cclxuXHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5SMTZVaW50ICkgcmV0dXJuIFVpbnQxNkFycmF5O1xyXG5cdFx0aWYgKCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuUjE2U2ludCApIHJldHVybiBJbnQxNkFycmF5O1xyXG5cdFx0aWYgKCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuUkcxNlVpbnQgKSByZXR1cm4gVWludDE2QXJyYXk7XHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5SRzE2U2ludCApIHJldHVybiBJbnQxNkFycmF5O1xyXG5cdFx0aWYgKCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuUkdCQTE2VWludCApIHJldHVybiBVaW50MTZBcnJheTtcclxuXHRcdGlmICggZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LlJHQkExNlNpbnQgKSByZXR1cm4gSW50MTZBcnJheTtcclxuXHRcdGlmICggZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LlIxNkZsb2F0ICkgcmV0dXJuIFVpbnQxNkFycmF5O1xyXG5cdFx0aWYgKCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuUkcxNkZsb2F0ICkgcmV0dXJuIFVpbnQxNkFycmF5O1xyXG5cdFx0aWYgKCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuUkdCQTE2RmxvYXQgKSByZXR1cm4gVWludDE2QXJyYXk7XHJcblxyXG5cclxuXHRcdGlmICggZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LlIzMlVpbnQgKSByZXR1cm4gVWludDMyQXJyYXk7XHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5SMzJTaW50ICkgcmV0dXJuIEludDMyQXJyYXk7XHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5SMzJGbG9hdCApIHJldHVybiBGbG9hdDMyQXJyYXk7XHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5SRzMyVWludCApIHJldHVybiBVaW50MzJBcnJheTtcclxuXHRcdGlmICggZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LlJHMzJTaW50ICkgcmV0dXJuIEludDMyQXJyYXk7XHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5SRzMyRmxvYXQgKSByZXR1cm4gRmxvYXQzMkFycmF5O1xyXG5cdFx0aWYgKCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuUkdCQTMyVWludCApIHJldHVybiBVaW50MzJBcnJheTtcclxuXHRcdGlmICggZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LlJHQkEzMlNpbnQgKSByZXR1cm4gSW50MzJBcnJheTtcclxuXHRcdGlmICggZm9ybWF0ID09PSBHUFVUZXh0dXJlRm9ybWF0LlJHQkEzMkZsb2F0ICkgcmV0dXJuIEZsb2F0MzJBcnJheTtcclxuXHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5CR1JBOFVub3JtICkgcmV0dXJuIFVpbnQ4QXJyYXk7XHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5CR1JBOFVub3JtU1JHQiApIHJldHVybiBVaW50OEFycmF5O1xyXG5cdFx0aWYgKCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuUkdCMTBBMlVub3JtICkgcmV0dXJuIFVpbnQzMkFycmF5O1xyXG5cdFx0aWYgKCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuUkdCOUU1VUZsb2F0ICkgcmV0dXJuIFVpbnQzMkFycmF5O1xyXG5cdFx0aWYgKCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuUkcxMUIxMFVGbG9hdCApIHJldHVybiBVaW50MzJBcnJheTtcclxuXHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5EZXB0aDMyRmxvYXQgKSByZXR1cm4gRmxvYXQzMkFycmF5O1xyXG5cdFx0aWYgKCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuRGVwdGgyNFBsdXMgKSByZXR1cm4gVWludDMyQXJyYXk7XHJcblx0XHRpZiAoIGZvcm1hdCA9PT0gR1BVVGV4dHVyZUZvcm1hdC5EZXB0aDI0UGx1c1N0ZW5jaWw4ICkgcmV0dXJuIFVpbnQzMkFycmF5O1xyXG5cdFx0aWYgKCBmb3JtYXQgPT09IEdQVVRleHR1cmVGb3JtYXQuRGVwdGgzMkZsb2F0U3RlbmNpbDggKSByZXR1cm4gRmxvYXQzMkFycmF5O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIEdQVSBkaW1lbnNpb25zIGZvciB0aGUgZ2l2ZW4gdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgR1BVIGRpbWVuc2lvbi5cclxuXHQgKi9cclxuXHRfZ2V0RGltZW5zaW9uKCB0ZXh0dXJlICkge1xyXG5cclxuXHRcdGxldCBkaW1lbnNpb247XHJcblxyXG5cdFx0aWYgKCB0ZXh0dXJlLmlzRGF0YTNEVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdGRpbWVuc2lvbiA9IEdQVVRleHR1cmVEaW1lbnNpb24uVGhyZWVEO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRkaW1lbnNpb24gPSBHUFVUZXh0dXJlRGltZW5zaW9uLlR3b0Q7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBkaW1lbnNpb247XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBHUFUgZm9ybWF0IGZvciB0aGUgZ2l2ZW4gdGV4dHVyZS5cclxuICpcclxuICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUuXHJcbiAqIEBwYXJhbSB7P0dQVURldmljZX0gW2RldmljZT1udWxsXSAtIFRoZSBHUFUgZGV2aWNlIHdoaWNoIGlzIHVzZWQgZm9yIGZlYXR1cmUgZGV0ZWN0aW9uLlxyXG4gKiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGFwcGx5IHRoZSBkZXZpY2UgZm9yIG1vc3QgZm9ybWF0cy5cclxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgR1BVIGZvcm1hdC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtYXQoIHRleHR1cmUsIGRldmljZSA9IG51bGwgKSB7XHJcblxyXG5cdGNvbnN0IGZvcm1hdCA9IHRleHR1cmUuZm9ybWF0O1xyXG5cdGNvbnN0IHR5cGUgPSB0ZXh0dXJlLnR5cGU7XHJcblx0Y29uc3QgY29sb3JTcGFjZSA9IHRleHR1cmUuY29sb3JTcGFjZTtcclxuXHJcblx0bGV0IGZvcm1hdEdQVTtcclxuXHJcblx0aWYgKCB0ZXh0dXJlLmlzQ29tcHJlc3NlZFRleHR1cmUgPT09IHRydWUgfHwgdGV4dHVyZS5pc0NvbXByZXNzZWRBcnJheVRleHR1cmUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0c3dpdGNoICggZm9ybWF0ICkge1xyXG5cclxuXHRcdFx0Y2FzZSBSR0JBX1MzVENfRFhUMV9Gb3JtYXQ6XHJcblx0XHRcdFx0Zm9ybWF0R1BVID0gKCBjb2xvclNwYWNlID09PSBTUkdCQ29sb3JTcGFjZSApID8gR1BVVGV4dHVyZUZvcm1hdC5CQzFSR0JBVW5vcm1TUkdCIDogR1BVVGV4dHVyZUZvcm1hdC5CQzFSR0JBVW5vcm07XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIFJHQkFfUzNUQ19EWFQzX0Zvcm1hdDpcclxuXHRcdFx0XHRmb3JtYXRHUFUgPSAoIGNvbG9yU3BhY2UgPT09IFNSR0JDb2xvclNwYWNlICkgPyBHUFVUZXh0dXJlRm9ybWF0LkJDMlJHQkFVbm9ybVNSR0IgOiBHUFVUZXh0dXJlRm9ybWF0LkJDMlJHQkFVbm9ybTtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgUkdCQV9TM1RDX0RYVDVfRm9ybWF0OlxyXG5cdFx0XHRcdGZvcm1hdEdQVSA9ICggY29sb3JTcGFjZSA9PT0gU1JHQkNvbG9yU3BhY2UgKSA/IEdQVVRleHR1cmVGb3JtYXQuQkMzUkdCQVVub3JtU1JHQiA6IEdQVVRleHR1cmVGb3JtYXQuQkMzUkdCQVVub3JtO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBSR0JfRVRDMl9Gb3JtYXQ6XHJcblx0XHRcdFx0Zm9ybWF0R1BVID0gKCBjb2xvclNwYWNlID09PSBTUkdCQ29sb3JTcGFjZSApID8gR1BVVGV4dHVyZUZvcm1hdC5FVEMyUkdCOFVub3JtU1JHQiA6IEdQVVRleHR1cmVGb3JtYXQuRVRDMlJHQjhVbm9ybTtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgUkdCQV9FVEMyX0VBQ19Gb3JtYXQ6XHJcblx0XHRcdFx0Zm9ybWF0R1BVID0gKCBjb2xvclNwYWNlID09PSBTUkdCQ29sb3JTcGFjZSApID8gR1BVVGV4dHVyZUZvcm1hdC5FVEMyUkdCQThVbm9ybVNSR0IgOiBHUFVUZXh0dXJlRm9ybWF0LkVUQzJSR0JBOFVub3JtO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBSR0JBX0FTVENfNHg0X0Zvcm1hdDpcclxuXHRcdFx0XHRmb3JtYXRHUFUgPSAoIGNvbG9yU3BhY2UgPT09IFNSR0JDb2xvclNwYWNlICkgPyBHUFVUZXh0dXJlRm9ybWF0LkFTVEM0eDRVbm9ybVNSR0IgOiBHUFVUZXh0dXJlRm9ybWF0LkFTVEM0eDRVbm9ybTtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgUkdCQV9BU1RDXzV4NF9Gb3JtYXQ6XHJcblx0XHRcdFx0Zm9ybWF0R1BVID0gKCBjb2xvclNwYWNlID09PSBTUkdCQ29sb3JTcGFjZSApID8gR1BVVGV4dHVyZUZvcm1hdC5BU1RDNXg0VW5vcm1TUkdCIDogR1BVVGV4dHVyZUZvcm1hdC5BU1RDNXg0VW5vcm07XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIFJHQkFfQVNUQ181eDVfRm9ybWF0OlxyXG5cdFx0XHRcdGZvcm1hdEdQVSA9ICggY29sb3JTcGFjZSA9PT0gU1JHQkNvbG9yU3BhY2UgKSA/IEdQVVRleHR1cmVGb3JtYXQuQVNUQzV4NVVub3JtU1JHQiA6IEdQVVRleHR1cmVGb3JtYXQuQVNUQzV4NVVub3JtO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBSR0JBX0FTVENfNng1X0Zvcm1hdDpcclxuXHRcdFx0XHRmb3JtYXRHUFUgPSAoIGNvbG9yU3BhY2UgPT09IFNSR0JDb2xvclNwYWNlICkgPyBHUFVUZXh0dXJlRm9ybWF0LkFTVEM2eDVVbm9ybVNSR0IgOiBHUFVUZXh0dXJlRm9ybWF0LkFTVEM2eDVVbm9ybTtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgUkdCQV9BU1RDXzZ4Nl9Gb3JtYXQ6XHJcblx0XHRcdFx0Zm9ybWF0R1BVID0gKCBjb2xvclNwYWNlID09PSBTUkdCQ29sb3JTcGFjZSApID8gR1BVVGV4dHVyZUZvcm1hdC5BU1RDNng2VW5vcm1TUkdCIDogR1BVVGV4dHVyZUZvcm1hdC5BU1RDNng2VW5vcm07XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIFJHQkFfQVNUQ184eDVfRm9ybWF0OlxyXG5cdFx0XHRcdGZvcm1hdEdQVSA9ICggY29sb3JTcGFjZSA9PT0gU1JHQkNvbG9yU3BhY2UgKSA/IEdQVVRleHR1cmVGb3JtYXQuQVNUQzh4NVVub3JtU1JHQiA6IEdQVVRleHR1cmVGb3JtYXQuQVNUQzh4NVVub3JtO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBSR0JBX0FTVENfOHg2X0Zvcm1hdDpcclxuXHRcdFx0XHRmb3JtYXRHUFUgPSAoIGNvbG9yU3BhY2UgPT09IFNSR0JDb2xvclNwYWNlICkgPyBHUFVUZXh0dXJlRm9ybWF0LkFTVEM4eDZVbm9ybVNSR0IgOiBHUFVUZXh0dXJlRm9ybWF0LkFTVEM4eDZVbm9ybTtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgUkdCQV9BU1RDXzh4OF9Gb3JtYXQ6XHJcblx0XHRcdFx0Zm9ybWF0R1BVID0gKCBjb2xvclNwYWNlID09PSBTUkdCQ29sb3JTcGFjZSApID8gR1BVVGV4dHVyZUZvcm1hdC5BU1RDOHg4VW5vcm1TUkdCIDogR1BVVGV4dHVyZUZvcm1hdC5BU1RDOHg4VW5vcm07XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIFJHQkFfQVNUQ18xMHg1X0Zvcm1hdDpcclxuXHRcdFx0XHRmb3JtYXRHUFUgPSAoIGNvbG9yU3BhY2UgPT09IFNSR0JDb2xvclNwYWNlICkgPyBHUFVUZXh0dXJlRm9ybWF0LkFTVEMxMHg1VW5vcm1TUkdCIDogR1BVVGV4dHVyZUZvcm1hdC5BU1RDMTB4NVVub3JtO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBSR0JBX0FTVENfMTB4Nl9Gb3JtYXQ6XHJcblx0XHRcdFx0Zm9ybWF0R1BVID0gKCBjb2xvclNwYWNlID09PSBTUkdCQ29sb3JTcGFjZSApID8gR1BVVGV4dHVyZUZvcm1hdC5BU1RDMTB4NlVub3JtU1JHQiA6IEdQVVRleHR1cmVGb3JtYXQuQVNUQzEweDZVbm9ybTtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgUkdCQV9BU1RDXzEweDhfRm9ybWF0OlxyXG5cdFx0XHRcdGZvcm1hdEdQVSA9ICggY29sb3JTcGFjZSA9PT0gU1JHQkNvbG9yU3BhY2UgKSA/IEdQVVRleHR1cmVGb3JtYXQuQVNUQzEweDhVbm9ybVNSR0IgOiBHUFVUZXh0dXJlRm9ybWF0LkFTVEMxMHg4VW5vcm07XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIFJHQkFfQVNUQ18xMHgxMF9Gb3JtYXQ6XHJcblx0XHRcdFx0Zm9ybWF0R1BVID0gKCBjb2xvclNwYWNlID09PSBTUkdCQ29sb3JTcGFjZSApID8gR1BVVGV4dHVyZUZvcm1hdC5BU1RDMTB4MTBVbm9ybVNSR0IgOiBHUFVUZXh0dXJlRm9ybWF0LkFTVEMxMHgxMFVub3JtO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBSR0JBX0FTVENfMTJ4MTBfRm9ybWF0OlxyXG5cdFx0XHRcdGZvcm1hdEdQVSA9ICggY29sb3JTcGFjZSA9PT0gU1JHQkNvbG9yU3BhY2UgKSA/IEdQVVRleHR1cmVGb3JtYXQuQVNUQzEyeDEwVW5vcm1TUkdCIDogR1BVVGV4dHVyZUZvcm1hdC5BU1RDMTJ4MTBVbm9ybTtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgUkdCQV9BU1RDXzEyeDEyX0Zvcm1hdDpcclxuXHRcdFx0XHRmb3JtYXRHUFUgPSAoIGNvbG9yU3BhY2UgPT09IFNSR0JDb2xvclNwYWNlICkgPyBHUFVUZXh0dXJlRm9ybWF0LkFTVEMxMngxMlVub3JtU1JHQiA6IEdQVVRleHR1cmVGb3JtYXQuQVNUQzEyeDEyVW5vcm07XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIFJHQkFGb3JtYXQ6XHJcblx0XHRcdFx0Zm9ybWF0R1BVID0gKCBjb2xvclNwYWNlID09PSBTUkdCQ29sb3JTcGFjZSApID8gR1BVVGV4dHVyZUZvcm1hdC5SR0JBOFVub3JtU1JHQiA6IEdQVVRleHR1cmVGb3JtYXQuUkdCQThVbm9ybTtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1dlYkdQVVJlbmRlcmVyOiBVbnN1cHBvcnRlZCB0ZXh0dXJlIGZvcm1hdC4nLCBmb3JtYXQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0c3dpdGNoICggZm9ybWF0ICkge1xyXG5cclxuXHRcdFx0Y2FzZSBSR0JBRm9ybWF0OlxyXG5cclxuXHRcdFx0XHRzd2l0Y2ggKCB0eXBlICkge1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgQnl0ZVR5cGU6XHJcblx0XHRcdFx0XHRcdGZvcm1hdEdQVSA9IEdQVVRleHR1cmVGb3JtYXQuUkdCQThTbm9ybTtcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0Y2FzZSBTaG9ydFR5cGU6XHJcblx0XHRcdFx0XHRcdGZvcm1hdEdQVSA9IEdQVVRleHR1cmVGb3JtYXQuUkdCQTE2U2ludDtcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0Y2FzZSBVbnNpZ25lZFNob3J0VHlwZTpcclxuXHRcdFx0XHRcdFx0Zm9ybWF0R1BVID0gR1BVVGV4dHVyZUZvcm1hdC5SR0JBMTZVaW50O1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdGNhc2UgVW5zaWduZWRJbnRUeXBlOlxyXG5cdFx0XHRcdFx0XHRmb3JtYXRHUFUgPSBHUFVUZXh0dXJlRm9ybWF0LlJHQkEzMlVpbnQ7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgSW50VHlwZTpcclxuXHRcdFx0XHRcdFx0Zm9ybWF0R1BVID0gR1BVVGV4dHVyZUZvcm1hdC5SR0JBMzJTaW50O1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRjYXNlIFVuc2lnbmVkQnl0ZVR5cGU6XHJcblx0XHRcdFx0XHRcdGZvcm1hdEdQVSA9ICggY29sb3JTcGFjZSA9PT0gU1JHQkNvbG9yU3BhY2UgKSA/IEdQVVRleHR1cmVGb3JtYXQuUkdCQThVbm9ybVNSR0IgOiBHUFVUZXh0dXJlRm9ybWF0LlJHQkE4VW5vcm07XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgSGFsZkZsb2F0VHlwZTpcclxuXHRcdFx0XHRcdFx0Zm9ybWF0R1BVID0gR1BVVGV4dHVyZUZvcm1hdC5SR0JBMTZGbG9hdDtcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0Y2FzZSBGbG9hdFR5cGU6XHJcblx0XHRcdFx0XHRcdGZvcm1hdEdQVSA9IEdQVVRleHR1cmVGb3JtYXQuUkdCQTMyRmxvYXQ7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdXZWJHUFVSZW5kZXJlcjogVW5zdXBwb3J0ZWQgdGV4dHVyZSB0eXBlIHdpdGggUkdCQUZvcm1hdC4nLCB0eXBlICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIFJHQkZvcm1hdDpcclxuXHJcblx0XHRcdFx0c3dpdGNoICggdHlwZSApIHtcclxuXHJcblx0XHRcdFx0XHRjYXNlIFVuc2lnbmVkSW50NTk5OVR5cGU6XHJcblx0XHRcdFx0XHRcdGZvcm1hdEdQVSA9IEdQVVRleHR1cmVGb3JtYXQuUkdCOUU1VUZsb2F0O1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnV2ViR1BVUmVuZGVyZXI6IFVuc3VwcG9ydGVkIHRleHR1cmUgdHlwZSB3aXRoIFJHQkZvcm1hdC4nLCB0eXBlICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIFJlZEZvcm1hdDpcclxuXHJcblx0XHRcdFx0c3dpdGNoICggdHlwZSApIHtcclxuXHJcblx0XHRcdFx0XHRjYXNlIEJ5dGVUeXBlOlxyXG5cdFx0XHRcdFx0XHRmb3JtYXRHUFUgPSBHUFVUZXh0dXJlRm9ybWF0LlI4U25vcm07XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgU2hvcnRUeXBlOlxyXG5cdFx0XHRcdFx0XHRmb3JtYXRHUFUgPSBHUFVUZXh0dXJlRm9ybWF0LlIxNlNpbnQ7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgVW5zaWduZWRTaG9ydFR5cGU6XHJcblx0XHRcdFx0XHRcdGZvcm1hdEdQVSA9IEdQVVRleHR1cmVGb3JtYXQuUjE2VWludDtcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0Y2FzZSBVbnNpZ25lZEludFR5cGU6XHJcblx0XHRcdFx0XHRcdGZvcm1hdEdQVSA9IEdQVVRleHR1cmVGb3JtYXQuUjMyVWludDtcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0Y2FzZSBJbnRUeXBlOlxyXG5cdFx0XHRcdFx0XHRmb3JtYXRHUFUgPSBHUFVUZXh0dXJlRm9ybWF0LlIzMlNpbnQ7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgVW5zaWduZWRCeXRlVHlwZTpcclxuXHRcdFx0XHRcdFx0Zm9ybWF0R1BVID0gR1BVVGV4dHVyZUZvcm1hdC5SOFVub3JtO1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRjYXNlIEhhbGZGbG9hdFR5cGU6XHJcblx0XHRcdFx0XHRcdGZvcm1hdEdQVSA9IEdQVVRleHR1cmVGb3JtYXQuUjE2RmxvYXQ7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgRmxvYXRUeXBlOlxyXG5cdFx0XHRcdFx0XHRmb3JtYXRHUFUgPSBHUFVUZXh0dXJlRm9ybWF0LlIzMkZsb2F0O1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnV2ViR1BVUmVuZGVyZXI6IFVuc3VwcG9ydGVkIHRleHR1cmUgdHlwZSB3aXRoIFJlZEZvcm1hdC4nLCB0eXBlICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIFJHRm9ybWF0OlxyXG5cclxuXHRcdFx0XHRzd2l0Y2ggKCB0eXBlICkge1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgQnl0ZVR5cGU6XHJcblx0XHRcdFx0XHRcdGZvcm1hdEdQVSA9IEdQVVRleHR1cmVGb3JtYXQuUkc4U25vcm07XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgU2hvcnRUeXBlOlxyXG5cdFx0XHRcdFx0XHRmb3JtYXRHUFUgPSBHUFVUZXh0dXJlRm9ybWF0LlJHMTZTaW50O1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRjYXNlIFVuc2lnbmVkU2hvcnRUeXBlOlxyXG5cdFx0XHRcdFx0XHRmb3JtYXRHUFUgPSBHUFVUZXh0dXJlRm9ybWF0LlJHMTZVaW50O1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRjYXNlIFVuc2lnbmVkSW50VHlwZTpcclxuXHRcdFx0XHRcdFx0Zm9ybWF0R1BVID0gR1BVVGV4dHVyZUZvcm1hdC5SRzMyVWludDtcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0Y2FzZSBJbnRUeXBlOlxyXG5cdFx0XHRcdFx0XHRmb3JtYXRHUFUgPSBHUFVUZXh0dXJlRm9ybWF0LlJHMzJTaW50O1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRjYXNlIFVuc2lnbmVkQnl0ZVR5cGU6XHJcblx0XHRcdFx0XHRcdGZvcm1hdEdQVSA9IEdQVVRleHR1cmVGb3JtYXQuUkc4VW5vcm07XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgSGFsZkZsb2F0VHlwZTpcclxuXHRcdFx0XHRcdFx0Zm9ybWF0R1BVID0gR1BVVGV4dHVyZUZvcm1hdC5SRzE2RmxvYXQ7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgRmxvYXRUeXBlOlxyXG5cdFx0XHRcdFx0XHRmb3JtYXRHUFUgPSBHUFVUZXh0dXJlRm9ybWF0LlJHMzJGbG9hdDtcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1dlYkdQVVJlbmRlcmVyOiBVbnN1cHBvcnRlZCB0ZXh0dXJlIHR5cGUgd2l0aCBSR0Zvcm1hdC4nLCB0eXBlICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIERlcHRoRm9ybWF0OlxyXG5cclxuXHRcdFx0XHRzd2l0Y2ggKCB0eXBlICkge1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgVW5zaWduZWRTaG9ydFR5cGU6XHJcblx0XHRcdFx0XHRcdGZvcm1hdEdQVSA9IEdQVVRleHR1cmVGb3JtYXQuRGVwdGgxNlVub3JtO1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRjYXNlIFVuc2lnbmVkSW50VHlwZTpcclxuXHRcdFx0XHRcdFx0Zm9ybWF0R1BVID0gR1BVVGV4dHVyZUZvcm1hdC5EZXB0aDI0UGx1cztcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0Y2FzZSBGbG9hdFR5cGU6XHJcblx0XHRcdFx0XHRcdGZvcm1hdEdQVSA9IEdQVVRleHR1cmVGb3JtYXQuRGVwdGgzMkZsb2F0O1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnV2ViR1BVUmVuZGVyZXI6IFVuc3VwcG9ydGVkIHRleHR1cmUgdHlwZSB3aXRoIERlcHRoRm9ybWF0LicsIHR5cGUgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgRGVwdGhTdGVuY2lsRm9ybWF0OlxyXG5cclxuXHRcdFx0XHRzd2l0Y2ggKCB0eXBlICkge1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgVW5zaWduZWRJbnQyNDhUeXBlOlxyXG5cdFx0XHRcdFx0XHRmb3JtYXRHUFUgPSBHUFVUZXh0dXJlRm9ybWF0LkRlcHRoMjRQbHVzU3RlbmNpbDg7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgRmxvYXRUeXBlOlxyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCBkZXZpY2UgJiYgZGV2aWNlLmZlYXR1cmVzLmhhcyggR1BVRmVhdHVyZU5hbWUuRGVwdGgzMkZsb2F0U3RlbmNpbDggKSA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdXZWJHUFVSZW5kZXJlcjogRGVwdGggdGV4dHVyZXMgd2l0aCBEZXB0aFN0ZW5jaWxGb3JtYXQgKyBGbG9hdFR5cGUgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIHRoZSBcImRlcHRoMzJmbG9hdC1zdGVuY2lsOFwiIEdQVSBmZWF0dXJlLicgKTtcclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdGZvcm1hdEdQVSA9IEdQVVRleHR1cmVGb3JtYXQuRGVwdGgzMkZsb2F0U3RlbmNpbDg7XHJcblxyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnV2ViR1BVUmVuZGVyZXI6IFVuc3VwcG9ydGVkIHRleHR1cmUgdHlwZSB3aXRoIERlcHRoU3RlbmNpbEZvcm1hdC4nLCB0eXBlICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIFJlZEludGVnZXJGb3JtYXQ6XHJcblxyXG5cdFx0XHRcdHN3aXRjaCAoIHR5cGUgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y2FzZSBJbnRUeXBlOlxyXG5cdFx0XHRcdFx0XHRmb3JtYXRHUFUgPSBHUFVUZXh0dXJlRm9ybWF0LlIzMlNpbnQ7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgVW5zaWduZWRJbnRUeXBlOlxyXG5cdFx0XHRcdFx0XHRmb3JtYXRHUFUgPSBHUFVUZXh0dXJlRm9ybWF0LlIzMlVpbnQ7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdXZWJHUFVSZW5kZXJlcjogVW5zdXBwb3J0ZWQgdGV4dHVyZSB0eXBlIHdpdGggUmVkSW50ZWdlckZvcm1hdC4nLCB0eXBlICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIFJHSW50ZWdlckZvcm1hdDpcclxuXHJcblx0XHRcdFx0c3dpdGNoICggdHlwZSApIHtcclxuXHJcblx0XHRcdFx0XHRjYXNlIEludFR5cGU6XHJcblx0XHRcdFx0XHRcdGZvcm1hdEdQVSA9IEdQVVRleHR1cmVGb3JtYXQuUkczMlNpbnQ7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgVW5zaWduZWRJbnRUeXBlOlxyXG5cdFx0XHRcdFx0XHRmb3JtYXRHUFUgPSBHUFVUZXh0dXJlRm9ybWF0LlJHMzJVaW50O1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnV2ViR1BVUmVuZGVyZXI6IFVuc3VwcG9ydGVkIHRleHR1cmUgdHlwZSB3aXRoIFJHSW50ZWdlckZvcm1hdC4nLCB0eXBlICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIFJHQkFJbnRlZ2VyRm9ybWF0OlxyXG5cclxuXHRcdFx0XHRzd2l0Y2ggKCB0eXBlICkge1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgSW50VHlwZTpcclxuXHRcdFx0XHRcdFx0Zm9ybWF0R1BVID0gR1BVVGV4dHVyZUZvcm1hdC5SR0JBMzJTaW50O1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRjYXNlIFVuc2lnbmVkSW50VHlwZTpcclxuXHRcdFx0XHRcdFx0Zm9ybWF0R1BVID0gR1BVVGV4dHVyZUZvcm1hdC5SR0JBMzJVaW50O1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnV2ViR1BVUmVuZGVyZXI6IFVuc3VwcG9ydGVkIHRleHR1cmUgdHlwZSB3aXRoIFJHQkFJbnRlZ2VyRm9ybWF0LicsIHR5cGUgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1dlYkdQVVJlbmRlcmVyOiBVbnN1cHBvcnRlZCB0ZXh0dXJlIGZvcm1hdC4nLCBmb3JtYXQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0cmV0dXJuIGZvcm1hdEdQVTtcclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFdlYkdQVVRleHR1cmVVdGlscztcclxuIiwiaW1wb3J0IE5vZGVGdW5jdGlvbiBmcm9tICcuLi8uLi8uLi9ub2Rlcy9jb3JlL05vZGVGdW5jdGlvbi5qcyc7XHJcbmltcG9ydCBOb2RlRnVuY3Rpb25JbnB1dCBmcm9tICcuLi8uLi8uLi9ub2Rlcy9jb3JlL05vZGVGdW5jdGlvbklucHV0LmpzJztcclxuXHJcbmNvbnN0IGRlY2xhcmF0aW9uUmVnZXhwID0gL15bZm5dKlxccyooW2Etel8wLTldKyk/XFxzKlxcKChbXFxzXFxTXSo/KVxcKVxccypbXFwtXFw+XSpcXHMqKFthLXpfMC05XSsoPzo8W1xcc1xcU10rPz4pPykvaTtcclxuY29uc3QgcHJvcGVydGllc1JlZ2V4cCA9IC8oW2Etel8wLTldKylcXHMqOlxccyooW2Etel8wLTldKyg/OjxbXFxzXFxTXSs/Pik/KS9pZztcclxuXHJcbmNvbnN0IHdnc2xUeXBlTGliID0ge1xyXG5cdCdmMzInOiAnZmxvYXQnLFxyXG5cdCdpMzInOiAnaW50JyxcclxuXHQndTMyJzogJ3VpbnQnLFxyXG5cdCdib29sJzogJ2Jvb2wnLFxyXG5cclxuXHQndmVjMjxmMzI+JzogJ3ZlYzInLFxyXG4gXHQndmVjMjxpMzI+JzogJ2l2ZWMyJyxcclxuIFx0J3ZlYzI8dTMyPic6ICd1dmVjMicsXHJcbiBcdCd2ZWMyPGJvb2w+JzogJ2J2ZWMyJyxcclxuXHJcblx0J3ZlYzJmJzogJ3ZlYzInLFxyXG5cdCd2ZWMyaSc6ICdpdmVjMicsXHJcblx0J3ZlYzJ1JzogJ3V2ZWMyJyxcclxuXHQndmVjMmInOiAnYnZlYzInLFxyXG5cclxuXHQndmVjMzxmMzI+JzogJ3ZlYzMnLFxyXG5cdCd2ZWMzPGkzMj4nOiAnaXZlYzMnLFxyXG5cdCd2ZWMzPHUzMj4nOiAndXZlYzMnLFxyXG5cdCd2ZWMzPGJvb2w+JzogJ2J2ZWMzJyxcclxuXHJcblx0J3ZlYzNmJzogJ3ZlYzMnLFxyXG5cdCd2ZWMzaSc6ICdpdmVjMycsXHJcblx0J3ZlYzN1JzogJ3V2ZWMzJyxcclxuXHQndmVjM2InOiAnYnZlYzMnLFxyXG5cclxuXHQndmVjNDxmMzI+JzogJ3ZlYzQnLFxyXG5cdCd2ZWM0PGkzMj4nOiAnaXZlYzQnLFxyXG5cdCd2ZWM0PHUzMj4nOiAndXZlYzQnLFxyXG5cdCd2ZWM0PGJvb2w+JzogJ2J2ZWM0JyxcclxuXHJcblx0J3ZlYzRmJzogJ3ZlYzQnLFxyXG5cdCd2ZWM0aSc6ICdpdmVjNCcsXHJcblx0J3ZlYzR1JzogJ3V2ZWM0JyxcclxuXHQndmVjNGInOiAnYnZlYzQnLFxyXG5cclxuXHQnbWF0MngyPGYzMj4nOiAnbWF0MicsXHJcblx0J21hdDJ4MmYnOiAnbWF0MicsXHJcblxyXG5cdCdtYXQzeDM8ZjMyPic6ICdtYXQzJyxcclxuXHQnbWF0M3gzZic6ICdtYXQzJyxcclxuXHJcblx0J21hdDR4NDxmMzI+JzogJ21hdDQnLFxyXG5cdCdtYXQ0eDRmJzogJ21hdDQnLFxyXG5cclxuXHQnc2FtcGxlcic6ICdzYW1wbGVyJyxcclxuXHJcblx0J3RleHR1cmVfMWQnOiAndGV4dHVyZScsXHJcblxyXG5cdCd0ZXh0dXJlXzJkJzogJ3RleHR1cmUnLFxyXG5cdCd0ZXh0dXJlXzJkX2FycmF5JzogJ3RleHR1cmUnLFxyXG5cdCd0ZXh0dXJlX211bHRpc2FtcGxlZF8yZCc6ICdjdWJlVGV4dHVyZScsXHJcblxyXG5cdCd0ZXh0dXJlX2RlcHRoXzJkJzogJ2RlcHRoVGV4dHVyZScsXHJcblx0J3RleHR1cmVfZGVwdGhfbXVsdGlzYW1wbGVkXzJkJzogJ2RlcHRoVGV4dHVyZScsXHJcblxyXG5cdCd0ZXh0dXJlXzNkJzogJ3RleHR1cmUzRCcsXHJcblxyXG5cdCd0ZXh0dXJlX2N1YmUnOiAnY3ViZVRleHR1cmUnLFxyXG5cdCd0ZXh0dXJlX2N1YmVfYXJyYXknOiAnY3ViZVRleHR1cmUnLFxyXG5cclxuXHQndGV4dHVyZV9zdG9yYWdlXzFkJzogJ3N0b3JhZ2VUZXh0dXJlJyxcclxuXHQndGV4dHVyZV9zdG9yYWdlXzJkJzogJ3N0b3JhZ2VUZXh0dXJlJyxcclxuXHQndGV4dHVyZV9zdG9yYWdlXzJkX2FycmF5JzogJ3N0b3JhZ2VUZXh0dXJlJyxcclxuXHQndGV4dHVyZV9zdG9yYWdlXzNkJzogJ3N0b3JhZ2VUZXh0dXJlJ1xyXG5cclxufTtcclxuXHJcbmNvbnN0IHBhcnNlID0gKCBzb3VyY2UgKSA9PiB7XHJcblxyXG5cdHNvdXJjZSA9IHNvdXJjZS50cmltKCk7XHJcblxyXG5cdGNvbnN0IGRlY2xhcmF0aW9uID0gc291cmNlLm1hdGNoKCBkZWNsYXJhdGlvblJlZ2V4cCApO1xyXG5cclxuXHRpZiAoIGRlY2xhcmF0aW9uICE9PSBudWxsICYmIGRlY2xhcmF0aW9uLmxlbmd0aCA9PT0gNCApIHtcclxuXHJcblx0XHRjb25zdCBpbnB1dHNDb2RlID0gZGVjbGFyYXRpb25bIDIgXTtcclxuXHRcdGNvbnN0IHByb3BzTWF0Y2hlcyA9IFtdO1xyXG5cdFx0bGV0IG1hdGNoID0gbnVsbDtcclxuXHJcblx0XHR3aGlsZSAoICggbWF0Y2ggPSBwcm9wZXJ0aWVzUmVnZXhwLmV4ZWMoIGlucHV0c0NvZGUgKSApICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0cHJvcHNNYXRjaGVzLnB1c2goIHsgbmFtZTogbWF0Y2hbIDEgXSwgdHlwZTogbWF0Y2hbIDIgXSB9ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFByb2Nlc3MgbWF0Y2hlcyB0byBjb3JyZWN0bHkgcGFpciBuYW1lcyBhbmQgdHlwZXNcclxuXHRcdGNvbnN0IGlucHV0cyA9IFtdO1xyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgcHJvcHNNYXRjaGVzLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHsgbmFtZSwgdHlwZSB9ID0gcHJvcHNNYXRjaGVzWyBpIF07XHJcblxyXG5cdFx0XHRsZXQgcmVzb2x2ZWRUeXBlID0gdHlwZTtcclxuXHJcblx0XHRcdGlmICggcmVzb2x2ZWRUeXBlLnN0YXJ0c1dpdGgoICdwdHInICkgKSB7XHJcblxyXG5cdFx0XHRcdHJlc29sdmVkVHlwZSA9ICdwb2ludGVyJztcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGlmICggcmVzb2x2ZWRUeXBlLnN0YXJ0c1dpdGgoICd0ZXh0dXJlJyApICkge1xyXG5cclxuXHRcdFx0XHRcdHJlc29sdmVkVHlwZSA9IHR5cGUuc3BsaXQoICc8JyApWyAwIF07XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0cmVzb2x2ZWRUeXBlID0gd2dzbFR5cGVMaWJbIHJlc29sdmVkVHlwZSBdO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aW5wdXRzLnB1c2goIG5ldyBOb2RlRnVuY3Rpb25JbnB1dCggcmVzb2x2ZWRUeXBlLCBuYW1lICkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgYmxvY2tDb2RlID0gc291cmNlLnN1YnN0cmluZyggZGVjbGFyYXRpb25bIDAgXS5sZW5ndGggKTtcclxuXHRcdGNvbnN0IG91dHB1dFR5cGUgPSBkZWNsYXJhdGlvblsgMyBdIHx8ICd2b2lkJztcclxuXHJcblx0XHRjb25zdCBuYW1lID0gZGVjbGFyYXRpb25bIDEgXSAhPT0gdW5kZWZpbmVkID8gZGVjbGFyYXRpb25bIDEgXSA6ICcnO1xyXG5cdFx0Y29uc3QgdHlwZSA9IHdnc2xUeXBlTGliWyBvdXRwdXRUeXBlIF0gfHwgb3V0cHV0VHlwZTtcclxuXHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHR0eXBlLFxyXG5cdFx0XHRpbnB1dHMsXHJcblx0XHRcdG5hbWUsXHJcblx0XHRcdGlucHV0c0NvZGUsXHJcblx0XHRcdGJsb2NrQ29kZSxcclxuXHRcdFx0b3V0cHV0VHlwZVxyXG5cdFx0fTtcclxuXHJcblx0fSBlbHNlIHtcclxuXHJcblx0XHR0aHJvdyBuZXcgRXJyb3IoICdGdW5jdGlvbk5vZGU6IEZ1bmN0aW9uIGlzIG5vdCBhIFdHU0wgY29kZS4nICk7XHJcblxyXG5cdH1cclxuXHJcbn07XHJcblxyXG4vKipcclxuICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NMIG5vZGUgZnVuY3Rpb24uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBOb2RlRnVuY3Rpb25cclxuICovXHJcbmNsYXNzIFdHU0xOb2RlRnVuY3Rpb24gZXh0ZW5kcyBOb2RlRnVuY3Rpb24ge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IFdHU0wgbm9kZSBmdW5jdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBUaGUgV0dTTCBzb3VyY2UuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHNvdXJjZSApIHtcclxuXHJcblx0XHRjb25zdCB7IHR5cGUsIGlucHV0cywgbmFtZSwgaW5wdXRzQ29kZSwgYmxvY2tDb2RlLCBvdXRwdXRUeXBlIH0gPSBwYXJzZSggc291cmNlICk7XHJcblxyXG5cdFx0c3VwZXIoIHR5cGUsIGlucHV0cywgbmFtZSApO1xyXG5cclxuXHRcdHRoaXMuaW5wdXRzQ29kZSA9IGlucHV0c0NvZGU7XHJcblx0XHR0aGlzLmJsb2NrQ29kZSA9IGJsb2NrQ29kZTtcclxuXHRcdHRoaXMub3V0cHV0VHlwZSA9IG91dHB1dFR5cGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgV0dTTCBjb2RlIG9mIHRoZSBub2RlIGZ1bmN0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lPXRoaXMubmFtZV0gLSBUaGUgZnVuY3Rpb24ncyBuYW1lLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHNoYWRlciBjb2RlLlxyXG5cdCAqL1xyXG5cdGdldENvZGUoIG5hbWUgPSB0aGlzLm5hbWUgKSB7XHJcblxyXG5cdFx0Y29uc3Qgb3V0cHV0VHlwZSA9IHRoaXMub3V0cHV0VHlwZSAhPT0gJ3ZvaWQnID8gJy0+ICcgKyB0aGlzLm91dHB1dFR5cGUgOiAnJztcclxuXHJcblx0XHRyZXR1cm4gYGZuICR7IG5hbWUgfSAoICR7IHRoaXMuaW5wdXRzQ29kZS50cmltKCkgfSApICR7IG91dHB1dFR5cGUgfWAgKyB0aGlzLmJsb2NrQ29kZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgV0dTTE5vZGVGdW5jdGlvbjtcclxuIiwiaW1wb3J0IE5vZGVQYXJzZXIgZnJvbSAnLi4vLi4vLi4vbm9kZXMvY29yZS9Ob2RlUGFyc2VyLmpzJztcclxuaW1wb3J0IFdHU0xOb2RlRnVuY3Rpb24gZnJvbSAnLi9XR1NMTm9kZUZ1bmN0aW9uLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIFdHU0wgbm9kZSBwYXJzZXIuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBOb2RlUGFyc2VyXHJcbiAqL1xyXG5jbGFzcyBXR1NMTm9kZVBhcnNlciBleHRlbmRzIE5vZGVQYXJzZXIge1xyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgbWV0aG9kIHBhcnNlcyB0aGUgZ2l2ZW4gV0dTTCBjb2RlIGFuIHJldHVybnMgYSBub2RlIGZ1bmN0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSAtIFRoZSBXR1NMIGNvZGUuXHJcblx0ICogQHJldHVybiB7V0dTTE5vZGVGdW5jdGlvbn0gQSBub2RlIGZ1bmN0aW9uLlxyXG5cdCAqL1xyXG5cdHBhcnNlRnVuY3Rpb24oIHNvdXJjZSApIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IFdHU0xOb2RlRnVuY3Rpb24oIHNvdXJjZSApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBXR1NMTm9kZVBhcnNlcjtcclxuIiwiaW1wb3J0IE5vZGVVbmlmb3Jtc0dyb3VwIGZyb20gJy4uLy4uL2NvbW1vbi9ub2Rlcy9Ob2RlVW5pZm9ybXNHcm91cC5qcyc7XHJcblxyXG5pbXBvcnQgTm9kZVNhbXBsZXIgZnJvbSAnLi4vLi4vY29tbW9uL25vZGVzL05vZGVTYW1wbGVyLmpzJztcclxuaW1wb3J0IHsgTm9kZVNhbXBsZWRUZXh0dXJlLCBOb2RlU2FtcGxlZEN1YmVUZXh0dXJlLCBOb2RlU2FtcGxlZFRleHR1cmUzRCB9IGZyb20gJy4uLy4uL2NvbW1vbi9ub2Rlcy9Ob2RlU2FtcGxlZFRleHR1cmUuanMnO1xyXG5cclxuaW1wb3J0IE5vZGVVbmlmb3JtQnVmZmVyIGZyb20gJy4uLy4uL2NvbW1vbi9ub2Rlcy9Ob2RlVW5pZm9ybUJ1ZmZlci5qcyc7XHJcbmltcG9ydCBOb2RlU3RvcmFnZUJ1ZmZlciBmcm9tICcuLi8uLi9jb21tb24vbm9kZXMvTm9kZVN0b3JhZ2VCdWZmZXIuanMnO1xyXG5cclxuaW1wb3J0IHsgTm9kZUJ1aWxkZXIsIENvZGVOb2RlIH0gZnJvbSAnLi4vLi4vLi4vbm9kZXMvTm9kZXMuanMnO1xyXG5cclxuaW1wb3J0IHsgZ2V0Rm9ybWF0IH0gZnJvbSAnLi4vdXRpbHMvV2ViR1BVVGV4dHVyZVV0aWxzLmpzJztcclxuXHJcbmltcG9ydCBXR1NMTm9kZVBhcnNlciBmcm9tICcuL1dHU0xOb2RlUGFyc2VyLmpzJztcclxuaW1wb3J0IHsgTm9kZUFjY2VzcyB9IGZyb20gJy4uLy4uLy4uL25vZGVzL2NvcmUvY29uc3RhbnRzLmpzJztcclxuXHJcbmltcG9ydCBWYXJOb2RlIGZyb20gJy4uLy4uLy4uL25vZGVzL2NvcmUvVmFyTm9kZS5qcyc7XHJcbmltcG9ydCBFeHByZXNzaW9uTm9kZSBmcm9tICcuLi8uLi8uLi9ub2Rlcy9jb2RlL0V4cHJlc3Npb25Ob2RlLmpzJztcclxuXHJcbmltcG9ydCB7IE5vQ29sb3JTcGFjZSwgRmxvYXRUeXBlLCBSZXBlYXRXcmFwcGluZywgQ2xhbXBUb0VkZ2VXcmFwcGluZywgTWlycm9yZWRSZXBlYXRXcmFwcGluZywgTmVhcmVzdEZpbHRlciB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcblxyXG4vLyBHUFVTaGFkZXJTdGFnZSBpcyBub3QgZGVmaW5lZCBpbiBicm93c2VycyBub3Qgc3VwcG9ydGluZyBXZWJHUFVcclxuY29uc3QgR1BVU2hhZGVyU3RhZ2UgPSAoIHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyApID8gc2VsZi5HUFVTaGFkZXJTdGFnZSA6IHsgVkVSVEVYOiAxLCBGUkFHTUVOVDogMiwgQ09NUFVURTogNCB9O1xyXG5cclxuY29uc3QgYWNjZXNzTmFtZXMgPSB7XHJcblx0WyBOb2RlQWNjZXNzLlJFQURfT05MWSBdOiAncmVhZCcsXHJcblx0WyBOb2RlQWNjZXNzLldSSVRFX09OTFkgXTogJ3dyaXRlJyxcclxuXHRbIE5vZGVBY2Nlc3MuUkVBRF9XUklURSBdOiAncmVhZF93cml0ZSdcclxufTtcclxuXHJcbmNvbnN0IHdyYXBOYW1lcyA9IHtcclxuXHRbIFJlcGVhdFdyYXBwaW5nIF06ICdyZXBlYXQnLFxyXG5cdFsgQ2xhbXBUb0VkZ2VXcmFwcGluZyBdOiAnY2xhbXAnLFxyXG5cdFsgTWlycm9yZWRSZXBlYXRXcmFwcGluZyBdOiAnbWlycm9yJ1xyXG59O1xyXG5cclxuY29uc3QgZ3B1U2hhZGVyU3RhZ2VMaWIgPSB7XHJcblx0J3ZlcnRleCc6IEdQVVNoYWRlclN0YWdlID8gR1BVU2hhZGVyU3RhZ2UuVkVSVEVYIDogMSxcclxuXHQnZnJhZ21lbnQnOiBHUFVTaGFkZXJTdGFnZSA/IEdQVVNoYWRlclN0YWdlLkZSQUdNRU5UIDogMixcclxuXHQnY29tcHV0ZSc6IEdQVVNoYWRlclN0YWdlID8gR1BVU2hhZGVyU3RhZ2UuQ09NUFVURSA6IDRcclxufTtcclxuXHJcbmNvbnN0IHN1cHBvcnRzID0ge1xyXG5cdGluc3RhbmNlOiB0cnVlLFxyXG5cdHN3aXp6bGVBc3NpZ246IGZhbHNlLFxyXG5cdHN0b3JhZ2VCdWZmZXI6IHRydWVcclxufTtcclxuXHJcbmNvbnN0IHdnc2xGbk9wTGliID0ge1xyXG5cdCdeXic6ICd0c2xfeG9yJ1xyXG59O1xyXG5cclxuY29uc3Qgd2dzbFR5cGVMaWIgPSB7XHJcblx0ZmxvYXQ6ICdmMzInLFxyXG5cdGludDogJ2kzMicsXHJcblx0dWludDogJ3UzMicsXHJcblx0Ym9vbDogJ2Jvb2wnLFxyXG5cdGNvbG9yOiAndmVjMzxmMzI+JyxcclxuXHJcblx0dmVjMjogJ3ZlYzI8ZjMyPicsXHJcblx0aXZlYzI6ICd2ZWMyPGkzMj4nLFxyXG5cdHV2ZWMyOiAndmVjMjx1MzI+JyxcclxuXHRidmVjMjogJ3ZlYzI8Ym9vbD4nLFxyXG5cclxuXHR2ZWMzOiAndmVjMzxmMzI+JyxcclxuXHRpdmVjMzogJ3ZlYzM8aTMyPicsXHJcblx0dXZlYzM6ICd2ZWMzPHUzMj4nLFxyXG5cdGJ2ZWMzOiAndmVjMzxib29sPicsXHJcblxyXG5cdHZlYzQ6ICd2ZWM0PGYzMj4nLFxyXG5cdGl2ZWM0OiAndmVjNDxpMzI+JyxcclxuXHR1dmVjNDogJ3ZlYzQ8dTMyPicsXHJcblx0YnZlYzQ6ICd2ZWM0PGJvb2w+JyxcclxuXHJcblx0bWF0MjogJ21hdDJ4MjxmMzI+JyxcclxuXHRtYXQzOiAnbWF0M3gzPGYzMj4nLFxyXG5cdG1hdDQ6ICdtYXQ0eDQ8ZjMyPidcclxufTtcclxuXHJcbmNvbnN0IHdnc2xDb2RlQ2FjaGUgPSB7fTtcclxuXHJcbmNvbnN0IHdnc2xQb2x5ZmlsbCA9IHtcclxuXHR0c2xfeG9yOiBuZXcgQ29kZU5vZGUoICdmbiB0c2xfeG9yKCBhIDogYm9vbCwgYiA6IGJvb2wgKSAtPiBib29sIHsgcmV0dXJuICggYSB8fCBiICkgJiYgISggYSAmJiBiICk7IH0nICksXHJcblx0bW9kX2Zsb2F0OiBuZXcgQ29kZU5vZGUoICdmbiB0c2xfbW9kX2Zsb2F0KCB4IDogZjMyLCB5IDogZjMyICkgLT4gZjMyIHsgcmV0dXJuIHggLSB5ICogZmxvb3IoIHggLyB5ICk7IH0nICksXHJcblx0bW9kX3ZlYzI6IG5ldyBDb2RlTm9kZSggJ2ZuIHRzbF9tb2RfdmVjMiggeCA6IHZlYzJmLCB5IDogdmVjMmYgKSAtPiB2ZWMyZiB7IHJldHVybiB4IC0geSAqIGZsb29yKCB4IC8geSApOyB9JyApLFxyXG5cdG1vZF92ZWMzOiBuZXcgQ29kZU5vZGUoICdmbiB0c2xfbW9kX3ZlYzMoIHggOiB2ZWMzZiwgeSA6IHZlYzNmICkgLT4gdmVjM2YgeyByZXR1cm4geCAtIHkgKiBmbG9vciggeCAvIHkgKTsgfScgKSxcclxuXHRtb2RfdmVjNDogbmV3IENvZGVOb2RlKCAnZm4gdHNsX21vZF92ZWM0KCB4IDogdmVjNGYsIHkgOiB2ZWM0ZiApIC0+IHZlYzRmIHsgcmV0dXJuIHggLSB5ICogZmxvb3IoIHggLyB5ICk7IH0nICksXHJcblx0ZXF1YWxzX2Jvb2w6IG5ldyBDb2RlTm9kZSggJ2ZuIHRzbF9lcXVhbHNfYm9vbCggYSA6IGJvb2wsIGIgOiBib29sICkgLT4gYm9vbCB7IHJldHVybiBhID09IGI7IH0nICksXHJcblx0ZXF1YWxzX2J2ZWMyOiBuZXcgQ29kZU5vZGUoICdmbiB0c2xfZXF1YWxzX2J2ZWMyKCBhIDogdmVjMmYsIGIgOiB2ZWMyZiApIC0+IHZlYzI8Ym9vbD4geyByZXR1cm4gdmVjMjxib29sPiggYS54ID09IGIueCwgYS55ID09IGIueSApOyB9JyApLFxyXG5cdGVxdWFsc19idmVjMzogbmV3IENvZGVOb2RlKCAnZm4gdHNsX2VxdWFsc19idmVjMyggYSA6IHZlYzNmLCBiIDogdmVjM2YgKSAtPiB2ZWMzPGJvb2w+IHsgcmV0dXJuIHZlYzM8Ym9vbD4oIGEueCA9PSBiLngsIGEueSA9PSBiLnksIGEueiA9PSBiLnogKTsgfScgKSxcclxuXHRlcXVhbHNfYnZlYzQ6IG5ldyBDb2RlTm9kZSggJ2ZuIHRzbF9lcXVhbHNfYnZlYzQoIGEgOiB2ZWM0ZiwgYiA6IHZlYzRmICkgLT4gdmVjNDxib29sPiB7IHJldHVybiB2ZWM0PGJvb2w+KCBhLnggPT0gYi54LCBhLnkgPT0gYi55LCBhLnogPT0gYi56LCBhLncgPT0gYi53ICk7IH0nICksXHJcblx0cmVwZWF0V3JhcHBpbmdfZmxvYXQ6IG5ldyBDb2RlTm9kZSggJ2ZuIHRzbF9yZXBlYXRXcmFwcGluZ19mbG9hdCggY29vcmQ6IGYzMiApIC0+IGYzMiB7IHJldHVybiBmcmFjdCggY29vcmQgKTsgfScgKSxcclxuXHRtaXJyb3JXcmFwcGluZ19mbG9hdDogbmV3IENvZGVOb2RlKCAnZm4gdHNsX21pcnJvcldyYXBwaW5nX2Zsb2F0KCBjb29yZDogZjMyICkgLT4gZjMyIHsgbGV0IG1pcnJvcmVkID0gZnJhY3QoIGNvb3JkICogMC41ICkgKiAyLjA7IHJldHVybiAxLjAgLSBhYnMoIDEuMCAtIG1pcnJvcmVkICk7IH0nICksXHJcblx0Y2xhbXBXcmFwcGluZ19mbG9hdDogbmV3IENvZGVOb2RlKCAnZm4gdHNsX2NsYW1wV3JhcHBpbmdfZmxvYXQoIGNvb3JkOiBmMzIgKSAtPiBmMzIgeyByZXR1cm4gY2xhbXAoIGNvb3JkLCAwLjAsIDEuMCApOyB9JyApLFxyXG5cdGJpcXVhZHJhdGljVGV4dHVyZTogbmV3IENvZGVOb2RlKCAvKiB3Z3NsICovYFxyXG5mbiB0c2xfYmlxdWFkcmF0aWNUZXh0dXJlKCBtYXAgOiB0ZXh0dXJlXzJkPGYzMj4sIGNvb3JkIDogdmVjMmYsIGlSZXMgOiB2ZWMydSwgbGV2ZWwgOiB1MzIgKSAtPiB2ZWM0ZiB7XHJcblxyXG5cdGxldCByZXMgPSB2ZWMyZiggaVJlcyApO1xyXG5cclxuXHRsZXQgdXZTY2FsZWQgPSBjb29yZCAqIHJlcztcclxuXHRsZXQgdXZXcmFwcGluZyA9ICggKCB1dlNjYWxlZCAlIHJlcyApICsgcmVzICkgJSByZXM7XHJcblxyXG5cdC8vIGh0dHBzOi8vd3d3LnNoYWRlcnRveS5jb20vdmlldy9XdHlYUnlcclxuXHJcblx0bGV0IHV2ID0gdXZXcmFwcGluZyAtIDAuNTtcclxuXHRsZXQgaXV2ID0gZmxvb3IoIHV2ICk7XHJcblx0bGV0IGYgPSBmcmFjdCggdXYgKTtcclxuXHJcblx0bGV0IHJnMSA9IHRleHR1cmVMb2FkKCBtYXAsIHZlYzJ1KCBpdXYgKyB2ZWMyKCAwLjUsIDAuNSApICkgJSBpUmVzLCBsZXZlbCApO1xyXG5cdGxldCByZzIgPSB0ZXh0dXJlTG9hZCggbWFwLCB2ZWMydSggaXV2ICsgdmVjMiggMS41LCAwLjUgKSApICUgaVJlcywgbGV2ZWwgKTtcclxuXHRsZXQgcmczID0gdGV4dHVyZUxvYWQoIG1hcCwgdmVjMnUoIGl1diArIHZlYzIoIDAuNSwgMS41ICkgKSAlIGlSZXMsIGxldmVsICk7XHJcblx0bGV0IHJnNCA9IHRleHR1cmVMb2FkKCBtYXAsIHZlYzJ1KCBpdXYgKyB2ZWMyKCAxLjUsIDEuNSApICkgJSBpUmVzLCBsZXZlbCApO1xyXG5cclxuXHRyZXR1cm4gbWl4KCBtaXgoIHJnMSwgcmcyLCBmLnggKSwgbWl4KCByZzMsIHJnNCwgZi54ICksIGYueSApO1xyXG5cclxufVxyXG5gIClcclxufTtcclxuXHJcbmNvbnN0IHdnc2xNZXRob2RzID0ge1xyXG5cdGRGZHg6ICdkcGR4JyxcclxuXHRkRmR5OiAnLSBkcGR5JyxcclxuXHRtb2RfZmxvYXQ6ICd0c2xfbW9kX2Zsb2F0JyxcclxuXHRtb2RfdmVjMjogJ3RzbF9tb2RfdmVjMicsXHJcblx0bW9kX3ZlYzM6ICd0c2xfbW9kX3ZlYzMnLFxyXG5cdG1vZF92ZWM0OiAndHNsX21vZF92ZWM0JyxcclxuXHRlcXVhbHNfYm9vbDogJ3RzbF9lcXVhbHNfYm9vbCcsXHJcblx0ZXF1YWxzX2J2ZWMyOiAndHNsX2VxdWFsc19idmVjMicsXHJcblx0ZXF1YWxzX2J2ZWMzOiAndHNsX2VxdWFsc19idmVjMycsXHJcblx0ZXF1YWxzX2J2ZWM0OiAndHNsX2VxdWFsc19idmVjNCcsXHJcblx0aW52ZXJzZXNxcnQ6ICdpbnZlcnNlU3FydCcsXHJcblx0Yml0Y2FzdDogJ2JpdGNhc3Q8ZjMyPidcclxufTtcclxuXHJcbi8vIFdlYkdQVSBpc3N1ZTogZG9lcyBub3Qgc3VwcG9ydCBwb3coKSB3aXRoIG5lZ2F0aXZlIGJhc2Ugb24gV2luZG93c1xyXG5cclxuaWYgKCB0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiAvV2luZG93cy9nLnRlc3QoIG5hdmlnYXRvci51c2VyQWdlbnQgKSApIHtcclxuXHJcblx0d2dzbFBvbHlmaWxsLnBvd19mbG9hdCA9IG5ldyBDb2RlTm9kZSggJ2ZuIHRzbF9wb3dfZmxvYXQoIGEgOiBmMzIsIGIgOiBmMzIgKSAtPiBmMzIgeyByZXR1cm4gc2VsZWN0KCAtcG93KCAtYSwgYiApLCBwb3coIGEsIGIgKSwgYSA+IDAuMCApOyB9JyApO1xyXG5cdHdnc2xQb2x5ZmlsbC5wb3dfdmVjMiA9IG5ldyBDb2RlTm9kZSggJ2ZuIHRzbF9wb3dfdmVjMiggYSA6IHZlYzJmLCBiIDogdmVjMmYgKSAtPiB2ZWMyZiB7IHJldHVybiB2ZWMyZiggdHNsX3Bvd19mbG9hdCggYS54LCBiLnggKSwgdHNsX3Bvd19mbG9hdCggYS55LCBiLnkgKSApOyB9JywgWyB3Z3NsUG9seWZpbGwucG93X2Zsb2F0IF0gKTtcclxuXHR3Z3NsUG9seWZpbGwucG93X3ZlYzMgPSBuZXcgQ29kZU5vZGUoICdmbiB0c2xfcG93X3ZlYzMoIGEgOiB2ZWMzZiwgYiA6IHZlYzNmICkgLT4gdmVjM2YgeyByZXR1cm4gdmVjM2YoIHRzbF9wb3dfZmxvYXQoIGEueCwgYi54ICksIHRzbF9wb3dfZmxvYXQoIGEueSwgYi55ICksIHRzbF9wb3dfZmxvYXQoIGEueiwgYi56ICkgKTsgfScsIFsgd2dzbFBvbHlmaWxsLnBvd19mbG9hdCBdICk7XHJcblx0d2dzbFBvbHlmaWxsLnBvd192ZWM0ID0gbmV3IENvZGVOb2RlKCAnZm4gdHNsX3Bvd192ZWM0KCBhIDogdmVjNGYsIGIgOiB2ZWM0ZiApIC0+IHZlYzRmIHsgcmV0dXJuIHZlYzRmKCB0c2xfcG93X2Zsb2F0KCBhLngsIGIueCApLCB0c2xfcG93X2Zsb2F0KCBhLnksIGIueSApLCB0c2xfcG93X2Zsb2F0KCBhLnosIGIueiApLCB0c2xfcG93X2Zsb2F0KCBhLncsIGIudyApICk7IH0nLCBbIHdnc2xQb2x5ZmlsbC5wb3dfZmxvYXQgXSApO1xyXG5cclxuXHR3Z3NsTWV0aG9kcy5wb3dfZmxvYXQgPSAndHNsX3Bvd19mbG9hdCc7XHJcblx0d2dzbE1ldGhvZHMucG93X3ZlYzIgPSAndHNsX3Bvd192ZWMyJztcclxuXHR3Z3NsTWV0aG9kcy5wb3dfdmVjMyA9ICd0c2xfcG93X3ZlYzMnO1xyXG5cdHdnc2xNZXRob2RzLnBvd192ZWM0ID0gJ3RzbF9wb3dfdmVjNCc7XHJcblxyXG59XHJcblxyXG4vL1xyXG5cclxubGV0IGRpYWdub3N0aWNzID0gJyc7XHJcblxyXG5pZiAoICggdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgL0ZpcmVmb3h8RGVuby9nLnRlc3QoIG5hdmlnYXRvci51c2VyQWdlbnQgKSApICE9PSB0cnVlICkge1xyXG5cclxuXHRkaWFnbm9zdGljcyArPSAnZGlhZ25vc3RpYyggb2ZmLCBkZXJpdmF0aXZlX3VuaWZvcm1pdHkgKTtcXG4nO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIEEgbm9kZSBidWlsZGVyIHRhcmdldGluZyBXR1NMLlxyXG4gKlxyXG4gKiBUaGlzIG1vZHVsZSBnZW5lcmF0ZXMgV0dTTCBzaGFkZXIgY29kZSBmcm9tIG5vZGUgbWF0ZXJpYWxzIGFuZCBhbHNvXHJcbiAqIGdlbmVyYXRlcyB0aGUgcmVzcGVjdGl2ZSBiaW5kaW5ncyBhbmQgdmVydGV4IGJ1ZmZlciBkZWZpbml0aW9ucy4gVGhlc2VcclxuICogZGF0YSBhcmUgbGF0ZXIgdXNlZCBieSB0aGUgcmVuZGVyZXIgdG8gY3JlYXRlIHJlbmRlciBhbmQgY29tcHV0ZSBwaXBlbGluZXNcclxuICogZm9yIHJlbmRlciBvYmplY3RzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTm9kZUJ1aWxkZXJcclxuICovXHJcbmNsYXNzIFdHU0xOb2RlQnVpbGRlciBleHRlbmRzIE5vZGVCdWlsZGVyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBXR1NMIG5vZGUgYnVpbGRlciByZW5kZXJlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0M0R9IG9iamVjdCAtIFRoZSAzRCBvYmplY3QuXHJcblx0ICogQHBhcmFtIHtSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIG9iamVjdCwgcmVuZGVyZXIgKSB7XHJcblxyXG5cdFx0c3VwZXIoIG9iamVjdCwgcmVuZGVyZXIsIG5ldyBXR1NMTm9kZVBhcnNlcigpICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGRpY3Rpb25hcnkgdGhhdCBob2xkcyBmb3IgZWFjaCBzaGFkZXIgc3RhZ2UgKCd2ZXJ0ZXgnLCAnZnJhZ21lbnQnLCAnY29tcHV0ZScpXHJcblx0XHQgKiBhbm90aGVyIGRpY3Rpb25hcnkgd2hpY2ggbWFuYWdlcyBVQk9zIHBlciBncm91cCAoJ3JlbmRlcicsJ2ZyYW1lJywnb2JqZWN0JykuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdDxzdHJpbmcsT2JqZWN0PHN0cmluZyxOb2RlVW5pZm9ybXNHcm91cD4+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnVuaWZvcm1Hcm91cHMgPSB7fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgZGljdGlvbmFyeSB0aGF0IGhvbGRzIGZvciBlYWNoIHNoYWRlciBzdGFnZSBhIE1hcCBvZiBidWlsdGlucy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0PHN0cmluZyxNYXA8c3RyaW5nLE9iamVjdD4+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJ1aWx0aW5zID0ge307XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGRpY3Rpb25hcnkgdGhhdCBob2xkcyBmb3IgZWFjaCBzaGFkZXIgc3RhZ2UgYSBTZXQgb2YgZGlyZWN0aXZlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0PHN0cmluZyxTZXQ8c3RyaW5nPj59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGlyZWN0aXZlcyA9IHt9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBtYXAgZm9yIG1hbmFnaW5nIHNjb3BlIGFycmF5cy4gT25seSByZWxldmFudCBmb3Igd2hlbiB1c2luZ1xyXG5cdFx0ICoge0BsaW5rIFdvcmtncm91cEluZm9Ob2RlfSBpbiBjb250ZXh0IG9mIGNvbXB1dGUgc2hhZGVycy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7TWFwPHN0cmluZyxPYmplY3Q+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnNjb3BlZEFycmF5cyA9IG5ldyBNYXAoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHRleHR1cmUgcmVxdWlyZXMgYSBtYW51YWwgY29udmVyc2lvbiB0byB0aGUgd29ya2luZyBjb2xvciBzcGFjZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlIHRvIGNoZWNrLlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGdpdmVuIHRleHR1cmUgcmVxdWlyZXMgYSBjb252ZXJzaW9uIHRvIHdvcmtpbmcgY29sb3Igc3BhY2Ugb3Igbm90LlxyXG5cdCAqL1xyXG5cdG5lZWRzVG9Xb3JraW5nQ29sb3JTcGFjZSggdGV4dHVyZSApIHtcclxuXHJcblx0XHRyZXR1cm4gdGV4dHVyZS5pc1ZpZGVvVGV4dHVyZSA9PT0gdHJ1ZSAmJiB0ZXh0dXJlLmNvbG9yU3BhY2UgIT09IE5vQ29sb3JTcGFjZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZW5lcmF0ZXMgdGhlIFdHU0wgc25pcHBldCBmb3Igc2FtcGxlZCB0ZXh0dXJlcy5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHRleHR1cmVQcm9wZXJ0eSAtIFRoZSBuYW1lIG9mIHRoZSB0ZXh0dXJlIHVuaWZvcm0gaW4gdGhlIHNoYWRlci5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdXZTbmlwcGV0IC0gQSBXR1NMIHNuaXBwZXQgdGhhdCByZXByZXNlbnRzIHRleHR1cmUgY29vcmRpbmF0ZXMgdXNlZCBmb3Igc2FtcGxpbmcuXHJcblx0ICogQHBhcmFtIHs/c3RyaW5nfSBkZXB0aFNuaXBwZXQgLSBBIFdHU0wgc25pcHBldCB0aGF0IHJlcHJlc2VudHMgMC1iYXNlZCB0ZXh0dXJlIGFycmF5IGluZGV4IHRvIHNhbXBsZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW3NoYWRlclN0YWdlPXRoaXMuc2hhZGVyU3RhZ2VdIC0gVGhlIHNoYWRlciBzdGFnZSB0aGlzIGNvZGUgc25pcHBldCBpcyBnZW5lcmF0ZWQgZm9yLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIFdHU0wgc25pcHBldC5cclxuXHQgKi9cclxuXHRfZ2VuZXJhdGVUZXh0dXJlU2FtcGxlKCB0ZXh0dXJlLCB0ZXh0dXJlUHJvcGVydHksIHV2U25pcHBldCwgZGVwdGhTbmlwcGV0LCBzaGFkZXJTdGFnZSA9IHRoaXMuc2hhZGVyU3RhZ2UgKSB7XHJcblxyXG5cdFx0aWYgKCBzaGFkZXJTdGFnZSA9PT0gJ2ZyYWdtZW50JyApIHtcclxuXHJcblx0XHRcdGlmICggZGVwdGhTbmlwcGV0ICkge1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gYHRleHR1cmVTYW1wbGUoICR7IHRleHR1cmVQcm9wZXJ0eSB9LCAkeyB0ZXh0dXJlUHJvcGVydHkgfV9zYW1wbGVyLCAkeyB1dlNuaXBwZXQgfSwgJHsgZGVwdGhTbmlwcGV0IH0gKWA7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gYHRleHR1cmVTYW1wbGUoICR7IHRleHR1cmVQcm9wZXJ0eSB9LCAkeyB0ZXh0dXJlUHJvcGVydHkgfV9zYW1wbGVyLCAkeyB1dlNuaXBwZXQgfSApYDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2UgaWYgKCB0aGlzLmlzRmlsdGVyZWRUZXh0dXJlKCB0ZXh0dXJlICkgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gdGhpcy5nZW5lcmF0ZUZpbHRlcmVkVGV4dHVyZSggdGV4dHVyZSwgdGV4dHVyZVByb3BlcnR5LCB1dlNuaXBwZXQgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0cmV0dXJuIHRoaXMuZ2VuZXJhdGVUZXh0dXJlTG9kKCB0ZXh0dXJlLCB0ZXh0dXJlUHJvcGVydHksIHV2U25pcHBldCwgZGVwdGhTbmlwcGV0LCAnMCcgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2VuZXJhdGVzIHRoZSBXR1NMIHNuaXBwZXQgd2hlbiBzYW1wbGluZyB2aWRlbyB0ZXh0dXJlcy5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHRleHR1cmVQcm9wZXJ0eSAtIFRoZSBuYW1lIG9mIHRoZSB2aWRlbyB0ZXh0dXJlIHVuaWZvcm0gaW4gdGhlIHNoYWRlci5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdXZTbmlwcGV0IC0gQSBXR1NMIHNuaXBwZXQgdGhhdCByZXByZXNlbnRzIHRleHR1cmUgY29vcmRpbmF0ZXMgdXNlZCBmb3Igc2FtcGxpbmcuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtzaGFkZXJTdGFnZT10aGlzLnNoYWRlclN0YWdlXSAtIFRoZSBzaGFkZXIgc3RhZ2UgdGhpcyBjb2RlIHNuaXBwZXQgaXMgZ2VuZXJhdGVkIGZvci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBXR1NMIHNuaXBwZXQuXHJcblx0ICovXHJcblx0X2dlbmVyYXRlVmlkZW9TYW1wbGUoIHRleHR1cmVQcm9wZXJ0eSwgdXZTbmlwcGV0LCBzaGFkZXJTdGFnZSA9IHRoaXMuc2hhZGVyU3RhZ2UgKSB7XHJcblxyXG5cdFx0aWYgKCBzaGFkZXJTdGFnZSA9PT0gJ2ZyYWdtZW50JyApIHtcclxuXHJcblx0XHRcdHJldHVybiBgdGV4dHVyZVNhbXBsZUJhc2VDbGFtcFRvRWRnZSggJHsgdGV4dHVyZVByb3BlcnR5IH0sICR7IHRleHR1cmVQcm9wZXJ0eSB9X3NhbXBsZXIsIHZlYzI8ZjMyPiggJHsgdXZTbmlwcGV0IH0ueCwgMS4wIC0gJHsgdXZTbmlwcGV0IH0ueSApIClgO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLmVycm9yKCBgV2ViR1BVUmVuZGVyZXI6IFRIUkVFLlZpZGVvVGV4dHVyZSBkb2VzIG5vdCBzdXBwb3J0ICR7IHNoYWRlclN0YWdlIH0gc2hhZGVyLmAgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2VuZXJhdGVzIHRoZSBXR1NMIHNuaXBwZXQgd2hlbiBzYW1wbGluZyB0ZXh0dXJlcyB3aXRoIGV4cGxpY2l0IG1pcCBsZXZlbC5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHRleHR1cmVQcm9wZXJ0eSAtIFRoZSBuYW1lIG9mIHRoZSB0ZXh0dXJlIHVuaWZvcm0gaW4gdGhlIHNoYWRlci5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdXZTbmlwcGV0IC0gQSBXR1NMIHNuaXBwZXQgdGhhdCByZXByZXNlbnRzIHRleHR1cmUgY29vcmRpbmF0ZXMgdXNlZCBmb3Igc2FtcGxpbmcuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGxldmVsU25pcHBldCAtIEEgV0dTTCBzbmlwcGV0IHRoYXQgcmVwcmVzZW50cyB0aGUgbWlwIGxldmVsLCB3aXRoIGxldmVsIDAgY29udGFpbmluZyBhIGZ1bGwgc2l6ZSB2ZXJzaW9uIG9mIHRoZSB0ZXh0dXJlLlxyXG5cdCAqIEBwYXJhbSB7P3N0cmluZ30gZGVwdGhTbmlwcGV0IC0gQSBXR1NMIHNuaXBwZXQgdGhhdCByZXByZXNlbnRzIDAtYmFzZWQgdGV4dHVyZSBhcnJheSBpbmRleCB0byBzYW1wbGUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtzaGFkZXJTdGFnZT10aGlzLnNoYWRlclN0YWdlXSAtIFRoZSBzaGFkZXIgc3RhZ2UgdGhpcyBjb2RlIHNuaXBwZXQgaXMgZ2VuZXJhdGVkIGZvci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBXR1NMIHNuaXBwZXQuXHJcblx0ICovXHJcblx0X2dlbmVyYXRlVGV4dHVyZVNhbXBsZUxldmVsKCB0ZXh0dXJlLCB0ZXh0dXJlUHJvcGVydHksIHV2U25pcHBldCwgbGV2ZWxTbmlwcGV0LCBkZXB0aFNuaXBwZXQsIHNoYWRlclN0YWdlID0gdGhpcy5zaGFkZXJTdGFnZSApIHtcclxuXHJcblx0XHRpZiAoICggc2hhZGVyU3RhZ2UgPT09ICdmcmFnbWVudCcgfHwgc2hhZGVyU3RhZ2UgPT09ICdjb21wdXRlJyApICYmIHRoaXMuaXNVbmZpbHRlcmFibGUoIHRleHR1cmUgKSA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gYHRleHR1cmVTYW1wbGVMZXZlbCggJHsgdGV4dHVyZVByb3BlcnR5IH0sICR7IHRleHR1cmVQcm9wZXJ0eSB9X3NhbXBsZXIsICR7IHV2U25pcHBldCB9LCAkeyBsZXZlbFNuaXBwZXQgfSApYDtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCB0aGlzLmlzRmlsdGVyZWRUZXh0dXJlKCB0ZXh0dXJlICkgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gdGhpcy5nZW5lcmF0ZUZpbHRlcmVkVGV4dHVyZSggdGV4dHVyZSwgdGV4dHVyZVByb3BlcnR5LCB1dlNuaXBwZXQsIGxldmVsU25pcHBldCApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gdGhpcy5nZW5lcmF0ZVRleHR1cmVMb2QoIHRleHR1cmUsIHRleHR1cmVQcm9wZXJ0eSwgdXZTbmlwcGV0LCBkZXB0aFNuaXBwZXQsIGxldmVsU25pcHBldCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZW5lcmF0ZXMgYSB3cmFwIGZ1bmN0aW9uIHVzZWQgaW4gY29udGV4dCBvZiB0ZXh0dXJlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlIHRvIGdlbmVyYXRlIHRoZSBmdW5jdGlvbiBmb3IuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIGZ1bmN0aW9uLlxyXG5cdCAqL1xyXG5cdGdlbmVyYXRlV3JhcEZ1bmN0aW9uKCB0ZXh0dXJlICkge1xyXG5cclxuXHRcdGNvbnN0IGZ1bmN0aW9uTmFtZSA9IGB0c2xfY29vcmRfJHsgd3JhcE5hbWVzWyB0ZXh0dXJlLndyYXBTIF0gfVNfJHsgd3JhcE5hbWVzWyB0ZXh0dXJlLndyYXBUIF0gfV8keyB0ZXh0dXJlLmlzRGF0YTNEVGV4dHVyZSA/ICczZCcgOiAnMmQnIH1UYDtcclxuXHJcblx0XHRsZXQgbm9kZUNvZGUgPSB3Z3NsQ29kZUNhY2hlWyBmdW5jdGlvbk5hbWUgXTtcclxuXHJcblx0XHRpZiAoIG5vZGVDb2RlID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBpbmNsdWRlcyA9IFtdO1xyXG5cclxuXHRcdFx0Ly8gRm9yIDNEIHRleHR1cmVzLCB1c2UgdmVjM2Y7IGZvciB0ZXh0dXJlIGFycmF5cywga2VlcCB2ZWMyZiBzaW5jZSBhcnJheSBpbmRleCBpcyBzZXBhcmF0ZVxyXG5cdFx0XHRjb25zdCBjb29yZFR5cGUgPSB0ZXh0dXJlLmlzRGF0YTNEVGV4dHVyZSA/ICd2ZWMzZicgOiAndmVjMmYnO1xyXG5cdFx0XHRsZXQgY29kZSA9IGBmbiAkeyBmdW5jdGlvbk5hbWUgfSggY29vcmQgOiAkeyBjb29yZFR5cGUgfSApIC0+ICR7IGNvb3JkVHlwZSB9IHtcXG5cXG5cXHRyZXR1cm4gJHsgY29vcmRUeXBlIH0oXFxuYDtcclxuXHJcblx0XHRcdGNvbnN0IGFkZFdyYXBTbmlwcGV0ID0gKCB3cmFwLCBheGlzICkgPT4ge1xyXG5cclxuXHRcdFx0XHRpZiAoIHdyYXAgPT09IFJlcGVhdFdyYXBwaW5nICkge1xyXG5cclxuXHRcdFx0XHRcdGluY2x1ZGVzLnB1c2goIHdnc2xQb2x5ZmlsbC5yZXBlYXRXcmFwcGluZ19mbG9hdCApO1xyXG5cclxuXHRcdFx0XHRcdGNvZGUgKz0gYFxcdFxcdHRzbF9yZXBlYXRXcmFwcGluZ19mbG9hdCggY29vcmQuJHsgYXhpcyB9IClgO1xyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCB3cmFwID09PSBDbGFtcFRvRWRnZVdyYXBwaW5nICkge1xyXG5cclxuXHRcdFx0XHRcdGluY2x1ZGVzLnB1c2goIHdnc2xQb2x5ZmlsbC5jbGFtcFdyYXBwaW5nX2Zsb2F0ICk7XHJcblxyXG5cdFx0XHRcdFx0Y29kZSArPSBgXFx0XFx0dHNsX2NsYW1wV3JhcHBpbmdfZmxvYXQoIGNvb3JkLiR7IGF4aXMgfSApYDtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggd3JhcCA9PT0gTWlycm9yZWRSZXBlYXRXcmFwcGluZyApIHtcclxuXHJcblx0XHRcdFx0XHRpbmNsdWRlcy5wdXNoKCB3Z3NsUG9seWZpbGwubWlycm9yV3JhcHBpbmdfZmxvYXQgKTtcclxuXHJcblx0XHRcdFx0XHRjb2RlICs9IGBcXHRcXHR0c2xfbWlycm9yV3JhcHBpbmdfZmxvYXQoIGNvb3JkLiR7IGF4aXMgfSApYDtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRjb2RlICs9IGBcXHRcXHRjb29yZC4keyBheGlzIH1gO1xyXG5cclxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggYFdlYkdQVVJlbmRlcmVyOiBVbnN1cHBvcnRlZCB0ZXh0dXJlIHdyYXAgdHlwZSBcIiR7IHdyYXAgfVwiIGZvciB2ZXJ0ZXggc2hhZGVyLmAgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fTtcclxuXHJcblx0XHRcdGFkZFdyYXBTbmlwcGV0KCB0ZXh0dXJlLndyYXBTLCAneCcgKTtcclxuXHJcblx0XHRcdGNvZGUgKz0gJyxcXG4nO1xyXG5cclxuXHRcdFx0YWRkV3JhcFNuaXBwZXQoIHRleHR1cmUud3JhcFQsICd5JyApO1xyXG5cclxuXHRcdFx0aWYgKCB0ZXh0dXJlLmlzRGF0YTNEVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0Y29kZSArPSAnLFxcbic7XHJcblx0XHRcdFx0YWRkV3JhcFNuaXBwZXQoIHRleHR1cmUud3JhcFIsICd6JyApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29kZSArPSAnXFxuXFx0KTtcXG5cXG59XFxuJztcclxuXHJcblx0XHRcdHdnc2xDb2RlQ2FjaGVbIGZ1bmN0aW9uTmFtZSBdID0gbm9kZUNvZGUgPSBuZXcgQ29kZU5vZGUoIGNvZGUsIGluY2x1ZGVzICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdG5vZGVDb2RlLmJ1aWxkKCB0aGlzICk7XHJcblxyXG5cdFx0cmV0dXJuIGZ1bmN0aW9uTmFtZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZW5lcmF0ZXMgdGhlIGFycmF5IGRlY2xhcmF0aW9uIHN0cmluZy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIHR5cGUuXHJcblx0ICogQHBhcmFtIHs/bnVtYmVyfSBbY291bnRdIC0gVGhlIGNvdW50LlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGdlbmVyYXRlZCB2YWx1ZSBhcyBhIHNoYWRlciBzdHJpbmcuXHJcblx0ICovXHJcblx0Z2VuZXJhdGVBcnJheURlY2xhcmF0aW9uKCB0eXBlLCBjb3VudCApIHtcclxuXHJcblx0XHRyZXR1cm4gYGFycmF5PCAkeyB0aGlzLmdldFR5cGUoIHR5cGUgKSB9LCAkeyBjb3VudCB9ID5gO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyBhIFdHU0wgdmFyaWFibGUgdGhhdCBob2xkcyB0aGUgdGV4dHVyZSBkaW1lbnNpb24gb2YgdGhlIGdpdmVuIHRleHR1cmUuXHJcblx0ICogSXQgYWxzbyByZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBudW1iZXIgb2YgbGF5ZXJzIChlbGVtZW50cykgb2YgYW4gYXJyYXllZFxyXG5cdCAqIHRleHR1cmUgYXMgd2VsbCBhcyB0aGUgY3ViZSBmYWNlIGNvdW50IG9mIGN1YmUgdGV4dHVyZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZSB0byBnZW5lcmF0ZSB0aGUgZnVuY3Rpb24gZm9yLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0dXJlUHJvcGVydHkgLSBUaGUgbmFtZSBvZiB0aGUgdmlkZW8gdGV4dHVyZSB1bmlmb3JtIGluIHRoZSBzaGFkZXIuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGxldmVsU25pcHBldCAtIEEgV0dTTCBzbmlwcGV0IHRoYXQgcmVwcmVzZW50cyB0aGUgbWlwIGxldmVsLCB3aXRoIGxldmVsIDAgY29udGFpbmluZyBhIGZ1bGwgc2l6ZSB2ZXJzaW9uIG9mIHRoZSB0ZXh0dXJlLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG5hbWUgb2YgdGhlIGRpbWVuc2lvbiB2YXJpYWJsZS5cclxuXHQgKi9cclxuXHRnZW5lcmF0ZVRleHR1cmVEaW1lbnNpb24oIHRleHR1cmUsIHRleHR1cmVQcm9wZXJ0eSwgbGV2ZWxTbmlwcGV0ICkge1xyXG5cclxuXHRcdGNvbnN0IHRleHR1cmVEYXRhID0gdGhpcy5nZXREYXRhRnJvbU5vZGUoIHRleHR1cmUsIHRoaXMuc2hhZGVyU3RhZ2UsIHRoaXMuZ2xvYmFsQ2FjaGUgKTtcclxuXHJcblx0XHRpZiAoIHRleHR1cmVEYXRhLmRpbWVuc2lvbnNTbmlwcGV0ID09PSB1bmRlZmluZWQgKSB0ZXh0dXJlRGF0YS5kaW1lbnNpb25zU25pcHBldCA9IHt9O1xyXG5cclxuXHRcdGxldCB0ZXh0dXJlRGltZW5zaW9uTm9kZSA9IHRleHR1cmVEYXRhLmRpbWVuc2lvbnNTbmlwcGV0WyBsZXZlbFNuaXBwZXQgXTtcclxuXHJcblx0XHRpZiAoIHRleHR1cmVEYXRhLmRpbWVuc2lvbnNTbmlwcGV0WyBsZXZlbFNuaXBwZXQgXSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0bGV0IHRleHR1cmVEaW1lbnNpb25zUGFyYW1zO1xyXG5cdFx0XHRsZXQgZGltZW5zaW9uVHlwZTtcclxuXHJcblx0XHRcdGNvbnN0IHsgcHJpbWFyeVNhbXBsZXMgfSA9IHRoaXMucmVuZGVyZXIuYmFja2VuZC51dGlscy5nZXRUZXh0dXJlU2FtcGxlRGF0YSggdGV4dHVyZSApO1xyXG5cdFx0XHRjb25zdCBpc011bHRpc2FtcGxlZCA9IHByaW1hcnlTYW1wbGVzID4gMTtcclxuXHJcblx0XHRcdGlmICggdGV4dHVyZS5pc0RhdGEzRFRleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRcdGRpbWVuc2lvblR5cGUgPSAndmVjMzx1MzI+JztcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdC8vIFJlZ3VsYXIgMkQgdGV4dHVyZXMsIGRlcHRoIHRleHR1cmVzLCBldGMuXHJcblx0XHRcdFx0ZGltZW5zaW9uVHlwZSA9ICd2ZWMyPHUzMj4nO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gQnVpbGQgcGFyYW1ldGVycyBzdHJpbmcgYmFzZWQgb24gdGV4dHVyZSB0eXBlIGFuZCBtdWx0aXNhbXBsaW5nXHJcblx0XHRcdGlmICggaXNNdWx0aXNhbXBsZWQgfHwgdGV4dHVyZS5pc1ZpZGVvVGV4dHVyZSB8fCB0ZXh0dXJlLmlzU3RvcmFnZVRleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRcdHRleHR1cmVEaW1lbnNpb25zUGFyYW1zID0gdGV4dHVyZVByb3BlcnR5O1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0dGV4dHVyZURpbWVuc2lvbnNQYXJhbXMgPSBgJHt0ZXh0dXJlUHJvcGVydHl9JHtsZXZlbFNuaXBwZXQgPyBgLCB1MzIoICR7IGxldmVsU25pcHBldCB9IClgIDogJyd9YDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRleHR1cmVEaW1lbnNpb25Ob2RlID0gbmV3IFZhck5vZGUoIG5ldyBFeHByZXNzaW9uTm9kZSggYHRleHR1cmVEaW1lbnNpb25zKCAkeyB0ZXh0dXJlRGltZW5zaW9uc1BhcmFtcyB9IClgLCBkaW1lbnNpb25UeXBlICkgKTtcclxuXHJcblx0XHRcdHRleHR1cmVEYXRhLmRpbWVuc2lvbnNTbmlwcGV0WyBsZXZlbFNuaXBwZXQgXSA9IHRleHR1cmVEaW1lbnNpb25Ob2RlO1xyXG5cclxuXHRcdFx0aWYgKCB0ZXh0dXJlLmlzRGF0YUFycmF5VGV4dHVyZSB8fCB0ZXh0dXJlLmlzRGF0YTNEVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0dGV4dHVyZURhdGEuYXJyYXlMYXllckNvdW50ID0gbmV3IFZhck5vZGUoXHJcblx0XHRcdFx0XHRuZXcgRXhwcmVzc2lvbk5vZGUoXHJcblx0XHRcdFx0XHRcdGB0ZXh0dXJlTnVtTGF5ZXJzKCR7dGV4dHVyZVByb3BlcnR5fSlgLFxyXG5cdFx0XHRcdFx0XHQndTMyJ1xyXG5cdFx0XHRcdFx0KVxyXG5cdFx0XHRcdCk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBGb3IgY3ViZSB0ZXh0dXJlcywgd2Uga25vdyBpdCdzIGFsd2F5cyA2IGZhY2VzXHJcblx0XHRcdGlmICggdGV4dHVyZS5pc1RleHR1cmVDdWJlICkge1xyXG5cclxuXHRcdFx0XHR0ZXh0dXJlRGF0YS5jdWJlRmFjZUNvdW50ID0gbmV3IFZhck5vZGUoXHJcblx0XHRcdFx0XHRuZXcgRXhwcmVzc2lvbk5vZGUoICc2dScsICd1MzInIClcclxuXHRcdFx0XHQpO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGV4dHVyZURpbWVuc2lvbk5vZGUuYnVpbGQoIHRoaXMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZW5lcmF0ZXMgdGhlIFdHU0wgc25pcHBldCBmb3IgYSBtYW51YWwgZmlsdGVyZWQgdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0dXJlUHJvcGVydHkgLSBUaGUgbmFtZSBvZiB0aGUgdGV4dHVyZSB1bmlmb3JtIGluIHRoZSBzaGFkZXIuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHV2U25pcHBldCAtIEEgV0dTTCBzbmlwcGV0IHRoYXQgcmVwcmVzZW50cyB0ZXh0dXJlIGNvb3JkaW5hdGVzIHVzZWQgZm9yIHNhbXBsaW5nLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBsZXZlbFNuaXBwZXQgLSBBIFdHU0wgc25pcHBldCB0aGF0IHJlcHJlc2VudHMgdGhlIG1pcCBsZXZlbCwgd2l0aCBsZXZlbCAwIGNvbnRhaW5pbmcgYSBmdWxsIHNpemUgdmVyc2lvbiBvZiB0aGUgdGV4dHVyZS5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBXR1NMIHNuaXBwZXQuXHJcblx0ICovXHJcblx0Z2VuZXJhdGVGaWx0ZXJlZFRleHR1cmUoIHRleHR1cmUsIHRleHR1cmVQcm9wZXJ0eSwgdXZTbmlwcGV0LCBsZXZlbFNuaXBwZXQgPSAnMHUnICkge1xyXG5cclxuXHRcdHRoaXMuX2luY2x1ZGUoICdiaXF1YWRyYXRpY1RleHR1cmUnICk7XHJcblxyXG5cdFx0Y29uc3Qgd3JhcEZ1bmN0aW9uID0gdGhpcy5nZW5lcmF0ZVdyYXBGdW5jdGlvbiggdGV4dHVyZSApO1xyXG5cdFx0Y29uc3QgdGV4dHVyZURpbWVuc2lvbiA9IHRoaXMuZ2VuZXJhdGVUZXh0dXJlRGltZW5zaW9uKCB0ZXh0dXJlLCB0ZXh0dXJlUHJvcGVydHksIGxldmVsU25pcHBldCApO1xyXG5cclxuXHRcdHJldHVybiBgdHNsX2JpcXVhZHJhdGljVGV4dHVyZSggJHsgdGV4dHVyZVByb3BlcnR5IH0sICR7IHdyYXBGdW5jdGlvbiB9KCAkeyB1dlNuaXBwZXQgfSApLCAkeyB0ZXh0dXJlRGltZW5zaW9uIH0sIHUzMiggJHsgbGV2ZWxTbmlwcGV0IH0gKSApYDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZW5lcmF0ZXMgdGhlIFdHU0wgc25pcHBldCBmb3IgYSB0ZXh0dXJlIGxvb2t1cCB3aXRoIGV4cGxpY2l0IGxldmVsLW9mLWRldGFpbC5cclxuXHQgKiBTaW5jZSBpdCdzIGEgbG9va3VwLCBubyBzYW1wbGluZyBvciBmaWx0ZXJpbmcgaXMgYXBwbGllZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0dXJlUHJvcGVydHkgLSBUaGUgbmFtZSBvZiB0aGUgdGV4dHVyZSB1bmlmb3JtIGluIHRoZSBzaGFkZXIuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHV2U25pcHBldCAtIEEgV0dTTCBzbmlwcGV0IHRoYXQgcmVwcmVzZW50cyB0ZXh0dXJlIGNvb3JkaW5hdGVzIHVzZWQgZm9yIHNhbXBsaW5nLlxyXG5cdCAqIEBwYXJhbSB7P3N0cmluZ30gZGVwdGhTbmlwcGV0IC0gQSBXR1NMIHNuaXBwZXQgdGhhdCByZXByZXNlbnRzIDAtYmFzZWQgdGV4dHVyZSBhcnJheSBpbmRleCB0byBzYW1wbGUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtsZXZlbFNuaXBwZXQ9JzB1J10gLSBBIFdHU0wgc25pcHBldCB0aGF0IHJlcHJlc2VudHMgdGhlIG1pcCBsZXZlbCwgd2l0aCBsZXZlbCAwIGNvbnRhaW5pbmcgYSBmdWxsIHNpemUgdmVyc2lvbiBvZiB0aGUgdGV4dHVyZS5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBXR1NMIHNuaXBwZXQuXHJcblx0ICovXHJcblx0Z2VuZXJhdGVUZXh0dXJlTG9kKCB0ZXh0dXJlLCB0ZXh0dXJlUHJvcGVydHksIHV2U25pcHBldCwgZGVwdGhTbmlwcGV0LCBsZXZlbFNuaXBwZXQgPSAnMHUnICkge1xyXG5cclxuXHRcdGNvbnN0IHdyYXBGdW5jdGlvbiA9IHRoaXMuZ2VuZXJhdGVXcmFwRnVuY3Rpb24oIHRleHR1cmUgKTtcclxuXHRcdGNvbnN0IHRleHR1cmVEaW1lbnNpb24gPSB0aGlzLmdlbmVyYXRlVGV4dHVyZURpbWVuc2lvbiggdGV4dHVyZSwgdGV4dHVyZVByb3BlcnR5LCBsZXZlbFNuaXBwZXQgKTtcclxuXHJcblx0XHRjb25zdCB2ZWNUeXBlID0gdGV4dHVyZS5pc0RhdGEzRFRleHR1cmUgPyAndmVjMycgOiAndmVjMic7XHJcblx0XHRjb25zdCBjb29yZFNuaXBwZXQgPSBgJHsgdmVjVHlwZSB9PHUzMj4oJHsgd3JhcEZ1bmN0aW9uIH0oJHsgdXZTbmlwcGV0IH0pICogJHsgdmVjVHlwZSB9PGYzMj4oJHsgdGV4dHVyZURpbWVuc2lvbiB9KSlgO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmdlbmVyYXRlVGV4dHVyZUxvYWQoIHRleHR1cmUsIHRleHR1cmVQcm9wZXJ0eSwgY29vcmRTbmlwcGV0LCBkZXB0aFNuaXBwZXQsIGxldmVsU25pcHBldCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyB0aGUgV0dTTCBzbmlwcGV0IHRoYXQgcmVhZHMgYSBzaW5nbGUgdGV4ZWwgZnJvbSBhIHRleHR1cmUgd2l0aG91dCBzYW1wbGluZyBvciBmaWx0ZXJpbmcuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdGV4dHVyZVByb3BlcnR5IC0gVGhlIG5hbWUgb2YgdGhlIHRleHR1cmUgdW5pZm9ybSBpbiB0aGUgc2hhZGVyLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB1dkluZGV4U25pcHBldCAtIEEgV0dTTCBzbmlwcGV0IHRoYXQgcmVwcmVzZW50cyB0ZXh0dXJlIGNvb3JkaW5hdGVzIHVzZWQgZm9yIHNhbXBsaW5nLlxyXG5cdCAqIEBwYXJhbSB7P3N0cmluZ30gZGVwdGhTbmlwcGV0IC0gQSBXR1NMIHNuaXBwZXQgdGhhdCByZXByZXNlbnRzIDAtYmFzZWQgdGV4dHVyZSBhcnJheSBpbmRleCB0byBzYW1wbGUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtsZXZlbFNuaXBwZXQ9JzB1J10gLSBBIFdHU0wgc25pcHBldCB0aGF0IHJlcHJlc2VudHMgdGhlIG1pcCBsZXZlbCwgd2l0aCBsZXZlbCAwIGNvbnRhaW5pbmcgYSBmdWxsIHNpemUgdmVyc2lvbiBvZiB0aGUgdGV4dHVyZS5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBXR1NMIHNuaXBwZXQuXHJcblx0ICovXHJcblx0Z2VuZXJhdGVUZXh0dXJlTG9hZCggdGV4dHVyZSwgdGV4dHVyZVByb3BlcnR5LCB1dkluZGV4U25pcHBldCwgZGVwdGhTbmlwcGV0LCBsZXZlbFNuaXBwZXQgPSAnMHUnICkge1xyXG5cclxuXHRcdGlmICggdGV4dHVyZS5pc1ZpZGVvVGV4dHVyZSA9PT0gdHJ1ZSB8fCB0ZXh0dXJlLmlzU3RvcmFnZVRleHR1cmUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gYHRleHR1cmVMb2FkKCAkeyB0ZXh0dXJlUHJvcGVydHkgfSwgJHsgdXZJbmRleFNuaXBwZXQgfSApYDtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBkZXB0aFNuaXBwZXQgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gYHRleHR1cmVMb2FkKCAkeyB0ZXh0dXJlUHJvcGVydHkgfSwgJHsgdXZJbmRleFNuaXBwZXQgfSwgJHsgZGVwdGhTbmlwcGV0IH0sIHUzMiggJHsgbGV2ZWxTbmlwcGV0IH0gKSApYDtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0cmV0dXJuIGB0ZXh0dXJlTG9hZCggJHsgdGV4dHVyZVByb3BlcnR5IH0sICR7IHV2SW5kZXhTbmlwcGV0IH0sIHUzMiggJHsgbGV2ZWxTbmlwcGV0IH0gKSApYDtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2VuZXJhdGVzIHRoZSBXR1NMIHNuaXBwZXQgdGhhdCB3cml0ZXMgYSBzaW5nbGUgdGV4ZWwgdG8gYSB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHRleHR1cmVQcm9wZXJ0eSAtIFRoZSBuYW1lIG9mIHRoZSB0ZXh0dXJlIHVuaWZvcm0gaW4gdGhlIHNoYWRlci5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdXZJbmRleFNuaXBwZXQgLSBBIFdHU0wgc25pcHBldCB0aGF0IHJlcHJlc2VudHMgdGV4dHVyZSBjb29yZGluYXRlcyB1c2VkIGZvciBzYW1wbGluZy5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVTbmlwcGV0IC0gQSBXR1NMIHNuaXBwZXQgdGhhdCByZXByZXNlbnQgdGhlIG5ldyB0ZXhlbCB2YWx1ZS5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBXR1NMIHNuaXBwZXQuXHJcblx0ICovXHJcblx0Z2VuZXJhdGVUZXh0dXJlU3RvcmUoIHRleHR1cmUsIHRleHR1cmVQcm9wZXJ0eSwgdXZJbmRleFNuaXBwZXQsIHZhbHVlU25pcHBldCApIHtcclxuXHJcblx0XHRyZXR1cm4gYHRleHR1cmVTdG9yZSggJHsgdGV4dHVyZVByb3BlcnR5IH0sICR7IHV2SW5kZXhTbmlwcGV0IH0sICR7IHZhbHVlU25pcHBldCB9IClgO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBzYW1wbGVkIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gdGV4dHVyZSBzaG91bGQgYmUgY29tcGFyZWQgYWdhaW5zdCBhIHJlZmVyZW5jZSB2YWx1ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlLlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHNhbXBsZWQgdmFsdWVzIG9mIHRoZSBnaXZlbiB0ZXh0dXJlIHNob3VsZCBiZSBjb21wYXJlZCBhZ2FpbnN0IGEgcmVmZXJlbmNlIHZhbHVlIG9yIG5vdC5cclxuXHQgKi9cclxuXHRpc1NhbXBsZUNvbXBhcmUoIHRleHR1cmUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRleHR1cmUuaXNEZXB0aFRleHR1cmUgPT09IHRydWUgJiYgdGV4dHVyZS5jb21wYXJlRnVuY3Rpb24gIT09IG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIHRleHR1cmUgaXMgdW5maWx0ZXJhYmxlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZ2l2ZW4gdGV4dHVyZSBpcyB1bmZpbHRlcmFibGUgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGlzVW5maWx0ZXJhYmxlKCB0ZXh0dXJlICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmdldENvbXBvbmVudFR5cGVGcm9tVGV4dHVyZSggdGV4dHVyZSApICE9PSAnZmxvYXQnIHx8XHJcblx0XHRcdCggISB0aGlzLmlzQXZhaWxhYmxlKCAnZmxvYXQzMkZpbHRlcmFibGUnICkgJiYgdGV4dHVyZS5pc0RhdGFUZXh0dXJlID09PSB0cnVlICYmIHRleHR1cmUudHlwZSA9PT0gRmxvYXRUeXBlICkgfHxcclxuXHRcdFx0KCB0aGlzLmlzU2FtcGxlQ29tcGFyZSggdGV4dHVyZSApID09PSBmYWxzZSAmJiB0ZXh0dXJlLm1pbkZpbHRlciA9PT0gTmVhcmVzdEZpbHRlciAmJiB0ZXh0dXJlLm1hZ0ZpbHRlciA9PT0gTmVhcmVzdEZpbHRlciApIHx8XHJcblx0XHRcdHRoaXMucmVuZGVyZXIuYmFja2VuZC51dGlscy5nZXRUZXh0dXJlU2FtcGxlRGF0YSggdGV4dHVyZSApLnByaW1hcnlTYW1wbGVzID4gMTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZW5lcmF0ZXMgdGhlIFdHU0wgc25pcHBldCBmb3Igc2FtcGxpbmcvbG9hZGluZyB0aGUgZ2l2ZW4gdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0dXJlUHJvcGVydHkgLSBUaGUgbmFtZSBvZiB0aGUgdGV4dHVyZSB1bmlmb3JtIGluIHRoZSBzaGFkZXIuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHV2U25pcHBldCAtIEEgV0dTTCBzbmlwcGV0IHRoYXQgcmVwcmVzZW50cyB0ZXh0dXJlIGNvb3JkaW5hdGVzIHVzZWQgZm9yIHNhbXBsaW5nLlxyXG5cdCAqIEBwYXJhbSB7P3N0cmluZ30gZGVwdGhTbmlwcGV0IC0gQSBXR1NMIHNuaXBwZXQgdGhhdCByZXByZXNlbnRzIDAtYmFzZWQgdGV4dHVyZSBhcnJheSBpbmRleCB0byBzYW1wbGUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtzaGFkZXJTdGFnZT10aGlzLnNoYWRlclN0YWdlXSAtIFRoZSBzaGFkZXIgc3RhZ2UgdGhpcyBjb2RlIHNuaXBwZXQgaXMgZ2VuZXJhdGVkIGZvci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBXR1NMIHNuaXBwZXQuXHJcblx0ICovXHJcblx0Z2VuZXJhdGVUZXh0dXJlKCB0ZXh0dXJlLCB0ZXh0dXJlUHJvcGVydHksIHV2U25pcHBldCwgZGVwdGhTbmlwcGV0LCBzaGFkZXJTdGFnZSA9IHRoaXMuc2hhZGVyU3RhZ2UgKSB7XHJcblxyXG5cdFx0bGV0IHNuaXBwZXQgPSBudWxsO1xyXG5cclxuXHRcdGlmICggdGV4dHVyZS5pc1ZpZGVvVGV4dHVyZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdHNuaXBwZXQgPSB0aGlzLl9nZW5lcmF0ZVZpZGVvU2FtcGxlKCB0ZXh0dXJlUHJvcGVydHksIHV2U25pcHBldCwgc2hhZGVyU3RhZ2UgKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCB0aGlzLmlzVW5maWx0ZXJhYmxlKCB0ZXh0dXJlICkgKSB7XHJcblxyXG5cdFx0XHRzbmlwcGV0ID0gdGhpcy5nZW5lcmF0ZVRleHR1cmVMb2QoIHRleHR1cmUsIHRleHR1cmVQcm9wZXJ0eSwgdXZTbmlwcGV0LCBkZXB0aFNuaXBwZXQsICcwJywgc2hhZGVyU3RhZ2UgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0c25pcHBldCA9IHRoaXMuX2dlbmVyYXRlVGV4dHVyZVNhbXBsZSggdGV4dHVyZSwgdGV4dHVyZVByb3BlcnR5LCB1dlNuaXBwZXQsIGRlcHRoU25pcHBldCwgc2hhZGVyU3RhZ2UgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHNuaXBwZXQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2VuZXJhdGVzIHRoZSBXR1NMIHNuaXBwZXQgZm9yIHNhbXBsaW5nL2xvYWRpbmcgdGhlIGdpdmVuIHRleHR1cmUgdXNpbmcgZXhwbGljaXQgZ3JhZGllbnRzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHRleHR1cmVQcm9wZXJ0eSAtIFRoZSBuYW1lIG9mIHRoZSB0ZXh0dXJlIHVuaWZvcm0gaW4gdGhlIHNoYWRlci5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdXZTbmlwcGV0IC0gQSBXR1NMIHNuaXBwZXQgdGhhdCByZXByZXNlbnRzIHRleHR1cmUgY29vcmRpbmF0ZXMgdXNlZCBmb3Igc2FtcGxpbmcuXHJcblx0ICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBncmFkU25pcHBldCAtIEFuIGFycmF5IGhvbGRpbmcgYm90aCBncmFkaWVudCBXR1NMIHNuaXBwZXRzLlxyXG5cdCAqIEBwYXJhbSB7P3N0cmluZ30gZGVwdGhTbmlwcGV0IC0gQSBXR1NMIHNuaXBwZXQgdGhhdCByZXByZXNlbnRzIDAtYmFzZWQgdGV4dHVyZSBhcnJheSBpbmRleCB0byBzYW1wbGUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtzaGFkZXJTdGFnZT10aGlzLnNoYWRlclN0YWdlXSAtIFRoZSBzaGFkZXIgc3RhZ2UgdGhpcyBjb2RlIHNuaXBwZXQgaXMgZ2VuZXJhdGVkIGZvci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBXR1NMIHNuaXBwZXQuXHJcblx0ICovXHJcblx0Z2VuZXJhdGVUZXh0dXJlR3JhZCggdGV4dHVyZSwgdGV4dHVyZVByb3BlcnR5LCB1dlNuaXBwZXQsIGdyYWRTbmlwcGV0LCBkZXB0aFNuaXBwZXQsIHNoYWRlclN0YWdlID0gdGhpcy5zaGFkZXJTdGFnZSApIHtcclxuXHJcblx0XHRpZiAoIHNoYWRlclN0YWdlID09PSAnZnJhZ21lbnQnICkge1xyXG5cclxuXHRcdFx0Ly8gVE9ETyBoYW5kbGUgaTMyIG9yIHUzMiAtLT4gdXZTbmlwcGV0LCBhcnJheV9pbmRleDogQSwgZGR4LCBkZHlcclxuXHRcdFx0cmV0dXJuIGB0ZXh0dXJlU2FtcGxlR3JhZCggJHsgdGV4dHVyZVByb3BlcnR5IH0sICR7IHRleHR1cmVQcm9wZXJ0eSB9X3NhbXBsZXIsICR7IHV2U25pcHBldCB9LCAgJHsgZ3JhZFNuaXBwZXRbIDAgXSB9LCAkeyBncmFkU25pcHBldFsgMSBdIH0gKWA7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoIGBXZWJHUFVSZW5kZXJlcjogVEhSRUUuVGV4dHVyZU5vZGUuZ3JhZGllbnQoKSBkb2VzIG5vdCBzdXBwb3J0ICR7IHNoYWRlclN0YWdlIH0gc2hhZGVyLmAgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2VuZXJhdGVzIHRoZSBXR1NMIHNuaXBwZXQgZm9yIHNhbXBsaW5nIGEgZGVwdGggdGV4dHVyZSBhbmQgY29tcGFyaW5nIHRoZSBzYW1wbGVkIGRlcHRoIHZhbHVlc1xyXG5cdCAqIGFnYWluc3QgYSByZWZlcmVuY2UgdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdGV4dHVyZVByb3BlcnR5IC0gVGhlIG5hbWUgb2YgdGhlIHRleHR1cmUgdW5pZm9ybSBpbiB0aGUgc2hhZGVyLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB1dlNuaXBwZXQgLSBBIFdHU0wgc25pcHBldCB0aGF0IHJlcHJlc2VudHMgdGV4dHVyZSBjb29yZGluYXRlcyB1c2VkIGZvciBzYW1wbGluZy5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gY29tcGFyZVNuaXBwZXQgLSAgQSBXR1NMIHNuaXBwZXQgdGhhdCByZXByZXNlbnRzIHRoZSByZWZlcmVuY2UgdmFsdWUuXHJcblx0ICogQHBhcmFtIHs/c3RyaW5nfSBkZXB0aFNuaXBwZXQgLSBBIFdHU0wgc25pcHBldCB0aGF0IHJlcHJlc2VudHMgMC1iYXNlZCB0ZXh0dXJlIGFycmF5IGluZGV4IHRvIHNhbXBsZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW3NoYWRlclN0YWdlPXRoaXMuc2hhZGVyU3RhZ2VdIC0gVGhlIHNoYWRlciBzdGFnZSB0aGlzIGNvZGUgc25pcHBldCBpcyBnZW5lcmF0ZWQgZm9yLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIFdHU0wgc25pcHBldC5cclxuXHQgKi9cclxuXHRnZW5lcmF0ZVRleHR1cmVDb21wYXJlKCB0ZXh0dXJlLCB0ZXh0dXJlUHJvcGVydHksIHV2U25pcHBldCwgY29tcGFyZVNuaXBwZXQsIGRlcHRoU25pcHBldCwgc2hhZGVyU3RhZ2UgPSB0aGlzLnNoYWRlclN0YWdlICkge1xyXG5cclxuXHRcdGlmICggc2hhZGVyU3RhZ2UgPT09ICdmcmFnbWVudCcgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gYHRleHR1cmVTYW1wbGVDb21wYXJlKCAkeyB0ZXh0dXJlUHJvcGVydHkgfSwgJHsgdGV4dHVyZVByb3BlcnR5IH1fc2FtcGxlciwgJHsgdXZTbmlwcGV0IH0sICR7IGNvbXBhcmVTbmlwcGV0IH0gKWA7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoIGBXZWJHUFVSZW5kZXJlcjogVEhSRUUuRGVwdGhUZXh0dXJlLmNvbXBhcmVGdW5jdGlvbigpIGRvZXMgbm90IHN1cHBvcnQgJHsgc2hhZGVyU3RhZ2UgfSBzaGFkZXIuYCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZW5lcmF0ZXMgdGhlIFdHU0wgc25pcHBldCB3aGVuIHNhbXBsaW5nIHRleHR1cmVzIHdpdGggZXhwbGljaXQgbWlwIGxldmVsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHRleHR1cmVQcm9wZXJ0eSAtIFRoZSBuYW1lIG9mIHRoZSB0ZXh0dXJlIHVuaWZvcm0gaW4gdGhlIHNoYWRlci5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdXZTbmlwcGV0IC0gQSBXR1NMIHNuaXBwZXQgdGhhdCByZXByZXNlbnRzIHRleHR1cmUgY29vcmRpbmF0ZXMgdXNlZCBmb3Igc2FtcGxpbmcuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGxldmVsU25pcHBldCAtIEEgV0dTTCBzbmlwcGV0IHRoYXQgcmVwcmVzZW50cyB0aGUgbWlwIGxldmVsLCB3aXRoIGxldmVsIDAgY29udGFpbmluZyBhIGZ1bGwgc2l6ZSB2ZXJzaW9uIG9mIHRoZSB0ZXh0dXJlLlxyXG5cdCAqIEBwYXJhbSB7P3N0cmluZ30gZGVwdGhTbmlwcGV0IC0gQSBXR1NMIHNuaXBwZXQgdGhhdCByZXByZXNlbnRzIDAtYmFzZWQgdGV4dHVyZSBhcnJheSBpbmRleCB0byBzYW1wbGUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtzaGFkZXJTdGFnZT10aGlzLnNoYWRlclN0YWdlXSAtIFRoZSBzaGFkZXIgc3RhZ2UgdGhpcyBjb2RlIHNuaXBwZXQgaXMgZ2VuZXJhdGVkIGZvci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBXR1NMIHNuaXBwZXQuXHJcblx0ICovXHJcblx0Z2VuZXJhdGVUZXh0dXJlTGV2ZWwoIHRleHR1cmUsIHRleHR1cmVQcm9wZXJ0eSwgdXZTbmlwcGV0LCBsZXZlbFNuaXBwZXQsIGRlcHRoU25pcHBldCwgc2hhZGVyU3RhZ2UgPSB0aGlzLnNoYWRlclN0YWdlICkge1xyXG5cclxuXHRcdGxldCBzbmlwcGV0ID0gbnVsbDtcclxuXHJcblx0XHRpZiAoIHRleHR1cmUuaXNWaWRlb1RleHR1cmUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRzbmlwcGV0ID0gdGhpcy5fZ2VuZXJhdGVWaWRlb1NhbXBsZSggdGV4dHVyZVByb3BlcnR5LCB1dlNuaXBwZXQsIHNoYWRlclN0YWdlICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHNuaXBwZXQgPSB0aGlzLl9nZW5lcmF0ZVRleHR1cmVTYW1wbGVMZXZlbCggdGV4dHVyZSwgdGV4dHVyZVByb3BlcnR5LCB1dlNuaXBwZXQsIGxldmVsU25pcHBldCwgZGVwdGhTbmlwcGV0LCBzaGFkZXJTdGFnZSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gc25pcHBldDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZW5lcmF0ZXMgdGhlIFdHU0wgc25pcHBldCB3aGVuIHNhbXBsaW5nIHRleHR1cmVzIHdpdGggYSBiaWFzIHRvIHRoZSBtaXAgbGV2ZWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdGV4dHVyZVByb3BlcnR5IC0gVGhlIG5hbWUgb2YgdGhlIHRleHR1cmUgdW5pZm9ybSBpbiB0aGUgc2hhZGVyLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB1dlNuaXBwZXQgLSBBIFdHU0wgc25pcHBldCB0aGF0IHJlcHJlc2VudHMgdGV4dHVyZSBjb29yZGluYXRlcyB1c2VkIGZvciBzYW1wbGluZy5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gYmlhc1NuaXBwZXQgLSBBIFdHU0wgc25pcHBldCB0aGF0IHJlcHJlc2VudHMgdGhlIGJpYXMgdG8gYXBwbHkgdG8gdGhlIG1pcCBsZXZlbCBiZWZvcmUgc2FtcGxpbmcuXHJcblx0ICogQHBhcmFtIHs/c3RyaW5nfSBkZXB0aFNuaXBwZXQgLSBBIFdHU0wgc25pcHBldCB0aGF0IHJlcHJlc2VudHMgMC1iYXNlZCB0ZXh0dXJlIGFycmF5IGluZGV4IHRvIHNhbXBsZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW3NoYWRlclN0YWdlPXRoaXMuc2hhZGVyU3RhZ2VdIC0gVGhlIHNoYWRlciBzdGFnZSB0aGlzIGNvZGUgc25pcHBldCBpcyBnZW5lcmF0ZWQgZm9yLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIFdHU0wgc25pcHBldC5cclxuXHQgKi9cclxuXHRnZW5lcmF0ZVRleHR1cmVCaWFzKCB0ZXh0dXJlLCB0ZXh0dXJlUHJvcGVydHksIHV2U25pcHBldCwgYmlhc1NuaXBwZXQsIGRlcHRoU25pcHBldCwgc2hhZGVyU3RhZ2UgPSB0aGlzLnNoYWRlclN0YWdlICkge1xyXG5cclxuXHRcdGlmICggc2hhZGVyU3RhZ2UgPT09ICdmcmFnbWVudCcgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gYHRleHR1cmVTYW1wbGVCaWFzKCAkeyB0ZXh0dXJlUHJvcGVydHkgfSwgJHsgdGV4dHVyZVByb3BlcnR5IH1fc2FtcGxlciwgJHsgdXZTbmlwcGV0IH0sICR7IGJpYXNTbmlwcGV0IH0gKWA7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoIGBXZWJHUFVSZW5kZXJlcjogVEhSRUUuVGV4dHVyZU5vZGUuYmlhc05vZGUgZG9lcyBub3Qgc3VwcG9ydCAkeyBzaGFkZXJTdGFnZSB9IHNoYWRlci5gICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBXR1NMIHNuaXBwZXQgdGhhdCByZXByZXNlbnRzIHRoZSBwcm9wZXJ0eSBuYW1lIG9mIHRoZSBnaXZlbiBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIG5vZGUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtzaGFkZXJTdGFnZT10aGlzLnNoYWRlclN0YWdlXSAtIFRoZSBzaGFkZXIgc3RhZ2UgdGhpcyBjb2RlIHNuaXBwZXQgaXMgZ2VuZXJhdGVkIGZvci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBwcm9wZXJ0eSBuYW1lLlxyXG5cdCAqL1xyXG5cdGdldFByb3BlcnR5TmFtZSggbm9kZSwgc2hhZGVyU3RhZ2UgPSB0aGlzLnNoYWRlclN0YWdlICkge1xyXG5cclxuXHRcdGlmICggbm9kZS5pc05vZGVWYXJ5aW5nID09PSB0cnVlICYmIG5vZGUubmVlZHNJbnRlcnBvbGF0aW9uID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0aWYgKCBzaGFkZXJTdGFnZSA9PT0gJ3ZlcnRleCcgKSB7XHJcblxyXG5cdFx0XHRcdHJldHVybiBgdmFyeWluZ3MuJHsgbm9kZS5uYW1lIH1gO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSBpZiAoIG5vZGUuaXNOb2RlVW5pZm9ybSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdGNvbnN0IG5hbWUgPSBub2RlLm5hbWU7XHJcblx0XHRcdGNvbnN0IHR5cGUgPSBub2RlLnR5cGU7XHJcblxyXG5cdFx0XHRpZiAoIHR5cGUgPT09ICd0ZXh0dXJlJyB8fCB0eXBlID09PSAnY3ViZVRleHR1cmUnIHx8IHR5cGUgPT09ICdzdG9yYWdlVGV4dHVyZScgfHwgdHlwZSA9PT0gJ3RleHR1cmUzRCcgKSB7XHJcblxyXG5cdFx0XHRcdHJldHVybiBuYW1lO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggdHlwZSA9PT0gJ2J1ZmZlcicgfHwgdHlwZSA9PT0gJ3N0b3JhZ2VCdWZmZXInIHx8IHR5cGUgPT09ICdpbmRpcmVjdFN0b3JhZ2VCdWZmZXInICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIHRoaXMuaXNDdXN0b21TdHJ1Y3QoIG5vZGUgKSApIHtcclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gbmFtZTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRyZXR1cm4gbmFtZSArICcudmFsdWUnO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0cmV0dXJuIG5vZGUuZ3JvdXBOb2RlLm5hbWUgKyAnLicgKyBuYW1lO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHlOYW1lKCBub2RlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgb3V0cHV0IHN0cnVjdCBuYW1lLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgbmFtZSBvZiB0aGUgb3V0cHV0IHN0cnVjdC5cclxuXHQgKi9cclxuXHRnZXRPdXRwdXRTdHJ1Y3ROYW1lKCkge1xyXG5cclxuXHRcdHJldHVybiAnb3V0cHV0JztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBuYXRpdmUgc2hhZGVyIG9wZXJhdG9yIG5hbWUgZm9yIGEgZ2l2ZW4gZ2VuZXJpYyBuYW1lLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG9wIC0gVGhlIG9wZXJhdG9yIG5hbWUgdG8gcmVzb2x2ZS5cclxuXHQgKiBAcmV0dXJuIHs/c3RyaW5nfSBUaGUgcmVzb2x2ZWQgb3BlcmF0b3IgbmFtZS5cclxuXHQgKi9cclxuXHRnZXRGdW5jdGlvbk9wZXJhdG9yKCBvcCApIHtcclxuXHJcblx0XHRjb25zdCBmbk9wID0gd2dzbEZuT3BMaWJbIG9wIF07XHJcblxyXG5cdFx0aWYgKCBmbk9wICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHR0aGlzLl9pbmNsdWRlKCBmbk9wICk7XHJcblxyXG5cdFx0XHRyZXR1cm4gZm5PcDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgbm9kZSBhY2Nlc3MgZm9yIHRoZSBnaXZlbiBub2RlIGFuZCBzaGFkZXIgc3RhZ2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1N0b3JhZ2VUZXh0dXJlTm9kZXxTdG9yYWdlQnVmZmVyTm9kZX0gbm9kZSAtIFRoZSBzdG9yYWdlIG5vZGUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNoYWRlclN0YWdlIC0gVGhlIHNoYWRlciBzdGFnZS5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBub2RlIGFjY2Vzcy5cclxuXHQgKi9cclxuXHRnZXROb2RlQWNjZXNzKCBub2RlLCBzaGFkZXJTdGFnZSApIHtcclxuXHJcblx0XHRpZiAoIHNoYWRlclN0YWdlICE9PSAnY29tcHV0ZScgKVxyXG5cdFx0XHRyZXR1cm4gTm9kZUFjY2Vzcy5SRUFEX09OTFk7XHJcblxyXG5cdFx0cmV0dXJuIG5vZGUuYWNjZXNzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgQSBXR1NMIHNuaXBwZXQgcmVwcmVzZW50aW5nIHRoZSBzdG9yYWdlIGFjY2Vzcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7U3RvcmFnZVRleHR1cmVOb2RlfFN0b3JhZ2VCdWZmZXJOb2RlfSBub2RlIC0gVGhlIHN0b3JhZ2Ugbm9kZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc2hhZGVyU3RhZ2UgLSBUaGUgc2hhZGVyIHN0YWdlLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIFdHU0wgc25pcHBldCByZXByZXNlbnRpbmcgdGhlIHN0b3JhZ2UgYWNjZXNzLlxyXG5cdCAqL1xyXG5cdGdldFN0b3JhZ2VBY2Nlc3MoIG5vZGUsIHNoYWRlclN0YWdlICkge1xyXG5cclxuXHRcdHJldHVybiBhY2Nlc3NOYW1lc1sgdGhpcy5nZXROb2RlQWNjZXNzKCBub2RlLCBzaGFkZXJTdGFnZSApIF07XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgaXMgb25lIG9mIHRoZSBtb3JlIGltcG9ydGFudCBvbmVzIHNpbmNlIGl0J3MgcmVzcG9uc2libGVcclxuXHQgKiBmb3IgZ2VuZXJhdGluZyBhIG1hdGNoaW5nIGJpbmRpbmcgaW5zdGFuY2UgZm9yIHRoZSBnaXZlbiB1bmlmb3JtIG5vZGUuXHJcblx0ICpcclxuXHQgKiBUaGVzZSBiaW5kaW5ncyBhcmUgbGF0ZXIgdXNlZCBpbiB0aGUgcmVuZGVyZXIgdG8gY3JlYXRlIGJpbmQgZ3JvdXBzXHJcblx0ICogYW5kIGxheW91dHMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1VuaWZvcm1Ob2RlfSBub2RlIC0gVGhlIHVuaWZvcm0gbm9kZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSBub2RlIGRhdGEgdHlwZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc2hhZGVyU3RhZ2UgLSBUaGUgc2hhZGVyIHN0YWdlLlxyXG5cdCAqIEBwYXJhbSB7P3N0cmluZ30gW25hbWU9bnVsbF0gLSBBbiBvcHRpb25hbCB1bmlmb3JtIG5hbWUuXHJcblx0ICogQHJldHVybiB7Tm9kZVVuaWZvcm19IFRoZSBub2RlIHVuaWZvcm0gb2JqZWN0LlxyXG5cdCAqL1xyXG5cdGdldFVuaWZvcm1Gcm9tTm9kZSggbm9kZSwgdHlwZSwgc2hhZGVyU3RhZ2UsIG5hbWUgPSBudWxsICkge1xyXG5cclxuXHRcdGNvbnN0IHVuaWZvcm1Ob2RlID0gc3VwZXIuZ2V0VW5pZm9ybUZyb21Ob2RlKCBub2RlLCB0eXBlLCBzaGFkZXJTdGFnZSwgbmFtZSApO1xyXG5cdFx0Y29uc3Qgbm9kZURhdGEgPSB0aGlzLmdldERhdGFGcm9tTm9kZSggbm9kZSwgc2hhZGVyU3RhZ2UsIHRoaXMuZ2xvYmFsQ2FjaGUgKTtcclxuXHJcblx0XHRpZiAoIG5vZGVEYXRhLnVuaWZvcm1HUFUgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGxldCB1bmlmb3JtR1BVO1xyXG5cclxuXHRcdFx0Y29uc3QgZ3JvdXAgPSBub2RlLmdyb3VwTm9kZTtcclxuXHRcdFx0Y29uc3QgZ3JvdXBOYW1lID0gZ3JvdXAubmFtZTtcclxuXHJcblx0XHRcdGNvbnN0IGJpbmRpbmdzID0gdGhpcy5nZXRCaW5kR3JvdXBBcnJheSggZ3JvdXBOYW1lLCBzaGFkZXJTdGFnZSApO1xyXG5cclxuXHRcdFx0aWYgKCB0eXBlID09PSAndGV4dHVyZScgfHwgdHlwZSA9PT0gJ2N1YmVUZXh0dXJlJyB8fCB0eXBlID09PSAnc3RvcmFnZVRleHR1cmUnIHx8IHR5cGUgPT09ICd0ZXh0dXJlM0QnICkge1xyXG5cclxuXHRcdFx0XHRsZXQgdGV4dHVyZSA9IG51bGw7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGFjY2VzcyA9IHRoaXMuZ2V0Tm9kZUFjY2Vzcyggbm9kZSwgc2hhZGVyU3RhZ2UgKTtcclxuXHJcblx0XHRcdFx0aWYgKCB0eXBlID09PSAndGV4dHVyZScgfHwgdHlwZSA9PT0gJ3N0b3JhZ2VUZXh0dXJlJyApIHtcclxuXHJcblx0XHRcdFx0XHR0ZXh0dXJlID0gbmV3IE5vZGVTYW1wbGVkVGV4dHVyZSggdW5pZm9ybU5vZGUubmFtZSwgdW5pZm9ybU5vZGUubm9kZSwgZ3JvdXAsIGFjY2VzcyApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCB0eXBlID09PSAnY3ViZVRleHR1cmUnICkge1xyXG5cclxuXHRcdFx0XHRcdHRleHR1cmUgPSBuZXcgTm9kZVNhbXBsZWRDdWJlVGV4dHVyZSggdW5pZm9ybU5vZGUubmFtZSwgdW5pZm9ybU5vZGUubm9kZSwgZ3JvdXAsIGFjY2VzcyApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCB0eXBlID09PSAndGV4dHVyZTNEJyApIHtcclxuXHJcblx0XHRcdFx0XHR0ZXh0dXJlID0gbmV3IE5vZGVTYW1wbGVkVGV4dHVyZTNEKCB1bmlmb3JtTm9kZS5uYW1lLCB1bmlmb3JtTm9kZS5ub2RlLCBncm91cCwgYWNjZXNzICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0dGV4dHVyZS5zdG9yZSA9IG5vZGUuaXNTdG9yYWdlVGV4dHVyZU5vZGUgPT09IHRydWU7XHJcblx0XHRcdFx0dGV4dHVyZS5zZXRWaXNpYmlsaXR5KCBncHVTaGFkZXJTdGFnZUxpYlsgc2hhZGVyU3RhZ2UgXSApO1xyXG5cclxuXHRcdFx0XHRpZiAoICggc2hhZGVyU3RhZ2UgPT09ICdmcmFnbWVudCcgfHwgc2hhZGVyU3RhZ2UgPT09ICdjb21wdXRlJyApICYmIHRoaXMuaXNVbmZpbHRlcmFibGUoIG5vZGUudmFsdWUgKSA9PT0gZmFsc2UgJiYgdGV4dHVyZS5zdG9yZSA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3Qgc2FtcGxlciA9IG5ldyBOb2RlU2FtcGxlciggYCR7IHVuaWZvcm1Ob2RlLm5hbWUgfV9zYW1wbGVyYCwgdW5pZm9ybU5vZGUubm9kZSwgZ3JvdXAgKTtcclxuXHRcdFx0XHRcdHNhbXBsZXIuc2V0VmlzaWJpbGl0eSggZ3B1U2hhZGVyU3RhZ2VMaWJbIHNoYWRlclN0YWdlIF0gKTtcclxuXHJcblx0XHRcdFx0XHRiaW5kaW5ncy5wdXNoKCBzYW1wbGVyLCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0XHRcdFx0dW5pZm9ybUdQVSA9IFsgc2FtcGxlciwgdGV4dHVyZSBdO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdGJpbmRpbmdzLnB1c2goIHRleHR1cmUgKTtcclxuXHJcblx0XHRcdFx0XHR1bmlmb3JtR1BVID0gWyB0ZXh0dXJlIF07XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIHR5cGUgPT09ICdidWZmZXInIHx8IHR5cGUgPT09ICdzdG9yYWdlQnVmZmVyJyB8fCB0eXBlID09PSAnaW5kaXJlY3RTdG9yYWdlQnVmZmVyJyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgYnVmZmVyQ2xhc3MgPSB0eXBlID09PSAnYnVmZmVyJyA/IE5vZGVVbmlmb3JtQnVmZmVyIDogTm9kZVN0b3JhZ2VCdWZmZXI7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGJ1ZmZlciA9IG5ldyBidWZmZXJDbGFzcyggbm9kZSwgZ3JvdXAgKTtcclxuXHRcdFx0XHRidWZmZXIuc2V0VmlzaWJpbGl0eSggZ3B1U2hhZGVyU3RhZ2VMaWJbIHNoYWRlclN0YWdlIF0gKTtcclxuXHJcblx0XHRcdFx0YmluZGluZ3MucHVzaCggYnVmZmVyICk7XHJcblxyXG5cdFx0XHRcdHVuaWZvcm1HUFUgPSBidWZmZXI7XHJcblxyXG5cdFx0XHRcdHVuaWZvcm1Ob2RlLm5hbWUgPSBuYW1lID8gbmFtZSA6ICdOb2RlQnVmZmVyXycgKyB1bmlmb3JtTm9kZS5pZDtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHVuaWZvcm1zU3RhZ2UgPSB0aGlzLnVuaWZvcm1Hcm91cHNbIHNoYWRlclN0YWdlIF0gfHwgKCB0aGlzLnVuaWZvcm1Hcm91cHNbIHNoYWRlclN0YWdlIF0gPSB7fSApO1xyXG5cclxuXHRcdFx0XHRsZXQgdW5pZm9ybXNHcm91cCA9IHVuaWZvcm1zU3RhZ2VbIGdyb3VwTmFtZSBdO1xyXG5cclxuXHRcdFx0XHRpZiAoIHVuaWZvcm1zR3JvdXAgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHR1bmlmb3Jtc0dyb3VwID0gbmV3IE5vZGVVbmlmb3Jtc0dyb3VwKCBncm91cE5hbWUsIGdyb3VwICk7XHJcblx0XHRcdFx0XHR1bmlmb3Jtc0dyb3VwLnNldFZpc2liaWxpdHkoIGdwdVNoYWRlclN0YWdlTGliWyBzaGFkZXJTdGFnZSBdICk7XHJcblxyXG5cdFx0XHRcdFx0dW5pZm9ybXNTdGFnZVsgZ3JvdXBOYW1lIF0gPSB1bmlmb3Jtc0dyb3VwO1xyXG5cclxuXHRcdFx0XHRcdGJpbmRpbmdzLnB1c2goIHVuaWZvcm1zR3JvdXAgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR1bmlmb3JtR1BVID0gdGhpcy5nZXROb2RlVW5pZm9ybSggdW5pZm9ybU5vZGUsIHR5cGUgKTtcclxuXHJcblx0XHRcdFx0dW5pZm9ybXNHcm91cC5hZGRVbmlmb3JtKCB1bmlmb3JtR1BVICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRub2RlRGF0YS51bmlmb3JtR1BVID0gdW5pZm9ybUdQVTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHVuaWZvcm1Ob2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSB1c2VkIHdoZW5ldmVyIGJ1aWx0aW5zIGFyZSByZXF1aXJlZCBpbiBub2Rlcy5cclxuXHQgKiBUaGUgaW50ZXJuYWwgYnVpbHRpbnMgZGF0YSBzdHJ1Y3R1cmUgd2lsbCBtYWtlIHN1cmUgYnVpbHRpbnMgYXJlXHJcblx0ICogZGVmaW5lZCBpbiB0aGUgV0dTTCBzb3VyY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBidWlsdGluIG5hbWUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IG5hbWUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBUaGUgbm9kZSBkYXRhIHR5cGUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtzaGFkZXJTdGFnZT10aGlzLnNoYWRlclN0YWdlXSAtIFRoZSBzaGFkZXIgc3RhZ2UgdGhpcyBjb2RlIHNuaXBwZXQgaXMgZ2VuZXJhdGVkIGZvci5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBwcm9wZXJ0eSBuYW1lLlxyXG5cdCAqL1xyXG5cdGdldEJ1aWx0aW4oIG5hbWUsIHByb3BlcnR5LCB0eXBlLCBzaGFkZXJTdGFnZSA9IHRoaXMuc2hhZGVyU3RhZ2UgKSB7XHJcblxyXG5cdFx0Y29uc3QgbWFwID0gdGhpcy5idWlsdGluc1sgc2hhZGVyU3RhZ2UgXSB8fCAoIHRoaXMuYnVpbHRpbnNbIHNoYWRlclN0YWdlIF0gPSBuZXcgTWFwKCkgKTtcclxuXHJcblx0XHRpZiAoIG1hcC5oYXMoIG5hbWUgKSA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRtYXAuc2V0KCBuYW1lLCB7XHJcblx0XHRcdFx0bmFtZSxcclxuXHRcdFx0XHRwcm9wZXJ0eSxcclxuXHRcdFx0XHR0eXBlXHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHByb3BlcnR5O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBnaXZlbiBidWlsdGluIGlzIGRlZmluZWQgaW4gdGhlIGdpdmVuIHNoYWRlciBzdGFnZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIGJ1aWx0aW4gbmFtZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW3NoYWRlclN0YWdlPXRoaXMuc2hhZGVyU3RhZ2VdIC0gVGhlIHNoYWRlciBzdGFnZSB0aGlzIGNvZGUgc25pcHBldCBpcyBnZW5lcmF0ZWQgZm9yLlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGdpdmVuIGJ1aWx0aW4gaXMgZGVmaW5lZCBpbiB0aGUgZ2l2ZW4gc2hhZGVyIHN0YWdlIG9yIG5vdC5cclxuXHQgKi9cclxuXHRoYXNCdWlsdGluKCBuYW1lLCBzaGFkZXJTdGFnZSA9IHRoaXMuc2hhZGVyU3RhZ2UgKSB7XHJcblxyXG5cdFx0cmV0dXJuICggdGhpcy5idWlsdGluc1sgc2hhZGVyU3RhZ2UgXSAhPT0gdW5kZWZpbmVkICYmIHRoaXMuYnVpbHRpbnNbIHNoYWRlclN0YWdlIF0uaGFzKCBuYW1lICkgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSB2ZXJ0ZXggaW5kZXggYnVpbHRpbi5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHZlcnRleCBpbmRleC5cclxuXHQgKi9cclxuXHRnZXRWZXJ0ZXhJbmRleCgpIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuc2hhZGVyU3RhZ2UgPT09ICd2ZXJ0ZXgnICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0QnVpbHRpbiggJ3ZlcnRleF9pbmRleCcsICd2ZXJ0ZXhJbmRleCcsICd1MzInLCAnYXR0cmlidXRlJyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gJ3ZlcnRleEluZGV4JztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBCdWlsZHMgdGhlIGdpdmVuIHNoYWRlciBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTaGFkZXJOb2RlSW50ZXJuYWx9IHNoYWRlck5vZGUgLSBUaGUgc2hhZGVyIG5vZGUuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgV0dTTCBmdW5jdGlvbiBjb2RlLlxyXG5cdCAqL1xyXG5cdGJ1aWxkRnVuY3Rpb25Db2RlKCBzaGFkZXJOb2RlICkge1xyXG5cclxuXHRcdGNvbnN0IGxheW91dCA9IHNoYWRlck5vZGUubGF5b3V0O1xyXG5cdFx0Y29uc3QgZmxvd0RhdGEgPSB0aGlzLmZsb3dTaGFkZXJOb2RlKCBzaGFkZXJOb2RlICk7XHJcblxyXG5cdFx0Y29uc3QgcGFyYW1ldGVycyA9IFtdO1xyXG5cclxuXHRcdGZvciAoIGNvbnN0IGlucHV0IG9mIGxheW91dC5pbnB1dHMgKSB7XHJcblxyXG5cdFx0XHRwYXJhbWV0ZXJzLnB1c2goIGlucHV0Lm5hbWUgKyAnIDogJyArIHRoaXMuZ2V0VHlwZSggaW5wdXQudHlwZSApICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0bGV0IGNvZGUgPSBgZm4gJHsgbGF5b3V0Lm5hbWUgfSggJHsgcGFyYW1ldGVycy5qb2luKCAnLCAnICkgfSApIC0+ICR7IHRoaXMuZ2V0VHlwZSggbGF5b3V0LnR5cGUgKSB9IHtcclxuJHsgZmxvd0RhdGEudmFycyB9XHJcbiR7IGZsb3dEYXRhLmNvZGUgfVxyXG5gO1xyXG5cclxuXHRcdGlmICggZmxvd0RhdGEucmVzdWx0ICkge1xyXG5cclxuXHRcdFx0Y29kZSArPSBgXFx0cmV0dXJuICR7IGZsb3dEYXRhLnJlc3VsdCB9O1xcbmA7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGNvZGUgKz0gJ1xcbn1cXG4nO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0cmV0dXJuIGNvZGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgaW5zdGFuY2UgaW5kZXggYnVpbHRpbi5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGluc3RhbmNlIGluZGV4LlxyXG5cdCAqL1xyXG5cdGdldEluc3RhbmNlSW5kZXgoKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLnNoYWRlclN0YWdlID09PSAndmVydGV4JyApIHtcclxuXHJcblx0XHRcdHJldHVybiB0aGlzLmdldEJ1aWx0aW4oICdpbnN0YW5jZV9pbmRleCcsICdpbnN0YW5jZUluZGV4JywgJ3UzMicsICdhdHRyaWJ1dGUnICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiAnaW5zdGFuY2VJbmRleCc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgaW52b2NhdGlvbiBsb2NhbCBpbmRleCBidWlsdGluLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgaW52b2NhdGlvbiBsb2NhbCBpbmRleC5cclxuXHQgKi9cclxuXHRnZXRJbnZvY2F0aW9uTG9jYWxJbmRleCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5nZXRCdWlsdGluKCAnbG9jYWxfaW52b2NhdGlvbl9pbmRleCcsICdpbnZvY2F0aW9uTG9jYWxJbmRleCcsICd1MzInLCAnYXR0cmlidXRlJyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHN1Ymdyb3VwIHNpemUgYnVpbHRpbi5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHN1Ymdyb3VwIHNpemUuXHJcblx0ICovXHJcblx0Z2V0U3ViZ3JvdXBTaXplKCkge1xyXG5cclxuXHRcdHRoaXMuZW5hYmxlU3ViR3JvdXBzKCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZ2V0QnVpbHRpbiggJ3N1Ymdyb3VwX3NpemUnLCAnc3ViZ3JvdXBTaXplJywgJ3UzMicsICdhdHRyaWJ1dGUnICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgaW52b2NhdGlvbiBzdWJncm91cCBpbmRleCBidWlsdGluLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgaW52b2NhdGlvbiBzdWJncm91cCBpbmRleC5cclxuXHQgKi9cclxuXHRnZXRJbnZvY2F0aW9uU3ViZ3JvdXBJbmRleCgpIHtcclxuXHJcblx0XHR0aGlzLmVuYWJsZVN1Ykdyb3VwcygpO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmdldEJ1aWx0aW4oICdzdWJncm91cF9pbnZvY2F0aW9uX2lkJywgJ2ludm9jYXRpb25TdWJncm91cEluZGV4JywgJ3UzMicsICdhdHRyaWJ1dGUnICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgc3ViZ3JvdXAgaW5kZXggYnVpbHRpbi5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHN1Ymdyb3VwIGluZGV4LlxyXG5cdCAqL1xyXG5cdGdldFN1Ymdyb3VwSW5kZXgoKSB7XHJcblxyXG5cdFx0dGhpcy5lbmFibGVTdWJHcm91cHMoKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5nZXRCdWlsdGluKCAnc3ViZ3JvdXBfaWQnLCAnc3ViZ3JvdXBJbmRleCcsICd1MzInLCAnYXR0cmlidXRlJyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE92ZXJ3cml0dGVuIGFzIGEgTk9QIHNpbmNlIHRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciB0aGUgV2ViR0wgMiBiYWNrZW5kLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVsbH0gTnVsbC5cclxuXHQgKi9cclxuXHRnZXREcmF3SW5kZXgoKSB7XHJcblxyXG5cdFx0cmV0dXJuIG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgZnJvbnQgZmFjaW5nIGJ1aWx0aW4uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBmcm9udCBmYWNpbmcgYnVpbHRpbi5cclxuXHQgKi9cclxuXHRnZXRGcm9udEZhY2luZygpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5nZXRCdWlsdGluKCAnZnJvbnRfZmFjaW5nJywgJ2lzRnJvbnQnLCAnYm9vbCcgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBmcmFnIGNvb3JkIGJ1aWx0aW4uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBmcmFnIGNvb3JkIGJ1aWx0aW4uXHJcblx0ICovXHJcblx0Z2V0RnJhZ0Nvb3JkKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmdldEJ1aWx0aW4oICdwb3NpdGlvbicsICdmcmFnQ29vcmQnLCAndmVjNDxmMzI+JyApICsgJy54eSc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgZnJhZyBkZXB0aCBidWlsdGluLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgZnJhZyBkZXB0aCBidWlsdGluLlxyXG5cdCAqL1xyXG5cdGdldEZyYWdEZXB0aCgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ291dHB1dC4nICsgdGhpcy5nZXRCdWlsdGluKCAnZnJhZ19kZXB0aCcsICdkZXB0aCcsICdmMzInLCAnb3V0cHV0JyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGNsaXAgZGlzdGFuY2VzIGJ1aWx0aW4uXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBjbGlwIGRpc3RhbmNlcyBidWlsdGluLlxyXG5cdCAqL1xyXG5cdGdldENsaXBEaXN0YW5jZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gJ3ZhcnlpbmdzLmh3X2NsaXBfZGlzdGFuY2VzJztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBXaGV0aGVyIHRvIGZsaXAgdGV4dHVyZSBkYXRhIGFsb25nIGl0cyB2ZXJ0aWNhbCBheGlzIG9yIG5vdC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFJldHVybnMgYWx3YXlzIGBmYWxzZWAgaW4gY29udGV4dCBvZiBXR1NMLlxyXG5cdCAqL1xyXG5cdGlzRmxpcFkoKSB7XHJcblxyXG5cdFx0cmV0dXJuIGZhbHNlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEVuYWJsZXMgdGhlIGdpdmVuIGRpcmVjdGl2ZSBmb3IgdGhlIGdpdmVuIHNoYWRlciBzdGFnZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIGRpcmVjdGl2ZSBuYW1lLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbc2hhZGVyU3RhZ2U9dGhpcy5zaGFkZXJTdGFnZV0gLSBUaGUgc2hhZGVyIHN0YWdlIHRvIGVuYWJsZSB0aGUgZGlyZWN0aXZlIGZvci5cclxuXHQgKi9cclxuXHRlbmFibGVEaXJlY3RpdmUoIG5hbWUsIHNoYWRlclN0YWdlID0gdGhpcy5zaGFkZXJTdGFnZSApIHtcclxuXHJcblx0XHRjb25zdCBzdGFnZSA9IHRoaXMuZGlyZWN0aXZlc1sgc2hhZGVyU3RhZ2UgXSB8fCAoIHRoaXMuZGlyZWN0aXZlc1sgc2hhZGVyU3RhZ2UgXSA9IG5ldyBTZXQoKSApO1xyXG5cdFx0c3RhZ2UuYWRkKCBuYW1lICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgZGlyZWN0aXZlcyBvZiB0aGUgZ2l2ZW4gc2hhZGVyIHN0YWdlIGFzIGEgV0dTTCBzdHJpbmcuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc2hhZGVyU3RhZ2UgLSBUaGUgc2hhZGVyIHN0YWdlLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gQSBXR1NMIHNuaXBwZXQgdGhhdCBlbmFibGVzIHRoZSBkaXJlY3RpdmVzIG9mIHRoZSBnaXZlbiBzdGFnZS5cclxuXHQgKi9cclxuXHRnZXREaXJlY3RpdmVzKCBzaGFkZXJTdGFnZSApIHtcclxuXHJcblx0XHRjb25zdCBzbmlwcGV0cyA9IFtdO1xyXG5cdFx0Y29uc3QgZGlyZWN0aXZlcyA9IHRoaXMuZGlyZWN0aXZlc1sgc2hhZGVyU3RhZ2UgXTtcclxuXHJcblx0XHRpZiAoIGRpcmVjdGl2ZXMgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGZvciAoIGNvbnN0IGRpcmVjdGl2ZSBvZiBkaXJlY3RpdmVzICkge1xyXG5cclxuXHRcdFx0XHRzbmlwcGV0cy5wdXNoKCBgZW5hYmxlICR7ZGlyZWN0aXZlfTtgICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBzbmlwcGV0cy5qb2luKCAnXFxuJyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEVuYWJsZXMgdGhlICdzdWJncm91cHMnIGRpcmVjdGl2ZS5cclxuXHQgKi9cclxuXHRlbmFibGVTdWJHcm91cHMoKSB7XHJcblxyXG5cdFx0dGhpcy5lbmFibGVEaXJlY3RpdmUoICdzdWJncm91cHMnICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRW5hYmxlcyB0aGUgJ3N1Ymdyb3Vwcy1mMTYnIGRpcmVjdGl2ZS5cclxuXHQgKi9cclxuXHRlbmFibGVTdWJncm91cHNGMTYoKSB7XHJcblxyXG5cdFx0dGhpcy5lbmFibGVEaXJlY3RpdmUoICdzdWJncm91cHMtZjE2JyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEVuYWJsZXMgdGhlICdjbGlwX2Rpc3RhbmNlcycgZGlyZWN0aXZlLlxyXG5cdCAqL1xyXG5cdGVuYWJsZUNsaXBEaXN0YW5jZXMoKSB7XHJcblxyXG5cdFx0dGhpcy5lbmFibGVEaXJlY3RpdmUoICdjbGlwX2Rpc3RhbmNlcycgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFbmFibGVzIHRoZSAnZjE2JyBkaXJlY3RpdmUuXHJcblx0ICovXHJcblx0ZW5hYmxlU2hhZGVyRjE2KCkge1xyXG5cclxuXHRcdHRoaXMuZW5hYmxlRGlyZWN0aXZlKCAnZjE2JyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEVuYWJsZXMgdGhlICdkdWFsX3NvdXJjZV9ibGVuZGluZycgZGlyZWN0aXZlLlxyXG5cdCAqL1xyXG5cdGVuYWJsZUR1YWxTb3VyY2VCbGVuZGluZygpIHtcclxuXHJcblx0XHR0aGlzLmVuYWJsZURpcmVjdGl2ZSggJ2R1YWxfc291cmNlX2JsZW5kaW5nJyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEVuYWJsZXMgaGFyZHdhcmUgY2xpcHBpbmcuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcGxhbmVDb3VudCAtIFRoZSBjbGlwcGluZyBwbGFuZSBjb3VudC5cclxuXHQgKi9cclxuXHRlbmFibGVIYXJkd2FyZUNsaXBwaW5nKCBwbGFuZUNvdW50ICkge1xyXG5cclxuXHRcdHRoaXMuZW5hYmxlQ2xpcERpc3RhbmNlcygpO1xyXG5cdFx0dGhpcy5nZXRCdWlsdGluKCAnY2xpcF9kaXN0YW5jZXMnLCAnaHdfY2xpcF9kaXN0YW5jZXMnLCBgYXJyYXk8ZjMyLCAkeyBwbGFuZUNvdW50IH0gPmAsICd2ZXJ0ZXgnICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgYnVpbHRpbnMgb2YgdGhlIGdpdmVuIHNoYWRlciBzdGFnZSBhcyBhIFdHU0wgc3RyaW5nLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNoYWRlclN0YWdlIC0gVGhlIHNoYWRlciBzdGFnZS5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IEEgV0dTTCBzbmlwcGV0IHRoYXQgcmVwcmVzZW50cyB0aGUgYnVpbHRpbnMgb2YgdGhlIGdpdmVuIHN0YWdlLlxyXG5cdCAqL1xyXG5cdGdldEJ1aWx0aW5zKCBzaGFkZXJTdGFnZSApIHtcclxuXHJcblx0XHRjb25zdCBzbmlwcGV0cyA9IFtdO1xyXG5cdFx0Y29uc3QgYnVpbHRpbnMgPSB0aGlzLmJ1aWx0aW5zWyBzaGFkZXJTdGFnZSBdO1xyXG5cclxuXHRcdGlmICggYnVpbHRpbnMgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGZvciAoIGNvbnN0IHsgbmFtZSwgcHJvcGVydHksIHR5cGUgfSBvZiBidWlsdGlucy52YWx1ZXMoKSApIHtcclxuXHJcblx0XHRcdFx0c25pcHBldHMucHVzaCggYEBidWlsdGluKCAke25hbWV9ICkgJHtwcm9wZXJ0eX0gOiAke3R5cGV9YCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gc25pcHBldHMuam9pbiggJyxcXG5cXHQnICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgd2hlbiBhIG5ldyBzY29wZWQgYnVmZmVyIGlzIHVzZWQgaW4gY29udGV4dCBvZlxyXG5cdCAqIGNvbXB1dGUgc2hhZGVycy4gSXQgYWRkcyB0aGUgYXJyYXkgdG8gdGhlIGludGVybmFsIGRhdGEgc3RydWN0dXJlIHdoaWNoIGlzXHJcblx0ICogbGF0ZXIgdXNlZCB0byBnZW5lcmF0ZSB0aGUgcmVzcGVjdGl2ZSBXR1NMLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgYXJyYXkgbmFtZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc2NvcGUgLSBUaGUgc2NvcGUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGJ1ZmZlclR5cGUgLSBUaGUgYnVmZmVyIHR5cGUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGJ1ZmZlckNvdW50IC0gVGhlIGJ1ZmZlciBjb3VudC5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBhcnJheSBuYW1lLlxyXG5cdCAqL1xyXG5cdGdldFNjb3BlZEFycmF5KCBuYW1lLCBzY29wZSwgYnVmZmVyVHlwZSwgYnVmZmVyQ291bnQgKSB7XHJcblxyXG5cdFx0aWYgKCB0aGlzLnNjb3BlZEFycmF5cy5oYXMoIG5hbWUgKSA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnNjb3BlZEFycmF5cy5zZXQoIG5hbWUsIHtcclxuXHRcdFx0XHRuYW1lLFxyXG5cdFx0XHRcdHNjb3BlLFxyXG5cdFx0XHRcdGJ1ZmZlclR5cGUsXHJcblx0XHRcdFx0YnVmZmVyQ291bnRcclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbmFtZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBzY29wZWQgYXJyYXlzIG9mIHRoZSBnaXZlbiBzaGFkZXIgc3RhZ2UgYXMgYSBXR1NMIHN0cmluZy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzaGFkZXJTdGFnZSAtIFRoZSBzaGFkZXIgc3RhZ2UuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfHVuZGVmaW5lZH0gVGhlIFdHU0wgc25pcHBldCB0aGF0IGRlZmluZXMgdGhlIHNjb3BlZCBhcnJheXMuXHJcblx0ICogUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHVzZWQgaW4gdGhlIHZlcnRleCBvciBmcmFnbWVudCBzdGFnZS5cclxuXHQgKi9cclxuXHRnZXRTY29wZWRBcnJheXMoIHNoYWRlclN0YWdlICkge1xyXG5cclxuXHRcdGlmICggc2hhZGVyU3RhZ2UgIT09ICdjb21wdXRlJyApIHtcclxuXHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3Qgc25pcHBldHMgPSBbXTtcclxuXHJcblx0XHRmb3IgKCBjb25zdCB7IG5hbWUsIHNjb3BlLCBidWZmZXJUeXBlLCBidWZmZXJDb3VudCB9IG9mIHRoaXMuc2NvcGVkQXJyYXlzLnZhbHVlcygpICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdHlwZSA9IHRoaXMuZ2V0VHlwZSggYnVmZmVyVHlwZSApO1xyXG5cclxuXHRcdFx0c25pcHBldHMucHVzaCggYHZhcjwke3Njb3BlfT4gJHtuYW1lfTogYXJyYXk8ICR7dHlwZX0sICR7YnVmZmVyQ291bnR9ID47YCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gc25pcHBldHMuam9pbiggJ1xcbicgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBzaGFkZXIgYXR0cmlidXRlcyBvZiB0aGUgZ2l2ZW4gc2hhZGVyIHN0YWdlIGFzIGEgV0dTTCBzdHJpbmcuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc2hhZGVyU3RhZ2UgLSBUaGUgc2hhZGVyIHN0YWdlLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIFdHU0wgc25pcHBldCB0aGF0IGRlZmluZXMgdGhlIHNoYWRlciBhdHRyaWJ1dGVzLlxyXG5cdCAqL1xyXG5cdGdldEF0dHJpYnV0ZXMoIHNoYWRlclN0YWdlICkge1xyXG5cclxuXHRcdGNvbnN0IHNuaXBwZXRzID0gW107XHJcblxyXG5cdFx0aWYgKCBzaGFkZXJTdGFnZSA9PT0gJ2NvbXB1dGUnICkge1xyXG5cclxuXHRcdFx0dGhpcy5nZXRCdWlsdGluKCAnZ2xvYmFsX2ludm9jYXRpb25faWQnLCAnZ2xvYmFsSWQnLCAndmVjMzx1MzI+JywgJ2F0dHJpYnV0ZScgKTtcclxuXHRcdFx0dGhpcy5nZXRCdWlsdGluKCAnd29ya2dyb3VwX2lkJywgJ3dvcmtncm91cElkJywgJ3ZlYzM8dTMyPicsICdhdHRyaWJ1dGUnICk7XHJcblx0XHRcdHRoaXMuZ2V0QnVpbHRpbiggJ2xvY2FsX2ludm9jYXRpb25faWQnLCAnbG9jYWxJZCcsICd2ZWMzPHUzMj4nLCAnYXR0cmlidXRlJyApO1xyXG5cdFx0XHR0aGlzLmdldEJ1aWx0aW4oICdudW1fd29ya2dyb3VwcycsICdudW1Xb3JrZ3JvdXBzJywgJ3ZlYzM8dTMyPicsICdhdHRyaWJ1dGUnICk7XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMucmVuZGVyZXIuaGFzRmVhdHVyZSggJ3N1Ymdyb3VwcycgKSApIHtcclxuXHJcblx0XHRcdFx0dGhpcy5lbmFibGVEaXJlY3RpdmUoICdzdWJncm91cHMnLCBzaGFkZXJTdGFnZSApO1xyXG5cdFx0XHRcdHRoaXMuZ2V0QnVpbHRpbiggJ3N1Ymdyb3VwX3NpemUnLCAnc3ViZ3JvdXBTaXplJywgJ3UzMicsICdhdHRyaWJ1dGUnICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggc2hhZGVyU3RhZ2UgPT09ICd2ZXJ0ZXgnIHx8IHNoYWRlclN0YWdlID09PSAnY29tcHV0ZScgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBidWlsdGlucyA9IHRoaXMuZ2V0QnVpbHRpbnMoICdhdHRyaWJ1dGUnICk7XHJcblxyXG5cdFx0XHRpZiAoIGJ1aWx0aW5zICkgc25pcHBldHMucHVzaCggYnVpbHRpbnMgKTtcclxuXHJcblx0XHRcdGNvbnN0IGF0dHJpYnV0ZXMgPSB0aGlzLmdldEF0dHJpYnV0ZXNBcnJheSgpO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGluZGV4ID0gMCwgbGVuZ3RoID0gYXR0cmlidXRlcy5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgYXR0cmlidXRlID0gYXR0cmlidXRlc1sgaW5kZXggXTtcclxuXHRcdFx0XHRjb25zdCBuYW1lID0gYXR0cmlidXRlLm5hbWU7XHJcblx0XHRcdFx0Y29uc3QgdHlwZSA9IHRoaXMuZ2V0VHlwZSggYXR0cmlidXRlLnR5cGUgKTtcclxuXHJcblx0XHRcdFx0c25pcHBldHMucHVzaCggYEBsb2NhdGlvbiggJHtpbmRleH0gKSAkeyBuYW1lIH0gOiAkeyB0eXBlIH1gICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBzbmlwcGV0cy5qb2luKCAnLFxcblxcdCcgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBtZW1iZXJzIG9mIHRoZSBnaXZlbiBzdHJ1Y3QgdHlwZSBub2RlIGFzIGEgV0dTTCBzdHJpbmcuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1N0cnVjdFR5cGVOb2RlfSBzdHJ1Y3QgLSBUaGUgc3RydWN0IHR5cGUgbm9kZS5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBXR1NMIHNuaXBwZXQgdGhhdCBkZWZpbmVzIHRoZSBzdHJ1Y3QgbWVtYmVycy5cclxuXHQgKi9cclxuXHRnZXRTdHJ1Y3RNZW1iZXJzKCBzdHJ1Y3QgKSB7XHJcblxyXG5cdFx0Y29uc3Qgc25pcHBldHMgPSBbXTtcclxuXHJcblx0XHRmb3IgKCBjb25zdCBtZW1iZXIgb2Ygc3RydWN0Lm1lbWJlcnMgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBwcmVmaXggPSBzdHJ1Y3Qub3V0cHV0ID8gJ0Bsb2NhdGlvbiggJyArIG1lbWJlci5pbmRleCArICcgKSAnIDogJyc7XHJcblxyXG5cdFx0XHRsZXQgdHlwZSA9IHRoaXMuZ2V0VHlwZSggbWVtYmVyLnR5cGUgKTtcclxuXHJcblx0XHRcdGlmICggbWVtYmVyLmF0b21pYyApIHtcclxuXHJcblx0XHRcdFx0dHlwZSA9ICdhdG9taWM8ICcgKyB0eXBlICsgJyA+JztcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHNuaXBwZXRzLnB1c2goIGBcXHQkeyBwcmVmaXggKyBtZW1iZXIubmFtZSB9IDogJHsgdHlwZSB9YCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHN0cnVjdC5vdXRwdXQgKSB7XHJcblxyXG5cdFx0XHRzbmlwcGV0cy5wdXNoKCBgXFx0JHsgdGhpcy5nZXRCdWlsdGlucyggJ291dHB1dCcgKSB9YCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gc25pcHBldHMuam9pbiggJyxcXG4nICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgc3RydWN0cyBvZiB0aGUgZ2l2ZW4gc2hhZGVyIHN0YWdlIGFzIGEgV0dTTCBzdHJpbmcuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc2hhZGVyU3RhZ2UgLSBUaGUgc2hhZGVyIHN0YWdlLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIFdHU0wgc25pcHBldCB0aGF0IGRlZmluZXMgdGhlIHN0cnVjdHMuXHJcblx0ICovXHJcblx0Z2V0U3RydWN0cyggc2hhZGVyU3RhZ2UgKSB7XHJcblxyXG5cdFx0bGV0IHJlc3VsdCA9ICcnO1xyXG5cclxuXHRcdGNvbnN0IHN0cnVjdHMgPSB0aGlzLnN0cnVjdHNbIHNoYWRlclN0YWdlIF07XHJcblxyXG5cdFx0aWYgKCBzdHJ1Y3RzLmxlbmd0aCA+IDAgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBzbmlwcGV0cyA9IFtdO1xyXG5cclxuXHRcdFx0Zm9yICggY29uc3Qgc3RydWN0IG9mIHN0cnVjdHMgKSB7XHJcblxyXG5cdFx0XHRcdGxldCBzbmlwcGV0ID0gYHN0cnVjdCAkeyBzdHJ1Y3QubmFtZSB9IHtcXG5gO1xyXG5cdFx0XHRcdHNuaXBwZXQgKz0gdGhpcy5nZXRTdHJ1Y3RNZW1iZXJzKCBzdHJ1Y3QgKTtcclxuXHRcdFx0XHRzbmlwcGV0ICs9ICdcXG59Oyc7XHJcblxyXG5cdFx0XHRcdHNuaXBwZXRzLnB1c2goIHNuaXBwZXQgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJlc3VsdCA9ICdcXG4nICsgc25pcHBldHMuam9pbiggJ1xcblxcbicgKSArICdcXG4nO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBXR1NMIHN0cmluZyByZXByZXNlbnRpbmcgYSB2YXJpYWJsZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIHZhcmlhYmxlJ3MgdHlwZS5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSB2YXJpYWJsZSdzIG5hbWUuXHJcblx0ICogQHBhcmFtIHs/bnVtYmVyfSBbY291bnQ9bnVsbF0gLSBUaGUgYXJyYXkgbGVuZ3RoLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIFdHU0wgc25pcHBldCB0aGF0IGRlZmluZXMgYSB2YXJpYWJsZS5cclxuXHQgKi9cclxuXHRnZXRWYXIoIHR5cGUsIG5hbWUsIGNvdW50ID0gbnVsbCApIHtcclxuXHJcblx0XHRsZXQgc25pcHBldCA9IGB2YXIgJHsgbmFtZSB9IDogYDtcclxuXHJcblx0XHRpZiAoIGNvdW50ICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0c25pcHBldCArPSB0aGlzLmdlbmVyYXRlQXJyYXlEZWNsYXJhdGlvbiggdHlwZSwgY291bnQgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0c25pcHBldCArPSB0aGlzLmdldFR5cGUoIHR5cGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHNuaXBwZXQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgdmFyaWFibGVzIG9mIHRoZSBnaXZlbiBzaGFkZXIgc3RhZ2UgYXMgYSBXR1NMIHN0cmluZy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzaGFkZXJTdGFnZSAtIFRoZSBzaGFkZXIgc3RhZ2UuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgV0dTTCBzbmlwcGV0IHRoYXQgZGVmaW5lcyB0aGUgdmFyaWFibGVzLlxyXG5cdCAqL1xyXG5cdGdldFZhcnMoIHNoYWRlclN0YWdlICkge1xyXG5cclxuXHRcdGNvbnN0IHNuaXBwZXRzID0gW107XHJcblx0XHRjb25zdCB2YXJzID0gdGhpcy52YXJzWyBzaGFkZXJTdGFnZSBdO1xyXG5cclxuXHRcdGlmICggdmFycyAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0Zm9yICggY29uc3QgdmFyaWFibGUgb2YgdmFycyApIHtcclxuXHJcblx0XHRcdFx0c25pcHBldHMucHVzaCggYFxcdCR7IHRoaXMuZ2V0VmFyKCB2YXJpYWJsZS50eXBlLCB2YXJpYWJsZS5uYW1lLCB2YXJpYWJsZS5jb3VudCApIH07YCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gYFxcbiR7IHNuaXBwZXRzLmpvaW4oICdcXG4nICkgfVxcbmA7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgdmFyeWluZ3Mgb2YgdGhlIGdpdmVuIHNoYWRlciBzdGFnZSBhcyBhIFdHU0wgc3RyaW5nLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNoYWRlclN0YWdlIC0gVGhlIHNoYWRlciBzdGFnZS5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBXR1NMIHNuaXBwZXQgdGhhdCBkZWZpbmVzIHRoZSB2YXJ5aW5ncy5cclxuXHQgKi9cclxuXHRnZXRWYXJ5aW5ncyggc2hhZGVyU3RhZ2UgKSB7XHJcblxyXG5cdFx0Y29uc3Qgc25pcHBldHMgPSBbXTtcclxuXHJcblx0XHRpZiAoIHNoYWRlclN0YWdlID09PSAndmVydGV4JyApIHtcclxuXHJcblx0XHRcdHRoaXMuZ2V0QnVpbHRpbiggJ3Bvc2l0aW9uJywgJ1ZlcnRleCcsICd2ZWM0PGYzMj4nLCAndmVydGV4JyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHNoYWRlclN0YWdlID09PSAndmVydGV4JyB8fCBzaGFkZXJTdGFnZSA9PT0gJ2ZyYWdtZW50JyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHZhcnlpbmdzID0gdGhpcy52YXJ5aW5ncztcclxuXHRcdFx0Y29uc3QgdmFycyA9IHRoaXMudmFyc1sgc2hhZGVyU3RhZ2UgXTtcclxuXHJcblx0XHRcdGZvciAoIGxldCBpbmRleCA9IDA7IGluZGV4IDwgdmFyeWluZ3MubGVuZ3RoOyBpbmRleCArKyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgdmFyeWluZyA9IHZhcnlpbmdzWyBpbmRleCBdO1xyXG5cclxuXHRcdFx0XHRpZiAoIHZhcnlpbmcubmVlZHNJbnRlcnBvbGF0aW9uICkge1xyXG5cclxuXHRcdFx0XHRcdGxldCBhdHRyaWJ1dGVzU25pcHBldCA9IGBAbG9jYXRpb24oICR7aW5kZXh9IClgO1xyXG5cclxuXHRcdFx0XHRcdGlmICggL14oaW50fHVpbnR8aXZlY3x1dmVjKS8udGVzdCggdmFyeWluZy50eXBlICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRhdHRyaWJ1dGVzU25pcHBldCArPSAnIEBpbnRlcnBvbGF0ZSggZmxhdCApJztcclxuXHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHNuaXBwZXRzLnB1c2goIGAkeyBhdHRyaWJ1dGVzU25pcHBldCB9ICR7IHZhcnlpbmcubmFtZSB9IDogJHsgdGhpcy5nZXRUeXBlKCB2YXJ5aW5nLnR5cGUgKSB9YCApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCBzaGFkZXJTdGFnZSA9PT0gJ3ZlcnRleCcgJiYgdmFycy5pbmNsdWRlcyggdmFyeWluZyApID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdFx0XHR2YXJzLnB1c2goIHZhcnlpbmcgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBidWlsdGlucyA9IHRoaXMuZ2V0QnVpbHRpbnMoIHNoYWRlclN0YWdlICk7XHJcblxyXG5cdFx0aWYgKCBidWlsdGlucyApIHNuaXBwZXRzLnB1c2goIGJ1aWx0aW5zICk7XHJcblxyXG5cdFx0Y29uc3QgY29kZSA9IHNuaXBwZXRzLmpvaW4oICcsXFxuXFx0JyApO1xyXG5cclxuXHRcdHJldHVybiBzaGFkZXJTdGFnZSA9PT0gJ3ZlcnRleCcgPyB0aGlzLl9nZXRXR1NMU3RydWN0KCAnVmFyeWluZ3NTdHJ1Y3QnLCAnXFx0JyArIGNvZGUgKSA6IGNvZGU7XHJcblxyXG5cdH1cclxuXHJcblx0aXNDdXN0b21TdHJ1Y3QoIG5vZGVVbmlmb3JtICkge1xyXG5cclxuXHRcdHJldHVybiBub2RlVW5pZm9ybS52YWx1ZS5pc1N0b3JhZ2VCdWZmZXJBdHRyaWJ1dGUgJiYgbm9kZVVuaWZvcm0ubm9kZS5zdHJ1Y3RUeXBlTm9kZSAhPT0gbnVsbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSB1bmlmb3JtcyBvZiB0aGUgZ2l2ZW4gc2hhZGVyIHN0YWdlIGFzIGEgV0dTTCBzdHJpbmcuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc2hhZGVyU3RhZ2UgLSBUaGUgc2hhZGVyIHN0YWdlLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIFdHU0wgc25pcHBldCB0aGF0IGRlZmluZXMgdGhlIHVuaWZvcm1zLlxyXG5cdCAqL1xyXG5cdGdldFVuaWZvcm1zKCBzaGFkZXJTdGFnZSApIHtcclxuXHJcblx0XHRjb25zdCB1bmlmb3JtcyA9IHRoaXMudW5pZm9ybXNbIHNoYWRlclN0YWdlIF07XHJcblxyXG5cdFx0Y29uc3QgYmluZGluZ1NuaXBwZXRzID0gW107XHJcblx0XHRjb25zdCBidWZmZXJTbmlwcGV0cyA9IFtdO1xyXG5cdFx0Y29uc3Qgc3RydWN0U25pcHBldHMgPSBbXTtcclxuXHRcdGNvbnN0IHVuaWZvcm1Hcm91cHMgPSB7fTtcclxuXHJcblx0XHRmb3IgKCBjb25zdCB1bmlmb3JtIG9mIHVuaWZvcm1zICkge1xyXG5cclxuXHRcdFx0Y29uc3QgZ3JvdXBOYW1lID0gdW5pZm9ybS5ncm91cE5vZGUubmFtZTtcclxuXHRcdFx0Y29uc3QgdW5pZm9ybUluZGV4ZXMgPSB0aGlzLmJpbmRpbmdzSW5kZXhlc1sgZ3JvdXBOYW1lIF07XHJcblxyXG5cdFx0XHRpZiAoIHVuaWZvcm0udHlwZSA9PT0gJ3RleHR1cmUnIHx8IHVuaWZvcm0udHlwZSA9PT0gJ2N1YmVUZXh0dXJlJyB8fCB1bmlmb3JtLnR5cGUgPT09ICdzdG9yYWdlVGV4dHVyZScgfHwgdW5pZm9ybS50eXBlID09PSAndGV4dHVyZTNEJyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgdGV4dHVyZSA9IHVuaWZvcm0ubm9kZS52YWx1ZTtcclxuXHJcblx0XHRcdFx0aWYgKCAoIHNoYWRlclN0YWdlID09PSAnZnJhZ21lbnQnIHx8IHNoYWRlclN0YWdlID09PSAnY29tcHV0ZScgKSAmJiB0aGlzLmlzVW5maWx0ZXJhYmxlKCB0ZXh0dXJlICkgPT09IGZhbHNlICYmIHVuaWZvcm0ubm9kZS5pc1N0b3JhZ2VUZXh0dXJlTm9kZSAhPT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIHRoaXMuaXNTYW1wbGVDb21wYXJlKCB0ZXh0dXJlICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRiaW5kaW5nU25pcHBldHMucHVzaCggYEBiaW5kaW5nKCAkeyB1bmlmb3JtSW5kZXhlcy5iaW5kaW5nICsrIH0gKSBAZ3JvdXAoICR7IHVuaWZvcm1JbmRleGVzLmdyb3VwIH0gKSB2YXIgJHsgdW5pZm9ybS5uYW1lIH1fc2FtcGxlciA6IHNhbXBsZXJfY29tcGFyaXNvbjtgICk7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdGJpbmRpbmdTbmlwcGV0cy5wdXNoKCBgQGJpbmRpbmcoICR7IHVuaWZvcm1JbmRleGVzLmJpbmRpbmcgKysgfSApIEBncm91cCggJHsgdW5pZm9ybUluZGV4ZXMuZ3JvdXAgfSApIHZhciAkeyB1bmlmb3JtLm5hbWUgfV9zYW1wbGVyIDogc2FtcGxlcjtgICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGxldCB0ZXh0dXJlVHlwZTtcclxuXHJcblx0XHRcdFx0bGV0IG11bHRpc2FtcGxlZCA9ICcnO1xyXG5cclxuXHRcdFx0XHRjb25zdCB7IHByaW1hcnlTYW1wbGVzIH0gPSB0aGlzLnJlbmRlcmVyLmJhY2tlbmQudXRpbHMuZ2V0VGV4dHVyZVNhbXBsZURhdGEoIHRleHR1cmUgKTtcclxuXHJcblx0XHRcdFx0aWYgKCBwcmltYXJ5U2FtcGxlcyA+IDEgKSB7XHJcblxyXG5cdFx0XHRcdFx0bXVsdGlzYW1wbGVkID0gJ19tdWx0aXNhbXBsZWQnO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICggdGV4dHVyZS5pc0N1YmVUZXh0dXJlID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRcdHRleHR1cmVUeXBlID0gJ3RleHR1cmVfY3ViZTxmMzI+JztcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggdGV4dHVyZS5pc0RhdGFBcnJheVRleHR1cmUgPT09IHRydWUgfHwgdGV4dHVyZS5pc0NvbXByZXNzZWRBcnJheVRleHR1cmUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0dGV4dHVyZVR5cGUgPSAndGV4dHVyZV8yZF9hcnJheTxmMzI+JztcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggdGV4dHVyZS5pc0RlcHRoVGV4dHVyZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0XHR0ZXh0dXJlVHlwZSA9IGB0ZXh0dXJlX2RlcHRoJHttdWx0aXNhbXBsZWR9XzJkYDtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggdGV4dHVyZS5pc1ZpZGVvVGV4dHVyZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0XHR0ZXh0dXJlVHlwZSA9ICd0ZXh0dXJlX2V4dGVybmFsJztcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggdGV4dHVyZS5pc0RhdGEzRFRleHR1cmUgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0dGV4dHVyZVR5cGUgPSAndGV4dHVyZV8zZDxmMzI+JztcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggdW5pZm9ybS5ub2RlLmlzU3RvcmFnZVRleHR1cmVOb2RlID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGZvcm1hdCA9IGdldEZvcm1hdCggdGV4dHVyZSApO1xyXG5cdFx0XHRcdFx0Y29uc3QgYWNjZXNzID0gdGhpcy5nZXRTdG9yYWdlQWNjZXNzKCB1bmlmb3JtLm5vZGUsIHNoYWRlclN0YWdlICk7XHJcblxyXG5cdFx0XHRcdFx0dGV4dHVyZVR5cGUgPSBgdGV4dHVyZV9zdG9yYWdlXzJkPCR7IGZvcm1hdCB9LCAkeyBhY2Nlc3MgfT5gO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGNvbXBvbmVudFByZWZpeCA9IHRoaXMuZ2V0Q29tcG9uZW50VHlwZUZyb21UZXh0dXJlKCB0ZXh0dXJlICkuY2hhckF0KCAwICk7XHJcblxyXG5cdFx0XHRcdFx0dGV4dHVyZVR5cGUgPSBgdGV4dHVyZSR7IG11bHRpc2FtcGxlZCB9XzJkPCR7IGNvbXBvbmVudFByZWZpeCB9MzI+YDtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRiaW5kaW5nU25pcHBldHMucHVzaCggYEBiaW5kaW5nKCAkeyB1bmlmb3JtSW5kZXhlcy5iaW5kaW5nICsrIH0gKSBAZ3JvdXAoICR7IHVuaWZvcm1JbmRleGVzLmdyb3VwIH0gKSB2YXIgJHsgdW5pZm9ybS5uYW1lIH0gOiAkeyB0ZXh0dXJlVHlwZSB9O2AgKTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIHVuaWZvcm0udHlwZSA9PT0gJ2J1ZmZlcicgfHwgdW5pZm9ybS50eXBlID09PSAnc3RvcmFnZUJ1ZmZlcicgfHwgdW5pZm9ybS50eXBlID09PSAnaW5kaXJlY3RTdG9yYWdlQnVmZmVyJyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgYnVmZmVyTm9kZSA9IHVuaWZvcm0ubm9kZTtcclxuXHRcdFx0XHRjb25zdCBidWZmZXJUeXBlID0gdGhpcy5nZXRUeXBlKCBidWZmZXJOb2RlLmdldE5vZGVUeXBlKCB0aGlzICkgKTtcclxuXHRcdFx0XHRjb25zdCBidWZmZXJDb3VudCA9IGJ1ZmZlck5vZGUuYnVmZmVyQ291bnQ7XHJcblx0XHRcdFx0Y29uc3QgYnVmZmVyQ291bnRTbmlwcGV0ID0gYnVmZmVyQ291bnQgPiAwICYmIHVuaWZvcm0udHlwZSA9PT0gJ2J1ZmZlcicgPyAnLCAnICsgYnVmZmVyQ291bnQgOiAnJztcclxuXHRcdFx0XHRjb25zdCBidWZmZXJBY2Nlc3NNb2RlID0gYnVmZmVyTm9kZS5pc1N0b3JhZ2VCdWZmZXJOb2RlID8gYHN0b3JhZ2UsICR7IHRoaXMuZ2V0U3RvcmFnZUFjY2VzcyggYnVmZmVyTm9kZSwgc2hhZGVyU3RhZ2UgKSB9YCA6ICd1bmlmb3JtJztcclxuXHJcblx0XHRcdFx0aWYgKCB0aGlzLmlzQ3VzdG9tU3RydWN0KCB1bmlmb3JtICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0YnVmZmVyU25pcHBldHMucHVzaCggYEBiaW5kaW5nKCAkeyB1bmlmb3JtSW5kZXhlcy5iaW5kaW5nICsrIH0gKSBAZ3JvdXAoICR7IHVuaWZvcm1JbmRleGVzLmdyb3VwIH0gKSB2YXI8JHsgYnVmZmVyQWNjZXNzTW9kZSB9PiAkeyB1bmlmb3JtLm5hbWUgfSA6ICR7IGJ1ZmZlclR5cGUgfTtgICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgYnVmZmVyVHlwZVNuaXBwZXQgPSBidWZmZXJOb2RlLmlzQXRvbWljID8gYGF0b21pYzwkeyBidWZmZXJUeXBlIH0+YCA6IGAkeyBidWZmZXJUeXBlIH1gO1xyXG5cdFx0XHRcdFx0Y29uc3QgYnVmZmVyU25pcHBldCA9IGBcXHR2YWx1ZSA6IGFycmF5PCAkeyBidWZmZXJUeXBlU25pcHBldCB9JHsgYnVmZmVyQ291bnRTbmlwcGV0IH0gPmA7XHJcblxyXG5cdFx0XHRcdFx0YnVmZmVyU25pcHBldHMucHVzaCggdGhpcy5fZ2V0V0dTTFN0cnVjdEJpbmRpbmcoIHVuaWZvcm0ubmFtZSwgYnVmZmVyU25pcHBldCwgYnVmZmVyQWNjZXNzTW9kZSwgdW5pZm9ybUluZGV4ZXMuYmluZGluZyArKywgdW5pZm9ybUluZGV4ZXMuZ3JvdXAgKSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRjb25zdCB2ZWN0b3JUeXBlID0gdGhpcy5nZXRUeXBlKCB0aGlzLmdldFZlY3RvclR5cGUoIHVuaWZvcm0udHlwZSApICk7XHJcblx0XHRcdFx0Y29uc3QgZ3JvdXBOYW1lID0gdW5pZm9ybS5ncm91cE5vZGUubmFtZTtcclxuXHJcblx0XHRcdFx0Y29uc3QgZ3JvdXAgPSB1bmlmb3JtR3JvdXBzWyBncm91cE5hbWUgXSB8fCAoIHVuaWZvcm1Hcm91cHNbIGdyb3VwTmFtZSBdID0ge1xyXG5cdFx0XHRcdFx0aW5kZXg6IHVuaWZvcm1JbmRleGVzLmJpbmRpbmcgKyssXHJcblx0XHRcdFx0XHRpZDogdW5pZm9ybUluZGV4ZXMuZ3JvdXAsXHJcblx0XHRcdFx0XHRzbmlwcGV0czogW11cclxuXHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRcdGdyb3VwLnNuaXBwZXRzLnB1c2goIGBcXHQkeyB1bmlmb3JtLm5hbWUgfSA6ICR7IHZlY3RvclR5cGUgfWAgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Zm9yICggY29uc3QgbmFtZSBpbiB1bmlmb3JtR3JvdXBzICkge1xyXG5cclxuXHRcdFx0Y29uc3QgZ3JvdXAgPSB1bmlmb3JtR3JvdXBzWyBuYW1lIF07XHJcblxyXG5cdFx0XHRzdHJ1Y3RTbmlwcGV0cy5wdXNoKCB0aGlzLl9nZXRXR1NMU3RydWN0QmluZGluZyggbmFtZSwgZ3JvdXAuc25pcHBldHMuam9pbiggJyxcXG4nICksICd1bmlmb3JtJywgZ3JvdXAuaW5kZXgsIGdyb3VwLmlkICkgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0bGV0IGNvZGUgPSBiaW5kaW5nU25pcHBldHMuam9pbiggJ1xcbicgKTtcclxuXHRcdGNvZGUgKz0gYnVmZmVyU25pcHBldHMuam9pbiggJ1xcbicgKTtcclxuXHRcdGNvZGUgKz0gc3RydWN0U25pcHBldHMuam9pbiggJ1xcbicgKTtcclxuXHJcblx0XHRyZXR1cm4gY29kZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb250cm9scyB0aGUgY29kZSBidWlsZCBvZiB0aGUgc2hhZGVyIHN0YWdlcy5cclxuXHQgKi9cclxuXHRidWlsZENvZGUoKSB7XHJcblxyXG5cdFx0Y29uc3Qgc2hhZGVyc0RhdGEgPSB0aGlzLm1hdGVyaWFsICE9PSBudWxsID8geyBmcmFnbWVudDoge30sIHZlcnRleDoge30gfSA6IHsgY29tcHV0ZToge30gfTtcclxuXHJcblx0XHR0aGlzLnNvcnRCaW5kaW5nR3JvdXBzKCk7XHJcblxyXG5cdFx0Zm9yICggY29uc3Qgc2hhZGVyU3RhZ2UgaW4gc2hhZGVyc0RhdGEgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnNoYWRlclN0YWdlID0gc2hhZGVyU3RhZ2U7XHJcblxyXG5cdFx0XHRjb25zdCBzdGFnZURhdGEgPSBzaGFkZXJzRGF0YVsgc2hhZGVyU3RhZ2UgXTtcclxuXHRcdFx0c3RhZ2VEYXRhLnVuaWZvcm1zID0gdGhpcy5nZXRVbmlmb3Jtcyggc2hhZGVyU3RhZ2UgKTtcclxuXHRcdFx0c3RhZ2VEYXRhLmF0dHJpYnV0ZXMgPSB0aGlzLmdldEF0dHJpYnV0ZXMoIHNoYWRlclN0YWdlICk7XHJcblx0XHRcdHN0YWdlRGF0YS52YXJ5aW5ncyA9IHRoaXMuZ2V0VmFyeWluZ3MoIHNoYWRlclN0YWdlICk7XHJcblx0XHRcdHN0YWdlRGF0YS5zdHJ1Y3RzID0gdGhpcy5nZXRTdHJ1Y3RzKCBzaGFkZXJTdGFnZSApO1xyXG5cdFx0XHRzdGFnZURhdGEudmFycyA9IHRoaXMuZ2V0VmFycyggc2hhZGVyU3RhZ2UgKTtcclxuXHRcdFx0c3RhZ2VEYXRhLmNvZGVzID0gdGhpcy5nZXRDb2Rlcyggc2hhZGVyU3RhZ2UgKTtcclxuXHRcdFx0c3RhZ2VEYXRhLmRpcmVjdGl2ZXMgPSB0aGlzLmdldERpcmVjdGl2ZXMoIHNoYWRlclN0YWdlICk7XHJcblx0XHRcdHN0YWdlRGF0YS5zY29wZWRBcnJheXMgPSB0aGlzLmdldFNjb3BlZEFycmF5cyggc2hhZGVyU3RhZ2UgKTtcclxuXHJcblx0XHRcdC8vXHJcblxyXG5cdFx0XHRsZXQgZmxvdyA9ICcvLyBjb2RlXFxuXFxuJztcclxuXHRcdFx0ZmxvdyArPSB0aGlzLmZsb3dDb2RlWyBzaGFkZXJTdGFnZSBdO1xyXG5cclxuXHRcdFx0Y29uc3QgZmxvd05vZGVzID0gdGhpcy5mbG93Tm9kZXNbIHNoYWRlclN0YWdlIF07XHJcblx0XHRcdGNvbnN0IG1haW5Ob2RlID0gZmxvd05vZGVzWyBmbG93Tm9kZXMubGVuZ3RoIC0gMSBdO1xyXG5cclxuXHRcdFx0Y29uc3Qgb3V0cHV0Tm9kZSA9IG1haW5Ob2RlLm91dHB1dE5vZGU7XHJcblx0XHRcdGNvbnN0IGlzT3V0cHV0U3RydWN0ID0gKCBvdXRwdXROb2RlICE9PSB1bmRlZmluZWQgJiYgb3V0cHV0Tm9kZS5pc091dHB1dFN0cnVjdE5vZGUgPT09IHRydWUgKTtcclxuXHJcblx0XHRcdGZvciAoIGNvbnN0IG5vZGUgb2YgZmxvd05vZGVzICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBmbG93U2xvdERhdGEgPSB0aGlzLmdldEZsb3dEYXRhKCBub2RlLyosIHNoYWRlclN0YWdlKi8gKTtcclxuXHRcdFx0XHRjb25zdCBzbG90TmFtZSA9IG5vZGUubmFtZTtcclxuXHJcblx0XHRcdFx0aWYgKCBzbG90TmFtZSApIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGZsb3cubGVuZ3RoID4gMCApIGZsb3cgKz0gJ1xcbic7XHJcblxyXG5cdFx0XHRcdFx0ZmxvdyArPSBgXFx0Ly8gZmxvdyAtPiAkeyBzbG90TmFtZSB9XFxuYDtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRmbG93ICs9IGAkeyBmbG93U2xvdERhdGEuY29kZSB9XFxuXFx0YDtcclxuXHJcblx0XHRcdFx0aWYgKCBub2RlID09PSBtYWluTm9kZSAmJiBzaGFkZXJTdGFnZSAhPT0gJ2NvbXB1dGUnICkge1xyXG5cclxuXHRcdFx0XHRcdGZsb3cgKz0gJy8vIHJlc3VsdFxcblxcblxcdCc7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBzaGFkZXJTdGFnZSA9PT0gJ3ZlcnRleCcgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRmbG93ICs9IGB2YXJ5aW5ncy5WZXJ0ZXggPSAkeyBmbG93U2xvdERhdGEucmVzdWx0IH07YDtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKCBzaGFkZXJTdGFnZSA9PT0gJ2ZyYWdtZW50JyApIHtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggaXNPdXRwdXRTdHJ1Y3QgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdHN0YWdlRGF0YS5yZXR1cm5UeXBlID0gb3V0cHV0Tm9kZS5nZXROb2RlVHlwZSggdGhpcyApO1xyXG5cdFx0XHRcdFx0XHRcdHN0YWdlRGF0YS5zdHJ1Y3RzICs9ICd2YXI8cHJpdmF0ZT4gb3V0cHV0IDogJyArIHN0YWdlRGF0YS5yZXR1cm5UeXBlICsgJzsnO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRmbG93ICs9IGByZXR1cm4gJHsgZmxvd1Nsb3REYXRhLnJlc3VsdCB9O2A7XHJcblxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRsZXQgc3RydWN0U25pcHBldCA9ICdcXHRAbG9jYXRpb24oMCkgY29sb3I6IHZlYzQ8ZjMyPic7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGJ1aWx0aW5zID0gdGhpcy5nZXRCdWlsdGlucyggJ291dHB1dCcgKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKCBidWlsdGlucyApIHN0cnVjdFNuaXBwZXQgKz0gJyxcXG5cXHQnICsgYnVpbHRpbnM7XHJcblxyXG5cdFx0XHRcdFx0XHRcdHN0YWdlRGF0YS5yZXR1cm5UeXBlID0gJ091dHB1dFN0cnVjdCc7XHJcblx0XHRcdFx0XHRcdFx0c3RhZ2VEYXRhLnN0cnVjdHMgKz0gdGhpcy5fZ2V0V0dTTFN0cnVjdCggJ091dHB1dFN0cnVjdCcsIHN0cnVjdFNuaXBwZXQgKTtcclxuXHRcdFx0XHRcdFx0XHRzdGFnZURhdGEuc3RydWN0cyArPSAnXFxudmFyPHByaXZhdGU+IG91dHB1dCA6IE91dHB1dFN0cnVjdDsnO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRmbG93ICs9IGBvdXRwdXQuY29sb3IgPSAkeyBmbG93U2xvdERhdGEucmVzdWx0IH07XFxuXFxuXFx0cmV0dXJuIG91dHB1dDtgO1xyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0c3RhZ2VEYXRhLmZsb3cgPSBmbG93O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnNoYWRlclN0YWdlID0gbnVsbDtcclxuXHJcblx0XHRpZiAoIHRoaXMubWF0ZXJpYWwgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnZlcnRleFNoYWRlciA9IHRoaXMuX2dldFdHU0xWZXJ0ZXhDb2RlKCBzaGFkZXJzRGF0YS52ZXJ0ZXggKTtcclxuXHRcdFx0dGhpcy5mcmFnbWVudFNoYWRlciA9IHRoaXMuX2dldFdHU0xGcmFnbWVudENvZGUoIHNoYWRlcnNEYXRhLmZyYWdtZW50ICk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHRoaXMuY29tcHV0ZVNoYWRlciA9IHRoaXMuX2dldFdHU0xDb21wdXRlQ29kZSggc2hhZGVyc0RhdGEuY29tcHV0ZSwgKCB0aGlzLm9iamVjdC53b3JrZ3JvdXBTaXplIHx8IFsgNjQgXSApLmpvaW4oICcsICcgKSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBuYXRpdmUgc2hhZGVyIG1ldGhvZCBuYW1lIGZvciBhIGdpdmVuIGdlbmVyaWMgbmFtZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2QgLSBUaGUgbWV0aG9kIG5hbWUgdG8gcmVzb2x2ZS5cclxuXHQgKiBAcGFyYW0gez9zdHJpbmd9IFtvdXRwdXQ9bnVsbF0gLSBBbiBvcHRpb25hbCBvdXRwdXQuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgcmVzb2x2ZWQgV0dTTCBtZXRob2QgbmFtZS5cclxuXHQgKi9cclxuXHRnZXRNZXRob2QoIG1ldGhvZCwgb3V0cHV0ID0gbnVsbCApIHtcclxuXHJcblx0XHRsZXQgd2dzbE1ldGhvZDtcclxuXHJcblx0XHRpZiAoIG91dHB1dCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHdnc2xNZXRob2QgPSB0aGlzLl9nZXRXR1NMTWV0aG9kKCBtZXRob2QgKyAnXycgKyBvdXRwdXQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB3Z3NsTWV0aG9kID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHR3Z3NsTWV0aG9kID0gdGhpcy5fZ2V0V0dTTE1ldGhvZCggbWV0aG9kICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB3Z3NsTWV0aG9kIHx8IG1ldGhvZDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBXR1NMIHR5cGUgb2YgdGhlIGdpdmVuIG5vZGUgZGF0YSB0eXBlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBUaGUgbm9kZSBkYXRhIHR5cGUuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgV0dTTCB0eXBlLlxyXG5cdCAqL1xyXG5cdGdldFR5cGUoIHR5cGUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHdnc2xUeXBlTGliWyB0eXBlIF0gfHwgdHlwZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBXaGV0aGVyIHRoZSByZXF1ZXN0ZWQgZmVhdHVyZSBpcyBhdmFpbGFibGUgb3Igbm90LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgcmVxdWVzdGVkIGZlYXR1cmUuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgcmVxdWVzdGVkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIG9yIG5vdC5cclxuXHQgKi9cclxuXHRpc0F2YWlsYWJsZSggbmFtZSApIHtcclxuXHJcblx0XHRsZXQgcmVzdWx0ID0gc3VwcG9ydHNbIG5hbWUgXTtcclxuXHJcblx0XHRpZiAoIHJlc3VsdCA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0aWYgKCBuYW1lID09PSAnZmxvYXQzMkZpbHRlcmFibGUnICkge1xyXG5cclxuXHRcdFx0XHRyZXN1bHQgPSB0aGlzLnJlbmRlcmVyLmhhc0ZlYXR1cmUoICdmbG9hdDMyLWZpbHRlcmFibGUnICk7XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCBuYW1lID09PSAnY2xpcERpc3RhbmNlJyApIHtcclxuXHJcblx0XHRcdFx0cmVzdWx0ID0gdGhpcy5yZW5kZXJlci5oYXNGZWF0dXJlKCAnY2xpcC1kaXN0YW5jZXMnICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRzdXBwb3J0c1sgbmFtZSBdID0gcmVzdWx0O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIG5hdGl2ZSBzaGFkZXIgbWV0aG9kIG5hbWUgZm9yIGEgZ2l2ZW4gZ2VuZXJpYyBuYW1lLlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kIC0gVGhlIG1ldGhvZCBuYW1lIHRvIHJlc29sdmUuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgcmVzb2x2ZWQgV0dTTCBtZXRob2QgbmFtZS5cclxuXHQgKi9cclxuXHRfZ2V0V0dTTE1ldGhvZCggbWV0aG9kICkge1xyXG5cclxuXHRcdGlmICggd2dzbFBvbHlmaWxsWyBtZXRob2QgXSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0dGhpcy5faW5jbHVkZSggbWV0aG9kICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB3Z3NsTWV0aG9kc1sgbWV0aG9kIF07XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW5jbHVkZXMgdGhlIGdpdmVuIG1ldGhvZCBuYW1lIGludG8gdGhlIGN1cnJlbnRcclxuXHQgKiBmdW5jdGlvbiBub2RlLlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBtZXRob2QgbmFtZSB0byBpbmNsdWRlLlxyXG5cdCAqIEByZXR1cm4ge0NvZGVOb2RlfSBUaGUgcmVzcGVjdGl2ZSBjb2RlIG5vZGUuXHJcblx0ICovXHJcblx0X2luY2x1ZGUoIG5hbWUgKSB7XHJcblxyXG5cdFx0Y29uc3QgY29kZU5vZGUgPSB3Z3NsUG9seWZpbGxbIG5hbWUgXTtcclxuXHRcdGNvZGVOb2RlLmJ1aWxkKCB0aGlzICk7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmN1cnJlbnRGdW5jdGlvbk5vZGUgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHR0aGlzLmN1cnJlbnRGdW5jdGlvbk5vZGUuaW5jbHVkZXMucHVzaCggY29kZU5vZGUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGNvZGVOb2RlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBXR1NMIHZlcnRleCBzaGFkZXIgYmFzZWQgb24gdGhlIGdpdmVuIHNoYWRlciBkYXRhLlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gc2hhZGVyRGF0YSAtIFRoZSBzaGFkZXIgZGF0YS5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB2ZXJ0ZXggc2hhZGVyLlxyXG5cdCAqL1xyXG5cdF9nZXRXR1NMVmVydGV4Q29kZSggc2hhZGVyRGF0YSApIHtcclxuXHJcblx0XHRyZXR1cm4gYCR7IHRoaXMuZ2V0U2lnbmF0dXJlKCkgfVxyXG4vLyBkaXJlY3RpdmVzXHJcbiR7c2hhZGVyRGF0YS5kaXJlY3RpdmVzfVxyXG5cclxuLy8gc3RydWN0c1xyXG4ke3NoYWRlckRhdGEuc3RydWN0c31cclxuXHJcbi8vIHVuaWZvcm1zXHJcbiR7c2hhZGVyRGF0YS51bmlmb3Jtc31cclxuXHJcbi8vIHZhcnlpbmdzXHJcbiR7c2hhZGVyRGF0YS52YXJ5aW5nc31cclxudmFyPHByaXZhdGU+IHZhcnlpbmdzIDogVmFyeWluZ3NTdHJ1Y3Q7XHJcblxyXG4vLyBjb2Rlc1xyXG4ke3NoYWRlckRhdGEuY29kZXN9XHJcblxyXG5AdmVydGV4XHJcbmZuIG1haW4oICR7c2hhZGVyRGF0YS5hdHRyaWJ1dGVzfSApIC0+IFZhcnlpbmdzU3RydWN0IHtcclxuXHJcblx0Ly8gdmFyc1xyXG5cdCR7c2hhZGVyRGF0YS52YXJzfVxyXG5cclxuXHQvLyBmbG93XHJcblx0JHtzaGFkZXJEYXRhLmZsb3d9XHJcblxyXG5cdHJldHVybiB2YXJ5aW5ncztcclxuXHJcbn1cclxuYDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgV0dTTCBmcmFnbWVudCBzaGFkZXIgYmFzZWQgb24gdGhlIGdpdmVuIHNoYWRlciBkYXRhLlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gc2hhZGVyRGF0YSAtIFRoZSBzaGFkZXIgZGF0YS5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB2ZXJ0ZXggc2hhZGVyLlxyXG5cdCAqL1xyXG5cdF9nZXRXR1NMRnJhZ21lbnRDb2RlKCBzaGFkZXJEYXRhICkge1xyXG5cclxuXHRcdHJldHVybiBgJHsgdGhpcy5nZXRTaWduYXR1cmUoKSB9XHJcbi8vIGdsb2JhbFxyXG4keyBkaWFnbm9zdGljcyB9XHJcblxyXG4vLyBzdHJ1Y3RzXHJcbiR7c2hhZGVyRGF0YS5zdHJ1Y3RzfVxyXG5cclxuLy8gdW5pZm9ybXNcclxuJHtzaGFkZXJEYXRhLnVuaWZvcm1zfVxyXG5cclxuLy8gY29kZXNcclxuJHtzaGFkZXJEYXRhLmNvZGVzfVxyXG5cclxuQGZyYWdtZW50XHJcbmZuIG1haW4oICR7c2hhZGVyRGF0YS52YXJ5aW5nc30gKSAtPiAke3NoYWRlckRhdGEucmV0dXJuVHlwZX0ge1xyXG5cclxuXHQvLyB2YXJzXHJcblx0JHtzaGFkZXJEYXRhLnZhcnN9XHJcblxyXG5cdC8vIGZsb3dcclxuXHQke3NoYWRlckRhdGEuZmxvd31cclxuXHJcbn1cclxuYDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgV0dTTCBjb21wdXRlIHNoYWRlciBiYXNlZCBvbiB0aGUgZ2l2ZW4gc2hhZGVyIGRhdGEuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBzaGFkZXJEYXRhIC0gVGhlIHNoYWRlciBkYXRhLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB3b3JrZ3JvdXBTaXplIC0gVGhlIHdvcmtncm91cCBzaXplLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHZlcnRleCBzaGFkZXIuXHJcblx0ICovXHJcblx0X2dldFdHU0xDb21wdXRlQ29kZSggc2hhZGVyRGF0YSwgd29ya2dyb3VwU2l6ZSApIHtcclxuXHJcblx0XHRyZXR1cm4gYCR7IHRoaXMuZ2V0U2lnbmF0dXJlKCkgfVxyXG4vLyBkaXJlY3RpdmVzXHJcbiR7c2hhZGVyRGF0YS5kaXJlY3RpdmVzfVxyXG5cclxuLy8gc3lzdGVtXHJcbnZhcjxwcml2YXRlPiBpbnN0YW5jZUluZGV4IDogdTMyO1xyXG5cclxuLy8gbG9jYWxzXHJcbiR7c2hhZGVyRGF0YS5zY29wZWRBcnJheXN9XHJcblxyXG4vLyBzdHJ1Y3RzXHJcbiR7c2hhZGVyRGF0YS5zdHJ1Y3RzfVxyXG5cclxuLy8gdW5pZm9ybXNcclxuJHtzaGFkZXJEYXRhLnVuaWZvcm1zfVxyXG5cclxuLy8gY29kZXNcclxuJHtzaGFkZXJEYXRhLmNvZGVzfVxyXG5cclxuQGNvbXB1dGUgQHdvcmtncm91cF9zaXplKCAke3dvcmtncm91cFNpemV9IClcclxuZm4gbWFpbiggJHtzaGFkZXJEYXRhLmF0dHJpYnV0ZXN9ICkge1xyXG5cclxuXHQvLyBzeXN0ZW1cclxuXHRpbnN0YW5jZUluZGV4ID0gZ2xvYmFsSWQueCArIGdsb2JhbElkLnkgKiBudW1Xb3JrZ3JvdXBzLnggKiB1MzIoJHt3b3JrZ3JvdXBTaXplfSkgKyBnbG9iYWxJZC56ICogbnVtV29ya2dyb3Vwcy54ICogbnVtV29ya2dyb3Vwcy55ICogdTMyKCR7d29ya2dyb3VwU2l6ZX0pO1xyXG5cclxuXHQvLyB2YXJzXHJcblx0JHtzaGFkZXJEYXRhLnZhcnN9XHJcblxyXG5cdC8vIGZsb3dcclxuXHQke3NoYWRlckRhdGEuZmxvd31cclxuXHJcbn1cclxuYDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgV0dTTCBzdHJ1Y3QgYmFzZWQgb24gdGhlIGdpdmVuIG5hbWUgYW5kIHZhcmlhYmxlcy5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgc3RydWN0IG5hbWUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHZhcnMgLSBUaGUgc3RydWN0IHZhcmlhYmxlcy5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBXR1NMIHNuaXBwZXQgcmVwcmVzZW50aW5nIGEgc3RydWN0LlxyXG5cdCAqL1xyXG5cdF9nZXRXR1NMU3RydWN0KCBuYW1lLCB2YXJzICkge1xyXG5cclxuXHRcdHJldHVybiBgXHJcbnN0cnVjdCAke25hbWV9IHtcclxuJHt2YXJzfVxyXG59O2A7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhIFdHU0wgc3RydWN0IGJpbmRpbmcuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIHN0cnVjdCBuYW1lLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB2YXJzIC0gVGhlIHN0cnVjdCB2YXJpYWJsZXMuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGFjY2VzcyAtIFRoZSBhY2Nlc3MuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtiaW5kaW5nPTBdIC0gVGhlIGJpbmRpbmcgaW5kZXguXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtncm91cD0wXSAtIFRoZSBncm91cCBpbmRleC5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBXR1NMIHNuaXBwZXQgcmVwcmVzZW50aW5nIGEgc3RydWN0IGJpbmRpbmcuXHJcblx0ICovXHJcblx0X2dldFdHU0xTdHJ1Y3RCaW5kaW5nKCBuYW1lLCB2YXJzLCBhY2Nlc3MsIGJpbmRpbmcgPSAwLCBncm91cCA9IDAgKSB7XHJcblxyXG5cdFx0Y29uc3Qgc3RydWN0TmFtZSA9IG5hbWUgKyAnU3RydWN0JztcclxuXHRcdGNvbnN0IHN0cnVjdFNuaXBwZXQgPSB0aGlzLl9nZXRXR1NMU3RydWN0KCBzdHJ1Y3ROYW1lLCB2YXJzICk7XHJcblxyXG5cdFx0cmV0dXJuIGAke3N0cnVjdFNuaXBwZXR9XHJcbkBiaW5kaW5nKCAkeyBiaW5kaW5nIH0gKSBAZ3JvdXAoICR7IGdyb3VwIH0gKVxyXG52YXI8JHthY2Nlc3N9PiAkeyBuYW1lIH0gOiAkeyBzdHJ1Y3ROYW1lIH07YDtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgV0dTTE5vZGVCdWlsZGVyO1xyXG4iLCJpbXBvcnQgeyBIYWxmRmxvYXRUeXBlLCBVbnNpZ25lZEJ5dGVUeXBlIH0gZnJvbSAnLi4vLi4vLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgR1BVUHJpbWl0aXZlVG9wb2xvZ3ksIEdQVVRleHR1cmVGb3JtYXQgfSBmcm9tICcuL1dlYkdQVUNvbnN0YW50cy5qcyc7XHJcblxyXG4vKipcclxuICogQSBXZWJHUFUgYmFja2VuZCB1dGlsaXR5IG1vZHVsZSB3aXRoIGNvbW1vbiBoZWxwZXJzLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuY2xhc3MgV2ViR1BVVXRpbHMge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHV0aWxpdHkgb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHUFVCYWNrZW5kfSBiYWNrZW5kIC0gVGhlIFdlYkdQVSBiYWNrZW5kLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBiYWNrZW5kICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIFdlYkdQVSBiYWNrZW5kLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtXZWJHUFVCYWNrZW5kfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJhY2tlbmQgPSBiYWNrZW5kO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGRlcHRoL3N0ZW5jaWwgR1BVIGZvcm1hdCBmb3IgdGhlIGdpdmVuIHJlbmRlciBjb250ZXh0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSZW5kZXJDb250ZXh0fSByZW5kZXJDb250ZXh0IC0gVGhlIHJlbmRlciBjb250ZXh0LlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGRlcHRoL3N0ZW5jaWwgR1BVIHRleHR1cmUgZm9ybWF0LlxyXG5cdCAqL1xyXG5cdGdldEN1cnJlbnREZXB0aFN0ZW5jaWxGb3JtYXQoIHJlbmRlckNvbnRleHQgKSB7XHJcblxyXG5cdFx0bGV0IGZvcm1hdDtcclxuXHJcblx0XHRpZiAoIHJlbmRlckNvbnRleHQuZGVwdGhUZXh0dXJlICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0Zm9ybWF0ID0gdGhpcy5nZXRUZXh0dXJlRm9ybWF0R1BVKCByZW5kZXJDb250ZXh0LmRlcHRoVGV4dHVyZSApO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHJlbmRlckNvbnRleHQuZGVwdGggJiYgcmVuZGVyQ29udGV4dC5zdGVuY2lsICkge1xyXG5cclxuXHRcdFx0Zm9ybWF0ID0gR1BVVGV4dHVyZUZvcm1hdC5EZXB0aDI0UGx1c1N0ZW5jaWw4O1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHJlbmRlckNvbnRleHQuZGVwdGggKSB7XHJcblxyXG5cdFx0XHRmb3JtYXQgPSBHUFVUZXh0dXJlRm9ybWF0LkRlcHRoMjRQbHVzO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZm9ybWF0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIEdQVSBmb3JtYXQgZm9yIHRoZSBnaXZlbiB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgR1BVIHRleHR1cmUgZm9ybWF0LlxyXG5cdCAqL1xyXG5cdGdldFRleHR1cmVGb3JtYXRHUFUoIHRleHR1cmUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuYmFja2VuZC5nZXQoIHRleHR1cmUgKS5mb3JtYXQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhbiBvYmplY3QgdGhhdCBkZWZpbmVzIHRoZSBtdWx0aS1zYW1wbGluZyBzdGF0ZSBvZiB0aGUgZ2l2ZW4gdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdH0gVGhlIG11bHRpLXNhbXBsaW5nIHN0YXRlLlxyXG5cdCAqL1xyXG5cdGdldFRleHR1cmVTYW1wbGVEYXRhKCB0ZXh0dXJlICkge1xyXG5cclxuXHRcdGxldCBzYW1wbGVzO1xyXG5cclxuXHRcdGlmICggdGV4dHVyZS5pc0ZyYW1lYnVmZmVyVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdHNhbXBsZXMgPSAxO1xyXG5cclxuXHRcdH0gZWxzZSBpZiAoIHRleHR1cmUuaXNEZXB0aFRleHR1cmUgJiYgISB0ZXh0dXJlLnJlbmRlclRhcmdldCApIHtcclxuXHJcblx0XHRcdGNvbnN0IHJlbmRlcmVyID0gdGhpcy5iYWNrZW5kLnJlbmRlcmVyO1xyXG5cdFx0XHRjb25zdCByZW5kZXJUYXJnZXQgPSByZW5kZXJlci5nZXRSZW5kZXJUYXJnZXQoKTtcclxuXHJcblx0XHRcdHNhbXBsZXMgPSByZW5kZXJUYXJnZXQgPyByZW5kZXJUYXJnZXQuc2FtcGxlcyA6IHJlbmRlcmVyLnNhbXBsZXM7XHJcblxyXG5cdFx0fSBlbHNlIGlmICggdGV4dHVyZS5yZW5kZXJUYXJnZXQgKSB7XHJcblxyXG5cdFx0XHRzYW1wbGVzID0gdGV4dHVyZS5yZW5kZXJUYXJnZXQuc2FtcGxlcztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0c2FtcGxlcyA9IHNhbXBsZXMgfHwgMTtcclxuXHJcblx0XHRjb25zdCBpc01TQUEgPSBzYW1wbGVzID4gMSAmJiB0ZXh0dXJlLnJlbmRlclRhcmdldCAhPT0gbnVsbCAmJiAoIHRleHR1cmUuaXNEZXB0aFRleHR1cmUgIT09IHRydWUgJiYgdGV4dHVyZS5pc0ZyYW1lYnVmZmVyVGV4dHVyZSAhPT0gdHJ1ZSApO1xyXG5cdFx0Y29uc3QgcHJpbWFyeVNhbXBsZXMgPSBpc01TQUEgPyAxIDogc2FtcGxlcztcclxuXHJcblx0XHRyZXR1cm4geyBzYW1wbGVzLCBwcmltYXJ5U2FtcGxlcywgaXNNU0FBIH07XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgZGVmYXVsdCBjb2xvciBhdHRhY2htZW50J3MgR1BVIGZvcm1hdCBvZiB0aGUgY3VycmVudCByZW5kZXIgY29udGV4dC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyQ29udGV4dH0gcmVuZGVyQ29udGV4dCAtIFRoZSByZW5kZXIgY29udGV4dC5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBHUFUgdGV4dHVyZSBmb3JtYXQgb2YgdGhlIGRlZmF1bHQgY29sb3IgYXR0YWNobWVudC5cclxuXHQgKi9cclxuXHRnZXRDdXJyZW50Q29sb3JGb3JtYXQoIHJlbmRlckNvbnRleHQgKSB7XHJcblxyXG5cdFx0bGV0IGZvcm1hdDtcclxuXHJcblx0XHRpZiAoIHJlbmRlckNvbnRleHQudGV4dHVyZXMgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRmb3JtYXQgPSB0aGlzLmdldFRleHR1cmVGb3JtYXRHUFUoIHJlbmRlckNvbnRleHQudGV4dHVyZXNbIDAgXSApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRmb3JtYXQgPSB0aGlzLmdldFByZWZlcnJlZENhbnZhc0Zvcm1hdCgpOyAvLyBkZWZhdWx0IGNvbnRleHQgZm9ybWF0XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBmb3JtYXQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgb3V0cHV0IGNvbG9yIHNwYWNlIG9mIHRoZSBjdXJyZW50IHJlbmRlciBjb250ZXh0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSZW5kZXJDb250ZXh0fSByZW5kZXJDb250ZXh0IC0gVGhlIHJlbmRlciBjb250ZXh0LlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG91dHB1dCBjb2xvciBzcGFjZS5cclxuXHQgKi9cclxuXHRnZXRDdXJyZW50Q29sb3JTcGFjZSggcmVuZGVyQ29udGV4dCApIHtcclxuXHJcblx0XHRpZiAoIHJlbmRlckNvbnRleHQudGV4dHVyZXMgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gcmVuZGVyQ29udGV4dC50ZXh0dXJlc1sgMCBdLmNvbG9yU3BhY2U7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzLmJhY2tlbmQucmVuZGVyZXIub3V0cHV0Q29sb3JTcGFjZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIEdQVSBwcmltaXRpdmUgdG9wb2xvZ3kgZm9yIHRoZSBnaXZlbiBvYmplY3QgYW5kIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3QzRH0gb2JqZWN0IC0gVGhlIDNEIG9iamVjdC5cclxuXHQgKiBAcGFyYW0ge01hdGVyaWFsfSBtYXRlcmlhbCAtIFRoZSBtYXRlcmlhbC5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBHUFUgcHJpbWl0aXZlIHRvcG9sb2d5LlxyXG5cdCAqL1xyXG5cdGdldFByaW1pdGl2ZVRvcG9sb2d5KCBvYmplY3QsIG1hdGVyaWFsICkge1xyXG5cclxuXHRcdGlmICggb2JqZWN0LmlzUG9pbnRzICkgcmV0dXJuIEdQVVByaW1pdGl2ZVRvcG9sb2d5LlBvaW50TGlzdDtcclxuXHRcdGVsc2UgaWYgKCBvYmplY3QuaXNMaW5lU2VnbWVudHMgfHwgKCBvYmplY3QuaXNNZXNoICYmIG1hdGVyaWFsLndpcmVmcmFtZSA9PT0gdHJ1ZSApICkgcmV0dXJuIEdQVVByaW1pdGl2ZVRvcG9sb2d5LkxpbmVMaXN0O1xyXG5cdFx0ZWxzZSBpZiAoIG9iamVjdC5pc0xpbmUgKSByZXR1cm4gR1BVUHJpbWl0aXZlVG9wb2xvZ3kuTGluZVN0cmlwO1xyXG5cdFx0ZWxzZSBpZiAoIG9iamVjdC5pc01lc2ggKSByZXR1cm4gR1BVUHJpbWl0aXZlVG9wb2xvZ3kuVHJpYW5nbGVMaXN0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBtb2RpZmllZCBzYW1wbGUgY291bnQgZnJvbSB0aGUgZ2l2ZW4gc2FtcGxlIGNvdW50IHZhbHVlLlxyXG5cdCAqXHJcblx0ICogVGhhdCBpcyByZXF1aXJlZCBzaW5jZSBXZWJHUFUgZG9lcyBub3Qgc3VwcG9ydCBhcmJpdHJhcnkgc2FtcGxlIGNvdW50cy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzYW1wbGVDb3VudCAtIFRoZSBpbnB1dCBzYW1wbGUgY291bnQuXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgKHBvdGVudGlhbGx5IHVwZGF0ZWQpIG91dHB1dCBzYW1wbGUgY291bnQuXHJcblx0ICovXHJcblx0Z2V0U2FtcGxlQ291bnQoIHNhbXBsZUNvdW50ICkge1xyXG5cclxuXHRcdGxldCBjb3VudCA9IDE7XHJcblxyXG5cdFx0aWYgKCBzYW1wbGVDb3VudCA+IDEgKSB7XHJcblxyXG5cdFx0XHQvLyBXZWJHUFUgb25seSBzdXBwb3J0cyBwb3dlci1vZi10d28gc2FtcGxlIGNvdW50cyBhbmQgMiBpcyBub3QgYSB2YWxpZCB2YWx1ZVxyXG5cdFx0XHRjb3VudCA9IE1hdGgucG93KCAyLCBNYXRoLmZsb29yKCBNYXRoLmxvZzIoIHNhbXBsZUNvdW50ICkgKSApO1xyXG5cclxuXHRcdFx0aWYgKCBjb3VudCA9PT0gMiApIHtcclxuXHJcblx0XHRcdFx0Y291bnQgPSA0O1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gY291bnQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgc2FtcGxlIGNvdW50IG9mIHRoZSBnaXZlbiByZW5kZXIgY29udGV4dC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyQ29udGV4dH0gcmVuZGVyQ29udGV4dCAtIFRoZSByZW5kZXIgY29udGV4dC5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBzYW1wbGUgY291bnQuXHJcblx0ICovXHJcblx0Z2V0U2FtcGxlQ291bnRSZW5kZXJDb250ZXh0KCByZW5kZXJDb250ZXh0ICkge1xyXG5cclxuXHRcdGlmICggcmVuZGVyQ29udGV4dC50ZXh0dXJlcyAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdHJldHVybiB0aGlzLmdldFNhbXBsZUNvdW50KCByZW5kZXJDb250ZXh0LnNhbXBsZUNvdW50ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzLmdldFNhbXBsZUNvdW50KCB0aGlzLmJhY2tlbmQucmVuZGVyZXIuc2FtcGxlcyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHByZWZlcnJlZCBjYW52YXMgZm9ybWF0LlxyXG5cdCAqXHJcblx0ICogVGhlcmUgaXMgYSBzZXBhcmF0ZSBtZXRob2QgZm9yIHRoaXMgc28gaXQncyBwb3NzaWJsZSB0b1xyXG5cdCAqIGhvbm9yIGVkZ2UgY2FzZXMgZm9yIHNwZWNpZmljIGRldmljZXMuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBHUFUgdGV4dHVyZSBmb3JtYXQgb2YgdGhlIGNhbnZhcy5cclxuXHQgKi9cclxuXHRnZXRQcmVmZXJyZWRDYW52YXNGb3JtYXQoKSB7XHJcblxyXG5cdFx0Y29uc3Qgb3V0cHV0VHlwZSA9IHRoaXMuYmFja2VuZC5wYXJhbWV0ZXJzLm91dHB1dFR5cGU7XHJcblxyXG5cdFx0aWYgKCBvdXRwdXRUeXBlID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gbmF2aWdhdG9yLmdwdS5nZXRQcmVmZXJyZWRDYW52YXNGb3JtYXQoKTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBvdXRwdXRUeXBlID09PSBVbnNpZ25lZEJ5dGVUeXBlICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIEdQVVRleHR1cmVGb3JtYXQuQkdSQThVbm9ybTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCBvdXRwdXRUeXBlID09PSBIYWxmRmxvYXRUeXBlICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIEdQVVRleHR1cmVGb3JtYXQuUkdCQTE2RmxvYXQ7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHRocm93IG5ldyBFcnJvciggJ1Vuc3VwcG9ydGVkIG91dHB1dFR5cGUnICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBXZWJHUFVVdGlscztcclxuIiwiaW1wb3J0IHsgR1BVSW5wdXRTdGVwTW9kZSB9IGZyb20gJy4vV2ViR1BVQ29uc3RhbnRzLmpzJztcclxuXHJcbmltcG9ydCB7IEZsb2F0MTZCdWZmZXJBdHRyaWJ1dGUgfSBmcm9tICcuLi8uLi8uLi9jb3JlL0J1ZmZlckF0dHJpYnV0ZS5qcyc7XHJcblxyXG5jb25zdCB0eXBlZEFycmF5c1RvVmVydGV4Rm9ybWF0UHJlZml4ID0gbmV3IE1hcCggW1xyXG5cdFsgSW50OEFycmF5LCBbICdzaW50OCcsICdzbm9ybTgnIF1dLFxyXG5cdFsgVWludDhBcnJheSwgWyAndWludDgnLCAndW5vcm04JyBdXSxcclxuXHRbIEludDE2QXJyYXksIFsgJ3NpbnQxNicsICdzbm9ybTE2JyBdXSxcclxuXHRbIFVpbnQxNkFycmF5LCBbICd1aW50MTYnLCAndW5vcm0xNicgXV0sXHJcblx0WyBJbnQzMkFycmF5LCBbICdzaW50MzInLCAnc25vcm0zMicgXV0sXHJcblx0WyBVaW50MzJBcnJheSwgWyAndWludDMyJywgJ3Vub3JtMzInIF1dLFxyXG5cdFsgRmxvYXQzMkFycmF5LCBbICdmbG9hdDMyJywgXV0sXHJcbl0gKTtcclxuXHJcbmNvbnN0IHR5cGVkQXR0cmlidXRlVG9WZXJ0ZXhGb3JtYXRQcmVmaXggPSBuZXcgTWFwKCBbXHJcblx0WyBGbG9hdDE2QnVmZmVyQXR0cmlidXRlLCBbICdmbG9hdDE2JywgXV0sXHJcbl0gKTtcclxuXHJcbmNvbnN0IHR5cGVBcnJheXNUb1ZlcnRleEZvcm1hdFByZWZpeEZvckl0ZW1TaXplMSA9IG5ldyBNYXAoIFtcclxuXHRbIEludDMyQXJyYXksICdzaW50MzInIF0sXHJcblx0WyBJbnQxNkFycmF5LCAnc2ludDMyJyBdLCAvLyBwYXRjaCBmb3IgSU5UMTZcclxuXHRbIFVpbnQzMkFycmF5LCAndWludDMyJyBdLFxyXG5cdFsgVWludDE2QXJyYXksICd1aW50MzInIF0sIC8vIHBhdGNoIGZvciBVSU5UMTZcclxuXHRbIEZsb2F0MzJBcnJheSwgJ2Zsb2F0MzInIF1cclxuXSApO1xyXG5cclxuLyoqXHJcbiAqIEEgV2ViR1BVIGJhY2tlbmQgdXRpbGl0eSBtb2R1bGUgZm9yIG1hbmFnaW5nIHNoYWRlciBhdHRyaWJ1dGVzLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuY2xhc3MgV2ViR1BVQXR0cmlidXRlVXRpbHMge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHV0aWxpdHkgb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHUFVCYWNrZW5kfSBiYWNrZW5kIC0gVGhlIFdlYkdQVSBiYWNrZW5kLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBiYWNrZW5kICkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZWZlcmVuY2UgdG8gdGhlIFdlYkdQVSBiYWNrZW5kLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtXZWJHUFVCYWNrZW5kfVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJhY2tlbmQgPSBiYWNrZW5kO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgdGhlIEdQVSBidWZmZXIgZm9yIHRoZSBnaXZlbiBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCdWZmZXJBdHRyaWJ1dGV9IGF0dHJpYnV0ZSAtIFRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqIEBwYXJhbSB7R1BVQnVmZmVyVXNhZ2V9IHVzYWdlIC0gQSBmbGFnIHRoYXQgaW5kaWNhdGVzIGhvdyB0aGUgYnVmZmVyIG1heSBiZSB1c2VkIGFmdGVyIGl0cyBjcmVhdGlvbi5cclxuXHQgKi9cclxuXHRjcmVhdGVBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgdXNhZ2UgKSB7XHJcblxyXG5cdFx0Y29uc3QgYnVmZmVyQXR0cmlidXRlID0gdGhpcy5fZ2V0QnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUgKTtcclxuXHJcblx0XHRjb25zdCBiYWNrZW5kID0gdGhpcy5iYWNrZW5kO1xyXG5cdFx0Y29uc3QgYnVmZmVyRGF0YSA9IGJhY2tlbmQuZ2V0KCBidWZmZXJBdHRyaWJ1dGUgKTtcclxuXHJcblx0XHRsZXQgYnVmZmVyID0gYnVmZmVyRGF0YS5idWZmZXI7XHJcblxyXG5cdFx0aWYgKCBidWZmZXIgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGRldmljZSA9IGJhY2tlbmQuZGV2aWNlO1xyXG5cclxuXHRcdFx0bGV0IGFycmF5ID0gYnVmZmVyQXR0cmlidXRlLmFycmF5O1xyXG5cclxuXHRcdFx0Ly8gcGF0Y2ggZm9yIElOVDE2IGFuZCBVSU5UMTZcclxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUubm9ybWFsaXplZCA9PT0gZmFsc2UgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggYXJyYXkuY29uc3RydWN0b3IgPT09IEludDE2QXJyYXkgfHwgYXJyYXkuY29uc3RydWN0b3IgPT09IEludDhBcnJheSApIHtcclxuXHJcblx0XHRcdFx0XHRhcnJheSA9IG5ldyBJbnQzMkFycmF5KCBhcnJheSApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCBhcnJheS5jb25zdHJ1Y3RvciA9PT0gVWludDE2QXJyYXkgfHwgYXJyYXkuY29uc3RydWN0b3IgPT09IFVpbnQ4QXJyYXkgKSB7XHJcblxyXG5cdFx0XHRcdFx0YXJyYXkgPSBuZXcgVWludDMyQXJyYXkoIGFycmF5ICk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCB1c2FnZSAmIEdQVUJ1ZmZlclVzYWdlLklOREVYICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoIGFycmF5WyBpIF0gPT09IDB4ZmZmZiApIGFycmF5WyBpIF0gPSAweGZmZmZmZmZmOyAvLyB1c2UgY29ycmVjdCBwcmltaXRpdmUgcmVzdGFydCBpbmRleFxyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0YnVmZmVyQXR0cmlidXRlLmFycmF5ID0gYXJyYXk7XHJcblxyXG5cdFx0XHRpZiAoICggYnVmZmVyQXR0cmlidXRlLmlzU3RvcmFnZUJ1ZmZlckF0dHJpYnV0ZSB8fCBidWZmZXJBdHRyaWJ1dGUuaXNTdG9yYWdlSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlICkgJiYgYnVmZmVyQXR0cmlidXRlLml0ZW1TaXplID09PSAzICkge1xyXG5cclxuXHRcdFx0XHRhcnJheSA9IG5ldyBhcnJheS5jb25zdHJ1Y3RvciggYnVmZmVyQXR0cmlidXRlLmNvdW50ICogNCApO1xyXG5cclxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBidWZmZXJBdHRyaWJ1dGUuY291bnQ7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0YXJyYXkuc2V0KCBidWZmZXJBdHRyaWJ1dGUuYXJyYXkuc3ViYXJyYXkoIGkgKiAzLCBpICogMyArIDMgKSwgaSAqIDQgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyBVcGRhdGUgQnVmZmVyQXR0cmlidXRlXHJcblx0XHRcdFx0YnVmZmVyQXR0cmlidXRlLml0ZW1TaXplID0gNDtcclxuXHRcdFx0XHRidWZmZXJBdHRyaWJ1dGUuYXJyYXkgPSBhcnJheTtcclxuXHJcblx0XHRcdFx0YnVmZmVyRGF0YS5fZm9yY2UzdG80Qnl0ZXNBbGlnbm1lbnQgPSB0cnVlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3Qgc2l6ZSA9IGFycmF5LmJ5dGVMZW5ndGggKyAoICggNCAtICggYXJyYXkuYnl0ZUxlbmd0aCAlIDQgKSApICUgNCApOyAvLyBlbnN1cmUgNCBieXRlIGFsaWdubWVudCwgc2VlICMyMDQ0MVxyXG5cclxuXHRcdFx0YnVmZmVyID0gZGV2aWNlLmNyZWF0ZUJ1ZmZlcigge1xyXG5cdFx0XHRcdGxhYmVsOiBidWZmZXJBdHRyaWJ1dGUubmFtZSxcclxuXHRcdFx0XHRzaXplOiBzaXplLFxyXG5cdFx0XHRcdHVzYWdlOiB1c2FnZSxcclxuXHRcdFx0XHRtYXBwZWRBdENyZWF0aW9uOiB0cnVlXHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHRcdG5ldyBhcnJheS5jb25zdHJ1Y3RvciggYnVmZmVyLmdldE1hcHBlZFJhbmdlKCkgKS5zZXQoIGFycmF5ICk7XHJcblxyXG5cdFx0XHRidWZmZXIudW5tYXAoKTtcclxuXHJcblx0XHRcdGJ1ZmZlckRhdGEuYnVmZmVyID0gYnVmZmVyO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoZSBHUFUgYnVmZmVyIG9mIHRoZSBnaXZlbiBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCdWZmZXJBdHRyaWJ1dGV9IGF0dHJpYnV0ZSAtIFRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZUF0dHJpYnV0ZSggYXR0cmlidXRlICkge1xyXG5cclxuXHRcdGNvbnN0IGJ1ZmZlckF0dHJpYnV0ZSA9IHRoaXMuX2dldEJ1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlICk7XHJcblxyXG5cdFx0Y29uc3QgYmFja2VuZCA9IHRoaXMuYmFja2VuZDtcclxuXHRcdGNvbnN0IGRldmljZSA9IGJhY2tlbmQuZGV2aWNlO1xyXG5cclxuXHRcdGNvbnN0IGJ1ZmZlckRhdGEgPSBiYWNrZW5kLmdldCggYnVmZmVyQXR0cmlidXRlICk7XHJcblx0XHRjb25zdCBidWZmZXIgPSBiYWNrZW5kLmdldCggYnVmZmVyQXR0cmlidXRlICkuYnVmZmVyO1xyXG5cclxuXHRcdGxldCBhcnJheSA9IGJ1ZmZlckF0dHJpYnV0ZS5hcnJheTtcclxuXHJcblx0XHQvLyAgaWYgc3RvcmFnZSBidWZmZXIgZW5zdXJlIDQgYnl0ZSBhbGlnbm1lbnRcclxuXHRcdGlmICggYnVmZmVyRGF0YS5fZm9yY2UzdG80Qnl0ZXNBbGlnbm1lbnQgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRhcnJheSA9IG5ldyBhcnJheS5jb25zdHJ1Y3RvciggYnVmZmVyQXR0cmlidXRlLmNvdW50ICogNCApO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgYnVmZmVyQXR0cmlidXRlLmNvdW50OyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRhcnJheS5zZXQoIGJ1ZmZlckF0dHJpYnV0ZS5hcnJheS5zdWJhcnJheSggaSAqIDMsIGkgKiAzICsgMyApLCBpICogNCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0YnVmZmVyQXR0cmlidXRlLmFycmF5ID0gYXJyYXk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHJcblx0XHRjb25zdCBpc1R5cGVkQXJyYXkgPSB0aGlzLl9pc1R5cGVkQXJyYXkoIGFycmF5ICk7XHJcblx0XHRjb25zdCB1cGRhdGVSYW5nZXMgPSBidWZmZXJBdHRyaWJ1dGUudXBkYXRlUmFuZ2VzO1xyXG5cclxuXHRcdGlmICggdXBkYXRlUmFuZ2VzLmxlbmd0aCA9PT0gMCApIHtcclxuXHJcblx0XHRcdC8vIE5vdCB1c2luZyB1cGRhdGUgcmFuZ2VzXHJcblxyXG5cdFx0XHRkZXZpY2UucXVldWUud3JpdGVCdWZmZXIoXHJcblx0XHRcdFx0YnVmZmVyLFxyXG5cdFx0XHRcdDAsXHJcblx0XHRcdFx0YXJyYXksXHJcblx0XHRcdFx0MFxyXG5cdFx0XHQpO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRjb25zdCBieXRlT2Zmc2V0RmFjdG9yID0gaXNUeXBlZEFycmF5ID8gMSA6IGFycmF5LkJZVEVTX1BFUl9FTEVNRU5UO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gdXBkYXRlUmFuZ2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHJhbmdlID0gdXBkYXRlUmFuZ2VzWyBpIF07XHJcblx0XHRcdFx0bGV0IGRhdGFPZmZzZXQsIHNpemU7XHJcblxyXG5cdFx0XHRcdGlmICggYnVmZmVyRGF0YS5fZm9yY2UzdG80Qnl0ZXNBbGlnbm1lbnQgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgdmVydGV4U3RhcnQgPSBNYXRoLmZsb29yKCByYW5nZS5zdGFydCAvIDMgKTtcclxuXHRcdFx0XHRcdGNvbnN0IHZlcnRleENvdW50ID0gTWF0aC5jZWlsKCByYW5nZS5jb3VudCAvIDMgKTtcclxuXHRcdFx0XHRcdGRhdGFPZmZzZXQgPSB2ZXJ0ZXhTdGFydCAqIDQgKiBieXRlT2Zmc2V0RmFjdG9yO1xyXG5cdFx0XHRcdFx0c2l6ZSA9IHZlcnRleENvdW50ICogNCAqIGJ5dGVPZmZzZXRGYWN0b3I7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0ZGF0YU9mZnNldCA9IHJhbmdlLnN0YXJ0ICogYnl0ZU9mZnNldEZhY3RvcjtcclxuXHRcdFx0XHRcdHNpemUgPSByYW5nZS5jb3VudCAqIGJ5dGVPZmZzZXRGYWN0b3I7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Y29uc3QgYnVmZmVyT2Zmc2V0ID0gZGF0YU9mZnNldCAqICggaXNUeXBlZEFycmF5ID8gYXJyYXkuQllURVNfUEVSX0VMRU1FTlQgOiAxICk7IC8vIGJ1ZmZlck9mZnNldCBpcyBhbHdheXMgaW4gYnl0ZXNcclxuXHJcblx0XHRcdFx0ZGV2aWNlLnF1ZXVlLndyaXRlQnVmZmVyKFxyXG5cdFx0XHRcdFx0YnVmZmVyLFxyXG5cdFx0XHRcdFx0YnVmZmVyT2Zmc2V0LFxyXG5cdFx0XHRcdFx0YXJyYXksXHJcblx0XHRcdFx0XHRkYXRhT2Zmc2V0LFxyXG5cdFx0XHRcdFx0c2l6ZVxyXG5cdFx0XHRcdCk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRidWZmZXJBdHRyaWJ1dGUuY2xlYXJVcGRhdGVSYW5nZXMoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhpcyBtZXRob2QgY3JlYXRlcyB0aGUgdmVydGV4IGJ1ZmZlciBsYXlvdXQgZGF0YSB3aGljaCBhcmVcclxuXHQgKiByZXF1aXJlIHdoZW4gY3JlYXRpbmcgYSByZW5kZXIgcGlwZWxpbmUgZm9yIHRoZSBnaXZlbiByZW5kZXIgb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSZW5kZXJPYmplY3R9IHJlbmRlck9iamVjdCAtIFRoZSByZW5kZXIgb2JqZWN0LlxyXG5cdCAqIEByZXR1cm4ge0FycmF5PE9iamVjdD59IEFuIGFycmF5IGhvbGRpbmcgb2JqZWN0cyB3aGljaCBkZXNjcmliZSB0aGUgdmVydGV4IGJ1ZmZlciBsYXlvdXQuXHJcblx0ICovXHJcblx0Y3JlYXRlU2hhZGVyVmVydGV4QnVmZmVycyggcmVuZGVyT2JqZWN0ICkge1xyXG5cclxuXHRcdGNvbnN0IGF0dHJpYnV0ZXMgPSByZW5kZXJPYmplY3QuZ2V0QXR0cmlidXRlcygpO1xyXG5cdFx0Y29uc3QgdmVydGV4QnVmZmVycyA9IG5ldyBNYXAoKTtcclxuXHJcblx0XHRmb3IgKCBsZXQgc2xvdCA9IDA7IHNsb3QgPCBhdHRyaWJ1dGVzLmxlbmd0aDsgc2xvdCArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGdlb21ldHJ5QXR0cmlidXRlID0gYXR0cmlidXRlc1sgc2xvdCBdO1xyXG5cdFx0XHRjb25zdCBieXRlc1BlckVsZW1lbnQgPSBnZW9tZXRyeUF0dHJpYnV0ZS5hcnJheS5CWVRFU19QRVJfRUxFTUVOVDtcclxuXHRcdFx0Y29uc3QgYnVmZmVyQXR0cmlidXRlID0gdGhpcy5fZ2V0QnVmZmVyQXR0cmlidXRlKCBnZW9tZXRyeUF0dHJpYnV0ZSApO1xyXG5cclxuXHRcdFx0bGV0IHZlcnRleEJ1ZmZlckxheW91dCA9IHZlcnRleEJ1ZmZlcnMuZ2V0KCBidWZmZXJBdHRyaWJ1dGUgKTtcclxuXHJcblx0XHRcdGlmICggdmVydGV4QnVmZmVyTGF5b3V0ID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdGxldCBhcnJheVN0cmlkZSwgc3RlcE1vZGU7XHJcblxyXG5cdFx0XHRcdGlmICggZ2VvbWV0cnlBdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0XHRhcnJheVN0cmlkZSA9IGdlb21ldHJ5QXR0cmlidXRlLmRhdGEuc3RyaWRlICogYnl0ZXNQZXJFbGVtZW50O1xyXG5cdFx0XHRcdFx0c3RlcE1vZGUgPSBnZW9tZXRyeUF0dHJpYnV0ZS5kYXRhLmlzSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIgPyBHUFVJbnB1dFN0ZXBNb2RlLkluc3RhbmNlIDogR1BVSW5wdXRTdGVwTW9kZS5WZXJ0ZXg7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0YXJyYXlTdHJpZGUgPSBnZW9tZXRyeUF0dHJpYnV0ZS5pdGVtU2l6ZSAqIGJ5dGVzUGVyRWxlbWVudDtcclxuXHRcdFx0XHRcdHN0ZXBNb2RlID0gZ2VvbWV0cnlBdHRyaWJ1dGUuaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUgPyBHUFVJbnB1dFN0ZXBNb2RlLkluc3RhbmNlIDogR1BVSW5wdXRTdGVwTW9kZS5WZXJ0ZXg7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Ly8gcGF0Y2ggZm9yIElOVDE2IGFuZCBVSU5UMTZcclxuXHRcdFx0XHRpZiAoIGdlb21ldHJ5QXR0cmlidXRlLm5vcm1hbGl6ZWQgPT09IGZhbHNlICYmICggZ2VvbWV0cnlBdHRyaWJ1dGUuYXJyYXkuY29uc3RydWN0b3IgPT09IEludDE2QXJyYXkgfHwgZ2VvbWV0cnlBdHRyaWJ1dGUuYXJyYXkuY29uc3RydWN0b3IgPT09IFVpbnQxNkFycmF5ICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0YXJyYXlTdHJpZGUgPSA0O1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHZlcnRleEJ1ZmZlckxheW91dCA9IHtcclxuXHRcdFx0XHRcdGFycmF5U3RyaWRlLFxyXG5cdFx0XHRcdFx0YXR0cmlidXRlczogW10sXHJcblx0XHRcdFx0XHRzdGVwTW9kZVxyXG5cdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdHZlcnRleEJ1ZmZlcnMuc2V0KCBidWZmZXJBdHRyaWJ1dGUsIHZlcnRleEJ1ZmZlckxheW91dCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgZm9ybWF0ID0gdGhpcy5fZ2V0VmVydGV4Rm9ybWF0KCBnZW9tZXRyeUF0dHJpYnV0ZSApO1xyXG5cdFx0XHRjb25zdCBvZmZzZXQgPSAoIGdlb21ldHJ5QXR0cmlidXRlLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgPT09IHRydWUgKSA/IGdlb21ldHJ5QXR0cmlidXRlLm9mZnNldCAqIGJ5dGVzUGVyRWxlbWVudCA6IDA7XHJcblxyXG5cdFx0XHR2ZXJ0ZXhCdWZmZXJMYXlvdXQuYXR0cmlidXRlcy5wdXNoKCB7XHJcblx0XHRcdFx0c2hhZGVyTG9jYXRpb246IHNsb3QsXHJcblx0XHRcdFx0b2Zmc2V0LFxyXG5cdFx0XHRcdGZvcm1hdFxyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBBcnJheS5mcm9tKCB2ZXJ0ZXhCdWZmZXJzLnZhbHVlcygpICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVzdHJveXMgdGhlIEdQVSBidWZmZXIgb2YgdGhlIGdpdmVuIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0J1ZmZlckF0dHJpYnV0ZX0gYXR0cmlidXRlIC0gVGhlIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICovXHJcblx0ZGVzdHJveUF0dHJpYnV0ZSggYXR0cmlidXRlICkge1xyXG5cclxuXHRcdGNvbnN0IGJhY2tlbmQgPSB0aGlzLmJhY2tlbmQ7XHJcblx0XHRjb25zdCBkYXRhID0gYmFja2VuZC5nZXQoIHRoaXMuX2dldEJ1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlICkgKTtcclxuXHJcblx0XHRkYXRhLmJ1ZmZlci5kZXN0cm95KCk7XHJcblxyXG5cdFx0YmFja2VuZC5kZWxldGUoIGF0dHJpYnV0ZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoaXMgbWV0aG9kIHBlcmZvcm1zIGEgcmVhZGJhY2sgb3BlcmF0aW9uIGJ5IG1vdmluZyBidWZmZXIgZGF0YSBmcm9tXHJcblx0ICogYSBzdG9yYWdlIGJ1ZmZlciBhdHRyaWJ1dGUgZnJvbSB0aGUgR1BVIHRvIHRoZSBDUFUuXHJcblx0ICpcclxuXHQgKiBAYXN5bmNcclxuXHQgKiBAcGFyYW0ge1N0b3JhZ2VCdWZmZXJBdHRyaWJ1dGV9IGF0dHJpYnV0ZSAtIFRoZSBzdG9yYWdlIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICogQHJldHVybiB7UHJvbWlzZTxBcnJheUJ1ZmZlcj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGJ1ZmZlciBkYXRhIHdoZW4gdGhlIGRhdGEgYXJlIHJlYWR5LlxyXG5cdCAqL1xyXG5cdGFzeW5jIGdldEFycmF5QnVmZmVyQXN5bmMoIGF0dHJpYnV0ZSApIHtcclxuXHJcblx0XHRjb25zdCBiYWNrZW5kID0gdGhpcy5iYWNrZW5kO1xyXG5cdFx0Y29uc3QgZGV2aWNlID0gYmFja2VuZC5kZXZpY2U7XHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IGJhY2tlbmQuZ2V0KCB0aGlzLl9nZXRCdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApICk7XHJcblx0XHRjb25zdCBidWZmZXJHUFUgPSBkYXRhLmJ1ZmZlcjtcclxuXHRcdGNvbnN0IHNpemUgPSBidWZmZXJHUFUuc2l6ZTtcclxuXHJcblx0XHRjb25zdCByZWFkQnVmZmVyR1BVID0gZGV2aWNlLmNyZWF0ZUJ1ZmZlcigge1xyXG5cdFx0XHRsYWJlbDogYCR7IGF0dHJpYnV0ZS5uYW1lIH1fcmVhZGJhY2tgLFxyXG5cdFx0XHRzaXplLFxyXG5cdFx0XHR1c2FnZTogR1BVQnVmZmVyVXNhZ2UuQ09QWV9EU1QgfCBHUFVCdWZmZXJVc2FnZS5NQVBfUkVBRFxyXG5cdFx0fSApO1xyXG5cclxuXHRcdGNvbnN0IGNtZEVuY29kZXIgPSBkZXZpY2UuY3JlYXRlQ29tbWFuZEVuY29kZXIoIHtcclxuXHRcdFx0bGFiZWw6IGByZWFkYmFja19lbmNvZGVyXyR7IGF0dHJpYnV0ZS5uYW1lIH1gXHJcblx0XHR9ICk7XHJcblxyXG5cdFx0Y21kRW5jb2Rlci5jb3B5QnVmZmVyVG9CdWZmZXIoXHJcblx0XHRcdGJ1ZmZlckdQVSxcclxuXHRcdFx0MCxcclxuXHRcdFx0cmVhZEJ1ZmZlckdQVSxcclxuXHRcdFx0MCxcclxuXHRcdFx0c2l6ZVxyXG5cdFx0KTtcclxuXHJcblx0XHRjb25zdCBncHVDb21tYW5kcyA9IGNtZEVuY29kZXIuZmluaXNoKCk7XHJcblx0XHRkZXZpY2UucXVldWUuc3VibWl0KCBbIGdwdUNvbW1hbmRzIF0gKTtcclxuXHJcblx0XHRhd2FpdCByZWFkQnVmZmVyR1BVLm1hcEFzeW5jKCBHUFVNYXBNb2RlLlJFQUQgKTtcclxuXHJcblx0XHRjb25zdCBhcnJheUJ1ZmZlciA9IHJlYWRCdWZmZXJHUFUuZ2V0TWFwcGVkUmFuZ2UoKTtcclxuXHJcblx0XHRjb25zdCBkc3RCdWZmZXIgPSBuZXcgYXR0cmlidXRlLmFycmF5LmNvbnN0cnVjdG9yKCBhcnJheUJ1ZmZlci5zbGljZSggMCApICk7XHJcblxyXG5cdFx0cmVhZEJ1ZmZlckdQVS51bm1hcCgpO1xyXG5cclxuXHRcdHJldHVybiBkc3RCdWZmZXIuYnVmZmVyO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHZlcnRleCBmb3JtYXQgb2YgdGhlIGdpdmVuIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyQXR0cmlidXRlfSBnZW9tZXRyeUF0dHJpYnV0ZSAtIFRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ3x1bmRlZmluZWR9IFRoZSB2ZXJ0ZXggZm9ybWF0IChlLmcuICdmbG9hdDMyeDMnKS5cclxuXHQgKi9cclxuXHRfZ2V0VmVydGV4Rm9ybWF0KCBnZW9tZXRyeUF0dHJpYnV0ZSApIHtcclxuXHJcblx0XHRjb25zdCB7IGl0ZW1TaXplLCBub3JtYWxpemVkIH0gPSBnZW9tZXRyeUF0dHJpYnV0ZTtcclxuXHRcdGNvbnN0IEFycmF5VHlwZSA9IGdlb21ldHJ5QXR0cmlidXRlLmFycmF5LmNvbnN0cnVjdG9yO1xyXG5cdFx0Y29uc3QgQXR0cmlidXRlVHlwZSA9IGdlb21ldHJ5QXR0cmlidXRlLmNvbnN0cnVjdG9yO1xyXG5cclxuXHRcdGxldCBmb3JtYXQ7XHJcblxyXG5cdFx0aWYgKCBpdGVtU2l6ZSA9PT0gMSApIHtcclxuXHJcblx0XHRcdGZvcm1hdCA9IHR5cGVBcnJheXNUb1ZlcnRleEZvcm1hdFByZWZpeEZvckl0ZW1TaXplMS5nZXQoIEFycmF5VHlwZSApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRjb25zdCBwcmVmaXhPcHRpb25zID0gdHlwZWRBdHRyaWJ1dGVUb1ZlcnRleEZvcm1hdFByZWZpeC5nZXQoIEF0dHJpYnV0ZVR5cGUgKSB8fCB0eXBlZEFycmF5c1RvVmVydGV4Rm9ybWF0UHJlZml4LmdldCggQXJyYXlUeXBlICk7XHJcblx0XHRcdGNvbnN0IHByZWZpeCA9IHByZWZpeE9wdGlvbnNbIG5vcm1hbGl6ZWQgPyAxIDogMCBdO1xyXG5cclxuXHRcdFx0aWYgKCBwcmVmaXggKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGJ5dGVzUGVyVW5pdCA9IEFycmF5VHlwZS5CWVRFU19QRVJfRUxFTUVOVCAqIGl0ZW1TaXplO1xyXG5cdFx0XHRcdGNvbnN0IHBhZGRlZEJ5dGVzUGVyVW5pdCA9IE1hdGguZmxvb3IoICggYnl0ZXNQZXJVbml0ICsgMyApIC8gNCApICogNDtcclxuXHRcdFx0XHRjb25zdCBwYWRkZWRJdGVtU2l6ZSA9IHBhZGRlZEJ5dGVzUGVyVW5pdCAvIEFycmF5VHlwZS5CWVRFU19QRVJfRUxFTUVOVDtcclxuXHJcblx0XHRcdFx0aWYgKCBwYWRkZWRJdGVtU2l6ZSAlIDEgKSB7XHJcblxyXG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuV2ViR1BVQXR0cmlidXRlVXRpbHM6IEJhZCB2ZXJ0ZXggZm9ybWF0IGl0ZW0gc2l6ZS4nICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Zm9ybWF0ID0gYCR7cHJlZml4fXgke3BhZGRlZEl0ZW1TaXplfWA7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggISBmb3JtYXQgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR1BVQXR0cmlidXRlVXRpbHM6IFZlcnRleCBmb3JtYXQgbm90IHN1cHBvcnRlZCB5ZXQuJyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZm9ybWF0O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBnaXZlbiBhcnJheSBpcyBhIHR5cGVkIGFycmF5LlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge2FueX0gYXJyYXkgLSBUaGUgYXJyYXkuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZ2l2ZW4gYXJyYXkgaXMgYSB0eXBlZCBhcnJheSBvciBub3QuXHJcblx0ICovXHJcblx0X2lzVHlwZWRBcnJheSggYXJyYXkgKSB7XHJcblxyXG5cdFx0cmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyggYXJyYXkgKSAmJiAhICggYXJyYXkgaW5zdGFuY2VvZiBEYXRhVmlldyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFV0aWxpdHkgbWV0aG9kIGZvciBoYW5kbGluZyBpbnRlcmxlYXZlZCBidWZmZXIgYXR0cmlidXRlcyBjb3JyZWN0bHkuXHJcblx0ICogVG8gcHJvY2VzcyB0aGVtLCB0aGVpciBgSW50ZXJsZWF2ZWRCdWZmZXJgIGlzIHJldHVybmVkLlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge0J1ZmZlckF0dHJpYnV0ZX0gYXR0cmlidXRlIC0gVGhlIGF0dHJpYnV0ZS5cclxuXHQgKiBAcmV0dXJuIHtCdWZmZXJBdHRyaWJ1dGV8SW50ZXJsZWF2ZWRCdWZmZXJ9XHJcblx0ICovXHJcblx0X2dldEJ1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlICkge1xyXG5cclxuXHRcdGlmICggYXR0cmlidXRlLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgKSBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGUuZGF0YTtcclxuXHJcblx0XHRyZXR1cm4gYXR0cmlidXRlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBXZWJHUFVBdHRyaWJ1dGVVdGlscztcclxuIiwiaW1wb3J0IHtcclxuXHRHUFVUZXh0dXJlQXNwZWN0LCBHUFVUZXh0dXJlVmlld0RpbWVuc2lvbiwgR1BVVGV4dHVyZVNhbXBsZVR5cGUsIEdQVUJ1ZmZlckJpbmRpbmdUeXBlLCBHUFVTdG9yYWdlVGV4dHVyZUFjY2Vzc1xyXG59IGZyb20gJy4vV2ViR1BVQ29uc3RhbnRzLmpzJztcclxuXHJcbmltcG9ydCB7IEZsb2F0VHlwZSwgSW50VHlwZSwgVW5zaWduZWRJbnRUeXBlIH0gZnJvbSAnLi4vLi4vLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IHsgTm9kZUFjY2VzcyB9IGZyb20gJy4uLy4uLy4uL25vZGVzL2NvcmUvY29uc3RhbnRzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBBIFdlYkdQVSBiYWNrZW5kIHV0aWxpdHkgbW9kdWxlIGZvciBtYW5hZ2luZyBiaW5kaW5ncy5cclxuICpcclxuICogV2hlbiByZWFkaW5nIHRoZSBkb2N1bWVudGF0aW9uIGl0J3MgaGVscGZ1bCB0byBrZWVwIGluIG1pbmQgdGhhdFxyXG4gKiBhbGwgY2xhc3MgZGVmaW5pdGlvbnMgc3RhcnRpbmcgd2l0aCAnR1BVKicgYXJlIG1vZHVsZXMgZnJvbSB0aGVcclxuICogV2ViR1BVIEFQSS4gU28gZm9yIGV4YW1wbGUgYEJpbmRHcm91cGAgaXMgYSBjbGFzcyBmcm9tIHRoZSBlbmdpbmVcclxuICogd2hlcmVhcyBgR1BVQmluZEdyb3VwYCBpcyBhIGNsYXNzIGZyb20gV2ViR1BVLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuY2xhc3MgV2ViR1BVQmluZGluZ1V0aWxzIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB1dGlsaXR5IG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7V2ViR1BVQmFja2VuZH0gYmFja2VuZCAtIFRoZSBXZWJHUFUgYmFja2VuZC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggYmFja2VuZCApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIHRoZSBXZWJHUFUgYmFja2VuZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2ViR1BVQmFja2VuZH1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5iYWNrZW5kID0gYmFja2VuZDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgY2FjaGUgZm9yIG1hbmFnaW5nIGJpbmQgZ3JvdXAgbGF5b3V0cy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2Vha01hcDxBcnJheTxCaW5kaW5nPixHUFVCaW5kR3JvdXBMYXlvdXQ+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmJpbmRHcm91cExheW91dENhY2hlID0gbmV3IFdlYWtNYXAoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGEgR1BVIGJpbmQgZ3JvdXAgbGF5b3V0IGZvciB0aGUgZ2l2ZW4gYmluZCBncm91cC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QmluZEdyb3VwfSBiaW5kR3JvdXAgLSBUaGUgYmluZCBncm91cC5cclxuXHQgKiBAcmV0dXJuIHtHUFVCaW5kR3JvdXBMYXlvdXR9IFRoZSBHUFUgYmluZCBncm91cCBsYXlvdXQuXHJcblx0ICovXHJcblx0Y3JlYXRlQmluZGluZ3NMYXlvdXQoIGJpbmRHcm91cCApIHtcclxuXHJcblx0XHRjb25zdCBiYWNrZW5kID0gdGhpcy5iYWNrZW5kO1xyXG5cdFx0Y29uc3QgZGV2aWNlID0gYmFja2VuZC5kZXZpY2U7XHJcblxyXG5cdFx0Y29uc3QgZW50cmllcyA9IFtdO1xyXG5cclxuXHRcdGxldCBpbmRleCA9IDA7XHJcblxyXG5cdFx0Zm9yICggY29uc3QgYmluZGluZyBvZiBiaW5kR3JvdXAuYmluZGluZ3MgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBiaW5kaW5nR1BVID0ge1xyXG5cdFx0XHRcdGJpbmRpbmc6IGluZGV4ICsrLFxyXG5cdFx0XHRcdHZpc2liaWxpdHk6IGJpbmRpbmcudmlzaWJpbGl0eVxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0aWYgKCBiaW5kaW5nLmlzVW5pZm9ybUJ1ZmZlciB8fCBiaW5kaW5nLmlzU3RvcmFnZUJ1ZmZlciApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgYnVmZmVyID0ge307IC8vIEdQVUJ1ZmZlckJpbmRpbmdMYXlvdXRcclxuXHJcblx0XHRcdFx0aWYgKCBiaW5kaW5nLmlzU3RvcmFnZUJ1ZmZlciApIHtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGJpbmRpbmcudmlzaWJpbGl0eSAmIDQgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBjb21wdXRlXHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIGJpbmRpbmcuYWNjZXNzID09PSBOb2RlQWNjZXNzLlJFQURfV1JJVEUgfHwgYmluZGluZy5hY2Nlc3MgPT09IE5vZGVBY2Nlc3MuV1JJVEVfT05MWSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0YnVmZmVyLnR5cGUgPSBHUFVCdWZmZXJCaW5kaW5nVHlwZS5TdG9yYWdlO1xyXG5cclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0YnVmZmVyLnR5cGUgPSBHUFVCdWZmZXJCaW5kaW5nVHlwZS5SZWFkT25seVN0b3JhZ2U7XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdGJ1ZmZlci50eXBlID0gR1BVQnVmZmVyQmluZGluZ1R5cGUuUmVhZE9ubHlTdG9yYWdlO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRiaW5kaW5nR1BVLmJ1ZmZlciA9IGJ1ZmZlcjtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGJpbmRpbmcuaXNTYW1wbGVyICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBzYW1wbGVyID0ge307IC8vIEdQVVNhbXBsZXJCaW5kaW5nTGF5b3V0XHJcblxyXG5cdFx0XHRcdGlmICggYmluZGluZy50ZXh0dXJlLmlzRGVwdGhUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0XHRcdGlmICggYmluZGluZy50ZXh0dXJlLmNvbXBhcmVGdW5jdGlvbiAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHRcdHNhbXBsZXIudHlwZSA9ICdjb21wYXJpc29uJztcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0YmluZGluZ0dQVS5zYW1wbGVyID0gc2FtcGxlcjtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGJpbmRpbmcuaXNTYW1wbGVkVGV4dHVyZSAmJiBiaW5kaW5nLnRleHR1cmUuaXNWaWRlb1RleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRcdGJpbmRpbmdHUFUuZXh0ZXJuYWxUZXh0dXJlID0ge307IC8vIEdQVUV4dGVybmFsVGV4dHVyZUJpbmRpbmdMYXlvdXRcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGJpbmRpbmcuaXNTYW1wbGVkVGV4dHVyZSAmJiBiaW5kaW5nLnN0b3JlICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBzdG9yYWdlVGV4dHVyZSA9IHt9OyAvLyBHUFVTdG9yYWdlVGV4dHVyZUJpbmRpbmdMYXlvdXRcclxuXHRcdFx0XHRzdG9yYWdlVGV4dHVyZS5mb3JtYXQgPSB0aGlzLmJhY2tlbmQuZ2V0KCBiaW5kaW5nLnRleHR1cmUgKS50ZXh0dXJlLmZvcm1hdDtcclxuXHJcblx0XHRcdFx0Y29uc3QgYWNjZXNzID0gYmluZGluZy5hY2Nlc3M7XHJcblxyXG5cdFx0XHRcdGlmICggYWNjZXNzID09PSBOb2RlQWNjZXNzLlJFQURfV1JJVEUgKSB7XHJcblxyXG5cdFx0XHRcdFx0c3RvcmFnZVRleHR1cmUuYWNjZXNzID0gR1BVU3RvcmFnZVRleHR1cmVBY2Nlc3MuUmVhZFdyaXRlO1xyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCBhY2Nlc3MgPT09IE5vZGVBY2Nlc3MuV1JJVEVfT05MWSApIHtcclxuXHJcblx0XHRcdFx0XHRzdG9yYWdlVGV4dHVyZS5hY2Nlc3MgPSBHUFVTdG9yYWdlVGV4dHVyZUFjY2Vzcy5Xcml0ZU9ubHk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0c3RvcmFnZVRleHR1cmUuYWNjZXNzID0gR1BVU3RvcmFnZVRleHR1cmVBY2Nlc3MuUmVhZE9ubHk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0YmluZGluZ0dQVS5zdG9yYWdlVGV4dHVyZSA9IHN0b3JhZ2VUZXh0dXJlO1xyXG5cclxuXHRcdFx0fSBlbHNlIGlmICggYmluZGluZy5pc1NhbXBsZWRUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB0ZXh0dXJlID0ge307IC8vIEdQVVRleHR1cmVCaW5kaW5nTGF5b3V0XHJcblxyXG5cdFx0XHRcdGNvbnN0IHsgcHJpbWFyeVNhbXBsZXMgfSA9IGJhY2tlbmQudXRpbHMuZ2V0VGV4dHVyZVNhbXBsZURhdGEoIGJpbmRpbmcudGV4dHVyZSApO1xyXG5cclxuXHRcdFx0XHRpZiAoIHByaW1hcnlTYW1wbGVzID4gMSApIHtcclxuXHJcblx0XHRcdFx0XHR0ZXh0dXJlLm11bHRpc2FtcGxlZCA9IHRydWU7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCAhIGJpbmRpbmcudGV4dHVyZS5pc0RlcHRoVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdHRleHR1cmUuc2FtcGxlVHlwZSA9IEdQVVRleHR1cmVTYW1wbGVUeXBlLlVuZmlsdGVyYWJsZUZsb2F0O1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoIGJpbmRpbmcudGV4dHVyZS5pc0RlcHRoVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0XHR0ZXh0dXJlLnNhbXBsZVR5cGUgPSBHUFVUZXh0dXJlU2FtcGxlVHlwZS5EZXB0aDtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmICggYmluZGluZy50ZXh0dXJlLmlzRGF0YVRleHR1cmUgfHwgYmluZGluZy50ZXh0dXJlLmlzRGF0YUFycmF5VGV4dHVyZSB8fCBiaW5kaW5nLnRleHR1cmUuaXNEYXRhM0RUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHR5cGUgPSBiaW5kaW5nLnRleHR1cmUudHlwZTtcclxuXHJcblx0XHRcdFx0XHRpZiAoIHR5cGUgPT09IEludFR5cGUgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHR0ZXh0dXJlLnNhbXBsZVR5cGUgPSBHUFVUZXh0dXJlU2FtcGxlVHlwZS5TSW50O1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIHR5cGUgPT09IFVuc2lnbmVkSW50VHlwZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdHRleHR1cmUuc2FtcGxlVHlwZSA9IEdQVVRleHR1cmVTYW1wbGVUeXBlLlVJbnQ7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIGlmICggdHlwZSA9PT0gRmxvYXRUeXBlICkge1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCB0aGlzLmJhY2tlbmQuaGFzRmVhdHVyZSggJ2Zsb2F0MzItZmlsdGVyYWJsZScgKSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0dGV4dHVyZS5zYW1wbGVUeXBlID0gR1BVVGV4dHVyZVNhbXBsZVR5cGUuRmxvYXQ7XHJcblxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdFx0XHR0ZXh0dXJlLnNhbXBsZVR5cGUgPSBHUFVUZXh0dXJlU2FtcGxlVHlwZS5VbmZpbHRlcmFibGVGbG9hdDtcclxuXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKCBiaW5kaW5nLmlzU2FtcGxlZEN1YmVUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0XHRcdHRleHR1cmUudmlld0RpbWVuc2lvbiA9IEdQVVRleHR1cmVWaWV3RGltZW5zaW9uLkN1YmU7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGJpbmRpbmcudGV4dHVyZS5pc0RhdGFBcnJheVRleHR1cmUgfHwgYmluZGluZy50ZXh0dXJlLmlzQ29tcHJlc3NlZEFycmF5VGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0XHR0ZXh0dXJlLnZpZXdEaW1lbnNpb24gPSBHUFVUZXh0dXJlVmlld0RpbWVuc2lvbi5Ud29EQXJyYXk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGJpbmRpbmcuaXNTYW1wbGVkVGV4dHVyZTNEICkge1xyXG5cclxuXHRcdFx0XHRcdHRleHR1cmUudmlld0RpbWVuc2lvbiA9IEdQVVRleHR1cmVWaWV3RGltZW5zaW9uLlRocmVlRDtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRiaW5kaW5nR1BVLnRleHR1cmUgPSB0ZXh0dXJlO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0Y29uc29sZS5lcnJvciggYFdlYkdQVUJpbmRpbmdVdGlsczogVW5zdXBwb3J0ZWQgYmluZGluZyBcIiR7IGJpbmRpbmcgfVwiLmAgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGVudHJpZXMucHVzaCggYmluZGluZ0dQVSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZGV2aWNlLmNyZWF0ZUJpbmRHcm91cExheW91dCggeyBlbnRyaWVzIH0gKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGJpbmRpbmdzIGZyb20gdGhlIGdpdmVuIGJpbmQgZ3JvdXAgZGVmaW5pdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QmluZEdyb3VwfSBiaW5kR3JvdXAgLSBUaGUgYmluZCBncm91cC5cclxuXHQgKiBAcGFyYW0ge0FycmF5PEJpbmRHcm91cD59IGJpbmRpbmdzIC0gQXJyYXkgb2YgYmluZCBncm91cHMuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGNhY2hlSW5kZXggLSBUaGUgY2FjaGUgaW5kZXguXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHZlcnNpb24gLSBUaGUgdmVyc2lvbi5cclxuXHQgKi9cclxuXHRjcmVhdGVCaW5kaW5ncyggYmluZEdyb3VwLCBiaW5kaW5ncywgY2FjaGVJbmRleCwgdmVyc2lvbiA9IDAgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBiYWNrZW5kLCBiaW5kR3JvdXBMYXlvdXRDYWNoZSB9ID0gdGhpcztcclxuXHRcdGNvbnN0IGJpbmRpbmdzRGF0YSA9IGJhY2tlbmQuZ2V0KCBiaW5kR3JvdXAgKTtcclxuXHJcblx0XHQvLyBzZXR1cCAoc3RhdGljKSBiaW5kaW5nIGxheW91dCBhbmQgKGR5bmFtaWMpIGJpbmRpbmcgZ3JvdXBcclxuXHJcblx0XHRsZXQgYmluZExheW91dEdQVSA9IGJpbmRHcm91cExheW91dENhY2hlLmdldCggYmluZEdyb3VwLmJpbmRpbmdzUmVmZXJlbmNlICk7XHJcblxyXG5cdFx0aWYgKCBiaW5kTGF5b3V0R1BVID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRiaW5kTGF5b3V0R1BVID0gdGhpcy5jcmVhdGVCaW5kaW5nc0xheW91dCggYmluZEdyb3VwICk7XHJcblx0XHRcdGJpbmRHcm91cExheW91dENhY2hlLnNldCggYmluZEdyb3VwLmJpbmRpbmdzUmVmZXJlbmNlLCBiaW5kTGF5b3V0R1BVICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGxldCBiaW5kR3JvdXBHUFU7XHJcblxyXG5cdFx0aWYgKCBjYWNoZUluZGV4ID4gMCApIHtcclxuXHJcblx0XHRcdGlmICggYmluZGluZ3NEYXRhLmdyb3VwcyA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRiaW5kaW5nc0RhdGEuZ3JvdXBzID0gW107XHJcblx0XHRcdFx0YmluZGluZ3NEYXRhLnZlcnNpb25zID0gW107XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIGJpbmRpbmdzRGF0YS52ZXJzaW9uc1sgY2FjaGVJbmRleCBdID09PSB2ZXJzaW9uICkge1xyXG5cclxuXHRcdFx0XHRiaW5kR3JvdXBHUFUgPSBiaW5kaW5nc0RhdGEuZ3JvdXBzWyBjYWNoZUluZGV4IF07XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggYmluZEdyb3VwR1BVID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRiaW5kR3JvdXBHUFUgPSB0aGlzLmNyZWF0ZUJpbmRHcm91cCggYmluZEdyb3VwLCBiaW5kTGF5b3V0R1BVICk7XHJcblxyXG5cdFx0XHRpZiAoIGNhY2hlSW5kZXggPiAwICkge1xyXG5cclxuXHRcdFx0XHRiaW5kaW5nc0RhdGEuZ3JvdXBzWyBjYWNoZUluZGV4IF0gPSBiaW5kR3JvdXBHUFU7XHJcblx0XHRcdFx0YmluZGluZ3NEYXRhLnZlcnNpb25zWyBjYWNoZUluZGV4IF0gPSB2ZXJzaW9uO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHRiaW5kaW5nc0RhdGEuZ3JvdXAgPSBiaW5kR3JvdXBHUFU7XHJcblx0XHRiaW5kaW5nc0RhdGEubGF5b3V0ID0gYmluZExheW91dEdQVTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIGEgYnVmZmVyIGJpbmRpbmcuXHJcblx0ICpcclxuXHQgKiAgQHBhcmFtIHtCdWZmZXJ9IGJpbmRpbmcgLSBUaGUgYnVmZmVyIGJpbmRpbmcgdG8gdXBkYXRlLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZUJpbmRpbmcoIGJpbmRpbmcgKSB7XHJcblxyXG5cdFx0Y29uc3QgYmFja2VuZCA9IHRoaXMuYmFja2VuZDtcclxuXHRcdGNvbnN0IGRldmljZSA9IGJhY2tlbmQuZGV2aWNlO1xyXG5cclxuXHRcdGNvbnN0IGJ1ZmZlciA9IGJpbmRpbmcuYnVmZmVyO1xyXG5cdFx0Y29uc3QgYnVmZmVyR1BVID0gYmFja2VuZC5nZXQoIGJpbmRpbmcgKS5idWZmZXI7XHJcblxyXG5cdFx0ZGV2aWNlLnF1ZXVlLndyaXRlQnVmZmVyKCBidWZmZXJHUFUsIDAsIGJ1ZmZlciwgMCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgYSBHUFUgYmluZCBncm91cCBmb3IgdGhlIGNhbWVyYSBpbmRleC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VWludDMyQXJyYXl9IGRhdGEgLSBUaGUgaW5kZXggZGF0YS5cclxuXHQgKiBAcGFyYW0ge0dQVUJpbmRHcm91cExheW91dH0gbGF5b3V0IC0gVGhlIEdQVSBiaW5kIGdyb3VwIGxheW91dC5cclxuXHQgKiBAcmV0dXJuIHtHUFVCaW5kR3JvdXB9IFRoZSBHUFUgYmluZCBncm91cC5cclxuXHQgKi9cclxuXHRjcmVhdGVCaW5kR3JvdXBJbmRleCggZGF0YSwgbGF5b3V0ICkge1xyXG5cclxuXHRcdGNvbnN0IGJhY2tlbmQgPSB0aGlzLmJhY2tlbmQ7XHJcblx0XHRjb25zdCBkZXZpY2UgPSBiYWNrZW5kLmRldmljZTtcclxuXHJcblx0XHRjb25zdCB1c2FnZSA9IEdQVUJ1ZmZlclVzYWdlLlVOSUZPUk0gfCBHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVDtcclxuXHRcdGNvbnN0IGluZGV4ID0gZGF0YVsgMCBdO1xyXG5cclxuXHRcdGNvbnN0IGJ1ZmZlciA9IGRldmljZS5jcmVhdGVCdWZmZXIoIHtcclxuXHRcdFx0bGFiZWw6ICdiaW5kaW5nQ2FtZXJhSW5kZXhfJyArIGluZGV4LFxyXG5cdFx0XHRzaXplOiAxNiwgLy8gdWludCg0KSAqIDRcclxuXHRcdFx0dXNhZ2U6IHVzYWdlXHJcblx0XHR9ICk7XHJcblxyXG5cdFx0ZGV2aWNlLnF1ZXVlLndyaXRlQnVmZmVyKCBidWZmZXIsIDAsIGRhdGEsIDAgKTtcclxuXHJcblx0XHRjb25zdCBlbnRyaWVzID0gWyB7IGJpbmRpbmc6IDAsIHJlc291cmNlOiB7IGJ1ZmZlciB9IH0gXTtcclxuXHJcblx0XHRyZXR1cm4gZGV2aWNlLmNyZWF0ZUJpbmRHcm91cCgge1xyXG5cdFx0XHRsYWJlbDogJ2JpbmRHcm91cENhbWVyYUluZGV4XycgKyBpbmRleCxcclxuXHRcdFx0bGF5b3V0LFxyXG5cdFx0XHRlbnRyaWVzXHJcblx0XHR9ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyBhIEdQVSBiaW5kIGdyb3VwIGZvciB0aGUgZ2l2ZW4gYmluZCBncm91cCBhbmQgR1BVIGxheW91dC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QmluZEdyb3VwfSBiaW5kR3JvdXAgLSBUaGUgYmluZCBncm91cC5cclxuXHQgKiBAcGFyYW0ge0dQVUJpbmRHcm91cExheW91dH0gbGF5b3V0R1BVIC0gVGhlIEdQVSBiaW5kIGdyb3VwIGxheW91dC5cclxuXHQgKiBAcmV0dXJuIHtHUFVCaW5kR3JvdXB9IFRoZSBHUFUgYmluZCBncm91cC5cclxuXHQgKi9cclxuXHRjcmVhdGVCaW5kR3JvdXAoIGJpbmRHcm91cCwgbGF5b3V0R1BVICkge1xyXG5cclxuXHRcdGNvbnN0IGJhY2tlbmQgPSB0aGlzLmJhY2tlbmQ7XHJcblx0XHRjb25zdCBkZXZpY2UgPSBiYWNrZW5kLmRldmljZTtcclxuXHJcblx0XHRsZXQgYmluZGluZ1BvaW50ID0gMDtcclxuXHRcdGNvbnN0IGVudHJpZXNHUFUgPSBbXTtcclxuXHJcblx0XHRmb3IgKCBjb25zdCBiaW5kaW5nIG9mIGJpbmRHcm91cC5iaW5kaW5ncyApIHtcclxuXHJcblx0XHRcdGlmICggYmluZGluZy5pc1VuaWZvcm1CdWZmZXIgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGJpbmRpbmdEYXRhID0gYmFja2VuZC5nZXQoIGJpbmRpbmcgKTtcclxuXHJcblx0XHRcdFx0aWYgKCBiaW5kaW5nRGF0YS5idWZmZXIgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBieXRlTGVuZ3RoID0gYmluZGluZy5ieXRlTGVuZ3RoO1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHVzYWdlID0gR1BVQnVmZmVyVXNhZ2UuVU5JRk9STSB8IEdQVUJ1ZmZlclVzYWdlLkNPUFlfRFNUO1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IGJ1ZmZlckdQVSA9IGRldmljZS5jcmVhdGVCdWZmZXIoIHtcclxuXHRcdFx0XHRcdFx0bGFiZWw6ICdiaW5kaW5nQnVmZmVyXycgKyBiaW5kaW5nLm5hbWUsXHJcblx0XHRcdFx0XHRcdHNpemU6IGJ5dGVMZW5ndGgsXHJcblx0XHRcdFx0XHRcdHVzYWdlOiB1c2FnZVxyXG5cdFx0XHRcdFx0fSApO1xyXG5cclxuXHRcdFx0XHRcdGJpbmRpbmdEYXRhLmJ1ZmZlciA9IGJ1ZmZlckdQVTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRlbnRyaWVzR1BVLnB1c2goIHsgYmluZGluZzogYmluZGluZ1BvaW50LCByZXNvdXJjZTogeyBidWZmZXI6IGJpbmRpbmdEYXRhLmJ1ZmZlciB9IH0gKTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGJpbmRpbmcuaXNTdG9yYWdlQnVmZmVyICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBiaW5kaW5nRGF0YSA9IGJhY2tlbmQuZ2V0KCBiaW5kaW5nICk7XHJcblxyXG5cdFx0XHRcdGlmICggYmluZGluZ0RhdGEuYnVmZmVyID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgYXR0cmlidXRlID0gYmluZGluZy5hdHRyaWJ1dGU7XHJcblx0XHRcdFx0XHQvL2NvbnN0IHVzYWdlID0gR1BVQnVmZmVyVXNhZ2UuU1RPUkFHRSB8IEdQVUJ1ZmZlclVzYWdlLlZFUlRFWCB8IC8qR1BVQnVmZmVyVXNhZ2UuQ09QWV9TUkMgfCovIEdQVUJ1ZmZlclVzYWdlLkNPUFlfRFNUO1xyXG5cclxuXHRcdFx0XHRcdC8vYmFja2VuZC5hdHRyaWJ1dGVVdGlscy5jcmVhdGVBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgdXNhZ2UgKTsgLy8gQFRPRE86IE1vdmUgaXQgdG8gdW5pdmVyc2FsIHJlbmRlcmVyXHJcblxyXG5cdFx0XHRcdFx0YmluZGluZ0RhdGEuYnVmZmVyID0gYmFja2VuZC5nZXQoIGF0dHJpYnV0ZSApLmJ1ZmZlcjtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRlbnRyaWVzR1BVLnB1c2goIHsgYmluZGluZzogYmluZGluZ1BvaW50LCByZXNvdXJjZTogeyBidWZmZXI6IGJpbmRpbmdEYXRhLmJ1ZmZlciB9IH0gKTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGJpbmRpbmcuaXNTYW1wbGVyICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB0ZXh0dXJlR1BVID0gYmFja2VuZC5nZXQoIGJpbmRpbmcudGV4dHVyZSApO1xyXG5cclxuXHRcdFx0XHRlbnRyaWVzR1BVLnB1c2goIHsgYmluZGluZzogYmluZGluZ1BvaW50LCByZXNvdXJjZTogdGV4dHVyZUdQVS5zYW1wbGVyIH0gKTtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGJpbmRpbmcuaXNTYW1wbGVkVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgdGV4dHVyZURhdGEgPSBiYWNrZW5kLmdldCggYmluZGluZy50ZXh0dXJlICk7XHJcblxyXG5cdFx0XHRcdGxldCByZXNvdXJjZUdQVTtcclxuXHJcblx0XHRcdFx0aWYgKCB0ZXh0dXJlRGF0YS5leHRlcm5hbFRleHR1cmUgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0XHRyZXNvdXJjZUdQVSA9IGRldmljZS5pbXBvcnRFeHRlcm5hbFRleHR1cmUoIHsgc291cmNlOiB0ZXh0dXJlRGF0YS5leHRlcm5hbFRleHR1cmUgfSApO1xyXG5cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IG1pcExldmVsQ291bnQgPSBiaW5kaW5nLnN0b3JlID8gMSA6IHRleHR1cmVEYXRhLnRleHR1cmUubWlwTGV2ZWxDb3VudDtcclxuXHRcdFx0XHRcdGNvbnN0IHByb3BlcnR5TmFtZSA9IGB2aWV3LSR7IHRleHR1cmVEYXRhLnRleHR1cmUud2lkdGggfS0keyB0ZXh0dXJlRGF0YS50ZXh0dXJlLmhlaWdodCB9LSR7IG1pcExldmVsQ291bnQgfWA7XHJcblxyXG5cdFx0XHRcdFx0cmVzb3VyY2VHUFUgPSB0ZXh0dXJlRGF0YVsgcHJvcGVydHlOYW1lIF07XHJcblxyXG5cdFx0XHRcdFx0aWYgKCByZXNvdXJjZUdQVSA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29uc3QgYXNwZWN0R1BVID0gR1BVVGV4dHVyZUFzcGVjdC5BbGw7XHJcblxyXG5cdFx0XHRcdFx0XHRsZXQgZGltZW5zaW9uVmlld0dQVTtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggYmluZGluZy5pc1NhbXBsZWRDdWJlVGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0ZGltZW5zaW9uVmlld0dQVSA9IEdQVVRleHR1cmVWaWV3RGltZW5zaW9uLkN1YmU7XHJcblxyXG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCBiaW5kaW5nLmlzU2FtcGxlZFRleHR1cmUzRCApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0ZGltZW5zaW9uVmlld0dQVSA9IEdQVVRleHR1cmVWaWV3RGltZW5zaW9uLlRocmVlRDtcclxuXHJcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIGJpbmRpbmcudGV4dHVyZS5pc0RhdGFBcnJheVRleHR1cmUgfHwgYmluZGluZy50ZXh0dXJlLmlzQ29tcHJlc3NlZEFycmF5VGV4dHVyZSApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0ZGltZW5zaW9uVmlld0dQVSA9IEdQVVRleHR1cmVWaWV3RGltZW5zaW9uLlR3b0RBcnJheTtcclxuXHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGRpbWVuc2lvblZpZXdHUFUgPSBHUFVUZXh0dXJlVmlld0RpbWVuc2lvbi5Ud29EO1xyXG5cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0cmVzb3VyY2VHUFUgPSB0ZXh0dXJlRGF0YVsgcHJvcGVydHlOYW1lIF0gPSB0ZXh0dXJlRGF0YS50ZXh0dXJlLmNyZWF0ZVZpZXcoIHsgYXNwZWN0OiBhc3BlY3RHUFUsIGRpbWVuc2lvbjogZGltZW5zaW9uVmlld0dQVSwgbWlwTGV2ZWxDb3VudCB9ICk7XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGVudHJpZXNHUFUucHVzaCggeyBiaW5kaW5nOiBiaW5kaW5nUG9pbnQsIHJlc291cmNlOiByZXNvdXJjZUdQVSB9ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRiaW5kaW5nUG9pbnQgKys7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBkZXZpY2UuY3JlYXRlQmluZEdyb3VwKCB7XHJcblx0XHRcdGxhYmVsOiAnYmluZEdyb3VwXycgKyBiaW5kR3JvdXAubmFtZSxcclxuXHRcdFx0bGF5b3V0OiBsYXlvdXRHUFUsXHJcblx0XHRcdGVudHJpZXM6IGVudHJpZXNHUFVcclxuXHRcdH0gKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgV2ViR1BVQmluZGluZ1V0aWxzO1xyXG4iLCJpbXBvcnQgeyBCbGVuZENvbG9yRmFjdG9yLCBPbmVNaW51c0JsZW5kQ29sb3JGYWN0b3IsIH0gZnJvbSAnLi4vLi4vY29tbW9uL0NvbnN0YW50cy5qcyc7XHJcblxyXG5pbXBvcnQge1xyXG5cdEdQVUZyb250RmFjZSwgR1BVQ3VsbE1vZGUsIEdQVUNvbG9yV3JpdGVGbGFncywgR1BVQ29tcGFyZUZ1bmN0aW9uLCBHUFVCbGVuZEZhY3RvciwgR1BVQmxlbmRPcGVyYXRpb24sIEdQVUluZGV4Rm9ybWF0LCBHUFVTdGVuY2lsT3BlcmF0aW9uXHJcbn0gZnJvbSAnLi9XZWJHUFVDb25zdGFudHMuanMnO1xyXG5cclxuaW1wb3J0IHtcclxuXHRGcm9udFNpZGUsIEJhY2tTaWRlLCBEb3VibGVTaWRlLFxyXG5cdE5ldmVyRGVwdGgsIEFsd2F5c0RlcHRoLCBMZXNzRGVwdGgsIExlc3NFcXVhbERlcHRoLCBFcXVhbERlcHRoLCBHcmVhdGVyRXF1YWxEZXB0aCwgR3JlYXRlckRlcHRoLCBOb3RFcXVhbERlcHRoLFxyXG5cdE5vQmxlbmRpbmcsIE5vcm1hbEJsZW5kaW5nLCBBZGRpdGl2ZUJsZW5kaW5nLCBTdWJ0cmFjdGl2ZUJsZW5kaW5nLCBNdWx0aXBseUJsZW5kaW5nLCBDdXN0b21CbGVuZGluZyxcclxuXHRaZXJvRmFjdG9yLCBPbmVGYWN0b3IsIFNyY0NvbG9yRmFjdG9yLCBPbmVNaW51c1NyY0NvbG9yRmFjdG9yLCBTcmNBbHBoYUZhY3RvciwgT25lTWludXNTcmNBbHBoYUZhY3RvciwgRHN0Q29sb3JGYWN0b3IsXHJcblx0T25lTWludXNEc3RDb2xvckZhY3RvciwgRHN0QWxwaGFGYWN0b3IsIE9uZU1pbnVzRHN0QWxwaGFGYWN0b3IsIFNyY0FscGhhU2F0dXJhdGVGYWN0b3IsXHJcblx0QWRkRXF1YXRpb24sIFN1YnRyYWN0RXF1YXRpb24sIFJldmVyc2VTdWJ0cmFjdEVxdWF0aW9uLCBNaW5FcXVhdGlvbiwgTWF4RXF1YXRpb24sXHJcblx0S2VlcFN0ZW5jaWxPcCwgWmVyb1N0ZW5jaWxPcCwgUmVwbGFjZVN0ZW5jaWxPcCwgSW52ZXJ0U3RlbmNpbE9wLCBJbmNyZW1lbnRTdGVuY2lsT3AsIERlY3JlbWVudFN0ZW5jaWxPcCwgSW5jcmVtZW50V3JhcFN0ZW5jaWxPcCwgRGVjcmVtZW50V3JhcFN0ZW5jaWxPcCxcclxuXHROZXZlclN0ZW5jaWxGdW5jLCBBbHdheXNTdGVuY2lsRnVuYywgTGVzc1N0ZW5jaWxGdW5jLCBMZXNzRXF1YWxTdGVuY2lsRnVuYywgRXF1YWxTdGVuY2lsRnVuYywgR3JlYXRlckVxdWFsU3RlbmNpbEZ1bmMsIEdyZWF0ZXJTdGVuY2lsRnVuYywgTm90RXF1YWxTdGVuY2lsRnVuY1xyXG59IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cy5qcyc7XHJcblxyXG4vKipcclxuICogQSBXZWJHUFUgYmFja2VuZCB1dGlsaXR5IG1vZHVsZSBmb3IgbWFuYWdpbmcgcGlwZWxpbmVzLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuY2xhc3MgV2ViR1BVUGlwZWxpbmVVdGlscyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgdXRpbGl0eSBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdQVUJhY2tlbmR9IGJhY2tlbmQgLSBUaGUgV2ViR1BVIGJhY2tlbmQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGJhY2tlbmQgKSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlZmVyZW5jZSB0byB0aGUgV2ViR1BVIGJhY2tlbmQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1dlYkdQVUJhY2tlbmR9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuYmFja2VuZCA9IGJhY2tlbmQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgc2FtcGxlIGNvdW50IGRlcml2ZWQgZnJvbSB0aGUgZ2l2ZW4gcmVuZGVyIGNvbnRleHQuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyQ29udGV4dH0gcmVuZGVyQ29udGV4dCAtIFRoZSByZW5kZXIgY29udGV4dC5cclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBzYW1wbGUgY291bnQuXHJcblx0ICovXHJcblx0X2dldFNhbXBsZUNvdW50KCByZW5kZXJDb250ZXh0ICkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmJhY2tlbmQudXRpbHMuZ2V0U2FtcGxlQ291bnRSZW5kZXJDb250ZXh0KCByZW5kZXJDb250ZXh0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyBhIHJlbmRlciBwaXBlbGluZSBmb3IgdGhlIGdpdmVuIHJlbmRlciBvYmplY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JlbmRlck9iamVjdH0gcmVuZGVyT2JqZWN0IC0gVGhlIHJlbmRlciBvYmplY3QuXHJcblx0ICogQHBhcmFtIHtBcnJheTxQcm9taXNlPn0gcHJvbWlzZXMgLSBBbiBhcnJheSBvZiBjb21waWxhdGlvbiBwcm9taXNlcyB3aGljaCBhcmUgdXNlZCBpbiBgY29tcGlsZUFzeW5jKClgLlxyXG5cdCAqL1xyXG5cdGNyZWF0ZVJlbmRlclBpcGVsaW5lKCByZW5kZXJPYmplY3QsIHByb21pc2VzICkge1xyXG5cclxuXHRcdGNvbnN0IHsgb2JqZWN0LCBtYXRlcmlhbCwgZ2VvbWV0cnksIHBpcGVsaW5lIH0gPSByZW5kZXJPYmplY3Q7XHJcblx0XHRjb25zdCB7IHZlcnRleFByb2dyYW0sIGZyYWdtZW50UHJvZ3JhbSB9ID0gcGlwZWxpbmU7XHJcblxyXG5cdFx0Y29uc3QgYmFja2VuZCA9IHRoaXMuYmFja2VuZDtcclxuXHRcdGNvbnN0IGRldmljZSA9IGJhY2tlbmQuZGV2aWNlO1xyXG5cdFx0Y29uc3QgdXRpbHMgPSBiYWNrZW5kLnV0aWxzO1xyXG5cclxuXHRcdGNvbnN0IHBpcGVsaW5lRGF0YSA9IGJhY2tlbmQuZ2V0KCBwaXBlbGluZSApO1xyXG5cclxuXHRcdC8vIGJpbmQgZ3JvdXAgbGF5b3V0c1xyXG5cclxuXHRcdGNvbnN0IGJpbmRHcm91cExheW91dHMgPSBbXTtcclxuXHJcblx0XHRmb3IgKCBjb25zdCBiaW5kR3JvdXAgb2YgcmVuZGVyT2JqZWN0LmdldEJpbmRpbmdzKCkgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBiaW5kaW5nc0RhdGEgPSBiYWNrZW5kLmdldCggYmluZEdyb3VwICk7XHJcblxyXG5cdFx0XHRiaW5kR3JvdXBMYXlvdXRzLnB1c2goIGJpbmRpbmdzRGF0YS5sYXlvdXQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gdmVydGV4IGJ1ZmZlcnNcclxuXHJcblx0XHRjb25zdCB2ZXJ0ZXhCdWZmZXJzID0gYmFja2VuZC5hdHRyaWJ1dGVVdGlscy5jcmVhdGVTaGFkZXJWZXJ0ZXhCdWZmZXJzKCByZW5kZXJPYmplY3QgKTtcclxuXHJcblx0XHQvLyBibGVuZGluZ1xyXG5cclxuXHRcdGxldCBibGVuZGluZztcclxuXHJcblx0XHRpZiAoIG1hdGVyaWFsLnRyYW5zcGFyZW50ID09PSB0cnVlICYmIG1hdGVyaWFsLmJsZW5kaW5nICE9PSBOb0JsZW5kaW5nICkge1xyXG5cclxuXHRcdFx0YmxlbmRpbmcgPSB0aGlzLl9nZXRCbGVuZGluZyggbWF0ZXJpYWwgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gc3RlbmNpbFxyXG5cclxuXHRcdGxldCBzdGVuY2lsRnJvbnQgPSB7fTtcclxuXHJcblx0XHRpZiAoIG1hdGVyaWFsLnN0ZW5jaWxXcml0ZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdHN0ZW5jaWxGcm9udCA9IHtcclxuXHRcdFx0XHRjb21wYXJlOiB0aGlzLl9nZXRTdGVuY2lsQ29tcGFyZSggbWF0ZXJpYWwgKSxcclxuXHRcdFx0XHRmYWlsT3A6IHRoaXMuX2dldFN0ZW5jaWxPcGVyYXRpb24oIG1hdGVyaWFsLnN0ZW5jaWxGYWlsICksXHJcblx0XHRcdFx0ZGVwdGhGYWlsT3A6IHRoaXMuX2dldFN0ZW5jaWxPcGVyYXRpb24oIG1hdGVyaWFsLnN0ZW5jaWxaRmFpbCApLFxyXG5cdFx0XHRcdHBhc3NPcDogdGhpcy5fZ2V0U3RlbmNpbE9wZXJhdGlvbiggbWF0ZXJpYWwuc3RlbmNpbFpQYXNzIClcclxuXHRcdFx0fTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgY29sb3JXcml0ZU1hc2sgPSB0aGlzLl9nZXRDb2xvcldyaXRlTWFzayggbWF0ZXJpYWwgKTtcclxuXHJcblx0XHRjb25zdCB0YXJnZXRzID0gW107XHJcblxyXG5cdFx0aWYgKCByZW5kZXJPYmplY3QuY29udGV4dC50ZXh0dXJlcyAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGNvbnN0IHRleHR1cmVzID0gcmVuZGVyT2JqZWN0LmNvbnRleHQudGV4dHVyZXM7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB0ZXh0dXJlcy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGNvbG9yRm9ybWF0ID0gdXRpbHMuZ2V0VGV4dHVyZUZvcm1hdEdQVSggdGV4dHVyZXNbIGkgXSApO1xyXG5cclxuXHRcdFx0XHR0YXJnZXRzLnB1c2goIHtcclxuXHRcdFx0XHRcdGZvcm1hdDogY29sb3JGb3JtYXQsXHJcblx0XHRcdFx0XHRibGVuZDogYmxlbmRpbmcsXHJcblx0XHRcdFx0XHR3cml0ZU1hc2s6IGNvbG9yV3JpdGVNYXNrXHJcblx0XHRcdFx0fSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRjb25zdCBjb2xvckZvcm1hdCA9IHV0aWxzLmdldEN1cnJlbnRDb2xvckZvcm1hdCggcmVuZGVyT2JqZWN0LmNvbnRleHQgKTtcclxuXHJcblx0XHRcdHRhcmdldHMucHVzaCgge1xyXG5cdFx0XHRcdGZvcm1hdDogY29sb3JGb3JtYXQsXHJcblx0XHRcdFx0YmxlbmQ6IGJsZW5kaW5nLFxyXG5cdFx0XHRcdHdyaXRlTWFzazogY29sb3JXcml0ZU1hc2tcclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCB2ZXJ0ZXhNb2R1bGUgPSBiYWNrZW5kLmdldCggdmVydGV4UHJvZ3JhbSApLm1vZHVsZTtcclxuXHRcdGNvbnN0IGZyYWdtZW50TW9kdWxlID0gYmFja2VuZC5nZXQoIGZyYWdtZW50UHJvZ3JhbSApLm1vZHVsZTtcclxuXHJcblx0XHRjb25zdCBwcmltaXRpdmVTdGF0ZSA9IHRoaXMuX2dldFByaW1pdGl2ZVN0YXRlKCBvYmplY3QsIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xyXG5cdFx0Y29uc3QgZGVwdGhDb21wYXJlID0gdGhpcy5fZ2V0RGVwdGhDb21wYXJlKCBtYXRlcmlhbCApO1xyXG5cdFx0Y29uc3QgZGVwdGhTdGVuY2lsRm9ybWF0ID0gdXRpbHMuZ2V0Q3VycmVudERlcHRoU3RlbmNpbEZvcm1hdCggcmVuZGVyT2JqZWN0LmNvbnRleHQgKTtcclxuXHJcblx0XHRjb25zdCBzYW1wbGVDb3VudCA9IHRoaXMuX2dldFNhbXBsZUNvdW50KCByZW5kZXJPYmplY3QuY29udGV4dCApO1xyXG5cclxuXHRcdGNvbnN0IHBpcGVsaW5lRGVzY3JpcHRvciA9IHtcclxuXHRcdFx0bGFiZWw6IGByZW5kZXJQaXBlbGluZV8keyBtYXRlcmlhbC5uYW1lIHx8IG1hdGVyaWFsLnR5cGUgfV8keyBtYXRlcmlhbC5pZCB9YCxcclxuXHRcdFx0dmVydGV4OiBPYmplY3QuYXNzaWduKCB7fSwgdmVydGV4TW9kdWxlLCB7IGJ1ZmZlcnM6IHZlcnRleEJ1ZmZlcnMgfSApLFxyXG5cdFx0XHRmcmFnbWVudDogT2JqZWN0LmFzc2lnbigge30sIGZyYWdtZW50TW9kdWxlLCB7IHRhcmdldHMgfSApLFxyXG5cdFx0XHRwcmltaXRpdmU6IHByaW1pdGl2ZVN0YXRlLFxyXG5cdFx0XHRtdWx0aXNhbXBsZToge1xyXG5cdFx0XHRcdGNvdW50OiBzYW1wbGVDb3VudCxcclxuXHRcdFx0XHRhbHBoYVRvQ292ZXJhZ2VFbmFibGVkOiBtYXRlcmlhbC5hbHBoYVRvQ292ZXJhZ2UgJiYgc2FtcGxlQ291bnQgPiAxXHJcblx0XHRcdH0sXHJcblx0XHRcdGxheW91dDogZGV2aWNlLmNyZWF0ZVBpcGVsaW5lTGF5b3V0KCB7XHJcblx0XHRcdFx0YmluZEdyb3VwTGF5b3V0c1xyXG5cdFx0XHR9IClcclxuXHRcdH07XHJcblxyXG5cclxuXHRcdGNvbnN0IGRlcHRoU3RlbmNpbCA9IHt9O1xyXG5cdFx0Y29uc3QgcmVuZGVyRGVwdGggPSByZW5kZXJPYmplY3QuY29udGV4dC5kZXB0aDtcclxuXHRcdGNvbnN0IHJlbmRlclN0ZW5jaWwgPSByZW5kZXJPYmplY3QuY29udGV4dC5zdGVuY2lsO1xyXG5cclxuXHRcdGlmICggcmVuZGVyRGVwdGggPT09IHRydWUgfHwgcmVuZGVyU3RlbmNpbCA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdGlmICggcmVuZGVyRGVwdGggPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdGRlcHRoU3RlbmNpbC5mb3JtYXQgPSBkZXB0aFN0ZW5jaWxGb3JtYXQ7XHJcblx0XHRcdFx0ZGVwdGhTdGVuY2lsLmRlcHRoV3JpdGVFbmFibGVkID0gbWF0ZXJpYWwuZGVwdGhXcml0ZTtcclxuXHRcdFx0XHRkZXB0aFN0ZW5jaWwuZGVwdGhDb21wYXJlID0gZGVwdGhDb21wYXJlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCByZW5kZXJTdGVuY2lsID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRkZXB0aFN0ZW5jaWwuc3RlbmNpbEZyb250ID0gc3RlbmNpbEZyb250O1xyXG5cdFx0XHRcdGRlcHRoU3RlbmNpbC5zdGVuY2lsQmFjayA9IHt9OyAvLyB0aHJlZS5qcyBkb2VzIG5vdCBwcm92aWRlIGFuIEFQSSB0byBjb25maWd1cmUgdGhlIGJhY2sgZnVuY3Rpb24gKGdsLnN0ZW5jaWxGdW5jU2VwYXJhdGUoKSB3YXMgbmV2ZXIgdXNlZClcclxuXHRcdFx0XHRkZXB0aFN0ZW5jaWwuc3RlbmNpbFJlYWRNYXNrID0gbWF0ZXJpYWwuc3RlbmNpbEZ1bmNNYXNrO1xyXG5cdFx0XHRcdGRlcHRoU3RlbmNpbC5zdGVuY2lsV3JpdGVNYXNrID0gbWF0ZXJpYWwuc3RlbmNpbFdyaXRlTWFzaztcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggbWF0ZXJpYWwucG9seWdvbk9mZnNldCA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0ZGVwdGhTdGVuY2lsLmRlcHRoQmlhcyA9IG1hdGVyaWFsLnBvbHlnb25PZmZzZXRVbml0cztcclxuXHRcdFx0XHRkZXB0aFN0ZW5jaWwuZGVwdGhCaWFzU2xvcGVTY2FsZSA9IG1hdGVyaWFsLnBvbHlnb25PZmZzZXRGYWN0b3I7XHJcblx0XHRcdFx0ZGVwdGhTdGVuY2lsLmRlcHRoQmlhc0NsYW1wID0gMDsgLy8gdGhyZWUuanMgZG9lcyBub3QgcHJvdmlkZSBhbiBBUEkgdG8gY29uZmlndXJlIHRoaXMgdmFsdWVcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHBpcGVsaW5lRGVzY3JpcHRvci5kZXB0aFN0ZW5jaWwgPSBkZXB0aFN0ZW5jaWw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHJcblx0XHRpZiAoIHByb21pc2VzID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0cGlwZWxpbmVEYXRhLnBpcGVsaW5lID0gZGV2aWNlLmNyZWF0ZVJlbmRlclBpcGVsaW5lKCBwaXBlbGluZURlc2NyaXB0b3IgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc3QgcCA9IG5ldyBQcm9taXNlKCAoIHJlc29sdmUgLyosIHJlamVjdCovICkgPT4ge1xyXG5cclxuXHRcdFx0XHRkZXZpY2UuY3JlYXRlUmVuZGVyUGlwZWxpbmVBc3luYyggcGlwZWxpbmVEZXNjcmlwdG9yICkudGhlbiggcGlwZWxpbmUgPT4ge1xyXG5cclxuXHRcdFx0XHRcdHBpcGVsaW5lRGF0YS5waXBlbGluZSA9IHBpcGVsaW5lO1xyXG5cdFx0XHRcdFx0cmVzb2x2ZSgpO1xyXG5cclxuXHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRwcm9taXNlcy5wdXNoKCBwICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgR1BVIHJlbmRlciBidW5kbGUgZW5jb2RlciBmb3IgdGhlIGdpdmVuIHJlbmRlciBjb250ZXh0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSZW5kZXJDb250ZXh0fSByZW5kZXJDb250ZXh0IC0gVGhlIHJlbmRlciBjb250ZXh0LlxyXG5cdCAqIEByZXR1cm4ge0dQVVJlbmRlckJ1bmRsZUVuY29kZXJ9IFRoZSBHUFUgcmVuZGVyIGJ1bmRsZSBlbmNvZGVyLlxyXG5cdCAqL1xyXG5cdGNyZWF0ZUJ1bmRsZUVuY29kZXIoIHJlbmRlckNvbnRleHQgKSB7XHJcblxyXG5cdFx0Y29uc3QgYmFja2VuZCA9IHRoaXMuYmFja2VuZDtcclxuXHRcdGNvbnN0IHsgdXRpbHMsIGRldmljZSB9ID0gYmFja2VuZDtcclxuXHJcblx0XHRjb25zdCBkZXB0aFN0ZW5jaWxGb3JtYXQgPSB1dGlscy5nZXRDdXJyZW50RGVwdGhTdGVuY2lsRm9ybWF0KCByZW5kZXJDb250ZXh0ICk7XHJcblx0XHRjb25zdCBjb2xvckZvcm1hdCA9IHV0aWxzLmdldEN1cnJlbnRDb2xvckZvcm1hdCggcmVuZGVyQ29udGV4dCApO1xyXG5cdFx0Y29uc3Qgc2FtcGxlQ291bnQgPSB0aGlzLl9nZXRTYW1wbGVDb3VudCggcmVuZGVyQ29udGV4dCApO1xyXG5cclxuXHRcdGNvbnN0IGRlc2NyaXB0b3IgPSB7XHJcblx0XHRcdGxhYmVsOiAncmVuZGVyQnVuZGxlRW5jb2RlcicsXHJcblx0XHRcdGNvbG9yRm9ybWF0czogWyBjb2xvckZvcm1hdCBdLFxyXG5cdFx0XHRkZXB0aFN0ZW5jaWxGb3JtYXQsXHJcblx0XHRcdHNhbXBsZUNvdW50XHJcblx0XHR9O1xyXG5cclxuXHRcdHJldHVybiBkZXZpY2UuY3JlYXRlUmVuZGVyQnVuZGxlRW5jb2RlciggZGVzY3JpcHRvciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgYSBjb21wdXRlIHBpcGVsaW5lIGZvciB0aGUgZ2l2ZW4gY29tcHV0ZSBub2RlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtDb21wdXRlUGlwZWxpbmV9IHBpcGVsaW5lIC0gVGhlIGNvbXB1dGUgcGlwZWxpbmUuXHJcblx0ICogQHBhcmFtIHtBcnJheTxCaW5kR3JvdXA+fSBiaW5kaW5ncyAtIFRoZSBiaW5kaW5ncy5cclxuXHQgKi9cclxuXHRjcmVhdGVDb21wdXRlUGlwZWxpbmUoIHBpcGVsaW5lLCBiaW5kaW5ncyApIHtcclxuXHJcblx0XHRjb25zdCBiYWNrZW5kID0gdGhpcy5iYWNrZW5kO1xyXG5cdFx0Y29uc3QgZGV2aWNlID0gYmFja2VuZC5kZXZpY2U7XHJcblxyXG5cdFx0Y29uc3QgY29tcHV0ZVByb2dyYW0gPSBiYWNrZW5kLmdldCggcGlwZWxpbmUuY29tcHV0ZVByb2dyYW0gKS5tb2R1bGU7XHJcblxyXG5cdFx0Y29uc3QgcGlwZWxpbmVHUFUgPSBiYWNrZW5kLmdldCggcGlwZWxpbmUgKTtcclxuXHJcblx0XHQvLyBiaW5kIGdyb3VwIGxheW91dHNcclxuXHJcblx0XHRjb25zdCBiaW5kR3JvdXBMYXlvdXRzID0gW107XHJcblxyXG5cdFx0Zm9yICggY29uc3QgYmluZGluZ3NHcm91cCBvZiBiaW5kaW5ncyApIHtcclxuXHJcblx0XHRcdGNvbnN0IGJpbmRpbmdzRGF0YSA9IGJhY2tlbmQuZ2V0KCBiaW5kaW5nc0dyb3VwICk7XHJcblxyXG5cdFx0XHRiaW5kR3JvdXBMYXlvdXRzLnB1c2goIGJpbmRpbmdzRGF0YS5sYXlvdXQgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cGlwZWxpbmVHUFUucGlwZWxpbmUgPSBkZXZpY2UuY3JlYXRlQ29tcHV0ZVBpcGVsaW5lKCB7XHJcblx0XHRcdGNvbXB1dGU6IGNvbXB1dGVQcm9ncmFtLFxyXG5cdFx0XHRsYXlvdXQ6IGRldmljZS5jcmVhdGVQaXBlbGluZUxheW91dCgge1xyXG5cdFx0XHRcdGJpbmRHcm91cExheW91dHNcclxuXHRcdFx0fSApXHJcblx0XHR9ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgYmxlbmRpbmcgc3RhdGUgYXMgYSBkZXNjcmlwdG9yIG9iamVjdCByZXF1aXJlZFxyXG5cdCAqIGZvciB0aGUgcGlwZWxpbmUgY3JlYXRpb24uXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7TWF0ZXJpYWx9IG1hdGVyaWFsIC0gVGhlIG1hdGVyaWFsLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdH0gVGhlIGJsZW5kaW5nIHN0YXRlLlxyXG5cdCAqL1xyXG5cdF9nZXRCbGVuZGluZyggbWF0ZXJpYWwgKSB7XHJcblxyXG5cdFx0bGV0IGNvbG9yLCBhbHBoYTtcclxuXHJcblx0XHRjb25zdCBibGVuZGluZyA9IG1hdGVyaWFsLmJsZW5kaW5nO1xyXG5cdFx0Y29uc3QgYmxlbmRTcmMgPSBtYXRlcmlhbC5ibGVuZFNyYztcclxuXHRcdGNvbnN0IGJsZW5kRHN0ID0gbWF0ZXJpYWwuYmxlbmREc3Q7XHJcblx0XHRjb25zdCBibGVuZEVxdWF0aW9uID0gbWF0ZXJpYWwuYmxlbmRFcXVhdGlvbjtcclxuXHJcblxyXG5cdFx0aWYgKCBibGVuZGluZyA9PT0gQ3VzdG9tQmxlbmRpbmcgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBibGVuZFNyY0FscGhhID0gbWF0ZXJpYWwuYmxlbmRTcmNBbHBoYSAhPT0gbnVsbCA/IG1hdGVyaWFsLmJsZW5kU3JjQWxwaGEgOiBibGVuZFNyYztcclxuXHRcdFx0Y29uc3QgYmxlbmREc3RBbHBoYSA9IG1hdGVyaWFsLmJsZW5kRHN0QWxwaGEgIT09IG51bGwgPyBtYXRlcmlhbC5ibGVuZERzdEFscGhhIDogYmxlbmREc3Q7XHJcblx0XHRcdGNvbnN0IGJsZW5kRXF1YXRpb25BbHBoYSA9IG1hdGVyaWFsLmJsZW5kRXF1YXRpb25BbHBoYSAhPT0gbnVsbCA/IG1hdGVyaWFsLmJsZW5kRXF1YXRpb25BbHBoYSA6IGJsZW5kRXF1YXRpb247XHJcblxyXG5cdFx0XHRjb2xvciA9IHtcclxuXHRcdFx0XHRzcmNGYWN0b3I6IHRoaXMuX2dldEJsZW5kRmFjdG9yKCBibGVuZFNyYyApLFxyXG5cdFx0XHRcdGRzdEZhY3RvcjogdGhpcy5fZ2V0QmxlbmRGYWN0b3IoIGJsZW5kRHN0ICksXHJcblx0XHRcdFx0b3BlcmF0aW9uOiB0aGlzLl9nZXRCbGVuZE9wZXJhdGlvbiggYmxlbmRFcXVhdGlvbiApXHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHRhbHBoYSA9IHtcclxuXHRcdFx0XHRzcmNGYWN0b3I6IHRoaXMuX2dldEJsZW5kRmFjdG9yKCBibGVuZFNyY0FscGhhICksXHJcblx0XHRcdFx0ZHN0RmFjdG9yOiB0aGlzLl9nZXRCbGVuZEZhY3RvciggYmxlbmREc3RBbHBoYSApLFxyXG5cdFx0XHRcdG9wZXJhdGlvbjogdGhpcy5fZ2V0QmxlbmRPcGVyYXRpb24oIGJsZW5kRXF1YXRpb25BbHBoYSApXHJcblx0XHRcdH07XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGNvbnN0IHByZW11bHRpcGxpZWRBbHBoYSA9IG1hdGVyaWFsLnByZW11bHRpcGxpZWRBbHBoYTtcclxuXHJcblx0XHRcdGNvbnN0IHNldEJsZW5kID0gKCBzcmNSR0IsIGRzdFJHQiwgc3JjQWxwaGEsIGRzdEFscGhhICkgPT4ge1xyXG5cclxuXHRcdFx0XHRjb2xvciA9IHtcclxuXHRcdFx0XHRcdHNyY0ZhY3Rvcjogc3JjUkdCLFxyXG5cdFx0XHRcdFx0ZHN0RmFjdG9yOiBkc3RSR0IsXHJcblx0XHRcdFx0XHRvcGVyYXRpb246IEdQVUJsZW5kT3BlcmF0aW9uLkFkZFxyXG5cdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdGFscGhhID0ge1xyXG5cdFx0XHRcdFx0c3JjRmFjdG9yOiBzcmNBbHBoYSxcclxuXHRcdFx0XHRcdGRzdEZhY3RvcjogZHN0QWxwaGEsXHJcblx0XHRcdFx0XHRvcGVyYXRpb246IEdQVUJsZW5kT3BlcmF0aW9uLkFkZFxyXG5cdFx0XHRcdH07XHJcblxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0aWYgKCBwcmVtdWx0aXBsaWVkQWxwaGEgKSB7XHJcblxyXG5cdFx0XHRcdHN3aXRjaCAoIGJsZW5kaW5nICkge1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgTm9ybWFsQmxlbmRpbmc6XHJcblx0XHRcdFx0XHRcdHNldEJsZW5kKCBHUFVCbGVuZEZhY3Rvci5PbmUsIEdQVUJsZW5kRmFjdG9yLk9uZU1pbnVzU3JjQWxwaGEsIEdQVUJsZW5kRmFjdG9yLk9uZSwgR1BVQmxlbmRGYWN0b3IuT25lTWludXNTcmNBbHBoYSApO1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRjYXNlIEFkZGl0aXZlQmxlbmRpbmc6XHJcblx0XHRcdFx0XHRcdHNldEJsZW5kKCBHUFVCbGVuZEZhY3Rvci5PbmUsIEdQVUJsZW5kRmFjdG9yLk9uZSwgR1BVQmxlbmRGYWN0b3IuT25lLCBHUFVCbGVuZEZhY3Rvci5PbmUgKTtcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0Y2FzZSBTdWJ0cmFjdGl2ZUJsZW5kaW5nOlxyXG5cdFx0XHRcdFx0XHRzZXRCbGVuZCggR1BVQmxlbmRGYWN0b3IuWmVybywgR1BVQmxlbmRGYWN0b3IuT25lTWludXNTcmMsIEdQVUJsZW5kRmFjdG9yLlplcm8sIEdQVUJsZW5kRmFjdG9yLk9uZSApO1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRjYXNlIE11bHRpcGx5QmxlbmRpbmc6XHJcblx0XHRcdFx0XHRcdHNldEJsZW5kKCBHUFVCbGVuZEZhY3Rvci5aZXJvLCBHUFVCbGVuZEZhY3Rvci5TcmMsIEdQVUJsZW5kRmFjdG9yLlplcm8sIEdQVUJsZW5kRmFjdG9yLlNyY0FscGhhICk7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRzd2l0Y2ggKCBibGVuZGluZyApIHtcclxuXHJcblx0XHRcdFx0XHRjYXNlIE5vcm1hbEJsZW5kaW5nOlxyXG5cdFx0XHRcdFx0XHRzZXRCbGVuZCggR1BVQmxlbmRGYWN0b3IuU3JjQWxwaGEsIEdQVUJsZW5kRmFjdG9yLk9uZU1pbnVzU3JjQWxwaGEsIEdQVUJsZW5kRmFjdG9yLk9uZSwgR1BVQmxlbmRGYWN0b3IuT25lTWludXNTcmNBbHBoYSApO1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRjYXNlIEFkZGl0aXZlQmxlbmRpbmc6XHJcblx0XHRcdFx0XHRcdHNldEJsZW5kKCBHUFVCbGVuZEZhY3Rvci5TcmNBbHBoYSwgR1BVQmxlbmRGYWN0b3IuT25lLCBHUFVCbGVuZEZhY3Rvci5TcmNBbHBoYSwgR1BVQmxlbmRGYWN0b3IuT25lICk7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdGNhc2UgU3VidHJhY3RpdmVCbGVuZGluZzpcclxuXHRcdFx0XHRcdFx0c2V0QmxlbmQoIEdQVUJsZW5kRmFjdG9yLlplcm8sIEdQVUJsZW5kRmFjdG9yLk9uZU1pbnVzU3JjLCBHUFVCbGVuZEZhY3Rvci5aZXJvLCBHUFVCbGVuZEZhY3Rvci5PbmUgKTtcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0Y2FzZSBNdWx0aXBseUJsZW5kaW5nOlxyXG5cdFx0XHRcdFx0XHRzZXRCbGVuZCggR1BVQmxlbmRGYWN0b3IuWmVybywgR1BVQmxlbmRGYWN0b3IuU3JjLCBHUFVCbGVuZEZhY3Rvci5aZXJvLCBHUFVCbGVuZEZhY3Rvci5TcmMgKTtcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBjb2xvciAhPT0gdW5kZWZpbmVkICYmIGFscGhhICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4geyBjb2xvciwgYWxwaGEgfTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdQVVJlbmRlcmVyOiBJbnZhbGlkIGJsZW5kaW5nOiAnLCBibGVuZGluZyApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIEdQVSBibGVuZCBmYWN0b3Igd2hpY2ggaXMgcmVxdWlyZWQgZm9yIHRoZSBwaXBlbGluZSBjcmVhdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGJsZW5kIC0gVGhlIGJsZW5kIGZhY3RvciBhcyBhIHRocmVlLmpzIGNvbnN0YW50LlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIEdQVSBibGVuZCBmYWN0b3IuXHJcblx0ICovXHJcblx0X2dldEJsZW5kRmFjdG9yKCBibGVuZCApIHtcclxuXHJcblx0XHRsZXQgYmxlbmRGYWN0b3I7XHJcblxyXG5cdFx0c3dpdGNoICggYmxlbmQgKSB7XHJcblxyXG5cdFx0XHRjYXNlIFplcm9GYWN0b3I6XHJcblx0XHRcdFx0YmxlbmRGYWN0b3IgPSBHUFVCbGVuZEZhY3Rvci5aZXJvO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBPbmVGYWN0b3I6XHJcblx0XHRcdFx0YmxlbmRGYWN0b3IgPSBHUFVCbGVuZEZhY3Rvci5PbmU7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIFNyY0NvbG9yRmFjdG9yOlxyXG5cdFx0XHRcdGJsZW5kRmFjdG9yID0gR1BVQmxlbmRGYWN0b3IuU3JjO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBPbmVNaW51c1NyY0NvbG9yRmFjdG9yOlxyXG5cdFx0XHRcdGJsZW5kRmFjdG9yID0gR1BVQmxlbmRGYWN0b3IuT25lTWludXNTcmM7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIFNyY0FscGhhRmFjdG9yOlxyXG5cdFx0XHRcdGJsZW5kRmFjdG9yID0gR1BVQmxlbmRGYWN0b3IuU3JjQWxwaGE7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIE9uZU1pbnVzU3JjQWxwaGFGYWN0b3I6XHJcblx0XHRcdFx0YmxlbmRGYWN0b3IgPSBHUFVCbGVuZEZhY3Rvci5PbmVNaW51c1NyY0FscGhhO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBEc3RDb2xvckZhY3RvcjpcclxuXHRcdFx0XHRibGVuZEZhY3RvciA9IEdQVUJsZW5kRmFjdG9yLkRzdDtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgT25lTWludXNEc3RDb2xvckZhY3RvcjpcclxuXHRcdFx0XHRibGVuZEZhY3RvciA9IEdQVUJsZW5kRmFjdG9yLk9uZU1pbnVzRHN0Q29sb3I7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIERzdEFscGhhRmFjdG9yOlxyXG5cdFx0XHRcdGJsZW5kRmFjdG9yID0gR1BVQmxlbmRGYWN0b3IuRHN0QWxwaGE7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIE9uZU1pbnVzRHN0QWxwaGFGYWN0b3I6XHJcblx0XHRcdFx0YmxlbmRGYWN0b3IgPSBHUFVCbGVuZEZhY3Rvci5PbmVNaW51c0RzdEFscGhhO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBTcmNBbHBoYVNhdHVyYXRlRmFjdG9yOlxyXG5cdFx0XHRcdGJsZW5kRmFjdG9yID0gR1BVQmxlbmRGYWN0b3IuU3JjQWxwaGFTYXR1cmF0ZWQ7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIEJsZW5kQ29sb3JGYWN0b3I6XHJcblx0XHRcdFx0YmxlbmRGYWN0b3IgPSBHUFVCbGVuZEZhY3Rvci5Db25zdGFudDtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgT25lTWludXNCbGVuZENvbG9yRmFjdG9yOlxyXG5cdFx0XHRcdGJsZW5kRmFjdG9yID0gR1BVQmxlbmRGYWN0b3IuT25lTWludXNDb25zdGFudDtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdQVVJlbmRlcmVyOiBCbGVuZCBmYWN0b3Igbm90IHN1cHBvcnRlZC4nLCBibGVuZCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gYmxlbmRGYWN0b3I7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgR1BVIHN0ZW5jaWwgY29tcGFyZSBmdW5jdGlvbiB3aGljaCBpcyByZXF1aXJlZCBmb3IgdGhlIHBpcGVsaW5lIGNyZWF0aW9uLlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge01hdGVyaWFsfSBtYXRlcmlhbCAtIFRoZSBtYXRlcmlhbC5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBHUFUgc3RlbmNpbCBjb21wYXJlIGZ1bmN0aW9uLlxyXG5cdCAqL1xyXG5cdF9nZXRTdGVuY2lsQ29tcGFyZSggbWF0ZXJpYWwgKSB7XHJcblxyXG5cdFx0bGV0IHN0ZW5jaWxDb21wYXJlO1xyXG5cclxuXHRcdGNvbnN0IHN0ZW5jaWxGdW5jID0gbWF0ZXJpYWwuc3RlbmNpbEZ1bmM7XHJcblxyXG5cdFx0c3dpdGNoICggc3RlbmNpbEZ1bmMgKSB7XHJcblxyXG5cdFx0XHRjYXNlIE5ldmVyU3RlbmNpbEZ1bmM6XHJcblx0XHRcdFx0c3RlbmNpbENvbXBhcmUgPSBHUFVDb21wYXJlRnVuY3Rpb24uTmV2ZXI7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIEFsd2F5c1N0ZW5jaWxGdW5jOlxyXG5cdFx0XHRcdHN0ZW5jaWxDb21wYXJlID0gR1BVQ29tcGFyZUZ1bmN0aW9uLkFsd2F5cztcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgTGVzc1N0ZW5jaWxGdW5jOlxyXG5cdFx0XHRcdHN0ZW5jaWxDb21wYXJlID0gR1BVQ29tcGFyZUZ1bmN0aW9uLkxlc3M7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIExlc3NFcXVhbFN0ZW5jaWxGdW5jOlxyXG5cdFx0XHRcdHN0ZW5jaWxDb21wYXJlID0gR1BVQ29tcGFyZUZ1bmN0aW9uLkxlc3NFcXVhbDtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgRXF1YWxTdGVuY2lsRnVuYzpcclxuXHRcdFx0XHRzdGVuY2lsQ29tcGFyZSA9IEdQVUNvbXBhcmVGdW5jdGlvbi5FcXVhbDtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgR3JlYXRlckVxdWFsU3RlbmNpbEZ1bmM6XHJcblx0XHRcdFx0c3RlbmNpbENvbXBhcmUgPSBHUFVDb21wYXJlRnVuY3Rpb24uR3JlYXRlckVxdWFsO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBHcmVhdGVyU3RlbmNpbEZ1bmM6XHJcblx0XHRcdFx0c3RlbmNpbENvbXBhcmUgPSBHUFVDb21wYXJlRnVuY3Rpb24uR3JlYXRlcjtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgTm90RXF1YWxTdGVuY2lsRnVuYzpcclxuXHRcdFx0XHRzdGVuY2lsQ29tcGFyZSA9IEdQVUNvbXBhcmVGdW5jdGlvbi5Ob3RFcXVhbDtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdQVVJlbmRlcmVyOiBJbnZhbGlkIHN0ZW5jaWwgZnVuY3Rpb24uJywgc3RlbmNpbEZ1bmMgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHN0ZW5jaWxDb21wYXJlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIEdQVSBzdGVuY2lsIG9wZXJhdGlvbiB3aGljaCBpcyByZXF1aXJlZCBmb3IgdGhlIHBpcGVsaW5lIGNyZWF0aW9uLlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge251bWJlcn0gb3AgLSBBIHRocmVlLmpzIGNvbnN0YW50IGRlZmluaW5nIHRoZSBzdGVuY2lsIG9wZXJhdGlvbi5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBHUFUgc3RlbmNpbCBvcGVyYXRpb24uXHJcblx0ICovXHJcblx0X2dldFN0ZW5jaWxPcGVyYXRpb24oIG9wICkge1xyXG5cclxuXHRcdGxldCBzdGVuY2lsT3BlcmF0aW9uO1xyXG5cclxuXHRcdHN3aXRjaCAoIG9wICkge1xyXG5cclxuXHRcdFx0Y2FzZSBLZWVwU3RlbmNpbE9wOlxyXG5cdFx0XHRcdHN0ZW5jaWxPcGVyYXRpb24gPSBHUFVTdGVuY2lsT3BlcmF0aW9uLktlZXA7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIFplcm9TdGVuY2lsT3A6XHJcblx0XHRcdFx0c3RlbmNpbE9wZXJhdGlvbiA9IEdQVVN0ZW5jaWxPcGVyYXRpb24uWmVybztcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgUmVwbGFjZVN0ZW5jaWxPcDpcclxuXHRcdFx0XHRzdGVuY2lsT3BlcmF0aW9uID0gR1BVU3RlbmNpbE9wZXJhdGlvbi5SZXBsYWNlO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBJbnZlcnRTdGVuY2lsT3A6XHJcblx0XHRcdFx0c3RlbmNpbE9wZXJhdGlvbiA9IEdQVVN0ZW5jaWxPcGVyYXRpb24uSW52ZXJ0O1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBJbmNyZW1lbnRTdGVuY2lsT3A6XHJcblx0XHRcdFx0c3RlbmNpbE9wZXJhdGlvbiA9IEdQVVN0ZW5jaWxPcGVyYXRpb24uSW5jcmVtZW50Q2xhbXA7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIERlY3JlbWVudFN0ZW5jaWxPcDpcclxuXHRcdFx0XHRzdGVuY2lsT3BlcmF0aW9uID0gR1BVU3RlbmNpbE9wZXJhdGlvbi5EZWNyZW1lbnRDbGFtcDtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgSW5jcmVtZW50V3JhcFN0ZW5jaWxPcDpcclxuXHRcdFx0XHRzdGVuY2lsT3BlcmF0aW9uID0gR1BVU3RlbmNpbE9wZXJhdGlvbi5JbmNyZW1lbnRXcmFwO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBEZWNyZW1lbnRXcmFwU3RlbmNpbE9wOlxyXG5cdFx0XHRcdHN0ZW5jaWxPcGVyYXRpb24gPSBHUFVTdGVuY2lsT3BlcmF0aW9uLkRlY3JlbWVudFdyYXA7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHUFVSZW5kZXJlcjogSW52YWxpZCBzdGVuY2lsIG9wZXJhdGlvbi4nLCBzdGVuY2lsT3BlcmF0aW9uICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBzdGVuY2lsT3BlcmF0aW9uO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIEdQVSBibGVuZCBvcGVyYXRpb24gd2hpY2ggaXMgcmVxdWlyZWQgZm9yIHRoZSBwaXBlbGluZSBjcmVhdGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGJsZW5kRXF1YXRpb24gLSBBIHRocmVlLmpzIGNvbnN0YW50IGRlZmluaW5nIHRoZSBibGVuZCBlcXVhdGlvbi5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBHUFUgYmxlbmQgb3BlcmF0aW9uLlxyXG5cdCAqL1xyXG5cdF9nZXRCbGVuZE9wZXJhdGlvbiggYmxlbmRFcXVhdGlvbiApIHtcclxuXHJcblx0XHRsZXQgYmxlbmRPcGVyYXRpb247XHJcblxyXG5cdFx0c3dpdGNoICggYmxlbmRFcXVhdGlvbiApIHtcclxuXHJcblx0XHRcdGNhc2UgQWRkRXF1YXRpb246XHJcblx0XHRcdFx0YmxlbmRPcGVyYXRpb24gPSBHUFVCbGVuZE9wZXJhdGlvbi5BZGQ7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIFN1YnRyYWN0RXF1YXRpb246XHJcblx0XHRcdFx0YmxlbmRPcGVyYXRpb24gPSBHUFVCbGVuZE9wZXJhdGlvbi5TdWJ0cmFjdDtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgUmV2ZXJzZVN1YnRyYWN0RXF1YXRpb246XHJcblx0XHRcdFx0YmxlbmRPcGVyYXRpb24gPSBHUFVCbGVuZE9wZXJhdGlvbi5SZXZlcnNlU3VidHJhY3Q7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIE1pbkVxdWF0aW9uOlxyXG5cdFx0XHRcdGJsZW5kT3BlcmF0aW9uID0gR1BVQmxlbmRPcGVyYXRpb24uTWluO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBNYXhFcXVhdGlvbjpcclxuXHRcdFx0XHRibGVuZE9wZXJhdGlvbiA9IEdQVUJsZW5kT3BlcmF0aW9uLk1heDtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdQVVBpcGVsaW5lVXRpbHM6IEJsZW5kIGVxdWF0aW9uIG5vdCBzdXBwb3J0ZWQuJywgYmxlbmRFcXVhdGlvbiApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gYmxlbmRPcGVyYXRpb247XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgcHJpbWl0aXZlIHN0YXRlIGFzIGEgZGVzY3JpcHRvciBvYmplY3QgcmVxdWlyZWRcclxuXHQgKiBmb3IgdGhlIHBpcGVsaW5lIGNyZWF0aW9uLlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge09iamVjdDNEfSBvYmplY3QgLSBUaGUgM0Qgb2JqZWN0LlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyR2VvbWV0cnl9IGdlb21ldHJ5IC0gVGhlIGdlb21ldHJ5LlxyXG5cdCAqIEBwYXJhbSB7TWF0ZXJpYWx9IG1hdGVyaWFsIC0gVGhlIG1hdGVyaWFsLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdH0gVGhlIHByaW1pdGl2ZSBzdGF0ZS5cclxuXHQgKi9cclxuXHRfZ2V0UHJpbWl0aXZlU3RhdGUoIG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsICkge1xyXG5cclxuXHRcdGNvbnN0IGRlc2NyaXB0b3IgPSB7fTtcclxuXHRcdGNvbnN0IHV0aWxzID0gdGhpcy5iYWNrZW5kLnV0aWxzO1xyXG5cclxuXHRcdGRlc2NyaXB0b3IudG9wb2xvZ3kgPSB1dGlscy5nZXRQcmltaXRpdmVUb3BvbG9neSggb2JqZWN0LCBtYXRlcmlhbCApO1xyXG5cclxuXHRcdGlmICggZ2VvbWV0cnkuaW5kZXggIT09IG51bGwgJiYgb2JqZWN0LmlzTGluZSA9PT0gdHJ1ZSAmJiBvYmplY3QuaXNMaW5lU2VnbWVudHMgIT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRkZXNjcmlwdG9yLnN0cmlwSW5kZXhGb3JtYXQgPSAoIGdlb21ldHJ5LmluZGV4LmFycmF5IGluc3RhbmNlb2YgVWludDE2QXJyYXkgKSA/IEdQVUluZGV4Rm9ybWF0LlVpbnQxNiA6IEdQVUluZGV4Rm9ybWF0LlVpbnQzMjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0c3dpdGNoICggbWF0ZXJpYWwuc2lkZSApIHtcclxuXHJcblx0XHRcdGNhc2UgRnJvbnRTaWRlOlxyXG5cdFx0XHRcdGRlc2NyaXB0b3IuZnJvbnRGYWNlID0gR1BVRnJvbnRGYWNlLkNDVztcclxuXHRcdFx0XHRkZXNjcmlwdG9yLmN1bGxNb2RlID0gR1BVQ3VsbE1vZGUuQmFjaztcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgQmFja1NpZGU6XHJcblx0XHRcdFx0ZGVzY3JpcHRvci5mcm9udEZhY2UgPSBHUFVGcm9udEZhY2UuQ0NXO1xyXG5cdFx0XHRcdGRlc2NyaXB0b3IuY3VsbE1vZGUgPSBHUFVDdWxsTW9kZS5Gcm9udDtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgRG91YmxlU2lkZTpcclxuXHRcdFx0XHRkZXNjcmlwdG9yLmZyb250RmFjZSA9IEdQVUZyb250RmFjZS5DQ1c7XHJcblx0XHRcdFx0ZGVzY3JpcHRvci5jdWxsTW9kZSA9IEdQVUN1bGxNb2RlLk5vbmU7XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHUFVQaXBlbGluZVV0aWxzOiBVbmtub3duIG1hdGVyaWFsLnNpZGUgdmFsdWUuJywgbWF0ZXJpYWwuc2lkZSApO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZGVzY3JpcHRvcjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBHUFUgY29sb3Igd3JpdGUgbWFzayB3aGljaCBpcyByZXF1aXJlZCBmb3IgdGhlIHBpcGVsaW5lIGNyZWF0aW9uLlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge01hdGVyaWFsfSBtYXRlcmlhbCAtIFRoZSBtYXRlcmlhbC5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBHUFUgY29sb3Igd3JpdGUgbWFzay5cclxuXHQgKi9cclxuXHRfZ2V0Q29sb3JXcml0ZU1hc2soIG1hdGVyaWFsICkge1xyXG5cclxuXHRcdHJldHVybiAoIG1hdGVyaWFsLmNvbG9yV3JpdGUgPT09IHRydWUgKSA/IEdQVUNvbG9yV3JpdGVGbGFncy5BbGwgOiBHUFVDb2xvcldyaXRlRmxhZ3MuTm9uZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBHUFUgZGVwdGggY29tcGFyZSBmdW5jdGlvbiB3aGljaCBpcyByZXF1aXJlZCBmb3IgdGhlIHBpcGVsaW5lIGNyZWF0aW9uLlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge01hdGVyaWFsfSBtYXRlcmlhbCAtIFRoZSBtYXRlcmlhbC5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBHUFUgZGVwdGggY29tcGFyZSBmdW5jdGlvbi5cclxuXHQgKi9cclxuXHRfZ2V0RGVwdGhDb21wYXJlKCBtYXRlcmlhbCApIHtcclxuXHJcblx0XHRsZXQgZGVwdGhDb21wYXJlO1xyXG5cclxuXHRcdGlmICggbWF0ZXJpYWwuZGVwdGhUZXN0ID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdGRlcHRoQ29tcGFyZSA9IEdQVUNvbXBhcmVGdW5jdGlvbi5BbHdheXM7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGNvbnN0IGRlcHRoRnVuYyA9IG1hdGVyaWFsLmRlcHRoRnVuYztcclxuXHJcblx0XHRcdHN3aXRjaCAoIGRlcHRoRnVuYyApIHtcclxuXHJcblx0XHRcdFx0Y2FzZSBOZXZlckRlcHRoOlxyXG5cdFx0XHRcdFx0ZGVwdGhDb21wYXJlID0gR1BVQ29tcGFyZUZ1bmN0aW9uLk5ldmVyO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdGNhc2UgQWx3YXlzRGVwdGg6XHJcblx0XHRcdFx0XHRkZXB0aENvbXBhcmUgPSBHUFVDb21wYXJlRnVuY3Rpb24uQWx3YXlzO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdGNhc2UgTGVzc0RlcHRoOlxyXG5cdFx0XHRcdFx0ZGVwdGhDb21wYXJlID0gR1BVQ29tcGFyZUZ1bmN0aW9uLkxlc3M7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0Y2FzZSBMZXNzRXF1YWxEZXB0aDpcclxuXHRcdFx0XHRcdGRlcHRoQ29tcGFyZSA9IEdQVUNvbXBhcmVGdW5jdGlvbi5MZXNzRXF1YWw7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0Y2FzZSBFcXVhbERlcHRoOlxyXG5cdFx0XHRcdFx0ZGVwdGhDb21wYXJlID0gR1BVQ29tcGFyZUZ1bmN0aW9uLkVxdWFsO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdGNhc2UgR3JlYXRlckVxdWFsRGVwdGg6XHJcblx0XHRcdFx0XHRkZXB0aENvbXBhcmUgPSBHUFVDb21wYXJlRnVuY3Rpb24uR3JlYXRlckVxdWFsO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdGNhc2UgR3JlYXRlckRlcHRoOlxyXG5cdFx0XHRcdFx0ZGVwdGhDb21wYXJlID0gR1BVQ29tcGFyZUZ1bmN0aW9uLkdyZWF0ZXI7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0Y2FzZSBOb3RFcXVhbERlcHRoOlxyXG5cdFx0XHRcdFx0ZGVwdGhDb21wYXJlID0gR1BVQ29tcGFyZUZ1bmN0aW9uLk5vdEVxdWFsO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR1BVUGlwZWxpbmVVdGlsczogSW52YWxpZCBkZXB0aCBmdW5jdGlvbi4nLCBkZXB0aEZ1bmMgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGRlcHRoQ29tcGFyZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgV2ViR1BVUGlwZWxpbmVVdGlscztcclxuIiwiaW1wb3J0IHsgd2Fybk9uY2UgfSBmcm9tICcuLi8uLi8uLi91dGlscy5qcyc7XHJcbmltcG9ydCBUaW1lc3RhbXBRdWVyeVBvb2wgZnJvbSAnLi4vLi4vY29tbW9uL1RpbWVzdGFtcFF1ZXJ5UG9vbC5qcyc7XHJcblxyXG4vKipcclxuICogTWFuYWdlcyBhIHBvb2wgb2YgV2ViR1BVIHRpbWVzdGFtcCBxdWVyaWVzIGZvciBwZXJmb3JtYW5jZSBtZWFzdXJlbWVudC5cclxuICogRXh0ZW5kcyB0aGUgYmFzZSBUaW1lc3RhbXBRdWVyeVBvb2wgdG8gcHJvdmlkZSBXZWJHUFUtc3BlY2lmaWMgaW1wbGVtZW50YXRpb24uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBUaW1lc3RhbXBRdWVyeVBvb2xcclxuICovXHJcbmNsYXNzIFdlYkdQVVRpbWVzdGFtcFF1ZXJ5UG9vbCBleHRlbmRzIFRpbWVzdGFtcFF1ZXJ5UG9vbCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgYSBuZXcgV2ViR1BVIHRpbWVzdGFtcCBxdWVyeSBwb29sLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtHUFVEZXZpY2V9IGRldmljZSAtIFRoZSBXZWJHUFUgZGV2aWNlIHRvIGNyZWF0ZSBxdWVyaWVzIG9uLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIHR5cGUgaWRlbnRpZmllciBmb3IgdGhpcyBxdWVyeSBwb29sLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbbWF4UXVlcmllcz0yMDQ4XSAtIE1heGltdW0gbnVtYmVyIG9mIHF1ZXJpZXMgdGhpcyBwb29sIGNhbiBob2xkLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBkZXZpY2UsIHR5cGUsIG1heFF1ZXJpZXMgPSAyMDQ4ICkge1xyXG5cclxuXHRcdHN1cGVyKCBtYXhRdWVyaWVzICk7XHJcblx0XHR0aGlzLmRldmljZSA9IGRldmljZTtcclxuXHRcdHRoaXMudHlwZSA9IHR5cGU7XHJcblxyXG5cdFx0dGhpcy5xdWVyeVNldCA9IHRoaXMuZGV2aWNlLmNyZWF0ZVF1ZXJ5U2V0KCB7XHJcblx0XHRcdHR5cGU6ICd0aW1lc3RhbXAnLFxyXG5cdFx0XHRjb3VudDogdGhpcy5tYXhRdWVyaWVzLFxyXG5cdFx0XHRsYWJlbDogYHF1ZXJ5c2V0X2dsb2JhbF90aW1lc3RhbXBfJHt0eXBlfWBcclxuXHRcdH0gKTtcclxuXHJcblx0XHRjb25zdCBidWZmZXJTaXplID0gdGhpcy5tYXhRdWVyaWVzICogODtcclxuXHRcdHRoaXMucmVzb2x2ZUJ1ZmZlciA9IHRoaXMuZGV2aWNlLmNyZWF0ZUJ1ZmZlcigge1xyXG5cdFx0XHRsYWJlbDogYGJ1ZmZlcl90aW1lc3RhbXBfcmVzb2x2ZV8ke3R5cGV9YCxcclxuXHRcdFx0c2l6ZTogYnVmZmVyU2l6ZSxcclxuXHRcdFx0dXNhZ2U6IEdQVUJ1ZmZlclVzYWdlLlFVRVJZX1JFU09MVkUgfCBHUFVCdWZmZXJVc2FnZS5DT1BZX1NSQ1xyXG5cdFx0fSApO1xyXG5cclxuXHRcdHRoaXMucmVzdWx0QnVmZmVyID0gdGhpcy5kZXZpY2UuY3JlYXRlQnVmZmVyKCB7XHJcblx0XHRcdGxhYmVsOiBgYnVmZmVyX3RpbWVzdGFtcF9yZXN1bHRfJHt0eXBlfWAsXHJcblx0XHRcdHNpemU6IGJ1ZmZlclNpemUsXHJcblx0XHRcdHVzYWdlOiBHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVCB8IEdQVUJ1ZmZlclVzYWdlLk1BUF9SRUFEXHJcblx0XHR9ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWxsb2NhdGVzIGEgcGFpciBvZiBxdWVyaWVzIGZvciBhIGdpdmVuIHJlbmRlciBjb250ZXh0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IHJlbmRlckNvbnRleHQgLSBUaGUgcmVuZGVyIGNvbnRleHQgdG8gYWxsb2NhdGUgcXVlcmllcyBmb3IuXHJcblx0ICogQHJldHVybnMgez9udW1iZXJ9IFRoZSBiYXNlIG9mZnNldCBmb3IgdGhlIGFsbG9jYXRlZCBxdWVyaWVzLCBvciBudWxsIGlmIGFsbG9jYXRpb24gZmFpbGVkLlxyXG5cdCAqL1xyXG5cdGFsbG9jYXRlUXVlcmllc0ZvckNvbnRleHQoIHJlbmRlckNvbnRleHQgKSB7XHJcblxyXG5cdFx0aWYgKCAhIHRoaXMudHJhY2tUaW1lc3RhbXAgfHwgdGhpcy5pc0Rpc3Bvc2VkICkgcmV0dXJuIG51bGw7XHJcblxyXG5cdFx0aWYgKCB0aGlzLmN1cnJlbnRRdWVyeUluZGV4ICsgMiA+IHRoaXMubWF4UXVlcmllcyApIHtcclxuXHJcblx0XHRcdHdhcm5PbmNlKCBgV2ViR1BVVGltZXN0YW1wUXVlcnlQb29sIFskeyB0aGlzLnR5cGUgfV06IE1heGltdW0gbnVtYmVyIG9mIHF1ZXJpZXMgZXhjZWVkZWQsIHdoZW4gdXNpbmcgdHJhY2tUaW1lc3RhbXAgaXQgaXMgbmVjZXNzYXJ5IHRvIHJlc29sdmVzIHRoZSBxdWVyaWVzIHZpYSByZW5kZXJlci5yZXNvbHZlVGltZXN0YW1wc0FzeW5jKCBUSFJFRS5UaW1lc3RhbXBRdWVyeS4keyB0aGlzLnR5cGUudG9VcHBlckNhc2UoKSB9ICkuYCApO1xyXG5cdFx0XHRyZXR1cm4gbnVsbDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgYmFzZU9mZnNldCA9IHRoaXMuY3VycmVudFF1ZXJ5SW5kZXg7XHJcblx0XHR0aGlzLmN1cnJlbnRRdWVyeUluZGV4ICs9IDI7XHJcblxyXG5cdFx0dGhpcy5xdWVyeU9mZnNldHMuc2V0KCByZW5kZXJDb250ZXh0LmlkLCBiYXNlT2Zmc2V0ICk7XHJcblx0XHRyZXR1cm4gYmFzZU9mZnNldDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBc3luY2hyb25vdXNseSByZXNvbHZlcyBhbGwgcGVuZGluZyBxdWVyaWVzIGFuZCByZXR1cm5zIHRoZSB0b3RhbCBkdXJhdGlvbi5cclxuXHQgKiBJZiB0aGVyZSdzIGFscmVhZHkgYSBwZW5kaW5nIHJlc29sdmUgb3BlcmF0aW9uLCByZXR1cm5zIHRoYXQgcHJvbWlzZSBpbnN0ZWFkLlxyXG5cdCAqXHJcblx0ICogQGFzeW5jXHJcblx0ICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyPn0gVGhlIHRvdGFsIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcywgb3IgdGhlIGxhc3QgdmFsaWQgdmFsdWUgaWYgcmVzb2x1dGlvbiBmYWlscy5cclxuXHQgKi9cclxuXHRhc3luYyByZXNvbHZlUXVlcmllc0FzeW5jKCkge1xyXG5cclxuXHRcdGlmICggISB0aGlzLnRyYWNrVGltZXN0YW1wIHx8IHRoaXMuY3VycmVudFF1ZXJ5SW5kZXggPT09IDAgfHwgdGhpcy5pc0Rpc3Bvc2VkICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIHRoaXMubGFzdFZhbHVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMucGVuZGluZ1Jlc29sdmUgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gdGhpcy5wZW5kaW5nUmVzb2x2ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5wZW5kaW5nUmVzb2x2ZSA9IHRoaXMuX3Jlc29sdmVRdWVyaWVzKCk7XHJcblxyXG5cdFx0dHJ5IHtcclxuXHJcblx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucGVuZGluZ1Jlc29sdmU7XHJcblx0XHRcdHJldHVybiByZXN1bHQ7XHJcblxyXG5cdFx0fSBmaW5hbGx5IHtcclxuXHJcblx0XHRcdHRoaXMucGVuZGluZ1Jlc29sdmUgPSBudWxsO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJbnRlcm5hbCBtZXRob2QgdG8gcmVzb2x2ZSBxdWVyaWVzIGFuZCBjYWxjdWxhdGUgdG90YWwgZHVyYXRpb24uXHJcblx0ICpcclxuXHQgKiBAYXN5bmNcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlcj59IFRoZSB0b3RhbCBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMuXHJcblx0ICovXHJcblx0YXN5bmMgX3Jlc29sdmVRdWVyaWVzKCkge1xyXG5cclxuXHRcdGlmICggdGhpcy5pc0Rpc3Bvc2VkICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIHRoaXMubGFzdFZhbHVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0cnkge1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzLnJlc3VsdEJ1ZmZlci5tYXBTdGF0ZSAhPT0gJ3VubWFwcGVkJyApIHtcclxuXHJcblx0XHRcdFx0cmV0dXJuIHRoaXMubGFzdFZhbHVlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgY3VycmVudE9mZnNldHMgPSBuZXcgTWFwKCB0aGlzLnF1ZXJ5T2Zmc2V0cyApO1xyXG5cdFx0XHRjb25zdCBxdWVyeUNvdW50ID0gdGhpcy5jdXJyZW50UXVlcnlJbmRleDtcclxuXHRcdFx0Y29uc3QgYnl0ZXNVc2VkID0gcXVlcnlDb3VudCAqIDg7XHJcblxyXG5cdFx0XHQvLyBSZXNldCBzdGF0ZSBiZWZvcmUgR1BVIHdvcmtcclxuXHRcdFx0dGhpcy5jdXJyZW50UXVlcnlJbmRleCA9IDA7XHJcblx0XHRcdHRoaXMucXVlcnlPZmZzZXRzLmNsZWFyKCk7XHJcblxyXG5cdFx0XHRjb25zdCBjb21tYW5kRW5jb2RlciA9IHRoaXMuZGV2aWNlLmNyZWF0ZUNvbW1hbmRFbmNvZGVyKCk7XHJcblxyXG5cdFx0XHRjb21tYW5kRW5jb2Rlci5yZXNvbHZlUXVlcnlTZXQoXHJcblx0XHRcdFx0dGhpcy5xdWVyeVNldCxcclxuXHRcdFx0XHQwLFxyXG5cdFx0XHRcdHF1ZXJ5Q291bnQsXHJcblx0XHRcdFx0dGhpcy5yZXNvbHZlQnVmZmVyLFxyXG5cdFx0XHRcdDBcclxuXHRcdFx0KTtcclxuXHJcblx0XHRcdGNvbW1hbmRFbmNvZGVyLmNvcHlCdWZmZXJUb0J1ZmZlcihcclxuXHRcdFx0XHR0aGlzLnJlc29sdmVCdWZmZXIsXHJcblx0XHRcdFx0MCxcclxuXHRcdFx0XHR0aGlzLnJlc3VsdEJ1ZmZlcixcclxuXHRcdFx0XHQwLFxyXG5cdFx0XHRcdGJ5dGVzVXNlZFxyXG5cdFx0XHQpO1xyXG5cclxuXHRcdFx0Y29uc3QgY29tbWFuZEJ1ZmZlciA9IGNvbW1hbmRFbmNvZGVyLmZpbmlzaCgpO1xyXG5cdFx0XHR0aGlzLmRldmljZS5xdWV1ZS5zdWJtaXQoIFsgY29tbWFuZEJ1ZmZlciBdICk7XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMucmVzdWx0QnVmZmVyLm1hcFN0YXRlICE9PSAndW5tYXBwZWQnICkge1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gdGhpcy5sYXN0VmFsdWU7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBDcmVhdGUgYW5kIHRyYWNrIHRoZSBtYXBwaW5nIG9wZXJhdGlvblxyXG5cdFx0XHRhd2FpdCB0aGlzLnJlc3VsdEJ1ZmZlci5tYXBBc3luYyggR1BVTWFwTW9kZS5SRUFELCAwLCBieXRlc1VzZWQgKTtcclxuXHJcblx0XHRcdGlmICggdGhpcy5pc0Rpc3Bvc2VkICkge1xyXG5cclxuXHRcdFx0XHRpZiAoIHRoaXMucmVzdWx0QnVmZmVyLm1hcFN0YXRlID09PSAnbWFwcGVkJyApIHtcclxuXHJcblx0XHRcdFx0XHR0aGlzLnJlc3VsdEJ1ZmZlci51bm1hcCgpO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHJldHVybiB0aGlzLmxhc3RWYWx1ZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IHRpbWVzID0gbmV3IEJpZ1VpbnQ2NEFycmF5KCB0aGlzLnJlc3VsdEJ1ZmZlci5nZXRNYXBwZWRSYW5nZSggMCwgYnl0ZXNVc2VkICkgKTtcclxuXHRcdFx0bGV0IHRvdGFsRHVyYXRpb24gPSAwO1xyXG5cclxuXHRcdFx0Zm9yICggY29uc3QgWyAsIGJhc2VPZmZzZXQgXSBvZiBjdXJyZW50T2Zmc2V0cyApIHtcclxuXHJcblx0XHRcdFx0Y29uc3Qgc3RhcnRUaW1lID0gdGltZXNbIGJhc2VPZmZzZXQgXTtcclxuXHRcdFx0XHRjb25zdCBlbmRUaW1lID0gdGltZXNbIGJhc2VPZmZzZXQgKyAxIF07XHJcblx0XHRcdFx0Y29uc3QgZHVyYXRpb24gPSBOdW1iZXIoIGVuZFRpbWUgLSBzdGFydFRpbWUgKSAvIDFlNjtcclxuXHRcdFx0XHR0b3RhbER1cmF0aW9uICs9IGR1cmF0aW9uO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5yZXN1bHRCdWZmZXIudW5tYXAoKTtcclxuXHRcdFx0dGhpcy5sYXN0VmFsdWUgPSB0b3RhbER1cmF0aW9uO1xyXG5cclxuXHRcdFx0cmV0dXJuIHRvdGFsRHVyYXRpb247XHJcblxyXG5cdFx0fSBjYXRjaCAoIGVycm9yICkge1xyXG5cclxuXHRcdFx0Y29uc29sZS5lcnJvciggJ0Vycm9yIHJlc29sdmluZyBxdWVyaWVzOicsIGVycm9yICk7XHJcblx0XHRcdGlmICggdGhpcy5yZXN1bHRCdWZmZXIubWFwU3RhdGUgPT09ICdtYXBwZWQnICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLnJlc3VsdEJ1ZmZlci51bm1hcCgpO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIHRoaXMubGFzdFZhbHVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEaXNwb3NlIG9mIHRoZSBxdWVyeSBwb29sLlxyXG5cdCAqXHJcblx0ICogQGFzeW5jXHJcblx0ICogQHJldHVybnMge1Byb21pc2V9IEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGRpc3Bvc2UgaGFzIGJlZW4gZXhlY3V0ZWQuXHJcblx0ICovXHJcblx0YXN5bmMgZGlzcG9zZSgpIHtcclxuXHJcblx0XHRpZiAoIHRoaXMuaXNEaXNwb3NlZCApIHtcclxuXHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5pc0Rpc3Bvc2VkID0gdHJ1ZTtcclxuXHJcblx0XHQvLyBXYWl0IGZvciBwZW5kaW5nIHJlc29sdmUgb3BlcmF0aW9uXHJcblx0XHRpZiAoIHRoaXMucGVuZGluZ1Jlc29sdmUgKSB7XHJcblxyXG5cdFx0XHR0cnkge1xyXG5cclxuXHRcdFx0XHRhd2FpdCB0aGlzLnBlbmRpbmdSZXNvbHZlO1xyXG5cclxuXHRcdFx0fSBjYXRjaCAoIGVycm9yICkge1xyXG5cclxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCAnRXJyb3Igd2FpdGluZyBmb3IgcGVuZGluZyByZXNvbHZlOicsIGVycm9yICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEVuc3VyZSBidWZmZXIgaXMgdW5tYXBwZWQgYmVmb3JlIGRlc3Ryb3lpbmdcclxuXHRcdGlmICggdGhpcy5yZXN1bHRCdWZmZXIgJiYgdGhpcy5yZXN1bHRCdWZmZXIubWFwU3RhdGUgPT09ICdtYXBwZWQnICkge1xyXG5cclxuXHRcdFx0dHJ5IHtcclxuXHJcblx0XHRcdFx0dGhpcy5yZXN1bHRCdWZmZXIudW5tYXAoKTtcclxuXHJcblx0XHRcdH0gY2F0Y2ggKCBlcnJvciApIHtcclxuXHJcblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ0Vycm9yIHVubWFwcGluZyBidWZmZXI6JywgZXJyb3IgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gRGVzdHJveSByZXNvdXJjZXNcclxuXHRcdGlmICggdGhpcy5xdWVyeVNldCApIHtcclxuXHJcblx0XHRcdHRoaXMucXVlcnlTZXQuZGVzdHJveSgpO1xyXG5cdFx0XHR0aGlzLnF1ZXJ5U2V0ID0gbnVsbDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0aGlzLnJlc29sdmVCdWZmZXIgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnJlc29sdmVCdWZmZXIuZGVzdHJveSgpO1xyXG5cdFx0XHR0aGlzLnJlc29sdmVCdWZmZXIgPSBudWxsO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXMucmVzdWx0QnVmZmVyICkge1xyXG5cclxuXHRcdFx0dGhpcy5yZXN1bHRCdWZmZXIuZGVzdHJveSgpO1xyXG5cdFx0XHR0aGlzLnJlc3VsdEJ1ZmZlciA9IG51bGw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMucXVlcnlPZmZzZXRzLmNsZWFyKCk7XHJcblx0XHR0aGlzLnBlbmRpbmdSZXNvbHZlID0gbnVsbDtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgV2ViR1BVVGltZXN0YW1wUXVlcnlQb29sO1xyXG4iLCIvKi8vIGRlYnVnZ2VyIHRvb2xzICovXHJcbmltcG9ydCAnaHR0cHM6Ly9ncmVnZ21hbi5naXRodWIuaW8vd2ViZ3B1LWF2b2lkLXJlZHVuZGFudC1zdGF0ZS1zZXR0aW5nL3dlYmdwdS1jaGVjay1yZWR1bmRhbnQtc3RhdGUtc2V0dGluZy5qcyc7XHJcblxyXG5pbXBvcnQgeyBHUFVGZWF0dXJlTmFtZSwgR1BVTG9hZE9wLCBHUFVTdG9yZU9wLCBHUFVJbmRleEZvcm1hdCwgR1BVVGV4dHVyZVZpZXdEaW1lbnNpb24gfSBmcm9tICcuL3V0aWxzL1dlYkdQVUNvbnN0YW50cy5qcyc7XHJcblxyXG5pbXBvcnQgV0dTTE5vZGVCdWlsZGVyIGZyb20gJy4vbm9kZXMvV0dTTE5vZGVCdWlsZGVyLmpzJztcclxuaW1wb3J0IEJhY2tlbmQgZnJvbSAnLi4vY29tbW9uL0JhY2tlbmQuanMnO1xyXG5cclxuaW1wb3J0IFdlYkdQVVV0aWxzIGZyb20gJy4vdXRpbHMvV2ViR1BVVXRpbHMuanMnO1xyXG5pbXBvcnQgV2ViR1BVQXR0cmlidXRlVXRpbHMgZnJvbSAnLi91dGlscy9XZWJHUFVBdHRyaWJ1dGVVdGlscy5qcyc7XHJcbmltcG9ydCBXZWJHUFVCaW5kaW5nVXRpbHMgZnJvbSAnLi91dGlscy9XZWJHUFVCaW5kaW5nVXRpbHMuanMnO1xyXG5pbXBvcnQgV2ViR1BVUGlwZWxpbmVVdGlscyBmcm9tICcuL3V0aWxzL1dlYkdQVVBpcGVsaW5lVXRpbHMuanMnO1xyXG5pbXBvcnQgV2ViR1BVVGV4dHVyZVV0aWxzIGZyb20gJy4vdXRpbHMvV2ViR1BVVGV4dHVyZVV0aWxzLmpzJztcclxuXHJcbmltcG9ydCB7IFdlYkdQVUNvb3JkaW5hdGVTeXN0ZW0gfSBmcm9tICcuLi8uLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgV2ViR1BVVGltZXN0YW1wUXVlcnlQb29sIGZyb20gJy4vdXRpbHMvV2ViR1BVVGltZXN0YW1wUXVlcnlQb29sLmpzJztcclxuaW1wb3J0IHsgd2Fybk9uY2UgfSBmcm9tICcuLi8uLi91dGlscy5qcyc7XHJcblxyXG5jbGFzcyBXZWJHUFVCYWNrZW5kIGV4dGVuZHMgQmFja2VuZCB7XHJcblxyXG5cdGNvbnN0cnVjdG9yKCBwYXJhbWV0ZXJzID0ge30gKSB7XHJcblx0XHRzdXBlciggcGFyYW1ldGVycyApO1xyXG5cdFx0dGhpcy5pc1dlYkdQVUJhY2tlbmQgPSB0cnVlO1xyXG5cdFx0dGhpcy5wYXJhbWV0ZXJzLmFscGhhID0gKCBwYXJhbWV0ZXJzLmFscGhhID09PSB1bmRlZmluZWQgKSA/IHRydWUgOiBwYXJhbWV0ZXJzLmFscGhhO1xyXG5cdFx0dGhpcy5wYXJhbWV0ZXJzLnJlcXVpcmVkTGltaXRzID0gKCBwYXJhbWV0ZXJzLnJlcXVpcmVkTGltaXRzID09PSB1bmRlZmluZWQgKSA/IHt9IDogcGFyYW1ldGVycy5yZXF1aXJlZExpbWl0cztcclxuXHJcblx0XHR0aGlzLmRldmljZSA9IG51bGw7XHJcblx0XHR0aGlzLmNvbnRleHQgPSBudWxsO1xyXG5cdFx0dGhpcy5jb2xvckJ1ZmZlciA9IG51bGw7XHJcblx0XHR0aGlzLmRlZmF1bHRSZW5kZXJQYXNzZGVzY3JpcHRvciA9IG51bGw7XHJcblxyXG5cdFx0dGhpcy51dGlscyA9IG5ldyBXZWJHUFVVdGlscyggdGhpcyApO1xyXG5cdFx0dGhpcy5hdHRyaWJ1dGVVdGlscyA9IG5ldyBXZWJHUFVBdHRyaWJ1dGVVdGlscyggdGhpcyApO1xyXG5cdFx0dGhpcy5iaW5kaW5nVXRpbHMgPSBuZXcgV2ViR1BVQmluZGluZ1V0aWxzKCB0aGlzICk7XHJcblx0XHR0aGlzLnBpcGVsaW5lVXRpbHMgPSBuZXcgV2ViR1BVUGlwZWxpbmVVdGlscyggdGhpcyApO1xyXG5cdFx0dGhpcy50ZXh0dXJlVXRpbHMgPSBuZXcgV2ViR1BVVGV4dHVyZVV0aWxzKCB0aGlzICk7XHJcblx0XHR0aGlzLm9jY2x1ZGVkUmVzb2x2ZUNhY2hlID0gbmV3IE1hcCgpO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgaW5pdCggcmVuZGVyZXIgKSB7XHJcblx0XHRhd2FpdCBzdXBlci5pbml0KCByZW5kZXJlciApO1xyXG5cdFx0Y29uc3QgcGFyYW1ldGVycyA9IHRoaXMucGFyYW1ldGVycztcclxuXHRcdGxldCBkZXZpY2U7XHJcblxyXG5cdFx0aWYgKCBwYXJhbWV0ZXJzLmRldmljZSA9PT0gdW5kZWZpbmVkICkge1xyXG5cdFx0XHRjb25zdCBhZGFwdGVyT3B0aW9ucyA9IHsgcG93ZXJQcmVmZXJlbmNlOiBwYXJhbWV0ZXJzLnBvd2VyUHJlZmVyZW5jZSB9O1xyXG5cdFx0XHRjb25zdCBhZGFwdGVyID0gKCB0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyApID8gYXdhaXQgbmF2aWdhdG9yLmdwdS5yZXF1ZXN0QWRhcHRlciggYWRhcHRlck9wdGlvbnMgKSA6IG51bGw7XHJcblxyXG5cdFx0XHRpZiAoIGFkYXB0ZXIgPT09IG51bGwgKSB0aHJvdyBuZXcgRXJyb3IoICdXZWJHUFVCYWNrZW5kOiBVbmFibGUgdG8gY3JlYXRlIFdlYkdQVSBhZGFwdGVyLicgKTtcclxuXHJcblx0XHRcdGNvbnN0IGZlYXR1cmVzID0gT2JqZWN0LnZhbHVlcyggR1BVRmVhdHVyZU5hbWUgKTtcclxuXHRcdFx0Y29uc3Qgc3VwcG9ydGVkRmVhdHVyZXMgPSBmZWF0dXJlcy5maWx0ZXIoIG5hbWUgPT4gYWRhcHRlci5mZWF0dXJlcy5oYXMoIG5hbWUgKSApO1xyXG5cclxuXHRcdFx0ZGV2aWNlID0gYXdhaXQgYWRhcHRlci5yZXF1ZXN0RGV2aWNlKHsgcmVxdWlyZWRGZWF0dXJlczogc3VwcG9ydGVkRmVhdHVyZXMsIHJlcXVpcmVkTGltaXRzOiBwYXJhbWV0ZXJzLnJlcXVpcmVkTGltaXRzIH0pO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0ZGV2aWNlID0gcGFyYW1ldGVycy5kZXZpY2U7XHJcblx0XHR9XHJcblxyXG5cdFx0ZGV2aWNlLmxvc3QudGhlbiggKCBpbmZvICkgPT4ge1xyXG5cdFx0XHRyZW5kZXJlci5vbkRldmljZUxvc3Qoe1xyXG5cdFx0XHRcdGFwaTogJ1dlYkdQVScsXHJcblx0XHRcdFx0bWVzc2FnZTogaW5mby5tZXNzYWdlIHx8ICdVbmtub3duIHJlYXNvbicsXHJcblx0XHRcdFx0cmVhc29uOiBpbmZvLnJlYXNvbiB8fCBudWxsLFxyXG5cdFx0XHRcdG9yaWdpbmFsRXZlbnQ6IGluZm9cclxuXHRcdFx0fSk7XHJcblx0XHR9KTtcclxuXHJcblx0XHRjb25zdCBjb250ZXh0ID0gcGFyYW1ldGVycy5jb250ZXh0ICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLmNvbnRleHQgOiByZW5kZXJlci5kb21FbGVtZW50LmdldENvbnRleHQoICd3ZWJncHUnICk7XHJcblx0XHR0aGlzLmRldmljZSA9IGRldmljZTtcclxuXHRcdHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XHJcblx0XHRjb25zdCBhbHBoYU1vZGUgPSBwYXJhbWV0ZXJzLmFscGhhID8gJ3ByZW11bHRpcGxpZWQnIDogJ29wYXF1ZSc7XHJcblx0XHR0aGlzLnRyYWNrVGltZXN0YW1wID0gdGhpcy50cmFja1RpbWVzdGFtcCAmJiB0aGlzLmhhc0ZlYXR1cmUoIEdQVUZlYXR1cmVOYW1lLlRpbWVzdGFtcFF1ZXJ5ICk7XHJcblxyXG5cdFx0dGhpcy5jb250ZXh0LmNvbmZpZ3VyZSh7XHJcblx0XHRcdGRldmljZTogdGhpcy5kZXZpY2UsXHJcblx0XHRcdGZvcm1hdDogdGhpcy51dGlscy5nZXRQcmVmZXJyZWRDYW52YXNGb3JtYXQoKSxcclxuXHRcdFx0dXNhZ2U6IEdQVVRleHR1cmVVc2FnZS5SRU5ERVJfQVRUQUNITUVOVCB8IEdQVVRleHR1cmVVc2FnZS5DT1BZX1NSQyxcclxuXHRcdFx0YWxwaGFNb2RlOiBhbHBoYU1vZGVcclxuXHRcdH0pO1xyXG5cclxuXHRcdGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiAnY2hlY2tXZWJHUFVTdGF0ZScgaW4gd2luZG93KSB7XHJcblx0XHRcdGNoZWNrV2ViR1BVU3RhdGUoKTtcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnVwZGF0ZVNpemUoKTtcclxuXHR9XHJcblxyXG5cdGdldCBjb29yZGluYXRlU3lzdGVtKCkge1xyXG5cdFx0cmV0dXJuIFdlYkdQVUNvb3JkaW5hdGVTeXN0ZW07XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBwZXJmb3JtcyBhIHJlYWRiYWNrIG9wZXJhdGlvbiBieSBtb3ZpbmcgYnVmZmVyIGRhdGEgZnJvbVxyXG5cdCAqIGEgc3RvcmFnZSBidWZmZXIgYXR0cmlidXRlIGZyb20gdGhlIEdQVSB0byB0aGUgQ1BVLlxyXG5cdCAqXHJcblx0ICogQGFzeW5jXHJcblx0ICogQHBhcmFtIHtTdG9yYWdlQnVmZmVyQXR0cmlidXRlfSBhdHRyaWJ1dGUgLSBUaGUgc3RvcmFnZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqIEByZXR1cm4ge1Byb21pc2U8QXJyYXlCdWZmZXI+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBidWZmZXIgZGF0YSB3aGVuIHRoZSBkYXRhIGFyZSByZWFkeS5cclxuXHQgKi9cclxuXHRhc3luYyBnZXRBcnJheUJ1ZmZlckFzeW5jKCBhdHRyaWJ1dGUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIGF3YWl0IHRoaXMuYXR0cmlidXRlVXRpbHMuZ2V0QXJyYXlCdWZmZXJBc3luYyggYXR0cmlidXRlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgYmFja2VuZCdzIHJlbmRlcmluZyBjb250ZXh0LlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7R1BVQ2FudmFzQ29udGV4dH0gVGhlIHJlbmRlcmluZyBjb250ZXh0LlxyXG5cdCAqL1xyXG5cdGdldENvbnRleHQoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuY29udGV4dDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHJlbmRlciBwYXNzIGRlc2NyaXB0b3IuXHJcblx0ICpcclxuXHQgKiBJbiBXZWJHUFUsIHRoZSBkZWZhdWx0IGZyYW1lYnVmZmVyIG11c3QgYmUgY29uZmlndXJlZFxyXG5cdCAqIGxpa2UgY3VzdG9tIGZyYW1lYnVmZmVycyBzbyB0aGUgYmFja2VuZCBuZWVkcyBhIHJlbmRlclxyXG5cdCAqIHBhc3MgZGVzY3JpcHRvciBldmVuIHdoZW4gcmVuZGVyaW5nIGRpcmVjdGx5IHRvIHNjcmVlbi5cclxuXHQgKlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHJldHVybiB7T2JqZWN0fSBUaGUgcmVuZGVyIHBhc3MgZGVzY3JpcHRvci5cclxuXHQgKi9cclxuXHRfZ2V0RGVmYXVsdFJlbmRlclBhc3NEZXNjcmlwdG9yKCkge1xyXG5cclxuXHRcdGxldCBkZXNjcmlwdG9yID0gdGhpcy5kZWZhdWx0UmVuZGVyUGFzc2Rlc2NyaXB0b3I7XHJcblxyXG5cdFx0aWYgKCBkZXNjcmlwdG9yID09PSBudWxsICkge1xyXG5cclxuXHRcdFx0Y29uc3QgcmVuZGVyZXIgPSB0aGlzLnJlbmRlcmVyO1xyXG5cclxuXHRcdFx0ZGVzY3JpcHRvciA9IHtcclxuXHRcdFx0XHRjb2xvckF0dGFjaG1lbnRzOiBbIHtcclxuXHRcdFx0XHRcdHZpZXc6IG51bGxcclxuXHRcdFx0XHR9IF0sXHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMucmVuZGVyZXIuZGVwdGggPT09IHRydWUgfHwgdGhpcy5yZW5kZXJlci5zdGVuY2lsID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRkZXNjcmlwdG9yLmRlcHRoU3RlbmNpbEF0dGFjaG1lbnQgPSB7XHJcblx0XHRcdFx0XHR2aWV3OiB0aGlzLnRleHR1cmVVdGlscy5nZXREZXB0aEJ1ZmZlciggcmVuZGVyZXIuZGVwdGgsIHJlbmRlcmVyLnN0ZW5jaWwgKS5jcmVhdGVWaWV3KClcclxuXHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgY29sb3JBdHRhY2htZW50ID0gZGVzY3JpcHRvci5jb2xvckF0dGFjaG1lbnRzWyAwIF07XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMucmVuZGVyZXIuc2FtcGxlcyA+IDAgKSB7XHJcblxyXG5cdFx0XHRcdGNvbG9yQXR0YWNobWVudC52aWV3ID0gdGhpcy5jb2xvckJ1ZmZlci5jcmVhdGVWaWV3KCk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRjb2xvckF0dGFjaG1lbnQucmVzb2x2ZVRhcmdldCA9IHVuZGVmaW5lZDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuZGVmYXVsdFJlbmRlclBhc3NkZXNjcmlwdG9yID0gZGVzY3JpcHRvcjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgY29sb3JBdHRhY2htZW50ID0gZGVzY3JpcHRvci5jb2xvckF0dGFjaG1lbnRzWyAwIF07XHJcblxyXG5cdFx0aWYgKCB0aGlzLnJlbmRlcmVyLnNhbXBsZXMgPiAwICkge1xyXG5cclxuXHRcdFx0Y29sb3JBdHRhY2htZW50LnJlc29sdmVUYXJnZXQgPSB0aGlzLmNvbnRleHQuZ2V0Q3VycmVudFRleHR1cmUoKS5jcmVhdGVWaWV3KCk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGNvbG9yQXR0YWNobWVudC52aWV3ID0gdGhpcy5jb250ZXh0LmdldEN1cnJlbnRUZXh0dXJlKCkuY3JlYXRlVmlldygpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZGVzY3JpcHRvcjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSByZW5kZXIgcGFzcyBkZXNjcmlwdG9yIGZvciB0aGUgZ2l2ZW4gcmVuZGVyIGNvbnRleHQuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyQ29udGV4dH0gcmVuZGVyQ29udGV4dCAtIFRoZSByZW5kZXIgY29udGV4dC5cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gY29sb3JBdHRhY2htZW50c0NvbmZpZyAtIENvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciB0aGUgY29sb3IgYXR0YWNobWVudHMuXHJcblx0ICogQHJldHVybiB7T2JqZWN0fSBUaGUgcmVuZGVyIHBhc3MgZGVzY3JpcHRvci5cclxuXHQgKi9cclxuXHRfZ2V0UmVuZGVyUGFzc0Rlc2NyaXB0b3IoIHJlbmRlckNvbnRleHQsIGNvbG9yQXR0YWNobWVudHNDb25maWcgPSB7fSApIHtcclxuXHJcblx0XHRjb25zdCByZW5kZXJUYXJnZXQgPSByZW5kZXJDb250ZXh0LnJlbmRlclRhcmdldDtcclxuXHRcdGNvbnN0IHJlbmRlclRhcmdldERhdGEgPSB0aGlzLmdldCggcmVuZGVyVGFyZ2V0ICk7XHJcblxyXG5cdFx0bGV0IGRlc2NyaXB0b3JzID0gcmVuZGVyVGFyZ2V0RGF0YS5kZXNjcmlwdG9ycztcclxuXHJcblx0XHRpZiAoIGRlc2NyaXB0b3JzID09PSB1bmRlZmluZWQgfHxcclxuXHRcdFx0cmVuZGVyVGFyZ2V0RGF0YS53aWR0aCAhPT0gcmVuZGVyVGFyZ2V0LndpZHRoIHx8XHJcblx0XHRcdHJlbmRlclRhcmdldERhdGEuaGVpZ2h0ICE9PSByZW5kZXJUYXJnZXQuaGVpZ2h0IHx8XHJcblx0XHRcdHJlbmRlclRhcmdldERhdGEuZGltZW5zaW9ucyAhPT0gcmVuZGVyVGFyZ2V0LmRpbWVuc2lvbnMgfHxcclxuXHRcdFx0cmVuZGVyVGFyZ2V0RGF0YS5hY3RpdmVNaXBtYXBMZXZlbCAhPT0gcmVuZGVyQ29udGV4dC5hY3RpdmVNaXBtYXBMZXZlbCB8fFxyXG5cdFx0XHRyZW5kZXJUYXJnZXREYXRhLmFjdGl2ZUN1YmVGYWNlICE9PSByZW5kZXJDb250ZXh0LmFjdGl2ZUN1YmVGYWNlIHx8XHJcblx0XHRcdHJlbmRlclRhcmdldERhdGEuc2FtcGxlcyAhPT0gcmVuZGVyVGFyZ2V0LnNhbXBsZXNcclxuXHRcdCkge1xyXG5cclxuXHRcdFx0ZGVzY3JpcHRvcnMgPSB7fTtcclxuXHJcblx0XHRcdHJlbmRlclRhcmdldERhdGEuZGVzY3JpcHRvcnMgPSBkZXNjcmlwdG9ycztcclxuXHJcblx0XHRcdC8vIGRpc3Bvc2VcclxuXHJcblx0XHRcdGNvbnN0IG9uRGlzcG9zZSA9ICgpID0+IHtcclxuXHJcblx0XHRcdFx0cmVuZGVyVGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25EaXNwb3NlICk7XHJcblx0XHRcdFx0dGhpcy5kZWxldGUoIHJlbmRlclRhcmdldCApO1xyXG5cclxuXHRcdFx0fTtcclxuXHJcblx0XHRcdGlmICggcmVuZGVyVGFyZ2V0Lmhhc0V2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25EaXNwb3NlICkgPT09IGZhbHNlICkge1xyXG5cclxuXHRcdFx0XHRyZW5kZXJUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvbkRpc3Bvc2UgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgY2FjaGVLZXkgPSByZW5kZXJDb250ZXh0LmdldENhY2hlS2V5KCk7XHJcblx0XHRsZXQgZGVzY3JpcHRvckJhc2UgPSBkZXNjcmlwdG9yc1sgY2FjaGVLZXkgXTtcclxuXHJcblx0XHRpZiAoIGRlc2NyaXB0b3JCYXNlID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCB0ZXh0dXJlcyA9IHJlbmRlckNvbnRleHQudGV4dHVyZXM7XHJcblx0XHRcdGNvbnN0IHRleHR1cmVWaWV3cyA9IFtdO1xyXG5cclxuXHRcdFx0bGV0IHNsaWNlSW5kZXg7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB0ZXh0dXJlcy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHRleHR1cmVEYXRhID0gdGhpcy5nZXQoIHRleHR1cmVzWyBpIF0gKTtcclxuXHJcblx0XHRcdFx0Y29uc3Qgdmlld0Rlc2NyaXB0b3IgPSB7XHJcblx0XHRcdFx0XHRsYWJlbDogYGNvbG9yQXR0YWNobWVudF8keyBpIH1gLFxyXG5cdFx0XHRcdFx0YmFzZU1pcExldmVsOiByZW5kZXJDb250ZXh0LmFjdGl2ZU1pcG1hcExldmVsLFxyXG5cdFx0XHRcdFx0bWlwTGV2ZWxDb3VudDogMSxcclxuXHRcdFx0XHRcdGJhc2VBcnJheUxheWVyOiByZW5kZXJDb250ZXh0LmFjdGl2ZUN1YmVGYWNlLFxyXG5cdFx0XHRcdFx0YXJyYXlMYXllckNvdW50OiAxLFxyXG5cdFx0XHRcdFx0ZGltZW5zaW9uOiBHUFVUZXh0dXJlVmlld0RpbWVuc2lvbi5Ud29EXHJcblx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0aWYgKCByZW5kZXJUYXJnZXQuaXNSZW5kZXJUYXJnZXQzRCApIHtcclxuXHJcblx0XHRcdFx0XHRzbGljZUluZGV4ID0gcmVuZGVyQ29udGV4dC5hY3RpdmVDdWJlRmFjZTtcclxuXHJcblx0XHRcdFx0XHR2aWV3RGVzY3JpcHRvci5iYXNlQXJyYXlMYXllciA9IDA7XHJcblx0XHRcdFx0XHR2aWV3RGVzY3JpcHRvci5kaW1lbnNpb24gPSBHUFVUZXh0dXJlVmlld0RpbWVuc2lvbi5UaHJlZUQ7XHJcblx0XHRcdFx0XHR2aWV3RGVzY3JpcHRvci5kZXB0aE9yQXJyYXlMYXllcnMgPSB0ZXh0dXJlc1sgaSBdLmltYWdlLmRlcHRoO1xyXG5cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCByZW5kZXJUYXJnZXQuaXNSZW5kZXJUYXJnZXRBcnJheSApIHtcclxuXHJcblx0XHRcdFx0XHR2aWV3RGVzY3JpcHRvci5kaW1lbnNpb24gPSBHUFVUZXh0dXJlVmlld0RpbWVuc2lvbi5Ud29EQXJyYXk7XHJcblx0XHRcdFx0XHR2aWV3RGVzY3JpcHRvci5kZXB0aE9yQXJyYXlMYXllcnMgPSB0ZXh0dXJlc1sgaSBdLmltYWdlLmRlcHRoO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGNvbnN0IHRleHR1cmVWaWV3ID0gdGV4dHVyZURhdGEudGV4dHVyZS5jcmVhdGVWaWV3KCB2aWV3RGVzY3JpcHRvciApO1xyXG5cclxuXHRcdFx0XHRsZXQgdmlldywgcmVzb2x2ZVRhcmdldDtcclxuXHJcblx0XHRcdFx0aWYgKCB0ZXh0dXJlRGF0YS5tc2FhVGV4dHVyZSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0XHRcdHZpZXcgPSB0ZXh0dXJlRGF0YS5tc2FhVGV4dHVyZS5jcmVhdGVWaWV3KCk7XHJcblx0XHRcdFx0XHRyZXNvbHZlVGFyZ2V0ID0gdGV4dHVyZVZpZXc7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0dmlldyA9IHRleHR1cmVWaWV3O1xyXG5cdFx0XHRcdFx0cmVzb2x2ZVRhcmdldCA9IHVuZGVmaW5lZDtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR0ZXh0dXJlVmlld3MucHVzaCgge1xyXG5cdFx0XHRcdFx0dmlldyxcclxuXHRcdFx0XHRcdHJlc29sdmVUYXJnZXQsXHJcblx0XHRcdFx0XHRkZXB0aFNsaWNlOiBzbGljZUluZGV4XHJcblx0XHRcdFx0fSApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZGVzY3JpcHRvckJhc2UgPSB7IHRleHR1cmVWaWV3cyB9O1xyXG5cclxuXHRcdFx0aWYgKCByZW5kZXJDb250ZXh0LmRlcHRoICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBkZXB0aFRleHR1cmVEYXRhID0gdGhpcy5nZXQoIHJlbmRlckNvbnRleHQuZGVwdGhUZXh0dXJlICk7XHJcblx0XHRcdFx0ZGVzY3JpcHRvckJhc2UuZGVwdGhTdGVuY2lsVmlldyA9IGRlcHRoVGV4dHVyZURhdGEudGV4dHVyZS5jcmVhdGVWaWV3KCk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRkZXNjcmlwdG9yc1sgY2FjaGVLZXkgXSA9IGRlc2NyaXB0b3JCYXNlO1xyXG5cclxuXHRcdFx0cmVuZGVyVGFyZ2V0RGF0YS53aWR0aCA9IHJlbmRlclRhcmdldC53aWR0aDtcclxuXHRcdFx0cmVuZGVyVGFyZ2V0RGF0YS5oZWlnaHQgPSByZW5kZXJUYXJnZXQuaGVpZ2h0O1xyXG5cdFx0XHRyZW5kZXJUYXJnZXREYXRhLnNhbXBsZXMgPSByZW5kZXJUYXJnZXQuc2FtcGxlcztcclxuXHRcdFx0cmVuZGVyVGFyZ2V0RGF0YS5hY3RpdmVNaXBtYXBMZXZlbCA9IHJlbmRlckNvbnRleHQuYWN0aXZlTWlwbWFwTGV2ZWw7XHJcblx0XHRcdHJlbmRlclRhcmdldERhdGEuYWN0aXZlQ3ViZUZhY2UgPSByZW5kZXJDb250ZXh0LmFjdGl2ZUN1YmVGYWNlO1xyXG5cdFx0XHRyZW5kZXJUYXJnZXREYXRhLmRpbWVuc2lvbnMgPSByZW5kZXJUYXJnZXQuZGltZW5zaW9ucztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgZGVzY3JpcHRvciA9IHtcclxuXHRcdFx0Y29sb3JBdHRhY2htZW50czogW11cclxuXHRcdH07XHJcblxyXG5cdFx0Ly8gQXBwbHkgZHluYW1pYyBwcm9wZXJ0aWVzIHRvIGNhY2hlZCB2aWV3c1xyXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgZGVzY3JpcHRvckJhc2UudGV4dHVyZVZpZXdzLmxlbmd0aDsgaSArKyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHZpZXdJbmZvID0gZGVzY3JpcHRvckJhc2UudGV4dHVyZVZpZXdzWyBpIF07XHJcblxyXG5cdFx0XHRsZXQgY2xlYXJWYWx1ZSA9IHsgcjogMCwgZzogMCwgYjogMCwgYTogMSB9O1xyXG5cdFx0XHRpZiAoIGkgPT09IDAgJiYgY29sb3JBdHRhY2htZW50c0NvbmZpZy5jbGVhclZhbHVlICkge1xyXG5cclxuXHRcdFx0XHRjbGVhclZhbHVlID0gY29sb3JBdHRhY2htZW50c0NvbmZpZy5jbGVhclZhbHVlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZGVzY3JpcHRvci5jb2xvckF0dGFjaG1lbnRzLnB1c2goIHtcclxuXHRcdFx0XHR2aWV3OiB2aWV3SW5mby52aWV3LFxyXG5cdFx0XHRcdGRlcHRoU2xpY2U6IHZpZXdJbmZvLmRlcHRoU2xpY2UsXHJcblx0XHRcdFx0cmVzb2x2ZVRhcmdldDogdmlld0luZm8ucmVzb2x2ZVRhcmdldCxcclxuXHRcdFx0XHRsb2FkT3A6IGNvbG9yQXR0YWNobWVudHNDb25maWcubG9hZE9wIHx8IEdQVUxvYWRPcC5Mb2FkLFxyXG5cdFx0XHRcdHN0b3JlT3A6IGNvbG9yQXR0YWNobWVudHNDb25maWcuc3RvcmVPcCB8fCBHUFVTdG9yZU9wLlN0b3JlLFxyXG5cdFx0XHRcdGNsZWFyVmFsdWU6IGNsZWFyVmFsdWVcclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGRlc2NyaXB0b3JCYXNlLmRlcHRoU3RlbmNpbFZpZXcgKSB7XHJcblxyXG5cdFx0XHRkZXNjcmlwdG9yLmRlcHRoU3RlbmNpbEF0dGFjaG1lbnQgPSB7XHJcblx0XHRcdFx0dmlldzogZGVzY3JpcHRvckJhc2UuZGVwdGhTdGVuY2lsVmlld1xyXG5cdFx0XHR9O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZGVzY3JpcHRvcjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyBleGVjdXRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgcmVuZGVyIGNhbGwgYW5kIHByZXBhcmVzXHJcblx0ICogdGhlIFdlYkdQVSBzdGF0ZSBmb3IgdXBjb21pbmcgcmVuZGVyIGNhbGxzXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JlbmRlckNvbnRleHR9IHJlbmRlckNvbnRleHQgLSBUaGUgcmVuZGVyIGNvbnRleHQuXHJcblx0ICovXHJcblx0YmVnaW5SZW5kZXIoIHJlbmRlckNvbnRleHQgKSB7XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyQ29udGV4dERhdGEgPSB0aGlzLmdldCggcmVuZGVyQ29udGV4dCApO1xyXG5cclxuXHRcdGNvbnN0IGRldmljZSA9IHRoaXMuZGV2aWNlO1xyXG5cdFx0Y29uc3Qgb2NjbHVzaW9uUXVlcnlDb3VudCA9IHJlbmRlckNvbnRleHQub2NjbHVzaW9uUXVlcnlDb3VudDtcclxuXHJcblx0XHRsZXQgb2NjbHVzaW9uUXVlcnlTZXQ7XHJcblxyXG5cdFx0aWYgKCBvY2NsdXNpb25RdWVyeUNvdW50ID4gMCApIHtcclxuXHJcblx0XHRcdGlmICggcmVuZGVyQ29udGV4dERhdGEuY3VycmVudE9jY2x1c2lvblF1ZXJ5U2V0ICkgcmVuZGVyQ29udGV4dERhdGEuY3VycmVudE9jY2x1c2lvblF1ZXJ5U2V0LmRlc3Ryb3koKTtcclxuXHRcdFx0aWYgKCByZW5kZXJDb250ZXh0RGF0YS5jdXJyZW50T2NjbHVzaW9uUXVlcnlCdWZmZXIgKSByZW5kZXJDb250ZXh0RGF0YS5jdXJyZW50T2NjbHVzaW9uUXVlcnlCdWZmZXIuZGVzdHJveSgpO1xyXG5cclxuXHRcdFx0Ly8gR2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBhcnJheSBvZiBvYmplY3RzIHdpdGggcXVlcmllcy4gVGhlIHJlbmRlckNvbnRleHREYXRhIHByb3BlcnR5XHJcblx0XHRcdC8vIGNhbiBiZSBjaGFuZ2VkIGJ5IGFub3RoZXIgcmVuZGVyIHBhc3MgYmVmb3JlIHRoZSBidWZmZXIubWFwQXN5YygpIGNvbXBsZXRlcy5cclxuXHRcdFx0cmVuZGVyQ29udGV4dERhdGEuY3VycmVudE9jY2x1c2lvblF1ZXJ5U2V0ID0gcmVuZGVyQ29udGV4dERhdGEub2NjbHVzaW9uUXVlcnlTZXQ7XHJcblx0XHRcdHJlbmRlckNvbnRleHREYXRhLmN1cnJlbnRPY2NsdXNpb25RdWVyeUJ1ZmZlciA9IHJlbmRlckNvbnRleHREYXRhLm9jY2x1c2lvblF1ZXJ5QnVmZmVyO1xyXG5cdFx0XHRyZW5kZXJDb250ZXh0RGF0YS5jdXJyZW50T2NjbHVzaW9uUXVlcnlPYmplY3RzID0gcmVuZGVyQ29udGV4dERhdGEub2NjbHVzaW9uUXVlcnlPYmplY3RzO1xyXG5cclxuXHRcdFx0Ly9cclxuXHJcblx0XHRcdG9jY2x1c2lvblF1ZXJ5U2V0ID0gZGV2aWNlLmNyZWF0ZVF1ZXJ5U2V0KCB7IHR5cGU6ICdvY2NsdXNpb24nLCBjb3VudDogb2NjbHVzaW9uUXVlcnlDb3VudCwgbGFiZWw6IGBvY2NsdXNpb25RdWVyeVNldF8keyByZW5kZXJDb250ZXh0LmlkIH1gIH0gKTtcclxuXHJcblx0XHRcdHJlbmRlckNvbnRleHREYXRhLm9jY2x1c2lvblF1ZXJ5U2V0ID0gb2NjbHVzaW9uUXVlcnlTZXQ7XHJcblx0XHRcdHJlbmRlckNvbnRleHREYXRhLm9jY2x1c2lvblF1ZXJ5SW5kZXggPSAwO1xyXG5cdFx0XHRyZW5kZXJDb250ZXh0RGF0YS5vY2NsdXNpb25RdWVyeU9iamVjdHMgPSBuZXcgQXJyYXkoIG9jY2x1c2lvblF1ZXJ5Q291bnQgKTtcclxuXHJcblx0XHRcdHJlbmRlckNvbnRleHREYXRhLmxhc3RPY2NsdXNpb25PYmplY3QgPSBudWxsO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRsZXQgZGVzY3JpcHRvcjtcclxuXHJcblx0XHRpZiAoIHJlbmRlckNvbnRleHQudGV4dHVyZXMgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRkZXNjcmlwdG9yID0gdGhpcy5fZ2V0RGVmYXVsdFJlbmRlclBhc3NEZXNjcmlwdG9yKCk7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGRlc2NyaXB0b3IgPSB0aGlzLl9nZXRSZW5kZXJQYXNzRGVzY3JpcHRvciggcmVuZGVyQ29udGV4dCwgeyBsb2FkT3A6IEdQVUxvYWRPcC5Mb2FkIH0gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5pbml0VGltZXN0YW1wUXVlcnkoIHJlbmRlckNvbnRleHQsIGRlc2NyaXB0b3IgKTtcclxuXHJcblx0XHRkZXNjcmlwdG9yLm9jY2x1c2lvblF1ZXJ5U2V0ID0gb2NjbHVzaW9uUXVlcnlTZXQ7XHJcblxyXG5cdFx0Y29uc3QgZGVwdGhTdGVuY2lsQXR0YWNobWVudCA9IGRlc2NyaXB0b3IuZGVwdGhTdGVuY2lsQXR0YWNobWVudDtcclxuXHJcblx0XHRpZiAoIHJlbmRlckNvbnRleHQudGV4dHVyZXMgIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBjb2xvckF0dGFjaG1lbnRzID0gZGVzY3JpcHRvci5jb2xvckF0dGFjaG1lbnRzO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgY29sb3JBdHRhY2htZW50cy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGNvbG9yQXR0YWNobWVudCA9IGNvbG9yQXR0YWNobWVudHNbIGkgXTtcclxuXHJcblx0XHRcdFx0aWYgKCByZW5kZXJDb250ZXh0LmNsZWFyQ29sb3IgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29sb3JBdHRhY2htZW50LmNsZWFyVmFsdWUgPSBpID09PSAwID8gcmVuZGVyQ29udGV4dC5jbGVhckNvbG9yVmFsdWUgOiB7IHI6IDAsIGc6IDAsIGI6IDAsIGE6IDEgfTtcclxuXHRcdFx0XHRcdGNvbG9yQXR0YWNobWVudC5sb2FkT3AgPSBHUFVMb2FkT3AuQ2xlYXI7XHJcblx0XHRcdFx0XHRjb2xvckF0dGFjaG1lbnQuc3RvcmVPcCA9IEdQVVN0b3JlT3AuU3RvcmU7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0Y29sb3JBdHRhY2htZW50LmxvYWRPcCA9IEdQVUxvYWRPcC5Mb2FkO1xyXG5cdFx0XHRcdFx0Y29sb3JBdHRhY2htZW50LnN0b3JlT3AgPSBHUFVTdG9yZU9wLlN0b3JlO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGNvbnN0IGNvbG9yQXR0YWNobWVudCA9IGRlc2NyaXB0b3IuY29sb3JBdHRhY2htZW50c1sgMCBdO1xyXG5cclxuXHRcdFx0aWYgKCByZW5kZXJDb250ZXh0LmNsZWFyQ29sb3IgKSB7XHJcblxyXG5cdFx0XHRcdGNvbG9yQXR0YWNobWVudC5jbGVhclZhbHVlID0gcmVuZGVyQ29udGV4dC5jbGVhckNvbG9yVmFsdWU7XHJcblx0XHRcdFx0Y29sb3JBdHRhY2htZW50LmxvYWRPcCA9IEdQVUxvYWRPcC5DbGVhcjtcclxuXHRcdFx0XHRjb2xvckF0dGFjaG1lbnQuc3RvcmVPcCA9IEdQVVN0b3JlT3AuU3RvcmU7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRjb2xvckF0dGFjaG1lbnQubG9hZE9wID0gR1BVTG9hZE9wLkxvYWQ7XHJcblx0XHRcdFx0Y29sb3JBdHRhY2htZW50LnN0b3JlT3AgPSBHUFVTdG9yZU9wLlN0b3JlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGlmICggcmVuZGVyQ29udGV4dC5kZXB0aCApIHtcclxuXHJcblx0XHRcdGlmICggcmVuZGVyQ29udGV4dC5jbGVhckRlcHRoICkge1xyXG5cclxuXHRcdFx0XHRkZXB0aFN0ZW5jaWxBdHRhY2htZW50LmRlcHRoQ2xlYXJWYWx1ZSA9IHJlbmRlckNvbnRleHQuY2xlYXJEZXB0aFZhbHVlO1xyXG5cdFx0XHRcdGRlcHRoU3RlbmNpbEF0dGFjaG1lbnQuZGVwdGhMb2FkT3AgPSBHUFVMb2FkT3AuQ2xlYXI7XHJcblx0XHRcdFx0ZGVwdGhTdGVuY2lsQXR0YWNobWVudC5kZXB0aFN0b3JlT3AgPSBHUFVTdG9yZU9wLlN0b3JlO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0ZGVwdGhTdGVuY2lsQXR0YWNobWVudC5kZXB0aExvYWRPcCA9IEdQVUxvYWRPcC5Mb2FkO1xyXG5cdFx0XHRcdGRlcHRoU3RlbmNpbEF0dGFjaG1lbnQuZGVwdGhTdG9yZU9wID0gR1BVU3RvcmVPcC5TdG9yZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCByZW5kZXJDb250ZXh0LnN0ZW5jaWwgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHJlbmRlckNvbnRleHQuY2xlYXJTdGVuY2lsICkge1xyXG5cclxuXHRcdFx0XHRkZXB0aFN0ZW5jaWxBdHRhY2htZW50LnN0ZW5jaWxDbGVhclZhbHVlID0gcmVuZGVyQ29udGV4dC5jbGVhclN0ZW5jaWxWYWx1ZTtcclxuXHRcdFx0XHRkZXB0aFN0ZW5jaWxBdHRhY2htZW50LnN0ZW5jaWxMb2FkT3AgPSBHUFVMb2FkT3AuQ2xlYXI7XHJcblx0XHRcdFx0ZGVwdGhTdGVuY2lsQXR0YWNobWVudC5zdGVuY2lsU3RvcmVPcCA9IEdQVVN0b3JlT3AuU3RvcmU7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRkZXB0aFN0ZW5jaWxBdHRhY2htZW50LnN0ZW5jaWxMb2FkT3AgPSBHUFVMb2FkT3AuTG9hZDtcclxuXHRcdFx0XHRkZXB0aFN0ZW5jaWxBdHRhY2htZW50LnN0ZW5jaWxTdG9yZU9wID0gR1BVU3RvcmVPcC5TdG9yZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCBlbmNvZGVyID0gZGV2aWNlLmNyZWF0ZUNvbW1hbmRFbmNvZGVyKCB7IGxhYmVsOiAncmVuZGVyQ29udGV4dF8nICsgcmVuZGVyQ29udGV4dC5pZCB9ICk7XHJcblx0XHRjb25zdCBjdXJyZW50UGFzcyA9IGVuY29kZXIuYmVnaW5SZW5kZXJQYXNzKCBkZXNjcmlwdG9yICk7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRyZW5kZXJDb250ZXh0RGF0YS5kZXNjcmlwdG9yID0gZGVzY3JpcHRvcjtcclxuXHRcdHJlbmRlckNvbnRleHREYXRhLmVuY29kZXIgPSBlbmNvZGVyO1xyXG5cdFx0cmVuZGVyQ29udGV4dERhdGEuY3VycmVudFBhc3MgPSBjdXJyZW50UGFzcztcclxuXHRcdHJlbmRlckNvbnRleHREYXRhLmN1cnJlbnRTZXRzID0geyBhdHRyaWJ1dGVzOiB7fSwgYmluZGluZ0dyb3VwczogW10sIHBpcGVsaW5lOiBudWxsLCBpbmRleDogbnVsbCB9O1xyXG5cdFx0cmVuZGVyQ29udGV4dERhdGEucmVuZGVyQnVuZGxlcyA9IFtdO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0aWYgKCByZW5kZXJDb250ZXh0LnZpZXdwb3J0ICkge1xyXG5cclxuXHRcdFx0dGhpcy51cGRhdGVWaWV3cG9ydCggcmVuZGVyQ29udGV4dCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHJlbmRlckNvbnRleHQuc2Npc3NvciApIHtcclxuXHJcblx0XHRcdGNvbnN0IHsgeCwgeSwgd2lkdGgsIGhlaWdodCB9ID0gcmVuZGVyQ29udGV4dC5zY2lzc29yVmFsdWU7XHJcblxyXG5cdFx0XHRjdXJyZW50UGFzcy5zZXRTY2lzc29yUmVjdCggeCwgeSwgd2lkdGgsIGhlaWdodCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyBleGVjdXRlZCBhdCB0aGUgZW5kIG9mIGEgcmVuZGVyIGNhbGwgYW5kIGZpbmFsaXplcyB3b3JrXHJcblx0ICogYWZ0ZXIgZHJhdyBjYWxscy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyQ29udGV4dH0gcmVuZGVyQ29udGV4dCAtIFRoZSByZW5kZXIgY29udGV4dC5cclxuXHQgKi9cclxuXHRmaW5pc2hSZW5kZXIoIHJlbmRlckNvbnRleHQgKSB7XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyQ29udGV4dERhdGEgPSB0aGlzLmdldCggcmVuZGVyQ29udGV4dCApO1xyXG5cdFx0Y29uc3Qgb2NjbHVzaW9uUXVlcnlDb3VudCA9IHJlbmRlckNvbnRleHQub2NjbHVzaW9uUXVlcnlDb3VudDtcclxuXHJcblx0XHRpZiAoIHJlbmRlckNvbnRleHREYXRhLnJlbmRlckJ1bmRsZXMubGVuZ3RoID4gMCApIHtcclxuXHJcblx0XHRcdHJlbmRlckNvbnRleHREYXRhLmN1cnJlbnRQYXNzLmV4ZWN1dGVCdW5kbGVzKCByZW5kZXJDb250ZXh0RGF0YS5yZW5kZXJCdW5kbGVzICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggb2NjbHVzaW9uUXVlcnlDb3VudCA+IHJlbmRlckNvbnRleHREYXRhLm9jY2x1c2lvblF1ZXJ5SW5kZXggKSB7XHJcblxyXG5cdFx0XHRyZW5kZXJDb250ZXh0RGF0YS5jdXJyZW50UGFzcy5lbmRPY2NsdXNpb25RdWVyeSgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZW5kZXJDb250ZXh0RGF0YS5jdXJyZW50UGFzcy5lbmQoKTtcclxuXHJcblx0XHRpZiAoIG9jY2x1c2lvblF1ZXJ5Q291bnQgPiAwICkge1xyXG5cclxuXHRcdFx0Y29uc3QgYnVmZmVyU2l6ZSA9IG9jY2x1c2lvblF1ZXJ5Q291bnQgKiA4OyAvLyA4IGJ5dGUgZW50cmllcyBmb3IgcXVlcnkgcmVzdWx0c1xyXG5cclxuXHRcdFx0Ly9cclxuXHJcblx0XHRcdGxldCBxdWVyeVJlc29sdmVCdWZmZXIgPSB0aGlzLm9jY2x1ZGVkUmVzb2x2ZUNhY2hlLmdldCggYnVmZmVyU2l6ZSApO1xyXG5cclxuXHRcdFx0aWYgKCBxdWVyeVJlc29sdmVCdWZmZXIgPT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdFx0cXVlcnlSZXNvbHZlQnVmZmVyID0gdGhpcy5kZXZpY2UuY3JlYXRlQnVmZmVyKFxyXG5cdFx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0XHRzaXplOiBidWZmZXJTaXplLFxyXG5cdFx0XHRcdFx0XHR1c2FnZTogR1BVQnVmZmVyVXNhZ2UuUVVFUllfUkVTT0xWRSB8IEdQVUJ1ZmZlclVzYWdlLkNPUFlfU1JDXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0KTtcclxuXHJcblx0XHRcdFx0dGhpcy5vY2NsdWRlZFJlc29sdmVDYWNoZS5zZXQoIGJ1ZmZlclNpemUsIHF1ZXJ5UmVzb2x2ZUJ1ZmZlciApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly9cclxuXHJcblx0XHRcdGNvbnN0IHJlYWRCdWZmZXIgPSB0aGlzLmRldmljZS5jcmVhdGVCdWZmZXIoXHJcblx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0c2l6ZTogYnVmZmVyU2l6ZSxcclxuXHRcdFx0XHRcdHVzYWdlOiBHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVCB8IEdQVUJ1ZmZlclVzYWdlLk1BUF9SRUFEXHJcblx0XHRcdFx0fVxyXG5cdFx0XHQpO1xyXG5cclxuXHRcdFx0Ly8gdHdvIGJ1ZmZlcnMgcmVxdWlyZWQgaGVyZSAtIFdlYkdQVSBkb2Vzbid0IGFsbG93IHVzYWdlIG9mIFFVRVJZX1JFU09MVkUgJiBNQVBfUkVBRCB0byBiZSBjb21iaW5lZFxyXG5cdFx0XHRyZW5kZXJDb250ZXh0RGF0YS5lbmNvZGVyLnJlc29sdmVRdWVyeVNldCggcmVuZGVyQ29udGV4dERhdGEub2NjbHVzaW9uUXVlcnlTZXQsIDAsIG9jY2x1c2lvblF1ZXJ5Q291bnQsIHF1ZXJ5UmVzb2x2ZUJ1ZmZlciwgMCApO1xyXG5cdFx0XHRyZW5kZXJDb250ZXh0RGF0YS5lbmNvZGVyLmNvcHlCdWZmZXJUb0J1ZmZlciggcXVlcnlSZXNvbHZlQnVmZmVyLCAwLCByZWFkQnVmZmVyLCAwLCBidWZmZXJTaXplICk7XHJcblxyXG5cdFx0XHRyZW5kZXJDb250ZXh0RGF0YS5vY2NsdXNpb25RdWVyeUJ1ZmZlciA9IHJlYWRCdWZmZXI7XHJcblxyXG5cdFx0XHQvL1xyXG5cclxuXHRcdFx0dGhpcy5yZXNvbHZlT2NjbHVkZWRBc3luYyggcmVuZGVyQ29udGV4dCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmRldmljZS5xdWV1ZS5zdWJtaXQoIFsgcmVuZGVyQ29udGV4dERhdGEuZW5jb2Rlci5maW5pc2goKSBdICk7XHJcblxyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0aWYgKCByZW5kZXJDb250ZXh0LnRleHR1cmVzICE9PSBudWxsICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdGV4dHVyZXMgPSByZW5kZXJDb250ZXh0LnRleHR1cmVzO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdGV4dHVyZXMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB0ZXh0dXJlID0gdGV4dHVyZXNbIGkgXTtcclxuXHJcblx0XHRcdFx0aWYgKCB0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0XHR0aGlzLnRleHR1cmVVdGlscy5nZW5lcmF0ZU1pcG1hcHMoIHRleHR1cmUgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gM0Qgb2JqZWN0IGlzIGZ1bGx5IG9jY2x1ZGVkIGJ5IG90aGVyXHJcblx0ICogM0Qgb2JqZWN0cyBpbiB0aGUgc2NlbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JlbmRlckNvbnRleHR9IHJlbmRlckNvbnRleHQgLSBUaGUgcmVuZGVyIGNvbnRleHQuXHJcblx0ICogQHBhcmFtIHtPYmplY3QzRH0gb2JqZWN0IC0gVGhlIDNEIG9iamVjdCB0byB0ZXN0LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIDNEIG9iamVjdCBpcyBmdWxseSBvY2NsdWRlZCBvciBub3QuXHJcblx0ICovXHJcblx0aXNPY2NsdWRlZCggcmVuZGVyQ29udGV4dCwgb2JqZWN0ICkge1xyXG5cclxuXHRcdGNvbnN0IHJlbmRlckNvbnRleHREYXRhID0gdGhpcy5nZXQoIHJlbmRlckNvbnRleHQgKTtcclxuXHJcblx0XHRyZXR1cm4gcmVuZGVyQ29udGV4dERhdGEub2NjbHVkZWQgJiYgcmVuZGVyQ29udGV4dERhdGEub2NjbHVkZWQuaGFzKCBvYmplY3QgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBwcm9jZXNzZXMgdGhlIHJlc3VsdCBvZiBvY2NsdXNpb24gcXVlcmllcyBhbmQgd3JpdGVzIGl0XHJcblx0ICogaW50byByZW5kZXIgY29udGV4dCBkYXRhLlxyXG5cdCAqXHJcblx0ICogQGFzeW5jXHJcblx0ICogQHBhcmFtIHtSZW5kZXJDb250ZXh0fSByZW5kZXJDb250ZXh0IC0gVGhlIHJlbmRlciBjb250ZXh0LlxyXG5cdCAqIEByZXR1cm4ge1Byb21pc2V9IEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG9jY2x1c2lvbiBxdWVyeSByZXN1bHRzIGhhdmUgYmVlbiBwcm9jZXNzZWQuXHJcblx0ICovXHJcblx0YXN5bmMgcmVzb2x2ZU9jY2x1ZGVkQXN5bmMoIHJlbmRlckNvbnRleHQgKSB7XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyQ29udGV4dERhdGEgPSB0aGlzLmdldCggcmVuZGVyQ29udGV4dCApO1xyXG5cclxuXHRcdC8vIGhhbmRsZSBvY2NsdXNpb24gcXVlcnkgcmVzdWx0c1xyXG5cclxuXHRcdGNvbnN0IHsgY3VycmVudE9jY2x1c2lvblF1ZXJ5QnVmZmVyLCBjdXJyZW50T2NjbHVzaW9uUXVlcnlPYmplY3RzIH0gPSByZW5kZXJDb250ZXh0RGF0YTtcclxuXHJcblx0XHRpZiAoIGN1cnJlbnRPY2NsdXNpb25RdWVyeUJ1ZmZlciAmJiBjdXJyZW50T2NjbHVzaW9uUXVlcnlPYmplY3RzICkge1xyXG5cclxuXHRcdFx0Y29uc3Qgb2NjbHVkZWQgPSBuZXcgV2Vha1NldCgpO1xyXG5cclxuXHRcdFx0cmVuZGVyQ29udGV4dERhdGEuY3VycmVudE9jY2x1c2lvblF1ZXJ5T2JqZWN0cyA9IG51bGw7XHJcblx0XHRcdHJlbmRlckNvbnRleHREYXRhLmN1cnJlbnRPY2NsdXNpb25RdWVyeUJ1ZmZlciA9IG51bGw7XHJcblxyXG5cdFx0XHRhd2FpdCBjdXJyZW50T2NjbHVzaW9uUXVlcnlCdWZmZXIubWFwQXN5bmMoIEdQVU1hcE1vZGUuUkVBRCApO1xyXG5cclxuXHRcdFx0Y29uc3QgYnVmZmVyID0gY3VycmVudE9jY2x1c2lvblF1ZXJ5QnVmZmVyLmdldE1hcHBlZFJhbmdlKCk7XHJcblx0XHRcdGNvbnN0IHJlc3VsdHMgPSBuZXcgQmlnVWludDY0QXJyYXkoIGJ1ZmZlciApO1xyXG5cclxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgY3VycmVudE9jY2x1c2lvblF1ZXJ5T2JqZWN0cy5sZW5ndGg7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggcmVzdWx0c1sgaSBdID09PSBCaWdJbnQoIDAgKSApIHtcclxuXHJcblx0XHRcdFx0XHRvY2NsdWRlZC5hZGQoIGN1cnJlbnRPY2NsdXNpb25RdWVyeU9iamVjdHNbIGkgXSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjdXJyZW50T2NjbHVzaW9uUXVlcnlCdWZmZXIuZGVzdHJveSgpO1xyXG5cclxuXHRcdFx0cmVuZGVyQ29udGV4dERhdGEub2NjbHVkZWQgPSBvY2NsdWRlZDtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgdmlld3BvcnQgd2l0aCB0aGUgdmFsdWVzIGZyb20gdGhlIGdpdmVuIHJlbmRlciBjb250ZXh0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSZW5kZXJDb250ZXh0fSByZW5kZXJDb250ZXh0IC0gVGhlIHJlbmRlciBjb250ZXh0LlxyXG5cdCAqL1xyXG5cdHVwZGF0ZVZpZXdwb3J0KCByZW5kZXJDb250ZXh0ICkge1xyXG5cclxuXHRcdGNvbnN0IHsgY3VycmVudFBhc3MgfSA9IHRoaXMuZ2V0KCByZW5kZXJDb250ZXh0ICk7XHJcblx0XHRjb25zdCB7IHgsIHksIHdpZHRoLCBoZWlnaHQsIG1pbkRlcHRoLCBtYXhEZXB0aCB9ID0gcmVuZGVyQ29udGV4dC52aWV3cG9ydFZhbHVlO1xyXG5cclxuXHRcdGN1cnJlbnRQYXNzLnNldFZpZXdwb3J0KCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBtaW5EZXB0aCwgbWF4RGVwdGggKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBjbGVhciBjb2xvciBhbmQgYWxwaGEgaW50byBhIHNpbmdsZVxyXG5cdCAqIGNvbG9yIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm4ge0NvbG9yNH0gVGhlIGNsZWFyIGNvbG9yLlxyXG5cdCAqL1xyXG5cdGdldENsZWFyQ29sb3IoKSB7XHJcblxyXG5cdFx0Y29uc3QgY2xlYXJDb2xvciA9IHN1cGVyLmdldENsZWFyQ29sb3IoKTtcclxuXHJcblx0XHQvLyBvbmx5IHByZW11bHRpcGx5IGFscGhhIHdoZW4gYWxwaGFNb2RlIGlzIFwicHJlbXVsdGlwbGllZFwiXHJcblxyXG5cdFx0aWYgKCB0aGlzLnJlbmRlcmVyLmFscGhhID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0Y2xlYXJDb2xvci5yICo9IGNsZWFyQ29sb3IuYTtcclxuXHRcdFx0Y2xlYXJDb2xvci5nICo9IGNsZWFyQ29sb3IuYTtcclxuXHRcdFx0Y2xlYXJDb2xvci5iICo9IGNsZWFyQ29sb3IuYTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGNsZWFyQ29sb3I7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUGVyZm9ybXMgYSBjbGVhciBvcGVyYXRpb24uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IGNvbG9yIC0gV2hldGhlciB0aGUgY29sb3IgYnVmZmVyIHNob3VsZCBiZSBjbGVhcmVkIG9yIG5vdC5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IGRlcHRoIC0gV2hldGhlciB0aGUgZGVwdGggYnVmZmVyIHNob3VsZCBiZSBjbGVhcmVkIG9yIG5vdC5cclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IHN0ZW5jaWwgLSBXaGV0aGVyIHRoZSBzdGVuY2lsIGJ1ZmZlciBzaG91bGQgYmUgY2xlYXJlZCBvciBub3QuXHJcblx0ICogQHBhcmFtIHs/UmVuZGVyQ29udGV4dH0gW3JlbmRlclRhcmdldENvbnRleHQ9bnVsbF0gLSBUaGUgcmVuZGVyIGNvbnRleHQgb2YgdGhlIGN1cnJlbnQgc2V0IHJlbmRlciB0YXJnZXQuXHJcblx0ICovXHJcblx0Y2xlYXIoIGNvbG9yLCBkZXB0aCwgc3RlbmNpbCwgcmVuZGVyVGFyZ2V0Q29udGV4dCA9IG51bGwgKSB7XHJcblxyXG5cdFx0Y29uc3QgZGV2aWNlID0gdGhpcy5kZXZpY2U7XHJcblx0XHRjb25zdCByZW5kZXJlciA9IHRoaXMucmVuZGVyZXI7XHJcblxyXG5cdFx0bGV0IGNvbG9yQXR0YWNobWVudHMgPSBbXTtcclxuXHRcdGxldCBkZXB0aFN0ZW5jaWxBdHRhY2htZW50O1xyXG5cdFx0bGV0IGNsZWFyVmFsdWU7XHJcblxyXG5cdFx0bGV0IHN1cHBvcnRzRGVwdGg7XHJcblx0XHRsZXQgc3VwcG9ydHNTdGVuY2lsO1xyXG5cclxuXHRcdGlmICggY29sb3IgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBjbGVhckNvbG9yID0gdGhpcy5nZXRDbGVhckNvbG9yKCk7XHJcblx0XHRcdGNsZWFyVmFsdWUgPSB7IHI6IGNsZWFyQ29sb3IuciwgZzogY2xlYXJDb2xvci5nLCBiOiBjbGVhckNvbG9yLmIsIGE6IGNsZWFyQ29sb3IuYSB9O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHJlbmRlclRhcmdldENvbnRleHQgPT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRzdXBwb3J0c0RlcHRoID0gcmVuZGVyZXIuZGVwdGg7XHJcblx0XHRcdHN1cHBvcnRzU3RlbmNpbCA9IHJlbmRlcmVyLnN0ZW5jaWw7XHJcblxyXG5cdFx0XHRjb25zdCBkZXNjcmlwdG9yID0gdGhpcy5fZ2V0RGVmYXVsdFJlbmRlclBhc3NEZXNjcmlwdG9yKCk7XHJcblxyXG5cdFx0XHRpZiAoIGNvbG9yICkge1xyXG5cclxuXHRcdFx0XHRjb2xvckF0dGFjaG1lbnRzID0gZGVzY3JpcHRvci5jb2xvckF0dGFjaG1lbnRzO1xyXG5cclxuXHRcdFx0XHRjb25zdCBjb2xvckF0dGFjaG1lbnQgPSBjb2xvckF0dGFjaG1lbnRzWyAwIF07XHJcblxyXG5cdFx0XHRcdGNvbG9yQXR0YWNobWVudC5jbGVhclZhbHVlID0gY2xlYXJWYWx1ZTtcclxuXHRcdFx0XHRjb2xvckF0dGFjaG1lbnQubG9hZE9wID0gR1BVTG9hZE9wLkNsZWFyO1xyXG5cdFx0XHRcdGNvbG9yQXR0YWNobWVudC5zdG9yZU9wID0gR1BVU3RvcmVPcC5TdG9yZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggc3VwcG9ydHNEZXB0aCB8fCBzdXBwb3J0c1N0ZW5jaWwgKSB7XHJcblxyXG5cdFx0XHRcdGRlcHRoU3RlbmNpbEF0dGFjaG1lbnQgPSBkZXNjcmlwdG9yLmRlcHRoU3RlbmNpbEF0dGFjaG1lbnQ7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHN1cHBvcnRzRGVwdGggPSByZW5kZXJUYXJnZXRDb250ZXh0LmRlcHRoO1xyXG5cdFx0XHRzdXBwb3J0c1N0ZW5jaWwgPSByZW5kZXJUYXJnZXRDb250ZXh0LnN0ZW5jaWw7XHJcblxyXG5cdFx0XHRjb25zdCBjbGVhckNvbmZpZyA9IHtcclxuXHRcdFx0XHRsb2FkT3A6IGNvbG9yID8gR1BVTG9hZE9wLkNsZWFyIDogR1BVTG9hZE9wLkxvYWQsXHJcblx0XHRcdFx0Y2xlYXJWYWx1ZTogY29sb3IgPyBjbGVhclZhbHVlIDogdW5kZWZpbmVkXHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHRpZiAoIHN1cHBvcnRzRGVwdGggKSB7XHJcblxyXG5cdFx0XHRcdGNsZWFyQ29uZmlnLmRlcHRoTG9hZE9wID0gZGVwdGggPyBHUFVMb2FkT3AuQ2xlYXIgOiBHUFVMb2FkT3AuTG9hZDtcclxuXHRcdFx0XHRjbGVhckNvbmZpZy5kZXB0aENsZWFyVmFsdWUgPSBkZXB0aCA/IHJlbmRlcmVyLmdldENsZWFyRGVwdGgoKSA6IHVuZGVmaW5lZDtcclxuXHRcdFx0XHRjbGVhckNvbmZpZy5kZXB0aFN0b3JlT3AgPSBHUFVTdG9yZU9wLlN0b3JlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBzdXBwb3J0c1N0ZW5jaWwgKSB7XHJcblxyXG5cdFx0XHRcdGNsZWFyQ29uZmlnLnN0ZW5jaWxMb2FkT3AgPSBzdGVuY2lsID8gR1BVTG9hZE9wLkNsZWFyIDogR1BVTG9hZE9wLkxvYWQ7XHJcblx0XHRcdFx0Y2xlYXJDb25maWcuc3RlbmNpbENsZWFyVmFsdWUgPSBzdGVuY2lsID8gcmVuZGVyZXIuZ2V0Q2xlYXJTdGVuY2lsKCkgOiB1bmRlZmluZWQ7XHJcblx0XHRcdFx0Y2xlYXJDb25maWcuc3RlbmNpbFN0b3JlT3AgPSBHUFVTdG9yZU9wLlN0b3JlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgZGVzY3JpcHRvciA9IHRoaXMuX2dldFJlbmRlclBhc3NEZXNjcmlwdG9yKCByZW5kZXJUYXJnZXRDb250ZXh0LCBjbGVhckNvbmZpZyApO1xyXG5cclxuXHRcdFx0Y29sb3JBdHRhY2htZW50cyA9IGRlc2NyaXB0b3IuY29sb3JBdHRhY2htZW50cztcclxuXHRcdFx0ZGVwdGhTdGVuY2lsQXR0YWNobWVudCA9IGRlc2NyaXB0b3IuZGVwdGhTdGVuY2lsQXR0YWNobWVudDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBzdXBwb3J0c0RlcHRoICYmIGRlcHRoU3RlbmNpbEF0dGFjaG1lbnQgJiYgZGVwdGhTdGVuY2lsQXR0YWNobWVudC5kZXB0aExvYWRPcCA9PT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0aWYgKCBkZXB0aCApIHtcclxuXHJcblx0XHRcdFx0ZGVwdGhTdGVuY2lsQXR0YWNobWVudC5kZXB0aExvYWRPcCA9IEdQVUxvYWRPcC5DbGVhcjtcclxuXHRcdFx0XHRkZXB0aFN0ZW5jaWxBdHRhY2htZW50LmRlcHRoQ2xlYXJWYWx1ZSA9IHJlbmRlcmVyLmdldENsZWFyRGVwdGgoKTtcclxuXHRcdFx0XHRkZXB0aFN0ZW5jaWxBdHRhY2htZW50LmRlcHRoU3RvcmVPcCA9IEdQVVN0b3JlT3AuU3RvcmU7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRkZXB0aFN0ZW5jaWxBdHRhY2htZW50LmRlcHRoTG9hZE9wID0gR1BVTG9hZE9wLkxvYWQ7XHJcblx0XHRcdFx0ZGVwdGhTdGVuY2lsQXR0YWNobWVudC5kZXB0aFN0b3JlT3AgPSBHUFVTdG9yZU9wLlN0b3JlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvL1xyXG5cclxuXHRcdGlmICggc3VwcG9ydHNTdGVuY2lsICYmIGRlcHRoU3RlbmNpbEF0dGFjaG1lbnQgJiYgZGVwdGhTdGVuY2lsQXR0YWNobWVudC5zdGVuY2lsTG9hZE9wID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHN0ZW5jaWwgKSB7XHJcblxyXG5cdFx0XHRcdGRlcHRoU3RlbmNpbEF0dGFjaG1lbnQuc3RlbmNpbExvYWRPcCA9IEdQVUxvYWRPcC5DbGVhcjtcclxuXHRcdFx0XHRkZXB0aFN0ZW5jaWxBdHRhY2htZW50LnN0ZW5jaWxDbGVhclZhbHVlID0gcmVuZGVyZXIuZ2V0Q2xlYXJTdGVuY2lsKCk7XHJcblx0XHRcdFx0ZGVwdGhTdGVuY2lsQXR0YWNobWVudC5zdGVuY2lsU3RvcmVPcCA9IEdQVVN0b3JlT3AuU3RvcmU7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRkZXB0aFN0ZW5jaWxBdHRhY2htZW50LnN0ZW5jaWxMb2FkT3AgPSBHUFVMb2FkT3AuTG9hZDtcclxuXHRcdFx0XHRkZXB0aFN0ZW5jaWxBdHRhY2htZW50LnN0ZW5jaWxTdG9yZU9wID0gR1BVU3RvcmVPcC5TdG9yZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCBlbmNvZGVyID0gZGV2aWNlLmNyZWF0ZUNvbW1hbmRFbmNvZGVyKCB7IGxhYmVsOiAnY2xlYXInIH0gKTtcclxuXHRcdGNvbnN0IGN1cnJlbnRQYXNzID0gZW5jb2Rlci5iZWdpblJlbmRlclBhc3MoIHtcclxuXHRcdFx0Y29sb3JBdHRhY2htZW50cyxcclxuXHRcdFx0ZGVwdGhTdGVuY2lsQXR0YWNobWVudFxyXG5cdFx0fSApO1xyXG5cclxuXHRcdGN1cnJlbnRQYXNzLmVuZCgpO1xyXG5cclxuXHRcdGRldmljZS5xdWV1ZS5zdWJtaXQoIFsgZW5jb2Rlci5maW5pc2goKSBdICk7XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gY29tcHV0ZVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyBleGVjdXRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgY29tcHV0ZSBjYWxsIGFuZFxyXG5cdCAqIHByZXBhcmVzIHRoZSBzdGF0ZSBmb3IgdXBjb21pbmcgY29tcHV0ZSB0YXNrcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Tm9kZXxBcnJheTxOb2RlPn0gY29tcHV0ZUdyb3VwIC0gVGhlIGNvbXB1dGUgbm9kZShzKS5cclxuXHQgKi9cclxuXHRiZWdpbkNvbXB1dGUoIGNvbXB1dGVHcm91cCApIHtcclxuXHJcblx0XHRjb25zdCBncm91cEdQVSA9IHRoaXMuZ2V0KCBjb21wdXRlR3JvdXAgKTtcclxuXHJcblxyXG5cdFx0Y29uc3QgZGVzY3JpcHRvciA9IHtcclxuXHRcdFx0bGFiZWw6ICdjb21wdXRlR3JvdXBfJyArIGNvbXB1dGVHcm91cC5pZFxyXG5cdFx0fTtcclxuXHJcblx0XHR0aGlzLmluaXRUaW1lc3RhbXBRdWVyeSggY29tcHV0ZUdyb3VwLCBkZXNjcmlwdG9yICk7XHJcblxyXG5cdFx0Z3JvdXBHUFUuY21kRW5jb2RlckdQVSA9IHRoaXMuZGV2aWNlLmNyZWF0ZUNvbW1hbmRFbmNvZGVyKCB7IGxhYmVsOiAnY29tcHV0ZUdyb3VwXycgKyBjb21wdXRlR3JvdXAuaWQgfSApO1xyXG5cclxuXHRcdGdyb3VwR1BVLnBhc3NFbmNvZGVyR1BVID0gZ3JvdXBHUFUuY21kRW5jb2RlckdQVS5iZWdpbkNvbXB1dGVQYXNzKCBkZXNjcmlwdG9yICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRXhlY3V0ZXMgYSBjb21wdXRlIGNvbW1hbmQgZm9yIHRoZSBnaXZlbiBjb21wdXRlIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV8QXJyYXk8Tm9kZT59IGNvbXB1dGVHcm91cCAtIFRoZSBncm91cCBvZiBjb21wdXRlIG5vZGVzIG9mIGEgY29tcHV0ZSBjYWxsLiBDYW4gYmUgYSBzaW5nbGUgY29tcHV0ZSBub2RlLlxyXG5cdCAqIEBwYXJhbSB7Tm9kZX0gY29tcHV0ZU5vZGUgLSBUaGUgY29tcHV0ZSBub2RlLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8QmluZEdyb3VwPn0gYmluZGluZ3MgLSBUaGUgYmluZGluZ3MuXHJcblx0ICogQHBhcmFtIHtDb21wdXRlUGlwZWxpbmV9IHBpcGVsaW5lIC0gVGhlIGNvbXB1dGUgcGlwZWxpbmUuXHJcblx0ICovXHJcblx0Y29tcHV0ZSggY29tcHV0ZUdyb3VwLCBjb21wdXRlTm9kZSwgYmluZGluZ3MsIHBpcGVsaW5lICkge1xyXG5cclxuXHRcdGNvbnN0IHsgcGFzc0VuY29kZXJHUFUgfSA9IHRoaXMuZ2V0KCBjb21wdXRlR3JvdXAgKTtcclxuXHJcblx0XHQvLyBwaXBlbGluZVxyXG5cclxuXHRcdGNvbnN0IHBpcGVsaW5lR1BVID0gdGhpcy5nZXQoIHBpcGVsaW5lICkucGlwZWxpbmU7XHJcblx0XHRwYXNzRW5jb2RlckdQVS5zZXRQaXBlbGluZSggcGlwZWxpbmVHUFUgKTtcclxuXHJcblx0XHQvLyBiaW5kIGdyb3Vwc1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGJpbmRpbmdzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBiaW5kR3JvdXAgPSBiaW5kaW5nc1sgaSBdO1xyXG5cdFx0XHRjb25zdCBiaW5kaW5nc0RhdGEgPSB0aGlzLmdldCggYmluZEdyb3VwICk7XHJcblxyXG5cdFx0XHRwYXNzRW5jb2RlckdQVS5zZXRCaW5kR3JvdXAoIGksIGJpbmRpbmdzRGF0YS5ncm91cCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBtYXhDb21wdXRlV29ya2dyb3Vwc1BlckRpbWVuc2lvbiA9IHRoaXMuZGV2aWNlLmxpbWl0cy5tYXhDb21wdXRlV29ya2dyb3Vwc1BlckRpbWVuc2lvbjtcclxuXHJcblx0XHRjb25zdCBjb21wdXRlTm9kZURhdGEgPSB0aGlzLmdldCggY29tcHV0ZU5vZGUgKTtcclxuXHJcblx0XHRpZiAoIGNvbXB1dGVOb2RlRGF0YS5kaXNwYXRjaFNpemUgPT09IHVuZGVmaW5lZCApIGNvbXB1dGVOb2RlRGF0YS5kaXNwYXRjaFNpemUgPSB7IHg6IDAsIHk6IDEsIHo6IDEgfTtcclxuXHJcblx0XHRjb25zdCB7IGRpc3BhdGNoU2l6ZSB9ID0gY29tcHV0ZU5vZGVEYXRhO1xyXG5cclxuXHRcdGlmICggY29tcHV0ZU5vZGUuZGlzcGF0Y2hDb3VudCA+IG1heENvbXB1dGVXb3JrZ3JvdXBzUGVyRGltZW5zaW9uICkge1xyXG5cclxuXHRcdFx0ZGlzcGF0Y2hTaXplLnggPSBNYXRoLm1pbiggY29tcHV0ZU5vZGUuZGlzcGF0Y2hDb3VudCwgbWF4Q29tcHV0ZVdvcmtncm91cHNQZXJEaW1lbnNpb24gKTtcclxuXHRcdFx0ZGlzcGF0Y2hTaXplLnkgPSBNYXRoLmNlaWwoIGNvbXB1dGVOb2RlLmRpc3BhdGNoQ291bnQgLyBtYXhDb21wdXRlV29ya2dyb3Vwc1BlckRpbWVuc2lvbiApO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRkaXNwYXRjaFNpemUueCA9IGNvbXB1dGVOb2RlLmRpc3BhdGNoQ291bnQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHBhc3NFbmNvZGVyR1BVLmRpc3BhdGNoV29ya2dyb3VwcyhcclxuXHRcdFx0ZGlzcGF0Y2hTaXplLngsXHJcblx0XHRcdGRpc3BhdGNoU2l6ZS55LFxyXG5cdFx0XHRkaXNwYXRjaFNpemUuelxyXG5cdFx0KTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIG1ldGhvZCBpcyBleGVjdXRlZCBhdCB0aGUgZW5kIG9mIGEgY29tcHV0ZSBjYWxsIGFuZFxyXG5cdCAqIGZpbmFsaXplcyB3b3JrIGFmdGVyIGNvbXB1dGUgdGFza3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge05vZGV8QXJyYXk8Tm9kZT59IGNvbXB1dGVHcm91cCAtIFRoZSBjb21wdXRlIG5vZGUocykuXHJcblx0ICovXHJcblx0ZmluaXNoQ29tcHV0ZSggY29tcHV0ZUdyb3VwICkge1xyXG5cclxuXHRcdGNvbnN0IGdyb3VwRGF0YSA9IHRoaXMuZ2V0KCBjb21wdXRlR3JvdXAgKTtcclxuXHJcblx0XHRncm91cERhdGEucGFzc0VuY29kZXJHUFUuZW5kKCk7XHJcblxyXG5cdFx0dGhpcy5kZXZpY2UucXVldWUuc3VibWl0KCBbIGdyb3VwRGF0YS5jbWRFbmNvZGVyR1BVLmZpbmlzaCgpIF0gKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDYW4gYmUgdXNlZCB0byBzeW5jaHJvbml6ZSBDUFUgb3BlcmF0aW9ucyB3aXRoIEdQVSB0YXNrcy4gU28gd2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsXHJcblx0ICogdGhlIENQVSB3YWl0cyBmb3IgdGhlIEdQVSB0byBjb21wbGV0ZSBpdHMgb3BlcmF0aW9uIChlLmcuIGEgY29tcHV0ZSB0YXNrKS5cclxuXHQgKlxyXG5cdCAqIEBhc3luY1xyXG5cdCAqIEByZXR1cm4ge1Byb21pc2V9IEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gc3luY2hyb25pemF0aW9uIGhhcyBiZWVuIGZpbmlzaGVkLlxyXG5cdCAqL1xyXG5cdGFzeW5jIHdhaXRGb3JHUFUoKSB7XHJcblxyXG5cdFx0YXdhaXQgdGhpcy5kZXZpY2UucXVldWUub25TdWJtaXR0ZWRXb3JrRG9uZSgpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vIHJlbmRlciBvYmplY3RcclxuXHJcblx0LyoqXHJcblx0ICogRXhlY3V0ZXMgYSBkcmF3IGNvbW1hbmQgZm9yIHRoZSBnaXZlbiByZW5kZXIgb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSZW5kZXJPYmplY3R9IHJlbmRlck9iamVjdCAtIFRoZSByZW5kZXIgb2JqZWN0IHRvIGRyYXcuXHJcblx0ICogQHBhcmFtIHtJbmZvfSBpbmZvIC0gSG9sZHMgYSBzZXJpZXMgb2Ygc3RhdGlzdGljYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEdQVSBtZW1vcnkgYW5kIHRoZSByZW5kZXJpbmcgcHJvY2Vzcy5cclxuXHQgKi9cclxuXHRkcmF3KCByZW5kZXJPYmplY3QsIGluZm8gKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBvYmplY3QsIG1hdGVyaWFsLCBjb250ZXh0LCBwaXBlbGluZSB9ID0gcmVuZGVyT2JqZWN0O1xyXG5cdFx0Y29uc3QgYmluZGluZ3MgPSByZW5kZXJPYmplY3QuZ2V0QmluZGluZ3MoKTtcclxuXHRcdGNvbnN0IHJlbmRlckNvbnRleHREYXRhID0gdGhpcy5nZXQoIGNvbnRleHQgKTtcclxuXHRcdGNvbnN0IHBpcGVsaW5lR1BVID0gdGhpcy5nZXQoIHBpcGVsaW5lICkucGlwZWxpbmU7XHJcblx0XHRjb25zdCBjdXJyZW50U2V0cyA9IHJlbmRlckNvbnRleHREYXRhLmN1cnJlbnRTZXRzO1xyXG5cdFx0Y29uc3QgcGFzc0VuY29kZXJHUFUgPSByZW5kZXJDb250ZXh0RGF0YS5jdXJyZW50UGFzcztcclxuXHJcblx0XHRjb25zdCBkcmF3UGFyYW1zID0gcmVuZGVyT2JqZWN0LmdldERyYXdQYXJhbWV0ZXJzKCk7XHJcblxyXG5cdFx0aWYgKCBkcmF3UGFyYW1zID09PSBudWxsICkgcmV0dXJuO1xyXG5cclxuXHRcdC8vIHBpcGVsaW5lXHJcblxyXG5cdFx0aWYgKCBjdXJyZW50U2V0cy5waXBlbGluZSAhPT0gcGlwZWxpbmVHUFUgKSB7XHJcblxyXG5cdFx0XHRwYXNzRW5jb2RlckdQVS5zZXRQaXBlbGluZSggcGlwZWxpbmVHUFUgKTtcclxuXHJcblx0XHRcdGN1cnJlbnRTZXRzLnBpcGVsaW5lID0gcGlwZWxpbmVHUFU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGJpbmQgZ3JvdXBzXHJcblxyXG5cdFx0Y29uc3QgY3VycmVudEJpbmRpbmdHcm91cHMgPSBjdXJyZW50U2V0cy5iaW5kaW5nR3JvdXBzO1xyXG5cclxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGJpbmRpbmdzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBiaW5kR3JvdXAgPSBiaW5kaW5nc1sgaSBdO1xyXG5cdFx0XHRjb25zdCBiaW5kaW5nc0RhdGEgPSB0aGlzLmdldCggYmluZEdyb3VwICk7XHJcblxyXG5cdFx0XHRpZiAoIGN1cnJlbnRCaW5kaW5nR3JvdXBzWyBiaW5kR3JvdXAuaW5kZXggXSAhPT0gYmluZEdyb3VwLmlkICkge1xyXG5cclxuXHRcdFx0XHRwYXNzRW5jb2RlckdQVS5zZXRCaW5kR3JvdXAoIGJpbmRHcm91cC5pbmRleCwgYmluZGluZ3NEYXRhLmdyb3VwICk7XHJcblx0XHRcdFx0Y3VycmVudEJpbmRpbmdHcm91cHNbIGJpbmRHcm91cC5pbmRleCBdID0gYmluZEdyb3VwLmlkO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBhdHRyaWJ1dGVzXHJcblxyXG5cdFx0Y29uc3QgaW5kZXggPSByZW5kZXJPYmplY3QuZ2V0SW5kZXgoKTtcclxuXHJcblx0XHRjb25zdCBoYXNJbmRleCA9ICggaW5kZXggIT09IG51bGwgKTtcclxuXHJcblx0XHQvLyBpbmRleFxyXG5cclxuXHRcdGlmICggaGFzSW5kZXggPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRpZiAoIGN1cnJlbnRTZXRzLmluZGV4ICE9PSBpbmRleCApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgYnVmZmVyID0gdGhpcy5nZXQoIGluZGV4ICkuYnVmZmVyO1xyXG5cdFx0XHRcdGNvbnN0IGluZGV4Rm9ybWF0ID0gKCBpbmRleC5hcnJheSBpbnN0YW5jZW9mIFVpbnQxNkFycmF5ICkgPyBHUFVJbmRleEZvcm1hdC5VaW50MTYgOiBHUFVJbmRleEZvcm1hdC5VaW50MzI7XHJcblxyXG5cdFx0XHRcdHBhc3NFbmNvZGVyR1BVLnNldEluZGV4QnVmZmVyKCBidWZmZXIsIGluZGV4Rm9ybWF0ICk7XHJcblxyXG5cdFx0XHRcdGN1cnJlbnRTZXRzLmluZGV4ID0gaW5kZXg7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIHZlcnRleCBidWZmZXJzXHJcblxyXG5cdFx0Y29uc3QgdmVydGV4QnVmZmVycyA9IHJlbmRlck9iamVjdC5nZXRWZXJ0ZXhCdWZmZXJzKCk7XHJcblxyXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gdmVydGV4QnVmZmVycy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdmVydGV4QnVmZmVyID0gdmVydGV4QnVmZmVyc1sgaSBdO1xyXG5cclxuXHRcdFx0aWYgKCBjdXJyZW50U2V0cy5hdHRyaWJ1dGVzWyBpIF0gIT09IHZlcnRleEJ1ZmZlciApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgYnVmZmVyID0gdGhpcy5nZXQoIHZlcnRleEJ1ZmZlciApLmJ1ZmZlcjtcclxuXHRcdFx0XHRwYXNzRW5jb2RlckdQVS5zZXRWZXJ0ZXhCdWZmZXIoIGksIGJ1ZmZlciApO1xyXG5cclxuXHRcdFx0XHRjdXJyZW50U2V0cy5hdHRyaWJ1dGVzWyBpIF0gPSB2ZXJ0ZXhCdWZmZXI7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIG9jY2x1c2lvbiBxdWVyaWVzIC0gaGFuZGxlIG11bHRpcGxlIGNvbnNlY3V0aXZlIGRyYXcgY2FsbHMgZm9yIGFuIG9iamVjdFxyXG5cclxuXHRcdGlmICggcmVuZGVyQ29udGV4dERhdGEub2NjbHVzaW9uUXVlcnlTZXQgIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGNvbnN0IGxhc3RPYmplY3QgPSByZW5kZXJDb250ZXh0RGF0YS5sYXN0T2NjbHVzaW9uT2JqZWN0O1xyXG5cclxuXHRcdFx0aWYgKCBsYXN0T2JqZWN0ICE9PSBvYmplY3QgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggbGFzdE9iamVjdCAhPT0gbnVsbCAmJiBsYXN0T2JqZWN0Lm9jY2x1c2lvblRlc3QgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0cGFzc0VuY29kZXJHUFUuZW5kT2NjbHVzaW9uUXVlcnkoKTtcclxuXHRcdFx0XHRcdHJlbmRlckNvbnRleHREYXRhLm9jY2x1c2lvblF1ZXJ5SW5kZXggKys7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKCBvYmplY3Qub2NjbHVzaW9uVGVzdCA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0XHRwYXNzRW5jb2RlckdQVS5iZWdpbk9jY2x1c2lvblF1ZXJ5KCByZW5kZXJDb250ZXh0RGF0YS5vY2NsdXNpb25RdWVyeUluZGV4ICk7XHJcblx0XHRcdFx0XHRyZW5kZXJDb250ZXh0RGF0YS5vY2NsdXNpb25RdWVyeU9iamVjdHNbIHJlbmRlckNvbnRleHREYXRhLm9jY2x1c2lvblF1ZXJ5SW5kZXggXSA9IG9iamVjdDtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRyZW5kZXJDb250ZXh0RGF0YS5sYXN0T2NjbHVzaW9uT2JqZWN0ID0gb2JqZWN0O1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvLyBzdGVuY2lsXHJcblxyXG5cdFx0aWYgKCBjb250ZXh0LnN0ZW5jaWwgPT09IHRydWUgJiYgbWF0ZXJpYWwuc3RlbmNpbFdyaXRlID09PSB0cnVlICYmIHJlbmRlckNvbnRleHREYXRhLmN1cnJlbnRTdGVuY2lsUmVmICE9PSBtYXRlcmlhbC5zdGVuY2lsUmVmICkge1xyXG5cclxuXHRcdFx0cGFzc0VuY29kZXJHUFUuc2V0U3RlbmNpbFJlZmVyZW5jZSggbWF0ZXJpYWwuc3RlbmNpbFJlZiApO1xyXG5cdFx0XHRyZW5kZXJDb250ZXh0RGF0YS5jdXJyZW50U3RlbmNpbFJlZiA9IG1hdGVyaWFsLnN0ZW5jaWxSZWY7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGRyYXdcclxuXHJcblx0XHRjb25zdCBkcmF3ID0gKCkgPT4ge1xyXG5cclxuXHRcdFx0aWYgKCBvYmplY3QuaXNCYXRjaGVkTWVzaCA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdFx0Y29uc3Qgc3RhcnRzID0gb2JqZWN0Ll9tdWx0aURyYXdTdGFydHM7XHJcblx0XHRcdFx0Y29uc3QgY291bnRzID0gb2JqZWN0Ll9tdWx0aURyYXdDb3VudHM7XHJcblx0XHRcdFx0Y29uc3QgZHJhd0NvdW50ID0gb2JqZWN0Ll9tdWx0aURyYXdDb3VudDtcclxuXHRcdFx0XHRjb25zdCBkcmF3SW5zdGFuY2VzID0gb2JqZWN0Ll9tdWx0aURyYXdJbnN0YW5jZXM7XHJcblxyXG5cdFx0XHRcdGlmICggZHJhd0luc3RhbmNlcyAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHQvLyBAZGVwcmVjYXRlZCwgcjE3NFxyXG5cdFx0XHRcdFx0d2Fybk9uY2UoICdUSFJFRS5XZWJHUFVCYWNrZW5kOiByZW5kZXJNdWx0aURyYXdJbnN0YW5jZXMgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHIxODQuIEFwcGVuZCB0byByZW5kZXJNdWx0aURyYXcgYXJndW1lbnRzIGFuZCB1c2UgaW5kaXJlY3Rpb24uJyApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGRyYXdDb3VudDsgaSArKyApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBjb3VudCA9IGRyYXdJbnN0YW5jZXMgPyBkcmF3SW5zdGFuY2VzWyBpIF0gOiAxO1xyXG5cdFx0XHRcdFx0Y29uc3QgZmlyc3RJbnN0YW5jZSA9IGNvdW50ID4gMSA/IDAgOiBpO1xyXG5cclxuXHRcdFx0XHRcdGlmICggaGFzSW5kZXggPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRwYXNzRW5jb2RlckdQVS5kcmF3SW5kZXhlZCggY291bnRzWyBpIF0sIGNvdW50LCBzdGFydHNbIGkgXSAvIGluZGV4LmFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCAwLCBmaXJzdEluc3RhbmNlICk7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdHBhc3NFbmNvZGVyR1BVLmRyYXcoIGNvdW50c1sgaSBdLCBjb3VudCwgc3RhcnRzWyBpIF0sIGZpcnN0SW5zdGFuY2UgKTtcclxuXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aW5mby51cGRhdGUoIG9iamVjdCwgY291bnRzWyBpIF0sIGNvdW50ICk7XHJcblxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGhhc0luZGV4ID09PSB0cnVlICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCB7IHZlcnRleENvdW50OiBpbmRleENvdW50LCBpbnN0YW5jZUNvdW50LCBmaXJzdFZlcnRleDogZmlyc3RJbmRleCB9ID0gZHJhd1BhcmFtcztcclxuXHJcblx0XHRcdFx0Y29uc3QgaW5kaXJlY3QgPSByZW5kZXJPYmplY3QuZ2V0SW5kaXJlY3QoKTtcclxuXHJcblx0XHRcdFx0aWYgKCBpbmRpcmVjdCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBidWZmZXIgPSB0aGlzLmdldCggaW5kaXJlY3QgKS5idWZmZXI7XHJcblxyXG5cdFx0XHRcdFx0cGFzc0VuY29kZXJHUFUuZHJhd0luZGV4ZWRJbmRpcmVjdCggYnVmZmVyLCAwICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0cGFzc0VuY29kZXJHUFUuZHJhd0luZGV4ZWQoIGluZGV4Q291bnQsIGluc3RhbmNlQ291bnQsIGZpcnN0SW5kZXgsIDAsIDAgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpbmZvLnVwZGF0ZSggb2JqZWN0LCBpbmRleENvdW50LCBpbnN0YW5jZUNvdW50ICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRjb25zdCB7IHZlcnRleENvdW50LCBpbnN0YW5jZUNvdW50LCBmaXJzdFZlcnRleCB9ID0gZHJhd1BhcmFtcztcclxuXHJcblx0XHRcdFx0Y29uc3QgaW5kaXJlY3QgPSByZW5kZXJPYmplY3QuZ2V0SW5kaXJlY3QoKTtcclxuXHJcblx0XHRcdFx0aWYgKCBpbmRpcmVjdCAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBidWZmZXIgPSB0aGlzLmdldCggaW5kaXJlY3QgKS5idWZmZXI7XHJcblxyXG5cdFx0XHRcdFx0cGFzc0VuY29kZXJHUFUuZHJhd0luZGlyZWN0KCBidWZmZXIsIDAgKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRwYXNzRW5jb2RlckdQVS5kcmF3KCB2ZXJ0ZXhDb3VudCwgaW5zdGFuY2VDb3VudCwgZmlyc3RWZXJ0ZXgsIDAgKTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpbmZvLnVwZGF0ZSggb2JqZWN0LCB2ZXJ0ZXhDb3VudCwgaW5zdGFuY2VDb3VudCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH07XHJcblxyXG5cdFx0aWYgKCByZW5kZXJPYmplY3QuY2FtZXJhLmlzQXJyYXlDYW1lcmEgJiYgcmVuZGVyT2JqZWN0LmNhbWVyYS5jYW1lcmFzLmxlbmd0aCA+IDAgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBjYW1lcmFEYXRhID0gdGhpcy5nZXQoIHJlbmRlck9iamVjdC5jYW1lcmEgKTtcclxuXHRcdFx0Y29uc3QgY2FtZXJhcyA9IHJlbmRlck9iamVjdC5jYW1lcmEuY2FtZXJhcztcclxuXHRcdFx0Y29uc3QgY2FtZXJhSW5kZXggPSByZW5kZXJPYmplY3QuZ2V0QmluZGluZ0dyb3VwKCAnY2FtZXJhSW5kZXgnICk7XHJcblxyXG5cdFx0XHRpZiAoIGNhbWVyYURhdGEuaW5kZXhlc0dQVSA9PT0gdW5kZWZpbmVkIHx8IGNhbWVyYURhdGEuaW5kZXhlc0dQVS5sZW5ndGggIT09IGNhbWVyYXMubGVuZ3RoICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBiaW5kaW5nc0RhdGEgPSB0aGlzLmdldCggY2FtZXJhSW5kZXggKTtcclxuXHRcdFx0XHRjb25zdCBpbmRleGVzR1BVID0gW107XHJcblxyXG5cdFx0XHRcdGNvbnN0IGRhdGEgPSBuZXcgVWludDMyQXJyYXkoIFsgMCwgMCwgMCwgMCBdICk7XHJcblxyXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMCwgbGVuID0gY2FtZXJhcy5sZW5ndGg7IGkgPCBsZW47IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdFx0ZGF0YVsgMCBdID0gaTtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBiaW5kR3JvdXBJbmRleCA9IHRoaXMuYmluZGluZ1V0aWxzLmNyZWF0ZUJpbmRHcm91cEluZGV4KCBkYXRhLCBiaW5kaW5nc0RhdGEubGF5b3V0ICk7XHJcblxyXG5cdFx0XHRcdFx0aW5kZXhlc0dQVS5wdXNoKCBiaW5kR3JvdXBJbmRleCApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGNhbWVyYURhdGEuaW5kZXhlc0dQVSA9IGluZGV4ZXNHUFU7IC8vIFRPRE86IENyZWF0ZSBhIGdsb2JhbCBsaWJyYXJ5IGZvciB0aGlzXHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBwaXhlbFJhdGlvID0gdGhpcy5yZW5kZXJlci5nZXRQaXhlbFJhdGlvKCk7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGxlbiA9IGNhbWVyYXMubGVuZ3RoOyBpIDwgbGVuOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRjb25zdCBzdWJDYW1lcmEgPSBjYW1lcmFzWyBpIF07XHJcblxyXG5cdFx0XHRcdGlmICggb2JqZWN0LmxheWVycy50ZXN0KCBzdWJDYW1lcmEubGF5ZXJzICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgdnAgPSBzdWJDYW1lcmEudmlld3BvcnQ7XHJcblxyXG5cdFx0XHRcdFx0cGFzc0VuY29kZXJHUFUuc2V0Vmlld3BvcnQoXHJcblx0XHRcdFx0XHRcdE1hdGguZmxvb3IoIHZwLnggKiBwaXhlbFJhdGlvICksXHJcblx0XHRcdFx0XHRcdE1hdGguZmxvb3IoIHZwLnkgKiBwaXhlbFJhdGlvICksXHJcblx0XHRcdFx0XHRcdE1hdGguZmxvb3IoIHZwLndpZHRoICogcGl4ZWxSYXRpbyApLFxyXG5cdFx0XHRcdFx0XHRNYXRoLmZsb29yKCB2cC5oZWlnaHQgKiBwaXhlbFJhdGlvICksXHJcblx0XHRcdFx0XHRcdGNvbnRleHQudmlld3BvcnRWYWx1ZS5taW5EZXB0aCxcclxuXHRcdFx0XHRcdFx0Y29udGV4dC52aWV3cG9ydFZhbHVlLm1heERlcHRoXHJcblx0XHRcdFx0XHQpO1xyXG5cclxuXHRcdFx0XHRcdHBhc3NFbmNvZGVyR1BVLnNldEJpbmRHcm91cCggY2FtZXJhSW5kZXguaW5kZXgsIGNhbWVyYURhdGEuaW5kZXhlc0dQVVsgaSBdICk7XHJcblxyXG5cdFx0XHRcdFx0ZHJhdygpO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGRyYXcoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gY2FjaGUga2V5XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYHRydWVgIGlmIHRoZSByZW5kZXIgcGlwZWxpbmUgcmVxdWlyZXMgYW4gdXBkYXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSZW5kZXJPYmplY3R9IHJlbmRlck9iamVjdCAtIFRoZSByZW5kZXIgb2JqZWN0LlxyXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHJlbmRlciBwaXBlbGluZSByZXF1aXJlcyBhbiB1cGRhdGUgb3Igbm90LlxyXG5cdCAqL1xyXG5cdG5lZWRzUmVuZGVyVXBkYXRlKCByZW5kZXJPYmplY3QgKSB7XHJcblxyXG5cdFx0Y29uc3QgZGF0YSA9IHRoaXMuZ2V0KCByZW5kZXJPYmplY3QgKTtcclxuXHJcblx0XHRjb25zdCB7IG9iamVjdCwgbWF0ZXJpYWwgfSA9IHJlbmRlck9iamVjdDtcclxuXHJcblx0XHRjb25zdCB1dGlscyA9IHRoaXMudXRpbHM7XHJcblxyXG5cdFx0Y29uc3Qgc2FtcGxlQ291bnQgPSB1dGlscy5nZXRTYW1wbGVDb3VudFJlbmRlckNvbnRleHQoIHJlbmRlck9iamVjdC5jb250ZXh0ICk7XHJcblx0XHRjb25zdCBjb2xvclNwYWNlID0gdXRpbHMuZ2V0Q3VycmVudENvbG9yU3BhY2UoIHJlbmRlck9iamVjdC5jb250ZXh0ICk7XHJcblx0XHRjb25zdCBjb2xvckZvcm1hdCA9IHV0aWxzLmdldEN1cnJlbnRDb2xvckZvcm1hdCggcmVuZGVyT2JqZWN0LmNvbnRleHQgKTtcclxuXHRcdGNvbnN0IGRlcHRoU3RlbmNpbEZvcm1hdCA9IHV0aWxzLmdldEN1cnJlbnREZXB0aFN0ZW5jaWxGb3JtYXQoIHJlbmRlck9iamVjdC5jb250ZXh0ICk7XHJcblx0XHRjb25zdCBwcmltaXRpdmVUb3BvbG9neSA9IHV0aWxzLmdldFByaW1pdGl2ZVRvcG9sb2d5KCBvYmplY3QsIG1hdGVyaWFsICk7XHJcblxyXG5cdFx0bGV0IG5lZWRzVXBkYXRlID0gZmFsc2U7XHJcblxyXG5cdFx0aWYgKCBkYXRhLm1hdGVyaWFsICE9PSBtYXRlcmlhbCB8fCBkYXRhLm1hdGVyaWFsVmVyc2lvbiAhPT0gbWF0ZXJpYWwudmVyc2lvbiB8fFxyXG5cdFx0XHRkYXRhLnRyYW5zcGFyZW50ICE9PSBtYXRlcmlhbC50cmFuc3BhcmVudCB8fCBkYXRhLmJsZW5kaW5nICE9PSBtYXRlcmlhbC5ibGVuZGluZyB8fCBkYXRhLnByZW11bHRpcGxpZWRBbHBoYSAhPT0gbWF0ZXJpYWwucHJlbXVsdGlwbGllZEFscGhhIHx8XHJcblx0XHRcdGRhdGEuYmxlbmRTcmMgIT09IG1hdGVyaWFsLmJsZW5kU3JjIHx8IGRhdGEuYmxlbmREc3QgIT09IG1hdGVyaWFsLmJsZW5kRHN0IHx8IGRhdGEuYmxlbmRFcXVhdGlvbiAhPT0gbWF0ZXJpYWwuYmxlbmRFcXVhdGlvbiB8fFxyXG5cdFx0XHRkYXRhLmJsZW5kU3JjQWxwaGEgIT09IG1hdGVyaWFsLmJsZW5kU3JjQWxwaGEgfHwgZGF0YS5ibGVuZERzdEFscGhhICE9PSBtYXRlcmlhbC5ibGVuZERzdEFscGhhIHx8IGRhdGEuYmxlbmRFcXVhdGlvbkFscGhhICE9PSBtYXRlcmlhbC5ibGVuZEVxdWF0aW9uQWxwaGEgfHxcclxuXHRcdFx0ZGF0YS5jb2xvcldyaXRlICE9PSBtYXRlcmlhbC5jb2xvcldyaXRlIHx8IGRhdGEuZGVwdGhXcml0ZSAhPT0gbWF0ZXJpYWwuZGVwdGhXcml0ZSB8fCBkYXRhLmRlcHRoVGVzdCAhPT0gbWF0ZXJpYWwuZGVwdGhUZXN0IHx8IGRhdGEuZGVwdGhGdW5jICE9PSBtYXRlcmlhbC5kZXB0aEZ1bmMgfHxcclxuXHRcdFx0ZGF0YS5zdGVuY2lsV3JpdGUgIT09IG1hdGVyaWFsLnN0ZW5jaWxXcml0ZSB8fCBkYXRhLnN0ZW5jaWxGdW5jICE9PSBtYXRlcmlhbC5zdGVuY2lsRnVuYyB8fFxyXG5cdFx0XHRkYXRhLnN0ZW5jaWxGYWlsICE9PSBtYXRlcmlhbC5zdGVuY2lsRmFpbCB8fCBkYXRhLnN0ZW5jaWxaRmFpbCAhPT0gbWF0ZXJpYWwuc3RlbmNpbFpGYWlsIHx8IGRhdGEuc3RlbmNpbFpQYXNzICE9PSBtYXRlcmlhbC5zdGVuY2lsWlBhc3MgfHxcclxuXHRcdFx0ZGF0YS5zdGVuY2lsRnVuY01hc2sgIT09IG1hdGVyaWFsLnN0ZW5jaWxGdW5jTWFzayB8fCBkYXRhLnN0ZW5jaWxXcml0ZU1hc2sgIT09IG1hdGVyaWFsLnN0ZW5jaWxXcml0ZU1hc2sgfHxcclxuXHRcdFx0ZGF0YS5zaWRlICE9PSBtYXRlcmlhbC5zaWRlIHx8IGRhdGEuYWxwaGFUb0NvdmVyYWdlICE9PSBtYXRlcmlhbC5hbHBoYVRvQ292ZXJhZ2UgfHxcclxuXHRcdFx0ZGF0YS5zYW1wbGVDb3VudCAhPT0gc2FtcGxlQ291bnQgfHwgZGF0YS5jb2xvclNwYWNlICE9PSBjb2xvclNwYWNlIHx8XHJcblx0XHRcdGRhdGEuY29sb3JGb3JtYXQgIT09IGNvbG9yRm9ybWF0IHx8IGRhdGEuZGVwdGhTdGVuY2lsRm9ybWF0ICE9PSBkZXB0aFN0ZW5jaWxGb3JtYXQgfHxcclxuXHRcdFx0ZGF0YS5wcmltaXRpdmVUb3BvbG9neSAhPT0gcHJpbWl0aXZlVG9wb2xvZ3kgfHxcclxuXHRcdFx0ZGF0YS5jbGlwcGluZ0NvbnRleHRDYWNoZUtleSAhPT0gcmVuZGVyT2JqZWN0LmNsaXBwaW5nQ29udGV4dENhY2hlS2V5XHJcblx0XHQpIHtcclxuXHJcblx0XHRcdGRhdGEubWF0ZXJpYWwgPSBtYXRlcmlhbDsgZGF0YS5tYXRlcmlhbFZlcnNpb24gPSBtYXRlcmlhbC52ZXJzaW9uO1xyXG5cdFx0XHRkYXRhLnRyYW5zcGFyZW50ID0gbWF0ZXJpYWwudHJhbnNwYXJlbnQ7IGRhdGEuYmxlbmRpbmcgPSBtYXRlcmlhbC5ibGVuZGluZzsgZGF0YS5wcmVtdWx0aXBsaWVkQWxwaGEgPSBtYXRlcmlhbC5wcmVtdWx0aXBsaWVkQWxwaGE7XHJcblx0XHRcdGRhdGEuYmxlbmRTcmMgPSBtYXRlcmlhbC5ibGVuZFNyYzsgZGF0YS5ibGVuZERzdCA9IG1hdGVyaWFsLmJsZW5kRHN0OyBkYXRhLmJsZW5kRXF1YXRpb24gPSBtYXRlcmlhbC5ibGVuZEVxdWF0aW9uO1xyXG5cdFx0XHRkYXRhLmJsZW5kU3JjQWxwaGEgPSBtYXRlcmlhbC5ibGVuZFNyY0FscGhhOyBkYXRhLmJsZW5kRHN0QWxwaGEgPSBtYXRlcmlhbC5ibGVuZERzdEFscGhhOyBkYXRhLmJsZW5kRXF1YXRpb25BbHBoYSA9IG1hdGVyaWFsLmJsZW5kRXF1YXRpb25BbHBoYTtcclxuXHRcdFx0ZGF0YS5jb2xvcldyaXRlID0gbWF0ZXJpYWwuY29sb3JXcml0ZTtcclxuXHRcdFx0ZGF0YS5kZXB0aFdyaXRlID0gbWF0ZXJpYWwuZGVwdGhXcml0ZTsgZGF0YS5kZXB0aFRlc3QgPSBtYXRlcmlhbC5kZXB0aFRlc3Q7IGRhdGEuZGVwdGhGdW5jID0gbWF0ZXJpYWwuZGVwdGhGdW5jO1xyXG5cdFx0XHRkYXRhLnN0ZW5jaWxXcml0ZSA9IG1hdGVyaWFsLnN0ZW5jaWxXcml0ZTsgZGF0YS5zdGVuY2lsRnVuYyA9IG1hdGVyaWFsLnN0ZW5jaWxGdW5jO1xyXG5cdFx0XHRkYXRhLnN0ZW5jaWxGYWlsID0gbWF0ZXJpYWwuc3RlbmNpbEZhaWw7IGRhdGEuc3RlbmNpbFpGYWlsID0gbWF0ZXJpYWwuc3RlbmNpbFpGYWlsOyBkYXRhLnN0ZW5jaWxaUGFzcyA9IG1hdGVyaWFsLnN0ZW5jaWxaUGFzcztcclxuXHRcdFx0ZGF0YS5zdGVuY2lsRnVuY01hc2sgPSBtYXRlcmlhbC5zdGVuY2lsRnVuY01hc2s7IGRhdGEuc3RlbmNpbFdyaXRlTWFzayA9IG1hdGVyaWFsLnN0ZW5jaWxXcml0ZU1hc2s7XHJcblx0XHRcdGRhdGEuc2lkZSA9IG1hdGVyaWFsLnNpZGU7IGRhdGEuYWxwaGFUb0NvdmVyYWdlID0gbWF0ZXJpYWwuYWxwaGFUb0NvdmVyYWdlO1xyXG5cdFx0XHRkYXRhLnNhbXBsZUNvdW50ID0gc2FtcGxlQ291bnQ7XHJcblx0XHRcdGRhdGEuY29sb3JTcGFjZSA9IGNvbG9yU3BhY2U7XHJcblx0XHRcdGRhdGEuY29sb3JGb3JtYXQgPSBjb2xvckZvcm1hdDtcclxuXHRcdFx0ZGF0YS5kZXB0aFN0ZW5jaWxGb3JtYXQgPSBkZXB0aFN0ZW5jaWxGb3JtYXQ7XHJcblx0XHRcdGRhdGEucHJpbWl0aXZlVG9wb2xvZ3kgPSBwcmltaXRpdmVUb3BvbG9neTtcclxuXHRcdFx0ZGF0YS5jbGlwcGluZ0NvbnRleHRDYWNoZUtleSA9IHJlbmRlck9iamVjdC5jbGlwcGluZ0NvbnRleHRDYWNoZUtleTtcclxuXHJcblx0XHRcdG5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG5lZWRzVXBkYXRlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBjYWNoZSBrZXkgdGhhdCBpcyB1c2VkIHRvIGlkZW50aWZ5IHJlbmRlciBwaXBlbGluZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JlbmRlck9iamVjdH0gcmVuZGVyT2JqZWN0IC0gVGhlIHJlbmRlciBvYmplY3QuXHJcblx0ICogQHJldHVybiB7c3RyaW5nfSBUaGUgY2FjaGUga2V5LlxyXG5cdCAqL1xyXG5cdGdldFJlbmRlckNhY2hlS2V5KCByZW5kZXJPYmplY3QgKSB7XHJcblxyXG5cdFx0Y29uc3QgeyBvYmplY3QsIG1hdGVyaWFsIH0gPSByZW5kZXJPYmplY3Q7XHJcblxyXG5cdFx0Y29uc3QgdXRpbHMgPSB0aGlzLnV0aWxzO1xyXG5cdFx0Y29uc3QgcmVuZGVyQ29udGV4dCA9IHJlbmRlck9iamVjdC5jb250ZXh0O1xyXG5cclxuXHRcdHJldHVybiBbXHJcblx0XHRcdG1hdGVyaWFsLnRyYW5zcGFyZW50LCBtYXRlcmlhbC5ibGVuZGluZywgbWF0ZXJpYWwucHJlbXVsdGlwbGllZEFscGhhLFxyXG5cdFx0XHRtYXRlcmlhbC5ibGVuZFNyYywgbWF0ZXJpYWwuYmxlbmREc3QsIG1hdGVyaWFsLmJsZW5kRXF1YXRpb24sXHJcblx0XHRcdG1hdGVyaWFsLmJsZW5kU3JjQWxwaGEsIG1hdGVyaWFsLmJsZW5kRHN0QWxwaGEsIG1hdGVyaWFsLmJsZW5kRXF1YXRpb25BbHBoYSxcclxuXHRcdFx0bWF0ZXJpYWwuY29sb3JXcml0ZSxcclxuXHRcdFx0bWF0ZXJpYWwuZGVwdGhXcml0ZSwgbWF0ZXJpYWwuZGVwdGhUZXN0LCBtYXRlcmlhbC5kZXB0aEZ1bmMsXHJcblx0XHRcdG1hdGVyaWFsLnN0ZW5jaWxXcml0ZSwgbWF0ZXJpYWwuc3RlbmNpbEZ1bmMsXHJcblx0XHRcdG1hdGVyaWFsLnN0ZW5jaWxGYWlsLCBtYXRlcmlhbC5zdGVuY2lsWkZhaWwsIG1hdGVyaWFsLnN0ZW5jaWxaUGFzcyxcclxuXHRcdFx0bWF0ZXJpYWwuc3RlbmNpbEZ1bmNNYXNrLCBtYXRlcmlhbC5zdGVuY2lsV3JpdGVNYXNrLFxyXG5cdFx0XHRtYXRlcmlhbC5zaWRlLFxyXG5cdFx0XHR1dGlscy5nZXRTYW1wbGVDb3VudFJlbmRlckNvbnRleHQoIHJlbmRlckNvbnRleHQgKSxcclxuXHRcdFx0dXRpbHMuZ2V0Q3VycmVudENvbG9yU3BhY2UoIHJlbmRlckNvbnRleHQgKSwgdXRpbHMuZ2V0Q3VycmVudENvbG9yRm9ybWF0KCByZW5kZXJDb250ZXh0ICksIHV0aWxzLmdldEN1cnJlbnREZXB0aFN0ZW5jaWxGb3JtYXQoIHJlbmRlckNvbnRleHQgKSxcclxuXHRcdFx0dXRpbHMuZ2V0UHJpbWl0aXZlVG9wb2xvZ3koIG9iamVjdCwgbWF0ZXJpYWwgKSxcclxuXHRcdFx0cmVuZGVyT2JqZWN0LmdldEdlb21ldHJ5Q2FjaGVLZXkoKSxcclxuXHRcdFx0cmVuZGVyT2JqZWN0LmNsaXBwaW5nQ29udGV4dENhY2hlS2V5XHJcblx0XHRdLmpvaW4oKTtcclxuXHJcblx0fVxyXG5cclxuXHQvLyB0ZXh0dXJlc1xyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGEgR1BVIHNhbXBsZXIgZm9yIHRoZSBnaXZlbiB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUgdG8gY3JlYXRlIHRoZSBzYW1wbGVyIGZvci5cclxuXHQgKi9cclxuXHRjcmVhdGVTYW1wbGVyKCB0ZXh0dXJlICkge1xyXG5cclxuXHRcdHRoaXMudGV4dHVyZVV0aWxzLmNyZWF0ZVNhbXBsZXIoIHRleHR1cmUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZXN0cm95cyB0aGUgR1BVIHNhbXBsZXIgZm9yIHRoZSBnaXZlbiB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUgdG8gZGVzdHJveSB0aGUgc2FtcGxlciBmb3IuXHJcblx0ICovXHJcblx0ZGVzdHJveVNhbXBsZXIoIHRleHR1cmUgKSB7XHJcblxyXG5cdFx0dGhpcy50ZXh0dXJlVXRpbHMuZGVzdHJveVNhbXBsZXIoIHRleHR1cmUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGEgZGVmYXVsdCB0ZXh0dXJlIGZvciB0aGUgZ2l2ZW4gdGV4dHVyZSB0aGF0IGNhbiBiZSB1c2VkXHJcblx0ICogYXMgYSBwbGFjZWhvbGRlciB1bnRpbCB0aGUgYWN0dWFsIHRleHR1cmUgaXMgcmVhZHkgZm9yIHVzYWdlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUgdG8gY3JlYXRlIGEgZGVmYXVsdCB0ZXh0dXJlIGZvci5cclxuXHQgKi9cclxuXHRjcmVhdGVEZWZhdWx0VGV4dHVyZSggdGV4dHVyZSApIHtcclxuXHJcblx0XHR0aGlzLnRleHR1cmVVdGlscy5jcmVhdGVEZWZhdWx0VGV4dHVyZSggdGV4dHVyZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgYSB0ZXh0dXJlIG9uIHRoZSBHUFUgZm9yIHRoZSBnaXZlbiB0ZXh0dXJlIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlLlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIHBhcmFtZXRlci5cclxuXHQgKi9cclxuXHRjcmVhdGVUZXh0dXJlKCB0ZXh0dXJlLCBvcHRpb25zICkge1xyXG5cclxuXHRcdHRoaXMudGV4dHVyZVV0aWxzLmNyZWF0ZVRleHR1cmUoIHRleHR1cmUsIG9wdGlvbnMgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGxvYWRzIHRoZSB1cGRhdGVkIHRleHR1cmUgZGF0YSB0byB0aGUgR1BVLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZVRleHR1cmUoIHRleHR1cmUsIG9wdGlvbnMgKSB7XHJcblxyXG5cdFx0dGhpcy50ZXh0dXJlVXRpbHMudXBkYXRlVGV4dHVyZSggdGV4dHVyZSwgb3B0aW9ucyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYXRlcyBtaXBtYXBzIGZvciB0aGUgZ2l2ZW4gdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlLlxyXG5cdCAqL1xyXG5cdGdlbmVyYXRlTWlwbWFwcyggdGV4dHVyZSApIHtcclxuXHJcblx0XHR0aGlzLnRleHR1cmVVdGlscy5nZW5lcmF0ZU1pcG1hcHMoIHRleHR1cmUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZXN0cm95cyB0aGUgR1BVIGRhdGEgZm9yIHRoZSBnaXZlbiB0ZXh0dXJlIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlLlxyXG5cdCAqL1xyXG5cdGRlc3Ryb3lUZXh0dXJlKCB0ZXh0dXJlICkge1xyXG5cclxuXHRcdHRoaXMudGV4dHVyZVV0aWxzLmRlc3Ryb3lUZXh0dXJlKCB0ZXh0dXJlICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0ZXh0dXJlIGRhdGEgYXMgYSB0eXBlZCBhcnJheS5cclxuXHQgKlxyXG5cdCAqIEBhc3luY1xyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlIHRvIGNvcHkuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IHggLSBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBjb3B5IG9yaWdpbi5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0geSAtIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGNvcHkgb3JpZ2luLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgY29weS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgY29weS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gZmFjZUluZGV4IC0gVGhlIGZhY2UgaW5kZXguXHJcblx0ICogQHJldHVybiB7UHJvbWlzZTxUeXBlZEFycmF5Pn0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCBhIHR5cGVkIGFycmF5IHdoZW4gdGhlIGNvcHkgb3BlcmF0aW9uIGhhcyBmaW5pc2hlZC5cclxuXHQgKi9cclxuXHRhc3luYyBjb3B5VGV4dHVyZVRvQnVmZmVyKCB0ZXh0dXJlLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmYWNlSW5kZXggKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMudGV4dHVyZVV0aWxzLmNvcHlUZXh0dXJlVG9CdWZmZXIoIHRleHR1cmUsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGZhY2VJbmRleCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEluaXRzIGEgdGltZSBzdGFtcCBxdWVyeSBmb3IgdGhlIGdpdmVuIHJlbmRlciBjb250ZXh0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSZW5kZXJDb250ZXh0fSByZW5kZXJDb250ZXh0IC0gVGhlIHJlbmRlciBjb250ZXh0LlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBkZXNjcmlwdG9yIC0gVGhlIHF1ZXJ5IGRlc2NyaXB0b3IuXHJcblx0ICovXHJcblx0aW5pdFRpbWVzdGFtcFF1ZXJ5KCByZW5kZXJDb250ZXh0LCBkZXNjcmlwdG9yICkge1xyXG5cclxuXHRcdGlmICggISB0aGlzLnRyYWNrVGltZXN0YW1wICkgcmV0dXJuO1xyXG5cclxuXHRcdGNvbnN0IHR5cGUgPSByZW5kZXJDb250ZXh0LmlzQ29tcHV0ZU5vZGUgPyAnY29tcHV0ZScgOiAncmVuZGVyJztcclxuXHJcblx0XHRpZiAoICEgdGhpcy50aW1lc3RhbXBRdWVyeVBvb2xbIHR5cGUgXSApIHtcclxuXHJcblx0XHRcdC8vIFRPRE86IFZhcmlhYmxlIG1heFF1ZXJpZXM/XHJcblx0XHRcdHRoaXMudGltZXN0YW1wUXVlcnlQb29sWyB0eXBlIF0gPSBuZXcgV2ViR1BVVGltZXN0YW1wUXVlcnlQb29sKCB0aGlzLmRldmljZSwgdHlwZSwgMjA0OCApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCB0aW1lc3RhbXBRdWVyeVBvb2wgPSB0aGlzLnRpbWVzdGFtcFF1ZXJ5UG9vbFsgdHlwZSBdO1xyXG5cclxuXHRcdGNvbnN0IGJhc2VPZmZzZXQgPSB0aW1lc3RhbXBRdWVyeVBvb2wuYWxsb2NhdGVRdWVyaWVzRm9yQ29udGV4dCggcmVuZGVyQ29udGV4dCApO1xyXG5cclxuXHRcdGRlc2NyaXB0b3IudGltZXN0YW1wV3JpdGVzID0ge1xyXG5cdFx0XHRxdWVyeVNldDogdGltZXN0YW1wUXVlcnlQb29sLnF1ZXJ5U2V0LFxyXG5cdFx0XHRiZWdpbm5pbmdPZlBhc3NXcml0ZUluZGV4OiBiYXNlT2Zmc2V0LFxyXG5cdFx0XHRlbmRPZlBhc3NXcml0ZUluZGV4OiBiYXNlT2Zmc2V0ICsgMSxcclxuXHRcdCAgfTtcclxuXHJcblx0fVxyXG5cclxuXHJcblx0Ly8gbm9kZSBidWlsZGVyXHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSBub2RlIGJ1aWxkZXIgZm9yIHRoZSBnaXZlbiByZW5kZXIgb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSZW5kZXJPYmplY3R9IG9iamVjdCAtIFRoZSByZW5kZXIgb2JqZWN0LlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEByZXR1cm4ge1dHU0xOb2RlQnVpbGRlcn0gVGhlIG5vZGUgYnVpbGRlci5cclxuXHQgKi9cclxuXHRjcmVhdGVOb2RlQnVpbGRlciggb2JqZWN0LCByZW5kZXJlciApIHtcclxuXHJcblx0XHRyZXR1cm4gbmV3IFdHU0xOb2RlQnVpbGRlciggb2JqZWN0LCByZW5kZXJlciApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vIHByb2dyYW1cclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyBhIHNoYWRlciBwcm9ncmFtIGZyb20gdGhlIGdpdmVuIHByb2dyYW1tYWJsZSBzdGFnZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UHJvZ3JhbW1hYmxlU3RhZ2V9IHByb2dyYW0gLSBUaGUgcHJvZ3JhbW1hYmxlIHN0YWdlLlxyXG5cdCAqL1xyXG5cdGNyZWF0ZVByb2dyYW0oIHByb2dyYW0gKSB7XHJcblxyXG5cdFx0Y29uc3QgcHJvZ3JhbUdQVSA9IHRoaXMuZ2V0KCBwcm9ncmFtICk7XHJcblxyXG5cdFx0cHJvZ3JhbUdQVS5tb2R1bGUgPSB7XHJcblx0XHRcdG1vZHVsZTogdGhpcy5kZXZpY2UuY3JlYXRlU2hhZGVyTW9kdWxlKCB7IGNvZGU6IHByb2dyYW0uY29kZSwgbGFiZWw6IHByb2dyYW0uc3RhZ2UgKyAoIHByb2dyYW0ubmFtZSAhPT0gJycgPyBgXyR7IHByb2dyYW0ubmFtZSB9YCA6ICcnICkgfSApLFxyXG5cdFx0XHRlbnRyeVBvaW50OiAnbWFpbidcclxuXHRcdH07XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVzdHJveXMgdGhlIHNoYWRlciBwcm9ncmFtIG9mIHRoZSBnaXZlbiBwcm9ncmFtbWFibGUgc3RhZ2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1Byb2dyYW1tYWJsZVN0YWdlfSBwcm9ncmFtIC0gVGhlIHByb2dyYW1tYWJsZSBzdGFnZS5cclxuXHQgKi9cclxuXHRkZXN0cm95UHJvZ3JhbSggcHJvZ3JhbSApIHtcclxuXHJcblx0XHR0aGlzLmRlbGV0ZSggcHJvZ3JhbSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vIHBpcGVsaW5lc1xyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGEgcmVuZGVyIHBpcGVsaW5lIGZvciB0aGUgZ2l2ZW4gcmVuZGVyIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyT2JqZWN0fSByZW5kZXJPYmplY3QgLSBUaGUgcmVuZGVyIG9iamVjdC5cclxuXHQgKiBAcGFyYW0ge0FycmF5PFByb21pc2U+fSBwcm9taXNlcyAtIEFuIGFycmF5IG9mIGNvbXBpbGF0aW9uIHByb21pc2VzIHdoaWNoIGFyZSB1c2VkIGluIGBjb21waWxlQXN5bmMoKWAuXHJcblx0ICovXHJcblx0Y3JlYXRlUmVuZGVyUGlwZWxpbmUoIHJlbmRlck9iamVjdCwgcHJvbWlzZXMgKSB7XHJcblxyXG5cdFx0dGhpcy5waXBlbGluZVV0aWxzLmNyZWF0ZVJlbmRlclBpcGVsaW5lKCByZW5kZXJPYmplY3QsIHByb21pc2VzICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyBhIGNvbXB1dGUgcGlwZWxpbmUgZm9yIHRoZSBnaXZlbiBjb21wdXRlIG5vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0NvbXB1dGVQaXBlbGluZX0gY29tcHV0ZVBpcGVsaW5lIC0gVGhlIGNvbXB1dGUgcGlwZWxpbmUuXHJcblx0ICogQHBhcmFtIHtBcnJheTxCaW5kR3JvdXA+fSBiaW5kaW5ncyAtIFRoZSBiaW5kaW5ncy5cclxuXHQgKi9cclxuXHRjcmVhdGVDb21wdXRlUGlwZWxpbmUoIGNvbXB1dGVQaXBlbGluZSwgYmluZGluZ3MgKSB7XHJcblxyXG5cdFx0dGhpcy5waXBlbGluZVV0aWxzLmNyZWF0ZUNvbXB1dGVQaXBlbGluZSggY29tcHV0ZVBpcGVsaW5lLCBiaW5kaW5ncyApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFByZXBhcmVzIHRoZSBzdGF0ZSBmb3IgZW5jb2RpbmcgcmVuZGVyIGJ1bmRsZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1JlbmRlckNvbnRleHR9IHJlbmRlckNvbnRleHQgLSBUaGUgcmVuZGVyIGNvbnRleHQuXHJcblx0ICovXHJcblx0YmVnaW5CdW5kbGUoIHJlbmRlckNvbnRleHQgKSB7XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyQ29udGV4dERhdGEgPSB0aGlzLmdldCggcmVuZGVyQ29udGV4dCApO1xyXG5cclxuXHRcdHJlbmRlckNvbnRleHREYXRhLl9jdXJyZW50UGFzcyA9IHJlbmRlckNvbnRleHREYXRhLmN1cnJlbnRQYXNzO1xyXG5cdFx0cmVuZGVyQ29udGV4dERhdGEuX2N1cnJlbnRTZXRzID0gcmVuZGVyQ29udGV4dERhdGEuY3VycmVudFNldHM7XHJcblxyXG5cdFx0cmVuZGVyQ29udGV4dERhdGEuY3VycmVudFNldHMgPSB7IGF0dHJpYnV0ZXM6IHt9LCBiaW5kaW5nR3JvdXBzOiBbXSwgcGlwZWxpbmU6IG51bGwsIGluZGV4OiBudWxsIH07XHJcblx0XHRyZW5kZXJDb250ZXh0RGF0YS5jdXJyZW50UGFzcyA9IHRoaXMucGlwZWxpbmVVdGlscy5jcmVhdGVCdW5kbGVFbmNvZGVyKCByZW5kZXJDb250ZXh0ICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWZ0ZXIgcHJvY2Vzc2luZyByZW5kZXIgYnVuZGxlcyB0aGlzIG1ldGhvZCBmaW5hbGl6ZXMgcmVsYXRlZCB3b3JrLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSZW5kZXJDb250ZXh0fSByZW5kZXJDb250ZXh0IC0gVGhlIHJlbmRlciBjb250ZXh0LlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyQnVuZGxlfSBidW5kbGUgLSBUaGUgcmVuZGVyIGJ1bmRsZS5cclxuXHQgKi9cclxuXHRmaW5pc2hCdW5kbGUoIHJlbmRlckNvbnRleHQsIGJ1bmRsZSApIHtcclxuXHJcblx0XHRjb25zdCByZW5kZXJDb250ZXh0RGF0YSA9IHRoaXMuZ2V0KCByZW5kZXJDb250ZXh0ICk7XHJcblxyXG5cdFx0Y29uc3QgYnVuZGxlRW5jb2RlciA9IHJlbmRlckNvbnRleHREYXRhLmN1cnJlbnRQYXNzO1xyXG5cdFx0Y29uc3QgYnVuZGxlR1BVID0gYnVuZGxlRW5jb2Rlci5maW5pc2goKTtcclxuXHJcblx0XHR0aGlzLmdldCggYnVuZGxlICkuYnVuZGxlR1BVID0gYnVuZGxlR1BVO1xyXG5cclxuXHRcdC8vIHJlc3RvcmUgcmVuZGVyIHBhc3Mgc3RhdGVcclxuXHJcblx0XHRyZW5kZXJDb250ZXh0RGF0YS5jdXJyZW50U2V0cyA9IHJlbmRlckNvbnRleHREYXRhLl9jdXJyZW50U2V0cztcclxuXHRcdHJlbmRlckNvbnRleHREYXRhLmN1cnJlbnRQYXNzID0gcmVuZGVyQ29udGV4dERhdGEuX2N1cnJlbnRQYXNzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFkZHMgYSByZW5kZXIgYnVuZGxlIHRvIHRoZSByZW5kZXIgY29udGV4dCBkYXRhLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtSZW5kZXJDb250ZXh0fSByZW5kZXJDb250ZXh0IC0gVGhlIHJlbmRlciBjb250ZXh0LlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyQnVuZGxlfSBidW5kbGUgLSBUaGUgcmVuZGVyIGJ1bmRsZSB0byBhZGQuXHJcblx0ICovXHJcblx0YWRkQnVuZGxlKCByZW5kZXJDb250ZXh0LCBidW5kbGUgKSB7XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyQ29udGV4dERhdGEgPSB0aGlzLmdldCggcmVuZGVyQ29udGV4dCApO1xyXG5cclxuXHRcdHJlbmRlckNvbnRleHREYXRhLnJlbmRlckJ1bmRsZXMucHVzaCggdGhpcy5nZXQoIGJ1bmRsZSApLmJ1bmRsZUdQVSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vIGJpbmRpbmdzXHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgYmluZGluZ3MgZnJvbSB0aGUgZ2l2ZW4gYmluZCBncm91cCBkZWZpbml0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCaW5kR3JvdXB9IGJpbmRHcm91cCAtIFRoZSBiaW5kIGdyb3VwLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8QmluZEdyb3VwPn0gYmluZGluZ3MgLSBBcnJheSBvZiBiaW5kIGdyb3Vwcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gY2FjaGVJbmRleCAtIFRoZSBjYWNoZSBpbmRleC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdmVyc2lvbiAtIFRoZSB2ZXJzaW9uLlxyXG5cdCAqL1xyXG5cdGNyZWF0ZUJpbmRpbmdzKCBiaW5kR3JvdXAsIGJpbmRpbmdzLCBjYWNoZUluZGV4LCB2ZXJzaW9uICkge1xyXG5cclxuXHRcdHRoaXMuYmluZGluZ1V0aWxzLmNyZWF0ZUJpbmRpbmdzKCBiaW5kR3JvdXAsIGJpbmRpbmdzLCBjYWNoZUluZGV4LCB2ZXJzaW9uICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgZ2l2ZW4gYmluZCBncm91cCBkZWZpbml0aW9uLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCaW5kR3JvdXB9IGJpbmRHcm91cCAtIFRoZSBiaW5kIGdyb3VwLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8QmluZEdyb3VwPn0gYmluZGluZ3MgLSBBcnJheSBvZiBiaW5kIGdyb3Vwcy5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gY2FjaGVJbmRleCAtIFRoZSBjYWNoZSBpbmRleC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gdmVyc2lvbiAtIFRoZSB2ZXJzaW9uLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZUJpbmRpbmdzKCBiaW5kR3JvdXAsIGJpbmRpbmdzLCBjYWNoZUluZGV4LCB2ZXJzaW9uICkge1xyXG5cclxuXHRcdHRoaXMuYmluZGluZ1V0aWxzLmNyZWF0ZUJpbmRpbmdzKCBiaW5kR3JvdXAsIGJpbmRpbmdzLCBjYWNoZUluZGV4LCB2ZXJzaW9uICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyBhIGJ1ZmZlciBiaW5kaW5nLlxyXG5cdCAqXHJcblx0ICogIEBwYXJhbSB7QnVmZmVyfSBiaW5kaW5nIC0gVGhlIGJ1ZmZlciBiaW5kaW5nIHRvIHVwZGF0ZS5cclxuXHQgKi9cclxuXHR1cGRhdGVCaW5kaW5nKCBiaW5kaW5nICkge1xyXG5cclxuXHRcdHRoaXMuYmluZGluZ1V0aWxzLnVwZGF0ZUJpbmRpbmcoIGJpbmRpbmcgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvLyBhdHRyaWJ1dGVzXHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgdGhlIGJ1ZmZlciBvZiBhbiBpbmRleGVkIHNoYWRlciBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0J1ZmZlckF0dHJpYnV0ZX0gYXR0cmlidXRlIC0gVGhlIGluZGV4ZWQgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKi9cclxuXHRjcmVhdGVJbmRleEF0dHJpYnV0ZSggYXR0cmlidXRlICkge1xyXG5cclxuXHRcdHRoaXMuYXR0cmlidXRlVXRpbHMuY3JlYXRlQXR0cmlidXRlKCBhdHRyaWJ1dGUsIEdQVUJ1ZmZlclVzYWdlLklOREVYIHwgR1BVQnVmZmVyVXNhZ2UuQ09QWV9TUkMgfCBHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgdGhlIEdQVSBidWZmZXIgb2YgYSBzaGFkZXIgYXR0cmlidXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCdWZmZXJBdHRyaWJ1dGV9IGF0dHJpYnV0ZSAtIFRoZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqL1xyXG5cdGNyZWF0ZUF0dHJpYnV0ZSggYXR0cmlidXRlICkge1xyXG5cclxuXHRcdHRoaXMuYXR0cmlidXRlVXRpbHMuY3JlYXRlQXR0cmlidXRlKCBhdHRyaWJ1dGUsIEdQVUJ1ZmZlclVzYWdlLlZFUlRFWCB8IEdQVUJ1ZmZlclVzYWdlLkNPUFlfU1JDIHwgR1BVQnVmZmVyVXNhZ2UuQ09QWV9EU1QgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIHRoZSBHUFUgYnVmZmVyIG9mIGEgc3RvcmFnZSBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0J1ZmZlckF0dHJpYnV0ZX0gYXR0cmlidXRlIC0gVGhlIGJ1ZmZlciBhdHRyaWJ1dGUuXHJcblx0ICovXHJcblx0Y3JlYXRlU3RvcmFnZUF0dHJpYnV0ZSggYXR0cmlidXRlICkge1xyXG5cclxuXHRcdHRoaXMuYXR0cmlidXRlVXRpbHMuY3JlYXRlQXR0cmlidXRlKCBhdHRyaWJ1dGUsIEdQVUJ1ZmZlclVzYWdlLlNUT1JBR0UgfCBHUFVCdWZmZXJVc2FnZS5WRVJURVggfCBHUFVCdWZmZXJVc2FnZS5DT1BZX1NSQyB8IEdQVUJ1ZmZlclVzYWdlLkNPUFlfRFNUICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyB0aGUgR1BVIGJ1ZmZlciBvZiBhbiBpbmRpcmVjdCBzdG9yYWdlIGF0dHJpYnV0ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QnVmZmVyQXR0cmlidXRlfSBhdHRyaWJ1dGUgLSBUaGUgYnVmZmVyIGF0dHJpYnV0ZS5cclxuXHQgKi9cclxuXHRjcmVhdGVJbmRpcmVjdFN0b3JhZ2VBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApIHtcclxuXHJcblx0XHR0aGlzLmF0dHJpYnV0ZVV0aWxzLmNyZWF0ZUF0dHJpYnV0ZSggYXR0cmlidXRlLCBHUFVCdWZmZXJVc2FnZS5TVE9SQUdFIHwgR1BVQnVmZmVyVXNhZ2UuSU5ESVJFQ1QgfCBHUFVCdWZmZXJVc2FnZS5DT1BZX1NSQyB8IEdQVUJ1ZmZlclVzYWdlLkNPUFlfRFNUICk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgR1BVIGJ1ZmZlciBvZiBhIHNoYWRlciBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0J1ZmZlckF0dHJpYnV0ZX0gYXR0cmlidXRlIC0gVGhlIGJ1ZmZlciBhdHRyaWJ1dGUgdG8gdXBkYXRlLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZUF0dHJpYnV0ZSggYXR0cmlidXRlICkge1xyXG5cclxuXHRcdHRoaXMuYXR0cmlidXRlVXRpbHMudXBkYXRlQXR0cmlidXRlKCBhdHRyaWJ1dGUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZXN0cm95cyB0aGUgR1BVIGJ1ZmZlciBvZiBhIHNoYWRlciBhdHRyaWJ1dGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0J1ZmZlckF0dHJpYnV0ZX0gYXR0cmlidXRlIC0gVGhlIGJ1ZmZlciBhdHRyaWJ1dGUgdG8gZGVzdHJveS5cclxuXHQgKi9cclxuXHRkZXN0cm95QXR0cmlidXRlKCBhdHRyaWJ1dGUgKSB7XHJcblxyXG5cdFx0dGhpcy5hdHRyaWJ1dGVVdGlscy5kZXN0cm95QXR0cmlidXRlKCBhdHRyaWJ1dGUgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvLyBjYW52YXNcclxuXHJcblx0LyoqXHJcblx0ICogVHJpZ2dlcnMgYW4gdXBkYXRlIG9mIHRoZSBkZWZhdWx0IHJlbmRlciBwYXNzIGRlc2NyaXB0b3IuXHJcblx0ICovXHJcblx0dXBkYXRlU2l6ZSgpIHtcclxuXHJcblx0XHR0aGlzLmNvbG9yQnVmZmVyID0gdGhpcy50ZXh0dXJlVXRpbHMuZ2V0Q29sb3JCdWZmZXIoKTtcclxuXHRcdHRoaXMuZGVmYXVsdFJlbmRlclBhc3NkZXNjcmlwdG9yID0gbnVsbDtcclxuXHJcblx0fVxyXG5cclxuXHQvLyB1dGlscyBwdWJsaWNcclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgbWF4aW11bSBhbmlzb3Ryb3B5IHRleHR1cmUgZmlsdGVyaW5nIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHJldHVybiB7bnVtYmVyfSBUaGUgbWF4aW11bSBhbmlzb3Ryb3B5IHRleHR1cmUgZmlsdGVyaW5nIHZhbHVlLlxyXG5cdCAqL1xyXG5cdGdldE1heEFuaXNvdHJvcHkoKSB7XHJcblxyXG5cdFx0cmV0dXJuIDE2O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgIGJ5IHRoZSBiYWNrZW5kLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgZmVhdHVyZSdzIG5hbWUuXHJcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgb3Igbm90LlxyXG5cdCAqL1xyXG5cdGhhc0ZlYXR1cmUoIG5hbWUgKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZGV2aWNlLmZlYXR1cmVzLmhhcyggbmFtZSApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvcGllcyBkYXRhIG9mIHRoZSBnaXZlbiBzb3VyY2UgdGV4dHVyZSB0byB0aGUgZ2l2ZW4gZGVzdGluYXRpb24gdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gc3JjVGV4dHVyZSAtIFRoZSBzb3VyY2UgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IGRzdFRleHR1cmUgLSBUaGUgZGVzdGluYXRpb24gdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0gez8oQm94M3xCb3gyKX0gW3NyY1JlZ2lvbj1udWxsXSAtIFRoZSByZWdpb24gb2YgdGhlIHNvdXJjZSB0ZXh0dXJlIHRvIGNvcHkuXHJcblx0ICogQHBhcmFtIHs/KFZlY3RvcjJ8VmVjdG9yMyl9IFtkc3RQb3NpdGlvbj1udWxsXSAtIFRoZSBkZXN0aW5hdGlvbiBwb3NpdGlvbiBvZiB0aGUgY29weS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3NyY0xldmVsPTBdIC0gVGhlIG1pcG1hcCBsZXZlbCB0byBjb3B5LlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZHN0TGV2ZWw9MF0gLSBUaGUgZGVzdGluYXRpb24gbWlwIGxldmVsIHRvIGNvcHkgdG8uXHJcblx0ICovXHJcblx0Y29weVRleHR1cmVUb1RleHR1cmUoIHNyY1RleHR1cmUsIGRzdFRleHR1cmUsIHNyY1JlZ2lvbiA9IG51bGwsIGRzdFBvc2l0aW9uID0gbnVsbCwgc3JjTGV2ZWwgPSAwLCBkc3RMZXZlbCA9IDAgKSB7XHJcblxyXG5cdFx0bGV0IGRzdFggPSAwO1xyXG5cdFx0bGV0IGRzdFkgPSAwO1xyXG5cdFx0bGV0IGRzdFogPSAwO1xyXG5cclxuXHRcdGxldCBzcmNYID0gMDtcclxuXHRcdGxldCBzcmNZID0gMDtcclxuXHRcdGxldCBzcmNaID0gMDtcclxuXHJcblx0XHRsZXQgc3JjV2lkdGggPSBzcmNUZXh0dXJlLmltYWdlLndpZHRoO1xyXG5cdFx0bGV0IHNyY0hlaWdodCA9IHNyY1RleHR1cmUuaW1hZ2UuaGVpZ2h0O1xyXG5cdFx0bGV0IHNyY0RlcHRoID0gMTtcclxuXHJcblxyXG5cdFx0aWYgKCBzcmNSZWdpb24gIT09IG51bGwgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHNyY1JlZ2lvbi5pc0JveDMgPT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdHNyY1ggPSBzcmNSZWdpb24ubWluLng7XHJcblx0XHRcdFx0c3JjWSA9IHNyY1JlZ2lvbi5taW4ueTtcclxuXHRcdFx0XHRzcmNaID0gc3JjUmVnaW9uLm1pbi56O1xyXG5cdFx0XHRcdHNyY1dpZHRoID0gc3JjUmVnaW9uLm1heC54IC0gc3JjUmVnaW9uLm1pbi54O1xyXG5cdFx0XHRcdHNyY0hlaWdodCA9IHNyY1JlZ2lvbi5tYXgueSAtIHNyY1JlZ2lvbi5taW4ueTtcclxuXHRcdFx0XHRzcmNEZXB0aCA9IHNyY1JlZ2lvbi5tYXgueiAtIHNyY1JlZ2lvbi5taW4uejtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdC8vIEFzc3VtZSBpdCdzIGEgQm94MlxyXG5cdFx0XHRcdHNyY1ggPSBzcmNSZWdpb24ubWluLng7XHJcblx0XHRcdFx0c3JjWSA9IHNyY1JlZ2lvbi5taW4ueTtcclxuXHRcdFx0XHRzcmNXaWR0aCA9IHNyY1JlZ2lvbi5tYXgueCAtIHNyY1JlZ2lvbi5taW4ueDtcclxuXHRcdFx0XHRzcmNIZWlnaHQgPSBzcmNSZWdpb24ubWF4LnkgLSBzcmNSZWdpb24ubWluLnk7XHJcblx0XHRcdFx0c3JjRGVwdGggPSAxO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblxyXG5cdFx0aWYgKCBkc3RQb3NpdGlvbiAhPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdGRzdFggPSBkc3RQb3NpdGlvbi54O1xyXG5cdFx0XHRkc3RZID0gZHN0UG9zaXRpb24ueTtcclxuXHRcdFx0ZHN0WiA9IGRzdFBvc2l0aW9uLnogfHwgMDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgZW5jb2RlciA9IHRoaXMuZGV2aWNlLmNyZWF0ZUNvbW1hbmRFbmNvZGVyKCB7IGxhYmVsOiAnY29weVRleHR1cmVUb1RleHR1cmVfJyArIHNyY1RleHR1cmUuaWQgKyAnXycgKyBkc3RUZXh0dXJlLmlkIH0gKTtcclxuXHJcblx0XHRjb25zdCBzb3VyY2VHUFUgPSB0aGlzLmdldCggc3JjVGV4dHVyZSApLnRleHR1cmU7XHJcblx0XHRjb25zdCBkZXN0aW5hdGlvbkdQVSA9IHRoaXMuZ2V0KCBkc3RUZXh0dXJlICkudGV4dHVyZTtcclxuXHJcblx0XHRlbmNvZGVyLmNvcHlUZXh0dXJlVG9UZXh0dXJlKFxyXG5cdFx0XHR7XHJcblx0XHRcdFx0dGV4dHVyZTogc291cmNlR1BVLFxyXG5cdFx0XHRcdG1pcExldmVsOiBzcmNMZXZlbCxcclxuXHRcdFx0XHRvcmlnaW46IHsgeDogc3JjWCwgeTogc3JjWSwgejogc3JjWiB9XHJcblx0XHRcdH0sXHJcblx0XHRcdHtcclxuXHRcdFx0XHR0ZXh0dXJlOiBkZXN0aW5hdGlvbkdQVSxcclxuXHRcdFx0XHRtaXBMZXZlbDogZHN0TGV2ZWwsXHJcblx0XHRcdFx0b3JpZ2luOiB7IHg6IGRzdFgsIHk6IGRzdFksIHo6IGRzdFogfVxyXG5cdFx0XHR9LFxyXG5cdFx0XHRbXHJcblx0XHRcdFx0c3JjV2lkdGgsXHJcblx0XHRcdFx0c3JjSGVpZ2h0LFxyXG5cdFx0XHRcdHNyY0RlcHRoXHJcblx0XHRcdF1cclxuXHRcdCk7XHJcblxyXG5cdFx0dGhpcy5kZXZpY2UucXVldWUuc3VibWl0KCBbIGVuY29kZXIuZmluaXNoKCkgXSApO1xyXG5cclxuXHRcdGlmICggZHN0TGV2ZWwgPT09IDAgJiYgZHN0VGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgKSB7XHJcblxyXG5cdFx0XHR0aGlzLnRleHR1cmVVdGlscy5nZW5lcmF0ZU1pcG1hcHMoIGRzdFRleHR1cmUgKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29waWVzIHRoZSBjdXJyZW50IGJvdW5kIGZyYW1lYnVmZmVyIHRvIHRoZSBnaXZlbiB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtUZXh0dXJlfSB0ZXh0dXJlIC0gVGhlIGRlc3RpbmF0aW9uIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtSZW5kZXJDb250ZXh0fSByZW5kZXJDb250ZXh0IC0gVGhlIHJlbmRlciBjb250ZXh0LlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yNH0gcmVjdGFuZ2xlIC0gQSBmb3VyIGRpbWVuc2lvbmFsIHZlY3RvciBkZWZpbmluZyB0aGUgb3JpZ2luIGFuZCBkaW1lbnNpb24gb2YgdGhlIGNvcHkuXHJcblx0ICovXHJcblx0Y29weUZyYW1lYnVmZmVyVG9UZXh0dXJlKCB0ZXh0dXJlLCByZW5kZXJDb250ZXh0LCByZWN0YW5nbGUgKSB7XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyQ29udGV4dERhdGEgPSB0aGlzLmdldCggcmVuZGVyQ29udGV4dCApO1xyXG5cclxuXHRcdGxldCBzb3VyY2VHUFUgPSBudWxsO1xyXG5cclxuXHRcdGlmICggcmVuZGVyQ29udGV4dC5yZW5kZXJUYXJnZXQgKSB7XHJcblxyXG5cdFx0XHRpZiAoIHRleHR1cmUuaXNEZXB0aFRleHR1cmUgKSB7XHJcblxyXG5cdFx0XHRcdHNvdXJjZUdQVSA9IHRoaXMuZ2V0KCByZW5kZXJDb250ZXh0LmRlcHRoVGV4dHVyZSApLnRleHR1cmU7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRzb3VyY2VHUFUgPSB0aGlzLmdldCggcmVuZGVyQ29udGV4dC50ZXh0dXJlc1sgMCBdICkudGV4dHVyZTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0aWYgKCB0ZXh0dXJlLmlzRGVwdGhUZXh0dXJlICkge1xyXG5cclxuXHRcdFx0XHRzb3VyY2VHUFUgPSB0aGlzLnRleHR1cmVVdGlscy5nZXREZXB0aEJ1ZmZlciggcmVuZGVyQ29udGV4dC5kZXB0aCwgcmVuZGVyQ29udGV4dC5zdGVuY2lsICk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRzb3VyY2VHUFUgPSB0aGlzLmNvbnRleHQuZ2V0Q3VycmVudFRleHR1cmUoKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgZGVzdGluYXRpb25HUFUgPSB0aGlzLmdldCggdGV4dHVyZSApLnRleHR1cmU7XHJcblxyXG5cdFx0aWYgKCBzb3VyY2VHUFUuZm9ybWF0ICE9PSBkZXN0aW5hdGlvbkdQVS5mb3JtYXQgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnV2ViR1BVQmFja2VuZDogY29weUZyYW1lYnVmZmVyVG9UZXh0dXJlOiBTb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGZvcm1hdHMgZG8gbm90IG1hdGNoLicsIHNvdXJjZUdQVS5mb3JtYXQsIGRlc3RpbmF0aW9uR1BVLmZvcm1hdCApO1xyXG5cclxuXHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRsZXQgZW5jb2RlcjtcclxuXHJcblx0XHRpZiAoIHJlbmRlckNvbnRleHREYXRhLmN1cnJlbnRQYXNzICkge1xyXG5cclxuXHRcdFx0cmVuZGVyQ29udGV4dERhdGEuY3VycmVudFBhc3MuZW5kKCk7XHJcblxyXG5cdFx0XHRlbmNvZGVyID0gcmVuZGVyQ29udGV4dERhdGEuZW5jb2RlcjtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0ZW5jb2RlciA9IHRoaXMuZGV2aWNlLmNyZWF0ZUNvbW1hbmRFbmNvZGVyKCB7IGxhYmVsOiAnY29weUZyYW1lYnVmZmVyVG9UZXh0dXJlXycgKyB0ZXh0dXJlLmlkIH0gKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0ZW5jb2Rlci5jb3B5VGV4dHVyZVRvVGV4dHVyZShcclxuXHRcdFx0e1xyXG5cdFx0XHRcdHRleHR1cmU6IHNvdXJjZUdQVSxcclxuXHRcdFx0XHRvcmlnaW46IFsgcmVjdGFuZ2xlLngsIHJlY3RhbmdsZS55LCAwIF0sXHJcblx0XHRcdH0sXHJcblx0XHRcdHtcclxuXHRcdFx0XHR0ZXh0dXJlOiBkZXN0aW5hdGlvbkdQVVxyXG5cdFx0XHR9LFxyXG5cdFx0XHRbXHJcblx0XHRcdFx0cmVjdGFuZ2xlLnosXHJcblx0XHRcdFx0cmVjdGFuZ2xlLndcclxuXHRcdFx0XVxyXG5cdFx0KTtcclxuXHJcblx0XHRpZiAoIHRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzICkgdGhpcy50ZXh0dXJlVXRpbHMuZ2VuZXJhdGVNaXBtYXBzKCB0ZXh0dXJlICk7XHJcblxyXG5cdFx0aWYgKCByZW5kZXJDb250ZXh0RGF0YS5jdXJyZW50UGFzcyApIHtcclxuXHJcblx0XHRcdGNvbnN0IHsgZGVzY3JpcHRvciB9ID0gcmVuZGVyQ29udGV4dERhdGE7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLmNvbG9yQXR0YWNobWVudHMubGVuZ3RoOyBpICsrICkge1xyXG5cclxuXHRcdFx0XHRkZXNjcmlwdG9yLmNvbG9yQXR0YWNobWVudHNbIGkgXS5sb2FkT3AgPSBHUFVMb2FkT3AuTG9hZDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggcmVuZGVyQ29udGV4dC5kZXB0aCApIGRlc2NyaXB0b3IuZGVwdGhTdGVuY2lsQXR0YWNobWVudC5kZXB0aExvYWRPcCA9IEdQVUxvYWRPcC5Mb2FkO1xyXG5cdFx0XHRpZiAoIHJlbmRlckNvbnRleHQuc3RlbmNpbCApIGRlc2NyaXB0b3IuZGVwdGhTdGVuY2lsQXR0YWNobWVudC5zdGVuY2lsTG9hZE9wID0gR1BVTG9hZE9wLkxvYWQ7XHJcblxyXG5cdFx0XHRyZW5kZXJDb250ZXh0RGF0YS5jdXJyZW50UGFzcyA9IGVuY29kZXIuYmVnaW5SZW5kZXJQYXNzKCBkZXNjcmlwdG9yICk7XHJcblx0XHRcdHJlbmRlckNvbnRleHREYXRhLmN1cnJlbnRTZXRzID0geyBhdHRyaWJ1dGVzOiB7fSwgYmluZGluZ0dyb3VwczogW10sIHBpcGVsaW5lOiBudWxsLCBpbmRleDogbnVsbCB9O1xyXG5cclxuXHRcdFx0aWYgKCByZW5kZXJDb250ZXh0LnZpZXdwb3J0ICkge1xyXG5cclxuXHRcdFx0XHR0aGlzLnVwZGF0ZVZpZXdwb3J0KCByZW5kZXJDb250ZXh0ICk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHJlbmRlckNvbnRleHQuc2Npc3NvciApIHtcclxuXHJcblx0XHRcdFx0Y29uc3QgeyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH0gPSByZW5kZXJDb250ZXh0LnNjaXNzb3JWYWx1ZTtcclxuXHJcblx0XHRcdFx0cmVuZGVyQ29udGV4dERhdGEuY3VycmVudFBhc3Muc2V0U2Npc3NvclJlY3QoIHgsIHksIHdpZHRoLCBoZWlnaHQgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGhpcy5kZXZpY2UucXVldWUuc3VibWl0KCBbIGVuY29kZXIuZmluaXNoKCkgXSApO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFdlYkdQVUJhY2tlbmQ7XHJcbiIsImltcG9ydCB7IFNwb3RMaWdodCB9IGZyb20gJy4uL1Nwb3RMaWdodC5qcyc7XHJcblxyXG4vKipcclxuICogQSBJRVMgdmVyc2lvbiBvZiB7QGxpbmsgU3BvdExpZ2h0fS4gQ2FuIG9ubHkgYmUgdXNlZCB3aXRoIHtAbGluayBXZWJHUFVSZW5kZXJlcn0uXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBTcG90TGlnaHRcclxuICovXHJcbmNsYXNzIElFU1Nwb3RMaWdodCBleHRlbmRzIFNwb3RMaWdodCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgSUVTIHNwb3QgbGlnaHQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0geyhudW1iZXJ8Q29sb3J8c3RyaW5nKX0gW2NvbG9yPTB4ZmZmZmZmXSAtIFRoZSBsaWdodCdzIGNvbG9yLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbaW50ZW5zaXR5PTFdIC0gVGhlIGxpZ2h0J3Mgc3RyZW5ndGgvaW50ZW5zaXR5IG1lYXN1cmVkIGluIGNhbmRlbGEgKGNkKS5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2Rpc3RhbmNlPTBdIC0gTWF4aW11bSByYW5nZSBvZiB0aGUgbGlnaHQuIGAwYCBtZWFucyBubyBsaW1pdC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2FuZ2xlPU1hdGguUEkvM10gLSBNYXhpbXVtIGFuZ2xlIG9mIGxpZ2h0IGRpc3BlcnNpb24gZnJvbSBpdHMgZGlyZWN0aW9uIHdob3NlIHVwcGVyIGJvdW5kIGlzIGBNYXRoLlBJLzJgLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbcGVudW1icmE9MF0gLSBQZXJjZW50IG9mIHRoZSBzcG90bGlnaHQgY29uZSB0aGF0IGlzIGF0dGVudWF0ZWQgZHVlIHRvIHBlbnVtYnJhLiBWYWx1ZSByYW5nZSBpcyBgWzAsMV1gLlxyXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbZGVjYXk9Ml0gLSBUaGUgYW1vdW50IHRoZSBsaWdodCBkaW1zIGFsb25nIHRoZSBkaXN0YW5jZSBvZiB0aGUgbGlnaHQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIGNvbG9yLCBpbnRlbnNpdHksIGRpc3RhbmNlLCBhbmdsZSwgcGVudW1icmEsIGRlY2F5ICkge1xyXG5cclxuXHRcdHN1cGVyKCBjb2xvciwgaW50ZW5zaXR5LCBkaXN0YW5jZSwgYW5nbGUsIHBlbnVtYnJhLCBkZWNheSApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVE9ET1xyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHs/VGV4dHVyZX1cclxuXHRcdCAqIEBkZWZhdWx0IG51bGxcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pZXNNYXAgPSBudWxsO1xyXG5cclxuXHR9XHJcblxyXG5cdGNvcHkoIHNvdXJjZSwgcmVjdXJzaXZlICkge1xyXG5cclxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSwgcmVjdXJzaXZlICk7XHJcblxyXG5cdFx0dGhpcy5pZXNNYXAgPSBzb3VyY2UuaWVzTWFwO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBJRVNTcG90TGlnaHQ7XHJcbiIsImltcG9ydCBOb2RlTGlicmFyeSBmcm9tICcuLi8uLi9jb21tb24vbm9kZXMvTm9kZUxpYnJhcnkuanMnO1xyXG5cclxuLy8gTGlnaHRzXHJcbmltcG9ydCB7IFBvaW50TGlnaHQgfSBmcm9tICcuLi8uLi8uLi9saWdodHMvUG9pbnRMaWdodC5qcyc7XHJcbmltcG9ydCB7IERpcmVjdGlvbmFsTGlnaHQgfSBmcm9tICcuLi8uLi8uLi9saWdodHMvRGlyZWN0aW9uYWxMaWdodC5qcyc7XHJcbmltcG9ydCB7IFJlY3RBcmVhTGlnaHQgfSBmcm9tICcuLi8uLi8uLi9saWdodHMvUmVjdEFyZWFMaWdodC5qcyc7XHJcbmltcG9ydCB7IFNwb3RMaWdodCB9IGZyb20gJy4uLy4uLy4uL2xpZ2h0cy9TcG90TGlnaHQuanMnO1xyXG5pbXBvcnQgeyBBbWJpZW50TGlnaHQgfSBmcm9tICcuLi8uLi8uLi9saWdodHMvQW1iaWVudExpZ2h0LmpzJztcclxuaW1wb3J0IHsgSGVtaXNwaGVyZUxpZ2h0IH0gZnJvbSAnLi4vLi4vLi4vbGlnaHRzL0hlbWlzcGhlcmVMaWdodC5qcyc7XHJcbmltcG9ydCB7IExpZ2h0UHJvYmUgfSBmcm9tICcuLi8uLi8uLi9saWdodHMvTGlnaHRQcm9iZS5qcyc7XHJcbmltcG9ydCBJRVNTcG90TGlnaHQgZnJvbSAnLi4vLi4vLi4vbGlnaHRzL3dlYmdwdS9JRVNTcG90TGlnaHQuanMnO1xyXG5pbXBvcnQge1xyXG5cdFBvaW50TGlnaHROb2RlLFxyXG5cdERpcmVjdGlvbmFsTGlnaHROb2RlLFxyXG5cdFJlY3RBcmVhTGlnaHROb2RlLFxyXG5cdFNwb3RMaWdodE5vZGUsXHJcblx0QW1iaWVudExpZ2h0Tm9kZSxcclxuXHRIZW1pc3BoZXJlTGlnaHROb2RlLFxyXG5cdExpZ2h0UHJvYmVOb2RlLFxyXG5cdElFU1Nwb3RMaWdodE5vZGVcclxufSBmcm9tICcuLi8uLi8uLi9ub2Rlcy9Ob2Rlcy5qcyc7XHJcblxyXG4vLyBUb25lIE1hcHBpbmdcclxuaW1wb3J0IHsgTGluZWFyVG9uZU1hcHBpbmcsIFJlaW5oYXJkVG9uZU1hcHBpbmcsIENpbmVvblRvbmVNYXBwaW5nLCBBQ0VTRmlsbWljVG9uZU1hcHBpbmcsIEFnWFRvbmVNYXBwaW5nLCBOZXV0cmFsVG9uZU1hcHBpbmcgfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMuanMnO1xyXG5pbXBvcnQgeyBsaW5lYXJUb25lTWFwcGluZywgcmVpbmhhcmRUb25lTWFwcGluZywgY2luZW9uVG9uZU1hcHBpbmcsIGFjZXNGaWxtaWNUb25lTWFwcGluZywgYWd4VG9uZU1hcHBpbmcsIG5ldXRyYWxUb25lTWFwcGluZyB9IGZyb20gJy4uLy4uLy4uL25vZGVzL2Rpc3BsYXkvVG9uZU1hcHBpbmdGdW5jdGlvbnMuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgdmVyc2lvbiBvZiBhIG5vZGUgbGlicmFyeSByZXByZXNlbnRzIGEgYmFzaWMgdmVyc2lvblxyXG4gKiBqdXN0IGZvY3VzaW5nIG9uIGxpZ2h0cyBhbmQgdG9uZSBtYXBwaW5nIHRlY2huaXF1ZXMuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBhdWdtZW50cyBOb2RlTGlicmFyeVxyXG4gKi9cclxuY2xhc3MgQmFzaWNOb2RlTGlicmFyeSBleHRlbmRzIE5vZGVMaWJyYXJ5IHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBiYXNpYyBub2RlIGxpYnJhcnkuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHR0aGlzLmFkZExpZ2h0KCBQb2ludExpZ2h0Tm9kZSwgUG9pbnRMaWdodCApO1xyXG5cdFx0dGhpcy5hZGRMaWdodCggRGlyZWN0aW9uYWxMaWdodE5vZGUsIERpcmVjdGlvbmFsTGlnaHQgKTtcclxuXHRcdHRoaXMuYWRkTGlnaHQoIFJlY3RBcmVhTGlnaHROb2RlLCBSZWN0QXJlYUxpZ2h0ICk7XHJcblx0XHR0aGlzLmFkZExpZ2h0KCBTcG90TGlnaHROb2RlLCBTcG90TGlnaHQgKTtcclxuXHRcdHRoaXMuYWRkTGlnaHQoIEFtYmllbnRMaWdodE5vZGUsIEFtYmllbnRMaWdodCApO1xyXG5cdFx0dGhpcy5hZGRMaWdodCggSGVtaXNwaGVyZUxpZ2h0Tm9kZSwgSGVtaXNwaGVyZUxpZ2h0ICk7XHJcblx0XHR0aGlzLmFkZExpZ2h0KCBMaWdodFByb2JlTm9kZSwgTGlnaHRQcm9iZSApO1xyXG5cdFx0dGhpcy5hZGRMaWdodCggSUVTU3BvdExpZ2h0Tm9kZSwgSUVTU3BvdExpZ2h0ICk7XHJcblxyXG5cdFx0dGhpcy5hZGRUb25lTWFwcGluZyggbGluZWFyVG9uZU1hcHBpbmcsIExpbmVhclRvbmVNYXBwaW5nICk7XHJcblx0XHR0aGlzLmFkZFRvbmVNYXBwaW5nKCByZWluaGFyZFRvbmVNYXBwaW5nLCBSZWluaGFyZFRvbmVNYXBwaW5nICk7XHJcblx0XHR0aGlzLmFkZFRvbmVNYXBwaW5nKCBjaW5lb25Ub25lTWFwcGluZywgQ2luZW9uVG9uZU1hcHBpbmcgKTtcclxuXHRcdHRoaXMuYWRkVG9uZU1hcHBpbmcoIGFjZXNGaWxtaWNUb25lTWFwcGluZywgQUNFU0ZpbG1pY1RvbmVNYXBwaW5nICk7XHJcblx0XHR0aGlzLmFkZFRvbmVNYXBwaW5nKCBhZ3hUb25lTWFwcGluZywgQWdYVG9uZU1hcHBpbmcgKTtcclxuXHRcdHRoaXMuYWRkVG9uZU1hcHBpbmcoIG5ldXRyYWxUb25lTWFwcGluZywgTmV1dHJhbFRvbmVNYXBwaW5nICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEJhc2ljTm9kZUxpYnJhcnk7XHJcbiIsImltcG9ydCBSZW5kZXJlciBmcm9tICcuLi9jb21tb24vUmVuZGVyZXIuanMnO1xyXG5pbXBvcnQgV2ViR0xCYWNrZW5kIGZyb20gJy4uL3dlYmdsLWZhbGxiYWNrL1dlYkdMQmFja2VuZC5qcyc7XHJcbmltcG9ydCBXZWJHUFVCYWNrZW5kIGZyb20gJy4vV2ViR1BVQmFja2VuZC5qcyc7XHJcbmltcG9ydCBCYXNpY05vZGVMaWJyYXJ5IGZyb20gJy4vbm9kZXMvQmFzaWNOb2RlTGlicmFyeS5qcyc7XHJcblxyXG4vKipcclxuICogVGhpcyBhbHRlcm5hdGl2ZSB2ZXJzaW9uIG9mIHtAbGluayBXZWJHUFVSZW5kZXJlcn0gb25seSBzdXBwb3J0cyBub2RlIG1hdGVyaWFscy5cclxuICogU28gY2xhc3NlcyBsaWtlIGBNZXNoQmFzaWNNYXRlcmlhbGAgYXJlIG5vdCBjb21wYXRpYmxlLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAYXVnbWVudHMgUmVuZGVyZXJcclxuICovXHJcbmNsYXNzIFdlYkdQVVJlbmRlcmVyIGV4dGVuZHMgUmVuZGVyZXIge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IFdlYkdQVSByZW5kZXJlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7V2ViR1BVUmVuZGVyZXJ+T3B0aW9uc30gW3BhcmFtZXRlcnNdIC0gVGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBwYXJhbWV0ZXJzID0ge30gKSB7XHJcblxyXG5cdFx0bGV0IEJhY2tlbmRDbGFzcztcclxuXHJcblx0XHRpZiAoIHBhcmFtZXRlcnMuZm9yY2VXZWJHTCApIHtcclxuXHJcblx0XHRcdEJhY2tlbmRDbGFzcyA9IFdlYkdMQmFja2VuZDtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0QmFja2VuZENsYXNzID0gV2ViR1BVQmFja2VuZDtcclxuXHJcblx0XHRcdHBhcmFtZXRlcnMuZ2V0RmFsbGJhY2sgPSAoKSA9PiB7XHJcblxyXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdQVVJlbmRlcmVyOiBXZWJHUFUgaXMgbm90IGF2YWlsYWJsZSwgcnVubmluZyB1bmRlciBXZWJHTDIgYmFja2VuZC4nICk7XHJcblxyXG5cdFx0XHRcdHJldHVybiBuZXcgV2ViR0xCYWNrZW5kKCBwYXJhbWV0ZXJzICk7XHJcblxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBiYWNrZW5kID0gbmV3IEJhY2tlbmRDbGFzcyggcGFyYW1ldGVycyApO1xyXG5cclxuXHRcdHN1cGVyKCBiYWNrZW5kLCBwYXJhbWV0ZXJzICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgZ2VuZXJpYyBkZWZhdWx0IHZhbHVlIGlzIG92ZXJ3cml0dGVuIHdpdGggdGhlXHJcblx0XHQgKiBzdGFuZGFyZCBub2RlIGxpYnJhcnkgZm9yIHR5cGUgbWFwcGluZy4gTWF0ZXJpYWxcclxuXHRcdCAqIG1hcHBpbmcgaXMgbm90IHN1cHBvcnRlZCB3aXRoIHRoaXMgdmVyc2lvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7QmFzaWNOb2RlTGlicmFyeX1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5saWJyYXJ5ID0gbmV3IEJhc2ljTm9kZUxpYnJhcnkoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNXZWJHUFVSZW5kZXJlciA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFdlYkdQVVJlbmRlcmVyO1xyXG4iLCJpbXBvcnQgeyBHcm91cCB9IGZyb20gJy4uLy4uL29iamVjdHMvR3JvdXAuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgc3BlY2lhbGl6ZWQgZ3JvdXAgd2hpY2ggZW5hYmxlcyBhcHBsaWNhdGlvbnMgYWNjZXNzIHRvIHRoZVxyXG4gKiBSZW5kZXIgQnVuZGxlIEFQSSBvZiBXZWJHUFUuIFRoZSBncm91cCB3aXRoIGFsbCBpdHMgZGVzY2VuZGFudCBub2Rlc1xyXG4gKiBhcmUgY29uc2lkZXJlZCBhcyBvbmUgcmVuZGVyIGJ1bmRsZSBhbmQgcHJvY2Vzc2VkIGFzIHN1Y2ggYnlcclxuICogdGhlIHJlbmRlcmVyLlxyXG4gKlxyXG4gKiBUaGlzIG1vZHVsZSBpcyBvbmx5IGZ1bGx5IHN1cHBvcnRlZCBieSBgV2ViR1BVUmVuZGVyZXJgIHdpdGggYSBXZWJHUFUgYmFja2VuZC5cclxuICogV2l0aCBhIFdlYkdMIGJhY2tlbmQsIHRoZSBncm91cCBjYW4gdGVjaG5pY2FsbHkgYmUgcmVuZGVyZWQgYnV0IHdpdGhvdXRcclxuICogYW55IHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cy5cclxuICpcclxuICogQGF1Z21lbnRzIEdyb3VwXHJcbiAqL1xyXG5jbGFzcyBCdW5kbGVHcm91cCBleHRlbmRzIEdyb3VwIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBidW5kbGUgZ3JvdXAuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblxyXG5cdFx0c3VwZXIoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBmb3IgdHlwZSB0ZXN0aW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaXNCdW5kbGVHcm91cCA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIHByb3BlcnR5IGlzIG9ubHkgcmVsZXZhbnQgZm9yIGRldGVjdGluZyB0eXBlc1xyXG5cdFx0ICogZHVyaW5nIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uLiBJdCBzaG91bGQgYWx3YXlzXHJcblx0XHQgKiBtYXRjaCB0aGUgY2xhc3MgbmFtZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCAnQnVuZGxlR3JvdXAnXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudHlwZSA9ICdCdW5kbGVHcm91cCc7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSBidW5kbGUgaXMgc3RhdGljIG9yIG5vdC4gV2hlbiBzZXQgdG8gYHRydWVgLCB0aGUgc3RydWN0dXJlXHJcblx0XHQgKiBpcyBhc3N1bWVkIHRvIGJlIHN0YXRpYyBhbmQgZG9lcyBub3QgY2hhbmdlLiBFLmcuIG5vIG5ldyBvYmplY3RzIGFyZVxyXG5cdFx0ICogYWRkZWQgdG8gdGhlIGdyb3VwXHJcblx0XHQgKlxyXG5cdFx0ICogSWYgYSBjaGFuZ2UgaXMgcmVxdWlyZWQsIGFuIHVwZGF0ZSBjYW4gc3RpbGwgYmUgZm9yY2VkIGJ5IHNldHRpbmcgdGhlXHJcblx0XHQgKiBgbmVlZHNVcGRhdGVgIGZsYWcgdG8gYHRydWVgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLnN0YXRpYyA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYnVuZGxlIGdyb3VwJ3MgdmVyc2lvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxyXG5cdFx0ICogQHJlYWRvbmx5XHJcblx0XHQgKiBAZGVmYXVsdCAwXHJcblx0XHQgKi9cclxuXHRcdHRoaXMudmVyc2lvbiA9IDA7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0IHRoaXMgcHJvcGVydHkgdG8gYHRydWVgIHdoZW4gdGhlIGJ1bmRsZSBncm91cCBoYXMgY2hhbmdlZC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtib29sZWFufVxyXG5cdCAqIEBkZWZhdWx0IGZhbHNlXHJcblx0ICogQHBhcmFtIHtib29sZWFufSB2YWx1ZVxyXG5cdCAqL1xyXG5cdHNldCBuZWVkc1VwZGF0ZSggdmFsdWUgKSB7XHJcblxyXG5cdFx0aWYgKCB2YWx1ZSA9PT0gdHJ1ZSApIHRoaXMudmVyc2lvbiArKztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQnVuZGxlR3JvdXA7XHJcbiIsImltcG9ydCBOb2RlTWF0ZXJpYWwgZnJvbSAnLi4vLi4vbWF0ZXJpYWxzL25vZGVzL05vZGVNYXRlcmlhbC5qcyc7XHJcbmltcG9ydCB7IHZlYzQsIHJlbmRlck91dHB1dCB9IGZyb20gJy4uLy4uL25vZGVzL1RTTC5qcyc7XHJcbmltcG9ydCB7IExpbmVhclNSR0JDb2xvclNwYWNlLCBOb1RvbmVNYXBwaW5nIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzLmpzJztcclxuaW1wb3J0IFF1YWRNZXNoIGZyb20gJy4uLy4uL3JlbmRlcmVycy9jb21tb24vUXVhZE1lc2guanMnO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgbW9kdWxlIGlzIHJlc3BvbnNpYmxlIHRvIG1hbmFnZSB0aGUgcG9zdCBwcm9jZXNzaW5nIHNldHVwcyBpbiBhcHBzLlxyXG4gKiBZb3UgdXN1YWxseSBjcmVhdGUgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbmQgdXNlIGl0IHRvIGRlZmluZVxyXG4gKiB0aGUgb3V0cHV0IG9mIHlvdXIgcG9zdCBwcm9jZXNzaW5nIGVmZmVjdCBjaGFpbi5cclxuICogYGBganNcclxuICogY29uc3QgcG9zdFByb2Nlc3NpbmcgPSBuZXcgUG9zdFByb2Nlc3NpbmcoIHJlbmRlcmVyICk7XHJcbiAqXHJcbiAqIGNvbnN0IHNjZW5lUGFzcyA9IHBhc3MoIHNjZW5lLCBjYW1lcmEgKTtcclxuICpcclxuICogcG9zdFByb2Nlc3Npbmcub3V0cHV0Tm9kZSA9IHNjZW5lUGFzcztcclxuICogYGBgXHJcbiAqXHJcbiAqIE5vdGU6IFRoaXMgbW9kdWxlIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBgV2ViR1BVUmVuZGVyZXJgLlxyXG4gKi9cclxuY2xhc3MgUG9zdFByb2Nlc3Npbmcge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHBvc3QgcHJvY2Vzc2luZyBtYW5hZ2VtZW50IG1vZHVsZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UmVuZGVyZXJ9IHJlbmRlcmVyIC0gQSByZWZlcmVuY2UgdG8gdGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7Tm9kZTx2ZWM0Pn0gb3V0cHV0Tm9kZSAtIEFuIG9wdGlvbmFsIG91dHB1dCBub2RlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCByZW5kZXJlciwgb3V0cHV0Tm9kZSA9IHZlYzQoIDAsIDAsIDEsIDEgKSApIHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIHRoZSByZW5kZXJlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7UmVuZGVyZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgbm9kZSB3aGljaCBkZWZpbmVzIHRoZSBmaW5hbCBvdXRwdXQgb2YgdGhlIHBvc3RcclxuXHRcdCAqIHByb2Nlc3NpbmcuIFRoaXMgaXMgdXN1YWxseSB0aGUgbGFzdCBub2RlIGluIGEgY2hhaW5cclxuXHRcdCAqIG9mIGVmZmVjdCBub2Rlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZTx2ZWM0Pn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5vdXRwdXROb2RlID0gb3V0cHV0Tm9kZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgdGhlIGRlZmF1bHQgb3V0cHV0IHRvbmUgbWFwcGluZyBhbmQgY29sb3JcclxuXHRcdCAqIHNwYWNlIHRyYW5zZm9ybWF0aW9uIHNob3VsZCBiZSBlbmFibGVkIG9yIG5vdC5cclxuXHRcdCAqXHJcblx0XHQgKiBJdCBpcyBlbmFibGVkIGJ5IGRlZmF1bHQgYnkgaXQgbXVzdCBiZSBkaXNhYmxlZCB3aGVuXHJcblx0XHQgKiBlZmZlY3RzIG11c3QgYmUgZXhlY3V0ZWQgYWZ0ZXIgdG9uZSBtYXBwaW5nIGFuZCBjb2xvclxyXG5cdFx0ICogc3BhY2UgY29udmVyc2lvbi4gQSB0eXBpY2FsIGV4YW1wbGUgaXMgRlhBQSB3aGljaFxyXG5cdFx0ICogcmVxdWlyZXMgc1JHQiBpbnB1dC5cclxuXHRcdCAqXHJcblx0XHQgKiBXaGVuIHNldCB0byBgZmFsc2VgLCB0aGUgYXBwIG11c3QgY29udHJvbCB0aGUgb3V0cHV0XHJcblx0XHQgKiB0cmFuc2Zvcm1hdGlvbiB3aXRoIGBSZW5kZXJPdXRwdXROb2RlYC5cclxuXHRcdCAqXHJcblx0XHQgKiBgYGBqc1xyXG5cdFx0ICogY29uc3Qgb3V0cHV0UGFzcyA9IHJlbmRlck91dHB1dCggc2NlbmVQYXNzICk7XHJcblx0XHQgKiBgYGBcclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5vdXRwdXRDb2xvclRyYW5zZm9ybSA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBNdXN0IGJlIHNldCB0byBgdHJ1ZWAgd2hlbiB0aGUgb3V0cHV0IG5vZGUgY2hhbmdlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Tm9kZTx2ZWM0Pn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0Y29uc3QgbWF0ZXJpYWwgPSBuZXcgTm9kZU1hdGVyaWFsKCk7XHJcblx0XHRtYXRlcmlhbC5uYW1lID0gJ1Bvc3RQcm9jZXNzaW5nJztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBmdWxsIHNjcmVlbiBxdWFkIHRoYXQgaXMgdXNlZCB0byByZW5kZXJcclxuXHRcdCAqIHRoZSBlZmZlY3RzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAdHlwZSB7UXVhZE1lc2h9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX3F1YWRNZXNoID0gbmV3IFF1YWRNZXNoKCBtYXRlcmlhbCApO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdoZW4gYFBvc3RQcm9jZXNzaW5nYCBpcyB1c2VkIHRvIGFwcGx5IHBvc3QgcHJvY2Vzc2luZyBlZmZlY3RzLFxyXG5cdCAqIHRoZSBhcHBsaWNhdGlvbiBtdXN0IHVzZSB0aGlzIHZlcnNpb24gb2YgYHJlbmRlcigpYCBpbnNpZGVcclxuXHQgKiBpdHMgYW5pbWF0aW9uIGxvb3AgKG5vdCB0aGUgb25lIGZyb20gdGhlIHJlbmRlcmVyKS5cclxuXHQgKi9cclxuXHRyZW5kZXIoKSB7XHJcblxyXG5cdFx0dGhpcy5fdXBkYXRlKCk7XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyZXIgPSB0aGlzLnJlbmRlcmVyO1xyXG5cclxuXHRcdGNvbnN0IHRvbmVNYXBwaW5nID0gcmVuZGVyZXIudG9uZU1hcHBpbmc7XHJcblx0XHRjb25zdCBvdXRwdXRDb2xvclNwYWNlID0gcmVuZGVyZXIub3V0cHV0Q29sb3JTcGFjZTtcclxuXHJcblx0XHRyZW5kZXJlci50b25lTWFwcGluZyA9IE5vVG9uZU1hcHBpbmc7XHJcblx0XHRyZW5kZXJlci5vdXRwdXRDb2xvclNwYWNlID0gTGluZWFyU1JHQkNvbG9yU3BhY2U7XHJcblxyXG5cdFx0Ly9cclxuXHJcblx0XHRjb25zdCBjdXJyZW50WFIgPSByZW5kZXJlci54ci5lbmFibGVkO1xyXG5cdFx0cmVuZGVyZXIueHIuZW5hYmxlZCA9IGZhbHNlO1xyXG5cclxuXHRcdHRoaXMuX3F1YWRNZXNoLnJlbmRlciggcmVuZGVyZXIgKTtcclxuXHJcblx0XHRyZW5kZXJlci54ci5lbmFibGVkID0gY3VycmVudFhSO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0cmVuZGVyZXIudG9uZU1hcHBpbmcgPSB0b25lTWFwcGluZztcclxuXHRcdHJlbmRlcmVyLm91dHB1dENvbG9yU3BhY2UgPSBvdXRwdXRDb2xvclNwYWNlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZyZWVzIGludGVybmFsIHJlc291cmNlcy5cclxuXHQgKi9cclxuXHRkaXNwb3NlKCkge1xyXG5cclxuXHRcdHRoaXMuX3F1YWRNZXNoLm1hdGVyaWFsLmRpc3Bvc2UoKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoZSBzdGF0ZSBvZiB0aGUgbW9kdWxlLlxyXG5cdCAqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKi9cclxuXHRfdXBkYXRlKCkge1xyXG5cclxuXHRcdGlmICggdGhpcy5uZWVkc1VwZGF0ZSA9PT0gdHJ1ZSApIHtcclxuXHJcblx0XHRcdGNvbnN0IHJlbmRlcmVyID0gdGhpcy5yZW5kZXJlcjtcclxuXHJcblx0XHRcdGNvbnN0IHRvbmVNYXBwaW5nID0gcmVuZGVyZXIudG9uZU1hcHBpbmc7XHJcblx0XHRcdGNvbnN0IG91dHB1dENvbG9yU3BhY2UgPSByZW5kZXJlci5vdXRwdXRDb2xvclNwYWNlO1xyXG5cclxuXHRcdFx0dGhpcy5fcXVhZE1lc2gubWF0ZXJpYWwuZnJhZ21lbnROb2RlID0gdGhpcy5vdXRwdXRDb2xvclRyYW5zZm9ybSA9PT0gdHJ1ZSA/IHJlbmRlck91dHB1dCggdGhpcy5vdXRwdXROb2RlLCB0b25lTWFwcGluZywgb3V0cHV0Q29sb3JTcGFjZSApIDogdGhpcy5vdXRwdXROb2RlLmNvbnRleHQoIHsgdG9uZU1hcHBpbmcsIG91dHB1dENvbG9yU3BhY2UgfSApO1xyXG5cdFx0XHR0aGlzLl9xdWFkTWVzaC5tYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0XHR0aGlzLm5lZWRzVXBkYXRlID0gZmFsc2U7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdoZW4gYFBvc3RQcm9jZXNzaW5nYCBpcyB1c2VkIHRvIGFwcGx5IHBvc3QgcHJvY2Vzc2luZyBlZmZlY3RzLFxyXG5cdCAqIHRoZSBhcHBsaWNhdGlvbiBtdXN0IHVzZSB0aGlzIHZlcnNpb24gb2YgYHJlbmRlckFzeW5jKClgIGluc2lkZVxyXG5cdCAqIGl0cyBhbmltYXRpb24gbG9vcCAobm90IHRoZSBvbmUgZnJvbSB0aGUgcmVuZGVyZXIpLlxyXG5cdCAqXHJcblx0ICogQGFzeW5jXHJcblx0ICogQHJldHVybiB7UHJvbWlzZX0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgcmVuZGVyIGhhcyBiZWVuIGZpbmlzaGVkLlxyXG5cdCAqL1xyXG5cdGFzeW5jIHJlbmRlckFzeW5jKCkge1xyXG5cclxuXHRcdHRoaXMuX3VwZGF0ZSgpO1xyXG5cclxuXHRcdGNvbnN0IHJlbmRlcmVyID0gdGhpcy5yZW5kZXJlcjtcclxuXHJcblx0XHRjb25zdCB0b25lTWFwcGluZyA9IHJlbmRlcmVyLnRvbmVNYXBwaW5nO1xyXG5cdFx0Y29uc3Qgb3V0cHV0Q29sb3JTcGFjZSA9IHJlbmRlcmVyLm91dHB1dENvbG9yU3BhY2U7XHJcblxyXG5cdFx0cmVuZGVyZXIudG9uZU1hcHBpbmcgPSBOb1RvbmVNYXBwaW5nO1xyXG5cdFx0cmVuZGVyZXIub3V0cHV0Q29sb3JTcGFjZSA9IExpbmVhclNSR0JDb2xvclNwYWNlO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0Y29uc3QgY3VycmVudFhSID0gcmVuZGVyZXIueHIuZW5hYmxlZDtcclxuXHRcdHJlbmRlcmVyLnhyLmVuYWJsZWQgPSBmYWxzZTtcclxuXHJcblx0XHRhd2FpdCB0aGlzLl9xdWFkTWVzaC5yZW5kZXJBc3luYyggcmVuZGVyZXIgKTtcclxuXHJcblx0XHRyZW5kZXJlci54ci5lbmFibGVkID0gY3VycmVudFhSO1xyXG5cclxuXHRcdC8vXHJcblxyXG5cdFx0cmVuZGVyZXIudG9uZU1hcHBpbmcgPSB0b25lTWFwcGluZztcclxuXHRcdHJlbmRlcmVyLm91dHB1dENvbG9yU3BhY2UgPSBvdXRwdXRDb2xvclNwYWNlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBQb3N0UHJvY2Vzc2luZztcclxuIiwiaW1wb3J0IHsgVGV4dHVyZSB9IGZyb20gJy4uLy4uL3RleHR1cmVzL1RleHR1cmUuanMnO1xyXG5pbXBvcnQgeyBMaW5lYXJGaWx0ZXIgfSBmcm9tICcuLi8uLi9jb25zdGFudHMuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgc3BlY2lhbCB0eXBlIG9mIHRleHR1cmUgaXMgaW50ZW5kZWQgZm9yIGNvbXB1dGUgc2hhZGVycy5cclxuICogSXQgY2FuIGJlIHVzZWQgdG8gY29tcHV0ZSB0aGUgZGF0YSBvZiBhIHRleHR1cmUgd2l0aCBhIGNvbXB1dGUgc2hhZGVyLlxyXG4gKlxyXG4gKiBOb3RlOiBUaGlzIHR5cGUgb2YgdGV4dHVyZSBjYW4gb25seSBiZSB1c2VkIHdpdGggYFdlYkdQVVJlbmRlcmVyYFxyXG4gKiBhbmQgYSBXZWJHUFUgYmFja2VuZC5cclxuICpcclxuICogQGF1Z21lbnRzIFRleHR1cmVcclxuICovXHJcbmNsYXNzIFN0b3JhZ2VUZXh0dXJlIGV4dGVuZHMgVGV4dHVyZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc3RvcmFnZSB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IFt3aWR0aD0xXSAtIFRoZSBzdG9yYWdlIHRleHR1cmUncyB3aWR0aC5cclxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2hlaWdodD0xXSAtIFRoZSBzdG9yYWdlIHRleHR1cmUncyBoZWlnaHQuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoIHdpZHRoID0gMSwgaGVpZ2h0ID0gMSApIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGltYWdlIG9iamVjdCB3aGljaCBqdXN0IHJlcHJlc2VudHMgdGhlIHRleHR1cmUncyBkaW1lbnNpb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge3t3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcn19XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuaW1hZ2UgPSB7IHdpZHRoLCBoZWlnaHQgfTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBkZWZhdWx0IGBtYWdGaWx0ZXJgIGZvciBzdG9yYWdlIHRleHR1cmVzIGlzIGBUSFJFRS5MaW5lYXJGaWx0ZXJgLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubWFnRmlsdGVyID0gTGluZWFyRmlsdGVyO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGRlZmF1bHQgYG1pbkZpbHRlcmAgZm9yIHN0b3JhZ2UgdGV4dHVyZXMgaXMgYFRIUkVFLkxpbmVhckZpbHRlcmAuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge251bWJlcn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5taW5GaWx0ZXIgPSBMaW5lYXJGaWx0ZXI7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzU3RvcmFnZVRleHR1cmUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTdG9yYWdlVGV4dHVyZTtcclxuIiwiaW1wb3J0IFN0b3JhZ2VCdWZmZXJBdHRyaWJ1dGUgZnJvbSAnLi9TdG9yYWdlQnVmZmVyQXR0cmlidXRlLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIHNwZWNpYWwgdHlwZSBvZiBidWZmZXIgYXR0cmlidXRlIGlzIGludGVuZGVkIGZvciBjb21wdXRlIHNoYWRlcnMuXHJcbiAqIEl0IGNhbiBiZSB1c2VkIHRvIGVuY29kZSBkcmF3IHBhcmFtZXRlcnMgZm9yIGluZGlyZWN0IGRyYXcgY2FsbHMuXHJcbiAqXHJcbiAqIE5vdGU6IFRoaXMgdHlwZSBvZiBidWZmZXIgYXR0cmlidXRlIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBgV2ViR1BVUmVuZGVyZXJgXHJcbiAqIGFuZCBhIFdlYkdQVSBiYWNrZW5kLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgU3RvcmFnZUJ1ZmZlckF0dHJpYnV0ZVxyXG4gKi9cclxuY2xhc3MgSW5kaXJlY3RTdG9yYWdlQnVmZmVyQXR0cmlidXRlIGV4dGVuZHMgU3RvcmFnZUJ1ZmZlckF0dHJpYnV0ZSB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc3RvcmFnZSBidWZmZXIgYXR0cmlidXRlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtudW1iZXJ8VWludDMyQXJyYXl9IGNvdW50IC0gVGhlIGl0ZW0gY291bnQuIEl0IGlzIGFsc28gdmFsaWQgdG8gcGFzcyBhIGBVaW50MzJBcnJheWAgYXMgYW4gYXJndW1lbnQuXHJcblx0ICogVGhlIHN1YnNlcXVlbnQgcGFyYW1ldGVyIGlzIHRoZW4gb2Jzb2xldGUuXHJcblx0ICogQHBhcmFtIHtudW1iZXJ9IGl0ZW1TaXplIC0gVGhlIGl0ZW0gc2l6ZS5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggY291bnQsIGl0ZW1TaXplICkge1xyXG5cclxuXHRcdHN1cGVyKCBjb3VudCwgaXRlbVNpemUsIFVpbnQzMkFycmF5ICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgZm9yIHR5cGUgdGVzdGluZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cclxuXHRcdCAqIEByZWFkb25seVxyXG5cdFx0ICogQGRlZmF1bHQgdHJ1ZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmlzSW5kaXJlY3RTdG9yYWdlQnVmZmVyQXR0cmlidXRlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgSW5kaXJlY3RTdG9yYWdlQnVmZmVyQXR0cmlidXRlO1xyXG4iLCJpbXBvcnQgeyBub2RlT2JqZWN0LCBmbG9hdCB9IGZyb20gJy4uLy4uL25vZGVzL3RzbC9UU0xCYXNlLmpzJztcclxuXHJcbmltcG9ydCB7IExvYWRlciB9IGZyb20gJy4uL0xvYWRlci5qcyc7XHJcbmltcG9ydCB7IEZpbGVMb2FkZXIgfSBmcm9tICcuLi8uLi9sb2FkZXJzL0ZpbGVMb2FkZXIuanMnO1xyXG5cclxuLyoqXHJcbiAqIEEgbG9hZGVyIGZvciBsb2FkaW5nIG5vZGUgb2JqZWN0cyBpbiB0aGUgdGhyZWUuanMgSlNPTiBPYmplY3QvU2NlbmUgZm9ybWF0LlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTG9hZGVyXHJcbiAqL1xyXG5jbGFzcyBOb2RlTG9hZGVyIGV4dGVuZHMgTG9hZGVyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBub2RlIGxvYWRlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TG9hZGluZ01hbmFnZXJ9IFttYW5hZ2VyXSAtIEEgcmVmZXJlbmNlIHRvIGEgbG9hZGluZyBtYW5hZ2VyLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBtYW5hZ2VyICkge1xyXG5cclxuXHRcdHN1cGVyKCBtYW5hZ2VyICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXByZXNlbnRzIGEgZGljdGlvbmFyeSBvZiB0ZXh0dXJlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0PHN0cmluZyxUZXh0dXJlPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy50ZXh0dXJlcyA9IHt9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVwcmVzZW50cyBhIGRpY3Rpb25hcnkgb2Ygbm9kZSB0eXBlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0PHN0cmluZyxOb2RlLmNvbnN0cnVjdG9yPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub2RlcyA9IHt9O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIExvYWRzIHRoZSBub2RlIGRlZmluaXRpb25zIGZyb20gdGhlIGdpdmVuIFVSTC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSBUaGUgcGF0aC9VUkwgb2YgdGhlIGZpbGUgdG8gYmUgbG9hZGVkLlxyXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IG9uTG9hZCAtIFdpbGwgYmUgY2FsbGVkIHdoZW4gbG9hZCBjb21wbGV0ZXMuXHJcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gb25Qcm9ncmVzcyAtIFdpbGwgYmUgY2FsbGVkIHdoaWxlIGxvYWQgcHJvZ3Jlc3Nlcy5cclxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIC0gV2lsbCBiZSBjYWxsZWQgd2hlbiBlcnJvcnMgYXJlIHRocm93biBkdXJpbmcgdGhlIGxvYWRpbmcgcHJvY2Vzcy5cclxuXHQgKi9cclxuXHRsb2FkKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcclxuXHJcblx0XHRjb25zdCBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XHJcblx0XHRsb2FkZXIuc2V0UGF0aCggdGhpcy5wYXRoICk7XHJcblx0XHRsb2FkZXIuc2V0UmVxdWVzdEhlYWRlciggdGhpcy5yZXF1ZXN0SGVhZGVyICk7XHJcblx0XHRsb2FkZXIuc2V0V2l0aENyZWRlbnRpYWxzKCB0aGlzLndpdGhDcmVkZW50aWFscyApO1xyXG5cdFx0bG9hZGVyLmxvYWQoIHVybCwgKCB0ZXh0ICkgPT4ge1xyXG5cclxuXHRcdFx0dHJ5IHtcclxuXHJcblx0XHRcdFx0b25Mb2FkKCB0aGlzLnBhcnNlKCBKU09OLnBhcnNlKCB0ZXh0ICkgKSApO1xyXG5cclxuXHRcdFx0fSBjYXRjaCAoIGUgKSB7XHJcblxyXG5cdFx0XHRcdGlmICggb25FcnJvciApIHtcclxuXHJcblx0XHRcdFx0XHRvbkVycm9yKCBlICk7XHJcblxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvciggZSApO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHRoaXMubWFuYWdlci5pdGVtRXJyb3IoIHVybCApO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQYXJzZSB0aGUgbm9kZSBkZXBlbmRlbmNpZXMgZm9yIHRoZSBsb2FkZWQgbm9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7QXJyYXk8T2JqZWN0Pn0gW2pzb25dIC0gVGhlIEpTT04gZGVmaW5pdGlvblxyXG5cdCAqIEByZXR1cm4ge09iamVjdDxzdHJpbmcsTm9kZT59IEEgZGljdGlvbmFyeSB3aXRoIG5vZGUgZGVwZW5kZW5jaWVzLlxyXG5cdCAqL1xyXG5cdHBhcnNlTm9kZXMoIGpzb24gKSB7XHJcblxyXG5cdFx0Y29uc3Qgbm9kZXMgPSB7fTtcclxuXHJcblx0XHRpZiAoIGpzb24gIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGZvciAoIGNvbnN0IG5vZGVKU09OIG9mIGpzb24gKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHsgdXVpZCwgdHlwZSB9ID0gbm9kZUpTT047XHJcblxyXG5cdFx0XHRcdG5vZGVzWyB1dWlkIF0gPSB0aGlzLmNyZWF0ZU5vZGVGcm9tVHlwZSggdHlwZSApO1xyXG5cdFx0XHRcdG5vZGVzWyB1dWlkIF0udXVpZCA9IHV1aWQ7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBtZXRhID0geyBub2RlcywgdGV4dHVyZXM6IHRoaXMudGV4dHVyZXMgfTtcclxuXHJcblx0XHRcdGZvciAoIGNvbnN0IG5vZGVKU09OIG9mIGpzb24gKSB7XHJcblxyXG5cdFx0XHRcdG5vZGVKU09OLm1ldGEgPSBtZXRhO1xyXG5cclxuXHRcdFx0XHRjb25zdCBub2RlID0gbm9kZXNbIG5vZGVKU09OLnV1aWQgXTtcclxuXHRcdFx0XHRub2RlLmRlc2VyaWFsaXplKCBub2RlSlNPTiApO1xyXG5cclxuXHRcdFx0XHRkZWxldGUgbm9kZUpTT04ubWV0YTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG5vZGVzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBhcnNlcyB0aGUgbm9kZSBmcm9tIHRoZSBnaXZlbiBKU09OLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGpzb24gLSBUaGUgSlNPTiBkZWZpbml0aW9uXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGpzb24udHlwZSAtIFRoZSBub2RlIHR5cGUuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGpzb24udXVpZCAtIFRoZSBub2RlIFVVSUQuXHJcblx0ICogQHBhcmFtIHtBcnJheTxPYmplY3Q+fSBbanNvbi5ub2Rlc10gLSBUaGUgbm9kZSBkZXBlbmRlbmNpZXMuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtqc29uLm1ldGFdIC0gVGhlIG1ldGEgZGF0YS5cclxuXHQgKiBAcmV0dXJuIHtOb2RlfSBUaGUgcGFyc2VkIG5vZGUuXHJcblx0ICovXHJcblx0cGFyc2UoIGpzb24gKSB7XHJcblxyXG5cdFx0Y29uc3Qgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZUZyb21UeXBlKCBqc29uLnR5cGUgKTtcclxuXHRcdG5vZGUudXVpZCA9IGpzb24udXVpZDtcclxuXHJcblx0XHRjb25zdCBub2RlcyA9IHRoaXMucGFyc2VOb2RlcygganNvbi5ub2RlcyApO1xyXG5cdFx0Y29uc3QgbWV0YSA9IHsgbm9kZXMsIHRleHR1cmVzOiB0aGlzLnRleHR1cmVzIH07XHJcblxyXG5cdFx0anNvbi5tZXRhID0gbWV0YTtcclxuXHJcblx0XHRub2RlLmRlc2VyaWFsaXplKCBqc29uICk7XHJcblxyXG5cdFx0ZGVsZXRlIGpzb24ubWV0YTtcclxuXHJcblx0XHRyZXR1cm4gbm9kZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWZpbmVzIHRoZSBkaWN0aW9uYXJ5IG9mIHRleHR1cmVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3Q8c3RyaW5nLFRleHR1cmU+fSB2YWx1ZSAtIFRoZSB0ZXh0dXJlIGxpYnJhcnkgZGVmaW5lcyBhcyBgPHV1aWQsdGV4dHVyZT5gLlxyXG5cdCAqIEByZXR1cm4ge05vZGVMb2FkZXJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbG9hZGVyLlxyXG5cdCAqL1xyXG5cdHNldFRleHR1cmVzKCB2YWx1ZSApIHtcclxuXHJcblx0XHR0aGlzLnRleHR1cmVzID0gdmFsdWU7XHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWZpbmVzIHRoZSBkaWN0aW9uYXJ5IG9mIG5vZGUgdHlwZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdDxzdHJpbmcsTm9kZS5jb25zdHJ1Y3Rvcj59IHZhbHVlIC0gVGhlIG5vZGUgbGlicmFyeSBkZWZpbmVkIGFzIGA8Y2xhc3NuYW1lLGNsYXNzPmAuXHJcblx0ICogQHJldHVybiB7Tm9kZUxvYWRlcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBsb2FkZXIuXHJcblx0ICovXHJcblx0c2V0Tm9kZXMoIHZhbHVlICkge1xyXG5cclxuXHRcdHRoaXMubm9kZXMgPSB2YWx1ZTtcclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgYSBub2RlIG9iamVjdCBmcm9tIHRoZSBnaXZlbiB0eXBlLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBUaGUgbm9kZSB0eXBlLlxyXG5cdCAqIEByZXR1cm4ge05vZGV9IFRoZSBjcmVhdGVkIG5vZGUgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0Y3JlYXRlTm9kZUZyb21UeXBlKCB0eXBlICkge1xyXG5cclxuXHRcdGlmICggdGhpcy5ub2Rlc1sgdHlwZSBdID09PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTm9kZUxvYWRlcjogTm9kZSB0eXBlIG5vdCBmb3VuZDonLCB0eXBlICk7XHJcblx0XHRcdHJldHVybiBmbG9hdCgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbm9kZU9iamVjdCggbmV3IHRoaXMubm9kZXNbIHR5cGUgXSgpICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IE5vZGVMb2FkZXI7XHJcbiIsImltcG9ydCB7IE1hdGVyaWFsTG9hZGVyIH0gZnJvbSAnLi4vLi4vbG9hZGVycy9NYXRlcmlhbExvYWRlci5qcyc7XHJcblxyXG4vKipcclxuICogQSBzcGVjaWFsIHR5cGUgb2YgbWF0ZXJpYWwgbG9hZGVyIGZvciBsb2FkaW5nIG5vZGUgbWF0ZXJpYWxzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgTWF0ZXJpYWxMb2FkZXJcclxuICovXHJcbmNsYXNzIE5vZGVNYXRlcmlhbExvYWRlciBleHRlbmRzIE1hdGVyaWFsTG9hZGVyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBub2RlIG1hdGVyaWFsIGxvYWRlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TG9hZGluZ01hbmFnZXJ9IFttYW5hZ2VyXSAtIEEgcmVmZXJlbmNlIHRvIGEgbG9hZGluZyBtYW5hZ2VyLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKCBtYW5hZ2VyICkge1xyXG5cclxuXHRcdHN1cGVyKCBtYW5hZ2VyICk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXByZXNlbnRzIGEgZGljdGlvbmFyeSBvZiBub2RlIHR5cGVzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLE5vZGUuY29uc3RydWN0b3I+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vZGVzID0ge307XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXByZXNlbnRzIGEgZGljdGlvbmFyeSBvZiBub2RlIG1hdGVyaWFsIHR5cGVzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLE5vZGVNYXRlcmlhbC5jb25zdHJ1Y3Rvcj59XHJcblx0XHQgKi9cclxuXHRcdHRoaXMubm9kZU1hdGVyaWFscyA9IHt9O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBhcnNlcyB0aGUgbm9kZSBtYXRlcmlhbCBmcm9tIHRoZSBnaXZlbiBKU09OLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGpzb24gLSBUaGUgSlNPTiBkZWZpbml0aW9uXHJcblx0ICogQHJldHVybiB7Tm9kZU1hdGVyaWFsfS4gVGhlIHBhcnNlZCBtYXRlcmlhbC5cclxuXHQgKi9cclxuXHRwYXJzZSgganNvbiApIHtcclxuXHJcblx0XHRjb25zdCBtYXRlcmlhbCA9IHN1cGVyLnBhcnNlKCBqc29uICk7XHJcblxyXG5cdFx0Y29uc3Qgbm9kZXMgPSB0aGlzLm5vZGVzO1xyXG5cdFx0Y29uc3QgaW5wdXROb2RlcyA9IGpzb24uaW5wdXROb2RlcztcclxuXHJcblx0XHRmb3IgKCBjb25zdCBwcm9wZXJ0eSBpbiBpbnB1dE5vZGVzICkge1xyXG5cclxuXHRcdFx0Y29uc3QgdXVpZCA9IGlucHV0Tm9kZXNbIHByb3BlcnR5IF07XHJcblxyXG5cdFx0XHRtYXRlcmlhbFsgcHJvcGVydHkgXSA9IG5vZGVzWyB1dWlkIF07XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBtYXRlcmlhbDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWZpbmVzIHRoZSBkaWN0aW9uYXJ5IG9mIG5vZGUgdHlwZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdDxzdHJpbmcsTm9kZS5jb25zdHJ1Y3Rvcj59IHZhbHVlIC0gVGhlIG5vZGUgbGlicmFyeSBkZWZpbmVkIGFzIGA8Y2xhc3NuYW1lLGNsYXNzPmAuXHJcblx0ICogQHJldHVybiB7Tm9kZUxvYWRlcn0gQSByZWZlcmVuY2UgdG8gdGhpcyBsb2FkZXIuXHJcblx0ICovXHJcblx0c2V0Tm9kZXMoIHZhbHVlICkge1xyXG5cclxuXHRcdHRoaXMubm9kZXMgPSB2YWx1ZTtcclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgdGhlIGRpY3Rpb25hcnkgb2Ygbm9kZSBtYXRlcmlhbCB0eXBlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0PHN0cmluZyxOb2RlTWF0ZXJpYWwuY29uc3RydWN0b3I+fSB2YWx1ZSAtIFRoZSBub2RlIG1hdGVyaWFsIGxpYnJhcnkgZGVmaW5lZCBhcyBgPGNsYXNzbmFtZSxjbGFzcz5gLlxyXG5cdCAqIEByZXR1cm4ge05vZGVMb2FkZXJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbG9hZGVyLlxyXG5cdCAqL1xyXG5cdHNldE5vZGVNYXRlcmlhbHMoIHZhbHVlICkge1xyXG5cclxuXHRcdHRoaXMubm9kZU1hdGVyaWFscyA9IHZhbHVlO1xyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyBhIG5vZGUgbWF0ZXJpYWwgZnJvbSB0aGUgZ2l2ZW4gdHlwZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlIG5vZGUgbWF0ZXJpYWwgdHlwZS5cclxuXHQgKiBAcmV0dXJuIHtOb2RlfSBUaGUgY3JlYXRlZCBub2RlIG1hdGVyaWFsIGluc3RhbmNlLlxyXG5cdCAqL1xyXG5cdGNyZWF0ZU1hdGVyaWFsRnJvbVR5cGUoIHR5cGUgKSB7XHJcblxyXG5cdFx0Y29uc3QgbWF0ZXJpYWxDbGFzcyA9IHRoaXMubm9kZU1hdGVyaWFsc1sgdHlwZSBdO1xyXG5cclxuXHRcdGlmICggbWF0ZXJpYWxDbGFzcyAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0cmV0dXJuIG5ldyBtYXRlcmlhbENsYXNzKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBzdXBlci5jcmVhdGVNYXRlcmlhbEZyb21UeXBlKCB0eXBlICk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IE5vZGVNYXRlcmlhbExvYWRlcjtcclxuIiwiaW1wb3J0IE5vZGVMb2FkZXIgZnJvbSAnLi9Ob2RlTG9hZGVyLmpzJztcclxuaW1wb3J0IE5vZGVNYXRlcmlhbExvYWRlciBmcm9tICcuL05vZGVNYXRlcmlhbExvYWRlci5qcyc7XHJcblxyXG5pbXBvcnQgeyBPYmplY3RMb2FkZXIgfSBmcm9tICcuLi8uLi9sb2FkZXJzL09iamVjdExvYWRlci5qcyc7XHJcblxyXG4vKipcclxuICogQSBzcGVjaWFsIHR5cGUgb2Ygb2JqZWN0IGxvYWRlciBmb3IgbG9hZGluZyAzRCBvYmplY3RzIHVzaW5nXHJcbiAqIG5vZGUgbWF0ZXJpYWxzLlxyXG4gKlxyXG4gKiBAYXVnbWVudHMgT2JqZWN0TG9hZGVyXHJcbiAqL1xyXG5jbGFzcyBOb2RlT2JqZWN0TG9hZGVyIGV4dGVuZHMgT2JqZWN0TG9hZGVyIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBub2RlIG9iamVjdCBsb2FkZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0xvYWRpbmdNYW5hZ2VyfSBbbWFuYWdlcl0gLSBBIHJlZmVyZW5jZSB0byBhIGxvYWRpbmcgbWFuYWdlci5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvciggbWFuYWdlciApIHtcclxuXHJcblx0XHRzdXBlciggbWFuYWdlciApO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVwcmVzZW50cyBhIGRpY3Rpb25hcnkgb2Ygbm9kZSB0eXBlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0PHN0cmluZyxOb2RlLmNvbnN0cnVjdG9yPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5ub2RlcyA9IHt9O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmVwcmVzZW50cyBhIGRpY3Rpb25hcnkgb2Ygbm9kZSBtYXRlcmlhbCB0eXBlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0PHN0cmluZyxOb2RlTWF0ZXJpYWwuY29uc3RydWN0b3I+fVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLm5vZGVNYXRlcmlhbHMgPSB7fTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVmZXJlbmNlIHRvIGhvbGQgdGhlIGBub2Rlc2AgSlNPTiBwcm9wZXJ0eS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICogQHR5cGUgez9PYmplY3R9XHJcblx0XHQgKi9cclxuXHRcdHRoaXMuX25vZGVzSlNPTiA9IG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVmaW5lcyB0aGUgZGljdGlvbmFyeSBvZiBub2RlIHR5cGVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3Q8c3RyaW5nLE5vZGUuY29uc3RydWN0b3I+fSB2YWx1ZSAtIFRoZSBub2RlIGxpYnJhcnkgZGVmaW5lZCBhcyBgPGNsYXNzbmFtZSxjbGFzcz5gLlxyXG5cdCAqIEByZXR1cm4ge05vZGVPYmplY3RMb2FkZXJ9IEEgcmVmZXJlbmNlIHRvIHRoaXMgbG9hZGVyLlxyXG5cdCAqL1xyXG5cdHNldE5vZGVzKCB2YWx1ZSApIHtcclxuXHJcblx0XHR0aGlzLm5vZGVzID0gdmFsdWU7XHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWZpbmVzIHRoZSBkaWN0aW9uYXJ5IG9mIG5vZGUgbWF0ZXJpYWwgdHlwZXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdDxzdHJpbmcsTm9kZU1hdGVyaWFsLmNvbnN0cnVjdG9yPn0gdmFsdWUgLSBUaGUgbm9kZSBtYXRlcmlhbCBsaWJyYXJ5IGRlZmluZWQgYXMgYDxjbGFzc25hbWUsY2xhc3M+YC5cclxuXHQgKiBAcmV0dXJuIHtOb2RlT2JqZWN0TG9hZGVyfSBBIHJlZmVyZW5jZSB0byB0aGlzIGxvYWRlci5cclxuXHQgKi9cclxuXHRzZXROb2RlTWF0ZXJpYWxzKCB2YWx1ZSApIHtcclxuXHJcblx0XHR0aGlzLm5vZGVNYXRlcmlhbHMgPSB2YWx1ZTtcclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBhcnNlcyB0aGUgbm9kZSBvYmplY3RzIGZyb20gdGhlIGdpdmVuIEpTT04uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0ganNvbiAtIFRoZSBKU09OIGRlZmluaXRpb25cclxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkxvYWQgLSBUaGUgb25Mb2FkIGNhbGxiYWNrIGZ1bmN0aW9uLlxyXG5cdCAqIEByZXR1cm4ge09iamVjdDNEfS4gVGhlIHBhcnNlZCAzRCBvYmplY3QuXHJcblx0ICovXHJcblx0cGFyc2UoIGpzb24sIG9uTG9hZCApIHtcclxuXHJcblx0XHR0aGlzLl9ub2Rlc0pTT04gPSBqc29uLm5vZGVzO1xyXG5cclxuXHRcdGNvbnN0IGRhdGEgPSBzdXBlci5wYXJzZSgganNvbiwgb25Mb2FkICk7XHJcblxyXG5cdFx0dGhpcy5fbm9kZXNKU09OID0gbnVsbDsgLy8gZGlzcG9zZVxyXG5cclxuXHRcdHJldHVybiBkYXRhO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBhcnNlcyB0aGUgbm9kZSBvYmplY3RzIGZyb20gdGhlIGdpdmVuIEpTT04gYW5kIHRleHR1cmVzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGpzb24gLSBUaGUgSlNPTiBkZWZpbml0aW9uXHJcblx0ICogQHBhcmFtIHtPYmplY3Q8c3RyaW5nLFRleHR1cmU+fSB0ZXh0dXJlcyAtIFRoZSB0ZXh0dXJlIGxpYnJhcnkuXHJcblx0ICogQHJldHVybiB7T2JqZWN0PHN0cmluZyxOb2RlPn0uIFRoZSBwYXJzZWQgbm9kZXMuXHJcblx0ICovXHJcblx0cGFyc2VOb2RlcygganNvbiwgdGV4dHVyZXMgKSB7XHJcblxyXG5cdFx0aWYgKCBqc29uICE9PSB1bmRlZmluZWQgKSB7XHJcblxyXG5cdFx0XHRjb25zdCBsb2FkZXIgPSBuZXcgTm9kZUxvYWRlcigpO1xyXG5cdFx0XHRsb2FkZXIuc2V0Tm9kZXMoIHRoaXMubm9kZXMgKTtcclxuXHRcdFx0bG9hZGVyLnNldFRleHR1cmVzKCB0ZXh0dXJlcyApO1xyXG5cclxuXHRcdFx0cmV0dXJuIGxvYWRlci5wYXJzZU5vZGVzKCBqc29uICk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB7fTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQYXJzZXMgdGhlIG5vZGUgb2JqZWN0cyBmcm9tIHRoZSBnaXZlbiBKU09OIGFuZCB0ZXh0dXJlcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBqc29uIC0gVGhlIEpTT04gZGVmaW5pdGlvblxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0PHN0cmluZyxUZXh0dXJlPn0gdGV4dHVyZXMgLSBUaGUgdGV4dHVyZSBsaWJyYXJ5LlxyXG5cdCAqIEByZXR1cm4ge09iamVjdDxzdHJpbmcsTm9kZU1hdGVyaWFsPn0uIFRoZSBwYXJzZWQgbWF0ZXJpYWxzLlxyXG5cdCAqL1xyXG5cdHBhcnNlTWF0ZXJpYWxzKCBqc29uLCB0ZXh0dXJlcyApIHtcclxuXHJcblx0XHRjb25zdCBtYXRlcmlhbHMgPSB7fTtcclxuXHJcblx0XHRpZiAoIGpzb24gIT09IHVuZGVmaW5lZCApIHtcclxuXHJcblx0XHRcdGNvbnN0IG5vZGVzID0gdGhpcy5wYXJzZU5vZGVzKCB0aGlzLl9ub2Rlc0pTT04sIHRleHR1cmVzICk7XHJcblxyXG5cdFx0XHRjb25zdCBsb2FkZXIgPSBuZXcgTm9kZU1hdGVyaWFsTG9hZGVyKCk7XHJcblx0XHRcdGxvYWRlci5zZXRUZXh0dXJlcyggdGV4dHVyZXMgKTtcclxuXHRcdFx0bG9hZGVyLnNldE5vZGVzKCBub2RlcyApO1xyXG5cdFx0XHRsb2FkZXIuc2V0Tm9kZU1hdGVyaWFscyggdGhpcy5ub2RlTWF0ZXJpYWxzICk7XHJcblxyXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBqc29uLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGRhdGEgPSBqc29uWyBpIF07XHJcblxyXG5cdFx0XHRcdG1hdGVyaWFsc1sgZGF0YS51dWlkIF0gPSBsb2FkZXIucGFyc2UoIGRhdGEgKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG1hdGVyaWFscztcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTm9kZU9iamVjdExvYWRlcjtcclxuIiwiaW1wb3J0IHsgR3JvdXAgfSBmcm9tICcuL0dyb3VwLmpzJztcclxuXHJcbi8qKlxyXG4gKiBJbiBlYXJsaWVyIHRocmVlLmpzIHZlcnNpb25zLCBjbGlwcGluZyB3YXMgZGVmaW5lZCBnbG9iYWxseVxyXG4gKiBvbiB0aGUgcmVuZGVyZXIgb3Igb24gbWF0ZXJpYWwgbGV2ZWwuIFRoaXMgc3BlY2lhbCB2ZXJzaW9uIG9mXHJcbiAqIGBUSFJFRS5Hcm91cGAgYWxsb3dzIHRvIGVuY29kZSB0aGUgY2xpcHBpbmcgc3RhdGUgaW50byB0aGUgc2NlbmVcclxuICogZ3JhcGguIE1lYW5pbmcgaWYgeW91IGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGdyb3VwLCBhbGxcclxuICogZGVzY2VuZGFudCAzRCBvYmplY3RzIHdpbGwgYmUgYWZmZWN0ZWQgYnkgdGhlIHJlc3BlY3RpdmUgY2xpcHBpbmdcclxuICogcGxhbmVzLlxyXG4gKlxyXG4gKiBOb3RlOiBgQ2xpcHBpbmdHcm91cGAgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIGBXZWJHUFVSZW5kZXJlcmAuXHJcbiAqXHJcbiAqIEBhdWdtZW50cyBHcm91cFxyXG4gKi9cclxuY2xhc3MgQ2xpcHBpbmdHcm91cCBleHRlbmRzIEdyb3VwIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBjbGlwcGluZyBncm91cC5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHJcblx0XHRzdXBlcigpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGZvciB0eXBlIHRlc3RpbmcuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAcmVhZG9ubHlcclxuXHRcdCAqIEBkZWZhdWx0IHRydWVcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5pc0NsaXBwaW5nR3JvdXAgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQW4gYXJyYXkgd2l0aCBjbGlwcGluZyBwbGFuZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0FycmF5PFBsYW5lPn1cclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5jbGlwcGluZ1BsYW5lcyA9IFtdO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogV2hldGhlciBjbGlwcGluZyBzaG91bGQgYmUgZW5hYmxlZCBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCB0cnVlXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZW5hYmxlZCA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIGNsaXBwaW5nIHBsYW5lcyBpcyB1c2VkIHRvIGNsaXAgb2JqZWN0cywgcmF0aGVyIHRoYW4gdGhlaXIgdW5pb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNsaXBJbnRlcnNlY3Rpb24gPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFdoZXRoZXIgc2hhZG93cyBzaG91bGQgYmUgY2xpcHBlZCBvciBub3QuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XHJcblx0XHQgKiBAZGVmYXVsdCBmYWxzZVxyXG5cdFx0ICovXHJcblx0XHR0aGlzLmNsaXBTaGFkb3dzID0gZmFsc2U7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IENsaXBwaW5nR3JvdXAgfTtcclxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1k7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNBO0FBQ0E7QUFDQTs7QUM3RFo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoNEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0REE7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDUDtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFPUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNPO0FBQ1A7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ087QUFDQTtBQUNBO0FBQ0E7QUFDUDtBQUNPO0FBQ0E7QUFDQTtBQUNBO0FBQ1A7QUFDTztBQUNBO0FBQ0E7QUFDQTtBQUNQO0FBQ087QUFDQTtBQUNBO0FBQ0E7QUFDUDtBQUNPO0FBQ0E7QUFDQTtBQUNQO0FBQ087QUFDQTtBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ0E7QUFDQTtBQUNQO0FBQ0E7QUFDQTs7QUN0d0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0lBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPOztBQ3BJUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0tBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPOztBQ3ZWUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBOztBQzVLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3dEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDQTtBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3akNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25QQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBOztBQzFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDek1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPOztBQ2xWUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUN2RVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBOztBQy9HQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7O0FDL1VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTs7QUNoT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTs7QUNoR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7O0FDekZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTs7QUN6SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPOztBQy9EUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBOztBQ3hIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ087QUFDUDtBQUNBOztBQ3JFQTtBQUNBO0FBQ0E7QUF3QkE7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQzVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087O0FDcEtQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUNQUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087O0FDeEVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPOztBQzNGUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087O0FDdHdCUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087O0FDOUZQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcldBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUN6SFA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUNwUVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25MQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087O0FDMURQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPOztBQ2xFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087O0FDNUJQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUNsSVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPOztBQ3BaUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPOztBQy9FUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087O0FDeERQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPOztBQzdDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUM1SVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPOztBQzFHUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaHdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQ1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUNySlA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPOztBQzNOUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087O0FDdkNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPOztBQy9KUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087O0FDdklQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087O0FDblRQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ087O0FDaEhQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcFJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPOztBQ25JUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPOztBQ2hEUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTs7QUNsU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087O0FDcERQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087O0FDM1BQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDenBDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUM1Q1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDamlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUNUUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087O0FDcERQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087O0FDek9QO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3REQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbnhCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOVBBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1NUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUNqWVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUN2Q1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087O0FDM0ZQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekxBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2eUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdk1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZGTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNPO0FBQ0E7O0FDVFA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDclZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM2NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlZQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDalFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcmNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUMxRFA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087O0FDeE1QO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUNuR1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087O0FDbkpQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087O0FDckRQO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPOztBQ3BKUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPOztBQ3JDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUNsRlA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087O0FDbklQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087O0FDcmZQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087O0FDMUdQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087O0FDOUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087O0FDM0lQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPOztBQ3RMUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087O0FDakVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUMzTlA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekxBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUNwRFA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUM3dUJQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUNqTFA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPOztBQ3BMUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNBOztBQ3pKUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPOztBQ3ZQUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPOztBQ2p0QlA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUN4S1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUM5TlA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUNuRlA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUMxTVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUN6UFA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPOztBQzVIUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUM5YVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087O0FDdkZQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDektBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUM5eEJQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUN0U1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9CQTtBQUNBO0FBQ0E7QUFPQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7QUM5eUNQO0FBQ0E7QUFDQTtBQUlBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlIQTtBQUNBO0FBQ0E7QUFJQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1ZPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ0E7QUFDUDtBQUNBO0FBQ087QUFDQTtBQUNQO0FBQ087QUFDUDtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ087QUFDUDtBQUNPO0FBQ0E7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNBO0FBQ0E7QUFDUDtBQUNPO0FBQ1A7QUFDTztBQUNBO0FBQ0E7QUFDQTs7QUM5RFA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDck1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25XQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMVhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hwRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDanlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ244Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3A0RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyZUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3gwQ0E7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xuQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbFRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNybkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3RE87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMTJFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFHQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBR0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQWtDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFLQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFFQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBT0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUVBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ087QUFDUDtBQUlBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzM3Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcGtFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM09BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOWFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1UkE7QUFpQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqNERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeExBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7In0= diff --git a/build/three.webgpu.nodes.min.js b/build/three.webgpu.nodes.min.js index 036e2cb2ce5ac3..478c448ec618a3 100644 --- a/build/three.webgpu.nodes.min.js +++ b/build/three.webgpu.nodes.min.js @@ -3,4 +3,5 @@ * Copyright 2010-2025 Three.js Authors * SPDX-License-Identifier: MIT */ -import{Color as e,Vector2 as t,Vector3 as r,Vector4 as s,Matrix2 as i,Matrix3 as n,Matrix4 as a,EventDispatcher as o,MathUtils as u,WebGLCoordinateSystem as l,WebGPUCoordinateSystem as d,ColorManagement as c,SRGBTransfer as h,NoToneMapping as p,StaticDrawUsage as g,InterleavedBuffer as m,InterleavedBufferAttribute as f,DynamicDrawUsage as y,NoColorSpace as x,UnsignedIntType as b,IntType as T,NearestFilter as _,Sphere as v,BackSide as N,Euler as S,CubeReflectionMapping as E,CubeRefractionMapping as w,TangentSpaceNormalMap as A,ObjectSpaceNormalMap as R,InstancedInterleavedBuffer as C,InstancedBufferAttribute as M,DataArrayTexture as P,FloatType as L,FramebufferTexture as F,LinearMipmapLinearFilter as B,DepthTexture as I,Material as D,NormalBlending as V,LineBasicMaterial as U,LineDashedMaterial as O,NoBlending as G,MeshNormalMaterial as k,SRGBColorSpace as z,WebGLCubeRenderTarget as $,BoxGeometry as H,Mesh as W,Scene as j,LinearFilter as q,CubeCamera as X,CubeTexture as K,EquirectangularReflectionMapping as Y,EquirectangularRefractionMapping as Q,AddOperation as Z,MixOperation as J,MultiplyOperation as ee,MeshBasicMaterial as te,MeshLambertMaterial as re,MeshPhongMaterial as se,OrthographicCamera as ie,PerspectiveCamera as ne,RenderTarget as ae,CubeUVReflectionMapping as oe,BufferGeometry as ue,BufferAttribute as le,LinearSRGBColorSpace as de,RGBAFormat as ce,HalfFloatType as he,Texture as pe,MeshStandardMaterial as ge,MeshPhysicalMaterial as me,MeshToonMaterial as fe,MeshMatcapMaterial as ye,SpriteMaterial as xe,PointsMaterial as be,ShadowMaterial as Te,Uint32BufferAttribute as _e,Uint16BufferAttribute as ve,arrayNeedsUint32 as Ne,DoubleSide as Se,Camera as Ee,DepthStencilFormat as we,DepthFormat as Ae,UnsignedInt248Type as Re,UnsignedByteType as Ce,Plane as Me,Object3D as Pe,LinearMipMapLinearFilter as Le,Float32BufferAttribute as Fe,UVMapping as Be,LessCompare as Ie,VSMShadowMap as De,RGFormat as Ve,BasicShadowMap as Ue,SphereGeometry as Oe,LinearMipmapNearestFilter as Ge,NearestMipmapLinearFilter as ke,Float16BufferAttribute as ze,REVISION as $e,ArrayCamera as He,PlaneGeometry as We,FrontSide as je,CustomBlending as qe,AddEquation as Xe,ZeroFactor as Ke,CylinderGeometry as Ye,Quaternion as Qe,WebXRController as Ze,RAD2DEG as Je,PCFShadowMap as et,Frustum as tt,DataTexture as rt,RedIntegerFormat as st,RedFormat as it,ShortType as nt,ByteType as at,UnsignedShortType as ot,RGIntegerFormat as ut,RGBIntegerFormat as lt,RGBFormat as dt,RGBAIntegerFormat as ct,warnOnce as ht,createCanvasElement as pt,ReverseSubtractEquation as gt,SubtractEquation as mt,OneMinusDstAlphaFactor as ft,OneMinusDstColorFactor as yt,OneMinusSrcAlphaFactor as xt,OneMinusSrcColorFactor as bt,DstAlphaFactor as Tt,DstColorFactor as _t,SrcAlphaSaturateFactor as vt,SrcAlphaFactor as Nt,SrcColorFactor as St,OneFactor as Et,CullFaceNone as wt,CullFaceBack as At,CullFaceFront as Rt,MultiplyBlending as Ct,SubtractiveBlending as Mt,AdditiveBlending as Pt,NotEqualDepth as Lt,GreaterDepth as Ft,GreaterEqualDepth as Bt,EqualDepth as It,LessEqualDepth as Dt,LessDepth as Vt,AlwaysDepth as Ut,NeverDepth as Ot,UnsignedShort4444Type as Gt,UnsignedShort5551Type as kt,UnsignedInt5999Type as zt,AlphaFormat as $t,LuminanceFormat as Ht,LuminanceAlphaFormat as Wt,RGB_S3TC_DXT1_Format as jt,RGBA_S3TC_DXT1_Format as qt,RGBA_S3TC_DXT3_Format as Xt,RGBA_S3TC_DXT5_Format as Kt,RGB_PVRTC_4BPPV1_Format as Yt,RGB_PVRTC_2BPPV1_Format as Qt,RGBA_PVRTC_4BPPV1_Format as Zt,RGBA_PVRTC_2BPPV1_Format as Jt,RGB_ETC1_Format as er,RGB_ETC2_Format as tr,RGBA_ETC2_EAC_Format as rr,RGBA_ASTC_4x4_Format as sr,RGBA_ASTC_5x4_Format as ir,RGBA_ASTC_5x5_Format as nr,RGBA_ASTC_6x5_Format as ar,RGBA_ASTC_6x6_Format as or,RGBA_ASTC_8x5_Format as ur,RGBA_ASTC_8x6_Format as lr,RGBA_ASTC_8x8_Format as dr,RGBA_ASTC_10x5_Format as cr,RGBA_ASTC_10x6_Format as hr,RGBA_ASTC_10x8_Format as pr,RGBA_ASTC_10x10_Format as gr,RGBA_ASTC_12x10_Format as mr,RGBA_ASTC_12x12_Format as fr,RGBA_BPTC_Format as yr,RED_RGTC1_Format as xr,SIGNED_RED_RGTC1_Format as br,RED_GREEN_RGTC2_Format as Tr,SIGNED_RED_GREEN_RGTC2_Format as _r,MirroredRepeatWrapping as vr,ClampToEdgeWrapping as Nr,RepeatWrapping as Sr,NearestMipmapNearestFilter as Er,NotEqualCompare as wr,GreaterCompare as Ar,GreaterEqualCompare as Rr,EqualCompare as Cr,LessEqualCompare as Mr,AlwaysCompare as Pr,NeverCompare as Lr,NotEqualStencilFunc as Fr,GreaterStencilFunc as Br,GreaterEqualStencilFunc as Ir,EqualStencilFunc as Dr,LessEqualStencilFunc as Vr,LessStencilFunc as Ur,AlwaysStencilFunc as Or,NeverStencilFunc as Gr,DecrementWrapStencilOp as kr,IncrementWrapStencilOp as zr,DecrementStencilOp as $r,IncrementStencilOp as Hr,InvertStencilOp as Wr,ReplaceStencilOp as jr,ZeroStencilOp as qr,KeepStencilOp as Xr,MaxEquation as Kr,MinEquation as Yr,SpotLight as Qr,PointLight as Zr,DirectionalLight as Jr,RectAreaLight as es,AmbientLight as ts,HemisphereLight as rs,LightProbe as ss,LinearToneMapping as is,ReinhardToneMapping as ns,CineonToneMapping as as,ACESFilmicToneMapping as os,AgXToneMapping as us,NeutralToneMapping as ls,Group as ds,Loader as cs,FileLoader as hs,MaterialLoader as ps,ObjectLoader as gs}from"./three.core.min.js";export{AdditiveAnimationBlendMode,AnimationAction,AnimationClip,AnimationLoader,AnimationMixer,AnimationObjectGroup,AnimationUtils,ArcCurve,ArrowHelper,AttachedBindMode,Audio,AudioAnalyser,AudioContext,AudioListener,AudioLoader,AxesHelper,BasicDepthPacking,BatchedMesh,Bone,BooleanKeyframeTrack,Box2,Box3,Box3Helper,BoxHelper,BufferGeometryLoader,Cache,CameraHelper,CanvasTexture,CapsuleGeometry,CatmullRomCurve3,CircleGeometry,Clock,ColorKeyframeTrack,CompressedArrayTexture,CompressedCubeTexture,CompressedTexture,CompressedTextureLoader,ConeGeometry,ConstantAlphaFactor,ConstantColorFactor,Controls,CubeTextureLoader,CubicBezierCurve,CubicBezierCurve3,CubicInterpolant,CullFaceFrontBack,Curve,CurvePath,CustomToneMapping,Cylindrical,Data3DTexture,DataTextureLoader,DataUtils,DefaultLoadingManager,DetachedBindMode,DirectionalLightHelper,DiscreteInterpolant,DodecahedronGeometry,DynamicCopyUsage,DynamicReadUsage,EdgesGeometry,EllipseCurve,ExtrudeGeometry,Fog,FogExp2,GLBufferAttribute,GLSL1,GLSL3,GridHelper,HemisphereLightHelper,IcosahedronGeometry,ImageBitmapLoader,ImageLoader,ImageUtils,InstancedBufferGeometry,InstancedMesh,Int16BufferAttribute,Int32BufferAttribute,Int8BufferAttribute,Interpolant,InterpolateDiscrete,InterpolateLinear,InterpolateSmooth,KeyframeTrack,LOD,LatheGeometry,Layers,Light,Line,Line3,LineCurve,LineCurve3,LineLoop,LineSegments,LinearInterpolant,LinearMipMapNearestFilter,LinearTransfer,LoaderUtils,LoadingManager,LoopOnce,LoopPingPong,LoopRepeat,MOUSE,MeshDepthMaterial,MeshDistanceMaterial,NearestMipMapLinearFilter,NearestMipMapNearestFilter,NormalAnimationBlendMode,NumberKeyframeTrack,OctahedronGeometry,OneMinusConstantAlphaFactor,OneMinusConstantColorFactor,PCFSoftShadowMap,Path,PlaneHelper,PointLightHelper,Points,PolarGridHelper,PolyhedronGeometry,PositionalAudio,PropertyBinding,PropertyMixer,QuadraticBezierCurve,QuadraticBezierCurve3,QuaternionKeyframeTrack,QuaternionLinearInterpolant,RGBADepthPacking,RGBDepthPacking,RGB_BPTC_SIGNED_Format,RGB_BPTC_UNSIGNED_Format,RGDepthPacking,RawShaderMaterial,Ray,Raycaster,RenderTarget3D,RenderTargetArray,RingGeometry,ShaderMaterial,Shape,ShapeGeometry,ShapePath,ShapeUtils,Skeleton,SkeletonHelper,SkinnedMesh,Source,Spherical,SphericalHarmonics3,SplineCurve,SpotLightHelper,Sprite,StaticCopyUsage,StaticReadUsage,StereoCamera,StreamCopyUsage,StreamDrawUsage,StreamReadUsage,StringKeyframeTrack,TOUCH,TetrahedronGeometry,TextureLoader,TextureUtils,TimestampQuery,TorusGeometry,TorusKnotGeometry,Triangle,TriangleFanDrawMode,TriangleStripDrawMode,TrianglesDrawMode,TubeGeometry,Uint8BufferAttribute,Uint8ClampedBufferAttribute,Uniform,UniformsGroup,VectorKeyframeTrack,VideoFrameTexture,VideoTexture,WebGL3DRenderTarget,WebGLArrayRenderTarget,WebGLRenderTarget,WireframeGeometry,WrapAroundEnding,ZeroCurvatureEnding,ZeroSlopeEnding}from"./three.core.min.js";const ms=["alphaMap","alphaTest","anisotropy","anisotropyMap","anisotropyRotation","aoMap","attenuationColor","attenuationDistance","bumpMap","clearcoat","clearcoatMap","clearcoatNormalMap","clearcoatNormalScale","clearcoatRoughness","color","dispersion","displacementMap","emissive","emissiveMap","envMap","gradientMap","ior","iridescence","iridescenceIOR","iridescenceMap","iridescenceThicknessMap","lightMap","map","matcap","metalness","metalnessMap","normalMap","normalScale","opacity","roughness","roughnessMap","sheen","sheenColor","sheenColorMap","sheenRoughnessMap","shininess","specular","specularColor","specularColorMap","specularIntensity","specularIntensityMap","specularMap","thickness","transmission","transmissionMap"];class fs{constructor(e){this.renderObjects=new WeakMap,this.hasNode=this.containsNode(e),this.hasAnimation=!0===e.object.isSkinnedMesh,this.refreshUniforms=ms,this.renderId=0}firstInitialization(e){return!1===this.renderObjects.has(e)&&(this.getRenderObjectData(e),!0)}getRenderObjectData(e){let t=this.renderObjects.get(e);if(void 0===t){const{geometry:r,material:s,object:i}=e;if(t={material:this.getMaterialData(s),geometry:{id:r.id,attributes:this.getAttributesData(r.attributes),indexVersion:r.index?r.index.version:null,drawRange:{start:r.drawRange.start,count:r.drawRange.count}},worldMatrix:i.matrixWorld.clone()},i.center&&(t.center=i.center.clone()),i.morphTargetInfluences&&(t.morphTargetInfluences=i.morphTargetInfluences.slice()),null!==e.bundle&&(t.version=e.bundle.version),t.material.transmission>0){const{width:r,height:s}=e.context;t.bufferWidth=r,t.bufferHeight=s}this.renderObjects.set(e,t)}return t}getAttributesData(e){const t={};for(const r in e){const s=e[r];t[r]={version:s.version}}return t}containsNode(e){const t=e.material;for(const e in t)if(t[e]&&t[e].isNode)return!0;return null!==e.renderer.nodes.modelViewMatrix||null!==e.renderer.nodes.modelNormalViewMatrix}getMaterialData(e){const t={};for(const r of this.refreshUniforms){const s=e[r];null!=s&&("object"==typeof s&&void 0!==s.clone?!0===s.isTexture?t[r]={id:s.id,version:s.version}:t[r]=s.clone():t[r]=s)}return t}equals(e){const{object:t,material:r,geometry:s}=e,i=this.getRenderObjectData(e);if(!0!==i.worldMatrix.equals(t.matrixWorld))return i.worldMatrix.copy(t.matrixWorld),!1;const n=i.material;for(const e in n){const t=n[e],s=r[e];if(void 0!==t.equals){if(!1===t.equals(s))return t.copy(s),!1}else if(!0===s.isTexture){if(t.id!==s.id||t.version!==s.version)return t.id=s.id,t.version=s.version,!1}else if(t!==s)return n[e]=s,!1}if(n.transmission>0){const{width:t,height:r}=e.context;if(i.bufferWidth!==t||i.bufferHeight!==r)return i.bufferWidth=t,i.bufferHeight=r,!1}const a=i.geometry,o=s.attributes,u=a.attributes,l=Object.keys(u),d=Object.keys(o);if(a.id!==s.id)return a.id=s.id,!1;if(l.length!==d.length)return i.geometry.attributes=this.getAttributesData(o),!1;for(const e of l){const t=u[e],r=o[e];if(void 0===r)return delete u[e],!1;if(t.version!==r.version)return t.version=r.version,!1}const c=s.index,h=a.indexVersion,p=c?c.version:null;if(h!==p)return a.indexVersion=p,!1;if(a.drawRange.start!==s.drawRange.start||a.drawRange.count!==s.drawRange.count)return a.drawRange.start=s.drawRange.start,a.drawRange.count=s.drawRange.count,!1;if(i.morphTargetInfluences){let e=!1;for(let r=0;r>>16,2246822507),r^=Math.imul(s^s>>>13,3266489909),s=Math.imul(s^s>>>16,2246822507),s^=Math.imul(r^r>>>13,3266489909),4294967296*(2097151&s)+(r>>>0)}const xs=e=>ys(e),bs=e=>ys(e),Ts=(...e)=>ys(e);function _s(e,t=!1){const r=[];!0===e.isNode&&(r.push(e.id),e=e.getSelf());for(const{property:s,childNode:i}of vs(e))r.push(ys(s.slice(0,-4)),i.getCacheKey(t));return ys(r)}function*vs(e,t=!1){for(const r in e){if(!0===r.startsWith("_"))continue;const s=e[r];if(!0===Array.isArray(s))for(let e=0;ee.charCodeAt(0))).buffer}var Fs=Object.freeze({__proto__:null,arrayBufferToBase64:Ps,base64ToArrayBuffer:Ls,getCacheKey:_s,getDataFromObject:Ms,getLengthFromType:As,getNodeChildren:vs,getTypeFromLength:Es,getTypedArrayFromType:ws,getValueFromType:Cs,getValueType:Rs,hash:Ts,hashArray:bs,hashString:xs});const Bs={VERTEX:"vertex",FRAGMENT:"fragment"},Is={NONE:"none",FRAME:"frame",RENDER:"render",OBJECT:"object"},Ds={BOOLEAN:"bool",INTEGER:"int",FLOAT:"float",VECTOR2:"vec2",VECTOR3:"vec3",VECTOR4:"vec4",MATRIX2:"mat2",MATRIX3:"mat3",MATRIX4:"mat4"},Vs={READ_ONLY:"readOnly",WRITE_ONLY:"writeOnly",READ_WRITE:"readWrite"},Us=["fragment","vertex"],Os=["setup","analyze","generate"],Gs=[...Us,"compute"],ks=["x","y","z","w"];let zs=0;class $s extends o{static get type(){return"Node"}constructor(e=null){super(),this.nodeType=e,this.updateType=Is.NONE,this.updateBeforeType=Is.NONE,this.updateAfterType=Is.NONE,this.uuid=u.generateUUID(),this.version=0,this.global=!1,this.isNode=!0,this._cacheKey=null,this._cacheKeyVersion=0,Object.defineProperty(this,"id",{value:zs++})}set needsUpdate(e){!0===e&&this.version++}get type(){return this.constructor.type}onUpdate(e,t){return this.updateType=t,this.update=e.bind(this.getSelf()),this}onFrameUpdate(e){return this.onUpdate(e,Is.FRAME)}onRenderUpdate(e){return this.onUpdate(e,Is.RENDER)}onObjectUpdate(e){return this.onUpdate(e,Is.OBJECT)}onReference(e){return this.updateReference=e.bind(this.getSelf()),this}getSelf(){return this.self||this}updateReference(){return this}isGlobal(){return this.global}*getChildren(){for(const{childNode:e}of vs(this))yield e}dispose(){this.dispatchEvent({type:"dispose"})}traverse(e){e(this);for(const t of this.getChildren())t.traverse(e)}getCacheKey(e=!1){return!0!==(e=e||this.version!==this._cacheKeyVersion)&&null!==this._cacheKey||(this._cacheKey=Ts(_s(this,e),this.customCacheKey()),this._cacheKeyVersion=this.version),this._cacheKey}customCacheKey(){return 0}getScope(){return this}getHash(){return this.uuid}getUpdateType(){return this.updateType}getUpdateBeforeType(){return this.updateBeforeType}getUpdateAfterType(){return this.updateAfterType}getElementType(e){const t=this.getNodeType(e);return e.getElementType(t)}getMemberType(){return"void"}getNodeType(e){const t=e.getNodeProperties(this);return t.outputNode?t.outputNode.getNodeType(e):this.nodeType}getShared(e){const t=this.getHash(e);return e.getNodeFromHash(t)||this}setup(e){const t=e.getNodeProperties(this);let r=0;for(const e of this.getChildren())t["node"+r++]=e;return t.outputNode||null}analyze(e){if(1===e.increaseUsage(this)){const t=e.getNodeProperties(this);for(const r of Object.values(t))r&&!0===r.isNode&&r.build(e)}}generate(e,t){const{outputNode:r}=e.getNodeProperties(this);if(r&&!0===r.isNode)return r.build(e,t)}updateBefore(){console.warn("Abstract function.")}updateAfter(){console.warn("Abstract function.")}update(){console.warn("Abstract function.")}build(e,t=null){const r=this.getShared(e);if(this!==r)return r.build(e,t);e.addNode(this),e.addChain(this);let s=null;const i=e.getBuildStage();if("setup"===i){this.updateReference(e);const t=e.getNodeProperties(this);if(!0!==t.initialized){t.initialized=!0;const r=this.setup(e),s=r&&!0===r.isNode;for(const r of Object.values(t))r&&!0===r.isNode&&r.build(e);s&&r.build(e),t.outputNode=r}}else if("analyze"===i)this.analyze(e);else if("generate"===i){if(1===this.generate.length){const r=this.getNodeType(e),i=e.getDataFromNode(this);s=i.snippet,void 0===s?void 0===i.generated?(i.generated=!0,s=this.generate(e)||"",i.snippet=s):(console.warn("THREE.Node: Recursion detected.",this),s=""):void 0!==i.flowCodes&&void 0!==e.context.nodeBlock&&e.addFlowCodeHierarchy(this,e.context.nodeBlock),s=e.format(s,r,t)}else s=this.generate(e,t)||""}return e.removeChain(this),e.addSequentialNode(this),s}getSerializeChildren(){return vs(this)}serialize(e){const t=this.getSerializeChildren(),r={};for(const{property:s,index:i,childNode:n}of t)void 0!==i?(void 0===r[s]&&(r[s]=Number.isInteger(i)?[]:{}),r[s][i]=n.toJSON(e.meta).uuid):r[s]=n.toJSON(e.meta).uuid;Object.keys(r).length>0&&(e.inputNodes=r)}deserialize(e){if(void 0!==e.inputNodes){const t=e.meta.nodes;for(const r in e.inputNodes)if(Array.isArray(e.inputNodes[r])){const s=[];for(const i of e.inputNodes[r])s.push(t[i]);this[r]=s}else if("object"==typeof e.inputNodes[r]){const s={};for(const i in e.inputNodes[r]){const n=e.inputNodes[r][i];s[i]=t[n]}this[r]=s}else{const s=e.inputNodes[r];this[r]=t[s]}}}toJSON(e){const{uuid:t,type:r}=this,s=void 0===e||"string"==typeof e;s&&(e={textures:{},images:{},nodes:{}});let i=e.nodes[t];function n(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(void 0===i&&(i={uuid:t,type:r,meta:e,metadata:{version:4.6,type:"Node",generator:"Node.toJSON"}},!0!==s&&(e.nodes[i.uuid]=i),this.serialize(i),delete i.meta),s){const t=n(e.textures),r=n(e.images),s=n(e.nodes);t.length>0&&(i.textures=t),r.length>0&&(i.images=r),s.length>0&&(i.nodes=s)}return i}}class Hs extends $s{static get type(){return"ArrayElementNode"}constructor(e,t){super(),this.node=e,this.indexNode=t,this.isArrayElementNode=!0}getNodeType(e){return this.node.getElementType(e)}generate(e){const t=this.indexNode.getNodeType(e);return`${this.node.build(e)}[ ${this.indexNode.build(e,!e.isVector(t)&&e.isInteger(t)?t:"uint")} ]`}}class Ws extends $s{static get type(){return"ConvertNode"}constructor(e,t){super(),this.node=e,this.convertTo=t}getNodeType(e){const t=this.node.getNodeType(e);let r=null;for(const s of this.convertTo.split("|"))null!==r&&e.getTypeLength(t)!==e.getTypeLength(s)||(r=s);return r}serialize(e){super.serialize(e),e.convertTo=this.convertTo}deserialize(e){super.deserialize(e),this.convertTo=e.convertTo}generate(e,t){const r=this.node,s=this.getNodeType(e),i=r.build(e,s);return e.format(i,s,t)}}class js extends $s{static get type(){return"TempNode"}constructor(e=null){super(e),this.isTempNode=!0}hasDependencies(e){return e.getDataFromNode(this).usageCount>1}build(e,t){if("generate"===e.getBuildStage()){const r=e.getVectorType(this.getNodeType(e,t)),s=e.getDataFromNode(this);if(void 0!==s.propertyName)return e.format(s.propertyName,r,t);if("void"!==r&&"void"!==t&&this.hasDependencies(e)){const i=super.build(e,r),n=e.getVarFromNode(this,null,r),a=e.getPropertyName(n);return e.addLineFlowCode(`${a} = ${i}`,this),s.snippet=i,s.propertyName=a,e.format(s.propertyName,r,t)}}return super.build(e,t)}}class qs extends js{static get type(){return"JoinNode"}constructor(e=[],t=null){super(t),this.nodes=e}getNodeType(e){return null!==this.nodeType?e.getVectorType(this.nodeType):e.getTypeFromLength(this.nodes.reduce(((t,r)=>t+e.getTypeLength(r.getNodeType(e))),0))}generate(e,t){const r=this.getNodeType(e),s=e.getTypeLength(r),i=this.nodes,n=e.getComponentType(r),a=[];let o=0;for(const t of i){if(o>=s){console.error(`THREE.TSL: Length of parameters exceeds maximum length of function '${r}()' type.`);break}let i,u=t.getNodeType(e),l=e.getTypeLength(u);o+l>s&&(console.error(`THREE.TSL: Length of '${r}()' data exceeds maximum length of output type.`),l=s-o,u=e.getTypeFromLength(l)),o+=l,i=t.build(e,u);const d=e.getComponentType(u);d!==n&&(i=e.format(i,d,n)),a.push(i)}const u=`${e.getType(r)}( ${a.join(", ")} )`;return e.format(u,r,t)}}const Xs=ks.join("");class Ks extends $s{static get type(){return"SplitNode"}constructor(e,t="x"){super(),this.node=e,this.components=t,this.isSplitNode=!0}getVectorLength(){let e=this.components.length;for(const t of this.components)e=Math.max(ks.indexOf(t)+1,e);return e}getComponentType(e){return e.getComponentType(this.node.getNodeType(e))}getNodeType(e){return e.getTypeFromLength(this.components.length,this.getComponentType(e))}generate(e,t){const r=this.node,s=e.getTypeLength(r.getNodeType(e));let i=null;if(s>1){let n=null;this.getVectorLength()>=s&&(n=e.getTypeFromLength(this.getVectorLength(),this.getComponentType(e)));const a=r.build(e,n);i=this.components.length===s&&this.components===Xs.slice(0,this.components.length)?e.format(a,n,t):e.format(`${a}.${this.components}`,this.getNodeType(e),t)}else i=r.build(e,t);return i}serialize(e){super.serialize(e),e.components=this.components}deserialize(e){super.deserialize(e),this.components=e.components}}class Ys extends js{static get type(){return"SetNode"}constructor(e,t,r){super(),this.sourceNode=e,this.components=t,this.targetNode=r}getNodeType(e){return this.sourceNode.getNodeType(e)}generate(e){const{sourceNode:t,components:r,targetNode:s}=this,i=this.getNodeType(e),n=e.getComponentType(s.getNodeType(e)),a=e.getTypeFromLength(r.length,n),o=s.build(e,a),u=t.build(e,i),l=e.getTypeLength(i),d=[];for(let e=0;ee.replace(/r|s/g,"x").replace(/g|t/g,"y").replace(/b|p/g,"z").replace(/a|q/g,"w"),ai=e=>ni(e).split("").sort().join(""),oi={setup(e,t){const r=t.shift();return e(Li(r),...t)},get(e,t,r){if("string"==typeof t&&void 0===e[t]){if(!0!==e.isStackNode&&"assign"===t)return(...e)=>(ri.assign(r,...e),r);if(si.has(t)){const s=si.get(t);return e.isStackNode?(...e)=>r.add(s(...e)):(...e)=>s(r,...e)}if("self"===t)return e;if(t.endsWith("Assign")&&si.has(t.slice(0,t.length-6))){const s=si.get(t.slice(0,t.length-6));return e.isStackNode?(...e)=>r.assign(e[0],s(...e)):(...e)=>r.assign(s(r,...e))}if(!0===/^[xyzwrgbastpq]{1,4}$/.test(t))return t=ni(t),Pi(new Ks(r,t));if(!0===/^set[XYZWRGBASTPQ]{1,4}$/.test(t))return t=ai(t.slice(3).toLowerCase()),r=>Pi(new Ys(e,t,r));if(!0===/^flip[XYZWRGBASTPQ]{1,4}$/.test(t))return t=ai(t.slice(4).toLowerCase()),()=>Pi(new Qs(Pi(e),t));if("width"===t||"height"===t||"depth"===t)return"width"===t?t="x":"height"===t?t="y":"depth"===t&&(t="z"),Pi(new Ks(e,t));if(!0===/^\d+$/.test(t))return Pi(new Hs(r,new ei(Number(t),"uint")));if(!0===/^get$/.test(t))return e=>Pi(new ti(r,e))}return Reflect.get(e,t,r)},set:(e,t,r,s)=>"string"!=typeof t||void 0!==e[t]||!0!==/^[xyzwrgbastpq]{1,4}$/.test(t)&&"width"!==t&&"height"!==t&&"depth"!==t&&!0!==/^\d+$/.test(t)?Reflect.set(e,t,r,s):(s[t].assign(r),!0)},ui=new WeakMap,li=new WeakMap,di=function(e,t=null){for(const r in e)e[r]=Pi(e[r],t);return e},ci=function(e,t=null){const r=e.length;for(let s=0;sPi(null!==s?Object.assign(e,s):e);let n,a,o,u=t;function l(t){let r;return r=u?/[a-z]/i.test(u)?u+"()":u:e.type,void 0!==a&&t.lengtho?(console.error(`THREE.TSL: "${r}" parameter length exceeds limit.`),t.slice(0,o)):t}return null===t?n=(...t)=>i(new e(...Fi(l(t)))):null!==r?(r=Pi(r),n=(...s)=>i(new e(t,...Fi(l(s)),r))):n=(...r)=>i(new e(t,...Fi(l(r)))),n.setParameterLength=(...e)=>(1===e.length?a=o=e[0]:2===e.length&&([a,o]=e),n),n.setName=e=>(u=e,n),n},pi=function(e,...t){return Pi(new e(...Fi(t)))};class gi extends $s{constructor(e,t){super(),this.shaderNode=e,this.inputNodes=t}getNodeType(e){return this.shaderNode.nodeType||this.getOutputNode(e).getNodeType(e)}getMemberType(e,t){return this.getOutputNode(e).getMemberType(e,t)}call(e){const{shaderNode:t,inputNodes:r}=this,s=e.getNodeProperties(t);if(s.onceOutput)return s.onceOutput;let i=null;if(t.layout){let s=li.get(e.constructor);void 0===s&&(s=new WeakMap,li.set(e.constructor,s));let n=s.get(t);void 0===n&&(n=Pi(e.buildFunctionNode(t)),s.set(t,n)),e.addInclude(n),i=Pi(n.call(r))}else{const s=t.jsFunc,n=null!==r||s.length>1?s(r||[],e):s(e);i=Pi(n)}return t.once&&(s.onceOutput=i),i}getOutputNode(e){const t=e.getNodeProperties(this);return null===t.outputNode&&(t.outputNode=this.setupOutput(e)),t.outputNode}setup(e){return this.getOutputNode(e)}setupOutput(e){return e.addStack(),e.stack.outputNode=this.call(e),e.removeStack()}generate(e,t){return this.getOutputNode(e).build(e,t)}}class mi extends $s{constructor(e,t){super(t),this.jsFunc=e,this.layout=null,this.global=!0,this.once=!1}setLayout(e){return this.layout=e,this}call(e=null){return Li(e),Pi(new gi(this,e))}setup(){return this.call()}}const fi=[!1,!0],yi=[0,1,2,3],xi=[-1,-2],bi=[.5,1.5,1/3,1e-6,1e6,Math.PI,2*Math.PI,1/Math.PI,2/Math.PI,1/(2*Math.PI),Math.PI/2],Ti=new Map;for(const e of fi)Ti.set(e,new ei(e));const _i=new Map;for(const e of yi)_i.set(e,new ei(e,"uint"));const vi=new Map([..._i].map((e=>new ei(e.value,"int"))));for(const e of xi)vi.set(e,new ei(e,"int"));const Ni=new Map([...vi].map((e=>new ei(e.value))));for(const e of bi)Ni.set(e,new ei(e));for(const e of bi)Ni.set(-e,new ei(-e));const Si={bool:Ti,uint:_i,ints:vi,float:Ni},Ei=new Map([...Ti,...Ni]),wi=(e,t)=>Ei.has(e)?Ei.get(e):!0===e.isNode?e:new ei(e,t),Ai=function(e,t=null){return(...r)=>{if((0===r.length||!["bool","float","int","uint"].includes(e)&&r.every((e=>"object"!=typeof e)))&&(r=[Cs(e,...r)]),1===r.length&&null!==t&&t.has(r[0]))return Pi(t.get(r[0]));if(1===r.length){const t=wi(r[0],e);return(e=>{try{return e.getNodeType()}catch(e){return}})(t)===e?Pi(t):Pi(new Ws(t,e))}const s=r.map((e=>wi(e)));return Pi(new qs(s,e))}},Ri=e=>"object"==typeof e&&null!==e?e.value:e,Ci=e=>null!=e?e.nodeType||e.convertTo||("string"==typeof e?e:null):null;function Mi(e,t){return new Proxy(new mi(e,t),oi)}const Pi=(e,t=null)=>function(e,t=null){const r=Rs(e);if("node"===r){let t=ui.get(e);return void 0===t&&(t=new Proxy(e,oi),ui.set(e,t),ui.set(t,t)),t}return null===t&&("float"===r||"boolean"===r)||r&&"shader"!==r&&"string"!==r?Pi(wi(e,t)):"shader"===r?Vi(e):e}(e,t),Li=(e,t=null)=>new di(e,t),Fi=(e,t=null)=>new ci(e,t),Bi=(...e)=>new hi(...e),Ii=(...e)=>new pi(...e);let Di=0;const Vi=(e,t=null)=>{let r=null;null!==t&&("object"==typeof t?r=t.return:("string"==typeof t?r=t:console.error("THREE.TSL: Invalid layout type."),t=null));const s=new Mi(e,r),i=(...e)=>{let t;return Li(e),t=e[0]&&e[0].isNode?[...e]:e[0],s.call(t)};if(i.shaderNode=s,i.setLayout=e=>(s.setLayout(e),i),i.once=()=>(s.once=!0,i),null!==t){if("object"!=typeof t.inputs){const e={name:"fn"+Di++,type:r,inputs:[]};for(const r in t)"return"!==r&&e.inputs.push({name:r,type:t[r]});t=e}i.setLayout(t)}return i};ii("toGlobal",(e=>(e.global=!0,e)));const Ui=e=>{ri=e},Oi=()=>ri,Gi=(...e)=>ri.If(...e);function ki(e){return ri&&ri.add(e),e}ii("append",ki);const zi=new Ai("color"),$i=new Ai("float",Si.float),Hi=new Ai("int",Si.ints),Wi=new Ai("uint",Si.uint),ji=new Ai("bool",Si.bool),qi=new Ai("vec2"),Xi=new Ai("ivec2"),Ki=new Ai("uvec2"),Yi=new Ai("bvec2"),Qi=new Ai("vec3"),Zi=new Ai("ivec3"),Ji=new Ai("uvec3"),en=new Ai("bvec3"),tn=new Ai("vec4"),rn=new Ai("ivec4"),sn=new Ai("uvec4"),nn=new Ai("bvec4"),an=new Ai("mat2"),on=new Ai("mat3"),un=new Ai("mat4");ii("toColor",zi),ii("toFloat",$i),ii("toInt",Hi),ii("toUint",Wi),ii("toBool",ji),ii("toVec2",qi),ii("toIVec2",Xi),ii("toUVec2",Ki),ii("toBVec2",Yi),ii("toVec3",Qi),ii("toIVec3",Zi),ii("toUVec3",Ji),ii("toBVec3",en),ii("toVec4",tn),ii("toIVec4",rn),ii("toUVec4",sn),ii("toBVec4",nn),ii("toMat2",an),ii("toMat3",on),ii("toMat4",un);const ln=Bi(Hs).setParameterLength(2),dn=(e,t)=>Pi(new Ws(Pi(e),t));ii("element",ln),ii("convert",dn);class cn extends js{static get type(){return"ArrayNode"}constructor(e,t,r=null){super(e),this.count=t,this.values=r,this.isArrayNode=!0}getNodeType(e){return null===this.nodeType&&(this.nodeType=this.values[0].getNodeType(e)),this.nodeType}getElementType(e){return this.getNodeType(e)}generate(e){const t=this.getNodeType(e);return e.generateArray(t,this.count,this.values)}}const hn=(...e)=>{let t;if(1===e.length){const r=e[0];t=new cn(null,r.length,r)}else{const r=e[0],s=e[1];t=new cn(r,s)}return Pi(t)};ii("toArray",((e,t)=>hn(Array(t).fill(e))));class pn extends $s{static get type(){return"UniformGroupNode"}constructor(e,t=!1,r=1){super("string"),this.name=e,this.shared=t,this.order=r,this.isUniformGroup=!0}serialize(e){super.serialize(e),e.name=this.name,e.version=this.version,e.shared=this.shared}deserialize(e){super.deserialize(e),this.name=e.name,this.version=e.version,this.shared=e.shared}}const gn=e=>new pn(e),mn=(e,t=0)=>new pn(e,!0,t),fn=mn("frame"),yn=mn("render"),xn=gn("object");class bn extends Zs{static get type(){return"UniformNode"}constructor(e,t=null){super(e,t),this.isUniformNode=!0,this.name="",this.groupNode=xn}label(e){return this.name=e,this}setGroup(e){return this.groupNode=e,this}getGroup(){return this.groupNode}getUniformHash(e){return this.getHash(e)}onUpdate(e,t){const r=this.getSelf();return e=e.bind(r),super.onUpdate((t=>{const s=e(t,r);void 0!==s&&(this.value=s)}),t)}generate(e,t){const r=this.getNodeType(e),s=this.getUniformHash(e);let i=e.getNodeFromHash(s);void 0===i&&(e.setHashNode(this,s),i=this);const n=i.getInputType(e),a=e.getUniformFromNode(i,n,e.shaderStage,this.name||e.context.label),o=e.getPropertyName(a);return void 0!==e.context.label&&delete e.context.label,e.format(o,r,t)}}const Tn=(e,t)=>{const r=Ci(t||e),s=e&&!0===e.isNode?e.node&&e.node.value||e.value:e;return Pi(new bn(s,r))};class _n extends $s{static get type(){return"PropertyNode"}constructor(e,t=null,r=!1){super(e),this.name=t,this.varying=r,this.isPropertyNode=!0}getHash(e){return this.name||super.getHash(e)}isGlobal(){return!0}generate(e){let t;return!0===this.varying?(t=e.getVaryingFromNode(this,this.name),t.needsInterpolation=!0):t=e.getVarFromNode(this,this.name),e.getPropertyName(t)}}const vn=(e,t)=>Pi(new _n(e,t)),Nn=(e,t)=>Pi(new _n(e,t,!0)),Sn=Ii(_n,"vec4","DiffuseColor"),En=Ii(_n,"vec3","EmissiveColor"),wn=Ii(_n,"float","Roughness"),An=Ii(_n,"float","Metalness"),Rn=Ii(_n,"float","Clearcoat"),Cn=Ii(_n,"float","ClearcoatRoughness"),Mn=Ii(_n,"vec3","Sheen"),Pn=Ii(_n,"float","SheenRoughness"),Ln=Ii(_n,"float","Iridescence"),Fn=Ii(_n,"float","IridescenceIOR"),Bn=Ii(_n,"float","IridescenceThickness"),In=Ii(_n,"float","AlphaT"),Dn=Ii(_n,"float","Anisotropy"),Vn=Ii(_n,"vec3","AnisotropyT"),Un=Ii(_n,"vec3","AnisotropyB"),On=Ii(_n,"color","SpecularColor"),Gn=Ii(_n,"float","SpecularF90"),kn=Ii(_n,"float","Shininess"),zn=Ii(_n,"vec4","Output"),$n=Ii(_n,"float","dashSize"),Hn=Ii(_n,"float","gapSize"),Wn=Ii(_n,"float","pointWidth"),jn=Ii(_n,"float","IOR"),qn=Ii(_n,"float","Transmission"),Xn=Ii(_n,"float","Thickness"),Kn=Ii(_n,"float","AttenuationDistance"),Yn=Ii(_n,"color","AttenuationColor"),Qn=Ii(_n,"float","Dispersion");class Zn extends js{static get type(){return"AssignNode"}constructor(e,t){super(),this.targetNode=e,this.sourceNode=t}hasDependencies(){return!1}getNodeType(e,t){return"void"!==t?this.targetNode.getNodeType(e):"void"}needsSplitAssign(e){const{targetNode:t}=this;if(!1===e.isAvailable("swizzleAssign")&&t.isSplitNode&&t.components.length>1){const r=e.getTypeLength(t.node.getNodeType(e));return ks.join("").slice(0,r)!==t.components}return!1}generate(e,t){const{targetNode:r,sourceNode:s}=this,i=this.needsSplitAssign(e),n=r.getNodeType(e),a=r.context({assign:!0}).build(e),o=s.build(e,n),u=s.getNodeType(e),l=e.getDataFromNode(this);let d;if(!0===l.initialized)"void"!==t&&(d=a);else if(i){const s=e.getVarFromNode(this,null,n),i=e.getPropertyName(s);e.addLineFlowCode(`${i} = ${o}`,this);const u=r.node.context({assign:!0}).build(e);for(let t=0;t{const s=r.type;let i;return i="pointer"===s?"&"+t.build(e):t.build(e,s),i};if(Array.isArray(i)){if(i.length>s.length)console.error("THREE.TSL: The number of provided parameters exceeds the expected number of inputs in 'Fn()'."),i.length=s.length;else if(i.length(t=t.length>1||t[0]&&!0===t[0].isNode?Fi(t):Li(t[0]),Pi(new ea(Pi(e),t)));ii("call",ta);class ra extends js{static get type(){return"OperatorNode"}constructor(e,t,r,...s){if(super(),s.length>0){let i=new ra(e,t,r);for(let t=0;t>"===r||"<<"===r)return e.getIntegerType(n);if("!"===r||"=="===r||"!="===r||"&&"===r||"||"===r||"^^"===r)return"bool";if("<"===r||">"===r||"<="===r||">="===r){const r=t?e.getTypeLength(t):Math.max(e.getTypeLength(n),e.getTypeLength(a));return r>1?`bvec${r}`:"bool"}if(e.isMatrix(n)){if("float"===a)return n;if(e.isVector(a))return e.getVectorFromMatrix(n);if(e.isMatrix(a))return n}else if(e.isMatrix(a)){if("float"===n)return a;if(e.isVector(n))return e.getVectorFromMatrix(a)}return e.getTypeLength(a)>e.getTypeLength(n)?a:n}generate(e,t){const r=this.op,s=this.aNode,i=this.bNode,n=this.getNodeType(e,t);let a=null,o=null;"void"!==n?(a=s.getNodeType(e),o=void 0!==i?i.getNodeType(e):null,"<"===r||">"===r||"<="===r||">="===r||"=="===r||"!="===r?e.isVector(a)?o=a:a!==o&&(a=o="float"):">>"===r||"<<"===r?(a=n,o=e.changeComponentType(o,"uint")):"%"===r?(a=n,o=e.isInteger(a)&&e.isInteger(o)?o:a):e.isMatrix(a)?"float"===o?o="float":e.isVector(o)?o=e.getVectorFromMatrix(a):e.isMatrix(o)||(a=o=n):a=e.isMatrix(o)?"float"===a?"float":e.isVector(a)?e.getVectorFromMatrix(o):o=n:o=n):a=o=n;const u=s.build(e,a),d=void 0!==i?i.build(e,o):null,c=e.getTypeLength(t),h=e.getFunctionOperator(r);if("void"!==t){const s=e.renderer.coordinateSystem===l;if("=="===r)return s?c>1?e.format(`${e.getMethod("equal",t)}( ${u}, ${d} )`,n,t):e.format(`( ${u} ${r} ${d} )`,n,t):c>1||!e.isVector(a)?e.format(`( ${u} == ${d} )`,n,t):e.format(`all( ${u} == ${d} )`,n,t);if("<"===r&&c>1)return s?e.format(`${e.getMethod("lessThan",t)}( ${u}, ${d} )`,n,t):e.format(`( ${u} < ${d} )`,n,t);if("<="===r&&c>1)return s?e.format(`${e.getMethod("lessThanEqual",t)}( ${u}, ${d} )`,n,t):e.format(`( ${u} <= ${d} )`,n,t);if(">"===r&&c>1)return s?e.format(`${e.getMethod("greaterThan",t)}( ${u}, ${d} )`,n,t):e.format(`( ${u} > ${d} )`,n,t);if(">="===r&&c>1)return s?e.format(`${e.getMethod("greaterThanEqual",t)}( ${u}, ${d} )`,n,t):e.format(`( ${u} >= ${d} )`,n,t);if("%"===r)return e.isInteger(o)?e.format(`( ${u} % ${d} )`,n,t):e.format(`${e.getMethod("mod",n)}( ${u}, ${d} )`,n,t);if("!"===r||"~"===r)return e.format(`(${r}${u})`,a,t);if(h)return e.format(`${h}( ${u}, ${d} )`,n,t);if(e.isMatrix(a)&&"float"===o)return e.format(`( ${d} ${r} ${u} )`,n,t);if("float"===a&&e.isMatrix(o))return e.format(`${u} ${r} ${d}`,n,t);{let i=`( ${u} ${r} ${d} )`;return!s&&"bool"===n&&e.isVector(a)&&e.isVector(o)&&(i=`all${i}`),e.format(i,n,t)}}if("void"!==a)return h?e.format(`${h}( ${u}, ${d} )`,n,t):e.isMatrix(a)&&"float"===o?e.format(`${d} ${r} ${u}`,n,t):e.format(`${u} ${r} ${d}`,n,t)}serialize(e){super.serialize(e),e.op=this.op}deserialize(e){super.deserialize(e),this.op=e.op}}const sa=Bi(ra,"+").setParameterLength(2,1/0).setName("add"),ia=Bi(ra,"-").setParameterLength(2,1/0).setName("sub"),na=Bi(ra,"*").setParameterLength(2,1/0).setName("mul"),aa=Bi(ra,"/").setParameterLength(2,1/0).setName("div"),oa=Bi(ra,"%").setParameterLength(2).setName("mod"),ua=Bi(ra,"==").setParameterLength(2).setName("equal"),la=Bi(ra,"!=").setParameterLength(2).setName("notEqual"),da=Bi(ra,"<").setParameterLength(2).setName("lessThan"),ca=Bi(ra,">").setParameterLength(2).setName("greaterThan"),ha=Bi(ra,"<=").setParameterLength(2).setName("lessThanEqual"),pa=Bi(ra,">=").setParameterLength(2).setName("greaterThanEqual"),ga=Bi(ra,"&&").setParameterLength(2,1/0).setName("and"),ma=Bi(ra,"||").setParameterLength(2,1/0).setName("or"),fa=Bi(ra,"!").setParameterLength(1).setName("not"),ya=Bi(ra,"^^").setParameterLength(2).setName("xor"),xa=Bi(ra,"&").setParameterLength(2).setName("bitAnd"),ba=Bi(ra,"~").setParameterLength(2).setName("bitNot"),Ta=Bi(ra,"|").setParameterLength(2).setName("bitOr"),_a=Bi(ra,"^").setParameterLength(2).setName("bitXor"),va=Bi(ra,"<<").setParameterLength(2).setName("shiftLeft"),Na=Bi(ra,">>").setParameterLength(2).setName("shiftRight");ii("add",sa),ii("sub",ia),ii("mul",na),ii("div",aa),ii("mod",oa),ii("equal",ua),ii("notEqual",la),ii("lessThan",da),ii("greaterThan",ca),ii("lessThanEqual",ha),ii("greaterThanEqual",pa),ii("and",ga),ii("or",ma),ii("not",fa),ii("xor",ya),ii("bitAnd",xa),ii("bitNot",ba),ii("bitOr",Ta),ii("bitXor",_a),ii("shiftLeft",va),ii("shiftRight",Na);const Sa=(e,t)=>(console.warn('THREE.TSL: "remainder()" is deprecated. Use "mod( int( ... ) )" instead.'),oa(e,t)),Ea=(e,t)=>(console.warn('THREE.TSL: "modInt()" is deprecated. Use "mod( int( ... ) )" instead.'),oa(Hi(e),Hi(t)));ii("remainder",Sa),ii("modInt",Ea);class wa extends js{static get type(){return"MathNode"}constructor(e,t,r=null,s=null){if(super(),(e===wa.MAX||e===wa.MIN)&&arguments.length>3){let i=new wa(e,t,r);for(let t=2;tn&&i>a?t:n>a?r:a>i?s:t}getNodeType(e){const t=this.method;return t===wa.LENGTH||t===wa.DISTANCE||t===wa.DOT?"float":t===wa.CROSS?"vec3":t===wa.ALL||t===wa.ANY?"bool":t===wa.EQUALS?e.changeComponentType(this.aNode.getNodeType(e),"bool"):this.getInputType(e)}generate(e,t){let r=this.method;const s=this.getNodeType(e),i=this.getInputType(e),n=this.aNode,a=this.bNode,o=this.cNode,u=e.renderer.coordinateSystem;if(r===wa.TRANSFORM_DIRECTION){let r=n,s=a;e.isMatrix(r.getNodeType(e))?s=tn(Qi(s),0):r=tn(Qi(r),0);const i=na(r,s).xyz;return $a(i).build(e,t)}if(r===wa.NEGATE)return e.format("( - "+n.build(e,i)+" )",s,t);if(r===wa.ONE_MINUS)return ia(1,n).build(e,t);if(r===wa.RECIPROCAL)return aa(1,n).build(e,t);if(r===wa.DIFFERENCE)return Qa(ia(n,a)).build(e,t);{const c=[];return r===wa.CROSS?c.push(n.build(e,s),a.build(e,s)):u===l&&r===wa.STEP?c.push(n.build(e,1===e.getTypeLength(n.getNodeType(e))?"float":i),a.build(e,i)):u!==l||r!==wa.MIN&&r!==wa.MAX?r===wa.REFRACT?c.push(n.build(e,i),a.build(e,i),o.build(e,"float")):r===wa.MIX?c.push(n.build(e,i),a.build(e,i),o.build(e,1===e.getTypeLength(o.getNodeType(e))?"float":i)):(u===d&&r===wa.ATAN&&null!==a&&(r="atan2"),c.push(n.build(e,i)),null!==a&&c.push(a.build(e,i)),null!==o&&c.push(o.build(e,i))):c.push(n.build(e,i),a.build(e,1===e.getTypeLength(a.getNodeType(e))?"float":i)),e.format(`${e.getMethod(r,s)}( ${c.join(", ")} )`,s,t)}}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}wa.ALL="all",wa.ANY="any",wa.RADIANS="radians",wa.DEGREES="degrees",wa.EXP="exp",wa.EXP2="exp2",wa.LOG="log",wa.LOG2="log2",wa.SQRT="sqrt",wa.INVERSE_SQRT="inversesqrt",wa.FLOOR="floor",wa.CEIL="ceil",wa.NORMALIZE="normalize",wa.FRACT="fract",wa.SIN="sin",wa.COS="cos",wa.TAN="tan",wa.ASIN="asin",wa.ACOS="acos",wa.ATAN="atan",wa.ABS="abs",wa.SIGN="sign",wa.LENGTH="length",wa.NEGATE="negate",wa.ONE_MINUS="oneMinus",wa.DFDX="dFdx",wa.DFDY="dFdy",wa.ROUND="round",wa.RECIPROCAL="reciprocal",wa.TRUNC="trunc",wa.FWIDTH="fwidth",wa.TRANSPOSE="transpose",wa.BITCAST="bitcast",wa.EQUALS="equals",wa.MIN="min",wa.MAX="max",wa.STEP="step",wa.REFLECT="reflect",wa.DISTANCE="distance",wa.DIFFERENCE="difference",wa.DOT="dot",wa.CROSS="cross",wa.POW="pow",wa.TRANSFORM_DIRECTION="transformDirection",wa.MIX="mix",wa.CLAMP="clamp",wa.REFRACT="refract",wa.SMOOTHSTEP="smoothstep",wa.FACEFORWARD="faceforward";const Aa=$i(1e-6),Ra=$i(1e6),Ca=$i(Math.PI),Ma=$i(2*Math.PI),Pa=Bi(wa,wa.ALL).setParameterLength(1),La=Bi(wa,wa.ANY).setParameterLength(1),Fa=Bi(wa,wa.RADIANS).setParameterLength(1),Ba=Bi(wa,wa.DEGREES).setParameterLength(1),Ia=Bi(wa,wa.EXP).setParameterLength(1),Da=Bi(wa,wa.EXP2).setParameterLength(1),Va=Bi(wa,wa.LOG).setParameterLength(1),Ua=Bi(wa,wa.LOG2).setParameterLength(1),Oa=Bi(wa,wa.SQRT).setParameterLength(1),Ga=Bi(wa,wa.INVERSE_SQRT).setParameterLength(1),ka=Bi(wa,wa.FLOOR).setParameterLength(1),za=Bi(wa,wa.CEIL).setParameterLength(1),$a=Bi(wa,wa.NORMALIZE).setParameterLength(1),Ha=Bi(wa,wa.FRACT).setParameterLength(1),Wa=Bi(wa,wa.SIN).setParameterLength(1),ja=Bi(wa,wa.COS).setParameterLength(1),qa=Bi(wa,wa.TAN).setParameterLength(1),Xa=Bi(wa,wa.ASIN).setParameterLength(1),Ka=Bi(wa,wa.ACOS).setParameterLength(1),Ya=Bi(wa,wa.ATAN).setParameterLength(1,2),Qa=Bi(wa,wa.ABS).setParameterLength(1),Za=Bi(wa,wa.SIGN).setParameterLength(1),Ja=Bi(wa,wa.LENGTH).setParameterLength(1),eo=Bi(wa,wa.NEGATE).setParameterLength(1),to=Bi(wa,wa.ONE_MINUS).setParameterLength(1),ro=Bi(wa,wa.DFDX).setParameterLength(1),so=Bi(wa,wa.DFDY).setParameterLength(1),io=Bi(wa,wa.ROUND).setParameterLength(1),no=Bi(wa,wa.RECIPROCAL).setParameterLength(1),ao=Bi(wa,wa.TRUNC).setParameterLength(1),oo=Bi(wa,wa.FWIDTH).setParameterLength(1),uo=Bi(wa,wa.TRANSPOSE).setParameterLength(1),lo=Bi(wa,wa.BITCAST).setParameterLength(2),co=(e,t)=>(console.warn('THREE.TSL: "equals" is deprecated. Use "equal" inside a vector instead, like: "bvec*( equal( ... ) )"'),ua(e,t)),ho=Bi(wa,wa.MIN).setParameterLength(2,1/0),po=Bi(wa,wa.MAX).setParameterLength(2,1/0),go=Bi(wa,wa.STEP).setParameterLength(2),mo=Bi(wa,wa.REFLECT).setParameterLength(2),fo=Bi(wa,wa.DISTANCE).setParameterLength(2),yo=Bi(wa,wa.DIFFERENCE).setParameterLength(2),xo=Bi(wa,wa.DOT).setParameterLength(2),bo=Bi(wa,wa.CROSS).setParameterLength(2),To=Bi(wa,wa.POW).setParameterLength(2),_o=Bi(wa,wa.POW,2).setParameterLength(1),vo=Bi(wa,wa.POW,3).setParameterLength(1),No=Bi(wa,wa.POW,4).setParameterLength(1),So=Bi(wa,wa.TRANSFORM_DIRECTION).setParameterLength(2),Eo=e=>na(Za(e),To(Qa(e),1/3)),wo=e=>xo(e,e),Ao=Bi(wa,wa.MIX).setParameterLength(3),Ro=(e,t=0,r=1)=>Pi(new wa(wa.CLAMP,Pi(e),Pi(t),Pi(r))),Co=e=>Ro(e),Mo=Bi(wa,wa.REFRACT).setParameterLength(3),Po=Bi(wa,wa.SMOOTHSTEP).setParameterLength(3),Lo=Bi(wa,wa.FACEFORWARD).setParameterLength(3),Fo=Vi((([e])=>{const t=xo(e.xy,qi(12.9898,78.233)),r=oa(t,Ca);return Ha(Wa(r).mul(43758.5453))})),Bo=(e,t,r)=>Ao(t,r,e),Io=(e,t,r)=>Po(t,r,e),Do=(e,t)=>(console.warn('THREE.TSL: "atan2" is overloaded. Use "atan" instead.'),Ya(e,t)),Vo=Lo,Uo=Ga;ii("all",Pa),ii("any",La),ii("equals",co),ii("radians",Fa),ii("degrees",Ba),ii("exp",Ia),ii("exp2",Da),ii("log",Va),ii("log2",Ua),ii("sqrt",Oa),ii("inverseSqrt",Ga),ii("floor",ka),ii("ceil",za),ii("normalize",$a),ii("fract",Ha),ii("sin",Wa),ii("cos",ja),ii("tan",qa),ii("asin",Xa),ii("acos",Ka),ii("atan",Ya),ii("abs",Qa),ii("sign",Za),ii("length",Ja),ii("lengthSq",wo),ii("negate",eo),ii("oneMinus",to),ii("dFdx",ro),ii("dFdy",so),ii("round",io),ii("reciprocal",no),ii("trunc",ao),ii("fwidth",oo),ii("atan2",Do),ii("min",ho),ii("max",po),ii("step",go),ii("reflect",mo),ii("distance",fo),ii("dot",xo),ii("cross",bo),ii("pow",To),ii("pow2",_o),ii("pow3",vo),ii("pow4",No),ii("transformDirection",So),ii("mix",Bo),ii("clamp",Ro),ii("refract",Mo),ii("smoothstep",Io),ii("faceForward",Lo),ii("difference",yo),ii("saturate",Co),ii("cbrt",Eo),ii("transpose",uo),ii("rand",Fo);class Oo extends $s{static get type(){return"ConditionalNode"}constructor(e,t,r=null){super(),this.condNode=e,this.ifNode=t,this.elseNode=r}getNodeType(e){const{ifNode:t,elseNode:r}=e.getNodeProperties(this);if(void 0===t)return this.setup(e),this.getNodeType(e);const s=t.getNodeType(e);if(null!==r){const t=r.getNodeType(e);if(e.getTypeLength(t)>e.getTypeLength(s))return t}return s}setup(e){const t=this.condNode.cache(),r=this.ifNode.cache(),s=this.elseNode?this.elseNode.cache():null,i=e.context.nodeBlock;e.getDataFromNode(r).parentNodeBlock=i,null!==s&&(e.getDataFromNode(s).parentNodeBlock=i);const n=e.getNodeProperties(this);n.condNode=t,n.ifNode=r.context({nodeBlock:r}),n.elseNode=s?s.context({nodeBlock:s}):null}generate(e,t){const r=this.getNodeType(e),s=e.getDataFromNode(this);if(void 0!==s.nodeProperty)return s.nodeProperty;const{condNode:i,ifNode:n,elseNode:a}=e.getNodeProperties(this),o=e.currentFunctionNode,u="void"!==t,l=u?vn(r).build(e):"";s.nodeProperty=l;const d=i.build(e,"bool");e.addFlowCode(`\n${e.tab}if ( ${d} ) {\n\n`).addFlowTab();let c=n.build(e,r);if(c&&(u?c=l+" = "+c+";":(c="return "+c+";",null===o&&(console.warn("THREE.TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values."),c="// "+c))),e.removeFlowTab().addFlowCode(e.tab+"\t"+c+"\n\n"+e.tab+"}"),null!==a){e.addFlowCode(" else {\n\n").addFlowTab();let t=a.build(e,r);t&&(u?t=l+" = "+t+";":(t="return "+t+";",null===o&&(console.warn("THREE.TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values."),t="// "+t))),e.removeFlowTab().addFlowCode(e.tab+"\t"+t+"\n\n"+e.tab+"}\n\n")}else e.addFlowCode("\n\n");return e.format(l,r,t)}}const Go=Bi(Oo).setParameterLength(2,3);ii("select",Go);const ko=(...e)=>(console.warn("THREE.TSL: cond() has been renamed to select()."),Go(...e));ii("cond",ko);class zo extends $s{static get type(){return"ContextNode"}constructor(e,t={}){super(),this.isContextNode=!0,this.node=e,this.value=t}getScope(){return this.node.getScope()}getNodeType(e){return this.node.getNodeType(e)}analyze(e){this.node.build(e)}setup(e){const t=e.getContext();e.setContext({...e.context,...this.value});const r=this.node.build(e);return e.setContext(t),r}generate(e,t){const r=e.getContext();e.setContext({...e.context,...this.value});const s=this.node.build(e,t);return e.setContext(r),s}}const $o=Bi(zo).setParameterLength(1,2),Ho=(e,t)=>$o(e,{label:t});ii("context",$o),ii("label",Ho);class Wo extends $s{static get type(){return"VarNode"}constructor(e,t=null,r=!1){super(),this.node=e,this.name=t,this.global=!0,this.isVarNode=!0,this.readOnly=r}getMemberType(e,t){return this.node.getMemberType(e,t)}getElementType(e){return this.node.getElementType(e)}getNodeType(e){return this.node.getNodeType(e)}generate(e){const{node:t,name:r,readOnly:s}=this,{renderer:i}=e,n=!0===i.backend.isWebGPUBackend;let a=!1,o=!1;s&&(a=e.isDeterministic(t),o=n?s:a);const u=e.getVectorType(this.getNodeType(e)),l=t.build(e,u),d=e.getVarFromNode(this,r,u,void 0,o),c=e.getPropertyName(d);let h=c;if(o)if(n)h=a?`const ${c}`:`let ${c}`;else{const r=e.getArrayCount(t);h=`const ${e.getVar(d.type,c,r)}`}return e.addLineFlowCode(`${h} = ${l}`,this),c}}const jo=Bi(Wo),qo=(e,t=null)=>jo(e,t).append(),Xo=(e,t=null)=>jo(e,t,!0).append();ii("toVar",qo),ii("toConst",Xo);const Ko=e=>(console.warn('TSL: "temp( node )" is deprecated. Use "Var( node )" or "node.toVar()" instead.'),jo(e));ii("temp",Ko);class Yo extends $s{static get type(){return"VaryingNode"}constructor(e,t=null){super(),this.node=e,this.name=t,this.isVaryingNode=!0}isGlobal(){return!0}getHash(e){return this.name||super.getHash(e)}getNodeType(e){return this.node.getNodeType(e)}setupVarying(e){const t=e.getNodeProperties(this);let r=t.varying;if(void 0===r){const s=this.name,i=this.getNodeType(e);t.varying=r=e.getVaryingFromNode(this,s,i),t.node=this.node}return r.needsInterpolation||(r.needsInterpolation="fragment"===e.shaderStage),r}setup(e){this.setupVarying(e)}analyze(e){return this.setupVarying(e),this.node.analyze(e)}generate(e){const t=e.getNodeProperties(this),r=this.setupVarying(e),s="fragment"===e.shaderStage&&!0===t.reassignPosition&&e.context.needsPositionReassign;if(void 0===t.propertyName||s){const i=this.getNodeType(e),n=e.getPropertyName(r,Bs.VERTEX);e.flowNodeFromShaderStage(Bs.VERTEX,this.node,i,n),t.propertyName=n,s?t.reassignPosition=!1:void 0===t.reassignPosition&&e.context.isPositionNodeInput&&(t.reassignPosition=!0)}return e.getPropertyName(r)}}const Qo=Bi(Yo).setParameterLength(1,2),Zo=e=>Qo(e);ii("toVarying",Qo),ii("toVertexStage",Zo),ii("varying",((...e)=>(console.warn("THREE.TSL: .varying() has been renamed to .toVarying()."),Qo(...e)))),ii("vertexStage",((...e)=>(console.warn("THREE.TSL: .vertexStage() has been renamed to .toVertexStage()."),Qo(...e))));const Jo=Vi((([e])=>{const t=e.mul(.9478672986).add(.0521327014).pow(2.4),r=e.mul(.0773993808),s=e.lessThanEqual(.04045);return Ao(t,r,s)})).setLayout({name:"sRGBTransferEOTF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),eu=Vi((([e])=>{const t=e.pow(.41666).mul(1.055).sub(.055),r=e.mul(12.92),s=e.lessThanEqual(.0031308);return Ao(t,r,s)})).setLayout({name:"sRGBTransferOETF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),tu="WorkingColorSpace",ru="OutputColorSpace";class su extends js{static get type(){return"ColorSpaceNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this.source=t,this.target=r}resolveColorSpace(e,t){return t===tu?c.workingColorSpace:t===ru?e.context.outputColorSpace||e.renderer.outputColorSpace:t}setup(e){const{colorNode:t}=this,r=this.resolveColorSpace(e,this.source),s=this.resolveColorSpace(e,this.target);let i=t;return!1!==c.enabled&&r!==s&&r&&s?(c.getTransfer(r)===h&&(i=tn(Jo(i.rgb),i.a)),c.getPrimaries(r)!==c.getPrimaries(s)&&(i=tn(on(c._getMatrix(new n,r,s)).mul(i.rgb),i.a)),c.getTransfer(s)===h&&(i=tn(eu(i.rgb),i.a)),i):i}}const iu=e=>Pi(new su(Pi(e),tu,ru)),nu=e=>Pi(new su(Pi(e),ru,tu)),au=(e,t)=>Pi(new su(Pi(e),tu,t)),ou=(e,t)=>Pi(new su(Pi(e),t,tu));ii("toOutputColorSpace",iu),ii("toWorkingColorSpace",nu),ii("workingToColorSpace",au),ii("colorSpaceToWorking",ou);let uu=class extends Hs{static get type(){return"ReferenceElementNode"}constructor(e,t){super(e,t),this.referenceNode=e,this.isReferenceElementNode=!0}getNodeType(){return this.referenceNode.uniformType}generate(e){const t=super.generate(e),r=this.referenceNode.getNodeType(),s=this.getNodeType();return e.format(t,r,s)}};class lu extends $s{static get type(){return"ReferenceBaseNode"}constructor(e,t,r=null,s=null){super(),this.property=e,this.uniformType=t,this.object=r,this.count=s,this.properties=e.split("."),this.reference=r,this.node=null,this.group=null,this.updateType=Is.OBJECT}setGroup(e){return this.group=e,this}element(e){return Pi(new uu(this,Pi(e)))}setNodeType(e){const t=Tn(null,e).getSelf();null!==this.group&&t.setGroup(this.group),this.node=t}getNodeType(e){return null===this.node&&(this.updateReference(e),this.updateValue()),this.node.getNodeType(e)}getValueFromReference(e=this.reference){const{properties:t}=this;let r=e[t[0]];for(let e=1;ePi(new du(e,t,r));class hu extends js{static get type(){return"ToneMappingNode"}constructor(e,t=gu,r=null){super("vec3"),this.toneMapping=e,this.exposureNode=t,this.colorNode=r}customCacheKey(){return Ts(this.toneMapping)}setup(e){const t=this.colorNode||e.context.color,r=this.toneMapping;if(r===p)return t;let s=null;const i=e.renderer.library.getToneMappingFunction(r);return null!==i?s=tn(i(t.rgb,this.exposureNode),t.a):(console.error("ToneMappingNode: Unsupported Tone Mapping configuration.",r),s=t),s}}const pu=(e,t,r)=>Pi(new hu(e,Pi(t),Pi(r))),gu=cu("toneMappingExposure","float");ii("toneMapping",((e,t,r)=>pu(t,r,e)));class mu extends Zs{static get type(){return"BufferAttributeNode"}constructor(e,t=null,r=0,s=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferStride=r,this.bufferOffset=s,this.usage=g,this.instanced=!1,this.attribute=null,this.global=!0,e&&!0===e.isBufferAttribute&&(this.attribute=e,this.usage=e.usage,this.instanced=e.isInstancedBufferAttribute)}getHash(e){if(0===this.bufferStride&&0===this.bufferOffset){let t=e.globalCache.getData(this.value);return void 0===t&&(t={node:this},e.globalCache.setData(this.value,t)),t.node.uuid}return this.uuid}getNodeType(e){return null===this.bufferType&&(this.bufferType=e.getTypeFromAttribute(this.attribute)),this.bufferType}setup(e){if(null!==this.attribute)return;const t=this.getNodeType(e),r=this.value,s=e.getTypeLength(t),i=this.bufferStride||s,n=this.bufferOffset,a=!0===r.isInterleavedBuffer?r:new m(r,i),o=new f(a,s,n);a.setUsage(this.usage),this.attribute=o,this.attribute.isInstancedBufferAttribute=this.instanced}generate(e){const t=this.getNodeType(e),r=e.getBufferAttributeFromNode(this,t),s=e.getPropertyName(r);let i=null;if("vertex"===e.shaderStage||"compute"===e.shaderStage)this.name=s,i=s;else{i=Qo(this).build(e,t)}return i}getInputType(){return"bufferAttribute"}setUsage(e){return this.usage=e,this.attribute&&!0===this.attribute.isBufferAttribute&&(this.attribute.usage=e),this}setInstanced(e){return this.instanced=e,this}}const fu=(e,t=null,r=0,s=0)=>Pi(new mu(e,t,r,s)),yu=(e,t=null,r=0,s=0)=>fu(e,t,r,s).setUsage(y),xu=(e,t=null,r=0,s=0)=>fu(e,t,r,s).setInstanced(!0),bu=(e,t=null,r=0,s=0)=>yu(e,t,r,s).setInstanced(!0);ii("toAttribute",(e=>fu(e.value)));class Tu extends $s{static get type(){return"ComputeNode"}constructor(e,t,r=[64]){super("void"),this.isComputeNode=!0,this.computeNode=e,this.count=t,this.workgroupSize=r,this.dispatchCount=0,this.version=1,this.name="",this.updateBeforeType=Is.OBJECT,this.onInitFunction=null,this.updateDispatchCount()}dispose(){this.dispatchEvent({type:"dispose"})}label(e){return this.name=e,this}updateDispatchCount(){const{count:e,workgroupSize:t}=this;let r=t[0];for(let e=1;ePi(new Tu(Pi(e),t,r));ii("compute",_u);class vu extends $s{static get type(){return"CacheNode"}constructor(e,t=!0){super(),this.node=e,this.parent=t,this.isCacheNode=!0}getNodeType(e){const t=e.getCache(),r=e.getCacheFromNode(this,this.parent);e.setCache(r);const s=this.node.getNodeType(e);return e.setCache(t),s}build(e,...t){const r=e.getCache(),s=e.getCacheFromNode(this,this.parent);e.setCache(s);const i=this.node.build(e,...t);return e.setCache(r),i}}const Nu=(e,t)=>Pi(new vu(Pi(e),t));ii("cache",Nu);class Su extends $s{static get type(){return"BypassNode"}constructor(e,t){super(),this.isBypassNode=!0,this.outputNode=e,this.callNode=t}getNodeType(e){return this.outputNode.getNodeType(e)}generate(e){const t=this.callNode.build(e,"void");return""!==t&&e.addLineFlowCode(t,this),this.outputNode.build(e)}}const Eu=Bi(Su).setParameterLength(2);ii("bypass",Eu);class wu extends $s{static get type(){return"RemapNode"}constructor(e,t,r,s=$i(0),i=$i(1)){super(),this.node=e,this.inLowNode=t,this.inHighNode=r,this.outLowNode=s,this.outHighNode=i,this.doClamp=!0}setup(){const{node:e,inLowNode:t,inHighNode:r,outLowNode:s,outHighNode:i,doClamp:n}=this;let a=e.sub(t).div(r.sub(t));return!0===n&&(a=a.clamp()),a.mul(i.sub(s)).add(s)}}const Au=Bi(wu,null,null,{doClamp:!1}).setParameterLength(3,5),Ru=Bi(wu).setParameterLength(3,5);ii("remap",Au),ii("remapClamp",Ru);class Cu extends $s{static get type(){return"ExpressionNode"}constructor(e="",t="void"){super(t),this.snippet=e}generate(e,t){const r=this.getNodeType(e),s=this.snippet;if("void"!==r)return e.format(s,r,t);e.addLineFlowCode(s,this)}}const Mu=Bi(Cu).setParameterLength(1,2),Pu=e=>(e?Go(e,Mu("discard")):Mu("discard")).append();ii("discard",Pu);class Lu extends js{static get type(){return"RenderOutputNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this.toneMapping=t,this.outputColorSpace=r,this.isRenderOutputNode=!0}setup({context:e}){let t=this.colorNode||e.color;const r=(null!==this.toneMapping?this.toneMapping:e.toneMapping)||p,s=(null!==this.outputColorSpace?this.outputColorSpace:e.outputColorSpace)||x;return r!==p&&(t=t.toneMapping(r)),s!==x&&s!==c.workingColorSpace&&(t=t.workingToColorSpace(s)),t}}const Fu=(e,t=null,r=null)=>Pi(new Lu(Pi(e),t,r));ii("renderOutput",Fu);class Bu extends js{static get type(){return"DebugNode"}constructor(e,t=null){super(),this.node=e,this.callback=t}getNodeType(e){return this.node.getNodeType(e)}setup(e){return this.node.build(e)}analyze(e){return this.node.build(e)}generate(e){const t=this.callback,r=this.node.build(e);let s="";return s+="// #--- TSL Debug ---#\n",s+=e.flow.code.replace(/^\t/gm,"")+"\n",s+="/* ... */ "+r+" /* ... */\n",s+="// #-----------------#\n",null!==t?t(s):console.log(s),r}}const Iu=(e,t=null)=>Pi(new Bu(Pi(e),t));ii("debug",Iu);class Du extends $s{static get type(){return"AttributeNode"}constructor(e,t=null){super(t),this.global=!0,this._attributeName=e}getHash(e){return this.getAttributeName(e)}getNodeType(e){let t=this.nodeType;if(null===t){const r=this.getAttributeName(e);if(e.hasGeometryAttribute(r)){const s=e.geometry.getAttribute(r);t=e.getTypeFromAttribute(s)}else t="float"}return t}setAttributeName(e){return this._attributeName=e,this}getAttributeName(){return this._attributeName}generate(e){const t=this.getAttributeName(e),r=this.getNodeType(e);if(!0===e.hasGeometryAttribute(t)){const s=e.geometry.getAttribute(t),i=e.getTypeFromAttribute(s),n=e.getAttribute(t,i);if("vertex"===e.shaderStage)return e.format(n.name,i,r);return Qo(this).build(e,r)}return console.warn(`AttributeNode: Vertex attribute "${t}" not found on geometry.`),e.generateConst(r)}serialize(e){super.serialize(e),e.global=this.global,e._attributeName=this._attributeName}deserialize(e){super.deserialize(e),this.global=e.global,this._attributeName=e._attributeName}}const Vu=(e,t)=>Pi(new Du(e,t)),Uu=(e=0)=>Vu("uv"+(e>0?e:""),"vec2");class Ou extends $s{static get type(){return"TextureSizeNode"}constructor(e,t=null){super("uvec2"),this.isTextureSizeNode=!0,this.textureNode=e,this.levelNode=t}generate(e,t){const r=this.textureNode.build(e,"property"),s=null===this.levelNode?"0":this.levelNode.build(e,"int");return e.format(`${e.getMethod("textureDimensions")}( ${r}, ${s} )`,this.getNodeType(e),t)}}const Gu=Bi(Ou).setParameterLength(1,2);class ku extends bn{static get type(){return"MaxMipLevelNode"}constructor(e){super(0),this._textureNode=e,this.updateType=Is.FRAME}get textureNode(){return this._textureNode}get texture(){return this._textureNode.value}update(){const e=this.texture,t=e.images,r=t&&t.length>0?t[0]&&t[0].image||t[0]:e.image;if(r&&void 0!==r.width){const{width:e,height:t}=r;this.value=Math.log2(Math.max(e,t))}}}const zu=Bi(ku).setParameterLength(1);class $u extends bn{static get type(){return"TextureNode"}constructor(e,t=null,r=null,s=null){super(e),this.isTextureNode=!0,this.uvNode=t,this.levelNode=r,this.biasNode=s,this.compareNode=null,this.depthNode=null,this.gradNode=null,this.sampler=!0,this.updateMatrix=!1,this.updateType=Is.NONE,this.referenceNode=null,this._value=e,this._matrixUniform=null,this.setUpdateMatrix(null===t)}set value(e){this.referenceNode?this.referenceNode.value=e:this._value=e}get value(){return this.referenceNode?this.referenceNode.value:this._value}getUniformHash(){return this.value.uuid}getNodeType(){return!0===this.value.isDepthTexture?"float":this.value.type===b?"uvec4":this.value.type===T?"ivec4":"vec4"}getInputType(){return"texture"}getDefaultUV(){return Uu(this.value.channel)}updateReference(){return this.value}getTransformedUV(e){return null===this._matrixUniform&&(this._matrixUniform=Tn(this.value.matrix)),this._matrixUniform.mul(Qi(e,1)).xy}setUpdateMatrix(e){return this.updateMatrix=e,this.updateType=e?Is.RENDER:Is.NONE,this}setupUV(e,t){const r=this.value;return e.isFlipY()&&(r.image instanceof ImageBitmap&&!0===r.flipY||!0===r.isRenderTargetTexture||!0===r.isFramebufferTexture||!0===r.isDepthTexture)&&(t=this.sampler?t.flipY():t.setY(Hi(Gu(this,this.levelNode).y).sub(t.y).sub(1))),t}setup(e){const t=e.getNodeProperties(this);t.referenceNode=this.referenceNode;const r=this.value;if(!r||!0!==r.isTexture)throw new Error("THREE.TSL: `texture( value )` function expects a valid instance of THREE.Texture().");let s=this.uvNode;null!==s&&!0!==e.context.forceUVContext||!e.context.getUV||(s=e.context.getUV(this)),s||(s=this.getDefaultUV()),!0===this.updateMatrix&&(s=this.getTransformedUV(s)),s=this.setupUV(e,s);let i=this.levelNode;null===i&&e.context.getTextureLevel&&(i=e.context.getTextureLevel(this)),t.uvNode=s,t.levelNode=i,t.biasNode=this.biasNode,t.compareNode=this.compareNode,t.gradNode=this.gradNode,t.depthNode=this.depthNode}generateUV(e,t){return t.build(e,!0===this.sampler?"vec2":"ivec2")}generateSnippet(e,t,r,s,i,n,a,o){const u=this.value;let l;return l=s?e.generateTextureLevel(u,t,r,s,n):i?e.generateTextureBias(u,t,r,i,n):o?e.generateTextureGrad(u,t,r,o,n):a?e.generateTextureCompare(u,t,r,a,n):!1===this.sampler?e.generateTextureLoad(u,t,r,n):e.generateTexture(u,t,r,n),l}generate(e,t){const r=this.value,s=e.getNodeProperties(this),i=super.generate(e,"property");if(/^sampler/.test(t))return i+"_sampler";if(e.isReference(t))return i;{const n=e.getDataFromNode(this);let a=n.propertyName;if(void 0===a){const{uvNode:t,levelNode:r,biasNode:o,compareNode:u,depthNode:l,gradNode:d}=s,c=this.generateUV(e,t),h=r?r.build(e,"float"):null,p=o?o.build(e,"float"):null,g=l?l.build(e,"int"):null,m=u?u.build(e,"float"):null,f=d?[d[0].build(e,"vec2"),d[1].build(e,"vec2")]:null,y=e.getVarFromNode(this);a=e.getPropertyName(y);const x=this.generateSnippet(e,i,c,h,p,g,m,f);e.addLineFlowCode(`${a} = ${x}`,this),n.snippet=x,n.propertyName=a}let o=a;const u=this.getNodeType(e);return e.needsToWorkingColorSpace(r)&&(o=ou(Mu(o,u),r.colorSpace).setup(e).build(e,u)),e.format(o,u,t)}}setSampler(e){return this.sampler=e,this}getSampler(){return this.sampler}uv(e){return console.warn("THREE.TextureNode: .uv() has been renamed. Use .sample() instead."),this.sample(e)}sample(e){const t=this.clone();return t.uvNode=Pi(e),t.referenceNode=this.getSelf(),Pi(t)}blur(e){const t=this.clone();t.biasNode=Pi(e).mul(zu(t)),t.referenceNode=this.getSelf();const r=t.value;return(r&&!1===r.generateMipmaps||r.minFilter===_||r.magFilter===_)&&(console.warn("THREE.TSL: texture().blur() requires mipmaps and sampling. Use .generateMipmaps=true and .minFilter/.magFilter=THREE.LinearFilter in the Texture."),t.biasNode=null),Pi(t)}level(e){const t=this.clone();return t.levelNode=Pi(e),t.referenceNode=this.getSelf(),Pi(t)}size(e){return Gu(this,e)}bias(e){const t=this.clone();return t.biasNode=Pi(e),t.referenceNode=this.getSelf(),Pi(t)}compare(e){const t=this.clone();return t.compareNode=Pi(e),t.referenceNode=this.getSelf(),Pi(t)}grad(e,t){const r=this.clone();return r.gradNode=[Pi(e),Pi(t)],r.referenceNode=this.getSelf(),Pi(r)}depth(e){const t=this.clone();return t.depthNode=Pi(e),t.referenceNode=this.getSelf(),Pi(t)}serialize(e){super.serialize(e),e.value=this.value.toJSON(e.meta).uuid,e.sampler=this.sampler,e.updateMatrix=this.updateMatrix,e.updateType=this.updateType}deserialize(e){super.deserialize(e),this.value=e.meta.textures[e.value],this.sampler=e.sampler,this.updateMatrix=e.updateMatrix,this.updateType=e.updateType}update(){const e=this.value,t=this._matrixUniform;null!==t&&(t.value=e.matrix),!0===e.matrixAutoUpdate&&e.updateMatrix()}clone(){const e=new this.constructor(this.value,this.uvNode,this.levelNode,this.biasNode);return e.sampler=this.sampler,e}}const Hu=Bi($u).setParameterLength(1,4),Wu=(...e)=>Hu(...e).setSampler(!1);class ju extends bn{static get type(){return"BufferNode"}constructor(e,t,r=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferCount=r}getElementType(e){return this.getNodeType(e)}getInputType(){return"buffer"}}const qu=(e,t,r)=>Pi(new ju(e,t,r));class Xu extends Hs{static get type(){return"UniformArrayElementNode"}constructor(e,t){super(e,t),this.isArrayBufferElementNode=!0}generate(e){const t=super.generate(e),r=this.getNodeType(),s=this.node.getPaddedType();return e.format(t,s,r)}}class Ku extends ju{static get type(){return"UniformArrayNode"}constructor(e,t=null){super(null),this.array=e,this.elementType=null===t?Rs(e[0]):t,this.paddedType=this.getPaddedType(),this.updateType=Is.RENDER,this.isArrayBufferNode=!0}getNodeType(){return this.paddedType}getElementType(){return this.elementType}getPaddedType(){const e=this.elementType;let t="vec4";return"mat2"===e?t="mat2":!0===/mat/.test(e)?t="mat4":"i"===e.charAt(0)?t="ivec4":"u"===e.charAt(0)&&(t="uvec4"),t}update(){const{array:e,value:t}=this,r=this.elementType;if("float"===r||"int"===r||"uint"===r)for(let r=0;rPi(new Ku(e,t)),Qu=Tn(0,"uint").setGroup(mn("cameraIndex")).toVarying("v_cameraIndex"),Zu=Tn("float").label("cameraNear").setGroup(yn).onRenderUpdate((({camera:e})=>e.near)),Ju=Tn("float").label("cameraFar").setGroup(yn).onRenderUpdate((({camera:e})=>e.far)),el=Vi((({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrix);t=Yu(r).setGroup(yn).label("cameraProjectionMatrices").element(Qu).toVar("cameraProjectionMatrix")}else t=Tn("mat4").label("cameraProjectionMatrix").setGroup(yn).onRenderUpdate((({camera:e})=>e.projectionMatrix));return t})).once()(),tl=Tn("mat4").label("cameraProjectionMatrixInverse").setGroup(yn).onRenderUpdate((({camera:e})=>e.projectionMatrixInverse)),rl=Vi((({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.matrixWorldInverse);t=Yu(r).setGroup(yn).label("cameraViewMatrices").element(Qu).toVar("cameraViewMatrix")}else t=Tn("mat4").label("cameraViewMatrix").setGroup(yn).onRenderUpdate((({camera:e})=>e.matrixWorldInverse));return t})).once()(),sl=Tn("mat4").label("cameraWorldMatrix").setGroup(yn).onRenderUpdate((({camera:e})=>e.matrixWorld)),il=Tn("mat3").label("cameraNormalMatrix").setGroup(yn).onRenderUpdate((({camera:e})=>e.normalMatrix)),nl=Tn(new r).label("cameraPosition").setGroup(yn).onRenderUpdate((({camera:e},t)=>t.value.setFromMatrixPosition(e.matrixWorld))),al=new v;class ol extends $s{static get type(){return"Object3DNode"}constructor(e,t=null){super(),this.scope=e,this.object3d=t,this.updateType=Is.OBJECT,this._uniformNode=new bn(null)}getNodeType(){const e=this.scope;return e===ol.WORLD_MATRIX?"mat4":e===ol.POSITION||e===ol.VIEW_POSITION||e===ol.DIRECTION||e===ol.SCALE?"vec3":e===ol.RADIUS?"float":void 0}update(e){const t=this.object3d,s=this._uniformNode,i=this.scope;if(i===ol.WORLD_MATRIX)s.value=t.matrixWorld;else if(i===ol.POSITION)s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld);else if(i===ol.SCALE)s.value=s.value||new r,s.value.setFromMatrixScale(t.matrixWorld);else if(i===ol.DIRECTION)s.value=s.value||new r,t.getWorldDirection(s.value);else if(i===ol.VIEW_POSITION){const i=e.camera;s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld),s.value.applyMatrix4(i.matrixWorldInverse)}else if(i===ol.RADIUS){const r=e.object.geometry;null===r.boundingSphere&&r.computeBoundingSphere(),al.copy(r.boundingSphere).applyMatrix4(t.matrixWorld),s.value=al.radius}}generate(e){const t=this.scope;return t===ol.WORLD_MATRIX?this._uniformNode.nodeType="mat4":t===ol.POSITION||t===ol.VIEW_POSITION||t===ol.DIRECTION||t===ol.SCALE?this._uniformNode.nodeType="vec3":t===ol.RADIUS&&(this._uniformNode.nodeType="float"),this._uniformNode.build(e)}serialize(e){super.serialize(e),e.scope=this.scope}deserialize(e){super.deserialize(e),this.scope=e.scope}}ol.WORLD_MATRIX="worldMatrix",ol.POSITION="position",ol.SCALE="scale",ol.VIEW_POSITION="viewPosition",ol.DIRECTION="direction",ol.RADIUS="radius";const ul=Bi(ol,ol.DIRECTION).setParameterLength(1),ll=Bi(ol,ol.WORLD_MATRIX).setParameterLength(1),dl=Bi(ol,ol.POSITION).setParameterLength(1),cl=Bi(ol,ol.SCALE).setParameterLength(1),hl=Bi(ol,ol.VIEW_POSITION).setParameterLength(1),pl=Bi(ol,ol.RADIUS).setParameterLength(1);class gl extends ol{static get type(){return"ModelNode"}constructor(e){super(e)}update(e){this.object3d=e.object,super.update(e)}}const ml=Ii(gl,gl.DIRECTION),fl=Ii(gl,gl.WORLD_MATRIX),yl=Ii(gl,gl.POSITION),xl=Ii(gl,gl.SCALE),bl=Ii(gl,gl.VIEW_POSITION),Tl=Ii(gl,gl.RADIUS),_l=Tn(new n).onObjectUpdate((({object:e},t)=>t.value.getNormalMatrix(e.matrixWorld))),vl=Tn(new a).onObjectUpdate((({object:e},t)=>t.value.copy(e.matrixWorld).invert())),Nl=Vi((e=>e.renderer.nodes.modelViewMatrix||Sl)).once()().toVar("modelViewMatrix"),Sl=rl.mul(fl),El=Vi((e=>(e.context.isHighPrecisionModelViewMatrix=!0,Tn("mat4").onObjectUpdate((({object:e,camera:t})=>e.modelViewMatrix.multiplyMatrices(t.matrixWorldInverse,e.matrixWorld)))))).once()().toVar("highpModelViewMatrix"),wl=Vi((e=>{const t=e.context.isHighPrecisionModelViewMatrix;return Tn("mat3").onObjectUpdate((({object:e,camera:r})=>(!0!==t&&e.modelViewMatrix.multiplyMatrices(r.matrixWorldInverse,e.matrixWorld),e.normalMatrix.getNormalMatrix(e.modelViewMatrix))))})).once()().toVar("highpModelNormalViewMatrix"),Al=Vu("position","vec3"),Rl=Al.toVarying("positionLocal"),Cl=Al.toVarying("positionPrevious"),Ml=fl.mul(Rl).xyz.toVarying("v_positionWorld").context({needsPositionReassign:!0}),Pl=Rl.transformDirection(fl).toVarying("v_positionWorldDirection").normalize().toVar("positionWorldDirection").context({needsPositionReassign:!0}),Ll=Vi((e=>e.context.setupPositionView()),"vec3").once()().toVarying("v_positionView").context({needsPositionReassign:!0}),Fl=Ll.negate().toVarying("v_positionViewDirection").normalize().toVar("positionViewDirection");class Bl extends $s{static get type(){return"FrontFacingNode"}constructor(){super("bool"),this.isFrontFacingNode=!0}generate(e){const{renderer:t,material:r}=e;return t.coordinateSystem===l&&r.side===N?"false":e.getFrontFacing()}}const Il=Ii(Bl),Dl=$i(Il).mul(2).sub(1),Vl=Vu("normal","vec3"),Ul=Vi((e=>!1===e.geometry.hasAttribute("normal")?(console.warn('THREE.TSL: Vertex attribute "normal" not found on geometry.'),Qi(0,1,0)):Vl),"vec3").once()().toVar("normalLocal"),Ol=Ll.dFdx().cross(Ll.dFdy()).normalize().toVar("normalFlat"),Gl=Vi((e=>{let t;return t=!0===e.material.flatShading?Ol:Qo(jl(Ul),"v_normalView").normalize(),t}),"vec3").once()().toVar("normalView"),kl=Qo(Gl.transformDirection(rl),"v_normalWorld").normalize().toVar("normalWorld"),zl=Vi((e=>e.context.setupNormal().context({getUV:null})),"vec3").once()().mul(Dl).toVar("transformedNormalView"),$l=zl.transformDirection(rl).toVar("transformedNormalWorld"),Hl=Vi((e=>e.context.setupClearcoatNormal().context({getUV:null})),"vec3").once()().mul(Dl).toVar("transformedClearcoatNormalView"),Wl=Vi((([e,t=fl])=>{const r=on(t),s=e.div(Qi(r[0].dot(r[0]),r[1].dot(r[1]),r[2].dot(r[2])));return r.mul(s).xyz})),jl=Vi((([e],t)=>{const r=t.renderer.nodes.modelNormalViewMatrix;if(null!==r)return r.transformDirection(e);const s=_l.mul(e);return rl.transformDirection(s)})),ql=new S,Xl=new a,Kl=Tn(0).onReference((({material:e})=>e)).onObjectUpdate((({material:e})=>e.refractionRatio)),Yl=Tn(1).onReference((({material:e})=>e)).onObjectUpdate((function({material:e,scene:t}){return e.envMap?e.envMapIntensity:t.environmentIntensity})),Ql=Tn(new a).onReference((function(e){return e.material})).onObjectUpdate((function({material:e,scene:t}){const r=null!==t.environment&&null===e.envMap?t.environmentRotation:e.envMapRotation;return r?(ql.copy(r),Xl.makeRotationFromEuler(ql)):Xl.identity(),Xl})),Zl=Fl.negate().reflect(zl),Jl=Fl.negate().refract(zl,Kl),ed=Zl.transformDirection(rl).toVar("reflectVector"),td=Jl.transformDirection(rl).toVar("reflectVector");class rd extends $u{static get type(){return"CubeTextureNode"}constructor(e,t=null,r=null,s=null){super(e,t,r,s),this.isCubeTextureNode=!0}getInputType(){return"cubeTexture"}getDefaultUV(){const e=this.value;return e.mapping===E?ed:e.mapping===w?td:(console.error('THREE.CubeTextureNode: Mapping "%s" not supported.',e.mapping),Qi(0,0,0))}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return e.renderer.coordinateSystem!==d&&r.isRenderTargetTexture||(t=Qi(t.x.negate(),t.yz)),Ql.mul(t)}generateUV(e,t){return t.build(e,"vec3")}}const sd=Bi(rd).setParameterLength(1,4).setName("cubeTexture");class id extends Hs{static get type(){return"ReferenceElementNode"}constructor(e,t){super(e,t),this.referenceNode=e,this.isReferenceElementNode=!0}getNodeType(){return this.referenceNode.uniformType}generate(e){const t=super.generate(e),r=this.referenceNode.getNodeType(),s=this.getNodeType();return e.format(t,r,s)}}class nd extends $s{static get type(){return"ReferenceNode"}constructor(e,t,r=null,s=null){super(),this.property=e,this.uniformType=t,this.object=r,this.count=s,this.properties=e.split("."),this.reference=r,this.node=null,this.group=null,this.name=null,this.updateType=Is.OBJECT}element(e){return Pi(new id(this,Pi(e)))}setGroup(e){return this.group=e,this}label(e){return this.name=e,this}setNodeType(e){let t=null;t=null!==this.count?qu(null,e,this.count):Array.isArray(this.getValueFromReference())?Yu(null,e):"texture"===e?Hu(null):"cubeTexture"===e?sd(null):Tn(null,e),null!==this.group&&t.setGroup(this.group),null!==this.name&&t.label(this.name),this.node=t.getSelf()}getNodeType(e){return null===this.node&&(this.updateReference(e),this.updateValue()),this.node.getNodeType(e)}getValueFromReference(e=this.reference){const{properties:t}=this;let r=e[t[0]];for(let e=1;ePi(new nd(e,t,r)),od=(e,t,r,s)=>Pi(new nd(e,t,s,r));class ud extends nd{static get type(){return"MaterialReferenceNode"}constructor(e,t,r=null){super(e,t,r),this.material=r,this.isMaterialReferenceNode=!0}updateReference(e){return this.reference=null!==this.material?this.material:e.material,this.reference}}const ld=(e,t,r=null)=>Pi(new ud(e,t,r)),dd=Vi((e=>(!1===e.geometry.hasAttribute("tangent")&&e.geometry.computeTangents(),Vu("tangent","vec4"))))(),cd=dd.xyz.toVar("tangentLocal"),hd=Nl.mul(tn(cd,0)).xyz.toVarying("v_tangentView").normalize().toVar("tangentView"),pd=hd.transformDirection(rl).toVarying("v_tangentWorld").normalize().toVar("tangentWorld"),gd=hd.toVar("transformedTangentView"),md=gd.transformDirection(rl).normalize().toVar("transformedTangentWorld"),fd=e=>e.mul(dd.w).xyz,yd=Qo(fd(Vl.cross(dd)),"v_bitangentGeometry").normalize().toVar("bitangentGeometry"),xd=Qo(fd(Ul.cross(cd)),"v_bitangentLocal").normalize().toVar("bitangentLocal"),bd=Qo(fd(Gl.cross(hd)),"v_bitangentView").normalize().toVar("bitangentView"),Td=Qo(fd(kl.cross(pd)),"v_bitangentWorld").normalize().toVar("bitangentWorld"),_d=fd(zl.cross(gd)).normalize().toVar("transformedBitangentView"),vd=_d.transformDirection(rl).normalize().toVar("transformedBitangentWorld"),Nd=on(hd,bd,Gl),Sd=Fl.mul(Nd),Ed=(()=>{let e=Un.cross(Fl);return e=e.cross(Un).normalize(),e=Ao(e,zl,Dn.mul(wn.oneMinus()).oneMinus().pow2().pow2()).normalize(),e})(),wd=Vi((e=>{const{eye_pos:t,surf_norm:r,mapN:s,uv:i}=e,n=t.dFdx(),a=t.dFdy(),o=i.dFdx(),u=i.dFdy(),l=r,d=a.cross(l),c=l.cross(n),h=d.mul(o.x).add(c.mul(u.x)),p=d.mul(o.y).add(c.mul(u.y)),g=h.dot(h).max(p.dot(p)),m=Dl.mul(g.inverseSqrt());return sa(h.mul(s.x,m),p.mul(s.y,m),l.mul(s.z)).normalize()}));class Ad extends js{static get type(){return"NormalMapNode"}constructor(e,t=null){super("vec3"),this.node=e,this.scaleNode=t,this.normalMapType=A}setup(e){const{normalMapType:t,scaleNode:r}=this;let s=this.node.mul(2).sub(1);null!==r&&(s=Qi(s.xy.mul(r),s.z));let i=null;if(t===R)i=jl(s);else if(t===A){i=!0===e.hasGeometryAttribute("tangent")?Nd.mul(s).normalize():wd({eye_pos:Ll,surf_norm:Gl,mapN:s,uv:Uu()})}return i}}const Rd=Bi(Ad).setParameterLength(1,2),Cd=Vi((({textureNode:e,bumpScale:t})=>{const r=t=>e.cache().context({getUV:e=>t(e.uvNode||Uu()),forceUVContext:!0}),s=$i(r((e=>e)));return qi($i(r((e=>e.add(e.dFdx())))).sub(s),$i(r((e=>e.add(e.dFdy())))).sub(s)).mul(t)})),Md=Vi((e=>{const{surf_pos:t,surf_norm:r,dHdxy:s}=e,i=t.dFdx().normalize(),n=r,a=t.dFdy().normalize().cross(n),o=n.cross(i),u=i.dot(a).mul(Dl),l=u.sign().mul(s.x.mul(a).add(s.y.mul(o)));return u.abs().mul(r).sub(l).normalize()}));class Pd extends js{static get type(){return"BumpMapNode"}constructor(e,t=null){super("vec3"),this.textureNode=e,this.scaleNode=t}setup(){const e=null!==this.scaleNode?this.scaleNode:1,t=Cd({textureNode:this.textureNode,bumpScale:e});return Md({surf_pos:Ll,surf_norm:Gl,dHdxy:t})}}const Ld=Bi(Pd).setParameterLength(1,2),Fd=new Map;class Bd extends $s{static get type(){return"MaterialNode"}constructor(e){super(),this.scope=e}getCache(e,t){let r=Fd.get(e);return void 0===r&&(r=ld(e,t),Fd.set(e,r)),r}getFloat(e){return this.getCache(e,"float")}getColor(e){return this.getCache(e,"color")}getTexture(e){return this.getCache("map"===e?"map":e+"Map","texture")}setup(e){const t=e.context.material,r=this.scope;let s=null;if(r===Bd.COLOR){const e=void 0!==t.color?this.getColor(r):Qi();s=t.map&&!0===t.map.isTexture?e.mul(this.getTexture("map")):e}else if(r===Bd.OPACITY){const e=this.getFloat(r);s=t.alphaMap&&!0===t.alphaMap.isTexture?e.mul(this.getTexture("alpha")):e}else if(r===Bd.SPECULAR_STRENGTH)s=t.specularMap&&!0===t.specularMap.isTexture?this.getTexture("specular").r:$i(1);else if(r===Bd.SPECULAR_INTENSITY){const e=this.getFloat(r);s=t.specularIntensityMap&&!0===t.specularIntensityMap.isTexture?e.mul(this.getTexture(r).a):e}else if(r===Bd.SPECULAR_COLOR){const e=this.getColor(r);s=t.specularColorMap&&!0===t.specularColorMap.isTexture?e.mul(this.getTexture(r).rgb):e}else if(r===Bd.ROUGHNESS){const e=this.getFloat(r);s=t.roughnessMap&&!0===t.roughnessMap.isTexture?e.mul(this.getTexture(r).g):e}else if(r===Bd.METALNESS){const e=this.getFloat(r);s=t.metalnessMap&&!0===t.metalnessMap.isTexture?e.mul(this.getTexture(r).b):e}else if(r===Bd.EMISSIVE){const e=this.getFloat("emissiveIntensity"),i=this.getColor(r).mul(e);s=t.emissiveMap&&!0===t.emissiveMap.isTexture?i.mul(this.getTexture(r)):i}else if(r===Bd.NORMAL)t.normalMap?(s=Rd(this.getTexture("normal"),this.getCache("normalScale","vec2")),s.normalMapType=t.normalMapType):s=t.bumpMap?Ld(this.getTexture("bump").r,this.getFloat("bumpScale")):Gl;else if(r===Bd.CLEARCOAT){const e=this.getFloat(r);s=t.clearcoatMap&&!0===t.clearcoatMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===Bd.CLEARCOAT_ROUGHNESS){const e=this.getFloat(r);s=t.clearcoatRoughnessMap&&!0===t.clearcoatRoughnessMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===Bd.CLEARCOAT_NORMAL)s=t.clearcoatNormalMap?Rd(this.getTexture(r),this.getCache(r+"Scale","vec2")):Gl;else if(r===Bd.SHEEN){const e=this.getColor("sheenColor").mul(this.getFloat("sheen"));s=t.sheenColorMap&&!0===t.sheenColorMap.isTexture?e.mul(this.getTexture("sheenColor").rgb):e}else if(r===Bd.SHEEN_ROUGHNESS){const e=this.getFloat(r);s=t.sheenRoughnessMap&&!0===t.sheenRoughnessMap.isTexture?e.mul(this.getTexture(r).a):e,s=s.clamp(.07,1)}else if(r===Bd.ANISOTROPY)if(t.anisotropyMap&&!0===t.anisotropyMap.isTexture){const e=this.getTexture(r);s=an(xc.x,xc.y,xc.y.negate(),xc.x).mul(e.rg.mul(2).sub(qi(1)).normalize().mul(e.b))}else s=xc;else if(r===Bd.IRIDESCENCE_THICKNESS){const e=ad("1","float",t.iridescenceThicknessRange);if(t.iridescenceThicknessMap){const i=ad("0","float",t.iridescenceThicknessRange);s=e.sub(i).mul(this.getTexture(r).g).add(i)}else s=e}else if(r===Bd.TRANSMISSION){const e=this.getFloat(r);s=t.transmissionMap?e.mul(this.getTexture(r).r):e}else if(r===Bd.THICKNESS){const e=this.getFloat(r);s=t.thicknessMap?e.mul(this.getTexture(r).g):e}else if(r===Bd.IOR)s=this.getFloat(r);else if(r===Bd.LIGHT_MAP)s=this.getTexture(r).rgb.mul(this.getFloat("lightMapIntensity"));else if(r===Bd.AO)s=this.getTexture(r).r.sub(1).mul(this.getFloat("aoMapIntensity")).add(1);else{const t=this.getNodeType(e);s=this.getCache(r,t)}return s}}Bd.ALPHA_TEST="alphaTest",Bd.COLOR="color",Bd.OPACITY="opacity",Bd.SHININESS="shininess",Bd.SPECULAR="specular",Bd.SPECULAR_STRENGTH="specularStrength",Bd.SPECULAR_INTENSITY="specularIntensity",Bd.SPECULAR_COLOR="specularColor",Bd.REFLECTIVITY="reflectivity",Bd.ROUGHNESS="roughness",Bd.METALNESS="metalness",Bd.NORMAL="normal",Bd.CLEARCOAT="clearcoat",Bd.CLEARCOAT_ROUGHNESS="clearcoatRoughness",Bd.CLEARCOAT_NORMAL="clearcoatNormal",Bd.EMISSIVE="emissive",Bd.ROTATION="rotation",Bd.SHEEN="sheen",Bd.SHEEN_ROUGHNESS="sheenRoughness",Bd.ANISOTROPY="anisotropy",Bd.IRIDESCENCE="iridescence",Bd.IRIDESCENCE_IOR="iridescenceIOR",Bd.IRIDESCENCE_THICKNESS="iridescenceThickness",Bd.IOR="ior",Bd.TRANSMISSION="transmission",Bd.THICKNESS="thickness",Bd.ATTENUATION_DISTANCE="attenuationDistance",Bd.ATTENUATION_COLOR="attenuationColor",Bd.LINE_SCALE="scale",Bd.LINE_DASH_SIZE="dashSize",Bd.LINE_GAP_SIZE="gapSize",Bd.LINE_WIDTH="linewidth",Bd.LINE_DASH_OFFSET="dashOffset",Bd.POINT_SIZE="size",Bd.DISPERSION="dispersion",Bd.LIGHT_MAP="light",Bd.AO="ao";const Id=Ii(Bd,Bd.ALPHA_TEST),Dd=Ii(Bd,Bd.COLOR),Vd=Ii(Bd,Bd.SHININESS),Ud=Ii(Bd,Bd.EMISSIVE),Od=Ii(Bd,Bd.OPACITY),Gd=Ii(Bd,Bd.SPECULAR),kd=Ii(Bd,Bd.SPECULAR_INTENSITY),zd=Ii(Bd,Bd.SPECULAR_COLOR),$d=Ii(Bd,Bd.SPECULAR_STRENGTH),Hd=Ii(Bd,Bd.REFLECTIVITY),Wd=Ii(Bd,Bd.ROUGHNESS),jd=Ii(Bd,Bd.METALNESS),qd=Ii(Bd,Bd.NORMAL),Xd=Ii(Bd,Bd.CLEARCOAT),Kd=Ii(Bd,Bd.CLEARCOAT_ROUGHNESS),Yd=Ii(Bd,Bd.CLEARCOAT_NORMAL),Qd=Ii(Bd,Bd.ROTATION),Zd=Ii(Bd,Bd.SHEEN),Jd=Ii(Bd,Bd.SHEEN_ROUGHNESS),ec=Ii(Bd,Bd.ANISOTROPY),tc=Ii(Bd,Bd.IRIDESCENCE),rc=Ii(Bd,Bd.IRIDESCENCE_IOR),sc=Ii(Bd,Bd.IRIDESCENCE_THICKNESS),ic=Ii(Bd,Bd.TRANSMISSION),nc=Ii(Bd,Bd.THICKNESS),ac=Ii(Bd,Bd.IOR),oc=Ii(Bd,Bd.ATTENUATION_DISTANCE),uc=Ii(Bd,Bd.ATTENUATION_COLOR),lc=Ii(Bd,Bd.LINE_SCALE),dc=Ii(Bd,Bd.LINE_DASH_SIZE),cc=Ii(Bd,Bd.LINE_GAP_SIZE),hc=Ii(Bd,Bd.LINE_WIDTH),pc=Ii(Bd,Bd.LINE_DASH_OFFSET),gc=Ii(Bd,Bd.POINT_SIZE),mc=Ii(Bd,Bd.DISPERSION),fc=Ii(Bd,Bd.LIGHT_MAP),yc=Ii(Bd,Bd.AO),xc=Tn(new t).onReference((function(e){return e.material})).onRenderUpdate((function({material:e}){this.value.set(e.anisotropy*Math.cos(e.anisotropyRotation),e.anisotropy*Math.sin(e.anisotropyRotation))})),bc=Vi((e=>e.context.setupModelViewProjection()),"vec4").once()().toVarying("v_modelViewProjection");class Tc extends $s{static get type(){return"IndexNode"}constructor(e){super("uint"),this.scope=e,this.isIndexNode=!0}generate(e){const t=this.getNodeType(e),r=this.scope;let s,i;if(r===Tc.VERTEX)s=e.getVertexIndex();else if(r===Tc.INSTANCE)s=e.getInstanceIndex();else if(r===Tc.DRAW)s=e.getDrawIndex();else if(r===Tc.INVOCATION_LOCAL)s=e.getInvocationLocalIndex();else if(r===Tc.INVOCATION_SUBGROUP)s=e.getInvocationSubgroupIndex();else{if(r!==Tc.SUBGROUP)throw new Error("THREE.IndexNode: Unknown scope: "+r);s=e.getSubgroupIndex()}if("vertex"===e.shaderStage||"compute"===e.shaderStage)i=s;else{i=Qo(this).build(e,t)}return i}}Tc.VERTEX="vertex",Tc.INSTANCE="instance",Tc.SUBGROUP="subgroup",Tc.INVOCATION_LOCAL="invocationLocal",Tc.INVOCATION_SUBGROUP="invocationSubgroup",Tc.DRAW="draw";const _c=Ii(Tc,Tc.VERTEX),vc=Ii(Tc,Tc.INSTANCE),Nc=Ii(Tc,Tc.SUBGROUP),Sc=Ii(Tc,Tc.INVOCATION_SUBGROUP),Ec=Ii(Tc,Tc.INVOCATION_LOCAL),wc=Ii(Tc,Tc.DRAW);class Ac extends $s{static get type(){return"InstanceNode"}constructor(e,t,r){super("void"),this.count=e,this.instanceMatrix=t,this.instanceColor=r,this.instanceMatrixNode=null,this.instanceColorNode=null,this.updateType=Is.FRAME,this.buffer=null,this.bufferColor=null}setup(e){const{count:t,instanceMatrix:r,instanceColor:s}=this;let{instanceMatrixNode:i,instanceColorNode:n}=this;if(null===i){if(t<=1e3)i=qu(r.array,"mat4",Math.max(t,1)).element(vc);else{const e=new C(r.array,16,1);this.buffer=e;const t=r.usage===y?bu:xu,s=[t(e,"vec4",16,0),t(e,"vec4",16,4),t(e,"vec4",16,8),t(e,"vec4",16,12)];i=un(...s)}this.instanceMatrixNode=i}if(s&&null===n){const e=new M(s.array,3),t=s.usage===y?bu:xu;this.bufferColor=e,n=Qi(t(e,"vec3",3,0)),this.instanceColorNode=n}const a=i.mul(Rl).xyz;if(Rl.assign(a),e.hasGeometryAttribute("normal")){const e=Wl(Ul,i);Ul.assign(e)}null!==this.instanceColorNode&&Nn("vec3","vInstanceColor").assign(this.instanceColorNode)}update(){this.instanceMatrix.usage!==y&&null!==this.buffer&&this.instanceMatrix.version!==this.buffer.version&&(this.buffer.version=this.instanceMatrix.version),this.instanceColor&&this.instanceColor.usage!==y&&null!==this.bufferColor&&this.instanceColor.version!==this.bufferColor.version&&(this.bufferColor.version=this.instanceColor.version)}}const Rc=Bi(Ac).setParameterLength(3);class Cc extends Ac{static get type(){return"InstancedMeshNode"}constructor(e){const{count:t,instanceMatrix:r,instanceColor:s}=e;super(t,r,s),this.instancedMesh=e}}const Mc=Bi(Cc).setParameterLength(1);class Pc extends $s{static get type(){return"BatchNode"}constructor(e){super("void"),this.batchMesh=e,this.batchingIdNode=null}setup(e){null===this.batchingIdNode&&(null===e.getDrawIndex()?this.batchingIdNode=vc:this.batchingIdNode=wc);const t=Vi((([e])=>{const t=Hi(Gu(Wu(this.batchMesh._indirectTexture),0).x),r=Hi(e).mod(t),s=Hi(e).div(t);return Wu(this.batchMesh._indirectTexture,Xi(r,s)).x})).setLayout({name:"getIndirectIndex",type:"uint",inputs:[{name:"id",type:"int"}]}),r=t(Hi(this.batchingIdNode)),s=this.batchMesh._matricesTexture,i=Hi(Gu(Wu(s),0).x),n=$i(r).mul(4).toInt().toVar(),a=n.mod(i),o=n.div(i),u=un(Wu(s,Xi(a,o)),Wu(s,Xi(a.add(1),o)),Wu(s,Xi(a.add(2),o)),Wu(s,Xi(a.add(3),o))),l=this.batchMesh._colorsTexture;if(null!==l){const e=Vi((([e])=>{const t=Hi(Gu(Wu(l),0).x),r=e,s=r.mod(t),i=r.div(t);return Wu(l,Xi(s,i)).rgb})).setLayout({name:"getBatchingColor",type:"vec3",inputs:[{name:"id",type:"int"}]}),t=e(r);Nn("vec3","vBatchColor").assign(t)}const d=on(u);Rl.assign(u.mul(Rl));const c=Ul.div(Qi(d[0].dot(d[0]),d[1].dot(d[1]),d[2].dot(d[2]))),h=d.mul(c).xyz;Ul.assign(h),e.hasGeometryAttribute("tangent")&&cd.mulAssign(d)}}const Lc=Bi(Pc).setParameterLength(1);class Fc extends Hs{static get type(){return"StorageArrayElementNode"}constructor(e,t){super(e,t),this.isStorageArrayElementNode=!0}set storageBufferNode(e){this.node=e}get storageBufferNode(){return this.node}getMemberType(e,t){const r=this.storageBufferNode.structTypeNode;return r?r.getMemberType(e,t):"void"}setup(e){return!1===e.isAvailable("storageBuffer")&&!0===this.node.isPBO&&e.setupPBO(this.node),super.setup(e)}generate(e,t){let r;const s=e.context.assign;if(r=!1===e.isAvailable("storageBuffer")?!0!==this.node.isPBO||!0===s||!this.node.value.isInstancedBufferAttribute&&"compute"===e.shaderStage?this.node.build(e):e.generatePBO(this):super.generate(e),!0!==s){const s=this.getNodeType(e);r=e.format(r,s,t)}return r}}const Bc=Bi(Fc).setParameterLength(2);class Ic extends ju{static get type(){return"StorageBufferNode"}constructor(e,t=null,r=0){let s,i=null;t&&t.isStruct?(s="struct",i=t.layout):null===t&&(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute)?(s=Es(e.itemSize),r=e.count):s=t,super(e,s,r),this.isStorageBufferNode=!0,this.structTypeNode=i,this.access=Vs.READ_WRITE,this.isAtomic=!1,this.isPBO=!1,this._attribute=null,this._varying=null,this.global=!0,!0!==e.isStorageBufferAttribute&&!0!==e.isStorageInstancedBufferAttribute&&(e.isInstancedBufferAttribute?e.isStorageInstancedBufferAttribute=!0:e.isStorageBufferAttribute=!0)}getHash(e){if(0===this.bufferCount){let t=e.globalCache.getData(this.value);return void 0===t&&(t={node:this},e.globalCache.setData(this.value,t)),t.node.uuid}return this.uuid}getInputType(){return this.value.isIndirectStorageBufferAttribute?"indirectStorageBuffer":"storageBuffer"}element(e){return Bc(this,e)}setPBO(e){return this.isPBO=e,this}getPBO(){return this.isPBO}setAccess(e){return this.access=e,this}toReadOnly(){return this.setAccess(Vs.READ_ONLY)}setAtomic(e){return this.isAtomic=e,this}toAtomic(){return this.setAtomic(!0)}getAttributeData(){return null===this._attribute&&(this._attribute=fu(this.value),this._varying=Qo(this._attribute)),{attribute:this._attribute,varying:this._varying}}getNodeType(e){if(null!==this.structTypeNode)return this.structTypeNode.getNodeType(e);if(e.isAvailable("storageBuffer")||e.isAvailable("indirectStorageBuffer"))return super.getNodeType(e);const{attribute:t}=this.getAttributeData();return t.getNodeType(e)}generate(e){if(null!==this.structTypeNode&&this.structTypeNode.build(e),e.isAvailable("storageBuffer")||e.isAvailable("indirectStorageBuffer"))return super.generate(e);const{attribute:t,varying:r}=this.getAttributeData(),s=r.build(e);return e.registerTransform(s,t),s}}const Dc=(e,t=null,r=0)=>Pi(new Ic(e,t,r)),Vc=new WeakMap;class Uc extends $s{static get type(){return"SkinningNode"}constructor(e){super("void"),this.skinnedMesh=e,this.updateType=Is.OBJECT,this.skinIndexNode=Vu("skinIndex","uvec4"),this.skinWeightNode=Vu("skinWeight","vec4"),this.bindMatrixNode=ad("bindMatrix","mat4"),this.bindMatrixInverseNode=ad("bindMatrixInverse","mat4"),this.boneMatricesNode=od("skeleton.boneMatrices","mat4",e.skeleton.bones.length),this.positionNode=Rl,this.toPositionNode=Rl,this.previousBoneMatricesNode=null}getSkinnedPosition(e=this.boneMatricesNode,t=this.positionNode){const{skinIndexNode:r,skinWeightNode:s,bindMatrixNode:i,bindMatrixInverseNode:n}=this,a=e.element(r.x),o=e.element(r.y),u=e.element(r.z),l=e.element(r.w),d=i.mul(t),c=sa(a.mul(s.x).mul(d),o.mul(s.y).mul(d),u.mul(s.z).mul(d),l.mul(s.w).mul(d));return n.mul(c).xyz}getSkinnedNormal(e=this.boneMatricesNode,t=Ul){const{skinIndexNode:r,skinWeightNode:s,bindMatrixNode:i,bindMatrixInverseNode:n}=this,a=e.element(r.x),o=e.element(r.y),u=e.element(r.z),l=e.element(r.w);let d=sa(s.x.mul(a),s.y.mul(o),s.z.mul(u),s.w.mul(l));return d=n.mul(d).mul(i),d.transformDirection(t).xyz}getPreviousSkinnedPosition(e){const t=e.object;return null===this.previousBoneMatricesNode&&(t.skeleton.previousBoneMatrices=new Float32Array(t.skeleton.boneMatrices),this.previousBoneMatricesNode=od("skeleton.previousBoneMatrices","mat4",t.skeleton.bones.length)),this.getSkinnedPosition(this.previousBoneMatricesNode,Cl)}needsPreviousBoneMatrices(e){const t=e.renderer.getMRT();return t&&t.has("velocity")||!0===Ms(e.object).useVelocity}setup(e){this.needsPreviousBoneMatrices(e)&&Cl.assign(this.getPreviousSkinnedPosition(e));const t=this.getSkinnedPosition();if(this.toPositionNode&&this.toPositionNode.assign(t),e.hasGeometryAttribute("normal")){const t=this.getSkinnedNormal();Ul.assign(t),e.hasGeometryAttribute("tangent")&&cd.assign(t)}return t}generate(e,t){if("void"!==t)return super.generate(e,t)}update(e){const t=e.object&&e.object.skeleton?e.object.skeleton:this.skinnedMesh.skeleton;Vc.get(t)!==e.frameId&&(Vc.set(t,e.frameId),null!==this.previousBoneMatricesNode&&t.previousBoneMatrices.set(t.boneMatrices),t.update())}}const Oc=e=>Pi(new Uc(e));class Gc extends $s{static get type(){return"LoopNode"}constructor(e=[]){super(),this.params=e}getVarName(e){return String.fromCharCode("i".charCodeAt(0)+e)}getProperties(e){const t=e.getNodeProperties(this);if(void 0!==t.stackNode)return t;const r={};for(let e=0,t=this.params.length-1;eNumber(o)?">=":"<")),n)i=`while ( ${o} )`;else{const t={start:a,end:o},r=t.start,s=t.end;let n="",h="",p="";c||(c="int"===l||"uint"===l?d.includes("<")?"++":"--":d.includes("<")?"+= 1.":"-= 1."),n+=e.getVar(l,u)+" = "+r,h+=u+" "+d+" "+s,p+=u+" "+c,i=`for ( ${n}; ${h}; ${p} )`}e.addFlowCode((0===t?"\n":"")+e.tab+i+" {\n\n").addFlowTab()}const i=s.build(e,"void"),n=t.returnsNode?t.returnsNode.build(e):"";e.removeFlowTab().addFlowCode("\n"+e.tab+i);for(let t=0,r=this.params.length-1;tPi(new Gc(Fi(e,"int"))).append(),zc=()=>Mu("break").append(),$c=new WeakMap,Hc=new s,Wc=Vi((({bufferMap:e,influence:t,stride:r,width:s,depth:i,offset:n})=>{const a=Hi(_c).mul(r).add(n),o=a.div(s),u=a.sub(o.mul(s));return Wu(e,Xi(u,o)).depth(i).xyz.mul(t)}));class jc extends $s{static get type(){return"MorphNode"}constructor(e){super("void"),this.mesh=e,this.morphBaseInfluence=Tn(1),this.updateType=Is.OBJECT}setup(e){const{geometry:r}=e,s=void 0!==r.morphAttributes.position,i=r.hasAttribute("normal")&&void 0!==r.morphAttributes.normal,n=r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color,a=void 0!==n?n.length:0,{texture:o,stride:u,size:l}=function(e){const r=void 0!==e.morphAttributes.position,s=void 0!==e.morphAttributes.normal,i=void 0!==e.morphAttributes.color,n=e.morphAttributes.position||e.morphAttributes.normal||e.morphAttributes.color,a=void 0!==n?n.length:0;let o=$c.get(e);if(void 0===o||o.count!==a){void 0!==o&&o.texture.dispose();const u=e.morphAttributes.position||[],l=e.morphAttributes.normal||[],d=e.morphAttributes.color||[];let c=0;!0===r&&(c=1),!0===s&&(c=2),!0===i&&(c=3);let h=e.attributes.position.count*c,p=1;const g=4096;h>g&&(p=Math.ceil(h/g),h=g);const m=new Float32Array(h*p*4*a),f=new P(m,h,p,a);f.type=L,f.needsUpdate=!0;const y=4*c;for(let b=0;b{const t=$i(0).toVar();this.mesh.count>1&&null!==this.mesh.morphTexture&&void 0!==this.mesh.morphTexture?t.assign(Wu(this.mesh.morphTexture,Xi(Hi(e).add(1),Hi(vc))).r):t.assign(ad("morphTargetInfluences","float").element(e).toVar()),Gi(t.notEqual(0),(()=>{!0===s&&Rl.addAssign(Wc({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:Hi(0)})),!0===i&&Ul.addAssign(Wc({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:Hi(1)}))}))}))}update(){const e=this.morphBaseInfluence;this.mesh.geometry.morphTargetsRelative?e.value=1:e.value=1-this.mesh.morphTargetInfluences.reduce(((e,t)=>e+t),0)}}const qc=Bi(jc).setParameterLength(1);class Xc extends $s{static get type(){return"LightingNode"}constructor(){super("vec3"),this.isLightingNode=!0}}class Kc extends Xc{static get type(){return"AONode"}constructor(e=null){super(),this.aoNode=e}setup(e){e.context.ambientOcclusion.mulAssign(this.aoNode)}}class Yc extends zo{static get type(){return"LightingContextNode"}constructor(e,t=null,r=null,s=null){super(e),this.lightingModel=t,this.backdropNode=r,this.backdropAlphaNode=s,this._value=null}getContext(){const{backdropNode:e,backdropAlphaNode:t}=this,r={directDiffuse:Qi().toVar("directDiffuse"),directSpecular:Qi().toVar("directSpecular"),indirectDiffuse:Qi().toVar("indirectDiffuse"),indirectSpecular:Qi().toVar("indirectSpecular")};return{radiance:Qi().toVar("radiance"),irradiance:Qi().toVar("irradiance"),iblIrradiance:Qi().toVar("iblIrradiance"),ambientOcclusion:$i(1).toVar("ambientOcclusion"),reflectedLight:r,backdrop:e,backdropAlpha:t}}setup(e){return this.value=this._value||(this._value=this.getContext()),this.value.lightingModel=this.lightingModel||e.context.lightingModel,super.setup(e)}}const Qc=Bi(Yc);class Zc extends Xc{static get type(){return"IrradianceNode"}constructor(e){super(),this.node=e}setup(e){e.context.irradiance.addAssign(this.node)}}let Jc,eh;class th extends $s{static get type(){return"ScreenNode"}constructor(e){super(),this.scope=e,this.isViewportNode=!0}getNodeType(){return this.scope===th.VIEWPORT?"vec4":"vec2"}getUpdateType(){let e=Is.NONE;return this.scope!==th.SIZE&&this.scope!==th.VIEWPORT||(e=Is.RENDER),this.updateType=e,e}update({renderer:e}){const t=e.getRenderTarget();this.scope===th.VIEWPORT?null!==t?eh.copy(t.viewport):(e.getViewport(eh),eh.multiplyScalar(e.getPixelRatio())):null!==t?(Jc.width=t.width,Jc.height=t.height):e.getDrawingBufferSize(Jc)}setup(){const e=this.scope;let r=null;return r=e===th.SIZE?Tn(Jc||(Jc=new t)):e===th.VIEWPORT?Tn(eh||(eh=new s)):qi(ih.div(sh)),r}generate(e){if(this.scope===th.COORDINATE){let t=e.getFragCoord();if(e.isFlipY()){const r=e.getNodeProperties(sh).outputNode.build(e);t=`${e.getType("vec2")}( ${t}.x, ${r}.y - ${t}.y )`}return t}return super.generate(e)}}th.COORDINATE="coordinate",th.VIEWPORT="viewport",th.SIZE="size",th.UV="uv";const rh=Ii(th,th.UV),sh=Ii(th,th.SIZE),ih=Ii(th,th.COORDINATE),nh=Ii(th,th.VIEWPORT),ah=nh.zw,oh=ih.sub(nh.xy),uh=oh.div(ah),lh=Vi((()=>(console.warn('THREE.TSL: "viewportResolution" is deprecated. Use "screenSize" instead.'),sh)),"vec2").once()(),dh=Vi((()=>(console.warn('THREE.TSL: "viewportTopLeft" is deprecated. Use "screenUV" instead.'),rh)),"vec2").once()(),ch=Vi((()=>(console.warn('THREE.TSL: "viewportBottomLeft" is deprecated. Use "screenUV.flipY()" instead.'),rh.flipY())),"vec2").once()(),hh=new t;class ph extends $u{static get type(){return"ViewportTextureNode"}constructor(e=rh,t=null,r=null){null===r&&((r=new F).minFilter=B),super(r,e,t),this.generateMipmaps=!1,this.isOutputTextureNode=!0,this.updateBeforeType=Is.FRAME}updateBefore(e){const t=e.renderer;t.getDrawingBufferSize(hh);const r=this.value;r.image.width===hh.width&&r.image.height===hh.height||(r.image.width=hh.width,r.image.height=hh.height,r.needsUpdate=!0);const s=r.generateMipmaps;r.generateMipmaps=this.generateMipmaps,t.copyFramebufferToTexture(r),r.generateMipmaps=s}clone(){const e=new this.constructor(this.uvNode,this.levelNode,this.value);return e.generateMipmaps=this.generateMipmaps,e}}const gh=Bi(ph).setParameterLength(0,3),mh=Bi(ph,null,null,{generateMipmaps:!0}).setParameterLength(0,3);let fh=null;class yh extends ph{static get type(){return"ViewportDepthTextureNode"}constructor(e=rh,t=null){null===fh&&(fh=new I),super(e,t,fh)}}const xh=Bi(yh).setParameterLength(0,2);class bh extends $s{static get type(){return"ViewportDepthNode"}constructor(e,t=null){super("float"),this.scope=e,this.valueNode=t,this.isViewportDepthNode=!0}generate(e){const{scope:t}=this;return t===bh.DEPTH_BASE?e.getFragDepth():super.generate(e)}setup({camera:e}){const{scope:t}=this,r=this.valueNode;let s=null;if(t===bh.DEPTH_BASE)null!==r&&(s=Sh().assign(r));else if(t===bh.DEPTH)s=e.isPerspectiveCamera?_h(Ll.z,Zu,Ju):Th(Ll.z,Zu,Ju);else if(t===bh.LINEAR_DEPTH)if(null!==r)if(e.isPerspectiveCamera){const e=vh(r,Zu,Ju);s=Th(e,Zu,Ju)}else s=r;else s=Th(Ll.z,Zu,Ju);return s}}bh.DEPTH_BASE="depthBase",bh.DEPTH="depth",bh.LINEAR_DEPTH="linearDepth";const Th=(e,t,r)=>e.add(t).div(t.sub(r)),_h=(e,t,r)=>t.add(e).mul(r).div(r.sub(t).mul(e)),vh=(e,t,r)=>t.mul(r).div(r.sub(t).mul(e).sub(r)),Nh=(e,t,r)=>{t=t.max(1e-6).toVar();const s=Ua(e.negate().div(t)),i=Ua(r.div(t));return s.div(i)},Sh=Bi(bh,bh.DEPTH_BASE),Eh=Ii(bh,bh.DEPTH),wh=Bi(bh,bh.LINEAR_DEPTH).setParameterLength(0,1),Ah=wh(xh());Eh.assign=e=>Sh(e);const Rh=Bi(class extends $s{constructor(e){super("float"),this.name=e,this.isBuiltinNode=!0}generate(){return this.name}}).setParameterLength(1);class Ch extends $s{static get type(){return"ClippingNode"}constructor(e=Ch.DEFAULT){super(),this.scope=e}setup(e){super.setup(e);const t=e.clippingContext,{intersectionPlanes:r,unionPlanes:s}=t;return this.hardwareClipping=e.material.hardwareClipping,this.scope===Ch.ALPHA_TO_COVERAGE?this.setupAlphaToCoverage(r,s):this.scope===Ch.HARDWARE?this.setupHardwareClipping(s,e):this.setupDefault(r,s)}setupAlphaToCoverage(e,t){return Vi((()=>{const r=$i().toVar("distanceToPlane"),s=$i().toVar("distanceToGradient"),i=$i(1).toVar("clipOpacity"),n=t.length;if(!1===this.hardwareClipping&&n>0){const e=Yu(t);kc(n,(({i:t})=>{const n=e.element(t);r.assign(Ll.dot(n.xyz).negate().add(n.w)),s.assign(r.fwidth().div(2)),i.mulAssign(Po(s.negate(),s,r))}))}const a=e.length;if(a>0){const t=Yu(e),n=$i(1).toVar("intersectionClipOpacity");kc(a,(({i:e})=>{const i=t.element(e);r.assign(Ll.dot(i.xyz).negate().add(i.w)),s.assign(r.fwidth().div(2)),n.mulAssign(Po(s.negate(),s,r).oneMinus())})),i.mulAssign(n.oneMinus())}Sn.a.mulAssign(i),Sn.a.equal(0).discard()}))()}setupDefault(e,t){return Vi((()=>{const r=t.length;if(!1===this.hardwareClipping&&r>0){const e=Yu(t);kc(r,(({i:t})=>{const r=e.element(t);Ll.dot(r.xyz).greaterThan(r.w).discard()}))}const s=e.length;if(s>0){const t=Yu(e),r=ji(!0).toVar("clipped");kc(s,(({i:e})=>{const s=t.element(e);r.assign(Ll.dot(s.xyz).greaterThan(s.w).and(r))})),r.discard()}}))()}setupHardwareClipping(e,t){const r=e.length;return t.enableHardwareClipping(r),Vi((()=>{const s=Yu(e),i=Rh(t.getClipDistance());kc(r,(({i:e})=>{const t=s.element(e),r=Ll.dot(t.xyz).sub(t.w).negate();i.element(e).assign(r)}))}))()}}Ch.ALPHA_TO_COVERAGE="alphaToCoverage",Ch.DEFAULT="default",Ch.HARDWARE="hardware";const Mh=Vi((([e])=>Ha(na(1e4,Wa(na(17,e.x).add(na(.1,e.y)))).mul(sa(.1,Qa(Wa(na(13,e.y).add(e.x)))))))),Ph=Vi((([e])=>Mh(qi(Mh(e.xy),e.z)))),Lh=Vi((([e])=>{const t=po(Ja(ro(e.xyz)),Ja(so(e.xyz))),r=$i(1).div($i(.05).mul(t)).toVar("pixScale"),s=qi(Da(ka(Ua(r))),Da(za(Ua(r)))),i=qi(Ph(ka(s.x.mul(e.xyz))),Ph(ka(s.y.mul(e.xyz)))),n=Ha(Ua(r)),a=sa(na(n.oneMinus(),i.x),na(n,i.y)),o=ho(n,n.oneMinus()),u=Qi(a.mul(a).div(na(2,o).mul(ia(1,o))),a.sub(na(.5,o)).div(ia(1,o)),ia(1,ia(1,a).mul(ia(1,a)).div(na(2,o).mul(ia(1,o))))),l=a.lessThan(o.oneMinus()).select(a.lessThan(o).select(u.x,u.y),u.z);return Ro(l,1e-6,1)})).setLayout({name:"getAlphaHashThreshold",type:"float",inputs:[{name:"position",type:"vec3"}]});class Fh extends D{static get type(){return"NodeMaterial"}get type(){return this.constructor.type}set type(e){}constructor(){super(),this.isNodeMaterial=!0,this.fog=!0,this.lights=!1,this.hardwareClipping=!1,this.lightsNode=null,this.envNode=null,this.aoNode=null,this.colorNode=null,this.normalNode=null,this.opacityNode=null,this.backdropNode=null,this.backdropAlphaNode=null,this.alphaTestNode=null,this.positionNode=null,this.geometryNode=null,this.depthNode=null,this.shadowPositionNode=null,this.receivedShadowNode=null,this.castShadowNode=null,this.outputNode=null,this.mrtNode=null,this.fragmentNode=null,this.vertexNode=null}customProgramCacheKey(){return this.type+_s(this)}build(e){this.setup(e)}setupObserver(e){return new fs(e)}setup(e){e.context.setupNormal=()=>this.setupNormal(e),e.context.setupPositionView=()=>this.setupPositionView(e),e.context.setupModelViewProjection=()=>this.setupModelViewProjection(e);const t=e.renderer,r=t.getRenderTarget();e.addStack();const s=this.vertexNode||this.setupVertex(e);let i;e.stack.outputNode=s,this.setupHardwareClipping(e),null!==this.geometryNode&&(e.stack.outputNode=e.stack.outputNode.bypass(this.geometryNode)),e.addFlow("vertex",e.removeStack()),e.addStack();const n=this.setupClipping(e);if(!0!==this.depthWrite&&!0!==this.depthTest||(null!==r?!0===r.depthBuffer&&this.setupDepth(e):!0===t.depth&&this.setupDepth(e)),null===this.fragmentNode){this.setupDiffuseColor(e),this.setupVariants(e);const s=this.setupLighting(e);null!==n&&e.stack.add(n);const a=tn(s,Sn.a).max(0);i=this.setupOutput(e,a),zn.assign(i);const o=null!==this.outputNode;if(o&&(i=this.outputNode),null!==r){const e=t.getMRT(),r=this.mrtNode;null!==e?(o&&zn.assign(i),i=e,null!==r&&(i=e.merge(r))):null!==r&&(i=r)}}else{let t=this.fragmentNode;!0!==t.isOutputStructNode&&(t=tn(t)),i=this.setupOutput(e,t)}e.stack.outputNode=i,e.addFlow("fragment",e.removeStack()),e.observer=this.setupObserver(e)}setupClipping(e){if(null===e.clippingContext)return null;const{unionPlanes:t,intersectionPlanes:r}=e.clippingContext;let s=null;if(t.length>0||r.length>0){const t=e.renderer.samples;this.alphaToCoverage&&t>1?s=Pi(new Ch(Ch.ALPHA_TO_COVERAGE)):e.stack.add(Pi(new Ch))}return s}setupHardwareClipping(e){if(this.hardwareClipping=!1,null===e.clippingContext)return;const t=e.clippingContext.unionPlanes.length;t>0&&t<=8&&e.isAvailable("clipDistance")&&(e.stack.add(Pi(new Ch(Ch.HARDWARE))),this.hardwareClipping=!0)}setupDepth(e){const{renderer:t,camera:r}=e;let s=this.depthNode;if(null===s){const e=t.getMRT();e&&e.has("depth")?s=e.get("depth"):!0===t.logarithmicDepthBuffer&&(s=r.isPerspectiveCamera?Nh(Ll.z,Zu,Ju):Th(Ll.z,Zu,Ju))}null!==s&&Eh.assign(s).append()}setupPositionView(){return Nl.mul(Rl).xyz}setupModelViewProjection(){return el.mul(Ll)}setupVertex(e){return e.addStack(),this.setupPosition(e),e.context.vertex=e.removeStack(),bc}setupPosition(e){const{object:t,geometry:r}=e;if((r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color)&&qc(t).append(),!0===t.isSkinnedMesh&&Oc(t).append(),this.displacementMap){const e=ld("displacementMap","texture"),t=ld("displacementScale","float"),r=ld("displacementBias","float");Rl.addAssign(Ul.normalize().mul(e.x.mul(t).add(r)))}return t.isBatchedMesh&&Lc(t).append(),t.isInstancedMesh&&t.instanceMatrix&&!0===t.instanceMatrix.isInstancedBufferAttribute&&Mc(t).append(),null!==this.positionNode&&Rl.assign(this.positionNode.context({isPositionNodeInput:!0})),Rl}setupDiffuseColor({object:e,geometry:t}){let r=this.colorNode?tn(this.colorNode):Dd;if(!0===this.vertexColors&&t.hasAttribute("color")&&(r=tn(r.xyz.mul(Vu("color","vec3")),r.a)),e.instanceColor){r=Nn("vec3","vInstanceColor").mul(r)}if(e.isBatchedMesh&&e._colorsTexture){r=Nn("vec3","vBatchColor").mul(r)}Sn.assign(r);const s=this.opacityNode?$i(this.opacityNode):Od;if(Sn.a.assign(Sn.a.mul(s)),null!==this.alphaTestNode||this.alphaTest>0){const e=null!==this.alphaTestNode?$i(this.alphaTestNode):Id;Sn.a.lessThanEqual(e).discard()}!0===this.alphaHash&&Sn.a.lessThan(Lh(Rl)).discard(),!1===this.transparent&&this.blending===V&&!1===this.alphaToCoverage&&Sn.a.assign(1)}setupVariants(){}setupOutgoingLight(){return!0===this.lights?Qi(0):Sn.rgb}setupNormal(){return this.normalNode?Qi(this.normalNode):qd}setupEnvironment(){let e=null;return this.envNode?e=this.envNode:this.envMap&&(e=this.envMap.isCubeTexture?ld("envMap","cubeTexture"):ld("envMap","texture")),e}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new Zc(fc)),t}setupLights(e){const t=[],r=this.setupEnvironment(e);r&&r.isLightingNode&&t.push(r);const s=this.setupLightMap(e);if(s&&s.isLightingNode&&t.push(s),null!==this.aoNode||e.material.aoMap){const e=null!==this.aoNode?this.aoNode:yc;t.push(new Kc(e))}let i=this.lightsNode||e.lightsNode;return t.length>0&&(i=e.renderer.lighting.createNode([...i.getLights(),...t])),i}setupLightingModel(){}setupLighting(e){const{material:t}=e,{backdropNode:r,backdropAlphaNode:s,emissiveNode:i}=this,n=!0===this.lights||null!==this.lightsNode?this.setupLights(e):null;let a=this.setupOutgoingLight(e);if(n&&n.getScope().hasLights){const t=this.setupLightingModel(e)||null;a=Qc(n,t,r,s)}else null!==r&&(a=Qi(null!==s?Ao(a,r,s):r));return(i&&!0===i.isNode||t.emissive&&!0===t.emissive.isColor)&&(En.assign(Qi(i||Ud)),a=a.add(En)),a}setupFog(e,t){const r=e.fogNode;return r&&(zn.assign(t),t=tn(r)),t}setupOutput(e,t){return!0===this.fog&&(t=this.setupFog(e,t)),t}setDefaultValues(e){for(const t in e){const r=e[t];void 0===this[t]&&(this[t]=r,r&&r.clone&&(this[t]=r.clone()))}const t=Object.getOwnPropertyDescriptors(e.constructor.prototype);for(const e in t)void 0===Object.getOwnPropertyDescriptor(this.constructor.prototype,e)&&void 0!==t[e].get&&Object.defineProperty(this.constructor.prototype,e,t[e])}toJSON(e){const t=void 0===e||"string"==typeof e;t&&(e={textures:{},images:{},nodes:{}});const r=D.prototype.toJSON.call(this,e),s=vs(this);r.inputNodes={};for(const{property:t,childNode:i}of s)r.inputNodes[t]=i.toJSON(e).uuid;function i(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(t){const t=i(e.textures),s=i(e.images),n=i(e.nodes);t.length>0&&(r.textures=t),s.length>0&&(r.images=s),n.length>0&&(r.nodes=n)}return r}copy(e){return this.lightsNode=e.lightsNode,this.envNode=e.envNode,this.colorNode=e.colorNode,this.normalNode=e.normalNode,this.opacityNode=e.opacityNode,this.backdropNode=e.backdropNode,this.backdropAlphaNode=e.backdropAlphaNode,this.alphaTestNode=e.alphaTestNode,this.positionNode=e.positionNode,this.geometryNode=e.geometryNode,this.depthNode=e.depthNode,this.shadowPositionNode=e.shadowPositionNode,this.receivedShadowNode=e.receivedShadowNode,this.castShadowNode=e.castShadowNode,this.outputNode=e.outputNode,this.mrtNode=e.mrtNode,this.fragmentNode=e.fragmentNode,this.vertexNode=e.vertexNode,super.copy(e)}}const Bh=new U;class Ih extends Fh{static get type(){return"LineBasicNodeMaterial"}constructor(e){super(),this.isLineBasicNodeMaterial=!0,this.setDefaultValues(Bh),this.setValues(e)}}const Dh=new O;class Vh extends Fh{static get type(){return"LineDashedNodeMaterial"}constructor(e){super(),this.isLineDashedNodeMaterial=!0,this.setDefaultValues(Dh),this.dashOffset=0,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.setValues(e)}setupVariants(){const e=this.offsetNode?$i(this.offsetNode):pc,t=this.dashScaleNode?$i(this.dashScaleNode):lc,r=this.dashSizeNode?$i(this.dashSizeNode):dc,s=this.gapSizeNode?$i(this.gapSizeNode):cc;$n.assign(r),Hn.assign(s);const i=Qo(Vu("lineDistance").mul(t));(e?i.add(e):i).mod($n.add(Hn)).greaterThan($n).discard()}}let Uh=null;class Oh extends ph{static get type(){return"ViewportSharedTextureNode"}constructor(e=rh,t=null){null===Uh&&(Uh=new F),super(e,t,Uh)}updateReference(){return this}}const Gh=Bi(Oh).setParameterLength(0,2),kh=new O;class zh extends Fh{static get type(){return"Line2NodeMaterial"}constructor(e={}){super(),this.isLine2NodeMaterial=!0,this.setDefaultValues(kh),this.useColor=e.vertexColors,this.dashOffset=0,this.lineWidth=1,this.lineColorNode=null,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.blending=G,this._useDash=e.dashed,this._useAlphaToCoverage=!0,this._useWorldUnits=!1,this.setValues(e)}setup(e){const{renderer:t}=e,r=this._useAlphaToCoverage,s=this.useColor,i=this._useDash,n=this._useWorldUnits,a=Vi((({start:e,end:t})=>{const r=el.element(2).element(2),s=el.element(3).element(2).mul(-.5).div(r).sub(e.z).div(t.z.sub(e.z));return tn(Ao(e.xyz,t.xyz,s),t.w)})).setLayout({name:"trimSegment",type:"vec4",inputs:[{name:"start",type:"vec4"},{name:"end",type:"vec4"}]});this.vertexNode=Vi((()=>{const e=Vu("instanceStart"),t=Vu("instanceEnd"),r=tn(Nl.mul(tn(e,1))).toVar("start"),s=tn(Nl.mul(tn(t,1))).toVar("end");if(i){const e=this.dashScaleNode?$i(this.dashScaleNode):lc,t=this.offsetNode?$i(this.offsetNode):pc,r=Vu("instanceDistanceStart"),s=Vu("instanceDistanceEnd");let i=Al.y.lessThan(.5).select(e.mul(r),e.mul(s));i=i.add(t),Nn("float","lineDistance").assign(i)}n&&(Nn("vec3","worldStart").assign(r.xyz),Nn("vec3","worldEnd").assign(s.xyz));const o=nh.z.div(nh.w),u=el.element(2).element(3).equal(-1);Gi(u,(()=>{Gi(r.z.lessThan(0).and(s.z.greaterThan(0)),(()=>{s.assign(a({start:r,end:s}))})).ElseIf(s.z.lessThan(0).and(r.z.greaterThanEqual(0)),(()=>{r.assign(a({start:s,end:r}))}))}));const l=el.mul(r),d=el.mul(s),c=l.xyz.div(l.w),h=d.xyz.div(d.w),p=h.xy.sub(c.xy).toVar();p.x.assign(p.x.mul(o)),p.assign(p.normalize());const g=tn().toVar();if(n){const e=s.xyz.sub(r.xyz).normalize(),t=Ao(r.xyz,s.xyz,.5).normalize(),n=e.cross(t).normalize(),a=e.cross(n),o=Nn("vec4","worldPos");o.assign(Al.y.lessThan(.5).select(r,s));const u=hc.mul(.5);o.addAssign(tn(Al.x.lessThan(0).select(n.mul(u),n.mul(u).negate()),0)),i||(o.addAssign(tn(Al.y.lessThan(.5).select(e.mul(u).negate(),e.mul(u)),0)),o.addAssign(tn(a.mul(u),0)),Gi(Al.y.greaterThan(1).or(Al.y.lessThan(0)),(()=>{o.subAssign(tn(a.mul(2).mul(u),0))}))),g.assign(el.mul(o));const l=Qi().toVar();l.assign(Al.y.lessThan(.5).select(c,h)),g.z.assign(l.z.mul(g.w))}else{const e=qi(p.y,p.x.negate()).toVar("offset");p.x.assign(p.x.div(o)),e.x.assign(e.x.div(o)),e.assign(Al.x.lessThan(0).select(e.negate(),e)),Gi(Al.y.lessThan(0),(()=>{e.assign(e.sub(p))})).ElseIf(Al.y.greaterThan(1),(()=>{e.assign(e.add(p))})),e.assign(e.mul(hc)),e.assign(e.div(nh.w)),g.assign(Al.y.lessThan(.5).select(l,d)),e.assign(e.mul(g.w)),g.assign(g.add(tn(e,0,0)))}return g}))();const o=Vi((({p1:e,p2:t,p3:r,p4:s})=>{const i=e.sub(r),n=s.sub(r),a=t.sub(e),o=i.dot(n),u=n.dot(a),l=i.dot(a),d=n.dot(n),c=a.dot(a).mul(d).sub(u.mul(u)),h=o.mul(u).sub(l.mul(d)).div(c).clamp(),p=o.add(u.mul(h)).div(d).clamp();return qi(h,p)}));if(this.colorNode=Vi((()=>{const e=Uu();if(i){const t=this.dashSizeNode?$i(this.dashSizeNode):dc,r=this.gapSizeNode?$i(this.gapSizeNode):cc;$n.assign(t),Hn.assign(r);const s=Nn("float","lineDistance");e.y.lessThan(-1).or(e.y.greaterThan(1)).discard(),s.mod($n.add(Hn)).greaterThan($n).discard()}const a=$i(1).toVar("alpha");if(n){const e=Nn("vec3","worldStart"),s=Nn("vec3","worldEnd"),n=Nn("vec4","worldPos").xyz.normalize().mul(1e5),u=s.sub(e),l=o({p1:e,p2:s,p3:Qi(0,0,0),p4:n}),d=e.add(u.mul(l.x)),c=n.mul(l.y),h=d.sub(c).length().div(hc);if(!i)if(r&&t.samples>1){const e=h.fwidth();a.assign(Po(e.negate().add(.5),e.add(.5),h).oneMinus())}else h.greaterThan(.5).discard()}else if(r&&t.samples>1){const t=e.x,r=e.y.greaterThan(0).select(e.y.sub(1),e.y.add(1)),s=t.mul(t).add(r.mul(r)),i=$i(s.fwidth()).toVar("dlen");Gi(e.y.abs().greaterThan(1),(()=>{a.assign(Po(i.oneMinus(),i.add(1),s).oneMinus())}))}else Gi(e.y.abs().greaterThan(1),(()=>{const t=e.x,r=e.y.greaterThan(0).select(e.y.sub(1),e.y.add(1));t.mul(t).add(r.mul(r)).greaterThan(1).discard()}));let u;if(this.lineColorNode)u=this.lineColorNode;else if(s){const e=Vu("instanceColorStart"),t=Vu("instanceColorEnd");u=Al.y.lessThan(.5).select(e,t).mul(Dd)}else u=Dd;return tn(u,a)}))(),this.transparent){const e=this.opacityNode?$i(this.opacityNode):Od;this.outputNode=tn(this.colorNode.rgb.mul(e).add(Gh().rgb.mul(e.oneMinus())),this.colorNode.a)}super.setup(e)}get worldUnits(){return this._useWorldUnits}set worldUnits(e){this._useWorldUnits!==e&&(this._useWorldUnits=e,this.needsUpdate=!0)}get dashed(){return this._useDash}set dashed(e){this._useDash!==e&&(this._useDash=e,this.needsUpdate=!0)}get alphaToCoverage(){return this._useAlphaToCoverage}set alphaToCoverage(e){this._useAlphaToCoverage!==e&&(this._useAlphaToCoverage=e,this.needsUpdate=!0)}}const $h=e=>Pi(e).mul(.5).add(.5),Hh=new k;class Wh extends Fh{static get type(){return"MeshNormalNodeMaterial"}constructor(e){super(),this.isMeshNormalNodeMaterial=!0,this.setDefaultValues(Hh),this.setValues(e)}setupDiffuseColor(){const e=this.opacityNode?$i(this.opacityNode):Od;Sn.assign(ou(tn($h(zl),e),z))}}class jh extends js{static get type(){return"EquirectUVNode"}constructor(e=Pl){super("vec2"),this.dirNode=e}setup(){const e=this.dirNode,t=e.z.atan(e.x).mul(1/(2*Math.PI)).add(.5),r=e.y.clamp(-1,1).asin().mul(1/Math.PI).add(.5);return qi(t,r)}}const qh=Bi(jh).setParameterLength(0,1);class Xh extends ${constructor(e=1,t={}){super(e,t),this.isCubeRenderTarget=!0}fromEquirectangularTexture(e,t){const r=t.minFilter,s=t.generateMipmaps;t.generateMipmaps=!0,this.texture.type=t.type,this.texture.colorSpace=t.colorSpace,this.texture.generateMipmaps=t.generateMipmaps,this.texture.minFilter=t.minFilter,this.texture.magFilter=t.magFilter;const i=new H(5,5,5),n=qh(Pl),a=new Fh;a.colorNode=Hu(t,n,0),a.side=N,a.blending=G;const o=new W(i,a),u=new j;u.add(o),t.minFilter===B&&(t.minFilter=q);const l=new X(1,10,this),d=e.getMRT();return e.setMRT(null),l.update(e,u),e.setMRT(d),t.minFilter=r,t.currentGenerateMipmaps=s,o.geometry.dispose(),o.material.dispose(),this}}const Kh=new WeakMap;class Yh extends js{static get type(){return"CubeMapNode"}constructor(e){super("vec3"),this.envNode=e,this._cubeTexture=null,this._cubeTextureNode=sd(null);const t=new K;t.isRenderTargetTexture=!0,this._defaultTexture=t,this.updateBeforeType=Is.RENDER}updateBefore(e){const{renderer:t,material:r}=e,s=this.envNode;if(s.isTextureNode||s.isMaterialReferenceNode){const e=s.isTextureNode?s.value:r[s.property];if(e&&e.isTexture){const r=e.mapping;if(r===Y||r===Q){if(Kh.has(e)){const t=Kh.get(e);Zh(t,e.mapping),this._cubeTexture=t}else{const r=e.image;if(function(e){return null!=e&&e.height>0}(r)){const s=new Xh(r.height);s.fromEquirectangularTexture(t,e),Zh(s.texture,e.mapping),this._cubeTexture=s.texture,Kh.set(e,s.texture),e.addEventListener("dispose",Qh)}else this._cubeTexture=this._defaultTexture}this._cubeTextureNode.value=this._cubeTexture}else this._cubeTextureNode=this.envNode}}}setup(e){return this.updateBefore(e),this._cubeTextureNode}}function Qh(e){const t=e.target;t.removeEventListener("dispose",Qh);const r=Kh.get(t);void 0!==r&&(Kh.delete(t),r.dispose())}function Zh(e,t){t===Y?e.mapping=E:t===Q&&(e.mapping=w)}const Jh=Bi(Yh).setParameterLength(1);class ep extends Xc{static get type(){return"BasicEnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){e.context.environment=Jh(this.envNode)}}class tp extends Xc{static get type(){return"BasicLightMapNode"}constructor(e=null){super(),this.lightMapNode=e}setup(e){const t=$i(1/Math.PI);e.context.irradianceLightMap=this.lightMapNode.mul(t)}}class rp{start(e){e.lightsNode.setupLights(e,e.lightsNode.getLightNodes(e)),this.indirect(e)}finish(){}direct(){}directRectArea(){}indirect(){}ambientOcclusion(){}}class sp extends rp{constructor(){super()}indirect({context:e}){const t=e.ambientOcclusion,r=e.reflectedLight,s=e.irradianceLightMap;r.indirectDiffuse.assign(tn(0)),s?r.indirectDiffuse.addAssign(s):r.indirectDiffuse.addAssign(tn(1,1,1,0)),r.indirectDiffuse.mulAssign(t),r.indirectDiffuse.mulAssign(Sn.rgb)}finish(e){const{material:t,context:r}=e,s=r.outgoingLight,i=e.context.environment;if(i)switch(t.combine){case ee:s.rgb.assign(Ao(s.rgb,s.rgb.mul(i.rgb),$d.mul(Hd)));break;case J:s.rgb.assign(Ao(s.rgb,i.rgb,$d.mul(Hd)));break;case Z:s.rgb.addAssign(i.rgb.mul($d.mul(Hd)));break;default:console.warn("THREE.BasicLightingModel: Unsupported .combine value:",t.combine)}}}const ip=new te;class np extends Fh{static get type(){return"MeshBasicNodeMaterial"}constructor(e){super(),this.isMeshBasicNodeMaterial=!0,this.lights=!0,this.setDefaultValues(ip),this.setValues(e)}setupNormal(){return Gl}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new ep(t):null}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new tp(fc)),t}setupOutgoingLight(){return Sn.rgb}setupLightingModel(){return new sp}}const ap=Vi((({f0:e,f90:t,dotVH:r})=>{const s=r.mul(-5.55473).sub(6.98316).mul(r).exp2();return e.mul(s.oneMinus()).add(t.mul(s))})),op=Vi((e=>e.diffuseColor.mul(1/Math.PI))),up=Vi((({dotNH:e})=>kn.mul($i(.5)).add(1).mul($i(1/Math.PI)).mul(e.pow(kn)))),lp=Vi((({lightDirection:e})=>{const t=e.add(Fl).normalize(),r=zl.dot(t).clamp(),s=Fl.dot(t).clamp(),i=ap({f0:On,f90:1,dotVH:s}),n=$i(.25),a=up({dotNH:r});return i.mul(n).mul(a)}));class dp extends sp{constructor(e=!0){super(),this.specular=e}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=zl.dot(e).clamp().mul(t);r.directDiffuse.addAssign(s.mul(op({diffuseColor:Sn.rgb}))),!0===this.specular&&r.directSpecular.addAssign(s.mul(lp({lightDirection:e})).mul($d))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(op({diffuseColor:Sn}))),s.indirectDiffuse.mulAssign(t)}}const cp=new re;class hp extends Fh{static get type(){return"MeshLambertNodeMaterial"}constructor(e){super(),this.isMeshLambertNodeMaterial=!0,this.lights=!0,this.setDefaultValues(cp),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new ep(t):null}setupLightingModel(){return new dp(!1)}}const pp=new se;class gp extends Fh{static get type(){return"MeshPhongNodeMaterial"}constructor(e){super(),this.isMeshPhongNodeMaterial=!0,this.lights=!0,this.shininessNode=null,this.specularNode=null,this.setDefaultValues(pp),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new ep(t):null}setupLightingModel(){return new dp}setupVariants(){const e=(this.shininessNode?$i(this.shininessNode):Vd).max(1e-4);kn.assign(e);const t=this.specularNode||Gd;On.assign(t)}copy(e){return this.shininessNode=e.shininessNode,this.specularNode=e.specularNode,super.copy(e)}}const mp=Vi((e=>{if(!1===e.geometry.hasAttribute("normal"))return $i(0);const t=Gl.dFdx().abs().max(Gl.dFdy().abs());return t.x.max(t.y).max(t.z)})),fp=Vi((e=>{const{roughness:t}=e,r=mp();let s=t.max(.0525);return s=s.add(r),s=s.min(1),s})),yp=Vi((({alpha:e,dotNL:t,dotNV:r})=>{const s=e.pow2(),i=t.mul(s.add(s.oneMinus().mul(r.pow2())).sqrt()),n=r.mul(s.add(s.oneMinus().mul(t.pow2())).sqrt());return aa(.5,i.add(n).max(Aa))})).setLayout({name:"V_GGX_SmithCorrelated",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNL",type:"float"},{name:"dotNV",type:"float"}]}),xp=Vi((({alphaT:e,alphaB:t,dotTV:r,dotBV:s,dotTL:i,dotBL:n,dotNV:a,dotNL:o})=>{const u=o.mul(Qi(e.mul(r),t.mul(s),a).length()),l=a.mul(Qi(e.mul(i),t.mul(n),o).length());return aa(.5,u.add(l)).saturate()})).setLayout({name:"V_GGX_SmithCorrelated_Anisotropic",type:"float",inputs:[{name:"alphaT",type:"float",qualifier:"in"},{name:"alphaB",type:"float",qualifier:"in"},{name:"dotTV",type:"float",qualifier:"in"},{name:"dotBV",type:"float",qualifier:"in"},{name:"dotTL",type:"float",qualifier:"in"},{name:"dotBL",type:"float",qualifier:"in"},{name:"dotNV",type:"float",qualifier:"in"},{name:"dotNL",type:"float",qualifier:"in"}]}),bp=Vi((({alpha:e,dotNH:t})=>{const r=e.pow2(),s=t.pow2().mul(r.oneMinus()).oneMinus();return r.div(s.pow2()).mul(1/Math.PI)})).setLayout({name:"D_GGX",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNH",type:"float"}]}),Tp=$i(1/Math.PI),_p=Vi((({alphaT:e,alphaB:t,dotNH:r,dotTH:s,dotBH:i})=>{const n=e.mul(t),a=Qi(t.mul(s),e.mul(i),n.mul(r)),o=a.dot(a),u=n.div(o);return Tp.mul(n.mul(u.pow2()))})).setLayout({name:"D_GGX_Anisotropic",type:"float",inputs:[{name:"alphaT",type:"float",qualifier:"in"},{name:"alphaB",type:"float",qualifier:"in"},{name:"dotNH",type:"float",qualifier:"in"},{name:"dotTH",type:"float",qualifier:"in"},{name:"dotBH",type:"float",qualifier:"in"}]}),vp=Vi((e=>{const{lightDirection:t,f0:r,f90:s,roughness:i,f:n,USE_IRIDESCENCE:a,USE_ANISOTROPY:o}=e,u=e.normalView||zl,l=i.pow2(),d=t.add(Fl).normalize(),c=u.dot(t).clamp(),h=u.dot(Fl).clamp(),p=u.dot(d).clamp(),g=Fl.dot(d).clamp();let m,f,y=ap({f0:r,f90:s,dotVH:g});if(Ri(a)&&(y=Ln.mix(y,n)),Ri(o)){const e=Vn.dot(t),r=Vn.dot(Fl),s=Vn.dot(d),i=Un.dot(t),n=Un.dot(Fl),a=Un.dot(d);m=xp({alphaT:In,alphaB:l,dotTV:r,dotBV:n,dotTL:e,dotBL:i,dotNV:h,dotNL:c}),f=_p({alphaT:In,alphaB:l,dotNH:p,dotTH:s,dotBH:a})}else m=yp({alpha:l,dotNL:c,dotNV:h}),f=bp({alpha:l,dotNH:p});return y.mul(m).mul(f)})),Np=Vi((({roughness:e,dotNV:t})=>{const r=tn(-1,-.0275,-.572,.022),s=tn(1,.0425,1.04,-.04),i=e.mul(r).add(s),n=i.x.mul(i.x).min(t.mul(-9.28).exp2()).mul(i.x).add(i.y);return qi(-1.04,1.04).mul(n).add(i.zw)})).setLayout({name:"DFGApprox",type:"vec2",inputs:[{name:"roughness",type:"float"},{name:"dotNV",type:"vec3"}]}),Sp=Vi((e=>{const{dotNV:t,specularColor:r,specularF90:s,roughness:i}=e,n=Np({dotNV:t,roughness:i});return r.mul(n.x).add(s.mul(n.y))})),Ep=Vi((({f:e,f90:t,dotVH:r})=>{const s=r.oneMinus().saturate(),i=s.mul(s),n=s.mul(i,i).clamp(0,.9999);return e.sub(Qi(t).mul(n)).div(n.oneMinus())})).setLayout({name:"Schlick_to_F0",type:"vec3",inputs:[{name:"f",type:"vec3"},{name:"f90",type:"float"},{name:"dotVH",type:"float"}]}),wp=Vi((({roughness:e,dotNH:t})=>{const r=e.pow2(),s=$i(1).div(r),i=t.pow2().oneMinus().max(.0078125);return $i(2).add(s).mul(i.pow(s.mul(.5))).div(2*Math.PI)})).setLayout({name:"D_Charlie",type:"float",inputs:[{name:"roughness",type:"float"},{name:"dotNH",type:"float"}]}),Ap=Vi((({dotNV:e,dotNL:t})=>$i(1).div($i(4).mul(t.add(e).sub(t.mul(e)))))).setLayout({name:"V_Neubelt",type:"float",inputs:[{name:"dotNV",type:"float"},{name:"dotNL",type:"float"}]}),Rp=Vi((({lightDirection:e})=>{const t=e.add(Fl).normalize(),r=zl.dot(e).clamp(),s=zl.dot(Fl).clamp(),i=zl.dot(t).clamp(),n=wp({roughness:Pn,dotNH:i}),a=Ap({dotNV:s,dotNL:r});return Mn.mul(n).mul(a)})),Cp=Vi((({N:e,V:t,roughness:r})=>{const s=e.dot(t).saturate(),i=qi(r,s.oneMinus().sqrt());return i.assign(i.mul(.984375).add(.0078125)),i})).setLayout({name:"LTC_Uv",type:"vec2",inputs:[{name:"N",type:"vec3"},{name:"V",type:"vec3"},{name:"roughness",type:"float"}]}),Mp=Vi((({f:e})=>{const t=e.length();return po(t.mul(t).add(e.z).div(t.add(1)),0)})).setLayout({name:"LTC_ClippedSphereFormFactor",type:"float",inputs:[{name:"f",type:"vec3"}]}),Pp=Vi((({v1:e,v2:t})=>{const r=e.dot(t),s=r.abs().toVar(),i=s.mul(.0145206).add(.4965155).mul(s).add(.8543985).toVar(),n=s.add(4.1616724).mul(s).add(3.417594).toVar(),a=i.div(n),o=r.greaterThan(0).select(a,po(r.mul(r).oneMinus(),1e-7).inverseSqrt().mul(.5).sub(a));return e.cross(t).mul(o)})).setLayout({name:"LTC_EdgeVectorFormFactor",type:"vec3",inputs:[{name:"v1",type:"vec3"},{name:"v2",type:"vec3"}]}),Lp=Vi((({N:e,V:t,P:r,mInv:s,p0:i,p1:n,p2:a,p3:o})=>{const u=n.sub(i).toVar(),l=o.sub(i).toVar(),d=u.cross(l),c=Qi().toVar();return Gi(d.dot(r.sub(i)).greaterThanEqual(0),(()=>{const u=t.sub(e.mul(t.dot(e))).normalize(),l=e.cross(u).negate(),d=s.mul(on(u,l,e).transpose()).toVar(),h=d.mul(i.sub(r)).normalize().toVar(),p=d.mul(n.sub(r)).normalize().toVar(),g=d.mul(a.sub(r)).normalize().toVar(),m=d.mul(o.sub(r)).normalize().toVar(),f=Qi(0).toVar();f.addAssign(Pp({v1:h,v2:p})),f.addAssign(Pp({v1:p,v2:g})),f.addAssign(Pp({v1:g,v2:m})),f.addAssign(Pp({v1:m,v2:h})),c.assign(Qi(Mp({f:f})))})),c})).setLayout({name:"LTC_Evaluate",type:"vec3",inputs:[{name:"N",type:"vec3"},{name:"V",type:"vec3"},{name:"P",type:"vec3"},{name:"mInv",type:"mat3"},{name:"p0",type:"vec3"},{name:"p1",type:"vec3"},{name:"p2",type:"vec3"},{name:"p3",type:"vec3"}]}),Fp=Vi((({P:e,p0:t,p1:r,p2:s,p3:i})=>{const n=r.sub(t).toVar(),a=i.sub(t).toVar(),o=n.cross(a),u=Qi().toVar();return Gi(o.dot(e.sub(t)).greaterThanEqual(0),(()=>{const n=t.sub(e).normalize().toVar(),a=r.sub(e).normalize().toVar(),o=s.sub(e).normalize().toVar(),l=i.sub(e).normalize().toVar(),d=Qi(0).toVar();d.addAssign(Pp({v1:n,v2:a})),d.addAssign(Pp({v1:a,v2:o})),d.addAssign(Pp({v1:o,v2:l})),d.addAssign(Pp({v1:l,v2:n})),u.assign(Qi(Mp({f:d.abs()})))})),u})).setLayout({name:"LTC_Evaluate",type:"vec3",inputs:[{name:"P",type:"vec3"},{name:"p0",type:"vec3"},{name:"p1",type:"vec3"},{name:"p2",type:"vec3"},{name:"p3",type:"vec3"}]}),Bp=1/6,Ip=e=>na(Bp,na(e,na(e,e.negate().add(3)).sub(3)).add(1)),Dp=e=>na(Bp,na(e,na(e,na(3,e).sub(6))).add(4)),Vp=e=>na(Bp,na(e,na(e,na(-3,e).add(3)).add(3)).add(1)),Up=e=>na(Bp,To(e,3)),Op=e=>Ip(e).add(Dp(e)),Gp=e=>Vp(e).add(Up(e)),kp=e=>sa(-1,Dp(e).div(Ip(e).add(Dp(e)))),zp=e=>sa(1,Up(e).div(Vp(e).add(Up(e)))),$p=(e,t,r)=>{const s=e.uvNode,i=na(s,t.zw).add(.5),n=ka(i),a=Ha(i),o=Op(a.x),u=Gp(a.x),l=kp(a.x),d=zp(a.x),c=kp(a.y),h=zp(a.y),p=qi(n.x.add(l),n.y.add(c)).sub(.5).mul(t.xy),g=qi(n.x.add(d),n.y.add(c)).sub(.5).mul(t.xy),m=qi(n.x.add(l),n.y.add(h)).sub(.5).mul(t.xy),f=qi(n.x.add(d),n.y.add(h)).sub(.5).mul(t.xy),y=Op(a.y).mul(sa(o.mul(e.sample(p).level(r)),u.mul(e.sample(g).level(r)))),x=Gp(a.y).mul(sa(o.mul(e.sample(m).level(r)),u.mul(e.sample(f).level(r))));return y.add(x)},Hp=Vi((([e,t=$i(3)])=>{const r=qi(e.size(Hi(t))),s=qi(e.size(Hi(t.add(1)))),i=aa(1,r),n=aa(1,s),a=$p(e,tn(i,r),ka(t)),o=$p(e,tn(n,s),za(t));return Ha(t).mix(a,o)})),Wp=Vi((([e,t,r,s,i])=>{const n=Qi(Mo(t.negate(),$a(e),aa(1,s))),a=Qi(Ja(i[0].xyz),Ja(i[1].xyz),Ja(i[2].xyz));return $a(n).mul(r.mul(a))})).setLayout({name:"getVolumeTransmissionRay",type:"vec3",inputs:[{name:"n",type:"vec3"},{name:"v",type:"vec3"},{name:"thickness",type:"float"},{name:"ior",type:"float"},{name:"modelMatrix",type:"mat4"}]}),jp=Vi((([e,t])=>e.mul(Ro(t.mul(2).sub(2),0,1)))).setLayout({name:"applyIorToRoughness",type:"float",inputs:[{name:"roughness",type:"float"},{name:"ior",type:"float"}]}),qp=mh(),Xp=mh(),Kp=Vi((([e,t,r],{material:s})=>{const i=(s.side===N?qp:Xp).sample(e),n=Ua(sh.x).mul(jp(t,r));return Hp(i,n)})),Yp=Vi((([e,t,r])=>(Gi(r.notEqual(0),(()=>{const s=Va(t).negate().div(r);return Ia(s.negate().mul(e))})),Qi(1)))).setLayout({name:"volumeAttenuation",type:"vec3",inputs:[{name:"transmissionDistance",type:"float"},{name:"attenuationColor",type:"vec3"},{name:"attenuationDistance",type:"float"}]}),Qp=Vi((([e,t,r,s,i,n,a,o,u,l,d,c,h,p,g])=>{let m,f;if(g){m=tn().toVar(),f=Qi().toVar();const i=d.sub(1).mul(g.mul(.025)),n=Qi(d.sub(i),d,d.add(i));kc({start:0,end:3},(({i:i})=>{const d=n.element(i),g=Wp(e,t,c,d,o),y=a.add(g),x=l.mul(u.mul(tn(y,1))),b=qi(x.xy.div(x.w)).toVar();b.addAssign(1),b.divAssign(2),b.assign(qi(b.x,b.y.oneMinus()));const T=Kp(b,r,d);m.element(i).assign(T.element(i)),m.a.addAssign(T.a),f.element(i).assign(s.element(i).mul(Yp(Ja(g),h,p).element(i)))})),m.a.divAssign(3)}else{const i=Wp(e,t,c,d,o),n=a.add(i),g=l.mul(u.mul(tn(n,1))),y=qi(g.xy.div(g.w)).toVar();y.addAssign(1),y.divAssign(2),y.assign(qi(y.x,y.y.oneMinus())),m=Kp(y,r,d),f=s.mul(Yp(Ja(i),h,p))}const y=f.rgb.mul(m.rgb),x=e.dot(t).clamp(),b=Qi(Sp({dotNV:x,specularColor:i,specularF90:n,roughness:r})),T=f.r.add(f.g,f.b).div(3);return tn(b.oneMinus().mul(y),m.a.oneMinus().mul(T).oneMinus())})),Zp=on(3.2404542,-.969266,.0556434,-1.5371385,1.8760108,-.2040259,-.4985314,.041556,1.0572252),Jp=(e,t)=>e.sub(t).div(e.add(t)).pow2(),eg=Vi((({outsideIOR:e,eta2:t,cosTheta1:r,thinFilmThickness:s,baseF0:i})=>{const n=Ao(e,t,Po(0,.03,s)),a=e.div(n).pow2().mul(r.pow2().oneMinus()).oneMinus();Gi(a.lessThan(0),(()=>Qi(1)));const o=a.sqrt(),u=Jp(n,e),l=ap({f0:u,f90:1,dotVH:r}),d=l.oneMinus(),c=n.lessThan(e).select(Math.PI,0),h=$i(Math.PI).sub(c),p=(e=>{const t=e.sqrt();return Qi(1).add(t).div(Qi(1).sub(t))})(i.clamp(0,.9999)),g=Jp(p,n.toVec3()),m=ap({f0:g,f90:1,dotVH:o}),f=Qi(p.x.lessThan(n).select(Math.PI,0),p.y.lessThan(n).select(Math.PI,0),p.z.lessThan(n).select(Math.PI,0)),y=n.mul(s,o,2),x=Qi(h).add(f),b=l.mul(m).clamp(1e-5,.9999),T=b.sqrt(),_=d.pow2().mul(m).div(Qi(1).sub(b)),v=l.add(_).toVar(),N=_.sub(d).toVar();return kc({start:1,end:2,condition:"<=",name:"m"},(({m:e})=>{N.mulAssign(T);const t=((e,t)=>{const r=e.mul(2*Math.PI*1e-9),s=Qi(54856e-17,44201e-17,52481e-17),i=Qi(1681e3,1795300,2208400),n=Qi(43278e5,93046e5,66121e5),a=$i(9747e-17*Math.sqrt(2*Math.PI*45282e5)).mul(r.mul(2239900).add(t.x).cos()).mul(r.pow2().mul(-45282e5).exp());let o=s.mul(n.mul(2*Math.PI).sqrt()).mul(i.mul(r).add(t).cos()).mul(r.pow2().negate().mul(n).exp());return o=Qi(o.x.add(a),o.y,o.z).div(1.0685e-7),Zp.mul(o)})($i(e).mul(y),$i(e).mul(x)).mul(2);v.addAssign(N.mul(t))})),v.max(Qi(0))})).setLayout({name:"evalIridescence",type:"vec3",inputs:[{name:"outsideIOR",type:"float"},{name:"eta2",type:"float"},{name:"cosTheta1",type:"float"},{name:"thinFilmThickness",type:"float"},{name:"baseF0",type:"vec3"}]}),tg=Vi((({normal:e,viewDir:t,roughness:r})=>{const s=e.dot(t).saturate(),i=r.pow2(),n=Go(r.lessThan(.25),$i(-339.2).mul(i).add($i(161.4).mul(r)).sub(25.9),$i(-8.48).mul(i).add($i(14.3).mul(r)).sub(9.95)),a=Go(r.lessThan(.25),$i(44).mul(i).sub($i(23.7).mul(r)).add(3.26),$i(1.97).mul(i).sub($i(3.27).mul(r)).add(.72));return Go(r.lessThan(.25),0,$i(.1).mul(r).sub(.025)).add(n.mul(s).add(a).exp()).mul(1/Math.PI).saturate()})),rg=Qi(.04),sg=$i(1);class ig extends rp{constructor(e=!1,t=!1,r=!1,s=!1,i=!1,n=!1){super(),this.clearcoat=e,this.sheen=t,this.iridescence=r,this.anisotropy=s,this.transmission=i,this.dispersion=n,this.clearcoatRadiance=null,this.clearcoatSpecularDirect=null,this.clearcoatSpecularIndirect=null,this.sheenSpecularDirect=null,this.sheenSpecularIndirect=null,this.iridescenceFresnel=null,this.iridescenceF0=null}start(e){if(!0===this.clearcoat&&(this.clearcoatRadiance=Qi().toVar("clearcoatRadiance"),this.clearcoatSpecularDirect=Qi().toVar("clearcoatSpecularDirect"),this.clearcoatSpecularIndirect=Qi().toVar("clearcoatSpecularIndirect")),!0===this.sheen&&(this.sheenSpecularDirect=Qi().toVar("sheenSpecularDirect"),this.sheenSpecularIndirect=Qi().toVar("sheenSpecularIndirect")),!0===this.iridescence){const e=zl.dot(Fl).clamp();this.iridescenceFresnel=eg({outsideIOR:$i(1),eta2:Fn,cosTheta1:e,thinFilmThickness:Bn,baseF0:On}),this.iridescenceF0=Ep({f:this.iridescenceFresnel,f90:1,dotVH:e})}if(!0===this.transmission){const t=Ml,r=nl.sub(Ml).normalize(),s=$l,i=e.context;i.backdrop=Qp(s,r,wn,Sn,On,Gn,t,fl,rl,el,jn,Xn,Yn,Kn,this.dispersion?Qn:null),i.backdropAlpha=qn,Sn.a.mulAssign(Ao(1,i.backdrop.a,qn))}super.start(e)}computeMultiscattering(e,t,r){const s=zl.dot(Fl).clamp(),i=Np({roughness:wn,dotNV:s}),n=(this.iridescenceF0?Ln.mix(On,this.iridescenceF0):On).mul(i.x).add(r.mul(i.y)),a=i.x.add(i.y).oneMinus(),o=On.add(On.oneMinus().mul(.047619)),u=n.mul(o).div(a.mul(o).oneMinus());e.addAssign(n),t.addAssign(u.mul(a))}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=zl.dot(e).clamp().mul(t);if(!0===this.sheen&&this.sheenSpecularDirect.addAssign(s.mul(Rp({lightDirection:e}))),!0===this.clearcoat){const r=Hl.dot(e).clamp().mul(t);this.clearcoatSpecularDirect.addAssign(r.mul(vp({lightDirection:e,f0:rg,f90:sg,roughness:Cn,normalView:Hl})))}r.directDiffuse.addAssign(s.mul(op({diffuseColor:Sn.rgb}))),r.directSpecular.addAssign(s.mul(vp({lightDirection:e,f0:On,f90:1,roughness:wn,iridescence:this.iridescence,f:this.iridescenceFresnel,USE_IRIDESCENCE:this.iridescence,USE_ANISOTROPY:this.anisotropy})))}directRectArea({lightColor:e,lightPosition:t,halfWidth:r,halfHeight:s,reflectedLight:i,ltc_1:n,ltc_2:a}){const o=t.add(r).sub(s),u=t.sub(r).sub(s),l=t.sub(r).add(s),d=t.add(r).add(s),c=zl,h=Fl,p=Ll.toVar(),g=Cp({N:c,V:h,roughness:wn}),m=n.sample(g).toVar(),f=a.sample(g).toVar(),y=on(Qi(m.x,0,m.y),Qi(0,1,0),Qi(m.z,0,m.w)).toVar(),x=On.mul(f.x).add(On.oneMinus().mul(f.y)).toVar();i.directSpecular.addAssign(e.mul(x).mul(Lp({N:c,V:h,P:p,mInv:y,p0:o,p1:u,p2:l,p3:d}))),i.directDiffuse.addAssign(e.mul(Sn).mul(Lp({N:c,V:h,P:p,mInv:on(1,0,0,0,1,0,0,0,1),p0:o,p1:u,p2:l,p3:d})))}indirect(e){this.indirectDiffuse(e),this.indirectSpecular(e),this.ambientOcclusion(e)}indirectDiffuse(e){const{irradiance:t,reflectedLight:r}=e.context;r.indirectDiffuse.addAssign(t.mul(op({diffuseColor:Sn})))}indirectSpecular(e){const{radiance:t,iblIrradiance:r,reflectedLight:s}=e.context;if(!0===this.sheen&&this.sheenSpecularIndirect.addAssign(r.mul(Mn,tg({normal:zl,viewDir:Fl,roughness:Pn}))),!0===this.clearcoat){const e=Hl.dot(Fl).clamp(),t=Sp({dotNV:e,specularColor:rg,specularF90:sg,roughness:Cn});this.clearcoatSpecularIndirect.addAssign(this.clearcoatRadiance.mul(t))}const i=Qi().toVar("singleScattering"),n=Qi().toVar("multiScattering"),a=r.mul(1/Math.PI);this.computeMultiscattering(i,n,Gn);const o=i.add(n),u=Sn.mul(o.r.max(o.g).max(o.b).oneMinus());s.indirectSpecular.addAssign(t.mul(i)),s.indirectSpecular.addAssign(n.mul(a)),s.indirectDiffuse.addAssign(u.mul(a))}ambientOcclusion(e){const{ambientOcclusion:t,reflectedLight:r}=e.context,s=zl.dot(Fl).clamp().add(t),i=wn.mul(-16).oneMinus().negate().exp2(),n=t.sub(s.pow(i).oneMinus()).clamp();!0===this.clearcoat&&this.clearcoatSpecularIndirect.mulAssign(t),!0===this.sheen&&this.sheenSpecularIndirect.mulAssign(t),r.indirectDiffuse.mulAssign(t),r.indirectSpecular.mulAssign(n)}finish({context:e}){const{outgoingLight:t}=e;if(!0===this.clearcoat){const e=Hl.dot(Fl).clamp(),r=ap({dotVH:e,f0:rg,f90:sg}),s=t.mul(Rn.mul(r).oneMinus()).add(this.clearcoatSpecularDirect.add(this.clearcoatSpecularIndirect).mul(Rn));t.assign(s)}if(!0===this.sheen){const e=Mn.r.max(Mn.g).max(Mn.b).mul(.157).oneMinus(),r=t.mul(e).add(this.sheenSpecularDirect,this.sheenSpecularIndirect);t.assign(r)}}}const ng=$i(1),ag=$i(-2),og=$i(.8),ug=$i(-1),lg=$i(.4),dg=$i(2),cg=$i(.305),hg=$i(3),pg=$i(.21),gg=$i(4),mg=$i(4),fg=$i(16),yg=Vi((([e])=>{const t=Qi(Qa(e)).toVar(),r=$i(-1).toVar();return Gi(t.x.greaterThan(t.z),(()=>{Gi(t.x.greaterThan(t.y),(()=>{r.assign(Go(e.x.greaterThan(0),0,3))})).Else((()=>{r.assign(Go(e.y.greaterThan(0),1,4))}))})).Else((()=>{Gi(t.z.greaterThan(t.y),(()=>{r.assign(Go(e.z.greaterThan(0),2,5))})).Else((()=>{r.assign(Go(e.y.greaterThan(0),1,4))}))})),r})).setLayout({name:"getFace",type:"float",inputs:[{name:"direction",type:"vec3"}]}),xg=Vi((([e,t])=>{const r=qi().toVar();return Gi(t.equal(0),(()=>{r.assign(qi(e.z,e.y).div(Qa(e.x)))})).ElseIf(t.equal(1),(()=>{r.assign(qi(e.x.negate(),e.z.negate()).div(Qa(e.y)))})).ElseIf(t.equal(2),(()=>{r.assign(qi(e.x.negate(),e.y).div(Qa(e.z)))})).ElseIf(t.equal(3),(()=>{r.assign(qi(e.z.negate(),e.y).div(Qa(e.x)))})).ElseIf(t.equal(4),(()=>{r.assign(qi(e.x.negate(),e.z).div(Qa(e.y)))})).Else((()=>{r.assign(qi(e.x,e.y).div(Qa(e.z)))})),na(.5,r.add(1))})).setLayout({name:"getUV",type:"vec2",inputs:[{name:"direction",type:"vec3"},{name:"face",type:"float"}]}),bg=Vi((([e])=>{const t=$i(0).toVar();return Gi(e.greaterThanEqual(og),(()=>{t.assign(ng.sub(e).mul(ug.sub(ag)).div(ng.sub(og)).add(ag))})).ElseIf(e.greaterThanEqual(lg),(()=>{t.assign(og.sub(e).mul(dg.sub(ug)).div(og.sub(lg)).add(ug))})).ElseIf(e.greaterThanEqual(cg),(()=>{t.assign(lg.sub(e).mul(hg.sub(dg)).div(lg.sub(cg)).add(dg))})).ElseIf(e.greaterThanEqual(pg),(()=>{t.assign(cg.sub(e).mul(gg.sub(hg)).div(cg.sub(pg)).add(hg))})).Else((()=>{t.assign($i(-2).mul(Ua(na(1.16,e))))})),t})).setLayout({name:"roughnessToMip",type:"float",inputs:[{name:"roughness",type:"float"}]}),Tg=Vi((([e,t])=>{const r=e.toVar();r.assign(na(2,r).sub(1));const s=Qi(r,1).toVar();return Gi(t.equal(0),(()=>{s.assign(s.zyx)})).ElseIf(t.equal(1),(()=>{s.assign(s.xzy),s.xz.mulAssign(-1)})).ElseIf(t.equal(2),(()=>{s.x.mulAssign(-1)})).ElseIf(t.equal(3),(()=>{s.assign(s.zyx),s.xz.mulAssign(-1)})).ElseIf(t.equal(4),(()=>{s.assign(s.xzy),s.xy.mulAssign(-1)})).ElseIf(t.equal(5),(()=>{s.z.mulAssign(-1)})),s})).setLayout({name:"getDirection",type:"vec3",inputs:[{name:"uv",type:"vec2"},{name:"face",type:"float"}]}),_g=Vi((([e,t,r,s,i,n])=>{const a=$i(r),o=Qi(t),u=Ro(bg(a),ag,n),l=Ha(u),d=ka(u),c=Qi(vg(e,o,d,s,i,n)).toVar();return Gi(l.notEqual(0),(()=>{const t=Qi(vg(e,o,d.add(1),s,i,n)).toVar();c.assign(Ao(c,t,l))})),c})),vg=Vi((([e,t,r,s,i,n])=>{const a=$i(r).toVar(),o=Qi(t),u=$i(yg(o)).toVar(),l=$i(po(mg.sub(a),0)).toVar();a.assign(po(a,mg));const d=$i(Da(a)).toVar(),c=qi(xg(o,u).mul(d.sub(2)).add(1)).toVar();return Gi(u.greaterThan(2),(()=>{c.y.addAssign(d),u.subAssign(3)})),c.x.addAssign(u.mul(d)),c.x.addAssign(l.mul(na(3,fg))),c.y.addAssign(na(4,Da(n).sub(d))),c.x.mulAssign(s),c.y.mulAssign(i),e.sample(c).grad(qi(),qi())})),Ng=Vi((({envMap:e,mipInt:t,outputDirection:r,theta:s,axis:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:a,CUBEUV_MAX_MIP:o})=>{const u=ja(s),l=r.mul(u).add(i.cross(r).mul(Wa(s))).add(i.mul(i.dot(r).mul(u.oneMinus())));return vg(e,l,t,n,a,o)})),Sg=Vi((({n:e,latitudinal:t,poleAxis:r,outputDirection:s,weights:i,samples:n,dTheta:a,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})=>{const h=Qi(Go(t,r,bo(r,s))).toVar();Gi(h.equal(Qi(0)),(()=>{h.assign(Qi(s.z,0,s.x.negate()))})),h.assign($a(h));const p=Qi().toVar();return p.addAssign(i.element(0).mul(Ng({theta:0,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),kc({start:Hi(1),end:e},(({i:e})=>{Gi(e.greaterThanEqual(n),(()=>{zc()}));const t=$i(a.mul($i(e))).toVar();p.addAssign(i.element(e).mul(Ng({theta:t.mul(-1),axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),p.addAssign(i.element(e).mul(Ng({theta:t,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})))})),tn(p,1)})),Eg=[.125,.215,.35,.446,.526,.582],wg=20,Ag=new ie(-1,1,1,-1,0,1),Rg=new ne(90,1),Cg=new e;let Mg=null,Pg=0,Lg=0;const Fg=(1+Math.sqrt(5))/2,Bg=1/Fg,Ig=[new r(-Fg,Bg,0),new r(Fg,Bg,0),new r(-Bg,0,Fg),new r(Bg,0,Fg),new r(0,Fg,-Bg),new r(0,Fg,Bg),new r(-1,1,-1),new r(1,1,-1),new r(-1,1,1),new r(1,1,1)],Dg=new r,Vg=new WeakMap,Ug=[3,1,5,0,4,2],Og=Tg(Uu(),Vu("faceIndex")).normalize(),Gg=Qi(Og.x,Og.y,Og.z);class kg{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._lodPlanes=[],this._sizeLods=[],this._sigmas=[],this._lodMeshes=[],this._blurMaterial=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._backgroundBox=null}get _hasInitialized(){return this._renderer.hasInitialized()}fromScene(e,t=0,r=.1,s=100,i={}){const{size:n=256,position:a=Dg,renderTarget:o=null}=i;if(this._setSize(n),!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromScene() called before the backend is initialized. Try using .fromSceneAsync() instead.");const n=o||this._allocateTargets();return i.renderTarget=n,this.fromSceneAsync(e,t,r,s,i),n}Mg=this._renderer.getRenderTarget(),Pg=this._renderer.getActiveCubeFace(),Lg=this._renderer.getActiveMipmapLevel();const u=o||this._allocateTargets();return u.depthBuffer=!0,this._sceneToCubeUV(e,r,s,u,a),t>0&&this._blur(u,0,0,t),this._applyPMREM(u),this._cleanup(u),u}async fromSceneAsync(e,t=0,r=.1,s=100,i={}){return!1===this._hasInitialized&&await this._renderer.init(),this.fromScene(e,t,r,s,i)}fromEquirectangular(e,t=null){if(!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromEquirectangular() called before the backend is initialized. Try using .fromEquirectangularAsync() instead."),this._setSizeFromTexture(e);const r=t||this._allocateTargets();return this.fromEquirectangularAsync(e,r),r}return this._fromTexture(e,t)}async fromEquirectangularAsync(e,t=null){return!1===this._hasInitialized&&await this._renderer.init(),this._fromTexture(e,t)}fromCubemap(e,t=null){if(!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromCubemap() called before the backend is initialized. Try using .fromCubemapAsync() instead."),this._setSizeFromTexture(e);const r=t||this._allocateTargets();return this.fromCubemapAsync(e,t),r}return this._fromTexture(e,t)}async fromCubemapAsync(e,t=null){return!1===this._hasInitialized&&await this._renderer.init(),this._fromTexture(e,t)}async compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=Wg(),await this._compileMaterial(this._cubemapMaterial))}async compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=jg(),await this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),null!==this._cubemapMaterial&&this._cubemapMaterial.dispose(),null!==this._equirectMaterial&&this._equirectMaterial.dispose(),null!==this._backgroundBox&&(this._backgroundBox.geometry.dispose(),this._backgroundBox.material.dispose())}_setSizeFromTexture(e){e.mapping===E||e.mapping===w?this._setSize(0===e.image.length?16:e.image[0].width||e.image[0].image.width):this._setSize(e.image.width/4)}_setSize(e){this._lodMax=Math.floor(Math.log2(e)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){null!==this._blurMaterial&&this._blurMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;ee-4?u=Eg[o-e+4-1]:0===o&&(u=0),s.push(u);const l=1/(a-2),d=-l,c=1+l,h=[d,d,c,d,c,c,d,d,c,c,d,c],p=6,g=6,m=3,f=2,y=1,x=new Float32Array(m*g*p),b=new Float32Array(f*g*p),T=new Float32Array(y*g*p);for(let e=0;e2?0:-1,s=[t,r,0,t+2/3,r,0,t+2/3,r+1,0,t,r,0,t+2/3,r+1,0,t,r+1,0],i=Ug[e];x.set(s,m*g*i),b.set(h,f*g*i);const n=[i,i,i,i,i,i];T.set(n,y*g*i)}const _=new ue;_.setAttribute("position",new le(x,m)),_.setAttribute("uv",new le(b,f)),_.setAttribute("faceIndex",new le(T,y)),t.push(_),i.push(new W(_,null)),n>4&&n--}return{lodPlanes:t,sizeLods:r,sigmas:s,lodMeshes:i}}(i)),this._blurMaterial=function(e,t,s){const i=Yu(new Array(wg).fill(0)),n=Tn(new r(0,1,0)),a=Tn(0),o=$i(wg),u=Tn(0),l=Tn(1),d=Hu(null),c=Tn(0),h=$i(1/t),p=$i(1/s),g=$i(e),m={n:o,latitudinal:u,weights:i,poleAxis:n,outputDirection:Gg,dTheta:a,samples:l,envMap:d,mipInt:c,CUBEUV_TEXEL_WIDTH:h,CUBEUV_TEXEL_HEIGHT:p,CUBEUV_MAX_MIP:g},f=Hg("blur");return f.fragmentNode=Sg({...m,latitudinal:u.equal(1)}),Vg.set(f,m),f}(i,e,t)}return i}async _compileMaterial(e){const t=new W(this._lodPlanes[0],e);await this._renderer.compile(t,Ag)}_sceneToCubeUV(e,t,r,s,i){const n=Rg;n.near=t,n.far=r;const a=[1,1,1,1,-1,1],o=[1,-1,1,-1,1,-1],u=this._renderer,l=u.autoClear;u.getClearColor(Cg),u.autoClear=!1;let d=this._backgroundBox;if(null===d){const e=new te({name:"PMREM.Background",side:N,depthWrite:!1,depthTest:!1});d=new W(new H,e)}let c=!1;const h=e.background;h?h.isColor&&(d.material.color.copy(h),e.background=null,c=!0):(d.material.color.copy(Cg),c=!0),u.setRenderTarget(s),u.clear(),c&&u.render(d,n);for(let t=0;t<6;t++){const r=t%3;0===r?(n.up.set(0,a[t],0),n.position.set(i.x,i.y,i.z),n.lookAt(i.x+o[t],i.y,i.z)):1===r?(n.up.set(0,0,a[t]),n.position.set(i.x,i.y,i.z),n.lookAt(i.x,i.y+o[t],i.z)):(n.up.set(0,a[t],0),n.position.set(i.x,i.y,i.z),n.lookAt(i.x,i.y,i.z+o[t]));const l=this._cubeSize;$g(s,r*l,t>2?l:0,l,l),u.render(e,n)}u.autoClear=l,e.background=h}_textureToCubeUV(e,t){const r=this._renderer,s=e.mapping===E||e.mapping===w;s?null===this._cubemapMaterial&&(this._cubemapMaterial=Wg(e)):null===this._equirectMaterial&&(this._equirectMaterial=jg(e));const i=s?this._cubemapMaterial:this._equirectMaterial;i.fragmentNode.value=e;const n=this._lodMeshes[0];n.material=i;const a=this._cubeSize;$g(t,0,0,3*a,2*a),r.setRenderTarget(t),r.render(n,Ag)}_applyPMREM(e){const t=this._renderer,r=t.autoClear;t.autoClear=!1;const s=this._lodPlanes.length;for(let t=1;twg&&console.warn(`sigmaRadians, ${i}, is too large and will clip, as it requested ${g} samples when the maximum is set to 20`);const m=[];let f=0;for(let e=0;ey-4?s-y+4:0),4*(this._cubeSize-x),3*x,2*x),o.setRenderTarget(t),o.render(l,Ag)}}function zg(e,t,r){const s=new ae(e,t,r);return s.texture.mapping=oe,s.texture.name="PMREM.cubeUv",s.texture.isPMREMTexture=!0,s.scissorTest=!0,s}function $g(e,t,r,s,i){e.viewport.set(t,r,s,i),e.scissor.set(t,r,s,i)}function Hg(e){const t=new Fh;return t.depthTest=!1,t.depthWrite=!1,t.blending=G,t.name=`PMREM_${e}`,t}function Wg(e){const t=Hg("cubemap");return t.fragmentNode=sd(e,Gg),t}function jg(e){const t=Hg("equirect");return t.fragmentNode=Hu(e,qh(Gg),0),t}const qg=new WeakMap;function Xg(e,t,r){const s=function(e){let t=qg.get(e);void 0===t&&(t=new WeakMap,qg.set(e,t));return t}(t);let i=s.get(e);if((void 0!==i?i.pmremVersion:-1)!==e.pmremVersion){const t=e.image;if(e.isCubeTexture){if(!function(e){if(null==e)return!1;let t=0;const r=6;for(let s=0;s0}(t))return null;i=r.fromEquirectangular(e,i)}i.pmremVersion=e.pmremVersion,s.set(e,i)}return i.texture}class Kg extends js{static get type(){return"PMREMNode"}constructor(e,t=null,r=null){super("vec3"),this._value=e,this._pmrem=null,this.uvNode=t,this.levelNode=r,this._generator=null;const s=new pe;s.isRenderTargetTexture=!0,this._texture=Hu(s),this._width=Tn(0),this._height=Tn(0),this._maxMip=Tn(0),this.updateBeforeType=Is.RENDER}set value(e){this._value=e,this._pmrem=null}get value(){return this._value}updateFromTexture(e){const t=function(e){const t=Math.log2(e)-2,r=1/e;return{texelWidth:1/(3*Math.max(Math.pow(2,t),112)),texelHeight:r,maxMip:t}}(e.image.height);this._texture.value=e,this._width.value=t.texelWidth,this._height.value=t.texelHeight,this._maxMip.value=t.maxMip}updateBefore(e){let t=this._pmrem;const r=t?t.pmremVersion:-1,s=this._value;r!==s.pmremVersion&&(t=!0===s.isPMREMTexture?s:Xg(s,e.renderer,this._generator),null!==t&&(this._pmrem=t,this.updateFromTexture(t)))}setup(e){null===this._generator&&(this._generator=new kg(e.renderer)),this.updateBefore(e);let t=this.uvNode;null===t&&e.context.getUV&&(t=e.context.getUV(this)),t=Ql.mul(Qi(t.x,t.y.negate(),t.z));let r=this.levelNode;return null===r&&e.context.getTextureLevel&&(r=e.context.getTextureLevel(this)),_g(this._texture,t,r,this._width,this._height,this._maxMip)}dispose(){super.dispose(),null!==this._generator&&this._generator.dispose()}}const Yg=Bi(Kg).setParameterLength(1,3),Qg=new WeakMap;class Zg extends Xc{static get type(){return"EnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){const{material:t}=e;let r=this.envNode;if(r.isTextureNode||r.isMaterialReferenceNode){const e=r.isTextureNode?r.value:t[r.property];let s=Qg.get(e);void 0===s&&(s=Yg(e),Qg.set(e,s)),r=s}const s=!0===t.useAnisotropy||t.anisotropy>0?Ed:zl,i=r.context(Jg(wn,s)).mul(Yl),n=r.context(em($l)).mul(Math.PI).mul(Yl),a=Nu(i),o=Nu(n);e.context.radiance.addAssign(a),e.context.iblIrradiance.addAssign(o);const u=e.context.lightingModel.clearcoatRadiance;if(u){const e=r.context(Jg(Cn,Hl)).mul(Yl),t=Nu(e);u.addAssign(t)}}}const Jg=(e,t)=>{let r=null;return{getUV:()=>(null===r&&(r=Fl.negate().reflect(t),r=e.mul(e).mix(r,t).normalize(),r=r.transformDirection(rl)),r),getTextureLevel:()=>e}},em=e=>({getUV:()=>e,getTextureLevel:()=>$i(1)}),tm=new ge;class rm extends Fh{static get type(){return"MeshStandardNodeMaterial"}constructor(e){super(),this.isMeshStandardNodeMaterial=!0,this.lights=!0,this.emissiveNode=null,this.metalnessNode=null,this.roughnessNode=null,this.setDefaultValues(tm),this.setValues(e)}setupEnvironment(e){let t=super.setupEnvironment(e);return null===t&&e.environmentNode&&(t=e.environmentNode),t?new Zg(t):null}setupLightingModel(){return new ig}setupSpecular(){const e=Ao(Qi(.04),Sn.rgb,An);On.assign(e),Gn.assign(1)}setupVariants(){const e=this.metalnessNode?$i(this.metalnessNode):jd;An.assign(e);let t=this.roughnessNode?$i(this.roughnessNode):Wd;t=fp({roughness:t}),wn.assign(t),this.setupSpecular(),Sn.assign(tn(Sn.rgb.mul(e.oneMinus()),Sn.a))}copy(e){return this.emissiveNode=e.emissiveNode,this.metalnessNode=e.metalnessNode,this.roughnessNode=e.roughnessNode,super.copy(e)}}const sm=new me;class im extends rm{static get type(){return"MeshPhysicalNodeMaterial"}constructor(e){super(),this.isMeshPhysicalNodeMaterial=!0,this.clearcoatNode=null,this.clearcoatRoughnessNode=null,this.clearcoatNormalNode=null,this.sheenNode=null,this.sheenRoughnessNode=null,this.iridescenceNode=null,this.iridescenceIORNode=null,this.iridescenceThicknessNode=null,this.specularIntensityNode=null,this.specularColorNode=null,this.iorNode=null,this.transmissionNode=null,this.thicknessNode=null,this.attenuationDistanceNode=null,this.attenuationColorNode=null,this.dispersionNode=null,this.anisotropyNode=null,this.setDefaultValues(sm),this.setValues(e)}get useClearcoat(){return this.clearcoat>0||null!==this.clearcoatNode}get useIridescence(){return this.iridescence>0||null!==this.iridescenceNode}get useSheen(){return this.sheen>0||null!==this.sheenNode}get useAnisotropy(){return this.anisotropy>0||null!==this.anisotropyNode}get useTransmission(){return this.transmission>0||null!==this.transmissionNode}get useDispersion(){return this.dispersion>0||null!==this.dispersionNode}setupSpecular(){const e=this.iorNode?$i(this.iorNode):ac;jn.assign(e),On.assign(Ao(ho(_o(jn.sub(1).div(jn.add(1))).mul(zd),Qi(1)).mul(kd),Sn.rgb,An)),Gn.assign(Ao(kd,1,An))}setupLightingModel(){return new ig(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion)}setupVariants(e){if(super.setupVariants(e),this.useClearcoat){const e=this.clearcoatNode?$i(this.clearcoatNode):Xd,t=this.clearcoatRoughnessNode?$i(this.clearcoatRoughnessNode):Kd;Rn.assign(e),Cn.assign(fp({roughness:t}))}if(this.useSheen){const e=this.sheenNode?Qi(this.sheenNode):Zd,t=this.sheenRoughnessNode?$i(this.sheenRoughnessNode):Jd;Mn.assign(e),Pn.assign(t)}if(this.useIridescence){const e=this.iridescenceNode?$i(this.iridescenceNode):tc,t=this.iridescenceIORNode?$i(this.iridescenceIORNode):rc,r=this.iridescenceThicknessNode?$i(this.iridescenceThicknessNode):sc;Ln.assign(e),Fn.assign(t),Bn.assign(r)}if(this.useAnisotropy){const e=(this.anisotropyNode?qi(this.anisotropyNode):ec).toVar();Dn.assign(e.length()),Gi(Dn.equal(0),(()=>{e.assign(qi(1,0))})).Else((()=>{e.divAssign(qi(Dn)),Dn.assign(Dn.saturate())})),In.assign(Dn.pow2().mix(wn.pow2(),1)),Vn.assign(Nd[0].mul(e.x).add(Nd[1].mul(e.y))),Un.assign(Nd[1].mul(e.x).sub(Nd[0].mul(e.y)))}if(this.useTransmission){const e=this.transmissionNode?$i(this.transmissionNode):ic,t=this.thicknessNode?$i(this.thicknessNode):nc,r=this.attenuationDistanceNode?$i(this.attenuationDistanceNode):oc,s=this.attenuationColorNode?Qi(this.attenuationColorNode):uc;if(qn.assign(e),Xn.assign(t),Kn.assign(r),Yn.assign(s),this.useDispersion){const e=this.dispersionNode?$i(this.dispersionNode):mc;Qn.assign(e)}}}setupClearcoatNormal(){return this.clearcoatNormalNode?Qi(this.clearcoatNormalNode):Yd}setup(e){e.context.setupClearcoatNormal=()=>this.setupClearcoatNormal(e),super.setup(e)}copy(e){return this.clearcoatNode=e.clearcoatNode,this.clearcoatRoughnessNode=e.clearcoatRoughnessNode,this.clearcoatNormalNode=e.clearcoatNormalNode,this.sheenNode=e.sheenNode,this.sheenRoughnessNode=e.sheenRoughnessNode,this.iridescenceNode=e.iridescenceNode,this.iridescenceIORNode=e.iridescenceIORNode,this.iridescenceThicknessNode=e.iridescenceThicknessNode,this.specularIntensityNode=e.specularIntensityNode,this.specularColorNode=e.specularColorNode,this.transmissionNode=e.transmissionNode,this.thicknessNode=e.thicknessNode,this.attenuationDistanceNode=e.attenuationDistanceNode,this.attenuationColorNode=e.attenuationColorNode,this.dispersionNode=e.dispersionNode,this.anisotropyNode=e.anisotropyNode,super.copy(e)}}class nm extends ig{constructor(e=!1,t=!1,r=!1,s=!1,i=!1,n=!1,a=!1){super(e,t,r,s,i,n),this.useSSS=a}direct({lightDirection:e,lightColor:t,reflectedLight:r},s){if(!0===this.useSSS){const i=s.material,{thicknessColorNode:n,thicknessDistortionNode:a,thicknessAmbientNode:o,thicknessAttenuationNode:u,thicknessPowerNode:l,thicknessScaleNode:d}=i,c=e.add(zl.mul(a)).normalize(),h=$i(Fl.dot(c.negate()).saturate().pow(l).mul(d)),p=Qi(h.add(o).mul(n));r.directDiffuse.addAssign(p.mul(u.mul(t)))}super.direct({lightDirection:e,lightColor:t,reflectedLight:r},s)}}class am extends im{static get type(){return"MeshSSSNodeMaterial"}constructor(e){super(e),this.thicknessColorNode=null,this.thicknessDistortionNode=$i(.1),this.thicknessAmbientNode=$i(0),this.thicknessAttenuationNode=$i(.1),this.thicknessPowerNode=$i(2),this.thicknessScaleNode=$i(10)}get useSSS(){return null!==this.thicknessColorNode}setupLightingModel(){return new nm(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion,this.useSSS)}copy(e){return this.thicknessColorNode=e.thicknessColorNode,this.thicknessDistortionNode=e.thicknessDistortionNode,this.thicknessAmbientNode=e.thicknessAmbientNode,this.thicknessAttenuationNode=e.thicknessAttenuationNode,this.thicknessPowerNode=e.thicknessPowerNode,this.thicknessScaleNode=e.thicknessScaleNode,super.copy(e)}}const om=Vi((({normal:e,lightDirection:t,builder:r})=>{const s=e.dot(t),i=qi(s.mul(.5).add(.5),0);if(r.material.gradientMap){const e=ld("gradientMap","texture").context({getUV:()=>i});return Qi(e.r)}{const e=i.fwidth().mul(.5);return Ao(Qi(.7),Qi(1),Po($i(.7).sub(e.x),$i(.7).add(e.x),i.x))}}));class um extends rp{direct({lightDirection:e,lightColor:t,reflectedLight:r},s){const i=om({normal:Vl,lightDirection:e,builder:s}).mul(t);r.directDiffuse.addAssign(i.mul(op({diffuseColor:Sn.rgb})))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(op({diffuseColor:Sn}))),s.indirectDiffuse.mulAssign(t)}}const lm=new fe;class dm extends Fh{static get type(){return"MeshToonNodeMaterial"}constructor(e){super(),this.isMeshToonNodeMaterial=!0,this.lights=!0,this.setDefaultValues(lm),this.setValues(e)}setupLightingModel(){return new um}}class cm extends js{static get type(){return"MatcapUVNode"}constructor(){super("vec2")}setup(){const e=Qi(Fl.z,0,Fl.x.negate()).normalize(),t=Fl.cross(e);return qi(e.dot(zl),t.dot(zl)).mul(.495).add(.5)}}const hm=Ii(cm),pm=new ye;class gm extends Fh{static get type(){return"MeshMatcapNodeMaterial"}constructor(e){super(),this.isMeshMatcapNodeMaterial=!0,this.setDefaultValues(pm),this.setValues(e)}setupVariants(e){const t=hm;let r;r=e.material.matcap?ld("matcap","texture").context({getUV:()=>t}):Qi(Ao(.2,.8,t.y)),Sn.rgb.mulAssign(r.rgb)}}class mm extends js{static get type(){return"RotateNode"}constructor(e,t){super(),this.positionNode=e,this.rotationNode=t}getNodeType(e){return this.positionNode.getNodeType(e)}setup(e){const{rotationNode:t,positionNode:r}=this;if("vec2"===this.getNodeType(e)){const e=t.cos(),s=t.sin();return an(e,s,s.negate(),e).mul(r)}{const e=t,s=un(tn(1,0,0,0),tn(0,ja(e.x),Wa(e.x).negate(),0),tn(0,Wa(e.x),ja(e.x),0),tn(0,0,0,1)),i=un(tn(ja(e.y),0,Wa(e.y),0),tn(0,1,0,0),tn(Wa(e.y).negate(),0,ja(e.y),0),tn(0,0,0,1)),n=un(tn(ja(e.z),Wa(e.z).negate(),0,0),tn(Wa(e.z),ja(e.z),0,0),tn(0,0,1,0),tn(0,0,0,1));return s.mul(i).mul(n).mul(tn(r,1)).xyz}}}const fm=Bi(mm).setParameterLength(2),ym=new xe;class xm extends Fh{static get type(){return"SpriteNodeMaterial"}constructor(e){super(),this.isSpriteNodeMaterial=!0,this._useSizeAttenuation=!0,this.positionNode=null,this.rotationNode=null,this.scaleNode=null,this.transparent=!0,this.setDefaultValues(ym),this.setValues(e)}setupPositionView(e){const{object:t,camera:r}=e,s=this.sizeAttenuation,{positionNode:i,rotationNode:n,scaleNode:a}=this,o=Nl.mul(Qi(i||0));let u=qi(fl[0].xyz.length(),fl[1].xyz.length());if(null!==a&&(u=u.mul(qi(a))),!1===s)if(r.isPerspectiveCamera)u=u.mul(o.z.negate());else{const e=$i(2).div(el.element(1).element(1));u=u.mul(e.mul(2))}let l=Al.xy;if(t.center&&!0===t.center.isVector2){const e=((e,t,r)=>Pi(new lu(e,t,r)))("center","vec2",t);l=l.sub(e.sub(.5))}l=l.mul(u);const d=$i(n||Qd),c=fm(l,d);return tn(o.xy.add(c),o.zw)}copy(e){return this.positionNode=e.positionNode,this.rotationNode=e.rotationNode,this.scaleNode=e.scaleNode,super.copy(e)}get sizeAttenuation(){return this._useSizeAttenuation}set sizeAttenuation(e){this._useSizeAttenuation!==e&&(this._useSizeAttenuation=e,this.needsUpdate=!0)}}const bm=new be;class Tm extends xm{static get type(){return"PointsNodeMaterial"}constructor(e){super(),this.sizeNode=null,this.isPointsNodeMaterial=!0,this.setDefaultValues(bm),this.setValues(e)}setupPositionView(){const{positionNode:e}=this;return Nl.mul(Qi(e||Rl)).xyz}setupVertex(e){const t=super.setupVertex(e);if(!0!==e.material.isNodeMaterial)return t;const{rotationNode:r,scaleNode:s,sizeNode:i}=this,n=Al.xy.toVar(),a=nh.z.div(nh.w);if(r&&r.isNode){const e=$i(r);n.assign(fm(n,e))}let o=null!==i?qi(i):gc;return!0===this.sizeAttenuation&&(o=o.mul(o.div(Ll.z.negate()))),s&&s.isNode&&(o=o.mul(qi(s))),n.mulAssign(o.mul(2)),n.assign(n.div(nh.z)),n.y.assign(n.y.mul(a)),n.assign(n.mul(t.w)),t.addAssign(tn(n,0,0)),t}get alphaToCoverage(){return this._useAlphaToCoverage}set alphaToCoverage(e){this._useAlphaToCoverage!==e&&(this._useAlphaToCoverage=e,this.needsUpdate=!0)}}class _m extends rp{constructor(){super(),this.shadowNode=$i(1).toVar("shadowMask")}direct({lightNode:e}){this.shadowNode.mulAssign(e.shadowNode)}finish({context:e}){Sn.a.mulAssign(this.shadowNode.oneMinus()),e.outgoingLight.rgb.assign(Sn.rgb)}}const vm=new Te;class Nm extends Fh{static get type(){return"ShadowNodeMaterial"}constructor(e){super(),this.isShadowNodeMaterial=!0,this.lights=!0,this.transparent=!0,this.setDefaultValues(vm),this.setValues(e)}setupLightingModel(){return new _m}}const Sm=vn("vec3"),Em=vn("vec3"),wm=vn("vec3");class Am extends rp{constructor(){super()}start(e){const{material:t,context:r}=e,s=vn("vec3"),i=vn("vec3");Gi(nl.sub(Ml).length().greaterThan(Tl.mul(2)),(()=>{s.assign(nl),i.assign(Ml)})).Else((()=>{s.assign(Ml),i.assign(nl)}));const n=i.sub(s),a=Tn("int").onRenderUpdate((({material:e})=>e.steps)),o=n.length().div(a).toVar(),u=n.normalize().toVar(),l=$i(0).toVar(),d=Qi(1).toVar();t.offsetNode&&l.addAssign(t.offsetNode.mul(o)),kc(a,(()=>{const i=s.add(u.mul(l)),n=rl.mul(tn(i,1)).xyz;let a;null!==t.depthNode&&(Em.assign(wh(_h(n.z,Zu,Ju))),r.sceneDepthNode=wh(t.depthNode).toVar()),r.positionWorld=i,r.shadowPositionWorld=i,r.positionView=n,Sm.assign(0),t.scatteringNode&&(a=t.scatteringNode({positionRay:i})),super.start(e),a&&Sm.mulAssign(a);const c=Sm.mul(.01).negate().mul(o).exp();d.mulAssign(c),l.addAssign(o)})),wm.addAssign(d.saturate().oneMinus())}scatteringLight(e,t){const r=t.context.sceneDepthNode;r?Gi(r.greaterThanEqual(Em),(()=>{Sm.addAssign(e)})):Sm.addAssign(e)}direct({lightNode:e,lightColor:t},r){if(void 0===e.light.distance)return;const s=t.xyz.toVar();s.mulAssign(e.shadowNode),this.scatteringLight(s,r)}directRectArea({lightColor:e,lightPosition:t,halfWidth:r,halfHeight:s},i){const n=t.add(r).sub(s),a=t.sub(r).sub(s),o=t.sub(r).add(s),u=t.add(r).add(s),l=i.context.positionView,d=e.xyz.mul(Fp({P:l,p0:n,p1:a,p2:o,p3:u})).pow(1.5);this.scatteringLight(d,i)}finish(e){e.context.outgoingLight.assign(wm)}}class Rm extends Fh{static get type(){return"VolumeNodeMaterial"}constructor(e){super(),this.isVolumeNodeMaterial=!0,this.steps=25,this.offsetNode=null,this.scatteringNode=null,this.lights=!0,this.transparent=!0,this.side=N,this.depthTest=!1,this.depthWrite=!1,this.setValues(e)}setupLightingModel(){return new Am}}class Cm{constructor(e,t){this.nodes=e,this.info=t,this._context=self,this._animationLoop=null,this._requestId=null}start(){const e=(t,r)=>{this._requestId=this._context.requestAnimationFrame(e),!0===this.info.autoReset&&this.info.reset(),this.nodes.nodeFrame.update(),this.info.frame=this.nodes.nodeFrame.frameId,null!==this._animationLoop&&this._animationLoop(t,r)};e()}stop(){this._context.cancelAnimationFrame(this._requestId),this._requestId=null}getAnimationLoop(){return this._animationLoop}setAnimationLoop(e){this._animationLoop=e}getContext(){return this._context}setContext(e){this._context=e}dispose(){this.stop()}}class Mm{constructor(){this.weakMap=new WeakMap}get(e){let t=this.weakMap;for(let r=0;r{this.dispose()},this.material.addEventListener("dispose",this.onMaterialDispose)}updateClipping(e){this.clippingContext=e}get clippingNeedsUpdate(){return null!==this.clippingContext&&this.clippingContext.cacheKey!==this.clippingContextCacheKey&&(this.clippingContextCacheKey=this.clippingContext.cacheKey,!0)}get hardwareClippingPlanes(){return!0===this.material.hardwareClipping?this.clippingContext.unionClippingCount:0}getNodeBuilderState(){return this._nodeBuilderState||(this._nodeBuilderState=this._nodes.getForRender(this))}getMonitor(){return this._monitor||(this._monitor=this.getNodeBuilderState().observer)}getBindings(){return this._bindings||(this._bindings=this.getNodeBuilderState().createBindings())}getBindingGroup(e){for(const t of this.getBindings())if(t.name===e)return t}getIndex(){return this._geometries.getIndex(this)}getIndirect(){return this._geometries.getIndirect(this)}getChainArray(){return[this.object,this.material,this.context,this.lightsNode]}setGeometry(e){this.geometry=e,this.attributes=null}getAttributes(){if(null!==this.attributes)return this.attributes;const e=this.getNodeBuilderState().nodeAttributes,t=this.geometry,r=[],s=new Set;for(const i of e){const e=i.node&&i.node.attribute?i.node.attribute:t.getAttribute(i.name);if(void 0===e)continue;r.push(e);const n=e.isInterleavedBufferAttribute?e.data:e;s.add(n)}return this.attributes=r,this.vertexBuffers=Array.from(s.values()),r}getVertexBuffers(){return null===this.vertexBuffers&&this.getAttributes(),this.vertexBuffers}getDrawParameters(){const{object:e,material:t,geometry:r,group:s,drawRange:i}=this,n=this.drawParams||(this.drawParams={vertexCount:0,firstVertex:0,instanceCount:0,firstInstance:0}),a=this.getIndex(),o=null!==a,u=r.isInstancedBufferGeometry?r.instanceCount:e.count>1?e.count:1;if(0===u)return null;if(n.instanceCount=u,!0===e.isBatchedMesh)return n;let l=1;!0!==t.wireframe||e.isPoints||e.isLineSegments||e.isLine||e.isLineLoop||(l=2);let d=i.start*l,c=(i.start+i.count)*l;null!==s&&(d=Math.max(d,s.start*l),c=Math.min(c,(s.start+s.count)*l));const h=r.attributes.position;let p=1/0;o?p=a.count:null!=h&&(p=h.count),d=Math.max(d,0),c=Math.min(c,p);const g=c-d;return g<0||g===1/0?null:(n.vertexCount=g,n.firstVertex=d,n)}getGeometryCacheKey(){const{geometry:e}=this;let t="";for(const r of Object.keys(e.attributes).sort()){const s=e.attributes[r];t+=r+",",s.data&&(t+=s.data.stride+","),s.offset&&(t+=s.offset+","),s.itemSize&&(t+=s.itemSize+","),s.normalized&&(t+="n,")}for(const r of Object.keys(e.morphAttributes).sort()){const s=e.morphAttributes[r];t+="morph-"+r+",";for(let e=0,r=s.length;e1&&(r+=e.uuid+","),r+=e.receiveShadow+",",xs(r)}get needsGeometryUpdate(){return this.geometry.id!==this.object.geometry.id}get needsUpdate(){return this.initialNodesCacheKey!==this.getDynamicCacheKey()||this.clippingNeedsUpdate}getDynamicCacheKey(){let e=0;return!0!==this.material.isShadowPassMaterial&&(e=this._nodes.getCacheKey(this.scene,this.lightsNode)),this.camera.isArrayCamera&&(e=Ts(e,this.camera.cameras.length)),this.object.receiveShadow&&(e=Ts(e,1)),e}getCacheKey(){return this.getMaterialCacheKey()+this.getDynamicCacheKey()}dispose(){this.material.removeEventListener("dispose",this.onMaterialDispose),this.onDispose()}}const Fm=[];class Bm{constructor(e,t,r,s,i,n){this.renderer=e,this.nodes=t,this.geometries=r,this.pipelines=s,this.bindings=i,this.info=n,this.chainMaps={}}get(e,t,r,s,i,n,a,o){const u=this.getChainMap(o);Fm[0]=e,Fm[1]=t,Fm[2]=n,Fm[3]=i;let l=u.get(Fm);return void 0===l?(l=this.createRenderObject(this.nodes,this.geometries,this.renderer,e,t,r,s,i,n,a,o),u.set(Fm,l)):(l.updateClipping(a),l.needsGeometryUpdate&&l.setGeometry(e.geometry),(l.version!==t.version||l.needsUpdate)&&(l.initialCacheKey!==l.getCacheKey()?(l.dispose(),l=this.get(e,t,r,s,i,n,a,o)):l.version=t.version)),Fm.length=0,l}getChainMap(e="default"){return this.chainMaps[e]||(this.chainMaps[e]=new Mm)}dispose(){this.chainMaps={}}createRenderObject(e,t,r,s,i,n,a,o,u,l,d){const c=this.getChainMap(d),h=new Lm(e,t,r,s,i,n,a,o,u,l);return h.onDispose=()=>{this.pipelines.delete(h),this.bindings.delete(h),this.nodes.delete(h),c.delete(h.getChainArray())},h}}class Im{constructor(){this.data=new WeakMap}get(e){let t=this.data.get(e);return void 0===t&&(t={},this.data.set(e,t)),t}delete(e){let t=null;return this.data.has(e)&&(t=this.data.get(e),this.data.delete(e)),t}has(e){return this.data.has(e)}dispose(){this.data=new WeakMap}}const Dm=1,Vm=2,Um=3,Om=4,Gm=16;class km extends Im{constructor(e){super(),this.backend=e}delete(e){const t=super.delete(e);return null!==t&&this.backend.destroyAttribute(e),t}update(e,t){const r=this.get(e);if(void 0===r.version)t===Dm?this.backend.createAttribute(e):t===Vm?this.backend.createIndexAttribute(e):t===Um?this.backend.createStorageAttribute(e):t===Om&&this.backend.createIndirectStorageAttribute(e),r.version=this._getBufferAttribute(e).version;else{const t=this._getBufferAttribute(e);(r.version{this.info.memory.geometries--;const s=t.index,i=e.getAttributes();null!==s&&this.attributes.delete(s);for(const e of i)this.attributes.delete(e);const n=this.wireframes.get(t);void 0!==n&&this.attributes.delete(n),t.removeEventListener("dispose",r)};t.addEventListener("dispose",r)}updateAttributes(e){const t=e.getAttributes();for(const e of t)e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute?this.updateAttribute(e,Um):this.updateAttribute(e,Dm);const r=this.getIndex(e);null!==r&&this.updateAttribute(r,Vm);const s=e.geometry.indirect;null!==s&&this.updateAttribute(s,Om)}updateAttribute(e,t){const r=this.info.render.calls;e.isInterleavedBufferAttribute?void 0===this.attributeCall.get(e)?(this.attributes.update(e,t),this.attributeCall.set(e,r)):this.attributeCall.get(e.data)!==r&&(this.attributes.update(e,t),this.attributeCall.set(e.data,r),this.attributeCall.set(e,r)):this.attributeCall.get(e)!==r&&(this.attributes.update(e,t),this.attributeCall.set(e,r))}getIndirect(e){return e.geometry.indirect}getIndex(e){const{geometry:t,material:r}=e;let s=t.index;if(!0===r.wireframe){const e=this.wireframes;let r=e.get(t);void 0===r?(r=$m(t),e.set(t,r)):r.version!==zm(t)&&(this.attributes.delete(r),r=$m(t),e.set(t,r)),s=r}return s}}class Wm{constructor(){this.autoReset=!0,this.frame=0,this.calls=0,this.render={calls:0,frameCalls:0,drawCalls:0,triangles:0,points:0,lines:0,timestamp:0},this.compute={calls:0,frameCalls:0,timestamp:0},this.memory={geometries:0,textures:0}}update(e,t,r){this.render.drawCalls++,e.isMesh||e.isSprite?this.render.triangles+=r*(t/3):e.isPoints?this.render.points+=r*t:e.isLineSegments?this.render.lines+=r*(t/2):e.isLine?this.render.lines+=r*(t-1):console.error("THREE.WebGPUInfo: Unknown object type.")}reset(){this.render.drawCalls=0,this.render.frameCalls=0,this.compute.frameCalls=0,this.render.triangles=0,this.render.points=0,this.render.lines=0}dispose(){this.reset(),this.calls=0,this.render.calls=0,this.compute.calls=0,this.render.timestamp=0,this.compute.timestamp=0,this.memory.geometries=0,this.memory.textures=0}}class jm{constructor(e){this.cacheKey=e,this.usedTimes=0}}class qm extends jm{constructor(e,t,r){super(e),this.vertexProgram=t,this.fragmentProgram=r}}class Xm extends jm{constructor(e,t){super(e),this.computeProgram=t,this.isComputePipeline=!0}}let Km=0;class Ym{constructor(e,t,r,s=null,i=null){this.id=Km++,this.code=e,this.stage=t,this.name=r,this.transforms=s,this.attributes=i,this.usedTimes=0}}class Qm extends Im{constructor(e,t){super(),this.backend=e,this.nodes=t,this.bindings=null,this.caches=new Map,this.programs={vertex:new Map,fragment:new Map,compute:new Map}}getForCompute(e,t){const{backend:r}=this,s=this.get(e);if(this._needsComputeUpdate(e)){const i=s.pipeline;i&&(i.usedTimes--,i.computeProgram.usedTimes--);const n=this.nodes.getForCompute(e);let a=this.programs.compute.get(n.computeShader);void 0===a&&(i&&0===i.computeProgram.usedTimes&&this._releaseProgram(i.computeProgram),a=new Ym(n.computeShader,"compute",e.name,n.transforms,n.nodeAttributes),this.programs.compute.set(n.computeShader,a),r.createProgram(a));const o=this._getComputeCacheKey(e,a);let u=this.caches.get(o);void 0===u&&(i&&0===i.usedTimes&&this._releasePipeline(i),u=this._getComputePipeline(e,a,o,t)),u.usedTimes++,a.usedTimes++,s.version=e.version,s.pipeline=u}return s.pipeline}getForRender(e,t=null){const{backend:r}=this,s=this.get(e);if(this._needsRenderUpdate(e)){const i=s.pipeline;i&&(i.usedTimes--,i.vertexProgram.usedTimes--,i.fragmentProgram.usedTimes--);const n=e.getNodeBuilderState(),a=e.material?e.material.name:"";let o=this.programs.vertex.get(n.vertexShader);void 0===o&&(i&&0===i.vertexProgram.usedTimes&&this._releaseProgram(i.vertexProgram),o=new Ym(n.vertexShader,"vertex",a),this.programs.vertex.set(n.vertexShader,o),r.createProgram(o));let u=this.programs.fragment.get(n.fragmentShader);void 0===u&&(i&&0===i.fragmentProgram.usedTimes&&this._releaseProgram(i.fragmentProgram),u=new Ym(n.fragmentShader,"fragment",a),this.programs.fragment.set(n.fragmentShader,u),r.createProgram(u));const l=this._getRenderCacheKey(e,o,u);let d=this.caches.get(l);void 0===d?(i&&0===i.usedTimes&&this._releasePipeline(i),d=this._getRenderPipeline(e,o,u,l,t)):e.pipeline=d,d.usedTimes++,o.usedTimes++,u.usedTimes++,s.pipeline=d}return s.pipeline}delete(e){const t=this.get(e).pipeline;return t&&(t.usedTimes--,0===t.usedTimes&&this._releasePipeline(t),t.isComputePipeline?(t.computeProgram.usedTimes--,0===t.computeProgram.usedTimes&&this._releaseProgram(t.computeProgram)):(t.fragmentProgram.usedTimes--,t.vertexProgram.usedTimes--,0===t.vertexProgram.usedTimes&&this._releaseProgram(t.vertexProgram),0===t.fragmentProgram.usedTimes&&this._releaseProgram(t.fragmentProgram))),super.delete(e)}dispose(){super.dispose(),this.caches=new Map,this.programs={vertex:new Map,fragment:new Map,compute:new Map}}updateForRender(e){this.getForRender(e)}_getComputePipeline(e,t,r,s){r=r||this._getComputeCacheKey(e,t);let i=this.caches.get(r);return void 0===i&&(i=new Xm(r,t),this.caches.set(r,i),this.backend.createComputePipeline(i,s)),i}_getRenderPipeline(e,t,r,s,i){s=s||this._getRenderCacheKey(e,t,r);let n=this.caches.get(s);return void 0===n&&(n=new qm(s,t,r),this.caches.set(s,n),e.pipeline=n,this.backend.createRenderPipeline(e,i)),n}_getComputeCacheKey(e,t){return e.id+","+t.id}_getRenderCacheKey(e,t,r){return t.id+","+r.id+","+this.backend.getRenderCacheKey(e)}_releasePipeline(e){this.caches.delete(e.cacheKey)}_releaseProgram(e){const t=e.code,r=e.stage;this.programs[r].delete(t)}_needsComputeUpdate(e){const t=this.get(e);return void 0===t.pipeline||t.version!==e.version}_needsRenderUpdate(e){return void 0===this.get(e).pipeline||this.backend.needsRenderUpdate(e)}}class Zm extends Im{constructor(e,t,r,s,i,n){super(),this.backend=e,this.textures=r,this.pipelines=i,this.attributes=s,this.nodes=t,this.info=n,this.pipelines.bindings=this}getForRender(e){const t=e.getBindings();for(const e of t){const r=this.get(e);void 0===r.bindGroup&&(this._init(e),this.backend.createBindings(e,t,0),r.bindGroup=e)}return t}getForCompute(e){const t=this.nodes.getForCompute(e).bindings;for(const e of t){const r=this.get(e);void 0===r.bindGroup&&(this._init(e),this.backend.createBindings(e,t,0),r.bindGroup=e)}return t}updateForCompute(e){this._updateBindings(this.getForCompute(e))}updateForRender(e){this._updateBindings(this.getForRender(e))}_updateBindings(e){for(const t of e)this._update(t,e)}_init(e){for(const t of e.bindings)if(t.isSampledTexture)this.textures.updateTexture(t.texture);else if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?Om:Um;this.attributes.update(e,r)}}_update(e,t){const{backend:r}=this;let s=!1,i=!0,n=0,a=0;for(const t of e.bindings){if(t.isNodeUniformsGroup){if(!1===this.nodes.updateGroup(t))continue}if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?Om:Um;this.attributes.update(e,r)}if(t.isUniformBuffer){t.update()&&r.updateBinding(t)}else if(t.isSampler)t.update();else if(t.isSampledTexture){const e=this.textures.get(t.texture);t.needsBindingsUpdate(e.generation)&&(s=!0);const o=t.update(),u=t.texture;o&&this.textures.updateTexture(u);const l=r.get(u);if(void 0!==l.externalTexture||e.isDefaultTexture?i=!1:(n=10*n+u.id,a+=u.version),!0===r.isWebGPUBackend&&void 0===l.texture&&void 0===l.externalTexture&&(console.error("Bindings._update: binding should be available:",t,o,u,t.textureNode.value,s),this.textures.updateTexture(u),s=!0),!0===u.isStorageTexture){const e=this.get(u);!0===t.store?e.needsMipmap=!0:this.textures.needsMipmaps(u)&&!0===e.needsMipmap&&(this.backend.generateMipmaps(u),e.needsMipmap=!1)}}}!0===s&&this.backend.updateBindings(e,t,i?n:0,a)}}function Jm(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.material.id!==t.material.id?e.material.id-t.material.id:e.z!==t.z?e.z-t.z:e.id-t.id}function ef(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?t.z-e.z:e.id-t.id}function tf(e){return(e.transmission>0||e.transmissionNode)&&e.side===Se&&!1===e.forceSinglePass}class rf{constructor(e,t,r){this.renderItems=[],this.renderItemsIndex=0,this.opaque=[],this.transparentDoublePass=[],this.transparent=[],this.bundles=[],this.lightsNode=e.getNode(t,r),this.lightsArray=[],this.scene=t,this.camera=r,this.occlusionQueryCount=0}begin(){return this.renderItemsIndex=0,this.opaque.length=0,this.transparentDoublePass.length=0,this.transparent.length=0,this.bundles.length=0,this.lightsArray.length=0,this.occlusionQueryCount=0,this}getNextRenderItem(e,t,r,s,i,n,a){let o=this.renderItems[this.renderItemsIndex];return void 0===o?(o={id:e.id,object:e,geometry:t,material:r,groupOrder:s,renderOrder:e.renderOrder,z:i,group:n,clippingContext:a},this.renderItems[this.renderItemsIndex]=o):(o.id=e.id,o.object=e,o.geometry=t,o.material=r,o.groupOrder=s,o.renderOrder=e.renderOrder,o.z=i,o.group=n,o.clippingContext=a),this.renderItemsIndex++,o}push(e,t,r,s,i,n,a){const o=this.getNextRenderItem(e,t,r,s,i,n,a);!0===e.occlusionTest&&this.occlusionQueryCount++,!0===r.transparent||r.transmission>0?(tf(r)&&this.transparentDoublePass.push(o),this.transparent.push(o)):this.opaque.push(o)}unshift(e,t,r,s,i,n,a){const o=this.getNextRenderItem(e,t,r,s,i,n,a);!0===r.transparent||r.transmission>0?(tf(r)&&this.transparentDoublePass.unshift(o),this.transparent.unshift(o)):this.opaque.unshift(o)}pushBundle(e){this.bundles.push(e)}pushLight(e){this.lightsArray.push(e)}sort(e,t){this.opaque.length>1&&this.opaque.sort(e||Jm),this.transparentDoublePass.length>1&&this.transparentDoublePass.sort(t||ef),this.transparent.length>1&&this.transparent.sort(t||ef)}finish(){this.lightsNode.setLights(this.lightsArray);for(let e=this.renderItemsIndex,t=this.renderItems.length;e>t,u=a.height>>t;let l=e.depthTexture||i[t];const d=!0===e.depthBuffer||!0===e.stencilBuffer;let c=!1;void 0===l&&d&&(l=new I,l.format=e.stencilBuffer?we:Ae,l.type=e.stencilBuffer?Re:b,l.image.width=o,l.image.height=u,i[t]=l),r.width===a.width&&a.height===r.height||(c=!0,l&&(l.needsUpdate=!0,l.image.width=o,l.image.height=u)),r.width=a.width,r.height=a.height,r.textures=n,r.depthTexture=l||null,r.depth=e.depthBuffer,r.stencil=e.stencilBuffer,r.renderTarget=e,r.sampleCount!==s&&(c=!0,l&&(l.needsUpdate=!0),r.sampleCount=s);const h={sampleCount:s};if(!0!==e.isXRRenderTarget){for(let e=0;e{e.removeEventListener("dispose",t);for(let e=0;e0){const s=e.image;if(void 0===s)console.warn("THREE.Renderer: Texture marked for update but image is undefined.");else if(!1===s.complete)console.warn("THREE.Renderer: Texture marked for update but image is incomplete.");else{if(e.images){const r=[];for(const t of e.images)r.push(t);t.images=r}else t.image=s;void 0!==r.isDefaultTexture&&!0!==r.isDefaultTexture||(i.createTexture(e,t),r.isDefaultTexture=!1,r.generation=e.version),!0===e.source.dataReady&&i.updateTexture(e,t),t.needsMipmaps&&0===e.mipmaps.length&&i.generateMipmaps(e)}}else i.createDefaultTexture(e),r.isDefaultTexture=!0,r.generation=e.version}if(!0!==r.initialized){r.initialized=!0,r.generation=e.version,this.info.memory.textures++;const t=()=>{e.removeEventListener("dispose",t),this._destroyTexture(e),this.info.memory.textures--};e.addEventListener("dispose",t)}r.version=e.version}getSize(e,t=pf){let r=e.images?e.images[0]:e.image;return r?(void 0!==r.image&&(r=r.image),t.width=r.width||1,t.height=r.height||1,t.depth=e.isCubeTexture?6:r.depth||1):t.width=t.height=t.depth=1,t}getMipLevels(e,t,r){let s;return s=e.isCompressedTexture?e.mipmaps?e.mipmaps.length:1:Math.floor(Math.log2(Math.max(t,r)))+1,s}needsMipmaps(e){return this.isEnvironmentTexture(e)||!0===e.isCompressedTexture||e.generateMipmaps}isEnvironmentTexture(e){const t=e.mapping;return t===Y||t===Q||t===E||t===w}_destroyTexture(e){this.backend.destroySampler(e),this.backend.destroyTexture(e),this.delete(e)}}class mf extends e{constructor(e,t,r,s=1){super(e,t,r),this.a=s}set(e,t,r,s=1){return this.a=s,super.set(e,t,r)}copy(e){return void 0!==e.a&&(this.a=e.a),super.copy(e)}clone(){return new this.constructor(this.r,this.g,this.b,this.a)}}class ff extends _n{static get type(){return"ParameterNode"}constructor(e,t=null){super(e,t),this.isParameterNode=!0}getHash(){return this.uuid}generate(){return this.name}}class yf extends $s{static get type(){return"StackNode"}constructor(e=null){super(),this.nodes=[],this.outputNode=null,this.parent=e,this._currentCond=null,this.isStackNode=!0}getNodeType(e){return this.outputNode?this.outputNode.getNodeType(e):"void"}getMemberType(e,t){return this.outputNode?this.outputNode.getMemberType(e,t):"void"}add(e){return this.nodes.push(e),this}If(e,t){const r=new Mi(t);return this._currentCond=Go(e,r),this.add(this._currentCond)}ElseIf(e,t){const r=new Mi(t),s=Go(e,r);return this._currentCond.elseNode=s,this._currentCond=s,this}Else(e){return this._currentCond.elseNode=new Mi(e),this}build(e,...t){const r=Oi();Ui(this);for(const t of this.nodes)t.build(e,"void");return Ui(r),this.outputNode?this.outputNode.build(e,...t):super.build(e,...t)}else(...e){return console.warn("THREE.TSL: .else() has been renamed to .Else()."),this.Else(...e)}elseif(...e){return console.warn("THREE.TSL: .elseif() has been renamed to .ElseIf()."),this.ElseIf(...e)}}const xf=Bi(yf).setParameterLength(0,1);class bf extends $s{static get type(){return"StructTypeNode"}constructor(e,t=null){var r;super("struct"),this.membersLayout=(r=e,Object.entries(r).map((([e,t])=>"string"==typeof t?{name:e,type:t,atomic:!1}:{name:e,type:t.type,atomic:t.atomic||!1}))),this.name=t,this.isStructLayoutNode=!0}getLength(){let e=0;for(const t of this.membersLayout)e+=As(t.type);return e}getMemberType(e,t){const r=this.membersLayout.find((e=>e.name===t));return r?r.type:"void"}getNodeType(e){return e.getStructTypeFromNode(this,this.membersLayout,this.name).name}setup(e){e.addInclude(this)}generate(e){return this.getNodeType(e)}}class Tf extends $s{static get type(){return"StructNode"}constructor(e,t){super("vec3"),this.structLayoutNode=e,this.values=t,this.isStructNode=!0}getNodeType(e){return this.structLayoutNode.getNodeType(e)}getMemberType(e,t){return this.structLayoutNode.getMemberType(e,t)}generate(e){const t=e.getVarFromNode(this),r=t.type,s=e.getPropertyName(t);return e.addLineFlowCode(`${s} = ${e.generateStruct(r,this.structLayoutNode.membersLayout,this.values)}`,this),t.name}}class _f extends $s{static get type(){return"OutputStructNode"}constructor(...e){super(),this.members=e,this.isOutputStructNode=!0}getNodeType(e){const t=e.getNodeProperties(this);if(void 0===t.membersLayout){const r=this.members,s=[];for(let t=0;t{const t=e.toUint().mul(747796405).add(2891336453),r=t.shiftRight(t.shiftRight(28).add(4)).bitXor(t).mul(277803737);return r.shiftRight(22).bitXor(r).toFloat().mul(1/2**32)})),Af=(e,t)=>To(na(4,e.mul(ia(1,e))),t),Rf=Vi((([e])=>e.fract().sub(.5).abs())).setLayout({name:"tri",type:"float",inputs:[{name:"x",type:"float"}]}),Cf=Vi((([e])=>Qi(Rf(e.z.add(Rf(e.y.mul(1)))),Rf(e.z.add(Rf(e.x.mul(1)))),Rf(e.y.add(Rf(e.x.mul(1))))))).setLayout({name:"tri3",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),Mf=Vi((([e,t,r])=>{const s=Qi(e).toVar(),i=$i(1.4).toVar(),n=$i(0).toVar(),a=Qi(s).toVar();return kc({start:$i(0),end:$i(3),type:"float",condition:"<="},(()=>{const e=Qi(Cf(a.mul(2))).toVar();s.addAssign(e.add(r.mul($i(.1).mul(t)))),a.mulAssign(1.8),i.mulAssign(1.5),s.mulAssign(1.2);const o=$i(Rf(s.z.add(Rf(s.x.add(Rf(s.y)))))).toVar();n.addAssign(o.div(i)),a.addAssign(.14)})),n})).setLayout({name:"triNoise3D",type:"float",inputs:[{name:"position",type:"vec3"},{name:"speed",type:"float"},{name:"time",type:"float"}]});class Pf extends $s{static get type(){return"FunctionOverloadingNode"}constructor(e=[],...t){super(),this.functionNodes=e,this.parametersNodes=t,this._candidateFnCall=null,this.global=!0}getNodeType(){return this.functionNodes[0].shaderNode.layout.type}setup(e){const t=this.parametersNodes;let r=this._candidateFnCall;if(null===r){let s=null,i=-1;for(const r of this.functionNodes){const n=r.shaderNode.layout;if(null===n)throw new Error("FunctionOverloadingNode: FunctionNode must be a layout.");const a=n.inputs;if(t.length===a.length){let n=0;for(let r=0;ri&&(s=r,i=n)}}this._candidateFnCall=r=s(...t)}return r}}const Lf=Bi(Pf),Ff=e=>(...t)=>Lf(e,...t),Bf=Tn(0).setGroup(yn).onRenderUpdate((e=>e.time)),If=Tn(0).setGroup(yn).onRenderUpdate((e=>e.deltaTime)),Df=Tn(0,"uint").setGroup(yn).onRenderUpdate((e=>e.frameId)),Vf=Vi((([e,t,r=qi(.5)])=>fm(e.sub(r),t).add(r))),Uf=Vi((([e,t,r=qi(.5)])=>{const s=e.sub(r),i=s.dot(s),n=i.mul(i).mul(t);return e.add(s.mul(n))})),Of=Vi((({position:e=null,horizontal:t=!0,vertical:r=!1})=>{let s;null!==e?(s=fl.toVar(),s[3][0]=e.x,s[3][1]=e.y,s[3][2]=e.z):s=fl;const i=rl.mul(s);return Ri(t)&&(i[0][0]=fl[0].length(),i[0][1]=0,i[0][2]=0),Ri(r)&&(i[1][0]=0,i[1][1]=fl[1].length(),i[1][2]=0),i[2][0]=0,i[2][1]=0,i[2][2]=1,el.mul(i).mul(Rl)})),Gf=Vi((([e=null])=>{const t=wh();return wh(xh(e)).sub(t).lessThan(0).select(rh,e)}));class kf extends $s{static get type(){return"SpriteSheetUVNode"}constructor(e,t=Uu(),r=$i(0)){super("vec2"),this.countNode=e,this.uvNode=t,this.frameNode=r}setup(){const{frameNode:e,uvNode:t,countNode:r}=this,{width:s,height:i}=r,n=e.mod(s.mul(i)).floor(),a=n.mod(s),o=i.sub(n.add(1).div(s).ceil()),u=r.reciprocal(),l=qi(a,o);return t.add(l).mul(u)}}const zf=Bi(kf).setParameterLength(3);class $f extends $s{static get type(){return"TriplanarTexturesNode"}constructor(e,t=null,r=null,s=$i(1),i=Rl,n=Ul){super("vec4"),this.textureXNode=e,this.textureYNode=t,this.textureZNode=r,this.scaleNode=s,this.positionNode=i,this.normalNode=n}setup(){const{textureXNode:e,textureYNode:t,textureZNode:r,scaleNode:s,positionNode:i,normalNode:n}=this;let a=n.abs().normalize();a=a.div(a.dot(Qi(1)));const o=i.yz.mul(s),u=i.zx.mul(s),l=i.xy.mul(s),d=e.value,c=null!==t?t.value:d,h=null!==r?r.value:d,p=Hu(d,o).mul(a.x),g=Hu(c,u).mul(a.y),m=Hu(h,l).mul(a.z);return sa(p,g,m)}}const Hf=Bi($f).setParameterLength(1,6),Wf=new Me,jf=new r,qf=new r,Xf=new r,Kf=new a,Yf=new r(0,0,-1),Qf=new s,Zf=new r,Jf=new r,ey=new s,ty=new t,ry=new ae,sy=rh.flipX();ry.depthTexture=new I(1,1);let iy=!1;class ny extends $u{static get type(){return"ReflectorNode"}constructor(e={}){super(e.defaultTexture||ry.texture,sy),this._reflectorBaseNode=e.reflector||new ay(this,e),this._depthNode=null,this.setUpdateMatrix(!1)}get reflector(){return this._reflectorBaseNode}get target(){return this._reflectorBaseNode.target}getDepthNode(){if(null===this._depthNode){if(!0!==this._reflectorBaseNode.depth)throw new Error("THREE.ReflectorNode: Depth node can only be requested when the reflector is created with { depth: true }. ");this._depthNode=Pi(new ny({defaultTexture:ry.depthTexture,reflector:this._reflectorBaseNode}))}return this._depthNode}setup(e){return e.object.isQuadMesh||this._reflectorBaseNode.build(e),super.setup(e)}clone(){const e=new this.constructor(this.reflectorNode);return e._reflectorBaseNode=this._reflectorBaseNode,e}}class ay extends $s{static get type(){return"ReflectorBaseNode"}constructor(e,t={}){super();const{target:r=new Pe,resolution:s=1,generateMipmaps:i=!1,bounces:n=!0,depth:a=!1}=t;this.textureNode=e,this.target=r,this.resolution=s,this.generateMipmaps=i,this.bounces=n,this.depth=a,this.updateBeforeType=n?Is.RENDER:Is.FRAME,this.virtualCameras=new WeakMap,this.renderTargets=new WeakMap,this.forceUpdate=!1}_updateResolution(e,t){const r=this.resolution;t.getDrawingBufferSize(ty),e.setSize(Math.round(ty.width*r),Math.round(ty.height*r))}setup(e){return this._updateResolution(ry,e.renderer),super.setup(e)}getVirtualCamera(e){let t=this.virtualCameras.get(e);return void 0===t&&(t=e.clone(),this.virtualCameras.set(e,t)),t}getRenderTarget(e){let t=this.renderTargets.get(e);return void 0===t&&(t=new ae(0,0,{type:he}),!0===this.generateMipmaps&&(t.texture.minFilter=Le,t.texture.generateMipmaps=!0),!0===this.depth&&(t.depthTexture=new I),this.renderTargets.set(e,t)),t}updateBefore(e){if(!1===this.bounces&&iy)return!1;iy=!0;const{scene:t,camera:r,renderer:s,material:i}=e,{target:n}=this,a=this.getVirtualCamera(r),o=this.getRenderTarget(a);s.getDrawingBufferSize(ty),this._updateResolution(o,s),qf.setFromMatrixPosition(n.matrixWorld),Xf.setFromMatrixPosition(r.matrixWorld),Kf.extractRotation(n.matrixWorld),jf.set(0,0,1),jf.applyMatrix4(Kf),Zf.subVectors(qf,Xf);if(!0===Zf.dot(jf)>0&&!1===this.forceUpdate)return;Zf.reflect(jf).negate(),Zf.add(qf),Kf.extractRotation(r.matrixWorld),Yf.set(0,0,-1),Yf.applyMatrix4(Kf),Yf.add(Xf),Jf.subVectors(qf,Yf),Jf.reflect(jf).negate(),Jf.add(qf),a.coordinateSystem=r.coordinateSystem,a.position.copy(Zf),a.up.set(0,1,0),a.up.applyMatrix4(Kf),a.up.reflect(jf),a.lookAt(Jf),a.near=r.near,a.far=r.far,a.updateMatrixWorld(),a.projectionMatrix.copy(r.projectionMatrix),Wf.setFromNormalAndCoplanarPoint(jf,qf),Wf.applyMatrix4(a.matrixWorldInverse),Qf.set(Wf.normal.x,Wf.normal.y,Wf.normal.z,Wf.constant);const u=a.projectionMatrix;ey.x=(Math.sign(Qf.x)+u.elements[8])/u.elements[0],ey.y=(Math.sign(Qf.y)+u.elements[9])/u.elements[5],ey.z=-1,ey.w=(1+u.elements[10])/u.elements[14],Qf.multiplyScalar(1/Qf.dot(ey));u.elements[2]=Qf.x,u.elements[6]=Qf.y,u.elements[10]=s.coordinateSystem===d?Qf.z-0:Qf.z+1-0,u.elements[14]=Qf.w,this.textureNode.value=o.texture,!0===this.depth&&(this.textureNode.getDepthNode().value=o.depthTexture),i.visible=!1;const l=s.getRenderTarget(),c=s.getMRT(),h=s.autoClear;s.setMRT(null),s.setRenderTarget(o),s.autoClear=!0,s.render(t,a),s.setMRT(c),s.setRenderTarget(l),s.autoClear=h,i.visible=!0,iy=!1,this.forceUpdate=!1}}const oy=new ie(-1,1,1,-1,0,1);class uy extends ue{constructor(e=!1){super();const t=!1===e?[0,-1,0,1,2,1]:[0,2,0,0,2,0];this.setAttribute("position",new Fe([-1,3,0,-1,-1,0,3,-1,0],3)),this.setAttribute("uv",new Fe(t,2))}}const ly=new uy;class dy extends W{constructor(e=null){super(ly,e),this.camera=oy,this.isQuadMesh=!0}async renderAsync(e){return e.renderAsync(this,oy)}render(e){e.render(this,oy)}}const cy=new t;class hy extends $u{static get type(){return"RTTNode"}constructor(e,t=null,r=null,s={type:he}){const i=new ae(t,r,s);super(i.texture,Uu()),this.node=e,this.width=t,this.height=r,this.pixelRatio=1,this.renderTarget=i,this.textureNeedsUpdate=!0,this.autoUpdate=!0,this._rttNode=null,this._quadMesh=new dy(new Fh),this.updateBeforeType=Is.RENDER}get autoSize(){return null===this.width}setup(e){return this._rttNode=this.node.context(e.getSharedContext()),this._quadMesh.material.name="RTT",this._quadMesh.material.needsUpdate=!0,super.setup(e)}setSize(e,t){this.width=e,this.height=t;const r=e*this.pixelRatio,s=t*this.pixelRatio;this.renderTarget.setSize(r,s),this.textureNeedsUpdate=!0}setPixelRatio(e){this.pixelRatio=e,this.setSize(this.width,this.height)}updateBefore({renderer:e}){if(!1===this.textureNeedsUpdate&&!1===this.autoUpdate)return;if(this.textureNeedsUpdate=!1,!0===this.autoSize){this.pixelRatio=e.getPixelRatio();const t=e.getSize(cy);this.setSize(t.width,t.height)}this._quadMesh.material.fragmentNode=this._rttNode;const t=e.getRenderTarget();e.setRenderTarget(this.renderTarget),this._quadMesh.render(e),e.setRenderTarget(t)}clone(){const e=new $u(this.value,this.uvNode,this.levelNode);return e.sampler=this.sampler,e.referenceNode=this,e}}const py=(e,...t)=>Pi(new hy(Pi(e),...t)),gy=Vi((([e,t,r],s)=>{let i;s.renderer.coordinateSystem===d?(e=qi(e.x,e.y.oneMinus()).mul(2).sub(1),i=tn(Qi(e,t),1)):i=tn(Qi(e.x,e.y.oneMinus(),t).mul(2).sub(1),1);const n=tn(r.mul(i));return n.xyz.div(n.w)})),my=Vi((([e,t])=>{const r=t.mul(tn(e,1)),s=r.xy.div(r.w).mul(.5).add(.5).toVar();return qi(s.x,s.y.oneMinus())})),fy=Vi((([e,t,r])=>{const s=Gu(Wu(t)),i=Xi(e.mul(s)).toVar(),n=Wu(t,i).toVar(),a=Wu(t,i.sub(Xi(2,0))).toVar(),o=Wu(t,i.sub(Xi(1,0))).toVar(),u=Wu(t,i.add(Xi(1,0))).toVar(),l=Wu(t,i.add(Xi(2,0))).toVar(),d=Wu(t,i.add(Xi(0,2))).toVar(),c=Wu(t,i.add(Xi(0,1))).toVar(),h=Wu(t,i.sub(Xi(0,1))).toVar(),p=Wu(t,i.sub(Xi(0,2))).toVar(),g=Qa(ia($i(2).mul(o).sub(a),n)).toVar(),m=Qa(ia($i(2).mul(u).sub(l),n)).toVar(),f=Qa(ia($i(2).mul(c).sub(d),n)).toVar(),y=Qa(ia($i(2).mul(h).sub(p),n)).toVar(),x=gy(e,n,r).toVar(),b=g.lessThan(m).select(x.sub(gy(e.sub(qi($i(1).div(s.x),0)),o,r)),x.negate().add(gy(e.add(qi($i(1).div(s.x),0)),u,r))),T=f.lessThan(y).select(x.sub(gy(e.add(qi(0,$i(1).div(s.y))),c,r)),x.negate().add(gy(e.sub(qi(0,$i(1).div(s.y))),h,r)));return $a(bo(b,T))}));class yy extends M{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageInstancedBufferAttribute=!0}}class xy extends le{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageBufferAttribute=!0}}class by extends Du{static get type(){return"VertexColorNode"}constructor(e=0){super(null,"vec4"),this.isVertexColorNode=!0,this.index=e}getAttributeName(){const e=this.index;return"color"+(e>0?e:"")}generate(e){const t=this.getAttributeName(e);let r;return r=!0===e.hasGeometryAttribute(t)?super.generate(e):e.generateConst(this.nodeType,new s(1,1,1,1)),r}serialize(e){super.serialize(e),e.index=this.index}deserialize(e){super.deserialize(e),this.index=e.index}}class Ty extends $s{static get type(){return"PointUVNode"}constructor(){super("vec2"),this.isPointUVNode=!0}generate(){return"vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y )"}}const _y=Ii(Ty),vy=new S,Ny=new a;class Sy extends $s{static get type(){return"SceneNode"}constructor(e=Sy.BACKGROUND_BLURRINESS,t=null){super(),this.scope=e,this.scene=t}setup(e){const t=this.scope,r=null!==this.scene?this.scene:e.scene;let s;return t===Sy.BACKGROUND_BLURRINESS?s=ad("backgroundBlurriness","float",r):t===Sy.BACKGROUND_INTENSITY?s=ad("backgroundIntensity","float",r):t===Sy.BACKGROUND_ROTATION?s=Tn("mat4").label("backgroundRotation").setGroup(yn).onRenderUpdate((()=>{const e=r.background;return null!==e&&e.isTexture&&e.mapping!==Be?(vy.copy(r.backgroundRotation),vy.x*=-1,vy.y*=-1,vy.z*=-1,Ny.makeRotationFromEuler(vy)):Ny.identity(),Ny})):console.error("THREE.SceneNode: Unknown scope:",t),s}}Sy.BACKGROUND_BLURRINESS="backgroundBlurriness",Sy.BACKGROUND_INTENSITY="backgroundIntensity",Sy.BACKGROUND_ROTATION="backgroundRotation";const Ey=Ii(Sy,Sy.BACKGROUND_BLURRINESS),wy=Ii(Sy,Sy.BACKGROUND_INTENSITY),Ay=Ii(Sy,Sy.BACKGROUND_ROTATION);class Ry extends $u{static get type(){return"StorageTextureNode"}constructor(e,t,r=null){super(e,t),this.storeNode=r,this.isStorageTextureNode=!0,this.access=Vs.WRITE_ONLY}getInputType(){return"storageTexture"}setup(e){super.setup(e);e.getNodeProperties(this).storeNode=this.storeNode}setAccess(e){return this.access=e,this}generate(e,t){let r;return r=null!==this.storeNode?this.generateStore(e):super.generate(e,t),r}toReadWrite(){return this.setAccess(Vs.READ_WRITE)}toReadOnly(){return this.setAccess(Vs.READ_ONLY)}toWriteOnly(){return this.setAccess(Vs.WRITE_ONLY)}generateStore(e){const t=e.getNodeProperties(this),{uvNode:r,storeNode:s}=t,i=super.generate(e,"property"),n=r.build(e,"uvec2"),a=s.build(e,"vec4"),o=e.generateTextureStore(e,i,n,a);e.addLineFlowCode(o,this)}}const Cy=Bi(Ry).setParameterLength(1,3),My=Vi((({texture:e,uv:t})=>{const r=1e-4,s=Qi().toVar();return Gi(t.x.lessThan(r),(()=>{s.assign(Qi(1,0,0))})).ElseIf(t.y.lessThan(r),(()=>{s.assign(Qi(0,1,0))})).ElseIf(t.z.lessThan(r),(()=>{s.assign(Qi(0,0,1))})).ElseIf(t.x.greaterThan(.9999),(()=>{s.assign(Qi(-1,0,0))})).ElseIf(t.y.greaterThan(.9999),(()=>{s.assign(Qi(0,-1,0))})).ElseIf(t.z.greaterThan(.9999),(()=>{s.assign(Qi(0,0,-1))})).Else((()=>{const r=.01,i=e.sample(t.add(Qi(-.01,0,0))).r.sub(e.sample(t.add(Qi(r,0,0))).r),n=e.sample(t.add(Qi(0,-.01,0))).r.sub(e.sample(t.add(Qi(0,r,0))).r),a=e.sample(t.add(Qi(0,0,-.01))).r.sub(e.sample(t.add(Qi(0,0,r))).r);s.assign(Qi(i,n,a))})),s.normalize()}));class Py extends $u{static get type(){return"Texture3DNode"}constructor(e,t=null,r=null){super(e,t,r),this.isTexture3DNode=!0}getInputType(){return"texture3D"}getDefaultUV(){return Qi(.5,.5,.5)}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return!e.isFlipY()||!0!==r.isRenderTargetTexture&&!0!==r.isFramebufferTexture||(t=this.sampler?t.flipY():t.setY(Hi(Gu(this,this.levelNode).y).sub(t.y).sub(1))),t}generateUV(e,t){return t.build(e,"vec3")}normal(e){return My({texture:this,uv:e})}}const Ly=Bi(Py).setParameterLength(1,3);class Fy extends nd{static get type(){return"UserDataNode"}constructor(e,t,r=null){super(e,t,r),this.userData=r}updateReference(e){return this.reference=null!==this.userData?this.userData:e.object.userData,this.reference}}const By=new WeakMap;class Iy extends js{static get type(){return"VelocityNode"}constructor(){super("vec2"),this.projectionMatrix=null,this.updateType=Is.OBJECT,this.updateAfterType=Is.OBJECT,this.previousModelWorldMatrix=Tn(new a),this.previousProjectionMatrix=Tn(new a).setGroup(yn),this.previousCameraViewMatrix=Tn(new a)}setProjectionMatrix(e){this.projectionMatrix=e}update({frameId:e,camera:t,object:r}){const s=Vy(r);this.previousModelWorldMatrix.value.copy(s);const i=Dy(t);i.frameId!==e&&(i.frameId=e,void 0===i.previousProjectionMatrix?(i.previousProjectionMatrix=new a,i.previousCameraViewMatrix=new a,i.currentProjectionMatrix=new a,i.currentCameraViewMatrix=new a,i.previousProjectionMatrix.copy(this.projectionMatrix||t.projectionMatrix),i.previousCameraViewMatrix.copy(t.matrixWorldInverse)):(i.previousProjectionMatrix.copy(i.currentProjectionMatrix),i.previousCameraViewMatrix.copy(i.currentCameraViewMatrix)),i.currentProjectionMatrix.copy(this.projectionMatrix||t.projectionMatrix),i.currentCameraViewMatrix.copy(t.matrixWorldInverse),this.previousProjectionMatrix.value.copy(i.previousProjectionMatrix),this.previousCameraViewMatrix.value.copy(i.previousCameraViewMatrix))}updateAfter({object:e}){Vy(e).copy(e.matrixWorld)}setup(){const e=null===this.projectionMatrix?el:Tn(this.projectionMatrix),t=this.previousCameraViewMatrix.mul(this.previousModelWorldMatrix),r=e.mul(Nl).mul(Rl),s=this.previousProjectionMatrix.mul(t).mul(Cl),i=r.xy.div(r.w),n=s.xy.div(s.w);return ia(i,n)}}function Dy(e){let t=By.get(e);return void 0===t&&(t={},By.set(e,t)),t}function Vy(e,t=0){const r=Dy(e);let s=r[t];return void 0===s&&(r[t]=s=new a),s}const Uy=Ii(Iy),Oy=Vi((([e,t])=>ho(1,e.oneMinus().div(t)).oneMinus())).setLayout({name:"blendBurn",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Gy=Vi((([e,t])=>ho(e.div(t.oneMinus()),1))).setLayout({name:"blendDodge",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),ky=Vi((([e,t])=>e.oneMinus().mul(t.oneMinus()).oneMinus())).setLayout({name:"blendScreen",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),zy=Vi((([e,t])=>Ao(e.mul(2).mul(t),e.oneMinus().mul(2).mul(t.oneMinus()).oneMinus(),go(.5,e)))).setLayout({name:"blendOverlay",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),$y=Vi((([e,t])=>{const r=t.a.add(e.a.mul(t.a.oneMinus()));return tn(t.rgb.mul(t.a).add(e.rgb.mul(e.a).mul(t.a.oneMinus())).div(r),r)})).setLayout({name:"blendColor",type:"vec4",inputs:[{name:"base",type:"vec4"},{name:"blend",type:"vec4"}]}),Hy=Vi((([e])=>Xy(e.rgb))),Wy=Vi((([e,t=$i(1)])=>t.mix(Xy(e.rgb),e.rgb))),jy=Vi((([e,t=$i(1)])=>{const r=sa(e.r,e.g,e.b).div(3),s=e.r.max(e.g.max(e.b)),i=s.sub(r).mul(t).mul(-3);return Ao(e.rgb,s,i)})),qy=Vi((([e,t=$i(1)])=>{const r=Qi(.57735,.57735,.57735),s=t.cos();return Qi(e.rgb.mul(s).add(r.cross(e.rgb).mul(t.sin()).add(r.mul(xo(r,e.rgb).mul(s.oneMinus())))))})),Xy=(e,t=Qi(c.getLuminanceCoefficients(new r)))=>xo(e,t),Ky=Vi((([e,t=Qi(1),s=Qi(0),i=Qi(1),n=$i(1),a=Qi(c.getLuminanceCoefficients(new r,de))])=>{const o=e.rgb.dot(Qi(a)),u=po(e.rgb.mul(t).add(s),0).toVar(),l=u.pow(i).toVar();return Gi(u.r.greaterThan(0),(()=>{u.r.assign(l.r)})),Gi(u.g.greaterThan(0),(()=>{u.g.assign(l.g)})),Gi(u.b.greaterThan(0),(()=>{u.b.assign(l.b)})),u.assign(o.add(u.sub(o).mul(n))),tn(u.rgb,e.a)}));class Yy extends js{static get type(){return"PosterizeNode"}constructor(e,t){super(),this.sourceNode=e,this.stepsNode=t}setup(){const{sourceNode:e,stepsNode:t}=this;return e.mul(t).floor().div(t)}}const Qy=Bi(Yy).setParameterLength(2),Zy=new t;class Jy extends $u{static get type(){return"PassTextureNode"}constructor(e,t){super(t),this.passNode=e,this.setUpdateMatrix(!1)}setup(e){return e.object.isQuadMesh&&this.passNode.build(e),super.setup(e)}clone(){return new this.constructor(this.passNode,this.value)}}class ex extends Jy{static get type(){return"PassMultipleTextureNode"}constructor(e,t,r=!1){super(e,null),this.textureName=t,this.previousTexture=r}updateTexture(){this.value=this.previousTexture?this.passNode.getPreviousTexture(this.textureName):this.passNode.getTexture(this.textureName)}setup(e){return this.updateTexture(),super.setup(e)}clone(){return new this.constructor(this.passNode,this.textureName,this.previousTexture)}}class tx extends js{static get type(){return"PassNode"}constructor(e,t,r,s={}){super("vec4"),this.scope=e,this.scene=t,this.camera=r,this.options=s,this._pixelRatio=1,this._width=1,this._height=1;const i=new I;i.isRenderTargetTexture=!0,i.name="depth";const n=new ae(this._width*this._pixelRatio,this._height*this._pixelRatio,{type:he,...s});n.texture.name="output",n.depthTexture=i,this.renderTarget=n,this._textures={output:n.texture,depth:i},this._textureNodes={},this._linearDepthNodes={},this._viewZNodes={},this._previousTextures={},this._previousTextureNodes={},this._cameraNear=Tn(0),this._cameraFar=Tn(0),this._mrt=null,this._layers=null,this._resolution=1,this.isPassNode=!0,this.updateBeforeType=Is.FRAME}setResolution(e){return this._resolution=e,this}getResolution(){return this._resolution}setLayers(e){return this._layers=e,this}getLayers(){return this._layers}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}isGlobal(){return!0}getTexture(e){let t=this._textures[e];if(void 0===t){t=this.renderTarget.texture.clone(),t.name=e,this._textures[e]=t,this.renderTarget.textures.push(t)}return t}getPreviousTexture(e){let t=this._previousTextures[e];return void 0===t&&(t=this.getTexture(e).clone(),this._previousTextures[e]=t),t}toggleTexture(e){const t=this._previousTextures[e];if(void 0!==t){const r=this._textures[e],s=this.renderTarget.textures.indexOf(r);this.renderTarget.textures[s]=t,this._textures[e]=t,this._previousTextures[e]=r,this._textureNodes[e].updateTexture(),this._previousTextureNodes[e].updateTexture()}}getTextureNode(e="output"){let t=this._textureNodes[e];return void 0===t&&(t=Pi(new ex(this,e)),t.updateTexture(),this._textureNodes[e]=t),t}getPreviousTextureNode(e="output"){let t=this._previousTextureNodes[e];return void 0===t&&(void 0===this._textureNodes[e]&&this.getTextureNode(e),t=Pi(new ex(this,e,!0)),t.updateTexture(),this._previousTextureNodes[e]=t),t}getViewZNode(e="depth"){let t=this._viewZNodes[e];if(void 0===t){const r=this._cameraNear,s=this._cameraFar;this._viewZNodes[e]=t=vh(this.getTextureNode(e),r,s)}return t}getLinearDepthNode(e="depth"){let t=this._linearDepthNodes[e];if(void 0===t){const r=this._cameraNear,s=this._cameraFar,i=this.getViewZNode(e);this._linearDepthNodes[e]=t=Th(i,r,s)}return t}setup({renderer:e}){return this.renderTarget.samples=void 0===this.options.samples?e.samples:this.options.samples,!0===e.backend.isWebGLBackend&&(this.renderTarget.samples=0),this.renderTarget.texture.type=e.getColorBufferType(),this.scope===tx.COLOR?this.getTextureNode():this.getLinearDepthNode()}updateBefore(e){const{renderer:t}=e,{scene:r}=this;let s,i;const n=t.getOutputRenderTarget();n&&!0===n.isXRRenderTarget?(i=1,s=t.xr.getCamera(),t.xr.updateCamera(s),Zy.set(n.width,n.height)):(s=this.camera,i=t.getPixelRatio(),t.getSize(Zy)),this._pixelRatio=i,this.setSize(Zy.width,Zy.height);const a=t.getRenderTarget(),o=t.getMRT(),u=s.layers.mask;this._cameraNear.value=s.near,this._cameraFar.value=s.far,null!==this._layers&&(s.layers.mask=this._layers.mask);for(const e in this._previousTextures)this.toggleTexture(e);t.setRenderTarget(this.renderTarget),t.setMRT(this._mrt),t.render(r,s),t.setRenderTarget(a),t.setMRT(o),s.layers.mask=u}setSize(e,t){this._width=e,this._height=t;const r=this._width*this._pixelRatio*this._resolution,s=this._height*this._pixelRatio*this._resolution;this.renderTarget.setSize(r,s)}setPixelRatio(e){this._pixelRatio=e,this.setSize(this._width,this._height)}dispose(){this.renderTarget.dispose()}}tx.COLOR="color",tx.DEPTH="depth";class rx extends tx{static get type(){return"ToonOutlinePassNode"}constructor(e,t,r,s,i){super(tx.COLOR,e,t),this.colorNode=r,this.thicknessNode=s,this.alphaNode=i,this._materialCache=new WeakMap}updateBefore(e){const{renderer:t}=e,r=t.getRenderObjectFunction();t.setRenderObjectFunction(((e,r,s,i,n,a,o,u)=>{if((n.isMeshToonMaterial||n.isMeshToonNodeMaterial)&&!1===n.wireframe){const l=this._getOutlineMaterial(n);t.renderObject(e,r,s,i,l,a,o,u)}t.renderObject(e,r,s,i,n,a,o,u)})),super.updateBefore(e),t.setRenderObjectFunction(r)}_createMaterial(){const e=new Fh;e.isMeshToonOutlineMaterial=!0,e.name="Toon_Outline",e.side=N;const t=Ul.negate(),r=el.mul(Nl),s=$i(1),i=r.mul(tn(Rl,1)),n=r.mul(tn(Rl.add(t),1)),a=$a(i.sub(n));return e.vertexNode=i.add(a.mul(this.thicknessNode).mul(i.w).mul(s)),e.colorNode=tn(this.colorNode,this.alphaNode),e}_getOutlineMaterial(e){let t=this._materialCache.get(e);return void 0===t&&(t=this._createMaterial(),this._materialCache.set(e,t)),t}}const sx=Vi((([e,t])=>e.mul(t).clamp())).setLayout({name:"linearToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),ix=Vi((([e,t])=>(e=e.mul(t)).div(e.add(1)).clamp())).setLayout({name:"reinhardToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),nx=Vi((([e,t])=>{const r=(e=(e=e.mul(t)).sub(.004).max(0)).mul(e.mul(6.2).add(.5)),s=e.mul(e.mul(6.2).add(1.7)).add(.06);return r.div(s).pow(2.2)})).setLayout({name:"cineonToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),ax=Vi((([e])=>{const t=e.mul(e.add(.0245786)).sub(90537e-9),r=e.mul(e.add(.432951).mul(.983729)).add(.238081);return t.div(r)})),ox=Vi((([e,t])=>{const r=on(.59719,.35458,.04823,.076,.90834,.01566,.0284,.13383,.83777),s=on(1.60475,-.53108,-.07367,-.10208,1.10813,-.00605,-.00327,-.07276,1.07602);return e=e.mul(t).div(.6),e=r.mul(e),e=ax(e),(e=s.mul(e)).clamp()})).setLayout({name:"acesFilmicToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),ux=on(Qi(1.6605,-.1246,-.0182),Qi(-.5876,1.1329,-.1006),Qi(-.0728,-.0083,1.1187)),lx=on(Qi(.6274,.0691,.0164),Qi(.3293,.9195,.088),Qi(.0433,.0113,.8956)),dx=Vi((([e])=>{const t=Qi(e).toVar(),r=Qi(t.mul(t)).toVar(),s=Qi(r.mul(r)).toVar();return $i(15.5).mul(s.mul(r)).sub(na(40.14,s.mul(t))).add(na(31.96,s).sub(na(6.868,r.mul(t))).add(na(.4298,r).add(na(.1191,t).sub(.00232))))})),cx=Vi((([e,t])=>{const r=Qi(e).toVar(),s=on(Qi(.856627153315983,.137318972929847,.11189821299995),Qi(.0951212405381588,.761241990602591,.0767994186031903),Qi(.0482516061458583,.101439036467562,.811302368396859)),i=on(Qi(1.1271005818144368,-.1413297634984383,-.14132976349843826),Qi(-.11060664309660323,1.157823702216272,-.11060664309660294),Qi(-.016493938717834573,-.016493938717834257,1.2519364065950405)),n=$i(-12.47393),a=$i(4.026069);return r.mulAssign(t),r.assign(lx.mul(r)),r.assign(s.mul(r)),r.assign(po(r,1e-10)),r.assign(Ua(r)),r.assign(r.sub(n).div(a.sub(n))),r.assign(Ro(r,0,1)),r.assign(dx(r)),r.assign(i.mul(r)),r.assign(To(po(Qi(0),r),Qi(2.2))),r.assign(ux.mul(r)),r.assign(Ro(r,0,1)),r})).setLayout({name:"agxToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),hx=Vi((([e,t])=>{const r=$i(.76),s=$i(.15);e=e.mul(t);const i=ho(e.r,ho(e.g,e.b)),n=Go(i.lessThan(.08),i.sub(na(6.25,i.mul(i))),.04);e.subAssign(n);const a=po(e.r,po(e.g,e.b));Gi(a.lessThan(r),(()=>e));const o=ia(1,r),u=ia(1,o.mul(o).div(a.add(o.sub(r))));e.mulAssign(u.div(a));const l=ia(1,aa(1,s.mul(a.sub(u)).add(1)));return Ao(e,Qi(u),l)})).setLayout({name:"neutralToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]});class px extends $s{static get type(){return"CodeNode"}constructor(e="",t=[],r=""){super("code"),this.isCodeNode=!0,this.code=e,this.includes=t,this.language=r}isGlobal(){return!0}setIncludes(e){return this.includes=e,this}getIncludes(){return this.includes}generate(e){const t=this.getIncludes(e);for(const r of t)r.build(e);const r=e.getCodeFromNode(this,this.getNodeType(e));return r.code=this.code,r.code}serialize(e){super.serialize(e),e.code=this.code,e.language=this.language}deserialize(e){super.deserialize(e),this.code=e.code,this.language=e.language}}const gx=Bi(px).setParameterLength(1,3);class mx extends px{static get type(){return"FunctionNode"}constructor(e="",t=[],r=""){super(e,t,r)}getNodeType(e){return this.getNodeFunction(e).type}getInputs(e){return this.getNodeFunction(e).inputs}getNodeFunction(e){const t=e.getDataFromNode(this);let r=t.nodeFunction;return void 0===r&&(r=e.parser.parseFunction(this.code),t.nodeFunction=r),r}generate(e,t){super.generate(e);const r=this.getNodeFunction(e),s=r.name,i=r.type,n=e.getCodeFromNode(this,i);""!==s&&(n.name=s);const a=e.getPropertyName(n),o=this.getNodeFunction(e).getCode(a);return n.code=o+"\n","property"===t?a:e.format(`${a}()`,i,t)}}const fx=(e,t=[],r="")=>{for(let e=0;es.call(...e);return i.functionNode=s,i};class yx extends $s{static get type(){return"ScriptableValueNode"}constructor(e=null){super(),this._value=e,this._cache=null,this.inputType=null,this.outputType=null,this.events=new o,this.isScriptableValueNode=!0}get isScriptableOutputNode(){return null!==this.outputType}set value(e){this._value!==e&&(this._cache&&"URL"===this.inputType&&this.value.value instanceof ArrayBuffer&&(URL.revokeObjectURL(this._cache),this._cache=null),this._value=e,this.events.dispatchEvent({type:"change"}),this.refresh())}get value(){return this._value}refresh(){this.events.dispatchEvent({type:"refresh"})}getValue(){const e=this.value;if(e&&null===this._cache&&"URL"===this.inputType&&e.value instanceof ArrayBuffer)this._cache=URL.createObjectURL(new Blob([e.value]));else if(e&&null!==e.value&&void 0!==e.value&&(("URL"===this.inputType||"String"===this.inputType)&&"string"==typeof e.value||"Number"===this.inputType&&"number"==typeof e.value||"Vector2"===this.inputType&&e.value.isVector2||"Vector3"===this.inputType&&e.value.isVector3||"Vector4"===this.inputType&&e.value.isVector4||"Color"===this.inputType&&e.value.isColor||"Matrix3"===this.inputType&&e.value.isMatrix3||"Matrix4"===this.inputType&&e.value.isMatrix4))return e.value;return this._cache||e}getNodeType(e){return this.value&&this.value.isNode?this.value.getNodeType(e):"float"}setup(){return this.value&&this.value.isNode?this.value:$i()}serialize(e){super.serialize(e),null!==this.value?"ArrayBuffer"===this.inputType?e.value=Ps(this.value):e.value=this.value?this.value.toJSON(e.meta).uuid:null:e.value=null,e.inputType=this.inputType,e.outputType=this.outputType}deserialize(e){super.deserialize(e);let t=null;null!==e.value&&(t="ArrayBuffer"===e.inputType?Ls(e.value):"Texture"===e.inputType?e.meta.textures[e.value]:e.meta.nodes[e.value]||null),this.value=t,this.inputType=e.inputType,this.outputType=e.outputType}}const xx=Bi(yx).setParameterLength(1);class bx extends Map{get(e,t=null,...r){if(this.has(e))return super.get(e);if(null!==t){const s=t(...r);return this.set(e,s),s}}}class Tx{constructor(e){this.scriptableNode=e}get parameters(){return this.scriptableNode.parameters}get layout(){return this.scriptableNode.getLayout()}getInputLayout(e){return this.scriptableNode.getInputLayout(e)}get(e){const t=this.parameters[e];return t?t.getValue():null}}const _x=new bx;class vx extends $s{static get type(){return"ScriptableNode"}constructor(e=null,t={}){super(),this.codeNode=e,this.parameters=t,this._local=new bx,this._output=xx(null),this._outputs={},this._source=this.source,this._method=null,this._object=null,this._value=null,this._needsOutputUpdate=!0,this.onRefresh=this.onRefresh.bind(this),this.isScriptableNode=!0}get source(){return this.codeNode?this.codeNode.code:""}setLocal(e,t){return this._local.set(e,t)}getLocal(e){return this._local.get(e)}onRefresh(){this._refresh()}getInputLayout(e){for(const t of this.getLayout())if(t.inputType&&(t.id===e||t.name===e))return t}getOutputLayout(e){for(const t of this.getLayout())if(t.outputType&&(t.id===e||t.name===e))return t}setOutput(e,t){const r=this._outputs;return void 0===r[e]?r[e]=xx(t):r[e].value=t,this}getOutput(e){return this._outputs[e]}getParameter(e){return this.parameters[e]}setParameter(e,t){const r=this.parameters;return t&&t.isScriptableNode?(this.deleteParameter(e),r[e]=t,r[e].getDefaultOutput().events.addEventListener("refresh",this.onRefresh)):t&&t.isScriptableValueNode?(this.deleteParameter(e),r[e]=t,r[e].events.addEventListener("refresh",this.onRefresh)):void 0===r[e]?(r[e]=xx(t),r[e].events.addEventListener("refresh",this.onRefresh)):r[e].value=t,this}getValue(){return this.getDefaultOutput().getValue()}deleteParameter(e){let t=this.parameters[e];return t&&(t.isScriptableNode&&(t=t.getDefaultOutput()),t.events.removeEventListener("refresh",this.onRefresh)),this}clearParameters(){for(const e of Object.keys(this.parameters))this.deleteParameter(e);return this.needsUpdate=!0,this}call(e,...t){const r=this.getObject()[e];if("function"==typeof r)return r(...t)}async callAsync(e,...t){const r=this.getObject()[e];if("function"==typeof r)return"AsyncFunction"===r.constructor.name?await r(...t):r(...t)}getNodeType(e){return this.getDefaultOutputNode().getNodeType(e)}refresh(e=null){null!==e?this.getOutput(e).refresh():this._refresh()}getObject(){if(this.needsUpdate&&this.dispose(),null!==this._object)return this._object;const e=new Tx(this),t=_x.get("THREE"),r=_x.get("TSL"),s=this.getMethod(),i=[e,this._local,_x,()=>this.refresh(),(e,t)=>this.setOutput(e,t),t,r];this._object=s(...i);const n=this._object.layout;if(n&&(!1===n.cache&&this._local.clear(),this._output.outputType=n.outputType||null,Array.isArray(n.elements)))for(const e of n.elements){const t=e.id||e.name;e.inputType&&(void 0===this.getParameter(t)&&this.setParameter(t,null),this.getParameter(t).inputType=e.inputType),e.outputType&&(void 0===this.getOutput(t)&&this.setOutput(t,null),this.getOutput(t).outputType=e.outputType)}return this._object}deserialize(e){super.deserialize(e);for(const e in this.parameters){let t=this.parameters[e];t.isScriptableNode&&(t=t.getDefaultOutput()),t.events.addEventListener("refresh",this.onRefresh)}}getLayout(){return this.getObject().layout}getDefaultOutputNode(){const e=this.getDefaultOutput().value;return e&&e.isNode?e:$i()}getDefaultOutput(){return this._exec()._output}getMethod(){if(this.needsUpdate&&this.dispose(),null!==this._method)return this._method;const e=["layout","init","main","dispose"].join(", "),t="\nreturn { ...output, "+e+" };",r="var "+e+"; var output = {};\n"+this.codeNode.code+t;return this._method=new Function(...["parameters","local","global","refresh","setOutput","THREE","TSL"],r),this._method}dispose(){null!==this._method&&(this._object&&"function"==typeof this._object.dispose&&this._object.dispose(),this._method=null,this._object=null,this._source=null,this._value=null,this._needsOutputUpdate=!0,this._output.value=null,this._outputs={})}setup(){return this.getDefaultOutputNode()}getCacheKey(e){const t=[xs(this.source),this.getDefaultOutputNode().getCacheKey(e)];for(const r in this.parameters)t.push(this.parameters[r].getCacheKey(e));return bs(t)}set needsUpdate(e){!0===e&&this.dispose()}get needsUpdate(){return this.source!==this._source}_exec(){return null===this.codeNode||(!0===this._needsOutputUpdate&&(this._value=this.call("main"),this._needsOutputUpdate=!1),this._output.value=this._value),this}_refresh(){this.needsUpdate=!0,this._exec(),this._output.refresh()}}const Nx=Bi(vx).setParameterLength(1,2);function Sx(e){let t;const r=e.context.getViewZ;return void 0!==r&&(t=r(this)),(t||Ll.z).negate()}const Ex=Vi((([e,t],r)=>{const s=Sx(r);return Po(e,t,s)})),wx=Vi((([e],t)=>{const r=Sx(t);return e.mul(e,r,r).negate().exp().oneMinus()})),Ax=Vi((([e,t])=>tn(t.toFloat().mix(zn.rgb,e.toVec3()),zn.a)));let Rx=null,Cx=null;class Mx extends $s{static get type(){return"RangeNode"}constructor(e=$i(),t=$i()){super(),this.minNode=e,this.maxNode=t}getVectorLength(e){const t=e.getTypeLength(Rs(this.minNode.value)),r=e.getTypeLength(Rs(this.maxNode.value));return t>r?t:r}getNodeType(e){return e.object.count>1?e.getTypeFromLength(this.getVectorLength(e)):"float"}setup(e){const t=e.object;let r=null;if(t.count>1){const i=this.minNode.value,n=this.maxNode.value,a=e.getTypeLength(Rs(i)),o=e.getTypeLength(Rs(n));Rx=Rx||new s,Cx=Cx||new s,Rx.setScalar(0),Cx.setScalar(0),1===a?Rx.setScalar(i):i.isColor?Rx.set(i.r,i.g,i.b,1):Rx.set(i.x,i.y,i.z||0,i.w||0),1===o?Cx.setScalar(n):n.isColor?Cx.set(n.r,n.g,n.b,1):Cx.set(n.x,n.y,n.z||0,n.w||0);const l=4,d=l*t.count,c=new Float32Array(d);for(let e=0;ePi(new Lx(e,t)),Bx=Fx("numWorkgroups","uvec3"),Ix=Fx("workgroupId","uvec3"),Dx=Fx("globalId","uvec3"),Vx=Fx("localId","uvec3"),Ux=Fx("subgroupSize","uint");const Ox=Bi(class extends $s{constructor(e){super(),this.scope=e}generate(e){const{scope:t}=this,{renderer:r}=e;!0===r.backend.isWebGLBackend?e.addFlowCode(`\t// ${t}Barrier \n`):e.addLineFlowCode(`${t}Barrier()`,this)}});class Gx extends Hs{constructor(e,t){super(e,t),this.isWorkgroupInfoElementNode=!0}generate(e,t){let r;const s=e.context.assign;if(r=super.generate(e),!0!==s){const s=this.getNodeType(e);r=e.format(r,s,t)}return r}}class kx extends $s{constructor(e,t,r=0){super(t),this.bufferType=t,this.bufferCount=r,this.isWorkgroupInfoNode=!0,this.elementType=t,this.scope=e}label(e){return this.name=e,this}setScope(e){return this.scope=e,this}getElementType(){return this.elementType}getInputType(){return`${this.scope}Array`}element(e){return Pi(new Gx(this,e))}generate(e){return e.getScopedArray(this.name||`${this.scope}Array_${this.id}`,this.scope.toLowerCase(),this.bufferType,this.bufferCount)}}class zx extends js{static get type(){return"AtomicFunctionNode"}constructor(e,t,r){super("uint"),this.method=e,this.pointerNode=t,this.valueNode=r}getInputType(e){return this.pointerNode.getNodeType(e)}getNodeType(e){return this.getInputType(e)}generate(e){const t=this.method,r=this.getNodeType(e),s=this.getInputType(e),i=this.pointerNode,n=this.valueNode,a=[];a.push(`&${i.build(e,s)}`),null!==n&&a.push(n.build(e,s));const o=`${e.getMethod(t,r)}( ${a.join(", ")} )`;return null!==n&&e.addLineFlowCode(o,this),o}}zx.ATOMIC_LOAD="atomicLoad",zx.ATOMIC_STORE="atomicStore",zx.ATOMIC_ADD="atomicAdd",zx.ATOMIC_SUB="atomicSub",zx.ATOMIC_MAX="atomicMax",zx.ATOMIC_MIN="atomicMin",zx.ATOMIC_AND="atomicAnd",zx.ATOMIC_OR="atomicOr",zx.ATOMIC_XOR="atomicXor";const $x=Bi(zx),Hx=(e,t,r)=>{const s=$x(e,t,r);return s.append(),s};let Wx;function jx(e){Wx=Wx||new WeakMap;let t=Wx.get(e);return void 0===t&&Wx.set(e,t={}),t}function qx(e){const t=jx(e);return t.shadowMatrix||(t.shadowMatrix=Tn("mat4").setGroup(yn).onRenderUpdate((()=>(!0!==e.castShadow&&e.shadow.updateMatrices(e),e.shadow.matrix))))}function Xx(e,t=Ml){const r=qx(e).mul(t);return r.xyz.div(r.w)}function Kx(e){const t=jx(e);return t.position||(t.position=Tn(new r).setGroup(yn).onRenderUpdate(((t,r)=>r.value.setFromMatrixPosition(e.matrixWorld))))}function Yx(e){const t=jx(e);return t.targetPosition||(t.targetPosition=Tn(new r).setGroup(yn).onRenderUpdate(((t,r)=>r.value.setFromMatrixPosition(e.target.matrixWorld))))}function Qx(e){const t=jx(e);return t.viewPosition||(t.viewPosition=Tn(new r).setGroup(yn).onRenderUpdate((({camera:t},s)=>{s.value=s.value||new r,s.value.setFromMatrixPosition(e.matrixWorld),s.value.applyMatrix4(t.matrixWorldInverse)})))}const Zx=e=>rl.transformDirection(Kx(e).sub(Yx(e))),Jx=(e,t)=>{for(const r of t)if(r.isAnalyticLightNode&&r.light.id===e)return r;return null},eb=new WeakMap;class tb extends $s{static get type(){return"LightsNode"}constructor(){super("vec3"),this.totalDiffuseNode=Qi().toVar(),this.totalSpecularNode=Qi().toVar(),this.outgoingLightNode=Qi().toVar(),this._lights=[],this._lightNodes=null,this._lightNodesHash=null,this.global=!0}customCacheKey(){const e=[],t=this._lights;for(let r=0;re.sort(((e,t)=>e.id-t.id)))(this._lights),i=e.renderer.library;for(const e of s)if(e.isNode)t.push(Pi(e));else{let s=null;if(null!==r&&(s=Jx(e.id,r)),null===s){const r=i.getLightNodeClass(e.constructor);if(null===r){console.warn(`LightsNode.setupNodeLights: Light node not found for ${e.constructor.name}`);continue}let s=null;eb.has(e)?s=eb.get(e):(s=Pi(new r(e)),eb.set(e,s)),t.push(s)}}this._lightNodes=t}setupDirectLight(e,t,r){const{lightingModel:s,reflectedLight:i}=e.context;s.direct({...r,lightNode:t,reflectedLight:i},e)}setupDirectRectAreaLight(e,t,r){const{lightingModel:s,reflectedLight:i}=e.context;s.directRectArea({...r,lightNode:t,reflectedLight:i},e)}setupLights(e,t){for(const r of t)r.build(e)}getLightNodes(e){return null===this._lightNodes&&this.setupLightsNode(e),this._lightNodes}setup(e){const t=e.lightsNode;e.lightsNode=this;let r=this.outgoingLightNode;const s=e.context,i=s.lightingModel,n=e.getDataFromNode(this);if(i){const{totalDiffuseNode:t,totalSpecularNode:a}=this;s.outgoingLight=r;const o=e.addStack();n.nodes=o.nodes,i.start(e);const{backdrop:u,backdropAlpha:l}=s,{directDiffuse:d,directSpecular:c,indirectDiffuse:h,indirectSpecular:p}=s.reflectedLight;let g=d.add(h);null!==u&&(g=Qi(null!==l?l.mix(g,u):u),s.material.transparent=!0),t.assign(g),a.assign(c.add(p)),r.assign(t.add(a)),i.finish(e),r=r.bypass(e.removeStack())}else n.nodes=[];return e.lightsNode=t,r}setLights(e){return this._lights=e,this._lightNodes=null,this._lightNodesHash=null,this}getLights(){return this._lights}get hasLights(){return this._lights.length>0}}class rb extends $s{static get type(){return"ShadowBaseNode"}constructor(e){super(),this.light=e,this.updateBeforeType=Is.RENDER,this.isShadowBaseNode=!0}setupShadowPosition({context:e,material:t}){sb.assign(t.shadowPositionNode||e.shadowPositionWorld||Ml)}dispose(){this.updateBeforeType=Is.NONE}}const sb=vn("vec3","shadowPositionWorld");function ib(t,r={}){return r.toneMapping=t.toneMapping,r.toneMappingExposure=t.toneMappingExposure,r.outputColorSpace=t.outputColorSpace,r.renderTarget=t.getRenderTarget(),r.activeCubeFace=t.getActiveCubeFace(),r.activeMipmapLevel=t.getActiveMipmapLevel(),r.renderObjectFunction=t.getRenderObjectFunction(),r.pixelRatio=t.getPixelRatio(),r.mrt=t.getMRT(),r.clearColor=t.getClearColor(r.clearColor||new e),r.clearAlpha=t.getClearAlpha(),r.autoClear=t.autoClear,r.scissorTest=t.getScissorTest(),r}function nb(e,t){return t=ib(e,t),e.setMRT(null),e.setRenderObjectFunction(null),e.setClearColor(0,1),e.autoClear=!0,t}function ab(e,t){e.toneMapping=t.toneMapping,e.toneMappingExposure=t.toneMappingExposure,e.outputColorSpace=t.outputColorSpace,e.setRenderTarget(t.renderTarget,t.activeCubeFace,t.activeMipmapLevel),e.setRenderObjectFunction(t.renderObjectFunction),e.setPixelRatio(t.pixelRatio),e.setMRT(t.mrt),e.setClearColor(t.clearColor,t.clearAlpha),e.autoClear=t.autoClear,e.setScissorTest(t.scissorTest)}function ob(e,t={}){return t.background=e.background,t.backgroundNode=e.backgroundNode,t.overrideMaterial=e.overrideMaterial,t}function ub(e,t){return t=ob(e,t),e.background=null,e.backgroundNode=null,e.overrideMaterial=null,t}function lb(e,t){e.background=t.background,e.backgroundNode=t.backgroundNode,e.overrideMaterial=t.overrideMaterial}function db(e,t,r){return r=ub(t,r=nb(e,r))}function cb(e,t,r){ab(e,r),lb(t,r)}var hb=Object.freeze({__proto__:null,resetRendererAndSceneState:db,resetRendererState:nb,resetSceneState:ub,restoreRendererAndSceneState:cb,restoreRendererState:ab,restoreSceneState:lb,saveRendererAndSceneState:function(e,t,r={}){return r=ob(t,r=ib(e,r))},saveRendererState:ib,saveSceneState:ob});const pb=new WeakMap,gb=Vi((([e,t,r])=>{let s=Ml.sub(e).length();return s=s.sub(t).div(r.sub(t)),s=s.saturate(),s})),mb=e=>{let t=pb.get(e);if(void 0===t){const r=e.isPointLight?(e=>{const t=e.shadow.camera,r=ad("near","float",t).setGroup(yn),s=ad("far","float",t).setGroup(yn),i=dl(e);return gb(i,r,s)})(e):null;t=new Fh,t.colorNode=tn(0,0,0,1),t.depthNode=r,t.isShadowPassMaterial=!0,t.name="ShadowMaterial",t.fog=!1,pb.set(e,t)}return t},fb=Vi((({depthTexture:e,shadowCoord:t})=>Hu(e,t.xy).compare(t.z))),yb=Vi((({depthTexture:e,shadowCoord:t,shadow:r})=>{const s=(t,r)=>Hu(e,t).compare(r),i=ad("mapSize","vec2",r).setGroup(yn),n=ad("radius","float",r).setGroup(yn),a=qi(1).div(i),o=a.x.negate().mul(n),u=a.y.negate().mul(n),l=a.x.mul(n),d=a.y.mul(n),c=o.div(2),h=u.div(2),p=l.div(2),g=d.div(2);return sa(s(t.xy.add(qi(o,u)),t.z),s(t.xy.add(qi(0,u)),t.z),s(t.xy.add(qi(l,u)),t.z),s(t.xy.add(qi(c,h)),t.z),s(t.xy.add(qi(0,h)),t.z),s(t.xy.add(qi(p,h)),t.z),s(t.xy.add(qi(o,0)),t.z),s(t.xy.add(qi(c,0)),t.z),s(t.xy,t.z),s(t.xy.add(qi(p,0)),t.z),s(t.xy.add(qi(l,0)),t.z),s(t.xy.add(qi(c,g)),t.z),s(t.xy.add(qi(0,g)),t.z),s(t.xy.add(qi(p,g)),t.z),s(t.xy.add(qi(o,d)),t.z),s(t.xy.add(qi(0,d)),t.z),s(t.xy.add(qi(l,d)),t.z)).mul(1/17)})),xb=Vi((({depthTexture:e,shadowCoord:t,shadow:r})=>{const s=(t,r)=>Hu(e,t).compare(r),i=ad("mapSize","vec2",r).setGroup(yn),n=qi(1).div(i),a=n.x,o=n.y,u=t.xy,l=Ha(u.mul(i).add(.5));return u.subAssign(l.mul(n)),sa(s(u,t.z),s(u.add(qi(a,0)),t.z),s(u.add(qi(0,o)),t.z),s(u.add(n),t.z),Ao(s(u.add(qi(a.negate(),0)),t.z),s(u.add(qi(a.mul(2),0)),t.z),l.x),Ao(s(u.add(qi(a.negate(),o)),t.z),s(u.add(qi(a.mul(2),o)),t.z),l.x),Ao(s(u.add(qi(0,o.negate())),t.z),s(u.add(qi(0,o.mul(2))),t.z),l.y),Ao(s(u.add(qi(a,o.negate())),t.z),s(u.add(qi(a,o.mul(2))),t.z),l.y),Ao(Ao(s(u.add(qi(a.negate(),o.negate())),t.z),s(u.add(qi(a.mul(2),o.negate())),t.z),l.x),Ao(s(u.add(qi(a.negate(),o.mul(2))),t.z),s(u.add(qi(a.mul(2),o.mul(2))),t.z),l.x),l.y)).mul(1/9)})),bb=Vi((({depthTexture:e,shadowCoord:t})=>{const r=$i(1).toVar(),s=Hu(e).sample(t.xy).rg,i=go(t.z,s.x);return Gi(i.notEqual($i(1)),(()=>{const e=t.z.sub(s.x),n=po(0,s.y.mul(s.y));let a=n.div(n.add(e.mul(e)));a=Ro(ia(a,.3).div(.95-.3)),r.assign(Ro(po(i,a)))})),r})),Tb=Vi((({samples:e,radius:t,size:r,shadowPass:s})=>{const i=$i(0).toVar(),n=$i(0).toVar(),a=e.lessThanEqual($i(1)).select($i(0),$i(2).div(e.sub(1))),o=e.lessThanEqual($i(1)).select($i(0),$i(-1));kc({start:Hi(0),end:Hi(e),type:"int",condition:"<"},(({i:e})=>{const u=o.add($i(e).mul(a)),l=s.sample(sa(ih.xy,qi(0,u).mul(t)).div(r)).x;i.addAssign(l),n.addAssign(l.mul(l))})),i.divAssign(e),n.divAssign(e);const u=Oa(n.sub(i.mul(i)));return qi(i,u)})),_b=Vi((({samples:e,radius:t,size:r,shadowPass:s})=>{const i=$i(0).toVar(),n=$i(0).toVar(),a=e.lessThanEqual($i(1)).select($i(0),$i(2).div(e.sub(1))),o=e.lessThanEqual($i(1)).select($i(0),$i(-1));kc({start:Hi(0),end:Hi(e),type:"int",condition:"<"},(({i:e})=>{const u=o.add($i(e).mul(a)),l=s.sample(sa(ih.xy,qi(u,0).mul(t)).div(r));i.addAssign(l.x),n.addAssign(sa(l.y.mul(l.y),l.x.mul(l.x)))})),i.divAssign(e),n.divAssign(e);const u=Oa(n.sub(i.mul(i)));return qi(i,u)})),vb=[fb,yb,xb,bb];let Nb;const Sb=new dy;class Eb extends rb{static get type(){return"ShadowNode"}constructor(e,t=null){super(e),this.shadow=t||e.shadow,this.shadowMap=null,this.vsmShadowMapVertical=null,this.vsmShadowMapHorizontal=null,this.vsmMaterialVertical=null,this.vsmMaterialHorizontal=null,this._node=null,this._cameraFrameId=new WeakMap,this.isShadowNode=!0}setupShadowFilter(e,{filterFn:t,depthTexture:r,shadowCoord:s,shadow:i}){const n=s.x.greaterThanEqual(0).and(s.x.lessThanEqual(1)).and(s.y.greaterThanEqual(0)).and(s.y.lessThanEqual(1)).and(s.z.lessThanEqual(1)),a=t({depthTexture:r,shadowCoord:s,shadow:i});return n.select(a,$i(1))}setupShadowCoord(e,t){const{shadow:r}=this,{renderer:s}=e,i=ad("bias","float",r).setGroup(yn);let n,a=t;if(r.camera.isOrthographicCamera||!0!==s.logarithmicDepthBuffer)a=a.xyz.div(a.w),n=a.z,s.coordinateSystem===d&&(n=n.mul(2).sub(1));else{const e=a.w;a=a.xy.div(e);const t=ad("near","float",r.camera).setGroup(yn),s=ad("far","float",r.camera).setGroup(yn);n=Nh(e.negate(),t,s)}return a=Qi(a.x,a.y.oneMinus(),n.add(i)),a}getShadowFilterFn(e){return vb[e]}setupShadow(e){const{renderer:t}=e,{light:r,shadow:s}=this,i=t.shadowMap.type,n=new I(s.mapSize.width,s.mapSize.height);n.compareFunction=Ie;const a=e.createRenderTarget(s.mapSize.width,s.mapSize.height);if(a.depthTexture=n,s.camera.updateProjectionMatrix(),i===De){n.compareFunction=null,this.vsmShadowMapVertical=e.createRenderTarget(s.mapSize.width,s.mapSize.height,{format:Ve,type:he}),this.vsmShadowMapHorizontal=e.createRenderTarget(s.mapSize.width,s.mapSize.height,{format:Ve,type:he});const t=Hu(n),r=Hu(this.vsmShadowMapVertical.texture),i=ad("blurSamples","float",s).setGroup(yn),a=ad("radius","float",s).setGroup(yn),o=ad("mapSize","vec2",s).setGroup(yn);let u=this.vsmMaterialVertical||(this.vsmMaterialVertical=new Fh);u.fragmentNode=Tb({samples:i,radius:a,size:o,shadowPass:t}).context(e.getSharedContext()),u.name="VSMVertical",u=this.vsmMaterialHorizontal||(this.vsmMaterialHorizontal=new Fh),u.fragmentNode=_b({samples:i,radius:a,size:o,shadowPass:r}).context(e.getSharedContext()),u.name="VSMHorizontal"}const o=ad("intensity","float",s).setGroup(yn),u=ad("normalBias","float",s).setGroup(yn),l=qx(r).mul(sb.add($l.mul(u))),d=this.setupShadowCoord(e,l),c=s.filterNode||this.getShadowFilterFn(t.shadowMap.type)||null;if(null===c)throw new Error("THREE.WebGPURenderer: Shadow map type not supported yet.");const h=i===De?this.vsmShadowMapHorizontal.texture:n,p=this.setupShadowFilter(e,{filterFn:c,shadowTexture:a.texture,depthTexture:h,shadowCoord:d,shadow:s}),g=Hu(a.texture,d),m=Ao(1,p.rgb.mix(g,1),o.mul(g.a)).toVar();return this.shadowMap=a,this.shadow.map=a,m}setup(e){if(!1!==e.renderer.shadowMap.enabled)return Vi((()=>{let t=this._node;return this.setupShadowPosition(e),null===t&&(this._node=t=this.setupShadow(e)),e.material.shadowNode&&console.warn('THREE.NodeMaterial: ".shadowNode" is deprecated. Use ".castShadowNode" instead.'),e.material.receivedShadowNode&&(t=e.material.receivedShadowNode(t)),t}))()}renderShadow(e){const{shadow:t,shadowMap:r,light:s}=this,{renderer:i,scene:n}=e;t.updateMatrices(s),r.setSize(t.mapSize.width,t.mapSize.height),i.render(n,t.camera)}updateShadow(e){const{shadowMap:t,light:r,shadow:s}=this,{renderer:i,scene:n,camera:a}=e,o=i.shadowMap.type,u=t.depthTexture.version;this._depthVersionCached=u,s.camera.layers.mask=a.layers.mask;const l=i.getRenderObjectFunction(),d=i.getMRT(),c=!!d&&d.has("velocity");Nb=db(i,n,Nb),n.overrideMaterial=mb(r),i.setRenderObjectFunction(((e,t,r,n,u,l,...d)=>{(!0===e.castShadow||e.receiveShadow&&o===De)&&(c&&(Ms(e).useVelocity=!0),e.onBeforeShadow(i,e,a,s.camera,n,t.overrideMaterial,l),i.renderObject(e,t,r,n,u,l,...d),e.onAfterShadow(i,e,a,s.camera,n,t.overrideMaterial,l))})),i.setRenderTarget(t),this.renderShadow(e),i.setRenderObjectFunction(l),!0!==r.isPointLight&&o===De&&this.vsmPass(i),cb(i,n,Nb)}vsmPass(e){const{shadow:t}=this;this.vsmShadowMapVertical.setSize(t.mapSize.width,t.mapSize.height),this.vsmShadowMapHorizontal.setSize(t.mapSize.width,t.mapSize.height),e.setRenderTarget(this.vsmShadowMapVertical),Sb.material=this.vsmMaterialVertical,Sb.render(e),e.setRenderTarget(this.vsmShadowMapHorizontal),Sb.material=this.vsmMaterialHorizontal,Sb.render(e)}dispose(){this.shadowMap.dispose(),this.shadowMap=null,null!==this.vsmShadowMapVertical&&(this.vsmShadowMapVertical.dispose(),this.vsmShadowMapVertical=null,this.vsmMaterialVertical.dispose(),this.vsmMaterialVertical=null),null!==this.vsmShadowMapHorizontal&&(this.vsmShadowMapHorizontal.dispose(),this.vsmShadowMapHorizontal=null,this.vsmMaterialHorizontal.dispose(),this.vsmMaterialHorizontal=null),super.dispose()}updateBefore(e){const{shadow:t}=this;let r=t.needsUpdate||t.autoUpdate;r&&(this._cameraFrameId[e.camera]===e.frameId&&(r=!1),this._cameraFrameId[e.camera]=e.frameId),r&&(this.updateShadow(e),this.shadowMap.depthTexture.version===this._depthVersionCached&&(t.needsUpdate=!1))}}const wb=(e,t)=>Pi(new Eb(e,t)),Ab=new e,Rb=Vi((([e,t])=>{const r=e.toVar(),s=Qa(r),i=aa(1,po(s.x,po(s.y,s.z)));s.mulAssign(i),r.mulAssign(i.mul(t.mul(2).oneMinus()));const n=qi(r.xy).toVar(),a=t.mul(1.5).oneMinus();return Gi(s.z.greaterThanEqual(a),(()=>{Gi(r.z.greaterThan(0),(()=>{n.x.assign(ia(4,r.x))}))})).ElseIf(s.x.greaterThanEqual(a),(()=>{const e=Za(r.x);n.x.assign(r.z.mul(e).add(e.mul(2)))})).ElseIf(s.y.greaterThanEqual(a),(()=>{const e=Za(r.y);n.x.assign(r.x.add(e.mul(2)).add(2)),n.y.assign(r.z.mul(e).sub(2))})),qi(.125,.25).mul(n).add(qi(.375,.75)).flipY()})).setLayout({name:"cubeToUV",type:"vec2",inputs:[{name:"pos",type:"vec3"},{name:"texelSizeY",type:"float"}]}),Cb=Vi((({depthTexture:e,bd3D:t,dp:r,texelSize:s})=>Hu(e,Rb(t,s.y)).compare(r))),Mb=Vi((({depthTexture:e,bd3D:t,dp:r,texelSize:s,shadow:i})=>{const n=ad("radius","float",i).setGroup(yn),a=qi(-1,1).mul(n).mul(s.y);return Hu(e,Rb(t.add(a.xyy),s.y)).compare(r).add(Hu(e,Rb(t.add(a.yyy),s.y)).compare(r)).add(Hu(e,Rb(t.add(a.xyx),s.y)).compare(r)).add(Hu(e,Rb(t.add(a.yyx),s.y)).compare(r)).add(Hu(e,Rb(t,s.y)).compare(r)).add(Hu(e,Rb(t.add(a.xxy),s.y)).compare(r)).add(Hu(e,Rb(t.add(a.yxy),s.y)).compare(r)).add(Hu(e,Rb(t.add(a.xxx),s.y)).compare(r)).add(Hu(e,Rb(t.add(a.yxx),s.y)).compare(r)).mul(1/9)})),Pb=Vi((({filterFn:e,depthTexture:t,shadowCoord:r,shadow:s})=>{const i=r.xyz.toVar(),n=i.length(),a=Tn("float").setGroup(yn).onRenderUpdate((()=>s.camera.near)),o=Tn("float").setGroup(yn).onRenderUpdate((()=>s.camera.far)),u=ad("bias","float",s).setGroup(yn),l=Tn(s.mapSize).setGroup(yn),d=$i(1).toVar();return Gi(n.sub(o).lessThanEqual(0).and(n.sub(a).greaterThanEqual(0)),(()=>{const r=n.sub(a).div(o.sub(a)).toVar();r.addAssign(u);const c=i.normalize(),h=qi(1).div(l.mul(qi(4,2)));d.assign(e({depthTexture:t,bd3D:c,dp:r,texelSize:h,shadow:s}))})),d})),Lb=new s,Fb=new t,Bb=new t;class Ib extends Eb{static get type(){return"PointShadowNode"}constructor(e,t=null){super(e,t)}getShadowFilterFn(e){return e===Ue?Cb:Mb}setupShadowCoord(e,t){return t}setupShadowFilter(e,{filterFn:t,shadowTexture:r,depthTexture:s,shadowCoord:i,shadow:n}){return Pb({filterFn:t,shadowTexture:r,depthTexture:s,shadowCoord:i,shadow:n})}renderShadow(e){const{shadow:t,shadowMap:r,light:s}=this,{renderer:i,scene:n}=e,a=t.getFrameExtents();Bb.copy(t.mapSize),Bb.multiply(a),r.setSize(Bb.width,Bb.height),Fb.copy(t.mapSize);const o=i.autoClear,u=i.getClearColor(Ab),l=i.getClearAlpha();i.autoClear=!1,i.setClearColor(t.clearColor,t.clearAlpha),i.clear();const d=t.getViewportCount();for(let e=0;ePi(new Ib(e,t));class Vb extends Xc{static get type(){return"AnalyticLightNode"}constructor(t=null){super(),this.light=t,this.color=new e,this.colorNode=t&&t.colorNode||Tn(this.color).setGroup(yn),this.baseColorNode=null,this.shadowNode=null,this.shadowColorNode=null,this.isAnalyticLightNode=!0,this.updateType=Is.FRAME}customCacheKey(){return Ts(this.light.id,this.light.castShadow?1:0)}getHash(){return this.light.uuid}getLightVector(e){return Qx(this.light).sub(e.context.positionView||Ll)}setupDirect(){}setupDirectRectArea(){}setupShadowNode(){return wb(this.light)}setupShadow(e){const{renderer:t}=e;if(!1===t.shadowMap.enabled)return;let r=this.shadowColorNode;if(null===r){const e=this.light.shadow.shadowNode;let t;t=void 0!==e?Pi(e):this.setupShadowNode(),this.shadowNode=t,this.shadowColorNode=r=this.colorNode.mul(t),this.baseColorNode=this.colorNode}this.colorNode=r}setup(e){this.colorNode=this.baseColorNode||this.colorNode,this.light.castShadow?e.object.receiveShadow&&this.setupShadow(e):null!==this.shadowNode&&(this.shadowNode.dispose(),this.shadowNode=null,this.shadowColorNode=null);const t=this.setupDirect(e),r=this.setupDirectRectArea(e);t&&e.lightsNode.setupDirectLight(e,this,t),r&&e.lightsNode.setupDirectRectAreaLight(e,this,r)}update(){const{light:e}=this;this.color.copy(e.color).multiplyScalar(e.intensity)}}const Ub=Vi((({lightDistance:e,cutoffDistance:t,decayExponent:r})=>{const s=e.pow(r).max(.01).reciprocal();return t.greaterThan(0).select(s.mul(e.div(t).pow4().oneMinus().clamp().pow2()),s)})),Ob=({color:e,lightVector:t,cutoffDistance:r,decayExponent:s})=>{const i=t.normalize(),n=t.length(),a=Ub({lightDistance:n,cutoffDistance:r,decayExponent:s});return{lightDirection:i,lightColor:e.mul(a)}};class Gb extends Vb{static get type(){return"PointLightNode"}constructor(e=null){super(e),this.cutoffDistanceNode=Tn(0).setGroup(yn),this.decayExponentNode=Tn(2).setGroup(yn)}update(e){const{light:t}=this;super.update(e),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}setupShadowNode(){return Db(this.light)}setupDirect(e){return Ob({color:this.colorNode,lightVector:this.getLightVector(e),cutoffDistance:this.cutoffDistanceNode,decayExponent:this.decayExponentNode})}}const kb=Vi((([e=t()])=>{const t=e.mul(2),r=t.x.floor(),s=t.y.floor();return r.add(s).mod(2).sign()})),zb=Vi((([e=Uu()],{renderer:t,material:r})=>{const s=$i(1).toVar(),i=wo(e.mul(2).sub(1));if(r.alphaToCoverage&&t.samples>1){const e=$i(i.fwidth()).toVar();s.assign(Po(e.oneMinus(),e.add(1),i).oneMinus())}else i.greaterThan(1).discard();return s})),$b=Vi((([e,t,r])=>{const s=$i(r).toVar(),i=$i(t).toVar(),n=ji(e).toVar();return Go(n,i,s)})).setLayout({name:"mx_select",type:"float",inputs:[{name:"b",type:"bool"},{name:"t",type:"float"},{name:"f",type:"float"}]}),Hb=Vi((([e,t])=>{const r=ji(t).toVar(),s=$i(e).toVar();return Go(r,s.negate(),s)})).setLayout({name:"mx_negate_if",type:"float",inputs:[{name:"val",type:"float"},{name:"b",type:"bool"}]}),Wb=Vi((([e])=>{const t=$i(e).toVar();return Hi(ka(t))})).setLayout({name:"mx_floor",type:"int",inputs:[{name:"x",type:"float"}]}),jb=Vi((([e,t])=>{const r=$i(e).toVar();return t.assign(Wb(r)),r.sub($i(t))})),qb=Ff([Vi((([e,t,r,s,i,n])=>{const a=$i(n).toVar(),o=$i(i).toVar(),u=$i(s).toVar(),l=$i(r).toVar(),d=$i(t).toVar(),c=$i(e).toVar(),h=$i(ia(1,o)).toVar();return ia(1,a).mul(c.mul(h).add(d.mul(o))).add(a.mul(l.mul(h).add(u.mul(o))))})).setLayout({name:"mx_bilerp_0",type:"float",inputs:[{name:"v0",type:"float"},{name:"v1",type:"float"},{name:"v2",type:"float"},{name:"v3",type:"float"},{name:"s",type:"float"},{name:"t",type:"float"}]}),Vi((([e,t,r,s,i,n])=>{const a=$i(n).toVar(),o=$i(i).toVar(),u=Qi(s).toVar(),l=Qi(r).toVar(),d=Qi(t).toVar(),c=Qi(e).toVar(),h=$i(ia(1,o)).toVar();return ia(1,a).mul(c.mul(h).add(d.mul(o))).add(a.mul(l.mul(h).add(u.mul(o))))})).setLayout({name:"mx_bilerp_1",type:"vec3",inputs:[{name:"v0",type:"vec3"},{name:"v1",type:"vec3"},{name:"v2",type:"vec3"},{name:"v3",type:"vec3"},{name:"s",type:"float"},{name:"t",type:"float"}]})]),Xb=Ff([Vi((([e,t,r,s,i,n,a,o,u,l,d])=>{const c=$i(d).toVar(),h=$i(l).toVar(),p=$i(u).toVar(),g=$i(o).toVar(),m=$i(a).toVar(),f=$i(n).toVar(),y=$i(i).toVar(),x=$i(s).toVar(),b=$i(r).toVar(),T=$i(t).toVar(),_=$i(e).toVar(),v=$i(ia(1,p)).toVar(),N=$i(ia(1,h)).toVar();return $i(ia(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(b.mul(v).add(x.mul(p))))).add(c.mul(N.mul(y.mul(v).add(f.mul(p))).add(h.mul(m.mul(v).add(g.mul(p))))))})).setLayout({name:"mx_trilerp_0",type:"float",inputs:[{name:"v0",type:"float"},{name:"v1",type:"float"},{name:"v2",type:"float"},{name:"v3",type:"float"},{name:"v4",type:"float"},{name:"v5",type:"float"},{name:"v6",type:"float"},{name:"v7",type:"float"},{name:"s",type:"float"},{name:"t",type:"float"},{name:"r",type:"float"}]}),Vi((([e,t,r,s,i,n,a,o,u,l,d])=>{const c=$i(d).toVar(),h=$i(l).toVar(),p=$i(u).toVar(),g=Qi(o).toVar(),m=Qi(a).toVar(),f=Qi(n).toVar(),y=Qi(i).toVar(),x=Qi(s).toVar(),b=Qi(r).toVar(),T=Qi(t).toVar(),_=Qi(e).toVar(),v=$i(ia(1,p)).toVar(),N=$i(ia(1,h)).toVar();return $i(ia(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(b.mul(v).add(x.mul(p))))).add(c.mul(N.mul(y.mul(v).add(f.mul(p))).add(h.mul(m.mul(v).add(g.mul(p))))))})).setLayout({name:"mx_trilerp_1",type:"vec3",inputs:[{name:"v0",type:"vec3"},{name:"v1",type:"vec3"},{name:"v2",type:"vec3"},{name:"v3",type:"vec3"},{name:"v4",type:"vec3"},{name:"v5",type:"vec3"},{name:"v6",type:"vec3"},{name:"v7",type:"vec3"},{name:"s",type:"float"},{name:"t",type:"float"},{name:"r",type:"float"}]})]),Kb=Vi((([e,t,r])=>{const s=$i(r).toVar(),i=$i(t).toVar(),n=Wi(e).toVar(),a=Wi(n.bitAnd(Wi(7))).toVar(),o=$i($b(a.lessThan(Wi(4)),i,s)).toVar(),u=$i(na(2,$b(a.lessThan(Wi(4)),s,i))).toVar();return Hb(o,ji(a.bitAnd(Wi(1)))).add(Hb(u,ji(a.bitAnd(Wi(2)))))})).setLayout({name:"mx_gradient_float_0",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"}]}),Yb=Vi((([e,t,r,s])=>{const i=$i(s).toVar(),n=$i(r).toVar(),a=$i(t).toVar(),o=Wi(e).toVar(),u=Wi(o.bitAnd(Wi(15))).toVar(),l=$i($b(u.lessThan(Wi(8)),a,n)).toVar(),d=$i($b(u.lessThan(Wi(4)),n,$b(u.equal(Wi(12)).or(u.equal(Wi(14))),a,i))).toVar();return Hb(l,ji(u.bitAnd(Wi(1)))).add(Hb(d,ji(u.bitAnd(Wi(2)))))})).setLayout({name:"mx_gradient_float_1",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]}),Qb=Ff([Kb,Yb]),Zb=Vi((([e,t,r])=>{const s=$i(r).toVar(),i=$i(t).toVar(),n=Ji(e).toVar();return Qi(Qb(n.x,i,s),Qb(n.y,i,s),Qb(n.z,i,s))})).setLayout({name:"mx_gradient_vec3_0",type:"vec3",inputs:[{name:"hash",type:"uvec3"},{name:"x",type:"float"},{name:"y",type:"float"}]}),Jb=Vi((([e,t,r,s])=>{const i=$i(s).toVar(),n=$i(r).toVar(),a=$i(t).toVar(),o=Ji(e).toVar();return Qi(Qb(o.x,a,n,i),Qb(o.y,a,n,i),Qb(o.z,a,n,i))})).setLayout({name:"mx_gradient_vec3_1",type:"vec3",inputs:[{name:"hash",type:"uvec3"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]}),eT=Ff([Zb,Jb]),tT=Vi((([e])=>{const t=$i(e).toVar();return na(.6616,t)})).setLayout({name:"mx_gradient_scale2d_0",type:"float",inputs:[{name:"v",type:"float"}]}),rT=Vi((([e])=>{const t=$i(e).toVar();return na(.982,t)})).setLayout({name:"mx_gradient_scale3d_0",type:"float",inputs:[{name:"v",type:"float"}]}),sT=Ff([tT,Vi((([e])=>{const t=Qi(e).toVar();return na(.6616,t)})).setLayout({name:"mx_gradient_scale2d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),iT=Ff([rT,Vi((([e])=>{const t=Qi(e).toVar();return na(.982,t)})).setLayout({name:"mx_gradient_scale3d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),nT=Vi((([e,t])=>{const r=Hi(t).toVar(),s=Wi(e).toVar();return s.shiftLeft(r).bitOr(s.shiftRight(Hi(32).sub(r)))})).setLayout({name:"mx_rotl32",type:"uint",inputs:[{name:"x",type:"uint"},{name:"k",type:"int"}]}),aT=Vi((([e,t,r])=>{e.subAssign(r),e.bitXorAssign(nT(r,Hi(4))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(nT(e,Hi(6))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(nT(t,Hi(8))),t.addAssign(e),e.subAssign(r),e.bitXorAssign(nT(r,Hi(16))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(nT(e,Hi(19))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(nT(t,Hi(4))),t.addAssign(e)})),oT=Vi((([e,t,r])=>{const s=Wi(r).toVar(),i=Wi(t).toVar(),n=Wi(e).toVar();return s.bitXorAssign(i),s.subAssign(nT(i,Hi(14))),n.bitXorAssign(s),n.subAssign(nT(s,Hi(11))),i.bitXorAssign(n),i.subAssign(nT(n,Hi(25))),s.bitXorAssign(i),s.subAssign(nT(i,Hi(16))),n.bitXorAssign(s),n.subAssign(nT(s,Hi(4))),i.bitXorAssign(n),i.subAssign(nT(n,Hi(14))),s.bitXorAssign(i),s.subAssign(nT(i,Hi(24))),s})).setLayout({name:"mx_bjfinal",type:"uint",inputs:[{name:"a",type:"uint"},{name:"b",type:"uint"},{name:"c",type:"uint"}]}),uT=Vi((([e])=>{const t=Wi(e).toVar();return $i(t).div($i(Wi(Hi(4294967295))))})).setLayout({name:"mx_bits_to_01",type:"float",inputs:[{name:"bits",type:"uint"}]}),lT=Vi((([e])=>{const t=$i(e).toVar();return t.mul(t).mul(t).mul(t.mul(t.mul(6).sub(15)).add(10))})).setLayout({name:"mx_fade",type:"float",inputs:[{name:"t",type:"float"}]}),dT=Ff([Vi((([e])=>{const t=Hi(e).toVar(),r=Wi(Wi(1)).toVar(),s=Wi(Wi(Hi(3735928559)).add(r.shiftLeft(Wi(2))).add(Wi(13))).toVar();return oT(s.add(Wi(t)),s,s)})).setLayout({name:"mx_hash_int_0",type:"uint",inputs:[{name:"x",type:"int"}]}),Vi((([e,t])=>{const r=Hi(t).toVar(),s=Hi(e).toVar(),i=Wi(Wi(2)).toVar(),n=Wi().toVar(),a=Wi().toVar(),o=Wi().toVar();return n.assign(a.assign(o.assign(Wi(Hi(3735928559)).add(i.shiftLeft(Wi(2))).add(Wi(13))))),n.addAssign(Wi(s)),a.addAssign(Wi(r)),oT(n,a,o)})).setLayout({name:"mx_hash_int_1",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),Vi((([e,t,r])=>{const s=Hi(r).toVar(),i=Hi(t).toVar(),n=Hi(e).toVar(),a=Wi(Wi(3)).toVar(),o=Wi().toVar(),u=Wi().toVar(),l=Wi().toVar();return o.assign(u.assign(l.assign(Wi(Hi(3735928559)).add(a.shiftLeft(Wi(2))).add(Wi(13))))),o.addAssign(Wi(n)),u.addAssign(Wi(i)),l.addAssign(Wi(s)),oT(o,u,l)})).setLayout({name:"mx_hash_int_2",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]}),Vi((([e,t,r,s])=>{const i=Hi(s).toVar(),n=Hi(r).toVar(),a=Hi(t).toVar(),o=Hi(e).toVar(),u=Wi(Wi(4)).toVar(),l=Wi().toVar(),d=Wi().toVar(),c=Wi().toVar();return l.assign(d.assign(c.assign(Wi(Hi(3735928559)).add(u.shiftLeft(Wi(2))).add(Wi(13))))),l.addAssign(Wi(o)),d.addAssign(Wi(a)),c.addAssign(Wi(n)),aT(l,d,c),l.addAssign(Wi(i)),oT(l,d,c)})).setLayout({name:"mx_hash_int_3",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xx",type:"int"}]}),Vi((([e,t,r,s,i])=>{const n=Hi(i).toVar(),a=Hi(s).toVar(),o=Hi(r).toVar(),u=Hi(t).toVar(),l=Hi(e).toVar(),d=Wi(Wi(5)).toVar(),c=Wi().toVar(),h=Wi().toVar(),p=Wi().toVar();return c.assign(h.assign(p.assign(Wi(Hi(3735928559)).add(d.shiftLeft(Wi(2))).add(Wi(13))))),c.addAssign(Wi(l)),h.addAssign(Wi(u)),p.addAssign(Wi(o)),aT(c,h,p),c.addAssign(Wi(a)),h.addAssign(Wi(n)),oT(c,h,p)})).setLayout({name:"mx_hash_int_4",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xx",type:"int"},{name:"yy",type:"int"}]})]),cT=Ff([Vi((([e,t])=>{const r=Hi(t).toVar(),s=Hi(e).toVar(),i=Wi(dT(s,r)).toVar(),n=Ji().toVar();return n.x.assign(i.bitAnd(Hi(255))),n.y.assign(i.shiftRight(Hi(8)).bitAnd(Hi(255))),n.z.assign(i.shiftRight(Hi(16)).bitAnd(Hi(255))),n})).setLayout({name:"mx_hash_vec3_0",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),Vi((([e,t,r])=>{const s=Hi(r).toVar(),i=Hi(t).toVar(),n=Hi(e).toVar(),a=Wi(dT(n,i,s)).toVar(),o=Ji().toVar();return o.x.assign(a.bitAnd(Hi(255))),o.y.assign(a.shiftRight(Hi(8)).bitAnd(Hi(255))),o.z.assign(a.shiftRight(Hi(16)).bitAnd(Hi(255))),o})).setLayout({name:"mx_hash_vec3_1",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]})]),hT=Ff([Vi((([e])=>{const t=qi(e).toVar(),r=Hi().toVar(),s=Hi().toVar(),i=$i(jb(t.x,r)).toVar(),n=$i(jb(t.y,s)).toVar(),a=$i(lT(i)).toVar(),o=$i(lT(n)).toVar(),u=$i(qb(Qb(dT(r,s),i,n),Qb(dT(r.add(Hi(1)),s),i.sub(1),n),Qb(dT(r,s.add(Hi(1))),i,n.sub(1)),Qb(dT(r.add(Hi(1)),s.add(Hi(1))),i.sub(1),n.sub(1)),a,o)).toVar();return sT(u)})).setLayout({name:"mx_perlin_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"}]}),Vi((([e])=>{const t=Qi(e).toVar(),r=Hi().toVar(),s=Hi().toVar(),i=Hi().toVar(),n=$i(jb(t.x,r)).toVar(),a=$i(jb(t.y,s)).toVar(),o=$i(jb(t.z,i)).toVar(),u=$i(lT(n)).toVar(),l=$i(lT(a)).toVar(),d=$i(lT(o)).toVar(),c=$i(Xb(Qb(dT(r,s,i),n,a,o),Qb(dT(r.add(Hi(1)),s,i),n.sub(1),a,o),Qb(dT(r,s.add(Hi(1)),i),n,a.sub(1),o),Qb(dT(r.add(Hi(1)),s.add(Hi(1)),i),n.sub(1),a.sub(1),o),Qb(dT(r,s,i.add(Hi(1))),n,a,o.sub(1)),Qb(dT(r.add(Hi(1)),s,i.add(Hi(1))),n.sub(1),a,o.sub(1)),Qb(dT(r,s.add(Hi(1)),i.add(Hi(1))),n,a.sub(1),o.sub(1)),Qb(dT(r.add(Hi(1)),s.add(Hi(1)),i.add(Hi(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return iT(c)})).setLayout({name:"mx_perlin_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"}]})]),pT=Ff([Vi((([e])=>{const t=qi(e).toVar(),r=Hi().toVar(),s=Hi().toVar(),i=$i(jb(t.x,r)).toVar(),n=$i(jb(t.y,s)).toVar(),a=$i(lT(i)).toVar(),o=$i(lT(n)).toVar(),u=Qi(qb(eT(cT(r,s),i,n),eT(cT(r.add(Hi(1)),s),i.sub(1),n),eT(cT(r,s.add(Hi(1))),i,n.sub(1)),eT(cT(r.add(Hi(1)),s.add(Hi(1))),i.sub(1),n.sub(1)),a,o)).toVar();return sT(u)})).setLayout({name:"mx_perlin_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),Vi((([e])=>{const t=Qi(e).toVar(),r=Hi().toVar(),s=Hi().toVar(),i=Hi().toVar(),n=$i(jb(t.x,r)).toVar(),a=$i(jb(t.y,s)).toVar(),o=$i(jb(t.z,i)).toVar(),u=$i(lT(n)).toVar(),l=$i(lT(a)).toVar(),d=$i(lT(o)).toVar(),c=Qi(Xb(eT(cT(r,s,i),n,a,o),eT(cT(r.add(Hi(1)),s,i),n.sub(1),a,o),eT(cT(r,s.add(Hi(1)),i),n,a.sub(1),o),eT(cT(r.add(Hi(1)),s.add(Hi(1)),i),n.sub(1),a.sub(1),o),eT(cT(r,s,i.add(Hi(1))),n,a,o.sub(1)),eT(cT(r.add(Hi(1)),s,i.add(Hi(1))),n.sub(1),a,o.sub(1)),eT(cT(r,s.add(Hi(1)),i.add(Hi(1))),n,a.sub(1),o.sub(1)),eT(cT(r.add(Hi(1)),s.add(Hi(1)),i.add(Hi(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return iT(c)})).setLayout({name:"mx_perlin_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"}]})]),gT=Ff([Vi((([e])=>{const t=$i(e).toVar(),r=Hi(Wb(t)).toVar();return uT(dT(r))})).setLayout({name:"mx_cell_noise_float_0",type:"float",inputs:[{name:"p",type:"float"}]}),Vi((([e])=>{const t=qi(e).toVar(),r=Hi(Wb(t.x)).toVar(),s=Hi(Wb(t.y)).toVar();return uT(dT(r,s))})).setLayout({name:"mx_cell_noise_float_1",type:"float",inputs:[{name:"p",type:"vec2"}]}),Vi((([e])=>{const t=Qi(e).toVar(),r=Hi(Wb(t.x)).toVar(),s=Hi(Wb(t.y)).toVar(),i=Hi(Wb(t.z)).toVar();return uT(dT(r,s,i))})).setLayout({name:"mx_cell_noise_float_2",type:"float",inputs:[{name:"p",type:"vec3"}]}),Vi((([e])=>{const t=tn(e).toVar(),r=Hi(Wb(t.x)).toVar(),s=Hi(Wb(t.y)).toVar(),i=Hi(Wb(t.z)).toVar(),n=Hi(Wb(t.w)).toVar();return uT(dT(r,s,i,n))})).setLayout({name:"mx_cell_noise_float_3",type:"float",inputs:[{name:"p",type:"vec4"}]})]),mT=Ff([Vi((([e])=>{const t=$i(e).toVar(),r=Hi(Wb(t)).toVar();return Qi(uT(dT(r,Hi(0))),uT(dT(r,Hi(1))),uT(dT(r,Hi(2))))})).setLayout({name:"mx_cell_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"float"}]}),Vi((([e])=>{const t=qi(e).toVar(),r=Hi(Wb(t.x)).toVar(),s=Hi(Wb(t.y)).toVar();return Qi(uT(dT(r,s,Hi(0))),uT(dT(r,s,Hi(1))),uT(dT(r,s,Hi(2))))})).setLayout({name:"mx_cell_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),Vi((([e])=>{const t=Qi(e).toVar(),r=Hi(Wb(t.x)).toVar(),s=Hi(Wb(t.y)).toVar(),i=Hi(Wb(t.z)).toVar();return Qi(uT(dT(r,s,i,Hi(0))),uT(dT(r,s,i,Hi(1))),uT(dT(r,s,i,Hi(2))))})).setLayout({name:"mx_cell_noise_vec3_2",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),Vi((([e])=>{const t=tn(e).toVar(),r=Hi(Wb(t.x)).toVar(),s=Hi(Wb(t.y)).toVar(),i=Hi(Wb(t.z)).toVar(),n=Hi(Wb(t.w)).toVar();return Qi(uT(dT(r,s,i,n,Hi(0))),uT(dT(r,s,i,n,Hi(1))),uT(dT(r,s,i,n,Hi(2))))})).setLayout({name:"mx_cell_noise_vec3_3",type:"vec3",inputs:[{name:"p",type:"vec4"}]})]),fT=Vi((([e,t,r,s])=>{const i=$i(s).toVar(),n=$i(r).toVar(),a=Hi(t).toVar(),o=Qi(e).toVar(),u=$i(0).toVar(),l=$i(1).toVar();return kc(a,(()=>{u.addAssign(l.mul(hT(o))),l.mulAssign(i),o.mulAssign(n)})),u})).setLayout({name:"mx_fractal_noise_float",type:"float",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),yT=Vi((([e,t,r,s])=>{const i=$i(s).toVar(),n=$i(r).toVar(),a=Hi(t).toVar(),o=Qi(e).toVar(),u=Qi(0).toVar(),l=$i(1).toVar();return kc(a,(()=>{u.addAssign(l.mul(pT(o))),l.mulAssign(i),o.mulAssign(n)})),u})).setLayout({name:"mx_fractal_noise_vec3",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),xT=Vi((([e,t,r,s])=>{const i=$i(s).toVar(),n=$i(r).toVar(),a=Hi(t).toVar(),o=Qi(e).toVar();return qi(fT(o,a,n,i),fT(o.add(Qi(Hi(19),Hi(193),Hi(17))),a,n,i))})).setLayout({name:"mx_fractal_noise_vec2",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),bT=Vi((([e,t,r,s])=>{const i=$i(s).toVar(),n=$i(r).toVar(),a=Hi(t).toVar(),o=Qi(e).toVar(),u=Qi(yT(o,a,n,i)).toVar(),l=$i(fT(o.add(Qi(Hi(19),Hi(193),Hi(17))),a,n,i)).toVar();return tn(u,l)})).setLayout({name:"mx_fractal_noise_vec4",type:"vec4",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),TT=Ff([Vi((([e,t,r,s,i,n,a])=>{const o=Hi(a).toVar(),u=$i(n).toVar(),l=Hi(i).toVar(),d=Hi(s).toVar(),c=Hi(r).toVar(),h=Hi(t).toVar(),p=qi(e).toVar(),g=Qi(mT(qi(h.add(d),c.add(l)))).toVar(),m=qi(g.x,g.y).toVar();m.subAssign(.5),m.mulAssign(u),m.addAssign(.5);const f=qi(qi($i(h),$i(c)).add(m)).toVar(),y=qi(f.sub(p)).toVar();return Gi(o.equal(Hi(2)),(()=>Qa(y.x).add(Qa(y.y)))),Gi(o.equal(Hi(3)),(()=>po(Qa(y.x),Qa(y.y)))),xo(y,y)})).setLayout({name:"mx_worley_distance_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"x",type:"int"},{name:"y",type:"int"},{name:"xoff",type:"int"},{name:"yoff",type:"int"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Vi((([e,t,r,s,i,n,a,o,u])=>{const l=Hi(u).toVar(),d=$i(o).toVar(),c=Hi(a).toVar(),h=Hi(n).toVar(),p=Hi(i).toVar(),g=Hi(s).toVar(),m=Hi(r).toVar(),f=Hi(t).toVar(),y=Qi(e).toVar(),x=Qi(mT(Qi(f.add(p),m.add(h),g.add(c)))).toVar();x.subAssign(.5),x.mulAssign(d),x.addAssign(.5);const b=Qi(Qi($i(f),$i(m),$i(g)).add(x)).toVar(),T=Qi(b.sub(y)).toVar();return Gi(l.equal(Hi(2)),(()=>Qa(T.x).add(Qa(T.y)).add(Qa(T.z)))),Gi(l.equal(Hi(3)),(()=>po(po(Qa(T.x),Qa(T.y)),Qa(T.z)))),xo(T,T)})).setLayout({name:"mx_worley_distance_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xoff",type:"int"},{name:"yoff",type:"int"},{name:"zoff",type:"int"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),_T=Vi((([e,t,r])=>{const s=Hi(r).toVar(),i=$i(t).toVar(),n=qi(e).toVar(),a=Hi().toVar(),o=Hi().toVar(),u=qi(jb(n.x,a),jb(n.y,o)).toVar(),l=$i(1e6).toVar();return kc({start:-1,end:Hi(1),name:"x",condition:"<="},(({x:e})=>{kc({start:-1,end:Hi(1),name:"y",condition:"<="},(({y:t})=>{const r=$i(TT(u,e,t,a,o,i,s)).toVar();l.assign(ho(l,r))}))})),Gi(s.equal(Hi(0)),(()=>{l.assign(Oa(l))})),l})).setLayout({name:"mx_worley_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),vT=Vi((([e,t,r])=>{const s=Hi(r).toVar(),i=$i(t).toVar(),n=qi(e).toVar(),a=Hi().toVar(),o=Hi().toVar(),u=qi(jb(n.x,a),jb(n.y,o)).toVar(),l=qi(1e6,1e6).toVar();return kc({start:-1,end:Hi(1),name:"x",condition:"<="},(({x:e})=>{kc({start:-1,end:Hi(1),name:"y",condition:"<="},(({y:t})=>{const r=$i(TT(u,e,t,a,o,i,s)).toVar();Gi(r.lessThan(l.x),(()=>{l.y.assign(l.x),l.x.assign(r)})).ElseIf(r.lessThan(l.y),(()=>{l.y.assign(r)}))}))})),Gi(s.equal(Hi(0)),(()=>{l.assign(Oa(l))})),l})).setLayout({name:"mx_worley_noise_vec2_0",type:"vec2",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),NT=Vi((([e,t,r])=>{const s=Hi(r).toVar(),i=$i(t).toVar(),n=qi(e).toVar(),a=Hi().toVar(),o=Hi().toVar(),u=qi(jb(n.x,a),jb(n.y,o)).toVar(),l=Qi(1e6,1e6,1e6).toVar();return kc({start:-1,end:Hi(1),name:"x",condition:"<="},(({x:e})=>{kc({start:-1,end:Hi(1),name:"y",condition:"<="},(({y:t})=>{const r=$i(TT(u,e,t,a,o,i,s)).toVar();Gi(r.lessThan(l.x),(()=>{l.z.assign(l.y),l.y.assign(l.x),l.x.assign(r)})).ElseIf(r.lessThan(l.y),(()=>{l.z.assign(l.y),l.y.assign(r)})).ElseIf(r.lessThan(l.z),(()=>{l.z.assign(r)}))}))})),Gi(s.equal(Hi(0)),(()=>{l.assign(Oa(l))})),l})).setLayout({name:"mx_worley_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),ST=Ff([_T,Vi((([e,t,r])=>{const s=Hi(r).toVar(),i=$i(t).toVar(),n=Qi(e).toVar(),a=Hi().toVar(),o=Hi().toVar(),u=Hi().toVar(),l=Qi(jb(n.x,a),jb(n.y,o),jb(n.z,u)).toVar(),d=$i(1e6).toVar();return kc({start:-1,end:Hi(1),name:"x",condition:"<="},(({x:e})=>{kc({start:-1,end:Hi(1),name:"y",condition:"<="},(({y:t})=>{kc({start:-1,end:Hi(1),name:"z",condition:"<="},(({z:r})=>{const n=$i(TT(l,e,t,r,a,o,u,i,s)).toVar();d.assign(ho(d,n))}))}))})),Gi(s.equal(Hi(0)),(()=>{d.assign(Oa(d))})),d})).setLayout({name:"mx_worley_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),ET=Ff([vT,Vi((([e,t,r])=>{const s=Hi(r).toVar(),i=$i(t).toVar(),n=Qi(e).toVar(),a=Hi().toVar(),o=Hi().toVar(),u=Hi().toVar(),l=Qi(jb(n.x,a),jb(n.y,o),jb(n.z,u)).toVar(),d=qi(1e6,1e6).toVar();return kc({start:-1,end:Hi(1),name:"x",condition:"<="},(({x:e})=>{kc({start:-1,end:Hi(1),name:"y",condition:"<="},(({y:t})=>{kc({start:-1,end:Hi(1),name:"z",condition:"<="},(({z:r})=>{const n=$i(TT(l,e,t,r,a,o,u,i,s)).toVar();Gi(n.lessThan(d.x),(()=>{d.y.assign(d.x),d.x.assign(n)})).ElseIf(n.lessThan(d.y),(()=>{d.y.assign(n)}))}))}))})),Gi(s.equal(Hi(0)),(()=>{d.assign(Oa(d))})),d})).setLayout({name:"mx_worley_noise_vec2_1",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),wT=Ff([NT,Vi((([e,t,r])=>{const s=Hi(r).toVar(),i=$i(t).toVar(),n=Qi(e).toVar(),a=Hi().toVar(),o=Hi().toVar(),u=Hi().toVar(),l=Qi(jb(n.x,a),jb(n.y,o),jb(n.z,u)).toVar(),d=Qi(1e6,1e6,1e6).toVar();return kc({start:-1,end:Hi(1),name:"x",condition:"<="},(({x:e})=>{kc({start:-1,end:Hi(1),name:"y",condition:"<="},(({y:t})=>{kc({start:-1,end:Hi(1),name:"z",condition:"<="},(({z:r})=>{const n=$i(TT(l,e,t,r,a,o,u,i,s)).toVar();Gi(n.lessThan(d.x),(()=>{d.z.assign(d.y),d.y.assign(d.x),d.x.assign(n)})).ElseIf(n.lessThan(d.y),(()=>{d.z.assign(d.y),d.y.assign(n)})).ElseIf(n.lessThan(d.z),(()=>{d.z.assign(n)}))}))}))})),Gi(s.equal(Hi(0)),(()=>{d.assign(Oa(d))})),d})).setLayout({name:"mx_worley_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),AT=Vi((([e])=>{const t=e.y,r=e.z,s=Qi().toVar();return Gi(t.lessThan(1e-4),(()=>{s.assign(Qi(r,r,r))})).Else((()=>{let i=e.x;i=i.sub(ka(i)).mul(6).toVar();const n=Hi(ao(i)),a=i.sub($i(n)),o=r.mul(t.oneMinus()),u=r.mul(t.mul(a).oneMinus()),l=r.mul(t.mul(a.oneMinus()).oneMinus());Gi(n.equal(Hi(0)),(()=>{s.assign(Qi(r,l,o))})).ElseIf(n.equal(Hi(1)),(()=>{s.assign(Qi(u,r,o))})).ElseIf(n.equal(Hi(2)),(()=>{s.assign(Qi(o,r,l))})).ElseIf(n.equal(Hi(3)),(()=>{s.assign(Qi(o,u,r))})).ElseIf(n.equal(Hi(4)),(()=>{s.assign(Qi(l,o,r))})).Else((()=>{s.assign(Qi(r,o,u))}))})),s})).setLayout({name:"mx_hsvtorgb",type:"vec3",inputs:[{name:"hsv",type:"vec3"}]}),RT=Vi((([e])=>{const t=Qi(e).toVar(),r=$i(t.x).toVar(),s=$i(t.y).toVar(),i=$i(t.z).toVar(),n=$i(ho(r,ho(s,i))).toVar(),a=$i(po(r,po(s,i))).toVar(),o=$i(a.sub(n)).toVar(),u=$i().toVar(),l=$i().toVar(),d=$i().toVar();return d.assign(a),Gi(a.greaterThan(0),(()=>{l.assign(o.div(a))})).Else((()=>{l.assign(0)})),Gi(l.lessThanEqual(0),(()=>{u.assign(0)})).Else((()=>{Gi(r.greaterThanEqual(a),(()=>{u.assign(s.sub(i).div(o))})).ElseIf(s.greaterThanEqual(a),(()=>{u.assign(sa(2,i.sub(r).div(o)))})).Else((()=>{u.assign(sa(4,r.sub(s).div(o)))})),u.mulAssign(1/6),Gi(u.lessThan(0),(()=>{u.addAssign(1)}))})),Qi(u,l,d)})).setLayout({name:"mx_rgbtohsv",type:"vec3",inputs:[{name:"c",type:"vec3"}]}),CT=Vi((([e])=>{const t=Qi(e).toVar(),r=en(ca(t,Qi(.04045))).toVar(),s=Qi(t.div(12.92)).toVar(),i=Qi(To(po(t.add(Qi(.055)),Qi(0)).div(1.055),Qi(2.4))).toVar();return Ao(s,i,r)})).setLayout({name:"mx_srgb_texture_to_lin_rec709",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),MT=(e,t)=>{e=$i(e),t=$i(t);const r=qi(t.dFdx(),t.dFdy()).length().mul(.7071067811865476);return Po(e.sub(r),e.add(r),t)},PT=(e,t,r,s)=>Ao(e,t,r[s].clamp()),LT=(e,t,r,s,i)=>Ao(e,t,MT(r,s[i])),FT=Vi((([e,t,r])=>{const s=$a(e).toVar(),i=ia($i(.5).mul(t.sub(r)),Ml).div(s).toVar(),n=ia($i(-.5).mul(t.sub(r)),Ml).div(s).toVar(),a=Qi().toVar();a.x=s.x.greaterThan($i(0)).select(i.x,n.x),a.y=s.y.greaterThan($i(0)).select(i.y,n.y),a.z=s.z.greaterThan($i(0)).select(i.z,n.z);const o=ho(ho(a.x,a.y),a.z).toVar();return Ml.add(s.mul(o)).toVar().sub(r)})),BT=Vi((([e,t])=>{const r=e.x,s=e.y,i=e.z;let n=t.element(0).mul(.886227);return n=n.add(t.element(1).mul(1.023328).mul(s)),n=n.add(t.element(2).mul(1.023328).mul(i)),n=n.add(t.element(3).mul(1.023328).mul(r)),n=n.add(t.element(4).mul(.858086).mul(r).mul(s)),n=n.add(t.element(5).mul(.858086).mul(s).mul(i)),n=n.add(t.element(6).mul(i.mul(i).mul(.743125).sub(.247708))),n=n.add(t.element(7).mul(.858086).mul(r).mul(i)),n=n.add(t.element(8).mul(.429043).mul(na(r,r).sub(na(s,s)))),n}));var IT=Object.freeze({__proto__:null,BRDF_GGX:vp,BRDF_Lambert:op,BasicPointShadowFilter:Cb,BasicShadowFilter:fb,Break:zc,Const:Xo,Continue:()=>Mu("continue").append(),DFGApprox:Np,D_GGX:bp,Discard:Pu,EPSILON:Aa,F_Schlick:ap,Fn:Vi,INFINITY:Ra,If:Gi,Loop:kc,NodeAccess:Vs,NodeShaderStage:Bs,NodeType:Ds,NodeUpdateType:Is,PCFShadowFilter:yb,PCFSoftShadowFilter:xb,PI:Ca,PI2:Ma,PointShadowFilter:Mb,Return:()=>Mu("return").append(),Schlick_to_F0:Ep,ScriptableNodeResources:_x,ShaderNode:Mi,TBNViewMatrix:Nd,VSMShadowFilter:bb,V_GGX_SmithCorrelated:yp,Var:qo,abs:Qa,acesFilmicToneMapping:ox,acos:Ka,add:sa,addMethodChaining:ii,addNodeElement:function(e){console.warn("THREE.TSL: AddNodeElement has been removed in favor of tree-shaking. Trying add",e)},agxToneMapping:cx,all:Pa,alphaT:In,and:ga,anisotropy:Dn,anisotropyB:Un,anisotropyT:Vn,any:La,append:ki,array:hn,arrayBuffer:e=>Pi(new ei(e,"ArrayBuffer")),asin:Xa,assign:Jn,atan:Ya,atan2:Do,atomicAdd:(e,t)=>Hx(zx.ATOMIC_ADD,e,t),atomicAnd:(e,t)=>Hx(zx.ATOMIC_AND,e,t),atomicFunc:Hx,atomicLoad:e=>Hx(zx.ATOMIC_LOAD,e,null),atomicMax:(e,t)=>Hx(zx.ATOMIC_MAX,e,t),atomicMin:(e,t)=>Hx(zx.ATOMIC_MIN,e,t),atomicOr:(e,t)=>Hx(zx.ATOMIC_OR,e,t),atomicStore:(e,t)=>Hx(zx.ATOMIC_STORE,e,t),atomicSub:(e,t)=>Hx(zx.ATOMIC_SUB,e,t),atomicXor:(e,t)=>Hx(zx.ATOMIC_XOR,e,t),attenuationColor:Yn,attenuationDistance:Kn,attribute:Vu,attributeArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=ws("float")):(r=As(t),s=ws(t));const i=new xy(e,r,s);return Dc(i,t,e)},backgroundBlurriness:Ey,backgroundIntensity:wy,backgroundRotation:Ay,batch:Lc,billboarding:Of,bitAnd:xa,bitNot:ba,bitOr:Ta,bitXor:_a,bitangentGeometry:yd,bitangentLocal:xd,bitangentView:bd,bitangentWorld:Td,bitcast:lo,blendBurn:Oy,blendColor:$y,blendDodge:Gy,blendOverlay:zy,blendScreen:ky,blur:Sg,bool:ji,buffer:qu,bufferAttribute:fu,bumpMap:Ld,burn:(...e)=>(console.warn('THREE.TSL: "burn" has been renamed. Use "blendBurn" instead.'),Oy(e)),bvec2:Yi,bvec3:en,bvec4:nn,bypass:Eu,cache:Nu,call:ta,cameraFar:Ju,cameraIndex:Qu,cameraNear:Zu,cameraNormalMatrix:il,cameraPosition:nl,cameraProjectionMatrix:el,cameraProjectionMatrixInverse:tl,cameraViewMatrix:rl,cameraWorldMatrix:sl,cbrt:Eo,cdl:Ky,ceil:za,checker:kb,cineonToneMapping:nx,clamp:Ro,clearcoat:Rn,clearcoatRoughness:Cn,code:gx,color:zi,colorSpaceToWorking:ou,colorToDirection:e=>Pi(e).mul(2).sub(1),compute:_u,computeSkinning:(e,t=null)=>{const r=new Uc(e);return r.positionNode=Dc(new M(e.geometry.getAttribute("position").array,3),"vec3").setPBO(!0).toReadOnly().element(vc).toVar(),r.skinIndexNode=Dc(new M(new Uint32Array(e.geometry.getAttribute("skinIndex").array),4),"uvec4").setPBO(!0).toReadOnly().element(vc).toVar(),r.skinWeightNode=Dc(new M(e.geometry.getAttribute("skinWeight").array,4),"vec4").setPBO(!0).toReadOnly().element(vc).toVar(),r.bindMatrixNode=Tn(e.bindMatrix,"mat4"),r.bindMatrixInverseNode=Tn(e.bindMatrixInverse,"mat4"),r.boneMatricesNode=qu(e.skeleton.boneMatrices,"mat4",e.skeleton.bones.length),r.toPositionNode=t,Pi(r)},cond:ko,context:$o,convert:dn,convertColorSpace:(e,t,r)=>Pi(new su(Pi(e),t,r)),convertToTexture:(e,...t)=>e.isTextureNode?e:e.isPassNode?e.getTextureNode():py(e,...t),cos:ja,cross:bo,cubeTexture:sd,cubeToUV:Rb,dFdx:ro,dFdy:so,dashSize:$n,debug:Iu,defaultBuildStages:Os,defaultShaderStages:Us,defined:Ri,degrees:Ba,deltaTime:If,densityFog:function(e,t){return console.warn('THREE.TSL: "densityFog( color, density )" is deprecated. Use "fog( color, densityFogFactor( density ) )" instead.'),Ax(e,wx(t))},densityFogFactor:wx,depth:Eh,depthPass:(e,t,r)=>Pi(new tx(tx.DEPTH,e,t,r)),difference:yo,diffuseColor:Sn,directPointLight:Ob,directionToColor:$h,dispersion:Qn,distance:fo,div:aa,dodge:(...e)=>(console.warn('THREE.TSL: "dodge" has been renamed. Use "blendDodge" instead.'),Gy(e)),dot:xo,drawIndex:wc,dynamicBufferAttribute:yu,element:ln,emissive:En,equal:ua,equals:co,equirectUV:qh,exp:Ia,exp2:Da,expression:Mu,faceDirection:Dl,faceForward:Lo,faceforward:Vo,float:$i,floor:ka,fog:Ax,fract:Ha,frameGroup:fn,frameId:Df,frontFacing:Il,fwidth:oo,gain:(e,t)=>e.lessThan(.5)?Af(e.mul(2),t).div(2):ia(1,Af(na(ia(1,e),2),t).div(2)),gapSize:Hn,getConstNodeType:Ci,getCurrentStack:Oi,getDirection:Tg,getDistanceAttenuation:Ub,getGeometryRoughness:mp,getNormalFromDepth:fy,getParallaxCorrectNormal:FT,getRoughness:fp,getScreenPosition:my,getShIrradianceAt:BT,getTextureIndex:Nf,getViewPosition:gy,globalId:Dx,glsl:(e,t)=>gx(e,t,"glsl"),glslFn:(e,t)=>fx(e,t,"glsl"),grayscale:Hy,greaterThan:ca,greaterThanEqual:pa,hash:wf,highpModelNormalViewMatrix:wl,highpModelViewMatrix:El,hue:qy,instance:Rc,instanceIndex:vc,instancedArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=ws("float")):(r=As(t),s=ws(t));const i=new yy(e,r,s);return Dc(i,t,e)},instancedBufferAttribute:xu,instancedDynamicBufferAttribute:bu,instancedMesh:Mc,int:Hi,inverseSqrt:Ga,inversesqrt:Uo,invocationLocalIndex:Ec,invocationSubgroupIndex:Sc,ior:jn,iridescence:Ln,iridescenceIOR:Fn,iridescenceThickness:Bn,ivec2:Xi,ivec3:Zi,ivec4:rn,js:(e,t)=>gx(e,t,"js"),label:Ho,length:Ja,lengthSq:wo,lessThan:da,lessThanEqual:ha,lightPosition:Kx,lightProjectionUV:Xx,lightShadowMatrix:qx,lightTargetDirection:Zx,lightTargetPosition:Yx,lightViewPosition:Qx,lightingContext:Qc,lights:(e=[])=>Pi(new tb).setLights(e),linearDepth:wh,linearToneMapping:sx,localId:Vx,log:Va,log2:Ua,logarithmicDepthToViewZ:(e,t,r)=>{const s=e.mul(Va(r.div(t)));return $i(Math.E).pow(s).mul(t).negate()},loop:(...e)=>(console.warn("THREE.TSL: loop() has been renamed to Loop()."),kc(...e)),luminance:Xy,mat2:an,mat3:on,mat4:un,matcapUV:hm,materialAO:yc,materialAlphaTest:Id,materialAnisotropy:ec,materialAnisotropyVector:xc,materialAttenuationColor:uc,materialAttenuationDistance:oc,materialClearcoat:Xd,materialClearcoatNormal:Yd,materialClearcoatRoughness:Kd,materialColor:Dd,materialDispersion:mc,materialEmissive:Ud,materialEnvIntensity:Yl,materialEnvRotation:Ql,materialIOR:ac,materialIridescence:tc,materialIridescenceIOR:rc,materialIridescenceThickness:sc,materialLightMap:fc,materialLineDashOffset:pc,materialLineDashSize:dc,materialLineGapSize:cc,materialLineScale:lc,materialLineWidth:hc,materialMetalness:jd,materialNormal:qd,materialOpacity:Od,materialPointSize:gc,materialReference:ld,materialReflectivity:Hd,materialRefractionRatio:Kl,materialRotation:Qd,materialRoughness:Wd,materialSheen:Zd,materialSheenRoughness:Jd,materialShininess:Vd,materialSpecular:Gd,materialSpecularColor:zd,materialSpecularIntensity:kd,materialSpecularStrength:$d,materialThickness:nc,materialTransmission:ic,max:po,maxMipLevel:zu,mediumpModelViewMatrix:Sl,metalness:An,min:ho,mix:Ao,mixElement:Bo,mod:oa,modInt:Ea,modelDirection:ml,modelNormalMatrix:_l,modelPosition:yl,modelRadius:Tl,modelScale:xl,modelViewMatrix:Nl,modelViewPosition:bl,modelViewProjection:bc,modelWorldMatrix:fl,modelWorldMatrixInverse:vl,morphReference:qc,mrt:Ef,mul:na,mx_aastep:MT,mx_cell_noise_float:(e=Uu())=>gT(e.convert("vec2|vec3")),mx_contrast:(e,t=1,r=.5)=>$i(e).sub(r).mul(t).add(r),mx_fractal_noise_float:(e=Uu(),t=3,r=2,s=.5,i=1)=>fT(e,Hi(t),r,s).mul(i),mx_fractal_noise_vec2:(e=Uu(),t=3,r=2,s=.5,i=1)=>xT(e,Hi(t),r,s).mul(i),mx_fractal_noise_vec3:(e=Uu(),t=3,r=2,s=.5,i=1)=>yT(e,Hi(t),r,s).mul(i),mx_fractal_noise_vec4:(e=Uu(),t=3,r=2,s=.5,i=1)=>bT(e,Hi(t),r,s).mul(i),mx_hsvtorgb:AT,mx_noise_float:(e=Uu(),t=1,r=0)=>hT(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec3:(e=Uu(),t=1,r=0)=>pT(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec4:(e=Uu(),t=1,r=0)=>{e=e.convert("vec2|vec3");return tn(pT(e),hT(e.add(qi(19,73)))).mul(t).add(r)},mx_ramplr:(e,t,r=Uu())=>PT(e,t,r,"x"),mx_ramptb:(e,t,r=Uu())=>PT(e,t,r,"y"),mx_rgbtohsv:RT,mx_safepower:(e,t=1)=>(e=$i(e)).abs().pow(t).mul(e.sign()),mx_splitlr:(e,t,r,s=Uu())=>LT(e,t,r,s,"x"),mx_splittb:(e,t,r,s=Uu())=>LT(e,t,r,s,"y"),mx_srgb_texture_to_lin_rec709:CT,mx_transform_uv:(e=1,t=0,r=Uu())=>r.mul(e).add(t),mx_worley_noise_float:(e=Uu(),t=1)=>ST(e.convert("vec2|vec3"),t,Hi(1)),mx_worley_noise_vec2:(e=Uu(),t=1)=>ET(e.convert("vec2|vec3"),t,Hi(1)),mx_worley_noise_vec3:(e=Uu(),t=1)=>wT(e.convert("vec2|vec3"),t,Hi(1)),negate:eo,neutralToneMapping:hx,nodeArray:Fi,nodeImmutable:Ii,nodeObject:Pi,nodeObjects:Li,nodeProxy:Bi,normalFlat:Ol,normalGeometry:Vl,normalLocal:Ul,normalMap:Rd,normalView:Gl,normalWorld:kl,normalize:$a,not:fa,notEqual:la,numWorkgroups:Bx,objectDirection:ul,objectGroup:xn,objectPosition:dl,objectRadius:pl,objectScale:cl,objectViewPosition:hl,objectWorldMatrix:ll,oneMinus:to,or:ma,orthographicDepthToViewZ:(e,t,r)=>t.sub(r).mul(e).sub(t),oscSawtooth:(e=Bf)=>e.fract(),oscSine:(e=Bf)=>e.add(.75).mul(2*Math.PI).sin().mul(.5).add(.5),oscSquare:(e=Bf)=>e.fract().round(),oscTriangle:(e=Bf)=>e.add(.5).fract().mul(2).sub(1).abs(),output:zn,outputStruct:vf,overlay:(...e)=>(console.warn('THREE.TSL: "overlay" has been renamed. Use "blendOverlay" instead.'),zy(e)),overloadingFn:Ff,parabola:Af,parallaxDirection:Sd,parallaxUV:(e,t)=>e.sub(Sd.mul(t)),parameter:(e,t)=>Pi(new ff(e,t)),pass:(e,t,r)=>Pi(new tx(tx.COLOR,e,t,r)),passTexture:(e,t)=>Pi(new Jy(e,t)),pcurve:(e,t,r)=>To(aa(To(e,t),sa(To(e,t),To(ia(1,e),r))),1/t),perspectiveDepthToViewZ:vh,pmremTexture:Yg,pointShadow:Db,pointUV:_y,pointWidth:Wn,positionGeometry:Al,positionLocal:Rl,positionPrevious:Cl,positionView:Ll,positionViewDirection:Fl,positionWorld:Ml,positionWorldDirection:Pl,posterize:Qy,pow:To,pow2:_o,pow3:vo,pow4:No,property:vn,radians:Fa,rand:Fo,range:Px,rangeFog:function(e,t,r){return console.warn('THREE.TSL: "rangeFog( color, near, far )" is deprecated. Use "fog( color, rangeFogFactor( near, far ) )" instead.'),Ax(e,Ex(t,r))},rangeFogFactor:Ex,reciprocal:no,reference:ad,referenceBuffer:od,reflect:mo,reflectVector:ed,reflectView:Zl,reflector:e=>Pi(new ny(e)),refract:Mo,refractVector:td,refractView:Jl,reinhardToneMapping:ix,remainder:Sa,remap:Au,remapClamp:Ru,renderGroup:yn,renderOutput:Fu,rendererReference:cu,rotate:fm,rotateUV:Vf,roughness:wn,round:io,rtt:py,sRGBTransferEOTF:Jo,sRGBTransferOETF:eu,sampler:e=>(!0===e.isNode?e:Hu(e)).convert("sampler"),samplerComparison:e=>(!0===e.isNode?e:Hu(e)).convert("samplerComparison"),saturate:Co,saturation:Wy,screen:(...e)=>(console.warn('THREE.TSL: "screen" has been renamed. Use "blendScreen" instead.'),ky(e)),screenCoordinate:ih,screenSize:sh,screenUV:rh,scriptable:Nx,scriptableValue:xx,select:Go,setCurrentStack:Ui,shaderStages:Gs,shadow:wb,shadowPositionWorld:sb,shapeCircle:zb,sharedUniformGroup:mn,sheen:Mn,sheenRoughness:Pn,shiftLeft:va,shiftRight:Na,shininess:kn,sign:Za,sin:Wa,sinc:(e,t)=>Wa(Ca.mul(t.mul(e).sub(1))).div(Ca.mul(t.mul(e).sub(1))),skinning:Oc,smoothstep:Po,smoothstepElement:Io,specularColor:On,specularF90:Gn,spherizeUV:Uf,split:(e,t)=>Pi(new Ks(Pi(e),t)),spritesheetUV:zf,sqrt:Oa,stack:xf,step:go,storage:Dc,storageBarrier:()=>Ox("storage").append(),storageObject:(e,t,r)=>(console.warn('THREE.TSL: "storageObject()" is deprecated. Use "storage().setPBO( true )" instead.'),Dc(e,t,r).setPBO(!0)),storageTexture:Cy,string:(e="")=>Pi(new ei(e,"string")),struct:(e,t=null)=>{const r=new bf(e,t),s=(...t)=>{let s=null;if(t.length>0)if(t[0].isNode){s={};const r=Object.keys(e);for(let e=0;eOx("texture").append(),textureBicubic:Hp,textureCubeUV:_g,textureLoad:Wu,textureSize:Gu,textureStore:(e,t,r)=>{const s=Cy(e,t,r);return null!==r&&s.append(),s},thickness:Xn,time:Bf,timerDelta:(e=1)=>(console.warn('TSL: timerDelta() is deprecated. Use "deltaTime" instead.'),If.mul(e)),timerGlobal:(e=1)=>(console.warn('TSL: timerGlobal() is deprecated. Use "time" instead.'),Bf.mul(e)),timerLocal:(e=1)=>(console.warn('TSL: timerLocal() is deprecated. Use "time" instead.'),Bf.mul(e)),toOutputColorSpace:iu,toWorkingColorSpace:nu,toneMapping:pu,toneMappingExposure:gu,toonOutlinePass:(t,r,s=new e(0,0,0),i=.003,n=1)=>Pi(new rx(t,r,Pi(s),Pi(i),Pi(n))),transformDirection:So,transformNormal:Wl,transformNormalToView:jl,transformedBentNormalView:Ed,transformedBitangentView:_d,transformedBitangentWorld:vd,transformedClearcoatNormalView:Hl,transformedNormalView:zl,transformedNormalWorld:$l,transformedTangentView:gd,transformedTangentWorld:md,transmission:qn,transpose:uo,triNoise3D:Mf,triplanarTexture:(...e)=>Hf(...e),triplanarTextures:Hf,trunc:ao,tslFn:(...e)=>(console.warn("THREE.TSL: tslFn() has been renamed to Fn()."),Vi(...e)),uint:Wi,uniform:Tn,uniformArray:Yu,uniformGroup:gn,uniforms:(e,t)=>(console.warn("THREE.TSL: uniforms() has been renamed to uniformArray()."),Pi(new Ku(e,t))),userData:(e,t,r)=>Pi(new Fy(e,t,r)),uv:Uu,uvec2:Ki,uvec3:Ji,uvec4:sn,varying:Qo,varyingProperty:Nn,vec2:qi,vec3:Qi,vec4:tn,vectorComponents:ks,velocity:Uy,vertexColor:e=>Pi(new by(e)),vertexIndex:_c,vertexStage:Zo,vibrance:jy,viewZToLogarithmicDepth:Nh,viewZToOrthographicDepth:Th,viewZToPerspectiveDepth:_h,viewport:nh,viewportBottomLeft:ch,viewportCoordinate:oh,viewportDepthTexture:xh,viewportLinearDepth:Ah,viewportMipTexture:mh,viewportResolution:lh,viewportSafeUV:Gf,viewportSharedTexture:Gh,viewportSize:ah,viewportTexture:gh,viewportTopLeft:dh,viewportUV:uh,wgsl:(e,t)=>gx(e,t,"wgsl"),wgslFn:(e,t)=>fx(e,t,"wgsl"),workgroupArray:(e,t)=>Pi(new kx("Workgroup",e,t)),workgroupBarrier:()=>Ox("workgroup").append(),workgroupId:Ix,workingToColorSpace:au,xor:ya});const DT=new mf;class VT extends Im{constructor(e,t){super(),this.renderer=e,this.nodes=t}update(e,t,r){const s=this.renderer,i=this.nodes.getBackgroundNode(e)||e.background;let n=!1;if(null===i)s._clearColor.getRGB(DT),DT.a=s._clearColor.a;else if(!0===i.isColor)i.getRGB(DT),DT.a=1,n=!0;else if(!0===i.isNode){const r=this.get(e),n=i;DT.copy(s._clearColor);let a=r.backgroundMesh;if(void 0===a){const e=$o(tn(n).mul(wy),{getUV:()=>Ay.mul(kl),getTextureLevel:()=>Ey});let t=bc;t=t.setZ(t.w);const s=new Fh;s.name="Background.material",s.side=N,s.depthTest=!1,s.depthWrite=!1,s.allowOverride=!1,s.fog=!1,s.lights=!1,s.vertexNode=t,s.colorNode=e,r.backgroundMeshNode=e,r.backgroundMesh=a=new W(new Oe(1,32,32),s),a.frustumCulled=!1,a.name="Background.mesh",a.onBeforeRender=function(e,t,r){this.matrixWorld.copyPosition(r.matrixWorld)}}const o=n.getCacheKey();r.backgroundCacheKey!==o&&(r.backgroundMeshNode.node=tn(n).mul(wy),r.backgroundMeshNode.needsUpdate=!0,a.material.needsUpdate=!0,r.backgroundCacheKey=o),t.unshift(a,a.geometry,a.material,0,0,null,null)}else console.error("THREE.Renderer: Unsupported background configuration.",i);const a=s.xr.getEnvironmentBlendMode();if("additive"===a?DT.set(0,0,0,1):"alpha-blend"===a&&DT.set(0,0,0,0),!0===s.autoClear||!0===n){const e=r.clearColorValue;e.r=DT.r,e.g=DT.g,e.b=DT.b,e.a=DT.a,!0!==s.backend.isWebGLBackend&&!0!==s.alpha||(e.r*=e.a,e.g*=e.a,e.b*=e.a),r.depthClearValue=s._clearDepth,r.stencilClearValue=s._clearStencil,r.clearColor=!0===s.autoClearColor,r.clearDepth=!0===s.autoClearDepth,r.clearStencil=!0===s.autoClearStencil}else r.clearColor=!1,r.clearDepth=!1,r.clearStencil=!1}}let UT=0;class OT{constructor(e="",t=[],r=0,s=[]){this.name=e,this.bindings=t,this.index=r,this.bindingsReference=s,this.id=UT++}}class GT{constructor(e,t,r,s,i,n,a,o,u,l=[]){this.vertexShader=e,this.fragmentShader=t,this.computeShader=r,this.transforms=l,this.nodeAttributes=s,this.bindings=i,this.updateNodes=n,this.updateBeforeNodes=a,this.updateAfterNodes=o,this.observer=u,this.usedTimes=0}createBindings(){const e=[];for(const t of this.bindings){if(!0!==t.bindings[0].groupNode.shared){const r=new OT(t.name,[],t.index,t);e.push(r);for(const e of t.bindings)r.bindings.push(e.clone())}else e.push(t)}return e}}class kT{constructor(e,t,r=null){this.isNodeAttribute=!0,this.name=e,this.type=t,this.node=r}}class zT{constructor(e,t,r){this.isNodeUniform=!0,this.name=e,this.type=t,this.node=r.getSelf()}get value(){return this.node.value}set value(e){this.node.value=e}get id(){return this.node.id}get groupNode(){return this.node.groupNode}}class $T{constructor(e,t,r=!1,s=null){this.isNodeVar=!0,this.name=e,this.type=t,this.readOnly=r,this.count=s}}class HT extends $T{constructor(e,t){super(e,t),this.needsInterpolation=!1,this.isNodeVarying=!0}}class WT{constructor(e,t,r=""){this.name=e,this.type=t,this.code=r,Object.defineProperty(this,"isNodeCode",{value:!0})}}let jT=0;class qT{constructor(e=null){this.id=jT++,this.nodesData=new WeakMap,this.parent=e}getData(e){let t=this.nodesData.get(e);return void 0===t&&null!==this.parent&&(t=this.parent.getData(e)),t}setData(e,t){this.nodesData.set(e,t)}}class XT{constructor(e,t){this.name=e,this.members=t,this.output=!1}}class KT{constructor(e,t){this.name=e,this.value=t,this.boundary=0,this.itemSize=0,this.offset=0}setValue(e){this.value=e}getValue(){return this.value}}class YT extends KT{constructor(e,t=0){super(e,t),this.isNumberUniform=!0,this.boundary=4,this.itemSize=1}}class QT extends KT{constructor(e,r=new t){super(e,r),this.isVector2Uniform=!0,this.boundary=8,this.itemSize=2}}class ZT extends KT{constructor(e,t=new r){super(e,t),this.isVector3Uniform=!0,this.boundary=16,this.itemSize=3}}class JT extends KT{constructor(e,t=new s){super(e,t),this.isVector4Uniform=!0,this.boundary=16,this.itemSize=4}}class e_ extends KT{constructor(t,r=new e){super(t,r),this.isColorUniform=!0,this.boundary=16,this.itemSize=3}}class t_ extends KT{constructor(e,t=new i){super(e,t),this.isMatrix2Uniform=!0,this.boundary=16,this.itemSize=4}}class r_ extends KT{constructor(e,t=new n){super(e,t),this.isMatrix3Uniform=!0,this.boundary=48,this.itemSize=12}}class s_ extends KT{constructor(e,t=new a){super(e,t),this.isMatrix4Uniform=!0,this.boundary=64,this.itemSize=16}}class i_ extends YT{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class n_ extends QT{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class a_ extends ZT{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class o_ extends JT{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class u_ extends e_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class l_ extends t_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class d_ extends r_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class c_ extends s_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}const h_=new WeakMap,p_=new Map([[Int8Array,"int"],[Int16Array,"int"],[Int32Array,"int"],[Uint8Array,"uint"],[Uint16Array,"uint"],[Uint32Array,"uint"],[Float32Array,"float"]]),g_=e=>/e/g.test(e)?String(e).replace(/\+/g,""):(e=Number(e))+(e%1?"":".0");class m_{constructor(e,t,r){this.object=e,this.material=e&&e.material||null,this.geometry=e&&e.geometry||null,this.renderer=t,this.parser=r,this.scene=null,this.camera=null,this.nodes=[],this.sequentialNodes=[],this.updateNodes=[],this.updateBeforeNodes=[],this.updateAfterNodes=[],this.hashNodes={},this.observer=null,this.lightsNode=null,this.environmentNode=null,this.fogNode=null,this.clippingContext=null,this.vertexShader=null,this.fragmentShader=null,this.computeShader=null,this.flowNodes={vertex:[],fragment:[],compute:[]},this.flowCode={vertex:"",fragment:"",compute:""},this.uniforms={vertex:[],fragment:[],compute:[],index:0},this.structs={vertex:[],fragment:[],compute:[],index:0},this.bindings={vertex:{},fragment:{},compute:{}},this.bindingsIndexes={},this.bindGroups=null,this.attributes=[],this.bufferAttributes=[],this.varyings=[],this.codes={},this.vars={},this.declarations={},this.flow={code:""},this.chaining=[],this.stack=xf(),this.stacks=[],this.tab="\t",this.currentFunctionNode=null,this.context={material:this.material},this.cache=new qT,this.globalCache=this.cache,this.flowsData=new WeakMap,this.shaderStage=null,this.buildStage=null}getBindGroupsCache(){let e=h_.get(this.renderer);return void 0===e&&(e=new Mm,h_.set(this.renderer,e)),e}createRenderTarget(e,t,r){return new ae(e,t,r)}createCubeRenderTarget(e,t){return new Xh(e,t)}includes(e){return this.nodes.includes(e)}getOutputStructName(){}_getBindGroup(e,t){const r=this.getBindGroupsCache(),s=[];let i,n=!0;for(const e of t)s.push(e),n=n&&!0!==e.groupNode.shared;return n?(i=r.get(s),void 0===i&&(i=new OT(e,s,this.bindingsIndexes[e].group,s),r.set(s,i))):i=new OT(e,s,this.bindingsIndexes[e].group,s),i}getBindGroupArray(e,t){const r=this.bindings[t];let s=r[e];return void 0===s&&(void 0===this.bindingsIndexes[e]&&(this.bindingsIndexes[e]={binding:0,group:Object.keys(this.bindingsIndexes).length}),r[e]=s=[]),s}getBindings(){let e=this.bindGroups;if(null===e){const t={},r=this.bindings;for(const e of Gs)for(const s in r[e]){const i=r[e][s];(t[s]||(t[s]=[])).push(...i)}e=[];for(const r in t){const s=t[r],i=this._getBindGroup(r,s);e.push(i)}this.bindGroups=e}return e}sortBindingGroups(){const e=this.getBindings();e.sort(((e,t)=>e.bindings[0].groupNode.order-t.bindings[0].groupNode.order));for(let t=0;t=0?`${Math.round(n)}u`:"0u";if("bool"===i)return n?"true":"false";if("color"===i)return`${this.getType("vec3")}( ${g_(n.r)}, ${g_(n.g)}, ${g_(n.b)} )`;const a=this.getTypeLength(i),o=this.getComponentType(i),u=e=>this.generateConst(o,e);if(2===a)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)} )`;if(3===a)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)} )`;if(4===a&&"mat2"!==i)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)}, ${u(n.w)} )`;if(a>=4&&n&&(n.isMatrix2||n.isMatrix3||n.isMatrix4))return`${this.getType(i)}( ${n.elements.map(u).join(", ")} )`;if(a>4)return`${this.getType(i)}()`;throw new Error(`NodeBuilder: Type '${i}' not found in generate constant attempt.`)}getType(e){return"color"===e?"vec3":e}hasGeometryAttribute(e){return this.geometry&&void 0!==this.geometry.getAttribute(e)}getAttribute(e,t){const r=this.attributes;for(const t of r)if(t.name===e)return t;const s=new kT(e,t);return this.registerDeclaration(s),r.push(s),s}getPropertyName(e){return e.name}isVector(e){return/vec\d/.test(e)}isMatrix(e){return/mat\d/.test(e)}isReference(e){return"void"===e||"property"===e||"sampler"===e||"samplerComparison"===e||"texture"===e||"cubeTexture"===e||"storageTexture"===e||"depthTexture"===e||"texture3D"===e}needsToWorkingColorSpace(){return!1}getComponentTypeFromTexture(e){const t=e.type;if(e.isDataTexture){if(t===T)return"int";if(t===b)return"uint"}return"float"}getElementType(e){return"mat2"===e?"vec2":"mat3"===e?"vec3":"mat4"===e?"vec4":this.getComponentType(e)}getComponentType(e){if("float"===(e=this.getVectorType(e))||"bool"===e||"int"===e||"uint"===e)return e;const t=/(b|i|u|)(vec|mat)([2-4])/.exec(e);return null===t?null:"b"===t[1]?"bool":"i"===t[1]?"int":"u"===t[1]?"uint":"float"}getVectorType(e){return"color"===e?"vec3":"texture"===e||"cubeTexture"===e||"storageTexture"===e||"texture3D"===e?"vec4":e}getTypeFromLength(e,t="float"){if(1===e)return t;let r=Es(e);const s="float"===t?"":t[0];return!0===/mat2/.test(t)&&(r=r.replace("vec","mat")),s+r}getTypeFromArray(e){return p_.get(e.constructor)}isInteger(e){return/int|uint|(i|u)vec/.test(e)}getTypeFromAttribute(e){let t=e;e.isInterleavedBufferAttribute&&(t=e.data);const r=t.array,s=e.itemSize,i=e.normalized;let n;return e instanceof ze||!0===i||(n=this.getTypeFromArray(r)),this.getTypeFromLength(s,n)}getTypeLength(e){const t=this.getVectorType(e),r=/vec([2-4])/.exec(t);return null!==r?Number(r[1]):"float"===t||"bool"===t||"int"===t||"uint"===t?1:!0===/mat2/.test(e)?4:!0===/mat3/.test(e)?9:!0===/mat4/.test(e)?16:0}getVectorFromMatrix(e){return e.replace("mat","vec")}changeComponentType(e,t){return this.getTypeFromLength(this.getTypeLength(e),t)}getIntegerType(e){const t=this.getComponentType(e);return"int"===t||"uint"===t?e:this.changeComponentType(e,"int")}addStack(){return this.stack=xf(this.stack),this.stacks.push(Oi()||this.stack),Ui(this.stack),this.stack}removeStack(){const e=this.stack;return this.stack=e.parent,Ui(this.stacks.pop()),e}getDataFromNode(e,t=this.shaderStage,r=null){let s=(r=null===r?e.isGlobal(this)?this.globalCache:this.cache:r).getData(e);return void 0===s&&(s={},r.setData(e,s)),void 0===s[t]&&(s[t]={}),s[t]}getNodeProperties(e,t="any"){const r=this.getDataFromNode(e,t);return r.properties||(r.properties={outputNode:null})}getBufferAttributeFromNode(e,t){const r=this.getDataFromNode(e);let s=r.bufferAttribute;if(void 0===s){const i=this.uniforms.index++;s=new kT("nodeAttribute"+i,t,e),this.bufferAttributes.push(s),r.bufferAttribute=s}return s}getStructTypeFromNode(e,t,r=null,s=this.shaderStage){const i=this.getDataFromNode(e,s,this.globalCache);let n=i.structType;if(void 0===n){const e=this.structs.index++;null===r&&(r="StructType"+e),n=new XT(r,t),this.structs[s].push(n),i.structType=n}return n}getOutputStructTypeFromNode(e,t){const r=this.getStructTypeFromNode(e,t,"OutputType","fragment");return r.output=!0,r}getUniformFromNode(e,t,r=this.shaderStage,s=null){const i=this.getDataFromNode(e,r,this.globalCache);let n=i.uniform;if(void 0===n){const a=this.uniforms.index++;n=new zT(s||"nodeUniform"+a,t,e),this.uniforms[r].push(n),this.registerDeclaration(n),i.uniform=n}return n}getArrayCount(e){let t=null;return e.isArrayNode?t=e.count:e.isVarNode&&e.node.isArrayNode&&(t=e.node.count),t}getVarFromNode(e,t=null,r=e.getNodeType(this),s=this.shaderStage,i=!1){const n=this.getDataFromNode(e,s);let a=n.variable;if(void 0===a){const o=i?"_const":"_var",u=this.vars[s]||(this.vars[s]=[]),l=this.vars[o]||(this.vars[o]=0);null===t&&(t=(i?"nodeConst":"nodeVar")+l,this.vars[o]++);const d=this.getArrayCount(e);a=new $T(t,r,i,d),i||u.push(a),this.registerDeclaration(a),n.variable=a}return a}isDeterministic(e){if(e.isMathNode)return this.isDeterministic(e.aNode)&&(!e.bNode||this.isDeterministic(e.bNode))&&(!e.cNode||this.isDeterministic(e.cNode));if(e.isOperatorNode)return this.isDeterministic(e.aNode)&&(!e.bNode||this.isDeterministic(e.bNode));if(e.isArrayNode){if(null!==e.values)for(const t of e.values)if(!this.isDeterministic(t))return!1;return!0}return!!e.isConstNode}getVaryingFromNode(e,t=null,r=e.getNodeType(this)){const s=this.getDataFromNode(e,"any");let i=s.varying;if(void 0===i){const e=this.varyings,n=e.length;null===t&&(t="nodeVarying"+n),i=new HT(t,r),e.push(i),this.registerDeclaration(i),s.varying=i}return i}registerDeclaration(e){const t=this.shaderStage,r=this.declarations[t]||(this.declarations[t]={}),s=this.getPropertyName(e);let i=1,n=s;for(;void 0!==r[n];)n=s+"_"+i++;r[n]=e,i>1&&(e.name=n,console.warn(`THREE.TSL: Declaration name '${s}' of '${e.type}' already in use. Renamed to '${n}'.`))}getCodeFromNode(e,t,r=this.shaderStage){const s=this.getDataFromNode(e);let i=s.code;if(void 0===i){const e=this.codes[r]||(this.codes[r]=[]),n=e.length;i=new WT("nodeCode"+n,t),e.push(i),s.code=i}return i}addFlowCodeHierarchy(e,t){const{flowCodes:r,flowCodeBlock:s}=this.getDataFromNode(e);let i=!0,n=t;for(;n;){if(!0===s.get(n)){i=!1;break}n=this.getDataFromNode(n).parentNodeBlock}if(i)for(const e of r)this.addLineFlowCode(e)}addLineFlowCodeBlock(e,t,r){const s=this.getDataFromNode(e),i=s.flowCodes||(s.flowCodes=[]),n=s.flowCodeBlock||(s.flowCodeBlock=new WeakMap);i.push(t),n.set(r,!0)}addLineFlowCode(e,t=null){return""===e||(null!==t&&this.context.nodeBlock&&this.addLineFlowCodeBlock(t,e,this.context.nodeBlock),e=this.tab+e,/;\s*$/.test(e)||(e+=";\n"),this.flow.code+=e),this}addFlowCode(e){return this.flow.code+=e,this}addFlowTab(){return this.tab+="\t",this}removeFlowTab(){return this.tab=this.tab.slice(0,-1),this}getFlowData(e){return this.flowsData.get(e)}flowNode(e){const t=e.getNodeType(this),r=this.flowChildNode(e,t);return this.flowsData.set(e,r),r}addInclude(e){null!==this.currentFunctionNode&&this.currentFunctionNode.includes.push(e)}buildFunctionNode(e){const t=new mx,r=this.currentFunctionNode;return this.currentFunctionNode=t,t.code=this.buildFunctionCode(e),this.currentFunctionNode=r,t}flowShaderNode(e){const t=e.layout,r={[Symbol.iterator](){let e=0;const t=Object.values(this);return{next:()=>({value:t[e],done:e++>=t.length})}}};for(const e of t.inputs)r[e.name]=new ff(e.type,e.name);e.layout=null;const s=e.call(r),i=this.flowStagesNode(s,t.type);return e.layout=t,i}flowStagesNode(e,t=null){const r=this.flow,s=this.vars,i=this.declarations,n=this.cache,a=this.buildStage,o=this.stack,u={code:""};this.flow=u,this.vars={},this.declarations={},this.cache=new qT,this.stack=xf();for(const r of Os)this.setBuildStage(r),u.result=e.build(this,t);return u.vars=this.getVars(this.shaderStage),this.flow=r,this.vars=s,this.declarations=i,this.cache=n,this.stack=o,this.setBuildStage(a),u}getFunctionOperator(){return null}buildFunctionCode(){console.warn("Abstract function.")}flowChildNode(e,t=null){const r=this.flow,s={code:""};return this.flow=s,s.result=e.build(this,t),this.flow=r,s}flowNodeFromShaderStage(e,t,r=null,s=null){const i=this.shaderStage;this.setShaderStage(e);const n=this.flowChildNode(t,r);return null!==s&&(n.code+=`${this.tab+s} = ${n.result};\n`),this.flowCode[e]=this.flowCode[e]+n.code,this.setShaderStage(i),n}getAttributesArray(){return this.attributes.concat(this.bufferAttributes)}getAttributes(){console.warn("Abstract function.")}getVaryings(){console.warn("Abstract function.")}getVar(e,t,r=null){return`${null!==r?this.generateArrayDeclaration(e,r):this.getType(e)} ${t}`}getVars(e){let t="";const r=this.vars[e];if(void 0!==r)for(const e of r)t+=`${this.getVar(e.type,e.name)}; `;return t}getUniforms(){console.warn("Abstract function.")}getCodes(e){const t=this.codes[e];let r="";if(void 0!==t)for(const e of t)r+=e.code+"\n";return r}getHash(){return this.vertexShader+this.fragmentShader+this.computeShader}setShaderStage(e){this.shaderStage=e}getShaderStage(){return this.shaderStage}setBuildStage(e){this.buildStage=e}getBuildStage(){return this.buildStage}buildCode(){console.warn("Abstract function.")}build(){const{object:e,material:t,renderer:r}=this;if(null!==t){let e=r.library.fromMaterial(t);null===e&&(console.error(`NodeMaterial: Material "${t.type}" is not compatible.`),e=new Fh),e.build(this)}else this.addFlow("compute",e);for(const e of Os){this.setBuildStage(e),this.context.vertex&&this.context.vertex.isNode&&this.flowNodeFromShaderStage("vertex",this.context.vertex);for(const t of Gs){this.setShaderStage(t);const r=this.flowNodes[t];for(const t of r)"generate"===e?this.flowNode(t):t.build(this)}}return this.setBuildStage(null),this.setShaderStage(null),this.buildCode(),this.buildUpdateNodes(),this}getNodeUniform(e,t){if("float"===t||"int"===t||"uint"===t)return new i_(e);if("vec2"===t||"ivec2"===t||"uvec2"===t)return new n_(e);if("vec3"===t||"ivec3"===t||"uvec3"===t)return new a_(e);if("vec4"===t||"ivec4"===t||"uvec4"===t)return new o_(e);if("color"===t)return new u_(e);if("mat2"===t)return new l_(e);if("mat3"===t)return new d_(e);if("mat4"===t)return new c_(e);throw new Error(`Uniform "${t}" not declared.`)}format(e,t,r){if((t=this.getVectorType(t))===(r=this.getVectorType(r))||null===r||this.isReference(r))return e;const s=this.getTypeLength(t),i=this.getTypeLength(r);return 16===s&&9===i?`${this.getType(r)}( ${e}[ 0 ].xyz, ${e}[ 1 ].xyz, ${e}[ 2 ].xyz )`:9===s&&4===i?`${this.getType(r)}( ${e}[ 0 ].xy, ${e}[ 1 ].xy )`:s>4||i>4||0===i?e:s===i?`${this.getType(r)}( ${e} )`:s>i?this.format(`${e}.${"xyz".slice(0,i)}`,this.getTypeFromLength(i,this.getComponentType(t)),r):4===i&&s>1?`${this.getType(r)}( ${this.format(e,t,"vec3")}, 1.0 )`:2===s?`${this.getType(r)}( ${this.format(e,t,"vec2")}, 0.0 )`:(1===s&&i>1&&t!==this.getComponentType(r)&&(e=`${this.getType(this.getComponentType(r))}( ${e} )`),`${this.getType(r)}( ${e} )`)}getSignature(){return`// Three.js r${$e} - Node System\n`}createNodeMaterial(e="NodeMaterial"){throw new Error(`THREE.NodeBuilder: createNodeMaterial() was deprecated. Use new ${e}() instead.`)}}class f_{constructor(){this.time=0,this.deltaTime=0,this.frameId=0,this.renderId=0,this.updateMap=new WeakMap,this.updateBeforeMap=new WeakMap,this.updateAfterMap=new WeakMap,this.renderer=null,this.material=null,this.camera=null,this.object=null,this.scene=null}_getMaps(e,t){let r=e.get(t);return void 0===r&&(r={renderMap:new WeakMap,frameMap:new WeakMap},e.set(t,r)),r}updateBeforeNode(e){const t=e.getUpdateBeforeType(),r=e.updateReference(this);if(t===Is.FRAME){const{frameMap:t}=this._getMaps(this.updateBeforeMap,r);t.get(r)!==this.frameId&&!1!==e.updateBefore(this)&&t.set(r,this.frameId)}else if(t===Is.RENDER){const{renderMap:t}=this._getMaps(this.updateBeforeMap,r);t.get(r)!==this.renderId&&!1!==e.updateBefore(this)&&t.set(r,this.renderId)}else t===Is.OBJECT&&e.updateBefore(this)}updateAfterNode(e){const t=e.getUpdateAfterType(),r=e.updateReference(this);if(t===Is.FRAME){const{frameMap:t}=this._getMaps(this.updateAfterMap,r);t.get(r)!==this.frameId&&!1!==e.updateAfter(this)&&t.set(r,this.frameId)}else if(t===Is.RENDER){const{renderMap:t}=this._getMaps(this.updateAfterMap,r);t.get(r)!==this.renderId&&!1!==e.updateAfter(this)&&t.set(r,this.renderId)}else t===Is.OBJECT&&e.updateAfter(this)}updateNode(e){const t=e.getUpdateType(),r=e.updateReference(this);if(t===Is.FRAME){const{frameMap:t}=this._getMaps(this.updateMap,r);t.get(r)!==this.frameId&&!1!==e.update(this)&&t.set(r,this.frameId)}else if(t===Is.RENDER){const{renderMap:t}=this._getMaps(this.updateMap,r);t.get(r)!==this.renderId&&!1!==e.update(this)&&t.set(r,this.renderId)}else t===Is.OBJECT&&e.update(this)}update(){this.frameId++,void 0===this.lastTime&&(this.lastTime=performance.now()),this.deltaTime=(performance.now()-this.lastTime)/1e3,this.lastTime=performance.now(),this.time+=this.deltaTime}}class y_{constructor(e,t,r=null,s="",i=!1){this.type=e,this.name=t,this.count=r,this.qualifier=s,this.isConst=i}}y_.isNodeFunctionInput=!0;class x_ extends Vb{static get type(){return"DirectionalLightNode"}constructor(e=null){super(e)}setupDirect(){const e=this.colorNode;return{lightDirection:Zx(this.light),lightColor:e}}}const b_=new a,T_=new a;let __=null;class v_ extends Vb{static get type(){return"RectAreaLightNode"}constructor(e=null){super(e),this.halfHeight=Tn(new r).setGroup(yn),this.halfWidth=Tn(new r).setGroup(yn),this.updateType=Is.RENDER}update(e){super.update(e);const{light:t}=this,r=e.camera.matrixWorldInverse;T_.identity(),b_.copy(t.matrixWorld),b_.premultiply(r),T_.extractRotation(b_),this.halfWidth.value.set(.5*t.width,0,0),this.halfHeight.value.set(0,.5*t.height,0),this.halfWidth.value.applyMatrix4(T_),this.halfHeight.value.applyMatrix4(T_)}setupDirectRectArea(e){let t,r;e.isAvailable("float32Filterable")?(t=Hu(__.LTC_FLOAT_1),r=Hu(__.LTC_FLOAT_2)):(t=Hu(__.LTC_HALF_1),r=Hu(__.LTC_HALF_2));const{colorNode:s,light:i}=this;return{lightColor:s,lightPosition:Qx(i),halfWidth:this.halfWidth,halfHeight:this.halfHeight,ltc_1:t,ltc_2:r}}static setLTC(e){__=e}}class N_ extends Vb{static get type(){return"SpotLightNode"}constructor(e=null){super(e),this.coneCosNode=Tn(0).setGroup(yn),this.penumbraCosNode=Tn(0).setGroup(yn),this.cutoffDistanceNode=Tn(0).setGroup(yn),this.decayExponentNode=Tn(0).setGroup(yn)}update(e){super.update(e);const{light:t}=this;this.coneCosNode.value=Math.cos(t.angle),this.penumbraCosNode.value=Math.cos(t.angle*(1-t.penumbra)),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}getSpotAttenuation(e){const{coneCosNode:t,penumbraCosNode:r}=this;return Po(t,r,e)}setupDirect(e){const{colorNode:t,cutoffDistanceNode:r,decayExponentNode:s,light:i}=this,n=this.getLightVector(e),a=n.normalize(),o=a.dot(Zx(i)),u=this.getSpotAttenuation(o),l=n.length(),d=Ub({lightDistance:l,cutoffDistance:r,decayExponent:s});let c=t.mul(u).mul(d);if(i.map){const t=Xx(i,e.context.positionWorld),r=Hu(i.map,t.xy).onRenderUpdate((()=>i.map));c=t.mul(2).sub(1).abs().lessThan(1).all().select(c.mul(r),c)}return{lightColor:c,lightDirection:a}}}class S_ extends N_{static get type(){return"IESSpotLightNode"}getSpotAttenuation(e){const t=this.light.iesMap;let r=null;if(t&&!0===t.isTexture){const s=e.acos().mul(1/Math.PI);r=Hu(t,qi(s,0),0).r}else r=super.getSpotAttenuation(e);return r}}class E_ extends Vb{static get type(){return"AmbientLightNode"}constructor(e=null){super(e)}setup({context:e}){e.irradiance.addAssign(this.colorNode)}}class w_ extends Vb{static get type(){return"HemisphereLightNode"}constructor(t=null){super(t),this.lightPositionNode=Kx(t),this.lightDirectionNode=this.lightPositionNode.normalize(),this.groundColorNode=Tn(new e).setGroup(yn)}update(e){const{light:t}=this;super.update(e),this.lightPositionNode.object3d=t,this.groundColorNode.value.copy(t.groundColor).multiplyScalar(t.intensity)}setup(e){const{colorNode:t,groundColorNode:r,lightDirectionNode:s}=this,i=Gl.dot(s).mul(.5).add(.5),n=Ao(r,t,i);e.context.irradiance.addAssign(n)}}class A_ extends Vb{static get type(){return"LightProbeNode"}constructor(e=null){super(e);const t=[];for(let e=0;e<9;e++)t.push(new r);this.lightProbe=Yu(t)}update(e){const{light:t}=this;super.update(e);for(let e=0;e<9;e++)this.lightProbe.array[e].copy(t.sh.coefficients[e]).multiplyScalar(t.intensity)}setup(e){const t=BT(kl,this.lightProbe);e.context.irradiance.addAssign(t)}}class R_{parseFunction(){console.warn("Abstract function.")}}class C_{constructor(e,t,r="",s=""){this.type=e,this.inputs=t,this.name=r,this.precision=s}getCode(){console.warn("Abstract function.")}}C_.isNodeFunction=!0;const M_=/^\s*(highp|mediump|lowp)?\s*([a-z_0-9]+)\s*([a-z_0-9]+)?\s*\(([\s\S]*?)\)/i,P_=/[a-z_0-9]+/gi,L_="#pragma main";class F_ extends C_{constructor(e){const{type:t,inputs:r,name:s,precision:i,inputsCode:n,blockCode:a,headerCode:o}=(e=>{const t=(e=e.trim()).indexOf(L_),r=-1!==t?e.slice(t+12):e,s=r.match(M_);if(null!==s&&5===s.length){const i=s[4],n=[];let a=null;for(;null!==(a=P_.exec(i));)n.push(a);const o=[];let u=0;for(;u0||e.backgroundBlurriness>0&&0===t.backgroundBlurriness;if(t.background!==r||s){const i=this.getCacheNode("background",r,(()=>{if(!0===r.isCubeTexture||r.mapping===Y||r.mapping===Q||r.mapping===oe){if(e.backgroundBlurriness>0||r.mapping===oe)return Yg(r);{let e;return e=!0===r.isCubeTexture?sd(r):Hu(r),Jh(e)}}if(!0===r.isTexture)return Hu(r,rh.flipY()).setUpdateMatrix(!0);!0!==r.isColor&&console.error("WebGPUNodes: Unsupported background configuration.",r)}),s);t.backgroundNode=i,t.background=r,t.backgroundBlurriness=e.backgroundBlurriness}}else t.backgroundNode&&(delete t.backgroundNode,delete t.background)}getCacheNode(e,t,r,s=!1){const i=this.cacheLib[e]||(this.cacheLib[e]=new WeakMap);let n=i.get(t);return(void 0===n||s)&&(n=r(),i.set(t,n)),n}updateFog(e){const t=this.get(e),r=e.fog;if(r){if(t.fog!==r){const e=this.getCacheNode("fog",r,(()=>{if(r.isFogExp2){const e=ad("color","color",r).setGroup(yn),t=ad("density","float",r).setGroup(yn);return Ax(e,wx(t))}if(r.isFog){const e=ad("color","color",r).setGroup(yn),t=ad("near","float",r).setGroup(yn),s=ad("far","float",r).setGroup(yn);return Ax(e,Ex(t,s))}console.error("THREE.Renderer: Unsupported fog configuration.",r)}));t.fogNode=e,t.fog=r}}else delete t.fogNode,delete t.fog}updateEnvironment(e){const t=this.get(e),r=e.environment;if(r){if(t.environment!==r){const e=this.getCacheNode("environment",r,(()=>!0===r.isCubeTexture?sd(r):!0===r.isTexture?Hu(r):void console.error("Nodes: Unsupported environment configuration.",r)));t.environmentNode=e,t.environment=r}}else t.environmentNode&&(delete t.environmentNode,delete t.environment)}getNodeFrame(e=this.renderer,t=null,r=null,s=null,i=null){const n=this.nodeFrame;return n.renderer=e,n.scene=t,n.object=r,n.camera=s,n.material=i,n}getNodeFrameForRender(e){return this.getNodeFrame(e.renderer,e.scene,e.object,e.camera,e.material)}getOutputCacheKey(){const e=this.renderer;return e.toneMapping+","+e.currentColorSpace}hasOutputChange(e){return I_.get(e)!==this.getOutputCacheKey()}getOutputNode(e){const t=this.renderer,r=this.getOutputCacheKey(),s=Hu(e,rh).renderOutput(t.toneMapping,t.currentColorSpace);return I_.set(e,r),s}updateBefore(e){const t=e.getNodeBuilderState();for(const r of t.updateBeforeNodes)this.getNodeFrameForRender(e).updateBeforeNode(r)}updateAfter(e){const t=e.getNodeBuilderState();for(const r of t.updateAfterNodes)this.getNodeFrameForRender(e).updateAfterNode(r)}updateForCompute(e){const t=this.getNodeFrame(),r=this.getForCompute(e);for(const e of r.updateNodes)t.updateNode(e)}updateForRender(e){const t=this.getNodeFrameForRender(e),r=e.getNodeBuilderState();for(const e of r.updateNodes)t.updateNode(e)}needsRefresh(e){const t=this.getNodeFrameForRender(e);return e.getMonitor().needsRefresh(e,t)}dispose(){super.dispose(),this.nodeFrame=new f_,this.nodeBuilderCache=new Map,this.cacheLib={}}}const O_=new Me;class G_{constructor(e=null){this.version=0,this.clipIntersection=null,this.cacheKey="",this.shadowPass=!1,this.viewNormalMatrix=new n,this.clippingGroupContexts=new WeakMap,this.intersectionPlanes=[],this.unionPlanes=[],this.parentVersion=null,null!==e&&(this.viewNormalMatrix=e.viewNormalMatrix,this.clippingGroupContexts=e.clippingGroupContexts,this.shadowPass=e.shadowPass,this.viewMatrix=e.viewMatrix)}projectPlanes(e,t,r){const s=e.length;for(let i=0;i0,alpha:!0,depth:t.depth,stencil:t.stencil,framebufferScaleFactor:this.getFramebufferScaleFactor()},i=new XRWebGLLayer(e,s,r);this._glBaseLayer=i,e.updateRenderState({baseLayer:i}),t.setPixelRatio(1),t.setSize(i.framebufferWidth,i.framebufferHeight,!1),this._xrRenderTarget=new X_(i.framebufferWidth,i.framebufferHeight,{format:ce,type:Ce,colorSpace:t.outputColorSpace,stencilBuffer:t.stencil,resolveDepthBuffer:!1===i.ignoreDepthValues,resolveStencilBuffer:!1===i.ignoreDepthValues})}this.setFoveation(this.getFoveation()),t._animation.setAnimationLoop(this._onAnimationFrame),t._animation.setContext(e),t._animation.start(),this.isPresenting=!0,this.dispatchEvent({type:"sessionstart"})}}updateCamera(e){const t=this._session;if(null===t)return;const r=e.near,s=e.far,i=this._cameraXR,n=this._cameraL,a=this._cameraR;i.near=a.near=n.near=r,i.far=a.far=n.far=s,this._currentDepthNear===i.near&&this._currentDepthFar===i.far||(t.updateRenderState({depthNear:i.near,depthFar:i.far}),this._currentDepthNear=i.near,this._currentDepthFar=i.far),n.layers.mask=2|e.layers.mask,a.layers.mask=4|e.layers.mask,i.layers.mask=n.layers.mask|a.layers.mask;const o=e.parent,u=i.cameras;Z_(i,o);for(let e=0;e=0&&(r[n]=null,t[n].disconnect(i))}for(let s=0;s=r.length){r.push(i),n=e;break}if(null===r[e]){r[e]=i,n=e;break}}if(-1===n)break}const a=t[n];a&&a.connect(i)}}function rv(e){return"quad"===e.type?this._glBinding.createQuadLayer({transform:new XRRigidTransform(e.translation,e.quaternion),depthFormat:this._gl.DEPTH_COMPONENT,width:e.width/2,height:e.height/2,space:this._referenceSpace,viewPixelWidth:e.pixelwidth,viewPixelHeight:e.pixelheight}):this._glBinding.createCylinderLayer({transform:new XRRigidTransform(e.translation,e.quaternion),depthFormat:this._gl.DEPTH_COMPONENT,radius:e.radius,centralAngle:e.centralAngle,aspectRatio:e.aspectRatio,space:this._referenceSpace,viewPixelWidth:e.pixelwidth,viewPixelHeight:e.pixelheight})}function sv(e,t){if(void 0===t)return;const r=this._cameraXR,i=this._renderer,n=i.backend,a=this._glBaseLayer,o=this.getReferenceSpace(),u=t.getViewerPose(o);if(this._xrFrame=t,null!==u){const e=u.views;null!==this._glBaseLayer&&n.setXRTarget(a.framebuffer);let t=!1;e.length!==r.cameras.length&&(r.cameras.length=0,t=!0);for(let i=0;i{await this.compileAsync(e,t);const s=this._renderLists.get(e,t),i=this._renderContexts.get(e,t,this._renderTarget),n=e.overrideMaterial||r.material,a=this._objects.get(r,n,e,t,s.lightsNode,i,i.clippingContext),{fragmentShader:o,vertexShader:u}=a.getNodeBuilderState();return{fragmentShader:o,vertexShader:u}}}}async init(){if(this._initialized)throw new Error("Renderer: Backend has already been initialized.");return null!==this._initPromise||(this._initPromise=new Promise((async(e,t)=>{let r=this.backend;try{await r.init(this)}catch(e){if(null===this._getFallback)return void t(e);try{this.backend=r=this._getFallback(e),await r.init(this)}catch(e){return void t(e)}}this._nodes=new U_(this,r),this._animation=new Cm(this._nodes,this.info),this._attributes=new km(r),this._background=new VT(this,this._nodes),this._geometries=new Hm(this._attributes,this.info),this._textures=new gf(this,r,this.info),this._pipelines=new Qm(r,this._nodes),this._bindings=new Zm(r,this._nodes,this._textures,this._attributes,this._pipelines,this.info),this._objects=new Bm(this,this._nodes,this._geometries,this._pipelines,this._bindings,this.info),this._renderLists=new nf(this.lighting),this._bundles=new $_,this._renderContexts=new hf,this._animation.start(),this._initialized=!0,e(this)}))),this._initPromise}get coordinateSystem(){return this.backend.coordinateSystem}async compileAsync(e,t,r=null){if(!0===this._isDeviceLost)return;!1===this._initialized&&await this.init();const s=this._nodes.nodeFrame,i=s.renderId,n=this._currentRenderContext,a=this._currentRenderObjectFunction,o=this._compilationPromises,u=!0===e.isScene?e:iv;null===r&&(r=e);const l=this._renderTarget,d=this._renderContexts.get(r,t,l),c=this._activeMipmapLevel,h=[];this._currentRenderContext=d,this._currentRenderObjectFunction=this.renderObject,this._handleObjectFunction=this._createObjectPipeline,this._compilationPromises=h,s.renderId++,s.update(),d.depth=this.depth,d.stencil=this.stencil,d.clippingContext||(d.clippingContext=new G_),d.clippingContext.updateGlobal(u,t),u.onBeforeRender(this,e,t,l);const p=this._renderLists.get(e,t);if(p.begin(),this._projectObject(e,t,0,p,d.clippingContext),r!==e&&r.traverseVisible((function(e){e.isLight&&e.layers.test(t.layers)&&p.pushLight(e)})),p.finish(),null!==l){this._textures.updateRenderTarget(l,c);const e=this._textures.get(l);d.textures=e.textures,d.depthTexture=e.depthTexture}else d.textures=null,d.depthTexture=null;this._background.update(u,p,d);const g=p.opaque,m=p.transparent,f=p.transparentDoublePass,y=p.lightsNode;!0===this.opaque&&g.length>0&&this._renderObjects(g,t,u,y),!0===this.transparent&&m.length>0&&this._renderTransparents(m,f,t,u,y),s.renderId=i,this._currentRenderContext=n,this._currentRenderObjectFunction=a,this._compilationPromises=o,this._handleObjectFunction=this._renderObjectDirect,await Promise.all(h)}async renderAsync(e,t){!1===this._initialized&&await this.init(),this._renderScene(e,t)}async waitForGPU(){await this.backend.waitForGPU()}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}getColorBufferType(){return this._colorBufferType}_onDeviceLost(e){let t=`THREE.WebGPURenderer: ${e.api} Device Lost:\n\nMessage: ${e.message}`;e.reason&&(t+=`\nReason: ${e.reason}`),console.error(t),this._isDeviceLost=!0}_renderBundle(e,t,r){const{bundleGroup:s,camera:i,renderList:n}=e,a=this._currentRenderContext,o=this._bundles.get(s,i),u=this.backend.get(o);void 0===u.renderContexts&&(u.renderContexts=new Set);const l=s.version!==u.version,d=!1===u.renderContexts.has(a)||l;if(u.renderContexts.add(a),d){this.backend.beginBundle(a),(void 0===u.renderObjects||l)&&(u.renderObjects=[]),this._currentRenderBundle=o;const{transparentDoublePass:e,transparent:d,opaque:c}=n;!0===this.opaque&&c.length>0&&this._renderObjects(c,i,t,r),!0===this.transparent&&d.length>0&&this._renderTransparents(d,e,i,t,r),this._currentRenderBundle=null,this.backend.finishBundle(a,o),u.version=s.version}else{const{renderObjects:e}=u;for(let t=0,r=e.length;t>=c,p.viewportValue.height>>=c,p.viewportValue.minDepth=b,p.viewportValue.maxDepth=T,p.viewport=!1===p.viewportValue.equals(av),p.scissorValue.copy(y).multiplyScalar(x).floor(),p.scissor=this._scissorTest&&!1===p.scissorValue.equals(av),p.scissorValue.width>>=c,p.scissorValue.height>>=c,p.clippingContext||(p.clippingContext=new G_),p.clippingContext.updateGlobal(u,t),u.onBeforeRender(this,e,t,h),uv.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),ov.setFromProjectionMatrix(uv,g);const _=this._renderLists.get(e,t);if(_.begin(),this._projectObject(e,t,0,_,p.clippingContext),_.finish(),!0===this.sortObjects&&_.sort(this._opaqueSort,this._transparentSort),null!==h){this._textures.updateRenderTarget(h,c);const e=this._textures.get(h);p.textures=e.textures,p.depthTexture=e.depthTexture,p.width=e.width,p.height=e.height,p.renderTarget=h,p.depth=h.depthBuffer,p.stencil=h.stencilBuffer}else p.textures=null,p.depthTexture=null,p.width=this.domElement.width,p.height=this.domElement.height,p.depth=this.depth,p.stencil=this.stencil;p.width>>=c,p.height>>=c,p.activeCubeFace=d,p.activeMipmapLevel=c,p.occlusionQueryCount=_.occlusionQueryCount,this._background.update(u,_,p),this.backend.beginRender(p);const{bundles:v,lightsNode:N,transparentDoublePass:S,transparent:E,opaque:w}=_;return v.length>0&&this._renderBundles(v,u,N),!0===this.opaque&&w.length>0&&this._renderObjects(w,t,u,N),!0===this.transparent&&E.length>0&&this._renderTransparents(E,S,t,u,N),this.backend.finishRender(p),i.renderId=n,this._currentRenderContext=a,this._currentRenderObjectFunction=o,null!==s&&(this.setRenderTarget(l,d,c),this._renderOutput(h)),u.onAfterRender(this,e,t,h),p}_renderOutput(e){const t=this._quad;this._nodes.hasOutputChange(e.texture)&&(t.material.fragmentNode=this._nodes.getOutputNode(e.texture),t.material.needsUpdate=!0);const r=this.autoClear,s=this.xr.enabled;this.autoClear=!1,this.xr.enabled=!1,this._renderScene(t,t.camera,!1),this.autoClear=r,this.xr.enabled=s}getMaxAnisotropy(){return this.backend.getMaxAnisotropy()}getActiveCubeFace(){return this._activeCubeFace}getActiveMipmapLevel(){return this._activeMipmapLevel}async setAnimationLoop(e){!1===this._initialized&&await this.init(),this._animation.setAnimationLoop(e)}async getArrayBufferAsync(e){return await this.backend.getArrayBufferAsync(e)}getContext(){return this.backend.getContext()}getPixelRatio(){return this._pixelRatio}getDrawingBufferSize(e){return e.set(this._width*this._pixelRatio,this._height*this._pixelRatio).floor()}getSize(e){return e.set(this._width,this._height)}setPixelRatio(e=1){this._pixelRatio!==e&&(this._pixelRatio=e,this.setSize(this._width,this._height,!1))}setDrawingBufferSize(e,t,r){this.xr&&this.xr.isPresenting||(this._width=e,this._height=t,this._pixelRatio=r,this.domElement.width=Math.floor(e*r),this.domElement.height=Math.floor(t*r),this.setViewport(0,0,e,t),this._initialized&&this.backend.updateSize())}setSize(e,t,r=!0){this.xr&&this.xr.isPresenting||(this._width=e,this._height=t,this.domElement.width=Math.floor(e*this._pixelRatio),this.domElement.height=Math.floor(t*this._pixelRatio),!0===r&&(this.domElement.style.width=e+"px",this.domElement.style.height=t+"px"),this.setViewport(0,0,e,t),this._initialized&&this.backend.updateSize())}setOpaqueSort(e){this._opaqueSort=e}setTransparentSort(e){this._transparentSort=e}getScissor(e){const t=this._scissor;return e.x=t.x,e.y=t.y,e.width=t.width,e.height=t.height,e}setScissor(e,t,r,s){const i=this._scissor;e.isVector4?i.copy(e):i.set(e,t,r,s)}getScissorTest(){return this._scissorTest}setScissorTest(e){this._scissorTest=e,this.backend.setScissorTest(e)}getViewport(e){return e.copy(this._viewport)}setViewport(e,t,r,s,i=0,n=1){const a=this._viewport;e.isVector4?a.copy(e):a.set(e,t,r,s),a.minDepth=i,a.maxDepth=n}getClearColor(e){return e.copy(this._clearColor)}setClearColor(e,t=1){this._clearColor.set(e),this._clearColor.a=t}getClearAlpha(){return this._clearColor.a}setClearAlpha(e){this._clearColor.a=e}getClearDepth(){return this._clearDepth}setClearDepth(e){this._clearDepth=e}getClearStencil(){return this._clearStencil}setClearStencil(e){this._clearStencil=e}isOccluded(e){const t=this._currentRenderContext;return t&&this.backend.isOccluded(t,e)}clear(e=!0,t=!0,r=!0){if(!1===this._initialized)return console.warn("THREE.Renderer: .clear() called before the backend is initialized. Try using .clearAsync() instead."),this.clearAsync(e,t,r);const s=this._renderTarget||this._getFrameBufferTarget();let i=null;if(null!==s){this._textures.updateRenderTarget(s);const e=this._textures.get(s);i=this._renderContexts.getForClear(s),i.textures=e.textures,i.depthTexture=e.depthTexture,i.width=e.width,i.height=e.height,i.renderTarget=s,i.depth=s.depthBuffer,i.stencil=s.stencilBuffer,i.clearColorValue=this.backend.getClearColor(),i.activeCubeFace=this.getActiveCubeFace(),i.activeMipmapLevel=this.getActiveMipmapLevel()}this.backend.clear(e,t,r,i),null!==s&&null===this._renderTarget&&this._renderOutput(s)}clearColor(){return this.clear(!0,!1,!1)}clearDepth(){return this.clear(!1,!0,!1)}clearStencil(){return this.clear(!1,!1,!0)}async clearAsync(e=!0,t=!0,r=!0){!1===this._initialized&&await this.init(),this.clear(e,t,r)}async clearColorAsync(){this.clearAsync(!0,!1,!1)}async clearDepthAsync(){this.clearAsync(!1,!0,!1)}async clearStencilAsync(){this.clearAsync(!1,!1,!0)}get currentToneMapping(){return this.isOutputTarget?this.toneMapping:p}get currentColorSpace(){return this.isOutputTarget?this.outputColorSpace:de}get isOutputTarget(){return this._renderTarget===this._outputRenderTarget||null===this._renderTarget}dispose(){this.info.dispose(),this.backend.dispose(),this._animation.dispose(),this._objects.dispose(),this._pipelines.dispose(),this._nodes.dispose(),this._bindings.dispose(),this._renderLists.dispose(),this._renderContexts.dispose(),this._textures.dispose(),null!==this._frameBufferTarget&&this._frameBufferTarget.dispose(),Object.values(this.backend.timestampQueryPool).forEach((e=>{null!==e&&e.dispose()})),this.setRenderTarget(null),this.setAnimationLoop(null)}setRenderTarget(e,t=0,r=0){this._renderTarget=e,this._activeCubeFace=t,this._activeMipmapLevel=r}getRenderTarget(){return this._renderTarget}setOutputRenderTarget(e){this._outputRenderTarget=e}getOutputRenderTarget(){return this._outputRenderTarget}setRenderObjectFunction(e){this._renderObjectFunction=e}getRenderObjectFunction(){return this._renderObjectFunction}compute(e){if(!0===this._isDeviceLost)return;if(!1===this._initialized)return console.warn("THREE.Renderer: .compute() called before the backend is initialized. Try using .computeAsync() instead."),this.computeAsync(e);const t=this._nodes.nodeFrame,r=t.renderId;this.info.calls++,this.info.compute.calls++,this.info.compute.frameCalls++,t.renderId=this.info.calls;const s=this.backend,i=this._pipelines,n=this._bindings,a=this._nodes,o=Array.isArray(e)?e:[e];if(void 0===o[0]||!0!==o[0].isComputeNode)throw new Error("THREE.Renderer: .compute() expects a ComputeNode.");s.beginCompute(e);for(const t of o){if(!1===i.has(t)){const e=()=>{t.removeEventListener("dispose",e),i.delete(t),n.delete(t),a.delete(t)};t.addEventListener("dispose",e);const r=t.onInitFunction;null!==r&&r.call(t,{renderer:this})}a.updateForCompute(t),n.updateForCompute(t);const r=n.getForCompute(t),o=i.getForCompute(t,r);s.compute(e,t,r,o)}s.finishCompute(e),t.renderId=r}async computeAsync(e){!1===this._initialized&&await this.init(),this.compute(e)}async hasFeatureAsync(e){return!1===this._initialized&&await this.init(),this.backend.hasFeature(e)}async resolveTimestampsAsync(e="render"){return!1===this._initialized&&await this.init(),this.backend.resolveTimestampsAsync(e)}hasFeature(e){return!1===this._initialized?(console.warn("THREE.Renderer: .hasFeature() called before the backend is initialized. Try using .hasFeatureAsync() instead."),!1):this.backend.hasFeature(e)}hasInitialized(){return this._initialized}async initTextureAsync(e){!1===this._initialized&&await this.init(),this._textures.updateTexture(e)}initTexture(e){!1===this._initialized&&console.warn("THREE.Renderer: .initTexture() called before the backend is initialized. Try using .initTextureAsync() instead."),this._textures.updateTexture(e)}copyFramebufferToTexture(e,t=null){if(null!==t)if(t.isVector2)t=lv.set(t.x,t.y,e.image.width,e.image.height).floor();else{if(!t.isVector4)return void console.error("THREE.Renderer.copyFramebufferToTexture: Invalid rectangle.");t=lv.copy(t).floor()}else t=lv.set(0,0,e.image.width,e.image.height);let r,s=this._currentRenderContext;null!==s?r=s.renderTarget:(r=this._renderTarget||this._getFrameBufferTarget(),null!==r&&(this._textures.updateRenderTarget(r),s=this._textures.get(r))),this._textures.updateTexture(e,{renderTarget:r}),this.backend.copyFramebufferToTexture(e,s,t)}copyTextureToTexture(e,t,r=null,s=null,i=0,n=0){this._textures.updateTexture(e),this._textures.updateTexture(t),this.backend.copyTextureToTexture(e,t,r,s,i,n)}async readRenderTargetPixelsAsync(e,t,r,s,i,n=0,a=0){return this.backend.copyTextureToBuffer(e.textures[n],t,r,s,i,a)}_projectObject(e,t,r,s,i){if(!1===e.visible)return;if(e.layers.test(t.layers))if(e.isGroup)r=e.renderOrder,e.isClippingGroup&&e.enabled&&(i=i.getGroupContext(e));else if(e.isLOD)!0===e.autoUpdate&&e.update(t);else if(e.isLight)s.pushLight(e);else if(e.isSprite){if(!e.frustumCulled||ov.intersectsSprite(e)){!0===this.sortObjects&&lv.setFromMatrixPosition(e.matrixWorld).applyMatrix4(uv);const{geometry:t,material:n}=e;n.visible&&s.push(e,t,n,r,lv.z,null,i)}}else if(e.isLineLoop)console.error("THREE.Renderer: Objects of type THREE.LineLoop are not supported. Please use THREE.Line or THREE.LineSegments.");else if((e.isMesh||e.isLine||e.isPoints)&&(!e.frustumCulled||ov.intersectsObject(e))){const{geometry:t,material:n}=e;if(!0===this.sortObjects&&(null===t.boundingSphere&&t.computeBoundingSphere(),lv.copy(t.boundingSphere.center).applyMatrix4(e.matrixWorld).applyMatrix4(uv)),Array.isArray(n)){const a=t.groups;for(let o=0,u=a.length;o0){for(const{material:e}of t)e.side=N;this._renderObjects(t,r,s,i,"backSide");for(const{material:e}of t)e.side=je;this._renderObjects(e,r,s,i);for(const{material:e}of t)e.side=Se}else this._renderObjects(e,r,s,i)}_renderObjects(e,t,r,s,i=null){for(let n=0,a=e.length;n0,e.isShadowPassMaterial&&(e.side=null===i.shadowSide?i.side:i.shadowSide,i.depthNode&&i.depthNode.isNode&&(c=e.depthNode,e.depthNode=i.depthNode),i.castShadowNode&&i.castShadowNode.isNode&&(d=e.colorNode,e.colorNode=i.castShadowNode)),i=e}!0===i.transparent&&i.side===Se&&!1===i.forceSinglePass?(i.side=N,this._handleObjectFunction(e,i,t,r,a,n,o,"backSide"),i.side=je,this._handleObjectFunction(e,i,t,r,a,n,o,u),i.side=Se):this._handleObjectFunction(e,i,t,r,a,n,o,u),void 0!==l&&(t.overrideMaterial.positionNode=l),void 0!==c&&(t.overrideMaterial.depthNode=c),void 0!==d&&(t.overrideMaterial.colorNode=d),e.onAfterRender(this,t,r,s,i,n)}_renderObjectDirect(e,t,r,s,i,n,a,o){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,a,o);u.drawRange=e.geometry.drawRange,u.group=n;const l=this._nodes.needsRefresh(u);if(l&&(this._nodes.updateBefore(u),this._geometries.updateForRender(u),this._nodes.updateForRender(u),this._bindings.updateForRender(u)),this._pipelines.updateForRender(u),null!==this._currentRenderBundle){this.backend.get(this._currentRenderBundle).renderObjects.push(u),u.bundle=this._currentRenderBundle.bundleGroup}this.backend.draw(u,this.info),l&&this._nodes.updateAfter(u)}_createObjectPipeline(e,t,r,s,i,n,a,o){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,a,o);u.drawRange=e.geometry.drawRange,u.group=n,this._nodes.updateBefore(u),this._geometries.updateForRender(u),this._nodes.updateForRender(u),this._bindings.updateForRender(u),this._pipelines.getForRender(u,this._compilationPromises),this._nodes.updateAfter(u)}get compile(){return this.compileAsync}}class cv{constructor(e=""){this.name=e,this.visibility=0}setVisibility(e){this.visibility|=e}clone(){return Object.assign(new this.constructor,this)}}class hv extends cv{constructor(e,t=null){super(e),this.isBuffer=!0,this.bytesPerElement=Float32Array.BYTES_PER_ELEMENT,this._buffer=t}get byteLength(){return(e=this._buffer.byteLength)+(Gm-e%Gm)%Gm;var e}get buffer(){return this._buffer}update(){return!0}}class pv extends hv{constructor(e,t=null){super(e,t),this.isUniformBuffer=!0}}let gv=0;class mv extends pv{constructor(e,t){super("UniformBuffer_"+gv++,e?e.value:null),this.nodeUniform=e,this.groupNode=t}get buffer(){return this.nodeUniform.value}}class fv extends pv{constructor(e){super(e),this.isUniformsGroup=!0,this._values=null,this.uniforms=[]}addUniform(e){return this.uniforms.push(e),this}removeUniform(e){const t=this.uniforms.indexOf(e);return-1!==t&&this.uniforms.splice(t,1),this}get values(){return null===this._values&&(this._values=Array.from(this.buffer)),this._values}get buffer(){let e=this._buffer;if(null===e){const t=this.byteLength;e=new Float32Array(new ArrayBuffer(t)),this._buffer=e}return e}get byteLength(){let e=0;for(let t=0,r=this.uniforms.length;t0?s:"";t=`${e.name} {\n\t${r} ${i.name}[${n}];\n};\n`}else{t=`${this.getVectorType(i.type)} ${this.getPropertyName(i,e)};`,n=!0}const a=i.node.precision;if(null!==a&&(t=Ev[a]+" "+t),n){t="\t"+t;const e=i.groupNode.name;(s[e]||(s[e]=[])).push(t)}else t="uniform "+t,r.push(t)}let i="";for(const t in s){const r=s[t];i+=this._getGLSLUniformStruct(e+"_"+t,r.join("\n"))+"\n"}return i+=r.join("\n"),i}getTypeFromAttribute(e){let t=super.getTypeFromAttribute(e);if(/^[iu]/.test(t)&&e.gpuType!==T){let r=e;e.isInterleavedBufferAttribute&&(r=e.data);const s=r.array;!1==(s instanceof Uint32Array||s instanceof Int32Array)&&(t=t.slice(1))}return t}getAttributes(e){let t="";if("vertex"===e||"compute"===e){const e=this.getAttributesArray();let r=0;for(const s of e)t+=`layout( location = ${r++} ) in ${s.type} ${s.name};\n`}return t}getStructMembers(e){const t=[];for(const r of e.members)t.push(`\t${r.type} ${r.name};`);return t.join("\n")}getStructs(e){const t=[],r=this.structs[e],s=[];for(const e of r)if(e.output)for(const t of e.members)s.push(`layout( location = ${t.index} ) out ${t.type} ${t.name};`);else{let r="struct "+e.name+" {\n";r+=this.getStructMembers(e),r+="\n};\n",t.push(r)}return 0===s.length&&s.push("layout( location = 0 ) out vec4 fragColor;"),"\n"+s.join("\n")+"\n\n"+t.join("\n")}getVaryings(e){let t="";const r=this.varyings;if("vertex"===e||"compute"===e)for(const s of r){"compute"===e&&(s.needsInterpolation=!0);const r=this.getType(s.type);if(s.needsInterpolation){t+=`${r.includes("int")||r.includes("uv")||r.includes("iv")?"flat ":""}out ${r} ${s.name};\n`}else t+=`${r} ${s.name};\n`}else if("fragment"===e)for(const e of r)if(e.needsInterpolation){const r=this.getType(e.type);t+=`${r.includes("int")||r.includes("uv")||r.includes("iv")?"flat ":""}in ${r} ${e.name};\n`}for(const r of this.builtins[e])t+=`${r};\n`;return t}getVertexIndex(){return"uint( gl_VertexID )"}getInstanceIndex(){return"uint( gl_InstanceID )"}getInvocationLocalIndex(){return`uint( gl_InstanceID ) % ${this.object.workgroupSize.reduce(((e,t)=>e*t),1)}u`}getDrawIndex(){return this.renderer.backend.extensions.has("WEBGL_multi_draw")?"uint( gl_DrawID )":null}getFrontFacing(){return"gl_FrontFacing"}getFragCoord(){return"gl_FragCoord.xy"}getFragDepth(){return"gl_FragDepth"}enableExtension(e,t,r=this.shaderStage){const s=this.extensions[r]||(this.extensions[r]=new Map);!1===s.has(e)&&s.set(e,{name:e,behavior:t})}getExtensions(e){const t=[];if("vertex"===e){const t=this.renderer.backend.extensions;this.object.isBatchedMesh&&t.has("WEBGL_multi_draw")&&this.enableExtension("GL_ANGLE_multi_draw","require",e)}const r=this.extensions[e];if(void 0!==r)for(const{name:e,behavior:s}of r.values())t.push(`#extension ${e} : ${s}`);return t.join("\n")}getClipDistance(){return"gl_ClipDistance"}isAvailable(e){let t=wv[e];if(void 0===t){let r;switch(t=!1,e){case"float32Filterable":r="OES_texture_float_linear";break;case"clipDistance":r="WEBGL_clip_cull_distance"}if(void 0!==r){const e=this.renderer.backend.extensions;e.has(r)&&(e.get(r),t=!0)}wv[e]=t}return t}isFlipY(){return!0}enableHardwareClipping(e){this.enableExtension("GL_ANGLE_clip_cull_distance","require"),this.builtins.vertex.push(`out float gl_ClipDistance[ ${e} ]`)}registerTransform(e,t){this.transforms.push({varyingName:e,attributeNode:t})}getTransforms(){const e=this.transforms;let t="";for(let r=0;r0&&(r+="\n"),r+=`\t// flow -> ${n}\n\t`),r+=`${s.code}\n\t`,e===i&&"compute"!==t&&(r+="// result\n\t","vertex"===t?(r+="gl_Position = ",r+=`${s.result};`):"fragment"===t&&(e.outputNode.isOutputStructNode||(r+="fragColor = ",r+=`${s.result};`)))}const n=e[t];n.extensions=this.getExtensions(t),n.uniforms=this.getUniforms(t),n.attributes=this.getAttributes(t),n.varyings=this.getVaryings(t),n.vars=this.getVars(t),n.structs=this.getStructs(t),n.codes=this.getCodes(t),n.transforms=this.getTransforms(t),n.flow=r}null!==this.material?(this.vertexShader=this._getGLSLVertexCode(e.vertex),this.fragmentShader=this._getGLSLFragmentCode(e.fragment)):this.computeShader=this._getGLSLVertexCode(e.compute)}getUniformFromNode(e,t,r,s=null){const i=super.getUniformFromNode(e,t,r,s),n=this.getDataFromNode(e,r,this.globalCache);let a=n.uniformGPU;if(void 0===a){const s=e.groupNode,o=s.name,u=this.getBindGroupArray(o,r);if("texture"===t)a=new _v(i.name,i.node,s),u.push(a);else if("cubeTexture"===t)a=new vv(i.name,i.node,s),u.push(a);else if("texture3D"===t)a=new Nv(i.name,i.node,s),u.push(a);else if("buffer"===t){e.name=`NodeBuffer_${e.id}`,i.name=`buffer${e.id}`;const t=new mv(e,s);t.name=e.name,u.push(t),a=t}else{const e=this.uniformGroups[r]||(this.uniformGroups[r]={});let n=e[o];void 0===n&&(n=new xv(r+"_"+o,s),e[o]=n,u.push(n)),a=this.getNodeUniform(i,t),n.addUniform(a)}n.uniformGPU=a}return i}}let Cv=null,Mv=null;class Pv{constructor(e={}){this.parameters=Object.assign({},e),this.data=new WeakMap,this.renderer=null,this.domElement=null,this.timestampQueryPool={render:null,compute:null},this.trackTimestamp=!0===e.trackTimestamp}async init(e){this.renderer=e}get coordinateSystem(){}beginRender(){}finishRender(){}beginCompute(){}finishCompute(){}draw(){}compute(){}createProgram(){}destroyProgram(){}createBindings(){}updateBindings(){}updateBinding(){}createRenderPipeline(){}createComputePipeline(){}needsRenderUpdate(){}getRenderCacheKey(){}createNodeBuilder(){}createSampler(){}destroySampler(){}createDefaultTexture(){}createTexture(){}updateTexture(){}generateMipmaps(){}destroyTexture(){}async copyTextureToBuffer(){}copyTextureToTexture(){}copyFramebufferToTexture(){}createAttribute(){}createIndexAttribute(){}createStorageAttribute(){}updateAttribute(){}destroyAttribute(){}getContext(){}updateSize(){}updateViewport(){}isOccluded(){}async resolveTimestampsAsync(e="render"){if(!this.trackTimestamp)return void ht("WebGPURenderer: Timestamp tracking is disabled.");const t=this.timestampQueryPool[e];if(!t)return void ht(`WebGPURenderer: No timestamp query pool for type '${e}' found.`);const r=await t.resolveQueriesAsync();return this.renderer.info[e].timestamp=r,r}async waitForGPU(){}async getArrayBufferAsync(){}async hasFeatureAsync(){}hasFeature(){}getMaxAnisotropy(){}getDrawingBufferSize(){return Cv=Cv||new t,this.renderer.getDrawingBufferSize(Cv)}setScissorTest(){}getClearColor(){const e=this.renderer;return Mv=Mv||new mf,e.getClearColor(Mv),Mv.getRGB(Mv),Mv}getDomElement(){let e=this.domElement;return null===e&&(e=void 0!==this.parameters.canvas?this.parameters.canvas:pt(),"setAttribute"in e&&e.setAttribute("data-engine",`three.js r${$e} webgpu`),this.domElement=e),e}set(e,t){this.data.set(e,t)}get(e){let t=this.data.get(e);return void 0===t&&(t={},this.data.set(e,t)),t}has(e){return this.data.has(e)}delete(e){this.data.delete(e)}dispose(){}}let Lv,Fv,Bv=0;class Iv{constructor(e,t){this.buffers=[e.bufferGPU,t],this.type=e.type,this.bufferType=e.bufferType,this.pbo=e.pbo,this.byteLength=e.byteLength,this.bytesPerElement=e.BYTES_PER_ELEMENT,this.version=e.version,this.isInteger=e.isInteger,this.activeBufferIndex=0,this.baseId=e.id}get id(){return`${this.baseId}|${this.activeBufferIndex}`}get bufferGPU(){return this.buffers[this.activeBufferIndex]}get transformBuffer(){return this.buffers[1^this.activeBufferIndex]}switchBuffers(){this.activeBufferIndex^=1}}class Dv{constructor(e){this.backend=e}createAttribute(e,t){const r=this.backend,{gl:s}=r,i=e.array,n=e.usage||s.STATIC_DRAW,a=e.isInterleavedBufferAttribute?e.data:e,o=r.get(a);let u,l=o.bufferGPU;if(void 0===l&&(l=this._createBuffer(s,t,i,n),o.bufferGPU=l,o.bufferType=t,o.version=a.version),i instanceof Float32Array)u=s.FLOAT;else if(i instanceof Uint16Array)u=e.isFloat16BufferAttribute?s.HALF_FLOAT:s.UNSIGNED_SHORT;else if(i instanceof Int16Array)u=s.SHORT;else if(i instanceof Uint32Array)u=s.UNSIGNED_INT;else if(i instanceof Int32Array)u=s.INT;else if(i instanceof Int8Array)u=s.BYTE;else if(i instanceof Uint8Array)u=s.UNSIGNED_BYTE;else{if(!(i instanceof Uint8ClampedArray))throw new Error("THREE.WebGLBackend: Unsupported buffer data format: "+i);u=s.UNSIGNED_BYTE}let d={bufferGPU:l,bufferType:t,type:u,byteLength:i.byteLength,bytesPerElement:i.BYTES_PER_ELEMENT,version:e.version,pbo:e.pbo,isInteger:u===s.INT||u===s.UNSIGNED_INT||e.gpuType===T,id:Bv++};if(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute){const e=this._createBuffer(s,t,i,n);d=new Iv(d,e)}r.set(e,d)}updateAttribute(e){const t=this.backend,{gl:r}=t,s=e.array,i=e.isInterleavedBufferAttribute?e.data:e,n=t.get(i),a=n.bufferType,o=e.isInterleavedBufferAttribute?e.data.updateRanges:e.updateRanges;if(r.bindBuffer(a,n.bufferGPU),0===o.length)r.bufferSubData(a,0,s);else{for(let e=0,t=o.length;e1?this.enable(s.SAMPLE_ALPHA_TO_COVERAGE):this.disable(s.SAMPLE_ALPHA_TO_COVERAGE),r>0&&this.currentClippingPlanes!==r){const e=12288;for(let t=0;t<8;t++)t{!function i(){const n=e.clientWaitSync(t,e.SYNC_FLUSH_COMMANDS_BIT,0);if(n===e.WAIT_FAILED)return e.deleteSync(t),void s();n!==e.TIMEOUT_EXPIRED?(e.deleteSync(t),r()):requestAnimationFrame(i)}()}))}}let Ov,Gv,kv,zv=!1;class $v{constructor(e){this.backend=e,this.gl=e.gl,this.extensions=e.extensions,this.defaultTextures={},!1===zv&&(this._init(),zv=!0)}_init(){const e=this.gl;Ov={[Sr]:e.REPEAT,[Nr]:e.CLAMP_TO_EDGE,[vr]:e.MIRRORED_REPEAT},Gv={[_]:e.NEAREST,[Er]:e.NEAREST_MIPMAP_NEAREST,[ke]:e.NEAREST_MIPMAP_LINEAR,[q]:e.LINEAR,[Ge]:e.LINEAR_MIPMAP_NEAREST,[B]:e.LINEAR_MIPMAP_LINEAR},kv={[Lr]:e.NEVER,[Pr]:e.ALWAYS,[Ie]:e.LESS,[Mr]:e.LEQUAL,[Cr]:e.EQUAL,[Rr]:e.GEQUAL,[Ar]:e.GREATER,[wr]:e.NOTEQUAL}}getGLTextureType(e){const{gl:t}=this;let r;return r=!0===e.isCubeTexture?t.TEXTURE_CUBE_MAP:!0===e.isDataArrayTexture||!0===e.isCompressedArrayTexture?t.TEXTURE_2D_ARRAY:!0===e.isData3DTexture?t.TEXTURE_3D:t.TEXTURE_2D,r}getInternalFormat(e,t,r,s,i=!1){const{gl:n,extensions:a}=this;if(null!==e){if(void 0!==n[e])return n[e];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+e+"'")}let o=t;return t===n.RED&&(r===n.FLOAT&&(o=n.R32F),r===n.HALF_FLOAT&&(o=n.R16F),r===n.UNSIGNED_BYTE&&(o=n.R8),r===n.UNSIGNED_SHORT&&(o=n.R16),r===n.UNSIGNED_INT&&(o=n.R32UI),r===n.BYTE&&(o=n.R8I),r===n.SHORT&&(o=n.R16I),r===n.INT&&(o=n.R32I)),t===n.RED_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.R8UI),r===n.UNSIGNED_SHORT&&(o=n.R16UI),r===n.UNSIGNED_INT&&(o=n.R32UI),r===n.BYTE&&(o=n.R8I),r===n.SHORT&&(o=n.R16I),r===n.INT&&(o=n.R32I)),t===n.RG&&(r===n.FLOAT&&(o=n.RG32F),r===n.HALF_FLOAT&&(o=n.RG16F),r===n.UNSIGNED_BYTE&&(o=n.RG8),r===n.UNSIGNED_SHORT&&(o=n.RG16),r===n.UNSIGNED_INT&&(o=n.RG32UI),r===n.BYTE&&(o=n.RG8I),r===n.SHORT&&(o=n.RG16I),r===n.INT&&(o=n.RG32I)),t===n.RG_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RG8UI),r===n.UNSIGNED_SHORT&&(o=n.RG16UI),r===n.UNSIGNED_INT&&(o=n.RG32UI),r===n.BYTE&&(o=n.RG8I),r===n.SHORT&&(o=n.RG16I),r===n.INT&&(o=n.RG32I)),t===n.RGB&&(r===n.FLOAT&&(o=n.RGB32F),r===n.HALF_FLOAT&&(o=n.RGB16F),r===n.UNSIGNED_BYTE&&(o=n.RGB8),r===n.UNSIGNED_SHORT&&(o=n.RGB16),r===n.UNSIGNED_INT&&(o=n.RGB32UI),r===n.BYTE&&(o=n.RGB8I),r===n.SHORT&&(o=n.RGB16I),r===n.INT&&(o=n.RGB32I),r===n.UNSIGNED_BYTE&&(o=s===z&&!1===i?n.SRGB8:n.RGB8),r===n.UNSIGNED_SHORT_5_6_5&&(o=n.RGB565),r===n.UNSIGNED_SHORT_5_5_5_1&&(o=n.RGB5_A1),r===n.UNSIGNED_SHORT_4_4_4_4&&(o=n.RGB4),r===n.UNSIGNED_INT_5_9_9_9_REV&&(o=n.RGB9_E5)),t===n.RGB_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RGB8UI),r===n.UNSIGNED_SHORT&&(o=n.RGB16UI),r===n.UNSIGNED_INT&&(o=n.RGB32UI),r===n.BYTE&&(o=n.RGB8I),r===n.SHORT&&(o=n.RGB16I),r===n.INT&&(o=n.RGB32I)),t===n.RGBA&&(r===n.FLOAT&&(o=n.RGBA32F),r===n.HALF_FLOAT&&(o=n.RGBA16F),r===n.UNSIGNED_BYTE&&(o=n.RGBA8),r===n.UNSIGNED_SHORT&&(o=n.RGBA16),r===n.UNSIGNED_INT&&(o=n.RGBA32UI),r===n.BYTE&&(o=n.RGBA8I),r===n.SHORT&&(o=n.RGBA16I),r===n.INT&&(o=n.RGBA32I),r===n.UNSIGNED_BYTE&&(o=s===z&&!1===i?n.SRGB8_ALPHA8:n.RGBA8),r===n.UNSIGNED_SHORT_4_4_4_4&&(o=n.RGBA4),r===n.UNSIGNED_SHORT_5_5_5_1&&(o=n.RGB5_A1)),t===n.RGBA_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RGBA8UI),r===n.UNSIGNED_SHORT&&(o=n.RGBA16UI),r===n.UNSIGNED_INT&&(o=n.RGBA32UI),r===n.BYTE&&(o=n.RGBA8I),r===n.SHORT&&(o=n.RGBA16I),r===n.INT&&(o=n.RGBA32I)),t===n.DEPTH_COMPONENT&&(r===n.UNSIGNED_SHORT&&(o=n.DEPTH_COMPONENT16),r===n.UNSIGNED_INT&&(o=n.DEPTH_COMPONENT24),r===n.FLOAT&&(o=n.DEPTH_COMPONENT32F)),t===n.DEPTH_STENCIL&&r===n.UNSIGNED_INT_24_8&&(o=n.DEPTH24_STENCIL8),o!==n.R16F&&o!==n.R32F&&o!==n.RG16F&&o!==n.RG32F&&o!==n.RGBA16F&&o!==n.RGBA32F||a.get("EXT_color_buffer_float"),o}setTextureParameters(e,t){const{gl:r,extensions:s,backend:i}=this;r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,t.flipY),r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,t.premultiplyAlpha),r.pixelStorei(r.UNPACK_ALIGNMENT,t.unpackAlignment),r.pixelStorei(r.UNPACK_COLORSPACE_CONVERSION_WEBGL,r.NONE),r.texParameteri(e,r.TEXTURE_WRAP_S,Ov[t.wrapS]),r.texParameteri(e,r.TEXTURE_WRAP_T,Ov[t.wrapT]),e!==r.TEXTURE_3D&&e!==r.TEXTURE_2D_ARRAY||r.texParameteri(e,r.TEXTURE_WRAP_R,Ov[t.wrapR]),r.texParameteri(e,r.TEXTURE_MAG_FILTER,Gv[t.magFilter]);const n=void 0!==t.mipmaps&&t.mipmaps.length>0,a=t.minFilter===q&&n?B:t.minFilter;if(r.texParameteri(e,r.TEXTURE_MIN_FILTER,Gv[a]),t.compareFunction&&(r.texParameteri(e,r.TEXTURE_COMPARE_MODE,r.COMPARE_REF_TO_TEXTURE),r.texParameteri(e,r.TEXTURE_COMPARE_FUNC,kv[t.compareFunction])),!0===s.has("EXT_texture_filter_anisotropic")){if(t.magFilter===_)return;if(t.minFilter!==ke&&t.minFilter!==B)return;if(t.type===L&&!1===s.has("OES_texture_float_linear"))return;if(t.anisotropy>1){const n=s.get("EXT_texture_filter_anisotropic");r.texParameterf(e,n.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(t.anisotropy,i.getMaxAnisotropy()))}}}createDefaultTexture(e){const{gl:t,backend:r,defaultTextures:s}=this,i=this.getGLTextureType(e);let n=s[i];void 0===n&&(n=t.createTexture(),r.state.bindTexture(i,n),t.texParameteri(i,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(i,t.TEXTURE_MAG_FILTER,t.NEAREST),s[i]=n),r.set(e,{textureGPU:n,glTextureType:i,isDefault:!0})}createTexture(e,t){const{gl:r,backend:s}=this,{levels:i,width:n,height:a,depth:o}=t,u=s.utils.convert(e.format,e.colorSpace),l=s.utils.convert(e.type),d=this.getInternalFormat(e.internalFormat,u,l,e.colorSpace,e.isVideoTexture),c=r.createTexture(),h=this.getGLTextureType(e);s.state.bindTexture(h,c),this.setTextureParameters(h,e),e.isDataArrayTexture||e.isCompressedArrayTexture?r.texStorage3D(r.TEXTURE_2D_ARRAY,i,d,n,a,o):e.isData3DTexture?r.texStorage3D(r.TEXTURE_3D,i,d,n,a,o):e.isVideoTexture||r.texStorage2D(h,i,d,n,a),s.set(e,{textureGPU:c,glTextureType:h,glFormat:u,glType:l,glInternalFormat:d})}copyBufferToTexture(e,t){const{gl:r,backend:s}=this,{textureGPU:i,glTextureType:n,glFormat:a,glType:o}=s.get(t),{width:u,height:l}=t.source.data;r.bindBuffer(r.PIXEL_UNPACK_BUFFER,e),s.state.bindTexture(n,i),r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,!1),r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1),r.texSubImage2D(n,0,0,0,u,l,a,o,0),r.bindBuffer(r.PIXEL_UNPACK_BUFFER,null),s.state.unbindTexture()}updateTexture(e,t){const{gl:r}=this,{width:s,height:i}=t,{textureGPU:n,glTextureType:a,glFormat:o,glType:u,glInternalFormat:l}=this.backend.get(e);if(e.isRenderTargetTexture||void 0===n)return;const d=e=>e.isDataTexture?e.image.data:"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap||e instanceof OffscreenCanvas?e:e.data;if(this.backend.state.bindTexture(a,n),this.setTextureParameters(a,e),e.isCompressedTexture){const s=e.mipmaps,i=t.image;for(let t=0;t0,c=t.renderTarget?t.renderTarget.height:this.backend.getDrawingBufferSize().y;if(d){const r=0!==a||0!==o;let d,h;if(!0===e.isDepthTexture?(d=s.DEPTH_BUFFER_BIT,h=s.DEPTH_ATTACHMENT,t.stencil&&(d|=s.STENCIL_BUFFER_BIT)):(d=s.COLOR_BUFFER_BIT,h=s.COLOR_ATTACHMENT0),r){const e=this.backend.get(t.renderTarget),r=e.framebuffers[t.getCacheKey()],h=e.msaaFrameBuffer;i.bindFramebuffer(s.DRAW_FRAMEBUFFER,r),i.bindFramebuffer(s.READ_FRAMEBUFFER,h);const p=c-o-l;s.blitFramebuffer(a,p,a+u,p+l,a,p,a+u,p+l,d,s.NEAREST),i.bindFramebuffer(s.READ_FRAMEBUFFER,r),i.bindTexture(s.TEXTURE_2D,n),s.copyTexSubImage2D(s.TEXTURE_2D,0,0,0,a,p,u,l),i.unbindTexture()}else{const e=s.createFramebuffer();i.bindFramebuffer(s.DRAW_FRAMEBUFFER,e),s.framebufferTexture2D(s.DRAW_FRAMEBUFFER,h,s.TEXTURE_2D,n,0),s.blitFramebuffer(0,0,u,l,0,0,u,l,d,s.NEAREST),s.deleteFramebuffer(e)}}else i.bindTexture(s.TEXTURE_2D,n),s.copyTexSubImage2D(s.TEXTURE_2D,0,0,0,a,c-l-o,u,l),i.unbindTexture();e.generateMipmaps&&this.generateMipmaps(e),this.backend._setFramebuffer(t)}setupRenderBufferStorage(e,t,r,s=!1){const{gl:i}=this,n=t.renderTarget,{depthTexture:a,depthBuffer:o,stencilBuffer:u,width:l,height:d}=n;if(i.bindRenderbuffer(i.RENDERBUFFER,e),o&&!u){let t=i.DEPTH_COMPONENT24;if(!0===s){this.extensions.get("WEBGL_multisampled_render_to_texture").renderbufferStorageMultisampleEXT(i.RENDERBUFFER,n.samples,t,l,d)}else r>0?(a&&a.isDepthTexture&&a.type===i.FLOAT&&(t=i.DEPTH_COMPONENT32F),i.renderbufferStorageMultisample(i.RENDERBUFFER,r,t,l,d)):i.renderbufferStorage(i.RENDERBUFFER,t,l,d);i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_ATTACHMENT,i.RENDERBUFFER,e)}else o&&u&&(r>0?i.renderbufferStorageMultisample(i.RENDERBUFFER,r,i.DEPTH24_STENCIL8,l,d):i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_STENCIL,l,d),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_STENCIL_ATTACHMENT,i.RENDERBUFFER,e))}async copyTextureToBuffer(e,t,r,s,i,n){const{backend:a,gl:o}=this,{textureGPU:u,glFormat:l,glType:d}=this.backend.get(e),c=o.createFramebuffer();o.bindFramebuffer(o.READ_FRAMEBUFFER,c);const h=e.isCubeTexture?o.TEXTURE_CUBE_MAP_POSITIVE_X+n:o.TEXTURE_2D;o.framebufferTexture2D(o.READ_FRAMEBUFFER,o.COLOR_ATTACHMENT0,h,u,0);const p=this._getTypedArrayType(d),g=s*i*this._getBytesPerTexel(d,l),m=o.createBuffer();o.bindBuffer(o.PIXEL_PACK_BUFFER,m),o.bufferData(o.PIXEL_PACK_BUFFER,g,o.STREAM_READ),o.readPixels(t,r,s,i,l,d,0),o.bindBuffer(o.PIXEL_PACK_BUFFER,null),await a.utils._clientWaitAsync();const f=new p(g/p.BYTES_PER_ELEMENT);return o.bindBuffer(o.PIXEL_PACK_BUFFER,m),o.getBufferSubData(o.PIXEL_PACK_BUFFER,0,f),o.bindBuffer(o.PIXEL_PACK_BUFFER,null),o.deleteFramebuffer(c),f}_getTypedArrayType(e){const{gl:t}=this;if(e===t.UNSIGNED_BYTE)return Uint8Array;if(e===t.UNSIGNED_SHORT_4_4_4_4)return Uint16Array;if(e===t.UNSIGNED_SHORT_5_5_5_1)return Uint16Array;if(e===t.UNSIGNED_SHORT_5_6_5)return Uint16Array;if(e===t.UNSIGNED_SHORT)return Uint16Array;if(e===t.UNSIGNED_INT)return Uint32Array;if(e===t.HALF_FLOAT)return Uint16Array;if(e===t.FLOAT)return Float32Array;throw new Error(`Unsupported WebGL type: ${e}`)}_getBytesPerTexel(e,t){const{gl:r}=this;let s=0;return e===r.UNSIGNED_BYTE&&(s=1),e!==r.UNSIGNED_SHORT_4_4_4_4&&e!==r.UNSIGNED_SHORT_5_5_5_1&&e!==r.UNSIGNED_SHORT_5_6_5&&e!==r.UNSIGNED_SHORT&&e!==r.HALF_FLOAT||(s=2),e!==r.UNSIGNED_INT&&e!==r.FLOAT||(s=4),t===r.RGBA?4*s:t===r.RGB?3*s:t===r.ALPHA?s:void 0}}class Hv{constructor(e){this.backend=e,this.gl=this.backend.gl,this.availableExtensions=this.gl.getSupportedExtensions(),this.extensions={}}get(e){let t=this.extensions[e];return void 0===t&&(t=this.gl.getExtension(e),this.extensions[e]=t),t}has(e){return this.availableExtensions.includes(e)}}class Wv{constructor(e){this.backend=e,this.maxAnisotropy=null}getMaxAnisotropy(){if(null!==this.maxAnisotropy)return this.maxAnisotropy;const e=this.backend.gl,t=this.backend.extensions;if(!0===t.has("EXT_texture_filter_anisotropic")){const r=t.get("EXT_texture_filter_anisotropic");this.maxAnisotropy=e.getParameter(r.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else this.maxAnisotropy=0;return this.maxAnisotropy}}const jv={WEBGL_multi_draw:"WEBGL_multi_draw",WEBGL_compressed_texture_astc:"texture-compression-astc",WEBGL_compressed_texture_etc:"texture-compression-etc2",WEBGL_compressed_texture_etc1:"texture-compression-etc1",WEBGL_compressed_texture_pvrtc:"texture-compression-pvrtc",WEBKIT_WEBGL_compressed_texture_pvrtc:"texture-compression-pvrtc",WEBGL_compressed_texture_s3tc:"texture-compression-bc",EXT_texture_compression_bptc:"texture-compression-bptc",EXT_disjoint_timer_query_webgl2:"timestamp-query"};class qv{constructor(e){this.gl=e.gl,this.extensions=e.extensions,this.info=e.renderer.info,this.mode=null,this.index=0,this.type=null,this.object=null}render(e,t){const{gl:r,mode:s,object:i,type:n,info:a,index:o}=this;0!==o?r.drawElements(s,t,n,e):r.drawArrays(s,e,t),a.update(i,t,1)}renderInstances(e,t,r){const{gl:s,mode:i,type:n,index:a,object:o,info:u}=this;0!==r&&(0!==a?s.drawElementsInstanced(i,t,n,e,r):s.drawArraysInstanced(i,e,t,r),u.update(o,t,r))}renderMultiDraw(e,t,r){const{extensions:s,mode:i,object:n,info:a}=this;if(0===r)return;const o=s.get("WEBGL_multi_draw");if(null===o)for(let s=0;sthis.maxQueries)return ht(`WebGPUTimestampQueryPool [${this.type}]: Maximum number of queries exceeded, when using trackTimestamp it is necessary to resolves the queries via renderer.resolveTimestampsAsync( THREE.TimestampQuery.${this.type.toUpperCase()} ).`),null;const t=this.currentQueryIndex;return this.currentQueryIndex+=2,this.queryStates.set(t,"inactive"),this.queryOffsets.set(e.id,t),t}beginQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e.id);if(null==t)return;if(null!==this.activeQuery)return;const r=this.queries[t];if(r)try{"inactive"===this.queryStates.get(t)&&(this.gl.beginQuery(this.ext.TIME_ELAPSED_EXT,r),this.activeQuery=t,this.queryStates.set(t,"started"))}catch(e){console.error("Error in beginQuery:",e),this.activeQuery=null,this.queryStates.set(t,"inactive")}}endQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e.id);if(null!=t&&this.activeQuery===t)try{this.gl.endQuery(this.ext.TIME_ELAPSED_EXT),this.queryStates.set(t,"ended"),this.activeQuery=null}catch(e){console.error("Error in endQuery:",e),this.queryStates.set(t,"inactive"),this.activeQuery=null}}async resolveQueriesAsync(){if(!this.trackTimestamp||this.pendingResolve)return this.lastValue;this.pendingResolve=!0;try{const e=[];for(const[t,r]of this.queryStates)if("ended"===r){const r=this.queries[t];e.push(this.resolveQuery(r))}if(0===e.length)return this.lastValue;const t=(await Promise.all(e)).reduce(((e,t)=>e+t),0);return this.lastValue=t,this.currentQueryIndex=0,this.queryOffsets.clear(),this.queryStates.clear(),this.activeQuery=null,t}catch(e){return console.error("Error resolving queries:",e),this.lastValue}finally{this.pendingResolve=!1}}async resolveQuery(e){return new Promise((t=>{if(this.isDisposed)return void t(this.lastValue);let r,s=!1;const i=e=>{s||(s=!0,r&&(clearTimeout(r),r=null),t(e))},n=()=>{if(this.isDisposed)i(this.lastValue);else try{if(this.gl.getParameter(this.ext.GPU_DISJOINT_EXT))return void i(this.lastValue);if(!this.gl.getQueryParameter(e,this.gl.QUERY_RESULT_AVAILABLE))return void(r=setTimeout(n,1));const s=this.gl.getQueryParameter(e,this.gl.QUERY_RESULT);t(Number(s)/1e6)}catch(e){console.error("Error checking query:",e),t(this.lastValue)}};n()}))}dispose(){if(!this.isDisposed&&(this.isDisposed=!0,this.trackTimestamp)){for(const e of this.queries)this.gl.deleteQuery(e);this.queries=[],this.queryStates.clear(),this.queryOffsets.clear(),this.lastValue=0,this.activeQuery=null}}}class Yv extends Pv{constructor(e={}){super(e),this.isWebGLBackend=!0,this.attributeUtils=null,this.extensions=null,this.capabilities=null,this.textureUtils=null,this.bufferRenderer=null,this.gl=null,this.state=null,this.utils=null,this.vaoCache={},this.transformFeedbackCache={},this.discard=!1,this.disjoint=null,this.parallel=null,this._currentContext=null,this._knownBindings=new WeakSet,this._supportsInvalidateFramebuffer="undefined"!=typeof navigator&&/OculusBrowser/g.test(navigator.userAgent),this._xrFramebuffer=null}init(e){super.init(e);const t=this.parameters,r={antialias:e.samples>0,alpha:!0,depth:e.depth,stencil:e.stencil},s=void 0!==t.context?t.context:e.domElement.getContext("webgl2",r);function i(t){t.preventDefault();const r={api:"WebGL",message:t.statusMessage||"Unknown reason",reason:null,originalEvent:t};e.onDeviceLost(r)}this._onContextLost=i,e.domElement.addEventListener("webglcontextlost",i,!1),this.gl=s,this.extensions=new Hv(this),this.capabilities=new Wv(this),this.attributeUtils=new Dv(this),this.textureUtils=new $v(this),this.bufferRenderer=new qv(this),this.state=new Vv(this),this.utils=new Uv(this),this.extensions.get("EXT_color_buffer_float"),this.extensions.get("WEBGL_clip_cull_distance"),this.extensions.get("OES_texture_float_linear"),this.extensions.get("EXT_color_buffer_half_float"),this.extensions.get("WEBGL_multisampled_render_to_texture"),this.extensions.get("WEBGL_render_shared_exponent"),this.extensions.get("WEBGL_multi_draw"),this.disjoint=this.extensions.get("EXT_disjoint_timer_query_webgl2"),this.parallel=this.extensions.get("KHR_parallel_shader_compile")}get coordinateSystem(){return l}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}async waitForGPU(){await this.utils._clientWaitAsync()}async makeXRCompatible(){!0!==this.gl.getContextAttributes().xrCompatible&&await this.gl.makeXRCompatible()}setXRTarget(e){this._xrFramebuffer=e}setXRRenderTargetTextures(e,t,r=null){const s=this.gl;if(this.set(e.texture,{textureGPU:t,glInternalFormat:s.RGBA8}),null!==r){const t=e.stencilBuffer?s.DEPTH24_STENCIL8:s.DEPTH_COMPONENT24;this.set(e.depthTexture,{textureGPU:r,glInternalFormat:t}),!0===this.extensions.has("WEBGL_multisampled_render_to_texture")&&e.autoAllocateDepthBuffer&&console.warn("THREE.WebGLBackend: Render-to-texture extension was disabled because an external texture was provided"),e.autoAllocateDepthBuffer=!1}}initTimestampQuery(e){if(!this.disjoint||!this.trackTimestamp)return;const t=e.isComputeNode?"compute":"render";this.timestampQueryPool[t]||(this.timestampQueryPool[t]=new Kv(this.gl,t,2048));const r=this.timestampQueryPool[t];null!==r.allocateQueriesForContext(e)&&r.beginQuery(e)}prepareTimestampBuffer(e){if(!this.disjoint||!this.trackTimestamp)return;const t=e.isComputeNode?"compute":"render";this.timestampQueryPool[t].endQuery(e)}getContext(){return this.gl}beginRender(e){const{state:t,gl:r}=this,s=this.get(e);if(e.viewport?this.updateViewport(e):t.viewport(0,0,r.drawingBufferWidth,r.drawingBufferHeight),e.scissor){const{x:r,y:s,width:i,height:n}=e.scissorValue;t.scissor(r,e.height-n-s,i,n)}this.initTimestampQuery(e),s.previousContext=this._currentContext,this._currentContext=e,this._setFramebuffer(e),this.clear(e.clearColor,e.clearDepth,e.clearStencil,e,!1);const i=e.occlusionQueryCount;i>0&&(s.currentOcclusionQueries=s.occlusionQueries,s.currentOcclusionQueryObjects=s.occlusionQueryObjects,s.lastOcclusionObject=null,s.occlusionQueries=new Array(i),s.occlusionQueryObjects=new Array(i),s.occlusionQueryIndex=0)}finishRender(e){const{gl:t,state:r}=this,s=this.get(e),i=s.previousContext;r.resetVertexState();const n=e.occlusionQueryCount;n>0&&(n>s.occlusionQueryIndex&&t.endQuery(t.ANY_SAMPLES_PASSED),this.resolveOccludedAsync(e));const a=e.textures;if(null!==a)for(let e=0;e0&&!1===this._useMultisampledRTT(e.renderTarget)){const i=s.framebuffers[e.getCacheKey()],n=t.COLOR_BUFFER_BIT,a=s.msaaFrameBuffer,o=e.textures;r.bindFramebuffer(t.READ_FRAMEBUFFER,a),r.bindFramebuffer(t.DRAW_FRAMEBUFFER,i);for(let r=0;r{let a=0;for(let t=0;t{t.isBatchedMesh?null!==t._multiDrawInstances?(ht("THREE.WebGLBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection."),y.renderMultiDrawInstances(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount,t._multiDrawInstances)):this.hasFeature("WEBGL_multi_draw")?y.renderMultiDraw(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount):ht("THREE.WebGLRenderer: WEBGL_multi_draw not supported."):b>1?y.renderInstances(T,x,b):y.render(T,x)};if(e.camera.isArrayCamera&&e.camera.cameras.length>0){const r=this.get(e.camera),s=e.camera.cameras,i=e.getBindingGroup("cameraIndex").bindings[0];if(void 0===r.indexesGPU||r.indexesGPU.length!==s.length){const e=new Uint32Array([0,0,0,0]),t=[];for(let r=0,i=s.length;r{const i=this.parallel,n=()=>{r.getProgramParameter(a,i.COMPLETION_STATUS_KHR)?(this._completeCompile(e,s),t()):requestAnimationFrame(n)};n()}));t.push(i)}else this._completeCompile(e,s)}_handleSource(e,t){const r=e.split("\n"),s=[],i=Math.max(t-6,0),n=Math.min(t+6,r.length);for(let e=i;e":" "} ${i}: ${r[e]}`)}return s.join("\n")}_getShaderErrors(e,t,r){const s=e.getShaderParameter(t,e.COMPILE_STATUS),i=e.getShaderInfoLog(t).trim();if(s&&""===i)return"";const n=/ERROR: 0:(\d+)/.exec(i);if(n){const s=parseInt(n[1]);return r.toUpperCase()+"\n\n"+i+"\n\n"+this._handleSource(e.getShaderSource(t),s)}return i}_logProgramError(e,t,r){if(this.renderer.debug.checkShaderErrors){const s=this.gl,i=s.getProgramInfoLog(e).trim();if(!1===s.getProgramParameter(e,s.LINK_STATUS))if("function"==typeof this.renderer.debug.onShaderError)this.renderer.debug.onShaderError(s,e,r,t);else{const n=this._getShaderErrors(s,r,"vertex"),a=this._getShaderErrors(s,t,"fragment");console.error("THREE.WebGLProgram: Shader Error "+s.getError()+" - VALIDATE_STATUS "+s.getProgramParameter(e,s.VALIDATE_STATUS)+"\n\nProgram Info Log: "+i+"\n"+n+"\n"+a)}else""!==i&&console.warn("THREE.WebGLProgram: Program Info Log:",i)}}_completeCompile(e,t){const{state:r,gl:s}=this,i=this.get(t),{programGPU:n,fragmentShader:a,vertexShader:o}=i;!1===s.getProgramParameter(n,s.LINK_STATUS)&&this._logProgramError(n,a,o),r.useProgram(n);const u=e.getBindings();this._setupBindings(u,n),this.set(t,{programGPU:n})}createComputePipeline(e,t){const{state:r,gl:s}=this,i={stage:"fragment",code:"#version 300 es\nprecision highp float;\nvoid main() {}"};this.createProgram(i);const{computeProgram:n}=e,a=s.createProgram(),o=this.get(i).shaderGPU,u=this.get(n).shaderGPU,l=n.transforms,d=[],c=[];for(let e=0;ejv[t]===e)),r=this.extensions;for(let e=0;e0&&!1===y){if(void 0===g){const s=[];g=t.createFramebuffer(),r.bindFramebuffer(t.FRAMEBUFFER,g);const i=[],l=e.textures;for(let r=0;r0&&!0===this.extensions.has("WEBGL_multisampled_render_to_texture")&&!1!==e.autoAllocateDepthBuffer}dispose(){const e=this.extensions.get("WEBGL_lose_context");e&&e.loseContext(),this.renderer.domElement.removeEventListener("webglcontextlost",this._onContextLost)}}const Qv="point-list",Zv="line-list",Jv="line-strip",eN="triangle-list",tN="triangle-strip",rN="never",sN="less",iN="equal",nN="less-equal",aN="greater",oN="not-equal",uN="greater-equal",lN="always",dN="store",cN="load",hN="clear",pN="ccw",gN="none",mN="front",fN="back",yN="uint16",xN="uint32",bN="r8unorm",TN="r8snorm",_N="r8uint",vN="r8sint",NN="r16uint",SN="r16sint",EN="r16float",wN="rg8unorm",AN="rg8snorm",RN="rg8uint",CN="rg8sint",MN="r32uint",PN="r32sint",LN="r32float",FN="rg16uint",BN="rg16sint",IN="rg16float",DN="rgba8unorm",VN="rgba8unorm-srgb",UN="rgba8snorm",ON="rgba8uint",GN="rgba8sint",kN="bgra8unorm",zN="bgra8unorm-srgb",$N="rgb9e5ufloat",HN="rgb10a2unorm",WN="rgb10a2unorm",jN="rg32uint",qN="rg32sint",XN="rg32float",KN="rgba16uint",YN="rgba16sint",QN="rgba16float",ZN="rgba32uint",JN="rgba32sint",eS="rgba32float",tS="depth16unorm",rS="depth24plus",sS="depth24plus-stencil8",iS="depth32float",nS="depth32float-stencil8",aS="bc1-rgba-unorm",oS="bc1-rgba-unorm-srgb",uS="bc2-rgba-unorm",lS="bc2-rgba-unorm-srgb",dS="bc3-rgba-unorm",cS="bc3-rgba-unorm-srgb",hS="bc4-r-unorm",pS="bc4-r-snorm",gS="bc5-rg-unorm",mS="bc5-rg-snorm",fS="bc6h-rgb-ufloat",yS="bc6h-rgb-float",xS="bc7-rgba-unorm",bS="bc7-rgba-srgb",TS="etc2-rgb8unorm",_S="etc2-rgb8unorm-srgb",vS="etc2-rgb8a1unorm",NS="etc2-rgb8a1unorm-srgb",SS="etc2-rgba8unorm",ES="etc2-rgba8unorm-srgb",wS="eac-r11unorm",AS="eac-r11snorm",RS="eac-rg11unorm",CS="eac-rg11snorm",MS="astc-4x4-unorm",PS="astc-4x4-unorm-srgb",LS="astc-5x4-unorm",FS="astc-5x4-unorm-srgb",BS="astc-5x5-unorm",IS="astc-5x5-unorm-srgb",DS="astc-6x5-unorm",VS="astc-6x5-unorm-srgb",US="astc-6x6-unorm",OS="astc-6x6-unorm-srgb",GS="astc-8x5-unorm",kS="astc-8x5-unorm-srgb",zS="astc-8x6-unorm",$S="astc-8x6-unorm-srgb",HS="astc-8x8-unorm",WS="astc-8x8-unorm-srgb",jS="astc-10x5-unorm",qS="astc-10x5-unorm-srgb",XS="astc-10x6-unorm",KS="astc-10x6-unorm-srgb",YS="astc-10x8-unorm",QS="astc-10x8-unorm-srgb",ZS="astc-10x10-unorm",JS="astc-10x10-unorm-srgb",eE="astc-12x10-unorm",tE="astc-12x10-unorm-srgb",rE="astc-12x12-unorm",sE="astc-12x12-unorm-srgb",iE="clamp-to-edge",nE="repeat",aE="mirror-repeat",oE="linear",uE="nearest",lE="zero",dE="one",cE="src",hE="one-minus-src",pE="src-alpha",gE="one-minus-src-alpha",mE="dst",fE="one-minus-dst",yE="dst-alpha",xE="one-minus-dst-alpha",bE="src-alpha-saturated",TE="constant",_E="one-minus-constant",vE="add",NE="subtract",SE="reverse-subtract",EE="min",wE="max",AE=0,RE=15,CE="keep",ME="zero",PE="replace",LE="invert",FE="increment-clamp",BE="decrement-clamp",IE="increment-wrap",DE="decrement-wrap",VE="storage",UE="read-only-storage",OE="write-only",GE="read-only",kE="read-write",zE="float",$E="unfilterable-float",HE="depth",WE="sint",jE="uint",qE="2d",XE="3d",KE="2d",YE="2d-array",QE="cube",ZE="3d",JE="all",ew="vertex",tw="instance",rw={DepthClipControl:"depth-clip-control",Depth32FloatStencil8:"depth32float-stencil8",TextureCompressionBC:"texture-compression-bc",TextureCompressionETC2:"texture-compression-etc2",TextureCompressionASTC:"texture-compression-astc",TimestampQuery:"timestamp-query",IndirectFirstInstance:"indirect-first-instance",ShaderF16:"shader-f16",RG11B10UFloat:"rg11b10ufloat-renderable",BGRA8UNormStorage:"bgra8unorm-storage",Float32Filterable:"float32-filterable",ClipDistances:"clip-distances",DualSourceBlending:"dual-source-blending",Subgroups:"subgroups"};class sw extends cv{constructor(e,t){super(e),this.texture=t,this.version=t?t.version:0,this.isSampler=!0}}class iw extends sw{constructor(e,t,r){super(e,t?t.value:null),this.textureNode=t,this.groupNode=r}update(){this.texture=this.textureNode.value}}class nw extends hv{constructor(e,t){super(e,t?t.array:null),this.attribute=t,this.isStorageBuffer=!0}}let aw=0;class ow extends nw{constructor(e,t){super("StorageBuffer_"+aw++,e?e.value:null),this.nodeUniform=e,this.access=e?e.access:Vs.READ_WRITE,this.groupNode=t}get buffer(){return this.nodeUniform.value}}class uw extends Im{constructor(e){super(),this.device=e;this.mipmapSampler=e.createSampler({minFilter:oE}),this.flipYSampler=e.createSampler({minFilter:uE}),this.transferPipelines={},this.flipYPipelines={},this.mipmapVertexShaderModule=e.createShaderModule({label:"mipmapVertex",code:"\nstruct VarysStruct {\n\t@builtin( position ) Position: vec4,\n\t@location( 0 ) vTex : vec2\n};\n\n@vertex\nfn main( @builtin( vertex_index ) vertexIndex : u32 ) -> VarysStruct {\n\n\tvar Varys : VarysStruct;\n\n\tvar pos = array< vec2, 4 >(\n\t\tvec2( -1.0, 1.0 ),\n\t\tvec2( 1.0, 1.0 ),\n\t\tvec2( -1.0, -1.0 ),\n\t\tvec2( 1.0, -1.0 )\n\t);\n\n\tvar tex = array< vec2, 4 >(\n\t\tvec2( 0.0, 0.0 ),\n\t\tvec2( 1.0, 0.0 ),\n\t\tvec2( 0.0, 1.0 ),\n\t\tvec2( 1.0, 1.0 )\n\t);\n\n\tVarys.vTex = tex[ vertexIndex ];\n\tVarys.Position = vec4( pos[ vertexIndex ], 0.0, 1.0 );\n\n\treturn Varys;\n\n}\n"}),this.mipmapFragmentShaderModule=e.createShaderModule({label:"mipmapFragment",code:"\n@group( 0 ) @binding( 0 )\nvar imgSampler : sampler;\n\n@group( 0 ) @binding( 1 )\nvar img : texture_2d;\n\n@fragment\nfn main( @location( 0 ) vTex : vec2 ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( img, imgSampler, vTex );\n\n}\n"}),this.flipYFragmentShaderModule=e.createShaderModule({label:"flipYFragment",code:"\n@group( 0 ) @binding( 0 )\nvar imgSampler : sampler;\n\n@group( 0 ) @binding( 1 )\nvar img : texture_2d;\n\n@fragment\nfn main( @location( 0 ) vTex : vec2 ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( img, imgSampler, vec2( vTex.x, 1.0 - vTex.y ) );\n\n}\n"})}getTransferPipeline(e){let t=this.transferPipelines[e];return void 0===t&&(t=this.device.createRenderPipeline({label:`mipmap-${e}`,vertex:{module:this.mipmapVertexShaderModule,entryPoint:"main"},fragment:{module:this.mipmapFragmentShaderModule,entryPoint:"main",targets:[{format:e}]},primitive:{topology:tN,stripIndexFormat:xN},layout:"auto"}),this.transferPipelines[e]=t),t}getFlipYPipeline(e){let t=this.flipYPipelines[e];return void 0===t&&(t=this.device.createRenderPipeline({label:`flipY-${e}`,vertex:{module:this.mipmapVertexShaderModule,entryPoint:"main"},fragment:{module:this.flipYFragmentShaderModule,entryPoint:"main",targets:[{format:e}]},primitive:{topology:tN,stripIndexFormat:xN},layout:"auto"}),this.flipYPipelines[e]=t),t}flipY(e,t,r=0){const s=t.format,{width:i,height:n}=t.size,a=this.getTransferPipeline(s),o=this.getFlipYPipeline(s),u=this.device.createTexture({size:{width:i,height:n,depthOrArrayLayers:1},format:s,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING}),l=e.createView({baseMipLevel:0,mipLevelCount:1,dimension:KE,baseArrayLayer:r}),d=u.createView({baseMipLevel:0,mipLevelCount:1,dimension:KE,baseArrayLayer:0}),c=this.device.createCommandEncoder({}),h=(e,t,r)=>{const s=e.getBindGroupLayout(0),i=this.device.createBindGroup({layout:s,entries:[{binding:0,resource:this.flipYSampler},{binding:1,resource:t}]}),n=c.beginRenderPass({colorAttachments:[{view:r,loadOp:hN,storeOp:dN,clearValue:[0,0,0,0]}]});n.setPipeline(e),n.setBindGroup(0,i),n.draw(4,1,0,0),n.end()};h(a,l,d),h(o,d,l),this.device.queue.submit([c.finish()]),u.destroy()}generateMipmaps(e,t,r=0){const s=this.get(e);void 0===s.useCount&&(s.useCount=0,s.layers=[]);const i=s.layers[r]||this._mipmapCreateBundles(e,t,r),n=this.device.createCommandEncoder({});this._mipmapRunBundles(n,i),this.device.queue.submit([n.finish()]),0!==s.useCount&&(s.layers[r]=i),s.useCount++}_mipmapCreateBundles(e,t,r){const s=this.getTransferPipeline(t.format),i=s.getBindGroupLayout(0);let n=e.createView({baseMipLevel:0,mipLevelCount:1,dimension:KE,baseArrayLayer:r});const a=[];for(let o=1;o1;for(let a=0;a]*\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/i,gw=/([a-z_0-9]+)\s*:\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/gi,mw={f32:"float",i32:"int",u32:"uint",bool:"bool","vec2":"vec2","vec2":"ivec2","vec2":"uvec2","vec2":"bvec2",vec2f:"vec2",vec2i:"ivec2",vec2u:"uvec2",vec2b:"bvec2","vec3":"vec3","vec3":"ivec3","vec3":"uvec3","vec3":"bvec3",vec3f:"vec3",vec3i:"ivec3",vec3u:"uvec3",vec3b:"bvec3","vec4":"vec4","vec4":"ivec4","vec4":"uvec4","vec4":"bvec4",vec4f:"vec4",vec4i:"ivec4",vec4u:"uvec4",vec4b:"bvec4","mat2x2":"mat2",mat2x2f:"mat2","mat3x3":"mat3",mat3x3f:"mat3","mat4x4":"mat4",mat4x4f:"mat4",sampler:"sampler",texture_1d:"texture",texture_2d:"texture",texture_2d_array:"texture",texture_multisampled_2d:"cubeTexture",texture_depth_2d:"depthTexture",texture_depth_multisampled_2d:"depthTexture",texture_3d:"texture3D",texture_cube:"cubeTexture",texture_cube_array:"cubeTexture",texture_storage_1d:"storageTexture",texture_storage_2d:"storageTexture",texture_storage_2d_array:"storageTexture",texture_storage_3d:"storageTexture"};class fw extends C_{constructor(e){const{type:t,inputs:r,name:s,inputsCode:i,blockCode:n,outputType:a}=(e=>{const t=(e=e.trim()).match(pw);if(null!==t&&4===t.length){const r=t[2],s=[];let i=null;for(;null!==(i=gw.exec(r));)s.push({name:i[1],type:i[2]});const n=[];for(let e=0;e "+this.outputType:"";return`fn ${e} ( ${this.inputsCode.trim()} ) ${t}`+this.blockCode}}class yw extends R_{parseFunction(e){return new fw(e)}}const xw="undefined"!=typeof self?self.GPUShaderStage:{VERTEX:1,FRAGMENT:2,COMPUTE:4},bw={[Vs.READ_ONLY]:"read",[Vs.WRITE_ONLY]:"write",[Vs.READ_WRITE]:"read_write"},Tw={[Sr]:"repeat",[Nr]:"clamp",[vr]:"mirror"},_w={vertex:xw?xw.VERTEX:1,fragment:xw?xw.FRAGMENT:2,compute:xw?xw.COMPUTE:4},vw={instance:!0,swizzleAssign:!1,storageBuffer:!0},Nw={"^^":"tsl_xor"},Sw={float:"f32",int:"i32",uint:"u32",bool:"bool",color:"vec3",vec2:"vec2",ivec2:"vec2",uvec2:"vec2",bvec2:"vec2",vec3:"vec3",ivec3:"vec3",uvec3:"vec3",bvec3:"vec3",vec4:"vec4",ivec4:"vec4",uvec4:"vec4",bvec4:"vec4",mat2:"mat2x2",mat3:"mat3x3",mat4:"mat4x4"},Ew={},ww={tsl_xor:new px("fn tsl_xor( a : bool, b : bool ) -> bool { return ( a || b ) && !( a && b ); }"),mod_float:new px("fn tsl_mod_float( x : f32, y : f32 ) -> f32 { return x - y * floor( x / y ); }"),mod_vec2:new px("fn tsl_mod_vec2( x : vec2f, y : vec2f ) -> vec2f { return x - y * floor( x / y ); }"),mod_vec3:new px("fn tsl_mod_vec3( x : vec3f, y : vec3f ) -> vec3f { return x - y * floor( x / y ); }"),mod_vec4:new px("fn tsl_mod_vec4( x : vec4f, y : vec4f ) -> vec4f { return x - y * floor( x / y ); }"),equals_bool:new px("fn tsl_equals_bool( a : bool, b : bool ) -> bool { return a == b; }"),equals_bvec2:new px("fn tsl_equals_bvec2( a : vec2f, b : vec2f ) -> vec2 { return vec2( a.x == b.x, a.y == b.y ); }"),equals_bvec3:new px("fn tsl_equals_bvec3( a : vec3f, b : vec3f ) -> vec3 { return vec3( a.x == b.x, a.y == b.y, a.z == b.z ); }"),equals_bvec4:new px("fn tsl_equals_bvec4( a : vec4f, b : vec4f ) -> vec4 { return vec4( a.x == b.x, a.y == b.y, a.z == b.z, a.w == b.w ); }"),repeatWrapping_float:new px("fn tsl_repeatWrapping_float( coord: f32 ) -> f32 { return fract( coord ); }"),mirrorWrapping_float:new px("fn tsl_mirrorWrapping_float( coord: f32 ) -> f32 { let mirrored = fract( coord * 0.5 ) * 2.0; return 1.0 - abs( 1.0 - mirrored ); }"),clampWrapping_float:new px("fn tsl_clampWrapping_float( coord: f32 ) -> f32 { return clamp( coord, 0.0, 1.0 ); }"),biquadraticTexture:new px("\nfn tsl_biquadraticTexture( map : texture_2d, coord : vec2f, iRes : vec2u, level : u32 ) -> vec4f {\n\n\tlet res = vec2f( iRes );\n\n\tlet uvScaled = coord * res;\n\tlet uvWrapping = ( ( uvScaled % res ) + res ) % res;\n\n\t// https://www.shadertoy.com/view/WtyXRy\n\n\tlet uv = uvWrapping - 0.5;\n\tlet iuv = floor( uv );\n\tlet f = fract( uv );\n\n\tlet rg1 = textureLoad( map, vec2u( iuv + vec2( 0.5, 0.5 ) ) % iRes, level );\n\tlet rg2 = textureLoad( map, vec2u( iuv + vec2( 1.5, 0.5 ) ) % iRes, level );\n\tlet rg3 = textureLoad( map, vec2u( iuv + vec2( 0.5, 1.5 ) ) % iRes, level );\n\tlet rg4 = textureLoad( map, vec2u( iuv + vec2( 1.5, 1.5 ) ) % iRes, level );\n\n\treturn mix( mix( rg1, rg2, f.x ), mix( rg3, rg4, f.x ), f.y );\n\n}\n")},Aw={dFdx:"dpdx",dFdy:"- dpdy",mod_float:"tsl_mod_float",mod_vec2:"tsl_mod_vec2",mod_vec3:"tsl_mod_vec3",mod_vec4:"tsl_mod_vec4",equals_bool:"tsl_equals_bool",equals_bvec2:"tsl_equals_bvec2",equals_bvec3:"tsl_equals_bvec3",equals_bvec4:"tsl_equals_bvec4",inversesqrt:"inverseSqrt",bitcast:"bitcast"};"undefined"!=typeof navigator&&/Windows/g.test(navigator.userAgent)&&(ww.pow_float=new px("fn tsl_pow_float( a : f32, b : f32 ) -> f32 { return select( -pow( -a, b ), pow( a, b ), a > 0.0 ); }"),ww.pow_vec2=new px("fn tsl_pow_vec2( a : vec2f, b : vec2f ) -> vec2f { return vec2f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ) ); }",[ww.pow_float]),ww.pow_vec3=new px("fn tsl_pow_vec3( a : vec3f, b : vec3f ) -> vec3f { return vec3f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ), tsl_pow_float( a.z, b.z ) ); }",[ww.pow_float]),ww.pow_vec4=new px("fn tsl_pow_vec4( a : vec4f, b : vec4f ) -> vec4f { return vec4f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ), tsl_pow_float( a.z, b.z ), tsl_pow_float( a.w, b.w ) ); }",[ww.pow_float]),Aw.pow_float="tsl_pow_float",Aw.pow_vec2="tsl_pow_vec2",Aw.pow_vec3="tsl_pow_vec3",Aw.pow_vec4="tsl_pow_vec4");let Rw="";!0!==("undefined"!=typeof navigator&&/Firefox|Deno/g.test(navigator.userAgent))&&(Rw+="diagnostic( off, derivative_uniformity );\n");class Cw extends m_{constructor(e,t){super(e,t,new yw),this.uniformGroups={},this.builtins={},this.directives={},this.scopedArrays=new Map}needsToWorkingColorSpace(e){return!0===e.isVideoTexture&&e.colorSpace!==x}_generateTextureSample(e,t,r,s,i=this.shaderStage){return"fragment"===i?s?`textureSample( ${t}, ${t}_sampler, ${r}, ${s} )`:`textureSample( ${t}, ${t}_sampler, ${r} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r):this.generateTextureLod(e,t,r,s,"0")}_generateVideoSample(e,t,r=this.shaderStage){if("fragment"===r)return`textureSampleBaseClampToEdge( ${e}, ${e}_sampler, vec2( ${t}.x, 1.0 - ${t}.y ) )`;console.error(`WebGPURenderer: THREE.VideoTexture does not support ${r} shader.`)}_generateTextureSampleLevel(e,t,r,s,i,n=this.shaderStage){return"fragment"!==n&&"compute"!==n||!1!==this.isUnfilterable(e)?this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,s):this.generateTextureLod(e,t,r,i,s):`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`}generateWrapFunction(e){const t=`tsl_coord_${Tw[e.wrapS]}S_${Tw[e.wrapT]}_${e.isData3DTexture?"3d":"2d"}T`;let r=Ew[t];if(void 0===r){const s=[],i=e.isData3DTexture?"vec3f":"vec2f";let n=`fn ${t}( coord : ${i} ) -> ${i} {\n\n\treturn ${i}(\n`;const a=(e,t)=>{e===Sr?(s.push(ww.repeatWrapping_float),n+=`\t\ttsl_repeatWrapping_float( coord.${t} )`):e===Nr?(s.push(ww.clampWrapping_float),n+=`\t\ttsl_clampWrapping_float( coord.${t} )`):e===vr?(s.push(ww.mirrorWrapping_float),n+=`\t\ttsl_mirrorWrapping_float( coord.${t} )`):(n+=`\t\tcoord.${t}`,console.warn(`WebGPURenderer: Unsupported texture wrap type "${e}" for vertex shader.`))};a(e.wrapS,"x"),n+=",\n",a(e.wrapT,"y"),e.isData3DTexture&&(n+=",\n",a(e.wrapR,"z")),n+="\n\t);\n\n}\n",Ew[t]=r=new px(n,s)}return r.build(this),t}generateArrayDeclaration(e,t){return`array< ${this.getType(e)}, ${t} >`}generateTextureDimension(e,t,r){const s=this.getDataFromNode(e,this.shaderStage,this.globalCache);void 0===s.dimensionsSnippet&&(s.dimensionsSnippet={});let i=s.dimensionsSnippet[r];if(void 0===s.dimensionsSnippet[r]){let n,a;const{primarySamples:o}=this.renderer.backend.utils.getTextureSampleData(e),u=o>1;a=e.isData3DTexture?"vec3":"vec2",n=u||e.isVideoTexture||e.isStorageTexture?t:`${t}${r?`, u32( ${r} )`:""}`,i=new Wo(new Cu(`textureDimensions( ${n} )`,a)),s.dimensionsSnippet[r]=i,(e.isDataArrayTexture||e.isData3DTexture)&&(s.arrayLayerCount=new Wo(new Cu(`textureNumLayers(${t})`,"u32"))),e.isTextureCube&&(s.cubeFaceCount=new Wo(new Cu("6u","u32")))}return i.build(this)}generateFilteredTexture(e,t,r,s="0u"){this._include("biquadraticTexture");return`tsl_biquadraticTexture( ${t}, ${this.generateWrapFunction(e)}( ${r} ), ${this.generateTextureDimension(e,t,s)}, u32( ${s} ) )`}generateTextureLod(e,t,r,s,i="0u"){const n=this.generateWrapFunction(e),a=this.generateTextureDimension(e,t,i),o=e.isData3DTexture?"vec3":"vec2",u=`${o}(${n}(${r}) * ${o}(${a}))`;return this.generateTextureLoad(e,t,u,s,i)}generateTextureLoad(e,t,r,s,i="0u"){return!0===e.isVideoTexture||!0===e.isStorageTexture?`textureLoad( ${t}, ${r} )`:s?`textureLoad( ${t}, ${r}, ${s}, u32( ${i} ) )`:`textureLoad( ${t}, ${r}, u32( ${i} ) )`}generateTextureStore(e,t,r,s){return`textureStore( ${t}, ${r}, ${s} )`}isSampleCompare(e){return!0===e.isDepthTexture&&null!==e.compareFunction}isUnfilterable(e){return"float"!==this.getComponentTypeFromTexture(e)||!this.isAvailable("float32Filterable")&&!0===e.isDataTexture&&e.type===L||!1===this.isSampleCompare(e)&&e.minFilter===_&&e.magFilter===_||this.renderer.backend.utils.getTextureSampleData(e).primarySamples>1}generateTexture(e,t,r,s,i=this.shaderStage){let n=null;return n=!0===e.isVideoTexture?this._generateVideoSample(t,r,i):this.isUnfilterable(e)?this.generateTextureLod(e,t,r,s,"0",i):this._generateTextureSample(e,t,r,s,i),n}generateTextureGrad(e,t,r,s,i,n=this.shaderStage){if("fragment"===n)return`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${s[0]}, ${s[1]} )`;console.error(`WebGPURenderer: THREE.TextureNode.gradient() does not support ${n} shader.`)}generateTextureCompare(e,t,r,s,i,n=this.shaderStage){if("fragment"===n)return`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${s} )`;console.error(`WebGPURenderer: THREE.DepthTexture.compareFunction() does not support ${n} shader.`)}generateTextureLevel(e,t,r,s,i,n=this.shaderStage){let a=null;return a=!0===e.isVideoTexture?this._generateVideoSample(t,r,n):this._generateTextureSampleLevel(e,t,r,s,i,n),a}generateTextureBias(e,t,r,s,i,n=this.shaderStage){if("fragment"===n)return`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${s} )`;console.error(`WebGPURenderer: THREE.TextureNode.biasNode does not support ${n} shader.`)}getPropertyName(e,t=this.shaderStage){if(!0===e.isNodeVarying&&!0===e.needsInterpolation){if("vertex"===t)return`varyings.${e.name}`}else if(!0===e.isNodeUniform){const t=e.name,r=e.type;return"texture"===r||"cubeTexture"===r||"storageTexture"===r||"texture3D"===r?t:"buffer"===r||"storageBuffer"===r||"indirectStorageBuffer"===r?this.isCustomStruct(e)?t:t+".value":e.groupNode.name+"."+t}return super.getPropertyName(e)}getOutputStructName(){return"output"}getFunctionOperator(e){const t=Nw[e];return void 0!==t?(this._include(t),t):null}getNodeAccess(e,t){return"compute"!==t?Vs.READ_ONLY:e.access}getStorageAccess(e,t){return bw[this.getNodeAccess(e,t)]}getUniformFromNode(e,t,r,s=null){const i=super.getUniformFromNode(e,t,r,s),n=this.getDataFromNode(e,r,this.globalCache);if(void 0===n.uniformGPU){let a;const o=e.groupNode,u=o.name,l=this.getBindGroupArray(u,r);if("texture"===t||"cubeTexture"===t||"storageTexture"===t||"texture3D"===t){let s=null;const n=this.getNodeAccess(e,r);if("texture"===t||"storageTexture"===t?s=new _v(i.name,i.node,o,n):"cubeTexture"===t?s=new vv(i.name,i.node,o,n):"texture3D"===t&&(s=new Nv(i.name,i.node,o,n)),s.store=!0===e.isStorageTextureNode,s.setVisibility(_w[r]),"fragment"!==r&&"compute"!==r||!1!==this.isUnfilterable(e.value)||!1!==s.store)l.push(s),a=[s];else{const e=new iw(`${i.name}_sampler`,i.node,o);e.setVisibility(_w[r]),l.push(e,s),a=[e,s]}}else if("buffer"===t||"storageBuffer"===t||"indirectStorageBuffer"===t){const n=new("buffer"===t?mv:ow)(e,o);n.setVisibility(_w[r]),l.push(n),a=n,i.name=s||"NodeBuffer_"+i.id}else{const e=this.uniformGroups[r]||(this.uniformGroups[r]={});let s=e[u];void 0===s&&(s=new xv(u,o),s.setVisibility(_w[r]),e[u]=s,l.push(s)),a=this.getNodeUniform(i,t),s.addUniform(a)}n.uniformGPU=a}return i}getBuiltin(e,t,r,s=this.shaderStage){const i=this.builtins[s]||(this.builtins[s]=new Map);return!1===i.has(e)&&i.set(e,{name:e,property:t,type:r}),t}hasBuiltin(e,t=this.shaderStage){return void 0!==this.builtins[t]&&this.builtins[t].has(e)}getVertexIndex(){return"vertex"===this.shaderStage?this.getBuiltin("vertex_index","vertexIndex","u32","attribute"):"vertexIndex"}buildFunctionCode(e){const t=e.layout,r=this.flowShaderNode(e),s=[];for(const e of t.inputs)s.push(e.name+" : "+this.getType(e.type));let i=`fn ${t.name}( ${s.join(", ")} ) -> ${this.getType(t.type)} {\n${r.vars}\n${r.code}\n`;return r.result&&(i+=`\treturn ${r.result};\n`),i+="\n}\n",i}getInstanceIndex(){return"vertex"===this.shaderStage?this.getBuiltin("instance_index","instanceIndex","u32","attribute"):"instanceIndex"}getInvocationLocalIndex(){return this.getBuiltin("local_invocation_index","invocationLocalIndex","u32","attribute")}getSubgroupSize(){return this.enableSubGroups(),this.getBuiltin("subgroup_size","subgroupSize","u32","attribute")}getInvocationSubgroupIndex(){return this.enableSubGroups(),this.getBuiltin("subgroup_invocation_id","invocationSubgroupIndex","u32","attribute")}getSubgroupIndex(){return this.enableSubGroups(),this.getBuiltin("subgroup_id","subgroupIndex","u32","attribute")}getDrawIndex(){return null}getFrontFacing(){return this.getBuiltin("front_facing","isFront","bool")}getFragCoord(){return this.getBuiltin("position","fragCoord","vec4")+".xy"}getFragDepth(){return"output."+this.getBuiltin("frag_depth","depth","f32","output")}getClipDistance(){return"varyings.hw_clip_distances"}isFlipY(){return!1}enableDirective(e,t=this.shaderStage){(this.directives[t]||(this.directives[t]=new Set)).add(e)}getDirectives(e){const t=[],r=this.directives[e];if(void 0!==r)for(const e of r)t.push(`enable ${e};`);return t.join("\n")}enableSubGroups(){this.enableDirective("subgroups")}enableSubgroupsF16(){this.enableDirective("subgroups-f16")}enableClipDistances(){this.enableDirective("clip_distances")}enableShaderF16(){this.enableDirective("f16")}enableDualSourceBlending(){this.enableDirective("dual_source_blending")}enableHardwareClipping(e){this.enableClipDistances(),this.getBuiltin("clip_distances","hw_clip_distances",`array`,"vertex")}getBuiltins(e){const t=[],r=this.builtins[e];if(void 0!==r)for(const{name:e,property:s,type:i}of r.values())t.push(`@builtin( ${e} ) ${s} : ${i}`);return t.join(",\n\t")}getScopedArray(e,t,r,s){return!1===this.scopedArrays.has(e)&&this.scopedArrays.set(e,{name:e,scope:t,bufferType:r,bufferCount:s}),e}getScopedArrays(e){if("compute"!==e)return;const t=[];for(const{name:e,scope:r,bufferType:s,bufferCount:i}of this.scopedArrays.values()){const n=this.getType(s);t.push(`var<${r}> ${e}: array< ${n}, ${i} >;`)}return t.join("\n")}getAttributes(e){const t=[];if("compute"===e&&(this.getBuiltin("global_invocation_id","globalId","vec3","attribute"),this.getBuiltin("workgroup_id","workgroupId","vec3","attribute"),this.getBuiltin("local_invocation_id","localId","vec3","attribute"),this.getBuiltin("num_workgroups","numWorkgroups","vec3","attribute"),this.renderer.hasFeature("subgroups")&&(this.enableDirective("subgroups",e),this.getBuiltin("subgroup_size","subgroupSize","u32","attribute"))),"vertex"===e||"compute"===e){const e=this.getBuiltins("attribute");e&&t.push(e);const r=this.getAttributesArray();for(let e=0,s=r.length;e"),t.push(`\t${s+r.name} : ${i}`)}return e.output&&t.push(`\t${this.getBuiltins("output")}`),t.join(",\n")}getStructs(e){let t="";const r=this.structs[e];if(r.length>0){const e=[];for(const t of r){let r=`struct ${t.name} {\n`;r+=this.getStructMembers(t),r+="\n};",e.push(r)}t="\n"+e.join("\n\n")+"\n"}return t}getVar(e,t,r=null){let s=`var ${t} : `;return s+=null!==r?this.generateArrayDeclaration(e,r):this.getType(e),s}getVars(e){const t=[],r=this.vars[e];if(void 0!==r)for(const e of r)t.push(`\t${this.getVar(e.type,e.name,e.count)};`);return`\n${t.join("\n")}\n`}getVaryings(e){const t=[];if("vertex"===e&&this.getBuiltin("position","Vertex","vec4","vertex"),"vertex"===e||"fragment"===e){const r=this.varyings,s=this.vars[e];for(let i=0;i1&&(n="_multisampled"),!0===t.isCubeTexture)s="texture_cube";else if(!0===t.isDataArrayTexture||!0===t.isCompressedArrayTexture)s="texture_2d_array";else if(!0===t.isDepthTexture)s=`texture_depth${n}_2d`;else if(!0===t.isVideoTexture)s="texture_external";else if(!0===t.isData3DTexture)s="texture_3d";else if(!0===i.node.isStorageTextureNode){s=`texture_storage_2d<${hw(t)}, ${this.getStorageAccess(i.node,e)}>`}else{s=`texture${n}_2d<${this.getComponentTypeFromTexture(t).charAt(0)}32>`}r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name} : ${s};`)}else if("buffer"===i.type||"storageBuffer"===i.type||"indirectStorageBuffer"===i.type){const t=i.node,r=this.getType(t.getNodeType(this)),n=t.bufferCount,o=n>0&&"buffer"===i.type?", "+n:"",u=t.isStorageBufferNode?`storage, ${this.getStorageAccess(t,e)}`:"uniform";if(this.isCustomStruct(i))s.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var<${u}> ${i.name} : ${r};`);else{const e=`\tvalue : array< ${t.isAtomic?`atomic<${r}>`:`${r}`}${o} >`;s.push(this._getWGSLStructBinding(i.name,e,u,a.binding++,a.group))}}else{const e=this.getType(this.getVectorType(i.type)),t=i.groupNode.name;(n[t]||(n[t]={index:a.binding++,id:a.group,snippets:[]})).snippets.push(`\t${i.name} : ${e}`)}}for(const e in n){const t=n[e];i.push(this._getWGSLStructBinding(e,t.snippets.join(",\n"),"uniform",t.index,t.id))}let a=r.join("\n");return a+=s.join("\n"),a+=i.join("\n"),a}buildCode(){const e=null!==this.material?{fragment:{},vertex:{}}:{compute:{}};this.sortBindingGroups();for(const t in e){this.shaderStage=t;const r=e[t];r.uniforms=this.getUniforms(t),r.attributes=this.getAttributes(t),r.varyings=this.getVaryings(t),r.structs=this.getStructs(t),r.vars=this.getVars(t),r.codes=this.getCodes(t),r.directives=this.getDirectives(t),r.scopedArrays=this.getScopedArrays(t);let s="// code\n\n";s+=this.flowCode[t];const i=this.flowNodes[t],n=i[i.length-1],a=n.outputNode,o=void 0!==a&&!0===a.isOutputStructNode;for(const e of i){const i=this.getFlowData(e),u=e.name;if(u&&(s.length>0&&(s+="\n"),s+=`\t// flow -> ${u}\n`),s+=`${i.code}\n\t`,e===n&&"compute"!==t)if(s+="// result\n\n\t","vertex"===t)s+=`varyings.Vertex = ${i.result};`;else if("fragment"===t)if(o)r.returnType=a.getNodeType(this),r.structs+="var output : "+r.returnType+";",s+=`return ${i.result};`;else{let e="\t@location(0) color: vec4";const t=this.getBuiltins("output");t&&(e+=",\n\t"+t),r.returnType="OutputStruct",r.structs+=this._getWGSLStruct("OutputStruct",e),r.structs+="\nvar output : OutputStruct;",s+=`output.color = ${i.result};\n\n\treturn output;`}}r.flow=s}this.shaderStage=null,null!==this.material?(this.vertexShader=this._getWGSLVertexCode(e.vertex),this.fragmentShader=this._getWGSLFragmentCode(e.fragment)):this.computeShader=this._getWGSLComputeCode(e.compute,(this.object.workgroupSize||[64]).join(", "))}getMethod(e,t=null){let r;return null!==t&&(r=this._getWGSLMethod(e+"_"+t)),void 0===r&&(r=this._getWGSLMethod(e)),r||e}getType(e){return Sw[e]||e}isAvailable(e){let t=vw[e];return void 0===t&&("float32Filterable"===e?t=this.renderer.hasFeature("float32-filterable"):"clipDistance"===e&&(t=this.renderer.hasFeature("clip-distances")),vw[e]=t),t}_getWGSLMethod(e){return void 0!==ww[e]&&this._include(e),Aw[e]}_include(e){const t=ww[e];return t.build(this),null!==this.currentFunctionNode&&this.currentFunctionNode.includes.push(t),t}_getWGSLVertexCode(e){return`${this.getSignature()}\n// directives\n${e.directives}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\n\n// varyings\n${e.varyings}\nvar varyings : VaryingsStruct;\n\n// codes\n${e.codes}\n\n@vertex\nfn main( ${e.attributes} ) -> VaryingsStruct {\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n\treturn varyings;\n\n}\n`}_getWGSLFragmentCode(e){return`${this.getSignature()}\n// global\n${Rw}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\n\n// codes\n${e.codes}\n\n@fragment\nfn main( ${e.varyings} ) -> ${e.returnType} {\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n}\n`}_getWGSLComputeCode(e,t){return`${this.getSignature()}\n// directives\n${e.directives}\n\n// system\nvar instanceIndex : u32;\n\n// locals\n${e.scopedArrays}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\n\n// codes\n${e.codes}\n\n@compute @workgroup_size( ${t} )\nfn main( ${e.attributes} ) {\n\n\t// system\n\tinstanceIndex = globalId.x + globalId.y * numWorkgroups.x * u32(${t}) + globalId.z * numWorkgroups.x * numWorkgroups.y * u32(${t});\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n}\n`}_getWGSLStruct(e,t){return`\nstruct ${e} {\n${t}\n};`}_getWGSLStructBinding(e,t,r,s=0,i=0){const n=e+"Struct";return`${this._getWGSLStruct(n,t)}\n@binding( ${s} ) @group( ${i} )\nvar<${r}> ${e} : ${n};`}}class Mw{constructor(e){this.backend=e}getCurrentDepthStencilFormat(e){let t;return null!==e.depthTexture?t=this.getTextureFormatGPU(e.depthTexture):e.depth&&e.stencil?t=sS:e.depth&&(t=rS),t}getTextureFormatGPU(e){return this.backend.get(e).format}getTextureSampleData(e){let t;if(e.isFramebufferTexture)t=1;else if(e.isDepthTexture&&!e.renderTarget){const e=this.backend.renderer,r=e.getRenderTarget();t=r?r.samples:e.samples}else e.renderTarget&&(t=e.renderTarget.samples);t=t||1;const r=t>1&&null!==e.renderTarget&&!0!==e.isDepthTexture&&!0!==e.isFramebufferTexture;return{samples:t,primarySamples:r?1:t,isMSAA:r}}getCurrentColorFormat(e){let t;return t=null!==e.textures?this.getTextureFormatGPU(e.textures[0]):this.getPreferredCanvasFormat(),t}getCurrentColorSpace(e){return null!==e.textures?e.textures[0].colorSpace:this.backend.renderer.outputColorSpace}getPrimitiveTopology(e,t){return e.isPoints?Qv:e.isLineSegments||e.isMesh&&!0===t.wireframe?Zv:e.isLine?Jv:e.isMesh?eN:void 0}getSampleCount(e){let t=1;return e>1&&(t=Math.pow(2,Math.floor(Math.log2(e))),2===t&&(t=4)),t}getSampleCountRenderContext(e){return null!==e.textures?this.getSampleCount(e.sampleCount):this.getSampleCount(this.backend.renderer.samples)}getPreferredCanvasFormat(){const e=this.backend.parameters.outputType;if(void 0===e)return navigator.gpu.getPreferredCanvasFormat();if(e===Ce)return kN;if(e===he)return QN;throw new Error("Unsupported outputType")}}const Pw=new Map([[Int8Array,["sint8","snorm8"]],[Uint8Array,["uint8","unorm8"]],[Int16Array,["sint16","snorm16"]],[Uint16Array,["uint16","unorm16"]],[Int32Array,["sint32","snorm32"]],[Uint32Array,["uint32","unorm32"]],[Float32Array,["float32"]]]),Lw=new Map([[ze,["float16"]]]),Fw=new Map([[Int32Array,"sint32"],[Int16Array,"sint32"],[Uint32Array,"uint32"],[Uint16Array,"uint32"],[Float32Array,"float32"]]);class Bw{constructor(e){this.backend=e}createAttribute(e,t){const r=this._getBufferAttribute(e),s=this.backend,i=s.get(r);let n=i.buffer;if(void 0===n){const a=s.device;let o=r.array;if(!1===e.normalized)if(o.constructor===Int16Array||o.constructor===Int8Array)o=new Int32Array(o);else if((o.constructor===Uint16Array||o.constructor===Uint8Array)&&(o=new Uint32Array(o),t&GPUBufferUsage.INDEX))for(let e=0;e1&&(s.multisampled=!0,r.texture.isDepthTexture||(s.sampleType=$E)),r.texture.isDepthTexture)s.sampleType=HE;else if(r.texture.isDataTexture||r.texture.isDataArrayTexture||r.texture.isData3DTexture){const e=r.texture.type;e===T?s.sampleType=WE:e===b?s.sampleType=jE:e===L&&(this.backend.hasFeature("float32-filterable")?s.sampleType=zE:s.sampleType=$E)}r.isSampledCubeTexture?s.viewDimension=QE:r.texture.isDataArrayTexture||r.texture.isCompressedArrayTexture?s.viewDimension=YE:r.isSampledTexture3D&&(s.viewDimension=ZE),e.texture=s}else console.error(`WebGPUBindingUtils: Unsupported binding "${r}".`);s.push(e)}return r.createBindGroupLayout({entries:s})}createBindings(e,t,r,s=0){const{backend:i,bindGroupLayoutCache:n}=this,a=i.get(e);let o,u=n.get(e.bindingsReference);void 0===u&&(u=this.createBindingsLayout(e),n.set(e.bindingsReference,u)),r>0&&(void 0===a.groups&&(a.groups=[],a.versions=[]),a.versions[r]===s&&(o=a.groups[r])),void 0===o&&(o=this.createBindGroup(e,u),r>0&&(a.groups[r]=o,a.versions[r]=s)),a.group=o,a.layout=u}updateBinding(e){const t=this.backend,r=t.device,s=e.buffer,i=t.get(e).buffer;r.queue.writeBuffer(i,0,s,0)}createBindGroupIndex(e,t){const r=this.backend.device,s=GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,i=e[0],n=r.createBuffer({label:"bindingCameraIndex_"+i,size:16,usage:s});r.queue.writeBuffer(n,0,e,0);const a=[{binding:0,resource:{buffer:n}}];return r.createBindGroup({label:"bindGroupCameraIndex_"+i,layout:t,entries:a})}createBindGroup(e,t){const r=this.backend,s=r.device;let i=0;const n=[];for(const t of e.bindings){if(t.isUniformBuffer){const e=r.get(t);if(void 0===e.buffer){const r=t.byteLength,i=GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,n=s.createBuffer({label:"bindingBuffer_"+t.name,size:r,usage:i});e.buffer=n}n.push({binding:i,resource:{buffer:e.buffer}})}else if(t.isStorageBuffer){const e=r.get(t);if(void 0===e.buffer){const s=t.attribute;e.buffer=r.get(s).buffer}n.push({binding:i,resource:{buffer:e.buffer}})}else if(t.isSampler){const e=r.get(t.texture);n.push({binding:i,resource:e.sampler})}else if(t.isSampledTexture){const e=r.get(t.texture);let a;if(void 0!==e.externalTexture)a=s.importExternalTexture({source:e.externalTexture});else{const r=t.store?1:e.texture.mipLevelCount,s=`view-${e.texture.width}-${e.texture.height}-${r}`;if(a=e[s],void 0===a){const i=JE;let n;n=t.isSampledCubeTexture?QE:t.isSampledTexture3D?ZE:t.texture.isDataArrayTexture||t.texture.isCompressedArrayTexture?YE:KE,a=e[s]=e.texture.createView({aspect:i,dimension:n,mipLevelCount:r})}}n.push({binding:i,resource:a})}i++}return s.createBindGroup({label:"bindGroup_"+e.name,layout:t,entries:n})}}class Dw{constructor(e){this.backend=e}_getSampleCount(e){return this.backend.utils.getSampleCountRenderContext(e)}createRenderPipeline(e,t){const{object:r,material:s,geometry:i,pipeline:n}=e,{vertexProgram:a,fragmentProgram:o}=n,u=this.backend,l=u.device,d=u.utils,c=u.get(n),h=[];for(const t of e.getBindings()){const e=u.get(t);h.push(e.layout)}const p=u.attributeUtils.createShaderVertexBuffers(e);let g;!0===s.transparent&&s.blending!==G&&(g=this._getBlending(s));let m={};!0===s.stencilWrite&&(m={compare:this._getStencilCompare(s),failOp:this._getStencilOperation(s.stencilFail),depthFailOp:this._getStencilOperation(s.stencilZFail),passOp:this._getStencilOperation(s.stencilZPass)});const f=this._getColorWriteMask(s),y=[];if(null!==e.context.textures){const t=e.context.textures;for(let e=0;e1},layout:l.createPipelineLayout({bindGroupLayouts:h})},E={},w=e.context.depth,A=e.context.stencil;if(!0!==w&&!0!==A||(!0===w&&(E.format=v,E.depthWriteEnabled=s.depthWrite,E.depthCompare=_),!0===A&&(E.stencilFront=m,E.stencilBack={},E.stencilReadMask=s.stencilFuncMask,E.stencilWriteMask=s.stencilWriteMask),!0===s.polygonOffset&&(E.depthBias=s.polygonOffsetUnits,E.depthBiasSlopeScale=s.polygonOffsetFactor,E.depthBiasClamp=0),S.depthStencil=E),null===t)c.pipeline=l.createRenderPipeline(S);else{const e=new Promise((e=>{l.createRenderPipelineAsync(S).then((t=>{c.pipeline=t,e()}))}));t.push(e)}}createBundleEncoder(e){const t=this.backend,{utils:r,device:s}=t,i=r.getCurrentDepthStencilFormat(e),n={label:"renderBundleEncoder",colorFormats:[r.getCurrentColorFormat(e)],depthStencilFormat:i,sampleCount:this._getSampleCount(e)};return s.createRenderBundleEncoder(n)}createComputePipeline(e,t){const r=this.backend,s=r.device,i=r.get(e.computeProgram).module,n=r.get(e),a=[];for(const e of t){const t=r.get(e);a.push(t.layout)}n.pipeline=s.createComputePipeline({compute:i,layout:s.createPipelineLayout({bindGroupLayouts:a})})}_getBlending(e){let t,r;const s=e.blending,i=e.blendSrc,n=e.blendDst,a=e.blendEquation;if(s===qe){const s=null!==e.blendSrcAlpha?e.blendSrcAlpha:i,o=null!==e.blendDstAlpha?e.blendDstAlpha:n,u=null!==e.blendEquationAlpha?e.blendEquationAlpha:a;t={srcFactor:this._getBlendFactor(i),dstFactor:this._getBlendFactor(n),operation:this._getBlendOperation(a)},r={srcFactor:this._getBlendFactor(s),dstFactor:this._getBlendFactor(o),operation:this._getBlendOperation(u)}}else{const i=(e,s,i,n)=>{t={srcFactor:e,dstFactor:s,operation:vE},r={srcFactor:i,dstFactor:n,operation:vE}};if(e.premultipliedAlpha)switch(s){case V:i(dE,gE,dE,gE);break;case Pt:i(dE,dE,dE,dE);break;case Mt:i(lE,hE,lE,dE);break;case Ct:i(lE,cE,lE,pE)}else switch(s){case V:i(pE,gE,dE,gE);break;case Pt:i(pE,dE,pE,dE);break;case Mt:i(lE,hE,lE,dE);break;case Ct:i(lE,cE,lE,cE)}}if(void 0!==t&&void 0!==r)return{color:t,alpha:r};console.error("THREE.WebGPURenderer: Invalid blending: ",s)}_getBlendFactor(e){let t;switch(e){case Ke:t=lE;break;case Et:t=dE;break;case St:t=cE;break;case bt:t=hE;break;case Nt:t=pE;break;case xt:t=gE;break;case _t:t=mE;break;case yt:t=fE;break;case Tt:t=yE;break;case ft:t=xE;break;case vt:t=bE;break;case 211:t=TE;break;case 212:t=_E;break;default:console.error("THREE.WebGPURenderer: Blend factor not supported.",e)}return t}_getStencilCompare(e){let t;const r=e.stencilFunc;switch(r){case Gr:t=rN;break;case Or:t=lN;break;case Ur:t=sN;break;case Vr:t=nN;break;case Dr:t=iN;break;case Ir:t=uN;break;case Br:t=aN;break;case Fr:t=oN;break;default:console.error("THREE.WebGPURenderer: Invalid stencil function.",r)}return t}_getStencilOperation(e){let t;switch(e){case Xr:t=CE;break;case qr:t=ME;break;case jr:t=PE;break;case Wr:t=LE;break;case Hr:t=FE;break;case $r:t=BE;break;case zr:t=IE;break;case kr:t=DE;break;default:console.error("THREE.WebGPURenderer: Invalid stencil operation.",t)}return t}_getBlendOperation(e){let t;switch(e){case Xe:t=vE;break;case mt:t=NE;break;case gt:t=SE;break;case Yr:t=EE;break;case Kr:t=wE;break;default:console.error("THREE.WebGPUPipelineUtils: Blend equation not supported.",e)}return t}_getPrimitiveState(e,t,r){const s={},i=this.backend.utils;switch(s.topology=i.getPrimitiveTopology(e,r),null!==t.index&&!0===e.isLine&&!0!==e.isLineSegments&&(s.stripIndexFormat=t.index.array instanceof Uint16Array?yN:xN),r.side){case je:s.frontFace=pN,s.cullMode=fN;break;case N:s.frontFace=pN,s.cullMode=mN;break;case Se:s.frontFace=pN,s.cullMode=gN;break;default:console.error("THREE.WebGPUPipelineUtils: Unknown material.side value.",r.side)}return s}_getColorWriteMask(e){return!0===e.colorWrite?RE:AE}_getDepthCompare(e){let t;if(!1===e.depthTest)t=lN;else{const r=e.depthFunc;switch(r){case Ot:t=rN;break;case Ut:t=lN;break;case Vt:t=sN;break;case Dt:t=nN;break;case It:t=iN;break;case Bt:t=uN;break;case Ft:t=aN;break;case Lt:t=oN;break;default:console.error("THREE.WebGPUPipelineUtils: Invalid depth function.",r)}}return t}}class Vw extends Xv{constructor(e,t,r=2048){super(r),this.device=e,this.type=t,this.querySet=this.device.createQuerySet({type:"timestamp",count:this.maxQueries,label:`queryset_global_timestamp_${t}`});const s=8*this.maxQueries;this.resolveBuffer=this.device.createBuffer({label:`buffer_timestamp_resolve_${t}`,size:s,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC}),this.resultBuffer=this.device.createBuffer({label:`buffer_timestamp_result_${t}`,size:s,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ})}allocateQueriesForContext(e){if(!this.trackTimestamp||this.isDisposed)return null;if(this.currentQueryIndex+2>this.maxQueries)return ht(`WebGPUTimestampQueryPool [${this.type}]: Maximum number of queries exceeded, when using trackTimestamp it is necessary to resolves the queries via renderer.resolveTimestampsAsync( THREE.TimestampQuery.${this.type.toUpperCase()} ).`),null;const t=this.currentQueryIndex;return this.currentQueryIndex+=2,this.queryOffsets.set(e.id,t),t}async resolveQueriesAsync(){if(!this.trackTimestamp||0===this.currentQueryIndex||this.isDisposed)return this.lastValue;if(this.pendingResolve)return this.pendingResolve;this.pendingResolve=this._resolveQueries();try{return await this.pendingResolve}finally{this.pendingResolve=null}}async _resolveQueries(){if(this.isDisposed)return this.lastValue;try{if("unmapped"!==this.resultBuffer.mapState)return this.lastValue;const e=new Map(this.queryOffsets),t=this.currentQueryIndex,r=8*t;this.currentQueryIndex=0,this.queryOffsets.clear();const s=this.device.createCommandEncoder();s.resolveQuerySet(this.querySet,0,t,this.resolveBuffer,0),s.copyBufferToBuffer(this.resolveBuffer,0,this.resultBuffer,0,r);const i=s.finish();if(this.device.queue.submit([i]),"unmapped"!==this.resultBuffer.mapState)return this.lastValue;if(await this.resultBuffer.mapAsync(GPUMapMode.READ,0,r),this.isDisposed)return"mapped"===this.resultBuffer.mapState&&this.resultBuffer.unmap(),this.lastValue;const n=new BigUint64Array(this.resultBuffer.getMappedRange(0,r));let a=0;for(const[,t]of e){const e=n[t],r=n[t+1];a+=Number(r-e)/1e6}return this.resultBuffer.unmap(),this.lastValue=a,a}catch(e){return console.error("Error resolving queries:",e),"mapped"===this.resultBuffer.mapState&&this.resultBuffer.unmap(),this.lastValue}}async dispose(){if(!this.isDisposed){if(this.isDisposed=!0,this.pendingResolve)try{await this.pendingResolve}catch(e){console.error("Error waiting for pending resolve:",e)}if(this.resultBuffer&&"mapped"===this.resultBuffer.mapState)try{this.resultBuffer.unmap()}catch(e){console.error("Error unmapping buffer:",e)}this.querySet&&(this.querySet.destroy(),this.querySet=null),this.resolveBuffer&&(this.resolveBuffer.destroy(),this.resolveBuffer=null),this.resultBuffer&&(this.resultBuffer.destroy(),this.resultBuffer=null),this.queryOffsets.clear(),this.pendingResolve=null}}}class Uw extends Pv{constructor(e={}){super(e),this.isWebGPUBackend=!0,this.parameters.alpha=void 0===e.alpha||e.alpha,this.parameters.requiredLimits=void 0===e.requiredLimits?{}:e.requiredLimits,this.device=null,this.context=null,this.colorBuffer=null,this.defaultRenderPassdescriptor=null,this.utils=new Mw(this),this.attributeUtils=new Bw(this),this.bindingUtils=new Iw(this),this.pipelineUtils=new Dw(this),this.textureUtils=new cw(this),this.occludedResolveCache=new Map}async init(e){await super.init(e);const t=this.parameters;let r;if(void 0===t.device){const e={powerPreference:t.powerPreference},s="undefined"!=typeof navigator?await navigator.gpu.requestAdapter(e):null;if(null===s)throw new Error("WebGPUBackend: Unable to create WebGPU adapter.");const i=Object.values(rw),n=[];for(const e of i)s.features.has(e)&&n.push(e);const a={requiredFeatures:n,requiredLimits:t.requiredLimits};r=await s.requestDevice(a)}else r=t.device;r.lost.then((t=>{const r={api:"WebGPU",message:t.message||"Unknown reason",reason:t.reason||null,originalEvent:t};e.onDeviceLost(r)}));const s=void 0!==t.context?t.context:e.domElement.getContext("webgpu");this.device=r,this.context=s;const i=t.alpha?"premultiplied":"opaque";this.trackTimestamp=this.trackTimestamp&&this.hasFeature(rw.TimestampQuery),this.context.configure({device:this.device,format:this.utils.getPreferredCanvasFormat(),usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.COPY_SRC,alphaMode:i}),this.updateSize()}get coordinateSystem(){return d}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}getContext(){return this.context}_getDefaultRenderPassDescriptor(){let e=this.defaultRenderPassdescriptor;if(null===e){const t=this.renderer;e={colorAttachments:[{view:null}]},!0!==this.renderer.depth&&!0!==this.renderer.stencil||(e.depthStencilAttachment={view:this.textureUtils.getDepthBuffer(t.depth,t.stencil).createView()});const r=e.colorAttachments[0];this.renderer.samples>0?r.view=this.colorBuffer.createView():r.resolveTarget=void 0,this.defaultRenderPassdescriptor=e}const t=e.colorAttachments[0];return this.renderer.samples>0?t.resolveTarget=this.context.getCurrentTexture().createView():t.view=this.context.getCurrentTexture().createView(),e}_getRenderPassDescriptor(e,t={}){const r=e.renderTarget,s=this.get(r);let i=s.descriptors;if(void 0===i||s.width!==r.width||s.height!==r.height||s.dimensions!==r.dimensions||s.activeMipmapLevel!==e.activeMipmapLevel||s.activeCubeFace!==e.activeCubeFace||s.samples!==r.samples){i={},s.descriptors=i;const e=()=>{r.removeEventListener("dispose",e),this.delete(r)};!1===r.hasEventListener("dispose",e)&&r.addEventListener("dispose",e)}const n=e.getCacheKey();let a=i[n];if(void 0===a){const t=e.textures,o=[];let u;for(let s=0;s0&&(t.currentOcclusionQuerySet&&t.currentOcclusionQuerySet.destroy(),t.currentOcclusionQueryBuffer&&t.currentOcclusionQueryBuffer.destroy(),t.currentOcclusionQuerySet=t.occlusionQuerySet,t.currentOcclusionQueryBuffer=t.occlusionQueryBuffer,t.currentOcclusionQueryObjects=t.occlusionQueryObjects,i=r.createQuerySet({type:"occlusion",count:s,label:`occlusionQuerySet_${e.id}`}),t.occlusionQuerySet=i,t.occlusionQueryIndex=0,t.occlusionQueryObjects=new Array(s),t.lastOcclusionObject=null),n=null===e.textures?this._getDefaultRenderPassDescriptor():this._getRenderPassDescriptor(e,{loadOp:cN}),this.initTimestampQuery(e,n),n.occlusionQuerySet=i;const a=n.depthStencilAttachment;if(null!==e.textures){const t=n.colorAttachments;for(let r=0;r0&&t.currentPass.executeBundles(t.renderBundles),r>t.occlusionQueryIndex&&t.currentPass.endOcclusionQuery(),t.currentPass.end(),r>0){const s=8*r;let i=this.occludedResolveCache.get(s);void 0===i&&(i=this.device.createBuffer({size:s,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC}),this.occludedResolveCache.set(s,i));const n=this.device.createBuffer({size:s,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});t.encoder.resolveQuerySet(t.occlusionQuerySet,0,r,i,0),t.encoder.copyBufferToBuffer(i,0,n,0,s),t.occlusionQueryBuffer=n,this.resolveOccludedAsync(e)}if(this.device.queue.submit([t.encoder.finish()]),null!==e.textures){const t=e.textures;for(let e=0;ea?(u.x=Math.min(t.dispatchCount,a),u.y=Math.ceil(t.dispatchCount/a)):u.x=t.dispatchCount,i.dispatchWorkgroups(u.x,u.y,u.z)}finishCompute(e){const t=this.get(e);t.passEncoderGPU.end(),this.device.queue.submit([t.cmdEncoderGPU.finish()])}async waitForGPU(){await this.device.queue.onSubmittedWorkDone()}draw(e,t){const{object:r,material:s,context:i,pipeline:n}=e,a=e.getBindings(),o=this.get(i),u=this.get(n).pipeline,l=o.currentSets,d=o.currentPass,c=e.getDrawParameters();if(null===c)return;l.pipeline!==u&&(d.setPipeline(u),l.pipeline=u);const h=l.bindingGroups;for(let e=0,t=a.length;e{if(!0===r.isBatchedMesh){const e=r._multiDrawStarts,s=r._multiDrawCounts,i=r._multiDrawCount,n=r._multiDrawInstances;null!==n&&ht("THREE.WebGPUBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.");for(let a=0;a1?0:a;!0===g?d.drawIndexed(s[a],i,e[a]/p.array.BYTES_PER_ELEMENT,0,o):d.draw(s[a],i,e[a],o),t.update(r,s[a],i)}}else if(!0===g){const{vertexCount:s,instanceCount:i,firstVertex:n}=c,a=e.getIndirect();if(null!==a){const e=this.get(a).buffer;d.drawIndexedIndirect(e,0)}else d.drawIndexed(s,i,n,0,0);t.update(r,s,i)}else{const{vertexCount:s,instanceCount:i,firstVertex:n}=c,a=e.getIndirect();if(null!==a){const e=this.get(a).buffer;d.drawIndirect(e,0)}else d.draw(s,i,n,0);t.update(r,s,i)}};if(e.camera.isArrayCamera&&e.camera.cameras.length>0){const t=this.get(e.camera),s=e.camera.cameras,n=e.getBindingGroup("cameraIndex");if(void 0===t.indexesGPU||t.indexesGPU.length!==s.length){const e=this.get(n),r=[],i=new Uint32Array([0,0,0,0]);for(let t=0,n=s.length;t(console.warn("THREE.WebGPURenderer: WebGPU is not available, running under WebGL2 backend."),new Yv(e)));super(new t(e),e),this.library=new Gw,this.isWebGPURenderer=!0}}class zw extends ds{constructor(){super(),this.isBundleGroup=!0,this.type="BundleGroup",this.static=!0,this.version=0}set needsUpdate(e){!0===e&&this.version++}}class $w{constructor(e,t=tn(0,0,1,1)){this.renderer=e,this.outputNode=t,this.outputColorTransform=!0,this.needsUpdate=!0;const r=new Fh;r.name="PostProcessing",this._quadMesh=new dy(r)}render(){this._update();const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=p,e.outputColorSpace=de;const s=e.xr.enabled;e.xr.enabled=!1,this._quadMesh.render(e),e.xr.enabled=s,e.toneMapping=t,e.outputColorSpace=r}dispose(){this._quadMesh.material.dispose()}_update(){if(!0===this.needsUpdate){const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;this._quadMesh.material.fragmentNode=!0===this.outputColorTransform?Fu(this.outputNode,t,r):this.outputNode.context({toneMapping:t,outputColorSpace:r}),this._quadMesh.material.needsUpdate=!0,this.needsUpdate=!1}}async renderAsync(){this._update();const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=p,e.outputColorSpace=de;const s=e.xr.enabled;e.xr.enabled=!1,await this._quadMesh.renderAsync(e),e.xr.enabled=s,e.toneMapping=t,e.outputColorSpace=r}}class Hw extends pe{constructor(e=1,t=1){super(),this.image={width:e,height:t},this.magFilter=q,this.minFilter=q,this.isStorageTexture=!0}}class Ww extends xy{constructor(e,t){super(e,t,Uint32Array),this.isIndirectStorageBufferAttribute=!0}}class jw extends cs{constructor(e){super(e),this.textures={},this.nodes={}}load(e,t,r,s){const i=new hs(this.manager);i.setPath(this.path),i.setRequestHeader(this.requestHeader),i.setWithCredentials(this.withCredentials),i.load(e,(r=>{try{t(this.parse(JSON.parse(r)))}catch(t){s?s(t):console.error(t),this.manager.itemError(e)}}),r,s)}parseNodes(e){const t={};if(void 0!==e){for(const r of e){const{uuid:e,type:s}=r;t[e]=this.createNodeFromType(s),t[e].uuid=e}const r={nodes:t,textures:this.textures};for(const s of e){s.meta=r;t[s.uuid].deserialize(s),delete s.meta}}return t}parse(e){const t=this.createNodeFromType(e.type);t.uuid=e.uuid;const r={nodes:this.parseNodes(e.nodes),textures:this.textures};return e.meta=r,t.deserialize(e),delete e.meta,t}setTextures(e){return this.textures=e,this}setNodes(e){return this.nodes=e,this}createNodeFromType(e){return void 0===this.nodes[e]?(console.error("THREE.NodeLoader: Node type not found:",e),$i()):Pi(new this.nodes[e])}}class qw extends ps{constructor(e){super(e),this.nodes={},this.nodeMaterials={}}parse(e){const t=super.parse(e),r=this.nodes,s=e.inputNodes;for(const e in s){const i=s[e];t[e]=r[i]}return t}setNodes(e){return this.nodes=e,this}setNodeMaterials(e){return this.nodeMaterials=e,this}createMaterialFromType(e){const t=this.nodeMaterials[e];return void 0!==t?new t:super.createMaterialFromType(e)}}class Xw extends gs{constructor(e){super(e),this.nodes={},this.nodeMaterials={},this._nodesJSON=null}setNodes(e){return this.nodes=e,this}setNodeMaterials(e){return this.nodeMaterials=e,this}parse(e,t){this._nodesJSON=e.nodes;const r=super.parse(e,t);return this._nodesJSON=null,r}parseNodes(e,t){if(void 0!==e){const r=new jw;return r.setNodes(this.nodes),r.setTextures(t),r.parseNodes(e)}return{}}parseMaterials(e,t){const r={};if(void 0!==e){const s=this.parseNodes(this._nodesJSON,t),i=new qw;i.setTextures(t),i.setNodes(s),i.setNodeMaterials(this.nodeMaterials);for(let t=0,s=e.length;t0){const{width:r,height:s}=e.context;t.bufferWidth=r,t.bufferHeight=s}this.renderObjects.set(e,t)}return t}getAttributesData(e){const t={};for(const r in e){const s=e[r];t[r]={version:s.version}}return t}containsNode(e){const t=e.material;for(const e in t)if(t[e]&&t[e].isNode)return!0;return null!==e.renderer.nodes.modelViewMatrix||null!==e.renderer.nodes.modelNormalViewMatrix}getMaterialData(e){const t={};for(const r of this.refreshUniforms){const s=e[r];null!=s&&("object"==typeof s&&void 0!==s.clone?!0===s.isTexture?t[r]={id:s.id,version:s.version}:t[r]=s.clone():t[r]=s)}return t}equals(e){const{object:t,material:r,geometry:s}=e,i=this.getRenderObjectData(e);if(!0!==i.worldMatrix.equals(t.matrixWorld))return i.worldMatrix.copy(t.matrixWorld),!1;const n=i.material;for(const e in n){const t=n[e],s=r[e];if(void 0!==t.equals){if(!1===t.equals(s))return t.copy(s),!1}else if(!0===s.isTexture){if(t.id!==s.id||t.version!==s.version)return t.id=s.id,t.version=s.version,!1}else if(t!==s)return n[e]=s,!1}if(n.transmission>0){const{width:t,height:r}=e.context;if(i.bufferWidth!==t||i.bufferHeight!==r)return i.bufferWidth=t,i.bufferHeight=r,!1}const a=i.geometry,o=s.attributes,u=a.attributes,l=Object.keys(u),d=Object.keys(o);if(a.id!==s.id)return a.id=s.id,!1;if(l.length!==d.length)return i.geometry.attributes=this.getAttributesData(o),!1;for(const e of l){const t=u[e],r=o[e];if(void 0===r)return delete u[e],!1;if(t.version!==r.version)return t.version=r.version,!1}const c=s.index,h=a.indexVersion,p=c?c.version:null;if(h!==p)return a.indexVersion=p,!1;if(a.drawRange.start!==s.drawRange.start||a.drawRange.count!==s.drawRange.count)return a.drawRange.start=s.drawRange.start,a.drawRange.count=s.drawRange.count,!1;if(i.morphTargetInfluences){let e=!1;for(let r=0;r>>16,2246822507),r^=Math.imul(s^s>>>13,3266489909),s=Math.imul(s^s>>>16,2246822507),s^=Math.imul(r^r>>>13,3266489909),4294967296*(2097151&s)+(r>>>0)}const xs=e=>ys(e),bs=e=>ys(e),Ts=(...e)=>ys(e);function _s(e,t=!1){const r=[];!0===e.isNode&&(r.push(e.id),e=e.getSelf());for(const{property:s,childNode:i}of vs(e))r.push(ys(s.slice(0,-4)),i.getCacheKey(t));return ys(r)}function*vs(e,t=!1){for(const r in e){if(!0===r.startsWith("_"))continue;const s=e[r];if(!0===Array.isArray(s))for(let e=0;ee.charCodeAt(0))).buffer}var Fs=Object.freeze({__proto__:null,arrayBufferToBase64:Ps,base64ToArrayBuffer:Ls,getCacheKey:_s,getDataFromObject:Ms,getLengthFromType:As,getNodeChildren:vs,getTypeFromLength:Es,getTypedArrayFromType:ws,getValueFromType:Cs,getValueType:Rs,hash:Ts,hashArray:bs,hashString:xs});const Bs={VERTEX:"vertex",FRAGMENT:"fragment"},Is={NONE:"none",FRAME:"frame",RENDER:"render",OBJECT:"object"},Ds={BOOLEAN:"bool",INTEGER:"int",FLOAT:"float",VECTOR2:"vec2",VECTOR3:"vec3",VECTOR4:"vec4",MATRIX2:"mat2",MATRIX3:"mat3",MATRIX4:"mat4"},Vs={READ_ONLY:"readOnly",WRITE_ONLY:"writeOnly",READ_WRITE:"readWrite"},Us=["fragment","vertex"],Os=["setup","analyze","generate"],Gs=[...Us,"compute"],ks=["x","y","z","w"];let zs=0;class $s extends o{static get type(){return"Node"}constructor(e=null){super(),this.nodeType=e,this.updateType=Is.NONE,this.updateBeforeType=Is.NONE,this.updateAfterType=Is.NONE,this.uuid=u.generateUUID(),this.version=0,this.global=!1,this.isNode=!0,this._cacheKey=null,this._cacheKeyVersion=0,Object.defineProperty(this,"id",{value:zs++})}set needsUpdate(e){!0===e&&this.version++}get type(){return this.constructor.type}onUpdate(e,t){return this.updateType=t,this.update=e.bind(this.getSelf()),this}onFrameUpdate(e){return this.onUpdate(e,Is.FRAME)}onRenderUpdate(e){return this.onUpdate(e,Is.RENDER)}onObjectUpdate(e){return this.onUpdate(e,Is.OBJECT)}onReference(e){return this.updateReference=e.bind(this.getSelf()),this}getSelf(){return this.self||this}updateReference(){return this}isGlobal(){return this.global}*getChildren(){for(const{childNode:e}of vs(this))yield e}dispose(){this.dispatchEvent({type:"dispose"})}traverse(e){e(this);for(const t of this.getChildren())t.traverse(e)}getCacheKey(e=!1){return!0!==(e=e||this.version!==this._cacheKeyVersion)&&null!==this._cacheKey||(this._cacheKey=Ts(_s(this,e),this.customCacheKey()),this._cacheKeyVersion=this.version),this._cacheKey}customCacheKey(){return 0}getScope(){return this}getHash(){return this.uuid}getUpdateType(){return this.updateType}getUpdateBeforeType(){return this.updateBeforeType}getUpdateAfterType(){return this.updateAfterType}getElementType(e){const t=this.getNodeType(e);return e.getElementType(t)}getMemberType(){return"void"}getNodeType(e){const t=e.getNodeProperties(this);return t.outputNode?t.outputNode.getNodeType(e):this.nodeType}getShared(e){const t=this.getHash(e);return e.getNodeFromHash(t)||this}setup(e){const t=e.getNodeProperties(this);let r=0;for(const e of this.getChildren())t["node"+r++]=e;return t.outputNode||null}analyze(e){if(1===e.increaseUsage(this)){const t=e.getNodeProperties(this);for(const r of Object.values(t))r&&!0===r.isNode&&r.build(e)}}generate(e,t){const{outputNode:r}=e.getNodeProperties(this);if(r&&!0===r.isNode)return r.build(e,t)}updateBefore(){console.warn("Abstract function.")}updateAfter(){console.warn("Abstract function.")}update(){console.warn("Abstract function.")}build(e,t=null){const r=this.getShared(e);if(this!==r)return r.build(e,t);e.addNode(this),e.addChain(this);let s=null;const i=e.getBuildStage();if("setup"===i){this.updateReference(e);const t=e.getNodeProperties(this);if(!0!==t.initialized){t.initialized=!0;const r=this.setup(e),s=r&&!0===r.isNode;for(const r of Object.values(t))r&&!0===r.isNode&&r.build(e);s&&r.build(e),t.outputNode=r}}else if("analyze"===i)this.analyze(e);else if("generate"===i){if(1===this.generate.length){const r=this.getNodeType(e),i=e.getDataFromNode(this);s=i.snippet,void 0===s?void 0===i.generated?(i.generated=!0,s=this.generate(e)||"",i.snippet=s):(console.warn("THREE.Node: Recursion detected.",this),s=""):void 0!==i.flowCodes&&void 0!==e.context.nodeBlock&&e.addFlowCodeHierarchy(this,e.context.nodeBlock),s=e.format(s,r,t)}else s=this.generate(e,t)||""}return e.removeChain(this),e.addSequentialNode(this),s}getSerializeChildren(){return vs(this)}serialize(e){const t=this.getSerializeChildren(),r={};for(const{property:s,index:i,childNode:n}of t)void 0!==i?(void 0===r[s]&&(r[s]=Number.isInteger(i)?[]:{}),r[s][i]=n.toJSON(e.meta).uuid):r[s]=n.toJSON(e.meta).uuid;Object.keys(r).length>0&&(e.inputNodes=r)}deserialize(e){if(void 0!==e.inputNodes){const t=e.meta.nodes;for(const r in e.inputNodes)if(Array.isArray(e.inputNodes[r])){const s=[];for(const i of e.inputNodes[r])s.push(t[i]);this[r]=s}else if("object"==typeof e.inputNodes[r]){const s={};for(const i in e.inputNodes[r]){const n=e.inputNodes[r][i];s[i]=t[n]}this[r]=s}else{const s=e.inputNodes[r];this[r]=t[s]}}}toJSON(e){const{uuid:t,type:r}=this,s=void 0===e||"string"==typeof e;s&&(e={textures:{},images:{},nodes:{}});let i=e.nodes[t];function n(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(void 0===i&&(i={uuid:t,type:r,meta:e,metadata:{version:4.6,type:"Node",generator:"Node.toJSON"}},!0!==s&&(e.nodes[i.uuid]=i),this.serialize(i),delete i.meta),s){const t=n(e.textures),r=n(e.images),s=n(e.nodes);t.length>0&&(i.textures=t),r.length>0&&(i.images=r),s.length>0&&(i.nodes=s)}return i}}class Hs extends $s{static get type(){return"ArrayElementNode"}constructor(e,t){super(),this.node=e,this.indexNode=t,this.isArrayElementNode=!0}getNodeType(e){return this.node.getElementType(e)}generate(e){const t=this.indexNode.getNodeType(e);return`${this.node.build(e)}[ ${this.indexNode.build(e,!e.isVector(t)&&e.isInteger(t)?t:"uint")} ]`}}class Ws extends $s{static get type(){return"ConvertNode"}constructor(e,t){super(),this.node=e,this.convertTo=t}getNodeType(e){const t=this.node.getNodeType(e);let r=null;for(const s of this.convertTo.split("|"))null!==r&&e.getTypeLength(t)!==e.getTypeLength(s)||(r=s);return r}serialize(e){super.serialize(e),e.convertTo=this.convertTo}deserialize(e){super.deserialize(e),this.convertTo=e.convertTo}generate(e,t){const r=this.node,s=this.getNodeType(e),i=r.build(e,s);return e.format(i,s,t)}}class js extends $s{static get type(){return"TempNode"}constructor(e=null){super(e),this.isTempNode=!0}hasDependencies(e){return e.getDataFromNode(this).usageCount>1}build(e,t){if("generate"===e.getBuildStage()){const r=e.getVectorType(this.getNodeType(e,t)),s=e.getDataFromNode(this);if(void 0!==s.propertyName)return e.format(s.propertyName,r,t);if("void"!==r&&"void"!==t&&this.hasDependencies(e)){const i=super.build(e,r),n=e.getVarFromNode(this,null,r),a=e.getPropertyName(n);return e.addLineFlowCode(`${a} = ${i}`,this),s.snippet=i,s.propertyName=a,e.format(s.propertyName,r,t)}}return super.build(e,t)}}class qs extends js{static get type(){return"JoinNode"}constructor(e=[],t=null){super(t),this.nodes=e}getNodeType(e){return null!==this.nodeType?e.getVectorType(this.nodeType):e.getTypeFromLength(this.nodes.reduce(((t,r)=>t+e.getTypeLength(r.getNodeType(e))),0))}generate(e,t){const r=this.getNodeType(e),s=e.getTypeLength(r),i=this.nodes,n=e.getComponentType(r),a=[];let o=0;for(const t of i){if(o>=s){console.error(`THREE.TSL: Length of parameters exceeds maximum length of function '${r}()' type.`);break}let i,u=t.getNodeType(e),l=e.getTypeLength(u);o+l>s&&(console.error(`THREE.TSL: Length of '${r}()' data exceeds maximum length of output type.`),l=s-o,u=e.getTypeFromLength(l)),o+=l,i=t.build(e,u);const d=e.getComponentType(u);d!==n&&(i=e.format(i,d,n)),a.push(i)}const u=`${e.getType(r)}( ${a.join(", ")} )`;return e.format(u,r,t)}}const Xs=ks.join("");class Ks extends $s{static get type(){return"SplitNode"}constructor(e,t="x"){super(),this.node=e,this.components=t,this.isSplitNode=!0}getVectorLength(){let e=this.components.length;for(const t of this.components)e=Math.max(ks.indexOf(t)+1,e);return e}getComponentType(e){return e.getComponentType(this.node.getNodeType(e))}getNodeType(e){return e.getTypeFromLength(this.components.length,this.getComponentType(e))}generate(e,t){const r=this.node,s=e.getTypeLength(r.getNodeType(e));let i=null;if(s>1){let n=null;this.getVectorLength()>=s&&(n=e.getTypeFromLength(this.getVectorLength(),this.getComponentType(e)));const a=r.build(e,n);i=this.components.length===s&&this.components===Xs.slice(0,this.components.length)?e.format(a,n,t):e.format(`${a}.${this.components}`,this.getNodeType(e),t)}else i=r.build(e,t);return i}serialize(e){super.serialize(e),e.components=this.components}deserialize(e){super.deserialize(e),this.components=e.components}}class Ys extends js{static get type(){return"SetNode"}constructor(e,t,r){super(),this.sourceNode=e,this.components=t,this.targetNode=r}getNodeType(e){return this.sourceNode.getNodeType(e)}generate(e){const{sourceNode:t,components:r,targetNode:s}=this,i=this.getNodeType(e),n=e.getComponentType(s.getNodeType(e)),a=e.getTypeFromLength(r.length,n),o=s.build(e,a),u=t.build(e,i),l=e.getTypeLength(i),d=[];for(let e=0;ee.replace(/r|s/g,"x").replace(/g|t/g,"y").replace(/b|p/g,"z").replace(/a|q/g,"w"),ai=e=>ni(e).split("").sort().join(""),oi={setup(e,t){const r=t.shift();return e(Li(r),...t)},get(e,t,r){if("string"==typeof t&&void 0===e[t]){if(!0!==e.isStackNode&&"assign"===t)return(...e)=>(ri.assign(r,...e),r);if(si.has(t)){const s=si.get(t);return e.isStackNode?(...e)=>r.add(s(...e)):(...e)=>s(r,...e)}if("self"===t)return e;if(t.endsWith("Assign")&&si.has(t.slice(0,t.length-6))){const s=si.get(t.slice(0,t.length-6));return e.isStackNode?(...e)=>r.assign(e[0],s(...e)):(...e)=>r.assign(s(r,...e))}if(!0===/^[xyzwrgbastpq]{1,4}$/.test(t))return t=ni(t),Pi(new Ks(r,t));if(!0===/^set[XYZWRGBASTPQ]{1,4}$/.test(t))return t=ai(t.slice(3).toLowerCase()),r=>Pi(new Ys(e,t,r));if(!0===/^flip[XYZWRGBASTPQ]{1,4}$/.test(t))return t=ai(t.slice(4).toLowerCase()),()=>Pi(new Qs(Pi(e),t));if("width"===t||"height"===t||"depth"===t)return"width"===t?t="x":"height"===t?t="y":"depth"===t&&(t="z"),Pi(new Ks(e,t));if(!0===/^\d+$/.test(t))return Pi(new Hs(r,new ei(Number(t),"uint")));if(!0===/^get$/.test(t))return e=>Pi(new ti(r,e))}return Reflect.get(e,t,r)},set:(e,t,r,s)=>"string"!=typeof t||void 0!==e[t]||!0!==/^[xyzwrgbastpq]{1,4}$/.test(t)&&"width"!==t&&"height"!==t&&"depth"!==t&&!0!==/^\d+$/.test(t)?Reflect.set(e,t,r,s):(s[t].assign(r),!0)},ui=new WeakMap,li=new WeakMap,di=function(e,t=null){for(const r in e)e[r]=Pi(e[r],t);return e},ci=function(e,t=null){const r=e.length;for(let s=0;sPi(null!==s?Object.assign(e,s):e);let n,a,o,u=t;function l(t){let r;return r=u?/[a-z]/i.test(u)?u+"()":u:e.type,void 0!==a&&t.lengtho?(console.error(`THREE.TSL: "${r}" parameter length exceeds limit.`),t.slice(0,o)):t}return null===t?n=(...t)=>i(new e(...Fi(l(t)))):null!==r?(r=Pi(r),n=(...s)=>i(new e(t,...Fi(l(s)),r))):n=(...r)=>i(new e(t,...Fi(l(r)))),n.setParameterLength=(...e)=>(1===e.length?a=o=e[0]:2===e.length&&([a,o]=e),n),n.setName=e=>(u=e,n),n},pi=function(e,...t){return Pi(new e(...Fi(t)))};class gi extends $s{constructor(e,t){super(),this.shaderNode=e,this.inputNodes=t}getNodeType(e){return this.shaderNode.nodeType||this.getOutputNode(e).getNodeType(e)}getMemberType(e,t){return this.getOutputNode(e).getMemberType(e,t)}call(e){const{shaderNode:t,inputNodes:r}=this,s=e.getNodeProperties(t);if(s.onceOutput)return s.onceOutput;let i=null;if(t.layout){let s=li.get(e.constructor);void 0===s&&(s=new WeakMap,li.set(e.constructor,s));let n=s.get(t);void 0===n&&(n=Pi(e.buildFunctionNode(t)),s.set(t,n)),e.addInclude(n),i=Pi(n.call(r))}else{const s=t.jsFunc,n=null!==r||s.length>1?s(r||[],e):s(e);i=Pi(n)}return t.once&&(s.onceOutput=i),i}getOutputNode(e){const t=e.getNodeProperties(this);return null===t.outputNode&&(t.outputNode=this.setupOutput(e)),t.outputNode}setup(e){return this.getOutputNode(e)}setupOutput(e){return e.addStack(),e.stack.outputNode=this.call(e),e.removeStack()}generate(e,t){return this.getOutputNode(e).build(e,t)}}class mi extends $s{constructor(e,t){super(t),this.jsFunc=e,this.layout=null,this.global=!0,this.once=!1}setLayout(e){return this.layout=e,this}call(e=null){return Li(e),Pi(new gi(this,e))}setup(){return this.call()}}const fi=[!1,!0],yi=[0,1,2,3],xi=[-1,-2],bi=[.5,1.5,1/3,1e-6,1e6,Math.PI,2*Math.PI,1/Math.PI,2/Math.PI,1/(2*Math.PI),Math.PI/2],Ti=new Map;for(const e of fi)Ti.set(e,new ei(e));const _i=new Map;for(const e of yi)_i.set(e,new ei(e,"uint"));const vi=new Map([..._i].map((e=>new ei(e.value,"int"))));for(const e of xi)vi.set(e,new ei(e,"int"));const Ni=new Map([...vi].map((e=>new ei(e.value))));for(const e of bi)Ni.set(e,new ei(e));for(const e of bi)Ni.set(-e,new ei(-e));const Si={bool:Ti,uint:_i,ints:vi,float:Ni},Ei=new Map([...Ti,...Ni]),wi=(e,t)=>Ei.has(e)?Ei.get(e):!0===e.isNode?e:new ei(e,t),Ai=function(e,t=null){return(...r)=>{if((0===r.length||!["bool","float","int","uint"].includes(e)&&r.every((e=>"object"!=typeof e)))&&(r=[Cs(e,...r)]),1===r.length&&null!==t&&t.has(r[0]))return Pi(t.get(r[0]));if(1===r.length){const t=wi(r[0],e);return(e=>{try{return e.getNodeType()}catch(e){return}})(t)===e?Pi(t):Pi(new Ws(t,e))}const s=r.map((e=>wi(e)));return Pi(new qs(s,e))}},Ri=e=>"object"==typeof e&&null!==e?e.value:e,Ci=e=>null!=e?e.nodeType||e.convertTo||("string"==typeof e?e:null):null;function Mi(e,t){return new Proxy(new mi(e,t),oi)}const Pi=(e,t=null)=>function(e,t=null){const r=Rs(e);if("node"===r){let t=ui.get(e);return void 0===t&&(t=new Proxy(e,oi),ui.set(e,t),ui.set(t,t)),t}return null===t&&("float"===r||"boolean"===r)||r&&"shader"!==r&&"string"!==r?Pi(wi(e,t)):"shader"===r?Vi(e):e}(e,t),Li=(e,t=null)=>new di(e,t),Fi=(e,t=null)=>new ci(e,t),Bi=(...e)=>new hi(...e),Ii=(...e)=>new pi(...e);let Di=0;const Vi=(e,t=null)=>{let r=null;null!==t&&("object"==typeof t?r=t.return:("string"==typeof t?r=t:console.error("THREE.TSL: Invalid layout type."),t=null));const s=new Mi(e,r),i=(...e)=>{let t;return Li(e),t=e[0]&&e[0].isNode?[...e]:e[0],s.call(t)};if(i.shaderNode=s,i.setLayout=e=>(s.setLayout(e),i),i.once=()=>(s.once=!0,i),null!==t){if("object"!=typeof t.inputs){const e={name:"fn"+Di++,type:r,inputs:[]};for(const r in t)"return"!==r&&e.inputs.push({name:r,type:t[r]});t=e}i.setLayout(t)}return i};ii("toGlobal",(e=>(e.global=!0,e)));const Ui=e=>{ri=e},Oi=()=>ri,Gi=(...e)=>ri.If(...e);function ki(e){return ri&&ri.add(e),e}ii("append",ki);const zi=new Ai("color"),$i=new Ai("float",Si.float),Hi=new Ai("int",Si.ints),Wi=new Ai("uint",Si.uint),ji=new Ai("bool",Si.bool),qi=new Ai("vec2"),Xi=new Ai("ivec2"),Ki=new Ai("uvec2"),Yi=new Ai("bvec2"),Qi=new Ai("vec3"),Zi=new Ai("ivec3"),Ji=new Ai("uvec3"),en=new Ai("bvec3"),tn=new Ai("vec4"),rn=new Ai("ivec4"),sn=new Ai("uvec4"),nn=new Ai("bvec4"),an=new Ai("mat2"),on=new Ai("mat3"),un=new Ai("mat4");ii("toColor",zi),ii("toFloat",$i),ii("toInt",Hi),ii("toUint",Wi),ii("toBool",ji),ii("toVec2",qi),ii("toIVec2",Xi),ii("toUVec2",Ki),ii("toBVec2",Yi),ii("toVec3",Qi),ii("toIVec3",Zi),ii("toUVec3",Ji),ii("toBVec3",en),ii("toVec4",tn),ii("toIVec4",rn),ii("toUVec4",sn),ii("toBVec4",nn),ii("toMat2",an),ii("toMat3",on),ii("toMat4",un);const ln=Bi(Hs).setParameterLength(2),dn=(e,t)=>Pi(new Ws(Pi(e),t));ii("element",ln),ii("convert",dn);class cn extends js{static get type(){return"ArrayNode"}constructor(e,t,r=null){super(e),this.count=t,this.values=r,this.isArrayNode=!0}getNodeType(e){return null===this.nodeType&&(this.nodeType=this.values[0].getNodeType(e)),this.nodeType}getElementType(e){return this.getNodeType(e)}generate(e){const t=this.getNodeType(e);return e.generateArray(t,this.count,this.values)}}const hn=(...e)=>{let t;if(1===e.length){const r=e[0];t=new cn(null,r.length,r)}else{const r=e[0],s=e[1];t=new cn(r,s)}return Pi(t)};ii("toArray",((e,t)=>hn(Array(t).fill(e))));class pn extends $s{static get type(){return"UniformGroupNode"}constructor(e,t=!1,r=1){super("string"),this.name=e,this.shared=t,this.order=r,this.isUniformGroup=!0}serialize(e){super.serialize(e),e.name=this.name,e.version=this.version,e.shared=this.shared}deserialize(e){super.deserialize(e),this.name=e.name,this.version=e.version,this.shared=e.shared}}const gn=e=>new pn(e),mn=(e,t=0)=>new pn(e,!0,t),fn=mn("frame"),yn=mn("render"),xn=gn("object");class bn extends Zs{static get type(){return"UniformNode"}constructor(e,t=null){super(e,t),this.isUniformNode=!0,this.name="",this.groupNode=xn}label(e){return this.name=e,this}setGroup(e){return this.groupNode=e,this}getGroup(){return this.groupNode}getUniformHash(e){return this.getHash(e)}onUpdate(e,t){const r=this.getSelf();return e=e.bind(r),super.onUpdate((t=>{const s=e(t,r);void 0!==s&&(this.value=s)}),t)}generate(e,t){const r=this.getNodeType(e),s=this.getUniformHash(e);let i=e.getNodeFromHash(s);void 0===i&&(e.setHashNode(this,s),i=this);const n=i.getInputType(e),a=e.getUniformFromNode(i,n,e.shaderStage,this.name||e.context.label),o=e.getPropertyName(a);return void 0!==e.context.label&&delete e.context.label,e.format(o,r,t)}}const Tn=(e,t)=>{const r=Ci(t||e),s=e&&!0===e.isNode?e.node&&e.node.value||e.value:e;return Pi(new bn(s,r))};class _n extends $s{static get type(){return"PropertyNode"}constructor(e,t=null,r=!1){super(e),this.name=t,this.varying=r,this.isPropertyNode=!0}getHash(e){return this.name||super.getHash(e)}isGlobal(){return!0}generate(e){let t;return!0===this.varying?(t=e.getVaryingFromNode(this,this.name),t.needsInterpolation=!0):t=e.getVarFromNode(this,this.name),e.getPropertyName(t)}}const vn=(e,t)=>Pi(new _n(e,t)),Nn=(e,t)=>Pi(new _n(e,t,!0)),Sn=Ii(_n,"vec4","DiffuseColor"),En=Ii(_n,"vec3","EmissiveColor"),wn=Ii(_n,"float","Roughness"),An=Ii(_n,"float","Metalness"),Rn=Ii(_n,"float","Clearcoat"),Cn=Ii(_n,"float","ClearcoatRoughness"),Mn=Ii(_n,"vec3","Sheen"),Pn=Ii(_n,"float","SheenRoughness"),Ln=Ii(_n,"float","Iridescence"),Fn=Ii(_n,"float","IridescenceIOR"),Bn=Ii(_n,"float","IridescenceThickness"),In=Ii(_n,"float","AlphaT"),Dn=Ii(_n,"float","Anisotropy"),Vn=Ii(_n,"vec3","AnisotropyT"),Un=Ii(_n,"vec3","AnisotropyB"),On=Ii(_n,"color","SpecularColor"),Gn=Ii(_n,"float","SpecularF90"),kn=Ii(_n,"float","Shininess"),zn=Ii(_n,"vec4","Output"),$n=Ii(_n,"float","dashSize"),Hn=Ii(_n,"float","gapSize"),Wn=Ii(_n,"float","pointWidth"),jn=Ii(_n,"float","IOR"),qn=Ii(_n,"float","Transmission"),Xn=Ii(_n,"float","Thickness"),Kn=Ii(_n,"float","AttenuationDistance"),Yn=Ii(_n,"color","AttenuationColor"),Qn=Ii(_n,"float","Dispersion");class Zn extends js{static get type(){return"AssignNode"}constructor(e,t){super(),this.targetNode=e,this.sourceNode=t}hasDependencies(){return!1}getNodeType(e,t){return"void"!==t?this.targetNode.getNodeType(e):"void"}needsSplitAssign(e){const{targetNode:t}=this;if(!1===e.isAvailable("swizzleAssign")&&t.isSplitNode&&t.components.length>1){const r=e.getTypeLength(t.node.getNodeType(e));return ks.join("").slice(0,r)!==t.components}return!1}generate(e,t){const{targetNode:r,sourceNode:s}=this,i=this.needsSplitAssign(e),n=r.getNodeType(e),a=r.context({assign:!0}).build(e),o=s.build(e,n),u=s.getNodeType(e),l=e.getDataFromNode(this);let d;if(!0===l.initialized)"void"!==t&&(d=a);else if(i){const s=e.getVarFromNode(this,null,n),i=e.getPropertyName(s);e.addLineFlowCode(`${i} = ${o}`,this);const u=r.node.context({assign:!0}).build(e);for(let t=0;t{const s=r.type;let i;return i="pointer"===s?"&"+t.build(e):t.build(e,s),i};if(Array.isArray(i)){if(i.length>s.length)console.error("THREE.TSL: The number of provided parameters exceeds the expected number of inputs in 'Fn()'."),i.length=s.length;else if(i.length(t=t.length>1||t[0]&&!0===t[0].isNode?Fi(t):Li(t[0]),Pi(new ea(Pi(e),t)));ii("call",ta);class ra extends js{static get type(){return"OperatorNode"}constructor(e,t,r,...s){if(super(),s.length>0){let i=new ra(e,t,r);for(let t=0;t>"===r||"<<"===r)return e.getIntegerType(n);if("!"===r||"=="===r||"!="===r||"&&"===r||"||"===r||"^^"===r)return"bool";if("<"===r||">"===r||"<="===r||">="===r){const r=t?e.getTypeLength(t):Math.max(e.getTypeLength(n),e.getTypeLength(a));return r>1?`bvec${r}`:"bool"}if(e.isMatrix(n)){if("float"===a)return n;if(e.isVector(a))return e.getVectorFromMatrix(n);if(e.isMatrix(a))return n}else if(e.isMatrix(a)){if("float"===n)return a;if(e.isVector(n))return e.getVectorFromMatrix(a)}return e.getTypeLength(a)>e.getTypeLength(n)?a:n}generate(e,t){const r=this.op,s=this.aNode,i=this.bNode,n=this.getNodeType(e,t);let a=null,o=null;"void"!==n?(a=s.getNodeType(e),o=void 0!==i?i.getNodeType(e):null,"<"===r||">"===r||"<="===r||">="===r||"=="===r||"!="===r?e.isVector(a)?o=a:a!==o&&(a=o="float"):">>"===r||"<<"===r?(a=n,o=e.changeComponentType(o,"uint")):"%"===r?(a=n,o=e.isInteger(a)&&e.isInteger(o)?o:a):e.isMatrix(a)?"float"===o?o="float":e.isVector(o)?o=e.getVectorFromMatrix(a):e.isMatrix(o)||(a=o=n):a=e.isMatrix(o)?"float"===a?"float":e.isVector(a)?e.getVectorFromMatrix(o):o=n:o=n):a=o=n;const u=s.build(e,a),d=void 0!==i?i.build(e,o):null,c=e.getTypeLength(t),h=e.getFunctionOperator(r);if("void"!==t){const s=e.renderer.coordinateSystem===l;if("=="===r)return s?c>1?e.format(`${e.getMethod("equal",t)}( ${u}, ${d} )`,n,t):e.format(`( ${u} ${r} ${d} )`,n,t):c>1||!e.isVector(a)?e.format(`( ${u} == ${d} )`,n,t):e.format(`all( ${u} == ${d} )`,n,t);if("<"===r&&c>1)return s?e.format(`${e.getMethod("lessThan",t)}( ${u}, ${d} )`,n,t):e.format(`( ${u} < ${d} )`,n,t);if("<="===r&&c>1)return s?e.format(`${e.getMethod("lessThanEqual",t)}( ${u}, ${d} )`,n,t):e.format(`( ${u} <= ${d} )`,n,t);if(">"===r&&c>1)return s?e.format(`${e.getMethod("greaterThan",t)}( ${u}, ${d} )`,n,t):e.format(`( ${u} > ${d} )`,n,t);if(">="===r&&c>1)return s?e.format(`${e.getMethod("greaterThanEqual",t)}( ${u}, ${d} )`,n,t):e.format(`( ${u} >= ${d} )`,n,t);if("%"===r)return e.isInteger(o)?e.format(`( ${u} % ${d} )`,n,t):e.format(`${e.getMethod("mod",n)}( ${u}, ${d} )`,n,t);if("!"===r||"~"===r)return e.format(`(${r}${u})`,a,t);if(h)return e.format(`${h}( ${u}, ${d} )`,n,t);if(e.isMatrix(a)&&"float"===o)return e.format(`( ${d} ${r} ${u} )`,n,t);if("float"===a&&e.isMatrix(o))return e.format(`${u} ${r} ${d}`,n,t);{let i=`( ${u} ${r} ${d} )`;return!s&&"bool"===n&&e.isVector(a)&&e.isVector(o)&&(i=`all${i}`),e.format(i,n,t)}}if("void"!==a)return h?e.format(`${h}( ${u}, ${d} )`,n,t):e.isMatrix(a)&&"float"===o?e.format(`${d} ${r} ${u}`,n,t):e.format(`${u} ${r} ${d}`,n,t)}serialize(e){super.serialize(e),e.op=this.op}deserialize(e){super.deserialize(e),this.op=e.op}}const sa=Bi(ra,"+").setParameterLength(2,1/0).setName("add"),ia=Bi(ra,"-").setParameterLength(2,1/0).setName("sub"),na=Bi(ra,"*").setParameterLength(2,1/0).setName("mul"),aa=Bi(ra,"/").setParameterLength(2,1/0).setName("div"),oa=Bi(ra,"%").setParameterLength(2).setName("mod"),ua=Bi(ra,"==").setParameterLength(2).setName("equal"),la=Bi(ra,"!=").setParameterLength(2).setName("notEqual"),da=Bi(ra,"<").setParameterLength(2).setName("lessThan"),ca=Bi(ra,">").setParameterLength(2).setName("greaterThan"),ha=Bi(ra,"<=").setParameterLength(2).setName("lessThanEqual"),pa=Bi(ra,">=").setParameterLength(2).setName("greaterThanEqual"),ga=Bi(ra,"&&").setParameterLength(2,1/0).setName("and"),ma=Bi(ra,"||").setParameterLength(2,1/0).setName("or"),fa=Bi(ra,"!").setParameterLength(1).setName("not"),ya=Bi(ra,"^^").setParameterLength(2).setName("xor"),xa=Bi(ra,"&").setParameterLength(2).setName("bitAnd"),ba=Bi(ra,"~").setParameterLength(2).setName("bitNot"),Ta=Bi(ra,"|").setParameterLength(2).setName("bitOr"),_a=Bi(ra,"^").setParameterLength(2).setName("bitXor"),va=Bi(ra,"<<").setParameterLength(2).setName("shiftLeft"),Na=Bi(ra,">>").setParameterLength(2).setName("shiftRight");ii("add",sa),ii("sub",ia),ii("mul",na),ii("div",aa),ii("mod",oa),ii("equal",ua),ii("notEqual",la),ii("lessThan",da),ii("greaterThan",ca),ii("lessThanEqual",ha),ii("greaterThanEqual",pa),ii("and",ga),ii("or",ma),ii("not",fa),ii("xor",ya),ii("bitAnd",xa),ii("bitNot",ba),ii("bitOr",Ta),ii("bitXor",_a),ii("shiftLeft",va),ii("shiftRight",Na);const Sa=(e,t)=>(console.warn('THREE.TSL: "remainder()" is deprecated. Use "mod( int( ... ) )" instead.'),oa(e,t)),Ea=(e,t)=>(console.warn('THREE.TSL: "modInt()" is deprecated. Use "mod( int( ... ) )" instead.'),oa(Hi(e),Hi(t)));ii("remainder",Sa),ii("modInt",Ea);class wa extends js{static get type(){return"MathNode"}constructor(e,t,r=null,s=null){if(super(),(e===wa.MAX||e===wa.MIN)&&arguments.length>3){let i=new wa(e,t,r);for(let t=2;tn&&i>a?t:n>a?r:a>i?s:t}getNodeType(e){const t=this.method;return t===wa.LENGTH||t===wa.DISTANCE||t===wa.DOT?"float":t===wa.CROSS?"vec3":t===wa.ALL||t===wa.ANY?"bool":t===wa.EQUALS?e.changeComponentType(this.aNode.getNodeType(e),"bool"):this.getInputType(e)}generate(e,t){let r=this.method;const s=this.getNodeType(e),i=this.getInputType(e),n=this.aNode,a=this.bNode,o=this.cNode,u=e.renderer.coordinateSystem;if(r===wa.TRANSFORM_DIRECTION){let r=n,s=a;e.isMatrix(r.getNodeType(e))?s=tn(Qi(s),0):r=tn(Qi(r),0);const i=na(r,s).xyz;return $a(i).build(e,t)}if(r===wa.NEGATE)return e.format("( - "+n.build(e,i)+" )",s,t);if(r===wa.ONE_MINUS)return ia(1,n).build(e,t);if(r===wa.RECIPROCAL)return aa(1,n).build(e,t);if(r===wa.DIFFERENCE)return Qa(ia(n,a)).build(e,t);{const c=[];return r===wa.CROSS?c.push(n.build(e,s),a.build(e,s)):u===l&&r===wa.STEP?c.push(n.build(e,1===e.getTypeLength(n.getNodeType(e))?"float":i),a.build(e,i)):u!==l||r!==wa.MIN&&r!==wa.MAX?r===wa.REFRACT?c.push(n.build(e,i),a.build(e,i),o.build(e,"float")):r===wa.MIX?c.push(n.build(e,i),a.build(e,i),o.build(e,1===e.getTypeLength(o.getNodeType(e))?"float":i)):(u===d&&r===wa.ATAN&&null!==a&&(r="atan2"),c.push(n.build(e,i)),null!==a&&c.push(a.build(e,i)),null!==o&&c.push(o.build(e,i))):c.push(n.build(e,i),a.build(e,1===e.getTypeLength(a.getNodeType(e))?"float":i)),e.format(`${e.getMethod(r,s)}( ${c.join(", ")} )`,s,t)}}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}wa.ALL="all",wa.ANY="any",wa.RADIANS="radians",wa.DEGREES="degrees",wa.EXP="exp",wa.EXP2="exp2",wa.LOG="log",wa.LOG2="log2",wa.SQRT="sqrt",wa.INVERSE_SQRT="inversesqrt",wa.FLOOR="floor",wa.CEIL="ceil",wa.NORMALIZE="normalize",wa.FRACT="fract",wa.SIN="sin",wa.COS="cos",wa.TAN="tan",wa.ASIN="asin",wa.ACOS="acos",wa.ATAN="atan",wa.ABS="abs",wa.SIGN="sign",wa.LENGTH="length",wa.NEGATE="negate",wa.ONE_MINUS="oneMinus",wa.DFDX="dFdx",wa.DFDY="dFdy",wa.ROUND="round",wa.RECIPROCAL="reciprocal",wa.TRUNC="trunc",wa.FWIDTH="fwidth",wa.TRANSPOSE="transpose",wa.BITCAST="bitcast",wa.EQUALS="equals",wa.MIN="min",wa.MAX="max",wa.STEP="step",wa.REFLECT="reflect",wa.DISTANCE="distance",wa.DIFFERENCE="difference",wa.DOT="dot",wa.CROSS="cross",wa.POW="pow",wa.TRANSFORM_DIRECTION="transformDirection",wa.MIX="mix",wa.CLAMP="clamp",wa.REFRACT="refract",wa.SMOOTHSTEP="smoothstep",wa.FACEFORWARD="faceforward";const Aa=$i(1e-6),Ra=$i(1e6),Ca=$i(Math.PI),Ma=$i(2*Math.PI),Pa=Bi(wa,wa.ALL).setParameterLength(1),La=Bi(wa,wa.ANY).setParameterLength(1),Fa=Bi(wa,wa.RADIANS).setParameterLength(1),Ba=Bi(wa,wa.DEGREES).setParameterLength(1),Ia=Bi(wa,wa.EXP).setParameterLength(1),Da=Bi(wa,wa.EXP2).setParameterLength(1),Va=Bi(wa,wa.LOG).setParameterLength(1),Ua=Bi(wa,wa.LOG2).setParameterLength(1),Oa=Bi(wa,wa.SQRT).setParameterLength(1),Ga=Bi(wa,wa.INVERSE_SQRT).setParameterLength(1),ka=Bi(wa,wa.FLOOR).setParameterLength(1),za=Bi(wa,wa.CEIL).setParameterLength(1),$a=Bi(wa,wa.NORMALIZE).setParameterLength(1),Ha=Bi(wa,wa.FRACT).setParameterLength(1),Wa=Bi(wa,wa.SIN).setParameterLength(1),ja=Bi(wa,wa.COS).setParameterLength(1),qa=Bi(wa,wa.TAN).setParameterLength(1),Xa=Bi(wa,wa.ASIN).setParameterLength(1),Ka=Bi(wa,wa.ACOS).setParameterLength(1),Ya=Bi(wa,wa.ATAN).setParameterLength(1,2),Qa=Bi(wa,wa.ABS).setParameterLength(1),Za=Bi(wa,wa.SIGN).setParameterLength(1),Ja=Bi(wa,wa.LENGTH).setParameterLength(1),eo=Bi(wa,wa.NEGATE).setParameterLength(1),to=Bi(wa,wa.ONE_MINUS).setParameterLength(1),ro=Bi(wa,wa.DFDX).setParameterLength(1),so=Bi(wa,wa.DFDY).setParameterLength(1),io=Bi(wa,wa.ROUND).setParameterLength(1),no=Bi(wa,wa.RECIPROCAL).setParameterLength(1),ao=Bi(wa,wa.TRUNC).setParameterLength(1),oo=Bi(wa,wa.FWIDTH).setParameterLength(1),uo=Bi(wa,wa.TRANSPOSE).setParameterLength(1),lo=Bi(wa,wa.BITCAST).setParameterLength(2),co=(e,t)=>(console.warn('THREE.TSL: "equals" is deprecated. Use "equal" inside a vector instead, like: "bvec*( equal( ... ) )"'),ua(e,t)),ho=Bi(wa,wa.MIN).setParameterLength(2,1/0),po=Bi(wa,wa.MAX).setParameterLength(2,1/0),go=Bi(wa,wa.STEP).setParameterLength(2),mo=Bi(wa,wa.REFLECT).setParameterLength(2),fo=Bi(wa,wa.DISTANCE).setParameterLength(2),yo=Bi(wa,wa.DIFFERENCE).setParameterLength(2),xo=Bi(wa,wa.DOT).setParameterLength(2),bo=Bi(wa,wa.CROSS).setParameterLength(2),To=Bi(wa,wa.POW).setParameterLength(2),_o=Bi(wa,wa.POW,2).setParameterLength(1),vo=Bi(wa,wa.POW,3).setParameterLength(1),No=Bi(wa,wa.POW,4).setParameterLength(1),So=Bi(wa,wa.TRANSFORM_DIRECTION).setParameterLength(2),Eo=e=>na(Za(e),To(Qa(e),1/3)),wo=e=>xo(e,e),Ao=Bi(wa,wa.MIX).setParameterLength(3),Ro=(e,t=0,r=1)=>Pi(new wa(wa.CLAMP,Pi(e),Pi(t),Pi(r))),Co=e=>Ro(e),Mo=Bi(wa,wa.REFRACT).setParameterLength(3),Po=Bi(wa,wa.SMOOTHSTEP).setParameterLength(3),Lo=Bi(wa,wa.FACEFORWARD).setParameterLength(3),Fo=Vi((([e])=>{const t=xo(e.xy,qi(12.9898,78.233)),r=oa(t,Ca);return Ha(Wa(r).mul(43758.5453))})),Bo=(e,t,r)=>Ao(t,r,e),Io=(e,t,r)=>Po(t,r,e),Do=(e,t)=>(console.warn('THREE.TSL: "atan2" is overloaded. Use "atan" instead.'),Ya(e,t)),Vo=Lo,Uo=Ga;ii("all",Pa),ii("any",La),ii("equals",co),ii("radians",Fa),ii("degrees",Ba),ii("exp",Ia),ii("exp2",Da),ii("log",Va),ii("log2",Ua),ii("sqrt",Oa),ii("inverseSqrt",Ga),ii("floor",ka),ii("ceil",za),ii("normalize",$a),ii("fract",Ha),ii("sin",Wa),ii("cos",ja),ii("tan",qa),ii("asin",Xa),ii("acos",Ka),ii("atan",Ya),ii("abs",Qa),ii("sign",Za),ii("length",Ja),ii("lengthSq",wo),ii("negate",eo),ii("oneMinus",to),ii("dFdx",ro),ii("dFdy",so),ii("round",io),ii("reciprocal",no),ii("trunc",ao),ii("fwidth",oo),ii("atan2",Do),ii("min",ho),ii("max",po),ii("step",go),ii("reflect",mo),ii("distance",fo),ii("dot",xo),ii("cross",bo),ii("pow",To),ii("pow2",_o),ii("pow3",vo),ii("pow4",No),ii("transformDirection",So),ii("mix",Bo),ii("clamp",Ro),ii("refract",Mo),ii("smoothstep",Io),ii("faceForward",Lo),ii("difference",yo),ii("saturate",Co),ii("cbrt",Eo),ii("transpose",uo),ii("rand",Fo);class Oo extends $s{static get type(){return"ConditionalNode"}constructor(e,t,r=null){super(),this.condNode=e,this.ifNode=t,this.elseNode=r}getNodeType(e){const{ifNode:t,elseNode:r}=e.getNodeProperties(this);if(void 0===t)return this.setup(e),this.getNodeType(e);const s=t.getNodeType(e);if(null!==r){const t=r.getNodeType(e);if(e.getTypeLength(t)>e.getTypeLength(s))return t}return s}setup(e){const t=this.condNode.cache(),r=this.ifNode.cache(),s=this.elseNode?this.elseNode.cache():null,i=e.context.nodeBlock;e.getDataFromNode(r).parentNodeBlock=i,null!==s&&(e.getDataFromNode(s).parentNodeBlock=i);const n=e.getNodeProperties(this);n.condNode=t,n.ifNode=r.context({nodeBlock:r}),n.elseNode=s?s.context({nodeBlock:s}):null}generate(e,t){const r=this.getNodeType(e),s=e.getDataFromNode(this);if(void 0!==s.nodeProperty)return s.nodeProperty;const{condNode:i,ifNode:n,elseNode:a}=e.getNodeProperties(this),o=e.currentFunctionNode,u="void"!==t,l=u?vn(r).build(e):"";s.nodeProperty=l;const d=i.build(e,"bool");e.addFlowCode(`\n${e.tab}if ( ${d} ) {\n\n`).addFlowTab();let c=n.build(e,r);if(c&&(u?c=l+" = "+c+";":(c="return "+c+";",null===o&&(console.warn("THREE.TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values."),c="// "+c))),e.removeFlowTab().addFlowCode(e.tab+"\t"+c+"\n\n"+e.tab+"}"),null!==a){e.addFlowCode(" else {\n\n").addFlowTab();let t=a.build(e,r);t&&(u?t=l+" = "+t+";":(t="return "+t+";",null===o&&(console.warn("THREE.TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values."),t="// "+t))),e.removeFlowTab().addFlowCode(e.tab+"\t"+t+"\n\n"+e.tab+"}\n\n")}else e.addFlowCode("\n\n");return e.format(l,r,t)}}const Go=Bi(Oo).setParameterLength(2,3);ii("select",Go);const ko=(...e)=>(console.warn("THREE.TSL: cond() has been renamed to select()."),Go(...e));ii("cond",ko);class zo extends $s{static get type(){return"ContextNode"}constructor(e,t={}){super(),this.isContextNode=!0,this.node=e,this.value=t}getScope(){return this.node.getScope()}getNodeType(e){return this.node.getNodeType(e)}analyze(e){this.node.build(e)}setup(e){const t=e.getContext();e.setContext({...e.context,...this.value});const r=this.node.build(e);return e.setContext(t),r}generate(e,t){const r=e.getContext();e.setContext({...e.context,...this.value});const s=this.node.build(e,t);return e.setContext(r),s}}const $o=Bi(zo).setParameterLength(1,2),Ho=(e,t)=>$o(e,{label:t});ii("context",$o),ii("label",Ho);class Wo extends $s{static get type(){return"VarNode"}constructor(e,t=null,r=!1){super(),this.node=e,this.name=t,this.global=!0,this.isVarNode=!0,this.readOnly=r}getMemberType(e,t){return this.node.getMemberType(e,t)}getElementType(e){return this.node.getElementType(e)}getNodeType(e){return this.node.getNodeType(e)}generate(e){const{node:t,name:r,readOnly:s}=this,{renderer:i}=e,n=!0===i.backend.isWebGPUBackend;let a=!1,o=!1;s&&(a=e.isDeterministic(t),o=n?s:a);const u=e.getVectorType(this.getNodeType(e)),l=t.build(e,u),d=e.getVarFromNode(this,r,u,void 0,o),c=e.getPropertyName(d);let h=c;if(o)if(n)h=a?`const ${c}`:`let ${c}`;else{const r=e.getArrayCount(t);h=`const ${e.getVar(d.type,c,r)}`}return e.addLineFlowCode(`${h} = ${l}`,this),c}}const jo=Bi(Wo),qo=(e,t=null)=>jo(e,t).append(),Xo=(e,t=null)=>jo(e,t,!0).append();ii("toVar",qo),ii("toConst",Xo);const Ko=e=>(console.warn('TSL: "temp( node )" is deprecated. Use "Var( node )" or "node.toVar()" instead.'),jo(e));ii("temp",Ko);class Yo extends $s{static get type(){return"VaryingNode"}constructor(e,t=null){super(),this.node=e,this.name=t,this.isVaryingNode=!0}isGlobal(){return!0}getHash(e){return this.name||super.getHash(e)}getNodeType(e){return this.node.getNodeType(e)}setupVarying(e){const t=e.getNodeProperties(this);let r=t.varying;if(void 0===r){const s=this.name,i=this.getNodeType(e);t.varying=r=e.getVaryingFromNode(this,s,i),t.node=this.node}return r.needsInterpolation||(r.needsInterpolation="fragment"===e.shaderStage),r}setup(e){this.setupVarying(e)}analyze(e){return this.setupVarying(e),this.node.analyze(e)}generate(e){const t=e.getNodeProperties(this),r=this.setupVarying(e),s="fragment"===e.shaderStage&&!0===t.reassignPosition&&e.context.needsPositionReassign;if(void 0===t.propertyName||s){const i=this.getNodeType(e),n=e.getPropertyName(r,Bs.VERTEX);e.flowNodeFromShaderStage(Bs.VERTEX,this.node,i,n),t.propertyName=n,s?t.reassignPosition=!1:void 0===t.reassignPosition&&e.context.isPositionNodeInput&&(t.reassignPosition=!0)}return e.getPropertyName(r)}}const Qo=Bi(Yo).setParameterLength(1,2),Zo=e=>Qo(e);ii("toVarying",Qo),ii("toVertexStage",Zo),ii("varying",((...e)=>(console.warn("THREE.TSL: .varying() has been renamed to .toVarying()."),Qo(...e)))),ii("vertexStage",((...e)=>(console.warn("THREE.TSL: .vertexStage() has been renamed to .toVertexStage()."),Qo(...e))));const Jo=Vi((([e])=>{const t=e.mul(.9478672986).add(.0521327014).pow(2.4),r=e.mul(.0773993808),s=e.lessThanEqual(.04045);return Ao(t,r,s)})).setLayout({name:"sRGBTransferEOTF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),eu=Vi((([e])=>{const t=e.pow(.41666).mul(1.055).sub(.055),r=e.mul(12.92),s=e.lessThanEqual(.0031308);return Ao(t,r,s)})).setLayout({name:"sRGBTransferOETF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),tu="WorkingColorSpace",ru="OutputColorSpace";class su extends js{static get type(){return"ColorSpaceNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this.source=t,this.target=r}resolveColorSpace(e,t){return t===tu?c.workingColorSpace:t===ru?e.context.outputColorSpace||e.renderer.outputColorSpace:t}setup(e){const{colorNode:t}=this,r=this.resolveColorSpace(e,this.source),s=this.resolveColorSpace(e,this.target);let i=t;return!1!==c.enabled&&r!==s&&r&&s?(c.getTransfer(r)===h&&(i=tn(Jo(i.rgb),i.a)),c.getPrimaries(r)!==c.getPrimaries(s)&&(i=tn(on(c._getMatrix(new n,r,s)).mul(i.rgb),i.a)),c.getTransfer(s)===h&&(i=tn(eu(i.rgb),i.a)),i):i}}const iu=e=>Pi(new su(Pi(e),tu,ru)),nu=e=>Pi(new su(Pi(e),ru,tu)),au=(e,t)=>Pi(new su(Pi(e),tu,t)),ou=(e,t)=>Pi(new su(Pi(e),t,tu));ii("toOutputColorSpace",iu),ii("toWorkingColorSpace",nu),ii("workingToColorSpace",au),ii("colorSpaceToWorking",ou);let uu=class extends Hs{static get type(){return"ReferenceElementNode"}constructor(e,t){super(e,t),this.referenceNode=e,this.isReferenceElementNode=!0}getNodeType(){return this.referenceNode.uniformType}generate(e){const t=super.generate(e),r=this.referenceNode.getNodeType(),s=this.getNodeType();return e.format(t,r,s)}};class lu extends $s{static get type(){return"ReferenceBaseNode"}constructor(e,t,r=null,s=null){super(),this.property=e,this.uniformType=t,this.object=r,this.count=s,this.properties=e.split("."),this.reference=r,this.node=null,this.group=null,this.updateType=Is.OBJECT}setGroup(e){return this.group=e,this}element(e){return Pi(new uu(this,Pi(e)))}setNodeType(e){const t=Tn(null,e).getSelf();null!==this.group&&t.setGroup(this.group),this.node=t}getNodeType(e){return null===this.node&&(this.updateReference(e),this.updateValue()),this.node.getNodeType(e)}getValueFromReference(e=this.reference){const{properties:t}=this;let r=e[t[0]];for(let e=1;ePi(new du(e,t,r));class hu extends js{static get type(){return"ToneMappingNode"}constructor(e,t=gu,r=null){super("vec3"),this.toneMapping=e,this.exposureNode=t,this.colorNode=r}customCacheKey(){return Ts(this.toneMapping)}setup(e){const t=this.colorNode||e.context.color,r=this.toneMapping;if(r===p)return t;let s=null;const i=e.renderer.library.getToneMappingFunction(r);return null!==i?s=tn(i(t.rgb,this.exposureNode),t.a):(console.error("ToneMappingNode: Unsupported Tone Mapping configuration.",r),s=t),s}}const pu=(e,t,r)=>Pi(new hu(e,Pi(t),Pi(r))),gu=cu("toneMappingExposure","float");ii("toneMapping",((e,t,r)=>pu(t,r,e)));class mu extends Zs{static get type(){return"BufferAttributeNode"}constructor(e,t=null,r=0,s=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferStride=r,this.bufferOffset=s,this.usage=g,this.instanced=!1,this.attribute=null,this.global=!0,e&&!0===e.isBufferAttribute&&(this.attribute=e,this.usage=e.usage,this.instanced=e.isInstancedBufferAttribute)}getHash(e){if(0===this.bufferStride&&0===this.bufferOffset){let t=e.globalCache.getData(this.value);return void 0===t&&(t={node:this},e.globalCache.setData(this.value,t)),t.node.uuid}return this.uuid}getNodeType(e){return null===this.bufferType&&(this.bufferType=e.getTypeFromAttribute(this.attribute)),this.bufferType}setup(e){if(null!==this.attribute)return;const t=this.getNodeType(e),r=this.value,s=e.getTypeLength(t),i=this.bufferStride||s,n=this.bufferOffset,a=!0===r.isInterleavedBuffer?r:new m(r,i),o=new f(a,s,n);a.setUsage(this.usage),this.attribute=o,this.attribute.isInstancedBufferAttribute=this.instanced}generate(e){const t=this.getNodeType(e),r=e.getBufferAttributeFromNode(this,t),s=e.getPropertyName(r);let i=null;if("vertex"===e.shaderStage||"compute"===e.shaderStage)this.name=s,i=s;else{i=Qo(this).build(e,t)}return i}getInputType(){return"bufferAttribute"}setUsage(e){return this.usage=e,this.attribute&&!0===this.attribute.isBufferAttribute&&(this.attribute.usage=e),this}setInstanced(e){return this.instanced=e,this}}const fu=(e,t=null,r=0,s=0)=>Pi(new mu(e,t,r,s)),yu=(e,t=null,r=0,s=0)=>fu(e,t,r,s).setUsage(y),xu=(e,t=null,r=0,s=0)=>fu(e,t,r,s).setInstanced(!0),bu=(e,t=null,r=0,s=0)=>yu(e,t,r,s).setInstanced(!0);ii("toAttribute",(e=>fu(e.value)));class Tu extends $s{static get type(){return"ComputeNode"}constructor(e,t,r=[64]){super("void"),this.isComputeNode=!0,this.computeNode=e,this.count=t,this.workgroupSize=r,this.dispatchCount=0,this.version=1,this.name="",this.updateBeforeType=Is.OBJECT,this.onInitFunction=null,this.updateDispatchCount()}dispose(){this.dispatchEvent({type:"dispose"})}label(e){return this.name=e,this}updateDispatchCount(){const{count:e,workgroupSize:t}=this;let r=t[0];for(let e=1;ePi(new Tu(Pi(e),t,r));ii("compute",_u);class vu extends $s{static get type(){return"CacheNode"}constructor(e,t=!0){super(),this.node=e,this.parent=t,this.isCacheNode=!0}getNodeType(e){const t=e.getCache(),r=e.getCacheFromNode(this,this.parent);e.setCache(r);const s=this.node.getNodeType(e);return e.setCache(t),s}build(e,...t){const r=e.getCache(),s=e.getCacheFromNode(this,this.parent);e.setCache(s);const i=this.node.build(e,...t);return e.setCache(r),i}}const Nu=(e,t)=>Pi(new vu(Pi(e),t));ii("cache",Nu);class Su extends $s{static get type(){return"BypassNode"}constructor(e,t){super(),this.isBypassNode=!0,this.outputNode=e,this.callNode=t}getNodeType(e){return this.outputNode.getNodeType(e)}generate(e){const t=this.callNode.build(e,"void");return""!==t&&e.addLineFlowCode(t,this),this.outputNode.build(e)}}const Eu=Bi(Su).setParameterLength(2);ii("bypass",Eu);class wu extends $s{static get type(){return"RemapNode"}constructor(e,t,r,s=$i(0),i=$i(1)){super(),this.node=e,this.inLowNode=t,this.inHighNode=r,this.outLowNode=s,this.outHighNode=i,this.doClamp=!0}setup(){const{node:e,inLowNode:t,inHighNode:r,outLowNode:s,outHighNode:i,doClamp:n}=this;let a=e.sub(t).div(r.sub(t));return!0===n&&(a=a.clamp()),a.mul(i.sub(s)).add(s)}}const Au=Bi(wu,null,null,{doClamp:!1}).setParameterLength(3,5),Ru=Bi(wu).setParameterLength(3,5);ii("remap",Au),ii("remapClamp",Ru);class Cu extends $s{static get type(){return"ExpressionNode"}constructor(e="",t="void"){super(t),this.snippet=e}generate(e,t){const r=this.getNodeType(e),s=this.snippet;if("void"!==r)return e.format(s,r,t);e.addLineFlowCode(s,this)}}const Mu=Bi(Cu).setParameterLength(1,2),Pu=e=>(e?Go(e,Mu("discard")):Mu("discard")).append();ii("discard",Pu);class Lu extends js{static get type(){return"RenderOutputNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this.toneMapping=t,this.outputColorSpace=r,this.isRenderOutputNode=!0}setup({context:e}){let t=this.colorNode||e.color;const r=(null!==this.toneMapping?this.toneMapping:e.toneMapping)||p,s=(null!==this.outputColorSpace?this.outputColorSpace:e.outputColorSpace)||x;return r!==p&&(t=t.toneMapping(r)),s!==x&&s!==c.workingColorSpace&&(t=t.workingToColorSpace(s)),t}}const Fu=(e,t=null,r=null)=>Pi(new Lu(Pi(e),t,r));ii("renderOutput",Fu);class Bu extends js{static get type(){return"DebugNode"}constructor(e,t=null){super(),this.node=e,this.callback=t}getNodeType(e){return this.node.getNodeType(e)}setup(e){return this.node.build(e)}analyze(e){return this.node.build(e)}generate(e){const t=this.callback,r=this.node.build(e);let s="";return s+="// #--- TSL Debug ---#\n",s+=e.flow.code.replace(/^\t/gm,"")+"\n",s+="/* ... */ "+r+" /* ... */\n",s+="// #-----------------#\n",null!==t?t(s):console.log(s),r}}const Iu=(e,t=null)=>Pi(new Bu(Pi(e),t));ii("debug",Iu);class Du extends $s{static get type(){return"AttributeNode"}constructor(e,t=null){super(t),this.global=!0,this._attributeName=e}getHash(e){return this.getAttributeName(e)}getNodeType(e){let t=this.nodeType;if(null===t){const r=this.getAttributeName(e);if(e.hasGeometryAttribute(r)){const s=e.geometry.getAttribute(r);t=e.getTypeFromAttribute(s)}else t="float"}return t}setAttributeName(e){return this._attributeName=e,this}getAttributeName(){return this._attributeName}generate(e){const t=this.getAttributeName(e),r=this.getNodeType(e);if(!0===e.hasGeometryAttribute(t)){const s=e.geometry.getAttribute(t),i=e.getTypeFromAttribute(s),n=e.getAttribute(t,i);if("vertex"===e.shaderStage)return e.format(n.name,i,r);return Qo(this).build(e,r)}return console.warn(`AttributeNode: Vertex attribute "${t}" not found on geometry.`),e.generateConst(r)}serialize(e){super.serialize(e),e.global=this.global,e._attributeName=this._attributeName}deserialize(e){super.deserialize(e),this.global=e.global,this._attributeName=e._attributeName}}const Vu=(e,t)=>Pi(new Du(e,t)),Uu=(e=0)=>Vu("uv"+(e>0?e:""),"vec2");class Ou extends $s{static get type(){return"TextureSizeNode"}constructor(e,t=null){super("uvec2"),this.isTextureSizeNode=!0,this.textureNode=e,this.levelNode=t}generate(e,t){const r=this.textureNode.build(e,"property"),s=null===this.levelNode?"0":this.levelNode.build(e,"int");return e.format(`${e.getMethod("textureDimensions")}( ${r}, ${s} )`,this.getNodeType(e),t)}}const Gu=Bi(Ou).setParameterLength(1,2);class ku extends bn{static get type(){return"MaxMipLevelNode"}constructor(e){super(0),this._textureNode=e,this.updateType=Is.FRAME}get textureNode(){return this._textureNode}get texture(){return this._textureNode.value}update(){const e=this.texture,t=e.images,r=t&&t.length>0?t[0]&&t[0].image||t[0]:e.image;if(r&&void 0!==r.width){const{width:e,height:t}=r;this.value=Math.log2(Math.max(e,t))}}}const zu=Bi(ku).setParameterLength(1);class $u extends bn{static get type(){return"TextureNode"}constructor(e,t=null,r=null,s=null){super(e),this.isTextureNode=!0,this.uvNode=t,this.levelNode=r,this.biasNode=s,this.compareNode=null,this.depthNode=null,this.gradNode=null,this.sampler=!0,this.updateMatrix=!1,this.updateType=Is.NONE,this.referenceNode=null,this._value=e,this._matrixUniform=null,this.setUpdateMatrix(null===t)}set value(e){this.referenceNode?this.referenceNode.value=e:this._value=e}get value(){return this.referenceNode?this.referenceNode.value:this._value}getUniformHash(){return this.value.uuid}getNodeType(){return!0===this.value.isDepthTexture?"float":this.value.type===b?"uvec4":this.value.type===T?"ivec4":"vec4"}getInputType(){return"texture"}getDefaultUV(){return Uu(this.value.channel)}updateReference(){return this.value}getTransformedUV(e){return null===this._matrixUniform&&(this._matrixUniform=Tn(this.value.matrix)),this._matrixUniform.mul(Qi(e,1)).xy}setUpdateMatrix(e){return this.updateMatrix=e,this.updateType=e?Is.RENDER:Is.NONE,this}setupUV(e,t){const r=this.value;return e.isFlipY()&&(r.image instanceof ImageBitmap&&!0===r.flipY||!0===r.isRenderTargetTexture||!0===r.isFramebufferTexture||!0===r.isDepthTexture)&&(t=this.sampler?t.flipY():t.setY(Hi(Gu(this,this.levelNode).y).sub(t.y).sub(1))),t}setup(e){const t=e.getNodeProperties(this);t.referenceNode=this.referenceNode;const r=this.value;if(!r||!0!==r.isTexture)throw new Error("THREE.TSL: `texture( value )` function expects a valid instance of THREE.Texture().");let s=this.uvNode;null!==s&&!0!==e.context.forceUVContext||!e.context.getUV||(s=e.context.getUV(this)),s||(s=this.getDefaultUV()),!0===this.updateMatrix&&(s=this.getTransformedUV(s)),s=this.setupUV(e,s);let i=this.levelNode;null===i&&e.context.getTextureLevel&&(i=e.context.getTextureLevel(this)),t.uvNode=s,t.levelNode=i,t.biasNode=this.biasNode,t.compareNode=this.compareNode,t.gradNode=this.gradNode,t.depthNode=this.depthNode}generateUV(e,t){return t.build(e,!0===this.sampler?"vec2":"ivec2")}generateSnippet(e,t,r,s,i,n,a,o){const u=this.value;let l;return l=s?e.generateTextureLevel(u,t,r,s,n):i?e.generateTextureBias(u,t,r,i,n):o?e.generateTextureGrad(u,t,r,o,n):a?e.generateTextureCompare(u,t,r,a,n):!1===this.sampler?e.generateTextureLoad(u,t,r,n):e.generateTexture(u,t,r,n),l}generate(e,t){const r=this.value,s=e.getNodeProperties(this),i=super.generate(e,"property");if(/^sampler/.test(t))return i+"_sampler";if(e.isReference(t))return i;{const n=e.getDataFromNode(this);let a=n.propertyName;if(void 0===a){const{uvNode:t,levelNode:r,biasNode:o,compareNode:u,depthNode:l,gradNode:d}=s,c=this.generateUV(e,t),h=r?r.build(e,"float"):null,p=o?o.build(e,"float"):null,g=l?l.build(e,"int"):null,m=u?u.build(e,"float"):null,f=d?[d[0].build(e,"vec2"),d[1].build(e,"vec2")]:null,y=e.getVarFromNode(this);a=e.getPropertyName(y);const x=this.generateSnippet(e,i,c,h,p,g,m,f);e.addLineFlowCode(`${a} = ${x}`,this),n.snippet=x,n.propertyName=a}let o=a;const u=this.getNodeType(e);return e.needsToWorkingColorSpace(r)&&(o=ou(Mu(o,u),r.colorSpace).setup(e).build(e,u)),e.format(o,u,t)}}setSampler(e){return this.sampler=e,this}getSampler(){return this.sampler}uv(e){return console.warn("THREE.TextureNode: .uv() has been renamed. Use .sample() instead."),this.sample(e)}sample(e){const t=this.clone();return t.uvNode=Pi(e),t.referenceNode=this.getSelf(),Pi(t)}blur(e){const t=this.clone();t.biasNode=Pi(e).mul(zu(t)),t.referenceNode=this.getSelf();const r=t.value;return(r&&!1===r.generateMipmaps||r.minFilter===_||r.magFilter===_)&&(console.warn("THREE.TSL: texture().blur() requires mipmaps and sampling. Use .generateMipmaps=true and .minFilter/.magFilter=THREE.LinearFilter in the Texture."),t.biasNode=null),Pi(t)}level(e){const t=this.clone();return t.levelNode=Pi(e),t.referenceNode=this.getSelf(),Pi(t)}size(e){return Gu(this,e)}bias(e){const t=this.clone();return t.biasNode=Pi(e),t.referenceNode=this.getSelf(),Pi(t)}compare(e){const t=this.clone();return t.compareNode=Pi(e),t.referenceNode=this.getSelf(),Pi(t)}grad(e,t){const r=this.clone();return r.gradNode=[Pi(e),Pi(t)],r.referenceNode=this.getSelf(),Pi(r)}depth(e){const t=this.clone();return t.depthNode=Pi(e),t.referenceNode=this.getSelf(),Pi(t)}serialize(e){super.serialize(e),e.value=this.value.toJSON(e.meta).uuid,e.sampler=this.sampler,e.updateMatrix=this.updateMatrix,e.updateType=this.updateType}deserialize(e){super.deserialize(e),this.value=e.meta.textures[e.value],this.sampler=e.sampler,this.updateMatrix=e.updateMatrix,this.updateType=e.updateType}update(){const e=this.value,t=this._matrixUniform;null!==t&&(t.value=e.matrix),!0===e.matrixAutoUpdate&&e.updateMatrix()}clone(){const e=new this.constructor(this.value,this.uvNode,this.levelNode,this.biasNode);return e.sampler=this.sampler,e}}const Hu=Bi($u).setParameterLength(1,4),Wu=(...e)=>Hu(...e).setSampler(!1);class ju extends bn{static get type(){return"BufferNode"}constructor(e,t,r=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferCount=r}getElementType(e){return this.getNodeType(e)}getInputType(){return"buffer"}}const qu=(e,t,r)=>Pi(new ju(e,t,r));class Xu extends Hs{static get type(){return"UniformArrayElementNode"}constructor(e,t){super(e,t),this.isArrayBufferElementNode=!0}generate(e){const t=super.generate(e),r=this.getNodeType(),s=this.node.getPaddedType();return e.format(t,s,r)}}class Ku extends ju{static get type(){return"UniformArrayNode"}constructor(e,t=null){super(null),this.array=e,this.elementType=null===t?Rs(e[0]):t,this.paddedType=this.getPaddedType(),this.updateType=Is.RENDER,this.isArrayBufferNode=!0}getNodeType(){return this.paddedType}getElementType(){return this.elementType}getPaddedType(){const e=this.elementType;let t="vec4";return"mat2"===e?t="mat2":!0===/mat/.test(e)?t="mat4":"i"===e.charAt(0)?t="ivec4":"u"===e.charAt(0)&&(t="uvec4"),t}update(){const{array:e,value:t}=this,r=this.elementType;if("float"===r||"int"===r||"uint"===r)for(let r=0;rPi(new Ku(e,t)),Qu=Tn(0,"uint").setGroup(mn("cameraIndex")).toVarying("v_cameraIndex"),Zu=Tn("float").label("cameraNear").setGroup(yn).onRenderUpdate((({camera:e})=>e.near)),Ju=Tn("float").label("cameraFar").setGroup(yn).onRenderUpdate((({camera:e})=>e.far)),el=Vi((({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrix);t=Yu(r).setGroup(yn).label("cameraProjectionMatrices").element(Qu).toVar("cameraProjectionMatrix")}else t=Tn("mat4").label("cameraProjectionMatrix").setGroup(yn).onRenderUpdate((({camera:e})=>e.projectionMatrix));return t})).once()(),tl=Tn("mat4").label("cameraProjectionMatrixInverse").setGroup(yn).onRenderUpdate((({camera:e})=>e.projectionMatrixInverse)),rl=Vi((({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.matrixWorldInverse);t=Yu(r).setGroup(yn).label("cameraViewMatrices").element(Qu).toVar("cameraViewMatrix")}else t=Tn("mat4").label("cameraViewMatrix").setGroup(yn).onRenderUpdate((({camera:e})=>e.matrixWorldInverse));return t})).once()(),sl=Tn("mat4").label("cameraWorldMatrix").setGroup(yn).onRenderUpdate((({camera:e})=>e.matrixWorld)),il=Tn("mat3").label("cameraNormalMatrix").setGroup(yn).onRenderUpdate((({camera:e})=>e.normalMatrix)),nl=Tn(new r).label("cameraPosition").setGroup(yn).onRenderUpdate((({camera:e},t)=>t.value.setFromMatrixPosition(e.matrixWorld))),al=new v;class ol extends $s{static get type(){return"Object3DNode"}constructor(e,t=null){super(),this.scope=e,this.object3d=t,this.updateType=Is.OBJECT,this._uniformNode=new bn(null)}getNodeType(){const e=this.scope;return e===ol.WORLD_MATRIX?"mat4":e===ol.POSITION||e===ol.VIEW_POSITION||e===ol.DIRECTION||e===ol.SCALE?"vec3":e===ol.RADIUS?"float":void 0}update(e){const t=this.object3d,s=this._uniformNode,i=this.scope;if(i===ol.WORLD_MATRIX)s.value=t.matrixWorld;else if(i===ol.POSITION)s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld);else if(i===ol.SCALE)s.value=s.value||new r,s.value.setFromMatrixScale(t.matrixWorld);else if(i===ol.DIRECTION)s.value=s.value||new r,t.getWorldDirection(s.value);else if(i===ol.VIEW_POSITION){const i=e.camera;s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld),s.value.applyMatrix4(i.matrixWorldInverse)}else if(i===ol.RADIUS){const r=e.object.geometry;null===r.boundingSphere&&r.computeBoundingSphere(),al.copy(r.boundingSphere).applyMatrix4(t.matrixWorld),s.value=al.radius}}generate(e){const t=this.scope;return t===ol.WORLD_MATRIX?this._uniformNode.nodeType="mat4":t===ol.POSITION||t===ol.VIEW_POSITION||t===ol.DIRECTION||t===ol.SCALE?this._uniformNode.nodeType="vec3":t===ol.RADIUS&&(this._uniformNode.nodeType="float"),this._uniformNode.build(e)}serialize(e){super.serialize(e),e.scope=this.scope}deserialize(e){super.deserialize(e),this.scope=e.scope}}ol.WORLD_MATRIX="worldMatrix",ol.POSITION="position",ol.SCALE="scale",ol.VIEW_POSITION="viewPosition",ol.DIRECTION="direction",ol.RADIUS="radius";const ul=Bi(ol,ol.DIRECTION).setParameterLength(1),ll=Bi(ol,ol.WORLD_MATRIX).setParameterLength(1),dl=Bi(ol,ol.POSITION).setParameterLength(1),cl=Bi(ol,ol.SCALE).setParameterLength(1),hl=Bi(ol,ol.VIEW_POSITION).setParameterLength(1),pl=Bi(ol,ol.RADIUS).setParameterLength(1);class gl extends ol{static get type(){return"ModelNode"}constructor(e){super(e)}update(e){this.object3d=e.object,super.update(e)}}const ml=Ii(gl,gl.DIRECTION),fl=Ii(gl,gl.WORLD_MATRIX),yl=Ii(gl,gl.POSITION),xl=Ii(gl,gl.SCALE),bl=Ii(gl,gl.VIEW_POSITION),Tl=Ii(gl,gl.RADIUS),_l=Tn(new n).onObjectUpdate((({object:e},t)=>t.value.getNormalMatrix(e.matrixWorld))),vl=Tn(new a).onObjectUpdate((({object:e},t)=>t.value.copy(e.matrixWorld).invert())),Nl=Vi((e=>e.renderer.nodes.modelViewMatrix||Sl)).once()().toVar("modelViewMatrix"),Sl=rl.mul(fl),El=Vi((e=>(e.context.isHighPrecisionModelViewMatrix=!0,Tn("mat4").onObjectUpdate((({object:e,camera:t})=>e.modelViewMatrix.multiplyMatrices(t.matrixWorldInverse,e.matrixWorld)))))).once()().toVar("highpModelViewMatrix"),wl=Vi((e=>{const t=e.context.isHighPrecisionModelViewMatrix;return Tn("mat3").onObjectUpdate((({object:e,camera:r})=>(!0!==t&&e.modelViewMatrix.multiplyMatrices(r.matrixWorldInverse,e.matrixWorld),e.normalMatrix.getNormalMatrix(e.modelViewMatrix))))})).once()().toVar("highpModelNormalViewMatrix"),Al=Vu("position","vec3"),Rl=Al.toVarying("positionLocal"),Cl=Al.toVarying("positionPrevious"),Ml=fl.mul(Rl).xyz.toVarying("v_positionWorld").context({needsPositionReassign:!0}),Pl=Rl.transformDirection(fl).toVarying("v_positionWorldDirection").normalize().toVar("positionWorldDirection").context({needsPositionReassign:!0}),Ll=Vi((e=>e.context.setupPositionView()),"vec3").once()().toVarying("v_positionView").context({needsPositionReassign:!0}),Fl=Ll.negate().toVarying("v_positionViewDirection").normalize().toVar("positionViewDirection");class Bl extends $s{static get type(){return"FrontFacingNode"}constructor(){super("bool"),this.isFrontFacingNode=!0}generate(e){const{renderer:t,material:r}=e;return t.coordinateSystem===l&&r.side===N?"false":e.getFrontFacing()}}const Il=Ii(Bl),Dl=$i(Il).mul(2).sub(1),Vl=Vu("normal","vec3"),Ul=Vi((e=>!1===e.geometry.hasAttribute("normal")?(console.warn('THREE.TSL: Vertex attribute "normal" not found on geometry.'),Qi(0,1,0)):Vl),"vec3").once()().toVar("normalLocal"),Ol=Ll.dFdx().cross(Ll.dFdy()).normalize().toVar("normalFlat"),Gl=Vi((e=>{let t;return t=!0===e.material.flatShading?Ol:Qo(jl(Ul),"v_normalView").normalize(),t}),"vec3").once()().toVar("normalView"),kl=Qo(Gl.transformDirection(rl),"v_normalWorld").normalize().toVar("normalWorld"),zl=Vi((e=>e.context.setupNormal().context({getUV:null})),"vec3").once()().mul(Dl).toVar("transformedNormalView"),$l=zl.transformDirection(rl).toVar("transformedNormalWorld"),Hl=Vi((e=>e.context.setupClearcoatNormal().context({getUV:null})),"vec3").once()().mul(Dl).toVar("transformedClearcoatNormalView"),Wl=Vi((([e,t=fl])=>{const r=on(t),s=e.div(Qi(r[0].dot(r[0]),r[1].dot(r[1]),r[2].dot(r[2])));return r.mul(s).xyz})),jl=Vi((([e],t)=>{const r=t.renderer.nodes.modelNormalViewMatrix;if(null!==r)return r.transformDirection(e);const s=_l.mul(e);return rl.transformDirection(s)})),ql=new S,Xl=new a,Kl=Tn(0).onReference((({material:e})=>e)).onObjectUpdate((({material:e})=>e.refractionRatio)),Yl=Tn(1).onReference((({material:e})=>e)).onObjectUpdate((function({material:e,scene:t}){return e.envMap?e.envMapIntensity:t.environmentIntensity})),Ql=Tn(new a).onReference((function(e){return e.material})).onObjectUpdate((function({material:e,scene:t}){const r=null!==t.environment&&null===e.envMap?t.environmentRotation:e.envMapRotation;return r?(ql.copy(r),Xl.makeRotationFromEuler(ql)):Xl.identity(),Xl})),Zl=Fl.negate().reflect(zl),Jl=Fl.negate().refract(zl,Kl),ed=Zl.transformDirection(rl).toVar("reflectVector"),td=Jl.transformDirection(rl).toVar("reflectVector");class rd extends $u{static get type(){return"CubeTextureNode"}constructor(e,t=null,r=null,s=null){super(e,t,r,s),this.isCubeTextureNode=!0}getInputType(){return"cubeTexture"}getDefaultUV(){const e=this.value;return e.mapping===E?ed:e.mapping===w?td:(console.error('THREE.CubeTextureNode: Mapping "%s" not supported.',e.mapping),Qi(0,0,0))}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return e.renderer.coordinateSystem!==d&&r.isRenderTargetTexture||(t=Qi(t.x.negate(),t.yz)),Ql.mul(t)}generateUV(e,t){return t.build(e,"vec3")}}const sd=Bi(rd).setParameterLength(1,4).setName("cubeTexture");class id extends Hs{static get type(){return"ReferenceElementNode"}constructor(e,t){super(e,t),this.referenceNode=e,this.isReferenceElementNode=!0}getNodeType(){return this.referenceNode.uniformType}generate(e){const t=super.generate(e),r=this.referenceNode.getNodeType(),s=this.getNodeType();return e.format(t,r,s)}}class nd extends $s{static get type(){return"ReferenceNode"}constructor(e,t,r=null,s=null){super(),this.property=e,this.uniformType=t,this.object=r,this.count=s,this.properties=e.split("."),this.reference=r,this.node=null,this.group=null,this.name=null,this.updateType=Is.OBJECT}element(e){return Pi(new id(this,Pi(e)))}setGroup(e){return this.group=e,this}label(e){return this.name=e,this}setNodeType(e){let t=null;t=null!==this.count?qu(null,e,this.count):Array.isArray(this.getValueFromReference())?Yu(null,e):"texture"===e?Hu(null):"cubeTexture"===e?sd(null):Tn(null,e),null!==this.group&&t.setGroup(this.group),null!==this.name&&t.label(this.name),this.node=t.getSelf()}getNodeType(e){return null===this.node&&(this.updateReference(e),this.updateValue()),this.node.getNodeType(e)}getValueFromReference(e=this.reference){const{properties:t}=this;let r=e[t[0]];for(let e=1;ePi(new nd(e,t,r)),od=(e,t,r,s)=>Pi(new nd(e,t,s,r));class ud extends nd{static get type(){return"MaterialReferenceNode"}constructor(e,t,r=null){super(e,t,r),this.material=r,this.isMaterialReferenceNode=!0}updateReference(e){return this.reference=null!==this.material?this.material:e.material,this.reference}}const ld=(e,t,r=null)=>Pi(new ud(e,t,r)),dd=Vi((e=>(!1===e.geometry.hasAttribute("tangent")&&e.geometry.computeTangents(),Vu("tangent","vec4"))))(),cd=dd.xyz.toVar("tangentLocal"),hd=Nl.mul(tn(cd,0)).xyz.toVarying("v_tangentView").normalize().toVar("tangentView"),pd=hd.transformDirection(rl).toVarying("v_tangentWorld").normalize().toVar("tangentWorld"),gd=hd.toVar("transformedTangentView"),md=gd.transformDirection(rl).normalize().toVar("transformedTangentWorld"),fd=e=>e.mul(dd.w).xyz,yd=Qo(fd(Vl.cross(dd)),"v_bitangentGeometry").normalize().toVar("bitangentGeometry"),xd=Qo(fd(Ul.cross(cd)),"v_bitangentLocal").normalize().toVar("bitangentLocal"),bd=Qo(fd(Gl.cross(hd)),"v_bitangentView").normalize().toVar("bitangentView"),Td=Qo(fd(kl.cross(pd)),"v_bitangentWorld").normalize().toVar("bitangentWorld"),_d=fd(zl.cross(gd)).normalize().toVar("transformedBitangentView"),vd=_d.transformDirection(rl).normalize().toVar("transformedBitangentWorld"),Nd=on(hd,bd,Gl),Sd=Fl.mul(Nd),Ed=(()=>{let e=Un.cross(Fl);return e=e.cross(Un).normalize(),e=Ao(e,zl,Dn.mul(wn.oneMinus()).oneMinus().pow2().pow2()).normalize(),e})(),wd=Vi((e=>{const{eye_pos:t,surf_norm:r,mapN:s,uv:i}=e,n=t.dFdx(),a=t.dFdy(),o=i.dFdx(),u=i.dFdy(),l=r,d=a.cross(l),c=l.cross(n),h=d.mul(o.x).add(c.mul(u.x)),p=d.mul(o.y).add(c.mul(u.y)),g=h.dot(h).max(p.dot(p)),m=Dl.mul(g.inverseSqrt());return sa(h.mul(s.x,m),p.mul(s.y,m),l.mul(s.z)).normalize()}));class Ad extends js{static get type(){return"NormalMapNode"}constructor(e,t=null){super("vec3"),this.node=e,this.scaleNode=t,this.normalMapType=A}setup(e){const{normalMapType:t,scaleNode:r}=this;let s=this.node.mul(2).sub(1);null!==r&&(s=Qi(s.xy.mul(r),s.z));let i=null;if(t===R)i=jl(s);else if(t===A){i=!0===e.hasGeometryAttribute("tangent")?Nd.mul(s).normalize():wd({eye_pos:Ll,surf_norm:Gl,mapN:s,uv:Uu()})}return i}}const Rd=Bi(Ad).setParameterLength(1,2),Cd=Vi((({textureNode:e,bumpScale:t})=>{const r=t=>e.cache().context({getUV:e=>t(e.uvNode||Uu()),forceUVContext:!0}),s=$i(r((e=>e)));return qi($i(r((e=>e.add(e.dFdx())))).sub(s),$i(r((e=>e.add(e.dFdy())))).sub(s)).mul(t)})),Md=Vi((e=>{const{surf_pos:t,surf_norm:r,dHdxy:s}=e,i=t.dFdx().normalize(),n=r,a=t.dFdy().normalize().cross(n),o=n.cross(i),u=i.dot(a).mul(Dl),l=u.sign().mul(s.x.mul(a).add(s.y.mul(o)));return u.abs().mul(r).sub(l).normalize()}));class Pd extends js{static get type(){return"BumpMapNode"}constructor(e,t=null){super("vec3"),this.textureNode=e,this.scaleNode=t}setup(){const e=null!==this.scaleNode?this.scaleNode:1,t=Cd({textureNode:this.textureNode,bumpScale:e});return Md({surf_pos:Ll,surf_norm:Gl,dHdxy:t})}}const Ld=Bi(Pd).setParameterLength(1,2),Fd=new Map;class Bd extends $s{static get type(){return"MaterialNode"}constructor(e){super(),this.scope=e}getCache(e,t){let r=Fd.get(e);return void 0===r&&(r=ld(e,t),Fd.set(e,r)),r}getFloat(e){return this.getCache(e,"float")}getColor(e){return this.getCache(e,"color")}getTexture(e){return this.getCache("map"===e?"map":e+"Map","texture")}setup(e){const t=e.context.material,r=this.scope;let s=null;if(r===Bd.COLOR){const e=void 0!==t.color?this.getColor(r):Qi();s=t.map&&!0===t.map.isTexture?e.mul(this.getTexture("map")):e}else if(r===Bd.OPACITY){const e=this.getFloat(r);s=t.alphaMap&&!0===t.alphaMap.isTexture?e.mul(this.getTexture("alpha")):e}else if(r===Bd.SPECULAR_STRENGTH)s=t.specularMap&&!0===t.specularMap.isTexture?this.getTexture("specular").r:$i(1);else if(r===Bd.SPECULAR_INTENSITY){const e=this.getFloat(r);s=t.specularIntensityMap&&!0===t.specularIntensityMap.isTexture?e.mul(this.getTexture(r).a):e}else if(r===Bd.SPECULAR_COLOR){const e=this.getColor(r);s=t.specularColorMap&&!0===t.specularColorMap.isTexture?e.mul(this.getTexture(r).rgb):e}else if(r===Bd.ROUGHNESS){const e=this.getFloat(r);s=t.roughnessMap&&!0===t.roughnessMap.isTexture?e.mul(this.getTexture(r).g):e}else if(r===Bd.METALNESS){const e=this.getFloat(r);s=t.metalnessMap&&!0===t.metalnessMap.isTexture?e.mul(this.getTexture(r).b):e}else if(r===Bd.EMISSIVE){const e=this.getFloat("emissiveIntensity"),i=this.getColor(r).mul(e);s=t.emissiveMap&&!0===t.emissiveMap.isTexture?i.mul(this.getTexture(r)):i}else if(r===Bd.NORMAL)t.normalMap?(s=Rd(this.getTexture("normal"),this.getCache("normalScale","vec2")),s.normalMapType=t.normalMapType):s=t.bumpMap?Ld(this.getTexture("bump").r,this.getFloat("bumpScale")):Gl;else if(r===Bd.CLEARCOAT){const e=this.getFloat(r);s=t.clearcoatMap&&!0===t.clearcoatMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===Bd.CLEARCOAT_ROUGHNESS){const e=this.getFloat(r);s=t.clearcoatRoughnessMap&&!0===t.clearcoatRoughnessMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===Bd.CLEARCOAT_NORMAL)s=t.clearcoatNormalMap?Rd(this.getTexture(r),this.getCache(r+"Scale","vec2")):Gl;else if(r===Bd.SHEEN){const e=this.getColor("sheenColor").mul(this.getFloat("sheen"));s=t.sheenColorMap&&!0===t.sheenColorMap.isTexture?e.mul(this.getTexture("sheenColor").rgb):e}else if(r===Bd.SHEEN_ROUGHNESS){const e=this.getFloat(r);s=t.sheenRoughnessMap&&!0===t.sheenRoughnessMap.isTexture?e.mul(this.getTexture(r).a):e,s=s.clamp(.07,1)}else if(r===Bd.ANISOTROPY)if(t.anisotropyMap&&!0===t.anisotropyMap.isTexture){const e=this.getTexture(r);s=an(xc.x,xc.y,xc.y.negate(),xc.x).mul(e.rg.mul(2).sub(qi(1)).normalize().mul(e.b))}else s=xc;else if(r===Bd.IRIDESCENCE_THICKNESS){const e=ad("1","float",t.iridescenceThicknessRange);if(t.iridescenceThicknessMap){const i=ad("0","float",t.iridescenceThicknessRange);s=e.sub(i).mul(this.getTexture(r).g).add(i)}else s=e}else if(r===Bd.TRANSMISSION){const e=this.getFloat(r);s=t.transmissionMap?e.mul(this.getTexture(r).r):e}else if(r===Bd.THICKNESS){const e=this.getFloat(r);s=t.thicknessMap?e.mul(this.getTexture(r).g):e}else if(r===Bd.IOR)s=this.getFloat(r);else if(r===Bd.LIGHT_MAP)s=this.getTexture(r).rgb.mul(this.getFloat("lightMapIntensity"));else if(r===Bd.AO)s=this.getTexture(r).r.sub(1).mul(this.getFloat("aoMapIntensity")).add(1);else{const t=this.getNodeType(e);s=this.getCache(r,t)}return s}}Bd.ALPHA_TEST="alphaTest",Bd.COLOR="color",Bd.OPACITY="opacity",Bd.SHININESS="shininess",Bd.SPECULAR="specular",Bd.SPECULAR_STRENGTH="specularStrength",Bd.SPECULAR_INTENSITY="specularIntensity",Bd.SPECULAR_COLOR="specularColor",Bd.REFLECTIVITY="reflectivity",Bd.ROUGHNESS="roughness",Bd.METALNESS="metalness",Bd.NORMAL="normal",Bd.CLEARCOAT="clearcoat",Bd.CLEARCOAT_ROUGHNESS="clearcoatRoughness",Bd.CLEARCOAT_NORMAL="clearcoatNormal",Bd.EMISSIVE="emissive",Bd.ROTATION="rotation",Bd.SHEEN="sheen",Bd.SHEEN_ROUGHNESS="sheenRoughness",Bd.ANISOTROPY="anisotropy",Bd.IRIDESCENCE="iridescence",Bd.IRIDESCENCE_IOR="iridescenceIOR",Bd.IRIDESCENCE_THICKNESS="iridescenceThickness",Bd.IOR="ior",Bd.TRANSMISSION="transmission",Bd.THICKNESS="thickness",Bd.ATTENUATION_DISTANCE="attenuationDistance",Bd.ATTENUATION_COLOR="attenuationColor",Bd.LINE_SCALE="scale",Bd.LINE_DASH_SIZE="dashSize",Bd.LINE_GAP_SIZE="gapSize",Bd.LINE_WIDTH="linewidth",Bd.LINE_DASH_OFFSET="dashOffset",Bd.POINT_SIZE="size",Bd.DISPERSION="dispersion",Bd.LIGHT_MAP="light",Bd.AO="ao";const Id=Ii(Bd,Bd.ALPHA_TEST),Dd=Ii(Bd,Bd.COLOR),Vd=Ii(Bd,Bd.SHININESS),Ud=Ii(Bd,Bd.EMISSIVE),Od=Ii(Bd,Bd.OPACITY),Gd=Ii(Bd,Bd.SPECULAR),kd=Ii(Bd,Bd.SPECULAR_INTENSITY),zd=Ii(Bd,Bd.SPECULAR_COLOR),$d=Ii(Bd,Bd.SPECULAR_STRENGTH),Hd=Ii(Bd,Bd.REFLECTIVITY),Wd=Ii(Bd,Bd.ROUGHNESS),jd=Ii(Bd,Bd.METALNESS),qd=Ii(Bd,Bd.NORMAL),Xd=Ii(Bd,Bd.CLEARCOAT),Kd=Ii(Bd,Bd.CLEARCOAT_ROUGHNESS),Yd=Ii(Bd,Bd.CLEARCOAT_NORMAL),Qd=Ii(Bd,Bd.ROTATION),Zd=Ii(Bd,Bd.SHEEN),Jd=Ii(Bd,Bd.SHEEN_ROUGHNESS),ec=Ii(Bd,Bd.ANISOTROPY),tc=Ii(Bd,Bd.IRIDESCENCE),rc=Ii(Bd,Bd.IRIDESCENCE_IOR),sc=Ii(Bd,Bd.IRIDESCENCE_THICKNESS),ic=Ii(Bd,Bd.TRANSMISSION),nc=Ii(Bd,Bd.THICKNESS),ac=Ii(Bd,Bd.IOR),oc=Ii(Bd,Bd.ATTENUATION_DISTANCE),uc=Ii(Bd,Bd.ATTENUATION_COLOR),lc=Ii(Bd,Bd.LINE_SCALE),dc=Ii(Bd,Bd.LINE_DASH_SIZE),cc=Ii(Bd,Bd.LINE_GAP_SIZE),hc=Ii(Bd,Bd.LINE_WIDTH),pc=Ii(Bd,Bd.LINE_DASH_OFFSET),gc=Ii(Bd,Bd.POINT_SIZE),mc=Ii(Bd,Bd.DISPERSION),fc=Ii(Bd,Bd.LIGHT_MAP),yc=Ii(Bd,Bd.AO),xc=Tn(new t).onReference((function(e){return e.material})).onRenderUpdate((function({material:e}){this.value.set(e.anisotropy*Math.cos(e.anisotropyRotation),e.anisotropy*Math.sin(e.anisotropyRotation))})),bc=Vi((e=>e.context.setupModelViewProjection()),"vec4").once()().toVarying("v_modelViewProjection");class Tc extends $s{static get type(){return"IndexNode"}constructor(e){super("uint"),this.scope=e,this.isIndexNode=!0}generate(e){const t=this.getNodeType(e),r=this.scope;let s,i;if(r===Tc.VERTEX)s=e.getVertexIndex();else if(r===Tc.INSTANCE)s=e.getInstanceIndex();else if(r===Tc.DRAW)s=e.getDrawIndex();else if(r===Tc.INVOCATION_LOCAL)s=e.getInvocationLocalIndex();else if(r===Tc.INVOCATION_SUBGROUP)s=e.getInvocationSubgroupIndex();else{if(r!==Tc.SUBGROUP)throw new Error("THREE.IndexNode: Unknown scope: "+r);s=e.getSubgroupIndex()}if("vertex"===e.shaderStage||"compute"===e.shaderStage)i=s;else{i=Qo(this).build(e,t)}return i}}Tc.VERTEX="vertex",Tc.INSTANCE="instance",Tc.SUBGROUP="subgroup",Tc.INVOCATION_LOCAL="invocationLocal",Tc.INVOCATION_SUBGROUP="invocationSubgroup",Tc.DRAW="draw";const _c=Ii(Tc,Tc.VERTEX),vc=Ii(Tc,Tc.INSTANCE),Nc=Ii(Tc,Tc.SUBGROUP),Sc=Ii(Tc,Tc.INVOCATION_SUBGROUP),Ec=Ii(Tc,Tc.INVOCATION_LOCAL),wc=Ii(Tc,Tc.DRAW);class Ac extends $s{static get type(){return"InstanceNode"}constructor(e,t,r){super("void"),this.count=e,this.instanceMatrix=t,this.instanceColor=r,this.instanceMatrixNode=null,this.instanceColorNode=null,this.updateType=Is.FRAME,this.buffer=null,this.bufferColor=null}setup(e){const{count:t,instanceMatrix:r,instanceColor:s}=this;let{instanceMatrixNode:i,instanceColorNode:n}=this;if(null===i){if(t<=1e3)i=qu(r.array,"mat4",Math.max(t,1)).element(vc);else{const e=new C(r.array,16,1);this.buffer=e;const t=r.usage===y?bu:xu,s=[t(e,"vec4",16,0),t(e,"vec4",16,4),t(e,"vec4",16,8),t(e,"vec4",16,12)];i=un(...s)}this.instanceMatrixNode=i}if(s&&null===n){const e=new M(s.array,3),t=s.usage===y?bu:xu;this.bufferColor=e,n=Qi(t(e,"vec3",3,0)),this.instanceColorNode=n}const a=i.mul(Rl).xyz;if(Rl.assign(a),e.hasGeometryAttribute("normal")){const e=Wl(Ul,i);Ul.assign(e)}null!==this.instanceColorNode&&Nn("vec3","vInstanceColor").assign(this.instanceColorNode)}update(){this.instanceMatrix.usage!==y&&null!==this.buffer&&this.instanceMatrix.version!==this.buffer.version&&(this.buffer.version=this.instanceMatrix.version),this.instanceColor&&this.instanceColor.usage!==y&&null!==this.bufferColor&&this.instanceColor.version!==this.bufferColor.version&&(this.bufferColor.version=this.instanceColor.version)}}const Rc=Bi(Ac).setParameterLength(3);class Cc extends Ac{static get type(){return"InstancedMeshNode"}constructor(e){const{count:t,instanceMatrix:r,instanceColor:s}=e;super(t,r,s),this.instancedMesh=e}}const Mc=Bi(Cc).setParameterLength(1);class Pc extends $s{static get type(){return"BatchNode"}constructor(e){super("void"),this.batchMesh=e,this.batchingIdNode=null}setup(e){null===this.batchingIdNode&&(null===e.getDrawIndex()?this.batchingIdNode=vc:this.batchingIdNode=wc);const t=Vi((([e])=>{const t=Hi(Gu(Wu(this.batchMesh._indirectTexture),0).x),r=Hi(e).mod(t),s=Hi(e).div(t);return Wu(this.batchMesh._indirectTexture,Xi(r,s)).x})).setLayout({name:"getIndirectIndex",type:"uint",inputs:[{name:"id",type:"int"}]}),r=t(Hi(this.batchingIdNode)),s=this.batchMesh._matricesTexture,i=Hi(Gu(Wu(s),0).x),n=$i(r).mul(4).toInt().toVar(),a=n.mod(i),o=n.div(i),u=un(Wu(s,Xi(a,o)),Wu(s,Xi(a.add(1),o)),Wu(s,Xi(a.add(2),o)),Wu(s,Xi(a.add(3),o))),l=this.batchMesh._colorsTexture;if(null!==l){const e=Vi((([e])=>{const t=Hi(Gu(Wu(l),0).x),r=e,s=r.mod(t),i=r.div(t);return Wu(l,Xi(s,i)).rgb})).setLayout({name:"getBatchingColor",type:"vec3",inputs:[{name:"id",type:"int"}]}),t=e(r);Nn("vec3","vBatchColor").assign(t)}const d=on(u);Rl.assign(u.mul(Rl));const c=Ul.div(Qi(d[0].dot(d[0]),d[1].dot(d[1]),d[2].dot(d[2]))),h=d.mul(c).xyz;Ul.assign(h),e.hasGeometryAttribute("tangent")&&cd.mulAssign(d)}}const Lc=Bi(Pc).setParameterLength(1);class Fc extends Hs{static get type(){return"StorageArrayElementNode"}constructor(e,t){super(e,t),this.isStorageArrayElementNode=!0}set storageBufferNode(e){this.node=e}get storageBufferNode(){return this.node}getMemberType(e,t){const r=this.storageBufferNode.structTypeNode;return r?r.getMemberType(e,t):"void"}setup(e){return!1===e.isAvailable("storageBuffer")&&!0===this.node.isPBO&&e.setupPBO(this.node),super.setup(e)}generate(e,t){let r;const s=e.context.assign;if(r=!1===e.isAvailable("storageBuffer")?!0!==this.node.isPBO||!0===s||!this.node.value.isInstancedBufferAttribute&&"compute"===e.shaderStage?this.node.build(e):e.generatePBO(this):super.generate(e),!0!==s){const s=this.getNodeType(e);r=e.format(r,s,t)}return r}}const Bc=Bi(Fc).setParameterLength(2);class Ic extends ju{static get type(){return"StorageBufferNode"}constructor(e,t=null,r=0){let s,i=null;t&&t.isStruct?(s="struct",i=t.layout):null===t&&(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute)?(s=Es(e.itemSize),r=e.count):s=t,super(e,s,r),this.isStorageBufferNode=!0,this.structTypeNode=i,this.access=Vs.READ_WRITE,this.isAtomic=!1,this.isPBO=!1,this._attribute=null,this._varying=null,this.global=!0,!0!==e.isStorageBufferAttribute&&!0!==e.isStorageInstancedBufferAttribute&&(e.isInstancedBufferAttribute?e.isStorageInstancedBufferAttribute=!0:e.isStorageBufferAttribute=!0)}getHash(e){if(0===this.bufferCount){let t=e.globalCache.getData(this.value);return void 0===t&&(t={node:this},e.globalCache.setData(this.value,t)),t.node.uuid}return this.uuid}getInputType(){return this.value.isIndirectStorageBufferAttribute?"indirectStorageBuffer":"storageBuffer"}element(e){return Bc(this,e)}setPBO(e){return this.isPBO=e,this}getPBO(){return this.isPBO}setAccess(e){return this.access=e,this}toReadOnly(){return this.setAccess(Vs.READ_ONLY)}setAtomic(e){return this.isAtomic=e,this}toAtomic(){return this.setAtomic(!0)}getAttributeData(){return null===this._attribute&&(this._attribute=fu(this.value),this._varying=Qo(this._attribute)),{attribute:this._attribute,varying:this._varying}}getNodeType(e){if(null!==this.structTypeNode)return this.structTypeNode.getNodeType(e);if(e.isAvailable("storageBuffer")||e.isAvailable("indirectStorageBuffer"))return super.getNodeType(e);const{attribute:t}=this.getAttributeData();return t.getNodeType(e)}generate(e){if(null!==this.structTypeNode&&this.structTypeNode.build(e),e.isAvailable("storageBuffer")||e.isAvailable("indirectStorageBuffer"))return super.generate(e);const{attribute:t,varying:r}=this.getAttributeData(),s=r.build(e);return e.registerTransform(s,t),s}}const Dc=(e,t=null,r=0)=>Pi(new Ic(e,t,r)),Vc=new WeakMap;class Uc extends $s{static get type(){return"SkinningNode"}constructor(e){super("void"),this.skinnedMesh=e,this.updateType=Is.OBJECT,this.skinIndexNode=Vu("skinIndex","uvec4"),this.skinWeightNode=Vu("skinWeight","vec4"),this.bindMatrixNode=ad("bindMatrix","mat4"),this.bindMatrixInverseNode=ad("bindMatrixInverse","mat4"),this.boneMatricesNode=od("skeleton.boneMatrices","mat4",e.skeleton.bones.length),this.positionNode=Rl,this.toPositionNode=Rl,this.previousBoneMatricesNode=null}getSkinnedPosition(e=this.boneMatricesNode,t=this.positionNode){const{skinIndexNode:r,skinWeightNode:s,bindMatrixNode:i,bindMatrixInverseNode:n}=this,a=e.element(r.x),o=e.element(r.y),u=e.element(r.z),l=e.element(r.w),d=i.mul(t),c=sa(a.mul(s.x).mul(d),o.mul(s.y).mul(d),u.mul(s.z).mul(d),l.mul(s.w).mul(d));return n.mul(c).xyz}getSkinnedNormal(e=this.boneMatricesNode,t=Ul){const{skinIndexNode:r,skinWeightNode:s,bindMatrixNode:i,bindMatrixInverseNode:n}=this,a=e.element(r.x),o=e.element(r.y),u=e.element(r.z),l=e.element(r.w);let d=sa(s.x.mul(a),s.y.mul(o),s.z.mul(u),s.w.mul(l));return d=n.mul(d).mul(i),d.transformDirection(t).xyz}getPreviousSkinnedPosition(e){const t=e.object;return null===this.previousBoneMatricesNode&&(t.skeleton.previousBoneMatrices=new Float32Array(t.skeleton.boneMatrices),this.previousBoneMatricesNode=od("skeleton.previousBoneMatrices","mat4",t.skeleton.bones.length)),this.getSkinnedPosition(this.previousBoneMatricesNode,Cl)}needsPreviousBoneMatrices(e){const t=e.renderer.getMRT();return t&&t.has("velocity")||!0===Ms(e.object).useVelocity}setup(e){this.needsPreviousBoneMatrices(e)&&Cl.assign(this.getPreviousSkinnedPosition(e));const t=this.getSkinnedPosition();if(this.toPositionNode&&this.toPositionNode.assign(t),e.hasGeometryAttribute("normal")){const t=this.getSkinnedNormal();Ul.assign(t),e.hasGeometryAttribute("tangent")&&cd.assign(t)}return t}generate(e,t){if("void"!==t)return super.generate(e,t)}update(e){const t=e.object&&e.object.skeleton?e.object.skeleton:this.skinnedMesh.skeleton;Vc.get(t)!==e.frameId&&(Vc.set(t,e.frameId),null!==this.previousBoneMatricesNode&&t.previousBoneMatrices.set(t.boneMatrices),t.update())}}const Oc=e=>Pi(new Uc(e));class Gc extends $s{static get type(){return"LoopNode"}constructor(e=[]){super(),this.params=e}getVarName(e){return String.fromCharCode("i".charCodeAt(0)+e)}getProperties(e){const t=e.getNodeProperties(this);if(void 0!==t.stackNode)return t;const r={};for(let e=0,t=this.params.length-1;eNumber(o)?">=":"<")),n)i=`while ( ${o} )`;else{const t={start:a,end:o},r=t.start,s=t.end;let n="",h="",p="";c||(c="int"===l||"uint"===l?d.includes("<")?"++":"--":d.includes("<")?"+= 1.":"-= 1."),n+=e.getVar(l,u)+" = "+r,h+=u+" "+d+" "+s,p+=u+" "+c,i=`for ( ${n}; ${h}; ${p} )`}e.addFlowCode((0===t?"\n":"")+e.tab+i+" {\n\n").addFlowTab()}const i=s.build(e,"void"),n=t.returnsNode?t.returnsNode.build(e):"";e.removeFlowTab().addFlowCode("\n"+e.tab+i);for(let t=0,r=this.params.length-1;tPi(new Gc(Fi(e,"int"))).append(),zc=()=>Mu("break").append(),$c=new WeakMap,Hc=new s,Wc=Vi((({bufferMap:e,influence:t,stride:r,width:s,depth:i,offset:n})=>{const a=Hi(_c).mul(r).add(n),o=a.div(s),u=a.sub(o.mul(s));return Wu(e,Xi(u,o)).depth(i).xyz.mul(t)}));class jc extends $s{static get type(){return"MorphNode"}constructor(e){super("void"),this.mesh=e,this.morphBaseInfluence=Tn(1),this.updateType=Is.OBJECT}setup(e){const{geometry:r}=e,s=void 0!==r.morphAttributes.position,i=r.hasAttribute("normal")&&void 0!==r.morphAttributes.normal,n=r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color,a=void 0!==n?n.length:0,{texture:o,stride:u,size:l}=function(e){const r=void 0!==e.morphAttributes.position,s=void 0!==e.morphAttributes.normal,i=void 0!==e.morphAttributes.color,n=e.morphAttributes.position||e.morphAttributes.normal||e.morphAttributes.color,a=void 0!==n?n.length:0;let o=$c.get(e);if(void 0===o||o.count!==a){void 0!==o&&o.texture.dispose();const u=e.morphAttributes.position||[],l=e.morphAttributes.normal||[],d=e.morphAttributes.color||[];let c=0;!0===r&&(c=1),!0===s&&(c=2),!0===i&&(c=3);let h=e.attributes.position.count*c,p=1;const g=4096;h>g&&(p=Math.ceil(h/g),h=g);const m=new Float32Array(h*p*4*a),f=new P(m,h,p,a);f.type=L,f.needsUpdate=!0;const y=4*c;for(let b=0;b{const t=$i(0).toVar();this.mesh.count>1&&null!==this.mesh.morphTexture&&void 0!==this.mesh.morphTexture?t.assign(Wu(this.mesh.morphTexture,Xi(Hi(e).add(1),Hi(vc))).r):t.assign(ad("morphTargetInfluences","float").element(e).toVar()),Gi(t.notEqual(0),(()=>{!0===s&&Rl.addAssign(Wc({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:Hi(0)})),!0===i&&Ul.addAssign(Wc({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:Hi(1)}))}))}))}update(){const e=this.morphBaseInfluence;this.mesh.geometry.morphTargetsRelative?e.value=1:e.value=1-this.mesh.morphTargetInfluences.reduce(((e,t)=>e+t),0)}}const qc=Bi(jc).setParameterLength(1);class Xc extends $s{static get type(){return"LightingNode"}constructor(){super("vec3"),this.isLightingNode=!0}}class Kc extends Xc{static get type(){return"AONode"}constructor(e=null){super(),this.aoNode=e}setup(e){e.context.ambientOcclusion.mulAssign(this.aoNode)}}class Yc extends zo{static get type(){return"LightingContextNode"}constructor(e,t=null,r=null,s=null){super(e),this.lightingModel=t,this.backdropNode=r,this.backdropAlphaNode=s,this._value=null}getContext(){const{backdropNode:e,backdropAlphaNode:t}=this,r={directDiffuse:Qi().toVar("directDiffuse"),directSpecular:Qi().toVar("directSpecular"),indirectDiffuse:Qi().toVar("indirectDiffuse"),indirectSpecular:Qi().toVar("indirectSpecular")};return{radiance:Qi().toVar("radiance"),irradiance:Qi().toVar("irradiance"),iblIrradiance:Qi().toVar("iblIrradiance"),ambientOcclusion:$i(1).toVar("ambientOcclusion"),reflectedLight:r,backdrop:e,backdropAlpha:t}}setup(e){return this.value=this._value||(this._value=this.getContext()),this.value.lightingModel=this.lightingModel||e.context.lightingModel,super.setup(e)}}const Qc=Bi(Yc);class Zc extends Xc{static get type(){return"IrradianceNode"}constructor(e){super(),this.node=e}setup(e){e.context.irradiance.addAssign(this.node)}}let Jc,eh;class th extends $s{static get type(){return"ScreenNode"}constructor(e){super(),this.scope=e,this.isViewportNode=!0}getNodeType(){return this.scope===th.VIEWPORT?"vec4":"vec2"}getUpdateType(){let e=Is.NONE;return this.scope!==th.SIZE&&this.scope!==th.VIEWPORT||(e=Is.RENDER),this.updateType=e,e}update({renderer:e}){const t=e.getRenderTarget();this.scope===th.VIEWPORT?null!==t?eh.copy(t.viewport):(e.getViewport(eh),eh.multiplyScalar(e.getPixelRatio())):null!==t?(Jc.width=t.width,Jc.height=t.height):e.getDrawingBufferSize(Jc)}setup(){const e=this.scope;let r=null;return r=e===th.SIZE?Tn(Jc||(Jc=new t)):e===th.VIEWPORT?Tn(eh||(eh=new s)):qi(ih.div(sh)),r}generate(e){if(this.scope===th.COORDINATE){let t=e.getFragCoord();if(e.isFlipY()){const r=e.getNodeProperties(sh).outputNode.build(e);t=`${e.getType("vec2")}( ${t}.x, ${r}.y - ${t}.y )`}return t}return super.generate(e)}}th.COORDINATE="coordinate",th.VIEWPORT="viewport",th.SIZE="size",th.UV="uv";const rh=Ii(th,th.UV),sh=Ii(th,th.SIZE),ih=Ii(th,th.COORDINATE),nh=Ii(th,th.VIEWPORT),ah=nh.zw,oh=ih.sub(nh.xy),uh=oh.div(ah),lh=Vi((()=>(console.warn('THREE.TSL: "viewportResolution" is deprecated. Use "screenSize" instead.'),sh)),"vec2").once()(),dh=Vi((()=>(console.warn('THREE.TSL: "viewportTopLeft" is deprecated. Use "screenUV" instead.'),rh)),"vec2").once()(),ch=Vi((()=>(console.warn('THREE.TSL: "viewportBottomLeft" is deprecated. Use "screenUV.flipY()" instead.'),rh.flipY())),"vec2").once()(),hh=new t;class ph extends $u{static get type(){return"ViewportTextureNode"}constructor(e=rh,t=null,r=null){null===r&&((r=new F).minFilter=B),super(r,e,t),this.generateMipmaps=!1,this.isOutputTextureNode=!0,this.updateBeforeType=Is.FRAME}updateBefore(e){const t=e.renderer;t.getDrawingBufferSize(hh);const r=this.value;r.image.width===hh.width&&r.image.height===hh.height||(r.image.width=hh.width,r.image.height=hh.height,r.needsUpdate=!0);const s=r.generateMipmaps;r.generateMipmaps=this.generateMipmaps,t.copyFramebufferToTexture(r),r.generateMipmaps=s}clone(){const e=new this.constructor(this.uvNode,this.levelNode,this.value);return e.generateMipmaps=this.generateMipmaps,e}}const gh=Bi(ph).setParameterLength(0,3),mh=Bi(ph,null,null,{generateMipmaps:!0}).setParameterLength(0,3);let fh=null;class yh extends ph{static get type(){return"ViewportDepthTextureNode"}constructor(e=rh,t=null){null===fh&&(fh=new I),super(e,t,fh)}}const xh=Bi(yh).setParameterLength(0,2);class bh extends $s{static get type(){return"ViewportDepthNode"}constructor(e,t=null){super("float"),this.scope=e,this.valueNode=t,this.isViewportDepthNode=!0}generate(e){const{scope:t}=this;return t===bh.DEPTH_BASE?e.getFragDepth():super.generate(e)}setup({camera:e}){const{scope:t}=this,r=this.valueNode;let s=null;if(t===bh.DEPTH_BASE)null!==r&&(s=Sh().assign(r));else if(t===bh.DEPTH)s=e.isPerspectiveCamera?_h(Ll.z,Zu,Ju):Th(Ll.z,Zu,Ju);else if(t===bh.LINEAR_DEPTH)if(null!==r)if(e.isPerspectiveCamera){const e=vh(r,Zu,Ju);s=Th(e,Zu,Ju)}else s=r;else s=Th(Ll.z,Zu,Ju);return s}}bh.DEPTH_BASE="depthBase",bh.DEPTH="depth",bh.LINEAR_DEPTH="linearDepth";const Th=(e,t,r)=>e.add(t).div(t.sub(r)),_h=(e,t,r)=>t.add(e).mul(r).div(r.sub(t).mul(e)),vh=(e,t,r)=>t.mul(r).div(r.sub(t).mul(e).sub(r)),Nh=(e,t,r)=>{t=t.max(1e-6).toVar();const s=Ua(e.negate().div(t)),i=Ua(r.div(t));return s.div(i)},Sh=Bi(bh,bh.DEPTH_BASE),Eh=Ii(bh,bh.DEPTH),wh=Bi(bh,bh.LINEAR_DEPTH).setParameterLength(0,1),Ah=wh(xh());Eh.assign=e=>Sh(e);const Rh=Bi(class extends $s{constructor(e){super("float"),this.name=e,this.isBuiltinNode=!0}generate(){return this.name}}).setParameterLength(1);class Ch extends $s{static get type(){return"ClippingNode"}constructor(e=Ch.DEFAULT){super(),this.scope=e}setup(e){super.setup(e);const t=e.clippingContext,{intersectionPlanes:r,unionPlanes:s}=t;return this.hardwareClipping=e.material.hardwareClipping,this.scope===Ch.ALPHA_TO_COVERAGE?this.setupAlphaToCoverage(r,s):this.scope===Ch.HARDWARE?this.setupHardwareClipping(s,e):this.setupDefault(r,s)}setupAlphaToCoverage(e,t){return Vi((()=>{const r=$i().toVar("distanceToPlane"),s=$i().toVar("distanceToGradient"),i=$i(1).toVar("clipOpacity"),n=t.length;if(!1===this.hardwareClipping&&n>0){const e=Yu(t);kc(n,(({i:t})=>{const n=e.element(t);r.assign(Ll.dot(n.xyz).negate().add(n.w)),s.assign(r.fwidth().div(2)),i.mulAssign(Po(s.negate(),s,r))}))}const a=e.length;if(a>0){const t=Yu(e),n=$i(1).toVar("intersectionClipOpacity");kc(a,(({i:e})=>{const i=t.element(e);r.assign(Ll.dot(i.xyz).negate().add(i.w)),s.assign(r.fwidth().div(2)),n.mulAssign(Po(s.negate(),s,r).oneMinus())})),i.mulAssign(n.oneMinus())}Sn.a.mulAssign(i),Sn.a.equal(0).discard()}))()}setupDefault(e,t){return Vi((()=>{const r=t.length;if(!1===this.hardwareClipping&&r>0){const e=Yu(t);kc(r,(({i:t})=>{const r=e.element(t);Ll.dot(r.xyz).greaterThan(r.w).discard()}))}const s=e.length;if(s>0){const t=Yu(e),r=ji(!0).toVar("clipped");kc(s,(({i:e})=>{const s=t.element(e);r.assign(Ll.dot(s.xyz).greaterThan(s.w).and(r))})),r.discard()}}))()}setupHardwareClipping(e,t){const r=e.length;return t.enableHardwareClipping(r),Vi((()=>{const s=Yu(e),i=Rh(t.getClipDistance());kc(r,(({i:e})=>{const t=s.element(e),r=Ll.dot(t.xyz).sub(t.w).negate();i.element(e).assign(r)}))}))()}}Ch.ALPHA_TO_COVERAGE="alphaToCoverage",Ch.DEFAULT="default",Ch.HARDWARE="hardware";const Mh=Vi((([e])=>Ha(na(1e4,Wa(na(17,e.x).add(na(.1,e.y)))).mul(sa(.1,Qa(Wa(na(13,e.y).add(e.x)))))))),Ph=Vi((([e])=>Mh(qi(Mh(e.xy),e.z)))),Lh=Vi((([e])=>{const t=po(Ja(ro(e.xyz)),Ja(so(e.xyz))),r=$i(1).div($i(.05).mul(t)).toVar("pixScale"),s=qi(Da(ka(Ua(r))),Da(za(Ua(r)))),i=qi(Ph(ka(s.x.mul(e.xyz))),Ph(ka(s.y.mul(e.xyz)))),n=Ha(Ua(r)),a=sa(na(n.oneMinus(),i.x),na(n,i.y)),o=ho(n,n.oneMinus()),u=Qi(a.mul(a).div(na(2,o).mul(ia(1,o))),a.sub(na(.5,o)).div(ia(1,o)),ia(1,ia(1,a).mul(ia(1,a)).div(na(2,o).mul(ia(1,o))))),l=a.lessThan(o.oneMinus()).select(a.lessThan(o).select(u.x,u.y),u.z);return Ro(l,1e-6,1)})).setLayout({name:"getAlphaHashThreshold",type:"float",inputs:[{name:"position",type:"vec3"}]});class Fh extends D{static get type(){return"NodeMaterial"}get type(){return this.constructor.type}set type(e){}constructor(){super(),this.isNodeMaterial=!0,this.fog=!0,this.lights=!1,this.hardwareClipping=!1,this.lightsNode=null,this.envNode=null,this.aoNode=null,this.colorNode=null,this.normalNode=null,this.opacityNode=null,this.backdropNode=null,this.backdropAlphaNode=null,this.alphaTestNode=null,this.positionNode=null,this.geometryNode=null,this.depthNode=null,this.shadowPositionNode=null,this.receivedShadowNode=null,this.castShadowNode=null,this.outputNode=null,this.mrtNode=null,this.fragmentNode=null,this.vertexNode=null}customProgramCacheKey(){return this.type+_s(this)}build(e){this.setup(e)}setupObserver(e){return new fs(e)}setup(e){e.context.setupNormal=()=>this.setupNormal(e),e.context.setupPositionView=()=>this.setupPositionView(e),e.context.setupModelViewProjection=()=>this.setupModelViewProjection(e);const t=e.renderer,r=t.getRenderTarget();e.addStack();const s=this.vertexNode||this.setupVertex(e);let i;e.stack.outputNode=s,this.setupHardwareClipping(e),null!==this.geometryNode&&(e.stack.outputNode=e.stack.outputNode.bypass(this.geometryNode)),e.addFlow("vertex",e.removeStack()),e.addStack();const n=this.setupClipping(e);if(!0!==this.depthWrite&&!0!==this.depthTest||(null!==r?!0===r.depthBuffer&&this.setupDepth(e):!0===t.depth&&this.setupDepth(e)),null===this.fragmentNode){this.setupDiffuseColor(e),this.setupVariants(e);const s=this.setupLighting(e);null!==n&&e.stack.add(n);const a=tn(s,Sn.a).max(0);i=this.setupOutput(e,a),zn.assign(i);const o=null!==this.outputNode;if(o&&(i=this.outputNode),null!==r){const e=t.getMRT(),r=this.mrtNode;null!==e?(o&&zn.assign(i),i=e,null!==r&&(i=e.merge(r))):null!==r&&(i=r)}}else{let t=this.fragmentNode;!0!==t.isOutputStructNode&&(t=tn(t)),i=this.setupOutput(e,t)}e.stack.outputNode=i,e.addFlow("fragment",e.removeStack()),e.observer=this.setupObserver(e)}setupClipping(e){if(null===e.clippingContext)return null;const{unionPlanes:t,intersectionPlanes:r}=e.clippingContext;let s=null;if(t.length>0||r.length>0){const t=e.renderer.samples;this.alphaToCoverage&&t>1?s=Pi(new Ch(Ch.ALPHA_TO_COVERAGE)):e.stack.add(Pi(new Ch))}return s}setupHardwareClipping(e){if(this.hardwareClipping=!1,null===e.clippingContext)return;const t=e.clippingContext.unionPlanes.length;t>0&&t<=8&&e.isAvailable("clipDistance")&&(e.stack.add(Pi(new Ch(Ch.HARDWARE))),this.hardwareClipping=!0)}setupDepth(e){const{renderer:t,camera:r}=e;let s=this.depthNode;if(null===s){const e=t.getMRT();e&&e.has("depth")?s=e.get("depth"):!0===t.logarithmicDepthBuffer&&(s=r.isPerspectiveCamera?Nh(Ll.z,Zu,Ju):Th(Ll.z,Zu,Ju))}null!==s&&Eh.assign(s).append()}setupPositionView(){return Nl.mul(Rl).xyz}setupModelViewProjection(){return el.mul(Ll)}setupVertex(e){return e.addStack(),this.setupPosition(e),e.context.vertex=e.removeStack(),bc}setupPosition(e){const{object:t,geometry:r}=e;if((r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color)&&qc(t).append(),!0===t.isSkinnedMesh&&Oc(t).append(),this.displacementMap){const e=ld("displacementMap","texture"),t=ld("displacementScale","float"),r=ld("displacementBias","float");Rl.addAssign(Ul.normalize().mul(e.x.mul(t).add(r)))}return t.isBatchedMesh&&Lc(t).append(),t.isInstancedMesh&&t.instanceMatrix&&!0===t.instanceMatrix.isInstancedBufferAttribute&&Mc(t).append(),null!==this.positionNode&&Rl.assign(this.positionNode.context({isPositionNodeInput:!0})),Rl}setupDiffuseColor({object:e,geometry:t}){let r=this.colorNode?tn(this.colorNode):Dd;if(!0===this.vertexColors&&t.hasAttribute("color")&&(r=tn(r.xyz.mul(Vu("color","vec3")),r.a)),e.instanceColor){r=Nn("vec3","vInstanceColor").mul(r)}if(e.isBatchedMesh&&e._colorsTexture){r=Nn("vec3","vBatchColor").mul(r)}Sn.assign(r);const s=this.opacityNode?$i(this.opacityNode):Od;if(Sn.a.assign(Sn.a.mul(s)),null!==this.alphaTestNode||this.alphaTest>0){const e=null!==this.alphaTestNode?$i(this.alphaTestNode):Id;Sn.a.lessThanEqual(e).discard()}!0===this.alphaHash&&Sn.a.lessThan(Lh(Rl)).discard(),!1===this.transparent&&this.blending===V&&!1===this.alphaToCoverage&&Sn.a.assign(1)}setupVariants(){}setupOutgoingLight(){return!0===this.lights?Qi(0):Sn.rgb}setupNormal(){return this.normalNode?Qi(this.normalNode):qd}setupEnvironment(){let e=null;return this.envNode?e=this.envNode:this.envMap&&(e=this.envMap.isCubeTexture?ld("envMap","cubeTexture"):ld("envMap","texture")),e}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new Zc(fc)),t}setupLights(e){const t=[],r=this.setupEnvironment(e);r&&r.isLightingNode&&t.push(r);const s=this.setupLightMap(e);if(s&&s.isLightingNode&&t.push(s),null!==this.aoNode||e.material.aoMap){const e=null!==this.aoNode?this.aoNode:yc;t.push(new Kc(e))}let i=this.lightsNode||e.lightsNode;return t.length>0&&(i=e.renderer.lighting.createNode([...i.getLights(),...t])),i}setupLightingModel(){}setupLighting(e){const{material:t}=e,{backdropNode:r,backdropAlphaNode:s,emissiveNode:i}=this,n=!0===this.lights||null!==this.lightsNode?this.setupLights(e):null;let a=this.setupOutgoingLight(e);if(n&&n.getScope().hasLights){const t=this.setupLightingModel(e)||null;a=Qc(n,t,r,s)}else null!==r&&(a=Qi(null!==s?Ao(a,r,s):r));return(i&&!0===i.isNode||t.emissive&&!0===t.emissive.isColor)&&(En.assign(Qi(i||Ud)),a=a.add(En)),a}setupFog(e,t){const r=e.fogNode;return r&&(zn.assign(t),t=tn(r)),t}setupOutput(e,t){return!0===this.fog&&(t=this.setupFog(e,t)),t}setDefaultValues(e){for(const t in e){const r=e[t];void 0===this[t]&&(this[t]=r,r&&r.clone&&(this[t]=r.clone()))}const t=Object.getOwnPropertyDescriptors(e.constructor.prototype);for(const e in t)void 0===Object.getOwnPropertyDescriptor(this.constructor.prototype,e)&&void 0!==t[e].get&&Object.defineProperty(this.constructor.prototype,e,t[e])}toJSON(e){const t=void 0===e||"string"==typeof e;t&&(e={textures:{},images:{},nodes:{}});const r=D.prototype.toJSON.call(this,e),s=vs(this);r.inputNodes={};for(const{property:t,childNode:i}of s)r.inputNodes[t]=i.toJSON(e).uuid;function i(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(t){const t=i(e.textures),s=i(e.images),n=i(e.nodes);t.length>0&&(r.textures=t),s.length>0&&(r.images=s),n.length>0&&(r.nodes=n)}return r}copy(e){return this.lightsNode=e.lightsNode,this.envNode=e.envNode,this.colorNode=e.colorNode,this.normalNode=e.normalNode,this.opacityNode=e.opacityNode,this.backdropNode=e.backdropNode,this.backdropAlphaNode=e.backdropAlphaNode,this.alphaTestNode=e.alphaTestNode,this.positionNode=e.positionNode,this.geometryNode=e.geometryNode,this.depthNode=e.depthNode,this.shadowPositionNode=e.shadowPositionNode,this.receivedShadowNode=e.receivedShadowNode,this.castShadowNode=e.castShadowNode,this.outputNode=e.outputNode,this.mrtNode=e.mrtNode,this.fragmentNode=e.fragmentNode,this.vertexNode=e.vertexNode,super.copy(e)}}const Bh=new U;class Ih extends Fh{static get type(){return"LineBasicNodeMaterial"}constructor(e){super(),this.isLineBasicNodeMaterial=!0,this.setDefaultValues(Bh),this.setValues(e)}}const Dh=new O;class Vh extends Fh{static get type(){return"LineDashedNodeMaterial"}constructor(e){super(),this.isLineDashedNodeMaterial=!0,this.setDefaultValues(Dh),this.dashOffset=0,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.setValues(e)}setupVariants(){const e=this.offsetNode?$i(this.offsetNode):pc,t=this.dashScaleNode?$i(this.dashScaleNode):lc,r=this.dashSizeNode?$i(this.dashSizeNode):dc,s=this.gapSizeNode?$i(this.gapSizeNode):cc;$n.assign(r),Hn.assign(s);const i=Qo(Vu("lineDistance").mul(t));(e?i.add(e):i).mod($n.add(Hn)).greaterThan($n).discard()}}let Uh=null;class Oh extends ph{static get type(){return"ViewportSharedTextureNode"}constructor(e=rh,t=null){null===Uh&&(Uh=new F),super(e,t,Uh)}updateReference(){return this}}const Gh=Bi(Oh).setParameterLength(0,2),kh=new O;class zh extends Fh{static get type(){return"Line2NodeMaterial"}constructor(e={}){super(),this.isLine2NodeMaterial=!0,this.setDefaultValues(kh),this.useColor=e.vertexColors,this.dashOffset=0,this.lineWidth=1,this.lineColorNode=null,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.blending=G,this._useDash=e.dashed,this._useAlphaToCoverage=!0,this._useWorldUnits=!1,this.setValues(e)}setup(e){const{renderer:t}=e,r=this._useAlphaToCoverage,s=this.useColor,i=this._useDash,n=this._useWorldUnits,a=Vi((({start:e,end:t})=>{const r=el.element(2).element(2),s=el.element(3).element(2).mul(-.5).div(r).sub(e.z).div(t.z.sub(e.z));return tn(Ao(e.xyz,t.xyz,s),t.w)})).setLayout({name:"trimSegment",type:"vec4",inputs:[{name:"start",type:"vec4"},{name:"end",type:"vec4"}]});this.vertexNode=Vi((()=>{const e=Vu("instanceStart"),t=Vu("instanceEnd"),r=tn(Nl.mul(tn(e,1))).toVar("start"),s=tn(Nl.mul(tn(t,1))).toVar("end");if(i){const e=this.dashScaleNode?$i(this.dashScaleNode):lc,t=this.offsetNode?$i(this.offsetNode):pc,r=Vu("instanceDistanceStart"),s=Vu("instanceDistanceEnd");let i=Al.y.lessThan(.5).select(e.mul(r),e.mul(s));i=i.add(t),Nn("float","lineDistance").assign(i)}n&&(Nn("vec3","worldStart").assign(r.xyz),Nn("vec3","worldEnd").assign(s.xyz));const o=nh.z.div(nh.w),u=el.element(2).element(3).equal(-1);Gi(u,(()=>{Gi(r.z.lessThan(0).and(s.z.greaterThan(0)),(()=>{s.assign(a({start:r,end:s}))})).ElseIf(s.z.lessThan(0).and(r.z.greaterThanEqual(0)),(()=>{r.assign(a({start:s,end:r}))}))}));const l=el.mul(r),d=el.mul(s),c=l.xyz.div(l.w),h=d.xyz.div(d.w),p=h.xy.sub(c.xy).toVar();p.x.assign(p.x.mul(o)),p.assign(p.normalize());const g=tn().toVar();if(n){const e=s.xyz.sub(r.xyz).normalize(),t=Ao(r.xyz,s.xyz,.5).normalize(),n=e.cross(t).normalize(),a=e.cross(n),o=Nn("vec4","worldPos");o.assign(Al.y.lessThan(.5).select(r,s));const u=hc.mul(.5);o.addAssign(tn(Al.x.lessThan(0).select(n.mul(u),n.mul(u).negate()),0)),i||(o.addAssign(tn(Al.y.lessThan(.5).select(e.mul(u).negate(),e.mul(u)),0)),o.addAssign(tn(a.mul(u),0)),Gi(Al.y.greaterThan(1).or(Al.y.lessThan(0)),(()=>{o.subAssign(tn(a.mul(2).mul(u),0))}))),g.assign(el.mul(o));const l=Qi().toVar();l.assign(Al.y.lessThan(.5).select(c,h)),g.z.assign(l.z.mul(g.w))}else{const e=qi(p.y,p.x.negate()).toVar("offset");p.x.assign(p.x.div(o)),e.x.assign(e.x.div(o)),e.assign(Al.x.lessThan(0).select(e.negate(),e)),Gi(Al.y.lessThan(0),(()=>{e.assign(e.sub(p))})).ElseIf(Al.y.greaterThan(1),(()=>{e.assign(e.add(p))})),e.assign(e.mul(hc)),e.assign(e.div(nh.w)),g.assign(Al.y.lessThan(.5).select(l,d)),e.assign(e.mul(g.w)),g.assign(g.add(tn(e,0,0)))}return g}))();const o=Vi((({p1:e,p2:t,p3:r,p4:s})=>{const i=e.sub(r),n=s.sub(r),a=t.sub(e),o=i.dot(n),u=n.dot(a),l=i.dot(a),d=n.dot(n),c=a.dot(a).mul(d).sub(u.mul(u)),h=o.mul(u).sub(l.mul(d)).div(c).clamp(),p=o.add(u.mul(h)).div(d).clamp();return qi(h,p)}));if(this.colorNode=Vi((()=>{const e=Uu();if(i){const t=this.dashSizeNode?$i(this.dashSizeNode):dc,r=this.gapSizeNode?$i(this.gapSizeNode):cc;$n.assign(t),Hn.assign(r);const s=Nn("float","lineDistance");e.y.lessThan(-1).or(e.y.greaterThan(1)).discard(),s.mod($n.add(Hn)).greaterThan($n).discard()}const a=$i(1).toVar("alpha");if(n){const e=Nn("vec3","worldStart"),s=Nn("vec3","worldEnd"),n=Nn("vec4","worldPos").xyz.normalize().mul(1e5),u=s.sub(e),l=o({p1:e,p2:s,p3:Qi(0,0,0),p4:n}),d=e.add(u.mul(l.x)),c=n.mul(l.y),h=d.sub(c).length().div(hc);if(!i)if(r&&t.samples>1){const e=h.fwidth();a.assign(Po(e.negate().add(.5),e.add(.5),h).oneMinus())}else h.greaterThan(.5).discard()}else if(r&&t.samples>1){const t=e.x,r=e.y.greaterThan(0).select(e.y.sub(1),e.y.add(1)),s=t.mul(t).add(r.mul(r)),i=$i(s.fwidth()).toVar("dlen");Gi(e.y.abs().greaterThan(1),(()=>{a.assign(Po(i.oneMinus(),i.add(1),s).oneMinus())}))}else Gi(e.y.abs().greaterThan(1),(()=>{const t=e.x,r=e.y.greaterThan(0).select(e.y.sub(1),e.y.add(1));t.mul(t).add(r.mul(r)).greaterThan(1).discard()}));let u;if(this.lineColorNode)u=this.lineColorNode;else if(s){const e=Vu("instanceColorStart"),t=Vu("instanceColorEnd");u=Al.y.lessThan(.5).select(e,t).mul(Dd)}else u=Dd;return tn(u,a)}))(),this.transparent){const e=this.opacityNode?$i(this.opacityNode):Od;this.outputNode=tn(this.colorNode.rgb.mul(e).add(Gh().rgb.mul(e.oneMinus())),this.colorNode.a)}super.setup(e)}get worldUnits(){return this._useWorldUnits}set worldUnits(e){this._useWorldUnits!==e&&(this._useWorldUnits=e,this.needsUpdate=!0)}get dashed(){return this._useDash}set dashed(e){this._useDash!==e&&(this._useDash=e,this.needsUpdate=!0)}get alphaToCoverage(){return this._useAlphaToCoverage}set alphaToCoverage(e){this._useAlphaToCoverage!==e&&(this._useAlphaToCoverage=e,this.needsUpdate=!0)}}const $h=e=>Pi(e).mul(.5).add(.5),Hh=new k;class Wh extends Fh{static get type(){return"MeshNormalNodeMaterial"}constructor(e){super(),this.isMeshNormalNodeMaterial=!0,this.setDefaultValues(Hh),this.setValues(e)}setupDiffuseColor(){const e=this.opacityNode?$i(this.opacityNode):Od;Sn.assign(ou(tn($h(zl),e),z))}}class jh extends js{static get type(){return"EquirectUVNode"}constructor(e=Pl){super("vec2"),this.dirNode=e}setup(){const e=this.dirNode,t=e.z.atan(e.x).mul(1/(2*Math.PI)).add(.5),r=e.y.clamp(-1,1).asin().mul(1/Math.PI).add(.5);return qi(t,r)}}const qh=Bi(jh).setParameterLength(0,1);class Xh extends ${constructor(e=1,t={}){super(e,t),this.isCubeRenderTarget=!0}fromEquirectangularTexture(e,t){const r=t.minFilter,s=t.generateMipmaps;t.generateMipmaps=!0,this.texture.type=t.type,this.texture.colorSpace=t.colorSpace,this.texture.generateMipmaps=t.generateMipmaps,this.texture.minFilter=t.minFilter,this.texture.magFilter=t.magFilter;const i=new H(5,5,5),n=qh(Pl),a=new Fh;a.colorNode=Hu(t,n,0),a.side=N,a.blending=G;const o=new W(i,a),u=new j;u.add(o),t.minFilter===B&&(t.minFilter=q);const l=new X(1,10,this),d=e.getMRT();return e.setMRT(null),l.update(e,u),e.setMRT(d),t.minFilter=r,t.currentGenerateMipmaps=s,o.geometry.dispose(),o.material.dispose(),this}}const Kh=new WeakMap;class Yh extends js{static get type(){return"CubeMapNode"}constructor(e){super("vec3"),this.envNode=e,this._cubeTexture=null,this._cubeTextureNode=sd(null);const t=new K;t.isRenderTargetTexture=!0,this._defaultTexture=t,this.updateBeforeType=Is.RENDER}updateBefore(e){const{renderer:t,material:r}=e,s=this.envNode;if(s.isTextureNode||s.isMaterialReferenceNode){const e=s.isTextureNode?s.value:r[s.property];if(e&&e.isTexture){const r=e.mapping;if(r===Y||r===Q){if(Kh.has(e)){const t=Kh.get(e);Zh(t,e.mapping),this._cubeTexture=t}else{const r=e.image;if(function(e){return null!=e&&e.height>0}(r)){const s=new Xh(r.height);s.fromEquirectangularTexture(t,e),Zh(s.texture,e.mapping),this._cubeTexture=s.texture,Kh.set(e,s.texture),e.addEventListener("dispose",Qh)}else this._cubeTexture=this._defaultTexture}this._cubeTextureNode.value=this._cubeTexture}else this._cubeTextureNode=this.envNode}}}setup(e){return this.updateBefore(e),this._cubeTextureNode}}function Qh(e){const t=e.target;t.removeEventListener("dispose",Qh);const r=Kh.get(t);void 0!==r&&(Kh.delete(t),r.dispose())}function Zh(e,t){t===Y?e.mapping=E:t===Q&&(e.mapping=w)}const Jh=Bi(Yh).setParameterLength(1);class ep extends Xc{static get type(){return"BasicEnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){e.context.environment=Jh(this.envNode)}}class tp extends Xc{static get type(){return"BasicLightMapNode"}constructor(e=null){super(),this.lightMapNode=e}setup(e){const t=$i(1/Math.PI);e.context.irradianceLightMap=this.lightMapNode.mul(t)}}class rp{start(e){e.lightsNode.setupLights(e,e.lightsNode.getLightNodes(e)),this.indirect(e)}finish(){}direct(){}directRectArea(){}indirect(){}ambientOcclusion(){}}class sp extends rp{constructor(){super()}indirect({context:e}){const t=e.ambientOcclusion,r=e.reflectedLight,s=e.irradianceLightMap;r.indirectDiffuse.assign(tn(0)),s?r.indirectDiffuse.addAssign(s):r.indirectDiffuse.addAssign(tn(1,1,1,0)),r.indirectDiffuse.mulAssign(t),r.indirectDiffuse.mulAssign(Sn.rgb)}finish(e){const{material:t,context:r}=e,s=r.outgoingLight,i=e.context.environment;if(i)switch(t.combine){case ee:s.rgb.assign(Ao(s.rgb,s.rgb.mul(i.rgb),$d.mul(Hd)));break;case J:s.rgb.assign(Ao(s.rgb,i.rgb,$d.mul(Hd)));break;case Z:s.rgb.addAssign(i.rgb.mul($d.mul(Hd)));break;default:console.warn("THREE.BasicLightingModel: Unsupported .combine value:",t.combine)}}}const ip=new te;class np extends Fh{static get type(){return"MeshBasicNodeMaterial"}constructor(e){super(),this.isMeshBasicNodeMaterial=!0,this.lights=!0,this.setDefaultValues(ip),this.setValues(e)}setupNormal(){return Gl}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new ep(t):null}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new tp(fc)),t}setupOutgoingLight(){return Sn.rgb}setupLightingModel(){return new sp}}const ap=Vi((({f0:e,f90:t,dotVH:r})=>{const s=r.mul(-5.55473).sub(6.98316).mul(r).exp2();return e.mul(s.oneMinus()).add(t.mul(s))})),op=Vi((e=>e.diffuseColor.mul(1/Math.PI))),up=Vi((({dotNH:e})=>kn.mul($i(.5)).add(1).mul($i(1/Math.PI)).mul(e.pow(kn)))),lp=Vi((({lightDirection:e})=>{const t=e.add(Fl).normalize(),r=zl.dot(t).clamp(),s=Fl.dot(t).clamp(),i=ap({f0:On,f90:1,dotVH:s}),n=$i(.25),a=up({dotNH:r});return i.mul(n).mul(a)}));class dp extends sp{constructor(e=!0){super(),this.specular=e}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=zl.dot(e).clamp().mul(t);r.directDiffuse.addAssign(s.mul(op({diffuseColor:Sn.rgb}))),!0===this.specular&&r.directSpecular.addAssign(s.mul(lp({lightDirection:e})).mul($d))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(op({diffuseColor:Sn}))),s.indirectDiffuse.mulAssign(t)}}const cp=new re;class hp extends Fh{static get type(){return"MeshLambertNodeMaterial"}constructor(e){super(),this.isMeshLambertNodeMaterial=!0,this.lights=!0,this.setDefaultValues(cp),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new ep(t):null}setupLightingModel(){return new dp(!1)}}const pp=new se;class gp extends Fh{static get type(){return"MeshPhongNodeMaterial"}constructor(e){super(),this.isMeshPhongNodeMaterial=!0,this.lights=!0,this.shininessNode=null,this.specularNode=null,this.setDefaultValues(pp),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new ep(t):null}setupLightingModel(){return new dp}setupVariants(){const e=(this.shininessNode?$i(this.shininessNode):Vd).max(1e-4);kn.assign(e);const t=this.specularNode||Gd;On.assign(t)}copy(e){return this.shininessNode=e.shininessNode,this.specularNode=e.specularNode,super.copy(e)}}const mp=Vi((e=>{if(!1===e.geometry.hasAttribute("normal"))return $i(0);const t=Gl.dFdx().abs().max(Gl.dFdy().abs());return t.x.max(t.y).max(t.z)})),fp=Vi((e=>{const{roughness:t}=e,r=mp();let s=t.max(.0525);return s=s.add(r),s=s.min(1),s})),yp=Vi((({alpha:e,dotNL:t,dotNV:r})=>{const s=e.pow2(),i=t.mul(s.add(s.oneMinus().mul(r.pow2())).sqrt()),n=r.mul(s.add(s.oneMinus().mul(t.pow2())).sqrt());return aa(.5,i.add(n).max(Aa))})).setLayout({name:"V_GGX_SmithCorrelated",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNL",type:"float"},{name:"dotNV",type:"float"}]}),xp=Vi((({alphaT:e,alphaB:t,dotTV:r,dotBV:s,dotTL:i,dotBL:n,dotNV:a,dotNL:o})=>{const u=o.mul(Qi(e.mul(r),t.mul(s),a).length()),l=a.mul(Qi(e.mul(i),t.mul(n),o).length());return aa(.5,u.add(l)).saturate()})).setLayout({name:"V_GGX_SmithCorrelated_Anisotropic",type:"float",inputs:[{name:"alphaT",type:"float",qualifier:"in"},{name:"alphaB",type:"float",qualifier:"in"},{name:"dotTV",type:"float",qualifier:"in"},{name:"dotBV",type:"float",qualifier:"in"},{name:"dotTL",type:"float",qualifier:"in"},{name:"dotBL",type:"float",qualifier:"in"},{name:"dotNV",type:"float",qualifier:"in"},{name:"dotNL",type:"float",qualifier:"in"}]}),bp=Vi((({alpha:e,dotNH:t})=>{const r=e.pow2(),s=t.pow2().mul(r.oneMinus()).oneMinus();return r.div(s.pow2()).mul(1/Math.PI)})).setLayout({name:"D_GGX",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNH",type:"float"}]}),Tp=$i(1/Math.PI),_p=Vi((({alphaT:e,alphaB:t,dotNH:r,dotTH:s,dotBH:i})=>{const n=e.mul(t),a=Qi(t.mul(s),e.mul(i),n.mul(r)),o=a.dot(a),u=n.div(o);return Tp.mul(n.mul(u.pow2()))})).setLayout({name:"D_GGX_Anisotropic",type:"float",inputs:[{name:"alphaT",type:"float",qualifier:"in"},{name:"alphaB",type:"float",qualifier:"in"},{name:"dotNH",type:"float",qualifier:"in"},{name:"dotTH",type:"float",qualifier:"in"},{name:"dotBH",type:"float",qualifier:"in"}]}),vp=Vi((e=>{const{lightDirection:t,f0:r,f90:s,roughness:i,f:n,USE_IRIDESCENCE:a,USE_ANISOTROPY:o}=e,u=e.normalView||zl,l=i.pow2(),d=t.add(Fl).normalize(),c=u.dot(t).clamp(),h=u.dot(Fl).clamp(),p=u.dot(d).clamp(),g=Fl.dot(d).clamp();let m,f,y=ap({f0:r,f90:s,dotVH:g});if(Ri(a)&&(y=Ln.mix(y,n)),Ri(o)){const e=Vn.dot(t),r=Vn.dot(Fl),s=Vn.dot(d),i=Un.dot(t),n=Un.dot(Fl),a=Un.dot(d);m=xp({alphaT:In,alphaB:l,dotTV:r,dotBV:n,dotTL:e,dotBL:i,dotNV:h,dotNL:c}),f=_p({alphaT:In,alphaB:l,dotNH:p,dotTH:s,dotBH:a})}else m=yp({alpha:l,dotNL:c,dotNV:h}),f=bp({alpha:l,dotNH:p});return y.mul(m).mul(f)})),Np=Vi((({roughness:e,dotNV:t})=>{const r=tn(-1,-.0275,-.572,.022),s=tn(1,.0425,1.04,-.04),i=e.mul(r).add(s),n=i.x.mul(i.x).min(t.mul(-9.28).exp2()).mul(i.x).add(i.y);return qi(-1.04,1.04).mul(n).add(i.zw)})).setLayout({name:"DFGApprox",type:"vec2",inputs:[{name:"roughness",type:"float"},{name:"dotNV",type:"vec3"}]}),Sp=Vi((e=>{const{dotNV:t,specularColor:r,specularF90:s,roughness:i}=e,n=Np({dotNV:t,roughness:i});return r.mul(n.x).add(s.mul(n.y))})),Ep=Vi((({f:e,f90:t,dotVH:r})=>{const s=r.oneMinus().saturate(),i=s.mul(s),n=s.mul(i,i).clamp(0,.9999);return e.sub(Qi(t).mul(n)).div(n.oneMinus())})).setLayout({name:"Schlick_to_F0",type:"vec3",inputs:[{name:"f",type:"vec3"},{name:"f90",type:"float"},{name:"dotVH",type:"float"}]}),wp=Vi((({roughness:e,dotNH:t})=>{const r=e.pow2(),s=$i(1).div(r),i=t.pow2().oneMinus().max(.0078125);return $i(2).add(s).mul(i.pow(s.mul(.5))).div(2*Math.PI)})).setLayout({name:"D_Charlie",type:"float",inputs:[{name:"roughness",type:"float"},{name:"dotNH",type:"float"}]}),Ap=Vi((({dotNV:e,dotNL:t})=>$i(1).div($i(4).mul(t.add(e).sub(t.mul(e)))))).setLayout({name:"V_Neubelt",type:"float",inputs:[{name:"dotNV",type:"float"},{name:"dotNL",type:"float"}]}),Rp=Vi((({lightDirection:e})=>{const t=e.add(Fl).normalize(),r=zl.dot(e).clamp(),s=zl.dot(Fl).clamp(),i=zl.dot(t).clamp(),n=wp({roughness:Pn,dotNH:i}),a=Ap({dotNV:s,dotNL:r});return Mn.mul(n).mul(a)})),Cp=Vi((({N:e,V:t,roughness:r})=>{const s=e.dot(t).saturate(),i=qi(r,s.oneMinus().sqrt());return i.assign(i.mul(.984375).add(.0078125)),i})).setLayout({name:"LTC_Uv",type:"vec2",inputs:[{name:"N",type:"vec3"},{name:"V",type:"vec3"},{name:"roughness",type:"float"}]}),Mp=Vi((({f:e})=>{const t=e.length();return po(t.mul(t).add(e.z).div(t.add(1)),0)})).setLayout({name:"LTC_ClippedSphereFormFactor",type:"float",inputs:[{name:"f",type:"vec3"}]}),Pp=Vi((({v1:e,v2:t})=>{const r=e.dot(t),s=r.abs().toVar(),i=s.mul(.0145206).add(.4965155).mul(s).add(.8543985).toVar(),n=s.add(4.1616724).mul(s).add(3.417594).toVar(),a=i.div(n),o=r.greaterThan(0).select(a,po(r.mul(r).oneMinus(),1e-7).inverseSqrt().mul(.5).sub(a));return e.cross(t).mul(o)})).setLayout({name:"LTC_EdgeVectorFormFactor",type:"vec3",inputs:[{name:"v1",type:"vec3"},{name:"v2",type:"vec3"}]}),Lp=Vi((({N:e,V:t,P:r,mInv:s,p0:i,p1:n,p2:a,p3:o})=>{const u=n.sub(i).toVar(),l=o.sub(i).toVar(),d=u.cross(l),c=Qi().toVar();return Gi(d.dot(r.sub(i)).greaterThanEqual(0),(()=>{const u=t.sub(e.mul(t.dot(e))).normalize(),l=e.cross(u).negate(),d=s.mul(on(u,l,e).transpose()).toVar(),h=d.mul(i.sub(r)).normalize().toVar(),p=d.mul(n.sub(r)).normalize().toVar(),g=d.mul(a.sub(r)).normalize().toVar(),m=d.mul(o.sub(r)).normalize().toVar(),f=Qi(0).toVar();f.addAssign(Pp({v1:h,v2:p})),f.addAssign(Pp({v1:p,v2:g})),f.addAssign(Pp({v1:g,v2:m})),f.addAssign(Pp({v1:m,v2:h})),c.assign(Qi(Mp({f:f})))})),c})).setLayout({name:"LTC_Evaluate",type:"vec3",inputs:[{name:"N",type:"vec3"},{name:"V",type:"vec3"},{name:"P",type:"vec3"},{name:"mInv",type:"mat3"},{name:"p0",type:"vec3"},{name:"p1",type:"vec3"},{name:"p2",type:"vec3"},{name:"p3",type:"vec3"}]}),Fp=Vi((({P:e,p0:t,p1:r,p2:s,p3:i})=>{const n=r.sub(t).toVar(),a=i.sub(t).toVar(),o=n.cross(a),u=Qi().toVar();return Gi(o.dot(e.sub(t)).greaterThanEqual(0),(()=>{const n=t.sub(e).normalize().toVar(),a=r.sub(e).normalize().toVar(),o=s.sub(e).normalize().toVar(),l=i.sub(e).normalize().toVar(),d=Qi(0).toVar();d.addAssign(Pp({v1:n,v2:a})),d.addAssign(Pp({v1:a,v2:o})),d.addAssign(Pp({v1:o,v2:l})),d.addAssign(Pp({v1:l,v2:n})),u.assign(Qi(Mp({f:d.abs()})))})),u})).setLayout({name:"LTC_Evaluate",type:"vec3",inputs:[{name:"P",type:"vec3"},{name:"p0",type:"vec3"},{name:"p1",type:"vec3"},{name:"p2",type:"vec3"},{name:"p3",type:"vec3"}]}),Bp=1/6,Ip=e=>na(Bp,na(e,na(e,e.negate().add(3)).sub(3)).add(1)),Dp=e=>na(Bp,na(e,na(e,na(3,e).sub(6))).add(4)),Vp=e=>na(Bp,na(e,na(e,na(-3,e).add(3)).add(3)).add(1)),Up=e=>na(Bp,To(e,3)),Op=e=>Ip(e).add(Dp(e)),Gp=e=>Vp(e).add(Up(e)),kp=e=>sa(-1,Dp(e).div(Ip(e).add(Dp(e)))),zp=e=>sa(1,Up(e).div(Vp(e).add(Up(e)))),$p=(e,t,r)=>{const s=e.uvNode,i=na(s,t.zw).add(.5),n=ka(i),a=Ha(i),o=Op(a.x),u=Gp(a.x),l=kp(a.x),d=zp(a.x),c=kp(a.y),h=zp(a.y),p=qi(n.x.add(l),n.y.add(c)).sub(.5).mul(t.xy),g=qi(n.x.add(d),n.y.add(c)).sub(.5).mul(t.xy),m=qi(n.x.add(l),n.y.add(h)).sub(.5).mul(t.xy),f=qi(n.x.add(d),n.y.add(h)).sub(.5).mul(t.xy),y=Op(a.y).mul(sa(o.mul(e.sample(p).level(r)),u.mul(e.sample(g).level(r)))),x=Gp(a.y).mul(sa(o.mul(e.sample(m).level(r)),u.mul(e.sample(f).level(r))));return y.add(x)},Hp=Vi((([e,t=$i(3)])=>{const r=qi(e.size(Hi(t))),s=qi(e.size(Hi(t.add(1)))),i=aa(1,r),n=aa(1,s),a=$p(e,tn(i,r),ka(t)),o=$p(e,tn(n,s),za(t));return Ha(t).mix(a,o)})),Wp=Vi((([e,t,r,s,i])=>{const n=Qi(Mo(t.negate(),$a(e),aa(1,s))),a=Qi(Ja(i[0].xyz),Ja(i[1].xyz),Ja(i[2].xyz));return $a(n).mul(r.mul(a))})).setLayout({name:"getVolumeTransmissionRay",type:"vec3",inputs:[{name:"n",type:"vec3"},{name:"v",type:"vec3"},{name:"thickness",type:"float"},{name:"ior",type:"float"},{name:"modelMatrix",type:"mat4"}]}),jp=Vi((([e,t])=>e.mul(Ro(t.mul(2).sub(2),0,1)))).setLayout({name:"applyIorToRoughness",type:"float",inputs:[{name:"roughness",type:"float"},{name:"ior",type:"float"}]}),qp=mh(),Xp=mh(),Kp=Vi((([e,t,r],{material:s})=>{const i=(s.side===N?qp:Xp).sample(e),n=Ua(sh.x).mul(jp(t,r));return Hp(i,n)})),Yp=Vi((([e,t,r])=>(Gi(r.notEqual(0),(()=>{const s=Va(t).negate().div(r);return Ia(s.negate().mul(e))})),Qi(1)))).setLayout({name:"volumeAttenuation",type:"vec3",inputs:[{name:"transmissionDistance",type:"float"},{name:"attenuationColor",type:"vec3"},{name:"attenuationDistance",type:"float"}]}),Qp=Vi((([e,t,r,s,i,n,a,o,u,l,d,c,h,p,g])=>{let m,f;if(g){m=tn().toVar(),f=Qi().toVar();const i=d.sub(1).mul(g.mul(.025)),n=Qi(d.sub(i),d,d.add(i));kc({start:0,end:3},(({i:i})=>{const d=n.element(i),g=Wp(e,t,c,d,o),y=a.add(g),x=l.mul(u.mul(tn(y,1))),b=qi(x.xy.div(x.w)).toVar();b.addAssign(1),b.divAssign(2),b.assign(qi(b.x,b.y.oneMinus()));const T=Kp(b,r,d);m.element(i).assign(T.element(i)),m.a.addAssign(T.a),f.element(i).assign(s.element(i).mul(Yp(Ja(g),h,p).element(i)))})),m.a.divAssign(3)}else{const i=Wp(e,t,c,d,o),n=a.add(i),g=l.mul(u.mul(tn(n,1))),y=qi(g.xy.div(g.w)).toVar();y.addAssign(1),y.divAssign(2),y.assign(qi(y.x,y.y.oneMinus())),m=Kp(y,r,d),f=s.mul(Yp(Ja(i),h,p))}const y=f.rgb.mul(m.rgb),x=e.dot(t).clamp(),b=Qi(Sp({dotNV:x,specularColor:i,specularF90:n,roughness:r})),T=f.r.add(f.g,f.b).div(3);return tn(b.oneMinus().mul(y),m.a.oneMinus().mul(T).oneMinus())})),Zp=on(3.2404542,-.969266,.0556434,-1.5371385,1.8760108,-.2040259,-.4985314,.041556,1.0572252),Jp=(e,t)=>e.sub(t).div(e.add(t)).pow2(),eg=Vi((({outsideIOR:e,eta2:t,cosTheta1:r,thinFilmThickness:s,baseF0:i})=>{const n=Ao(e,t,Po(0,.03,s)),a=e.div(n).pow2().mul(r.pow2().oneMinus()).oneMinus();Gi(a.lessThan(0),(()=>Qi(1)));const o=a.sqrt(),u=Jp(n,e),l=ap({f0:u,f90:1,dotVH:r}),d=l.oneMinus(),c=n.lessThan(e).select(Math.PI,0),h=$i(Math.PI).sub(c),p=(e=>{const t=e.sqrt();return Qi(1).add(t).div(Qi(1).sub(t))})(i.clamp(0,.9999)),g=Jp(p,n.toVec3()),m=ap({f0:g,f90:1,dotVH:o}),f=Qi(p.x.lessThan(n).select(Math.PI,0),p.y.lessThan(n).select(Math.PI,0),p.z.lessThan(n).select(Math.PI,0)),y=n.mul(s,o,2),x=Qi(h).add(f),b=l.mul(m).clamp(1e-5,.9999),T=b.sqrt(),_=d.pow2().mul(m).div(Qi(1).sub(b)),v=l.add(_).toVar(),N=_.sub(d).toVar();return kc({start:1,end:2,condition:"<=",name:"m"},(({m:e})=>{N.mulAssign(T);const t=((e,t)=>{const r=e.mul(2*Math.PI*1e-9),s=Qi(54856e-17,44201e-17,52481e-17),i=Qi(1681e3,1795300,2208400),n=Qi(43278e5,93046e5,66121e5),a=$i(9747e-17*Math.sqrt(2*Math.PI*45282e5)).mul(r.mul(2239900).add(t.x).cos()).mul(r.pow2().mul(-45282e5).exp());let o=s.mul(n.mul(2*Math.PI).sqrt()).mul(i.mul(r).add(t).cos()).mul(r.pow2().negate().mul(n).exp());return o=Qi(o.x.add(a),o.y,o.z).div(1.0685e-7),Zp.mul(o)})($i(e).mul(y),$i(e).mul(x)).mul(2);v.addAssign(N.mul(t))})),v.max(Qi(0))})).setLayout({name:"evalIridescence",type:"vec3",inputs:[{name:"outsideIOR",type:"float"},{name:"eta2",type:"float"},{name:"cosTheta1",type:"float"},{name:"thinFilmThickness",type:"float"},{name:"baseF0",type:"vec3"}]}),tg=Vi((({normal:e,viewDir:t,roughness:r})=>{const s=e.dot(t).saturate(),i=r.pow2(),n=Go(r.lessThan(.25),$i(-339.2).mul(i).add($i(161.4).mul(r)).sub(25.9),$i(-8.48).mul(i).add($i(14.3).mul(r)).sub(9.95)),a=Go(r.lessThan(.25),$i(44).mul(i).sub($i(23.7).mul(r)).add(3.26),$i(1.97).mul(i).sub($i(3.27).mul(r)).add(.72));return Go(r.lessThan(.25),0,$i(.1).mul(r).sub(.025)).add(n.mul(s).add(a).exp()).mul(1/Math.PI).saturate()})),rg=Qi(.04),sg=$i(1);class ig extends rp{constructor(e=!1,t=!1,r=!1,s=!1,i=!1,n=!1){super(),this.clearcoat=e,this.sheen=t,this.iridescence=r,this.anisotropy=s,this.transmission=i,this.dispersion=n,this.clearcoatRadiance=null,this.clearcoatSpecularDirect=null,this.clearcoatSpecularIndirect=null,this.sheenSpecularDirect=null,this.sheenSpecularIndirect=null,this.iridescenceFresnel=null,this.iridescenceF0=null}start(e){if(!0===this.clearcoat&&(this.clearcoatRadiance=Qi().toVar("clearcoatRadiance"),this.clearcoatSpecularDirect=Qi().toVar("clearcoatSpecularDirect"),this.clearcoatSpecularIndirect=Qi().toVar("clearcoatSpecularIndirect")),!0===this.sheen&&(this.sheenSpecularDirect=Qi().toVar("sheenSpecularDirect"),this.sheenSpecularIndirect=Qi().toVar("sheenSpecularIndirect")),!0===this.iridescence){const e=zl.dot(Fl).clamp();this.iridescenceFresnel=eg({outsideIOR:$i(1),eta2:Fn,cosTheta1:e,thinFilmThickness:Bn,baseF0:On}),this.iridescenceF0=Ep({f:this.iridescenceFresnel,f90:1,dotVH:e})}if(!0===this.transmission){const t=Ml,r=nl.sub(Ml).normalize(),s=$l,i=e.context;i.backdrop=Qp(s,r,wn,Sn,On,Gn,t,fl,rl,el,jn,Xn,Yn,Kn,this.dispersion?Qn:null),i.backdropAlpha=qn,Sn.a.mulAssign(Ao(1,i.backdrop.a,qn))}super.start(e)}computeMultiscattering(e,t,r){const s=zl.dot(Fl).clamp(),i=Np({roughness:wn,dotNV:s}),n=(this.iridescenceF0?Ln.mix(On,this.iridescenceF0):On).mul(i.x).add(r.mul(i.y)),a=i.x.add(i.y).oneMinus(),o=On.add(On.oneMinus().mul(.047619)),u=n.mul(o).div(a.mul(o).oneMinus());e.addAssign(n),t.addAssign(u.mul(a))}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=zl.dot(e).clamp().mul(t);if(!0===this.sheen&&this.sheenSpecularDirect.addAssign(s.mul(Rp({lightDirection:e}))),!0===this.clearcoat){const r=Hl.dot(e).clamp().mul(t);this.clearcoatSpecularDirect.addAssign(r.mul(vp({lightDirection:e,f0:rg,f90:sg,roughness:Cn,normalView:Hl})))}r.directDiffuse.addAssign(s.mul(op({diffuseColor:Sn.rgb}))),r.directSpecular.addAssign(s.mul(vp({lightDirection:e,f0:On,f90:1,roughness:wn,iridescence:this.iridescence,f:this.iridescenceFresnel,USE_IRIDESCENCE:this.iridescence,USE_ANISOTROPY:this.anisotropy})))}directRectArea({lightColor:e,lightPosition:t,halfWidth:r,halfHeight:s,reflectedLight:i,ltc_1:n,ltc_2:a}){const o=t.add(r).sub(s),u=t.sub(r).sub(s),l=t.sub(r).add(s),d=t.add(r).add(s),c=zl,h=Fl,p=Ll.toVar(),g=Cp({N:c,V:h,roughness:wn}),m=n.sample(g).toVar(),f=a.sample(g).toVar(),y=on(Qi(m.x,0,m.y),Qi(0,1,0),Qi(m.z,0,m.w)).toVar(),x=On.mul(f.x).add(On.oneMinus().mul(f.y)).toVar();i.directSpecular.addAssign(e.mul(x).mul(Lp({N:c,V:h,P:p,mInv:y,p0:o,p1:u,p2:l,p3:d}))),i.directDiffuse.addAssign(e.mul(Sn).mul(Lp({N:c,V:h,P:p,mInv:on(1,0,0,0,1,0,0,0,1),p0:o,p1:u,p2:l,p3:d})))}indirect(e){this.indirectDiffuse(e),this.indirectSpecular(e),this.ambientOcclusion(e)}indirectDiffuse(e){const{irradiance:t,reflectedLight:r}=e.context;r.indirectDiffuse.addAssign(t.mul(op({diffuseColor:Sn})))}indirectSpecular(e){const{radiance:t,iblIrradiance:r,reflectedLight:s}=e.context;if(!0===this.sheen&&this.sheenSpecularIndirect.addAssign(r.mul(Mn,tg({normal:zl,viewDir:Fl,roughness:Pn}))),!0===this.clearcoat){const e=Hl.dot(Fl).clamp(),t=Sp({dotNV:e,specularColor:rg,specularF90:sg,roughness:Cn});this.clearcoatSpecularIndirect.addAssign(this.clearcoatRadiance.mul(t))}const i=Qi().toVar("singleScattering"),n=Qi().toVar("multiScattering"),a=r.mul(1/Math.PI);this.computeMultiscattering(i,n,Gn);const o=i.add(n),u=Sn.mul(o.r.max(o.g).max(o.b).oneMinus());s.indirectSpecular.addAssign(t.mul(i)),s.indirectSpecular.addAssign(n.mul(a)),s.indirectDiffuse.addAssign(u.mul(a))}ambientOcclusion(e){const{ambientOcclusion:t,reflectedLight:r}=e.context,s=zl.dot(Fl).clamp().add(t),i=wn.mul(-16).oneMinus().negate().exp2(),n=t.sub(s.pow(i).oneMinus()).clamp();!0===this.clearcoat&&this.clearcoatSpecularIndirect.mulAssign(t),!0===this.sheen&&this.sheenSpecularIndirect.mulAssign(t),r.indirectDiffuse.mulAssign(t),r.indirectSpecular.mulAssign(n)}finish({context:e}){const{outgoingLight:t}=e;if(!0===this.clearcoat){const e=Hl.dot(Fl).clamp(),r=ap({dotVH:e,f0:rg,f90:sg}),s=t.mul(Rn.mul(r).oneMinus()).add(this.clearcoatSpecularDirect.add(this.clearcoatSpecularIndirect).mul(Rn));t.assign(s)}if(!0===this.sheen){const e=Mn.r.max(Mn.g).max(Mn.b).mul(.157).oneMinus(),r=t.mul(e).add(this.sheenSpecularDirect,this.sheenSpecularIndirect);t.assign(r)}}}const ng=$i(1),ag=$i(-2),og=$i(.8),ug=$i(-1),lg=$i(.4),dg=$i(2),cg=$i(.305),hg=$i(3),pg=$i(.21),gg=$i(4),mg=$i(4),fg=$i(16),yg=Vi((([e])=>{const t=Qi(Qa(e)).toVar(),r=$i(-1).toVar();return Gi(t.x.greaterThan(t.z),(()=>{Gi(t.x.greaterThan(t.y),(()=>{r.assign(Go(e.x.greaterThan(0),0,3))})).Else((()=>{r.assign(Go(e.y.greaterThan(0),1,4))}))})).Else((()=>{Gi(t.z.greaterThan(t.y),(()=>{r.assign(Go(e.z.greaterThan(0),2,5))})).Else((()=>{r.assign(Go(e.y.greaterThan(0),1,4))}))})),r})).setLayout({name:"getFace",type:"float",inputs:[{name:"direction",type:"vec3"}]}),xg=Vi((([e,t])=>{const r=qi().toVar();return Gi(t.equal(0),(()=>{r.assign(qi(e.z,e.y).div(Qa(e.x)))})).ElseIf(t.equal(1),(()=>{r.assign(qi(e.x.negate(),e.z.negate()).div(Qa(e.y)))})).ElseIf(t.equal(2),(()=>{r.assign(qi(e.x.negate(),e.y).div(Qa(e.z)))})).ElseIf(t.equal(3),(()=>{r.assign(qi(e.z.negate(),e.y).div(Qa(e.x)))})).ElseIf(t.equal(4),(()=>{r.assign(qi(e.x.negate(),e.z).div(Qa(e.y)))})).Else((()=>{r.assign(qi(e.x,e.y).div(Qa(e.z)))})),na(.5,r.add(1))})).setLayout({name:"getUV",type:"vec2",inputs:[{name:"direction",type:"vec3"},{name:"face",type:"float"}]}),bg=Vi((([e])=>{const t=$i(0).toVar();return Gi(e.greaterThanEqual(og),(()=>{t.assign(ng.sub(e).mul(ug.sub(ag)).div(ng.sub(og)).add(ag))})).ElseIf(e.greaterThanEqual(lg),(()=>{t.assign(og.sub(e).mul(dg.sub(ug)).div(og.sub(lg)).add(ug))})).ElseIf(e.greaterThanEqual(cg),(()=>{t.assign(lg.sub(e).mul(hg.sub(dg)).div(lg.sub(cg)).add(dg))})).ElseIf(e.greaterThanEqual(pg),(()=>{t.assign(cg.sub(e).mul(gg.sub(hg)).div(cg.sub(pg)).add(hg))})).Else((()=>{t.assign($i(-2).mul(Ua(na(1.16,e))))})),t})).setLayout({name:"roughnessToMip",type:"float",inputs:[{name:"roughness",type:"float"}]}),Tg=Vi((([e,t])=>{const r=e.toVar();r.assign(na(2,r).sub(1));const s=Qi(r,1).toVar();return Gi(t.equal(0),(()=>{s.assign(s.zyx)})).ElseIf(t.equal(1),(()=>{s.assign(s.xzy),s.xz.mulAssign(-1)})).ElseIf(t.equal(2),(()=>{s.x.mulAssign(-1)})).ElseIf(t.equal(3),(()=>{s.assign(s.zyx),s.xz.mulAssign(-1)})).ElseIf(t.equal(4),(()=>{s.assign(s.xzy),s.xy.mulAssign(-1)})).ElseIf(t.equal(5),(()=>{s.z.mulAssign(-1)})),s})).setLayout({name:"getDirection",type:"vec3",inputs:[{name:"uv",type:"vec2"},{name:"face",type:"float"}]}),_g=Vi((([e,t,r,s,i,n])=>{const a=$i(r),o=Qi(t),u=Ro(bg(a),ag,n),l=Ha(u),d=ka(u),c=Qi(vg(e,o,d,s,i,n)).toVar();return Gi(l.notEqual(0),(()=>{const t=Qi(vg(e,o,d.add(1),s,i,n)).toVar();c.assign(Ao(c,t,l))})),c})),vg=Vi((([e,t,r,s,i,n])=>{const a=$i(r).toVar(),o=Qi(t),u=$i(yg(o)).toVar(),l=$i(po(mg.sub(a),0)).toVar();a.assign(po(a,mg));const d=$i(Da(a)).toVar(),c=qi(xg(o,u).mul(d.sub(2)).add(1)).toVar();return Gi(u.greaterThan(2),(()=>{c.y.addAssign(d),u.subAssign(3)})),c.x.addAssign(u.mul(d)),c.x.addAssign(l.mul(na(3,fg))),c.y.addAssign(na(4,Da(n).sub(d))),c.x.mulAssign(s),c.y.mulAssign(i),e.sample(c).grad(qi(),qi())})),Ng=Vi((({envMap:e,mipInt:t,outputDirection:r,theta:s,axis:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:a,CUBEUV_MAX_MIP:o})=>{const u=ja(s),l=r.mul(u).add(i.cross(r).mul(Wa(s))).add(i.mul(i.dot(r).mul(u.oneMinus())));return vg(e,l,t,n,a,o)})),Sg=Vi((({n:e,latitudinal:t,poleAxis:r,outputDirection:s,weights:i,samples:n,dTheta:a,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})=>{const h=Qi(Go(t,r,bo(r,s))).toVar();Gi(h.equal(Qi(0)),(()=>{h.assign(Qi(s.z,0,s.x.negate()))})),h.assign($a(h));const p=Qi().toVar();return p.addAssign(i.element(0).mul(Ng({theta:0,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),kc({start:Hi(1),end:e},(({i:e})=>{Gi(e.greaterThanEqual(n),(()=>{zc()}));const t=$i(a.mul($i(e))).toVar();p.addAssign(i.element(e).mul(Ng({theta:t.mul(-1),axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),p.addAssign(i.element(e).mul(Ng({theta:t,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})))})),tn(p,1)})),Eg=[.125,.215,.35,.446,.526,.582],wg=20,Ag=new ie(-1,1,1,-1,0,1),Rg=new ne(90,1),Cg=new e;let Mg=null,Pg=0,Lg=0;const Fg=(1+Math.sqrt(5))/2,Bg=1/Fg,Ig=[new r(-Fg,Bg,0),new r(Fg,Bg,0),new r(-Bg,0,Fg),new r(Bg,0,Fg),new r(0,Fg,-Bg),new r(0,Fg,Bg),new r(-1,1,-1),new r(1,1,-1),new r(-1,1,1),new r(1,1,1)],Dg=new r,Vg=new WeakMap,Ug=[3,1,5,0,4,2],Og=Tg(Uu(),Vu("faceIndex")).normalize(),Gg=Qi(Og.x,Og.y,Og.z);class kg{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._lodPlanes=[],this._sizeLods=[],this._sigmas=[],this._lodMeshes=[],this._blurMaterial=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._backgroundBox=null}get _hasInitialized(){return this._renderer.hasInitialized()}fromScene(e,t=0,r=.1,s=100,i={}){const{size:n=256,position:a=Dg,renderTarget:o=null}=i;if(this._setSize(n),!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromScene() called before the backend is initialized. Try using .fromSceneAsync() instead.");const n=o||this._allocateTargets();return i.renderTarget=n,this.fromSceneAsync(e,t,r,s,i),n}Mg=this._renderer.getRenderTarget(),Pg=this._renderer.getActiveCubeFace(),Lg=this._renderer.getActiveMipmapLevel();const u=o||this._allocateTargets();return u.depthBuffer=!0,this._sceneToCubeUV(e,r,s,u,a),t>0&&this._blur(u,0,0,t),this._applyPMREM(u),this._cleanup(u),u}async fromSceneAsync(e,t=0,r=.1,s=100,i={}){return!1===this._hasInitialized&&await this._renderer.init(),this.fromScene(e,t,r,s,i)}fromEquirectangular(e,t=null){if(!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromEquirectangular() called before the backend is initialized. Try using .fromEquirectangularAsync() instead."),this._setSizeFromTexture(e);const r=t||this._allocateTargets();return this.fromEquirectangularAsync(e,r),r}return this._fromTexture(e,t)}async fromEquirectangularAsync(e,t=null){return!1===this._hasInitialized&&await this._renderer.init(),this._fromTexture(e,t)}fromCubemap(e,t=null){if(!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromCubemap() called before the backend is initialized. Try using .fromCubemapAsync() instead."),this._setSizeFromTexture(e);const r=t||this._allocateTargets();return this.fromCubemapAsync(e,t),r}return this._fromTexture(e,t)}async fromCubemapAsync(e,t=null){return!1===this._hasInitialized&&await this._renderer.init(),this._fromTexture(e,t)}async compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=Wg(),await this._compileMaterial(this._cubemapMaterial))}async compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=jg(),await this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),null!==this._cubemapMaterial&&this._cubemapMaterial.dispose(),null!==this._equirectMaterial&&this._equirectMaterial.dispose(),null!==this._backgroundBox&&(this._backgroundBox.geometry.dispose(),this._backgroundBox.material.dispose())}_setSizeFromTexture(e){e.mapping===E||e.mapping===w?this._setSize(0===e.image.length?16:e.image[0].width||e.image[0].image.width):this._setSize(e.image.width/4)}_setSize(e){this._lodMax=Math.floor(Math.log2(e)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){null!==this._blurMaterial&&this._blurMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;ee-4?u=Eg[o-e+4-1]:0===o&&(u=0),s.push(u);const l=1/(a-2),d=-l,c=1+l,h=[d,d,c,d,c,c,d,d,c,c,d,c],p=6,g=6,m=3,f=2,y=1,x=new Float32Array(m*g*p),b=new Float32Array(f*g*p),T=new Float32Array(y*g*p);for(let e=0;e2?0:-1,s=[t,r,0,t+2/3,r,0,t+2/3,r+1,0,t,r,0,t+2/3,r+1,0,t,r+1,0],i=Ug[e];x.set(s,m*g*i),b.set(h,f*g*i);const n=[i,i,i,i,i,i];T.set(n,y*g*i)}const _=new ue;_.setAttribute("position",new le(x,m)),_.setAttribute("uv",new le(b,f)),_.setAttribute("faceIndex",new le(T,y)),t.push(_),i.push(new W(_,null)),n>4&&n--}return{lodPlanes:t,sizeLods:r,sigmas:s,lodMeshes:i}}(i)),this._blurMaterial=function(e,t,s){const i=Yu(new Array(wg).fill(0)),n=Tn(new r(0,1,0)),a=Tn(0),o=$i(wg),u=Tn(0),l=Tn(1),d=Hu(null),c=Tn(0),h=$i(1/t),p=$i(1/s),g=$i(e),m={n:o,latitudinal:u,weights:i,poleAxis:n,outputDirection:Gg,dTheta:a,samples:l,envMap:d,mipInt:c,CUBEUV_TEXEL_WIDTH:h,CUBEUV_TEXEL_HEIGHT:p,CUBEUV_MAX_MIP:g},f=Hg("blur");return f.fragmentNode=Sg({...m,latitudinal:u.equal(1)}),Vg.set(f,m),f}(i,e,t)}return i}async _compileMaterial(e){const t=new W(this._lodPlanes[0],e);await this._renderer.compile(t,Ag)}_sceneToCubeUV(e,t,r,s,i){const n=Rg;n.near=t,n.far=r;const a=[1,1,1,1,-1,1],o=[1,-1,1,-1,1,-1],u=this._renderer,l=u.autoClear;u.getClearColor(Cg),u.autoClear=!1;let d=this._backgroundBox;if(null===d){const e=new te({name:"PMREM.Background",side:N,depthWrite:!1,depthTest:!1});d=new W(new H,e)}let c=!1;const h=e.background;h?h.isColor&&(d.material.color.copy(h),e.background=null,c=!0):(d.material.color.copy(Cg),c=!0),u.setRenderTarget(s),u.clear(),c&&u.render(d,n);for(let t=0;t<6;t++){const r=t%3;0===r?(n.up.set(0,a[t],0),n.position.set(i.x,i.y,i.z),n.lookAt(i.x+o[t],i.y,i.z)):1===r?(n.up.set(0,0,a[t]),n.position.set(i.x,i.y,i.z),n.lookAt(i.x,i.y+o[t],i.z)):(n.up.set(0,a[t],0),n.position.set(i.x,i.y,i.z),n.lookAt(i.x,i.y,i.z+o[t]));const l=this._cubeSize;$g(s,r*l,t>2?l:0,l,l),u.render(e,n)}u.autoClear=l,e.background=h}_textureToCubeUV(e,t){const r=this._renderer,s=e.mapping===E||e.mapping===w;s?null===this._cubemapMaterial&&(this._cubemapMaterial=Wg(e)):null===this._equirectMaterial&&(this._equirectMaterial=jg(e));const i=s?this._cubemapMaterial:this._equirectMaterial;i.fragmentNode.value=e;const n=this._lodMeshes[0];n.material=i;const a=this._cubeSize;$g(t,0,0,3*a,2*a),r.setRenderTarget(t),r.render(n,Ag)}_applyPMREM(e){const t=this._renderer,r=t.autoClear;t.autoClear=!1;const s=this._lodPlanes.length;for(let t=1;twg&&console.warn(`sigmaRadians, ${i}, is too large and will clip, as it requested ${g} samples when the maximum is set to 20`);const m=[];let f=0;for(let e=0;ey-4?s-y+4:0),4*(this._cubeSize-x),3*x,2*x),o.setRenderTarget(t),o.render(l,Ag)}}function zg(e,t,r){const s=new ae(e,t,r);return s.texture.mapping=oe,s.texture.name="PMREM.cubeUv",s.texture.isPMREMTexture=!0,s.scissorTest=!0,s}function $g(e,t,r,s,i){e.viewport.set(t,r,s,i),e.scissor.set(t,r,s,i)}function Hg(e){const t=new Fh;return t.depthTest=!1,t.depthWrite=!1,t.blending=G,t.name=`PMREM_${e}`,t}function Wg(e){const t=Hg("cubemap");return t.fragmentNode=sd(e,Gg),t}function jg(e){const t=Hg("equirect");return t.fragmentNode=Hu(e,qh(Gg),0),t}const qg=new WeakMap;function Xg(e,t,r){const s=function(e){let t=qg.get(e);void 0===t&&(t=new WeakMap,qg.set(e,t));return t}(t);let i=s.get(e);if((void 0!==i?i.pmremVersion:-1)!==e.pmremVersion){const t=e.image;if(e.isCubeTexture){if(!function(e){if(null==e)return!1;let t=0;const r=6;for(let s=0;s0}(t))return null;i=r.fromEquirectangular(e,i)}i.pmremVersion=e.pmremVersion,s.set(e,i)}return i.texture}class Kg extends js{static get type(){return"PMREMNode"}constructor(e,t=null,r=null){super("vec3"),this._value=e,this._pmrem=null,this.uvNode=t,this.levelNode=r,this._generator=null;const s=new pe;s.isRenderTargetTexture=!0,this._texture=Hu(s),this._width=Tn(0),this._height=Tn(0),this._maxMip=Tn(0),this.updateBeforeType=Is.RENDER}set value(e){this._value=e,this._pmrem=null}get value(){return this._value}updateFromTexture(e){const t=function(e){const t=Math.log2(e)-2,r=1/e;return{texelWidth:1/(3*Math.max(Math.pow(2,t),112)),texelHeight:r,maxMip:t}}(e.image.height);this._texture.value=e,this._width.value=t.texelWidth,this._height.value=t.texelHeight,this._maxMip.value=t.maxMip}updateBefore(e){let t=this._pmrem;const r=t?t.pmremVersion:-1,s=this._value;r!==s.pmremVersion&&(t=!0===s.isPMREMTexture?s:Xg(s,e.renderer,this._generator),null!==t&&(this._pmrem=t,this.updateFromTexture(t)))}setup(e){null===this._generator&&(this._generator=new kg(e.renderer)),this.updateBefore(e);let t=this.uvNode;null===t&&e.context.getUV&&(t=e.context.getUV(this)),t=Ql.mul(Qi(t.x,t.y.negate(),t.z));let r=this.levelNode;return null===r&&e.context.getTextureLevel&&(r=e.context.getTextureLevel(this)),_g(this._texture,t,r,this._width,this._height,this._maxMip)}dispose(){super.dispose(),null!==this._generator&&this._generator.dispose()}}const Yg=Bi(Kg).setParameterLength(1,3),Qg=new WeakMap;class Zg extends Xc{static get type(){return"EnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){const{material:t}=e;let r=this.envNode;if(r.isTextureNode||r.isMaterialReferenceNode){const e=r.isTextureNode?r.value:t[r.property];let s=Qg.get(e);void 0===s&&(s=Yg(e),Qg.set(e,s)),r=s}const s=!0===t.useAnisotropy||t.anisotropy>0?Ed:zl,i=r.context(Jg(wn,s)).mul(Yl),n=r.context(em($l)).mul(Math.PI).mul(Yl),a=Nu(i),o=Nu(n);e.context.radiance.addAssign(a),e.context.iblIrradiance.addAssign(o);const u=e.context.lightingModel.clearcoatRadiance;if(u){const e=r.context(Jg(Cn,Hl)).mul(Yl),t=Nu(e);u.addAssign(t)}}}const Jg=(e,t)=>{let r=null;return{getUV:()=>(null===r&&(r=Fl.negate().reflect(t),r=e.mul(e).mix(r,t).normalize(),r=r.transformDirection(rl)),r),getTextureLevel:()=>e}},em=e=>({getUV:()=>e,getTextureLevel:()=>$i(1)}),tm=new ge;class rm extends Fh{static get type(){return"MeshStandardNodeMaterial"}constructor(e){super(),this.isMeshStandardNodeMaterial=!0,this.lights=!0,this.emissiveNode=null,this.metalnessNode=null,this.roughnessNode=null,this.setDefaultValues(tm),this.setValues(e)}setupEnvironment(e){let t=super.setupEnvironment(e);return null===t&&e.environmentNode&&(t=e.environmentNode),t?new Zg(t):null}setupLightingModel(){return new ig}setupSpecular(){const e=Ao(Qi(.04),Sn.rgb,An);On.assign(e),Gn.assign(1)}setupVariants(){const e=this.metalnessNode?$i(this.metalnessNode):jd;An.assign(e);let t=this.roughnessNode?$i(this.roughnessNode):Wd;t=fp({roughness:t}),wn.assign(t),this.setupSpecular(),Sn.assign(tn(Sn.rgb.mul(e.oneMinus()),Sn.a))}copy(e){return this.emissiveNode=e.emissiveNode,this.metalnessNode=e.metalnessNode,this.roughnessNode=e.roughnessNode,super.copy(e)}}const sm=new me;class im extends rm{static get type(){return"MeshPhysicalNodeMaterial"}constructor(e){super(),this.isMeshPhysicalNodeMaterial=!0,this.clearcoatNode=null,this.clearcoatRoughnessNode=null,this.clearcoatNormalNode=null,this.sheenNode=null,this.sheenRoughnessNode=null,this.iridescenceNode=null,this.iridescenceIORNode=null,this.iridescenceThicknessNode=null,this.specularIntensityNode=null,this.specularColorNode=null,this.iorNode=null,this.transmissionNode=null,this.thicknessNode=null,this.attenuationDistanceNode=null,this.attenuationColorNode=null,this.dispersionNode=null,this.anisotropyNode=null,this.setDefaultValues(sm),this.setValues(e)}get useClearcoat(){return this.clearcoat>0||null!==this.clearcoatNode}get useIridescence(){return this.iridescence>0||null!==this.iridescenceNode}get useSheen(){return this.sheen>0||null!==this.sheenNode}get useAnisotropy(){return this.anisotropy>0||null!==this.anisotropyNode}get useTransmission(){return this.transmission>0||null!==this.transmissionNode}get useDispersion(){return this.dispersion>0||null!==this.dispersionNode}setupSpecular(){const e=this.iorNode?$i(this.iorNode):ac;jn.assign(e),On.assign(Ao(ho(_o(jn.sub(1).div(jn.add(1))).mul(zd),Qi(1)).mul(kd),Sn.rgb,An)),Gn.assign(Ao(kd,1,An))}setupLightingModel(){return new ig(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion)}setupVariants(e){if(super.setupVariants(e),this.useClearcoat){const e=this.clearcoatNode?$i(this.clearcoatNode):Xd,t=this.clearcoatRoughnessNode?$i(this.clearcoatRoughnessNode):Kd;Rn.assign(e),Cn.assign(fp({roughness:t}))}if(this.useSheen){const e=this.sheenNode?Qi(this.sheenNode):Zd,t=this.sheenRoughnessNode?$i(this.sheenRoughnessNode):Jd;Mn.assign(e),Pn.assign(t)}if(this.useIridescence){const e=this.iridescenceNode?$i(this.iridescenceNode):tc,t=this.iridescenceIORNode?$i(this.iridescenceIORNode):rc,r=this.iridescenceThicknessNode?$i(this.iridescenceThicknessNode):sc;Ln.assign(e),Fn.assign(t),Bn.assign(r)}if(this.useAnisotropy){const e=(this.anisotropyNode?qi(this.anisotropyNode):ec).toVar();Dn.assign(e.length()),Gi(Dn.equal(0),(()=>{e.assign(qi(1,0))})).Else((()=>{e.divAssign(qi(Dn)),Dn.assign(Dn.saturate())})),In.assign(Dn.pow2().mix(wn.pow2(),1)),Vn.assign(Nd[0].mul(e.x).add(Nd[1].mul(e.y))),Un.assign(Nd[1].mul(e.x).sub(Nd[0].mul(e.y)))}if(this.useTransmission){const e=this.transmissionNode?$i(this.transmissionNode):ic,t=this.thicknessNode?$i(this.thicknessNode):nc,r=this.attenuationDistanceNode?$i(this.attenuationDistanceNode):oc,s=this.attenuationColorNode?Qi(this.attenuationColorNode):uc;if(qn.assign(e),Xn.assign(t),Kn.assign(r),Yn.assign(s),this.useDispersion){const e=this.dispersionNode?$i(this.dispersionNode):mc;Qn.assign(e)}}}setupClearcoatNormal(){return this.clearcoatNormalNode?Qi(this.clearcoatNormalNode):Yd}setup(e){e.context.setupClearcoatNormal=()=>this.setupClearcoatNormal(e),super.setup(e)}copy(e){return this.clearcoatNode=e.clearcoatNode,this.clearcoatRoughnessNode=e.clearcoatRoughnessNode,this.clearcoatNormalNode=e.clearcoatNormalNode,this.sheenNode=e.sheenNode,this.sheenRoughnessNode=e.sheenRoughnessNode,this.iridescenceNode=e.iridescenceNode,this.iridescenceIORNode=e.iridescenceIORNode,this.iridescenceThicknessNode=e.iridescenceThicknessNode,this.specularIntensityNode=e.specularIntensityNode,this.specularColorNode=e.specularColorNode,this.transmissionNode=e.transmissionNode,this.thicknessNode=e.thicknessNode,this.attenuationDistanceNode=e.attenuationDistanceNode,this.attenuationColorNode=e.attenuationColorNode,this.dispersionNode=e.dispersionNode,this.anisotropyNode=e.anisotropyNode,super.copy(e)}}class nm extends ig{constructor(e=!1,t=!1,r=!1,s=!1,i=!1,n=!1,a=!1){super(e,t,r,s,i,n),this.useSSS=a}direct({lightDirection:e,lightColor:t,reflectedLight:r},s){if(!0===this.useSSS){const i=s.material,{thicknessColorNode:n,thicknessDistortionNode:a,thicknessAmbientNode:o,thicknessAttenuationNode:u,thicknessPowerNode:l,thicknessScaleNode:d}=i,c=e.add(zl.mul(a)).normalize(),h=$i(Fl.dot(c.negate()).saturate().pow(l).mul(d)),p=Qi(h.add(o).mul(n));r.directDiffuse.addAssign(p.mul(u.mul(t)))}super.direct({lightDirection:e,lightColor:t,reflectedLight:r},s)}}class am extends im{static get type(){return"MeshSSSNodeMaterial"}constructor(e){super(e),this.thicknessColorNode=null,this.thicknessDistortionNode=$i(.1),this.thicknessAmbientNode=$i(0),this.thicknessAttenuationNode=$i(.1),this.thicknessPowerNode=$i(2),this.thicknessScaleNode=$i(10)}get useSSS(){return null!==this.thicknessColorNode}setupLightingModel(){return new nm(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion,this.useSSS)}copy(e){return this.thicknessColorNode=e.thicknessColorNode,this.thicknessDistortionNode=e.thicknessDistortionNode,this.thicknessAmbientNode=e.thicknessAmbientNode,this.thicknessAttenuationNode=e.thicknessAttenuationNode,this.thicknessPowerNode=e.thicknessPowerNode,this.thicknessScaleNode=e.thicknessScaleNode,super.copy(e)}}const om=Vi((({normal:e,lightDirection:t,builder:r})=>{const s=e.dot(t),i=qi(s.mul(.5).add(.5),0);if(r.material.gradientMap){const e=ld("gradientMap","texture").context({getUV:()=>i});return Qi(e.r)}{const e=i.fwidth().mul(.5);return Ao(Qi(.7),Qi(1),Po($i(.7).sub(e.x),$i(.7).add(e.x),i.x))}}));class um extends rp{direct({lightDirection:e,lightColor:t,reflectedLight:r},s){const i=om({normal:Vl,lightDirection:e,builder:s}).mul(t);r.directDiffuse.addAssign(i.mul(op({diffuseColor:Sn.rgb})))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(op({diffuseColor:Sn}))),s.indirectDiffuse.mulAssign(t)}}const lm=new fe;class dm extends Fh{static get type(){return"MeshToonNodeMaterial"}constructor(e){super(),this.isMeshToonNodeMaterial=!0,this.lights=!0,this.setDefaultValues(lm),this.setValues(e)}setupLightingModel(){return new um}}class cm extends js{static get type(){return"MatcapUVNode"}constructor(){super("vec2")}setup(){const e=Qi(Fl.z,0,Fl.x.negate()).normalize(),t=Fl.cross(e);return qi(e.dot(zl),t.dot(zl)).mul(.495).add(.5)}}const hm=Ii(cm),pm=new ye;class gm extends Fh{static get type(){return"MeshMatcapNodeMaterial"}constructor(e){super(),this.isMeshMatcapNodeMaterial=!0,this.setDefaultValues(pm),this.setValues(e)}setupVariants(e){const t=hm;let r;r=e.material.matcap?ld("matcap","texture").context({getUV:()=>t}):Qi(Ao(.2,.8,t.y)),Sn.rgb.mulAssign(r.rgb)}}class mm extends js{static get type(){return"RotateNode"}constructor(e,t){super(),this.positionNode=e,this.rotationNode=t}getNodeType(e){return this.positionNode.getNodeType(e)}setup(e){const{rotationNode:t,positionNode:r}=this;if("vec2"===this.getNodeType(e)){const e=t.cos(),s=t.sin();return an(e,s,s.negate(),e).mul(r)}{const e=t,s=un(tn(1,0,0,0),tn(0,ja(e.x),Wa(e.x).negate(),0),tn(0,Wa(e.x),ja(e.x),0),tn(0,0,0,1)),i=un(tn(ja(e.y),0,Wa(e.y),0),tn(0,1,0,0),tn(Wa(e.y).negate(),0,ja(e.y),0),tn(0,0,0,1)),n=un(tn(ja(e.z),Wa(e.z).negate(),0,0),tn(Wa(e.z),ja(e.z),0,0),tn(0,0,1,0),tn(0,0,0,1));return s.mul(i).mul(n).mul(tn(r,1)).xyz}}}const fm=Bi(mm).setParameterLength(2),ym=new xe;class xm extends Fh{static get type(){return"SpriteNodeMaterial"}constructor(e){super(),this.isSpriteNodeMaterial=!0,this._useSizeAttenuation=!0,this.positionNode=null,this.rotationNode=null,this.scaleNode=null,this.transparent=!0,this.setDefaultValues(ym),this.setValues(e)}setupPositionView(e){const{object:t,camera:r}=e,s=this.sizeAttenuation,{positionNode:i,rotationNode:n,scaleNode:a}=this,o=Nl.mul(Qi(i||0));let u=qi(fl[0].xyz.length(),fl[1].xyz.length());if(null!==a&&(u=u.mul(qi(a))),!1===s)if(r.isPerspectiveCamera)u=u.mul(o.z.negate());else{const e=$i(2).div(el.element(1).element(1));u=u.mul(e.mul(2))}let l=Al.xy;if(t.center&&!0===t.center.isVector2){const e=((e,t,r)=>Pi(new lu(e,t,r)))("center","vec2",t);l=l.sub(e.sub(.5))}l=l.mul(u);const d=$i(n||Qd),c=fm(l,d);return tn(o.xy.add(c),o.zw)}copy(e){return this.positionNode=e.positionNode,this.rotationNode=e.rotationNode,this.scaleNode=e.scaleNode,super.copy(e)}get sizeAttenuation(){return this._useSizeAttenuation}set sizeAttenuation(e){this._useSizeAttenuation!==e&&(this._useSizeAttenuation=e,this.needsUpdate=!0)}}const bm=new be;class Tm extends xm{static get type(){return"PointsNodeMaterial"}constructor(e){super(),this.sizeNode=null,this.isPointsNodeMaterial=!0,this.setDefaultValues(bm),this.setValues(e)}setupPositionView(){const{positionNode:e}=this;return Nl.mul(Qi(e||Rl)).xyz}setupVertex(e){const t=super.setupVertex(e);if(!0!==e.material.isNodeMaterial)return t;const{rotationNode:r,scaleNode:s,sizeNode:i}=this,n=Al.xy.toVar(),a=nh.z.div(nh.w);if(r&&r.isNode){const e=$i(r);n.assign(fm(n,e))}let o=null!==i?qi(i):gc;return!0===this.sizeAttenuation&&(o=o.mul(o.div(Ll.z.negate()))),s&&s.isNode&&(o=o.mul(qi(s))),n.mulAssign(o.mul(2)),n.assign(n.div(nh.z)),n.y.assign(n.y.mul(a)),n.assign(n.mul(t.w)),t.addAssign(tn(n,0,0)),t}get alphaToCoverage(){return this._useAlphaToCoverage}set alphaToCoverage(e){this._useAlphaToCoverage!==e&&(this._useAlphaToCoverage=e,this.needsUpdate=!0)}}class _m extends rp{constructor(){super(),this.shadowNode=$i(1).toVar("shadowMask")}direct({lightNode:e}){this.shadowNode.mulAssign(e.shadowNode)}finish({context:e}){Sn.a.mulAssign(this.shadowNode.oneMinus()),e.outgoingLight.rgb.assign(Sn.rgb)}}const vm=new Te;class Nm extends Fh{static get type(){return"ShadowNodeMaterial"}constructor(e){super(),this.isShadowNodeMaterial=!0,this.lights=!0,this.transparent=!0,this.setDefaultValues(vm),this.setValues(e)}setupLightingModel(){return new _m}}const Sm=vn("vec3"),Em=vn("vec3"),wm=vn("vec3");class Am extends rp{constructor(){super()}start(e){const{material:t,context:r}=e,s=vn("vec3"),i=vn("vec3");Gi(nl.sub(Ml).length().greaterThan(Tl.mul(2)),(()=>{s.assign(nl),i.assign(Ml)})).Else((()=>{s.assign(Ml),i.assign(nl)}));const n=i.sub(s),a=Tn("int").onRenderUpdate((({material:e})=>e.steps)),o=n.length().div(a).toVar(),u=n.normalize().toVar(),l=$i(0).toVar(),d=Qi(1).toVar();t.offsetNode&&l.addAssign(t.offsetNode.mul(o)),kc(a,(()=>{const i=s.add(u.mul(l)),n=rl.mul(tn(i,1)).xyz;let a;null!==t.depthNode&&(Em.assign(wh(_h(n.z,Zu,Ju))),r.sceneDepthNode=wh(t.depthNode).toVar()),r.positionWorld=i,r.shadowPositionWorld=i,r.positionView=n,Sm.assign(0),t.scatteringNode&&(a=t.scatteringNode({positionRay:i})),super.start(e),a&&Sm.mulAssign(a);const c=Sm.mul(.01).negate().mul(o).exp();d.mulAssign(c),l.addAssign(o)})),wm.addAssign(d.saturate().oneMinus())}scatteringLight(e,t){const r=t.context.sceneDepthNode;r?Gi(r.greaterThanEqual(Em),(()=>{Sm.addAssign(e)})):Sm.addAssign(e)}direct({lightNode:e,lightColor:t},r){if(void 0===e.light.distance)return;const s=t.xyz.toVar();s.mulAssign(e.shadowNode),this.scatteringLight(s,r)}directRectArea({lightColor:e,lightPosition:t,halfWidth:r,halfHeight:s},i){const n=t.add(r).sub(s),a=t.sub(r).sub(s),o=t.sub(r).add(s),u=t.add(r).add(s),l=i.context.positionView,d=e.xyz.mul(Fp({P:l,p0:n,p1:a,p2:o,p3:u})).pow(1.5);this.scatteringLight(d,i)}finish(e){e.context.outgoingLight.assign(wm)}}class Rm extends Fh{static get type(){return"VolumeNodeMaterial"}constructor(e){super(),this.isVolumeNodeMaterial=!0,this.steps=25,this.offsetNode=null,this.scatteringNode=null,this.lights=!0,this.transparent=!0,this.side=N,this.depthTest=!1,this.depthWrite=!1,this.setValues(e)}setupLightingModel(){return new Am}}class Cm{constructor(e,t){this.nodes=e,this.info=t,this._context=self,this._animationLoop=null,this._requestId=null}start(){const e=(t,r)=>{this._requestId=this._context.requestAnimationFrame(e),!0===this.info.autoReset&&this.info.reset(),this.nodes.nodeFrame.update(),this.info.frame=this.nodes.nodeFrame.frameId,null!==this._animationLoop&&this._animationLoop(t,r)};e()}stop(){this._context.cancelAnimationFrame(this._requestId),this._requestId=null}getAnimationLoop(){return this._animationLoop}setAnimationLoop(e){this._animationLoop=e}getContext(){return this._context}setContext(e){this._context=e}dispose(){this.stop()}}class Mm{constructor(){this.weakMap=new WeakMap}get(e){let t=this.weakMap;for(let r=0;r{this.dispose()},this.material.addEventListener("dispose",this.onMaterialDispose)}updateClipping(e){this.clippingContext=e}get clippingNeedsUpdate(){return null!==this.clippingContext&&this.clippingContext.cacheKey!==this.clippingContextCacheKey&&(this.clippingContextCacheKey=this.clippingContext.cacheKey,!0)}get hardwareClippingPlanes(){return!0===this.material.hardwareClipping?this.clippingContext.unionClippingCount:0}getNodeBuilderState(){return this._nodeBuilderState||(this._nodeBuilderState=this._nodes.getForRender(this))}getMonitor(){return this._monitor||(this._monitor=this.getNodeBuilderState().observer)}getBindings(){return this._bindings||(this._bindings=this.getNodeBuilderState().createBindings())}getBindingGroup(e){for(const t of this.getBindings())if(t.name===e)return t}getIndex(){return this._geometries.getIndex(this)}getIndirect(){return this._geometries.getIndirect(this)}getChainArray(){return[this.object,this.material,this.context,this.lightsNode]}setGeometry(e){this.geometry=e,this.attributes=null}getAttributes(){if(null!==this.attributes)return this.attributes;const e=this.getNodeBuilderState().nodeAttributes,t=this.geometry,r=[],s=new Set;for(const i of e){const e=i.node&&i.node.attribute?i.node.attribute:t.getAttribute(i.name);if(void 0===e)continue;r.push(e);const n=e.isInterleavedBufferAttribute?e.data:e;s.add(n)}return this.attributes=r,this.vertexBuffers=Array.from(s.values()),r}getVertexBuffers(){return null===this.vertexBuffers&&this.getAttributes(),this.vertexBuffers}getDrawParameters(){const{object:e,material:t,geometry:r,group:s,drawRange:i}=this,n=this.drawParams||(this.drawParams={vertexCount:0,firstVertex:0,instanceCount:0,firstInstance:0}),a=this.getIndex(),o=null!==a,u=r.isInstancedBufferGeometry?r.instanceCount:e.count>1?e.count:1;if(0===u)return null;if(n.instanceCount=u,!0===e.isBatchedMesh)return n;let l=1;!0!==t.wireframe||e.isPoints||e.isLineSegments||e.isLine||e.isLineLoop||(l=2);let d=i.start*l,c=(i.start+i.count)*l;null!==s&&(d=Math.max(d,s.start*l),c=Math.min(c,(s.start+s.count)*l));const h=r.attributes.position;let p=1/0;o?p=a.count:null!=h&&(p=h.count),d=Math.max(d,0),c=Math.min(c,p);const g=c-d;return g<0||g===1/0?null:(n.vertexCount=g,n.firstVertex=d,n)}getGeometryCacheKey(){const{geometry:e}=this;let t="";for(const r of Object.keys(e.attributes).sort()){const s=e.attributes[r];t+=r+",",s.data&&(t+=s.data.stride+","),s.offset&&(t+=s.offset+","),s.itemSize&&(t+=s.itemSize+","),s.normalized&&(t+="n,")}for(const r of Object.keys(e.morphAttributes).sort()){const s=e.morphAttributes[r];t+="morph-"+r+",";for(let e=0,r=s.length;e1&&(r+=e.uuid+","),r+=e.receiveShadow+",",xs(r)}get needsGeometryUpdate(){return this.geometry.id!==this.object.geometry.id}get needsUpdate(){return this.initialNodesCacheKey!==this.getDynamicCacheKey()||this.clippingNeedsUpdate}getDynamicCacheKey(){let e=0;return!0!==this.material.isShadowPassMaterial&&(e=this._nodes.getCacheKey(this.scene,this.lightsNode)),this.camera.isArrayCamera&&(e=Ts(e,this.camera.cameras.length)),this.object.receiveShadow&&(e=Ts(e,1)),e}getCacheKey(){return this.getMaterialCacheKey()+this.getDynamicCacheKey()}dispose(){this.material.removeEventListener("dispose",this.onMaterialDispose),this.onDispose()}}const Fm=[];class Bm{constructor(e,t,r,s,i,n){this.renderer=e,this.nodes=t,this.geometries=r,this.pipelines=s,this.bindings=i,this.info=n,this.chainMaps={}}get(e,t,r,s,i,n,a,o){const u=this.getChainMap(o);Fm[0]=e,Fm[1]=t,Fm[2]=n,Fm[3]=i;let l=u.get(Fm);return void 0===l?(l=this.createRenderObject(this.nodes,this.geometries,this.renderer,e,t,r,s,i,n,a,o),u.set(Fm,l)):(l.updateClipping(a),l.needsGeometryUpdate&&l.setGeometry(e.geometry),(l.version!==t.version||l.needsUpdate)&&(l.initialCacheKey!==l.getCacheKey()?(l.dispose(),l=this.get(e,t,r,s,i,n,a,o)):l.version=t.version)),Fm.length=0,l}getChainMap(e="default"){return this.chainMaps[e]||(this.chainMaps[e]=new Mm)}dispose(){this.chainMaps={}}createRenderObject(e,t,r,s,i,n,a,o,u,l,d){const c=this.getChainMap(d),h=new Lm(e,t,r,s,i,n,a,o,u,l);return h.onDispose=()=>{this.pipelines.delete(h),this.bindings.delete(h),this.nodes.delete(h),c.delete(h.getChainArray())},h}}class Im{constructor(){this.data=new WeakMap}get(e){let t=this.data.get(e);return void 0===t&&(t={},this.data.set(e,t)),t}delete(e){let t=null;return this.data.has(e)&&(t=this.data.get(e),this.data.delete(e)),t}has(e){return this.data.has(e)}dispose(){this.data=new WeakMap}}const Dm=1,Vm=2,Um=3,Om=4,Gm=16;class km extends Im{constructor(e){super(),this.backend=e}delete(e){const t=super.delete(e);return null!==t&&this.backend.destroyAttribute(e),t}update(e,t){const r=this.get(e);if(void 0===r.version)t===Dm?this.backend.createAttribute(e):t===Vm?this.backend.createIndexAttribute(e):t===Um?this.backend.createStorageAttribute(e):t===Om&&this.backend.createIndirectStorageAttribute(e),r.version=this._getBufferAttribute(e).version;else{const t=this._getBufferAttribute(e);(r.version{this.info.memory.geometries--;const s=t.index,i=e.getAttributes();null!==s&&this.attributes.delete(s);for(const e of i)this.attributes.delete(e);const n=this.wireframes.get(t);void 0!==n&&this.attributes.delete(n),t.removeEventListener("dispose",r)};t.addEventListener("dispose",r)}updateAttributes(e){const t=e.getAttributes();for(const e of t)e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute?this.updateAttribute(e,Um):this.updateAttribute(e,Dm);const r=this.getIndex(e);null!==r&&this.updateAttribute(r,Vm);const s=e.geometry.indirect;null!==s&&this.updateAttribute(s,Om)}updateAttribute(e,t){const r=this.info.render.calls;e.isInterleavedBufferAttribute?void 0===this.attributeCall.get(e)?(this.attributes.update(e,t),this.attributeCall.set(e,r)):this.attributeCall.get(e.data)!==r&&(this.attributes.update(e,t),this.attributeCall.set(e.data,r),this.attributeCall.set(e,r)):this.attributeCall.get(e)!==r&&(this.attributes.update(e,t),this.attributeCall.set(e,r))}getIndirect(e){return e.geometry.indirect}getIndex(e){const{geometry:t,material:r}=e;let s=t.index;if(!0===r.wireframe){const e=this.wireframes;let r=e.get(t);void 0===r?(r=$m(t),e.set(t,r)):r.version!==zm(t)&&(this.attributes.delete(r),r=$m(t),e.set(t,r)),s=r}return s}}class Wm{constructor(){this.autoReset=!0,this.frame=0,this.calls=0,this.render={calls:0,frameCalls:0,drawCalls:0,triangles:0,points:0,lines:0,timestamp:0},this.compute={calls:0,frameCalls:0,timestamp:0},this.memory={geometries:0,textures:0}}update(e,t,r){this.render.drawCalls++,e.isMesh||e.isSprite?this.render.triangles+=r*(t/3):e.isPoints?this.render.points+=r*t:e.isLineSegments?this.render.lines+=r*(t/2):e.isLine?this.render.lines+=r*(t-1):console.error("THREE.WebGPUInfo: Unknown object type.")}reset(){this.render.drawCalls=0,this.render.frameCalls=0,this.compute.frameCalls=0,this.render.triangles=0,this.render.points=0,this.render.lines=0}dispose(){this.reset(),this.calls=0,this.render.calls=0,this.compute.calls=0,this.render.timestamp=0,this.compute.timestamp=0,this.memory.geometries=0,this.memory.textures=0}}class jm{constructor(e){this.cacheKey=e,this.usedTimes=0}}class qm extends jm{constructor(e,t,r){super(e),this.vertexProgram=t,this.fragmentProgram=r}}class Xm extends jm{constructor(e,t){super(e),this.computeProgram=t,this.isComputePipeline=!0}}let Km=0;class Ym{constructor(e,t,r,s=null,i=null){this.id=Km++,this.code=e,this.stage=t,this.name=r,this.transforms=s,this.attributes=i,this.usedTimes=0}}class Qm extends Im{constructor(e,t){super(),this.backend=e,this.nodes=t,this.bindings=null,this.caches=new Map,this.programs={vertex:new Map,fragment:new Map,compute:new Map}}getForCompute(e,t){const{backend:r}=this,s=this.get(e);if(this._needsComputeUpdate(e)){const i=s.pipeline;i&&(i.usedTimes--,i.computeProgram.usedTimes--);const n=this.nodes.getForCompute(e);let a=this.programs.compute.get(n.computeShader);void 0===a&&(i&&0===i.computeProgram.usedTimes&&this._releaseProgram(i.computeProgram),a=new Ym(n.computeShader,"compute",e.name,n.transforms,n.nodeAttributes),this.programs.compute.set(n.computeShader,a),r.createProgram(a));const o=this._getComputeCacheKey(e,a);let u=this.caches.get(o);void 0===u&&(i&&0===i.usedTimes&&this._releasePipeline(i),u=this._getComputePipeline(e,a,o,t)),u.usedTimes++,a.usedTimes++,s.version=e.version,s.pipeline=u}return s.pipeline}getForRender(e,t=null){const{backend:r}=this,s=this.get(e);if(this._needsRenderUpdate(e)){const i=s.pipeline;i&&(i.usedTimes--,i.vertexProgram.usedTimes--,i.fragmentProgram.usedTimes--);const n=e.getNodeBuilderState(),a=e.material?e.material.name:"";let o=this.programs.vertex.get(n.vertexShader);void 0===o&&(i&&0===i.vertexProgram.usedTimes&&this._releaseProgram(i.vertexProgram),o=new Ym(n.vertexShader,"vertex",a),this.programs.vertex.set(n.vertexShader,o),r.createProgram(o));let u=this.programs.fragment.get(n.fragmentShader);void 0===u&&(i&&0===i.fragmentProgram.usedTimes&&this._releaseProgram(i.fragmentProgram),u=new Ym(n.fragmentShader,"fragment",a),this.programs.fragment.set(n.fragmentShader,u),r.createProgram(u));const l=this._getRenderCacheKey(e,o,u);let d=this.caches.get(l);void 0===d?(i&&0===i.usedTimes&&this._releasePipeline(i),d=this._getRenderPipeline(e,o,u,l,t)):e.pipeline=d,d.usedTimes++,o.usedTimes++,u.usedTimes++,s.pipeline=d}return s.pipeline}delete(e){const t=this.get(e).pipeline;return t&&(t.usedTimes--,0===t.usedTimes&&this._releasePipeline(t),t.isComputePipeline?(t.computeProgram.usedTimes--,0===t.computeProgram.usedTimes&&this._releaseProgram(t.computeProgram)):(t.fragmentProgram.usedTimes--,t.vertexProgram.usedTimes--,0===t.vertexProgram.usedTimes&&this._releaseProgram(t.vertexProgram),0===t.fragmentProgram.usedTimes&&this._releaseProgram(t.fragmentProgram))),super.delete(e)}dispose(){super.dispose(),this.caches=new Map,this.programs={vertex:new Map,fragment:new Map,compute:new Map}}updateForRender(e){this.getForRender(e)}_getComputePipeline(e,t,r,s){r=r||this._getComputeCacheKey(e,t);let i=this.caches.get(r);return void 0===i&&(i=new Xm(r,t),this.caches.set(r,i),this.backend.createComputePipeline(i,s)),i}_getRenderPipeline(e,t,r,s,i){s=s||this._getRenderCacheKey(e,t,r);let n=this.caches.get(s);return void 0===n&&(n=new qm(s,t,r),this.caches.set(s,n),e.pipeline=n,this.backend.createRenderPipeline(e,i)),n}_getComputeCacheKey(e,t){return e.id+","+t.id}_getRenderCacheKey(e,t,r){return t.id+","+r.id+","+this.backend.getRenderCacheKey(e)}_releasePipeline(e){this.caches.delete(e.cacheKey)}_releaseProgram(e){const t=e.code,r=e.stage;this.programs[r].delete(t)}_needsComputeUpdate(e){const t=this.get(e);return void 0===t.pipeline||t.version!==e.version}_needsRenderUpdate(e){return void 0===this.get(e).pipeline||this.backend.needsRenderUpdate(e)}}class Zm extends Im{constructor(e,t,r,s,i,n){super(),this.backend=e,this.textures=r,this.pipelines=i,this.attributes=s,this.nodes=t,this.info=n,this.pipelines.bindings=this}getForRender(e){const t=e.getBindings();for(const e of t){const r=this.get(e);void 0===r.bindGroup&&(this._init(e),this.backend.createBindings(e,t,0),r.bindGroup=e)}return t}getForCompute(e){const t=this.nodes.getForCompute(e).bindings;for(const e of t){const r=this.get(e);void 0===r.bindGroup&&(this._init(e),this.backend.createBindings(e,t,0),r.bindGroup=e)}return t}updateForCompute(e){this._updateBindings(this.getForCompute(e))}updateForRender(e){this._updateBindings(this.getForRender(e))}_updateBindings(e){for(const t of e)this._update(t,e)}_init(e){for(const t of e.bindings)if(t.isSampledTexture)this.textures.updateTexture(t.texture);else if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?Om:Um;this.attributes.update(e,r)}}_update(e,t){const{backend:r}=this;let s=!1,i=!0,n=0,a=0;for(const t of e.bindings){if(t.isNodeUniformsGroup){if(!1===this.nodes.updateGroup(t))continue}if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?Om:Um;this.attributes.update(e,r)}if(t.isUniformBuffer){t.update()&&r.updateBinding(t)}else if(t.isSampler)t.update();else if(t.isSampledTexture){const e=this.textures.get(t.texture);t.needsBindingsUpdate(e.generation)&&(s=!0);const o=t.update(),u=t.texture;o&&this.textures.updateTexture(u);const l=r.get(u);if(void 0!==l.externalTexture||e.isDefaultTexture?i=!1:(n=10*n+u.id,a+=u.version),!0===r.isWebGPUBackend&&void 0===l.texture&&void 0===l.externalTexture&&(console.error("Bindings._update: binding should be available:",t,o,u,t.textureNode.value,s),this.textures.updateTexture(u),s=!0),!0===u.isStorageTexture){const e=this.get(u);!0===t.store?e.needsMipmap=!0:this.textures.needsMipmaps(u)&&!0===e.needsMipmap&&(this.backend.generateMipmaps(u),e.needsMipmap=!1)}}}!0===s&&this.backend.updateBindings(e,t,i?n:0,a)}}function Jm(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.material.id!==t.material.id?e.material.id-t.material.id:e.z!==t.z?e.z-t.z:e.id-t.id}function ef(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?t.z-e.z:e.id-t.id}function tf(e){return(e.transmission>0||e.transmissionNode)&&e.side===Se&&!1===e.forceSinglePass}class rf{constructor(e,t,r){this.renderItems=[],this.renderItemsIndex=0,this.opaque=[],this.transparentDoublePass=[],this.transparent=[],this.bundles=[],this.lightsNode=e.getNode(t,r),this.lightsArray=[],this.scene=t,this.camera=r,this.occlusionQueryCount=0}begin(){return this.renderItemsIndex=0,this.opaque.length=0,this.transparentDoublePass.length=0,this.transparent.length=0,this.bundles.length=0,this.lightsArray.length=0,this.occlusionQueryCount=0,this}getNextRenderItem(e,t,r,s,i,n,a){let o=this.renderItems[this.renderItemsIndex];return void 0===o?(o={id:e.id,object:e,geometry:t,material:r,groupOrder:s,renderOrder:e.renderOrder,z:i,group:n,clippingContext:a},this.renderItems[this.renderItemsIndex]=o):(o.id=e.id,o.object=e,o.geometry=t,o.material=r,o.groupOrder=s,o.renderOrder=e.renderOrder,o.z=i,o.group=n,o.clippingContext=a),this.renderItemsIndex++,o}push(e,t,r,s,i,n,a){const o=this.getNextRenderItem(e,t,r,s,i,n,a);!0===e.occlusionTest&&this.occlusionQueryCount++,!0===r.transparent||r.transmission>0?(tf(r)&&this.transparentDoublePass.push(o),this.transparent.push(o)):this.opaque.push(o)}unshift(e,t,r,s,i,n,a){const o=this.getNextRenderItem(e,t,r,s,i,n,a);!0===r.transparent||r.transmission>0?(tf(r)&&this.transparentDoublePass.unshift(o),this.transparent.unshift(o)):this.opaque.unshift(o)}pushBundle(e){this.bundles.push(e)}pushLight(e){this.lightsArray.push(e)}sort(e,t){this.opaque.length>1&&this.opaque.sort(e||Jm),this.transparentDoublePass.length>1&&this.transparentDoublePass.sort(t||ef),this.transparent.length>1&&this.transparent.sort(t||ef)}finish(){this.lightsNode.setLights(this.lightsArray);for(let e=this.renderItemsIndex,t=this.renderItems.length;e>t,u=a.height>>t;let l=e.depthTexture||i[t];const d=!0===e.depthBuffer||!0===e.stencilBuffer;let c=!1;void 0===l&&d&&(l=new I,l.format=e.stencilBuffer?we:Ae,l.type=e.stencilBuffer?Re:b,l.image.width=o,l.image.height=u,i[t]=l),r.width===a.width&&a.height===r.height||(c=!0,l&&(l.needsUpdate=!0,l.image.width=o,l.image.height=u)),r.width=a.width,r.height=a.height,r.textures=n,r.depthTexture=l||null,r.depth=e.depthBuffer,r.stencil=e.stencilBuffer,r.renderTarget=e,r.sampleCount!==s&&(c=!0,l&&(l.needsUpdate=!0),r.sampleCount=s);const h={sampleCount:s};if(!0!==e.isXRRenderTarget){for(let e=0;e{e.removeEventListener("dispose",t);for(let e=0;e0){const s=e.image;if(void 0===s)console.warn("THREE.Renderer: Texture marked for update but image is undefined.");else if(!1===s.complete)console.warn("THREE.Renderer: Texture marked for update but image is incomplete.");else{if(e.images){const r=[];for(const t of e.images)r.push(t);t.images=r}else t.image=s;void 0!==r.isDefaultTexture&&!0!==r.isDefaultTexture||(i.createTexture(e,t),r.isDefaultTexture=!1,r.generation=e.version),!0===e.source.dataReady&&i.updateTexture(e,t),t.needsMipmaps&&0===e.mipmaps.length&&i.generateMipmaps(e)}}else i.createDefaultTexture(e),r.isDefaultTexture=!0,r.generation=e.version}if(!0!==r.initialized){r.initialized=!0,r.generation=e.version,this.info.memory.textures++;const t=()=>{e.removeEventListener("dispose",t),this._destroyTexture(e),this.info.memory.textures--};e.addEventListener("dispose",t)}r.version=e.version}getSize(e,t=pf){let r=e.images?e.images[0]:e.image;return r?(void 0!==r.image&&(r=r.image),t.width=r.width||1,t.height=r.height||1,t.depth=e.isCubeTexture?6:r.depth||1):t.width=t.height=t.depth=1,t}getMipLevels(e,t,r){let s;return s=e.isCompressedTexture?e.mipmaps?e.mipmaps.length:1:Math.floor(Math.log2(Math.max(t,r)))+1,s}needsMipmaps(e){return this.isEnvironmentTexture(e)||!0===e.isCompressedTexture||e.generateMipmaps}isEnvironmentTexture(e){const t=e.mapping;return t===Y||t===Q||t===E||t===w}_destroyTexture(e){this.backend.destroySampler(e),this.backend.destroyTexture(e),this.delete(e)}}class mf extends e{constructor(e,t,r,s=1){super(e,t,r),this.a=s}set(e,t,r,s=1){return this.a=s,super.set(e,t,r)}copy(e){return void 0!==e.a&&(this.a=e.a),super.copy(e)}clone(){return new this.constructor(this.r,this.g,this.b,this.a)}}class ff extends _n{static get type(){return"ParameterNode"}constructor(e,t=null){super(e,t),this.isParameterNode=!0}getHash(){return this.uuid}generate(){return this.name}}class yf extends $s{static get type(){return"StackNode"}constructor(e=null){super(),this.nodes=[],this.outputNode=null,this.parent=e,this._currentCond=null,this.isStackNode=!0}getNodeType(e){return this.outputNode?this.outputNode.getNodeType(e):"void"}getMemberType(e,t){return this.outputNode?this.outputNode.getMemberType(e,t):"void"}add(e){return this.nodes.push(e),this}If(e,t){const r=new Mi(t);return this._currentCond=Go(e,r),this.add(this._currentCond)}ElseIf(e,t){const r=new Mi(t),s=Go(e,r);return this._currentCond.elseNode=s,this._currentCond=s,this}Else(e){return this._currentCond.elseNode=new Mi(e),this}build(e,...t){const r=Oi();Ui(this);for(const t of this.nodes)t.build(e,"void");return Ui(r),this.outputNode?this.outputNode.build(e,...t):super.build(e,...t)}else(...e){return console.warn("THREE.TSL: .else() has been renamed to .Else()."),this.Else(...e)}elseif(...e){return console.warn("THREE.TSL: .elseif() has been renamed to .ElseIf()."),this.ElseIf(...e)}}const xf=Bi(yf).setParameterLength(0,1);class bf extends $s{static get type(){return"StructTypeNode"}constructor(e,t=null){var r;super("struct"),this.membersLayout=(r=e,Object.entries(r).map((([e,t])=>"string"==typeof t?{name:e,type:t,atomic:!1}:{name:e,type:t.type,atomic:t.atomic||!1}))),this.name=t,this.isStructLayoutNode=!0}getLength(){let e=0;for(const t of this.membersLayout)e+=As(t.type);return e}getMemberType(e,t){const r=this.membersLayout.find((e=>e.name===t));return r?r.type:"void"}getNodeType(e){return e.getStructTypeFromNode(this,this.membersLayout,this.name).name}setup(e){e.addInclude(this)}generate(e){return this.getNodeType(e)}}class Tf extends $s{static get type(){return"StructNode"}constructor(e,t){super("vec3"),this.structLayoutNode=e,this.values=t,this.isStructNode=!0}getNodeType(e){return this.structLayoutNode.getNodeType(e)}getMemberType(e,t){return this.structLayoutNode.getMemberType(e,t)}generate(e){const t=e.getVarFromNode(this),r=t.type,s=e.getPropertyName(t);return e.addLineFlowCode(`${s} = ${e.generateStruct(r,this.structLayoutNode.membersLayout,this.values)}`,this),t.name}}class _f extends $s{static get type(){return"OutputStructNode"}constructor(...e){super(),this.members=e,this.isOutputStructNode=!0}getNodeType(e){const t=e.getNodeProperties(this);if(void 0===t.membersLayout){const r=this.members,s=[];for(let t=0;t{const t=e.toUint().mul(747796405).add(2891336453),r=t.shiftRight(t.shiftRight(28).add(4)).bitXor(t).mul(277803737);return r.shiftRight(22).bitXor(r).toFloat().mul(1/2**32)})),Af=(e,t)=>To(na(4,e.mul(ia(1,e))),t),Rf=Vi((([e])=>e.fract().sub(.5).abs())).setLayout({name:"tri",type:"float",inputs:[{name:"x",type:"float"}]}),Cf=Vi((([e])=>Qi(Rf(e.z.add(Rf(e.y.mul(1)))),Rf(e.z.add(Rf(e.x.mul(1)))),Rf(e.y.add(Rf(e.x.mul(1))))))).setLayout({name:"tri3",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),Mf=Vi((([e,t,r])=>{const s=Qi(e).toVar(),i=$i(1.4).toVar(),n=$i(0).toVar(),a=Qi(s).toVar();return kc({start:$i(0),end:$i(3),type:"float",condition:"<="},(()=>{const e=Qi(Cf(a.mul(2))).toVar();s.addAssign(e.add(r.mul($i(.1).mul(t)))),a.mulAssign(1.8),i.mulAssign(1.5),s.mulAssign(1.2);const o=$i(Rf(s.z.add(Rf(s.x.add(Rf(s.y)))))).toVar();n.addAssign(o.div(i)),a.addAssign(.14)})),n})).setLayout({name:"triNoise3D",type:"float",inputs:[{name:"position",type:"vec3"},{name:"speed",type:"float"},{name:"time",type:"float"}]});class Pf extends $s{static get type(){return"FunctionOverloadingNode"}constructor(e=[],...t){super(),this.functionNodes=e,this.parametersNodes=t,this._candidateFnCall=null,this.global=!0}getNodeType(){return this.functionNodes[0].shaderNode.layout.type}setup(e){const t=this.parametersNodes;let r=this._candidateFnCall;if(null===r){let s=null,i=-1;for(const r of this.functionNodes){const n=r.shaderNode.layout;if(null===n)throw new Error("FunctionOverloadingNode: FunctionNode must be a layout.");const a=n.inputs;if(t.length===a.length){let n=0;for(let r=0;ri&&(s=r,i=n)}}this._candidateFnCall=r=s(...t)}return r}}const Lf=Bi(Pf),Ff=e=>(...t)=>Lf(e,...t),Bf=Tn(0).setGroup(yn).onRenderUpdate((e=>e.time)),If=Tn(0).setGroup(yn).onRenderUpdate((e=>e.deltaTime)),Df=Tn(0,"uint").setGroup(yn).onRenderUpdate((e=>e.frameId)),Vf=Vi((([e,t,r=qi(.5)])=>fm(e.sub(r),t).add(r))),Uf=Vi((([e,t,r=qi(.5)])=>{const s=e.sub(r),i=s.dot(s),n=i.mul(i).mul(t);return e.add(s.mul(n))})),Of=Vi((({position:e=null,horizontal:t=!0,vertical:r=!1})=>{let s;null!==e?(s=fl.toVar(),s[3][0]=e.x,s[3][1]=e.y,s[3][2]=e.z):s=fl;const i=rl.mul(s);return Ri(t)&&(i[0][0]=fl[0].length(),i[0][1]=0,i[0][2]=0),Ri(r)&&(i[1][0]=0,i[1][1]=fl[1].length(),i[1][2]=0),i[2][0]=0,i[2][1]=0,i[2][2]=1,el.mul(i).mul(Rl)})),Gf=Vi((([e=null])=>{const t=wh();return wh(xh(e)).sub(t).lessThan(0).select(rh,e)}));class kf extends $s{static get type(){return"SpriteSheetUVNode"}constructor(e,t=Uu(),r=$i(0)){super("vec2"),this.countNode=e,this.uvNode=t,this.frameNode=r}setup(){const{frameNode:e,uvNode:t,countNode:r}=this,{width:s,height:i}=r,n=e.mod(s.mul(i)).floor(),a=n.mod(s),o=i.sub(n.add(1).div(s).ceil()),u=r.reciprocal(),l=qi(a,o);return t.add(l).mul(u)}}const zf=Bi(kf).setParameterLength(3);class $f extends $s{static get type(){return"TriplanarTexturesNode"}constructor(e,t=null,r=null,s=$i(1),i=Rl,n=Ul){super("vec4"),this.textureXNode=e,this.textureYNode=t,this.textureZNode=r,this.scaleNode=s,this.positionNode=i,this.normalNode=n}setup(){const{textureXNode:e,textureYNode:t,textureZNode:r,scaleNode:s,positionNode:i,normalNode:n}=this;let a=n.abs().normalize();a=a.div(a.dot(Qi(1)));const o=i.yz.mul(s),u=i.zx.mul(s),l=i.xy.mul(s),d=e.value,c=null!==t?t.value:d,h=null!==r?r.value:d,p=Hu(d,o).mul(a.x),g=Hu(c,u).mul(a.y),m=Hu(h,l).mul(a.z);return sa(p,g,m)}}const Hf=Bi($f).setParameterLength(1,6),Wf=new Me,jf=new r,qf=new r,Xf=new r,Kf=new a,Yf=new r(0,0,-1),Qf=new s,Zf=new r,Jf=new r,ey=new s,ty=new t,ry=new ae,sy=rh.flipX();ry.depthTexture=new I(1,1);let iy=!1;class ny extends $u{static get type(){return"ReflectorNode"}constructor(e={}){super(e.defaultTexture||ry.texture,sy),this._reflectorBaseNode=e.reflector||new ay(this,e),this._depthNode=null,this.setUpdateMatrix(!1)}get reflector(){return this._reflectorBaseNode}get target(){return this._reflectorBaseNode.target}getDepthNode(){if(null===this._depthNode){if(!0!==this._reflectorBaseNode.depth)throw new Error("THREE.ReflectorNode: Depth node can only be requested when the reflector is created with { depth: true }. ");this._depthNode=Pi(new ny({defaultTexture:ry.depthTexture,reflector:this._reflectorBaseNode}))}return this._depthNode}setup(e){return e.object.isQuadMesh||this._reflectorBaseNode.build(e),super.setup(e)}clone(){const e=new this.constructor(this.reflectorNode);return e._reflectorBaseNode=this._reflectorBaseNode,e}}class ay extends $s{static get type(){return"ReflectorBaseNode"}constructor(e,t={}){super();const{target:r=new Pe,resolution:s=1,generateMipmaps:i=!1,bounces:n=!0,depth:a=!1}=t;this.textureNode=e,this.target=r,this.resolution=s,this.generateMipmaps=i,this.bounces=n,this.depth=a,this.updateBeforeType=n?Is.RENDER:Is.FRAME,this.virtualCameras=new WeakMap,this.renderTargets=new WeakMap,this.forceUpdate=!1}_updateResolution(e,t){const r=this.resolution;t.getDrawingBufferSize(ty),e.setSize(Math.round(ty.width*r),Math.round(ty.height*r))}setup(e){return this._updateResolution(ry,e.renderer),super.setup(e)}getVirtualCamera(e){let t=this.virtualCameras.get(e);return void 0===t&&(t=e.clone(),this.virtualCameras.set(e,t)),t}getRenderTarget(e){let t=this.renderTargets.get(e);return void 0===t&&(t=new ae(0,0,{type:he}),!0===this.generateMipmaps&&(t.texture.minFilter=Le,t.texture.generateMipmaps=!0),!0===this.depth&&(t.depthTexture=new I),this.renderTargets.set(e,t)),t}updateBefore(e){if(!1===this.bounces&&iy)return!1;iy=!0;const{scene:t,camera:r,renderer:s,material:i}=e,{target:n}=this,a=this.getVirtualCamera(r),o=this.getRenderTarget(a);s.getDrawingBufferSize(ty),this._updateResolution(o,s),qf.setFromMatrixPosition(n.matrixWorld),Xf.setFromMatrixPosition(r.matrixWorld),Kf.extractRotation(n.matrixWorld),jf.set(0,0,1),jf.applyMatrix4(Kf),Zf.subVectors(qf,Xf);if(!0===Zf.dot(jf)>0&&!1===this.forceUpdate)return;Zf.reflect(jf).negate(),Zf.add(qf),Kf.extractRotation(r.matrixWorld),Yf.set(0,0,-1),Yf.applyMatrix4(Kf),Yf.add(Xf),Jf.subVectors(qf,Yf),Jf.reflect(jf).negate(),Jf.add(qf),a.coordinateSystem=r.coordinateSystem,a.position.copy(Zf),a.up.set(0,1,0),a.up.applyMatrix4(Kf),a.up.reflect(jf),a.lookAt(Jf),a.near=r.near,a.far=r.far,a.updateMatrixWorld(),a.projectionMatrix.copy(r.projectionMatrix),Wf.setFromNormalAndCoplanarPoint(jf,qf),Wf.applyMatrix4(a.matrixWorldInverse),Qf.set(Wf.normal.x,Wf.normal.y,Wf.normal.z,Wf.constant);const u=a.projectionMatrix;ey.x=(Math.sign(Qf.x)+u.elements[8])/u.elements[0],ey.y=(Math.sign(Qf.y)+u.elements[9])/u.elements[5],ey.z=-1,ey.w=(1+u.elements[10])/u.elements[14],Qf.multiplyScalar(1/Qf.dot(ey));u.elements[2]=Qf.x,u.elements[6]=Qf.y,u.elements[10]=s.coordinateSystem===d?Qf.z-0:Qf.z+1-0,u.elements[14]=Qf.w,this.textureNode.value=o.texture,!0===this.depth&&(this.textureNode.getDepthNode().value=o.depthTexture),i.visible=!1;const l=s.getRenderTarget(),c=s.getMRT(),h=s.autoClear;s.setMRT(null),s.setRenderTarget(o),s.autoClear=!0,s.render(t,a),s.setMRT(c),s.setRenderTarget(l),s.autoClear=h,i.visible=!0,iy=!1,this.forceUpdate=!1}}const oy=new ie(-1,1,1,-1,0,1);class uy extends ue{constructor(e=!1){super();const t=!1===e?[0,-1,0,1,2,1]:[0,2,0,0,2,0];this.setAttribute("position",new Fe([-1,3,0,-1,-1,0,3,-1,0],3)),this.setAttribute("uv",new Fe(t,2))}}const ly=new uy;class dy extends W{constructor(e=null){super(ly,e),this.camera=oy,this.isQuadMesh=!0}async renderAsync(e){return e.renderAsync(this,oy)}render(e){e.render(this,oy)}}const cy=new t;class hy extends $u{static get type(){return"RTTNode"}constructor(e,t=null,r=null,s={type:he}){const i=new ae(t,r,s);super(i.texture,Uu()),this.node=e,this.width=t,this.height=r,this.pixelRatio=1,this.renderTarget=i,this.textureNeedsUpdate=!0,this.autoUpdate=!0,this._rttNode=null,this._quadMesh=new dy(new Fh),this.updateBeforeType=Is.RENDER}get autoSize(){return null===this.width}setup(e){return this._rttNode=this.node.context(e.getSharedContext()),this._quadMesh.material.name="RTT",this._quadMesh.material.needsUpdate=!0,super.setup(e)}setSize(e,t){this.width=e,this.height=t;const r=e*this.pixelRatio,s=t*this.pixelRatio;this.renderTarget.setSize(r,s),this.textureNeedsUpdate=!0}setPixelRatio(e){this.pixelRatio=e,this.setSize(this.width,this.height)}updateBefore({renderer:e}){if(!1===this.textureNeedsUpdate&&!1===this.autoUpdate)return;if(this.textureNeedsUpdate=!1,!0===this.autoSize){this.pixelRatio=e.getPixelRatio();const t=e.getSize(cy);this.setSize(t.width,t.height)}this._quadMesh.material.fragmentNode=this._rttNode;const t=e.getRenderTarget();e.setRenderTarget(this.renderTarget),this._quadMesh.render(e),e.setRenderTarget(t)}clone(){const e=new $u(this.value,this.uvNode,this.levelNode);return e.sampler=this.sampler,e.referenceNode=this,e}}const py=(e,...t)=>Pi(new hy(Pi(e),...t)),gy=Vi((([e,t,r],s)=>{let i;s.renderer.coordinateSystem===d?(e=qi(e.x,e.y.oneMinus()).mul(2).sub(1),i=tn(Qi(e,t),1)):i=tn(Qi(e.x,e.y.oneMinus(),t).mul(2).sub(1),1);const n=tn(r.mul(i));return n.xyz.div(n.w)})),my=Vi((([e,t])=>{const r=t.mul(tn(e,1)),s=r.xy.div(r.w).mul(.5).add(.5).toVar();return qi(s.x,s.y.oneMinus())})),fy=Vi((([e,t,r])=>{const s=Gu(Wu(t)),i=Xi(e.mul(s)).toVar(),n=Wu(t,i).toVar(),a=Wu(t,i.sub(Xi(2,0))).toVar(),o=Wu(t,i.sub(Xi(1,0))).toVar(),u=Wu(t,i.add(Xi(1,0))).toVar(),l=Wu(t,i.add(Xi(2,0))).toVar(),d=Wu(t,i.add(Xi(0,2))).toVar(),c=Wu(t,i.add(Xi(0,1))).toVar(),h=Wu(t,i.sub(Xi(0,1))).toVar(),p=Wu(t,i.sub(Xi(0,2))).toVar(),g=Qa(ia($i(2).mul(o).sub(a),n)).toVar(),m=Qa(ia($i(2).mul(u).sub(l),n)).toVar(),f=Qa(ia($i(2).mul(c).sub(d),n)).toVar(),y=Qa(ia($i(2).mul(h).sub(p),n)).toVar(),x=gy(e,n,r).toVar(),b=g.lessThan(m).select(x.sub(gy(e.sub(qi($i(1).div(s.x),0)),o,r)),x.negate().add(gy(e.add(qi($i(1).div(s.x),0)),u,r))),T=f.lessThan(y).select(x.sub(gy(e.add(qi(0,$i(1).div(s.y))),c,r)),x.negate().add(gy(e.sub(qi(0,$i(1).div(s.y))),h,r)));return $a(bo(b,T))}));class yy extends M{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageInstancedBufferAttribute=!0}}class xy extends le{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageBufferAttribute=!0}}class by extends Du{static get type(){return"VertexColorNode"}constructor(e=0){super(null,"vec4"),this.isVertexColorNode=!0,this.index=e}getAttributeName(){const e=this.index;return"color"+(e>0?e:"")}generate(e){const t=this.getAttributeName(e);let r;return r=!0===e.hasGeometryAttribute(t)?super.generate(e):e.generateConst(this.nodeType,new s(1,1,1,1)),r}serialize(e){super.serialize(e),e.index=this.index}deserialize(e){super.deserialize(e),this.index=e.index}}class Ty extends $s{static get type(){return"PointUVNode"}constructor(){super("vec2"),this.isPointUVNode=!0}generate(){return"vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y )"}}const _y=Ii(Ty),vy=new S,Ny=new a;class Sy extends $s{static get type(){return"SceneNode"}constructor(e=Sy.BACKGROUND_BLURRINESS,t=null){super(),this.scope=e,this.scene=t}setup(e){const t=this.scope,r=null!==this.scene?this.scene:e.scene;let s;return t===Sy.BACKGROUND_BLURRINESS?s=ad("backgroundBlurriness","float",r):t===Sy.BACKGROUND_INTENSITY?s=ad("backgroundIntensity","float",r):t===Sy.BACKGROUND_ROTATION?s=Tn("mat4").label("backgroundRotation").setGroup(yn).onRenderUpdate((()=>{const e=r.background;return null!==e&&e.isTexture&&e.mapping!==Be?(vy.copy(r.backgroundRotation),vy.x*=-1,vy.y*=-1,vy.z*=-1,Ny.makeRotationFromEuler(vy)):Ny.identity(),Ny})):console.error("THREE.SceneNode: Unknown scope:",t),s}}Sy.BACKGROUND_BLURRINESS="backgroundBlurriness",Sy.BACKGROUND_INTENSITY="backgroundIntensity",Sy.BACKGROUND_ROTATION="backgroundRotation";const Ey=Ii(Sy,Sy.BACKGROUND_BLURRINESS),wy=Ii(Sy,Sy.BACKGROUND_INTENSITY),Ay=Ii(Sy,Sy.BACKGROUND_ROTATION);class Ry extends $u{static get type(){return"StorageTextureNode"}constructor(e,t,r=null){super(e,t),this.storeNode=r,this.isStorageTextureNode=!0,this.access=Vs.WRITE_ONLY}getInputType(){return"storageTexture"}setup(e){super.setup(e);e.getNodeProperties(this).storeNode=this.storeNode}setAccess(e){return this.access=e,this}generate(e,t){let r;return r=null!==this.storeNode?this.generateStore(e):super.generate(e,t),r}toReadWrite(){return this.setAccess(Vs.READ_WRITE)}toReadOnly(){return this.setAccess(Vs.READ_ONLY)}toWriteOnly(){return this.setAccess(Vs.WRITE_ONLY)}generateStore(e){const t=e.getNodeProperties(this),{uvNode:r,storeNode:s}=t,i=super.generate(e,"property"),n=r.build(e,"uvec2"),a=s.build(e,"vec4"),o=e.generateTextureStore(e,i,n,a);e.addLineFlowCode(o,this)}}const Cy=Bi(Ry).setParameterLength(1,3),My=Vi((({texture:e,uv:t})=>{const r=1e-4,s=Qi().toVar();return Gi(t.x.lessThan(r),(()=>{s.assign(Qi(1,0,0))})).ElseIf(t.y.lessThan(r),(()=>{s.assign(Qi(0,1,0))})).ElseIf(t.z.lessThan(r),(()=>{s.assign(Qi(0,0,1))})).ElseIf(t.x.greaterThan(.9999),(()=>{s.assign(Qi(-1,0,0))})).ElseIf(t.y.greaterThan(.9999),(()=>{s.assign(Qi(0,-1,0))})).ElseIf(t.z.greaterThan(.9999),(()=>{s.assign(Qi(0,0,-1))})).Else((()=>{const r=.01,i=e.sample(t.add(Qi(-.01,0,0))).r.sub(e.sample(t.add(Qi(r,0,0))).r),n=e.sample(t.add(Qi(0,-.01,0))).r.sub(e.sample(t.add(Qi(0,r,0))).r),a=e.sample(t.add(Qi(0,0,-.01))).r.sub(e.sample(t.add(Qi(0,0,r))).r);s.assign(Qi(i,n,a))})),s.normalize()}));class Py extends $u{static get type(){return"Texture3DNode"}constructor(e,t=null,r=null){super(e,t,r),this.isTexture3DNode=!0}getInputType(){return"texture3D"}getDefaultUV(){return Qi(.5,.5,.5)}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return!e.isFlipY()||!0!==r.isRenderTargetTexture&&!0!==r.isFramebufferTexture||(t=this.sampler?t.flipY():t.setY(Hi(Gu(this,this.levelNode).y).sub(t.y).sub(1))),t}generateUV(e,t){return t.build(e,"vec3")}normal(e){return My({texture:this,uv:e})}}const Ly=Bi(Py).setParameterLength(1,3);class Fy extends nd{static get type(){return"UserDataNode"}constructor(e,t,r=null){super(e,t,r),this.userData=r}updateReference(e){return this.reference=null!==this.userData?this.userData:e.object.userData,this.reference}}const By=new WeakMap;class Iy extends js{static get type(){return"VelocityNode"}constructor(){super("vec2"),this.projectionMatrix=null,this.updateType=Is.OBJECT,this.updateAfterType=Is.OBJECT,this.previousModelWorldMatrix=Tn(new a),this.previousProjectionMatrix=Tn(new a).setGroup(yn),this.previousCameraViewMatrix=Tn(new a)}setProjectionMatrix(e){this.projectionMatrix=e}update({frameId:e,camera:t,object:r}){const s=Vy(r);this.previousModelWorldMatrix.value.copy(s);const i=Dy(t);i.frameId!==e&&(i.frameId=e,void 0===i.previousProjectionMatrix?(i.previousProjectionMatrix=new a,i.previousCameraViewMatrix=new a,i.currentProjectionMatrix=new a,i.currentCameraViewMatrix=new a,i.previousProjectionMatrix.copy(this.projectionMatrix||t.projectionMatrix),i.previousCameraViewMatrix.copy(t.matrixWorldInverse)):(i.previousProjectionMatrix.copy(i.currentProjectionMatrix),i.previousCameraViewMatrix.copy(i.currentCameraViewMatrix)),i.currentProjectionMatrix.copy(this.projectionMatrix||t.projectionMatrix),i.currentCameraViewMatrix.copy(t.matrixWorldInverse),this.previousProjectionMatrix.value.copy(i.previousProjectionMatrix),this.previousCameraViewMatrix.value.copy(i.previousCameraViewMatrix))}updateAfter({object:e}){Vy(e).copy(e.matrixWorld)}setup(){const e=null===this.projectionMatrix?el:Tn(this.projectionMatrix),t=this.previousCameraViewMatrix.mul(this.previousModelWorldMatrix),r=e.mul(Nl).mul(Rl),s=this.previousProjectionMatrix.mul(t).mul(Cl),i=r.xy.div(r.w),n=s.xy.div(s.w);return ia(i,n)}}function Dy(e){let t=By.get(e);return void 0===t&&(t={},By.set(e,t)),t}function Vy(e,t=0){const r=Dy(e);let s=r[t];return void 0===s&&(r[t]=s=new a),s}const Uy=Ii(Iy),Oy=Vi((([e,t])=>ho(1,e.oneMinus().div(t)).oneMinus())).setLayout({name:"blendBurn",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Gy=Vi((([e,t])=>ho(e.div(t.oneMinus()),1))).setLayout({name:"blendDodge",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),ky=Vi((([e,t])=>e.oneMinus().mul(t.oneMinus()).oneMinus())).setLayout({name:"blendScreen",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),zy=Vi((([e,t])=>Ao(e.mul(2).mul(t),e.oneMinus().mul(2).mul(t.oneMinus()).oneMinus(),go(.5,e)))).setLayout({name:"blendOverlay",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),$y=Vi((([e,t])=>{const r=t.a.add(e.a.mul(t.a.oneMinus()));return tn(t.rgb.mul(t.a).add(e.rgb.mul(e.a).mul(t.a.oneMinus())).div(r),r)})).setLayout({name:"blendColor",type:"vec4",inputs:[{name:"base",type:"vec4"},{name:"blend",type:"vec4"}]}),Hy=Vi((([e])=>Xy(e.rgb))),Wy=Vi((([e,t=$i(1)])=>t.mix(Xy(e.rgb),e.rgb))),jy=Vi((([e,t=$i(1)])=>{const r=sa(e.r,e.g,e.b).div(3),s=e.r.max(e.g.max(e.b)),i=s.sub(r).mul(t).mul(-3);return Ao(e.rgb,s,i)})),qy=Vi((([e,t=$i(1)])=>{const r=Qi(.57735,.57735,.57735),s=t.cos();return Qi(e.rgb.mul(s).add(r.cross(e.rgb).mul(t.sin()).add(r.mul(xo(r,e.rgb).mul(s.oneMinus())))))})),Xy=(e,t=Qi(c.getLuminanceCoefficients(new r)))=>xo(e,t),Ky=Vi((([e,t=Qi(1),s=Qi(0),i=Qi(1),n=$i(1),a=Qi(c.getLuminanceCoefficients(new r,de))])=>{const o=e.rgb.dot(Qi(a)),u=po(e.rgb.mul(t).add(s),0).toVar(),l=u.pow(i).toVar();return Gi(u.r.greaterThan(0),(()=>{u.r.assign(l.r)})),Gi(u.g.greaterThan(0),(()=>{u.g.assign(l.g)})),Gi(u.b.greaterThan(0),(()=>{u.b.assign(l.b)})),u.assign(o.add(u.sub(o).mul(n))),tn(u.rgb,e.a)}));class Yy extends js{static get type(){return"PosterizeNode"}constructor(e,t){super(),this.sourceNode=e,this.stepsNode=t}setup(){const{sourceNode:e,stepsNode:t}=this;return e.mul(t).floor().div(t)}}const Qy=Bi(Yy).setParameterLength(2),Zy=new t;class Jy extends $u{static get type(){return"PassTextureNode"}constructor(e,t){super(t),this.passNode=e,this.setUpdateMatrix(!1)}setup(e){return e.object.isQuadMesh&&this.passNode.build(e),super.setup(e)}clone(){return new this.constructor(this.passNode,this.value)}}class ex extends Jy{static get type(){return"PassMultipleTextureNode"}constructor(e,t,r=!1){super(e,null),this.textureName=t,this.previousTexture=r}updateTexture(){this.value=this.previousTexture?this.passNode.getPreviousTexture(this.textureName):this.passNode.getTexture(this.textureName)}setup(e){return this.updateTexture(),super.setup(e)}clone(){return new this.constructor(this.passNode,this.textureName,this.previousTexture)}}class tx extends js{static get type(){return"PassNode"}constructor(e,t,r,s={}){super("vec4"),this.scope=e,this.scene=t,this.camera=r,this.options=s,this._pixelRatio=1,this._width=1,this._height=1;const i=new I;i.isRenderTargetTexture=!0,i.name="depth";const n=new ae(this._width*this._pixelRatio,this._height*this._pixelRatio,{type:he,...s});n.texture.name="output",n.depthTexture=i,this.renderTarget=n,this._textures={output:n.texture,depth:i},this._textureNodes={},this._linearDepthNodes={},this._viewZNodes={},this._previousTextures={},this._previousTextureNodes={},this._cameraNear=Tn(0),this._cameraFar=Tn(0),this._mrt=null,this._layers=null,this._resolution=1,this.isPassNode=!0,this.updateBeforeType=Is.FRAME}setResolution(e){return this._resolution=e,this}getResolution(){return this._resolution}setLayers(e){return this._layers=e,this}getLayers(){return this._layers}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}isGlobal(){return!0}getTexture(e){let t=this._textures[e];if(void 0===t){t=this.renderTarget.texture.clone(),t.name=e,this._textures[e]=t,this.renderTarget.textures.push(t)}return t}getPreviousTexture(e){let t=this._previousTextures[e];return void 0===t&&(t=this.getTexture(e).clone(),this._previousTextures[e]=t),t}toggleTexture(e){const t=this._previousTextures[e];if(void 0!==t){const r=this._textures[e],s=this.renderTarget.textures.indexOf(r);this.renderTarget.textures[s]=t,this._textures[e]=t,this._previousTextures[e]=r,this._textureNodes[e].updateTexture(),this._previousTextureNodes[e].updateTexture()}}getTextureNode(e="output"){let t=this._textureNodes[e];return void 0===t&&(t=Pi(new ex(this,e)),t.updateTexture(),this._textureNodes[e]=t),t}getPreviousTextureNode(e="output"){let t=this._previousTextureNodes[e];return void 0===t&&(void 0===this._textureNodes[e]&&this.getTextureNode(e),t=Pi(new ex(this,e,!0)),t.updateTexture(),this._previousTextureNodes[e]=t),t}getViewZNode(e="depth"){let t=this._viewZNodes[e];if(void 0===t){const r=this._cameraNear,s=this._cameraFar;this._viewZNodes[e]=t=vh(this.getTextureNode(e),r,s)}return t}getLinearDepthNode(e="depth"){let t=this._linearDepthNodes[e];if(void 0===t){const r=this._cameraNear,s=this._cameraFar,i=this.getViewZNode(e);this._linearDepthNodes[e]=t=Th(i,r,s)}return t}setup({renderer:e}){return this.renderTarget.samples=void 0===this.options.samples?e.samples:this.options.samples,!0===e.backend.isWebGLBackend&&(this.renderTarget.samples=0),this.renderTarget.texture.type=e.getColorBufferType(),this.scope===tx.COLOR?this.getTextureNode():this.getLinearDepthNode()}updateBefore(e){const{renderer:t}=e,{scene:r}=this;let s,i;const n=t.getOutputRenderTarget();n&&!0===n.isXRRenderTarget?(i=1,s=t.xr.getCamera(),t.xr.updateCamera(s),Zy.set(n.width,n.height)):(s=this.camera,i=t.getPixelRatio(),t.getSize(Zy)),this._pixelRatio=i,this.setSize(Zy.width,Zy.height);const a=t.getRenderTarget(),o=t.getMRT(),u=s.layers.mask;this._cameraNear.value=s.near,this._cameraFar.value=s.far,null!==this._layers&&(s.layers.mask=this._layers.mask);for(const e in this._previousTextures)this.toggleTexture(e);t.setRenderTarget(this.renderTarget),t.setMRT(this._mrt),t.render(r,s),t.setRenderTarget(a),t.setMRT(o),s.layers.mask=u}setSize(e,t){this._width=e,this._height=t;const r=this._width*this._pixelRatio*this._resolution,s=this._height*this._pixelRatio*this._resolution;this.renderTarget.setSize(r,s)}setPixelRatio(e){this._pixelRatio=e,this.setSize(this._width,this._height)}dispose(){this.renderTarget.dispose()}}tx.COLOR="color",tx.DEPTH="depth";class rx extends tx{static get type(){return"ToonOutlinePassNode"}constructor(e,t,r,s,i){super(tx.COLOR,e,t),this.colorNode=r,this.thicknessNode=s,this.alphaNode=i,this._materialCache=new WeakMap}updateBefore(e){const{renderer:t}=e,r=t.getRenderObjectFunction();t.setRenderObjectFunction(((e,r,s,i,n,a,o,u)=>{if((n.isMeshToonMaterial||n.isMeshToonNodeMaterial)&&!1===n.wireframe){const l=this._getOutlineMaterial(n);t.renderObject(e,r,s,i,l,a,o,u)}t.renderObject(e,r,s,i,n,a,o,u)})),super.updateBefore(e),t.setRenderObjectFunction(r)}_createMaterial(){const e=new Fh;e.isMeshToonOutlineMaterial=!0,e.name="Toon_Outline",e.side=N;const t=Ul.negate(),r=el.mul(Nl),s=$i(1),i=r.mul(tn(Rl,1)),n=r.mul(tn(Rl.add(t),1)),a=$a(i.sub(n));return e.vertexNode=i.add(a.mul(this.thicknessNode).mul(i.w).mul(s)),e.colorNode=tn(this.colorNode,this.alphaNode),e}_getOutlineMaterial(e){let t=this._materialCache.get(e);return void 0===t&&(t=this._createMaterial(),this._materialCache.set(e,t)),t}}const sx=Vi((([e,t])=>e.mul(t).clamp())).setLayout({name:"linearToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),ix=Vi((([e,t])=>(e=e.mul(t)).div(e.add(1)).clamp())).setLayout({name:"reinhardToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),nx=Vi((([e,t])=>{const r=(e=(e=e.mul(t)).sub(.004).max(0)).mul(e.mul(6.2).add(.5)),s=e.mul(e.mul(6.2).add(1.7)).add(.06);return r.div(s).pow(2.2)})).setLayout({name:"cineonToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),ax=Vi((([e])=>{const t=e.mul(e.add(.0245786)).sub(90537e-9),r=e.mul(e.add(.432951).mul(.983729)).add(.238081);return t.div(r)})),ox=Vi((([e,t])=>{const r=on(.59719,.35458,.04823,.076,.90834,.01566,.0284,.13383,.83777),s=on(1.60475,-.53108,-.07367,-.10208,1.10813,-.00605,-.00327,-.07276,1.07602);return e=e.mul(t).div(.6),e=r.mul(e),e=ax(e),(e=s.mul(e)).clamp()})).setLayout({name:"acesFilmicToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),ux=on(Qi(1.6605,-.1246,-.0182),Qi(-.5876,1.1329,-.1006),Qi(-.0728,-.0083,1.1187)),lx=on(Qi(.6274,.0691,.0164),Qi(.3293,.9195,.088),Qi(.0433,.0113,.8956)),dx=Vi((([e])=>{const t=Qi(e).toVar(),r=Qi(t.mul(t)).toVar(),s=Qi(r.mul(r)).toVar();return $i(15.5).mul(s.mul(r)).sub(na(40.14,s.mul(t))).add(na(31.96,s).sub(na(6.868,r.mul(t))).add(na(.4298,r).add(na(.1191,t).sub(.00232))))})),cx=Vi((([e,t])=>{const r=Qi(e).toVar(),s=on(Qi(.856627153315983,.137318972929847,.11189821299995),Qi(.0951212405381588,.761241990602591,.0767994186031903),Qi(.0482516061458583,.101439036467562,.811302368396859)),i=on(Qi(1.1271005818144368,-.1413297634984383,-.14132976349843826),Qi(-.11060664309660323,1.157823702216272,-.11060664309660294),Qi(-.016493938717834573,-.016493938717834257,1.2519364065950405)),n=$i(-12.47393),a=$i(4.026069);return r.mulAssign(t),r.assign(lx.mul(r)),r.assign(s.mul(r)),r.assign(po(r,1e-10)),r.assign(Ua(r)),r.assign(r.sub(n).div(a.sub(n))),r.assign(Ro(r,0,1)),r.assign(dx(r)),r.assign(i.mul(r)),r.assign(To(po(Qi(0),r),Qi(2.2))),r.assign(ux.mul(r)),r.assign(Ro(r,0,1)),r})).setLayout({name:"agxToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),hx=Vi((([e,t])=>{const r=$i(.76),s=$i(.15);e=e.mul(t);const i=ho(e.r,ho(e.g,e.b)),n=Go(i.lessThan(.08),i.sub(na(6.25,i.mul(i))),.04);e.subAssign(n);const a=po(e.r,po(e.g,e.b));Gi(a.lessThan(r),(()=>e));const o=ia(1,r),u=ia(1,o.mul(o).div(a.add(o.sub(r))));e.mulAssign(u.div(a));const l=ia(1,aa(1,s.mul(a.sub(u)).add(1)));return Ao(e,Qi(u),l)})).setLayout({name:"neutralToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]});class px extends $s{static get type(){return"CodeNode"}constructor(e="",t=[],r=""){super("code"),this.isCodeNode=!0,this.code=e,this.includes=t,this.language=r}isGlobal(){return!0}setIncludes(e){return this.includes=e,this}getIncludes(){return this.includes}generate(e){const t=this.getIncludes(e);for(const r of t)r.build(e);const r=e.getCodeFromNode(this,this.getNodeType(e));return r.code=this.code,r.code}serialize(e){super.serialize(e),e.code=this.code,e.language=this.language}deserialize(e){super.deserialize(e),this.code=e.code,this.language=e.language}}const gx=Bi(px).setParameterLength(1,3);class mx extends px{static get type(){return"FunctionNode"}constructor(e="",t=[],r=""){super(e,t,r)}getNodeType(e){return this.getNodeFunction(e).type}getInputs(e){return this.getNodeFunction(e).inputs}getNodeFunction(e){const t=e.getDataFromNode(this);let r=t.nodeFunction;return void 0===r&&(r=e.parser.parseFunction(this.code),t.nodeFunction=r),r}generate(e,t){super.generate(e);const r=this.getNodeFunction(e),s=r.name,i=r.type,n=e.getCodeFromNode(this,i);""!==s&&(n.name=s);const a=e.getPropertyName(n),o=this.getNodeFunction(e).getCode(a);return n.code=o+"\n","property"===t?a:e.format(`${a}()`,i,t)}}const fx=(e,t=[],r="")=>{for(let e=0;es.call(...e);return i.functionNode=s,i};class yx extends $s{static get type(){return"ScriptableValueNode"}constructor(e=null){super(),this._value=e,this._cache=null,this.inputType=null,this.outputType=null,this.events=new o,this.isScriptableValueNode=!0}get isScriptableOutputNode(){return null!==this.outputType}set value(e){this._value!==e&&(this._cache&&"URL"===this.inputType&&this.value.value instanceof ArrayBuffer&&(URL.revokeObjectURL(this._cache),this._cache=null),this._value=e,this.events.dispatchEvent({type:"change"}),this.refresh())}get value(){return this._value}refresh(){this.events.dispatchEvent({type:"refresh"})}getValue(){const e=this.value;if(e&&null===this._cache&&"URL"===this.inputType&&e.value instanceof ArrayBuffer)this._cache=URL.createObjectURL(new Blob([e.value]));else if(e&&null!==e.value&&void 0!==e.value&&(("URL"===this.inputType||"String"===this.inputType)&&"string"==typeof e.value||"Number"===this.inputType&&"number"==typeof e.value||"Vector2"===this.inputType&&e.value.isVector2||"Vector3"===this.inputType&&e.value.isVector3||"Vector4"===this.inputType&&e.value.isVector4||"Color"===this.inputType&&e.value.isColor||"Matrix3"===this.inputType&&e.value.isMatrix3||"Matrix4"===this.inputType&&e.value.isMatrix4))return e.value;return this._cache||e}getNodeType(e){return this.value&&this.value.isNode?this.value.getNodeType(e):"float"}setup(){return this.value&&this.value.isNode?this.value:$i()}serialize(e){super.serialize(e),null!==this.value?"ArrayBuffer"===this.inputType?e.value=Ps(this.value):e.value=this.value?this.value.toJSON(e.meta).uuid:null:e.value=null,e.inputType=this.inputType,e.outputType=this.outputType}deserialize(e){super.deserialize(e);let t=null;null!==e.value&&(t="ArrayBuffer"===e.inputType?Ls(e.value):"Texture"===e.inputType?e.meta.textures[e.value]:e.meta.nodes[e.value]||null),this.value=t,this.inputType=e.inputType,this.outputType=e.outputType}}const xx=Bi(yx).setParameterLength(1);class bx extends Map{get(e,t=null,...r){if(this.has(e))return super.get(e);if(null!==t){const s=t(...r);return this.set(e,s),s}}}class Tx{constructor(e){this.scriptableNode=e}get parameters(){return this.scriptableNode.parameters}get layout(){return this.scriptableNode.getLayout()}getInputLayout(e){return this.scriptableNode.getInputLayout(e)}get(e){const t=this.parameters[e];return t?t.getValue():null}}const _x=new bx;class vx extends $s{static get type(){return"ScriptableNode"}constructor(e=null,t={}){super(),this.codeNode=e,this.parameters=t,this._local=new bx,this._output=xx(null),this._outputs={},this._source=this.source,this._method=null,this._object=null,this._value=null,this._needsOutputUpdate=!0,this.onRefresh=this.onRefresh.bind(this),this.isScriptableNode=!0}get source(){return this.codeNode?this.codeNode.code:""}setLocal(e,t){return this._local.set(e,t)}getLocal(e){return this._local.get(e)}onRefresh(){this._refresh()}getInputLayout(e){for(const t of this.getLayout())if(t.inputType&&(t.id===e||t.name===e))return t}getOutputLayout(e){for(const t of this.getLayout())if(t.outputType&&(t.id===e||t.name===e))return t}setOutput(e,t){const r=this._outputs;return void 0===r[e]?r[e]=xx(t):r[e].value=t,this}getOutput(e){return this._outputs[e]}getParameter(e){return this.parameters[e]}setParameter(e,t){const r=this.parameters;return t&&t.isScriptableNode?(this.deleteParameter(e),r[e]=t,r[e].getDefaultOutput().events.addEventListener("refresh",this.onRefresh)):t&&t.isScriptableValueNode?(this.deleteParameter(e),r[e]=t,r[e].events.addEventListener("refresh",this.onRefresh)):void 0===r[e]?(r[e]=xx(t),r[e].events.addEventListener("refresh",this.onRefresh)):r[e].value=t,this}getValue(){return this.getDefaultOutput().getValue()}deleteParameter(e){let t=this.parameters[e];return t&&(t.isScriptableNode&&(t=t.getDefaultOutput()),t.events.removeEventListener("refresh",this.onRefresh)),this}clearParameters(){for(const e of Object.keys(this.parameters))this.deleteParameter(e);return this.needsUpdate=!0,this}call(e,...t){const r=this.getObject()[e];if("function"==typeof r)return r(...t)}async callAsync(e,...t){const r=this.getObject()[e];if("function"==typeof r)return"AsyncFunction"===r.constructor.name?await r(...t):r(...t)}getNodeType(e){return this.getDefaultOutputNode().getNodeType(e)}refresh(e=null){null!==e?this.getOutput(e).refresh():this._refresh()}getObject(){if(this.needsUpdate&&this.dispose(),null!==this._object)return this._object;const e=new Tx(this),t=_x.get("THREE"),r=_x.get("TSL"),s=this.getMethod(),i=[e,this._local,_x,()=>this.refresh(),(e,t)=>this.setOutput(e,t),t,r];this._object=s(...i);const n=this._object.layout;if(n&&(!1===n.cache&&this._local.clear(),this._output.outputType=n.outputType||null,Array.isArray(n.elements)))for(const e of n.elements){const t=e.id||e.name;e.inputType&&(void 0===this.getParameter(t)&&this.setParameter(t,null),this.getParameter(t).inputType=e.inputType),e.outputType&&(void 0===this.getOutput(t)&&this.setOutput(t,null),this.getOutput(t).outputType=e.outputType)}return this._object}deserialize(e){super.deserialize(e);for(const e in this.parameters){let t=this.parameters[e];t.isScriptableNode&&(t=t.getDefaultOutput()),t.events.addEventListener("refresh",this.onRefresh)}}getLayout(){return this.getObject().layout}getDefaultOutputNode(){const e=this.getDefaultOutput().value;return e&&e.isNode?e:$i()}getDefaultOutput(){return this._exec()._output}getMethod(){if(this.needsUpdate&&this.dispose(),null!==this._method)return this._method;const e=["layout","init","main","dispose"].join(", "),t="\nreturn { ...output, "+e+" };",r="var "+e+"; var output = {};\n"+this.codeNode.code+t;return this._method=new Function(...["parameters","local","global","refresh","setOutput","THREE","TSL"],r),this._method}dispose(){null!==this._method&&(this._object&&"function"==typeof this._object.dispose&&this._object.dispose(),this._method=null,this._object=null,this._source=null,this._value=null,this._needsOutputUpdate=!0,this._output.value=null,this._outputs={})}setup(){return this.getDefaultOutputNode()}getCacheKey(e){const t=[xs(this.source),this.getDefaultOutputNode().getCacheKey(e)];for(const r in this.parameters)t.push(this.parameters[r].getCacheKey(e));return bs(t)}set needsUpdate(e){!0===e&&this.dispose()}get needsUpdate(){return this.source!==this._source}_exec(){return null===this.codeNode||(!0===this._needsOutputUpdate&&(this._value=this.call("main"),this._needsOutputUpdate=!1),this._output.value=this._value),this}_refresh(){this.needsUpdate=!0,this._exec(),this._output.refresh()}}const Nx=Bi(vx).setParameterLength(1,2);function Sx(e){let t;const r=e.context.getViewZ;return void 0!==r&&(t=r(this)),(t||Ll.z).negate()}const Ex=Vi((([e,t],r)=>{const s=Sx(r);return Po(e,t,s)})),wx=Vi((([e],t)=>{const r=Sx(t);return e.mul(e,r,r).negate().exp().oneMinus()})),Ax=Vi((([e,t])=>tn(t.toFloat().mix(zn.rgb,e.toVec3()),zn.a)));let Rx=null,Cx=null;class Mx extends $s{static get type(){return"RangeNode"}constructor(e=$i(),t=$i()){super(),this.minNode=e,this.maxNode=t}getVectorLength(e){const t=e.getTypeLength(Rs(this.minNode.value)),r=e.getTypeLength(Rs(this.maxNode.value));return t>r?t:r}getNodeType(e){return e.object.count>1?e.getTypeFromLength(this.getVectorLength(e)):"float"}setup(e){const t=e.object;let r=null;if(t.count>1){const i=this.minNode.value,n=this.maxNode.value,a=e.getTypeLength(Rs(i)),o=e.getTypeLength(Rs(n));Rx=Rx||new s,Cx=Cx||new s,Rx.setScalar(0),Cx.setScalar(0),1===a?Rx.setScalar(i):i.isColor?Rx.set(i.r,i.g,i.b,1):Rx.set(i.x,i.y,i.z||0,i.w||0),1===o?Cx.setScalar(n):n.isColor?Cx.set(n.r,n.g,n.b,1):Cx.set(n.x,n.y,n.z||0,n.w||0);const l=4,d=l*t.count,c=new Float32Array(d);for(let e=0;ePi(new Lx(e,t)),Bx=Fx("numWorkgroups","uvec3"),Ix=Fx("workgroupId","uvec3"),Dx=Fx("globalId","uvec3"),Vx=Fx("localId","uvec3"),Ux=Fx("subgroupSize","uint");const Ox=Bi(class extends $s{constructor(e){super(),this.scope=e}generate(e){const{scope:t}=this,{renderer:r}=e;!0===r.backend.isWebGLBackend?e.addFlowCode(`\t// ${t}Barrier \n`):e.addLineFlowCode(`${t}Barrier()`,this)}});class Gx extends Hs{constructor(e,t){super(e,t),this.isWorkgroupInfoElementNode=!0}generate(e,t){let r;const s=e.context.assign;if(r=super.generate(e),!0!==s){const s=this.getNodeType(e);r=e.format(r,s,t)}return r}}class kx extends $s{constructor(e,t,r=0){super(t),this.bufferType=t,this.bufferCount=r,this.isWorkgroupInfoNode=!0,this.elementType=t,this.scope=e}label(e){return this.name=e,this}setScope(e){return this.scope=e,this}getElementType(){return this.elementType}getInputType(){return`${this.scope}Array`}element(e){return Pi(new Gx(this,e))}generate(e){return e.getScopedArray(this.name||`${this.scope}Array_${this.id}`,this.scope.toLowerCase(),this.bufferType,this.bufferCount)}}class zx extends js{static get type(){return"AtomicFunctionNode"}constructor(e,t,r){super("uint"),this.method=e,this.pointerNode=t,this.valueNode=r}getInputType(e){return this.pointerNode.getNodeType(e)}getNodeType(e){return this.getInputType(e)}generate(e){const t=this.method,r=this.getNodeType(e),s=this.getInputType(e),i=this.pointerNode,n=this.valueNode,a=[];a.push(`&${i.build(e,s)}`),null!==n&&a.push(n.build(e,s));const o=`${e.getMethod(t,r)}( ${a.join(", ")} )`;return null!==n&&e.addLineFlowCode(o,this),o}}zx.ATOMIC_LOAD="atomicLoad",zx.ATOMIC_STORE="atomicStore",zx.ATOMIC_ADD="atomicAdd",zx.ATOMIC_SUB="atomicSub",zx.ATOMIC_MAX="atomicMax",zx.ATOMIC_MIN="atomicMin",zx.ATOMIC_AND="atomicAnd",zx.ATOMIC_OR="atomicOr",zx.ATOMIC_XOR="atomicXor";const $x=Bi(zx),Hx=(e,t,r)=>{const s=$x(e,t,r);return s.append(),s};let Wx;function jx(e){Wx=Wx||new WeakMap;let t=Wx.get(e);return void 0===t&&Wx.set(e,t={}),t}function qx(e){const t=jx(e);return t.shadowMatrix||(t.shadowMatrix=Tn("mat4").setGroup(yn).onRenderUpdate((()=>(!0!==e.castShadow&&e.shadow.updateMatrices(e),e.shadow.matrix))))}function Xx(e,t=Ml){const r=qx(e).mul(t);return r.xyz.div(r.w)}function Kx(e){const t=jx(e);return t.position||(t.position=Tn(new r).setGroup(yn).onRenderUpdate(((t,r)=>r.value.setFromMatrixPosition(e.matrixWorld))))}function Yx(e){const t=jx(e);return t.targetPosition||(t.targetPosition=Tn(new r).setGroup(yn).onRenderUpdate(((t,r)=>r.value.setFromMatrixPosition(e.target.matrixWorld))))}function Qx(e){const t=jx(e);return t.viewPosition||(t.viewPosition=Tn(new r).setGroup(yn).onRenderUpdate((({camera:t},s)=>{s.value=s.value||new r,s.value.setFromMatrixPosition(e.matrixWorld),s.value.applyMatrix4(t.matrixWorldInverse)})))}const Zx=e=>rl.transformDirection(Kx(e).sub(Yx(e))),Jx=(e,t)=>{for(const r of t)if(r.isAnalyticLightNode&&r.light.id===e)return r;return null},eb=new WeakMap;class tb extends $s{static get type(){return"LightsNode"}constructor(){super("vec3"),this.totalDiffuseNode=Qi().toVar(),this.totalSpecularNode=Qi().toVar(),this.outgoingLightNode=Qi().toVar(),this._lights=[],this._lightNodes=null,this._lightNodesHash=null,this.global=!0}customCacheKey(){const e=[],t=this._lights;for(let r=0;re.sort(((e,t)=>e.id-t.id)))(this._lights),i=e.renderer.library;for(const e of s)if(e.isNode)t.push(Pi(e));else{let s=null;if(null!==r&&(s=Jx(e.id,r)),null===s){const r=i.getLightNodeClass(e.constructor);if(null===r){console.warn(`LightsNode.setupNodeLights: Light node not found for ${e.constructor.name}`);continue}let s=null;eb.has(e)?s=eb.get(e):(s=Pi(new r(e)),eb.set(e,s)),t.push(s)}}this._lightNodes=t}setupDirectLight(e,t,r){const{lightingModel:s,reflectedLight:i}=e.context;s.direct({...r,lightNode:t,reflectedLight:i},e)}setupDirectRectAreaLight(e,t,r){const{lightingModel:s,reflectedLight:i}=e.context;s.directRectArea({...r,lightNode:t,reflectedLight:i},e)}setupLights(e,t){for(const r of t)r.build(e)}getLightNodes(e){return null===this._lightNodes&&this.setupLightsNode(e),this._lightNodes}setup(e){const t=e.lightsNode;e.lightsNode=this;let r=this.outgoingLightNode;const s=e.context,i=s.lightingModel,n=e.getDataFromNode(this);if(i){const{totalDiffuseNode:t,totalSpecularNode:a}=this;s.outgoingLight=r;const o=e.addStack();n.nodes=o.nodes,i.start(e);const{backdrop:u,backdropAlpha:l}=s,{directDiffuse:d,directSpecular:c,indirectDiffuse:h,indirectSpecular:p}=s.reflectedLight;let g=d.add(h);null!==u&&(g=Qi(null!==l?l.mix(g,u):u),s.material.transparent=!0),t.assign(g),a.assign(c.add(p)),r.assign(t.add(a)),i.finish(e),r=r.bypass(e.removeStack())}else n.nodes=[];return e.lightsNode=t,r}setLights(e){return this._lights=e,this._lightNodes=null,this._lightNodesHash=null,this}getLights(){return this._lights}get hasLights(){return this._lights.length>0}}class rb extends $s{static get type(){return"ShadowBaseNode"}constructor(e){super(),this.light=e,this.updateBeforeType=Is.RENDER,this.isShadowBaseNode=!0}setupShadowPosition({context:e,material:t}){sb.assign(t.shadowPositionNode||e.shadowPositionWorld||Ml)}dispose(){this.updateBeforeType=Is.NONE}}const sb=vn("vec3","shadowPositionWorld");function ib(t,r={}){return r.toneMapping=t.toneMapping,r.toneMappingExposure=t.toneMappingExposure,r.outputColorSpace=t.outputColorSpace,r.renderTarget=t.getRenderTarget(),r.activeCubeFace=t.getActiveCubeFace(),r.activeMipmapLevel=t.getActiveMipmapLevel(),r.renderObjectFunction=t.getRenderObjectFunction(),r.pixelRatio=t.getPixelRatio(),r.mrt=t.getMRT(),r.clearColor=t.getClearColor(r.clearColor||new e),r.clearAlpha=t.getClearAlpha(),r.autoClear=t.autoClear,r.scissorTest=t.getScissorTest(),r}function nb(e,t){return t=ib(e,t),e.setMRT(null),e.setRenderObjectFunction(null),e.setClearColor(0,1),e.autoClear=!0,t}function ab(e,t){e.toneMapping=t.toneMapping,e.toneMappingExposure=t.toneMappingExposure,e.outputColorSpace=t.outputColorSpace,e.setRenderTarget(t.renderTarget,t.activeCubeFace,t.activeMipmapLevel),e.setRenderObjectFunction(t.renderObjectFunction),e.setPixelRatio(t.pixelRatio),e.setMRT(t.mrt),e.setClearColor(t.clearColor,t.clearAlpha),e.autoClear=t.autoClear,e.setScissorTest(t.scissorTest)}function ob(e,t={}){return t.background=e.background,t.backgroundNode=e.backgroundNode,t.overrideMaterial=e.overrideMaterial,t}function ub(e,t){return t=ob(e,t),e.background=null,e.backgroundNode=null,e.overrideMaterial=null,t}function lb(e,t){e.background=t.background,e.backgroundNode=t.backgroundNode,e.overrideMaterial=t.overrideMaterial}function db(e,t,r){return r=ub(t,r=nb(e,r))}function cb(e,t,r){ab(e,r),lb(t,r)}var hb=Object.freeze({__proto__:null,resetRendererAndSceneState:db,resetRendererState:nb,resetSceneState:ub,restoreRendererAndSceneState:cb,restoreRendererState:ab,restoreSceneState:lb,saveRendererAndSceneState:function(e,t,r={}){return r=ob(t,r=ib(e,r))},saveRendererState:ib,saveSceneState:ob});const pb=new WeakMap,gb=Vi((([e,t,r])=>{let s=Ml.sub(e).length();return s=s.sub(t).div(r.sub(t)),s=s.saturate(),s})),mb=e=>{let t=pb.get(e);if(void 0===t){const r=e.isPointLight?(e=>{const t=e.shadow.camera,r=ad("near","float",t).setGroup(yn),s=ad("far","float",t).setGroup(yn),i=dl(e);return gb(i,r,s)})(e):null;t=new Fh,t.colorNode=tn(0,0,0,1),t.depthNode=r,t.isShadowPassMaterial=!0,t.name="ShadowMaterial",t.fog=!1,pb.set(e,t)}return t},fb=Vi((({depthTexture:e,shadowCoord:t})=>Hu(e,t.xy).compare(t.z))),yb=Vi((({depthTexture:e,shadowCoord:t,shadow:r})=>{const s=(t,r)=>Hu(e,t).compare(r),i=ad("mapSize","vec2",r).setGroup(yn),n=ad("radius","float",r).setGroup(yn),a=qi(1).div(i),o=a.x.negate().mul(n),u=a.y.negate().mul(n),l=a.x.mul(n),d=a.y.mul(n),c=o.div(2),h=u.div(2),p=l.div(2),g=d.div(2);return sa(s(t.xy.add(qi(o,u)),t.z),s(t.xy.add(qi(0,u)),t.z),s(t.xy.add(qi(l,u)),t.z),s(t.xy.add(qi(c,h)),t.z),s(t.xy.add(qi(0,h)),t.z),s(t.xy.add(qi(p,h)),t.z),s(t.xy.add(qi(o,0)),t.z),s(t.xy.add(qi(c,0)),t.z),s(t.xy,t.z),s(t.xy.add(qi(p,0)),t.z),s(t.xy.add(qi(l,0)),t.z),s(t.xy.add(qi(c,g)),t.z),s(t.xy.add(qi(0,g)),t.z),s(t.xy.add(qi(p,g)),t.z),s(t.xy.add(qi(o,d)),t.z),s(t.xy.add(qi(0,d)),t.z),s(t.xy.add(qi(l,d)),t.z)).mul(1/17)})),xb=Vi((({depthTexture:e,shadowCoord:t,shadow:r})=>{const s=(t,r)=>Hu(e,t).compare(r),i=ad("mapSize","vec2",r).setGroup(yn),n=qi(1).div(i),a=n.x,o=n.y,u=t.xy,l=Ha(u.mul(i).add(.5));return u.subAssign(l.mul(n)),sa(s(u,t.z),s(u.add(qi(a,0)),t.z),s(u.add(qi(0,o)),t.z),s(u.add(n),t.z),Ao(s(u.add(qi(a.negate(),0)),t.z),s(u.add(qi(a.mul(2),0)),t.z),l.x),Ao(s(u.add(qi(a.negate(),o)),t.z),s(u.add(qi(a.mul(2),o)),t.z),l.x),Ao(s(u.add(qi(0,o.negate())),t.z),s(u.add(qi(0,o.mul(2))),t.z),l.y),Ao(s(u.add(qi(a,o.negate())),t.z),s(u.add(qi(a,o.mul(2))),t.z),l.y),Ao(Ao(s(u.add(qi(a.negate(),o.negate())),t.z),s(u.add(qi(a.mul(2),o.negate())),t.z),l.x),Ao(s(u.add(qi(a.negate(),o.mul(2))),t.z),s(u.add(qi(a.mul(2),o.mul(2))),t.z),l.x),l.y)).mul(1/9)})),bb=Vi((({depthTexture:e,shadowCoord:t})=>{const r=$i(1).toVar(),s=Hu(e).sample(t.xy).rg,i=go(t.z,s.x);return Gi(i.notEqual($i(1)),(()=>{const e=t.z.sub(s.x),n=po(0,s.y.mul(s.y));let a=n.div(n.add(e.mul(e)));a=Ro(ia(a,.3).div(.95-.3)),r.assign(Ro(po(i,a)))})),r})),Tb=Vi((({samples:e,radius:t,size:r,shadowPass:s})=>{const i=$i(0).toVar(),n=$i(0).toVar(),a=e.lessThanEqual($i(1)).select($i(0),$i(2).div(e.sub(1))),o=e.lessThanEqual($i(1)).select($i(0),$i(-1));kc({start:Hi(0),end:Hi(e),type:"int",condition:"<"},(({i:e})=>{const u=o.add($i(e).mul(a)),l=s.sample(sa(ih.xy,qi(0,u).mul(t)).div(r)).x;i.addAssign(l),n.addAssign(l.mul(l))})),i.divAssign(e),n.divAssign(e);const u=Oa(n.sub(i.mul(i)));return qi(i,u)})),_b=Vi((({samples:e,radius:t,size:r,shadowPass:s})=>{const i=$i(0).toVar(),n=$i(0).toVar(),a=e.lessThanEqual($i(1)).select($i(0),$i(2).div(e.sub(1))),o=e.lessThanEqual($i(1)).select($i(0),$i(-1));kc({start:Hi(0),end:Hi(e),type:"int",condition:"<"},(({i:e})=>{const u=o.add($i(e).mul(a)),l=s.sample(sa(ih.xy,qi(u,0).mul(t)).div(r));i.addAssign(l.x),n.addAssign(sa(l.y.mul(l.y),l.x.mul(l.x)))})),i.divAssign(e),n.divAssign(e);const u=Oa(n.sub(i.mul(i)));return qi(i,u)})),vb=[fb,yb,xb,bb];let Nb;const Sb=new dy;class Eb extends rb{static get type(){return"ShadowNode"}constructor(e,t=null){super(e),this.shadow=t||e.shadow,this.shadowMap=null,this.vsmShadowMapVertical=null,this.vsmShadowMapHorizontal=null,this.vsmMaterialVertical=null,this.vsmMaterialHorizontal=null,this._node=null,this._cameraFrameId=new WeakMap,this.isShadowNode=!0}setupShadowFilter(e,{filterFn:t,depthTexture:r,shadowCoord:s,shadow:i}){const n=s.x.greaterThanEqual(0).and(s.x.lessThanEqual(1)).and(s.y.greaterThanEqual(0)).and(s.y.lessThanEqual(1)).and(s.z.lessThanEqual(1)),a=t({depthTexture:r,shadowCoord:s,shadow:i});return n.select(a,$i(1))}setupShadowCoord(e,t){const{shadow:r}=this,{renderer:s}=e,i=ad("bias","float",r).setGroup(yn);let n,a=t;if(r.camera.isOrthographicCamera||!0!==s.logarithmicDepthBuffer)a=a.xyz.div(a.w),n=a.z,s.coordinateSystem===d&&(n=n.mul(2).sub(1));else{const e=a.w;a=a.xy.div(e);const t=ad("near","float",r.camera).setGroup(yn),s=ad("far","float",r.camera).setGroup(yn);n=Nh(e.negate(),t,s)}return a=Qi(a.x,a.y.oneMinus(),n.add(i)),a}getShadowFilterFn(e){return vb[e]}setupShadow(e){const{renderer:t}=e,{light:r,shadow:s}=this,i=t.shadowMap.type,n=new I(s.mapSize.width,s.mapSize.height);n.compareFunction=Ie;const a=e.createRenderTarget(s.mapSize.width,s.mapSize.height);if(a.depthTexture=n,s.camera.updateProjectionMatrix(),i===De){n.compareFunction=null,this.vsmShadowMapVertical=e.createRenderTarget(s.mapSize.width,s.mapSize.height,{format:Ve,type:he}),this.vsmShadowMapHorizontal=e.createRenderTarget(s.mapSize.width,s.mapSize.height,{format:Ve,type:he});const t=Hu(n),r=Hu(this.vsmShadowMapVertical.texture),i=ad("blurSamples","float",s).setGroup(yn),a=ad("radius","float",s).setGroup(yn),o=ad("mapSize","vec2",s).setGroup(yn);let u=this.vsmMaterialVertical||(this.vsmMaterialVertical=new Fh);u.fragmentNode=Tb({samples:i,radius:a,size:o,shadowPass:t}).context(e.getSharedContext()),u.name="VSMVertical",u=this.vsmMaterialHorizontal||(this.vsmMaterialHorizontal=new Fh),u.fragmentNode=_b({samples:i,radius:a,size:o,shadowPass:r}).context(e.getSharedContext()),u.name="VSMHorizontal"}const o=ad("intensity","float",s).setGroup(yn),u=ad("normalBias","float",s).setGroup(yn),l=qx(r).mul(sb.add($l.mul(u))),d=this.setupShadowCoord(e,l),c=s.filterNode||this.getShadowFilterFn(t.shadowMap.type)||null;if(null===c)throw new Error("THREE.WebGPURenderer: Shadow map type not supported yet.");const h=i===De?this.vsmShadowMapHorizontal.texture:n,p=this.setupShadowFilter(e,{filterFn:c,shadowTexture:a.texture,depthTexture:h,shadowCoord:d,shadow:s}),g=Hu(a.texture,d),m=Ao(1,p.rgb.mix(g,1),o.mul(g.a)).toVar();return this.shadowMap=a,this.shadow.map=a,m}setup(e){if(!1!==e.renderer.shadowMap.enabled)return Vi((()=>{let t=this._node;return this.setupShadowPosition(e),null===t&&(this._node=t=this.setupShadow(e)),e.material.shadowNode&&console.warn('THREE.NodeMaterial: ".shadowNode" is deprecated. Use ".castShadowNode" instead.'),e.material.receivedShadowNode&&(t=e.material.receivedShadowNode(t)),t}))()}renderShadow(e){const{shadow:t,shadowMap:r,light:s}=this,{renderer:i,scene:n}=e;t.updateMatrices(s),r.setSize(t.mapSize.width,t.mapSize.height),i.render(n,t.camera)}updateShadow(e){const{shadowMap:t,light:r,shadow:s}=this,{renderer:i,scene:n,camera:a}=e,o=i.shadowMap.type,u=t.depthTexture.version;this._depthVersionCached=u,s.camera.layers.mask=a.layers.mask;const l=i.getRenderObjectFunction(),d=i.getMRT(),c=!!d&&d.has("velocity");Nb=db(i,n,Nb),n.overrideMaterial=mb(r),i.setRenderObjectFunction(((e,t,r,n,u,l,...d)=>{(!0===e.castShadow||e.receiveShadow&&o===De)&&(c&&(Ms(e).useVelocity=!0),e.onBeforeShadow(i,e,a,s.camera,n,t.overrideMaterial,l),i.renderObject(e,t,r,n,u,l,...d),e.onAfterShadow(i,e,a,s.camera,n,t.overrideMaterial,l))})),i.setRenderTarget(t),this.renderShadow(e),i.setRenderObjectFunction(l),!0!==r.isPointLight&&o===De&&this.vsmPass(i),cb(i,n,Nb)}vsmPass(e){const{shadow:t}=this;this.vsmShadowMapVertical.setSize(t.mapSize.width,t.mapSize.height),this.vsmShadowMapHorizontal.setSize(t.mapSize.width,t.mapSize.height),e.setRenderTarget(this.vsmShadowMapVertical),Sb.material=this.vsmMaterialVertical,Sb.render(e),e.setRenderTarget(this.vsmShadowMapHorizontal),Sb.material=this.vsmMaterialHorizontal,Sb.render(e)}dispose(){this.shadowMap.dispose(),this.shadowMap=null,null!==this.vsmShadowMapVertical&&(this.vsmShadowMapVertical.dispose(),this.vsmShadowMapVertical=null,this.vsmMaterialVertical.dispose(),this.vsmMaterialVertical=null),null!==this.vsmShadowMapHorizontal&&(this.vsmShadowMapHorizontal.dispose(),this.vsmShadowMapHorizontal=null,this.vsmMaterialHorizontal.dispose(),this.vsmMaterialHorizontal=null),super.dispose()}updateBefore(e){const{shadow:t}=this;let r=t.needsUpdate||t.autoUpdate;r&&(this._cameraFrameId[e.camera]===e.frameId&&(r=!1),this._cameraFrameId[e.camera]=e.frameId),r&&(this.updateShadow(e),this.shadowMap.depthTexture.version===this._depthVersionCached&&(t.needsUpdate=!1))}}const wb=(e,t)=>Pi(new Eb(e,t)),Ab=new e,Rb=Vi((([e,t])=>{const r=e.toVar(),s=Qa(r),i=aa(1,po(s.x,po(s.y,s.z)));s.mulAssign(i),r.mulAssign(i.mul(t.mul(2).oneMinus()));const n=qi(r.xy).toVar(),a=t.mul(1.5).oneMinus();return Gi(s.z.greaterThanEqual(a),(()=>{Gi(r.z.greaterThan(0),(()=>{n.x.assign(ia(4,r.x))}))})).ElseIf(s.x.greaterThanEqual(a),(()=>{const e=Za(r.x);n.x.assign(r.z.mul(e).add(e.mul(2)))})).ElseIf(s.y.greaterThanEqual(a),(()=>{const e=Za(r.y);n.x.assign(r.x.add(e.mul(2)).add(2)),n.y.assign(r.z.mul(e).sub(2))})),qi(.125,.25).mul(n).add(qi(.375,.75)).flipY()})).setLayout({name:"cubeToUV",type:"vec2",inputs:[{name:"pos",type:"vec3"},{name:"texelSizeY",type:"float"}]}),Cb=Vi((({depthTexture:e,bd3D:t,dp:r,texelSize:s})=>Hu(e,Rb(t,s.y)).compare(r))),Mb=Vi((({depthTexture:e,bd3D:t,dp:r,texelSize:s,shadow:i})=>{const n=ad("radius","float",i).setGroup(yn),a=qi(-1,1).mul(n).mul(s.y);return Hu(e,Rb(t.add(a.xyy),s.y)).compare(r).add(Hu(e,Rb(t.add(a.yyy),s.y)).compare(r)).add(Hu(e,Rb(t.add(a.xyx),s.y)).compare(r)).add(Hu(e,Rb(t.add(a.yyx),s.y)).compare(r)).add(Hu(e,Rb(t,s.y)).compare(r)).add(Hu(e,Rb(t.add(a.xxy),s.y)).compare(r)).add(Hu(e,Rb(t.add(a.yxy),s.y)).compare(r)).add(Hu(e,Rb(t.add(a.xxx),s.y)).compare(r)).add(Hu(e,Rb(t.add(a.yxx),s.y)).compare(r)).mul(1/9)})),Pb=Vi((({filterFn:e,depthTexture:t,shadowCoord:r,shadow:s})=>{const i=r.xyz.toVar(),n=i.length(),a=Tn("float").setGroup(yn).onRenderUpdate((()=>s.camera.near)),o=Tn("float").setGroup(yn).onRenderUpdate((()=>s.camera.far)),u=ad("bias","float",s).setGroup(yn),l=Tn(s.mapSize).setGroup(yn),d=$i(1).toVar();return Gi(n.sub(o).lessThanEqual(0).and(n.sub(a).greaterThanEqual(0)),(()=>{const r=n.sub(a).div(o.sub(a)).toVar();r.addAssign(u);const c=i.normalize(),h=qi(1).div(l.mul(qi(4,2)));d.assign(e({depthTexture:t,bd3D:c,dp:r,texelSize:h,shadow:s}))})),d})),Lb=new s,Fb=new t,Bb=new t;class Ib extends Eb{static get type(){return"PointShadowNode"}constructor(e,t=null){super(e,t)}getShadowFilterFn(e){return e===Ue?Cb:Mb}setupShadowCoord(e,t){return t}setupShadowFilter(e,{filterFn:t,shadowTexture:r,depthTexture:s,shadowCoord:i,shadow:n}){return Pb({filterFn:t,shadowTexture:r,depthTexture:s,shadowCoord:i,shadow:n})}renderShadow(e){const{shadow:t,shadowMap:r,light:s}=this,{renderer:i,scene:n}=e,a=t.getFrameExtents();Bb.copy(t.mapSize),Bb.multiply(a),r.setSize(Bb.width,Bb.height),Fb.copy(t.mapSize);const o=i.autoClear,u=i.getClearColor(Ab),l=i.getClearAlpha();i.autoClear=!1,i.setClearColor(t.clearColor,t.clearAlpha),i.clear();const d=t.getViewportCount();for(let e=0;ePi(new Ib(e,t));class Vb extends Xc{static get type(){return"AnalyticLightNode"}constructor(t=null){super(),this.light=t,this.color=new e,this.colorNode=t&&t.colorNode||Tn(this.color).setGroup(yn),this.baseColorNode=null,this.shadowNode=null,this.shadowColorNode=null,this.isAnalyticLightNode=!0,this.updateType=Is.FRAME}customCacheKey(){return Ts(this.light.id,this.light.castShadow?1:0)}getHash(){return this.light.uuid}getLightVector(e){return Qx(this.light).sub(e.context.positionView||Ll)}setupDirect(){}setupDirectRectArea(){}setupShadowNode(){return wb(this.light)}setupShadow(e){const{renderer:t}=e;if(!1===t.shadowMap.enabled)return;let r=this.shadowColorNode;if(null===r){const e=this.light.shadow.shadowNode;let t;t=void 0!==e?Pi(e):this.setupShadowNode(),this.shadowNode=t,this.shadowColorNode=r=this.colorNode.mul(t),this.baseColorNode=this.colorNode}this.colorNode=r}setup(e){this.colorNode=this.baseColorNode||this.colorNode,this.light.castShadow?e.object.receiveShadow&&this.setupShadow(e):null!==this.shadowNode&&(this.shadowNode.dispose(),this.shadowNode=null,this.shadowColorNode=null);const t=this.setupDirect(e),r=this.setupDirectRectArea(e);t&&e.lightsNode.setupDirectLight(e,this,t),r&&e.lightsNode.setupDirectRectAreaLight(e,this,r)}update(){const{light:e}=this;this.color.copy(e.color).multiplyScalar(e.intensity)}}const Ub=Vi((({lightDistance:e,cutoffDistance:t,decayExponent:r})=>{const s=e.pow(r).max(.01).reciprocal();return t.greaterThan(0).select(s.mul(e.div(t).pow4().oneMinus().clamp().pow2()),s)})),Ob=({color:e,lightVector:t,cutoffDistance:r,decayExponent:s})=>{const i=t.normalize(),n=t.length(),a=Ub({lightDistance:n,cutoffDistance:r,decayExponent:s});return{lightDirection:i,lightColor:e.mul(a)}};class Gb extends Vb{static get type(){return"PointLightNode"}constructor(e=null){super(e),this.cutoffDistanceNode=Tn(0).setGroup(yn),this.decayExponentNode=Tn(2).setGroup(yn)}update(e){const{light:t}=this;super.update(e),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}setupShadowNode(){return Db(this.light)}setupDirect(e){return Ob({color:this.colorNode,lightVector:this.getLightVector(e),cutoffDistance:this.cutoffDistanceNode,decayExponent:this.decayExponentNode})}}const kb=Vi((([e=t()])=>{const t=e.mul(2),r=t.x.floor(),s=t.y.floor();return r.add(s).mod(2).sign()})),zb=Vi((([e=Uu()],{renderer:t,material:r})=>{const s=$i(1).toVar(),i=wo(e.mul(2).sub(1));if(r.alphaToCoverage&&t.samples>1){const e=$i(i.fwidth()).toVar();s.assign(Po(e.oneMinus(),e.add(1),i).oneMinus())}else i.greaterThan(1).discard();return s})),$b=Vi((([e,t,r])=>{const s=$i(r).toVar(),i=$i(t).toVar(),n=ji(e).toVar();return Go(n,i,s)})).setLayout({name:"mx_select",type:"float",inputs:[{name:"b",type:"bool"},{name:"t",type:"float"},{name:"f",type:"float"}]}),Hb=Vi((([e,t])=>{const r=ji(t).toVar(),s=$i(e).toVar();return Go(r,s.negate(),s)})).setLayout({name:"mx_negate_if",type:"float",inputs:[{name:"val",type:"float"},{name:"b",type:"bool"}]}),Wb=Vi((([e])=>{const t=$i(e).toVar();return Hi(ka(t))})).setLayout({name:"mx_floor",type:"int",inputs:[{name:"x",type:"float"}]}),jb=Vi((([e,t])=>{const r=$i(e).toVar();return t.assign(Wb(r)),r.sub($i(t))})),qb=Ff([Vi((([e,t,r,s,i,n])=>{const a=$i(n).toVar(),o=$i(i).toVar(),u=$i(s).toVar(),l=$i(r).toVar(),d=$i(t).toVar(),c=$i(e).toVar(),h=$i(ia(1,o)).toVar();return ia(1,a).mul(c.mul(h).add(d.mul(o))).add(a.mul(l.mul(h).add(u.mul(o))))})).setLayout({name:"mx_bilerp_0",type:"float",inputs:[{name:"v0",type:"float"},{name:"v1",type:"float"},{name:"v2",type:"float"},{name:"v3",type:"float"},{name:"s",type:"float"},{name:"t",type:"float"}]}),Vi((([e,t,r,s,i,n])=>{const a=$i(n).toVar(),o=$i(i).toVar(),u=Qi(s).toVar(),l=Qi(r).toVar(),d=Qi(t).toVar(),c=Qi(e).toVar(),h=$i(ia(1,o)).toVar();return ia(1,a).mul(c.mul(h).add(d.mul(o))).add(a.mul(l.mul(h).add(u.mul(o))))})).setLayout({name:"mx_bilerp_1",type:"vec3",inputs:[{name:"v0",type:"vec3"},{name:"v1",type:"vec3"},{name:"v2",type:"vec3"},{name:"v3",type:"vec3"},{name:"s",type:"float"},{name:"t",type:"float"}]})]),Xb=Ff([Vi((([e,t,r,s,i,n,a,o,u,l,d])=>{const c=$i(d).toVar(),h=$i(l).toVar(),p=$i(u).toVar(),g=$i(o).toVar(),m=$i(a).toVar(),f=$i(n).toVar(),y=$i(i).toVar(),x=$i(s).toVar(),b=$i(r).toVar(),T=$i(t).toVar(),_=$i(e).toVar(),v=$i(ia(1,p)).toVar(),N=$i(ia(1,h)).toVar();return $i(ia(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(b.mul(v).add(x.mul(p))))).add(c.mul(N.mul(y.mul(v).add(f.mul(p))).add(h.mul(m.mul(v).add(g.mul(p))))))})).setLayout({name:"mx_trilerp_0",type:"float",inputs:[{name:"v0",type:"float"},{name:"v1",type:"float"},{name:"v2",type:"float"},{name:"v3",type:"float"},{name:"v4",type:"float"},{name:"v5",type:"float"},{name:"v6",type:"float"},{name:"v7",type:"float"},{name:"s",type:"float"},{name:"t",type:"float"},{name:"r",type:"float"}]}),Vi((([e,t,r,s,i,n,a,o,u,l,d])=>{const c=$i(d).toVar(),h=$i(l).toVar(),p=$i(u).toVar(),g=Qi(o).toVar(),m=Qi(a).toVar(),f=Qi(n).toVar(),y=Qi(i).toVar(),x=Qi(s).toVar(),b=Qi(r).toVar(),T=Qi(t).toVar(),_=Qi(e).toVar(),v=$i(ia(1,p)).toVar(),N=$i(ia(1,h)).toVar();return $i(ia(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(b.mul(v).add(x.mul(p))))).add(c.mul(N.mul(y.mul(v).add(f.mul(p))).add(h.mul(m.mul(v).add(g.mul(p))))))})).setLayout({name:"mx_trilerp_1",type:"vec3",inputs:[{name:"v0",type:"vec3"},{name:"v1",type:"vec3"},{name:"v2",type:"vec3"},{name:"v3",type:"vec3"},{name:"v4",type:"vec3"},{name:"v5",type:"vec3"},{name:"v6",type:"vec3"},{name:"v7",type:"vec3"},{name:"s",type:"float"},{name:"t",type:"float"},{name:"r",type:"float"}]})]),Kb=Vi((([e,t,r])=>{const s=$i(r).toVar(),i=$i(t).toVar(),n=Wi(e).toVar(),a=Wi(n.bitAnd(Wi(7))).toVar(),o=$i($b(a.lessThan(Wi(4)),i,s)).toVar(),u=$i(na(2,$b(a.lessThan(Wi(4)),s,i))).toVar();return Hb(o,ji(a.bitAnd(Wi(1)))).add(Hb(u,ji(a.bitAnd(Wi(2)))))})).setLayout({name:"mx_gradient_float_0",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"}]}),Yb=Vi((([e,t,r,s])=>{const i=$i(s).toVar(),n=$i(r).toVar(),a=$i(t).toVar(),o=Wi(e).toVar(),u=Wi(o.bitAnd(Wi(15))).toVar(),l=$i($b(u.lessThan(Wi(8)),a,n)).toVar(),d=$i($b(u.lessThan(Wi(4)),n,$b(u.equal(Wi(12)).or(u.equal(Wi(14))),a,i))).toVar();return Hb(l,ji(u.bitAnd(Wi(1)))).add(Hb(d,ji(u.bitAnd(Wi(2)))))})).setLayout({name:"mx_gradient_float_1",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]}),Qb=Ff([Kb,Yb]),Zb=Vi((([e,t,r])=>{const s=$i(r).toVar(),i=$i(t).toVar(),n=Ji(e).toVar();return Qi(Qb(n.x,i,s),Qb(n.y,i,s),Qb(n.z,i,s))})).setLayout({name:"mx_gradient_vec3_0",type:"vec3",inputs:[{name:"hash",type:"uvec3"},{name:"x",type:"float"},{name:"y",type:"float"}]}),Jb=Vi((([e,t,r,s])=>{const i=$i(s).toVar(),n=$i(r).toVar(),a=$i(t).toVar(),o=Ji(e).toVar();return Qi(Qb(o.x,a,n,i),Qb(o.y,a,n,i),Qb(o.z,a,n,i))})).setLayout({name:"mx_gradient_vec3_1",type:"vec3",inputs:[{name:"hash",type:"uvec3"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]}),eT=Ff([Zb,Jb]),tT=Vi((([e])=>{const t=$i(e).toVar();return na(.6616,t)})).setLayout({name:"mx_gradient_scale2d_0",type:"float",inputs:[{name:"v",type:"float"}]}),rT=Vi((([e])=>{const t=$i(e).toVar();return na(.982,t)})).setLayout({name:"mx_gradient_scale3d_0",type:"float",inputs:[{name:"v",type:"float"}]}),sT=Ff([tT,Vi((([e])=>{const t=Qi(e).toVar();return na(.6616,t)})).setLayout({name:"mx_gradient_scale2d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),iT=Ff([rT,Vi((([e])=>{const t=Qi(e).toVar();return na(.982,t)})).setLayout({name:"mx_gradient_scale3d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),nT=Vi((([e,t])=>{const r=Hi(t).toVar(),s=Wi(e).toVar();return s.shiftLeft(r).bitOr(s.shiftRight(Hi(32).sub(r)))})).setLayout({name:"mx_rotl32",type:"uint",inputs:[{name:"x",type:"uint"},{name:"k",type:"int"}]}),aT=Vi((([e,t,r])=>{e.subAssign(r),e.bitXorAssign(nT(r,Hi(4))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(nT(e,Hi(6))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(nT(t,Hi(8))),t.addAssign(e),e.subAssign(r),e.bitXorAssign(nT(r,Hi(16))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(nT(e,Hi(19))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(nT(t,Hi(4))),t.addAssign(e)})),oT=Vi((([e,t,r])=>{const s=Wi(r).toVar(),i=Wi(t).toVar(),n=Wi(e).toVar();return s.bitXorAssign(i),s.subAssign(nT(i,Hi(14))),n.bitXorAssign(s),n.subAssign(nT(s,Hi(11))),i.bitXorAssign(n),i.subAssign(nT(n,Hi(25))),s.bitXorAssign(i),s.subAssign(nT(i,Hi(16))),n.bitXorAssign(s),n.subAssign(nT(s,Hi(4))),i.bitXorAssign(n),i.subAssign(nT(n,Hi(14))),s.bitXorAssign(i),s.subAssign(nT(i,Hi(24))),s})).setLayout({name:"mx_bjfinal",type:"uint",inputs:[{name:"a",type:"uint"},{name:"b",type:"uint"},{name:"c",type:"uint"}]}),uT=Vi((([e])=>{const t=Wi(e).toVar();return $i(t).div($i(Wi(Hi(4294967295))))})).setLayout({name:"mx_bits_to_01",type:"float",inputs:[{name:"bits",type:"uint"}]}),lT=Vi((([e])=>{const t=$i(e).toVar();return t.mul(t).mul(t).mul(t.mul(t.mul(6).sub(15)).add(10))})).setLayout({name:"mx_fade",type:"float",inputs:[{name:"t",type:"float"}]}),dT=Ff([Vi((([e])=>{const t=Hi(e).toVar(),r=Wi(Wi(1)).toVar(),s=Wi(Wi(Hi(3735928559)).add(r.shiftLeft(Wi(2))).add(Wi(13))).toVar();return oT(s.add(Wi(t)),s,s)})).setLayout({name:"mx_hash_int_0",type:"uint",inputs:[{name:"x",type:"int"}]}),Vi((([e,t])=>{const r=Hi(t).toVar(),s=Hi(e).toVar(),i=Wi(Wi(2)).toVar(),n=Wi().toVar(),a=Wi().toVar(),o=Wi().toVar();return n.assign(a.assign(o.assign(Wi(Hi(3735928559)).add(i.shiftLeft(Wi(2))).add(Wi(13))))),n.addAssign(Wi(s)),a.addAssign(Wi(r)),oT(n,a,o)})).setLayout({name:"mx_hash_int_1",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),Vi((([e,t,r])=>{const s=Hi(r).toVar(),i=Hi(t).toVar(),n=Hi(e).toVar(),a=Wi(Wi(3)).toVar(),o=Wi().toVar(),u=Wi().toVar(),l=Wi().toVar();return o.assign(u.assign(l.assign(Wi(Hi(3735928559)).add(a.shiftLeft(Wi(2))).add(Wi(13))))),o.addAssign(Wi(n)),u.addAssign(Wi(i)),l.addAssign(Wi(s)),oT(o,u,l)})).setLayout({name:"mx_hash_int_2",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]}),Vi((([e,t,r,s])=>{const i=Hi(s).toVar(),n=Hi(r).toVar(),a=Hi(t).toVar(),o=Hi(e).toVar(),u=Wi(Wi(4)).toVar(),l=Wi().toVar(),d=Wi().toVar(),c=Wi().toVar();return l.assign(d.assign(c.assign(Wi(Hi(3735928559)).add(u.shiftLeft(Wi(2))).add(Wi(13))))),l.addAssign(Wi(o)),d.addAssign(Wi(a)),c.addAssign(Wi(n)),aT(l,d,c),l.addAssign(Wi(i)),oT(l,d,c)})).setLayout({name:"mx_hash_int_3",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xx",type:"int"}]}),Vi((([e,t,r,s,i])=>{const n=Hi(i).toVar(),a=Hi(s).toVar(),o=Hi(r).toVar(),u=Hi(t).toVar(),l=Hi(e).toVar(),d=Wi(Wi(5)).toVar(),c=Wi().toVar(),h=Wi().toVar(),p=Wi().toVar();return c.assign(h.assign(p.assign(Wi(Hi(3735928559)).add(d.shiftLeft(Wi(2))).add(Wi(13))))),c.addAssign(Wi(l)),h.addAssign(Wi(u)),p.addAssign(Wi(o)),aT(c,h,p),c.addAssign(Wi(a)),h.addAssign(Wi(n)),oT(c,h,p)})).setLayout({name:"mx_hash_int_4",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xx",type:"int"},{name:"yy",type:"int"}]})]),cT=Ff([Vi((([e,t])=>{const r=Hi(t).toVar(),s=Hi(e).toVar(),i=Wi(dT(s,r)).toVar(),n=Ji().toVar();return n.x.assign(i.bitAnd(Hi(255))),n.y.assign(i.shiftRight(Hi(8)).bitAnd(Hi(255))),n.z.assign(i.shiftRight(Hi(16)).bitAnd(Hi(255))),n})).setLayout({name:"mx_hash_vec3_0",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),Vi((([e,t,r])=>{const s=Hi(r).toVar(),i=Hi(t).toVar(),n=Hi(e).toVar(),a=Wi(dT(n,i,s)).toVar(),o=Ji().toVar();return o.x.assign(a.bitAnd(Hi(255))),o.y.assign(a.shiftRight(Hi(8)).bitAnd(Hi(255))),o.z.assign(a.shiftRight(Hi(16)).bitAnd(Hi(255))),o})).setLayout({name:"mx_hash_vec3_1",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]})]),hT=Ff([Vi((([e])=>{const t=qi(e).toVar(),r=Hi().toVar(),s=Hi().toVar(),i=$i(jb(t.x,r)).toVar(),n=$i(jb(t.y,s)).toVar(),a=$i(lT(i)).toVar(),o=$i(lT(n)).toVar(),u=$i(qb(Qb(dT(r,s),i,n),Qb(dT(r.add(Hi(1)),s),i.sub(1),n),Qb(dT(r,s.add(Hi(1))),i,n.sub(1)),Qb(dT(r.add(Hi(1)),s.add(Hi(1))),i.sub(1),n.sub(1)),a,o)).toVar();return sT(u)})).setLayout({name:"mx_perlin_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"}]}),Vi((([e])=>{const t=Qi(e).toVar(),r=Hi().toVar(),s=Hi().toVar(),i=Hi().toVar(),n=$i(jb(t.x,r)).toVar(),a=$i(jb(t.y,s)).toVar(),o=$i(jb(t.z,i)).toVar(),u=$i(lT(n)).toVar(),l=$i(lT(a)).toVar(),d=$i(lT(o)).toVar(),c=$i(Xb(Qb(dT(r,s,i),n,a,o),Qb(dT(r.add(Hi(1)),s,i),n.sub(1),a,o),Qb(dT(r,s.add(Hi(1)),i),n,a.sub(1),o),Qb(dT(r.add(Hi(1)),s.add(Hi(1)),i),n.sub(1),a.sub(1),o),Qb(dT(r,s,i.add(Hi(1))),n,a,o.sub(1)),Qb(dT(r.add(Hi(1)),s,i.add(Hi(1))),n.sub(1),a,o.sub(1)),Qb(dT(r,s.add(Hi(1)),i.add(Hi(1))),n,a.sub(1),o.sub(1)),Qb(dT(r.add(Hi(1)),s.add(Hi(1)),i.add(Hi(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return iT(c)})).setLayout({name:"mx_perlin_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"}]})]),pT=Ff([Vi((([e])=>{const t=qi(e).toVar(),r=Hi().toVar(),s=Hi().toVar(),i=$i(jb(t.x,r)).toVar(),n=$i(jb(t.y,s)).toVar(),a=$i(lT(i)).toVar(),o=$i(lT(n)).toVar(),u=Qi(qb(eT(cT(r,s),i,n),eT(cT(r.add(Hi(1)),s),i.sub(1),n),eT(cT(r,s.add(Hi(1))),i,n.sub(1)),eT(cT(r.add(Hi(1)),s.add(Hi(1))),i.sub(1),n.sub(1)),a,o)).toVar();return sT(u)})).setLayout({name:"mx_perlin_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),Vi((([e])=>{const t=Qi(e).toVar(),r=Hi().toVar(),s=Hi().toVar(),i=Hi().toVar(),n=$i(jb(t.x,r)).toVar(),a=$i(jb(t.y,s)).toVar(),o=$i(jb(t.z,i)).toVar(),u=$i(lT(n)).toVar(),l=$i(lT(a)).toVar(),d=$i(lT(o)).toVar(),c=Qi(Xb(eT(cT(r,s,i),n,a,o),eT(cT(r.add(Hi(1)),s,i),n.sub(1),a,o),eT(cT(r,s.add(Hi(1)),i),n,a.sub(1),o),eT(cT(r.add(Hi(1)),s.add(Hi(1)),i),n.sub(1),a.sub(1),o),eT(cT(r,s,i.add(Hi(1))),n,a,o.sub(1)),eT(cT(r.add(Hi(1)),s,i.add(Hi(1))),n.sub(1),a,o.sub(1)),eT(cT(r,s.add(Hi(1)),i.add(Hi(1))),n,a.sub(1),o.sub(1)),eT(cT(r.add(Hi(1)),s.add(Hi(1)),i.add(Hi(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return iT(c)})).setLayout({name:"mx_perlin_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"}]})]),gT=Ff([Vi((([e])=>{const t=$i(e).toVar(),r=Hi(Wb(t)).toVar();return uT(dT(r))})).setLayout({name:"mx_cell_noise_float_0",type:"float",inputs:[{name:"p",type:"float"}]}),Vi((([e])=>{const t=qi(e).toVar(),r=Hi(Wb(t.x)).toVar(),s=Hi(Wb(t.y)).toVar();return uT(dT(r,s))})).setLayout({name:"mx_cell_noise_float_1",type:"float",inputs:[{name:"p",type:"vec2"}]}),Vi((([e])=>{const t=Qi(e).toVar(),r=Hi(Wb(t.x)).toVar(),s=Hi(Wb(t.y)).toVar(),i=Hi(Wb(t.z)).toVar();return uT(dT(r,s,i))})).setLayout({name:"mx_cell_noise_float_2",type:"float",inputs:[{name:"p",type:"vec3"}]}),Vi((([e])=>{const t=tn(e).toVar(),r=Hi(Wb(t.x)).toVar(),s=Hi(Wb(t.y)).toVar(),i=Hi(Wb(t.z)).toVar(),n=Hi(Wb(t.w)).toVar();return uT(dT(r,s,i,n))})).setLayout({name:"mx_cell_noise_float_3",type:"float",inputs:[{name:"p",type:"vec4"}]})]),mT=Ff([Vi((([e])=>{const t=$i(e).toVar(),r=Hi(Wb(t)).toVar();return Qi(uT(dT(r,Hi(0))),uT(dT(r,Hi(1))),uT(dT(r,Hi(2))))})).setLayout({name:"mx_cell_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"float"}]}),Vi((([e])=>{const t=qi(e).toVar(),r=Hi(Wb(t.x)).toVar(),s=Hi(Wb(t.y)).toVar();return Qi(uT(dT(r,s,Hi(0))),uT(dT(r,s,Hi(1))),uT(dT(r,s,Hi(2))))})).setLayout({name:"mx_cell_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),Vi((([e])=>{const t=Qi(e).toVar(),r=Hi(Wb(t.x)).toVar(),s=Hi(Wb(t.y)).toVar(),i=Hi(Wb(t.z)).toVar();return Qi(uT(dT(r,s,i,Hi(0))),uT(dT(r,s,i,Hi(1))),uT(dT(r,s,i,Hi(2))))})).setLayout({name:"mx_cell_noise_vec3_2",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),Vi((([e])=>{const t=tn(e).toVar(),r=Hi(Wb(t.x)).toVar(),s=Hi(Wb(t.y)).toVar(),i=Hi(Wb(t.z)).toVar(),n=Hi(Wb(t.w)).toVar();return Qi(uT(dT(r,s,i,n,Hi(0))),uT(dT(r,s,i,n,Hi(1))),uT(dT(r,s,i,n,Hi(2))))})).setLayout({name:"mx_cell_noise_vec3_3",type:"vec3",inputs:[{name:"p",type:"vec4"}]})]),fT=Vi((([e,t,r,s])=>{const i=$i(s).toVar(),n=$i(r).toVar(),a=Hi(t).toVar(),o=Qi(e).toVar(),u=$i(0).toVar(),l=$i(1).toVar();return kc(a,(()=>{u.addAssign(l.mul(hT(o))),l.mulAssign(i),o.mulAssign(n)})),u})).setLayout({name:"mx_fractal_noise_float",type:"float",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),yT=Vi((([e,t,r,s])=>{const i=$i(s).toVar(),n=$i(r).toVar(),a=Hi(t).toVar(),o=Qi(e).toVar(),u=Qi(0).toVar(),l=$i(1).toVar();return kc(a,(()=>{u.addAssign(l.mul(pT(o))),l.mulAssign(i),o.mulAssign(n)})),u})).setLayout({name:"mx_fractal_noise_vec3",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),xT=Vi((([e,t,r,s])=>{const i=$i(s).toVar(),n=$i(r).toVar(),a=Hi(t).toVar(),o=Qi(e).toVar();return qi(fT(o,a,n,i),fT(o.add(Qi(Hi(19),Hi(193),Hi(17))),a,n,i))})).setLayout({name:"mx_fractal_noise_vec2",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),bT=Vi((([e,t,r,s])=>{const i=$i(s).toVar(),n=$i(r).toVar(),a=Hi(t).toVar(),o=Qi(e).toVar(),u=Qi(yT(o,a,n,i)).toVar(),l=$i(fT(o.add(Qi(Hi(19),Hi(193),Hi(17))),a,n,i)).toVar();return tn(u,l)})).setLayout({name:"mx_fractal_noise_vec4",type:"vec4",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),TT=Ff([Vi((([e,t,r,s,i,n,a])=>{const o=Hi(a).toVar(),u=$i(n).toVar(),l=Hi(i).toVar(),d=Hi(s).toVar(),c=Hi(r).toVar(),h=Hi(t).toVar(),p=qi(e).toVar(),g=Qi(mT(qi(h.add(d),c.add(l)))).toVar(),m=qi(g.x,g.y).toVar();m.subAssign(.5),m.mulAssign(u),m.addAssign(.5);const f=qi(qi($i(h),$i(c)).add(m)).toVar(),y=qi(f.sub(p)).toVar();return Gi(o.equal(Hi(2)),(()=>Qa(y.x).add(Qa(y.y)))),Gi(o.equal(Hi(3)),(()=>po(Qa(y.x),Qa(y.y)))),xo(y,y)})).setLayout({name:"mx_worley_distance_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"x",type:"int"},{name:"y",type:"int"},{name:"xoff",type:"int"},{name:"yoff",type:"int"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Vi((([e,t,r,s,i,n,a,o,u])=>{const l=Hi(u).toVar(),d=$i(o).toVar(),c=Hi(a).toVar(),h=Hi(n).toVar(),p=Hi(i).toVar(),g=Hi(s).toVar(),m=Hi(r).toVar(),f=Hi(t).toVar(),y=Qi(e).toVar(),x=Qi(mT(Qi(f.add(p),m.add(h),g.add(c)))).toVar();x.subAssign(.5),x.mulAssign(d),x.addAssign(.5);const b=Qi(Qi($i(f),$i(m),$i(g)).add(x)).toVar(),T=Qi(b.sub(y)).toVar();return Gi(l.equal(Hi(2)),(()=>Qa(T.x).add(Qa(T.y)).add(Qa(T.z)))),Gi(l.equal(Hi(3)),(()=>po(po(Qa(T.x),Qa(T.y)),Qa(T.z)))),xo(T,T)})).setLayout({name:"mx_worley_distance_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xoff",type:"int"},{name:"yoff",type:"int"},{name:"zoff",type:"int"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),_T=Vi((([e,t,r])=>{const s=Hi(r).toVar(),i=$i(t).toVar(),n=qi(e).toVar(),a=Hi().toVar(),o=Hi().toVar(),u=qi(jb(n.x,a),jb(n.y,o)).toVar(),l=$i(1e6).toVar();return kc({start:-1,end:Hi(1),name:"x",condition:"<="},(({x:e})=>{kc({start:-1,end:Hi(1),name:"y",condition:"<="},(({y:t})=>{const r=$i(TT(u,e,t,a,o,i,s)).toVar();l.assign(ho(l,r))}))})),Gi(s.equal(Hi(0)),(()=>{l.assign(Oa(l))})),l})).setLayout({name:"mx_worley_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),vT=Vi((([e,t,r])=>{const s=Hi(r).toVar(),i=$i(t).toVar(),n=qi(e).toVar(),a=Hi().toVar(),o=Hi().toVar(),u=qi(jb(n.x,a),jb(n.y,o)).toVar(),l=qi(1e6,1e6).toVar();return kc({start:-1,end:Hi(1),name:"x",condition:"<="},(({x:e})=>{kc({start:-1,end:Hi(1),name:"y",condition:"<="},(({y:t})=>{const r=$i(TT(u,e,t,a,o,i,s)).toVar();Gi(r.lessThan(l.x),(()=>{l.y.assign(l.x),l.x.assign(r)})).ElseIf(r.lessThan(l.y),(()=>{l.y.assign(r)}))}))})),Gi(s.equal(Hi(0)),(()=>{l.assign(Oa(l))})),l})).setLayout({name:"mx_worley_noise_vec2_0",type:"vec2",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),NT=Vi((([e,t,r])=>{const s=Hi(r).toVar(),i=$i(t).toVar(),n=qi(e).toVar(),a=Hi().toVar(),o=Hi().toVar(),u=qi(jb(n.x,a),jb(n.y,o)).toVar(),l=Qi(1e6,1e6,1e6).toVar();return kc({start:-1,end:Hi(1),name:"x",condition:"<="},(({x:e})=>{kc({start:-1,end:Hi(1),name:"y",condition:"<="},(({y:t})=>{const r=$i(TT(u,e,t,a,o,i,s)).toVar();Gi(r.lessThan(l.x),(()=>{l.z.assign(l.y),l.y.assign(l.x),l.x.assign(r)})).ElseIf(r.lessThan(l.y),(()=>{l.z.assign(l.y),l.y.assign(r)})).ElseIf(r.lessThan(l.z),(()=>{l.z.assign(r)}))}))})),Gi(s.equal(Hi(0)),(()=>{l.assign(Oa(l))})),l})).setLayout({name:"mx_worley_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),ST=Ff([_T,Vi((([e,t,r])=>{const s=Hi(r).toVar(),i=$i(t).toVar(),n=Qi(e).toVar(),a=Hi().toVar(),o=Hi().toVar(),u=Hi().toVar(),l=Qi(jb(n.x,a),jb(n.y,o),jb(n.z,u)).toVar(),d=$i(1e6).toVar();return kc({start:-1,end:Hi(1),name:"x",condition:"<="},(({x:e})=>{kc({start:-1,end:Hi(1),name:"y",condition:"<="},(({y:t})=>{kc({start:-1,end:Hi(1),name:"z",condition:"<="},(({z:r})=>{const n=$i(TT(l,e,t,r,a,o,u,i,s)).toVar();d.assign(ho(d,n))}))}))})),Gi(s.equal(Hi(0)),(()=>{d.assign(Oa(d))})),d})).setLayout({name:"mx_worley_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),ET=Ff([vT,Vi((([e,t,r])=>{const s=Hi(r).toVar(),i=$i(t).toVar(),n=Qi(e).toVar(),a=Hi().toVar(),o=Hi().toVar(),u=Hi().toVar(),l=Qi(jb(n.x,a),jb(n.y,o),jb(n.z,u)).toVar(),d=qi(1e6,1e6).toVar();return kc({start:-1,end:Hi(1),name:"x",condition:"<="},(({x:e})=>{kc({start:-1,end:Hi(1),name:"y",condition:"<="},(({y:t})=>{kc({start:-1,end:Hi(1),name:"z",condition:"<="},(({z:r})=>{const n=$i(TT(l,e,t,r,a,o,u,i,s)).toVar();Gi(n.lessThan(d.x),(()=>{d.y.assign(d.x),d.x.assign(n)})).ElseIf(n.lessThan(d.y),(()=>{d.y.assign(n)}))}))}))})),Gi(s.equal(Hi(0)),(()=>{d.assign(Oa(d))})),d})).setLayout({name:"mx_worley_noise_vec2_1",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),wT=Ff([NT,Vi((([e,t,r])=>{const s=Hi(r).toVar(),i=$i(t).toVar(),n=Qi(e).toVar(),a=Hi().toVar(),o=Hi().toVar(),u=Hi().toVar(),l=Qi(jb(n.x,a),jb(n.y,o),jb(n.z,u)).toVar(),d=Qi(1e6,1e6,1e6).toVar();return kc({start:-1,end:Hi(1),name:"x",condition:"<="},(({x:e})=>{kc({start:-1,end:Hi(1),name:"y",condition:"<="},(({y:t})=>{kc({start:-1,end:Hi(1),name:"z",condition:"<="},(({z:r})=>{const n=$i(TT(l,e,t,r,a,o,u,i,s)).toVar();Gi(n.lessThan(d.x),(()=>{d.z.assign(d.y),d.y.assign(d.x),d.x.assign(n)})).ElseIf(n.lessThan(d.y),(()=>{d.z.assign(d.y),d.y.assign(n)})).ElseIf(n.lessThan(d.z),(()=>{d.z.assign(n)}))}))}))})),Gi(s.equal(Hi(0)),(()=>{d.assign(Oa(d))})),d})).setLayout({name:"mx_worley_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),AT=Vi((([e])=>{const t=e.y,r=e.z,s=Qi().toVar();return Gi(t.lessThan(1e-4),(()=>{s.assign(Qi(r,r,r))})).Else((()=>{let i=e.x;i=i.sub(ka(i)).mul(6).toVar();const n=Hi(ao(i)),a=i.sub($i(n)),o=r.mul(t.oneMinus()),u=r.mul(t.mul(a).oneMinus()),l=r.mul(t.mul(a.oneMinus()).oneMinus());Gi(n.equal(Hi(0)),(()=>{s.assign(Qi(r,l,o))})).ElseIf(n.equal(Hi(1)),(()=>{s.assign(Qi(u,r,o))})).ElseIf(n.equal(Hi(2)),(()=>{s.assign(Qi(o,r,l))})).ElseIf(n.equal(Hi(3)),(()=>{s.assign(Qi(o,u,r))})).ElseIf(n.equal(Hi(4)),(()=>{s.assign(Qi(l,o,r))})).Else((()=>{s.assign(Qi(r,o,u))}))})),s})).setLayout({name:"mx_hsvtorgb",type:"vec3",inputs:[{name:"hsv",type:"vec3"}]}),RT=Vi((([e])=>{const t=Qi(e).toVar(),r=$i(t.x).toVar(),s=$i(t.y).toVar(),i=$i(t.z).toVar(),n=$i(ho(r,ho(s,i))).toVar(),a=$i(po(r,po(s,i))).toVar(),o=$i(a.sub(n)).toVar(),u=$i().toVar(),l=$i().toVar(),d=$i().toVar();return d.assign(a),Gi(a.greaterThan(0),(()=>{l.assign(o.div(a))})).Else((()=>{l.assign(0)})),Gi(l.lessThanEqual(0),(()=>{u.assign(0)})).Else((()=>{Gi(r.greaterThanEqual(a),(()=>{u.assign(s.sub(i).div(o))})).ElseIf(s.greaterThanEqual(a),(()=>{u.assign(sa(2,i.sub(r).div(o)))})).Else((()=>{u.assign(sa(4,r.sub(s).div(o)))})),u.mulAssign(1/6),Gi(u.lessThan(0),(()=>{u.addAssign(1)}))})),Qi(u,l,d)})).setLayout({name:"mx_rgbtohsv",type:"vec3",inputs:[{name:"c",type:"vec3"}]}),CT=Vi((([e])=>{const t=Qi(e).toVar(),r=en(ca(t,Qi(.04045))).toVar(),s=Qi(t.div(12.92)).toVar(),i=Qi(To(po(t.add(Qi(.055)),Qi(0)).div(1.055),Qi(2.4))).toVar();return Ao(s,i,r)})).setLayout({name:"mx_srgb_texture_to_lin_rec709",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),MT=(e,t)=>{e=$i(e),t=$i(t);const r=qi(t.dFdx(),t.dFdy()).length().mul(.7071067811865476);return Po(e.sub(r),e.add(r),t)},PT=(e,t,r,s)=>Ao(e,t,r[s].clamp()),LT=(e,t,r,s,i)=>Ao(e,t,MT(r,s[i])),FT=Vi((([e,t,r])=>{const s=$a(e).toVar(),i=ia($i(.5).mul(t.sub(r)),Ml).div(s).toVar(),n=ia($i(-.5).mul(t.sub(r)),Ml).div(s).toVar(),a=Qi().toVar();a.x=s.x.greaterThan($i(0)).select(i.x,n.x),a.y=s.y.greaterThan($i(0)).select(i.y,n.y),a.z=s.z.greaterThan($i(0)).select(i.z,n.z);const o=ho(ho(a.x,a.y),a.z).toVar();return Ml.add(s.mul(o)).toVar().sub(r)})),BT=Vi((([e,t])=>{const r=e.x,s=e.y,i=e.z;let n=t.element(0).mul(.886227);return n=n.add(t.element(1).mul(1.023328).mul(s)),n=n.add(t.element(2).mul(1.023328).mul(i)),n=n.add(t.element(3).mul(1.023328).mul(r)),n=n.add(t.element(4).mul(.858086).mul(r).mul(s)),n=n.add(t.element(5).mul(.858086).mul(s).mul(i)),n=n.add(t.element(6).mul(i.mul(i).mul(.743125).sub(.247708))),n=n.add(t.element(7).mul(.858086).mul(r).mul(i)),n=n.add(t.element(8).mul(.429043).mul(na(r,r).sub(na(s,s)))),n}));var IT=Object.freeze({__proto__:null,BRDF_GGX:vp,BRDF_Lambert:op,BasicPointShadowFilter:Cb,BasicShadowFilter:fb,Break:zc,Const:Xo,Continue:()=>Mu("continue").append(),DFGApprox:Np,D_GGX:bp,Discard:Pu,EPSILON:Aa,F_Schlick:ap,Fn:Vi,INFINITY:Ra,If:Gi,Loop:kc,NodeAccess:Vs,NodeShaderStage:Bs,NodeType:Ds,NodeUpdateType:Is,PCFShadowFilter:yb,PCFSoftShadowFilter:xb,PI:Ca,PI2:Ma,PointShadowFilter:Mb,Return:()=>Mu("return").append(),Schlick_to_F0:Ep,ScriptableNodeResources:_x,ShaderNode:Mi,TBNViewMatrix:Nd,VSMShadowFilter:bb,V_GGX_SmithCorrelated:yp,Var:qo,abs:Qa,acesFilmicToneMapping:ox,acos:Ka,add:sa,addMethodChaining:ii,addNodeElement:function(e){console.warn("THREE.TSL: AddNodeElement has been removed in favor of tree-shaking. Trying add",e)},agxToneMapping:cx,all:Pa,alphaT:In,and:ga,anisotropy:Dn,anisotropyB:Un,anisotropyT:Vn,any:La,append:ki,array:hn,arrayBuffer:e=>Pi(new ei(e,"ArrayBuffer")),asin:Xa,assign:Jn,atan:Ya,atan2:Do,atomicAdd:(e,t)=>Hx(zx.ATOMIC_ADD,e,t),atomicAnd:(e,t)=>Hx(zx.ATOMIC_AND,e,t),atomicFunc:Hx,atomicLoad:e=>Hx(zx.ATOMIC_LOAD,e,null),atomicMax:(e,t)=>Hx(zx.ATOMIC_MAX,e,t),atomicMin:(e,t)=>Hx(zx.ATOMIC_MIN,e,t),atomicOr:(e,t)=>Hx(zx.ATOMIC_OR,e,t),atomicStore:(e,t)=>Hx(zx.ATOMIC_STORE,e,t),atomicSub:(e,t)=>Hx(zx.ATOMIC_SUB,e,t),atomicXor:(e,t)=>Hx(zx.ATOMIC_XOR,e,t),attenuationColor:Yn,attenuationDistance:Kn,attribute:Vu,attributeArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=ws("float")):(r=As(t),s=ws(t));const i=new xy(e,r,s);return Dc(i,t,e)},backgroundBlurriness:Ey,backgroundIntensity:wy,backgroundRotation:Ay,batch:Lc,billboarding:Of,bitAnd:xa,bitNot:ba,bitOr:Ta,bitXor:_a,bitangentGeometry:yd,bitangentLocal:xd,bitangentView:bd,bitangentWorld:Td,bitcast:lo,blendBurn:Oy,blendColor:$y,blendDodge:Gy,blendOverlay:zy,blendScreen:ky,blur:Sg,bool:ji,buffer:qu,bufferAttribute:fu,bumpMap:Ld,burn:(...e)=>(console.warn('THREE.TSL: "burn" has been renamed. Use "blendBurn" instead.'),Oy(e)),bvec2:Yi,bvec3:en,bvec4:nn,bypass:Eu,cache:Nu,call:ta,cameraFar:Ju,cameraIndex:Qu,cameraNear:Zu,cameraNormalMatrix:il,cameraPosition:nl,cameraProjectionMatrix:el,cameraProjectionMatrixInverse:tl,cameraViewMatrix:rl,cameraWorldMatrix:sl,cbrt:Eo,cdl:Ky,ceil:za,checker:kb,cineonToneMapping:nx,clamp:Ro,clearcoat:Rn,clearcoatRoughness:Cn,code:gx,color:zi,colorSpaceToWorking:ou,colorToDirection:e=>Pi(e).mul(2).sub(1),compute:_u,computeSkinning:(e,t=null)=>{const r=new Uc(e);return r.positionNode=Dc(new M(e.geometry.getAttribute("position").array,3),"vec3").setPBO(!0).toReadOnly().element(vc).toVar(),r.skinIndexNode=Dc(new M(new Uint32Array(e.geometry.getAttribute("skinIndex").array),4),"uvec4").setPBO(!0).toReadOnly().element(vc).toVar(),r.skinWeightNode=Dc(new M(e.geometry.getAttribute("skinWeight").array,4),"vec4").setPBO(!0).toReadOnly().element(vc).toVar(),r.bindMatrixNode=Tn(e.bindMatrix,"mat4"),r.bindMatrixInverseNode=Tn(e.bindMatrixInverse,"mat4"),r.boneMatricesNode=qu(e.skeleton.boneMatrices,"mat4",e.skeleton.bones.length),r.toPositionNode=t,Pi(r)},cond:ko,context:$o,convert:dn,convertColorSpace:(e,t,r)=>Pi(new su(Pi(e),t,r)),convertToTexture:(e,...t)=>e.isTextureNode?e:e.isPassNode?e.getTextureNode():py(e,...t),cos:ja,cross:bo,cubeTexture:sd,cubeToUV:Rb,dFdx:ro,dFdy:so,dashSize:$n,debug:Iu,defaultBuildStages:Os,defaultShaderStages:Us,defined:Ri,degrees:Ba,deltaTime:If,densityFog:function(e,t){return console.warn('THREE.TSL: "densityFog( color, density )" is deprecated. Use "fog( color, densityFogFactor( density ) )" instead.'),Ax(e,wx(t))},densityFogFactor:wx,depth:Eh,depthPass:(e,t,r)=>Pi(new tx(tx.DEPTH,e,t,r)),difference:yo,diffuseColor:Sn,directPointLight:Ob,directionToColor:$h,dispersion:Qn,distance:fo,div:aa,dodge:(...e)=>(console.warn('THREE.TSL: "dodge" has been renamed. Use "blendDodge" instead.'),Gy(e)),dot:xo,drawIndex:wc,dynamicBufferAttribute:yu,element:ln,emissive:En,equal:ua,equals:co,equirectUV:qh,exp:Ia,exp2:Da,expression:Mu,faceDirection:Dl,faceForward:Lo,faceforward:Vo,float:$i,floor:ka,fog:Ax,fract:Ha,frameGroup:fn,frameId:Df,frontFacing:Il,fwidth:oo,gain:(e,t)=>e.lessThan(.5)?Af(e.mul(2),t).div(2):ia(1,Af(na(ia(1,e),2),t).div(2)),gapSize:Hn,getConstNodeType:Ci,getCurrentStack:Oi,getDirection:Tg,getDistanceAttenuation:Ub,getGeometryRoughness:mp,getNormalFromDepth:fy,getParallaxCorrectNormal:FT,getRoughness:fp,getScreenPosition:my,getShIrradianceAt:BT,getTextureIndex:Nf,getViewPosition:gy,globalId:Dx,glsl:(e,t)=>gx(e,t,"glsl"),glslFn:(e,t)=>fx(e,t,"glsl"),grayscale:Hy,greaterThan:ca,greaterThanEqual:pa,hash:wf,highpModelNormalViewMatrix:wl,highpModelViewMatrix:El,hue:qy,instance:Rc,instanceIndex:vc,instancedArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=ws("float")):(r=As(t),s=ws(t));const i=new yy(e,r,s);return Dc(i,t,e)},instancedBufferAttribute:xu,instancedDynamicBufferAttribute:bu,instancedMesh:Mc,int:Hi,inverseSqrt:Ga,inversesqrt:Uo,invocationLocalIndex:Ec,invocationSubgroupIndex:Sc,ior:jn,iridescence:Ln,iridescenceIOR:Fn,iridescenceThickness:Bn,ivec2:Xi,ivec3:Zi,ivec4:rn,js:(e,t)=>gx(e,t,"js"),label:Ho,length:Ja,lengthSq:wo,lessThan:da,lessThanEqual:ha,lightPosition:Kx,lightProjectionUV:Xx,lightShadowMatrix:qx,lightTargetDirection:Zx,lightTargetPosition:Yx,lightViewPosition:Qx,lightingContext:Qc,lights:(e=[])=>Pi(new tb).setLights(e),linearDepth:wh,linearToneMapping:sx,localId:Vx,log:Va,log2:Ua,logarithmicDepthToViewZ:(e,t,r)=>{const s=e.mul(Va(r.div(t)));return $i(Math.E).pow(s).mul(t).negate()},loop:(...e)=>(console.warn("THREE.TSL: loop() has been renamed to Loop()."),kc(...e)),luminance:Xy,mat2:an,mat3:on,mat4:un,matcapUV:hm,materialAO:yc,materialAlphaTest:Id,materialAnisotropy:ec,materialAnisotropyVector:xc,materialAttenuationColor:uc,materialAttenuationDistance:oc,materialClearcoat:Xd,materialClearcoatNormal:Yd,materialClearcoatRoughness:Kd,materialColor:Dd,materialDispersion:mc,materialEmissive:Ud,materialEnvIntensity:Yl,materialEnvRotation:Ql,materialIOR:ac,materialIridescence:tc,materialIridescenceIOR:rc,materialIridescenceThickness:sc,materialLightMap:fc,materialLineDashOffset:pc,materialLineDashSize:dc,materialLineGapSize:cc,materialLineScale:lc,materialLineWidth:hc,materialMetalness:jd,materialNormal:qd,materialOpacity:Od,materialPointSize:gc,materialReference:ld,materialReflectivity:Hd,materialRefractionRatio:Kl,materialRotation:Qd,materialRoughness:Wd,materialSheen:Zd,materialSheenRoughness:Jd,materialShininess:Vd,materialSpecular:Gd,materialSpecularColor:zd,materialSpecularIntensity:kd,materialSpecularStrength:$d,materialThickness:nc,materialTransmission:ic,max:po,maxMipLevel:zu,mediumpModelViewMatrix:Sl,metalness:An,min:ho,mix:Ao,mixElement:Bo,mod:oa,modInt:Ea,modelDirection:ml,modelNormalMatrix:_l,modelPosition:yl,modelRadius:Tl,modelScale:xl,modelViewMatrix:Nl,modelViewPosition:bl,modelViewProjection:bc,modelWorldMatrix:fl,modelWorldMatrixInverse:vl,morphReference:qc,mrt:Ef,mul:na,mx_aastep:MT,mx_cell_noise_float:(e=Uu())=>gT(e.convert("vec2|vec3")),mx_contrast:(e,t=1,r=.5)=>$i(e).sub(r).mul(t).add(r),mx_fractal_noise_float:(e=Uu(),t=3,r=2,s=.5,i=1)=>fT(e,Hi(t),r,s).mul(i),mx_fractal_noise_vec2:(e=Uu(),t=3,r=2,s=.5,i=1)=>xT(e,Hi(t),r,s).mul(i),mx_fractal_noise_vec3:(e=Uu(),t=3,r=2,s=.5,i=1)=>yT(e,Hi(t),r,s).mul(i),mx_fractal_noise_vec4:(e=Uu(),t=3,r=2,s=.5,i=1)=>bT(e,Hi(t),r,s).mul(i),mx_hsvtorgb:AT,mx_noise_float:(e=Uu(),t=1,r=0)=>hT(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec3:(e=Uu(),t=1,r=0)=>pT(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec4:(e=Uu(),t=1,r=0)=>{e=e.convert("vec2|vec3");return tn(pT(e),hT(e.add(qi(19,73)))).mul(t).add(r)},mx_ramplr:(e,t,r=Uu())=>PT(e,t,r,"x"),mx_ramptb:(e,t,r=Uu())=>PT(e,t,r,"y"),mx_rgbtohsv:RT,mx_safepower:(e,t=1)=>(e=$i(e)).abs().pow(t).mul(e.sign()),mx_splitlr:(e,t,r,s=Uu())=>LT(e,t,r,s,"x"),mx_splittb:(e,t,r,s=Uu())=>LT(e,t,r,s,"y"),mx_srgb_texture_to_lin_rec709:CT,mx_transform_uv:(e=1,t=0,r=Uu())=>r.mul(e).add(t),mx_worley_noise_float:(e=Uu(),t=1)=>ST(e.convert("vec2|vec3"),t,Hi(1)),mx_worley_noise_vec2:(e=Uu(),t=1)=>ET(e.convert("vec2|vec3"),t,Hi(1)),mx_worley_noise_vec3:(e=Uu(),t=1)=>wT(e.convert("vec2|vec3"),t,Hi(1)),negate:eo,neutralToneMapping:hx,nodeArray:Fi,nodeImmutable:Ii,nodeObject:Pi,nodeObjects:Li,nodeProxy:Bi,normalFlat:Ol,normalGeometry:Vl,normalLocal:Ul,normalMap:Rd,normalView:Gl,normalWorld:kl,normalize:$a,not:fa,notEqual:la,numWorkgroups:Bx,objectDirection:ul,objectGroup:xn,objectPosition:dl,objectRadius:pl,objectScale:cl,objectViewPosition:hl,objectWorldMatrix:ll,oneMinus:to,or:ma,orthographicDepthToViewZ:(e,t,r)=>t.sub(r).mul(e).sub(t),oscSawtooth:(e=Bf)=>e.fract(),oscSine:(e=Bf)=>e.add(.75).mul(2*Math.PI).sin().mul(.5).add(.5),oscSquare:(e=Bf)=>e.fract().round(),oscTriangle:(e=Bf)=>e.add(.5).fract().mul(2).sub(1).abs(),output:zn,outputStruct:vf,overlay:(...e)=>(console.warn('THREE.TSL: "overlay" has been renamed. Use "blendOverlay" instead.'),zy(e)),overloadingFn:Ff,parabola:Af,parallaxDirection:Sd,parallaxUV:(e,t)=>e.sub(Sd.mul(t)),parameter:(e,t)=>Pi(new ff(e,t)),pass:(e,t,r)=>Pi(new tx(tx.COLOR,e,t,r)),passTexture:(e,t)=>Pi(new Jy(e,t)),pcurve:(e,t,r)=>To(aa(To(e,t),sa(To(e,t),To(ia(1,e),r))),1/t),perspectiveDepthToViewZ:vh,pmremTexture:Yg,pointShadow:Db,pointUV:_y,pointWidth:Wn,positionGeometry:Al,positionLocal:Rl,positionPrevious:Cl,positionView:Ll,positionViewDirection:Fl,positionWorld:Ml,positionWorldDirection:Pl,posterize:Qy,pow:To,pow2:_o,pow3:vo,pow4:No,property:vn,radians:Fa,rand:Fo,range:Px,rangeFog:function(e,t,r){return console.warn('THREE.TSL: "rangeFog( color, near, far )" is deprecated. Use "fog( color, rangeFogFactor( near, far ) )" instead.'),Ax(e,Ex(t,r))},rangeFogFactor:Ex,reciprocal:no,reference:ad,referenceBuffer:od,reflect:mo,reflectVector:ed,reflectView:Zl,reflector:e=>Pi(new ny(e)),refract:Mo,refractVector:td,refractView:Jl,reinhardToneMapping:ix,remainder:Sa,remap:Au,remapClamp:Ru,renderGroup:yn,renderOutput:Fu,rendererReference:cu,rotate:fm,rotateUV:Vf,roughness:wn,round:io,rtt:py,sRGBTransferEOTF:Jo,sRGBTransferOETF:eu,sampler:e=>(!0===e.isNode?e:Hu(e)).convert("sampler"),samplerComparison:e=>(!0===e.isNode?e:Hu(e)).convert("samplerComparison"),saturate:Co,saturation:Wy,screen:(...e)=>(console.warn('THREE.TSL: "screen" has been renamed. Use "blendScreen" instead.'),ky(e)),screenCoordinate:ih,screenSize:sh,screenUV:rh,scriptable:Nx,scriptableValue:xx,select:Go,setCurrentStack:Ui,shaderStages:Gs,shadow:wb,shadowPositionWorld:sb,shapeCircle:zb,sharedUniformGroup:mn,sheen:Mn,sheenRoughness:Pn,shiftLeft:va,shiftRight:Na,shininess:kn,sign:Za,sin:Wa,sinc:(e,t)=>Wa(Ca.mul(t.mul(e).sub(1))).div(Ca.mul(t.mul(e).sub(1))),skinning:Oc,smoothstep:Po,smoothstepElement:Io,specularColor:On,specularF90:Gn,spherizeUV:Uf,split:(e,t)=>Pi(new Ks(Pi(e),t)),spritesheetUV:zf,sqrt:Oa,stack:xf,step:go,storage:Dc,storageBarrier:()=>Ox("storage").append(),storageObject:(e,t,r)=>(console.warn('THREE.TSL: "storageObject()" is deprecated. Use "storage().setPBO( true )" instead.'),Dc(e,t,r).setPBO(!0)),storageTexture:Cy,string:(e="")=>Pi(new ei(e,"string")),struct:(e,t=null)=>{const r=new bf(e,t),s=(...t)=>{let s=null;if(t.length>0)if(t[0].isNode){s={};const r=Object.keys(e);for(let e=0;eOx("texture").append(),textureBicubic:Hp,textureCubeUV:_g,textureLoad:Wu,textureSize:Gu,textureStore:(e,t,r)=>{const s=Cy(e,t,r);return null!==r&&s.append(),s},thickness:Xn,time:Bf,timerDelta:(e=1)=>(console.warn('TSL: timerDelta() is deprecated. Use "deltaTime" instead.'),If.mul(e)),timerGlobal:(e=1)=>(console.warn('TSL: timerGlobal() is deprecated. Use "time" instead.'),Bf.mul(e)),timerLocal:(e=1)=>(console.warn('TSL: timerLocal() is deprecated. Use "time" instead.'),Bf.mul(e)),toOutputColorSpace:iu,toWorkingColorSpace:nu,toneMapping:pu,toneMappingExposure:gu,toonOutlinePass:(t,r,s=new e(0,0,0),i=.003,n=1)=>Pi(new rx(t,r,Pi(s),Pi(i),Pi(n))),transformDirection:So,transformNormal:Wl,transformNormalToView:jl,transformedBentNormalView:Ed,transformedBitangentView:_d,transformedBitangentWorld:vd,transformedClearcoatNormalView:Hl,transformedNormalView:zl,transformedNormalWorld:$l,transformedTangentView:gd,transformedTangentWorld:md,transmission:qn,transpose:uo,triNoise3D:Mf,triplanarTexture:(...e)=>Hf(...e),triplanarTextures:Hf,trunc:ao,tslFn:(...e)=>(console.warn("THREE.TSL: tslFn() has been renamed to Fn()."),Vi(...e)),uint:Wi,uniform:Tn,uniformArray:Yu,uniformGroup:gn,uniforms:(e,t)=>(console.warn("THREE.TSL: uniforms() has been renamed to uniformArray()."),Pi(new Ku(e,t))),userData:(e,t,r)=>Pi(new Fy(e,t,r)),uv:Uu,uvec2:Ki,uvec3:Ji,uvec4:sn,varying:Qo,varyingProperty:Nn,vec2:qi,vec3:Qi,vec4:tn,vectorComponents:ks,velocity:Uy,vertexColor:e=>Pi(new by(e)),vertexIndex:_c,vertexStage:Zo,vibrance:jy,viewZToLogarithmicDepth:Nh,viewZToOrthographicDepth:Th,viewZToPerspectiveDepth:_h,viewport:nh,viewportBottomLeft:ch,viewportCoordinate:oh,viewportDepthTexture:xh,viewportLinearDepth:Ah,viewportMipTexture:mh,viewportResolution:lh,viewportSafeUV:Gf,viewportSharedTexture:Gh,viewportSize:ah,viewportTexture:gh,viewportTopLeft:dh,viewportUV:uh,wgsl:(e,t)=>gx(e,t,"wgsl"),wgslFn:(e,t)=>fx(e,t,"wgsl"),workgroupArray:(e,t)=>Pi(new kx("Workgroup",e,t)),workgroupBarrier:()=>Ox("workgroup").append(),workgroupId:Ix,workingToColorSpace:au,xor:ya});const DT=new mf;class VT extends Im{constructor(e,t){super(),this.renderer=e,this.nodes=t}update(e,t,r){const s=this.renderer,i=this.nodes.getBackgroundNode(e)||e.background;let n=!1;if(null===i)s._clearColor.getRGB(DT),DT.a=s._clearColor.a;else if(!0===i.isColor)i.getRGB(DT),DT.a=1,n=!0;else if(!0===i.isNode){const r=this.get(e),n=i;DT.copy(s._clearColor);let a=r.backgroundMesh;if(void 0===a){const e=$o(tn(n).mul(wy),{getUV:()=>Ay.mul(kl),getTextureLevel:()=>Ey});let t=bc;t=t.setZ(t.w);const s=new Fh;s.name="Background.material",s.side=N,s.depthTest=!1,s.depthWrite=!1,s.allowOverride=!1,s.fog=!1,s.lights=!1,s.vertexNode=t,s.colorNode=e,r.backgroundMeshNode=e,r.backgroundMesh=a=new W(new Oe(1,32,32),s),a.frustumCulled=!1,a.name="Background.mesh",a.onBeforeRender=function(e,t,r){this.matrixWorld.copyPosition(r.matrixWorld)}}const o=n.getCacheKey();r.backgroundCacheKey!==o&&(r.backgroundMeshNode.node=tn(n).mul(wy),r.backgroundMeshNode.needsUpdate=!0,a.material.needsUpdate=!0,r.backgroundCacheKey=o),t.unshift(a,a.geometry,a.material,0,0,null,null)}else console.error("THREE.Renderer: Unsupported background configuration.",i);const a=s.xr.getEnvironmentBlendMode();if("additive"===a?DT.set(0,0,0,1):"alpha-blend"===a&&DT.set(0,0,0,0),!0===s.autoClear||!0===n){const e=r.clearColorValue;e.r=DT.r,e.g=DT.g,e.b=DT.b,e.a=DT.a,!0!==s.backend.isWebGLBackend&&!0!==s.alpha||(e.r*=e.a,e.g*=e.a,e.b*=e.a),r.depthClearValue=s._clearDepth,r.stencilClearValue=s._clearStencil,r.clearColor=!0===s.autoClearColor,r.clearDepth=!0===s.autoClearDepth,r.clearStencil=!0===s.autoClearStencil}else r.clearColor=!1,r.clearDepth=!1,r.clearStencil=!1}}let UT=0;class OT{constructor(e="",t=[],r=0,s=[]){this.name=e,this.bindings=t,this.index=r,this.bindingsReference=s,this.id=UT++}}class GT{constructor(e,t,r,s,i,n,a,o,u,l=[]){this.vertexShader=e,this.fragmentShader=t,this.computeShader=r,this.transforms=l,this.nodeAttributes=s,this.bindings=i,this.updateNodes=n,this.updateBeforeNodes=a,this.updateAfterNodes=o,this.observer=u,this.usedTimes=0}createBindings(){const e=[];for(const t of this.bindings){if(!0!==t.bindings[0].groupNode.shared){const r=new OT(t.name,[],t.index,t);e.push(r);for(const e of t.bindings)r.bindings.push(e.clone())}else e.push(t)}return e}}class kT{constructor(e,t,r=null){this.isNodeAttribute=!0,this.name=e,this.type=t,this.node=r}}class zT{constructor(e,t,r){this.isNodeUniform=!0,this.name=e,this.type=t,this.node=r.getSelf()}get value(){return this.node.value}set value(e){this.node.value=e}get id(){return this.node.id}get groupNode(){return this.node.groupNode}}class $T{constructor(e,t,r=!1,s=null){this.isNodeVar=!0,this.name=e,this.type=t,this.readOnly=r,this.count=s}}class HT extends $T{constructor(e,t){super(e,t),this.needsInterpolation=!1,this.isNodeVarying=!0}}class WT{constructor(e,t,r=""){this.name=e,this.type=t,this.code=r,Object.defineProperty(this,"isNodeCode",{value:!0})}}let jT=0;class qT{constructor(e=null){this.id=jT++,this.nodesData=new WeakMap,this.parent=e}getData(e){let t=this.nodesData.get(e);return void 0===t&&null!==this.parent&&(t=this.parent.getData(e)),t}setData(e,t){this.nodesData.set(e,t)}}class XT{constructor(e,t){this.name=e,this.members=t,this.output=!1}}class KT{constructor(e,t){this.name=e,this.value=t,this.boundary=0,this.itemSize=0,this.offset=0}setValue(e){this.value=e}getValue(){return this.value}}class YT extends KT{constructor(e,t=0){super(e,t),this.isNumberUniform=!0,this.boundary=4,this.itemSize=1}}class QT extends KT{constructor(e,r=new t){super(e,r),this.isVector2Uniform=!0,this.boundary=8,this.itemSize=2}}class ZT extends KT{constructor(e,t=new r){super(e,t),this.isVector3Uniform=!0,this.boundary=16,this.itemSize=3}}class JT extends KT{constructor(e,t=new s){super(e,t),this.isVector4Uniform=!0,this.boundary=16,this.itemSize=4}}class e_ extends KT{constructor(t,r=new e){super(t,r),this.isColorUniform=!0,this.boundary=16,this.itemSize=3}}class t_ extends KT{constructor(e,t=new i){super(e,t),this.isMatrix2Uniform=!0,this.boundary=16,this.itemSize=4}}class r_ extends KT{constructor(e,t=new n){super(e,t),this.isMatrix3Uniform=!0,this.boundary=48,this.itemSize=12}}class s_ extends KT{constructor(e,t=new a){super(e,t),this.isMatrix4Uniform=!0,this.boundary=64,this.itemSize=16}}class i_ extends YT{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class n_ extends QT{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class a_ extends ZT{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class o_ extends JT{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class u_ extends e_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class l_ extends t_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class d_ extends r_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class c_ extends s_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}const h_=new WeakMap,p_=new Map([[Int8Array,"int"],[Int16Array,"int"],[Int32Array,"int"],[Uint8Array,"uint"],[Uint16Array,"uint"],[Uint32Array,"uint"],[Float32Array,"float"]]),g_=e=>/e/g.test(e)?String(e).replace(/\+/g,""):(e=Number(e))+(e%1?"":".0");class m_{constructor(e,t,r){this.object=e,this.material=e&&e.material||null,this.geometry=e&&e.geometry||null,this.renderer=t,this.parser=r,this.scene=null,this.camera=null,this.nodes=[],this.sequentialNodes=[],this.updateNodes=[],this.updateBeforeNodes=[],this.updateAfterNodes=[],this.hashNodes={},this.observer=null,this.lightsNode=null,this.environmentNode=null,this.fogNode=null,this.clippingContext=null,this.vertexShader=null,this.fragmentShader=null,this.computeShader=null,this.flowNodes={vertex:[],fragment:[],compute:[]},this.flowCode={vertex:"",fragment:"",compute:""},this.uniforms={vertex:[],fragment:[],compute:[],index:0},this.structs={vertex:[],fragment:[],compute:[],index:0},this.bindings={vertex:{},fragment:{},compute:{}},this.bindingsIndexes={},this.bindGroups=null,this.attributes=[],this.bufferAttributes=[],this.varyings=[],this.codes={},this.vars={},this.declarations={},this.flow={code:""},this.chaining=[],this.stack=xf(),this.stacks=[],this.tab="\t",this.currentFunctionNode=null,this.context={material:this.material},this.cache=new qT,this.globalCache=this.cache,this.flowsData=new WeakMap,this.shaderStage=null,this.buildStage=null}getBindGroupsCache(){let e=h_.get(this.renderer);return void 0===e&&(e=new Mm,h_.set(this.renderer,e)),e}createRenderTarget(e,t,r){return new ae(e,t,r)}createCubeRenderTarget(e,t){return new Xh(e,t)}includes(e){return this.nodes.includes(e)}getOutputStructName(){}_getBindGroup(e,t){const r=this.getBindGroupsCache(),s=[];let i,n=!0;for(const e of t)s.push(e),n=n&&!0!==e.groupNode.shared;return n?(i=r.get(s),void 0===i&&(i=new OT(e,s,this.bindingsIndexes[e].group,s),r.set(s,i))):i=new OT(e,s,this.bindingsIndexes[e].group,s),i}getBindGroupArray(e,t){const r=this.bindings[t];let s=r[e];return void 0===s&&(void 0===this.bindingsIndexes[e]&&(this.bindingsIndexes[e]={binding:0,group:Object.keys(this.bindingsIndexes).length}),r[e]=s=[]),s}getBindings(){let e=this.bindGroups;if(null===e){const t={},r=this.bindings;for(const e of Gs)for(const s in r[e]){const i=r[e][s];(t[s]||(t[s]=[])).push(...i)}e=[];for(const r in t){const s=t[r],i=this._getBindGroup(r,s);e.push(i)}this.bindGroups=e}return e}sortBindingGroups(){const e=this.getBindings();e.sort(((e,t)=>e.bindings[0].groupNode.order-t.bindings[0].groupNode.order));for(let t=0;t=0?`${Math.round(n)}u`:"0u";if("bool"===i)return n?"true":"false";if("color"===i)return`${this.getType("vec3")}( ${g_(n.r)}, ${g_(n.g)}, ${g_(n.b)} )`;const a=this.getTypeLength(i),o=this.getComponentType(i),u=e=>this.generateConst(o,e);if(2===a)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)} )`;if(3===a)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)} )`;if(4===a&&"mat2"!==i)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)}, ${u(n.w)} )`;if(a>=4&&n&&(n.isMatrix2||n.isMatrix3||n.isMatrix4))return`${this.getType(i)}( ${n.elements.map(u).join(", ")} )`;if(a>4)return`${this.getType(i)}()`;throw new Error(`NodeBuilder: Type '${i}' not found in generate constant attempt.`)}getType(e){return"color"===e?"vec3":e}hasGeometryAttribute(e){return this.geometry&&void 0!==this.geometry.getAttribute(e)}getAttribute(e,t){const r=this.attributes;for(const t of r)if(t.name===e)return t;const s=new kT(e,t);return this.registerDeclaration(s),r.push(s),s}getPropertyName(e){return e.name}isVector(e){return/vec\d/.test(e)}isMatrix(e){return/mat\d/.test(e)}isReference(e){return"void"===e||"property"===e||"sampler"===e||"samplerComparison"===e||"texture"===e||"cubeTexture"===e||"storageTexture"===e||"depthTexture"===e||"texture3D"===e}needsToWorkingColorSpace(){return!1}getComponentTypeFromTexture(e){const t=e.type;if(e.isDataTexture){if(t===T)return"int";if(t===b)return"uint"}return"float"}getElementType(e){return"mat2"===e?"vec2":"mat3"===e?"vec3":"mat4"===e?"vec4":this.getComponentType(e)}getComponentType(e){if("float"===(e=this.getVectorType(e))||"bool"===e||"int"===e||"uint"===e)return e;const t=/(b|i|u|)(vec|mat)([2-4])/.exec(e);return null===t?null:"b"===t[1]?"bool":"i"===t[1]?"int":"u"===t[1]?"uint":"float"}getVectorType(e){return"color"===e?"vec3":"texture"===e||"cubeTexture"===e||"storageTexture"===e||"texture3D"===e?"vec4":e}getTypeFromLength(e,t="float"){if(1===e)return t;let r=Es(e);const s="float"===t?"":t[0];return!0===/mat2/.test(t)&&(r=r.replace("vec","mat")),s+r}getTypeFromArray(e){return p_.get(e.constructor)}isInteger(e){return/int|uint|(i|u)vec/.test(e)}getTypeFromAttribute(e){let t=e;e.isInterleavedBufferAttribute&&(t=e.data);const r=t.array,s=e.itemSize,i=e.normalized;let n;return e instanceof ze||!0===i||(n=this.getTypeFromArray(r)),this.getTypeFromLength(s,n)}getTypeLength(e){const t=this.getVectorType(e),r=/vec([2-4])/.exec(t);return null!==r?Number(r[1]):"float"===t||"bool"===t||"int"===t||"uint"===t?1:!0===/mat2/.test(e)?4:!0===/mat3/.test(e)?9:!0===/mat4/.test(e)?16:0}getVectorFromMatrix(e){return e.replace("mat","vec")}changeComponentType(e,t){return this.getTypeFromLength(this.getTypeLength(e),t)}getIntegerType(e){const t=this.getComponentType(e);return"int"===t||"uint"===t?e:this.changeComponentType(e,"int")}addStack(){return this.stack=xf(this.stack),this.stacks.push(Oi()||this.stack),Ui(this.stack),this.stack}removeStack(){const e=this.stack;return this.stack=e.parent,Ui(this.stacks.pop()),e}getDataFromNode(e,t=this.shaderStage,r=null){let s=(r=null===r?e.isGlobal(this)?this.globalCache:this.cache:r).getData(e);return void 0===s&&(s={},r.setData(e,s)),void 0===s[t]&&(s[t]={}),s[t]}getNodeProperties(e,t="any"){const r=this.getDataFromNode(e,t);return r.properties||(r.properties={outputNode:null})}getBufferAttributeFromNode(e,t){const r=this.getDataFromNode(e);let s=r.bufferAttribute;if(void 0===s){const i=this.uniforms.index++;s=new kT("nodeAttribute"+i,t,e),this.bufferAttributes.push(s),r.bufferAttribute=s}return s}getStructTypeFromNode(e,t,r=null,s=this.shaderStage){const i=this.getDataFromNode(e,s,this.globalCache);let n=i.structType;if(void 0===n){const e=this.structs.index++;null===r&&(r="StructType"+e),n=new XT(r,t),this.structs[s].push(n),i.structType=n}return n}getOutputStructTypeFromNode(e,t){const r=this.getStructTypeFromNode(e,t,"OutputType","fragment");return r.output=!0,r}getUniformFromNode(e,t,r=this.shaderStage,s=null){const i=this.getDataFromNode(e,r,this.globalCache);let n=i.uniform;if(void 0===n){const a=this.uniforms.index++;n=new zT(s||"nodeUniform"+a,t,e),this.uniforms[r].push(n),this.registerDeclaration(n),i.uniform=n}return n}getArrayCount(e){let t=null;return e.isArrayNode?t=e.count:e.isVarNode&&e.node.isArrayNode&&(t=e.node.count),t}getVarFromNode(e,t=null,r=e.getNodeType(this),s=this.shaderStage,i=!1){const n=this.getDataFromNode(e,s);let a=n.variable;if(void 0===a){const o=i?"_const":"_var",u=this.vars[s]||(this.vars[s]=[]),l=this.vars[o]||(this.vars[o]=0);null===t&&(t=(i?"nodeConst":"nodeVar")+l,this.vars[o]++);const d=this.getArrayCount(e);a=new $T(t,r,i,d),i||u.push(a),this.registerDeclaration(a),n.variable=a}return a}isDeterministic(e){if(e.isMathNode)return this.isDeterministic(e.aNode)&&(!e.bNode||this.isDeterministic(e.bNode))&&(!e.cNode||this.isDeterministic(e.cNode));if(e.isOperatorNode)return this.isDeterministic(e.aNode)&&(!e.bNode||this.isDeterministic(e.bNode));if(e.isArrayNode){if(null!==e.values)for(const t of e.values)if(!this.isDeterministic(t))return!1;return!0}return!!e.isConstNode}getVaryingFromNode(e,t=null,r=e.getNodeType(this)){const s=this.getDataFromNode(e,"any");let i=s.varying;if(void 0===i){const e=this.varyings,n=e.length;null===t&&(t="nodeVarying"+n),i=new HT(t,r),e.push(i),this.registerDeclaration(i),s.varying=i}return i}registerDeclaration(e){const t=this.shaderStage,r=this.declarations[t]||(this.declarations[t]={}),s=this.getPropertyName(e);let i=1,n=s;for(;void 0!==r[n];)n=s+"_"+i++;r[n]=e,i>1&&(e.name=n,console.warn(`THREE.TSL: Declaration name '${s}' of '${e.type}' already in use. Renamed to '${n}'.`))}getCodeFromNode(e,t,r=this.shaderStage){const s=this.getDataFromNode(e);let i=s.code;if(void 0===i){const e=this.codes[r]||(this.codes[r]=[]),n=e.length;i=new WT("nodeCode"+n,t),e.push(i),s.code=i}return i}addFlowCodeHierarchy(e,t){const{flowCodes:r,flowCodeBlock:s}=this.getDataFromNode(e);let i=!0,n=t;for(;n;){if(!0===s.get(n)){i=!1;break}n=this.getDataFromNode(n).parentNodeBlock}if(i)for(const e of r)this.addLineFlowCode(e)}addLineFlowCodeBlock(e,t,r){const s=this.getDataFromNode(e),i=s.flowCodes||(s.flowCodes=[]),n=s.flowCodeBlock||(s.flowCodeBlock=new WeakMap);i.push(t),n.set(r,!0)}addLineFlowCode(e,t=null){return""===e||(null!==t&&this.context.nodeBlock&&this.addLineFlowCodeBlock(t,e,this.context.nodeBlock),e=this.tab+e,/;\s*$/.test(e)||(e+=";\n"),this.flow.code+=e),this}addFlowCode(e){return this.flow.code+=e,this}addFlowTab(){return this.tab+="\t",this}removeFlowTab(){return this.tab=this.tab.slice(0,-1),this}getFlowData(e){return this.flowsData.get(e)}flowNode(e){const t=e.getNodeType(this),r=this.flowChildNode(e,t);return this.flowsData.set(e,r),r}addInclude(e){null!==this.currentFunctionNode&&this.currentFunctionNode.includes.push(e)}buildFunctionNode(e){const t=new mx,r=this.currentFunctionNode;return this.currentFunctionNode=t,t.code=this.buildFunctionCode(e),this.currentFunctionNode=r,t}flowShaderNode(e){const t=e.layout,r={[Symbol.iterator](){let e=0;const t=Object.values(this);return{next:()=>({value:t[e],done:e++>=t.length})}}};for(const e of t.inputs)r[e.name]=new ff(e.type,e.name);e.layout=null;const s=e.call(r),i=this.flowStagesNode(s,t.type);return e.layout=t,i}flowStagesNode(e,t=null){const r=this.flow,s=this.vars,i=this.declarations,n=this.cache,a=this.buildStage,o=this.stack,u={code:""};this.flow=u,this.vars={},this.declarations={},this.cache=new qT,this.stack=xf();for(const r of Os)this.setBuildStage(r),u.result=e.build(this,t);return u.vars=this.getVars(this.shaderStage),this.flow=r,this.vars=s,this.declarations=i,this.cache=n,this.stack=o,this.setBuildStage(a),u}getFunctionOperator(){return null}buildFunctionCode(){console.warn("Abstract function.")}flowChildNode(e,t=null){const r=this.flow,s={code:""};return this.flow=s,s.result=e.build(this,t),this.flow=r,s}flowNodeFromShaderStage(e,t,r=null,s=null){const i=this.shaderStage;this.setShaderStage(e);const n=this.flowChildNode(t,r);return null!==s&&(n.code+=`${this.tab+s} = ${n.result};\n`),this.flowCode[e]=this.flowCode[e]+n.code,this.setShaderStage(i),n}getAttributesArray(){return this.attributes.concat(this.bufferAttributes)}getAttributes(){console.warn("Abstract function.")}getVaryings(){console.warn("Abstract function.")}getVar(e,t,r=null){return`${null!==r?this.generateArrayDeclaration(e,r):this.getType(e)} ${t}`}getVars(e){let t="";const r=this.vars[e];if(void 0!==r)for(const e of r)t+=`${this.getVar(e.type,e.name)}; `;return t}getUniforms(){console.warn("Abstract function.")}getCodes(e){const t=this.codes[e];let r="";if(void 0!==t)for(const e of t)r+=e.code+"\n";return r}getHash(){return this.vertexShader+this.fragmentShader+this.computeShader}setShaderStage(e){this.shaderStage=e}getShaderStage(){return this.shaderStage}setBuildStage(e){this.buildStage=e}getBuildStage(){return this.buildStage}buildCode(){console.warn("Abstract function.")}build(){const{object:e,material:t,renderer:r}=this;if(null!==t){let e=r.library.fromMaterial(t);null===e&&(console.error(`NodeMaterial: Material "${t.type}" is not compatible.`),e=new Fh),e.build(this)}else this.addFlow("compute",e);for(const e of Os){this.setBuildStage(e),this.context.vertex&&this.context.vertex.isNode&&this.flowNodeFromShaderStage("vertex",this.context.vertex);for(const t of Gs){this.setShaderStage(t);const r=this.flowNodes[t];for(const t of r)"generate"===e?this.flowNode(t):t.build(this)}}return this.setBuildStage(null),this.setShaderStage(null),this.buildCode(),this.buildUpdateNodes(),this}getNodeUniform(e,t){if("float"===t||"int"===t||"uint"===t)return new i_(e);if("vec2"===t||"ivec2"===t||"uvec2"===t)return new n_(e);if("vec3"===t||"ivec3"===t||"uvec3"===t)return new a_(e);if("vec4"===t||"ivec4"===t||"uvec4"===t)return new o_(e);if("color"===t)return new u_(e);if("mat2"===t)return new l_(e);if("mat3"===t)return new d_(e);if("mat4"===t)return new c_(e);throw new Error(`Uniform "${t}" not declared.`)}format(e,t,r){if((t=this.getVectorType(t))===(r=this.getVectorType(r))||null===r||this.isReference(r))return e;const s=this.getTypeLength(t),i=this.getTypeLength(r);return 16===s&&9===i?`${this.getType(r)}( ${e}[ 0 ].xyz, ${e}[ 1 ].xyz, ${e}[ 2 ].xyz )`:9===s&&4===i?`${this.getType(r)}( ${e}[ 0 ].xy, ${e}[ 1 ].xy )`:s>4||i>4||0===i?e:s===i?`${this.getType(r)}( ${e} )`:s>i?this.format(`${e}.${"xyz".slice(0,i)}`,this.getTypeFromLength(i,this.getComponentType(t)),r):4===i&&s>1?`${this.getType(r)}( ${this.format(e,t,"vec3")}, 1.0 )`:2===s?`${this.getType(r)}( ${this.format(e,t,"vec2")}, 0.0 )`:(1===s&&i>1&&t!==this.getComponentType(r)&&(e=`${this.getType(this.getComponentType(r))}( ${e} )`),`${this.getType(r)}( ${e} )`)}getSignature(){return`// Three.js r${$e} - Node System\n`}createNodeMaterial(e="NodeMaterial"){throw new Error(`THREE.NodeBuilder: createNodeMaterial() was deprecated. Use new ${e}() instead.`)}}class f_{constructor(){this.time=0,this.deltaTime=0,this.frameId=0,this.renderId=0,this.updateMap=new WeakMap,this.updateBeforeMap=new WeakMap,this.updateAfterMap=new WeakMap,this.renderer=null,this.material=null,this.camera=null,this.object=null,this.scene=null}_getMaps(e,t){let r=e.get(t);return void 0===r&&(r={renderMap:new WeakMap,frameMap:new WeakMap},e.set(t,r)),r}updateBeforeNode(e){const t=e.getUpdateBeforeType(),r=e.updateReference(this);if(t===Is.FRAME){const{frameMap:t}=this._getMaps(this.updateBeforeMap,r);t.get(r)!==this.frameId&&!1!==e.updateBefore(this)&&t.set(r,this.frameId)}else if(t===Is.RENDER){const{renderMap:t}=this._getMaps(this.updateBeforeMap,r);t.get(r)!==this.renderId&&!1!==e.updateBefore(this)&&t.set(r,this.renderId)}else t===Is.OBJECT&&e.updateBefore(this)}updateAfterNode(e){const t=e.getUpdateAfterType(),r=e.updateReference(this);if(t===Is.FRAME){const{frameMap:t}=this._getMaps(this.updateAfterMap,r);t.get(r)!==this.frameId&&!1!==e.updateAfter(this)&&t.set(r,this.frameId)}else if(t===Is.RENDER){const{renderMap:t}=this._getMaps(this.updateAfterMap,r);t.get(r)!==this.renderId&&!1!==e.updateAfter(this)&&t.set(r,this.renderId)}else t===Is.OBJECT&&e.updateAfter(this)}updateNode(e){const t=e.getUpdateType(),r=e.updateReference(this);if(t===Is.FRAME){const{frameMap:t}=this._getMaps(this.updateMap,r);t.get(r)!==this.frameId&&!1!==e.update(this)&&t.set(r,this.frameId)}else if(t===Is.RENDER){const{renderMap:t}=this._getMaps(this.updateMap,r);t.get(r)!==this.renderId&&!1!==e.update(this)&&t.set(r,this.renderId)}else t===Is.OBJECT&&e.update(this)}update(){this.frameId++,void 0===this.lastTime&&(this.lastTime=performance.now()),this.deltaTime=(performance.now()-this.lastTime)/1e3,this.lastTime=performance.now(),this.time+=this.deltaTime}}class y_{constructor(e,t,r=null,s="",i=!1){this.type=e,this.name=t,this.count=r,this.qualifier=s,this.isConst=i}}y_.isNodeFunctionInput=!0;class x_ extends Vb{static get type(){return"DirectionalLightNode"}constructor(e=null){super(e)}setupDirect(){const e=this.colorNode;return{lightDirection:Zx(this.light),lightColor:e}}}const b_=new a,T_=new a;let __=null;class v_ extends Vb{static get type(){return"RectAreaLightNode"}constructor(e=null){super(e),this.halfHeight=Tn(new r).setGroup(yn),this.halfWidth=Tn(new r).setGroup(yn),this.updateType=Is.RENDER}update(e){super.update(e);const{light:t}=this,r=e.camera.matrixWorldInverse;T_.identity(),b_.copy(t.matrixWorld),b_.premultiply(r),T_.extractRotation(b_),this.halfWidth.value.set(.5*t.width,0,0),this.halfHeight.value.set(0,.5*t.height,0),this.halfWidth.value.applyMatrix4(T_),this.halfHeight.value.applyMatrix4(T_)}setupDirectRectArea(e){let t,r;e.isAvailable("float32Filterable")?(t=Hu(__.LTC_FLOAT_1),r=Hu(__.LTC_FLOAT_2)):(t=Hu(__.LTC_HALF_1),r=Hu(__.LTC_HALF_2));const{colorNode:s,light:i}=this;return{lightColor:s,lightPosition:Qx(i),halfWidth:this.halfWidth,halfHeight:this.halfHeight,ltc_1:t,ltc_2:r}}static setLTC(e){__=e}}class N_ extends Vb{static get type(){return"SpotLightNode"}constructor(e=null){super(e),this.coneCosNode=Tn(0).setGroup(yn),this.penumbraCosNode=Tn(0).setGroup(yn),this.cutoffDistanceNode=Tn(0).setGroup(yn),this.decayExponentNode=Tn(0).setGroup(yn)}update(e){super.update(e);const{light:t}=this;this.coneCosNode.value=Math.cos(t.angle),this.penumbraCosNode.value=Math.cos(t.angle*(1-t.penumbra)),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}getSpotAttenuation(e){const{coneCosNode:t,penumbraCosNode:r}=this;return Po(t,r,e)}setupDirect(e){const{colorNode:t,cutoffDistanceNode:r,decayExponentNode:s,light:i}=this,n=this.getLightVector(e),a=n.normalize(),o=a.dot(Zx(i)),u=this.getSpotAttenuation(o),l=n.length(),d=Ub({lightDistance:l,cutoffDistance:r,decayExponent:s});let c=t.mul(u).mul(d);if(i.map){const t=Xx(i,e.context.positionWorld),r=Hu(i.map,t.xy).onRenderUpdate((()=>i.map));c=t.mul(2).sub(1).abs().lessThan(1).all().select(c.mul(r),c)}return{lightColor:c,lightDirection:a}}}class S_ extends N_{static get type(){return"IESSpotLightNode"}getSpotAttenuation(e){const t=this.light.iesMap;let r=null;if(t&&!0===t.isTexture){const s=e.acos().mul(1/Math.PI);r=Hu(t,qi(s,0),0).r}else r=super.getSpotAttenuation(e);return r}}class E_ extends Vb{static get type(){return"AmbientLightNode"}constructor(e=null){super(e)}setup({context:e}){e.irradiance.addAssign(this.colorNode)}}class w_ extends Vb{static get type(){return"HemisphereLightNode"}constructor(t=null){super(t),this.lightPositionNode=Kx(t),this.lightDirectionNode=this.lightPositionNode.normalize(),this.groundColorNode=Tn(new e).setGroup(yn)}update(e){const{light:t}=this;super.update(e),this.lightPositionNode.object3d=t,this.groundColorNode.value.copy(t.groundColor).multiplyScalar(t.intensity)}setup(e){const{colorNode:t,groundColorNode:r,lightDirectionNode:s}=this,i=Gl.dot(s).mul(.5).add(.5),n=Ao(r,t,i);e.context.irradiance.addAssign(n)}}class A_ extends Vb{static get type(){return"LightProbeNode"}constructor(e=null){super(e);const t=[];for(let e=0;e<9;e++)t.push(new r);this.lightProbe=Yu(t)}update(e){const{light:t}=this;super.update(e);for(let e=0;e<9;e++)this.lightProbe.array[e].copy(t.sh.coefficients[e]).multiplyScalar(t.intensity)}setup(e){const t=BT(kl,this.lightProbe);e.context.irradiance.addAssign(t)}}class R_{parseFunction(){console.warn("Abstract function.")}}class C_{constructor(e,t,r="",s=""){this.type=e,this.inputs=t,this.name=r,this.precision=s}getCode(){console.warn("Abstract function.")}}C_.isNodeFunction=!0;const M_=/^\s*(highp|mediump|lowp)?\s*([a-z_0-9]+)\s*([a-z_0-9]+)?\s*\(([\s\S]*?)\)/i,P_=/[a-z_0-9]+/gi,L_="#pragma main";class F_ extends C_{constructor(e){const{type:t,inputs:r,name:s,precision:i,inputsCode:n,blockCode:a,headerCode:o}=(e=>{const t=(e=e.trim()).indexOf(L_),r=-1!==t?e.slice(t+12):e,s=r.match(M_);if(null!==s&&5===s.length){const i=s[4],n=[];let a=null;for(;null!==(a=P_.exec(i));)n.push(a);const o=[];let u=0;for(;u0||e.backgroundBlurriness>0&&0===t.backgroundBlurriness;if(t.background!==r||s){const i=this.getCacheNode("background",r,(()=>{if(!0===r.isCubeTexture||r.mapping===Y||r.mapping===Q||r.mapping===oe){if(e.backgroundBlurriness>0||r.mapping===oe)return Yg(r);{let e;return e=!0===r.isCubeTexture?sd(r):Hu(r),Jh(e)}}if(!0===r.isTexture)return Hu(r,rh.flipY()).setUpdateMatrix(!0);!0!==r.isColor&&console.error("WebGPUNodes: Unsupported background configuration.",r)}),s);t.backgroundNode=i,t.background=r,t.backgroundBlurriness=e.backgroundBlurriness}}else t.backgroundNode&&(delete t.backgroundNode,delete t.background)}getCacheNode(e,t,r,s=!1){const i=this.cacheLib[e]||(this.cacheLib[e]=new WeakMap);let n=i.get(t);return(void 0===n||s)&&(n=r(),i.set(t,n)),n}updateFog(e){const t=this.get(e),r=e.fog;if(r){if(t.fog!==r){const e=this.getCacheNode("fog",r,(()=>{if(r.isFogExp2){const e=ad("color","color",r).setGroup(yn),t=ad("density","float",r).setGroup(yn);return Ax(e,wx(t))}if(r.isFog){const e=ad("color","color",r).setGroup(yn),t=ad("near","float",r).setGroup(yn),s=ad("far","float",r).setGroup(yn);return Ax(e,Ex(t,s))}console.error("THREE.Renderer: Unsupported fog configuration.",r)}));t.fogNode=e,t.fog=r}}else delete t.fogNode,delete t.fog}updateEnvironment(e){const t=this.get(e),r=e.environment;if(r){if(t.environment!==r){const e=this.getCacheNode("environment",r,(()=>!0===r.isCubeTexture?sd(r):!0===r.isTexture?Hu(r):void console.error("Nodes: Unsupported environment configuration.",r)));t.environmentNode=e,t.environment=r}}else t.environmentNode&&(delete t.environmentNode,delete t.environment)}getNodeFrame(e=this.renderer,t=null,r=null,s=null,i=null){const n=this.nodeFrame;return n.renderer=e,n.scene=t,n.object=r,n.camera=s,n.material=i,n}getNodeFrameForRender(e){return this.getNodeFrame(e.renderer,e.scene,e.object,e.camera,e.material)}getOutputCacheKey(){const e=this.renderer;return e.toneMapping+","+e.currentColorSpace}hasOutputChange(e){return I_.get(e)!==this.getOutputCacheKey()}getOutputNode(e){const t=this.renderer,r=this.getOutputCacheKey(),s=Hu(e,rh).renderOutput(t.toneMapping,t.currentColorSpace);return I_.set(e,r),s}updateBefore(e){const t=e.getNodeBuilderState();for(const r of t.updateBeforeNodes)this.getNodeFrameForRender(e).updateBeforeNode(r)}updateAfter(e){const t=e.getNodeBuilderState();for(const r of t.updateAfterNodes)this.getNodeFrameForRender(e).updateAfterNode(r)}updateForCompute(e){const t=this.getNodeFrame(),r=this.getForCompute(e);for(const e of r.updateNodes)t.updateNode(e)}updateForRender(e){const t=this.getNodeFrameForRender(e),r=e.getNodeBuilderState();for(const e of r.updateNodes)t.updateNode(e)}needsRefresh(e){const t=this.getNodeFrameForRender(e);return e.getMonitor().needsRefresh(e,t)}dispose(){super.dispose(),this.nodeFrame=new f_,this.nodeBuilderCache=new Map,this.cacheLib={}}}const O_=new Me;class G_{constructor(e=null){this.version=0,this.clipIntersection=null,this.cacheKey="",this.shadowPass=!1,this.viewNormalMatrix=new n,this.clippingGroupContexts=new WeakMap,this.intersectionPlanes=[],this.unionPlanes=[],this.parentVersion=null,null!==e&&(this.viewNormalMatrix=e.viewNormalMatrix,this.clippingGroupContexts=e.clippingGroupContexts,this.shadowPass=e.shadowPass,this.viewMatrix=e.viewMatrix)}projectPlanes(e,t,r){const s=e.length;for(let i=0;i0,alpha:!0,depth:t.depth,stencil:t.stencil,framebufferScaleFactor:this.getFramebufferScaleFactor()},i=new XRWebGLLayer(e,s,r);this._glBaseLayer=i,e.updateRenderState({baseLayer:i}),t.setPixelRatio(1),t.setSize(i.framebufferWidth,i.framebufferHeight,!1),this._xrRenderTarget=new X_(i.framebufferWidth,i.framebufferHeight,{format:ce,type:Ce,colorSpace:t.outputColorSpace,stencilBuffer:t.stencil,resolveDepthBuffer:!1===i.ignoreDepthValues,resolveStencilBuffer:!1===i.ignoreDepthValues})}this.setFoveation(this.getFoveation()),t._animation.setAnimationLoop(this._onAnimationFrame),t._animation.setContext(e),t._animation.start(),this.isPresenting=!0,this.dispatchEvent({type:"sessionstart"})}}updateCamera(e){const t=this._session;if(null===t)return;const r=e.near,s=e.far,i=this._cameraXR,n=this._cameraL,a=this._cameraR;i.near=a.near=n.near=r,i.far=a.far=n.far=s,this._currentDepthNear===i.near&&this._currentDepthFar===i.far||(t.updateRenderState({depthNear:i.near,depthFar:i.far}),this._currentDepthNear=i.near,this._currentDepthFar=i.far),n.layers.mask=2|e.layers.mask,a.layers.mask=4|e.layers.mask,i.layers.mask=n.layers.mask|a.layers.mask;const o=e.parent,u=i.cameras;Z_(i,o);for(let e=0;e=0&&(r[n]=null,t[n].disconnect(i))}for(let s=0;s=r.length){r.push(i),n=e;break}if(null===r[e]){r[e]=i,n=e;break}}if(-1===n)break}const a=t[n];a&&a.connect(i)}}function rv(e){return"quad"===e.type?this._glBinding.createQuadLayer({transform:new XRRigidTransform(e.translation,e.quaternion),depthFormat:this._gl.DEPTH_COMPONENT,width:e.width/2,height:e.height/2,space:this._referenceSpace,viewPixelWidth:e.pixelwidth,viewPixelHeight:e.pixelheight}):this._glBinding.createCylinderLayer({transform:new XRRigidTransform(e.translation,e.quaternion),depthFormat:this._gl.DEPTH_COMPONENT,radius:e.radius,centralAngle:e.centralAngle,aspectRatio:e.aspectRatio,space:this._referenceSpace,viewPixelWidth:e.pixelwidth,viewPixelHeight:e.pixelheight})}function sv(e,t){if(void 0===t)return;const r=this._cameraXR,i=this._renderer,n=i.backend,a=this._glBaseLayer,o=this.getReferenceSpace(),u=t.getViewerPose(o);if(this._xrFrame=t,null!==u){const e=u.views;null!==this._glBaseLayer&&n.setXRTarget(a.framebuffer);let t=!1;e.length!==r.cameras.length&&(r.cameras.length=0,t=!0);for(let i=0;i{await this.compileAsync(e,t);const s=this._renderLists.get(e,t),i=this._renderContexts.get(e,t,this._renderTarget),n=e.overrideMaterial||r.material,a=this._objects.get(r,n,e,t,s.lightsNode,i,i.clippingContext),{fragmentShader:o,vertexShader:u}=a.getNodeBuilderState();return{fragmentShader:o,vertexShader:u}}}}async init(){if(this._initialized)throw new Error("Renderer: Backend has already been initialized.");return null!==this._initPromise||(this._initPromise=new Promise((async(e,t)=>{let r=this.backend;try{await r.init(this)}catch(e){if(null===this._getFallback)return void t(e);try{this.backend=r=this._getFallback(e),await r.init(this)}catch(e){return void t(e)}}this._nodes=new U_(this,r),this._animation=new Cm(this._nodes,this.info),this._attributes=new km(r),this._background=new VT(this,this._nodes),this._geometries=new Hm(this._attributes,this.info),this._textures=new gf(this,r,this.info),this._pipelines=new Qm(r,this._nodes),this._bindings=new Zm(r,this._nodes,this._textures,this._attributes,this._pipelines,this.info),this._objects=new Bm(this,this._nodes,this._geometries,this._pipelines,this._bindings,this.info),this._renderLists=new nf(this.lighting),this._bundles=new $_,this._renderContexts=new hf,this._animation.start(),this._initialized=!0,e(this)}))),this._initPromise}get coordinateSystem(){return this.backend.coordinateSystem}async compileAsync(e,t,r=null){if(!0===this._isDeviceLost)return;!1===this._initialized&&await this.init();const s=this._nodes.nodeFrame,i=s.renderId,n=this._currentRenderContext,a=this._currentRenderObjectFunction,o=this._compilationPromises,u=!0===e.isScene?e:iv;null===r&&(r=e);const l=this._renderTarget,d=this._renderContexts.get(r,t,l),c=this._activeMipmapLevel,h=[];this._currentRenderContext=d,this._currentRenderObjectFunction=this.renderObject,this._handleObjectFunction=this._createObjectPipeline,this._compilationPromises=h,s.renderId++,s.update(),d.depth=this.depth,d.stencil=this.stencil,d.clippingContext||(d.clippingContext=new G_),d.clippingContext.updateGlobal(u,t),u.onBeforeRender(this,e,t,l);const p=this._renderLists.get(e,t);if(p.begin(),this._projectObject(e,t,0,p,d.clippingContext),r!==e&&r.traverseVisible((function(e){e.isLight&&e.layers.test(t.layers)&&p.pushLight(e)})),p.finish(),null!==l){this._textures.updateRenderTarget(l,c);const e=this._textures.get(l);d.textures=e.textures,d.depthTexture=e.depthTexture}else d.textures=null,d.depthTexture=null;this._background.update(u,p,d);const g=p.opaque,m=p.transparent,f=p.transparentDoublePass,y=p.lightsNode;!0===this.opaque&&g.length>0&&this._renderObjects(g,t,u,y),!0===this.transparent&&m.length>0&&this._renderTransparents(m,f,t,u,y),s.renderId=i,this._currentRenderContext=n,this._currentRenderObjectFunction=a,this._compilationPromises=o,this._handleObjectFunction=this._renderObjectDirect,await Promise.all(h)}async renderAsync(e,t){!1===this._initialized&&await this.init(),this._renderScene(e,t)}async waitForGPU(){await this.backend.waitForGPU()}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}getColorBufferType(){return this._colorBufferType}_onDeviceLost(e){let t=`THREE.WebGPURenderer: ${e.api} Device Lost:\n\nMessage: ${e.message}`;e.reason&&(t+=`\nReason: ${e.reason}`),console.error(t),this._isDeviceLost=!0}_renderBundle(e,t,r){const{bundleGroup:s,camera:i,renderList:n}=e,a=this._currentRenderContext,o=this._bundles.get(s,i),u=this.backend.get(o);void 0===u.renderContexts&&(u.renderContexts=new Set);const l=s.version!==u.version,d=!1===u.renderContexts.has(a)||l;if(u.renderContexts.add(a),d){this.backend.beginBundle(a),(void 0===u.renderObjects||l)&&(u.renderObjects=[]),this._currentRenderBundle=o;const{transparentDoublePass:e,transparent:d,opaque:c}=n;!0===this.opaque&&c.length>0&&this._renderObjects(c,i,t,r),!0===this.transparent&&d.length>0&&this._renderTransparents(d,e,i,t,r),this._currentRenderBundle=null,this.backend.finishBundle(a,o),u.version=s.version}else{const{renderObjects:e}=u;for(let t=0,r=e.length;t>=c,p.viewportValue.height>>=c,p.viewportValue.minDepth=b,p.viewportValue.maxDepth=T,p.viewport=!1===p.viewportValue.equals(av),p.scissorValue.copy(y).multiplyScalar(x).floor(),p.scissor=this._scissorTest&&!1===p.scissorValue.equals(av),p.scissorValue.width>>=c,p.scissorValue.height>>=c,p.clippingContext||(p.clippingContext=new G_),p.clippingContext.updateGlobal(u,t),u.onBeforeRender(this,e,t,h),uv.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),ov.setFromProjectionMatrix(uv,g);const _=this._renderLists.get(e,t);if(_.begin(),this._projectObject(e,t,0,_,p.clippingContext),_.finish(),!0===this.sortObjects&&_.sort(this._opaqueSort,this._transparentSort),null!==h){this._textures.updateRenderTarget(h,c);const e=this._textures.get(h);p.textures=e.textures,p.depthTexture=e.depthTexture,p.width=e.width,p.height=e.height,p.renderTarget=h,p.depth=h.depthBuffer,p.stencil=h.stencilBuffer}else p.textures=null,p.depthTexture=null,p.width=this.domElement.width,p.height=this.domElement.height,p.depth=this.depth,p.stencil=this.stencil;p.width>>=c,p.height>>=c,p.activeCubeFace=d,p.activeMipmapLevel=c,p.occlusionQueryCount=_.occlusionQueryCount,this._background.update(u,_,p),this.backend.beginRender(p);const{bundles:v,lightsNode:N,transparentDoublePass:S,transparent:E,opaque:w}=_;return v.length>0&&this._renderBundles(v,u,N),!0===this.opaque&&w.length>0&&this._renderObjects(w,t,u,N),!0===this.transparent&&E.length>0&&this._renderTransparents(E,S,t,u,N),this.backend.finishRender(p),i.renderId=n,this._currentRenderContext=a,this._currentRenderObjectFunction=o,null!==s&&(this.setRenderTarget(l,d,c),this._renderOutput(h)),u.onAfterRender(this,e,t,h),p}_renderOutput(e){const t=this._quad;this._nodes.hasOutputChange(e.texture)&&(t.material.fragmentNode=this._nodes.getOutputNode(e.texture),t.material.needsUpdate=!0);const r=this.autoClear,s=this.xr.enabled;this.autoClear=!1,this.xr.enabled=!1,this._renderScene(t,t.camera,!1),this.autoClear=r,this.xr.enabled=s}getMaxAnisotropy(){return this.backend.getMaxAnisotropy()}getActiveCubeFace(){return this._activeCubeFace}getActiveMipmapLevel(){return this._activeMipmapLevel}async setAnimationLoop(e){!1===this._initialized&&await this.init(),this._animation.setAnimationLoop(e)}async getArrayBufferAsync(e){return await this.backend.getArrayBufferAsync(e)}getContext(){return this.backend.getContext()}getPixelRatio(){return this._pixelRatio}getDrawingBufferSize(e){return e.set(this._width*this._pixelRatio,this._height*this._pixelRatio).floor()}getSize(e){return e.set(this._width,this._height)}setPixelRatio(e=1){this._pixelRatio!==e&&(this._pixelRatio=e,this.setSize(this._width,this._height,!1))}setDrawingBufferSize(e,t,r){this.xr&&this.xr.isPresenting||(this._width=e,this._height=t,this._pixelRatio=r,this.domElement.width=Math.floor(e*r),this.domElement.height=Math.floor(t*r),this.setViewport(0,0,e,t),this._initialized&&this.backend.updateSize())}setSize(e,t,r=!0){this.xr&&this.xr.isPresenting||(this._width=e,this._height=t,this.domElement.width=Math.floor(e*this._pixelRatio),this.domElement.height=Math.floor(t*this._pixelRatio),!0===r&&(this.domElement.style.width=e+"px",this.domElement.style.height=t+"px"),this.setViewport(0,0,e,t),this._initialized&&this.backend.updateSize())}setOpaqueSort(e){this._opaqueSort=e}setTransparentSort(e){this._transparentSort=e}getScissor(e){const t=this._scissor;return e.x=t.x,e.y=t.y,e.width=t.width,e.height=t.height,e}setScissor(e,t,r,s){const i=this._scissor;e.isVector4?i.copy(e):i.set(e,t,r,s)}getScissorTest(){return this._scissorTest}setScissorTest(e){this._scissorTest=e,this.backend.setScissorTest(e)}getViewport(e){return e.copy(this._viewport)}setViewport(e,t,r,s,i=0,n=1){const a=this._viewport;e.isVector4?a.copy(e):a.set(e,t,r,s),a.minDepth=i,a.maxDepth=n}getClearColor(e){return e.copy(this._clearColor)}setClearColor(e,t=1){this._clearColor.set(e),this._clearColor.a=t}getClearAlpha(){return this._clearColor.a}setClearAlpha(e){this._clearColor.a=e}getClearDepth(){return this._clearDepth}setClearDepth(e){this._clearDepth=e}getClearStencil(){return this._clearStencil}setClearStencil(e){this._clearStencil=e}isOccluded(e){const t=this._currentRenderContext;return t&&this.backend.isOccluded(t,e)}clear(e=!0,t=!0,r=!0){if(!1===this._initialized)return console.warn("THREE.Renderer: .clear() called before the backend is initialized. Try using .clearAsync() instead."),this.clearAsync(e,t,r);const s=this._renderTarget||this._getFrameBufferTarget();let i=null;if(null!==s){this._textures.updateRenderTarget(s);const e=this._textures.get(s);i=this._renderContexts.getForClear(s),i.textures=e.textures,i.depthTexture=e.depthTexture,i.width=e.width,i.height=e.height,i.renderTarget=s,i.depth=s.depthBuffer,i.stencil=s.stencilBuffer,i.clearColorValue=this.backend.getClearColor(),i.activeCubeFace=this.getActiveCubeFace(),i.activeMipmapLevel=this.getActiveMipmapLevel()}this.backend.clear(e,t,r,i),null!==s&&null===this._renderTarget&&this._renderOutput(s)}clearColor(){return this.clear(!0,!1,!1)}clearDepth(){return this.clear(!1,!0,!1)}clearStencil(){return this.clear(!1,!1,!0)}async clearAsync(e=!0,t=!0,r=!0){!1===this._initialized&&await this.init(),this.clear(e,t,r)}async clearColorAsync(){this.clearAsync(!0,!1,!1)}async clearDepthAsync(){this.clearAsync(!1,!0,!1)}async clearStencilAsync(){this.clearAsync(!1,!1,!0)}get currentToneMapping(){return this.isOutputTarget?this.toneMapping:p}get currentColorSpace(){return this.isOutputTarget?this.outputColorSpace:de}get isOutputTarget(){return this._renderTarget===this._outputRenderTarget||null===this._renderTarget}dispose(){this.info.dispose(),this.backend.dispose(),this._animation.dispose(),this._objects.dispose(),this._pipelines.dispose(),this._nodes.dispose(),this._bindings.dispose(),this._renderLists.dispose(),this._renderContexts.dispose(),this._textures.dispose(),null!==this._frameBufferTarget&&this._frameBufferTarget.dispose(),Object.values(this.backend.timestampQueryPool).forEach((e=>{null!==e&&e.dispose()})),this.setRenderTarget(null),this.setAnimationLoop(null)}setRenderTarget(e,t=0,r=0){this._renderTarget=e,this._activeCubeFace=t,this._activeMipmapLevel=r}getRenderTarget(){return this._renderTarget}setOutputRenderTarget(e){this._outputRenderTarget=e}getOutputRenderTarget(){return this._outputRenderTarget}setRenderObjectFunction(e){this._renderObjectFunction=e}getRenderObjectFunction(){return this._renderObjectFunction}compute(e){if(!0===this._isDeviceLost)return;if(!1===this._initialized)return console.warn("THREE.Renderer: .compute() called before the backend is initialized. Try using .computeAsync() instead."),this.computeAsync(e);const t=this._nodes.nodeFrame,r=t.renderId;this.info.calls++,this.info.compute.calls++,this.info.compute.frameCalls++,t.renderId=this.info.calls;const s=this.backend,i=this._pipelines,n=this._bindings,a=this._nodes,o=Array.isArray(e)?e:[e];if(void 0===o[0]||!0!==o[0].isComputeNode)throw new Error("THREE.Renderer: .compute() expects a ComputeNode.");s.beginCompute(e);for(const t of o){if(!1===i.has(t)){const e=()=>{t.removeEventListener("dispose",e),i.delete(t),n.delete(t),a.delete(t)};t.addEventListener("dispose",e);const r=t.onInitFunction;null!==r&&r.call(t,{renderer:this})}a.updateForCompute(t),n.updateForCompute(t);const r=n.getForCompute(t),o=i.getForCompute(t,r);s.compute(e,t,r,o)}s.finishCompute(e),t.renderId=r}async computeAsync(e){!1===this._initialized&&await this.init(),this.compute(e)}async hasFeatureAsync(e){return!1===this._initialized&&await this.init(),this.backend.hasFeature(e)}async resolveTimestampsAsync(e="render"){return!1===this._initialized&&await this.init(),this.backend.resolveTimestampsAsync(e)}hasFeature(e){return!1===this._initialized?(console.warn("THREE.Renderer: .hasFeature() called before the backend is initialized. Try using .hasFeatureAsync() instead."),!1):this.backend.hasFeature(e)}hasInitialized(){return this._initialized}async initTextureAsync(e){!1===this._initialized&&await this.init(),this._textures.updateTexture(e)}initTexture(e){!1===this._initialized&&console.warn("THREE.Renderer: .initTexture() called before the backend is initialized. Try using .initTextureAsync() instead."),this._textures.updateTexture(e)}copyFramebufferToTexture(e,t=null){if(null!==t)if(t.isVector2)t=lv.set(t.x,t.y,e.image.width,e.image.height).floor();else{if(!t.isVector4)return void console.error("THREE.Renderer.copyFramebufferToTexture: Invalid rectangle.");t=lv.copy(t).floor()}else t=lv.set(0,0,e.image.width,e.image.height);let r,s=this._currentRenderContext;null!==s?r=s.renderTarget:(r=this._renderTarget||this._getFrameBufferTarget(),null!==r&&(this._textures.updateRenderTarget(r),s=this._textures.get(r))),this._textures.updateTexture(e,{renderTarget:r}),this.backend.copyFramebufferToTexture(e,s,t)}copyTextureToTexture(e,t,r=null,s=null,i=0,n=0){this._textures.updateTexture(e),this._textures.updateTexture(t),this.backend.copyTextureToTexture(e,t,r,s,i,n)}async readRenderTargetPixelsAsync(e,t,r,s,i,n=0,a=0){return this.backend.copyTextureToBuffer(e.textures[n],t,r,s,i,a)}_projectObject(e,t,r,s,i){if(!1===e.visible)return;if(e.layers.test(t.layers))if(e.isGroup)r=e.renderOrder,e.isClippingGroup&&e.enabled&&(i=i.getGroupContext(e));else if(e.isLOD)!0===e.autoUpdate&&e.update(t);else if(e.isLight)s.pushLight(e);else if(e.isSprite){if(!e.frustumCulled||ov.intersectsSprite(e)){!0===this.sortObjects&&lv.setFromMatrixPosition(e.matrixWorld).applyMatrix4(uv);const{geometry:t,material:n}=e;n.visible&&s.push(e,t,n,r,lv.z,null,i)}}else if(e.isLineLoop)console.error("THREE.Renderer: Objects of type THREE.LineLoop are not supported. Please use THREE.Line or THREE.LineSegments.");else if((e.isMesh||e.isLine||e.isPoints)&&(!e.frustumCulled||ov.intersectsObject(e))){const{geometry:t,material:n}=e;if(!0===this.sortObjects&&(null===t.boundingSphere&&t.computeBoundingSphere(),lv.copy(t.boundingSphere.center).applyMatrix4(e.matrixWorld).applyMatrix4(uv)),Array.isArray(n)){const a=t.groups;for(let o=0,u=a.length;o0){for(const{material:e}of t)e.side=N;this._renderObjects(t,r,s,i,"backSide");for(const{material:e}of t)e.side=je;this._renderObjects(e,r,s,i);for(const{material:e}of t)e.side=Se}else this._renderObjects(e,r,s,i)}_renderObjects(e,t,r,s,i=null){for(let n=0,a=e.length;n0,e.isShadowPassMaterial&&(e.side=null===i.shadowSide?i.side:i.shadowSide,i.depthNode&&i.depthNode.isNode&&(c=e.depthNode,e.depthNode=i.depthNode),i.castShadowNode&&i.castShadowNode.isNode&&(d=e.colorNode,e.colorNode=i.castShadowNode)),i=e}!0===i.transparent&&i.side===Se&&!1===i.forceSinglePass?(i.side=N,this._handleObjectFunction(e,i,t,r,a,n,o,"backSide"),i.side=je,this._handleObjectFunction(e,i,t,r,a,n,o,u),i.side=Se):this._handleObjectFunction(e,i,t,r,a,n,o,u),void 0!==l&&(t.overrideMaterial.positionNode=l),void 0!==c&&(t.overrideMaterial.depthNode=c),void 0!==d&&(t.overrideMaterial.colorNode=d),e.onAfterRender(this,t,r,s,i,n)}_renderObjectDirect(e,t,r,s,i,n,a,o){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,a,o);u.drawRange=e.geometry.drawRange,u.group=n;const l=this._nodes.needsRefresh(u);if(l&&(this._nodes.updateBefore(u),this._geometries.updateForRender(u),this._nodes.updateForRender(u),this._bindings.updateForRender(u)),this._pipelines.updateForRender(u),null!==this._currentRenderBundle){this.backend.get(this._currentRenderBundle).renderObjects.push(u),u.bundle=this._currentRenderBundle.bundleGroup}this.backend.draw(u,this.info),l&&this._nodes.updateAfter(u)}_createObjectPipeline(e,t,r,s,i,n,a,o){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,a,o);u.drawRange=e.geometry.drawRange,u.group=n,this._nodes.updateBefore(u),this._geometries.updateForRender(u),this._nodes.updateForRender(u),this._bindings.updateForRender(u),this._pipelines.getForRender(u,this._compilationPromises),this._nodes.updateAfter(u)}get compile(){return this.compileAsync}}class cv{constructor(e=""){this.name=e,this.visibility=0}setVisibility(e){this.visibility|=e}clone(){return Object.assign(new this.constructor,this)}}class hv extends cv{constructor(e,t=null){super(e),this.isBuffer=!0,this.bytesPerElement=Float32Array.BYTES_PER_ELEMENT,this._buffer=t}get byteLength(){return(e=this._buffer.byteLength)+(Gm-e%Gm)%Gm;var e}get buffer(){return this._buffer}update(){return!0}}class pv extends hv{constructor(e,t=null){super(e,t),this.isUniformBuffer=!0}}let gv=0;class mv extends pv{constructor(e,t){super("UniformBuffer_"+gv++,e?e.value:null),this.nodeUniform=e,this.groupNode=t}get buffer(){return this.nodeUniform.value}}class fv extends pv{constructor(e){super(e),this.isUniformsGroup=!0,this._values=null,this.uniforms=[]}addUniform(e){return this.uniforms.push(e),this}removeUniform(e){const t=this.uniforms.indexOf(e);return-1!==t&&this.uniforms.splice(t,1),this}get values(){return null===this._values&&(this._values=Array.from(this.buffer)),this._values}get buffer(){let e=this._buffer;if(null===e){const t=this.byteLength;e=new Float32Array(new ArrayBuffer(t)),this._buffer=e}return e}get byteLength(){let e=0;for(let t=0,r=this.uniforms.length;t0?s:"";t=`${e.name} {\n\t${r} ${i.name}[${n}];\n};\n`}else{t=`${this.getVectorType(i.type)} ${this.getPropertyName(i,e)};`,n=!0}const a=i.node.precision;if(null!==a&&(t=Ev[a]+" "+t),n){t="\t"+t;const e=i.groupNode.name;(s[e]||(s[e]=[])).push(t)}else t="uniform "+t,r.push(t)}let i="";for(const t in s){const r=s[t];i+=this._getGLSLUniformStruct(e+"_"+t,r.join("\n"))+"\n"}return i+=r.join("\n"),i}getTypeFromAttribute(e){let t=super.getTypeFromAttribute(e);if(/^[iu]/.test(t)&&e.gpuType!==T){let r=e;e.isInterleavedBufferAttribute&&(r=e.data);const s=r.array;!1==(s instanceof Uint32Array||s instanceof Int32Array)&&(t=t.slice(1))}return t}getAttributes(e){let t="";if("vertex"===e||"compute"===e){const e=this.getAttributesArray();let r=0;for(const s of e)t+=`layout( location = ${r++} ) in ${s.type} ${s.name};\n`}return t}getStructMembers(e){const t=[];for(const r of e.members)t.push(`\t${r.type} ${r.name};`);return t.join("\n")}getStructs(e){const t=[],r=this.structs[e],s=[];for(const e of r)if(e.output)for(const t of e.members)s.push(`layout( location = ${t.index} ) out ${t.type} ${t.name};`);else{let r="struct "+e.name+" {\n";r+=this.getStructMembers(e),r+="\n};\n",t.push(r)}return 0===s.length&&s.push("layout( location = 0 ) out vec4 fragColor;"),"\n"+s.join("\n")+"\n\n"+t.join("\n")}getVaryings(e){let t="";const r=this.varyings;if("vertex"===e||"compute"===e)for(const s of r){"compute"===e&&(s.needsInterpolation=!0);const r=this.getType(s.type);if(s.needsInterpolation){t+=`${r.includes("int")||r.includes("uv")||r.includes("iv")?"flat ":""}out ${r} ${s.name};\n`}else t+=`${r} ${s.name};\n`}else if("fragment"===e)for(const e of r)if(e.needsInterpolation){const r=this.getType(e.type);t+=`${r.includes("int")||r.includes("uv")||r.includes("iv")?"flat ":""}in ${r} ${e.name};\n`}for(const r of this.builtins[e])t+=`${r};\n`;return t}getVertexIndex(){return"uint( gl_VertexID )"}getInstanceIndex(){return"uint( gl_InstanceID )"}getInvocationLocalIndex(){return`uint( gl_InstanceID ) % ${this.object.workgroupSize.reduce(((e,t)=>e*t),1)}u`}getDrawIndex(){return this.renderer.backend.extensions.has("WEBGL_multi_draw")?"uint( gl_DrawID )":null}getFrontFacing(){return"gl_FrontFacing"}getFragCoord(){return"gl_FragCoord.xy"}getFragDepth(){return"gl_FragDepth"}enableExtension(e,t,r=this.shaderStage){const s=this.extensions[r]||(this.extensions[r]=new Map);!1===s.has(e)&&s.set(e,{name:e,behavior:t})}getExtensions(e){const t=[];if("vertex"===e){const t=this.renderer.backend.extensions;this.object.isBatchedMesh&&t.has("WEBGL_multi_draw")&&this.enableExtension("GL_ANGLE_multi_draw","require",e)}const r=this.extensions[e];if(void 0!==r)for(const{name:e,behavior:s}of r.values())t.push(`#extension ${e} : ${s}`);return t.join("\n")}getClipDistance(){return"gl_ClipDistance"}isAvailable(e){let t=wv[e];if(void 0===t){let r;switch(t=!1,e){case"float32Filterable":r="OES_texture_float_linear";break;case"clipDistance":r="WEBGL_clip_cull_distance"}if(void 0!==r){const e=this.renderer.backend.extensions;e.has(r)&&(e.get(r),t=!0)}wv[e]=t}return t}isFlipY(){return!0}enableHardwareClipping(e){this.enableExtension("GL_ANGLE_clip_cull_distance","require"),this.builtins.vertex.push(`out float gl_ClipDistance[ ${e} ]`)}registerTransform(e,t){this.transforms.push({varyingName:e,attributeNode:t})}getTransforms(){const e=this.transforms;let t="";for(let r=0;r0&&(r+="\n"),r+=`\t// flow -> ${n}\n\t`),r+=`${s.code}\n\t`,e===i&&"compute"!==t&&(r+="// result\n\t","vertex"===t?(r+="gl_Position = ",r+=`${s.result};`):"fragment"===t&&(e.outputNode.isOutputStructNode||(r+="fragColor = ",r+=`${s.result};`)))}const n=e[t];n.extensions=this.getExtensions(t),n.uniforms=this.getUniforms(t),n.attributes=this.getAttributes(t),n.varyings=this.getVaryings(t),n.vars=this.getVars(t),n.structs=this.getStructs(t),n.codes=this.getCodes(t),n.transforms=this.getTransforms(t),n.flow=r}null!==this.material?(this.vertexShader=this._getGLSLVertexCode(e.vertex),this.fragmentShader=this._getGLSLFragmentCode(e.fragment)):this.computeShader=this._getGLSLVertexCode(e.compute)}getUniformFromNode(e,t,r,s=null){const i=super.getUniformFromNode(e,t,r,s),n=this.getDataFromNode(e,r,this.globalCache);let a=n.uniformGPU;if(void 0===a){const s=e.groupNode,o=s.name,u=this.getBindGroupArray(o,r);if("texture"===t)a=new _v(i.name,i.node,s),u.push(a);else if("cubeTexture"===t)a=new vv(i.name,i.node,s),u.push(a);else if("texture3D"===t)a=new Nv(i.name,i.node,s),u.push(a);else if("buffer"===t){e.name=`NodeBuffer_${e.id}`,i.name=`buffer${e.id}`;const t=new mv(e,s);t.name=e.name,u.push(t),a=t}else{const e=this.uniformGroups[r]||(this.uniformGroups[r]={});let n=e[o];void 0===n&&(n=new xv(r+"_"+o,s),e[o]=n,u.push(n)),a=this.getNodeUniform(i,t),n.addUniform(a)}n.uniformGPU=a}return i}}let Cv=null,Mv=null;class Pv{constructor(e={}){this.parameters=Object.assign({},e),this.data=new WeakMap,this.renderer=null,this.domElement=null,this.timestampQueryPool={render:null,compute:null},this.trackTimestamp=!0===e.trackTimestamp}async init(e){this.renderer=e}get coordinateSystem(){}beginRender(){}finishRender(){}beginCompute(){}finishCompute(){}draw(){}compute(){}createProgram(){}destroyProgram(){}createBindings(){}updateBindings(){}updateBinding(){}createRenderPipeline(){}createComputePipeline(){}needsRenderUpdate(){}getRenderCacheKey(){}createNodeBuilder(){}createSampler(){}destroySampler(){}createDefaultTexture(){}createTexture(){}updateTexture(){}generateMipmaps(){}destroyTexture(){}async copyTextureToBuffer(){}copyTextureToTexture(){}copyFramebufferToTexture(){}createAttribute(){}createIndexAttribute(){}createStorageAttribute(){}updateAttribute(){}destroyAttribute(){}getContext(){}updateSize(){}updateViewport(){}isOccluded(){}async resolveTimestampsAsync(e="render"){if(!this.trackTimestamp)return void ht("WebGPURenderer: Timestamp tracking is disabled.");const t=this.timestampQueryPool[e];if(!t)return void ht(`WebGPURenderer: No timestamp query pool for type '${e}' found.`);const r=await t.resolveQueriesAsync();return this.renderer.info[e].timestamp=r,r}async waitForGPU(){}async getArrayBufferAsync(){}async hasFeatureAsync(){}hasFeature(){}getMaxAnisotropy(){}getDrawingBufferSize(){return Cv=Cv||new t,this.renderer.getDrawingBufferSize(Cv)}setScissorTest(){}getClearColor(){const e=this.renderer;return Mv=Mv||new mf,e.getClearColor(Mv),Mv.getRGB(Mv),Mv}getDomElement(){let e=this.domElement;return null===e&&(e=void 0!==this.parameters.canvas?this.parameters.canvas:pt(),"setAttribute"in e&&e.setAttribute("data-engine",`three.js r${$e} webgpu`),this.domElement=e),e}set(e,t){this.data.set(e,t)}get(e){let t=this.data.get(e);return void 0===t&&(t={},this.data.set(e,t)),t}has(e){return this.data.has(e)}delete(e){this.data.delete(e)}dispose(){}}let Lv,Fv,Bv=0;class Iv{constructor(e,t){this.buffers=[e.bufferGPU,t],this.type=e.type,this.bufferType=e.bufferType,this.pbo=e.pbo,this.byteLength=e.byteLength,this.bytesPerElement=e.BYTES_PER_ELEMENT,this.version=e.version,this.isInteger=e.isInteger,this.activeBufferIndex=0,this.baseId=e.id}get id(){return`${this.baseId}|${this.activeBufferIndex}`}get bufferGPU(){return this.buffers[this.activeBufferIndex]}get transformBuffer(){return this.buffers[1^this.activeBufferIndex]}switchBuffers(){this.activeBufferIndex^=1}}class Dv{constructor(e){this.backend=e}createAttribute(e,t){const r=this.backend,{gl:s}=r,i=e.array,n=e.usage||s.STATIC_DRAW,a=e.isInterleavedBufferAttribute?e.data:e,o=r.get(a);let u,l=o.bufferGPU;if(void 0===l&&(l=this._createBuffer(s,t,i,n),o.bufferGPU=l,o.bufferType=t,o.version=a.version),i instanceof Float32Array)u=s.FLOAT;else if(i instanceof Uint16Array)u=e.isFloat16BufferAttribute?s.HALF_FLOAT:s.UNSIGNED_SHORT;else if(i instanceof Int16Array)u=s.SHORT;else if(i instanceof Uint32Array)u=s.UNSIGNED_INT;else if(i instanceof Int32Array)u=s.INT;else if(i instanceof Int8Array)u=s.BYTE;else if(i instanceof Uint8Array)u=s.UNSIGNED_BYTE;else{if(!(i instanceof Uint8ClampedArray))throw new Error("THREE.WebGLBackend: Unsupported buffer data format: "+i);u=s.UNSIGNED_BYTE}let d={bufferGPU:l,bufferType:t,type:u,byteLength:i.byteLength,bytesPerElement:i.BYTES_PER_ELEMENT,version:e.version,pbo:e.pbo,isInteger:u===s.INT||u===s.UNSIGNED_INT||e.gpuType===T,id:Bv++};if(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute){const e=this._createBuffer(s,t,i,n);d=new Iv(d,e)}r.set(e,d)}updateAttribute(e){const t=this.backend,{gl:r}=t,s=e.array,i=e.isInterleavedBufferAttribute?e.data:e,n=t.get(i),a=n.bufferType,o=e.isInterleavedBufferAttribute?e.data.updateRanges:e.updateRanges;if(r.bindBuffer(a,n.bufferGPU),0===o.length)r.bufferSubData(a,0,s);else{for(let e=0,t=o.length;e1?this.enable(s.SAMPLE_ALPHA_TO_COVERAGE):this.disable(s.SAMPLE_ALPHA_TO_COVERAGE),r>0&&this.currentClippingPlanes!==r){const e=12288;for(let t=0;t<8;t++)t{!function i(){const n=e.clientWaitSync(t,e.SYNC_FLUSH_COMMANDS_BIT,0);if(n===e.WAIT_FAILED)return e.deleteSync(t),void s();n!==e.TIMEOUT_EXPIRED?(e.deleteSync(t),r()):requestAnimationFrame(i)}()}))}}let Ov,Gv,kv,zv=!1;class $v{constructor(e){this.backend=e,this.gl=e.gl,this.extensions=e.extensions,this.defaultTextures={},!1===zv&&(this._init(),zv=!0)}_init(){const e=this.gl;Ov={[Sr]:e.REPEAT,[Nr]:e.CLAMP_TO_EDGE,[vr]:e.MIRRORED_REPEAT},Gv={[_]:e.NEAREST,[Er]:e.NEAREST_MIPMAP_NEAREST,[ke]:e.NEAREST_MIPMAP_LINEAR,[q]:e.LINEAR,[Ge]:e.LINEAR_MIPMAP_NEAREST,[B]:e.LINEAR_MIPMAP_LINEAR},kv={[Lr]:e.NEVER,[Pr]:e.ALWAYS,[Ie]:e.LESS,[Mr]:e.LEQUAL,[Cr]:e.EQUAL,[Rr]:e.GEQUAL,[Ar]:e.GREATER,[wr]:e.NOTEQUAL}}getGLTextureType(e){const{gl:t}=this;let r;return r=!0===e.isCubeTexture?t.TEXTURE_CUBE_MAP:!0===e.isDataArrayTexture||!0===e.isCompressedArrayTexture?t.TEXTURE_2D_ARRAY:!0===e.isData3DTexture?t.TEXTURE_3D:t.TEXTURE_2D,r}getInternalFormat(e,t,r,s,i=!1){const{gl:n,extensions:a}=this;if(null!==e){if(void 0!==n[e])return n[e];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+e+"'")}let o=t;return t===n.RED&&(r===n.FLOAT&&(o=n.R32F),r===n.HALF_FLOAT&&(o=n.R16F),r===n.UNSIGNED_BYTE&&(o=n.R8),r===n.UNSIGNED_SHORT&&(o=n.R16),r===n.UNSIGNED_INT&&(o=n.R32UI),r===n.BYTE&&(o=n.R8I),r===n.SHORT&&(o=n.R16I),r===n.INT&&(o=n.R32I)),t===n.RED_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.R8UI),r===n.UNSIGNED_SHORT&&(o=n.R16UI),r===n.UNSIGNED_INT&&(o=n.R32UI),r===n.BYTE&&(o=n.R8I),r===n.SHORT&&(o=n.R16I),r===n.INT&&(o=n.R32I)),t===n.RG&&(r===n.FLOAT&&(o=n.RG32F),r===n.HALF_FLOAT&&(o=n.RG16F),r===n.UNSIGNED_BYTE&&(o=n.RG8),r===n.UNSIGNED_SHORT&&(o=n.RG16),r===n.UNSIGNED_INT&&(o=n.RG32UI),r===n.BYTE&&(o=n.RG8I),r===n.SHORT&&(o=n.RG16I),r===n.INT&&(o=n.RG32I)),t===n.RG_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RG8UI),r===n.UNSIGNED_SHORT&&(o=n.RG16UI),r===n.UNSIGNED_INT&&(o=n.RG32UI),r===n.BYTE&&(o=n.RG8I),r===n.SHORT&&(o=n.RG16I),r===n.INT&&(o=n.RG32I)),t===n.RGB&&(r===n.FLOAT&&(o=n.RGB32F),r===n.HALF_FLOAT&&(o=n.RGB16F),r===n.UNSIGNED_BYTE&&(o=n.RGB8),r===n.UNSIGNED_SHORT&&(o=n.RGB16),r===n.UNSIGNED_INT&&(o=n.RGB32UI),r===n.BYTE&&(o=n.RGB8I),r===n.SHORT&&(o=n.RGB16I),r===n.INT&&(o=n.RGB32I),r===n.UNSIGNED_BYTE&&(o=s===z&&!1===i?n.SRGB8:n.RGB8),r===n.UNSIGNED_SHORT_5_6_5&&(o=n.RGB565),r===n.UNSIGNED_SHORT_5_5_5_1&&(o=n.RGB5_A1),r===n.UNSIGNED_SHORT_4_4_4_4&&(o=n.RGB4),r===n.UNSIGNED_INT_5_9_9_9_REV&&(o=n.RGB9_E5)),t===n.RGB_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RGB8UI),r===n.UNSIGNED_SHORT&&(o=n.RGB16UI),r===n.UNSIGNED_INT&&(o=n.RGB32UI),r===n.BYTE&&(o=n.RGB8I),r===n.SHORT&&(o=n.RGB16I),r===n.INT&&(o=n.RGB32I)),t===n.RGBA&&(r===n.FLOAT&&(o=n.RGBA32F),r===n.HALF_FLOAT&&(o=n.RGBA16F),r===n.UNSIGNED_BYTE&&(o=n.RGBA8),r===n.UNSIGNED_SHORT&&(o=n.RGBA16),r===n.UNSIGNED_INT&&(o=n.RGBA32UI),r===n.BYTE&&(o=n.RGBA8I),r===n.SHORT&&(o=n.RGBA16I),r===n.INT&&(o=n.RGBA32I),r===n.UNSIGNED_BYTE&&(o=s===z&&!1===i?n.SRGB8_ALPHA8:n.RGBA8),r===n.UNSIGNED_SHORT_4_4_4_4&&(o=n.RGBA4),r===n.UNSIGNED_SHORT_5_5_5_1&&(o=n.RGB5_A1)),t===n.RGBA_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RGBA8UI),r===n.UNSIGNED_SHORT&&(o=n.RGBA16UI),r===n.UNSIGNED_INT&&(o=n.RGBA32UI),r===n.BYTE&&(o=n.RGBA8I),r===n.SHORT&&(o=n.RGBA16I),r===n.INT&&(o=n.RGBA32I)),t===n.DEPTH_COMPONENT&&(r===n.UNSIGNED_SHORT&&(o=n.DEPTH_COMPONENT16),r===n.UNSIGNED_INT&&(o=n.DEPTH_COMPONENT24),r===n.FLOAT&&(o=n.DEPTH_COMPONENT32F)),t===n.DEPTH_STENCIL&&r===n.UNSIGNED_INT_24_8&&(o=n.DEPTH24_STENCIL8),o!==n.R16F&&o!==n.R32F&&o!==n.RG16F&&o!==n.RG32F&&o!==n.RGBA16F&&o!==n.RGBA32F||a.get("EXT_color_buffer_float"),o}setTextureParameters(e,t){const{gl:r,extensions:s,backend:i}=this;r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,t.flipY),r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,t.premultiplyAlpha),r.pixelStorei(r.UNPACK_ALIGNMENT,t.unpackAlignment),r.pixelStorei(r.UNPACK_COLORSPACE_CONVERSION_WEBGL,r.NONE),r.texParameteri(e,r.TEXTURE_WRAP_S,Ov[t.wrapS]),r.texParameteri(e,r.TEXTURE_WRAP_T,Ov[t.wrapT]),e!==r.TEXTURE_3D&&e!==r.TEXTURE_2D_ARRAY||r.texParameteri(e,r.TEXTURE_WRAP_R,Ov[t.wrapR]),r.texParameteri(e,r.TEXTURE_MAG_FILTER,Gv[t.magFilter]);const n=void 0!==t.mipmaps&&t.mipmaps.length>0,a=t.minFilter===q&&n?B:t.minFilter;if(r.texParameteri(e,r.TEXTURE_MIN_FILTER,Gv[a]),t.compareFunction&&(r.texParameteri(e,r.TEXTURE_COMPARE_MODE,r.COMPARE_REF_TO_TEXTURE),r.texParameteri(e,r.TEXTURE_COMPARE_FUNC,kv[t.compareFunction])),!0===s.has("EXT_texture_filter_anisotropic")){if(t.magFilter===_)return;if(t.minFilter!==ke&&t.minFilter!==B)return;if(t.type===L&&!1===s.has("OES_texture_float_linear"))return;if(t.anisotropy>1){const n=s.get("EXT_texture_filter_anisotropic");r.texParameterf(e,n.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(t.anisotropy,i.getMaxAnisotropy()))}}}createDefaultTexture(e){const{gl:t,backend:r,defaultTextures:s}=this,i=this.getGLTextureType(e);let n=s[i];void 0===n&&(n=t.createTexture(),r.state.bindTexture(i,n),t.texParameteri(i,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(i,t.TEXTURE_MAG_FILTER,t.NEAREST),s[i]=n),r.set(e,{textureGPU:n,glTextureType:i,isDefault:!0})}createTexture(e,t){const{gl:r,backend:s}=this,{levels:i,width:n,height:a,depth:o}=t,u=s.utils.convert(e.format,e.colorSpace),l=s.utils.convert(e.type),d=this.getInternalFormat(e.internalFormat,u,l,e.colorSpace,e.isVideoTexture),c=r.createTexture(),h=this.getGLTextureType(e);s.state.bindTexture(h,c),this.setTextureParameters(h,e),e.isDataArrayTexture||e.isCompressedArrayTexture?r.texStorage3D(r.TEXTURE_2D_ARRAY,i,d,n,a,o):e.isData3DTexture?r.texStorage3D(r.TEXTURE_3D,i,d,n,a,o):e.isVideoTexture||r.texStorage2D(h,i,d,n,a),s.set(e,{textureGPU:c,glTextureType:h,glFormat:u,glType:l,glInternalFormat:d})}copyBufferToTexture(e,t){const{gl:r,backend:s}=this,{textureGPU:i,glTextureType:n,glFormat:a,glType:o}=s.get(t),{width:u,height:l}=t.source.data;r.bindBuffer(r.PIXEL_UNPACK_BUFFER,e),s.state.bindTexture(n,i),r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,!1),r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1),r.texSubImage2D(n,0,0,0,u,l,a,o,0),r.bindBuffer(r.PIXEL_UNPACK_BUFFER,null),s.state.unbindTexture()}updateTexture(e,t){const{gl:r}=this,{width:s,height:i}=t,{textureGPU:n,glTextureType:a,glFormat:o,glType:u,glInternalFormat:l}=this.backend.get(e);if(e.isRenderTargetTexture||void 0===n)return;const d=e=>e.isDataTexture?e.image.data:"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap||e instanceof OffscreenCanvas?e:e.data;if(this.backend.state.bindTexture(a,n),this.setTextureParameters(a,e),e.isCompressedTexture){const s=e.mipmaps,i=t.image;for(let t=0;t0,c=t.renderTarget?t.renderTarget.height:this.backend.getDrawingBufferSize().y;if(d){const r=0!==a||0!==o;let d,h;if(!0===e.isDepthTexture?(d=s.DEPTH_BUFFER_BIT,h=s.DEPTH_ATTACHMENT,t.stencil&&(d|=s.STENCIL_BUFFER_BIT)):(d=s.COLOR_BUFFER_BIT,h=s.COLOR_ATTACHMENT0),r){const e=this.backend.get(t.renderTarget),r=e.framebuffers[t.getCacheKey()],h=e.msaaFrameBuffer;i.bindFramebuffer(s.DRAW_FRAMEBUFFER,r),i.bindFramebuffer(s.READ_FRAMEBUFFER,h);const p=c-o-l;s.blitFramebuffer(a,p,a+u,p+l,a,p,a+u,p+l,d,s.NEAREST),i.bindFramebuffer(s.READ_FRAMEBUFFER,r),i.bindTexture(s.TEXTURE_2D,n),s.copyTexSubImage2D(s.TEXTURE_2D,0,0,0,a,p,u,l),i.unbindTexture()}else{const e=s.createFramebuffer();i.bindFramebuffer(s.DRAW_FRAMEBUFFER,e),s.framebufferTexture2D(s.DRAW_FRAMEBUFFER,h,s.TEXTURE_2D,n,0),s.blitFramebuffer(0,0,u,l,0,0,u,l,d,s.NEAREST),s.deleteFramebuffer(e)}}else i.bindTexture(s.TEXTURE_2D,n),s.copyTexSubImage2D(s.TEXTURE_2D,0,0,0,a,c-l-o,u,l),i.unbindTexture();e.generateMipmaps&&this.generateMipmaps(e),this.backend._setFramebuffer(t)}setupRenderBufferStorage(e,t,r,s=!1){const{gl:i}=this,n=t.renderTarget,{depthTexture:a,depthBuffer:o,stencilBuffer:u,width:l,height:d}=n;if(i.bindRenderbuffer(i.RENDERBUFFER,e),o&&!u){let t=i.DEPTH_COMPONENT24;if(!0===s){this.extensions.get("WEBGL_multisampled_render_to_texture").renderbufferStorageMultisampleEXT(i.RENDERBUFFER,n.samples,t,l,d)}else r>0?(a&&a.isDepthTexture&&a.type===i.FLOAT&&(t=i.DEPTH_COMPONENT32F),i.renderbufferStorageMultisample(i.RENDERBUFFER,r,t,l,d)):i.renderbufferStorage(i.RENDERBUFFER,t,l,d);i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_ATTACHMENT,i.RENDERBUFFER,e)}else o&&u&&(r>0?i.renderbufferStorageMultisample(i.RENDERBUFFER,r,i.DEPTH24_STENCIL8,l,d):i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_STENCIL,l,d),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_STENCIL_ATTACHMENT,i.RENDERBUFFER,e))}async copyTextureToBuffer(e,t,r,s,i,n){const{backend:a,gl:o}=this,{textureGPU:u,glFormat:l,glType:d}=this.backend.get(e),c=o.createFramebuffer();o.bindFramebuffer(o.READ_FRAMEBUFFER,c);const h=e.isCubeTexture?o.TEXTURE_CUBE_MAP_POSITIVE_X+n:o.TEXTURE_2D;o.framebufferTexture2D(o.READ_FRAMEBUFFER,o.COLOR_ATTACHMENT0,h,u,0);const p=this._getTypedArrayType(d),g=s*i*this._getBytesPerTexel(d,l),m=o.createBuffer();o.bindBuffer(o.PIXEL_PACK_BUFFER,m),o.bufferData(o.PIXEL_PACK_BUFFER,g,o.STREAM_READ),o.readPixels(t,r,s,i,l,d,0),o.bindBuffer(o.PIXEL_PACK_BUFFER,null),await a.utils._clientWaitAsync();const f=new p(g/p.BYTES_PER_ELEMENT);return o.bindBuffer(o.PIXEL_PACK_BUFFER,m),o.getBufferSubData(o.PIXEL_PACK_BUFFER,0,f),o.bindBuffer(o.PIXEL_PACK_BUFFER,null),o.deleteFramebuffer(c),f}_getTypedArrayType(e){const{gl:t}=this;if(e===t.UNSIGNED_BYTE)return Uint8Array;if(e===t.UNSIGNED_SHORT_4_4_4_4)return Uint16Array;if(e===t.UNSIGNED_SHORT_5_5_5_1)return Uint16Array;if(e===t.UNSIGNED_SHORT_5_6_5)return Uint16Array;if(e===t.UNSIGNED_SHORT)return Uint16Array;if(e===t.UNSIGNED_INT)return Uint32Array;if(e===t.HALF_FLOAT)return Uint16Array;if(e===t.FLOAT)return Float32Array;throw new Error(`Unsupported WebGL type: ${e}`)}_getBytesPerTexel(e,t){const{gl:r}=this;let s=0;return e===r.UNSIGNED_BYTE&&(s=1),e!==r.UNSIGNED_SHORT_4_4_4_4&&e!==r.UNSIGNED_SHORT_5_5_5_1&&e!==r.UNSIGNED_SHORT_5_6_5&&e!==r.UNSIGNED_SHORT&&e!==r.HALF_FLOAT||(s=2),e!==r.UNSIGNED_INT&&e!==r.FLOAT||(s=4),t===r.RGBA?4*s:t===r.RGB?3*s:t===r.ALPHA?s:void 0}}class Hv{constructor(e){this.backend=e,this.gl=this.backend.gl,this.availableExtensions=this.gl.getSupportedExtensions(),this.extensions={}}get(e){let t=this.extensions[e];return void 0===t&&(t=this.gl.getExtension(e),this.extensions[e]=t),t}has(e){return this.availableExtensions.includes(e)}}class Wv{constructor(e){this.backend=e,this.maxAnisotropy=null}getMaxAnisotropy(){if(null!==this.maxAnisotropy)return this.maxAnisotropy;const e=this.backend.gl,t=this.backend.extensions;if(!0===t.has("EXT_texture_filter_anisotropic")){const r=t.get("EXT_texture_filter_anisotropic");this.maxAnisotropy=e.getParameter(r.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else this.maxAnisotropy=0;return this.maxAnisotropy}}const jv={WEBGL_multi_draw:"WEBGL_multi_draw",WEBGL_compressed_texture_astc:"texture-compression-astc",WEBGL_compressed_texture_etc:"texture-compression-etc2",WEBGL_compressed_texture_etc1:"texture-compression-etc1",WEBGL_compressed_texture_pvrtc:"texture-compression-pvrtc",WEBKIT_WEBGL_compressed_texture_pvrtc:"texture-compression-pvrtc",WEBGL_compressed_texture_s3tc:"texture-compression-bc",EXT_texture_compression_bptc:"texture-compression-bptc",EXT_disjoint_timer_query_webgl2:"timestamp-query"};class qv{constructor(e){this.gl=e.gl,this.extensions=e.extensions,this.info=e.renderer.info,this.mode=null,this.index=0,this.type=null,this.object=null}render(e,t){const{gl:r,mode:s,object:i,type:n,info:a,index:o}=this;0!==o?r.drawElements(s,t,n,e):r.drawArrays(s,e,t),a.update(i,t,1)}renderInstances(e,t,r){const{gl:s,mode:i,type:n,index:a,object:o,info:u}=this;0!==r&&(0!==a?s.drawElementsInstanced(i,t,n,e,r):s.drawArraysInstanced(i,e,t,r),u.update(o,t,r))}renderMultiDraw(e,t,r){const{extensions:s,mode:i,object:n,info:a}=this;if(0===r)return;const o=s.get("WEBGL_multi_draw");if(null===o)for(let s=0;sthis.maxQueries)return ht(`WebGPUTimestampQueryPool [${this.type}]: Maximum number of queries exceeded, when using trackTimestamp it is necessary to resolves the queries via renderer.resolveTimestampsAsync( THREE.TimestampQuery.${this.type.toUpperCase()} ).`),null;const t=this.currentQueryIndex;return this.currentQueryIndex+=2,this.queryStates.set(t,"inactive"),this.queryOffsets.set(e.id,t),t}beginQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e.id);if(null==t)return;if(null!==this.activeQuery)return;const r=this.queries[t];if(r)try{"inactive"===this.queryStates.get(t)&&(this.gl.beginQuery(this.ext.TIME_ELAPSED_EXT,r),this.activeQuery=t,this.queryStates.set(t,"started"))}catch(e){console.error("Error in beginQuery:",e),this.activeQuery=null,this.queryStates.set(t,"inactive")}}endQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e.id);if(null!=t&&this.activeQuery===t)try{this.gl.endQuery(this.ext.TIME_ELAPSED_EXT),this.queryStates.set(t,"ended"),this.activeQuery=null}catch(e){console.error("Error in endQuery:",e),this.queryStates.set(t,"inactive"),this.activeQuery=null}}async resolveQueriesAsync(){if(!this.trackTimestamp||this.pendingResolve)return this.lastValue;this.pendingResolve=!0;try{const e=[];for(const[t,r]of this.queryStates)if("ended"===r){const r=this.queries[t];e.push(this.resolveQuery(r))}if(0===e.length)return this.lastValue;const t=(await Promise.all(e)).reduce(((e,t)=>e+t),0);return this.lastValue=t,this.currentQueryIndex=0,this.queryOffsets.clear(),this.queryStates.clear(),this.activeQuery=null,t}catch(e){return console.error("Error resolving queries:",e),this.lastValue}finally{this.pendingResolve=!1}}async resolveQuery(e){return new Promise((t=>{if(this.isDisposed)return void t(this.lastValue);let r,s=!1;const i=e=>{s||(s=!0,r&&(clearTimeout(r),r=null),t(e))},n=()=>{if(this.isDisposed)i(this.lastValue);else try{if(this.gl.getParameter(this.ext.GPU_DISJOINT_EXT))return void i(this.lastValue);if(!this.gl.getQueryParameter(e,this.gl.QUERY_RESULT_AVAILABLE))return void(r=setTimeout(n,1));const s=this.gl.getQueryParameter(e,this.gl.QUERY_RESULT);t(Number(s)/1e6)}catch(e){console.error("Error checking query:",e),t(this.lastValue)}};n()}))}dispose(){if(!this.isDisposed&&(this.isDisposed=!0,this.trackTimestamp)){for(const e of this.queries)this.gl.deleteQuery(e);this.queries=[],this.queryStates.clear(),this.queryOffsets.clear(),this.lastValue=0,this.activeQuery=null}}}class Yv extends Pv{constructor(e={}){super(e),this.isWebGLBackend=!0,this.attributeUtils=null,this.extensions=null,this.capabilities=null,this.textureUtils=null,this.bufferRenderer=null,this.gl=null,this.state=null,this.utils=null,this.vaoCache={},this.transformFeedbackCache={},this.discard=!1,this.disjoint=null,this.parallel=null,this._currentContext=null,this._knownBindings=new WeakSet,this._supportsInvalidateFramebuffer="undefined"!=typeof navigator&&/OculusBrowser/g.test(navigator.userAgent),this._xrFramebuffer=null}init(e){super.init(e);const t=this.parameters,r={antialias:e.samples>0,alpha:!0,depth:e.depth,stencil:e.stencil},s=void 0!==t.context?t.context:e.domElement.getContext("webgl2",r);function i(t){t.preventDefault();const r={api:"WebGL",message:t.statusMessage||"Unknown reason",reason:null,originalEvent:t};e.onDeviceLost(r)}this._onContextLost=i,e.domElement.addEventListener("webglcontextlost",i,!1),this.gl=s,this.extensions=new Hv(this),this.capabilities=new Wv(this),this.attributeUtils=new Dv(this),this.textureUtils=new $v(this),this.bufferRenderer=new qv(this),this.state=new Vv(this),this.utils=new Uv(this),this.extensions.get("EXT_color_buffer_float"),this.extensions.get("WEBGL_clip_cull_distance"),this.extensions.get("OES_texture_float_linear"),this.extensions.get("EXT_color_buffer_half_float"),this.extensions.get("WEBGL_multisampled_render_to_texture"),this.extensions.get("WEBGL_render_shared_exponent"),this.extensions.get("WEBGL_multi_draw"),this.disjoint=this.extensions.get("EXT_disjoint_timer_query_webgl2"),this.parallel=this.extensions.get("KHR_parallel_shader_compile")}get coordinateSystem(){return l}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}async waitForGPU(){await this.utils._clientWaitAsync()}async makeXRCompatible(){!0!==this.gl.getContextAttributes().xrCompatible&&await this.gl.makeXRCompatible()}setXRTarget(e){this._xrFramebuffer=e}setXRRenderTargetTextures(e,t,r=null){const s=this.gl;if(this.set(e.texture,{textureGPU:t,glInternalFormat:s.RGBA8}),null!==r){const t=e.stencilBuffer?s.DEPTH24_STENCIL8:s.DEPTH_COMPONENT24;this.set(e.depthTexture,{textureGPU:r,glInternalFormat:t}),!0===this.extensions.has("WEBGL_multisampled_render_to_texture")&&e.autoAllocateDepthBuffer&&console.warn("THREE.WebGLBackend: Render-to-texture extension was disabled because an external texture was provided"),e.autoAllocateDepthBuffer=!1}}initTimestampQuery(e){if(!this.disjoint||!this.trackTimestamp)return;const t=e.isComputeNode?"compute":"render";this.timestampQueryPool[t]||(this.timestampQueryPool[t]=new Kv(this.gl,t,2048));const r=this.timestampQueryPool[t];null!==r.allocateQueriesForContext(e)&&r.beginQuery(e)}prepareTimestampBuffer(e){if(!this.disjoint||!this.trackTimestamp)return;const t=e.isComputeNode?"compute":"render";this.timestampQueryPool[t].endQuery(e)}getContext(){return this.gl}beginRender(e){const{state:t,gl:r}=this,s=this.get(e);if(e.viewport?this.updateViewport(e):t.viewport(0,0,r.drawingBufferWidth,r.drawingBufferHeight),e.scissor){const{x:r,y:s,width:i,height:n}=e.scissorValue;t.scissor(r,e.height-n-s,i,n)}this.initTimestampQuery(e),s.previousContext=this._currentContext,this._currentContext=e,this._setFramebuffer(e),this.clear(e.clearColor,e.clearDepth,e.clearStencil,e,!1);const i=e.occlusionQueryCount;i>0&&(s.currentOcclusionQueries=s.occlusionQueries,s.currentOcclusionQueryObjects=s.occlusionQueryObjects,s.lastOcclusionObject=null,s.occlusionQueries=new Array(i),s.occlusionQueryObjects=new Array(i),s.occlusionQueryIndex=0)}finishRender(e){const{gl:t,state:r}=this,s=this.get(e),i=s.previousContext;r.resetVertexState();const n=e.occlusionQueryCount;n>0&&(n>s.occlusionQueryIndex&&t.endQuery(t.ANY_SAMPLES_PASSED),this.resolveOccludedAsync(e));const a=e.textures;if(null!==a)for(let e=0;e0&&!1===this._useMultisampledRTT(e.renderTarget)){const i=s.framebuffers[e.getCacheKey()],n=t.COLOR_BUFFER_BIT,a=s.msaaFrameBuffer,o=e.textures;r.bindFramebuffer(t.READ_FRAMEBUFFER,a),r.bindFramebuffer(t.DRAW_FRAMEBUFFER,i);for(let r=0;r{let a=0;for(let t=0;t{t.isBatchedMesh?null!==t._multiDrawInstances?(ht("THREE.WebGLBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection."),y.renderMultiDrawInstances(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount,t._multiDrawInstances)):this.hasFeature("WEBGL_multi_draw")?y.renderMultiDraw(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount):ht("THREE.WebGLRenderer: WEBGL_multi_draw not supported."):b>1?y.renderInstances(T,x,b):y.render(T,x)};if(e.camera.isArrayCamera&&e.camera.cameras.length>0){const r=this.get(e.camera),s=e.camera.cameras,i=e.getBindingGroup("cameraIndex").bindings[0];if(void 0===r.indexesGPU||r.indexesGPU.length!==s.length){const e=new Uint32Array([0,0,0,0]),t=[];for(let r=0,i=s.length;r{const i=this.parallel,n=()=>{r.getProgramParameter(a,i.COMPLETION_STATUS_KHR)?(this._completeCompile(e,s),t()):requestAnimationFrame(n)};n()}));t.push(i)}else this._completeCompile(e,s)}_handleSource(e,t){const r=e.split("\n"),s=[],i=Math.max(t-6,0),n=Math.min(t+6,r.length);for(let e=i;e":" "} ${i}: ${r[e]}`)}return s.join("\n")}_getShaderErrors(e,t,r){const s=e.getShaderParameter(t,e.COMPILE_STATUS),i=e.getShaderInfoLog(t).trim();if(s&&""===i)return"";const n=/ERROR: 0:(\d+)/.exec(i);if(n){const s=parseInt(n[1]);return r.toUpperCase()+"\n\n"+i+"\n\n"+this._handleSource(e.getShaderSource(t),s)}return i}_logProgramError(e,t,r){if(this.renderer.debug.checkShaderErrors){const s=this.gl,i=s.getProgramInfoLog(e).trim();if(!1===s.getProgramParameter(e,s.LINK_STATUS))if("function"==typeof this.renderer.debug.onShaderError)this.renderer.debug.onShaderError(s,e,r,t);else{const n=this._getShaderErrors(s,r,"vertex"),a=this._getShaderErrors(s,t,"fragment");console.error("THREE.WebGLProgram: Shader Error "+s.getError()+" - VALIDATE_STATUS "+s.getProgramParameter(e,s.VALIDATE_STATUS)+"\n\nProgram Info Log: "+i+"\n"+n+"\n"+a)}else""!==i&&console.warn("THREE.WebGLProgram: Program Info Log:",i)}}_completeCompile(e,t){const{state:r,gl:s}=this,i=this.get(t),{programGPU:n,fragmentShader:a,vertexShader:o}=i;!1===s.getProgramParameter(n,s.LINK_STATUS)&&this._logProgramError(n,a,o),r.useProgram(n);const u=e.getBindings();this._setupBindings(u,n),this.set(t,{programGPU:n})}createComputePipeline(e,t){const{state:r,gl:s}=this,i={stage:"fragment",code:"#version 300 es\nprecision highp float;\nvoid main() {}"};this.createProgram(i);const{computeProgram:n}=e,a=s.createProgram(),o=this.get(i).shaderGPU,u=this.get(n).shaderGPU,l=n.transforms,d=[],c=[];for(let e=0;ejv[t]===e)),r=this.extensions;for(let e=0;e0&&!1===y){if(void 0===g){const s=[];g=t.createFramebuffer(),r.bindFramebuffer(t.FRAMEBUFFER,g);const i=[],l=e.textures;for(let r=0;r0&&!0===this.extensions.has("WEBGL_multisampled_render_to_texture")&&!1!==e.autoAllocateDepthBuffer}dispose(){const e=this.extensions.get("WEBGL_lose_context");e&&e.loseContext(),this.renderer.domElement.removeEventListener("webglcontextlost",this._onContextLost)}}const Qv="point-list",Zv="line-list",Jv="line-strip",eN="triangle-list",tN="triangle-strip",rN="never",sN="less",iN="equal",nN="less-equal",aN="greater",oN="not-equal",uN="greater-equal",lN="always",dN="store",cN="load",hN="clear",pN="ccw",gN="none",mN="front",fN="back",yN="uint16",xN="uint32",bN="r8unorm",TN="r8snorm",_N="r8uint",vN="r8sint",NN="r16uint",SN="r16sint",EN="r16float",wN="rg8unorm",AN="rg8snorm",RN="rg8uint",CN="rg8sint",MN="r32uint",PN="r32sint",LN="r32float",FN="rg16uint",BN="rg16sint",IN="rg16float",DN="rgba8unorm",VN="rgba8unorm-srgb",UN="rgba8snorm",ON="rgba8uint",GN="rgba8sint",kN="bgra8unorm",zN="bgra8unorm-srgb",$N="rgb9e5ufloat",HN="rgb10a2unorm",WN="rgb10a2unorm",jN="rg32uint",qN="rg32sint",XN="rg32float",KN="rgba16uint",YN="rgba16sint",QN="rgba16float",ZN="rgba32uint",JN="rgba32sint",eS="rgba32float",tS="depth16unorm",rS="depth24plus",sS="depth24plus-stencil8",iS="depth32float",nS="depth32float-stencil8",aS="bc1-rgba-unorm",oS="bc1-rgba-unorm-srgb",uS="bc2-rgba-unorm",lS="bc2-rgba-unorm-srgb",dS="bc3-rgba-unorm",cS="bc3-rgba-unorm-srgb",hS="bc4-r-unorm",pS="bc4-r-snorm",gS="bc5-rg-unorm",mS="bc5-rg-snorm",fS="bc6h-rgb-ufloat",yS="bc6h-rgb-float",xS="bc7-rgba-unorm",bS="bc7-rgba-srgb",TS="etc2-rgb8unorm",_S="etc2-rgb8unorm-srgb",vS="etc2-rgb8a1unorm",NS="etc2-rgb8a1unorm-srgb",SS="etc2-rgba8unorm",ES="etc2-rgba8unorm-srgb",wS="eac-r11unorm",AS="eac-r11snorm",RS="eac-rg11unorm",CS="eac-rg11snorm",MS="astc-4x4-unorm",PS="astc-4x4-unorm-srgb",LS="astc-5x4-unorm",FS="astc-5x4-unorm-srgb",BS="astc-5x5-unorm",IS="astc-5x5-unorm-srgb",DS="astc-6x5-unorm",VS="astc-6x5-unorm-srgb",US="astc-6x6-unorm",OS="astc-6x6-unorm-srgb",GS="astc-8x5-unorm",kS="astc-8x5-unorm-srgb",zS="astc-8x6-unorm",$S="astc-8x6-unorm-srgb",HS="astc-8x8-unorm",WS="astc-8x8-unorm-srgb",jS="astc-10x5-unorm",qS="astc-10x5-unorm-srgb",XS="astc-10x6-unorm",KS="astc-10x6-unorm-srgb",YS="astc-10x8-unorm",QS="astc-10x8-unorm-srgb",ZS="astc-10x10-unorm",JS="astc-10x10-unorm-srgb",eE="astc-12x10-unorm",tE="astc-12x10-unorm-srgb",rE="astc-12x12-unorm",sE="astc-12x12-unorm-srgb",iE="clamp-to-edge",nE="repeat",aE="mirror-repeat",oE="linear",uE="nearest",lE="zero",dE="one",cE="src",hE="one-minus-src",pE="src-alpha",gE="one-minus-src-alpha",mE="dst",fE="one-minus-dst",yE="dst-alpha",xE="one-minus-dst-alpha",bE="src-alpha-saturated",TE="constant",_E="one-minus-constant",vE="add",NE="subtract",SE="reverse-subtract",EE="min",wE="max",AE=0,RE=15,CE="keep",ME="zero",PE="replace",LE="invert",FE="increment-clamp",BE="decrement-clamp",IE="increment-wrap",DE="decrement-wrap",VE="storage",UE="read-only-storage",OE="write-only",GE="read-only",kE="read-write",zE="float",$E="unfilterable-float",HE="depth",WE="sint",jE="uint",qE="2d",XE="3d",KE="2d",YE="2d-array",QE="cube",ZE="3d",JE="all",ew="vertex",tw="instance",rw={DepthClipControl:"depth-clip-control",Depth32FloatStencil8:"depth32float-stencil8",TextureCompressionBC:"texture-compression-bc",TextureCompressionETC2:"texture-compression-etc2",TextureCompressionASTC:"texture-compression-astc",TimestampQuery:"timestamp-query",IndirectFirstInstance:"indirect-first-instance",ShaderF16:"shader-f16",RG11B10UFloat:"rg11b10ufloat-renderable",BGRA8UNormStorage:"bgra8unorm-storage",Float32Filterable:"float32-filterable",ClipDistances:"clip-distances",DualSourceBlending:"dual-source-blending",Subgroups:"subgroups"};class sw extends cv{constructor(e,t){super(e),this.texture=t,this.version=t?t.version:0,this.isSampler=!0}}class iw extends sw{constructor(e,t,r){super(e,t?t.value:null),this.textureNode=t,this.groupNode=r}update(){this.texture=this.textureNode.value}}class nw extends hv{constructor(e,t){super(e,t?t.array:null),this.attribute=t,this.isStorageBuffer=!0}}let aw=0;class ow extends nw{constructor(e,t){super("StorageBuffer_"+aw++,e?e.value:null),this.nodeUniform=e,this.access=e?e.access:Vs.READ_WRITE,this.groupNode=t}get buffer(){return this.nodeUniform.value}}class uw extends Im{constructor(e){super(),this.device=e;this.mipmapSampler=e.createSampler({minFilter:oE}),this.flipYSampler=e.createSampler({minFilter:uE}),this.transferPipelines={},this.flipYPipelines={},this.mipmapVertexShaderModule=e.createShaderModule({label:"mipmapVertex",code:"\nstruct VarysStruct {\n\t@builtin( position ) Position: vec4,\n\t@location( 0 ) vTex : vec2\n};\n\n@vertex\nfn main( @builtin( vertex_index ) vertexIndex : u32 ) -> VarysStruct {\n\n\tvar Varys : VarysStruct;\n\n\tvar pos = array< vec2, 4 >(\n\t\tvec2( -1.0, 1.0 ),\n\t\tvec2( 1.0, 1.0 ),\n\t\tvec2( -1.0, -1.0 ),\n\t\tvec2( 1.0, -1.0 )\n\t);\n\n\tvar tex = array< vec2, 4 >(\n\t\tvec2( 0.0, 0.0 ),\n\t\tvec2( 1.0, 0.0 ),\n\t\tvec2( 0.0, 1.0 ),\n\t\tvec2( 1.0, 1.0 )\n\t);\n\n\tVarys.vTex = tex[ vertexIndex ];\n\tVarys.Position = vec4( pos[ vertexIndex ], 0.0, 1.0 );\n\n\treturn Varys;\n\n}\n"}),this.mipmapFragmentShaderModule=e.createShaderModule({label:"mipmapFragment",code:"\n@group( 0 ) @binding( 0 )\nvar imgSampler : sampler;\n\n@group( 0 ) @binding( 1 )\nvar img : texture_2d;\n\n@fragment\nfn main( @location( 0 ) vTex : vec2 ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( img, imgSampler, vTex );\n\n}\n"}),this.flipYFragmentShaderModule=e.createShaderModule({label:"flipYFragment",code:"\n@group( 0 ) @binding( 0 )\nvar imgSampler : sampler;\n\n@group( 0 ) @binding( 1 )\nvar img : texture_2d;\n\n@fragment\nfn main( @location( 0 ) vTex : vec2 ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( img, imgSampler, vec2( vTex.x, 1.0 - vTex.y ) );\n\n}\n"})}getTransferPipeline(e){let t=this.transferPipelines[e];return void 0===t&&(t=this.device.createRenderPipeline({label:`mipmap-${e}`,vertex:{module:this.mipmapVertexShaderModule,entryPoint:"main"},fragment:{module:this.mipmapFragmentShaderModule,entryPoint:"main",targets:[{format:e}]},primitive:{topology:tN,stripIndexFormat:xN},layout:"auto"}),this.transferPipelines[e]=t),t}getFlipYPipeline(e){let t=this.flipYPipelines[e];return void 0===t&&(t=this.device.createRenderPipeline({label:`flipY-${e}`,vertex:{module:this.mipmapVertexShaderModule,entryPoint:"main"},fragment:{module:this.flipYFragmentShaderModule,entryPoint:"main",targets:[{format:e}]},primitive:{topology:tN,stripIndexFormat:xN},layout:"auto"}),this.flipYPipelines[e]=t),t}flipY(e,t,r=0){const s=t.format,{width:i,height:n}=t.size,a=this.getTransferPipeline(s),o=this.getFlipYPipeline(s),u=this.device.createTexture({size:{width:i,height:n,depthOrArrayLayers:1},format:s,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING}),l=e.createView({baseMipLevel:0,mipLevelCount:1,dimension:KE,baseArrayLayer:r}),d=u.createView({baseMipLevel:0,mipLevelCount:1,dimension:KE,baseArrayLayer:0}),c=this.device.createCommandEncoder({}),h=(e,t,r)=>{const s=e.getBindGroupLayout(0),i=this.device.createBindGroup({layout:s,entries:[{binding:0,resource:this.flipYSampler},{binding:1,resource:t}]}),n=c.beginRenderPass({colorAttachments:[{view:r,loadOp:hN,storeOp:dN,clearValue:[0,0,0,0]}]});n.setPipeline(e),n.setBindGroup(0,i),n.draw(4,1,0,0),n.end()};h(a,l,d),h(o,d,l),this.device.queue.submit([c.finish()]),u.destroy()}generateMipmaps(e,t,r=0){const s=this.get(e);void 0===s.useCount&&(s.useCount=0,s.layers=[]);const i=s.layers[r]||this._mipmapCreateBundles(e,t,r),n=this.device.createCommandEncoder({});this._mipmapRunBundles(n,i),this.device.queue.submit([n.finish()]),0!==s.useCount&&(s.layers[r]=i),s.useCount++}_mipmapCreateBundles(e,t,r){const s=this.getTransferPipeline(t.format),i=s.getBindGroupLayout(0);let n=e.createView({baseMipLevel:0,mipLevelCount:1,dimension:KE,baseArrayLayer:r});const a=[];for(let o=1;o1;for(let a=0;a]*\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/i,gw=/([a-z_0-9]+)\s*:\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/gi,mw={f32:"float",i32:"int",u32:"uint",bool:"bool","vec2":"vec2","vec2":"ivec2","vec2":"uvec2","vec2":"bvec2",vec2f:"vec2",vec2i:"ivec2",vec2u:"uvec2",vec2b:"bvec2","vec3":"vec3","vec3":"ivec3","vec3":"uvec3","vec3":"bvec3",vec3f:"vec3",vec3i:"ivec3",vec3u:"uvec3",vec3b:"bvec3","vec4":"vec4","vec4":"ivec4","vec4":"uvec4","vec4":"bvec4",vec4f:"vec4",vec4i:"ivec4",vec4u:"uvec4",vec4b:"bvec4","mat2x2":"mat2",mat2x2f:"mat2","mat3x3":"mat3",mat3x3f:"mat3","mat4x4":"mat4",mat4x4f:"mat4",sampler:"sampler",texture_1d:"texture",texture_2d:"texture",texture_2d_array:"texture",texture_multisampled_2d:"cubeTexture",texture_depth_2d:"depthTexture",texture_depth_multisampled_2d:"depthTexture",texture_3d:"texture3D",texture_cube:"cubeTexture",texture_cube_array:"cubeTexture",texture_storage_1d:"storageTexture",texture_storage_2d:"storageTexture",texture_storage_2d_array:"storageTexture",texture_storage_3d:"storageTexture"};class fw extends C_{constructor(e){const{type:t,inputs:r,name:s,inputsCode:i,blockCode:n,outputType:a}=(e=>{const t=(e=e.trim()).match(pw);if(null!==t&&4===t.length){const r=t[2],s=[];let i=null;for(;null!==(i=gw.exec(r));)s.push({name:i[1],type:i[2]});const n=[];for(let e=0;e "+this.outputType:"";return`fn ${e} ( ${this.inputsCode.trim()} ) ${t}`+this.blockCode}}class yw extends R_{parseFunction(e){return new fw(e)}}const xw="undefined"!=typeof self?self.GPUShaderStage:{VERTEX:1,FRAGMENT:2,COMPUTE:4},bw={[Vs.READ_ONLY]:"read",[Vs.WRITE_ONLY]:"write",[Vs.READ_WRITE]:"read_write"},Tw={[Sr]:"repeat",[Nr]:"clamp",[vr]:"mirror"},_w={vertex:xw?xw.VERTEX:1,fragment:xw?xw.FRAGMENT:2,compute:xw?xw.COMPUTE:4},vw={instance:!0,swizzleAssign:!1,storageBuffer:!0},Nw={"^^":"tsl_xor"},Sw={float:"f32",int:"i32",uint:"u32",bool:"bool",color:"vec3",vec2:"vec2",ivec2:"vec2",uvec2:"vec2",bvec2:"vec2",vec3:"vec3",ivec3:"vec3",uvec3:"vec3",bvec3:"vec3",vec4:"vec4",ivec4:"vec4",uvec4:"vec4",bvec4:"vec4",mat2:"mat2x2",mat3:"mat3x3",mat4:"mat4x4"},Ew={},ww={tsl_xor:new px("fn tsl_xor( a : bool, b : bool ) -> bool { return ( a || b ) && !( a && b ); }"),mod_float:new px("fn tsl_mod_float( x : f32, y : f32 ) -> f32 { return x - y * floor( x / y ); }"),mod_vec2:new px("fn tsl_mod_vec2( x : vec2f, y : vec2f ) -> vec2f { return x - y * floor( x / y ); }"),mod_vec3:new px("fn tsl_mod_vec3( x : vec3f, y : vec3f ) -> vec3f { return x - y * floor( x / y ); }"),mod_vec4:new px("fn tsl_mod_vec4( x : vec4f, y : vec4f ) -> vec4f { return x - y * floor( x / y ); }"),equals_bool:new px("fn tsl_equals_bool( a : bool, b : bool ) -> bool { return a == b; }"),equals_bvec2:new px("fn tsl_equals_bvec2( a : vec2f, b : vec2f ) -> vec2 { return vec2( a.x == b.x, a.y == b.y ); }"),equals_bvec3:new px("fn tsl_equals_bvec3( a : vec3f, b : vec3f ) -> vec3 { return vec3( a.x == b.x, a.y == b.y, a.z == b.z ); }"),equals_bvec4:new px("fn tsl_equals_bvec4( a : vec4f, b : vec4f ) -> vec4 { return vec4( a.x == b.x, a.y == b.y, a.z == b.z, a.w == b.w ); }"),repeatWrapping_float:new px("fn tsl_repeatWrapping_float( coord: f32 ) -> f32 { return fract( coord ); }"),mirrorWrapping_float:new px("fn tsl_mirrorWrapping_float( coord: f32 ) -> f32 { let mirrored = fract( coord * 0.5 ) * 2.0; return 1.0 - abs( 1.0 - mirrored ); }"),clampWrapping_float:new px("fn tsl_clampWrapping_float( coord: f32 ) -> f32 { return clamp( coord, 0.0, 1.0 ); }"),biquadraticTexture:new px("\nfn tsl_biquadraticTexture( map : texture_2d, coord : vec2f, iRes : vec2u, level : u32 ) -> vec4f {\n\n\tlet res = vec2f( iRes );\n\n\tlet uvScaled = coord * res;\n\tlet uvWrapping = ( ( uvScaled % res ) + res ) % res;\n\n\t// https://www.shadertoy.com/view/WtyXRy\n\n\tlet uv = uvWrapping - 0.5;\n\tlet iuv = floor( uv );\n\tlet f = fract( uv );\n\n\tlet rg1 = textureLoad( map, vec2u( iuv + vec2( 0.5, 0.5 ) ) % iRes, level );\n\tlet rg2 = textureLoad( map, vec2u( iuv + vec2( 1.5, 0.5 ) ) % iRes, level );\n\tlet rg3 = textureLoad( map, vec2u( iuv + vec2( 0.5, 1.5 ) ) % iRes, level );\n\tlet rg4 = textureLoad( map, vec2u( iuv + vec2( 1.5, 1.5 ) ) % iRes, level );\n\n\treturn mix( mix( rg1, rg2, f.x ), mix( rg3, rg4, f.x ), f.y );\n\n}\n")},Aw={dFdx:"dpdx",dFdy:"- dpdy",mod_float:"tsl_mod_float",mod_vec2:"tsl_mod_vec2",mod_vec3:"tsl_mod_vec3",mod_vec4:"tsl_mod_vec4",equals_bool:"tsl_equals_bool",equals_bvec2:"tsl_equals_bvec2",equals_bvec3:"tsl_equals_bvec3",equals_bvec4:"tsl_equals_bvec4",inversesqrt:"inverseSqrt",bitcast:"bitcast"};"undefined"!=typeof navigator&&/Windows/g.test(navigator.userAgent)&&(ww.pow_float=new px("fn tsl_pow_float( a : f32, b : f32 ) -> f32 { return select( -pow( -a, b ), pow( a, b ), a > 0.0 ); }"),ww.pow_vec2=new px("fn tsl_pow_vec2( a : vec2f, b : vec2f ) -> vec2f { return vec2f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ) ); }",[ww.pow_float]),ww.pow_vec3=new px("fn tsl_pow_vec3( a : vec3f, b : vec3f ) -> vec3f { return vec3f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ), tsl_pow_float( a.z, b.z ) ); }",[ww.pow_float]),ww.pow_vec4=new px("fn tsl_pow_vec4( a : vec4f, b : vec4f ) -> vec4f { return vec4f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ), tsl_pow_float( a.z, b.z ), tsl_pow_float( a.w, b.w ) ); }",[ww.pow_float]),Aw.pow_float="tsl_pow_float",Aw.pow_vec2="tsl_pow_vec2",Aw.pow_vec3="tsl_pow_vec3",Aw.pow_vec4="tsl_pow_vec4");let Rw="";!0!==("undefined"!=typeof navigator&&/Firefox|Deno/g.test(navigator.userAgent))&&(Rw+="diagnostic( off, derivative_uniformity );\n");class Cw extends m_{constructor(e,t){super(e,t,new yw),this.uniformGroups={},this.builtins={},this.directives={},this.scopedArrays=new Map}needsToWorkingColorSpace(e){return!0===e.isVideoTexture&&e.colorSpace!==x}_generateTextureSample(e,t,r,s,i=this.shaderStage){return"fragment"===i?s?`textureSample( ${t}, ${t}_sampler, ${r}, ${s} )`:`textureSample( ${t}, ${t}_sampler, ${r} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r):this.generateTextureLod(e,t,r,s,"0")}_generateVideoSample(e,t,r=this.shaderStage){if("fragment"===r)return`textureSampleBaseClampToEdge( ${e}, ${e}_sampler, vec2( ${t}.x, 1.0 - ${t}.y ) )`;console.error(`WebGPURenderer: THREE.VideoTexture does not support ${r} shader.`)}_generateTextureSampleLevel(e,t,r,s,i,n=this.shaderStage){return"fragment"!==n&&"compute"!==n||!1!==this.isUnfilterable(e)?this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,s):this.generateTextureLod(e,t,r,i,s):`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`}generateWrapFunction(e){const t=`tsl_coord_${Tw[e.wrapS]}S_${Tw[e.wrapT]}_${e.isData3DTexture?"3d":"2d"}T`;let r=Ew[t];if(void 0===r){const s=[],i=e.isData3DTexture?"vec3f":"vec2f";let n=`fn ${t}( coord : ${i} ) -> ${i} {\n\n\treturn ${i}(\n`;const a=(e,t)=>{e===Sr?(s.push(ww.repeatWrapping_float),n+=`\t\ttsl_repeatWrapping_float( coord.${t} )`):e===Nr?(s.push(ww.clampWrapping_float),n+=`\t\ttsl_clampWrapping_float( coord.${t} )`):e===vr?(s.push(ww.mirrorWrapping_float),n+=`\t\ttsl_mirrorWrapping_float( coord.${t} )`):(n+=`\t\tcoord.${t}`,console.warn(`WebGPURenderer: Unsupported texture wrap type "${e}" for vertex shader.`))};a(e.wrapS,"x"),n+=",\n",a(e.wrapT,"y"),e.isData3DTexture&&(n+=",\n",a(e.wrapR,"z")),n+="\n\t);\n\n}\n",Ew[t]=r=new px(n,s)}return r.build(this),t}generateArrayDeclaration(e,t){return`array< ${this.getType(e)}, ${t} >`}generateTextureDimension(e,t,r){const s=this.getDataFromNode(e,this.shaderStage,this.globalCache);void 0===s.dimensionsSnippet&&(s.dimensionsSnippet={});let i=s.dimensionsSnippet[r];if(void 0===s.dimensionsSnippet[r]){let n,a;const{primarySamples:o}=this.renderer.backend.utils.getTextureSampleData(e),u=o>1;a=e.isData3DTexture?"vec3":"vec2",n=u||e.isVideoTexture||e.isStorageTexture?t:`${t}${r?`, u32( ${r} )`:""}`,i=new Wo(new Cu(`textureDimensions( ${n} )`,a)),s.dimensionsSnippet[r]=i,(e.isDataArrayTexture||e.isData3DTexture)&&(s.arrayLayerCount=new Wo(new Cu(`textureNumLayers(${t})`,"u32"))),e.isTextureCube&&(s.cubeFaceCount=new Wo(new Cu("6u","u32")))}return i.build(this)}generateFilteredTexture(e,t,r,s="0u"){this._include("biquadraticTexture");return`tsl_biquadraticTexture( ${t}, ${this.generateWrapFunction(e)}( ${r} ), ${this.generateTextureDimension(e,t,s)}, u32( ${s} ) )`}generateTextureLod(e,t,r,s,i="0u"){const n=this.generateWrapFunction(e),a=this.generateTextureDimension(e,t,i),o=e.isData3DTexture?"vec3":"vec2",u=`${o}(${n}(${r}) * ${o}(${a}))`;return this.generateTextureLoad(e,t,u,s,i)}generateTextureLoad(e,t,r,s,i="0u"){return!0===e.isVideoTexture||!0===e.isStorageTexture?`textureLoad( ${t}, ${r} )`:s?`textureLoad( ${t}, ${r}, ${s}, u32( ${i} ) )`:`textureLoad( ${t}, ${r}, u32( ${i} ) )`}generateTextureStore(e,t,r,s){return`textureStore( ${t}, ${r}, ${s} )`}isSampleCompare(e){return!0===e.isDepthTexture&&null!==e.compareFunction}isUnfilterable(e){return"float"!==this.getComponentTypeFromTexture(e)||!this.isAvailable("float32Filterable")&&!0===e.isDataTexture&&e.type===L||!1===this.isSampleCompare(e)&&e.minFilter===_&&e.magFilter===_||this.renderer.backend.utils.getTextureSampleData(e).primarySamples>1}generateTexture(e,t,r,s,i=this.shaderStage){let n=null;return n=!0===e.isVideoTexture?this._generateVideoSample(t,r,i):this.isUnfilterable(e)?this.generateTextureLod(e,t,r,s,"0",i):this._generateTextureSample(e,t,r,s,i),n}generateTextureGrad(e,t,r,s,i,n=this.shaderStage){if("fragment"===n)return`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${s[0]}, ${s[1]} )`;console.error(`WebGPURenderer: THREE.TextureNode.gradient() does not support ${n} shader.`)}generateTextureCompare(e,t,r,s,i,n=this.shaderStage){if("fragment"===n)return`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${s} )`;console.error(`WebGPURenderer: THREE.DepthTexture.compareFunction() does not support ${n} shader.`)}generateTextureLevel(e,t,r,s,i,n=this.shaderStage){let a=null;return a=!0===e.isVideoTexture?this._generateVideoSample(t,r,n):this._generateTextureSampleLevel(e,t,r,s,i,n),a}generateTextureBias(e,t,r,s,i,n=this.shaderStage){if("fragment"===n)return`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${s} )`;console.error(`WebGPURenderer: THREE.TextureNode.biasNode does not support ${n} shader.`)}getPropertyName(e,t=this.shaderStage){if(!0===e.isNodeVarying&&!0===e.needsInterpolation){if("vertex"===t)return`varyings.${e.name}`}else if(!0===e.isNodeUniform){const t=e.name,r=e.type;return"texture"===r||"cubeTexture"===r||"storageTexture"===r||"texture3D"===r?t:"buffer"===r||"storageBuffer"===r||"indirectStorageBuffer"===r?this.isCustomStruct(e)?t:t+".value":e.groupNode.name+"."+t}return super.getPropertyName(e)}getOutputStructName(){return"output"}getFunctionOperator(e){const t=Nw[e];return void 0!==t?(this._include(t),t):null}getNodeAccess(e,t){return"compute"!==t?Vs.READ_ONLY:e.access}getStorageAccess(e,t){return bw[this.getNodeAccess(e,t)]}getUniformFromNode(e,t,r,s=null){const i=super.getUniformFromNode(e,t,r,s),n=this.getDataFromNode(e,r,this.globalCache);if(void 0===n.uniformGPU){let a;const o=e.groupNode,u=o.name,l=this.getBindGroupArray(u,r);if("texture"===t||"cubeTexture"===t||"storageTexture"===t||"texture3D"===t){let s=null;const n=this.getNodeAccess(e,r);if("texture"===t||"storageTexture"===t?s=new _v(i.name,i.node,o,n):"cubeTexture"===t?s=new vv(i.name,i.node,o,n):"texture3D"===t&&(s=new Nv(i.name,i.node,o,n)),s.store=!0===e.isStorageTextureNode,s.setVisibility(_w[r]),"fragment"!==r&&"compute"!==r||!1!==this.isUnfilterable(e.value)||!1!==s.store)l.push(s),a=[s];else{const e=new iw(`${i.name}_sampler`,i.node,o);e.setVisibility(_w[r]),l.push(e,s),a=[e,s]}}else if("buffer"===t||"storageBuffer"===t||"indirectStorageBuffer"===t){const n=new("buffer"===t?mv:ow)(e,o);n.setVisibility(_w[r]),l.push(n),a=n,i.name=s||"NodeBuffer_"+i.id}else{const e=this.uniformGroups[r]||(this.uniformGroups[r]={});let s=e[u];void 0===s&&(s=new xv(u,o),s.setVisibility(_w[r]),e[u]=s,l.push(s)),a=this.getNodeUniform(i,t),s.addUniform(a)}n.uniformGPU=a}return i}getBuiltin(e,t,r,s=this.shaderStage){const i=this.builtins[s]||(this.builtins[s]=new Map);return!1===i.has(e)&&i.set(e,{name:e,property:t,type:r}),t}hasBuiltin(e,t=this.shaderStage){return void 0!==this.builtins[t]&&this.builtins[t].has(e)}getVertexIndex(){return"vertex"===this.shaderStage?this.getBuiltin("vertex_index","vertexIndex","u32","attribute"):"vertexIndex"}buildFunctionCode(e){const t=e.layout,r=this.flowShaderNode(e),s=[];for(const e of t.inputs)s.push(e.name+" : "+this.getType(e.type));let i=`fn ${t.name}( ${s.join(", ")} ) -> ${this.getType(t.type)} {\n${r.vars}\n${r.code}\n`;return r.result&&(i+=`\treturn ${r.result};\n`),i+="\n}\n",i}getInstanceIndex(){return"vertex"===this.shaderStage?this.getBuiltin("instance_index","instanceIndex","u32","attribute"):"instanceIndex"}getInvocationLocalIndex(){return this.getBuiltin("local_invocation_index","invocationLocalIndex","u32","attribute")}getSubgroupSize(){return this.enableSubGroups(),this.getBuiltin("subgroup_size","subgroupSize","u32","attribute")}getInvocationSubgroupIndex(){return this.enableSubGroups(),this.getBuiltin("subgroup_invocation_id","invocationSubgroupIndex","u32","attribute")}getSubgroupIndex(){return this.enableSubGroups(),this.getBuiltin("subgroup_id","subgroupIndex","u32","attribute")}getDrawIndex(){return null}getFrontFacing(){return this.getBuiltin("front_facing","isFront","bool")}getFragCoord(){return this.getBuiltin("position","fragCoord","vec4")+".xy"}getFragDepth(){return"output."+this.getBuiltin("frag_depth","depth","f32","output")}getClipDistance(){return"varyings.hw_clip_distances"}isFlipY(){return!1}enableDirective(e,t=this.shaderStage){(this.directives[t]||(this.directives[t]=new Set)).add(e)}getDirectives(e){const t=[],r=this.directives[e];if(void 0!==r)for(const e of r)t.push(`enable ${e};`);return t.join("\n")}enableSubGroups(){this.enableDirective("subgroups")}enableSubgroupsF16(){this.enableDirective("subgroups-f16")}enableClipDistances(){this.enableDirective("clip_distances")}enableShaderF16(){this.enableDirective("f16")}enableDualSourceBlending(){this.enableDirective("dual_source_blending")}enableHardwareClipping(e){this.enableClipDistances(),this.getBuiltin("clip_distances","hw_clip_distances",`array`,"vertex")}getBuiltins(e){const t=[],r=this.builtins[e];if(void 0!==r)for(const{name:e,property:s,type:i}of r.values())t.push(`@builtin( ${e} ) ${s} : ${i}`);return t.join(",\n\t")}getScopedArray(e,t,r,s){return!1===this.scopedArrays.has(e)&&this.scopedArrays.set(e,{name:e,scope:t,bufferType:r,bufferCount:s}),e}getScopedArrays(e){if("compute"!==e)return;const t=[];for(const{name:e,scope:r,bufferType:s,bufferCount:i}of this.scopedArrays.values()){const n=this.getType(s);t.push(`var<${r}> ${e}: array< ${n}, ${i} >;`)}return t.join("\n")}getAttributes(e){const t=[];if("compute"===e&&(this.getBuiltin("global_invocation_id","globalId","vec3","attribute"),this.getBuiltin("workgroup_id","workgroupId","vec3","attribute"),this.getBuiltin("local_invocation_id","localId","vec3","attribute"),this.getBuiltin("num_workgroups","numWorkgroups","vec3","attribute"),this.renderer.hasFeature("subgroups")&&(this.enableDirective("subgroups",e),this.getBuiltin("subgroup_size","subgroupSize","u32","attribute"))),"vertex"===e||"compute"===e){const e=this.getBuiltins("attribute");e&&t.push(e);const r=this.getAttributesArray();for(let e=0,s=r.length;e"),t.push(`\t${s+r.name} : ${i}`)}return e.output&&t.push(`\t${this.getBuiltins("output")}`),t.join(",\n")}getStructs(e){let t="";const r=this.structs[e];if(r.length>0){const e=[];for(const t of r){let r=`struct ${t.name} {\n`;r+=this.getStructMembers(t),r+="\n};",e.push(r)}t="\n"+e.join("\n\n")+"\n"}return t}getVar(e,t,r=null){let s=`var ${t} : `;return s+=null!==r?this.generateArrayDeclaration(e,r):this.getType(e),s}getVars(e){const t=[],r=this.vars[e];if(void 0!==r)for(const e of r)t.push(`\t${this.getVar(e.type,e.name,e.count)};`);return`\n${t.join("\n")}\n`}getVaryings(e){const t=[];if("vertex"===e&&this.getBuiltin("position","Vertex","vec4","vertex"),"vertex"===e||"fragment"===e){const r=this.varyings,s=this.vars[e];for(let i=0;i1&&(n="_multisampled"),!0===t.isCubeTexture)s="texture_cube";else if(!0===t.isDataArrayTexture||!0===t.isCompressedArrayTexture)s="texture_2d_array";else if(!0===t.isDepthTexture)s=`texture_depth${n}_2d`;else if(!0===t.isVideoTexture)s="texture_external";else if(!0===t.isData3DTexture)s="texture_3d";else if(!0===i.node.isStorageTextureNode){s=`texture_storage_2d<${hw(t)}, ${this.getStorageAccess(i.node,e)}>`}else{s=`texture${n}_2d<${this.getComponentTypeFromTexture(t).charAt(0)}32>`}r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name} : ${s};`)}else if("buffer"===i.type||"storageBuffer"===i.type||"indirectStorageBuffer"===i.type){const t=i.node,r=this.getType(t.getNodeType(this)),n=t.bufferCount,o=n>0&&"buffer"===i.type?", "+n:"",u=t.isStorageBufferNode?`storage, ${this.getStorageAccess(t,e)}`:"uniform";if(this.isCustomStruct(i))s.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var<${u}> ${i.name} : ${r};`);else{const e=`\tvalue : array< ${t.isAtomic?`atomic<${r}>`:`${r}`}${o} >`;s.push(this._getWGSLStructBinding(i.name,e,u,a.binding++,a.group))}}else{const e=this.getType(this.getVectorType(i.type)),t=i.groupNode.name;(n[t]||(n[t]={index:a.binding++,id:a.group,snippets:[]})).snippets.push(`\t${i.name} : ${e}`)}}for(const e in n){const t=n[e];i.push(this._getWGSLStructBinding(e,t.snippets.join(",\n"),"uniform",t.index,t.id))}let a=r.join("\n");return a+=s.join("\n"),a+=i.join("\n"),a}buildCode(){const e=null!==this.material?{fragment:{},vertex:{}}:{compute:{}};this.sortBindingGroups();for(const t in e){this.shaderStage=t;const r=e[t];r.uniforms=this.getUniforms(t),r.attributes=this.getAttributes(t),r.varyings=this.getVaryings(t),r.structs=this.getStructs(t),r.vars=this.getVars(t),r.codes=this.getCodes(t),r.directives=this.getDirectives(t),r.scopedArrays=this.getScopedArrays(t);let s="// code\n\n";s+=this.flowCode[t];const i=this.flowNodes[t],n=i[i.length-1],a=n.outputNode,o=void 0!==a&&!0===a.isOutputStructNode;for(const e of i){const i=this.getFlowData(e),u=e.name;if(u&&(s.length>0&&(s+="\n"),s+=`\t// flow -> ${u}\n`),s+=`${i.code}\n\t`,e===n&&"compute"!==t)if(s+="// result\n\n\t","vertex"===t)s+=`varyings.Vertex = ${i.result};`;else if("fragment"===t)if(o)r.returnType=a.getNodeType(this),r.structs+="var output : "+r.returnType+";",s+=`return ${i.result};`;else{let e="\t@location(0) color: vec4";const t=this.getBuiltins("output");t&&(e+=",\n\t"+t),r.returnType="OutputStruct",r.structs+=this._getWGSLStruct("OutputStruct",e),r.structs+="\nvar output : OutputStruct;",s+=`output.color = ${i.result};\n\n\treturn output;`}}r.flow=s}this.shaderStage=null,null!==this.material?(this.vertexShader=this._getWGSLVertexCode(e.vertex),this.fragmentShader=this._getWGSLFragmentCode(e.fragment)):this.computeShader=this._getWGSLComputeCode(e.compute,(this.object.workgroupSize||[64]).join(", "))}getMethod(e,t=null){let r;return null!==t&&(r=this._getWGSLMethod(e+"_"+t)),void 0===r&&(r=this._getWGSLMethod(e)),r||e}getType(e){return Sw[e]||e}isAvailable(e){let t=vw[e];return void 0===t&&("float32Filterable"===e?t=this.renderer.hasFeature("float32-filterable"):"clipDistance"===e&&(t=this.renderer.hasFeature("clip-distances")),vw[e]=t),t}_getWGSLMethod(e){return void 0!==ww[e]&&this._include(e),Aw[e]}_include(e){const t=ww[e];return t.build(this),null!==this.currentFunctionNode&&this.currentFunctionNode.includes.push(t),t}_getWGSLVertexCode(e){return`${this.getSignature()}\n// directives\n${e.directives}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\n\n// varyings\n${e.varyings}\nvar varyings : VaryingsStruct;\n\n// codes\n${e.codes}\n\n@vertex\nfn main( ${e.attributes} ) -> VaryingsStruct {\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n\treturn varyings;\n\n}\n`}_getWGSLFragmentCode(e){return`${this.getSignature()}\n// global\n${Rw}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\n\n// codes\n${e.codes}\n\n@fragment\nfn main( ${e.varyings} ) -> ${e.returnType} {\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n}\n`}_getWGSLComputeCode(e,t){return`${this.getSignature()}\n// directives\n${e.directives}\n\n// system\nvar instanceIndex : u32;\n\n// locals\n${e.scopedArrays}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\n\n// codes\n${e.codes}\n\n@compute @workgroup_size( ${t} )\nfn main( ${e.attributes} ) {\n\n\t// system\n\tinstanceIndex = globalId.x + globalId.y * numWorkgroups.x * u32(${t}) + globalId.z * numWorkgroups.x * numWorkgroups.y * u32(${t});\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n}\n`}_getWGSLStruct(e,t){return`\nstruct ${e} {\n${t}\n};`}_getWGSLStructBinding(e,t,r,s=0,i=0){const n=e+"Struct";return`${this._getWGSLStruct(n,t)}\n@binding( ${s} ) @group( ${i} )\nvar<${r}> ${e} : ${n};`}}class Mw{constructor(e){this.backend=e}getCurrentDepthStencilFormat(e){let t;return null!==e.depthTexture?t=this.getTextureFormatGPU(e.depthTexture):e.depth&&e.stencil?t=sS:e.depth&&(t=rS),t}getTextureFormatGPU(e){return this.backend.get(e).format}getTextureSampleData(e){let t;if(e.isFramebufferTexture)t=1;else if(e.isDepthTexture&&!e.renderTarget){const e=this.backend.renderer,r=e.getRenderTarget();t=r?r.samples:e.samples}else e.renderTarget&&(t=e.renderTarget.samples);t=t||1;const r=t>1&&null!==e.renderTarget&&!0!==e.isDepthTexture&&!0!==e.isFramebufferTexture;return{samples:t,primarySamples:r?1:t,isMSAA:r}}getCurrentColorFormat(e){let t;return t=null!==e.textures?this.getTextureFormatGPU(e.textures[0]):this.getPreferredCanvasFormat(),t}getCurrentColorSpace(e){return null!==e.textures?e.textures[0].colorSpace:this.backend.renderer.outputColorSpace}getPrimitiveTopology(e,t){return e.isPoints?Qv:e.isLineSegments||e.isMesh&&!0===t.wireframe?Zv:e.isLine?Jv:e.isMesh?eN:void 0}getSampleCount(e){let t=1;return e>1&&(t=Math.pow(2,Math.floor(Math.log2(e))),2===t&&(t=4)),t}getSampleCountRenderContext(e){return null!==e.textures?this.getSampleCount(e.sampleCount):this.getSampleCount(this.backend.renderer.samples)}getPreferredCanvasFormat(){const e=this.backend.parameters.outputType;if(void 0===e)return navigator.gpu.getPreferredCanvasFormat();if(e===Ce)return kN;if(e===he)return QN;throw new Error("Unsupported outputType")}}const Pw=new Map([[Int8Array,["sint8","snorm8"]],[Uint8Array,["uint8","unorm8"]],[Int16Array,["sint16","snorm16"]],[Uint16Array,["uint16","unorm16"]],[Int32Array,["sint32","snorm32"]],[Uint32Array,["uint32","unorm32"]],[Float32Array,["float32"]]]),Lw=new Map([[ze,["float16"]]]),Fw=new Map([[Int32Array,"sint32"],[Int16Array,"sint32"],[Uint32Array,"uint32"],[Uint16Array,"uint32"],[Float32Array,"float32"]]);class Bw{constructor(e){this.backend=e}createAttribute(e,t){const r=this._getBufferAttribute(e),s=this.backend,i=s.get(r);let n=i.buffer;if(void 0===n){const a=s.device;let o=r.array;if(!1===e.normalized)if(o.constructor===Int16Array||o.constructor===Int8Array)o=new Int32Array(o);else if((o.constructor===Uint16Array||o.constructor===Uint8Array)&&(o=new Uint32Array(o),t&GPUBufferUsage.INDEX))for(let e=0;e1&&(s.multisampled=!0,r.texture.isDepthTexture||(s.sampleType=$E)),r.texture.isDepthTexture)s.sampleType=HE;else if(r.texture.isDataTexture||r.texture.isDataArrayTexture||r.texture.isData3DTexture){const e=r.texture.type;e===T?s.sampleType=WE:e===b?s.sampleType=jE:e===L&&(this.backend.hasFeature("float32-filterable")?s.sampleType=zE:s.sampleType=$E)}r.isSampledCubeTexture?s.viewDimension=QE:r.texture.isDataArrayTexture||r.texture.isCompressedArrayTexture?s.viewDimension=YE:r.isSampledTexture3D&&(s.viewDimension=ZE),e.texture=s}else console.error(`WebGPUBindingUtils: Unsupported binding "${r}".`);s.push(e)}return r.createBindGroupLayout({entries:s})}createBindings(e,t,r,s=0){const{backend:i,bindGroupLayoutCache:n}=this,a=i.get(e);let o,u=n.get(e.bindingsReference);void 0===u&&(u=this.createBindingsLayout(e),n.set(e.bindingsReference,u)),r>0&&(void 0===a.groups&&(a.groups=[],a.versions=[]),a.versions[r]===s&&(o=a.groups[r])),void 0===o&&(o=this.createBindGroup(e,u),r>0&&(a.groups[r]=o,a.versions[r]=s)),a.group=o,a.layout=u}updateBinding(e){const t=this.backend,r=t.device,s=e.buffer,i=t.get(e).buffer;r.queue.writeBuffer(i,0,s,0)}createBindGroupIndex(e,t){const r=this.backend.device,s=GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,i=e[0],n=r.createBuffer({label:"bindingCameraIndex_"+i,size:16,usage:s});r.queue.writeBuffer(n,0,e,0);const a=[{binding:0,resource:{buffer:n}}];return r.createBindGroup({label:"bindGroupCameraIndex_"+i,layout:t,entries:a})}createBindGroup(e,t){const r=this.backend,s=r.device;let i=0;const n=[];for(const t of e.bindings){if(t.isUniformBuffer){const e=r.get(t);if(void 0===e.buffer){const r=t.byteLength,i=GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,n=s.createBuffer({label:"bindingBuffer_"+t.name,size:r,usage:i});e.buffer=n}n.push({binding:i,resource:{buffer:e.buffer}})}else if(t.isStorageBuffer){const e=r.get(t);if(void 0===e.buffer){const s=t.attribute;e.buffer=r.get(s).buffer}n.push({binding:i,resource:{buffer:e.buffer}})}else if(t.isSampler){const e=r.get(t.texture);n.push({binding:i,resource:e.sampler})}else if(t.isSampledTexture){const e=r.get(t.texture);let a;if(void 0!==e.externalTexture)a=s.importExternalTexture({source:e.externalTexture});else{const r=t.store?1:e.texture.mipLevelCount,s=`view-${e.texture.width}-${e.texture.height}-${r}`;if(a=e[s],void 0===a){const i=JE;let n;n=t.isSampledCubeTexture?QE:t.isSampledTexture3D?ZE:t.texture.isDataArrayTexture||t.texture.isCompressedArrayTexture?YE:KE,a=e[s]=e.texture.createView({aspect:i,dimension:n,mipLevelCount:r})}}n.push({binding:i,resource:a})}i++}return s.createBindGroup({label:"bindGroup_"+e.name,layout:t,entries:n})}}class Dw{constructor(e){this.backend=e}_getSampleCount(e){return this.backend.utils.getSampleCountRenderContext(e)}createRenderPipeline(e,t){const{object:r,material:s,geometry:i,pipeline:n}=e,{vertexProgram:a,fragmentProgram:o}=n,u=this.backend,l=u.device,d=u.utils,c=u.get(n),h=[];for(const t of e.getBindings()){const e=u.get(t);h.push(e.layout)}const p=u.attributeUtils.createShaderVertexBuffers(e);let g;!0===s.transparent&&s.blending!==G&&(g=this._getBlending(s));let m={};!0===s.stencilWrite&&(m={compare:this._getStencilCompare(s),failOp:this._getStencilOperation(s.stencilFail),depthFailOp:this._getStencilOperation(s.stencilZFail),passOp:this._getStencilOperation(s.stencilZPass)});const f=this._getColorWriteMask(s),y=[];if(null!==e.context.textures){const t=e.context.textures;for(let e=0;e1},layout:l.createPipelineLayout({bindGroupLayouts:h})},E={},w=e.context.depth,A=e.context.stencil;if(!0!==w&&!0!==A||(!0===w&&(E.format=v,E.depthWriteEnabled=s.depthWrite,E.depthCompare=_),!0===A&&(E.stencilFront=m,E.stencilBack={},E.stencilReadMask=s.stencilFuncMask,E.stencilWriteMask=s.stencilWriteMask),!0===s.polygonOffset&&(E.depthBias=s.polygonOffsetUnits,E.depthBiasSlopeScale=s.polygonOffsetFactor,E.depthBiasClamp=0),S.depthStencil=E),null===t)c.pipeline=l.createRenderPipeline(S);else{const e=new Promise((e=>{l.createRenderPipelineAsync(S).then((t=>{c.pipeline=t,e()}))}));t.push(e)}}createBundleEncoder(e){const t=this.backend,{utils:r,device:s}=t,i=r.getCurrentDepthStencilFormat(e),n={label:"renderBundleEncoder",colorFormats:[r.getCurrentColorFormat(e)],depthStencilFormat:i,sampleCount:this._getSampleCount(e)};return s.createRenderBundleEncoder(n)}createComputePipeline(e,t){const r=this.backend,s=r.device,i=r.get(e.computeProgram).module,n=r.get(e),a=[];for(const e of t){const t=r.get(e);a.push(t.layout)}n.pipeline=s.createComputePipeline({compute:i,layout:s.createPipelineLayout({bindGroupLayouts:a})})}_getBlending(e){let t,r;const s=e.blending,i=e.blendSrc,n=e.blendDst,a=e.blendEquation;if(s===qe){const s=null!==e.blendSrcAlpha?e.blendSrcAlpha:i,o=null!==e.blendDstAlpha?e.blendDstAlpha:n,u=null!==e.blendEquationAlpha?e.blendEquationAlpha:a;t={srcFactor:this._getBlendFactor(i),dstFactor:this._getBlendFactor(n),operation:this._getBlendOperation(a)},r={srcFactor:this._getBlendFactor(s),dstFactor:this._getBlendFactor(o),operation:this._getBlendOperation(u)}}else{const i=(e,s,i,n)=>{t={srcFactor:e,dstFactor:s,operation:vE},r={srcFactor:i,dstFactor:n,operation:vE}};if(e.premultipliedAlpha)switch(s){case V:i(dE,gE,dE,gE);break;case Pt:i(dE,dE,dE,dE);break;case Mt:i(lE,hE,lE,dE);break;case Ct:i(lE,cE,lE,pE)}else switch(s){case V:i(pE,gE,dE,gE);break;case Pt:i(pE,dE,pE,dE);break;case Mt:i(lE,hE,lE,dE);break;case Ct:i(lE,cE,lE,cE)}}if(void 0!==t&&void 0!==r)return{color:t,alpha:r};console.error("THREE.WebGPURenderer: Invalid blending: ",s)}_getBlendFactor(e){let t;switch(e){case Ke:t=lE;break;case Et:t=dE;break;case St:t=cE;break;case bt:t=hE;break;case Nt:t=pE;break;case xt:t=gE;break;case _t:t=mE;break;case yt:t=fE;break;case Tt:t=yE;break;case ft:t=xE;break;case vt:t=bE;break;case 211:t=TE;break;case 212:t=_E;break;default:console.error("THREE.WebGPURenderer: Blend factor not supported.",e)}return t}_getStencilCompare(e){let t;const r=e.stencilFunc;switch(r){case Gr:t=rN;break;case Or:t=lN;break;case Ur:t=sN;break;case Vr:t=nN;break;case Dr:t=iN;break;case Ir:t=uN;break;case Br:t=aN;break;case Fr:t=oN;break;default:console.error("THREE.WebGPURenderer: Invalid stencil function.",r)}return t}_getStencilOperation(e){let t;switch(e){case Xr:t=CE;break;case qr:t=ME;break;case jr:t=PE;break;case Wr:t=LE;break;case Hr:t=FE;break;case $r:t=BE;break;case zr:t=IE;break;case kr:t=DE;break;default:console.error("THREE.WebGPURenderer: Invalid stencil operation.",t)}return t}_getBlendOperation(e){let t;switch(e){case Xe:t=vE;break;case mt:t=NE;break;case gt:t=SE;break;case Yr:t=EE;break;case Kr:t=wE;break;default:console.error("THREE.WebGPUPipelineUtils: Blend equation not supported.",e)}return t}_getPrimitiveState(e,t,r){const s={},i=this.backend.utils;switch(s.topology=i.getPrimitiveTopology(e,r),null!==t.index&&!0===e.isLine&&!0!==e.isLineSegments&&(s.stripIndexFormat=t.index.array instanceof Uint16Array?yN:xN),r.side){case je:s.frontFace=pN,s.cullMode=fN;break;case N:s.frontFace=pN,s.cullMode=mN;break;case Se:s.frontFace=pN,s.cullMode=gN;break;default:console.error("THREE.WebGPUPipelineUtils: Unknown material.side value.",r.side)}return s}_getColorWriteMask(e){return!0===e.colorWrite?RE:AE}_getDepthCompare(e){let t;if(!1===e.depthTest)t=lN;else{const r=e.depthFunc;switch(r){case Ot:t=rN;break;case Ut:t=lN;break;case Vt:t=sN;break;case Dt:t=nN;break;case It:t=iN;break;case Bt:t=uN;break;case Ft:t=aN;break;case Lt:t=oN;break;default:console.error("THREE.WebGPUPipelineUtils: Invalid depth function.",r)}}return t}}class Vw extends Xv{constructor(e,t,r=2048){super(r),this.device=e,this.type=t,this.querySet=this.device.createQuerySet({type:"timestamp",count:this.maxQueries,label:`queryset_global_timestamp_${t}`});const s=8*this.maxQueries;this.resolveBuffer=this.device.createBuffer({label:`buffer_timestamp_resolve_${t}`,size:s,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC}),this.resultBuffer=this.device.createBuffer({label:`buffer_timestamp_result_${t}`,size:s,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ})}allocateQueriesForContext(e){if(!this.trackTimestamp||this.isDisposed)return null;if(this.currentQueryIndex+2>this.maxQueries)return ht(`WebGPUTimestampQueryPool [${this.type}]: Maximum number of queries exceeded, when using trackTimestamp it is necessary to resolves the queries via renderer.resolveTimestampsAsync( THREE.TimestampQuery.${this.type.toUpperCase()} ).`),null;const t=this.currentQueryIndex;return this.currentQueryIndex+=2,this.queryOffsets.set(e.id,t),t}async resolveQueriesAsync(){if(!this.trackTimestamp||0===this.currentQueryIndex||this.isDisposed)return this.lastValue;if(this.pendingResolve)return this.pendingResolve;this.pendingResolve=this._resolveQueries();try{return await this.pendingResolve}finally{this.pendingResolve=null}}async _resolveQueries(){if(this.isDisposed)return this.lastValue;try{if("unmapped"!==this.resultBuffer.mapState)return this.lastValue;const e=new Map(this.queryOffsets),t=this.currentQueryIndex,r=8*t;this.currentQueryIndex=0,this.queryOffsets.clear();const s=this.device.createCommandEncoder();s.resolveQuerySet(this.querySet,0,t,this.resolveBuffer,0),s.copyBufferToBuffer(this.resolveBuffer,0,this.resultBuffer,0,r);const i=s.finish();if(this.device.queue.submit([i]),"unmapped"!==this.resultBuffer.mapState)return this.lastValue;if(await this.resultBuffer.mapAsync(GPUMapMode.READ,0,r),this.isDisposed)return"mapped"===this.resultBuffer.mapState&&this.resultBuffer.unmap(),this.lastValue;const n=new BigUint64Array(this.resultBuffer.getMappedRange(0,r));let a=0;for(const[,t]of e){const e=n[t],r=n[t+1];a+=Number(r-e)/1e6}return this.resultBuffer.unmap(),this.lastValue=a,a}catch(e){return console.error("Error resolving queries:",e),"mapped"===this.resultBuffer.mapState&&this.resultBuffer.unmap(),this.lastValue}}async dispose(){if(!this.isDisposed){if(this.isDisposed=!0,this.pendingResolve)try{await this.pendingResolve}catch(e){console.error("Error waiting for pending resolve:",e)}if(this.resultBuffer&&"mapped"===this.resultBuffer.mapState)try{this.resultBuffer.unmap()}catch(e){console.error("Error unmapping buffer:",e)}this.querySet&&(this.querySet.destroy(),this.querySet=null),this.resolveBuffer&&(this.resolveBuffer.destroy(),this.resolveBuffer=null),this.resultBuffer&&(this.resultBuffer.destroy(),this.resultBuffer=null),this.queryOffsets.clear(),this.pendingResolve=null}}}class Uw extends Pv{constructor(e={}){super(e),this.isWebGPUBackend=!0,this.parameters.alpha=void 0===e.alpha||e.alpha,this.parameters.requiredLimits=void 0===e.requiredLimits?{}:e.requiredLimits,this.device=null,this.context=null,this.colorBuffer=null,this.defaultRenderPassdescriptor=null,this.utils=new Mw(this),this.attributeUtils=new Bw(this),this.bindingUtils=new Iw(this),this.pipelineUtils=new Dw(this),this.textureUtils=new cw(this),this.occludedResolveCache=new Map}async init(e){await super.init(e);const t=this.parameters;let r;if(void 0===t.device){const e={powerPreference:t.powerPreference},s="undefined"!=typeof navigator?await navigator.gpu.requestAdapter(e):null;if(null===s)throw new Error("WebGPUBackend: Unable to create WebGPU adapter.");const i=Object.values(rw).filter((e=>s.features.has(e)));r=await s.requestDevice({requiredFeatures:i,requiredLimits:t.requiredLimits})}else r=t.device;r.lost.then((t=>{e.onDeviceLost({api:"WebGPU",message:t.message||"Unknown reason",reason:t.reason||null,originalEvent:t})}));const s=void 0!==t.context?t.context:e.domElement.getContext("webgpu");this.device=r,this.context=s;const i=t.alpha?"premultiplied":"opaque";this.trackTimestamp=this.trackTimestamp&&this.hasFeature(rw.TimestampQuery),this.context.configure({device:this.device,format:this.utils.getPreferredCanvasFormat(),usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.COPY_SRC,alphaMode:i}),"undefined"!=typeof window&&"checkWebGPUState"in window&&checkWebGPUState(),this.updateSize()}get coordinateSystem(){return d}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}getContext(){return this.context}_getDefaultRenderPassDescriptor(){let e=this.defaultRenderPassdescriptor;if(null===e){const t=this.renderer;e={colorAttachments:[{view:null}]},!0!==this.renderer.depth&&!0!==this.renderer.stencil||(e.depthStencilAttachment={view:this.textureUtils.getDepthBuffer(t.depth,t.stencil).createView()});const r=e.colorAttachments[0];this.renderer.samples>0?r.view=this.colorBuffer.createView():r.resolveTarget=void 0,this.defaultRenderPassdescriptor=e}const t=e.colorAttachments[0];return this.renderer.samples>0?t.resolveTarget=this.context.getCurrentTexture().createView():t.view=this.context.getCurrentTexture().createView(),e}_getRenderPassDescriptor(e,t={}){const r=e.renderTarget,s=this.get(r);let i=s.descriptors;if(void 0===i||s.width!==r.width||s.height!==r.height||s.dimensions!==r.dimensions||s.activeMipmapLevel!==e.activeMipmapLevel||s.activeCubeFace!==e.activeCubeFace||s.samples!==r.samples){i={},s.descriptors=i;const e=()=>{r.removeEventListener("dispose",e),this.delete(r)};!1===r.hasEventListener("dispose",e)&&r.addEventListener("dispose",e)}const n=e.getCacheKey();let a=i[n];if(void 0===a){const t=e.textures,o=[];let u;for(let s=0;s0&&(t.currentOcclusionQuerySet&&t.currentOcclusionQuerySet.destroy(),t.currentOcclusionQueryBuffer&&t.currentOcclusionQueryBuffer.destroy(),t.currentOcclusionQuerySet=t.occlusionQuerySet,t.currentOcclusionQueryBuffer=t.occlusionQueryBuffer,t.currentOcclusionQueryObjects=t.occlusionQueryObjects,i=r.createQuerySet({type:"occlusion",count:s,label:`occlusionQuerySet_${e.id}`}),t.occlusionQuerySet=i,t.occlusionQueryIndex=0,t.occlusionQueryObjects=new Array(s),t.lastOcclusionObject=null),n=null===e.textures?this._getDefaultRenderPassDescriptor():this._getRenderPassDescriptor(e,{loadOp:cN}),this.initTimestampQuery(e,n),n.occlusionQuerySet=i;const a=n.depthStencilAttachment;if(null!==e.textures){const t=n.colorAttachments;for(let r=0;r0&&t.currentPass.executeBundles(t.renderBundles),r>t.occlusionQueryIndex&&t.currentPass.endOcclusionQuery(),t.currentPass.end(),r>0){const s=8*r;let i=this.occludedResolveCache.get(s);void 0===i&&(i=this.device.createBuffer({size:s,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC}),this.occludedResolveCache.set(s,i));const n=this.device.createBuffer({size:s,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});t.encoder.resolveQuerySet(t.occlusionQuerySet,0,r,i,0),t.encoder.copyBufferToBuffer(i,0,n,0,s),t.occlusionQueryBuffer=n,this.resolveOccludedAsync(e)}if(this.device.queue.submit([t.encoder.finish()]),null!==e.textures){const t=e.textures;for(let e=0;ea?(u.x=Math.min(t.dispatchCount,a),u.y=Math.ceil(t.dispatchCount/a)):u.x=t.dispatchCount,i.dispatchWorkgroups(u.x,u.y,u.z)}finishCompute(e){const t=this.get(e);t.passEncoderGPU.end(),this.device.queue.submit([t.cmdEncoderGPU.finish()])}async waitForGPU(){await this.device.queue.onSubmittedWorkDone()}draw(e,t){const{object:r,material:s,context:i,pipeline:n}=e,a=e.getBindings(),o=this.get(i),u=this.get(n).pipeline,l=o.currentSets,d=o.currentPass,c=e.getDrawParameters();if(null===c)return;l.pipeline!==u&&(d.setPipeline(u),l.pipeline=u);const h=l.bindingGroups;for(let e=0,t=a.length;e{if(!0===r.isBatchedMesh){const e=r._multiDrawStarts,s=r._multiDrawCounts,i=r._multiDrawCount,n=r._multiDrawInstances;null!==n&&ht("THREE.WebGPUBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.");for(let a=0;a1?0:a;!0===g?d.drawIndexed(s[a],i,e[a]/p.array.BYTES_PER_ELEMENT,0,o):d.draw(s[a],i,e[a],o),t.update(r,s[a],i)}}else if(!0===g){const{vertexCount:s,instanceCount:i,firstVertex:n}=c,a=e.getIndirect();if(null!==a){const e=this.get(a).buffer;d.drawIndexedIndirect(e,0)}else d.drawIndexed(s,i,n,0,0);t.update(r,s,i)}else{const{vertexCount:s,instanceCount:i,firstVertex:n}=c,a=e.getIndirect();if(null!==a){const e=this.get(a).buffer;d.drawIndirect(e,0)}else d.draw(s,i,n,0);t.update(r,s,i)}};if(e.camera.isArrayCamera&&e.camera.cameras.length>0){const t=this.get(e.camera),s=e.camera.cameras,n=e.getBindingGroup("cameraIndex");if(void 0===t.indexesGPU||t.indexesGPU.length!==s.length){const e=this.get(n),r=[],i=new Uint32Array([0,0,0,0]);for(let t=0,n=s.length;t(console.warn("THREE.WebGPURenderer: WebGPU is not available, running under WebGL2 backend."),new Yv(e)));super(new t(e),e),this.library=new Gw,this.isWebGPURenderer=!0}}class zw extends ds{constructor(){super(),this.isBundleGroup=!0,this.type="BundleGroup",this.static=!0,this.version=0}set needsUpdate(e){!0===e&&this.version++}}class $w{constructor(e,t=tn(0,0,1,1)){this.renderer=e,this.outputNode=t,this.outputColorTransform=!0,this.needsUpdate=!0;const r=new Fh;r.name="PostProcessing",this._quadMesh=new dy(r)}render(){this._update();const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=p,e.outputColorSpace=de;const s=e.xr.enabled;e.xr.enabled=!1,this._quadMesh.render(e),e.xr.enabled=s,e.toneMapping=t,e.outputColorSpace=r}dispose(){this._quadMesh.material.dispose()}_update(){if(!0===this.needsUpdate){const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;this._quadMesh.material.fragmentNode=!0===this.outputColorTransform?Fu(this.outputNode,t,r):this.outputNode.context({toneMapping:t,outputColorSpace:r}),this._quadMesh.material.needsUpdate=!0,this.needsUpdate=!1}}async renderAsync(){this._update();const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=p,e.outputColorSpace=de;const s=e.xr.enabled;e.xr.enabled=!1,await this._quadMesh.renderAsync(e),e.xr.enabled=s,e.toneMapping=t,e.outputColorSpace=r}}class Hw extends pe{constructor(e=1,t=1){super(),this.image={width:e,height:t},this.magFilter=q,this.minFilter=q,this.isStorageTexture=!0}}class Ww extends xy{constructor(e,t){super(e,t,Uint32Array),this.isIndirectStorageBufferAttribute=!0}}class jw extends cs{constructor(e){super(e),this.textures={},this.nodes={}}load(e,t,r,s){const i=new hs(this.manager);i.setPath(this.path),i.setRequestHeader(this.requestHeader),i.setWithCredentials(this.withCredentials),i.load(e,(r=>{try{t(this.parse(JSON.parse(r)))}catch(t){s?s(t):console.error(t),this.manager.itemError(e)}}),r,s)}parseNodes(e){const t={};if(void 0!==e){for(const r of e){const{uuid:e,type:s}=r;t[e]=this.createNodeFromType(s),t[e].uuid=e}const r={nodes:t,textures:this.textures};for(const s of e){s.meta=r;t[s.uuid].deserialize(s),delete s.meta}}return t}parse(e){const t=this.createNodeFromType(e.type);t.uuid=e.uuid;const r={nodes:this.parseNodes(e.nodes),textures:this.textures};return e.meta=r,t.deserialize(e),delete e.meta,t}setTextures(e){return this.textures=e,this}setNodes(e){return this.nodes=e,this}createNodeFromType(e){return void 0===this.nodes[e]?(console.error("THREE.NodeLoader: Node type not found:",e),$i()):Pi(new this.nodes[e])}}class qw extends ps{constructor(e){super(e),this.nodes={},this.nodeMaterials={}}parse(e){const t=super.parse(e),r=this.nodes,s=e.inputNodes;for(const e in s){const i=s[e];t[e]=r[i]}return t}setNodes(e){return this.nodes=e,this}setNodeMaterials(e){return this.nodeMaterials=e,this}createMaterialFromType(e){const t=this.nodeMaterials[e];return void 0!==t?new t:super.createMaterialFromType(e)}}class Xw extends gs{constructor(e){super(e),this.nodes={},this.nodeMaterials={},this._nodesJSON=null}setNodes(e){return this.nodes=e,this}setNodeMaterials(e){return this.nodeMaterials=e,this}parse(e,t){this._nodesJSON=e.nodes;const r=super.parse(e,t);return this._nodesJSON=null,r}parseNodes(e,t){if(void 0!==e){const r=new jw;return r.setNodes(this.nodes),r.setTextures(t),r.parseNodes(e)}return{}}parseMaterials(e,t){const r={};if(void 0!==e){const s=this.parseNodes(this._nodesJSON,t),i=new qw;i.setTextures(t),i.setNodes(s),i.setNodeMaterials(this.nodeMaterials);for(let t=0,s=e.length;t - - - - - - - - -

[name]

- -

- Create a texture to apply to a surface or as a reflection or refraction - map. -

- -

- Note: After the initial use of a texture, its dimensions, format, and type - cannot be changed. Instead, call [page:.dispose]() on the texture and - instantiate a new one. -

- -

Code Example

- - - // load a texture, set wrap mode to repeat - const texture = new THREE.TextureLoader().load( "textures/water.jpg" ); - texture.wrapS = THREE.RepeatWrapping; - texture.wrapT = THREE.RepeatWrapping; - texture.repeat.set( 4, 4 ); - - -

Constructor

- -

- [name]( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, - anisotropy, colorSpace ) -

- -

Properties

- -

[property:Integer id]

-

Readonly - unique number for this texture instance.

- -

[property:Boolean isTexture]

-

Read-only flag to check if a given object is of type [name].

- -

[property:String uuid]

-

- [link:http://en.wikipedia.org/wiki/Universally_unique_identifier UUID] of - this object instance. This gets automatically assigned, so this shouldn't - be edited. -

- -

[property:String name]

-

- Optional name of the object (doesn't need to be unique). Default is an - empty string. -

- -

[property:Image image]

-

- An image object, typically created using the [page:TextureLoader.load] - method. This can be any image (e.g., PNG, JPG, GIF, DDS) or video (e.g., - MP4, OGG/OGV) type supported by three.js.

- - To use video as a texture you need to have a playing HTML5 video element - as a source for your texture image and continuously update this texture as - long as video is playing - the [page:VideoTexture VideoTexture] class - handles this automatically. -

- -

[property:Array mipmaps]

-

Array of user-specified mipmaps (optional).

- -

[property:number mapping]

-

- How the image is applied to the object. An object type of [page:Textures THREE.UVMapping] - is the default, where the U,V coordinates are used to - apply the map.
- - See the [page:Textures texture constants] page for other mapping types. -

- -

[property:Integer channel]

-

- Lets you select the uv attribute to map the texture to. `0` for `uv`, - `1` for `uv1`, `2` for `uv2` and `3` for `uv3`. -

- -

[property:number wrapS]

-

- This defines how the texture is wrapped horizontally and corresponds to - *U* in UV mapping.
- The default is [page:Textures THREE.ClampToEdgeWrapping], where the edge - is clamped to the outer edge texels. The other two choices are - [page:Textures THREE.RepeatWrapping] and [page:Textures THREE.MirroredRepeatWrapping]. - See the [page:Textures texture constants] - page for details. -

- -

[property:number wrapT]

-

- This defines how the texture is wrapped vertically and corresponds to *V* - in UV mapping.
- The same choices are available as for [property:number wrapS].

- - NOTE: tiling of images in textures only functions if image dimensions are - powers of two (2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, ...) in - terms of pixels. Individual dimensions need not be equal, but each must be - a power of two. This is a limitation of WebGL, not three.js. -

- -

[property:number magFilter]

-

- How the texture is sampled when a texel covers more than one pixel. The - default is [page:Textures THREE.LinearFilter], which takes the four - closest texels and bilinearly interpolates among them. The other option is - [page:Textures THREE.NearestFilter], which uses the value of the closest - texel.
- See the [page:Textures texture constants] page for details. -

- -

[property:number minFilter]

-

- How the texture is sampled when a texel covers less than one pixel. The - default is [page:Textures THREE.LinearMipmapLinearFilter], which uses - mipmapping and a trilinear filter.

- - See the [page:Textures texture constants] page for all possible choices. -

- -

[property:number anisotropy]

-

- The number of samples taken along the axis through the pixel that has the - highest density of texels. By default, this value is `1`. A higher value - gives a less blurry result than a basic mipmap, at the cost of more - texture samples being used. Use [page:WebGLRenderer.capabilities renderer.capabilities.getMaxAnisotropy]() - to find the maximum valid anisotropy value for the GPU; this value is usually a power of 2. -

- -

[property:number format]

-

- The default is [page:Textures THREE.RGBAFormat].

- - See the [page:Textures texture constants] page for details of other - formats. -

- -

[property:String internalFormat]

-

- The default value is obtained using a combination of [page:Texture.format .format] and [page:Texture.type .type].
- - The GPU format allows the developer to specify how the data is going to be - stored on the GPU.

- - See the [page:Textures texture constants] page for details regarding all - supported internal formats. -

- -

[property:number type]

-

- This must correspond to the [page:Texture.format .format]. The default is - [page:Textures THREE.UnsignedByteType], which will be used for most - texture formats.

- - See the [page:Textures texture constants] page for details of other - formats. -

- -

[property:Vector2 offset]

-

- How much a single repetition of the texture is offset from the beginning, - in each direction U and V. Typical range is `0.0` to `1.0`. -

- -

[property:Vector2 repeat]

-

- How many times the texture is repeated across the surface, in each - direction U and V. If repeat is set greater than 1 in either direction, - the corresponding Wrap parameter should also be set to [page:Textures THREE.RepeatWrapping] - or [page:Textures THREE.MirroredRepeatWrapping] to - achieve the desired tiling effect. -

- -

[property:number rotation]

-

- How much the texture is rotated around the center point, in radians. - Positive values are counter-clockwise. Default is `0`. -

- -

[property:Vector2 center]

-

- The point around which rotation occurs. A value of (0.5, 0.5) corresponds - to the center of the texture. Default is (0, 0), the lower left. -

- -

[property:Boolean matrixAutoUpdate]

-

- Whether to update the texture's uv-transform [page:Texture.matrix .matrix] - from the texture properties [page:Texture.offset .offset], - [page:Texture.repeat .repeat], [page:Texture.rotation .rotation], and - [page:Texture.center .center]. True by default. Set this to false if you - are specifying the uv-transform matrix directly. -

- -

[property:Matrix3 matrix]

-

- The uv-transform matrix for the texture. Updated by the renderer from the - texture properties [page:Texture.offset .offset], [page:Texture.repeat .repeat], - [page:Texture.rotation .rotation], and [page:Texture.center .center] - when the texture's [page:Texture.matrixAutoUpdate .matrixAutoUpdate] - property is true. When [page:Texture.matrixAutoUpdate .matrixAutoUpdate] - property is false, this matrix may be set manually. - Default is the identity matrix. -

- -

[property:Boolean generateMipmaps]

-

- Whether to generate mipmaps (if possible) for a texture. True by default. - Set this to false if you are creating mipmaps manually. -

- -

[property:Boolean premultiplyAlpha]

-

- If set to `true`, the alpha channel, if present, is multiplied into the - color channels when the texture is uploaded to the GPU. Default is - `false`.

- - Note that this property has no effect for - [link:https://developer.mozilla.org/en-US/docs/Web/API/ImageBitmap ImageBitmap]. - You need to configure on bitmap creation instead. See - [page:ImageBitmapLoader]. -

- -

[property:Boolean flipY]

-

- If set to `true`, the texture is flipped along the vertical axis when - uploaded to the GPU. Default is `true`.

- - Note that this property has no effect for - [link:https://developer.mozilla.org/en-US/docs/Web/API/ImageBitmap ImageBitmap]. - You need to configure on bitmap creation instead. See - [page:ImageBitmapLoader]. -

- -

[property:number unpackAlignment]

-

- 4 by default. Specifies the alignment requirements for the start of each - pixel row in memory. The allowable values are 1 (byte-alignment), 2 (rows - aligned to even-numbered bytes), 4 (word-alignment), and 8 (rows start on - double-word boundaries). See - [link:http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml glPixelStorei] for more information. -

- -

[property:string colorSpace]

-

- [page:Textures THREE.NoColorSpace] is the default. Textures containing color data should be - annotated with [page:Textures THREE.SRGBColorSpace] or - [page:Textures THREE.LinearSRGBColorSpace]. -

- -

[property:Integer version]

-

- This starts at `0` and counts how many times [page:Texture.needsUpdate .needsUpdate] is set to `true`. -

- -

[property:Function onUpdate]

-

- A callback function, called when the texture is updated (e.g., when - needsUpdate has been set to true and then the texture is used). -

- -

[property:Boolean needsUpdate]

-

- Set this to `true` to trigger an update next time the texture is used. - Particularly important for setting the wrap mode. -

- -

[property:Object userData]

-

- An object that can be used to store custom data about the texture. It - should not hold references to functions as these will not be cloned. - Default is an empty object `{}`. -

- -

[property:Source source]

-

- The data definition of a texture. A reference to the data source can be - shared across textures. This is often useful in context of spritesheets - where multiple textures render the same data but with different texture - transformations. -

- -

Methods

- -

- [page:EventDispatcher EventDispatcher] methods are available on this - class. -

- -

[method:undefined updateMatrix]()

-

- Update the texture's uv-transform [page:Texture.matrix .matrix] from the - texture properties [page:Texture.offset .offset], [page:Texture.repeat .repeat], - [page:Texture.rotation .rotation], and [page:Texture.center .center]. -

- -

[method:Texture clone]()

-

- Make copy of the texture. Note this is not a "deep copy", the image is - shared. Cloning the texture automatically marks it for texture upload. -

- -

[method:Object toJSON]( [param:Object meta] )

-

- meta -- optional object containing metadata.
- Convert the texture to three.js - [link:https://github.com/mrdoob/three.js/wiki/JSON-Object-Scene-format-4 JSON Object/Scene format]. -

- -

[method:undefined dispose]()

-

- Frees the GPU-related resources allocated by this instance. Call this - method whenever this instance is no longer used in your app. -

- -

[method:Vector2 transformUv]( [param:Vector2 uv] )

-

- Transform the uv based on the value of this texture's [page:Texture.offset .offset], - [page:Texture.repeat .repeat], [page:Texture.wrapS .wrapS], - [page:Texture.wrapT .wrapT] and [page:Texture.flipY .flipY] properties. -

- -

Source

- -

- [link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js] -

- - + + + + + + + + + +

[name]

+ +

+ Create a texture to apply to a surface or as a reflection or refraction + map. +

+ +

+ Note: After the initial use of a texture, its dimensions, format, and type + cannot be changed. Instead, call [page:.dispose]() on the texture and + instantiate a new one. +

+ +

Code Example

+ + + // load a texture, set wrap mode to repeat + const texture = new THREE.TextureLoader().load( "textures/water.jpg" ); + texture.wrapS = THREE.RepeatWrapping; + texture.wrapT = THREE.RepeatWrapping; + texture.repeat.set( 4, 4 ); + + +

Constructor

+ +

+ [name]( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, + anisotropy, colorSpace ) +

+ +

Properties

+ +

[property:Integer id]

+

Readonly - unique number for this texture instance.

+ +

[property:Boolean isTexture]

+

Read-only flag to check if a given object is of type [name].

+ +

[property:String uuid]

+

+ [link:http://en.wikipedia.org/wiki/Universally_unique_identifier UUID] of + this object instance. This gets automatically assigned, so this shouldn't + be edited. +

+ +

[property:String name]

+

+ Optional name of the object (doesn't need to be unique). Default is an + empty string. +

+ +

[property:Image image]

+

+ An image object, typically created using the [page:TextureLoader.load] + method. This can be any image (e.g., PNG, JPG, GIF, DDS) or video (e.g., + MP4, OGG/OGV) type supported by three.js.

+ + To use video as a texture you need to have a playing HTML5 video element + as a source for your texture image and continuously update this texture as + long as video is playing - the [page:VideoTexture VideoTexture] class + handles this automatically. +

+ +

[property:Array mipmaps]

+

Array of user-specified mipmaps (optional).

+ +

[property:number mapping]

+

+ How the image is applied to the object. An object type of [page:Textures THREE.UVMapping] + is the default, where the U,V coordinates are used to + apply the map.
+ + See the [page:Textures texture constants] page for other mapping types. +

+ +

[property:Integer channel]

+

+ Lets you select the uv attribute to map the texture to. `0` for `uv`, + `1` for `uv1`, `2` for `uv2` and `3` for `uv3`. +

+ +

[property:number wrapS]

+

+ This defines how the texture is wrapped horizontally and corresponds to + *U* in UV mapping.
+ The default is [page:Textures THREE.ClampToEdgeWrapping], where the edge + is clamped to the outer edge texels. The other two choices are + [page:Textures THREE.RepeatWrapping] and [page:Textures THREE.MirroredRepeatWrapping]. + See the [page:Textures texture constants] + page for details. +

+ +

[property:number wrapT]

+

+ This defines how the texture is wrapped vertically and corresponds to *V* + in UV mapping.
+ The same choices are available as for [property:number wrapS].

+ + NOTE: tiling of images in textures only functions if image dimensions are + powers of two (2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, ...) in + terms of pixels. Individual dimensions need not be equal, but each must be + a power of two. This is a limitation of WebGL, not three.js. +

+ +

[property:number magFilter]

+

+ How the texture is sampled when a texel covers more than one pixel. The + default is [page:Textures THREE.LinearFilter], which takes the four + closest texels and bilinearly interpolates among them. The other option is + [page:Textures THREE.NearestFilter], which uses the value of the closest + texel.
+ See the [page:Textures texture constants] page for details. +

+ +

[property:number minFilter]

+

+ How the texture is sampled when a texel covers less than one pixel. The + default is [page:Textures THREE.LinearMipmapLinearFilter], which uses + mipmapping and a trilinear filter.

+ + See the [page:Textures texture constants] page for all possible choices. +

+ +

[property:number anisotropy]

+

+ The number of samples taken along the axis through the pixel that has the + highest density of texels. By default, this value is `1`. A higher value + gives a less blurry result than a basic mipmap, at the cost of more + texture samples being used. Use [page:WebGLRenderer.capabilities renderer.capabilities.getMaxAnisotropy]() + to find the maximum valid anisotropy value for the GPU; this value is usually a power of 2. +

+ +

[property:number format]

+

+ The default is [page:Textures THREE.RGBAFormat].

+ + See the [page:Textures texture constants] page for details of other + formats. +

+ +

[property:String internalFormat]

+

+ The default value is obtained using a combination of [page:Texture.format .format] and [page:Texture.type .type].
+ + The GPU format allows the developer to specify how the data is going to be + stored on the GPU.

+ + See the [page:Textures texture constants] page for details regarding all + supported internal formats. +

+ +

[property:number type]

+

+ This must correspond to the [page:Texture.format .format]. The default is + [page:Textures THREE.UnsignedByteType], which will be used for most + texture formats.

+ + See the [page:Textures texture constants] page for details of other + formats. +

+ +

[property:Vector2 offset]

+

+ How much a single repetition of the texture is offset from the beginning, + in each direction U and V. Typical range is `0.0` to `1.0`. +

+ +

[property:Vector2 repeat]

+

+ How many times the texture is repeated across the surface, in each + direction U and V. If repeat is set greater than 1 in either direction, + the corresponding Wrap parameter should also be set to [page:Textures THREE.RepeatWrapping] + or [page:Textures THREE.MirroredRepeatWrapping] to + achieve the desired tiling effect. +

+ +

[property:number rotation]

+

+ How much the texture is rotated around the center point, in radians. + Positive values are counter-clockwise. Default is `0`. +

+ +

[property:Vector2 center]

+

+ The point around which rotation occurs. A value of (0.5, 0.5) corresponds + to the center of the texture. Default is (0, 0), the lower left. +

+ +

[property:Boolean matrixAutoUpdate]

+

+ Whether to update the texture's uv-transform [page:Texture.matrix .matrix] + from the texture properties [page:Texture.offset .offset], + [page:Texture.repeat .repeat], [page:Texture.rotation .rotation], and + [page:Texture.center .center]. True by default. Set this to false if you + are specifying the uv-transform matrix directly. +

+ +

[property:Matrix3 matrix]

+

+ The uv-transform matrix for the texture. Updated by the renderer from the + texture properties [page:Texture.offset .offset], [page:Texture.repeat .repeat], + [page:Texture.rotation .rotation], and [page:Texture.center .center] + when the texture's [page:Texture.matrixAutoUpdate .matrixAutoUpdate] + property is true. When [page:Texture.matrixAutoUpdate .matrixAutoUpdate] + property is false, this matrix may be set manually. + Default is the identity matrix. +

+ +

[property:Boolean generateMipmaps]

+

+ Whether to generate mipmaps (if possible) for a texture. True by default. + Set this to false if you are creating mipmaps manually. +

+ +

[property:Boolean premultiplyAlpha]

+

+ If set to `true`, the alpha channel, if present, is multiplied into the + color channels when the texture is uploaded to the GPU. Default is + `false`.

+ + Note that this property has no effect for + [link:https://developer.mozilla.org/en-US/docs/Web/API/ImageBitmap ImageBitmap]. + You need to configure on bitmap creation instead. See + [page:ImageBitmapLoader]. +

+ +

[property:Boolean flipY]

+

+ If set to `true`, the texture is flipped along the vertical axis when + uploaded to the GPU. Default is `true`.

+ + Note that this property has no effect for + [link:https://developer.mozilla.org/en-US/docs/Web/API/ImageBitmap ImageBitmap]. + You need to configure on bitmap creation instead. See + [page:ImageBitmapLoader]. +

+ +

[property:number unpackAlignment]

+

+ 4 by default. Specifies the alignment requirements for the start of each + pixel row in memory. The allowable values are 1 (byte-alignment), 2 (rows + aligned to even-numbered bytes), 4 (word-alignment), and 8 (rows start on + double-word boundaries). See + [link:http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml glPixelStorei] for more information. +

+ +

[property:string colorSpace]

+

+ Specifies the color space of the texture. The default is [page:Textures THREE.NoColorSpace]. +

+

+ If your texture contains color information (like a diffuse map or albedo), it's highly recommended to use + [page:Textures THREE.SRGBColorSpace] so that correct gamma correction is applied during rendering. +

+

+ If the texture contains non-color data (like normal maps, roughness, or metalness), you should use + [page:Textures THREE.LinearSRGBColorSpace] or leave it at the default. +

+

+ Incorrect color space assignment can result in washed-out or overly dark visuals. +

+ + +

[property:Integer version]

+

+ This starts at `0` and counts how many times [page:Texture.needsUpdate .needsUpdate] is set to `true`. +

+ +

[property:Function onUpdate]

+

+ A callback function, called when the texture is updated (e.g., when + needsUpdate has been set to true and then the texture is used). +

+ +

[property:Boolean needsUpdate]

+

+ Set this to `true` to trigger an update next time the texture is used. + Particularly important for setting the wrap mode. +

+ +

[property:Object userData]

+

+ An object that can be used to store custom data about the texture. It + should not hold references to functions as these will not be cloned. + Default is an empty object `{}`. +

+ +

[property:Source source]

+

+ The data definition of a texture. A reference to the data source can be + shared across textures. This is often useful in context of spritesheets + where multiple textures render the same data but with different texture + transformations. +

+ +

Methods

+ +

+ [page:EventDispatcher EventDispatcher] methods are available on this + class. +

+ +

[method:undefined updateMatrix]()

+

+ Update the texture's uv-transform [page:Texture.matrix .matrix] from the + texture properties [page:Texture.offset .offset], [page:Texture.repeat .repeat], + [page:Texture.rotation .rotation], and [page:Texture.center .center]. +

+ +

[method:Texture clone]()

+

+ Make copy of the texture. Note this is not a "deep copy", the image is + shared. Cloning the texture automatically marks it for texture upload. +

+ +

[method:Object toJSON]( [param:Object meta] )

+

+ meta -- optional object containing metadata.
+ Convert the texture to three.js + [link:https://github.com/mrdoob/three.js/wiki/JSON-Object-Scene-format-4 JSON Object/Scene format]. +

+ +

[method:undefined dispose]()

+

+ Frees the GPU-related resources allocated by this instance. Call this + method whenever this instance is no longer used in your app. +

+ +

[method:Vector2 transformUv]( [param:Vector2 uv] )

+

+ Transform the uv based on the value of this texture's [page:Texture.offset .offset], + [page:Texture.repeat .repeat], [page:Texture.wrapS .wrapS], + [page:Texture.wrapT .wrapT] and [page:Texture.flipY .flipY] properties. +

+ +

Source

+ +

+ [link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js] +

+ + diff --git a/examples/jsm/renderers/webgpu/WebGPUBackend.js b/examples/jsm/renderers/webgpu/WebGPUBackend.js new file mode 100644 index 00000000000000..3f25df27c85e78 --- /dev/null +++ b/examples/jsm/renderers/webgpu/WebGPUBackend.js @@ -0,0 +1,2090 @@ +/*// debugger tools +import 'https://greggman.github.io/webgpu-avoid-redundant-state-setting/webgpu-check-redundant-state-setting.js'; +//*/ + +import { GPUFeatureName, GPULoadOp, GPUStoreOp, GPUIndexFormat, GPUTextureViewDimension } from './utils/WebGPUConstants.js'; + +import WGSLNodeBuilder from './nodes/WGSLNodeBuilder.js'; +import Backend from '../common/Backend.js'; + +import WebGPUUtils from './utils/WebGPUUtils.js'; +import WebGPUAttributeUtils from './utils/WebGPUAttributeUtils.js'; +import WebGPUBindingUtils from './utils/WebGPUBindingUtils.js'; +import WebGPUPipelineUtils from './utils/WebGPUPipelineUtils.js'; +import WebGPUTextureUtils from './utils/WebGPUTextureUtils.js'; + +import { WebGPUCoordinateSystem } from '../../constants.js'; +import WebGPUTimestampQueryPool from './utils/WebGPUTimestampQueryPool.js'; +import { warnOnce } from '../../utils.js'; + +/** + * A backend implementation targeting WebGPU. + * + * @private + * @augments Backend + */ +class WebGPUBackend extends Backend { + + /** + * WebGPUBackend options. + * + * @typedef {Object} WebGPUBackend~Options + * @property {boolean} [logarithmicDepthBuffer=false] - Whether logarithmic depth buffer is enabled or not. + * @property {boolean} [alpha=true] - Whether the default framebuffer (which represents the final contents of the canvas) should be transparent or opaque. + * @property {boolean} [depth=true] - Whether the default framebuffer should have a depth buffer or not. + * @property {boolean} [stencil=false] - Whether the default framebuffer should have a stencil buffer or not. + * @property {boolean} [antialias=false] - Whether MSAA as the default anti-aliasing should be enabled or not. + * @property {number} [samples=0] - When `antialias` is `true`, `4` samples are used by default. Set this parameter to any other integer value than 0 to overwrite the default. + * @property {boolean} [forceWebGL=false] - If set to `true`, the renderer uses a WebGL 2 backend no matter if WebGPU is supported or not. + * @property {boolean} [trackTimestamp=false] - Whether to track timestamps with a Timestamp Query API or not. + * @property {string} [powerPreference=undefined] - The power preference. + * @property {Object} [requiredLimits=undefined] - Specifies the limits that are required by the device request. The request will fail if the adapter cannot provide these limits. + * @property {GPUDevice} [device=undefined] - If there is an existing GPU device on app level, it can be passed to the renderer as a parameter. + * @property {number} [outputType=undefined] - Texture type for output to canvas. By default, device's preferred format is used; other formats may incur overhead. + */ + + /** + * Constructs a new WebGPU backend. + * + * @param {WebGPUBackend~Options} [parameters] - The configuration parameter. + */ + constructor( parameters = {} ) { + + super( parameters ); + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + this.isWebGPUBackend = true; + + // some parameters require default values other than "undefined" + this.parameters.alpha = ( parameters.alpha === undefined ) ? true : parameters.alpha; + + this.parameters.requiredLimits = ( parameters.requiredLimits === undefined ) ? {} : parameters.requiredLimits; + + /** + * A reference to the device. + * + * @type {?GPUDevice} + * @default null + */ + this.device = null; + + /** + * A reference to the context. + * + * @type {?GPUCanvasContext} + * @default null + */ + this.context = null; + + /** + * A reference to the color attachment of the default framebuffer. + * + * @type {?GPUTexture} + * @default null + */ + this.colorBuffer = null; + + /** + * A reference to the default render pass descriptor. + * + * @type {?Object} + * @default null + */ + this.defaultRenderPassdescriptor = null; + + /** + * A reference to a backend module holding common utility functions. + * + * @type {WebGPUUtils} + */ + this.utils = new WebGPUUtils( this ); + + /** + * A reference to a backend module holding shader attribute-related + * utility functions. + * + * @type {WebGPUAttributeUtils} + */ + this.attributeUtils = new WebGPUAttributeUtils( this ); + + /** + * A reference to a backend module holding shader binding-related + * utility functions. + * + * @type {WebGPUBindingUtils} + */ + this.bindingUtils = new WebGPUBindingUtils( this ); + + /** + * A reference to a backend module holding shader pipeline-related + * utility functions. + * + * @type {WebGPUPipelineUtils} + */ + this.pipelineUtils = new WebGPUPipelineUtils( this ); + + /** + * A reference to a backend module holding shader texture-related + * utility functions. + * + * @type {WebGPUTextureUtils} + */ + this.textureUtils = new WebGPUTextureUtils( this ); + + /** + * A map that manages the resolve buffers for occlusion queries. + * + * @type {Map} + */ + this.occludedResolveCache = new Map(); + + } + + /** + * Initializes the backend so it is ready for usage. + * + * @async + * @param {Renderer} renderer - The renderer. + * @return {Promise} A Promise that resolves when the backend has been initialized. + */ + async init( renderer ) { + + await super.init( renderer ); + + // + + const parameters = this.parameters; + + // create the device if it is not passed with parameters + + let device; + + if ( parameters.device === undefined ) { + + const adapterOptions = { + powerPreference: parameters.powerPreference + }; + + const adapter = ( typeof navigator !== 'undefined' ) ? await navigator.gpu.requestAdapter( adapterOptions ) : null; + + if ( adapter === null ) { + + throw new Error( 'WebGPUBackend: Unable to create WebGPU adapter.' ); + + } + + // feature support + + const features = Object.values( GPUFeatureName ); + + const supportedFeatures = []; + + for ( const name of features ) { + + if ( adapter.features.has( name ) ) { + + supportedFeatures.push( name ); + + } + + } + + const deviceDescriptor = { + requiredFeatures: supportedFeatures, + requiredLimits: parameters.requiredLimits + }; + + device = await adapter.requestDevice( deviceDescriptor ); + + } else { + + device = parameters.device; + + } + + device.lost.then( ( info ) => { + + const deviceLossInfo = { + api: 'WebGPU', + message: info.message || 'Unknown reason', + reason: info.reason || null, + originalEvent: info + }; + + renderer.onDeviceLost( deviceLossInfo ); + + } ); + + const context = ( parameters.context !== undefined ) ? parameters.context : renderer.domElement.getContext( 'webgpu' ); + + this.device = device; + this.context = context; + + const alphaMode = parameters.alpha ? 'premultiplied' : 'opaque'; + + this.trackTimestamp = this.trackTimestamp && this.hasFeature( GPUFeatureName.TimestampQuery ); + + this.context.configure( { + device: this.device, + format: this.utils.getPreferredCanvasFormat(), + usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC, + alphaMode: alphaMode + } ); + + this.updateSize(); + + } + + /** + * The coordinate system of the backend. + * + * @type {number} + * @readonly + */ + get coordinateSystem() { + + return WebGPUCoordinateSystem; + + } + + /** + * This method performs a readback operation by moving buffer data from + * a storage buffer attribute from the GPU to the CPU. + * + * @async + * @param {StorageBufferAttribute} attribute - The storage buffer attribute. + * @return {Promise} A promise that resolves with the buffer data when the data are ready. + */ + async getArrayBufferAsync( attribute ) { + + return await this.attributeUtils.getArrayBufferAsync( attribute ); + + } + + /** + * Returns the backend's rendering context. + * + * @return {GPUCanvasContext} The rendering context. + */ + getContext() { + + return this.context; + + } + + /** + * Returns the default render pass descriptor. + * + * In WebGPU, the default framebuffer must be configured + * like custom framebuffers so the backend needs a render + * pass descriptor even when rendering directly to screen. + * + * @private + * @return {Object} The render pass descriptor. + */ + _getDefaultRenderPassDescriptor() { + + let descriptor = this.defaultRenderPassdescriptor; + + if ( descriptor === null ) { + + const renderer = this.renderer; + + descriptor = { + colorAttachments: [ { + view: null + } ], + }; + + if ( this.renderer.depth === true || this.renderer.stencil === true ) { + + descriptor.depthStencilAttachment = { + view: this.textureUtils.getDepthBuffer( renderer.depth, renderer.stencil ).createView() + }; + + } + + const colorAttachment = descriptor.colorAttachments[ 0 ]; + + if ( this.renderer.samples > 0 ) { + + colorAttachment.view = this.colorBuffer.createView(); + + } else { + + colorAttachment.resolveTarget = undefined; + + } + + this.defaultRenderPassdescriptor = descriptor; + + } + + const colorAttachment = descriptor.colorAttachments[ 0 ]; + + if ( this.renderer.samples > 0 ) { + + colorAttachment.resolveTarget = this.context.getCurrentTexture().createView(); + + } else { + + colorAttachment.view = this.context.getCurrentTexture().createView(); + + } + + return descriptor; + + } + + /** + * Returns the render pass descriptor for the given render context. + * + * @private + * @param {RenderContext} renderContext - The render context. + * @param {Object} colorAttachmentsConfig - Configuration object for the color attachments. + * @return {Object} The render pass descriptor. + */ + _getRenderPassDescriptor( renderContext, colorAttachmentsConfig = {} ) { + + const renderTarget = renderContext.renderTarget; + const renderTargetData = this.get( renderTarget ); + + let descriptors = renderTargetData.descriptors; + + if ( descriptors === undefined || + renderTargetData.width !== renderTarget.width || + renderTargetData.height !== renderTarget.height || + renderTargetData.dimensions !== renderTarget.dimensions || + renderTargetData.activeMipmapLevel !== renderContext.activeMipmapLevel || + renderTargetData.activeCubeFace !== renderContext.activeCubeFace || + renderTargetData.samples !== renderTarget.samples + ) { + + descriptors = {}; + + renderTargetData.descriptors = descriptors; + + // dispose + + const onDispose = () => { + + renderTarget.removeEventListener( 'dispose', onDispose ); + this.delete( renderTarget ); + + }; + + if ( renderTarget.hasEventListener( 'dispose', onDispose ) === false ) { + + renderTarget.addEventListener( 'dispose', onDispose ); + + } + + } + + const cacheKey = renderContext.getCacheKey(); + let descriptorBase = descriptors[ cacheKey ]; + + if ( descriptorBase === undefined ) { + + const textures = renderContext.textures; + const textureViews = []; + + let sliceIndex; + + for ( let i = 0; i < textures.length; i ++ ) { + + const textureData = this.get( textures[ i ] ); + + const viewDescriptor = { + label: `colorAttachment_${ i }`, + baseMipLevel: renderContext.activeMipmapLevel, + mipLevelCount: 1, + baseArrayLayer: renderContext.activeCubeFace, + arrayLayerCount: 1, + dimension: GPUTextureViewDimension.TwoD + }; + + if ( renderTarget.isRenderTarget3D ) { + + sliceIndex = renderContext.activeCubeFace; + + viewDescriptor.baseArrayLayer = 0; + viewDescriptor.dimension = GPUTextureViewDimension.ThreeD; + viewDescriptor.depthOrArrayLayers = textures[ i ].image.depth; + + } else if ( renderTarget.isRenderTargetArray ) { + + viewDescriptor.dimension = GPUTextureViewDimension.TwoDArray; + viewDescriptor.depthOrArrayLayers = textures[ i ].image.depth; + + } + + const textureView = textureData.texture.createView( viewDescriptor ); + + let view, resolveTarget; + + if ( textureData.msaaTexture !== undefined ) { + + view = textureData.msaaTexture.createView(); + resolveTarget = textureView; + + } else { + + view = textureView; + resolveTarget = undefined; + + } + + textureViews.push( { + view, + resolveTarget, + depthSlice: sliceIndex + } ); + + } + + descriptorBase = { textureViews }; + + if ( renderContext.depth ) { + + const depthTextureData = this.get( renderContext.depthTexture ); + descriptorBase.depthStencilView = depthTextureData.texture.createView(); + + } + + descriptors[ cacheKey ] = descriptorBase; + + renderTargetData.width = renderTarget.width; + renderTargetData.height = renderTarget.height; + renderTargetData.samples = renderTarget.samples; + renderTargetData.activeMipmapLevel = renderContext.activeMipmapLevel; + renderTargetData.activeCubeFace = renderContext.activeCubeFace; + renderTargetData.dimensions = renderTarget.dimensions; + + } + + const descriptor = { + colorAttachments: [] + }; + + // Apply dynamic properties to cached views + for ( let i = 0; i < descriptorBase.textureViews.length; i ++ ) { + + const viewInfo = descriptorBase.textureViews[ i ]; + + let clearValue = { r: 0, g: 0, b: 0, a: 1 }; + if ( i === 0 && colorAttachmentsConfig.clearValue ) { + + clearValue = colorAttachmentsConfig.clearValue; + + } + + descriptor.colorAttachments.push( { + view: viewInfo.view, + depthSlice: viewInfo.depthSlice, + resolveTarget: viewInfo.resolveTarget, + loadOp: colorAttachmentsConfig.loadOp || GPULoadOp.Load, + storeOp: colorAttachmentsConfig.storeOp || GPUStoreOp.Store, + clearValue: clearValue + } ); + + } + + if ( descriptorBase.depthStencilView ) { + + descriptor.depthStencilAttachment = { + view: descriptorBase.depthStencilView + }; + + } + + return descriptor; + + } + + /** + * This method is executed at the beginning of a render call and prepares + * the WebGPU state for upcoming render calls + * + * @param {RenderContext} renderContext - The render context. + */ + beginRender( renderContext ) { + + const renderContextData = this.get( renderContext ); + + const device = this.device; + const occlusionQueryCount = renderContext.occlusionQueryCount; + + let occlusionQuerySet; + + if ( occlusionQueryCount > 0 ) { + + if ( renderContextData.currentOcclusionQuerySet ) renderContextData.currentOcclusionQuerySet.destroy(); + if ( renderContextData.currentOcclusionQueryBuffer ) renderContextData.currentOcclusionQueryBuffer.destroy(); + + // Get a reference to the array of objects with queries. The renderContextData property + // can be changed by another render pass before the buffer.mapAsyc() completes. + renderContextData.currentOcclusionQuerySet = renderContextData.occlusionQuerySet; + renderContextData.currentOcclusionQueryBuffer = renderContextData.occlusionQueryBuffer; + renderContextData.currentOcclusionQueryObjects = renderContextData.occlusionQueryObjects; + + // + + occlusionQuerySet = device.createQuerySet( { type: 'occlusion', count: occlusionQueryCount, label: `occlusionQuerySet_${ renderContext.id }` } ); + + renderContextData.occlusionQuerySet = occlusionQuerySet; + renderContextData.occlusionQueryIndex = 0; + renderContextData.occlusionQueryObjects = new Array( occlusionQueryCount ); + + renderContextData.lastOcclusionObject = null; + + } + + let descriptor; + + if ( renderContext.textures === null ) { + + descriptor = this._getDefaultRenderPassDescriptor(); + + } else { + + descriptor = this._getRenderPassDescriptor( renderContext, { loadOp: GPULoadOp.Load } ); + + } + + this.initTimestampQuery( renderContext, descriptor ); + + descriptor.occlusionQuerySet = occlusionQuerySet; + + const depthStencilAttachment = descriptor.depthStencilAttachment; + + if ( renderContext.textures !== null ) { + + const colorAttachments = descriptor.colorAttachments; + + for ( let i = 0; i < colorAttachments.length; i ++ ) { + + const colorAttachment = colorAttachments[ i ]; + + if ( renderContext.clearColor ) { + + colorAttachment.clearValue = i === 0 ? renderContext.clearColorValue : { r: 0, g: 0, b: 0, a: 1 }; + colorAttachment.loadOp = GPULoadOp.Clear; + colorAttachment.storeOp = GPUStoreOp.Store; + + } else { + + colorAttachment.loadOp = GPULoadOp.Load; + colorAttachment.storeOp = GPUStoreOp.Store; + + } + + } + + } else { + + const colorAttachment = descriptor.colorAttachments[ 0 ]; + + if ( renderContext.clearColor ) { + + colorAttachment.clearValue = renderContext.clearColorValue; + colorAttachment.loadOp = GPULoadOp.Clear; + colorAttachment.storeOp = GPUStoreOp.Store; + + } else { + + colorAttachment.loadOp = GPULoadOp.Load; + colorAttachment.storeOp = GPUStoreOp.Store; + + } + + } + + // + + if ( renderContext.depth ) { + + if ( renderContext.clearDepth ) { + + depthStencilAttachment.depthClearValue = renderContext.clearDepthValue; + depthStencilAttachment.depthLoadOp = GPULoadOp.Clear; + depthStencilAttachment.depthStoreOp = GPUStoreOp.Store; + + } else { + + depthStencilAttachment.depthLoadOp = GPULoadOp.Load; + depthStencilAttachment.depthStoreOp = GPUStoreOp.Store; + + } + + } + + if ( renderContext.stencil ) { + + if ( renderContext.clearStencil ) { + + depthStencilAttachment.stencilClearValue = renderContext.clearStencilValue; + depthStencilAttachment.stencilLoadOp = GPULoadOp.Clear; + depthStencilAttachment.stencilStoreOp = GPUStoreOp.Store; + + } else { + + depthStencilAttachment.stencilLoadOp = GPULoadOp.Load; + depthStencilAttachment.stencilStoreOp = GPUStoreOp.Store; + + } + + } + + // + + const encoder = device.createCommandEncoder( { label: 'renderContext_' + renderContext.id } ); + const currentPass = encoder.beginRenderPass( descriptor ); + + // + + renderContextData.descriptor = descriptor; + renderContextData.encoder = encoder; + renderContextData.currentPass = currentPass; + renderContextData.currentSets = { attributes: {}, bindingGroups: [], pipeline: null, index: null }; + renderContextData.renderBundles = []; + + // + + if ( renderContext.viewport ) { + + this.updateViewport( renderContext ); + + } + + if ( renderContext.scissor ) { + + const { x, y, width, height } = renderContext.scissorValue; + + currentPass.setScissorRect( x, y, width, height ); + + } + + } + + /** + * This method is executed at the end of a render call and finalizes work + * after draw calls. + * + * @param {RenderContext} renderContext - The render context. + */ + finishRender( renderContext ) { + + const renderContextData = this.get( renderContext ); + const occlusionQueryCount = renderContext.occlusionQueryCount; + + if ( renderContextData.renderBundles.length > 0 ) { + + renderContextData.currentPass.executeBundles( renderContextData.renderBundles ); + + } + + if ( occlusionQueryCount > renderContextData.occlusionQueryIndex ) { + + renderContextData.currentPass.endOcclusionQuery(); + + } + + renderContextData.currentPass.end(); + + if ( occlusionQueryCount > 0 ) { + + const bufferSize = occlusionQueryCount * 8; // 8 byte entries for query results + + // + + let queryResolveBuffer = this.occludedResolveCache.get( bufferSize ); + + if ( queryResolveBuffer === undefined ) { + + queryResolveBuffer = this.device.createBuffer( + { + size: bufferSize, + usage: GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.COPY_SRC + } + ); + + this.occludedResolveCache.set( bufferSize, queryResolveBuffer ); + + } + + // + + const readBuffer = this.device.createBuffer( + { + size: bufferSize, + usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ + } + ); + + // two buffers required here - WebGPU doesn't allow usage of QUERY_RESOLVE & MAP_READ to be combined + renderContextData.encoder.resolveQuerySet( renderContextData.occlusionQuerySet, 0, occlusionQueryCount, queryResolveBuffer, 0 ); + renderContextData.encoder.copyBufferToBuffer( queryResolveBuffer, 0, readBuffer, 0, bufferSize ); + + renderContextData.occlusionQueryBuffer = readBuffer; + + // + + this.resolveOccludedAsync( renderContext ); + + } + + this.device.queue.submit( [ renderContextData.encoder.finish() ] ); + + + // + + if ( renderContext.textures !== null ) { + + const textures = renderContext.textures; + + for ( let i = 0; i < textures.length; i ++ ) { + + const texture = textures[ i ]; + + if ( texture.generateMipmaps === true ) { + + this.textureUtils.generateMipmaps( texture ); + + } + + } + + } + + } + + /** + * Returns `true` if the given 3D object is fully occluded by other + * 3D objects in the scene. + * + * @param {RenderContext} renderContext - The render context. + * @param {Object3D} object - The 3D object to test. + * @return {boolean} Whether the 3D object is fully occluded or not. + */ + isOccluded( renderContext, object ) { + + const renderContextData = this.get( renderContext ); + + return renderContextData.occluded && renderContextData.occluded.has( object ); + + } + + /** + * This method processes the result of occlusion queries and writes it + * into render context data. + * + * @async + * @param {RenderContext} renderContext - The render context. + * @return {Promise} A Promise that resolves when the occlusion query results have been processed. + */ + async resolveOccludedAsync( renderContext ) { + + const renderContextData = this.get( renderContext ); + + // handle occlusion query results + + const { currentOcclusionQueryBuffer, currentOcclusionQueryObjects } = renderContextData; + + if ( currentOcclusionQueryBuffer && currentOcclusionQueryObjects ) { + + const occluded = new WeakSet(); + + renderContextData.currentOcclusionQueryObjects = null; + renderContextData.currentOcclusionQueryBuffer = null; + + await currentOcclusionQueryBuffer.mapAsync( GPUMapMode.READ ); + + const buffer = currentOcclusionQueryBuffer.getMappedRange(); + const results = new BigUint64Array( buffer ); + + for ( let i = 0; i < currentOcclusionQueryObjects.length; i ++ ) { + + if ( results[ i ] === BigInt( 0 ) ) { + + occluded.add( currentOcclusionQueryObjects[ i ] ); + + } + + } + + currentOcclusionQueryBuffer.destroy(); + + renderContextData.occluded = occluded; + + } + + } + + /** + * Updates the viewport with the values from the given render context. + * + * @param {RenderContext} renderContext - The render context. + */ + updateViewport( renderContext ) { + + const { currentPass } = this.get( renderContext ); + const { x, y, width, height, minDepth, maxDepth } = renderContext.viewportValue; + + currentPass.setViewport( x, y, width, height, minDepth, maxDepth ); + + } + + /** + * Returns the clear color and alpha into a single + * color object. + * + * @return {Color4} The clear color. + */ + getClearColor() { + + const clearColor = super.getClearColor(); + + // only premultiply alpha when alphaMode is "premultiplied" + + if ( this.renderer.alpha === true ) { + + clearColor.r *= clearColor.a; + clearColor.g *= clearColor.a; + clearColor.b *= clearColor.a; + + } + + return clearColor; + + } + + /** + * Performs a clear operation. + * + * @param {boolean} color - Whether the color buffer should be cleared or not. + * @param {boolean} depth - Whether the depth buffer should be cleared or not. + * @param {boolean} stencil - Whether the stencil buffer should be cleared or not. + * @param {?RenderContext} [renderTargetContext=null] - The render context of the current set render target. + */ + clear( color, depth, stencil, renderTargetContext = null ) { + + const device = this.device; + const renderer = this.renderer; + + let colorAttachments = []; + let depthStencilAttachment; + let clearValue; + + let supportsDepth; + let supportsStencil; + + if ( color ) { + + const clearColor = this.getClearColor(); + clearValue = { r: clearColor.r, g: clearColor.g, b: clearColor.b, a: clearColor.a }; + + } + + if ( renderTargetContext === null ) { + + supportsDepth = renderer.depth; + supportsStencil = renderer.stencil; + + const descriptor = this._getDefaultRenderPassDescriptor(); + + if ( color ) { + + colorAttachments = descriptor.colorAttachments; + + const colorAttachment = colorAttachments[ 0 ]; + + colorAttachment.clearValue = clearValue; + colorAttachment.loadOp = GPULoadOp.Clear; + colorAttachment.storeOp = GPUStoreOp.Store; + + } + + if ( supportsDepth || supportsStencil ) { + + depthStencilAttachment = descriptor.depthStencilAttachment; + + } + + } else { + + supportsDepth = renderTargetContext.depth; + supportsStencil = renderTargetContext.stencil; + + const clearConfig = { + loadOp: color ? GPULoadOp.Clear : GPULoadOp.Load, + clearValue: color ? clearValue : undefined + }; + + if ( supportsDepth ) { + + clearConfig.depthLoadOp = depth ? GPULoadOp.Clear : GPULoadOp.Load; + clearConfig.depthClearValue = depth ? renderer.getClearDepth() : undefined; + clearConfig.depthStoreOp = GPUStoreOp.Store; + + } + + if ( supportsStencil ) { + + clearConfig.stencilLoadOp = stencil ? GPULoadOp.Clear : GPULoadOp.Load; + clearConfig.stencilClearValue = stencil ? renderer.getClearStencil() : undefined; + clearConfig.stencilStoreOp = GPUStoreOp.Store; + + } + + const descriptor = this._getRenderPassDescriptor( renderTargetContext, clearConfig ); + + colorAttachments = descriptor.colorAttachments; + depthStencilAttachment = descriptor.depthStencilAttachment; + + } + + if ( supportsDepth && depthStencilAttachment && depthStencilAttachment.depthLoadOp === undefined ) { + + if ( depth ) { + + depthStencilAttachment.depthLoadOp = GPULoadOp.Clear; + depthStencilAttachment.depthClearValue = renderer.getClearDepth(); + depthStencilAttachment.depthStoreOp = GPUStoreOp.Store; + + } else { + + depthStencilAttachment.depthLoadOp = GPULoadOp.Load; + depthStencilAttachment.depthStoreOp = GPUStoreOp.Store; + + } + + } + + // + + if ( supportsStencil && depthStencilAttachment && depthStencilAttachment.stencilLoadOp === undefined ) { + + if ( stencil ) { + + depthStencilAttachment.stencilLoadOp = GPULoadOp.Clear; + depthStencilAttachment.stencilClearValue = renderer.getClearStencil(); + depthStencilAttachment.stencilStoreOp = GPUStoreOp.Store; + + } else { + + depthStencilAttachment.stencilLoadOp = GPULoadOp.Load; + depthStencilAttachment.stencilStoreOp = GPUStoreOp.Store; + + } + + } + + // + + const encoder = device.createCommandEncoder( { label: 'clear' } ); + const currentPass = encoder.beginRenderPass( { + colorAttachments, + depthStencilAttachment + } ); + + currentPass.end(); + + device.queue.submit( [ encoder.finish() ] ); + + } + + // compute + + /** + * This method is executed at the beginning of a compute call and + * prepares the state for upcoming compute tasks. + * + * @param {Node|Array} computeGroup - The compute node(s). + */ + beginCompute( computeGroup ) { + + const groupGPU = this.get( computeGroup ); + + + const descriptor = { + label: 'computeGroup_' + computeGroup.id + }; + + this.initTimestampQuery( computeGroup, descriptor ); + + groupGPU.cmdEncoderGPU = this.device.createCommandEncoder( { label: 'computeGroup_' + computeGroup.id } ); + + groupGPU.passEncoderGPU = groupGPU.cmdEncoderGPU.beginComputePass( descriptor ); + + } + + /** + * Executes a compute command for the given compute node. + * + * @param {Node|Array} computeGroup - The group of compute nodes of a compute call. Can be a single compute node. + * @param {Node} computeNode - The compute node. + * @param {Array} bindings - The bindings. + * @param {ComputePipeline} pipeline - The compute pipeline. + */ + compute( computeGroup, computeNode, bindings, pipeline ) { + + const { passEncoderGPU } = this.get( computeGroup ); + + // pipeline + + const pipelineGPU = this.get( pipeline ).pipeline; + passEncoderGPU.setPipeline( pipelineGPU ); + + // bind groups + + for ( let i = 0, l = bindings.length; i < l; i ++ ) { + + const bindGroup = bindings[ i ]; + const bindingsData = this.get( bindGroup ); + + passEncoderGPU.setBindGroup( i, bindingsData.group ); + + } + + const maxComputeWorkgroupsPerDimension = this.device.limits.maxComputeWorkgroupsPerDimension; + + const computeNodeData = this.get( computeNode ); + + if ( computeNodeData.dispatchSize === undefined ) computeNodeData.dispatchSize = { x: 0, y: 1, z: 1 }; + + const { dispatchSize } = computeNodeData; + + if ( computeNode.dispatchCount > maxComputeWorkgroupsPerDimension ) { + + dispatchSize.x = Math.min( computeNode.dispatchCount, maxComputeWorkgroupsPerDimension ); + dispatchSize.y = Math.ceil( computeNode.dispatchCount / maxComputeWorkgroupsPerDimension ); + + } else { + + dispatchSize.x = computeNode.dispatchCount; + + } + + passEncoderGPU.dispatchWorkgroups( + dispatchSize.x, + dispatchSize.y, + dispatchSize.z + ); + + } + + /** + * This method is executed at the end of a compute call and + * finalizes work after compute tasks. + * + * @param {Node|Array} computeGroup - The compute node(s). + */ + finishCompute( computeGroup ) { + + const groupData = this.get( computeGroup ); + + groupData.passEncoderGPU.end(); + + this.device.queue.submit( [ groupData.cmdEncoderGPU.finish() ] ); + + } + + /** + * Can be used to synchronize CPU operations with GPU tasks. So when this method is called, + * the CPU waits for the GPU to complete its operation (e.g. a compute task). + * + * @async + * @return {Promise} A Promise that resolves when synchronization has been finished. + */ + async waitForGPU() { + + await this.device.queue.onSubmittedWorkDone(); + + } + + // render object + + /** + * Executes a draw command for the given render object. + * + * @param {RenderObject} renderObject - The render object to draw. + * @param {Info} info - Holds a series of statistical information about the GPU memory and the rendering process. + */ + draw( renderObject, info ) { + + const { object, material, context, pipeline } = renderObject; + const bindings = renderObject.getBindings(); + const renderContextData = this.get( context ); + const pipelineGPU = this.get( pipeline ).pipeline; + const currentSets = renderContextData.currentSets; + const passEncoderGPU = renderContextData.currentPass; + + const drawParams = renderObject.getDrawParameters(); + + if ( drawParams === null ) return; + + // pipeline + + if ( currentSets.pipeline !== pipelineGPU ) { + + passEncoderGPU.setPipeline( pipelineGPU ); + + currentSets.pipeline = pipelineGPU; + + } + + // bind groups + + const currentBindingGroups = currentSets.bindingGroups; + + for ( let i = 0, l = bindings.length; i < l; i ++ ) { + + const bindGroup = bindings[ i ]; + const bindingsData = this.get( bindGroup ); + + if ( currentBindingGroups[ bindGroup.index ] !== bindGroup.id ) { + + passEncoderGPU.setBindGroup( bindGroup.index, bindingsData.group ); + currentBindingGroups[ bindGroup.index ] = bindGroup.id; + + } + + } + + // attributes + + const index = renderObject.getIndex(); + + const hasIndex = ( index !== null ); + + // index + + if ( hasIndex === true ) { + + if ( currentSets.index !== index ) { + + const buffer = this.get( index ).buffer; + const indexFormat = ( index.array instanceof Uint16Array ) ? GPUIndexFormat.Uint16 : GPUIndexFormat.Uint32; + + passEncoderGPU.setIndexBuffer( buffer, indexFormat ); + + currentSets.index = index; + + } + + } + + // vertex buffers + + const vertexBuffers = renderObject.getVertexBuffers(); + + for ( let i = 0, l = vertexBuffers.length; i < l; i ++ ) { + + const vertexBuffer = vertexBuffers[ i ]; + + if ( currentSets.attributes[ i ] !== vertexBuffer ) { + + const buffer = this.get( vertexBuffer ).buffer; + passEncoderGPU.setVertexBuffer( i, buffer ); + + currentSets.attributes[ i ] = vertexBuffer; + + } + + } + + // occlusion queries - handle multiple consecutive draw calls for an object + + if ( renderContextData.occlusionQuerySet !== undefined ) { + + const lastObject = renderContextData.lastOcclusionObject; + + if ( lastObject !== object ) { + + if ( lastObject !== null && lastObject.occlusionTest === true ) { + + passEncoderGPU.endOcclusionQuery(); + renderContextData.occlusionQueryIndex ++; + + } + + if ( object.occlusionTest === true ) { + + passEncoderGPU.beginOcclusionQuery( renderContextData.occlusionQueryIndex ); + renderContextData.occlusionQueryObjects[ renderContextData.occlusionQueryIndex ] = object; + + } + + renderContextData.lastOcclusionObject = object; + + } + + } + + // stencil + + if ( context.stencil === true && material.stencilWrite === true && renderContextData.currentStencilRef !== material.stencilRef ) { + + passEncoderGPU.setStencilReference( material.stencilRef ); + renderContextData.currentStencilRef = material.stencilRef; + + } + + // draw + + const draw = () => { + + if ( object.isBatchedMesh === true ) { + + const starts = object._multiDrawStarts; + const counts = object._multiDrawCounts; + const drawCount = object._multiDrawCount; + const drawInstances = object._multiDrawInstances; + + if ( drawInstances !== null ) { + + // @deprecated, r174 + warnOnce( 'THREE.WebGPUBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.' ); + + } + + for ( let i = 0; i < drawCount; i ++ ) { + + const count = drawInstances ? drawInstances[ i ] : 1; + const firstInstance = count > 1 ? 0 : i; + + if ( hasIndex === true ) { + + passEncoderGPU.drawIndexed( counts[ i ], count, starts[ i ] / index.array.BYTES_PER_ELEMENT, 0, firstInstance ); + + } else { + + passEncoderGPU.draw( counts[ i ], count, starts[ i ], firstInstance ); + + } + + info.update( object, counts[ i ], count ); + + } + + } else if ( hasIndex === true ) { + + const { vertexCount: indexCount, instanceCount, firstVertex: firstIndex } = drawParams; + + const indirect = renderObject.getIndirect(); + + if ( indirect !== null ) { + + const buffer = this.get( indirect ).buffer; + + passEncoderGPU.drawIndexedIndirect( buffer, 0 ); + + } else { + + passEncoderGPU.drawIndexed( indexCount, instanceCount, firstIndex, 0, 0 ); + + } + + info.update( object, indexCount, instanceCount ); + + } else { + + const { vertexCount, instanceCount, firstVertex } = drawParams; + + const indirect = renderObject.getIndirect(); + + if ( indirect !== null ) { + + const buffer = this.get( indirect ).buffer; + + passEncoderGPU.drawIndirect( buffer, 0 ); + + } else { + + passEncoderGPU.draw( vertexCount, instanceCount, firstVertex, 0 ); + + } + + info.update( object, vertexCount, instanceCount ); + + } + + }; + + if ( renderObject.camera.isArrayCamera && renderObject.camera.cameras.length > 0 ) { + + const cameraData = this.get( renderObject.camera ); + const cameras = renderObject.camera.cameras; + const cameraIndex = renderObject.getBindingGroup( 'cameraIndex' ); + + if ( cameraData.indexesGPU === undefined || cameraData.indexesGPU.length !== cameras.length ) { + + const bindingsData = this.get( cameraIndex ); + const indexesGPU = []; + + const data = new Uint32Array( [ 0, 0, 0, 0 ] ); + + for ( let i = 0, len = cameras.length; i < len; i ++ ) { + + data[ 0 ] = i; + + const bindGroupIndex = this.bindingUtils.createBindGroupIndex( data, bindingsData.layout ); + + indexesGPU.push( bindGroupIndex ); + + } + + cameraData.indexesGPU = indexesGPU; // TODO: Create a global library for this + + } + + const pixelRatio = this.renderer.getPixelRatio(); + + for ( let i = 0, len = cameras.length; i < len; i ++ ) { + + const subCamera = cameras[ i ]; + + if ( object.layers.test( subCamera.layers ) ) { + + const vp = subCamera.viewport; + + passEncoderGPU.setViewport( + Math.floor( vp.x * pixelRatio ), + Math.floor( vp.y * pixelRatio ), + Math.floor( vp.width * pixelRatio ), + Math.floor( vp.height * pixelRatio ), + context.viewportValue.minDepth, + context.viewportValue.maxDepth + ); + + passEncoderGPU.setBindGroup( cameraIndex.index, cameraData.indexesGPU[ i ] ); + + draw(); + + } + + } + + } else { + + draw(); + + } + + } + + // cache key + + /** + * Returns `true` if the render pipeline requires an update. + * + * @param {RenderObject} renderObject - The render object. + * @return {boolean} Whether the render pipeline requires an update or not. + */ + needsRenderUpdate( renderObject ) { + + const data = this.get( renderObject ); + + const { object, material } = renderObject; + + const utils = this.utils; + + const sampleCount = utils.getSampleCountRenderContext( renderObject.context ); + const colorSpace = utils.getCurrentColorSpace( renderObject.context ); + const colorFormat = utils.getCurrentColorFormat( renderObject.context ); + const depthStencilFormat = utils.getCurrentDepthStencilFormat( renderObject.context ); + const primitiveTopology = utils.getPrimitiveTopology( object, material ); + + let needsUpdate = false; + + if ( data.material !== material || data.materialVersion !== material.version || + data.transparent !== material.transparent || data.blending !== material.blending || data.premultipliedAlpha !== material.premultipliedAlpha || + data.blendSrc !== material.blendSrc || data.blendDst !== material.blendDst || data.blendEquation !== material.blendEquation || + data.blendSrcAlpha !== material.blendSrcAlpha || data.blendDstAlpha !== material.blendDstAlpha || data.blendEquationAlpha !== material.blendEquationAlpha || + data.colorWrite !== material.colorWrite || data.depthWrite !== material.depthWrite || data.depthTest !== material.depthTest || data.depthFunc !== material.depthFunc || + data.stencilWrite !== material.stencilWrite || data.stencilFunc !== material.stencilFunc || + data.stencilFail !== material.stencilFail || data.stencilZFail !== material.stencilZFail || data.stencilZPass !== material.stencilZPass || + data.stencilFuncMask !== material.stencilFuncMask || data.stencilWriteMask !== material.stencilWriteMask || + data.side !== material.side || data.alphaToCoverage !== material.alphaToCoverage || + data.sampleCount !== sampleCount || data.colorSpace !== colorSpace || + data.colorFormat !== colorFormat || data.depthStencilFormat !== depthStencilFormat || + data.primitiveTopology !== primitiveTopology || + data.clippingContextCacheKey !== renderObject.clippingContextCacheKey + ) { + + data.material = material; data.materialVersion = material.version; + data.transparent = material.transparent; data.blending = material.blending; data.premultipliedAlpha = material.premultipliedAlpha; + data.blendSrc = material.blendSrc; data.blendDst = material.blendDst; data.blendEquation = material.blendEquation; + data.blendSrcAlpha = material.blendSrcAlpha; data.blendDstAlpha = material.blendDstAlpha; data.blendEquationAlpha = material.blendEquationAlpha; + data.colorWrite = material.colorWrite; + data.depthWrite = material.depthWrite; data.depthTest = material.depthTest; data.depthFunc = material.depthFunc; + data.stencilWrite = material.stencilWrite; data.stencilFunc = material.stencilFunc; + data.stencilFail = material.stencilFail; data.stencilZFail = material.stencilZFail; data.stencilZPass = material.stencilZPass; + data.stencilFuncMask = material.stencilFuncMask; data.stencilWriteMask = material.stencilWriteMask; + data.side = material.side; data.alphaToCoverage = material.alphaToCoverage; + data.sampleCount = sampleCount; + data.colorSpace = colorSpace; + data.colorFormat = colorFormat; + data.depthStencilFormat = depthStencilFormat; + data.primitiveTopology = primitiveTopology; + data.clippingContextCacheKey = renderObject.clippingContextCacheKey; + + needsUpdate = true; + + } + + return needsUpdate; + + } + + /** + * Returns a cache key that is used to identify render pipelines. + * + * @param {RenderObject} renderObject - The render object. + * @return {string} The cache key. + */ + getRenderCacheKey( renderObject ) { + + const { object, material } = renderObject; + + const utils = this.utils; + const renderContext = renderObject.context; + + return [ + material.transparent, material.blending, material.premultipliedAlpha, + material.blendSrc, material.blendDst, material.blendEquation, + material.blendSrcAlpha, material.blendDstAlpha, material.blendEquationAlpha, + material.colorWrite, + material.depthWrite, material.depthTest, material.depthFunc, + material.stencilWrite, material.stencilFunc, + material.stencilFail, material.stencilZFail, material.stencilZPass, + material.stencilFuncMask, material.stencilWriteMask, + material.side, + utils.getSampleCountRenderContext( renderContext ), + utils.getCurrentColorSpace( renderContext ), utils.getCurrentColorFormat( renderContext ), utils.getCurrentDepthStencilFormat( renderContext ), + utils.getPrimitiveTopology( object, material ), + renderObject.getGeometryCacheKey(), + renderObject.clippingContextCacheKey + ].join(); + + } + + // textures + + /** + * Creates a GPU sampler for the given texture. + * + * @param {Texture} texture - The texture to create the sampler for. + */ + createSampler( texture ) { + + this.textureUtils.createSampler( texture ); + + } + + /** + * Destroys the GPU sampler for the given texture. + * + * @param {Texture} texture - The texture to destroy the sampler for. + */ + destroySampler( texture ) { + + this.textureUtils.destroySampler( texture ); + + } + + /** + * Creates a default texture for the given texture that can be used + * as a placeholder until the actual texture is ready for usage. + * + * @param {Texture} texture - The texture to create a default texture for. + */ + createDefaultTexture( texture ) { + + this.textureUtils.createDefaultTexture( texture ); + + } + + /** + * Defines a texture on the GPU for the given texture object. + * + * @param {Texture} texture - The texture. + * @param {Object} [options={}] - Optional configuration parameter. + */ + createTexture( texture, options ) { + + this.textureUtils.createTexture( texture, options ); + + } + + /** + * Uploads the updated texture data to the GPU. + * + * @param {Texture} texture - The texture. + * @param {Object} [options={}] - Optional configuration parameter. + */ + updateTexture( texture, options ) { + + this.textureUtils.updateTexture( texture, options ); + + } + + /** + * Generates mipmaps for the given texture. + * + * @param {Texture} texture - The texture. + */ + generateMipmaps( texture ) { + + this.textureUtils.generateMipmaps( texture ); + + } + + /** + * Destroys the GPU data for the given texture object. + * + * @param {Texture} texture - The texture. + */ + destroyTexture( texture ) { + + this.textureUtils.destroyTexture( texture ); + + } + + /** + * Returns texture data as a typed array. + * + * @async + * @param {Texture} texture - The texture to copy. + * @param {number} x - The x coordinate of the copy origin. + * @param {number} y - The y coordinate of the copy origin. + * @param {number} width - The width of the copy. + * @param {number} height - The height of the copy. + * @param {number} faceIndex - The face index. + * @return {Promise} A Promise that resolves with a typed array when the copy operation has finished. + */ + async copyTextureToBuffer( texture, x, y, width, height, faceIndex ) { + + return this.textureUtils.copyTextureToBuffer( texture, x, y, width, height, faceIndex ); + + } + + /** + * Inits a time stamp query for the given render context. + * + * @param {RenderContext} renderContext - The render context. + * @param {Object} descriptor - The query descriptor. + */ + initTimestampQuery( renderContext, descriptor ) { + + if ( ! this.trackTimestamp ) return; + + const type = renderContext.isComputeNode ? 'compute' : 'render'; + + if ( ! this.timestampQueryPool[ type ] ) { + + // TODO: Variable maxQueries? + this.timestampQueryPool[ type ] = new WebGPUTimestampQueryPool( this.device, type, 2048 ); + + } + + const timestampQueryPool = this.timestampQueryPool[ type ]; + + const baseOffset = timestampQueryPool.allocateQueriesForContext( renderContext ); + + descriptor.timestampWrites = { + querySet: timestampQueryPool.querySet, + beginningOfPassWriteIndex: baseOffset, + endOfPassWriteIndex: baseOffset + 1, + }; + + } + + + // node builder + + /** + * Returns a node builder for the given render object. + * + * @param {RenderObject} object - The render object. + * @param {Renderer} renderer - The renderer. + * @return {WGSLNodeBuilder} The node builder. + */ + createNodeBuilder( object, renderer ) { + + return new WGSLNodeBuilder( object, renderer ); + + } + + // program + + /** + * Creates a shader program from the given programmable stage. + * + * @param {ProgrammableStage} program - The programmable stage. + */ + createProgram( program ) { + + const programGPU = this.get( program ); + + programGPU.module = { + module: this.device.createShaderModule( { code: program.code, label: program.stage + ( program.name !== '' ? `_${ program.name }` : '' ) } ), + entryPoint: 'main' + }; + + } + + /** + * Destroys the shader program of the given programmable stage. + * + * @param {ProgrammableStage} program - The programmable stage. + */ + destroyProgram( program ) { + + this.delete( program ); + + } + + // pipelines + + /** + * Creates a render pipeline for the given render object. + * + * @param {RenderObject} renderObject - The render object. + * @param {Array} promises - An array of compilation promises which are used in `compileAsync()`. + */ + createRenderPipeline( renderObject, promises ) { + + this.pipelineUtils.createRenderPipeline( renderObject, promises ); + + } + + /** + * Creates a compute pipeline for the given compute node. + * + * @param {ComputePipeline} computePipeline - The compute pipeline. + * @param {Array} bindings - The bindings. + */ + createComputePipeline( computePipeline, bindings ) { + + this.pipelineUtils.createComputePipeline( computePipeline, bindings ); + + } + + /** + * Prepares the state for encoding render bundles. + * + * @param {RenderContext} renderContext - The render context. + */ + beginBundle( renderContext ) { + + const renderContextData = this.get( renderContext ); + + renderContextData._currentPass = renderContextData.currentPass; + renderContextData._currentSets = renderContextData.currentSets; + + renderContextData.currentSets = { attributes: {}, bindingGroups: [], pipeline: null, index: null }; + renderContextData.currentPass = this.pipelineUtils.createBundleEncoder( renderContext ); + + } + + /** + * After processing render bundles this method finalizes related work. + * + * @param {RenderContext} renderContext - The render context. + * @param {RenderBundle} bundle - The render bundle. + */ + finishBundle( renderContext, bundle ) { + + const renderContextData = this.get( renderContext ); + + const bundleEncoder = renderContextData.currentPass; + const bundleGPU = bundleEncoder.finish(); + + this.get( bundle ).bundleGPU = bundleGPU; + + // restore render pass state + + renderContextData.currentSets = renderContextData._currentSets; + renderContextData.currentPass = renderContextData._currentPass; + + } + + /** + * Adds a render bundle to the render context data. + * + * @param {RenderContext} renderContext - The render context. + * @param {RenderBundle} bundle - The render bundle to add. + */ + addBundle( renderContext, bundle ) { + + const renderContextData = this.get( renderContext ); + + renderContextData.renderBundles.push( this.get( bundle ).bundleGPU ); + + } + + // bindings + + /** + * Creates bindings from the given bind group definition. + * + * @param {BindGroup} bindGroup - The bind group. + * @param {Array} bindings - Array of bind groups. + * @param {number} cacheIndex - The cache index. + * @param {number} version - The version. + */ + createBindings( bindGroup, bindings, cacheIndex, version ) { + + this.bindingUtils.createBindings( bindGroup, bindings, cacheIndex, version ); + + } + + /** + * Updates the given bind group definition. + * + * @param {BindGroup} bindGroup - The bind group. + * @param {Array} bindings - Array of bind groups. + * @param {number} cacheIndex - The cache index. + * @param {number} version - The version. + */ + updateBindings( bindGroup, bindings, cacheIndex, version ) { + + this.bindingUtils.createBindings( bindGroup, bindings, cacheIndex, version ); + + } + + /** + * Updates a buffer binding. + * + * @param {Buffer} binding - The buffer binding to update. + */ + updateBinding( binding ) { + + this.bindingUtils.updateBinding( binding ); + + } + + // attributes + + /** + * Creates the buffer of an indexed shader attribute. + * + * @param {BufferAttribute} attribute - The indexed buffer attribute. + */ + createIndexAttribute( attribute ) { + + this.attributeUtils.createAttribute( attribute, GPUBufferUsage.INDEX | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST ); + + } + + /** + * Creates the GPU buffer of a shader attribute. + * + * @param {BufferAttribute} attribute - The buffer attribute. + */ + createAttribute( attribute ) { + + this.attributeUtils.createAttribute( attribute, GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST ); + + } + + /** + * Creates the GPU buffer of a storage attribute. + * + * @param {BufferAttribute} attribute - The buffer attribute. + */ + createStorageAttribute( attribute ) { + + this.attributeUtils.createAttribute( attribute, GPUBufferUsage.STORAGE | GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST ); + + } + + /** + * Creates the GPU buffer of an indirect storage attribute. + * + * @param {BufferAttribute} attribute - The buffer attribute. + */ + createIndirectStorageAttribute( attribute ) { + + this.attributeUtils.createAttribute( attribute, GPUBufferUsage.STORAGE | GPUBufferUsage.INDIRECT | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST ); + + } + + /** + * Updates the GPU buffer of a shader attribute. + * + * @param {BufferAttribute} attribute - The buffer attribute to update. + */ + updateAttribute( attribute ) { + + this.attributeUtils.updateAttribute( attribute ); + + } + + /** + * Destroys the GPU buffer of a shader attribute. + * + * @param {BufferAttribute} attribute - The buffer attribute to destroy. + */ + destroyAttribute( attribute ) { + + this.attributeUtils.destroyAttribute( attribute ); + + } + + // canvas + + /** + * Triggers an update of the default render pass descriptor. + */ + updateSize() { + + this.colorBuffer = this.textureUtils.getColorBuffer(); + this.defaultRenderPassdescriptor = null; + + } + + // utils public + + /** + * Returns the maximum anisotropy texture filtering value. + * + * @return {number} The maximum anisotropy texture filtering value. + */ + getMaxAnisotropy() { + + return 16; + + } + + /** + * Checks if the given feature is supported by the backend. + * + * @param {string} name - The feature's name. + * @return {boolean} Whether the feature is supported or not. + */ + hasFeature( name ) { + + return this.device.features.has( name ); + + } + + /** + * Copies data of the given source texture to the given destination texture. + * + * @param {Texture} srcTexture - The source texture. + * @param {Texture} dstTexture - The destination texture. + * @param {?(Box3|Box2)} [srcRegion=null] - The region of the source texture to copy. + * @param {?(Vector2|Vector3)} [dstPosition=null] - The destination position of the copy. + * @param {number} [srcLevel=0] - The mipmap level to copy. + * @param {number} [dstLevel=0] - The destination mip level to copy to. + */ + copyTextureToTexture( srcTexture, dstTexture, srcRegion = null, dstPosition = null, srcLevel = 0, dstLevel = 0 ) { + + let dstX = 0; + let dstY = 0; + let dstZ = 0; + + let srcX = 0; + let srcY = 0; + let srcZ = 0; + + let srcWidth = srcTexture.image.width; + let srcHeight = srcTexture.image.height; + let srcDepth = 1; + + + if ( srcRegion !== null ) { + + if ( srcRegion.isBox3 === true ) { + + srcX = srcRegion.min.x; + srcY = srcRegion.min.y; + srcZ = srcRegion.min.z; + srcWidth = srcRegion.max.x - srcRegion.min.x; + srcHeight = srcRegion.max.y - srcRegion.min.y; + srcDepth = srcRegion.max.z - srcRegion.min.z; + + } else { + + // Assume it's a Box2 + srcX = srcRegion.min.x; + srcY = srcRegion.min.y; + srcWidth = srcRegion.max.x - srcRegion.min.x; + srcHeight = srcRegion.max.y - srcRegion.min.y; + srcDepth = 1; + + } + + } + + + if ( dstPosition !== null ) { + + dstX = dstPosition.x; + dstY = dstPosition.y; + dstZ = dstPosition.z || 0; + + } + + const encoder = this.device.createCommandEncoder( { label: 'copyTextureToTexture_' + srcTexture.id + '_' + dstTexture.id } ); + + const sourceGPU = this.get( srcTexture ).texture; + const destinationGPU = this.get( dstTexture ).texture; + + encoder.copyTextureToTexture( + { + texture: sourceGPU, + mipLevel: srcLevel, + origin: { x: srcX, y: srcY, z: srcZ } + }, + { + texture: destinationGPU, + mipLevel: dstLevel, + origin: { x: dstX, y: dstY, z: dstZ } + }, + [ + srcWidth, + srcHeight, + srcDepth + ] + ); + + this.device.queue.submit( [ encoder.finish() ] ); + + if ( dstLevel === 0 && dstTexture.generateMipmaps ) { + + this.textureUtils.generateMipmaps( dstTexture ); + + } + + } + + /** + * Copies the current bound framebuffer to the given texture. + * + * @param {Texture} texture - The destination texture. + * @param {RenderContext} renderContext - The render context. + * @param {Vector4} rectangle - A four dimensional vector defining the origin and dimension of the copy. + */ + copyFramebufferToTexture( texture, renderContext, rectangle ) { + + const renderContextData = this.get( renderContext ); + + let sourceGPU = null; + + if ( renderContext.renderTarget ) { + + if ( texture.isDepthTexture ) { + + sourceGPU = this.get( renderContext.depthTexture ).texture; + + } else { + + sourceGPU = this.get( renderContext.textures[ 0 ] ).texture; + + } + + } else { + + if ( texture.isDepthTexture ) { + + sourceGPU = this.textureUtils.getDepthBuffer( renderContext.depth, renderContext.stencil ); + + } else { + + sourceGPU = this.context.getCurrentTexture(); + + } + + } + + const destinationGPU = this.get( texture ).texture; + + if ( sourceGPU.format !== destinationGPU.format ) { + + console.error( 'WebGPUBackend: copyFramebufferToTexture: Source and destination formats do not match.', sourceGPU.format, destinationGPU.format ); + + return; + + } + + let encoder; + + if ( renderContextData.currentPass ) { + + renderContextData.currentPass.end(); + + encoder = renderContextData.encoder; + + } else { + + encoder = this.device.createCommandEncoder( { label: 'copyFramebufferToTexture_' + texture.id } ); + + } + + encoder.copyTextureToTexture( + { + texture: sourceGPU, + origin: [ rectangle.x, rectangle.y, 0 ], + }, + { + texture: destinationGPU + }, + [ + rectangle.z, + rectangle.w + ] + ); + + if ( texture.generateMipmaps ) this.textureUtils.generateMipmaps( texture ); + + if ( renderContextData.currentPass ) { + + const { descriptor } = renderContextData; + + for ( let i = 0; i < descriptor.colorAttachments.length; i ++ ) { + + descriptor.colorAttachments[ i ].loadOp = GPULoadOp.Load; + + } + + if ( renderContext.depth ) descriptor.depthStencilAttachment.depthLoadOp = GPULoadOp.Load; + if ( renderContext.stencil ) descriptor.depthStencilAttachment.stencilLoadOp = GPULoadOp.Load; + + renderContextData.currentPass = encoder.beginRenderPass( descriptor ); + renderContextData.currentSets = { attributes: {}, bindingGroups: [], pipeline: null, index: null }; + + if ( renderContext.viewport ) { + + this.updateViewport( renderContext ); + + } + + if ( renderContext.scissor ) { + + const { x, y, width, height } = renderContext.scissorValue; + + renderContextData.currentPass.setScissorRect( x, y, width, height ); + + } + + } else { + + this.device.queue.submit( [ encoder.finish() ] ); + + } + + } + +} + +export default WebGPUBackend; diff --git a/examples/jsm/renderers/webgpu/WebGPURenderer (1).js b/examples/jsm/renderers/webgpu/WebGPURenderer (1).js new file mode 100644 index 00000000000000..650bf567872872 --- /dev/null +++ b/examples/jsm/renderers/webgpu/WebGPURenderer (1).js @@ -0,0 +1,98 @@ +import Renderer from '../common/Renderer.js'; +import WebGLBackend from '../webgl-fallback/WebGLBackend.js'; +import WebGPUBackend from './WebGPUBackend.js'; +import StandardNodeLibrary from './nodes/StandardNodeLibrary.js'; +/* +const debugHandler = { + + get: function ( target, name ) { + + // Add |update + if ( /^(create|destroy)/.test( name ) ) console.log( 'WebGPUBackend.' + name ); + + return target[ name ]; + + } + +}; +*/ + +/** + * This renderer is the new alternative of `WebGLRenderer`. `WebGPURenderer` has the ability + * to target different backends. By default, the renderer tries to use a WebGPU backend if the + * browser supports WebGPU. If not, `WebGPURenderer` falls backs to a WebGL 2 backend. + * + * @augments Renderer + */ +class WebGPURenderer extends Renderer { + + /** + * WebGPURenderer options. + * + * @typedef {Object} WebGPURenderer~Options + * @property {boolean} [logarithmicDepthBuffer=false] - Whether logarithmic depth buffer is enabled or not. + * @property {boolean} [alpha=true] - Whether the default framebuffer (which represents the final contents of the canvas) should be transparent or opaque. + * @property {boolean} [depth=true] - Whether the default framebuffer should have a depth buffer or not. + * @property {boolean} [stencil=false] - Whether the default framebuffer should have a stencil buffer or not. + * @property {boolean} [antialias=false] - Whether MSAA as the default anti-aliasing should be enabled or not. + * @property {number} [samples=0] - When `antialias` is `true`, `4` samples are used by default. Set this parameter to any other integer value than 0 to overwrite the default. + * @property {boolean} [forceWebGL=false] - If set to `true`, the renderer uses a WebGL 2 backend no matter if WebGPU is supported or not. + * @property {number} [outputType=undefined] - Texture type for output to canvas. By default, device's preferred format is used; other formats may incur overhead. + * @property {number} [colorBufferType=HalfFloatType] - Defines the type of color buffers. The default `HalfFloatType` is recommend for best + * quality. To save memory and bandwidth, `UnsignedByteType` might be used. This will reduce rendering quality though. + */ + + /** + * Constructs a new WebGPU renderer. + * + * @param {WebGPURenderer~Options} [parameters] - The configuration parameter. + */ + constructor( parameters = {} ) { + + let BackendClass; + + if ( parameters.forceWebGL ) { + + BackendClass = WebGLBackend; + + } else { + + BackendClass = WebGPUBackend; + + parameters.getFallback = () => { + + console.warn( 'THREE.WebGPURenderer: WebGPU is not available, running under WebGL2 backend.' ); + + return new WebGLBackend( parameters ); + + }; + + } + + const backend = new BackendClass( parameters ); + + //super( new Proxy( backend, debugHandler ) ); + super( backend, parameters ); + + /** + * The generic default value is overwritten with the + * standard node library for type mapping. + * + * @type {StandardNodeLibrary} + */ + this.library = new StandardNodeLibrary(); + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + this.isWebGPURenderer = true; + + } + +} + +export default WebGPURenderer; diff --git a/examples/webgpu_box_basic.html b/examples/webgpu_box_basic.html new file mode 100644 index 00000000000000..e8e5c7aa523908 --- /dev/null +++ b/examples/webgpu_box_basic.html @@ -0,0 +1,46 @@ + + + + + WebGPU Box Example + + + + + + diff --git a/package-lock.json b/package-lock.json index d56dc15952b22a..8f2c8164b2fb22 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "three", - "version": "0.174.0", + "version": "0.175.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "three", - "version": "0.174.0", + "version": "0.175.0", "license": "MIT", "devDependencies": { "@rollup/plugin-node-resolve": "^16.0.0", diff --git a/src/math/Frustum.js b/src/math/Frustum.js index 3bbf9ef5aec9dc..ffb9cf366dc8d7 100644 --- a/src/math/Frustum.js +++ b/src/math/Frustum.js @@ -204,29 +204,29 @@ class Frustum { */ intersectsBox( box ) { - const planes = this.planes; - + const { min, max } = box; + const p1 = _vector; + for ( let i = 0; i < 6; i ++ ) { - - const plane = planes[ i ]; - - // corner at max distance - - _vector.x = plane.normal.x > 0 ? box.max.x : box.min.x; - _vector.y = plane.normal.y > 0 ? box.max.y : box.min.y; - _vector.z = plane.normal.z > 0 ? box.max.z : box.min.z; - - if ( plane.distanceToPoint( _vector ) < 0 ) { - + + const plane = this.planes[ i ]; + + p1.x = plane.normal.x > 0 ? max.x : min.x; + p1.y = plane.normal.y > 0 ? max.y : min.y; + p1.z = plane.normal.z > 0 ? max.z : min.z; + + if ( plane.distanceToPoint( p1 ) <= 0 ) { + return false; - + } - + } - + return true; - + } + /** * Returns `true` if the given point lies within the frustum. diff --git a/src/renderers/webgl/WebGLArrayRenderTarget.js b/src/renderers/webgl/WebGLArrayRenderTarget.js new file mode 100644 index 00000000000000..e69de29bb2d1d6 diff --git a/src/renderers/webgl/WebGLTextures.js b/src/renderers/webgl/WebGLTextures.js index b9050ccbc3b78d..daca8d009d8ad6 100644 --- a/src/renderers/webgl/WebGLTextures.js +++ b/src/renderers/webgl/WebGLTextures.js @@ -3,6 +3,11 @@ import { createElementNS } from '../../utils.js'; import { ColorManagement } from '../../math/ColorManagement.js'; import { Vector2 } from '../../math/Vector2.js'; import { getByteLength } from '../../extras/TextureUtils.js'; +import { + LuminanceFormat, NoColorSpace, LinearSRGBColorSpace, RGBAFormat, + UnsignedByteType +} from '../../constants.js'; + function WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ) { @@ -2105,7 +2110,13 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils, } function verifyColorSpace( texture, image ) { - + if ( format === LuminanceFormat ) { + // LuminanceFormat must use NoColorSpace (since sRGB with RED not allowed in WebGL2) + if ( colorSpace !== NoColorSpace ) { + console.warn( 'THREE.WebGLTextures: LuminanceFormat textures must use NoColorSpace.' ); + } + } + const colorSpace = texture.colorSpace; const format = texture.format; const type = texture.type; diff --git a/src/renderers/webgpu/WebGPUBackend.js b/src/renderers/webgpu/WebGPUBackend.js index 3f25df27c85e78..ff4fa56f27a8e1 100644 --- a/src/renderers/webgpu/WebGPUBackend.js +++ b/src/renderers/webgpu/WebGPUBackend.js @@ -1,6 +1,5 @@ -/*// debugger tools +/*// debugger tools */ import 'https://greggman.github.io/webgpu-avoid-redundant-state-setting/webgpu-check-redundant-state-setting.js'; -//*/ import { GPUFeatureName, GPULoadOp, GPUStoreOp, GPUIndexFormat, GPUTextureViewDimension } from './utils/WebGPUConstants.js'; @@ -17,240 +16,77 @@ import { WebGPUCoordinateSystem } from '../../constants.js'; import WebGPUTimestampQueryPool from './utils/WebGPUTimestampQueryPool.js'; import { warnOnce } from '../../utils.js'; -/** - * A backend implementation targeting WebGPU. - * - * @private - * @augments Backend - */ class WebGPUBackend extends Backend { - /** - * WebGPUBackend options. - * - * @typedef {Object} WebGPUBackend~Options - * @property {boolean} [logarithmicDepthBuffer=false] - Whether logarithmic depth buffer is enabled or not. - * @property {boolean} [alpha=true] - Whether the default framebuffer (which represents the final contents of the canvas) should be transparent or opaque. - * @property {boolean} [depth=true] - Whether the default framebuffer should have a depth buffer or not. - * @property {boolean} [stencil=false] - Whether the default framebuffer should have a stencil buffer or not. - * @property {boolean} [antialias=false] - Whether MSAA as the default anti-aliasing should be enabled or not. - * @property {number} [samples=0] - When `antialias` is `true`, `4` samples are used by default. Set this parameter to any other integer value than 0 to overwrite the default. - * @property {boolean} [forceWebGL=false] - If set to `true`, the renderer uses a WebGL 2 backend no matter if WebGPU is supported or not. - * @property {boolean} [trackTimestamp=false] - Whether to track timestamps with a Timestamp Query API or not. - * @property {string} [powerPreference=undefined] - The power preference. - * @property {Object} [requiredLimits=undefined] - Specifies the limits that are required by the device request. The request will fail if the adapter cannot provide these limits. - * @property {GPUDevice} [device=undefined] - If there is an existing GPU device on app level, it can be passed to the renderer as a parameter. - * @property {number} [outputType=undefined] - Texture type for output to canvas. By default, device's preferred format is used; other formats may incur overhead. - */ - - /** - * Constructs a new WebGPU backend. - * - * @param {WebGPUBackend~Options} [parameters] - The configuration parameter. - */ constructor( parameters = {} ) { - super( parameters ); - - /** - * This flag can be used for type testing. - * - * @type {boolean} - * @readonly - * @default true - */ this.isWebGPUBackend = true; - - // some parameters require default values other than "undefined" this.parameters.alpha = ( parameters.alpha === undefined ) ? true : parameters.alpha; - this.parameters.requiredLimits = ( parameters.requiredLimits === undefined ) ? {} : parameters.requiredLimits; - /** - * A reference to the device. - * - * @type {?GPUDevice} - * @default null - */ this.device = null; - - /** - * A reference to the context. - * - * @type {?GPUCanvasContext} - * @default null - */ this.context = null; - - /** - * A reference to the color attachment of the default framebuffer. - * - * @type {?GPUTexture} - * @default null - */ this.colorBuffer = null; - - /** - * A reference to the default render pass descriptor. - * - * @type {?Object} - * @default null - */ this.defaultRenderPassdescriptor = null; - /** - * A reference to a backend module holding common utility functions. - * - * @type {WebGPUUtils} - */ this.utils = new WebGPUUtils( this ); - - /** - * A reference to a backend module holding shader attribute-related - * utility functions. - * - * @type {WebGPUAttributeUtils} - */ this.attributeUtils = new WebGPUAttributeUtils( this ); - - /** - * A reference to a backend module holding shader binding-related - * utility functions. - * - * @type {WebGPUBindingUtils} - */ this.bindingUtils = new WebGPUBindingUtils( this ); - - /** - * A reference to a backend module holding shader pipeline-related - * utility functions. - * - * @type {WebGPUPipelineUtils} - */ this.pipelineUtils = new WebGPUPipelineUtils( this ); - - /** - * A reference to a backend module holding shader texture-related - * utility functions. - * - * @type {WebGPUTextureUtils} - */ this.textureUtils = new WebGPUTextureUtils( this ); - - /** - * A map that manages the resolve buffers for occlusion queries. - * - * @type {Map} - */ this.occludedResolveCache = new Map(); - } - /** - * Initializes the backend so it is ready for usage. - * - * @async - * @param {Renderer} renderer - The renderer. - * @return {Promise} A Promise that resolves when the backend has been initialized. - */ async init( renderer ) { - await super.init( renderer ); - - // - const parameters = this.parameters; - - // create the device if it is not passed with parameters - let device; if ( parameters.device === undefined ) { - - const adapterOptions = { - powerPreference: parameters.powerPreference - }; - + const adapterOptions = { powerPreference: parameters.powerPreference }; const adapter = ( typeof navigator !== 'undefined' ) ? await navigator.gpu.requestAdapter( adapterOptions ) : null; - if ( adapter === null ) { - - throw new Error( 'WebGPUBackend: Unable to create WebGPU adapter.' ); - - } - - // feature support + if ( adapter === null ) throw new Error( 'WebGPUBackend: Unable to create WebGPU adapter.' ); const features = Object.values( GPUFeatureName ); + const supportedFeatures = features.filter( name => adapter.features.has( name ) ); - const supportedFeatures = []; - - for ( const name of features ) { - - if ( adapter.features.has( name ) ) { - - supportedFeatures.push( name ); - - } - - } - - const deviceDescriptor = { - requiredFeatures: supportedFeatures, - requiredLimits: parameters.requiredLimits - }; - - device = await adapter.requestDevice( deviceDescriptor ); - + device = await adapter.requestDevice({ requiredFeatures: supportedFeatures, requiredLimits: parameters.requiredLimits }); } else { - device = parameters.device; - } device.lost.then( ( info ) => { - - const deviceLossInfo = { + renderer.onDeviceLost({ api: 'WebGPU', message: info.message || 'Unknown reason', reason: info.reason || null, originalEvent: info - }; - - renderer.onDeviceLost( deviceLossInfo ); - - } ); - - const context = ( parameters.context !== undefined ) ? parameters.context : renderer.domElement.getContext( 'webgpu' ); + }); + }); + const context = parameters.context !== undefined ? parameters.context : renderer.domElement.getContext( 'webgpu' ); this.device = device; this.context = context; - const alphaMode = parameters.alpha ? 'premultiplied' : 'opaque'; - this.trackTimestamp = this.trackTimestamp && this.hasFeature( GPUFeatureName.TimestampQuery ); - this.context.configure( { + this.context.configure({ device: this.device, format: this.utils.getPreferredCanvasFormat(), usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC, alphaMode: alphaMode - } ); + }); - this.updateSize(); + if (typeof window !== 'undefined' && 'checkWebGPUState' in window) { + checkWebGPUState(); + } + this.updateSize(); } - /** - * The coordinate system of the backend. - * - * @type {number} - * @readonly - */ get coordinateSystem() { - return WebGPUCoordinateSystem; - } /** @@ -2087,4 +1923,5 @@ class WebGPUBackend extends Backend { } + export default WebGPUBackend; diff --git a/src/renderers/webgpu/WebGPURenderer.js b/src/renderers/webgpu/WebGPURenderer.js index 650bf567872872..91bbaf59b77618 100644 --- a/src/renderers/webgpu/WebGPURenderer.js +++ b/src/renderers/webgpu/WebGPURenderer.js @@ -2,6 +2,7 @@ import Renderer from '../common/Renderer.js'; import WebGLBackend from '../webgl-fallback/WebGLBackend.js'; import WebGPUBackend from './WebGPUBackend.js'; import StandardNodeLibrary from './nodes/StandardNodeLibrary.js'; +import { Color } from '../../math/Color.js'; /* const debugHandler = { @@ -73,6 +74,8 @@ class WebGPURenderer extends Renderer { //super( new Proxy( backend, debugHandler ) ); super( backend, parameters ); + this._clearColor = new Color( 0x000000 ); + this._clearAlpha = 1; /** * The generic default value is overwritten with the